[
  {
    "path": ".editorconfig",
    "content": "root=true\n# http://EditorConfig.org\n# See Plugin for VS: https://github.com/editorconfig/editorconfig-visualstudio\n# Other editors: http://editorconfig.org/#download\n\n# top-most EditorConfig file\n\n[*]\n# Unix-style newlines with a newline ending every file\nend_of_line=lf\ntrim_trailing_whitespace=true\n\n# Tab with 4 spaces.\nindent_style=tab\nindent_size=4\ntab_width=4\ncharset=utf-8\n\n# ReSharper properties\nresharper_alignment_tab_fill_style=optimal_fill\nresharper_align_multiline_parameter=true\nresharper_autodetect_indent_settings=true\nresharper_blank_lines_around_class_definition=2\nresharper_case_block_braces=next_line\nresharper_indent_switch_labels=true\nresharper_int_align_comments=true\nresharper_int_align_eq=true\nresharper_keep_blank_lines_in_code=1\nresharper_keep_blank_lines_in_declarations=1\nresharper_outdent_commas=true\nresharper_simple_embedded_statement_style=line_break\n\n# MSBuild\n[*.{csproj,proj,projitems,shproj,fsproj,target,props}]\nindent_style=space\nindent_size=2\n\n# Bash/Python files\n[*.{sh, vdf}]\nindent_style=space\nindent_size=4\n\n[*.py]\nindent_style=space\nindent_size=4\nend_of_line=lf\ncharset=utf-8\n\n[*.{c,c++,cc,cp,cpp,cu,cuh,cxx,h,hh,hpp,hxx,inc,inl,ino,ipp,mpp,proto,tpp}]\nindent_style=tab\nindent_size=tab\ntab_width=4\n\n[*.{appxmanifest,build,config,csproj,dbml,discomap,dtd,jsproj,lsproj,njsproj,nuspec,proj,props,resw,resx,StyleCop,targets,tasks,vbproj,xaml,xamlx,xml,xoml,xsd}]\nindent_style=space\nindent_size=2\ntab_width=2\n"
  },
  {
    "path": ".gitattributes",
    "content": "# Let git use LF in git and automatic line endings in the OS\n* text=auto\n\n# if something breaks again, add -text to see line endings in diff\n*.dlg\tdiff text\n*.sc\ttext\n*.ini\tdiff text\n\n# Declare files that will always have CRLF line endings on checkout.\n*.sln text eol=crlf\n\n# Sources\n*.c text\n*.cc text\n*.cxx text\n*.cpp text\n*.c++ text\n*.hpp text\n*.h text\n*.h++ text\n*.hh text\n\n# Never modify line endings\n*.sh text -crlf\n\n# Localization\n*.po diff text\n/Content/Localization/**/*.manifest diff text working-tree-encoding=UTF-16 eol=CRLF\n/Content/Localization/**/*.archive diff text working-tree-encoding=UTF-16 eol=CRLF\n*.locres binary\n*.locmeta binary\n*.mo binary\n\n# Manifest Resource files\n/Source/**/*.manifest diff text eol=CRLF\n\n# Compiled Object files\n*.slo binary\n*.lo binary\n*.o binary\n*.obj binary\n\n# Precompiled Headers\n*.gch binary\n*.pch binary\n\n# Compiled Dynamic libraries\n*.so binary\n*.dylib binary\n*.dll binary\n\n# Compiled Static libraries\n*.lai binary\n*.la binary\n*.a binary\n*.lib binary\n\n# Executables\n*.exe binary\n*.out binary\n*.app binary\n"
  },
  {
    "path": ".gitconfig",
    "content": "[core]\n\tsymlinks = true\n\tautocrlf = false\n\teol = lf\n[color \"diff\"]\n\twhitespace = red reverse\n[status]\n\tsubmodulesummary = true\n[submodule]\n\trecurse = true\n[diff]\n\tsubmodule = log\n[credential]\n\thelper = cache --timeout=14400\n"
  },
  {
    "path": ".gitignore",
    "content": "## Inspired from https://github.com/github/gitignore/blob/master/UnrealEngine.gitignore\n# Visual Studio user specific files\n.vs/\nenc_temp_folder/\n\n# Compiled Object files\n*.slo\n*.lo\n*.o\n*.obj\nSource/SOrb/obj/\n\n# Precompiled Headers\n*.gch\n*.pch\n*.ipch\n\n# Compiled Dynamic libraries\n*.so\n*.dylib\n*.dll\n\n# Fortran module files\n*.mod\n\n# Compiled Static libraries\n*.lai\n*.la\n*.a\n*.lib\n\n# Executables\n*.exe\n*.out\n*.app\n*.ipa\n\n# PO binary format\n*.mo\n\n# These project files can be generated by the engine\n*.xcodeproj\n*.sln\n*.suo\n*.user\n*.opensdf\n*.sdf\n*.VC.db\n*.opendb\n*.vcxproj*\n*.gen.cpp\n*.generated.h\n\n# Precompiled Assets\nSourceArt/**/*.png\nSourceArt/**/*.tga\n\n# Ignore builds, binary, configuration, cache and starter content directories\nBinaries/\nSaved/\nIntermediate/\nCooked/\n\nContent/VFX_Toolkit_V1/\n\n# Commandlets\nWrangle.bin\nTools/_Test.py\nTools/butler/\n\n# Build directory\nBuild/LinuxNoEditor/\nBuild/WindowsNoEditor/\nBuild/Android*/\nBuild/Lumin*/\nBuild/Mac*/\nBuild/TVOS*/\nBuild/IOS*/\nBuild/**/CookerOpenOrder.log\nBuild/**/EditorOpenOrder.log\nBuild/XboxOne/Symbols/\n\n# Packed directory\nPackaged/*Windows*/\nPackaged/*Linux*/\nPackaged/*Mac*/\nPackaged/*XboxOne*/\nPackaged/*Switch*/\nPackaged/*.csd\nPackaged/*.log\nPackaged/*.csm\nPackaged/*.txt\nPackaged/*.zip\n!Packaged/README.md\n!Packaged/Dependencies/**\n!Packaged/Dependencies/Windows/DebugDLLs/*.dll\n!Packaged/Dependencies/Linux/*.sh\nPackagedPlugin/\nDialoguesTwine/\nDialoguesJsonHumanText/\n\nDerivedDataCache/\nLocalDerivedDataCache/\nDerivedDataCacheLocal/\nContent/StarterContent/\nContent/ExampleContent/\nContent/TempTree/\n\n# Unreal engine types\n*.precompiled\n*.response\n*.modules\n*.target\n*.generated.h\n*.*.cpp\n*.uhtmanifest\n\n# Ignore logs directory\nSoLog/\noutput.log\n\n# Ignore BuiltData for maps\n*_BuiltData.uasset\n\n# Ignore some config settings\nConfig/DefaultEditorUserSettings.ini\nTools/config.sh\nTools/config.ini\n__pycache__\n*.pyc\n\n# Other IDE's stuff and linux/mac\n.codelite/\n.idea/\n.vscode/\n.kdev4/\ncmake-*/\n*.kdev4\n*.workspace\n*.code-workspace\n*.pri\n*.pro\n*CodeCompletionFolders.txt\n*CodeLitePreProcessor.txt\nCMakeLists.txt\nMakefile\ncore\n.gdb_history\nConfig/QuickSave_1.txt\nConfig/QuickSave_0.txt\n*.autosave\n*.TMP\n_ReSharper.Caches/\n*.batch_build\n\n# Other useful Plugins\nPlugins/CLionSourceCodeAccess\nPlugins/ObjectBrowser\nPlugins/GraphFormatter\nPlugins/Developer\nPlugins/ST_ExportPNG\n\n# Steam\nSteam/game/app_build_Warriorb_790360_Local.vdf\nSteam/demo/app_build_Warriorb_demo_1193760_Local.vdf\n\n# Resources\nSource/SOrb/Resources/WarriorbVersion.h\n"
  },
  {
    "path": "Config/DefaultEditor.ini",
    "content": "[EditoronlyBP]\nbAllowClassAndBlueprintPinMatching=true\nbReplaceBlueprintWithClass=true\nbDontLoadBlueprintOutsideEditor=true\nbBlueprintIsNotBlueprintType=true\n\n[/Script/UnrealEd.AssetViewerSettings]\n-Profiles=(ProfileName=\"Default\",DirectionalLightIntensity=2.620000,DirectionalLightColor=(R=0.990000,G=0.839850,B=0.732600,A=1.000000),SkyLightIntensity=0.880000,bRotateLightingRig=False,bShowEnvironment=True,bShowFloor=True,EnvironmentCubeMapPath=\"/Engine/EditorMaterials/AssetViewer/EpicQuadPanorama_CC+EV1.EpicQuadPanorama_CC+EV1\",PostProcessingSettings=(bOverride_WhiteTemp=True,bOverride_WhiteTint=False,bOverride_ColorSaturation=True,bOverride_ColorContrast=True,bOverride_ColorGamma=True,bOverride_ColorGain=True,bOverride_ColorOffset=True,bOverride_FilmWhitePoint=False,bOverride_FilmSaturation=False,bOverride_FilmChannelMixerRed=False,bOverride_FilmChannelMixerGreen=False,bOverride_FilmChannelMixerBlue=False,bOverride_FilmContrast=False,bOverride_FilmDynamicRange=False,bOverride_FilmHealAmount=False,bOverride_FilmToeAmount=False,bOverride_FilmShadowTint=False,bOverride_FilmShadowTintBlend=False,bOverride_FilmShadowTintAmount=False,bOverride_FilmSlope=True,bOverride_FilmToe=True,bOverride_FilmShoulder=True,bOverride_FilmBlackClip=True,bOverride_FilmWhiteClip=True,bOverride_SceneColorTint=False,bOverride_SceneFringeIntensity=False,bOverride_AmbientCubemapTint=False,bOverride_AmbientCubemapIntensity=False,bOverride_BloomIntensity=True,bOverride_BloomThreshold=False,bOverride_Bloom1Tint=False,bOverride_Bloom1Size=False,bOverride_Bloom2Size=False,bOverride_Bloom2Tint=False,bOverride_Bloom3Tint=False,bOverride_Bloom3Size=False,bOverride_Bloom4Tint=False,bOverride_Bloom4Size=False,bOverride_Bloom5Tint=False,bOverride_Bloom5Size=False,bOverride_Bloom6Tint=False,bOverride_Bloom6Size=False,bOverride_BloomSizeScale=False,bOverride_BloomDirtMaskIntensity=False,bOverride_BloomDirtMaskTint=False,bOverride_BloomDirtMask=False,bOverride_AutoExposureMethod=True,bOverride_AutoExposureLowPercent=False,bOverride_AutoExposureHighPercent=False,bOverride_AutoExposureMinBrightness=True,bOverride_AutoExposureMaxBrightness=True,bOverride_AutoExposureSpeedUp=False,bOverride_AutoExposureSpeedDown=False,bOverride_AutoExposureBias=True,bOverride_HistogramLogMin=True,bOverride_HistogramLogMax=True,bOverride_LensFlareIntensity=False,bOverride_LensFlareTint=False,bOverride_LensFlareTints=False,bOverride_LensFlareBokehSize=False,bOverride_LensFlareBokehShape=False,bOverride_LensFlareThreshold=False,bOverride_VignetteIntensity=True,bOverride_GrainIntensity=False,bOverride_GrainJitter=False,bOverride_AmbientOcclusionIntensity=True,bOverride_AmbientOcclusionStaticFraction=True,bOverride_AmbientOcclusionRadius=True,bOverride_AmbientOcclusionFadeDistance=False,bOverride_AmbientOcclusionFadeRadius=False,bOverride_AmbientOcclusionDistance=False,bOverride_AmbientOcclusionRadiusInWS=False,bOverride_AmbientOcclusionPower=True,bOverride_AmbientOcclusionBias=True,bOverride_AmbientOcclusionQuality=True,bOverride_AmbientOcclusionMipBlend=True,bOverride_AmbientOcclusionMipScale=True,bOverride_AmbientOcclusionMipThreshold=True,bOverride_LPVIntensity=False,bOverride_LPVDirectionalOcclusionIntensity=False,bOverride_LPVDirectionalOcclusionRadius=False,bOverride_LPVDiffuseOcclusionExponent=False,bOverride_LPVSpecularOcclusionExponent=False,bOverride_LPVDiffuseOcclusionIntensity=False,bOverride_LPVSpecularOcclusionIntensity=False,bOverride_LPVSize=False,bOverride_LPVSecondaryOcclusionIntensity=False,bOverride_LPVSecondaryBounceIntensity=False,bOverride_LPVGeometryVolumeBias=False,bOverride_LPVVplInjectionBias=False,bOverride_LPVEmissiveInjectionIntensity=False,bOverride_IndirectLightingColor=False,bOverride_IndirectLightingIntensity=False,bOverride_ColorGradingIntensity=True,bOverride_ColorGradingLUT=True,bOverride_DepthOfFieldFocalDistance=False,bOverride_DepthOfFieldFstop=False,bOverride_DepthOfFieldSensorWidth=False,bOverride_DepthOfFieldDepthBlurRadius=False,bOverride_DepthOfFieldDepthBlurAmount=False,bOverride_DepthOfFieldFocalRegion=False,bOverride_DepthOfFieldNearTransitionRegion=False,bOverride_DepthOfFieldFarTransitionRegion=False,bOverride_DepthOfFieldScale=True,bOverride_DepthOfFieldMaxBokehSize=False,bOverride_DepthOfFieldNearBlurSize=False,bOverride_DepthOfFieldFarBlurSize=False,bOverride_DepthOfFieldMethod=True,bOverride_MobileHQGaussian=False,bOverride_DepthOfFieldBokehShape=False,bOverride_DepthOfFieldOcclusion=False,bOverride_DepthOfFieldColorThreshold=False,bOverride_DepthOfFieldSizeThreshold=False,bOverride_DepthOfFieldSkyFocusDistance=False,bOverride_DepthOfFieldVignetteSize=False,bOverride_MotionBlurAmount=False,bOverride_MotionBlurMax=False,bOverride_MotionBlurPerObjectSize=False,bOverride_ScreenPercentage=False,bOverride_ScreenSpaceReflectionIntensity=True,bOverride_ScreenSpaceReflectionQuality=True,bOverride_ScreenSpaceReflectionMaxRoughness=True,bOverride_ScreenSpaceReflectionRoughnessScale=False,WhiteTemp=6700.000000,WhiteTint=0.000000,ColorSaturation=(X=1.000000,Y=1.000000,Z=1.000000),ColorContrast=(X=1.000000,Y=1.000000,Z=1.000000),ColorGamma=(X=1.000000,Y=1.000000,Z=1.000000),ColorGain=(X=1.000000,Y=1.000000,Z=1.000000),ColorOffset=(X=0.005000,Y=0.005000,Z=0.005000),FilmWhitePoint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),FilmShadowTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),FilmShadowTintBlend=0.500000,FilmShadowTintAmount=0.000000,FilmSaturation=1.000000,FilmChannelMixerRed=(R=1.000000,G=0.000000,B=0.000000,A=1.000000),FilmChannelMixerGreen=(R=0.000000,G=1.000000,B=0.000000,A=1.000000),FilmChannelMixerBlue=(R=0.000000,G=0.000000,B=1.000000,A=1.000000),FilmContrast=0.030000,FilmToeAmount=1.000000,FilmHealAmount=1.000000,FilmDynamicRange=4.000000,FilmSlope=0.880000,FilmToe=0.550000,FilmShoulder=0.260000,FilmBlackClip=0.000000,FilmWhiteClip=0.040000,SceneColorTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),SceneFringeIntensity=0.000000,BloomIntensity=0.675000,BloomThreshold=-1.000000,BloomSizeScale=4.000000,Bloom1Size=0.300000,Bloom2Size=1.000000,Bloom3Size=2.000000,Bloom4Size=10.000000,Bloom5Size=30.000000,Bloom6Size=64.000000,Bloom1Tint=(R=0.346500,G=0.346500,B=0.346500,A=1.000000),Bloom2Tint=(R=0.138000,G=0.138000,B=0.138000,A=1.000000),Bloom3Tint=(R=0.117600,G=0.117600,B=0.117600,A=1.000000),Bloom4Tint=(R=0.066000,G=0.066000,B=0.066000,A=1.000000),Bloom5Tint=(R=0.066000,G=0.066000,B=0.066000,A=1.000000),Bloom6Tint=(R=0.061000,G=0.061000,B=0.061000,A=1.000000),BloomDirtMaskIntensity=0.000000,BloomDirtMaskTint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),BloomDirtMask=None,LPVIntensity=1.000000,LPVVplInjectionBias=0.640000,LPVSize=5312.000000,LPVSecondaryOcclusionIntensity=0.000000,LPVSecondaryBounceIntensity=0.000000,LPVGeometryVolumeBias=0.384000,LPVEmissiveInjectionIntensity=1.000000,LPVDirectionalOcclusionIntensity=0.000000,LPVDirectionalOcclusionRadius=8.000000,LPVDiffuseOcclusionExponent=1.000000,LPVSpecularOcclusionExponent=7.000000,LPVDiffuseOcclusionIntensity=1.000000,LPVSpecularOcclusionIntensity=1.000000,AmbientCubemapTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),AmbientCubemapIntensity=1.000000,AmbientCubemap=None,AutoExposureMethod=AEM_Histogram,AutoExposureLowPercent=80.000000,AutoExposureHighPercent=98.300003,AutoExposureMinBrightness=1.000000,AutoExposureMaxBrightness=1.000000,AutoExposureSpeedUp=3.000000,AutoExposureSpeedDown=1.000000,AutoExposureBias=0.330000,HistogramLogMin=-8.000000,HistogramLogMax=4.000000,LensFlareIntensity=1.000000,LensFlareTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),LensFlareBokehSize=3.000000,LensFlareThreshold=8.000000,LensFlareBokehShape=None,LensFlareTints[0]=(R=1.000000,G=0.800000,B=0.400000,A=0.600000),LensFlareTints[1]=(R=1.000000,G=1.000000,B=0.600000,A=0.530000),LensFlareTints[2]=(R=0.800000,G=0.800000,B=1.000000,A=0.460000),LensFlareTints[3]=(R=0.500000,G=1.000000,B=0.400000,A=0.390000),LensFlareTints[4]=(R=0.500000,G=0.800000,B=1.000000,A=0.310000),LensFlareTints[5]=(R=0.900000,G=1.000000,B=0.800000,A=0.270000),LensFlareTints[6]=(R=1.000000,G=0.800000,B=0.400000,A=0.220000),LensFlareTints[7]=(R=0.900000,G=0.700000,B=0.700000,A=0.150000),VignetteIntensity=0.161468,GrainJitter=0.000000,GrainIntensity=0.000000,AmbientOcclusionIntensity=1.000000,AmbientOcclusionStaticFraction=1.000000,AmbientOcclusionRadius=73.477997,AmbientOcclusionRadiusInWS=False,AmbientOcclusionFadeDistance=8000.000000,AmbientOcclusionFadeRadius=5000.000000,AmbientOcclusionDistance=80.000000,AmbientOcclusionPower=1.200000,AmbientOcclusionBias=3.000000,AmbientOcclusionQuality=100.000000,AmbientOcclusionMipBlend=0.600000,AmbientOcclusionMipScale=1.700000,AmbientOcclusionMipThreshold=0.010000,IndirectLightingColor=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),IndirectLightingIntensity=1.000000,ColorGradingIntensity=0.000000,ColorGradingLUT=Texture2D'/Engine/EditorResources/RGBTable16x1_AssetViewer.RGBTable16x1_AssetViewer',DepthOfFieldMethod=DOFM_BokehDOF,bMobileHQGaussian=False,DepthOfFieldFstop=4.000000,DepthOfFieldSensorWidth=24.576000,DepthOfFieldFocalDistance=1000.000000,DepthOfFieldDepthBlurAmount=1.000000,DepthOfFieldDepthBlurRadius=0.000000,DepthOfFieldFocalRegion=0.000000,DepthOfFieldNearTransitionRegion=300.000000,DepthOfFieldFarTransitionRegion=500.000000,DepthOfFieldScale=0.000000,DepthOfFieldMaxBokehSize=15.000000,DepthOfFieldNearBlurSize=15.000000,DepthOfFieldFarBlurSize=15.000000,DepthOfFieldBokehShape=None,DepthOfFieldOcclusion=0.400000,DepthOfFieldColorThreshold=1.000000,DepthOfFieldSizeThreshold=0.080000,DepthOfFieldSkyFocusDistance=0.000000,DepthOfFieldVignetteSize=200.000000,MotionBlurAmount=0.500000,MotionBlurMax=5.000000,MotionBlurPerObjectSize=0.500000,ScreenPercentage=100.000000,ScreenSpaceReflectionIntensity=100.000000,ScreenSpaceReflectionQuality=100.000000,ScreenSpaceReflectionMaxRoughness=1.000000,WeightedBlendables=(Array=),Blendables=),bPostProcessingEnabled=True,LightingRigRotation=109.389069,RotationSpeed=2.000000,DirectionalLightRotation=(Pitch=-40.000000,Yaw=-67.500000,Roll=0.000000))\n-Profiles=(ProfileName=\"Default\",DirectionalLightIntensity=2.620000,DirectionalLightColor=(R=0.990000,G=0.839850,B=0.732600,A=1.000000),SkyLightIntensity=0.880000,bRotateLightingRig=False,bShowEnvironment=True,bShowFloor=True,EnvironmentCubeMapPath=\"/Engine/EditorMaterials/AssetViewer/EpicQuadPanorama_CC+EV1.EpicQuadPanorama_CC+EV1\",PostProcessingSettings=(bOverride_WhiteTemp=True,bOverride_WhiteTint=False,bOverride_ColorSaturation=True,bOverride_ColorContrast=True,bOverride_ColorGamma=True,bOverride_ColorGain=True,bOverride_ColorOffset=True,bOverride_ColorSaturationShadows=False,bOverride_ColorContrastShadows=False,bOverride_ColorGammaShadows=False,bOverride_ColorGainShadows=False,bOverride_ColorOffsetShadows=False,bOverride_ColorSaturationMidtones=False,bOverride_ColorContrastMidtones=False,bOverride_ColorGammaMidtones=False,bOverride_ColorGainMidtones=False,bOverride_ColorOffsetMidtones=False,bOverride_ColorSaturationHighlights=False,bOverride_ColorContrastHighlights=False,bOverride_ColorGammaHighlights=False,bOverride_ColorGainHighlights=False,bOverride_ColorOffsetHighlights=False,bOverride_ColorCorrectionShadowsMax=False,bOverride_ColorCorrectionHighlightsMin=False,bOverride_FilmWhitePoint=False,bOverride_FilmSaturation=False,bOverride_FilmChannelMixerRed=False,bOverride_FilmChannelMixerGreen=False,bOverride_FilmChannelMixerBlue=False,bOverride_FilmContrast=False,bOverride_FilmDynamicRange=False,bOverride_FilmHealAmount=False,bOverride_FilmToeAmount=False,bOverride_FilmShadowTint=False,bOverride_FilmShadowTintBlend=False,bOverride_FilmShadowTintAmount=False,bOverride_FilmSlope=True,bOverride_FilmToe=True,bOverride_FilmShoulder=True,bOverride_FilmBlackClip=True,bOverride_FilmWhiteClip=True,bOverride_SceneColorTint=False,bOverride_SceneFringeIntensity=False,bOverride_AmbientCubemapTint=False,bOverride_AmbientCubemapIntensity=False,bOverride_BloomIntensity=True,bOverride_BloomThreshold=False,bOverride_Bloom1Tint=False,bOverride_Bloom1Size=False,bOverride_Bloom2Size=False,bOverride_Bloom2Tint=False,bOverride_Bloom3Tint=False,bOverride_Bloom3Size=False,bOverride_Bloom4Tint=False,bOverride_Bloom4Size=False,bOverride_Bloom5Tint=False,bOverride_Bloom5Size=False,bOverride_Bloom6Tint=False,bOverride_Bloom6Size=False,bOverride_BloomSizeScale=False,bOverride_BloomDirtMaskIntensity=False,bOverride_BloomDirtMaskTint=False,bOverride_BloomDirtMask=False,bOverride_AutoExposureMethod=True,bOverride_AutoExposureLowPercent=False,bOverride_AutoExposureHighPercent=False,bOverride_AutoExposureMinBrightness=True,bOverride_AutoExposureMaxBrightness=True,bOverride_AutoExposureSpeedUp=False,bOverride_AutoExposureSpeedDown=False,bOverride_AutoExposureBias=True,bOverride_HistogramLogMin=True,bOverride_HistogramLogMax=True,bOverride_LensFlareIntensity=False,bOverride_LensFlareTint=False,bOverride_LensFlareTints=False,bOverride_LensFlareBokehSize=False,bOverride_LensFlareBokehShape=False,bOverride_LensFlareThreshold=False,bOverride_VignetteIntensity=True,bOverride_GrainIntensity=False,bOverride_GrainJitter=False,bOverride_AmbientOcclusionIntensity=True,bOverride_AmbientOcclusionStaticFraction=True,bOverride_AmbientOcclusionRadius=True,bOverride_AmbientOcclusionFadeDistance=False,bOverride_AmbientOcclusionFadeRadius=False,bOverride_AmbientOcclusionDistance=False,bOverride_AmbientOcclusionRadiusInWS=False,bOverride_AmbientOcclusionPower=True,bOverride_AmbientOcclusionBias=True,bOverride_AmbientOcclusionQuality=True,bOverride_AmbientOcclusionMipBlend=True,bOverride_AmbientOcclusionMipScale=True,bOverride_AmbientOcclusionMipThreshold=True,bOverride_LPVIntensity=False,bOverride_LPVDirectionalOcclusionIntensity=False,bOverride_LPVDirectionalOcclusionRadius=False,bOverride_LPVDiffuseOcclusionExponent=False,bOverride_LPVSpecularOcclusionExponent=False,bOverride_LPVDiffuseOcclusionIntensity=False,bOverride_LPVSpecularOcclusionIntensity=False,bOverride_LPVSize=False,bOverride_LPVSecondaryOcclusionIntensity=False,bOverride_LPVSecondaryBounceIntensity=False,bOverride_LPVGeometryVolumeBias=False,bOverride_LPVVplInjectionBias=False,bOverride_LPVEmissiveInjectionIntensity=False,bOverride_IndirectLightingColor=False,bOverride_IndirectLightingIntensity=False,bOverride_ColorGradingIntensity=True,bOverride_ColorGradingLUT=True,bOverride_DepthOfFieldFocalDistance=False,bOverride_DepthOfFieldFstop=False,bOverride_DepthOfFieldSensorWidth=False,bOverride_DepthOfFieldDepthBlurRadius=False,bOverride_DepthOfFieldDepthBlurAmount=False,bOverride_DepthOfFieldFocalRegion=False,bOverride_DepthOfFieldNearTransitionRegion=False,bOverride_DepthOfFieldFarTransitionRegion=False,bOverride_DepthOfFieldScale=True,bOverride_DepthOfFieldMaxBokehSize=False,bOverride_DepthOfFieldNearBlurSize=False,bOverride_DepthOfFieldFarBlurSize=False,bOverride_DepthOfFieldMethod=True,bOverride_MobileHQGaussian=False,bOverride_DepthOfFieldBokehShape=False,bOverride_DepthOfFieldOcclusion=False,bOverride_DepthOfFieldColorThreshold=False,bOverride_DepthOfFieldSizeThreshold=False,bOverride_DepthOfFieldSkyFocusDistance=False,bOverride_DepthOfFieldVignetteSize=False,bOverride_MotionBlurAmount=False,bOverride_MotionBlurMax=False,bOverride_MotionBlurPerObjectSize=False,bOverride_ScreenPercentage=False,bOverride_ScreenSpaceReflectionIntensity=True,bOverride_ScreenSpaceReflectionQuality=True,bOverride_ScreenSpaceReflectionMaxRoughness=True,bOverride_ScreenSpaceReflectionRoughnessScale=False,WhiteTemp=6700.000000,WhiteTint=0.000000,ColorSaturation=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorContrast=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGamma=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGain=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorOffset=(X=0.005000,Y=0.005000,Z=0.005000,W=0.000000),ColorSaturationShadows=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorContrastShadows=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGammaShadows=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGainShadows=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorOffsetShadows=(X=0.000000,Y=0.000000,Z=0.000000,W=0.000000),ColorCorrectionShadowsMax=0.090000,ColorSaturationMidtones=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorContrastMidtones=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGammaMidtones=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGainMidtones=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorOffsetMidtones=(X=0.000000,Y=0.000000,Z=0.000000,W=0.000000),ColorSaturationHighlights=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorContrastHighlights=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGammaHighlights=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGainHighlights=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorOffsetHighlights=(X=0.000000,Y=0.000000,Z=0.000000,W=0.000000),ColorCorrectionHighlightsMin=0.500000,FilmWhitePoint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),FilmShadowTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),FilmShadowTintBlend=0.500000,FilmShadowTintAmount=0.000000,FilmSaturation=1.000000,FilmChannelMixerRed=(R=1.000000,G=0.000000,B=0.000000,A=1.000000),FilmChannelMixerGreen=(R=0.000000,G=1.000000,B=0.000000,A=1.000000),FilmChannelMixerBlue=(R=0.000000,G=0.000000,B=1.000000,A=1.000000),FilmContrast=0.030000,FilmToeAmount=1.000000,FilmHealAmount=1.000000,FilmDynamicRange=4.000000,FilmSlope=0.880000,FilmToe=0.550000,FilmShoulder=0.260000,FilmBlackClip=0.000000,FilmWhiteClip=0.040000,SceneColorTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),SceneFringeIntensity=0.000000,BloomIntensity=0.675000,BloomThreshold=-1.000000,BloomSizeScale=4.000000,Bloom1Size=0.300000,Bloom2Size=1.000000,Bloom3Size=2.000000,Bloom4Size=10.000000,Bloom5Size=30.000000,Bloom6Size=64.000000,Bloom1Tint=(R=0.346500,G=0.346500,B=0.346500,A=1.000000),Bloom2Tint=(R=0.138000,G=0.138000,B=0.138000,A=1.000000),Bloom3Tint=(R=0.117600,G=0.117600,B=0.117600,A=1.000000),Bloom4Tint=(R=0.066000,G=0.066000,B=0.066000,A=1.000000),Bloom5Tint=(R=0.066000,G=0.066000,B=0.066000,A=1.000000),Bloom6Tint=(R=0.061000,G=0.061000,B=0.061000,A=1.000000),BloomDirtMaskIntensity=0.000000,BloomDirtMaskTint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),BloomDirtMask=None,AmbientCubemapTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),AmbientCubemapIntensity=1.000000,AmbientCubemap=None,AutoExposureMethod=AEM_Histogram,AutoExposureLowPercent=80.000000,AutoExposureHighPercent=98.300003,AutoExposureMinBrightness=1.000000,AutoExposureMaxBrightness=1.000000,AutoExposureSpeedUp=3.000000,AutoExposureSpeedDown=1.000000,AutoExposureBias=0.330000,HistogramLogMin=-8.000000,HistogramLogMax=4.000000,LensFlareIntensity=1.000000,LensFlareTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),LensFlareBokehSize=3.000000,LensFlareThreshold=8.000000,LensFlareBokehShape=None,LensFlareTints[0]=(R=1.000000,G=0.800000,B=0.400000,A=0.600000),LensFlareTints[1]=(R=1.000000,G=1.000000,B=0.600000,A=0.530000),LensFlareTints[2]=(R=0.800000,G=0.800000,B=1.000000,A=0.460000),LensFlareTints[3]=(R=0.500000,G=1.000000,B=0.400000,A=0.390000),LensFlareTints[4]=(R=0.500000,G=0.800000,B=1.000000,A=0.310000),LensFlareTints[5]=(R=0.900000,G=1.000000,B=0.800000,A=0.270000),LensFlareTints[6]=(R=1.000000,G=0.800000,B=0.400000,A=0.220000),LensFlareTints[7]=(R=0.900000,G=0.700000,B=0.700000,A=0.150000),VignetteIntensity=0.161468,GrainJitter=0.000000,GrainIntensity=0.000000,AmbientOcclusionIntensity=1.000000,AmbientOcclusionStaticFraction=1.000000,AmbientOcclusionRadius=73.477997,AmbientOcclusionRadiusInWS=False,AmbientOcclusionFadeDistance=8000.000000,AmbientOcclusionFadeRadius=5000.000000,AmbientOcclusionDistance=80.000000,AmbientOcclusionPower=1.200000,AmbientOcclusionBias=3.000000,AmbientOcclusionQuality=100.000000,AmbientOcclusionMipBlend=0.600000,AmbientOcclusionMipScale=1.700000,AmbientOcclusionMipThreshold=0.010000,IndirectLightingColor=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),IndirectLightingIntensity=1.000000,ColorGradingIntensity=0.000000,ColorGradingLUT=Texture2D'/Engine/EditorResources/RGBTable16x1_AssetViewer.RGBTable16x1_AssetViewer',DepthOfFieldMethod=DOFM_BokehDOF,bMobileHQGaussian=False,DepthOfFieldFstop=4.000000,DepthOfFieldSensorWidth=24.576000,DepthOfFieldFocalDistance=1000.000000,DepthOfFieldDepthBlurAmount=1.000000,DepthOfFieldDepthBlurRadius=0.000000,DepthOfFieldFocalRegion=0.000000,DepthOfFieldNearTransitionRegion=300.000000,DepthOfFieldFarTransitionRegion=500.000000,DepthOfFieldScale=0.000000,DepthOfFieldMaxBokehSize=15.000000,DepthOfFieldNearBlurSize=15.000000,DepthOfFieldFarBlurSize=15.000000,DepthOfFieldBokehShape=None,DepthOfFieldOcclusion=0.400000,DepthOfFieldColorThreshold=1.000000,DepthOfFieldSizeThreshold=0.080000,DepthOfFieldSkyFocusDistance=0.000000,DepthOfFieldVignetteSize=200.000000,MotionBlurAmount=0.500000,MotionBlurMax=5.000000,MotionBlurPerObjectSize=0.500000,LPVIntensity=1.000000,LPVVplInjectionBias=0.640000,LPVSize=5312.000000,LPVSecondaryOcclusionIntensity=0.000000,LPVSecondaryBounceIntensity=0.000000,LPVGeometryVolumeBias=0.384000,LPVEmissiveInjectionIntensity=1.000000,LPVDirectionalOcclusionIntensity=0.000000,LPVDirectionalOcclusionRadius=8.000000,LPVDiffuseOcclusionExponent=1.000000,LPVSpecularOcclusionExponent=7.000000,LPVDiffuseOcclusionIntensity=1.000000,LPVSpecularOcclusionIntensity=1.000000,ScreenSpaceReflectionIntensity=100.000000,ScreenSpaceReflectionQuality=100.000000,ScreenSpaceReflectionMaxRoughness=1.000000,ScreenPercentage=100.000000,WeightedBlendables=(Array=),Blendables=),bPostProcessingEnabled=True,LightingRigRotation=109.389069,RotationSpeed=2.000000,DirectionalLightRotation=(Pitch=-39.999985,Yaw=-67.500015,Roll=0.000000))\n-Profiles=(ProfileName=\"Default\",DirectionalLightIntensity=2.620000,DirectionalLightColor=(R=0.990000,G=0.839850,B=0.732600,A=1.000000),SkyLightIntensity=0.880000,bRotateLightingRig=False,bShowEnvironment=True,bShowFloor=True,EnvironmentCubeMapPath=\"/Engine/EditorMaterials/AssetViewer/EpicQuadPanorama_CC+EV1.EpicQuadPanorama_CC+EV1\",PostProcessingSettings=(bOverride_WhiteTemp=True,bOverride_WhiteTint=False,bOverride_ColorSaturation=True,bOverride_ColorContrast=True,bOverride_ColorGamma=True,bOverride_ColorGain=True,bOverride_ColorOffset=True,bOverride_ColorSaturationShadows=False,bOverride_ColorContrastShadows=False,bOverride_ColorGammaShadows=False,bOverride_ColorGainShadows=False,bOverride_ColorOffsetShadows=False,bOverride_ColorSaturationMidtones=False,bOverride_ColorContrastMidtones=False,bOverride_ColorGammaMidtones=False,bOverride_ColorGainMidtones=False,bOverride_ColorOffsetMidtones=False,bOverride_ColorSaturationHighlights=False,bOverride_ColorContrastHighlights=False,bOverride_ColorGammaHighlights=False,bOverride_ColorGainHighlights=False,bOverride_ColorOffsetHighlights=False,bOverride_ColorCorrectionShadowsMax=False,bOverride_ColorCorrectionHighlightsMin=False,bOverride_FilmWhitePoint=False,bOverride_FilmSaturation=False,bOverride_FilmChannelMixerRed=False,bOverride_FilmChannelMixerGreen=False,bOverride_FilmChannelMixerBlue=False,bOverride_FilmContrast=False,bOverride_FilmDynamicRange=False,bOverride_FilmHealAmount=False,bOverride_FilmToeAmount=False,bOverride_FilmShadowTint=False,bOverride_FilmShadowTintBlend=False,bOverride_FilmShadowTintAmount=False,bOverride_FilmSlope=True,bOverride_FilmToe=True,bOverride_FilmShoulder=True,bOverride_FilmBlackClip=True,bOverride_FilmWhiteClip=True,bOverride_SceneColorTint=False,bOverride_SceneFringeIntensity=False,bOverride_AmbientCubemapTint=False,bOverride_AmbientCubemapIntensity=False,bOverride_BloomIntensity=True,bOverride_BloomThreshold=False,bOverride_Bloom1Tint=False,bOverride_Bloom1Size=False,bOverride_Bloom2Size=False,bOverride_Bloom2Tint=False,bOverride_Bloom3Tint=False,bOverride_Bloom3Size=False,bOverride_Bloom4Tint=False,bOverride_Bloom4Size=False,bOverride_Bloom5Tint=False,bOverride_Bloom5Size=False,bOverride_Bloom6Tint=False,bOverride_Bloom6Size=False,bOverride_BloomSizeScale=False,bOverride_BloomDirtMaskIntensity=False,bOverride_BloomDirtMaskTint=False,bOverride_BloomDirtMask=False,bOverride_AutoExposureMethod=True,bOverride_AutoExposureLowPercent=False,bOverride_AutoExposureHighPercent=False,bOverride_AutoExposureMinBrightness=True,bOverride_AutoExposureMaxBrightness=True,bOverride_AutoExposureSpeedUp=False,bOverride_AutoExposureSpeedDown=False,bOverride_AutoExposureBias=True,bOverride_HistogramLogMin=True,bOverride_HistogramLogMax=True,bOverride_LensFlareIntensity=False,bOverride_LensFlareTint=False,bOverride_LensFlareTints=False,bOverride_LensFlareBokehSize=False,bOverride_LensFlareBokehShape=False,bOverride_LensFlareThreshold=False,bOverride_VignetteIntensity=True,bOverride_GrainIntensity=False,bOverride_GrainJitter=False,bOverride_AmbientOcclusionIntensity=True,bOverride_AmbientOcclusionStaticFraction=True,bOverride_AmbientOcclusionRadius=True,bOverride_AmbientOcclusionFadeDistance=False,bOverride_AmbientOcclusionFadeRadius=False,bOverride_AmbientOcclusionDistance=False,bOverride_AmbientOcclusionRadiusInWS=False,bOverride_AmbientOcclusionPower=True,bOverride_AmbientOcclusionBias=True,bOverride_AmbientOcclusionQuality=True,bOverride_AmbientOcclusionMipBlend=True,bOverride_AmbientOcclusionMipScale=True,bOverride_AmbientOcclusionMipThreshold=True,bOverride_LPVIntensity=False,bOverride_LPVDirectionalOcclusionIntensity=False,bOverride_LPVDirectionalOcclusionRadius=False,bOverride_LPVDiffuseOcclusionExponent=False,bOverride_LPVSpecularOcclusionExponent=False,bOverride_LPVDiffuseOcclusionIntensity=False,bOverride_LPVSpecularOcclusionIntensity=False,bOverride_LPVSize=False,bOverride_LPVSecondaryOcclusionIntensity=False,bOverride_LPVSecondaryBounceIntensity=False,bOverride_LPVGeometryVolumeBias=False,bOverride_LPVVplInjectionBias=False,bOverride_LPVEmissiveInjectionIntensity=False,bOverride_IndirectLightingColor=False,bOverride_IndirectLightingIntensity=False,bOverride_ColorGradingIntensity=True,bOverride_ColorGradingLUT=True,bOverride_DepthOfFieldFocalDistance=False,bOverride_DepthOfFieldFstop=False,bOverride_DepthOfFieldSensorWidth=False,bOverride_DepthOfFieldDepthBlurRadius=False,bOverride_DepthOfFieldDepthBlurAmount=False,bOverride_DepthOfFieldFocalRegion=False,bOverride_DepthOfFieldNearTransitionRegion=False,bOverride_DepthOfFieldFarTransitionRegion=False,bOverride_DepthOfFieldScale=True,bOverride_DepthOfFieldMaxBokehSize=False,bOverride_DepthOfFieldNearBlurSize=False,bOverride_DepthOfFieldFarBlurSize=False,bOverride_DepthOfFieldMethod=True,bOverride_MobileHQGaussian=False,bOverride_DepthOfFieldBokehShape=False,bOverride_DepthOfFieldOcclusion=False,bOverride_DepthOfFieldColorThreshold=False,bOverride_DepthOfFieldSizeThreshold=False,bOverride_DepthOfFieldSkyFocusDistance=False,bOverride_DepthOfFieldVignetteSize=False,bOverride_MotionBlurAmount=False,bOverride_MotionBlurMax=False,bOverride_MotionBlurPerObjectSize=False,bOverride_ScreenPercentage=False,bOverride_ScreenSpaceReflectionIntensity=True,bOverride_ScreenSpaceReflectionQuality=True,bOverride_ScreenSpaceReflectionMaxRoughness=True,bOverride_ScreenSpaceReflectionRoughnessScale=False,WhiteTemp=6700.000000,WhiteTint=0.000000,ColorSaturation=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorContrast=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGamma=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGain=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorOffset=(X=0.005000,Y=0.005000,Z=0.005000,W=0.000000),ColorSaturationShadows=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorContrastShadows=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGammaShadows=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGainShadows=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorOffsetShadows=(X=0.000000,Y=0.000000,Z=0.000000,W=0.000000),ColorCorrectionShadowsMax=0.090000,ColorSaturationMidtones=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorContrastMidtones=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGammaMidtones=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGainMidtones=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorOffsetMidtones=(X=0.000000,Y=0.000000,Z=0.000000,W=0.000000),ColorSaturationHighlights=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorContrastHighlights=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGammaHighlights=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGainHighlights=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorOffsetHighlights=(X=0.000000,Y=0.000000,Z=0.000000,W=0.000000),ColorCorrectionHighlightsMin=0.500000,FilmWhitePoint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),FilmShadowTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),FilmShadowTintBlend=0.500000,FilmShadowTintAmount=0.000000,FilmSaturation=1.000000,FilmChannelMixerRed=(R=1.000000,G=0.000000,B=0.000000,A=1.000000),FilmChannelMixerGreen=(R=0.000000,G=1.000000,B=0.000000,A=1.000000),FilmChannelMixerBlue=(R=0.000000,G=0.000000,B=1.000000,A=1.000000),FilmContrast=0.030000,FilmToeAmount=1.000000,FilmHealAmount=1.000000,FilmDynamicRange=4.000000,FilmSlope=0.880000,FilmToe=0.550000,FilmShoulder=0.260000,FilmBlackClip=0.000000,FilmWhiteClip=0.040000,SceneColorTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),SceneFringeIntensity=0.000000,BloomIntensity=0.675000,BloomThreshold=-1.000000,BloomSizeScale=4.000000,Bloom1Size=0.300000,Bloom2Size=1.000000,Bloom3Size=2.000000,Bloom4Size=10.000000,Bloom5Size=30.000000,Bloom6Size=64.000000,Bloom1Tint=(R=0.346500,G=0.346500,B=0.346500,A=1.000000),Bloom2Tint=(R=0.138000,G=0.138000,B=0.138000,A=1.000000),Bloom3Tint=(R=0.117600,G=0.117600,B=0.117600,A=1.000000),Bloom4Tint=(R=0.066000,G=0.066000,B=0.066000,A=1.000000),Bloom5Tint=(R=0.066000,G=0.066000,B=0.066000,A=1.000000),Bloom6Tint=(R=0.061000,G=0.061000,B=0.061000,A=1.000000),BloomDirtMaskIntensity=0.000000,BloomDirtMaskTint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),BloomDirtMask=None,AmbientCubemapTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),AmbientCubemapIntensity=1.000000,AmbientCubemap=None,AutoExposureMethod=AEM_Histogram,AutoExposureLowPercent=80.000000,AutoExposureHighPercent=98.300003,AutoExposureMinBrightness=1.000000,AutoExposureMaxBrightness=1.000000,AutoExposureSpeedUp=3.000000,AutoExposureSpeedDown=1.000000,AutoExposureBias=0.330000,HistogramLogMin=-8.000000,HistogramLogMax=4.000000,LensFlareIntensity=1.000000,LensFlareTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),LensFlareBokehSize=3.000000,LensFlareThreshold=8.000000,LensFlareBokehShape=None,LensFlareTints[0]=(R=1.000000,G=0.800000,B=0.400000,A=0.600000),LensFlareTints[1]=(R=1.000000,G=1.000000,B=0.600000,A=0.530000),LensFlareTints[2]=(R=0.800000,G=0.800000,B=1.000000,A=0.460000),LensFlareTints[3]=(R=0.500000,G=1.000000,B=0.400000,A=0.390000),LensFlareTints[4]=(R=0.500000,G=0.800000,B=1.000000,A=0.310000),LensFlareTints[5]=(R=0.900000,G=1.000000,B=0.800000,A=0.270000),LensFlareTints[6]=(R=1.000000,G=0.800000,B=0.400000,A=0.220000),LensFlareTints[7]=(R=0.900000,G=0.700000,B=0.700000,A=0.150000),VignetteIntensity=0.161468,GrainJitter=0.000000,GrainIntensity=0.000000,AmbientOcclusionIntensity=1.000000,AmbientOcclusionStaticFraction=1.000000,AmbientOcclusionRadius=73.477997,AmbientOcclusionRadiusInWS=False,AmbientOcclusionFadeDistance=8000.000000,AmbientOcclusionFadeRadius=5000.000000,AmbientOcclusionDistance=80.000000,AmbientOcclusionPower=1.200000,AmbientOcclusionBias=3.000000,AmbientOcclusionQuality=100.000000,AmbientOcclusionMipBlend=0.600000,AmbientOcclusionMipScale=1.700000,AmbientOcclusionMipThreshold=0.010000,IndirectLightingColor=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),IndirectLightingIntensity=1.000000,ColorGradingIntensity=0.000000,ColorGradingLUT=Texture2D'/Engine/EditorResources/RGBTable16x1_AssetViewer.RGBTable16x1_AssetViewer',DepthOfFieldMethod=DOFM_BokehDOF,bMobileHQGaussian=False,DepthOfFieldFstop=4.000000,DepthOfFieldSensorWidth=24.576000,DepthOfFieldFocalDistance=1000.000000,DepthOfFieldDepthBlurAmount=1.000000,DepthOfFieldDepthBlurRadius=0.000000,DepthOfFieldFocalRegion=0.000000,DepthOfFieldNearTransitionRegion=300.000000,DepthOfFieldFarTransitionRegion=500.000000,DepthOfFieldScale=0.000000,DepthOfFieldMaxBokehSize=15.000000,DepthOfFieldNearBlurSize=15.000000,DepthOfFieldFarBlurSize=15.000000,DepthOfFieldBokehShape=None,DepthOfFieldOcclusion=0.400000,DepthOfFieldColorThreshold=1.000000,DepthOfFieldSizeThreshold=0.080000,DepthOfFieldSkyFocusDistance=0.000000,DepthOfFieldVignetteSize=200.000000,MotionBlurAmount=0.500000,MotionBlurMax=5.000000,MotionBlurPerObjectSize=0.500000,LPVIntensity=1.000000,LPVVplInjectionBias=0.640000,LPVSize=5312.000000,LPVSecondaryOcclusionIntensity=0.000000,LPVSecondaryBounceIntensity=0.000000,LPVGeometryVolumeBias=0.384000,LPVEmissiveInjectionIntensity=1.000000,LPVDirectionalOcclusionIntensity=0.000000,LPVDirectionalOcclusionRadius=8.000000,LPVDiffuseOcclusionExponent=1.000000,LPVSpecularOcclusionExponent=7.000000,LPVDiffuseOcclusionIntensity=1.000000,LPVSpecularOcclusionIntensity=1.000000,ScreenSpaceReflectionIntensity=100.000000,ScreenSpaceReflectionQuality=100.000000,ScreenSpaceReflectionMaxRoughness=1.000000,ScreenPercentage=100.000000,WeightedBlendables=(Array=),Blendables=),bPostProcessingEnabled=True,LightingRigRotation=109.389069,RotationSpeed=2.000000,DirectionalLightRotation=(Pitch=-39.999985,Yaw=-67.500015,Roll=0.000000))\n-Profiles=(ProfileName=\"Default\",DirectionalLightIntensity=2.620000,DirectionalLightColor=(R=0.990000,G=0.839850,B=0.732600,A=1.000000),SkyLightIntensity=0.880000,bRotateLightingRig=False,bShowEnvironment=True,bShowFloor=True,EnvironmentCubeMapPath=\"/Engine/EditorMaterials/AssetViewer/EpicQuadPanorama_CC+EV1.EpicQuadPanorama_CC+EV1\",PostProcessingSettings=(bOverride_WhiteTemp=True,bOverride_WhiteTint=False,bOverride_ColorSaturation=True,bOverride_ColorContrast=True,bOverride_ColorGamma=True,bOverride_ColorGain=True,bOverride_ColorOffset=True,bOverride_ColorSaturationShadows=False,bOverride_ColorContrastShadows=False,bOverride_ColorGammaShadows=False,bOverride_ColorGainShadows=False,bOverride_ColorOffsetShadows=False,bOverride_ColorSaturationMidtones=False,bOverride_ColorContrastMidtones=False,bOverride_ColorGammaMidtones=False,bOverride_ColorGainMidtones=False,bOverride_ColorOffsetMidtones=False,bOverride_ColorSaturationHighlights=False,bOverride_ColorContrastHighlights=False,bOverride_ColorGammaHighlights=False,bOverride_ColorGainHighlights=False,bOverride_ColorOffsetHighlights=False,bOverride_ColorCorrectionShadowsMax=False,bOverride_ColorCorrectionHighlightsMin=False,bOverride_FilmWhitePoint=False,bOverride_FilmSaturation=False,bOverride_FilmChannelMixerRed=False,bOverride_FilmChannelMixerGreen=False,bOverride_FilmChannelMixerBlue=False,bOverride_FilmContrast=False,bOverride_FilmDynamicRange=False,bOverride_FilmHealAmount=False,bOverride_FilmToeAmount=False,bOverride_FilmShadowTint=False,bOverride_FilmShadowTintBlend=False,bOverride_FilmShadowTintAmount=False,bOverride_FilmSlope=True,bOverride_FilmToe=True,bOverride_FilmShoulder=True,bOverride_FilmBlackClip=True,bOverride_FilmWhiteClip=True,bOverride_SceneColorTint=False,bOverride_SceneFringeIntensity=False,bOverride_AmbientCubemapTint=False,bOverride_AmbientCubemapIntensity=False,bOverride_BloomIntensity=True,bOverride_BloomThreshold=False,bOverride_Bloom1Tint=False,bOverride_Bloom1Size=False,bOverride_Bloom2Size=False,bOverride_Bloom2Tint=False,bOverride_Bloom3Tint=False,bOverride_Bloom3Size=False,bOverride_Bloom4Tint=False,bOverride_Bloom4Size=False,bOverride_Bloom5Tint=False,bOverride_Bloom5Size=False,bOverride_Bloom6Tint=False,bOverride_Bloom6Size=False,bOverride_BloomSizeScale=False,bOverride_BloomDirtMaskIntensity=False,bOverride_BloomDirtMaskTint=False,bOverride_BloomDirtMask=False,bOverride_AutoExposureMethod=True,bOverride_AutoExposureLowPercent=False,bOverride_AutoExposureHighPercent=False,bOverride_AutoExposureMinBrightness=True,bOverride_AutoExposureMaxBrightness=True,bOverride_AutoExposureSpeedUp=False,bOverride_AutoExposureSpeedDown=False,bOverride_AutoExposureBias=True,bOverride_HistogramLogMin=True,bOverride_HistogramLogMax=True,bOverride_LensFlareIntensity=False,bOverride_LensFlareTint=False,bOverride_LensFlareTints=False,bOverride_LensFlareBokehSize=False,bOverride_LensFlareBokehShape=False,bOverride_LensFlareThreshold=False,bOverride_VignetteIntensity=True,bOverride_GrainIntensity=False,bOverride_GrainJitter=False,bOverride_AmbientOcclusionIntensity=True,bOverride_AmbientOcclusionStaticFraction=True,bOverride_AmbientOcclusionRadius=True,bOverride_AmbientOcclusionFadeDistance=False,bOverride_AmbientOcclusionFadeRadius=False,bOverride_AmbientOcclusionDistance=False,bOverride_AmbientOcclusionRadiusInWS=False,bOverride_AmbientOcclusionPower=True,bOverride_AmbientOcclusionBias=True,bOverride_AmbientOcclusionQuality=True,bOverride_AmbientOcclusionMipBlend=True,bOverride_AmbientOcclusionMipScale=True,bOverride_AmbientOcclusionMipThreshold=True,bOverride_LPVIntensity=False,bOverride_LPVDirectionalOcclusionIntensity=False,bOverride_LPVDirectionalOcclusionRadius=False,bOverride_LPVDiffuseOcclusionExponent=False,bOverride_LPVSpecularOcclusionExponent=False,bOverride_LPVDiffuseOcclusionIntensity=False,bOverride_LPVSpecularOcclusionIntensity=False,bOverride_LPVSize=False,bOverride_LPVSecondaryOcclusionIntensity=False,bOverride_LPVSecondaryBounceIntensity=False,bOverride_LPVGeometryVolumeBias=False,bOverride_LPVVplInjectionBias=False,bOverride_LPVEmissiveInjectionIntensity=False,bOverride_IndirectLightingColor=False,bOverride_IndirectLightingIntensity=False,bOverride_ColorGradingIntensity=True,bOverride_ColorGradingLUT=True,bOverride_DepthOfFieldFocalDistance=False,bOverride_DepthOfFieldFstop=False,bOverride_DepthOfFieldSensorWidth=False,bOverride_DepthOfFieldDepthBlurRadius=False,bOverride_DepthOfFieldDepthBlurAmount=False,bOverride_DepthOfFieldFocalRegion=False,bOverride_DepthOfFieldNearTransitionRegion=False,bOverride_DepthOfFieldFarTransitionRegion=False,bOverride_DepthOfFieldScale=True,bOverride_DepthOfFieldMaxBokehSize=False,bOverride_DepthOfFieldNearBlurSize=False,bOverride_DepthOfFieldFarBlurSize=False,bOverride_DepthOfFieldMethod=True,bOverride_MobileHQGaussian=False,bOverride_DepthOfFieldBokehShape=False,bOverride_DepthOfFieldOcclusion=False,bOverride_DepthOfFieldColorThreshold=False,bOverride_DepthOfFieldSizeThreshold=False,bOverride_DepthOfFieldSkyFocusDistance=False,bOverride_DepthOfFieldVignetteSize=False,bOverride_MotionBlurAmount=False,bOverride_MotionBlurMax=False,bOverride_MotionBlurPerObjectSize=False,bOverride_ScreenPercentage=False,bOverride_ScreenSpaceReflectionIntensity=True,bOverride_ScreenSpaceReflectionQuality=True,bOverride_ScreenSpaceReflectionMaxRoughness=True,bOverride_ScreenSpaceReflectionRoughnessScale=False,WhiteTemp=6700.000000,WhiteTint=0.000000,ColorSaturation=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorContrast=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGamma=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGain=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorOffset=(X=0.005000,Y=0.005000,Z=0.005000,W=0.000000),ColorSaturationShadows=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorContrastShadows=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGammaShadows=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGainShadows=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorOffsetShadows=(X=0.000000,Y=0.000000,Z=0.000000,W=0.000000),ColorCorrectionShadowsMax=0.090000,ColorSaturationMidtones=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorContrastMidtones=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGammaMidtones=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGainMidtones=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorOffsetMidtones=(X=0.000000,Y=0.000000,Z=0.000000,W=0.000000),ColorSaturationHighlights=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorContrastHighlights=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGammaHighlights=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGainHighlights=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorOffsetHighlights=(X=0.000000,Y=0.000000,Z=0.000000,W=0.000000),ColorCorrectionHighlightsMin=0.500000,FilmWhitePoint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),FilmShadowTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),FilmShadowTintBlend=0.500000,FilmShadowTintAmount=0.000000,FilmSaturation=1.000000,FilmChannelMixerRed=(R=1.000000,G=0.000000,B=0.000000,A=1.000000),FilmChannelMixerGreen=(R=0.000000,G=1.000000,B=0.000000,A=1.000000),FilmChannelMixerBlue=(R=0.000000,G=0.000000,B=1.000000,A=1.000000),FilmContrast=0.030000,FilmToeAmount=1.000000,FilmHealAmount=1.000000,FilmDynamicRange=4.000000,FilmSlope=0.880000,FilmToe=0.550000,FilmShoulder=0.260000,FilmBlackClip=0.000000,FilmWhiteClip=0.040000,SceneColorTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),SceneFringeIntensity=0.000000,BloomIntensity=0.675000,BloomThreshold=-1.000000,BloomSizeScale=4.000000,Bloom1Size=0.300000,Bloom2Size=1.000000,Bloom3Size=2.000000,Bloom4Size=10.000000,Bloom5Size=30.000000,Bloom6Size=64.000000,Bloom1Tint=(R=0.346500,G=0.346500,B=0.346500,A=1.000000),Bloom2Tint=(R=0.138000,G=0.138000,B=0.138000,A=1.000000),Bloom3Tint=(R=0.117600,G=0.117600,B=0.117600,A=1.000000),Bloom4Tint=(R=0.066000,G=0.066000,B=0.066000,A=1.000000),Bloom5Tint=(R=0.066000,G=0.066000,B=0.066000,A=1.000000),Bloom6Tint=(R=0.061000,G=0.061000,B=0.061000,A=1.000000),BloomDirtMaskIntensity=0.000000,BloomDirtMaskTint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),BloomDirtMask=None,AmbientCubemapTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),AmbientCubemapIntensity=1.000000,AmbientCubemap=None,AutoExposureMethod=AEM_Histogram,AutoExposureLowPercent=80.000000,AutoExposureHighPercent=98.300003,AutoExposureMinBrightness=1.000000,AutoExposureMaxBrightness=1.000000,AutoExposureSpeedUp=3.000000,AutoExposureSpeedDown=1.000000,AutoExposureBias=0.330000,HistogramLogMin=-8.000000,HistogramLogMax=4.000000,LensFlareIntensity=1.000000,LensFlareTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),LensFlareBokehSize=3.000000,LensFlareThreshold=8.000000,LensFlareBokehShape=None,LensFlareTints[0]=(R=1.000000,G=0.800000,B=0.400000,A=0.600000),LensFlareTints[1]=(R=1.000000,G=1.000000,B=0.600000,A=0.530000),LensFlareTints[2]=(R=0.800000,G=0.800000,B=1.000000,A=0.460000),LensFlareTints[3]=(R=0.500000,G=1.000000,B=0.400000,A=0.390000),LensFlareTints[4]=(R=0.500000,G=0.800000,B=1.000000,A=0.310000),LensFlareTints[5]=(R=0.900000,G=1.000000,B=0.800000,A=0.270000),LensFlareTints[6]=(R=1.000000,G=0.800000,B=0.400000,A=0.220000),LensFlareTints[7]=(R=0.900000,G=0.700000,B=0.700000,A=0.150000),VignetteIntensity=0.161468,GrainJitter=0.000000,GrainIntensity=0.000000,AmbientOcclusionIntensity=1.000000,AmbientOcclusionStaticFraction=1.000000,AmbientOcclusionRadius=73.477997,AmbientOcclusionRadiusInWS=False,AmbientOcclusionFadeDistance=8000.000000,AmbientOcclusionFadeRadius=5000.000000,AmbientOcclusionDistance=80.000000,AmbientOcclusionPower=1.200000,AmbientOcclusionBias=3.000000,AmbientOcclusionQuality=100.000000,AmbientOcclusionMipBlend=0.600000,AmbientOcclusionMipScale=1.700000,AmbientOcclusionMipThreshold=0.010000,IndirectLightingColor=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),IndirectLightingIntensity=1.000000,ColorGradingIntensity=0.000000,ColorGradingLUT=Texture2D'/Engine/EditorResources/RGBTable16x1_AssetViewer.RGBTable16x1_AssetViewer',DepthOfFieldMethod=DOFM_BokehDOF,bMobileHQGaussian=False,DepthOfFieldFstop=4.000000,DepthOfFieldSensorWidth=24.576000,DepthOfFieldFocalDistance=1000.000000,DepthOfFieldDepthBlurAmount=1.000000,DepthOfFieldDepthBlurRadius=0.000000,DepthOfFieldFocalRegion=0.000000,DepthOfFieldNearTransitionRegion=300.000000,DepthOfFieldFarTransitionRegion=500.000000,DepthOfFieldScale=0.000000,DepthOfFieldMaxBokehSize=15.000000,DepthOfFieldNearBlurSize=15.000000,DepthOfFieldFarBlurSize=15.000000,DepthOfFieldBokehShape=None,DepthOfFieldOcclusion=0.400000,DepthOfFieldColorThreshold=1.000000,DepthOfFieldSizeThreshold=0.080000,DepthOfFieldSkyFocusDistance=0.000000,DepthOfFieldVignetteSize=200.000000,MotionBlurAmount=0.500000,MotionBlurMax=5.000000,MotionBlurPerObjectSize=0.500000,LPVIntensity=1.000000,LPVVplInjectionBias=0.640000,LPVSize=5312.000000,LPVSecondaryOcclusionIntensity=0.000000,LPVSecondaryBounceIntensity=0.000000,LPVGeometryVolumeBias=0.384000,LPVEmissiveInjectionIntensity=1.000000,LPVDirectionalOcclusionIntensity=0.000000,LPVDirectionalOcclusionRadius=8.000000,LPVDiffuseOcclusionExponent=1.000000,LPVSpecularOcclusionExponent=7.000000,LPVDiffuseOcclusionIntensity=1.000000,LPVSpecularOcclusionIntensity=1.000000,ScreenSpaceReflectionIntensity=100.000000,ScreenSpaceReflectionQuality=100.000000,ScreenSpaceReflectionMaxRoughness=1.000000,ScreenPercentage=100.000000,WeightedBlendables=(Array=),Blendables=),bPostProcessingEnabled=True,LightingRigRotation=109.389069,RotationSpeed=2.000000,DirectionalLightRotation=(Pitch=-39.999985,Yaw=-67.500015,Roll=0.000000))\n-Profiles=(ProfileName=\"Default\",DirectionalLightIntensity=2.620000,DirectionalLightColor=(R=0.990000,G=0.839850,B=0.732600,A=1.000000),SkyLightIntensity=0.880000,bRotateLightingRig=False,bShowEnvironment=True,bShowFloor=True,EnvironmentCubeMapPath=\"/Engine/EditorMaterials/AssetViewer/EpicQuadPanorama_CC+EV1.EpicQuadPanorama_CC+EV1\",PostProcessingSettings=(bOverride_WhiteTemp=True,bOverride_WhiteTint=False,bOverride_ColorSaturation=True,bOverride_ColorContrast=True,bOverride_ColorGamma=True,bOverride_ColorGain=True,bOverride_ColorOffset=True,bOverride_ColorSaturationShadows=False,bOverride_ColorContrastShadows=False,bOverride_ColorGammaShadows=False,bOverride_ColorGainShadows=False,bOverride_ColorOffsetShadows=False,bOverride_ColorSaturationMidtones=False,bOverride_ColorContrastMidtones=False,bOverride_ColorGammaMidtones=False,bOverride_ColorGainMidtones=False,bOverride_ColorOffsetMidtones=False,bOverride_ColorSaturationHighlights=False,bOverride_ColorContrastHighlights=False,bOverride_ColorGammaHighlights=False,bOverride_ColorGainHighlights=False,bOverride_ColorOffsetHighlights=False,bOverride_ColorCorrectionShadowsMax=False,bOverride_ColorCorrectionHighlightsMin=False,bOverride_FilmWhitePoint=False,bOverride_FilmSaturation=False,bOverride_FilmChannelMixerRed=False,bOverride_FilmChannelMixerGreen=False,bOverride_FilmChannelMixerBlue=False,bOverride_FilmContrast=False,bOverride_FilmDynamicRange=False,bOverride_FilmHealAmount=False,bOverride_FilmToeAmount=False,bOverride_FilmShadowTint=False,bOverride_FilmShadowTintBlend=False,bOverride_FilmShadowTintAmount=False,bOverride_FilmSlope=True,bOverride_FilmToe=True,bOverride_FilmShoulder=True,bOverride_FilmBlackClip=True,bOverride_FilmWhiteClip=True,bOverride_SceneColorTint=False,bOverride_SceneFringeIntensity=False,bOverride_AmbientCubemapTint=False,bOverride_AmbientCubemapIntensity=False,bOverride_BloomIntensity=True,bOverride_BloomThreshold=False,bOverride_Bloom1Tint=False,bOverride_Bloom1Size=False,bOverride_Bloom2Size=False,bOverride_Bloom2Tint=False,bOverride_Bloom3Tint=False,bOverride_Bloom3Size=False,bOverride_Bloom4Tint=False,bOverride_Bloom4Size=False,bOverride_Bloom5Tint=False,bOverride_Bloom5Size=False,bOverride_Bloom6Tint=False,bOverride_Bloom6Size=False,bOverride_BloomSizeScale=False,bOverride_BloomDirtMaskIntensity=False,bOverride_BloomDirtMaskTint=False,bOverride_BloomDirtMask=False,bOverride_AutoExposureMethod=True,bOverride_AutoExposureLowPercent=False,bOverride_AutoExposureHighPercent=False,bOverride_AutoExposureMinBrightness=True,bOverride_AutoExposureMaxBrightness=True,bOverride_AutoExposureSpeedUp=False,bOverride_AutoExposureSpeedDown=False,bOverride_AutoExposureBias=True,bOverride_HistogramLogMin=True,bOverride_HistogramLogMax=True,bOverride_LensFlareIntensity=False,bOverride_LensFlareTint=False,bOverride_LensFlareTints=False,bOverride_LensFlareBokehSize=False,bOverride_LensFlareBokehShape=False,bOverride_LensFlareThreshold=False,bOverride_VignetteIntensity=True,bOverride_GrainIntensity=False,bOverride_GrainJitter=False,bOverride_AmbientOcclusionIntensity=True,bOverride_AmbientOcclusionStaticFraction=True,bOverride_AmbientOcclusionRadius=True,bOverride_AmbientOcclusionFadeDistance=False,bOverride_AmbientOcclusionFadeRadius=False,bOverride_AmbientOcclusionDistance=False,bOverride_AmbientOcclusionRadiusInWS=False,bOverride_AmbientOcclusionPower=True,bOverride_AmbientOcclusionBias=True,bOverride_AmbientOcclusionQuality=True,bOverride_AmbientOcclusionMipBlend=True,bOverride_AmbientOcclusionMipScale=True,bOverride_AmbientOcclusionMipThreshold=True,bOverride_LPVIntensity=False,bOverride_LPVDirectionalOcclusionIntensity=False,bOverride_LPVDirectionalOcclusionRadius=False,bOverride_LPVDiffuseOcclusionExponent=False,bOverride_LPVSpecularOcclusionExponent=False,bOverride_LPVDiffuseOcclusionIntensity=False,bOverride_LPVSpecularOcclusionIntensity=False,bOverride_LPVSize=False,bOverride_LPVSecondaryOcclusionIntensity=False,bOverride_LPVSecondaryBounceIntensity=False,bOverride_LPVGeometryVolumeBias=False,bOverride_LPVVplInjectionBias=False,bOverride_LPVEmissiveInjectionIntensity=False,bOverride_IndirectLightingColor=False,bOverride_IndirectLightingIntensity=False,bOverride_ColorGradingIntensity=True,bOverride_ColorGradingLUT=True,bOverride_DepthOfFieldFocalDistance=False,bOverride_DepthOfFieldFstop=False,bOverride_DepthOfFieldSensorWidth=False,bOverride_DepthOfFieldDepthBlurRadius=False,bOverride_DepthOfFieldDepthBlurAmount=False,bOverride_DepthOfFieldFocalRegion=False,bOverride_DepthOfFieldNearTransitionRegion=False,bOverride_DepthOfFieldFarTransitionRegion=False,bOverride_DepthOfFieldScale=True,bOverride_DepthOfFieldMaxBokehSize=False,bOverride_DepthOfFieldNearBlurSize=False,bOverride_DepthOfFieldFarBlurSize=False,bOverride_DepthOfFieldMethod=True,bOverride_MobileHQGaussian=False,bOverride_DepthOfFieldBokehShape=False,bOverride_DepthOfFieldOcclusion=False,bOverride_DepthOfFieldColorThreshold=False,bOverride_DepthOfFieldSizeThreshold=False,bOverride_DepthOfFieldSkyFocusDistance=False,bOverride_DepthOfFieldVignetteSize=False,bOverride_MotionBlurAmount=False,bOverride_MotionBlurMax=False,bOverride_MotionBlurPerObjectSize=False,bOverride_ScreenPercentage=False,bOverride_ScreenSpaceReflectionIntensity=True,bOverride_ScreenSpaceReflectionQuality=True,bOverride_ScreenSpaceReflectionMaxRoughness=True,bOverride_ScreenSpaceReflectionRoughnessScale=False,WhiteTemp=6700.000000,WhiteTint=0.000000,ColorSaturation=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorContrast=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGamma=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGain=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorOffset=(X=0.005000,Y=0.005000,Z=0.005000,W=0.000000),ColorSaturationShadows=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorContrastShadows=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGammaShadows=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGainShadows=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorOffsetShadows=(X=0.000000,Y=0.000000,Z=0.000000,W=0.000000),ColorCorrectionShadowsMax=0.090000,ColorSaturationMidtones=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorContrastMidtones=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGammaMidtones=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGainMidtones=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorOffsetMidtones=(X=0.000000,Y=0.000000,Z=0.000000,W=0.000000),ColorSaturationHighlights=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorContrastHighlights=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGammaHighlights=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGainHighlights=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorOffsetHighlights=(X=0.000000,Y=0.000000,Z=0.000000,W=0.000000),ColorCorrectionHighlightsMin=0.500000,FilmWhitePoint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),FilmShadowTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),FilmShadowTintBlend=0.500000,FilmShadowTintAmount=0.000000,FilmSaturation=1.000000,FilmChannelMixerRed=(R=1.000000,G=0.000000,B=0.000000,A=1.000000),FilmChannelMixerGreen=(R=0.000000,G=1.000000,B=0.000000,A=1.000000),FilmChannelMixerBlue=(R=0.000000,G=0.000000,B=1.000000,A=1.000000),FilmContrast=0.030000,FilmToeAmount=1.000000,FilmHealAmount=1.000000,FilmDynamicRange=4.000000,FilmSlope=0.880000,FilmToe=0.550000,FilmShoulder=0.260000,FilmBlackClip=0.000000,FilmWhiteClip=0.040000,SceneColorTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),SceneFringeIntensity=0.000000,BloomIntensity=0.675000,BloomThreshold=-1.000000,BloomSizeScale=4.000000,Bloom1Size=0.300000,Bloom2Size=1.000000,Bloom3Size=2.000000,Bloom4Size=10.000000,Bloom5Size=30.000000,Bloom6Size=64.000000,Bloom1Tint=(R=0.346500,G=0.346500,B=0.346500,A=1.000000),Bloom2Tint=(R=0.138000,G=0.138000,B=0.138000,A=1.000000),Bloom3Tint=(R=0.117600,G=0.117600,B=0.117600,A=1.000000),Bloom4Tint=(R=0.066000,G=0.066000,B=0.066000,A=1.000000),Bloom5Tint=(R=0.066000,G=0.066000,B=0.066000,A=1.000000),Bloom6Tint=(R=0.061000,G=0.061000,B=0.061000,A=1.000000),BloomDirtMaskIntensity=0.000000,BloomDirtMaskTint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),BloomDirtMask=None,AmbientCubemapTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),AmbientCubemapIntensity=1.000000,AmbientCubemap=None,AutoExposureMethod=AEM_Histogram,AutoExposureLowPercent=80.000000,AutoExposureHighPercent=98.300003,AutoExposureMinBrightness=1.000000,AutoExposureMaxBrightness=1.000000,AutoExposureSpeedUp=3.000000,AutoExposureSpeedDown=1.000000,AutoExposureBias=0.330000,HistogramLogMin=-8.000000,HistogramLogMax=4.000000,LensFlareIntensity=1.000000,LensFlareTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),LensFlareBokehSize=3.000000,LensFlareThreshold=8.000000,LensFlareBokehShape=None,LensFlareTints[0]=(R=1.000000,G=0.800000,B=0.400000,A=0.600000),LensFlareTints[1]=(R=1.000000,G=1.000000,B=0.600000,A=0.530000),LensFlareTints[2]=(R=0.800000,G=0.800000,B=1.000000,A=0.460000),LensFlareTints[3]=(R=0.500000,G=1.000000,B=0.400000,A=0.390000),LensFlareTints[4]=(R=0.500000,G=0.800000,B=1.000000,A=0.310000),LensFlareTints[5]=(R=0.900000,G=1.000000,B=0.800000,A=0.270000),LensFlareTints[6]=(R=1.000000,G=0.800000,B=0.400000,A=0.220000),LensFlareTints[7]=(R=0.900000,G=0.700000,B=0.700000,A=0.150000),VignetteIntensity=0.161468,GrainJitter=0.000000,GrainIntensity=0.000000,AmbientOcclusionIntensity=1.000000,AmbientOcclusionStaticFraction=1.000000,AmbientOcclusionRadius=73.477997,AmbientOcclusionRadiusInWS=False,AmbientOcclusionFadeDistance=8000.000000,AmbientOcclusionFadeRadius=5000.000000,AmbientOcclusionDistance=80.000000,AmbientOcclusionPower=1.200000,AmbientOcclusionBias=3.000000,AmbientOcclusionQuality=100.000000,AmbientOcclusionMipBlend=0.600000,AmbientOcclusionMipScale=1.700000,AmbientOcclusionMipThreshold=0.010000,IndirectLightingColor=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),IndirectLightingIntensity=1.000000,ColorGradingIntensity=0.000000,ColorGradingLUT=Texture2D'/Engine/EditorResources/RGBTable16x1_AssetViewer.RGBTable16x1_AssetViewer',DepthOfFieldMethod=DOFM_BokehDOF,bMobileHQGaussian=False,DepthOfFieldFstop=4.000000,DepthOfFieldSensorWidth=24.576000,DepthOfFieldFocalDistance=1000.000000,DepthOfFieldDepthBlurAmount=1.000000,DepthOfFieldDepthBlurRadius=0.000000,DepthOfFieldFocalRegion=0.000000,DepthOfFieldNearTransitionRegion=300.000000,DepthOfFieldFarTransitionRegion=500.000000,DepthOfFieldScale=0.000000,DepthOfFieldMaxBokehSize=15.000000,DepthOfFieldNearBlurSize=15.000000,DepthOfFieldFarBlurSize=15.000000,DepthOfFieldBokehShape=None,DepthOfFieldOcclusion=0.400000,DepthOfFieldColorThreshold=1.000000,DepthOfFieldSizeThreshold=0.080000,DepthOfFieldSkyFocusDistance=0.000000,DepthOfFieldVignetteSize=200.000000,MotionBlurAmount=0.500000,MotionBlurMax=5.000000,MotionBlurPerObjectSize=0.500000,LPVIntensity=1.000000,LPVVplInjectionBias=0.640000,LPVSize=5312.000000,LPVSecondaryOcclusionIntensity=0.000000,LPVSecondaryBounceIntensity=0.000000,LPVGeometryVolumeBias=0.384000,LPVEmissiveInjectionIntensity=1.000000,LPVDirectionalOcclusionIntensity=0.000000,LPVDirectionalOcclusionRadius=8.000000,LPVDiffuseOcclusionExponent=1.000000,LPVSpecularOcclusionExponent=7.000000,LPVDiffuseOcclusionIntensity=1.000000,LPVSpecularOcclusionIntensity=1.000000,ScreenSpaceReflectionIntensity=100.000000,ScreenSpaceReflectionQuality=100.000000,ScreenSpaceReflectionMaxRoughness=1.000000,ScreenPercentage=100.000000,WeightedBlendables=(Array=),Blendables=),bPostProcessingEnabled=True,LightingRigRotation=109.389069,RotationSpeed=2.000000,DirectionalLightRotation=(Pitch=-39.999985,Yaw=-67.500015,Roll=0.000000))\n-Profiles=(ProfileName=\"Default\",DirectionalLightIntensity=2.620000,DirectionalLightColor=(R=0.990000,G=0.839850,B=0.732600,A=1.000000),SkyLightIntensity=0.880000,bRotateLightingRig=False,bShowEnvironment=True,bShowFloor=True,EnvironmentCubeMapPath=\"/Engine/EditorMaterials/AssetViewer/EpicQuadPanorama_CC+EV1.EpicQuadPanorama_CC+EV1\",PostProcessingSettings=(bOverride_WhiteTemp=True,bOverride_WhiteTint=False,bOverride_ColorSaturation=True,bOverride_ColorContrast=True,bOverride_ColorGamma=True,bOverride_ColorGain=True,bOverride_ColorOffset=True,bOverride_ColorSaturationShadows=False,bOverride_ColorContrastShadows=False,bOverride_ColorGammaShadows=False,bOverride_ColorGainShadows=False,bOverride_ColorOffsetShadows=False,bOverride_ColorSaturationMidtones=False,bOverride_ColorContrastMidtones=False,bOverride_ColorGammaMidtones=False,bOverride_ColorGainMidtones=False,bOverride_ColorOffsetMidtones=False,bOverride_ColorSaturationHighlights=False,bOverride_ColorContrastHighlights=False,bOverride_ColorGammaHighlights=False,bOverride_ColorGainHighlights=False,bOverride_ColorOffsetHighlights=False,bOverride_ColorCorrectionShadowsMax=False,bOverride_ColorCorrectionHighlightsMin=False,bOverride_FilmWhitePoint=False,bOverride_FilmSaturation=False,bOverride_FilmChannelMixerRed=False,bOverride_FilmChannelMixerGreen=False,bOverride_FilmChannelMixerBlue=False,bOverride_FilmContrast=False,bOverride_FilmDynamicRange=False,bOverride_FilmHealAmount=False,bOverride_FilmToeAmount=False,bOverride_FilmShadowTint=False,bOverride_FilmShadowTintBlend=False,bOverride_FilmShadowTintAmount=False,bOverride_FilmSlope=True,bOverride_FilmToe=True,bOverride_FilmShoulder=True,bOverride_FilmBlackClip=True,bOverride_FilmWhiteClip=True,bOverride_SceneColorTint=False,bOverride_SceneFringeIntensity=False,bOverride_AmbientCubemapTint=False,bOverride_AmbientCubemapIntensity=False,bOverride_BloomIntensity=True,bOverride_BloomThreshold=False,bOverride_Bloom1Tint=False,bOverride_Bloom1Size=False,bOverride_Bloom2Size=False,bOverride_Bloom2Tint=False,bOverride_Bloom3Tint=False,bOverride_Bloom3Size=False,bOverride_Bloom4Tint=False,bOverride_Bloom4Size=False,bOverride_Bloom5Tint=False,bOverride_Bloom5Size=False,bOverride_Bloom6Tint=False,bOverride_Bloom6Size=False,bOverride_BloomSizeScale=False,bOverride_BloomDirtMaskIntensity=False,bOverride_BloomDirtMaskTint=False,bOverride_BloomDirtMask=False,bOverride_AutoExposureMethod=True,bOverride_AutoExposureLowPercent=False,bOverride_AutoExposureHighPercent=False,bOverride_AutoExposureMinBrightness=True,bOverride_AutoExposureMaxBrightness=True,bOverride_AutoExposureSpeedUp=False,bOverride_AutoExposureSpeedDown=False,bOverride_AutoExposureBias=True,bOverride_HistogramLogMin=True,bOverride_HistogramLogMax=True,bOverride_LensFlareIntensity=False,bOverride_LensFlareTint=False,bOverride_LensFlareTints=False,bOverride_LensFlareBokehSize=False,bOverride_LensFlareBokehShape=False,bOverride_LensFlareThreshold=False,bOverride_VignetteIntensity=True,bOverride_GrainIntensity=False,bOverride_GrainJitter=False,bOverride_AmbientOcclusionIntensity=True,bOverride_AmbientOcclusionStaticFraction=True,bOverride_AmbientOcclusionRadius=True,bOverride_AmbientOcclusionFadeDistance=False,bOverride_AmbientOcclusionFadeRadius=False,bOverride_AmbientOcclusionDistance=False,bOverride_AmbientOcclusionRadiusInWS=False,bOverride_AmbientOcclusionPower=True,bOverride_AmbientOcclusionBias=True,bOverride_AmbientOcclusionQuality=True,bOverride_AmbientOcclusionMipBlend=True,bOverride_AmbientOcclusionMipScale=True,bOverride_AmbientOcclusionMipThreshold=True,bOverride_LPVIntensity=False,bOverride_LPVDirectionalOcclusionIntensity=False,bOverride_LPVDirectionalOcclusionRadius=False,bOverride_LPVDiffuseOcclusionExponent=False,bOverride_LPVSpecularOcclusionExponent=False,bOverride_LPVDiffuseOcclusionIntensity=False,bOverride_LPVSpecularOcclusionIntensity=False,bOverride_LPVSize=False,bOverride_LPVSecondaryOcclusionIntensity=False,bOverride_LPVSecondaryBounceIntensity=False,bOverride_LPVGeometryVolumeBias=False,bOverride_LPVVplInjectionBias=False,bOverride_LPVEmissiveInjectionIntensity=False,bOverride_IndirectLightingColor=False,bOverride_IndirectLightingIntensity=False,bOverride_ColorGradingIntensity=True,bOverride_ColorGradingLUT=True,bOverride_DepthOfFieldFocalDistance=False,bOverride_DepthOfFieldFstop=False,bOverride_DepthOfFieldSensorWidth=False,bOverride_DepthOfFieldDepthBlurRadius=False,bOverride_DepthOfFieldDepthBlurAmount=False,bOverride_DepthOfFieldFocalRegion=False,bOverride_DepthOfFieldNearTransitionRegion=False,bOverride_DepthOfFieldFarTransitionRegion=False,bOverride_DepthOfFieldScale=True,bOverride_DepthOfFieldMaxBokehSize=False,bOverride_DepthOfFieldNearBlurSize=False,bOverride_DepthOfFieldFarBlurSize=False,bOverride_DepthOfFieldMethod=True,bOverride_MobileHQGaussian=False,bOverride_DepthOfFieldBokehShape=False,bOverride_DepthOfFieldOcclusion=False,bOverride_DepthOfFieldColorThreshold=False,bOverride_DepthOfFieldSizeThreshold=False,bOverride_DepthOfFieldSkyFocusDistance=False,bOverride_DepthOfFieldVignetteSize=False,bOverride_MotionBlurAmount=False,bOverride_MotionBlurMax=False,bOverride_MotionBlurPerObjectSize=False,bOverride_ScreenPercentage=False,bOverride_ScreenSpaceReflectionIntensity=True,bOverride_ScreenSpaceReflectionQuality=True,bOverride_ScreenSpaceReflectionMaxRoughness=True,bOverride_ScreenSpaceReflectionRoughnessScale=False,WhiteTemp=6700.000000,WhiteTint=0.000000,ColorSaturation=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorContrast=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGamma=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGain=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorOffset=(X=0.005000,Y=0.005000,Z=0.005000,W=0.000000),ColorSaturationShadows=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorContrastShadows=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGammaShadows=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGainShadows=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorOffsetShadows=(X=0.000000,Y=0.000000,Z=0.000000,W=0.000000),ColorCorrectionShadowsMax=0.090000,ColorSaturationMidtones=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorContrastMidtones=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGammaMidtones=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGainMidtones=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorOffsetMidtones=(X=0.000000,Y=0.000000,Z=0.000000,W=0.000000),ColorSaturationHighlights=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorContrastHighlights=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGammaHighlights=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGainHighlights=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorOffsetHighlights=(X=0.000000,Y=0.000000,Z=0.000000,W=0.000000),ColorCorrectionHighlightsMin=0.500000,FilmWhitePoint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),FilmShadowTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),FilmShadowTintBlend=0.500000,FilmShadowTintAmount=0.000000,FilmSaturation=1.000000,FilmChannelMixerRed=(R=1.000000,G=0.000000,B=0.000000,A=1.000000),FilmChannelMixerGreen=(R=0.000000,G=1.000000,B=0.000000,A=1.000000),FilmChannelMixerBlue=(R=0.000000,G=0.000000,B=1.000000,A=1.000000),FilmContrast=0.030000,FilmToeAmount=1.000000,FilmHealAmount=1.000000,FilmDynamicRange=4.000000,FilmSlope=0.880000,FilmToe=0.550000,FilmShoulder=0.260000,FilmBlackClip=0.000000,FilmWhiteClip=0.040000,SceneColorTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),SceneFringeIntensity=0.000000,BloomIntensity=0.675000,BloomThreshold=-1.000000,BloomSizeScale=4.000000,Bloom1Size=0.300000,Bloom2Size=1.000000,Bloom3Size=2.000000,Bloom4Size=10.000000,Bloom5Size=30.000000,Bloom6Size=64.000000,Bloom1Tint=(R=0.346500,G=0.346500,B=0.346500,A=1.000000),Bloom2Tint=(R=0.138000,G=0.138000,B=0.138000,A=1.000000),Bloom3Tint=(R=0.117600,G=0.117600,B=0.117600,A=1.000000),Bloom4Tint=(R=0.066000,G=0.066000,B=0.066000,A=1.000000),Bloom5Tint=(R=0.066000,G=0.066000,B=0.066000,A=1.000000),Bloom6Tint=(R=0.061000,G=0.061000,B=0.061000,A=1.000000),BloomDirtMaskIntensity=0.000000,BloomDirtMaskTint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),BloomDirtMask=None,AmbientCubemapTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),AmbientCubemapIntensity=1.000000,AmbientCubemap=None,AutoExposureMethod=AEM_Histogram,AutoExposureLowPercent=80.000000,AutoExposureHighPercent=98.300003,AutoExposureMinBrightness=1.000000,AutoExposureMaxBrightness=1.000000,AutoExposureSpeedUp=3.000000,AutoExposureSpeedDown=1.000000,AutoExposureBias=0.330000,HistogramLogMin=-8.000000,HistogramLogMax=4.000000,LensFlareIntensity=1.000000,LensFlareTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),LensFlareBokehSize=3.000000,LensFlareThreshold=8.000000,LensFlareBokehShape=None,LensFlareTints[0]=(R=1.000000,G=0.800000,B=0.400000,A=0.600000),LensFlareTints[1]=(R=1.000000,G=1.000000,B=0.600000,A=0.530000),LensFlareTints[2]=(R=0.800000,G=0.800000,B=1.000000,A=0.460000),LensFlareTints[3]=(R=0.500000,G=1.000000,B=0.400000,A=0.390000),LensFlareTints[4]=(R=0.500000,G=0.800000,B=1.000000,A=0.310000),LensFlareTints[5]=(R=0.900000,G=1.000000,B=0.800000,A=0.270000),LensFlareTints[6]=(R=1.000000,G=0.800000,B=0.400000,A=0.220000),LensFlareTints[7]=(R=0.900000,G=0.700000,B=0.700000,A=0.150000),VignetteIntensity=0.161468,GrainJitter=0.000000,GrainIntensity=0.000000,AmbientOcclusionIntensity=1.000000,AmbientOcclusionStaticFraction=1.000000,AmbientOcclusionRadius=73.477997,AmbientOcclusionRadiusInWS=False,AmbientOcclusionFadeDistance=8000.000000,AmbientOcclusionFadeRadius=5000.000000,AmbientOcclusionDistance=80.000000,AmbientOcclusionPower=1.200000,AmbientOcclusionBias=3.000000,AmbientOcclusionQuality=100.000000,AmbientOcclusionMipBlend=0.600000,AmbientOcclusionMipScale=1.700000,AmbientOcclusionMipThreshold=0.010000,IndirectLightingColor=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),IndirectLightingIntensity=1.000000,ColorGradingIntensity=0.000000,ColorGradingLUT=Texture2D'/Engine/EditorResources/RGBTable16x1_AssetViewer.RGBTable16x1_AssetViewer',DepthOfFieldMethod=DOFM_BokehDOF,bMobileHQGaussian=False,DepthOfFieldFstop=4.000000,DepthOfFieldSensorWidth=24.576000,DepthOfFieldFocalDistance=1000.000000,DepthOfFieldDepthBlurAmount=1.000000,DepthOfFieldDepthBlurRadius=0.000000,DepthOfFieldFocalRegion=0.000000,DepthOfFieldNearTransitionRegion=300.000000,DepthOfFieldFarTransitionRegion=500.000000,DepthOfFieldScale=0.000000,DepthOfFieldMaxBokehSize=15.000000,DepthOfFieldNearBlurSize=15.000000,DepthOfFieldFarBlurSize=15.000000,DepthOfFieldBokehShape=None,DepthOfFieldOcclusion=0.400000,DepthOfFieldColorThreshold=1.000000,DepthOfFieldSizeThreshold=0.080000,DepthOfFieldSkyFocusDistance=0.000000,DepthOfFieldVignetteSize=200.000000,MotionBlurAmount=0.500000,MotionBlurMax=5.000000,MotionBlurPerObjectSize=0.500000,LPVIntensity=1.000000,LPVVplInjectionBias=0.640000,LPVSize=5312.000000,LPVSecondaryOcclusionIntensity=0.000000,LPVSecondaryBounceIntensity=0.000000,LPVGeometryVolumeBias=0.384000,LPVEmissiveInjectionIntensity=1.000000,LPVDirectionalOcclusionIntensity=0.000000,LPVDirectionalOcclusionRadius=8.000000,LPVDiffuseOcclusionExponent=1.000000,LPVSpecularOcclusionExponent=7.000000,LPVDiffuseOcclusionIntensity=1.000000,LPVSpecularOcclusionIntensity=1.000000,ScreenSpaceReflectionIntensity=100.000000,ScreenSpaceReflectionQuality=100.000000,ScreenSpaceReflectionMaxRoughness=1.000000,ScreenPercentage=100.000000,WeightedBlendables=(Array=),Blendables=),bPostProcessingEnabled=True,LightingRigRotation=109.389069,RotationSpeed=2.000000,DirectionalLightRotation=(Pitch=-39.999985,Yaw=-67.500015,Roll=0.000000))\n-Profiles=(ProfileName=\"Default\",DirectionalLightIntensity=2.620000,DirectionalLightColor=(R=0.990000,G=0.839850,B=0.732600,A=1.000000),SkyLightIntensity=0.880000,bRotateLightingRig=False,bShowEnvironment=True,bShowFloor=True,EnvironmentCubeMapPath=\"/Engine/EditorMaterials/AssetViewer/EpicQuadPanorama_CC+EV1.EpicQuadPanorama_CC+EV1\",PostProcessingSettings=(bOverride_WhiteTemp=True,bOverride_WhiteTint=False,bOverride_ColorSaturation=True,bOverride_ColorContrast=True,bOverride_ColorGamma=True,bOverride_ColorGain=True,bOverride_ColorOffset=True,bOverride_ColorSaturationShadows=False,bOverride_ColorContrastShadows=False,bOverride_ColorGammaShadows=False,bOverride_ColorGainShadows=False,bOverride_ColorOffsetShadows=False,bOverride_ColorSaturationMidtones=False,bOverride_ColorContrastMidtones=False,bOverride_ColorGammaMidtones=False,bOverride_ColorGainMidtones=False,bOverride_ColorOffsetMidtones=False,bOverride_ColorSaturationHighlights=False,bOverride_ColorContrastHighlights=False,bOverride_ColorGammaHighlights=False,bOverride_ColorGainHighlights=False,bOverride_ColorOffsetHighlights=False,bOverride_ColorCorrectionShadowsMax=False,bOverride_ColorCorrectionHighlightsMin=False,bOverride_FilmWhitePoint=False,bOverride_FilmSaturation=False,bOverride_FilmChannelMixerRed=False,bOverride_FilmChannelMixerGreen=False,bOverride_FilmChannelMixerBlue=False,bOverride_FilmContrast=False,bOverride_FilmDynamicRange=False,bOverride_FilmHealAmount=False,bOverride_FilmToeAmount=False,bOverride_FilmShadowTint=False,bOverride_FilmShadowTintBlend=False,bOverride_FilmShadowTintAmount=False,bOverride_FilmSlope=True,bOverride_FilmToe=True,bOverride_FilmShoulder=True,bOverride_FilmBlackClip=True,bOverride_FilmWhiteClip=True,bOverride_SceneColorTint=False,bOverride_SceneFringeIntensity=False,bOverride_AmbientCubemapTint=False,bOverride_AmbientCubemapIntensity=False,bOverride_BloomIntensity=True,bOverride_BloomThreshold=False,bOverride_Bloom1Tint=False,bOverride_Bloom1Size=False,bOverride_Bloom2Size=False,bOverride_Bloom2Tint=False,bOverride_Bloom3Tint=False,bOverride_Bloom3Size=False,bOverride_Bloom4Tint=False,bOverride_Bloom4Size=False,bOverride_Bloom5Tint=False,bOverride_Bloom5Size=False,bOverride_Bloom6Tint=False,bOverride_Bloom6Size=False,bOverride_BloomSizeScale=False,bOverride_BloomDirtMaskIntensity=False,bOverride_BloomDirtMaskTint=False,bOverride_BloomDirtMask=False,bOverride_AutoExposureMethod=True,bOverride_AutoExposureLowPercent=False,bOverride_AutoExposureHighPercent=False,bOverride_AutoExposureMinBrightness=True,bOverride_AutoExposureMaxBrightness=True,bOverride_AutoExposureSpeedUp=False,bOverride_AutoExposureSpeedDown=False,bOverride_AutoExposureBias=True,bOverride_HistogramLogMin=True,bOverride_HistogramLogMax=True,bOverride_LensFlareIntensity=False,bOverride_LensFlareTint=False,bOverride_LensFlareTints=False,bOverride_LensFlareBokehSize=False,bOverride_LensFlareBokehShape=False,bOverride_LensFlareThreshold=False,bOverride_VignetteIntensity=True,bOverride_GrainIntensity=False,bOverride_GrainJitter=False,bOverride_AmbientOcclusionIntensity=True,bOverride_AmbientOcclusionStaticFraction=True,bOverride_AmbientOcclusionRadius=True,bOverride_AmbientOcclusionFadeDistance=False,bOverride_AmbientOcclusionFadeRadius=False,bOverride_AmbientOcclusionDistance=False,bOverride_AmbientOcclusionRadiusInWS=False,bOverride_AmbientOcclusionPower=True,bOverride_AmbientOcclusionBias=True,bOverride_AmbientOcclusionQuality=True,bOverride_AmbientOcclusionMipBlend=True,bOverride_AmbientOcclusionMipScale=True,bOverride_AmbientOcclusionMipThreshold=True,bOverride_LPVIntensity=False,bOverride_LPVDirectionalOcclusionIntensity=False,bOverride_LPVDirectionalOcclusionRadius=False,bOverride_LPVDiffuseOcclusionExponent=False,bOverride_LPVSpecularOcclusionExponent=False,bOverride_LPVDiffuseOcclusionIntensity=False,bOverride_LPVSpecularOcclusionIntensity=False,bOverride_LPVSize=False,bOverride_LPVSecondaryOcclusionIntensity=False,bOverride_LPVSecondaryBounceIntensity=False,bOverride_LPVGeometryVolumeBias=False,bOverride_LPVVplInjectionBias=False,bOverride_LPVEmissiveInjectionIntensity=False,bOverride_IndirectLightingColor=False,bOverride_IndirectLightingIntensity=False,bOverride_ColorGradingIntensity=True,bOverride_ColorGradingLUT=True,bOverride_DepthOfFieldFocalDistance=False,bOverride_DepthOfFieldFstop=False,bOverride_DepthOfFieldSensorWidth=False,bOverride_DepthOfFieldDepthBlurRadius=False,bOverride_DepthOfFieldDepthBlurAmount=False,bOverride_DepthOfFieldFocalRegion=False,bOverride_DepthOfFieldNearTransitionRegion=False,bOverride_DepthOfFieldFarTransitionRegion=False,bOverride_DepthOfFieldScale=True,bOverride_DepthOfFieldMaxBokehSize=False,bOverride_DepthOfFieldNearBlurSize=False,bOverride_DepthOfFieldFarBlurSize=False,bOverride_DepthOfFieldMethod=True,bOverride_MobileHQGaussian=False,bOverride_DepthOfFieldBokehShape=False,bOverride_DepthOfFieldOcclusion=False,bOverride_DepthOfFieldColorThreshold=False,bOverride_DepthOfFieldSizeThreshold=False,bOverride_DepthOfFieldSkyFocusDistance=False,bOverride_DepthOfFieldVignetteSize=False,bOverride_MotionBlurAmount=False,bOverride_MotionBlurMax=False,bOverride_MotionBlurPerObjectSize=False,bOverride_ScreenPercentage=False,bOverride_ScreenSpaceReflectionIntensity=True,bOverride_ScreenSpaceReflectionQuality=True,bOverride_ScreenSpaceReflectionMaxRoughness=True,bOverride_ScreenSpaceReflectionRoughnessScale=False,WhiteTemp=6700.000000,WhiteTint=0.000000,ColorSaturation=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorContrast=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGamma=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGain=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorOffset=(X=0.005000,Y=0.005000,Z=0.005000,W=0.000000),ColorSaturationShadows=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorContrastShadows=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGammaShadows=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGainShadows=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorOffsetShadows=(X=0.000000,Y=0.000000,Z=0.000000,W=0.000000),ColorCorrectionShadowsMax=0.090000,ColorSaturationMidtones=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorContrastMidtones=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGammaMidtones=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGainMidtones=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorOffsetMidtones=(X=0.000000,Y=0.000000,Z=0.000000,W=0.000000),ColorSaturationHighlights=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorContrastHighlights=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGammaHighlights=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGainHighlights=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorOffsetHighlights=(X=0.000000,Y=0.000000,Z=0.000000,W=0.000000),ColorCorrectionHighlightsMin=0.500000,FilmWhitePoint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),FilmShadowTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),FilmShadowTintBlend=0.500000,FilmShadowTintAmount=0.000000,FilmSaturation=1.000000,FilmChannelMixerRed=(R=1.000000,G=0.000000,B=0.000000,A=1.000000),FilmChannelMixerGreen=(R=0.000000,G=1.000000,B=0.000000,A=1.000000),FilmChannelMixerBlue=(R=0.000000,G=0.000000,B=1.000000,A=1.000000),FilmContrast=0.030000,FilmToeAmount=1.000000,FilmHealAmount=0.180000,FilmDynamicRange=4.000000,FilmSlope=0.880000,FilmToe=0.550000,FilmShoulder=0.260000,FilmBlackClip=0.000000,FilmWhiteClip=0.040000,SceneColorTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),SceneFringeIntensity=0.000000,BloomIntensity=1.000000,BloomThreshold=1.000000,BloomSizeScale=4.000000,Bloom1Size=1.000000,Bloom2Size=4.000000,Bloom3Size=16.000000,Bloom4Size=32.000000,Bloom5Size=64.000000,Bloom6Size=64.000000,Bloom1Tint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),Bloom2Tint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),Bloom3Tint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),Bloom4Tint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),Bloom5Tint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),Bloom6Tint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),BloomDirtMaskIntensity=1.000000,BloomDirtMaskTint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),BloomDirtMask=None,AmbientCubemapTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),AmbientCubemapIntensity=1.000000,AmbientCubemap=None,AutoExposureMethod=AEM_Histogram,AutoExposureLowPercent=80.000000,AutoExposureHighPercent=98.300003,AutoExposureMinBrightness=1.000000,AutoExposureMaxBrightness=1.000000,AutoExposureSpeedUp=3.000000,AutoExposureSpeedDown=1.000000,AutoExposureBias=0.330000,HistogramLogMin=-8.000000,HistogramLogMax=4.000000,LensFlareIntensity=1.000000,LensFlareTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),LensFlareBokehSize=3.000000,LensFlareThreshold=8.000000,LensFlareBokehShape=None,LensFlareTints[0]=(R=1.000000,G=0.800000,B=0.400000,A=0.600000),LensFlareTints[1]=(R=1.000000,G=1.000000,B=0.600000,A=0.530000),LensFlareTints[2]=(R=0.800000,G=0.800000,B=1.000000,A=0.460000),LensFlareTints[3]=(R=0.500000,G=1.000000,B=0.400000,A=0.390000),LensFlareTints[4]=(R=0.500000,G=0.800000,B=1.000000,A=0.310000),LensFlareTints[5]=(R=0.900000,G=1.000000,B=0.800000,A=0.270000),LensFlareTints[6]=(R=1.000000,G=0.800000,B=0.400000,A=0.220000),LensFlareTints[7]=(R=0.900000,G=0.700000,B=0.700000,A=0.150000),VignetteIntensity=0.161468,GrainJitter=0.000000,GrainIntensity=0.000000,AmbientOcclusionIntensity=1.000000,AmbientOcclusionStaticFraction=1.000000,AmbientOcclusionRadius=73.477997,AmbientOcclusionRadiusInWS=False,AmbientOcclusionFadeDistance=8000.000000,AmbientOcclusionFadeRadius=5000.000000,AmbientOcclusionDistance=80.000000,AmbientOcclusionPower=1.200000,AmbientOcclusionBias=3.000000,AmbientOcclusionQuality=100.000000,AmbientOcclusionMipBlend=0.600000,AmbientOcclusionMipScale=1.700000,AmbientOcclusionMipThreshold=0.010000,IndirectLightingColor=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),IndirectLightingIntensity=1.000000,ColorGradingIntensity=0.000000,ColorGradingLUT=Texture2D'/Engine/EditorResources/RGBTable16x1_AssetViewer.RGBTable16x1_AssetViewer',DepthOfFieldMethod=DOFM_BokehDOF,bMobileHQGaussian=False,DepthOfFieldFstop=4.000000,DepthOfFieldSensorWidth=24.576000,DepthOfFieldFocalDistance=1000.000000,DepthOfFieldDepthBlurAmount=1.000000,DepthOfFieldDepthBlurRadius=0.000000,DepthOfFieldFocalRegion=0.000000,DepthOfFieldNearTransitionRegion=300.000000,DepthOfFieldFarTransitionRegion=500.000000,DepthOfFieldScale=0.000000,DepthOfFieldMaxBokehSize=15.000000,DepthOfFieldNearBlurSize=15.000000,DepthOfFieldFarBlurSize=15.000000,DepthOfFieldBokehShape=None,DepthOfFieldOcclusion=0.400000,DepthOfFieldColorThreshold=1.000000,DepthOfFieldSizeThreshold=0.080000,DepthOfFieldSkyFocusDistance=0.000000,DepthOfFieldVignetteSize=200.000000,MotionBlurAmount=0.500000,MotionBlurMax=5.000000,MotionBlurPerObjectSize=0.500000,LPVIntensity=1.000000,LPVVplInjectionBias=0.640000,LPVSize=5312.000000,LPVSecondaryOcclusionIntensity=0.000000,LPVSecondaryBounceIntensity=0.000000,LPVGeometryVolumeBias=0.384000,LPVEmissiveInjectionIntensity=1.000000,LPVDirectionalOcclusionIntensity=0.000000,LPVDirectionalOcclusionRadius=8.000000,LPVDiffuseOcclusionExponent=1.000000,LPVSpecularOcclusionExponent=7.000000,LPVDiffuseOcclusionIntensity=1.000000,LPVSpecularOcclusionIntensity=1.000000,ScreenSpaceReflectionIntensity=100.000000,ScreenSpaceReflectionQuality=100.000000,ScreenSpaceReflectionMaxRoughness=1.000000,ScreenPercentage=100.000000,WeightedBlendables=(Array=),Blendables=),bPostProcessingEnabled=True,LightingRigRotation=109.389069,RotationSpeed=2.000000,DirectionalLightRotation=(Pitch=-39.999985,Yaw=-67.500015,Roll=0.000000))\n-Profiles=(ProfileName=\"Default\",DirectionalLightIntensity=2.620000,DirectionalLightColor=(R=0.990000,G=0.839850,B=0.732600,A=1.000000),SkyLightIntensity=0.880000,bRotateLightingRig=False,bShowEnvironment=True,bShowFloor=True,EnvironmentCubeMapPath=\"/Engine/EditorMaterials/AssetViewer/EpicQuadPanorama_CC+EV1.EpicQuadPanorama_CC+EV1\",PostProcessingSettings=(bOverride_WhiteTemp=True,bOverride_WhiteTint=False,bOverride_ColorSaturation=True,bOverride_ColorContrast=True,bOverride_ColorGamma=True,bOverride_ColorGain=True,bOverride_ColorOffset=True,bOverride_ColorSaturationShadows=False,bOverride_ColorContrastShadows=False,bOverride_ColorGammaShadows=False,bOverride_ColorGainShadows=False,bOverride_ColorOffsetShadows=False,bOverride_ColorSaturationMidtones=False,bOverride_ColorContrastMidtones=False,bOverride_ColorGammaMidtones=False,bOverride_ColorGainMidtones=False,bOverride_ColorOffsetMidtones=False,bOverride_ColorSaturationHighlights=False,bOverride_ColorContrastHighlights=False,bOverride_ColorGammaHighlights=False,bOverride_ColorGainHighlights=False,bOverride_ColorOffsetHighlights=False,bOverride_ColorCorrectionShadowsMax=False,bOverride_ColorCorrectionHighlightsMin=False,bOverride_FilmWhitePoint=False,bOverride_FilmSaturation=False,bOverride_FilmChannelMixerRed=False,bOverride_FilmChannelMixerGreen=False,bOverride_FilmChannelMixerBlue=False,bOverride_FilmContrast=False,bOverride_FilmDynamicRange=False,bOverride_FilmHealAmount=False,bOverride_FilmToeAmount=False,bOverride_FilmShadowTint=False,bOverride_FilmShadowTintBlend=False,bOverride_FilmShadowTintAmount=False,bOverride_FilmSlope=True,bOverride_FilmToe=True,bOverride_FilmShoulder=True,bOverride_FilmBlackClip=True,bOverride_FilmWhiteClip=True,bOverride_SceneColorTint=False,bOverride_SceneFringeIntensity=False,bOverride_AmbientCubemapTint=False,bOverride_AmbientCubemapIntensity=False,bOverride_BloomIntensity=True,bOverride_BloomThreshold=False,bOverride_Bloom1Tint=False,bOverride_Bloom1Size=False,bOverride_Bloom2Size=False,bOverride_Bloom2Tint=False,bOverride_Bloom3Tint=False,bOverride_Bloom3Size=False,bOverride_Bloom4Tint=False,bOverride_Bloom4Size=False,bOverride_Bloom5Tint=False,bOverride_Bloom5Size=False,bOverride_Bloom6Tint=False,bOverride_Bloom6Size=False,bOverride_BloomSizeScale=False,bOverride_BloomDirtMaskIntensity=False,bOverride_BloomDirtMaskTint=False,bOverride_BloomDirtMask=False,bOverride_AutoExposureMethod=True,bOverride_AutoExposureLowPercent=False,bOverride_AutoExposureHighPercent=False,bOverride_AutoExposureMinBrightness=True,bOverride_AutoExposureMaxBrightness=True,bOverride_AutoExposureSpeedUp=False,bOverride_AutoExposureSpeedDown=False,bOverride_AutoExposureBias=True,bOverride_HistogramLogMin=True,bOverride_HistogramLogMax=True,bOverride_LensFlareIntensity=False,bOverride_LensFlareTint=False,bOverride_LensFlareTints=False,bOverride_LensFlareBokehSize=False,bOverride_LensFlareBokehShape=False,bOverride_LensFlareThreshold=False,bOverride_VignetteIntensity=True,bOverride_GrainIntensity=False,bOverride_GrainJitter=False,bOverride_AmbientOcclusionIntensity=True,bOverride_AmbientOcclusionStaticFraction=True,bOverride_AmbientOcclusionRadius=True,bOverride_AmbientOcclusionFadeDistance=False,bOverride_AmbientOcclusionFadeRadius=False,bOverride_AmbientOcclusionDistance=False,bOverride_AmbientOcclusionRadiusInWS=False,bOverride_AmbientOcclusionPower=True,bOverride_AmbientOcclusionBias=True,bOverride_AmbientOcclusionQuality=True,bOverride_AmbientOcclusionMipBlend=True,bOverride_AmbientOcclusionMipScale=True,bOverride_AmbientOcclusionMipThreshold=True,bOverride_LPVIntensity=False,bOverride_LPVDirectionalOcclusionIntensity=False,bOverride_LPVDirectionalOcclusionRadius=False,bOverride_LPVDiffuseOcclusionExponent=False,bOverride_LPVSpecularOcclusionExponent=False,bOverride_LPVDiffuseOcclusionIntensity=False,bOverride_LPVSpecularOcclusionIntensity=False,bOverride_LPVSize=False,bOverride_LPVSecondaryOcclusionIntensity=False,bOverride_LPVSecondaryBounceIntensity=False,bOverride_LPVGeometryVolumeBias=False,bOverride_LPVVplInjectionBias=False,bOverride_LPVEmissiveInjectionIntensity=False,bOverride_IndirectLightingColor=False,bOverride_IndirectLightingIntensity=False,bOverride_ColorGradingIntensity=True,bOverride_ColorGradingLUT=True,bOverride_DepthOfFieldFocalDistance=False,bOverride_DepthOfFieldFstop=False,bOverride_DepthOfFieldSensorWidth=False,bOverride_DepthOfFieldDepthBlurRadius=False,bOverride_DepthOfFieldDepthBlurAmount=False,bOverride_DepthOfFieldFocalRegion=False,bOverride_DepthOfFieldNearTransitionRegion=False,bOverride_DepthOfFieldFarTransitionRegion=False,bOverride_DepthOfFieldScale=True,bOverride_DepthOfFieldMaxBokehSize=False,bOverride_DepthOfFieldNearBlurSize=False,bOverride_DepthOfFieldFarBlurSize=False,bOverride_DepthOfFieldMethod=True,bOverride_MobileHQGaussian=False,bOverride_DepthOfFieldBokehShape=False,bOverride_DepthOfFieldOcclusion=False,bOverride_DepthOfFieldColorThreshold=False,bOverride_DepthOfFieldSizeThreshold=False,bOverride_DepthOfFieldSkyFocusDistance=False,bOverride_DepthOfFieldVignetteSize=False,bOverride_MotionBlurAmount=False,bOverride_MotionBlurMax=False,bOverride_MotionBlurPerObjectSize=False,bOverride_ScreenPercentage=False,bOverride_ScreenSpaceReflectionIntensity=True,bOverride_ScreenSpaceReflectionQuality=True,bOverride_ScreenSpaceReflectionMaxRoughness=True,bOverride_ScreenSpaceReflectionRoughnessScale=False,WhiteTemp=6700.000000,WhiteTint=0.000000,ColorSaturation=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorContrast=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGamma=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGain=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorOffset=(X=0.005000,Y=0.005000,Z=0.005000,W=0.000000),ColorSaturationShadows=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorContrastShadows=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGammaShadows=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGainShadows=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorOffsetShadows=(X=0.000000,Y=0.000000,Z=0.000000,W=0.000000),ColorCorrectionShadowsMax=0.090000,ColorSaturationMidtones=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorContrastMidtones=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGammaMidtones=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGainMidtones=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorOffsetMidtones=(X=0.000000,Y=0.000000,Z=0.000000,W=0.000000),ColorSaturationHighlights=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorContrastHighlights=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGammaHighlights=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGainHighlights=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorOffsetHighlights=(X=0.000000,Y=0.000000,Z=0.000000,W=0.000000),ColorCorrectionHighlightsMin=0.500000,FilmWhitePoint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),FilmShadowTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),FilmShadowTintBlend=0.500000,FilmShadowTintAmount=0.000000,FilmSaturation=1.000000,FilmChannelMixerRed=(R=1.000000,G=0.000000,B=0.000000,A=1.000000),FilmChannelMixerGreen=(R=0.000000,G=1.000000,B=0.000000,A=1.000000),FilmChannelMixerBlue=(R=0.000000,G=0.000000,B=1.000000,A=1.000000),FilmContrast=0.030000,FilmToeAmount=1.000000,FilmHealAmount=0.180000,FilmDynamicRange=4.000000,FilmSlope=0.880000,FilmToe=0.550000,FilmShoulder=0.260000,FilmBlackClip=0.000000,FilmWhiteClip=0.040000,SceneColorTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),SceneFringeIntensity=0.000000,BloomIntensity=1.000000,BloomThreshold=1.000000,BloomSizeScale=4.000000,Bloom1Size=1.000000,Bloom2Size=4.000000,Bloom3Size=16.000000,Bloom4Size=32.000000,Bloom5Size=64.000000,Bloom6Size=64.000000,Bloom1Tint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),Bloom2Tint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),Bloom3Tint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),Bloom4Tint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),Bloom5Tint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),Bloom6Tint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),BloomDirtMaskIntensity=1.000000,BloomDirtMaskTint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),BloomDirtMask=None,AmbientCubemapTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),AmbientCubemapIntensity=1.000000,AmbientCubemap=None,AutoExposureMethod=AEM_Histogram,AutoExposureLowPercent=80.000000,AutoExposureHighPercent=98.300003,AutoExposureMinBrightness=1.000000,AutoExposureMaxBrightness=1.000000,AutoExposureSpeedUp=3.000000,AutoExposureSpeedDown=1.000000,AutoExposureBias=0.330000,HistogramLogMin=-8.000000,HistogramLogMax=4.000000,LensFlareIntensity=1.000000,LensFlareTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),LensFlareBokehSize=3.000000,LensFlareThreshold=8.000000,LensFlareBokehShape=None,LensFlareTints[0]=(R=1.000000,G=0.800000,B=0.400000,A=0.600000),LensFlareTints[1]=(R=1.000000,G=1.000000,B=0.600000,A=0.530000),LensFlareTints[2]=(R=0.800000,G=0.800000,B=1.000000,A=0.460000),LensFlareTints[3]=(R=0.500000,G=1.000000,B=0.400000,A=0.390000),LensFlareTints[4]=(R=0.500000,G=0.800000,B=1.000000,A=0.310000),LensFlareTints[5]=(R=0.900000,G=1.000000,B=0.800000,A=0.270000),LensFlareTints[6]=(R=1.000000,G=0.800000,B=0.400000,A=0.220000),LensFlareTints[7]=(R=0.900000,G=0.700000,B=0.700000,A=0.150000),VignetteIntensity=0.161468,GrainJitter=0.000000,GrainIntensity=0.000000,AmbientOcclusionIntensity=1.000000,AmbientOcclusionStaticFraction=1.000000,AmbientOcclusionRadius=73.477997,AmbientOcclusionRadiusInWS=False,AmbientOcclusionFadeDistance=8000.000000,AmbientOcclusionFadeRadius=5000.000000,AmbientOcclusionDistance=80.000000,AmbientOcclusionPower=1.200000,AmbientOcclusionBias=3.000000,AmbientOcclusionQuality=100.000000,AmbientOcclusionMipBlend=0.600000,AmbientOcclusionMipScale=1.700000,AmbientOcclusionMipThreshold=0.010000,IndirectLightingColor=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),IndirectLightingIntensity=1.000000,ColorGradingIntensity=0.000000,ColorGradingLUT=Texture2D'/Engine/EditorResources/RGBTable16x1_AssetViewer.RGBTable16x1_AssetViewer',DepthOfFieldMethod=DOFM_BokehDOF,bMobileHQGaussian=False,DepthOfFieldFstop=4.000000,DepthOfFieldSensorWidth=24.576000,DepthOfFieldFocalDistance=1000.000000,DepthOfFieldDepthBlurAmount=1.000000,DepthOfFieldDepthBlurRadius=0.000000,DepthOfFieldFocalRegion=0.000000,DepthOfFieldNearTransitionRegion=300.000000,DepthOfFieldFarTransitionRegion=500.000000,DepthOfFieldScale=0.000000,DepthOfFieldMaxBokehSize=15.000000,DepthOfFieldNearBlurSize=15.000000,DepthOfFieldFarBlurSize=15.000000,DepthOfFieldBokehShape=None,DepthOfFieldOcclusion=0.400000,DepthOfFieldColorThreshold=1.000000,DepthOfFieldSizeThreshold=0.080000,DepthOfFieldSkyFocusDistance=0.000000,DepthOfFieldVignetteSize=200.000000,MotionBlurAmount=0.500000,MotionBlurMax=5.000000,MotionBlurPerObjectSize=0.500000,LPVIntensity=1.000000,LPVVplInjectionBias=0.640000,LPVSize=5312.000000,LPVSecondaryOcclusionIntensity=0.000000,LPVSecondaryBounceIntensity=0.000000,LPVGeometryVolumeBias=0.384000,LPVEmissiveInjectionIntensity=1.000000,LPVDirectionalOcclusionIntensity=0.000000,LPVDirectionalOcclusionRadius=8.000000,LPVDiffuseOcclusionExponent=1.000000,LPVSpecularOcclusionExponent=7.000000,LPVDiffuseOcclusionIntensity=1.000000,LPVSpecularOcclusionIntensity=1.000000,ScreenSpaceReflectionIntensity=100.000000,ScreenSpaceReflectionQuality=100.000000,ScreenSpaceReflectionMaxRoughness=1.000000,ScreenPercentage=100.000000,WeightedBlendables=(Array=),Blendables=),bPostProcessingEnabled=True,LightingRigRotation=109.389069,RotationSpeed=2.000000,DirectionalLightRotation=(Pitch=-39.999985,Yaw=-67.500015,Roll=0.000000))\n-Profiles=(ProfileName=\"Default\",DirectionalLightIntensity=2.620000,DirectionalLightColor=(R=0.990000,G=0.839850,B=0.732600,A=1.000000),SkyLightIntensity=0.880000,bRotateLightingRig=False,bShowEnvironment=True,bShowFloor=True,EnvironmentCubeMapPath=\"/Engine/EditorMaterials/AssetViewer/EpicQuadPanorama_CC+EV1.EpicQuadPanorama_CC+EV1\",PostProcessingSettings=(bOverride_WhiteTemp=True,bOverride_WhiteTint=False,bOverride_ColorSaturation=True,bOverride_ColorContrast=True,bOverride_ColorGamma=True,bOverride_ColorGain=True,bOverride_ColorOffset=True,bOverride_ColorSaturationShadows=False,bOverride_ColorContrastShadows=False,bOverride_ColorGammaShadows=False,bOverride_ColorGainShadows=False,bOverride_ColorOffsetShadows=False,bOverride_ColorSaturationMidtones=False,bOverride_ColorContrastMidtones=False,bOverride_ColorGammaMidtones=False,bOverride_ColorGainMidtones=False,bOverride_ColorOffsetMidtones=False,bOverride_ColorSaturationHighlights=False,bOverride_ColorContrastHighlights=False,bOverride_ColorGammaHighlights=False,bOverride_ColorGainHighlights=False,bOverride_ColorOffsetHighlights=False,bOverride_ColorCorrectionShadowsMax=False,bOverride_ColorCorrectionHighlightsMin=False,bOverride_FilmWhitePoint=False,bOverride_FilmSaturation=False,bOverride_FilmChannelMixerRed=False,bOverride_FilmChannelMixerGreen=False,bOverride_FilmChannelMixerBlue=False,bOverride_FilmContrast=False,bOverride_FilmDynamicRange=False,bOverride_FilmHealAmount=False,bOverride_FilmToeAmount=False,bOverride_FilmShadowTint=False,bOverride_FilmShadowTintBlend=False,bOverride_FilmShadowTintAmount=False,bOverride_FilmSlope=True,bOverride_FilmToe=True,bOverride_FilmShoulder=True,bOverride_FilmBlackClip=True,bOverride_FilmWhiteClip=True,bOverride_SceneColorTint=False,bOverride_SceneFringeIntensity=False,bOverride_AmbientCubemapTint=False,bOverride_AmbientCubemapIntensity=False,bOverride_BloomIntensity=True,bOverride_BloomThreshold=False,bOverride_Bloom1Tint=False,bOverride_Bloom1Size=False,bOverride_Bloom2Size=False,bOverride_Bloom2Tint=False,bOverride_Bloom3Tint=False,bOverride_Bloom3Size=False,bOverride_Bloom4Tint=False,bOverride_Bloom4Size=False,bOverride_Bloom5Tint=False,bOverride_Bloom5Size=False,bOverride_Bloom6Tint=False,bOverride_Bloom6Size=False,bOverride_BloomSizeScale=False,bOverride_BloomDirtMaskIntensity=False,bOverride_BloomDirtMaskTint=False,bOverride_BloomDirtMask=False,bOverride_AutoExposureMethod=True,bOverride_AutoExposureLowPercent=False,bOverride_AutoExposureHighPercent=False,bOverride_AutoExposureMinBrightness=True,bOverride_AutoExposureMaxBrightness=True,bOverride_AutoExposureSpeedUp=False,bOverride_AutoExposureSpeedDown=False,bOverride_AutoExposureBias=True,bOverride_HistogramLogMin=True,bOverride_HistogramLogMax=True,bOverride_LensFlareIntensity=False,bOverride_LensFlareTint=False,bOverride_LensFlareTints=False,bOverride_LensFlareBokehSize=False,bOverride_LensFlareBokehShape=False,bOverride_LensFlareThreshold=False,bOverride_VignetteIntensity=True,bOverride_GrainIntensity=False,bOverride_GrainJitter=False,bOverride_AmbientOcclusionIntensity=True,bOverride_AmbientOcclusionStaticFraction=True,bOverride_AmbientOcclusionRadius=True,bOverride_AmbientOcclusionFadeDistance=False,bOverride_AmbientOcclusionFadeRadius=False,bOverride_AmbientOcclusionDistance=False,bOverride_AmbientOcclusionRadiusInWS=False,bOverride_AmbientOcclusionPower=True,bOverride_AmbientOcclusionBias=True,bOverride_AmbientOcclusionQuality=True,bOverride_AmbientOcclusionMipBlend=True,bOverride_AmbientOcclusionMipScale=True,bOverride_AmbientOcclusionMipThreshold=True,bOverride_LPVIntensity=False,bOverride_LPVDirectionalOcclusionIntensity=False,bOverride_LPVDirectionalOcclusionRadius=False,bOverride_LPVDiffuseOcclusionExponent=False,bOverride_LPVSpecularOcclusionExponent=False,bOverride_LPVDiffuseOcclusionIntensity=False,bOverride_LPVSpecularOcclusionIntensity=False,bOverride_LPVSize=False,bOverride_LPVSecondaryOcclusionIntensity=False,bOverride_LPVSecondaryBounceIntensity=False,bOverride_LPVGeometryVolumeBias=False,bOverride_LPVVplInjectionBias=False,bOverride_LPVEmissiveInjectionIntensity=False,bOverride_IndirectLightingColor=False,bOverride_IndirectLightingIntensity=False,bOverride_ColorGradingIntensity=True,bOverride_ColorGradingLUT=True,bOverride_DepthOfFieldFocalDistance=False,bOverride_DepthOfFieldFstop=False,bOverride_DepthOfFieldSensorWidth=False,bOverride_DepthOfFieldDepthBlurRadius=False,bOverride_DepthOfFieldDepthBlurAmount=False,bOverride_DepthOfFieldFocalRegion=False,bOverride_DepthOfFieldNearTransitionRegion=False,bOverride_DepthOfFieldFarTransitionRegion=False,bOverride_DepthOfFieldScale=True,bOverride_DepthOfFieldMaxBokehSize=False,bOverride_DepthOfFieldNearBlurSize=False,bOverride_DepthOfFieldFarBlurSize=False,bOverride_DepthOfFieldMethod=True,bOverride_MobileHQGaussian=False,bOverride_DepthOfFieldBokehShape=False,bOverride_DepthOfFieldOcclusion=False,bOverride_DepthOfFieldColorThreshold=False,bOverride_DepthOfFieldSizeThreshold=False,bOverride_DepthOfFieldSkyFocusDistance=False,bOverride_DepthOfFieldVignetteSize=False,bOverride_MotionBlurAmount=False,bOverride_MotionBlurMax=False,bOverride_MotionBlurPerObjectSize=False,bOverride_ScreenPercentage=False,bOverride_ScreenSpaceReflectionIntensity=True,bOverride_ScreenSpaceReflectionQuality=True,bOverride_ScreenSpaceReflectionMaxRoughness=True,bOverride_ScreenSpaceReflectionRoughnessScale=False,WhiteTemp=6700.000000,WhiteTint=0.000000,ColorSaturation=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorContrast=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGamma=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGain=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorOffset=(X=0.005000,Y=0.005000,Z=0.005000,W=0.000000),ColorSaturationShadows=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorContrastShadows=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGammaShadows=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGainShadows=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorOffsetShadows=(X=0.000000,Y=0.000000,Z=0.000000,W=0.000000),ColorCorrectionShadowsMax=0.090000,ColorSaturationMidtones=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorContrastMidtones=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGammaMidtones=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGainMidtones=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorOffsetMidtones=(X=0.000000,Y=0.000000,Z=0.000000,W=0.000000),ColorSaturationHighlights=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorContrastHighlights=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGammaHighlights=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGainHighlights=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorOffsetHighlights=(X=0.000000,Y=0.000000,Z=0.000000,W=0.000000),ColorCorrectionHighlightsMin=0.500000,FilmWhitePoint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),FilmShadowTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),FilmShadowTintBlend=0.500000,FilmShadowTintAmount=0.000000,FilmSaturation=1.000000,FilmChannelMixerRed=(R=1.000000,G=0.000000,B=0.000000,A=1.000000),FilmChannelMixerGreen=(R=0.000000,G=1.000000,B=0.000000,A=1.000000),FilmChannelMixerBlue=(R=0.000000,G=0.000000,B=1.000000,A=1.000000),FilmContrast=0.030000,FilmToeAmount=1.000000,FilmHealAmount=0.180000,FilmDynamicRange=4.000000,FilmSlope=0.880000,FilmToe=0.550000,FilmShoulder=0.260000,FilmBlackClip=0.000000,FilmWhiteClip=0.040000,SceneColorTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),SceneFringeIntensity=0.000000,BloomIntensity=1.000000,BloomThreshold=1.000000,BloomSizeScale=4.000000,Bloom1Size=1.000000,Bloom2Size=4.000000,Bloom3Size=16.000000,Bloom4Size=32.000000,Bloom5Size=64.000000,Bloom6Size=64.000000,Bloom1Tint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),Bloom2Tint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),Bloom3Tint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),Bloom4Tint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),Bloom5Tint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),Bloom6Tint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),BloomDirtMaskIntensity=1.000000,BloomDirtMaskTint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),BloomDirtMask=None,AmbientCubemapTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),AmbientCubemapIntensity=1.000000,AmbientCubemap=None,AutoExposureMethod=AEM_Histogram,AutoExposureLowPercent=80.000000,AutoExposureHighPercent=98.300003,AutoExposureMinBrightness=1.000000,AutoExposureMaxBrightness=1.000000,AutoExposureSpeedUp=3.000000,AutoExposureSpeedDown=1.000000,AutoExposureBias=0.330000,HistogramLogMin=-8.000000,HistogramLogMax=4.000000,LensFlareIntensity=1.000000,LensFlareTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),LensFlareBokehSize=3.000000,LensFlareThreshold=8.000000,LensFlareBokehShape=None,LensFlareTints[0]=(R=1.000000,G=0.800000,B=0.400000,A=0.600000),LensFlareTints[1]=(R=1.000000,G=1.000000,B=0.600000,A=0.530000),LensFlareTints[2]=(R=0.800000,G=0.800000,B=1.000000,A=0.460000),LensFlareTints[3]=(R=0.500000,G=1.000000,B=0.400000,A=0.390000),LensFlareTints[4]=(R=0.500000,G=0.800000,B=1.000000,A=0.310000),LensFlareTints[5]=(R=0.900000,G=1.000000,B=0.800000,A=0.270000),LensFlareTints[6]=(R=1.000000,G=0.800000,B=0.400000,A=0.220000),LensFlareTints[7]=(R=0.900000,G=0.700000,B=0.700000,A=0.150000),VignetteIntensity=0.161468,GrainJitter=0.000000,GrainIntensity=0.000000,AmbientOcclusionIntensity=1.000000,AmbientOcclusionStaticFraction=1.000000,AmbientOcclusionRadius=73.477997,AmbientOcclusionRadiusInWS=False,AmbientOcclusionFadeDistance=8000.000000,AmbientOcclusionFadeRadius=5000.000000,AmbientOcclusionDistance=80.000000,AmbientOcclusionPower=1.200000,AmbientOcclusionBias=3.000000,AmbientOcclusionQuality=100.000000,AmbientOcclusionMipBlend=0.600000,AmbientOcclusionMipScale=1.700000,AmbientOcclusionMipThreshold=0.010000,IndirectLightingColor=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),IndirectLightingIntensity=1.000000,ColorGradingIntensity=0.000000,ColorGradingLUT=Texture2D'/Engine/EditorResources/RGBTable16x1_AssetViewer.RGBTable16x1_AssetViewer',DepthOfFieldMethod=DOFM_BokehDOF,bMobileHQGaussian=False,DepthOfFieldFstop=4.000000,DepthOfFieldSensorWidth=24.576000,DepthOfFieldFocalDistance=1000.000000,DepthOfFieldDepthBlurAmount=1.000000,DepthOfFieldDepthBlurRadius=0.000000,DepthOfFieldFocalRegion=0.000000,DepthOfFieldNearTransitionRegion=300.000000,DepthOfFieldFarTransitionRegion=500.000000,DepthOfFieldScale=0.000000,DepthOfFieldMaxBokehSize=15.000000,DepthOfFieldNearBlurSize=15.000000,DepthOfFieldFarBlurSize=15.000000,DepthOfFieldBokehShape=None,DepthOfFieldOcclusion=0.400000,DepthOfFieldColorThreshold=1.000000,DepthOfFieldSizeThreshold=0.080000,DepthOfFieldSkyFocusDistance=0.000000,DepthOfFieldVignetteSize=200.000000,MotionBlurAmount=0.500000,MotionBlurMax=5.000000,MotionBlurPerObjectSize=0.500000,LPVIntensity=1.000000,LPVVplInjectionBias=0.640000,LPVSize=5312.000000,LPVSecondaryOcclusionIntensity=0.000000,LPVSecondaryBounceIntensity=0.000000,LPVGeometryVolumeBias=0.384000,LPVEmissiveInjectionIntensity=1.000000,LPVDirectionalOcclusionIntensity=0.000000,LPVDirectionalOcclusionRadius=8.000000,LPVDiffuseOcclusionExponent=1.000000,LPVSpecularOcclusionExponent=7.000000,LPVDiffuseOcclusionIntensity=1.000000,LPVSpecularOcclusionIntensity=1.000000,ScreenSpaceReflectionIntensity=100.000000,ScreenSpaceReflectionQuality=100.000000,ScreenSpaceReflectionMaxRoughness=1.000000,ScreenPercentage=100.000000,WeightedBlendables=(Array=),Blendables=),bPostProcessingEnabled=True,LightingRigRotation=109.389069,RotationSpeed=2.000000,DirectionalLightRotation=(Pitch=-39.999985,Yaw=-67.500015,Roll=0.000000))\n-Profiles=(ProfileName=\"Default\",DirectionalLightIntensity=2.620000,DirectionalLightColor=(R=0.990000,G=0.839850,B=0.732600,A=1.000000),SkyLightIntensity=0.880000,bRotateLightingRig=False,bShowEnvironment=True,bShowFloor=True,EnvironmentCubeMapPath=\"/Engine/EditorMaterials/AssetViewer/EpicQuadPanorama_CC+EV1.EpicQuadPanorama_CC+EV1\",PostProcessingSettings=(bOverride_WhiteTemp=True,bOverride_WhiteTint=False,bOverride_ColorSaturation=True,bOverride_ColorContrast=True,bOverride_ColorGamma=True,bOverride_ColorGain=True,bOverride_ColorOffset=True,bOverride_ColorSaturationShadows=False,bOverride_ColorContrastShadows=False,bOverride_ColorGammaShadows=False,bOverride_ColorGainShadows=False,bOverride_ColorOffsetShadows=False,bOverride_ColorSaturationMidtones=False,bOverride_ColorContrastMidtones=False,bOverride_ColorGammaMidtones=False,bOverride_ColorGainMidtones=False,bOverride_ColorOffsetMidtones=False,bOverride_ColorSaturationHighlights=False,bOverride_ColorContrastHighlights=False,bOverride_ColorGammaHighlights=False,bOverride_ColorGainHighlights=False,bOverride_ColorOffsetHighlights=False,bOverride_ColorCorrectionShadowsMax=False,bOverride_ColorCorrectionHighlightsMin=False,bOverride_FilmWhitePoint=False,bOverride_FilmSaturation=False,bOverride_FilmChannelMixerRed=False,bOverride_FilmChannelMixerGreen=False,bOverride_FilmChannelMixerBlue=False,bOverride_FilmContrast=False,bOverride_FilmDynamicRange=False,bOverride_FilmHealAmount=False,bOverride_FilmToeAmount=False,bOverride_FilmShadowTint=False,bOverride_FilmShadowTintBlend=False,bOverride_FilmShadowTintAmount=False,bOverride_FilmSlope=True,bOverride_FilmToe=True,bOverride_FilmShoulder=True,bOverride_FilmBlackClip=True,bOverride_FilmWhiteClip=True,bOverride_SceneColorTint=False,bOverride_SceneFringeIntensity=False,bOverride_AmbientCubemapTint=False,bOverride_AmbientCubemapIntensity=False,bOverride_BloomIntensity=True,bOverride_BloomThreshold=False,bOverride_Bloom1Tint=False,bOverride_Bloom1Size=False,bOverride_Bloom2Size=False,bOverride_Bloom2Tint=False,bOverride_Bloom3Tint=False,bOverride_Bloom3Size=False,bOverride_Bloom4Tint=False,bOverride_Bloom4Size=False,bOverride_Bloom5Tint=False,bOverride_Bloom5Size=False,bOverride_Bloom6Tint=False,bOverride_Bloom6Size=False,bOverride_BloomSizeScale=False,bOverride_BloomDirtMaskIntensity=False,bOverride_BloomDirtMaskTint=False,bOverride_BloomDirtMask=False,bOverride_AutoExposureMethod=True,bOverride_AutoExposureLowPercent=False,bOverride_AutoExposureHighPercent=False,bOverride_AutoExposureMinBrightness=True,bOverride_AutoExposureMaxBrightness=True,bOverride_AutoExposureSpeedUp=False,bOverride_AutoExposureSpeedDown=False,bOverride_AutoExposureBias=True,bOverride_HistogramLogMin=True,bOverride_HistogramLogMax=True,bOverride_LensFlareIntensity=False,bOverride_LensFlareTint=False,bOverride_LensFlareTints=False,bOverride_LensFlareBokehSize=False,bOverride_LensFlareBokehShape=False,bOverride_LensFlareThreshold=False,bOverride_VignetteIntensity=True,bOverride_GrainIntensity=False,bOverride_GrainJitter=False,bOverride_AmbientOcclusionIntensity=True,bOverride_AmbientOcclusionStaticFraction=True,bOverride_AmbientOcclusionRadius=True,bOverride_AmbientOcclusionFadeDistance=False,bOverride_AmbientOcclusionFadeRadius=False,bOverride_AmbientOcclusionDistance=False,bOverride_AmbientOcclusionRadiusInWS=False,bOverride_AmbientOcclusionPower=True,bOverride_AmbientOcclusionBias=True,bOverride_AmbientOcclusionQuality=True,bOverride_AmbientOcclusionMipBlend=True,bOverride_AmbientOcclusionMipScale=True,bOverride_AmbientOcclusionMipThreshold=True,bOverride_LPVIntensity=False,bOverride_LPVDirectionalOcclusionIntensity=False,bOverride_LPVDirectionalOcclusionRadius=False,bOverride_LPVDiffuseOcclusionExponent=False,bOverride_LPVSpecularOcclusionExponent=False,bOverride_LPVDiffuseOcclusionIntensity=False,bOverride_LPVSpecularOcclusionIntensity=False,bOverride_LPVSize=False,bOverride_LPVSecondaryOcclusionIntensity=False,bOverride_LPVSecondaryBounceIntensity=False,bOverride_LPVGeometryVolumeBias=False,bOverride_LPVVplInjectionBias=False,bOverride_LPVEmissiveInjectionIntensity=False,bOverride_IndirectLightingColor=False,bOverride_IndirectLightingIntensity=False,bOverride_ColorGradingIntensity=True,bOverride_ColorGradingLUT=True,bOverride_DepthOfFieldFocalDistance=False,bOverride_DepthOfFieldFstop=False,bOverride_DepthOfFieldSensorWidth=False,bOverride_DepthOfFieldDepthBlurRadius=False,bOverride_DepthOfFieldDepthBlurAmount=False,bOverride_DepthOfFieldFocalRegion=False,bOverride_DepthOfFieldNearTransitionRegion=False,bOverride_DepthOfFieldFarTransitionRegion=False,bOverride_DepthOfFieldScale=True,bOverride_DepthOfFieldMaxBokehSize=False,bOverride_DepthOfFieldNearBlurSize=False,bOverride_DepthOfFieldFarBlurSize=False,bOverride_DepthOfFieldMethod=True,bOverride_MobileHQGaussian=False,bOverride_DepthOfFieldBokehShape=False,bOverride_DepthOfFieldOcclusion=False,bOverride_DepthOfFieldColorThreshold=False,bOverride_DepthOfFieldSizeThreshold=False,bOverride_DepthOfFieldSkyFocusDistance=False,bOverride_DepthOfFieldVignetteSize=False,bOverride_MotionBlurAmount=False,bOverride_MotionBlurMax=False,bOverride_MotionBlurPerObjectSize=False,bOverride_ScreenPercentage=False,bOverride_ScreenSpaceReflectionIntensity=True,bOverride_ScreenSpaceReflectionQuality=True,bOverride_ScreenSpaceReflectionMaxRoughness=True,bOverride_ScreenSpaceReflectionRoughnessScale=False,WhiteTemp=6700.000000,WhiteTint=0.000000,ColorSaturation=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorContrast=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGamma=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGain=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorOffset=(X=0.005000,Y=0.005000,Z=0.005000,W=0.000000),ColorSaturationShadows=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorContrastShadows=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGammaShadows=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGainShadows=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorOffsetShadows=(X=0.000000,Y=0.000000,Z=0.000000,W=0.000000),ColorCorrectionShadowsMax=0.090000,ColorSaturationMidtones=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorContrastMidtones=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGammaMidtones=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGainMidtones=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorOffsetMidtones=(X=0.000000,Y=0.000000,Z=0.000000,W=0.000000),ColorSaturationHighlights=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorContrastHighlights=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGammaHighlights=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGainHighlights=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorOffsetHighlights=(X=0.000000,Y=0.000000,Z=0.000000,W=0.000000),ColorCorrectionHighlightsMin=0.500000,FilmWhitePoint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),FilmShadowTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),FilmShadowTintBlend=0.500000,FilmShadowTintAmount=0.000000,FilmSaturation=1.000000,FilmChannelMixerRed=(R=1.000000,G=0.000000,B=0.000000,A=1.000000),FilmChannelMixerGreen=(R=0.000000,G=1.000000,B=0.000000,A=1.000000),FilmChannelMixerBlue=(R=0.000000,G=0.000000,B=1.000000,A=1.000000),FilmContrast=0.030000,FilmToeAmount=1.000000,FilmHealAmount=0.180000,FilmDynamicRange=4.000000,FilmSlope=0.880000,FilmToe=0.550000,FilmShoulder=0.260000,FilmBlackClip=0.000000,FilmWhiteClip=0.040000,SceneColorTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),SceneFringeIntensity=0.000000,BloomIntensity=1.000000,BloomThreshold=1.000000,BloomSizeScale=4.000000,Bloom1Size=1.000000,Bloom2Size=4.000000,Bloom3Size=16.000000,Bloom4Size=32.000000,Bloom5Size=64.000000,Bloom6Size=64.000000,Bloom1Tint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),Bloom2Tint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),Bloom3Tint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),Bloom4Tint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),Bloom5Tint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),Bloom6Tint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),BloomDirtMaskIntensity=1.000000,BloomDirtMaskTint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),BloomDirtMask=None,AmbientCubemapTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),AmbientCubemapIntensity=1.000000,AmbientCubemap=None,AutoExposureMethod=AEM_Histogram,AutoExposureLowPercent=80.000000,AutoExposureHighPercent=98.300003,AutoExposureMinBrightness=1.000000,AutoExposureMaxBrightness=1.000000,AutoExposureSpeedUp=3.000000,AutoExposureSpeedDown=1.000000,AutoExposureBias=0.330000,HistogramLogMin=-8.000000,HistogramLogMax=4.000000,LensFlareIntensity=1.000000,LensFlareTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),LensFlareBokehSize=3.000000,LensFlareThreshold=8.000000,LensFlareBokehShape=None,LensFlareTints[0]=(R=1.000000,G=0.800000,B=0.400000,A=0.600000),LensFlareTints[1]=(R=1.000000,G=1.000000,B=0.600000,A=0.530000),LensFlareTints[2]=(R=0.800000,G=0.800000,B=1.000000,A=0.460000),LensFlareTints[3]=(R=0.500000,G=1.000000,B=0.400000,A=0.390000),LensFlareTints[4]=(R=0.500000,G=0.800000,B=1.000000,A=0.310000),LensFlareTints[5]=(R=0.900000,G=1.000000,B=0.800000,A=0.270000),LensFlareTints[6]=(R=1.000000,G=0.800000,B=0.400000,A=0.220000),LensFlareTints[7]=(R=0.900000,G=0.700000,B=0.700000,A=0.150000),VignetteIntensity=0.161468,GrainJitter=0.000000,GrainIntensity=0.000000,AmbientOcclusionIntensity=1.000000,AmbientOcclusionStaticFraction=1.000000,AmbientOcclusionRadius=73.477997,AmbientOcclusionRadiusInWS=False,AmbientOcclusionFadeDistance=8000.000000,AmbientOcclusionFadeRadius=5000.000000,AmbientOcclusionDistance=80.000000,AmbientOcclusionPower=1.200000,AmbientOcclusionBias=3.000000,AmbientOcclusionQuality=100.000000,AmbientOcclusionMipBlend=0.600000,AmbientOcclusionMipScale=1.700000,AmbientOcclusionMipThreshold=0.010000,IndirectLightingColor=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),IndirectLightingIntensity=1.000000,ColorGradingIntensity=0.000000,ColorGradingLUT=Texture2D'/Engine/EditorResources/RGBTable16x1_AssetViewer.RGBTable16x1_AssetViewer',DepthOfFieldMethod=DOFM_BokehDOF,bMobileHQGaussian=False,DepthOfFieldFstop=4.000000,DepthOfFieldSensorWidth=24.576000,DepthOfFieldFocalDistance=1000.000000,DepthOfFieldDepthBlurAmount=1.000000,DepthOfFieldDepthBlurRadius=0.000000,DepthOfFieldFocalRegion=0.000000,DepthOfFieldNearTransitionRegion=300.000000,DepthOfFieldFarTransitionRegion=500.000000,DepthOfFieldScale=0.000000,DepthOfFieldMaxBokehSize=15.000000,DepthOfFieldNearBlurSize=15.000000,DepthOfFieldFarBlurSize=15.000000,DepthOfFieldBokehShape=None,DepthOfFieldOcclusion=0.400000,DepthOfFieldColorThreshold=1.000000,DepthOfFieldSizeThreshold=0.080000,DepthOfFieldSkyFocusDistance=0.000000,DepthOfFieldVignetteSize=200.000000,MotionBlurAmount=0.500000,MotionBlurMax=5.000000,MotionBlurPerObjectSize=0.500000,LPVIntensity=1.000000,LPVVplInjectionBias=0.640000,LPVSize=5312.000000,LPVSecondaryOcclusionIntensity=0.000000,LPVSecondaryBounceIntensity=0.000000,LPVGeometryVolumeBias=0.384000,LPVEmissiveInjectionIntensity=1.000000,LPVDirectionalOcclusionIntensity=0.000000,LPVDirectionalOcclusionRadius=8.000000,LPVDiffuseOcclusionExponent=1.000000,LPVSpecularOcclusionExponent=7.000000,LPVDiffuseOcclusionIntensity=1.000000,LPVSpecularOcclusionIntensity=1.000000,ScreenSpaceReflectionIntensity=100.000000,ScreenSpaceReflectionQuality=100.000000,ScreenSpaceReflectionMaxRoughness=1.000000,ScreenPercentage=100.000000,WeightedBlendables=(Array=),Blendables=),bPostProcessingEnabled=True,LightingRigRotation=109.389069,RotationSpeed=2.000000,DirectionalLightRotation=(Pitch=-39.999985,Yaw=-67.500015,Roll=0.000000))\n-Profiles=(ProfileName=\"Default\",DirectionalLightIntensity=2.620000,DirectionalLightColor=(R=0.990000,G=0.839850,B=0.732600,A=1.000000),SkyLightIntensity=0.880000,bRotateLightingRig=False,bShowEnvironment=True,bShowFloor=True,EnvironmentCubeMapPath=\"/Engine/EditorMaterials/AssetViewer/EpicQuadPanorama_CC+EV1.EpicQuadPanorama_CC+EV1\",PostProcessingSettings=(bOverride_WhiteTemp=True,bOverride_WhiteTint=False,bOverride_ColorSaturation=True,bOverride_ColorContrast=True,bOverride_ColorGamma=True,bOverride_ColorGain=True,bOverride_ColorOffset=True,bOverride_ColorSaturationShadows=False,bOverride_ColorContrastShadows=False,bOverride_ColorGammaShadows=False,bOverride_ColorGainShadows=False,bOverride_ColorOffsetShadows=False,bOverride_ColorSaturationMidtones=False,bOverride_ColorContrastMidtones=False,bOverride_ColorGammaMidtones=False,bOverride_ColorGainMidtones=False,bOverride_ColorOffsetMidtones=False,bOverride_ColorSaturationHighlights=False,bOverride_ColorContrastHighlights=False,bOverride_ColorGammaHighlights=False,bOverride_ColorGainHighlights=False,bOverride_ColorOffsetHighlights=False,bOverride_ColorCorrectionShadowsMax=False,bOverride_ColorCorrectionHighlightsMin=False,bOverride_FilmWhitePoint=False,bOverride_FilmSaturation=False,bOverride_FilmChannelMixerRed=False,bOverride_FilmChannelMixerGreen=False,bOverride_FilmChannelMixerBlue=False,bOverride_FilmContrast=False,bOverride_FilmDynamicRange=False,bOverride_FilmHealAmount=False,bOverride_FilmToeAmount=False,bOverride_FilmShadowTint=False,bOverride_FilmShadowTintBlend=False,bOverride_FilmShadowTintAmount=False,bOverride_FilmSlope=True,bOverride_FilmToe=True,bOverride_FilmShoulder=True,bOverride_FilmBlackClip=True,bOverride_FilmWhiteClip=True,bOverride_SceneColorTint=False,bOverride_SceneFringeIntensity=False,bOverride_AmbientCubemapTint=False,bOverride_AmbientCubemapIntensity=False,bOverride_BloomIntensity=True,bOverride_BloomThreshold=False,bOverride_Bloom1Tint=False,bOverride_Bloom1Size=False,bOverride_Bloom2Size=False,bOverride_Bloom2Tint=False,bOverride_Bloom3Tint=False,bOverride_Bloom3Size=False,bOverride_Bloom4Tint=False,bOverride_Bloom4Size=False,bOverride_Bloom5Tint=False,bOverride_Bloom5Size=False,bOverride_Bloom6Tint=False,bOverride_Bloom6Size=False,bOverride_BloomSizeScale=False,bOverride_BloomDirtMaskIntensity=False,bOverride_BloomDirtMaskTint=False,bOverride_BloomDirtMask=False,bOverride_AutoExposureMethod=True,bOverride_AutoExposureLowPercent=False,bOverride_AutoExposureHighPercent=False,bOverride_AutoExposureMinBrightness=True,bOverride_AutoExposureMaxBrightness=True,bOverride_AutoExposureSpeedUp=False,bOverride_AutoExposureSpeedDown=False,bOverride_AutoExposureBias=True,bOverride_HistogramLogMin=True,bOverride_HistogramLogMax=True,bOverride_LensFlareIntensity=False,bOverride_LensFlareTint=False,bOverride_LensFlareTints=False,bOverride_LensFlareBokehSize=False,bOverride_LensFlareBokehShape=False,bOverride_LensFlareThreshold=False,bOverride_VignetteIntensity=True,bOverride_GrainIntensity=False,bOverride_GrainJitter=False,bOverride_AmbientOcclusionIntensity=True,bOverride_AmbientOcclusionStaticFraction=True,bOverride_AmbientOcclusionRadius=True,bOverride_AmbientOcclusionFadeDistance=False,bOverride_AmbientOcclusionFadeRadius=False,bOverride_AmbientOcclusionDistance=False,bOverride_AmbientOcclusionRadiusInWS=False,bOverride_AmbientOcclusionPower=True,bOverride_AmbientOcclusionBias=True,bOverride_AmbientOcclusionQuality=True,bOverride_AmbientOcclusionMipBlend=True,bOverride_AmbientOcclusionMipScale=True,bOverride_AmbientOcclusionMipThreshold=True,bOverride_LPVIntensity=False,bOverride_LPVDirectionalOcclusionIntensity=False,bOverride_LPVDirectionalOcclusionRadius=False,bOverride_LPVDiffuseOcclusionExponent=False,bOverride_LPVSpecularOcclusionExponent=False,bOverride_LPVDiffuseOcclusionIntensity=False,bOverride_LPVSpecularOcclusionIntensity=False,bOverride_LPVSize=False,bOverride_LPVSecondaryOcclusionIntensity=False,bOverride_LPVSecondaryBounceIntensity=False,bOverride_LPVGeometryVolumeBias=False,bOverride_LPVVplInjectionBias=False,bOverride_LPVEmissiveInjectionIntensity=False,bOverride_IndirectLightingColor=False,bOverride_IndirectLightingIntensity=False,bOverride_ColorGradingIntensity=True,bOverride_ColorGradingLUT=True,bOverride_DepthOfFieldFocalDistance=False,bOverride_DepthOfFieldFstop=False,bOverride_DepthOfFieldSensorWidth=False,bOverride_DepthOfFieldDepthBlurRadius=False,bOverride_DepthOfFieldDepthBlurAmount=False,bOverride_DepthOfFieldFocalRegion=False,bOverride_DepthOfFieldNearTransitionRegion=False,bOverride_DepthOfFieldFarTransitionRegion=False,bOverride_DepthOfFieldScale=True,bOverride_DepthOfFieldMaxBokehSize=False,bOverride_DepthOfFieldNearBlurSize=False,bOverride_DepthOfFieldFarBlurSize=False,bOverride_DepthOfFieldMethod=True,bOverride_MobileHQGaussian=False,bOverride_DepthOfFieldBokehShape=False,bOverride_DepthOfFieldOcclusion=False,bOverride_DepthOfFieldColorThreshold=False,bOverride_DepthOfFieldSizeThreshold=False,bOverride_DepthOfFieldSkyFocusDistance=False,bOverride_DepthOfFieldVignetteSize=False,bOverride_MotionBlurAmount=False,bOverride_MotionBlurMax=False,bOverride_MotionBlurPerObjectSize=False,bOverride_ScreenPercentage=False,bOverride_ScreenSpaceReflectionIntensity=True,bOverride_ScreenSpaceReflectionQuality=True,bOverride_ScreenSpaceReflectionMaxRoughness=True,bOverride_ScreenSpaceReflectionRoughnessScale=False,WhiteTemp=6700.000000,WhiteTint=0.000000,ColorSaturation=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorContrast=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGamma=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGain=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorOffset=(X=0.005000,Y=0.005000,Z=0.005000,W=0.000000),ColorSaturationShadows=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorContrastShadows=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGammaShadows=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGainShadows=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorOffsetShadows=(X=0.000000,Y=0.000000,Z=0.000000,W=0.000000),ColorCorrectionShadowsMax=0.090000,ColorSaturationMidtones=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorContrastMidtones=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGammaMidtones=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGainMidtones=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorOffsetMidtones=(X=0.000000,Y=0.000000,Z=0.000000,W=0.000000),ColorSaturationHighlights=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorContrastHighlights=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGammaHighlights=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGainHighlights=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorOffsetHighlights=(X=0.000000,Y=0.000000,Z=0.000000,W=0.000000),ColorCorrectionHighlightsMin=0.500000,FilmWhitePoint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),FilmShadowTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),FilmShadowTintBlend=0.500000,FilmShadowTintAmount=0.000000,FilmSaturation=1.000000,FilmChannelMixerRed=(R=1.000000,G=0.000000,B=0.000000,A=1.000000),FilmChannelMixerGreen=(R=0.000000,G=1.000000,B=0.000000,A=1.000000),FilmChannelMixerBlue=(R=0.000000,G=0.000000,B=1.000000,A=1.000000),FilmContrast=0.030000,FilmToeAmount=1.000000,FilmHealAmount=0.180000,FilmDynamicRange=4.000000,FilmSlope=0.880000,FilmToe=0.550000,FilmShoulder=0.260000,FilmBlackClip=0.000000,FilmWhiteClip=0.040000,SceneColorTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),SceneFringeIntensity=0.000000,BloomIntensity=1.000000,BloomThreshold=1.000000,BloomSizeScale=4.000000,Bloom1Size=1.000000,Bloom2Size=4.000000,Bloom3Size=16.000000,Bloom4Size=32.000000,Bloom5Size=64.000000,Bloom6Size=64.000000,Bloom1Tint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),Bloom2Tint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),Bloom3Tint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),Bloom4Tint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),Bloom5Tint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),Bloom6Tint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),BloomDirtMaskIntensity=1.000000,BloomDirtMaskTint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),BloomDirtMask=None,AmbientCubemapTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),AmbientCubemapIntensity=1.000000,AmbientCubemap=None,AutoExposureMethod=AEM_Histogram,AutoExposureLowPercent=80.000000,AutoExposureHighPercent=98.300003,AutoExposureMinBrightness=1.000000,AutoExposureMaxBrightness=1.000000,AutoExposureSpeedUp=3.000000,AutoExposureSpeedDown=1.000000,AutoExposureBias=0.330000,HistogramLogMin=-8.000000,HistogramLogMax=4.000000,LensFlareIntensity=1.000000,LensFlareTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),LensFlareBokehSize=3.000000,LensFlareThreshold=8.000000,LensFlareBokehShape=None,LensFlareTints[0]=(R=1.000000,G=0.800000,B=0.400000,A=0.600000),LensFlareTints[1]=(R=1.000000,G=1.000000,B=0.600000,A=0.530000),LensFlareTints[2]=(R=0.800000,G=0.800000,B=1.000000,A=0.460000),LensFlareTints[3]=(R=0.500000,G=1.000000,B=0.400000,A=0.390000),LensFlareTints[4]=(R=0.500000,G=0.800000,B=1.000000,A=0.310000),LensFlareTints[5]=(R=0.900000,G=1.000000,B=0.800000,A=0.270000),LensFlareTints[6]=(R=1.000000,G=0.800000,B=0.400000,A=0.220000),LensFlareTints[7]=(R=0.900000,G=0.700000,B=0.700000,A=0.150000),VignetteIntensity=0.161468,GrainJitter=0.000000,GrainIntensity=0.000000,AmbientOcclusionIntensity=1.000000,AmbientOcclusionStaticFraction=1.000000,AmbientOcclusionRadius=73.477997,AmbientOcclusionRadiusInWS=False,AmbientOcclusionFadeDistance=8000.000000,AmbientOcclusionFadeRadius=5000.000000,AmbientOcclusionDistance=80.000000,AmbientOcclusionPower=1.200000,AmbientOcclusionBias=3.000000,AmbientOcclusionQuality=100.000000,AmbientOcclusionMipBlend=0.600000,AmbientOcclusionMipScale=1.700000,AmbientOcclusionMipThreshold=0.010000,IndirectLightingColor=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),IndirectLightingIntensity=1.000000,ColorGradingIntensity=0.000000,ColorGradingLUT=Texture2D'/Engine/EditorResources/RGBTable16x1_AssetViewer.RGBTable16x1_AssetViewer',DepthOfFieldMethod=DOFM_BokehDOF,bMobileHQGaussian=False,DepthOfFieldFstop=4.000000,DepthOfFieldSensorWidth=24.576000,DepthOfFieldFocalDistance=1000.000000,DepthOfFieldDepthBlurAmount=1.000000,DepthOfFieldDepthBlurRadius=0.000000,DepthOfFieldFocalRegion=0.000000,DepthOfFieldNearTransitionRegion=300.000000,DepthOfFieldFarTransitionRegion=500.000000,DepthOfFieldScale=0.000000,DepthOfFieldMaxBokehSize=15.000000,DepthOfFieldNearBlurSize=15.000000,DepthOfFieldFarBlurSize=15.000000,DepthOfFieldBokehShape=None,DepthOfFieldOcclusion=0.400000,DepthOfFieldColorThreshold=1.000000,DepthOfFieldSizeThreshold=0.080000,DepthOfFieldSkyFocusDistance=0.000000,DepthOfFieldVignetteSize=200.000000,MotionBlurAmount=0.500000,MotionBlurMax=5.000000,MotionBlurPerObjectSize=0.500000,LPVIntensity=1.000000,LPVVplInjectionBias=0.640000,LPVSize=5312.000000,LPVSecondaryOcclusionIntensity=0.000000,LPVSecondaryBounceIntensity=0.000000,LPVGeometryVolumeBias=0.384000,LPVEmissiveInjectionIntensity=1.000000,LPVDirectionalOcclusionIntensity=0.000000,LPVDirectionalOcclusionRadius=8.000000,LPVDiffuseOcclusionExponent=1.000000,LPVSpecularOcclusionExponent=7.000000,LPVDiffuseOcclusionIntensity=1.000000,LPVSpecularOcclusionIntensity=1.000000,ScreenSpaceReflectionIntensity=100.000000,ScreenSpaceReflectionQuality=100.000000,ScreenSpaceReflectionMaxRoughness=1.000000,ScreenPercentage=100.000000,WeightedBlendables=(Array=),Blendables=),bPostProcessingEnabled=True,LightingRigRotation=109.389069,RotationSpeed=2.000000,DirectionalLightRotation=(Pitch=-39.999985,Yaw=-67.500015,Roll=0.000000))\n-Profiles=(ProfileName=\"Default\",DirectionalLightIntensity=2.620000,DirectionalLightColor=(R=0.990000,G=0.839850,B=0.732600,A=1.000000),SkyLightIntensity=0.880000,bRotateLightingRig=False,bShowEnvironment=True,bShowFloor=True,EnvironmentCubeMapPath=\"/Engine/EditorMaterials/AssetViewer/EpicQuadPanorama_CC+EV1.EpicQuadPanorama_CC+EV1\",PostProcessingSettings=(bOverride_WhiteTemp=True,bOverride_WhiteTint=False,bOverride_ColorSaturation=True,bOverride_ColorContrast=True,bOverride_ColorGamma=True,bOverride_ColorGain=True,bOverride_ColorOffset=True,bOverride_ColorSaturationShadows=False,bOverride_ColorContrastShadows=False,bOverride_ColorGammaShadows=False,bOverride_ColorGainShadows=False,bOverride_ColorOffsetShadows=False,bOverride_ColorSaturationMidtones=False,bOverride_ColorContrastMidtones=False,bOverride_ColorGammaMidtones=False,bOverride_ColorGainMidtones=False,bOverride_ColorOffsetMidtones=False,bOverride_ColorSaturationHighlights=False,bOverride_ColorContrastHighlights=False,bOverride_ColorGammaHighlights=False,bOverride_ColorGainHighlights=False,bOverride_ColorOffsetHighlights=False,bOverride_ColorCorrectionShadowsMax=False,bOverride_ColorCorrectionHighlightsMin=False,bOverride_FilmWhitePoint=False,bOverride_FilmSaturation=False,bOverride_FilmChannelMixerRed=False,bOverride_FilmChannelMixerGreen=False,bOverride_FilmChannelMixerBlue=False,bOverride_FilmContrast=False,bOverride_FilmDynamicRange=False,bOverride_FilmHealAmount=False,bOverride_FilmToeAmount=False,bOverride_FilmShadowTint=False,bOverride_FilmShadowTintBlend=False,bOverride_FilmShadowTintAmount=False,bOverride_FilmSlope=True,bOverride_FilmToe=True,bOverride_FilmShoulder=True,bOverride_FilmBlackClip=True,bOverride_FilmWhiteClip=True,bOverride_SceneColorTint=False,bOverride_SceneFringeIntensity=False,bOverride_AmbientCubemapTint=False,bOverride_AmbientCubemapIntensity=False,bOverride_BloomIntensity=True,bOverride_BloomThreshold=False,bOverride_Bloom1Tint=False,bOverride_Bloom1Size=False,bOverride_Bloom2Size=False,bOverride_Bloom2Tint=False,bOverride_Bloom3Tint=False,bOverride_Bloom3Size=False,bOverride_Bloom4Tint=False,bOverride_Bloom4Size=False,bOverride_Bloom5Tint=False,bOverride_Bloom5Size=False,bOverride_Bloom6Tint=False,bOverride_Bloom6Size=False,bOverride_BloomSizeScale=False,bOverride_BloomDirtMaskIntensity=False,bOverride_BloomDirtMaskTint=False,bOverride_BloomDirtMask=False,bOverride_AutoExposureMethod=True,bOverride_AutoExposureLowPercent=False,bOverride_AutoExposureHighPercent=False,bOverride_AutoExposureMinBrightness=True,bOverride_AutoExposureMaxBrightness=True,bOverride_AutoExposureSpeedUp=False,bOverride_AutoExposureSpeedDown=False,bOverride_AutoExposureBias=True,bOverride_HistogramLogMin=True,bOverride_HistogramLogMax=True,bOverride_LensFlareIntensity=False,bOverride_LensFlareTint=False,bOverride_LensFlareTints=False,bOverride_LensFlareBokehSize=False,bOverride_LensFlareBokehShape=False,bOverride_LensFlareThreshold=False,bOverride_VignetteIntensity=True,bOverride_GrainIntensity=False,bOverride_GrainJitter=False,bOverride_AmbientOcclusionIntensity=True,bOverride_AmbientOcclusionStaticFraction=True,bOverride_AmbientOcclusionRadius=True,bOverride_AmbientOcclusionFadeDistance=False,bOverride_AmbientOcclusionFadeRadius=False,bOverride_AmbientOcclusionDistance=False,bOverride_AmbientOcclusionRadiusInWS=False,bOverride_AmbientOcclusionPower=True,bOverride_AmbientOcclusionBias=True,bOverride_AmbientOcclusionQuality=True,bOverride_AmbientOcclusionMipBlend=True,bOverride_AmbientOcclusionMipScale=True,bOverride_AmbientOcclusionMipThreshold=True,bOverride_LPVIntensity=False,bOverride_LPVDirectionalOcclusionIntensity=False,bOverride_LPVDirectionalOcclusionRadius=False,bOverride_LPVDiffuseOcclusionExponent=False,bOverride_LPVSpecularOcclusionExponent=False,bOverride_LPVDiffuseOcclusionIntensity=False,bOverride_LPVSpecularOcclusionIntensity=False,bOverride_LPVSize=False,bOverride_LPVSecondaryOcclusionIntensity=False,bOverride_LPVSecondaryBounceIntensity=False,bOverride_LPVGeometryVolumeBias=False,bOverride_LPVVplInjectionBias=False,bOverride_LPVEmissiveInjectionIntensity=False,bOverride_IndirectLightingColor=False,bOverride_IndirectLightingIntensity=False,bOverride_ColorGradingIntensity=True,bOverride_ColorGradingLUT=True,bOverride_DepthOfFieldFocalDistance=False,bOverride_DepthOfFieldFstop=False,bOverride_DepthOfFieldSensorWidth=False,bOverride_DepthOfFieldDepthBlurRadius=False,bOverride_DepthOfFieldDepthBlurAmount=False,bOverride_DepthOfFieldFocalRegion=False,bOverride_DepthOfFieldNearTransitionRegion=False,bOverride_DepthOfFieldFarTransitionRegion=False,bOverride_DepthOfFieldScale=True,bOverride_DepthOfFieldMaxBokehSize=False,bOverride_DepthOfFieldNearBlurSize=False,bOverride_DepthOfFieldFarBlurSize=False,bOverride_DepthOfFieldMethod=True,bOverride_MobileHQGaussian=False,bOverride_DepthOfFieldBokehShape=False,bOverride_DepthOfFieldOcclusion=False,bOverride_DepthOfFieldColorThreshold=False,bOverride_DepthOfFieldSizeThreshold=False,bOverride_DepthOfFieldSkyFocusDistance=False,bOverride_DepthOfFieldVignetteSize=False,bOverride_MotionBlurAmount=False,bOverride_MotionBlurMax=False,bOverride_MotionBlurPerObjectSize=False,bOverride_ScreenPercentage=False,bOverride_ScreenSpaceReflectionIntensity=True,bOverride_ScreenSpaceReflectionQuality=True,bOverride_ScreenSpaceReflectionMaxRoughness=True,bOverride_ScreenSpaceReflectionRoughnessScale=False,WhiteTemp=6700.000000,WhiteTint=0.000000,ColorSaturation=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorContrast=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGamma=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGain=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorOffset=(X=0.005000,Y=0.005000,Z=0.005000,W=0.000000),ColorSaturationShadows=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorContrastShadows=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGammaShadows=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGainShadows=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorOffsetShadows=(X=0.000000,Y=0.000000,Z=0.000000,W=0.000000),ColorCorrectionShadowsMax=0.090000,ColorSaturationMidtones=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorContrastMidtones=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGammaMidtones=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGainMidtones=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorOffsetMidtones=(X=0.000000,Y=0.000000,Z=0.000000,W=0.000000),ColorSaturationHighlights=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorContrastHighlights=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGammaHighlights=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGainHighlights=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorOffsetHighlights=(X=0.000000,Y=0.000000,Z=0.000000,W=0.000000),ColorCorrectionHighlightsMin=0.500000,FilmWhitePoint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),FilmShadowTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),FilmShadowTintBlend=0.500000,FilmShadowTintAmount=0.000000,FilmSaturation=1.000000,FilmChannelMixerRed=(R=1.000000,G=0.000000,B=0.000000,A=1.000000),FilmChannelMixerGreen=(R=0.000000,G=1.000000,B=0.000000,A=1.000000),FilmChannelMixerBlue=(R=0.000000,G=0.000000,B=1.000000,A=1.000000),FilmContrast=0.030000,FilmToeAmount=1.000000,FilmHealAmount=0.180000,FilmDynamicRange=4.000000,FilmSlope=0.880000,FilmToe=0.550000,FilmShoulder=0.260000,FilmBlackClip=0.000000,FilmWhiteClip=0.040000,SceneColorTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),SceneFringeIntensity=0.000000,BloomIntensity=1.000000,BloomThreshold=1.000000,BloomSizeScale=4.000000,Bloom1Size=1.000000,Bloom2Size=4.000000,Bloom3Size=16.000000,Bloom4Size=32.000000,Bloom5Size=64.000000,Bloom6Size=64.000000,Bloom1Tint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),Bloom2Tint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),Bloom3Tint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),Bloom4Tint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),Bloom5Tint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),Bloom6Tint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),BloomDirtMaskIntensity=1.000000,BloomDirtMaskTint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),BloomDirtMask=None,AmbientCubemapTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),AmbientCubemapIntensity=1.000000,AmbientCubemap=None,AutoExposureMethod=AEM_Histogram,AutoExposureLowPercent=80.000000,AutoExposureHighPercent=98.300003,AutoExposureMinBrightness=1.000000,AutoExposureMaxBrightness=1.000000,AutoExposureSpeedUp=3.000000,AutoExposureSpeedDown=1.000000,AutoExposureBias=0.330000,HistogramLogMin=-8.000000,HistogramLogMax=4.000000,LensFlareIntensity=1.000000,LensFlareTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),LensFlareBokehSize=3.000000,LensFlareThreshold=8.000000,LensFlareBokehShape=None,LensFlareTints[0]=(R=1.000000,G=0.800000,B=0.400000,A=0.600000),LensFlareTints[1]=(R=1.000000,G=1.000000,B=0.600000,A=0.530000),LensFlareTints[2]=(R=0.800000,G=0.800000,B=1.000000,A=0.460000),LensFlareTints[3]=(R=0.500000,G=1.000000,B=0.400000,A=0.390000),LensFlareTints[4]=(R=0.500000,G=0.800000,B=1.000000,A=0.310000),LensFlareTints[5]=(R=0.900000,G=1.000000,B=0.800000,A=0.270000),LensFlareTints[6]=(R=1.000000,G=0.800000,B=0.400000,A=0.220000),LensFlareTints[7]=(R=0.900000,G=0.700000,B=0.700000,A=0.150000),VignetteIntensity=0.161468,GrainJitter=0.000000,GrainIntensity=0.000000,AmbientOcclusionIntensity=1.000000,AmbientOcclusionStaticFraction=1.000000,AmbientOcclusionRadius=73.477997,AmbientOcclusionRadiusInWS=False,AmbientOcclusionFadeDistance=8000.000000,AmbientOcclusionFadeRadius=5000.000000,AmbientOcclusionDistance=80.000000,AmbientOcclusionPower=1.200000,AmbientOcclusionBias=3.000000,AmbientOcclusionQuality=100.000000,AmbientOcclusionMipBlend=0.600000,AmbientOcclusionMipScale=1.700000,AmbientOcclusionMipThreshold=0.010000,IndirectLightingColor=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),IndirectLightingIntensity=1.000000,ColorGradingIntensity=0.000000,ColorGradingLUT=Texture2D'/Engine/EditorResources/RGBTable16x1_AssetViewer.RGBTable16x1_AssetViewer',DepthOfFieldMethod=DOFM_BokehDOF,bMobileHQGaussian=False,DepthOfFieldFstop=4.000000,DepthOfFieldSensorWidth=24.576000,DepthOfFieldFocalDistance=1000.000000,DepthOfFieldDepthBlurAmount=1.000000,DepthOfFieldDepthBlurRadius=0.000000,DepthOfFieldFocalRegion=0.000000,DepthOfFieldNearTransitionRegion=300.000000,DepthOfFieldFarTransitionRegion=500.000000,DepthOfFieldScale=0.000000,DepthOfFieldMaxBokehSize=15.000000,DepthOfFieldNearBlurSize=15.000000,DepthOfFieldFarBlurSize=15.000000,DepthOfFieldBokehShape=None,DepthOfFieldOcclusion=0.400000,DepthOfFieldColorThreshold=1.000000,DepthOfFieldSizeThreshold=0.080000,DepthOfFieldSkyFocusDistance=0.000000,DepthOfFieldVignetteSize=200.000000,MotionBlurAmount=0.500000,MotionBlurMax=5.000000,MotionBlurPerObjectSize=0.500000,LPVIntensity=1.000000,LPVVplInjectionBias=0.640000,LPVSize=5312.000000,LPVSecondaryOcclusionIntensity=0.000000,LPVSecondaryBounceIntensity=0.000000,LPVGeometryVolumeBias=0.384000,LPVEmissiveInjectionIntensity=1.000000,LPVDirectionalOcclusionIntensity=0.000000,LPVDirectionalOcclusionRadius=8.000000,LPVDiffuseOcclusionExponent=1.000000,LPVSpecularOcclusionExponent=7.000000,LPVDiffuseOcclusionIntensity=1.000000,LPVSpecularOcclusionIntensity=1.000000,ScreenSpaceReflectionIntensity=100.000000,ScreenSpaceReflectionQuality=100.000000,ScreenSpaceReflectionMaxRoughness=1.000000,ScreenPercentage=100.000000,WeightedBlendables=(Array=),Blendables=),bPostProcessingEnabled=True,LightingRigRotation=109.389069,RotationSpeed=2.000000,DirectionalLightRotation=(Pitch=-39.999985,Yaw=-67.500015,Roll=0.000000))\n-Profiles=(ProfileName=\"Default\",DirectionalLightIntensity=2.620000,DirectionalLightColor=(R=0.990000,G=0.839850,B=0.732600,A=1.000000),SkyLightIntensity=0.880000,bRotateLightingRig=False,bShowEnvironment=True,bShowFloor=True,EnvironmentCubeMapPath=\"/Engine/EditorMaterials/AssetViewer/EpicQuadPanorama_CC+EV1.EpicQuadPanorama_CC+EV1\",PostProcessingSettings=(bOverride_WhiteTemp=True,bOverride_WhiteTint=False,bOverride_ColorSaturation=True,bOverride_ColorContrast=True,bOverride_ColorGamma=True,bOverride_ColorGain=True,bOverride_ColorOffset=True,bOverride_ColorSaturationShadows=False,bOverride_ColorContrastShadows=False,bOverride_ColorGammaShadows=False,bOverride_ColorGainShadows=False,bOverride_ColorOffsetShadows=False,bOverride_ColorSaturationMidtones=False,bOverride_ColorContrastMidtones=False,bOverride_ColorGammaMidtones=False,bOverride_ColorGainMidtones=False,bOverride_ColorOffsetMidtones=False,bOverride_ColorSaturationHighlights=False,bOverride_ColorContrastHighlights=False,bOverride_ColorGammaHighlights=False,bOverride_ColorGainHighlights=False,bOverride_ColorOffsetHighlights=False,bOverride_ColorCorrectionShadowsMax=False,bOverride_ColorCorrectionHighlightsMin=False,bOverride_FilmWhitePoint=False,bOverride_FilmSaturation=False,bOverride_FilmChannelMixerRed=False,bOverride_FilmChannelMixerGreen=False,bOverride_FilmChannelMixerBlue=False,bOverride_FilmContrast=False,bOverride_FilmDynamicRange=False,bOverride_FilmHealAmount=False,bOverride_FilmToeAmount=False,bOverride_FilmShadowTint=False,bOverride_FilmShadowTintBlend=False,bOverride_FilmShadowTintAmount=False,bOverride_FilmSlope=True,bOverride_FilmToe=True,bOverride_FilmShoulder=True,bOverride_FilmBlackClip=True,bOverride_FilmWhiteClip=True,bOverride_SceneColorTint=False,bOverride_SceneFringeIntensity=False,bOverride_AmbientCubemapTint=False,bOverride_AmbientCubemapIntensity=False,bOverride_BloomIntensity=True,bOverride_BloomThreshold=False,bOverride_Bloom1Tint=False,bOverride_Bloom1Size=False,bOverride_Bloom2Size=False,bOverride_Bloom2Tint=False,bOverride_Bloom3Tint=False,bOverride_Bloom3Size=False,bOverride_Bloom4Tint=False,bOverride_Bloom4Size=False,bOverride_Bloom5Tint=False,bOverride_Bloom5Size=False,bOverride_Bloom6Tint=False,bOverride_Bloom6Size=False,bOverride_BloomSizeScale=False,bOverride_BloomDirtMaskIntensity=False,bOverride_BloomDirtMaskTint=False,bOverride_BloomDirtMask=False,bOverride_AutoExposureMethod=True,bOverride_AutoExposureLowPercent=False,bOverride_AutoExposureHighPercent=False,bOverride_AutoExposureMinBrightness=True,bOverride_AutoExposureMaxBrightness=True,bOverride_AutoExposureSpeedUp=False,bOverride_AutoExposureSpeedDown=False,bOverride_AutoExposureBias=True,bOverride_HistogramLogMin=True,bOverride_HistogramLogMax=True,bOverride_LensFlareIntensity=False,bOverride_LensFlareTint=False,bOverride_LensFlareTints=False,bOverride_LensFlareBokehSize=False,bOverride_LensFlareBokehShape=False,bOverride_LensFlareThreshold=False,bOverride_VignetteIntensity=True,bOverride_GrainIntensity=False,bOverride_GrainJitter=False,bOverride_AmbientOcclusionIntensity=True,bOverride_AmbientOcclusionStaticFraction=True,bOverride_AmbientOcclusionRadius=True,bOverride_AmbientOcclusionFadeDistance=False,bOverride_AmbientOcclusionFadeRadius=False,bOverride_AmbientOcclusionDistance=False,bOverride_AmbientOcclusionRadiusInWS=False,bOverride_AmbientOcclusionPower=True,bOverride_AmbientOcclusionBias=True,bOverride_AmbientOcclusionQuality=True,bOverride_AmbientOcclusionMipBlend=True,bOverride_AmbientOcclusionMipScale=True,bOverride_AmbientOcclusionMipThreshold=True,bOverride_LPVIntensity=False,bOverride_LPVDirectionalOcclusionIntensity=False,bOverride_LPVDirectionalOcclusionRadius=False,bOverride_LPVDiffuseOcclusionExponent=False,bOverride_LPVSpecularOcclusionExponent=False,bOverride_LPVDiffuseOcclusionIntensity=False,bOverride_LPVSpecularOcclusionIntensity=False,bOverride_LPVSize=False,bOverride_LPVSecondaryOcclusionIntensity=False,bOverride_LPVSecondaryBounceIntensity=False,bOverride_LPVGeometryVolumeBias=False,bOverride_LPVVplInjectionBias=False,bOverride_LPVEmissiveInjectionIntensity=False,bOverride_IndirectLightingColor=False,bOverride_IndirectLightingIntensity=False,bOverride_ColorGradingIntensity=True,bOverride_ColorGradingLUT=True,bOverride_DepthOfFieldFocalDistance=False,bOverride_DepthOfFieldFstop=False,bOverride_DepthOfFieldSensorWidth=False,bOverride_DepthOfFieldDepthBlurRadius=False,bOverride_DepthOfFieldDepthBlurAmount=False,bOverride_DepthOfFieldFocalRegion=False,bOverride_DepthOfFieldNearTransitionRegion=False,bOverride_DepthOfFieldFarTransitionRegion=False,bOverride_DepthOfFieldScale=True,bOverride_DepthOfFieldMaxBokehSize=False,bOverride_DepthOfFieldNearBlurSize=False,bOverride_DepthOfFieldFarBlurSize=False,bOverride_DepthOfFieldMethod=True,bOverride_MobileHQGaussian=False,bOverride_DepthOfFieldBokehShape=False,bOverride_DepthOfFieldOcclusion=False,bOverride_DepthOfFieldColorThreshold=False,bOverride_DepthOfFieldSizeThreshold=False,bOverride_DepthOfFieldSkyFocusDistance=False,bOverride_DepthOfFieldVignetteSize=False,bOverride_MotionBlurAmount=False,bOverride_MotionBlurMax=False,bOverride_MotionBlurPerObjectSize=False,bOverride_ScreenPercentage=False,bOverride_ScreenSpaceReflectionIntensity=True,bOverride_ScreenSpaceReflectionQuality=True,bOverride_ScreenSpaceReflectionMaxRoughness=True,bOverride_ScreenSpaceReflectionRoughnessScale=False,WhiteTemp=6700.000000,WhiteTint=0.000000,ColorSaturation=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorContrast=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGamma=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGain=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorOffset=(X=0.005000,Y=0.005000,Z=0.005000,W=0.000000),ColorSaturationShadows=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorContrastShadows=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGammaShadows=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGainShadows=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorOffsetShadows=(X=0.000000,Y=0.000000,Z=0.000000,W=0.000000),ColorCorrectionShadowsMax=0.090000,ColorSaturationMidtones=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorContrastMidtones=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGammaMidtones=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGainMidtones=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorOffsetMidtones=(X=0.000000,Y=0.000000,Z=0.000000,W=0.000000),ColorSaturationHighlights=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorContrastHighlights=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGammaHighlights=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGainHighlights=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorOffsetHighlights=(X=0.000000,Y=0.000000,Z=0.000000,W=0.000000),ColorCorrectionHighlightsMin=0.500000,FilmWhitePoint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),FilmShadowTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),FilmShadowTintBlend=0.500000,FilmShadowTintAmount=0.000000,FilmSaturation=1.000000,FilmChannelMixerRed=(R=1.000000,G=0.000000,B=0.000000,A=1.000000),FilmChannelMixerGreen=(R=0.000000,G=1.000000,B=0.000000,A=1.000000),FilmChannelMixerBlue=(R=0.000000,G=0.000000,B=1.000000,A=1.000000),FilmContrast=0.030000,FilmToeAmount=1.000000,FilmHealAmount=0.180000,FilmDynamicRange=4.000000,FilmSlope=0.880000,FilmToe=0.550000,FilmShoulder=0.260000,FilmBlackClip=0.000000,FilmWhiteClip=0.040000,SceneColorTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),SceneFringeIntensity=0.000000,BloomIntensity=1.000000,BloomThreshold=1.000000,BloomSizeScale=4.000000,Bloom1Size=1.000000,Bloom2Size=4.000000,Bloom3Size=16.000000,Bloom4Size=32.000000,Bloom5Size=64.000000,Bloom6Size=64.000000,Bloom1Tint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),Bloom2Tint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),Bloom3Tint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),Bloom4Tint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),Bloom5Tint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),Bloom6Tint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),BloomDirtMaskIntensity=1.000000,BloomDirtMaskTint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),BloomDirtMask=None,AmbientCubemapTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),AmbientCubemapIntensity=1.000000,AmbientCubemap=None,AutoExposureMethod=AEM_Histogram,AutoExposureLowPercent=80.000000,AutoExposureHighPercent=98.300003,AutoExposureMinBrightness=1.000000,AutoExposureMaxBrightness=1.000000,AutoExposureSpeedUp=3.000000,AutoExposureSpeedDown=1.000000,AutoExposureBias=0.330000,HistogramLogMin=-8.000000,HistogramLogMax=4.000000,LensFlareIntensity=1.000000,LensFlareTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),LensFlareBokehSize=3.000000,LensFlareThreshold=8.000000,LensFlareBokehShape=None,LensFlareTints[0]=(R=1.000000,G=0.800000,B=0.400000,A=0.600000),LensFlareTints[1]=(R=1.000000,G=1.000000,B=0.600000,A=0.530000),LensFlareTints[2]=(R=0.800000,G=0.800000,B=1.000000,A=0.460000),LensFlareTints[3]=(R=0.500000,G=1.000000,B=0.400000,A=0.390000),LensFlareTints[4]=(R=0.500000,G=0.800000,B=1.000000,A=0.310000),LensFlareTints[5]=(R=0.900000,G=1.000000,B=0.800000,A=0.270000),LensFlareTints[6]=(R=1.000000,G=0.800000,B=0.400000,A=0.220000),LensFlareTints[7]=(R=0.900000,G=0.700000,B=0.700000,A=0.150000),VignetteIntensity=0.161468,GrainJitter=0.000000,GrainIntensity=0.000000,AmbientOcclusionIntensity=1.000000,AmbientOcclusionStaticFraction=1.000000,AmbientOcclusionRadius=73.477997,AmbientOcclusionRadiusInWS=False,AmbientOcclusionFadeDistance=8000.000000,AmbientOcclusionFadeRadius=5000.000000,AmbientOcclusionDistance=80.000000,AmbientOcclusionPower=1.200000,AmbientOcclusionBias=3.000000,AmbientOcclusionQuality=100.000000,AmbientOcclusionMipBlend=0.600000,AmbientOcclusionMipScale=1.700000,AmbientOcclusionMipThreshold=0.010000,IndirectLightingColor=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),IndirectLightingIntensity=1.000000,ColorGradingIntensity=0.000000,ColorGradingLUT=Texture2D'/Engine/EditorResources/RGBTable16x1_AssetViewer.RGBTable16x1_AssetViewer',DepthOfFieldMethod=DOFM_BokehDOF,bMobileHQGaussian=False,DepthOfFieldFstop=4.000000,DepthOfFieldSensorWidth=24.576000,DepthOfFieldFocalDistance=1000.000000,DepthOfFieldDepthBlurAmount=1.000000,DepthOfFieldDepthBlurRadius=0.000000,DepthOfFieldFocalRegion=0.000000,DepthOfFieldNearTransitionRegion=300.000000,DepthOfFieldFarTransitionRegion=500.000000,DepthOfFieldScale=0.000000,DepthOfFieldMaxBokehSize=15.000000,DepthOfFieldNearBlurSize=15.000000,DepthOfFieldFarBlurSize=15.000000,DepthOfFieldBokehShape=None,DepthOfFieldOcclusion=0.400000,DepthOfFieldColorThreshold=1.000000,DepthOfFieldSizeThreshold=0.080000,DepthOfFieldSkyFocusDistance=0.000000,DepthOfFieldVignetteSize=200.000000,MotionBlurAmount=0.500000,MotionBlurMax=5.000000,MotionBlurPerObjectSize=0.500000,LPVIntensity=1.000000,LPVVplInjectionBias=0.640000,LPVSize=5312.000000,LPVSecondaryOcclusionIntensity=0.000000,LPVSecondaryBounceIntensity=0.000000,LPVGeometryVolumeBias=0.384000,LPVEmissiveInjectionIntensity=1.000000,LPVDirectionalOcclusionIntensity=0.000000,LPVDirectionalOcclusionRadius=8.000000,LPVDiffuseOcclusionExponent=1.000000,LPVSpecularOcclusionExponent=7.000000,LPVDiffuseOcclusionIntensity=1.000000,LPVSpecularOcclusionIntensity=1.000000,ScreenSpaceReflectionIntensity=100.000000,ScreenSpaceReflectionQuality=100.000000,ScreenSpaceReflectionMaxRoughness=1.000000,ScreenPercentage=100.000000,WeightedBlendables=(Array=),Blendables=),bPostProcessingEnabled=True,LightingRigRotation=109.389069,RotationSpeed=2.000000,DirectionalLightRotation=(Pitch=-39.999985,Yaw=-67.500015,Roll=0.000000))\n-Profiles=(ProfileName=\"Default\",DirectionalLightIntensity=2.620000,DirectionalLightColor=(R=0.990000,G=0.839850,B=0.732600,A=1.000000),SkyLightIntensity=0.880000,bRotateLightingRig=False,bShowEnvironment=True,bShowFloor=True,EnvironmentCubeMapPath=\"/Engine/EditorMaterials/AssetViewer/EpicQuadPanorama_CC+EV1.EpicQuadPanorama_CC+EV1\",PostProcessingSettings=(bOverride_WhiteTemp=True,bOverride_WhiteTint=False,bOverride_ColorSaturation=True,bOverride_ColorContrast=True,bOverride_ColorGamma=True,bOverride_ColorGain=True,bOverride_ColorOffset=True,bOverride_ColorSaturationShadows=False,bOverride_ColorContrastShadows=False,bOverride_ColorGammaShadows=False,bOverride_ColorGainShadows=False,bOverride_ColorOffsetShadows=False,bOverride_ColorSaturationMidtones=False,bOverride_ColorContrastMidtones=False,bOverride_ColorGammaMidtones=False,bOverride_ColorGainMidtones=False,bOverride_ColorOffsetMidtones=False,bOverride_ColorSaturationHighlights=False,bOverride_ColorContrastHighlights=False,bOverride_ColorGammaHighlights=False,bOverride_ColorGainHighlights=False,bOverride_ColorOffsetHighlights=False,bOverride_ColorCorrectionShadowsMax=False,bOverride_ColorCorrectionHighlightsMin=False,bOverride_FilmWhitePoint=False,bOverride_FilmSaturation=False,bOverride_FilmChannelMixerRed=False,bOverride_FilmChannelMixerGreen=False,bOverride_FilmChannelMixerBlue=False,bOverride_FilmContrast=False,bOverride_FilmDynamicRange=False,bOverride_FilmHealAmount=False,bOverride_FilmToeAmount=False,bOverride_FilmShadowTint=False,bOverride_FilmShadowTintBlend=False,bOverride_FilmShadowTintAmount=False,bOverride_FilmSlope=True,bOverride_FilmToe=True,bOverride_FilmShoulder=True,bOverride_FilmBlackClip=True,bOverride_FilmWhiteClip=True,bOverride_SceneColorTint=False,bOverride_SceneFringeIntensity=False,bOverride_AmbientCubemapTint=False,bOverride_AmbientCubemapIntensity=False,bOverride_BloomIntensity=True,bOverride_BloomThreshold=False,bOverride_Bloom1Tint=False,bOverride_Bloom1Size=False,bOverride_Bloom2Size=False,bOverride_Bloom2Tint=False,bOverride_Bloom3Tint=False,bOverride_Bloom3Size=False,bOverride_Bloom4Tint=False,bOverride_Bloom4Size=False,bOverride_Bloom5Tint=False,bOverride_Bloom5Size=False,bOverride_Bloom6Tint=False,bOverride_Bloom6Size=False,bOverride_BloomSizeScale=False,bOverride_BloomDirtMaskIntensity=False,bOverride_BloomDirtMaskTint=False,bOverride_BloomDirtMask=False,bOverride_AutoExposureMethod=True,bOverride_AutoExposureLowPercent=False,bOverride_AutoExposureHighPercent=False,bOverride_AutoExposureMinBrightness=True,bOverride_AutoExposureMaxBrightness=True,bOverride_AutoExposureSpeedUp=False,bOverride_AutoExposureSpeedDown=False,bOverride_AutoExposureBias=True,bOverride_HistogramLogMin=True,bOverride_HistogramLogMax=True,bOverride_LensFlareIntensity=False,bOverride_LensFlareTint=False,bOverride_LensFlareTints=False,bOverride_LensFlareBokehSize=False,bOverride_LensFlareBokehShape=False,bOverride_LensFlareThreshold=False,bOverride_VignetteIntensity=True,bOverride_GrainIntensity=False,bOverride_GrainJitter=False,bOverride_AmbientOcclusionIntensity=True,bOverride_AmbientOcclusionStaticFraction=True,bOverride_AmbientOcclusionRadius=True,bOverride_AmbientOcclusionFadeDistance=False,bOverride_AmbientOcclusionFadeRadius=False,bOverride_AmbientOcclusionDistance=False,bOverride_AmbientOcclusionRadiusInWS=False,bOverride_AmbientOcclusionPower=True,bOverride_AmbientOcclusionBias=True,bOverride_AmbientOcclusionQuality=True,bOverride_AmbientOcclusionMipBlend=True,bOverride_AmbientOcclusionMipScale=True,bOverride_AmbientOcclusionMipThreshold=True,bOverride_LPVIntensity=False,bOverride_LPVDirectionalOcclusionIntensity=False,bOverride_LPVDirectionalOcclusionRadius=False,bOverride_LPVDiffuseOcclusionExponent=False,bOverride_LPVSpecularOcclusionExponent=False,bOverride_LPVDiffuseOcclusionIntensity=False,bOverride_LPVSpecularOcclusionIntensity=False,bOverride_LPVSize=False,bOverride_LPVSecondaryOcclusionIntensity=False,bOverride_LPVSecondaryBounceIntensity=False,bOverride_LPVGeometryVolumeBias=False,bOverride_LPVVplInjectionBias=False,bOverride_LPVEmissiveInjectionIntensity=False,bOverride_IndirectLightingColor=False,bOverride_IndirectLightingIntensity=False,bOverride_ColorGradingIntensity=True,bOverride_ColorGradingLUT=True,bOverride_DepthOfFieldFocalDistance=False,bOverride_DepthOfFieldFstop=False,bOverride_DepthOfFieldSensorWidth=False,bOverride_DepthOfFieldDepthBlurRadius=False,bOverride_DepthOfFieldDepthBlurAmount=False,bOverride_DepthOfFieldFocalRegion=False,bOverride_DepthOfFieldNearTransitionRegion=False,bOverride_DepthOfFieldFarTransitionRegion=False,bOverride_DepthOfFieldScale=True,bOverride_DepthOfFieldMaxBokehSize=False,bOverride_DepthOfFieldNearBlurSize=False,bOverride_DepthOfFieldFarBlurSize=False,bOverride_DepthOfFieldMethod=True,bOverride_MobileHQGaussian=False,bOverride_DepthOfFieldBokehShape=False,bOverride_DepthOfFieldOcclusion=False,bOverride_DepthOfFieldColorThreshold=False,bOverride_DepthOfFieldSizeThreshold=False,bOverride_DepthOfFieldSkyFocusDistance=False,bOverride_DepthOfFieldVignetteSize=False,bOverride_MotionBlurAmount=False,bOverride_MotionBlurMax=False,bOverride_MotionBlurPerObjectSize=False,bOverride_ScreenPercentage=False,bOverride_ScreenSpaceReflectionIntensity=True,bOverride_ScreenSpaceReflectionQuality=True,bOverride_ScreenSpaceReflectionMaxRoughness=True,bOverride_ScreenSpaceReflectionRoughnessScale=False,WhiteTemp=6700.000000,WhiteTint=0.000000,ColorSaturation=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorContrast=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGamma=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGain=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorOffset=(X=0.005000,Y=0.005000,Z=0.005000,W=0.000000),ColorSaturationShadows=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorContrastShadows=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGammaShadows=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGainShadows=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorOffsetShadows=(X=0.000000,Y=0.000000,Z=0.000000,W=0.000000),ColorCorrectionShadowsMax=0.090000,ColorSaturationMidtones=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorContrastMidtones=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGammaMidtones=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGainMidtones=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorOffsetMidtones=(X=0.000000,Y=0.000000,Z=0.000000,W=0.000000),ColorSaturationHighlights=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorContrastHighlights=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGammaHighlights=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGainHighlights=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorOffsetHighlights=(X=0.000000,Y=0.000000,Z=0.000000,W=0.000000),ColorCorrectionHighlightsMin=0.500000,FilmWhitePoint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),FilmShadowTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),FilmShadowTintBlend=0.500000,FilmShadowTintAmount=0.000000,FilmSaturation=1.000000,FilmChannelMixerRed=(R=1.000000,G=0.000000,B=0.000000,A=1.000000),FilmChannelMixerGreen=(R=0.000000,G=1.000000,B=0.000000,A=1.000000),FilmChannelMixerBlue=(R=0.000000,G=0.000000,B=1.000000,A=1.000000),FilmContrast=0.030000,FilmToeAmount=1.000000,FilmHealAmount=0.180000,FilmDynamicRange=4.000000,FilmSlope=0.880000,FilmToe=0.550000,FilmShoulder=0.260000,FilmBlackClip=0.000000,FilmWhiteClip=0.040000,SceneColorTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),SceneFringeIntensity=0.000000,BloomIntensity=1.000000,BloomThreshold=1.000000,BloomSizeScale=4.000000,Bloom1Size=1.000000,Bloom2Size=4.000000,Bloom3Size=16.000000,Bloom4Size=32.000000,Bloom5Size=64.000000,Bloom6Size=64.000000,Bloom1Tint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),Bloom2Tint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),Bloom3Tint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),Bloom4Tint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),Bloom5Tint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),Bloom6Tint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),BloomDirtMaskIntensity=1.000000,BloomDirtMaskTint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),BloomDirtMask=None,AmbientCubemapTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),AmbientCubemapIntensity=1.000000,AmbientCubemap=None,AutoExposureMethod=AEM_Histogram,AutoExposureLowPercent=80.000000,AutoExposureHighPercent=98.300003,AutoExposureMinBrightness=1.000000,AutoExposureMaxBrightness=1.000000,AutoExposureSpeedUp=3.000000,AutoExposureSpeedDown=1.000000,AutoExposureBias=0.330000,HistogramLogMin=-8.000000,HistogramLogMax=4.000000,LensFlareIntensity=1.000000,LensFlareTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),LensFlareBokehSize=3.000000,LensFlareThreshold=8.000000,LensFlareBokehShape=None,LensFlareTints[0]=(R=1.000000,G=0.800000,B=0.400000,A=0.600000),LensFlareTints[1]=(R=1.000000,G=1.000000,B=0.600000,A=0.530000),LensFlareTints[2]=(R=0.800000,G=0.800000,B=1.000000,A=0.460000),LensFlareTints[3]=(R=0.500000,G=1.000000,B=0.400000,A=0.390000),LensFlareTints[4]=(R=0.500000,G=0.800000,B=1.000000,A=0.310000),LensFlareTints[5]=(R=0.900000,G=1.000000,B=0.800000,A=0.270000),LensFlareTints[6]=(R=1.000000,G=0.800000,B=0.400000,A=0.220000),LensFlareTints[7]=(R=0.900000,G=0.700000,B=0.700000,A=0.150000),VignetteIntensity=0.161468,GrainJitter=0.000000,GrainIntensity=0.000000,AmbientOcclusionIntensity=1.000000,AmbientOcclusionStaticFraction=1.000000,AmbientOcclusionRadius=73.477997,AmbientOcclusionRadiusInWS=False,AmbientOcclusionFadeDistance=8000.000000,AmbientOcclusionFadeRadius=5000.000000,AmbientOcclusionDistance=80.000000,AmbientOcclusionPower=1.200000,AmbientOcclusionBias=3.000000,AmbientOcclusionQuality=100.000000,AmbientOcclusionMipBlend=0.600000,AmbientOcclusionMipScale=1.700000,AmbientOcclusionMipThreshold=0.010000,IndirectLightingColor=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),IndirectLightingIntensity=1.000000,ColorGradingIntensity=0.000000,ColorGradingLUT=Texture2D'/Engine/EditorResources/RGBTable16x1_AssetViewer.RGBTable16x1_AssetViewer',DepthOfFieldMethod=DOFM_BokehDOF,bMobileHQGaussian=False,DepthOfFieldFstop=4.000000,DepthOfFieldSensorWidth=24.576000,DepthOfFieldFocalDistance=1000.000000,DepthOfFieldDepthBlurAmount=1.000000,DepthOfFieldDepthBlurRadius=0.000000,DepthOfFieldFocalRegion=0.000000,DepthOfFieldNearTransitionRegion=300.000000,DepthOfFieldFarTransitionRegion=500.000000,DepthOfFieldScale=0.000000,DepthOfFieldMaxBokehSize=15.000000,DepthOfFieldNearBlurSize=15.000000,DepthOfFieldFarBlurSize=15.000000,DepthOfFieldBokehShape=None,DepthOfFieldOcclusion=0.400000,DepthOfFieldColorThreshold=1.000000,DepthOfFieldSizeThreshold=0.080000,DepthOfFieldSkyFocusDistance=0.000000,DepthOfFieldVignetteSize=200.000000,MotionBlurAmount=0.500000,MotionBlurMax=5.000000,MotionBlurPerObjectSize=0.500000,LPVIntensity=1.000000,LPVVplInjectionBias=0.640000,LPVSize=5312.000000,LPVSecondaryOcclusionIntensity=0.000000,LPVSecondaryBounceIntensity=0.000000,LPVGeometryVolumeBias=0.384000,LPVEmissiveInjectionIntensity=1.000000,LPVDirectionalOcclusionIntensity=0.000000,LPVDirectionalOcclusionRadius=8.000000,LPVDiffuseOcclusionExponent=1.000000,LPVSpecularOcclusionExponent=7.000000,LPVDiffuseOcclusionIntensity=1.000000,LPVSpecularOcclusionIntensity=1.000000,ScreenSpaceReflectionIntensity=100.000000,ScreenSpaceReflectionQuality=100.000000,ScreenSpaceReflectionMaxRoughness=1.000000,ScreenPercentage=100.000000,WeightedBlendables=(Array=),Blendables=),bPostProcessingEnabled=True,LightingRigRotation=109.389069,RotationSpeed=2.000000,DirectionalLightRotation=(Pitch=-39.999985,Yaw=-67.500015,Roll=0.000000))\n-Profiles=(ProfileName=\"Default\",DirectionalLightIntensity=2.620000,DirectionalLightColor=(R=0.990000,G=0.839850,B=0.732600,A=1.000000),SkyLightIntensity=0.880000,bRotateLightingRig=False,bShowEnvironment=True,bShowFloor=True,EnvironmentCubeMapPath=\"/Engine/EditorMaterials/AssetViewer/EpicQuadPanorama_CC+EV1.EpicQuadPanorama_CC+EV1\",PostProcessingSettings=(bOverride_WhiteTemp=True,bOverride_WhiteTint=False,bOverride_ColorSaturation=True,bOverride_ColorContrast=True,bOverride_ColorGamma=True,bOverride_ColorGain=True,bOverride_ColorOffset=True,bOverride_ColorSaturationShadows=False,bOverride_ColorContrastShadows=False,bOverride_ColorGammaShadows=False,bOverride_ColorGainShadows=False,bOverride_ColorOffsetShadows=False,bOverride_ColorSaturationMidtones=False,bOverride_ColorContrastMidtones=False,bOverride_ColorGammaMidtones=False,bOverride_ColorGainMidtones=False,bOverride_ColorOffsetMidtones=False,bOverride_ColorSaturationHighlights=False,bOverride_ColorContrastHighlights=False,bOverride_ColorGammaHighlights=False,bOverride_ColorGainHighlights=False,bOverride_ColorOffsetHighlights=False,bOverride_ColorCorrectionShadowsMax=False,bOverride_ColorCorrectionHighlightsMin=False,bOverride_FilmWhitePoint=False,bOverride_FilmSaturation=False,bOverride_FilmChannelMixerRed=False,bOverride_FilmChannelMixerGreen=False,bOverride_FilmChannelMixerBlue=False,bOverride_FilmContrast=False,bOverride_FilmDynamicRange=False,bOverride_FilmHealAmount=False,bOverride_FilmToeAmount=False,bOverride_FilmShadowTint=False,bOverride_FilmShadowTintBlend=False,bOverride_FilmShadowTintAmount=False,bOverride_FilmSlope=True,bOverride_FilmToe=True,bOverride_FilmShoulder=True,bOverride_FilmBlackClip=True,bOverride_FilmWhiteClip=True,bOverride_SceneColorTint=False,bOverride_SceneFringeIntensity=False,bOverride_AmbientCubemapTint=False,bOverride_AmbientCubemapIntensity=False,bOverride_BloomIntensity=True,bOverride_BloomThreshold=False,bOverride_Bloom1Tint=False,bOverride_Bloom1Size=False,bOverride_Bloom2Size=False,bOverride_Bloom2Tint=False,bOverride_Bloom3Tint=False,bOverride_Bloom3Size=False,bOverride_Bloom4Tint=False,bOverride_Bloom4Size=False,bOverride_Bloom5Tint=False,bOverride_Bloom5Size=False,bOverride_Bloom6Tint=False,bOverride_Bloom6Size=False,bOverride_BloomSizeScale=False,bOverride_BloomDirtMaskIntensity=False,bOverride_BloomDirtMaskTint=False,bOverride_BloomDirtMask=False,bOverride_AutoExposureMethod=True,bOverride_AutoExposureLowPercent=False,bOverride_AutoExposureHighPercent=False,bOverride_AutoExposureMinBrightness=True,bOverride_AutoExposureMaxBrightness=True,bOverride_AutoExposureSpeedUp=False,bOverride_AutoExposureSpeedDown=False,bOverride_AutoExposureBias=True,bOverride_HistogramLogMin=True,bOverride_HistogramLogMax=True,bOverride_LensFlareIntensity=False,bOverride_LensFlareTint=False,bOverride_LensFlareTints=False,bOverride_LensFlareBokehSize=False,bOverride_LensFlareBokehShape=False,bOverride_LensFlareThreshold=False,bOverride_VignetteIntensity=True,bOverride_GrainIntensity=False,bOverride_GrainJitter=False,bOverride_AmbientOcclusionIntensity=True,bOverride_AmbientOcclusionStaticFraction=True,bOverride_AmbientOcclusionRadius=True,bOverride_AmbientOcclusionFadeDistance=False,bOverride_AmbientOcclusionFadeRadius=False,bOverride_AmbientOcclusionDistance=False,bOverride_AmbientOcclusionRadiusInWS=False,bOverride_AmbientOcclusionPower=True,bOverride_AmbientOcclusionBias=True,bOverride_AmbientOcclusionQuality=True,bOverride_AmbientOcclusionMipBlend=True,bOverride_AmbientOcclusionMipScale=True,bOverride_AmbientOcclusionMipThreshold=True,bOverride_LPVIntensity=False,bOverride_LPVDirectionalOcclusionIntensity=False,bOverride_LPVDirectionalOcclusionRadius=False,bOverride_LPVDiffuseOcclusionExponent=False,bOverride_LPVSpecularOcclusionExponent=False,bOverride_LPVDiffuseOcclusionIntensity=False,bOverride_LPVSpecularOcclusionIntensity=False,bOverride_LPVSize=False,bOverride_LPVSecondaryOcclusionIntensity=False,bOverride_LPVSecondaryBounceIntensity=False,bOverride_LPVGeometryVolumeBias=False,bOverride_LPVVplInjectionBias=False,bOverride_LPVEmissiveInjectionIntensity=False,bOverride_IndirectLightingColor=False,bOverride_IndirectLightingIntensity=False,bOverride_ColorGradingIntensity=True,bOverride_ColorGradingLUT=True,bOverride_DepthOfFieldFocalDistance=False,bOverride_DepthOfFieldFstop=False,bOverride_DepthOfFieldSensorWidth=False,bOverride_DepthOfFieldDepthBlurRadius=False,bOverride_DepthOfFieldDepthBlurAmount=False,bOverride_DepthOfFieldFocalRegion=False,bOverride_DepthOfFieldNearTransitionRegion=False,bOverride_DepthOfFieldFarTransitionRegion=False,bOverride_DepthOfFieldScale=True,bOverride_DepthOfFieldMaxBokehSize=False,bOverride_DepthOfFieldNearBlurSize=False,bOverride_DepthOfFieldFarBlurSize=False,bOverride_DepthOfFieldMethod=True,bOverride_MobileHQGaussian=False,bOverride_DepthOfFieldBokehShape=False,bOverride_DepthOfFieldOcclusion=False,bOverride_DepthOfFieldColorThreshold=False,bOverride_DepthOfFieldSizeThreshold=False,bOverride_DepthOfFieldSkyFocusDistance=False,bOverride_DepthOfFieldVignetteSize=False,bOverride_MotionBlurAmount=False,bOverride_MotionBlurMax=False,bOverride_MotionBlurPerObjectSize=False,bOverride_ScreenPercentage=False,bOverride_ScreenSpaceReflectionIntensity=True,bOverride_ScreenSpaceReflectionQuality=True,bOverride_ScreenSpaceReflectionMaxRoughness=True,bOverride_ScreenSpaceReflectionRoughnessScale=False,WhiteTemp=6700.000000,WhiteTint=0.000000,ColorSaturation=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorContrast=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGamma=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGain=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorOffset=(X=0.005000,Y=0.005000,Z=0.005000,W=0.000000),ColorSaturationShadows=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorContrastShadows=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGammaShadows=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGainShadows=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorOffsetShadows=(X=0.000000,Y=0.000000,Z=0.000000,W=0.000000),ColorCorrectionShadowsMax=0.090000,ColorSaturationMidtones=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorContrastMidtones=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGammaMidtones=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGainMidtones=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorOffsetMidtones=(X=0.000000,Y=0.000000,Z=0.000000,W=0.000000),ColorSaturationHighlights=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorContrastHighlights=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGammaHighlights=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGainHighlights=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorOffsetHighlights=(X=0.000000,Y=0.000000,Z=0.000000,W=0.000000),ColorCorrectionHighlightsMin=0.500000,FilmWhitePoint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),FilmShadowTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),FilmShadowTintBlend=0.500000,FilmShadowTintAmount=0.000000,FilmSaturation=1.000000,FilmChannelMixerRed=(R=1.000000,G=0.000000,B=0.000000,A=1.000000),FilmChannelMixerGreen=(R=0.000000,G=1.000000,B=0.000000,A=1.000000),FilmChannelMixerBlue=(R=0.000000,G=0.000000,B=1.000000,A=1.000000),FilmContrast=0.030000,FilmToeAmount=1.000000,FilmHealAmount=0.180000,FilmDynamicRange=4.000000,FilmSlope=0.880000,FilmToe=0.550000,FilmShoulder=0.260000,FilmBlackClip=0.000000,FilmWhiteClip=0.040000,SceneColorTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),SceneFringeIntensity=0.000000,BloomIntensity=1.000000,BloomThreshold=1.000000,BloomSizeScale=4.000000,Bloom1Size=1.000000,Bloom2Size=4.000000,Bloom3Size=16.000000,Bloom4Size=32.000000,Bloom5Size=64.000000,Bloom6Size=64.000000,Bloom1Tint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),Bloom2Tint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),Bloom3Tint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),Bloom4Tint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),Bloom5Tint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),Bloom6Tint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),BloomDirtMaskIntensity=1.000000,BloomDirtMaskTint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),BloomDirtMask=None,AmbientCubemapTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),AmbientCubemapIntensity=1.000000,AmbientCubemap=None,AutoExposureMethod=AEM_Histogram,AutoExposureLowPercent=80.000000,AutoExposureHighPercent=98.300003,AutoExposureMinBrightness=1.000000,AutoExposureMaxBrightness=1.000000,AutoExposureSpeedUp=3.000000,AutoExposureSpeedDown=1.000000,AutoExposureBias=0.330000,HistogramLogMin=-8.000000,HistogramLogMax=4.000000,LensFlareIntensity=1.000000,LensFlareTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),LensFlareBokehSize=3.000000,LensFlareThreshold=8.000000,LensFlareBokehShape=None,LensFlareTints[0]=(R=1.000000,G=0.800000,B=0.400000,A=0.600000),LensFlareTints[1]=(R=1.000000,G=1.000000,B=0.600000,A=0.530000),LensFlareTints[2]=(R=0.800000,G=0.800000,B=1.000000,A=0.460000),LensFlareTints[3]=(R=0.500000,G=1.000000,B=0.400000,A=0.390000),LensFlareTints[4]=(R=0.500000,G=0.800000,B=1.000000,A=0.310000),LensFlareTints[5]=(R=0.900000,G=1.000000,B=0.800000,A=0.270000),LensFlareTints[6]=(R=1.000000,G=0.800000,B=0.400000,A=0.220000),LensFlareTints[7]=(R=0.900000,G=0.700000,B=0.700000,A=0.150000),VignetteIntensity=0.161468,GrainJitter=0.000000,GrainIntensity=0.000000,AmbientOcclusionIntensity=1.000000,AmbientOcclusionStaticFraction=1.000000,AmbientOcclusionRadius=73.477997,AmbientOcclusionRadiusInWS=False,AmbientOcclusionFadeDistance=8000.000000,AmbientOcclusionFadeRadius=5000.000000,AmbientOcclusionDistance=80.000000,AmbientOcclusionPower=1.200000,AmbientOcclusionBias=3.000000,AmbientOcclusionQuality=100.000000,AmbientOcclusionMipBlend=0.600000,AmbientOcclusionMipScale=1.700000,AmbientOcclusionMipThreshold=0.010000,IndirectLightingColor=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),IndirectLightingIntensity=1.000000,ColorGradingIntensity=0.000000,ColorGradingLUT=Texture2D'/Engine/EditorResources/RGBTable16x1_AssetViewer.RGBTable16x1_AssetViewer',DepthOfFieldMethod=DOFM_BokehDOF,bMobileHQGaussian=False,DepthOfFieldFstop=4.000000,DepthOfFieldSensorWidth=24.576000,DepthOfFieldFocalDistance=1000.000000,DepthOfFieldDepthBlurAmount=1.000000,DepthOfFieldDepthBlurRadius=0.000000,DepthOfFieldFocalRegion=0.000000,DepthOfFieldNearTransitionRegion=300.000000,DepthOfFieldFarTransitionRegion=500.000000,DepthOfFieldScale=0.000000,DepthOfFieldMaxBokehSize=15.000000,DepthOfFieldNearBlurSize=15.000000,DepthOfFieldFarBlurSize=15.000000,DepthOfFieldBokehShape=None,DepthOfFieldOcclusion=0.400000,DepthOfFieldColorThreshold=1.000000,DepthOfFieldSizeThreshold=0.080000,DepthOfFieldSkyFocusDistance=0.000000,DepthOfFieldVignetteSize=200.000000,MotionBlurAmount=0.500000,MotionBlurMax=5.000000,MotionBlurPerObjectSize=0.500000,LPVIntensity=1.000000,LPVVplInjectionBias=0.640000,LPVSize=5312.000000,LPVSecondaryOcclusionIntensity=0.000000,LPVSecondaryBounceIntensity=0.000000,LPVGeometryVolumeBias=0.384000,LPVEmissiveInjectionIntensity=1.000000,LPVDirectionalOcclusionIntensity=0.000000,LPVDirectionalOcclusionRadius=8.000000,LPVDiffuseOcclusionExponent=1.000000,LPVSpecularOcclusionExponent=7.000000,LPVDiffuseOcclusionIntensity=1.000000,LPVSpecularOcclusionIntensity=1.000000,ScreenSpaceReflectionIntensity=100.000000,ScreenSpaceReflectionQuality=100.000000,ScreenSpaceReflectionMaxRoughness=1.000000,ScreenPercentage=100.000000,WeightedBlendables=(Array=),Blendables=),bPostProcessingEnabled=True,LightingRigRotation=109.389069,RotationSpeed=2.000000,DirectionalLightRotation=(Pitch=-39.999985,Yaw=-67.500015,Roll=0.000000))\n-Profiles=(ProfileName=\"Profile_0\",DirectionalLightIntensity=1.000000,DirectionalLightColor=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),SkyLightIntensity=1.000000,bRotateLightingRig=False,bShowEnvironment=True,bShowFloor=True,EnvironmentCubeMapPath=\"\",PostProcessingSettings=(bOverride_WhiteTemp=False,bOverride_WhiteTint=False,bOverride_ColorSaturation=False,bOverride_ColorContrast=False,bOverride_ColorGamma=False,bOverride_ColorGain=False,bOverride_ColorOffset=False,bOverride_ColorSaturationShadows=False,bOverride_ColorContrastShadows=False,bOverride_ColorGammaShadows=False,bOverride_ColorGainShadows=False,bOverride_ColorOffsetShadows=False,bOverride_ColorSaturationMidtones=False,bOverride_ColorContrastMidtones=False,bOverride_ColorGammaMidtones=False,bOverride_ColorGainMidtones=False,bOverride_ColorOffsetMidtones=False,bOverride_ColorSaturationHighlights=False,bOverride_ColorContrastHighlights=False,bOverride_ColorGammaHighlights=False,bOverride_ColorGainHighlights=False,bOverride_ColorOffsetHighlights=False,bOverride_ColorCorrectionShadowsMax=False,bOverride_ColorCorrectionHighlightsMin=False,bOverride_FilmWhitePoint=False,bOverride_FilmSaturation=False,bOverride_FilmChannelMixerRed=False,bOverride_FilmChannelMixerGreen=False,bOverride_FilmChannelMixerBlue=False,bOverride_FilmContrast=False,bOverride_FilmDynamicRange=False,bOverride_FilmHealAmount=False,bOverride_FilmToeAmount=False,bOverride_FilmShadowTint=False,bOverride_FilmShadowTintBlend=False,bOverride_FilmShadowTintAmount=False,bOverride_FilmSlope=False,bOverride_FilmToe=False,bOverride_FilmShoulder=False,bOverride_FilmBlackClip=False,bOverride_FilmWhiteClip=False,bOverride_SceneColorTint=False,bOverride_SceneFringeIntensity=False,bOverride_AmbientCubemapTint=False,bOverride_AmbientCubemapIntensity=False,bOverride_BloomIntensity=False,bOverride_BloomThreshold=False,bOverride_Bloom1Tint=False,bOverride_Bloom1Size=False,bOverride_Bloom2Size=False,bOverride_Bloom2Tint=False,bOverride_Bloom3Tint=False,bOverride_Bloom3Size=False,bOverride_Bloom4Tint=False,bOverride_Bloom4Size=False,bOverride_Bloom5Tint=False,bOverride_Bloom5Size=False,bOverride_Bloom6Tint=False,bOverride_Bloom6Size=False,bOverride_BloomSizeScale=False,bOverride_BloomDirtMaskIntensity=False,bOverride_BloomDirtMaskTint=False,bOverride_BloomDirtMask=False,bOverride_AutoExposureMethod=False,bOverride_AutoExposureLowPercent=False,bOverride_AutoExposureHighPercent=False,bOverride_AutoExposureMinBrightness=False,bOverride_AutoExposureMaxBrightness=False,bOverride_AutoExposureSpeedUp=False,bOverride_AutoExposureSpeedDown=False,bOverride_AutoExposureBias=False,bOverride_HistogramLogMin=False,bOverride_HistogramLogMax=False,bOverride_LensFlareIntensity=False,bOverride_LensFlareTint=False,bOverride_LensFlareTints=False,bOverride_LensFlareBokehSize=False,bOverride_LensFlareBokehShape=False,bOverride_LensFlareThreshold=False,bOverride_VignetteIntensity=False,bOverride_GrainIntensity=False,bOverride_GrainJitter=False,bOverride_AmbientOcclusionIntensity=False,bOverride_AmbientOcclusionStaticFraction=False,bOverride_AmbientOcclusionRadius=False,bOverride_AmbientOcclusionFadeDistance=False,bOverride_AmbientOcclusionFadeRadius=False,bOverride_AmbientOcclusionDistance=False,bOverride_AmbientOcclusionRadiusInWS=False,bOverride_AmbientOcclusionPower=False,bOverride_AmbientOcclusionBias=False,bOverride_AmbientOcclusionQuality=False,bOverride_AmbientOcclusionMipBlend=False,bOverride_AmbientOcclusionMipScale=False,bOverride_AmbientOcclusionMipThreshold=False,bOverride_LPVIntensity=False,bOverride_LPVDirectionalOcclusionIntensity=False,bOverride_LPVDirectionalOcclusionRadius=False,bOverride_LPVDiffuseOcclusionExponent=False,bOverride_LPVSpecularOcclusionExponent=False,bOverride_LPVDiffuseOcclusionIntensity=False,bOverride_LPVSpecularOcclusionIntensity=False,bOverride_LPVSize=False,bOverride_LPVSecondaryOcclusionIntensity=False,bOverride_LPVSecondaryBounceIntensity=False,bOverride_LPVGeometryVolumeBias=False,bOverride_LPVVplInjectionBias=False,bOverride_LPVEmissiveInjectionIntensity=False,bOverride_IndirectLightingColor=False,bOverride_IndirectLightingIntensity=False,bOverride_ColorGradingIntensity=False,bOverride_ColorGradingLUT=False,bOverride_DepthOfFieldFocalDistance=False,bOverride_DepthOfFieldFstop=False,bOverride_DepthOfFieldSensorWidth=False,bOverride_DepthOfFieldDepthBlurRadius=False,bOverride_DepthOfFieldDepthBlurAmount=False,bOverride_DepthOfFieldFocalRegion=False,bOverride_DepthOfFieldNearTransitionRegion=False,bOverride_DepthOfFieldFarTransitionRegion=False,bOverride_DepthOfFieldScale=False,bOverride_DepthOfFieldMaxBokehSize=False,bOverride_DepthOfFieldNearBlurSize=False,bOverride_DepthOfFieldFarBlurSize=False,bOverride_DepthOfFieldMethod=False,bOverride_MobileHQGaussian=False,bOverride_DepthOfFieldBokehShape=False,bOverride_DepthOfFieldOcclusion=False,bOverride_DepthOfFieldColorThreshold=False,bOverride_DepthOfFieldSizeThreshold=False,bOverride_DepthOfFieldSkyFocusDistance=False,bOverride_DepthOfFieldVignetteSize=False,bOverride_MotionBlurAmount=False,bOverride_MotionBlurMax=False,bOverride_MotionBlurPerObjectSize=False,bOverride_ScreenPercentage=False,bOverride_ScreenSpaceReflectionIntensity=False,bOverride_ScreenSpaceReflectionQuality=False,bOverride_ScreenSpaceReflectionMaxRoughness=False,bOverride_ScreenSpaceReflectionRoughnessScale=False,WhiteTemp=6500.000000,WhiteTint=0.000000,ColorSaturation=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorContrast=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGamma=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGain=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorOffset=(X=0.000000,Y=0.000000,Z=0.000000,W=0.000000),ColorSaturationShadows=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorContrastShadows=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGammaShadows=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGainShadows=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorOffsetShadows=(X=0.000000,Y=0.000000,Z=0.000000,W=0.000000),ColorCorrectionShadowsMax=0.090000,ColorSaturationMidtones=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorContrastMidtones=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGammaMidtones=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGainMidtones=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorOffsetMidtones=(X=0.000000,Y=0.000000,Z=0.000000,W=0.000000),ColorSaturationHighlights=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorContrastHighlights=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGammaHighlights=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGainHighlights=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorOffsetHighlights=(X=0.000000,Y=0.000000,Z=0.000000,W=0.000000),ColorCorrectionHighlightsMin=0.500000,FilmWhitePoint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),FilmShadowTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),FilmShadowTintBlend=0.500000,FilmShadowTintAmount=0.000000,FilmSaturation=1.000000,FilmChannelMixerRed=(R=1.000000,G=0.000000,B=0.000000,A=1.000000),FilmChannelMixerGreen=(R=0.000000,G=1.000000,B=0.000000,A=1.000000),FilmChannelMixerBlue=(R=0.000000,G=0.000000,B=1.000000,A=1.000000),FilmContrast=0.030000,FilmToeAmount=1.000000,FilmHealAmount=0.180000,FilmDynamicRange=4.000000,FilmSlope=0.880000,FilmToe=0.550000,FilmShoulder=0.260000,FilmBlackClip=0.000000,FilmWhiteClip=0.040000,SceneColorTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),SceneFringeIntensity=0.000000,BloomIntensity=1.000000,BloomThreshold=1.000000,BloomSizeScale=4.000000,Bloom1Size=1.000000,Bloom2Size=4.000000,Bloom3Size=16.000000,Bloom4Size=32.000000,Bloom5Size=64.000000,Bloom6Size=64.000000,Bloom1Tint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),Bloom2Tint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),Bloom3Tint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),Bloom4Tint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),Bloom5Tint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),Bloom6Tint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),BloomDirtMaskIntensity=1.000000,BloomDirtMaskTint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),BloomDirtMask=None,AmbientCubemapTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),AmbientCubemapIntensity=1.000000,AmbientCubemap=None,AutoExposureMethod=AEM_Histogram,AutoExposureLowPercent=80.000000,AutoExposureHighPercent=98.300003,AutoExposureMinBrightness=0.030000,AutoExposureMaxBrightness=2.000000,AutoExposureSpeedUp=3.000000,AutoExposureSpeedDown=1.000000,AutoExposureBias=0.000000,HistogramLogMin=-8.000000,HistogramLogMax=4.000000,LensFlareIntensity=1.000000,LensFlareTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),LensFlareBokehSize=3.000000,LensFlareThreshold=8.000000,LensFlareBokehShape=None,LensFlareTints[0]=(R=1.000000,G=0.800000,B=0.400000,A=0.600000),LensFlareTints[1]=(R=1.000000,G=1.000000,B=0.600000,A=0.530000),LensFlareTints[2]=(R=0.800000,G=0.800000,B=1.000000,A=0.460000),LensFlareTints[3]=(R=0.500000,G=1.000000,B=0.400000,A=0.390000),LensFlareTints[4]=(R=0.500000,G=0.800000,B=1.000000,A=0.310000),LensFlareTints[5]=(R=0.900000,G=1.000000,B=0.800000,A=0.270000),LensFlareTints[6]=(R=1.000000,G=0.800000,B=0.400000,A=0.220000),LensFlareTints[7]=(R=0.900000,G=0.700000,B=0.700000,A=0.150000),VignetteIntensity=0.400000,GrainJitter=0.000000,GrainIntensity=0.000000,AmbientOcclusionIntensity=0.500000,AmbientOcclusionStaticFraction=1.000000,AmbientOcclusionRadius=200.000000,AmbientOcclusionRadiusInWS=False,AmbientOcclusionFadeDistance=8000.000000,AmbientOcclusionFadeRadius=5000.000000,AmbientOcclusionDistance=80.000000,AmbientOcclusionPower=2.000000,AmbientOcclusionBias=3.000000,AmbientOcclusionQuality=50.000000,AmbientOcclusionMipBlend=0.600000,AmbientOcclusionMipScale=1.700000,AmbientOcclusionMipThreshold=0.010000,IndirectLightingColor=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),IndirectLightingIntensity=1.000000,ColorGradingIntensity=1.000000,ColorGradingLUT=None,DepthOfFieldMethod=DOFM_BokehDOF,bMobileHQGaussian=False,DepthOfFieldFstop=4.000000,DepthOfFieldSensorWidth=24.576000,DepthOfFieldFocalDistance=1000.000000,DepthOfFieldDepthBlurAmount=1.000000,DepthOfFieldDepthBlurRadius=0.000000,DepthOfFieldFocalRegion=0.000000,DepthOfFieldNearTransitionRegion=300.000000,DepthOfFieldFarTransitionRegion=500.000000,DepthOfFieldScale=0.000000,DepthOfFieldMaxBokehSize=15.000000,DepthOfFieldNearBlurSize=15.000000,DepthOfFieldFarBlurSize=15.000000,DepthOfFieldBokehShape=None,DepthOfFieldOcclusion=0.400000,DepthOfFieldColorThreshold=1.000000,DepthOfFieldSizeThreshold=0.080000,DepthOfFieldSkyFocusDistance=0.000000,DepthOfFieldVignetteSize=200.000000,MotionBlurAmount=0.500000,MotionBlurMax=5.000000,MotionBlurPerObjectSize=0.500000,LPVIntensity=1.000000,LPVVplInjectionBias=0.640000,LPVSize=5312.000000,LPVSecondaryOcclusionIntensity=0.000000,LPVSecondaryBounceIntensity=0.000000,LPVGeometryVolumeBias=0.384000,LPVEmissiveInjectionIntensity=1.000000,LPVDirectionalOcclusionIntensity=0.000000,LPVDirectionalOcclusionRadius=8.000000,LPVDiffuseOcclusionExponent=1.000000,LPVSpecularOcclusionExponent=7.000000,LPVDiffuseOcclusionIntensity=1.000000,LPVSpecularOcclusionIntensity=1.000000,ScreenSpaceReflectionIntensity=100.000000,ScreenSpaceReflectionQuality=50.000000,ScreenSpaceReflectionMaxRoughness=0.600000,ScreenPercentage=100.000000,WeightedBlendables=(Array=),Blendables=),bPostProcessingEnabled=True,LightingRigRotation=0.000000,RotationSpeed=2.000000,DirectionalLightRotation=(Pitch=-40.000000,Yaw=-67.500000,Roll=0.000000))\n+Profiles=(ProfileName=\"Default\",DirectionalLightIntensity=2.620000,DirectionalLightColor=(R=0.990000,G=0.839850,B=0.732600,A=1.000000),SkyLightIntensity=0.880000,bRotateLightingRig=False,bShowEnvironment=True,bShowFloor=True,EnvironmentCubeMapPath=\"/Engine/EditorMaterials/AssetViewer/EpicQuadPanorama_CC+EV1.EpicQuadPanorama_CC+EV1\",PostProcessingSettings=(bOverride_WhiteTemp=True,bOverride_WhiteTint=False,bOverride_ColorSaturation=True,bOverride_ColorContrast=True,bOverride_ColorGamma=True,bOverride_ColorGain=True,bOverride_ColorOffset=True,bOverride_ColorSaturationShadows=False,bOverride_ColorContrastShadows=False,bOverride_ColorGammaShadows=False,bOverride_ColorGainShadows=False,bOverride_ColorOffsetShadows=False,bOverride_ColorSaturationMidtones=False,bOverride_ColorContrastMidtones=False,bOverride_ColorGammaMidtones=False,bOverride_ColorGainMidtones=False,bOverride_ColorOffsetMidtones=False,bOverride_ColorSaturationHighlights=False,bOverride_ColorContrastHighlights=False,bOverride_ColorGammaHighlights=False,bOverride_ColorGainHighlights=False,bOverride_ColorOffsetHighlights=False,bOverride_ColorCorrectionShadowsMax=False,bOverride_ColorCorrectionHighlightsMin=False,bOverride_FilmWhitePoint=False,bOverride_FilmSaturation=False,bOverride_FilmChannelMixerRed=False,bOverride_FilmChannelMixerGreen=False,bOverride_FilmChannelMixerBlue=False,bOverride_FilmContrast=False,bOverride_FilmDynamicRange=False,bOverride_FilmHealAmount=False,bOverride_FilmToeAmount=False,bOverride_FilmShadowTint=False,bOverride_FilmShadowTintBlend=False,bOverride_FilmShadowTintAmount=False,bOverride_FilmSlope=True,bOverride_FilmToe=True,bOverride_FilmShoulder=True,bOverride_FilmBlackClip=True,bOverride_FilmWhiteClip=True,bOverride_SceneColorTint=False,bOverride_SceneFringeIntensity=False,bOverride_AmbientCubemapTint=False,bOverride_AmbientCubemapIntensity=False,bOverride_BloomIntensity=True,bOverride_BloomThreshold=False,bOverride_Bloom1Tint=False,bOverride_Bloom1Size=False,bOverride_Bloom2Size=False,bOverride_Bloom2Tint=False,bOverride_Bloom3Tint=False,bOverride_Bloom3Size=False,bOverride_Bloom4Tint=False,bOverride_Bloom4Size=False,bOverride_Bloom5Tint=False,bOverride_Bloom5Size=False,bOverride_Bloom6Tint=False,bOverride_Bloom6Size=False,bOverride_BloomSizeScale=False,bOverride_BloomDirtMaskIntensity=False,bOverride_BloomDirtMaskTint=False,bOverride_BloomDirtMask=False,bOverride_AutoExposureMethod=True,bOverride_AutoExposureLowPercent=False,bOverride_AutoExposureHighPercent=False,bOverride_AutoExposureMinBrightness=True,bOverride_AutoExposureMaxBrightness=True,bOverride_AutoExposureSpeedUp=False,bOverride_AutoExposureSpeedDown=False,bOverride_AutoExposureBias=True,bOverride_HistogramLogMin=True,bOverride_HistogramLogMax=True,bOverride_LensFlareIntensity=False,bOverride_LensFlareTint=False,bOverride_LensFlareTints=False,bOverride_LensFlareBokehSize=False,bOverride_LensFlareBokehShape=False,bOverride_LensFlareThreshold=False,bOverride_VignetteIntensity=True,bOverride_GrainIntensity=False,bOverride_GrainJitter=False,bOverride_AmbientOcclusionIntensity=True,bOverride_AmbientOcclusionStaticFraction=True,bOverride_AmbientOcclusionRadius=True,bOverride_AmbientOcclusionFadeDistance=False,bOverride_AmbientOcclusionFadeRadius=False,bOverride_AmbientOcclusionDistance=False,bOverride_AmbientOcclusionRadiusInWS=False,bOverride_AmbientOcclusionPower=True,bOverride_AmbientOcclusionBias=True,bOverride_AmbientOcclusionQuality=True,bOverride_AmbientOcclusionMipBlend=True,bOverride_AmbientOcclusionMipScale=True,bOverride_AmbientOcclusionMipThreshold=True,bOverride_LPVIntensity=False,bOverride_LPVDirectionalOcclusionIntensity=False,bOverride_LPVDirectionalOcclusionRadius=False,bOverride_LPVDiffuseOcclusionExponent=False,bOverride_LPVSpecularOcclusionExponent=False,bOverride_LPVDiffuseOcclusionIntensity=False,bOverride_LPVSpecularOcclusionIntensity=False,bOverride_LPVSize=False,bOverride_LPVSecondaryOcclusionIntensity=False,bOverride_LPVSecondaryBounceIntensity=False,bOverride_LPVGeometryVolumeBias=False,bOverride_LPVVplInjectionBias=False,bOverride_LPVEmissiveInjectionIntensity=False,bOverride_IndirectLightingColor=False,bOverride_IndirectLightingIntensity=False,bOverride_ColorGradingIntensity=True,bOverride_ColorGradingLUT=True,bOverride_DepthOfFieldFocalDistance=False,bOverride_DepthOfFieldFstop=False,bOverride_DepthOfFieldSensorWidth=False,bOverride_DepthOfFieldDepthBlurRadius=False,bOverride_DepthOfFieldDepthBlurAmount=False,bOverride_DepthOfFieldFocalRegion=False,bOverride_DepthOfFieldNearTransitionRegion=False,bOverride_DepthOfFieldFarTransitionRegion=False,bOverride_DepthOfFieldScale=True,bOverride_DepthOfFieldMaxBokehSize=False,bOverride_DepthOfFieldNearBlurSize=False,bOverride_DepthOfFieldFarBlurSize=False,bOverride_DepthOfFieldMethod=True,bOverride_MobileHQGaussian=False,bOverride_DepthOfFieldBokehShape=False,bOverride_DepthOfFieldOcclusion=False,bOverride_DepthOfFieldColorThreshold=False,bOverride_DepthOfFieldSizeThreshold=False,bOverride_DepthOfFieldSkyFocusDistance=False,bOverride_DepthOfFieldVignetteSize=False,bOverride_MotionBlurAmount=False,bOverride_MotionBlurMax=False,bOverride_MotionBlurPerObjectSize=False,bOverride_ScreenPercentage=False,bOverride_ScreenSpaceReflectionIntensity=True,bOverride_ScreenSpaceReflectionQuality=True,bOverride_ScreenSpaceReflectionMaxRoughness=True,bOverride_ScreenSpaceReflectionRoughnessScale=False,WhiteTemp=6700.000000,WhiteTint=0.000000,ColorSaturation=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorContrast=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGamma=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGain=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorOffset=(X=0.005000,Y=0.005000,Z=0.005000,W=0.000000),ColorSaturationShadows=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorContrastShadows=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGammaShadows=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGainShadows=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorOffsetShadows=(X=0.000000,Y=0.000000,Z=0.000000,W=0.000000),ColorCorrectionShadowsMax=0.090000,ColorSaturationMidtones=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorContrastMidtones=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGammaMidtones=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGainMidtones=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorOffsetMidtones=(X=0.000000,Y=0.000000,Z=0.000000,W=0.000000),ColorSaturationHighlights=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorContrastHighlights=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGammaHighlights=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGainHighlights=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorOffsetHighlights=(X=0.000000,Y=0.000000,Z=0.000000,W=0.000000),ColorCorrectionHighlightsMin=0.500000,FilmWhitePoint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),FilmShadowTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),FilmShadowTintBlend=0.500000,FilmShadowTintAmount=0.000000,FilmSaturation=1.000000,FilmChannelMixerRed=(R=1.000000,G=0.000000,B=0.000000,A=1.000000),FilmChannelMixerGreen=(R=0.000000,G=1.000000,B=0.000000,A=1.000000),FilmChannelMixerBlue=(R=0.000000,G=0.000000,B=1.000000,A=1.000000),FilmContrast=0.030000,FilmToeAmount=1.000000,FilmHealAmount=1.000000,FilmDynamicRange=4.000000,FilmSlope=0.880000,FilmToe=0.550000,FilmShoulder=0.260000,FilmBlackClip=0.000000,FilmWhiteClip=0.040000,SceneColorTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),SceneFringeIntensity=0.000000,BloomIntensity=0.675000,BloomThreshold=-1.000000,BloomSizeScale=4.000000,Bloom1Size=0.300000,Bloom2Size=1.000000,Bloom3Size=2.000000,Bloom4Size=10.000000,Bloom5Size=30.000000,Bloom6Size=64.000000,Bloom1Tint=(R=0.346500,G=0.346500,B=0.346500,A=1.000000),Bloom2Tint=(R=0.138000,G=0.138000,B=0.138000,A=1.000000),Bloom3Tint=(R=0.117600,G=0.117600,B=0.117600,A=1.000000),Bloom4Tint=(R=0.066000,G=0.066000,B=0.066000,A=1.000000),Bloom5Tint=(R=0.066000,G=0.066000,B=0.066000,A=1.000000),Bloom6Tint=(R=0.061000,G=0.061000,B=0.061000,A=1.000000),BloomDirtMaskIntensity=0.000000,BloomDirtMaskTint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),BloomDirtMask=None,AmbientCubemapTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),AmbientCubemapIntensity=1.000000,AmbientCubemap=None,AutoExposureMethod=AEM_Histogram,AutoExposureLowPercent=80.000000,AutoExposureHighPercent=98.300003,AutoExposureMinBrightness=1.000000,AutoExposureMaxBrightness=1.000000,AutoExposureSpeedUp=3.000000,AutoExposureSpeedDown=1.000000,AutoExposureBias=0.330000,HistogramLogMin=-8.000000,HistogramLogMax=4.000000,LensFlareIntensity=1.000000,LensFlareTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),LensFlareBokehSize=3.000000,LensFlareThreshold=8.000000,LensFlareBokehShape=None,LensFlareTints[0]=(R=1.000000,G=0.800000,B=0.400000,A=0.600000),LensFlareTints[1]=(R=1.000000,G=1.000000,B=0.600000,A=0.530000),LensFlareTints[2]=(R=0.800000,G=0.800000,B=1.000000,A=0.460000),LensFlareTints[3]=(R=0.500000,G=1.000000,B=0.400000,A=0.390000),LensFlareTints[4]=(R=0.500000,G=0.800000,B=1.000000,A=0.310000),LensFlareTints[5]=(R=0.900000,G=1.000000,B=0.800000,A=0.270000),LensFlareTints[6]=(R=1.000000,G=0.800000,B=0.400000,A=0.220000),LensFlareTints[7]=(R=0.900000,G=0.700000,B=0.700000,A=0.150000),VignetteIntensity=0.161468,GrainJitter=0.000000,GrainIntensity=0.000000,AmbientOcclusionIntensity=1.000000,AmbientOcclusionStaticFraction=1.000000,AmbientOcclusionRadius=73.477997,AmbientOcclusionRadiusInWS=False,AmbientOcclusionFadeDistance=8000.000000,AmbientOcclusionFadeRadius=5000.000000,AmbientOcclusionDistance=80.000000,AmbientOcclusionPower=1.200000,AmbientOcclusionBias=3.000000,AmbientOcclusionQuality=100.000000,AmbientOcclusionMipBlend=0.600000,AmbientOcclusionMipScale=1.700000,AmbientOcclusionMipThreshold=0.010000,IndirectLightingColor=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),IndirectLightingIntensity=1.000000,ColorGradingIntensity=0.000000,ColorGradingLUT=Texture2D'/Engine/EditorResources/RGBTable16x1_AssetViewer.RGBTable16x1_AssetViewer',DepthOfFieldMethod=DOFM_BokehDOF,bMobileHQGaussian=False,DepthOfFieldFstop=4.000000,DepthOfFieldSensorWidth=24.576000,DepthOfFieldFocalDistance=1000.000000,DepthOfFieldDepthBlurAmount=1.000000,DepthOfFieldDepthBlurRadius=0.000000,DepthOfFieldFocalRegion=0.000000,DepthOfFieldNearTransitionRegion=300.000000,DepthOfFieldFarTransitionRegion=500.000000,DepthOfFieldScale=0.000000,DepthOfFieldMaxBokehSize=15.000000,DepthOfFieldNearBlurSize=15.000000,DepthOfFieldFarBlurSize=15.000000,DepthOfFieldBokehShape=None,DepthOfFieldOcclusion=0.400000,DepthOfFieldColorThreshold=1.000000,DepthOfFieldSizeThreshold=0.080000,DepthOfFieldSkyFocusDistance=0.000000,DepthOfFieldVignetteSize=200.000000,MotionBlurAmount=0.500000,MotionBlurMax=5.000000,MotionBlurPerObjectSize=0.500000,LPVIntensity=1.000000,LPVVplInjectionBias=0.640000,LPVSize=5312.000000,LPVSecondaryOcclusionIntensity=0.000000,LPVSecondaryBounceIntensity=0.000000,LPVGeometryVolumeBias=0.384000,LPVEmissiveInjectionIntensity=1.000000,LPVDirectionalOcclusionIntensity=0.000000,LPVDirectionalOcclusionRadius=8.000000,LPVDiffuseOcclusionExponent=1.000000,LPVSpecularOcclusionExponent=7.000000,LPVDiffuseOcclusionIntensity=1.000000,LPVSpecularOcclusionIntensity=1.000000,ScreenSpaceReflectionIntensity=100.000000,ScreenSpaceReflectionQuality=100.000000,ScreenSpaceReflectionMaxRoughness=1.000000,ScreenPercentage=100.000000,WeightedBlendables=(Array=),Blendables=),bPostProcessingEnabled=True,LightingRigRotation=109.389069,RotationSpeed=2.000000,DirectionalLightRotation=(Pitch=-39.999985,Yaw=-67.500015,Roll=0.000000))\n+Profiles=(ProfileName=\"Default\",DirectionalLightIntensity=2.620000,DirectionalLightColor=(R=0.990000,G=0.839850,B=0.732600,A=1.000000),SkyLightIntensity=0.880000,bRotateLightingRig=False,bShowEnvironment=True,bShowFloor=True,EnvironmentCubeMapPath=\"/Engine/EditorMaterials/AssetViewer/EpicQuadPanorama_CC+EV1.EpicQuadPanorama_CC+EV1\",PostProcessingSettings=(bOverride_WhiteTemp=True,bOverride_WhiteTint=False,bOverride_ColorSaturation=True,bOverride_ColorContrast=True,bOverride_ColorGamma=True,bOverride_ColorGain=True,bOverride_ColorOffset=True,bOverride_ColorSaturationShadows=False,bOverride_ColorContrastShadows=False,bOverride_ColorGammaShadows=False,bOverride_ColorGainShadows=False,bOverride_ColorOffsetShadows=False,bOverride_ColorSaturationMidtones=False,bOverride_ColorContrastMidtones=False,bOverride_ColorGammaMidtones=False,bOverride_ColorGainMidtones=False,bOverride_ColorOffsetMidtones=False,bOverride_ColorSaturationHighlights=False,bOverride_ColorContrastHighlights=False,bOverride_ColorGammaHighlights=False,bOverride_ColorGainHighlights=False,bOverride_ColorOffsetHighlights=False,bOverride_ColorCorrectionShadowsMax=False,bOverride_ColorCorrectionHighlightsMin=False,bOverride_FilmWhitePoint=False,bOverride_FilmSaturation=False,bOverride_FilmChannelMixerRed=False,bOverride_FilmChannelMixerGreen=False,bOverride_FilmChannelMixerBlue=False,bOverride_FilmContrast=False,bOverride_FilmDynamicRange=False,bOverride_FilmHealAmount=False,bOverride_FilmToeAmount=False,bOverride_FilmShadowTint=False,bOverride_FilmShadowTintBlend=False,bOverride_FilmShadowTintAmount=False,bOverride_FilmSlope=True,bOverride_FilmToe=True,bOverride_FilmShoulder=True,bOverride_FilmBlackClip=True,bOverride_FilmWhiteClip=True,bOverride_SceneColorTint=False,bOverride_SceneFringeIntensity=False,bOverride_AmbientCubemapTint=False,bOverride_AmbientCubemapIntensity=False,bOverride_BloomIntensity=True,bOverride_BloomThreshold=False,bOverride_Bloom1Tint=False,bOverride_Bloom1Size=False,bOverride_Bloom2Size=False,bOverride_Bloom2Tint=False,bOverride_Bloom3Tint=False,bOverride_Bloom3Size=False,bOverride_Bloom4Tint=False,bOverride_Bloom4Size=False,bOverride_Bloom5Tint=False,bOverride_Bloom5Size=False,bOverride_Bloom6Tint=False,bOverride_Bloom6Size=False,bOverride_BloomSizeScale=False,bOverride_BloomDirtMaskIntensity=False,bOverride_BloomDirtMaskTint=False,bOverride_BloomDirtMask=False,bOverride_AutoExposureMethod=True,bOverride_AutoExposureLowPercent=False,bOverride_AutoExposureHighPercent=False,bOverride_AutoExposureMinBrightness=True,bOverride_AutoExposureMaxBrightness=True,bOverride_AutoExposureSpeedUp=False,bOverride_AutoExposureSpeedDown=False,bOverride_AutoExposureBias=True,bOverride_HistogramLogMin=True,bOverride_HistogramLogMax=True,bOverride_LensFlareIntensity=False,bOverride_LensFlareTint=False,bOverride_LensFlareTints=False,bOverride_LensFlareBokehSize=False,bOverride_LensFlareBokehShape=False,bOverride_LensFlareThreshold=False,bOverride_VignetteIntensity=True,bOverride_GrainIntensity=False,bOverride_GrainJitter=False,bOverride_AmbientOcclusionIntensity=True,bOverride_AmbientOcclusionStaticFraction=True,bOverride_AmbientOcclusionRadius=True,bOverride_AmbientOcclusionFadeDistance=False,bOverride_AmbientOcclusionFadeRadius=False,bOverride_AmbientOcclusionDistance=False,bOverride_AmbientOcclusionRadiusInWS=False,bOverride_AmbientOcclusionPower=True,bOverride_AmbientOcclusionBias=True,bOverride_AmbientOcclusionQuality=True,bOverride_AmbientOcclusionMipBlend=True,bOverride_AmbientOcclusionMipScale=True,bOverride_AmbientOcclusionMipThreshold=True,bOverride_LPVIntensity=False,bOverride_LPVDirectionalOcclusionIntensity=False,bOverride_LPVDirectionalOcclusionRadius=False,bOverride_LPVDiffuseOcclusionExponent=False,bOverride_LPVSpecularOcclusionExponent=False,bOverride_LPVDiffuseOcclusionIntensity=False,bOverride_LPVSpecularOcclusionIntensity=False,bOverride_LPVSize=False,bOverride_LPVSecondaryOcclusionIntensity=False,bOverride_LPVSecondaryBounceIntensity=False,bOverride_LPVGeometryVolumeBias=False,bOverride_LPVVplInjectionBias=False,bOverride_LPVEmissiveInjectionIntensity=False,bOverride_IndirectLightingColor=False,bOverride_IndirectLightingIntensity=False,bOverride_ColorGradingIntensity=True,bOverride_ColorGradingLUT=True,bOverride_DepthOfFieldFocalDistance=False,bOverride_DepthOfFieldFstop=False,bOverride_DepthOfFieldSensorWidth=False,bOverride_DepthOfFieldDepthBlurRadius=False,bOverride_DepthOfFieldDepthBlurAmount=False,bOverride_DepthOfFieldFocalRegion=False,bOverride_DepthOfFieldNearTransitionRegion=False,bOverride_DepthOfFieldFarTransitionRegion=False,bOverride_DepthOfFieldScale=True,bOverride_DepthOfFieldMaxBokehSize=False,bOverride_DepthOfFieldNearBlurSize=False,bOverride_DepthOfFieldFarBlurSize=False,bOverride_DepthOfFieldMethod=True,bOverride_MobileHQGaussian=False,bOverride_DepthOfFieldBokehShape=False,bOverride_DepthOfFieldOcclusion=False,bOverride_DepthOfFieldColorThreshold=False,bOverride_DepthOfFieldSizeThreshold=False,bOverride_DepthOfFieldSkyFocusDistance=False,bOverride_DepthOfFieldVignetteSize=False,bOverride_MotionBlurAmount=False,bOverride_MotionBlurMax=False,bOverride_MotionBlurPerObjectSize=False,bOverride_ScreenPercentage=False,bOverride_ScreenSpaceReflectionIntensity=True,bOverride_ScreenSpaceReflectionQuality=True,bOverride_ScreenSpaceReflectionMaxRoughness=True,bOverride_ScreenSpaceReflectionRoughnessScale=False,WhiteTemp=6700.000000,WhiteTint=0.000000,ColorSaturation=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorContrast=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGamma=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGain=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorOffset=(X=0.005000,Y=0.005000,Z=0.005000,W=0.000000),ColorSaturationShadows=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorContrastShadows=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGammaShadows=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGainShadows=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorOffsetShadows=(X=0.000000,Y=0.000000,Z=0.000000,W=0.000000),ColorCorrectionShadowsMax=0.090000,ColorSaturationMidtones=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorContrastMidtones=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGammaMidtones=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGainMidtones=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorOffsetMidtones=(X=0.000000,Y=0.000000,Z=0.000000,W=0.000000),ColorSaturationHighlights=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorContrastHighlights=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGammaHighlights=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGainHighlights=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorOffsetHighlights=(X=0.000000,Y=0.000000,Z=0.000000,W=0.000000),ColorCorrectionHighlightsMin=0.500000,FilmWhitePoint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),FilmShadowTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),FilmShadowTintBlend=0.500000,FilmShadowTintAmount=0.000000,FilmSaturation=1.000000,FilmChannelMixerRed=(R=1.000000,G=0.000000,B=0.000000,A=1.000000),FilmChannelMixerGreen=(R=0.000000,G=1.000000,B=0.000000,A=1.000000),FilmChannelMixerBlue=(R=0.000000,G=0.000000,B=1.000000,A=1.000000),FilmContrast=0.030000,FilmToeAmount=1.000000,FilmHealAmount=1.000000,FilmDynamicRange=4.000000,FilmSlope=0.880000,FilmToe=0.550000,FilmShoulder=0.260000,FilmBlackClip=0.000000,FilmWhiteClip=0.040000,SceneColorTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),SceneFringeIntensity=0.000000,BloomIntensity=0.675000,BloomThreshold=-1.000000,BloomSizeScale=4.000000,Bloom1Size=0.300000,Bloom2Size=1.000000,Bloom3Size=2.000000,Bloom4Size=10.000000,Bloom5Size=30.000000,Bloom6Size=64.000000,Bloom1Tint=(R=0.346500,G=0.346500,B=0.346500,A=1.000000),Bloom2Tint=(R=0.138000,G=0.138000,B=0.138000,A=1.000000),Bloom3Tint=(R=0.117600,G=0.117600,B=0.117600,A=1.000000),Bloom4Tint=(R=0.066000,G=0.066000,B=0.066000,A=1.000000),Bloom5Tint=(R=0.066000,G=0.066000,B=0.066000,A=1.000000),Bloom6Tint=(R=0.061000,G=0.061000,B=0.061000,A=1.000000),BloomDirtMaskIntensity=0.000000,BloomDirtMaskTint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),BloomDirtMask=None,AmbientCubemapTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),AmbientCubemapIntensity=1.000000,AmbientCubemap=None,AutoExposureMethod=AEM_Histogram,AutoExposureLowPercent=80.000000,AutoExposureHighPercent=98.300003,AutoExposureMinBrightness=1.000000,AutoExposureMaxBrightness=1.000000,AutoExposureSpeedUp=3.000000,AutoExposureSpeedDown=1.000000,AutoExposureBias=0.330000,HistogramLogMin=-8.000000,HistogramLogMax=4.000000,LensFlareIntensity=1.000000,LensFlareTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),LensFlareBokehSize=3.000000,LensFlareThreshold=8.000000,LensFlareBokehShape=None,LensFlareTints[0]=(R=1.000000,G=0.800000,B=0.400000,A=0.600000),LensFlareTints[1]=(R=1.000000,G=1.000000,B=0.600000,A=0.530000),LensFlareTints[2]=(R=0.800000,G=0.800000,B=1.000000,A=0.460000),LensFlareTints[3]=(R=0.500000,G=1.000000,B=0.400000,A=0.390000),LensFlareTints[4]=(R=0.500000,G=0.800000,B=1.000000,A=0.310000),LensFlareTints[5]=(R=0.900000,G=1.000000,B=0.800000,A=0.270000),LensFlareTints[6]=(R=1.000000,G=0.800000,B=0.400000,A=0.220000),LensFlareTints[7]=(R=0.900000,G=0.700000,B=0.700000,A=0.150000),VignetteIntensity=0.161468,GrainJitter=0.000000,GrainIntensity=0.000000,AmbientOcclusionIntensity=1.000000,AmbientOcclusionStaticFraction=1.000000,AmbientOcclusionRadius=73.477997,AmbientOcclusionRadiusInWS=False,AmbientOcclusionFadeDistance=8000.000000,AmbientOcclusionFadeRadius=5000.000000,AmbientOcclusionDistance=80.000000,AmbientOcclusionPower=1.200000,AmbientOcclusionBias=3.000000,AmbientOcclusionQuality=100.000000,AmbientOcclusionMipBlend=0.600000,AmbientOcclusionMipScale=1.700000,AmbientOcclusionMipThreshold=0.010000,IndirectLightingColor=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),IndirectLightingIntensity=1.000000,ColorGradingIntensity=0.000000,ColorGradingLUT=Texture2D'/Engine/EditorResources/RGBTable16x1_AssetViewer.RGBTable16x1_AssetViewer',DepthOfFieldMethod=DOFM_BokehDOF,bMobileHQGaussian=False,DepthOfFieldFstop=4.000000,DepthOfFieldSensorWidth=24.576000,DepthOfFieldFocalDistance=1000.000000,DepthOfFieldDepthBlurAmount=1.000000,DepthOfFieldDepthBlurRadius=0.000000,DepthOfFieldFocalRegion=0.000000,DepthOfFieldNearTransitionRegion=300.000000,DepthOfFieldFarTransitionRegion=500.000000,DepthOfFieldScale=0.000000,DepthOfFieldMaxBokehSize=15.000000,DepthOfFieldNearBlurSize=15.000000,DepthOfFieldFarBlurSize=15.000000,DepthOfFieldBokehShape=None,DepthOfFieldOcclusion=0.400000,DepthOfFieldColorThreshold=1.000000,DepthOfFieldSizeThreshold=0.080000,DepthOfFieldSkyFocusDistance=0.000000,DepthOfFieldVignetteSize=200.000000,MotionBlurAmount=0.500000,MotionBlurMax=5.000000,MotionBlurPerObjectSize=0.500000,LPVIntensity=1.000000,LPVVplInjectionBias=0.640000,LPVSize=5312.000000,LPVSecondaryOcclusionIntensity=0.000000,LPVSecondaryBounceIntensity=0.000000,LPVGeometryVolumeBias=0.384000,LPVEmissiveInjectionIntensity=1.000000,LPVDirectionalOcclusionIntensity=0.000000,LPVDirectionalOcclusionRadius=8.000000,LPVDiffuseOcclusionExponent=1.000000,LPVSpecularOcclusionExponent=7.000000,LPVDiffuseOcclusionIntensity=1.000000,LPVSpecularOcclusionIntensity=1.000000,ScreenSpaceReflectionIntensity=100.000000,ScreenSpaceReflectionQuality=100.000000,ScreenSpaceReflectionMaxRoughness=1.000000,ScreenPercentage=100.000000,WeightedBlendables=(Array=),Blendables=),bPostProcessingEnabled=True,LightingRigRotation=109.389069,RotationSpeed=2.000000,DirectionalLightRotation=(Pitch=-39.999985,Yaw=-67.500015,Roll=0.000000))\n+Profiles=(ProfileName=\"Default\",DirectionalLightIntensity=2.620000,DirectionalLightColor=(R=0.990000,G=0.839850,B=0.732600,A=1.000000),SkyLightIntensity=0.880000,bRotateLightingRig=False,bShowEnvironment=True,bShowFloor=True,EnvironmentCubeMapPath=\"/Engine/EditorMaterials/AssetViewer/EpicQuadPanorama_CC+EV1.EpicQuadPanorama_CC+EV1\",PostProcessingSettings=(bOverride_WhiteTemp=True,bOverride_WhiteTint=False,bOverride_ColorSaturation=True,bOverride_ColorContrast=True,bOverride_ColorGamma=True,bOverride_ColorGain=True,bOverride_ColorOffset=True,bOverride_ColorSaturationShadows=False,bOverride_ColorContrastShadows=False,bOverride_ColorGammaShadows=False,bOverride_ColorGainShadows=False,bOverride_ColorOffsetShadows=False,bOverride_ColorSaturationMidtones=False,bOverride_ColorContrastMidtones=False,bOverride_ColorGammaMidtones=False,bOverride_ColorGainMidtones=False,bOverride_ColorOffsetMidtones=False,bOverride_ColorSaturationHighlights=False,bOverride_ColorContrastHighlights=False,bOverride_ColorGammaHighlights=False,bOverride_ColorGainHighlights=False,bOverride_ColorOffsetHighlights=False,bOverride_ColorCorrectionShadowsMax=False,bOverride_ColorCorrectionHighlightsMin=False,bOverride_FilmWhitePoint=False,bOverride_FilmSaturation=False,bOverride_FilmChannelMixerRed=False,bOverride_FilmChannelMixerGreen=False,bOverride_FilmChannelMixerBlue=False,bOverride_FilmContrast=False,bOverride_FilmDynamicRange=False,bOverride_FilmHealAmount=False,bOverride_FilmToeAmount=False,bOverride_FilmShadowTint=False,bOverride_FilmShadowTintBlend=False,bOverride_FilmShadowTintAmount=False,bOverride_FilmSlope=True,bOverride_FilmToe=True,bOverride_FilmShoulder=True,bOverride_FilmBlackClip=True,bOverride_FilmWhiteClip=True,bOverride_SceneColorTint=False,bOverride_SceneFringeIntensity=False,bOverride_AmbientCubemapTint=False,bOverride_AmbientCubemapIntensity=False,bOverride_BloomIntensity=True,bOverride_BloomThreshold=False,bOverride_Bloom1Tint=False,bOverride_Bloom1Size=False,bOverride_Bloom2Size=False,bOverride_Bloom2Tint=False,bOverride_Bloom3Tint=False,bOverride_Bloom3Size=False,bOverride_Bloom4Tint=False,bOverride_Bloom4Size=False,bOverride_Bloom5Tint=False,bOverride_Bloom5Size=False,bOverride_Bloom6Tint=False,bOverride_Bloom6Size=False,bOverride_BloomSizeScale=False,bOverride_BloomDirtMaskIntensity=False,bOverride_BloomDirtMaskTint=False,bOverride_BloomDirtMask=False,bOverride_AutoExposureMethod=True,bOverride_AutoExposureLowPercent=False,bOverride_AutoExposureHighPercent=False,bOverride_AutoExposureMinBrightness=True,bOverride_AutoExposureMaxBrightness=True,bOverride_AutoExposureSpeedUp=False,bOverride_AutoExposureSpeedDown=False,bOverride_AutoExposureBias=True,bOverride_HistogramLogMin=True,bOverride_HistogramLogMax=True,bOverride_LensFlareIntensity=False,bOverride_LensFlareTint=False,bOverride_LensFlareTints=False,bOverride_LensFlareBokehSize=False,bOverride_LensFlareBokehShape=False,bOverride_LensFlareThreshold=False,bOverride_VignetteIntensity=True,bOverride_GrainIntensity=False,bOverride_GrainJitter=False,bOverride_AmbientOcclusionIntensity=True,bOverride_AmbientOcclusionStaticFraction=True,bOverride_AmbientOcclusionRadius=True,bOverride_AmbientOcclusionFadeDistance=False,bOverride_AmbientOcclusionFadeRadius=False,bOverride_AmbientOcclusionDistance=False,bOverride_AmbientOcclusionRadiusInWS=False,bOverride_AmbientOcclusionPower=True,bOverride_AmbientOcclusionBias=True,bOverride_AmbientOcclusionQuality=True,bOverride_AmbientOcclusionMipBlend=True,bOverride_AmbientOcclusionMipScale=True,bOverride_AmbientOcclusionMipThreshold=True,bOverride_LPVIntensity=False,bOverride_LPVDirectionalOcclusionIntensity=False,bOverride_LPVDirectionalOcclusionRadius=False,bOverride_LPVDiffuseOcclusionExponent=False,bOverride_LPVSpecularOcclusionExponent=False,bOverride_LPVDiffuseOcclusionIntensity=False,bOverride_LPVSpecularOcclusionIntensity=False,bOverride_LPVSize=False,bOverride_LPVSecondaryOcclusionIntensity=False,bOverride_LPVSecondaryBounceIntensity=False,bOverride_LPVGeometryVolumeBias=False,bOverride_LPVVplInjectionBias=False,bOverride_LPVEmissiveInjectionIntensity=False,bOverride_IndirectLightingColor=False,bOverride_IndirectLightingIntensity=False,bOverride_ColorGradingIntensity=True,bOverride_ColorGradingLUT=True,bOverride_DepthOfFieldFocalDistance=False,bOverride_DepthOfFieldFstop=False,bOverride_DepthOfFieldSensorWidth=False,bOverride_DepthOfFieldDepthBlurRadius=False,bOverride_DepthOfFieldDepthBlurAmount=False,bOverride_DepthOfFieldFocalRegion=False,bOverride_DepthOfFieldNearTransitionRegion=False,bOverride_DepthOfFieldFarTransitionRegion=False,bOverride_DepthOfFieldScale=True,bOverride_DepthOfFieldMaxBokehSize=False,bOverride_DepthOfFieldNearBlurSize=False,bOverride_DepthOfFieldFarBlurSize=False,bOverride_DepthOfFieldMethod=True,bOverride_MobileHQGaussian=False,bOverride_DepthOfFieldBokehShape=False,bOverride_DepthOfFieldOcclusion=False,bOverride_DepthOfFieldColorThreshold=False,bOverride_DepthOfFieldSizeThreshold=False,bOverride_DepthOfFieldSkyFocusDistance=False,bOverride_DepthOfFieldVignetteSize=False,bOverride_MotionBlurAmount=False,bOverride_MotionBlurMax=False,bOverride_MotionBlurPerObjectSize=False,bOverride_ScreenPercentage=False,bOverride_ScreenSpaceReflectionIntensity=True,bOverride_ScreenSpaceReflectionQuality=True,bOverride_ScreenSpaceReflectionMaxRoughness=True,bOverride_ScreenSpaceReflectionRoughnessScale=False,WhiteTemp=6700.000000,WhiteTint=0.000000,ColorSaturation=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorContrast=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGamma=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGain=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorOffset=(X=0.005000,Y=0.005000,Z=0.005000,W=0.000000),ColorSaturationShadows=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorContrastShadows=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGammaShadows=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGainShadows=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorOffsetShadows=(X=0.000000,Y=0.000000,Z=0.000000,W=0.000000),ColorCorrectionShadowsMax=0.090000,ColorSaturationMidtones=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorContrastMidtones=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGammaMidtones=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGainMidtones=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorOffsetMidtones=(X=0.000000,Y=0.000000,Z=0.000000,W=0.000000),ColorSaturationHighlights=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorContrastHighlights=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGammaHighlights=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGainHighlights=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorOffsetHighlights=(X=0.000000,Y=0.000000,Z=0.000000,W=0.000000),ColorCorrectionHighlightsMin=0.500000,FilmWhitePoint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),FilmShadowTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),FilmShadowTintBlend=0.500000,FilmShadowTintAmount=0.000000,FilmSaturation=1.000000,FilmChannelMixerRed=(R=1.000000,G=0.000000,B=0.000000,A=1.000000),FilmChannelMixerGreen=(R=0.000000,G=1.000000,B=0.000000,A=1.000000),FilmChannelMixerBlue=(R=0.000000,G=0.000000,B=1.000000,A=1.000000),FilmContrast=0.030000,FilmToeAmount=1.000000,FilmHealAmount=1.000000,FilmDynamicRange=4.000000,FilmSlope=0.880000,FilmToe=0.550000,FilmShoulder=0.260000,FilmBlackClip=0.000000,FilmWhiteClip=0.040000,SceneColorTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),SceneFringeIntensity=0.000000,BloomIntensity=0.675000,BloomThreshold=-1.000000,BloomSizeScale=4.000000,Bloom1Size=0.300000,Bloom2Size=1.000000,Bloom3Size=2.000000,Bloom4Size=10.000000,Bloom5Size=30.000000,Bloom6Size=64.000000,Bloom1Tint=(R=0.346500,G=0.346500,B=0.346500,A=1.000000),Bloom2Tint=(R=0.138000,G=0.138000,B=0.138000,A=1.000000),Bloom3Tint=(R=0.117600,G=0.117600,B=0.117600,A=1.000000),Bloom4Tint=(R=0.066000,G=0.066000,B=0.066000,A=1.000000),Bloom5Tint=(R=0.066000,G=0.066000,B=0.066000,A=1.000000),Bloom6Tint=(R=0.061000,G=0.061000,B=0.061000,A=1.000000),BloomDirtMaskIntensity=0.000000,BloomDirtMaskTint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),BloomDirtMask=None,AmbientCubemapTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),AmbientCubemapIntensity=1.000000,AmbientCubemap=None,AutoExposureMethod=AEM_Histogram,AutoExposureLowPercent=80.000000,AutoExposureHighPercent=98.300003,AutoExposureMinBrightness=1.000000,AutoExposureMaxBrightness=1.000000,AutoExposureSpeedUp=3.000000,AutoExposureSpeedDown=1.000000,AutoExposureBias=0.330000,HistogramLogMin=-8.000000,HistogramLogMax=4.000000,LensFlareIntensity=1.000000,LensFlareTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),LensFlareBokehSize=3.000000,LensFlareThreshold=8.000000,LensFlareBokehShape=None,LensFlareTints[0]=(R=1.000000,G=0.800000,B=0.400000,A=0.600000),LensFlareTints[1]=(R=1.000000,G=1.000000,B=0.600000,A=0.530000),LensFlareTints[2]=(R=0.800000,G=0.800000,B=1.000000,A=0.460000),LensFlareTints[3]=(R=0.500000,G=1.000000,B=0.400000,A=0.390000),LensFlareTints[4]=(R=0.500000,G=0.800000,B=1.000000,A=0.310000),LensFlareTints[5]=(R=0.900000,G=1.000000,B=0.800000,A=0.270000),LensFlareTints[6]=(R=1.000000,G=0.800000,B=0.400000,A=0.220000),LensFlareTints[7]=(R=0.900000,G=0.700000,B=0.700000,A=0.150000),VignetteIntensity=0.161468,GrainJitter=0.000000,GrainIntensity=0.000000,AmbientOcclusionIntensity=1.000000,AmbientOcclusionStaticFraction=1.000000,AmbientOcclusionRadius=73.477997,AmbientOcclusionRadiusInWS=False,AmbientOcclusionFadeDistance=8000.000000,AmbientOcclusionFadeRadius=5000.000000,AmbientOcclusionDistance=80.000000,AmbientOcclusionPower=1.200000,AmbientOcclusionBias=3.000000,AmbientOcclusionQuality=100.000000,AmbientOcclusionMipBlend=0.600000,AmbientOcclusionMipScale=1.700000,AmbientOcclusionMipThreshold=0.010000,IndirectLightingColor=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),IndirectLightingIntensity=1.000000,ColorGradingIntensity=0.000000,ColorGradingLUT=Texture2D'/Engine/EditorResources/RGBTable16x1_AssetViewer.RGBTable16x1_AssetViewer',DepthOfFieldMethod=DOFM_BokehDOF,bMobileHQGaussian=False,DepthOfFieldFstop=4.000000,DepthOfFieldSensorWidth=24.576000,DepthOfFieldFocalDistance=1000.000000,DepthOfFieldDepthBlurAmount=1.000000,DepthOfFieldDepthBlurRadius=0.000000,DepthOfFieldFocalRegion=0.000000,DepthOfFieldNearTransitionRegion=300.000000,DepthOfFieldFarTransitionRegion=500.000000,DepthOfFieldScale=0.000000,DepthOfFieldMaxBokehSize=15.000000,DepthOfFieldNearBlurSize=15.000000,DepthOfFieldFarBlurSize=15.000000,DepthOfFieldBokehShape=None,DepthOfFieldOcclusion=0.400000,DepthOfFieldColorThreshold=1.000000,DepthOfFieldSizeThreshold=0.080000,DepthOfFieldSkyFocusDistance=0.000000,DepthOfFieldVignetteSize=200.000000,MotionBlurAmount=0.500000,MotionBlurMax=5.000000,MotionBlurPerObjectSize=0.500000,LPVIntensity=1.000000,LPVVplInjectionBias=0.640000,LPVSize=5312.000000,LPVSecondaryOcclusionIntensity=0.000000,LPVSecondaryBounceIntensity=0.000000,LPVGeometryVolumeBias=0.384000,LPVEmissiveInjectionIntensity=1.000000,LPVDirectionalOcclusionIntensity=0.000000,LPVDirectionalOcclusionRadius=8.000000,LPVDiffuseOcclusionExponent=1.000000,LPVSpecularOcclusionExponent=7.000000,LPVDiffuseOcclusionIntensity=1.000000,LPVSpecularOcclusionIntensity=1.000000,ScreenSpaceReflectionIntensity=100.000000,ScreenSpaceReflectionQuality=100.000000,ScreenSpaceReflectionMaxRoughness=1.000000,ScreenPercentage=100.000000,WeightedBlendables=(Array=),Blendables=),bPostProcessingEnabled=True,LightingRigRotation=109.389069,RotationSpeed=2.000000,DirectionalLightRotation=(Pitch=-39.999985,Yaw=-67.500015,Roll=0.000000))\n+Profiles=(ProfileName=\"Default\",DirectionalLightIntensity=2.620000,DirectionalLightColor=(R=0.990000,G=0.839850,B=0.732600,A=1.000000),SkyLightIntensity=0.880000,bRotateLightingRig=False,bShowEnvironment=True,bShowFloor=True,EnvironmentCubeMapPath=\"/Engine/EditorMaterials/AssetViewer/EpicQuadPanorama_CC+EV1.EpicQuadPanorama_CC+EV1\",PostProcessingSettings=(bOverride_WhiteTemp=True,bOverride_WhiteTint=False,bOverride_ColorSaturation=True,bOverride_ColorContrast=True,bOverride_ColorGamma=True,bOverride_ColorGain=True,bOverride_ColorOffset=True,bOverride_ColorSaturationShadows=False,bOverride_ColorContrastShadows=False,bOverride_ColorGammaShadows=False,bOverride_ColorGainShadows=False,bOverride_ColorOffsetShadows=False,bOverride_ColorSaturationMidtones=False,bOverride_ColorContrastMidtones=False,bOverride_ColorGammaMidtones=False,bOverride_ColorGainMidtones=False,bOverride_ColorOffsetMidtones=False,bOverride_ColorSaturationHighlights=False,bOverride_ColorContrastHighlights=False,bOverride_ColorGammaHighlights=False,bOverride_ColorGainHighlights=False,bOverride_ColorOffsetHighlights=False,bOverride_ColorCorrectionShadowsMax=False,bOverride_ColorCorrectionHighlightsMin=False,bOverride_FilmWhitePoint=False,bOverride_FilmSaturation=False,bOverride_FilmChannelMixerRed=False,bOverride_FilmChannelMixerGreen=False,bOverride_FilmChannelMixerBlue=False,bOverride_FilmContrast=False,bOverride_FilmDynamicRange=False,bOverride_FilmHealAmount=False,bOverride_FilmToeAmount=False,bOverride_FilmShadowTint=False,bOverride_FilmShadowTintBlend=False,bOverride_FilmShadowTintAmount=False,bOverride_FilmSlope=True,bOverride_FilmToe=True,bOverride_FilmShoulder=True,bOverride_FilmBlackClip=True,bOverride_FilmWhiteClip=True,bOverride_SceneColorTint=False,bOverride_SceneFringeIntensity=False,bOverride_AmbientCubemapTint=False,bOverride_AmbientCubemapIntensity=False,bOverride_BloomIntensity=True,bOverride_BloomThreshold=False,bOverride_Bloom1Tint=False,bOverride_Bloom1Size=False,bOverride_Bloom2Size=False,bOverride_Bloom2Tint=False,bOverride_Bloom3Tint=False,bOverride_Bloom3Size=False,bOverride_Bloom4Tint=False,bOverride_Bloom4Size=False,bOverride_Bloom5Tint=False,bOverride_Bloom5Size=False,bOverride_Bloom6Tint=False,bOverride_Bloom6Size=False,bOverride_BloomSizeScale=False,bOverride_BloomDirtMaskIntensity=False,bOverride_BloomDirtMaskTint=False,bOverride_BloomDirtMask=False,bOverride_AutoExposureMethod=True,bOverride_AutoExposureLowPercent=False,bOverride_AutoExposureHighPercent=False,bOverride_AutoExposureMinBrightness=True,bOverride_AutoExposureMaxBrightness=True,bOverride_AutoExposureSpeedUp=False,bOverride_AutoExposureSpeedDown=False,bOverride_AutoExposureBias=True,bOverride_HistogramLogMin=True,bOverride_HistogramLogMax=True,bOverride_LensFlareIntensity=False,bOverride_LensFlareTint=False,bOverride_LensFlareTints=False,bOverride_LensFlareBokehSize=False,bOverride_LensFlareBokehShape=False,bOverride_LensFlareThreshold=False,bOverride_VignetteIntensity=True,bOverride_GrainIntensity=False,bOverride_GrainJitter=False,bOverride_AmbientOcclusionIntensity=True,bOverride_AmbientOcclusionStaticFraction=True,bOverride_AmbientOcclusionRadius=True,bOverride_AmbientOcclusionFadeDistance=False,bOverride_AmbientOcclusionFadeRadius=False,bOverride_AmbientOcclusionDistance=False,bOverride_AmbientOcclusionRadiusInWS=False,bOverride_AmbientOcclusionPower=True,bOverride_AmbientOcclusionBias=True,bOverride_AmbientOcclusionQuality=True,bOverride_AmbientOcclusionMipBlend=True,bOverride_AmbientOcclusionMipScale=True,bOverride_AmbientOcclusionMipThreshold=True,bOverride_LPVIntensity=False,bOverride_LPVDirectionalOcclusionIntensity=False,bOverride_LPVDirectionalOcclusionRadius=False,bOverride_LPVDiffuseOcclusionExponent=False,bOverride_LPVSpecularOcclusionExponent=False,bOverride_LPVDiffuseOcclusionIntensity=False,bOverride_LPVSpecularOcclusionIntensity=False,bOverride_LPVSize=False,bOverride_LPVSecondaryOcclusionIntensity=False,bOverride_LPVSecondaryBounceIntensity=False,bOverride_LPVGeometryVolumeBias=False,bOverride_LPVVplInjectionBias=False,bOverride_LPVEmissiveInjectionIntensity=False,bOverride_IndirectLightingColor=False,bOverride_IndirectLightingIntensity=False,bOverride_ColorGradingIntensity=True,bOverride_ColorGradingLUT=True,bOverride_DepthOfFieldFocalDistance=False,bOverride_DepthOfFieldFstop=False,bOverride_DepthOfFieldSensorWidth=False,bOverride_DepthOfFieldDepthBlurRadius=False,bOverride_DepthOfFieldDepthBlurAmount=False,bOverride_DepthOfFieldFocalRegion=False,bOverride_DepthOfFieldNearTransitionRegion=False,bOverride_DepthOfFieldFarTransitionRegion=False,bOverride_DepthOfFieldScale=True,bOverride_DepthOfFieldMaxBokehSize=False,bOverride_DepthOfFieldNearBlurSize=False,bOverride_DepthOfFieldFarBlurSize=False,bOverride_DepthOfFieldMethod=True,bOverride_MobileHQGaussian=False,bOverride_DepthOfFieldBokehShape=False,bOverride_DepthOfFieldOcclusion=False,bOverride_DepthOfFieldColorThreshold=False,bOverride_DepthOfFieldSizeThreshold=False,bOverride_DepthOfFieldSkyFocusDistance=False,bOverride_DepthOfFieldVignetteSize=False,bOverride_MotionBlurAmount=False,bOverride_MotionBlurMax=False,bOverride_MotionBlurPerObjectSize=False,bOverride_ScreenPercentage=False,bOverride_ScreenSpaceReflectionIntensity=True,bOverride_ScreenSpaceReflectionQuality=True,bOverride_ScreenSpaceReflectionMaxRoughness=True,bOverride_ScreenSpaceReflectionRoughnessScale=False,WhiteTemp=6700.000000,WhiteTint=0.000000,ColorSaturation=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorContrast=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGamma=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGain=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorOffset=(X=0.005000,Y=0.005000,Z=0.005000,W=0.000000),ColorSaturationShadows=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorContrastShadows=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGammaShadows=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGainShadows=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorOffsetShadows=(X=0.000000,Y=0.000000,Z=0.000000,W=0.000000),ColorCorrectionShadowsMax=0.090000,ColorSaturationMidtones=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorContrastMidtones=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGammaMidtones=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGainMidtones=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorOffsetMidtones=(X=0.000000,Y=0.000000,Z=0.000000,W=0.000000),ColorSaturationHighlights=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorContrastHighlights=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGammaHighlights=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGainHighlights=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorOffsetHighlights=(X=0.000000,Y=0.000000,Z=0.000000,W=0.000000),ColorCorrectionHighlightsMin=0.500000,FilmWhitePoint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),FilmShadowTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),FilmShadowTintBlend=0.500000,FilmShadowTintAmount=0.000000,FilmSaturation=1.000000,FilmChannelMixerRed=(R=1.000000,G=0.000000,B=0.000000,A=1.000000),FilmChannelMixerGreen=(R=0.000000,G=1.000000,B=0.000000,A=1.000000),FilmChannelMixerBlue=(R=0.000000,G=0.000000,B=1.000000,A=1.000000),FilmContrast=0.030000,FilmToeAmount=1.000000,FilmHealAmount=1.000000,FilmDynamicRange=4.000000,FilmSlope=0.880000,FilmToe=0.550000,FilmShoulder=0.260000,FilmBlackClip=0.000000,FilmWhiteClip=0.040000,SceneColorTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),SceneFringeIntensity=0.000000,BloomIntensity=0.675000,BloomThreshold=-1.000000,BloomSizeScale=4.000000,Bloom1Size=0.300000,Bloom2Size=1.000000,Bloom3Size=2.000000,Bloom4Size=10.000000,Bloom5Size=30.000000,Bloom6Size=64.000000,Bloom1Tint=(R=0.346500,G=0.346500,B=0.346500,A=1.000000),Bloom2Tint=(R=0.138000,G=0.138000,B=0.138000,A=1.000000),Bloom3Tint=(R=0.117600,G=0.117600,B=0.117600,A=1.000000),Bloom4Tint=(R=0.066000,G=0.066000,B=0.066000,A=1.000000),Bloom5Tint=(R=0.066000,G=0.066000,B=0.066000,A=1.000000),Bloom6Tint=(R=0.061000,G=0.061000,B=0.061000,A=1.000000),BloomDirtMaskIntensity=0.000000,BloomDirtMaskTint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),BloomDirtMask=None,AmbientCubemapTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),AmbientCubemapIntensity=1.000000,AmbientCubemap=None,AutoExposureMethod=AEM_Histogram,AutoExposureLowPercent=80.000000,AutoExposureHighPercent=98.300003,AutoExposureMinBrightness=1.000000,AutoExposureMaxBrightness=1.000000,AutoExposureSpeedUp=3.000000,AutoExposureSpeedDown=1.000000,AutoExposureBias=0.330000,HistogramLogMin=-8.000000,HistogramLogMax=4.000000,LensFlareIntensity=1.000000,LensFlareTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),LensFlareBokehSize=3.000000,LensFlareThreshold=8.000000,LensFlareBokehShape=None,LensFlareTints[0]=(R=1.000000,G=0.800000,B=0.400000,A=0.600000),LensFlareTints[1]=(R=1.000000,G=1.000000,B=0.600000,A=0.530000),LensFlareTints[2]=(R=0.800000,G=0.800000,B=1.000000,A=0.460000),LensFlareTints[3]=(R=0.500000,G=1.000000,B=0.400000,A=0.390000),LensFlareTints[4]=(R=0.500000,G=0.800000,B=1.000000,A=0.310000),LensFlareTints[5]=(R=0.900000,G=1.000000,B=0.800000,A=0.270000),LensFlareTints[6]=(R=1.000000,G=0.800000,B=0.400000,A=0.220000),LensFlareTints[7]=(R=0.900000,G=0.700000,B=0.700000,A=0.150000),VignetteIntensity=0.161468,GrainJitter=0.000000,GrainIntensity=0.000000,AmbientOcclusionIntensity=1.000000,AmbientOcclusionStaticFraction=1.000000,AmbientOcclusionRadius=73.477997,AmbientOcclusionRadiusInWS=False,AmbientOcclusionFadeDistance=8000.000000,AmbientOcclusionFadeRadius=5000.000000,AmbientOcclusionDistance=80.000000,AmbientOcclusionPower=1.200000,AmbientOcclusionBias=3.000000,AmbientOcclusionQuality=100.000000,AmbientOcclusionMipBlend=0.600000,AmbientOcclusionMipScale=1.700000,AmbientOcclusionMipThreshold=0.010000,IndirectLightingColor=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),IndirectLightingIntensity=1.000000,ColorGradingIntensity=0.000000,ColorGradingLUT=Texture2D'/Engine/EditorResources/RGBTable16x1_AssetViewer.RGBTable16x1_AssetViewer',DepthOfFieldMethod=DOFM_BokehDOF,bMobileHQGaussian=False,DepthOfFieldFstop=4.000000,DepthOfFieldSensorWidth=24.576000,DepthOfFieldFocalDistance=1000.000000,DepthOfFieldDepthBlurAmount=1.000000,DepthOfFieldDepthBlurRadius=0.000000,DepthOfFieldFocalRegion=0.000000,DepthOfFieldNearTransitionRegion=300.000000,DepthOfFieldFarTransitionRegion=500.000000,DepthOfFieldScale=0.000000,DepthOfFieldMaxBokehSize=15.000000,DepthOfFieldNearBlurSize=15.000000,DepthOfFieldFarBlurSize=15.000000,DepthOfFieldBokehShape=None,DepthOfFieldOcclusion=0.400000,DepthOfFieldColorThreshold=1.000000,DepthOfFieldSizeThreshold=0.080000,DepthOfFieldSkyFocusDistance=0.000000,DepthOfFieldVignetteSize=200.000000,MotionBlurAmount=0.500000,MotionBlurMax=5.000000,MotionBlurPerObjectSize=0.500000,LPVIntensity=1.000000,LPVVplInjectionBias=0.640000,LPVSize=5312.000000,LPVSecondaryOcclusionIntensity=0.000000,LPVSecondaryBounceIntensity=0.000000,LPVGeometryVolumeBias=0.384000,LPVEmissiveInjectionIntensity=1.000000,LPVDirectionalOcclusionIntensity=0.000000,LPVDirectionalOcclusionRadius=8.000000,LPVDiffuseOcclusionExponent=1.000000,LPVSpecularOcclusionExponent=7.000000,LPVDiffuseOcclusionIntensity=1.000000,LPVSpecularOcclusionIntensity=1.000000,ScreenSpaceReflectionIntensity=100.000000,ScreenSpaceReflectionQuality=100.000000,ScreenSpaceReflectionMaxRoughness=1.000000,ScreenPercentage=100.000000,WeightedBlendables=(Array=),Blendables=),bPostProcessingEnabled=True,LightingRigRotation=109.389069,RotationSpeed=2.000000,DirectionalLightRotation=(Pitch=-39.999985,Yaw=-67.500015,Roll=0.000000))\n+Profiles=(ProfileName=\"Default\",DirectionalLightIntensity=2.620000,DirectionalLightColor=(R=0.990000,G=0.839850,B=0.732600,A=1.000000),SkyLightIntensity=0.880000,bRotateLightingRig=False,bShowEnvironment=True,bShowFloor=True,EnvironmentCubeMapPath=\"/Engine/EditorMaterials/AssetViewer/EpicQuadPanorama_CC+EV1.EpicQuadPanorama_CC+EV1\",PostProcessingSettings=(bOverride_WhiteTemp=True,bOverride_WhiteTint=False,bOverride_ColorSaturation=True,bOverride_ColorContrast=True,bOverride_ColorGamma=True,bOverride_ColorGain=True,bOverride_ColorOffset=True,bOverride_ColorSaturationShadows=False,bOverride_ColorContrastShadows=False,bOverride_ColorGammaShadows=False,bOverride_ColorGainShadows=False,bOverride_ColorOffsetShadows=False,bOverride_ColorSaturationMidtones=False,bOverride_ColorContrastMidtones=False,bOverride_ColorGammaMidtones=False,bOverride_ColorGainMidtones=False,bOverride_ColorOffsetMidtones=False,bOverride_ColorSaturationHighlights=False,bOverride_ColorContrastHighlights=False,bOverride_ColorGammaHighlights=False,bOverride_ColorGainHighlights=False,bOverride_ColorOffsetHighlights=False,bOverride_ColorCorrectionShadowsMax=False,bOverride_ColorCorrectionHighlightsMin=False,bOverride_FilmWhitePoint=False,bOverride_FilmSaturation=False,bOverride_FilmChannelMixerRed=False,bOverride_FilmChannelMixerGreen=False,bOverride_FilmChannelMixerBlue=False,bOverride_FilmContrast=False,bOverride_FilmDynamicRange=False,bOverride_FilmHealAmount=False,bOverride_FilmToeAmount=False,bOverride_FilmShadowTint=False,bOverride_FilmShadowTintBlend=False,bOverride_FilmShadowTintAmount=False,bOverride_FilmSlope=True,bOverride_FilmToe=True,bOverride_FilmShoulder=True,bOverride_FilmBlackClip=True,bOverride_FilmWhiteClip=True,bOverride_SceneColorTint=False,bOverride_SceneFringeIntensity=False,bOverride_AmbientCubemapTint=False,bOverride_AmbientCubemapIntensity=False,bOverride_BloomIntensity=True,bOverride_BloomThreshold=False,bOverride_Bloom1Tint=False,bOverride_Bloom1Size=False,bOverride_Bloom2Size=False,bOverride_Bloom2Tint=False,bOverride_Bloom3Tint=False,bOverride_Bloom3Size=False,bOverride_Bloom4Tint=False,bOverride_Bloom4Size=False,bOverride_Bloom5Tint=False,bOverride_Bloom5Size=False,bOverride_Bloom6Tint=False,bOverride_Bloom6Size=False,bOverride_BloomSizeScale=False,bOverride_BloomDirtMaskIntensity=False,bOverride_BloomDirtMaskTint=False,bOverride_BloomDirtMask=False,bOverride_AutoExposureMethod=True,bOverride_AutoExposureLowPercent=False,bOverride_AutoExposureHighPercent=False,bOverride_AutoExposureMinBrightness=True,bOverride_AutoExposureMaxBrightness=True,bOverride_AutoExposureSpeedUp=False,bOverride_AutoExposureSpeedDown=False,bOverride_AutoExposureBias=True,bOverride_HistogramLogMin=True,bOverride_HistogramLogMax=True,bOverride_LensFlareIntensity=False,bOverride_LensFlareTint=False,bOverride_LensFlareTints=False,bOverride_LensFlareBokehSize=False,bOverride_LensFlareBokehShape=False,bOverride_LensFlareThreshold=False,bOverride_VignetteIntensity=True,bOverride_GrainIntensity=False,bOverride_GrainJitter=False,bOverride_AmbientOcclusionIntensity=True,bOverride_AmbientOcclusionStaticFraction=True,bOverride_AmbientOcclusionRadius=True,bOverride_AmbientOcclusionFadeDistance=False,bOverride_AmbientOcclusionFadeRadius=False,bOverride_AmbientOcclusionDistance=False,bOverride_AmbientOcclusionRadiusInWS=False,bOverride_AmbientOcclusionPower=True,bOverride_AmbientOcclusionBias=True,bOverride_AmbientOcclusionQuality=True,bOverride_AmbientOcclusionMipBlend=True,bOverride_AmbientOcclusionMipScale=True,bOverride_AmbientOcclusionMipThreshold=True,bOverride_LPVIntensity=False,bOverride_LPVDirectionalOcclusionIntensity=False,bOverride_LPVDirectionalOcclusionRadius=False,bOverride_LPVDiffuseOcclusionExponent=False,bOverride_LPVSpecularOcclusionExponent=False,bOverride_LPVDiffuseOcclusionIntensity=False,bOverride_LPVSpecularOcclusionIntensity=False,bOverride_LPVSize=False,bOverride_LPVSecondaryOcclusionIntensity=False,bOverride_LPVSecondaryBounceIntensity=False,bOverride_LPVGeometryVolumeBias=False,bOverride_LPVVplInjectionBias=False,bOverride_LPVEmissiveInjectionIntensity=False,bOverride_IndirectLightingColor=False,bOverride_IndirectLightingIntensity=False,bOverride_ColorGradingIntensity=True,bOverride_ColorGradingLUT=True,bOverride_DepthOfFieldFocalDistance=False,bOverride_DepthOfFieldFstop=False,bOverride_DepthOfFieldSensorWidth=False,bOverride_DepthOfFieldDepthBlurRadius=False,bOverride_DepthOfFieldDepthBlurAmount=False,bOverride_DepthOfFieldFocalRegion=False,bOverride_DepthOfFieldNearTransitionRegion=False,bOverride_DepthOfFieldFarTransitionRegion=False,bOverride_DepthOfFieldScale=True,bOverride_DepthOfFieldMaxBokehSize=False,bOverride_DepthOfFieldNearBlurSize=False,bOverride_DepthOfFieldFarBlurSize=False,bOverride_DepthOfFieldMethod=True,bOverride_MobileHQGaussian=False,bOverride_DepthOfFieldBokehShape=False,bOverride_DepthOfFieldOcclusion=False,bOverride_DepthOfFieldColorThreshold=False,bOverride_DepthOfFieldSizeThreshold=False,bOverride_DepthOfFieldSkyFocusDistance=False,bOverride_DepthOfFieldVignetteSize=False,bOverride_MotionBlurAmount=False,bOverride_MotionBlurMax=False,bOverride_MotionBlurPerObjectSize=False,bOverride_ScreenPercentage=False,bOverride_ScreenSpaceReflectionIntensity=True,bOverride_ScreenSpaceReflectionQuality=True,bOverride_ScreenSpaceReflectionMaxRoughness=True,bOverride_ScreenSpaceReflectionRoughnessScale=False,WhiteTemp=6700.000000,WhiteTint=0.000000,ColorSaturation=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorContrast=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGamma=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGain=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorOffset=(X=0.005000,Y=0.005000,Z=0.005000,W=0.000000),ColorSaturationShadows=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorContrastShadows=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGammaShadows=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGainShadows=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorOffsetShadows=(X=0.000000,Y=0.000000,Z=0.000000,W=0.000000),ColorCorrectionShadowsMax=0.090000,ColorSaturationMidtones=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorContrastMidtones=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGammaMidtones=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGainMidtones=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorOffsetMidtones=(X=0.000000,Y=0.000000,Z=0.000000,W=0.000000),ColorSaturationHighlights=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorContrastHighlights=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGammaHighlights=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGainHighlights=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorOffsetHighlights=(X=0.000000,Y=0.000000,Z=0.000000,W=0.000000),ColorCorrectionHighlightsMin=0.500000,FilmWhitePoint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),FilmShadowTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),FilmShadowTintBlend=0.500000,FilmShadowTintAmount=0.000000,FilmSaturation=1.000000,FilmChannelMixerRed=(R=1.000000,G=0.000000,B=0.000000,A=1.000000),FilmChannelMixerGreen=(R=0.000000,G=1.000000,B=0.000000,A=1.000000),FilmChannelMixerBlue=(R=0.000000,G=0.000000,B=1.000000,A=1.000000),FilmContrast=0.030000,FilmToeAmount=1.000000,FilmHealAmount=1.000000,FilmDynamicRange=4.000000,FilmSlope=0.880000,FilmToe=0.550000,FilmShoulder=0.260000,FilmBlackClip=0.000000,FilmWhiteClip=0.040000,SceneColorTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),SceneFringeIntensity=0.000000,BloomIntensity=0.675000,BloomThreshold=-1.000000,BloomSizeScale=4.000000,Bloom1Size=0.300000,Bloom2Size=1.000000,Bloom3Size=2.000000,Bloom4Size=10.000000,Bloom5Size=30.000000,Bloom6Size=64.000000,Bloom1Tint=(R=0.346500,G=0.346500,B=0.346500,A=1.000000),Bloom2Tint=(R=0.138000,G=0.138000,B=0.138000,A=1.000000),Bloom3Tint=(R=0.117600,G=0.117600,B=0.117600,A=1.000000),Bloom4Tint=(R=0.066000,G=0.066000,B=0.066000,A=1.000000),Bloom5Tint=(R=0.066000,G=0.066000,B=0.066000,A=1.000000),Bloom6Tint=(R=0.061000,G=0.061000,B=0.061000,A=1.000000),BloomDirtMaskIntensity=0.000000,BloomDirtMaskTint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),BloomDirtMask=None,AmbientCubemapTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),AmbientCubemapIntensity=1.000000,AmbientCubemap=None,AutoExposureMethod=AEM_Histogram,AutoExposureLowPercent=80.000000,AutoExposureHighPercent=98.300003,AutoExposureMinBrightness=1.000000,AutoExposureMaxBrightness=1.000000,AutoExposureSpeedUp=3.000000,AutoExposureSpeedDown=1.000000,AutoExposureBias=0.330000,HistogramLogMin=-8.000000,HistogramLogMax=4.000000,LensFlareIntensity=1.000000,LensFlareTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),LensFlareBokehSize=3.000000,LensFlareThreshold=8.000000,LensFlareBokehShape=None,LensFlareTints[0]=(R=1.000000,G=0.800000,B=0.400000,A=0.600000),LensFlareTints[1]=(R=1.000000,G=1.000000,B=0.600000,A=0.530000),LensFlareTints[2]=(R=0.800000,G=0.800000,B=1.000000,A=0.460000),LensFlareTints[3]=(R=0.500000,G=1.000000,B=0.400000,A=0.390000),LensFlareTints[4]=(R=0.500000,G=0.800000,B=1.000000,A=0.310000),LensFlareTints[5]=(R=0.900000,G=1.000000,B=0.800000,A=0.270000),LensFlareTints[6]=(R=1.000000,G=0.800000,B=0.400000,A=0.220000),LensFlareTints[7]=(R=0.900000,G=0.700000,B=0.700000,A=0.150000),VignetteIntensity=0.161468,GrainJitter=0.000000,GrainIntensity=0.000000,AmbientOcclusionIntensity=1.000000,AmbientOcclusionStaticFraction=1.000000,AmbientOcclusionRadius=73.477997,AmbientOcclusionRadiusInWS=False,AmbientOcclusionFadeDistance=8000.000000,AmbientOcclusionFadeRadius=5000.000000,AmbientOcclusionDistance=80.000000,AmbientOcclusionPower=1.200000,AmbientOcclusionBias=3.000000,AmbientOcclusionQuality=100.000000,AmbientOcclusionMipBlend=0.600000,AmbientOcclusionMipScale=1.700000,AmbientOcclusionMipThreshold=0.010000,IndirectLightingColor=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),IndirectLightingIntensity=1.000000,ColorGradingIntensity=0.000000,ColorGradingLUT=Texture2D'/Engine/EditorResources/RGBTable16x1_AssetViewer.RGBTable16x1_AssetViewer',DepthOfFieldMethod=DOFM_BokehDOF,bMobileHQGaussian=False,DepthOfFieldFstop=4.000000,DepthOfFieldSensorWidth=24.576000,DepthOfFieldFocalDistance=1000.000000,DepthOfFieldDepthBlurAmount=1.000000,DepthOfFieldDepthBlurRadius=0.000000,DepthOfFieldFocalRegion=0.000000,DepthOfFieldNearTransitionRegion=300.000000,DepthOfFieldFarTransitionRegion=500.000000,DepthOfFieldScale=0.000000,DepthOfFieldMaxBokehSize=15.000000,DepthOfFieldNearBlurSize=15.000000,DepthOfFieldFarBlurSize=15.000000,DepthOfFieldBokehShape=None,DepthOfFieldOcclusion=0.400000,DepthOfFieldColorThreshold=1.000000,DepthOfFieldSizeThreshold=0.080000,DepthOfFieldSkyFocusDistance=0.000000,DepthOfFieldVignetteSize=200.000000,MotionBlurAmount=0.500000,MotionBlurMax=5.000000,MotionBlurPerObjectSize=0.500000,LPVIntensity=1.000000,LPVVplInjectionBias=0.640000,LPVSize=5312.000000,LPVSecondaryOcclusionIntensity=0.000000,LPVSecondaryBounceIntensity=0.000000,LPVGeometryVolumeBias=0.384000,LPVEmissiveInjectionIntensity=1.000000,LPVDirectionalOcclusionIntensity=0.000000,LPVDirectionalOcclusionRadius=8.000000,LPVDiffuseOcclusionExponent=1.000000,LPVSpecularOcclusionExponent=7.000000,LPVDiffuseOcclusionIntensity=1.000000,LPVSpecularOcclusionIntensity=1.000000,ScreenSpaceReflectionIntensity=100.000000,ScreenSpaceReflectionQuality=100.000000,ScreenSpaceReflectionMaxRoughness=1.000000,ScreenPercentage=100.000000,WeightedBlendables=(Array=),Blendables=),bPostProcessingEnabled=True,LightingRigRotation=109.389069,RotationSpeed=2.000000,DirectionalLightRotation=(Pitch=-39.999985,Yaw=-67.500015,Roll=0.000000))\n+Profiles=(ProfileName=\"Default\",DirectionalLightIntensity=2.620000,DirectionalLightColor=(R=0.990000,G=0.839850,B=0.732600,A=1.000000),SkyLightIntensity=0.880000,bRotateLightingRig=False,bShowEnvironment=True,bShowFloor=True,EnvironmentCubeMapPath=\"/Engine/EditorMaterials/AssetViewer/EpicQuadPanorama_CC+EV1.EpicQuadPanorama_CC+EV1\",PostProcessingSettings=(bOverride_WhiteTemp=True,bOverride_WhiteTint=False,bOverride_ColorSaturation=True,bOverride_ColorContrast=True,bOverride_ColorGamma=True,bOverride_ColorGain=True,bOverride_ColorOffset=True,bOverride_ColorSaturationShadows=False,bOverride_ColorContrastShadows=False,bOverride_ColorGammaShadows=False,bOverride_ColorGainShadows=False,bOverride_ColorOffsetShadows=False,bOverride_ColorSaturationMidtones=False,bOverride_ColorContrastMidtones=False,bOverride_ColorGammaMidtones=False,bOverride_ColorGainMidtones=False,bOverride_ColorOffsetMidtones=False,bOverride_ColorSaturationHighlights=False,bOverride_ColorContrastHighlights=False,bOverride_ColorGammaHighlights=False,bOverride_ColorGainHighlights=False,bOverride_ColorOffsetHighlights=False,bOverride_ColorCorrectionShadowsMax=False,bOverride_ColorCorrectionHighlightsMin=False,bOverride_FilmWhitePoint=False,bOverride_FilmSaturation=False,bOverride_FilmChannelMixerRed=False,bOverride_FilmChannelMixerGreen=False,bOverride_FilmChannelMixerBlue=False,bOverride_FilmContrast=False,bOverride_FilmDynamicRange=False,bOverride_FilmHealAmount=False,bOverride_FilmToeAmount=False,bOverride_FilmShadowTint=False,bOverride_FilmShadowTintBlend=False,bOverride_FilmShadowTintAmount=False,bOverride_FilmSlope=True,bOverride_FilmToe=True,bOverride_FilmShoulder=True,bOverride_FilmBlackClip=True,bOverride_FilmWhiteClip=True,bOverride_SceneColorTint=False,bOverride_SceneFringeIntensity=False,bOverride_AmbientCubemapTint=False,bOverride_AmbientCubemapIntensity=False,bOverride_BloomIntensity=True,bOverride_BloomThreshold=False,bOverride_Bloom1Tint=False,bOverride_Bloom1Size=False,bOverride_Bloom2Size=False,bOverride_Bloom2Tint=False,bOverride_Bloom3Tint=False,bOverride_Bloom3Size=False,bOverride_Bloom4Tint=False,bOverride_Bloom4Size=False,bOverride_Bloom5Tint=False,bOverride_Bloom5Size=False,bOverride_Bloom6Tint=False,bOverride_Bloom6Size=False,bOverride_BloomSizeScale=False,bOverride_BloomDirtMaskIntensity=False,bOverride_BloomDirtMaskTint=False,bOverride_BloomDirtMask=False,bOverride_AutoExposureMethod=True,bOverride_AutoExposureLowPercent=False,bOverride_AutoExposureHighPercent=False,bOverride_AutoExposureMinBrightness=True,bOverride_AutoExposureMaxBrightness=True,bOverride_AutoExposureSpeedUp=False,bOverride_AutoExposureSpeedDown=False,bOverride_AutoExposureBias=True,bOverride_HistogramLogMin=True,bOverride_HistogramLogMax=True,bOverride_LensFlareIntensity=False,bOverride_LensFlareTint=False,bOverride_LensFlareTints=False,bOverride_LensFlareBokehSize=False,bOverride_LensFlareBokehShape=False,bOverride_LensFlareThreshold=False,bOverride_VignetteIntensity=True,bOverride_GrainIntensity=False,bOverride_GrainJitter=False,bOverride_AmbientOcclusionIntensity=True,bOverride_AmbientOcclusionStaticFraction=True,bOverride_AmbientOcclusionRadius=True,bOverride_AmbientOcclusionFadeDistance=False,bOverride_AmbientOcclusionFadeRadius=False,bOverride_AmbientOcclusionDistance=False,bOverride_AmbientOcclusionRadiusInWS=False,bOverride_AmbientOcclusionPower=True,bOverride_AmbientOcclusionBias=True,bOverride_AmbientOcclusionQuality=True,bOverride_AmbientOcclusionMipBlend=True,bOverride_AmbientOcclusionMipScale=True,bOverride_AmbientOcclusionMipThreshold=True,bOverride_LPVIntensity=False,bOverride_LPVDirectionalOcclusionIntensity=False,bOverride_LPVDirectionalOcclusionRadius=False,bOverride_LPVDiffuseOcclusionExponent=False,bOverride_LPVSpecularOcclusionExponent=False,bOverride_LPVDiffuseOcclusionIntensity=False,bOverride_LPVSpecularOcclusionIntensity=False,bOverride_LPVSize=False,bOverride_LPVSecondaryOcclusionIntensity=False,bOverride_LPVSecondaryBounceIntensity=False,bOverride_LPVGeometryVolumeBias=False,bOverride_LPVVplInjectionBias=False,bOverride_LPVEmissiveInjectionIntensity=False,bOverride_IndirectLightingColor=False,bOverride_IndirectLightingIntensity=False,bOverride_ColorGradingIntensity=True,bOverride_ColorGradingLUT=True,bOverride_DepthOfFieldFocalDistance=False,bOverride_DepthOfFieldFstop=False,bOverride_DepthOfFieldSensorWidth=False,bOverride_DepthOfFieldDepthBlurRadius=False,bOverride_DepthOfFieldDepthBlurAmount=False,bOverride_DepthOfFieldFocalRegion=False,bOverride_DepthOfFieldNearTransitionRegion=False,bOverride_DepthOfFieldFarTransitionRegion=False,bOverride_DepthOfFieldScale=True,bOverride_DepthOfFieldMaxBokehSize=False,bOverride_DepthOfFieldNearBlurSize=False,bOverride_DepthOfFieldFarBlurSize=False,bOverride_DepthOfFieldMethod=True,bOverride_MobileHQGaussian=False,bOverride_DepthOfFieldBokehShape=False,bOverride_DepthOfFieldOcclusion=False,bOverride_DepthOfFieldColorThreshold=False,bOverride_DepthOfFieldSizeThreshold=False,bOverride_DepthOfFieldSkyFocusDistance=False,bOverride_DepthOfFieldVignetteSize=False,bOverride_MotionBlurAmount=False,bOverride_MotionBlurMax=False,bOverride_MotionBlurPerObjectSize=False,bOverride_ScreenPercentage=False,bOverride_ScreenSpaceReflectionIntensity=True,bOverride_ScreenSpaceReflectionQuality=True,bOverride_ScreenSpaceReflectionMaxRoughness=True,bOverride_ScreenSpaceReflectionRoughnessScale=False,WhiteTemp=6700.000000,WhiteTint=0.000000,ColorSaturation=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorContrast=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGamma=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGain=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorOffset=(X=0.005000,Y=0.005000,Z=0.005000,W=0.000000),ColorSaturationShadows=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorContrastShadows=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGammaShadows=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGainShadows=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorOffsetShadows=(X=0.000000,Y=0.000000,Z=0.000000,W=0.000000),ColorCorrectionShadowsMax=0.090000,ColorSaturationMidtones=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorContrastMidtones=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGammaMidtones=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGainMidtones=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorOffsetMidtones=(X=0.000000,Y=0.000000,Z=0.000000,W=0.000000),ColorSaturationHighlights=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorContrastHighlights=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGammaHighlights=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGainHighlights=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorOffsetHighlights=(X=0.000000,Y=0.000000,Z=0.000000,W=0.000000),ColorCorrectionHighlightsMin=0.500000,FilmWhitePoint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),FilmShadowTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),FilmShadowTintBlend=0.500000,FilmShadowTintAmount=0.000000,FilmSaturation=1.000000,FilmChannelMixerRed=(R=1.000000,G=0.000000,B=0.000000,A=1.000000),FilmChannelMixerGreen=(R=0.000000,G=1.000000,B=0.000000,A=1.000000),FilmChannelMixerBlue=(R=0.000000,G=0.000000,B=1.000000,A=1.000000),FilmContrast=0.030000,FilmToeAmount=1.000000,FilmHealAmount=1.000000,FilmDynamicRange=4.000000,FilmSlope=0.880000,FilmToe=0.550000,FilmShoulder=0.260000,FilmBlackClip=0.000000,FilmWhiteClip=0.040000,SceneColorTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),SceneFringeIntensity=0.000000,BloomIntensity=0.675000,BloomThreshold=-1.000000,BloomSizeScale=4.000000,Bloom1Size=0.300000,Bloom2Size=1.000000,Bloom3Size=2.000000,Bloom4Size=10.000000,Bloom5Size=30.000000,Bloom6Size=64.000000,Bloom1Tint=(R=0.346500,G=0.346500,B=0.346500,A=1.000000),Bloom2Tint=(R=0.138000,G=0.138000,B=0.138000,A=1.000000),Bloom3Tint=(R=0.117600,G=0.117600,B=0.117600,A=1.000000),Bloom4Tint=(R=0.066000,G=0.066000,B=0.066000,A=1.000000),Bloom5Tint=(R=0.066000,G=0.066000,B=0.066000,A=1.000000),Bloom6Tint=(R=0.061000,G=0.061000,B=0.061000,A=1.000000),BloomDirtMaskIntensity=0.000000,BloomDirtMaskTint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),BloomDirtMask=None,AmbientCubemapTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),AmbientCubemapIntensity=1.000000,AmbientCubemap=None,AutoExposureMethod=AEM_Histogram,AutoExposureLowPercent=80.000000,AutoExposureHighPercent=98.300003,AutoExposureMinBrightness=1.000000,AutoExposureMaxBrightness=1.000000,AutoExposureSpeedUp=3.000000,AutoExposureSpeedDown=1.000000,AutoExposureBias=0.330000,HistogramLogMin=-8.000000,HistogramLogMax=4.000000,LensFlareIntensity=1.000000,LensFlareTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),LensFlareBokehSize=3.000000,LensFlareThreshold=8.000000,LensFlareBokehShape=None,LensFlareTints[0]=(R=1.000000,G=0.800000,B=0.400000,A=0.600000),LensFlareTints[1]=(R=1.000000,G=1.000000,B=0.600000,A=0.530000),LensFlareTints[2]=(R=0.800000,G=0.800000,B=1.000000,A=0.460000),LensFlareTints[3]=(R=0.500000,G=1.000000,B=0.400000,A=0.390000),LensFlareTints[4]=(R=0.500000,G=0.800000,B=1.000000,A=0.310000),LensFlareTints[5]=(R=0.900000,G=1.000000,B=0.800000,A=0.270000),LensFlareTints[6]=(R=1.000000,G=0.800000,B=0.400000,A=0.220000),LensFlareTints[7]=(R=0.900000,G=0.700000,B=0.700000,A=0.150000),VignetteIntensity=0.161468,GrainJitter=0.000000,GrainIntensity=0.000000,AmbientOcclusionIntensity=1.000000,AmbientOcclusionStaticFraction=1.000000,AmbientOcclusionRadius=73.477997,AmbientOcclusionRadiusInWS=False,AmbientOcclusionFadeDistance=8000.000000,AmbientOcclusionFadeRadius=5000.000000,AmbientOcclusionDistance=80.000000,AmbientOcclusionPower=1.200000,AmbientOcclusionBias=3.000000,AmbientOcclusionQuality=100.000000,AmbientOcclusionMipBlend=0.600000,AmbientOcclusionMipScale=1.700000,AmbientOcclusionMipThreshold=0.010000,IndirectLightingColor=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),IndirectLightingIntensity=1.000000,ColorGradingIntensity=0.000000,ColorGradingLUT=Texture2D'/Engine/EditorResources/RGBTable16x1_AssetViewer.RGBTable16x1_AssetViewer',DepthOfFieldMethod=DOFM_BokehDOF,bMobileHQGaussian=False,DepthOfFieldFstop=4.000000,DepthOfFieldSensorWidth=24.576000,DepthOfFieldFocalDistance=1000.000000,DepthOfFieldDepthBlurAmount=1.000000,DepthOfFieldDepthBlurRadius=0.000000,DepthOfFieldFocalRegion=0.000000,DepthOfFieldNearTransitionRegion=300.000000,DepthOfFieldFarTransitionRegion=500.000000,DepthOfFieldScale=0.000000,DepthOfFieldMaxBokehSize=15.000000,DepthOfFieldNearBlurSize=15.000000,DepthOfFieldFarBlurSize=15.000000,DepthOfFieldBokehShape=None,DepthOfFieldOcclusion=0.400000,DepthOfFieldColorThreshold=1.000000,DepthOfFieldSizeThreshold=0.080000,DepthOfFieldSkyFocusDistance=0.000000,DepthOfFieldVignetteSize=200.000000,MotionBlurAmount=0.500000,MotionBlurMax=5.000000,MotionBlurPerObjectSize=0.500000,LPVIntensity=1.000000,LPVVplInjectionBias=0.640000,LPVSize=5312.000000,LPVSecondaryOcclusionIntensity=0.000000,LPVSecondaryBounceIntensity=0.000000,LPVGeometryVolumeBias=0.384000,LPVEmissiveInjectionIntensity=1.000000,LPVDirectionalOcclusionIntensity=0.000000,LPVDirectionalOcclusionRadius=8.000000,LPVDiffuseOcclusionExponent=1.000000,LPVSpecularOcclusionExponent=7.000000,LPVDiffuseOcclusionIntensity=1.000000,LPVSpecularOcclusionIntensity=1.000000,ScreenSpaceReflectionIntensity=100.000000,ScreenSpaceReflectionQuality=100.000000,ScreenSpaceReflectionMaxRoughness=1.000000,ScreenPercentage=100.000000,WeightedBlendables=(Array=),Blendables=),bPostProcessingEnabled=True,LightingRigRotation=109.389069,RotationSpeed=2.000000,DirectionalLightRotation=(Pitch=-39.999985,Yaw=-67.500015,Roll=0.000000))\n+Profiles=(ProfileName=\"Default\",DirectionalLightIntensity=2.620000,DirectionalLightColor=(R=0.990000,G=0.839850,B=0.732600,A=1.000000),SkyLightIntensity=0.880000,bRotateLightingRig=False,bShowEnvironment=True,bShowFloor=True,EnvironmentCubeMapPath=\"/Engine/EditorMaterials/AssetViewer/EpicQuadPanorama_CC+EV1.EpicQuadPanorama_CC+EV1\",PostProcessingSettings=(bOverride_WhiteTemp=True,bOverride_WhiteTint=False,bOverride_ColorSaturation=True,bOverride_ColorContrast=True,bOverride_ColorGamma=True,bOverride_ColorGain=True,bOverride_ColorOffset=True,bOverride_ColorSaturationShadows=False,bOverride_ColorContrastShadows=False,bOverride_ColorGammaShadows=False,bOverride_ColorGainShadows=False,bOverride_ColorOffsetShadows=False,bOverride_ColorSaturationMidtones=False,bOverride_ColorContrastMidtones=False,bOverride_ColorGammaMidtones=False,bOverride_ColorGainMidtones=False,bOverride_ColorOffsetMidtones=False,bOverride_ColorSaturationHighlights=False,bOverride_ColorContrastHighlights=False,bOverride_ColorGammaHighlights=False,bOverride_ColorGainHighlights=False,bOverride_ColorOffsetHighlights=False,bOverride_ColorCorrectionShadowsMax=False,bOverride_ColorCorrectionHighlightsMin=False,bOverride_FilmWhitePoint=False,bOverride_FilmSaturation=False,bOverride_FilmChannelMixerRed=False,bOverride_FilmChannelMixerGreen=False,bOverride_FilmChannelMixerBlue=False,bOverride_FilmContrast=False,bOverride_FilmDynamicRange=False,bOverride_FilmHealAmount=False,bOverride_FilmToeAmount=False,bOverride_FilmShadowTint=False,bOverride_FilmShadowTintBlend=False,bOverride_FilmShadowTintAmount=False,bOverride_FilmSlope=True,bOverride_FilmToe=True,bOverride_FilmShoulder=True,bOverride_FilmBlackClip=True,bOverride_FilmWhiteClip=True,bOverride_SceneColorTint=False,bOverride_SceneFringeIntensity=False,bOverride_AmbientCubemapTint=False,bOverride_AmbientCubemapIntensity=False,bOverride_BloomIntensity=True,bOverride_BloomThreshold=False,bOverride_Bloom1Tint=False,bOverride_Bloom1Size=False,bOverride_Bloom2Size=False,bOverride_Bloom2Tint=False,bOverride_Bloom3Tint=False,bOverride_Bloom3Size=False,bOverride_Bloom4Tint=False,bOverride_Bloom4Size=False,bOverride_Bloom5Tint=False,bOverride_Bloom5Size=False,bOverride_Bloom6Tint=False,bOverride_Bloom6Size=False,bOverride_BloomSizeScale=False,bOverride_BloomDirtMaskIntensity=False,bOverride_BloomDirtMaskTint=False,bOverride_BloomDirtMask=False,bOverride_AutoExposureMethod=True,bOverride_AutoExposureLowPercent=False,bOverride_AutoExposureHighPercent=False,bOverride_AutoExposureMinBrightness=True,bOverride_AutoExposureMaxBrightness=True,bOverride_AutoExposureSpeedUp=False,bOverride_AutoExposureSpeedDown=False,bOverride_AutoExposureBias=True,bOverride_HistogramLogMin=True,bOverride_HistogramLogMax=True,bOverride_LensFlareIntensity=False,bOverride_LensFlareTint=False,bOverride_LensFlareTints=False,bOverride_LensFlareBokehSize=False,bOverride_LensFlareBokehShape=False,bOverride_LensFlareThreshold=False,bOverride_VignetteIntensity=True,bOverride_GrainIntensity=False,bOverride_GrainJitter=False,bOverride_AmbientOcclusionIntensity=True,bOverride_AmbientOcclusionStaticFraction=True,bOverride_AmbientOcclusionRadius=True,bOverride_AmbientOcclusionFadeDistance=False,bOverride_AmbientOcclusionFadeRadius=False,bOverride_AmbientOcclusionDistance=False,bOverride_AmbientOcclusionRadiusInWS=False,bOverride_AmbientOcclusionPower=True,bOverride_AmbientOcclusionBias=True,bOverride_AmbientOcclusionQuality=True,bOverride_AmbientOcclusionMipBlend=True,bOverride_AmbientOcclusionMipScale=True,bOverride_AmbientOcclusionMipThreshold=True,bOverride_LPVIntensity=False,bOverride_LPVDirectionalOcclusionIntensity=False,bOverride_LPVDirectionalOcclusionRadius=False,bOverride_LPVDiffuseOcclusionExponent=False,bOverride_LPVSpecularOcclusionExponent=False,bOverride_LPVDiffuseOcclusionIntensity=False,bOverride_LPVSpecularOcclusionIntensity=False,bOverride_LPVSize=False,bOverride_LPVSecondaryOcclusionIntensity=False,bOverride_LPVSecondaryBounceIntensity=False,bOverride_LPVGeometryVolumeBias=False,bOverride_LPVVplInjectionBias=False,bOverride_LPVEmissiveInjectionIntensity=False,bOverride_IndirectLightingColor=False,bOverride_IndirectLightingIntensity=False,bOverride_ColorGradingIntensity=True,bOverride_ColorGradingLUT=True,bOverride_DepthOfFieldFocalDistance=False,bOverride_DepthOfFieldFstop=False,bOverride_DepthOfFieldSensorWidth=False,bOverride_DepthOfFieldDepthBlurRadius=False,bOverride_DepthOfFieldDepthBlurAmount=False,bOverride_DepthOfFieldFocalRegion=False,bOverride_DepthOfFieldNearTransitionRegion=False,bOverride_DepthOfFieldFarTransitionRegion=False,bOverride_DepthOfFieldScale=True,bOverride_DepthOfFieldMaxBokehSize=False,bOverride_DepthOfFieldNearBlurSize=False,bOverride_DepthOfFieldFarBlurSize=False,bOverride_DepthOfFieldMethod=True,bOverride_MobileHQGaussian=False,bOverride_DepthOfFieldBokehShape=False,bOverride_DepthOfFieldOcclusion=False,bOverride_DepthOfFieldColorThreshold=False,bOverride_DepthOfFieldSizeThreshold=False,bOverride_DepthOfFieldSkyFocusDistance=False,bOverride_DepthOfFieldVignetteSize=False,bOverride_MotionBlurAmount=False,bOverride_MotionBlurMax=False,bOverride_MotionBlurPerObjectSize=False,bOverride_ScreenPercentage=False,bOverride_ScreenSpaceReflectionIntensity=True,bOverride_ScreenSpaceReflectionQuality=True,bOverride_ScreenSpaceReflectionMaxRoughness=True,bOverride_ScreenSpaceReflectionRoughnessScale=False,WhiteTemp=6700.000000,WhiteTint=0.000000,ColorSaturation=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorContrast=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGamma=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGain=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorOffset=(X=0.005000,Y=0.005000,Z=0.005000,W=0.000000),ColorSaturationShadows=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorContrastShadows=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGammaShadows=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGainShadows=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorOffsetShadows=(X=0.000000,Y=0.000000,Z=0.000000,W=0.000000),ColorCorrectionShadowsMax=0.090000,ColorSaturationMidtones=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorContrastMidtones=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGammaMidtones=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGainMidtones=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorOffsetMidtones=(X=0.000000,Y=0.000000,Z=0.000000,W=0.000000),ColorSaturationHighlights=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorContrastHighlights=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGammaHighlights=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGainHighlights=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorOffsetHighlights=(X=0.000000,Y=0.000000,Z=0.000000,W=0.000000),ColorCorrectionHighlightsMin=0.500000,FilmWhitePoint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),FilmShadowTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),FilmShadowTintBlend=0.500000,FilmShadowTintAmount=0.000000,FilmSaturation=1.000000,FilmChannelMixerRed=(R=1.000000,G=0.000000,B=0.000000,A=1.000000),FilmChannelMixerGreen=(R=0.000000,G=1.000000,B=0.000000,A=1.000000),FilmChannelMixerBlue=(R=0.000000,G=0.000000,B=1.000000,A=1.000000),FilmContrast=0.030000,FilmToeAmount=1.000000,FilmHealAmount=0.180000,FilmDynamicRange=4.000000,FilmSlope=0.880000,FilmToe=0.550000,FilmShoulder=0.260000,FilmBlackClip=0.000000,FilmWhiteClip=0.040000,SceneColorTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),SceneFringeIntensity=0.000000,BloomIntensity=1.000000,BloomThreshold=1.000000,BloomSizeScale=4.000000,Bloom1Size=1.000000,Bloom2Size=4.000000,Bloom3Size=16.000000,Bloom4Size=32.000000,Bloom5Size=64.000000,Bloom6Size=64.000000,Bloom1Tint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),Bloom2Tint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),Bloom3Tint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),Bloom4Tint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),Bloom5Tint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),Bloom6Tint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),BloomDirtMaskIntensity=1.000000,BloomDirtMaskTint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),BloomDirtMask=None,AmbientCubemapTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),AmbientCubemapIntensity=1.000000,AmbientCubemap=None,AutoExposureMethod=AEM_Histogram,AutoExposureLowPercent=80.000000,AutoExposureHighPercent=98.300003,AutoExposureMinBrightness=1.000000,AutoExposureMaxBrightness=1.000000,AutoExposureSpeedUp=3.000000,AutoExposureSpeedDown=1.000000,AutoExposureBias=0.330000,HistogramLogMin=-8.000000,HistogramLogMax=4.000000,LensFlareIntensity=1.000000,LensFlareTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),LensFlareBokehSize=3.000000,LensFlareThreshold=8.000000,LensFlareBokehShape=None,LensFlareTints[0]=(R=1.000000,G=0.800000,B=0.400000,A=0.600000),LensFlareTints[1]=(R=1.000000,G=1.000000,B=0.600000,A=0.530000),LensFlareTints[2]=(R=0.800000,G=0.800000,B=1.000000,A=0.460000),LensFlareTints[3]=(R=0.500000,G=1.000000,B=0.400000,A=0.390000),LensFlareTints[4]=(R=0.500000,G=0.800000,B=1.000000,A=0.310000),LensFlareTints[5]=(R=0.900000,G=1.000000,B=0.800000,A=0.270000),LensFlareTints[6]=(R=1.000000,G=0.800000,B=0.400000,A=0.220000),LensFlareTints[7]=(R=0.900000,G=0.700000,B=0.700000,A=0.150000),VignetteIntensity=0.161468,GrainJitter=0.000000,GrainIntensity=0.000000,AmbientOcclusionIntensity=1.000000,AmbientOcclusionStaticFraction=1.000000,AmbientOcclusionRadius=73.477997,AmbientOcclusionRadiusInWS=False,AmbientOcclusionFadeDistance=8000.000000,AmbientOcclusionFadeRadius=5000.000000,AmbientOcclusionDistance=80.000000,AmbientOcclusionPower=1.200000,AmbientOcclusionBias=3.000000,AmbientOcclusionQuality=100.000000,AmbientOcclusionMipBlend=0.600000,AmbientOcclusionMipScale=1.700000,AmbientOcclusionMipThreshold=0.010000,IndirectLightingColor=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),IndirectLightingIntensity=1.000000,ColorGradingIntensity=0.000000,ColorGradingLUT=Texture2D'/Engine/EditorResources/RGBTable16x1_AssetViewer.RGBTable16x1_AssetViewer',DepthOfFieldMethod=DOFM_BokehDOF,bMobileHQGaussian=False,DepthOfFieldFstop=4.000000,DepthOfFieldSensorWidth=24.576000,DepthOfFieldFocalDistance=1000.000000,DepthOfFieldDepthBlurAmount=1.000000,DepthOfFieldDepthBlurRadius=0.000000,DepthOfFieldFocalRegion=0.000000,DepthOfFieldNearTransitionRegion=300.000000,DepthOfFieldFarTransitionRegion=500.000000,DepthOfFieldScale=0.000000,DepthOfFieldMaxBokehSize=15.000000,DepthOfFieldNearBlurSize=15.000000,DepthOfFieldFarBlurSize=15.000000,DepthOfFieldBokehShape=None,DepthOfFieldOcclusion=0.400000,DepthOfFieldColorThreshold=1.000000,DepthOfFieldSizeThreshold=0.080000,DepthOfFieldSkyFocusDistance=0.000000,DepthOfFieldVignetteSize=200.000000,MotionBlurAmount=0.500000,MotionBlurMax=5.000000,MotionBlurPerObjectSize=0.500000,LPVIntensity=1.000000,LPVVplInjectionBias=0.640000,LPVSize=5312.000000,LPVSecondaryOcclusionIntensity=0.000000,LPVSecondaryBounceIntensity=0.000000,LPVGeometryVolumeBias=0.384000,LPVEmissiveInjectionIntensity=1.000000,LPVDirectionalOcclusionIntensity=0.000000,LPVDirectionalOcclusionRadius=8.000000,LPVDiffuseOcclusionExponent=1.000000,LPVSpecularOcclusionExponent=7.000000,LPVDiffuseOcclusionIntensity=1.000000,LPVSpecularOcclusionIntensity=1.000000,ScreenSpaceReflectionIntensity=100.000000,ScreenSpaceReflectionQuality=100.000000,ScreenSpaceReflectionMaxRoughness=1.000000,ScreenPercentage=100.000000,WeightedBlendables=(Array=),Blendables=),bPostProcessingEnabled=True,LightingRigRotation=109.389069,RotationSpeed=2.000000,DirectionalLightRotation=(Pitch=-39.999985,Yaw=-67.500015,Roll=0.000000))\n+Profiles=(ProfileName=\"Default\",DirectionalLightIntensity=2.620000,DirectionalLightColor=(R=0.990000,G=0.839850,B=0.732600,A=1.000000),SkyLightIntensity=0.880000,bRotateLightingRig=False,bShowEnvironment=True,bShowFloor=True,EnvironmentCubeMapPath=\"/Engine/EditorMaterials/AssetViewer/EpicQuadPanorama_CC+EV1.EpicQuadPanorama_CC+EV1\",PostProcessingSettings=(bOverride_WhiteTemp=True,bOverride_WhiteTint=False,bOverride_ColorSaturation=True,bOverride_ColorContrast=True,bOverride_ColorGamma=True,bOverride_ColorGain=True,bOverride_ColorOffset=True,bOverride_ColorSaturationShadows=False,bOverride_ColorContrastShadows=False,bOverride_ColorGammaShadows=False,bOverride_ColorGainShadows=False,bOverride_ColorOffsetShadows=False,bOverride_ColorSaturationMidtones=False,bOverride_ColorContrastMidtones=False,bOverride_ColorGammaMidtones=False,bOverride_ColorGainMidtones=False,bOverride_ColorOffsetMidtones=False,bOverride_ColorSaturationHighlights=False,bOverride_ColorContrastHighlights=False,bOverride_ColorGammaHighlights=False,bOverride_ColorGainHighlights=False,bOverride_ColorOffsetHighlights=False,bOverride_ColorCorrectionShadowsMax=False,bOverride_ColorCorrectionHighlightsMin=False,bOverride_FilmWhitePoint=False,bOverride_FilmSaturation=False,bOverride_FilmChannelMixerRed=False,bOverride_FilmChannelMixerGreen=False,bOverride_FilmChannelMixerBlue=False,bOverride_FilmContrast=False,bOverride_FilmDynamicRange=False,bOverride_FilmHealAmount=False,bOverride_FilmToeAmount=False,bOverride_FilmShadowTint=False,bOverride_FilmShadowTintBlend=False,bOverride_FilmShadowTintAmount=False,bOverride_FilmSlope=True,bOverride_FilmToe=True,bOverride_FilmShoulder=True,bOverride_FilmBlackClip=True,bOverride_FilmWhiteClip=True,bOverride_SceneColorTint=False,bOverride_SceneFringeIntensity=False,bOverride_AmbientCubemapTint=False,bOverride_AmbientCubemapIntensity=False,bOverride_BloomIntensity=True,bOverride_BloomThreshold=False,bOverride_Bloom1Tint=False,bOverride_Bloom1Size=False,bOverride_Bloom2Size=False,bOverride_Bloom2Tint=False,bOverride_Bloom3Tint=False,bOverride_Bloom3Size=False,bOverride_Bloom4Tint=False,bOverride_Bloom4Size=False,bOverride_Bloom5Tint=False,bOverride_Bloom5Size=False,bOverride_Bloom6Tint=False,bOverride_Bloom6Size=False,bOverride_BloomSizeScale=False,bOverride_BloomDirtMaskIntensity=False,bOverride_BloomDirtMaskTint=False,bOverride_BloomDirtMask=False,bOverride_AutoExposureMethod=True,bOverride_AutoExposureLowPercent=False,bOverride_AutoExposureHighPercent=False,bOverride_AutoExposureMinBrightness=True,bOverride_AutoExposureMaxBrightness=True,bOverride_AutoExposureSpeedUp=False,bOverride_AutoExposureSpeedDown=False,bOverride_AutoExposureBias=True,bOverride_HistogramLogMin=True,bOverride_HistogramLogMax=True,bOverride_LensFlareIntensity=False,bOverride_LensFlareTint=False,bOverride_LensFlareTints=False,bOverride_LensFlareBokehSize=False,bOverride_LensFlareBokehShape=False,bOverride_LensFlareThreshold=False,bOverride_VignetteIntensity=True,bOverride_GrainIntensity=False,bOverride_GrainJitter=False,bOverride_AmbientOcclusionIntensity=True,bOverride_AmbientOcclusionStaticFraction=True,bOverride_AmbientOcclusionRadius=True,bOverride_AmbientOcclusionFadeDistance=False,bOverride_AmbientOcclusionFadeRadius=False,bOverride_AmbientOcclusionDistance=False,bOverride_AmbientOcclusionRadiusInWS=False,bOverride_AmbientOcclusionPower=True,bOverride_AmbientOcclusionBias=True,bOverride_AmbientOcclusionQuality=True,bOverride_AmbientOcclusionMipBlend=True,bOverride_AmbientOcclusionMipScale=True,bOverride_AmbientOcclusionMipThreshold=True,bOverride_LPVIntensity=False,bOverride_LPVDirectionalOcclusionIntensity=False,bOverride_LPVDirectionalOcclusionRadius=False,bOverride_LPVDiffuseOcclusionExponent=False,bOverride_LPVSpecularOcclusionExponent=False,bOverride_LPVDiffuseOcclusionIntensity=False,bOverride_LPVSpecularOcclusionIntensity=False,bOverride_LPVSize=False,bOverride_LPVSecondaryOcclusionIntensity=False,bOverride_LPVSecondaryBounceIntensity=False,bOverride_LPVGeometryVolumeBias=False,bOverride_LPVVplInjectionBias=False,bOverride_LPVEmissiveInjectionIntensity=False,bOverride_IndirectLightingColor=False,bOverride_IndirectLightingIntensity=False,bOverride_ColorGradingIntensity=True,bOverride_ColorGradingLUT=True,bOverride_DepthOfFieldFocalDistance=False,bOverride_DepthOfFieldFstop=False,bOverride_DepthOfFieldSensorWidth=False,bOverride_DepthOfFieldDepthBlurRadius=False,bOverride_DepthOfFieldDepthBlurAmount=False,bOverride_DepthOfFieldFocalRegion=False,bOverride_DepthOfFieldNearTransitionRegion=False,bOverride_DepthOfFieldFarTransitionRegion=False,bOverride_DepthOfFieldScale=True,bOverride_DepthOfFieldMaxBokehSize=False,bOverride_DepthOfFieldNearBlurSize=False,bOverride_DepthOfFieldFarBlurSize=False,bOverride_DepthOfFieldMethod=True,bOverride_MobileHQGaussian=False,bOverride_DepthOfFieldBokehShape=False,bOverride_DepthOfFieldOcclusion=False,bOverride_DepthOfFieldColorThreshold=False,bOverride_DepthOfFieldSizeThreshold=False,bOverride_DepthOfFieldSkyFocusDistance=False,bOverride_DepthOfFieldVignetteSize=False,bOverride_MotionBlurAmount=False,bOverride_MotionBlurMax=False,bOverride_MotionBlurPerObjectSize=False,bOverride_ScreenPercentage=False,bOverride_ScreenSpaceReflectionIntensity=True,bOverride_ScreenSpaceReflectionQuality=True,bOverride_ScreenSpaceReflectionMaxRoughness=True,bOverride_ScreenSpaceReflectionRoughnessScale=False,WhiteTemp=6700.000000,WhiteTint=0.000000,ColorSaturation=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorContrast=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGamma=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGain=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorOffset=(X=0.005000,Y=0.005000,Z=0.005000,W=0.000000),ColorSaturationShadows=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorContrastShadows=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGammaShadows=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGainShadows=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorOffsetShadows=(X=0.000000,Y=0.000000,Z=0.000000,W=0.000000),ColorCorrectionShadowsMax=0.090000,ColorSaturationMidtones=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorContrastMidtones=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGammaMidtones=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGainMidtones=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorOffsetMidtones=(X=0.000000,Y=0.000000,Z=0.000000,W=0.000000),ColorSaturationHighlights=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorContrastHighlights=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGammaHighlights=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGainHighlights=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorOffsetHighlights=(X=0.000000,Y=0.000000,Z=0.000000,W=0.000000),ColorCorrectionHighlightsMin=0.500000,FilmWhitePoint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),FilmShadowTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),FilmShadowTintBlend=0.500000,FilmShadowTintAmount=0.000000,FilmSaturation=1.000000,FilmChannelMixerRed=(R=1.000000,G=0.000000,B=0.000000,A=1.000000),FilmChannelMixerGreen=(R=0.000000,G=1.000000,B=0.000000,A=1.000000),FilmChannelMixerBlue=(R=0.000000,G=0.000000,B=1.000000,A=1.000000),FilmContrast=0.030000,FilmToeAmount=1.000000,FilmHealAmount=0.180000,FilmDynamicRange=4.000000,FilmSlope=0.880000,FilmToe=0.550000,FilmShoulder=0.260000,FilmBlackClip=0.000000,FilmWhiteClip=0.040000,SceneColorTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),SceneFringeIntensity=0.000000,BloomIntensity=1.000000,BloomThreshold=1.000000,BloomSizeScale=4.000000,Bloom1Size=1.000000,Bloom2Size=4.000000,Bloom3Size=16.000000,Bloom4Size=32.000000,Bloom5Size=64.000000,Bloom6Size=64.000000,Bloom1Tint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),Bloom2Tint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),Bloom3Tint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),Bloom4Tint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),Bloom5Tint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),Bloom6Tint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),BloomDirtMaskIntensity=1.000000,BloomDirtMaskTint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),BloomDirtMask=None,AmbientCubemapTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),AmbientCubemapIntensity=1.000000,AmbientCubemap=None,AutoExposureMethod=AEM_Histogram,AutoExposureLowPercent=80.000000,AutoExposureHighPercent=98.300003,AutoExposureMinBrightness=1.000000,AutoExposureMaxBrightness=1.000000,AutoExposureSpeedUp=3.000000,AutoExposureSpeedDown=1.000000,AutoExposureBias=0.330000,HistogramLogMin=-8.000000,HistogramLogMax=4.000000,LensFlareIntensity=1.000000,LensFlareTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),LensFlareBokehSize=3.000000,LensFlareThreshold=8.000000,LensFlareBokehShape=None,LensFlareTints[0]=(R=1.000000,G=0.800000,B=0.400000,A=0.600000),LensFlareTints[1]=(R=1.000000,G=1.000000,B=0.600000,A=0.530000),LensFlareTints[2]=(R=0.800000,G=0.800000,B=1.000000,A=0.460000),LensFlareTints[3]=(R=0.500000,G=1.000000,B=0.400000,A=0.390000),LensFlareTints[4]=(R=0.500000,G=0.800000,B=1.000000,A=0.310000),LensFlareTints[5]=(R=0.900000,G=1.000000,B=0.800000,A=0.270000),LensFlareTints[6]=(R=1.000000,G=0.800000,B=0.400000,A=0.220000),LensFlareTints[7]=(R=0.900000,G=0.700000,B=0.700000,A=0.150000),VignetteIntensity=0.161468,GrainJitter=0.000000,GrainIntensity=0.000000,AmbientOcclusionIntensity=1.000000,AmbientOcclusionStaticFraction=1.000000,AmbientOcclusionRadius=73.477997,AmbientOcclusionRadiusInWS=False,AmbientOcclusionFadeDistance=8000.000000,AmbientOcclusionFadeRadius=5000.000000,AmbientOcclusionDistance=80.000000,AmbientOcclusionPower=1.200000,AmbientOcclusionBias=3.000000,AmbientOcclusionQuality=100.000000,AmbientOcclusionMipBlend=0.600000,AmbientOcclusionMipScale=1.700000,AmbientOcclusionMipThreshold=0.010000,IndirectLightingColor=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),IndirectLightingIntensity=1.000000,ColorGradingIntensity=0.000000,ColorGradingLUT=Texture2D'/Engine/EditorResources/RGBTable16x1_AssetViewer.RGBTable16x1_AssetViewer',DepthOfFieldMethod=DOFM_BokehDOF,bMobileHQGaussian=False,DepthOfFieldFstop=4.000000,DepthOfFieldSensorWidth=24.576000,DepthOfFieldFocalDistance=1000.000000,DepthOfFieldDepthBlurAmount=1.000000,DepthOfFieldDepthBlurRadius=0.000000,DepthOfFieldFocalRegion=0.000000,DepthOfFieldNearTransitionRegion=300.000000,DepthOfFieldFarTransitionRegion=500.000000,DepthOfFieldScale=0.000000,DepthOfFieldMaxBokehSize=15.000000,DepthOfFieldNearBlurSize=15.000000,DepthOfFieldFarBlurSize=15.000000,DepthOfFieldBokehShape=None,DepthOfFieldOcclusion=0.400000,DepthOfFieldColorThreshold=1.000000,DepthOfFieldSizeThreshold=0.080000,DepthOfFieldSkyFocusDistance=0.000000,DepthOfFieldVignetteSize=200.000000,MotionBlurAmount=0.500000,MotionBlurMax=5.000000,MotionBlurPerObjectSize=0.500000,LPVIntensity=1.000000,LPVVplInjectionBias=0.640000,LPVSize=5312.000000,LPVSecondaryOcclusionIntensity=0.000000,LPVSecondaryBounceIntensity=0.000000,LPVGeometryVolumeBias=0.384000,LPVEmissiveInjectionIntensity=1.000000,LPVDirectionalOcclusionIntensity=0.000000,LPVDirectionalOcclusionRadius=8.000000,LPVDiffuseOcclusionExponent=1.000000,LPVSpecularOcclusionExponent=7.000000,LPVDiffuseOcclusionIntensity=1.000000,LPVSpecularOcclusionIntensity=1.000000,ScreenSpaceReflectionIntensity=100.000000,ScreenSpaceReflectionQuality=100.000000,ScreenSpaceReflectionMaxRoughness=1.000000,ScreenPercentage=100.000000,WeightedBlendables=(Array=),Blendables=),bPostProcessingEnabled=True,LightingRigRotation=109.389069,RotationSpeed=2.000000,DirectionalLightRotation=(Pitch=-39.999985,Yaw=-67.500015,Roll=0.000000))\n+Profiles=(ProfileName=\"Default\",DirectionalLightIntensity=2.620000,DirectionalLightColor=(R=0.990000,G=0.839850,B=0.732600,A=1.000000),SkyLightIntensity=0.880000,bRotateLightingRig=False,bShowEnvironment=True,bShowFloor=True,EnvironmentCubeMapPath=\"/Engine/EditorMaterials/AssetViewer/EpicQuadPanorama_CC+EV1.EpicQuadPanorama_CC+EV1\",PostProcessingSettings=(bOverride_WhiteTemp=True,bOverride_WhiteTint=False,bOverride_ColorSaturation=True,bOverride_ColorContrast=True,bOverride_ColorGamma=True,bOverride_ColorGain=True,bOverride_ColorOffset=True,bOverride_ColorSaturationShadows=False,bOverride_ColorContrastShadows=False,bOverride_ColorGammaShadows=False,bOverride_ColorGainShadows=False,bOverride_ColorOffsetShadows=False,bOverride_ColorSaturationMidtones=False,bOverride_ColorContrastMidtones=False,bOverride_ColorGammaMidtones=False,bOverride_ColorGainMidtones=False,bOverride_ColorOffsetMidtones=False,bOverride_ColorSaturationHighlights=False,bOverride_ColorContrastHighlights=False,bOverride_ColorGammaHighlights=False,bOverride_ColorGainHighlights=False,bOverride_ColorOffsetHighlights=False,bOverride_ColorCorrectionShadowsMax=False,bOverride_ColorCorrectionHighlightsMin=False,bOverride_FilmWhitePoint=False,bOverride_FilmSaturation=False,bOverride_FilmChannelMixerRed=False,bOverride_FilmChannelMixerGreen=False,bOverride_FilmChannelMixerBlue=False,bOverride_FilmContrast=False,bOverride_FilmDynamicRange=False,bOverride_FilmHealAmount=False,bOverride_FilmToeAmount=False,bOverride_FilmShadowTint=False,bOverride_FilmShadowTintBlend=False,bOverride_FilmShadowTintAmount=False,bOverride_FilmSlope=True,bOverride_FilmToe=True,bOverride_FilmShoulder=True,bOverride_FilmBlackClip=True,bOverride_FilmWhiteClip=True,bOverride_SceneColorTint=False,bOverride_SceneFringeIntensity=False,bOverride_AmbientCubemapTint=False,bOverride_AmbientCubemapIntensity=False,bOverride_BloomIntensity=True,bOverride_BloomThreshold=False,bOverride_Bloom1Tint=False,bOverride_Bloom1Size=False,bOverride_Bloom2Size=False,bOverride_Bloom2Tint=False,bOverride_Bloom3Tint=False,bOverride_Bloom3Size=False,bOverride_Bloom4Tint=False,bOverride_Bloom4Size=False,bOverride_Bloom5Tint=False,bOverride_Bloom5Size=False,bOverride_Bloom6Tint=False,bOverride_Bloom6Size=False,bOverride_BloomSizeScale=False,bOverride_BloomDirtMaskIntensity=False,bOverride_BloomDirtMaskTint=False,bOverride_BloomDirtMask=False,bOverride_AutoExposureMethod=True,bOverride_AutoExposureLowPercent=False,bOverride_AutoExposureHighPercent=False,bOverride_AutoExposureMinBrightness=True,bOverride_AutoExposureMaxBrightness=True,bOverride_AutoExposureSpeedUp=False,bOverride_AutoExposureSpeedDown=False,bOverride_AutoExposureBias=True,bOverride_HistogramLogMin=True,bOverride_HistogramLogMax=True,bOverride_LensFlareIntensity=False,bOverride_LensFlareTint=False,bOverride_LensFlareTints=False,bOverride_LensFlareBokehSize=False,bOverride_LensFlareBokehShape=False,bOverride_LensFlareThreshold=False,bOverride_VignetteIntensity=True,bOverride_GrainIntensity=False,bOverride_GrainJitter=False,bOverride_AmbientOcclusionIntensity=True,bOverride_AmbientOcclusionStaticFraction=True,bOverride_AmbientOcclusionRadius=True,bOverride_AmbientOcclusionFadeDistance=False,bOverride_AmbientOcclusionFadeRadius=False,bOverride_AmbientOcclusionDistance=False,bOverride_AmbientOcclusionRadiusInWS=False,bOverride_AmbientOcclusionPower=True,bOverride_AmbientOcclusionBias=True,bOverride_AmbientOcclusionQuality=True,bOverride_AmbientOcclusionMipBlend=True,bOverride_AmbientOcclusionMipScale=True,bOverride_AmbientOcclusionMipThreshold=True,bOverride_LPVIntensity=False,bOverride_LPVDirectionalOcclusionIntensity=False,bOverride_LPVDirectionalOcclusionRadius=False,bOverride_LPVDiffuseOcclusionExponent=False,bOverride_LPVSpecularOcclusionExponent=False,bOverride_LPVDiffuseOcclusionIntensity=False,bOverride_LPVSpecularOcclusionIntensity=False,bOverride_LPVSize=False,bOverride_LPVSecondaryOcclusionIntensity=False,bOverride_LPVSecondaryBounceIntensity=False,bOverride_LPVGeometryVolumeBias=False,bOverride_LPVVplInjectionBias=False,bOverride_LPVEmissiveInjectionIntensity=False,bOverride_IndirectLightingColor=False,bOverride_IndirectLightingIntensity=False,bOverride_ColorGradingIntensity=True,bOverride_ColorGradingLUT=True,bOverride_DepthOfFieldFocalDistance=False,bOverride_DepthOfFieldFstop=False,bOverride_DepthOfFieldSensorWidth=False,bOverride_DepthOfFieldDepthBlurRadius=False,bOverride_DepthOfFieldDepthBlurAmount=False,bOverride_DepthOfFieldFocalRegion=False,bOverride_DepthOfFieldNearTransitionRegion=False,bOverride_DepthOfFieldFarTransitionRegion=False,bOverride_DepthOfFieldScale=True,bOverride_DepthOfFieldMaxBokehSize=False,bOverride_DepthOfFieldNearBlurSize=False,bOverride_DepthOfFieldFarBlurSize=False,bOverride_DepthOfFieldMethod=True,bOverride_MobileHQGaussian=False,bOverride_DepthOfFieldBokehShape=False,bOverride_DepthOfFieldOcclusion=False,bOverride_DepthOfFieldColorThreshold=False,bOverride_DepthOfFieldSizeThreshold=False,bOverride_DepthOfFieldSkyFocusDistance=False,bOverride_DepthOfFieldVignetteSize=False,bOverride_MotionBlurAmount=False,bOverride_MotionBlurMax=False,bOverride_MotionBlurPerObjectSize=False,bOverride_ScreenPercentage=False,bOverride_ScreenSpaceReflectionIntensity=True,bOverride_ScreenSpaceReflectionQuality=True,bOverride_ScreenSpaceReflectionMaxRoughness=True,bOverride_ScreenSpaceReflectionRoughnessScale=False,WhiteTemp=6700.000000,WhiteTint=0.000000,ColorSaturation=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorContrast=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGamma=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGain=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorOffset=(X=0.005000,Y=0.005000,Z=0.005000,W=0.000000),ColorSaturationShadows=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorContrastShadows=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGammaShadows=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGainShadows=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorOffsetShadows=(X=0.000000,Y=0.000000,Z=0.000000,W=0.000000),ColorCorrectionShadowsMax=0.090000,ColorSaturationMidtones=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorContrastMidtones=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGammaMidtones=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGainMidtones=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorOffsetMidtones=(X=0.000000,Y=0.000000,Z=0.000000,W=0.000000),ColorSaturationHighlights=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorContrastHighlights=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGammaHighlights=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGainHighlights=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorOffsetHighlights=(X=0.000000,Y=0.000000,Z=0.000000,W=0.000000),ColorCorrectionHighlightsMin=0.500000,FilmWhitePoint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),FilmShadowTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),FilmShadowTintBlend=0.500000,FilmShadowTintAmount=0.000000,FilmSaturation=1.000000,FilmChannelMixerRed=(R=1.000000,G=0.000000,B=0.000000,A=1.000000),FilmChannelMixerGreen=(R=0.000000,G=1.000000,B=0.000000,A=1.000000),FilmChannelMixerBlue=(R=0.000000,G=0.000000,B=1.000000,A=1.000000),FilmContrast=0.030000,FilmToeAmount=1.000000,FilmHealAmount=0.180000,FilmDynamicRange=4.000000,FilmSlope=0.880000,FilmToe=0.550000,FilmShoulder=0.260000,FilmBlackClip=0.000000,FilmWhiteClip=0.040000,SceneColorTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),SceneFringeIntensity=0.000000,BloomIntensity=1.000000,BloomThreshold=1.000000,BloomSizeScale=4.000000,Bloom1Size=1.000000,Bloom2Size=4.000000,Bloom3Size=16.000000,Bloom4Size=32.000000,Bloom5Size=64.000000,Bloom6Size=64.000000,Bloom1Tint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),Bloom2Tint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),Bloom3Tint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),Bloom4Tint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),Bloom5Tint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),Bloom6Tint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),BloomDirtMaskIntensity=1.000000,BloomDirtMaskTint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),BloomDirtMask=None,AmbientCubemapTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),AmbientCubemapIntensity=1.000000,AmbientCubemap=None,AutoExposureMethod=AEM_Histogram,AutoExposureLowPercent=80.000000,AutoExposureHighPercent=98.300003,AutoExposureMinBrightness=1.000000,AutoExposureMaxBrightness=1.000000,AutoExposureSpeedUp=3.000000,AutoExposureSpeedDown=1.000000,AutoExposureBias=0.330000,HistogramLogMin=-8.000000,HistogramLogMax=4.000000,LensFlareIntensity=1.000000,LensFlareTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),LensFlareBokehSize=3.000000,LensFlareThreshold=8.000000,LensFlareBokehShape=None,LensFlareTints[0]=(R=1.000000,G=0.800000,B=0.400000,A=0.600000),LensFlareTints[1]=(R=1.000000,G=1.000000,B=0.600000,A=0.530000),LensFlareTints[2]=(R=0.800000,G=0.800000,B=1.000000,A=0.460000),LensFlareTints[3]=(R=0.500000,G=1.000000,B=0.400000,A=0.390000),LensFlareTints[4]=(R=0.500000,G=0.800000,B=1.000000,A=0.310000),LensFlareTints[5]=(R=0.900000,G=1.000000,B=0.800000,A=0.270000),LensFlareTints[6]=(R=1.000000,G=0.800000,B=0.400000,A=0.220000),LensFlareTints[7]=(R=0.900000,G=0.700000,B=0.700000,A=0.150000),VignetteIntensity=0.161468,GrainJitter=0.000000,GrainIntensity=0.000000,AmbientOcclusionIntensity=1.000000,AmbientOcclusionStaticFraction=1.000000,AmbientOcclusionRadius=73.477997,AmbientOcclusionRadiusInWS=False,AmbientOcclusionFadeDistance=8000.000000,AmbientOcclusionFadeRadius=5000.000000,AmbientOcclusionDistance=80.000000,AmbientOcclusionPower=1.200000,AmbientOcclusionBias=3.000000,AmbientOcclusionQuality=100.000000,AmbientOcclusionMipBlend=0.600000,AmbientOcclusionMipScale=1.700000,AmbientOcclusionMipThreshold=0.010000,IndirectLightingColor=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),IndirectLightingIntensity=1.000000,ColorGradingIntensity=0.000000,ColorGradingLUT=Texture2D'/Engine/EditorResources/RGBTable16x1_AssetViewer.RGBTable16x1_AssetViewer',DepthOfFieldMethod=DOFM_BokehDOF,bMobileHQGaussian=False,DepthOfFieldFstop=4.000000,DepthOfFieldSensorWidth=24.576000,DepthOfFieldFocalDistance=1000.000000,DepthOfFieldDepthBlurAmount=1.000000,DepthOfFieldDepthBlurRadius=0.000000,DepthOfFieldFocalRegion=0.000000,DepthOfFieldNearTransitionRegion=300.000000,DepthOfFieldFarTransitionRegion=500.000000,DepthOfFieldScale=0.000000,DepthOfFieldMaxBokehSize=15.000000,DepthOfFieldNearBlurSize=15.000000,DepthOfFieldFarBlurSize=15.000000,DepthOfFieldBokehShape=None,DepthOfFieldOcclusion=0.400000,DepthOfFieldColorThreshold=1.000000,DepthOfFieldSizeThreshold=0.080000,DepthOfFieldSkyFocusDistance=0.000000,DepthOfFieldVignetteSize=200.000000,MotionBlurAmount=0.500000,MotionBlurMax=5.000000,MotionBlurPerObjectSize=0.500000,LPVIntensity=1.000000,LPVVplInjectionBias=0.640000,LPVSize=5312.000000,LPVSecondaryOcclusionIntensity=0.000000,LPVSecondaryBounceIntensity=0.000000,LPVGeometryVolumeBias=0.384000,LPVEmissiveInjectionIntensity=1.000000,LPVDirectionalOcclusionIntensity=0.000000,LPVDirectionalOcclusionRadius=8.000000,LPVDiffuseOcclusionExponent=1.000000,LPVSpecularOcclusionExponent=7.000000,LPVDiffuseOcclusionIntensity=1.000000,LPVSpecularOcclusionIntensity=1.000000,ScreenSpaceReflectionIntensity=100.000000,ScreenSpaceReflectionQuality=100.000000,ScreenSpaceReflectionMaxRoughness=1.000000,ScreenPercentage=100.000000,WeightedBlendables=(Array=),Blendables=),bPostProcessingEnabled=True,LightingRigRotation=109.389069,RotationSpeed=2.000000,DirectionalLightRotation=(Pitch=-39.999985,Yaw=-67.500015,Roll=0.000000))\n+Profiles=(ProfileName=\"Default\",DirectionalLightIntensity=2.620000,DirectionalLightColor=(R=0.990000,G=0.839850,B=0.732600,A=1.000000),SkyLightIntensity=0.880000,bRotateLightingRig=False,bShowEnvironment=True,bShowFloor=True,EnvironmentCubeMapPath=\"/Engine/EditorMaterials/AssetViewer/EpicQuadPanorama_CC+EV1.EpicQuadPanorama_CC+EV1\",PostProcessingSettings=(bOverride_WhiteTemp=True,bOverride_WhiteTint=False,bOverride_ColorSaturation=True,bOverride_ColorContrast=True,bOverride_ColorGamma=True,bOverride_ColorGain=True,bOverride_ColorOffset=True,bOverride_ColorSaturationShadows=False,bOverride_ColorContrastShadows=False,bOverride_ColorGammaShadows=False,bOverride_ColorGainShadows=False,bOverride_ColorOffsetShadows=False,bOverride_ColorSaturationMidtones=False,bOverride_ColorContrastMidtones=False,bOverride_ColorGammaMidtones=False,bOverride_ColorGainMidtones=False,bOverride_ColorOffsetMidtones=False,bOverride_ColorSaturationHighlights=False,bOverride_ColorContrastHighlights=False,bOverride_ColorGammaHighlights=False,bOverride_ColorGainHighlights=False,bOverride_ColorOffsetHighlights=False,bOverride_ColorCorrectionShadowsMax=False,bOverride_ColorCorrectionHighlightsMin=False,bOverride_FilmWhitePoint=False,bOverride_FilmSaturation=False,bOverride_FilmChannelMixerRed=False,bOverride_FilmChannelMixerGreen=False,bOverride_FilmChannelMixerBlue=False,bOverride_FilmContrast=False,bOverride_FilmDynamicRange=False,bOverride_FilmHealAmount=False,bOverride_FilmToeAmount=False,bOverride_FilmShadowTint=False,bOverride_FilmShadowTintBlend=False,bOverride_FilmShadowTintAmount=False,bOverride_FilmSlope=True,bOverride_FilmToe=True,bOverride_FilmShoulder=True,bOverride_FilmBlackClip=True,bOverride_FilmWhiteClip=True,bOverride_SceneColorTint=False,bOverride_SceneFringeIntensity=False,bOverride_AmbientCubemapTint=False,bOverride_AmbientCubemapIntensity=False,bOverride_BloomIntensity=True,bOverride_BloomThreshold=False,bOverride_Bloom1Tint=False,bOverride_Bloom1Size=False,bOverride_Bloom2Size=False,bOverride_Bloom2Tint=False,bOverride_Bloom3Tint=False,bOverride_Bloom3Size=False,bOverride_Bloom4Tint=False,bOverride_Bloom4Size=False,bOverride_Bloom5Tint=False,bOverride_Bloom5Size=False,bOverride_Bloom6Tint=False,bOverride_Bloom6Size=False,bOverride_BloomSizeScale=False,bOverride_BloomDirtMaskIntensity=False,bOverride_BloomDirtMaskTint=False,bOverride_BloomDirtMask=False,bOverride_AutoExposureMethod=True,bOverride_AutoExposureLowPercent=False,bOverride_AutoExposureHighPercent=False,bOverride_AutoExposureMinBrightness=True,bOverride_AutoExposureMaxBrightness=True,bOverride_AutoExposureSpeedUp=False,bOverride_AutoExposureSpeedDown=False,bOverride_AutoExposureBias=True,bOverride_HistogramLogMin=True,bOverride_HistogramLogMax=True,bOverride_LensFlareIntensity=False,bOverride_LensFlareTint=False,bOverride_LensFlareTints=False,bOverride_LensFlareBokehSize=False,bOverride_LensFlareBokehShape=False,bOverride_LensFlareThreshold=False,bOverride_VignetteIntensity=True,bOverride_GrainIntensity=False,bOverride_GrainJitter=False,bOverride_AmbientOcclusionIntensity=True,bOverride_AmbientOcclusionStaticFraction=True,bOverride_AmbientOcclusionRadius=True,bOverride_AmbientOcclusionFadeDistance=False,bOverride_AmbientOcclusionFadeRadius=False,bOverride_AmbientOcclusionDistance=False,bOverride_AmbientOcclusionRadiusInWS=False,bOverride_AmbientOcclusionPower=True,bOverride_AmbientOcclusionBias=True,bOverride_AmbientOcclusionQuality=True,bOverride_AmbientOcclusionMipBlend=True,bOverride_AmbientOcclusionMipScale=True,bOverride_AmbientOcclusionMipThreshold=True,bOverride_LPVIntensity=False,bOverride_LPVDirectionalOcclusionIntensity=False,bOverride_LPVDirectionalOcclusionRadius=False,bOverride_LPVDiffuseOcclusionExponent=False,bOverride_LPVSpecularOcclusionExponent=False,bOverride_LPVDiffuseOcclusionIntensity=False,bOverride_LPVSpecularOcclusionIntensity=False,bOverride_LPVSize=False,bOverride_LPVSecondaryOcclusionIntensity=False,bOverride_LPVSecondaryBounceIntensity=False,bOverride_LPVGeometryVolumeBias=False,bOverride_LPVVplInjectionBias=False,bOverride_LPVEmissiveInjectionIntensity=False,bOverride_IndirectLightingColor=False,bOverride_IndirectLightingIntensity=False,bOverride_ColorGradingIntensity=True,bOverride_ColorGradingLUT=True,bOverride_DepthOfFieldFocalDistance=False,bOverride_DepthOfFieldFstop=False,bOverride_DepthOfFieldSensorWidth=False,bOverride_DepthOfFieldDepthBlurRadius=False,bOverride_DepthOfFieldDepthBlurAmount=False,bOverride_DepthOfFieldFocalRegion=False,bOverride_DepthOfFieldNearTransitionRegion=False,bOverride_DepthOfFieldFarTransitionRegion=False,bOverride_DepthOfFieldScale=True,bOverride_DepthOfFieldMaxBokehSize=False,bOverride_DepthOfFieldNearBlurSize=False,bOverride_DepthOfFieldFarBlurSize=False,bOverride_DepthOfFieldMethod=True,bOverride_MobileHQGaussian=False,bOverride_DepthOfFieldBokehShape=False,bOverride_DepthOfFieldOcclusion=False,bOverride_DepthOfFieldColorThreshold=False,bOverride_DepthOfFieldSizeThreshold=False,bOverride_DepthOfFieldSkyFocusDistance=False,bOverride_DepthOfFieldVignetteSize=False,bOverride_MotionBlurAmount=False,bOverride_MotionBlurMax=False,bOverride_MotionBlurPerObjectSize=False,bOverride_ScreenPercentage=False,bOverride_ScreenSpaceReflectionIntensity=True,bOverride_ScreenSpaceReflectionQuality=True,bOverride_ScreenSpaceReflectionMaxRoughness=True,bOverride_ScreenSpaceReflectionRoughnessScale=False,WhiteTemp=6700.000000,WhiteTint=0.000000,ColorSaturation=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorContrast=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGamma=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGain=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorOffset=(X=0.005000,Y=0.005000,Z=0.005000,W=0.000000),ColorSaturationShadows=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorContrastShadows=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGammaShadows=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGainShadows=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorOffsetShadows=(X=0.000000,Y=0.000000,Z=0.000000,W=0.000000),ColorCorrectionShadowsMax=0.090000,ColorSaturationMidtones=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorContrastMidtones=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGammaMidtones=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGainMidtones=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorOffsetMidtones=(X=0.000000,Y=0.000000,Z=0.000000,W=0.000000),ColorSaturationHighlights=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorContrastHighlights=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGammaHighlights=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGainHighlights=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorOffsetHighlights=(X=0.000000,Y=0.000000,Z=0.000000,W=0.000000),ColorCorrectionHighlightsMin=0.500000,FilmWhitePoint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),FilmShadowTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),FilmShadowTintBlend=0.500000,FilmShadowTintAmount=0.000000,FilmSaturation=1.000000,FilmChannelMixerRed=(R=1.000000,G=0.000000,B=0.000000,A=1.000000),FilmChannelMixerGreen=(R=0.000000,G=1.000000,B=0.000000,A=1.000000),FilmChannelMixerBlue=(R=0.000000,G=0.000000,B=1.000000,A=1.000000),FilmContrast=0.030000,FilmToeAmount=1.000000,FilmHealAmount=0.180000,FilmDynamicRange=4.000000,FilmSlope=0.880000,FilmToe=0.550000,FilmShoulder=0.260000,FilmBlackClip=0.000000,FilmWhiteClip=0.040000,SceneColorTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),SceneFringeIntensity=0.000000,BloomIntensity=1.000000,BloomThreshold=1.000000,BloomSizeScale=4.000000,Bloom1Size=1.000000,Bloom2Size=4.000000,Bloom3Size=16.000000,Bloom4Size=32.000000,Bloom5Size=64.000000,Bloom6Size=64.000000,Bloom1Tint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),Bloom2Tint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),Bloom3Tint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),Bloom4Tint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),Bloom5Tint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),Bloom6Tint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),BloomDirtMaskIntensity=1.000000,BloomDirtMaskTint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),BloomDirtMask=None,AmbientCubemapTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),AmbientCubemapIntensity=1.000000,AmbientCubemap=None,AutoExposureMethod=AEM_Histogram,AutoExposureLowPercent=80.000000,AutoExposureHighPercent=98.300003,AutoExposureMinBrightness=1.000000,AutoExposureMaxBrightness=1.000000,AutoExposureSpeedUp=3.000000,AutoExposureSpeedDown=1.000000,AutoExposureBias=0.330000,HistogramLogMin=-8.000000,HistogramLogMax=4.000000,LensFlareIntensity=1.000000,LensFlareTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),LensFlareBokehSize=3.000000,LensFlareThreshold=8.000000,LensFlareBokehShape=None,LensFlareTints[0]=(R=1.000000,G=0.800000,B=0.400000,A=0.600000),LensFlareTints[1]=(R=1.000000,G=1.000000,B=0.600000,A=0.530000),LensFlareTints[2]=(R=0.800000,G=0.800000,B=1.000000,A=0.460000),LensFlareTints[3]=(R=0.500000,G=1.000000,B=0.400000,A=0.390000),LensFlareTints[4]=(R=0.500000,G=0.800000,B=1.000000,A=0.310000),LensFlareTints[5]=(R=0.900000,G=1.000000,B=0.800000,A=0.270000),LensFlareTints[6]=(R=1.000000,G=0.800000,B=0.400000,A=0.220000),LensFlareTints[7]=(R=0.900000,G=0.700000,B=0.700000,A=0.150000),VignetteIntensity=0.161468,GrainJitter=0.000000,GrainIntensity=0.000000,AmbientOcclusionIntensity=1.000000,AmbientOcclusionStaticFraction=1.000000,AmbientOcclusionRadius=73.477997,AmbientOcclusionRadiusInWS=False,AmbientOcclusionFadeDistance=8000.000000,AmbientOcclusionFadeRadius=5000.000000,AmbientOcclusionDistance=80.000000,AmbientOcclusionPower=1.200000,AmbientOcclusionBias=3.000000,AmbientOcclusionQuality=100.000000,AmbientOcclusionMipBlend=0.600000,AmbientOcclusionMipScale=1.700000,AmbientOcclusionMipThreshold=0.010000,IndirectLightingColor=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),IndirectLightingIntensity=1.000000,ColorGradingIntensity=0.000000,ColorGradingLUT=Texture2D'/Engine/EditorResources/RGBTable16x1_AssetViewer.RGBTable16x1_AssetViewer',DepthOfFieldMethod=DOFM_BokehDOF,bMobileHQGaussian=False,DepthOfFieldFstop=4.000000,DepthOfFieldSensorWidth=24.576000,DepthOfFieldFocalDistance=1000.000000,DepthOfFieldDepthBlurAmount=1.000000,DepthOfFieldDepthBlurRadius=0.000000,DepthOfFieldFocalRegion=0.000000,DepthOfFieldNearTransitionRegion=300.000000,DepthOfFieldFarTransitionRegion=500.000000,DepthOfFieldScale=0.000000,DepthOfFieldMaxBokehSize=15.000000,DepthOfFieldNearBlurSize=15.000000,DepthOfFieldFarBlurSize=15.000000,DepthOfFieldBokehShape=None,DepthOfFieldOcclusion=0.400000,DepthOfFieldColorThreshold=1.000000,DepthOfFieldSizeThreshold=0.080000,DepthOfFieldSkyFocusDistance=0.000000,DepthOfFieldVignetteSize=200.000000,MotionBlurAmount=0.500000,MotionBlurMax=5.000000,MotionBlurPerObjectSize=0.500000,LPVIntensity=1.000000,LPVVplInjectionBias=0.640000,LPVSize=5312.000000,LPVSecondaryOcclusionIntensity=0.000000,LPVSecondaryBounceIntensity=0.000000,LPVGeometryVolumeBias=0.384000,LPVEmissiveInjectionIntensity=1.000000,LPVDirectionalOcclusionIntensity=0.000000,LPVDirectionalOcclusionRadius=8.000000,LPVDiffuseOcclusionExponent=1.000000,LPVSpecularOcclusionExponent=7.000000,LPVDiffuseOcclusionIntensity=1.000000,LPVSpecularOcclusionIntensity=1.000000,ScreenSpaceReflectionIntensity=100.000000,ScreenSpaceReflectionQuality=100.000000,ScreenSpaceReflectionMaxRoughness=1.000000,ScreenPercentage=100.000000,WeightedBlendables=(Array=),Blendables=),bPostProcessingEnabled=True,LightingRigRotation=109.389069,RotationSpeed=2.000000,DirectionalLightRotation=(Pitch=-39.999985,Yaw=-67.500015,Roll=0.000000))\n+Profiles=(ProfileName=\"Default\",DirectionalLightIntensity=2.620000,DirectionalLightColor=(R=0.990000,G=0.839850,B=0.732600,A=1.000000),SkyLightIntensity=0.880000,bRotateLightingRig=False,bShowEnvironment=True,bShowFloor=True,EnvironmentCubeMapPath=\"/Engine/EditorMaterials/AssetViewer/EpicQuadPanorama_CC+EV1.EpicQuadPanorama_CC+EV1\",PostProcessingSettings=(bOverride_WhiteTemp=True,bOverride_WhiteTint=False,bOverride_ColorSaturation=True,bOverride_ColorContrast=True,bOverride_ColorGamma=True,bOverride_ColorGain=True,bOverride_ColorOffset=True,bOverride_ColorSaturationShadows=False,bOverride_ColorContrastShadows=False,bOverride_ColorGammaShadows=False,bOverride_ColorGainShadows=False,bOverride_ColorOffsetShadows=False,bOverride_ColorSaturationMidtones=False,bOverride_ColorContrastMidtones=False,bOverride_ColorGammaMidtones=False,bOverride_ColorGainMidtones=False,bOverride_ColorOffsetMidtones=False,bOverride_ColorSaturationHighlights=False,bOverride_ColorContrastHighlights=False,bOverride_ColorGammaHighlights=False,bOverride_ColorGainHighlights=False,bOverride_ColorOffsetHighlights=False,bOverride_ColorCorrectionShadowsMax=False,bOverride_ColorCorrectionHighlightsMin=False,bOverride_FilmWhitePoint=False,bOverride_FilmSaturation=False,bOverride_FilmChannelMixerRed=False,bOverride_FilmChannelMixerGreen=False,bOverride_FilmChannelMixerBlue=False,bOverride_FilmContrast=False,bOverride_FilmDynamicRange=False,bOverride_FilmHealAmount=False,bOverride_FilmToeAmount=False,bOverride_FilmShadowTint=False,bOverride_FilmShadowTintBlend=False,bOverride_FilmShadowTintAmount=False,bOverride_FilmSlope=True,bOverride_FilmToe=True,bOverride_FilmShoulder=True,bOverride_FilmBlackClip=True,bOverride_FilmWhiteClip=True,bOverride_SceneColorTint=False,bOverride_SceneFringeIntensity=False,bOverride_AmbientCubemapTint=False,bOverride_AmbientCubemapIntensity=False,bOverride_BloomIntensity=True,bOverride_BloomThreshold=False,bOverride_Bloom1Tint=False,bOverride_Bloom1Size=False,bOverride_Bloom2Size=False,bOverride_Bloom2Tint=False,bOverride_Bloom3Tint=False,bOverride_Bloom3Size=False,bOverride_Bloom4Tint=False,bOverride_Bloom4Size=False,bOverride_Bloom5Tint=False,bOverride_Bloom5Size=False,bOverride_Bloom6Tint=False,bOverride_Bloom6Size=False,bOverride_BloomSizeScale=False,bOverride_BloomDirtMaskIntensity=False,bOverride_BloomDirtMaskTint=False,bOverride_BloomDirtMask=False,bOverride_AutoExposureMethod=True,bOverride_AutoExposureLowPercent=False,bOverride_AutoExposureHighPercent=False,bOverride_AutoExposureMinBrightness=True,bOverride_AutoExposureMaxBrightness=True,bOverride_AutoExposureSpeedUp=False,bOverride_AutoExposureSpeedDown=False,bOverride_AutoExposureBias=True,bOverride_HistogramLogMin=True,bOverride_HistogramLogMax=True,bOverride_LensFlareIntensity=False,bOverride_LensFlareTint=False,bOverride_LensFlareTints=False,bOverride_LensFlareBokehSize=False,bOverride_LensFlareBokehShape=False,bOverride_LensFlareThreshold=False,bOverride_VignetteIntensity=True,bOverride_GrainIntensity=False,bOverride_GrainJitter=False,bOverride_AmbientOcclusionIntensity=True,bOverride_AmbientOcclusionStaticFraction=True,bOverride_AmbientOcclusionRadius=True,bOverride_AmbientOcclusionFadeDistance=False,bOverride_AmbientOcclusionFadeRadius=False,bOverride_AmbientOcclusionDistance=False,bOverride_AmbientOcclusionRadiusInWS=False,bOverride_AmbientOcclusionPower=True,bOverride_AmbientOcclusionBias=True,bOverride_AmbientOcclusionQuality=True,bOverride_AmbientOcclusionMipBlend=True,bOverride_AmbientOcclusionMipScale=True,bOverride_AmbientOcclusionMipThreshold=True,bOverride_LPVIntensity=False,bOverride_LPVDirectionalOcclusionIntensity=False,bOverride_LPVDirectionalOcclusionRadius=False,bOverride_LPVDiffuseOcclusionExponent=False,bOverride_LPVSpecularOcclusionExponent=False,bOverride_LPVDiffuseOcclusionIntensity=False,bOverride_LPVSpecularOcclusionIntensity=False,bOverride_LPVSize=False,bOverride_LPVSecondaryOcclusionIntensity=False,bOverride_LPVSecondaryBounceIntensity=False,bOverride_LPVGeometryVolumeBias=False,bOverride_LPVVplInjectionBias=False,bOverride_LPVEmissiveInjectionIntensity=False,bOverride_IndirectLightingColor=False,bOverride_IndirectLightingIntensity=False,bOverride_ColorGradingIntensity=True,bOverride_ColorGradingLUT=True,bOverride_DepthOfFieldFocalDistance=False,bOverride_DepthOfFieldFstop=False,bOverride_DepthOfFieldSensorWidth=False,bOverride_DepthOfFieldDepthBlurRadius=False,bOverride_DepthOfFieldDepthBlurAmount=False,bOverride_DepthOfFieldFocalRegion=False,bOverride_DepthOfFieldNearTransitionRegion=False,bOverride_DepthOfFieldFarTransitionRegion=False,bOverride_DepthOfFieldScale=True,bOverride_DepthOfFieldMaxBokehSize=False,bOverride_DepthOfFieldNearBlurSize=False,bOverride_DepthOfFieldFarBlurSize=False,bOverride_DepthOfFieldMethod=True,bOverride_MobileHQGaussian=False,bOverride_DepthOfFieldBokehShape=False,bOverride_DepthOfFieldOcclusion=False,bOverride_DepthOfFieldColorThreshold=False,bOverride_DepthOfFieldSizeThreshold=False,bOverride_DepthOfFieldSkyFocusDistance=False,bOverride_DepthOfFieldVignetteSize=False,bOverride_MotionBlurAmount=False,bOverride_MotionBlurMax=False,bOverride_MotionBlurPerObjectSize=False,bOverride_ScreenPercentage=False,bOverride_ScreenSpaceReflectionIntensity=True,bOverride_ScreenSpaceReflectionQuality=True,bOverride_ScreenSpaceReflectionMaxRoughness=True,bOverride_ScreenSpaceReflectionRoughnessScale=False,WhiteTemp=6700.000000,WhiteTint=0.000000,ColorSaturation=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorContrast=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGamma=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGain=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorOffset=(X=0.005000,Y=0.005000,Z=0.005000,W=0.000000),ColorSaturationShadows=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorContrastShadows=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGammaShadows=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGainShadows=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorOffsetShadows=(X=0.000000,Y=0.000000,Z=0.000000,W=0.000000),ColorCorrectionShadowsMax=0.090000,ColorSaturationMidtones=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorContrastMidtones=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGammaMidtones=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGainMidtones=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorOffsetMidtones=(X=0.000000,Y=0.000000,Z=0.000000,W=0.000000),ColorSaturationHighlights=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorContrastHighlights=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGammaHighlights=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGainHighlights=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorOffsetHighlights=(X=0.000000,Y=0.000000,Z=0.000000,W=0.000000),ColorCorrectionHighlightsMin=0.500000,FilmWhitePoint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),FilmShadowTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),FilmShadowTintBlend=0.500000,FilmShadowTintAmount=0.000000,FilmSaturation=1.000000,FilmChannelMixerRed=(R=1.000000,G=0.000000,B=0.000000,A=1.000000),FilmChannelMixerGreen=(R=0.000000,G=1.000000,B=0.000000,A=1.000000),FilmChannelMixerBlue=(R=0.000000,G=0.000000,B=1.000000,A=1.000000),FilmContrast=0.030000,FilmToeAmount=1.000000,FilmHealAmount=0.180000,FilmDynamicRange=4.000000,FilmSlope=0.880000,FilmToe=0.550000,FilmShoulder=0.260000,FilmBlackClip=0.000000,FilmWhiteClip=0.040000,SceneColorTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),SceneFringeIntensity=0.000000,BloomIntensity=1.000000,BloomThreshold=1.000000,BloomSizeScale=4.000000,Bloom1Size=1.000000,Bloom2Size=4.000000,Bloom3Size=16.000000,Bloom4Size=32.000000,Bloom5Size=64.000000,Bloom6Size=64.000000,Bloom1Tint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),Bloom2Tint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),Bloom3Tint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),Bloom4Tint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),Bloom5Tint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),Bloom6Tint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),BloomDirtMaskIntensity=1.000000,BloomDirtMaskTint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),BloomDirtMask=None,AmbientCubemapTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),AmbientCubemapIntensity=1.000000,AmbientCubemap=None,AutoExposureMethod=AEM_Histogram,AutoExposureLowPercent=80.000000,AutoExposureHighPercent=98.300003,AutoExposureMinBrightness=1.000000,AutoExposureMaxBrightness=1.000000,AutoExposureSpeedUp=3.000000,AutoExposureSpeedDown=1.000000,AutoExposureBias=0.330000,HistogramLogMin=-8.000000,HistogramLogMax=4.000000,LensFlareIntensity=1.000000,LensFlareTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),LensFlareBokehSize=3.000000,LensFlareThreshold=8.000000,LensFlareBokehShape=None,LensFlareTints[0]=(R=1.000000,G=0.800000,B=0.400000,A=0.600000),LensFlareTints[1]=(R=1.000000,G=1.000000,B=0.600000,A=0.530000),LensFlareTints[2]=(R=0.800000,G=0.800000,B=1.000000,A=0.460000),LensFlareTints[3]=(R=0.500000,G=1.000000,B=0.400000,A=0.390000),LensFlareTints[4]=(R=0.500000,G=0.800000,B=1.000000,A=0.310000),LensFlareTints[5]=(R=0.900000,G=1.000000,B=0.800000,A=0.270000),LensFlareTints[6]=(R=1.000000,G=0.800000,B=0.400000,A=0.220000),LensFlareTints[7]=(R=0.900000,G=0.700000,B=0.700000,A=0.150000),VignetteIntensity=0.161468,GrainJitter=0.000000,GrainIntensity=0.000000,AmbientOcclusionIntensity=1.000000,AmbientOcclusionStaticFraction=1.000000,AmbientOcclusionRadius=73.477997,AmbientOcclusionRadiusInWS=False,AmbientOcclusionFadeDistance=8000.000000,AmbientOcclusionFadeRadius=5000.000000,AmbientOcclusionDistance=80.000000,AmbientOcclusionPower=1.200000,AmbientOcclusionBias=3.000000,AmbientOcclusionQuality=100.000000,AmbientOcclusionMipBlend=0.600000,AmbientOcclusionMipScale=1.700000,AmbientOcclusionMipThreshold=0.010000,IndirectLightingColor=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),IndirectLightingIntensity=1.000000,ColorGradingIntensity=0.000000,ColorGradingLUT=Texture2D'/Engine/EditorResources/RGBTable16x1_AssetViewer.RGBTable16x1_AssetViewer',DepthOfFieldMethod=DOFM_BokehDOF,bMobileHQGaussian=False,DepthOfFieldFstop=4.000000,DepthOfFieldSensorWidth=24.576000,DepthOfFieldFocalDistance=1000.000000,DepthOfFieldDepthBlurAmount=1.000000,DepthOfFieldDepthBlurRadius=0.000000,DepthOfFieldFocalRegion=0.000000,DepthOfFieldNearTransitionRegion=300.000000,DepthOfFieldFarTransitionRegion=500.000000,DepthOfFieldScale=0.000000,DepthOfFieldMaxBokehSize=15.000000,DepthOfFieldNearBlurSize=15.000000,DepthOfFieldFarBlurSize=15.000000,DepthOfFieldBokehShape=None,DepthOfFieldOcclusion=0.400000,DepthOfFieldColorThreshold=1.000000,DepthOfFieldSizeThreshold=0.080000,DepthOfFieldSkyFocusDistance=0.000000,DepthOfFieldVignetteSize=200.000000,MotionBlurAmount=0.500000,MotionBlurMax=5.000000,MotionBlurPerObjectSize=0.500000,LPVIntensity=1.000000,LPVVplInjectionBias=0.640000,LPVSize=5312.000000,LPVSecondaryOcclusionIntensity=0.000000,LPVSecondaryBounceIntensity=0.000000,LPVGeometryVolumeBias=0.384000,LPVEmissiveInjectionIntensity=1.000000,LPVDirectionalOcclusionIntensity=0.000000,LPVDirectionalOcclusionRadius=8.000000,LPVDiffuseOcclusionExponent=1.000000,LPVSpecularOcclusionExponent=7.000000,LPVDiffuseOcclusionIntensity=1.000000,LPVSpecularOcclusionIntensity=1.000000,ScreenSpaceReflectionIntensity=100.000000,ScreenSpaceReflectionQuality=100.000000,ScreenSpaceReflectionMaxRoughness=1.000000,ScreenPercentage=100.000000,WeightedBlendables=(Array=),Blendables=),bPostProcessingEnabled=True,LightingRigRotation=109.389069,RotationSpeed=2.000000,DirectionalLightRotation=(Pitch=-39.999985,Yaw=-67.500015,Roll=0.000000))\n+Profiles=(ProfileName=\"Default\",DirectionalLightIntensity=2.620000,DirectionalLightColor=(R=0.990000,G=0.839850,B=0.732600,A=1.000000),SkyLightIntensity=0.880000,bRotateLightingRig=False,bShowEnvironment=True,bShowFloor=True,EnvironmentCubeMapPath=\"/Engine/EditorMaterials/AssetViewer/EpicQuadPanorama_CC+EV1.EpicQuadPanorama_CC+EV1\",PostProcessingSettings=(bOverride_WhiteTemp=True,bOverride_WhiteTint=False,bOverride_ColorSaturation=True,bOverride_ColorContrast=True,bOverride_ColorGamma=True,bOverride_ColorGain=True,bOverride_ColorOffset=True,bOverride_ColorSaturationShadows=False,bOverride_ColorContrastShadows=False,bOverride_ColorGammaShadows=False,bOverride_ColorGainShadows=False,bOverride_ColorOffsetShadows=False,bOverride_ColorSaturationMidtones=False,bOverride_ColorContrastMidtones=False,bOverride_ColorGammaMidtones=False,bOverride_ColorGainMidtones=False,bOverride_ColorOffsetMidtones=False,bOverride_ColorSaturationHighlights=False,bOverride_ColorContrastHighlights=False,bOverride_ColorGammaHighlights=False,bOverride_ColorGainHighlights=False,bOverride_ColorOffsetHighlights=False,bOverride_ColorCorrectionShadowsMax=False,bOverride_ColorCorrectionHighlightsMin=False,bOverride_FilmWhitePoint=False,bOverride_FilmSaturation=False,bOverride_FilmChannelMixerRed=False,bOverride_FilmChannelMixerGreen=False,bOverride_FilmChannelMixerBlue=False,bOverride_FilmContrast=False,bOverride_FilmDynamicRange=False,bOverride_FilmHealAmount=False,bOverride_FilmToeAmount=False,bOverride_FilmShadowTint=False,bOverride_FilmShadowTintBlend=False,bOverride_FilmShadowTintAmount=False,bOverride_FilmSlope=True,bOverride_FilmToe=True,bOverride_FilmShoulder=True,bOverride_FilmBlackClip=True,bOverride_FilmWhiteClip=True,bOverride_SceneColorTint=False,bOverride_SceneFringeIntensity=False,bOverride_AmbientCubemapTint=False,bOverride_AmbientCubemapIntensity=False,bOverride_BloomIntensity=True,bOverride_BloomThreshold=False,bOverride_Bloom1Tint=False,bOverride_Bloom1Size=False,bOverride_Bloom2Size=False,bOverride_Bloom2Tint=False,bOverride_Bloom3Tint=False,bOverride_Bloom3Size=False,bOverride_Bloom4Tint=False,bOverride_Bloom4Size=False,bOverride_Bloom5Tint=False,bOverride_Bloom5Size=False,bOverride_Bloom6Tint=False,bOverride_Bloom6Size=False,bOverride_BloomSizeScale=False,bOverride_BloomDirtMaskIntensity=False,bOverride_BloomDirtMaskTint=False,bOverride_BloomDirtMask=False,bOverride_AutoExposureMethod=True,bOverride_AutoExposureLowPercent=False,bOverride_AutoExposureHighPercent=False,bOverride_AutoExposureMinBrightness=True,bOverride_AutoExposureMaxBrightness=True,bOverride_AutoExposureSpeedUp=False,bOverride_AutoExposureSpeedDown=False,bOverride_AutoExposureBias=True,bOverride_HistogramLogMin=True,bOverride_HistogramLogMax=True,bOverride_LensFlareIntensity=False,bOverride_LensFlareTint=False,bOverride_LensFlareTints=False,bOverride_LensFlareBokehSize=False,bOverride_LensFlareBokehShape=False,bOverride_LensFlareThreshold=False,bOverride_VignetteIntensity=True,bOverride_GrainIntensity=False,bOverride_GrainJitter=False,bOverride_AmbientOcclusionIntensity=True,bOverride_AmbientOcclusionStaticFraction=True,bOverride_AmbientOcclusionRadius=True,bOverride_AmbientOcclusionFadeDistance=False,bOverride_AmbientOcclusionFadeRadius=False,bOverride_AmbientOcclusionDistance=False,bOverride_AmbientOcclusionRadiusInWS=False,bOverride_AmbientOcclusionPower=True,bOverride_AmbientOcclusionBias=True,bOverride_AmbientOcclusionQuality=True,bOverride_AmbientOcclusionMipBlend=True,bOverride_AmbientOcclusionMipScale=True,bOverride_AmbientOcclusionMipThreshold=True,bOverride_LPVIntensity=False,bOverride_LPVDirectionalOcclusionIntensity=False,bOverride_LPVDirectionalOcclusionRadius=False,bOverride_LPVDiffuseOcclusionExponent=False,bOverride_LPVSpecularOcclusionExponent=False,bOverride_LPVDiffuseOcclusionIntensity=False,bOverride_LPVSpecularOcclusionIntensity=False,bOverride_LPVSize=False,bOverride_LPVSecondaryOcclusionIntensity=False,bOverride_LPVSecondaryBounceIntensity=False,bOverride_LPVGeometryVolumeBias=False,bOverride_LPVVplInjectionBias=False,bOverride_LPVEmissiveInjectionIntensity=False,bOverride_IndirectLightingColor=False,bOverride_IndirectLightingIntensity=False,bOverride_ColorGradingIntensity=True,bOverride_ColorGradingLUT=True,bOverride_DepthOfFieldFocalDistance=False,bOverride_DepthOfFieldFstop=False,bOverride_DepthOfFieldSensorWidth=False,bOverride_DepthOfFieldDepthBlurRadius=False,bOverride_DepthOfFieldDepthBlurAmount=False,bOverride_DepthOfFieldFocalRegion=False,bOverride_DepthOfFieldNearTransitionRegion=False,bOverride_DepthOfFieldFarTransitionRegion=False,bOverride_DepthOfFieldScale=True,bOverride_DepthOfFieldMaxBokehSize=False,bOverride_DepthOfFieldNearBlurSize=False,bOverride_DepthOfFieldFarBlurSize=False,bOverride_DepthOfFieldMethod=True,bOverride_MobileHQGaussian=False,bOverride_DepthOfFieldBokehShape=False,bOverride_DepthOfFieldOcclusion=False,bOverride_DepthOfFieldColorThreshold=False,bOverride_DepthOfFieldSizeThreshold=False,bOverride_DepthOfFieldSkyFocusDistance=False,bOverride_DepthOfFieldVignetteSize=False,bOverride_MotionBlurAmount=False,bOverride_MotionBlurMax=False,bOverride_MotionBlurPerObjectSize=False,bOverride_ScreenPercentage=False,bOverride_ScreenSpaceReflectionIntensity=True,bOverride_ScreenSpaceReflectionQuality=True,bOverride_ScreenSpaceReflectionMaxRoughness=True,bOverride_ScreenSpaceReflectionRoughnessScale=False,WhiteTemp=6700.000000,WhiteTint=0.000000,ColorSaturation=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorContrast=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGamma=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGain=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorOffset=(X=0.005000,Y=0.005000,Z=0.005000,W=0.000000),ColorSaturationShadows=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorContrastShadows=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGammaShadows=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGainShadows=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorOffsetShadows=(X=0.000000,Y=0.000000,Z=0.000000,W=0.000000),ColorCorrectionShadowsMax=0.090000,ColorSaturationMidtones=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorContrastMidtones=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGammaMidtones=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGainMidtones=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorOffsetMidtones=(X=0.000000,Y=0.000000,Z=0.000000,W=0.000000),ColorSaturationHighlights=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorContrastHighlights=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGammaHighlights=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGainHighlights=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorOffsetHighlights=(X=0.000000,Y=0.000000,Z=0.000000,W=0.000000),ColorCorrectionHighlightsMin=0.500000,FilmWhitePoint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),FilmShadowTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),FilmShadowTintBlend=0.500000,FilmShadowTintAmount=0.000000,FilmSaturation=1.000000,FilmChannelMixerRed=(R=1.000000,G=0.000000,B=0.000000,A=1.000000),FilmChannelMixerGreen=(R=0.000000,G=1.000000,B=0.000000,A=1.000000),FilmChannelMixerBlue=(R=0.000000,G=0.000000,B=1.000000,A=1.000000),FilmContrast=0.030000,FilmToeAmount=1.000000,FilmHealAmount=0.180000,FilmDynamicRange=4.000000,FilmSlope=0.880000,FilmToe=0.550000,FilmShoulder=0.260000,FilmBlackClip=0.000000,FilmWhiteClip=0.040000,SceneColorTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),SceneFringeIntensity=0.000000,BloomIntensity=1.000000,BloomThreshold=1.000000,BloomSizeScale=4.000000,Bloom1Size=1.000000,Bloom2Size=4.000000,Bloom3Size=16.000000,Bloom4Size=32.000000,Bloom5Size=64.000000,Bloom6Size=64.000000,Bloom1Tint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),Bloom2Tint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),Bloom3Tint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),Bloom4Tint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),Bloom5Tint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),Bloom6Tint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),BloomDirtMaskIntensity=1.000000,BloomDirtMaskTint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),BloomDirtMask=None,AmbientCubemapTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),AmbientCubemapIntensity=1.000000,AmbientCubemap=None,AutoExposureMethod=AEM_Histogram,AutoExposureLowPercent=80.000000,AutoExposureHighPercent=98.300003,AutoExposureMinBrightness=1.000000,AutoExposureMaxBrightness=1.000000,AutoExposureSpeedUp=3.000000,AutoExposureSpeedDown=1.000000,AutoExposureBias=0.330000,HistogramLogMin=-8.000000,HistogramLogMax=4.000000,LensFlareIntensity=1.000000,LensFlareTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),LensFlareBokehSize=3.000000,LensFlareThreshold=8.000000,LensFlareBokehShape=None,LensFlareTints[0]=(R=1.000000,G=0.800000,B=0.400000,A=0.600000),LensFlareTints[1]=(R=1.000000,G=1.000000,B=0.600000,A=0.530000),LensFlareTints[2]=(R=0.800000,G=0.800000,B=1.000000,A=0.460000),LensFlareTints[3]=(R=0.500000,G=1.000000,B=0.400000,A=0.390000),LensFlareTints[4]=(R=0.500000,G=0.800000,B=1.000000,A=0.310000),LensFlareTints[5]=(R=0.900000,G=1.000000,B=0.800000,A=0.270000),LensFlareTints[6]=(R=1.000000,G=0.800000,B=0.400000,A=0.220000),LensFlareTints[7]=(R=0.900000,G=0.700000,B=0.700000,A=0.150000),VignetteIntensity=0.161468,GrainJitter=0.000000,GrainIntensity=0.000000,AmbientOcclusionIntensity=1.000000,AmbientOcclusionStaticFraction=1.000000,AmbientOcclusionRadius=73.477997,AmbientOcclusionRadiusInWS=False,AmbientOcclusionFadeDistance=8000.000000,AmbientOcclusionFadeRadius=5000.000000,AmbientOcclusionDistance=80.000000,AmbientOcclusionPower=1.200000,AmbientOcclusionBias=3.000000,AmbientOcclusionQuality=100.000000,AmbientOcclusionMipBlend=0.600000,AmbientOcclusionMipScale=1.700000,AmbientOcclusionMipThreshold=0.010000,IndirectLightingColor=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),IndirectLightingIntensity=1.000000,ColorGradingIntensity=0.000000,ColorGradingLUT=Texture2D'/Engine/EditorResources/RGBTable16x1_AssetViewer.RGBTable16x1_AssetViewer',DepthOfFieldMethod=DOFM_BokehDOF,bMobileHQGaussian=False,DepthOfFieldFstop=4.000000,DepthOfFieldSensorWidth=24.576000,DepthOfFieldFocalDistance=1000.000000,DepthOfFieldDepthBlurAmount=1.000000,DepthOfFieldDepthBlurRadius=0.000000,DepthOfFieldFocalRegion=0.000000,DepthOfFieldNearTransitionRegion=300.000000,DepthOfFieldFarTransitionRegion=500.000000,DepthOfFieldScale=0.000000,DepthOfFieldMaxBokehSize=15.000000,DepthOfFieldNearBlurSize=15.000000,DepthOfFieldFarBlurSize=15.000000,DepthOfFieldBokehShape=None,DepthOfFieldOcclusion=0.400000,DepthOfFieldColorThreshold=1.000000,DepthOfFieldSizeThreshold=0.080000,DepthOfFieldSkyFocusDistance=0.000000,DepthOfFieldVignetteSize=200.000000,MotionBlurAmount=0.500000,MotionBlurMax=5.000000,MotionBlurPerObjectSize=0.500000,LPVIntensity=1.000000,LPVVplInjectionBias=0.640000,LPVSize=5312.000000,LPVSecondaryOcclusionIntensity=0.000000,LPVSecondaryBounceIntensity=0.000000,LPVGeometryVolumeBias=0.384000,LPVEmissiveInjectionIntensity=1.000000,LPVDirectionalOcclusionIntensity=0.000000,LPVDirectionalOcclusionRadius=8.000000,LPVDiffuseOcclusionExponent=1.000000,LPVSpecularOcclusionExponent=7.000000,LPVDiffuseOcclusionIntensity=1.000000,LPVSpecularOcclusionIntensity=1.000000,ScreenSpaceReflectionIntensity=100.000000,ScreenSpaceReflectionQuality=100.000000,ScreenSpaceReflectionMaxRoughness=1.000000,ScreenPercentage=100.000000,WeightedBlendables=(Array=),Blendables=),bPostProcessingEnabled=True,LightingRigRotation=109.389069,RotationSpeed=2.000000,DirectionalLightRotation=(Pitch=-39.999985,Yaw=-67.500015,Roll=0.000000))\n+Profiles=(ProfileName=\"Default\",DirectionalLightIntensity=2.620000,DirectionalLightColor=(R=0.990000,G=0.839850,B=0.732600,A=1.000000),SkyLightIntensity=0.880000,bRotateLightingRig=False,bShowEnvironment=True,bShowFloor=True,EnvironmentCubeMapPath=\"/Engine/EditorMaterials/AssetViewer/EpicQuadPanorama_CC+EV1.EpicQuadPanorama_CC+EV1\",PostProcessingSettings=(bOverride_WhiteTemp=True,bOverride_WhiteTint=False,bOverride_ColorSaturation=True,bOverride_ColorContrast=True,bOverride_ColorGamma=True,bOverride_ColorGain=True,bOverride_ColorOffset=True,bOverride_ColorSaturationShadows=False,bOverride_ColorContrastShadows=False,bOverride_ColorGammaShadows=False,bOverride_ColorGainShadows=False,bOverride_ColorOffsetShadows=False,bOverride_ColorSaturationMidtones=False,bOverride_ColorContrastMidtones=False,bOverride_ColorGammaMidtones=False,bOverride_ColorGainMidtones=False,bOverride_ColorOffsetMidtones=False,bOverride_ColorSaturationHighlights=False,bOverride_ColorContrastHighlights=False,bOverride_ColorGammaHighlights=False,bOverride_ColorGainHighlights=False,bOverride_ColorOffsetHighlights=False,bOverride_ColorCorrectionShadowsMax=False,bOverride_ColorCorrectionHighlightsMin=False,bOverride_FilmWhitePoint=False,bOverride_FilmSaturation=False,bOverride_FilmChannelMixerRed=False,bOverride_FilmChannelMixerGreen=False,bOverride_FilmChannelMixerBlue=False,bOverride_FilmContrast=False,bOverride_FilmDynamicRange=False,bOverride_FilmHealAmount=False,bOverride_FilmToeAmount=False,bOverride_FilmShadowTint=False,bOverride_FilmShadowTintBlend=False,bOverride_FilmShadowTintAmount=False,bOverride_FilmSlope=True,bOverride_FilmToe=True,bOverride_FilmShoulder=True,bOverride_FilmBlackClip=True,bOverride_FilmWhiteClip=True,bOverride_SceneColorTint=False,bOverride_SceneFringeIntensity=False,bOverride_AmbientCubemapTint=False,bOverride_AmbientCubemapIntensity=False,bOverride_BloomIntensity=True,bOverride_BloomThreshold=False,bOverride_Bloom1Tint=False,bOverride_Bloom1Size=False,bOverride_Bloom2Size=False,bOverride_Bloom2Tint=False,bOverride_Bloom3Tint=False,bOverride_Bloom3Size=False,bOverride_Bloom4Tint=False,bOverride_Bloom4Size=False,bOverride_Bloom5Tint=False,bOverride_Bloom5Size=False,bOverride_Bloom6Tint=False,bOverride_Bloom6Size=False,bOverride_BloomSizeScale=False,bOverride_BloomDirtMaskIntensity=False,bOverride_BloomDirtMaskTint=False,bOverride_BloomDirtMask=False,bOverride_AutoExposureMethod=True,bOverride_AutoExposureLowPercent=False,bOverride_AutoExposureHighPercent=False,bOverride_AutoExposureMinBrightness=True,bOverride_AutoExposureMaxBrightness=True,bOverride_AutoExposureSpeedUp=False,bOverride_AutoExposureSpeedDown=False,bOverride_AutoExposureBias=True,bOverride_HistogramLogMin=True,bOverride_HistogramLogMax=True,bOverride_LensFlareIntensity=False,bOverride_LensFlareTint=False,bOverride_LensFlareTints=False,bOverride_LensFlareBokehSize=False,bOverride_LensFlareBokehShape=False,bOverride_LensFlareThreshold=False,bOverride_VignetteIntensity=True,bOverride_GrainIntensity=False,bOverride_GrainJitter=False,bOverride_AmbientOcclusionIntensity=True,bOverride_AmbientOcclusionStaticFraction=True,bOverride_AmbientOcclusionRadius=True,bOverride_AmbientOcclusionFadeDistance=False,bOverride_AmbientOcclusionFadeRadius=False,bOverride_AmbientOcclusionDistance=False,bOverride_AmbientOcclusionRadiusInWS=False,bOverride_AmbientOcclusionPower=True,bOverride_AmbientOcclusionBias=True,bOverride_AmbientOcclusionQuality=True,bOverride_AmbientOcclusionMipBlend=True,bOverride_AmbientOcclusionMipScale=True,bOverride_AmbientOcclusionMipThreshold=True,bOverride_LPVIntensity=False,bOverride_LPVDirectionalOcclusionIntensity=False,bOverride_LPVDirectionalOcclusionRadius=False,bOverride_LPVDiffuseOcclusionExponent=False,bOverride_LPVSpecularOcclusionExponent=False,bOverride_LPVDiffuseOcclusionIntensity=False,bOverride_LPVSpecularOcclusionIntensity=False,bOverride_LPVSize=False,bOverride_LPVSecondaryOcclusionIntensity=False,bOverride_LPVSecondaryBounceIntensity=False,bOverride_LPVGeometryVolumeBias=False,bOverride_LPVVplInjectionBias=False,bOverride_LPVEmissiveInjectionIntensity=False,bOverride_IndirectLightingColor=False,bOverride_IndirectLightingIntensity=False,bOverride_ColorGradingIntensity=True,bOverride_ColorGradingLUT=True,bOverride_DepthOfFieldFocalDistance=False,bOverride_DepthOfFieldFstop=False,bOverride_DepthOfFieldSensorWidth=False,bOverride_DepthOfFieldDepthBlurRadius=False,bOverride_DepthOfFieldDepthBlurAmount=False,bOverride_DepthOfFieldFocalRegion=False,bOverride_DepthOfFieldNearTransitionRegion=False,bOverride_DepthOfFieldFarTransitionRegion=False,bOverride_DepthOfFieldScale=True,bOverride_DepthOfFieldMaxBokehSize=False,bOverride_DepthOfFieldNearBlurSize=False,bOverride_DepthOfFieldFarBlurSize=False,bOverride_DepthOfFieldMethod=True,bOverride_MobileHQGaussian=False,bOverride_DepthOfFieldBokehShape=False,bOverride_DepthOfFieldOcclusion=False,bOverride_DepthOfFieldColorThreshold=False,bOverride_DepthOfFieldSizeThreshold=False,bOverride_DepthOfFieldSkyFocusDistance=False,bOverride_DepthOfFieldVignetteSize=False,bOverride_MotionBlurAmount=False,bOverride_MotionBlurMax=False,bOverride_MotionBlurPerObjectSize=False,bOverride_ScreenPercentage=False,bOverride_ScreenSpaceReflectionIntensity=True,bOverride_ScreenSpaceReflectionQuality=True,bOverride_ScreenSpaceReflectionMaxRoughness=True,bOverride_ScreenSpaceReflectionRoughnessScale=False,WhiteTemp=6700.000000,WhiteTint=0.000000,ColorSaturation=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorContrast=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGamma=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGain=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorOffset=(X=0.005000,Y=0.005000,Z=0.005000,W=0.000000),ColorSaturationShadows=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorContrastShadows=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGammaShadows=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGainShadows=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorOffsetShadows=(X=0.000000,Y=0.000000,Z=0.000000,W=0.000000),ColorCorrectionShadowsMax=0.090000,ColorSaturationMidtones=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorContrastMidtones=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGammaMidtones=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGainMidtones=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorOffsetMidtones=(X=0.000000,Y=0.000000,Z=0.000000,W=0.000000),ColorSaturationHighlights=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorContrastHighlights=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGammaHighlights=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGainHighlights=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorOffsetHighlights=(X=0.000000,Y=0.000000,Z=0.000000,W=0.000000),ColorCorrectionHighlightsMin=0.500000,FilmWhitePoint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),FilmShadowTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),FilmShadowTintBlend=0.500000,FilmShadowTintAmount=0.000000,FilmSaturation=1.000000,FilmChannelMixerRed=(R=1.000000,G=0.000000,B=0.000000,A=1.000000),FilmChannelMixerGreen=(R=0.000000,G=1.000000,B=0.000000,A=1.000000),FilmChannelMixerBlue=(R=0.000000,G=0.000000,B=1.000000,A=1.000000),FilmContrast=0.030000,FilmToeAmount=1.000000,FilmHealAmount=0.180000,FilmDynamicRange=4.000000,FilmSlope=0.880000,FilmToe=0.550000,FilmShoulder=0.260000,FilmBlackClip=0.000000,FilmWhiteClip=0.040000,SceneColorTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),SceneFringeIntensity=0.000000,BloomIntensity=1.000000,BloomThreshold=1.000000,BloomSizeScale=4.000000,Bloom1Size=1.000000,Bloom2Size=4.000000,Bloom3Size=16.000000,Bloom4Size=32.000000,Bloom5Size=64.000000,Bloom6Size=64.000000,Bloom1Tint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),Bloom2Tint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),Bloom3Tint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),Bloom4Tint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),Bloom5Tint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),Bloom6Tint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),BloomDirtMaskIntensity=1.000000,BloomDirtMaskTint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),BloomDirtMask=None,AmbientCubemapTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),AmbientCubemapIntensity=1.000000,AmbientCubemap=None,AutoExposureMethod=AEM_Histogram,AutoExposureLowPercent=80.000000,AutoExposureHighPercent=98.300003,AutoExposureMinBrightness=1.000000,AutoExposureMaxBrightness=1.000000,AutoExposureSpeedUp=3.000000,AutoExposureSpeedDown=1.000000,AutoExposureBias=0.330000,HistogramLogMin=-8.000000,HistogramLogMax=4.000000,LensFlareIntensity=1.000000,LensFlareTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),LensFlareBokehSize=3.000000,LensFlareThreshold=8.000000,LensFlareBokehShape=None,LensFlareTints[0]=(R=1.000000,G=0.800000,B=0.400000,A=0.600000),LensFlareTints[1]=(R=1.000000,G=1.000000,B=0.600000,A=0.530000),LensFlareTints[2]=(R=0.800000,G=0.800000,B=1.000000,A=0.460000),LensFlareTints[3]=(R=0.500000,G=1.000000,B=0.400000,A=0.390000),LensFlareTints[4]=(R=0.500000,G=0.800000,B=1.000000,A=0.310000),LensFlareTints[5]=(R=0.900000,G=1.000000,B=0.800000,A=0.270000),LensFlareTints[6]=(R=1.000000,G=0.800000,B=0.400000,A=0.220000),LensFlareTints[7]=(R=0.900000,G=0.700000,B=0.700000,A=0.150000),VignetteIntensity=0.161468,GrainJitter=0.000000,GrainIntensity=0.000000,AmbientOcclusionIntensity=1.000000,AmbientOcclusionStaticFraction=1.000000,AmbientOcclusionRadius=73.477997,AmbientOcclusionRadiusInWS=False,AmbientOcclusionFadeDistance=8000.000000,AmbientOcclusionFadeRadius=5000.000000,AmbientOcclusionDistance=80.000000,AmbientOcclusionPower=1.200000,AmbientOcclusionBias=3.000000,AmbientOcclusionQuality=100.000000,AmbientOcclusionMipBlend=0.600000,AmbientOcclusionMipScale=1.700000,AmbientOcclusionMipThreshold=0.010000,IndirectLightingColor=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),IndirectLightingIntensity=1.000000,ColorGradingIntensity=0.000000,ColorGradingLUT=Texture2D'/Engine/EditorResources/RGBTable16x1_AssetViewer.RGBTable16x1_AssetViewer',DepthOfFieldMethod=DOFM_BokehDOF,bMobileHQGaussian=False,DepthOfFieldFstop=4.000000,DepthOfFieldSensorWidth=24.576000,DepthOfFieldFocalDistance=1000.000000,DepthOfFieldDepthBlurAmount=1.000000,DepthOfFieldDepthBlurRadius=0.000000,DepthOfFieldFocalRegion=0.000000,DepthOfFieldNearTransitionRegion=300.000000,DepthOfFieldFarTransitionRegion=500.000000,DepthOfFieldScale=0.000000,DepthOfFieldMaxBokehSize=15.000000,DepthOfFieldNearBlurSize=15.000000,DepthOfFieldFarBlurSize=15.000000,DepthOfFieldBokehShape=None,DepthOfFieldOcclusion=0.400000,DepthOfFieldColorThreshold=1.000000,DepthOfFieldSizeThreshold=0.080000,DepthOfFieldSkyFocusDistance=0.000000,DepthOfFieldVignetteSize=200.000000,MotionBlurAmount=0.500000,MotionBlurMax=5.000000,MotionBlurPerObjectSize=0.500000,LPVIntensity=1.000000,LPVVplInjectionBias=0.640000,LPVSize=5312.000000,LPVSecondaryOcclusionIntensity=0.000000,LPVSecondaryBounceIntensity=0.000000,LPVGeometryVolumeBias=0.384000,LPVEmissiveInjectionIntensity=1.000000,LPVDirectionalOcclusionIntensity=0.000000,LPVDirectionalOcclusionRadius=8.000000,LPVDiffuseOcclusionExponent=1.000000,LPVSpecularOcclusionExponent=7.000000,LPVDiffuseOcclusionIntensity=1.000000,LPVSpecularOcclusionIntensity=1.000000,ScreenSpaceReflectionIntensity=100.000000,ScreenSpaceReflectionQuality=100.000000,ScreenSpaceReflectionMaxRoughness=1.000000,ScreenPercentage=100.000000,WeightedBlendables=(Array=),Blendables=),bPostProcessingEnabled=True,LightingRigRotation=109.389069,RotationSpeed=2.000000,DirectionalLightRotation=(Pitch=-39.999985,Yaw=-67.500015,Roll=0.000000))\n+Profiles=(ProfileName=\"Default\",DirectionalLightIntensity=2.620000,DirectionalLightColor=(R=0.990000,G=0.839850,B=0.732600,A=1.000000),SkyLightIntensity=0.880000,bRotateLightingRig=False,bShowEnvironment=True,bShowFloor=True,EnvironmentCubeMapPath=\"/Engine/EditorMaterials/AssetViewer/EpicQuadPanorama_CC+EV1.EpicQuadPanorama_CC+EV1\",PostProcessingSettings=(bOverride_WhiteTemp=True,bOverride_WhiteTint=False,bOverride_ColorSaturation=True,bOverride_ColorContrast=True,bOverride_ColorGamma=True,bOverride_ColorGain=True,bOverride_ColorOffset=True,bOverride_ColorSaturationShadows=False,bOverride_ColorContrastShadows=False,bOverride_ColorGammaShadows=False,bOverride_ColorGainShadows=False,bOverride_ColorOffsetShadows=False,bOverride_ColorSaturationMidtones=False,bOverride_ColorContrastMidtones=False,bOverride_ColorGammaMidtones=False,bOverride_ColorGainMidtones=False,bOverride_ColorOffsetMidtones=False,bOverride_ColorSaturationHighlights=False,bOverride_ColorContrastHighlights=False,bOverride_ColorGammaHighlights=False,bOverride_ColorGainHighlights=False,bOverride_ColorOffsetHighlights=False,bOverride_ColorCorrectionShadowsMax=False,bOverride_ColorCorrectionHighlightsMin=False,bOverride_FilmWhitePoint=False,bOverride_FilmSaturation=False,bOverride_FilmChannelMixerRed=False,bOverride_FilmChannelMixerGreen=False,bOverride_FilmChannelMixerBlue=False,bOverride_FilmContrast=False,bOverride_FilmDynamicRange=False,bOverride_FilmHealAmount=False,bOverride_FilmToeAmount=False,bOverride_FilmShadowTint=False,bOverride_FilmShadowTintBlend=False,bOverride_FilmShadowTintAmount=False,bOverride_FilmSlope=True,bOverride_FilmToe=True,bOverride_FilmShoulder=True,bOverride_FilmBlackClip=True,bOverride_FilmWhiteClip=True,bOverride_SceneColorTint=False,bOverride_SceneFringeIntensity=False,bOverride_AmbientCubemapTint=False,bOverride_AmbientCubemapIntensity=False,bOverride_BloomIntensity=True,bOverride_BloomThreshold=False,bOverride_Bloom1Tint=False,bOverride_Bloom1Size=False,bOverride_Bloom2Size=False,bOverride_Bloom2Tint=False,bOverride_Bloom3Tint=False,bOverride_Bloom3Size=False,bOverride_Bloom4Tint=False,bOverride_Bloom4Size=False,bOverride_Bloom5Tint=False,bOverride_Bloom5Size=False,bOverride_Bloom6Tint=False,bOverride_Bloom6Size=False,bOverride_BloomSizeScale=False,bOverride_BloomDirtMaskIntensity=False,bOverride_BloomDirtMaskTint=False,bOverride_BloomDirtMask=False,bOverride_AutoExposureMethod=True,bOverride_AutoExposureLowPercent=False,bOverride_AutoExposureHighPercent=False,bOverride_AutoExposureMinBrightness=True,bOverride_AutoExposureMaxBrightness=True,bOverride_AutoExposureSpeedUp=False,bOverride_AutoExposureSpeedDown=False,bOverride_AutoExposureBias=True,bOverride_HistogramLogMin=True,bOverride_HistogramLogMax=True,bOverride_LensFlareIntensity=False,bOverride_LensFlareTint=False,bOverride_LensFlareTints=False,bOverride_LensFlareBokehSize=False,bOverride_LensFlareBokehShape=False,bOverride_LensFlareThreshold=False,bOverride_VignetteIntensity=True,bOverride_GrainIntensity=False,bOverride_GrainJitter=False,bOverride_AmbientOcclusionIntensity=True,bOverride_AmbientOcclusionStaticFraction=True,bOverride_AmbientOcclusionRadius=True,bOverride_AmbientOcclusionFadeDistance=False,bOverride_AmbientOcclusionFadeRadius=False,bOverride_AmbientOcclusionDistance=False,bOverride_AmbientOcclusionRadiusInWS=False,bOverride_AmbientOcclusionPower=True,bOverride_AmbientOcclusionBias=True,bOverride_AmbientOcclusionQuality=True,bOverride_AmbientOcclusionMipBlend=True,bOverride_AmbientOcclusionMipScale=True,bOverride_AmbientOcclusionMipThreshold=True,bOverride_LPVIntensity=False,bOverride_LPVDirectionalOcclusionIntensity=False,bOverride_LPVDirectionalOcclusionRadius=False,bOverride_LPVDiffuseOcclusionExponent=False,bOverride_LPVSpecularOcclusionExponent=False,bOverride_LPVDiffuseOcclusionIntensity=False,bOverride_LPVSpecularOcclusionIntensity=False,bOverride_LPVSize=False,bOverride_LPVSecondaryOcclusionIntensity=False,bOverride_LPVSecondaryBounceIntensity=False,bOverride_LPVGeometryVolumeBias=False,bOverride_LPVVplInjectionBias=False,bOverride_LPVEmissiveInjectionIntensity=False,bOverride_IndirectLightingColor=False,bOverride_IndirectLightingIntensity=False,bOverride_ColorGradingIntensity=True,bOverride_ColorGradingLUT=True,bOverride_DepthOfFieldFocalDistance=False,bOverride_DepthOfFieldFstop=False,bOverride_DepthOfFieldSensorWidth=False,bOverride_DepthOfFieldDepthBlurRadius=False,bOverride_DepthOfFieldDepthBlurAmount=False,bOverride_DepthOfFieldFocalRegion=False,bOverride_DepthOfFieldNearTransitionRegion=False,bOverride_DepthOfFieldFarTransitionRegion=False,bOverride_DepthOfFieldScale=True,bOverride_DepthOfFieldMaxBokehSize=False,bOverride_DepthOfFieldNearBlurSize=False,bOverride_DepthOfFieldFarBlurSize=False,bOverride_DepthOfFieldMethod=True,bOverride_MobileHQGaussian=False,bOverride_DepthOfFieldBokehShape=False,bOverride_DepthOfFieldOcclusion=False,bOverride_DepthOfFieldColorThreshold=False,bOverride_DepthOfFieldSizeThreshold=False,bOverride_DepthOfFieldSkyFocusDistance=False,bOverride_DepthOfFieldVignetteSize=False,bOverride_MotionBlurAmount=False,bOverride_MotionBlurMax=False,bOverride_MotionBlurPerObjectSize=False,bOverride_ScreenPercentage=False,bOverride_ScreenSpaceReflectionIntensity=True,bOverride_ScreenSpaceReflectionQuality=True,bOverride_ScreenSpaceReflectionMaxRoughness=True,bOverride_ScreenSpaceReflectionRoughnessScale=False,WhiteTemp=6700.000000,WhiteTint=0.000000,ColorSaturation=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorContrast=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGamma=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGain=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorOffset=(X=0.005000,Y=0.005000,Z=0.005000,W=0.000000),ColorSaturationShadows=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorContrastShadows=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGammaShadows=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGainShadows=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorOffsetShadows=(X=0.000000,Y=0.000000,Z=0.000000,W=0.000000),ColorCorrectionShadowsMax=0.090000,ColorSaturationMidtones=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorContrastMidtones=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGammaMidtones=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGainMidtones=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorOffsetMidtones=(X=0.000000,Y=0.000000,Z=0.000000,W=0.000000),ColorSaturationHighlights=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorContrastHighlights=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGammaHighlights=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGainHighlights=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorOffsetHighlights=(X=0.000000,Y=0.000000,Z=0.000000,W=0.000000),ColorCorrectionHighlightsMin=0.500000,FilmWhitePoint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),FilmShadowTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),FilmShadowTintBlend=0.500000,FilmShadowTintAmount=0.000000,FilmSaturation=1.000000,FilmChannelMixerRed=(R=1.000000,G=0.000000,B=0.000000,A=1.000000),FilmChannelMixerGreen=(R=0.000000,G=1.000000,B=0.000000,A=1.000000),FilmChannelMixerBlue=(R=0.000000,G=0.000000,B=1.000000,A=1.000000),FilmContrast=0.030000,FilmToeAmount=1.000000,FilmHealAmount=0.180000,FilmDynamicRange=4.000000,FilmSlope=0.880000,FilmToe=0.550000,FilmShoulder=0.260000,FilmBlackClip=0.000000,FilmWhiteClip=0.040000,SceneColorTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),SceneFringeIntensity=0.000000,BloomIntensity=1.000000,BloomThreshold=1.000000,BloomSizeScale=4.000000,Bloom1Size=1.000000,Bloom2Size=4.000000,Bloom3Size=16.000000,Bloom4Size=32.000000,Bloom5Size=64.000000,Bloom6Size=64.000000,Bloom1Tint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),Bloom2Tint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),Bloom3Tint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),Bloom4Tint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),Bloom5Tint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),Bloom6Tint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),BloomDirtMaskIntensity=1.000000,BloomDirtMaskTint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),BloomDirtMask=None,AmbientCubemapTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),AmbientCubemapIntensity=1.000000,AmbientCubemap=None,AutoExposureMethod=AEM_Histogram,AutoExposureLowPercent=80.000000,AutoExposureHighPercent=98.300003,AutoExposureMinBrightness=1.000000,AutoExposureMaxBrightness=1.000000,AutoExposureSpeedUp=3.000000,AutoExposureSpeedDown=1.000000,AutoExposureBias=0.330000,HistogramLogMin=-8.000000,HistogramLogMax=4.000000,LensFlareIntensity=1.000000,LensFlareTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),LensFlareBokehSize=3.000000,LensFlareThreshold=8.000000,LensFlareBokehShape=None,LensFlareTints[0]=(R=1.000000,G=0.800000,B=0.400000,A=0.600000),LensFlareTints[1]=(R=1.000000,G=1.000000,B=0.600000,A=0.530000),LensFlareTints[2]=(R=0.800000,G=0.800000,B=1.000000,A=0.460000),LensFlareTints[3]=(R=0.500000,G=1.000000,B=0.400000,A=0.390000),LensFlareTints[4]=(R=0.500000,G=0.800000,B=1.000000,A=0.310000),LensFlareTints[5]=(R=0.900000,G=1.000000,B=0.800000,A=0.270000),LensFlareTints[6]=(R=1.000000,G=0.800000,B=0.400000,A=0.220000),LensFlareTints[7]=(R=0.900000,G=0.700000,B=0.700000,A=0.150000),VignetteIntensity=0.161468,GrainJitter=0.000000,GrainIntensity=0.000000,AmbientOcclusionIntensity=1.000000,AmbientOcclusionStaticFraction=1.000000,AmbientOcclusionRadius=73.477997,AmbientOcclusionRadiusInWS=False,AmbientOcclusionFadeDistance=8000.000000,AmbientOcclusionFadeRadius=5000.000000,AmbientOcclusionDistance=80.000000,AmbientOcclusionPower=1.200000,AmbientOcclusionBias=3.000000,AmbientOcclusionQuality=100.000000,AmbientOcclusionMipBlend=0.600000,AmbientOcclusionMipScale=1.700000,AmbientOcclusionMipThreshold=0.010000,IndirectLightingColor=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),IndirectLightingIntensity=1.000000,ColorGradingIntensity=0.000000,ColorGradingLUT=Texture2D'/Engine/EditorResources/RGBTable16x1_AssetViewer.RGBTable16x1_AssetViewer',DepthOfFieldMethod=DOFM_BokehDOF,bMobileHQGaussian=False,DepthOfFieldFstop=4.000000,DepthOfFieldSensorWidth=24.576000,DepthOfFieldFocalDistance=1000.000000,DepthOfFieldDepthBlurAmount=1.000000,DepthOfFieldDepthBlurRadius=0.000000,DepthOfFieldFocalRegion=0.000000,DepthOfFieldNearTransitionRegion=300.000000,DepthOfFieldFarTransitionRegion=500.000000,DepthOfFieldScale=0.000000,DepthOfFieldMaxBokehSize=15.000000,DepthOfFieldNearBlurSize=15.000000,DepthOfFieldFarBlurSize=15.000000,DepthOfFieldBokehShape=None,DepthOfFieldOcclusion=0.400000,DepthOfFieldColorThreshold=1.000000,DepthOfFieldSizeThreshold=0.080000,DepthOfFieldSkyFocusDistance=0.000000,DepthOfFieldVignetteSize=200.000000,MotionBlurAmount=0.500000,MotionBlurMax=5.000000,MotionBlurPerObjectSize=0.500000,LPVIntensity=1.000000,LPVVplInjectionBias=0.640000,LPVSize=5312.000000,LPVSecondaryOcclusionIntensity=0.000000,LPVSecondaryBounceIntensity=0.000000,LPVGeometryVolumeBias=0.384000,LPVEmissiveInjectionIntensity=1.000000,LPVDirectionalOcclusionIntensity=0.000000,LPVDirectionalOcclusionRadius=8.000000,LPVDiffuseOcclusionExponent=1.000000,LPVSpecularOcclusionExponent=7.000000,LPVDiffuseOcclusionIntensity=1.000000,LPVSpecularOcclusionIntensity=1.000000,ScreenSpaceReflectionIntensity=100.000000,ScreenSpaceReflectionQuality=100.000000,ScreenSpaceReflectionMaxRoughness=1.000000,ScreenPercentage=100.000000,WeightedBlendables=(Array=),Blendables=),bPostProcessingEnabled=True,LightingRigRotation=109.389069,RotationSpeed=2.000000,DirectionalLightRotation=(Pitch=-39.999985,Yaw=-67.500015,Roll=0.000000))\n+Profiles=(ProfileName=\"Default\",DirectionalLightIntensity=2.620000,DirectionalLightColor=(R=0.990000,G=0.839850,B=0.732600,A=1.000000),SkyLightIntensity=0.880000,bRotateLightingRig=False,bShowEnvironment=True,bShowFloor=True,EnvironmentCubeMapPath=\"/Engine/EditorMaterials/AssetViewer/EpicQuadPanorama_CC+EV1.EpicQuadPanorama_CC+EV1\",PostProcessingSettings=(bOverride_WhiteTemp=True,bOverride_WhiteTint=False,bOverride_ColorSaturation=True,bOverride_ColorContrast=True,bOverride_ColorGamma=True,bOverride_ColorGain=True,bOverride_ColorOffset=True,bOverride_ColorSaturationShadows=False,bOverride_ColorContrastShadows=False,bOverride_ColorGammaShadows=False,bOverride_ColorGainShadows=False,bOverride_ColorOffsetShadows=False,bOverride_ColorSaturationMidtones=False,bOverride_ColorContrastMidtones=False,bOverride_ColorGammaMidtones=False,bOverride_ColorGainMidtones=False,bOverride_ColorOffsetMidtones=False,bOverride_ColorSaturationHighlights=False,bOverride_ColorContrastHighlights=False,bOverride_ColorGammaHighlights=False,bOverride_ColorGainHighlights=False,bOverride_ColorOffsetHighlights=False,bOverride_ColorCorrectionShadowsMax=False,bOverride_ColorCorrectionHighlightsMin=False,bOverride_FilmWhitePoint=False,bOverride_FilmSaturation=False,bOverride_FilmChannelMixerRed=False,bOverride_FilmChannelMixerGreen=False,bOverride_FilmChannelMixerBlue=False,bOverride_FilmContrast=False,bOverride_FilmDynamicRange=False,bOverride_FilmHealAmount=False,bOverride_FilmToeAmount=False,bOverride_FilmShadowTint=False,bOverride_FilmShadowTintBlend=False,bOverride_FilmShadowTintAmount=False,bOverride_FilmSlope=True,bOverride_FilmToe=True,bOverride_FilmShoulder=True,bOverride_FilmBlackClip=True,bOverride_FilmWhiteClip=True,bOverride_SceneColorTint=False,bOverride_SceneFringeIntensity=False,bOverride_AmbientCubemapTint=False,bOverride_AmbientCubemapIntensity=False,bOverride_BloomIntensity=True,bOverride_BloomThreshold=False,bOverride_Bloom1Tint=False,bOverride_Bloom1Size=False,bOverride_Bloom2Size=False,bOverride_Bloom2Tint=False,bOverride_Bloom3Tint=False,bOverride_Bloom3Size=False,bOverride_Bloom4Tint=False,bOverride_Bloom4Size=False,bOverride_Bloom5Tint=False,bOverride_Bloom5Size=False,bOverride_Bloom6Tint=False,bOverride_Bloom6Size=False,bOverride_BloomSizeScale=False,bOverride_BloomDirtMaskIntensity=False,bOverride_BloomDirtMaskTint=False,bOverride_BloomDirtMask=False,bOverride_AutoExposureMethod=True,bOverride_AutoExposureLowPercent=False,bOverride_AutoExposureHighPercent=False,bOverride_AutoExposureMinBrightness=True,bOverride_AutoExposureMaxBrightness=True,bOverride_AutoExposureSpeedUp=False,bOverride_AutoExposureSpeedDown=False,bOverride_AutoExposureBias=True,bOverride_HistogramLogMin=True,bOverride_HistogramLogMax=True,bOverride_LensFlareIntensity=False,bOverride_LensFlareTint=False,bOverride_LensFlareTints=False,bOverride_LensFlareBokehSize=False,bOverride_LensFlareBokehShape=False,bOverride_LensFlareThreshold=False,bOverride_VignetteIntensity=True,bOverride_GrainIntensity=False,bOverride_GrainJitter=False,bOverride_AmbientOcclusionIntensity=True,bOverride_AmbientOcclusionStaticFraction=True,bOverride_AmbientOcclusionRadius=True,bOverride_AmbientOcclusionFadeDistance=False,bOverride_AmbientOcclusionFadeRadius=False,bOverride_AmbientOcclusionDistance=False,bOverride_AmbientOcclusionRadiusInWS=False,bOverride_AmbientOcclusionPower=True,bOverride_AmbientOcclusionBias=True,bOverride_AmbientOcclusionQuality=True,bOverride_AmbientOcclusionMipBlend=True,bOverride_AmbientOcclusionMipScale=True,bOverride_AmbientOcclusionMipThreshold=True,bOverride_LPVIntensity=False,bOverride_LPVDirectionalOcclusionIntensity=False,bOverride_LPVDirectionalOcclusionRadius=False,bOverride_LPVDiffuseOcclusionExponent=False,bOverride_LPVSpecularOcclusionExponent=False,bOverride_LPVDiffuseOcclusionIntensity=False,bOverride_LPVSpecularOcclusionIntensity=False,bOverride_LPVSize=False,bOverride_LPVSecondaryOcclusionIntensity=False,bOverride_LPVSecondaryBounceIntensity=False,bOverride_LPVGeometryVolumeBias=False,bOverride_LPVVplInjectionBias=False,bOverride_LPVEmissiveInjectionIntensity=False,bOverride_IndirectLightingColor=False,bOverride_IndirectLightingIntensity=False,bOverride_ColorGradingIntensity=True,bOverride_ColorGradingLUT=True,bOverride_DepthOfFieldFocalDistance=False,bOverride_DepthOfFieldFstop=False,bOverride_DepthOfFieldSensorWidth=False,bOverride_DepthOfFieldDepthBlurRadius=False,bOverride_DepthOfFieldDepthBlurAmount=False,bOverride_DepthOfFieldFocalRegion=False,bOverride_DepthOfFieldNearTransitionRegion=False,bOverride_DepthOfFieldFarTransitionRegion=False,bOverride_DepthOfFieldScale=True,bOverride_DepthOfFieldMaxBokehSize=False,bOverride_DepthOfFieldNearBlurSize=False,bOverride_DepthOfFieldFarBlurSize=False,bOverride_DepthOfFieldMethod=True,bOverride_MobileHQGaussian=False,bOverride_DepthOfFieldBokehShape=False,bOverride_DepthOfFieldOcclusion=False,bOverride_DepthOfFieldColorThreshold=False,bOverride_DepthOfFieldSizeThreshold=False,bOverride_DepthOfFieldSkyFocusDistance=False,bOverride_DepthOfFieldVignetteSize=False,bOverride_MotionBlurAmount=False,bOverride_MotionBlurMax=False,bOverride_MotionBlurPerObjectSize=False,bOverride_ScreenPercentage=False,bOverride_ScreenSpaceReflectionIntensity=True,bOverride_ScreenSpaceReflectionQuality=True,bOverride_ScreenSpaceReflectionMaxRoughness=True,bOverride_ScreenSpaceReflectionRoughnessScale=False,WhiteTemp=6700.000000,WhiteTint=0.000000,ColorSaturation=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorContrast=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGamma=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGain=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorOffset=(X=0.005000,Y=0.005000,Z=0.005000,W=0.000000),ColorSaturationShadows=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorContrastShadows=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGammaShadows=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGainShadows=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorOffsetShadows=(X=0.000000,Y=0.000000,Z=0.000000,W=0.000000),ColorCorrectionShadowsMax=0.090000,ColorSaturationMidtones=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorContrastMidtones=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGammaMidtones=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGainMidtones=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorOffsetMidtones=(X=0.000000,Y=0.000000,Z=0.000000,W=0.000000),ColorSaturationHighlights=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorContrastHighlights=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGammaHighlights=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGainHighlights=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorOffsetHighlights=(X=0.000000,Y=0.000000,Z=0.000000,W=0.000000),ColorCorrectionHighlightsMin=0.500000,FilmWhitePoint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),FilmShadowTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),FilmShadowTintBlend=0.500000,FilmShadowTintAmount=0.000000,FilmSaturation=1.000000,FilmChannelMixerRed=(R=1.000000,G=0.000000,B=0.000000,A=1.000000),FilmChannelMixerGreen=(R=0.000000,G=1.000000,B=0.000000,A=1.000000),FilmChannelMixerBlue=(R=0.000000,G=0.000000,B=1.000000,A=1.000000),FilmContrast=0.030000,FilmToeAmount=1.000000,FilmHealAmount=0.180000,FilmDynamicRange=4.000000,FilmSlope=0.880000,FilmToe=0.550000,FilmShoulder=0.260000,FilmBlackClip=0.000000,FilmWhiteClip=0.040000,SceneColorTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),SceneFringeIntensity=0.000000,BloomIntensity=1.000000,BloomThreshold=1.000000,BloomSizeScale=4.000000,Bloom1Size=1.000000,Bloom2Size=4.000000,Bloom3Size=16.000000,Bloom4Size=32.000000,Bloom5Size=64.000000,Bloom6Size=64.000000,Bloom1Tint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),Bloom2Tint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),Bloom3Tint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),Bloom4Tint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),Bloom5Tint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),Bloom6Tint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),BloomDirtMaskIntensity=1.000000,BloomDirtMaskTint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),BloomDirtMask=None,AmbientCubemapTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),AmbientCubemapIntensity=1.000000,AmbientCubemap=None,AutoExposureMethod=AEM_Histogram,AutoExposureLowPercent=80.000000,AutoExposureHighPercent=98.300003,AutoExposureMinBrightness=1.000000,AutoExposureMaxBrightness=1.000000,AutoExposureSpeedUp=3.000000,AutoExposureSpeedDown=1.000000,AutoExposureBias=0.330000,HistogramLogMin=-8.000000,HistogramLogMax=4.000000,LensFlareIntensity=1.000000,LensFlareTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),LensFlareBokehSize=3.000000,LensFlareThreshold=8.000000,LensFlareBokehShape=None,LensFlareTints[0]=(R=1.000000,G=0.800000,B=0.400000,A=0.600000),LensFlareTints[1]=(R=1.000000,G=1.000000,B=0.600000,A=0.530000),LensFlareTints[2]=(R=0.800000,G=0.800000,B=1.000000,A=0.460000),LensFlareTints[3]=(R=0.500000,G=1.000000,B=0.400000,A=0.390000),LensFlareTints[4]=(R=0.500000,G=0.800000,B=1.000000,A=0.310000),LensFlareTints[5]=(R=0.900000,G=1.000000,B=0.800000,A=0.270000),LensFlareTints[6]=(R=1.000000,G=0.800000,B=0.400000,A=0.220000),LensFlareTints[7]=(R=0.900000,G=0.700000,B=0.700000,A=0.150000),VignetteIntensity=0.161468,GrainJitter=0.000000,GrainIntensity=0.000000,AmbientOcclusionIntensity=1.000000,AmbientOcclusionStaticFraction=1.000000,AmbientOcclusionRadius=73.477997,AmbientOcclusionRadiusInWS=False,AmbientOcclusionFadeDistance=8000.000000,AmbientOcclusionFadeRadius=5000.000000,AmbientOcclusionDistance=80.000000,AmbientOcclusionPower=1.200000,AmbientOcclusionBias=3.000000,AmbientOcclusionQuality=100.000000,AmbientOcclusionMipBlend=0.600000,AmbientOcclusionMipScale=1.700000,AmbientOcclusionMipThreshold=0.010000,IndirectLightingColor=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),IndirectLightingIntensity=1.000000,ColorGradingIntensity=0.000000,ColorGradingLUT=Texture2D'/Engine/EditorResources/RGBTable16x1_AssetViewer.RGBTable16x1_AssetViewer',DepthOfFieldMethod=DOFM_BokehDOF,bMobileHQGaussian=False,DepthOfFieldFstop=4.000000,DepthOfFieldSensorWidth=24.576000,DepthOfFieldFocalDistance=1000.000000,DepthOfFieldDepthBlurAmount=1.000000,DepthOfFieldDepthBlurRadius=0.000000,DepthOfFieldFocalRegion=0.000000,DepthOfFieldNearTransitionRegion=300.000000,DepthOfFieldFarTransitionRegion=500.000000,DepthOfFieldScale=0.000000,DepthOfFieldMaxBokehSize=15.000000,DepthOfFieldNearBlurSize=15.000000,DepthOfFieldFarBlurSize=15.000000,DepthOfFieldBokehShape=None,DepthOfFieldOcclusion=0.400000,DepthOfFieldColorThreshold=1.000000,DepthOfFieldSizeThreshold=0.080000,DepthOfFieldSkyFocusDistance=0.000000,DepthOfFieldVignetteSize=200.000000,MotionBlurAmount=0.500000,MotionBlurMax=5.000000,MotionBlurPerObjectSize=0.500000,LPVIntensity=1.000000,LPVVplInjectionBias=0.640000,LPVSize=5312.000000,LPVSecondaryOcclusionIntensity=0.000000,LPVSecondaryBounceIntensity=0.000000,LPVGeometryVolumeBias=0.384000,LPVEmissiveInjectionIntensity=1.000000,LPVDirectionalOcclusionIntensity=0.000000,LPVDirectionalOcclusionRadius=8.000000,LPVDiffuseOcclusionExponent=1.000000,LPVSpecularOcclusionExponent=7.000000,LPVDiffuseOcclusionIntensity=1.000000,LPVSpecularOcclusionIntensity=1.000000,ScreenSpaceReflectionIntensity=100.000000,ScreenSpaceReflectionQuality=100.000000,ScreenSpaceReflectionMaxRoughness=1.000000,ScreenPercentage=100.000000,WeightedBlendables=(Array=),Blendables=),bPostProcessingEnabled=True,LightingRigRotation=109.389069,RotationSpeed=2.000000,DirectionalLightRotation=(Pitch=-39.999985,Yaw=-67.500015,Roll=0.000000))\n+Profiles=(ProfileName=\"Profile_0\",DirectionalLightIntensity=1.000000,DirectionalLightColor=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),SkyLightIntensity=1.000000,bRotateLightingRig=False,bShowEnvironment=True,bShowFloor=True,EnvironmentCubeMapPath=\"\",PostProcessingSettings=(bOverride_WhiteTemp=False,bOverride_WhiteTint=False,bOverride_ColorSaturation=False,bOverride_ColorContrast=False,bOverride_ColorGamma=False,bOverride_ColorGain=False,bOverride_ColorOffset=False,bOverride_ColorSaturationShadows=False,bOverride_ColorContrastShadows=False,bOverride_ColorGammaShadows=False,bOverride_ColorGainShadows=False,bOverride_ColorOffsetShadows=False,bOverride_ColorSaturationMidtones=False,bOverride_ColorContrastMidtones=False,bOverride_ColorGammaMidtones=False,bOverride_ColorGainMidtones=False,bOverride_ColorOffsetMidtones=False,bOverride_ColorSaturationHighlights=False,bOverride_ColorContrastHighlights=False,bOverride_ColorGammaHighlights=False,bOverride_ColorGainHighlights=False,bOverride_ColorOffsetHighlights=False,bOverride_ColorCorrectionShadowsMax=False,bOverride_ColorCorrectionHighlightsMin=False,bOverride_FilmWhitePoint=False,bOverride_FilmSaturation=False,bOverride_FilmChannelMixerRed=False,bOverride_FilmChannelMixerGreen=False,bOverride_FilmChannelMixerBlue=False,bOverride_FilmContrast=False,bOverride_FilmDynamicRange=False,bOverride_FilmHealAmount=False,bOverride_FilmToeAmount=False,bOverride_FilmShadowTint=False,bOverride_FilmShadowTintBlend=False,bOverride_FilmShadowTintAmount=False,bOverride_FilmSlope=False,bOverride_FilmToe=False,bOverride_FilmShoulder=False,bOverride_FilmBlackClip=False,bOverride_FilmWhiteClip=False,bOverride_SceneColorTint=False,bOverride_SceneFringeIntensity=False,bOverride_AmbientCubemapTint=False,bOverride_AmbientCubemapIntensity=False,bOverride_BloomIntensity=False,bOverride_BloomThreshold=False,bOverride_Bloom1Tint=False,bOverride_Bloom1Size=False,bOverride_Bloom2Size=False,bOverride_Bloom2Tint=False,bOverride_Bloom3Tint=False,bOverride_Bloom3Size=False,bOverride_Bloom4Tint=False,bOverride_Bloom4Size=False,bOverride_Bloom5Tint=False,bOverride_Bloom5Size=False,bOverride_Bloom6Tint=False,bOverride_Bloom6Size=False,bOverride_BloomSizeScale=False,bOverride_BloomDirtMaskIntensity=False,bOverride_BloomDirtMaskTint=False,bOverride_BloomDirtMask=False,bOverride_AutoExposureMethod=False,bOverride_AutoExposureLowPercent=False,bOverride_AutoExposureHighPercent=False,bOverride_AutoExposureMinBrightness=False,bOverride_AutoExposureMaxBrightness=False,bOverride_AutoExposureSpeedUp=False,bOverride_AutoExposureSpeedDown=False,bOverride_AutoExposureBias=False,bOverride_HistogramLogMin=False,bOverride_HistogramLogMax=False,bOverride_LensFlareIntensity=False,bOverride_LensFlareTint=False,bOverride_LensFlareTints=False,bOverride_LensFlareBokehSize=False,bOverride_LensFlareBokehShape=False,bOverride_LensFlareThreshold=False,bOverride_VignetteIntensity=False,bOverride_GrainIntensity=False,bOverride_GrainJitter=False,bOverride_AmbientOcclusionIntensity=False,bOverride_AmbientOcclusionStaticFraction=False,bOverride_AmbientOcclusionRadius=False,bOverride_AmbientOcclusionFadeDistance=False,bOverride_AmbientOcclusionFadeRadius=False,bOverride_AmbientOcclusionDistance=False,bOverride_AmbientOcclusionRadiusInWS=False,bOverride_AmbientOcclusionPower=False,bOverride_AmbientOcclusionBias=False,bOverride_AmbientOcclusionQuality=False,bOverride_AmbientOcclusionMipBlend=False,bOverride_AmbientOcclusionMipScale=False,bOverride_AmbientOcclusionMipThreshold=False,bOverride_LPVIntensity=False,bOverride_LPVDirectionalOcclusionIntensity=False,bOverride_LPVDirectionalOcclusionRadius=False,bOverride_LPVDiffuseOcclusionExponent=False,bOverride_LPVSpecularOcclusionExponent=False,bOverride_LPVDiffuseOcclusionIntensity=False,bOverride_LPVSpecularOcclusionIntensity=False,bOverride_LPVSize=False,bOverride_LPVSecondaryOcclusionIntensity=False,bOverride_LPVSecondaryBounceIntensity=False,bOverride_LPVGeometryVolumeBias=False,bOverride_LPVVplInjectionBias=False,bOverride_LPVEmissiveInjectionIntensity=False,bOverride_IndirectLightingColor=False,bOverride_IndirectLightingIntensity=False,bOverride_ColorGradingIntensity=False,bOverride_ColorGradingLUT=False,bOverride_DepthOfFieldFocalDistance=False,bOverride_DepthOfFieldFstop=False,bOverride_DepthOfFieldSensorWidth=False,bOverride_DepthOfFieldDepthBlurRadius=False,bOverride_DepthOfFieldDepthBlurAmount=False,bOverride_DepthOfFieldFocalRegion=False,bOverride_DepthOfFieldNearTransitionRegion=False,bOverride_DepthOfFieldFarTransitionRegion=False,bOverride_DepthOfFieldScale=False,bOverride_DepthOfFieldMaxBokehSize=False,bOverride_DepthOfFieldNearBlurSize=False,bOverride_DepthOfFieldFarBlurSize=False,bOverride_DepthOfFieldMethod=False,bOverride_MobileHQGaussian=False,bOverride_DepthOfFieldBokehShape=False,bOverride_DepthOfFieldOcclusion=False,bOverride_DepthOfFieldColorThreshold=False,bOverride_DepthOfFieldSizeThreshold=False,bOverride_DepthOfFieldSkyFocusDistance=False,bOverride_DepthOfFieldVignetteSize=False,bOverride_MotionBlurAmount=False,bOverride_MotionBlurMax=False,bOverride_MotionBlurPerObjectSize=False,bOverride_ScreenPercentage=False,bOverride_ScreenSpaceReflectionIntensity=False,bOverride_ScreenSpaceReflectionQuality=False,bOverride_ScreenSpaceReflectionMaxRoughness=False,bOverride_ScreenSpaceReflectionRoughnessScale=False,WhiteTemp=6500.000000,WhiteTint=0.000000,ColorSaturation=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorContrast=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGamma=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGain=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorOffset=(X=0.000000,Y=0.000000,Z=0.000000,W=0.000000),ColorSaturationShadows=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorContrastShadows=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGammaShadows=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGainShadows=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorOffsetShadows=(X=0.000000,Y=0.000000,Z=0.000000,W=0.000000),ColorCorrectionShadowsMax=0.090000,ColorSaturationMidtones=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorContrastMidtones=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGammaMidtones=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGainMidtones=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorOffsetMidtones=(X=0.000000,Y=0.000000,Z=0.000000,W=0.000000),ColorSaturationHighlights=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorContrastHighlights=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGammaHighlights=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGainHighlights=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorOffsetHighlights=(X=0.000000,Y=0.000000,Z=0.000000,W=0.000000),ColorCorrectionHighlightsMin=0.500000,FilmWhitePoint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),FilmShadowTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),FilmShadowTintBlend=0.500000,FilmShadowTintAmount=0.000000,FilmSaturation=1.000000,FilmChannelMixerRed=(R=1.000000,G=0.000000,B=0.000000,A=1.000000),FilmChannelMixerGreen=(R=0.000000,G=1.000000,B=0.000000,A=1.000000),FilmChannelMixerBlue=(R=0.000000,G=0.000000,B=1.000000,A=1.000000),FilmContrast=0.030000,FilmToeAmount=1.000000,FilmHealAmount=0.180000,FilmDynamicRange=4.000000,FilmSlope=0.880000,FilmToe=0.550000,FilmShoulder=0.260000,FilmBlackClip=0.000000,FilmWhiteClip=0.040000,SceneColorTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),SceneFringeIntensity=0.000000,BloomIntensity=1.000000,BloomThreshold=1.000000,BloomSizeScale=4.000000,Bloom1Size=1.000000,Bloom2Size=4.000000,Bloom3Size=16.000000,Bloom4Size=32.000000,Bloom5Size=64.000000,Bloom6Size=64.000000,Bloom1Tint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),Bloom2Tint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),Bloom3Tint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),Bloom4Tint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),Bloom5Tint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),Bloom6Tint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),BloomDirtMaskIntensity=1.000000,BloomDirtMaskTint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),BloomDirtMask=None,AmbientCubemapTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),AmbientCubemapIntensity=1.000000,AmbientCubemap=None,AutoExposureMethod=AEM_Histogram,AutoExposureLowPercent=80.000000,AutoExposureHighPercent=98.300003,AutoExposureMinBrightness=0.030000,AutoExposureMaxBrightness=2.000000,AutoExposureSpeedUp=3.000000,AutoExposureSpeedDown=1.000000,AutoExposureBias=0.000000,HistogramLogMin=-8.000000,HistogramLogMax=4.000000,LensFlareIntensity=1.000000,LensFlareTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),LensFlareBokehSize=3.000000,LensFlareThreshold=8.000000,LensFlareBokehShape=None,LensFlareTints[0]=(R=1.000000,G=0.800000,B=0.400000,A=0.600000),LensFlareTints[1]=(R=1.000000,G=1.000000,B=0.600000,A=0.530000),LensFlareTints[2]=(R=0.800000,G=0.800000,B=1.000000,A=0.460000),LensFlareTints[3]=(R=0.500000,G=1.000000,B=0.400000,A=0.390000),LensFlareTints[4]=(R=0.500000,G=0.800000,B=1.000000,A=0.310000),LensFlareTints[5]=(R=0.900000,G=1.000000,B=0.800000,A=0.270000),LensFlareTints[6]=(R=1.000000,G=0.800000,B=0.400000,A=0.220000),LensFlareTints[7]=(R=0.900000,G=0.700000,B=0.700000,A=0.150000),VignetteIntensity=0.400000,GrainJitter=0.000000,GrainIntensity=0.000000,AmbientOcclusionIntensity=0.500000,AmbientOcclusionStaticFraction=1.000000,AmbientOcclusionRadius=200.000000,AmbientOcclusionRadiusInWS=False,AmbientOcclusionFadeDistance=8000.000000,AmbientOcclusionFadeRadius=5000.000000,AmbientOcclusionDistance=80.000000,AmbientOcclusionPower=2.000000,AmbientOcclusionBias=3.000000,AmbientOcclusionQuality=50.000000,AmbientOcclusionMipBlend=0.600000,AmbientOcclusionMipScale=1.700000,AmbientOcclusionMipThreshold=0.010000,IndirectLightingColor=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),IndirectLightingIntensity=1.000000,ColorGradingIntensity=1.000000,ColorGradingLUT=None,DepthOfFieldMethod=DOFM_BokehDOF,bMobileHQGaussian=False,DepthOfFieldFstop=4.000000,DepthOfFieldSensorWidth=24.576000,DepthOfFieldFocalDistance=1000.000000,DepthOfFieldDepthBlurAmount=1.000000,DepthOfFieldDepthBlurRadius=0.000000,DepthOfFieldFocalRegion=0.000000,DepthOfFieldNearTransitionRegion=300.000000,DepthOfFieldFarTransitionRegion=500.000000,DepthOfFieldScale=0.000000,DepthOfFieldMaxBokehSize=15.000000,DepthOfFieldNearBlurSize=15.000000,DepthOfFieldFarBlurSize=15.000000,DepthOfFieldBokehShape=None,DepthOfFieldOcclusion=0.400000,DepthOfFieldColorThreshold=1.000000,DepthOfFieldSizeThreshold=0.080000,DepthOfFieldSkyFocusDistance=0.000000,DepthOfFieldVignetteSize=200.000000,MotionBlurAmount=0.500000,MotionBlurMax=5.000000,MotionBlurPerObjectSize=0.500000,LPVIntensity=1.000000,LPVVplInjectionBias=0.640000,LPVSize=5312.000000,LPVSecondaryOcclusionIntensity=0.000000,LPVSecondaryBounceIntensity=0.000000,LPVGeometryVolumeBias=0.384000,LPVEmissiveInjectionIntensity=1.000000,LPVDirectionalOcclusionIntensity=0.000000,LPVDirectionalOcclusionRadius=8.000000,LPVDiffuseOcclusionExponent=1.000000,LPVSpecularOcclusionExponent=7.000000,LPVDiffuseOcclusionIntensity=1.000000,LPVSpecularOcclusionIntensity=1.000000,ScreenSpaceReflectionIntensity=100.000000,ScreenSpaceReflectionQuality=50.000000,ScreenSpaceReflectionMaxRoughness=0.600000,ScreenPercentage=100.000000,WeightedBlendables=(Array=),Blendables=),bPostProcessingEnabled=True,LightingRigRotation=0.000000,RotationSpeed=2.000000,DirectionalLightRotation=(Pitch=-40.000000,Yaw=-67.500000,Roll=0.000000))\n\n[/Script/UMGEditor.UMGEditorProjectSettings]\nbCookSlowConstructionWidgetTree=True\n-DebugResolutions=(Width=3840,Height=2160,Description=\"\",Color=(R=0.745404,G=0.904661,B=1.000000,A=1.000000))\n-DebugResolutions=(Width=3440,Height=1440,Description=\"\",Color=(R=0.439657,G=0.783538,B=0.982251,A=1.000000))\n-DebugResolutions=(Width=2560,Height=1440,Description=\"\",Color=(R=0.208637,G=0.644480,B=0.973445,A=1.000000))\n-DebugResolutions=(Width=1440,Height=2560,Description=\"\",Color=(R=0.215861,G=0.651406,B=0.973445,A=1.000000))\n-DebugResolutions=(Width=2560,Height=1080,Description=\"\",Color=(R=0.064803,G=0.539479,B=0.955973,A=1.000000))\n-DebugResolutions=(Width=2048,Height=1536,Description=\"\",Color=(R=0.009134,G=0.462077,B=0.947307,A=1.000000))\n-DebugResolutions=(Width=1536,Height=2048,Description=\"\",Color=(R=0.009134,G=0.462077,B=0.947307,A=1.000000))\n-DebugResolutions=(Width=1920,Height=1080,Description=\"\",Color=(R=0.000000,G=0.386429,B=0.930111,A=1.000000))\n-DebugResolutions=(Width=1080,Height=1920,Description=\"\",Color=(R=0.000000,G=0.386429,B=0.930111,A=1.000000))\n-DebugResolutions=(Width=1280,Height=720,Description=\"\",Color=(R=0.000000,G=0.318547,B=0.806952,A=1.000000))\n-DebugResolutions=(Width=720,Height=1280,Description=\"\",Color=(R=0.000000,G=0.318547,B=0.806952,A=1.000000))\n-DebugResolutions=(Width=1136,Height=640,Description=\"\",Color=(R=0.000000,G=0.238398,B=0.658375,A=1.000000))\n-DebugResolutions=(Width=640,Height=1136,Description=\"\",Color=(R=0.000000,G=0.238398,B=0.658375,A=1.000000))\n+DebugResolutions=(Width=3840,Height=2160,Description=\"16:9\",Color=(R=0.745404,G=0.904661,B=1.000000,A=1.000000))\n+DebugResolutions=(Width=3440,Height=1440,Description=\"\",Color=(R=0.439657,G=0.783538,B=0.982251,A=1.000000))\n+DebugResolutions=(Width=2560,Height=1440,Description=\"\",Color=(R=0.208637,G=0.644480,B=0.973445,A=1.000000))\n+DebugResolutions=(Width=1440,Height=2560,Description=\"\",Color=(R=0.215861,G=0.651406,B=0.973445,A=1.000000))\n+DebugResolutions=(Width=2560,Height=1080,Description=\"\",Color=(R=0.064803,G=0.539479,B=0.955973,A=1.000000))\n+DebugResolutions=(Width=2048,Height=1536,Description=\"\",Color=(R=0.009134,G=0.462077,B=0.947307,A=1.000000))\n+DebugResolutions=(Width=1536,Height=2048,Description=\"\",Color=(R=0.009134,G=0.462077,B=0.947307,A=1.000000))\n+DebugResolutions=(Width=1920,Height=1080,Description=\"16:9\",Color=(R=0.000000,G=0.386429,B=0.930111,A=1.000000))\n+DebugResolutions=(Width=1080,Height=1920,Description=\"\",Color=(R=0.000000,G=0.386429,B=0.930111,A=1.000000))\n+DebugResolutions=(Width=1280,Height=720,Description=\"16:9\",Color=(R=0.000000,G=0.318547,B=0.806952,A=1.000000))\n+DebugResolutions=(Width=720,Height=1280,Description=\"\",Color=(R=0.000000,G=0.318547,B=0.806952,A=1.000000))\n+DebugResolutions=(Width=1136,Height=640,Description=\"16:9\",Color=(R=0.000000,G=0.238398,B=0.658375,A=1.000000))\n+DebugResolutions=(Width=640,Height=1136,Description=\"\",Color=(R=0.000000,G=0.238398,B=0.658375,A=1.000000))\n+DebugResolutions=(Width=1024,Height=768,Description=\"4:3\",Color=(R=1.000000,G=0.000000,B=0.000000,A=0.000000))\nbShowWidgetsFromEngineContent=False\nbShowWidgetsFromDeveloperContent=True\n\n[/Script/Localization.LocalizationSettings]\n-EngineTargetsSettings=(Name=\"Engine\",Guid=33482D004789784C9DA695A682ACCA1B,TargetDependencies=,AdditionalManifestDependencies=,RequiredModuleNames=,GatherFromTextFiles=(IsEnabled=True,SearchDirectories=((Path=\"Source/Runtime/\"),(Path=\"Source/Developer/\"),(Path=\"Config/\")),ExcludePathWildcards=((Pattern=\"Source/Developer/NoRedist/CommunityPortalServices/*\"),(Pattern=\"Source/Developer/NoRedist/UnrealEngineLauncherServices/*\"),(Pattern=\"Source/Developer/NoRedist/BuildPatchServices/*\")),FileExtensions=((Pattern=\"cpp\"),(Pattern=\"h\"),(Pattern=\"c\"),(Pattern=\"inl\"),(Pattern=\"mm\"),(Pattern=\"ini\"))),GatherFromPackages=(IsEnabled=True,IncludePathWildcards=((Pattern=\"Content/*\")),ExcludePathWildcards=((Pattern=\"Content/Editor/*\"),(Pattern=\"Content/Tutorial/*\"),(Pattern=\"Content/Developers/*\"),(Pattern=\"Content/TestPackages/*\"),(Pattern=\"Content/QA_Assets/*\"),(Pattern=\"Content/Maps/Automation/*\"),(Pattern=\"Content/EngineSounds/*\")),FileExtensions=((Pattern=\"umap\"),(Pattern=\"uasset\")),ShouldGatherFromEditorOnlyData=True),GatherFromMetaData=(IsEnabled=False,IncludePathWildcards=,ExcludePathWildcards=,KeySpecifications=,ShouldGatherFromEditorOnlyData=True),NativeCultureIndex=0,SupportedCulturesStatistics=((CultureName=\"en\"),(CultureName=\"es\"),(CultureName=\"ja\"),(CultureName=\"ko\"),(CultureName=\"pt-BR\"),(CultureName=\"zh-CN\")))\n-EngineTargetsSettings=(Name=\"Editor\",Guid=AC8BFD2A41A2FB2893BB8EA0AF903E6D,TargetDependencies=(33482D004789784C9DA695A682ACCA1B),AdditionalManifestDependencies=,RequiredModuleNames=,GatherFromTextFiles=(IsEnabled=True,SearchDirectories=((Path=\"Source/Editor/\")),ExcludePathWildcards=,FileExtensions=((Pattern=\"cpp\"),(Pattern=\"h\"),(Pattern=\"c\"),(Pattern=\"inl\"),(Pattern=\"mm\"))),GatherFromPackages=(IsEnabled=True,IncludePathWildcards=((Pattern=\"Content/Editor/*\"),(Pattern=\"Content/Editor*\")),ExcludePathWildcards=,FileExtensions=((Pattern=\"umap\"),(Pattern=\"uasset\")),ShouldGatherFromEditorOnlyData=True),GatherFromMetaData=(IsEnabled=False,IncludePathWildcards=,ExcludePathWildcards=,KeySpecifications=,ShouldGatherFromEditorOnlyData=True),NativeCultureIndex=0,SupportedCulturesStatistics=((CultureName=\"en\"),(CultureName=\"es\"),(CultureName=\"ja\"),(CultureName=\"ko\"),(CultureName=\"pt-BR\"),(CultureName=\"zh-CN\")))\n-EngineTargetsSettings=(Name=\"EditorTutorials\",Guid=00F8E3AD47F0A73D50D46881C14DF28F,TargetDependencies=(33482D004789784C9DA695A682ACCA1B,AC8BFD2A41A2FB2893BB8EA0AF903E6D),AdditionalManifestDependencies=,RequiredModuleNames=(\"IntroTutorials\"),GatherFromTextFiles=(IsEnabled=False,SearchDirectories=,ExcludePathWildcards=,FileExtensions=((Pattern=\"h\"),(Pattern=\"cpp\"),(Pattern=\"ini\"))),GatherFromPackages=(IsEnabled=True,IncludePathWildcards=((Pattern=\"Content/Tutorial/*\")),ExcludePathWildcards=,FileExtensions=((Pattern=\"umap\"),(Pattern=\"uasset\")),ShouldGatherFromEditorOnlyData=True),GatherFromMetaData=(IsEnabled=False,IncludePathWildcards=,ExcludePathWildcards=,KeySpecifications=,ShouldGatherFromEditorOnlyData=True),NativeCultureIndex=0,SupportedCulturesStatistics=((CultureName=\"en\"),(CultureName=\"es\"),(CultureName=\"ja\"),(CultureName=\"ko\"),(CultureName=\"pt-BR\"),(CultureName=\"zh-CN\")))\n-EngineTargetsSettings=(Name=\"PropertyNames\",Guid=E391A8B149980E8154E056AF2DA49479,TargetDependencies=(33482D004789784C9DA695A682ACCA1B,AC8BFD2A41A2FB2893BB8EA0AF903E6D),AdditionalManifestDependencies=,RequiredModuleNames=,GatherFromTextFiles=(IsEnabled=False,SearchDirectories=,ExcludePathWildcards=,FileExtensions=((Pattern=\"h\"),(Pattern=\"cpp\"),(Pattern=\"ini\"))),GatherFromPackages=(IsEnabled=False,IncludePathWildcards=,ExcludePathWildcards=,FileExtensions=((Pattern=\"umap\"),(Pattern=\"uasset\")),ShouldGatherFromEditorOnlyData=True),GatherFromMetaData=(IsEnabled=True,IncludePathWildcards=((Pattern=\"Source/Editor/*\"),(Pattern=\"Source/Runtime/*\"),(Pattern=\"Source/Developer/*\")),ExcludePathWildcards=((Pattern=\"Source/Developer/NoRedist/CommunityPortalServices/*\")),KeySpecifications=((MetaDataKey=(Name=\"DisplayName\"),TextNamespace=\"UObjectDisplayNames\",TextKeyPattern=(Pattern=\"{FieldPath}\"))),ShouldGatherFromEditorOnlyData=True),NativeCultureIndex=0,SupportedCulturesStatistics=((CultureName=\"en\"),(CultureName=\"es\"),(CultureName=\"ja\"),(CultureName=\"ko\"),(CultureName=\"pt-BR\"),(CultureName=\"zh-CN\")))\n-EngineTargetsSettings=(Name=\"ToolTips\",Guid=0F116534468918AEA432DD8C77703BA8,TargetDependencies=(33482D004789784C9DA695A682ACCA1B,AC8BFD2A41A2FB2893BB8EA0AF903E6D),AdditionalManifestDependencies=,RequiredModuleNames=,GatherFromTextFiles=(IsEnabled=False,SearchDirectories=,ExcludePathWildcards=,FileExtensions=((Pattern=\"h\"),(Pattern=\"cpp\"),(Pattern=\"ini\"))),GatherFromPackages=(IsEnabled=False,IncludePathWildcards=,ExcludePathWildcards=,FileExtensions=((Pattern=\"umap\"),(Pattern=\"uasset\")),ShouldGatherFromEditorOnlyData=True),GatherFromMetaData=(IsEnabled=True,IncludePathWildcards=((Pattern=\"Source/Editor/*\"),(Pattern=\"Source/Runtime/*\"),(Pattern=\"Source/Developer/*\")),ExcludePathWildcards=((Pattern=\"Source/Developer/NoRedist/CommunityPortalServices/*\")),KeySpecifications=((MetaDataKey=(Name=\"ToolTip\"),TextNamespace=\"UObjectToolTips\",TextKeyPattern=(Pattern=\"{FieldPath}\")),(MetaDataKey=(Name=\"ShortToolTip\"),TextNamespace=\"UObjectShortToolTips\",TextKeyPattern=(Pattern=\"{FieldPath}\"))),ShouldGatherFromEditorOnlyData=True),NativeCultureIndex=0,SupportedCulturesStatistics=((CultureName=\"en\"),(CultureName=\"es\"),(CultureName=\"ja\"),(CultureName=\"ko\"),(CultureName=\"pt-BR\"),(CultureName=\"zh-CN\")))\n-EngineTargetsSettings=(Name=\"Keywords\",Guid=AE89AECB47475F420D0D69A5547515DC,TargetDependencies=(33482D004789784C9DA695A682ACCA1B,AC8BFD2A41A2FB2893BB8EA0AF903E6D),AdditionalManifestDependencies=,RequiredModuleNames=,GatherFromTextFiles=(IsEnabled=False,SearchDirectories=,ExcludePathWildcards=,FileExtensions=((Pattern=\"h\"),(Pattern=\"cpp\"),(Pattern=\"ini\"))),GatherFromPackages=(IsEnabled=False,IncludePathWildcards=,ExcludePathWildcards=,FileExtensions=((Pattern=\"umap\"),(Pattern=\"uasset\")),ShouldGatherFromEditorOnlyData=True),GatherFromMetaData=(IsEnabled=True,IncludePathWildcards=((Pattern=\"Source/Editor/*\"),(Pattern=\"Source/Runtime/*\"),(Pattern=\"Source/Developer/*\")),ExcludePathWildcards=((Pattern=\"Source/Developer/NoRedist/CommunityPortalServices/*\")),KeySpecifications=((MetaDataKey=(Name=\"Keywords\"),TextNamespace=\"UObjectKeywords\",TextKeyPattern=(Pattern=\"{FieldPath}\"))),ShouldGatherFromEditorOnlyData=True),NativeCultureIndex=0,SupportedCulturesStatistics=((CultureName=\"en\"),(CultureName=\"es\"),(CultureName=\"ja\"),(CultureName=\"ko\"),(CultureName=\"pt-BR\"),(CultureName=\"zh-CN\")))\n-EngineTargetsSettings=(Name=\"Category\",Guid=14B8DEE642A6A7AFEB5A28B959EC373A,TargetDependencies=,AdditionalManifestDependencies=,RequiredModuleNames=,GatherFromTextFiles=(IsEnabled=False,SearchDirectories=,ExcludePathWildcards=,FileExtensions=((Pattern=\"h\"),(Pattern=\"cpp\"),(Pattern=\"ini\"))),GatherFromPackages=(IsEnabled=False,IncludePathWildcards=,ExcludePathWildcards=,FileExtensions=((Pattern=\"umap\"),(Pattern=\"uasset\")),ShouldGatherFromEditorOnlyData=False),GatherFromMetaData=(IsEnabled=True,IncludePathWildcards=((Pattern=\"Source/Editor/*\"),(Pattern=\"Source/Runtime/*\"),(Pattern=\"Source/Developer/*\")),ExcludePathWildcards=((Pattern=\"Source/Developer/NoRedist/CommunityPortalServices/*\")),KeySpecifications=((MetaDataKey=(Name=\"Category\"),TextNamespace=\"UObjectCategory\",TextKeyPattern=(Pattern=\"{FieldPath}\"))),ShouldGatherFromEditorOnlyData=True),NativeCultureIndex=0,SupportedCulturesStatistics=((CultureName=\"en\"),(CultureName=\"es\"),(CultureName=\"ja\"),(CultureName=\"ko\"),(CultureName=\"pt-BR\"),(CultureName=\"zh-CN\")))\n+EngineTargetsSettings=(Name=\"Engine\",Guid=33482D004789784C9DA695A682ACCA1B,TargetDependencies=,AdditionalManifestDependencies=,RequiredModuleNames=,GatherFromTextFiles=(IsEnabled=True,SearchDirectories=((Path=\"Source/Runtime/\"),(Path=\"Source/Developer/\"),(Path=\"Config/\")),ExcludePathWildcards=((Pattern=\"Source/Developer/NoRedist/CommunityPortalServices/*\"),(Pattern=\"Source/Developer/NoRedist/UnrealEngineLauncherServices/*\"),(Pattern=\"Source/Developer/NoRedist/BuildPatchServices/*\")),FileExtensions=((Pattern=\"cpp\"),(Pattern=\"h\"),(Pattern=\"c\"),(Pattern=\"inl\"),(Pattern=\"mm\"),(Pattern=\"ini\")),ShouldGatherFromEditorOnlyData=False),GatherFromPackages=(IsEnabled=True,IncludePathWildcards=((Pattern=\"Content/*\")),ExcludePathWildcards=((Pattern=\"Content/Editor/*\"),(Pattern=\"Content/Tutorial/*\"),(Pattern=\"Content/Developers/*\"),(Pattern=\"Content/TestPackages/*\"),(Pattern=\"Content/QA_Assets/*\"),(Pattern=\"Content/Maps/Automation/*\"),(Pattern=\"Content/EngineSounds/*\")),FileExtensions=((Pattern=\"umap\"),(Pattern=\"uasset\")),Collections=,ShouldGatherFromEditorOnlyData=True,SkipGatherCache=False),GatherFromMetaData=(IsEnabled=False,IncludePathWildcards=,ExcludePathWildcards=,KeySpecifications=,ShouldGatherFromEditorOnlyData=True),ExportSettings=(CollapseMode=IdenticalTextIdAndSource,ShouldPersistCommentsOnExport=False,ShouldAddSourceLocationsAsComments=True),CompileSettings=(SkipSourceCheck=False),ImportDialogueSettings=(RawAudioPath=(Path=\"\"),ImportedDialogueFolder=\"ImportedDialogue\",bImportNativeAsSource=False),NativeCultureIndex=0,SupportedCulturesStatistics=((CultureName=\"en\"),(CultureName=\"es\"),(CultureName=\"ja\"),(CultureName=\"ko\"),(CultureName=\"pt-BR\"),(CultureName=\"zh-CN\")))\n+EngineTargetsSettings=(Name=\"Editor\",Guid=AC8BFD2A41A2FB2893BB8EA0AF903E6D,TargetDependencies=(33482D004789784C9DA695A682ACCA1B),AdditionalManifestDependencies=,RequiredModuleNames=,GatherFromTextFiles=(IsEnabled=True,SearchDirectories=((Path=\"Source/Editor/\")),ExcludePathWildcards=,FileExtensions=((Pattern=\"cpp\"),(Pattern=\"h\"),(Pattern=\"c\"),(Pattern=\"inl\"),(Pattern=\"mm\")),ShouldGatherFromEditorOnlyData=False),GatherFromPackages=(IsEnabled=True,IncludePathWildcards=((Pattern=\"Content/Editor/*\"),(Pattern=\"Content/Editor*\")),ExcludePathWildcards=,FileExtensions=((Pattern=\"umap\"),(Pattern=\"uasset\")),Collections=,ShouldGatherFromEditorOnlyData=True,SkipGatherCache=False),GatherFromMetaData=(IsEnabled=False,IncludePathWildcards=,ExcludePathWildcards=,KeySpecifications=,ShouldGatherFromEditorOnlyData=True),ExportSettings=(CollapseMode=IdenticalTextIdAndSource,ShouldPersistCommentsOnExport=False,ShouldAddSourceLocationsAsComments=True),CompileSettings=(SkipSourceCheck=False),ImportDialogueSettings=(RawAudioPath=(Path=\"\"),ImportedDialogueFolder=\"ImportedDialogue\",bImportNativeAsSource=False),NativeCultureIndex=0,SupportedCulturesStatistics=((CultureName=\"en\"),(CultureName=\"es\"),(CultureName=\"ja\"),(CultureName=\"ko\"),(CultureName=\"pt-BR\"),(CultureName=\"zh-CN\")))\n+EngineTargetsSettings=(Name=\"EditorTutorials\",Guid=00F8E3AD47F0A73D50D46881C14DF28F,TargetDependencies=(33482D004789784C9DA695A682ACCA1B,AC8BFD2A41A2FB2893BB8EA0AF903E6D),AdditionalManifestDependencies=,RequiredModuleNames=(\"IntroTutorials\"),GatherFromTextFiles=(IsEnabled=False,SearchDirectories=,ExcludePathWildcards=,FileExtensions=((Pattern=\"h\"),(Pattern=\"cpp\"),(Pattern=\"ini\")),ShouldGatherFromEditorOnlyData=False),GatherFromPackages=(IsEnabled=True,IncludePathWildcards=((Pattern=\"Content/Tutorial/*\")),ExcludePathWildcards=,FileExtensions=((Pattern=\"umap\"),(Pattern=\"uasset\")),Collections=,ShouldGatherFromEditorOnlyData=True,SkipGatherCache=False),GatherFromMetaData=(IsEnabled=False,IncludePathWildcards=,ExcludePathWildcards=,KeySpecifications=,ShouldGatherFromEditorOnlyData=True),ExportSettings=(CollapseMode=IdenticalTextIdAndSource,ShouldPersistCommentsOnExport=False,ShouldAddSourceLocationsAsComments=True),CompileSettings=(SkipSourceCheck=False),ImportDialogueSettings=(RawAudioPath=(Path=\"\"),ImportedDialogueFolder=\"ImportedDialogue\",bImportNativeAsSource=False),NativeCultureIndex=0,SupportedCulturesStatistics=((CultureName=\"en\"),(CultureName=\"es\"),(CultureName=\"ja\"),(CultureName=\"ko\"),(CultureName=\"pt-BR\"),(CultureName=\"zh-CN\")))\n+EngineTargetsSettings=(Name=\"PropertyNames\",Guid=E391A8B149980E8154E056AF2DA49479,TargetDependencies=(33482D004789784C9DA695A682ACCA1B,AC8BFD2A41A2FB2893BB8EA0AF903E6D),AdditionalManifestDependencies=,RequiredModuleNames=,GatherFromTextFiles=(IsEnabled=False,SearchDirectories=,ExcludePathWildcards=,FileExtensions=((Pattern=\"h\"),(Pattern=\"cpp\"),(Pattern=\"ini\")),ShouldGatherFromEditorOnlyData=False),GatherFromPackages=(IsEnabled=False,IncludePathWildcards=,ExcludePathWildcards=,FileExtensions=((Pattern=\"umap\"),(Pattern=\"uasset\")),Collections=,ShouldGatherFromEditorOnlyData=True,SkipGatherCache=False),GatherFromMetaData=(IsEnabled=True,IncludePathWildcards=((Pattern=\"Source/Editor/*\"),(Pattern=\"Source/Runtime/*\"),(Pattern=\"Source/Developer/*\")),ExcludePathWildcards=((Pattern=\"Source/Developer/NoRedist/CommunityPortalServices/*\")),KeySpecifications=((MetaDataKey=(Name=\"DisplayName\"),TextNamespace=\"UObjectDisplayNames\",TextKeyPattern=(Pattern=\"{FieldPath}\"))),ShouldGatherFromEditorOnlyData=True),ExportSettings=(CollapseMode=IdenticalTextIdAndSource,ShouldPersistCommentsOnExport=False,ShouldAddSourceLocationsAsComments=True),CompileSettings=(SkipSourceCheck=False),ImportDialogueSettings=(RawAudioPath=(Path=\"\"),ImportedDialogueFolder=\"ImportedDialogue\",bImportNativeAsSource=False),NativeCultureIndex=0,SupportedCulturesStatistics=((CultureName=\"en\"),(CultureName=\"es\"),(CultureName=\"ja\"),(CultureName=\"ko\"),(CultureName=\"pt-BR\"),(CultureName=\"zh-CN\")))\n+EngineTargetsSettings=(Name=\"ToolTips\",Guid=0F116534468918AEA432DD8C77703BA8,TargetDependencies=(33482D004789784C9DA695A682ACCA1B,AC8BFD2A41A2FB2893BB8EA0AF903E6D),AdditionalManifestDependencies=,RequiredModuleNames=,GatherFromTextFiles=(IsEnabled=False,SearchDirectories=,ExcludePathWildcards=,FileExtensions=((Pattern=\"h\"),(Pattern=\"cpp\"),(Pattern=\"ini\")),ShouldGatherFromEditorOnlyData=False),GatherFromPackages=(IsEnabled=False,IncludePathWildcards=,ExcludePathWildcards=,FileExtensions=((Pattern=\"umap\"),(Pattern=\"uasset\")),Collections=,ShouldGatherFromEditorOnlyData=True,SkipGatherCache=False),GatherFromMetaData=(IsEnabled=True,IncludePathWildcards=((Pattern=\"Source/Editor/*\"),(Pattern=\"Source/Runtime/*\"),(Pattern=\"Source/Developer/*\")),ExcludePathWildcards=((Pattern=\"Source/Developer/NoRedist/CommunityPortalServices/*\")),KeySpecifications=((MetaDataKey=(Name=\"ToolTip\"),TextNamespace=\"UObjectToolTips\",TextKeyPattern=(Pattern=\"{FieldPath}\")),(MetaDataKey=(Name=\"ShortToolTip\"),TextNamespace=\"UObjectShortToolTips\",TextKeyPattern=(Pattern=\"{FieldPath}\"))),ShouldGatherFromEditorOnlyData=True),ExportSettings=(CollapseMode=IdenticalTextIdAndSource,ShouldPersistCommentsOnExport=False,ShouldAddSourceLocationsAsComments=True),CompileSettings=(SkipSourceCheck=False),ImportDialogueSettings=(RawAudioPath=(Path=\"\"),ImportedDialogueFolder=\"ImportedDialogue\",bImportNativeAsSource=False),NativeCultureIndex=0,SupportedCulturesStatistics=((CultureName=\"en\"),(CultureName=\"es\"),(CultureName=\"ja\"),(CultureName=\"ko\"),(CultureName=\"pt-BR\"),(CultureName=\"zh-CN\")))\n+EngineTargetsSettings=(Name=\"Keywords\",Guid=AE89AECB47475F420D0D69A5547515DC,TargetDependencies=(33482D004789784C9DA695A682ACCA1B,AC8BFD2A41A2FB2893BB8EA0AF903E6D),AdditionalManifestDependencies=,RequiredModuleNames=,GatherFromTextFiles=(IsEnabled=False,SearchDirectories=,ExcludePathWildcards=,FileExtensions=((Pattern=\"h\"),(Pattern=\"cpp\"),(Pattern=\"ini\")),ShouldGatherFromEditorOnlyData=False),GatherFromPackages=(IsEnabled=False,IncludePathWildcards=,ExcludePathWildcards=,FileExtensions=((Pattern=\"umap\"),(Pattern=\"uasset\")),Collections=,ShouldGatherFromEditorOnlyData=True,SkipGatherCache=False),GatherFromMetaData=(IsEnabled=True,IncludePathWildcards=((Pattern=\"Source/Editor/*\"),(Pattern=\"Source/Runtime/*\"),(Pattern=\"Source/Developer/*\")),ExcludePathWildcards=((Pattern=\"Source/Developer/NoRedist/CommunityPortalServices/*\")),KeySpecifications=((MetaDataKey=(Name=\"Keywords\"),TextNamespace=\"UObjectKeywords\",TextKeyPattern=(Pattern=\"{FieldPath}\"))),ShouldGatherFromEditorOnlyData=True),ExportSettings=(CollapseMode=IdenticalTextIdAndSource,ShouldPersistCommentsOnExport=False,ShouldAddSourceLocationsAsComments=True),CompileSettings=(SkipSourceCheck=False),ImportDialogueSettings=(RawAudioPath=(Path=\"\"),ImportedDialogueFolder=\"ImportedDialogue\",bImportNativeAsSource=False),NativeCultureIndex=0,SupportedCulturesStatistics=((CultureName=\"en\"),(CultureName=\"es\"),(CultureName=\"ja\"),(CultureName=\"ko\"),(CultureName=\"pt-BR\"),(CultureName=\"zh-CN\")))\n+EngineTargetsSettings=(Name=\"Category\",Guid=14B8DEE642A6A7AFEB5A28B959EC373A,TargetDependencies=,AdditionalManifestDependencies=,RequiredModuleNames=,GatherFromTextFiles=(IsEnabled=False,SearchDirectories=,ExcludePathWildcards=,FileExtensions=((Pattern=\"h\"),(Pattern=\"cpp\"),(Pattern=\"ini\")),ShouldGatherFromEditorOnlyData=False),GatherFromPackages=(IsEnabled=False,IncludePathWildcards=,ExcludePathWildcards=,FileExtensions=((Pattern=\"umap\"),(Pattern=\"uasset\")),Collections=,ShouldGatherFromEditorOnlyData=False,SkipGatherCache=False),GatherFromMetaData=(IsEnabled=True,IncludePathWildcards=((Pattern=\"Source/Editor/*\"),(Pattern=\"Source/Runtime/*\"),(Pattern=\"Source/Developer/*\")),ExcludePathWildcards=((Pattern=\"Source/Developer/NoRedist/CommunityPortalServices/*\")),KeySpecifications=((MetaDataKey=(Name=\"Category\"),TextNamespace=\"UObjectCategory\",TextKeyPattern=(Pattern=\"{FieldPath}\"))),ShouldGatherFromEditorOnlyData=True),ExportSettings=(CollapseMode=IdenticalTextIdAndSource,ShouldPersistCommentsOnExport=False,ShouldAddSourceLocationsAsComments=True),CompileSettings=(SkipSourceCheck=False),ImportDialogueSettings=(RawAudioPath=(Path=\"\"),ImportedDialogueFolder=\"ImportedDialogue\",bImportNativeAsSource=False),NativeCultureIndex=0,SupportedCulturesStatistics=((CultureName=\"en\"),(CultureName=\"es\"),(CultureName=\"ja\"),(CultureName=\"ko\"),(CultureName=\"pt-BR\"),(CultureName=\"zh-CN\")))\n-GameTargetsSettings=(Name=\"Game\",Guid=AE0EA34A45461A25BA65A391026F19F8,TargetDependencies=(33482D004789784C9DA695A682ACCA1B,AC8BFD2A41A2FB2893BB8EA0AF903E6D),AdditionalManifestDependencies=,RequiredModuleNames=,GatherFromTextFiles=(IsEnabled=False,SearchDirectories=,ExcludePathWildcards=,FileExtensions=((Pattern=\"h\"),(Pattern=\"cpp\"),(Pattern=\"ini\"))),GatherFromPackages=(IsEnabled=False,IncludePathWildcards=,ExcludePathWildcards=,FileExtensions=((Pattern=\"umap\"),(Pattern=\"uasset\")),ShouldGatherFromEditorOnlyData=False),GatherFromMetaData=(IsEnabled=False,IncludePathWildcards=,ExcludePathWildcards=,KeySpecifications=,ShouldGatherFromEditorOnlyData=False),NativeCultureIndex=-1,SupportedCulturesStatistics=((CultureName=\"en\")))\n+GameTargetsSettings=(Name=\"Warriorb\",Guid=AE0EA34A45461A25BA65A391026F19F8,TargetDependencies=(8C33C698409D2CD1AEE0EF82E10014E3),AdditionalManifestDependencies=,RequiredModuleNames=,GatherFromTextFiles=(IsEnabled=True,SearchDirectories=((PathRoot=Project,Path=\"Config\"),(PathRoot=Project,Path=\"Source/SOrb\")),ExcludePathWildcards=,FileExtensions=((Pattern=\"h\"),(Pattern=\"cpp\"),(Pattern=\"ini\")),ShouldGatherFromEditorOnlyData=False),GatherFromPackages=(IsEnabled=True,IncludePathWildcards=((Pattern=\"Content/*\")),ExcludePathWildcards=((Pattern=\"*/Content/Localization/*\"),(Pattern=\"Content/SO/GUI/Editor/*\"),(Pattern=\"Content/Temp/*\"),(Pattern=\"Content/WATER_TEST/*\"),(Pattern=\"Content/StarterContent/*\"),(Pattern=\"Content/SO/Maps/PrototypeLevels/*\"),(Pattern=\"Content/L10N/*\"),(Pattern=\"Content/SO/Dialogues/*\"),(Pattern=\"Content/SO/Maps/Story/Act2/SlidePath_AnnaWIP*\"),(Pattern=\"Content/SO/Effects/Materials/*\"),(Pattern=\"Content/ForestSet/Materials/*\"),(Pattern=\"Content/SO/Assets/Decals/*\"),(Pattern=\"Content/SO/Effects/Temp/Lightning/*\")),FileExtensions=((Pattern=\"umap\"),(Pattern=\"uasset\")),Collections=,ShouldGatherFromEditorOnlyData=False,SkipGatherCache=False),GatherFromMetaData=(IsEnabled=False,IncludePathWildcards=,ExcludePathWildcards=,KeySpecifications=,ShouldGatherFromEditorOnlyData=False),ExportSettings=(CollapseMode=IdenticalNamespaceAndSource,ShouldPersistCommentsOnExport=True,ShouldAddSourceLocationsAsComments=True),CompileSettings=(SkipSourceCheck=False),ImportDialogueSettings=(RawAudioPath=(Path=\"\"),ImportedDialogueFolder=\"ImportedDialogue\",bImportNativeAsSource=False),NativeCultureIndex=0,SupportedCulturesStatistics=((CultureName=\"en\"),(CultureName=\"ro\"),(CultureName=\"hu\"),(CultureName=\"zh-Hant\"),(CultureName=\"zh-Hans\"),(CultureName=\"ru\"),(CultureName=\"es\"),(CultureName=\"fr\"),(CultureName=\"uk\")))\n+GameTargetsSettings=(Name=\"WarriorbDemo\",Guid=8C33C698409D2CD1AEE0EF82E10014E3,TargetDependencies=,AdditionalManifestDependencies=,RequiredModuleNames=,GatherFromTextFiles=(IsEnabled=True,SearchDirectories=((PathRoot=Project,Path=\"Source/SoBeforeGame\"),(PathRoot=Project,Path=\"Source/SOrb\")),ExcludePathWildcards=((Pattern=\"Source/SOrb/UI/InGame/SoUIStationPanel*\")),FileExtensions=((Pattern=\"h\"),(Pattern=\"cpp\"),(Pattern=\"ini\")),ShouldGatherFromEditorOnlyData=False),GatherFromPackages=(IsEnabled=True,IncludePathWildcards=((Pattern=\"Content/SO/Maps/CustomMaps/WhiteWall*\"),(Pattern=\"Content/SO/Dialogues/WhiteWall/*\"),(Pattern=\"Content/Localization/StringTables/*\"),(Pattern=\"Content/SO/GUI/InGame/CharacterPanels/UI_Rest*\"),(Pattern=\"Content/SO/Blueprints/BPGameSingleton*\")),ExcludePathWildcards=((Pattern=\"Content/L10N/*\"),(Pattern=\"Content/SO/GUI/Editor/*\")),FileExtensions=((Pattern=\"umap\"),(Pattern=\"uasset\")),Collections=,ShouldGatherFromEditorOnlyData=False,SkipGatherCache=False),GatherFromMetaData=(IsEnabled=False,IncludePathWildcards=,ExcludePathWildcards=,KeySpecifications=,ShouldGatherFromEditorOnlyData=False),ExportSettings=(CollapseMode=IdenticalNamespaceAndSource,ShouldPersistCommentsOnExport=True,ShouldAddSourceLocationsAsComments=True),CompileSettings=(SkipSourceCheck=False),ImportDialogueSettings=(RawAudioPath=(Path=\"\"),ImportedDialogueFolder=\"ImportedDialogue\",bImportNativeAsSource=False),NativeCultureIndex=0,SupportedCulturesStatistics=((CultureName=\"en\"),(CultureName=\"hu\"),(CultureName=\"ro\"),(CultureName=\"zh-Hans\"),(CultureName=\"zh-Hant\"),(CultureName=\"ru\"),(CultureName=\"es\"),(CultureName=\"fr\"),(CultureName=\"uk\")))\n+GameTargetsSettings=(Name=\"WarriorbDialogues\",Guid=33EDD2E3404ABA461B0D28B72F994C37,TargetDependencies=(8C33C698409D2CD1AEE0EF82E10014E3),AdditionalManifestDependencies=,RequiredModuleNames=,GatherFromTextFiles=(IsEnabled=False,SearchDirectories=,ExcludePathWildcards=,FileExtensions=((Pattern=\"h\"),(Pattern=\"cpp\"),(Pattern=\"ini\")),ShouldGatherFromEditorOnlyData=False),GatherFromPackages=(IsEnabled=True,IncludePathWildcards=((Pattern=\"Content/SO/Dialogues/*\")),ExcludePathWildcards=((Pattern=\"Content/L10N/*\")),FileExtensions=((Pattern=\"umap\"),(Pattern=\"uasset\")),Collections=,ShouldGatherFromEditorOnlyData=False,SkipGatherCache=False),GatherFromMetaData=(IsEnabled=False,IncludePathWildcards=,ExcludePathWildcards=,KeySpecifications=,ShouldGatherFromEditorOnlyData=False),ExportSettings=(CollapseMode=IdenticalNamespaceAndSource,ShouldPersistCommentsOnExport=True,ShouldAddSourceLocationsAsComments=True),CompileSettings=(SkipSourceCheck=False),ImportDialogueSettings=(RawAudioPath=(Path=\"\"),ImportedDialogueFolder=\"ImportedDialogue\",bImportNativeAsSource=False),NativeCultureIndex=0,SupportedCulturesStatistics=((CultureName=\"en\"),(CultureName=\"ro\"),(CultureName=\"hu\"),(CultureName=\"zh-Hans\"),(CultureName=\"zh-Hant\"),(CultureName=\"ru\"),(CultureName=\"es\"),(CultureName=\"fr\"),(CultureName=\"uk\")))\n\n\n"
  },
  {
    "path": "Config/DefaultEditorPerProjectUserSettings.ini",
    "content": ""
  },
  {
    "path": "Config/DefaultEditorSettings.ini",
    "content": "[/Script/SourceCodeAccess.SourceCodeAccessSettings]\nPreferredAccessor=VisualStudio2017\n\n[/Script/UnrealEd.AnalyticsPrivacySettings]\nbSendUsageData=False\n\n[/Script/UnrealEd.CrashReportsPrivacySettings]\nbSendUnattendedBugReports=False\n"
  },
  {
    "path": "Config/DefaultEngine.ini",
    "content": "[Core.System]\nZeroEngineVersionWarning=True\n\n[Core.Log]\nLogOnline=VeryVerbose\nLogInit=Verbose\nLogPlatformFile=Verbose\nLogExit=Verbose\nLogFMOD=Log\nLogDlgSystem=Log\nLogTaskGraph=Log\nLogDevObjectVersion=Log\nLogMemory=Log\nLogTextLocalizationManager=Log\nLogObj=Log\nLogShaderLibrary=Warning\n\n[CoreRedirects]\n+ClassRedirects=(OldName=\"/Script/SOrb.SOrbGameMode\", NewName=\"/Script/SOrb.SoGameMode\")\n+EnumRedirects=(OldName=\"/Script/SOrb.ESoDamageType\", NewName=\"/Script/SOrb.ESoDmgType\", ValueChanges=((\"EDT_Crush\", \"Physical\"), (\"EDT_Slash\", \"Physical\"), (\"EDT_WarmMagic\", \"Magic\"), (\"EDT_ColdMagic\", \"Magic\"), (\"EDT_Overlap\", \"Magic\"), (\"EDT_MAX\", \"Max\")) )\n+EnumRedirects=(OldName=\"/Script/SOrb.ESoInputGamepadUIType\", NewName=\"/Script/SOrb.ESoGamepadLayoutType\")\n\n[ConsoleVariables]\n; Fix https://sentry.io/organizations/daniel-butum/issues/1434356925/?project=1873711&query=is%3Aunresolved\n; Assertion failed: [File:D:\\Build\\++UE4\\Sync\\Engine\\Source\\Runtime\\RenderCore\\Private\\RenderingThread.cpp] [Line: 1121] GameThread timed out waiting for RenderThread after 120.00 secs\n; Original was: 120s. New Value: 240s\ng.TimeoutForBlockOnRenderFence=240000\nr.WarnOfBadDrivers=1\nSlate.EnableLegacyLocalizedFallbackFont=0\n\n[Kismet]\nScriptStackOnWarnings=True\n\n[/Script/EngineSettings.GameMapsSettings]\nEditorStartupMap=/Game/SO/Maps/CustomMaps/WhiteWall/WhiteWall.WhiteWall\nGameDefaultMap=/Game/SO/Maps/SoMenuLevel.SoMenuLevel\nGlobalDefaultGameMode=/Game/SO/Blueprints/BPGameMode.BPGameMode_C\nGameInstanceClass=/Game/SO/Blueprints/BPSoGameInstance.BPSoGameInstance_C\n\n[/Script/Engine.RendererSettings]\nr.MobileHDR=True\nr.MobileNumDynamicPointLights=4\nr.MobileDynamicPointLightsUseStaticBranch=True\nr.AllowOcclusionQueries=True\nr.MinScreenRadiusForLights=0.030000\nr.MinScreenRadiusForDepthPrepass=0.030000\nr.PrecomputedVisibilityWarning=False\nr.TextureStreaming=True\nCompat.UseDXT5NormalMaps=False\nr.AllowStaticLighting=True\nr.NormalMapsForStaticLighting=False\nr.GenerateMeshDistanceFields=False\nr.GenerateLandscapeGIData=True\nr.TessellationAdaptivePixelsPerTriangle=48.000000\nr.SeparateTranslucency=True\nr.TranslucentSortPolicy=0\nTranslucentSortAxis=(X=0.000000,Y=-1.000000,Z=0.000000)\nr.CustomDepth=0\nr.DefaultFeature.Bloom=True\nr.DefaultFeature.AmbientOcclusion=True\nr.DefaultFeature.AmbientOcclusionStaticFraction=True\nr.DefaultFeature.AutoExposure=True\nr.DefaultFeature.MotionBlur=False\nr.DefaultFeature.LensFlare=False\nr.DefaultFeature.AntiAliasing=2\nr.EarlyZPass=2\nr.EarlyZPassMovable=True\nr.DBuffer=True\nr.ClearSceneMethod=1\nr.BasePassOutputsVelocity=False\nr.WireframeCullThreshold=5.000000\nUIScaleRule=ShortestSide\nUIScaleCurve=(EditorCurveData=(PreInfinityExtrap=RCCE_Constant,PostInfinityExtrap=RCCE_Constant,Keys=,DefaultValue=340282346638528859811704183484516925440.000000),ExternalCurve=None)\nr.ForceDebugViewModes=0\n\n[/Script/HardwareTargeting.HardwareTargetingSettings]\nTargetedHardwareClass=Desktop\nAppliedTargetedHardwareClass=Desktop\nDefaultGraphicsPerformance=Maximum\nAppliedDefaultGraphicsPerformance=Maximum\n\n[CrashReportClient]\nCrashReportClientVersion=1.0\nDataRouterUrl=\"\"\nbSendLogFile=True\nbAllowToBeContacted=True\nbHideLogFilesOption=True\nbIsAllowedToCloseWithoutSending=True\nCanSendWhenUIFailedToInitialize=True\nCrashConfigPurgeDays=2\nUIInitRetryCount=10\nUIInitRetryInterval=2.0\n\n[Analytics]\nProviderModuleName=AnalyticsMulticast\nProviderModuleNames=GameAnalytics\n\n[AnalyticsTest]\nProviderModuleName=AnalyticsMulticast\nProviderModuleNames=GameAnalytics\n\n[AnalyticsDebug]\nProviderModuleName=AnalyticsMulticast\nProviderModuleNames=GameAnalytics\n\n[AnalyticsDevelopment]\nProviderModuleName=AnalyticsMulticast\nProviderModuleNames=GameAnalytics\n\n[/Script/Engine.UserInterfaceSettings]\nRenderFocusRule=Never\nDefaultCursor=None\nTextEditBeamCursor=None\nCrosshairsCursor=None\nGrabHandCursor=None\nGrabHandClosedCursor=None\nSlashedCircleCursor=None\nApplicationScale=1.000000\nUIScaleRule=ShortestSide\nCustomScalingRuleClass=None\nUIScaleCurve=(EditorCurveData=(PreInfinityExtrap=RCCE_Constant,PostInfinityExtrap=RCCE_Constant,Keys=((Time=480.000000,Value=0.444000),(Time=720.000000,Value=0.666000),(Time=1080.000000,Value=1.000000),(Time=8640.000000,Value=8.000000)),DefaultValue=340282346638528859811704183484516925440.000000),ExternalCurve=None)\n\n[Voice]\nbEnabled=False\n\n[OnlineSubsystem]\nDefaultPlatformService=Null\nPollingIntervalInMs=25\nbHasVoiceEnabled=False\nbUseBuildIdOverride=False\nBuildIdOverride=0\n\n[OnlineSubsystemSteam]\nbEnabled=True\nSteamDevAppId=790360\nbRelaunchInSteam=False\nbAllowP2PPacketRelay=True\nP2PConnectionTimeout=90\nGameServerQueryPort=27015\nGameVersion=1.3.1\nbVACEnabled=False\n\n[/Script/OnlineSubsystemSteam.SteamNetDriver]\nNetConnectionClassName=/Script/OnlineSubsystemSteam.SteamNetConnection\n\n[/Script/Engine.Engine]\nGameSingletonClassName=/Script/SOrb.SoGameSingleton\nGameUserSettingsClassName=/Script/SOrb.SoGameSettings\nGameEngine=/Script/SOrb.SoGameEngine\nUnrealEdEngine=/Script/SOrbEditor.SoGameEditorEngine\nGameViewportClientClassName=/Script/SOrb.SoGameViewportClient\nSmoothedFrameRateRange=(LowerBound=(Type=Inclusive,Value=20.000000),UpperBound=(Type=Inclusive,Value=200.000000))\nbSmoothFrameRate=False\n\n[/Script/GameplayDebugger.GameplayDebuggerConfig]\nActivationKey=Apostrophe\nCategoryRowNextKey=Add\nCategoryRowPrevKey=Subtract\nCategorySlot0=NumPadZero\nCategorySlot1=NumPadOne\nCategorySlot2=NumPadTwo\nCategorySlot3=NumPadThree\nCategorySlot4=NumPadFour\nCategorySlot5=NumPadFive\nCategorySlot6=NumPadSix\nCategorySlot7=NumPadSeven\nCategorySlot8=NumPadEight\nCategorySlot9=NumPadNine\nDebugCanvasPaddingLeft=10.000000\nDebugCanvasPaddingRight=10.000000\nDebugCanvasPaddingTop=10.000000\nDebugCanvasPaddingBottom=10.000000\n+Categories=(CategoryName=\"AI\",SlotIdx=1,ActiveInGame=UseDefault,ActiveInSimulate=UseDefault,Hidden=UseDefault,bOverrideSlotIdx=False,InputHandlers=)\n+Categories=(CategoryName=\"BehaviorTree\",SlotIdx=2,ActiveInGame=Disable,ActiveInSimulate=Disable,Hidden=Enable,bOverrideSlotIdx=False,InputHandlers=)\n+Categories=(CategoryName=\"EQS\",SlotIdx=-1,ActiveInGame=Disable,ActiveInSimulate=Disable,Hidden=Enable,bOverrideSlotIdx=False,InputHandlers=((ConfigName=\"CycleQueries\",Key=Multiply),(ConfigName=\"ToggleDetails\",Key=Divide)))\n+Categories=(CategoryName=\"Navmesh\",SlotIdx=0,ActiveInGame=Disable,ActiveInSimulate=Disable,Hidden=Enable,bOverrideSlotIdx=False,InputHandlers=)\n+Categories=(CategoryName=\"Perception\",SlotIdx=-1,ActiveInGame=Disable,ActiveInSimulate=Disable,Hidden=Enable,bOverrideSlotIdx=False,InputHandlers=)\n+Categories=(CategoryName=\"NavGrid\",SlotIdx=-1,ActiveInGame=UseDefault,ActiveInSimulate=UseDefault,Hidden=UseDefault,bOverrideSlotIdx=False,InputHandlers=)\n+Categories=(CategoryName=\"DlgSystem\",SlotIdx=-1,ActiveInGame=UseDefault,ActiveInSimulate=UseDefault,Hidden=UseDefault,bOverrideSlotIdx=False,InputHandlers=)\n+Extensions=(ExtensionName=\"GameHUD\",UseExtension=UseDefault,InputHandlers=((ConfigName=\"ToggleHUD\",Key=Tilde,bModCtrl=True),(ConfigName=\"ToggleMessages\",Key=Tab,bModCtrl=True)))\n+Extensions=(ExtensionName=\"Spectator\",UseExtension=UseDefault,InputHandlers=((ConfigName=\"Toggle\",Key=Tab)))\n\n[/Script/Engine.EndUserSettings]\nbSendAnonymousUsageDataToEpic=False\n\n[/Script/LinuxTargetPlatform.LinuxTargetSettings]\nSpatializationPlugin=\nReverbPlugin=\nOcclusionPlugin=\n-TargetedRHIs=GLSL_430\n-TargetedRHIs=GLSL_150\n-TargetedRHIs=SF_VULKAN_SM5\n-TargetedRHIs=SF_VULKAN_SM4\n-TargetedRHIs=SF_VULKAN_ES31\n+TargetedRHIs=GLSL_430\n+TargetedRHIs=SF_VULKAN_SM5\n\n[/Script/WindowsTargetPlatform.WindowsTargetSettings]\nCompiler=Default\n-TargetedRHIs=PCD3D_SM5\n-TargetedRHIs=PCD3D_SM4\n+TargetedRHIs=PCD3D_SM5\nMinimumOSVersion=MSOS_Vista\nAudioDevice=\nAudioSampleRate=48000\nAudioCallbackBufferFrameSize=1024\nAudioNumBuffersToEnqueue=1\nAudioMaxChannels=0\nAudioNumSourceWorkers=4\nSpatializationPlugin=\nReverbPlugin=\nOcclusionPlugin=\n\n[/Script/GameAnalyticsEditor.GameAnalyticsProjectSettings]\nIosGameKey=\nIosSecretKey=\nIosBuild=IGNORED\nAndroidGameKey=\nAndroidSecretKey=\nAndroidBuild=IGNORED\nMacGameKey=\nMacSecretKey=\nMacBuild=IGNORED\nWindowsGameKey=effdbdd04aeac1d40e1184d72a652228\nWindowsSecretKey=bb83914992047fbce23f358fd940050f185fc5f5\nWindowsBuild=IGNORED\nLinuxGameKey=effdbdd04aeac1d40e1184d72a652228\nLinuxSecretKey=bb83914992047fbce23f358fd940050f185fc5f5\nLinuxBuild=IGNORED\nHtml5GameKey=\nHtml5SecretKey=\nHtml5Build=IGNORED\n+CustomDimensions01=WITH_EDITOR\n+CustomDimensions01=WITH_NO_EDITOR\n+ResourceCurrencies=Gold\n+ResourceCurrencies=Life\n+ResourceItemTypes=BuyTrader\n+ResourceItemTypes=SellTrader\n+ResourceItemTypes=MonsterChest\n+ResourceItemTypes=Quest\nUseCustomId=False\nUseManualSessionHandling=True\nInfoLogBuild=True\nVerboseLogBuild=False\n\n[/Script/FMODStudio.FMODSettings]\nOutputFormat=Stereo\nbEnableLiveUpdate=True\nLoggingLevel=LEVEL_WARNING\n\n[/Script/Engine.ProxyLODMeshSimplificationSettings]\nr.ProxyLODMeshReductionModule=ProxyLODMeshReduction\n\n[/Script/Engine.StreamingSettings]\ns.AsyncLoadingThreadEnabled=True\ns.WarnIfTimeLimitExceeded=True\n\n[/Script/IOSRuntimeSettings.IOSRuntimeSettings]\nbSupportsPortraitOrientation=False\nbSupportsUpsideDownOrientation=False\nbSupportsLandscapeLeftOrientation=True\nPreferredLandscapeOrientation=LandscapeLeft\n\n[/Script/DlgSystem.DlgSystemSettings]\nbClearDialogueHistoryAutomatically=True\nDialogueTextFormat=None\nDialogueTextInputKeyForNewLine=Enter\nbShowNodeData=True\nDialogueSpeakerStateVisibility=ShowOnNodeAndEdge\nDialogueDisplayedVoiceFields=None\nbShowGenericData=True\n+BlacklistedReflectionClasses=Class'/Script/Engine.Actor'\n+BlacklistedReflectionClasses=Class'/Script/Engine.Pawn'\n+BlacklistedReflectionClasses=Class'/Script/Engine.Character'\nbBatchOnlyInGameDialogues=True\nAdditionalTextFormatFileExtensionsToLookFor=()\nbSetDefaultEdgeTexts=True\nbSetDefaultEdgeTextOnFirstChildOnly=True\nDefaultTextEdgeToEndNode=LOCTABLE(\"Dialogue\", \"finish\")\nDefaultTextEdgeToNormalNode=LOCTABLE(\"Dialogue\", \"next\")\nDialogueTextNamespaceLocalization=WithPrefixPerDialogue\nDialogueTextGlobalNamespaceName=Dialogue\nLocalizationIgnoredStrings=()\nLocalizationRemapSourceStringsToTexts=((\"Next\", LOCTABLE(\"Dialogue\", \"next\")),(\"Finish\", LOCTABLE(\"Dialogue\", \"finish\")))\nbEnableMessageLog=True\nbMessageLogMirrorToOutputLog=True\nbMessageLogOpen=True\nbEnableOutputLog=False\nRedirectMessageLogLevelsHigherThan=Warning\nOpenMessageLogLevelsHigherThan=NoLogging\nbHideEmptyDialogueBrowserCategories=True\nDescriptionWrapTextAt=256.000000\nDescriptionTextMargin=(Left=5.000000,Top=5.000000,Right=5.000000,Bottom=5.000000)\nTitleHorizontalAlignment=HAlign_Fill\nbShowHasEnterConditionsIcon=True\nbShowHasEnterEventsIcon=True\nbShowHasVoiceIcon=True\nbShowHasGenericDataIcon=True\nSpeechNodeColor=(R=0.050980,G=0.278431,B=0.631373,A=1.000000)\nRootNodeColor=(R=0.105882,G=0.368627,B=0.125490,A=1.000000)\nEndNodeColor=(R=0.835294,G=0.000000,B=0.000000,A=1.000000)\nVirtualParentNodeColor=(R=0.129412,G=0.129412,B=0.129412,A=1.000000)\nSelectorFirstNodeColor=(R=0.000000,G=0.721569,B=0.831373,A=1.000000)\nSelectorRandomNodeColor=(R=1.000000,G=0.839216,B=0.000000,A=1.000000)\nSpeechSequenceNodeColor=(R=0.050980,G=0.278431,B=0.631373,A=1.000000)\nBorderBackgroundColor=(R=0.000000,G=0.000000,B=0.000000,A=1.000000)\nBorderHoveredBackgroundColor=(R=0.380392,G=0.380392,B=0.380392,A=1.000000)\nDescriptionSpeakerMargin=(Left=1.000000,Top=1.000000,Right=1.000000,Bottom=1.000000)\nDescriptionSpeakerHorizontalAlignment=HAlign_Center\nWireThickness=2.000000\nbWireDrawBubbles=False\nbShowEdgeHasConditionsIcon=True\nWireBaseColor=(R=1.000000,G=1.000000,B=1.000000,A=1.000000)\nbShowDifferentColorForConditionWires=True\nWireWithConditionsColor=(R=1.000000,G=0.341176,B=0.133333,A=1.000000)\nWireHoveredColor=(R=1.000000,G=0.596078,B=0.000000,A=1.000000)\nbShowPrimarySecondaryEdges=True\nbDrawPrimaryEdges=True\nbDrawSecondaryEdges=True\nWirePrimaryEdgeColor=(R=0.717647,G=0.109804,B=0.109804,A=1.000000)\nWireSecondaryEdgeColor=(R=0.101961,G=0.137255,B=0.494118,A=1.000000)\nOffsetBetweenColumnsX=500\nOffsetBetweenRowsY=200\nDialogueTextPrefixNamespaceName=Dialogue_\n\n[/Script/Engine.CollisionProfile]\n-Profiles=(Name=\"NoCollision\",CollisionEnabled=NoCollision,ObjectTypeName=\"WorldStatic\",CustomResponses=((Channel=\"Visibility\",Response=ECR_Ignore),(Channel=\"Camera\",Response=ECR_Ignore)),HelpMessage=\"No collision\",bCanModify=False)\n-Profiles=(Name=\"BlockAll\",CollisionEnabled=QueryAndPhysics,ObjectTypeName=\"WorldStatic\",CustomResponses=,HelpMessage=\"WorldStatic object that blocks all actors by default. All new custom channels will use its own default response. \",bCanModify=False)\n-Profiles=(Name=\"OverlapAll\",CollisionEnabled=QueryOnly,ObjectTypeName=\"WorldStatic\",CustomResponses=((Channel=\"WorldStatic\",Response=ECR_Overlap),(Channel=\"Pawn\",Response=ECR_Overlap),(Channel=\"Visibility\",Response=ECR_Overlap),(Channel=\"WorldDynamic\",Response=ECR_Overlap),(Channel=\"Camera\",Response=ECR_Overlap),(Channel=\"PhysicsBody\",Response=ECR_Overlap),(Channel=\"Vehicle\",Response=ECR_Overlap),(Channel=\"Destructible\",Response=ECR_Overlap)),HelpMessage=\"WorldStatic object that overlaps all actors by default. All new custom channels will use its own default response. \",bCanModify=False)\n-Profiles=(Name=\"BlockAllDynamic\",CollisionEnabled=QueryAndPhysics,ObjectTypeName=\"WorldDynamic\",CustomResponses=,HelpMessage=\"WorldDynamic object that blocks all actors by default. All new custom channels will use its own default response. \",bCanModify=False)\n-Profiles=(Name=\"OverlapAllDynamic\",CollisionEnabled=QueryOnly,ObjectTypeName=\"WorldDynamic\",CustomResponses=((Channel=\"WorldStatic\",Response=ECR_Overlap),(Channel=\"Pawn\",Response=ECR_Overlap),(Channel=\"Visibility\",Response=ECR_Overlap),(Channel=\"WorldDynamic\",Response=ECR_Overlap),(Channel=\"Camera\",Response=ECR_Overlap),(Channel=\"PhysicsBody\",Response=ECR_Overlap),(Channel=\"Vehicle\",Response=ECR_Overlap),(Channel=\"Destructible\",Response=ECR_Overlap)),HelpMessage=\"WorldDynamic object that overlaps all actors by default. All new custom channels will use its own default response. \",bCanModify=False)\n-Profiles=(Name=\"IgnoreOnlyPawn\",CollisionEnabled=QueryOnly,ObjectTypeName=\"WorldDynamic\",CustomResponses=((Channel=\"Pawn\",Response=ECR_Ignore),(Channel=\"Vehicle\",Response=ECR_Ignore)),HelpMessage=\"WorldDynamic object that ignores Pawn and Vehicle. All other channels will be set to default.\",bCanModify=False)\n-Profiles=(Name=\"OverlapOnlyPawn\",CollisionEnabled=QueryOnly,ObjectTypeName=\"WorldDynamic\",CustomResponses=((Channel=\"Pawn\",Response=ECR_Overlap),(Channel=\"Vehicle\",Response=ECR_Overlap),(Channel=\"Camera\",Response=ECR_Ignore)),HelpMessage=\"WorldDynamic object that overlaps Pawn, Camera, and Vehicle. All other channels will be set to default. \",bCanModify=False)\n-Profiles=(Name=\"Pawn\",CollisionEnabled=QueryAndPhysics,ObjectTypeName=\"Pawn\",CustomResponses=((Channel=\"Visibility\",Response=ECR_Ignore)),HelpMessage=\"Pawn object. Can be used for capsule of any playerable character or AI. \",bCanModify=False)\n-Profiles=(Name=\"Spectator\",CollisionEnabled=QueryOnly,ObjectTypeName=\"Pawn\",CustomResponses=((Channel=\"WorldStatic\",Response=ECR_Block),(Channel=\"Pawn\",Response=ECR_Ignore),(Channel=\"Visibility\",Response=ECR_Ignore),(Channel=\"WorldDynamic\",Response=ECR_Ignore),(Channel=\"Camera\",Response=ECR_Ignore),(Channel=\"PhysicsBody\",Response=ECR_Ignore),(Channel=\"Vehicle\",Response=ECR_Ignore),(Channel=\"Destructible\",Response=ECR_Ignore)),HelpMessage=\"Pawn object that ignores all other actors except WorldStatic.\",bCanModify=False)\n-Profiles=(Name=\"CharacterMesh\",CollisionEnabled=QueryOnly,ObjectTypeName=\"Pawn\",CustomResponses=((Channel=\"Pawn\",Response=ECR_Ignore),(Channel=\"Vehicle\",Response=ECR_Ignore),(Channel=\"Visibility\",Response=ECR_Ignore)),HelpMessage=\"Pawn object that is used for Character Mesh. All other channels will be set to default.\",bCanModify=False)\n-Profiles=(Name=\"PhysicsActor\",CollisionEnabled=QueryAndPhysics,ObjectTypeName=\"PhysicsBody\",CustomResponses=,HelpMessage=\"Simulating actors\",bCanModify=False)\n-Profiles=(Name=\"Destructible\",CollisionEnabled=QueryAndPhysics,ObjectTypeName=\"Destructible\",CustomResponses=,HelpMessage=\"Destructible actors\",bCanModify=False)\n-Profiles=(Name=\"InvisibleWall\",CollisionEnabled=QueryAndPhysics,ObjectTypeName=\"WorldStatic\",CustomResponses=((Channel=\"Visibility\",Response=ECR_Ignore)),HelpMessage=\"WorldStatic object that is invisible.\",bCanModify=False)\n-Profiles=(Name=\"InvisibleWallDynamic\",CollisionEnabled=QueryAndPhysics,ObjectTypeName=\"WorldDynamic\",CustomResponses=((Channel=\"Visibility\",Response=ECR_Ignore)),HelpMessage=\"WorldDynamic object that is invisible.\",bCanModify=False)\n-Profiles=(Name=\"Trigger\",CollisionEnabled=QueryOnly,ObjectTypeName=\"WorldDynamic\",CustomResponses=((Channel=\"WorldStatic\",Response=ECR_Overlap),(Channel=\"Pawn\",Response=ECR_Overlap),(Channel=\"Visibility\",Response=ECR_Ignore),(Channel=\"WorldDynamic\",Response=ECR_Overlap),(Channel=\"Camera\",Response=ECR_Overlap),(Channel=\"PhysicsBody\",Response=ECR_Overlap),(Channel=\"Vehicle\",Response=ECR_Overlap),(Channel=\"Destructible\",Response=ECR_Overlap)),HelpMessage=\"WorldDynamic object that is used for trigger. All other channels will be set to default.\",bCanModify=False)\n-Profiles=(Name=\"Ragdoll\",CollisionEnabled=QueryAndPhysics,ObjectTypeName=\"PhysicsBody\",CustomResponses=((Channel=\"Pawn\",Response=ECR_Ignore),(Channel=\"Visibility\",Response=ECR_Ignore)),HelpMessage=\"Simulating Skeletal Mesh Component. All other channels will be set to default.\",bCanModify=False)\n-Profiles=(Name=\"Vehicle\",CollisionEnabled=QueryAndPhysics,ObjectTypeName=\"Vehicle\",CustomResponses=,HelpMessage=\"Vehicle object that blocks Vehicle, WorldStatic, and WorldDynamic. All other channels will be set to default.\",bCanModify=False)\n-Profiles=(Name=\"UI\",CollisionEnabled=QueryOnly,ObjectTypeName=\"WorldDynamic\",CustomResponses=((Channel=\"WorldStatic\",Response=ECR_Overlap),(Channel=\"Pawn\",Response=ECR_Overlap),(Channel=\"Visibility\",Response=ECR_Block),(Channel=\"WorldDynamic\",Response=ECR_Overlap),(Channel=\"Camera\",Response=ECR_Overlap),(Channel=\"PhysicsBody\",Response=ECR_Overlap),(Channel=\"Vehicle\",Response=ECR_Overlap),(Channel=\"Destructible\",Response=ECR_Overlap)),HelpMessage=\"WorldStatic object that overlaps all actors by default. All new custom channels will use its own default response. \",bCanModify=False)\n+Profiles=(Name=\"NoCollision\",CollisionEnabled=NoCollision,ObjectTypeName=\"WorldStatic\",CustomResponses=((Channel=\"Visibility\",Response=ECR_Ignore),(Channel=\"Camera\",Response=ECR_Ignore)),HelpMessage=\"No collision\",bCanModify=False)\n+Profiles=(Name=\"BlockAll\",CollisionEnabled=QueryAndPhysics,ObjectTypeName=\"WorldStatic\",CustomResponses=,HelpMessage=\"WorldStatic object that blocks all actors by default. All new custom channels will use its own default response. \",bCanModify=False)\n+Profiles=(Name=\"OverlapAll\",CollisionEnabled=QueryOnly,ObjectTypeName=\"WorldStatic\",CustomResponses=((Channel=\"WorldStatic\",Response=ECR_Overlap),(Channel=\"Pawn\",Response=ECR_Overlap),(Channel=\"Visibility\",Response=ECR_Overlap),(Channel=\"WorldDynamic\",Response=ECR_Overlap),(Channel=\"Camera\",Response=ECR_Overlap),(Channel=\"PhysicsBody\",Response=ECR_Overlap),(Channel=\"Vehicle\",Response=ECR_Overlap),(Channel=\"Destructible\",Response=ECR_Overlap)),HelpMessage=\"WorldStatic object that overlaps all actors by default. All new custom channels will use its own default response. \",bCanModify=False)\n+Profiles=(Name=\"BlockAllDynamic\",CollisionEnabled=QueryAndPhysics,ObjectTypeName=\"WorldDynamic\",CustomResponses=,HelpMessage=\"WorldDynamic object that blocks all actors by default. All new custom channels will use its own default response. \",bCanModify=False)\n+Profiles=(Name=\"OverlapAllDynamic\",CollisionEnabled=QueryOnly,ObjectTypeName=\"WorldDynamic\",CustomResponses=((Channel=\"WorldStatic\",Response=ECR_Overlap),(Channel=\"Pawn\",Response=ECR_Overlap),(Channel=\"Visibility\",Response=ECR_Overlap),(Channel=\"WorldDynamic\",Response=ECR_Overlap),(Channel=\"Camera\",Response=ECR_Overlap),(Channel=\"PhysicsBody\",Response=ECR_Overlap),(Channel=\"Vehicle\",Response=ECR_Overlap),(Channel=\"Destructible\",Response=ECR_Overlap)),HelpMessage=\"WorldDynamic object that overlaps all actors by default. All new custom channels will use its own default response. \",bCanModify=False)\n+Profiles=(Name=\"IgnoreOnlyPawn\",CollisionEnabled=QueryOnly,ObjectTypeName=\"WorldDynamic\",CustomResponses=((Channel=\"Pawn\",Response=ECR_Ignore),(Channel=\"Vehicle\",Response=ECR_Ignore)),HelpMessage=\"WorldDynamic object that ignores Pawn and Vehicle. All other channels will be set to default.\",bCanModify=False)\n+Profiles=(Name=\"OverlapOnlyPawn\",CollisionEnabled=QueryOnly,ObjectTypeName=\"WorldDynamic\",CustomResponses=((Channel=\"Pawn\",Response=ECR_Overlap),(Channel=\"Vehicle\",Response=ECR_Overlap),(Channel=\"Camera\",Response=ECR_Ignore)),HelpMessage=\"WorldDynamic object that overlaps Pawn, Camera, and Vehicle. All other channels will be set to default. \",bCanModify=False)\n+Profiles=(Name=\"Pawn\",CollisionEnabled=QueryAndPhysics,ObjectTypeName=\"Pawn\",CustomResponses=((Channel=\"Visibility\",Response=ECR_Ignore)),HelpMessage=\"Pawn object. Can be used for capsule of any playerable character or AI. \",bCanModify=False)\n+Profiles=(Name=\"Spectator\",CollisionEnabled=QueryOnly,ObjectTypeName=\"Pawn\",CustomResponses=((Channel=\"WorldStatic\"),(Channel=\"Pawn\",Response=ECR_Ignore),(Channel=\"Visibility\",Response=ECR_Ignore),(Channel=\"WorldDynamic\",Response=ECR_Ignore),(Channel=\"Camera\",Response=ECR_Ignore),(Channel=\"PhysicsBody\",Response=ECR_Ignore),(Channel=\"Vehicle\",Response=ECR_Ignore),(Channel=\"Destructible\",Response=ECR_Ignore)),HelpMessage=\"Pawn object that ignores all other actors except WorldStatic.\",bCanModify=False)\n+Profiles=(Name=\"CharacterMesh\",CollisionEnabled=QueryOnly,ObjectTypeName=\"Pawn\",CustomResponses=((Channel=\"Pawn\",Response=ECR_Ignore),(Channel=\"Vehicle\",Response=ECR_Ignore),(Channel=\"Visibility\",Response=ECR_Ignore)),HelpMessage=\"Pawn object that is used for Character Mesh. All other channels will be set to default.\",bCanModify=False)\n+Profiles=(Name=\"PhysicsActor\",CollisionEnabled=QueryAndPhysics,ObjectTypeName=\"PhysicsBody\",CustomResponses=,HelpMessage=\"Simulating actors\",bCanModify=False)\n+Profiles=(Name=\"Destructible\",CollisionEnabled=QueryAndPhysics,ObjectTypeName=\"Destructible\",CustomResponses=,HelpMessage=\"Destructible actors\",bCanModify=False)\n+Profiles=(Name=\"InvisibleWall\",CollisionEnabled=QueryAndPhysics,ObjectTypeName=\"WorldStatic\",CustomResponses=((Channel=\"Visibility\",Response=ECR_Ignore)),HelpMessage=\"WorldStatic object that is invisible.\",bCanModify=False)\n+Profiles=(Name=\"InvisibleWallDynamic\",CollisionEnabled=QueryAndPhysics,ObjectTypeName=\"WorldDynamic\",CustomResponses=((Channel=\"Visibility\",Response=ECR_Ignore)),HelpMessage=\"WorldDynamic object that is invisible.\",bCanModify=False)\n+Profiles=(Name=\"Trigger\",CollisionEnabled=QueryOnly,ObjectTypeName=\"WorldDynamic\",CustomResponses=((Channel=\"WorldStatic\",Response=ECR_Overlap),(Channel=\"Pawn\",Response=ECR_Overlap),(Channel=\"Visibility\",Response=ECR_Ignore),(Channel=\"WorldDynamic\",Response=ECR_Overlap),(Channel=\"Camera\",Response=ECR_Overlap),(Channel=\"PhysicsBody\",Response=ECR_Overlap),(Channel=\"Vehicle\",Response=ECR_Overlap),(Channel=\"Destructible\",Response=ECR_Overlap)),HelpMessage=\"WorldDynamic object that is used for trigger. All other channels will be set to default.\",bCanModify=False)\n+Profiles=(Name=\"Ragdoll\",CollisionEnabled=QueryAndPhysics,ObjectTypeName=\"PhysicsBody\",CustomResponses=((Channel=\"Pawn\",Response=ECR_Ignore)),HelpMessage=\"Simulating Skeletal Mesh Component. All other channels will be set to default.\",bCanModify=False)\n+Profiles=(Name=\"Vehicle\",CollisionEnabled=QueryAndPhysics,ObjectTypeName=\"Vehicle\",CustomResponses=,HelpMessage=\"Vehicle object that blocks Vehicle, WorldStatic, and WorldDynamic. All other channels will be set to default.\",bCanModify=False)\n+Profiles=(Name=\"UI\",CollisionEnabled=QueryOnly,ObjectTypeName=\"WorldDynamic\",CustomResponses=((Channel=\"WorldStatic\",Response=ECR_Overlap),(Channel=\"Pawn\",Response=ECR_Overlap),(Channel=\"Visibility\"),(Channel=\"WorldDynamic\",Response=ECR_Overlap),(Channel=\"Camera\",Response=ECR_Overlap),(Channel=\"PhysicsBody\",Response=ECR_Overlap),(Channel=\"Vehicle\",Response=ECR_Overlap),(Channel=\"Destructible\",Response=ECR_Overlap)),HelpMessage=\"WorldStatic object that overlaps all actors by default. All new custom channels will use its own default response. \",bCanModify=False)\n+Profiles=(Name=\"TriggerPawnOnly\",CollisionEnabled=QueryOnly,ObjectTypeName=\"CharacterLogic\",CustomResponses=((Channel=\"WorldStatic\",Response=ECR_Ignore),(Channel=\"WorldDynamic\",Response=ECR_Ignore),(Channel=\"Pawn\",Response=ECR_Overlap),(Channel=\"Visibility\",Response=ECR_Ignore),(Channel=\"Camera\",Response=ECR_Ignore),(Channel=\"PhysicsBody\",Response=ECR_Ignore),(Channel=\"Vehicle\",Response=ECR_Ignore),(Channel=\"Destructible\",Response=ECR_Ignore),(Channel=\"PawnOverlapChar\",Response=ECR_Overlap),(Channel=\"WarriOrbCapsule\",Response=ECR_Overlap)),HelpMessage=\"Needs description\",bCanModify=True)\n+Profiles=(Name=\"ProjectleDynamic\",CollisionEnabled=QueryAndPhysics,ObjectTypeName=\"Projectile\",CustomResponses=((Channel=\"Pawn\",Response=ECR_Ignore),(Channel=\"Visibility\",Response=ECR_Ignore),(Channel=\"Camera\",Response=ECR_Ignore),(Channel=\"PhysicsBody\",Response=ECR_Overlap),(Channel=\"SplineMoverLogic\",Response=ECR_Overlap),(Channel=\"TriggerProjectile\"),(Channel=\"TestStone\"),(Channel=\"PawnOverlapChar\",Response=ECR_Overlap),(Channel=\"WarriOrbCapsule\",Response=ECR_Overlap)),HelpMessage=\"Needs description\",bCanModify=True)\n+Profiles=(Name=\"BlockWorldObjects\",CollisionEnabled=QueryAndPhysics,ObjectTypeName=\"WorldDynamic\",CustomResponses=((Channel=\"Pawn\",Response=ECR_Ignore),(Channel=\"Visibility\",Response=ECR_Ignore),(Channel=\"Camera\",Response=ECR_Ignore),(Channel=\"PhysicsBody\",Response=ECR_Ignore),(Channel=\"Vehicle\",Response=ECR_Ignore),(Channel=\"Destructible\",Response=ECR_Ignore),(Channel=\"PawnOverlapChar\",Response=ECR_Ignore),(Channel=\"WarriOrbCapsule\",Response=ECR_Ignore)),HelpMessage=\"WorldDynamic object that blocks WorldStatic and WorldDynamic. Ignoes everything else\",bCanModify=True)\n+Profiles=(Name=\"Weapon\",CollisionEnabled=NoCollision,ObjectTypeName=\"Weapon\",CustomResponses=((Channel=\"WorldStatic\",Response=ECR_Ignore),(Channel=\"WorldDynamic\",Response=ECR_Ignore),(Channel=\"Pawn\",Response=ECR_Ignore),(Channel=\"Visibility\",Response=ECR_Ignore),(Channel=\"Camera\",Response=ECR_Ignore),(Channel=\"PhysicsBody\",Response=ECR_Overlap),(Channel=\"Vehicle\",Response=ECR_Ignore),(Channel=\"Destructible\",Response=ECR_Ignore),(Channel=\"PawnOverlapChar\",Response=ECR_Ignore),(Channel=\"WarriOrbCapsule\",Response=ECR_Overlap)),HelpMessage=\"Needs description\",bCanModify=True)\n+Profiles=(Name=\"SoCharMesh\",CollisionEnabled=QueryAndPhysics,ObjectTypeName=\"PhysicsBody\",CustomResponses=((Channel=\"WorldStatic\",Response=ECR_Ignore),(Channel=\"WorldDynamic\",Response=ECR_Ignore),(Channel=\"Pawn\",Response=ECR_Ignore),(Channel=\"Visibility\",Response=ECR_Ignore),(Channel=\"Camera\",Response=ECR_Ignore),(Channel=\"Vehicle\",Response=ECR_Ignore),(Channel=\"Projectile\",Response=ECR_Overlap),(Channel=\"TriggerProjectile\"),(Channel=\"TestStone\"),(Channel=\"PawnOverlapChar\",Response=ECR_Ignore),(Channel=\"WarriOrbCapsule\",Response=ECR_Overlap)),HelpMessage=\"Needs description\",bCanModify=True)\n+Profiles=(Name=\"TriggerPawnTestStoneAndTriggerProj\",CollisionEnabled=QueryAndPhysics,ObjectTypeName=\"WorldStatic\",CustomResponses=((Channel=\"WorldStatic\",Response=ECR_Ignore),(Channel=\"WorldDynamic\",Response=ECR_Ignore),(Channel=\"Pawn\",Response=ECR_Overlap),(Channel=\"Visibility\",Response=ECR_Ignore),(Channel=\"Camera\",Response=ECR_Ignore),(Channel=\"PhysicsBody\",Response=ECR_Ignore),(Channel=\"Vehicle\",Response=ECR_Ignore),(Channel=\"Destructible\",Response=ECR_Ignore),(Channel=\"TriggerProjectile\",Response=ECR_Overlap),(Channel=\"TestStone\",Response=ECR_Overlap),(Channel=\"PawnOverlapChar\",Response=ECR_Overlap),(Channel=\"WarriOrbCapsule\",Response=ECR_Overlap)),HelpMessage=\"Needs description\",bCanModify=True)\n+Profiles=(Name=\"TriggerTriggerProjectileOnly\",CollisionEnabled=QueryAndPhysics,ObjectTypeName=\"WorldStatic\",CustomResponses=((Channel=\"WorldStatic\",Response=ECR_Ignore),(Channel=\"WorldDynamic\",Response=ECR_Ignore),(Channel=\"Pawn\",Response=ECR_Ignore),(Channel=\"Visibility\",Response=ECR_Ignore),(Channel=\"Camera\",Response=ECR_Ignore),(Channel=\"PhysicsBody\",Response=ECR_Ignore),(Channel=\"Vehicle\",Response=ECR_Ignore),(Channel=\"Destructible\",Response=ECR_Ignore),(Channel=\"TriggerProjectile\",Response=ECR_Overlap),(Channel=\"PawnOverlapChar\",Response=ECR_Ignore),(Channel=\"WarriOrbCapsule\",Response=ECR_Ignore)),HelpMessage=\"Needs description\",bCanModify=True)\n+Profiles=(Name=\"TriggerProjectile\",CollisionEnabled=QueryAndPhysics,ObjectTypeName=\"TriggerProjectile\",CustomResponses=((Channel=\"Pawn\",Response=ECR_Ignore),(Channel=\"Visibility\",Response=ECR_Ignore),(Channel=\"Camera\",Response=ECR_Ignore),(Channel=\"PhysicsBody\",Response=ECR_Overlap),(Channel=\"Projectile\"),(Channel=\"TriggerProjectile\"),(Channel=\"PawnOverlapChar\",Response=ECR_Ignore),(Channel=\"WarriOrbCapsule\",Response=ECR_Overlap)),HelpMessage=\"Needs description\",bCanModify=True)\n+Profiles=(Name=\"SoPlayerCharacter\",CollisionEnabled=QueryAndPhysics,ObjectTypeName=\"WarriOrbCapsule\",CustomResponses=((Channel=\"Pawn\",Response=ECR_Ignore),(Channel=\"Visibility\",Response=ECR_Ignore),(Channel=\"PhysicsBody\",Response=ECR_Overlap),(Channel=\"Projectile\",Response=ECR_Overlap),(Channel=\"CharacterLogic\",Response=ECR_Overlap),(Channel=\"SplineMoverLogic\",Response=ECR_Overlap),(Channel=\"Weapon\",Response=ECR_Overlap),(Channel=\"TriggerProjectile\",Response=ECR_Overlap),(Channel=\"PawnOverlapChar\",Response=ECR_Overlap),(Channel=\"WarriOrbCapsule\",Response=ECR_Ignore)),HelpMessage=\"Used for player character when he is alive\",bCanModify=True)\n+Profiles=(Name=\"SoPlayerCharacterDisabled\",CollisionEnabled=QueryOnly,ObjectTypeName=\"WarriOrbCapsule\",CustomResponses=((Channel=\"WorldStatic\",Response=ECR_Ignore),(Channel=\"WorldDynamic\",Response=ECR_Ignore),(Channel=\"Pawn\",Response=ECR_Ignore),(Channel=\"Visibility\",Response=ECR_Ignore),(Channel=\"PhysicsBody\",Response=ECR_Ignore),(Channel=\"Vehicle\",Response=ECR_Ignore),(Channel=\"Destructible\",Response=ECR_Ignore),(Channel=\"CharacterLogic\",Response=ECR_Overlap),(Channel=\"SplineMoverLogic\",Response=ECR_Overlap),(Channel=\"PawnOverlapChar\",Response=ECR_Ignore),(Channel=\"WarriOrbCapsule\",Response=ECR_Ignore)),HelpMessage=\"Character when died or something\",bCanModify=True)\n+Profiles=(Name=\"SoEnemyNoMeshOverlap\",CollisionEnabled=QueryAndPhysics,ObjectTypeName=\"PawnOverlapChar\",CustomResponses=((Channel=\"PhysicsBody\",Response=ECR_Overlap),(Channel=\"Projectile\"),(Channel=\"CharacterLogic\",Response=ECR_Overlap),(Channel=\"SplineMoverLogic\",Response=ECR_Overlap),(Channel=\"TriggerProjectile\"),(Channel=\"TestStone\")),HelpMessage=\"Used when capsule is used instead of mesh for overlaps\",bCanModify=True)\n+Profiles=(Name=\"SoEnemyCapsule\",CollisionEnabled=QueryAndPhysics,ObjectTypeName=\"Pawn\",CustomResponses=((Channel=\"PhysicsBody\",Response=ECR_Overlap),(Channel=\"Destructible\",Response=ECR_Ignore),(Channel=\"CharacterLogic\",Response=ECR_Overlap),(Channel=\"SplineMoverLogic\",Response=ECR_Overlap)),HelpMessage=\"Needs description\",bCanModify=True)\n+Profiles=(Name=\"TriggerCharacterOnly\",CollisionEnabled=QueryOnly,ObjectTypeName=\"CharacterLogic\",CustomResponses=((Channel=\"WorldStatic\",Response=ECR_Ignore),(Channel=\"WorldDynamic\",Response=ECR_Ignore),(Channel=\"Pawn\",Response=ECR_Ignore),(Channel=\"Visibility\",Response=ECR_Ignore),(Channel=\"Camera\",Response=ECR_Ignore),(Channel=\"PhysicsBody\",Response=ECR_Ignore),(Channel=\"Vehicle\",Response=ECR_Ignore),(Channel=\"Destructible\",Response=ECR_Ignore),(Channel=\"PawnOverlapChar\",Response=ECR_Ignore),(Channel=\"WarriOrbCapsule\",Response=ECR_Overlap)),HelpMessage=\"Needs description\",bCanModify=True)\n+DefaultChannelResponses=(Channel=ECC_GameTraceChannel1,Name=\"Projectile\",DefaultResponse=ECR_Ignore,bTraceType=False,bStaticObject=False)\n+DefaultChannelResponses=(Channel=ECC_GameTraceChannel2,Name=\"CharacterLogic\",DefaultResponse=ECR_Ignore,bTraceType=False,bStaticObject=False)\n+DefaultChannelResponses=(Channel=ECC_GameTraceChannel3,Name=\"SplineMoverLogic\",DefaultResponse=ECR_Ignore,bTraceType=False,bStaticObject=False)\n+DefaultChannelResponses=(Channel=ECC_GameTraceChannel4,Name=\"Weapon\",DefaultResponse=ECR_Ignore,bTraceType=False,bStaticObject=False)\n+DefaultChannelResponses=(Channel=ECC_GameTraceChannel6,Name=\"TriggerProjectile\",DefaultResponse=ECR_Ignore,bTraceType=False,bStaticObject=False)\n+DefaultChannelResponses=(Channel=ECC_GameTraceChannel7,Name=\"TestStone\",DefaultResponse=ECR_Ignore,bTraceType=False,bStaticObject=False)\n+DefaultChannelResponses=(Channel=ECC_GameTraceChannel8,Name=\"PawnOverlapChar\",DefaultResponse=ECR_Block,bTraceType=False,bStaticObject=False)\n+DefaultChannelResponses=(Channel=ECC_GameTraceChannel9,Name=\"WarriOrbCapsule\",DefaultResponse=ECR_Block,bTraceType=False,bStaticObject=False)\n+EditProfiles=(Name=\"OverlapAll\",CustomResponses=((Channel=\"Projectile\",Response=ECR_Overlap),(Channel=\"TriggerProjectile\",Response=ECR_Ignore),(Channel=\"TestStone\",Response=ECR_Overlap),(Channel=\"PawnOverlapChar\",Response=ECR_Overlap),(Channel=\"WarriOrbCapsule\",Response=ECR_Overlap)))\n+EditProfiles=(Name=\"OverlapAllDynamic\",CustomResponses=((Channel=\"Projectile\",Response=ECR_Overlap),(Channel=\"SplineMoverLogic\",Response=ECR_Overlap),(Channel=\"TestStone\",Response=ECR_Overlap),(Channel=\"PawnOverlapChar\",Response=ECR_Overlap),(Channel=\"WarriOrbCapsule\",Response=ECR_Overlap)))\n+EditProfiles=(Name=\"Pawn\",CustomResponses=((Channel=\"CharacterLogic\",Response=ECR_Overlap),(Channel=\"SplineMoverLogic\",Response=ECR_Overlap),(Channel=\"Projectile\",Response=ECR_Ignore),(Channel=\"PhysicsBody\",Response=ECR_Overlap)))\n+EditProfiles=(Name=\"Trigger\",CustomResponses=((Channel=\"Projectile\",Response=ECR_Ignore),(Channel=\"TriggerProjectile\",Response=ECR_Overlap),(Channel=\"TestStone\",Response=ECR_Overlap),(Channel=\"PawnOverlapChar\",Response=ECR_Overlap),(Channel=\"WarriOrbCapsule\",Response=ECR_Overlap)))\n+EditProfiles=(Name=\"BlockAllDynamic\",CustomResponses=((Channel=\"SplineMoverLogic\",Response=ECR_Overlap),(Channel=\"Projectile\"),(Channel=\"TriggerProjectile\"),(Channel=\"TestStone\")))\n+EditProfiles=(Name=\"IgnoreOnlyPawn\",CustomResponses=((Channel=\"SplineMoverLogic\",Response=ECR_Overlap),(Channel=\"TriggerProjectile\"),(Channel=\"TestStone\"),(Channel=\"PawnOverlapChar\",Response=ECR_Ignore),(Channel=\"WarriOrbCapsule\",Response=ECR_Ignore)))\n+EditProfiles=(Name=\"Destructible\",CustomResponses=((Channel=\"SplineMoverLogic\",Response=ECR_Overlap),(Channel=\"TriggerProjectile\"),(Channel=\"TestStone\"),(Channel=\"PawnOverlapChar\",Response=ECR_Ignore),(Channel=\"WarriOrbCapsule\",Response=ECR_Ignore)))\n+EditProfiles=(Name=\"BlockAll\",CustomResponses=((Channel=\"Projectile\"),(Channel=\"TriggerProjectile\"),(Channel=\"TestStone\")))\n+EditProfiles=(Name=\"Ragdoll\",CustomResponses=((Channel=\"Pawn\"),(Channel=\"TriggerProjectile\"),(Channel=\"TestStone\")))\n+EditProfiles=(Name=\"CharacterMesh\",CustomResponses=((Channel=\"TriggerProjectile\"),(Channel=\"TestStone\"),(Channel=\"PawnOverlapChar\",Response=ECR_Ignore),(Channel=\"WarriOrbCapsule\",Response=ECR_Ignore)))\n+EditProfiles=(Name=\"PhysicsActor\",CustomResponses=((Channel=\"TriggerProjectile\"),(Channel=\"TestStone\")))\n+EditProfiles=(Name=\"InvisibleWall\",CustomResponses=((Channel=\"TriggerProjectile\"),(Channel=\"TestStone\")))\n+EditProfiles=(Name=\"InvisibleWallDynamic\",CustomResponses=((Channel=\"TriggerProjectile\"),(Channel=\"TestStone\")))\n+EditProfiles=(Name=\"Vehicle\",CustomResponses=((Channel=\"TriggerProjectile\"),(Channel=\"TestStone\")))\n+EditProfiles=(Name=\"OverlapOnlyPawn\",CustomResponses=((Channel=\"PawnOverlapChar\",Response=ECR_Overlap),(Channel=\"WarriOrbCapsule\",Response=ECR_Overlap)))\n+EditProfiles=(Name=\"UI\",CustomResponses=((Channel=\"PawnOverlapChar\",Response=ECR_Overlap),(Channel=\"WarriOrbCapsule\",Response=ECR_Overlap)))\n-ProfileRedirects=(OldName=\"BlockingVolume\",NewName=\"InvisibleWall\")\n-ProfileRedirects=(OldName=\"InterpActor\",NewName=\"IgnoreOnlyPawn\")\n-ProfileRedirects=(OldName=\"StaticMeshComponent\",NewName=\"BlockAllDynamic\")\n-ProfileRedirects=(OldName=\"SkeletalMeshActor\",NewName=\"PhysicsActor\")\n-ProfileRedirects=(OldName=\"InvisibleActor\",NewName=\"InvisibleWallDynamic\")\n+ProfileRedirects=(OldName=\"BlockingVolume\",NewName=\"InvisibleWall\")\n+ProfileRedirects=(OldName=\"InterpActor\",NewName=\"IgnoreOnlyPawn\")\n+ProfileRedirects=(OldName=\"StaticMeshComponent\",NewName=\"BlockAllDynamic\")\n+ProfileRedirects=(OldName=\"SkeletalMeshActor\",NewName=\"PhysicsActor\")\n+ProfileRedirects=(OldName=\"InvisibleActor\",NewName=\"InvisibleWallDynamic\")\n+ProfileRedirects=(OldName=\"BlockPhysical\",NewName=\"ProjectleDynamic\")\n+ProfileRedirects=(OldName=\"TriggerPawnAndTriggerProjectile\",NewName=\"TriggerPawnTestStoneAndTriggerProj\")\n-CollisionChannelRedirects=(OldName=\"Static\",NewName=\"WorldStatic\")\n-CollisionChannelRedirects=(OldName=\"Dynamic\",NewName=\"WorldDynamic\")\n-CollisionChannelRedirects=(OldName=\"VehicleMovement\",NewName=\"Vehicle\")\n-CollisionChannelRedirects=(OldName=\"PawnMovement\",NewName=\"Pawn\")\n+CollisionChannelRedirects=(OldName=\"Static\",NewName=\"WorldStatic\")\n+CollisionChannelRedirects=(OldName=\"Dynamic\",NewName=\"WorldDynamic\")\n+CollisionChannelRedirects=(OldName=\"VehicleMovement\",NewName=\"Vehicle\")\n+CollisionChannelRedirects=(OldName=\"PawnMovement\",NewName=\"Pawn\")\n\n[/Script/Engine.PhysicsSettings]\nDefaultGravityZ=-980.000000\nDefaultTerminalVelocity=4000.000000\nDefaultFluidFriction=0.300000\nSimulateScratchMemorySize=262144\nRagdollAggregateThreshold=4\nTriangleMeshTriangleMinAreaThreshold=5.000000\nbEnableShapeSharing=False\nbEnablePCM=False\nbEnableStabilization=False\nbWarnMissingLocks=True\nbEnable2DPhysics=False\nPhysicErrorCorrection=(PingExtrapolation=0.100000,PingLimit=100.000000,ErrorPerLinearDifference=1.000000,ErrorPerAngularDifference=1.000000,MaxRestoredStateError=1.000000,MaxLinearHardSnapDistance=400.000000,PositionLerp=0.000000,AngleLerp=0.400000,LinearVelocityCoefficient=100.000000,AngularVelocityCoefficient=10.000000,ErrorAccumulationSeconds=0.500000,ErrorAccumulationDistanceSq=15.000000,ErrorAccumulationSimilarity=100.000000)\nLockedAxis=Invalid\nDefaultDegreesOfFreedom=Full3D\nBounceThresholdVelocity=200.000000\nFrictionCombineMode=Average\nRestitutionCombineMode=Average\nMaxAngularVelocity=3600.000000\nMaxDepenetrationVelocity=0.000000\nContactOffsetMultiplier=0.010000\nMinContactOffset=0.000100\nMaxContactOffset=1.000000\nbSimulateSkeletalMeshOnDedicatedServer=True\nDefaultShapeComplexity=CTF_UseSimpleAndComplex\nbDefaultHasComplexCollision=True\nbSuppressFaceRemapTable=False\nbSupportUVFromHitResults=False\nbDisableActiveActors=False\nbDisableKinematicStaticPairs=False\nbDisableKinematicKinematicPairs=False\nbDisableCCD=False\nbEnableEnhancedDeterminism=False\nMaxPhysicsDeltaTime=0.033333\nbSubstepping=False\nbSubsteppingAsync=False\nMaxSubstepDeltaTime=0.016667\nMaxSubsteps=6\nSyncSceneSmoothingFactor=0.000000\nInitialAverageFrameRate=0.016667\nPhysXTreeRebuildRate=10\n+PhysicalSurfaces=(Type=SurfaceType1,Name=\"Stone\")\n+PhysicalSurfaces=(Type=SurfaceType2,Name=\"Wood\")\n+PhysicalSurfaces=(Type=SurfaceType3,Name=\"Carpet\")\n+PhysicalSurfaces=(Type=SurfaceType4,Name=\"Iron\")\n+PhysicalSurfaces=(Type=SurfaceType5,Name=\"Ground\")\nDefaultBroadphaseSettings=(bUseMBPOnClient=False,bUseMBPOnServer=False,MBPBounds=(Min=(X=0.000000,Y=0.000000,Z=0.000000),Max=(X=0.000000,Y=0.000000,Z=0.000000),IsValid=0),MBPNumSubdivs=2)\n\n\n"
  },
  {
    "path": "Config/DefaultGame.ini",
    "content": "[/Script/EngineSettings.GeneralProjectSettings]\nProjectID=1AC06AF0482C0EE629DBDD998D46CAB0\nProjectName=WarriOrb\nProjectVersion=1.3.1\nCompanyName=Not Yet Entertainment Kft.\nCopyrightNotice=2016 - 2020 Copyright Not Yet Entertainment Kft.\nHomepage=\"https://www.warriorb.com\"\nSupportContact=support@notyet.eu\nDescription=Action platformer\nbShouldWindowPreserveAspectRatio=True\nbUseBorderlessWindow=False\nbAllowWindowResize=True\nbAllowClose=True\nbAllowMaximize=True\nbAllowMinimize=True\nProjectDisplayedTitle=INVTEXT(\"WarriOrb\")\nProjectDebugTitleInfo=INVTEXT(\"({PlatformArchitecture}-bit {BuildConfiguration} {RHIName})\")\nCompanyDistinguishedName=\n\n[Staging]\n+WhitelistDirectories=Warriorb/Content/SO/GUI/art/CntrlIcon/NintendoSwitch\n+WhitelistConfigFiles=Warriorb/Config/DefaultNYLoadingScreenSettings.ini\n+WhitelistConfigFiles=Warriorb/Config/DefaultSoAchievementSettings.ini\n+WhitelistConfigFiles=Warriorb/Config/DefaultSoGameSingleton.ini\n+WhitelistConfigFiles=Warriorb/Config/DefaultSoInputSettings.ini\n+BlacklistConfigFiles=Warriorb/Config/Saved/Config/CrashReportClient/*\n+BlacklistConfigFiles=Warriorb/Config/Saved/Config/ConsoleHistory.ini\n\n[Internationalization]\n+LocalizationPaths=%GAMEDIR%Content/Localization/Warriorb\n+LocalizationPaths=%GAMEDIR%Content/Localization/WarriorbDemo\n+LocalizationPaths=%GAMEDIR%Content/Localization/WarriorbDialogues\n+CultureMappings=\"es-AR;es-419\"\n+CultureMappings=\"es-BO;es-419\"\n+CultureMappings=\"es-CL;es-419\"\n+CultureMappings=\"es-CO;es-419\"\n+CultureMappings=\"es-CR;es-419\"\n+CultureMappings=\"es-CU;es-419\"\n+CultureMappings=\"es-DO;es-419\"\n+CultureMappings=\"es-EC;es-419\"\n+CultureMappings=\"es-GT;es-419\"\n+CultureMappings=\"es-HN;es-419\"\n+CultureMappings=\"es-MX;es-419\"\n+CultureMappings=\"es-NI;es-419\"\n+CultureMappings=\"es-PA;es-419\"\n+CultureMappings=\"es-PE;es-419\"\n+CultureMappings=\"es-PR;es-419\"\n+CultureMappings=\"es-PY;es-419\"\n+CultureMappings=\"es-SV;es-419\"\n+CultureMappings=\"es-US;es-419\"\n+CultureMappings=\"es-UY;es-419\"\n+CultureMappings=\"es-VE;es-419\"\n\n[/Script/UnrealEd.ProjectPackagingSettings]\nBuild=IfProjectHasCode\nBuildConfiguration=PPBC_Development\nStagingDirectory=(Path=\"C:/TestBuilds/W_S_2020_07_11_Full\")\nFullRebuild=True\nForDistribution=False\nIncludeDebugFiles=True\nBlueprintNativizationMethod=Disabled\nbIncludeNativizedAssetsInProjectGeneration=False\nbExcludeMonolithicEngineHeadersInNativizedCode=False\nUsePakFile=True\nbGenerateChunks=False\nbGenerateNoChunks=False\nbChunkHardReferencesOnly=False\nbForceOneChunkPerFile=False\nMaxChunkSize=0\nbBuildHttpChunkInstallData=False\nHttpChunkInstallDataDirectory=(Path=\"\")\nPakFileCompressionFormats=\nPakFileAdditionalCompressionOptions=\nHttpChunkInstallDataVersion=\nIncludePrerequisites=True\nIncludeAppLocalPrerequisites=False\nbShareMaterialShaderCode=False\nbSharedMaterialNativeLibraries=False\nApplocalPrerequisitesDirectory=(Path=\"\")\nIncludeCrashReporter=True\nInternationalizationPreset=All\n-CulturesToStage=en\n+CulturesToStage=en\n+CulturesToStage=en-001\n+CulturesToStage=en-150\n+CulturesToStage=en-AG\n+CulturesToStage=en-AI\n+CulturesToStage=en-AS\n+CulturesToStage=en-AU\n+CulturesToStage=en-BB\n+CulturesToStage=en-BE\n+CulturesToStage=en-BM\n+CulturesToStage=en-BS\n+CulturesToStage=en-BW\n+CulturesToStage=en-BZ\n+CulturesToStage=en-CA\n+CulturesToStage=en-CC\n+CulturesToStage=en-CK\n+CulturesToStage=en-CX\n+CulturesToStage=en-CM\n+CulturesToStage=en-DG\n+CulturesToStage=en-DM\n+CulturesToStage=en-ER\n+CulturesToStage=en-FK\n+CulturesToStage=en-FJ\n+CulturesToStage=en-FM\n+CulturesToStage=en-GB\n+CulturesToStage=en-GD\n+CulturesToStage=en-GG\n+CulturesToStage=en-GH\n+CulturesToStage=en-GI\n+CulturesToStage=en-GM\n+CulturesToStage=en-GU\n+CulturesToStage=en-GY\n+CulturesToStage=en-HK\n+CulturesToStage=en-IE\n+CulturesToStage=en-IM\n+CulturesToStage=en-IN\n+CulturesToStage=en-IO\n+CulturesToStage=en-JE\n+CulturesToStage=en-JM\n+CulturesToStage=en-KE\n+CulturesToStage=en-KI\n+CulturesToStage=en-KN\n+CulturesToStage=en-KY\n+CulturesToStage=en-LC\n+CulturesToStage=en-LR\n+CulturesToStage=en-LS\n+CulturesToStage=en-MG\n+CulturesToStage=en-MH\n+CulturesToStage=en-MO\n+CulturesToStage=en-MP\n+CulturesToStage=en-MS\n+CulturesToStage=en-MU\n+CulturesToStage=en-MT\n+CulturesToStage=en-MW\n+CulturesToStage=en-NA\n+CulturesToStage=en-NF\n+CulturesToStage=en-NG\n+CulturesToStage=en-NR\n+CulturesToStage=en-NU\n+CulturesToStage=en-NZ\n+CulturesToStage=en-PG\n+CulturesToStage=en-PH\n+CulturesToStage=en-PK\n+CulturesToStage=en-PN\n+CulturesToStage=en-PR\n+CulturesToStage=en-RW\n+CulturesToStage=en-PW\n+CulturesToStage=en-SB\n+CulturesToStage=en-SC\n+CulturesToStage=en-SD\n+CulturesToStage=en-SG\n+CulturesToStage=en-SH\n+CulturesToStage=en-SL\n+CulturesToStage=en-SS\n+CulturesToStage=en-SX\n+CulturesToStage=en-SZ\n+CulturesToStage=en-TC\n+CulturesToStage=en-TK\n+CulturesToStage=en-TO\n+CulturesToStage=en-TT\n+CulturesToStage=en-TV\n+CulturesToStage=en-TZ\n+CulturesToStage=en-UG\n+CulturesToStage=en-UM\n+CulturesToStage=en-US\n+CulturesToStage=en-VC\n+CulturesToStage=en-VG\n+CulturesToStage=en-VI\n+CulturesToStage=en-VU\n+CulturesToStage=en-WS\n+CulturesToStage=en-ZA\n+CulturesToStage=en-ZM\n+CulturesToStage=en-ZW\n+CulturesToStage=hu\n+CulturesToStage=hu-HU\n+CulturesToStage=ro-MD\n+CulturesToStage=ro-RO\n+CulturesToStage=ro\n+CulturesToStage=zh-Hans\n+CulturesToStage=zh-CN\n+CulturesToStage=zh-Hans-CN\n+CulturesToStage=zh-HK\n+CulturesToStage=zh-Hans-HK\n+CulturesToStage=zh-MO\n+CulturesToStage=zh-Hans-MO\n+CulturesToStage=zh-SG\n+CulturesToStage=zh-Hans-SG\n+CulturesToStage=zh-Hant\n+CulturesToStage=zh-Hant-HK\n+CulturesToStage=zh-Hant-MO\n+CulturesToStage=zh-TW\n+CulturesToStage=zh-Hant-TW\n+CulturesToStage=en-US-POSIX\n+CulturesToStage=es\n+CulturesToStage=es-419\n+CulturesToStage=es-AR\n+CulturesToStage=es-BO\n+CulturesToStage=es-CL\n+CulturesToStage=es-CO\n+CulturesToStage=es-CR\n+CulturesToStage=es-CU\n+CulturesToStage=es-DO\n+CulturesToStage=es-EA\n+CulturesToStage=es-EC\n+CulturesToStage=es-ES\n+CulturesToStage=es-GQ\n+CulturesToStage=es-GT\n+CulturesToStage=es-HN\n+CulturesToStage=es-IC\n+CulturesToStage=es-MX\n+CulturesToStage=es-NI\n+CulturesToStage=es-PA\n+CulturesToStage=es-PH\n+CulturesToStage=es-PE\n+CulturesToStage=es-PR\n+CulturesToStage=es-PY\n+CulturesToStage=es-SV\n+CulturesToStage=es-US\n+CulturesToStage=es-UY\n+CulturesToStage=es-VE\n+CulturesToStage=fr\n+CulturesToStage=fr-BE\n+CulturesToStage=fr-BF\n+CulturesToStage=fr-BI\n+CulturesToStage=fr-BJ\n+CulturesToStage=fr-BL\n+CulturesToStage=fr-CA\n+CulturesToStage=fr-CD\n+CulturesToStage=fr-CF\n+CulturesToStage=fr-CG\n+CulturesToStage=fr-CH\n+CulturesToStage=fr-CI\n+CulturesToStage=fr-DJ\n+CulturesToStage=fr-CM\n+CulturesToStage=fr-DZ\n+CulturesToStage=fr-FR\n+CulturesToStage=fr-GA\n+CulturesToStage=fr-GF\n+CulturesToStage=fr-GN\n+CulturesToStage=fr-GP\n+CulturesToStage=fr-GQ\n+CulturesToStage=fr-HT\n+CulturesToStage=fr-KM\n+CulturesToStage=fr-LU\n+CulturesToStage=fr-MA\n+CulturesToStage=fr-MC\n+CulturesToStage=fr-MF\n+CulturesToStage=fr-MG\n+CulturesToStage=fr-ML\n+CulturesToStage=fr-MQ\n+CulturesToStage=fr-MR\n+CulturesToStage=fr-MU\n+CulturesToStage=fr-NE\n+CulturesToStage=fr-NC\n+CulturesToStage=fr-PF\n+CulturesToStage=fr-PM\n+CulturesToStage=fr-RE\n+CulturesToStage=fr-RW\n+CulturesToStage=fr-SC\n+CulturesToStage=fr-SN\n+CulturesToStage=fr-SY\n+CulturesToStage=fr-TD\n+CulturesToStage=fr-TG\n+CulturesToStage=fr-TN\n+CulturesToStage=fr-VU\n+CulturesToStage=fr-WF\n+CulturesToStage=fr-YT\n+CulturesToStage=ru\n+CulturesToStage=ru-BY\n+CulturesToStage=ru-KZ\n+CulturesToStage=ru-KG\n+CulturesToStage=ru-MD\n+CulturesToStage=ru-RU\n+CulturesToStage=ru-UA\nbCookAll=False\nbCookMapsOnly=True\nbCompressed=False\nbEncryptIniFiles=False\nbEncryptPakIndex=False\nGenerateEarlyDownloaderPakFile=False\nbSkipEditorContent=False\nbSkipMovies=True\n+UFSMovies=WarriOrbIntro\n-EarlyDownloaderPakFileFiles=...\\Content\\Internationalization\\...\\*.icu\n-EarlyDownloaderPakFileFiles=...\\Content\\Internationalization\\...\\*.brk\n-EarlyDownloaderPakFileFiles=...\\Content\\Internationalization\\...\\*.res\n-EarlyDownloaderPakFileFiles=...\\Content\\Internationalization\\...\\*.nrm\n-EarlyDownloaderPakFileFiles=...\\Content\\Internationalization\\...\\*.cfu\n-EarlyDownloaderPakFileFiles=...\\Content\\Localization\\...\\*.*\n-EarlyDownloaderPakFileFiles=...\\Content\\Localization\\*.*\n-EarlyDownloaderPakFileFiles=...\\Content\\Certificates\\...\\*.*\n-EarlyDownloaderPakFileFiles=...\\Content\\Certificates\\*.*\n-EarlyDownloaderPakFileFiles=-...\\Content\\Localization\\Game\\...\\*.*\n-EarlyDownloaderPakFileFiles=-...\\Content\\Localization\\Game\\*.*\n-EarlyDownloaderPakFileFiles=...\\Config\\...\\*.ini\n-EarlyDownloaderPakFileFiles=...\\Config\\*.ini\n-EarlyDownloaderPakFileFiles=...\\Engine\\GlobalShaderCache*.bin\n-EarlyDownloaderPakFileFiles=...\\Content\\ShaderArchive-Global-*.ushaderbytecode\n-EarlyDownloaderPakFileFiles=...\\Content\\Slate\\*.*\n-EarlyDownloaderPakFileFiles=...\\Content\\Slate\\...\\*.*\n-EarlyDownloaderPakFileFiles=...\\*.upluginmanifest\n-EarlyDownloaderPakFileFiles=...\\*.uproject\n-EarlyDownloaderPakFileFiles=...\\global_sf*.metalmap\n+EarlyDownloaderPakFileFiles=...\\Content\\Internationalization\\...\\*.icu\n+EarlyDownloaderPakFileFiles=...\\Content\\Internationalization\\...\\*.brk\n+EarlyDownloaderPakFileFiles=...\\Content\\Internationalization\\...\\*.res\n+EarlyDownloaderPakFileFiles=...\\Content\\Internationalization\\...\\*.nrm\n+EarlyDownloaderPakFileFiles=...\\Content\\Internationalization\\...\\*.cfu\n+EarlyDownloaderPakFileFiles=...\\Content\\Localization\\...\\*.*\n+EarlyDownloaderPakFileFiles=...\\Content\\Localization\\*.*\n+EarlyDownloaderPakFileFiles=...\\Content\\Certificates\\...\\*.*\n+EarlyDownloaderPakFileFiles=...\\Content\\Certificates\\*.*\n+EarlyDownloaderPakFileFiles=-...\\Content\\Localization\\Game\\...\\*.*\n+EarlyDownloaderPakFileFiles=-...\\Content\\Localization\\Game\\*.*\n+EarlyDownloaderPakFileFiles=...\\Config\\...\\*.ini\n+EarlyDownloaderPakFileFiles=...\\Config\\*.ini\n+EarlyDownloaderPakFileFiles=...\\Engine\\GlobalShaderCache*.bin\n+EarlyDownloaderPakFileFiles=...\\Content\\ShaderArchive-Global-*.ushaderbytecode\n+EarlyDownloaderPakFileFiles=...\\Content\\Slate\\*.*\n+EarlyDownloaderPakFileFiles=...\\Content\\Slate\\...\\*.*\n+EarlyDownloaderPakFileFiles=...\\*.upluginmanifest\n+EarlyDownloaderPakFileFiles=...\\*.uproject\n+EarlyDownloaderPakFileFiles=...\\global_sf*.metalmap\n+DirectoriesToAlwaysCook=(Path=\"/Game/SO/CharacterStrikes\")\n+DirectoriesToAlwaysCook=(Path=\"/Game/SO/Items\")\n+DirectoriesToAlwaysCook=(Path=\"/Game/SO/GUI/art/Loading/MainGameLoadingImgs\")\n+DirectoriesToNeverCook=(Path=\"/Game/SO/Maps/PrototypeLevels\")\n+DirectoriesToNeverCook=(Path=\"/Game/SO/Maps/SavedLevelsFromAct2\")\n+DirectoriesToNeverCook=(Path=\"/Game/Movies/Demo\")\n+DirectoriesToNeverCook=(Path=\"/Game/SO/Maps/CustomMaps\")\n+DirectoriesToNeverCook=(Path=\"/Engine/Maps\")\n+DirectoriesToNeverCook=(Path=\"/Engine/MobileResources\")\n+DirectoriesToNeverCook=(Path=\"/Engine/VREditor\")\n+DirectoriesToNeverCook=(Path=\"/Engine/EditorSounds\")\n+DirectoriesToNeverCook=(Path=\"/DlgSystem\")\n+DirectoriesToAlwaysStageAsUFS=(Path=\"SO/Data/CameraData\")\n+DirectoriesToAlwaysStageAsUFS=(Path=\"SO/Data\")\n+DirectoriesToAlwaysStageAsUFS=(Path=\"SO/AIConfig/ActionLists\")\n+DirectoriesToAlwaysStageAsUFS=(Path=\"SO/AIConfig/StrikeMaps\")\n+DirectoriesToAlwaysStageAsUFS=(Path=\"SO/AIConfig\")\n+DirectoriesToAlwaysStageAsUFS=(Path=\"Localization/StringTables\")\n+DirectoriesToAlwaysStageAsNonUFS=(Path=\"FMOD\")\n+DirectoriesToAlwaysStageAsNonUFS=(Path=\"Splash\")\nbNativizeBlueprintAssets=False\nbNativizeOnlySelectedBlueprints=False\n\n\n"
  },
  {
    "path": "Config/DefaultGameUserSettings.ini",
    "content": "; 0:low, 1:med, 2:high, 3:epic, 4:cinematic, default: 3\n[ScalabilityGroups]\nsg.ResolutionQuality=100\nsg.ViewDistanceQuality=2\nsg.AntiAliasingQuality=2\nsg.ShadowQuality=2\nsg.PostProcessQuality=2\nsg.TextureQuality=2\nsg.EffectsQuality=2\nsg.FoliageQuality=2\n\n[/Script/SOrb.SoGameSettings]\n;\n; NOTE: these settings set precedence over the the C++ class\n;\n; bDisplayFPS=False\n; bDisplayTime=False\n; bDisplayDamageTexts=True\n; bDisplayEnemyHealthBar=True\n; bDisplayFloatingVOLines=True\n; bControllerVibration=True\n; bDisplayStat=False\n\n; Demo settings\n; bVideoDemoDisableMainMenu=True\n; bVideoDemoStartVideoOnIdle=True\n; VideoDemoIdleTimeSecondsStartVideo=30\n; bPauseGameWhenUnfocused=False\n\n; Pause game functionality\n;bPauseGameWhenUnfocused=True\n;IdleTimeSecondsBeforeGamePause=60\n\n; Analytics\n; NOTE: Disable this when we are not sending data\n; bCollectGameAnalytics=False\n\n; Different than zero it means that it was set by the user\n; UnixTimeModifiedCollectGameAnalytics=0\n; bWaitForAnalyticsToSend=True\n; AnalyticsWaitSeconds=0.5\n; AnalyticsProcessEventsSeconds=2.0\n\n; Save/Load Values\n;bAutoSaveAndLoad=True\n;bAutoBackupDeletedSaves=True\n;bAutoBackupBeforeSave=True\n\n; Use Main Display\n; NOTE: Must run the game with -SAVEWINPOS=1\nWindowPosX=0\nWindowPosY=0\n\nbUseVSync=False\nResolutionSizeX=1280\nResolutionSizeY=720\nLastUserConfirmedResolutionSizeX=1280\nLastUserConfirmedResolutionSizeY=720\nDesiredScreenWidth=1280\nDesiredScreenHeight=720\n\nbUseDesiredScreenHeight=False\nFullscreenMode=1\nLastConfirmedFullscreenMode=1\nFrameRateLimit=9999.000000\n\n# Audio\nbMuteAudio=False\nVolumeMaster=1.000000\nVolumeMusic=1.000000\nVolumeSFX=1.000000\n;bMuteVoiceGibberish=False\n;bMuteDialogueVoiceGibberish=False\n\n; NOTE do not ever write the Version here, if you do, make 100% sure it is the same number as SO_GAMEUSERSETTINGS_VERSION\n; Version=12\n"
  },
  {
    "path": "Config/DefaultHardware.ini",
    "content": ";\n; Copied from 4.25 BaseHardware.ini\n; =====================\n;\n; Hardware checks are controlled by the console variable \"r.WarnOfBadDrivers\". The the console variable options for more information.\n;\n; What to do when a certain driver or hardware shows problems:\n;  - If the driver exhibiting the problem is old, add it to the blacklist with \"<=\". In general it's better to ask users to upgrade.\n;  - If the driver exhibiting the problem is the latest, add it to the blacklist with \">=\". We should not assume the next driver version fixes the problem.\n;\n; Expectations on QA:\n;  - QA always tests the latest driver version.\n;  - When a new driver is released, QA should test it and if it does not introduce bugs the SuggestedDriverVersion should be updated to the latest driver.\n;  - If the latest driver is blacklisted, it is not removed until QA verifies it is fixed.\n;  - If driver specific bugs are found, enter them in JIRA so that they can be tracked.\n;\n; Expectations on Engineering:\n;  - Bugs on older drivers are added to the blacklist and otherwise ignored.\n;  - Bugs on the latest driver are added to the blacklist but treated as critical bugs for which we must try to find a workaround. We must also notify the IHV to help if we cannot find the problem.\n;\n; INI sections:\n;    [GPU_NVIDIA] [GPU_AMD] [GPU_Intel]\n;\n; Explanation of the INI entries:\n;  - \"SuggestedDriverVersion\": string used to communicate to the user which driver version is appropriate (not used by any code), empty if unknown.\n;\t\tCan use multiple so we can add per RHI appending \";D3D12\" for instance for a specific RHI; having no ';RHI' will return that one if the RHI is not found\n;  - \"Blacklist\": array of tests that can be made to mark a driver or a range of them as problematic\n;    \"DriverVersion\": to compare against the \"unified driver\" (see log) version e.g. \"123.45.2\" \"==123.45\" \"<123.45\", comparison operators: == != > < >= <=\n;    \"Reason\": string used to document the reason for blacklisting the driver, could be shown to the user\n;    comment above each blacklist entry: more details about the problem, potential workarounds\n;\n;-----------------------------------------------------------------------------------------------------------------\n\n[GPU_NVIDIA]\n; a newer one is out but has issues (see below)\nSuggestedDriverVersion=\"441.20\"\n\n; Seems this driver was not setting uninitialized global variables\n; (static, non const) to 0 but leaving them uninitialized.\n; Also blacklist future driver versions until QA has verified them to work.\n; NOTE: UE-25096 has been fixed and verified by QA.\n;+Blacklist=(DriverVersion=\">=361.43\", Reason=\"UE-25096 Viewport flashes black and white when moving in the scene on latest NVIDIA drivers\")\n\n; To prevent problems with older drivers.\n; We might have to adjust that further.\n+Blacklist=(DriverVersion=\"<=347.09\", Reason=\"Crashes with Paragon content using more recent GPU features\")\n\n; UE-35288, GPU hangs in 4.13 binary release.\n+Blacklist=(DriverVersion=\"==372.70\", Reason=\"This driver version has many known stability issues\")\n\n; UE-58673, GPU memory leak and hitching.\n+Blacklist=(DriverVersion=\"==388.31\", Reason=\"This driver version has known stability issues\")\n+Blacklist=(DriverVersion=\"==388.43\", Reason=\"This driver version has known stability issues\")\n+Blacklist=(DriverVersion=\"==388.71\", Reason=\"This driver version has known stability issues\")\n\n;-----------------------------------------------------------------------------------------------------------------\n\n[GPU_AMD]\n; From OR-27051 as of 8/4/2016 is 16.300.2311.0 7/18/2016 (Crimson Edition 16.9.2)\nSuggestedDriverVersion=\"19.11.1\"\n+SuggestedDriverVersion=\"19.20.1;D3D12\"\n\n; From OR-27051\n+Blacklist=(DriverVersion=\"==15.300.1025.1001\", Reason=\"Crashes with Paragon content using more recent GPU features\")\n\n; 2017 drivers and older contribute heavily to swapchain creation errors.\n+Blacklist=(DriverVersion=\"<=22.19.662.4\", Reason=\"Older drivers known to cause crashes with integrated laptop graphics on at least R5 and R6\")\n\n+Blacklist=(DriverVersion=\"<=26.20.13031.15006\", Reason=\"Driver crashes creating PSOs\", RHI=\"D3D12\")\n\n;-----------------------------------------------------------------------------------------------------------------\n\n[GPU_Intel]\nSuggestedDriverVersion=\"\"\n"
  },
  {
    "path": "Config/DefaultInput.ini",
    "content": "\n[/Script/Engine.InputSettings]\n-AxisConfig=(AxisKeyName=\"Gamepad_LeftX\",AxisProperties=(DeadZone=0.25,Exponent=1.f,Sensitivity=1.f))\n-AxisConfig=(AxisKeyName=\"Gamepad_LeftY\",AxisProperties=(DeadZone=0.25,Exponent=1.f,Sensitivity=1.f))\n-AxisConfig=(AxisKeyName=\"Gamepad_RightX\",AxisProperties=(DeadZone=0.25,Exponent=1.f,Sensitivity=1.f))\n-AxisConfig=(AxisKeyName=\"Gamepad_RightY\",AxisProperties=(DeadZone=0.25,Exponent=1.f,Sensitivity=1.f))\n-AxisConfig=(AxisKeyName=\"MouseX\",AxisProperties=(DeadZone=0.f,Exponent=1.f,Sensitivity=0.07f))\n-AxisConfig=(AxisKeyName=\"MouseY\",AxisProperties=(DeadZone=0.f,Exponent=1.f,Sensitivity=0.07f))\n+AxisConfig=(AxisKeyName=\"MouseWheelAxis\",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))\n+AxisConfig=(AxisKeyName=\"Gamepad_LeftTriggerAxis\",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))\n+AxisConfig=(AxisKeyName=\"Gamepad_RightTriggerAxis\",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))\n+AxisConfig=(AxisKeyName=\"MotionController_Left_Thumbstick_X\",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))\n+AxisConfig=(AxisKeyName=\"MotionController_Left_Thumbstick_Y\",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))\n+AxisConfig=(AxisKeyName=\"MotionController_Left_TriggerAxis\",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))\n+AxisConfig=(AxisKeyName=\"MotionController_Left_Grip1Axis\",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))\n+AxisConfig=(AxisKeyName=\"MotionController_Left_Grip2Axis\",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))\n+AxisConfig=(AxisKeyName=\"MotionController_Right_Thumbstick_X\",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))\n+AxisConfig=(AxisKeyName=\"MotionController_Right_Thumbstick_Y\",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))\n+AxisConfig=(AxisKeyName=\"MotionController_Right_TriggerAxis\",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))\n+AxisConfig=(AxisKeyName=\"MotionController_Right_Grip1Axis\",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))\n+AxisConfig=(AxisKeyName=\"MotionController_Right_Grip2Axis\",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))\n+AxisConfig=(AxisKeyName=\"Gamepad_Special_Left_X\",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))\n+AxisConfig=(AxisKeyName=\"Gamepad_Special_Left_Y\",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))\n+AxisConfig=(AxisKeyName=\"Gamepad_LeftX\",AxisProperties=(DeadZone=0.250000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))\n+AxisConfig=(AxisKeyName=\"Gamepad_LeftY\",AxisProperties=(DeadZone=0.250000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))\n+AxisConfig=(AxisKeyName=\"Gamepad_RightX\",AxisProperties=(DeadZone=0.250000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))\n+AxisConfig=(AxisKeyName=\"Gamepad_RightY\",AxisProperties=(DeadZone=0.250000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))\n+AxisConfig=(AxisKeyName=\"MouseX\",AxisProperties=(DeadZone=0.000000,Sensitivity=0.070000,Exponent=1.000000,bInvert=False))\n+AxisConfig=(AxisKeyName=\"MouseY\",AxisProperties=(DeadZone=0.000000,Sensitivity=0.070000,Exponent=1.000000,bInvert=False))\n+AxisConfig=(AxisKeyName=\"MotionController_Left_Thumbstick_Z\",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))\n+AxisConfig=(AxisKeyName=\"MotionController_Right_Thumbstick_Z\",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))\nbAltEnterTogglesFullscreen=True\nbF11TogglesFullscreen=True\nbUseMouseForTouch=False\nbEnableMouseSmoothing=True\nbEnableFOVScaling=True\nbCaptureMouseOnLaunch=True\nbDefaultViewportMouseLock=True\nbAlwaysShowTouchInterface=False\nbShowConsoleOnFourFingerTap=True\nbEnableGestureRecognizer=False\nbUseAutocorrect=False\nDefaultViewportMouseCaptureMode=CapturePermanently_IncludingInitialMouseDown\nDefaultViewportMouseLockMode=LockOnCapture\nFOVScale=0.011110\nDoubleClickTime=0.200000\n+ActionMappings=(ActionName=\"Roll\",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=K)\n+ActionMappings=(ActionName=\"Jump\",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=SpaceBar)\n+ActionMappings=(ActionName=\"Interact0\",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=R)\n+ActionMappings=(ActionName=\"Interact1\",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=T)\n+ActionMappings=(ActionName=\"Umbrella\",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=W)\n+ActionMappings=(ActionName=\"DebugFeature\",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=Z)\n+ActionMappings=(ActionName=\"Roll\",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=Gamepad_LeftShoulder)\n+ActionMappings=(ActionName=\"Jump\",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=Gamepad_FaceButton_Bottom)\n+ActionMappings=(ActionName=\"Interact0\",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=Gamepad_LeftTrigger)\n+ActionMappings=(ActionName=\"CameraEditMode\",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=P)\n+ActionMappings=(ActionName=\"CreateKey\",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=J)\n+ActionMappings=(ActionName=\"ReloadKeys\",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=Seven)\n+ActionMappings=(ActionName=\"SaveKeys\",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=Two)\n+ActionMappings=(ActionName=\"JumpToNextKey\",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=L)\n+ActionMappings=(ActionName=\"JumpToPrevKey\",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=K)\n+ActionMappings=(ActionName=\"MMB\",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=MiddleMouseButton)\n+ActionMappings=(ActionName=\"RMB\",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=L)\n+ActionMappings=(ActionName=\"EditHintVisibility\",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=Y)\n+ActionMappings=(ActionName=\"MoveClosestKeyNodeHere\",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=I)\n+ActionMappings=(ActionName=\"DeleteKey\",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=U)\n+ActionMappings=(ActionName=\"Umbrella\",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=Gamepad_RightShoulder)\n+ActionMappings=(ActionName=\"LMB\",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=Gamepad_LeftTrigger)\n+ActionMappings=(ActionName=\"TakeWeaponAway\",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=F)\n+ActionMappings=(ActionName=\"SuperEditMode\",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=Tab)\n+ActionMappings=(ActionName=\"TakeWeaponAway\",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=Gamepad_DPad_Up)\n+ActionMappings=(ActionName=\"UseItemFromSlot0\",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=L)\n+ActionMappings=(ActionName=\"CopyFromKey\",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=J)\n+ActionMappings=(ActionName=\"PasteToKey\",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=I)\n+ActionMappings=(ActionName=\"CharacterPanels\",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=Tab)\n+ActionMappings=(ActionName=\"StrikePanel\",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=Z)\n+ActionMappings=(ActionName=\"Strike0\",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=J)\n+ActionMappings=(ActionName=\"Strike1\",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=I)\n+ActionMappings=(ActionName=\"LMB\",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=LeftMouseButton)\n+ActionMappings=(ActionName=\"RMB\",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=RightMouseButton)\n+ActionMappings=(ActionName=\"Ctrl\",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=LeftControl)\n+ActionMappings=(ActionName=\"Strike0\",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=Gamepad_FaceButton_Left)\n+ActionMappings=(ActionName=\"Strike1\",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=Gamepad_FaceButton_Top)\n+ActionMappings=(ActionName=\"UseItemFromSlot0\",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=Gamepad_FaceButton_Right)\n+ActionMappings=(ActionName=\"CharacterPanels\",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=Gamepad_Special_Left)\n+ActionMappings=(ActionName=\"Left\",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=A)\n+ActionMappings=(ActionName=\"Right\",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=D)\n+ActionMappings=(ActionName=\"Up\",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=W)\n+ActionMappings=(ActionName=\"Down\",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=S)\n+ActionMappings=(ActionName=\"TopLeft\",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=Q)\n+ActionMappings=(ActionName=\"TopRight\",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=E)\n+ActionMappings=(ActionName=\"Action0\",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=J)\n+ActionMappings=(ActionName=\"Action1\",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=I)\n+ActionMappings=(ActionName=\"Action2\",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=K)\n+ActionMappings=(ActionName=\"ToggleUI\",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=Z)\n+ActionMappings=(ActionName=\"SkyEditMode\",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=O)\n+ActionMappings=(ActionName=\"QuickSaveLoad0\",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=Eight)\n+ActionMappings=(ActionName=\"QuickSaveLoad1\",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=Nine)\n+ActionMappings=(ActionName=\"SpecialEditButtonPressed0\",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=X)\n+ActionMappings=(ActionName=\"SpecialEditButtonPressed1\",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=Y)\n+ActionMappings=(ActionName=\"MainMenuLeft\",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=Left)\n+ActionMappings=(ActionName=\"MainMenuRight\",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=Right)\n+ActionMappings=(ActionName=\"MainMenuUp\",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=Up)\n+ActionMappings=(ActionName=\"MainMenuDown\",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=Down)\n+ActionMappings=(ActionName=\"MainMenuBack\",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=Escape)\n+ActionMappings=(ActionName=\"MainMenuBack\",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=BackSpace)\n+ActionMappings=(ActionName=\"CharShadowEditMode\",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=Nine)\n+ActionMappings=(ActionName=\"MainMenuEnter\",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=Gamepad_FaceButton_Bottom)\n+ActionMappings=(ActionName=\"MainMenuBack\",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=Gamepad_Special_Right)\n+ActionMappings=(ActionName=\"Interact1\",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=Gamepad_RightTrigger)\n+ActionMappings=(ActionName=\"TopLeft\",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=Gamepad_LeftShoulder)\n+ActionMappings=(ActionName=\"TopRight\",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=Gamepad_RightShoulder)\n+ActionMappings=(ActionName=\"MainMenuLeft\",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=Gamepad_LeftStick_Left)\n+ActionMappings=(ActionName=\"MainMenuRight\",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=Gamepad_LeftStick_Right)\n+ActionMappings=(ActionName=\"Left\",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=Gamepad_LeftStick_Left)\n+ActionMappings=(ActionName=\"Right\",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=Gamepad_LeftStick_Right)\n+ActionMappings=(ActionName=\"Up\",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=Gamepad_LeftStick_Up)\n+ActionMappings=(ActionName=\"Down\",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=Gamepad_LeftStick_Down)\n+ActionMappings=(ActionName=\"MainMenuUp\",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=W)\n+ActionMappings=(ActionName=\"MainMenuDown\",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=S)\n+ActionMappings=(ActionName=\"MainMenuLeft\",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=A)\n+ActionMappings=(ActionName=\"MainMenuRight\",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=D)\n+ActionMappings=(ActionName=\"Action0\",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=Gamepad_FaceButton_Top)\n+ActionMappings=(ActionName=\"Action1\",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=Gamepad_FaceButton_Left)\n+ActionMappings=(ActionName=\"Action2\",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=Gamepad_RightTrigger)\n+ActionMappings=(ActionName=\"MainMenuEnter\",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=Gamepad_LeftThumbstick)\n+ActionMappings=(ActionName=\"MainMenuEnter\",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=SpaceBar)\n+ActionMappings=(ActionName=\"MainMenuUp\",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=Gamepad_LeftStick_Up)\n+ActionMappings=(ActionName=\"MainMenuDown\",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=Gamepad_LeftStick_Down)\n+ActionMappings=(ActionName=\"MainMenuEnter\",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=Enter)\n+ActionMappings=(ActionName=\"ToggleWeapon\",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=C)\n+ActionMappings=(ActionName=\"ToggleWeapon\",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=Gamepad_DPad_Left)\n+ActionMappings=(ActionName=\"ToggleItem\",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=V)\n+ActionMappings=(ActionName=\"ToggleItem\",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=Gamepad_DPad_Right)\n+ActionMappings=(ActionName=\"ToggleSpell\",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=Q)\n+ActionMappings=(ActionName=\"ToggleSpell\",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=Gamepad_DPad_Down)\n+ActionMappings=(ActionName=\"SpellUp\",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=I)\n+ActionMappings=(ActionName=\"SpellRight\",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=L)\n+ActionMappings=(ActionName=\"SpellDown\",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=K)\n+ActionMappings=(ActionName=\"SpellLeft\",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=J)\n+ActionMappings=(ActionName=\"MainMenuBack\",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=Gamepad_FaceButton_Right)\n+ActionMappings=(ActionName=\"SpellSelect\",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=Gamepad_RightTrigger)\n+ActionMappings=(ActionName=\"SpellSelectAndCast\",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=Gamepad_LeftTrigger)\n+ActionMappings=(ActionName=\"SpellSelectAndCast\",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=SpaceBar)\n+ActionMappings=(ActionName=\"SpellSelect\",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=Q)\n+ActionMappings=(ActionName=\"SpellSelect\",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=Gamepad_DPad_Down)\n+ActionMappings=(ActionName=\"MainMenuLeft\",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=Gamepad_DPad_Left)\n+ActionMappings=(ActionName=\"MainMenuRight\",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=Gamepad_DPad_Right)\n+ActionMappings=(ActionName=\"MainMenuUp\",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=Gamepad_DPad_Up)\n+ActionMappings=(ActionName=\"MainMenuDown\",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=Gamepad_DPad_Down)\n+ActionMappings=(ActionName=\"StartVideoLoopPlayback\",bShift=True,bCtrl=True,bAlt=True,bCmd=False,Key=V)\n+ActionMappings=(ActionName=\"StopVideoLoopPlayback\",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=SpaceBar)\n+ActionMappings=(ActionName=\"StopVideoLoopPlayback\",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=Gamepad_FaceButton_Bottom)\n+ActionMappings=(ActionName=\"RestartDemo\",bShift=True,bCtrl=True,bAlt=False,bCmd=False,Key=R)\n+ActionMappings=(ActionName=\"ActionBack\",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=L)\n+ActionMappings=(ActionName=\"ActionBack\",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=Gamepad_FaceButton_Right)\n+ActionMappings=(ActionName=\"JumpPrev\",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=Gamepad_DPad_Left)\n+ActionMappings=(ActionName=\"JumpNext\",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=Gamepad_DPad_Right)\n+ActionMappings=(ActionName=\"StartVideoLoopPlaybackController\",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=Gamepad_RightThumbstick)\n+AxisMappings=(AxisName=\"Move\",Scale=-1.000000,Key=D)\n+AxisMappings=(AxisName=\"Move\",Scale=1.000000,Key=A)\n+AxisMappings=(AxisName=\"Move\",Scale=-1.000000,Key=Gamepad_LeftX)\n+AxisMappings=(AxisName=\"MoveY\",Scale=1.000000,Key=W)\n+AxisMappings=(AxisName=\"MoveY\",Scale=-1.000000,Key=S)\n+AxisMappings=(AxisName=\"MoveY\",Scale=1.000000,Key=Gamepad_LeftY)\n+AxisMappings=(AxisName=\"MoveY\",Scale=1.000000,Key=Up)\n+AxisMappings=(AxisName=\"MoveY\",Scale=-1.000000,Key=Down)\n+AxisMappings=(AxisName=\"MouseX\",Scale=1.000000,Key=MouseX)\n+AxisMappings=(AxisName=\"MouseY\",Scale=1.000000,Key=MouseY)\n+AxisMappings=(AxisName=\"Zoom\",Scale=1.000000,Key=MouseWheelAxis)\n+AxisMappings=(AxisName=\"GamepadRightX\",Scale=1.000000,Key=Gamepad_RightX)\n+AxisMappings=(AxisName=\"GamepadRightY\",Scale=1.000000,Key=Gamepad_RightY)\n+AxisMappings=(AxisName=\"GamepadLeftX\",Scale=1.000000,Key=Gamepad_LeftX)\n+AxisMappings=(AxisName=\"GamepadLeftY\",Scale=1.000000,Key=Gamepad_LeftY)\nDefaultTouchInterface=/Engine/MobileResources/HUD/DefaultVirtualJoysticks.DefaultVirtualJoysticks\nConsoleKey=None\n-ConsoleKeys=Tilde\n+ConsoleKeys=Tilde\n+ConsoleKeys=Zero\n"
  },
  {
    "path": "Config/DefaultLightmass.ini",
    "content": "[DevOptions.PrecomputedDynamicObjectLighting]\nNumSurfaceSampleLayers=5\n"
  },
  {
    "path": "Config/DefaultNYLoadingScreenSettings.ini",
    "content": "[/Script/NotYetLoadingScreen.NYLoadingScreenSettings]\nWorldTransitionScreen=(Images=((Image=/Game/SO/GUI/art/Loading/warriorb_new.warriorb_new,Anchors=(Minimum=(X=0.500000,Y=0.500000),Maximum=(X=0.500000,Y=0.500000)),Size=(X=960.000000,Y=540.000000),Position=(X=0.000000,Y=-100.000000))),Loading=(TitleContainer=(Anchors=(Minimum=(X=0.500000,Y=0.000000),Maximum=(X=0.500000,Y=0.000000)),Size=(X=0.000000,Y=0.000000),Position=(X=0.000000,Y=100.000000),Alignment=(X=0.500000,Y=0.500000),SlotHorizontalAlignment=HAlign_Center,SlotVerticalAlignment=VAlign_Center),TitleText=(Text=INVTEXT(\"LEVEL MAP NAME\"),Padding=(Left=0.000000,Top=0.000000,Right=30.000000,Bottom=0.000000),Font=(FontObject=Font'\"/Game/SO/GUI/Fonts/NotoSansDisplay/NotoSansDisplay_Font.NotoSansDisplay_Font\"',FontMaterial=None,OutlineSettings=(OutlineSize=0,bSeparateFillAlpha=False,bApplyOutlineToDropShadows=False,OutlineMaterial=None,OutlineColor=(R=0.000000,G=0.000000,B=0.000000,A=1.000000)),TypefaceFontName=\"Black\",Size=52,FontName=\"\",Hinting=Default),bAutoWrap=True,WrapTextAt=0.000000,Justification=Center,MinDesiredWidth=0.000000),DescriptionContainer=(Anchors=(Minimum=(X=0.000000,Y=0.500000),Maximum=(X=1.000000,Y=0.500000)),Size=(X=0.000000,Y=0.000000),Position=(X=0.000000,Y=250.000000),Alignment=(X=0.500000,Y=0.500000),SlotHorizontalAlignment=HAlign_Fill,SlotVerticalAlignment=VAlign_Fill),DescriptionText=(Text=INVTEXT(\"DESCRIPTION FOR LEVEL Although it\\'s long abandoned  the fortress of White Wall still stands against Ruin. After centuries of silence some groups of unexpected visitors broke the loneliness of the decaying city.\"),Padding=(Left=30.000000,Top=0.000000,Right=30.000000,Bottom=0.000000),Font=(FontObject=Font'\"/Game/SO/GUI/Fonts/NotoSansDisplay/NotoSansDisplay_Font.NotoSansDisplay_Font\"',FontMaterial=None,OutlineSettings=(OutlineSize=0,bSeparateFillAlpha=False,bApplyOutlineToDropShadows=False,OutlineMaterial=None,OutlineColor=(R=0.000000,G=0.000000,B=0.000000,A=1.000000)),TypefaceFontName=\"Medium\",Size=24,FontName=\"\",Hinting=Default),bAutoWrap=True,WrapTextAt=0.000000,Justification=Center,MinDesiredWidth=0.000000),LoadingContainer=(Anchors=(Minimum=(X=0.000000,Y=1.000000),Maximum=(X=1.000000,Y=1.000000)),Size=(X=0.000000,Y=0.000000),Position=(X=0.000000,Y=-180.000000),Alignment=(X=0.000000,Y=0.000000),SlotHorizontalAlignment=HAlign_Center,SlotVerticalAlignment=VAlign_Center),LoadingText=(NormalText=(Text=LOCTABLE(\"UI\", \"loading_screen_text_1\"),Padding=(Left=30.000000,Top=0.000000,Right=30.000000,Bottom=0.000000),Font=(FontObject=Font'\"/Game/SO/GUI/Fonts/NotoSansDisplay/NotoSansDisplay_Font.NotoSansDisplay_Font\"',FontMaterial=None,OutlineSettings=(OutlineSize=0,bSeparateFillAlpha=False,bApplyOutlineToDropShadows=False,OutlineMaterial=None,OutlineColor=(R=0.000000,G=0.000000,B=0.000000,A=1.000000)),TypefaceFontName=\"Bold\",Size=24,FontName=\"\",Hinting=Default),bAutoWrap=True,WrapTextAt=0.000000,Justification=Center,MinDesiredWidth=0.000000),WaitForAnyKeyText=(Text=LOCTABLE(\"UI\", \"loading_screen_press_key_switch\"),Padding=(Left=0.000000,Top=0.000000,Right=30.000000,Bottom=0.000000),Font=(FontObject=Font'\"/Game/SO/GUI/Fonts/NotoSansDisplay/NotoSansDisplay_Font.NotoSansDisplay_Font\"',FontMaterial=MaterialInstanceConstant'\"/Game/SO/GUI/art/Loading/M_LoadingTextAnyKey_Inst.M_LoadingTextAnyKey_Inst\"',OutlineSettings=(OutlineSize=0,bSeparateFillAlpha=False,bApplyOutlineToDropShadows=False,OutlineMaterial=None,OutlineColor=(R=0.000000,G=0.000000,B=0.000000,A=1.000000)),TypefaceFontName=\"Bold\",Size=24,FontName=\"\",Hinting=Default),bAutoWrap=True,WrapTextAt=0.000000,Justification=Center,MinDesiredWidth=0.000000)),LoadingImage=(Size=(X=180.000000,Y=180.000000),Padding=(Left=0.000000,Top=-18.000000,Right=0.000000,Bottom=0.000000),bUseSpinningImage=False,SpinningImage=None,bUseThrobber=True,bThrobberSpin=True,ThrobberPieceImage=/Game/SO/GUI/art/DialogueWarriorb/think_small.think_small,ThrobberNumImagePieces=5,ThrobberPeriod=1.500000,bUseMaterial=False,Material=None)),Background=(bUseRandomBackgroundImages=False,BackgroundRandomImages=,BackgroundRandomImagesStretch=ScaleToFit,BackgroundFallbackColor=(R=0.000000,G=0.000000,B=0.000000,A=1.000000)),Tips=(Font=(FontObject=Font'\"/Game/SO/GUI/Fonts/Alegreya/Alegreya_Font.Alegreya_Font\"',FontMaterial=None,OutlineSettings=(OutlineSize=0,bSeparateFillAlpha=False,bApplyOutlineToDropShadows=False,OutlineMaterial=None,OutlineColor=(R=0.000000,G=0.000000,B=0.000000,A=1.000000)),TypefaceFontName=\"Default\",Size=18,FontName=\"\",Hinting=Default),WrapAt=10000.000000,Tips=))\nHalloweenOverrideEvent=(Image=/Game/SO/GUI/art/LogoBig_Pumpkin.LogoBig_Pumpkin,StartDate=(Month=10,Day=29,Hour=0,Minute=0),EndDate=(Month=11,Day=3,Hour=0,Minute=0))\n"
  },
  {
    "path": "Config/DefaultScalability.ini",
    "content": "[ShadowQuality@0]\nr.ShadowQuality=1\n\n[EffectsQuality@0]\nr.EmitterSpawnRateScale=1.0\n\n[EffectsQuality@1]\nr.EmitterSpawnRateScale=1.0\n\n[EffectsQuality@2]\nr.EmitterSpawnRateScale=1.0\n\n[EffectsQuality@3]\nr.EmitterSpawnRateScale=1.0\n\n[EffectsQuality@Cine]\nr.EmitterSpawnRateScale=1.0\n\n[TextureQuality@0]\nr.Streaming.PoolSize=1200\n\n[TextureQuality@1]\nr.Streaming.PoolSize=1200\n\n[TextureQuality@2]\nr.Streaming.PoolSize=1200\n\n[TextureQuality@3]\nr.Streaming.PoolSize=1200\n"
  },
  {
    "path": "Config/DefaultSoAchievementSettings.ini",
    "content": "\n[/Script/SOrb.SoAchievementSettings]\n+DemoAchievementNames=A_Prologue\n+DemoAchievementNames=A_FirstChest\n+DemoAchievementNames=A_KoboldQuest\n+DemoAchievementNames=A_WallJumper\n+DemoAchievementNames=A_Axeless\n+DemoAchievementNames=A_WithoutPlatformBreak\n+DemoAchievementNames=A_MiniBoss\n+DemoAchievementNames=A_ShortcutMaster\n+DemoAchievementNames=A_SpeedRun\n+AchievementNames=A_StartLikeAPro\n+AchievementNames=A_HighDiver\n+AchievementNames=A_KeenEyedStarter\n+AchievementNames=A_FindingYourVoice\n+AchievementNames=A_TrippleTheFun\n+AchievementNames=A_SelfTrained\n+AchievementNames=A_SuicideSQuad\n+AchievementNames=A_ClueFromThePast\n+AchievementNames=A_EatenByChest\n+AchievementNames=A_WeirdDevice\n+AchievementNames=A_BookCollector\n+AchievementNames=A_FlowerTaker\n+AchievementNames=A_Historian\n+AchievementNames=A_Ravenclaw\n+AchievementNames=A_MinibossNoMeteorHit\n+AchievementNames=A_GemCharged\n+AchievementNames=A_CreatureInCage\n+AchievementNames=A_GolemHunter\n+AchievementNames=A_Kind\n+AchievementNames=A_PortalPlace\n+AchievementNames=A_Worthy\n+AchievementNames=A_Worthiest\n+AchievementNames=A_Speedrun1\n+AchievementNames=A_Poetry\n+AchievementNames=A_HallowedHeart\n+AchievementNames=A_DwarvenGate\n+AchievementNames=A_LavaLairTower\n+AchievementNames=A_LavaLairTowerClimb\n+AchievementNames=A_WrackedWaters\n+AchievementNames=A_Sailor\n+AchievementNames=A_CreatureInCage2\n+AchievementNames=A_Souper\n+AchievementNames=A_CleanShore\n+AchievementNames=A_Wheel\n+AchievementNames=A_GolemDestroyer\n+AchievementNames=A_GhostAbacus\n+AchievementNames=A_ClearOutpost\n+AchievementNames=A_Swapkill\n+AchievementNames=A_BounceStun\n+AchievementNames=A_CarefulOne\n+AchievementNames=A_Pyromaniac\n+AchievementNames=A_ShockingLightning\n+AchievementNames=A_Tealslower\n+AchievementNames=A_Tealmageddon\n+AchievementNames=A_MassSlower\n+AchievementNames=A_StunFromAbove\n+AchievementNames=A_GreenDeath\n+AchievementNames=A_MemCollector\n+AchievementNames=A_InMemoriam\n+AchievementNames=A_ArmourWrath\n+AchievementNames=A_ArmourWrathS\n+AchievementNames=A_FallenDruid\n+AchievementNames=A_FallenDruidS\n+AchievementNames=A_DwarvenStatue\n+AchievementNames=A_DwarvenStatueS\n+AchievementNames=A_Speedrun2\n+AchievementNames=A_PipeMaster\n+AchievementNames=A_AlmostThere\n+AchievementNames=A_LeaveRR\n+AchievementNames=A_Microtransactions\n+AchievementNames=A_ToInfinity\n+AchievementNames=A_FlappyBall\n+AchievementNames=A_OtherSideOfCage\n+AchievementNames=A_Speedrun3\n+AchievementNames=A_ChanceForEveryone\n+AchievementNames=A_SeparatedWorlds\n+AchievementNames=A_Speedrunner\n+AchievementNames=A_Insane\n\n\n"
  },
  {
    "path": "Config/DefaultSoGameSingleton.ini",
    "content": "\n[/Script/SOrb.SoGameSingleton]\nLevelDataForTags=((\"GG\", (Level=/Game/SO/Maps/Story/Act1/GreyGate.GreyGate,SkyPresetName=\"Default\")),(\"AA\", (Level=/Game/SO/Maps/Story/Act1/AncientArcade.AncientArcade,SkyPresetName=\"Catacombs\")),(\"TL\", (Level=/Game/SO/Maps/Story/Act1/TutorialLevel.TutorialLevel,SkyPresetName=\"TrainingClouds\")),(\"AG\", (Level=/Game/SO/Maps/Story/Act1/AfterGate.AfterGate,SkyPresetName=\"Default\")),(\"SA\", (Level=/Game/SO/Maps/Story/Act1/SecondArcade.SecondArcade,SkyPresetName=\"Catacombs\")),(\"GK\", (Level=/Game/SO/Maps/Story/Act1/GateKeeper.GateKeeper,SkyPresetName=\"GateKeeper\")),(\"CC\", (Level=/Game/SO/Maps/Story/Act2/CrossroadCave.CrossroadCave,SkyPresetName=\"PortalCave\")),(\"LD\", (Level=/Game/SO/Maps/Story/Act2/LavaDeep.LavaDeep,SkyPresetName=\"Lava\")),(\"LE\", (Level=/Game/SO/Maps/Story/Act2/LavaEntrance.LavaEntrance,SkyPresetName=\"Lava\")),(\"DO\", (Level=/Game/SO/Maps/Story/Act2/DwarvenOutpost.DwarvenOutpost,SkyPresetName=\"PortalCave\")),(\"SP\", (Level=/Game/SO/Maps/Story/Act2/SlidePath.SlidePath,SkyPresetName=\"LuckyLake\")),(\"WW\", (Level=/Game/SO/Maps/Story/Act2/WrackedWaterpath.WrackedWaterpath,SkyPresetName=\"LuckyLake\")),(\"S0\", (Level=/Game/SO/Maps/Story/Act1/S0_TutorialBonusCombat.S0_TutorialBonusCombat,SkyPresetName=\"Catacombs\")),(\"DC\", (Level=/Game/SO/Maps/Story/Act2/Catacombs.Catacombs,SkyPresetName=\"Catacombs\")),(\"D2\", (Level=/Game/SO/Maps/Story/Act2/Catacombs2.Catacombs2,SkyPresetName=\"Catacombs\")),(\"DG\", (Level=/Game/SO/Maps/Story/Act2/DwarvenGate.DwarvenGate,SkyPresetName=\"Catacombs\")),(\"CH\", (Level=/Game/SO/Maps/Story/Act3/CaveHouse.CaveHouse,SkyPresetName=\"FogCave\")),(\"RR\", (Level=/Game/SO/Maps/Story/Act3/RuinedRealm.RuinedRealm,SkyPresetName=\"Trailer\")),(\"PP\", (Level=/Game/SO/Maps/Story/Act3/PipePuzzle.PipePuzzle,SkyPresetName=\"FogCave\")),(\"BL\", (Level=/Game/SO/Maps/Story/Act3/BorderLand.BorderLand,SkyPresetName=\"FogCave\")),(\"ED\", (Level=/Game/SO/Maps/Story/Act2/EscapeDarkness.EscapeDarkness,SkyPresetName=\"Catacombs\")),(\"LB\", (Level=/Game/SO/Maps/Story/Act2/LavaBoss.LavaBoss,SkyPresetName=\"Default\")),(\"DB\", (Level=/Game/SO/Maps/Story/Act2/DwarvenBoss.DwarvenBoss,SkyPresetName=\"Catacombs\")),(\"WB\", (Level=/Game/SO/Maps/Story/Act2/WWBoss.WWBoss,SkyPresetName=\"LuckyLake\")),(\"BG\", (Level=/Game/SO/Maps/Story/Act3/BubbleGround.BubbleGround,SkyPresetName=\"FogCave\")),(\"VV\", (Level=/Game/SO/Maps/CustomMaps/WhiteWall/WhiteWall.WhiteWall,SkyPresetName=\"Default\")))\n+LevelsWeatherVFXArray=(Level=/Game/SO/Maps/Story/Act1/GreyGate.GreyGate,ParticlesPtr=/Game/SO/Effects/Particles/Snow/GG_AshRain.GG_AshRain)\n+LevelsWeatherVFXArray=(Level=/Game/SO/Maps/Story/Act1/AfterGate.AfterGate,ParticlesPtr=/Game/SO/Effects/Particles/Snow/GG_AshRain.GG_AshRain)\n+LevelsWeatherVFXArray=(Level=/Game/SO/Maps/Story/Act1/GateKeeper.GateKeeper,ParticlesPtr=/Game/SO/Effects/Particles/Snow/GG_AshRainBoss.GG_AshRainBoss)\n+LevelsWeatherVFXArray=(Level=/Game/SO/Maps/Story/Act2/LavaEntrance.LavaEntrance,ParticlesPtr=/Game/SO/Effects/Particles/Snow/GG_AshRainLavaEntrance.GG_AshRainLavaEntrance)\n+LevelsWeatherVFXArray=(Level=/Game/SO/Maps/Story/Act3/RuinedRealm.RuinedRealm,ParticlesPtr=/Game/SO/Effects/Particles/Snow/RR_AshRain.RR_AshRain)\n+LevelsWeatherVFXArray=(Level=/Game/SO/Maps/CustomMaps/WhiteWall/WhiteWall.WhiteWall,ParticlesPtr=/Game/SO/Effects/Particles/Snow/GG_AshRain.GG_AshRain)\nMainMenuLevel=/Game/SO/Maps/SoMenuLevel.SoMenuLevel\nFirstChapterLevel=/Game/SO/Maps/Story/Act1/SoAct1.SoAct1\nLastChapterLevel=/Game/SO/Maps/Story/Ending/SoEnding.SoEnding\n+ChaptersArray=(Level=/Game/SO/Maps/Story/Act1/SoAct1.SoAct1,NextLevel=/Game/SO/Maps/Story/Act2/SoAct2.SoAct2,NameText=LOCTABLE(\"Areas\", \"act_1\"),LevelEnterParams=(Animation=AnimSequence'\"/Game/SO/Assets/CharacterRedesign/Anim/Sequences/SO_SQ_C1_Start.SO_SQ_C1_Start\"',Sequence=/Game/SO/Maps/Story/Act1/GreyGate.GreyGate:PersistentLevel.GameStart_2,Camera=/Game/SO/Maps/Story/Act1/GreyGate.GreyGate:PersistentLevel.CameraActor_1,HideCharacterTime=-1.000000,TeleportAfterCutscene=None,LoadingImagePtr=/Game/SO/GUI/art/Loading/MainGameLoadingImgs/LoadingScreen_AncientArcade.LoadingScreen_AncientArcade,LoadingDescription=LOCTABLE(\"Areas\", \"act1_loading\"),DisplayTextOnBlackFadeDuringFirstMapStart=LOCTABLE(\"Areas\", \"act_1\"),RandomLoadingScreenTexts=(LOCTABLE(\"Areas\", \"loading_tip_act1_0\"),LOCTABLE(\"Areas\", \"loading_tip_act1_1\"),LOCTABLE(\"Areas\", \"loading_tip_act1_2\"),LOCTABLE(\"Areas\", \"loading_tip_act1_3\"),LOCTABLE(\"Areas\", \"loading_tip_act1_4\"),LOCTABLE(\"Areas\", \"loading_tip_act1_5\"),LOCTABLE(\"Areas\", \"loading_tip_act1_6\"),LOCTABLE(\"Areas\", \"loading_tip_act1_7\"),LOCTABLE(\"Areas\", \"loading_tip_act1_8\"),LOCTABLE(\"Areas\", \"loading_tip_act1_9\"))))\n+ChaptersArray=(Level=/Game/SO/Maps/Story/Act2/SoAct2.SoAct2,NextLevel=/Game/SO/Maps/Story/Act3/SoAct3.SoAct3,NameText=LOCTABLE(\"Areas\", \"act_2\"),LevelEnterParams=(Animation=None,Sequence=/Game/SO/Maps/Story/Act2/CrossroadCave.CrossroadCave:PersistentLevel.Act2Start_2,Camera=/Game/SO/Maps/Story/Act2/CrossroadCave.CrossroadCave:PersistentLevel.CameraActor_1,HideCharacterTime=4.000000,TeleportAfterCutscene=None,LoadingImagePtr=/Game/SO/GUI/art/Loading/MainGameLoadingImgs/LoadingScreen_Outpost.LoadingScreen_Outpost,LoadingDescription=LOCTABLE(\"Areas\", \"act2_loading\"),DisplayTextOnBlackFadeDuringFirstMapStart=LOCTABLE(\"Areas\", \"act_2\"),RandomLoadingScreenTexts=(LOCTABLE(\"Areas\", \"loading_tip_act2_0\"),LOCTABLE(\"Areas\", \"loading_tip_act2_1\"),LOCTABLE(\"Areas\", \"loading_tip_act2_2\"),LOCTABLE(\"Areas\", \"loading_tip_act2_4\"),LOCTABLE(\"Areas\", \"loading_tip_act2_5\"),LOCTABLE(\"Areas\", \"loading_tip_act2_6\"),LOCTABLE(\"Areas\", \"loading_tip_act2_7\"),LOCTABLE(\"Areas\", \"loading_tip_act2_8\"),LOCTABLE(\"Areas\", \"loading_tip_act2_9\"))))\n+ChaptersArray=(Level=/Game/SO/Maps/Story/Act3/SoAct3.SoAct3,NextLevel=/Game/SO/Maps/Story/Ending/SoEnding.SoEnding,NameText=LOCTABLE(\"Areas\", \"act_3\"),LevelEnterParams=(Animation=AnimSequence'\"/Game/SO/Assets/CharacterRedesign/Anim/Sequences/SO_SQ_C3Start_WakeUp.SO_SQ_C3Start_WakeUp\"',Sequence=/Game/SO/Maps/Story/Act3/CaveHouse.CaveHouse:PersistentLevel.Act3Start_2,Camera=/Game/SO/Maps/Story/Act3/CaveHouse.CaveHouse:PersistentLevel.CameraActor2_2,HideCharacterTime=-1.000000,TeleportAfterCutscene=/Game/SO/Maps/Story/Act3/SoAct3.SoAct3:PersistentLevel.StartMarker,LoadingImagePtr=/Game/SO/GUI/art/Loading/MainGameLoadingImgs/LoadingScreen_CaveHouse.LoadingScreen_CaveHouse,LoadingDescription=LOCTABLE(\"Areas\", \"act3_loading\"),DisplayTextOnBlackFadeDuringFirstMapStart=LOCTABLE(\"Areas\", \"act_3\"),RandomLoadingScreenTexts=(LOCTABLE(\"Areas\", \"loading_tip_act3_0\"),LOCTABLE(\"Areas\", \"loading_tip_act3_1\"),LOCTABLE(\"Areas\", \"loading_tip_act3_2\"),LOCTABLE(\"Areas\", \"loading_tip_act3_3\"),LOCTABLE(\"Areas\", \"loading_tip_act3_4\"),LOCTABLE(\"Areas\", \"loading_tip_act3_5\"),LOCTABLE(\"Areas\", \"loading_tip_act3_6\"),LOCTABLE(\"Areas\", \"loading_tip_act3_7\"))))\n+ChaptersArray=(Level=/Game/SO/Maps/Story/Ending/SoEnding.SoEnding,NextLevel=None,NameText=LOCTABLE(\"Areas\", \"epilogue\"),LevelEnterParams=(Animation=None,Sequence=None,Camera=None,HideCharacterTime=-1.000000,TeleportAfterCutscene=None,LoadingImagePtr=/Game/SO/GUI/art/Loading/MainGameLoadingImgs/LoadingScreen_LaboratoryRoom.LoadingScreen_LaboratoryRoom,LoadingDescription=LOCTABLE(\"Areas\", \"ending_loading\"),DisplayTextOnBlackFadeDuringFirstMapStart=LOCTABLE(\"Areas\", \"epilogue\"),RandomLoadingScreenTexts=(LOCTABLE(\"Areas\", \"loading_tip_end_0\"),LOCTABLE(\"Areas\", \"loading_tip_end_1\"),LOCTABLE(\"Areas\", \"loading_tip_end_2\"),LOCTABLE(\"Areas\", \"loading_tip_end_3\"),LOCTABLE(\"Areas\", \"loading_tip_end_4\"))))\nLevelUnloadMapForSwitch=((\"LavaDeep\", (Names=(\"Catacombs\",\"DwarvenBoss\",\"DwarvenGate\",\"DwarvenOutpost\",\"EscapeDarkness\",\"SlidePath\",\"WWBoss\",\"WrackedWaterpath\"))),(\"LavaEntrance\", (Names=(\"Catacombs\",\"DwarvenBoss\",\"DwarvenGate\",\"EscapeDarkness\",\"SlidePath\",\"WWBoss\"))),(\"WrackedWaterpath\", (Names=(\"Catacombs\",\"DwarvenBoss\",\"DwarvenGate\",\"DwarvenOutpost\",\"LavaDeep\",\"LavaBoss\"))),(\"EscapeDarkness\", (Names=(\"Catacombs\",\"DwarvenBoss\",\"DwarvenGate\",\"DwarvenOutpost\",\"LavaDeep\",\"LavaBoss\"))),(\"SlidePath\", (Names=(\"Catacombs\",\"DwarvenBoss\",\"DwarvenGate\",\"DwarvenOutpost\",\"LavaDeep\",\"LavaBoss\"))),(\"Catacombs\", (Names=(\"WWBoss\",\"LavaBoss\",\"LavaDeep\",\"EscapeDarkness\",\"WrackedWaterpath\",\"DwarvenGate\"))),(\"DwarvenOutpost\", (Names=(\"WWBoss\",\"LavaBoss\",\"LavaDeep\",\"EscapeDarkness\",\"SlidePath\"))),(\"DwarvenGate\", (Names=(\"WWBoss\",\"LavaBoss\",\"LavaDeep\",\"EscapeDarkness\",\"WrackedWaterpath\",\"SlidePath\",\"Catacombs\"))))\n+EpisodesArray=(Level=/Game/SO/Maps/CustomMaps/EscapeFromDarkness/EscapeDarknessCustom.EscapeDarknessCustom,CheckpointLocation=\"\",DisplayName=LOCTABLE(\"Episodes\", \"escape_darkness_friendly_name\"),Image=None,Description=LOCTABLE(\"Episodes\", \"escape_darkness_desc\"),EnterEquippedItems=,EnterEquippedSpells=,EnterInventoryItems=,MaxHealth=30.000000,SpellsCapacity=2,CompletedSubtitle=LOCTABLE(\"Episodes\", \"escape_darkness_completed_subtitle\"),CompletedDescription=LOCTABLE(\"Episodes\", \"escape_darkness_completed_desc\"),bCanSave=False,bCanHaveSoulKeeper=False,LevelEnterParams=(Animation=None,Sequence=None,Camera=None,HideCharacterTime=-1.000000,TeleportAfterCutscene=None,LoadingImagePtr=None,LoadingDescription=\"\",DisplayTextOnBlackFadeDuringFirstMapStart=\"\",RandomLoadingScreenTexts=))\n+EpisodesArray=(Level=/Game/SO/Maps/CustomMaps/DreamHack/DreamHack.DreamHack,CheckpointLocation=\"\",DisplayName=LOCTABLE(\"Episodes\", \"dreamhack_friendly_name\"),Image=None,Description=LOCTABLE(\"Episodes\", \"dreamhack_desc\"),EnterEquippedItems=,EnterEquippedSpells=,EnterInventoryItems=,MaxHealth=30.000000,SpellsCapacity=2,CompletedSubtitle=LOCTABLE(\"Episodes\", \"dreamhack_completed_subtitle\"),CompletedDescription=LOCTABLE(\"Episodes\", \"dreamhack_completed_desc\"),bCanSave=False,bCanHaveSoulKeeper=False,LevelEnterParams=(Animation=None,Sequence=None,Camera=None,HideCharacterTime=-1.000000,TeleportAfterCutscene=None,LoadingImagePtr=None,LoadingDescription=\"\",DisplayTextOnBlackFadeDuringFirstMapStart=\"\",RandomLoadingScreenTexts=))\n+EpisodesArray=(Level=/Game/SO/Maps/CustomMaps/WhiteWall/WhiteWall.WhiteWall,CheckpointLocation=\"\",DisplayName=LOCTABLE(\"Episodes\", \"white_wall_friendly_name\"),Image=None,Description=LOCTABLE(\"Episodes\", \"white_wall_loadingscreen_desc\"),EnterEquippedItems=,EnterEquippedSpells=,EnterInventoryItems=,MaxHealth=60.000000,SpellsCapacity=10,CompletedSubtitle=LOCTABLE(\"Episodes\", \"white_wall_completed_subtitle\"),CompletedDescription=LOCTABLE(\"Episodes\", \"white_wall_completed_desc\"),bCanSave=True,bCanHaveSoulKeeper=False,LevelEnterParams=(Animation=None,Sequence=/Game/SO/Maps/CustomMaps/WhiteWall/WhiteWall.WhiteWall:PersistentLevel.WhiteWallStart_2,Camera=/Game/SO/Maps/CustomMaps/WhiteWall/WhiteWall.WhiteWall:PersistentLevel.CameraActor_1,HideCharacterTime=4.000000,TeleportAfterCutscene=None,LoadingImagePtr=/Game/SO/GUI/art/Loading/LoadingScreen_WhiteWall.LoadingScreen_WhiteWall,LoadingDescription=LOCTABLE(\"Episodes\", \"white_wall_loadingscreen_desc\"),DisplayTextOnBlackFadeDuringFirstMapStart=LOCTABLE(\"Areas\", \"prologue\"),RandomLoadingScreenTexts=))\nDemoEpisodeLevel=/Game/SO/Maps/CustomMaps/WhiteWall/WhiteWall.WhiteWall\nCharacterProgressInfo=((\"act1_start\", (DisplayText=LOCTABLE(\"Areas\", \"progress_act1_start\"),Image=Texture2D'\"/Game/SO/GUI/art/SaveSlots/01_LostInRuin.01_LostInRuin\"')),(\"act1_tut1\", (DisplayText=LOCTABLE(\"Areas\", \"progress_act1_tut1\"),Image=Texture2D'\"/Game/SO/GUI/art/SaveSlots/02_AmIWorthy.02_AmIWorthy\"')),(\"act1_arcade1\", (DisplayText=LOCTABLE(\"Areas\", \"progress_act1_arcade1\"),Image=Texture2D'\"/Game/SO/GUI/art/SaveSlots/03_RemnantsOfARealm.03_RemnantsOfARealm\"')),(\"act1_tut2\", (DisplayText=LOCTABLE(\"Areas\", \"progress_act1_tut2\"),Image=Texture2D'\"/Game/SO/GUI/art/SaveSlots/04_SeverAgain.04_SeverAgain\"')),(\"act1_arcade2\", (DisplayText=LOCTABLE(\"Areas\", \"progress_act1_arcade2\"),Image=Texture2D'\"/Game/SO/GUI/art/SaveSlots/05_DiscoveringAncientTechnology.05_DiscoveringAncientTechnology\"')),(\"act1_tut3\", (DisplayText=LOCTABLE(\"Areas\", \"progress_act1_tut3\"),Image=Texture2D'\"/Game/SO/GUI/art/SaveSlots/06_ThirdTimeWorthy.06_ThirdTimeWorthy\"')),(\"act1_before_raven\", (DisplayText=LOCTABLE(\"Areas\", \"progress_act1_before_raven\"),Image=Texture2D'\"/Game/SO/GUI/art/SaveSlots/07_Searching_for_a_way_out.07_Searching_for_a_way_out\"')),(\"act1_gem\", (DisplayText=LOCTABLE(\"Areas\", \"progress_act1_gem\"),Image=Texture2D'\"/Game/SO/GUI/art/SaveSlots/08_LookingForAGem.08_LookingForAGem\"')),(\"act1_infuse\", (DisplayText=LOCTABLE(\"Areas\", \"progress_act1_infuse\"),Image=Texture2D'\"/Game/SO/GUI/art/SaveSlots/09_InfusingTheGem2.09_InfusingTheGem2\"')),(\"act1_test_stone\", (DisplayText=LOCTABLE(\"Areas\", \"progress_act1_test_stone\"),Image=Texture2D'\"/Game/SO/GUI/art/SaveSlots/10_BouncingStones.10_BouncingStones\"')),(\"act1_portals\", (DisplayText=LOCTABLE(\"Areas\", \"progress_act1_portals\"),Image=Texture2D'\"/Game/SO/GUI/art/SaveSlots/11_LookingForAPortal.11_LookingForAPortal\"')),(\"act1_boss_fight\", (DisplayText=LOCTABLE(\"Areas\", \"progress_act1_boss_fight\"),Image=Texture2D'\"/Game/SO/GUI/art/SaveSlots/12_FacingTheKeeper.12_FacingTheKeeper\"')),(\"act2_crossroad\", (DisplayText=LOCTABLE(\"Areas\", \"progress_act2_crossroad\"),Image=Texture2D'\"/Game/SO/GUI/art/SaveSlots/13_ChoosingPath.13_ChoosingPath\"')),(\"act2_dwarf_0\", (DisplayText=LOCTABLE(\"Areas\", \"progress_act2_dwarf_0\"),Image=Texture2D'\"/Game/SO/GUI/art/SaveSlots/14_IntoTheBlue.14_IntoTheBlue\"')),(\"act2_dwarf_1\", (DisplayText=LOCTABLE(\"Areas\", \"progress_act2_dwarf_1\"),Image=Texture2D'\"/Game/SO/GUI/art/SaveSlots/15_ElevatorGemAndKey.15_ElevatorGemAndKey\"')),(\"act2_dwarf_2\", (DisplayText=LOCTABLE(\"Areas\", \"progress_act2_dwarf_2\"),Image=Texture2D'\"/Game/SO/GUI/art/SaveSlots/16_OpeningTheGate.16_OpeningTheGate\"')),(\"act2_dwarf_boss\", (DisplayText=LOCTABLE(\"Areas\", \"progress_act2_dwarf_boss\"),Image=Texture2D'\"/Game/SO/GUI/art/SaveSlots/17_DwarvenStatue.17_DwarvenStatue\"')),(\"act2_lava_0\", (DisplayText=LOCTABLE(\"Areas\", \"progress_act2_lava_0\"),Image=Texture2D'\"/Game/SO/GUI/art/SaveSlots/18_IntoTheRed.18_IntoTheRed\"')),(\"act2_lava_1\", (DisplayText=LOCTABLE(\"Areas\", \"progress_act2_lava_1\"),Image=Texture2D'\"/Game/SO/GUI/art/SaveSlots/19_UnitingKeyPieces.19_UnitingKeyPieces\"')),(\"act2_lava_2\", (DisplayText=LOCTABLE(\"Areas\", \"progress_act2_lava_2\"),Image=Texture2D'\"/Game/SO/GUI/art/SaveSlots/20_ClimbingTheTower.20_ClimbingTheTower\"')),(\"act2_lava_boss\", (DisplayText=LOCTABLE(\"Areas\", \"progress_act2_lava_boss\"),Image=Texture2D'\"/Game/SO/GUI/art/SaveSlots/21_ArmourWrath.21_ArmourWrath\"')),(\"act2_ww_0\", (DisplayText=LOCTABLE(\"Areas\", \"progress_act2_ww_0\"),Image=Texture2D'\"/Game/SO/GUI/art/SaveSlots/22_IntoTheGreen.22_IntoTheGreen\"')),(\"act2_ww_1\", (DisplayText=LOCTABLE(\"Areas\", \"progress_act2_ww_1\"),Image=Texture2D'\"/Game/SO/GUI/art/SaveSlots/23_ThroughTheLake2.23_ThroughTheLake2\"')),(\"act2_ww_2\", (DisplayText=LOCTABLE(\"Areas\", \"progress_act2_ww_2\"),Image=Texture2D'\"/Game/SO/GUI/art/SaveSlots/24_BeingFollowed.24_BeingFollowed\"')),(\"act2_ww_boss\", (DisplayText=LOCTABLE(\"Areas\", \"progress_act2_ww_boss\"),Image=Texture2D'\"/Game/SO/GUI/art/SaveSlots/25_FallenDruid.25_FallenDruid\"')),(\"act2_end\", (DisplayText=LOCTABLE(\"Areas\", \"progress_act2_end\"),Image=Texture2D'\"/Game/SO/GUI/art/SaveSlots/26_ToTheForthStation.26_ToTheForthStation\"')),(\"act3_start\", (DisplayText=LOCTABLE(\"Areas\", \"progress_act3_start\"),Image=Texture2D'\"/Game/SO/GUI/art/SaveSlots/27_LostInTheCaves.27_LostInTheCaves\"')),(\"act3_pipes\", (DisplayText=LOCTABLE(\"Areas\", \"progress_act3_pipes\"),Image=Texture2D'\"/Game/SO/GUI/art/SaveSlots/28_MovingPipes.28_MovingPipes\"')),(\"act3_floating\", (DisplayText=LOCTABLE(\"Areas\", \"progress_act3_floating\"),Image=Texture2D'\"/Game/SO/GUI/art/SaveSlots/29_Floating.29_Floating\"')),(\"act3_monk\", (DisplayText=LOCTABLE(\"Areas\", \"progress_act3_monk\"),Image=Texture2D'\"/Game/SO/GUI/art/SaveSlots/30_MonksHome.30_MonksHome\"')),(\"act3_way_out\", (DisplayText=LOCTABLE(\"Areas\", \"progress_act3_way_out\"),Image=Texture2D'\"/Game/SO/GUI/art/SaveSlots/30_WayOutOfTheRealm.30_WayOutOfTheRealm\"')),(\"epilogue_castle\", (DisplayText=LOCTABLE(\"Areas\", \"progress_epilogue_castle\"),Image=Texture2D'\"/Game/SO/GUI/art/SaveSlots/31_WizardsCastle.31_WizardsCastle\"')),(\"epilogue_boss\", (DisplayText=LOCTABLE(\"Areas\", \"progress_epilogue_boss\"),Image=Texture2D'\"/Game/SO/GUI/art/SaveSlots/32_TheRealDemon.32_TheRealDemon\"')),(\"epilogue_past_and_future\", (DisplayText=LOCTABLE(\"Areas\", \"progress_epilogue_past_and_future\"),Image=Texture2D'\"/Game/SO/GUI/art/SaveSlots/33_PastAndFuture.33_PastAndFuture\"')),(\"epilogue_save_creatures\", (DisplayText=LOCTABLE(\"Areas\", \"progress_epilogue_save_creatures\"),Image=Texture2D'\"/Game/SO/GUI/art/SaveSlots/34_SavingTheCreatures.34_SavingTheCreatures\"')),(\"epilogue_separate_worlds\", (DisplayText=LOCTABLE(\"Areas\", \"progress_epilogue_separate_worlds\"),Image=Texture2D'\"/Game/SO/GUI/art/SaveSlots/35_SeparatingTheRealms.35_SeparatingTheRealms\"')))\nEnemiesDescriptionPerMap=((\"SoAct1\", (GroupDefeatedTexts=((\"EG_ArcadeDungeonOptional\", (DisplayName=NSLOCTEXT(\"EnemyGroupData\", \"SoAct1_EG_ArcadeDungeonOptional_name\", \"Vacuum Cleaners group\"),Description=NSLOCTEXT(\"EnemyGroupData\", \"SoAct1_EG_ArcadeDungeonOptional_desc\", \"You might wonder if a Vacuum Cleaner is designed to clean dust away why does it need a laser caster?\"))),(\"EG_ArcadeMaintainers\", (DisplayName=NSLOCTEXT(\"EnemyGroupData\", \"SoAct1_EG_ArcadeMaintainers_name\", \"Arcade Cleaner Golems\"),Description=NSLOCTEXT(\"EnemyGroupData\", \"SoAct1_EG_ArcadeMaintainers_desc\", \"The very first Golems were made to do the most monotonic work so that people have more time to think and to create. Once they were friendly but as Ruin came their behaviour changed.\"))),(\"EG_LoneDrone\", (DisplayName=NSLOCTEXT(\"EnemyGroupData\", \"SoAct1_EG_LoneDrone_name\", \"Lone Drone\"),Description=NSLOCTEXT(\"EnemyGroupData\", \"SoAct1_EG_LoneDrone_desc\", \"Drones delivered messages and gifts before Ruin. People were happy when they heard them approaching back then.\"))),(\"EG_ArcadeDungeonCleaners\", (DisplayName=NSLOCTEXT(\"EnemyGroupData\", \"SoAct1_EG_ArcadeDungeonCleaners_name\", \"Arcade Cleaners\"),Description=NSLOCTEXT(\"EnemyGroupData\", \"SoAct1_EG_ArcadeDungeonCleaners_desc\", \"The Golem\\'s behaviour was specified by the Golem Makers. Only very simple personalities were made at the beginning. The Cleaners, for example, only desired to keep the place tidy and make sure they don\\'t harm the people.\"))),(\"EG_ArcadeDungeonExit\", (DisplayName=NSLOCTEXT(\"EnemyGroupData\", \"SoAct1_EG_ArcadeDungeonExit_name\", \"Arcade Servants\"),Description=NSLOCTEXT(\"EnemyGroupData\", \"SoAct1_EG_ArcadeDungeonExit_desc\", \"After creating intelligence Golem Makers wanted even more. They wanted complex personality. They wanted Golems that can not only think but also feel. That was the idea behind designing the Gatekeepers.\"))),(\"EG_AAFirstDroneTrio\", (DisplayName=NSLOCTEXT(\"EnemyGroupData\", \"SoAct1_EG_AAFirstDroneTrio_name\", \"The Flying Three\"),Description=NSLOCTEXT(\"EnemyGroupData\", \"SoAct1_EG_AAFirstDroneTrio_desc\", \"Drones were even more intelligent than Maintainers. They not only memorized texts, they helped correct grammar, changed the message if it was too insulting or even made up poems if they were asked to do so.\"))),(\"EG_Chest\", (DisplayName=NSLOCTEXT(\"EnemyGroupData\", \"SoAct1_EG_Chest_name\", \"Chest\"),Description=NSLOCTEXT(\"EnemyGroupData\", \"SoAct1_EG_Chest_desc\", \"The poor chest was minding his own business before you started to insult him.\"))),(\"EG_GGMiniBoss\", (DisplayName=NSLOCTEXT(\"EnemyGroupData\", \"SoAct1_EG_GGMiniBoss_name\", \"Wickeds\"),Description=NSLOCTEXT(\"EnemyGroupData\", \"SoAct1_EG_GGMiniBoss_desc\", \"Maybe it only depends on the creation process, but some Golems had stronger personality. In general, Golems with more intelligence resisted Ruin longer and Golems with strong personality were more vulnerable to the infection.\"))),(\"EG_LoneSewerDrone\", (DisplayName=NSLOCTEXT(\"EnemyGroupData\", \"SoAct1_EG_LoneSewerDrone_name\", \"Another Lone Drone\"),Description=NSLOCTEXT(\"EnemyGroupData\", \"SoAct1_EG_LoneSewerDrone_desc\", \"After Ruin most Golems liked to group together. Only a few chose to stay alone.\"))),(\"EG_AfterGateElits\", (DisplayName=NSLOCTEXT(\"EnemyGroupData\", \"SoAct1_EG_AfterGateElits_name\", \"Capetainers\"),Description=NSLOCTEXT(\"EnemyGroupData\", \"SoAct1_EG_AfterGateElits_desc\", \"The Runic Realm\\'s Government didn\\'t allow the Golems to become the privilege of the rich. Even though the elite were not allowed to have different Golems they always found a way to make their servants different than the ones owned by the poor.\"))),(\"EG_AfterGateCleaners\", (DisplayName=NSLOCTEXT(\"EnemyGroupData\", \"SoAct1_EG_AfterGateCleaners_name\", \"Cleaners of Cerulean\"),Description=NSLOCTEXT(\"EnemyGroupData\", \"SoAct1_EG_AfterGateCleaners_desc\", \"Citizens of Cerulean requested to have their own unique Golems, but it was always rejected. This situation was very good for the Black Golem Market, because this way it was always easy to find customers.\"))),(\"EG_AGWallJumpTeam\", (DisplayName=NSLOCTEXT(\"EnemyGroupData\", \"SoAct1_EG_AGWallJumpTeam_name\", \"The North Team\"),Description=NSLOCTEXT(\"EnemyGroupData\", \"SoAct1_EG_AGWallJumpTeam_desc\", \"The cleaning plan for this area fell apart with the participants.\"))),(\"EG_AGTestStoneCircle\", (DisplayName=NSLOCTEXT(\"EnemyGroupData\", \"SoAct1_EG_AGTestStoneCircle_name\", \"Weird Golems\"),Description=NSLOCTEXT(\"EnemyGroupData\", \"SoAct1_EG_AGTestStoneCircle_desc\", \"The Black Golem Market was funded by a Golem Maker apprentice who failed his master exam and was banished from school. No wonder his golems were... unique.\"))),(\"EG_SewerCircleVacuumCleaners\", (DisplayName=NSLOCTEXT(\"EnemyGroupData\", \"SoAct1_EG_SewerCircleVacuumCleaners_name\", \"Vacuum Cleaners\"),Description=NSLOCTEXT(\"EnemyGroupData\", \"SoAct1_EG_SewerCircleVacuumCleaners_desc\", \"People realised that Golem\\'s Spirits have a power beyond imagination. They called it the Ancient Magic. Vacuum Cleaners could use this magic to do their job even better.\"))),(\"EG_TL_VacuumTwins\", (DisplayName=NSLOCTEXT(\"EnemyGroupData\", \"SoAct1_EG_TL_VacuumTwins_name\", \"Library Cleaners\"),Description=NSLOCTEXT(\"EnemyGroupData\", \"SoAct1_EG_TL_VacuumTwins_desc\", \"Libraries were important in the life of the former Realm\\'s citizens. No wonder that many of the golems were created only to dust and organize the books.\"))),(\"EG_TowerTrio\", (DisplayName=NSLOCTEXT(\"EnemyGroupData\", \"SoAct1_EG_TowerTrio_name\", \"The Tower Trio\"),Description=NSLOCTEXT(\"EnemyGroupData\", \"SoAct1_EG_TowerTrio_desc\", \"They spent most of their time on the top of those towers - it was clear to me that they would die there as well.\"))),(\"EG_SAFightMustHave\", (DisplayName=NSLOCTEXT(\"EnemyGroupData\", \"SoAct1_EG_SAFightMustHave_name\", \"Underground Cleaner Band\"),Description=NSLOCTEXT(\"EnemyGroupData\", \"SoAct1_EG_SAFightMustHave_desc\", \"\\'We won\\'t clear anymore!\\' said the rebel Maintainer.\\r\\n\\'Let\\'s declear War!\\'\"))),(\"EG_SAFightOptional\", (DisplayName=NSLOCTEXT(\"EnemyGroupData\", \"SoAct1_EG_SAFightOptional_name\", \"Underground Cleaner Band B\"),Description=NSLOCTEXT(\"EnemyGroupData\", \"SoAct1_EG_SAFightOptional_desc\", \"\\'Let\\'s make something clear. Maybe this room?\\'\"))),(\"EG_MaintainerInvestigatorInvestigators\", (DisplayName=NSLOCTEXT(\"EnemyGroupData\", \"SoAct1_EG_MaintainerInvestigatorInvestigators_name\", \"Pipe Golems\"),Description=NSLOCTEXT(\"EnemyGroupData\", \"SoAct1_EG_MaintainerInvestigatorInvestigators_desc\", \"After Ruin, Golems started to have strange behavior. There were a group of them who used the pipes to flood a part of the City. Later these places were called the Sewer.\"))),(\"EG_MaintainerInvestigators\", (DisplayName=NSLOCTEXT(\"EnemyGroupData\", \"SoAct1_EG_MaintainerInvestigators_name\", \"Maintainers of the Pipes\"),Description=NSLOCTEXT(\"EnemyGroupData\", \"SoAct1_EG_MaintainerInvestigators_desc\", \"Not only the Golems were created by using the Spirits of the Unknown World before Ruin. People found other ways of using this new technology. They created pipes to convey hot water to heat the city and cold water to drink.\"))),(\"EG_SewerTeam\", (DisplayName=NSLOCTEXT(\"EnemyGroupData\", \"SoAct1_EG_SewerTeam_name\", \"Sewer Golems\"),Description=NSLOCTEXT(\"EnemyGroupData\", \"SoAct1_EG_SewerTeam_desc\", \"Golem Makers wanted to create something more intelligent as they learned more. They shaped the Maintainers, the first golems capable of talking. Sadly their intelligence vanished as Ruin came.\"))),(\"EG_SABeforeWallJump\", (DisplayName=NSLOCTEXT(\"EnemyGroupData\", \"SoAct1_EG_SABeforeWallJump_name\", \"Cleaners of the Refrigerator.\"),Description=NSLOCTEXT(\"EnemyGroupData\", \"SoAct1_EG_SABeforeWallJump_desc\", \"Some believed cold can resist Ruin longer than magic. They created places where they kept the temperature beneath the freezing point. As it turned out, not even coldness can resist Ruin forever.\"))),(\"EG_MaceGroup\", (DisplayName=NSLOCTEXT(\"EnemyGroupData\", \"SoAct1_EG_MaceGroup_name\", \"Mace Defenders\"),Description=NSLOCTEXT(\"EnemyGroupData\", \"SoAct1_EG_MaceGroup_desc\", \"\\'Attention: our enemies greatest weapon, the holy Mace is stolen. We truly should have destroyed it as the Council suggested.\\'\"))),(\"EG_TLSewerCreatureWatch\", (DisplayName=NSLOCTEXT(\"EnemyGroupData\", \"SoAct1_EG_TLSewerCreatureWatch_name\", \"Sewer Team B\"),Description=NSLOCTEXT(\"EnemyGroupData\", \"SoAct1_EG_TLSewerCreatureWatch_desc\", \"Golems never ever attacked the Pipe Walkers. The reason is only known by the wisest Pipe Walker himself. It is because, as he explained: \\'Nun dara bum, tuk la.\\'\"))),(\"EG_AGRightFromPortal\", (DisplayName=NSLOCTEXT(\"EnemyGroupData\", \"SoAct1_EG_AGRightFromPortal_name\", \"Cleaner Invasion\"),Description=NSLOCTEXT(\"EnemyGroupData\", \"SoAct1_EG_AGRightFromPortal_desc\", \"\\'Just keep cleaning! Cleaning, cleaning...\\'\"))),(\"\", ())),GroupDefeatedTexts_Unmatched=((\"EG_DroneTwins\", (DisplayName=INVTEXT(\"Drone Twins\"),Description=INVTEXT(\"\\'Yes we are twins. That\\'s why we are so alike.\\'\")))))),(\"SoAct2\", (GroupDefeatedTexts=((\"EG_HutFishies\", (DisplayName=NSLOCTEXT(\"EnemyGroupData\", \"SoAct2_EG_HutFishies_name\", \"Abandoned Fishy Slaves\"),Description=NSLOCTEXT(\"EnemyGroupData\", \"SoAct2_EG_HutFishies_desc\", \"Now that the Fishys are gone, the Lake\\'s piranhas can live in peace and eat whoever comes close.\"))),(\"EG_HutFlyArmy\", (DisplayName=NSLOCTEXT(\"EnemyGroupData\", \"SoAct2_EG_HutFlyArmy_name\", \"Annoying Flies\"),Description=NSLOCTEXT(\"EnemyGroupData\", \"SoAct2_EG_HutFlyArmy_desc\", \"No one knows where the Flies came from. Although you have a very clear idea on where they should go...\"))),(\"EG_WormHole\", (DisplayName=NSLOCTEXT(\"EnemyGroupData\", \"SoAct2_EG_WormHole_name\", \"Worms\"),Description=NSLOCTEXT(\"EnemyGroupData\", \"SoAct2_EG_WormHole_desc\", \"Worms kept distance from each other before Ruin. It\\'s strange how a force which tears everything apart can also unite.\"))),(\"EG_Wormy\", (DisplayName=NSLOCTEXT(\"EnemyGroupData\", \"SoAct2_EG_Wormy_name\", \"Worm\"),Description=NSLOCTEXT(\"EnemyGroupData\", \"SoAct2_EG_Wormy_desc\", \"There was a time when Worms only made damage to fields and gardens. Now they are a bit more ambitious...\"))),(\"EG_Shore\", (DisplayName=NSLOCTEXT(\"EnemyGroupData\", \"SoAct2_EG_Shore_name\", \"Shore Monsters\"),Description=NSLOCTEXT(\"EnemyGroupData\", \"SoAct2_EG_Shore_desc\", \"After Ruin turned them into Monsters some creatures gathered together. Whether it\\'s the effect of Ruin or something from their former life is unclear.\"))),(\"EG_SlideFishyTeam\", (DisplayName=NSLOCTEXT(\"EnemyGroupData\", \"SoAct2_EG_SlideFishyTeam_name\", \"Deserter Fishys\"),Description=NSLOCTEXT(\"EnemyGroupData\", \"SoAct2_EG_SlideFishyTeam_desc\", \"Fishys were produced by the Great Kobold tribe for slaves. Some of them managed to escape, but they couldn\\'t go far from the Lake.\"))),(\"EG_SlidePathEnd\", (DisplayName=NSLOCTEXT(\"EnemyGroupData\", \"SoAct2_EG_SlidePathEnd_name\", \"Patrol Fishys\"),Description=NSLOCTEXT(\"EnemyGroupData\", \"SoAct2_EG_SlidePathEnd_desc\", \"Deserter Fishys always kept a Fishy group close to the exit of their secret hideout. They protected the others and watched the kobolds to find the right time to venture back to the Lake.\"))),(\"EG_GolemSecond\", (DisplayName=NSLOCTEXT(\"EnemyGroupData\", \"SoAct2_EG_GolemSecond_name\", \"Second Sphere Golem\"),Description=NSLOCTEXT(\"EnemyGroupData\", \"SoAct2_EG_GolemSecond_desc\", \"Looks like the second try is just as bad as the first one.\"))),(\"EG_LavaDeepTeam\", (DisplayName=NSLOCTEXT(\"EnemyGroupData\", \"SoAct2_EG_LavaDeepTeam_name\", \"Fourth Sphere Golem\"),Description=NSLOCTEXT(\"EnemyGroupData\", \"SoAct2_EG_LavaDeepTeam_desc\", \"A fourth Sphere Golem? Someone never gives up...\"))),(\"EG_GolemFirst\", (DisplayName=NSLOCTEXT(\"EnemyGroupData\", \"SoAct2_EG_GolemFirst_name\", \"Sphere Golem\"),Description=NSLOCTEXT(\"EnemyGroupData\", \"SoAct2_EG_GolemFirst_desc\", \"Stone Golems are the cheap copies of the Runic Realm Golems. If Ruin twists the creatures mind then it will definitely have no effect on these ones.\"))),(\"EG_GolemThird\", (DisplayName=NSLOCTEXT(\"EnemyGroupData\", \"SoAct2_EG_GolemThird_name\", \"Third Sphere Golem\"),Description=NSLOCTEXT(\"EnemyGroupData\", \"SoAct2_EG_GolemThird_desc\", \"Whoever made this Golem, he should have stopped after the second try.\"))),(\"EG_LavaTeamX\", (DisplayName=NSLOCTEXT(\"EnemyGroupData\", \"SoAct2_EG_LavaTeamX_name\", \"Golem Group\"),Description=NSLOCTEXT(\"EnemyGroupData\", \"SoAct2_EG_LavaTeamX_desc\", \"Divided they fall, united they divide...\"))),(\"EG_LavaTrio\", (DisplayName=NSLOCTEXT(\"EnemyGroupData\", \"SoAct2_EG_LavaTrio_name\", \"Golem Trio\"),Description=NSLOCTEXT(\"EnemyGroupData\", \"SoAct2_EG_LavaTrio_desc\", \"Wherever Golems go after death these three will go there together.\"))),(\"EG_OutpostWallFirst\", (DisplayName=NSLOCTEXT(\"EnemyGroupData\", \"SoAct2_EG_OutpostWallFirst_name\", \"Patrols of the Outpost Wall\"),Description=NSLOCTEXT(\"EnemyGroupData\", \"SoAct2_EG_OutpostWallFirst_desc\", \"Dwarves fought Ruin with Rules. These soldiers were ordered here to guard the Outpost. Their will to obey the order was so strong that even death couldn\\'t break it.\"))),(\"EG_C_OfficePatrols\", (DisplayName=NSLOCTEXT(\"EnemyGroupData\", \"SoAct2_EG_C_OfficePatrols_name\", \"Patrols of the Law\"),Description=NSLOCTEXT(\"EnemyGroupData\", \"SoAct2_EG_C_OfficePatrols_desc\", \"Going into the Law\\'s High Office was forbidden even for most of the Dwarves. Only one path lead to the Office and that was guarded by the Patrols.\"))),(\"EG_C_LoneShadeSphere\", (DisplayName=NSLOCTEXT(\"EnemyGroupData\", \"SoAct2_EG_C_LoneShadeSphere_name\", \"Weird Floating Thing\"),Description=NSLOCTEXT(\"EnemyGroupData\", \"SoAct2_EG_C_LoneShadeSphere_desc\", \"Before Ruin there was no other humanoid race but human. New races are created by Ruin\\'s Shades. They roam the lands looking for any living being which they can possess. Once they become part of a creature its body will start to change.\"))),(\"EG_OutpostRight\", (DisplayName=NSLOCTEXT(\"EnemyGroupData\", \"SoAct2_EG_OutpostRight_name\", \"Guardians of the East Wall\"),Description=NSLOCTEXT(\"EnemyGroupData\", \"SoAct2_EG_OutpostRight_desc\", \"Ruin was not only meant for destruction, it could also preserve. Ruin gave endless life for those who survived at the cost of twisting their minds.\"))),(\"EG_OutpostLeft\", (DisplayName=NSLOCTEXT(\"EnemyGroupData\", \"SoAct2_EG_OutpostLeft_name\", \"Guardians of the West Wall\"),Description=NSLOCTEXT(\"EnemyGroupData\", \"SoAct2_EG_OutpostLeft_desc\", \"To keep Ruin away dwarves forbade everything related to Ruin\\'s magic. This might have worked in theory but they failed to notice that their mechanical devices were also powered by Ruin.\"))),(\"EG_C_BeforeKey\", (DisplayName=NSLOCTEXT(\"EnemyGroupData\", \"SoAct2_EG_C_BeforeKey_name\", \"Anxious Armours\"),Description=NSLOCTEXT(\"EnemyGroupData\", \"SoAct2_EG_C_BeforeKey_desc\", \"It\\'s still unclear what makes some creatures touched by Ruin to group together. Some believes those who had similar emotions when Ruin came were likely to form a group.\"))),(\"EG_C_Bridge\", (DisplayName=NSLOCTEXT(\"EnemyGroupData\", \"SoAct2_EG_C_Bridge_name\", \"Bridge Brigade\"),Description=NSLOCTEXT(\"EnemyGroupData\", \"SoAct2_EG_C_Bridge_desc\", \"Crafting was always the obsession of Dwarves. In their workshops they forged mighty weapons and wondrous armours. Their love for their craft was so strong that instead of their body, Ruin preserved their iron works.\"))),(\"EG_C_OfficeGuards\", (DisplayName=NSLOCTEXT(\"EnemyGroupData\", \"SoAct2_EG_C_OfficeGuards_name\", \"Guardians of the Law\"),Description=NSLOCTEXT(\"EnemyGroupData\", \"SoAct2_EG_C_OfficeGuards_desc\", \"Watching the only way to the Office did not bring enough protection. If any intruder managed to pass the Patrols he still had to face the Guardians to proceed.\"))),(\"EG_DG_Left\", (DisplayName=NSLOCTEXT(\"EnemyGroupData\", \"SoAct2_EG_DG_Left_name\", \"Glorious Group\"),Description=NSLOCTEXT(\"EnemyGroupData\", \"SoAct2_EG_DG_Left_desc\", \"Deep beneath the Catacombs there is a secret place called the Dwarven Gate. Elite dwarves who worked here were placed above the Law. They were seeking a way to fight Ruin with Ruin\\'s magic.\"))),(\"EG_DG_RightUpOptional\", (DisplayName=NSLOCTEXT(\"EnemyGroupData\", \"SoAct2_EG_DG_RightUpOptional_name\", \"Sculptors\"),Description=NSLOCTEXT(\"EnemyGroupData\", \"SoAct2_EG_DG_RightUpOptional_desc\", \"One idea of the Elite Dwarves was to create giant statues which are able to trap Ruin\\'s essence. Even if they were right they never managed to make enough sculptures.\"))),(\"EG_DG_RightFloor\", (DisplayName=NSLOCTEXT(\"EnemyGroupData\", \"SoAct2_EG_DG_RightFloor_name\", \"Not so Elite Dwarves\"),Description=NSLOCTEXT(\"EnemyGroupData\", \"SoAct2_EG_DG_RightFloor_desc\", \"Even though most of the common Dwarves never even heard about Dwarven Gate some were needed to do the hard work. Now that Ruin won, Dwarves are finally equal.\"))),(\"EG_BounceTrio\", (DisplayName=NSLOCTEXT(\"EnemyGroupData\", \"SoAct2_EG_BounceTrio_name\", \"Bounce Trio\"),Description=NSLOCTEXT(\"EnemyGroupData\", \"SoAct2_EG_BounceTrio_desc\", \"Lava Jumpers are former Golems who fell into the lava. Some of them return to join their former Golem companions.\"))),(\"EG_LavaJumpers\", (DisplayName=NSLOCTEXT(\"EnemyGroupData\", \"SoAct2_EG_LavaJumpers_name\", \"Lava Jumpers\"),Description=NSLOCTEXT(\"EnemyGroupData\", \"SoAct2_EG_LavaJumpers_desc\", \"When a Golem falls into the lava its stone body will melt away. The spirit however resists the heat and will be looking for another body...\"))),(\"EG_DwarfBoss\", (DisplayName=NSLOCTEXT(\"EnemyGroupData\", \"SoAct2_EG_DwarfBoss_name\", \"Dwarven Statue\"),Description=NSLOCTEXT(\"EnemyGroupData\", \"SoAct2_EG_DwarfBoss_desc\", \"Dwarven Statues were meant to imprison the essence of Ruin. However there were some Dwarven scientists who feared that the statues were not safe and in the long run they wouldn\\'t be able to resist the power of Ruin...\"))),(\"EG_WWBoss\", (DisplayName=NSLOCTEXT(\"EnemyGroupData\", \"SoAct2_EG_WWBoss_name\", \"Fallen Druid\"),Description=NSLOCTEXT(\"EnemyGroupData\", \"SoAct2_EG_WWBoss_desc\", \"When Ruin appeared some decided to abandon civilization and return to nature. Their leader, the Fallen Druid cast an ancient spell to protect his plants from Ruin. His spell partly worked but at a terrible cost.\"))),(\"EG_LavaBoss\", (DisplayName=NSLOCTEXT(\"EnemyGroupData\", \"SoAct2_EG_LavaBoss_name\", \"Armour Wrath\"),Description=NSLOCTEXT(\"EnemyGroupData\", \"SoAct2_EG_LavaBoss_desc\", \"Armour Wrath was the most ambitious and majestic work of the Golem Maker. He used all his remaining strength to create this mighty Golem. It\\'s a pity that all his efforts were in vain.\"))),(\"\", ())),GroupDefeatedTexts_Unmatched=((\"EG_OfficeGuards\", (DisplayName=INVTEXT(\"Guardians of Law\"),Description=INVTEXT(\"TODO\"))),(\"EG_DCCircle\", (DisplayName=INVTEXT(\"\"),Description=INVTEXT(\"\"))),(\"EG_LavaGroup0\", (DisplayName=INVTEXT(\"Lava Group 0\"),Description=INVTEXT(\"Not Yet written text\")))))),(\"SoAct3\", (GroupDefeatedTexts=((\"EG_Act3RangedCleanerTwins\", (DisplayName=NSLOCTEXT(\"EnemyGroupData\", \"SoAct3_EG_Act3RangedCleanerTwins_name\", \"Cleaner Twins\"),Description=NSLOCTEXT(\"EnemyGroupData\", \"SoAct3_EG_Act3RangedCleanerTwins_desc\", \"Ruin\\'s nature is confusing for the human mind. It can build, it can destroy, it can use, it can be used. These actions have the same priority for Ruin. All that matters is that it can do something. And with time it wants more and more.\"))),(\"EG_Act3VacuumTwins\", (DisplayName=NSLOCTEXT(\"EnemyGroupData\", \"SoAct3_EG_Act3VacuumTwins_name\", \"Elite Twins\"),Description=NSLOCTEXT(\"EnemyGroupData\", \"SoAct3_EG_Act3VacuumTwins_desc\", \"Ruin\\'s logic is predictable when you understand its nature. When it\\'s not possible to create more the creation process can be restarted by destroying everything first.\"))),(\"EG_Act3FinalBattle\", (DisplayName=NSLOCTEXT(\"EnemyGroupData\", \"SoAct3_EG_Act3FinalBattle_name\", \"Ruined Convention\"),Description=NSLOCTEXT(\"EnemyGroupData\", \"SoAct3_EG_Act3FinalBattle_desc\", \"Even though Ruin doesn\\'t have consciousness nor the ability to think it somehow reacts to your presence. As if it knew the threat you present, Ruin tries all it can to stop you from leaving the Ruined Realm.\"))),(\"EG_Act3PipeGroupSecond\", (DisplayName=NSLOCTEXT(\"EnemyGroupData\", \"SoAct3_EG_Act3PipeGroupSecond_name\", \"More Drones\"),Description=NSLOCTEXT(\"EnemyGroupData\", \"SoAct3_EG_Act3PipeGroupSecond_desc\", \"Transformation is relative to intelligence. Creatures with consciousness have a strong desire to reserve their ego. Ruin can fool them a few times but later they become invulnerable to Ruin\\'s changing power.\"))),(\"EG_Act3PipeGroupFirst\", (DisplayName=NSLOCTEXT(\"EnemyGroupData\", \"SoAct3_EG_Act3PipeGroupFirst_name\", \"Red Drones\"),Description=NSLOCTEXT(\"EnemyGroupData\", \"SoAct3_EG_Act3PipeGroupFirst_desc\", \"There is a difference between how Humans and Golems are transformed by Ruin. Human bodies reach their final form in a few decades but Golems never stop changing. There is always a new, more vicious type.\"))),(\"EG_Act3BubbleGroundMain\", (DisplayName=NSLOCTEXT(\"EnemyGroupData\", \"SoAct3_EG_Act3BubbleGroundMain_name\", \"Maintainer Spellcasters\"),Description=NSLOCTEXT(\"EnemyGroupData\", \"SoAct3_EG_Act3BubbleGroundMain_desc\", \"Ruin\\'s power is not only in destruction. When it can\\'t change something it will preserve those attributes which can prepare the possibility to change again. Ruin\\'s power is in change.\")))))),(\"WhiteWall\", (GroupDefeatedTexts=((\"EG_FirstCombat\", (DisplayName=NSLOCTEXT(\"EnemyGroupData\", \"WhiteWall_EG_FirstCombat_name\", \"Whitewall Cleaners\"),Description=NSLOCTEXT(\"EnemyGroupData\", \"WhiteWall_EG_FirstCombat_desc\", \"Cleaners were the first Golems ever made. Before the Cataclysm they did all the monoton work so that the people had more time to think and to create.\"))),(\"EG_FirstOptionalCombat\", (DisplayName=NSLOCTEXT(\"EnemyGroupData\", \"WhiteWall_EG_FirstOptionalCombat_name\", \"Whitewall Maintainers\"),Description=NSLOCTEXT(\"EnemyGroupData\", \"WhiteWall_EG_FirstOptionalCombat_desc\", \"After the different types of Cleaners, Golem Makers wanted to create something greater than working robots. They started to design creatures with intelligence.\"))),(\"EG_BeforeKobold\", (DisplayName=NSLOCTEXT(\"EnemyGroupData\", \"WhiteWall_EG_BeforeKobold_name\", \"Infected Golems\"),Description=NSLOCTEXT(\"EnemyGroupData\", \"WhiteWall_EG_BeforeKobold_desc\", \"When the Cataclysm happened and Ruin came the Golems started to change. Instead of doing their daily work some of them turned against their masters.\"))),(\"EG_AfterKobold\", (DisplayName=NSLOCTEXT(\"EnemyGroupData\", \"WhiteWall_EG_AfterKobold_name\", \"Flying Maintainer\"),Description=NSLOCTEXT(\"EnemyGroupData\", \"WhiteWall_EG_AfterKobold_desc\", \"Creating intelligence was not enough for the Golem Makers. They wanted to get even further. They wanted to create Golems with emotions.\"))),(\"\", ())),GroupDefeatedTexts_Unmatched=((\"EG_GGMiniBoss\", (DisplayName=INVTEXT(\"\"),Description=INVTEXT(\"\")))))))\nDamageTypeColors=((Magic, (R=1.000000,G=0.313989,B=0.000000,A=1.000000)),(Physical, (R=0.964706,G=1.000000,B=0.243137,A=1.000000)),(Mixed, (R=0.067708,G=0.067708,B=0.067708,A=1.000000)),(None, (R=0.000000,G=0.000000,B=0.000000,A=1.000000)))\nDamageColorPhysical=(R=0.473532,G=0.011612,B=0.011612,A=1.000000)\nDamageColorMagic=(R=1.000000,G=0.830770,B=0.043735,A=1.000000)\n+ItemRarityColors=(R=1.000000,G=1.000000,B=1.000000,A=1.000000)\n+ItemRarityColors=(R=0.304987,G=0.644480,B=0.337164,A=1.000000)\n+ItemRarityColors=(R=0.162029,G=0.630757,B=0.644480,A=1.000000)\n+ItemRarityColors=(R=0.558341,G=0.132868,B=0.610496,A=1.000000)\n+ItemRarityColors=(R=0.607843,G=0.580392,B=0.000000,A=1.000000)\nItemBackgroundColorsMapPtr=((EIT_Shard, /Game/SO/GUI/art/ItemIcon/Backgrounds/orb_brown.orb_brown),(EIT_UsableItem, /Game/SO/GUI/art/ItemIcon/Backgrounds/orb_use.orb_use),(EIT_Jewelry, /Game/SO/GUI/art/ItemIcon/Backgrounds/orb_red.orb_red),(EIT_QuestItem, /Game/SO/GUI/art/ItemIcon/Backgrounds/orb_purple.orb_purple),(EIT_Key, /Game/SO/GUI/art/ItemIcon/Backgrounds/orb_green.orb_green),(EIT_MemoryStone, /Game/SO/GUI/art/ItemIcon/Backgrounds/orb_yellow.orb_yellow),(EIT_RuneStone, /Game/SO/GUI/art/ItemIcon/Backgrounds/orb_blue.orb_blue),(EIT_Weapon, /Game/SO/GUI/art/ItemIcon/Backgrounds/orb_weapon.orb_weapon))\nDamageTypesTexturesMapPtr=((Magic, /Game/SO/GUI/art/CharacterStatus/dmgtype_warm.dmgtype_warm),(Physical, /Game/SO/GUI/art/CharacterStatus/dmgtype_slash.dmgtype_slash))\nInputInvalidIconPtr=/Game/SO/GUI/art/CntrlIcon/Input_None.Input_None\nInputKeyboardTexturesMap=((\"Backslash\", (Pressed=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/Keyboard/dark/Keyboard_Black_Slash.Keyboard_Black_Slash\"',Unpressed=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/Keyboard/light/Keyboard_White_Slash.Keyboard_White_Slash\"')),(\"Tab\", (Pressed=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/key_tab.key_tab\"',Unpressed=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/key_tab_unpressed.key_tab_unpressed\"')),(\"Enter\", (Pressed=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/Keyboard/dark/Keyboard_Black_Enter.Keyboard_Black_Enter\"',Unpressed=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/Keyboard/light/Keyboard_White_Enter.Keyboard_White_Enter\"')),(\"CapsLock\", (Pressed=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/Keyboard/dark/Keyboard_Black_Caps_Lock.Keyboard_Black_Caps_Lock\"',Unpressed=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/Keyboard/light/Keyboard_White_Caps_Lock.Keyboard_White_Caps_Lock\"')),(\"Escape\", (Pressed=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/esc.esc\"',Unpressed=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/esc.esc\"')),(\"SpaceBar\", (Pressed=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/key_space.key_space\"',Unpressed=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/key_space_unpressed.key_space_unpressed\"')),(\"PageUp\", (Pressed=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/Keyboard/dark/Keyboard_Black_Page_Up.Keyboard_Black_Page_Up\"',Unpressed=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/Keyboard/light/Keyboard_White_Page_Up.Keyboard_White_Page_Up\"')),(\"PageDown\", (Pressed=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/Keyboard/dark/Keyboard_Black_Page_Down.Keyboard_Black_Page_Down\"',Unpressed=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/Keyboard/light/Keyboard_White_Page_Down.Keyboard_White_Page_Down\"')),(\"End\", (Pressed=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/Keyboard/dark/Keyboard_Black_End.Keyboard_Black_End\"',Unpressed=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/Keyboard/light/Keyboard_White_End.Keyboard_White_End\"')),(\"Home\", (Pressed=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/Keyboard/dark/Keyboard_Black_Home.Keyboard_Black_Home\"',Unpressed=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/Keyboard/light/Keyboard_White_Home.Keyboard_White_Home\"')),(\"Left\", (Pressed=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/arrow_left.arrow_left\"',Unpressed=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/arrow_left_pressed.arrow_left_pressed\"')),(\"Up\", (Pressed=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/arrow_up.arrow_up\"',Unpressed=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/arrow_up_pressed.arrow_up_pressed\"')),(\"Right\", (Pressed=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/arrow_right.arrow_right\"',Unpressed=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/arrow_right_pressed.arrow_right_pressed\"')),(\"Down\", (Pressed=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/arrow_down.arrow_down\"',Unpressed=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/arrow_down_pressed.arrow_down_pressed\"')),(\"Insert\", (Pressed=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/Keyboard/dark/Keyboard_Black_Insert.Keyboard_Black_Insert\"',Unpressed=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/Keyboard/light/Keyboard_White_Insert.Keyboard_White_Insert\"')),(\"Delete\", (Pressed=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/Keyboard/dark/Keyboard_Black_Del.Keyboard_Black_Del\"',Unpressed=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/Keyboard/light/Keyboard_White_Del.Keyboard_White_Del\"')),(\"Zero\", (Pressed=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/Keyboard/dark/Keyboard_Black_0.Keyboard_Black_0\"',Unpressed=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/Keyboard/light/Keyboard_White_0.Keyboard_White_0\"')),(\"One\", (Pressed=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/Keyboard/dark/Keyboard_Black_1.Keyboard_Black_1\"',Unpressed=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/Keyboard/light/Keyboard_White_1.Keyboard_White_1\"')),(\"Two\", (Pressed=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/Keyboard/dark/Keyboard_Black_2.Keyboard_Black_2\"',Unpressed=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/Keyboard/light/Keyboard_White_2.Keyboard_White_2\"')),(\"Three\", (Pressed=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/Keyboard/dark/Keyboard_Black_3.Keyboard_Black_3\"',Unpressed=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/Keyboard/light/Keyboard_White_3.Keyboard_White_3\"')),(\"Four\", (Pressed=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/Keyboard/dark/Keyboard_Black_4.Keyboard_Black_4\"',Unpressed=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/Keyboard/light/Keyboard_White_4.Keyboard_White_4\"')),(\"Five\", (Pressed=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/Keyboard/dark/Keyboard_Black_5.Keyboard_Black_5\"',Unpressed=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/Keyboard/light/Keyboard_White_5.Keyboard_White_5\"')),(\"Six\", (Pressed=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/Keyboard/dark/Keyboard_Black_6.Keyboard_Black_6\"',Unpressed=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/Keyboard/light/Keyboard_White_6.Keyboard_White_6\"')),(\"Seven\", (Pressed=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/Keyboard/dark/Keyboard_Black_7.Keyboard_Black_7\"',Unpressed=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/Keyboard/light/Keyboard_White_7.Keyboard_White_7\"')),(\"Eight\", (Pressed=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/Keyboard/dark/Keyboard_Black_8.Keyboard_Black_8\"',Unpressed=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/Keyboard/light/Keyboard_White_8.Keyboard_White_8\"')),(\"Nine\", (Pressed=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/Keyboard/dark/Keyboard_Black_9.Keyboard_Black_9\"',Unpressed=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/Keyboard/light/Keyboard_White_9.Keyboard_White_9\"')),(\"A\", (Pressed=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/key_a.key_a\"',Unpressed=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/key_a_unpressed.key_a_unpressed\"')),(\"B\", (Pressed=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/Keyboard/dark/Keyboard_Black_B.Keyboard_Black_B\"',Unpressed=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/Keyboard/light/Keyboard_White_B.Keyboard_White_B\"')),(\"C\", (Pressed=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/key_c.key_c\"',Unpressed=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/key_c_unpressed.key_c_unpressed\"')),(\"D\", (Pressed=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/key_d.key_d\"',Unpressed=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/key_d_unpressed.key_d_unpressed\"')),(\"E\", (Pressed=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/key_e.key_e\"',Unpressed=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/key_e_unpressed.key_e_unpressed\"')),(\"F\", (Pressed=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/key_f.key_f\"',Unpressed=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/key_f_unpressed.key_f_unpressed\"')),(\"G\", (Pressed=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/key_g.key_g\"',Unpressed=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/Keyboard/light/Keyboard_White_G.Keyboard_White_G\"')),(\"H\", (Pressed=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/Keyboard/dark/Keyboard_Black_H.Keyboard_Black_H\"',Unpressed=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/Keyboard/light/Keyboard_White_H.Keyboard_White_H\"')),(\"I\", (Pressed=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/key_i.key_i\"',Unpressed=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/key_i_unpressed.key_i_unpressed\"')),(\"J\", (Pressed=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/key_j.key_j\"',Unpressed=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/key_j_unpressed.key_j_unpressed\"')),(\"K\", (Pressed=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/key_k.key_k\"',Unpressed=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/key_k_unpressed.key_k_unpressed\"')),(\"L\", (Pressed=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/key_l.key_l\"',Unpressed=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/key_l_unpressed.key_l_unpressed\"')),(\"M\", (Pressed=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/Keyboard/dark/Keyboard_Black_M.Keyboard_Black_M\"',Unpressed=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/Keyboard/light/Keyboard_White_M.Keyboard_White_M\"')),(\"N\", (Pressed=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/Keyboard/dark/Keyboard_Black_N.Keyboard_Black_N\"',Unpressed=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/Keyboard/light/Keyboard_White_N.Keyboard_White_N\"')),(\"O\", (Pressed=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/Keyboard/dark/Keyboard_Black_O.Keyboard_Black_O\"',Unpressed=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/Keyboard/light/Keyboard_White_O.Keyboard_White_O\"')),(\"P\", (Pressed=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/Keyboard/dark/Keyboard_Black_P.Keyboard_Black_P\"',Unpressed=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/Keyboard/light/Keyboard_White_P.Keyboard_White_P\"')),(\"Q\", (Pressed=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/key_q.key_q\"',Unpressed=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/key_q_unpressed.key_q_unpressed\"')),(\"R\", (Pressed=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/key_r.key_r\"',Unpressed=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/key_r_unpressed.key_r_unpressed\"')),(\"S\", (Pressed=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/key_s.key_s\"',Unpressed=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/key_s_unpressed.key_s_unpressed\"')),(\"T\", (Pressed=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/key_t.key_t\"',Unpressed=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/key_t_unpressed.key_t_unpressed\"')),(\"U\", (Pressed=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/Keyboard/dark/Keyboard_Black_U.Keyboard_Black_U\"',Unpressed=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/Keyboard/light/Keyboard_White_U.Keyboard_White_U\"')),(\"V\", (Pressed=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/key_v.key_v\"',Unpressed=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/key_v_unpressed.key_v_unpressed\"')),(\"W\", (Pressed=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/key_w.key_w\"',Unpressed=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/Keyboard/light/Keyboard_White_W.Keyboard_White_W\"')),(\"X\", (Pressed=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/Keyboard/dark/Keyboard_Black_X.Keyboard_Black_X\"',Unpressed=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/Keyboard/light/Keyboard_White_X.Keyboard_White_X\"')),(\"Y\", (Pressed=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/Keyboard/dark/Keyboard_Black_Y.Keyboard_Black_Y\"',Unpressed=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/Keyboard/light/Keyboard_White_Y.Keyboard_White_Y\"')),(\"Z\", (Pressed=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/Keyboard/dark/Keyboard_Black_Z.Keyboard_Black_Z\"',Unpressed=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/Keyboard/light/Keyboard_White_Z.Keyboard_White_Z\"')),(\"NumPadZero\", (Pressed=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/Keyboard/dark/Keyboard_Black_0.Keyboard_Black_0\"',Unpressed=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/Keyboard/light/Keyboard_White_0.Keyboard_White_0\"')),(\"NumPadOne\", (Pressed=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/Keyboard/dark/Keyboard_Black_1.Keyboard_Black_1\"',Unpressed=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/Keyboard/light/Keyboard_White_1.Keyboard_White_1\"')),(\"NumPadTwo\", (Pressed=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/Keyboard/dark/Keyboard_Black_2.Keyboard_Black_2\"',Unpressed=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/Keyboard/light/Keyboard_White_2.Keyboard_White_2\"')),(\"NumPadThree\", (Pressed=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/Keyboard/dark/Keyboard_Black_3.Keyboard_Black_3\"',Unpressed=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/Keyboard/light/Keyboard_White_3.Keyboard_White_3\"')),(\"NumPadFour\", (Pressed=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/Keyboard/dark/Keyboard_Black_4.Keyboard_Black_4\"',Unpressed=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/Keyboard/light/Keyboard_White_4.Keyboard_White_4\"')),(\"NumPadFive\", (Pressed=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/Keyboard/dark/Keyboard_Black_5.Keyboard_Black_5\"',Unpressed=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/Keyboard/light/Keyboard_White_5.Keyboard_White_5\"')),(\"NumPadSix\", (Pressed=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/Keyboard/dark/Keyboard_Black_6.Keyboard_Black_6\"',Unpressed=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/Keyboard/light/Keyboard_White_6.Keyboard_White_6\"')),(\"NumPadSeven\", (Pressed=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/Keyboard/dark/Keyboard_Black_7.Keyboard_Black_7\"',Unpressed=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/Keyboard/light/Keyboard_White_7.Keyboard_White_7\"')),(\"NumPadEight\", (Pressed=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/Keyboard/dark/Keyboard_Black_8.Keyboard_Black_8\"',Unpressed=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/Keyboard/light/Keyboard_White_8.Keyboard_White_8\"')),(\"NumPadNine\", (Pressed=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/Keyboard/dark/Keyboard_Black_9.Keyboard_Black_9\"',Unpressed=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/Keyboard/light/Keyboard_White_9.Keyboard_White_9\"')),(\"Multiply\", (Pressed=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/Keyboard/dark/Keyboard_Black_Asterisk.Keyboard_Black_Asterisk\"',Unpressed=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/Keyboard/light/Keyboard_White_Asterisk.Keyboard_White_Asterisk\"')),(\"Add\", (Pressed=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/Keyboard/dark/Keyboard_Black_Plus.Keyboard_Black_Plus\"',Unpressed=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/Keyboard/light/Keyboard_White_Plus.Keyboard_White_Plus\"')),(\"Subtract\", (Pressed=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/Keyboard/dark/Keyboard_Black_Minus.Keyboard_Black_Minus\"',Unpressed=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/Keyboard/light/Keyboard_White_Minus.Keyboard_White_Minus\"')),(\"F1\", (Pressed=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/Keyboard/dark/Keyboard_Black_F1.Keyboard_Black_F1\"',Unpressed=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/Keyboard/light/Keyboard_White_F1.Keyboard_White_F1\"')),(\"F2\", (Pressed=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/Keyboard/dark/Keyboard_Black_F2.Keyboard_Black_F2\"',Unpressed=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/Keyboard/light/Keyboard_White_F2.Keyboard_White_F2\"')),(\"F3\", (Pressed=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/Keyboard/dark/Keyboard_Black_F3.Keyboard_Black_F3\"',Unpressed=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/Keyboard/light/Keyboard_White_F3.Keyboard_White_F3\"')),(\"F4\", (Pressed=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/Keyboard/dark/Keyboard_Black_F4.Keyboard_Black_F4\"',Unpressed=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/Keyboard/light/Keyboard_White_F4.Keyboard_White_F4\"')),(\"F5\", (Pressed=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/Keyboard/dark/Keyboard_Black_F5.Keyboard_Black_F5\"',Unpressed=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/Keyboard/light/Keyboard_White_F5.Keyboard_White_F5\"')),(\"F6\", (Pressed=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/Keyboard/dark/Keyboard_Black_F6.Keyboard_Black_F6\"',Unpressed=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/Keyboard/light/Keyboard_White_F6.Keyboard_White_F6\"')),(\"F7\", (Pressed=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/Keyboard/dark/Keyboard_Black_F7.Keyboard_Black_F7\"',Unpressed=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/Keyboard/light/Keyboard_White_F7.Keyboard_White_F7\"')),(\"F8\", (Pressed=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/Keyboard/dark/Keyboard_Black_F8.Keyboard_Black_F8\"',Unpressed=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/Keyboard/light/Keyboard_White_F8.Keyboard_White_F8\"')),(\"F9\", (Pressed=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/Keyboard/dark/Keyboard_Black_F9.Keyboard_Black_F9\"',Unpressed=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/Keyboard/light/Keyboard_White_F9.Keyboard_White_F9\"')),(\"F10\", (Pressed=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/Keyboard/dark/Keyboard_Black_F10.Keyboard_Black_F10\"',Unpressed=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/Keyboard/light/Keyboard_White_F10.Keyboard_White_F10\"')),(\"F11\", (Pressed=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/Keyboard/dark/Keyboard_Black_F11.Keyboard_Black_F11\"',Unpressed=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/Keyboard/light/Keyboard_White_F11.Keyboard_White_F11\"')),(\"F12\", (Pressed=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/Keyboard/dark/Keyboard_Black_F12.Keyboard_Black_F12\"',Unpressed=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/Keyboard/light/Keyboard_White_F12.Keyboard_White_F12\"')),(\"NumLock\", (Pressed=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/Keyboard/dark/Keyboard_Black_Num_Lock.Keyboard_Black_Num_Lock\"',Unpressed=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/Keyboard/light/Keyboard_White_Num_Lock.Keyboard_White_Num_Lock\"')),(\"LeftShift\", (Pressed=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/Keyboard/dark/Keyboard_Black_Shift.Keyboard_Black_Shift\"',Unpressed=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/Keyboard/light/Keyboard_White_Shift.Keyboard_White_Shift\"')),(\"RightShift\", (Pressed=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/Keyboard/dark/Keyboard_Black_Shift_Alt.Keyboard_Black_Shift_Alt\"',Unpressed=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/Keyboard/light/Keyboard_White_Shift_Alt.Keyboard_White_Shift_Alt\"')),(\"LeftControl\", (Pressed=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/Keyboard/dark/Keyboard_Black_Ctrl.Keyboard_Black_Ctrl\"',Unpressed=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/Keyboard/light/Keyboard_White_Ctrl.Keyboard_White_Ctrl\"')),(\"RightControl\", (Pressed=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/Keyboard/dark/Keyboard_Black_Ctrl.Keyboard_Black_Ctrl\"',Unpressed=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/Keyboard/light/Keyboard_White_Ctrl.Keyboard_White_Ctrl\"')),(\"LeftAlt\", (Pressed=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/Keyboard/dark/Keyboard_Black_Alt.Keyboard_Black_Alt\"',Unpressed=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/Keyboard/light/Keyboard_White_Alt.Keyboard_White_Alt\"')),(\"RightAlt\", (Pressed=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/Keyboard/dark/Keyboard_Black_Alt.Keyboard_Black_Alt\"',Unpressed=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/Keyboard/light/Keyboard_White_Alt.Keyboard_White_Alt\"')),(\"LeftCommand\", (Pressed=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/Keyboard/dark/Keyboard_Black_Command.Keyboard_Black_Command\"',Unpressed=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/Keyboard/light/Keyboard_White_Command.Keyboard_White_Command\"')),(\"RightCommand\", (Pressed=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/Keyboard/dark/Keyboard_Black_Command.Keyboard_Black_Command\"',Unpressed=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/Keyboard/light/Keyboard_White_Command.Keyboard_White_Command\"')),(\"Tilde\", (Pressed=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/Keyboard/dark/Keyboard_Black_Tilda.Keyboard_Black_Tilda\"',Unpressed=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/Keyboard/light/Keyboard_White_Tilda.Keyboard_White_Tilda\"')),(\"LeftBracket\", (Pressed=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/Keyboard/dark/Keyboard_Black_Bracket_Left.Keyboard_Black_Bracket_Left\"',Unpressed=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/Keyboard/light/Keyboard_White_Bracket_Left.Keyboard_White_Bracket_Left\"')),(\"RightBracket\", (Pressed=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/Keyboard/dark/Keyboard_Black_Bracket_Right.Keyboard_Black_Bracket_Right\"',Unpressed=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/Keyboard/light/Keyboard_White_Bracket_Right.Keyboard_White_Bracket_Right\"')),(\"Semicolon\", (Pressed=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/Keyboard/dark/Keyboard_Black_Semicolon.Keyboard_Black_Semicolon\"',Unpressed=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/Keyboard/light/Keyboard_White_Semicolon.Keyboard_White_Semicolon\"')),(\"Quote\", (Pressed=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/Keyboard/dark/Keyboard_Black_Quote.Keyboard_Black_Quote\"',Unpressed=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/Keyboard/light/Keyboard_White_Quote.Keyboard_White_Quote\"')),(\"Equals\", ()),(\"Comma\", ()),(\"Underscore\", ()),(\"Hyphen\", ()),(\"Period\", ()),(\"Slash\", (Pressed=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/Keyboard/dark/Keyboard_Black_Slash.Keyboard_Black_Slash\"',Unpressed=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/Keyboard/light/Keyboard_White_Slash.Keyboard_White_Slash\"')),(\"Apostrophe\", ()),(\"Ampersand\", ()),(\"Asterix\", ()),(\"Caret\", ()),(\"Colon\", ()),(\"Dollar\", ()),(\"Exclamation\", ()),(\"LeftParantheses\", ()),(\"RightParantheses\", ()),(\"Pause\", ()),(\"Decimal\", ()),(\"Divide\", ()),(\"ScrollLock\", ()))\nInputGamepadTexturesMap=((\"Gamepad_LeftThumbstick\", (Xbox=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/Xbox/XboxOne_Left_Stick.XboxOne_Left_Stick\"',PlayStation=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/PlayStation/PS4_Left_Stick.PS4_Left_Stick\"',Switch=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/NintendoSwitch/Switch_Left_Stick.Switch_Left_Stick\"')),(\"Gamepad_RightThumbstick\", (Xbox=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/Xbox/XboxOne_Right_Stick.XboxOne_Right_Stick\"',PlayStation=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/PlayStation/PS4_Right_Stick.PS4_Right_Stick\"',Switch=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/NintendoSwitch/Switch_Right_Stick.Switch_Right_Stick\"')),(\"Gamepad_Special_Left\", (Xbox=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/Xbox/XboxOne_Windows.XboxOne_Windows\"',PlayStation=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/PlayStation/PS4_Share_white.PS4_Share_white\"',Switch=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/NintendoSwitch/Switch_Minus.Switch_Minus\"')),(\"Gamepad_Special_Right\", (Xbox=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/Xbox/XboxOne_Menu.XboxOne_Menu\"',PlayStation=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/PlayStation/PS4_Options_white.PS4_Options_white\"',Switch=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/NintendoSwitch/Switch_Plus.Switch_Plus\"')),(\"Gamepad_FaceButton_Bottom\", (Xbox=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/Xbox/XboxOne_A.XboxOne_A\"',PlayStation=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/PlayStation/PS4_Cross.PS4_Cross\"',Switch=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/NintendoSwitch/Switch_B.Switch_B\"')),(\"Gamepad_FaceButton_Right\", (Xbox=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/Xbox/XboxOne_B.XboxOne_B\"',PlayStation=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/PlayStation/PS4_Circle.PS4_Circle\"',Switch=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/NintendoSwitch/Switch_A.Switch_A\"')),(\"Gamepad_FaceButton_Left\", (Xbox=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/Xbox/XboxOne_X.XboxOne_X\"',PlayStation=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/PlayStation/PS4_Square.PS4_Square\"',Switch=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/NintendoSwitch/Switch_Y.Switch_Y\"')),(\"Gamepad_FaceButton_Top\", (Xbox=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/Xbox/XboxOne_Y.XboxOne_Y\"',PlayStation=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/PlayStation/PS4_Triangle.PS4_Triangle\"',Switch=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/NintendoSwitch/Switch_X.Switch_X\"')),(\"Gamepad_LeftShoulder\", (Xbox=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/Xbox/XboxOne_LB.XboxOne_LB\"',PlayStation=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/PlayStation/PS4_L1.PS4_L1\"',Switch=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/NintendoSwitch/Switch_LB.Switch_LB\"')),(\"Gamepad_RightShoulder\", (Xbox=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/Xbox/XboxOne_RB.XboxOne_RB\"',PlayStation=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/PlayStation/PS4_R1.PS4_R1\"',Switch=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/NintendoSwitch/Switch_RB.Switch_RB\"')),(\"Gamepad_LeftTrigger\", (Xbox=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/Xbox/XboxOne_LT.XboxOne_LT\"',PlayStation=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/PlayStation/PS4_L2.PS4_L2\"',Switch=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/NintendoSwitch/Switch_LT.Switch_LT\"')),(\"Gamepad_RightTrigger\", (Xbox=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/Xbox/XboxOne_RT.XboxOne_RT\"',PlayStation=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/PlayStation/PS4_R2.PS4_R2\"',Switch=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/NintendoSwitch/Switch_RT.Switch_RT\"')),(\"Gamepad_DPad_Up\", (Xbox=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/Xbox/XboxOne_Dpad_Up.XboxOne_Dpad_Up\"',PlayStation=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/PlayStation/PS4_Dpad_Up.PS4_Dpad_Up\"',Switch=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/NintendoSwitch/Switch_Dpad_Up.Switch_Dpad_Up\"')),(\"Gamepad_DPad_Down\", (Xbox=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/Xbox/XboxOne_Dpad_Down.XboxOne_Dpad_Down\"',PlayStation=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/PlayStation/PS4_Dpad_Down.PS4_Dpad_Down\"',Switch=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/NintendoSwitch/Switch_Dpad_Down.Switch_Dpad_Down\"')),(\"Gamepad_DPad_Right\", (Xbox=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/Xbox/XboxOne_Dpad_Right.XboxOne_Dpad_Right\"',PlayStation=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/PlayStation/PS4_Dpad_Right.PS4_Dpad_Right\"',Switch=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/NintendoSwitch/Switch_Dpad_Right.Switch_Dpad_Right\"')),(\"Gamepad_DPad_Left\", (Xbox=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/Xbox/XboxOne_Dpad_Left.XboxOne_Dpad_Left\"',PlayStation=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/PlayStation/PS4_Dpad_Left.PS4_Dpad_Left\"',Switch=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/NintendoSwitch/Switch_Dpad_Left.Switch_Dpad_Left\"')),(\"Gamepad_LeftStick_Up\", (Xbox=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/Xbox/XboxOne_Left_Stick_Up.XboxOne_Left_Stick_Up\"',PlayStation=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/PlayStation/PS4_Left_Stick_Up.PS4_Left_Stick_Up\"',Switch=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/NintendoSwitch/Switch_Left_Stick_Up.Switch_Left_Stick_Up\"')),(\"Gamepad_LeftStick_Down\", (Xbox=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/Xbox/XboxOne_Left_Stick_Down.XboxOne_Left_Stick_Down\"',PlayStation=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/PlayStation/PS4_Left_Stick_Down.PS4_Left_Stick_Down\"',Switch=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/NintendoSwitch/Switch_Left_Stick_Down.Switch_Left_Stick_Down\"')),(\"Gamepad_LeftStick_Right\", (Xbox=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/Xbox/XboxOne_Left_Stick_Right.XboxOne_Left_Stick_Right\"',PlayStation=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/PlayStation/PS4_Left_Stick_Right.PS4_Left_Stick_Right\"',Switch=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/NintendoSwitch/Switch_Left_Stick_Right.Switch_Left_Stick_Right\"')),(\"Gamepad_LeftStick_Left\", (Xbox=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/Xbox/XboxOne_Left_Stick_Left.XboxOne_Left_Stick_Left\"',PlayStation=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/PlayStation/PS4_Left_Stick_Left.PS4_Left_Stick_Left\"',Switch=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/NintendoSwitch/Switch_Left_Stick_Left.Switch_Left_Stick_Left\"')),(\"Gamepad_RightStick_Up\", (Xbox=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/Xbox/XboxOne_Right_Stick_Up.XboxOne_Right_Stick_Up\"',PlayStation=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/PlayStation/PS4_Right_Stick_Up.PS4_Right_Stick_Up\"',Switch=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/NintendoSwitch/Switch_Right_Stick_Up.Switch_Right_Stick_Up\"')),(\"Gamepad_RightStick_Down\", (Xbox=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/Xbox/XboxOne_Right_Stick_Down.XboxOne_Right_Stick_Down\"',PlayStation=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/PlayStation/PS4_Right_Stick_Down.PS4_Right_Stick_Down\"',Switch=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/NintendoSwitch/Switch_Right_Stick_Down.Switch_Right_Stick_Down\"')),(\"Gamepad_RightStick_Right\", (Xbox=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/Xbox/XboxOne_Right_Stick_Right.XboxOne_Right_Stick_Right\"',PlayStation=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/PlayStation/PS4_Right_Stick_Right.PS4_Right_Stick_Right\"',Switch=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/NintendoSwitch/Switch_Right_Stick_Right.Switch_Right_Stick_Right\"')),(\"Gamepad_RightStick_Left\", (Xbox=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/Xbox/XboxOne_Right_Stick_Left.XboxOne_Right_Stick_Left\"',PlayStation=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/PlayStation/PS4_Right_Stick_Left.PS4_Right_Stick_Left\"',Switch=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/NintendoSwitch/Switch_Right_Stick_Left.Switch_Right_Stick_Left\"')),(\"Gamepad_LeftX\", ()),(\"Gamepad_LeftY\", ()),(\"Gamepad_RightX\", ()),(\"Gamepad_RightY\", ()),(\"Gamepad_LeftTriggerAxis\", ()),(\"Gamepad_RightTriggerAxis\", ()),(\"Gamepad_Special_Left_X\", ()),(\"Gamepad_Special_Left_Y\", ()))\nHighlightedGamepadTexturesMap=((\"Gamepad_LeftShoulder\", (Xbox=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/Xbox/XboxOne_LB_active.XboxOne_LB_active\"',PlayStation=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/PlayStation/PS4_L1_active.PS4_L1_active\"',Switch=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/NintendoSwitch/Switch_LB_Pressed.Switch_LB_Pressed\"')),(\"Gamepad_RightShoulder\", (Xbox=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/Xbox/XboxOne_RB_active.XboxOne_RB_active\"',PlayStation=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/PlayStation/PS4_R1_active.PS4_R1_active\"',Switch=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/NintendoSwitch/Switch_RB_pressed.Switch_RB_pressed\"')),(\"Gamepad_FaceButton_Bottom\", (Xbox=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/Xbox/XboxOne_A_pressed.XboxOne_A_pressed\"',PlayStation=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/PlayStation/PS4_Cross_pressed.PS4_Cross_pressed\"',Switch=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/NintendoSwitch/Switch_B_Pressed.Switch_B_Pressed\"')),(\"Gamepad_FaceButton_Right\", (Xbox=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/Xbox/XboxOne_B_pressed.XboxOne_B_pressed\"',PlayStation=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/PlayStation/PS4_Circle_pressed.PS4_Circle_pressed\"',Switch=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/NintendoSwitch/Switch_A_Pressed.Switch_A_Pressed\"')),(\"Gamepad_FaceButton_Left\", (Xbox=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/Xbox/XboxOne_X_pressed.XboxOne_X_pressed\"',PlayStation=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/PlayStation/PS4_Square_pressed.PS4_Square_pressed\"',Switch=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/NintendoSwitch/Switch_Y_Pressed.Switch_Y_Pressed\"')),(\"Gamepad_FaceButton_Top\", (Xbox=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/Xbox/XboxOne_Y_pressed.XboxOne_Y_pressed\"',PlayStation=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/PlayStation/PS4_Triangle_pressed.PS4_Triangle_pressed\"',Switch=Texture2D'\"/Game/SO/GUI/art/CntrlIcon/NintendoSwitch/Switch_X_Pressed.Switch_X_Pressed\"')))\n+GeneralLoadingScreenTexts=LOCTABLE(\"UI\", \"loading_screen_text_1\")\n+GeneralLoadingScreenTexts=LOCTABLE(\"Areas\", \"loading_tip_act1_5\")\n+GeneralLoadingScreenTexts=LOCTABLE(\"Areas\", \"loading_tip_act1_6\")\n+GeneralLoadingScreenTexts=LOCTABLE(\"Areas\", \"loading_tip_act1_8\")\n+GeneralLoadingScreenTexts=LOCTABLE(\"Areas\", \"loading_tip_act1_9\")\n+GeneralLoadingScreenTexts=LOCTABLE(\"Areas\", \"loading_tip_act2_9\")\n+GeneralLoadingScreenTexts=LOCTABLE(\"Areas\", \"loading_tip_act3_2\")\n+GeneralLoadingScreenTexts=LOCTABLE(\"Areas\", \"loading_tip_act2_5\")\nSFXMapPtr=((SettingsLineSwitch, /Game/FMOD/Events/ui/menu/ui_menu_settings_line_switch.ui_menu_settings_line_switch),(SettingsApply, /Game/FMOD/Events/ui/menu/ui_menu_settings_apply.ui_menu_settings_apply),(SettingsRestore, /Game/FMOD/Events/ui/menu/ui_menu_settings_restore.ui_menu_settings_restore),(SettingsValueSwitch, /Game/FMOD/Events/ui/menu/ui_menu_settings_value_switch.ui_menu_settings_value_switch),(SettingsPressed, /Game/FMOD/Events/ui/menu/ui_menu_button_pressed.ui_menu_button_pressed),(SettingsClose, /Game/FMOD/Events/ui/menu/ui_menu_return_to_root.ui_menu_return_to_root),(MenuButtonSwitch, /Game/FMOD/Events/ui/menu/ui_menu_button_switch.ui_menu_button_switch),(MenuButtonPressed, /Game/FMOD/Events/ui/menu/ui_menu_button_pressed.ui_menu_button_pressed),(MenuReturnToRoot, /Game/FMOD/Events/ui/menu/ui_menu_return_to_root.ui_menu_return_to_root))\n+VoiceTextsArray=(EventPtr=/Game/FMOD/Events/char/vo/FallenDruid/char_vo_fallendruid_attack_flybug.char_vo_fallendruid_attack_flybug,Text=LOCTABLE(\"FloatingEnemyAndNPCLines\", \"char_vo_fallendruid_attack_flybug\"))\n+VoiceTextsArray=(EventPtr=/Game/FMOD/Events/char/vo/FallenDruid/char_vo_fallendruid_attack_spike.char_vo_fallendruid_attack_spike,Text=LOCTABLE(\"FloatingEnemyAndNPCLines\", \"char_vo_fallendruid_attack_spike\"))\n+VoiceTextsArray=(EventPtr=/Game/FMOD/Events/char/vo/FallenDruid/char_vo_fallendruid_attack_tendril.char_vo_fallendruid_attack_tendril,Text=LOCTABLE(\"FloatingEnemyAndNPCLines\", \"char_vo_fallendruid_attack_tendril\"))\n+VoiceTextsArray=(EventPtr=/Game/FMOD/Events/char/vo/FallenDruid/char_vo_fallendruid_attack_thorn_sphere.char_vo_fallendruid_attack_thorn_sphere,Text=LOCTABLE(\"FloatingEnemyAndNPCLines\", \"char_vo_fallendruid_attack_thorn_sphere\"))\n+VoiceTextsArray=(EventPtr=/Game/FMOD/Events/char/vo/ShadeSphere/char_vo_shadesphere_attack_1.char_vo_shadesphere_attack_1,Text=LOCTABLE(\"FloatingEnemyAndNPCLines\", \"char_vo_shadesphere_attack_1\"))\n+VoiceTextsArray=(EventPtr=/Game/FMOD/Events/char/vo/ShadeSphere/char_vo_shadesphere_attack_2.char_vo_shadesphere_attack_2,Text=LOCTABLE(\"FloatingEnemyAndNPCLines\", \"char_vo_shadesphere_attack_2\"))\n+VoiceTextsArray=(EventPtr=/Game/FMOD/Events/char/vo/ShadeSphere/char_vo_shadesphere_damaged_1.char_vo_shadesphere_damaged_1,Text=LOCTABLE(\"FloatingEnemyAndNPCLines\", \"char_vo_shadesphere_damaged_1\"))\n+VoiceTextsArray=(EventPtr=/Game/FMOD/Events/char/vo/ShadeSphere/char_vo_shadesphere_damaged_2.char_vo_shadesphere_damaged_2,Text=LOCTABLE(\"FloatingEnemyAndNPCLines\", \"char_vo_shadesphere_damaged_2\"))\n+VoiceTextsArray=(EventPtr=/Game/FMOD/Events/char/vo/ShadeSphere/char_vo_shadesphere_die.char_vo_shadesphere_die,Text=LOCTABLE(\"FloatingEnemyAndNPCLines\", \"char_vo_shadesphere_die\"))\n+VoiceTextsArray=(EventPtr=/Game/FMOD/Events/char/vo/ShadeSphere/char_vo_shadesphere_idle_1.char_vo_shadesphere_idle_1,Text=LOCTABLE(\"FloatingEnemyAndNPCLines\", \"char_vo_shadesphere_idle_1\"))\n+VoiceTextsArray=(EventPtr=/Game/FMOD/Events/char/vo/ShadeSphere/char_vo_shadesphere_idle_2.char_vo_shadesphere_idle_2,Text=LOCTABLE(\"FloatingEnemyAndNPCLines\", \"char_vo_shadesphere_idle_2\"))\n+VoiceTextsArray=(EventPtr=/Game/FMOD/Events/char/vo/GolemMaker/char_vo_golemmaker_idle_explain_1.char_vo_golemmaker_idle_explain_1,Text=LOCTABLE(\"FloatingEnemyAndNPCLines\", \"char_vo_golemmaker_idle_explain_1\"))\n+VoiceTextsArray=(EventPtr=/Game/FMOD/Events/char/vo/GolemMaker/char_vo_golemmaker_idle_mindlessly_1.char_vo_golemmaker_idle_mindlessly_1,Text=LOCTABLE(\"FloatingEnemyAndNPCLines\", \"char_vo_golemmaker_idle_mindlessly_1\"))\n+VoiceTextsArray=(EventPtr=/Game/FMOD/Events/char/vo/GolemMaker/char_vo_golemmaker_idle_mindlessly_2.char_vo_golemmaker_idle_mindlessly_2,Text=LOCTABLE(\"FloatingEnemyAndNPCLines\", \"char_vo_golemmaker_idle_mindlessly_2\"))\n+VoiceTextsArray=(EventPtr=/Game/FMOD/Events/char/vo/GolemMaker/char_vo_golemmaker_idle_tries_to_remember.char_vo_golemmaker_idle_tries_to_remember,Text=LOCTABLE(\"FloatingEnemyAndNPCLines\", \"char_vo_golemmaker_idle_tries_to_remember\"))\n+VoiceTextsArray=(EventPtr=/Game/FMOD/Events/char/vo/Flybug/char_vo_flybug_attack_1.char_vo_flybug_attack_1,Text=LOCTABLE(\"FloatingEnemyAndNPCLines\", \"char_vo_flybug_attack_1\"))\n+VoiceTextsArray=(EventPtr=/Game/FMOD/Events/char/vo/Flybug/char_vo_flybug_attack_2.char_vo_flybug_attack_2,Text=LOCTABLE(\"FloatingEnemyAndNPCLines\", \"char_vo_flybug_attack_2\"))\n+VoiceTextsArray=(EventPtr=/Game/FMOD/Events/char/vo/GhostArmor/char_vo_ghostarmor_idle_1.char_vo_ghostarmor_idle_1,Text=LOCTABLE(\"FloatingEnemyAndNPCLines\", \"char_vo_ghostarmor_idle_1\"))\n+VoiceTextsArray=(EventPtr=/Game/FMOD/Events/char/vo/GhostArmor/char_vo_ghostarmor_idle_2.char_vo_ghostarmor_idle_2,Text=LOCTABLE(\"FloatingEnemyAndNPCLines\", \"char_vo_ghostarmor_idle_2\"))\n+VoiceTextsArray=(EventPtr=/Game/FMOD/Events/char/vo/GhostArmor/char_vo_ghostarmor_attack_1.char_vo_ghostarmor_attack_1,Text=LOCTABLE(\"FloatingEnemyAndNPCLines\", \"char_vo_ghostarmor_attack_1\"))\n+VoiceTextsArray=(EventPtr=/Game/FMOD/Events/char/vo/GhostArmor/char_vo_ghostarmor_attack_2.char_vo_ghostarmor_attack_2,Text=LOCTABLE(\"FloatingEnemyAndNPCLines\", \"char_vo_ghostarmor_attack_2\"))\n+VoiceTextsArray=(EventPtr=/Game/FMOD/Events/char/vo/GhostArmor/char_vo_ghostarmor_attack_fall.char_vo_ghostarmor_attack_fall,Text=LOCTABLE(\"FloatingEnemyAndNPCLines\", \"char_vo_ghostarmor_attack_fall\"))\n+VoiceTextsArray=(EventPtr=/Game/FMOD/Events/char/vo/GhostArmor/char_vo_ghostarmor_damaged_1.char_vo_ghostarmor_damaged_1,Text=LOCTABLE(\"FloatingEnemyAndNPCLines\", \"char_vo_ghostarmor_damaged_1\"))\n+VoiceTextsArray=(EventPtr=/Game/FMOD/Events/char/vo/GhostArmor/char_vo_ghostarmor_damaged_2.char_vo_ghostarmor_damaged_2,Text=LOCTABLE(\"FloatingEnemyAndNPCLines\", \"char_vo_ghostarmor_damaged_2\"))\n+VoiceTextsArray=(EventPtr=/Game/FMOD/Events/char/vo/GhostArmor/char_vo_ghostarmor__die.char_vo_ghostarmor__die,Text=LOCTABLE(\"FloatingEnemyAndNPCLines\", \"char_vo_ghostarmor__die\"))\n+VoiceTextsArray=(EventPtr=/Game/FMOD/Events/char/vo/GhostHelmet/char_vo_ghosthelmet_attack_1.char_vo_ghosthelmet_attack_1,Text=LOCTABLE(\"FloatingEnemyAndNPCLines\", \"char_vo_ghosthelmet_attack_1\"))\n+VoiceTextsArray=(EventPtr=/Game/FMOD/Events/char/vo/GhostHelmet/char_vo_ghosthelmet_attack_2.char_vo_ghosthelmet_attack_2,Text=LOCTABLE(\"FloatingEnemyAndNPCLines\", \"char_vo_ghosthelmet_attack_2\"))\n+VoiceTextsArray=(EventPtr=/Game/FMOD/Events/char/vo/GhostHelmet/char_vo_ghosthelmet_damaged_1.char_vo_ghosthelmet_damaged_1,Text=LOCTABLE(\"FloatingEnemyAndNPCLines\", \"char_vo_ghosthelmet_damaged_1\"))\n+VoiceTextsArray=(EventPtr=/Game/FMOD/Events/char/vo/GhostHelmet/char_vo_ghosthelmet_damaged_2.char_vo_ghosthelmet_damaged_2,Text=LOCTABLE(\"FloatingEnemyAndNPCLines\", \"char_vo_ghosthelmet_damaged_2\"))\n+VoiceTextsArray=(EventPtr=/Game/FMOD/Events/char/vo/GhostHelmet/char_vo_ghosthelmet_idle_1.char_vo_ghosthelmet_idle_1,Text=LOCTABLE(\"FloatingEnemyAndNPCLines\", \"char_vo_ghosthelmet_idle_1\"))\n+VoiceTextsArray=(EventPtr=/Game/FMOD/Events/char/vo/GhostHelmet/char_vo_ghosthelmet_idle_2.char_vo_ghosthelmet_idle_2,Text=LOCTABLE(\"FloatingEnemyAndNPCLines\", \"char_vo_ghosthelmet_idle_2\"))\n+VoiceTextsArray=(EventPtr=/Game/FMOD/Events/char/vo/GhostHelmet/char_vo_ghosthelmet_die.char_vo_ghosthelmet_die,Text=LOCTABLE(\"FloatingEnemyAndNPCLines\", \"char_vo_ghosthelmet_die\"))\n+VoiceTextsArray=(EventPtr=/Game/FMOD/Events/char/vo/Shade/char_vo_shade_attack_1.char_vo_shade_attack_1,Text=LOCTABLE(\"FloatingEnemyAndNPCLines\", \"char_vo_shade_attack_1\"))\n+VoiceTextsArray=(EventPtr=/Game/FMOD/Events/char/vo/Shade/char_vo_shade_attack_2.char_vo_shade_attack_2,Text=LOCTABLE(\"FloatingEnemyAndNPCLines\", \"char_vo_shade_attack_2\"))\n+VoiceTextsArray=(EventPtr=/Game/FMOD/Events/char/vo/Shade/char_vo_shade_damaged_1.char_vo_shade_damaged_1,Text=LOCTABLE(\"FloatingEnemyAndNPCLines\", \"char_vo_shade_damaged_1\"))\n+VoiceTextsArray=(EventPtr=/Game/FMOD/Events/char/vo/Shade/char_vo_shade_damaged_2.char_vo_shade_damaged_2,Text=LOCTABLE(\"FloatingEnemyAndNPCLines\", \"char_vo_shade_damaged_2\"))\n+VoiceTextsArray=(EventPtr=/Game/FMOD/Events/char/vo/Shade/char_vo_shade_die.char_vo_shade_die,Text=LOCTABLE(\"FloatingEnemyAndNPCLines\", \"char_vo_shade_die\"))\n+VoiceTextsArray=(EventPtr=/Game/FMOD/Events/char/vo/Shade/char_vo_shade_idle_1.char_vo_shade_idle_1,Text=LOCTABLE(\"FloatingEnemyAndNPCLines\", \"char_vo_shade_idle_1\"))\n+VoiceTextsArray=(EventPtr=/Game/FMOD/Events/char/vo/Shade/char_vo_shade_idle_2.char_vo_shade_idle_2,Text=LOCTABLE(\"FloatingEnemyAndNPCLines\", \"char_vo_shade_idle_2\"))\n+VoiceTextsArray=(EventPtr=/Game/FMOD/Events/char/vo/PrimitiveFishy/char_vo_primitivefishy_attack_1.char_vo_primitivefishy_attack_1,Text=LOCTABLE(\"FloatingEnemyAndNPCLines\", \"char_vo_primitivefishy_attack_1\"))\n+VoiceTextsArray=(EventPtr=/Game/FMOD/Events/char/vo/PrimitiveFishy/char_vo_primitivefishy_attack_long_1.char_vo_primitivefishy_attack_long_1,Text=LOCTABLE(\"FloatingEnemyAndNPCLines\", \"char_vo_primitivefishy_attack_long_1\"))\n+VoiceTextsArray=(EventPtr=/Game/FMOD/Events/char/vo/PrimitiveFishy/char_vo_primitivefishy_attack_long_2.char_vo_primitivefishy_attack_long_2,Text=LOCTABLE(\"FloatingEnemyAndNPCLines\", \"char_vo_primitivefishy_attack_long_2\"))\n+VoiceTextsArray=(EventPtr=/Game/FMOD/Events/char/vo/PrimitiveFishy/char_vo_primitivefishy_damaged_1.char_vo_primitivefishy_damaged_1,Text=LOCTABLE(\"FloatingEnemyAndNPCLines\", \"char_vo_primitivefishy_damaged_1\"))\n+VoiceTextsArray=(EventPtr=/Game/FMOD/Events/char/vo/PrimitiveFishy/char_vo_primitivefishy_damaged_2.char_vo_primitivefishy_damaged_2,Text=LOCTABLE(\"FloatingEnemyAndNPCLines\", \"char_vo_primitivefishy_damaged_2\"))\n+VoiceTextsArray=(EventPtr=/Game/FMOD/Events/char/vo/PrimitiveFishy/char_vo_primitivefishy_die.char_vo_primitivefishy_die,Text=LOCTABLE(\"FloatingEnemyAndNPCLines\", \"char_vo_primitivefishy_die\"))\n+VoiceTextsArray=(EventPtr=/Game/FMOD/Events/char/vo/PrimitiveFishy/char_vo_primitivefishy_idle_1.char_vo_primitivefishy_idle_1,Text=LOCTABLE(\"FloatingEnemyAndNPCLines\", \"char_vo_primitivefishy_idle_1\"))\n+VoiceTextsArray=(EventPtr=/Game/FMOD/Events/char/vo/PrimitiveFishy/char_vo_primitivefishy_idle_2.char_vo_primitivefishy_idle_2,Text=LOCTABLE(\"FloatingEnemyAndNPCLines\", \"char_vo_primitivefishy_idle_2\"))\n+VoiceTextsArray=(EventPtr=/Game/FMOD/Events/char/vo/Maintainer/char_vo_maintainer_idle_1.char_vo_maintainer_idle_1,Text=LOCTABLE(\"FloatingEnemyAndNPCLines\", \"char_vo_maintainer_idle_1\"))\n+VoiceTextsArray=(EventPtr=/Game/FMOD/Events/char/vo/Maintainer/char_vo_maintainer_idle_2.char_vo_maintainer_idle_2,Text=LOCTABLE(\"FloatingEnemyAndNPCLines\", \"char_vo_maintainer_idle_2\"))\n+VoiceTextsArray=(EventPtr=/Game/FMOD/Events/char/vo/Maintainer/char_vo_maintainer_attack_1.char_vo_maintainer_attack_1,Text=LOCTABLE(\"FloatingEnemyAndNPCLines\", \"char_vo_maintainer_attack_1\"))\n+VoiceTextsArray=(EventPtr=/Game/FMOD/Events/char/vo/Maintainer/char_vo_maintainer_attack_2.char_vo_maintainer_attack_2,Text=LOCTABLE(\"FloatingEnemyAndNPCLines\", \"char_vo_maintainer_attack_2\"))\n+VoiceTextsArray=(EventPtr=/Game/FMOD/Events/char/vo/Maintainer/char_vo_maintainer_damaged_1.char_vo_maintainer_damaged_1,Text=LOCTABLE(\"FloatingEnemyAndNPCLines\", \"char_vo_maintainer_damaged_1\"))\n+VoiceTextsArray=(EventPtr=/Game/FMOD/Events/char/vo/Maintainer/char_vo_maintainer_damaged_2.char_vo_maintainer_damaged_2,Text=LOCTABLE(\"FloatingEnemyAndNPCLines\", \"char_vo_maintainer_damaged_2\"))\n+VoiceTextsArray=(EventPtr=/Game/FMOD/Events/char/vo/Maintainer/char_vo_maintainer_die.char_vo_maintainer_die,Text=LOCTABLE(\"FloatingEnemyAndNPCLines\", \"char_vo_maintainer_die\"))\n+VoiceTextsArray=(EventPtr=/Game/FMOD/Events/char/vo/KoboldChef/char_vo_koboldchef_idle_01_TooHot.char_vo_koboldchef_idle_01_TooHot,Text=LOCTABLE(\"FloatingEnemyAndNPCLines\", \"char_vo_koboldchef_idle_01\"))\n+VoiceTextsArray=(EventPtr=/Game/FMOD/Events/char/vo/KoboldChef/char_vo_koboldchef_idle_02_NeedsMoreSalt.char_vo_koboldchef_idle_02_NeedsMoreSalt,Text=LOCTABLE(\"FloatingEnemyAndNPCLines\", \"char_vo_koboldchef_idle_02\"))\n+VoiceTextsArray=(EventPtr=/Game/FMOD/Events/char/vo/Maintainer_miniboss/char_vo_maintainer_miniboss_attack_meteor.char_vo_maintainer_miniboss_attack_meteor,Text=LOCTABLE(\"FloatingEnemyAndNPCLines\", \"char_vo_maintainer_miniboss_attack_meteor\"))\n+VoiceTextsArray=(EventPtr=/Game/FMOD/Events/char/vo/Maintainer_miniboss/char_vo_maintainer_miniboss_attack_spawn_enemy.char_vo_maintainer_miniboss_attack_spawn_enemy,Text=LOCTABLE(\"FloatingEnemyAndNPCLines\", \"char_vo_maintainer_miniboss_attack_spawn_enemy\"))\n+VoiceTextsArray=(EventPtr=/Game/FMOD/Events/char/vo/Maintainer_miniboss/char_vo_maintainer_miniboss_die.char_vo_maintainer_miniboss_die,Text=LOCTABLE(\"FloatingEnemyAndNPCLines\", \"char_vo_maintainer_miniboss_die\"))\n+VoiceTextsArray=(EventPtr=/Game/FMOD/Events/char/vo/Maintainer_miniboss/char_vo_maintainer_miniboss_attack_1.char_vo_maintainer_miniboss_attack_1,Text=LOCTABLE(\"FloatingEnemyAndNPCLines\", \"char_vo_maintainer_miniboss_attack_1\"))\n+VoiceTextsArray=(EventPtr=/Game/FMOD/Events/char/vo/Maintainer_miniboss/char_vo_maintainer_miniboss_attack_2.char_vo_maintainer_miniboss_attack_2,Text=LOCTABLE(\"FloatingEnemyAndNPCLines\", \"char_vo_maintainer_miniboss_attack_2\"))\n+VoiceTextsArray=(EventPtr=/Game/FMOD/Events/char/vo/Maintainer_miniboss/char_vo_maintainer_miniboss_damaged_1.char_vo_maintainer_miniboss_damaged_1,Text=LOCTABLE(\"FloatingEnemyAndNPCLines\", \"char_vo_maintainer_miniboss_damaged_1\"))\n+VoiceTextsArray=(EventPtr=/Game/FMOD/Events/char/vo/Maintainer_miniboss/char_vo_maintainer_miniboss_damaged_2.char_vo_maintainer_miniboss_damaged_2,Text=LOCTABLE(\"FloatingEnemyAndNPCLines\", \"char_vo_maintainer_miniboss_damaged_2\"))\n+VoiceTextsArray=(EventPtr=/Game/FMOD/Events/char/vo/GateKeeper/char_vo_gatekeeper_attack_aimed.char_vo_gatekeeper_attack_aimed,Text=LOCTABLE(\"FloatingEnemyAndNPCLines\", \"char_vo_gatekeeper_attack_aimed\"))\n+VoiceTextsArray=(EventPtr=/Game/FMOD/Events/char/vo/GateKeeper/char_vo_gatekeeper_attack_aimed_phase_2.char_vo_gatekeeper_attack_aimed_phase_2,Text=LOCTABLE(\"FloatingEnemyAndNPCLines\", \"char_vo_gatekeeper_attack_aimed_phase_2\"))\n+VoiceTextsArray=(EventPtr=/Game/FMOD/Events/char/vo/GateKeeper/char_vo_gatekeeper_attack_electric_bubbles.char_vo_gatekeeper_attack_electric_bubbles,Text=LOCTABLE(\"FloatingEnemyAndNPCLines\", \"char_vo_gatekeeper_attack_electric_bubbles\"))\n+VoiceTextsArray=(EventPtr=/Game/FMOD/Events/char/vo/GateKeeper/char_vo_gatekeeper_attack_electric_bubbles_phase_2.char_vo_gatekeeper_attack_electric_bubbles_phase_2,Text=LOCTABLE(\"FloatingEnemyAndNPCLines\", \"char_vo_gatekeeper_attack_electric_bubbles_phase_2\"))\n+VoiceTextsArray=(EventPtr=/Game/FMOD/Events/char/vo/GateKeeper/char_vo_gatekeeper_attack_meteors.char_vo_gatekeeper_attack_meteors,Text=LOCTABLE(\"FloatingEnemyAndNPCLines\", \"char_vo_gatekeeper_attack_meteors\"))\n+VoiceTextsArray=(EventPtr=/Game/FMOD/Events/char/vo/GateKeeper/char_vo_gatekeeper_attack_shield.char_vo_gatekeeper_attack_shield,Text=LOCTABLE(\"FloatingEnemyAndNPCLines\", \"char_vo_gatekeeper_attack_shield\"))\n+VoiceTextsArray=(EventPtr=/Game/FMOD/Events/char/vo/DwarvenStatue/char_vo_dwarvenstatue_attack_axe_point.char_vo_dwarvenstatue_attack_axe_point,Text=LOCTABLE(\"FloatingEnemyAndNPCLines\", \"char_vo_dwarvenstatue_attack_axe_point\"))\n+VoiceTextsArray=(EventPtr=/Game/FMOD/Events/char/vo/DwarvenStatue/char_vo_dwarvenstatue_attack_axe_strike_down.char_vo_dwarvenstatue_attack_axe_strike_down,Text=LOCTABLE(\"FloatingEnemyAndNPCLines\", \"char_vo_dwarvenstatue_attack_axe_strike_down\"))\n+VoiceTextsArray=(EventPtr=/Game/FMOD/Events/char/vo/DwarvenStatue/char_vo_dwarvenstatue_attack_meteor.char_vo_dwarvenstatue_attack_meteor,Text=LOCTABLE(\"FloatingEnemyAndNPCLines\", \"char_vo_dwarvenstatue_attack_meteor\"))\n+VoiceTextsArray=(EventPtr=/Game/FMOD/Events/char/vo/DwarvenStatue/char_vo_dwarvenstatue_shield_knock.char_vo_dwarvenstatue_shield_knock,Text=LOCTABLE(\"FloatingEnemyAndNPCLines\", \"char_vo_dwarvenstatue_shield_knock\"))\n+VoiceTextsArray=(EventPtr=/Game/FMOD/Events/char/vo/DwarvenStatue/char_vo_dwarvenstatue_die.char_vo_dwarvenstatue_die,Text=LOCTABLE(\"FloatingEnemyAndNPCLines\", \"char_vo_dwarvenstatue_die\"))\n+VoiceTextsArray=(EventPtr=/Game/FMOD/Events/char/vo/MaintainerElite/char_vo_maintainer_elite_attack_1.char_vo_maintainer_elite_attack_1,Text=LOCTABLE(\"FloatingEnemyAndNPCLines\", \"char_vo_maintainer_miniboss_attack_1\"))\n+VoiceTextsArray=(EventPtr=/Game/FMOD/Events/char/vo/MaintainerElite/char_vo_maintainer_elite_attack_2.char_vo_maintainer_elite_attack_2,Text=LOCTABLE(\"FloatingEnemyAndNPCLines\", \"char_vo_maintainer_miniboss_attack_2\"))\n+VoiceTextsArray=(EventPtr=/Game/FMOD/Events/char/vo/MaintainerElite/char_vo_maintainer_elite_damaged_1.char_vo_maintainer_elite_damaged_1,Text=LOCTABLE(\"FloatingEnemyAndNPCLines\", \"char_vo_maintainer_miniboss_damaged_1\"))\n+VoiceTextsArray=(EventPtr=/Game/FMOD/Events/char/vo/MaintainerElite/char_vo_maintainer_elite_damaged_2.char_vo_maintainer_elite_damaged_2,Text=LOCTABLE(\"FloatingEnemyAndNPCLines\", \"char_vo_maintainer_miniboss_damaged_2\"))\n+VoiceTextsArray=(EventPtr=/Game/FMOD/Events/char/vo/MaintainerElite/char_vo_maintainer_elite_die.char_vo_maintainer_elite_die,Text=LOCTABLE(\"FloatingEnemyAndNPCLines\", \"char_vo_maintainer_miniboss_die\"))\n+VoiceTextsArray=(EventPtr=/Game/FMOD/Events/char/vo/MaintainerElite/char_vo_maintainer_elite_idle_1.char_vo_maintainer_elite_idle_1,Text=LOCTABLE(\"FloatingEnemyAndNPCLines\", \"char_vo_maintainer_elite_idle_1\"))\n+VoiceTextsArray=(EventPtr=/Game/FMOD/Events/char/vo/MaintainerElite/char_vo_maintainer_elite_idle_2.char_vo_maintainer_elite_idle_2,Text=LOCTABLE(\"FloatingEnemyAndNPCLines\", \"char_vo_maintainer_elite_idle_2\"))\n+VoiceTextsArray=(EventPtr=/Game/FMOD/Events/char/vo/FallenDruid/char_vo_fallendruid_die.char_vo_fallendruid_die,Text=LOCTABLE(\"FloatingEnemyAndNPCLines\", \"char_vo_fallendruid_die\"))\n+VoiceTextsArray=(EventPtr=/Game/FMOD/Events/char/vo/ArmourWrath/char_vo_armourwrath_attack_clap.char_vo_armourwrath_attack_clap,Text=LOCTABLE(\"FloatingEnemyAndNPCLines\", \"char_vo_armourwrath_attack_clap\"))\n+VoiceTextsArray=(EventPtr=/Game/FMOD/Events/char/vo/ArmourWrath/char_vo_armourwrath_attack_die.char_vo_armourwrath_attack_die,Text=LOCTABLE(\"FloatingEnemyAndNPCLines\", \"char_vo_armourwrath_attack_die\"))\n+VoiceTextsArray=(EventPtr=/Game/FMOD/Events/char/vo/ArmourWrath/char_vo_armourwrath_attack_magic.char_vo_armourwrath_attack_magic,Text=LOCTABLE(\"FloatingEnemyAndNPCLines\", \"char_vo_armourwrath_attack_magic\"))\n+VoiceTextsArray=(EventPtr=/Game/FMOD/Events/char/vo/ArmourWrath/char_vo_armourwrath_attack_strike_down.char_vo_armourwrath_attack_strike_down,Text=LOCTABLE(\"FloatingEnemyAndNPCLines\", \"char_vo_armourwrath_attack_strike_down\"))\n+VoiceTextsArray=(EventPtr=/Game/FMOD/Events/char/vo/ArmourWrath/char_vo_armourwrath_attack_strike_down_2.char_vo_armourwrath_attack_strike_down_2,Text=LOCTABLE(\"FloatingEnemyAndNPCLines\", \"char_vo_armourwrath_attack_strike_down_2\"))\n+VoiceTextsArray=(EventPtr=/Game/FMOD/Events/char/vo/FinalBoss/char_vo_final_boss_p1_blue.char_vo_final_boss_p1_blue,Text=LOCTABLE(\"FloatingEnemyAndNPCLines\", \"char_vo_final_boss_p1_blue\"))\n+VoiceTextsArray=(EventPtr=/Game/FMOD/Events/char/vo/FinalBoss/char_vo_final_boss_p1_green.char_vo_final_boss_p1_green,Text=LOCTABLE(\"FloatingEnemyAndNPCLines\", \"char_vo_final_boss_p1_green\"))\n+VoiceTextsArray=(EventPtr=/Game/FMOD/Events/char/vo/FinalBoss/char_vo_final_boss_p1_red.char_vo_final_boss_p1_red,Text=LOCTABLE(\"FloatingEnemyAndNPCLines\", \"char_vo_final_boss_p1_red\"))\n+VoiceTextsArray=(EventPtr=/Game/FMOD/Events/char/vo/FinalBoss/char_vo_final_boss_p2_blue.char_vo_final_boss_p2_blue,Text=LOCTABLE(\"FloatingEnemyAndNPCLines\", \"char_vo_final_boss_p2_blue\"))\n+VoiceTextsArray=(EventPtr=/Game/FMOD/Events/char/vo/FinalBoss/char_vo_final_boss_p2_green.char_vo_final_boss_p2_green,Text=LOCTABLE(\"FloatingEnemyAndNPCLines\", \"char_vo_final_boss_p2_green\"))\n+VoiceTextsArray=(EventPtr=/Game/FMOD/Events/char/vo/FinalBoss/char_vo_final_boss_p2_red_down.char_vo_final_boss_p2_red_down,Text=LOCTABLE(\"FloatingEnemyAndNPCLines\", \"char_vo_final_boss_p2_red_down\"))\n+VoiceTextsArray=(EventPtr=/Game/FMOD/Events/char/vo/FinalBoss/char_vo_final_boss_p2_red_up.char_vo_final_boss_p2_red_up,Text=LOCTABLE(\"FloatingEnemyAndNPCLines\", \"char_vo_final_boss_p2_red_up\"))\n+VoiceTextsArray=(EventPtr=/Game/FMOD/Events/char/vo/FinalBoss/char_vo_final_boss_p3_blue.char_vo_final_boss_p3_blue,Text=LOCTABLE(\"FloatingEnemyAndNPCLines\", \"char_vo_final_boss_p3_blue\"))\n+VoiceTextsArray=(EventPtr=/Game/FMOD/Events/char/vo/FinalBoss/char_vo_final_boss_p3_green.char_vo_final_boss_p3_green,Text=LOCTABLE(\"FloatingEnemyAndNPCLines\", \"char_vo_final_boss_p3_green\"))\n+VoiceTextsArray=(EventPtr=/Game/FMOD/Events/char/vo/FinalBoss/char_vo_final_boss_p3_red.char_vo_final_boss_p3_red,Text=LOCTABLE(\"FloatingEnemyAndNPCLines\", \"char_vo_final_boss_p3_red\"))\n+VoiceTextsArray=(EventPtr=/Game/FMOD/Events/char/vo/Gnory/char_vo_gnory_idle_whistle.char_vo_gnory_idle_whistle,Text=LOCTABLE(\"FloatingEnemyAndNPCLines\", \"char_vo_gnory_idle_whistle\"))\n+VoiceTextsArray=(EventPtr=/Game/FMOD/Events/char/vo/Gnory/char_vo_gnory_idle_humming.char_vo_gnory_idle_humming,Text=LOCTABLE(\"FloatingEnemyAndNPCLines\", \"char_vo_gnory_idle_humming\"))\n+VoiceTextsArray=(EventPtr=/Game/FMOD/Events/char/vo/Fishy/char_vo_fishy_idle_hiss.char_vo_fishy_idle_hiss,Text=LOCTABLE(\"FloatingEnemyAndNPCLines\", \"char_vo_fishy_idle_hiss\"))\n+VoiceTextsArray=(EventPtr=/Game/FMOD/Events/char/vo/Fishy/char_vo_fishy_idle_humming_1.char_vo_fishy_idle_humming_1,Text=LOCTABLE(\"FloatingEnemyAndNPCLines\", \"char_vo_gnory_idle_humming\"))\n+VoiceTextsArray=(EventPtr=/Game/FMOD/Events/char/vo/Fishy/char_vo_fishy_idle_humming_2.char_vo_fishy_idle_humming_2,Text=LOCTABLE(\"FloatingEnemyAndNPCLines\", \"char_vo_gnory_idle_humming\"))\n+VoiceTextsArray=(EventPtr=/Game/FMOD/Events/char/vo/Lory/char_vo_lory_idle_croon.char_vo_lory_idle_croon,Text=LOCTABLE(\"FloatingEnemyAndNPCLines\", \"char_vo_lory_idle_croon\"))\n+VoiceTextsArray=(EventPtr=/Game/FMOD/Events/char/vo/GolemMaker/char_vo_golemmaker_idle_moan_aaahhh.char_vo_golemmaker_idle_moan_aaahhh,Text=LOCTABLE(\"FloatingEnemyAndNPCLines\", \"char_vo_golemmaker_idle_moan_aaahhh\"))\n+VoiceTextsArray=(EventPtr=/Game/FMOD/Events/char/vo/GolemMaker/char_vo_golemmaker_idle_moan_ooohhh.char_vo_golemmaker_idle_moan_ooohhh,Text=LOCTABLE(\"FloatingEnemyAndNPCLines\", \"char_vo_golemmaker_idle_moan_ooohhh\"))\n+VoiceTextsArray=(EventPtr=/Game/FMOD/Events/char/vo/GolemMaker/char_vo_golemmaker_idle_sad_onon.char_vo_golemmaker_idle_sad_onon,Text=LOCTABLE(\"FloatingEnemyAndNPCLines\", \"char_vo_golemmaker_idle_sad_onon\"))\n+VoiceTextsArray=(EventPtr=/Game/FMOD/Events/char/vo/Flybug/char_vo_flybug_damaged_1.char_vo_flybug_damaged_1,Text=LOCTABLE(\"FloatingEnemyAndNPCLines\", \"char_vo_flybug_damaged_1\"))\n+VoiceTextsArray=(EventPtr=/Game/FMOD/Events/char/vo/Flybug/char_vo_flybug_damaged_2.char_vo_flybug_damaged_2,Text=LOCTABLE(\"FloatingEnemyAndNPCLines\", \"char_vo_flybug_damaged_2\"))\n+VoiceTextsArray=(EventPtr=/Game/FMOD/Events/char/vo/Flybug/char_vo_flybug_idle_1.char_vo_flybug_idle_1,Text=LOCTABLE(\"FloatingEnemyAndNPCLines\", \"char_vo_flybug_idle_1\"))\n+VoiceTextsArray=(EventPtr=/Game/FMOD/Events/char/vo/Flybug/char_vo_flybug_idle_2.char_vo_flybug_idle_2,Text=LOCTABLE(\"FloatingEnemyAndNPCLines\", \"char_vo_flybug_idle_2\"))\n+VoiceTextsArray=(EventPtr=/Game/FMOD/Events/char/vo/Flybug/char_vo_flybug_die_1.char_vo_flybug_die_1,Text=LOCTABLE(\"FloatingEnemyAndNPCLines\", \"char_vo_flybug_die_1\"))\n+VoiceTextsArrayRandom=(EventPtr=/Game/FMOD/Events/char/vo/Teachy/char_vo_teachy_idle_book_up.char_vo_teachy_idle_book_up,Texts=(LOCTABLE(\"FloatingEnemyAndNPCLines\", \"char_vo_teachy_idle_book_up_0\"),LOCTABLE(\"FloatingEnemyAndNPCLines\", \"char_vo_teachy_idle_book_up_1\"),LOCTABLE(\"FloatingEnemyAndNPCLines\", \"char_vo_teachy_idle_book_up_2\"),LOCTABLE(\"FloatingEnemyAndNPCLines\", \"char_vo_teachy_idle_book_up_3\")))\n+VoiceTextsArrayRandom=(EventPtr=/Game/FMOD/Events/char/vo/Teachy/char_vo_teachy_idle_book_down.char_vo_teachy_idle_book_down,Texts=(LOCTABLE(\"FloatingEnemyAndNPCLines\", \"char_vo_teachy_idle_book_down_0\"),LOCTABLE(\"FloatingEnemyAndNPCLines\", \"char_vo_teachy_idle_book_down_1\"),LOCTABLE(\"FloatingEnemyAndNPCLines\", \"char_vo_teachy_idle_book_down_2\"),LOCTABLE(\"FloatingEnemyAndNPCLines\", \"char_vo_teachy_idle_book_down_3\")))\n+VoiceTextsArrayRandom=(EventPtr=/Game/FMOD/Events/char/vo/Teachy/char_vo_teachy_idle_humming.char_vo_teachy_idle_humming,Texts=(LOCTABLE(\"FloatingEnemyAndNPCLines\", \"char_vo_teachy_idle_humming_0\"),LOCTABLE(\"FloatingEnemyAndNPCLines\", \"char_vo_teachy_idle_humming_1\"),LOCTABLE(\"FloatingEnemyAndNPCLines\", \"char_vo_teachy_idle_humming_2\")))\n+VoiceTextsArrayRandom=(EventPtr=/Game/FMOD/Events/char/vo/Teachy/char_vo_teachy_idle_humming_speaking_long.char_vo_teachy_idle_humming_speaking_long,Texts=(LOCTABLE(\"FloatingEnemyAndNPCLines\", \"char_vo_teachy_idle_humming_speaking_long_0\"),LOCTABLE(\"FloatingEnemyAndNPCLines\", \"char_vo_teachy_idle_humming_speaking_long_1\"),LOCTABLE(\"FloatingEnemyAndNPCLines\", \"char_vo_teachy_idle_humming_speaking_long_2\"),LOCTABLE(\"FloatingEnemyAndNPCLines\", \"char_vo_teachy_idle_humming_speaking_long_3\")))\n+VoiceTextsArrayRandom=(EventPtr=/Game/FMOD/Events/char/vo/Teachy/char_vo_teachy_idle_humming_speaking_short.char_vo_teachy_idle_humming_speaking_short,Texts=(LOCTABLE(\"FloatingEnemyAndNPCLines\", \"char_vo_teachy_idle_humming_speaking_short_0\"),LOCTABLE(\"FloatingEnemyAndNPCLines\", \"char_vo_teachy_idle_humming_speaking_short_1\"),LOCTABLE(\"FloatingEnemyAndNPCLines\", \"char_vo_teachy_idle_humming_speaking_short_2\")))\n+VoiceTextsArrayRandom=(EventPtr=/Game/FMOD/Events/char/vo/Lory/char_vo_lory_idle_humming.char_vo_lory_idle_humming,Texts=(LOCTABLE(\"FloatingEnemyAndNPCLines\", \"char_vo_lory_idle_humming_0\"),LOCTABLE(\"FloatingEnemyAndNPCLines\", \"char_vo_lory_idle_humming_1\"),LOCTABLE(\"FloatingEnemyAndNPCLines\", \"char_vo_lory_idle_humming_2\"),LOCTABLE(\"FloatingEnemyAndNPCLines\", \"char_vo_lory_idle_humming_3\")))\n+VoiceTextsArrayRandom=(EventPtr=/Game/FMOD/Events/char/vo/SupperDwarf/char_vo_supperdwarf_idle_1_eating_food.char_vo_supperdwarf_idle_1_eating_food,Texts=(LOCTABLE(\"FloatingEnemyAndNPCLines\", \"char_vo_supperdwarf_idle_1_eating_food_0\"),LOCTABLE(\"FloatingEnemyAndNPCLines\", \"char_vo_supperdwarf_idle_1_eating_food_1\"),LOCTABLE(\"FloatingEnemyAndNPCLines\", \"char_vo_supperdwarf_idle_1_eating_food_2\")))\n+VoiceTextsArrayRandom=(EventPtr=/Game/FMOD/Events/char/vo/SupperDwarf/char_vo_supperdwarf_idle_2_humming.char_vo_supperdwarf_idle_2_humming,Texts=(LOCTABLE(\"FloatingEnemyAndNPCLines\", \"char_vo_supperdwarf_idle_2_humming_0\"),LOCTABLE(\"FloatingEnemyAndNPCLines\", \"char_vo_supperdwarf_idle_2_humming_1\"),LOCTABLE(\"FloatingEnemyAndNPCLines\", \"char_vo_supperdwarf_idle_2_humming_2\")))\nWallHitSFXInvalidPtr=/Game/FMOD/Events/char/hero/combat/char_object_hit_stone.char_object_hit_stone\nWallHitSFXMapPtr=((/Game/SO/PhysicalMaterials/Ground.Ground, /Game/FMOD/Events/char/hero/combat/char_object_hit_ground.char_object_hit_ground),(/Game/SO/PhysicalMaterials/Iron.Iron, /Game/FMOD/Events/char/hero/combat/char_object_hit_iron.char_object_hit_iron),(/Game/SO/PhysicalMaterials/Stone.Stone, /Game/FMOD/Events/char/hero/combat/char_object_hit_stone.char_object_hit_stone),(/Game/SO/PhysicalMaterials/Wood.Wood, /Game/FMOD/Events/char/hero/combat/char_object_hit_wood.char_object_hit_wood))\nMenuMusicPtr=/Game/FMOD/Events/music/theme/mus_main_theme.mus_main_theme\nLoadingMusicPtr=/Game/FMOD/Events/music/theme/mus_main_theme.mus_main_theme\nVCA_MasterPtr=/Game/FMOD/VCAs/MASTER.MASTER\nVCA_SFXPtr=/Game/FMOD/VCAs/SFX.SFX\nVCA_UIPtr=/Game/FMOD/VCAs/UI.UI\nVCA_MusicPtr=/Game/FMOD/VCAs/Music.Music\nVCA_MutePtr=/Game/FMOD/VCAs/MASTER_MUTE.MASTER_MUTE\n+MenuBusesToPauseArrayPtr=/Game/FMOD/Buses/SFX/char.char\n+MenuBusesToPauseArrayPtr=/Game/FMOD/Buses/SFX/char/hero.hero\n+MenuBusesToPauseArrayPtr=/Game/FMOD/Buses/SFX/char/monsters.monsters\n+MenuBusesToPauseArrayPtr=/Game/FMOD/Buses/SFX/game.game\nVCA_Menu=(VCAPtr=/Game/FMOD/VCAs/MASTER_MENU_MUTE.MASTER_MENU_MUTE,BlendDuration=1.500000,MinValue=0.000000,Target=1.000000,Counter=1.000000)\nVCA_AmbientDialogue=(VCAPtr=/Game/FMOD/VCAs/Amb_dialogue_volume.Amb_dialogue_volume,BlendDuration=1.500000,MinValue=0.161905,Target=1.000000,Counter=1.000000)\nMinWaitBeforeMusicRestart=10.000000\nMaxWaitBeforeMusicRestart=30.000000\n+BusesToIgnoreForSpeedChangeArrayPtr=/Game/FMOD/Buses/Music.Music\n+BusesToIgnoreForSpeedChangeArrayPtr=/Game/FMOD/Buses/ui.ui\nWallHitVFXInvalidPtr=/Game/SO/VFX/Particles/ImpactHitStone.ImpactHitStone\nWallHitVFXMapPtr=((/Game/SO/PhysicalMaterials/Iron.Iron, /Game/SO/VFX/Particles/ImpactHitIron.ImpactHitIron),(/Game/SO/PhysicalMaterials/Stone.Stone, /Game/SO/VFX/Particles/ImpactHitStone.ImpactHitStone),(/Game/SO/PhysicalMaterials/Wood.Wood, /Game/SO/VFX/Particles/ImpactHitWood.ImpactHitWood))\nVideoMediaPlayerPtr=/Game/Movies/MP_VideoPlayer.MP_VideoPlayer\nVideoMediaTexturePtr=/Game/Movies/MT_VideoPlayer.MT_VideoPlayer\nDemoMediaSourcePtr=/Game/Movies/DemoVideo.DemoVideo\nIntroMediaSourcePtr=/Game/Movies/WarriOrbIntro.WarriOrbIntro\n+IntroSubs=(Text=LOCTABLE(\"Areas\", \"intro_subtitle_0\"),StartTime=3.000000,EndTime=8.000000)\n+IntroSubs=(Text=LOCTABLE(\"Areas\", \"intro_subtitle_1\"),StartTime=10.000000,EndTime=14.000000)\n+IntroSubs=(Text=LOCTABLE(\"Areas\", \"intro_subtitle_2\"),StartTime=14.000000,EndTime=17.000000)\n+IntroSubs=(Text=LOCTABLE(\"Areas\", \"intro_subtitle_3\"),StartTime=17.000000,EndTime=19.500000)\nIntroSounds=/Game/FMOD/Events/game/cutscene/game_cutscene_intro.game_cutscene_intro\nFeedbackURL=\"https://docs.google.com/document/d/10m3Xihncmx2ud4yjcR1f_1ByPrzzgrupbW885NAZkpg/edit?usp=sharing\"\nFeedbackURLSteam=\"https://docs.google.com/document/d/10m3Xihncmx2ud4yjcR1f_1ByPrzzgrupbW885NAZkpg/edit?usp=sharing\"\nFeedbackURLDemo=\"https://docs.google.com/document/d/1mF6dLjkyZm89RJeGbaOmy0BxraI7iuibKlAwhQXiWo8/edit?usp=sharing\"\nFeedbackURLDemoSteam=\n+BlacklistedGPUNames=Intel\n+BlacklistedGPUNames=NVIDIA GeForce GT 740\n+BlacklistedGPUNames=NVIDIA GeForce GT 730\n+BlacklistedGPUNames=NVIDIA GeForce GT 720\n+BlacklistedGPUNames=NVIDIA GeForce GT 710\n+BlacklistedGPUNames=NVIDIA GeForce GTX 660M\n+BlacklistedGPUNames=NVIDIA GeForce GTX 650\n+BlacklistedGPUNames=NVIDIA GeForce GT 630M\n+BlacklistedGPUNames=NVIDIA GeForce GT 610\n+BlacklistedGPUNames=NVIDIA GeForce 605\n+BlacklistedGPUNames=NVIDIA GeForce GT 520\n+BlacklistedGPUNames=NVIDIA GeForce GTX 460 SE\n+BlacklistedGPUNames=NVIDIA GeForce GTX 460\n+BlacklistedGPUNames=NVIDIA GeForce GTS 450\n+BlacklistedGPUNames=NVIDIA GeForce GT 420\n+BlacklistedGPUNames=NVIDIA GeForce 410M\n+BlacklistedGPUNames=AMD Radeon(TM) Vega 8 Graphics\n+BlacklistedGPUNames=AMD Radeon R7 Graphics\n+BlacklistedGPUNames=AMD Radeon(TM) R7 Graphics\n+BlacklistedGPUNames=AMD Radeon R5 Graphics\n+BlacklistedGPUNames=AMD Radeon(TM) R5 Graphics\n+BlacklistedGPUNames=AMD Radeon R5 200 Series\n+BlacklistedGPUNames=AMD Radeon(TM) R4 Graphics\n+BlacklistedGPUNames=AMD Radeon(TM) R3 Graphics\n+BlacklistedGPUNames=AMD Radeon(TM) Vega 3 Graphics\n+BlacklistedGPUNames=AMD Radeon HD 8550G + 8570M Dual Graphics\n+BlacklistedGPUNames=AMD Radeon HD 8570D\n+BlacklistedGPUNames=AMD Radeon HD 8370D\n+BlacklistedGPUNames=AMD Radeon HD 7640G\n+BlacklistedGPUNames=AMD Radeon HD 7400M Series\n+BlacklistedGPUNames=AMD Radeon HD 7310 Graphics\n+BlacklistedGPUNames=AMD Radeon HD 6700 Series\n+BlacklistedGPUNames=AMD Radeon HD 6670\n+BlacklistedGPUNames=AMD Radeon HD 6570\n+BlacklistedGPUNames=AMD Radeon HD 6410D\n+BlacklistedGPUNames=AMD Radeon HD 5700 Series\n+BlacklistedGPUNames=AMD Radeon HD 5670\n+BlacklistedGPUNames=AMD Radeon HD 5450\n+BlacklistedGPUNames=IGFX\n\n\n"
  },
  {
    "path": "Config/DefaultSoInputSettings.ini",
    "content": "\n[/Script/SOrb.SoInputSettings]\nKeyboardDefaultArrowsPresetDeviceType=Keyboard\n+KeyboardDefaultArrowsPresetKeyRebinds=(ActionName=\"Left\",Key=(Key=Left,bShift=False,bCtrl=False,bAlt=False,bCmd=False))\n+KeyboardDefaultArrowsPresetKeyRebinds=(ActionName=\"Right\",Key=(Key=Right,bShift=False,bCtrl=False,bAlt=False,bCmd=False))\n+KeyboardDefaultArrowsPresetKeyRebinds=(ActionName=\"Jump\",Key=(Key=SpaceBar,bShift=False,bCtrl=False,bAlt=False,bCmd=False))\n+KeyboardDefaultArrowsPresetKeyRebinds=(ActionName=\"Roll\",Key=(Key=S,bShift=False,bCtrl=False,bAlt=False,bCmd=False))\n+KeyboardDefaultArrowsPresetKeyRebinds=(ActionName=\"UseItemFromSlot0\",Key=(Key=F,bShift=False,bCtrl=False,bAlt=False,bCmd=False))\n+KeyboardDefaultArrowsPresetKeyRebinds=(ActionName=\"Strike0\",Key=(Key=A,bShift=False,bCtrl=False,bAlt=False,bCmd=False))\n+KeyboardDefaultArrowsPresetKeyRebinds=(ActionName=\"Strike1\",Key=(Key=D,bShift=False,bCtrl=False,bAlt=False,bCmd=False))\n+KeyboardDefaultArrowsPresetKeyRebinds=(ActionName=\"TakeWeaponAway\",Key=(Key=G,bShift=False,bCtrl=False,bAlt=False,bCmd=False))\n+KeyboardDefaultArrowsPresetKeyRebinds=(ActionName=\"ToggleWeapon\",Key=(Key=C,bShift=False,bCtrl=False,bAlt=False,bCmd=False))\n+KeyboardDefaultArrowsPresetKeyRebinds=(ActionName=\"ToggleItem\",Key=(Key=V,bShift=False,bCtrl=False,bAlt=False,bCmd=False))\n+KeyboardDefaultArrowsPresetKeyRebinds=(ActionName=\"ToggleSpell\",Key=(Key=Q,bShift=False,bCtrl=False,bAlt=False,bCmd=False))\n+KeyboardDefaultArrowsPresetKeyRebinds=(ActionName=\"CharacterPanels\",Key=(Key=Tab,bShift=False,bCtrl=False,bAlt=False,bCmd=False))\n+KeyboardDefaultArrowsPresetKeyRebinds=(ActionName=\"Interact0\",Key=(Key=R,bShift=False,bCtrl=False,bAlt=False,bCmd=False))\n+KeyboardDefaultArrowsPresetKeyRebinds=(ActionName=\"Interact1\",Key=(Key=T,bShift=False,bCtrl=False,bAlt=False,bCmd=False))\n+KeyboardDefaultArrowsPresetKeyRebinds=(ActionName=\"Umbrella\",Key=(Key=Up,bShift=False,bCtrl=False,bAlt=False,bCmd=False))\n+KeyboardDefaultArrowsPresetKeyRebinds=(ActionName=\"Down\",Key=(Key=Down,bShift=False,bCtrl=False,bAlt=False,bCmd=False))\n+KeyboardDefaultArrowsPresetKeyRebinds=(ActionName=\"Up\",Key=(Key=Up,bShift=False,bCtrl=False,bAlt=False,bCmd=False))\n+KeyboardDefaultArrowsPresetKeyRebinds=(ActionName=\"Action0\",Key=(Key=A,bShift=False,bCtrl=False,bAlt=False,bCmd=False))\n+KeyboardDefaultArrowsPresetKeyRebinds=(ActionName=\"Action1\",Key=(Key=W,bShift=False,bCtrl=False,bAlt=False,bCmd=False))\n+KeyboardDefaultArrowsPresetKeyRebinds=(ActionName=\"Action2\",Key=(Key=S,bShift=False,bCtrl=False,bAlt=False,bCmd=False))\n+KeyboardDefaultArrowsPresetKeyRebinds=(ActionName=\"TopLeft\",Key=(Key=Q,bShift=False,bCtrl=False,bAlt=False,bCmd=False))\n+KeyboardDefaultArrowsPresetKeyRebinds=(ActionName=\"TopRight\",Key=(Key=E,bShift=False,bCtrl=False,bAlt=False,bCmd=False))\n+KeyboardDefaultArrowsPresetKeyRebinds=(ActionName=\"ActionBack\",Key=(Key=D,bShift=False,bCtrl=False,bAlt=False,bCmd=False))\n+KeyboardDefaultArrowsPresetKeyRebinds=(ActionName=\"SpellLeft\",Key=(Key=A,bShift=False,bCtrl=False,bAlt=False,bCmd=False))\n+KeyboardDefaultArrowsPresetKeyRebinds=(ActionName=\"SpellRight\",Key=(Key=D,bShift=False,bCtrl=False,bAlt=False,bCmd=False))\n+KeyboardDefaultArrowsPresetKeyRebinds=(ActionName=\"SpellUp\",Key=(Key=W,bShift=False,bCtrl=False,bAlt=False,bCmd=False))\n+KeyboardDefaultArrowsPresetKeyRebinds=(ActionName=\"SpellDown\",Key=(Key=S,bShift=False,bCtrl=False,bAlt=False,bCmd=False))\n+KeyboardDefaultArrowsPresetKeyRebinds=(ActionName=\"SpellSelect\",Key=(Key=Q,bShift=False,bCtrl=False,bAlt=False,bCmd=False))\n+KeyboardDefaultArrowsPresetKeyRebinds=(ActionName=\"SpellSelectAndCast\",Key=(Key=SpaceBar,bShift=False,bCtrl=False,bAlt=False,bCmd=False))\n"
  },
  {
    "path": "Config/Linux/LinuxEngine.ini",
    "content": "[/Script/Engine.GameEngine]\n!NetDriverDefinitions=ClearArray\n; Enabled\n+NetDriverDefinitions=(DefName=\"GameNetDriver\",DriverClassName=\"/Script/OnlineSubsystemSteam.SteamNetDriver\",DriverClassNameFallback=\"/Script/OnlineSubsystemUtils.IpNetDriver\")\n; Disabled\n;+NetDriverDefinitions=(DefName=\"GameNetDriver\",DriverClassName=\"OnlineSubsystemUtils.IpNetDriver\",DriverClassNameFallback=\"/Script/OnlineSubsystemUtils.IpNetDriver\")\n\n[OnlineSubsystem]\nDefaultPlatformService=Steam\n\n; [PacketHandlerComponents]\n; +Components=OnlineSubsystemSteam.SteamAuthComponentModuleInterface\n\n[ConsoleVariables]\n; Fix https://sentry.io/organizations/daniel-butum/issues/1434356925/?project=1873711&query=is%3Aunresolved\n; Assertion failed: [File:D:\\Build\\++UE4\\Sync\\Engine\\Source\\Runtime\\RenderCore\\Private\\RenderingThread.cpp] [Line: 1121] GameThread timed out waiting for RenderThread after 120.00 secs\n; Original was: 60s. New Value: 240s\ng.TimeoutForBlockOnRenderFence=240000\n"
  },
  {
    "path": "Config/Localization/WarriorbDemo_Compile.ini",
    "content": "[CommonSettings]\nSourcePath=Content/Localization/WarriorbDemo\nDestinationPath=Content/Localization/WarriorbDemo\nManifestName=WarriorbDemo.manifest\nArchiveName=WarriorbDemo.archive\nResourceName=WarriorbDemo.locres\nbSkipSourceCheck=false\nNativeCulture=en\nCulturesToGenerate=en\nCulturesToGenerate=hu\nCulturesToGenerate=ro\nCulturesToGenerate=zh-Hans\nCulturesToGenerate=zh-Hant\nCulturesToGenerate=ru\nCulturesToGenerate=es\nCulturesToGenerate=fr\nCulturesToGenerate=uk\n\n[GatherTextStep0]\nCommandletClass=GenerateTextLocalizationResource\n\n\n"
  },
  {
    "path": "Config/Localization/WarriorbDemo_Export.ini",
    "content": "[CommonSettings]\nSourcePath=Content/Localization/WarriorbDemo\nDestinationPath=Content/Localization/WarriorbDemo\nNativeCulture=en\nCulturesToGenerate=en\nCulturesToGenerate=hu\nCulturesToGenerate=ro\nCulturesToGenerate=zh-Hans\nCulturesToGenerate=zh-Hant\nCulturesToGenerate=ru\nCulturesToGenerate=es\nCulturesToGenerate=fr\nCulturesToGenerate=uk\nManifestName=WarriorbDemo.manifest\nArchiveName=WarriorbDemo.archive\nPortableObjectName=WarriorbDemo.po\n\n[GatherTextStep0]\nCommandletClass=InternationalizationExport\nbExportLoc=true\nLocalizedTextCollapseMode=ELocalizedTextCollapseMode::IdenticalNamespaceAndSource\nShouldPersistCommentsOnExport=true\nShouldAddSourceLocationsAsComments=true\n\n\n"
  },
  {
    "path": "Config/Localization/WarriorbDemo_ExportDialogueScript.ini",
    "content": "[CommonSettings]\nSourcePath=Content/Localization/WarriorbDemo\nDestinationPath=Content/Localization/WarriorbDemo\nNativeCulture=en\nCulturesToGenerate=en\nCulturesToGenerate=hu\nCulturesToGenerate=ro\nCulturesToGenerate=zh-Hans\nCulturesToGenerate=zh-Hant\nCulturesToGenerate=ru\nCulturesToGenerate=es\nCulturesToGenerate=fr\nCulturesToGenerate=uk\nManifestName=WarriorbDemo.manifest\nArchiveName=WarriorbDemo.archive\nDialogueScriptName=WarriorbDemoDialogue.csv\n\n[GatherTextStep0]\nCommandletClass=ExportDialogueScript\n\n\n"
  },
  {
    "path": "Config/Localization/WarriorbDemo_Gather.ini",
    "content": "[CommonSettings]\nSourcePath=Content/Localization/WarriorbDemo\nDestinationPath=Content/Localization/WarriorbDemo\nManifestName=WarriorbDemo.manifest\nArchiveName=WarriorbDemo.archive\nNativeCulture=en\nCulturesToGenerate=en\nCulturesToGenerate=hu\nCulturesToGenerate=ro\nCulturesToGenerate=zh-Hans\nCulturesToGenerate=zh-Hant\nCulturesToGenerate=ru\nCulturesToGenerate=es\nCulturesToGenerate=fr\nCulturesToGenerate=uk\n\n[GatherTextStep0]\nCommandletClass=GatherTextFromSource\nSearchDirectoryPaths=%LOCPROJECTROOT%Source/SoBeforeGame\nSearchDirectoryPaths=%LOCPROJECTROOT%Source/SOrb\nExcludePathFilters=Config/Localization/*\nExcludePathFilters=Source/SOrb/UI/InGame/SoUIStationPanel*\nFileNameFilters=*.h\nFileNameFilters=*.cpp\nFileNameFilters=*.ini\nShouldGatherFromEditorOnlyData=false\n\n[GatherTextStep1]\nCommandletClass=GatherTextFromAssets\nIncludePathFilters=Content/SO/Maps/CustomMaps/WhiteWall*\nIncludePathFilters=Content/SO/Dialogues/WhiteWall/*\nIncludePathFilters=Content/Localization/StringTables/*\nIncludePathFilters=Content/SO/GUI/InGame/CharacterPanels/UI_Rest*\nIncludePathFilters=Content/SO/Blueprints/BPGameSingleton*\nExcludePathFilters=Content/Localization/*\nExcludePathFilters=Content/L10N/*\nExcludePathFilters=Content/SO/GUI/Editor/*\nPackageFileNameFilters=*.umap\nPackageFileNameFilters=*.uasset\nShouldGatherFromEditorOnlyData=false\nSkipGatherCache=false\n\n[GatherTextStep2]\nCommandletClass=GenerateGatherManifest\n\n[GatherTextStep3]\nCommandletClass=GenerateGatherArchive\n\n[GatherTextStep4]\nCommandletClass=GenerateTextLocalizationReport\nbWordCountReport=true\nWordCountReportName=WarriorbDemo.csv\nbConflictReport=true\nConflictReportName=WarriorbDemo_Conflicts.txt\n\n\n"
  },
  {
    "path": "Config/Localization/WarriorbDemo_GenerateReports.ini",
    "content": "[CommonSettings]\nSourcePath=Content/Localization/WarriorbDemo\nDestinationPath=Content/Localization/WarriorbDemo\nManifestName=WarriorbDemo.manifest\nArchiveName=WarriorbDemo.archive\nCulturesToGenerate=en\nCulturesToGenerate=hu\nCulturesToGenerate=ro\nCulturesToGenerate=zh-Hans\nCulturesToGenerate=zh-Hant\nCulturesToGenerate=ru\nCulturesToGenerate=es\nCulturesToGenerate=fr\nCulturesToGenerate=uk\n\n[GatherTextStep0]\nCommandletClass=GenerateTextLocalizationReport\nbWordCountReport=true\nWordCountReportName=WarriorbDemo.csv\n\n\n"
  },
  {
    "path": "Config/Localization/WarriorbDemo_Import.ini",
    "content": "[CommonSettings]\nSourcePath=Content/Localization/WarriorbDemo\nDestinationPath=Content/Localization/WarriorbDemo\nNativeCulture=en\nCulturesToGenerate=en\nCulturesToGenerate=hu\nCulturesToGenerate=ro\nCulturesToGenerate=zh-Hans\nCulturesToGenerate=zh-Hant\nCulturesToGenerate=ru\nCulturesToGenerate=es\nCulturesToGenerate=fr\nCulturesToGenerate=uk\nManifestName=WarriorbDemo.manifest\nArchiveName=WarriorbDemo.archive\nPortableObjectName=WarriorbDemo.po\n\n[GatherTextStep0]\nCommandletClass=InternationalizationExport\nbImportLoc=true\nLocalizedTextCollapseMode=ELocalizedTextCollapseMode::IdenticalNamespaceAndSource\n\n\n"
  },
  {
    "path": "Config/Localization/WarriorbDemo_ImportDialogue.ini",
    "content": "[CommonSettings]\nSourcePath=Content/Localization/WarriorbDemo\nManifestName=WarriorbDemo.manifest\nArchiveName=WarriorbDemo.archive\nNativeCulture=en\nCulturesToGenerate=en\nCulturesToGenerate=hu\nCulturesToGenerate=ro\nCulturesToGenerate=zh-Hans\nCulturesToGenerate=zh-Hant\nCulturesToGenerate=ru\nCulturesToGenerate=es\nCulturesToGenerate=fr\nCulturesToGenerate=uk\n\n[GatherTextStep0]\nCommandletClass=ImportLocalizedDialogue\nRawAudioPath=\nImportedDialogueFolder=ImportedDialogue\nbImportNativeAsSource=false\n\n\n"
  },
  {
    "path": "Config/Localization/WarriorbDemo_ImportDialogueScript.ini",
    "content": "[CommonSettings]\nSourcePath=Content/Localization/WarriorbDemo\nDestinationPath=Content/Localization/WarriorbDemo\nNativeCulture=en\nCulturesToGenerate=en\nCulturesToGenerate=hu\nCulturesToGenerate=ro\nCulturesToGenerate=zh-Hans\nCulturesToGenerate=zh-Hant\nCulturesToGenerate=ru\nCulturesToGenerate=es\nCulturesToGenerate=fr\nCulturesToGenerate=uk\nManifestName=WarriorbDemo.manifest\nArchiveName=WarriorbDemo.archive\nDialogueScriptName=WarriorbDemoDialogue.csv\n\n[GatherTextStep0]\nCommandletClass=ImportDialogueScript\n\n\n"
  },
  {
    "path": "Config/Localization/WarriorbDialogues_Compile.ini",
    "content": "[CommonSettings]\nSourcePath=Content/Localization/WarriorbDialogues\nDestinationPath=Content/Localization/WarriorbDialogues\nManifestName=WarriorbDialogues.manifest\nArchiveName=WarriorbDialogues.archive\nResourceName=WarriorbDialogues.locres\nbSkipSourceCheck=false\nNativeCulture=en\nCulturesToGenerate=en\nCulturesToGenerate=ro\nCulturesToGenerate=hu\nCulturesToGenerate=zh-Hans\nCulturesToGenerate=zh-Hant\nCulturesToGenerate=ru\nCulturesToGenerate=es\nCulturesToGenerate=fr\nCulturesToGenerate=uk\n\n[GatherTextStep0]\nCommandletClass=GenerateTextLocalizationResource\n\n\n"
  },
  {
    "path": "Config/Localization/WarriorbDialogues_Export.ini",
    "content": "[CommonSettings]\nSourcePath=Content/Localization/WarriorbDialogues\nDestinationPath=Content/Localization/WarriorbDialogues\nNativeCulture=en\nCulturesToGenerate=en\nCulturesToGenerate=ro\nCulturesToGenerate=hu\nCulturesToGenerate=zh-Hans\nCulturesToGenerate=zh-Hant\nCulturesToGenerate=ru\nCulturesToGenerate=es\nCulturesToGenerate=fr\nCulturesToGenerate=uk\nManifestName=WarriorbDialogues.manifest\nArchiveName=WarriorbDialogues.archive\nPortableObjectName=WarriorbDialogues.po\n\n[GatherTextStep0]\nCommandletClass=InternationalizationExport\nbExportLoc=true\nLocalizedTextCollapseMode=ELocalizedTextCollapseMode::IdenticalNamespaceAndSource\nShouldPersistCommentsOnExport=true\nShouldAddSourceLocationsAsComments=true\n\n\n"
  },
  {
    "path": "Config/Localization/WarriorbDialogues_ExportDialogueScript.ini",
    "content": "[CommonSettings]\nSourcePath=Content/Localization/WarriorbDialogues\nDestinationPath=Content/Localization/WarriorbDialogues\nNativeCulture=en\nCulturesToGenerate=en\nCulturesToGenerate=ro\nCulturesToGenerate=hu\nCulturesToGenerate=zh-Hans\nCulturesToGenerate=zh-Hant\nCulturesToGenerate=ru\nCulturesToGenerate=es\nCulturesToGenerate=fr\nCulturesToGenerate=uk\nManifestName=WarriorbDialogues.manifest\nArchiveName=WarriorbDialogues.archive\nDialogueScriptName=WarriorbDialoguesDialogue.csv\n\n[GatherTextStep0]\nCommandletClass=ExportDialogueScript\n\n\n"
  },
  {
    "path": "Config/Localization/WarriorbDialogues_Gather.ini",
    "content": "[CommonSettings]\nManifestDependencies=Content/Localization/WarriorbDemo/WarriorbDemo.manifest\nSourcePath=Content/Localization/WarriorbDialogues\nDestinationPath=Content/Localization/WarriorbDialogues\nManifestName=WarriorbDialogues.manifest\nArchiveName=WarriorbDialogues.archive\nNativeCulture=en\nCulturesToGenerate=en\nCulturesToGenerate=ro\nCulturesToGenerate=hu\nCulturesToGenerate=zh-Hans\nCulturesToGenerate=zh-Hant\nCulturesToGenerate=ru\nCulturesToGenerate=es\nCulturesToGenerate=fr\nCulturesToGenerate=uk\n\n[GatherTextStep0]\nCommandletClass=GatherTextFromAssets\nIncludePathFilters=Content/SO/Dialogues/*\nExcludePathFilters=Content/Localization/*\nExcludePathFilters=Content/L10N/*\nPackageFileNameFilters=*.umap\nPackageFileNameFilters=*.uasset\nShouldGatherFromEditorOnlyData=false\nSkipGatherCache=false\n\n[GatherTextStep1]\nCommandletClass=GenerateGatherManifest\n\n[GatherTextStep2]\nCommandletClass=GenerateGatherArchive\n\n[GatherTextStep3]\nCommandletClass=GenerateTextLocalizationReport\nbWordCountReport=true\nWordCountReportName=WarriorbDialogues.csv\nbConflictReport=true\nConflictReportName=WarriorbDialogues_Conflicts.txt\n\n\n"
  },
  {
    "path": "Config/Localization/WarriorbDialogues_GenerateReports.ini",
    "content": "[CommonSettings]\nSourcePath=Content/Localization/WarriorbDialogues\nDestinationPath=Content/Localization/WarriorbDialogues\nManifestName=WarriorbDialogues.manifest\nArchiveName=WarriorbDialogues.archive\nCulturesToGenerate=en\nCulturesToGenerate=ro\nCulturesToGenerate=hu\nCulturesToGenerate=zh-Hans\nCulturesToGenerate=zh-Hant\nCulturesToGenerate=ru\nCulturesToGenerate=es\nCulturesToGenerate=fr\nCulturesToGenerate=uk\n\n[GatherTextStep0]\nCommandletClass=GenerateTextLocalizationReport\nbWordCountReport=true\nWordCountReportName=WarriorbDialogues.csv\n\n\n"
  },
  {
    "path": "Config/Localization/WarriorbDialogues_Import.ini",
    "content": "[CommonSettings]\nSourcePath=Content/Localization/WarriorbDialogues\nDestinationPath=Content/Localization/WarriorbDialogues\nNativeCulture=en\nCulturesToGenerate=en\nCulturesToGenerate=ro\nCulturesToGenerate=hu\nCulturesToGenerate=zh-Hans\nCulturesToGenerate=zh-Hant\nCulturesToGenerate=ru\nCulturesToGenerate=es\nCulturesToGenerate=fr\nCulturesToGenerate=uk\nManifestName=WarriorbDialogues.manifest\nArchiveName=WarriorbDialogues.archive\nPortableObjectName=WarriorbDialogues.po\n\n[GatherTextStep0]\nCommandletClass=InternationalizationExport\nbImportLoc=true\nLocalizedTextCollapseMode=ELocalizedTextCollapseMode::IdenticalNamespaceAndSource\n\n\n"
  },
  {
    "path": "Config/Localization/WarriorbDialogues_ImportDialogue.ini",
    "content": "[CommonSettings]\nSourcePath=Content/Localization/WarriorbDialogues\nManifestName=WarriorbDialogues.manifest\nArchiveName=WarriorbDialogues.archive\nNativeCulture=en\nCulturesToGenerate=en\nCulturesToGenerate=ro\nCulturesToGenerate=hu\nCulturesToGenerate=zh-Hans\nCulturesToGenerate=zh-Hant\nCulturesToGenerate=ru\nCulturesToGenerate=es\nCulturesToGenerate=fr\nCulturesToGenerate=uk\n\n[GatherTextStep0]\nCommandletClass=ImportLocalizedDialogue\nRawAudioPath=\nImportedDialogueFolder=ImportedDialogue\nbImportNativeAsSource=false\n\n\n"
  },
  {
    "path": "Config/Localization/WarriorbDialogues_ImportDialogueScript.ini",
    "content": "[CommonSettings]\nSourcePath=Content/Localization/WarriorbDialogues\nDestinationPath=Content/Localization/WarriorbDialogues\nNativeCulture=en\nCulturesToGenerate=en\nCulturesToGenerate=ro\nCulturesToGenerate=hu\nCulturesToGenerate=zh-Hans\nCulturesToGenerate=zh-Hant\nCulturesToGenerate=ru\nCulturesToGenerate=es\nCulturesToGenerate=fr\nCulturesToGenerate=uk\nManifestName=WarriorbDialogues.manifest\nArchiveName=WarriorbDialogues.archive\nDialogueScriptName=WarriorbDialoguesDialogue.csv\n\n[GatherTextStep0]\nCommandletClass=ImportDialogueScript\n\n\n"
  },
  {
    "path": "Config/Localization/Warriorb_Compile.ini",
    "content": "[CommonSettings]\nSourcePath=Content/Localization/Warriorb\nDestinationPath=Content/Localization/Warriorb\nManifestName=Warriorb.manifest\nArchiveName=Warriorb.archive\nResourceName=Warriorb.locres\nbSkipSourceCheck=false\nNativeCulture=en\nCulturesToGenerate=en\nCulturesToGenerate=ro\nCulturesToGenerate=hu\nCulturesToGenerate=zh-Hant\nCulturesToGenerate=zh-Hans\nCulturesToGenerate=ru\nCulturesToGenerate=es\nCulturesToGenerate=fr\nCulturesToGenerate=uk\n\n[GatherTextStep0]\nCommandletClass=GenerateTextLocalizationResource\n\n\n"
  },
  {
    "path": "Config/Localization/Warriorb_Export.ini",
    "content": "[CommonSettings]\nSourcePath=Content/Localization/Warriorb\nDestinationPath=Content/Localization/Warriorb\nNativeCulture=en\nCulturesToGenerate=en\nCulturesToGenerate=ro\nCulturesToGenerate=hu\nCulturesToGenerate=zh-Hant\nCulturesToGenerate=zh-Hans\nCulturesToGenerate=ru\nCulturesToGenerate=es\nCulturesToGenerate=fr\nCulturesToGenerate=uk\nManifestName=Warriorb.manifest\nArchiveName=Warriorb.archive\nPortableObjectName=Warriorb.po\n\n[GatherTextStep0]\nCommandletClass=InternationalizationExport\nbExportLoc=true\nLocalizedTextCollapseMode=ELocalizedTextCollapseMode::IdenticalNamespaceAndSource\nShouldPersistCommentsOnExport=true\nShouldAddSourceLocationsAsComments=true\n\n\n"
  },
  {
    "path": "Config/Localization/Warriorb_ExportDialogueScript.ini",
    "content": "[CommonSettings]\nSourcePath=Content/Localization/Warriorb\nDestinationPath=Content/Localization/Warriorb\nNativeCulture=en\nCulturesToGenerate=en\nCulturesToGenerate=ro\nCulturesToGenerate=hu\nCulturesToGenerate=zh-Hant\nCulturesToGenerate=zh-Hans\nCulturesToGenerate=ru\nCulturesToGenerate=es\nCulturesToGenerate=fr\nCulturesToGenerate=uk\nManifestName=Warriorb.manifest\nArchiveName=Warriorb.archive\nDialogueScriptName=WarriorbDialogue.csv\n\n[GatherTextStep0]\nCommandletClass=ExportDialogueScript\n\n\n"
  },
  {
    "path": "Config/Localization/Warriorb_Gather.ini",
    "content": "[CommonSettings]\nManifestDependencies=Content/Localization/WarriorbDemo/WarriorbDemo.manifest\nSourcePath=Content/Localization/Warriorb\nDestinationPath=Content/Localization/Warriorb\nManifestName=Warriorb.manifest\nArchiveName=Warriorb.archive\nNativeCulture=en\nCulturesToGenerate=en\nCulturesToGenerate=ro\nCulturesToGenerate=hu\nCulturesToGenerate=zh-Hant\nCulturesToGenerate=zh-Hans\nCulturesToGenerate=ru\nCulturesToGenerate=es\nCulturesToGenerate=fr\nCulturesToGenerate=uk\n\n[GatherTextStep0]\nCommandletClass=GatherTextFromSource\nSearchDirectoryPaths=%LOCPROJECTROOT%Config\nSearchDirectoryPaths=%LOCPROJECTROOT%Source/SOrb\nExcludePathFilters=Config/Localization/*\nFileNameFilters=*.h\nFileNameFilters=*.cpp\nFileNameFilters=*.ini\nShouldGatherFromEditorOnlyData=false\n\n[GatherTextStep1]\nCommandletClass=GatherTextFromAssets\nIncludePathFilters=Content/*\nExcludePathFilters=Content/Localization/*\nExcludePathFilters=*/Content/Localization/*\nExcludePathFilters=Content/SO/GUI/Editor/*\nExcludePathFilters=Content/Temp/*\nExcludePathFilters=Content/WATER_TEST/*\nExcludePathFilters=Content/StarterContent/*\nExcludePathFilters=Content/SO/Maps/PrototypeLevels/*\nExcludePathFilters=Content/L10N/*\nExcludePathFilters=Content/SO/Dialogues/*\nExcludePathFilters=Content/SO/Maps/Story/Act2/SlidePath_AnnaWIP*\nExcludePathFilters=Content/SO/Effects/Materials/*\nExcludePathFilters=Content/ForestSet/Materials/*\nExcludePathFilters=Content/SO/Assets/Decals/*\nExcludePathFilters=Content/SO/Effects/Temp/Lightning/*\nPackageFileNameFilters=*.umap\nPackageFileNameFilters=*.uasset\nShouldGatherFromEditorOnlyData=false\nSkipGatherCache=false\n\n[GatherTextStep2]\nCommandletClass=GenerateGatherManifest\n\n[GatherTextStep3]\nCommandletClass=GenerateGatherArchive\n\n[GatherTextStep4]\nCommandletClass=GenerateTextLocalizationReport\nbWordCountReport=true\nWordCountReportName=Warriorb.csv\nbConflictReport=true\nConflictReportName=Warriorb_Conflicts.txt\n\n\n"
  },
  {
    "path": "Config/Localization/Warriorb_GenerateReports.ini",
    "content": "[CommonSettings]\nSourcePath=Content/Localization/Warriorb\nDestinationPath=Content/Localization/Warriorb\nManifestName=Warriorb.manifest\nArchiveName=Warriorb.archive\nCulturesToGenerate=en\nCulturesToGenerate=ro\nCulturesToGenerate=hu\nCulturesToGenerate=zh-Hant\nCulturesToGenerate=zh-Hans\nCulturesToGenerate=ru\nCulturesToGenerate=es\nCulturesToGenerate=fr\nCulturesToGenerate=uk\n\n[GatherTextStep0]\nCommandletClass=GenerateTextLocalizationReport\nbWordCountReport=true\nWordCountReportName=Warriorb.csv\n\n\n"
  },
  {
    "path": "Config/Localization/Warriorb_Import.ini",
    "content": "[CommonSettings]\nSourcePath=Content/Localization/Warriorb\nDestinationPath=Content/Localization/Warriorb\nNativeCulture=en\nCulturesToGenerate=en\nCulturesToGenerate=ro\nCulturesToGenerate=hu\nCulturesToGenerate=zh-Hant\nCulturesToGenerate=zh-Hans\nCulturesToGenerate=ru\nCulturesToGenerate=es\nCulturesToGenerate=fr\nCulturesToGenerate=uk\nManifestName=Warriorb.manifest\nArchiveName=Warriorb.archive\nPortableObjectName=Warriorb.po\n\n[GatherTextStep0]\nCommandletClass=InternationalizationExport\nbImportLoc=true\nLocalizedTextCollapseMode=ELocalizedTextCollapseMode::IdenticalNamespaceAndSource\n\n\n"
  },
  {
    "path": "Config/Localization/Warriorb_ImportDialogue.ini",
    "content": "[CommonSettings]\nSourcePath=Content/Localization/Warriorb\nManifestName=Warriorb.manifest\nArchiveName=Warriorb.archive\nNativeCulture=en\nCulturesToGenerate=en\nCulturesToGenerate=ro\nCulturesToGenerate=hu\nCulturesToGenerate=zh-Hant\nCulturesToGenerate=zh-Hans\nCulturesToGenerate=ru\nCulturesToGenerate=es\nCulturesToGenerate=fr\nCulturesToGenerate=uk\n\n[GatherTextStep0]\nCommandletClass=ImportLocalizedDialogue\nRawAudioPath=\nImportedDialogueFolder=ImportedDialogue\nbImportNativeAsSource=false\n\n\n"
  },
  {
    "path": "Config/Localization/Warriorb_ImportDialogueScript.ini",
    "content": "[CommonSettings]\nSourcePath=Content/Localization/Warriorb\nDestinationPath=Content/Localization/Warriorb\nNativeCulture=en\nCulturesToGenerate=en\nCulturesToGenerate=ro\nCulturesToGenerate=hu\nCulturesToGenerate=zh-Hant\nCulturesToGenerate=zh-Hans\nCulturesToGenerate=ru\nCulturesToGenerate=es\nCulturesToGenerate=fr\nCulturesToGenerate=uk\nManifestName=Warriorb.manifest\nArchiveName=Warriorb.archive\nDialogueScriptName=WarriorbDialogue.csv\n\n[GatherTextStep0]\nCommandletClass=ImportDialogueScript\n\n\n"
  },
  {
    "path": "Config/OSS/Live/Achievements.json",
    "content": "{\n\t\"AchievementEventName\" : \"TempActivateAchiement\",\n\t\"AchievementMap\" : \n\t{\n\t\t\"A_StartLikeAPro\" : 1,\n\t\t\"A_HighDiver\" : 2,\n\t\t\"A_KeenEyedStarter\" : 3,\n\t\t\"A_FindingYourVoice\" : 4,\n\t\t\"A_TrippleTheFun\" : 5,\n\t\t\"A_SelfTrained\" : 6,\n\t\t\"A_SuicideSQuad\" : 7,\n\t\t\"A_ClueFromThePast\" : 8,\n\t\t\"A_EatenByChest\" : 9,\n\t\t\"A_WeirdDevice\" : 10,\n\t\t\"A_BookCollector\" : 11,\n\t\t\"A_FlowerTaker\" : 12,\n\t\t\"A_Historian\" : 13,\n\t\t\"A_Ravenclaw\" : 14,\n\t\t\"A_MinibossNoMeteorHit\" : 15,\n\t\t\"A_GemCharged\" : 16,\n\t\t\"A_CreatureInCage\" : 17,\n\t\t\"A_GolemHunter\" : 18,\n\t\t\"A_Kind\" : 19,\n\t\t\"A_PortalPlace\" : 20,\n\t\t\"A_Worthy\" : 21,\n\t\t\"A_Worthiest\" : 22,\n\t\t\"A_Speedrun1\" : 23,\n\t\t\"A_Poetry\" : 24,\n\t\t\"A_HallowedHeart\" : 25,\n\t\t\"A_DwarvenGate\" : 26,\n\t\t\"A_LavaLairTower\" : 27,\n\t\t\"A_LavaLairTowerClimb\" : 28,\n\t\t\"A_WrackedWaters\" : 29,\n\t\t\"A_Sailor\" : 30,\n\t\t\"A_CreatureInCage2\" : 31,\n\t\t\"A_Souper\" : 32,\n\t\t\"A_CleanShore\" : 33,\n\t\t\"A_Wheel\" : 34,\n\t\t\"A_GolemDestroyer\" : 35,\n\t\t\"A_GhostAbacus\" : 36,\n\t\t\"A_ClearOutpost\" : 37,\n\t\t\"A_Swapkill\" : 38,\n\t\t\"A_BounceStun\" : 39,\n\t\t\"A_CarefulOne\" : 40,\n\t\t\"A_Pyromaniac\" : 41,\n\t\t\"A_ShockingLightning\" : 42,\n\t\t\"A_Tealslower\" : 43,\n\t\t\"A_Tealmageddon\" : 44,\n\t\t\"A_MassSlower\" : 45,\n\t\t\"A_StunFromAbove\" : 46,\n\t\t\"A_GreenDeath\" : 47,\n\t\t\"A_MemCollector\" : 48,\n\t\t\"A_InMemoriam\" : 49,\n\t\t\"A_ArmourWrath\" : 50,\n\t\t\"A_ArmourWrathS\" : 51,\n\t\t\"A_FallenDruid\" : 52,\n\t\t\"A_FallenDruidS\" : 53,\n\t\t\"A_DwarvenStatue\" : 54,\n\t\t\"A_DwarvenStatueS\" : 55,\n\t\t\"A_Speedrun2\" : 56,\n\t\t\"A_PipeMaster\" : 57,\n\t\t\"A_AlmostThere\" : 58,\n\t\t\"A_LeaveRR\" : 59,\n\t\t\"A_Microtransactions\" : 60,\n\t\t\"A_ToInfinity\" : 61,\n\t\t\"A_FlappyBall\" : 62,\n\t\t\"A_OtherSideOfCage\" : 63,\n\t\t\"A_Speedrun3\" : 64,\n\t\t\"A_ChanceForEveryone\" : 65,\n\t\t\"A_SeparatedWorlds\" : 66,\n\t\t\"A_Speedrunner\" : 67,\n\t\t\"A_Insane\" : 68\n\t}\n}\n"
  },
  {
    "path": "Config/Switch/SwitchDeviceProfiles.ini",
    "content": "[DeviceProfiles]\n+DeviceProfileNameAndTypes=Switch,Switch\n+DeviceProfileNameAndTypes=SwitchConsole,Switch\n+DeviceProfileNameAndTypes=SwitchHandheld,Switch\n+DeviceProfileNameAndTypes=Switch_Console_Forward,Switch\n+DeviceProfileNameAndTypes=Switch_Handheld_Forward,Switch\n+DeviceProfileNameAndTypes=Switch_Console_Deferred,Switch\n+DeviceProfileNameAndTypes=Switch_Handheld_Deferred,Switch\n\n[Switch DeviceProfile]\nDeviceType=Switch\n+CVars=sg.ViewDistanceQuality=0\n+CVars=sg.AntiAliasingQuality=2\n+CVars=sg.ShadowQuality=0\n+CVars=sg.PostProcessQuality=0\n+CVars=sg.TextureQuality=3\n+CVars=r.Streaming.PoolSize=1200\n+CVars=r.Vsync=0\n+CVars=sg.EffectsQuality=1\n+CVars=r.AmbientOcclusionLevels=0\n+CVars=r.EmitterSpawnRateScale=1\n+TextureLODGroups=(Group=TEXTUREGROUP_World,MinLODSize=1,MaxLODSize=4096,LODBias=0,MinMagFilter=linear,MipFilter=point,MipGenSettings=TMGS_SimpleAverage)\n+TextureLODGroups=(Group=TEXTUREGROUP_WorldNormalMap,MinLODSize=1,MaxLODSize=4096,LODBias=0,MinMagFilter=linear,MipFilter=point,MipGenSettings=TMGS_SimpleAverage)\n+TextureLODGroups=(Group=TEXTUREGROUP_WorldSpecular,MinLODSize=1,MaxLODSize=4096,LODBias=0,MinMagFilter=linear,MipFilter=point,MipGenSettings=TMGS_SimpleAverage)\n+TextureLODGroups=(Group=TEXTUREGROUP_Character,MinLODSize=1,MaxLODSize=4096,LODBias=0,MinMagFilter=linear,MipFilter=point,MipGenSettings=TMGS_SimpleAverage)\n+TextureLODGroups=(Group=TEXTUREGROUP_CharacterNormalMap,MinLODSize=1,MaxLODSize=4096,LODBias=0,MinMagFilter=linear,MipFilter=point,MipGenSettings=TMGS_SimpleAverage)\n+TextureLODGroups=(Group=TEXTUREGROUP_CharacterSpecular,MinLODSize=1,MaxLODSize=4096,LODBias=0,MinMagFilter=linear,MipFilter=point,MipGenSettings=TMGS_SimpleAverage)\n+TextureLODGroups=(Group=TEXTUREGROUP_Weapon,MinLODSize=1,MaxLODSize=4096,LODBias=0,MinMagFilter=linear,MipFilter=point,MipGenSettings=TMGS_SimpleAverage)\n+TextureLODGroups=(Group=TEXTUREGROUP_WeaponNormalMap,MinLODSize=1,MaxLODSize=4096,LODBias=0,MinMagFilter=linear,MipFilter=point,MipGenSettings=TMGS_SimpleAverage)\n+TextureLODGroups=(Group=TEXTUREGROUP_WeaponSpecular,MinLODSize=1,MaxLODSize=4096,LODBias=0,MinMagFilter=linear,MipFilter=point,MipGenSettings=TMGS_SimpleAverage)\n+TextureLODGroups=(Group=TEXTUREGROUP_Vehicle,MinLODSize=1,MaxLODSize=4096,LODBias=0,MinMagFilter=linear,MipFilter=point,MipGenSettings=TMGS_SimpleAverage)\n+TextureLODGroups=(Group=TEXTUREGROUP_VehicleNormalMap,MinLODSize=1,MaxLODSize=4096,LODBias=0,MinMagFilter=linear,MipFilter=point,MipGenSettings=TMGS_SimpleAverage)\n+TextureLODGroups=(Group=TEXTUREGROUP_VehicleSpecular,MinLODSize=1,MaxLODSize=4096,LODBias=0,MinMagFilter=linear,MipFilter=point,MipGenSettings=TMGS_SimpleAverage)\n+TextureLODGroups=(Group=TEXTUREGROUP_Cinematic,MinLODSize=1,MaxLODSize=4096,LODBias=0,MinMagFilter=linear,MipFilter=point,MipGenSettings=TMGS_SimpleAverage)\n+TextureLODGroups=(Group=TEXTUREGROUP_Effects,MinLODSize=1,MaxLODSize=4096,LODBias=0,MinMagFilter=linear,MipFilter=point,MipGenSettings=TMGS_SimpleAverage)\n+TextureLODGroups=(Group=TEXTUREGROUP_EffectsNotFiltered,MinLODSize=1,MaxLODSize=4096,LODBias=0,MinMagFilter=linear,MipFilter=point,MipGenSettings=TMGS_SimpleAverage)\n+TextureLODGroups=(Group=TEXTUREGROUP_Skybox,MinLODSize=1,MaxLODSize=4096,LODBias=0,MinMagFilter=linear,MipFilter=point,MipGenSettings=TMGS_SimpleAverage)\n+TextureLODGroups=(Group=TEXTUREGROUP_UI,MinLODSize=1,MaxLODSize=4096,LODBias=0,MinMagFilter=linear,MipFilter=point,MipGenSettings=TMGS_NoMipmaps)\n+TextureLODGroups=(Group=TEXTUREGROUP_Lightmap,MinLODSize=1,MaxLODSize=4096,LODBias=0,MinMagFilter=linear,MipFilter=point,MipGenSettings=TMGS_SimpleAverage)\n+TextureLODGroups=(Group=TEXTUREGROUP_Shadowmap,MinLODSize=1,MaxLODSize=4096,LODBias=0,MinMagFilter=linear,MipFilter=point,NumStreamedMips=3,MipGenSettings=TMGS_SimpleAverage)\n+TextureLODGroups=(Group=TEXTUREGROUP_RenderTarget,MinLODSize=1,MaxLODSize=4096,LODBias=0,MinMagFilter=linear,MipFilter=point,MipGenSettings=TMGS_SimpleAverage)\n+TextureLODGroups=(Group=TEXTUREGROUP_MobileFlattened,MinLODSize=1,MaxLODSize=4096,LODBias=0,MinMagFilter=linear,MipFilter=point,MipGenSettings=TMGS_SimpleAverage)\n+TextureLODGroups=(Group=TEXTUREGROUP_Terrain_Heightmap,MinLODSize=1,MaxLODSize=4096,LODBias=0,MinMagFilter=linear,MipFilter=point,MipGenSettings=TMGS_SimpleAverage)\n+TextureLODGroups=(Group=TEXTUREGROUP_Terrain_Weightmap,MinLODSize=1,MaxLODSize=4096,LODBias=0,MinMagFilter=linear,MipFilter=point,MipGenSettings=TMGS_SimpleAverage)\n+TextureLODGroups=(Group=TEXTUREGROUP_Bokeh,MinLODSize=1,MaxLODSize=256,LODBias=0,MinMagFilter=linear,MipFilter=linear,MipGenSettings=TMGS_SimpleAverage)\n+TextureLODGroups=(Group=TEXTUREGROUP_Pixels2D,MinLODSize=1,MaxLODSize=4096,LODBias=0,MinMagFilter=point,MipFilter=point,MipGenSettings=TMGS_SimpleAverage)\n; 720p with a 1080p backbuffer\n+CVars=r.ScreenPercentage=66.66\n+CVars=r.setres=1920x1080\n\n[SwitchConsole DeviceProfile]\nDeviceType=Switch\nBaseProfileName=Switch\n\n[SwitchHandheld DeviceProfile]\nDeviceType=Switch\nBaseProfileName=Switch\n+CVars=r.setres=1280x720\n\n[Switch_Console_Forward DeviceProfile]\nDeviceType=Switch\nBaseProfileName=SwitchConsole\n\n[Switch_Console_Deferred DeviceProfile]\nDeviceType=Switch\nBaseProfileName=SwitchConsole\n\n[Switch_Handheld_Forward DeviceProfile]\nDeviceType=Switch\nBaseProfileName=SwitchHandheld\n\n[Switch_Handheld_Deferred DeviceProfile]\nDeviceType=Switch\nBaseProfileName=SwitchHandheld\n"
  },
  {
    "path": "Config/Switch/SwitchEngine.ini",
    "content": "[Audio]\n; Disable Unreal audio device on all platforms\n; We use the FMOD one https://fmod.com/resources/documentation-ue4?version=2.0&page=user-guide.html#disabling-unreal-audio-device\nAudioDeviceModuleName=\n\n[/Script/FMODStudio.FMODSettings]\nbEnableLiveUpdate=False\n\n[/Script/Engine.Engine]\nbSmoothFrameRate=false\n\n[/Script/SwitchRuntimeSettings.SwitchRuntimeSettings]\nbUseMobileForwardRenderer=False\nbUseForwardShading=False\nbSupportMobileAndDeferred=False\nbUseASTCTextures=False\nbUseDXTForUITextures=False\nbUseDistanceFields=False\nbUseSparseTextures=True\nTouchScreenUsage=Supported\nbSupportFourFingerTap=True\nJoyConDeadZone=0.200000\nJoyConSensitivity=1.000000\nProControllerDeadZone=0.100000\nProControllerSensitivity=1.000000\nVibrationAttenuationHF=1.000000\nVibrationAttenuationLF=1.000000\nInitialMaxControllers=2\nInitialMinControllers=1\nInitialEnableDualStickControllers=True\nInitialEnableSingleStickControllers=False\nInitialUseHorizontalSingleStick=True\nInitialEnableSixAxisSensors=True\nInitialUseRightJoyConForMotion=True\nInitialZeroPointDriftMode=0\nProgramId=0x010032700eac4000\nApplicationVersion=1\nApplicationVersionString=0.1\n-SupportedLanguages=AmericanEnglish\n+SupportedLanguages=AmericanEnglish\n+SupportedLanguages=French\n+SupportedLanguages=Russian\n+SupportedLanguages=Spanish\n+SupportedLanguages=SimplifiedChinese\n+SupportedLanguages=TraditionalChinese\n+LocalizedTitles=(Language=AmericanEnglish,Title=\"WarriOrb\",Publisher=\"Not Yet\")\n+LocalizedTitles=(Language=French,Title=\"WarriOrb\",Publisher=\"Not Yet\")\n+LocalizedTitles=(Language=Russian,Title=\"WarriOrb\",Publisher=\"Not Yet\")\n+LocalizedTitles=(Language=Spanish,Title=\"WarriOrb\",Publisher=\"Not Yet\")\n+LocalizedTitles=(Language=SimplifiedChinese,Title=\"WarriOrb\",Publisher=\"Not Yet\")\n+LocalizedTitles=(Language=TraditionalChinese,Title=\"WarriOrb\",Publisher=\"Not Yet\")\n+AgeRatings=(Organization=ESRB,Age=6)\n+AgeRatings=(Organization=Russian,Age=12)\n+AgeRatings=(Organization=ACB,Age=0)\n+AgeRatings=(Organization=PEGI,Age=3)\n+AgeRatings=(Organization=USK,Age=6)\n+AgeRatings=(Organization=ClassInd,Age=0)\n+AgeRatings=(Organization=OFLC,Age=0)\n+AgeRatings=(Organization=PEGIPortugal,Age=3)\n+AgeRatings=(Organization=PEGIBBFC,Age=3)\nbGenerateSymbols=False\nMainThreadStackSizeKB=64\nDebugMainThreadStackSizeKB=80\nSystemResourceSizeMB=80\nSaveGameSizeKB=4096\nSaveGameJournalSizeKB=1024\nSaveGameSizeMaxKB=0\nSaveGameJournalSizeMaxKB=0\nSaveGameOwnerId=\nbShowDataLossConfirmationDialog=True\nbRouteGameUserSettingsToSaveGame=True\nTempDataSizeKB=0\nCacheDataSizeKB=0\nCacheDataJournalSizeKB=0\nStartupAccountMode=Required\nbStartupUserAccountIsOptional=False\nbUserAccountSwitchLock=False\nLocalCommunicationId=\nLdnPassphrase=39vfjso230$riofkao3!(9as4:gf\nFriendPresenceGroupId=\nGameServerId=\nGameServerAccessKey=\nbEnableNEXLibrary=False\nConserveBatteryLife=False\nApplicationErrorCode=\nbAllowScreenshots=True\nbAllowVideoCapture=False\nbAllowCrashReporting=False\nbEnableCustomCrashHandling=False\nbSuspendWhileInBackground=True\nbDemoBuild=False\nbAllowAOCInstallWhileRunning=False\nbDisableCPUBoostDuringLoad=False\nLogoType=LicensedByNintendo\nbUseManualLogoHide=False\nSystemHelpUrl=\nBrowserCallbackUrl=\nBrowserCallbackableUrl=\nbBindBrowserToUser=False\nbShowBrowserPointer=False\nMaxNumAudioSources=0\nOpusBehavior=Default\nMaxConcurrentHardwareDecodes=0\nAudioMemoryPoolInitialSizeKB=3072\nAudioMemoryPoolIncreaseSizeKB=256\nSpatializationPlugin=\nReverbPlugin=\nOcclusionPlugin=\nCompressionOverrides=(bOverrideCompressionTimes=False,DurationThreshold=5.000000,MaxNumRandomBranches=0,SoundCueQualityIndex=0)\nChunkSizeKB=0\nbUseAudioStreamCaching=False\nCacheSizeKB=0\nbResampleForDevice=False\nSoundCueCookQualityIndex=-1\nMaxSampleRate=0.000000\nHighSampleRate=0.000000\nMedSampleRate=0.000000\nLowSampleRate=0.000000\nMinSampleRate=0.000000\nCompressionQualityModifier=0.000000\nAutoStreamingThreshold=0.000000\nGameCardSizeMB=0\nGameCardClockRate=0\n\n"
  },
  {
    "path": "Config/Switch/SwitchGameUserSettings.ini",
    "content": "; 0:low, 1:med, 2:high, 3:epic, 4:cinematic, default: 3\n[ScalabilityGroups]\nsg.ResolutionQuality=100\nsg.ViewDistanceQuality=0\nsg.AntiAliasingQuality=2\nsg.ShadowQuality=0\nsg.PostProcessQuality=0\nsg.TextureQuality=3\nsg.EffectsQuality=0\nsg.FoliageQuality=0\n"
  },
  {
    "path": "Config/Switch/SwitchInput.ini",
    "content": "\n[/Script/Engine.InputSettings]\n-ActionMappings=(ActionName=\"MainMenuBack\",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=Gamepad_FaceButton_Right)\n-ActionMappings=(ActionName=\"MainMenuEnter\",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=Gamepad_FaceButton_Bottom)\n-ActionMappings=(ActionName=\"MainMenuEnter\",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=Gamepad_LeftThumbstick)\n+ActionMappings=(ActionName=\"MainMenuBack\",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=Gamepad_FaceButton_Bottom)\n+ActionMappings=(ActionName=\"MainMenuEnter\",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=Gamepad_FaceButton_Right)\n"
  },
  {
    "path": "Config/Windows/WindowsEngine.ini",
    "content": "[/Script/Engine.GameEngine]\n!NetDriverDefinitions=ClearArray\n; Enabled\n+NetDriverDefinitions=(DefName=\"GameNetDriver\",DriverClassName=\"/Script/OnlineSubsystemSteam.SteamNetDriver\",DriverClassNameFallback=\"/Script/OnlineSubsystemUtils.IpNetDriver\")\n; Disabled\n;+NetDriverDefinitions=(DefName=\"GameNetDriver\",DriverClassName=\"OnlineSubsystemUtils.IpNetDriver\",DriverClassNameFallback=\"/Script/OnlineSubsystemUtils.IpNetDriver\")\n\n[OnlineSubsystem]\nDefaultPlatformService=Steam\n\n; [GameNetDriver PacketHandlerProfileConfig]\n; +Components=OnlineSubsystemSteam.SteamAuthComponentModuleInterface\n\n; [PendingNetDriver PacketHandlerProfileConfig]\n; +Components=OnlineSubsystemSteam.SteamAuthComponentModuleInterface\n"
  },
  {
    "path": "Config/XboxOne/XboxOneDeviceProfiles.ini",
    "content": "[DeviceProfiles]\n\n[XboxOne DeviceProfile]\nDeviceType=XboxOne\nBaseProfileName=\nCVars=r.Tonemapper.GrainQuantization=0\nCVars=r.AmbientOcclusionRadiusScale=2\nCVars=r.D3D12.Depth24Bit=0\nCVars=sg.TextureQuality=3\nCVars=sg.PostProcessQuality=2\n+CVars=sg.ViewDistanceQuality=0\n+CVars=sg.AntiAliasingQuality=2\n+CVars=sg.ShadowQuality=0\n+CVars=sg.PostProcessQuality=0\n+CVars=sg.TextureQuality=3\n+CVars=r.Streaming.PoolSize=1200\n+CVars=sg.EffectsQuality=1\n+CVars=r.AmbientOcclusionLevels=0\n+CVars=r.EmitterSpawnRateScale=1\n+CVars=r.VSync=1\nTextureLODGroups=(Group=TEXTUREGROUP_World,LODBias=0,LODBias_Smaller=-1,LODBias_Smallest=-1,NumStreamedMips=-1,MipGenSettings=TMGS_SimpleAverage,MinLODSize=1,MaxLODSize=8192,MaxLODSize_Smaller=-1,MaxLODSize_Smallest=-1,OptionalLODBias=0,OptionalMaxLODSize=4096,MinMagFilter=\"aniso\",MipFilter=\"point\")\nTextureLODGroups=(Group=TEXTUREGROUP_WorldNormalMap,LODBias=0,LODBias_Smaller=-1,LODBias_Smallest=-1,NumStreamedMips=-1,MipGenSettings=TMGS_SimpleAverage,MinLODSize=1,MaxLODSize=8192,MaxLODSize_Smaller=-1,MaxLODSize_Smallest=-1,OptionalLODBias=0,OptionalMaxLODSize=4096,MinMagFilter=\"aniso\",MipFilter=\"point\")\nTextureLODGroups=(Group=TEXTUREGROUP_WorldSpecular,LODBias=0,LODBias_Smaller=-1,LODBias_Smallest=-1,NumStreamedMips=-1,MipGenSettings=TMGS_SimpleAverage,MinLODSize=1,MaxLODSize=8192,MaxLODSize_Smaller=-1,MaxLODSize_Smallest=-1,OptionalLODBias=0,OptionalMaxLODSize=4096,MinMagFilter=\"aniso\",MipFilter=\"point\")\nTextureLODGroups=(Group=TEXTUREGROUP_Character,LODBias=0,LODBias_Smaller=-1,LODBias_Smallest=-1,NumStreamedMips=-1,MipGenSettings=TMGS_SimpleAverage,MinLODSize=1,MaxLODSize=8192,MaxLODSize_Smaller=-1,MaxLODSize_Smallest=-1,OptionalLODBias=0,OptionalMaxLODSize=4096,MinMagFilter=\"aniso\",MipFilter=\"point\")\nTextureLODGroups=(Group=TEXTUREGROUP_CharacterNormalMap,LODBias=0,LODBias_Smaller=-1,LODBias_Smallest=-1,NumStreamedMips=-1,MipGenSettings=TMGS_SimpleAverage,MinLODSize=1,MaxLODSize=8192,MaxLODSize_Smaller=-1,MaxLODSize_Smallest=-1,OptionalLODBias=0,OptionalMaxLODSize=4096,MinMagFilter=\"aniso\",MipFilter=\"point\")\nTextureLODGroups=(Group=TEXTUREGROUP_CharacterSpecular,LODBias=0,LODBias_Smaller=-1,LODBias_Smallest=-1,NumStreamedMips=-1,MipGenSettings=TMGS_SimpleAverage,MinLODSize=1,MaxLODSize=8192,MaxLODSize_Smaller=-1,MaxLODSize_Smallest=-1,OptionalLODBias=0,OptionalMaxLODSize=4096,MinMagFilter=\"aniso\",MipFilter=\"point\")\nTextureLODGroups=(Group=TEXTUREGROUP_Weapon,LODBias=0,LODBias_Smaller=-1,LODBias_Smallest=-1,NumStreamedMips=-1,MipGenSettings=TMGS_SimpleAverage,MinLODSize=1,MaxLODSize=8192,MaxLODSize_Smaller=-1,MaxLODSize_Smallest=-1,OptionalLODBias=0,OptionalMaxLODSize=4096,MinMagFilter=\"aniso\",MipFilter=\"point\")\nTextureLODGroups=(Group=TEXTUREGROUP_WeaponNormalMap,LODBias=0,LODBias_Smaller=-1,LODBias_Smallest=-1,NumStreamedMips=-1,MipGenSettings=TMGS_SimpleAverage,MinLODSize=1,MaxLODSize=8192,MaxLODSize_Smaller=-1,MaxLODSize_Smallest=-1,OptionalLODBias=0,OptionalMaxLODSize=4096,MinMagFilter=\"aniso\",MipFilter=\"point\")\nTextureLODGroups=(Group=TEXTUREGROUP_WeaponSpecular,LODBias=0,LODBias_Smaller=-1,LODBias_Smallest=-1,NumStreamedMips=-1,MipGenSettings=TMGS_SimpleAverage,MinLODSize=1,MaxLODSize=8192,MaxLODSize_Smaller=-1,MaxLODSize_Smallest=-1,OptionalLODBias=0,OptionalMaxLODSize=4096,MinMagFilter=\"aniso\",MipFilter=\"point\")\nTextureLODGroups=(Group=TEXTUREGROUP_Vehicle,LODBias=0,LODBias_Smaller=-1,LODBias_Smallest=-1,NumStreamedMips=-1,MipGenSettings=TMGS_SimpleAverage,MinLODSize=1,MaxLODSize=8192,MaxLODSize_Smaller=-1,MaxLODSize_Smallest=-1,OptionalLODBias=0,OptionalMaxLODSize=4096,MinMagFilter=\"aniso\",MipFilter=\"point\")\nTextureLODGroups=(Group=TEXTUREGROUP_VehicleNormalMap,LODBias=0,LODBias_Smaller=-1,LODBias_Smallest=-1,NumStreamedMips=-1,MipGenSettings=TMGS_SimpleAverage,MinLODSize=1,MaxLODSize=8192,MaxLODSize_Smaller=-1,MaxLODSize_Smallest=-1,OptionalLODBias=0,OptionalMaxLODSize=4096,MinMagFilter=\"aniso\",MipFilter=\"point\")\nTextureLODGroups=(Group=TEXTUREGROUP_VehicleSpecular,LODBias=0,LODBias_Smaller=-1,LODBias_Smallest=-1,NumStreamedMips=-1,MipGenSettings=TMGS_SimpleAverage,MinLODSize=1,MaxLODSize=8192,MaxLODSize_Smaller=-1,MaxLODSize_Smallest=-1,OptionalLODBias=0,OptionalMaxLODSize=4096,MinMagFilter=\"aniso\",MipFilter=\"point\")\nTextureLODGroups=(Group=TEXTUREGROUP_Cinematic,LODBias=0,LODBias_Smaller=-1,LODBias_Smallest=-1,NumStreamedMips=-1,MipGenSettings=TMGS_SimpleAverage,MinLODSize=1,MaxLODSize=8192,MaxLODSize_Smaller=-1,MaxLODSize_Smallest=-1,OptionalLODBias=0,OptionalMaxLODSize=4096,MinMagFilter=\"aniso\",MipFilter=\"point\")\nTextureLODGroups=(Group=TEXTUREGROUP_Effects,LODBias=0,LODBias_Smaller=-1,LODBias_Smallest=-1,NumStreamedMips=-1,MipGenSettings=TMGS_SimpleAverage,MinLODSize=1,MaxLODSize=8192,MaxLODSize_Smaller=-1,MaxLODSize_Smallest=-1,OptionalLODBias=0,OptionalMaxLODSize=4096,MinMagFilter=\"linear\",MipFilter=\"point\")\nTextureLODGroups=(Group=TEXTUREGROUP_EffectsNotFiltered,LODBias=0,LODBias_Smaller=-1,LODBias_Smallest=-1,NumStreamedMips=-1,MipGenSettings=TMGS_SimpleAverage,MinLODSize=1,MaxLODSize=8192,MaxLODSize_Smaller=-1,MaxLODSize_Smallest=-1,OptionalLODBias=0,OptionalMaxLODSize=4096,MinMagFilter=\"aniso\",MipFilter=\"point\")\nTextureLODGroups=(Group=TEXTUREGROUP_Skybox,LODBias=0,LODBias_Smaller=-1,LODBias_Smallest=-1,NumStreamedMips=-1,MipGenSettings=TMGS_SimpleAverage,MinLODSize=1,MaxLODSize=8192,MaxLODSize_Smaller=-1,MaxLODSize_Smallest=-1,OptionalLODBias=0,OptionalMaxLODSize=4096,MinMagFilter=\"aniso\",MipFilter=\"point\")\nTextureLODGroups=(Group=TEXTUREGROUP_UI,LODBias=0,LODBias_Smaller=-1,LODBias_Smallest=-1,NumStreamedMips=-1,MipGenSettings=TMGS_NoMipmaps,MinLODSize=1,MaxLODSize=8192,MaxLODSize_Smaller=-1,MaxLODSize_Smallest=-1,OptionalLODBias=0,OptionalMaxLODSize=4096,MinMagFilter=\"aniso\",MipFilter=\"point\")\nTextureLODGroups=(Group=TEXTUREGROUP_Lightmap,LODBias=0,LODBias_Smaller=-1,LODBias_Smallest=-1,NumStreamedMips=-1,MipGenSettings=TMGS_SimpleAverage,MinLODSize=1,MaxLODSize=8192,MaxLODSize_Smaller=-1,MaxLODSize_Smallest=-1,OptionalLODBias=0,OptionalMaxLODSize=4096,MinMagFilter=\"aniso\",MipFilter=\"point\")\nTextureLODGroups=(Group=TEXTUREGROUP_RenderTarget,LODBias=0,LODBias_Smaller=-1,LODBias_Smallest=-1,NumStreamedMips=-1,MipGenSettings=TMGS_SimpleAverage,MinLODSize=1,MaxLODSize=8192,MaxLODSize_Smaller=-1,MaxLODSize_Smallest=-1,OptionalLODBias=0,OptionalMaxLODSize=4096,MinMagFilter=\"aniso\",MipFilter=\"point\")\nTextureLODGroups=(Group=TEXTUREGROUP_MobileFlattened,LODBias=0,LODBias_Smaller=-1,LODBias_Smallest=-1,NumStreamedMips=-1,MipGenSettings=TMGS_SimpleAverage,MinLODSize=1,MaxLODSize=8192,MaxLODSize_Smaller=-1,MaxLODSize_Smallest=-1,OptionalLODBias=0,OptionalMaxLODSize=4096,MinMagFilter=\"aniso\",MipFilter=\"point\")\nTextureLODGroups=(Group=TEXTUREGROUP_ProcBuilding_Face,LODBias=0,LODBias_Smaller=-1,LODBias_Smallest=-1,NumStreamedMips=-1,MipGenSettings=TMGS_SimpleAverage,MinLODSize=1,MaxLODSize=4096,MaxLODSize_Smaller=-1,MaxLODSize_Smallest=-1,OptionalLODBias=0,OptionalMaxLODSize=4096,MinMagFilter=\"Aniso\",MipFilter=\"Point\")\nTextureLODGroups=(Group=TEXTUREGROUP_ProcBuilding_LightMap,LODBias=0,LODBias_Smaller=-1,LODBias_Smallest=-1,NumStreamedMips=-1,MipGenSettings=TMGS_SimpleAverage,MinLODSize=1,MaxLODSize=4096,MaxLODSize_Smaller=-1,MaxLODSize_Smallest=-1,OptionalLODBias=0,OptionalMaxLODSize=4096,MinMagFilter=\"Aniso\",MipFilter=\"Point\")\nTextureLODGroups=(Group=TEXTUREGROUP_Shadowmap,LODBias=0,LODBias_Smaller=-1,LODBias_Smallest=-1,NumStreamedMips=3,MipGenSettings=TMGS_SimpleAverage,MinLODSize=1,MaxLODSize=8192,MaxLODSize_Smaller=-1,MaxLODSize_Smallest=-1,OptionalLODBias=0,OptionalMaxLODSize=4096,MinMagFilter=\"aniso\",MipFilter=\"point\")\nTextureLODGroups=(Group=TEXTUREGROUP_ColorLookupTable,LODBias=0,LODBias_Smaller=-1,LODBias_Smallest=-1,NumStreamedMips=-1,MipGenSettings=TMGS_SimpleAverage,MinLODSize=1,MaxLODSize=4096,MaxLODSize_Smaller=-1,MaxLODSize_Smallest=-1,OptionalLODBias=0,OptionalMaxLODSize=4096,MinMagFilter=\"Aniso\",MipFilter=\"Point\")\nTextureLODGroups=(Group=TEXTUREGROUP_Terrain_Heightmap,LODBias=0,LODBias_Smaller=-1,LODBias_Smallest=-1,NumStreamedMips=-1,MipGenSettings=TMGS_SimpleAverage,MinLODSize=1,MaxLODSize=8192,MaxLODSize_Smaller=-1,MaxLODSize_Smallest=-1,OptionalLODBias=0,OptionalMaxLODSize=4096,MinMagFilter=\"aniso\",MipFilter=\"point\")\nTextureLODGroups=(Group=TEXTUREGROUP_Terrain_Weightmap,LODBias=0,LODBias_Smaller=-1,LODBias_Smallest=-1,NumStreamedMips=-1,MipGenSettings=TMGS_SimpleAverage,MinLODSize=1,MaxLODSize=8192,MaxLODSize_Smaller=-1,MaxLODSize_Smallest=-1,OptionalLODBias=0,OptionalMaxLODSize=4096,MinMagFilter=\"aniso\",MipFilter=\"point\")\nTextureLODGroups=(Group=TEXTUREGROUP_Bokeh,LODBias=0,LODBias_Smaller=-1,LODBias_Smallest=-1,NumStreamedMips=-1,MipGenSettings=TMGS_SimpleAverage,MinLODSize=1,MaxLODSize=256,MaxLODSize_Smaller=-1,MaxLODSize_Smallest=-1,OptionalLODBias=0,OptionalMaxLODSize=4096,MinMagFilter=\"linear\",MipFilter=\"linear\")\nTextureLODGroups=(Group=TEXTUREGROUP_IESLightProfile,LODBias=0,LODBias_Smaller=-1,LODBias_Smallest=-1,NumStreamedMips=-1,MipGenSettings=TMGS_SimpleAverage,MinLODSize=1,MaxLODSize=4096,MaxLODSize_Smaller=-1,MaxLODSize_Smallest=-1,OptionalLODBias=0,OptionalMaxLODSize=4096,MinMagFilter=\"Aniso\",MipFilter=\"Point\")\nTextureLODGroups=(Group=TEXTUREGROUP_Pixels2D,LODBias=0,LODBias_Smaller=-1,LODBias_Smallest=-1,NumStreamedMips=-1,MipGenSettings=TMGS_SimpleAverage,MinLODSize=1,MaxLODSize=8192,MaxLODSize_Smaller=-1,MaxLODSize_Smallest=-1,OptionalLODBias=0,OptionalMaxLODSize=4096,MinMagFilter=\"point\",MipFilter=\"point\")\nTextureLODGroups=(Group=TEXTUREGROUP_HierarchicalLOD,LODBias=0,LODBias_Smaller=-1,LODBias_Smallest=-1,NumStreamedMips=-1,MipGenSettings=TMGS_SimpleAverage,MinLODSize=1,MaxLODSize=4096,MaxLODSize_Smaller=-1,MaxLODSize_Smallest=-1,OptionalLODBias=0,OptionalMaxLODSize=4096,MinMagFilter=\"Aniso\",MipFilter=\"Point\")\nTextureLODGroups=(Group=TEXTUREGROUP_Impostor,LODBias=0,LODBias_Smaller=-1,LODBias_Smallest=-1,NumStreamedMips=-1,MipGenSettings=TMGS_SimpleAverage,MinLODSize=1,MaxLODSize=4096,MaxLODSize_Smaller=-1,MaxLODSize_Smallest=-1,OptionalLODBias=0,OptionalMaxLODSize=4096,MinMagFilter=\"Aniso\",MipFilter=\"Point\")\nTextureLODGroups=(Group=TEXTUREGROUP_ImpostorNormalDepth,LODBias=0,LODBias_Smaller=-1,LODBias_Smallest=-1,NumStreamedMips=-1,MipGenSettings=TMGS_SimpleAverage,MinLODSize=1,MaxLODSize=4096,MaxLODSize_Smaller=-1,MaxLODSize_Smallest=-1,OptionalLODBias=0,OptionalMaxLODSize=4096,MinMagFilter=\"Aniso\",MipFilter=\"Point\")\nTextureLODGroups=(Group=TEXTUREGROUP_Project01,LODBias=0,LODBias_Smaller=-1,LODBias_Smallest=-1,NumStreamedMips=-1,MipGenSettings=TMGS_SimpleAverage,MinLODSize=1,MaxLODSize=4096,MaxLODSize_Smaller=-1,MaxLODSize_Smallest=-1,OptionalLODBias=0,OptionalMaxLODSize=4096,MinMagFilter=\"Aniso\",MipFilter=\"Point\")\nTextureLODGroups=(Group=TEXTUREGROUP_Project02,LODBias=0,LODBias_Smaller=-1,LODBias_Smallest=-1,NumStreamedMips=-1,MipGenSettings=TMGS_SimpleAverage,MinLODSize=1,MaxLODSize=4096,MaxLODSize_Smaller=-1,MaxLODSize_Smallest=-1,OptionalLODBias=0,OptionalMaxLODSize=4096,MinMagFilter=\"Aniso\",MipFilter=\"Point\")\nTextureLODGroups=(Group=TEXTUREGROUP_Project03,LODBias=0,LODBias_Smaller=-1,LODBias_Smallest=-1,NumStreamedMips=-1,MipGenSettings=TMGS_SimpleAverage,MinLODSize=1,MaxLODSize=4096,MaxLODSize_Smaller=-1,MaxLODSize_Smallest=-1,OptionalLODBias=0,OptionalMaxLODSize=4096,MinMagFilter=\"Aniso\",MipFilter=\"Point\")\nTextureLODGroups=(Group=TEXTUREGROUP_Project04,LODBias=0,LODBias_Smaller=-1,LODBias_Smallest=-1,NumStreamedMips=-1,MipGenSettings=TMGS_SimpleAverage,MinLODSize=1,MaxLODSize=4096,MaxLODSize_Smaller=-1,MaxLODSize_Smallest=-1,OptionalLODBias=0,OptionalMaxLODSize=4096,MinMagFilter=\"Aniso\",MipFilter=\"Point\")\nTextureLODGroups=(Group=TEXTUREGROUP_Project05,LODBias=0,LODBias_Smaller=-1,LODBias_Smallest=-1,NumStreamedMips=-1,MipGenSettings=TMGS_SimpleAverage,MinLODSize=1,MaxLODSize=4096,MaxLODSize_Smaller=-1,MaxLODSize_Smallest=-1,OptionalLODBias=0,OptionalMaxLODSize=4096,MinMagFilter=\"Aniso\",MipFilter=\"Point\")\nTextureLODGroups=(Group=TEXTUREGROUP_Project06,LODBias=0,LODBias_Smaller=-1,LODBias_Smallest=-1,NumStreamedMips=-1,MipGenSettings=TMGS_SimpleAverage,MinLODSize=1,MaxLODSize=4096,MaxLODSize_Smaller=-1,MaxLODSize_Smallest=-1,OptionalLODBias=0,OptionalMaxLODSize=4096,MinMagFilter=\"Aniso\",MipFilter=\"Point\")\nTextureLODGroups=(Group=TEXTUREGROUP_Project07,LODBias=0,LODBias_Smaller=-1,LODBias_Smallest=-1,NumStreamedMips=-1,MipGenSettings=TMGS_SimpleAverage,MinLODSize=1,MaxLODSize=4096,MaxLODSize_Smaller=-1,MaxLODSize_Smallest=-1,OptionalLODBias=0,OptionalMaxLODSize=4096,MinMagFilter=\"Aniso\",MipFilter=\"Point\")\nTextureLODGroups=(Group=TEXTUREGROUP_Project08,LODBias=0,LODBias_Smaller=-1,LODBias_Smallest=-1,NumStreamedMips=-1,MipGenSettings=TMGS_SimpleAverage,MinLODSize=1,MaxLODSize=4096,MaxLODSize_Smaller=-1,MaxLODSize_Smallest=-1,OptionalLODBias=0,OptionalMaxLODSize=4096,MinMagFilter=\"Aniso\",MipFilter=\"Point\")\nTextureLODGroups=(Group=TEXTUREGROUP_Project09,LODBias=0,LODBias_Smaller=-1,LODBias_Smallest=-1,NumStreamedMips=-1,MipGenSettings=TMGS_SimpleAverage,MinLODSize=1,MaxLODSize=4096,MaxLODSize_Smaller=-1,MaxLODSize_Smallest=-1,OptionalLODBias=0,OptionalMaxLODSize=4096,MinMagFilter=\"Aniso\",MipFilter=\"Point\")\nTextureLODGroups=(Group=TEXTUREGROUP_Project10,LODBias=0,LODBias_Smaller=-1,LODBias_Smallest=-1,NumStreamedMips=-1,MipGenSettings=TMGS_SimpleAverage,MinLODSize=1,MaxLODSize=4096,MaxLODSize_Smaller=-1,MaxLODSize_Smallest=-1,OptionalLODBias=0,OptionalMaxLODSize=4096,MinMagFilter=\"Aniso\",MipFilter=\"Point\")\n\n[XboxOne_S DeviceProfile]\nDeviceType=XboxOne\nBaseProfileName=XboxOne\nTextureLODGroups=(Group=TEXTUREGROUP_World,LODBias=0,LODBias_Smaller=-1,LODBias_Smallest=-1,NumStreamedMips=-1,MipGenSettings=TMGS_SimpleAverage,MinLODSize=1,MaxLODSize=8192,MaxLODSize_Smaller=-1,MaxLODSize_Smallest=-1,OptionalLODBias=0,OptionalMaxLODSize=4096,MinMagFilter=\"aniso\",MipFilter=\"point\")\nTextureLODGroups=(Group=TEXTUREGROUP_WorldNormalMap,LODBias=0,LODBias_Smaller=-1,LODBias_Smallest=-1,NumStreamedMips=-1,MipGenSettings=TMGS_SimpleAverage,MinLODSize=1,MaxLODSize=8192,MaxLODSize_Smaller=-1,MaxLODSize_Smallest=-1,OptionalLODBias=0,OptionalMaxLODSize=4096,MinMagFilter=\"aniso\",MipFilter=\"point\")\nTextureLODGroups=(Group=TEXTUREGROUP_WorldSpecular,LODBias=0,LODBias_Smaller=-1,LODBias_Smallest=-1,NumStreamedMips=-1,MipGenSettings=TMGS_SimpleAverage,MinLODSize=1,MaxLODSize=8192,MaxLODSize_Smaller=-1,MaxLODSize_Smallest=-1,OptionalLODBias=0,OptionalMaxLODSize=4096,MinMagFilter=\"aniso\",MipFilter=\"point\")\nTextureLODGroups=(Group=TEXTUREGROUP_Character,LODBias=0,LODBias_Smaller=-1,LODBias_Smallest=-1,NumStreamedMips=-1,MipGenSettings=TMGS_SimpleAverage,MinLODSize=1,MaxLODSize=8192,MaxLODSize_Smaller=-1,MaxLODSize_Smallest=-1,OptionalLODBias=0,OptionalMaxLODSize=4096,MinMagFilter=\"aniso\",MipFilter=\"point\")\nTextureLODGroups=(Group=TEXTUREGROUP_CharacterNormalMap,LODBias=0,LODBias_Smaller=-1,LODBias_Smallest=-1,NumStreamedMips=-1,MipGenSettings=TMGS_SimpleAverage,MinLODSize=1,MaxLODSize=8192,MaxLODSize_Smaller=-1,MaxLODSize_Smallest=-1,OptionalLODBias=0,OptionalMaxLODSize=4096,MinMagFilter=\"aniso\",MipFilter=\"point\")\nTextureLODGroups=(Group=TEXTUREGROUP_CharacterSpecular,LODBias=0,LODBias_Smaller=-1,LODBias_Smallest=-1,NumStreamedMips=-1,MipGenSettings=TMGS_SimpleAverage,MinLODSize=1,MaxLODSize=8192,MaxLODSize_Smaller=-1,MaxLODSize_Smallest=-1,OptionalLODBias=0,OptionalMaxLODSize=4096,MinMagFilter=\"aniso\",MipFilter=\"point\")\nTextureLODGroups=(Group=TEXTUREGROUP_Weapon,LODBias=0,LODBias_Smaller=-1,LODBias_Smallest=-1,NumStreamedMips=-1,MipGenSettings=TMGS_SimpleAverage,MinLODSize=1,MaxLODSize=8192,MaxLODSize_Smaller=-1,MaxLODSize_Smallest=-1,OptionalLODBias=0,OptionalMaxLODSize=4096,MinMagFilter=\"aniso\",MipFilter=\"point\")\nTextureLODGroups=(Group=TEXTUREGROUP_WeaponNormalMap,LODBias=0,LODBias_Smaller=-1,LODBias_Smallest=-1,NumStreamedMips=-1,MipGenSettings=TMGS_SimpleAverage,MinLODSize=1,MaxLODSize=8192,MaxLODSize_Smaller=-1,MaxLODSize_Smallest=-1,OptionalLODBias=0,OptionalMaxLODSize=4096,MinMagFilter=\"aniso\",MipFilter=\"point\")\nTextureLODGroups=(Group=TEXTUREGROUP_WeaponSpecular,LODBias=0,LODBias_Smaller=-1,LODBias_Smallest=-1,NumStreamedMips=-1,MipGenSettings=TMGS_SimpleAverage,MinLODSize=1,MaxLODSize=8192,MaxLODSize_Smaller=-1,MaxLODSize_Smallest=-1,OptionalLODBias=0,OptionalMaxLODSize=4096,MinMagFilter=\"aniso\",MipFilter=\"point\")\nTextureLODGroups=(Group=TEXTUREGROUP_Vehicle,LODBias=0,LODBias_Smaller=-1,LODBias_Smallest=-1,NumStreamedMips=-1,MipGenSettings=TMGS_SimpleAverage,MinLODSize=1,MaxLODSize=8192,MaxLODSize_Smaller=-1,MaxLODSize_Smallest=-1,OptionalLODBias=0,OptionalMaxLODSize=4096,MinMagFilter=\"aniso\",MipFilter=\"point\")\nTextureLODGroups=(Group=TEXTUREGROUP_VehicleNormalMap,LODBias=0,LODBias_Smaller=-1,LODBias_Smallest=-1,NumStreamedMips=-1,MipGenSettings=TMGS_SimpleAverage,MinLODSize=1,MaxLODSize=8192,MaxLODSize_Smaller=-1,MaxLODSize_Smallest=-1,OptionalLODBias=0,OptionalMaxLODSize=4096,MinMagFilter=\"aniso\",MipFilter=\"point\")\nTextureLODGroups=(Group=TEXTUREGROUP_VehicleSpecular,LODBias=0,LODBias_Smaller=-1,LODBias_Smallest=-1,NumStreamedMips=-1,MipGenSettings=TMGS_SimpleAverage,MinLODSize=1,MaxLODSize=8192,MaxLODSize_Smaller=-1,MaxLODSize_Smallest=-1,OptionalLODBias=0,OptionalMaxLODSize=4096,MinMagFilter=\"aniso\",MipFilter=\"point\")\nTextureLODGroups=(Group=TEXTUREGROUP_Cinematic,LODBias=0,LODBias_Smaller=-1,LODBias_Smallest=-1,NumStreamedMips=-1,MipGenSettings=TMGS_SimpleAverage,MinLODSize=1,MaxLODSize=8192,MaxLODSize_Smaller=-1,MaxLODSize_Smallest=-1,OptionalLODBias=0,OptionalMaxLODSize=4096,MinMagFilter=\"aniso\",MipFilter=\"point\")\nTextureLODGroups=(Group=TEXTUREGROUP_Effects,LODBias=0,LODBias_Smaller=-1,LODBias_Smallest=-1,NumStreamedMips=-1,MipGenSettings=TMGS_SimpleAverage,MinLODSize=1,MaxLODSize=8192,MaxLODSize_Smaller=-1,MaxLODSize_Smallest=-1,OptionalLODBias=0,OptionalMaxLODSize=4096,MinMagFilter=\"linear\",MipFilter=\"point\")\nTextureLODGroups=(Group=TEXTUREGROUP_EffectsNotFiltered,LODBias=0,LODBias_Smaller=-1,LODBias_Smallest=-1,NumStreamedMips=-1,MipGenSettings=TMGS_SimpleAverage,MinLODSize=1,MaxLODSize=8192,MaxLODSize_Smaller=-1,MaxLODSize_Smallest=-1,OptionalLODBias=0,OptionalMaxLODSize=4096,MinMagFilter=\"aniso\",MipFilter=\"point\")\nTextureLODGroups=(Group=TEXTUREGROUP_Skybox,LODBias=0,LODBias_Smaller=-1,LODBias_Smallest=-1,NumStreamedMips=-1,MipGenSettings=TMGS_SimpleAverage,MinLODSize=1,MaxLODSize=8192,MaxLODSize_Smaller=-1,MaxLODSize_Smallest=-1,OptionalLODBias=0,OptionalMaxLODSize=4096,MinMagFilter=\"aniso\",MipFilter=\"point\")\nTextureLODGroups=(Group=TEXTUREGROUP_UI,LODBias=0,LODBias_Smaller=-1,LODBias_Smallest=-1,NumStreamedMips=-1,MipGenSettings=TMGS_NoMipmaps,MinLODSize=1,MaxLODSize=8192,MaxLODSize_Smaller=-1,MaxLODSize_Smallest=-1,OptionalLODBias=0,OptionalMaxLODSize=4096,MinMagFilter=\"aniso\",MipFilter=\"point\")\nTextureLODGroups=(Group=TEXTUREGROUP_Lightmap,LODBias=0,LODBias_Smaller=-1,LODBias_Smallest=-1,NumStreamedMips=-1,MipGenSettings=TMGS_SimpleAverage,MinLODSize=1,MaxLODSize=8192,MaxLODSize_Smaller=-1,MaxLODSize_Smallest=-1,OptionalLODBias=0,OptionalMaxLODSize=4096,MinMagFilter=\"aniso\",MipFilter=\"point\")\nTextureLODGroups=(Group=TEXTUREGROUP_RenderTarget,LODBias=0,LODBias_Smaller=-1,LODBias_Smallest=-1,NumStreamedMips=-1,MipGenSettings=TMGS_SimpleAverage,MinLODSize=1,MaxLODSize=8192,MaxLODSize_Smaller=-1,MaxLODSize_Smallest=-1,OptionalLODBias=0,OptionalMaxLODSize=4096,MinMagFilter=\"aniso\",MipFilter=\"point\")\nTextureLODGroups=(Group=TEXTUREGROUP_MobileFlattened,LODBias=0,LODBias_Smaller=-1,LODBias_Smallest=-1,NumStreamedMips=-1,MipGenSettings=TMGS_SimpleAverage,MinLODSize=1,MaxLODSize=8192,MaxLODSize_Smaller=-1,MaxLODSize_Smallest=-1,OptionalLODBias=0,OptionalMaxLODSize=4096,MinMagFilter=\"aniso\",MipFilter=\"point\")\nTextureLODGroups=(Group=TEXTUREGROUP_ProcBuilding_Face,LODBias=0,LODBias_Smaller=-1,LODBias_Smallest=-1,NumStreamedMips=-1,MipGenSettings=TMGS_SimpleAverage,MinLODSize=1,MaxLODSize=4096,MaxLODSize_Smaller=-1,MaxLODSize_Smallest=-1,OptionalLODBias=0,OptionalMaxLODSize=4096,MinMagFilter=\"Aniso\",MipFilter=\"Point\")\nTextureLODGroups=(Group=TEXTUREGROUP_ProcBuilding_LightMap,LODBias=0,LODBias_Smaller=-1,LODBias_Smallest=-1,NumStreamedMips=-1,MipGenSettings=TMGS_SimpleAverage,MinLODSize=1,MaxLODSize=4096,MaxLODSize_Smaller=-1,MaxLODSize_Smallest=-1,OptionalLODBias=0,OptionalMaxLODSize=4096,MinMagFilter=\"Aniso\",MipFilter=\"Point\")\nTextureLODGroups=(Group=TEXTUREGROUP_Shadowmap,LODBias=0,LODBias_Smaller=-1,LODBias_Smallest=-1,NumStreamedMips=3,MipGenSettings=TMGS_SimpleAverage,MinLODSize=1,MaxLODSize=8192,MaxLODSize_Smaller=-1,MaxLODSize_Smallest=-1,OptionalLODBias=0,OptionalMaxLODSize=4096,MinMagFilter=\"aniso\",MipFilter=\"point\")\nTextureLODGroups=(Group=TEXTUREGROUP_ColorLookupTable,LODBias=0,LODBias_Smaller=-1,LODBias_Smallest=-1,NumStreamedMips=-1,MipGenSettings=TMGS_SimpleAverage,MinLODSize=1,MaxLODSize=4096,MaxLODSize_Smaller=-1,MaxLODSize_Smallest=-1,OptionalLODBias=0,OptionalMaxLODSize=4096,MinMagFilter=\"Aniso\",MipFilter=\"Point\")\nTextureLODGroups=(Group=TEXTUREGROUP_Terrain_Heightmap,LODBias=0,LODBias_Smaller=-1,LODBias_Smallest=-1,NumStreamedMips=-1,MipGenSettings=TMGS_SimpleAverage,MinLODSize=1,MaxLODSize=8192,MaxLODSize_Smaller=-1,MaxLODSize_Smallest=-1,OptionalLODBias=0,OptionalMaxLODSize=4096,MinMagFilter=\"aniso\",MipFilter=\"point\")\nTextureLODGroups=(Group=TEXTUREGROUP_Terrain_Weightmap,LODBias=0,LODBias_Smaller=-1,LODBias_Smallest=-1,NumStreamedMips=-1,MipGenSettings=TMGS_SimpleAverage,MinLODSize=1,MaxLODSize=8192,MaxLODSize_Smaller=-1,MaxLODSize_Smallest=-1,OptionalLODBias=0,OptionalMaxLODSize=4096,MinMagFilter=\"aniso\",MipFilter=\"point\")\nTextureLODGroups=(Group=TEXTUREGROUP_Bokeh,LODBias=0,LODBias_Smaller=-1,LODBias_Smallest=-1,NumStreamedMips=-1,MipGenSettings=TMGS_SimpleAverage,MinLODSize=1,MaxLODSize=256,MaxLODSize_Smaller=-1,MaxLODSize_Smallest=-1,OptionalLODBias=0,OptionalMaxLODSize=4096,MinMagFilter=\"linear\",MipFilter=\"linear\")\nTextureLODGroups=(Group=TEXTUREGROUP_IESLightProfile,LODBias=0,LODBias_Smaller=-1,LODBias_Smallest=-1,NumStreamedMips=-1,MipGenSettings=TMGS_SimpleAverage,MinLODSize=1,MaxLODSize=4096,MaxLODSize_Smaller=-1,MaxLODSize_Smallest=-1,OptionalLODBias=0,OptionalMaxLODSize=4096,MinMagFilter=\"Aniso\",MipFilter=\"Point\")\nTextureLODGroups=(Group=TEXTUREGROUP_Pixels2D,LODBias=0,LODBias_Smaller=-1,LODBias_Smallest=-1,NumStreamedMips=-1,MipGenSettings=TMGS_SimpleAverage,MinLODSize=1,MaxLODSize=8192,MaxLODSize_Smaller=-1,MaxLODSize_Smallest=-1,OptionalLODBias=0,OptionalMaxLODSize=4096,MinMagFilter=\"point\",MipFilter=\"point\")\nTextureLODGroups=(Group=TEXTUREGROUP_HierarchicalLOD,LODBias=0,LODBias_Smaller=-1,LODBias_Smallest=-1,NumStreamedMips=-1,MipGenSettings=TMGS_SimpleAverage,MinLODSize=1,MaxLODSize=4096,MaxLODSize_Smaller=-1,MaxLODSize_Smallest=-1,OptionalLODBias=0,OptionalMaxLODSize=4096,MinMagFilter=\"Aniso\",MipFilter=\"Point\")\nTextureLODGroups=(Group=TEXTUREGROUP_Impostor,LODBias=0,LODBias_Smaller=-1,LODBias_Smallest=-1,NumStreamedMips=-1,MipGenSettings=TMGS_SimpleAverage,MinLODSize=1,MaxLODSize=4096,MaxLODSize_Smaller=-1,MaxLODSize_Smallest=-1,OptionalLODBias=0,OptionalMaxLODSize=4096,MinMagFilter=\"Aniso\",MipFilter=\"Point\")\nTextureLODGroups=(Group=TEXTUREGROUP_ImpostorNormalDepth,LODBias=0,LODBias_Smaller=-1,LODBias_Smallest=-1,NumStreamedMips=-1,MipGenSettings=TMGS_SimpleAverage,MinLODSize=1,MaxLODSize=4096,MaxLODSize_Smaller=-1,MaxLODSize_Smallest=-1,OptionalLODBias=0,OptionalMaxLODSize=4096,MinMagFilter=\"Aniso\",MipFilter=\"Point\")\nTextureLODGroups=(Group=TEXTUREGROUP_Project01,LODBias=0,LODBias_Smaller=-1,LODBias_Smallest=-1,NumStreamedMips=-1,MipGenSettings=TMGS_SimpleAverage,MinLODSize=1,MaxLODSize=4096,MaxLODSize_Smaller=-1,MaxLODSize_Smallest=-1,OptionalLODBias=0,OptionalMaxLODSize=4096,MinMagFilter=\"Aniso\",MipFilter=\"Point\")\nTextureLODGroups=(Group=TEXTUREGROUP_Project02,LODBias=0,LODBias_Smaller=-1,LODBias_Smallest=-1,NumStreamedMips=-1,MipGenSettings=TMGS_SimpleAverage,MinLODSize=1,MaxLODSize=4096,MaxLODSize_Smaller=-1,MaxLODSize_Smallest=-1,OptionalLODBias=0,OptionalMaxLODSize=4096,MinMagFilter=\"Aniso\",MipFilter=\"Point\")\nTextureLODGroups=(Group=TEXTUREGROUP_Project03,LODBias=0,LODBias_Smaller=-1,LODBias_Smallest=-1,NumStreamedMips=-1,MipGenSettings=TMGS_SimpleAverage,MinLODSize=1,MaxLODSize=4096,MaxLODSize_Smaller=-1,MaxLODSize_Smallest=-1,OptionalLODBias=0,OptionalMaxLODSize=4096,MinMagFilter=\"Aniso\",MipFilter=\"Point\")\nTextureLODGroups=(Group=TEXTUREGROUP_Project04,LODBias=0,LODBias_Smaller=-1,LODBias_Smallest=-1,NumStreamedMips=-1,MipGenSettings=TMGS_SimpleAverage,MinLODSize=1,MaxLODSize=4096,MaxLODSize_Smaller=-1,MaxLODSize_Smallest=-1,OptionalLODBias=0,OptionalMaxLODSize=4096,MinMagFilter=\"Aniso\",MipFilter=\"Point\")\nTextureLODGroups=(Group=TEXTUREGROUP_Project05,LODBias=0,LODBias_Smaller=-1,LODBias_Smallest=-1,NumStreamedMips=-1,MipGenSettings=TMGS_SimpleAverage,MinLODSize=1,MaxLODSize=4096,MaxLODSize_Smaller=-1,MaxLODSize_Smallest=-1,OptionalLODBias=0,OptionalMaxLODSize=4096,MinMagFilter=\"Aniso\",MipFilter=\"Point\")\nTextureLODGroups=(Group=TEXTUREGROUP_Project06,LODBias=0,LODBias_Smaller=-1,LODBias_Smallest=-1,NumStreamedMips=-1,MipGenSettings=TMGS_SimpleAverage,MinLODSize=1,MaxLODSize=4096,MaxLODSize_Smaller=-1,MaxLODSize_Smallest=-1,OptionalLODBias=0,OptionalMaxLODSize=4096,MinMagFilter=\"Aniso\",MipFilter=\"Point\")\nTextureLODGroups=(Group=TEXTUREGROUP_Project07,LODBias=0,LODBias_Smaller=-1,LODBias_Smallest=-1,NumStreamedMips=-1,MipGenSettings=TMGS_SimpleAverage,MinLODSize=1,MaxLODSize=4096,MaxLODSize_Smaller=-1,MaxLODSize_Smallest=-1,OptionalLODBias=0,OptionalMaxLODSize=4096,MinMagFilter=\"Aniso\",MipFilter=\"Point\")\nTextureLODGroups=(Group=TEXTUREGROUP_Project08,LODBias=0,LODBias_Smaller=-1,LODBias_Smallest=-1,NumStreamedMips=-1,MipGenSettings=TMGS_SimpleAverage,MinLODSize=1,MaxLODSize=4096,MaxLODSize_Smaller=-1,MaxLODSize_Smallest=-1,OptionalLODBias=0,OptionalMaxLODSize=4096,MinMagFilter=\"Aniso\",MipFilter=\"Point\")\nTextureLODGroups=(Group=TEXTUREGROUP_Project09,LODBias=0,LODBias_Smaller=-1,LODBias_Smallest=-1,NumStreamedMips=-1,MipGenSettings=TMGS_SimpleAverage,MinLODSize=1,MaxLODSize=4096,MaxLODSize_Smaller=-1,MaxLODSize_Smallest=-1,OptionalLODBias=0,OptionalMaxLODSize=4096,MinMagFilter=\"Aniso\",MipFilter=\"Point\")\nTextureLODGroups=(Group=TEXTUREGROUP_Project10,LODBias=0,LODBias_Smaller=-1,LODBias_Smallest=-1,NumStreamedMips=-1,MipGenSettings=TMGS_SimpleAverage,MinLODSize=1,MaxLODSize=4096,MaxLODSize_Smaller=-1,MaxLODSize_Smallest=-1,OptionalLODBias=0,OptionalMaxLODSize=4096,MinMagFilter=\"Aniso\",MipFilter=\"Point\")\n+CVars=sg.ViewDistanceQuality=2\n+CVars=sg.AntiAliasingQuality=2\n+CVars=sg.ShadowQuality=2\n+CVars=sg.PostProcessQuality=2\n+CVars=sg.EffectsQuality=1\n+CVars=r.AmbientOcclusionLevels=1\n+CVars=r.EmitterSpawnRateScale=1\n[XboxOne_Scorpio DeviceProfile]\nDeviceType=XboxOne\nBaseProfileName=XboxOne_S\nCVars=r.screenpercentage=100\nCVars=xboxone.DPIScaleFactor=2.0\nTextureLODGroups=(Group=TEXTUREGROUP_World,LODBias=0,LODBias_Smaller=-1,LODBias_Smallest=-1,NumStreamedMips=-1,MipGenSettings=TMGS_SimpleAverage,MinLODSize=1,MaxLODSize=8192,MaxLODSize_Smaller=-1,MaxLODSize_Smallest=-1,OptionalLODBias=0,OptionalMaxLODSize=4096,MinMagFilter=\"aniso\",MipFilter=\"point\")\nTextureLODGroups=(Group=TEXTUREGROUP_WorldNormalMap,LODBias=0,LODBias_Smaller=-1,LODBias_Smallest=-1,NumStreamedMips=-1,MipGenSettings=TMGS_SimpleAverage,MinLODSize=1,MaxLODSize=8192,MaxLODSize_Smaller=-1,MaxLODSize_Smallest=-1,OptionalLODBias=0,OptionalMaxLODSize=4096,MinMagFilter=\"aniso\",MipFilter=\"point\")\nTextureLODGroups=(Group=TEXTUREGROUP_WorldSpecular,LODBias=0,LODBias_Smaller=-1,LODBias_Smallest=-1,NumStreamedMips=-1,MipGenSettings=TMGS_SimpleAverage,MinLODSize=1,MaxLODSize=8192,MaxLODSize_Smaller=-1,MaxLODSize_Smallest=-1,OptionalLODBias=0,OptionalMaxLODSize=4096,MinMagFilter=\"aniso\",MipFilter=\"point\")\nTextureLODGroups=(Group=TEXTUREGROUP_Character,LODBias=0,LODBias_Smaller=-1,LODBias_Smallest=-1,NumStreamedMips=-1,MipGenSettings=TMGS_SimpleAverage,MinLODSize=1,MaxLODSize=8192,MaxLODSize_Smaller=-1,MaxLODSize_Smallest=-1,OptionalLODBias=0,OptionalMaxLODSize=4096,MinMagFilter=\"aniso\",MipFilter=\"point\")\nTextureLODGroups=(Group=TEXTUREGROUP_CharacterNormalMap,LODBias=0,LODBias_Smaller=-1,LODBias_Smallest=-1,NumStreamedMips=-1,MipGenSettings=TMGS_SimpleAverage,MinLODSize=1,MaxLODSize=8192,MaxLODSize_Smaller=-1,MaxLODSize_Smallest=-1,OptionalLODBias=0,OptionalMaxLODSize=4096,MinMagFilter=\"aniso\",MipFilter=\"point\")\nTextureLODGroups=(Group=TEXTUREGROUP_CharacterSpecular,LODBias=0,LODBias_Smaller=-1,LODBias_Smallest=-1,NumStreamedMips=-1,MipGenSettings=TMGS_SimpleAverage,MinLODSize=1,MaxLODSize=8192,MaxLODSize_Smaller=-1,MaxLODSize_Smallest=-1,OptionalLODBias=0,OptionalMaxLODSize=4096,MinMagFilter=\"aniso\",MipFilter=\"point\")\nTextureLODGroups=(Group=TEXTUREGROUP_Weapon,LODBias=0,LODBias_Smaller=-1,LODBias_Smallest=-1,NumStreamedMips=-1,MipGenSettings=TMGS_SimpleAverage,MinLODSize=1,MaxLODSize=8192,MaxLODSize_Smaller=-1,MaxLODSize_Smallest=-1,OptionalLODBias=0,OptionalMaxLODSize=4096,MinMagFilter=\"aniso\",MipFilter=\"point\")\nTextureLODGroups=(Group=TEXTUREGROUP_WeaponNormalMap,LODBias=0,LODBias_Smaller=-1,LODBias_Smallest=-1,NumStreamedMips=-1,MipGenSettings=TMGS_SimpleAverage,MinLODSize=1,MaxLODSize=8192,MaxLODSize_Smaller=-1,MaxLODSize_Smallest=-1,OptionalLODBias=0,OptionalMaxLODSize=4096,MinMagFilter=\"aniso\",MipFilter=\"point\")\nTextureLODGroups=(Group=TEXTUREGROUP_WeaponSpecular,LODBias=0,LODBias_Smaller=-1,LODBias_Smallest=-1,NumStreamedMips=-1,MipGenSettings=TMGS_SimpleAverage,MinLODSize=1,MaxLODSize=8192,MaxLODSize_Smaller=-1,MaxLODSize_Smallest=-1,OptionalLODBias=0,OptionalMaxLODSize=4096,MinMagFilter=\"aniso\",MipFilter=\"point\")\nTextureLODGroups=(Group=TEXTUREGROUP_Vehicle,LODBias=0,LODBias_Smaller=-1,LODBias_Smallest=-1,NumStreamedMips=-1,MipGenSettings=TMGS_SimpleAverage,MinLODSize=1,MaxLODSize=8192,MaxLODSize_Smaller=-1,MaxLODSize_Smallest=-1,OptionalLODBias=0,OptionalMaxLODSize=4096,MinMagFilter=\"aniso\",MipFilter=\"point\")\nTextureLODGroups=(Group=TEXTUREGROUP_VehicleNormalMap,LODBias=0,LODBias_Smaller=-1,LODBias_Smallest=-1,NumStreamedMips=-1,MipGenSettings=TMGS_SimpleAverage,MinLODSize=1,MaxLODSize=8192,MaxLODSize_Smaller=-1,MaxLODSize_Smallest=-1,OptionalLODBias=0,OptionalMaxLODSize=4096,MinMagFilter=\"aniso\",MipFilter=\"point\")\nTextureLODGroups=(Group=TEXTUREGROUP_VehicleSpecular,LODBias=0,LODBias_Smaller=-1,LODBias_Smallest=-1,NumStreamedMips=-1,MipGenSettings=TMGS_SimpleAverage,MinLODSize=1,MaxLODSize=8192,MaxLODSize_Smaller=-1,MaxLODSize_Smallest=-1,OptionalLODBias=0,OptionalMaxLODSize=4096,MinMagFilter=\"aniso\",MipFilter=\"point\")\nTextureLODGroups=(Group=TEXTUREGROUP_Cinematic,LODBias=0,LODBias_Smaller=-1,LODBias_Smallest=-1,NumStreamedMips=-1,MipGenSettings=TMGS_SimpleAverage,MinLODSize=1,MaxLODSize=8192,MaxLODSize_Smaller=-1,MaxLODSize_Smallest=-1,OptionalLODBias=0,OptionalMaxLODSize=4096,MinMagFilter=\"aniso\",MipFilter=\"point\")\nTextureLODGroups=(Group=TEXTUREGROUP_Effects,LODBias=0,LODBias_Smaller=-1,LODBias_Smallest=-1,NumStreamedMips=-1,MipGenSettings=TMGS_SimpleAverage,MinLODSize=1,MaxLODSize=8192,MaxLODSize_Smaller=-1,MaxLODSize_Smallest=-1,OptionalLODBias=0,OptionalMaxLODSize=4096,MinMagFilter=\"linear\",MipFilter=\"point\")\nTextureLODGroups=(Group=TEXTUREGROUP_EffectsNotFiltered,LODBias=0,LODBias_Smaller=-1,LODBias_Smallest=-1,NumStreamedMips=-1,MipGenSettings=TMGS_SimpleAverage,MinLODSize=1,MaxLODSize=8192,MaxLODSize_Smaller=-1,MaxLODSize_Smallest=-1,OptionalLODBias=0,OptionalMaxLODSize=4096,MinMagFilter=\"aniso\",MipFilter=\"point\")\nTextureLODGroups=(Group=TEXTUREGROUP_Skybox,LODBias=0,LODBias_Smaller=-1,LODBias_Smallest=-1,NumStreamedMips=-1,MipGenSettings=TMGS_SimpleAverage,MinLODSize=1,MaxLODSize=8192,MaxLODSize_Smaller=-1,MaxLODSize_Smallest=-1,OptionalLODBias=0,OptionalMaxLODSize=4096,MinMagFilter=\"aniso\",MipFilter=\"point\")\nTextureLODGroups=(Group=TEXTUREGROUP_UI,LODBias=0,LODBias_Smaller=-1,LODBias_Smallest=-1,NumStreamedMips=-1,MipGenSettings=TMGS_NoMipmaps,MinLODSize=1,MaxLODSize=8192,MaxLODSize_Smaller=-1,MaxLODSize_Smallest=-1,OptionalLODBias=0,OptionalMaxLODSize=4096,MinMagFilter=\"aniso\",MipFilter=\"point\")\nTextureLODGroups=(Group=TEXTUREGROUP_Lightmap,LODBias=0,LODBias_Smaller=-1,LODBias_Smallest=-1,NumStreamedMips=-1,MipGenSettings=TMGS_SimpleAverage,MinLODSize=1,MaxLODSize=8192,MaxLODSize_Smaller=-1,MaxLODSize_Smallest=-1,OptionalLODBias=0,OptionalMaxLODSize=4096,MinMagFilter=\"aniso\",MipFilter=\"point\")\nTextureLODGroups=(Group=TEXTUREGROUP_RenderTarget,LODBias=0,LODBias_Smaller=-1,LODBias_Smallest=-1,NumStreamedMips=-1,MipGenSettings=TMGS_SimpleAverage,MinLODSize=1,MaxLODSize=8192,MaxLODSize_Smaller=-1,MaxLODSize_Smallest=-1,OptionalLODBias=0,OptionalMaxLODSize=4096,MinMagFilter=\"aniso\",MipFilter=\"point\")\nTextureLODGroups=(Group=TEXTUREGROUP_MobileFlattened,LODBias=0,LODBias_Smaller=-1,LODBias_Smallest=-1,NumStreamedMips=-1,MipGenSettings=TMGS_SimpleAverage,MinLODSize=1,MaxLODSize=8192,MaxLODSize_Smaller=-1,MaxLODSize_Smallest=-1,OptionalLODBias=0,OptionalMaxLODSize=4096,MinMagFilter=\"aniso\",MipFilter=\"point\")\nTextureLODGroups=(Group=TEXTUREGROUP_ProcBuilding_Face,LODBias=0,LODBias_Smaller=-1,LODBias_Smallest=-1,NumStreamedMips=-1,MipGenSettings=TMGS_SimpleAverage,MinLODSize=1,MaxLODSize=4096,MaxLODSize_Smaller=-1,MaxLODSize_Smallest=-1,OptionalLODBias=0,OptionalMaxLODSize=4096,MinMagFilter=\"Aniso\",MipFilter=\"Point\")\nTextureLODGroups=(Group=TEXTUREGROUP_ProcBuilding_LightMap,LODBias=0,LODBias_Smaller=-1,LODBias_Smallest=-1,NumStreamedMips=-1,MipGenSettings=TMGS_SimpleAverage,MinLODSize=1,MaxLODSize=4096,MaxLODSize_Smaller=-1,MaxLODSize_Smallest=-1,OptionalLODBias=0,OptionalMaxLODSize=4096,MinMagFilter=\"Aniso\",MipFilter=\"Point\")\nTextureLODGroups=(Group=TEXTUREGROUP_Shadowmap,LODBias=0,LODBias_Smaller=-1,LODBias_Smallest=-1,NumStreamedMips=3,MipGenSettings=TMGS_SimpleAverage,MinLODSize=1,MaxLODSize=8192,MaxLODSize_Smaller=-1,MaxLODSize_Smallest=-1,OptionalLODBias=0,OptionalMaxLODSize=4096,MinMagFilter=\"aniso\",MipFilter=\"point\")\nTextureLODGroups=(Group=TEXTUREGROUP_ColorLookupTable,LODBias=0,LODBias_Smaller=-1,LODBias_Smallest=-1,NumStreamedMips=-1,MipGenSettings=TMGS_SimpleAverage,MinLODSize=1,MaxLODSize=4096,MaxLODSize_Smaller=-1,MaxLODSize_Smallest=-1,OptionalLODBias=0,OptionalMaxLODSize=4096,MinMagFilter=\"Aniso\",MipFilter=\"Point\")\nTextureLODGroups=(Group=TEXTUREGROUP_Terrain_Heightmap,LODBias=0,LODBias_Smaller=-1,LODBias_Smallest=-1,NumStreamedMips=-1,MipGenSettings=TMGS_SimpleAverage,MinLODSize=1,MaxLODSize=8192,MaxLODSize_Smaller=-1,MaxLODSize_Smallest=-1,OptionalLODBias=0,OptionalMaxLODSize=4096,MinMagFilter=\"aniso\",MipFilter=\"point\")\nTextureLODGroups=(Group=TEXTUREGROUP_Terrain_Weightmap,LODBias=0,LODBias_Smaller=-1,LODBias_Smallest=-1,NumStreamedMips=-1,MipGenSettings=TMGS_SimpleAverage,MinLODSize=1,MaxLODSize=8192,MaxLODSize_Smaller=-1,MaxLODSize_Smallest=-1,OptionalLODBias=0,OptionalMaxLODSize=4096,MinMagFilter=\"aniso\",MipFilter=\"point\")\nTextureLODGroups=(Group=TEXTUREGROUP_Bokeh,LODBias=0,LODBias_Smaller=-1,LODBias_Smallest=-1,NumStreamedMips=-1,MipGenSettings=TMGS_SimpleAverage,MinLODSize=1,MaxLODSize=256,MaxLODSize_Smaller=-1,MaxLODSize_Smallest=-1,OptionalLODBias=0,OptionalMaxLODSize=4096,MinMagFilter=\"linear\",MipFilter=\"linear\")\nTextureLODGroups=(Group=TEXTUREGROUP_IESLightProfile,LODBias=0,LODBias_Smaller=-1,LODBias_Smallest=-1,NumStreamedMips=-1,MipGenSettings=TMGS_SimpleAverage,MinLODSize=1,MaxLODSize=4096,MaxLODSize_Smaller=-1,MaxLODSize_Smallest=-1,OptionalLODBias=0,OptionalMaxLODSize=4096,MinMagFilter=\"Aniso\",MipFilter=\"Point\")\nTextureLODGroups=(Group=TEXTUREGROUP_Pixels2D,LODBias=0,LODBias_Smaller=-1,LODBias_Smallest=-1,NumStreamedMips=-1,MipGenSettings=TMGS_SimpleAverage,MinLODSize=1,MaxLODSize=8192,MaxLODSize_Smaller=-1,MaxLODSize_Smallest=-1,OptionalLODBias=0,OptionalMaxLODSize=4096,MinMagFilter=\"point\",MipFilter=\"point\")\nTextureLODGroups=(Group=TEXTUREGROUP_HierarchicalLOD,LODBias=0,LODBias_Smaller=-1,LODBias_Smallest=-1,NumStreamedMips=-1,MipGenSettings=TMGS_SimpleAverage,MinLODSize=1,MaxLODSize=4096,MaxLODSize_Smaller=-1,MaxLODSize_Smallest=-1,OptionalLODBias=0,OptionalMaxLODSize=4096,MinMagFilter=\"Aniso\",MipFilter=\"Point\")\nTextureLODGroups=(Group=TEXTUREGROUP_Impostor,LODBias=0,LODBias_Smaller=-1,LODBias_Smallest=-1,NumStreamedMips=-1,MipGenSettings=TMGS_SimpleAverage,MinLODSize=1,MaxLODSize=4096,MaxLODSize_Smaller=-1,MaxLODSize_Smallest=-1,OptionalLODBias=0,OptionalMaxLODSize=4096,MinMagFilter=\"Aniso\",MipFilter=\"Point\")\nTextureLODGroups=(Group=TEXTUREGROUP_ImpostorNormalDepth,LODBias=0,LODBias_Smaller=-1,LODBias_Smallest=-1,NumStreamedMips=-1,MipGenSettings=TMGS_SimpleAverage,MinLODSize=1,MaxLODSize=4096,MaxLODSize_Smaller=-1,MaxLODSize_Smallest=-1,OptionalLODBias=0,OptionalMaxLODSize=4096,MinMagFilter=\"Aniso\",MipFilter=\"Point\")\nTextureLODGroups=(Group=TEXTUREGROUP_Project01,LODBias=0,LODBias_Smaller=-1,LODBias_Smallest=-1,NumStreamedMips=-1,MipGenSettings=TMGS_SimpleAverage,MinLODSize=1,MaxLODSize=4096,MaxLODSize_Smaller=-1,MaxLODSize_Smallest=-1,OptionalLODBias=0,OptionalMaxLODSize=4096,MinMagFilter=\"Aniso\",MipFilter=\"Point\")\nTextureLODGroups=(Group=TEXTUREGROUP_Project02,LODBias=0,LODBias_Smaller=-1,LODBias_Smallest=-1,NumStreamedMips=-1,MipGenSettings=TMGS_SimpleAverage,MinLODSize=1,MaxLODSize=4096,MaxLODSize_Smaller=-1,MaxLODSize_Smallest=-1,OptionalLODBias=0,OptionalMaxLODSize=4096,MinMagFilter=\"Aniso\",MipFilter=\"Point\")\nTextureLODGroups=(Group=TEXTUREGROUP_Project03,LODBias=0,LODBias_Smaller=-1,LODBias_Smallest=-1,NumStreamedMips=-1,MipGenSettings=TMGS_SimpleAverage,MinLODSize=1,MaxLODSize=4096,MaxLODSize_Smaller=-1,MaxLODSize_Smallest=-1,OptionalLODBias=0,OptionalMaxLODSize=4096,MinMagFilter=\"Aniso\",MipFilter=\"Point\")\nTextureLODGroups=(Group=TEXTUREGROUP_Project04,LODBias=0,LODBias_Smaller=-1,LODBias_Smallest=-1,NumStreamedMips=-1,MipGenSettings=TMGS_SimpleAverage,MinLODSize=1,MaxLODSize=4096,MaxLODSize_Smaller=-1,MaxLODSize_Smallest=-1,OptionalLODBias=0,OptionalMaxLODSize=4096,MinMagFilter=\"Aniso\",MipFilter=\"Point\")\nTextureLODGroups=(Group=TEXTUREGROUP_Project05,LODBias=0,LODBias_Smaller=-1,LODBias_Smallest=-1,NumStreamedMips=-1,MipGenSettings=TMGS_SimpleAverage,MinLODSize=1,MaxLODSize=4096,MaxLODSize_Smaller=-1,MaxLODSize_Smallest=-1,OptionalLODBias=0,OptionalMaxLODSize=4096,MinMagFilter=\"Aniso\",MipFilter=\"Point\")\nTextureLODGroups=(Group=TEXTUREGROUP_Project06,LODBias=0,LODBias_Smaller=-1,LODBias_Smallest=-1,NumStreamedMips=-1,MipGenSettings=TMGS_SimpleAverage,MinLODSize=1,MaxLODSize=4096,MaxLODSize_Smaller=-1,MaxLODSize_Smallest=-1,OptionalLODBias=0,OptionalMaxLODSize=4096,MinMagFilter=\"Aniso\",MipFilter=\"Point\")\nTextureLODGroups=(Group=TEXTUREGROUP_Project07,LODBias=0,LODBias_Smaller=-1,LODBias_Smallest=-1,NumStreamedMips=-1,MipGenSettings=TMGS_SimpleAverage,MinLODSize=1,MaxLODSize=4096,MaxLODSize_Smaller=-1,MaxLODSize_Smallest=-1,OptionalLODBias=0,OptionalMaxLODSize=4096,MinMagFilter=\"Aniso\",MipFilter=\"Point\")\nTextureLODGroups=(Group=TEXTUREGROUP_Project08,LODBias=0,LODBias_Smaller=-1,LODBias_Smallest=-1,NumStreamedMips=-1,MipGenSettings=TMGS_SimpleAverage,MinLODSize=1,MaxLODSize=4096,MaxLODSize_Smaller=-1,MaxLODSize_Smallest=-1,OptionalLODBias=0,OptionalMaxLODSize=4096,MinMagFilter=\"Aniso\",MipFilter=\"Point\")\nTextureLODGroups=(Group=TEXTUREGROUP_Project09,LODBias=0,LODBias_Smaller=-1,LODBias_Smallest=-1,NumStreamedMips=-1,MipGenSettings=TMGS_SimpleAverage,MinLODSize=1,MaxLODSize=4096,MaxLODSize_Smaller=-1,MaxLODSize_Smallest=-1,OptionalLODBias=0,OptionalMaxLODSize=4096,MinMagFilter=\"Aniso\",MipFilter=\"Point\")\nTextureLODGroups=(Group=TEXTUREGROUP_Project10,LODBias=0,LODBias_Smaller=-1,LODBias_Smallest=-1,NumStreamedMips=-1,MipGenSettings=TMGS_SimpleAverage,MinLODSize=1,MaxLODSize=4096,MaxLODSize_Smaller=-1,MaxLODSize_Smallest=-1,OptionalLODBias=0,OptionalMaxLODSize=4096,MinMagFilter=\"Aniso\",MipFilter=\"Point\")"
  },
  {
    "path": "Config/XboxOne/XboxOneEngine.ini",
    "content": "[Audio]\n; Disable Unreal audio device on all platforms\n; We use the FMOD one https://fmod.com/resources/documentation-ue4?version=2.0&page=user-guide.html#disabling-unreal-audio-device\nAudioDeviceModuleName=\n\n[/Script/FMODStudio.FMODSettings]\nbEnableLiveUpdate=False\n\n[SystemSettings]\nr.VSync=1\n\n\n[/Script/XboxOnePlatformEditor.XboxOneTargetSettings]\nbEnablePIXProfiling=False\nDefaultStackSize=0\nDebugStackSizeOverride=0\nDefaultStackSizeCommit=0\nApplicationForegroundColor=Light\nApplicationBackgroundColor=(B=0,G=0,R=0,A=0)\nSplashScreenBackgroundColor=(B=0,G=0,R=0,A=0)\nCultureStringResources=(PackageDisplayName=\"\",PublisherDisplayName=\"Not Yet\",PackageDescription=\"\",ApplicationDisplayName=\"WarriOrb\",ApplicationShortName=\"\",ApplicationDescription=\"\")\nCultureImageResources=()\nbEnableAutoResourcePacks=True\nbContentRestrictions=False\nPackageVersion=\nbIncludeEngineVersionInPackageVersion=False\nbUseShortNameForLogo=False\nbUseShortNameForWideLogo=False\nbRequireXboxLive=True\nTitleId=720e566b\nPrimaryServiceConfigId=00000000-0000-0000-0000-0000720e566b\nbInternetClientServer=False\nbPrivateNetworkClientServer=False\nProductId=37574e39-3553-304c-c042-4b3042371f00\nContentId=00000000-0000-0000-0000-000000000001\nPersistentLocalStorage=0\nPackageName=25187NotYet.40546998C4C4\nPublisherName=CN=13E090E1-271F-4300-986E-D54324667EDC\nMinimumOSVersion=\nMaximumOSVersion=\nbSuspendTrialOnConstrain=False\nbSuppressMultipleConfigWarnings=False\nbSubmissionValidatorExpirationError=True\nXboxOneXTitleMemoryGB=6\nbSkipAppIdSuffixForShippingConfig=False\nbEnableGameChat=False\n+InProcessServers=(DLLName=\"Microsoft.Xbox.Services.dll\",ActivatableClass=((ActivatableClassId=\"Microsoft.Xbox.Services.Statistics.Manager.StatisticManager\"),(ActivatableClassId=\"Microsoft.Xbox.Services.XboxLiveContext\"),(ActivatableClassId=\"Microsoft.Xbox.Services.Presence.PresenceData\"),(ActivatableClassId=\"Microsoft.Xbox.Services.Configuration\"),(ActivatableClassId=\"Microsoft.Xbox.Services.Multiplayer.MultiplayerSession\"),(ActivatableClassId=\"Microsoft.Xbox.Services.Multiplayer.MultiplayerSessionReference\"),(ActivatableClassId=\"Microsoft.Xbox.Services.Multiplayer.MultiplayerGetSessionsRequest\")))\nbRequiresAudioBackgroundTask=False\nbRequiresControlChannelBackgroundTask=False\nbRequiresSystemEventBackgroundTask=False\nbRequiresTimerBackgroundTask=False\nbRequiresPushNotificationBackgroundTask=False\nbEnableKinect=False\nbUseStaticGPUAllocation=False\nbKinectRequired=False\nbKinectVision=False\nbKinectAudio=False\nbKinectExpressions=False\nbKinectFace=False\nbUseVersionLockedNUIPipeline=False\nAudioPipelineVersion=\nVisionPipelineVersion=\nSpeechPipelineVersion=\nbBlockGameDVR=False\nbBlockBroadcasting=False\nAudioSampleRate=0\nSpatializationPlugin=\nReverbPlugin=\nOcclusionPlugin=\nbUseForwardShading=False\n\n"
  },
  {
    "path": "Config/XboxOne/XboxOneGameUserSettings.ini",
    "content": "; 0:low, 1:med, 2:high, 3:epic, 4:cinematic, default: 3\n[ScalabilityGroups]\nsg.ViewDistanceQuality=2\nsg.AntiAliasingQuality=2\nsg.ShadowQuality=2\nsg.PostProcessQuality=2\nsg.TextureQuality=3\nsg.EffectsQuality=2\nsg.FoliageQuality=2\n\n[/Script/SOrb.SoGameSettings]\nResolutionSizeX=1920\nResolutionSizeY=1080\nLastUserConfirmedResolutionSizeX=1920\nLastUserConfirmedResolutionSizeY=1080\nDesiredScreenWidth=1920\nDesiredScreenHeight=1080\nbUseDynamicResolution=False\n"
  },
  {
    "path": "Content/Localization/StringTables/Areas.csv",
    "content": "Key,SourceString,Comment\nwhite_wall,White Wall,\nruined_realm,Ruined Realm,\nact1_loading,\"You are a Mighty Spirit from the Unknown Realm. You were torn away from your home by a pathetic mortal Wizard. After a magical accident your essence is bound to an unlikely body. Find a way out of your ball-body prison!\",\nact2_loading,Reaching Crossroad Cave you are a step closer to the Three Artifacts - and to freedom.,\nact3_loading,Finding the Three Artifacts required all your skills and strength. You hope that delivering them to the Wizard will be less difficult.,\nending_loading,\"Finally! You did your part of the deal, now it's the Wizard's turn to get you back home.\",\ngrey_gate,Grey Gate,name of an area\nsunken_sewer,Sunken Sewer,name of an area\nancient_arcade,Ancient Arcade,name of an area\ncerulean_city,Cerulean City,name of an area\ncrossroad_cave,Crossroad Cave,name of an area\nobedient_outpost,Obedient Outpost,name of an area\ndwarven_dungeons,Dwarven Dungeons,name of an area\nhallowed_heart,Hallowed Heart,\"name of an area, Hallowed as in made holy; consecrated.\"\nremnant_road,Remnant Road,name of an area\nlava_lair,Lava Lair,name of an area\nsnake_slide,Snake Slide,name of an area\nwracked_waters,Wracked Waters,name of an area\nbubble_border,Bubble Border,name of an area\nlast_land,Last Land,name of an area\nportal_place,Portal Place,name of an area\nchasm_chamber,Chasm Chamber,name of an area\nlost_land,Lost Land,name of an area\nperfect_palace,Perfect Palace,name of an area\ndarkest_dungeon,Darkest Dungeon,name of an area\nact_1,Act I,text displayed on black screen the first time a chapter is started\nact_2,Act II,text displayed on black screen the first time a chapter is started\nact_3,Act III,text displayed on black screen the first time a chapter is started\nepilogue,Epilogue,text displayed on black screen the first time a chapter is started\nprologue,Prologue,text displayed on black screen the first time a chapter is started\nprogress_act1_start,Lost in Ruin,progress info on save slots\nprogress_act1_tut1,Am I Worthy?,progress info on save slots\nprogress_act1_arcade1,Remnants of a Realm,progress info on save slots\nprogress_act1_tut2,Sewer again,progress info on save slots\nprogress_act1_arcade2,Discovering Ancient Technology,progress info on save slots\nprogress_act1_tut3,Third time Worthy,progress info on save slots\nprogress_act1_before_raven,Searching for a way out,progress info on save slots\nprogress_act1_gem,Looking for a Gem,progress info on save slots\nprogress_act1_infuse,Infusing the Gem,progress info on save slots\nprogress_act1_test_stone,Bouncing Stones,progress info on save slots\nprogress_act1_portals,Looking for a Portal,progress info on save slots\nprogress_act1_boss_fight,Facing the Keeper,progress info on save slots\nprogress_act2_crossroad,At a crossroad,progress info on save slots in act 2\nprogress_act2_dwarf_0,Into the Blue,progress info on save slots in act 2\nprogress_act2_dwarf_1,Elevator Gem and Key,progress info on save slots in act 2\nprogress_act2_dwarf_2,Opening the Gate,progress info on save slots in act 2\nprogress_act2_dwarf_boss,Dwarven Statue,progress info on save slots in act 2\nprogress_act2_lava_0,Into the Red,progress info on save slots in act 2\nprogress_act2_lava_1,Uniting Key Pieces,progress info on save slots in act 2\nprogress_act2_lava_2,Climbing the Tower,progress info on save slots in act 2\nprogress_act2_lava_boss,Armour Wrath,progress info on save slots in act 2\nprogress_act2_ww_0,Into the Green,progress info on save slots in act 2\nprogress_act2_ww_1,Through the Lake,progress info on save slots in act 2\nprogress_act2_ww_2,Being Followed,progress info on save slots in act 2\nprogress_act2_ww_boss,Fallen Druid,progress info on save slots in act 2\nprogress_act2_end,To the Fourth Station,progress info on save slots in act 2\nprogress_act3_start,Lost in the Caves,progress info on save slots in act 3\nprogress_act3_pipes,Moving Pipes,progress info on save slots in act 3\nprogress_act3_floating,Floating,progress info on save slots in act 3\nprogress_act3_monk,Monk's Home,progress info on save slots in act 3\nprogress_act3_way_out,Way out of the Realm,progress info on save slots in act 3\nprogress_epilogue_castle,Wizard's Castle,progress info on save slots in epilogue\nprogress_epilogue_boss,The Real Demon,progress info on save slots in epilogue\nprogress_epilogue_past_and_future,Past and Future,progress info on save slots in epilogue\nprogress_epilogue_save_creatures,Chance for everyone,progress info on save slots in epilogue\nprogress_epilogue_separate_worlds,Separated Worlds,progress info on save slots in epilogue\nloading_tip_act1_0,\"In Ball form you go faster.\", loading screen tip for act 1\nloading_tip_act1_1,\"In Ball form you bounce back when you hit a surface.\", loading screen tip for act 1\nloading_tip_act1_2,\"Each weapon has its own unique special strike.\", loading screen tip for act 1\nloading_tip_act1_3,\"Most of the people died after Ruin happened, but there are still some survivors.\", loading screen tip for act 1\nloading_tip_act1_4,\"Some items can’t be used but merchants still like to buy them.\", loading screen tip for act 1\nloading_tip_act1_5,\"There are many keys, and when I say many, I mean it.\", loading screen tip for act 1\nloading_tip_act1_6,\"When you find an item it would make sense to check what it is, wouldn’t it?\", loading screen tip for act 1\nloading_tip_act1_7,\"Spells can make combat easier.\", loading screen tip for act 1\nloading_tip_act1_8,\"Dying often is absolutely normal. If you don’t die a lot, you are doing something wrong.\", loading screen tip for act 1\nloading_tip_act1_9,\"You can always check the Sidenotes in your Inventory to see if you have any side quests.\", loading screen tip for act 1\nloading_tip_act2_0,\"Using the Railway can shorten your journey.\", loading screen tip for act 2\nloading_tip_act2_1,\"We’ll try to make our next game without any loading screens, we promise...\", loading screen tip for act 2\nloading_tip_act2_2,\"Choosing the right weapon against a Boss will make your life easier.\", loading screen tip for act 2\nloading_tip_act2_3,\"Don’t forget to use the Soulkeeper!\", loading screen tip for act 2\nloading_tip_act2_4,\"Finding the Artefacts might be hard, but this is your only chance to get out.\", loading screen tip for act 2\nloading_tip_act2_5,\"Talk to any Survivor if you can. They might be able to help you.\", loading screen tip for act 2\nloading_tip_act2_6,\"If you find an area too difficult you can always go to another area first.\", loading screen tip for act 2\nloading_tip_act2_7,\"Don’t forget to spend your gold! (Ad sponsored by Gnory)\", loading screen tip for act 2\nloading_tip_act2_8,\"Equipping the right items will make the combat easier.\", loading screen tip for act 2\nloading_tip_act2_9,\"If you manage to defeat every member of a group you won’t have to fight them ever again.\", loading screen tip for act 2\nloading_tip_act3_0,\"Using the Railway can also make your Journey longer.\", loading screen tip for act 3\nloading_tip_act3_1,\"If you got this far, you surely know everything now.\", loading screen tip for act 3\nloading_tip_act3_2,\"Loading screen tips are very useful - except in a few cases.\", loading screen tip for act 3\nloading_tip_act3_3,\"Now is your time to think about the fate of the Ruined Realm.\", loading screen tip for act 3\nloading_tip_act3_4,\"The End is near... I mean no loading screen can take forever, right?\", loading screen tip for act 3\nloading_tip_act3_5,\"Now your only task is to bring the Artefacts to Wizard.\", loading screen tip for act 3\nloading_tip_act3_6,\"If you find a combat too hard try to use different shards, spells, and weapons.\", loading screen tip for act 3\nloading_tip_act3_7,\"Don’t give up! Victory is close.\", loading screen tip for act 3\nloading_tip_end_0,\"The Human Realm is a weird place...\", loading screen tip for epilogue\nloading_tip_end_1,\"You really did your part of the deal, now it’s time to go home!\", loading screen tip for epilogue\nloading_tip_end_2,\"Should you care about the fate of the Realms?\", loading screen tip for epilogue\nloading_tip_end_3,\"Looks like it’s always you who has to take care of the mess others left behind.\", loading screen tip for epilogue\nloading_tip_end_4,\"Time to finish what you started. One way or another.\", loading screen tip for epilogue\nintro_subtitle_0,\"I wish I could just... turn back time to undo what I have done.\", intro subtitle line 1\nintro_subtitle_1,\"However the past is behind us\", intro subtitle line 01\nintro_subtitle_2,\"and all I can change now\", intro subtitle line 2\nintro_subtitle_3,\"is the future.\", intro subtitle line 3\n"
  },
  {
    "path": "Content/Localization/StringTables/Credits.csv",
    "content": "Key,SourceString,Comment\ncredits_fmod,Made with FMOD Studio by Firelight Technologies Pty Ltd.,\"\"\n"
  },
  {
    "path": "Content/Localization/StringTables/Dialogue.csv",
    "content": "Key,SourceString,Comment,\nnext,Next,default option,\nfinish,Finish,default option,\nnpc_name_kobold,Kobold Chef,,\ngold_lost,{0} Gold Lost,,\ngold_gained,{0} Gold Gained,,\nitem_lost_n,{Amount} {ItemName} lost!,,\nitem_gained_n,{Amount} {ItemName} gained!,,\nitem_lost,{ItemName} lost!,,\nitem_gained,{ItemName} gained!,,\nnpc_dwarven_workshop,Dwarven Workshop,name of the place the character can have a dialogue to craft a quest item,\nnpc_ancient_gate,Ancient Gate,name of an npc,\nnpc_monk,Monk,name of an npc,\nnpc_gnory,Gnory,name of an npc,\nnpc_fountain,Fountain,display name of a fountain the character can talk with,\nnpc_tomb,Tomb,display name of a tomb a character can talk to,\nnpc_unknown_wizard,Unknown Wizard,display name of an npc,\nnpc_wizard,Wizard,display name of the wizard npc,\nnpc_fishy,Fishy,display name of an npc,\nnpc_supper_dwarf,Supper Dwarf,\"display name of an npc. Supper refers here an evening meal, typically a light or informal one.\",\nnpc_secret_hideout,Secret Hideout Gate,display name of a door asking for a password,\nnpc_pipe_walker,Pipe Walker,display name of some weird creatures,\nnpc_scholar,Scholar,name of an npc,\nnpc_raven,Raven,name of an npc (he is actually a bird),\nnpc_merchant_voice,Voice,name of a small ant until he says his name (only a voice cause player can not see it),\nnpc_merchant,Merch Ant,name of an npc,actually an ant and a trader. Merch = Merchant\nnpc_lory,Lory,name of an npc,\nnpc_lory_unkown,Gnome Lady,display name of Lory before she introduces herself,\nnpc_golem_maker,Golem Maker,name of an npc,\nnpc_ghost_dwarf,Ghost Dwarf,name of an npc (actually a ghost of a dwarf),\nnpc_gatekeeper,Gatekeeper,name of an npc,\nnpc_teachy,Teachy,name of an npc,\nnpc_teachy_unkown,Bored Gnome,name of Teachy before introduction,\nnpc_demon_lillian,Demon Lillian,name of the final boss,\nnpc_magic_mirror,Magic Mirror,name of an npc,\nnpc_sewer_creature,Sewer Creature,name of an npc,\nnpc_statue,Statue,name of an npc,\nnpc_altar,Altar,npc if BPLanguage Improver,\nchar_name_failed_one,Failed One,possible display name for character,\nchar_name_spirit_of_the_unknown,Spirit Of the Unknown,possible display name for character,\nchar_name_ball_e,BALL-E,possible display name for character,\nchar_name_warriorb,WarriOrb,possible display name for character,\nchar_name_epic_sphero,Epic Sphero,possible display name for character,\nchar_name_ultimate_frisbee,Ultimate Frisbee,possible display name for character,\nchar_name_warlorb,Warlorb,possible display name for character,\nchar_name_sorbcerer,Sorbcerer,possible display name for character,\nchar_name_dr_ball,Dr. Ball,possible display name for character,\nchar_name_dont_buy,Don\\'t buy,possible display name for character,\nchar_name_saviour,Saviour,possible display name for character,\nchar_name_destroyer,Destroyer,possible display name for character,\nchar_name_wanderer,Wanderer,possible display name for character,\n"
  },
  {
    "path": "Content/Localization/StringTables/Enemies.csv",
    "content": "Key,SourceString,Comment\narmour_wrath_name,Armour Wrath,display name of an npc boss\ndwarf_name,Dwarf,display name of an npc boss\nfallen_druid_name,Fallen Druid,display name of an npc boss\n"
  },
  {
    "path": "Content/Localization/StringTables/Episodes.csv",
    "content": "Key,SourceString,Comment\nepisode_end_main_title,Episode Completed!,episode map end panel text\nwhite_wall_friendly_name,White Wall,name the episode is displayed with in the ui\nwhite_wall_desc,Although it's long abandoned the fortress of White Wall still stands against Ruin. After centuries of silence some groups of unexpected visitors broke the loneliness of the decaying city.,map desc when the player can select the episode\nwhite_wall_completed_subtitle,White Wall,subtitle of the ending panel when player finishes this episode\nwhite_wall_completed_desc,\"What happened beyond the portal is another story, which will be told at another time.\",short text on the ending panel when player finishes this episode\nwhite_wall_loadingscreen_desc,After months of researching I found a way to return back to the Ruined Realm. Ironically enough I have to use the same body I was trapped in before. I'll need to be quick and clever for this might be my very last chance to stop Ruin before it devours the World.,text on loading screen\ndreamhack_friendly_name,Dreamhack,\ndreamhack_desc,What happens when you lock a mighty demon's spirit inside a ball body?,\ndreamhack_completed_subtitle,Dreamhack Demo,\ndreamhack_completed_desc,\"Thanks for playing the game, we hope you had a great time!\",\nescape_darkness_friendly_name,Escape Darkness,\nescape_darkness_desc,Are you fast enough to race against Darkness itself?,\nescape_darkness_completed_subtitle,Escaped from Darkness,\nescape_darkness_completed_desc,\"\"\"And as Darkness spreads an unknown Warriorb will rise...\"\"\",\n"
  },
  {
    "path": "Content/Localization/StringTables/FloatingEnemyAndNPCLines.csv",
    "content": "Key,SourceString,Comment\nchar_vo_fallendruid_attack_flybug,It's safe here.,\nchar_vo_fallendruid_attack_spike,This place shall stand!,\nchar_vo_fallendruid_attack_tendril,Nature will survive!,\nchar_vo_fallendruid_attack_thorn_sphere,\"Out with you, Ruin!\",\nchar_vo_fallendruid_die,\"I have... failed\",\nchar_vo_shadesphere_attack_1,I'll change you!,\nchar_vo_shadesphere_attack_2,Do not resist me!,\nchar_vo_shadesphere_damaged_1,It's still... me...,\nchar_vo_shadesphere_damaged_2,Why did you...?,\nchar_vo_shadesphere_die,You changed... me?,\nchar_vo_shadesphere_idle_1,What do you wish to be?,\nchar_vo_shadesphere_idle_2,Come to me!,\nchar_vo_golemmaker_idle_explain_1,I create essence which resists the ruin.,\nchar_vo_golemmaker_idle_mindlessly_1,\"Knowledge is Lost, All is Lost.\",\nchar_vo_golemmaker_idle_mindlessly_2,All is Lost.,\nchar_vo_golemmaker_idle_tries_to_remember,Your words remind me of something.,\nchar_vo_flybug_attack_1,Huh! Surprised?,\nchar_vo_flybug_attack_2,Take this!,\nchar_vo_ghostarmor_idle_1,We keep the Wall.,\nchar_vo_ghostarmor_idle_2,Follow the rules!,\nchar_vo_ghostarmor_attack_1,You shall perish!,\nchar_vo_ghostarmor_attack_2,For justice!,\nchar_vo_ghostarmor_attack_fall,Death to the outlaw!,\nchar_vo_ghostarmor_damaged_1,Just a scratch.,\nchar_vo_ghostarmor_damaged_2,You... can't.,\nchar_vo_ghostarmor__die,I... don't...,\nchar_vo_ghosthelmet_attack_1,Aaaaaaargh!,\nchar_vo_ghosthelmet_attack_2,Chaaaaaarge!,\nchar_vo_ghosthelmet_damaged_1,I'll need a blacksmith!,\nchar_vo_ghosthelmet_damaged_2,Send someone for a hammer!,\nchar_vo_ghosthelmet_idle_1,Use your head... or mine!,\nchar_vo_ghosthelmet_idle_2,Let's head east!,\nchar_vo_ghosthelmet_die,Be right back!,\nchar_vo_shade_attack_1,Join me!,\nchar_vo_shade_attack_2,You shall die too!,\nchar_vo_shade_damaged_1,Is this the end?,\nchar_vo_shade_damaged_2,Pain...,\nchar_vo_shade_die,Death... again?!,\nchar_vo_shade_idle_1,I can't rest.,\nchar_vo_shade_idle_2,Death is not peace.,\nchar_vo_primitivefishy_attack_1,Srrrr!,\nchar_vo_primitivefishy_attack_long_1,Hurray!,\nchar_vo_primitivefishy_attack_long_2,Flyyyyyyy!,\nchar_vo_primitivefishy_damaged_1,Uuush!,\nchar_vo_primitivefishy_damaged_2,Shish!,\nchar_vo_primitivefishy_die,Fishy leaves.,\nchar_vo_primitivefishy_idle_1,I need some fish!,\nchar_vo_primitivefishy_idle_2,Did you hear that?,\nchar_vo_maintainer_idle_1,At your service.,\nchar_vo_maintainer_idle_2,Your order?,\nchar_vo_maintainer_attack_1,Dinner is served!,\nchar_vo_maintainer_attack_2,Now it's clean!,\nchar_vo_maintainer_damaged_1,I'll need to be repaired.,\nchar_vo_maintainer_damaged_2,I still serve.,\nchar_vo_maintainer_die,I'll need... replacement.,\nchar_vo_koboldchef_idle_01,Too hot!,\nchar_vo_koboldchef_idle_02,It needs more salt!,\nchar_vo_koboldchef_idle_03,It will be delicious.,\nchar_vo_koboldchef_idle_04,Hmm...,\nchar_vo_maintainer_miniboss_attack_meteor,I'm above!,\nchar_vo_maintainer_miniboss_attack_spawn_enemy,\"Order, order, order!\",\nchar_vo_maintainer_miniboss_die,I can't... I was... above.,\nchar_vo_maintainer_miniboss_attack_1,This is my order!,\nchar_vo_maintainer_miniboss_attack_2,I\\'ll reorganize!,\nchar_vo_maintainer_miniboss_damaged_1,I can fix this,\nchar_vo_maintainer_miniboss_damaged_2,Don\\'t do that again!,\nchar_vo_gatekeeper_attack_aimed,Avoid these!,\nchar_vo_gatekeeper_attack_aimed_phase_2,Watch out where you bounce to!,\nchar_vo_gatekeeper_attack_electric_bubbles,Attention to the heights!,\nchar_vo_gatekeeper_attack_electric_bubbles_phase_2,Attention to the heights again!,\nchar_vo_gatekeeper_attack_meteors,Watch out for your head!,\nchar_vo_gatekeeper_attack_shield,Do you really think you are worthy?,\nchar_vo_dwarvenstatue_attack_axe_point,I keep Ruin,\"\"\nchar_vo_dwarvenstatue_attack_axe_strike_down,We are above the Law!,\"\"\nchar_vo_dwarvenstatue_attack_meteor,I can take more!,\"\"\nchar_vo_dwarvenstatue_shield_knock,I hold it back!,\"\"\nchar_vo_dwarvenstatue_die,I won't move... again,\"\"\nchar_vo_teachy_idle_book_up_0,Ehmm,\nchar_vo_teachy_idle_book_up_1,Humm,\nchar_vo_teachy_idle_book_up_2,Hemm,\nchar_vo_teachy_idle_book_up_3,Ahm,\nchar_vo_teachy_idle_book_down_0,Walking ball?,\nchar_vo_teachy_idle_book_down_1,You?,\nchar_vo_teachy_idle_book_down_2,Do you exist outside of my mind?,\nchar_vo_teachy_idle_book_down_3,\"Ehm, what?\",\nchar_vo_teachy_idle_humming_0,\"Hmmm-hmmm-hmm\",\nchar_vo_teachy_idle_humming_1,\"Ehmm-hmmm-uhmm\",\nchar_vo_teachy_idle_humming_2,\"Umm-huhummm\",\nchar_vo_teachy_idle_humming_speaking_long_0,\"I am, therefore I think!\",\nchar_vo_teachy_idle_humming_speaking_long_1,\"I think... I am...\",\nchar_vo_teachy_idle_humming_speaking_long_2,\"The unexamined life is not worth living!\",\nchar_vo_teachy_idle_humming_speaking_long_3,\"The mind is furnished with ideas by a drunk upholsterer...\",\nchar_vo_teachy_idle_humming_speaking_short_0,\"Tic-tac\",\nchar_vo_teachy_idle_humming_speaking_short_1,\"To be...\",\nchar_vo_teachy_idle_humming_speaking_short_2,\"Weird\",\nchar_vo_lory_idle_croon,Croon,\nchar_vo_lory_idle_humming_0,Ohh,\nchar_vo_lory_idle_humming_1,Hmmm,\nchar_vo_lory_idle_humming_2,Ommm,\nchar_vo_lory_idle_humming_3,Auch,\nchar_vo_fishy_idle_hiss,Hissing,\nchar_vo_gnory_idle_whistle,Whistling,\nchar_vo_gnory_idle_humming,Humming,\nchar_vo_final_boss_p1_blue,\"I'm the daughter of the Wizard!\",\nchar_vo_final_boss_p1_green,\"I can create!\",\nchar_vo_final_boss_p1_red,\"I'm human!\",\nchar_vo_final_boss_p2_blue,\"I'm the daughter of the Wizard!\",\nchar_vo_final_boss_p2_green,\"That sounds funny!\",\nchar_vo_final_boss_p2_red_down,\"I can destroy!\",\nchar_vo_final_boss_p2_red_up,\"I can create!\",\nchar_vo_final_boss_p3_blue,\"I'm free!\",\nchar_vo_final_boss_p3_green,\"That sounds funny!\",\nchar_vo_final_boss_p3_red,\"What makes you say that?\",\nchar_vo_armourwrath_attack_clap,\"I won't fail the Maker!\",\nchar_vo_armourwrath_attack_die,\"No... I'm still... perfect\",\nchar_vo_armourwrath_attack_magic,\"Resist Ruin!\",\nchar_vo_armourwrath_attack_strike_down,\"Out of my way!\",\nchar_vo_armourwrath_attack_strike_down_2,\"I am perfect\",\nchar_vo_maintainer_elite_idle_1,\"Serve...\",\nchar_vo_maintainer_elite_idle_2,\"Order...\",\nchar_vo_supperdwarf_idle_1_eating_food_0,\"Yum-yum hmmmm... delicious\",\nchar_vo_supperdwarf_idle_1_eating_food_1,\"Hmmm... tasty\",\nchar_vo_supperdwarf_idle_1_eating_food_2,\"Ehmmm... where is my spoon?\",\nchar_vo_supperdwarf_idle_2_humming_0,\"Ehemm, ehemm\",\nchar_vo_supperdwarf_idle_2_humming_1,\"Hmmm\",\nchar_vo_supperdwarf_idle_2_humming_2,\"Ohm\",\nchar_vo_golemmaker_idle_moan_aaahhh,Aaahhh,\nchar_vo_golemmaker_idle_moan_ooohhh,Ooohhh,\nchar_vo_golemmaker_idle_sad_onon,Onon,\nchar_vo_flybug_damaged_1,\"Careful!\",\nchar_vo_flybug_damaged_2,\"It's not funny!\",\nchar_vo_flybug_idle_1,\"What is it like down there? Heh?\",\nchar_vo_flybug_idle_2,\"Easy man, easy!\",\nchar_vo_flybug_die_1,\"All right, gg!\",\n"
  },
  {
    "path": "Content/Localization/StringTables/Interaction.csv",
    "content": "Key,SourceString,Comment\nread,Read,interaction hint if the character can read a scroll or book\nread_symbols,Read Symbols,\nread_dictionary,Read Dictionary,\nopen,Open,door can be openned\ndoor_opened,Door opened,door openned\nopen_door,Open Door,\nclose_door,Close Door,\nexamine,Examine,examine a statue or some other interactable object which triggers dialogue or hint message\nexamine_device,Examine Device,\npull,Pull,pull a lever\npull_lever,Pull Lever,\nlever_is_inactive,Seems to be inactive,a lever\nlever_is_active,Lever activated. The crystal broke.,\nenter,Enter,teleport - enter a room or a portal\nleave,Leave,\"teleport - leave a room, chest, level\"\nleave_circle,Leave Circle,\nleave_cave,Leave Cave,\nleave_hut,Leave Hut,\nleave_bridge,Leave Bridge,\nenter_tower,Enter Tower,\nenter_bridge,Enter Bridge,\nenter_portal,Enter Portal,\nenter_flames,Enter Flames,\nenter_cave,Enter Cave,\nenter_gate,Enter Gate,\nenter_hut,Enter Hut,\nenter_kitchen,Enter Kitchen,\nenter_stairs_left,Enter Stairs on the Left,\nenter_stairs_right,Enter Stairs on the Right,\nenter_pipe,Enter Pipe,\ncross_planks,Cross Planks,\ndescend,Descend,climb down a ladder or rope or go down with an elevator\nascend,Ascend,climb up a ladder or rope or go up with an elevator\ntake,Take,character can take an item\ntake_axe,Take Axe,character can take a weapon\ntake_sword,Take Sword,character can take a weapon\ntake_mace,Take Mace,character can take a weapon\ntake_blades,Take Blades,character can take two swords to go dual wield\ntake_books,Take Books,character can take (two) books\ntake_spellcaster,Take Spellcaster,the Spellcaster is an amulet the character can use to cast spells\ntake_sabre,Take Sabre,character can take a weapon\ntake_rope,Take Rope,\ntake_wheel,Take Wheel,\ntake_mushrooms,Take Mushrooms,\ntake_stones,Take Stones,\ntake_a_seat,Take a seat,\nprimary_strike,Primary Strike,hint with control key for strike 1 of the character\nspecial_strike,Special Strike,hint with control key for strike 2 of the character\nput_weapon_away,Put Weapon Away,hint with control key to show how to put the weapon away\ninventory,Inventory,hint for hotkey to open the inventory\nfinish_demo,Finish Demo,teleport at the end of demo\nchest_open,Open Chest,\nchest_open_small,Open Small Chest,\nchest_close,Close Chest,\nchest_close_small,Close Small Chest,\nchest_check,Check Chest,\nchest_check_small,Check Small Chest,\ndoor_does_not_open_from_this_side,Door does not open from this side!,message when character tries to open a door but it can only be openned from the other side\nrest,Rest,rest near a checkpoint statue where character can sleep and change spells and listen to music\nkey_missing,Key Missing: {0},{0} is replaced with a key name\nunlocked_with,Unlocked with {0},{0} is replaced with a key name\nacquired_item,{0} acquired,{0} is replaced with an item name\nacquired_few_item,A few items acquired,message when more than one item is received at once\naquired_silver_key,Silver Key Acquired,optional bonus message\ntalk,Talk,\nfire,Fire,fires a cannon\npush,Push,push a sphere shaped rock from the edge to break some stuff\nring_bell,Ring the bell,there is a bell the character has to use to start the conversation with a merchant\nkick_rope,Kick Rope,a pile of rope can be kicked to be able to climb up/down on it\nrope_kicked,Rope kicked,feedback on the kick rope action\nrope_placed,Rope placed,\nrope_can_be_placed,A rope could be placed here,\nelevator_not_move_to_dir,The elevator does not move to the selected direction,player tries to use an elevator but the direction is not activated yet\nelevator_inactive,The elevator seems to be inactive,player tries to use the elevator but it is inactive\npass_bridge,Pass Bridge,\nboat_to_station,Boat to the Station,use a boat to get to the Station\nboat_to_kitchen,Boat to the Kitchen,use a boat to get to the kitchen\nsail,Sail,use ship for travel\nboat_to_ruins,Boat to the Ruins,use a boat to get to a place where there are some ancient ruins\nexamine_switch,Examine Switch,it is a lightswitch\nexamine_elevator,Examine Elevator,\ntoggle_switch,Toggle Switch,it is a lightswitch\nuse_switch,Use switch,for the moria gate\nuse,Use,use device in EndFinal level\nuse_device,Use Device,\ntake_abacus,Take Abacus,\ntake_all,Take All,\nactivate,Activate,\nactivate_elevator,Activate Elevator,\nelevator_activated,Elevator Activated,\nuse_crystal,Use Crystal,\ncall_elevator,Call Elevator,\nuse_elevator,Use Elevator,\nuse_elevator_gem,Use Elevator Gem,\nplace_rope,Place Rope,\ncharge,Charge,charge gem in Act I\nentrace_locked,Entrance locked from the other side,\ntouch_statue,Touch Statue,\ntravel,Travel,travel on the train station path\nexplore_stations,Explore more stations before using the railway system.,\nabsorb_energy,Absorb Energy,\nrestore,Restore,restore the HP\nsoulkeeper_released,Soulkeeper released,\nchange_spells,Change Spells,\nkey_missing,Key Missing: {0},{0} is the key name\nunlocked_with,Unlocked with {0},{0} is the key name\nswing,Swing,Swings on the pole with the arms\nswitch_interact,Switch,\"Switch interact alternative,  between the two modes\"\nmemory_stone_aquire,Acquire Memory Stone,\nmemory_stone_gained,Memory Stone Gained,\nstone_cant_carry,You can't carry more {0},{0} is the stone name\nstone_cant_store,You don't have anything you could use to store {0},{0} is the stone name\nstone_added,{0} {1} added to your bag!,\"{0} is the stone amount, {1} is the stone name\"\ndestroy,Destroy,destroy device in EndFinal level\nwindow,Window,examine Window\nchest,Chest,examine Chest\nbed,Bed,examine Bed\ncat_bed,Tabby's Bed,examine Tabbys (cat name) bed\nnotebook,Notebook,examine Notebook\ndoor,Door,examine Door\nmoms_room,Mom's Room,examine Mom's Room\ncandles,Candles,examine Candles\npainting,Painting,examine Painting\npaintings,Paintings,examine Paintings\ndads_room,Daddy's Room,examine Dad's Room\nexit,Exit,exit room\nstairs,Stairs,enter stairs\nchair,Chair,examine Chair\nlamps,Lamps,examine Lamps\nworkroom,Workroom,examine/enter Workroom\nlaboratory,Laboratory,examine/enter Laboratory\ndevice,Device,use Device\nmiddle_lever,Middle Lever,\"use Middle Lever \"\nleft_lever,Left Lever,use Left Lever\nright_lever,Right Lever,use Right Lever\ngo_up,Go up,go up the stairs\ngo_down,Go down,go down the stairs\nreset_portals,Reset Portals,lever\ncheck_door,Check Door,\"check door \"\ninspect_fountain,Inspect Fountain,\"\"\npick_up,Pick Up,pick up box or carryable\ndrop,Drop,drop box or carryable\nwheel_release,Release,release lever wheel\nwheel_turn,Turn,turn lever wheel\nrelease_keeper,Release Keeper,\"\"\nuse_magic_mirror,Use Magic Mirror,\"\"\nuse_active_item,Use Active Item,uses the active item\nuse_workshop,Use Workshop,\"\"\nyou_are_worthy,You are not worthy!,gate golem tutorial level message interaction\nreplay_boss_fight,Replay Boss Fight,interaction hint to play a boss fight which was already won\nuse_separate_explained,Use the device to separate the Realms,\"\"\nuse_destroy_explained,Destroy the device to save the creatures of Ruined Realm,\"\"\n"
  },
  {
    "path": "Content/Localization/StringTables/Items.csv",
    "content": "Key,SourceString,Comment\ntest_stone_name,Test Stone,\"\"\nice_stone_Name,Ice Stone,\"\"\n"
  },
  {
    "path": "Content/Localization/StringTables/Spells.csv",
    "content": "Key,SourceString,Comment\nimmune,Immune,displayed as floating text ingame if enemy is immune to a spell or damage type\nresisted,Resisted,displayed as floating text ingame if enemy has a chance to avoid an effect and he is lucky\nsecond_chance,Second Chance, displayed as floating test ingame if char has the effect on and dies and respawns because the effect saves him\nblocked,Blocked, displayed as floating test ingame when a certain enemy blocks certain attacks\ninfected,Infected, displayed as floating test ingame when dmg over time effect is applied on enemy\nno_need_for_heal,No need, displayed as floating test ingame when the character tries to use heal spell but has max health already\nmissing_target,Who? Where? What?!, displayed as floating test ingame when the character tries to use a spell which requires a target but there is none in range\ncant_use_sk_free_zone,Dangerous Location, displayed as floating test ingame when character tries to use the respawn point spell on a location when it is not allowed\ncant_use_in_air,Can't in air, displayed as floating test ingame when the character tries to use a spell in air which can not be used there\nspell_regained,Spell Charge Regained!, displayed as floating test ingame when the character regains a spell (can cast again)\ninstant_recharge,Instant Recharge, displayed as floating test ingame when a spell can be used again without waiting for the cooldown time\nhp_gained,Health Increased!, displayed as floating test ingame when the character increases his max health\nspell_capacity_gained,Spellpower Increased!, displayed as floating test ingame when the character increases his spellpower\n"
  },
  {
    "path": "Content/Localization/StringTables/UI.csv",
    "content": "Key,SourceString,Comment\ncontinue,Continue,Menu Continue\nstart_game,Start Game,Menu Start Game\nteleport_to_sk,Teleport To SoulKeeper,Menu Teleport to Soulkeeper\nteleport_to_cp,Teleport To Checkpoint,Menu Teleport To Checkpoint\nsaves,Save Slots,Menu saves\ncustom_maps,Custom Maps,Menu custom Maps\nsettings,Settings,Menu settings\ncredits,Credits,Menu credits\nquit_game,Quit Game,Menu Quit Game\nchange_user,Change User,Change User\nquit_to_menu,Quit to Menu,Menu Quit To Menu\nquit_game_question,Quit Game?,Confirm Quit popup\nquit_to_menu_question,Quit to Menu?,Confirm Quit popup\nprogress_saved,Progress will be saved,Confirm Quit popup\nrestart_game_question,Restart Game?,Confirm Restart popup\nrestart_game_warning,All progress will be lost,Confirm Restart popup\nsend_no,Do not Send,Analytics popup\nsend_automatically,Send Automatically,Analytics popup\npercentage_argument,{0}%,Slider\nreset_keyboard_wasd,Reset to WASD defaults,Confirm keyboard settings\nreset_keyboard_arrows,Reset to Arrow defaults,Confirm keyboard settings\nconfirm_keyboard_settings_reset,Are you sure?,Confirm keyboard settings\nkey_selection_press_button,Press the button you want to assign to the action:,Select Input key\nkey_selection_current,Currently selected button:,Select Input key\nkey_selection_empty,[Empty Button],Select Input key\nkey_selection_press,[Press Button],Select Input key\nconfirm,Confirm,Confirm popup\ncancel,Cancel,Confirm popup\nyes,Yes,Confirm popup\nno,No,Confirm popup\nchapter1_completed,Chapter 1 completed. Save is Locked.,Temporary for chapter 1\ndifficulty_normal,Normal,\nstart,Start,The name of the checkpoint. Custom Map action\nempty,Empty,\nnever_completed,Never completed,Custom Map\ncompleted_in_time,Completed in {time},Custom Map\ncustom_map_x,Custom Map {0},Custom Map\nunknown,UNKNOWN,Unknown input binding\ninput_unbound,Unbound,Unbound input\ninput_actions_conflicts,\"Selected button = {Key}, will get unbound from the {NumActions}|plural(one=Action,other=Actions) = {ActionNames}\",\"Input remap.  {Key} = key display name. {NumAction} the number of actions, this will determine what to choose between one and other.\"\ninput_selected_key_not_allowed,\"Selected button = {Key}, is not allowed as an input option\",Input remap. {Key} = key display name\ninput_not_allowed_thumbsticks,Not allowed to remap to thumbsticks,Input remap gamepad\ninput_not_allowed_thumbsticks_switch,Not allowed to remap to Left Stick or Right Stick,Input remap gamepad switch\ninput_not_allowed_options_menu_button,Not allowed to remap to the Menu button,Input remap gamepad\ninput_not_allowed_options_menu_button_switch,Not allowed to remap to the + Button,Input remap gamepad\nsettings_reset,Reset,Settings reset\nsettings_reset_default,Reset to Defaults,Settings reset to default\nsettings_reset_input_key,Reset button to default,Input reset key to default\nsettings_language,Language,Game settings\nsettings_game_speed,Game Speed,Game settings\nsettings_display_fps,Display FPS,Game settings\nsettings_display_play_time,Display Play Time,Game settings\nsettings_display_damage,Display Damage,Game settings\nsettings_display_enemy_hp,Display Enemy Health,Game settings\nsettings_display_floating_vo,Display Floating Voice Lines,Game settings\nsettings_gamepad_vibration,Vibration,Gamepad Vibration intensity settings\nsettings_pause_game_unfocused,Pause game when unfocused,Game settings\nsettings_pause_game_idle,Pause game when idle,Game settings\nsettings_language_tooltip,\"Change the display and locale (numbers, dates) language\",Game settings\nsettings_game_speed_tooltip,\"Changes the speed of the game.\nHigher speed might make the game have lower FPS.\",Game settings\nsettings_display_fps_tooltip,Show FPS counter,Game settings\nsettings_display_play_time_tooltip,Show current play time,Game settings\nsettings_display_damage_tooltip,Show damage as a floating number on the screen,Game settings\nsettings_display_enemy_hp_tooltip,Show a small health bar above injured enemies,Game settings\nsettings_display_floating_vo_tooltip,Show voice lines as floating texts,Game settings\nsettings_pause_game_unfocused_tooltip,Pauses the game when the game loses focus,Game settings\nsettings_pause_game_idle_tooltip,Pauses the game when the user is idle for a certain amount of minutes,Game settings\nsettings_fullscreen,Fullscreen,Display settings\nsettings_windowed,Windowed,Display settings\nsettings_borderless,Borderless,Display settings\nsettings_unknown,Unknown,Display settings\nsettings_ratio_4_3,4:3,Display settings Aspect Ratio\nsettings_ratio_16_10,16:10,Display settings Aspect Ratio\nsettings_ratio_16_9,16:9,Display settings Aspect Ratio\nsettings_quality_low,Low,Display settings quality\nsettings_quality_medium,Medium,Display settings quality\nsettings_quality_high,High,Display settings quality\nsettings_quality_epic,Epic,Display settings quality\nsettings_display_mode,Display Mode,Display settings\nsettings_aspect_ratio,Aspect Ratio,Display settings\nsettings_resolution,Resolution,Display settings\nsettings_resolution_scale,Resolution Scale,Display settings\nsettings_vsync,Vertical Sync,Display settings\nsettings_frame_limit,Frame Limit (FPS),Display settings\nsettings_shadows,Shadow Quality,Display settings\nsettings_textures,Texture Quality,Display settings\nsettings_effects,Effect Quality,Display settings\nsettings_post_effects,Post-Effects,Display settings\nsettings_antialising,Anti-Aliasing,Display settings\nsettings_volumetric_fog,Volumetric Fog,Display settings\nsettings_force_weak_hardware_opt,Additional Optimizations,Display settings\nsettings_display_mode_tooltip,In Windowed mode you can interact with other windows easier. In Borderless mode you can quickly switch between applications.,Display settings\nsettings_aspect_ratio_tooltip,Defines what aspect ratios are available for your resolution.,Display settings\nsettings_resolution_tooltip,Allows changing the Screen Resolution.,Display settings\nsettings_resolution_scale_tooltip,\"The desired resolution to use when rendering the game. It does not affect the UI.\nLowering it improves performance on lower end machines.\",Display settings\nsettings_vsync_tooltip,\"Synchronize the game refresh rate with the monitor refresh rate. Disable it for higher framerate and better input response.\nWhen enabled it prevents screen tearing.\",Display settings\nsettings_frame_limit_tooltip,Limit the maximum frame rate for a consistent experience.,Display settings\nsettings_shadows_tooltip,The higher the quality the finer the shadow.,Display settings\nsettings_textures_tooltip,Surfaces of the game world will increase in fidelity if the setting is higher.,Display settings\nsettings_effects_tooltip,\"Affects the quality of particles in the world, a lower quality might make some projectiles in the world harder to see.\",Display settings\nsettings_post_effects_tooltip,Affects the quality of the post process effects after the scene is rendered.,Display settings\nsettings_antialising_tooltip,Smooths out the edges by blending the colors of the pixels around the object to create the illusion of smoothness.,Display settings\nsettings_volumetric_fog_tooltip,\"Realistic looking fog. Has a high performance impact, disable it to improve performance.\",Display settings\nsettings_force_weak_hardware_opt_tooltip,In certain areas background traps are deactivated or background visuals look cheaper to gain more performance.,Display settings\nsettings_reset,Reset,Settings\nsettings_apply,Apply,Settings\nsettings_cancel,Cancel,Settings\nsettings_fps_unlimited,Unlimited,Display settings frame limit\nsettings_resolution_entry,{0}x{1},\"Display settings. {0} - x, {1} - Y\"\nconsole_xbox_one,XBox One,\nconsole_ps4,PlayStation 4,\nconsole_switch,Switch,\nsettings_auto_detect_controller,Auto detect Gamepad Layout,Gamepad settings\nsettings_controller_platform,Layout,Gamepad Layout settings\nsettings_controller_remap_single,Remap Controls,Gamepad settings\nsettings_controller_remap,Remap Controls,Gamepad settings\nsettings_controller_remap_noedit,Please use a gamepad in order to remap,Gamepad settings\nsettings_move_left_right,Move left/right,Input\nselect_spells,Select spells,Input right  thumbstick\nempty_line,-,\nempty,Empty,\nline_three_dots,...,\nsettings_brightness,Brightness,Brightness settings\nsettings_brightness_description,Please adjust the brightness of the game to your display,Brightness settings\nsettings_brightness_default_value,Default Value is 100%,Brightness settings\nsettings_collect_analytics,Collect Usage Statistics,Game Settings\nsettings_collect_analytics_tooltip,\"These are not used to identify individuals, but help us to understand players needs to improve our game.\",Game Settings\nsettings_mute_audio,Mute audio,Audio settings\nsettings_mute_audio_unfocused,Mute audio when in background,Audio settings\nsettings_mute_voice,Mute voices outside of dialogues,Audio settings\nsettings_mute_dialogue_voice,Mute voices in dialogues,Audio settings\nsettings_master_volume,Master volume,Audio settings\nsettings_effects_volume,Sound Effects volume,Audio settings\nsettings_music_volume,Music volume,Audio settings\nsettings_mute_audio_tooltip,Mute all audio,Audio settings\nsettings_mute_audio_unfocused_tooltip,Mute the audio when the game window is not in focus,Audio settings\nsettings_mute_voice_tooltip,Mute the gibberish voices outside the dialogues,Audio settings\nsettings_mute_dialogue_voice_tooltip,Mute the gibberish voices inside the dialogues,Audio settings\nsettings_master_volume_tooltip,Adjust the master volume,Audio settings\nsettings_effects_volume_tooltip,Adjust the sound effects volume,Audio settings\nsettings_music_volume_tooltip,Adjust the music volume,Audio settings\nsettings_select_another,Select another,Settings input\nsettings_audio,Audio,Settings panels\nsettings_game,Game,Settings panels\nsettings_keyboard,Keyboard,Settings panels\nsettings_keyboard_remap_noedit,Please use a keyboard in order to change the keyboard input,Keyboard Settings\nsettings_controller,Gamepad,Settings panels\nsettings_controller_switch,Controls,Settings panels\nsettings_brightness,Brightness,Settings panels\nsettings_display,Display,Settings panels\ninput_left,Move Left,Input Action Name\ninput_right,Move Right,Input Action Name\ninput_strike_primary,Primary Strike,Input Action Name\ninput_strike_special,Special Strike,Input Action Name\ninput_roll,Roll,Input Action Name\ninput_float,Floating,Input Action Name\ninput_take_weapon,Take Weapon Away,Input Action Name\ninput_jump,Jump,Input Action Name\ninput_use_item,Use Item,Input Action Name\ninput_interact,Interact,Input Action Name\ninput_alt_interact,Interact Alternative,Input Action Name\ninput_change_spell,Change Spell,Input Action Name\ninput_change_item,Change Item,Input Action Name\ninput_change_weapon,Change Weapon,Input Action Name\ninput_open_inventory,Open Inventory,Input Action Name\ninput_menu_back,Open Menu/Escape/Back,UI Input Action Name\ninput_up,UI Move Up,UI Input Action Name\ninput_down,UI Move Down,UI Input Action Name\ninput_action_first,UI Action First,UI Input Action Name\ninput_action_second,UI Action Second,UI Input Action Name\ninput_action_third,UI Action Third,UI Input Action Name\ninput_top_left,UI Top Left,UI Input Action Name\ninput_top_right,UI Top Right,UI Input Action Name\ninput_action_back,UI Action Back,UI Input Action Name\ninput_spell_left,UI Spell Left,UI Input Action Name\ninput_spell_right,UI Spell Right,UI Input Action Name\ninput_spell_up,UI Spell Up,UI Input Action Name\ninput_spell_down,UI Spell Down,UI Input Action Name\ninput_spell_select,UI Spell Select,UI Input Action Name\ninput_spell_select_and_cast,UI Spell Select & Cast,UI Input Action Name\nprogress_saved_automatically,Your progress is saved automatically whenever this icon is displayed,Before Main Menu\nencourage_line1,The path ahead is challenging. Do not despise failure. Every wrong attempt discarded is another step forward.,Before Main Menu\nacknowledge,Acknowledge,Button\ncontroller_recommended,Note: Playing with a controller is recommended,Main Menu\ngame_is_wip,Game currently under development,Main Menu\nfeedback,Feedback,Discord external button\nselect,Select,Button\nback,Back,Button\nstats_usage_title,Usage Statistics,Analytics popup\nstats_usage_description,\"Not Yet would like to collect usage statistics from your game automatically.\nThese are not used to identify individuals, but help us to understand players needs to improve our game.\n\nSelect \"\"Send Automatically\"\" to allow collection of usage statistics,\nor \"\"Do Not Send\"\" to prevent the game from sending information to Not Yet.\n\nYou can change this setting at any time via the Settings Game tab.\",Analytics popup\ndescription,Description,Of something\nsettings_confirm_display_title,Confirm Display Settings in,Display settings confirm\nseconds,seconds,\nplay_time,Play Time,Stats for saves\ntotal_deaths,Total Deaths,Stats for saves\ndifficulty,Difficulty,Stats for saves\nchapter,Chapter,Stats for saves\ncheckpoint,Checkpoint,Stats for saves\ndisabled,Disabled,Widget is disabled\nstatus,Status,Status of a save/custom map\npanel_inventory,Inventory,Character Panel\npanel_character_sheet,Character Sheet,Character Panel\npanel_spells,Spells,Character Panel\npanel_notes,Sidenotes,Character Panel\npaneL_resistances,Resistances,Character Sheet Panel\nitem_rarity_0,\"Better than nothing, right?\",item rarity text on the bottom of tooltips\nitem_rarity_1,Better than nothing,item rarity text on the bottom of tooltips\nitem_rarity_2,Good stuff,item rarity text on the bottom of tooltips\nitem_rarity_3,Pretty good stuff,item rarity text on the bottom of tooltips\nitem_rarity_4,Amazing stuff,item rarity text on the bottom of tooltips\nitem_not_For_sale,Not for sale,Item Tooltip\nitem_equipped,---Equipped---,Item Tooltip\npanel_spell_selection_denied,You can only change the equipped spells near ancient statues.,Spell Selection panel\npanel_equipped_spells,Equipped Spells,Spell Selection panel\npanel_spell_capacity,Capacity: {0}/{1},Spell Selection panel\npanel_command_inv_equip,Equip,control key tip in inventory\npanel_command_inv_compare,Compare,\npanel_command_inv_back,Back,\npanel_command_inv_equip_item,Equip Item,\npanel_command_inv_change_item,Change Item,\npanel_command_inv_equip_next,Equip Next,\npanel_command_inv_unequip,Unequip,\npanel_command_inv_read,Read,\npanel_command_inv_drink,Drink,\npanel_command_spell_add,Add,add spell to equipped spells\npanel_command_spell_remove,Remove,remove spell from equipped spells\ngame_over_retry,Retry,control tip which is always visible on game over\ngame_over_retreat,Retreat,control tip which is only visible in boss areas where the player can either restart the fight or retreat from the place\nchest_loot,Loot,hotkey tip on chest\nchest_examine,Examine,\nchest_leave,Leave,\npanel_rest_option_sleep,Sleep,\npanel_rest_option_change_spells,Change Spells,\npanel_rest_option_listen_to_music,Listen to Music,\npanel_rest_option_wake_up,Wake Up,\npanel_rest_no_item,You don't have the necessary item to use spells!,\nspell_cast_switch_select_cast,Select & Cast,\nspell_cast_switch_select,Select,\nspell_cast_switch_controls,Quick select spells up/down/left/right,\ninventory_item_amount,Amount: {0},the item amount displayed in inventory/trade panel/etc.\ninventory_item_tooltip_cooldown,Cooldown,\ninventory_item_tooltip_sec,{0} sec,duration of something (e.g. cooldown)\ninventory_item_tooltip_damage,Damage,damage text on item descriptions\ngroup_defeated_title,Group Defeated,title of the group defeated panel\ngroup_defeated_ack,Acknowledge,the hotkey to close the group defeated panel\nloading_screen_press_key,Press any key to continue...,\nloading_screen_press_key_switch,Press any button to continue...,\nloading_screen_text_1,This is a loading screen. We wait a few seconds here to look more professional.,\nwarriorb,WarriOrb,\nrestart,Restart,Restart the game\ndiscord,Discord,\ntwitter,Twitter,\nmailing_list,Mailing List,\nsteam_main_game,Wishlist,\nsteam_main_game_buy,Buy Full Game,\nthank_you_prologue,\"THANK YOU FOR PLAYING WARRIORB DEMO PROLOGUE, WE HOPE YOU HAD A GREAT TIME!\",\nbuy_on_steam_and_follow,Buy WarriOrb in Steam and follow us on social media:,\ndifficulty_title,Difficulty,title of difficulty selection\ndifficulty_sane,Just an adventure,name of easy difficulty\ndifficulty_intended,A true challenge,name of normal difficulty\ndifficulty_insane,As hard as it can get,name of hard difficulty\ndifficulty_desc_sane,\"- Infinite <Blue>SoulKeeper</> (Checkpoint) spell charges\n- No health penalty when respawning near the <Blue>SoulKeeper</>\n- Decreased incoming damage\n- Decreased Enemy Health\",description of easy difficulty\ndifficulty_desc_intended,The way the game is meant to be played,description of normal difficulty\ndifficulty_desc_insane,\"- The <Blue>SoulKeeper</> (Portable Checkpoint) spell is removed from the game\n- Increased incoming damage\n- Increased Enemy Health\",description of hard difficulty\ndifficulty_confirm_question,Are you sure?,Confirm difficulty selected popup\ndifficulty_confirm_subtext,This choice is permanent,Confirm difficulty selected popup subtext\nsave_slots_playtime,{0} H {1} M,\"playtime displayed, {0} is the hours, {1} is the minutes\"\nsave_slots_playtime_short,{0} M,\"playtime displayed if it did not reach an hour, {0} is the time in minutes\"\nsave_slots_select,Select,loads the game or creates a new one using the active slot\nsave_slots_clear,Clear,clears the save slot\nsave_slots_new_game,New Game,text on empty save slot\nsave_slots_remove_confirm,Are you sure?,remove save slot confirm dialogue\nsave_slots_remove_confirm_subtext,Progress will be lost,remove save slot confirm dialogue\nsave_slots_loaded,- Loaded -,text on currently loaded save slot if there is any\ndwarf_language,Dwarf,Dwarf language\ngold_x,+{x} GOLD,{x} is the gold amount\ntrade_buy_back,Are you sure you want to buy back {ItemName} for {Gold} gold?,trade confirmation UI\ntrade_sell,Are you sure you want to sell {ItemName} for {Gold} gold?,trade confirmation UI\ntrade_buy,Are you sure you want to buy {ItemName} for {Gold} gold?,trade confirmation UI\ntrade_nope,Nope!,trade confirmation UI\ntrade_okay,Okay...,trade confirmation UI\ntrade_no_intrested,The trader is not interested in buying that item from you!,trade confirmation UI\ntrade_amount_x_x,{0} for {1} gold,trade confirmation UI. {0} is the current amount and {1} is the current amount times price per item\nbuy,Buy,buy item\nsell,Sell,sell item\nbuy_back,Buy Back,buy back item\nspell_only_in_air,Can not be used in air,Spell\nspell_restricted,Can not be used in restricted areas,Spell\nspell_cooldown_stops_in_air,Cooldown only starts on ground,Spell\nclose,Close,close book\nessence,Essence,essence represents the Health of the character\nbubble_float,Float,bubble tip for the char to float\nbubble_jump,Jump,bubble tip for the char to jump\ngame_defeated,Game Defeated!,end screen\ngo_back_to_menu,Go back to main menu,\nblack_fade_teleport_text_1,Now I remember the night when it started...,\nxp,XP,Experience Points\nskip,Skip,text near the press and hold to skip confirmation button\ncharacter_skin_title,Character Skin,option to change character skin\ncharacter_skin_classic,Classic,name of the original character skin\ncharacter_skin_mummy,Mummy,name of the alternative character skin\ncharacter_skin_pumpkin,Pumpkin,name of the alternative character skin\ncharacter_skin_desc,Changes the visuals of the player character,description for the character skin option\nsettings_merciful_bounce_never,Never,defines when (in which difficulty mode) is the easier bounce mode active\nsettings_merciful_bounce_on_easy,On Easy,defines when (in which difficulty mode) is the easier bounce mode active\nsettings_merciful_bounce_always,Always,defines when (in which difficulty mode) is the easier bounce mode active\nsettings_merciful_bounce,Merciful Bounce Mode,game settings\nsettings_merciful_bounce_tooltip,Allows Higher Bounce even if the Jump button is pressed after the character hits the ground,tooltip for Merciful Bounce Mode option\ndrm_defeatead_description,\"We suspect that you play a pirated copy of the game.\nIt's fine. We hope you will enjoy it!\n\nIf you like the game, please tell your friends about it, and maybe even consider buying it.\n\nWe would love to keep making games!\",\"check only in pirated copies \"\ndrm_defeatead_title,WarriOrb DRM,\"check only in pirated copies \"\ngamepad_special_right_xbox,Menu button,xbox Menu button\ngamepad_special_left_xbox,View button,xbox view button\nSwitch_FaceButton_Top,X Button,switch gamepad button name\nSwitch_FaceButton_Bottom,B Button,switch gamepad button name\nSwitch_FaceButton_Left,Y Button,switch gamepad button name\nSwitch_FaceButton_Right,A Button,switch gamepad button name\nSwitch_Trigger_Left,ZL Button,switch gamepad button name\nSwitch_Shoulder_Left,L Button,switch gamepad button name\nSwitch_Trigger_Right,ZR Button,switch gamepad button name\nSwitch_Shoulder_Right,R Button,switch gamepad button name\nSwitch_special_right,+ Button,switch gamepad button name\nSwitch_special_left,- Button,switch gamepad button name\nSwitch_special_dpad_up,Up Button, Switch gamepad button name\nSwitch_special_dpad_down,Down Button, Switch gamepad button name\nSwitch_special_dpad_left,Left Button, Switch gamepad button name\nSwitch_special_dpad_right,Right Button, Switch gamepad button name\nSwitch_LeftThumbstick,Left Stick, Switch gamepad button name\nSwitch_RightThumbstick,Right Stick, Switch gamepad button name\nSwitch_Gamepad_LeftStick_Up,Left Stick Up, Switch gamepad button name\nSwitch_Gamepad_LeftStick_Down,Left Stick Down, Switch gamepad button name\nSwitch_Gamepad_LeftStick_Right,Left Stick Right, Switch gamepad button name\nSwitch_Gamepad_LeftStick_Left,Left Stick Left, Switch gamepad button name\nSwitch_Gamepad_RightStick_Up,Right Stick Up, Switch gamepad button name\nSwitch_Gamepad_RightStick_Down,Right Stick Down, Switch gamepad button name\nSwitch_Gamepad_RightStick_Right,Right Stick Right, Switch gamepad button name\nSwitch_Gamepad_RightStick_Left,Right Stick Left, Switch gamepad button name\n"
  },
  {
    "path": "Content/Localization/Warriorb/StaleGatherCacheReport.txt",
    "content": ""
  },
  {
    "path": "Content/Localization/Warriorb/Warriorb.csv",
    "content": "Date/Time,Word Count,en,es,fr,hu,ro,ru,uk,zh-Hans,zh-Hant\n2018.07.31-17.51.31,15185,15185,0,0,0,63,0,0,0,0\n2018.07.31-18.01.46,15185,15185,0,0,0,68,0,0,0,0\n2018.07.31-19.26.57,15036,15036,0,0,0,872,0,0,0,0\n2018.09.26-21.13.49,17669,17669,0,0,0,858,0,0,0,0\n2018.09.27-00.15.07,17652,17652,0,0,0,858,0,0,0,0\n2019.02.05-18.58.39,23880,23880,0,0,0,840,0,0,0,0\n2019.10.14-15.01.11,33747,33747,0,0,0,743,0,0,0,0\n2019.10.14-16.56.23,33505,33505,0,0,0,743,0,0,0,0\n2019.10.15-14.53.38,33501,33501,0,0,0,739,0,0,0,0\n2019.10.15-17.48.57,33492,33492,0,0,0,739,0,0,0,0\n2019.10.17-18.01.17,33268,33268,0,0,0,739,0,0,0,0\n2019.10.17-19.48.15,33238,33238,0,0,0,739,0,0,0,0\n2019.10.17-20.50.34,33106,33106,0,0,0,739,0,0,0,0\n2019.10.17-21.05.39,32859,32859,0,0,0,739,0,0,0,0\n2019.10.20-14.19.26,30179,30179,0,0,0,79,0,0,0,0\n2019.12.18-15.25.20,10638,10638,0,0,0,0,0,0,0,0\n2020.01.01-10.44.35,29043,29043,0,0,0,0,0,0,0,0\n2020.01.05-10.38.13,29044,29044,0,0,0,21,0,0,0,0\n2020.01.05-17.51.32,11134,11134,0,0,0,0,0,0,0,0\n2020.01.15-12.21.51,11136,11136,0,0,0,0,0,0,0,0\n2020.01.15-12.39.12,8474,8474,0,0,0,0,0,0,0,0\n2020.01.22-15.27.48,8567,8567,0,0,0,0,0,0,0,0\n2020.01.22-15.28.38,8567,8567,0,0,8013,0,0,0,0,0\n2020.01.22-16.06.05,8568,8568,0,0,8013,0,0,0,0,0\n2020.01.22-19.01.12,8568,8568,0,0,8172,0,0,0,0,0\n2020.01.25-08.56.51,8569,8569,0,0,8170,0,0,0,0,0\n2020.01.25-08.58.03,8569,8569,0,0,8172,0,0,0,0,0\n2020.01.25-09.08.29,8375,8375,0,0,8172,0,0,0,0,0\n2020.01.25-09.17.19,8375,8375,0,0,8375,0,0,0,0,0\n2020.01.25-10.30.18,8342,8342,0,0,8311,0,0,0,0,0\n2020.01.25-10.31.16,8342,8342,0,0,8313,0,0,0,0,0\n2020.01.25-10.42.29,8342,8342,0,0,8342,0,0,0,0,0\n2020.01.27-22.18.45,8174,8174,0,0,8154,0,0,0,0,0\n2020.01.27-22.19.28,8174,8174,0,0,8174,0,0,0,0,0\n2020.01.28-00.51.40,8104,8104,0,0,8104,0,0,0,0,0\n2020.01.28-15.02.34,8069,8069,0,0,8069,0,0,0,0,0\n2020.01.28-15.32.30,8042,8042,0,0,8042,0,0,0,0,0\n2020.01.28-16.12.27,7991,7991,0,0,7987,0,0,0,0,0\n2020.01.28-16.13.04,7991,7991,0,0,7991,0,0,0,0,0\n2020.01.28-19.06.17,7928,7928,0,0,7924,0,0,0,0,0\n2020.01.28-19.06.56,7928,7928,0,0,7928,0,0,0,0,0\n2020.01.28-19.54.19,7922,7922,0,0,7918,0,0,0,0,0\n2020.01.28-19.54.57,7922,7922,0,0,7922,0,0,0,0,0\n2020.01.29-11.21.21,7879,7879,0,0,7879,0,0,0,0,0\n2020.01.29-11.29.17,7877,7877,0,0,7877,0,0,0,0,0\n2020.01.29-13.02.58,7847,7847,0,0,7847,0,0,0,0,0\n2020.01.29-15.21.18,7818,7818,0,0,7818,0,0,0,0,0\n2020.01.29-15.29.28,7811,7811,0,0,7811,0,0,0,0,0\n2020.01.29-16.09.11,7777,7777,0,0,7777,0,0,0,0,0\n2020.01.29-17.40.07,7668,7668,0,0,6802,0,0,0,0,0\n2020.01.29-19.06.50,7668,7668,0,0,7668,0,0,0,0,0\n2020.01.29-19.26.08,7637,7637,0,0,6808,0,0,0,0,0\n2020.01.29-19.26.50,7637,7637,0,0,6917,0,0,0,0,0\n2020.01.29-19.37.36,7624,7624,0,0,6435,0,0,0,0,0\n2020.01.29-20.03.54,7624,7624,0,0,7624,0,0,0,0,0\n2020.01.30-13.26.23,7607,7607,0,0,7607,0,0,0,0,0\n2020.01.30-13.32.19,7475,7475,0,0,7337,0,0,0,0,0\n2020.01.30-13.32.56,7475,7475,0,0,7429,0,0,0,0,0\n2020.01.30-13.36.29,7460,7460,0,0,7414,0,0,0,0,0\n2020.01.30-13.37.03,7460,7460,0,0,7460,0,0,0,0,0\n2020.01.30-15.28.59,7405,7405,0,0,7405,0,0,0,0,0\n2020.01.30-16.19.06,7353,7353,0,0,7353,0,0,0,0,0\n2020.01.30-16.28.33,7342,7342,0,0,7342,0,0,0,0,0\n2020.01.30-18.09.29,7563,7563,0,0,6847,0,0,0,0,0\n2020.01.30-18.10.11,7563,7563,0,0,6862,0,0,0,0,0\n2020.01.30-20.29.38,7829,7829,0,0,5319,0,0,0,0,0\n2020.01.30-20.30.14,7829,7829,0,0,5366,0,0,0,0,0\n2020.01.30-21.24.51,7829,7829,0,0,7171,0,0,0,0,0\n2020.01.30-21.35.55,7829,7829,0,0,7829,0,0,0,0,0\n2020.01.31-14.32.25,7829,7829,0,0,7829,0,0,0,0,2\n2020.01.31-19.00.29,7829,7829,0,0,7829,493,0,0,0,2\n2020.01.31-19.14.23,7829,7829,0,0,7829,493,0,0,493,493\n2020.01.31-21.19.03,7834,7834,0,0,7829,493,0,0,493,493\n2020.02.01-11.38.10,7842,7842,0,0,6131,493,0,0,493,493\n2020.02.01-11.38.50,7842,7842,0,0,7842,493,0,0,493,493\n2020.02.01-11.48.46,7799,7799,0,0,7799,493,0,0,493,493\n2020.02.01-19.22.48,6016,6016,0,0,6016,491,0,0,491,491\n2020.02.01-19.29.55,7886,7886,0,0,6016,491,0,0,491,491\n2020.02.01-19.38.43,7886,7886,0,0,7776,491,0,0,491,491\n2020.02.01-19.48.11,7886,7886,0,0,7886,599,0,0,599,599\n2020.02.02-11.01.25,7892,7892,0,0,7790,595,0,0,595,595\n2020.02.02-11.07.05,7892,7892,0,0,7887,605,0,0,605,605\n2020.02.02-11.48.00,7892,7892,0,0,7892,605,0,0,605,605\n2020.02.02-12.35.22,7894,7894,0,0,7885,605,0,0,605,605\n2020.02.02-12.43.16,7894,7894,0,0,7888,608,0,0,608,608\n2020.02.02-12.48.21,7894,7894,0,0,7894,608,0,0,608,608\n2020.02.02-13.20.40,7864,7864,0,0,7864,608,0,0,608,608\n2020.02.02-13.45.20,7858,7858,0,0,7858,608,0,0,608,608\n2020.02.03-23.22.29,7858,7858,0,0,7835,585,0,0,585,585\n2020.02.03-23.23.14,7858,7858,0,0,7835,656,0,0,585,585\n2020.02.03-23.30.35,7858,7858,0,0,7858,656,0,0,608,608\n2020.02.04-13.13.05,7823,7823,0,0,7823,651,0,0,608,608\n2020.02.04-14.16.06,7822,7822,0,0,7792,651,0,0,608,608\n2020.02.04-14.16.38,7822,7822,0,0,7792,1041,0,0,608,608\n2020.02.04-15.53.37,7822,7822,0,0,7517,1041,0,0,608,608\n2020.02.04-15.54.13,7822,7822,0,0,7536,1227,0,0,608,608\n2020.02.04-16.30.08,7822,7822,0,0,7495,1227,0,0,608,608\n2020.02.04-16.30.44,7822,7822,0,0,7770,1227,0,0,608,608\n2020.02.04-16.37.41,7822,7822,0,0,7811,1227,0,0,608,608\n2020.02.04-16.43.48,7835,7835,0,0,7810,1227,0,0,608,608\n2020.02.04-16.54.17,7818,7818,0,0,7793,1210,0,0,608,608\n2020.02.04-19.26.16,7818,7818,0,0,7675,1210,0,0,608,608\n2020.02.04-19.26.51,7818,7818,0,0,7675,1401,0,0,608,608\n2020.02.04-20.27.08,7821,7821,0,0,7482,1401,0,0,608,608\n2020.02.04-20.27.44,7821,7821,0,0,7600,1949,0,0,608,608\n2020.02.04-20.52.39,7822,7822,0,0,7600,1949,0,0,608,608\n2020.02.04-20.53.17,7822,7822,0,0,7774,1949,0,0,608,608\n2020.02.04-20.56.45,7822,7822,0,0,7797,1949,0,0,608,608\n2020.02.05-12.09.19,7823,7823,0,0,7682,1949,0,0,608,608\n2020.02.05-12.09.53,7823,7823,0,0,7682,2421,0,0,608,608\n2020.02.05-12.20.43,7823,7823,0,0,7755,2421,0,0,608,608\n2020.02.05-14.05.57,7850,7850,0,0,7552,2421,0,0,608,608\n2020.02.05-14.06.32,7850,7850,0,0,7595,3722,0,0,608,608\n2020.02.05-14.13.46,7853,7853,0,0,7582,3722,0,0,608,608\n2020.02.05-14.28.10,7853,7853,0,0,7803,3968,0,0,608,608\n2020.02.05-18.00.01,7836,7836,0,0,7103,3966,0,0,606,606\n2020.02.05-18.00.38,7836,7836,0,0,7103,4993,0,0,606,606\n2020.02.05-19.07.24,7836,7836,0,0,7073,4993,0,0,606,606\n2020.02.05-19.08.00,7836,7836,0,0,7693,5626,0,0,606,606\n2020.02.05-19.18.59,7836,7836,0,0,7786,5719,0,0,606,606\n2020.02.05-19.41.45,7836,7836,0,0,7774,5719,0,0,606,606\n2020.02.06-14.13.24,7836,7836,0,0,7364,5719,0,0,606,606\n2020.02.06-14.13.58,7836,7836,0,0,7364,7180,0,0,606,606\n2020.02.06-14.21.00,7806,7806,0,0,7334,7180,0,0,606,606\n2020.02.06-14.50.18,7808,7808,0,0,7305,7180,0,0,606,606\n2020.02.06-14.50.56,7808,7808,0,0,7718,7768,0,0,606,606\n2020.02.06-14.55.20,7808,7808,0,0,7758,7808,0,0,606,606\n2020.02.06-18.42.51,7808,7808,0,0,7731,7781,0,0,606,606\n2020.02.10-10.16.23,7808,7808,0,0,7758,7808,0,0,606,606\n2020.02.17-12.09.40,7817,7817,0,0,7758,7808,0,0,606,606\n2020.02.17-12.10.18,7817,7817,0,0,7808,7808,0,0,606,606\n2020.02.17-12.24.53,7810,7810,0,0,7808,7808,0,0,606,606\n2020.02.17-12.30.23,7808,7808,0,0,7808,7808,0,0,606,606\n2020.02.27-11.25.17,7760,7760,0,0,7506,7506,0,0,606,606\n2020.02.27-12.05.24,7760,7760,0,0,7760,7760,0,0,606,606\n2020.03.02-13.48.22,7789,7789,0,0,7717,7717,0,0,606,606\n2020.03.02-15.15.38,7789,7789,0,0,7760,7760,0,0,606,606\n2020.03.05-17.27.04,7760,7760,0,0,7760,7760,0,0,606,606\n2020.03.06-11.20.25,7760,7760,0,0,7094,7094,0,0,606,606\n2020.03.06-12.44.21,7760,7760,0,0,7760,7760,0,0,606,606\n2020.03.06-17.13.36,7759,7759,0,0,7759,7759,0,0,605,605\n2020.03.10-23.21.21,7759,7759,0,0,7759,7759,7759,0,605,605\n2020.03.13-09.24.15,7759,7759,0,7742,7759,7759,7759,0,605,605\n2020.03.13-10.13.40,7754,7754,0,7742,7754,7754,7754,0,605,605\n2020.03.13-12.03.47,7742,7742,0,7742,7742,7742,7742,0,605,605\n2020.03.16-09.56.20,7762,7762,0,7742,7742,7742,7742,0,605,605\n2020.03.16-09.56.54,7762,7762,7742,7742,7742,7742,7742,0,605,605\n2020.03.16-10.15.28,7742,7742,7742,7742,7742,7742,7742,0,605,605\n2020.03.16-10.24.24,7742,7742,7742,7742,7742,7742,7742,0,7125,7125\n2020.03.27-09.51.59,8285,8285,7742,7742,7742,7742,7742,0,7125,7125\n2020.03.28-08.17.39,8291,8291,7662,7662,7662,7662,7662,0,7045,7045\n2020.03.28-09.49.57,8291,8291,7662,7662,7662,7662,7662,0,7070,7045\n2020.03.30-13.40.04,8291,8291,7745,7745,7662,7662,8291,0,7070,7045\n2020.04.02-12.34.36,8291,8291,8291,7745,7662,7662,8291,0,7070,7045\n2020.04.02-14.56.00,8291,8291,8291,7745,7662,7745,8291,0,7070,7045\n2020.04.06-15.20.18,8291,8291,8291,8291,7662,7745,8291,0,7070,7045\n2020.04.07-18.27.20,8291,8291,8291,8291,7662,7745,8291,0,7745,7045\n2020.04.17-23.32.27,8289,8289,7745,7745,7662,7745,7745,0,7745,7045\n2020.04.19-22.15.33,8289,8289,8289,8289,7662,7745,8289,0,7745,7045\n2020.04.20-13.30.21,8289,8289,8289,8289,8289,7745,8289,0,7745,7045\n2020.04.20-15.49.34,8289,8289,8289,8289,8289,7745,8289,0,7745,7720\n2020.04.21-20.10.34,8289,8289,8289,8289,8289,7745,8289,0,7745,7745\n2020.04.26-21.38.51,8334,8334,8289,8289,8289,7745,8289,0,7745,7745\n2020.04.26-21.51.27,8289,8289,8289,8289,8289,7745,8289,0,7745,7745\n2020.05.13-14.33.29,8300,8300,8289,8289,8289,7745,8289,0,7745,7745\n2020.06.06-11.10.24,8302,8302,8289,8289,8289,7745,8289,0,7745,7745\n2020.06.06-11.33.08,8300,8300,8289,8289,8289,7745,8289,0,7745,7745\n2020.06.25-10.50.59,8300,8300,8289,8289,8300,7745,8289,0,7745,7745\n2020.06.29-17.22.47,8300,8300,8257,8257,8268,7713,8257,0,7713,7713\n2020.06.29-17.23.20,8300,8300,8268,8268,8279,7724,8268,0,7724,7724\n2020.06.29-19.07.52,8300,8300,8289,8289,8300,7745,8289,0,7745,7745\n2020.06.29-19.42.10,8300,8300,8289,8300,8300,7756,8300,0,7756,7756\n2020.06.29-22.45.03,8300,8300,8278,8289,8289,7745,8289,0,7745,7745\n2020.07.01-22.33.27,8300,8300,8289,8289,8289,7745,8289,0,7745,7745\n"
  },
  {
    "path": "Content/Localization/Warriorb/Warriorb_Conflicts.txt",
    "content": ""
  },
  {
    "path": "Content/Localization/Warriorb/en/Warriorb.po",
    "content": "﻿# Warriorb English translation.\n# Copyright 1998-2019 Epic Games, Inc. All Rights Reserved.\n# \nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: Warriorb\\n\"\n\"POT-Creation-Date: 2020-10-07 08:12\\n\"\n\"PO-Revision-Date: 2020-10-07 08:12\\n\"\n\"Language-Team: \\n\"\n\"Language: en\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Plural-Forms: nplurals=2; plural=(n != 1);\\n\"\n\n#. Key:\t78A72CB345FCC7ECDCFD8181471D78D8\n#. SourceLocation:\t/Game/SO/GUI/UI_Credits.UI_Credits_C:WidgetTree.CreditsText.Text\n#: /Game/SO/GUI/UI_Credits.UI_Credits_C:WidgetTree.CreditsText.Text\nmsgid \"<T>-- Not Yet Team --</>\\r\\n\\r\\n\\r\\nAnna Molnár\\r\\n<R>2D art, Environment Design</>\\r\\n\\r\\n\\r\\nCsaba Molnár\\r\\n<R>Code, Design</>\\r\\n\\r\\n\\r\\nDaniel Butum\\r\\n<R>Code</>\\r\\n\\r\\n\\r\\nGéza Molnár\\r\\n<R>3D art, Design</>\\r\\n\\r\\n\\r\\nRichárd Ráski\\r\\n<R>Sound Design</>\\r\\n\\r\\n\\r\\n\\r\\n<T>-- Music --</>\\r\\n\\r\\nBenjámin Kuli\\r\\n\\r\\n\\r\\nGisula\\r\\n\\r\\n\\r\\n\\r\\n<T>-- Voice Over --</>\\r\\n\\r\\n\\r\\nPeter Luzsi - @peterluzsi\\r\\n<R>WarriOrb, Gatekeeper, Ghost Armor, Principal</>\\r\\n\\r\\n\\r\\nBrent Miller\\r\\n<R>WarriOrb - Trailer</>\\r\\n\\r\\n\\r\\nPierce Riola\\r\\n<R>Wizard, Gnory</>\\r\\n\\r\\n\\r\\nEir Causey\\r\\n<R>Raven, Teachy, Ghost Dwarf, Unknown Wizard, Fishy</>\\r\\n\\r\\n\\r\\nJack Broadbent\\r\\n<R>Monk, Flybug</>\\r\\n\\r\\n\\r\\nEmil Hagg\\r\\n<R>Supper Dwarf, Kobold Chef, Fallen Druid, Dwarven Statue</>\\r\\n\\r\\n\\r\\nErick Nita\\r\\n<R>Golem Maker, Armour Wrath</>\\r\\n\\r\\n\\r\\nAlain Vega\\r\\n<R>Merch Ant</>\\r\\n\\r\\n\\r\\nAngela Tran\\r\\n<R>Lillian, Pipe Walker</>\\r\\n\\r\\n\\r\\nBrittany Ann Phillips\\r\\n<R>Lory</>\\r\\n\\r\\n\\r\\nAurore Gautheur\\r\\n<R>Fountain, Shade</>\\r\\n\\r\\n\\r\\nAlexander Blairlex\\r\\n<R>Primitive Fishy, Ghost Helmet</>\\r\\n\\r\\n\\r\\nSophie Ryder\\r\\n<R>Shadesphere</>\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n<T>-- Partners --</>\\r\\n\\r\\n\\r\\nMaple Whispering\\r\\n<R>Chineese localization</>\\r\\n<R>Publisher - China, PC</>\\r\\n\\r\\n\\r\\nNovy Unlimited\\r\\n<R>PR and Marketing</>\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n<T>-- Localization --</>\\r\\n\\r\\n\\r\\nVera Liscovschi\\r\\n<R>Russian</>\\r\\n\\r\\n\\r\\nJay Johnstone\\r\\n<R>Spanish</>\\r\\n\\r\\n\\r\\nBertin William\\r\\n<R>French</>\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n<T>-- Testers --</>\\r\\n\\r\\n\\r\\nSaleymander\\r\\n\\r\\n\\r\\nHitch\\r\\n\\r\\n\\r\\nMrCalculated\\r\\n\\r\\n\\r\\n<img id=\\\"Rainbow\\\"/>Scorpion253<img id=\\\"Rainbow\\\"/>\\r\\n\\r\\n\\r\\nmoses\\r\\n\\r\\n\\r\\nNinjin42\\r\\n\\r\\n\\r\\nKonstantinos Xenitidis\\r\\n\\r\\n\\r\\nPhyronnaz\\r\\n\\r\\n\\r\\nArthur\\r\\n\\r\\n\\r\\nMaster1G\\r\\n\\r\\n\\r\\nDávid Bartók\\r\\n\\r\\n\\r\\nLiDuGaming\\r\\n\\r\\n\\r\\nClaudiu Coman\\r\\n\\r\\n\\r\\nÁron Ürögdi\\r\\n\\r\\n\\r\\nDukenukemboi\\r\\n\\r\\n\\r\\nBart Cools\\r\\n\\r\\n\\r\\nGlenn De Jonghe\\r\\n\\r\\n\\r\\nDomonkos Péter Madarász\\r\\n\\r\\n\\r\\nGergő Gyarmati\\r\\n\\r\\n\\r\\nRéka Gyarmati\\r\\n\\r\\n\\r\\nKincső Petraskó\\r\\n\\r\\n\\r\\nGergő Petraskó\\r\\n\\r\\n\\r\\nDániel Garamvölgyi\\r\\n\\r\\n\\r\\nDanny \\\"GHelmet\\\" Cloutier\\r\\n\\r\\n\\r\\nAnna Boglárka Tóth\\r\\n\\r\\n\\r\\nBíborka Roxána Kubik\\r\\n\\r\\n\\r\\nVirág Miklós\\r\\n\\r\\n\\r\\nBenedek Marozsák\\r\\n\\r\\n\\r\\nDániel Marozsák\\r\\n\\r\\n\\r\\nGereon Bartel\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n<T>-- Prologue Speedrun Competition Winner --</>\\r\\n\\r\\n-7\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n<T>-- Special Thanks --</>\\r\\n\\r\\n\\r\\nMalazan Discord Server Community\\r\\n\\r\\n\\r\\n/r/metroidvenia Discord Server Community\\r\\n\\r\\n\\r\\nUnreal Slackers Discord Server Community\\r\\n\\r\\n\\r\\nIMGUR\\r\\n\\r\\n\\r\\nBíborka Roxána Kubik\\r\\n\\r\\n\\r\\nSergiu Crăiţoiu\\r\\n\\r\\n\\r\\nJuhász Ernő\\r\\n\\r\\n\\r\\nRacheal Smith\\r\\n\\r\\n\\r\\nRuxandra Seniuc\\r\\n\\r\\n\\r\\nthottee\\r\\n\\r\\n\\r\\nAndrew Pappas\\r\\n\\r\\n\\r\\nJonathan Lampel\\r\\n\\r\\n\\r\\nRichárd Németh\\r\\n\\r\\n\\r\\nAlex Gorcea\\r\\n\\r\\n\\r\\nNotRealVitor\\r\\n\\r\\n\\r\\nKinga Surján\\r\\n\\r\\n\\r\\nAnna Boglárka Tóth\\r\\n\\r\\n\\r\\nÉvi Fekete\\r\\n\\r\\n\\r\\nGergő Sielaf\\r\\n\\r\\n\\r\\n<img id=\\\"Rainbow\\\"/>Scorpion253<img id=\\\"Rainbow\\\"/>\\r\\n\\r\\n\\r\\nMainiac\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n<T>-- Technology --</>\\r\\n\\r\\n\\r\\n<R>WarriOrb uses the Unreal® Engine.</>\\r\\n<R>Unreal® is a trademark or registered trademark of Epic Games, Inc. in the United States of America and elsewhere</>\\r\\n\\r\\n<R>Unreal® Engine, Copyright 1998 – 2020, Epic Games, Inc. All rights reserved.</>\\r\\n\\r\\n\\r\\n\\r\\n<R>Made with FMOD Studio by Firelight Technologies Pty Ltd.</>\"\nmsgstr \"<T>-- Not Yet Team --</>\\r\\n\\r\\n\\r\\nAnna Molnár\\r\\n<R>2D art, Environment Design</>\\r\\n\\r\\n\\r\\nCsaba Molnár\\r\\n<R>Code, Design</>\\r\\n\\r\\n\\r\\nDaniel Butum\\r\\n<R>Code</>\\r\\n\\r\\n\\r\\nGéza Molnár\\r\\n<R>3D art, Design</>\\r\\n\\r\\n\\r\\nRichárd Ráski\\r\\n<R>Sound Design</>\\r\\n\\r\\n\\r\\n\\r\\n<T>-- Music --</>\\r\\n\\r\\nBenjámin Kuli\\r\\n\\r\\n\\r\\nGisula\\r\\n\\r\\n\\r\\n\\r\\n<T>-- Voice Over --</>\\r\\n\\r\\n\\r\\nPeter Luzsi - @peterluzsi\\r\\n<R>WarriOrb, Gatekeeper, Ghost Armor, Principal</>\\r\\n\\r\\n\\r\\nBrent Miller\\r\\n<R>WarriOrb - Trailer</>\\r\\n\\r\\n\\r\\nPierce Riola\\r\\n<R>Wizard, Gnory</>\\r\\n\\r\\n\\r\\nEir Causey\\r\\n<R>Raven, Teachy, Ghost Dwarf, Unknown Wizard, Fishy</>\\r\\n\\r\\n\\r\\nJack Broadbent\\r\\n<R>Monk, Flybug</>\\r\\n\\r\\n\\r\\nEmil Hagg\\r\\n<R>Supper Dwarf, Kobold Chef, Fallen Druid, Dwarven Statue</>\\r\\n\\r\\n\\r\\nErick Nita\\r\\n<R>Golem Maker, Armour Wrath</>\\r\\n\\r\\n\\r\\nAlain Vega\\r\\n<R>Merch Ant</>\\r\\n\\r\\n\\r\\nAngela Tran\\r\\n<R>Lillian, Pipe Walker</>\\r\\n\\r\\n\\r\\nBrittany Ann Phillips\\r\\n<R>Lory</>\\r\\n\\r\\n\\r\\nAurore Gautheur\\r\\n<R>Fountain, Shade</>\\r\\n\\r\\n\\r\\nAlexander Blairlex\\r\\n<R>Primitive Fishy, Ghost Helmet</>\\r\\n\\r\\n\\r\\nSophie Ryder\\r\\n<R>Shadesphere</>\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n<T>-- Partners --</>\\r\\n\\r\\n\\r\\nMaple Whispering\\r\\n<R>Chineese localization</>\\r\\n<R>Publisher - China, PC</>\\r\\n\\r\\n\\r\\nNovy Unlimited\\r\\n<R>PR and Marketing</>\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n<T>-- Localization --</>\\r\\n\\r\\n\\r\\nVera Liscovschi\\r\\n<R>Russian</>\\r\\n\\r\\n\\r\\nJay Johnstone\\r\\n<R>Spanish</>\\r\\n\\r\\n\\r\\nBertin William\\r\\n<R>French</>\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n<T>-- Testers --</>\\r\\n\\r\\n\\r\\nSaleymander\\r\\n\\r\\n\\r\\nHitch\\r\\n\\r\\n\\r\\nMrCalculated\\r\\n\\r\\n\\r\\n<img id=\\\"Rainbow\\\"/>Scorpion253<img id=\\\"Rainbow\\\"/>\\r\\n\\r\\n\\r\\nmoses\\r\\n\\r\\n\\r\\nNinjin42\\r\\n\\r\\n\\r\\nKonstantinos Xenitidis\\r\\n\\r\\n\\r\\nPhyronnaz\\r\\n\\r\\n\\r\\nArthur\\r\\n\\r\\n\\r\\nMaster1G\\r\\n\\r\\n\\r\\nDávid Bartók\\r\\n\\r\\n\\r\\nLiDuGaming\\r\\n\\r\\n\\r\\nClaudiu Coman\\r\\n\\r\\n\\r\\nÁron Ürögdi\\r\\n\\r\\n\\r\\nDukenukemboi\\r\\n\\r\\n\\r\\nBart Cools\\r\\n\\r\\n\\r\\nGlenn De Jonghe\\r\\n\\r\\n\\r\\nDomonkos Péter Madarász\\r\\n\\r\\n\\r\\nGergő Gyarmati\\r\\n\\r\\n\\r\\nRéka Gyarmati\\r\\n\\r\\n\\r\\nKincső Petraskó\\r\\n\\r\\n\\r\\nGergő Petraskó\\r\\n\\r\\n\\r\\nDániel Garamvölgyi\\r\\n\\r\\n\\r\\nDanny \\\"GHelmet\\\" Cloutier\\r\\n\\r\\n\\r\\nAnna Boglárka Tóth\\r\\n\\r\\n\\r\\nBíborka Roxána Kubik\\r\\n\\r\\n\\r\\nVirág Miklós\\r\\n\\r\\n\\r\\nBenedek Marozsák\\r\\n\\r\\n\\r\\nDániel Marozsák\\r\\n\\r\\n\\r\\nGereon Bartel\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n<T>-- Prologue Speedrun Competition Winner --</>\\r\\n\\r\\n-7\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n<T>-- Special Thanks --</>\\r\\n\\r\\n\\r\\nMalazan Discord Server Community\\r\\n\\r\\n\\r\\n/r/metroidvenia Discord Server Community\\r\\n\\r\\n\\r\\nUnreal Slackers Discord Server Community\\r\\n\\r\\n\\r\\nIMGUR\\r\\n\\r\\n\\r\\nBíborka Roxána Kubik\\r\\n\\r\\n\\r\\nSergiu Crăiţoiu\\r\\n\\r\\n\\r\\nJuhász Ernő\\r\\n\\r\\n\\r\\nRacheal Smith\\r\\n\\r\\n\\r\\nRuxandra Seniuc\\r\\n\\r\\n\\r\\nthottee\\r\\n\\r\\n\\r\\nAndrew Pappas\\r\\n\\r\\n\\r\\nJonathan Lampel\\r\\n\\r\\n\\r\\nRichárd Németh\\r\\n\\r\\n\\r\\nAlex Gorcea\\r\\n\\r\\n\\r\\nNotRealVitor\\r\\n\\r\\n\\r\\nKinga Surján\\r\\n\\r\\n\\r\\nAnna Boglárka Tóth\\r\\n\\r\\n\\r\\nÉvi Fekete\\r\\n\\r\\n\\r\\nGergő Sielaf\\r\\n\\r\\n\\r\\n<img id=\\\"Rainbow\\\"/>Scorpion253<img id=\\\"Rainbow\\\"/>\\r\\n\\r\\n\\r\\nMainiac\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n<T>-- Technology --</>\\r\\n\\r\\n\\r\\n<R>WarriOrb uses the Unreal® Engine.</>\\r\\n<R>Unreal® is a trademark or registered trademark of Epic Games, Inc. in the United States of America and elsewhere</>\\r\\n\\r\\n<R>Unreal® Engine, Copyright 1998 – 2020, Epic Games, Inc. All rights reserved.</>\\r\\n\\r\\n\\r\\n\\r\\n<R>Made with FMOD Studio by Firelight Technologies Pty Ltd.</>\"\n\n#. Key:\tAxeSpecial_name\n#. SourceLocation:\t/Game/SO/CharacterStrikes/AxeSpecial.AxeSpecial.StrikeName\n#: /Game/SO/CharacterStrikes/AxeSpecial.AxeSpecial.StrikeName\nmsgctxt \"CharacterStrike\"\nmsgid \"Throw\"\nmsgstr \"Throw\"\n\n#. Key:\tDemonSwordSpecial_name\n#. SourceLocation:\t/Game/SO/CharacterStrikes/DemonSwordSpecial.DemonSwordSpecial.StrikeName\n#: /Game/SO/CharacterStrikes/DemonSwordSpecial.DemonSwordSpecial.StrikeName\nmsgctxt \"CharacterStrike\"\nmsgid \"Downstrike\"\nmsgstr \"Downstrike\"\n\n#. Key:\tDualBladeSpecial_name\n#. SourceLocation:\t/Game/SO/CharacterStrikes/DualBladeSpecial.DualBladeSpecial.StrikeName\n#: /Game/SO/CharacterStrikes/DualBladeSpecial.DualBladeSpecial.StrikeName\nmsgctxt \"CharacterStrike\"\nmsgid \"Backslash\"\nmsgstr \"Backslash\"\n\n#. Key:\tLeafMaceSpecial_name\n#. SourceLocation:\t/Game/SO/CharacterStrikes/LeafMaceSpecial.LeafMaceSpecial.StrikeName\n#: /Game/SO/CharacterStrikes/LeafMaceSpecial.LeafMaceSpecial.StrikeName\nmsgctxt \"CharacterStrike\"\nmsgid \"Crushing Blow\"\nmsgstr \"Crushing Blow\"\n\n#. Key:\tSabreSpecial_name\n#. SourceLocation:\t/Game/SO/CharacterStrikes/SabreSpecial.SabreSpecial.StrikeName\n#: /Game/SO/CharacterStrikes/SabreSpecial.SabreSpecial.StrikeName\nmsgctxt \"CharacterStrike\"\nmsgid \"Floating Strikes\"\nmsgstr \"Floating Strikes\"\n\n#. Key:\tSwordSpecialAirStrike_name\n#. SourceLocation:\t/Game/SO/CharacterStrikes/SwordSpecialAirStrike.SwordSpecialAirStrike.StrikeName\n#: /Game/SO/CharacterStrikes/SwordSpecialAirStrike.SwordSpecialAirStrike.StrikeName\nmsgctxt \"CharacterStrike\"\nmsgid \"Air Strike\"\nmsgstr \"Air Strike\"\n\n#. Key:\tBPEftAttackSpeedMultiplier_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/BPEftAttackSpeedMultiplier.Default__BPEftAttackSpeedMultiplier_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/BPEftAttackSpeedMultiplier.Default__BPEftAttackSpeedMultiplier_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Quick Hands\"\nmsgstr \"Quick Hands\"\n\n#. Key:\tBPEftBootTransmutation_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/BPEftBootTransmutation.Default__BPEftBootTransmutation_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/BPEftBootTransmutation.Default__BPEftBootTransmutation_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Protective Transmutation\"\nmsgstr \"Protective Transmutation\"\n\n#. Key:\tBPEftBounce_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftBounce.Default__BPEftBounce_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftBounce.Default__BPEftBounce_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Charged Bounce\"\nmsgstr \"Charged Bounce\"\n\n#. Key:\tBPEftCooldownReducePassive02_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/BPEftCooldownReducePassive02.Default__BPEftCooldownReducePassive02_C.DisplayName\n#. Key:\tBPEftCooldownReduce_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/BPEftCooldownReduce.Default__BPEftCooldownReduce_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/BPEftCooldownReduce.Default__BPEftCooldownReduce_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/BPEftCooldownReducePassive02.Default__BPEftCooldownReducePassive02_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Restlessness\"\nmsgstr \"Restlessness\"\n\n#. Key:\tBPEftCriticalChanceBoost10_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/BPEftCriticalChanceBoost10.Default__BPEftCriticalChanceBoost10_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/BPEftCriticalChanceBoost10.Default__BPEftCriticalChanceBoost10_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Critical Chance\"\nmsgstr \"Critical Chance\"\n\n#. Key:\tBPEftDamageReflection_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/BPEftDamageReflection.Default__BPEftDamageReflection_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/BPEftDamageReflection.Default__BPEftDamageReflection_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Sparks of Vengeance\"\nmsgstr \"Sparks of Vengeance\"\n\n#. Key:\tBPEftDmgModifier_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftDmgModifier.Default__BPEftDmgModifier_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftDmgModifier.Default__BPEftDmgModifier_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Perfect Hands\"\nmsgstr \"Perfect Hands\"\n\n#. Key:\tBPEftHeal3_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/BPEftHeal3.Default__BPEftHeal3_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/BPEftHeal3.Default__BPEftHeal3_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Heal\"\nmsgstr \"Heal\"\n\n#. Key:\tBPEftLifeLeech5_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/BPEftLifeLeech5.Default__BPEftLifeLeech5_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/BPEftLifeLeech5.Default__BPEftLifeLeech5_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Life Leech\"\nmsgstr \"Life Leech\"\n\n#. Key:\tBPEftMagicMissle_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftMagicMissle.Default__BPEftMagicMissle_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftMagicMissle.Default__BPEftMagicMissle_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Magic Missile\"\nmsgstr \"Magic Missile\"\n\n#. Key:\tBPEftMassMagicMissle_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftMassMagicMissle.Default__BPEftMassMagicMissle_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftMassMagicMissle.Default__BPEftMassMagicMissle_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Magic Missiles\"\nmsgstr \"Magic Missiles\"\n\n#. Key:\tBPEftMassSlow_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftMassSlow.Default__BPEftMassSlow_C.DisplayName\n#. Key:\tBPEftSlow_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/BPEftSlow.Default__BPEftSlow_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/BPEftSlow.Default__BPEftSlow_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftMassSlow.Default__BPEftMassSlow_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Slow\"\nmsgstr \"Slow\"\n\n#. Key:\tBPEftMeteorShower_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftMeteorShower.Default__BPEftMeteorShower_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftMeteorShower.Default__BPEftMeteorShower_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Meteor Shower\"\nmsgstr \"Meteor Shower\"\n\n#. Key:\tBPEftRegainSpellPassive25_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/BPEftRegainSpellPassive25.Default__BPEftRegainSpellPassive25_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/BPEftRegainSpellPassive25.Default__BPEftRegainSpellPassive25_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Arcane Luck\"\nmsgstr \"Arcane Luck\"\n\n#. Key:\tBPEftRegainSpells_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/BPEftRegainSpells.Default__BPEftRegainSpells_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/BPEftRegainSpells.Default__BPEftRegainSpells_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Restoration\"\nmsgstr \"Restoration\"\n\n#. Key:\tBPEftResModifierMagicalStrong_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftResModifierMagicalStrong.Default__BPEftResModifierMagicalStrong_C.DisplayName\n#. Key:\tBPEftResModifierMagical_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftResModifierMagical.Default__BPEftResModifierMagical_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftResModifierMagical.Default__BPEftResModifierMagical_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftResModifierMagicalStrong.Default__BPEftResModifierMagicalStrong_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Wardskin\"\nmsgstr \"Wardskin\"\n\n#. Key:\tBPEftResModifierPhysical_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftResModifierPhysical.Default__BPEftResModifierPhysical_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftResModifierPhysical.Default__BPEftResModifierPhysical_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Stoneskin\"\nmsgstr \"Stoneskin\"\n\n#. Key:\tBPEftSecondChance_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/BPEftSecondChance.Default__BPEftSecondChance_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/BPEftSecondChance.Default__BPEftSecondChance_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Second Chance\"\nmsgstr \"Second Chance\"\n\n#. Key:\tBPEftSpellFire0_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftSpellFire0.Default__BPEftSpellFire0_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftSpellFire0.Default__BPEftSpellFire0_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Firestrike\"\nmsgstr \"Firestrike\"\n\n#. Key:\tBPEftSpellLightningWalk_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftSpellLightningWalk.Default__BPEftSpellLightningWalk_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftSpellLightningWalk.Default__BPEftSpellLightningWalk_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Shockwalk\"\nmsgstr \"Shockwalk\"\n\n#. Key:\tBPEftSpellShadowWalk_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftSpellShadowWalk.Default__BPEftSpellShadowWalk_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftSpellShadowWalk.Default__BPEftSpellShadowWalk_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Shadewalk\"\nmsgstr \"Shadewalk\"\n\n#. Key:\tBPEftSpellShield_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftSpellShield.Default__BPEftSpellShield_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftSpellShield.Default__BPEftSpellShield_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Shield\"\nmsgstr \"Shield\"\n\n#. Key:\tBPEftSpellSoulKeeper_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftSpellSoulKeeper.Default__BPEftSpellSoulKeeper_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftSpellSoulKeeper.Default__BPEftSpellSoulKeeper_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Soulbind\"\nmsgstr \"Soulbind\"\n\n#. Key:\tBPEftStun_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/BPEftStun.Default__BPEftStun_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/BPEftStun.Default__BPEftStun_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Stun\"\nmsgstr \"Stun\"\n\n#. Key:\tBPEftStunPassive10_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/BPEftStunPassive10.Default__BPEftStunPassive10_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/BPEftStunPassive10.Default__BPEftStunPassive10_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Stun Chance\"\nmsgstr \"Stun Chance\"\n\n#. Key:\tBPEftSwap_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftSwap.Default__BPEftSwap_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftSwap.Default__BPEftSwap_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Swap\"\nmsgstr \"Swap\"\n\n#. Key:\tBPEftTempHPMagical_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftTempHPMagical.Default__BPEftTempHPMagical_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftTempHPMagical.Default__BPEftTempHPMagical_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Magical Protection\"\nmsgstr \"Magical Protection\"\n\n#. Key:\tBPEftTempHPPhysical_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftTempHPPhysical.Default__BPEftTempHPPhysical_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftTempHPPhysical.Default__BPEftTempHPPhysical_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Physical Protection\"\nmsgstr \"Physical Protection\"\n\n#. Key:\tBPEftWeaponFlamesTimeBased_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/BPEftWeaponFlamesTimeBased.Default__BPEftWeaponFlamesTimeBased_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/BPEftWeaponFlamesTimeBased.Default__BPEftWeaponFlamesTimeBased_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Greenflame\"\nmsgstr \"Greenflame\"\n\n#. Key:\tBPEftWorthy_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/BPEftWorthy.Default__BPEftWorthy_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/BPEftWorthy.Default__BPEftWorthy_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Worthy\"\nmsgstr \"Worthy\"\n\n#. Key:\t1E42901841F4C7CEF39536A762076EDF\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.UI_EndScreen_SaveCreatures_C:WidgetTree.TBC1.Text\n#. Key:\t5D04206A499A8B42AF77BAA8BC9B4B8B\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.UI_EndScreen_SaveCreatures_C:WidgetTree.TBC0.Text\n#. Key:\tB0EEBB754110D2821640BE990002AC36\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.UI_EndScreen_SaveCreatures_C:WidgetTree.TBC2.Text\n#. Key:\tD75DCE214B56BA6FD9A58F9EEA9291A5\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.UI_EndScreen_C:WidgetTree.TBC0.Text\n#: /Game/SO/GUI/InGame/UI_EndScreen.UI_EndScreen_C:WidgetTree.TBC0.Text\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.UI_EndScreen_SaveCreatures_C:WidgetTree.TBC0.Text\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.UI_EndScreen_SaveCreatures_C:WidgetTree.TBC1.Text\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.UI_EndScreen_SaveCreatures_C:WidgetTree.TBC2.Text\nmsgctxt \"EndScreen\"\nmsgid \"With his quest completed Monk decided to look for another activity. He thought: <Quote>‘If I could resist madness, others should be able to do the same.’</> And so he opened a monastery to share his mental training techniques with anyone willing to save its sanity.\"\nmsgstr \"With his quest completed Monk decided to look for another activity. He thought: <Quote>‘If I could resist madness, others should be able to do the same.’</> And so he opened a monastery to share his mental training techniques with anyone willing to save its sanity.\"\n\n#. Key:\t7279EA4741D3DAC5AE92EB99AB851ED9\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.UI_EndScreen_SaveCreatures_C:WidgetTree.TBD0.Text\n#. Key:\t77E809914A65796364FE94B8C2361FD7\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.UI_EndScreen_SaveCreatures_C:WidgetTree.TBD2.Text\n#. Key:\t9C1B477D4582ABAEDC90FCB3AC6737E7\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.UI_EndScreen_C:WidgetTree.TBD0.Text\n#. Key:\tE98C3FDD453FF80CA8EBBE94459A5CAF\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.UI_EndScreen_SaveCreatures_C:WidgetTree.TBD1.Text\n#: /Game/SO/GUI/InGame/UI_EndScreen.UI_EndScreen_C:WidgetTree.TBD0.Text\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.UI_EndScreen_SaveCreatures_C:WidgetTree.TBD0.Text\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.UI_EndScreen_SaveCreatures_C:WidgetTree.TBD1.Text\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.UI_EndScreen_SaveCreatures_C:WidgetTree.TBD2.Text\nmsgctxt \"EndScreen\"\nmsgid \"<Size42>Separating the World also changed something in the Ruined Realm. The wind turned and even Ruin stopped for a moment.</>\"\nmsgstr \"<Size42>Separating the World also changed something in the Ruined Realm. The wind turned and even Ruin stopped for a moment.</>\"\n\n#. Key:\t9B476D3D4A603658683498B09968F8AA\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.UI_EndScreen_C:WidgetTree.TBB0.Text\n#: /Game/SO/GUI/InGame/UI_EndScreen.UI_EndScreen_C:WidgetTree.TBB0.Text\nmsgctxt \"EndScreen\"\nmsgid \"When he heard about the lost Kobold tribe he got a bit excited.<Quote>‘Kobolds reserved the ancient knowledge in their rituals’</> he said. <Quote>‘If there is something we can do with Ruin it must be connected to the rituals. I’ll go with you.’</>\"\nmsgstr \"When he heard about the lost Kobold tribe he got a bit excited.<Quote>‘Kobolds reserved the ancient knowledge in their rituals’</> he said. <Quote>‘If there is something we can do with Ruin it must be connected to the rituals. I’ll go with you.’</>\"\n\n#. Key:\tDF7F9F754F4FC9CB19DF92AFCE96C5C1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.UI_EndScreen_SaveCreatures_C:WidgetTree.TBA2.Text\n#. Key:\tE8401550448E14DD70717EB7EED0582B\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.UI_EndScreen_SaveCreatures_C:WidgetTree.TBA1.Text\n#. Key:\tUI_EndScreen_entry_0_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(0).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(0).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.UI_EndScreen_SaveCreatures_C:WidgetTree.TBA1.Text\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.UI_EndScreen_SaveCreatures_C:WidgetTree.TBA2.Text\nmsgctxt \"EndScreen\"\nmsgid \"The people soon forgot about the threat, some of them argued that Ruin ever existed.\"\nmsgstr \"The people soon forgot about the threat, some of them argued that Ruin ever existed.\"\n\n#. Key:\tE9F6E1064D5B2046DF1DEDA386012E2D\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.UI_EndScreen_C:WidgetTree.TBB2.Text\n#. Key:\tUI_EndScreen_entry_6_text_2\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(6).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(6).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.UI_EndScreen_C:WidgetTree.TBB2.Text\nmsgctxt \"EndScreen\"\nmsgid \"He opened a monastery to share his mental training techniques with anyone willing to save its sanity.\"\nmsgstr \"He opened a monastery to share his mental training techniques with anyone willing to save its sanity.\"\n\n#. Key:\tF0EAD93B44D8D7AEF306EAB75D83FB37\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.UI_EndScreen_C:WidgetTree.TBB1.Text\n#: /Game/SO/GUI/InGame/UI_EndScreen.UI_EndScreen_C:WidgetTree.TBB1.Text\nmsgctxt \"EndScreen\"\nmsgid \"<Quote>‘If I could resist madness, others should be able to do the same’</> - he thought.\"\nmsgstr \"<Quote>‘If I could resist madness, others should be able to do the same’</> - he thought.\"\n\n#. Key:\tUI_EndScreen_entry_0_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(0).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(0).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Once the Boundaries of Worlds were sealed, Ruin could do no harm to the Human Realm again.\"\nmsgstr \"Once the Boundaries of Worlds were sealed, Ruin could do no harm to the Human Realm again.\"\n\n#. Key:\tUI_EndScreen_entry_10_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(10).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(10).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Hearing these news made the Chef really excited.\"\nmsgstr \"Hearing these news made the Chef really excited.\"\n\n#. Key:\tUI_EndScreen_entry_10_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(10).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(10).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"<Quote>'Could there be other survivors of my tribe?'</>\"\nmsgstr \"<Quote>'Could there be other survivors of my tribe?'</>\"\n\n#. Key:\tUI_EndScreen_entry_10_text_2\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(10).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(10).EndingLogic.Texts(2).Texts\nmsgctxt \"EndScreen\"\nmsgid \"He decided to leave his kitchen and search for his lost relatives.\"\nmsgstr \"He decided to leave his kitchen and search for his lost relatives.\"\n\n#. Key:\tUI_EndScreen_entry_11_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(11).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(11).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"No one knows how he could possibly know about the soup, but Supper Dwarf also appeared to taste the food.\"\nmsgstr \"No one knows how he could possibly know about the soup, but Supper Dwarf also appeared to taste the food.\"\n\n#. Key:\tUI_EndScreen_entry_11_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(11).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(11).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"When he heard that the chef is leaving he offered his help with the trains.\"\nmsgstr \"When he heard that the chef is leaving he offered his help with the trains.\"\n\n#. Key:\tUI_EndScreen_entry_11_text_2\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(11).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(11).EndingLogic.Texts(2).Texts\nmsgctxt \"EndScreen\"\nmsgid \"<Quote>‘And I would also like to check what do they eat for supper.’</> he said. <Quote>‘I’m going with you.’</>\"\nmsgstr \"<Quote>‘And I would also like to check what do they eat for supper.’</> he said. <Quote>‘I’m going with you.’</>\"\n\n#. Key:\tUI_EndScreen_entry_12_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(12).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(12).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"On their way they stopped by the Golem Maker.\"\nmsgstr \"On their way they stopped by the Golem Maker.\"\n\n#. Key:\tUI_EndScreen_entry_12_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(12).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(12).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"He was just sitting and staring at nothing.\"\nmsgstr \"He was just sitting and staring at nothing.\"\n\n#. Key:\tUI_EndScreen_entry_12_text_2\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(12).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(12).EndingLogic.Texts(2).Texts\nmsgctxt \"EndScreen\"\nmsgid \"It was still hard for the Maker to accept that all his work was for nothing.\"\nmsgstr \"It was still hard for the Maker to accept that all his work was for nothing.\"\n\n#. Key:\tUI_EndScreen_entry_12_text_3\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(12).EndingLogic.Texts(3).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(12).EndingLogic.Texts(3).Texts\nmsgctxt \"EndScreen\"\nmsgid \"At least he stopped creating mindless stone golems.\"\nmsgstr \"At least he stopped creating mindless stone golems.\"\n\n#. Key:\tUI_EndScreen_entry_13_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(13).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(13).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"When he heard about the lost Kobold tribe he got a bit excited.\"\nmsgstr \"When he heard about the lost Kobold tribe he got a bit excited.\"\n\n#. Key:\tUI_EndScreen_entry_13_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(13).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(13).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"<Quote>‘Kobolds reserved the ancient knowledge in their rituals’</> he said.\"\nmsgstr \"<Quote>‘Kobolds reserved the ancient knowledge in their rituals’</> he said.\"\n\n#. Key:\tUI_EndScreen_entry_13_text_2\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(13).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(13).EndingLogic.Texts(2).Texts\nmsgctxt \"EndScreen\"\nmsgid \"<Quote>‘If there is something we can do with Ruin it must be connected to the rituals. I’ll go with you.’</>\"\nmsgstr \"<Quote>‘If there is something we can do with Ruin it must be connected to the rituals. I’ll go with you.’</>\"\n\n#. Key:\tUI_EndScreen_entry_14_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(14).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(14).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"However there are things which never change.\"\nmsgstr \"However there are things which never change.\"\n\n#. Key:\tUI_EndScreen_entry_14_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(14).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(14).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"After days of arguing on who undermined whose business Lory and Gnory separated once again.\"\nmsgstr \"After days of arguing on who undermined whose business Lory and Gnory separated once again.\"\n\n#. Key:\tUI_EndScreen_entry_15_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(15).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(15).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"While they were arguing Fishy decided to leave Gnory and set out on his own.\"\nmsgstr \"While they were arguing Fishy decided to leave Gnory and set out on his own.\"\n\n#. Key:\tUI_EndScreen_entry_15_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(15).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(15).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"He had no idea where he was going.\"\nmsgstr \"He had no idea where he was going.\"\n\n#. Key:\tUI_EndScreen_entry_16_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(16).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(16).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"After weeks of walking alone, he heard a faint excited voice:\"\nmsgstr \"After weeks of walking alone, he heard a faint excited voice:\"\n\n#. Key:\tUI_EndScreen_entry_1_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(1).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(1).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"The Mage Council didn’t believe a single word Lillian or Scholar told them about the events.\"\nmsgstr \"The Mage Council didn’t believe a single word Lillian or Scholar told them about the events.\"\n\n#. Key:\tUI_EndScreen_entry_1_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(1).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(1).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"They claimed that Wizard died in an unfortunate accident and his device could never actually work anyway.\"\nmsgstr \"They claimed that Wizard died in an unfortunate accident and his device could never actually work anyway.\"\n\n#. Key:\tUI_EndScreen_entry_2_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(2).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(2).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Although Lillian inherited her father’s castle she was sent to an Orphanage until she came into age to live on her own.\"\nmsgstr \"Although Lillian inherited her father’s castle she was sent to an Orphanage until she came into age to live on her own.\"\n\n#. Key:\tUI_EndScreen_entry_2_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(2).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(2).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Scholar was upset by Lillian’s decision on letting the Ruined Realm fall but he promised Lillian that he will make the Wizard’s Council let Lillian live in his estate.\"\nmsgstr \"Scholar was upset by Lillian’s decision on letting the Ruined Realm fall but he promised Lillian that he will make the Wizard’s Council let Lillian live in his estate.\"\n\n#. Key:\tUI_EndScreen_entry_3_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(3).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(3).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Lillian didn't let the unfortunate events to overcome her. She stopped Ruin even if no one believed her.\"\nmsgstr \"Lillian didn't let the unfortunate events to overcome her. She stopped Ruin even if no one believed her.\"\n\n#. Key:\tUI_EndScreen_entry_3_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(3).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(3).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"She also knew that the Ruined Realm still had at least a half century before it was totally destroyed so she decided to keep on looking for a way to save it.\"\nmsgstr \"She also knew that the Ruined Realm still had at least a half century before it was totally destroyed so she decided to keep on looking for a way to save it.\"\n\n#. Key:\tUI_EndScreen_entry_3_text_2\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(3).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(3).EndingLogic.Texts(2).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Now that her own Realm was safe she could focus on the other Realms.\"\nmsgstr \"Now that her own Realm was safe she could focus on the other Realms.\"\n\n#. Key:\tUI_EndScreen_entry_4_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(4).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(4).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"<Size42>Separating the World also changed something in the Ruined Realm.</>\"\nmsgstr \"<Size42>Separating the World also changed something in the Ruined Realm.</>\"\n\n#. Key:\tUI_EndScreen_entry_4_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(4).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(4).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"<Size42>The wind turned and even Ruin stopped for a moment.</>\"\nmsgstr \"<Size42>The wind turned and even Ruin stopped for a moment.</>\"\n\n#. Key:\tUI_EndScreen_entry_5_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(5).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(5).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"When it was certain that no one will be saved from Ruin, as a last desperate act Gate Keeper tried to open a Gate to the Human Realm himself.\"\nmsgstr \"When it was certain that no one will be saved from Ruin, as a last desperate act Gate Keeper tried to open a Gate to the Human Realm himself.\"\n\n#. Key:\tUI_EndScreen_entry_5_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(5).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(5).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"A portal opened and swallowed the Keeper.\"\nmsgstr \"A portal opened and swallowed the Keeper.\"\n\n#. Key:\tUI_EndScreen_entry_5_text_2\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(5).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(5).EndingLogic.Texts(2).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Some believed he survived but no one ever met him again.\"\nmsgstr \"Some believed he survived but no one ever met him again.\"\n\n#. Key:\tUI_EndScreen_entry_6_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(6).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(6).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"With his quest completed Monk decided to look for another activity.\"\nmsgstr \"With his quest completed Monk decided to look for another activity.\"\n\n#. Key:\tUI_EndScreen_entry_6_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(6).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(6).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"<Quote>‘If I could resist madness, shouldn't others be able to do the same?’</>- he wondered.\"\nmsgstr \"<Quote>‘If I could resist madness, shouldn't others be able to do the same?’</>- he wondered.\"\n\n#. Key:\tUI_EndScreen_entry_7_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(7).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(7).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"To the surprise of many Teachy also joined Monk and soon he became his best student.\"\nmsgstr \"To the surprise of many Teachy also joined Monk and soon he became his best student.\"\n\n#. Key:\tUI_EndScreen_entry_7_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(7).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(7).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"<Quote>‘To be honest I never actually wanted to be a teacher‘</> - said Teachy.\"\nmsgstr \"<Quote>‘To be honest I never actually wanted to be a teacher‘</> - said Teachy.\"\n\n#. Key:\tUI_EndScreen_entry_7_text_2\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(7).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(7).EndingLogic.Texts(2).Texts\nmsgctxt \"EndScreen\"\nmsgid \"<Quote>'I also knew that I was a bit mad and since for my insane mind training in a monastery looked like a crazy idea I immediately knew that in fact that's the most sane thing to do.’</>\"\nmsgstr \"<Quote>'I also knew that I was a bit mad and since for my insane mind training in a monastery looked like a crazy idea I immediately knew that in fact that's the most sane thing to do.’</>\"\n\n#. Key:\tUI_EndScreen_entry_8_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(8).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(8).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Losing his connection to his master, Raven had to think again about his purpose.\"\nmsgstr \"Losing his connection to his master, Raven had to think again about his purpose.\"\n\n#. Key:\tUI_EndScreen_entry_8_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(8).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(8).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"<Quote>‘I think therefore I am not a bird’</> - he said.\"\nmsgstr \"<Quote>‘I think therefore I am not a bird’</> - he said.\"\n\n#. Key:\tUI_EndScreen_entry_8_text_2\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(8).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(8).EndingLogic.Texts(2).Texts\nmsgctxt \"EndScreen\"\nmsgid \"With his vast experience he couldn’t become the same thoughtless bird he once was.\"\nmsgstr \"With his vast experience he couldn’t become the same thoughtless bird he once was.\"\n\n#. Key:\tUI_EndScreen_entry_8_text_3\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(8).EndingLogic.Texts(3).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(8).EndingLogic.Texts(3).Texts\nmsgctxt \"EndScreen\"\nmsgid \"He joined Monk’s monastery to teach philosophy.\"\nmsgstr \"He joined Monk’s monastery to teach philosophy.\"\n\n#. Key:\tUI_EndScreen_entry_8_text_4\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(8).EndingLogic.Texts(4).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(8).EndingLogic.Texts(4).Texts\nmsgctxt \"EndScreen\"\nmsgid \"In his free hours he kept on studying the Ancient’s technology hoping that one day he will find a way back to Lillian.\"\nmsgstr \"In his free hours he kept on studying the Ancient’s technology hoping that one day he will find a way back to Lillian.\"\n\n#. Key:\tUI_EndScreen_entry_9_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(9).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(9).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"When the soup was almost ready the Pipe Walkers smelled the flavour and they all gathered for a last dinner.\"\nmsgstr \"When the soup was almost ready the Pipe Walkers smelled the flavour and they all gathered for a last dinner.\"\n\n#. Key:\tUI_EndScreen_entry_9_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(9).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(9).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"After lunch they started to talk.\"\nmsgstr \"After lunch they started to talk.\"\n\n#. Key:\tUI_EndScreen_entry_9_text_2\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(9).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(9).EndingLogic.Texts(2).Texts\nmsgctxt \"EndScreen\"\nmsgid \"One of the Pipe Walkers, who had been in many cages mentioned that she actually met some kobolds far away.\"\nmsgstr \"One of the Pipe Walkers, who had been in many cages mentioned that she actually met some kobolds far away.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_0_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(0).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(0).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"By the time the furious crowd broke into the Wizard’s Castle the Device was completely destroyed.\"\nmsgstr \"By the time the furious crowd broke into the Wizard’s Castle the Device was completely destroyed.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_0_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(0).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(0).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Some left, others started to investigate the building hoping to find something which might stop Ruin.\"\nmsgstr \"Some left, others started to investigate the building hoping to find something which might stop Ruin.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_10_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(10).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(10).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"<Quote>‘Kobolds reserved the ancient knowledge in their rituals’</> Golem Maker said. <Quote>‘If there is something we can do with Ruin it must be connected to the rituals. I’ll go with you.’</>\"\nmsgstr \"<Quote>‘Kobolds reserved the ancient knowledge in their rituals’</> Golem Maker said. <Quote>‘If there is something we can do with Ruin it must be connected to the rituals. I’ll go with you.’</>\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_10_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(10).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(10).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Golem Maker was a huge help to Lillian with his knowledge on Golemology and it was not easy for Lillian to let him go.\"\nmsgstr \"Golem Maker was a huge help to Lillian with his knowledge on Golemology and it was not easy for Lillian to let him go.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_10_text_2\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(10).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(10).EndingLogic.Texts(2).Texts\nmsgctxt \"EndScreen\"\nmsgid \"<Quote>‘Have no fear!’</> Golem Maker said. <Quote>‘I will return with even more knowledge and we’ll stop Ruin once and for all.’</>\"\nmsgstr \"<Quote>‘Have no fear!’</> Golem Maker said. <Quote>‘I will return with even more knowledge and we’ll stop Ruin once and for all.’</>\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_11_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(11).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(11).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"After Kobold Chef left, Supper Dwarf had to take care of the kitchen.\"\nmsgstr \"After Kobold Chef left, Supper Dwarf had to take care of the kitchen.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_11_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(11).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(11).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"It turned out that he is also really talented at making food.\"\nmsgstr \"It turned out that he is also really talented at making food.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_11_text_2\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(11).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(11).EndingLogic.Texts(2).Texts\nmsgctxt \"EndScreen\"\nmsgid \"<Quote> ‘That is because I know exactly what the final result should be’</> he explained.\"\nmsgstr \"<Quote> ‘That is because I know exactly what the final result should be’</> he explained.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_11_text_3\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(11).EndingLogic.Texts(3).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(11).EndingLogic.Texts(3).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Later he opened a restaurant which soon became really popular.\"\nmsgstr \"Later he opened a restaurant which soon became really popular.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_11_text_4\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(11).EndingLogic.Texts(4).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(11).EndingLogic.Texts(4).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Some say mostly because he hired Pipe Walkers to serve the meal and for marketing purposes.\"\nmsgstr \"Some say mostly because he hired Pipe Walkers to serve the meal and for marketing purposes.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_12_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(12).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(12).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Monk decided to stay in the Ruined Realm.\"\nmsgstr \"Monk decided to stay in the Ruined Realm.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_12_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(12).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(12).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"<Quote>‘Even if it was not enough I did all I could. I’m done.’</> he said.\"\nmsgstr \"<Quote>‘Even if it was not enough I did all I could. I’m done.’</> he said.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_12_text_2\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(12).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(12).EndingLogic.Texts(2).Texts\nmsgctxt \"EndScreen\"\nmsgid \"He sat down on a mountaintop and started meditating.\"\nmsgstr \"He sat down on a mountaintop and started meditating.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_13_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(13).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(13).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"A few weeks later he realized that even though he failed his quest he still should do something.\"\nmsgstr \"A few weeks later he realized that even though he failed his quest he still should do something.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_13_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(13).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(13).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"<Quote>‘Due to my training I can resist Ruin’</> he thought. <Quote>‘No one has ever seen what’s there where Ruin destroyed the lands. If I train harder I might be able to get closer to Ruin to see what it really is.’</>\"\nmsgstr \"<Quote>‘Due to my training I can resist Ruin’</> he thought. <Quote>‘No one has ever seen what’s there where Ruin destroyed the lands. If I train harder I might be able to get closer to Ruin to see what it really is.’</>\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_13_text_2\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(13).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(13).EndingLogic.Texts(2).Texts\nmsgctxt \"EndScreen\"\nmsgid \"He kept on practising and soon set out on a journey into the heart of Ruin to find answers to questions even he didn’t know.\"\nmsgstr \"He kept on practising and soon set out on a journey into the heart of Ruin to find answers to questions even he didn’t know.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_14_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(14).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(14).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Lory and Gnory suddenly found themselves in a world full of possible customers.\"\nmsgstr \"Lory and Gnory suddenly found themselves in a world full of possible customers.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_14_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(14).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(14).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Of course it didn’t mean they stopped arguing on who undermined whose business but finally they both had the chance to run a successful trading company.\"\nmsgstr \"Of course it didn’t mean they stopped arguing on who undermined whose business but finally they both had the chance to run a successful trading company.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_15_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(15).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(15).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Gnory specialized himself in selling medicine which were said to heal the sickness which was spreading as Ruin reached closer.\"\nmsgstr \"Gnory specialized himself in selling medicine which were said to heal the sickness which was spreading as Ruin reached closer.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_15_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(15).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(15).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Lory specialized in medicine which were said to heal the sickness which was caused by the medicine of Gnory.\"\nmsgstr \"Lory specialized in medicine which were said to heal the sickness which was caused by the medicine of Gnory.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_16_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(16).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(16).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Lory’s herbaria worked out.\"\nmsgstr \"Lory’s herbaria worked out.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_16_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(16).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(16).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Soon she started to sell other medicine and healing devices as well.\"\nmsgstr \"Soon she started to sell other medicine and healing devices as well.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_17_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(17).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(17).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"As for Gnory, he decided to sell lots of different things in the City Prison which turned out to be his new home for a while.\"\nmsgstr \"As for Gnory, he decided to sell lots of different things in the City Prison which turned out to be his new home for a while.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_18_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(18).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(18).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Fishy didn’t like the medicine business so he left Gnory.\"\nmsgstr \"Fishy didn’t like the medicine business so he left Gnory.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_18_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(18).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(18).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"He joined Monk for a while to learn the mental training techniques which reserved Monk’s sanity.\"\nmsgstr \"He joined Monk for a while to learn the mental training techniques which reserved Monk’s sanity.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_18_text_2\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(18).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(18).EndingLogic.Texts(2).Texts\nmsgctxt \"EndScreen\"\nmsgid \"<Quote>‘Fishy think it is important’ </>he said.<Quote> ‘If Monk go to see Ruin, Fishy need to learn it.’</>\"\nmsgstr \"<Quote>‘Fishy think it is important’ </>he said.<Quote> ‘If Monk go to see Ruin, Fishy need to learn it.’</>\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_18_text_3\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(18).EndingLogic.Texts(3).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(18).EndingLogic.Texts(3).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Monk accepted Fishy as his apprentice and taught him all that was possible.\"\nmsgstr \"Monk accepted Fishy as his apprentice and taught him all that was possible.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_18_text_4\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(18).EndingLogic.Texts(4).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(18).EndingLogic.Texts(4).Texts\nmsgctxt \"EndScreen\"\nmsgid \"<Quote>‘Now is the time’</> Monk said one day. <Quote>’Go to the Human Realm and prepare the people.’</>\"\nmsgstr \"<Quote>‘Now is the time’</> Monk said one day. <Quote>’Go to the Human Realm and prepare the people.’</>\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_19_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(19).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(19).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"On his way to the Human Realm Fishy heard a faint excited voice:\"\nmsgstr \"On his way to the Human Realm Fishy heard a faint excited voice:\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_19_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(19).EndingLogic.Texts(1).Texts\n#. Key:\tUI_EndScreen_entry_16_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(16).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(16).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(19).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"<Quote>‘Hey there! I’m fed up with microtransactions. Can I go with ya man?’</>\"\nmsgstr \"<Quote>‘Hey there! I’m fed up with microtransactions. Can I go with ya man?’</>\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_19_text_2\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(19).EndingLogic.Texts(2).Texts\n#. Key:\tUI_EndScreen_entry_16_text_2\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(16).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(16).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(19).EndingLogic.Texts(2).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Merch Ant and Fishy soon became best friends and ventured on together.\"\nmsgstr \"Merch Ant and Fishy soon became best friends and ventured on together.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_1_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(1).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(1).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"A few hours later members of the Mage Council arrived along with the city guards.\"\nmsgstr \"A few hours later members of the Mage Council arrived along with the city guards.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_1_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(1).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(1).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"The Council claimed that Wizard died in an unfortunate accident, his device could never actually work anyway and Ruin is nothing to fear of.\"\nmsgstr \"The Council claimed that Wizard died in an unfortunate accident, his device could never actually work anyway and Ruin is nothing to fear of.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_1_text_2\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(1).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(1).EndingLogic.Texts(2).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Although it was total nonsense Lillian and Scholar was happy that the crowd were taken away from the Castle.\"\nmsgstr \"Although it was total nonsense Lillian and Scholar was happy that the crowd were taken away from the Castle.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_20_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(20).EndingLogic.Texts(0).Texts\n#. Key:\tUI_EndScreen_entry_17_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(17).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(17).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(20).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"The World was still about to end, but as one Pipe Walker wisely said:\"\nmsgstr \"The World was still about to end, but as one Pipe Walker wisely said:\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_21_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(21).EndingLogic.Texts(0).Texts\n#. Key:\tUI_EndScreen_entry_18_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(18).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(18).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(21).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"As some stories ended some new ones begun. Though what happened afterwards is not yet known.\"\nmsgstr \"As some stories ended some new ones begun. Though what happened afterwards is not yet known.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_2_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(2).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(2).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"When they were left alone they quickly started the evacuation of the Ruined Realm.\"\nmsgstr \"When they were left alone they quickly started the evacuation of the Ruined Realm.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_3_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(3).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(3).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Even though she lost her father Lillian couldn’t afford to let sadness overcome her.\"\nmsgstr \"Even though she lost her father Lillian couldn’t afford to let sadness overcome her.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_3_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(3).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(3).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Ruin was more of a threat now than ever before, and since the Mage Council didn’t believe in Ruin it was the task of Lillian and Scholar to repair the device.\"\nmsgstr \"Ruin was more of a threat now than ever before, and since the Mage Council didn’t believe in Ruin it was the task of Lillian and Scholar to repair the device.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_4_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(4).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(4).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Scholar was really proud of Lillian because she managed to save time for the evacuation.\"\nmsgstr \"Scholar was really proud of Lillian because she managed to save time for the evacuation.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_4_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(4).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(4).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"<Quote>‘I know Wizard would have disagreed but you did the right thing. We still have time to face Ruin. We couldn’t let everyone die there.’</>\"\nmsgstr \"<Quote>‘I know Wizard would have disagreed but you did the right thing. We still have time to face Ruin. We couldn’t let everyone die there.’</>\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_5_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(5).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(5).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"As time passed Scholar started to behave a bit odd which made Lillian really anxious.\"\nmsgstr \"As time passed Scholar started to behave a bit odd which made Lillian really anxious.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_5_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(5).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(5).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Ruin was close and the solution was still far away.\"\nmsgstr \"Ruin was close and the solution was still far away.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_5_text_2\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(5).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(5).EndingLogic.Texts(2).Texts\nmsgctxt \"EndScreen\"\nmsgid \"When she talked about her concerns to Raven, the bird said:\"\nmsgstr \"When she talked about her concerns to Raven, the bird said:\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_5_text_3\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(5).EndingLogic.Texts(3).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(5).EndingLogic.Texts(3).Texts\nmsgctxt \"EndScreen\"\nmsgid \"<Quote>‘Focus on what you are doing Lillian. He was a bit odd anyway.’</>\"\nmsgstr \"<Quote>‘Focus on what you are doing Lillian. He was a bit odd anyway.’</>\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_6_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(6).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(6).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"To the surprise of many Teachy turned out to be an excellent researcher.\"\nmsgstr \"To the surprise of many Teachy turned out to be an excellent researcher.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_6_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(6).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(6).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"<Quote>‘To be honest I never wanted to be a teacher’ </>he said. <Quote>‘I only stayed at University so that I can do some more research work. But my students never let me research during lectures.’</>\"\nmsgstr \"<Quote>‘To be honest I never wanted to be a teacher’ </>he said. <Quote>‘I only stayed at University so that I can do some more research work. But my students never let me research during lectures.’</>\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_6_text_2\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(6).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(6).EndingLogic.Texts(2).Texts\nmsgctxt \"EndScreen\"\nmsgid \"He joined Lillian and dug into every book he could possibly find on the Ancient’s technology.\"\nmsgstr \"He joined Lillian and dug into every book he could possibly find on the Ancient’s technology.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_7_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(7).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(7).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"The new environment and being a bit further from Ruin made good to the Gate Keeper.\"\nmsgstr \"The new environment and being a bit further from Ruin made good to the Gate Keeper.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_7_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(7).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(7).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"He organized some of the cleaners to repair the Castle so that Lillian can keep on with her work.\"\nmsgstr \"He organized some of the cleaners to repair the Castle so that Lillian can keep on with her work.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_7_text_2\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(7).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(7).EndingLogic.Texts(2).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Later he started to remember things from the Runic Realm which helped Lillian a lot.\"\nmsgstr \"Later he started to remember things from the Runic Realm which helped Lillian a lot.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_8_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(8).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(8).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"One day a Pipe Walker, who had been in many cages mentioned that she met some kobolds far away who might be other survivors of the Kobold Chef’s tribe.\"\nmsgstr \"One day a Pipe Walker, who had been in many cages mentioned that she met some kobolds far away who might be other survivors of the Kobold Chef’s tribe.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_9_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(9).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(9).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Hearing this news made Kobold Chef really excited.\"\nmsgstr \"Hearing this news made Kobold Chef really excited.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_9_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(9).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(9).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"He decided to return to the Ruined Realm and search for his lost relatives.\"\nmsgstr \"He decided to return to the Ruined Realm and search for his lost relatives.\"\n\n#. Key:\tSoAct1_EG_AAFirstDroneTrio_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Drones were even more intelligent than Maintainers. They not only memorized texts, they helped correct grammar, changed the message if it was too insulting or even made up poems if they were asked to do so.\"\nmsgstr \"Drones were even more intelligent than Maintainers. They not only memorized texts, they helped correct grammar, changed the message if it was too insulting or even made up poems if they were asked to do so.\"\n\n#. Key:\tSoAct1_EG_AAFirstDroneTrio_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"The Flying Three\"\nmsgstr \"The Flying Three\"\n\n#. Key:\tSoAct1_EG_AfterGateCleaners_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Citizens of Cerulean requested to have their own unique Golems, but it was always rejected. This situation was very good for the Black Golem Market, because this way it was always easy to find customers.\"\nmsgstr \"Citizens of Cerulean requested to have their own unique Golems, but it was always rejected. This situation was very good for the Black Golem Market, because this way it was always easy to find customers.\"\n\n#. Key:\tSoAct1_EG_AfterGateCleaners_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Cleaners of Cerulean\"\nmsgstr \"Cleaners of Cerulean\"\n\n#. Key:\tSoAct1_EG_AfterGateElits_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"The Runic Realm's Government didn't allow the Golems to become the privilege of the rich. Even though the elite were not allowed to have different Golems they always found a way to make their servants different than the ones owned by the poor.\"\nmsgstr \"The Runic Realm's Government didn't allow the Golems to become the privilege of the rich. Even though the elite were not allowed to have different Golems they always found a way to make their servants different than the ones owned by the poor.\"\n\n#. Key:\tSoAct1_EG_AfterGateElits_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Capetainers\"\nmsgstr \"Capetainers\"\n\n#. Key:\tSoAct1_EG_AGRightFromPortal_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"'Just keep cleaning! Cleaning, cleaning...'\"\nmsgstr \"'Just keep cleaning! Cleaning, cleaning...'\"\n\n#. Key:\tSoAct1_EG_AGRightFromPortal_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Cleaner Invasion\"\nmsgstr \"Cleaner Invasion\"\n\n#. Key:\tSoAct1_EG_AGTestStoneCircle_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"The Black Golem Market was funded by a Golem Maker apprentice who failed his master exam and was banished from school. No wonder his golems were... unique.\"\nmsgstr \"The Black Golem Market was funded by a Golem Maker apprentice who failed his master exam and was banished from school. No wonder his golems were... unique.\"\n\n#. Key:\tSoAct1_EG_AGTestStoneCircle_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Weird Golems\"\nmsgstr \"Weird Golems\"\n\n#. Key:\tSoAct1_EG_AGWallJumpTeam_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"The cleaning plan for this area fell apart with the participants.\"\nmsgstr \"The cleaning plan for this area fell apart with the participants.\"\n\n#. Key:\tSoAct1_EG_AGWallJumpTeam_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"The North Team\"\nmsgstr \"The North Team\"\n\n#. Key:\tSoAct1_EG_ArcadeDungeonCleaners_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"The Golem's behaviour was specified by the Golem Makers. Only very simple personalities were made at the beginning. The Cleaners, for example, only desired to keep the place tidy and make sure they don't harm the people.\"\nmsgstr \"The Golem's behaviour was specified by the Golem Makers. Only very simple personalities were made at the beginning. The Cleaners, for example, only desired to keep the place tidy and make sure they don't harm the people.\"\n\n#. Key:\tSoAct1_EG_ArcadeDungeonCleaners_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Arcade Cleaners\"\nmsgstr \"Arcade Cleaners\"\n\n#. Key:\tSoAct1_EG_ArcadeDungeonExit_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"After creating intelligence Golem Makers wanted even more. They wanted complex personality. They wanted Golems that can not only think but also feel. That was the idea behind designing the Gatekeepers.\"\nmsgstr \"After creating intelligence Golem Makers wanted even more. They wanted complex personality. They wanted Golems that can not only think but also feel. That was the idea behind designing the Gatekeepers.\"\n\n#. Key:\tSoAct1_EG_ArcadeDungeonExit_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Arcade Servants\"\nmsgstr \"Arcade Servants\"\n\n#. Key:\tSoAct1_EG_ArcadeDungeonOptional_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"You might wonder if a Vacuum Cleaner is designed to clean dust away why does it need a laser caster?\"\nmsgstr \"You might wonder if a Vacuum Cleaner is designed to clean dust away why does it need a laser caster?\"\n\n#. Key:\tSoAct1_EG_ArcadeDungeonOptional_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Vacuum Cleaners group\"\nmsgstr \"Vacuum Cleaners group\"\n\n#. Key:\tSoAct1_EG_ArcadeMaintainers_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"The very first Golems were made to do the most monotonic work so that people have more time to think and to create. Once they were friendly but as Ruin came their behaviour changed.\"\nmsgstr \"The very first Golems were made to do the most monotonic work so that people have more time to think and to create. Once they were friendly but as Ruin came their behaviour changed.\"\n\n#. Key:\tSoAct1_EG_ArcadeMaintainers_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Arcade Cleaner Golems\"\nmsgstr \"Arcade Cleaner Golems\"\n\n#. Key:\tSoAct1_EG_Chest_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"The poor chest was minding his own business before you started to insult him.\"\nmsgstr \"The poor chest was minding his own business before you started to insult him.\"\n\n#. Key:\tSoAct1_EG_Chest_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Chest\"\nmsgstr \"Chest\"\n\n#. Key:\tSoAct1_EG_GGMiniBoss_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Maybe it only depends on the creation process, but some Golems had stronger personality. In general, Golems with more intelligence resisted Ruin longer and Golems with strong personality were more vulnerable to the infection.\"\nmsgstr \"Maybe it only depends on the creation process, but some Golems had stronger personality. In general, Golems with more intelligence resisted Ruin longer and Golems with strong personality were more vulnerable to the infection.\"\n\n#. Key:\tSoAct1_EG_GGMiniBoss_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Wickeds\"\nmsgstr \"Wickeds\"\n\n#. Key:\tSoAct1_EG_LoneDrone_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Drones delivered messages and gifts before Ruin. People were happy when they heard them approaching back then.\"\nmsgstr \"Drones delivered messages and gifts before Ruin. People were happy when they heard them approaching back then.\"\n\n#. Key:\tSoAct1_EG_LoneDrone_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Lone Drone\"\nmsgstr \"Lone Drone\"\n\n#. Key:\tSoAct1_EG_LoneSewerDrone_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"After Ruin most Golems liked to group together. Only a few chose to stay alone.\"\nmsgstr \"After Ruin most Golems liked to group together. Only a few chose to stay alone.\"\n\n#. Key:\tSoAct1_EG_LoneSewerDrone_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Another Lone Drone\"\nmsgstr \"Another Lone Drone\"\n\n#. Key:\tSoAct1_EG_MaceGroup_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"'Attention: our enemies greatest weapon, the holy Mace is stolen. We truly should have destroyed it as the Council suggested.'\"\nmsgstr \"'Attention: our enemies greatest weapon, the holy Mace is stolen. We truly should have destroyed it as the Council suggested.'\"\n\n#. Key:\tSoAct1_EG_MaceGroup_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Mace Defenders\"\nmsgstr \"Mace Defenders\"\n\n#. Key:\tSoAct1_EG_MaintainerInvestigatorInvestigators_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"After Ruin, Golems started to have strange behavior. There were a group of them who used the pipes to flood a part of the City. Later these places were called the Sewer.\"\nmsgstr \"After Ruin, Golems started to have strange behavior. There were a group of them who used the pipes to flood a part of the City. Later these places were called the Sewer.\"\n\n#. Key:\tSoAct1_EG_MaintainerInvestigatorInvestigators_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Pipe Golems\"\nmsgstr \"Pipe Golems\"\n\n#. Key:\tSoAct1_EG_MaintainerInvestigators_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Not only the Golems were created by using the Spirits of the Unknown World before Ruin. People found other ways of using this new technology. They created pipes to convey hot water to heat the city and cold water to drink.\"\nmsgstr \"Not only the Golems were created by using the Spirits of the Unknown World before Ruin. People found other ways of using this new technology. They created pipes to convey hot water to heat the city and cold water to drink.\"\n\n#. Key:\tSoAct1_EG_MaintainerInvestigators_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Maintainers of the Pipes\"\nmsgstr \"Maintainers of the Pipes\"\n\n#. Key:\tSoAct1_EG_SABeforeWallJump_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Some believed cold can resist Ruin longer than magic. They created places where they kept the temperature beneath the freezing point. As it turned out, not even coldness can resist Ruin forever.\"\nmsgstr \"Some believed cold can resist Ruin longer than magic. They created places where they kept the temperature beneath the freezing point. As it turned out, not even coldness can resist Ruin forever.\"\n\n#. Key:\tSoAct1_EG_SABeforeWallJump_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Cleaners of the Refrigerator.\"\nmsgstr \"Cleaners of the Refrigerator.\"\n\n#. Key:\tSoAct1_EG_SAFightMustHave_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"'We won't clear anymore!' said the rebel Maintainer.\\r\\n'Let's declear War!'\"\nmsgstr \"'We won't clear anymore!' said the rebel Maintainer.\\r\\n'Let's declear War!'\"\n\n#. Key:\tSoAct1_EG_SAFightMustHave_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Underground Cleaner Band\"\nmsgstr \"Underground Cleaner Band\"\n\n#. Key:\tSoAct1_EG_SAFightOptional_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"'Let's make something clear. Maybe this room?'\"\nmsgstr \"'Let's make something clear. Maybe this room?'\"\n\n#. Key:\tSoAct1_EG_SAFightOptional_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Underground Cleaner Band B\"\nmsgstr \"Underground Cleaner Band B\"\n\n#. Key:\tSoAct1_EG_SewerCircleVacuumCleaners_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"People realised that Golem's Spirits have a power beyond imagination. They called it the Ancient Magic. Vacuum Cleaners could use this magic to do their job even better.\"\nmsgstr \"People realised that Golem's Spirits have a power beyond imagination. They called it the Ancient Magic. Vacuum Cleaners could use this magic to do their job even better.\"\n\n#. Key:\tSoAct1_EG_SewerCircleVacuumCleaners_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Vacuum Cleaners\"\nmsgstr \"Vacuum Cleaners\"\n\n#. Key:\tSoAct1_EG_SewerTeam_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Golem Makers wanted to create something more intelligent as they learned more. They shaped the Maintainers, the first golems capable of talking. Sadly their intelligence vanished as Ruin came.\"\nmsgstr \"Golem Makers wanted to create something more intelligent as they learned more. They shaped the Maintainers, the first golems capable of talking. Sadly their intelligence vanished as Ruin came.\"\n\n#. Key:\tSoAct1_EG_SewerTeam_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Sewer Golems\"\nmsgstr \"Sewer Golems\"\n\n#. Key:\tSoAct1_EG_TL_VacuumTwins_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Libraries were important in the life of the former Realm's citizens. No wonder that many of the golems were created only to dust and organize the books.\"\nmsgstr \"Libraries were important in the life of the former Realm's citizens. No wonder that many of the golems were created only to dust and organize the books.\"\n\n#. Key:\tSoAct1_EG_TL_VacuumTwins_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Library Cleaners\"\nmsgstr \"Library Cleaners\"\n\n#. Key:\tSoAct1_EG_TLSewerCreatureWatch_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Golems never ever attacked the Pipe Walkers. The reason is only known by the wisest Pipe Walker himself. It is because, as he explained: 'Nun dara bum, tuk la.'\"\nmsgstr \"Golems never ever attacked the Pipe Walkers. The reason is only known by the wisest Pipe Walker himself. It is because, as he explained: 'Nun dara bum, tuk la.'\"\n\n#. Key:\tSoAct1_EG_TLSewerCreatureWatch_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Sewer Team B\"\nmsgstr \"Sewer Team B\"\n\n#. Key:\tSoAct1_EG_TowerTrio_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"They spent most of their time on the top of those towers - it was clear to me that they would die there as well.\"\nmsgstr \"They spent most of their time on the top of those towers - it was clear to me that they would die there as well.\"\n\n#. Key:\tSoAct1_EG_TowerTrio_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"The Tower Trio\"\nmsgstr \"The Tower Trio\"\n\n#. Key:\tSoAct2_EG_BounceTrio_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Lava Jumpers are former Golems who fell into the lava. Some of them return to join their former Golem companions.\"\nmsgstr \"Lava Jumpers are former Golems who fell into the lava. Some of them return to join their former Golem companions.\"\n\n#. Key:\tSoAct2_EG_BounceTrio_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Bounce Trio\"\nmsgstr \"Bounce Trio\"\n\n#. Key:\tSoAct2_EG_C_BeforeKey_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"It's still unclear what makes some creatures touched by Ruin to group together. Some believes those who had similar emotions when Ruin came were likely to form a group.\"\nmsgstr \"It's still unclear what makes some creatures touched by Ruin to group together. Some believes those who had similar emotions when Ruin came were likely to form a group.\"\n\n#. Key:\tSoAct2_EG_C_BeforeKey_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Anxious Armours\"\nmsgstr \"Anxious Armours\"\n\n#. Key:\tSoAct2_EG_C_Bridge_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Crafting was always the obsession of Dwarves. In their workshops they forged mighty weapons and wondrous armours. Their love for their craft was so strong that instead of their body, Ruin preserved their iron works.\"\nmsgstr \"Crafting was always the obsession of Dwarves. In their workshops they forged mighty weapons and wondrous armours. Their love for their craft was so strong that instead of their body, Ruin preserved their iron works.\"\n\n#. Key:\tSoAct2_EG_C_Bridge_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Bridge Brigade\"\nmsgstr \"Bridge Brigade\"\n\n#. Key:\tSoAct2_EG_C_LoneShadeSphere_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Before Ruin there was no other humanoid race but human. New races are created by Ruin's Shades. They roam the lands looking for any living being which they can possess. Once they become part of a creature its body will start to change.\"\nmsgstr \"Before Ruin there was no other humanoid race but human. New races are created by Ruin's Shades. They roam the lands looking for any living being which they can possess. Once they become part of a creature its body will start to change.\"\n\n#. Key:\tSoAct2_EG_C_LoneShadeSphere_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Weird Floating Thing\"\nmsgstr \"Weird Floating Thing\"\n\n#. Key:\tSoAct2_EG_C_OfficeGuards_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Watching the only way to the Office did not bring enough protection. If any intruder managed to pass the Patrols he still had to face the Guardians to proceed.\"\nmsgstr \"Watching the only way to the Office did not bring enough protection. If any intruder managed to pass the Patrols he still had to face the Guardians to proceed.\"\n\n#. Key:\tSoAct2_EG_C_OfficeGuards_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Guardians of the Law\"\nmsgstr \"Guardians of the Law\"\n\n#. Key:\tSoAct2_EG_C_OfficePatrols_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Going into the Law's High Office was forbidden even for most of the Dwarves. Only one path lead to the Office and that was guarded by the Patrols.\"\nmsgstr \"Going into the Law's High Office was forbidden even for most of the Dwarves. Only one path lead to the Office and that was guarded by the Patrols.\"\n\n#. Key:\tSoAct2_EG_C_OfficePatrols_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Patrols of the Law\"\nmsgstr \"Patrols of the Law\"\n\n#. Key:\tSoAct2_EG_DG_Left_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Deep beneath the Catacombs there is a secret place called the Dwarven Gate. Elite dwarves who worked here were placed above the Law. They were seeking a way to fight Ruin with Ruin's magic.\"\nmsgstr \"Deep beneath the Catacombs there is a secret place called the Dwarven Gate. Elite dwarves who worked here were placed above the Law. They were seeking a way to fight Ruin with Ruin's magic.\"\n\n#. Key:\tSoAct2_EG_DG_Left_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Glorious Group\"\nmsgstr \"Glorious Group\"\n\n#. Key:\tSoAct2_EG_DG_RightFloor_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Even though most of the common Dwarves never even heard about Dwarven Gate some were needed to do the hard work. Now that Ruin won, Dwarves are finally equal.\"\nmsgstr \"Even though most of the common Dwarves never even heard about Dwarven Gate some were needed to do the hard work. Now that Ruin won, Dwarves are finally equal.\"\n\n#. Key:\tSoAct2_EG_DG_RightFloor_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Not so Elite Dwarves\"\nmsgstr \"Not so Elite Dwarves\"\n\n#. Key:\tSoAct2_EG_DG_RightUpOptional_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"One idea of the Elite Dwarves was to create giant statues which are able to trap Ruin's essence. Even if they were right they never managed to make enough sculptures.\"\nmsgstr \"One idea of the Elite Dwarves was to create giant statues which are able to trap Ruin's essence. Even if they were right they never managed to make enough sculptures.\"\n\n#. Key:\tSoAct2_EG_DG_RightUpOptional_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Sculptors\"\nmsgstr \"Sculptors\"\n\n#. Key:\tSoAct2_EG_DwarfBoss_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Dwarven Statues were meant to imprison the essence of Ruin. However there were some Dwarven scientists who feared that the statues were not safe and in the long run they wouldn't be able to resist the power of Ruin...\"\nmsgstr \"Dwarven Statues were meant to imprison the essence of Ruin. However there were some Dwarven scientists who feared that the statues were not safe and in the long run they wouldn't be able to resist the power of Ruin...\"\n\n#. Key:\tSoAct2_EG_DwarfBoss_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Dwarven Statue\"\nmsgstr \"Dwarven Statue\"\n\n#. Key:\tSoAct2_EG_GolemFirst_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Stone Golems are the cheap copies of the Runic Realm Golems. If Ruin twists the creatures mind then it will definitely have no effect on these ones.\"\nmsgstr \"Stone Golems are the cheap copies of the Runic Realm Golems. If Ruin twists the creatures mind then it will definitely have no effect on these ones.\"\n\n#. Key:\tSoAct2_EG_GolemFirst_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Sphere Golem\"\nmsgstr \"Sphere Golem\"\n\n#. Key:\tSoAct2_EG_GolemSecond_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Looks like the second try is just as bad as the first one.\"\nmsgstr \"Looks like the second try is just as bad as the first one.\"\n\n#. Key:\tSoAct2_EG_GolemSecond_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Second Sphere Golem\"\nmsgstr \"Second Sphere Golem\"\n\n#. Key:\tSoAct2_EG_GolemThird_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Whoever made this Golem, he should have stopped after the second try.\"\nmsgstr \"Whoever made this Golem, he should have stopped after the second try.\"\n\n#. Key:\tSoAct2_EG_GolemThird_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Third Sphere Golem\"\nmsgstr \"Third Sphere Golem\"\n\n#. Key:\tSoAct2_EG_HutFishies_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Now that the Fishys are gone, the Lake's piranhas can live in peace and eat whoever comes close.\"\nmsgstr \"Now that the Fishys are gone, the Lake's piranhas can live in peace and eat whoever comes close.\"\n\n#. Key:\tSoAct2_EG_HutFishies_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Abandoned Fishy Slaves\"\nmsgstr \"Abandoned Fishy Slaves\"\n\n#. Key:\tSoAct2_EG_HutFlyArmy_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"No one knows where the Flies came from. Although you have a very clear idea on where they should go...\"\nmsgstr \"No one knows where the Flies came from. Although you have a very clear idea on where they should go...\"\n\n#. Key:\tSoAct2_EG_HutFlyArmy_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Annoying Flies\"\nmsgstr \"Annoying Flies\"\n\n#. Key:\tSoAct2_EG_LavaBoss_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Armour Wrath was the most ambitious and majestic work of the Golem Maker. He used all his remaining strength to create this mighty Golem. It's a pity that all his efforts were in vain.\"\nmsgstr \"Armour Wrath was the most ambitious and majestic work of the Golem Maker. He used all his remaining strength to create this mighty Golem. It's a pity that all his efforts were in vain.\"\n\n#. Key:\tSoAct2_EG_LavaBoss_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Armour Wrath\"\nmsgstr \"Armour Wrath\"\n\n#. Key:\tSoAct2_EG_LavaDeepTeam_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"A fourth Sphere Golem? Someone never gives up...\"\nmsgstr \"A fourth Sphere Golem? Someone never gives up...\"\n\n#. Key:\tSoAct2_EG_LavaDeepTeam_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Fourth Sphere Golem\"\nmsgstr \"Fourth Sphere Golem\"\n\n#. Key:\tSoAct2_EG_LavaJumpers_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"When a Golem falls into the lava its stone body will melt away. The spirit however resists the heat and will be looking for another body...\"\nmsgstr \"When a Golem falls into the lava its stone body will melt away. The spirit however resists the heat and will be looking for another body...\"\n\n#. Key:\tSoAct2_EG_LavaJumpers_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Lava Jumpers\"\nmsgstr \"Lava Jumpers\"\n\n#. Key:\tSoAct2_EG_LavaTeamX_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Divided they fall, united they divide...\"\nmsgstr \"Divided they fall, united they divide...\"\n\n#. Key:\tSoAct2_EG_LavaTeamX_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Golem Group\"\nmsgstr \"Golem Group\"\n\n#. Key:\tSoAct2_EG_LavaTrio_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Wherever Golems go after death these three will go there together.\"\nmsgstr \"Wherever Golems go after death these three will go there together.\"\n\n#. Key:\tSoAct2_EG_LavaTrio_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Golem Trio\"\nmsgstr \"Golem Trio\"\n\n#. Key:\tSoAct2_EG_OutpostLeft_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"To keep Ruin away dwarves forbade everything related to Ruin's magic. This might have worked in theory but they failed to notice that their mechanical devices were also powered by Ruin.\"\nmsgstr \"To keep Ruin away dwarves forbade everything related to Ruin's magic. This might have worked in theory but they failed to notice that their mechanical devices were also powered by Ruin.\"\n\n#. Key:\tSoAct2_EG_OutpostLeft_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Guardians of the West Wall\"\nmsgstr \"Guardians of the West Wall\"\n\n#. Key:\tSoAct2_EG_OutpostRight_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Ruin was not only meant for destruction, it could also preserve. Ruin gave endless life for those who survived at the cost of twisting their minds.\"\nmsgstr \"Ruin was not only meant for destruction, it could also preserve. Ruin gave endless life for those who survived at the cost of twisting their minds.\"\n\n#. Key:\tSoAct2_EG_OutpostRight_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Guardians of the East Wall\"\nmsgstr \"Guardians of the East Wall\"\n\n#. Key:\tSoAct2_EG_OutpostWallFirst_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Dwarves fought Ruin with Rules. These soldiers were ordered here to guard the Outpost. Their will to obey the order was so strong that even death couldn't break it.\"\nmsgstr \"Dwarves fought Ruin with Rules. These soldiers were ordered here to guard the Outpost. Their will to obey the order was so strong that even death couldn't break it.\"\n\n#. Key:\tSoAct2_EG_OutpostWallFirst_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Patrols of the Outpost Wall\"\nmsgstr \"Patrols of the Outpost Wall\"\n\n#. Key:\tSoAct2_EG_Shore_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"After Ruin turned them into Monsters some creatures gathered together. Whether it's the effect of Ruin or something from their former life is unclear.\"\nmsgstr \"After Ruin turned them into Monsters some creatures gathered together. Whether it's the effect of Ruin or something from their former life is unclear.\"\n\n#. Key:\tSoAct2_EG_Shore_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Shore Monsters\"\nmsgstr \"Shore Monsters\"\n\n#. Key:\tSoAct2_EG_SlideFishyTeam_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Fishys were produced by the Great Kobold tribe for slaves. Some of them managed to escape, but they couldn't go far from the Lake.\"\nmsgstr \"Fishys were produced by the Great Kobold tribe for slaves. Some of them managed to escape, but they couldn't go far from the Lake.\"\n\n#. Key:\tSoAct2_EG_SlideFishyTeam_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Deserter Fishys\"\nmsgstr \"Deserter Fishys\"\n\n#. Key:\tSoAct2_EG_SlidePathEnd_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Deserter Fishys always kept a Fishy group close to the exit of their secret hideout. They protected the others and watched the kobolds to find the right time to venture back to the Lake.\"\nmsgstr \"Deserter Fishys always kept a Fishy group close to the exit of their secret hideout. They protected the others and watched the kobolds to find the right time to venture back to the Lake.\"\n\n#. Key:\tSoAct2_EG_SlidePathEnd_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Patrol Fishys\"\nmsgstr \"Patrol Fishys\"\n\n#. Key:\tSoAct2_EG_WormHole_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Worms kept distance from each other before Ruin. It's strange how a force which tears everything apart can also unite.\"\nmsgstr \"Worms kept distance from each other before Ruin. It's strange how a force which tears everything apart can also unite.\"\n\n#. Key:\tSoAct2_EG_WormHole_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Worms\"\nmsgstr \"Worms\"\n\n#. Key:\tSoAct2_EG_Wormy_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"There was a time when Worms only made damage to fields and gardens. Now they are a bit more ambitious...\"\nmsgstr \"There was a time when Worms only made damage to fields and gardens. Now they are a bit more ambitious...\"\n\n#. Key:\tSoAct2_EG_Wormy_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Worm\"\nmsgstr \"Worm\"\n\n#. Key:\tSoAct2_EG_WWBoss_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"When Ruin appeared some decided to abandon civilization and return to nature. Their leader, the Fallen Druid cast an ancient spell to protect his plants from Ruin. His spell partly worked but at a terrible cost.\"\nmsgstr \"When Ruin appeared some decided to abandon civilization and return to nature. Their leader, the Fallen Druid cast an ancient spell to protect his plants from Ruin. His spell partly worked but at a terrible cost.\"\n\n#. Key:\tSoAct2_EG_WWBoss_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Fallen Druid\"\nmsgstr \"Fallen Druid\"\n\n#. Key:\tSoAct3_EG_Act3BubbleGroundMain_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Ruin's power is not only in destruction. When it can't change something it will preserve those attributes which can prepare the possibility to change again. Ruin's power is in change.\"\nmsgstr \"Ruin's power is not only in destruction. When it can't change something it will preserve those attributes which can prepare the possibility to change again. Ruin's power is in change.\"\n\n#. Key:\tSoAct3_EG_Act3BubbleGroundMain_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Maintainer Spellcasters\"\nmsgstr \"Maintainer Spellcasters\"\n\n#. Key:\tSoAct3_EG_Act3FinalBattle_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Even though Ruin doesn't have consciousness nor the ability to think it somehow reacts to your presence. As if it knew the threat you present, Ruin tries all it can to stop you from leaving the Ruined Realm.\"\nmsgstr \"Even though Ruin doesn't have consciousness nor the ability to think it somehow reacts to your presence. As if it knew the threat you present, Ruin tries all it can to stop you from leaving the Ruined Realm.\"\n\n#. Key:\tSoAct3_EG_Act3FinalBattle_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Ruined Convention\"\nmsgstr \"Ruined Convention\"\n\n#. Key:\tSoAct3_EG_Act3PipeGroupFirst_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"There is a difference between how Humans and Golems are transformed by Ruin. Human bodies reach their final form in a few decades but Golems never stop changing. There is always a new, more vicious type.\"\nmsgstr \"There is a difference between how Humans and Golems are transformed by Ruin. Human bodies reach their final form in a few decades but Golems never stop changing. There is always a new, more vicious type.\"\n\n#. Key:\tSoAct3_EG_Act3PipeGroupFirst_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Red Drones\"\nmsgstr \"Red Drones\"\n\n#. Key:\tSoAct3_EG_Act3PipeGroupSecond_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Transformation is relative to intelligence. Creatures with consciousness have a strong desire to reserve their ego. Ruin can fool them a few times but later they become invulnerable to Ruin's changing power.\"\nmsgstr \"Transformation is relative to intelligence. Creatures with consciousness have a strong desire to reserve their ego. Ruin can fool them a few times but later they become invulnerable to Ruin's changing power.\"\n\n#. Key:\tSoAct3_EG_Act3PipeGroupSecond_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"More Drones\"\nmsgstr \"More Drones\"\n\n#. Key:\tSoAct3_EG_Act3RangedCleanerTwins_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Ruin's nature is confusing for the human mind. It can build, it can destroy, it can use, it can be used. These actions have the same priority for Ruin. All that matters is that it can do something. And with time it wants more and more.\"\nmsgstr \"Ruin's nature is confusing for the human mind. It can build, it can destroy, it can use, it can be used. These actions have the same priority for Ruin. All that matters is that it can do something. And with time it wants more and more.\"\n\n#. Key:\tSoAct3_EG_Act3RangedCleanerTwins_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Cleaner Twins\"\nmsgstr \"Cleaner Twins\"\n\n#. Key:\tSoAct3_EG_Act3VacuumTwins_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Ruin's logic is predictable when you understand its nature. When it's not possible to create more the creation process can be restarted by destroying everything first.\"\nmsgstr \"Ruin's logic is predictable when you understand its nature. When it's not possible to create more the creation process can be restarted by destroying everything first.\"\n\n#. Key:\tSoAct3_EG_Act3VacuumTwins_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Elite Twins\"\nmsgstr \"Elite Twins\"\n\n#. Key:\tWhiteWall_EG_AfterKobold_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Creating intelligence was not enough for the Golem Makers. They wanted to get even further. They wanted to create Golems with emotions.\"\nmsgstr \"Creating intelligence was not enough for the Golem Makers. They wanted to get even further. They wanted to create Golems with emotions.\"\n\n#. Key:\tWhiteWall_EG_AfterKobold_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Flying Maintainer\"\nmsgstr \"Flying Maintainer\"\n\n#. Key:\tWhiteWall_EG_BeforeKobold_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"When the Cataclysm happened and Ruin came the Golems started to change. Instead of doing their daily work some of them turned against their masters.\"\nmsgstr \"When the Cataclysm happened and Ruin came the Golems started to change. Instead of doing their daily work some of them turned against their masters.\"\n\n#. Key:\tWhiteWall_EG_BeforeKobold_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Infected Golems\"\nmsgstr \"Infected Golems\"\n\n#. Key:\tWhiteWall_EG_FirstCombat_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Cleaners were the first Golems ever made. Before the Cataclysm they did all the monoton work so that the people had more time to think and to create.\"\nmsgstr \"Cleaners were the first Golems ever made. Before the Cataclysm they did all the monoton work so that the people had more time to think and to create.\"\n\n#. Key:\tWhiteWall_EG_FirstCombat_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Whitewall Cleaners\"\nmsgstr \"Whitewall Cleaners\"\n\n#. Key:\tWhiteWall_EG_FirstOptionalCombat_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"After the different types of Cleaners, Golem Makers wanted to create something greater than working robots. They started to design creatures with intelligence.\"\nmsgstr \"After the different types of Cleaners, Golem Makers wanted to create something greater than working robots. They started to design creatures with intelligence.\"\n\n#. Key:\tWhiteWall_EG_FirstOptionalCombat_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Whitewall Maintainers\"\nmsgstr \"Whitewall Maintainers\"\n\n#. Key:\tAbacus_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/Abacus.Abacus.Description\n#: /Game/SO/Items/QuestItems/Abacus.Abacus.Description\nmsgctxt \"ItemData\"\nmsgid \"When you don't have enough fingers to count something you need this abacus.\"\nmsgstr \"When you don't have enough fingers to count something you need this abacus.\"\n\n#. Key:\tAbacus_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/Abacus.Abacus.Name\n#: /Game/SO/Items/QuestItems/Abacus.Abacus.Name\nmsgctxt \"ItemData\"\nmsgid \"Abacus\"\nmsgstr \"Abacus\"\n\n#. Key:\tAbacusGhost_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/AbacusGhost.AbacusGhost.Description\n#: /Game/SO/Items/QuestItems/AbacusGhost.AbacusGhost.Description\nmsgctxt \"ItemData\"\nmsgid \"When the Abacus is killed its spirit might return to get even with its murderer.\"\nmsgstr \"When the Abacus is killed its spirit might return to get even with its murderer.\"\n\n#. Key:\tAbacusGhost_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/AbacusGhost.AbacusGhost.Name\n#: /Game/SO/Items/QuestItems/AbacusGhost.AbacusGhost.Name\nmsgctxt \"ItemData\"\nmsgid \"Ghost Abacus\"\nmsgstr \"Ghost Abacus\"\n\n#. Key:\tAbacusGhostFlower_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/AbacusGhostFlower.AbacusGhostFlower.Description\n#: /Game/SO/Items/QuestItems/AbacusGhostFlower.AbacusGhostFlower.Description\nmsgctxt \"ItemData\"\nmsgid \"Petals of a ghost flower.\"\nmsgstr \"Petals of a ghost flower.\"\n\n#. Key:\tAbacusGhostFlower_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/AbacusGhostFlower.AbacusGhostFlower.Name\n#: /Game/SO/Items/QuestItems/AbacusGhostFlower.AbacusGhostFlower.Name\nmsgctxt \"ItemData\"\nmsgid \"Ghost Petals\"\nmsgstr \"Ghost Petals\"\n\n#. Key:\tAbacusSpellBook_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/AbacusSpellBook.AbacusSpellBook.Description\n#: /Game/SO/Items/QuestItems/AbacusSpellBook.AbacusSpellBook.Description\nmsgctxt \"ItemData\"\nmsgid \"An ancient paper\"\nmsgstr \"An ancient paper\"\n\n#. Key:\tAbacusSpellBook_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/AbacusSpellBook.AbacusSpellBook.Name\n#: /Game/SO/Items/QuestItems/AbacusSpellBook.AbacusSpellBook.Name\nmsgctxt \"ItemData\"\nmsgid \"Scroll of Surrection\"\nmsgstr \"Scroll of Surrection\"\n\n#. Key:\tAbacusSpellBook_page_0\n#. SourceLocation:\t/Game/SO/Items/QuestItems/AbacusSpellBook.AbacusSpellBook.Pages(0).Pages\n#: /Game/SO/Items/QuestItems/AbacusSpellBook.AbacusSpellBook.Pages(0).Pages\nmsgctxt \"ItemData\"\nmsgid \"Wisy et al. [3152] point out that any entity can be banished by throwing the proper object into his/her/its face a few times, making him/her/it annoyed thus unconcerned, as long as the target entity has a face.\\r\\n\\r\\nThe proper object in case of ghosts is something Surrected [Inti and Clevi 3153], as only Surrected substance can interact with ghosts.\\r\\n\\r\\nAny object covered with petals of Ghost Flower can be Surrected using the following method:\\r\\n\\r\\n- Say \\\"Sorry my <object name>!\\\"\\r\\n- Break the object into pieces with a heated hammer\\r\\n- Say your favourite color\\r\\n- Croon \\\"La La LaLaLa LaLaLa\\\" until the object is coagulated into a single Surrected object\"\nmsgstr \"Wisy et al. [3152] point out that any entity can be banished by throwing the proper object into his/her/its face a few times, making him/her/it annoyed thus unconcerned, as long as the target entity has a face.\\r\\n\\r\\nThe proper object in case of ghosts is something Surrected [Inti and Clevi 3153], as only Surrected substance can interact with ghosts.\\r\\n\\r\\nAny object covered with petals of Ghost Flower can be Surrected using the following method:\\r\\n\\r\\n- Say \\\"Sorry my <object name>!\\\"\\r\\n- Break the object into pieces with a heated hammer\\r\\n- Say your favourite color\\r\\n- Croon \\\"La La LaLaLa LaLaLa\\\" until the object is coagulated into a single Surrected object\"\n\n#. Key:\tAbacusSpellBook_page_1\n#. SourceLocation:\t/Game/SO/Items/QuestItems/AbacusSpellBook.AbacusSpellBook.Pages(1).Pages\n#: /Game/SO/Items/QuestItems/AbacusSpellBook.AbacusSpellBook.Pages(1).Pages\nmsgctxt \"ItemData\"\nmsgid \"WARNING: not following the instructions exactly leads to failure and also increases the probability of injury and or death [Carfy 3154].\\r\\n\\r\\nREFERENCES:\\r\\n\\r\\nWISY, W., BUSY, B., WEIRDY, Y., AND LUCKY, L. 3152. The best ways to get rid of anyone potentially distracting us with questions like \\\"What do you read?\\\"\\r\\n\\r\\nInti, I., AND Clevi, C. 3153. Insulting dead ancestors using Surrected objects\\r\\n\\r\\nCarfy C. 3154. What happened to Clevi, C. and Inti, I.\"\nmsgstr \"WARNING: not following the instructions exactly leads to failure and also increases the probability of injury and or death [Carfy 3154].\\r\\n\\r\\nREFERENCES:\\r\\n\\r\\nWISY, W., BUSY, B., WEIRDY, Y., AND LUCKY, L. 3152. The best ways to get rid of anyone potentially distracting us with questions like \\\"What do you read?\\\"\\r\\n\\r\\nInti, I., AND Clevi, C. 3153. Insulting dead ancestors using Surrected objects\\r\\n\\r\\nCarfy C. 3154. What happened to Clevi, C. and Inti, I.\"\n\n#. Key:\tAll_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/All.All.Description\n#: /Game/SO/Items/QuestItems/All.All.Description\nmsgctxt \"ItemData\"\nmsgid \"Maybe it was a bit too much?\"\nmsgstr \"Maybe it was a bit too much?\"\n\n#. Key:\tAll_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/All.All.Name\n#: /Game/SO/Items/QuestItems/All.All.Name\nmsgctxt \"ItemData\"\nmsgid \"Everything, except an Abacus\"\nmsgstr \"Everything, except an Abacus\"\n\n#. Key:\tArtifact_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/Artifact.Artifact.Description\n#: /Game/SO/Items/QuestItems/Artifact.Artifact.Description\nmsgctxt \"ItemData\"\nmsgid \"A very rare and powerful item which is used for opening a portal into the Unknown Realm. If you gather three and give them to the Wizard he shall set you free.\"\nmsgstr \"A very rare and powerful item which is used for opening a portal into the Unknown Realm. If you gather three and give them to the Wizard he shall set you free.\"\n\n#. Key:\tArtifact_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/Artifact.Artifact.Name\n#: /Game/SO/Items/QuestItems/Artifact.Artifact.Name\nmsgctxt \"ItemData\"\nmsgid \"Artifact\"\nmsgstr \"Artifact\"\n\n#. Key:\tAxeMainGame_desc\n#. SourceLocation:\t/Game/SO/Items/Weapons/AxeMainGame.AxeMainGame.Description\n#. Key:\tAxe_desc\n#. SourceLocation:\t/Game/SO/Items/Weapons/Axe.Axe.Description\n#: /Game/SO/Items/Weapons/Axe.Axe.Description\n#: /Game/SO/Items/Weapons/AxeMainGame.AxeMainGame.Description\nmsgctxt \"ItemData\"\nmsgid \"Axes are usefull, but if you don't need them you can just throw them away.\"\nmsgstr \"Axes are usefull, but if you don't need them you can just throw them away.\"\n\n#. Key:\tAxeMainGame_name\n#. SourceLocation:\t/Game/SO/Items/Weapons/AxeMainGame.AxeMainGame.Name\n#. Key:\tAxe_name\n#. SourceLocation:\t/Game/SO/Items/Weapons/Axe.Axe.Name\n#: /Game/SO/Items/Weapons/Axe.Axe.Name\n#: /Game/SO/Items/Weapons/AxeMainGame.AxeMainGame.Name\nmsgctxt \"ItemData\"\nmsgid \"Axes\"\nmsgstr \"Axes\"\n\n#. Key:\tBlueCrystal_desc\n#. SourceLocation:\t/Game/SO/Items/Valuable/BlueCrystal.BlueCrystal.Description\n#: /Game/SO/Items/Valuable/BlueCrystal.BlueCrystal.Description\nmsgctxt \"ItemData\"\nmsgid \"An ancient crystal people like to buy.\"\nmsgstr \"An ancient crystal people like to buy.\"\n\n#. Key:\tBlueCrystal_name\n#. SourceLocation:\t/Game/SO/Items/Valuable/BlueCrystal.BlueCrystal.Name\n#: /Game/SO/Items/Valuable/BlueCrystal.BlueCrystal.Name\nmsgctxt \"ItemData\"\nmsgid \"Blue Crystal\"\nmsgstr \"Blue Crystal\"\n\n#. Key:\tBlueGem_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/BlueGem.BlueGem.Description\n#: /Game/SO/Items/QuestItems/BlueGem.BlueGem.Description\nmsgctxt \"ItemData\"\nmsgid \"A small precious blue stone.\"\nmsgstr \"A small precious blue stone.\"\n\n#. Key:\tBlueGem_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/BlueGem.BlueGem.Name\n#: /Game/SO/Items/QuestItems/BlueGem.BlueGem.Name\nmsgctxt \"ItemData\"\nmsgid \"Blue Gem\"\nmsgstr \"Blue Gem\"\n\n#. Key:\tDemonSword_desc\n#. SourceLocation:\t/Game/SO/Items/Weapons/DemonSword.DemonSword.Description\n#: /Game/SO/Items/Weapons/DemonSword.DemonSword.Description\nmsgctxt \"ItemData\"\nmsgid \"The mighty sword of Kharutar the Demon Ruler. Legend says he once cut one of his fingers with it and in his rage he broke the sword into two. Later it was reforged but some say it would still need some more fixes.\"\nmsgstr \"The mighty sword of Kharutar the Demon Ruler. Legend says he once cut one of his fingers with it and in his rage he broke the sword into two. Later it was reforged but some say it would still need some more fixes.\"\n\n#. Key:\tDemonSword_name\n#. SourceLocation:\t/Game/SO/Items/Weapons/DemonSword.DemonSword.Name\n#: /Game/SO/Items/Weapons/DemonSword.DemonSword.Name\nmsgctxt \"ItemData\"\nmsgid \"Demon Sword\"\nmsgstr \"Demon Sword\"\n\n#. Key:\tDOKitchenKey_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/DOKitchenKey.DOKitchenKey.Description\n#: /Game/SO/Items/Keys/DOKitchenKey.DOKitchenKey.Description\nmsgctxt \"ItemData\"\nmsgid \"This is one of the many spare keys of the Dwarven Outpost Kitchen. Being able to get into the kitchen was always very important for dwarves.\"\nmsgstr \"This is one of the many spare keys of the Dwarven Outpost Kitchen. Being able to get into the kitchen was always very important for dwarves.\"\n\n#. Key:\tDOKitchenKey_name\n#. SourceLocation:\t/Game/SO/Items/Keys/DOKitchenKey.DOKitchenKey.Name\n#: /Game/SO/Items/Keys/DOKitchenKey.DOKitchenKey.Name\nmsgctxt \"ItemData\"\nmsgid \"Kitchen Key\"\nmsgstr \"Kitchen Key\"\n\n#. Key:\tDualBlade_desc\n#. SourceLocation:\t/Game/SO/Items/Weapons/DualBlade.DualBlade.Description\n#: /Game/SO/Items/Weapons/DualBlade.DualBlade.Description\nmsgctxt \"ItemData\"\nmsgid \"In case of trouble, it's better to have double.\"\nmsgstr \"In case of trouble, it's better to have double.\"\n\n#. Key:\tDualBlade_name\n#. SourceLocation:\t/Game/SO/Items/Weapons/DualBlade.DualBlade.Name\n#: /Game/SO/Items/Weapons/DualBlade.DualBlade.Name\nmsgctxt \"ItemData\"\nmsgid \"Double Sword\"\nmsgstr \"Double Sword\"\n\n#. Key:\tElevatorGem_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/ElevatorGem.ElevatorGem.Description\n#: /Game/SO/Items/QuestItems/ElevatorGem.ElevatorGem.Description\nmsgctxt \"ItemData\"\nmsgid \"A shiny green crystal which activates a weight lifting mechanism. At least by the look of it.\"\nmsgstr \"A shiny green crystal which activates a weight lifting mechanism. At least by the look of it.\"\n\n#. Key:\tElevatorGem_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/ElevatorGem.ElevatorGem.Name\n#: /Game/SO/Items/QuestItems/ElevatorGem.ElevatorGem.Name\nmsgctxt \"ItemData\"\nmsgid \"Elevator Gem\"\nmsgstr \"Elevator Gem\"\n\n#. Key:\tElevatorLeverCrystal_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/ElevatorLeverCrystal.ElevatorLeverCrystal.Description\n#: /Game/SO/Items/QuestItems/ElevatorLeverCrystal.ElevatorLeverCrystal.Description\nmsgctxt \"ItemData\"\nmsgid \"You got this item for free from a Merchant so you hardly believe it has any value. It might be used as some sort of a mechanism activator though. Hopefully not for a trap.\"\nmsgstr \"You got this item for free from a Merchant so you hardly believe it has any value. It might be used as some sort of a mechanism activator though. Hopefully not for a trap.\"\n\n#. Key:\tElevatorLeverCrystal_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/ElevatorLeverCrystal.ElevatorLeverCrystal.Name\n#: /Game/SO/Items/QuestItems/ElevatorLeverCrystal.ElevatorLeverCrystal.Name\nmsgctxt \"ItemData\"\nmsgid \"Elevator Crystal\"\nmsgstr \"Elevator Crystal\"\n\n#. Key:\tFountainFlower_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/FountainFlower.FountainFlower.Description\n#: /Game/SO/Items/QuestItems/FountainFlower.FountainFlower.Description\nmsgctxt \"ItemData\"\nmsgid \"Flower acquired from a fountain.\"\nmsgstr \"Flower acquired from a fountain.\"\n\n#. Key:\tFountainFlower_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/FountainFlower.FountainFlower.Name\n#: /Game/SO/Items/QuestItems/FountainFlower.FountainFlower.Name\nmsgctxt \"ItemData\"\nmsgid \"Fountain Flower\"\nmsgstr \"Fountain Flower\"\n\n#. Key:\tGateKeeperSeat_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/GateKeeperSeat.GateKeeperSeat.Description\n#: /Game/SO/Items/QuestItems/GateKeeperSeat.GateKeeperSeat.Description\nmsgctxt \"ItemData\"\nmsgid \"A simple seat of size XXXXXXXXXL\"\nmsgstr \"A simple seat of size XXXXXXXXXL\"\n\n#. Key:\tGateKeeperSeat_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/GateKeeperSeat.GateKeeperSeat.Name\n#: /Game/SO/Items/QuestItems/GateKeeperSeat.GateKeeperSeat.Name\nmsgctxt \"ItemData\"\nmsgid \"Giant Seat\"\nmsgstr \"Giant Seat\"\n\n#. Key:\tKeyAADoorNearDungeonExit_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyAADoorNearDungeonExit.KeyAADoorNearDungeonExit.Description\n#: /Game/SO/Items/Keys/KeyAADoorNearDungeonExit.KeyAADoorNearDungeonExit.Description\nmsgctxt \"ItemData\"\nmsgid \"A key without a proper item description\"\nmsgstr \"A key without a proper item description\"\n\n#. Key:\tKeyAADoorNearDungeonExit_name\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyAADoorNearDungeonExit.KeyAADoorNearDungeonExit.Name\n#: /Game/SO/Items/Keys/KeyAADoorNearDungeonExit.KeyAADoorNearDungeonExit.Name\nmsgctxt \"ItemData\"\nmsgid \"Arcade Key\"\nmsgstr \"Arcade Key\"\n\n#. Key:\tKeyAAFirstFight_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyAAFirstFight.KeyAAFirstFight.Description\n#: /Game/SO/Items/Keys/KeyAAFirstFight.KeyAAFirstFight.Description\nmsgctxt \"ItemData\"\nmsgid \"Weird\"\nmsgstr \"Weird\"\n\n#. Key:\tKeyAAFirstFight_name\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyAAFirstFight.KeyAAFirstFight.Name\n#: /Game/SO/Items/Keys/KeyAAFirstFight.KeyAAFirstFight.Name\nmsgctxt \"ItemData\"\nmsgid \"Weird Key\"\nmsgstr \"Weird Key\"\n\n#. Key:\tKeyAAMainFirstDoor_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyAAMainFirstDoor.KeyAAMainFirstDoor.Description\n#: /Game/SO/Items/Keys/KeyAAMainFirstDoor.KeyAAMainFirstDoor.Description\nmsgctxt \"ItemData\"\nmsgid \"Sometimes the lock is harder to find than the key.\"\nmsgstr \"Sometimes the lock is harder to find than the key.\"\n\n#. Key:\tKeyAAMainFirstDoor_name\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyAAMainFirstDoor.KeyAAMainFirstDoor.Name\n#: /Game/SO/Items/Keys/KeyAAMainFirstDoor.KeyAAMainFirstDoor.Name\nmsgctxt \"ItemData\"\nmsgid \"Key of Something\"\nmsgstr \"Key of Something\"\n\n#. Key:\tKeyAGPortalFight_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyAGPortalFight.KeyAGPortalFight.Description\n#: /Game/SO/Items/Keys/KeyAGPortalFight.KeyAGPortalFight.Description\nmsgctxt \"ItemData\"\nmsgid \"Just another key.\"\nmsgstr \"Just another key.\"\n\n#. Key:\tKeyAGPortalFight_name\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyAGPortalFight.KeyAGPortalFight.Name\n#: /Game/SO/Items/Keys/KeyAGPortalFight.KeyAGPortalFight.Name\nmsgctxt \"ItemData\"\nmsgid \"Eastern Key\"\nmsgstr \"Eastern Key\"\n\n#. Key:\tKeyBronze_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyBronze.KeyBronze.Description\n#: /Game/SO/Items/Keys/KeyBronze.KeyBronze.Description\nmsgctxt \"ItemData\"\nmsgid \"A reforged Bronze Key.\"\nmsgstr \"A reforged Bronze Key.\"\n\n#. Key:\tKeyBronze_name\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyBronze.KeyBronze.Name\n#: /Game/SO/Items/Keys/KeyBronze.KeyBronze.Name\nmsgctxt \"ItemData\"\nmsgid \"Bronze Key\"\nmsgstr \"Bronze Key\"\n\n#. Key:\tKeyCatacombs0_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyCatacombs0.KeyCatacombs0.Description\n#: /Game/SO/Items/Keys/KeyCatacombs0.KeyCatacombs0.Description\nmsgctxt \"ItemData\"\nmsgid \"There are a ridiculous amount of keys in this world, right?\"\nmsgstr \"There are a ridiculous amount of keys in this world, right?\"\n\n#. Key:\tKeyCatacombs0_name\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyCatacombs0.KeyCatacombs0.Name\n#: /Game/SO/Items/Keys/KeyCatacombs0.KeyCatacombs0.Name\nmsgctxt \"ItemData\"\nmsgid \"Key Of The Room Below\"\nmsgstr \"Key Of The Room Below\"\n\n#. Key:\tKeyCopper_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyCopper.KeyCopper.Description\n#: /Game/SO/Items/Keys/KeyCopper.KeyCopper.Description\nmsgctxt \"ItemData\"\nmsgid \"A reforged Copper Key.\"\nmsgstr \"A reforged Copper Key.\"\n\n#. Key:\tKeyCopper_name\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyCopper.KeyCopper.Name\n#: /Game/SO/Items/Keys/KeyCopper.KeyCopper.Name\nmsgctxt \"ItemData\"\nmsgid \"Copper Key\"\nmsgstr \"Copper Key\"\n\n#. Key:\tKeyDCMainOut_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyDCMainOut.KeyDCMainOut.Description\n#: /Game/SO/Items/Keys/KeyDCMainOut.KeyDCMainOut.Description\nmsgctxt \"ItemData\"\nmsgid \"Just an old, rusty iron key without a proper item description\"\nmsgstr \"Just an old, rusty iron key without a proper item description\"\n\n#. Key:\tKeyDCMainOut_name\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyDCMainOut.KeyDCMainOut.Name\n#: /Game/SO/Items/Keys/KeyDCMainOut.KeyDCMainOut.Name\nmsgctxt \"ItemData\"\nmsgid \"Catacomb Key\"\nmsgstr \"Catacomb Key\"\n\n#. Key:\tKeyIron_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyIron.KeyIron.Description\n#: /Game/SO/Items/Keys/KeyIron.KeyIron.Description\nmsgctxt \"ItemData\"\nmsgid \"A reforged Iron Key.\"\nmsgstr \"A reforged Iron Key.\"\n\n#. Key:\tKeyIron_name\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyIron.KeyIron.Name\n#: /Game/SO/Items/Keys/KeyIron.KeyIron.Name\nmsgctxt \"ItemData\"\nmsgid \"Iron Key\"\nmsgstr \"Iron Key\"\n\n#. Key:\tKeyMaster_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyMaster.KeyMaster.Description\n#: /Game/SO/Items/Keys/KeyMaster.KeyMaster.Description\nmsgctxt \"ItemData\"\nmsgid \"This key can be used to open any door equipped with a special kind of lock, but breaks during the process.\"\nmsgstr \"This key can be used to open any door equipped with a special kind of lock, but breaks during the process.\"\n\n#. Key:\tKeyMaster_name\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyMaster.KeyMaster.Name\n#: /Game/SO/Items/Keys/KeyMaster.KeyMaster.Name\nmsgctxt \"ItemData\"\nmsgid \"Master Key\"\nmsgstr \"Master Key\"\n\n#. Key:\tKeyMerchant_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyMerchant.KeyMerchant.Description\n#: /Game/SO/Items/Keys/KeyMerchant.KeyMerchant.Description\nmsgctxt \"ItemData\"\nmsgid \"Does it really work? You will find out soon...\"\nmsgstr \"Does it really work? You will find out soon...\"\n\n#. Key:\tKeyMerchant_name\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyMerchant.KeyMerchant.Name\n#: /Game/SO/Items/Keys/KeyMerchant.KeyMerchant.Name\nmsgctxt \"ItemData\"\nmsgid \"A very small key\"\nmsgstr \"A very small key\"\n\n#. Key:\tKeyOutpostWall_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyOutpostWall.KeyOutpostWall.Description\n#: /Game/SO/Items/Keys/KeyOutpostWall.KeyOutpostWall.Description\nmsgctxt \"ItemData\"\nmsgid \"Do you really read the key descriptions?\"\nmsgstr \"Do you really read the key descriptions?\"\n\n#. Key:\tKeyOutpostWall_name\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyOutpostWall.KeyOutpostWall.Name\n#: /Game/SO/Items/Keys/KeyOutpostWall.KeyOutpostWall.Name\nmsgctxt \"ItemData\"\nmsgid \"Key Of The Outpost Wall\"\nmsgstr \"Key Of The Outpost Wall\"\n\n#. Key:\tKeyOutpostWallOptional_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyOutpostWallOptional.KeyOutpostWallOptional.Description\n#: /Game/SO/Items/Keys/KeyOutpostWallOptional.KeyOutpostWallOptional.Description\nmsgctxt \"ItemData\"\nmsgid \"I would rather sleep, but the item descriptions won't write themselves.\"\nmsgstr \"I would rather sleep, but the item descriptions won't write themselves.\"\n\n#. Key:\tKeyOutpostWallOptional_name\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyOutpostWallOptional.KeyOutpostWallOptional.Name\n#: /Game/SO/Items/Keys/KeyOutpostWallOptional.KeyOutpostWallOptional.Name\nmsgctxt \"ItemData\"\nmsgid \"Second Key Of The Outpost Wall\"\nmsgstr \"Second Key Of The Outpost Wall\"\n\n#. Key:\tKeyPiecesBronze0_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyPiecesBronze0.KeyPiecesBronze0.Description\n#: /Game/SO/Items/Keys/KeyPiecesBronze0.KeyPiecesBronze0.Description\nmsgctxt \"ItemData\"\nmsgid \"Half of a broken Bronze Key\"\nmsgstr \"Half of a broken Bronze Key\"\n\n#. Key:\tKeyPiecesBronze0_name\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyPiecesBronze0.KeyPiecesBronze0.Name\n#: /Game/SO/Items/Keys/KeyPiecesBronze0.KeyPiecesBronze0.Name\nmsgctxt \"ItemData\"\nmsgid \"Half Bronze Key\"\nmsgstr \"Half Bronze Key\"\n\n#. Key:\tKeyPiecesCopper0_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyPiecesCopper0.KeyPiecesCopper0.Description\n#: /Game/SO/Items/Keys/KeyPiecesCopper0.KeyPiecesCopper0.Description\nmsgctxt \"ItemData\"\nmsgid \"Half of a broken Copper Key\"\nmsgstr \"Half of a broken Copper Key\"\n\n#. Key:\tKeyPiecesCopper0_name\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyPiecesCopper0.KeyPiecesCopper0.Name\n#: /Game/SO/Items/Keys/KeyPiecesCopper0.KeyPiecesCopper0.Name\nmsgctxt \"ItemData\"\nmsgid \"Half Copper Key\"\nmsgstr \"Half Copper Key\"\n\n#. Key:\tKeyPiecesIron0_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyPiecesIron0.KeyPiecesIron0.Description\n#: /Game/SO/Items/Keys/KeyPiecesIron0.KeyPiecesIron0.Description\nmsgctxt \"ItemData\"\nmsgid \"Half of a broken Iron Key\"\nmsgstr \"Half of a broken Iron Key\"\n\n#. Key:\tKeyPiecesIron0_name\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyPiecesIron0.KeyPiecesIron0.Name\n#: /Game/SO/Items/Keys/KeyPiecesIron0.KeyPiecesIron0.Name\nmsgctxt \"ItemData\"\nmsgid \"Half Iron Key\"\nmsgstr \"Half Iron Key\"\n\n#. Key:\tKeySA_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/KeySA.KeySA.Description\n#: /Game/SO/Items/Keys/KeySA.KeySA.Description\nmsgctxt \"ItemData\"\nmsgid \"Looks like there are tons of these\"\nmsgstr \"Looks like there are tons of these\"\n\n#. Key:\tKeySA_name\n#. SourceLocation:\t/Game/SO/Items/Keys/KeySA.KeySA.Name\n#: /Game/SO/Items/Keys/KeySA.KeySA.Name\nmsgctxt \"ItemData\"\nmsgid \"Another Key\"\nmsgstr \"Another Key\"\n\n#. Key:\tKeySASewerCreatureCell_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/KeySASewerCreatureCell.KeySASewerCreatureCell.Description\n#: /Game/SO/Items/Keys/KeySASewerCreatureCell.KeySASewerCreatureCell.Description\nmsgctxt \"ItemData\"\nmsgid \"A small key you got from the Pipe Walkers.\"\nmsgstr \"A small key you got from the Pipe Walkers.\"\n\n#. Key:\tKeyTLElevatorRoom_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyTLElevatorRoom.KeyTLElevatorRoom.Description\n#: /Game/SO/Items/Keys/KeyTLElevatorRoom.KeyTLElevatorRoom.Description\nmsgctxt \"ItemData\"\nmsgid \"A key without any sign of interest.\"\nmsgstr \"A key without any sign of interest.\"\n\n#. Key:\tKeyTLElevatorRoom_name\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyTLElevatorRoom.KeyTLElevatorRoom.Name\n#: /Game/SO/Items/Keys/KeyTLElevatorRoom.KeyTLElevatorRoom.Name\nmsgctxt \"ItemData\"\nmsgid \"Unconcerned Key\"\nmsgstr \"Unconcerned Key\"\n\n#. Key:\tKeyWWFirstGate_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyWWFirstGate.KeyWWFirstGate.Description\n#: /Game/SO/Items/Keys/KeyWWFirstGate.KeyWWFirstGate.Description\nmsgctxt \"ItemData\"\nmsgid \"It will open a gate somewhere. Probably.\"\nmsgstr \"It will open a gate somewhere. Probably.\"\n\n#. Key:\tKeyWWFirstGate_name\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyWWFirstGate.KeyWWFirstGate.Name\n#: /Game/SO/Items/Keys/KeyWWFirstGate.KeyWWFirstGate.Name\nmsgctxt \"ItemData\"\nmsgid \"Railway Gate Key\"\nmsgstr \"Railway Gate Key\"\n\n#. Key:\tKeyWWPortal_desc\n#. SourceLocation:\t/Game/SO/Items/WhiteWallItems/KeyWWPortal.KeyWWPortal.Description\n#: /Game/SO/Items/WhiteWallItems/KeyWWPortal.KeyWWPortal.Description\nmsgctxt \"ItemData\"\nmsgid \"A fancy iron key with a shiny gem in its grip. It must be really precious.\"\nmsgstr \"A fancy iron key with a shiny gem in its grip. It must be really precious.\"\n\n#. Key:\tKeyWWPortal_name\n#. SourceLocation:\t/Game/SO/Items/WhiteWallItems/KeyWWPortal.KeyWWPortal.Name\n#: /Game/SO/Items/WhiteWallItems/KeyWWPortal.KeyWWPortal.Name\nmsgctxt \"ItemData\"\nmsgid \"Portal Key\"\nmsgstr \"Portal Key\"\n\n#. Key:\tKEYWWSewerCreatureCell_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/KEYWWSewerCreatureCell.KEYWWSewerCreatureCell.Description\n#: /Game/SO/Items/Keys/KEYWWSewerCreatureCell.KEYWWSewerCreatureCell.Description\nmsgctxt \"ItemData\"\nmsgid \"A small key you got from a chest in the middle of nowhere.\"\nmsgstr \"A small key you got from a chest in the middle of nowhere.\"\n\n#. Key:\tKEYWWSewerCreatureCell_name\n#. SourceLocation:\t/Game/SO/Items/Keys/KEYWWSewerCreatureCell.KEYWWSewerCreatureCell.Name\n#. Key:\tKeySASewerCreatureCell_name\n#. SourceLocation:\t/Game/SO/Items/Keys/KeySASewerCreatureCell.KeySASewerCreatureCell.Name\n#: /Game/SO/Items/Keys/KeySASewerCreatureCell.KeySASewerCreatureCell.Name\n#: /Game/SO/Items/Keys/KEYWWSewerCreatureCell.KEYWWSewerCreatureCell.Name\nmsgctxt \"ItemData\"\nmsgid \"Small Cell Key\"\nmsgstr \"Small Cell Key\"\n\n#. Key:\tKeyWWWhiteWall_desc\n#. SourceLocation:\t/Game/SO/Items/WhiteWallItems/KeyWWWhiteWall.KeyWWWhiteWall.Description\n#: /Game/SO/Items/WhiteWallItems/KeyWWWhiteWall.KeyWWWhiteWall.Description\nmsgctxt \"ItemData\"\nmsgid \"A robust iron key with a carved script: <Bold>'Outer Wall Tower'</>.\"\nmsgstr \"A robust iron key with a carved script: <Bold>'Outer Wall Tower'</>.\"\n\n#. Key:\tKeyWWWhiteWall_name\n#. SourceLocation:\t/Game/SO/Items/WhiteWallItems/KeyWWWhiteWall.KeyWWWhiteWall.Name\n#: /Game/SO/Items/WhiteWallItems/KeyWWWhiteWall.KeyWWWhiteWall.Name\nmsgctxt \"ItemData\"\nmsgid \"White Wall Key\"\nmsgstr \"White Wall Key\"\n\n#. Key:\tKoboldCoin_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/KoboldCoin.KoboldCoin.Description\n#: /Game/SO/Items/QuestItems/KoboldCoin.KoboldCoin.Description\nmsgctxt \"ItemData\"\nmsgid \"Some Coins you found in a chest.\"\nmsgstr \"Some Coins you found in a chest.\"\n\n#. Key:\tKoboldCoin_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/KoboldCoin.KoboldCoin.Name\n#: /Game/SO/Items/QuestItems/KoboldCoin.KoboldCoin.Name\nmsgctxt \"ItemData\"\nmsgid \"Kobold Coins\"\nmsgstr \"Kobold Coins\"\n\n#. Key:\tKoboldPotion_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/KoboldPotion.KoboldPotion.Description\n#: /Game/SO/Items/QuestItems/KoboldPotion.KoboldPotion.Description\nmsgctxt \"ItemData\"\nmsgid \"Weird liquid in a bottle. The kobold calls it Soup.\"\nmsgstr \"Weird liquid in a bottle. The kobold calls it Soup.\"\n\n#. Key:\tKoboldPotion_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/KoboldPotion.KoboldPotion.Name\n#: /Game/SO/Items/QuestItems/KoboldPotion.KoboldPotion.Name\nmsgctxt \"ItemData\"\nmsgid \"Kobold Soup\"\nmsgstr \"Kobold Soup\"\n\n#. Key:\tLavaGolemToken_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/LavaGolemToken.LavaGolemToken.Description\n#: /Game/SO/Items/QuestItems/LavaGolemToken.LavaGolemToken.Description\nmsgctxt \"ItemData\"\nmsgid \"A unique stone you can use to prove that you have eliminated a golem.\"\nmsgstr \"A unique stone you can use to prove that you have eliminated a golem.\"\n\n#. Key:\tLavaGolemToken_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/LavaGolemToken.LavaGolemToken.Name\n#: /Game/SO/Items/QuestItems/LavaGolemToken.LavaGolemToken.Name\nmsgctxt \"ItemData\"\nmsgid \"Stone Token\"\nmsgstr \"Stone Token\"\n\n#. Key:\tLeafMace_desc\n#. SourceLocation:\t/Game/SO/Items/Weapons/LeafMace.LeafMace.Description\n#: /Game/SO/Items/Weapons/LeafMace.LeafMace.Description\nmsgctxt \"ItemData\"\nmsgid \"If someone would fail in cutting his/her/its way out of a hard situation, crushing your way through can still work out pretty well - it is said to be more effective if golems or certain mechanical devices / creatures are involved in the conflict.\"\nmsgstr \"If someone would fail in cutting his/her/its way out of a hard situation, crushing your way through can still work out pretty well - it is said to be more effective if golems or certain mechanical devices / creatures are involved in the conflict.\"\n\n#. Key:\tLeafMace_name\n#. SourceLocation:\t/Game/SO/Items/Weapons/LeafMace.LeafMace.Name\n#: /Game/SO/Items/Weapons/LeafMace.LeafMace.Name\nmsgctxt \"ItemData\"\nmsgid \"Leaf Mace\"\nmsgstr \"Leaf Mace\"\n\n#. Key:\tLEKeyCage_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/LEKeyCage.LEKeyCage.Description\n#: /Game/SO/Items/Keys/LEKeyCage.LEKeyCage.Description\nmsgctxt \"ItemData\"\nmsgid \"You won't believe it but it is a key for a cage.\"\nmsgstr \"You won't believe it but it is a key for a cage.\"\n\n#. Key:\tLEKeyCage_name\n#. SourceLocation:\t/Game/SO/Items/Keys/LEKeyCage.LEKeyCage.Name\n#: /Game/SO/Items/Keys/LEKeyCage.LEKeyCage.Name\nmsgctxt \"ItemData\"\nmsgid \"Cage Key\"\nmsgstr \"Cage Key\"\n\n#. Key:\tLETempleKey_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/LETempleKey.LETempleKey.Description\n#: /Game/SO/Items/Keys/LETempleKey.LETempleKey.Description\nmsgctxt \"ItemData\"\nmsgid \"This is one of the spare keys of the Ancient Temple. Just in case the original would be dropped into the lava accidentally.\"\nmsgstr \"This is one of the spare keys of the Ancient Temple. Just in case the original would be dropped into the lava accidentally.\"\n\n#. Key:\tLETempleKey_name\n#. SourceLocation:\t/Game/SO/Items/Keys/LETempleKey.LETempleKey.Name\n#: /Game/SO/Items/Keys/LETempleKey.LETempleKey.Name\nmsgctxt \"ItemData\"\nmsgid \"Ancient Temple Key\"\nmsgstr \"Ancient Temple Key\"\n\n#. Key:\tLoryBooks_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/LoryBooks.LoryBooks.Description\n#: /Game/SO/Items/QuestItems/LoryBooks.LoryBooks.Description\nmsgctxt \"ItemData\"\nmsgid \"Two ancient books with the titles \\\"True value of your family\\\" and \\\"How much does a brother cost?\\\". They look boring so you decide not to open them.\"\nmsgstr \"Two ancient books with the titles \\\"True value of your family\\\" and \\\"How much does a brother cost?\\\". They look boring so you decide not to open them.\"\n\n#. Key:\tLoryBooks_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/LoryBooks.LoryBooks.Name\n#: /Game/SO/Items/QuestItems/LoryBooks.LoryBooks.Name\nmsgctxt \"ItemData\"\nmsgid \"Old books\"\nmsgstr \"Old books\"\n\n#. Key:\tMemoryCrystal1_desc\n#. SourceLocation:\t/Game/SO/Items/MemoryStone/MemoryCrystal1.MemoryCrystal1.Description\n#: /Game/SO/Items/MemoryStone/MemoryCrystal1.MemoryCrystal1.Description\nmsgctxt \"ItemData\"\nmsgid \"'According to the very few survivors, White Tower, our capital was completely destroyed by a magical phenomena called Ruin. At that time I was at Grey Gate so I can't tell anything for sure.'\\r\\n\\r\\nThe Last Sane Golem Maker, A.C. 16. September 4.\"\nmsgstr \"'According to the very few survivors, White Tower, our capital was completely destroyed by a magical phenomena called Ruin. At that time I was at Grey Gate so I can't tell anything for sure.'\\r\\n\\r\\nThe Last Sane Golem Maker, A.C. 16. September 4.\"\n\n#. Key:\tMemoryCrystal1_name\n#. SourceLocation:\t/Game/SO/Items/MemoryStone/MemoryCrystal1.MemoryCrystal1.Name\n#: /Game/SO/Items/MemoryStone/MemoryCrystal1.MemoryCrystal1.Name\nmsgctxt \"ItemData\"\nmsgid \"Magical Phenomena\"\nmsgstr \"Magical Phenomena\"\n\n#. Key:\tMemoryCrystal2_desc\n#. SourceLocation:\t/Game/SO/Items/MemoryStone/MemoryCrystal2.MemoryCrystal2.Description\n#: /Game/SO/Items/MemoryStone/MemoryCrystal2.MemoryCrystal2.Description\nmsgctxt \"ItemData\"\nmsgid \"'Those who escaped Ruin have... changed.'\\r\\n'I've met a scientist who noticed how madness takes control over him. Perhaps he can find a solution.'\\r\\n\\r\\nThe Last Sane Golem Maker, A.C. 17. January 1.\"\nmsgstr \"'Those who escaped Ruin have... changed.'\\r\\n'I've met a scientist who noticed how madness takes control over him. Perhaps he can find a solution.'\\r\\n\\r\\nThe Last Sane Golem Maker, A.C. 17. January 1.\"\n\n#. Key:\tMemoryCrystal2_name\n#. SourceLocation:\t/Game/SO/Items/MemoryStone/MemoryCrystal2.MemoryCrystal2.Name\n#: /Game/SO/Items/MemoryStone/MemoryCrystal2.MemoryCrystal2.Name\nmsgctxt \"ItemData\"\nmsgid \"Degeneration and mutation\"\nmsgstr \"Degeneration and mutation\"\n\n#. Key:\tMemoryCrystal3_desc\n#. SourceLocation:\t/Game/SO/Items/MemoryStone/MemoryCrystal3.MemoryCrystal3.Description\n#: /Game/SO/Items/MemoryStone/MemoryCrystal3.MemoryCrystal3.Description\nmsgctxt \"ItemData\"\nmsgid \"'It's hard to tell but I think colours are fading away. The World was brighter before.'\\r\\n'The Monk won't help me. He stubbornly believes we are doomed.'\\r\\n\\r\\nThe Last Sane Golem Maker, A.C. 17. March 11.\"\nmsgstr \"'It's hard to tell but I think colours are fading away. The World was brighter before.'\\r\\n'The Monk won't help me. He stubbornly believes we are doomed.'\\r\\n\\r\\nThe Last Sane Golem Maker, A.C. 17. March 11.\"\n\n#. Key:\tMemoryCrystal3_name\n#. SourceLocation:\t/Game/SO/Items/MemoryStone/MemoryCrystal3.MemoryCrystal3.Name\n#: /Game/SO/Items/MemoryStone/MemoryCrystal3.MemoryCrystal3.Name\nmsgctxt \"ItemData\"\nmsgid \"Fading Colours\"\nmsgstr \"Fading Colours\"\n\n#. Key:\tMemoryCrystal4_desc\n#. SourceLocation:\t/Game/SO/Items/MemoryStone/MemoryCrystal4.MemoryCrystal4.Description\n#: /Game/SO/Items/MemoryStone/MemoryCrystal4.MemoryCrystal4.Description\nmsgctxt \"ItemData\"\nmsgid \"'Madness takes control over those who get too close to Ruin.'\\r\\n'Maintainers forgot to speak. I understand some of the phrases they try to say: \\\"Dinner is served\\\", \\\"At your service\\\", \\\"Your order\\\" - a mockery of their former intelligence!'\\r\\n\\r\\nThe Last Sane Golem Maker, A.C. 21. January 26.\"\nmsgstr \"'Madness takes control over those who get too close to Ruin.'\\r\\n'Maintainers forgot to speak. I understand some of the phrases they try to say: \\\"Dinner is served\\\", \\\"At your service\\\", \\\"Your order\\\" - a mockery of their former intelligence!'\\r\\n\\r\\nThe Last Sane Golem Maker, A.C. 21. January 26.\"\n\n#. Key:\tMemoryCrystal4_name\n#. SourceLocation:\t/Game/SO/Items/MemoryStone/MemoryCrystal4.MemoryCrystal4.Name\n#: /Game/SO/Items/MemoryStone/MemoryCrystal4.MemoryCrystal4.Name\nmsgctxt \"ItemData\"\nmsgid \"Madness\"\nmsgstr \"Madness\"\n\n#. Key:\tMemoryCrystal5_desc\n#. SourceLocation:\t/Game/SO/Items/MemoryStone/MemoryCrystal5.MemoryCrystal5.Description\n#: /Game/SO/Items/MemoryStone/MemoryCrystal5.MemoryCrystal5.Description\nmsgctxt \"ItemData\"\nmsgid \"'Now I have seen it with my own eyes: the touch of the Ruin makes the World literally fall apart.'\\r\\n\\r\\nThe Last Sane Golem Maker, A.C. 25. September 4.\"\nmsgstr \"'Now I have seen it with my own eyes: the touch of the Ruin makes the World literally fall apart.'\\r\\n\\r\\nThe Last Sane Golem Maker, A.C. 25. September 4.\"\n\n#. Key:\tMemoryCrystal5_name\n#. SourceLocation:\t/Game/SO/Items/MemoryStone/MemoryCrystal5.MemoryCrystal5.Name\n#: /Game/SO/Items/MemoryStone/MemoryCrystal5.MemoryCrystal5.Name\nmsgctxt \"ItemData\"\nmsgid \"Falling Apart\"\nmsgstr \"Falling Apart\"\n\n#. Key:\tMemoryCrystal6_desc\n#. SourceLocation:\t/Game/SO/Items/MemoryStone/MemoryCrystal6.MemoryCrystal6.Description\n#: /Game/SO/Items/MemoryStone/MemoryCrystal6.MemoryCrystal6.Description\nmsgctxt \"ItemData\"\nmsgid \"'This is my 87 birthday. It's obvious that my body doesn't get older with time. How long can I preserve my sanity?'\\r\\n'Drones can no longer be trusted. They resisted Ruin for the longest.'\\r\\n\\r\\nThe Last Sane Golem Maker, A.C. 52. July 9.\"\nmsgstr \"'This is my 87 birthday. It's obvious that my body doesn't get older with time. How long can I preserve my sanity?'\\r\\n'Drones can no longer be trusted. They resisted Ruin for the longest.'\\r\\n\\r\\nThe Last Sane Golem Maker, A.C. 52. July 9.\"\n\n#. Key:\tMemoryCrystal6_name\n#. SourceLocation:\t/Game/SO/Items/MemoryStone/MemoryCrystal6.MemoryCrystal6.Name\n#: /Game/SO/Items/MemoryStone/MemoryCrystal6.MemoryCrystal6.Name\nmsgctxt \"ItemData\"\nmsgid \"Preservation of Ruin\"\nmsgstr \"Preservation of Ruin\"\n\n#. Key:\tMemoryCrystal7_desc\n#. SourceLocation:\t/Game/SO/Items/MemoryStone/MemoryCrystal7.MemoryCrystal7.Description\n#: /Game/SO/Items/MemoryStone/MemoryCrystal7.MemoryCrystal7.Description\nmsgctxt \"ItemData\"\nmsgid \"'Ruin will soon reach Grey Gate, our very last city. I need to move deeper into the Realm, further away from Ruin.'\\r\\n'I decided to create some new golems. Golems that resist Ruin.'\\r\\n\\r\\nThe Last Sane Golem Maker, A.C. 315. April 8.\"\nmsgstr \"'Ruin will soon reach Grey Gate, our very last city. I need to move deeper into the Realm, further away from Ruin.'\\r\\n'I decided to create some new golems. Golems that resist Ruin.'\\r\\n\\r\\nThe Last Sane Golem Maker, A.C. 315. April 8.\"\n\n#. Key:\tMemoryCrystal7_name\n#. SourceLocation:\t/Game/SO/Items/MemoryStone/MemoryCrystal7.MemoryCrystal7.Name\n#: /Game/SO/Items/MemoryStone/MemoryCrystal7.MemoryCrystal7.Name\nmsgctxt \"ItemData\"\nmsgid \"New Hope\"\nmsgstr \"New Hope\"\n\n#. Key:\tMemoryCrystal8_desc\n#. SourceLocation:\t/Game/SO/Items/MemoryStone/MemoryCrystal8.MemoryCrystal8.Description\n#: /Game/SO/Items/MemoryStone/MemoryCrystal8.MemoryCrystal8.Description\nmsgctxt \"ItemData\"\nmsgid \"'I don't think I can keep up. There are times when I no longer know what I'm doing. I still have clear moments but they become more and more rare. I've recorded my memories to keep them safe.'\\r\\n\\r\\nThe Last Sane Golem Maker, about A.C. 500.\\r\\n\"\nmsgstr \"'I don't think I can keep up. There are times when I no longer know what I'm doing. I still have clear moments but they become more and more rare. I've recorded my memories to keep them safe.'\\r\\n\\r\\nThe Last Sane Golem Maker, about A.C. 500.\\r\\n\"\n\n#. Key:\tMemoryCrystal8_name\n#. SourceLocation:\t/Game/SO/Items/MemoryStone/MemoryCrystal8.MemoryCrystal8.Name\n#: /Game/SO/Items/MemoryStone/MemoryCrystal8.MemoryCrystal8.Name\nmsgctxt \"ItemData\"\nmsgid \"Final Decision\"\nmsgstr \"Final Decision\"\n\n#. Key:\tPergamen_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/Pergamen.Pergamen.Description\n#: /Game/SO/Items/QuestItems/Pergamen.Pergamen.Description\nmsgctxt \"ItemData\"\nmsgid \"'This chest and everything inside belongs to me, the Chef.'\"\nmsgstr \"'This chest and everything inside belongs to me, the Chef.'\"\n\n#. Key:\tPergamen_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/Pergamen.Pergamen.Name\n#: /Game/SO/Items/QuestItems/Pergamen.Pergamen.Name\nmsgctxt \"ItemData\"\nmsgid \"Parchment\"\nmsgstr \"Parchment\"\n\n#. Key:\tPortalGem_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/PortalGem.PortalGem.Description\n#: /Game/SO/Items/QuestItems/PortalGem.PortalGem.Description\nmsgctxt \"ItemData\"\nmsgid \"There are so many stones around. You are still not sure what's the point of picking up some of them.\"\nmsgstr \"There are so many stones around. You are still not sure what's the point of picking up some of them.\"\n\n#. Key:\tPortalGem_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/PortalGem.PortalGem.Name\n#: /Game/SO/Items/QuestItems/PortalGem.PortalGem.Name\nmsgctxt \"ItemData\"\nmsgid \"Lock Gem\"\nmsgstr \"Lock Gem\"\n\n#. Key:\tPotionOfWorthiness_desc\n#. SourceLocation:\t/Game/SO/Items/Useable/PotionOfWorthiness.PotionOfWorthiness.Description\n#: /Game/SO/Items/Useable/PotionOfWorthiness.PotionOfWorthiness.Description\nmsgctxt \"ItemData\"\nmsgid \"This might not be the weirdest side effect one can have when drinking something suspicious but it is definitely in the top five.\"\nmsgstr \"This might not be the weirdest side effect one can have when drinking something suspicious but it is definitely in the top five.\"\n\n#. Key:\tPotionOfWorthiness_name\n#. SourceLocation:\t/Game/SO/Items/Useable/PotionOfWorthiness.PotionOfWorthiness.Name\n#: /Game/SO/Items/Useable/PotionOfWorthiness.PotionOfWorthiness.Name\nmsgctxt \"ItemData\"\nmsgid \"Potion Of Worthiness\"\nmsgstr \"Potion Of Worthiness\"\n\n#. Key:\tPurpleMushroom_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/PurpleMushroom.PurpleMushroom.Description\n#: /Game/SO/Items/QuestItems/PurpleMushroom.PurpleMushroom.Description\nmsgctxt \"ItemData\"\nmsgid \"The most purple mushrooms you could find. You hope these will be enough.\"\nmsgstr \"The most purple mushrooms you could find. You hope these will be enough.\"\n\n#. Key:\tPurpleMushroom_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/PurpleMushroom.PurpleMushroom.Name\n#: /Game/SO/Items/QuestItems/PurpleMushroom.PurpleMushroom.Name\nmsgctxt \"ItemData\"\nmsgid \"Purple Mushrooms\"\nmsgstr \"Purple Mushrooms\"\n\n#. Key:\tRavenFeather_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/RavenFeather.RavenFeather.Description\n#: /Game/SO/Items/QuestItems/RavenFeather.RavenFeather.Description\nmsgctxt \"ItemData\"\nmsgid \"A magical item which gives you the ability to fly... or something like that.\"\nmsgstr \"A magical item which gives you the ability to fly... or something like that.\"\n\n#. Key:\tRavenFeather_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/RavenFeather.RavenFeather.Name\n#: /Game/SO/Items/QuestItems/RavenFeather.RavenFeather.Name\nmsgctxt \"ItemData\"\nmsgid \"Raven Feather\"\nmsgstr \"Raven Feather\"\n\n#. Key:\tRope_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/Rope.Rope.Description\n#: /Game/SO/Items/QuestItems/Rope.Rope.Description\nmsgctxt \"ItemData\"\nmsgid \"You do wonder when the area is full of ropes why this is the only one which can be taken...\"\nmsgstr \"You do wonder when the area is full of ropes why this is the only one which can be taken...\"\n\n#. Key:\tRope_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/Rope.Rope.Name\n#: /Game/SO/Items/QuestItems/Rope.Rope.Name\nmsgctxt \"ItemData\"\nmsgid \"Rope\"\nmsgstr \"Rope\"\n\n#. Key:\tRuneStoneBonusHPMagical_desc\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneBonusHPMagical.RuneStoneBonusHPMagical.Description\n#: /Game/SO/Items/RuneStones/RuneStoneBonusHPMagical.RuneStoneBonusHPMagical.Description\nmsgctxt \"ItemData\"\nmsgid \"Absorbs <Blue>30</> magical damage.\"\nmsgstr \"Absorbs <Blue>30</> magical damage.\"\n\n#. Key:\tRuneStoneBonusHPMagical_name\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneBonusHPMagical.RuneStoneBonusHPMagical.Name\n#: /Game/SO/Items/RuneStones/RuneStoneBonusHPMagical.RuneStoneBonusHPMagical.Name\nmsgctxt \"ItemData\"\nmsgid \"Bluestone\"\nmsgstr \"Bluestone\"\n\n#. Key:\tRuneStoneBonusHPPhysical_desc\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneBonusHPPhysical.RuneStoneBonusHPPhysical.Description\n#: /Game/SO/Items/RuneStones/RuneStoneBonusHPPhysical.RuneStoneBonusHPPhysical.Description\nmsgctxt \"ItemData\"\nmsgid \"Absorbs <White>30</> physical damage.\"\nmsgstr \"Absorbs <White>30</> physical damage.\"\n\n#. Key:\tRuneStoneBonusHPPhysical_name\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneBonusHPPhysical.RuneStoneBonusHPPhysical.Name\n#: /Game/SO/Items/RuneStones/RuneStoneBonusHPPhysical.RuneStoneBonusHPPhysical.Name\nmsgctxt \"ItemData\"\nmsgid \"Graystone\"\nmsgstr \"Graystone\"\n\n#. Key:\tRuneStoneBounce_desc\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.Description\n#. Key:\tRuneStoneBounce_level_desc_0\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.LevelBasedDescOverride(0).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.Description\n#: /Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.LevelBasedDescOverride(0).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Provides the ability to bounce from enemies for <Green>8</> seconds. Doing so causes <Blue>12</> damage to the target.\"\nmsgstr \"Provides the ability to bounce from enemies for <Green>8</> seconds. Doing so causes <Blue>12</> damage to the target.\"\n\n#. Key:\tRuneStoneBounce_level_desc_1\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.LevelBasedDescOverride(1).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.LevelBasedDescOverride(1).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Provides the ability to bounce from enemies for <Green>16</> seconds. Doing so causes <Blue>18</> damage to the target.\"\nmsgstr \"Provides the ability to bounce from enemies for <Green>16</> seconds. Doing so causes <Blue>18</> damage to the target.\"\n\n#. Key:\tRuneStoneBounce_level_desc_2\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.LevelBasedDescOverride(2).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.LevelBasedDescOverride(2).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Provides the ability to bounce from enemies for <Green>16</> seconds. Doing so causes <Blue>18</> damage and applies <Yellow>Stun</> on the target.\"\nmsgstr \"Provides the ability to bounce from enemies for <Green>16</> seconds. Doing so causes <Blue>18</> damage and applies <Yellow>Stun</> on the target.\"\n\n#. Key:\tRuneStoneBounce_level_desc_3\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.LevelBasedDescOverride(3).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.LevelBasedDescOverride(3).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Provides the ability to bounce from enemies for <Green>16</> seconds. Doing so causes <Blue>24</> damage and applies <Yellow>Stun</> on the target.\"\nmsgstr \"Provides the ability to bounce from enemies for <Green>16</> seconds. Doing so causes <Blue>24</> damage and applies <Yellow>Stun</> on the target.\"\n\n#. Key:\tRuneStoneBounce_level_desc_4\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.LevelBasedDescOverride(4).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.LevelBasedDescOverride(4).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Provides the ability to bounce from enemies for <Green>16</> seconds. Doing so causes <Blue>30</> damage and applies <Yellow>Stun</> on the target.\"\nmsgstr \"Provides the ability to bounce from enemies for <Green>16</> seconds. Doing so causes <Blue>30</> damage and applies <Yellow>Stun</> on the target.\"\n\n#. Key:\tRuneStoneBounce_level_up_desc_0\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.LevelUpBasedDescOverride(0).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.LevelUpBasedDescOverride(0).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Provides the ability to bounce from enemies for <Green>8</><YellowH>(→16)</> seconds. Doing so causes <Blue>12</><YellowH>(→18)</> damage to the target.\"\nmsgstr \"Provides the ability to bounce from enemies for <Green>8</><YellowH>(→16)</> seconds. Doing so causes <Blue>12</><YellowH>(→18)</> damage to the target.\"\n\n#. Key:\tRuneStoneBounce_level_up_desc_1\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.LevelUpBasedDescOverride(1).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.LevelUpBasedDescOverride(1).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Provides the ability to bounce from enemies for <Green>16</> seconds. Doing so causes <Blue>18</> damage <YellowH>and applies Stun on the target.</>\"\nmsgstr \"Provides the ability to bounce from enemies for <Green>16</> seconds. Doing so causes <Blue>18</> damage <YellowH>and applies Stun on the target.</>\"\n\n#. Key:\tRuneStoneBounce_level_up_desc_2\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.LevelUpBasedDescOverride(2).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.LevelUpBasedDescOverride(2).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Provides the ability to bounce from enemies for <Green>16</> seconds. Doing so causes <Blue>18</><YellowH>(→24)</> damage and applies <Yellow>Stun</> on the target.\"\nmsgstr \"Provides the ability to bounce from enemies for <Green>16</> seconds. Doing so causes <Blue>18</><YellowH>(→24)</> damage and applies <Yellow>Stun</> on the target.\"\n\n#. Key:\tRuneStoneBounce_level_up_desc_3\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.LevelUpBasedDescOverride(3).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.LevelUpBasedDescOverride(3).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Provides the ability to bounce from enemies for <Green>16</> seconds. Doing so causes <Blue>24</><YellowH>(→30)</> damage and applies <Yellow>Stun</> on the target.\"\nmsgstr \"Provides the ability to bounce from enemies for <Green>16</> seconds. Doing so causes <Blue>24</><YellowH>(→30)</> damage and applies <Yellow>Stun</> on the target.\"\n\n#. Key:\tRuneStoneBounce_name\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.Name\n#: /Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.Name\nmsgctxt \"ItemData\"\nmsgid \"Bouncestone\"\nmsgstr \"Bouncestone\"\n\n#. Key:\tRuneStoneEnergy_desc\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneEnergy.RuneStoneEnergy.Description\n#: /Game/SO/Items/RuneStones/RuneStoneEnergy.RuneStoneEnergy.Description\nmsgctxt \"ItemData\"\nmsgid \"Strikes and spell cooldowns are decreased by 90% for 10 seconds.\"\nmsgstr \"Strikes and spell cooldowns are decreased by 90% for 10 seconds.\"\n\n#. Key:\tRuneStoneEnergy_name\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneEnergy.RuneStoneEnergy.Name\n#: /Game/SO/Items/RuneStones/RuneStoneEnergy.RuneStoneEnergy.Name\nmsgctxt \"ItemData\"\nmsgid \"Energystone\"\nmsgstr \"Energystone\"\n\n#. Key:\tRuneStoneFire0_desc\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneFire0.RuneStoneFire0.Description\n#. Key:\tRuneStoneFire0_level_desc_0\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneFire0.RuneStoneFire0.LevelBasedDescOverride(0).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneFire0.RuneStoneFire0.Description\n#: /Game/SO/Items/RuneStones/RuneStoneFire0.RuneStoneFire0.LevelBasedDescOverride(0).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons a powerful blast roasting anything in a straight line.\\nCauses <Blue>16</> damage.\"\nmsgstr \"Summons a powerful blast roasting anything in a straight line.\\nCauses <Blue>16</> damage.\"\n\n#. Key:\tRuneStoneFire0_level_desc_1\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneFire0.RuneStoneFire0.LevelBasedDescOverride(1).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneFire0.RuneStoneFire0.LevelBasedDescOverride(1).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons a powerful blast roasting anything in a straight line.\\nCauses <Blue>32</> damage.\"\nmsgstr \"Summons a powerful blast roasting anything in a straight line.\\nCauses <Blue>32</> damage.\"\n\n#. Key:\tRuneStoneFire0_level_desc_2\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneFire0.RuneStoneFire0.LevelBasedDescOverride(2).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneFire0.RuneStoneFire0.LevelBasedDescOverride(2).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons a powerful blast roasting anything in a straight line.\\nCauses <Blue>36</> damage. The spell has <Green>50%</> chance to <Purple>Instant Recharge.</>\"\nmsgstr \"Summons a powerful blast roasting anything in a straight line.\\nCauses <Blue>36</> damage. The spell has <Green>50%</> chance to <Purple>Instant Recharge.</>\"\n\n#. Key:\tRuneStoneFire0_level_desc_3\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneFire0.RuneStoneFire0.LevelBasedDescOverride(3).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneFire0.RuneStoneFire0.LevelBasedDescOverride(3).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons a powerful blast roasting anything in a straight line.\\nCauses <Blue>52</> damage. The spell has <Green>50%</> chance to <Purple>Instant Recharge.</>\"\nmsgstr \"Summons a powerful blast roasting anything in a straight line.\\nCauses <Blue>52</> damage. The spell has <Green>50%</> chance to <Purple>Instant Recharge.</>\"\n\n#. Key:\tRuneStoneFire0_level_up_desc_0\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneFire0.RuneStoneFire0.LevelUpBasedDescOverride(0).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneFire0.RuneStoneFire0.LevelUpBasedDescOverride(0).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons a powerful blast roasting anything in a straight line.\\nCauses <Blue>16</><YellowH>(→32)</> damage.\"\nmsgstr \"Summons a powerful blast roasting anything in a straight line.\\nCauses <Blue>16</><YellowH>(→32)</> damage.\"\n\n#. Key:\tRuneStoneFire0_level_up_desc_1\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneFire0.RuneStoneFire0.LevelUpBasedDescOverride(1).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneFire0.RuneStoneFire0.LevelUpBasedDescOverride(1).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons a powerful blast roasting anything in a straight line.\\nCauses <Blue>32</><YellowH>(→36)</> damage. <YellowH>The spell has </><GreenH>50%</> <YellowH>chance to </><PurpleH>Instant Recharge.</>\"\nmsgstr \"Summons a powerful blast roasting anything in a straight line.\\nCauses <Blue>32</><YellowH>(→36)</> damage. <YellowH>The spell has </><GreenH>50%</> <YellowH>chance to </><PurpleH>Instant Recharge.</>\"\n\n#. Key:\tRuneStoneFire0_level_up_desc_2\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneFire0.RuneStoneFire0.LevelUpBasedDescOverride(2).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneFire0.RuneStoneFire0.LevelUpBasedDescOverride(2).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons a powerful blast roasting anything in a straight line.\\nCauses <Blue>36</><YellowH>(→52)</> damage. The spell has <Green>50%</> chance to <Purple>Instant Recharge.</>\"\nmsgstr \"Summons a powerful blast roasting anything in a straight line.\\nCauses <Blue>36</><YellowH>(→52)</> damage. The spell has <Green>50%</> chance to <Purple>Instant Recharge.</>\"\n\n#. Key:\tRuneStoneFire0_name\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneFire0.RuneStoneFire0.Name\n#: /Game/SO/Items/RuneStones/RuneStoneFire0.RuneStoneFire0.Name\nmsgctxt \"ItemData\"\nmsgid \"Firestone\"\nmsgstr \"Firestone\"\n\n#. Key:\tRuneStoneHeal_desc\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneHeal.RuneStoneHeal.Description\n#: /Game/SO/Items/RuneStones/RuneStoneHeal.RuneStoneHeal.Description\nmsgctxt \"ItemData\"\nmsgid \"Restores <Green>30</> health points.\"\nmsgstr \"Restores <Green>30</> health points.\"\n\n#. Key:\tRuneStoneHeal_name\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneHeal.RuneStoneHeal.Name\n#: /Game/SO/Items/RuneStones/RuneStoneHeal.RuneStoneHeal.Name\nmsgctxt \"ItemData\"\nmsgid \"Healstone\"\nmsgstr \"Healstone\"\n\n#. Key:\tRuneStoneLightningWalk_desc\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneLightningWalk.RuneStoneLightningWalk.Description\n#: /Game/SO/Items/RuneStones/RuneStoneLightningWalk.RuneStoneLightningWalk.Description\nmsgctxt \"ItemData\"\nmsgid \"Grants the shocking ability to walk through your enemies for <Green>2</> sec. The shock causes <Blue>10</> damage.\"\nmsgstr \"Grants the shocking ability to walk through your enemies for <Green>2</> sec. The shock causes <Blue>10</> damage.\"\n\n#. Key:\tRuneStoneLightningWalk_level_desc_0\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneLightningWalk.RuneStoneLightningWalk.LevelBasedDescOverride(0).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneLightningWalk.RuneStoneLightningWalk.LevelBasedDescOverride(0).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Grants the shocking ability to walk through your enemies for <Green>2</> sec. The shock causes <Blue>16</> damage.\"\nmsgstr \"Grants the shocking ability to walk through your enemies for <Green>2</> sec. The shock causes <Blue>16</> damage.\"\n\n#. Key:\tRuneStoneLightningWalk_level_desc_1\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneLightningWalk.RuneStoneLightningWalk.LevelBasedDescOverride(1).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneLightningWalk.RuneStoneLightningWalk.LevelBasedDescOverride(1).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Grants the shocking ability to walk through your enemies for <Green>3</> sec. The shock causes <Blue>28</> damage.\"\nmsgstr \"Grants the shocking ability to walk through your enemies for <Green>3</> sec. The shock causes <Blue>28</> damage.\"\n\n#. Key:\tRuneStoneLightningWalk_level_desc_2\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneLightningWalk.RuneStoneLightningWalk.LevelBasedDescOverride(2).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneLightningWalk.RuneStoneLightningWalk.LevelBasedDescOverride(2).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Grants the shocking ability to walk through your enemies for <Green>4</> sec. The shock causes <Blue>32</> damage and has a <Green>30%</> chance to <Yellow>stun</> the target.\"\nmsgstr \"Grants the shocking ability to walk through your enemies for <Green>4</> sec. The shock causes <Blue>32</> damage and has a <Green>30%</> chance to <Yellow>stun</> the target.\"\n\n#. Key:\tRuneStoneLightningWalk_level_desc_3\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneLightningWalk.RuneStoneLightningWalk.LevelBasedDescOverride(3).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneLightningWalk.RuneStoneLightningWalk.LevelBasedDescOverride(3).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Grants the shocking ability to walk through your enemies for <Green>4</> sec. The shock causes <Blue>32</> damage and has a <Green>40%</> chance to <Yellow>stun</> the target.\"\nmsgstr \"Grants the shocking ability to walk through your enemies for <Green>4</> sec. The shock causes <Blue>32</> damage and has a <Green>40%</> chance to <Yellow>stun</> the target.\"\n\n#. Key:\tRuneStoneLightningWalk_level_up_desc_0\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneLightningWalk.RuneStoneLightningWalk.LevelUpBasedDescOverride(0).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneLightningWalk.RuneStoneLightningWalk.LevelUpBasedDescOverride(0).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Grants the shocking ability to walk through your enemies for <Green>2</><YellowH>(→3)</> sec. The shock causes <Blue>16</> <YellowH>(→28)</>damage.\"\nmsgstr \"Grants the shocking ability to walk through your enemies for <Green>2</><YellowH>(→3)</> sec. The shock causes <Blue>16</> <YellowH>(→28)</>damage.\"\n\n#. Key:\tRuneStoneLightningWalk_level_up_desc_1\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneLightningWalk.RuneStoneLightningWalk.LevelUpBasedDescOverride(1).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneLightningWalk.RuneStoneLightningWalk.LevelUpBasedDescOverride(1).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Grants the shocking ability to walk through your enemies for <Green>3</><YellowH>(→4)</> sec. The shock causes <Blue>28</> <YellowH>(→36)</>damage <YellowH>and has a </><GreenH>30%</> <YellowH>chance to stun the target.</>\"\nmsgstr \"Grants the shocking ability to walk through your enemies for <Green>3</><YellowH>(→4)</> sec. The shock causes <Blue>28</> <YellowH>(→36)</>damage <YellowH>and has a </><GreenH>30%</> <YellowH>chance to stun the target.</>\"\n\n#. Key:\tRuneStoneLightningWalk_level_up_desc_2\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneLightningWalk.RuneStoneLightningWalk.LevelUpBasedDescOverride(2).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneLightningWalk.RuneStoneLightningWalk.LevelUpBasedDescOverride(2).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Grants the shocking ability to walk through your enemies for <Green>4</> sec. The shock causes <Blue>32</> damage and has a <Green>30%</> <YellowH>(→40%)</> chance to <Yellow>stun</> the target.\"\nmsgstr \"Grants the shocking ability to walk through your enemies for <Green>4</> sec. The shock causes <Blue>32</> damage and has a <Green>30%</> <YellowH>(→40%)</> chance to <Yellow>stun</> the target.\"\n\n#. Key:\tRuneStoneLightningWalk_name\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneLightningWalk.RuneStoneLightningWalk.Name\n#: /Game/SO/Items/RuneStones/RuneStoneLightningWalk.RuneStoneLightningWalk.Name\nmsgctxt \"ItemData\"\nmsgid \"Lightningstone\"\nmsgstr \"Lightningstone\"\n\n#. Key:\tRuneStoneMagicMissle_desc\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMagicMissle.RuneStoneMagicMissle.Description\n#: /Game/SO/Items/RuneStones/RuneStoneMagicMissle.RuneStoneMagicMissle.Description\nmsgctxt \"ItemData\"\nmsgid \"Summons a homing projectile targeted at a close foe - prefers flying targets.\"\nmsgstr \"Summons a homing projectile targeted at a close foe - prefers flying targets.\"\n\n#. Key:\tRuneStoneMagicMissle_level_desc_0\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMagicMissle.RuneStoneMagicMissle.LevelBasedDescOverride(0).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneMagicMissle.RuneStoneMagicMissle.LevelBasedDescOverride(0).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons <Green>1</> homing projectile targeted at a close foe - prefers flying targets. Causes <Blue>16</> damage on impact.\"\nmsgstr \"Summons <Green>1</> homing projectile targeted at a close foe - prefers flying targets. Causes <Blue>16</> damage on impact.\"\n\n#. Key:\tRuneStoneMagicMissle_level_desc_1\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMagicMissle.RuneStoneMagicMissle.LevelBasedDescOverride(1).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneMagicMissle.RuneStoneMagicMissle.LevelBasedDescOverride(1).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons <Green>2</> homing projectile targeted at a close foe - prefers flying targets. Each projectile causes <Blue>16</> damage on impact.\"\nmsgstr \"Summons <Green>2</> homing projectile targeted at a close foe - prefers flying targets. Each projectile causes <Blue>16</> damage on impact.\"\n\n#. Key:\tRuneStoneMagicMissle_level_desc_2\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMagicMissle.RuneStoneMagicMissle.LevelBasedDescOverride(2).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneMagicMissle.RuneStoneMagicMissle.LevelBasedDescOverride(2).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons <Green>3</> homing projectile targeted at a close foe - prefers flying targets. Each projectile causes <Blue>16</> damage and applies <Orange>Slow</> on impact.\"\nmsgstr \"Summons <Green>3</> homing projectile targeted at a close foe - prefers flying targets. Each projectile causes <Blue>16</> damage and applies <Orange>Slow</> on impact.\"\n\n#. Key:\tRuneStoneMagicMissle_level_desc_3\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMagicMissle.RuneStoneMagicMissle.LevelBasedDescOverride(3).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneMagicMissle.RuneStoneMagicMissle.LevelBasedDescOverride(3).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons <Green>4</> homing projectile targeted at a close foe - prefers flying targets. Each projectile causes <Blue>16</> damage and applies <Orange>Slow</> on impact.\"\nmsgstr \"Summons <Green>4</> homing projectile targeted at a close foe - prefers flying targets. Each projectile causes <Blue>16</> damage and applies <Orange>Slow</> on impact.\"\n\n#. Key:\tRuneStoneMagicMissle_level_up_desc_0\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMagicMissle.RuneStoneMagicMissle.LevelUpBasedDescOverride(0).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneMagicMissle.RuneStoneMagicMissle.LevelUpBasedDescOverride(0).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons <Green>1</><YellowH>(→2)</> homing projectile targeted at a close foe - prefers flying targets. Each projectile causes <Blue>16</> damage on impact.\"\nmsgstr \"Summons <Green>1</><YellowH>(→2)</> homing projectile targeted at a close foe - prefers flying targets. Each projectile causes <Blue>16</> damage on impact.\"\n\n#. Key:\tRuneStoneMagicMissle_level_up_desc_1\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMagicMissle.RuneStoneMagicMissle.LevelUpBasedDescOverride(1).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneMagicMissle.RuneStoneMagicMissle.LevelUpBasedDescOverride(1).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons <Green>2</><YellowH>(→3)</> homing projectile targeted at a close foe - prefers flying targets. Each projectile causes <Blue>16</> damage <YellowH>and applies</> <OrangeH>Slow</> on impact.\"\nmsgstr \"Summons <Green>2</><YellowH>(→3)</> homing projectile targeted at a close foe - prefers flying targets. Each projectile causes <Blue>16</> damage <YellowH>and applies</> <OrangeH>Slow</> on impact.\"\n\n#. Key:\tRuneStoneMagicMissle_level_up_desc_2\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMagicMissle.RuneStoneMagicMissle.LevelUpBasedDescOverride(2).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneMagicMissle.RuneStoneMagicMissle.LevelUpBasedDescOverride(2).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons <Green>3</><YellowH>(→4)</> homing projectile targeted at a close foe - prefers flying targets. Each projectile causes <Blue>16</> damage and applies <Orange>Slow</> on impact.\"\nmsgstr \"Summons <Green>3</><YellowH>(→4)</> homing projectile targeted at a close foe - prefers flying targets. Each projectile causes <Blue>16</> damage and applies <Orange>Slow</> on impact.\"\n\n#. Key:\tRuneStoneMagicMissle_name\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMagicMissle.RuneStoneMagicMissle.Name\n#: /Game/SO/Items/RuneStones/RuneStoneMagicMissle.RuneStoneMagicMissle.Name\nmsgctxt \"ItemData\"\nmsgid \"Tealstone\"\nmsgstr \"Tealstone\"\n\n#. Key:\tRuneStoneMassMagicMissle_desc\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMassMagicMissle.RuneStoneMassMagicMissle.Description\n#. Key:\tRuneStoneMassMagicMissle_level_desc_0\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMassMagicMissle.RuneStoneMassMagicMissle.LevelBasedDescOverride(0).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneMassMagicMissle.RuneStoneMassMagicMissle.Description\n#: /Game/SO/Items/RuneStones/RuneStoneMassMagicMissle.RuneStoneMassMagicMissle.LevelBasedDescOverride(0).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons a homing projectile for each nearby enemy, causing <Blue>20</> damage on impact.\"\nmsgstr \"Summons a homing projectile for each nearby enemy, causing <Blue>20</> damage on impact.\"\n\n#. Key:\tRuneStoneMassMagicMissle_level_desc_1\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMassMagicMissle.RuneStoneMassMagicMissle.LevelBasedDescOverride(1).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneMassMagicMissle.RuneStoneMassMagicMissle.LevelBasedDescOverride(1).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons a homing projectile for each nearby enemy, causing <Blue>40</> damage on impact.\"\nmsgstr \"Summons a homing projectile for each nearby enemy, causing <Blue>40</> damage on impact.\"\n\n#. Key:\tRuneStoneMassMagicMissle_level_desc_2\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMassMagicMissle.RuneStoneMassMagicMissle.LevelBasedDescOverride(2).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneMassMagicMissle.RuneStoneMassMagicMissle.LevelBasedDescOverride(2).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons a homing projectile for each nearby enemy, causing <Blue>50</> damage on impact. The target has a <Green>30%</> chance to become <Orange>Slow</>.\"\nmsgstr \"Summons a homing projectile for each nearby enemy, causing <Blue>50</> damage on impact. The target has a <Green>30%</> chance to become <Orange>Slow</>.\"\n\n#. Key:\tRuneStoneMassMagicMissle_level_up_desc_0\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMassMagicMissle.RuneStoneMassMagicMissle.LevelUpBasedDescOverride(0).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneMassMagicMissle.RuneStoneMassMagicMissle.LevelUpBasedDescOverride(0).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons a homing projectile for each nearby enemy, causing <Blue>20</><YellowH>(→40)</> damage on impact.\"\nmsgstr \"Summons a homing projectile for each nearby enemy, causing <Blue>20</><YellowH>(→40)</> damage on impact.\"\n\n#. Key:\tRuneStoneMassMagicMissle_level_up_desc_1\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMassMagicMissle.RuneStoneMassMagicMissle.LevelUpBasedDescOverride(1).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneMassMagicMissle.RuneStoneMassMagicMissle.LevelUpBasedDescOverride(1).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons a homing projectile for each nearby enemy, causing <Blue>20</><YellowH>(→50)</> damage on impact. <YellowH>The target has a</> <GreenH>30%</> <YellowH>chance to become</> <Orange>Slow</>.\"\nmsgstr \"Summons a homing projectile for each nearby enemy, causing <Blue>20</><YellowH>(→50)</> damage on impact. <YellowH>The target has a</> <GreenH>30%</> <YellowH>chance to become</> <Orange>Slow</>.\"\n\n#. Key:\tRuneStoneMassMagicMissle_name\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMassMagicMissle.RuneStoneMassMagicMissle.Name\n#: /Game/SO/Items/RuneStones/RuneStoneMassMagicMissle.RuneStoneMassMagicMissle.Name\nmsgctxt \"ItemData\"\nmsgid \"Tealstone, but better\"\nmsgstr \"Tealstone, but better\"\n\n#. Key:\tRuneStoneMassSlow_desc\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMassSlow.RuneStoneMassSlow.Description\n#: /Game/SO/Items/RuneStones/RuneStoneMassSlow.RuneStoneMassSlow.Description\nmsgctxt \"ItemData\"\nmsgid \"Slows all enemy targets around the caster.\"\nmsgstr \"Slows all enemy targets around the caster.\"\n\n#. Key:\tRuneStoneMassSlow_level_desc_0\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMassSlow.RuneStoneMassSlow.LevelBasedDescOverride(0).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneMassSlow.RuneStoneMassSlow.LevelBasedDescOverride(0).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"All enemy target becomes <Orange>Slow</> for <Green>3</> seconds.\"\nmsgstr \"All enemy target becomes <Orange>Slow</> for <Green>3</> seconds.\"\n\n#. Key:\tRuneStoneMassSlow_name\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMassSlow.RuneStoneMassSlow.Name\n#: /Game/SO/Items/RuneStones/RuneStoneMassSlow.RuneStoneMassSlow.Name\nmsgctxt \"ItemData\"\nmsgid \"Slowstone\"\nmsgstr \"Slowstone\"\n\n#. Key:\tRuneStoneMeteorShower_desc\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMeteorShower.RuneStoneMeteorShower.Description\n#: /Game/SO/Items/RuneStones/RuneStoneMeteorShower.RuneStoneMeteorShower.Description\nmsgctxt \"ItemData\"\nmsgid \"Summons 12 deadly meteors around the caster, each causing 16 damage on impact.\"\nmsgstr \"Summons 12 deadly meteors around the caster, each causing 16 damage on impact.\"\n\n#. Key:\tRuneStoneMeteorShower_level_desc_0\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMeteorShower.RuneStoneMeteorShower.LevelBasedDescOverride(0).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneMeteorShower.RuneStoneMeteorShower.LevelBasedDescOverride(0).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons <Green>12</> deadly meteors around the caster, each causing <White>16</> damage on impact.\"\nmsgstr \"Summons <Green>12</> deadly meteors around the caster, each causing <White>16</> damage on impact.\"\n\n#. Key:\tRuneStoneMeteorShower_level_desc_1\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMeteorShower.RuneStoneMeteorShower.LevelBasedDescOverride(1).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneMeteorShower.RuneStoneMeteorShower.LevelBasedDescOverride(1).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons <Green>16</> deadly meteors around the caster, each causing <White>24</> damage on impact.\"\nmsgstr \"Summons <Green>16</> deadly meteors around the caster, each causing <White>24</> damage on impact.\"\n\n#. Key:\tRuneStoneMeteorShower_level_desc_2\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMeteorShower.RuneStoneMeteorShower.LevelBasedDescOverride(2).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneMeteorShower.RuneStoneMeteorShower.LevelBasedDescOverride(2).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons <Green>20</> deadly meteors around the caster, each causing <White>32</> damage on impact. Each meteor has a <Green>30%</> chance to <Yellow>Stun</> the target.\"\nmsgstr \"Summons <Green>20</> deadly meteors around the caster, each causing <White>32</> damage on impact. Each meteor has a <Green>30%</> chance to <Yellow>Stun</> the target.\"\n\n#. Key:\tRuneStoneMeteorShower_level_up_desc_0\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMeteorShower.RuneStoneMeteorShower.LevelUpBasedDescOverride(0).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneMeteorShower.RuneStoneMeteorShower.LevelUpBasedDescOverride(0).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons <Green>12</><YellowH>(→16)</> deadly meteors around the caster, each causing <White>16</><YellowH>(→24)</> damage on impact.\"\nmsgstr \"Summons <Green>12</><YellowH>(→16)</> deadly meteors around the caster, each causing <White>16</><YellowH>(→24)</> damage on impact.\"\n\n#. Key:\tRuneStoneMeteorShower_level_up_desc_1\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMeteorShower.RuneStoneMeteorShower.LevelUpBasedDescOverride(1).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneMeteorShower.RuneStoneMeteorShower.LevelUpBasedDescOverride(1).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons <Green>16</><YellowH>(→20)</> deadly meteors around the caster, each causing <White>24</><YellowH>(→32)</> damage on impact. <YellowH>Each meteor has a</> <GreenH>30%</> <YellowH>chance to Stun the target.</>\"\nmsgstr \"Summons <Green>16</><YellowH>(→20)</> deadly meteors around the caster, each causing <White>24</><YellowH>(→32)</> damage on impact. <YellowH>Each meteor has a</> <GreenH>30%</> <YellowH>chance to Stun the target.</>\"\n\n#. Key:\tRuneStoneMeteorShower_name\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMeteorShower.RuneStoneMeteorShower.Name\n#: /Game/SO/Items/RuneStones/RuneStoneMeteorShower.RuneStoneMeteorShower.Name\nmsgctxt \"ItemData\"\nmsgid \"Meteorstone\"\nmsgstr \"Meteorstone\"\n\n#. Key:\tRuneStoneShadowWalk_desc\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneShadowWalk.RuneStoneShadowWalk.Description\n#. Key:\tRuneStoneShadowWalk_level_desc_0\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneShadowWalk.RuneStoneShadowWalk.LevelBasedDescOverride(0).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneShadowWalk.RuneStoneShadowWalk.Description\n#: /Game/SO/Items/RuneStones/RuneStoneShadowWalk.RuneStoneShadowWalk.LevelBasedDescOverride(0).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Grants the ability to walk through your enemies for <Green>2</> seconds.\"\nmsgstr \"Grants the ability to walk through your enemies for <Green>2</> seconds.\"\n\n#. Key:\tRuneStoneShadowWalk_level_desc_1\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneShadowWalk.RuneStoneShadowWalk.LevelBasedDescOverride(1).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneShadowWalk.RuneStoneShadowWalk.LevelBasedDescOverride(1).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Grants the ability to walk through your enemies for <Green>4</> seconds.\"\nmsgstr \"Grants the ability to walk through your enemies for <Green>4</> seconds.\"\n\n#. Key:\tRuneStoneShadowWalk_level_desc_2\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneShadowWalk.RuneStoneShadowWalk.LevelBasedDescOverride(2).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneShadowWalk.RuneStoneShadowWalk.LevelBasedDescOverride(2).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Grants the ability to walk through your enemies for <Green>4</> seconds. Your magical resistance is increased by <Green>0.2.</>\"\nmsgstr \"Grants the ability to walk through your enemies for <Green>4</> seconds. Your magical resistance is increased by <Green>0.2.</>\"\n\n#. Key:\tRuneStoneShadowWalk_level_desc_3\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneShadowWalk.RuneStoneShadowWalk.LevelBasedDescOverride(3).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneShadowWalk.RuneStoneShadowWalk.LevelBasedDescOverride(3).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Grants the ability to walk through your enemies for <Green>5</> seconds. Your magical resistance is increased by <Green>0.3.</>\"\nmsgstr \"Grants the ability to walk through your enemies for <Green>5</> seconds. Your magical resistance is increased by <Green>0.3.</>\"\n\n#. Key:\tRuneStoneShadowWalk_level_up_desc_0\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneShadowWalk.RuneStoneShadowWalk.LevelUpBasedDescOverride(0).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneShadowWalk.RuneStoneShadowWalk.LevelUpBasedDescOverride(0).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Grants the ability to walk through your enemies for <Green>2</> <YellowH>(→4)</> seconds.\"\nmsgstr \"Grants the ability to walk through your enemies for <Green>2</> <YellowH>(→4)</> seconds.\"\n\n#. Key:\tRuneStoneShadowWalk_level_up_desc_1\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneShadowWalk.RuneStoneShadowWalk.LevelUpBasedDescOverride(1).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneShadowWalk.RuneStoneShadowWalk.LevelUpBasedDescOverride(1).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Grants the ability to walk through your enemies for <Green>4</> seconds. <YellowH>Your magical resistance is increased by</> <GreenH>0.2.</>\"\nmsgstr \"Grants the ability to walk through your enemies for <Green>4</> seconds. <YellowH>Your magical resistance is increased by</> <GreenH>0.2.</>\"\n\n#. Key:\tRuneStoneShadowWalk_level_up_desc_2\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneShadowWalk.RuneStoneShadowWalk.LevelUpBasedDescOverride(2).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneShadowWalk.RuneStoneShadowWalk.LevelUpBasedDescOverride(2).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Grants the ability to walk through your enemies for <Green>4</> <YellowH>(→5)</> seconds. Your magical resistance is increased by <Green>0.2</> <YellowH>(→0.3).</>\"\nmsgstr \"Grants the ability to walk through your enemies for <Green>4</> <YellowH>(→5)</> seconds. Your magical resistance is increased by <Green>0.2</> <YellowH>(→0.3).</>\"\n\n#. Key:\tRuneStoneShadowWalk_name\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneShadowWalk.RuneStoneShadowWalk.Name\n#: /Game/SO/Items/RuneStones/RuneStoneShadowWalk.RuneStoneShadowWalk.Name\nmsgctxt \"ItemData\"\nmsgid \"Shadestone\"\nmsgstr \"Shadestone\"\n\n#. Key:\tRuneStoneSoulkeeper_desc\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneSoulkeeper.RuneStoneSoulkeeper.Description\n#: /Game/SO/Items/RuneStones/RuneStoneSoulkeeper.RuneStoneSoulkeeper.Description\nmsgctxt \"ItemData\"\nmsgid \"Summons the Soulkeeper, a powerful spirit capable of gathering your essence should something bad happen to you.\\r\\n\\r\\nReleasing the spirit recharges the stone.\"\nmsgstr \"Summons the Soulkeeper, a powerful spirit capable of gathering your essence should something bad happen to you.\\r\\n\\r\\nReleasing the spirit recharges the stone.\"\n\n#. Key:\tRuneStoneSoulkeeper_name\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneSoulkeeper.RuneStoneSoulkeeper.Name\n#: /Game/SO/Items/RuneStones/RuneStoneSoulkeeper.RuneStoneSoulkeeper.Name\nmsgctxt \"ItemData\"\nmsgid \"Soulstone\"\nmsgstr \"Soulstone\"\n\n#. Key:\tRuneStoneSoulkeeperInfinite_desc\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneSoulkeeperInfinite.RuneStoneSoulkeeperInfinite.Description\n#: /Game/SO/Items/RuneStones/RuneStoneSoulkeeperInfinite.RuneStoneSoulkeeperInfinite.Description\nmsgctxt \"ItemData\"\nmsgid \"Summons the Soulkeeper, a powerful spirit capable of gathering your essence should something bad happen to you.\"\nmsgstr \"Summons the Soulkeeper, a powerful spirit capable of gathering your essence should something bad happen to you.\"\n\n#. Key:\tRuneStoneSoulkeeperInfinite_name\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneSoulkeeperInfinite.RuneStoneSoulkeeperInfinite.Name\n#: /Game/SO/Items/RuneStones/RuneStoneSoulkeeperInfinite.RuneStoneSoulkeeperInfinite.Name\nmsgctxt \"ItemData\"\nmsgid \"Elite Soulstone\"\nmsgstr \"Elite Soulstone\"\n\n#. Key:\tRuneStoneSpellRegain_desc\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneSpellRegain.RuneStoneSpellRegain.Description\n#: /Game/SO/Items/RuneStones/RuneStoneSpellRegain.RuneStoneSpellRegain.Description\nmsgctxt \"ItemData\"\nmsgid \"Regenerates all other spell charges.\"\nmsgstr \"Regenerates all other spell charges.\"\n\n#. Key:\tRuneStoneSpellRegain_name\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneSpellRegain.RuneStoneSpellRegain.Name\n#: /Game/SO/Items/RuneStones/RuneStoneSpellRegain.RuneStoneSpellRegain.Name\nmsgctxt \"ItemData\"\nmsgid \"Spiritstone\"\nmsgstr \"Spiritstone\"\n\n#. Key:\tRuneStoneSwap_desc\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.Description\n#. Key:\tRuneStoneSwap_level_desc_0\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.LevelBasedDescOverride(0).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.Description\n#: /Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.LevelBasedDescOverride(0).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Swaps the position of the caster with the closest target in front of him/her/it.\"\nmsgstr \"Swaps the position of the caster with the closest target in front of him/her/it.\"\n\n#. Key:\tRuneStoneSwap_level_desc_1\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.LevelBasedDescOverride(1).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.LevelBasedDescOverride(1).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Swaps the position of the caster with the closest target in front of him/her/it. The selected target suffers <Blue>20</> damage.\"\nmsgstr \"Swaps the position of the caster with the closest target in front of him/her/it. The selected target suffers <Blue>20</> damage.\"\n\n#. Key:\tRuneStoneSwap_level_desc_2\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.LevelBasedDescOverride(2).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.LevelBasedDescOverride(2).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Swaps the position of the caster with the closest target in front of him/her/it. The selected target suffers <Blue>30</> damage and becomes <Orange>Slow</>.\"\nmsgstr \"Swaps the position of the caster with the closest target in front of him/her/it. The selected target suffers <Blue>30</> damage and becomes <Orange>Slow</>.\"\n\n#. Key:\tRuneStoneSwap_level_desc_3\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.LevelBasedDescOverride(3).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.LevelBasedDescOverride(3).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Swaps the position of the caster with the closest target in front of him/her/it. The selected target suffers <Blue>40</> damage and becomes <Orange>Slow</>.\"\nmsgstr \"Swaps the position of the caster with the closest target in front of him/her/it. The selected target suffers <Blue>40</> damage and becomes <Orange>Slow</>.\"\n\n#. Key:\tRuneStoneSwap_level_desc_4\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.LevelBasedDescOverride(4).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.LevelBasedDescOverride(4).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Swaps the position of the caster with the closest target in front of him/her/it. The selected target suffers <Blue>50</> damage and becomes <Orange>Slow</>.\"\nmsgstr \"Swaps the position of the caster with the closest target in front of him/her/it. The selected target suffers <Blue>50</> damage and becomes <Orange>Slow</>.\"\n\n#. Key:\tRuneStoneSwap_level_up_desc_0\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.LevelUpBasedDescOverride(0).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.LevelUpBasedDescOverride(0).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Swaps the position of the caster with the closest target in front of him/her/it. <YellowH>The selected target suffers</> <BlueH>20</> <YellowH>damage.</>\"\nmsgstr \"Swaps the position of the caster with the closest target in front of him/her/it. <YellowH>The selected target suffers</> <BlueH>20</> <YellowH>damage.</>\"\n\n#. Key:\tRuneStoneSwap_level_up_desc_1\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.LevelUpBasedDescOverride(1).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.LevelUpBasedDescOverride(1).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Swaps the position of the caster with the closest target in front of him/her/it. The selected target suffers <Blue>20</><YellowH>(→30)</> damage <YellowH>and becomes </><Orange>Slow.</>\"\nmsgstr \"Swaps the position of the caster with the closest target in front of him/her/it. The selected target suffers <Blue>20</><YellowH>(→30)</> damage <YellowH>and becomes </><Orange>Slow.</>\"\n\n#. Key:\tRuneStoneSwap_level_up_desc_2\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.LevelUpBasedDescOverride(2).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.LevelUpBasedDescOverride(2).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Swaps the position of the caster with the closest target in front of him/her/it. The selected target suffers <Blue>30</><YellowH>(→40)</> damage and becomes <Orange>Slow.</>\"\nmsgstr \"Swaps the position of the caster with the closest target in front of him/her/it. The selected target suffers <Blue>30</><YellowH>(→40)</> damage and becomes <Orange>Slow.</>\"\n\n#. Key:\tRuneStoneSwap_level_up_desc_3\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.LevelUpBasedDescOverride(3).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.LevelUpBasedDescOverride(3).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Swaps the position of the caster with the closest target in front of him/her/it. The selected target suffers <Blue>40</><YellowH>(→50)</> damage and becomes <Orange>Slow.</>\"\nmsgstr \"Swaps the position of the caster with the closest target in front of him/her/it. The selected target suffers <Blue>40</><YellowH>(→50)</> damage and becomes <Orange>Slow.</>\"\n\n#. Key:\tRuneStoneSwap_name\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.Name\n#: /Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.Name\nmsgctxt \"ItemData\"\nmsgid \"Swapstone\"\nmsgstr \"Swapstone\"\n\n#. Key:\tRuneStoneWeaponFlame_desc\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.Description\n#: /Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.Description\nmsgctxt \"ItemData\"\nmsgid \"Enchants your active weapon with green flames - it causes an additional 0.3x damage for 4 seconds.\"\nmsgstr \"Enchants your active weapon with green flames - it causes an additional 0.3x damage for 4 seconds.\"\n\n#. Key:\tRuneStoneWeaponFlame_level_desc_0\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.LevelBasedDescOverride(0).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.LevelBasedDescOverride(0).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Enchants your active weapon - it causes an additional <Green>0.5x</> damage for <Green>5</> seconds.\"\nmsgstr \"Enchants your active weapon - it causes an additional <Green>0.5x</> damage for <Green>5</> seconds.\"\n\n#. Key:\tRuneStoneWeaponFlame_level_desc_1\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.LevelBasedDescOverride(1).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.LevelBasedDescOverride(1).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Enchants your active weapon - it causes an additional <Green>0.6x</> damage for <Green>5</> seconds. Each strike has a <Green>15%</> chance to apply <DarkGreen>Poison</>, causing an additional <Blue>18</> damage over <Green>6</> seconds.\"\nmsgstr \"Enchants your active weapon - it causes an additional <Green>0.6x</> damage for <Green>5</> seconds. Each strike has a <Green>15%</> chance to apply <DarkGreen>Poison</>, causing an additional <Blue>18</> damage over <Green>6</> seconds.\"\n\n#. Key:\tRuneStoneWeaponFlame_level_desc_2\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.LevelBasedDescOverride(2).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.LevelBasedDescOverride(2).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Enchants your active weapon - it causes an additional <Green>0.7x</> damage for <Green>6</> seconds. Each strike has a <Green>20%</> chance to apply <DarkGreen>Poison</>, causing an additional <Blue>24</> damage over <Green>6</> seconds.\"\nmsgstr \"Enchants your active weapon - it causes an additional <Green>0.7x</> damage for <Green>6</> seconds. Each strike has a <Green>20%</> chance to apply <DarkGreen>Poison</>, causing an additional <Blue>24</> damage over <Green>6</> seconds.\"\n\n#. Key:\tRuneStoneWeaponFlame_level_desc_3\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.LevelBasedDescOverride(3).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.LevelBasedDescOverride(3).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Enchants your active weapon - it causes an additional <Green>0.8x</> damage for <Green>6</> seconds. Each strike has a <Green>25%</> chance to apply <DarkGreen>Poison</>, causing an additional <Blue>30</> damage over <Green>6</> seconds.\"\nmsgstr \"Enchants your active weapon - it causes an additional <Green>0.8x</> damage for <Green>6</> seconds. Each strike has a <Green>25%</> chance to apply <DarkGreen>Poison</>, causing an additional <Blue>30</> damage over <Green>6</> seconds.\"\n\n#. Key:\tRuneStoneWeaponFlame_level_desc_4\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.LevelBasedDescOverride(4).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.LevelBasedDescOverride(4).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Enchants your active weapon - it causes an additional <Green>0.9x</> damage for <Green>6</> seconds. Each strike has a <Green>30%</> chance to apply <DarkGreen>Poison</>, causing an additional <Blue>36</> damage over <Green>6</> seconds.\"\nmsgstr \"Enchants your active weapon - it causes an additional <Green>0.9x</> damage for <Green>6</> seconds. Each strike has a <Green>30%</> chance to apply <DarkGreen>Poison</>, causing an additional <Blue>36</> damage over <Green>6</> seconds.\"\n\n#. Key:\tRuneStoneWeaponFlame_level_up_desc_0\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.LevelUpBasedDescOverride(0).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.LevelUpBasedDescOverride(0).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Enchants your active weapon - it causes an additional <Green>0.5x</><YellowH>(→0.6x)</> damage for <Green>5</> seconds. <YellowH>Each strike has a</> <GreenH>15%</> <YellowH>chance to apply </><DarkGreenH>Poison</><YellowH>, causing an additional</> <BlueH>18</> <YellowH>damage over</> <GreenH>6</> <YellowH>seconds.</>\"\nmsgstr \"Enchants your active weapon - it causes an additional <Green>0.5x</><YellowH>(→0.6x)</> damage for <Green>5</> seconds. <YellowH>Each strike has a</> <GreenH>15%</> <YellowH>chance to apply </><DarkGreenH>Poison</><YellowH>, causing an additional</> <BlueH>18</> <YellowH>damage over</> <GreenH>6</> <YellowH>seconds.</>\"\n\n#. Key:\tRuneStoneWeaponFlame_level_up_desc_1\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.LevelUpBasedDescOverride(1).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.LevelUpBasedDescOverride(1).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Enchants your active weapon - it causes an additional <Green>0.6x</><YellowH>(→0.7x)</> damage for <Green>5</><YellowH>(→6)</> seconds. Each strike has a <Green>15%</><YellowH>(→20%)</> chance to apply <DarkGreen>Poison</>, causing an additional <Blue>18</><YellowH>(→24)</> damage over <Green>6</> seconds.\"\nmsgstr \"Enchants your active weapon - it causes an additional <Green>0.6x</><YellowH>(→0.7x)</> damage for <Green>5</><YellowH>(→6)</> seconds. Each strike has a <Green>15%</><YellowH>(→20%)</> chance to apply <DarkGreen>Poison</>, causing an additional <Blue>18</><YellowH>(→24)</> damage over <Green>6</> seconds.\"\n\n#. Key:\tRuneStoneWeaponFlame_level_up_desc_2\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.LevelUpBasedDescOverride(2).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.LevelUpBasedDescOverride(2).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Enchants your active weapon - it causes an additional <Green>0.7x</><YellowH>(→0.8x)</> damage for <Green>6</> seconds. Each strike has a <Green>20%</><YellowH>(→25%)</> chance to apply <DarkGreen>Poison</>, causing an additional <Blue>24</><YellowH>(→30)</> damage over <Green>6</> seconds.\"\nmsgstr \"Enchants your active weapon - it causes an additional <Green>0.7x</><YellowH>(→0.8x)</> damage for <Green>6</> seconds. Each strike has a <Green>20%</><YellowH>(→25%)</> chance to apply <DarkGreen>Poison</>, causing an additional <Blue>24</><YellowH>(→30)</> damage over <Green>6</> seconds.\"\n\n#. Key:\tRuneStoneWeaponFlame_level_up_desc_3\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.LevelUpBasedDescOverride(3).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.LevelUpBasedDescOverride(3).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Enchants your active weapon - it causes an additional <Green>0.8x</><YellowH>(→0.9x)</> damage for <Green>6</> seconds. Each strike has a <Green>25%</><YellowH>(→30%)</> chance to apply <DarkGreen>Poison</>, causing an additional <Blue>30</><YellowH>(→36)</> damage over <Green>6</> seconds.\"\nmsgstr \"Enchants your active weapon - it causes an additional <Green>0.8x</><YellowH>(→0.9x)</> damage for <Green>6</> seconds. Each strike has a <Green>25%</><YellowH>(→30%)</> chance to apply <DarkGreen>Poison</>, causing an additional <Blue>30</><YellowH>(→36)</> damage over <Green>6</> seconds.\"\n\n#. Key:\tRuneStoneWeaponFlame_name\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.Name\n#: /Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.Name\nmsgctxt \"ItemData\"\nmsgid \"Green Flamestone\"\nmsgstr \"Green Flamestone\"\n\n#. Key:\tSabre_desc\n#. SourceLocation:\t/Game/SO/Items/Weapons/Sabre.Sabre.Description\n#: /Game/SO/Items/Weapons/Sabre.Sabre.Description\nmsgctxt \"ItemData\"\nmsgid \"Rangol was a legendary blacksmith who practiced his crafting art for a hundred years. This sabre was made on day one.\"\nmsgstr \"Rangol was a legendary blacksmith who practiced his crafting art for a hundred years. This sabre was made on day one.\"\n\n#. Key:\tSabre_name\n#. SourceLocation:\t/Game/SO/Items/Weapons/Sabre.Sabre.Name\n#: /Game/SO/Items/Weapons/Sabre.Sabre.Name\nmsgctxt \"ItemData\"\nmsgid \"First Sabre of Rangol\"\nmsgstr \"First Sabre of Rangol\"\n\n#. Key:\tSecondChance_desc\n#. SourceLocation:\t/Game/SO/Items/RuneStones/SecondChance.SecondChance.Description\n#: /Game/SO/Items/RuneStones/SecondChance.SecondChance.Description\nmsgctxt \"ItemData\"\nmsgid \"Prevents death.\"\nmsgstr \"Prevents death.\"\n\n#. Key:\tSecondChance_name\n#. SourceLocation:\t/Game/SO/Items/RuneStones/SecondChance.SecondChance.Name\n#: /Game/SO/Items/RuneStones/SecondChance.SecondChance.Name\nmsgctxt \"ItemData\"\nmsgid \"Chancestone\"\nmsgstr \"Chancestone\"\n\n#. Key:\tSecretWeirdDevice_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/SecretWeirdDevice.SecretWeirdDevice.Description\n#: /Game/SO/Items/QuestItems/SecretWeirdDevice.SecretWeirdDevice.Description\nmsgctxt \"ItemData\"\nmsgid \"A weird device, most likely one of the inventions of the Secret Science Society.\"\nmsgstr \"A weird device, most likely one of the inventions of the Secret Science Society.\"\n\n#. Key:\tSecretWeirdDevice_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/SecretWeirdDevice.SecretWeirdDevice.Name\n#: /Game/SO/Items/QuestItems/SecretWeirdDevice.SecretWeirdDevice.Name\nmsgctxt \"ItemData\"\nmsgid \"Weird Device\"\nmsgstr \"Weird Device\"\n\n#. Key:\tShardAmber_desc\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardAmber.ShardAmber.Description\n#: /Game/SO/Items/Shards/ShardAmber.ShardAmber.Description\nmsgctxt \"ItemData\"\nmsgid \"Each melee strike has an additional <Yellow>10%</> chance to cause a critical hit, causing <Green>200%</> of your normal weapon damage.\"\nmsgstr \"Each melee strike has an additional <Yellow>10%</> chance to cause a critical hit, causing <Green>200%</> of your normal weapon damage.\"\n\n#. Key:\tShardAmber_name\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardAmber.ShardAmber.Name\n#: /Game/SO/Items/Shards/ShardAmber.ShardAmber.Name\nmsgctxt \"ItemData\"\nmsgid \"Amber Shard\"\nmsgstr \"Amber Shard\"\n\n#. Key:\tShardAmberBright_desc\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardAmberBright.ShardAmberBright.Description\n#: /Game/SO/Items/Shards/ShardAmberBright.ShardAmberBright.Description\nmsgctxt \"ItemData\"\nmsgid \"Each melee strike has an additional <Yellow>20%</> chance to cause a critical hit, causing <Green>200%</> of your normal weapon damage.\"\nmsgstr \"Each melee strike has an additional <Yellow>20%</> chance to cause a critical hit, causing <Green>200%</> of your normal weapon damage.\"\n\n#. Key:\tShardAmberBright_name\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardAmberBright.ShardAmberBright.Name\n#: /Game/SO/Items/Shards/ShardAmberBright.ShardAmberBright.Name\nmsgctxt \"ItemData\"\nmsgid \"Bright Amber Shard\"\nmsgstr \"Bright Amber Shard\"\n\n#. Key:\tShardAqua_desc\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardAqua.ShardAqua.Description\n#: /Game/SO/Items/Shards/ShardAqua.ShardAqua.Description\nmsgctxt \"ItemData\"\nmsgid \"Cooldown recharge speed is increased by <Blue>20%</>.\"\nmsgstr \"Cooldown recharge speed is increased by <Blue>20%</>.\"\n\n#. Key:\tShardAqua_name\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardAqua.ShardAqua.Name\n#: /Game/SO/Items/Shards/ShardAqua.ShardAqua.Name\nmsgctxt \"ItemData\"\nmsgid \"Aqua Shard\"\nmsgstr \"Aqua Shard\"\n\n#. Key:\tShardAquaBright_desc\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardAquaBright.ShardAquaBright.Description\n#: /Game/SO/Items/Shards/ShardAquaBright.ShardAquaBright.Description\nmsgctxt \"ItemData\"\nmsgid \"Cooldown recharge speed is increased by <Blue>40%</>.\"\nmsgstr \"Cooldown recharge speed is increased by <Blue>40%</>.\"\n\n#. Key:\tShardAquaBright_name\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardAquaBright.ShardAquaBright.Name\n#: /Game/SO/Items/Shards/ShardAquaBright.ShardAquaBright.Name\nmsgctxt \"ItemData\"\nmsgid \"Bright Aqua Shard\"\nmsgstr \"Bright Aqua Shard\"\n\n#. Key:\tShardBlack_desc\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardBlack.ShardBlack.Description\n#: /Game/SO/Items/Shards/ShardBlack.ShardBlack.Description\nmsgctxt \"ItemData\"\nmsgid \"Every time an enemy hits you with a melee strike or overlaps you it is turned into a boot for a short time.\"\nmsgstr \"Every time an enemy hits you with a melee strike or overlaps you it is turned into a boot for a short time.\"\n\n#. Key:\tShardBlack_name\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardBlack.ShardBlack.Name\n#: /Game/SO/Items/Shards/ShardBlack.ShardBlack.Name\nmsgctxt \"ItemData\"\nmsgid \"Black Shard\"\nmsgstr \"Black Shard\"\n\n#. Key:\tShardBlue_desc\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardBlue.ShardBlue.Description\n#: /Game/SO/Items/Shards/ShardBlue.ShardBlue.Description\nmsgctxt \"ItemData\"\nmsgid \"Decreases the incoming <Blue>Magical Damage</> by <Blue>20%.</>\"\nmsgstr \"Decreases the incoming <Blue>Magical Damage</> by <Blue>20%.</>\"\n\n#. Key:\tShardBlue_name\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardBlue.ShardBlue.Name\n#: /Game/SO/Items/Shards/ShardBlue.ShardBlue.Name\nmsgctxt \"ItemData\"\nmsgid \"Blue Shard\"\nmsgstr \"Blue Shard\"\n\n#. Key:\tShardBlueBright_desc\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardBlueBright.ShardBlueBright.Description\n#: /Game/SO/Items/Shards/ShardBlueBright.ShardBlueBright.Description\nmsgctxt \"ItemData\"\nmsgid \"Decreases the incoming <Blue>Magical Damage</> by <Blue>30%.</>\"\nmsgstr \"Decreases the incoming <Blue>Magical Damage</> by <Blue>30%.</>\"\n\n#. Key:\tShardBlueBright_name\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardBlueBright.ShardBlueBright.Name\n#: /Game/SO/Items/Shards/ShardBlueBright.ShardBlueBright.Name\nmsgctxt \"ItemData\"\nmsgid \"Bright Blue Shard\"\nmsgstr \"Bright Blue Shard\"\n\n#. Key:\tShardGreen_desc\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardGreen.ShardGreen.Description\n#: /Game/SO/Items/Shards/ShardGreen.ShardGreen.Description\nmsgctxt \"ItemData\"\nmsgid \"Increases the attack speed by <Green>20%</>\"\nmsgstr \"Increases the attack speed by <Green>20%</>\"\n\n#. Key:\tShardGreen_name\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardGreen.ShardGreen.Name\n#: /Game/SO/Items/Shards/ShardGreen.ShardGreen.Name\nmsgctxt \"ItemData\"\nmsgid \"Green Shard\"\nmsgstr \"Green Shard\"\n\n#. Key:\tShardGreenBright_desc\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardGreenBright.ShardGreenBright.Description\n#: /Game/SO/Items/Shards/ShardGreenBright.ShardGreenBright.Description\nmsgctxt \"ItemData\"\nmsgid \"Increases the attack speed by <Green>30%</>\"\nmsgstr \"Increases the attack speed by <Green>30%</>\"\n\n#. Key:\tShardGreenBright_name\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardGreenBright.ShardGreenBright.Name\n#: /Game/SO/Items/Shards/ShardGreenBright.ShardGreenBright.Name\nmsgctxt \"ItemData\"\nmsgid \"Bright Green Shard\"\nmsgstr \"Bright Green Shard\"\n\n#. Key:\tShardPurple_desc\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardPurple.ShardPurple.Description\n#: /Game/SO/Items/Shards/ShardPurple.ShardPurple.Description\nmsgctxt \"ItemData\"\nmsgid \"Each time you cast a charge based spell you have a <Purple>25%</> chance to regain the charge.\"\nmsgstr \"Each time you cast a charge based spell you have a <Purple>25%</> chance to regain the charge.\"\n\n#. Key:\tShardPurple_name\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardPurple.ShardPurple.Name\n#: /Game/SO/Items/Shards/ShardPurple.ShardPurple.Name\nmsgctxt \"ItemData\"\nmsgid \"Purple Shard\"\nmsgstr \"Purple Shard\"\n\n#. Key:\tShardPurpleBright_desc\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardPurpleBright.ShardPurpleBright.Description\n#: /Game/SO/Items/Shards/ShardPurpleBright.ShardPurpleBright.Description\nmsgctxt \"ItemData\"\nmsgid \"Each time you cast a charge based spell you have a <Purple>50%</> chance to regain the charge.\"\nmsgstr \"Each time you cast a charge based spell you have a <Purple>50%</> chance to regain the charge.\"\n\n#. Key:\tShardPurpleBright_name\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardPurpleBright.ShardPurpleBright.Name\n#: /Game/SO/Items/Shards/ShardPurpleBright.ShardPurpleBright.Name\nmsgctxt \"ItemData\"\nmsgid \"Bright Purple Shard\"\nmsgstr \"Bright Purple Shard\"\n\n#. Key:\tShardRed_desc\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardRed.ShardRed.Description\n#: /Game/SO/Items/Shards/ShardRed.ShardRed.Description\nmsgctxt \"ItemData\"\nmsgid \"You heal <Red>5%</> of the melee damage you inflict on your enemies.\"\nmsgstr \"You heal <Red>5%</> of the melee damage you inflict on your enemies.\"\n\n#. Key:\tShardRed_name\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardRed.ShardRed.Name\n#: /Game/SO/Items/Shards/ShardRed.ShardRed.Name\nmsgctxt \"ItemData\"\nmsgid \"Red Shard\"\nmsgstr \"Red Shard\"\n\n#. Key:\tShardRedBright_desc\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardRedBright.ShardRedBright.Description\n#: /Game/SO/Items/Shards/ShardRedBright.ShardRedBright.Description\nmsgctxt \"ItemData\"\nmsgid \"You heal <Red>10%</> of the melee damage you inflict on your enemies.\"\nmsgstr \"You heal <Red>10%</> of the melee damage you inflict on your enemies.\"\n\n#. Key:\tShardRedBright_name\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardRedBright.ShardRedBright.Name\n#: /Game/SO/Items/Shards/ShardRedBright.ShardRedBright.Name\nmsgctxt \"ItemData\"\nmsgid \"Bright Red Shard\"\nmsgstr \"Bright Red Shard\"\n\n#. Key:\tShardSilver_desc\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardSilver.ShardSilver.Description\n#: /Game/SO/Items/Shards/ShardSilver.ShardSilver.Description\nmsgctxt \"ItemData\"\nmsgid \"Decreases the incoming <White>Physical Damage</> by <White>20%.</>\"\nmsgstr \"Decreases the incoming <White>Physical Damage</> by <White>20%.</>\"\n\n#. Key:\tShardSilver_name\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardSilver.ShardSilver.Name\n#: /Game/SO/Items/Shards/ShardSilver.ShardSilver.Name\nmsgctxt \"ItemData\"\nmsgid \"Silver Shard\"\nmsgstr \"Silver Shard\"\n\n#. Key:\tShardSilverBright_desc\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardSilverBright.ShardSilverBright.Description\n#: /Game/SO/Items/Shards/ShardSilverBright.ShardSilverBright.Description\nmsgctxt \"ItemData\"\nmsgid \"Decreases the incoming <White>Physical Damage</> by <White>30%.</>\"\nmsgstr \"Decreases the incoming <White>Physical Damage</> by <White>30%.</>\"\n\n#. Key:\tShardSilverBright_name\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardSilverBright.ShardSilverBright.Name\n#: /Game/SO/Items/Shards/ShardSilverBright.ShardSilverBright.Name\nmsgctxt \"ItemData\"\nmsgid \"Bright Silver Shard\"\nmsgstr \"Bright Silver Shard\"\n\n#. Key:\tShardTeal_desc\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardTeal.ShardTeal.Description\n#: /Game/SO/Items/Shards/ShardTeal.ShardTeal.Description\nmsgctxt \"ItemData\"\nmsgid \"Each time an enemy hits you with a melee strike it suffers the same damage.\"\nmsgstr \"Each time an enemy hits you with a melee strike it suffers the same damage.\"\n\n#. Key:\tShardTeal_name\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardTeal.ShardTeal.Name\n#: /Game/SO/Items/Shards/ShardTeal.ShardTeal.Name\nmsgctxt \"ItemData\"\nmsgid \"Teal Shard\"\nmsgstr \"Teal Shard\"\n\n#. Key:\tShardTealBright_desc\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardTealBright.ShardTealBright.Description\n#: /Game/SO/Items/Shards/ShardTealBright.ShardTealBright.Description\nmsgctxt \"ItemData\"\nmsgid \"Each time an enemy hits you, it suffers <Green>200%</> of the damage.\"\nmsgstr \"Each time an enemy hits you, it suffers <Green>200%</> of the damage.\"\n\n#. Key:\tShardTealBright_name\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardTealBright.ShardTealBright.Name\n#: /Game/SO/Items/Shards/ShardTealBright.ShardTealBright.Name\nmsgctxt \"ItemData\"\nmsgid \"Bright Teal Shard\"\nmsgstr \"Bright Teal Shard\"\n\n#. Key:\tShardWhite_desc\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardWhite.ShardWhite.Description\n#: /Game/SO/Items/Shards/ShardWhite.ShardWhite.Description\nmsgctxt \"ItemData\"\nmsgid \"Increases your damage by <Green>20%</>\"\nmsgstr \"Increases your damage by <Green>20%</>\"\n\n#. Key:\tShardWhite_name\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardWhite.ShardWhite.Name\n#: /Game/SO/Items/Shards/ShardWhite.ShardWhite.Name\nmsgctxt \"ItemData\"\nmsgid \"White Shard\"\nmsgstr \"White Shard\"\n\n#. Key:\tShardWhiteBright_desc\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardWhiteBright.ShardWhiteBright.Description\n#: /Game/SO/Items/Shards/ShardWhiteBright.ShardWhiteBright.Description\nmsgctxt \"ItemData\"\nmsgid \"Increases your damage by <Green>30%</>.\"\nmsgstr \"Increases your damage by <Green>30%</>.\"\n\n#. Key:\tShardWhiteBright_name\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardWhiteBright.ShardWhiteBright.Name\n#: /Game/SO/Items/Shards/ShardWhiteBright.ShardWhiteBright.Name\nmsgctxt \"ItemData\"\nmsgid \"Bright White Shard\"\nmsgstr \"Bright White Shard\"\n\n#. Key:\tShardYellow_desc\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardYellow.ShardYellow.Description\n#: /Game/SO/Items/Shards/ShardYellow.ShardYellow.Description\nmsgctxt \"ItemData\"\nmsgid \"Each melee strike has a <Yellow>10%</> chance to <Yellow>Stun</> the target.\"\nmsgstr \"Each melee strike has a <Yellow>10%</> chance to <Yellow>Stun</> the target.\"\n\n#. Key:\tShardYellow_name\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardYellow.ShardYellow.Name\n#: /Game/SO/Items/Shards/ShardYellow.ShardYellow.Name\nmsgctxt \"ItemData\"\nmsgid \"Yellow Shard\"\nmsgstr \"Yellow Shard\"\n\n#. Key:\tShardYellowBright_desc\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardYellowBright.ShardYellowBright.Description\n#: /Game/SO/Items/Shards/ShardYellowBright.ShardYellowBright.Description\nmsgctxt \"ItemData\"\nmsgid \"Each melee strike has a <Yellow>20%</> chance to <Yellow>Stun</> the target.\"\nmsgstr \"Each melee strike has a <Yellow>20%</> chance to <Yellow>Stun</> the target.\"\n\n#. Key:\tShardYellowBright_name\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardYellowBright.ShardYellowBright.Name\n#: /Game/SO/Items/Shards/ShardYellowBright.ShardYellowBright.Name\nmsgctxt \"ItemData\"\nmsgid \"Bright Yellow Shard\"\nmsgstr \"Bright Yellow Shard\"\n\n#. Key:\tSpellCaster_desc\n#. SourceLocation:\t/Game/SO/Items/Useable/SpellCaster.SpellCaster.Description\n#: /Game/SO/Items/Useable/SpellCaster.SpellCaster.Description\nmsgctxt \"ItemData\"\nmsgid \"A magical artefact with the following worn text engraved on the back:\\r\\n\\r\\nInsert Runestones to ... spells\\r\\nKeep .... .... children\\r\\nMade in .....\"\nmsgstr \"A magical artefact with the following worn text engraved on the back:\\r\\n\\r\\nInsert Runestones to ... spells\\r\\nKeep .... .... children\\r\\nMade in .....\"\n\n#. Key:\tSpellCaster_name\n#. SourceLocation:\t/Game/SO/Items/Useable/SpellCaster.SpellCaster.Name\n#: /Game/SO/Items/Useable/SpellCaster.SpellCaster.Name\nmsgctxt \"ItemData\"\nmsgid \"Spellcaster\"\nmsgstr \"Spellcaster\"\n\n#. Key:\tStraightSword_desc\n#. SourceLocation:\t/Game/SO/Items/Weapons/StraightSword.StraightSword.Description\n#: /Game/SO/Items/Weapons/StraightSword.StraightSword.Description\nmsgctxt \"ItemData\"\nmsgid \"A simple yet effective weapon. Not too rusty, not too sharp. If someone looks close enough it looks a bit low budget, but the ones looking close enough won't talk about anything anymore, will they?\"\nmsgstr \"A simple yet effective weapon. Not too rusty, not too sharp. If someone looks close enough it looks a bit low budget, but the ones looking close enough won't talk about anything anymore, will they?\"\n\n#. Key:\tStraightSword_name\n#. SourceLocation:\t/Game/SO/Items/Weapons/StraightSword.StraightSword.Name\n#: /Game/SO/Items/Weapons/StraightSword.StraightSword.Name\nmsgctxt \"ItemData\"\nmsgid \"Straight Sword\"\nmsgstr \"Straight Sword\"\n\n#. Key:\tTestStoneBag_desc\n#. SourceLocation:\t/Game/SO/Items/Useable/TestStoneBag.TestStoneBag.Description\n#: /Game/SO/Items/Useable/TestStoneBag.TestStoneBag.Description\nmsgctxt \"ItemData\"\nmsgid \"When you are the one in the team who has the job to enter every dungeon first, you will become a careful one too... if you live long enough for that.\"\nmsgstr \"When you are the one in the team who has the job to enter every dungeon first, you will become a careful one too... if you live long enough for that.\"\n\n#. Key:\tTestStoneBag_name\n#. SourceLocation:\t/Game/SO/Items/Useable/TestStoneBag.TestStoneBag.Name\n#: /Game/SO/Items/Useable/TestStoneBag.TestStoneBag.Name\nmsgctxt \"ItemData\"\nmsgid \"Bag of the Careful One\"\nmsgstr \"Bag of the Careful One\"\n\n#. Key:\tWheel_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/Wheel.Wheel.Description\n#: /Game/SO/Items/QuestItems/Wheel.Wheel.Description\nmsgctxt \"ItemData\"\nmsgid \"One of the first greatest inventions of humans. Because they envied balls for their rolling skill.\"\nmsgstr \"One of the first greatest inventions of humans. Because they envied balls for their rolling skill.\"\n\n#. Key:\tWheel_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/Wheel.Wheel.Name\n#: /Game/SO/Items/QuestItems/Wheel.Wheel.Name\nmsgctxt \"ItemData\"\nmsgid \"Wheel\"\nmsgstr \"Wheel\"\n\n#. Key:\tWWBossShipLock_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/WWBossShipLock.WWBossShipLock.Description\n#: /Game/SO/Items/Keys/WWBossShipLock.WWBossShipLock.Description\nmsgctxt \"ItemData\"\nmsgid \"Rusty key of a rusty lock.\"\nmsgstr \"Rusty key of a rusty lock.\"\n\n#. Key:\tWWBossShipLock_name\n#. SourceLocation:\t/Game/SO/Items/Keys/WWBossShipLock.WWBossShipLock.Name\n#: /Game/SO/Items/Keys/WWBossShipLock.WWBossShipLock.Name\nmsgctxt \"ItemData\"\nmsgid \"Rusty Key\"\nmsgstr \"Rusty Key\"\n\n#. Key:\t0BFD568E4989A20D66B91DA476C0E6B4\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_6.Text\n#: /Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_6.Text\nmsgctxt \"Notes\"\nmsgid \"I promised Fountain to give its flower to the Magic Mirror.\"\nmsgstr \"I promised Fountain to give its flower to the Magic Mirror.\"\n\n#. Key:\t1ABD11A64A7649801A6AB6A8BBDC686C\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_9.Text\n#: /Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_9.Text\nmsgctxt \"Notes\"\nmsgid \"The Ghost Dwarf needs a ghost abacus\"\nmsgstr \"The Ghost Dwarf needs a ghost abacus\"\n\n#. Key:\t57CBE1274A1B4EC7FD68EA9288161AAD\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_7.Text\n#: /Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_7.Text\nmsgctxt \"Notes\"\nmsgid \"The Chef wants me to clear the shore\"\nmsgstr \"The Chef wants me to clear the shore\"\n\n#. Key:\t77693D6C43702786250364932BD34BCD\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note.Text\n#: /Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note.Text\nmsgctxt \"Notes\"\nmsgid \"The GateKeeper could use a chair\"\nmsgstr \"The GateKeeper could use a chair\"\n\n#. Key:\t9C3FB78C4598A48BC187B580CBB070F6\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_8.Text\n#: /Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_8.Text\nmsgctxt \"Notes\"\nmsgid \"The Dwarf wants me to clear the Dwarven Fortress\"\nmsgstr \"The Dwarf wants me to clear the Dwarven Fortress\"\n\n#. Key:\tAA94EB6E4B0A505D730971932A3DE0CC\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_5.Text\n#: /Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_5.Text\nmsgctxt \"Notes\"\nmsgid \"The Golem Maker wants me to hunt some Golems\"\nmsgstr \"The Golem Maker wants me to hunt some Golems\"\n\n#. Key:\tAE371E564EC1D75947ECF98AAA896A2C\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_11.Text\n#: /Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_11.Text\nmsgctxt \"Notes\"\nmsgid \"A Pipe Walker is trapped in a cage\"\nmsgstr \"A Pipe Walker is trapped in a cage\"\n\n#. Key:\tB12481ED4CFF0182EDB7ACAA416B55FC\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_4.Text\n#: /Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_4.Text\nmsgctxt \"Notes\"\nmsgid \"Gnory needs a wheel\"\nmsgstr \"Gnory needs a wheel\"\n\n#. Key:\tD3B6D81E433CBE8461E2B1AFE06E9741\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_13.Text\n#: /Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_13.Text\nmsgctxt \"Notes\"\nmsgid \"The Chef asked me to bring him some Purple Mushroom\"\nmsgstr \"The Chef asked me to bring him some Purple Mushroom\"\n\n#. Key:\tD8C4FFC7435C6A2E7C88BBA7109A1907\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_12.Text\n#: /Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_12.Text\nmsgctxt \"Notes\"\nmsgid \"I need to learn Dwarven to open a gate\"\nmsgstr \"I need to learn Dwarven to open a gate\"\n\n#. Key:\tE3857F07468C2A0B34A98887E3BBB1DA\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_10.Text\n#: /Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_10.Text\nmsgctxt \"Notes\"\nmsgid \"I feel the Tomb of Tabby is important somehow\"\nmsgstr \"I feel the Tomb of Tabby is important somehow\"\n\n#. Key:\tE9DA40684B9375A5F78D18A138C75174\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_2.Text\n#: /Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_2.Text\nmsgctxt \"Notes\"\nmsgid \"Teachy asked for a strangely unique device\"\nmsgstr \"Teachy asked for a strangely unique device\"\n\n#. Key:\tF109A1614B16565CC1846C8D0A46672E\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_1.Text\n#: /Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_1.Text\nmsgctxt \"Notes\"\nmsgid \"I promised Lory to bring her some books\"\nmsgstr \"I promised Lory to bring her some books\"\n\n#. Key:\taway\n#. SourceLocation:\tSource/SOrb/UI/InGame/SoUIStationPanel.cpp:98\n#: Source/SOrb/UI/InGame/SoUIStationPanel.cpp:98\nmsgctxt \"StationNames\"\nmsgid \"World's End\"\nmsgstr \"World's End\"\n\n#. Key:\tcrossroadcave\n#. SourceLocation:\tSource/SOrb/UI/InGame/SoUIStationPanel.cpp:94\n#: Source/SOrb/UI/InGame/SoUIStationPanel.cpp:94\nmsgctxt \"StationNames\"\nmsgid \"Crossroad Cave\"\nmsgstr \"Crossroad Cave\"\n\n#. Key:\tlavatemple\n#. SourceLocation:\tSource/SOrb/UI/InGame/SoUIStationPanel.cpp:96\n#: Source/SOrb/UI/InGame/SoUIStationPanel.cpp:96\nmsgctxt \"StationNames\"\nmsgid \"Remnant Road\"\nmsgstr \"Remnant Road\"\n\n#. Key:\toutpost\n#. SourceLocation:\tSource/SOrb/UI/InGame/SoUIStationPanel.cpp:95\n#: Source/SOrb/UI/InGame/SoUIStationPanel.cpp:95\nmsgctxt \"StationNames\"\nmsgid \"Obedient Outpost\"\nmsgstr \"Obedient Outpost\"\n\n#. Key:\tstay\n#. SourceLocation:\tSource/SOrb/UI/InGame/SoUIStationPanel.cpp:99\n#: Source/SOrb/UI/InGame/SoUIStationPanel.cpp:99\nmsgctxt \"StationNames\"\nmsgid \"Stay\"\nmsgstr \"Stay\"\n\n#. Key:\twrackedWaters\n#. SourceLocation:\tSource/SOrb/UI/InGame/SoUIStationPanel.cpp:97\n#: Source/SOrb/UI/InGame/SoUIStationPanel.cpp:97\nmsgctxt \"StationNames\"\nmsgid \"Wracked Waters\"\nmsgstr \"Wracked Waters\"\n\n"
  },
  {
    "path": "Content/Localization/Warriorb/es/Warriorb.po",
    "content": "﻿# Warriorb Spanish translation.\n# Copyright 1998-2019 Epic Games, Inc. All Rights Reserved.\n# \nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: Warriorb\\n\"\n\"POT-Creation-Date: 2020-10-07 08:12\\n\"\n\"PO-Revision-Date: 2020-10-07 08:12\\n\"\n\"Language-Team: \\n\"\n\"Language: es\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Plural-Forms: nplurals=2; plural=(n != 1);\\n\"\n\n#. Key:\t78A72CB345FCC7ECDCFD8181471D78D8\n#. SourceLocation:\t/Game/SO/GUI/UI_Credits.UI_Credits_C:WidgetTree.CreditsText.Text\n#: /Game/SO/GUI/UI_Credits.UI_Credits_C:WidgetTree.CreditsText.Text\nmsgid \"<T>-- Not Yet Team --</>\\r\\n\\r\\n\\r\\nAnna Molnár\\r\\n<R>2D art, Environment Design</>\\r\\n\\r\\n\\r\\nCsaba Molnár\\r\\n<R>Code, Design</>\\r\\n\\r\\n\\r\\nDaniel Butum\\r\\n<R>Code</>\\r\\n\\r\\n\\r\\nGéza Molnár\\r\\n<R>3D art, Design</>\\r\\n\\r\\n\\r\\nRichárd Ráski\\r\\n<R>Sound Design</>\\r\\n\\r\\n\\r\\n\\r\\n<T>-- Music --</>\\r\\n\\r\\nBenjámin Kuli\\r\\n\\r\\n\\r\\nGisula\\r\\n\\r\\n\\r\\n\\r\\n<T>-- Voice Over --</>\\r\\n\\r\\n\\r\\nPeter Luzsi - @peterluzsi\\r\\n<R>WarriOrb, Gatekeeper, Ghost Armor, Principal</>\\r\\n\\r\\n\\r\\nBrent Miller\\r\\n<R>WarriOrb - Trailer</>\\r\\n\\r\\n\\r\\nPierce Riola\\r\\n<R>Wizard, Gnory</>\\r\\n\\r\\n\\r\\nEir Causey\\r\\n<R>Raven, Teachy, Ghost Dwarf, Unknown Wizard, Fishy</>\\r\\n\\r\\n\\r\\nJack Broadbent\\r\\n<R>Monk, Flybug</>\\r\\n\\r\\n\\r\\nEmil Hagg\\r\\n<R>Supper Dwarf, Kobold Chef, Fallen Druid, Dwarven Statue</>\\r\\n\\r\\n\\r\\nErick Nita\\r\\n<R>Golem Maker, Armour Wrath</>\\r\\n\\r\\n\\r\\nAlain Vega\\r\\n<R>Merch Ant</>\\r\\n\\r\\n\\r\\nAngela Tran\\r\\n<R>Lillian, Pipe Walker</>\\r\\n\\r\\n\\r\\nBrittany Ann Phillips\\r\\n<R>Lory</>\\r\\n\\r\\n\\r\\nAurore Gautheur\\r\\n<R>Fountain, Shade</>\\r\\n\\r\\n\\r\\nAlexander Blairlex\\r\\n<R>Primitive Fishy, Ghost Helmet</>\\r\\n\\r\\n\\r\\nSophie Ryder\\r\\n<R>Shadesphere</>\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n<T>-- Partners --</>\\r\\n\\r\\n\\r\\nMaple Whispering\\r\\n<R>Chineese localization</>\\r\\n<R>Publisher - China, PC</>\\r\\n\\r\\n\\r\\nNovy Unlimited\\r\\n<R>PR and Marketing</>\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n<T>-- Localization --</>\\r\\n\\r\\n\\r\\nVera Liscovschi\\r\\n<R>Russian</>\\r\\n\\r\\n\\r\\nJay Johnstone\\r\\n<R>Spanish</>\\r\\n\\r\\n\\r\\nBertin William\\r\\n<R>French</>\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n<T>-- Testers --</>\\r\\n\\r\\n\\r\\nSaleymander\\r\\n\\r\\n\\r\\nHitch\\r\\n\\r\\n\\r\\nMrCalculated\\r\\n\\r\\n\\r\\n<img id=\\\"Rainbow\\\"/>Scorpion253<img id=\\\"Rainbow\\\"/>\\r\\n\\r\\n\\r\\nmoses\\r\\n\\r\\n\\r\\nNinjin42\\r\\n\\r\\n\\r\\nKonstantinos Xenitidis\\r\\n\\r\\n\\r\\nPhyronnaz\\r\\n\\r\\n\\r\\nArthur\\r\\n\\r\\n\\r\\nMaster1G\\r\\n\\r\\n\\r\\nDávid Bartók\\r\\n\\r\\n\\r\\nLiDuGaming\\r\\n\\r\\n\\r\\nClaudiu Coman\\r\\n\\r\\n\\r\\nÁron Ürögdi\\r\\n\\r\\n\\r\\nDukenukemboi\\r\\n\\r\\n\\r\\nBart Cools\\r\\n\\r\\n\\r\\nGlenn De Jonghe\\r\\n\\r\\n\\r\\nDomonkos Péter Madarász\\r\\n\\r\\n\\r\\nGergő Gyarmati\\r\\n\\r\\n\\r\\nRéka Gyarmati\\r\\n\\r\\n\\r\\nKincső Petraskó\\r\\n\\r\\n\\r\\nGergő Petraskó\\r\\n\\r\\n\\r\\nDániel Garamvölgyi\\r\\n\\r\\n\\r\\nDanny \\\"GHelmet\\\" Cloutier\\r\\n\\r\\n\\r\\nAnna Boglárka Tóth\\r\\n\\r\\n\\r\\nBíborka Roxána Kubik\\r\\n\\r\\n\\r\\nVirág Miklós\\r\\n\\r\\n\\r\\nBenedek Marozsák\\r\\n\\r\\n\\r\\nDániel Marozsák\\r\\n\\r\\n\\r\\nGereon Bartel\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n<T>-- Prologue Speedrun Competition Winner --</>\\r\\n\\r\\n-7\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n<T>-- Special Thanks --</>\\r\\n\\r\\n\\r\\nMalazan Discord Server Community\\r\\n\\r\\n\\r\\n/r/metroidvenia Discord Server Community\\r\\n\\r\\n\\r\\nUnreal Slackers Discord Server Community\\r\\n\\r\\n\\r\\nIMGUR\\r\\n\\r\\n\\r\\nBíborka Roxána Kubik\\r\\n\\r\\n\\r\\nSergiu Crăiţoiu\\r\\n\\r\\n\\r\\nJuhász Ernő\\r\\n\\r\\n\\r\\nRacheal Smith\\r\\n\\r\\n\\r\\nRuxandra Seniuc\\r\\n\\r\\n\\r\\nthottee\\r\\n\\r\\n\\r\\nAndrew Pappas\\r\\n\\r\\n\\r\\nJonathan Lampel\\r\\n\\r\\n\\r\\nRichárd Németh\\r\\n\\r\\n\\r\\nAlex Gorcea\\r\\n\\r\\n\\r\\nNotRealVitor\\r\\n\\r\\n\\r\\nKinga Surján\\r\\n\\r\\n\\r\\nAnna Boglárka Tóth\\r\\n\\r\\n\\r\\nÉvi Fekete\\r\\n\\r\\n\\r\\nGergő Sielaf\\r\\n\\r\\n\\r\\n<img id=\\\"Rainbow\\\"/>Scorpion253<img id=\\\"Rainbow\\\"/>\\r\\n\\r\\n\\r\\nMainiac\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n<T>-- Technology --</>\\r\\n\\r\\n\\r\\n<R>WarriOrb uses the Unreal® Engine.</>\\r\\n<R>Unreal® is a trademark or registered trademark of Epic Games, Inc. in the United States of America and elsewhere</>\\r\\n\\r\\n<R>Unreal® Engine, Copyright 1998 – 2020, Epic Games, Inc. All rights reserved.</>\\r\\n\\r\\n\\r\\n\\r\\n<R>Made with FMOD Studio by Firelight Technologies Pty Ltd.</>\"\nmsgstr \"<T> - Equipo Not Yet - </>\\n\\n\\nAnna Molnár\\n<R> Arte 2D, Diseño del entorno </>\\n\\n\\nCsaba Molnár\\n<R> Código, Diseño </>\\n\\n\\nDaniel Butum\\n<R> Código </>\\n\\n\\nGéza Molnár\\n<R> Arte 3D, Diseño </>\\n\\n\\nRichárd Ráski\\n<R> Diseño de sonido </>\\n\\n\\n\\n<T> - Música - </>\\n\\nBenjámin Kuli\\n\\n\\nGisula\\n\\n\\n\\n<T> - Narración - </>\\n\\n\\nPeter Luzsi - @peterluzsi\\n<R> WarriOrb, Guardián de la Puerta, Armadura Fantasma, Principal </>\\n\\n\\nBrent Miller\\n<R> WarriOrb - Tráiler </>\\n\\n\\nPierce Riola\\n<R> Mago, Gnory </>\\n\\n\\nEir Causey\\n<R> Cuervo, Teachy, Fantasnano, Mago desconocido, Fishy </>\\n\\n\\nJack Broadbent\\n<R> Monje, Mosquito </>\\n\\n\\nEmil Hagg\\n<R> cEnano, Cocinero Kobold, Druida Caído, Estatua de los Enanos, Narrador de introducción </>\\n\\n\\nErick Nita\\n<R> Creador de Golems, Ira de Armadura </>\\n\\n\\nAlain Vega\\n<R> Merch Ant </>\\n\\n\\nAngela Tran\\n<R> Lillian, Trotadesagües </>\\n\\n\\nBrittany Ann Phillips\\n<R> Lory </>\\n\\n\\nAurore Gautheur\\n<R> Fuente, Sombra </>\\n\\n\\nAlexander Blairlex\\n<R> Fishy Primitivo, Casco Fantasma </>\\n\\n\\nSophie Ryder\\n<R> Shadesphere </>\\n\\n\\n\\n\\n<T> - Socios - </>\\n\\n\\nMaple Whispering\\n<R> Localización china </>\\n<R> Editor - China, PC </>\\n\\n\\nNovy Unlimited\\n<R> Relaciones públicas y marketing </>\\n\\n\\n\\n\\n<T> - Localización - </>\\n\\n\\nVera Liscovschi\\n<R> Ruso </>\\n\\n\\nJay Johnstone\\n<R> Español </>\\n\\n\\nBertin William\\n<R> francés </>\\n\\n\\n\\n\\n<T> - Game Testers - </>\\n\\n\\nSaleymander\\n\\n\\nEnganche\\n\\n\\nMrCalculated\\n\\n\\n<img id=\\\"Rainbow\\\"/>Scorpion253<img id=\\\"Rainbow\\\"/>\\n\\n\\nMoisés\\n\\n\\nNinjin42\\n\\n\\nKonstantinos Xenitidis\\n\\n\\nPhyronnaz\\n\\n\\nArturo\\n\\n\\nMaster1G\\n\\n\\nDávid Bartók\\n\\n\\nLiDuGaming\\n\\n\\nClaudiu Coman\\n\\n\\nÁron Ürögdi\\n\\n\\nDukenukemboi\\n\\n\\nBart se enfría\\n\\n\\nGlenn De Jonghe\\n\\n\\nDomonkos Péter Madarász\\n\\n\\nGergő Gyarmati\\n\\n\\nRéka Gyarmati\\n\\n\\nKincső Petraskó\\n\\n\\nGergő Petraskó\\n\\n\\nDániel Garamvölgyi\\n\\n\\nDanny \\\"GHelmet\\\" Cloutier\\n\\n\\nAnna Boglárka Tóth\\n\\n\\nBíborka Roxána Kubik\\n\\n\\nVirág Miklós\\n\\n\\nBenedek Marozsák\\n\\n\\nDániel Marozsák\\n\\n\\nGereon Bartel\\n\\n\\n\\n\\n<T> - Ganador de la competición del Speedrun - </>\\n\\n-7\\n\\n\\n\\n\\n<T> - Agradecimientos especiales - </>\\n\\n\\nComunidad del servidor Discord de Malazan\\n\\n\\nComunidad del servidor Discord / r / metroidvenia \\n\\nComunidad del servidor Discord Unreal Slackers \\n\\n\\nIMGUR\\n\\n\\nBíborka Roxána Kubik\\n\\n\\nSergiu Crăiţoiu\\n\\n\\nJuhász Ernő\\n\\n\\nRacheal Smith\\n\\n\\nRuxandra Seniuc\\n\\n\\nthottee\\n\\n\\nAndrew Pappas\\n\\n\\nJonathan Lampel\\n\\n\\nRichárd Németh\\n\\n\\nAlex Gorcea\\n\\n\\nNotRealVitor\\n\\n\\nKinga Surján\\n\\n\\nAnna Boglárka Tóth\\n\\n\\nÉvi Fekete\\n\\n\\nGergő Sielaf\\n\\n\\n<img id=\\\"Rainbow\\\"/>Scorpion253<img id=\\\"Rainbow\\\"/>\\n\\n\\nMainiac\\n\\n\\n\\n\\n<T> - Tecnología - </>\\n\\n\\n<R> WarriOrb usa el motor Unreal®. </>\\n<R> Unreal® es una marca comercial o una marca comercial registrada de Epic Games, Inc. en los Estados Unidos de América y en otros lugares </>\\n\\n<R> Unreal® Engine, Copyright 1998 - 2020, Epic Games, Inc. Todos los derechos reservados. </>\\n\\n\\n\\n<R> Hecho con FMOD Studio por Firelight Technologies Pty Ltd. </>\"\n\n#. Key:\tAxeSpecial_name\n#. SourceLocation:\t/Game/SO/CharacterStrikes/AxeSpecial.AxeSpecial.StrikeName\n#: /Game/SO/CharacterStrikes/AxeSpecial.AxeSpecial.StrikeName\nmsgctxt \"CharacterStrike\"\nmsgid \"Throw\"\nmsgstr \"Tirar\"\n\n#. Key:\tDemonSwordSpecial_name\n#. SourceLocation:\t/Game/SO/CharacterStrikes/DemonSwordSpecial.DemonSwordSpecial.StrikeName\n#: /Game/SO/CharacterStrikes/DemonSwordSpecial.DemonSwordSpecial.StrikeName\nmsgctxt \"CharacterStrike\"\nmsgid \"Downstrike\"\nmsgstr \"Golpe descendente\"\n\n#. Key:\tDualBladeSpecial_name\n#. SourceLocation:\t/Game/SO/CharacterStrikes/DualBladeSpecial.DualBladeSpecial.StrikeName\n#: /Game/SO/CharacterStrikes/DualBladeSpecial.DualBladeSpecial.StrikeName\nmsgctxt \"CharacterStrike\"\nmsgid \"Backslash\"\nmsgstr \"Golpe Trasero\"\n\n#. Key:\tLeafMaceSpecial_name\n#. SourceLocation:\t/Game/SO/CharacterStrikes/LeafMaceSpecial.LeafMaceSpecial.StrikeName\n#: /Game/SO/CharacterStrikes/LeafMaceSpecial.LeafMaceSpecial.StrikeName\nmsgctxt \"CharacterStrike\"\nmsgid \"Crushing Blow\"\nmsgstr \"Golpe Aplastante\"\n\n#. Key:\tSabreSpecial_name\n#. SourceLocation:\t/Game/SO/CharacterStrikes/SabreSpecial.SabreSpecial.StrikeName\n#: /Game/SO/CharacterStrikes/SabreSpecial.SabreSpecial.StrikeName\nmsgctxt \"CharacterStrike\"\nmsgid \"Floating Strikes\"\nmsgstr \"Golpes Flotantes\"\n\n#. Key:\tSwordSpecialAirStrike_name\n#. SourceLocation:\t/Game/SO/CharacterStrikes/SwordSpecialAirStrike.SwordSpecialAirStrike.StrikeName\n#: /Game/SO/CharacterStrikes/SwordSpecialAirStrike.SwordSpecialAirStrike.StrikeName\nmsgctxt \"CharacterStrike\"\nmsgid \"Air Strike\"\nmsgstr \"Ataque Aéreo\"\n\n#. Key:\tBPEftAttackSpeedMultiplier_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/BPEftAttackSpeedMultiplier.Default__BPEftAttackSpeedMultiplier_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/BPEftAttackSpeedMultiplier.Default__BPEftAttackSpeedMultiplier_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Quick Hands\"\nmsgstr \"Manos Rápidas\"\n\n#. Key:\tBPEftBootTransmutation_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/BPEftBootTransmutation.Default__BPEftBootTransmutation_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/BPEftBootTransmutation.Default__BPEftBootTransmutation_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Protective Transmutation\"\nmsgstr \"Transmutación Protectora\"\n\n#. Key:\tBPEftBounce_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftBounce.Default__BPEftBounce_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftBounce.Default__BPEftBounce_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Charged Bounce\"\nmsgstr \"Rebote Cargado\"\n\n#. Key:\tBPEftCooldownReducePassive02_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/BPEftCooldownReducePassive02.Default__BPEftCooldownReducePassive02_C.DisplayName\n#. Key:\tBPEftCooldownReduce_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/BPEftCooldownReduce.Default__BPEftCooldownReduce_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/BPEftCooldownReduce.Default__BPEftCooldownReduce_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/BPEftCooldownReducePassive02.Default__BPEftCooldownReducePassive02_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Restlessness\"\nmsgstr \"Inquietud\"\n\n#. Key:\tBPEftCriticalChanceBoost10_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/BPEftCriticalChanceBoost10.Default__BPEftCriticalChanceBoost10_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/BPEftCriticalChanceBoost10.Default__BPEftCriticalChanceBoost10_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Critical Chance\"\nmsgstr \"Posibilidad Crítica\"\n\n#. Key:\tBPEftDamageReflection_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/BPEftDamageReflection.Default__BPEftDamageReflection_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/BPEftDamageReflection.Default__BPEftDamageReflection_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Sparks of Vengeance\"\nmsgstr \"Chispas de Venganza\"\n\n#. Key:\tBPEftDmgModifier_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftDmgModifier.Default__BPEftDmgModifier_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftDmgModifier.Default__BPEftDmgModifier_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Perfect Hands\"\nmsgstr \"Manos Perfectas\"\n\n#. Key:\tBPEftHeal3_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/BPEftHeal3.Default__BPEftHeal3_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/BPEftHeal3.Default__BPEftHeal3_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Heal\"\nmsgstr \"Curar\"\n\n#. Key:\tBPEftLifeLeech5_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/BPEftLifeLeech5.Default__BPEftLifeLeech5_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/BPEftLifeLeech5.Default__BPEftLifeLeech5_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Life Leech\"\nmsgstr \"Sanguijuela de la Vida\"\n\n#. Key:\tBPEftMagicMissle_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftMagicMissle.Default__BPEftMagicMissle_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftMagicMissle.Default__BPEftMagicMissle_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Magic Missile\"\nmsgstr \"Misil Mágico\"\n\n#. Key:\tBPEftMassMagicMissle_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftMassMagicMissle.Default__BPEftMassMagicMissle_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftMassMagicMissle.Default__BPEftMassMagicMissle_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Magic Missiles\"\nmsgstr \"Misiles Mágicos\"\n\n#. Key:\tBPEftMassSlow_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftMassSlow.Default__BPEftMassSlow_C.DisplayName\n#. Key:\tBPEftSlow_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/BPEftSlow.Default__BPEftSlow_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/BPEftSlow.Default__BPEftSlow_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftMassSlow.Default__BPEftMassSlow_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Slow\"\nmsgstr \"Lento\"\n\n#. Key:\tBPEftMeteorShower_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftMeteorShower.Default__BPEftMeteorShower_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftMeteorShower.Default__BPEftMeteorShower_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Meteor Shower\"\nmsgstr \"Lluvia de Meteoros\"\n\n#. Key:\tBPEftRegainSpellPassive25_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/BPEftRegainSpellPassive25.Default__BPEftRegainSpellPassive25_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/BPEftRegainSpellPassive25.Default__BPEftRegainSpellPassive25_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Arcane Luck\"\nmsgstr \"Suerte Arcana\"\n\n#. Key:\tBPEftRegainSpells_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/BPEftRegainSpells.Default__BPEftRegainSpells_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/BPEftRegainSpells.Default__BPEftRegainSpells_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Restoration\"\nmsgstr \"Restauracion\"\n\n#. Key:\tBPEftResModifierMagicalStrong_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftResModifierMagicalStrong.Default__BPEftResModifierMagicalStrong_C.DisplayName\n#. Key:\tBPEftResModifierMagical_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftResModifierMagical.Default__BPEftResModifierMagical_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftResModifierMagical.Default__BPEftResModifierMagical_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftResModifierMagicalStrong.Default__BPEftResModifierMagicalStrong_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Wardskin\"\nmsgstr \"Piel Protectora\"\n\n#. Key:\tBPEftResModifierPhysical_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftResModifierPhysical.Default__BPEftResModifierPhysical_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftResModifierPhysical.Default__BPEftResModifierPhysical_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Stoneskin\"\nmsgstr \"Piel de Piedra\"\n\n#. Key:\tBPEftSecondChance_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/BPEftSecondChance.Default__BPEftSecondChance_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/BPEftSecondChance.Default__BPEftSecondChance_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Second Chance\"\nmsgstr \"Segunda Oportunidad\"\n\n#. Key:\tBPEftSpellFire0_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftSpellFire0.Default__BPEftSpellFire0_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftSpellFire0.Default__BPEftSpellFire0_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Firestrike\"\nmsgstr \"Golpe de Fuego\"\n\n#. Key:\tBPEftSpellLightningWalk_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftSpellLightningWalk.Default__BPEftSpellLightningWalk_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftSpellLightningWalk.Default__BPEftSpellLightningWalk_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Shockwalk\"\nmsgstr \"Shockwalk\"\n\n#. Key:\tBPEftSpellShadowWalk_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftSpellShadowWalk.Default__BPEftSpellShadowWalk_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftSpellShadowWalk.Default__BPEftSpellShadowWalk_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Shadewalk\"\nmsgstr \"Shadewalk\"\n\n#. Key:\tBPEftSpellShield_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftSpellShield.Default__BPEftSpellShield_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftSpellShield.Default__BPEftSpellShield_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Shield\"\nmsgstr \"Escudo\"\n\n#. Key:\tBPEftSpellSoulKeeper_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftSpellSoulKeeper.Default__BPEftSpellSoulKeeper_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftSpellSoulKeeper.Default__BPEftSpellSoulKeeper_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Soulbind\"\nmsgstr \"Vinculación del Alma\"\n\n#. Key:\tBPEftStun_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/BPEftStun.Default__BPEftStun_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/BPEftStun.Default__BPEftStun_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Stun\"\nmsgstr \"Aturdir\"\n\n#. Key:\tBPEftStunPassive10_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/BPEftStunPassive10.Default__BPEftStunPassive10_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/BPEftStunPassive10.Default__BPEftStunPassive10_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Stun Chance\"\nmsgstr \"Oportunidad de Aturdimiento\"\n\n#. Key:\tBPEftSwap_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftSwap.Default__BPEftSwap_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftSwap.Default__BPEftSwap_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Swap\"\nmsgstr \"Intercambiar\"\n\n#. Key:\tBPEftTempHPMagical_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftTempHPMagical.Default__BPEftTempHPMagical_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftTempHPMagical.Default__BPEftTempHPMagical_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Magical Protection\"\nmsgstr \"Protección Mágica\"\n\n#. Key:\tBPEftTempHPPhysical_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftTempHPPhysical.Default__BPEftTempHPPhysical_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftTempHPPhysical.Default__BPEftTempHPPhysical_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Physical Protection\"\nmsgstr \"Protección Física\"\n\n#. Key:\tBPEftWeaponFlamesTimeBased_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/BPEftWeaponFlamesTimeBased.Default__BPEftWeaponFlamesTimeBased_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/BPEftWeaponFlamesTimeBased.Default__BPEftWeaponFlamesTimeBased_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Greenflame\"\nmsgstr \"Llama Verde\"\n\n#. Key:\tBPEftWorthy_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/BPEftWorthy.Default__BPEftWorthy_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/BPEftWorthy.Default__BPEftWorthy_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Worthy\"\nmsgstr \"Digno\"\n\n#. Key:\t1E42901841F4C7CEF39536A762076EDF\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.UI_EndScreen_SaveCreatures_C:WidgetTree.TBC1.Text\n#. Key:\t5D04206A499A8B42AF77BAA8BC9B4B8B\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.UI_EndScreen_SaveCreatures_C:WidgetTree.TBC0.Text\n#. Key:\tB0EEBB754110D2821640BE990002AC36\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.UI_EndScreen_SaveCreatures_C:WidgetTree.TBC2.Text\n#. Key:\tD75DCE214B56BA6FD9A58F9EEA9291A5\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.UI_EndScreen_C:WidgetTree.TBC0.Text\n#: /Game/SO/GUI/InGame/UI_EndScreen.UI_EndScreen_C:WidgetTree.TBC0.Text\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.UI_EndScreen_SaveCreatures_C:WidgetTree.TBC0.Text\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.UI_EndScreen_SaveCreatures_C:WidgetTree.TBC1.Text\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.UI_EndScreen_SaveCreatures_C:WidgetTree.TBC2.Text\nmsgctxt \"EndScreen\"\nmsgid \"With his quest completed Monk decided to look for another activity. He thought: <Quote>‘If I could resist madness, others should be able to do the same.’</> And so he opened a monastery to share his mental training techniques with anyone willing to save its sanity.\"\nmsgstr \"Con su misión completada, Monje decidió buscar otra actividad. Él pensó: <Quote>\\\"Si pudiera resistir la locura, otros deberían poder hacer lo mismo\\\".</> Y entonces abrió un monasterio para compartir sus técnicas de entrenamiento mental con cualquiera dispuesto a salvar su cordura.\"\n\n#. Key:\t7279EA4741D3DAC5AE92EB99AB851ED9\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.UI_EndScreen_SaveCreatures_C:WidgetTree.TBD0.Text\n#. Key:\t77E809914A65796364FE94B8C2361FD7\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.UI_EndScreen_SaveCreatures_C:WidgetTree.TBD2.Text\n#. Key:\t9C1B477D4582ABAEDC90FCB3AC6737E7\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.UI_EndScreen_C:WidgetTree.TBD0.Text\n#. Key:\tE98C3FDD453FF80CA8EBBE94459A5CAF\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.UI_EndScreen_SaveCreatures_C:WidgetTree.TBD1.Text\n#: /Game/SO/GUI/InGame/UI_EndScreen.UI_EndScreen_C:WidgetTree.TBD0.Text\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.UI_EndScreen_SaveCreatures_C:WidgetTree.TBD0.Text\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.UI_EndScreen_SaveCreatures_C:WidgetTree.TBD1.Text\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.UI_EndScreen_SaveCreatures_C:WidgetTree.TBD2.Text\nmsgctxt \"EndScreen\"\nmsgid \"<Size42>Separating the World also changed something in the Ruined Realm. The wind turned and even Ruin stopped for a moment.</>\"\nmsgstr \"<Size42>Separar el mundo también cambió algo en el Reino Arruinado. El viento cambió e incluso Ruin se detuvo por un momento.</>\"\n\n#. Key:\t9B476D3D4A603658683498B09968F8AA\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.UI_EndScreen_C:WidgetTree.TBB0.Text\n#: /Game/SO/GUI/InGame/UI_EndScreen.UI_EndScreen_C:WidgetTree.TBB0.Text\nmsgctxt \"EndScreen\"\nmsgid \"When he heard about the lost Kobold tribe he got a bit excited.<Quote>‘Kobolds reserved the ancient knowledge in their rituals’</> he said. <Quote>‘If there is something we can do with Ruin it must be connected to the rituals. I’ll go with you.’</>\"\nmsgstr \"Cuando se enteró de la tribu Kobold perdida, se emocionó un poco. <Quote>\\\"Kobolds guardaba el conocimiento antiguo en sus rituales\\\"</> dijo él. <Quote>\\\"Si hay algo que podamos hacer con Ruin, debe estar relacionado con los rituales. Iré contigo.\\\"</>\"\n\n#. Key:\tDF7F9F754F4FC9CB19DF92AFCE96C5C1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.UI_EndScreen_SaveCreatures_C:WidgetTree.TBA2.Text\n#. Key:\tE8401550448E14DD70717EB7EED0582B\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.UI_EndScreen_SaveCreatures_C:WidgetTree.TBA1.Text\n#. Key:\tUI_EndScreen_entry_0_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(0).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(0).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.UI_EndScreen_SaveCreatures_C:WidgetTree.TBA1.Text\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.UI_EndScreen_SaveCreatures_C:WidgetTree.TBA2.Text\nmsgctxt \"EndScreen\"\nmsgid \"The people soon forgot about the threat, some of them argued that Ruin ever existed.\"\nmsgstr \"La gente pronto se olvidó de la amenaza, algunos argumentaron que Ruin existió alguna vez.\"\n\n#. Key:\tE9F6E1064D5B2046DF1DEDA386012E2D\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.UI_EndScreen_C:WidgetTree.TBB2.Text\n#. Key:\tUI_EndScreen_entry_6_text_2\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(6).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(6).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.UI_EndScreen_C:WidgetTree.TBB2.Text\nmsgctxt \"EndScreen\"\nmsgid \"He opened a monastery to share his mental training techniques with anyone willing to save its sanity.\"\nmsgstr \"Abrió un monasterio para compartir sus técnicas de entrenamiento mental con cualquiera dispuesto a salvar su cordura.\"\n\n#. Key:\tF0EAD93B44D8D7AEF306EAB75D83FB37\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.UI_EndScreen_C:WidgetTree.TBB1.Text\n#: /Game/SO/GUI/InGame/UI_EndScreen.UI_EndScreen_C:WidgetTree.TBB1.Text\nmsgctxt \"EndScreen\"\nmsgid \"<Quote>‘If I could resist madness, others should be able to do the same’</> - he thought.\"\nmsgstr \"<Quote>\\\"Si pudiera resistir la locura, otros deberían poder hacer lo mismo\\\"</> - él pensó.\"\n\n#. Key:\tUI_EndScreen_entry_0_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(0).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(0).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Once the Boundaries of Worlds were sealed, Ruin could do no harm to the Human Realm again.\"\nmsgstr \"Una vez que los límites de los mundos se sellaron, Ruin no pudo volver a hacer daño al Reino Humano.\"\n\n#. Key:\tUI_EndScreen_entry_10_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(10).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(10).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Hearing these news made the Chef really excited.\"\nmsgstr \"Al escuchar estas noticias, el Cocinero realmente se emocionó.\"\n\n#. Key:\tUI_EndScreen_entry_10_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(10).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(10).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"<Quote>'Could there be other survivors of my tribe?'</>\"\nmsgstr \"<Quote>\\\"¿Podrían haber otros supervivientes de mi tribu?\\\"</>\"\n\n#. Key:\tUI_EndScreen_entry_10_text_2\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(10).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(10).EndingLogic.Texts(2).Texts\nmsgctxt \"EndScreen\"\nmsgid \"He decided to leave his kitchen and search for his lost relatives.\"\nmsgstr \"Decidió abandonar su cocina y buscar a sus familiares perdidos.\"\n\n#. Key:\tUI_EndScreen_entry_11_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(11).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(11).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"No one knows how he could possibly know about the soup, but Supper Dwarf also appeared to taste the food.\"\nmsgstr \"Nadie sabia cómo podría saber sobre la sopa, pero cEnano también parecía probar la comida.\"\n\n#. Key:\tUI_EndScreen_entry_11_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(11).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(11).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"When he heard that the chef is leaving he offered his help with the trains.\"\nmsgstr \"Cuando escuchó que el cocinero se iba, ofreció su ayuda con los trenes.\"\n\n#. Key:\tUI_EndScreen_entry_11_text_2\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(11).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(11).EndingLogic.Texts(2).Texts\nmsgctxt \"EndScreen\"\nmsgid \"<Quote>‘And I would also like to check what do they eat for supper.’</> he said. <Quote>‘I’m going with you.’</>\"\nmsgstr \"<Quote>\\\"Y también me gustaría comprobar qué comen para cenar\\\".</> dijo él. <Quote>\\\"Voy contigo.\\\"</>\"\n\n#. Key:\tUI_EndScreen_entry_12_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(12).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(12).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"On their way they stopped by the Golem Maker.\"\nmsgstr \"En el camino se detuvieron junto al Creador de Golems.\"\n\n#. Key:\tUI_EndScreen_entry_12_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(12).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(12).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"He was just sitting and staring at nothing.\"\nmsgstr \"Estaba sentado y mirando a la nada.\"\n\n#. Key:\tUI_EndScreen_entry_12_text_2\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(12).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(12).EndingLogic.Texts(2).Texts\nmsgctxt \"EndScreen\"\nmsgid \"It was still hard for the Maker to accept that all his work was for nothing.\"\nmsgstr \"Todavía era difícil para el Creador aceptar que todo su trabajo era para nada.\"\n\n#. Key:\tUI_EndScreen_entry_12_text_3\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(12).EndingLogic.Texts(3).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(12).EndingLogic.Texts(3).Texts\nmsgctxt \"EndScreen\"\nmsgid \"At least he stopped creating mindless stone golems.\"\nmsgstr \"Al menos dejó de crear golems de piedra sin sentido.\"\n\n#. Key:\tUI_EndScreen_entry_13_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(13).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(13).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"When he heard about the lost Kobold tribe he got a bit excited.\"\nmsgstr \"Cuando se enteró de la tribu Kobold perdida, se emocionó un poco.\"\n\n#. Key:\tUI_EndScreen_entry_13_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(13).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(13).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"<Quote>‘Kobolds reserved the ancient knowledge in their rituals’</> he said.\"\nmsgstr \"<Quote>\\\"Kobolds reservó el conocimiento antiguo en sus rituales\\\"</> dijo él.\"\n\n#. Key:\tUI_EndScreen_entry_13_text_2\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(13).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(13).EndingLogic.Texts(2).Texts\nmsgctxt \"EndScreen\"\nmsgid \"<Quote>‘If there is something we can do with Ruin it must be connected to the rituals. I’ll go with you.’</>\"\nmsgstr \"<Quote>\\\"Si hay algo que podamos hacer con Ruin, debe estar relacionado con los rituales. Iré contigo.\\\"</>\"\n\n#. Key:\tUI_EndScreen_entry_14_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(14).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(14).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"However there are things which never change.\"\nmsgstr \"Sin embargo, hay cosas que nunca cambian.\"\n\n#. Key:\tUI_EndScreen_entry_14_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(14).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(14).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"After days of arguing on who undermined whose business Lory and Gnory separated once again.\"\nmsgstr \"Después de días de discutir sobre el negocio, Lory y Gnory se separaron una vez más.\"\n\n#. Key:\tUI_EndScreen_entry_15_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(15).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(15).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"While they were arguing Fishy decided to leave Gnory and set out on his own.\"\nmsgstr \"Mientras discutían, Fishy decidió dejar a Gnory y se fue solo.\"\n\n#. Key:\tUI_EndScreen_entry_15_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(15).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(15).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"He had no idea where he was going.\"\nmsgstr \"No tenía idea de a dónde iba.\"\n\n#. Key:\tUI_EndScreen_entry_16_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(16).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(16).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"After weeks of walking alone, he heard a faint excited voice:\"\nmsgstr \"Después de semanas de caminar solo, escuchó una voz floja y emocionada:\"\n\n#. Key:\tUI_EndScreen_entry_1_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(1).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(1).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"The Mage Council didn’t believe a single word Lillian or Scholar told them about the events.\"\nmsgstr \"El Concilio de los Magos no crearon ni una sola palabra que Lillian o Erudito les dijera sobre los eventos.\"\n\n#. Key:\tUI_EndScreen_entry_1_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(1).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(1).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"They claimed that Wizard died in an unfortunate accident and his device could never actually work anyway.\"\nmsgstr \"Afirmaron que Mago murió en un desafortunado accidente y que su aparato nunca podría funcionar de todos modos.\"\n\n#. Key:\tUI_EndScreen_entry_2_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(2).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(2).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Although Lillian inherited her father’s castle she was sent to an Orphanage until she came into age to live on her own.\"\nmsgstr \"Aunque Lillian heredó el castillo de su padre, la enviaron a un orfanato hasta que llegó a la edad para vivir sola.\"\n\n#. Key:\tUI_EndScreen_entry_2_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(2).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(2).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Scholar was upset by Lillian’s decision on letting the Ruined Realm fall but he promised Lillian that he will make the Wizard’s Council let Lillian live in his estate.\"\nmsgstr \"Erudito estaba molesto por la decisión de Lillian de dejar caer el Reino Arruinado, pero le prometió a Lillian que hará que el Concilio de los Magos deje que Lillian viva en su estado.\"\n\n#. Key:\tUI_EndScreen_entry_3_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(3).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(3).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Lillian didn't let the unfortunate events to overcome her. She stopped Ruin even if no one believed her.\"\nmsgstr \"Lillian no dejó que los desafortunados eventos la superaran. Detuvo a Ruin aunque nadie la creyera.\"\n\n#. Key:\tUI_EndScreen_entry_3_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(3).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(3).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"She also knew that the Ruined Realm still had at least a half century before it was totally destroyed so she decided to keep on looking for a way to save it.\"\nmsgstr \"También sabía que el Reino Arruinado tenía al menos medio siglo antes de que fuera totalmente destruido, por lo que decidió seguir buscando una manera de salvarlo.\"\n\n#. Key:\tUI_EndScreen_entry_3_text_2\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(3).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(3).EndingLogic.Texts(2).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Now that her own Realm was safe she could focus on the other Realms.\"\nmsgstr \"Ahora que su propio Reino estaba a salvo, podía concentrarse en los otros Reinos.\"\n\n#. Key:\tUI_EndScreen_entry_4_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(4).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(4).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"<Size42>Separating the World also changed something in the Ruined Realm.</>\"\nmsgstr \"<Size42>Separar el mundo también cambió algo en el Reino Arruinado.</>\"\n\n#. Key:\tUI_EndScreen_entry_4_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(4).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(4).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"<Size42>The wind turned and even Ruin stopped for a moment.</>\"\nmsgstr \"<Size42>El viento cambió e incluso Ruin se detuvo por un momento.</>\"\n\n#. Key:\tUI_EndScreen_entry_5_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(5).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(5).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"When it was certain that no one will be saved from Ruin, as a last desperate act Gate Keeper tried to open a Gate to the Human Realm himself.\"\nmsgstr \"Cuando era seguro que nadie se salvaría de Ruin, como último acto desesperado, el Guardián de la Puerta intentó abrir la Puerta al Reino Humano.\"\n\n#. Key:\tUI_EndScreen_entry_5_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(5).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(5).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"A portal opened and swallowed the Keeper.\"\nmsgstr \"Se abrió un portal y se tragó al Guardián.\"\n\n#. Key:\tUI_EndScreen_entry_5_text_2\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(5).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(5).EndingLogic.Texts(2).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Some believed he survived but no one ever met him again.\"\nmsgstr \"Algunos creyeron que sobrevivió pero nadie volvió a verlo.\"\n\n#. Key:\tUI_EndScreen_entry_6_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(6).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(6).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"With his quest completed Monk decided to look for another activity.\"\nmsgstr \"Con su mision completada, Monje decidió buscar otra actividad.\"\n\n#. Key:\tUI_EndScreen_entry_6_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(6).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(6).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"<Quote>‘If I could resist madness, shouldn't others be able to do the same?’</>- he wondered.\"\nmsgstr \"<Quote>\\\"Si pudiera resistir la locura, ¿no deberían otros ser capaces de hacer lo mismo?\\\"</> - se preguntó.\"\n\n#. Key:\tUI_EndScreen_entry_7_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(7).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(7).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"To the surprise of many Teachy also joined Monk and soon he became his best student.\"\nmsgstr \"A sorpresa de muchos, Teachy también se unió a Monje y pronto se convirtió en su mejor alumno.\"\n\n#. Key:\tUI_EndScreen_entry_7_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(7).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(7).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"<Quote>‘To be honest I never actually wanted to be a teacher‘</> - said Teachy.\"\nmsgstr \"<Quote>\\\"Para ser honesto, nunca quise ser profesor\\\"</> - dijo Teachy.\"\n\n#. Key:\tUI_EndScreen_entry_7_text_2\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(7).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(7).EndingLogic.Texts(2).Texts\nmsgctxt \"EndScreen\"\nmsgid \"<Quote>'I also knew that I was a bit mad and since for my insane mind training in a monastery looked like a crazy idea I immediately knew that in fact that's the most sane thing to do.’</>\"\nmsgstr \"<Quote>\\\"También sabía que estaba un poco tocado de la cabeza y dado que mi entrenamiento mental en un monasterio parecía una idea de locos, inmediatamente supe que, de hecho, eso era lo más sensato.\\\"</>\"\n\n#. Key:\tUI_EndScreen_entry_8_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(8).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(8).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Losing his connection to his master, Raven had to think again about his purpose.\"\nmsgstr \"Al perder su conexión con su maestro, Cuervo tuvo que pensar sobre su propósito.\"\n\n#. Key:\tUI_EndScreen_entry_8_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(8).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(8).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"<Quote>‘I think therefore I am not a bird’</> - he said.\"\nmsgstr \"<Quote>\\\"Creo que por lo tanto no soy un pájaro\\\"</> - dijo él.\"\n\n#. Key:\tUI_EndScreen_entry_8_text_2\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(8).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(8).EndingLogic.Texts(2).Texts\nmsgctxt \"EndScreen\"\nmsgid \"With his vast experience he couldn’t become the same thoughtless bird he once was.\"\nmsgstr \"Con su vasta experiencia, no pudo convertirse en el mismo pájaro mundano que alguna vez fue.\"\n\n#. Key:\tUI_EndScreen_entry_8_text_3\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(8).EndingLogic.Texts(3).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(8).EndingLogic.Texts(3).Texts\nmsgctxt \"EndScreen\"\nmsgid \"He joined Monk’s monastery to teach philosophy.\"\nmsgstr \"Se unió al monasterio de Monje para enseñar filosofía.\"\n\n#. Key:\tUI_EndScreen_entry_8_text_4\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(8).EndingLogic.Texts(4).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(8).EndingLogic.Texts(4).Texts\nmsgctxt \"EndScreen\"\nmsgid \"In his free hours he kept on studying the Ancient’s technology hoping that one day he will find a way back to Lillian.\"\nmsgstr \"En sus horas libres seguía estudiando la tecnología de los Antiguos con la esperanza de que algún día encontrara el camino de regreso a Lillian.\"\n\n#. Key:\tUI_EndScreen_entry_9_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(9).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(9).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"When the soup was almost ready the Pipe Walkers smelled the flavour and they all gathered for a last dinner.\"\nmsgstr \"Cuando la sopa estaba casi lista, los Trotadesagües olieron y todos se reunieron para una última cena.\"\n\n#. Key:\tUI_EndScreen_entry_9_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(9).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(9).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"After lunch they started to talk.\"\nmsgstr \"Después del almuerzo comenzaron a hablar.\"\n\n#. Key:\tUI_EndScreen_entry_9_text_2\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(9).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(9).EndingLogic.Texts(2).Texts\nmsgctxt \"EndScreen\"\nmsgid \"One of the Pipe Walkers, who had been in many cages mentioned that she actually met some kobolds far away.\"\nmsgstr \"Uno de los Trotadesagües, que había estado en muchas jaulas, mencionó que en realidad conoció a algunos kobolds lejanos.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_0_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(0).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(0).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"By the time the furious crowd broke into the Wizard’s Castle the Device was completely destroyed.\"\nmsgstr \"Cuando la furiosa multitud irrumpió en el Castillo del Mago, el aparato estaba completamente destruido.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_0_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(0).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(0).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Some left, others started to investigate the building hoping to find something which might stop Ruin.\"\nmsgstr \"Algunos se fueron, otros comenzaron a investigar el edificio con la esperanza de encontrar algo que pudiera detener a Ruin.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_10_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(10).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(10).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"<Quote>‘Kobolds reserved the ancient knowledge in their rituals’</> Golem Maker said. <Quote>‘If there is something we can do with Ruin it must be connected to the rituals. I’ll go with you.’</>\"\nmsgstr \"<Quote>\\\"Kobolds reservó el conocimiento antiguo en sus rituales\\\"</> Creador de Golems dijo. <Quote>\\\"Si hay algo que podamos hacer con Ruin, debe estar relacionado con los rituales. Iré contigo.\\\"</>\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_10_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(10).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(10).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Golem Maker was a huge help to Lillian with his knowledge on Golemology and it was not easy for Lillian to let him go.\"\nmsgstr \"Creador de Golems fue de gran ayuda para Lillian con su conocimiento sobre Golemología y no fue fácil para Lillian dejarlo ir.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_10_text_2\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(10).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(10).EndingLogic.Texts(2).Texts\nmsgctxt \"EndScreen\"\nmsgid \"<Quote>‘Have no fear!’</> Golem Maker said. <Quote>‘I will return with even more knowledge and we’ll stop Ruin once and for all.’</>\"\nmsgstr \"<Quote>\\\"¡No tener miedo!\\\"</> Creador de Golems dijo. <Quote>\\\"Volveré con aún más conocimiento y detendremos a Ruin de una vez por todas.\\\"</>\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_11_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(11).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(11).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"After Kobold Chef left, Supper Dwarf had to take care of the kitchen.\"\nmsgstr \"Cuando el Cocinero Kobold se fue, cEnano tuvo que ocuparse de la cocina.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_11_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(11).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(11).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"It turned out that he is also really talented at making food.\"\nmsgstr \"Resultó que también tiene mucho talento para hacer comida.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_11_text_2\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(11).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(11).EndingLogic.Texts(2).Texts\nmsgctxt \"EndScreen\"\nmsgid \"<Quote> ‘That is because I know exactly what the final result should be’</> he explained.\"\nmsgstr \"<Quote>\\\"Eso es porque sé exactamente cuál debería ser el resultado final\\\"</> explicó él.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_11_text_3\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(11).EndingLogic.Texts(3).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(11).EndingLogic.Texts(3).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Later he opened a restaurant which soon became really popular.\"\nmsgstr \"Más tarde abrió un restaurante que pronto se hizo muy popular.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_11_text_4\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(11).EndingLogic.Texts(4).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(11).EndingLogic.Texts(4).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Some say mostly because he hired Pipe Walkers to serve the meal and for marketing purposes.\"\nmsgstr \"Algunos dicen principalmente porque contrató a los Trotadesagües para servir la comida y con fines de marketing.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_12_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(12).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(12).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Monk decided to stay in the Ruined Realm.\"\nmsgstr \"Monje decidió quedarse en el Reino Arruinado.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_12_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(12).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(12).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"<Quote>‘Even if it was not enough I did all I could. I’m done.’</> he said.\"\nmsgstr \"<Quote>\\\"Aunque no fuera suficiente, hice todo lo que pude. He terminado.\\\"</> Dijo él.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_12_text_2\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(12).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(12).EndingLogic.Texts(2).Texts\nmsgctxt \"EndScreen\"\nmsgid \"He sat down on a mountaintop and started meditating.\"\nmsgstr \"Se sentó en la cima de una montaña y comenzó a meditar.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_13_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(13).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(13).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"A few weeks later he realized that even though he failed his quest he still should do something.\"\nmsgstr \"Unas semanas más tarde se dio cuenta de que, aunque había fallado en su misión, aún debería hacer algo.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_13_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(13).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(13).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"<Quote>‘Due to my training I can resist Ruin’</> he thought. <Quote>‘No one has ever seen what’s there where Ruin destroyed the lands. If I train harder I might be able to get closer to Ruin to see what it really is.’</>\"\nmsgstr \"<Quote>\\\"Debido a mi entrenamiento puedo resistir a Ruin\\\"</>pensó él. <Quote>\\\"Nadie ha visto lo que hay allí donde Ruin destruyó las tierras. Si entreno más fuerte, podría acercarme a Ruin para ver qué es realmente.\\\"</>\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_13_text_2\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(13).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(13).EndingLogic.Texts(2).Texts\nmsgctxt \"EndScreen\"\nmsgid \"He kept on practising and soon set out on a journey into the heart of Ruin to find answers to questions even he didn’t know.\"\nmsgstr \"Siguió practicando y pronto emprendió un viaje al corazón del Ruin para encontrar respuestas a preguntas que incluso él no sabía.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_14_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(14).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(14).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Lory and Gnory suddenly found themselves in a world full of possible customers.\"\nmsgstr \"Lory y Gnory de repente se encontraron en un mundo lleno de posibles clientes.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_14_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(14).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(14).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Of course it didn’t mean they stopped arguing on who undermined whose business but finally they both had the chance to run a successful trading company.\"\nmsgstr \"Por supuesto, eso no significaba que dejaron de discutir sobre quién socavaba el negocio de quién, pero finalmente ambos tuvieron la oportunidad de dirigir una empresa comercial exitosa.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_15_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(15).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(15).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Gnory specialized himself in selling medicine which were said to heal the sickness which was spreading as Ruin reached closer.\"\nmsgstr \"Gnory se especializó en la venta de medicamentos que, según se decía, curaban la enfermedad que se extendía cuando Ruin se acercaba.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_15_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(15).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(15).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Lory specialized in medicine which were said to heal the sickness which was caused by the medicine of Gnory.\"\nmsgstr \"Lory se especializó en medicina de la que se decía que curaba la enfermedad causada por la medicina de Gnory.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_16_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(16).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(16).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Lory’s herbaria worked out.\"\nmsgstr \"El herbolario de Lory funcionó.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_16_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(16).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(16).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Soon she started to sell other medicine and healing devices as well.\"\nmsgstr \"Pronto comenzó a vender otros medicamentos y aparato de curación también.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_17_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(17).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(17).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"As for Gnory, he decided to sell lots of different things in the City Prison which turned out to be his new home for a while.\"\nmsgstr \"En cuanto a Gnory, decidió vender muchas cosas diferentes en la Prisión de la Ciudad, que resultó ser su nuevo hogar por un tiempo.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_18_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(18).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(18).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Fishy didn’t like the medicine business so he left Gnory.\"\nmsgstr \"A Fishy no le gustaba el negocio de la medicina, así que dejó a Gnory.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_18_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(18).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(18).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"He joined Monk for a while to learn the mental training techniques which reserved Monk’s sanity.\"\nmsgstr \"Se unió a Monje por un tiempo para aprender las técnicas de entrenamiento mental que reservaban la cordura de Monje.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_18_text_2\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(18).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(18).EndingLogic.Texts(2).Texts\nmsgctxt \"EndScreen\"\nmsgid \"<Quote>‘Fishy think it is important’ </>he said.<Quote> ‘If Monk go to see Ruin, Fishy need to learn it.’</>\"\nmsgstr \"<Quote>\\\"Fishy piensa que es importante\\\"</> dijo él. <Quote> Si Monje va a ver a Ruin, Fishy necesita aprenderlo.\\\"</>\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_18_text_3\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(18).EndingLogic.Texts(3).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(18).EndingLogic.Texts(3).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Monk accepted Fishy as his apprentice and taught him all that was possible.\"\nmsgstr \"Monje aceptó a Fishy como su aprendiz y le enseñó todo lo que era posible.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_18_text_4\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(18).EndingLogic.Texts(4).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(18).EndingLogic.Texts(4).Texts\nmsgctxt \"EndScreen\"\nmsgid \"<Quote>‘Now is the time’</> Monk said one day. <Quote>’Go to the Human Realm and prepare the people.’</>\"\nmsgstr \"<Quote>\\\"Ahora es el momento\\\"</> Dijo Monje un día. <Quote>\\\"Ve al Reino Humano y prepara a la gente.\\\"</>\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_19_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(19).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(19).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"On his way to the Human Realm Fishy heard a faint excited voice:\"\nmsgstr \"En su camino hacia el Reino Humano, Fishy escuchó una voz floja e emocionada:\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_19_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(19).EndingLogic.Texts(1).Texts\n#. Key:\tUI_EndScreen_entry_16_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(16).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(16).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(19).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"<Quote>‘Hey there! I’m fed up with microtransactions. Can I go with ya man?’</>\"\nmsgstr \"<Quote>\\\"¡Hola! Estoy harto de microtransacciones. ¿Puedo ir contigo, hombre?</>\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_19_text_2\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(19).EndingLogic.Texts(2).Texts\n#. Key:\tUI_EndScreen_entry_16_text_2\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(16).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(16).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(19).EndingLogic.Texts(2).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Merch Ant and Fishy soon became best friends and ventured on together.\"\nmsgstr \"Merch Ant a y Fishy pronto se hicieron mejores amigos y se aventuraron juntos.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_1_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(1).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(1).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"A few hours later members of the Mage Council arrived along with the city guards.\"\nmsgstr \"Pocas horas después llegaron miembros del Concilio de los Magos junto con las guardias de la ciudad.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_1_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(1).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(1).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"The Council claimed that Wizard died in an unfortunate accident, his device could never actually work anyway and Ruin is nothing to fear of.\"\nmsgstr \"El Concilio afirmó que Mago murió en un desafortunado accidente, que su aparato nunca podría funcionar de todos modos y que Ruin no tiene nada que temer.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_1_text_2\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(1).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(1).EndingLogic.Texts(2).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Although it was total nonsense Lillian and Scholar was happy that the crowd were taken away from the Castle.\"\nmsgstr \"Aunque no tenía sentido, Lillian y Erudito estaban felices de que la multitud fuera llevada del Castillo.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_20_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(20).EndingLogic.Texts(0).Texts\n#. Key:\tUI_EndScreen_entry_17_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(17).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(17).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(20).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"The World was still about to end, but as one Pipe Walker wisely said:\"\nmsgstr \"El mundo aún estaba por terminar, pero como sabiamente dijo un Trotadesagüe:\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_21_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(21).EndingLogic.Texts(0).Texts\n#. Key:\tUI_EndScreen_entry_18_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(18).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(18).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(21).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"As some stories ended some new ones begun. Though what happened afterwards is not yet known.\"\nmsgstr \"Cuando algunas historias terminaron, comenzaron otras nuevas. Aunque lo que sucedió después aún no se sabe.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_2_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(2).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(2).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"When they were left alone they quickly started the evacuation of the Ruined Realm.\"\nmsgstr \"Cuando se quedaron solos, rápidamente comenzaron la evacuación del Reino Arruinado.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_3_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(3).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(3).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Even though she lost her father Lillian couldn’t afford to let sadness overcome her.\"\nmsgstr \"A pesar de que perdió a su padre, Lillian no podía permitir que la tristeza la superara.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_3_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(3).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(3).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Ruin was more of a threat now than ever before, and since the Mage Council didn’t believe in Ruin it was the task of Lillian and Scholar to repair the device.\"\nmsgstr \"Ruin era más una amenaza ahora que nunca antes, y dado que el Concilio de los Magos no creía en Ruin, era tarea de Lillian y Erudito reparar el aparato.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_4_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(4).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(4).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Scholar was really proud of Lillian because she managed to save time for the evacuation.\"\nmsgstr \"Erudito estaba realmente orgulloso de Lillian porque logró ahorrar tiempo para la evacuación.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_4_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(4).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(4).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"<Quote>‘I know Wizard would have disagreed but you did the right thing. We still have time to face Ruin. We couldn’t let everyone die there.’</>\"\nmsgstr \"<Quote>\\\"Sé que Mago habría estado en desacuerdo, pero hiciste lo correcto. Todavía tenemos tiempo para enfrentar a Ruin. No podíamos dejar que todos murieran allí.\\\"</>\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_5_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(5).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(5).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"As time passed Scholar started to behave a bit odd which made Lillian really anxious.\"\nmsgstr \"Con el paso del tiempo, Erudito comenzó a comportarse un poco extraño, lo que puso a Lillian realmente ansiosa.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_5_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(5).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(5).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Ruin was close and the solution was still far away.\"\nmsgstr \"Ruin estaba cerca y la solución aún estaba lejos.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_5_text_2\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(5).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(5).EndingLogic.Texts(2).Texts\nmsgctxt \"EndScreen\"\nmsgid \"When she talked about her concerns to Raven, the bird said:\"\nmsgstr \"Cuando le habló de sus preocupaciones a Cuervo, el pájaro dijo:\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_5_text_3\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(5).EndingLogic.Texts(3).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(5).EndingLogic.Texts(3).Texts\nmsgctxt \"EndScreen\"\nmsgid \"<Quote>‘Focus on what you are doing Lillian. He was a bit odd anyway.’</>\"\nmsgstr \"<Quote>\\\"Concéntrate en lo que estás haciendo, Lillian. Era un poco extraño de todos modos.\\\"</>\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_6_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(6).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(6).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"To the surprise of many Teachy turned out to be an excellent researcher.\"\nmsgstr \"A sorpresa de muchos, Teachy resultó ser un excelente investigador.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_6_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(6).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(6).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"<Quote>‘To be honest I never wanted to be a teacher’ </>he said. <Quote>‘I only stayed at University so that I can do some more research work. But my students never let me research during lectures.’</>\"\nmsgstr \"<Quote>\\\"Para ser sincero, nunca quise ser un maestro\\\"</> dijo él. <Quote>\\\"Solo me quedé en la Universidad para poder hacer más trabajo de investigación. Pero mis alumnos nunca me dejaron investigar durante las conferencias.\\\"</>\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_6_text_2\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(6).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(6).EndingLogic.Texts(2).Texts\nmsgctxt \"EndScreen\"\nmsgid \"He joined Lillian and dug into every book he could possibly find on the Ancient’s technology.\"\nmsgstr \"Se unió a Lillian y empezó a buscar en cada libro que pudiera encontrar cualquier cosa sobre la tecnología de los Antiguos.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_7_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(7).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(7).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"The new environment and being a bit further from Ruin made good to the Gate Keeper.\"\nmsgstr \"El nuevo entorno y el hecho de estar un poco más lejos de Ruin hicieron bien al Guardián de la Puerta.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_7_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(7).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(7).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"He organized some of the cleaners to repair the Castle so that Lillian can keep on with her work.\"\nmsgstr \"Organizó algunos de los limpiadores para reparar el Castillo mientras Lillian continua con su trabajo.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_7_text_2\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(7).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(7).EndingLogic.Texts(2).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Later he started to remember things from the Runic Realm which helped Lillian a lot.\"\nmsgstr \"Más tarde comenzó a recordar cosas del Reino Rúnico que ayudaron mucho a Lillian.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_8_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(8).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(8).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"One day a Pipe Walker, who had been in many cages mentioned that she met some kobolds far away who might be other survivors of the Kobold Chef’s tribe.\"\nmsgstr \"Un día, un Trotadesagüe, que había estado en muchas jaulas, mencionó que conoció a algunos kobolds que podrían ser otros sobrevivientes de la tribu del Cocinero Kobold.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_9_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(9).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(9).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Hearing this news made Kobold Chef really excited.\"\nmsgstr \"Al escuchar esta noticia, hizo el Cocinero Kobold realmente emocionado.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_9_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(9).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(9).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"He decided to return to the Ruined Realm and search for his lost relatives.\"\nmsgstr \"Decidió regresar al Reino Arruinado y buscar a sus familiares perdidos.\"\n\n#. Key:\tSoAct1_EG_AAFirstDroneTrio_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Drones were even more intelligent than Maintainers. They not only memorized texts, they helped correct grammar, changed the message if it was too insulting or even made up poems if they were asked to do so.\"\nmsgstr \"Los drones eran aún más inteligentes que los mantenedores. No solo memorizaron textos, ayudaron a corregir la gramática, cambiaron el mensaje si era demasiado insultante o incluso inventaron poemas si se les pedía que lo hicieran.\"\n\n#. Key:\tSoAct1_EG_AAFirstDroneTrio_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"The Flying Three\"\nmsgstr \"Los Tres Voladores\"\n\n#. Key:\tSoAct1_EG_AfterGateCleaners_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Citizens of Cerulean requested to have their own unique Golems, but it was always rejected. This situation was very good for the Black Golem Market, because this way it was always easy to find customers.\"\nmsgstr \"Los ciudadanos de Cerulean solicitaron tener sus propios Golems únicos, pero siempre fue rechazado. Esta situación fue muy buena para el Mercado Negro de Golems, porque de esta manera siempre fue fácil encontrar clientes.\"\n\n#. Key:\tSoAct1_EG_AfterGateCleaners_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Cleaners of Cerulean\"\nmsgstr \"Limpiadores de Cerulean\"\n\n#. Key:\tSoAct1_EG_AfterGateElits_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"The Runic Realm's Government didn't allow the Golems to become the privilege of the rich. Even though the elite were not allowed to have different Golems they always found a way to make their servants different than the ones owned by the poor.\"\nmsgstr \"El Gobierno del Reino Rúnico no permitió que los Golems se convirtieran en el privilegio de los ricos. A pesar de que a la élite no se les permitía tener Golems diferentes, siempre encontraban una manera de hacer que sus sirvientes fueran diferentes de los que tenían los pobres.\"\n\n#. Key:\tSoAct1_EG_AfterGateElits_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Capetainers\"\nmsgstr \"Capetainers\"\n\n#. Key:\tSoAct1_EG_AGRightFromPortal_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"'Just keep cleaning! Cleaning, cleaning...'\"\nmsgstr \"\\\"¡Sigue limpiando! Limpiando, limpiando...\\\"\"\n\n#. Key:\tSoAct1_EG_AGRightFromPortal_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Cleaner Invasion\"\nmsgstr \"Invasión Limpiadora\"\n\n#. Key:\tSoAct1_EG_AGTestStoneCircle_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"The Black Golem Market was funded by a Golem Maker apprentice who failed his master exam and was banished from school. No wonder his golems were... unique.\"\nmsgstr \"El Mercado Negro de Golems fue financiado por un aprendiz de un Creador de Golems que suspendió el examen de su maestro y fue expulsado de la escuela. No es de extrañar que sus golems fueran... únicos.\"\n\n#. Key:\tSoAct1_EG_AGTestStoneCircle_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Weird Golems\"\nmsgstr \"Golems Extraños\"\n\n#. Key:\tSoAct1_EG_AGWallJumpTeam_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"The cleaning plan for this area fell apart with the participants.\"\nmsgstr \"El plan de limpieza para esta área se vino abajo con los participantes.\"\n\n#. Key:\tSoAct1_EG_AGWallJumpTeam_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"The North Team\"\nmsgstr \"El Equipo del Norte\"\n\n#. Key:\tSoAct1_EG_ArcadeDungeonCleaners_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"The Golem's behaviour was specified by the Golem Makers. Only very simple personalities were made at the beginning. The Cleaners, for example, only desired to keep the place tidy and make sure they don't harm the people.\"\nmsgstr \"El comportamiento del Golem fue especificado por los Creadores de Golems. Se crearon personalidades muy sencillas al principio. Los limpiadores, por ejemplo, solo deseaban mantener el lugar ordenado y asegurarse de no hacer daño a la gente.\"\n\n#. Key:\tSoAct1_EG_ArcadeDungeonCleaners_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Arcade Cleaners\"\nmsgstr \"Limpiadores del Arcade\"\n\n#. Key:\tSoAct1_EG_ArcadeDungeonExit_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"After creating intelligence Golem Makers wanted even more. They wanted complex personality. They wanted Golems that can not only think but also feel. That was the idea behind designing the Gatekeepers.\"\nmsgstr \"Después de crear inteligencia, los Creadores de Golems quería aún más. Querían una personalidad compleja. Querían Golems que no solo puedan pensar sino también sentir. Esa fue la idea detrás del diseño de los Guardianes de las Puertas.\"\n\n#. Key:\tSoAct1_EG_ArcadeDungeonExit_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Arcade Servants\"\nmsgstr \"Sirviente del Arcade\"\n\n#. Key:\tSoAct1_EG_ArcadeDungeonOptional_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"You might wonder if a Vacuum Cleaner is designed to clean dust away why does it need a laser caster?\"\nmsgstr \"Quizás te preguntas si una aspiradora está diseñada para limpiar el polvo, ¿por qué necesita un láser?\"\n\n#. Key:\tSoAct1_EG_ArcadeDungeonOptional_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Vacuum Cleaners group\"\nmsgstr \"Grupo de Aspiradoras\"\n\n#. Key:\tSoAct1_EG_ArcadeMaintainers_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"The very first Golems were made to do the most monotonic work so that people have more time to think and to create. Once they were friendly but as Ruin came their behaviour changed.\"\nmsgstr \"Los primeros Golems se hicieron para hacer el trabajo más monótono para que las personas tengan más tiempo para pensar y crear. Fueron amigables, pero cuando Ruin llegó su comportamiento cambió.\"\n\n#. Key:\tSoAct1_EG_ArcadeMaintainers_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Arcade Cleaner Golems\"\nmsgstr \"Golems de Limpieza del Arcade\"\n\n#. Key:\tSoAct1_EG_Chest_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"The poor chest was minding his own business before you started to insult him.\"\nmsgstr \"El pobre cofre estaba ocupándose de sus propios asuntos antes de que empezaste a insultarle.\"\n\n#. Key:\tSoAct1_EG_Chest_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Chest\"\nmsgstr \"Cofre\"\n\n#. Key:\tSoAct1_EG_GGMiniBoss_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Maybe it only depends on the creation process, but some Golems had stronger personality. In general, Golems with more intelligence resisted Ruin longer and Golems with strong personality were more vulnerable to the infection.\"\nmsgstr \"Quizás solo depende del proceso de creación, pero algunos Golems tenían una personalidad más fuerte. En general, los Golems con más inteligencia resistieron Ruin por más tiempo y los Golems con fuerte personalidad fueron más vulnerables a la infección.\"\n\n#. Key:\tSoAct1_EG_GGMiniBoss_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Wickeds\"\nmsgstr \"Wickeds\"\n\n#. Key:\tSoAct1_EG_LoneDrone_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Drones delivered messages and gifts before Ruin. People were happy when they heard them approaching back then.\"\nmsgstr \"Drones entregaron mensajes y regalos antes de Ruin. La gente estaba feliz cuando los escuchó acercarse en aquel entonces.\"\n\n#. Key:\tSoAct1_EG_LoneDrone_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Lone Drone\"\nmsgstr \"Drone Solitario\"\n\n#. Key:\tSoAct1_EG_LoneSewerDrone_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"After Ruin most Golems liked to group together. Only a few chose to stay alone.\"\nmsgstr \"Después de Ruin, a la mayoría de los Golems les gustaba agruparse. Solo unos pocos decidieron quedarse solos.\"\n\n#. Key:\tSoAct1_EG_LoneSewerDrone_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Another Lone Drone\"\nmsgstr \"Otro Drone Solitario\"\n\n#. Key:\tSoAct1_EG_MaceGroup_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"'Attention: our enemies greatest weapon, the holy Mace is stolen. We truly should have destroyed it as the Council suggested.'\"\nmsgstr \"\\\"Atención: el arma más grande de nuestros enemigos, han robado la sagrada Maza. Deberíamos haberlo destruido como sugirió el Concilio.\\\"\"\n\n#. Key:\tSoAct1_EG_MaceGroup_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Mace Defenders\"\nmsgstr \"Defensores de la Maza\"\n\n#. Key:\tSoAct1_EG_MaintainerInvestigatorInvestigators_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"After Ruin, Golems started to have strange behavior. There were a group of them who used the pipes to flood a part of the City. Later these places were called the Sewer.\"\nmsgstr \"Después de Ruin, los Golems comenzó a tener un comportamiento extraño. Había un grupo de ellos que usaban las tuberías para inundar una parte de la ciudad. Más tarde, estos lugares se llamaron las Alcantarillas.\"\n\n#. Key:\tSoAct1_EG_MaintainerInvestigatorInvestigators_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Pipe Golems\"\nmsgstr \"Golems de Tuberías\"\n\n#. Key:\tSoAct1_EG_MaintainerInvestigators_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Not only the Golems were created by using the Spirits of the Unknown World before Ruin. People found other ways of using this new technology. They created pipes to convey hot water to heat the city and cold water to drink.\"\nmsgstr \"No solo los Golems fueron creados usando los Espíritus del Mundo Desconocido antes de Ruin. La gente encontró otras formas de usar esta nueva tecnología. Crearon tuberías para transportar agua caliente para calentar la ciudad y agua fría para beber.\"\n\n#. Key:\tSoAct1_EG_MaintainerInvestigators_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Maintainers of the Pipes\"\nmsgstr \"Mantenedores de las tuberías\"\n\n#. Key:\tSoAct1_EG_SABeforeWallJump_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Some believed cold can resist Ruin longer than magic. They created places where they kept the temperature beneath the freezing point. As it turned out, not even coldness can resist Ruin forever.\"\nmsgstr \"Algunos creen que el frío puede resistir a Ruin por más tiempo que la magia. Crearon lugares donde mantuvieron la temperatura por debajo del punto de congelación. Al final resultó que, ni siquiera el frio puede resistir a Ruin para siempre.\"\n\n#. Key:\tSoAct1_EG_SABeforeWallJump_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Cleaners of the Refrigerator.\"\nmsgstr \"Limpiadores del Refrigerador.\"\n\n#. Key:\tSoAct1_EG_SAFightMustHave_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"'We won't clear anymore!' said the rebel Maintainer.\\r\\n'Let's declear War!'\"\nmsgstr \"\"\n\n#. Key:\tSoAct1_EG_SAFightMustHave_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Underground Cleaner Band\"\nmsgstr \"Banda de Limpiadores Subterráneos\"\n\n#. Key:\tSoAct1_EG_SAFightOptional_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"'Let's make something clear. Maybe this room?'\"\nmsgstr \"\\\"Dejemos algo claro. ¿Quizás esta habitación?\\\"\"\n\n#. Key:\tSoAct1_EG_SAFightOptional_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Underground Cleaner Band B\"\nmsgstr \"Banda de limpiadores subterráneos B\"\n\n#. Key:\tSoAct1_EG_SewerCircleVacuumCleaners_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"People realised that Golem's Spirits have a power beyond imagination. They called it the Ancient Magic. Vacuum Cleaners could use this magic to do their job even better.\"\nmsgstr \"La gente se dio cuenta de que los espíritus de Golems tenían un poder que ni ellos podían imaginar. Lo llamaron Magia Antigua. Las aspiradoras podrían usar esta magia para hacer su trabajo aún mejor.\"\n\n#. Key:\tSoAct1_EG_SewerCircleVacuumCleaners_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Vacuum Cleaners\"\nmsgstr \"Aspiradoras\"\n\n#. Key:\tSoAct1_EG_SewerTeam_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Golem Makers wanted to create something more intelligent as they learned more. They shaped the Maintainers, the first golems capable of talking. Sadly their intelligence vanished as Ruin came.\"\nmsgstr \"Los Creadores de Golems quería crear algo aún más inteligente a medida que aprendían más. Dieron forma a los Mantenedores, los primeros golems capaces de hablar. Lamentablemente, su inteligencia desapareció cuando llegó Ruin.\"\n\n#. Key:\tSoAct1_EG_SewerTeam_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Sewer Golems\"\nmsgstr \"Gólems de las alcantarillas\"\n\n#. Key:\tSoAct1_EG_TL_VacuumTwins_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Libraries were important in the life of the former Realm's citizens. No wonder that many of the golems were created only to dust and organize the books.\"\nmsgstr \"Las bibliotecas eran importantes en la vida de los antiguos ciudadanos del Reino. No es de extrañar que muchos de los golems fueron creados solo para desempolvar y organizar los libros.\"\n\n#. Key:\tSoAct1_EG_TL_VacuumTwins_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Library Cleaners\"\nmsgstr \"Limpiadores de Bibliotecas\"\n\n#. Key:\tSoAct1_EG_TLSewerCreatureWatch_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Golems never ever attacked the Pipe Walkers. The reason is only known by the wisest Pipe Walker himself. It is because, as he explained: 'Nun dara bum, tuk la.'\"\nmsgstr \"Golems nunca atacó a los Trotadesagües. La razón solo la conoce el más sabio Trotadesagüe. Es porque, como explicó: \\\"Nun dara bum, tuk la.\\\"\"\n\n#. Key:\tSoAct1_EG_TLSewerCreatureWatch_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Sewer Team B\"\nmsgstr \"Equipo de las alcantarillas B\"\n\n#. Key:\tSoAct1_EG_TowerTrio_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"They spent most of their time on the top of those towers - it was clear to me that they would die there as well.\"\nmsgstr \"Pasaron la mayor parte de su tiempo en la cima de esas torres - para mí estaba claro que también morirán allí.\"\n\n#. Key:\tSoAct1_EG_TowerTrio_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"The Tower Trio\"\nmsgstr \"El Trio de la Torre\"\n\n#. Key:\tSoAct2_EG_BounceTrio_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Lava Jumpers are former Golems who fell into the lava. Some of them return to join their former Golem companions.\"\nmsgstr \"Los Salta Lava son antiguos Golems que cayeron en la lava. Algunos de ellos regresan para unirse a sus antiguos compañeros.\"\n\n#. Key:\tSoAct2_EG_BounceTrio_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Bounce Trio\"\nmsgstr \"Trío Rebote\"\n\n#. Key:\tSoAct2_EG_C_BeforeKey_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"It's still unclear what makes some creatures touched by Ruin to group together. Some believes those who had similar emotions when Ruin came were likely to form a group.\"\nmsgstr \"Todavía no está claro qué hace que algunas criaturas tocadas por Ruin se agrupen. Algunos creen que aquellos que tenían emociones similares cuando Ruin llegó probablemente formarían un grupo.\"\n\n#. Key:\tSoAct2_EG_C_BeforeKey_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Anxious Armours\"\nmsgstr \"Armaduras Ansiosas\"\n\n#. Key:\tSoAct2_EG_C_Bridge_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Crafting was always the obsession of Dwarves. In their workshops they forged mighty weapons and wondrous armours. Their love for their craft was so strong that instead of their body, Ruin preserved their iron works.\"\nmsgstr \"La elaboración siempre fue la obsesión de los enanos. En sus talleres forjaron armas poderosas y armaduras maravillosas. Su amor por su oficio era tan fuerte que, en lugar de su cuerpo, Ruin conservó sus obras de hierro.\"\n\n#. Key:\tSoAct2_EG_C_Bridge_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Bridge Brigade\"\nmsgstr \"Brigada de Puentes\"\n\n#. Key:\tSoAct2_EG_C_LoneShadeSphere_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Before Ruin there was no other humanoid race but human. New races are created by Ruin's Shades. They roam the lands looking for any living being which they can possess. Once they become part of a creature its body will start to change.\"\nmsgstr \"Antes de Ruina no había otra raza humanoide que la humana. Sombras de Ruin crea nuevas razas. Vagan por las tierras en busca de cualquier ser vivo que puedan poseer. Una vez que se vuelven parte de una criatura, su cuerpo comenzará a cambiar.\"\n\n#. Key:\tSoAct2_EG_C_LoneShadeSphere_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Weird Floating Thing\"\nmsgstr \"Extraña Cosa Flotante\"\n\n#. Key:\tSoAct2_EG_C_OfficeGuards_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Watching the only way to the Office did not bring enough protection. If any intruder managed to pass the Patrols he still had to face the Guardians to proceed.\"\nmsgstr \"Observar el único camino a la Oficina no trajo suficiente protección. Si algún intruso lograba pasar las Patrullas, aún tenía que enfrentar a los Guardianes para proceder.\"\n\n#. Key:\tSoAct2_EG_C_OfficeGuards_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Guardians of the Law\"\nmsgstr \"Guardianes de la Ley\"\n\n#. Key:\tSoAct2_EG_C_OfficePatrols_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Going into the Law's High Office was forbidden even for most of the Dwarves. Only one path lead to the Office and that was guarded by the Patrols.\"\nmsgstr \"Entrar en el Alto Oficio de la Ley estaba prohibido incluso para la mayoría de los Enanos. Solo un camino conducía a la Oficina y estaba vigilado por las Patrullas.\"\n\n#. Key:\tSoAct2_EG_C_OfficePatrols_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Patrols of the Law\"\nmsgstr \"Patrullas de la Ley\"\n\n#. Key:\tSoAct2_EG_DG_Left_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Deep beneath the Catacombs there is a secret place called the Dwarven Gate. Elite dwarves who worked here were placed above the Law. They were seeking a way to fight Ruin with Ruin's magic.\"\nmsgstr \"En lo profundo de las catacumbas hay un lugar secreto llamado la Puerta de los Enanos. Los enanos de élite que trabajaban aquí fueron colocados por encima de la Ley. Estaban buscando una forma de luchar contra Ruin y su magia.\"\n\n#. Key:\tSoAct2_EG_DG_Left_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Glorious Group\"\nmsgstr \"Grupo Glorioso\"\n\n#. Key:\tSoAct2_EG_DG_RightFloor_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Even though most of the common Dwarves never even heard about Dwarven Gate some were needed to do the hard work. Now that Ruin won, Dwarves are finally equal.\"\nmsgstr \"A pesar de que la mayoría de los enanos comunes nunca escucharon acerca de la Puerta de los Enanos, algunos fueron necesarios para hacer el trabajo duro. Ahora que Ruin ganó, los enanos realmente son iguales.\"\n\n#. Key:\tSoAct2_EG_DG_RightFloor_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Not so Elite Dwarves\"\nmsgstr \"Enanos No tan élite\"\n\n#. Key:\tSoAct2_EG_DG_RightUpOptional_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"One idea of the Elite Dwarves was to create giant statues which are able to trap Ruin's essence. Even if they were right they never managed to make enough sculptures.\"\nmsgstr \"Una idea de los Enanos de Élite era crear estatuas gigantes que pudieran atrapar la esencia de Ruin. Incluso si tenían razón, nunca lograron hacer suficientes esculturas.\"\n\n#. Key:\tSoAct2_EG_DG_RightUpOptional_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Sculptors\"\nmsgstr \"Escultores\"\n\n#. Key:\tSoAct2_EG_DwarfBoss_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Dwarven Statues were meant to imprison the essence of Ruin. However there were some Dwarven scientists who feared that the statues were not safe and in the long run they wouldn't be able to resist the power of Ruin...\"\nmsgstr \"Las Estatuas de los Enanos estaban destinadas a encarcelar la esencia de Ruin. Sin embargo, había algunos Enanos Científicos que temían que las estatuas no fueran seguras y que a la larga no pudieran resistir el poder de la Ruin.\"\n\n#. Key:\tSoAct2_EG_DwarfBoss_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Dwarven Statue\"\nmsgstr \"Estatua de los Enanos\"\n\n#. Key:\tSoAct2_EG_GolemFirst_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Stone Golems are the cheap copies of the Runic Realm Golems. If Ruin twists the creatures mind then it will definitely have no effect on these ones.\"\nmsgstr \"Los Golems de Piedra son las copias baratas de los Golems del Reino Rúnico. Si Ruin tuerce la mente de las criaturas, no tendrá ningún efecto sobre estas.\"\n\n#. Key:\tSoAct2_EG_GolemFirst_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Sphere Golem\"\nmsgstr \"Golem Esfera\"\n\n#. Key:\tSoAct2_EG_GolemSecond_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Looks like the second try is just as bad as the first one.\"\nmsgstr \"Parece que el segundo intento es tan malo como el primero.\"\n\n#. Key:\tSoAct2_EG_GolemSecond_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Second Sphere Golem\"\nmsgstr \"Segunda Esfera Golem\"\n\n#. Key:\tSoAct2_EG_GolemThird_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Whoever made this Golem, he should have stopped after the second try.\"\nmsgstr \"Quienquiera que haya hecho este Golem, debería haberse parado después del segundo intento.\"\n\n#. Key:\tSoAct2_EG_GolemThird_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Third Sphere Golem\"\nmsgstr \"Tercera Esfera Golem\"\n\n#. Key:\tSoAct2_EG_HutFishies_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Now that the Fishys are gone, the Lake's piranhas can live in peace and eat whoever comes close.\"\nmsgstr \"Ahora que los Fishys se han ido, las pirañas del lago pueden vivir en paz y comerse a quien se acerque.\"\n\n#. Key:\tSoAct2_EG_HutFishies_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Abandoned Fishy Slaves\"\nmsgstr \"Esclavos Fishys Abandonados\"\n\n#. Key:\tSoAct2_EG_HutFlyArmy_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"No one knows where the Flies came from. Although you have a very clear idea on where they should go...\"\nmsgstr \"Nadie sabe de dónde vinieron las Moscas. Aunque tienes una idea muy clara de dónde deberían ir...\"\n\n#. Key:\tSoAct2_EG_HutFlyArmy_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Annoying Flies\"\nmsgstr \"Moscas Molestas\"\n\n#. Key:\tSoAct2_EG_LavaBoss_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Armour Wrath was the most ambitious and majestic work of the Golem Maker. He used all his remaining strength to create this mighty Golem. It's a pity that all his efforts were in vain.\"\nmsgstr \"Ira de Armadura fue la obra más ambiciosa y majestuosa del Creador de los Golems. Usó toda su fuerza que le quedaba para crear este poderoso Golem. Es una pena que todos sus esfuerzos fueron en vano.\"\n\n#. Key:\tSoAct2_EG_LavaBoss_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Armour Wrath\"\nmsgstr \"Ira de Armadura\"\n\n#. Key:\tSoAct2_EG_LavaDeepTeam_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"A fourth Sphere Golem? Someone never gives up...\"\nmsgstr \"¿Una Cuarta Esfera Golem? Alguien no sabe rendirse...\"\n\n#. Key:\tSoAct2_EG_LavaDeepTeam_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Fourth Sphere Golem\"\nmsgstr \"Cuarta Esfera Golem\"\n\n#. Key:\tSoAct2_EG_LavaJumpers_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"When a Golem falls into the lava its stone body will melt away. The spirit however resists the heat and will be looking for another body...\"\nmsgstr \"Cuando un Golem cae en la lava, su cuerpo de piedra se derretirá. Sin embargo, el espíritu resiste el calor y buscará otro cuerpo...\"\n\n#. Key:\tSoAct2_EG_LavaJumpers_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Lava Jumpers\"\nmsgstr \"Salta Lava\"\n\n#. Key:\tSoAct2_EG_LavaTeamX_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Divided they fall, united they divide...\"\nmsgstr \"Divididos caerán, unidos dividirán...\"\n\n#. Key:\tSoAct2_EG_LavaTeamX_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Golem Group\"\nmsgstr \"Grupo Golem\"\n\n#. Key:\tSoAct2_EG_LavaTrio_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Wherever Golems go after death these three will go there together.\"\nmsgstr \"Donde sea que vayan los Golems después de la muerte, estos tres irán juntos.\"\n\n#. Key:\tSoAct2_EG_LavaTrio_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Golem Trio\"\nmsgstr \"Golem Trio\"\n\n#. Key:\tSoAct2_EG_OutpostLeft_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"To keep Ruin away dwarves forbade everything related to Ruin's magic. This might have worked in theory but they failed to notice that their mechanical devices were also powered by Ruin.\"\nmsgstr \"Para mantener a Ruin lejos, los enanos prohibieron todo lo relacionado con la magia de Ruin. Esto podría haber funcionado en teoría, pero no se dieron cuenta de que sus aparatos mecánicos también funcionaban con Ruin.\"\n\n#. Key:\tSoAct2_EG_OutpostLeft_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Guardians of the West Wall\"\nmsgstr \"Guardianes del Muro Oeste\"\n\n#. Key:\tSoAct2_EG_OutpostRight_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Ruin was not only meant for destruction, it could also preserve. Ruin gave endless life for those who survived at the cost of twisting their minds.\"\nmsgstr \"Ruin no solo existía para la destrucción, sino que también se podía preservar. Ruin dio una vida infinita para aquellos que sobrevivieron a costa de torcer sus mentes.\"\n\n#. Key:\tSoAct2_EG_OutpostRight_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Guardians of the East Wall\"\nmsgstr \"Guardianes del Muro Este\"\n\n#. Key:\tSoAct2_EG_OutpostWallFirst_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Dwarves fought Ruin with Rules. These soldiers were ordered here to guard the Outpost. Their will to obey the order was so strong that even death couldn't break it.\"\nmsgstr \"Los Enanos lucharon contra Ruin con Reglas. Se ordenó a estos soldados que vigilaran el Puesto Avanzado. Su voluntad de obedecer la orden era tan fuerte que incluso la muerte no podía romperla.\"\n\n#. Key:\tSoAct2_EG_OutpostWallFirst_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Patrols of the Outpost Wall\"\nmsgstr \"Patrullas del Muro Avanzado\"\n\n#. Key:\tSoAct2_EG_Shore_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"After Ruin turned them into Monsters some creatures gathered together. Whether it's the effect of Ruin or something from their former life is unclear.\"\nmsgstr \"Después de que Ruin los convirtió en monstruos, algunas criaturas se reunieron. No está claro si es el efecto de Ruin o algo de su vida anterior.\"\n\n#. Key:\tSoAct2_EG_Shore_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Shore Monsters\"\nmsgstr \"Monstruos de la Orilla\"\n\n#. Key:\tSoAct2_EG_SlideFishyTeam_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Fishys were produced by the Great Kobold tribe for slaves. Some of them managed to escape, but they couldn't go far from the Lake.\"\nmsgstr \"Fishys fueron producidos por la gran tribu Kobold para esclavos. Algunos lograron escapar, pero no pudieron alejarse mucho del lago.\"\n\n#. Key:\tSoAct2_EG_SlideFishyTeam_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Deserter Fishys\"\nmsgstr \"Fishys Desertores\"\n\n#. Key:\tSoAct2_EG_SlidePathEnd_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Deserter Fishys always kept a Fishy group close to the exit of their secret hideout. They protected the others and watched the kobolds to find the right time to venture back to the Lake.\"\nmsgstr \"Los Fishys Desertores siempre mantuvo un grupo de Fishys cerca de la salida de su escondite secreto. Protegieron a los demás y observaron a los kobolds para encontrar el momento adecuado para aventurarse de nuevo al Lago.\"\n\n#. Key:\tSoAct2_EG_SlidePathEnd_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Patrol Fishys\"\nmsgstr \"Patrulla Fishys\"\n\n#. Key:\tSoAct2_EG_WormHole_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Worms kept distance from each other before Ruin. It's strange how a force which tears everything apart can also unite.\"\nmsgstr \"Los Gusanos se mantenían separados el uno del otro antes de la Ruin. Es extraño cómo una fuerza que destroza todo también puede unir.\"\n\n#. Key:\tSoAct2_EG_WormHole_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Worms\"\nmsgstr \"Gusanos\"\n\n#. Key:\tSoAct2_EG_Wormy_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"There was a time when Worms only made damage to fields and gardens. Now they are a bit more ambitious...\"\nmsgstr \"Hubo un tiempo en que los gusanos solo dañaban los campos y jardines. Ahora son un poco más ambiciosos...\"\n\n#. Key:\tSoAct2_EG_Wormy_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Worm\"\nmsgstr \"Gusano\"\n\n#. Key:\tSoAct2_EG_WWBoss_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"When Ruin appeared some decided to abandon civilization and return to nature. Their leader, the Fallen Druid cast an ancient spell to protect his plants from Ruin. His spell partly worked but at a terrible cost.\"\nmsgstr \"Cuando apareció Ruin, algunos decidieron abandonar la civilización y regresar a la naturaleza. Su líder, el Druida Caído, lanzó un hechizo antiguo para proteger sus plantas de la Ruin. Su hechizo funcionó en parte pero a un costo terrible.\"\n\n#. Key:\tSoAct2_EG_WWBoss_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Fallen Druid\"\nmsgstr \"Druida Caído\"\n\n#. Key:\tSoAct3_EG_Act3BubbleGroundMain_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Ruin's power is not only in destruction. When it can't change something it will preserve those attributes which can prepare the possibility to change again. Ruin's power is in change.\"\nmsgstr \"El poder de la Ruin no solo está en la destrucción. Cuando no puede cambiar algo, preservará esos atributos que pueden preparar la posibilidad de cambiar nuevamente. El poder de la Ruin está en el cambio.\"\n\n#. Key:\tSoAct3_EG_Act3BubbleGroundMain_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Maintainer Spellcasters\"\nmsgstr \"Mantenedores de hechizos\"\n\n#. Key:\tSoAct3_EG_Act3FinalBattle_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Even though Ruin doesn't have consciousness nor the ability to think it somehow reacts to your presence. As if it knew the threat you present, Ruin tries all it can to stop you from leaving the Ruined Realm.\"\nmsgstr \"A pesar de que Ruin no tiene conciencia ni la capacidad de pensar, de alguna manera reacciona a tu presencia. Como si supiera la amenaza que presentas, Ruin intenta todo lo posible para evitar que abandones el Reino Arruinado.\"\n\n#. Key:\tSoAct3_EG_Act3FinalBattle_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Ruined Convention\"\nmsgstr \"Convención Arruinada\"\n\n#. Key:\tSoAct3_EG_Act3PipeGroupFirst_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"There is a difference between how Humans and Golems are transformed by Ruin. Human bodies reach their final form in a few decades but Golems never stop changing. There is always a new, more vicious type.\"\nmsgstr \"Hay una diferencia entre cómo los humanos y los golems son transformados por Ruin. Los cuerpos humanos alcanzan su forma final en unas pocas décadas, pero los Golems nunca dejan de cambiar. Siempre hay un nuevo tipo, más vicioso.\"\n\n#. Key:\tSoAct3_EG_Act3PipeGroupFirst_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Red Drones\"\nmsgstr \"Drones Rojos\"\n\n#. Key:\tSoAct3_EG_Act3PipeGroupSecond_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Transformation is relative to intelligence. Creatures with consciousness have a strong desire to reserve their ego. Ruin can fool them a few times but later they become invulnerable to Ruin's changing power.\"\nmsgstr \"La transformación es relativa a la inteligencia. Las criaturas con conciencia tienen un fuerte deseo de reservar su ego. Ruin puede engañarlos varias veces, pero luego se vuelven invulnerables al poder cambiante de Ruin.\"\n\n#. Key:\tSoAct3_EG_Act3PipeGroupSecond_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"More Drones\"\nmsgstr \"Más Drones\"\n\n#. Key:\tSoAct3_EG_Act3RangedCleanerTwins_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Ruin's nature is confusing for the human mind. It can build, it can destroy, it can use, it can be used. These actions have the same priority for Ruin. All that matters is that it can do something. And with time it wants more and more.\"\nmsgstr \"La naturaleza de la Ruin es confusa para la mente humana. Puede construir, puede destruir, puede usar, puede ser utilizado. Estas acciones tienen la misma prioridad para Ruin. Lo único que importa es que puede hacer algo. Y con el tiempo quiere más y más.\"\n\n#. Key:\tSoAct3_EG_Act3RangedCleanerTwins_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Cleaner Twins\"\nmsgstr \"Gemelos Limpiadores\"\n\n#. Key:\tSoAct3_EG_Act3VacuumTwins_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Ruin's logic is predictable when you understand its nature. When it's not possible to create more the creation process can be restarted by destroying everything first.\"\nmsgstr \"La lógica de la Ruin es predecible cuando entiendes su naturaleza. Cuando no es posible crear más, el proceso de creación se puede reiniciar destruyendo todo primero.\"\n\n#. Key:\tSoAct3_EG_Act3VacuumTwins_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Elite Twins\"\nmsgstr \"Gemelos de Élite\"\n\n#. Key:\tWhiteWall_EG_AfterKobold_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Creating intelligence was not enough for the Golem Makers. They wanted to get even further. They wanted to create Golems with emotions.\"\nmsgstr \"Crear inteligencia no fue suficiente para los Creadores de Golems. Querían ir aún más lejos. Querían crear Golems con emociones.\"\n\n#. Key:\tWhiteWall_EG_AfterKobold_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Flying Maintainer\"\nmsgstr \"Mantenedor Voladores\"\n\n#. Key:\tWhiteWall_EG_BeforeKobold_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"When the Cataclysm happened and Ruin came the Golems started to change. Instead of doing their daily work some of them turned against their masters.\"\nmsgstr \"Cuando ocurrió el Cataclismo y llegó la Ruin, los Golems comenzaron a cambiar. En lugar de hacer su trabajo diario, algunos de ellos se volvieron contra sus amos.\"\n\n#. Key:\tWhiteWall_EG_BeforeKobold_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Infected Golems\"\nmsgstr \"Gólems Infectados\"\n\n#. Key:\tWhiteWall_EG_FirstCombat_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Cleaners were the first Golems ever made. Before the Cataclysm they did all the monoton work so that the people had more time to think and to create.\"\nmsgstr \"Los Limpiadores fueron los primeros Golems que se hicieron. Antes del Cataclismo, hicieron todo el trabajo monótono para que la gente tuviera más tiempo para pensar y crear.\"\n\n#. Key:\tWhiteWall_EG_FirstCombat_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Whitewall Cleaners\"\nmsgstr \"Limpiadores del Muro Blanco\"\n\n#. Key:\tWhiteWall_EG_FirstOptionalCombat_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"After the different types of Cleaners, Golem Makers wanted to create something greater than working robots. They started to design creatures with intelligence.\"\nmsgstr \"Después de los diferentes tipos de Limpiadores, los Creadores de Golems querían crear algo más grande que los robots. Comenzaron a diseñar criaturas con inteligencia.\"\n\n#. Key:\tWhiteWall_EG_FirstOptionalCombat_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Whitewall Maintainers\"\nmsgstr \"Mantenedores del Muro Blanco\"\n\n#. Key:\tAbacus_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/Abacus.Abacus.Description\n#: /Game/SO/Items/QuestItems/Abacus.Abacus.Description\nmsgctxt \"ItemData\"\nmsgid \"When you don't have enough fingers to count something you need this abacus.\"\nmsgstr \"Cuando no tienes suficientes dedos para contar algo, necesitas este ábaco.\"\n\n#. Key:\tAbacus_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/Abacus.Abacus.Name\n#: /Game/SO/Items/QuestItems/Abacus.Abacus.Name\nmsgctxt \"ItemData\"\nmsgid \"Abacus\"\nmsgstr \"Ábaco\"\n\n#. Key:\tAbacusGhost_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/AbacusGhost.AbacusGhost.Description\n#: /Game/SO/Items/QuestItems/AbacusGhost.AbacusGhost.Description\nmsgctxt \"ItemData\"\nmsgid \"When the Abacus is killed its spirit might return to get even with its murderer.\"\nmsgstr \"Cuando se asesina un Ábaco, su espíritu podría volver para vengarse de su asesino.\"\n\n#. Key:\tAbacusGhost_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/AbacusGhost.AbacusGhost.Name\n#: /Game/SO/Items/QuestItems/AbacusGhost.AbacusGhost.Name\nmsgctxt \"ItemData\"\nmsgid \"Ghost Abacus\"\nmsgstr \"Ábaco Fantasma\"\n\n#. Key:\tAbacusGhostFlower_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/AbacusGhostFlower.AbacusGhostFlower.Description\n#: /Game/SO/Items/QuestItems/AbacusGhostFlower.AbacusGhostFlower.Description\nmsgctxt \"ItemData\"\nmsgid \"Petals of a ghost flower.\"\nmsgstr \"Pétalos de una flor fantasma.\"\n\n#. Key:\tAbacusGhostFlower_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/AbacusGhostFlower.AbacusGhostFlower.Name\n#: /Game/SO/Items/QuestItems/AbacusGhostFlower.AbacusGhostFlower.Name\nmsgctxt \"ItemData\"\nmsgid \"Ghost Petals\"\nmsgstr \"Pétalos Fantasma\"\n\n#. Key:\tAbacusSpellBook_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/AbacusSpellBook.AbacusSpellBook.Description\n#: /Game/SO/Items/QuestItems/AbacusSpellBook.AbacusSpellBook.Description\nmsgctxt \"ItemData\"\nmsgid \"An ancient paper\"\nmsgstr \"Un papel antiguo\"\n\n#. Key:\tAbacusSpellBook_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/AbacusSpellBook.AbacusSpellBook.Name\n#: /Game/SO/Items/QuestItems/AbacusSpellBook.AbacusSpellBook.Name\nmsgctxt \"ItemData\"\nmsgid \"Scroll of Surrection\"\nmsgstr \"Pergamino de Surrección\"\n\n#. Key:\tAbacusSpellBook_page_0\n#. SourceLocation:\t/Game/SO/Items/QuestItems/AbacusSpellBook.AbacusSpellBook.Pages(0).Pages\n#: /Game/SO/Items/QuestItems/AbacusSpellBook.AbacusSpellBook.Pages(0).Pages\nmsgctxt \"ItemData\"\nmsgid \"Wisy et al. [3152] point out that any entity can be banished by throwing the proper object into his/her/its face a few times, making him/her/it annoyed thus unconcerned, as long as the target entity has a face.\\r\\n\\r\\nThe proper object in case of ghosts is something Surrected [Inti and Clevi 3153], as only Surrected substance can interact with ghosts.\\r\\n\\r\\nAny object covered with petals of Ghost Flower can be Surrected using the following method:\\r\\n\\r\\n- Say \\\"Sorry my <object name>!\\\"\\r\\n- Break the object into pieces with a heated hammer\\r\\n- Say your favourite color\\r\\n- Croon \\\"La La LaLaLa LaLaLa\\\" until the object is coagulated into a single Surrected object\"\nmsgstr \"Wisy y col. [3152] señalan que cualquier entidad puede ser desterrada arrojando el objeto apropiado en su cara varias veces, haciéndolo molestar por lo tanto sin preocuparse, siempre y cuando la entidad objetivo tenga una cara. \\r\\n\\r\\nEl objeto adecuado en el caso de los fantasmas es algo Resucitado [Inti y Clevi 3153], ya que solo la sustancia Resucitado puede interactuar con los fantasmas. \\r\\n \\r\\nCualquier objeto cubierto con pétalos de la Flor Fantasma se puede resucitar utilizando el siguiente método: \\r\\n\\r\\n- Di \\\"Lo siento, mi <object name> ! \\\"\\r\\n- Rompa el objeto en pedazos con un martillo calentado\\r\\n- Diga su color favorito\\r\\n- Croon\\\" La LaLaLaLaLaLa \\\"hasta que el objeto se coagule en un solo objeto Resucitado\"\n\n#. Key:\tAbacusSpellBook_page_1\n#. SourceLocation:\t/Game/SO/Items/QuestItems/AbacusSpellBook.AbacusSpellBook.Pages(1).Pages\n#: /Game/SO/Items/QuestItems/AbacusSpellBook.AbacusSpellBook.Pages(1).Pages\nmsgctxt \"ItemData\"\nmsgid \"WARNING: not following the instructions exactly leads to failure and also increases the probability of injury and or death [Carfy 3154].\\r\\n\\r\\nREFERENCES:\\r\\n\\r\\nWISY, W., BUSY, B., WEIRDY, Y., AND LUCKY, L. 3152. The best ways to get rid of anyone potentially distracting us with questions like \\\"What do you read?\\\"\\r\\n\\r\\nInti, I., AND Clevi, C. 3153. Insulting dead ancestors using Surrected objects\\r\\n\\r\\nCarfy C. 3154. What happened to Clevi, C. and Inti, I.\"\nmsgstr \"ADVERTENCIA: no seguir las instrucciones exactamente conduce al fracaso y también aumenta la probabilidad de lesiones o muerte [Carfy 3154].\\r\\n\\r\\nREFERENCIAS:\\r\\n\\r\\nWISY, W., BUSY, B., WEIRDY, Y., Y LUCKY, L. 3152. Las mejores maneras de deshacerse de alguien que potencialmente nos distraiga con preguntas como \\\"¿Qué lees?\\\"\\r\\n\\r\\nInti, I., y Clevi, C. 3153. Insultar a los antepasados muertos con objetos Resurecidos\\r\\n\\r\\nCarfy C. 3154. Lo que le sucedió a Clevi, C. e Inti, I.\"\n\n#. Key:\tAll_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/All.All.Description\n#: /Game/SO/Items/QuestItems/All.All.Description\nmsgctxt \"ItemData\"\nmsgid \"Maybe it was a bit too much?\"\nmsgstr \"Tal vez fue un poco demasiado?\"\n\n#. Key:\tAll_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/All.All.Name\n#: /Game/SO/Items/QuestItems/All.All.Name\nmsgctxt \"ItemData\"\nmsgid \"Everything, except an Abacus\"\nmsgstr \"Todo, excepto un ábaco\"\n\n#. Key:\tArtifact_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/Artifact.Artifact.Description\n#: /Game/SO/Items/QuestItems/Artifact.Artifact.Description\nmsgctxt \"ItemData\"\nmsgid \"A very rare and powerful item which is used for opening a portal into the Unknown Realm. If you gather three and give them to the Wizard he shall set you free.\"\nmsgstr \"Un elemento muy raro y poderoso que se utiliza para abrir un portal en el Reino Desconocido. Si reúnes tres y se los das al Mago, él te liberará.\"\n\n#. Key:\tArtifact_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/Artifact.Artifact.Name\n#: /Game/SO/Items/QuestItems/Artifact.Artifact.Name\nmsgctxt \"ItemData\"\nmsgid \"Artifact\"\nmsgstr \"Artefacto\"\n\n#. Key:\tAxeMainGame_desc\n#. SourceLocation:\t/Game/SO/Items/Weapons/AxeMainGame.AxeMainGame.Description\n#. Key:\tAxe_desc\n#. SourceLocation:\t/Game/SO/Items/Weapons/Axe.Axe.Description\n#: /Game/SO/Items/Weapons/Axe.Axe.Description\n#: /Game/SO/Items/Weapons/AxeMainGame.AxeMainGame.Description\nmsgctxt \"ItemData\"\nmsgid \"Axes are usefull, but if you don't need them you can just throw them away.\"\nmsgstr \"Los Hachas son útiles, pero si no los necesita, simplemente puede tirarlos.\"\n\n#. Key:\tAxeMainGame_name\n#. SourceLocation:\t/Game/SO/Items/Weapons/AxeMainGame.AxeMainGame.Name\n#. Key:\tAxe_name\n#. SourceLocation:\t/Game/SO/Items/Weapons/Axe.Axe.Name\n#: /Game/SO/Items/Weapons/Axe.Axe.Name\n#: /Game/SO/Items/Weapons/AxeMainGame.AxeMainGame.Name\nmsgctxt \"ItemData\"\nmsgid \"Axes\"\nmsgstr \"Hachas\"\n\n#. Key:\tBlueCrystal_desc\n#. SourceLocation:\t/Game/SO/Items/Valuable/BlueCrystal.BlueCrystal.Description\n#: /Game/SO/Items/Valuable/BlueCrystal.BlueCrystal.Description\nmsgctxt \"ItemData\"\nmsgid \"An ancient crystal people like to buy.\"\nmsgstr \"Una cristal antigua que a la gente le gusta comprar.\"\n\n#. Key:\tBlueCrystal_name\n#. SourceLocation:\t/Game/SO/Items/Valuable/BlueCrystal.BlueCrystal.Name\n#: /Game/SO/Items/Valuable/BlueCrystal.BlueCrystal.Name\nmsgctxt \"ItemData\"\nmsgid \"Blue Crystal\"\nmsgstr \"Cristal Azul\"\n\n#. Key:\tBlueGem_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/BlueGem.BlueGem.Description\n#: /Game/SO/Items/QuestItems/BlueGem.BlueGem.Description\nmsgctxt \"ItemData\"\nmsgid \"A small precious blue stone.\"\nmsgstr \"Una pequeña piedra preciosa azul.\"\n\n#. Key:\tBlueGem_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/BlueGem.BlueGem.Name\n#: /Game/SO/Items/QuestItems/BlueGem.BlueGem.Name\nmsgctxt \"ItemData\"\nmsgid \"Blue Gem\"\nmsgstr \"Gema Azul\"\n\n#. Key:\tDemonSword_desc\n#. SourceLocation:\t/Game/SO/Items/Weapons/DemonSword.DemonSword.Description\n#: /Game/SO/Items/Weapons/DemonSword.DemonSword.Description\nmsgctxt \"ItemData\"\nmsgid \"The mighty sword of Kharutar the Demon Ruler. Legend says he once cut one of his fingers with it and in his rage he broke the sword into two. Later it was reforged but some say it would still need some more fixes.\"\nmsgstr \"La poderosa espada de Kharutar el Gobernantes de los Demonios. La leyenda dice que una vez se cortó uno de sus dedos con él y en su ira rompió la espada en dos. Más tarde se reformó, pero algunos dicen que aún necesitaría más arreglos.\"\n\n#. Key:\tDemonSword_name\n#. SourceLocation:\t/Game/SO/Items/Weapons/DemonSword.DemonSword.Name\n#: /Game/SO/Items/Weapons/DemonSword.DemonSword.Name\nmsgctxt \"ItemData\"\nmsgid \"Demon Sword\"\nmsgstr \"Espada del Demonio\"\n\n#. Key:\tDOKitchenKey_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/DOKitchenKey.DOKitchenKey.Description\n#: /Game/SO/Items/Keys/DOKitchenKey.DOKitchenKey.Description\nmsgctxt \"ItemData\"\nmsgid \"This is one of the many spare keys of the Dwarven Outpost Kitchen. Being able to get into the kitchen was always very important for dwarves.\"\nmsgstr \"Esta es una de las muchas llaves de repuesto del Puesto Avanzado de la Cocina de los Enanos. Poder entrar a la cocina siempre fue muy importante para los enanos.\"\n\n#. Key:\tDOKitchenKey_name\n#. SourceLocation:\t/Game/SO/Items/Keys/DOKitchenKey.DOKitchenKey.Name\n#: /Game/SO/Items/Keys/DOKitchenKey.DOKitchenKey.Name\nmsgctxt \"ItemData\"\nmsgid \"Kitchen Key\"\nmsgstr \"Llave de la Cocina\"\n\n#. Key:\tDualBlade_desc\n#. SourceLocation:\t/Game/SO/Items/Weapons/DualBlade.DualBlade.Description\n#: /Game/SO/Items/Weapons/DualBlade.DualBlade.Description\nmsgctxt \"ItemData\"\nmsgid \"In case of trouble, it's better to have double.\"\nmsgstr \"En caso de problemas, es mejor tener el doble.\"\n\n#. Key:\tDualBlade_name\n#. SourceLocation:\t/Game/SO/Items/Weapons/DualBlade.DualBlade.Name\n#: /Game/SO/Items/Weapons/DualBlade.DualBlade.Name\nmsgctxt \"ItemData\"\nmsgid \"Double Sword\"\nmsgstr \"Espada Doble\"\n\n#. Key:\tElevatorGem_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/ElevatorGem.ElevatorGem.Description\n#: /Game/SO/Items/QuestItems/ElevatorGem.ElevatorGem.Description\nmsgctxt \"ItemData\"\nmsgid \"A shiny green crystal which activates a weight lifting mechanism. At least by the look of it.\"\nmsgstr \"Un cristal verde brillante que activa un mecanismo de levantamiento de pesas. Al menos por lo que parece.\"\n\n#. Key:\tElevatorGem_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/ElevatorGem.ElevatorGem.Name\n#: /Game/SO/Items/QuestItems/ElevatorGem.ElevatorGem.Name\nmsgctxt \"ItemData\"\nmsgid \"Elevator Gem\"\nmsgstr \"Gema del Ascensor\"\n\n#. Key:\tElevatorLeverCrystal_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/ElevatorLeverCrystal.ElevatorLeverCrystal.Description\n#: /Game/SO/Items/QuestItems/ElevatorLeverCrystal.ElevatorLeverCrystal.Description\nmsgctxt \"ItemData\"\nmsgid \"You got this item for free from a Merchant so you hardly believe it has any value. It might be used as some sort of a mechanism activator though. Hopefully not for a trap.\"\nmsgstr \"Obtuvo este artículo de forma gratuita de un comerciante, por lo que apenas cree que tenga algún valor. Sin embargo, podría usarse como una especie de mecanismo activador. Ojalá no sea para una trampa.\"\n\n#. Key:\tElevatorLeverCrystal_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/ElevatorLeverCrystal.ElevatorLeverCrystal.Name\n#: /Game/SO/Items/QuestItems/ElevatorLeverCrystal.ElevatorLeverCrystal.Name\nmsgctxt \"ItemData\"\nmsgid \"Elevator Crystal\"\nmsgstr \"Cristal de Ascensor\"\n\n#. Key:\tFountainFlower_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/FountainFlower.FountainFlower.Description\n#: /Game/SO/Items/QuestItems/FountainFlower.FountainFlower.Description\nmsgctxt \"ItemData\"\nmsgid \"Flower acquired from a fountain.\"\nmsgstr \"Flor adquirida de una fuente.\"\n\n#. Key:\tFountainFlower_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/FountainFlower.FountainFlower.Name\n#: /Game/SO/Items/QuestItems/FountainFlower.FountainFlower.Name\nmsgctxt \"ItemData\"\nmsgid \"Fountain Flower\"\nmsgstr \"Flor de la Fuente\"\n\n#. Key:\tGateKeeperSeat_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/GateKeeperSeat.GateKeeperSeat.Description\n#: /Game/SO/Items/QuestItems/GateKeeperSeat.GateKeeperSeat.Description\nmsgctxt \"ItemData\"\nmsgid \"A simple seat of size XXXXXXXXXL\"\nmsgstr \"Un asiento sencillo de tamaño XXXXXXXXXL\"\n\n#. Key:\tGateKeeperSeat_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/GateKeeperSeat.GateKeeperSeat.Name\n#: /Game/SO/Items/QuestItems/GateKeeperSeat.GateKeeperSeat.Name\nmsgctxt \"ItemData\"\nmsgid \"Giant Seat\"\nmsgstr \"Asiento Gigante\"\n\n#. Key:\tKeyAADoorNearDungeonExit_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyAADoorNearDungeonExit.KeyAADoorNearDungeonExit.Description\n#: /Game/SO/Items/Keys/KeyAADoorNearDungeonExit.KeyAADoorNearDungeonExit.Description\nmsgctxt \"ItemData\"\nmsgid \"A key without a proper item description\"\nmsgstr \"Una llave sin una descripción adecuada\"\n\n#. Key:\tKeyAADoorNearDungeonExit_name\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyAADoorNearDungeonExit.KeyAADoorNearDungeonExit.Name\n#: /Game/SO/Items/Keys/KeyAADoorNearDungeonExit.KeyAADoorNearDungeonExit.Name\nmsgctxt \"ItemData\"\nmsgid \"Arcade Key\"\nmsgstr \"Llave del Arcade\"\n\n#. Key:\tKeyAAFirstFight_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyAAFirstFight.KeyAAFirstFight.Description\n#: /Game/SO/Items/Keys/KeyAAFirstFight.KeyAAFirstFight.Description\nmsgctxt \"ItemData\"\nmsgid \"Weird\"\nmsgstr \"Extraño\"\n\n#. Key:\tKeyAAFirstFight_name\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyAAFirstFight.KeyAAFirstFight.Name\n#: /Game/SO/Items/Keys/KeyAAFirstFight.KeyAAFirstFight.Name\nmsgctxt \"ItemData\"\nmsgid \"Weird Key\"\nmsgstr \"Llave Extraña\"\n\n#. Key:\tKeyAAMainFirstDoor_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyAAMainFirstDoor.KeyAAMainFirstDoor.Description\n#: /Game/SO/Items/Keys/KeyAAMainFirstDoor.KeyAAMainFirstDoor.Description\nmsgctxt \"ItemData\"\nmsgid \"Sometimes the lock is harder to find than the key.\"\nmsgstr \"A veces, la cerradura es más difícil de encontrar que la llave.\"\n\n#. Key:\tKeyAAMainFirstDoor_name\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyAAMainFirstDoor.KeyAAMainFirstDoor.Name\n#: /Game/SO/Items/Keys/KeyAAMainFirstDoor.KeyAAMainFirstDoor.Name\nmsgctxt \"ItemData\"\nmsgid \"Key of Something\"\nmsgstr \"Llave de algo\"\n\n#. Key:\tKeyAGPortalFight_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyAGPortalFight.KeyAGPortalFight.Description\n#: /Game/SO/Items/Keys/KeyAGPortalFight.KeyAGPortalFight.Description\nmsgctxt \"ItemData\"\nmsgid \"Just another key.\"\nmsgstr \"Solo otra llave.\"\n\n#. Key:\tKeyAGPortalFight_name\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyAGPortalFight.KeyAGPortalFight.Name\n#: /Game/SO/Items/Keys/KeyAGPortalFight.KeyAGPortalFight.Name\nmsgctxt \"ItemData\"\nmsgid \"Eastern Key\"\nmsgstr \"Llave del Este\"\n\n#. Key:\tKeyBronze_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyBronze.KeyBronze.Description\n#: /Game/SO/Items/Keys/KeyBronze.KeyBronze.Description\nmsgctxt \"ItemData\"\nmsgid \"A reforged Bronze Key.\"\nmsgstr \"Una Llave de Bronce reformada.\"\n\n#. Key:\tKeyBronze_name\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyBronze.KeyBronze.Name\n#: /Game/SO/Items/Keys/KeyBronze.KeyBronze.Name\nmsgctxt \"ItemData\"\nmsgid \"Bronze Key\"\nmsgstr \"Llave de Bronce\"\n\n#. Key:\tKeyCatacombs0_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyCatacombs0.KeyCatacombs0.Description\n#: /Game/SO/Items/Keys/KeyCatacombs0.KeyCatacombs0.Description\nmsgctxt \"ItemData\"\nmsgid \"There are a ridiculous amount of keys in this world, right?\"\nmsgstr \"Hay una cantidad ridícula de llaves en este mundo, ¿verdad?\"\n\n#. Key:\tKeyCatacombs0_name\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyCatacombs0.KeyCatacombs0.Name\n#: /Game/SO/Items/Keys/KeyCatacombs0.KeyCatacombs0.Name\nmsgctxt \"ItemData\"\nmsgid \"Key Of The Room Below\"\nmsgstr \"Llave de la Habitación de Abajo\"\n\n#. Key:\tKeyCopper_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyCopper.KeyCopper.Description\n#: /Game/SO/Items/Keys/KeyCopper.KeyCopper.Description\nmsgctxt \"ItemData\"\nmsgid \"A reforged Copper Key.\"\nmsgstr \"Una Llave de Cobre reformada.\"\n\n#. Key:\tKeyCopper_name\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyCopper.KeyCopper.Name\n#: /Game/SO/Items/Keys/KeyCopper.KeyCopper.Name\nmsgctxt \"ItemData\"\nmsgid \"Copper Key\"\nmsgstr \"Llave de Cobre\"\n\n#. Key:\tKeyDCMainOut_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyDCMainOut.KeyDCMainOut.Description\n#: /Game/SO/Items/Keys/KeyDCMainOut.KeyDCMainOut.Description\nmsgctxt \"ItemData\"\nmsgid \"Just an old, rusty iron key without a proper item description\"\nmsgstr \"Solo una vieja y oxidada llave de hierro sin una descripción adecuada del objeto\"\n\n#. Key:\tKeyDCMainOut_name\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyDCMainOut.KeyDCMainOut.Name\n#: /Game/SO/Items/Keys/KeyDCMainOut.KeyDCMainOut.Name\nmsgctxt \"ItemData\"\nmsgid \"Catacomb Key\"\nmsgstr \"Llave de las CatacumbaS\"\n\n#. Key:\tKeyIron_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyIron.KeyIron.Description\n#: /Game/SO/Items/Keys/KeyIron.KeyIron.Description\nmsgctxt \"ItemData\"\nmsgid \"A reforged Iron Key.\"\nmsgstr \"Una llave de Hierro reformada.\"\n\n#. Key:\tKeyIron_name\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyIron.KeyIron.Name\n#: /Game/SO/Items/Keys/KeyIron.KeyIron.Name\nmsgctxt \"ItemData\"\nmsgid \"Iron Key\"\nmsgstr \"Llave de Hierro\"\n\n#. Key:\tKeyMaster_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyMaster.KeyMaster.Description\n#: /Game/SO/Items/Keys/KeyMaster.KeyMaster.Description\nmsgctxt \"ItemData\"\nmsgid \"This key can be used to open any door equipped with a special kind of lock, but breaks during the process.\"\nmsgstr \"Esta llave se puede usar para abrir cualquier puerta equipada con una cerradura especial, pero se rompe durante el proceso.\"\n\n#. Key:\tKeyMaster_name\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyMaster.KeyMaster.Name\n#: /Game/SO/Items/Keys/KeyMaster.KeyMaster.Name\nmsgctxt \"ItemData\"\nmsgid \"Master Key\"\nmsgstr \"Llave Maestra\"\n\n#. Key:\tKeyMerchant_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyMerchant.KeyMerchant.Description\n#: /Game/SO/Items/Keys/KeyMerchant.KeyMerchant.Description\nmsgctxt \"ItemData\"\nmsgid \"Does it really work? You will find out soon...\"\nmsgstr \"¿Realmente funciona? Lo vas a descubrir muy pronto...\"\n\n#. Key:\tKeyMerchant_name\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyMerchant.KeyMerchant.Name\n#: /Game/SO/Items/Keys/KeyMerchant.KeyMerchant.Name\nmsgctxt \"ItemData\"\nmsgid \"A very small key\"\nmsgstr \"Una llave muy pequeña\"\n\n#. Key:\tKeyOutpostWall_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyOutpostWall.KeyOutpostWall.Description\n#: /Game/SO/Items/Keys/KeyOutpostWall.KeyOutpostWall.Description\nmsgctxt \"ItemData\"\nmsgid \"Do you really read the key descriptions?\"\nmsgstr \"¿Realmente lees las descripciones de las llaves?\"\n\n#. Key:\tKeyOutpostWall_name\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyOutpostWall.KeyOutpostWall.Name\n#: /Game/SO/Items/Keys/KeyOutpostWall.KeyOutpostWall.Name\nmsgctxt \"ItemData\"\nmsgid \"Key Of The Outpost Wall\"\nmsgstr \"Llave del Muro del Avanzado\"\n\n#. Key:\tKeyOutpostWallOptional_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyOutpostWallOptional.KeyOutpostWallOptional.Description\n#: /Game/SO/Items/Keys/KeyOutpostWallOptional.KeyOutpostWallOptional.Description\nmsgctxt \"ItemData\"\nmsgid \"I would rather sleep, but the item descriptions won't write themselves.\"\nmsgstr \"Preferiría dormir, pero las descripciones de los objetos no se escribirán por sí solas.\"\n\n#. Key:\tKeyOutpostWallOptional_name\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyOutpostWallOptional.KeyOutpostWallOptional.Name\n#: /Game/SO/Items/Keys/KeyOutpostWallOptional.KeyOutpostWallOptional.Name\nmsgctxt \"ItemData\"\nmsgid \"Second Key Of The Outpost Wall\"\nmsgstr \"Segunda Llave del Muro del Avanzado\"\n\n#. Key:\tKeyPiecesBronze0_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyPiecesBronze0.KeyPiecesBronze0.Description\n#: /Game/SO/Items/Keys/KeyPiecesBronze0.KeyPiecesBronze0.Description\nmsgctxt \"ItemData\"\nmsgid \"Half of a broken Bronze Key\"\nmsgstr \"La mitad de una Llave de Bronce Rota\"\n\n#. Key:\tKeyPiecesBronze0_name\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyPiecesBronze0.KeyPiecesBronze0.Name\n#: /Game/SO/Items/Keys/KeyPiecesBronze0.KeyPiecesBronze0.Name\nmsgctxt \"ItemData\"\nmsgid \"Half Bronze Key\"\nmsgstr \"Media Llave de Bronce\"\n\n#. Key:\tKeyPiecesCopper0_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyPiecesCopper0.KeyPiecesCopper0.Description\n#: /Game/SO/Items/Keys/KeyPiecesCopper0.KeyPiecesCopper0.Description\nmsgctxt \"ItemData\"\nmsgid \"Half of a broken Copper Key\"\nmsgstr \"La mitad de una Llave de Cobre Rota\"\n\n#. Key:\tKeyPiecesCopper0_name\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyPiecesCopper0.KeyPiecesCopper0.Name\n#: /Game/SO/Items/Keys/KeyPiecesCopper0.KeyPiecesCopper0.Name\nmsgctxt \"ItemData\"\nmsgid \"Half Copper Key\"\nmsgstr \"Media Llave de Cobre\"\n\n#. Key:\tKeyPiecesIron0_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyPiecesIron0.KeyPiecesIron0.Description\n#: /Game/SO/Items/Keys/KeyPiecesIron0.KeyPiecesIron0.Description\nmsgctxt \"ItemData\"\nmsgid \"Half of a broken Iron Key\"\nmsgstr \"La mitad de una Llave de Hierro Rota\"\n\n#. Key:\tKeyPiecesIron0_name\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyPiecesIron0.KeyPiecesIron0.Name\n#: /Game/SO/Items/Keys/KeyPiecesIron0.KeyPiecesIron0.Name\nmsgctxt \"ItemData\"\nmsgid \"Half Iron Key\"\nmsgstr \"Media Llave de Hierro\"\n\n#. Key:\tKeySA_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/KeySA.KeySA.Description\n#: /Game/SO/Items/Keys/KeySA.KeySA.Description\nmsgctxt \"ItemData\"\nmsgid \"Looks like there are tons of these\"\nmsgstr \"Parece que hay toneladas de estos\"\n\n#. Key:\tKeySA_name\n#. SourceLocation:\t/Game/SO/Items/Keys/KeySA.KeySA.Name\n#: /Game/SO/Items/Keys/KeySA.KeySA.Name\nmsgctxt \"ItemData\"\nmsgid \"Another Key\"\nmsgstr \"Otra Llave\"\n\n#. Key:\tKeySASewerCreatureCell_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/KeySASewerCreatureCell.KeySASewerCreatureCell.Description\n#: /Game/SO/Items/Keys/KeySASewerCreatureCell.KeySASewerCreatureCell.Description\nmsgctxt \"ItemData\"\nmsgid \"A small key you got from the Pipe Walkers.\"\nmsgstr \"Una pequeña llave que obtuviste de los Trotadesagües.\"\n\n#. Key:\tKeyTLElevatorRoom_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyTLElevatorRoom.KeyTLElevatorRoom.Description\n#: /Game/SO/Items/Keys/KeyTLElevatorRoom.KeyTLElevatorRoom.Description\nmsgctxt \"ItemData\"\nmsgid \"A key without any sign of interest.\"\nmsgstr \"Una llave sin ningún signo de interés.\"\n\n#. Key:\tKeyTLElevatorRoom_name\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyTLElevatorRoom.KeyTLElevatorRoom.Name\n#: /Game/SO/Items/Keys/KeyTLElevatorRoom.KeyTLElevatorRoom.Name\nmsgctxt \"ItemData\"\nmsgid \"Unconcerned Key\"\nmsgstr \"Llave Despreocupada\"\n\n#. Key:\tKeyWWFirstGate_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyWWFirstGate.KeyWWFirstGate.Description\n#: /Game/SO/Items/Keys/KeyWWFirstGate.KeyWWFirstGate.Description\nmsgctxt \"ItemData\"\nmsgid \"It will open a gate somewhere. Probably.\"\nmsgstr \"Se abrirá una puerta en alguna parte. Probablemente.\"\n\n#. Key:\tKeyWWFirstGate_name\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyWWFirstGate.KeyWWFirstGate.Name\n#: /Game/SO/Items/Keys/KeyWWFirstGate.KeyWWFirstGate.Name\nmsgctxt \"ItemData\"\nmsgid \"Railway Gate Key\"\nmsgstr \"Llave de la Puerta del Ferrocarril\"\n\n#. Key:\tKeyWWPortal_desc\n#. SourceLocation:\t/Game/SO/Items/WhiteWallItems/KeyWWPortal.KeyWWPortal.Description\n#: /Game/SO/Items/WhiteWallItems/KeyWWPortal.KeyWWPortal.Description\nmsgctxt \"ItemData\"\nmsgid \"A fancy iron key with a shiny gem in its grip. It must be really precious.\"\nmsgstr \"Una elegante llave de hierro con una gema brillante en su agarre. Debe ser realmente precioso.\"\n\n#. Key:\tKeyWWPortal_name\n#. SourceLocation:\t/Game/SO/Items/WhiteWallItems/KeyWWPortal.KeyWWPortal.Name\n#: /Game/SO/Items/WhiteWallItems/KeyWWPortal.KeyWWPortal.Name\nmsgctxt \"ItemData\"\nmsgid \"Portal Key\"\nmsgstr \"Llave del Portal\"\n\n#. Key:\tKEYWWSewerCreatureCell_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/KEYWWSewerCreatureCell.KEYWWSewerCreatureCell.Description\n#: /Game/SO/Items/Keys/KEYWWSewerCreatureCell.KEYWWSewerCreatureCell.Description\nmsgctxt \"ItemData\"\nmsgid \"A small key you got from a chest in the middle of nowhere.\"\nmsgstr \"Una pequeña llave que obtuviste de un cofre en medio de la nada.\"\n\n#. Key:\tKEYWWSewerCreatureCell_name\n#. SourceLocation:\t/Game/SO/Items/Keys/KEYWWSewerCreatureCell.KEYWWSewerCreatureCell.Name\n#. Key:\tKeySASewerCreatureCell_name\n#. SourceLocation:\t/Game/SO/Items/Keys/KeySASewerCreatureCell.KeySASewerCreatureCell.Name\n#: /Game/SO/Items/Keys/KeySASewerCreatureCell.KeySASewerCreatureCell.Name\n#: /Game/SO/Items/Keys/KEYWWSewerCreatureCell.KEYWWSewerCreatureCell.Name\nmsgctxt \"ItemData\"\nmsgid \"Small Cell Key\"\nmsgstr \"Llave de la Celda Pequeña\"\n\n#. Key:\tKeyWWWhiteWall_desc\n#. SourceLocation:\t/Game/SO/Items/WhiteWallItems/KeyWWWhiteWall.KeyWWWhiteWall.Description\n#: /Game/SO/Items/WhiteWallItems/KeyWWWhiteWall.KeyWWWhiteWall.Description\nmsgctxt \"ItemData\"\nmsgid \"A robust iron key with a carved script: <Bold>'Outer Wall Tower'</>.\"\nmsgstr \"Una llave robusta de hierro con un guión tallado: <Bold>\\\"Torre del Muro Exterior\\\"</> .\"\n\n#. Key:\tKeyWWWhiteWall_name\n#. SourceLocation:\t/Game/SO/Items/WhiteWallItems/KeyWWWhiteWall.KeyWWWhiteWall.Name\n#: /Game/SO/Items/WhiteWallItems/KeyWWWhiteWall.KeyWWWhiteWall.Name\nmsgctxt \"ItemData\"\nmsgid \"White Wall Key\"\nmsgstr \"Llave del Muro Blanco\"\n\n#. Key:\tKoboldCoin_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/KoboldCoin.KoboldCoin.Description\n#: /Game/SO/Items/QuestItems/KoboldCoin.KoboldCoin.Description\nmsgctxt \"ItemData\"\nmsgid \"Some Coins you found in a chest.\"\nmsgstr \"Algunas monedas que encontraste en un cofre.\"\n\n#. Key:\tKoboldCoin_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/KoboldCoin.KoboldCoin.Name\n#: /Game/SO/Items/QuestItems/KoboldCoin.KoboldCoin.Name\nmsgctxt \"ItemData\"\nmsgid \"Kobold Coins\"\nmsgstr \"Monedas Kobold\"\n\n#. Key:\tKoboldPotion_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/KoboldPotion.KoboldPotion.Description\n#: /Game/SO/Items/QuestItems/KoboldPotion.KoboldPotion.Description\nmsgctxt \"ItemData\"\nmsgid \"Weird liquid in a bottle. The kobold calls it Soup.\"\nmsgstr \"Líquido extraño en una botella. El kobold lo llama sopa.\"\n\n#. Key:\tKoboldPotion_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/KoboldPotion.KoboldPotion.Name\n#: /Game/SO/Items/QuestItems/KoboldPotion.KoboldPotion.Name\nmsgctxt \"ItemData\"\nmsgid \"Kobold Soup\"\nmsgstr \"Sopa Kobold\"\n\n#. Key:\tLavaGolemToken_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/LavaGolemToken.LavaGolemToken.Description\n#: /Game/SO/Items/QuestItems/LavaGolemToken.LavaGolemToken.Description\nmsgctxt \"ItemData\"\nmsgid \"A unique stone you can use to prove that you have eliminated a golem.\"\nmsgstr \"Una piedra única que puedes usar para demostrar que has eliminado a un golem.\"\n\n#. Key:\tLavaGolemToken_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/LavaGolemToken.LavaGolemToken.Name\n#: /Game/SO/Items/QuestItems/LavaGolemToken.LavaGolemToken.Name\nmsgctxt \"ItemData\"\nmsgid \"Stone Token\"\nmsgstr \"Token de Piedra\"\n\n#. Key:\tLeafMace_desc\n#. SourceLocation:\t/Game/SO/Items/Weapons/LeafMace.LeafMace.Description\n#: /Game/SO/Items/Weapons/LeafMace.LeafMace.Description\nmsgctxt \"ItemData\"\nmsgid \"If someone would fail in cutting his/her/its way out of a hard situation, crushing your way through can still work out pretty well - it is said to be more effective if golems or certain mechanical devices / creatures are involved in the conflict.\"\nmsgstr \"Si alguien no lograra salir de una situación difícil, aplastando puede funcionar bastante bien; se dice que es más efectivo si los golems o ciertos aparatos / criaturas mecánicas están involucrados en el conflicto.\"\n\n#. Key:\tLeafMace_name\n#. SourceLocation:\t/Game/SO/Items/Weapons/LeafMace.LeafMace.Name\n#: /Game/SO/Items/Weapons/LeafMace.LeafMace.Name\nmsgctxt \"ItemData\"\nmsgid \"Leaf Mace\"\nmsgstr \"Mazo de Hojas\"\n\n#. Key:\tLEKeyCage_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/LEKeyCage.LEKeyCage.Description\n#: /Game/SO/Items/Keys/LEKeyCage.LEKeyCage.Description\nmsgctxt \"ItemData\"\nmsgid \"You won't believe it but it is a key for a cage.\"\nmsgstr \"No lo creerás, pero es una llave para una jaula.\"\n\n#. Key:\tLEKeyCage_name\n#. SourceLocation:\t/Game/SO/Items/Keys/LEKeyCage.LEKeyCage.Name\n#: /Game/SO/Items/Keys/LEKeyCage.LEKeyCage.Name\nmsgctxt \"ItemData\"\nmsgid \"Cage Key\"\nmsgstr \"Llave de una Jaula\"\n\n#. Key:\tLETempleKey_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/LETempleKey.LETempleKey.Description\n#: /Game/SO/Items/Keys/LETempleKey.LETempleKey.Description\nmsgctxt \"ItemData\"\nmsgid \"This is one of the spare keys of the Ancient Temple. Just in case the original would be dropped into the lava accidentally.\"\nmsgstr \"Esta es una de las llaves de repuesto del Templo Antiguo. En caso de que el original se caiga accidentalmente en la lava.\"\n\n#. Key:\tLETempleKey_name\n#. SourceLocation:\t/Game/SO/Items/Keys/LETempleKey.LETempleKey.Name\n#: /Game/SO/Items/Keys/LETempleKey.LETempleKey.Name\nmsgctxt \"ItemData\"\nmsgid \"Ancient Temple Key\"\nmsgstr \"Llave del Antiguo Templo\"\n\n#. Key:\tLoryBooks_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/LoryBooks.LoryBooks.Description\n#: /Game/SO/Items/QuestItems/LoryBooks.LoryBooks.Description\nmsgctxt \"ItemData\"\nmsgid \"Two ancient books with the titles \\\"True value of your family\\\" and \\\"How much does a brother cost?\\\". They look boring so you decide not to open them.\"\nmsgstr \"Dos libros antiguos con los títulos \\\"El verdadero valor de su familia\\\" y \\\"¿Cuánto cuesta un hermano?\\\". Parecen aburridos, así que decides no abrirlos.\"\n\n#. Key:\tLoryBooks_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/LoryBooks.LoryBooks.Name\n#: /Game/SO/Items/QuestItems/LoryBooks.LoryBooks.Name\nmsgctxt \"ItemData\"\nmsgid \"Old books\"\nmsgstr \"Libros viejos\"\n\n#. Key:\tMemoryCrystal1_desc\n#. SourceLocation:\t/Game/SO/Items/MemoryStone/MemoryCrystal1.MemoryCrystal1.Description\n#: /Game/SO/Items/MemoryStone/MemoryCrystal1.MemoryCrystal1.Description\nmsgctxt \"ItemData\"\nmsgid \"'According to the very few survivors, White Tower, our capital was completely destroyed by a magical phenomena called Ruin. At that time I was at Grey Gate so I can't tell anything for sure.'\\r\\n\\r\\nThe Last Sane Golem Maker, A.C. 16. September 4.\"\nmsgstr \"\\\"Según los pocos sobrevivientes, Torre Blanca, nuestra capital fue completamente destruida por un fenómeno mágico llamado Ruin. En ese momento estaba en la Puerta Gris, así que no puedo decir nada con seguridad.\\\"\\r\\n\\r\\nEl Ultimo Creador de Golems con Cordura, A.C.16. 4 de septiembre.\"\n\n#. Key:\tMemoryCrystal1_name\n#. SourceLocation:\t/Game/SO/Items/MemoryStone/MemoryCrystal1.MemoryCrystal1.Name\n#: /Game/SO/Items/MemoryStone/MemoryCrystal1.MemoryCrystal1.Name\nmsgctxt \"ItemData\"\nmsgid \"Magical Phenomena\"\nmsgstr \"Fenómenos Mágicos\"\n\n#. Key:\tMemoryCrystal2_desc\n#. SourceLocation:\t/Game/SO/Items/MemoryStone/MemoryCrystal2.MemoryCrystal2.Description\n#: /Game/SO/Items/MemoryStone/MemoryCrystal2.MemoryCrystal2.Description\nmsgctxt \"ItemData\"\nmsgid \"'Those who escaped Ruin have... changed.'\\r\\n'I've met a scientist who noticed how madness takes control over him. Perhaps he can find a solution.'\\r\\n\\r\\nThe Last Sane Golem Maker, A.C. 17. January 1.\"\nmsgstr \"\\\"Los que escaparon de Ruin han... cambiado.\\\"\\r\\n'Conocí a un científico que notó cómo la locura toma el control sobre él. Quizás pueda encontrar una solución.\\r\\n\\r\\nEl Ultimo Creador de Golems con Cordura A.C.17. 1 de enero.\"\n\n#. Key:\tMemoryCrystal2_name\n#. SourceLocation:\t/Game/SO/Items/MemoryStone/MemoryCrystal2.MemoryCrystal2.Name\n#: /Game/SO/Items/MemoryStone/MemoryCrystal2.MemoryCrystal2.Name\nmsgctxt \"ItemData\"\nmsgid \"Degeneration and mutation\"\nmsgstr \"Degeneración y mutación\"\n\n#. Key:\tMemoryCrystal3_desc\n#. SourceLocation:\t/Game/SO/Items/MemoryStone/MemoryCrystal3.MemoryCrystal3.Description\n#: /Game/SO/Items/MemoryStone/MemoryCrystal3.MemoryCrystal3.Description\nmsgctxt \"ItemData\"\nmsgid \"'It's hard to tell but I think colours are fading away. The World was brighter before.'\\r\\n'The Monk won't help me. He stubbornly believes we are doomed.'\\r\\n\\r\\nThe Last Sane Golem Maker, A.C. 17. March 11.\"\nmsgstr \"'Es difícil saberlo, pero creo que los colores se están desvaneciendo. El mundo era más brillante antes.\\r\\nEl monje no me ayudará. Cree Obstinadamente que estamos condenados.\\r\\n\\r\\nEl Ultimo Creador de Golems con Cordura, A.C.17. 11 de marzo.\"\n\n#. Key:\tMemoryCrystal3_name\n#. SourceLocation:\t/Game/SO/Items/MemoryStone/MemoryCrystal3.MemoryCrystal3.Name\n#: /Game/SO/Items/MemoryStone/MemoryCrystal3.MemoryCrystal3.Name\nmsgctxt \"ItemData\"\nmsgid \"Fading Colours\"\nmsgstr \"Colores desvaneciendo\"\n\n#. Key:\tMemoryCrystal4_desc\n#. SourceLocation:\t/Game/SO/Items/MemoryStone/MemoryCrystal4.MemoryCrystal4.Description\n#: /Game/SO/Items/MemoryStone/MemoryCrystal4.MemoryCrystal4.Description\nmsgctxt \"ItemData\"\nmsgid \"'Madness takes control over those who get too close to Ruin.'\\r\\n'Maintainers forgot to speak. I understand some of the phrases they try to say: \\\"Dinner is served\\\", \\\"At your service\\\", \\\"Your order\\\" - a mockery of their former intelligence!'\\r\\n\\r\\nThe Last Sane Golem Maker, A.C. 21. January 26.\"\nmsgstr \"\\\"La locura toma el control de aquellos que se acercan demasiado a Ruin\\\".\\r\\nLos mantenedores olvidaron hablar. Entiendo algunas de las frases que intentan decir: \\\"La cena está servida\\\", \\\"A su servicio\\\", \\\"Su pedido\\\", ¡un chiste en comparación de su inteligencia antes de Ruin!\\r\\n\\r\\nEl Ultimo Creador de Golems con Cordura, A.C.21 de enero. 26.\"\n\n#. Key:\tMemoryCrystal4_name\n#. SourceLocation:\t/Game/SO/Items/MemoryStone/MemoryCrystal4.MemoryCrystal4.Name\n#: /Game/SO/Items/MemoryStone/MemoryCrystal4.MemoryCrystal4.Name\nmsgctxt \"ItemData\"\nmsgid \"Madness\"\nmsgstr \"Locura\"\n\n#. Key:\tMemoryCrystal5_desc\n#. SourceLocation:\t/Game/SO/Items/MemoryStone/MemoryCrystal5.MemoryCrystal5.Description\n#: /Game/SO/Items/MemoryStone/MemoryCrystal5.MemoryCrystal5.Description\nmsgctxt \"ItemData\"\nmsgid \"'Now I have seen it with my own eyes: the touch of the Ruin makes the World literally fall apart.'\\r\\n\\r\\nThe Last Sane Golem Maker, A.C. 25. September 4.\"\nmsgstr \"\\\"Ahora lo he visto con mis propios ojos: el toque de Ruin hace que el mundo literalmente se desmorone\\\".\\r\\n\\r\\nEl Ultimo Creador de Golems con Cordura, 25 a. C. 4 de septiembre.\"\n\n#. Key:\tMemoryCrystal5_name\n#. SourceLocation:\t/Game/SO/Items/MemoryStone/MemoryCrystal5.MemoryCrystal5.Name\n#: /Game/SO/Items/MemoryStone/MemoryCrystal5.MemoryCrystal5.Name\nmsgctxt \"ItemData\"\nmsgid \"Falling Apart\"\nmsgstr \"Despedazándose\"\n\n#. Key:\tMemoryCrystal6_desc\n#. SourceLocation:\t/Game/SO/Items/MemoryStone/MemoryCrystal6.MemoryCrystal6.Description\n#: /Game/SO/Items/MemoryStone/MemoryCrystal6.MemoryCrystal6.Description\nmsgctxt \"ItemData\"\nmsgid \"'This is my 87 birthday. It's obvious that my body doesn't get older with time. How long can I preserve my sanity?'\\r\\n'Drones can no longer be trusted. They resisted Ruin for the longest.'\\r\\n\\r\\nThe Last Sane Golem Maker, A.C. 52. July 9.\"\nmsgstr \"\\\"Este es mi 87ºcumpleaños. Es obvio que mi cuerpo no envejece con el tiempo. ¿Cuánto tiempo puedo preservar mi cordura?\\r\\nYa no se puede confiar en los drones. Se resistieron a Ruin mucho tiempo.\\r\\n\\r\\nEl Ultimo Creador de Golems con Cordura, A.C.52. 9 de julio.\"\n\n#. Key:\tMemoryCrystal6_name\n#. SourceLocation:\t/Game/SO/Items/MemoryStone/MemoryCrystal6.MemoryCrystal6.Name\n#: /Game/SO/Items/MemoryStone/MemoryCrystal6.MemoryCrystal6.Name\nmsgctxt \"ItemData\"\nmsgid \"Preservation of Ruin\"\nmsgstr \"Preservación de Ruin\"\n\n#. Key:\tMemoryCrystal7_desc\n#. SourceLocation:\t/Game/SO/Items/MemoryStone/MemoryCrystal7.MemoryCrystal7.Description\n#: /Game/SO/Items/MemoryStone/MemoryCrystal7.MemoryCrystal7.Description\nmsgctxt \"ItemData\"\nmsgid \"'Ruin will soon reach Grey Gate, our very last city. I need to move deeper into the Realm, further away from Ruin.'\\r\\n'I decided to create some new golems. Golems that resist Ruin.'\\r\\n\\r\\nThe Last Sane Golem Maker, A.C. 315. April 8.\"\nmsgstr \"\\\"Ruin pronto llegará a la Puerta Gris, nuestra última ciudad. Necesito avanzar más en el Reino, más lejos de Ruin.\\r\\n'Decidí crear algunos golems nuevos. Golems que resisten la ruin.\\r\\n\\r\\nEl Ultimo Creador de Golems con Cordura, 315 a.C., 8 de abril.\"\n\n#. Key:\tMemoryCrystal7_name\n#. SourceLocation:\t/Game/SO/Items/MemoryStone/MemoryCrystal7.MemoryCrystal7.Name\n#: /Game/SO/Items/MemoryStone/MemoryCrystal7.MemoryCrystal7.Name\nmsgctxt \"ItemData\"\nmsgid \"New Hope\"\nmsgstr \"Nueva Esperanza\"\n\n#. Key:\tMemoryCrystal8_desc\n#. SourceLocation:\t/Game/SO/Items/MemoryStone/MemoryCrystal8.MemoryCrystal8.Description\n#: /Game/SO/Items/MemoryStone/MemoryCrystal8.MemoryCrystal8.Description\nmsgctxt \"ItemData\"\nmsgid \"'I don't think I can keep up. There are times when I no longer know what I'm doing. I still have clear moments but they become more and more rare. I've recorded my memories to keep them safe.'\\r\\n\\r\\nThe Last Sane Golem Maker, about A.C. 500.\\r\\n\"\nmsgstr \"'No creo que pueda seguir el ritmo. Hay momentos en que ya no sé lo que estoy haciendo. Todavía tengo momentos lucidos pero se vuelven cada vez más raros. He grabado mis recuerdos para mantenerlos a salvo.\\r\\n\\r\\nEl Ultimo Creador de Golems con Cordura, alrededor del año 500 a. C.\\n\"\n\n#. Key:\tMemoryCrystal8_name\n#. SourceLocation:\t/Game/SO/Items/MemoryStone/MemoryCrystal8.MemoryCrystal8.Name\n#: /Game/SO/Items/MemoryStone/MemoryCrystal8.MemoryCrystal8.Name\nmsgctxt \"ItemData\"\nmsgid \"Final Decision\"\nmsgstr \"Decisión definitiva\"\n\n#. Key:\tPergamen_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/Pergamen.Pergamen.Description\n#: /Game/SO/Items/QuestItems/Pergamen.Pergamen.Description\nmsgctxt \"ItemData\"\nmsgid \"'This chest and everything inside belongs to me, the Chef.'\"\nmsgstr \"\\\"Este cofre y todo lo que hay dentro pertenece a mi, el Cocinero\\\".\"\n\n#. Key:\tPergamen_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/Pergamen.Pergamen.Name\n#: /Game/SO/Items/QuestItems/Pergamen.Pergamen.Name\nmsgctxt \"ItemData\"\nmsgid \"Parchment\"\nmsgstr \"Pergamino\"\n\n#. Key:\tPortalGem_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/PortalGem.PortalGem.Description\n#: /Game/SO/Items/QuestItems/PortalGem.PortalGem.Description\nmsgctxt \"ItemData\"\nmsgid \"There are so many stones around. You are still not sure what's the point of picking up some of them.\"\nmsgstr \"Hay tantas piedras alrededor. Aun no está seguro de que si debería recoger algunos de ellos.\"\n\n#. Key:\tPortalGem_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/PortalGem.PortalGem.Name\n#: /Game/SO/Items/QuestItems/PortalGem.PortalGem.Name\nmsgctxt \"ItemData\"\nmsgid \"Lock Gem\"\nmsgstr \"Gema de Bloqueo\"\n\n#. Key:\tPotionOfWorthiness_desc\n#. SourceLocation:\t/Game/SO/Items/Useable/PotionOfWorthiness.PotionOfWorthiness.Description\n#: /Game/SO/Items/Useable/PotionOfWorthiness.PotionOfWorthiness.Description\nmsgctxt \"ItemData\"\nmsgid \"This might not be the weirdest side effect one can have when drinking something suspicious but it is definitely in the top five.\"\nmsgstr \"Este podría no ser el efecto secundario más extraño que uno puede tener al beber algo sospechoso, pero definitivamente se encuentra entre los cinco primeros.\"\n\n#. Key:\tPotionOfWorthiness_name\n#. SourceLocation:\t/Game/SO/Items/Useable/PotionOfWorthiness.PotionOfWorthiness.Name\n#: /Game/SO/Items/Useable/PotionOfWorthiness.PotionOfWorthiness.Name\nmsgctxt \"ItemData\"\nmsgid \"Potion Of Worthiness\"\nmsgstr \"Poción de Valía\"\n\n#. Key:\tPurpleMushroom_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/PurpleMushroom.PurpleMushroom.Description\n#: /Game/SO/Items/QuestItems/PurpleMushroom.PurpleMushroom.Description\nmsgctxt \"ItemData\"\nmsgid \"The most purple mushrooms you could find. You hope these will be enough.\"\nmsgstr \"Las setas mas moradas que podrías encontrar. Esperas que esto sea suficiente.\"\n\n#. Key:\tPurpleMushroom_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/PurpleMushroom.PurpleMushroom.Name\n#: /Game/SO/Items/QuestItems/PurpleMushroom.PurpleMushroom.Name\nmsgctxt \"ItemData\"\nmsgid \"Purple Mushrooms\"\nmsgstr \"Setas Moradas\"\n\n#. Key:\tRavenFeather_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/RavenFeather.RavenFeather.Description\n#: /Game/SO/Items/QuestItems/RavenFeather.RavenFeather.Description\nmsgctxt \"ItemData\"\nmsgid \"A magical item which gives you the ability to fly... or something like that.\"\nmsgstr \"Un objeto mágico que te permite volar... o algo así.\"\n\n#. Key:\tRavenFeather_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/RavenFeather.RavenFeather.Name\n#: /Game/SO/Items/QuestItems/RavenFeather.RavenFeather.Name\nmsgctxt \"ItemData\"\nmsgid \"Raven Feather\"\nmsgstr \"Pluma de Cuervo\"\n\n#. Key:\tRope_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/Rope.Rope.Description\n#: /Game/SO/Items/QuestItems/Rope.Rope.Description\nmsgctxt \"ItemData\"\nmsgid \"You do wonder when the area is full of ropes why this is the only one which can be taken...\"\nmsgstr \"Te preguntas cuando la zona está llena de cuerdas por qué esta es la única que se puede tomar...\"\n\n#. Key:\tRope_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/Rope.Rope.Name\n#: /Game/SO/Items/QuestItems/Rope.Rope.Name\nmsgctxt \"ItemData\"\nmsgid \"Rope\"\nmsgstr \"Cuerda\"\n\n#. Key:\tRuneStoneBonusHPMagical_desc\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneBonusHPMagical.RuneStoneBonusHPMagical.Description\n#: /Game/SO/Items/RuneStones/RuneStoneBonusHPMagical.RuneStoneBonusHPMagical.Description\nmsgctxt \"ItemData\"\nmsgid \"Absorbs <Blue>30</> magical damage.\"\nmsgstr \"Absorbe <Blue>30</> daño mágico.\"\n\n#. Key:\tRuneStoneBonusHPMagical_name\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneBonusHPMagical.RuneStoneBonusHPMagical.Name\n#: /Game/SO/Items/RuneStones/RuneStoneBonusHPMagical.RuneStoneBonusHPMagical.Name\nmsgctxt \"ItemData\"\nmsgid \"Bluestone\"\nmsgstr \"Piedra Azul\"\n\n#. Key:\tRuneStoneBonusHPPhysical_desc\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneBonusHPPhysical.RuneStoneBonusHPPhysical.Description\n#: /Game/SO/Items/RuneStones/RuneStoneBonusHPPhysical.RuneStoneBonusHPPhysical.Description\nmsgctxt \"ItemData\"\nmsgid \"Absorbs <White>30</> physical damage.\"\nmsgstr \"Absorbe <White>30</> daño físico.\"\n\n#. Key:\tRuneStoneBonusHPPhysical_name\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneBonusHPPhysical.RuneStoneBonusHPPhysical.Name\n#: /Game/SO/Items/RuneStones/RuneStoneBonusHPPhysical.RuneStoneBonusHPPhysical.Name\nmsgctxt \"ItemData\"\nmsgid \"Graystone\"\nmsgstr \"Piedra Gris\"\n\n#. Key:\tRuneStoneBounce_desc\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.Description\n#. Key:\tRuneStoneBounce_level_desc_0\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.LevelBasedDescOverride(0).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.Description\n#: /Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.LevelBasedDescOverride(0).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Provides the ability to bounce from enemies for <Green>8</> seconds. Doing so causes <Blue>12</> damage to the target.\"\nmsgstr \"Proporciona la capacidad de rebotar de los enemigos para <Green>8</> segundos. Hacerlo causa <Blue>12</> de daño al objetivo.\"\n\n#. Key:\tRuneStoneBounce_level_desc_1\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.LevelBasedDescOverride(1).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.LevelBasedDescOverride(1).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Provides the ability to bounce from enemies for <Green>16</> seconds. Doing so causes <Blue>18</> damage to the target.\"\nmsgstr \"Proporciona la capacidad de rebotar de los enemigos para <Green>16</> segundos. Hacerlo causa <Blue>18</> de daño al objetivo.\"\n\n#. Key:\tRuneStoneBounce_level_desc_2\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.LevelBasedDescOverride(2).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.LevelBasedDescOverride(2).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Provides the ability to bounce from enemies for <Green>16</> seconds. Doing so causes <Blue>18</> damage and applies <Yellow>Stun</> on the target.\"\nmsgstr \"Proporciona la capacidad de rebotar de los enemigos para <Green>16</> segundos. Hacerlo causa <Blue>18</> de daño y aplica <Yellow>Aturdir</> en el objetivo.\"\n\n#. Key:\tRuneStoneBounce_level_desc_3\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.LevelBasedDescOverride(3).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.LevelBasedDescOverride(3).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Provides the ability to bounce from enemies for <Green>16</> seconds. Doing so causes <Blue>24</> damage and applies <Yellow>Stun</> on the target.\"\nmsgstr \"Proporciona la capacidad de rebotar de los enemigos para <Green>16</> segundos. Hacerlo causa <Blue>24</> de daño y aplica <Yellow>Aturdir</> en el objetivo.\"\n\n#. Key:\tRuneStoneBounce_level_desc_4\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.LevelBasedDescOverride(4).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.LevelBasedDescOverride(4).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Provides the ability to bounce from enemies for <Green>16</> seconds. Doing so causes <Blue>30</> damage and applies <Yellow>Stun</> on the target.\"\nmsgstr \"Proporciona la capacidad de rebotar de los enemigos para <Green>16</> segundos. Hacerlo causa <Blue>30</> de daño y aplica <Yellow>Aturdir</> en el objetivo.\"\n\n#. Key:\tRuneStoneBounce_level_up_desc_0\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.LevelUpBasedDescOverride(0).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.LevelUpBasedDescOverride(0).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Provides the ability to bounce from enemies for <Green>8</><YellowH>(→16)</> seconds. Doing so causes <Blue>12</><YellowH>(→18)</> damage to the target.\"\nmsgstr \"Proporciona la capacidad de rebotar de los enemigos para <Green>8</> <YellowH>(→ 16)</> segundos. Hacerlo causa <Blue>12</> <YellowH>(→ 18)</> de daño al objetivo.\"\n\n#. Key:\tRuneStoneBounce_level_up_desc_1\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.LevelUpBasedDescOverride(1).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.LevelUpBasedDescOverride(1).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Provides the ability to bounce from enemies for <Green>16</> seconds. Doing so causes <Blue>18</> damage <YellowH>and applies Stun on the target.</>\"\nmsgstr \"Proporciona la capacidad de rebotar de los enemigos para <Green>16</> segundos. Hacerlo causa <Blue>18</> de daño<YellowH>y aplica aturdir al objetivo.</>\"\n\n#. Key:\tRuneStoneBounce_level_up_desc_2\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.LevelUpBasedDescOverride(2).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.LevelUpBasedDescOverride(2).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Provides the ability to bounce from enemies for <Green>16</> seconds. Doing so causes <Blue>18</><YellowH>(→24)</> damage and applies <Yellow>Stun</> on the target.\"\nmsgstr \"Proporciona la capacidad de rebotar de los enemigos para <Green>16</> segundos. Hacerlo causa <Blue>18</> <YellowH>(→ 24)</> de daño y aplica <Yellow>Aturdir</> en el objetivo.\"\n\n#. Key:\tRuneStoneBounce_level_up_desc_3\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.LevelUpBasedDescOverride(3).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.LevelUpBasedDescOverride(3).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Provides the ability to bounce from enemies for <Green>16</> seconds. Doing so causes <Blue>24</><YellowH>(→30)</> damage and applies <Yellow>Stun</> on the target.\"\nmsgstr \"Proporciona la capacidad de rebotar de los enemigos para <Green>16</> segundos. Hacerlo causa <Blue>24</> <YellowH>(→ 30)</> de daño y aplica <Yellow>Aturdir</> en el objetivo.\"\n\n#. Key:\tRuneStoneBounce_name\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.Name\n#: /Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.Name\nmsgctxt \"ItemData\"\nmsgid \"Bouncestone\"\nmsgstr \"Piedra de Rebotar\"\n\n#. Key:\tRuneStoneEnergy_desc\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneEnergy.RuneStoneEnergy.Description\n#: /Game/SO/Items/RuneStones/RuneStoneEnergy.RuneStoneEnergy.Description\nmsgctxt \"ItemData\"\nmsgid \"Strikes and spell cooldowns are decreased by 90% for 10 seconds.\"\nmsgstr \"Los tiempos de reutilización de hechizos y ataques se reducen en un 90% durante 10 segundos.\"\n\n#. Key:\tRuneStoneEnergy_name\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneEnergy.RuneStoneEnergy.Name\n#: /Game/SO/Items/RuneStones/RuneStoneEnergy.RuneStoneEnergy.Name\nmsgctxt \"ItemData\"\nmsgid \"Energystone\"\nmsgstr \"Piedra Energética\"\n\n#. Key:\tRuneStoneFire0_desc\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneFire0.RuneStoneFire0.Description\n#. Key:\tRuneStoneFire0_level_desc_0\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneFire0.RuneStoneFire0.LevelBasedDescOverride(0).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneFire0.RuneStoneFire0.Description\n#: /Game/SO/Items/RuneStones/RuneStoneFire0.RuneStoneFire0.LevelBasedDescOverride(0).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons a powerful blast roasting anything in a straight line.\\nCauses <Blue>16</> damage.\"\nmsgstr \"Invoca una explosión poderosa que asa todo en línea recta. \\nCausa <Blue>16</> de daño.\"\n\n#. Key:\tRuneStoneFire0_level_desc_1\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneFire0.RuneStoneFire0.LevelBasedDescOverride(1).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneFire0.RuneStoneFire0.LevelBasedDescOverride(1).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons a powerful blast roasting anything in a straight line.\\nCauses <Blue>32</> damage.\"\nmsgstr \"Invoca una explosión poderosa que asa todo en línea recta. \\nCausa <Blue>32</> de daño.\"\n\n#. Key:\tRuneStoneFire0_level_desc_2\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneFire0.RuneStoneFire0.LevelBasedDescOverride(2).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneFire0.RuneStoneFire0.LevelBasedDescOverride(2).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons a powerful blast roasting anything in a straight line.\\nCauses <Blue>36</> damage. The spell has <Green>50%</> chance to <Purple>Instant Recharge.</>\"\nmsgstr \"Invoca una explosión poderosa que asa todo en línea recta. \\nCausa <Blue>36</> de daño. El hechizo tiene un <Green>50%</> de probabilidad de <Purple>Recarga instantánea</>\"\n\n#. Key:\tRuneStoneFire0_level_desc_3\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneFire0.RuneStoneFire0.LevelBasedDescOverride(3).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneFire0.RuneStoneFire0.LevelBasedDescOverride(3).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons a powerful blast roasting anything in a straight line.\\nCauses <Blue>52</> damage. The spell has <Green>50%</> chance to <Purple>Instant Recharge.</>\"\nmsgstr \"Invoca una explosión poderosa que asa todo en línea recta. \\nCausa <Blue>52</> de daño. El hechizo tiene un <Green>50%</> de probabilidad de <Purple>Recarga instantánea</>\"\n\n#. Key:\tRuneStoneFire0_level_up_desc_0\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneFire0.RuneStoneFire0.LevelUpBasedDescOverride(0).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneFire0.RuneStoneFire0.LevelUpBasedDescOverride(0).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons a powerful blast roasting anything in a straight line.\\nCauses <Blue>16</><YellowH>(→32)</> damage.\"\nmsgstr \"Invoca una explosión poderosa que asa todo en línea recta. \\nCausa <Blue>16</> <YellowH>(→ 32)</> de daño.\"\n\n#. Key:\tRuneStoneFire0_level_up_desc_1\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneFire0.RuneStoneFire0.LevelUpBasedDescOverride(1).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneFire0.RuneStoneFire0.LevelUpBasedDescOverride(1).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons a powerful blast roasting anything in a straight line.\\nCauses <Blue>32</><YellowH>(→36)</> damage. <YellowH>The spell has </><GreenH>50%</> <YellowH>chance to </><PurpleH>Instant Recharge.</>\"\nmsgstr \"Invoca una explosión poderosa que asa todo en línea recta. \\nCausa <Blue>32</> <YellowH>(→ 36)</> de daño. <YellowH>El hechizo tiene un</> <GreenH>50%</> <YellowH>de probabilidad de </> <PurpleH>Recarga instantánea</>\"\n\n#. Key:\tRuneStoneFire0_level_up_desc_2\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneFire0.RuneStoneFire0.LevelUpBasedDescOverride(2).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneFire0.RuneStoneFire0.LevelUpBasedDescOverride(2).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons a powerful blast roasting anything in a straight line.\\nCauses <Blue>36</><YellowH>(→52)</> damage. The spell has <Green>50%</> chance to <Purple>Instant Recharge.</>\"\nmsgstr \"Invoca una explosión poderosa que asa todo en línea recta. \\nCausa <Blue>36</> <YellowH>(→ 52)</> de daño. El hechizo tiene un<Green>50%</> de probabilidad de <Purple>Recarga instantánea</>\"\n\n#. Key:\tRuneStoneFire0_name\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneFire0.RuneStoneFire0.Name\n#: /Game/SO/Items/RuneStones/RuneStoneFire0.RuneStoneFire0.Name\nmsgctxt \"ItemData\"\nmsgid \"Firestone\"\nmsgstr \"Piedra de Fuego\"\n\n#. Key:\tRuneStoneHeal_desc\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneHeal.RuneStoneHeal.Description\n#: /Game/SO/Items/RuneStones/RuneStoneHeal.RuneStoneHeal.Description\nmsgctxt \"ItemData\"\nmsgid \"Restores <Green>30</> health points.\"\nmsgstr \"Restaura <Green>30</> Puntos de salud.\"\n\n#. Key:\tRuneStoneHeal_name\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneHeal.RuneStoneHeal.Name\n#: /Game/SO/Items/RuneStones/RuneStoneHeal.RuneStoneHeal.Name\nmsgctxt \"ItemData\"\nmsgid \"Healstone\"\nmsgstr \"Piedra de Curar\"\n\n#. Key:\tRuneStoneLightningWalk_desc\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneLightningWalk.RuneStoneLightningWalk.Description\n#: /Game/SO/Items/RuneStones/RuneStoneLightningWalk.RuneStoneLightningWalk.Description\nmsgctxt \"ItemData\"\nmsgid \"Grants the shocking ability to walk through your enemies for <Green>2</> sec. The shock causes <Blue>10</> damage.\"\nmsgstr \"Otorga la sorprendente habilidad de caminar a través de tus enemigos durante <Green>2</> segundos. El shock provoca <Blue>10</> de daño.\"\n\n#. Key:\tRuneStoneLightningWalk_level_desc_0\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneLightningWalk.RuneStoneLightningWalk.LevelBasedDescOverride(0).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneLightningWalk.RuneStoneLightningWalk.LevelBasedDescOverride(0).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Grants the shocking ability to walk through your enemies for <Green>2</> sec. The shock causes <Blue>16</> damage.\"\nmsgstr \"Otorga la sorprendente habilidad de caminar a través de tus enemigos durante <Green>2</> segundos. El shock provoca <Blue>16</> de daño.\"\n\n#. Key:\tRuneStoneLightningWalk_level_desc_1\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneLightningWalk.RuneStoneLightningWalk.LevelBasedDescOverride(1).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneLightningWalk.RuneStoneLightningWalk.LevelBasedDescOverride(1).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Grants the shocking ability to walk through your enemies for <Green>3</> sec. The shock causes <Blue>28</> damage.\"\nmsgstr \"Otorga la sorprendente habilidad de caminar a través de tus enemigos durante <Green>3</> segundos. El shock provoca <Blue>28</> de daño.\"\n\n#. Key:\tRuneStoneLightningWalk_level_desc_2\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneLightningWalk.RuneStoneLightningWalk.LevelBasedDescOverride(2).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneLightningWalk.RuneStoneLightningWalk.LevelBasedDescOverride(2).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Grants the shocking ability to walk through your enemies for <Green>4</> sec. The shock causes <Blue>32</> damage and has a <Green>30%</> chance to <Yellow>stun</> the target.\"\nmsgstr \"Otorga la sorprendente habilidad de caminar a través de tus enemigos durante <Green>4</> segundos. El shock provoca <Blue>32</> de daño y tiene un <Green>30%</> de probabilidad de <Yellow>aturdir</> el objetivo.\"\n\n#. Key:\tRuneStoneLightningWalk_level_desc_3\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneLightningWalk.RuneStoneLightningWalk.LevelBasedDescOverride(3).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneLightningWalk.RuneStoneLightningWalk.LevelBasedDescOverride(3).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Grants the shocking ability to walk through your enemies for <Green>4</> sec. The shock causes <Blue>32</> damage and has a <Green>40%</> chance to <Yellow>stun</> the target.\"\nmsgstr \"Otorga la sorprendente habilidad de caminar a través de tus enemigos durante <Green>4</> segundos. El shock provoca <Blue>32</> de daño y tiene un <Green>40%</> de probabilidad de <Yellow>aturdir</> el objetivo.\"\n\n#. Key:\tRuneStoneLightningWalk_level_up_desc_0\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneLightningWalk.RuneStoneLightningWalk.LevelUpBasedDescOverride(0).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneLightningWalk.RuneStoneLightningWalk.LevelUpBasedDescOverride(0).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Grants the shocking ability to walk through your enemies for <Green>2</><YellowH>(→3)</> sec. The shock causes <Blue>16</> <YellowH>(→28)</>damage.\"\nmsgstr \"Otorga la sorprendente habilidad de caminar a través de tus enemigos durante <Green>2</> <YellowH>(→ 3)</> segundos. El shock provoca <Blue>16</> <YellowH>(→ 28)</> de daño.\"\n\n#. Key:\tRuneStoneLightningWalk_level_up_desc_1\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneLightningWalk.RuneStoneLightningWalk.LevelUpBasedDescOverride(1).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneLightningWalk.RuneStoneLightningWalk.LevelUpBasedDescOverride(1).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Grants the shocking ability to walk through your enemies for <Green>3</><YellowH>(→4)</> sec. The shock causes <Blue>28</> <YellowH>(→36)</>damage <YellowH>and has a </><GreenH>30%</> <YellowH>chance to stun the target.</>\"\nmsgstr \"Otorga la sorprendente habilidad de caminar a través de tus enemigos durante <Green>3</> <YellowH>(→ 4)</> segundos. El shock provoca <Blue>28</> <YellowH>(→ 36)</> de daño <YellowH>y tiene un</> <GreenH>30%</> <YellowH> de probabilidad de aturdir al objetivo.</>\"\n\n#. Key:\tRuneStoneLightningWalk_level_up_desc_2\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneLightningWalk.RuneStoneLightningWalk.LevelUpBasedDescOverride(2).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneLightningWalk.RuneStoneLightningWalk.LevelUpBasedDescOverride(2).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Grants the shocking ability to walk through your enemies for <Green>4</> sec. The shock causes <Blue>32</> damage and has a <Green>30%</> <YellowH>(→40%)</> chance to <Yellow>stun</> the target.\"\nmsgstr \"Otorga la sorprendente habilidad de caminar a través de tus enemigos durante <Green>4</> segundos. El shock provoca <Blue>32</> de daño y tiene un <Green>30%</> <YellowH>(→ 40%)</> de probabilidad de <Yellow>aturdir</> el objetivo.\"\n\n#. Key:\tRuneStoneLightningWalk_name\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneLightningWalk.RuneStoneLightningWalk.Name\n#: /Game/SO/Items/RuneStones/RuneStoneLightningWalk.RuneStoneLightningWalk.Name\nmsgctxt \"ItemData\"\nmsgid \"Lightningstone\"\nmsgstr \"Piedra Relámpago\"\n\n#. Key:\tRuneStoneMagicMissle_desc\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMagicMissle.RuneStoneMagicMissle.Description\n#: /Game/SO/Items/RuneStones/RuneStoneMagicMissle.RuneStoneMagicMissle.Description\nmsgctxt \"ItemData\"\nmsgid \"Summons a homing projectile targeted at a close foe - prefers flying targets.\"\nmsgstr \"Invoca un proyectil guiada dirigido a un enemigo cercano: prefiere objetivos voladores.\"\n\n#. Key:\tRuneStoneMagicMissle_level_desc_0\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMagicMissle.RuneStoneMagicMissle.LevelBasedDescOverride(0).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneMagicMissle.RuneStoneMagicMissle.LevelBasedDescOverride(0).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons <Green>1</> homing projectile targeted at a close foe - prefers flying targets. Causes <Blue>16</> damage on impact.\"\nmsgstr \"Invoca <Green>1</> proyectil guiada dirigido a un enemigo cercano: prefiere objetivos voladores. Causa <Blue>16</> de daño por impacto.\"\n\n#. Key:\tRuneStoneMagicMissle_level_desc_1\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMagicMissle.RuneStoneMagicMissle.LevelBasedDescOverride(1).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneMagicMissle.RuneStoneMagicMissle.LevelBasedDescOverride(1).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons <Green>2</> homing projectile targeted at a close foe - prefers flying targets. Each projectile causes <Blue>16</> damage on impact.\"\nmsgstr \"Invoca <Green>2</> proyectiles guiadas dirigido a un enemigo cercano: prefiere objetivos voladores. Cada proyectil causa <Blue>16</> de daño por impacto.\"\n\n#. Key:\tRuneStoneMagicMissle_level_desc_2\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMagicMissle.RuneStoneMagicMissle.LevelBasedDescOverride(2).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneMagicMissle.RuneStoneMagicMissle.LevelBasedDescOverride(2).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons <Green>3</> homing projectile targeted at a close foe - prefers flying targets. Each projectile causes <Blue>16</> damage and applies <Orange>Slow</> on impact.\"\nmsgstr \"Invoca <Green>3</> proyectiles guiadas dirigido a un enemigo cercano: prefiere objetivos voladores. Cada proyectil causa <Blue>16</> de daño y aplica <Orange>Lento</> por impacto.\"\n\n#. Key:\tRuneStoneMagicMissle_level_desc_3\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMagicMissle.RuneStoneMagicMissle.LevelBasedDescOverride(3).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneMagicMissle.RuneStoneMagicMissle.LevelBasedDescOverride(3).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons <Green>4</> homing projectile targeted at a close foe - prefers flying targets. Each projectile causes <Blue>16</> damage and applies <Orange>Slow</> on impact.\"\nmsgstr \"Invoca <Green>4</> proyectiles guiadas dirigido a un enemigo cercano: prefiere objetivos voladores. Cada proyectil causa <Blue>16</> de daño y aplica <Orange>Lento</> por impacto.\"\n\n#. Key:\tRuneStoneMagicMissle_level_up_desc_0\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMagicMissle.RuneStoneMagicMissle.LevelUpBasedDescOverride(0).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneMagicMissle.RuneStoneMagicMissle.LevelUpBasedDescOverride(0).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons <Green>1</><YellowH>(→2)</> homing projectile targeted at a close foe - prefers flying targets. Each projectile causes <Blue>16</> damage on impact.\"\nmsgstr \"Invoca <Green>1</> <YellowH>(→ 2)</> proyectil guiada dirigido a un enemigo cercano: prefiere objetivos voladores. Cada proyectil causa <Blue>16</> de daño por impacto.\"\n\n#. Key:\tRuneStoneMagicMissle_level_up_desc_1\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMagicMissle.RuneStoneMagicMissle.LevelUpBasedDescOverride(1).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneMagicMissle.RuneStoneMagicMissle.LevelUpBasedDescOverride(1).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons <Green>2</><YellowH>(→3)</> homing projectile targeted at a close foe - prefers flying targets. Each projectile causes <Blue>16</> damage <YellowH>and applies</> <OrangeH>Slow</> on impact.\"\nmsgstr \"Invoca <Green>2</> <YellowH>(→ 3)</> proyectiles guiadas dirigido a un enemigo cercano: prefiere objetivos voladores. Cada proyectil causa <Blue>16</> de daño <YellowH>y aplica</> <OrangeH>Lento</> por impacto.\"\n\n#. Key:\tRuneStoneMagicMissle_level_up_desc_2\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMagicMissle.RuneStoneMagicMissle.LevelUpBasedDescOverride(2).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneMagicMissle.RuneStoneMagicMissle.LevelUpBasedDescOverride(2).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons <Green>3</><YellowH>(→4)</> homing projectile targeted at a close foe - prefers flying targets. Each projectile causes <Blue>16</> damage and applies <Orange>Slow</> on impact.\"\nmsgstr \"Invoca <Green>3</> <YellowH>(→ 4)</> proyectiles guiadas dirigido a un enemigo cercano: prefiere objetivos voladores. Cada proyectil causa <Blue>16</> de daño y aplica <Orange>Lento</> por impacto.\"\n\n#. Key:\tRuneStoneMagicMissle_name\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMagicMissle.RuneStoneMagicMissle.Name\n#: /Game/SO/Items/RuneStones/RuneStoneMagicMissle.RuneStoneMagicMissle.Name\nmsgctxt \"ItemData\"\nmsgid \"Tealstone\"\nmsgstr \"Piedra Trullo\"\n\n#. Key:\tRuneStoneMassMagicMissle_desc\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMassMagicMissle.RuneStoneMassMagicMissle.Description\n#. Key:\tRuneStoneMassMagicMissle_level_desc_0\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMassMagicMissle.RuneStoneMassMagicMissle.LevelBasedDescOverride(0).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneMassMagicMissle.RuneStoneMassMagicMissle.Description\n#: /Game/SO/Items/RuneStones/RuneStoneMassMagicMissle.RuneStoneMassMagicMissle.LevelBasedDescOverride(0).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons a homing projectile for each nearby enemy, causing <Blue>20</> damage on impact.\"\nmsgstr \"Invoca un proyectil guiada para cada enemigo cercano, provocando <Blue>20</> de daño por impacto.\"\n\n#. Key:\tRuneStoneMassMagicMissle_level_desc_1\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMassMagicMissle.RuneStoneMassMagicMissle.LevelBasedDescOverride(1).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneMassMagicMissle.RuneStoneMassMagicMissle.LevelBasedDescOverride(1).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons a homing projectile for each nearby enemy, causing <Blue>40</> damage on impact.\"\nmsgstr \"Invoca un proyectil guiada para cada enemigo cercano, provocando <Blue>40</> de daño por impacto.\"\n\n#. Key:\tRuneStoneMassMagicMissle_level_desc_2\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMassMagicMissle.RuneStoneMassMagicMissle.LevelBasedDescOverride(2).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneMassMagicMissle.RuneStoneMassMagicMissle.LevelBasedDescOverride(2).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons a homing projectile for each nearby enemy, causing <Blue>50</> damage on impact. The target has a <Green>30%</> chance to become <Orange>Slow</>.\"\nmsgstr \"Invoca un proyectil guiada para cada enemigo cercano, provocando <Blue>50</> de daño por impacto. El objetivo tiene un <Green>30%</> de probabilidad de convertirse <Orange>Lento</> .\"\n\n#. Key:\tRuneStoneMassMagicMissle_level_up_desc_0\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMassMagicMissle.RuneStoneMassMagicMissle.LevelUpBasedDescOverride(0).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneMassMagicMissle.RuneStoneMassMagicMissle.LevelUpBasedDescOverride(0).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons a homing projectile for each nearby enemy, causing <Blue>20</><YellowH>(→40)</> damage on impact.\"\nmsgstr \"Invoca un proyectil guiada para cada enemigo cercano, provocando <Blue>20</> <YellowH>(→ 40)</> de daño por impacto.\"\n\n#. Key:\tRuneStoneMassMagicMissle_level_up_desc_1\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMassMagicMissle.RuneStoneMassMagicMissle.LevelUpBasedDescOverride(1).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneMassMagicMissle.RuneStoneMassMagicMissle.LevelUpBasedDescOverride(1).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons a homing projectile for each nearby enemy, causing <Blue>20</><YellowH>(→50)</> damage on impact. <YellowH>The target has a</> <GreenH>30%</> <YellowH>chance to become</> <Orange>Slow</>.\"\nmsgstr \"Invoca un proyectil de referencia para cada enemigo cercano, provocando <Blue>20</> <YellowH>(→ 50)</> de daño por impacto. <YellowH>El objetivo tiene un</> <GreenH>30%</> <YellowH> de probabilidad de convertirse</> <Orange>Lento</>.\"\n\n#. Key:\tRuneStoneMassMagicMissle_name\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMassMagicMissle.RuneStoneMassMagicMissle.Name\n#: /Game/SO/Items/RuneStones/RuneStoneMassMagicMissle.RuneStoneMassMagicMissle.Name\nmsgctxt \"ItemData\"\nmsgid \"Tealstone, but better\"\nmsgstr \"Piedra Trullo, pero mejor\"\n\n#. Key:\tRuneStoneMassSlow_desc\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMassSlow.RuneStoneMassSlow.Description\n#: /Game/SO/Items/RuneStones/RuneStoneMassSlow.RuneStoneMassSlow.Description\nmsgctxt \"ItemData\"\nmsgid \"Slows all enemy targets around the caster.\"\nmsgstr \"Retarda todos los objetivos enemigos alrededor del lanzador.\"\n\n#. Key:\tRuneStoneMassSlow_level_desc_0\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMassSlow.RuneStoneMassSlow.LevelBasedDescOverride(0).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneMassSlow.RuneStoneMassSlow.LevelBasedDescOverride(0).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"All enemy target becomes <Orange>Slow</> for <Green>3</> seconds.\"\nmsgstr \"Todo objetivo enemigo se convierte <Orange>Lento</> durante <Green>3</> segundos.\"\n\n#. Key:\tRuneStoneMassSlow_name\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMassSlow.RuneStoneMassSlow.Name\n#: /Game/SO/Items/RuneStones/RuneStoneMassSlow.RuneStoneMassSlow.Name\nmsgctxt \"ItemData\"\nmsgid \"Slowstone\"\nmsgstr \"Piedra Lenta\"\n\n#. Key:\tRuneStoneMeteorShower_desc\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMeteorShower.RuneStoneMeteorShower.Description\n#: /Game/SO/Items/RuneStones/RuneStoneMeteorShower.RuneStoneMeteorShower.Description\nmsgctxt \"ItemData\"\nmsgid \"Summons 12 deadly meteors around the caster, each causing 16 damage on impact.\"\nmsgstr \"Invoca 12 meteoritos mortales alrededor del lanzador cada uno de los cuales causa 16 de daño por impacto.\"\n\n#. Key:\tRuneStoneMeteorShower_level_desc_0\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMeteorShower.RuneStoneMeteorShower.LevelBasedDescOverride(0).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneMeteorShower.RuneStoneMeteorShower.LevelBasedDescOverride(0).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons <Green>12</> deadly meteors around the caster, each causing <White>16</> damage on impact.\"\nmsgstr \"Invoca<Green>12</> meteoritos mortales alrededor del lanzador, cada uno causando <White>16</> de daño por impacto.\"\n\n#. Key:\tRuneStoneMeteorShower_level_desc_1\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMeteorShower.RuneStoneMeteorShower.LevelBasedDescOverride(1).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneMeteorShower.RuneStoneMeteorShower.LevelBasedDescOverride(1).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons <Green>16</> deadly meteors around the caster, each causing <White>24</> damage on impact.\"\nmsgstr \"Invoca <Green>16</> meteoritos mortales alrededor del lanzador, cada uno causando <White>24</> de daño por impacto.\"\n\n#. Key:\tRuneStoneMeteorShower_level_desc_2\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMeteorShower.RuneStoneMeteorShower.LevelBasedDescOverride(2).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneMeteorShower.RuneStoneMeteorShower.LevelBasedDescOverride(2).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons <Green>20</> deadly meteors around the caster, each causing <White>32</> damage on impact. Each meteor has a <Green>30%</> chance to <Yellow>Stun</> the target.\"\nmsgstr \"Invoca <Green>20</> meteoritos mortales alrededor del lanzador, cada uno causando <White>32</> de daño por impacto. Cada meteorito tiene un <Green>30%</> de probabilidad de <Yellow>Aturdir</> el objetivo.\"\n\n#. Key:\tRuneStoneMeteorShower_level_up_desc_0\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMeteorShower.RuneStoneMeteorShower.LevelUpBasedDescOverride(0).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneMeteorShower.RuneStoneMeteorShower.LevelUpBasedDescOverride(0).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons <Green>12</><YellowH>(→16)</> deadly meteors around the caster, each causing <White>16</><YellowH>(→24)</> damage on impact.\"\nmsgstr \"Invoca <Green>12</> <YellowH>(→ 16)</> meteoritos mortales alrededor del lanzador, cada uno causando <White>16</> <YellowH>(→ 24)</> de daño por impacto.\"\n\n#. Key:\tRuneStoneMeteorShower_level_up_desc_1\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMeteorShower.RuneStoneMeteorShower.LevelUpBasedDescOverride(1).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneMeteorShower.RuneStoneMeteorShower.LevelUpBasedDescOverride(1).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons <Green>16</><YellowH>(→20)</> deadly meteors around the caster, each causing <White>24</><YellowH>(→32)</> damage on impact. <YellowH>Each meteor has a</> <GreenH>30%</> <YellowH>chance to Stun the target.</>\"\nmsgstr \"Invoca<Green>16</> <YellowH>(→ 20)</> meteoritos mortales alrededor del lanzador, cada uno causando <White>24</> <YellowH>(→ 32)</> de daño por impacto. <YellowH>Cada meteorito tiene un</> <GreenH> 30%</> <YellowH> de probabilidad de aturdir al objetivo.</>\"\n\n#. Key:\tRuneStoneMeteorShower_name\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMeteorShower.RuneStoneMeteorShower.Name\n#: /Game/SO/Items/RuneStones/RuneStoneMeteorShower.RuneStoneMeteorShower.Name\nmsgctxt \"ItemData\"\nmsgid \"Meteorstone\"\nmsgstr \"Piedra Meteorito\"\n\n#. Key:\tRuneStoneShadowWalk_desc\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneShadowWalk.RuneStoneShadowWalk.Description\n#. Key:\tRuneStoneShadowWalk_level_desc_0\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneShadowWalk.RuneStoneShadowWalk.LevelBasedDescOverride(0).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneShadowWalk.RuneStoneShadowWalk.Description\n#: /Game/SO/Items/RuneStones/RuneStoneShadowWalk.RuneStoneShadowWalk.LevelBasedDescOverride(0).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Grants the ability to walk through your enemies for <Green>2</> seconds.\"\nmsgstr \"Otorga la capacidad de caminar a través de tus enemigos durante <Green>2</> segundos.\"\n\n#. Key:\tRuneStoneShadowWalk_level_desc_1\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneShadowWalk.RuneStoneShadowWalk.LevelBasedDescOverride(1).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneShadowWalk.RuneStoneShadowWalk.LevelBasedDescOverride(1).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Grants the ability to walk through your enemies for <Green>4</> seconds.\"\nmsgstr \"Otorga la capacidad de caminar a través de tus enemigos durante <Green>4</> segundos.\"\n\n#. Key:\tRuneStoneShadowWalk_level_desc_2\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneShadowWalk.RuneStoneShadowWalk.LevelBasedDescOverride(2).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneShadowWalk.RuneStoneShadowWalk.LevelBasedDescOverride(2).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Grants the ability to walk through your enemies for <Green>4</> seconds. Your magical resistance is increased by <Green>0.2.</>\"\nmsgstr \"Otorga la capacidad de caminar a través de tus enemigos durante <Green>4</> segundos. Tu resistencia mágica aumenta en <Green>0.2.</>\"\n\n#. Key:\tRuneStoneShadowWalk_level_desc_3\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneShadowWalk.RuneStoneShadowWalk.LevelBasedDescOverride(3).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneShadowWalk.RuneStoneShadowWalk.LevelBasedDescOverride(3).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Grants the ability to walk through your enemies for <Green>5</> seconds. Your magical resistance is increased by <Green>0.3.</>\"\nmsgstr \"Otorga la capacidad de caminar a través de tus enemigos durante <Green>5</> segundos. Tu resistencia mágica aumenta en <Green>0.3.</>\"\n\n#. Key:\tRuneStoneShadowWalk_level_up_desc_0\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneShadowWalk.RuneStoneShadowWalk.LevelUpBasedDescOverride(0).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneShadowWalk.RuneStoneShadowWalk.LevelUpBasedDescOverride(0).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Grants the ability to walk through your enemies for <Green>2</> <YellowH>(→4)</> seconds.\"\nmsgstr \"Otorga la capacidad de caminar a través de tus enemigos por <Green>2</> <YellowH>(→ 4)</> segundos.\"\n\n#. Key:\tRuneStoneShadowWalk_level_up_desc_1\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneShadowWalk.RuneStoneShadowWalk.LevelUpBasedDescOverride(1).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneShadowWalk.RuneStoneShadowWalk.LevelUpBasedDescOverride(1).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Grants the ability to walk through your enemies for <Green>4</> seconds. <YellowH>Your magical resistance is increased by</> <GreenH>0.2.</>\"\nmsgstr \"Otorga la capacidad de caminar a través de tus enemigos durante <Green>4</> segundos. <YellowH> Tu resistencia mágica aumenta en </> <GreenH>0.2.</>\"\n\n#. Key:\tRuneStoneShadowWalk_level_up_desc_2\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneShadowWalk.RuneStoneShadowWalk.LevelUpBasedDescOverride(2).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneShadowWalk.RuneStoneShadowWalk.LevelUpBasedDescOverride(2).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Grants the ability to walk through your enemies for <Green>4</> <YellowH>(→5)</> seconds. Your magical resistance is increased by <Green>0.2</> <YellowH>(→0.3).</>\"\nmsgstr \"Otorga la capacidad de caminar a través de tus enemigos durante <Green>4</> <YellowH>(→ 5)</> segundos. Tu resistencia mágica aumenta en <Green>0.2</> <YellowH>(→ 0.3).</>\"\n\n#. Key:\tRuneStoneShadowWalk_name\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneShadowWalk.RuneStoneShadowWalk.Name\n#: /Game/SO/Items/RuneStones/RuneStoneShadowWalk.RuneStoneShadowWalk.Name\nmsgctxt \"ItemData\"\nmsgid \"Shadestone\"\nmsgstr \"Piedra de Sombra\"\n\n#. Key:\tRuneStoneSoulkeeper_desc\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneSoulkeeper.RuneStoneSoulkeeper.Description\n#: /Game/SO/Items/RuneStones/RuneStoneSoulkeeper.RuneStoneSoulkeeper.Description\nmsgctxt \"ItemData\"\nmsgid \"Summons the Soulkeeper, a powerful spirit capable of gathering your essence should something bad happen to you.\\r\\n\\r\\nReleasing the spirit recharges the stone.\"\nmsgstr \"Invoca al Guardián de Almas, un poderoso espíritu capaz de reunir tu esencia si algo malo te sucede.\\r\\n\\r\\nLiberar el espíritu recarga la piedra.\"\n\n#. Key:\tRuneStoneSoulkeeper_name\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneSoulkeeper.RuneStoneSoulkeeper.Name\n#: /Game/SO/Items/RuneStones/RuneStoneSoulkeeper.RuneStoneSoulkeeper.Name\nmsgctxt \"ItemData\"\nmsgid \"Soulstone\"\nmsgstr \"Piedra del Alma\"\n\n#. Key:\tRuneStoneSoulkeeperInfinite_desc\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneSoulkeeperInfinite.RuneStoneSoulkeeperInfinite.Description\n#: /Game/SO/Items/RuneStones/RuneStoneSoulkeeperInfinite.RuneStoneSoulkeeperInfinite.Description\nmsgctxt \"ItemData\"\nmsgid \"Summons the Soulkeeper, a powerful spirit capable of gathering your essence should something bad happen to you.\"\nmsgstr \"Invoca al Guardián de Almas, un poderoso espíritu capaz de reunir tu esencia si algo malo te sucede.\"\n\n#. Key:\tRuneStoneSoulkeeperInfinite_name\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneSoulkeeperInfinite.RuneStoneSoulkeeperInfinite.Name\n#: /Game/SO/Items/RuneStones/RuneStoneSoulkeeperInfinite.RuneStoneSoulkeeperInfinite.Name\nmsgctxt \"ItemData\"\nmsgid \"Elite Soulstone\"\nmsgstr \"Piedra élite de Alma\"\n\n#. Key:\tRuneStoneSpellRegain_desc\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneSpellRegain.RuneStoneSpellRegain.Description\n#: /Game/SO/Items/RuneStones/RuneStoneSpellRegain.RuneStoneSpellRegain.Description\nmsgctxt \"ItemData\"\nmsgid \"Regenerates all other spell charges.\"\nmsgstr \"Regenera todas las demás cargas de hechizos.\"\n\n#. Key:\tRuneStoneSpellRegain_name\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneSpellRegain.RuneStoneSpellRegain.Name\n#: /Game/SO/Items/RuneStones/RuneStoneSpellRegain.RuneStoneSpellRegain.Name\nmsgctxt \"ItemData\"\nmsgid \"Spiritstone\"\nmsgstr \"Piedra Espiritual\"\n\n#. Key:\tRuneStoneSwap_desc\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.Description\n#. Key:\tRuneStoneSwap_level_desc_0\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.LevelBasedDescOverride(0).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.Description\n#: /Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.LevelBasedDescOverride(0).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Swaps the position of the caster with the closest target in front of him/her/it.\"\nmsgstr \"Intercambia la posición del lanzador con el objetivo más cercano frente a él/ella/eso.\"\n\n#. Key:\tRuneStoneSwap_level_desc_1\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.LevelBasedDescOverride(1).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.LevelBasedDescOverride(1).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Swaps the position of the caster with the closest target in front of him/her/it. The selected target suffers <Blue>20</> damage.\"\nmsgstr \"Intercambia la posición del lanzador con el objetivo más cercano frente a él/ella/eso. El objetivo seleccionado sufre <Blue>20</> de daño.\"\n\n#. Key:\tRuneStoneSwap_level_desc_2\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.LevelBasedDescOverride(2).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.LevelBasedDescOverride(2).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Swaps the position of the caster with the closest target in front of him/her/it. The selected target suffers <Blue>30</> damage and becomes <Orange>Slow</>.\"\nmsgstr \"Intercambia la posición del lanzador con el objetivo más cercano frente a él/ella/eso. El objetivo seleccionado sufre <Blue>30</> de daño y se hace <Orange>Lento</>.\"\n\n#. Key:\tRuneStoneSwap_level_desc_3\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.LevelBasedDescOverride(3).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.LevelBasedDescOverride(3).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Swaps the position of the caster with the closest target in front of him/her/it. The selected target suffers <Blue>40</> damage and becomes <Orange>Slow</>.\"\nmsgstr \"Intercambia la posición del lanzador con el objetivo más cercano frente a él/ella/eso. El objetivo seleccionado sufre <Blue>40</> de daño y se hace <Orange>Lento</> .\"\n\n#. Key:\tRuneStoneSwap_level_desc_4\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.LevelBasedDescOverride(4).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.LevelBasedDescOverride(4).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Swaps the position of the caster with the closest target in front of him/her/it. The selected target suffers <Blue>50</> damage and becomes <Orange>Slow</>.\"\nmsgstr \"Intercambia la posición del lanzador con el objetivo más cercano frente a él/ella/eso. El objetivo seleccionado sufre <Blue>50</> de daño y se hace <Orange>Lento</> .\"\n\n#. Key:\tRuneStoneSwap_level_up_desc_0\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.LevelUpBasedDescOverride(0).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.LevelUpBasedDescOverride(0).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Swaps the position of the caster with the closest target in front of him/her/it. <YellowH>The selected target suffers</> <BlueH>20</> <YellowH>damage.</>\"\nmsgstr \"Intercambia la posición del Lanzador con el objetivo más cercano frente a él/ella/eso. <YellowH>El objetivo seleccionado sufre</> <BlueH>20</> <YellowH>de daño.</>\"\n\n#. Key:\tRuneStoneSwap_level_up_desc_1\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.LevelUpBasedDescOverride(1).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.LevelUpBasedDescOverride(1).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Swaps the position of the caster with the closest target in front of him/her/it. The selected target suffers <Blue>20</><YellowH>(→30)</> damage <YellowH>and becomes </><Orange>Slow.</>\"\nmsgstr \"Intercambia la posición del lanzador con el objetivo más cercano frente a él/ella/eso. El objetivo seleccionado sufre <Blue>20</> <YellowH>(→ 30)</> de daño <YellowH>y se hace</> <Orange>Lento.</>\"\n\n#. Key:\tRuneStoneSwap_level_up_desc_2\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.LevelUpBasedDescOverride(2).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.LevelUpBasedDescOverride(2).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Swaps the position of the caster with the closest target in front of him/her/it. The selected target suffers <Blue>30</><YellowH>(→40)</> damage and becomes <Orange>Slow.</>\"\nmsgstr \"Intercambia la posición del lanzador con el objetivo más cercano frente a él/ella/eso. El objetivo seleccionado sufre <Blue>30</> <YellowH>(→ 40)</> de daño y se hace <Orange>Lento.</>\"\n\n#. Key:\tRuneStoneSwap_level_up_desc_3\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.LevelUpBasedDescOverride(3).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.LevelUpBasedDescOverride(3).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Swaps the position of the caster with the closest target in front of him/her/it. The selected target suffers <Blue>40</><YellowH>(→50)</> damage and becomes <Orange>Slow.</>\"\nmsgstr \"Intercambia la posición del lanzador con el objetivo más cercano frente a él/ella/eso. El objetivo seleccionado sufre <Blue>40</> <YellowH>(→ 50)</> de daño y se hace <Orange>Lento.</>\"\n\n#. Key:\tRuneStoneSwap_name\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.Name\n#: /Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.Name\nmsgctxt \"ItemData\"\nmsgid \"Swapstone\"\nmsgstr \"Piedra de Intercambio\"\n\n#. Key:\tRuneStoneWeaponFlame_desc\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.Description\n#: /Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.Description\nmsgctxt \"ItemData\"\nmsgid \"Enchants your active weapon with green flames - it causes an additional 0.3x damage for 4 seconds.\"\nmsgstr \"Encanta tu arma activa con llamas verdes - causa un daño adicional de 0.3x durante 4 segundos.\"\n\n#. Key:\tRuneStoneWeaponFlame_level_desc_0\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.LevelBasedDescOverride(0).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.LevelBasedDescOverride(0).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Enchants your active weapon - it causes an additional <Green>0.5x</> damage for <Green>5</> seconds.\"\nmsgstr \"Encanta tu arma activa - causa un adicional <Green>0.5x</> de daño por <Green>5</> segundos.\"\n\n#. Key:\tRuneStoneWeaponFlame_level_desc_1\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.LevelBasedDescOverride(1).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.LevelBasedDescOverride(1).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Enchants your active weapon - it causes an additional <Green>0.6x</> damage for <Green>5</> seconds. Each strike has a <Green>15%</> chance to apply <DarkGreen>Poison</>, causing an additional <Blue>18</> damage over <Green>6</> seconds.\"\nmsgstr \"Encanta tu arma activa - causa un adicional <Green>0.6x</> de daño por <Green>5</> segundos. Cada golpe tiene un <Green>15%</> de probabilidad de aplicar <DarkGreen>Veneno</>, causando un adicional <Blue>18</> daño por <Green>6</> segundos.\"\n\n#. Key:\tRuneStoneWeaponFlame_level_desc_2\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.LevelBasedDescOverride(2).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.LevelBasedDescOverride(2).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Enchants your active weapon - it causes an additional <Green>0.7x</> damage for <Green>6</> seconds. Each strike has a <Green>20%</> chance to apply <DarkGreen>Poison</>, causing an additional <Blue>24</> damage over <Green>6</> seconds.\"\nmsgstr \"Encanta tu arma activa - causa un adicional <Green>0.7x</> de daño por <Green>6</> segundos. Cada golpe tiene un <Green>20%</> de probabilidad de aplicar <DarkGreen>Veneno</>, causando un adicional <Blue>24</> de daño por <Green>6</> segundos.\"\n\n#. Key:\tRuneStoneWeaponFlame_level_desc_3\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.LevelBasedDescOverride(3).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.LevelBasedDescOverride(3).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Enchants your active weapon - it causes an additional <Green>0.8x</> damage for <Green>6</> seconds. Each strike has a <Green>25%</> chance to apply <DarkGreen>Poison</>, causing an additional <Blue>30</> damage over <Green>6</> seconds.\"\nmsgstr \"Encanta tu arma activa - causa un adicional <Green>0.8x</> de daño por <Green>6</> segundos. Cada golpe tiene un <Green>25%</> de probabilidad de aplicar <DarkGreen>Veneno</>, causando un adicional <Blue>30</> de daño por <Green>6</> segundos.\"\n\n#. Key:\tRuneStoneWeaponFlame_level_desc_4\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.LevelBasedDescOverride(4).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.LevelBasedDescOverride(4).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Enchants your active weapon - it causes an additional <Green>0.9x</> damage for <Green>6</> seconds. Each strike has a <Green>30%</> chance to apply <DarkGreen>Poison</>, causing an additional <Blue>36</> damage over <Green>6</> seconds.\"\nmsgstr \"Encanta tu arma activa - causa un adicional <Green>0.9x</> de daño por <Green>6</> segundos. Cada golpe tiene un <Green>30%</> de probabilidad de aplicar <DarkGreen>Veneno</>, causando un adicional <Blue>36</> de daño por <Green>6</> segundos.\"\n\n#. Key:\tRuneStoneWeaponFlame_level_up_desc_0\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.LevelUpBasedDescOverride(0).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.LevelUpBasedDescOverride(0).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Enchants your active weapon - it causes an additional <Green>0.5x</><YellowH>(→0.6x)</> damage for <Green>5</> seconds. <YellowH>Each strike has a</> <GreenH>15%</> <YellowH>chance to apply </><DarkGreenH>Poison</><YellowH>, causing an additional</> <BlueH>18</> <YellowH>damage over</> <GreenH>6</> <YellowH>seconds.</>\"\nmsgstr \"Encanta tu arma activa - causa un adicional <Green>0.5x</> <YellowH>(→ 0.6x)</> de daño por <Green>5</> segundos. <YellowH>Cada golpe tiene un</> <GreenH>15%</> <YellowH>de probabilidad de aplicar</> <DarkGreenH>Veneno</> <YellowH>, causando un adicional</> <BlueH>18</> <YellowH>daño por</> <GreenH>6</> <YellowH>segundos.</>\"\n\n#. Key:\tRuneStoneWeaponFlame_level_up_desc_1\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.LevelUpBasedDescOverride(1).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.LevelUpBasedDescOverride(1).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Enchants your active weapon - it causes an additional <Green>0.6x</><YellowH>(→0.7x)</> damage for <Green>5</><YellowH>(→6)</> seconds. Each strike has a <Green>15%</><YellowH>(→20%)</> chance to apply <DarkGreen>Poison</>, causing an additional <Blue>18</><YellowH>(→24)</> damage over <Green>6</> seconds.\"\nmsgstr \"Encanta tu arma activa - causa un adicional <Green>0.6x</> <YellowH>(→ 0.7x)</> de daño por <Green>5</> <YellowH>(→ 6)</> segundos. Cada golpe tiene un <Green>15%</><YellowH>(→ 20%)</> de probabilidad de aplicar <DarkGreen>Veneno</>, causando un adicional <Blue>18</> <YellowH>(→ 24)</> de daño por<Green>6</> segundos.\"\n\n#. Key:\tRuneStoneWeaponFlame_level_up_desc_2\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.LevelUpBasedDescOverride(2).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.LevelUpBasedDescOverride(2).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Enchants your active weapon - it causes an additional <Green>0.7x</><YellowH>(→0.8x)</> damage for <Green>6</> seconds. Each strike has a <Green>20%</><YellowH>(→25%)</> chance to apply <DarkGreen>Poison</>, causing an additional <Blue>24</><YellowH>(→30)</> damage over <Green>6</> seconds.\"\nmsgstr \"Encanta tu arma activa - causa un adicional <Green>0.7x</> <YellowH>(→ 0.8x)</> de daño por <Green>6</> segundos. Cada golpe tiene un <Green>20%</> <YellowH>(→ 25%)</> de probabilidad de aplicar <DarkGreen>Veneno</>, causando un adicional <Blue>24</> <YellowH>(→ 30)</> de daño por <Green>6</> segundos.\"\n\n#. Key:\tRuneStoneWeaponFlame_level_up_desc_3\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.LevelUpBasedDescOverride(3).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.LevelUpBasedDescOverride(3).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Enchants your active weapon - it causes an additional <Green>0.8x</><YellowH>(→0.9x)</> damage for <Green>6</> seconds. Each strike has a <Green>25%</><YellowH>(→30%)</> chance to apply <DarkGreen>Poison</>, causing an additional <Blue>30</><YellowH>(→36)</> damage over <Green>6</> seconds.\"\nmsgstr \"Encanta tu arma activa - causa un adicional <Green>0.8x</> <YellowH>(→ 0.9x)</> de daño por <Green>6</> segundos. Cada golpe tiene un <Green>25%</> <YellowH>(→ 30%)</> de probabilidad de aplicar <DarkGreen>Veneno</>, causando un adicional <Blue>30</> <YellowH>(→ 36)</> de daño por<Green>6</> segundos.\"\n\n#. Key:\tRuneStoneWeaponFlame_name\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.Name\n#: /Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.Name\nmsgctxt \"ItemData\"\nmsgid \"Green Flamestone\"\nmsgstr \"Piedra de Fuego Verde\"\n\n#. Key:\tSabre_desc\n#. SourceLocation:\t/Game/SO/Items/Weapons/Sabre.Sabre.Description\n#: /Game/SO/Items/Weapons/Sabre.Sabre.Description\nmsgctxt \"ItemData\"\nmsgid \"Rangol was a legendary blacksmith who practiced his crafting art for a hundred years. This sabre was made on day one.\"\nmsgstr \"Rangol fue un herrero legendario que practicó su arte artesanal durante cien años. Hizo este sable un día.\"\n\n#. Key:\tSabre_name\n#. SourceLocation:\t/Game/SO/Items/Weapons/Sabre.Sabre.Name\n#: /Game/SO/Items/Weapons/Sabre.Sabre.Name\nmsgctxt \"ItemData\"\nmsgid \"First Sabre of Rangol\"\nmsgstr \"Primer Sable de Rangol\"\n\n#. Key:\tSecondChance_desc\n#. SourceLocation:\t/Game/SO/Items/RuneStones/SecondChance.SecondChance.Description\n#: /Game/SO/Items/RuneStones/SecondChance.SecondChance.Description\nmsgctxt \"ItemData\"\nmsgid \"Prevents death.\"\nmsgstr \"Previene la muerte.\"\n\n#. Key:\tSecondChance_name\n#. SourceLocation:\t/Game/SO/Items/RuneStones/SecondChance.SecondChance.Name\n#: /Game/SO/Items/RuneStones/SecondChance.SecondChance.Name\nmsgctxt \"ItemData\"\nmsgid \"Chancestone\"\nmsgstr \"Piedra de Oportunidad\"\n\n#. Key:\tSecretWeirdDevice_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/SecretWeirdDevice.SecretWeirdDevice.Description\n#: /Game/SO/Items/QuestItems/SecretWeirdDevice.SecretWeirdDevice.Description\nmsgctxt \"ItemData\"\nmsgid \"A weird device, most likely one of the inventions of the Secret Science Society.\"\nmsgstr \"Un aparato extraño, muy probable ser uno de los inventos de la Sociedad Secreta de Ciencias.\"\n\n#. Key:\tSecretWeirdDevice_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/SecretWeirdDevice.SecretWeirdDevice.Name\n#: /Game/SO/Items/QuestItems/SecretWeirdDevice.SecretWeirdDevice.Name\nmsgctxt \"ItemData\"\nmsgid \"Weird Device\"\nmsgstr \"Aparato Extraño\"\n\n#. Key:\tShardAmber_desc\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardAmber.ShardAmber.Description\n#: /Game/SO/Items/Shards/ShardAmber.ShardAmber.Description\nmsgctxt \"ItemData\"\nmsgid \"Each melee strike has an additional <Yellow>10%</> chance to cause a critical hit, causing <Green>200%</> of your normal weapon damage.\"\nmsgstr \"Cada ataque cuerpo a cuerpo tiene un adicional <Yellow>10%</> posibilidad de causar un golpe crítico, causando <Green>200%</> de tu daño de arma normal.\"\n\n#. Key:\tShardAmber_name\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardAmber.ShardAmber.Name\n#: /Game/SO/Items/Shards/ShardAmber.ShardAmber.Name\nmsgctxt \"ItemData\"\nmsgid \"Amber Shard\"\nmsgstr \"Fragmento de Ámbar\"\n\n#. Key:\tShardAmberBright_desc\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardAmberBright.ShardAmberBright.Description\n#: /Game/SO/Items/Shards/ShardAmberBright.ShardAmberBright.Description\nmsgctxt \"ItemData\"\nmsgid \"Each melee strike has an additional <Yellow>20%</> chance to cause a critical hit, causing <Green>200%</> of your normal weapon damage.\"\nmsgstr \"Cada ataque cuerpo a cuerpo tiene un adicional <Yellow>20%</> posibilidad de causar un golpe crítico, causando <Green>200%</> de daño de tu arma normal.\"\n\n#. Key:\tShardAmberBright_name\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardAmberBright.ShardAmberBright.Name\n#: /Game/SO/Items/Shards/ShardAmberBright.ShardAmberBright.Name\nmsgctxt \"ItemData\"\nmsgid \"Bright Amber Shard\"\nmsgstr \"Fragmento de Ámbar Brillante\"\n\n#. Key:\tShardAqua_desc\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardAqua.ShardAqua.Description\n#: /Game/SO/Items/Shards/ShardAqua.ShardAqua.Description\nmsgctxt \"ItemData\"\nmsgid \"Cooldown recharge speed is increased by <Blue>20%</>.\"\nmsgstr \"La velocidad de recarga de enfriamiento aumenta en un <Blue>20%</> .\"\n\n#. Key:\tShardAqua_name\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardAqua.ShardAqua.Name\n#: /Game/SO/Items/Shards/ShardAqua.ShardAqua.Name\nmsgctxt \"ItemData\"\nmsgid \"Aqua Shard\"\nmsgstr \"Fragmento de Aguamarina\"\n\n#. Key:\tShardAquaBright_desc\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardAquaBright.ShardAquaBright.Description\n#: /Game/SO/Items/Shards/ShardAquaBright.ShardAquaBright.Description\nmsgctxt \"ItemData\"\nmsgid \"Cooldown recharge speed is increased by <Blue>40%</>.\"\nmsgstr \"La velocidad de recarga de enfriamiento aumenta en un <Blue>40%</>.\"\n\n#. Key:\tShardAquaBright_name\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardAquaBright.ShardAquaBright.Name\n#: /Game/SO/Items/Shards/ShardAquaBright.ShardAquaBright.Name\nmsgctxt \"ItemData\"\nmsgid \"Bright Aqua Shard\"\nmsgstr \"Fragmento de Aguamarina Brillante\"\n\n#. Key:\tShardBlack_desc\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardBlack.ShardBlack.Description\n#: /Game/SO/Items/Shards/ShardBlack.ShardBlack.Description\nmsgctxt \"ItemData\"\nmsgid \"Every time an enemy hits you with a melee strike or overlaps you it is turned into a boot for a short time.\"\nmsgstr \"Cada vez que un enemigo te golpea con un ataque cuerpo a cuerpo o se superpone, se convierte en una bota por un corto tiempo.\"\n\n#. Key:\tShardBlack_name\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardBlack.ShardBlack.Name\n#: /Game/SO/Items/Shards/ShardBlack.ShardBlack.Name\nmsgctxt \"ItemData\"\nmsgid \"Black Shard\"\nmsgstr \"Fragmento Negro\"\n\n#. Key:\tShardBlue_desc\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardBlue.ShardBlue.Description\n#: /Game/SO/Items/Shards/ShardBlue.ShardBlue.Description\nmsgctxt \"ItemData\"\nmsgid \"Decreases the incoming <Blue>Magical Damage</> by <Blue>20%.</>\"\nmsgstr \"Disminuye la entrada de <Blue>Daño Mágico</> un <Blue>20%</>\"\n\n#. Key:\tShardBlue_name\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardBlue.ShardBlue.Name\n#: /Game/SO/Items/Shards/ShardBlue.ShardBlue.Name\nmsgctxt \"ItemData\"\nmsgid \"Blue Shard\"\nmsgstr \"Fragmento Azul\"\n\n#. Key:\tShardBlueBright_desc\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardBlueBright.ShardBlueBright.Description\n#: /Game/SO/Items/Shards/ShardBlueBright.ShardBlueBright.Description\nmsgctxt \"ItemData\"\nmsgid \"Decreases the incoming <Blue>Magical Damage</> by <Blue>30%.</>\"\nmsgstr \"Disminuye la entrada de <Blue>Daño Mágico</> un <Blue>30%</>\"\n\n#. Key:\tShardBlueBright_name\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardBlueBright.ShardBlueBright.Name\n#: /Game/SO/Items/Shards/ShardBlueBright.ShardBlueBright.Name\nmsgctxt \"ItemData\"\nmsgid \"Bright Blue Shard\"\nmsgstr \"Fragmento Azul Brillante\"\n\n#. Key:\tShardGreen_desc\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardGreen.ShardGreen.Description\n#: /Game/SO/Items/Shards/ShardGreen.ShardGreen.Description\nmsgctxt \"ItemData\"\nmsgid \"Increases the attack speed by <Green>20%</>\"\nmsgstr \"Aumenta la velocidad de ataque en un <Green>20%</>\"\n\n#. Key:\tShardGreen_name\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardGreen.ShardGreen.Name\n#: /Game/SO/Items/Shards/ShardGreen.ShardGreen.Name\nmsgctxt \"ItemData\"\nmsgid \"Green Shard\"\nmsgstr \"Fragmento Verde\"\n\n#. Key:\tShardGreenBright_desc\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardGreenBright.ShardGreenBright.Description\n#: /Game/SO/Items/Shards/ShardGreenBright.ShardGreenBright.Description\nmsgctxt \"ItemData\"\nmsgid \"Increases the attack speed by <Green>30%</>\"\nmsgstr \"Aumenta la velocidad de ataque en un <Green>30%</>\"\n\n#. Key:\tShardGreenBright_name\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardGreenBright.ShardGreenBright.Name\n#: /Game/SO/Items/Shards/ShardGreenBright.ShardGreenBright.Name\nmsgctxt \"ItemData\"\nmsgid \"Bright Green Shard\"\nmsgstr \"Fragmento Verde Brillante\"\n\n#. Key:\tShardPurple_desc\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardPurple.ShardPurple.Description\n#: /Game/SO/Items/Shards/ShardPurple.ShardPurple.Description\nmsgctxt \"ItemData\"\nmsgid \"Each time you cast a charge based spell you have a <Purple>25%</> chance to regain the charge.\"\nmsgstr \"Cada vez que lanzas un hechizo basado cargado tienes un <Purple>25%</> de probabilidad de recuperar la carga.\"\n\n#. Key:\tShardPurple_name\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardPurple.ShardPurple.Name\n#: /Game/SO/Items/Shards/ShardPurple.ShardPurple.Name\nmsgctxt \"ItemData\"\nmsgid \"Purple Shard\"\nmsgstr \"Fragmento Morado\"\n\n#. Key:\tShardPurpleBright_desc\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardPurpleBright.ShardPurpleBright.Description\n#: /Game/SO/Items/Shards/ShardPurpleBright.ShardPurpleBright.Description\nmsgctxt \"ItemData\"\nmsgid \"Each time you cast a charge based spell you have a <Purple>50%</> chance to regain the charge.\"\nmsgstr \"Cada vez que lanzas un hechizo cargado tienes un <Purple>50%</> de probabilidad de recuperar la carga.\"\n\n#. Key:\tShardPurpleBright_name\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardPurpleBright.ShardPurpleBright.Name\n#: /Game/SO/Items/Shards/ShardPurpleBright.ShardPurpleBright.Name\nmsgctxt \"ItemData\"\nmsgid \"Bright Purple Shard\"\nmsgstr \"Fragmento Morado Brillante\"\n\n#. Key:\tShardRed_desc\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardRed.ShardRed.Description\n#: /Game/SO/Items/Shards/ShardRed.ShardRed.Description\nmsgctxt \"ItemData\"\nmsgid \"You heal <Red>5%</> of the melee damage you inflict on your enemies.\"\nmsgstr \"Recibes <Red>5%</> de salud del daño cuerpo a cuerpo que infliges a tus enemigos.\"\n\n#. Key:\tShardRed_name\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardRed.ShardRed.Name\n#: /Game/SO/Items/Shards/ShardRed.ShardRed.Name\nmsgctxt \"ItemData\"\nmsgid \"Red Shard\"\nmsgstr \"Fragmento Rojo\"\n\n#. Key:\tShardRedBright_desc\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardRedBright.ShardRedBright.Description\n#: /Game/SO/Items/Shards/ShardRedBright.ShardRedBright.Description\nmsgctxt \"ItemData\"\nmsgid \"You heal <Red>10%</> of the melee damage you inflict on your enemies.\"\nmsgstr \"Recibes <Red>10%</> de salud del daño cuerpo a cuerpo que infliges a tus enemigos.\"\n\n#. Key:\tShardRedBright_name\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardRedBright.ShardRedBright.Name\n#: /Game/SO/Items/Shards/ShardRedBright.ShardRedBright.Name\nmsgctxt \"ItemData\"\nmsgid \"Bright Red Shard\"\nmsgstr \"Fragmento Rojo Brillante\"\n\n#. Key:\tShardSilver_desc\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardSilver.ShardSilver.Description\n#: /Game/SO/Items/Shards/ShardSilver.ShardSilver.Description\nmsgctxt \"ItemData\"\nmsgid \"Decreases the incoming <White>Physical Damage</> by <White>20%.</>\"\nmsgstr \"Disminuye la entrada de <White>Daño Físico</> un <White>20%</>\"\n\n#. Key:\tShardSilver_name\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardSilver.ShardSilver.Name\n#: /Game/SO/Items/Shards/ShardSilver.ShardSilver.Name\nmsgctxt \"ItemData\"\nmsgid \"Silver Shard\"\nmsgstr \"Fragmento de Plata\"\n\n#. Key:\tShardSilverBright_desc\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardSilverBright.ShardSilverBright.Description\n#: /Game/SO/Items/Shards/ShardSilverBright.ShardSilverBright.Description\nmsgctxt \"ItemData\"\nmsgid \"Decreases the incoming <White>Physical Damage</> by <White>30%.</>\"\nmsgstr \"Disminuye la entrada de <White>Daño Físico</> un <White>30%</>\"\n\n#. Key:\tShardSilverBright_name\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardSilverBright.ShardSilverBright.Name\n#: /Game/SO/Items/Shards/ShardSilverBright.ShardSilverBright.Name\nmsgctxt \"ItemData\"\nmsgid \"Bright Silver Shard\"\nmsgstr \"Fragmento de Plata Brillante\"\n\n#. Key:\tShardTeal_desc\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardTeal.ShardTeal.Description\n#: /Game/SO/Items/Shards/ShardTeal.ShardTeal.Description\nmsgctxt \"ItemData\"\nmsgid \"Each time an enemy hits you with a melee strike it suffers the same damage.\"\nmsgstr \"Cada vez que un enemigo te golpea con un ataque cuerpo a cuerpo, sufre el mismo daño.\"\n\n#. Key:\tShardTeal_name\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardTeal.ShardTeal.Name\n#: /Game/SO/Items/Shards/ShardTeal.ShardTeal.Name\nmsgctxt \"ItemData\"\nmsgid \"Teal Shard\"\nmsgstr \"Fragmento Trullo\"\n\n#. Key:\tShardTealBright_desc\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardTealBright.ShardTealBright.Description\n#: /Game/SO/Items/Shards/ShardTealBright.ShardTealBright.Description\nmsgctxt \"ItemData\"\nmsgid \"Each time an enemy hits you, it suffers <Green>200%</> of the damage.\"\nmsgstr \"Cada vez que un enemigo te golpea, sufre <Green>200%</> del daño.\"\n\n#. Key:\tShardTealBright_name\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardTealBright.ShardTealBright.Name\n#: /Game/SO/Items/Shards/ShardTealBright.ShardTealBright.Name\nmsgctxt \"ItemData\"\nmsgid \"Bright Teal Shard\"\nmsgstr \"Fragmento de Trullo Brillante\"\n\n#. Key:\tShardWhite_desc\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardWhite.ShardWhite.Description\n#: /Game/SO/Items/Shards/ShardWhite.ShardWhite.Description\nmsgctxt \"ItemData\"\nmsgid \"Increases your damage by <Green>20%</>\"\nmsgstr \"Aumenta tu daño en un <Green>20%</>\"\n\n#. Key:\tShardWhite_name\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardWhite.ShardWhite.Name\n#: /Game/SO/Items/Shards/ShardWhite.ShardWhite.Name\nmsgctxt \"ItemData\"\nmsgid \"White Shard\"\nmsgstr \"Fragmento Blanco\"\n\n#. Key:\tShardWhiteBright_desc\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardWhiteBright.ShardWhiteBright.Description\n#: /Game/SO/Items/Shards/ShardWhiteBright.ShardWhiteBright.Description\nmsgctxt \"ItemData\"\nmsgid \"Increases your damage by <Green>30%</>.\"\nmsgstr \"Aumenta tu daño en un <Green>30%</>.\"\n\n#. Key:\tShardWhiteBright_name\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardWhiteBright.ShardWhiteBright.Name\n#: /Game/SO/Items/Shards/ShardWhiteBright.ShardWhiteBright.Name\nmsgctxt \"ItemData\"\nmsgid \"Bright White Shard\"\nmsgstr \"Fragmento Blanco Brillante\"\n\n#. Key:\tShardYellow_desc\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardYellow.ShardYellow.Description\n#: /Game/SO/Items/Shards/ShardYellow.ShardYellow.Description\nmsgctxt \"ItemData\"\nmsgid \"Each melee strike has a <Yellow>10%</> chance to <Yellow>Stun</> the target.\"\nmsgstr \"Cada ataque cuerpo a cuerpo tiene un <Yellow>10%</> de probabilidad de <Yellow>Aturdir</> el objetivo.\"\n\n#. Key:\tShardYellow_name\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardYellow.ShardYellow.Name\n#: /Game/SO/Items/Shards/ShardYellow.ShardYellow.Name\nmsgctxt \"ItemData\"\nmsgid \"Yellow Shard\"\nmsgstr \"Fragmento Amarillo\"\n\n#. Key:\tShardYellowBright_desc\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardYellowBright.ShardYellowBright.Description\n#: /Game/SO/Items/Shards/ShardYellowBright.ShardYellowBright.Description\nmsgctxt \"ItemData\"\nmsgid \"Each melee strike has a <Yellow>20%</> chance to <Yellow>Stun</> the target.\"\nmsgstr \"Cada ataque cuerpo a cuerpo tiene un <Yellow>20%</> de probabilidad de <Yellow>Aturdir</> el objetivo.\"\n\n#. Key:\tShardYellowBright_name\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardYellowBright.ShardYellowBright.Name\n#: /Game/SO/Items/Shards/ShardYellowBright.ShardYellowBright.Name\nmsgctxt \"ItemData\"\nmsgid \"Bright Yellow Shard\"\nmsgstr \"Fragmento Amarillo Brillante\"\n\n#. Key:\tSpellCaster_desc\n#. SourceLocation:\t/Game/SO/Items/Useable/SpellCaster.SpellCaster.Description\n#: /Game/SO/Items/Useable/SpellCaster.SpellCaster.Description\nmsgctxt \"ItemData\"\nmsgid \"A magical artefact with the following worn text engraved on the back:\\r\\n\\r\\nInsert Runestones to ... spells\\r\\nKeep .... .... children\\r\\nMade in .....\"\nmsgstr \"Un artefacto mágico con el siguiente texto desgastado grabado en la parte posterior:\\n\\nInsertar Runestones a... hechizos\\nMantener …. …. niños\\nHecho en ….\"\n\n#. Key:\tSpellCaster_name\n#. SourceLocation:\t/Game/SO/Items/Useable/SpellCaster.SpellCaster.Name\n#: /Game/SO/Items/Useable/SpellCaster.SpellCaster.Name\nmsgctxt \"ItemData\"\nmsgid \"Spellcaster\"\nmsgstr \"Lanza Hechizos\"\n\n#. Key:\tStraightSword_desc\n#. SourceLocation:\t/Game/SO/Items/Weapons/StraightSword.StraightSword.Description\n#: /Game/SO/Items/Weapons/StraightSword.StraightSword.Description\nmsgctxt \"ItemData\"\nmsgid \"A simple yet effective weapon. Not too rusty, not too sharp. If someone looks close enough it looks a bit low budget, but the ones looking close enough won't talk about anything anymore, will they?\"\nmsgstr \"Un arma simple pero efectiva. No muy oxidado, no muy afilado. Si alguien lo mira lo suficientemente cerca, parece hecho de un presupuesto pequeño, pero los que miran lo suficientemente cerca ya no hablarán de nada, ¿verdad?\"\n\n#. Key:\tStraightSword_name\n#. SourceLocation:\t/Game/SO/Items/Weapons/StraightSword.StraightSword.Name\n#: /Game/SO/Items/Weapons/StraightSword.StraightSword.Name\nmsgctxt \"ItemData\"\nmsgid \"Straight Sword\"\nmsgstr \"Espada Recta\"\n\n#. Key:\tTestStoneBag_desc\n#. SourceLocation:\t/Game/SO/Items/Useable/TestStoneBag.TestStoneBag.Description\n#: /Game/SO/Items/Useable/TestStoneBag.TestStoneBag.Description\nmsgctxt \"ItemData\"\nmsgid \"When you are the one in the team who has the job to enter every dungeon first, you will become a careful one too... if you live long enough for that.\"\nmsgstr \"Cuando eres el único en el equipo que tiene el trabajo de entrar primero a cada mazmorra, también serás cuidadoso... si vives lo suficiente para eso.\"\n\n#. Key:\tTestStoneBag_name\n#. SourceLocation:\t/Game/SO/Items/Useable/TestStoneBag.TestStoneBag.Name\n#: /Game/SO/Items/Useable/TestStoneBag.TestStoneBag.Name\nmsgctxt \"ItemData\"\nmsgid \"Bag of the Careful One\"\nmsgstr \"Bolsa del cuidadoso\"\n\n#. Key:\tWheel_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/Wheel.Wheel.Description\n#: /Game/SO/Items/QuestItems/Wheel.Wheel.Description\nmsgctxt \"ItemData\"\nmsgid \"One of the first greatest inventions of humans. Because they envied balls for their rolling skill.\"\nmsgstr \"Uno de los primeros grandes inventos de los humanos. Porque envidiaban las pelotas por su habilidad para rodar.\"\n\n#. Key:\tWheel_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/Wheel.Wheel.Name\n#: /Game/SO/Items/QuestItems/Wheel.Wheel.Name\nmsgctxt \"ItemData\"\nmsgid \"Wheel\"\nmsgstr \"Rueda\"\n\n#. Key:\tWWBossShipLock_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/WWBossShipLock.WWBossShipLock.Description\n#: /Game/SO/Items/Keys/WWBossShipLock.WWBossShipLock.Description\nmsgctxt \"ItemData\"\nmsgid \"Rusty key of a rusty lock.\"\nmsgstr \"Llave oxidada de una cerradura oxidada.\"\n\n#. Key:\tWWBossShipLock_name\n#. SourceLocation:\t/Game/SO/Items/Keys/WWBossShipLock.WWBossShipLock.Name\n#: /Game/SO/Items/Keys/WWBossShipLock.WWBossShipLock.Name\nmsgctxt \"ItemData\"\nmsgid \"Rusty Key\"\nmsgstr \"Llave Oxidada\"\n\n#. Key:\t0BFD568E4989A20D66B91DA476C0E6B4\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_6.Text\n#: /Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_6.Text\nmsgctxt \"Notes\"\nmsgid \"I promised Fountain to give its flower to the Magic Mirror.\"\nmsgstr \"Le prometí al Fuente darle su flor al Espejo Mágico.\"\n\n#. Key:\t1ABD11A64A7649801A6AB6A8BBDC686C\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_9.Text\n#: /Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_9.Text\nmsgctxt \"Notes\"\nmsgid \"The Ghost Dwarf needs a ghost abacus\"\nmsgstr \"Fantasnano necesita un ábaco fantasma\"\n\n#. Key:\t57CBE1274A1B4EC7FD68EA9288161AAD\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_7.Text\n#: /Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_7.Text\nmsgctxt \"Notes\"\nmsgid \"The Chef wants me to clear the shore\"\nmsgstr \"El Cocinero quiere que limpie la orilla\"\n\n#. Key:\t77693D6C43702786250364932BD34BCD\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note.Text\n#: /Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note.Text\nmsgctxt \"Notes\"\nmsgid \"The GateKeeper could use a chair\"\nmsgstr \"El Guardián de la Puerta podría usar una silla\"\n\n#. Key:\t9C3FB78C4598A48BC187B580CBB070F6\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_8.Text\n#: /Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_8.Text\nmsgctxt \"Notes\"\nmsgid \"The Dwarf wants me to clear the Dwarven Fortress\"\nmsgstr \"El Enano quiere que limpie la fortaleza de los Enanos\"\n\n#. Key:\tAA94EB6E4B0A505D730971932A3DE0CC\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_5.Text\n#: /Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_5.Text\nmsgctxt \"Notes\"\nmsgid \"The Golem Maker wants me to hunt some Golems\"\nmsgstr \"El Creador de Golems quiere que cace algunos Golems\"\n\n#. Key:\tAE371E564EC1D75947ECF98AAA896A2C\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_11.Text\n#: /Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_11.Text\nmsgctxt \"Notes\"\nmsgid \"A Pipe Walker is trapped in a cage\"\nmsgstr \"Un Trotadesagüe está atrapado en una jaula\"\n\n#. Key:\tB12481ED4CFF0182EDB7ACAA416B55FC\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_4.Text\n#: /Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_4.Text\nmsgctxt \"Notes\"\nmsgid \"Gnory needs a wheel\"\nmsgstr \"Gnory necesita una rueda\"\n\n#. Key:\tD3B6D81E433CBE8461E2B1AFE06E9741\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_13.Text\n#: /Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_13.Text\nmsgctxt \"Notes\"\nmsgid \"The Chef asked me to bring him some Purple Mushroom\"\nmsgstr \"El Cocinero me pidió que le trajera unas Setas Moradas\"\n\n#. Key:\tD8C4FFC7435C6A2E7C88BBA7109A1907\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_12.Text\n#: /Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_12.Text\nmsgctxt \"Notes\"\nmsgid \"I need to learn Dwarven to open a gate\"\nmsgstr \"Necesito aprender el lenguaje de los Enanos para abrir una puerta\"\n\n#. Key:\tE3857F07468C2A0B34A98887E3BBB1DA\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_10.Text\n#: /Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_10.Text\nmsgctxt \"Notes\"\nmsgid \"I feel the Tomb of Tabby is important somehow\"\nmsgstr \"Siento que la Tumba de Tabby es importante de alguna manera\"\n\n#. Key:\tE9DA40684B9375A5F78D18A138C75174\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_2.Text\n#: /Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_2.Text\nmsgctxt \"Notes\"\nmsgid \"Teachy asked for a strangely unique device\"\nmsgstr \"Teachy pidió un aparato extrañamente único\"\n\n#. Key:\tF109A1614B16565CC1846C8D0A46672E\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_1.Text\n#: /Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_1.Text\nmsgctxt \"Notes\"\nmsgid \"I promised Lory to bring her some books\"\nmsgstr \"Le prometí a Lory que le llevaría algunos libros\"\n\n#. Key:\taway\n#. SourceLocation:\tSource/SOrb/UI/InGame/SoUIStationPanel.cpp:98\n#: Source/SOrb/UI/InGame/SoUIStationPanel.cpp:98\nmsgctxt \"StationNames\"\nmsgid \"World's End\"\nmsgstr \"Fin del Mundo\"\n\n#. Key:\tcrossroadcave\n#. SourceLocation:\tSource/SOrb/UI/InGame/SoUIStationPanel.cpp:94\n#: Source/SOrb/UI/InGame/SoUIStationPanel.cpp:94\nmsgctxt \"StationNames\"\nmsgid \"Crossroad Cave\"\nmsgstr \"Cueva Cruce Caminos\"\n\n#. Key:\tlavatemple\n#. SourceLocation:\tSource/SOrb/UI/InGame/SoUIStationPanel.cpp:96\n#: Source/SOrb/UI/InGame/SoUIStationPanel.cpp:96\nmsgctxt \"StationNames\"\nmsgid \"Remnant Road\"\nmsgstr \"Camino Remanente\"\n\n#. Key:\toutpost\n#. SourceLocation:\tSource/SOrb/UI/InGame/SoUIStationPanel.cpp:95\n#: Source/SOrb/UI/InGame/SoUIStationPanel.cpp:95\nmsgctxt \"StationNames\"\nmsgid \"Obedient Outpost\"\nmsgstr \"Puesto Avanzado Obediente\"\n\n#. Key:\tstay\n#. SourceLocation:\tSource/SOrb/UI/InGame/SoUIStationPanel.cpp:99\n#: Source/SOrb/UI/InGame/SoUIStationPanel.cpp:99\nmsgctxt \"StationNames\"\nmsgid \"Stay\"\nmsgstr \"Permanecer\"\n\n#. Key:\twrackedWaters\n#. SourceLocation:\tSource/SOrb/UI/InGame/SoUIStationPanel.cpp:97\n#: Source/SOrb/UI/InGame/SoUIStationPanel.cpp:97\nmsgctxt \"StationNames\"\nmsgid \"Wracked Waters\"\nmsgstr \"Aguas Destrozadas\"\n\n"
  },
  {
    "path": "Content/Localization/Warriorb/fr/Warriorb.po",
    "content": "﻿# Warriorb French translation.\n# Copyright 1998-2019 Epic Games, Inc. All Rights Reserved.\n# \nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: Warriorb\\n\"\n\"POT-Creation-Date: 2020-10-07 08:12\\n\"\n\"PO-Revision-Date: 2020-10-07 08:12\\n\"\n\"Language-Team: \\n\"\n\"Language: fr\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Plural-Forms: nplurals=2; plural=(n > 1);\\n\"\n\n#. Key:\t78A72CB345FCC7ECDCFD8181471D78D8\n#. SourceLocation:\t/Game/SO/GUI/UI_Credits.UI_Credits_C:WidgetTree.CreditsText.Text\n#: /Game/SO/GUI/UI_Credits.UI_Credits_C:WidgetTree.CreditsText.Text\nmsgid \"<T>-- Not Yet Team --</>\\r\\n\\r\\n\\r\\nAnna Molnár\\r\\n<R>2D art, Environment Design</>\\r\\n\\r\\n\\r\\nCsaba Molnár\\r\\n<R>Code, Design</>\\r\\n\\r\\n\\r\\nDaniel Butum\\r\\n<R>Code</>\\r\\n\\r\\n\\r\\nGéza Molnár\\r\\n<R>3D art, Design</>\\r\\n\\r\\n\\r\\nRichárd Ráski\\r\\n<R>Sound Design</>\\r\\n\\r\\n\\r\\n\\r\\n<T>-- Music --</>\\r\\n\\r\\nBenjámin Kuli\\r\\n\\r\\n\\r\\nGisula\\r\\n\\r\\n\\r\\n\\r\\n<T>-- Voice Over --</>\\r\\n\\r\\n\\r\\nPeter Luzsi - @peterluzsi\\r\\n<R>WarriOrb, Gatekeeper, Ghost Armor, Principal</>\\r\\n\\r\\n\\r\\nBrent Miller\\r\\n<R>WarriOrb - Trailer</>\\r\\n\\r\\n\\r\\nPierce Riola\\r\\n<R>Wizard, Gnory</>\\r\\n\\r\\n\\r\\nEir Causey\\r\\n<R>Raven, Teachy, Ghost Dwarf, Unknown Wizard, Fishy</>\\r\\n\\r\\n\\r\\nJack Broadbent\\r\\n<R>Monk, Flybug</>\\r\\n\\r\\n\\r\\nEmil Hagg\\r\\n<R>Supper Dwarf, Kobold Chef, Fallen Druid, Dwarven Statue</>\\r\\n\\r\\n\\r\\nErick Nita\\r\\n<R>Golem Maker, Armour Wrath</>\\r\\n\\r\\n\\r\\nAlain Vega\\r\\n<R>Merch Ant</>\\r\\n\\r\\n\\r\\nAngela Tran\\r\\n<R>Lillian, Pipe Walker</>\\r\\n\\r\\n\\r\\nBrittany Ann Phillips\\r\\n<R>Lory</>\\r\\n\\r\\n\\r\\nAurore Gautheur\\r\\n<R>Fountain, Shade</>\\r\\n\\r\\n\\r\\nAlexander Blairlex\\r\\n<R>Primitive Fishy, Ghost Helmet</>\\r\\n\\r\\n\\r\\nSophie Ryder\\r\\n<R>Shadesphere</>\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n<T>-- Partners --</>\\r\\n\\r\\n\\r\\nMaple Whispering\\r\\n<R>Chineese localization</>\\r\\n<R>Publisher - China, PC</>\\r\\n\\r\\n\\r\\nNovy Unlimited\\r\\n<R>PR and Marketing</>\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n<T>-- Localization --</>\\r\\n\\r\\n\\r\\nVera Liscovschi\\r\\n<R>Russian</>\\r\\n\\r\\n\\r\\nJay Johnstone\\r\\n<R>Spanish</>\\r\\n\\r\\n\\r\\nBertin William\\r\\n<R>French</>\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n<T>-- Testers --</>\\r\\n\\r\\n\\r\\nSaleymander\\r\\n\\r\\n\\r\\nHitch\\r\\n\\r\\n\\r\\nMrCalculated\\r\\n\\r\\n\\r\\n<img id=\\\"Rainbow\\\"/>Scorpion253<img id=\\\"Rainbow\\\"/>\\r\\n\\r\\n\\r\\nmoses\\r\\n\\r\\n\\r\\nNinjin42\\r\\n\\r\\n\\r\\nKonstantinos Xenitidis\\r\\n\\r\\n\\r\\nPhyronnaz\\r\\n\\r\\n\\r\\nArthur\\r\\n\\r\\n\\r\\nMaster1G\\r\\n\\r\\n\\r\\nDávid Bartók\\r\\n\\r\\n\\r\\nLiDuGaming\\r\\n\\r\\n\\r\\nClaudiu Coman\\r\\n\\r\\n\\r\\nÁron Ürögdi\\r\\n\\r\\n\\r\\nDukenukemboi\\r\\n\\r\\n\\r\\nBart Cools\\r\\n\\r\\n\\r\\nGlenn De Jonghe\\r\\n\\r\\n\\r\\nDomonkos Péter Madarász\\r\\n\\r\\n\\r\\nGergő Gyarmati\\r\\n\\r\\n\\r\\nRéka Gyarmati\\r\\n\\r\\n\\r\\nKincső Petraskó\\r\\n\\r\\n\\r\\nGergő Petraskó\\r\\n\\r\\n\\r\\nDániel Garamvölgyi\\r\\n\\r\\n\\r\\nDanny \\\"GHelmet\\\" Cloutier\\r\\n\\r\\n\\r\\nAnna Boglárka Tóth\\r\\n\\r\\n\\r\\nBíborka Roxána Kubik\\r\\n\\r\\n\\r\\nVirág Miklós\\r\\n\\r\\n\\r\\nBenedek Marozsák\\r\\n\\r\\n\\r\\nDániel Marozsák\\r\\n\\r\\n\\r\\nGereon Bartel\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n<T>-- Prologue Speedrun Competition Winner --</>\\r\\n\\r\\n-7\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n<T>-- Special Thanks --</>\\r\\n\\r\\n\\r\\nMalazan Discord Server Community\\r\\n\\r\\n\\r\\n/r/metroidvenia Discord Server Community\\r\\n\\r\\n\\r\\nUnreal Slackers Discord Server Community\\r\\n\\r\\n\\r\\nIMGUR\\r\\n\\r\\n\\r\\nBíborka Roxána Kubik\\r\\n\\r\\n\\r\\nSergiu Crăiţoiu\\r\\n\\r\\n\\r\\nJuhász Ernő\\r\\n\\r\\n\\r\\nRacheal Smith\\r\\n\\r\\n\\r\\nRuxandra Seniuc\\r\\n\\r\\n\\r\\nthottee\\r\\n\\r\\n\\r\\nAndrew Pappas\\r\\n\\r\\n\\r\\nJonathan Lampel\\r\\n\\r\\n\\r\\nRichárd Németh\\r\\n\\r\\n\\r\\nAlex Gorcea\\r\\n\\r\\n\\r\\nNotRealVitor\\r\\n\\r\\n\\r\\nKinga Surján\\r\\n\\r\\n\\r\\nAnna Boglárka Tóth\\r\\n\\r\\n\\r\\nÉvi Fekete\\r\\n\\r\\n\\r\\nGergő Sielaf\\r\\n\\r\\n\\r\\n<img id=\\\"Rainbow\\\"/>Scorpion253<img id=\\\"Rainbow\\\"/>\\r\\n\\r\\n\\r\\nMainiac\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n<T>-- Technology --</>\\r\\n\\r\\n\\r\\n<R>WarriOrb uses the Unreal® Engine.</>\\r\\n<R>Unreal® is a trademark or registered trademark of Epic Games, Inc. in the United States of America and elsewhere</>\\r\\n\\r\\n<R>Unreal® Engine, Copyright 1998 – 2020, Epic Games, Inc. All rights reserved.</>\\r\\n\\r\\n\\r\\n\\r\\n<R>Made with FMOD Studio by Firelight Technologies Pty Ltd.</>\"\nmsgstr \"<T>-- Not Yet Team --</>\\n\\n\\nAnna Molnár\\n<R>Art 2D, Design des Environnements</>\\n\\n\\nCsaba Molnár\\n<R>Code, Design</>\\n\\n\\nDaniel Butum\\n<R>Code</>\\n\\n\\nGéza Molnár\\n<R>Art 3D, Design</>\\n\\n\\nRichárd Ráski\\n<R>Sound Design</>\\n\\n\\n\\n<T>-- Musiques --</>\\n\\nBenjámin Kuli\\n\\n\\nGisula\\n\\n\\n\\n<T>-- Doublage des Voix --</>\\n\\n\\nPeter Luzsi - @peterluzsi\\n<R>WarriOrb, Gardien de la Porte, Armure Fantôme, Principal</>\\n\\n\\nBrent Miller\\n<R>WarriOrb - Trailer</>\\n\\n\\nPierce Riola\\n<R>Magicien, Gnory</>\\n\\n\\nEir Causey\\n<R>Corbeau, Prof, Nain Fantôme, Magicien Inconnu, Poiscaille</>\\n\\n\\nJack Broadbent\\n<R>Moine, Insecte</>\\n\\n\\nEmil Hagg\\n<R>Nain du Dîner, Chef Kobold, Druide Déchu, Statue Naine, Narrateur de l'introduction</>\\n\\n\\nErick Nita\\n<R> Créateur de Golem, Armure de Colère</>\\n\\n\\nAlain Vega\\n<R>Fourmi Marchande</>\\n\\n\\nAngela Tran\\n<R>Lillian, Tuyauteur</>\\n\\n\\nBrittany Ann Phillips\\n<R>Lory</>\\n\\n\\nAurore Gautheur\\n<R>Fontaine, Éclat</>\\n\\n\\nAlexander Blairlex\\n<R>Poiscaille Primitif, Heaume Fantôme</>\\n\\n\\nSophie Ryder\\n<R>Sphère de l'Ombre</>\\n\\n\\n\\n\\n<T>-- Partenaires --</>\\n\\n\\nMaple Whispering\\n<R>Localisation Chinoise</>\\n<R>Éditeur - Chine, PC</>\\n\\n\\nNovy Unlimited\\n<R>RP et Marketing</>\\n\\n\\n\\n\\n<T>-- Localisation --</>\\n\\n\\nVera Liscovschi\\n<R>Russe</>\\n\\n\\nJay Johnstone\\n<R>Espagnol</>\\n\\n\\nBertin William\\n<R>Français</>\\n\\n\\n\\n\\n<T>-- Testeurs --</>\\n\\n\\nSaleymander\\n\\n\\nHitch\\n\\n\\nMrCalculated\\n\\n\\n<img id=\\\"Rainbow\\\"/>Scorpion253<img id=\\\"Rainbow\\\"/>\\n\\n\\nmoses\\n\\n\\nNinjin42\\n\\n\\nKonstantinos Xenitidis\\n\\n\\nPhyronnaz\\n\\n\\nArthur\\n\\n\\nMaster1G\\n\\n\\nDávid Bartók\\n\\n\\nLiDuGaming\\n\\n\\nClaudiu Coman\\n\\n\\nÁron Ürögdi\\n\\n\\nDukenukemboi\\n\\n\\nBart Cools\\n\\n\\nGlenn De Jonghe\\n\\n\\nDomonkos Péter Madarász\\n\\n\\nGergő Gyarmati\\n\\n\\nRéka Gyarmati\\n\\n\\nKincső Petraskó\\n\\n\\nGergő Petraskó\\n\\n\\nDániel Garamvölgyi\\n\\n\\nDanny \\\"GHelmet\\\" Cloutier\\n\\n\\nAnna Boglárka Tóth\\n\\n\\nBíborka Roxána Kubik\\n\\n\\nVirág Miklós\\n\\n\\nBenedek Marozsák\\n\\n\\nDániel Marozsák\\n\\n\\nGereon Bartel\\n\\n\\n\\n\\n<T>-- Gagnant de la Compétition Speedrun du Prologue --</>\\n\\n-7\\n\\n\\n\\n\\n<T>-- Remerciements Spéciaux --</>\\n\\n\\nLa Communauté du Serveur Discord Malazan \\n\\n\\nLa Communauté du Serveur Discord /r/metroidvenia\\n\\n\\nLa Communauté du Serveur Discord Unreal Slackers\\n\\n\\nIMGUR\\n\\n\\nBíborka Roxána Kubik\\n\\n\\nSergiu Crăiţoiu\\n\\n\\nJuhász Ernő\\n\\n\\nRacheal Smith\\n\\n\\nRuxandra Seniuc\\n\\n\\nthottee\\n\\n\\nAndrew Pappas\\n\\n\\nJonathan Lampel\\n\\n\\nRichárd Németh\\n\\n\\nAlex Gorcea\\n\\n\\nNotRealVitor\\n\\n\\nKinga Surján\\n\\n\\nAnna Boglárka Tóth\\n\\n\\nÉvi Fekete\\n\\n\\nGergő Sielaf\\n\\n\\n<img id=\\\"Rainbow\\\"/>Scorpion253<img id=\\\"Rainbow\\\"/>\\n\\n\\nMainiac\\n\\n\\n\\n\\n<T>-- Technologie --</>\\n\\n\\n<R>WarriOrb utilise le moteur Unreal® Engine.</>\\n<R>Unreal® est une marque commerciale ou une marque déposée d'Epic Games, Inc. aux États-Unis d'Amérique et ailleurs</>\\n\\n<R>Unreal® Engine, Copyright 1998 - 2020, Epic Games, Inc. Tous droits réservés.</>\\n\\n\\n<R>Réalisé avec FMOD Studio de Firelight Technologies Pty Ltd.</>\"\n\n#. Key:\tAxeSpecial_name\n#. SourceLocation:\t/Game/SO/CharacterStrikes/AxeSpecial.AxeSpecial.StrikeName\n#: /Game/SO/CharacterStrikes/AxeSpecial.AxeSpecial.StrikeName\nmsgctxt \"CharacterStrike\"\nmsgid \"Throw\"\nmsgstr \"Lancer\"\n\n#. Key:\tDemonSwordSpecial_name\n#. SourceLocation:\t/Game/SO/CharacterStrikes/DemonSwordSpecial.DemonSwordSpecial.StrikeName\n#: /Game/SO/CharacterStrikes/DemonSwordSpecial.DemonSwordSpecial.StrikeName\nmsgctxt \"CharacterStrike\"\nmsgid \"Downstrike\"\nmsgstr \"Coup Bas\"\n\n#. Key:\tDualBladeSpecial_name\n#. SourceLocation:\t/Game/SO/CharacterStrikes/DualBladeSpecial.DualBladeSpecial.StrikeName\n#: /Game/SO/CharacterStrikes/DualBladeSpecial.DualBladeSpecial.StrikeName\nmsgctxt \"CharacterStrike\"\nmsgid \"Backslash\"\nmsgstr \"Échappatoire\"\n\n#. Key:\tLeafMaceSpecial_name\n#. SourceLocation:\t/Game/SO/CharacterStrikes/LeafMaceSpecial.LeafMaceSpecial.StrikeName\n#: /Game/SO/CharacterStrikes/LeafMaceSpecial.LeafMaceSpecial.StrikeName\nmsgctxt \"CharacterStrike\"\nmsgid \"Crushing Blow\"\nmsgstr \"Coup Dur\"\n\n#. Key:\tSabreSpecial_name\n#. SourceLocation:\t/Game/SO/CharacterStrikes/SabreSpecial.SabreSpecial.StrikeName\n#: /Game/SO/CharacterStrikes/SabreSpecial.SabreSpecial.StrikeName\nmsgctxt \"CharacterStrike\"\nmsgid \"Floating Strikes\"\nmsgstr \"Attaques Flottantes\"\n\n#. Key:\tSwordSpecialAirStrike_name\n#. SourceLocation:\t/Game/SO/CharacterStrikes/SwordSpecialAirStrike.SwordSpecialAirStrike.StrikeName\n#: /Game/SO/CharacterStrikes/SwordSpecialAirStrike.SwordSpecialAirStrike.StrikeName\nmsgctxt \"CharacterStrike\"\nmsgid \"Air Strike\"\nmsgstr \"Attaque Aérienne\"\n\n#. Key:\tBPEftAttackSpeedMultiplier_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/BPEftAttackSpeedMultiplier.Default__BPEftAttackSpeedMultiplier_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/BPEftAttackSpeedMultiplier.Default__BPEftAttackSpeedMultiplier_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Quick Hands\"\nmsgstr \"Mains Rapides\"\n\n#. Key:\tBPEftBootTransmutation_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/BPEftBootTransmutation.Default__BPEftBootTransmutation_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/BPEftBootTransmutation.Default__BPEftBootTransmutation_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Protective Transmutation\"\nmsgstr \"Transmutation Protectrice\"\n\n#. Key:\tBPEftBounce_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftBounce.Default__BPEftBounce_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftBounce.Default__BPEftBounce_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Charged Bounce\"\nmsgstr \"Rebond Chargé\"\n\n#. Key:\tBPEftCooldownReducePassive02_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/BPEftCooldownReducePassive02.Default__BPEftCooldownReducePassive02_C.DisplayName\n#. Key:\tBPEftCooldownReduce_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/BPEftCooldownReduce.Default__BPEftCooldownReduce_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/BPEftCooldownReduce.Default__BPEftCooldownReduce_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/BPEftCooldownReducePassive02.Default__BPEftCooldownReducePassive02_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Restlessness\"\nmsgstr \"Inquiétude\"\n\n#. Key:\tBPEftCriticalChanceBoost10_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/BPEftCriticalChanceBoost10.Default__BPEftCriticalChanceBoost10_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/BPEftCriticalChanceBoost10.Default__BPEftCriticalChanceBoost10_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Critical Chance\"\nmsgstr \"Chance Critique\"\n\n#. Key:\tBPEftDamageReflection_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/BPEftDamageReflection.Default__BPEftDamageReflection_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/BPEftDamageReflection.Default__BPEftDamageReflection_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Sparks of Vengeance\"\nmsgstr \"Etincelles de Vengeance\"\n\n#. Key:\tBPEftDmgModifier_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftDmgModifier.Default__BPEftDmgModifier_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftDmgModifier.Default__BPEftDmgModifier_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Perfect Hands\"\nmsgstr \"Mains Parfaites\"\n\n#. Key:\tBPEftHeal3_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/BPEftHeal3.Default__BPEftHeal3_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/BPEftHeal3.Default__BPEftHeal3_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Heal\"\nmsgstr \"Soins\"\n\n#. Key:\tBPEftLifeLeech5_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/BPEftLifeLeech5.Default__BPEftLifeLeech5_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/BPEftLifeLeech5.Default__BPEftLifeLeech5_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Life Leech\"\nmsgstr \"Vol de Vie\"\n\n#. Key:\tBPEftMagicMissle_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftMagicMissle.Default__BPEftMagicMissle_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftMagicMissle.Default__BPEftMagicMissle_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Magic Missile\"\nmsgstr \"Missile Magique\"\n\n#. Key:\tBPEftMassMagicMissle_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftMassMagicMissle.Default__BPEftMassMagicMissle_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftMassMagicMissle.Default__BPEftMassMagicMissle_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Magic Missiles\"\nmsgstr \"Missiles Magiques\"\n\n#. Key:\tBPEftMassSlow_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftMassSlow.Default__BPEftMassSlow_C.DisplayName\n#. Key:\tBPEftSlow_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/BPEftSlow.Default__BPEftSlow_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/BPEftSlow.Default__BPEftSlow_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftMassSlow.Default__BPEftMassSlow_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Slow\"\nmsgstr \"Ralenti\"\n\n#. Key:\tBPEftMeteorShower_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftMeteorShower.Default__BPEftMeteorShower_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftMeteorShower.Default__BPEftMeteorShower_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Meteor Shower\"\nmsgstr \"Pluie de Météores\"\n\n#. Key:\tBPEftRegainSpellPassive25_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/BPEftRegainSpellPassive25.Default__BPEftRegainSpellPassive25_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/BPEftRegainSpellPassive25.Default__BPEftRegainSpellPassive25_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Arcane Luck\"\nmsgstr \"Chance des Arcanes\"\n\n#. Key:\tBPEftRegainSpells_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/BPEftRegainSpells.Default__BPEftRegainSpells_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/BPEftRegainSpells.Default__BPEftRegainSpells_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Restoration\"\nmsgstr \"Rétablissement\"\n\n#. Key:\tBPEftResModifierMagicalStrong_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftResModifierMagicalStrong.Default__BPEftResModifierMagicalStrong_C.DisplayName\n#. Key:\tBPEftResModifierMagical_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftResModifierMagical.Default__BPEftResModifierMagical_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftResModifierMagical.Default__BPEftResModifierMagical_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftResModifierMagicalStrong.Default__BPEftResModifierMagicalStrong_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Wardskin\"\nmsgstr \"Peau Naturelle\"\n\n#. Key:\tBPEftResModifierPhysical_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftResModifierPhysical.Default__BPEftResModifierPhysical_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftResModifierPhysical.Default__BPEftResModifierPhysical_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Stoneskin\"\nmsgstr \"Peau de Pierre\"\n\n#. Key:\tBPEftSecondChance_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/BPEftSecondChance.Default__BPEftSecondChance_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/BPEftSecondChance.Default__BPEftSecondChance_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Second Chance\"\nmsgstr \"Seconde Chance\"\n\n#. Key:\tBPEftSpellFire0_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftSpellFire0.Default__BPEftSpellFire0_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftSpellFire0.Default__BPEftSpellFire0_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Firestrike\"\nmsgstr \"Attaque Incendiaire\"\n\n#. Key:\tBPEftSpellLightningWalk_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftSpellLightningWalk.Default__BPEftSpellLightningWalk_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftSpellLightningWalk.Default__BPEftSpellLightningWalk_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Shockwalk\"\nmsgstr \"Frappe de Choc\"\n\n#. Key:\tBPEftSpellShadowWalk_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftSpellShadowWalk.Default__BPEftSpellShadowWalk_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftSpellShadowWalk.Default__BPEftSpellShadowWalk_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Shadewalk\"\nmsgstr \"Marche Ombrée\"\n\n#. Key:\tBPEftSpellShield_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftSpellShield.Default__BPEftSpellShield_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftSpellShield.Default__BPEftSpellShield_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Shield\"\nmsgstr \"Bouclier\"\n\n#. Key:\tBPEftSpellSoulKeeper_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftSpellSoulKeeper.Default__BPEftSpellSoulKeeper_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftSpellSoulKeeper.Default__BPEftSpellSoulKeeper_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Soulbind\"\nmsgstr \"Âme liée\"\n\n#. Key:\tBPEftStun_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/BPEftStun.Default__BPEftStun_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/BPEftStun.Default__BPEftStun_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Stun\"\nmsgstr \"Étourdissement\"\n\n#. Key:\tBPEftStunPassive10_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/BPEftStunPassive10.Default__BPEftStunPassive10_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/BPEftStunPassive10.Default__BPEftStunPassive10_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Stun Chance\"\nmsgstr \"Chance d'Étourdissement\"\n\n#. Key:\tBPEftSwap_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftSwap.Default__BPEftSwap_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftSwap.Default__BPEftSwap_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Swap\"\nmsgstr \"Échanger\"\n\n#. Key:\tBPEftTempHPMagical_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftTempHPMagical.Default__BPEftTempHPMagical_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftTempHPMagical.Default__BPEftTempHPMagical_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Magical Protection\"\nmsgstr \"Protection Magique\"\n\n#. Key:\tBPEftTempHPPhysical_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftTempHPPhysical.Default__BPEftTempHPPhysical_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftTempHPPhysical.Default__BPEftTempHPPhysical_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Physical Protection\"\nmsgstr \"Protection Physique\"\n\n#. Key:\tBPEftWeaponFlamesTimeBased_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/BPEftWeaponFlamesTimeBased.Default__BPEftWeaponFlamesTimeBased_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/BPEftWeaponFlamesTimeBased.Default__BPEftWeaponFlamesTimeBased_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Greenflame\"\nmsgstr \"Flamme Verte\"\n\n#. Key:\tBPEftWorthy_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/BPEftWorthy.Default__BPEftWorthy_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/BPEftWorthy.Default__BPEftWorthy_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Worthy\"\nmsgstr \"Digne\"\n\n#. Key:\t1E42901841F4C7CEF39536A762076EDF\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.UI_EndScreen_SaveCreatures_C:WidgetTree.TBC1.Text\n#. Key:\t5D04206A499A8B42AF77BAA8BC9B4B8B\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.UI_EndScreen_SaveCreatures_C:WidgetTree.TBC0.Text\n#. Key:\tB0EEBB754110D2821640BE990002AC36\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.UI_EndScreen_SaveCreatures_C:WidgetTree.TBC2.Text\n#. Key:\tD75DCE214B56BA6FD9A58F9EEA9291A5\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.UI_EndScreen_C:WidgetTree.TBC0.Text\n#: /Game/SO/GUI/InGame/UI_EndScreen.UI_EndScreen_C:WidgetTree.TBC0.Text\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.UI_EndScreen_SaveCreatures_C:WidgetTree.TBC0.Text\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.UI_EndScreen_SaveCreatures_C:WidgetTree.TBC1.Text\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.UI_EndScreen_SaveCreatures_C:WidgetTree.TBC2.Text\nmsgctxt \"EndScreen\"\nmsgid \"With his quest completed Monk decided to look for another activity. He thought: <Quote>‘If I could resist madness, others should be able to do the same.’</> And so he opened a monastery to share his mental training techniques with anyone willing to save its sanity.\"\nmsgstr \"Sa quête terminée, le Moine décida de se consacrer à une autre activité. Il pensa : <Quote>'Si je peux résister à la folie, d'autres devraient pouvoir en faire de même.'</> Et c'est ainsi qu'il ouvrit un monastère pour partager ses techniques d'entraînement spirituel avec tous ceux désireux de sauver leur santé mentale.\"\n\n#. Key:\t7279EA4741D3DAC5AE92EB99AB851ED9\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.UI_EndScreen_SaveCreatures_C:WidgetTree.TBD0.Text\n#. Key:\t77E809914A65796364FE94B8C2361FD7\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.UI_EndScreen_SaveCreatures_C:WidgetTree.TBD2.Text\n#. Key:\t9C1B477D4582ABAEDC90FCB3AC6737E7\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.UI_EndScreen_C:WidgetTree.TBD0.Text\n#. Key:\tE98C3FDD453FF80CA8EBBE94459A5CAF\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.UI_EndScreen_SaveCreatures_C:WidgetTree.TBD1.Text\n#: /Game/SO/GUI/InGame/UI_EndScreen.UI_EndScreen_C:WidgetTree.TBD0.Text\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.UI_EndScreen_SaveCreatures_C:WidgetTree.TBD0.Text\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.UI_EndScreen_SaveCreatures_C:WidgetTree.TBD1.Text\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.UI_EndScreen_SaveCreatures_C:WidgetTree.TBD2.Text\nmsgctxt \"EndScreen\"\nmsgid \"<Size42>Separating the World also changed something in the Ruined Realm. The wind turned and even Ruin stopped for a moment.</>\"\nmsgstr \"<Size42>Séparer le Monde a aussi changé quelque chose dans le Royaume en Ruines. Le vent a tourné et même la Ruine s'est arrêté un moment.</>\"\n\n#. Key:\t9B476D3D4A603658683498B09968F8AA\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.UI_EndScreen_C:WidgetTree.TBB0.Text\n#: /Game/SO/GUI/InGame/UI_EndScreen.UI_EndScreen_C:WidgetTree.TBB0.Text\nmsgctxt \"EndScreen\"\nmsgid \"When he heard about the lost Kobold tribe he got a bit excited.<Quote>‘Kobolds reserved the ancient knowledge in their rituals’</> he said. <Quote>‘If there is something we can do with Ruin it must be connected to the rituals. I’ll go with you.’</>\"\nmsgstr \"Quand il a entendu parler de la tribu perdue des Kobold, il s'est un peu emporté.<Quote>'Les Kobold ont conservé les connaissances anciennes dans leurs rituels'</> a-t-il dit. <Quote>'il y a quelque chose qui pourrait être lié à la Ruine et qui doit être en rapport avec les rituels. Je viens avec vous.'</>\"\n\n#. Key:\tDF7F9F754F4FC9CB19DF92AFCE96C5C1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.UI_EndScreen_SaveCreatures_C:WidgetTree.TBA2.Text\n#. Key:\tE8401550448E14DD70717EB7EED0582B\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.UI_EndScreen_SaveCreatures_C:WidgetTree.TBA1.Text\n#. Key:\tUI_EndScreen_entry_0_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(0).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(0).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.UI_EndScreen_SaveCreatures_C:WidgetTree.TBA1.Text\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.UI_EndScreen_SaveCreatures_C:WidgetTree.TBA2.Text\nmsgctxt \"EndScreen\"\nmsgid \"The people soon forgot about the threat, some of them argued that Ruin ever existed.\"\nmsgstr \"Les gens ont vite oublié la menace, certains d'entre eux soutenant que la Ruine n'a jamais existé.\"\n\n#. Key:\tE9F6E1064D5B2046DF1DEDA386012E2D\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.UI_EndScreen_C:WidgetTree.TBB2.Text\n#. Key:\tUI_EndScreen_entry_6_text_2\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(6).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(6).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.UI_EndScreen_C:WidgetTree.TBB2.Text\nmsgctxt \"EndScreen\"\nmsgid \"He opened a monastery to share his mental training techniques with anyone willing to save its sanity.\"\nmsgstr \"Il a ouvert un monastère pour partager ses techniques d'entraînement spirituel avec tous ceux qui veulent sauver leur santé mentale.\"\n\n#. Key:\tF0EAD93B44D8D7AEF306EAB75D83FB37\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.UI_EndScreen_C:WidgetTree.TBB1.Text\n#: /Game/SO/GUI/InGame/UI_EndScreen.UI_EndScreen_C:WidgetTree.TBB1.Text\nmsgctxt \"EndScreen\"\nmsgid \"<Quote>‘If I could resist madness, others should be able to do the same’</> - he thought.\"\nmsgstr \"<Quote>‘Si je peux résister à la folie, les autres devraient pouvoir en faire de même'</> - pensait-il.\"\n\n#. Key:\tUI_EndScreen_entry_0_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(0).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(0).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Once the Boundaries of Worlds were sealed, Ruin could do no harm to the Human Realm again.\"\nmsgstr \"Une fois les Frontières des Mondes scellées, la Ruine ne pouvait plus faire de mal au Royaume des Hommes.\"\n\n#. Key:\tUI_EndScreen_entry_10_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(10).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(10).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Hearing these news made the Chef really excited.\"\nmsgstr \"En entendant ces nouvelles, le Chef s'est montré très enthousiaste.\"\n\n#. Key:\tUI_EndScreen_entry_10_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(10).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(10).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"<Quote>'Could there be other survivors of my tribe?'</>\"\nmsgstr \"<Quote>'Pourrait-il y avoir d'autres survivants de ma tribu ?'</>\"\n\n#. Key:\tUI_EndScreen_entry_10_text_2\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(10).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(10).EndingLogic.Texts(2).Texts\nmsgctxt \"EndScreen\"\nmsgid \"He decided to leave his kitchen and search for his lost relatives.\"\nmsgstr \"Il a décidé de quitter sa cuisine et de partir à la recherche de ses proches disparus.\"\n\n#. Key:\tUI_EndScreen_entry_11_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(11).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(11).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"No one knows how he could possibly know about the soup, but Supper Dwarf also appeared to taste the food.\"\nmsgstr \"Personne ne sait comment il a pu savoir pour la soupe, mais le Nain du Dîner semblait aussi goûter la nourriture.\"\n\n#. Key:\tUI_EndScreen_entry_11_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(11).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(11).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"When he heard that the chef is leaving he offered his help with the trains.\"\nmsgstr \"Quand il a appris le départ du chef, il a proposé son aide.\"\n\n#. Key:\tUI_EndScreen_entry_11_text_2\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(11).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(11).EndingLogic.Texts(2).Texts\nmsgctxt \"EndScreen\"\nmsgid \"<Quote>‘And I would also like to check what do they eat for supper.’</> he said. <Quote>‘I’m going with you.’</>\"\nmsgstr \"<Quote>‘Et je voudrais aussi vérifier ce qu'ils mangent pour le dîner.’</> a-t-il dit.. <Quote>'Je viens avec vous’</>\"\n\n#. Key:\tUI_EndScreen_entry_12_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(12).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(12).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"On their way they stopped by the Golem Maker.\"\nmsgstr \"En chemin, ils se sont arrêtés au Créateur de Golem.\"\n\n#. Key:\tUI_EndScreen_entry_12_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(12).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(12).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"He was just sitting and staring at nothing.\"\nmsgstr \"Il était juste assis et ne regardait rien.\"\n\n#. Key:\tUI_EndScreen_entry_12_text_2\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(12).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(12).EndingLogic.Texts(2).Texts\nmsgctxt \"EndScreen\"\nmsgid \"It was still hard for the Maker to accept that all his work was for nothing.\"\nmsgstr \"Il était encore difficile pour le Créateur d'accepter que tout son travail n'ait servi à rien.\"\n\n#. Key:\tUI_EndScreen_entry_12_text_3\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(12).EndingLogic.Texts(3).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(12).EndingLogic.Texts(3).Texts\nmsgctxt \"EndScreen\"\nmsgid \"At least he stopped creating mindless stone golems.\"\nmsgstr \"Au moins, il a cessé de créer des golems de pierre sans âme.\"\n\n#. Key:\tUI_EndScreen_entry_13_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(13).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(13).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"When he heard about the lost Kobold tribe he got a bit excited.\"\nmsgstr \"Quand il a entendu parler de la tribu perdue des Kobold, il s'est un peu emballé.\"\n\n#. Key:\tUI_EndScreen_entry_13_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(13).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(13).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"<Quote>‘Kobolds reserved the ancient knowledge in their rituals’</> he said.\"\nmsgstr \"<Quote>‘Les Kobolds ont conservé leur savoir ancien dans leurs rituels’</> a-t-il dit.\"\n\n#. Key:\tUI_EndScreen_entry_13_text_2\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(13).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(13).EndingLogic.Texts(2).Texts\nmsgctxt \"EndScreen\"\nmsgid \"<Quote>‘If there is something we can do with Ruin it must be connected to the rituals. I’ll go with you.’</>\"\nmsgstr \"<Quote>‘S'il y a quelque chose que nous pouvons faire avec la Ruine, cela implique ces rituels. Je vous accompagne.’</>\"\n\n#. Key:\tUI_EndScreen_entry_14_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(14).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(14).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"However there are things which never change.\"\nmsgstr \"Cependant, il y a des choses qui ne changent jamais.\"\n\n#. Key:\tUI_EndScreen_entry_14_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(14).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(14).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"After days of arguing on who undermined whose business Lory and Gnory separated once again.\"\nmsgstr \"Après des jours de débats sur la question de savoir lequel des deux a sapé l'entreprise, Lory et Gnory se sont à nouveau séparés.\"\n\n#. Key:\tUI_EndScreen_entry_15_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(15).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(15).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"While they were arguing Fishy decided to leave Gnory and set out on his own.\"\nmsgstr \"Pendant qu'ils se disputaient, Poiscaille a décidé de quitter Gnory et de se mettre à son compte.\"\n\n#. Key:\tUI_EndScreen_entry_15_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(15).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(15).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"He had no idea where he was going.\"\nmsgstr \"Il n'avait aucune idée d'où il allait.\"\n\n#. Key:\tUI_EndScreen_entry_16_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(16).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(16).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"After weeks of walking alone, he heard a faint excited voice:\"\nmsgstr \"Après avoir marché seul pendant des semaines, il a entendu une voix légèrement enthousiaste :\"\n\n#. Key:\tUI_EndScreen_entry_1_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(1).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(1).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"The Mage Council didn’t believe a single word Lillian or Scholar told them about the events.\"\nmsgstr \"Le Conseil des Mages n'a pas cru un seul mot de ce que Lillian ou l'Étudiant leur a dit au sujet des événements.\"\n\n#. Key:\tUI_EndScreen_entry_1_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(1).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(1).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"They claimed that Wizard died in an unfortunate accident and his device could never actually work anyway.\"\nmsgstr \"Ils ont affirmé que le Magicien était mort dans un malheureux accident et que son appareil ne pourrait jamais fonctionner de toute façon.\"\n\n#. Key:\tUI_EndScreen_entry_2_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(2).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(2).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Although Lillian inherited her father’s castle she was sent to an Orphanage until she came into age to live on her own.\"\nmsgstr \"Bien que Lillian ait hérité du château de son père, elle fut envoyée dans un orphelinat jusqu'à ce qu'elle soit en âge de vivre seule.\"\n\n#. Key:\tUI_EndScreen_entry_2_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(2).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(2).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Scholar was upset by Lillian’s decision on letting the Ruined Realm fall but he promised Lillian that he will make the Wizard’s Council let Lillian live in his estate.\"\nmsgstr \"L'Étudiant a été bouleversé par la décision de Lillian de laisser tomber le Royaume en Ruines, mais il a promis à Lillian qu'il ferait en sorte que le Conseil des Magiciens la laisse vivre dans son domaine.\"\n\n#. Key:\tUI_EndScreen_entry_3_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(3).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(3).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Lillian didn't let the unfortunate events to overcome her. She stopped Ruin even if no one believed her.\"\nmsgstr \"Lillian n'a pas laissé les événements malheureux la dépasser. Elle a arrêté la Ruine même si personne ne la croyait.\"\n\n#. Key:\tUI_EndScreen_entry_3_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(3).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(3).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"She also knew that the Ruined Realm still had at least a half century before it was totally destroyed so she decided to keep on looking for a way to save it.\"\nmsgstr \"Elle savait également que le Royaume en Ruines avait encore au moins un demi-siècle avant d'être totalement détruit, elle a donc décidé de continuer à chercher un moyen de le sauver.\"\n\n#. Key:\tUI_EndScreen_entry_3_text_2\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(3).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(3).EndingLogic.Texts(2).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Now that her own Realm was safe she could focus on the other Realms.\"\nmsgstr \"Maintenant que son propre Royaume était en sécurité, elle pouvait se concentrer sur les autres Royaumes.\"\n\n#. Key:\tUI_EndScreen_entry_4_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(4).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(4).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"<Size42>Separating the World also changed something in the Ruined Realm.</>\"\nmsgstr \"<Size42>Séparer le Monde a également changé quelque chose dans le Royaume en Ruines.</>\"\n\n#. Key:\tUI_EndScreen_entry_4_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(4).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(4).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"<Size42>The wind turned and even Ruin stopped for a moment.</>\"\nmsgstr \"<Size42>Le vent a tourné et même la Ruine s'est arrêté un moment.</>\"\n\n#. Key:\tUI_EndScreen_entry_5_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(5).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(5).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"When it was certain that no one will be saved from Ruin, as a last desperate act Gate Keeper tried to open a Gate to the Human Realm himself.\"\nmsgstr \"Lorsqu'il fut certain que personne ne serait sauvé de la Ruine, en dernier acte désespéré, le Gardien de la Porte a tenté d'ouvrir lui-même une Porte vers le Royaume des Hommes.\"\n\n#. Key:\tUI_EndScreen_entry_5_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(5).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(5).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"A portal opened and swallowed the Keeper.\"\nmsgstr \"Un portail s'est ouvert et a avalé le Gardien.\"\n\n#. Key:\tUI_EndScreen_entry_5_text_2\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(5).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(5).EndingLogic.Texts(2).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Some believed he survived but no one ever met him again.\"\nmsgstr \"Certains pensaient qu'il avait survécu, mais personne ne l'a jamais revu.\"\n\n#. Key:\tUI_EndScreen_entry_6_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(6).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(6).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"With his quest completed Monk decided to look for another activity.\"\nmsgstr \"Une fois sa quête terminée, le Moine a décidé de chercher une autre activité.\"\n\n#. Key:\tUI_EndScreen_entry_6_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(6).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(6).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"<Quote>‘If I could resist madness, shouldn't others be able to do the same?’</>- he wondered.\"\nmsgstr \"<Quote>‘Si je pouvais résister à la folie, les autres ne devraient-ils pas pouvoir en faire autant ?’</>- se demandait-il.\"\n\n#. Key:\tUI_EndScreen_entry_7_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(7).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(7).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"To the surprise of many Teachy also joined Monk and soon he became his best student.\"\nmsgstr \"À la surprise de beaucoup, le Prof a également rejoint le Moine et il est rapidement devenu son meilleur élève.\"\n\n#. Key:\tUI_EndScreen_entry_7_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(7).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(7).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"<Quote>‘To be honest I never actually wanted to be a teacher‘</> - said Teachy.\"\nmsgstr \"<Quote>‘Pour être honnête, je n'ai jamais vraiment voulu être professeur‘</> - dit le Prof.\"\n\n#. Key:\tUI_EndScreen_entry_7_text_2\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(7).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(7).EndingLogic.Texts(2).Texts\nmsgctxt \"EndScreen\"\nmsgid \"<Quote>'I also knew that I was a bit mad and since for my insane mind training in a monastery looked like a crazy idea I immediately knew that in fact that's the most sane thing to do.’</>\"\nmsgstr \"<Quote>'Je savais aussi que j'étais un peu fou et comme pour mon esprit fou, l'entraînement dans un monastère semblait être une idée folle, j'ai immédiatement su qu'en fait c'était la chose la plus saine à faire.’</>\"\n\n#. Key:\tUI_EndScreen_entry_8_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(8).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(8).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Losing his connection to his master, Raven had to think again about his purpose.\"\nmsgstr \"Perdant son lien avec son maître, le Corbeau a dû reconsidérer son objectif.\"\n\n#. Key:\tUI_EndScreen_entry_8_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(8).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(8).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"<Quote>‘I think therefore I am not a bird’</> - he said.\"\nmsgstr \"<Quote>‘Je pense donc que je ne suis pas un oiseau’</> - dit-il.\"\n\n#. Key:\tUI_EndScreen_entry_8_text_2\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(8).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(8).EndingLogic.Texts(2).Texts\nmsgctxt \"EndScreen\"\nmsgid \"With his vast experience he couldn’t become the same thoughtless bird he once was.\"\nmsgstr \"Avec sa vaste expérience, il ne pouvait pas devenir le même oiseau irréfléchi qu'autrefois.\"\n\n#. Key:\tUI_EndScreen_entry_8_text_3\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(8).EndingLogic.Texts(3).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(8).EndingLogic.Texts(3).Texts\nmsgctxt \"EndScreen\"\nmsgid \"He joined Monk’s monastery to teach philosophy.\"\nmsgstr \"Il a rejoint le monastère des Moines pour y enseigner la philosophie.\"\n\n#. Key:\tUI_EndScreen_entry_8_text_4\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(8).EndingLogic.Texts(4).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(8).EndingLogic.Texts(4).Texts\nmsgctxt \"EndScreen\"\nmsgid \"In his free hours he kept on studying the Ancient’s technology hoping that one day he will find a way back to Lillian.\"\nmsgstr \"Pendant son temps libre, il continuait à étudier la technologie de l'Ancien en espérant qu'un jour il trouverait un moyen de retrouver Lillian.\"\n\n#. Key:\tUI_EndScreen_entry_9_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(9).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(9).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"When the soup was almost ready the Pipe Walkers smelled the flavour and they all gathered for a last dinner.\"\nmsgstr \"Quand la soupe fut presque prête, les Tuyauteurs en sentirent la saveur et se réunirent tous pour un dernier dîner.\"\n\n#. Key:\tUI_EndScreen_entry_9_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(9).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(9).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"After lunch they started to talk.\"\nmsgstr \"Après le déjeuner, ils ont commencé à discuter.\"\n\n#. Key:\tUI_EndScreen_entry_9_text_2\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(9).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(9).EndingLogic.Texts(2).Texts\nmsgctxt \"EndScreen\"\nmsgid \"One of the Pipe Walkers, who had been in many cages mentioned that she actually met some kobolds far away.\"\nmsgstr \"L'une des Tuyauteurs, qui s'était retrouvée dans de nombreuses cages, a mentionné qu'elle avait en fait rencontré quelques kobolds au loin.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_0_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(0).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(0).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"By the time the furious crowd broke into the Wizard’s Castle the Device was completely destroyed.\"\nmsgstr \"Le temps que la foule en colère pénètre dans le château du Magicien, l'Appareil fut complètement détruit.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_0_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(0).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(0).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Some left, others started to investigate the building hoping to find something which might stop Ruin.\"\nmsgstr \"Certains sont partis, d'autres ont commencé à enquêter sur le bâtiment dans l'espoir de trouver quelque chose qui pourrait arrêter la Ruine.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_10_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(10).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(10).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"<Quote>‘Kobolds reserved the ancient knowledge in their rituals’</> Golem Maker said. <Quote>‘If there is something we can do with Ruin it must be connected to the rituals. I’ll go with you.’</>\"\nmsgstr \"<Quote>'Les Kobold ont conservé les connaissances anciennes dans leurs rituels'</> dit le Créateur de Golem. <Quote>'il y a quelque chose qui pourrait être lié à la Ruine et qui doit être en rapport avec les rituels. Je viens avec vous.'</>\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_10_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(10).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(10).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Golem Maker was a huge help to Lillian with his knowledge on Golemology and it was not easy for Lillian to let him go.\"\nmsgstr \"Le Créateur de Golem fut d'une grande aide pour Lillian grâce à ses connaissances en matière de Golemologie et il ne fut pas facile pour Lillian de le laisser partir.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_10_text_2\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(10).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(10).EndingLogic.Texts(2).Texts\nmsgctxt \"EndScreen\"\nmsgid \"<Quote>‘Have no fear!’</> Golem Maker said. <Quote>‘I will return with even more knowledge and we’ll stop Ruin once and for all.’</>\"\nmsgstr \"<Quote>‘Sois sans crainte !’</> déclare le Créateur de Golem. <Quote>‘Je reviendrai avec encore plus de connaissances et nous arrêterons la Ruine une fois pour toutes.’</>\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_11_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(11).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(11).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"After Kobold Chef left, Supper Dwarf had to take care of the kitchen.\"\nmsgstr \"Après le départ du Chef Kobold, c'est le Nain du Dîner qui a dû s'occuper de la cuisine.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_11_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(11).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(11).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"It turned out that he is also really talented at making food.\"\nmsgstr \"Il s'est avéré qu'il est aussi très doué pour la cuisine.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_11_text_2\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(11).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(11).EndingLogic.Texts(2).Texts\nmsgctxt \"EndScreen\"\nmsgid \"<Quote> ‘That is because I know exactly what the final result should be’</> he explained.\"\nmsgstr \"<Quote> ‘C'est parce que je sais exactement quel devrait être le résultat final’</> explique-t-il.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_11_text_3\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(11).EndingLogic.Texts(3).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(11).EndingLogic.Texts(3).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Later he opened a restaurant which soon became really popular.\"\nmsgstr \"Plus tard, il a ouvert un restaurant qui est vite devenu très populaire.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_11_text_4\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(11).EndingLogic.Texts(4).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(11).EndingLogic.Texts(4).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Some say mostly because he hired Pipe Walkers to serve the meal and for marketing purposes.\"\nmsgstr \"Certains disent que c'est surtout parce qu'il a engagé des Tuyauteurs pour servir le repas et à des fins de marketing.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_12_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(12).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(12).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Monk decided to stay in the Ruined Realm.\"\nmsgstr \"Le Moine a décidé de rester dans le Royaume en Ruines.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_12_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(12).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(12).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"<Quote>‘Even if it was not enough I did all I could. I’m done.’</> he said.\"\nmsgstr \"<Quote>‘Même si ce n'était pas suffisant, j'ai fait tout ce que j'ai pu. J'en ai fini.’</> a-t-il dit.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_12_text_2\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(12).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(12).EndingLogic.Texts(2).Texts\nmsgctxt \"EndScreen\"\nmsgid \"He sat down on a mountaintop and started meditating.\"\nmsgstr \"Il s'est assis au sommet d'une montagne et s'est mis à méditer.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_13_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(13).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(13).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"A few weeks later he realized that even though he failed his quest he still should do something.\"\nmsgstr \"Quelques semaines plus tard, il a réalisé que même s'il avait échoué dans sa quête, il devait quand même faire quelque chose.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_13_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(13).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(13).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"<Quote>‘Due to my training I can resist Ruin’</> he thought. <Quote>‘No one has ever seen what’s there where Ruin destroyed the lands. If I train harder I might be able to get closer to Ruin to see what it really is.’</>\"\nmsgstr \"<Quote>‘Grâce à mon entraînement, je peux résister à la Ruine’</> pensait-il. <Quote>‘Personne n'a jamais vu ce qu'il y a là où la Ruine a détruit les terres. Si je m'entraîne davantage, je pourrai peut-être me rapprocher de la Ruine pour voir ce dont elle est vraiment constituée.’</>\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_13_text_2\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(13).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(13).EndingLogic.Texts(2).Texts\nmsgctxt \"EndScreen\"\nmsgid \"He kept on practising and soon set out on a journey into the heart of Ruin to find answers to questions even he didn’t know.\"\nmsgstr \"Il a continué à s'entraîner et s'est rapidement lancé dans un voyage au cœur de la Ruine pour trouver des réponses à des questions qu'il ne connaissait pas.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_14_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(14).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(14).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Lory and Gnory suddenly found themselves in a world full of possible customers.\"\nmsgstr \"Lory et Gnory se sont soudain retrouvés dans un monde plein de clients potentiels.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_14_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(14).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(14).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Of course it didn’t mean they stopped arguing on who undermined whose business but finally they both had the chance to run a successful trading company.\"\nmsgstr \"Bien sûr, cela ne signifie pas qu'ils ont cessé de se disputer pour savoir qui a sapé l'entreprise de qui, mais ils ont finalement tous deux eu la chance de diriger une société commerciale prospère.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_15_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(15).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(15).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Gnory specialized himself in selling medicine which were said to heal the sickness which was spreading as Ruin reached closer.\"\nmsgstr \"Gnory s'est spécialisé dans la vente de médicaments dont on disait qu'ils guérissaient la maladie qui se propageait à mesure que la Ruine se rapprochait.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_15_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(15).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(15).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Lory specialized in medicine which were said to heal the sickness which was caused by the medicine of Gnory.\"\nmsgstr \"Lory s'est spécialisé dans la médecine dont on disait qu'elle guérissait les maladies causées par la médecine de Gnory.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_16_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(16).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(16).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Lory’s herbaria worked out.\"\nmsgstr \"Les herbiers de Lory ont fonctionné.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_16_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(16).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(16).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Soon she started to sell other medicine and healing devices as well.\"\nmsgstr \"Très vite, elle a commencé à vendre d'autres médicaments et dispositifs de soins.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_17_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(17).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(17).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"As for Gnory, he decided to sell lots of different things in the City Prison which turned out to be his new home for a while.\"\nmsgstr \"Quant à Gnory, il a décidé de vendre beaucoup de choses différentes dans la Prison de la Ville qui s'est avérée être sa nouvelle maison pendant un certain temps.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_18_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(18).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(18).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Fishy didn’t like the medicine business so he left Gnory.\"\nmsgstr \"Poiscaille n'aimait pas le commerce des médicaments, alors il a quitté Gnory.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_18_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(18).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(18).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"He joined Monk for a while to learn the mental training techniques which reserved Monk’s sanity.\"\nmsgstr \"Il a rejoint le Moine pendant un certain temps pour apprendre les techniques d'entraînement mental qui ont permis de préserver la santé mentale du Moine.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_18_text_2\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(18).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(18).EndingLogic.Texts(2).Texts\nmsgctxt \"EndScreen\"\nmsgid \"<Quote>‘Fishy think it is important’ </>he said.<Quote> ‘If Monk go to see Ruin, Fishy need to learn it.’</>\"\nmsgstr \"<Quote>‘Poiscaille pense que c'est important' </>dit-il.<Quote> ‘Si le Moine part voir la Ruine, le Poiscaille doit l'apprendre.’</>\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_18_text_3\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(18).EndingLogic.Texts(3).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(18).EndingLogic.Texts(3).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Monk accepted Fishy as his apprentice and taught him all that was possible.\"\nmsgstr \"Le Moine a accepté Poiscaille comme apprenti et lui a appris tout ce qu'il pouvait.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_18_text_4\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(18).EndingLogic.Texts(4).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(18).EndingLogic.Texts(4).Texts\nmsgctxt \"EndScreen\"\nmsgid \"<Quote>‘Now is the time’</> Monk said one day. <Quote>’Go to the Human Realm and prepare the people.’</>\"\nmsgstr \"<Quote>‘Le moment est venu'</> a dit le Moine, un jour. <Quote>’Va dans le Royaume des Hommes et prépare les.’</>\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_19_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(19).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(19).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"On his way to the Human Realm Fishy heard a faint excited voice:\"\nmsgstr \"Sur son chemin vers le Royaume des Hommes, Poiscaille entendit une faible voix enthousiaste :\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_19_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(19).EndingLogic.Texts(1).Texts\n#. Key:\tUI_EndScreen_entry_16_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(16).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(16).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(19).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"<Quote>‘Hey there! I’m fed up with microtransactions. Can I go with ya man?’</>\"\nmsgstr \"<Quote>‘Salut ! J'en ai assez des microtransactions. Je peux venir avec toi, mec ?’</>\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_19_text_2\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(19).EndingLogic.Texts(2).Texts\n#. Key:\tUI_EndScreen_entry_16_text_2\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(16).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(16).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(19).EndingLogic.Texts(2).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Merch Ant and Fishy soon became best friends and ventured on together.\"\nmsgstr \"La Fourmi Vendeuse et Poiscaille sont rapidement devenus les meilleurs amis et ont entrepris de s'aventurer ensemble.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_1_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(1).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(1).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"A few hours later members of the Mage Council arrived along with the city guards.\"\nmsgstr \"Quelques heures plus tard, des membres du Conseil des Mages sont arrivés avec les gardes de la ville.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_1_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(1).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(1).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"The Council claimed that Wizard died in an unfortunate accident, his device could never actually work anyway and Ruin is nothing to fear of.\"\nmsgstr \"Le Conseil a affirmé que le Magicien était mort dans un malheureux accident, que son appareil ne pourrait jamais fonctionner de toute façon et que la Ruine n'est pas une menace.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_1_text_2\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(1).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(1).EndingLogic.Texts(2).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Although it was total nonsense Lillian and Scholar was happy that the crowd were taken away from the Castle.\"\nmsgstr \"Bien que ce fût un non-sens total, Lillian et l'Étudiant furent heureux de voir la foule s'éloigner du château.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_20_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(20).EndingLogic.Texts(0).Texts\n#. Key:\tUI_EndScreen_entry_17_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(17).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(17).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(20).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"The World was still about to end, but as one Pipe Walker wisely said:\"\nmsgstr \"Le Monde était encore sur le point de disparaître, mais comme l'a sagement dit un Tuyauteur :\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_21_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(21).EndingLogic.Texts(0).Texts\n#. Key:\tUI_EndScreen_entry_18_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(18).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(18).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(21).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"As some stories ended some new ones begun. Though what happened afterwards is not yet known.\"\nmsgstr \"Comme certaines histoires se terminent, d'autres commencent. Bien que ce qui s'est passé par la suite ne soit pas encore connu.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_2_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(2).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(2).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"When they were left alone they quickly started the evacuation of the Ruined Realm.\"\nmsgstr \"Quand ils ont été laissés seuls, ils ont rapidement commencé l'évacuation du Royaume en Ruines.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_3_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(3).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(3).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Even though she lost her father Lillian couldn’t afford to let sadness overcome her.\"\nmsgstr \"Même si elle a perdu son père, Lillian ne pouvait pas se permettre de laisser la tristesse l'envahir.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_3_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(3).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(3).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Ruin was more of a threat now than ever before, and since the Mage Council didn’t believe in Ruin it was the task of Lillian and Scholar to repair the device.\"\nmsgstr \"La Ruine était plus que jamais une menace, et comme le Conseil des Mages ne croyait pas en la Ruine, c'était à Lillian et l'Étudiant de réparer l'appareil.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_4_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(4).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(4).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Scholar was really proud of Lillian because she managed to save time for the evacuation.\"\nmsgstr \"L'Étudiant était vraiment fier de Lillian car elle a su gagner du temps pour l'évacuation.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_4_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(4).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(4).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"<Quote>‘I know Wizard would have disagreed but you did the right thing. We still have time to face Ruin. We couldn’t let everyone die there.’</>\"\nmsgstr \"<Quote>‘Je sais que le Magicien n'aurait pas été d'accord, mais tu as fait ce qu'il fallait. Nous avons encore le temps d'affronter la Ruine. Nous ne pouvions pas laisser tout le monde mourir là-bas.’</>\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_5_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(5).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(5).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"As time passed Scholar started to behave a bit odd which made Lillian really anxious.\"\nmsgstr \"Avec le temps, l'Étudiant a commencé à se comporter un peu bizarrement, ce qui a rendu Lillian très anxieuse.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_5_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(5).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(5).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Ruin was close and the solution was still far away.\"\nmsgstr \"La Ruine était proche et la solution, encore lointaine.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_5_text_2\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(5).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(5).EndingLogic.Texts(2).Texts\nmsgctxt \"EndScreen\"\nmsgid \"When she talked about her concerns to Raven, the bird said:\"\nmsgstr \"Quand elle a parlé de ses préoccupations au Corbeau, l'oiseau a dit :\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_5_text_3\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(5).EndingLogic.Texts(3).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(5).EndingLogic.Texts(3).Texts\nmsgctxt \"EndScreen\"\nmsgid \"<Quote>‘Focus on what you are doing Lillian. He was a bit odd anyway.’</>\"\nmsgstr \"<Quote>‘Concentrez-vous sur ce que vous faites Lillian. Il était un peu bizarre de toute façon.’</>\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_6_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(6).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(6).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"To the surprise of many Teachy turned out to be an excellent researcher.\"\nmsgstr \"À la surprise de beaucoup, Prof s'est révélé être un excellent chercheur.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_6_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(6).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(6).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"<Quote>‘To be honest I never wanted to be a teacher’ </>he said. <Quote>‘I only stayed at University so that I can do some more research work. But my students never let me research during lectures.’</>\"\nmsgstr \"<Quote>‘Pour être honnête, je n'ai jamais voulu être professeur’ </>dit-il. <Quote>‘Je suis seulement resté à l'Université pour pouvoir faire d'autres travaux de recherche. Mais mes étudiants ne me laissent jamais faire de recherches pendant les cours.’</>\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_6_text_2\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(6).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(6).EndingLogic.Texts(2).Texts\nmsgctxt \"EndScreen\"\nmsgid \"He joined Lillian and dug into every book he could possibly find on the Ancient’s technology.\"\nmsgstr \"Il a rejoint Lillian et a fouillé dans tous les livres qu'il a pu trouver au sujet de la technologie de l'Ancien.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_7_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(7).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(7).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"The new environment and being a bit further from Ruin made good to the Gate Keeper.\"\nmsgstr \"Le nouvel environnement et le fait d'être un peu plus éloigné de la ruine ont fait du bien au Gardien de la Porte.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_7_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(7).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(7).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"He organized some of the cleaners to repair the Castle so that Lillian can keep on with her work.\"\nmsgstr \"Il a organisé certains des nettoyeurs pour réparer le château afin que Lillian puisse continuer son travail.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_7_text_2\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(7).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(7).EndingLogic.Texts(2).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Later he started to remember things from the Runic Realm which helped Lillian a lot.\"\nmsgstr \"Plus tard, il a commencé à se souvenir de choses du Royaume Runique qui ont beaucoup aidé Lillian.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_8_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(8).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(8).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"One day a Pipe Walker, who had been in many cages mentioned that she met some kobolds far away who might be other survivors of the Kobold Chef’s tribe.\"\nmsgstr \"Un jour, une Tuyauteuse, qui avait fréquenté de nombreuses cages, a mentionné qu'elle avait rencontré au loin des kobolds qui pourraient être d'autres survivants de la tribu du chef Kobold.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_9_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(9).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(9).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Hearing this news made Kobold Chef really excited.\"\nmsgstr \"En apprenant cette nouvelle, le Chef Kobold est devenu très enthousiaste.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_9_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(9).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(9).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"He decided to return to the Ruined Realm and search for his lost relatives.\"\nmsgstr \"Il décide de retourner au Royaume en Ruines et de rechercher ses proches disparus.\"\n\n#. Key:\tSoAct1_EG_AAFirstDroneTrio_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Drones were even more intelligent than Maintainers. They not only memorized texts, they helped correct grammar, changed the message if it was too insulting or even made up poems if they were asked to do so.\"\nmsgstr \"Les Drones étaient encore plus intelligents que les Responsables. Non seulement ils mémorisaient des textes, mais ils aidaient à corriger la grammaire, à changer le message s'il était trop insultant ou même à inventer des poèmes si on leur demandait de le faire.\"\n\n#. Key:\tSoAct1_EG_AAFirstDroneTrio_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"The Flying Three\"\nmsgstr \"Le Trio Volant\"\n\n#. Key:\tSoAct1_EG_AfterGateCleaners_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Citizens of Cerulean requested to have their own unique Golems, but it was always rejected. This situation was very good for the Black Golem Market, because this way it was always easy to find customers.\"\nmsgstr \"Les Citoyens de Céruléen ont demandé à avoir leur propre Golems unique, mais cela a toujours été rejeté. Cette situation était très bonne pour le Marché Noir du Golem, car il était ainsi toujours facile de trouver des clients.\"\n\n#. Key:\tSoAct1_EG_AfterGateCleaners_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Cleaners of Cerulean\"\nmsgstr \"Nettoyeurs de Céruléen\"\n\n#. Key:\tSoAct1_EG_AfterGateElits_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"The Runic Realm's Government didn't allow the Golems to become the privilege of the rich. Even though the elite were not allowed to have different Golems they always found a way to make their servants different than the ones owned by the poor.\"\nmsgstr \"Le Gouvernement du Royaume Runique n'a pas permis que les Golems deviennent le privilège des riches. Même si l'élite n'était pas autorisée à avoir des Golems différents, elle trouvait toujours un moyen de rendre ses serviteurs différents de ceux des pauvres.\"\n\n#. Key:\tSoAct1_EG_AfterGateElits_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Capetainers\"\nmsgstr \"Conteneurs\"\n\n#. Key:\tSoAct1_EG_AGRightFromPortal_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"'Just keep cleaning! Cleaning, cleaning...'\"\nmsgstr \"'Continuez à nettoyer ! Nettoyer, nettoyer...'\"\n\n#. Key:\tSoAct1_EG_AGRightFromPortal_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Cleaner Invasion\"\nmsgstr \"Invasion de Nettoyeurs\"\n\n#. Key:\tSoAct1_EG_AGTestStoneCircle_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"The Black Golem Market was funded by a Golem Maker apprentice who failed his master exam and was banished from school. No wonder his golems were... unique.\"\nmsgstr \"Le Marché Noir du Golem a été financé par un apprenti fabricant de golem qui a échoué à son examen de maîtrise et a été banni de l'école. Pas étonnant que ses golems aient été... uniques.\"\n\n#. Key:\tSoAct1_EG_AGTestStoneCircle_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Weird Golems\"\nmsgstr \"Golems Bizarres\"\n\n#. Key:\tSoAct1_EG_AGWallJumpTeam_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"The cleaning plan for this area fell apart with the participants.\"\nmsgstr \"Le plan de nettoyage de cette zone s'est effondré avec les participants.\"\n\n#. Key:\tSoAct1_EG_AGWallJumpTeam_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"The North Team\"\nmsgstr \"L'équipe Nord\"\n\n#. Key:\tSoAct1_EG_ArcadeDungeonCleaners_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"The Golem's behaviour was specified by the Golem Makers. Only very simple personalities were made at the beginning. The Cleaners, for example, only desired to keep the place tidy and make sure they don't harm the people.\"\nmsgstr \"Le comportement du Golem a été spécifié par les Fabricants du Golem. Au début, seules des personnalités très simples ont été créées. Les Nettoyeurs, par exemple, voulaient seulement garder l'endroit propre et s'assurer qu'ils ne nuisent pas aux gens.\"\n\n#. Key:\tSoAct1_EG_ArcadeDungeonCleaners_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Arcade Cleaners\"\nmsgstr \"Nettoyeurs de l'Arcade\"\n\n#. Key:\tSoAct1_EG_ArcadeDungeonExit_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"After creating intelligence Golem Makers wanted even more. They wanted complex personality. They wanted Golems that can not only think but also feel. That was the idea behind designing the Gatekeepers.\"\nmsgstr \"Après avoir créé des services de renseignement, les Créateurs de Golem en voulaient encore plus. Ils voulaient une personnalité complexe. Ils voulaient des Golems qui puissent non seulement penser mais aussi ressentir. C'était l'idée derrière la conception des Gardiens.\"\n\n#. Key:\tSoAct1_EG_ArcadeDungeonExit_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Arcade Servants\"\nmsgstr \"Serviteurs de l'Arcade\"\n\n#. Key:\tSoAct1_EG_ArcadeDungeonOptional_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"You might wonder if a Vacuum Cleaner is designed to clean dust away why does it need a laser caster?\"\nmsgstr \"Vous vous demandez peut-être pourquoi un Aspirateur est conçu pour enlever la poussière et pourquoi il a besoin d'un laser ?\"\n\n#. Key:\tSoAct1_EG_ArcadeDungeonOptional_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Vacuum Cleaners group\"\nmsgstr \"Groupe de Nettoyeurs à l'Aspirateur\"\n\n#. Key:\tSoAct1_EG_ArcadeMaintainers_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"The very first Golems were made to do the most monotonic work so that people have more time to think and to create. Once they were friendly but as Ruin came their behaviour changed.\"\nmsgstr \"Les tout premiers Golems ont été conçus pour faire le travail le plus monotone possible afin que les gens aient plus de temps pour réfléchir et créer. Autrefois, ils étaient amicaux, mais avec la Ruine, leur comportement a changé.\"\n\n#. Key:\tSoAct1_EG_ArcadeMaintainers_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Arcade Cleaner Golems\"\nmsgstr \"Golems Nettoyeurs d'Arcade\"\n\n#. Key:\tSoAct1_EG_Chest_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"The poor chest was minding his own business before you started to insult him.\"\nmsgstr \"Le pauvre coffre s'occupait de ses affaires avant que vous ne commenciez à l'insulter.\"\n\n#. Key:\tSoAct1_EG_Chest_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Chest\"\nmsgstr \"Coffre\"\n\n#. Key:\tSoAct1_EG_GGMiniBoss_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Maybe it only depends on the creation process, but some Golems had stronger personality. In general, Golems with more intelligence resisted Ruin longer and Golems with strong personality were more vulnerable to the infection.\"\nmsgstr \"Peut-être que cela ne dépend que du processus de création, mais certains Golems avaient une personnalité plus forte. En général, les Golems plus intelligents ont résisté plus longtemps à la Ruine et les Golems à forte personnalité étaient plus vulnérables à l'infection.\"\n\n#. Key:\tSoAct1_EG_GGMiniBoss_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Wickeds\"\nmsgstr \"Diaboliques\"\n\n#. Key:\tSoAct1_EG_LoneDrone_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Drones delivered messages and gifts before Ruin. People were happy when they heard them approaching back then.\"\nmsgstr \"Des Drones ont livré des messages et des cadeaux avant la Ruine. Les gens étaient heureux quand ils les entendaient approcher à l'époque.\"\n\n#. Key:\tSoAct1_EG_LoneDrone_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Lone Drone\"\nmsgstr \"Drone Solitaire\"\n\n#. Key:\tSoAct1_EG_LoneSewerDrone_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"After Ruin most Golems liked to group together. Only a few chose to stay alone.\"\nmsgstr \"Après la Ruine, la plupart des Golems aimaient se regrouper. Seuls quelques-uns ont choisi de rester seuls.\"\n\n#. Key:\tSoAct1_EG_LoneSewerDrone_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Another Lone Drone\"\nmsgstr \"Un Autre Drone Solitaire\"\n\n#. Key:\tSoAct1_EG_MaceGroup_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"'Attention: our enemies greatest weapon, the holy Mace is stolen. We truly should have destroyed it as the Council suggested.'\"\nmsgstr \"'Attention : la plus grande arme de nos ennemis, la Masse sacrée, a été volée. Nous aurions vraiment dû la détruire comme le Conseil l'a suggéré'\"\n\n#. Key:\tSoAct1_EG_MaceGroup_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Mace Defenders\"\nmsgstr \"Défenseurs de la Masse\"\n\n#. Key:\tSoAct1_EG_MaintainerInvestigatorInvestigators_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"After Ruin, Golems started to have strange behavior. There were a group of them who used the pipes to flood a part of the City. Later these places were called the Sewer.\"\nmsgstr \"Après la ruine, les Golems ont commencé à avoir un comportement étrange. Un groupe d'entre eux a utilisé les tuyaux pour inonder une partie de la Ville. Plus tard, ces endroits ont été appelés les Égouts.\"\n\n#. Key:\tSoAct1_EG_MaintainerInvestigatorInvestigators_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Pipe Golems\"\nmsgstr \"Golems des Tuyaux\"\n\n#. Key:\tSoAct1_EG_MaintainerInvestigators_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Not only the Golems were created by using the Spirits of the Unknown World before Ruin. People found other ways of using this new technology. They created pipes to convey hot water to heat the city and cold water to drink.\"\nmsgstr \"Les Golems n'ont pas seulement été créés en utilisant les esprits du monde inconnu avant la Ruine. Les gens ont trouvé d'autres façons d'utiliser cette nouvelle technologie. Ils ont créé des tuyaux pour transporter de l'eau chaude pour chauffer la ville et de l'eau froide pour boire.\"\n\n#. Key:\tSoAct1_EG_MaintainerInvestigators_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Maintainers of the Pipes\"\nmsgstr \"Responsables de la Tuyauterie\"\n\n#. Key:\tSoAct1_EG_SABeforeWallJump_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Some believed cold can resist Ruin longer than magic. They created places where they kept the temperature beneath the freezing point. As it turned out, not even coldness can resist Ruin forever.\"\nmsgstr \"Certains croyaient que le froid pouvait résister à la Ruine plus longtemps que la magie. Ils ont créé des endroits où ils ont maintenu la température sous le point de gel. Il s'est avéré que même le froid ne peut pas résister à la Ruine pour toujours.\"\n\n#. Key:\tSoAct1_EG_SABeforeWallJump_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Cleaners of the Refrigerator.\"\nmsgstr \"Nettoyeurs de Réfrigérateur.\"\n\n#. Key:\tSoAct1_EG_SAFightMustHave_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"'We won't clear anymore!' said the rebel Maintainer.\\r\\n'Let's declear War!'\"\nmsgstr \"\"\n\n#. Key:\tSoAct1_EG_SAFightMustHave_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Underground Cleaner Band\"\nmsgstr \"Équipe d'Entretien Sous-Terrain\"\n\n#. Key:\tSoAct1_EG_SAFightOptional_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"'Let's make something clear. Maybe this room?'\"\nmsgstr \"'C'est du propre. Tout comme cette pièce ?'\"\n\n#. Key:\tSoAct1_EG_SAFightOptional_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Underground Cleaner Band B\"\nmsgstr \"Équipe d'Entretien Sous-Terrain B\"\n\n#. Key:\tSoAct1_EG_SewerCircleVacuumCleaners_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"People realised that Golem's Spirits have a power beyond imagination. They called it the Ancient Magic. Vacuum Cleaners could use this magic to do their job even better.\"\nmsgstr \"Les gens ont compris que les esprits de Golem ont un pouvoir qui dépasse l'imagination. Ils l'ont appelé la Magie Ancienne. Les Aspirateurs pouvaient utiliser cette magie pour faire leur travail encore plus efficacement.\"\n\n#. Key:\tSoAct1_EG_SewerCircleVacuumCleaners_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Vacuum Cleaners\"\nmsgstr \"Aspirateurs\"\n\n#. Key:\tSoAct1_EG_SewerTeam_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Golem Makers wanted to create something more intelligent as they learned more. They shaped the Maintainers, the first golems capable of talking. Sadly their intelligence vanished as Ruin came.\"\nmsgstr \"Les Créateurs de Golem voulaient créer quelque chose de plus intelligent à mesure qu'ils apprenaient. Ils ont formé les Responsables, les premiers golems capables de parler. Malheureusement, leur intelligence a disparu avec l'arrivée de la Ruine.\"\n\n#. Key:\tSoAct1_EG_SewerTeam_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Sewer Golems\"\nmsgstr \"Golems des Égouts\"\n\n#. Key:\tSoAct1_EG_TL_VacuumTwins_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Libraries were important in the life of the former Realm's citizens. No wonder that many of the golems were created only to dust and organize the books.\"\nmsgstr \"Les bibliothèques ont joué un rôle important dans la vie des citoyens du Royaume. Il n'est pas étonnant que de nombreux golems aient été créés uniquement pour dépoussiérer et ranger les livres.\"\n\n#. Key:\tSoAct1_EG_TL_VacuumTwins_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Library Cleaners\"\nmsgstr \"Nettoyeurs de Bibilothèque\"\n\n#. Key:\tSoAct1_EG_TLSewerCreatureWatch_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Golems never ever attacked the Pipe Walkers. The reason is only known by the wisest Pipe Walker himself. It is because, as he explained: 'Nun dara bum, tuk la.'\"\nmsgstr \"Les Golems n'ont jamais attaqué les Tuyauteurs. La raison n'est connue que du plus sage des Tuyauteurs lui-même. C'est parce que, comme il l'a expliqué : 'Nun dara bum, tuk la.'\"\n\n#. Key:\tSoAct1_EG_TLSewerCreatureWatch_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Sewer Team B\"\nmsgstr \"Équipe B des Égouts\"\n\n#. Key:\tSoAct1_EG_TowerTrio_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"They spent most of their time on the top of those towers - it was clear to me that they would die there as well.\"\nmsgstr \"Ils ont passé la plupart de leur temps au sommet de ces tours - il était clair pour moi qu'ils y mourraient aussi.\"\n\n#. Key:\tSoAct1_EG_TowerTrio_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"The Tower Trio\"\nmsgstr \"Le Trio de la Tour\"\n\n#. Key:\tSoAct2_EG_BounceTrio_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Lava Jumpers are former Golems who fell into the lava. Some of them return to join their former Golem companions.\"\nmsgstr \"Les Plongeurs de Lave sont d'anciens Golems tombés dans la lave. Certains d'entre eux reviennent pour rejoindre leurs anciens compagnons Golems.\"\n\n#. Key:\tSoAct2_EG_BounceTrio_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Bounce Trio\"\nmsgstr \"Trio du Rebond\"\n\n#. Key:\tSoAct2_EG_C_BeforeKey_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"It's still unclear what makes some creatures touched by Ruin to group together. Some believes those who had similar emotions when Ruin came were likely to form a group.\"\nmsgstr \"On ne sait toujours pas ce qui pousse certaines créatures touchées par la Ruine à se regrouper. Certains pensent que ceux qui ont eu des émotions similaires lors de l'arrivée de la Ruine étaient susceptibles de former un groupe.\"\n\n#. Key:\tSoAct2_EG_C_BeforeKey_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Anxious Armours\"\nmsgstr \"Armures de l'Angoisse\"\n\n#. Key:\tSoAct2_EG_C_Bridge_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Crafting was always the obsession of Dwarves. In their workshops they forged mighty weapons and wondrous armours. Their love for their craft was so strong that instead of their body, Ruin preserved their iron works.\"\nmsgstr \"L'artisanat a toujours été l'obsession des Nains. Dans leurs ateliers, ils forgeaient de puissantes armes et de merveilleuses armures. Leur amour pour leur artisanat était si fort qu'au lieu de leur corps, la Ruine a préservé leur travail du fer.\"\n\n#. Key:\tSoAct2_EG_C_Bridge_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Bridge Brigade\"\nmsgstr \"Brigade des Ponts\"\n\n#. Key:\tSoAct2_EG_C_LoneShadeSphere_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Before Ruin there was no other humanoid race but human. New races are created by Ruin's Shades. They roam the lands looking for any living being which they can possess. Once they become part of a creature its body will start to change.\"\nmsgstr \"Avant la Ruine, il n'y avait pas d'autre race humanoïde que l'homme. De nouvelles races furent créées par les Ombres de la Ruine. Elles parcourent les terres à la recherche de tout être vivant qu'elles peuvent posséder. Une fois qu'elles font partie d'une créature, son corps commence à changer.\"\n\n#. Key:\tSoAct2_EG_C_LoneShadeSphere_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Weird Floating Thing\"\nmsgstr \"Étrange Truc Flottant\"\n\n#. Key:\tSoAct2_EG_C_OfficeGuards_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Watching the only way to the Office did not bring enough protection. If any intruder managed to pass the Patrols he still had to face the Guardians to proceed.\"\nmsgstr \"Le fait de surveiller la seule voie d'accès au Bureau n'a pas apporté une protection suffisante. Si un intrus parvenait à passer les patrouilles, il devait quand même affronter les gardiens pour continuer.\"\n\n#. Key:\tSoAct2_EG_C_OfficeGuards_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Guardians of the Law\"\nmsgstr \"Gardiens de la Loi\"\n\n#. Key:\tSoAct2_EG_C_OfficePatrols_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Going into the Law's High Office was forbidden even for most of the Dwarves. Only one path lead to the Office and that was guarded by the Patrols.\"\nmsgstr \"Il était interdit d'entrer dans le Bureau Central de la Loi, même pour la plupart des nains. Un seul chemin menait au Bureau et il était gardé par les patrouilles.\"\n\n#. Key:\tSoAct2_EG_C_OfficePatrols_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Patrols of the Law\"\nmsgstr \"Patrouilles de la Loi\"\n\n#. Key:\tSoAct2_EG_DG_Left_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Deep beneath the Catacombs there is a secret place called the Dwarven Gate. Elite dwarves who worked here were placed above the Law. They were seeking a way to fight Ruin with Ruin's magic.\"\nmsgstr \"Sous les catacombes se trouve un endroit secret appelé la Porte des Nains. Les nains d'élite qui travaillaient ici étaient placés au-dessus de la loi. Ils cherchaient un moyen de combattre la Ruine avec la magie de la Ruine.\"\n\n#. Key:\tSoAct2_EG_DG_Left_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Glorious Group\"\nmsgstr \"Groupe Glorieux\"\n\n#. Key:\tSoAct2_EG_DG_RightFloor_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Even though most of the common Dwarves never even heard about Dwarven Gate some were needed to do the hard work. Now that Ruin won, Dwarves are finally equal.\"\nmsgstr \"Même si la plupart des Nains communs n'ont jamais entendu parler de la Porte des Nains, il en fallait quelques-uns pour faire le travail. Maintenant que la Ruine a gagné, les Nains sont enfin à égalité.\"\n\n#. Key:\tSoAct2_EG_DG_RightFloor_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Not so Elite Dwarves\"\nmsgstr \"Nains pas si Élites\"\n\n#. Key:\tSoAct2_EG_DG_RightUpOptional_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"One idea of the Elite Dwarves was to create giant statues which are able to trap Ruin's essence. Even if they were right they never managed to make enough sculptures.\"\nmsgstr \"Une idée des Nains d'Élite était de créer des statues géantes capables de piéger l'essence de la Ruine. Même s'ils avaient raison, ils n'ont jamais réussi à faire assez de sculptures.\"\n\n#. Key:\tSoAct2_EG_DG_RightUpOptional_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Sculptors\"\nmsgstr \"Sculpteurs\"\n\n#. Key:\tSoAct2_EG_DwarfBoss_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Dwarven Statues were meant to imprison the essence of Ruin. However there were some Dwarven scientists who feared that the statues were not safe and in the long run they wouldn't be able to resist the power of Ruin...\"\nmsgstr \"Les Statues Naines étaient destinées à emprisonner l'essence de la Ruine. Cependant, certains scientifiques nains craignaient que les statues ne soient pas en sécurité et qu'à long terme, elles ne puissent pas résister au pouvoir de la Ruine...\"\n\n#. Key:\tSoAct2_EG_DwarfBoss_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Dwarven Statue\"\nmsgstr \"Statue Naine\"\n\n#. Key:\tSoAct2_EG_GolemFirst_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Stone Golems are the cheap copies of the Runic Realm Golems. If Ruin twists the creatures mind then it will definitely have no effect on these ones.\"\nmsgstr \"Les Pierre Golems sont les copies bon marché des Golems du Royaume Runique. Si la Ruine tord l'esprit des créatures, elle n'aura certainement aucun effet sur celles-ci.\"\n\n#. Key:\tSoAct2_EG_GolemFirst_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Sphere Golem\"\nmsgstr \"Sphère Golem\"\n\n#. Key:\tSoAct2_EG_GolemSecond_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Looks like the second try is just as bad as the first one.\"\nmsgstr \"On dirait que le deuxième essai est tout aussi mauvais que le premier.\"\n\n#. Key:\tSoAct2_EG_GolemSecond_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Second Sphere Golem\"\nmsgstr \"Deuxième Sphère Golem\"\n\n#. Key:\tSoAct2_EG_GolemThird_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Whoever made this Golem, he should have stopped after the second try.\"\nmsgstr \"Celui qui a fait ce Golem aurait dû s'arrêter après le deuxième essai.\"\n\n#. Key:\tSoAct2_EG_GolemThird_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Third Sphere Golem\"\nmsgstr \"Troisième Sphère Golem\"\n\n#. Key:\tSoAct2_EG_HutFishies_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Now that the Fishys are gone, the Lake's piranhas can live in peace and eat whoever comes close.\"\nmsgstr \"Maintenant que les Poiscailles sont partis, les piranhas du lac peuvent vivre en paix et manger quiconque s'approche d'eux.\"\n\n#. Key:\tSoAct2_EG_HutFishies_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Abandoned Fishy Slaves\"\nmsgstr \"Poiscailles Esclaves Abandonnés\"\n\n#. Key:\tSoAct2_EG_HutFlyArmy_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"No one knows where the Flies came from. Although you have a very clear idea on where they should go...\"\nmsgstr \"Personne ne sait d'où viennent les mouches. Bien que vous ayez une idée très précise de l'endroit où elles doivent aller...\"\n\n#. Key:\tSoAct2_EG_HutFlyArmy_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Annoying Flies\"\nmsgstr \"Mouches Ennuyantes\"\n\n#. Key:\tSoAct2_EG_LavaBoss_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Armour Wrath was the most ambitious and majestic work of the Golem Maker. He used all his remaining strength to create this mighty Golem. It's a pity that all his efforts were in vain.\"\nmsgstr \"L'Armure de Colère est le travail le plus ambitieux et le plus majestueux du Créateur de Golem. Il a utilisé toutes ses forces restantes pour créer ce puissant Golem. Il est dommage que tous ses efforts aient été vains.\"\n\n#. Key:\tSoAct2_EG_LavaBoss_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Armour Wrath\"\nmsgstr \"Armure de Colère\"\n\n#. Key:\tSoAct2_EG_LavaDeepTeam_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"A fourth Sphere Golem? Someone never gives up...\"\nmsgstr \"Un quatrième Sphère Golem ? On ne renonce jamais...\"\n\n#. Key:\tSoAct2_EG_LavaDeepTeam_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Fourth Sphere Golem\"\nmsgstr \"Quatrième Sphère Golem\"\n\n#. Key:\tSoAct2_EG_LavaJumpers_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"When a Golem falls into the lava its stone body will melt away. The spirit however resists the heat and will be looking for another body...\"\nmsgstr \"Lorsqu'un Golem tombe dans la lave, son corps de pierre fond. L'esprit résistera cependant à la chaleur et cherchera un autre corps...\"\n\n#. Key:\tSoAct2_EG_LavaJumpers_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Lava Jumpers\"\nmsgstr \"Plongeurs de Lave\"\n\n#. Key:\tSoAct2_EG_LavaTeamX_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Divided they fall, united they divide...\"\nmsgstr \"Divisés ils tombent, unis ils divisent...\"\n\n#. Key:\tSoAct2_EG_LavaTeamX_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Golem Group\"\nmsgstr \"Groupe de Golems\"\n\n#. Key:\tSoAct2_EG_LavaTrio_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Wherever Golems go after death these three will go there together.\"\nmsgstr \"Peu importe où les Golems iront après leur mort, ces trois-là s'y rendront ensemble.\"\n\n#. Key:\tSoAct2_EG_LavaTrio_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Golem Trio\"\nmsgstr \"Trio de Golems\"\n\n#. Key:\tSoAct2_EG_OutpostLeft_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"To keep Ruin away dwarves forbade everything related to Ruin's magic. This might have worked in theory but they failed to notice that their mechanical devices were also powered by Ruin.\"\nmsgstr \"Pour éloigner la Ruine, les nains interdisaient tout ce qui avait trait à la magie de la Ruine. Cela aurait pu fonctionner en théorie, mais ils n'ont pas remarqué que leurs dispositifs mécaniques étaient également alimentés par la Ruine.\"\n\n#. Key:\tSoAct2_EG_OutpostLeft_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Guardians of the West Wall\"\nmsgstr \"Gardiens du Mur de l'Ouest\"\n\n#. Key:\tSoAct2_EG_OutpostRight_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Ruin was not only meant for destruction, it could also preserve. Ruin gave endless life for those who survived at the cost of twisting their minds.\"\nmsgstr \"La Ruine n'était pas seulement destinée à la destruction, elle pouvait aussi préserver. La Ruine a donné une vie sans fin à ceux qui ont survécu malgré le fait qu'ils aient dû perdre la tête.\"\n\n#. Key:\tSoAct2_EG_OutpostRight_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Guardians of the East Wall\"\nmsgstr \"Gardiens du Mur de l'Est\"\n\n#. Key:\tSoAct2_EG_OutpostWallFirst_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Dwarves fought Ruin with Rules. These soldiers were ordered here to guard the Outpost. Their will to obey the order was so strong that even death couldn't break it.\"\nmsgstr \"Les Nains ont combattu la Ruine dans les Règles. Ces soldats ont reçu l'ordre de garder l'avant-poste. Leur volonté d'obéir à l'ordre était si forte que même la mort ne pouvait pas la briser.\"\n\n#. Key:\tSoAct2_EG_OutpostWallFirst_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Patrols of the Outpost Wall\"\nmsgstr \"Patrouilles de l'Avant-Poste\"\n\n#. Key:\tSoAct2_EG_Shore_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"After Ruin turned them into Monsters some creatures gathered together. Whether it's the effect of Ruin or something from their former life is unclear.\"\nmsgstr \"Après que la Ruine les ait transformés en monstres, certaines créatures se sont rassemblées. On ne sait pas très bien si c'est l'effet de la Ruine ou quelque chose provenant de leur ancienne vie.\"\n\n#. Key:\tSoAct2_EG_Shore_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Shore Monsters\"\nmsgstr \"Monstres du Rivage\"\n\n#. Key:\tSoAct2_EG_SlideFishyTeam_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Fishys were produced by the Great Kobold tribe for slaves. Some of them managed to escape, but they couldn't go far from the Lake.\"\nmsgstr \"Les Poiscailles étaient produits par la tribu des Grands Kobold pour les esclaves. Certains d'entre eux ont réussi à s'échapper, mais ils n'ont pas pu s'éloigner du lac.\"\n\n#. Key:\tSoAct2_EG_SlideFishyTeam_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Deserter Fishys\"\nmsgstr \"Poiscailles Déserteurs\"\n\n#. Key:\tSoAct2_EG_SlidePathEnd_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Deserter Fishys always kept a Fishy group close to the exit of their secret hideout. They protected the others and watched the kobolds to find the right time to venture back to the Lake.\"\nmsgstr \"Les Poiscailles Déserteurs gardaient toujours un groupe de Poiscaille près de la sortie de leur cachette secrète. Ils protégeaient les autres et surveillaient les kobolds pour trouver le bon moment de s'aventurer à nouveau sur le lac.\"\n\n#. Key:\tSoAct2_EG_SlidePathEnd_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Patrol Fishys\"\nmsgstr \"Patrouille de Poiscailles\"\n\n#. Key:\tSoAct2_EG_WormHole_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Worms kept distance from each other before Ruin. It's strange how a force which tears everything apart can also unite.\"\nmsgstr \"Avant la Ruine, les Vers se tenaient à distance les uns des autres. C'est étrange comme une force qui déchire tout peut aussi s'unir.\"\n\n#. Key:\tSoAct2_EG_WormHole_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Worms\"\nmsgstr \"Vers\"\n\n#. Key:\tSoAct2_EG_Wormy_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"There was a time when Worms only made damage to fields and gardens. Now they are a bit more ambitious...\"\nmsgstr \"Il fut un temps où les vers n'endommageaient que les champs et les jardins. Maintenant, ils sont un peu plus ambitieux...\"\n\n#. Key:\tSoAct2_EG_Wormy_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Worm\"\nmsgstr \"Ver\"\n\n#. Key:\tSoAct2_EG_WWBoss_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"When Ruin appeared some decided to abandon civilization and return to nature. Their leader, the Fallen Druid cast an ancient spell to protect his plants from Ruin. His spell partly worked but at a terrible cost.\"\nmsgstr \"Lorsque la Ruine est apparue, certains ont décidé d'abandonner la civilisation et de retourner à la nature. Leur chef, le Druide Déchu, a jeté un ancien sort pour protéger ses plantes de la Ruine. Son sort a partiellement fonctionné mais à quel prix.\"\n\n#. Key:\tSoAct2_EG_WWBoss_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Fallen Druid\"\nmsgstr \"Druide Déchu\"\n\n#. Key:\tSoAct3_EG_Act3BubbleGroundMain_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Ruin's power is not only in destruction. When it can't change something it will preserve those attributes which can prepare the possibility to change again. Ruin's power is in change.\"\nmsgstr \"La puissance de la Ruine ne réside pas seulement dans la destruction. Lorsqu'elle ne peut pas changer quelque chose, elle préserve les attributs qui peuvent préparer la possibilité de changer à nouveau. Le pouvoir de la Ruine est dans le changement.\"\n\n#. Key:\tSoAct3_EG_Act3BubbleGroundMain_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Maintainer Spellcasters\"\nmsgstr \"Responsales des Sorts\"\n\n#. Key:\tSoAct3_EG_Act3FinalBattle_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Even though Ruin doesn't have consciousness nor the ability to think it somehow reacts to your presence. As if it knew the threat you present, Ruin tries all it can to stop you from leaving the Ruined Realm.\"\nmsgstr \"Même si la Ruine n'a ni conscience ni capacité de penser, elle réagit d'une manière ou d'une autre à votre présence. Comme si elle connaissait la menace que vous représentez, la Ruine fait tout son possible pour vous empêcher de quitter le Royaume en Ruines.\"\n\n#. Key:\tSoAct3_EG_Act3FinalBattle_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Ruined Convention\"\nmsgstr \"Convention Ruinée\"\n\n#. Key:\tSoAct3_EG_Act3PipeGroupFirst_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"There is a difference between how Humans and Golems are transformed by Ruin. Human bodies reach their final form in a few decades but Golems never stop changing. There is always a new, more vicious type.\"\nmsgstr \"Il y a une différence entre la façon dont les humains et les Golems sont transformés par la Ruine. Les corps humains atteignent leur forme finale en quelques décennies, mais les Golems ne cessent de changer. Il y a toujours un nouveau modèle, plus vicieux.\"\n\n#. Key:\tSoAct3_EG_Act3PipeGroupFirst_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Red Drones\"\nmsgstr \"Drones Rouges\"\n\n#. Key:\tSoAct3_EG_Act3PipeGroupSecond_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Transformation is relative to intelligence. Creatures with consciousness have a strong desire to reserve their ego. Ruin can fool them a few times but later they become invulnerable to Ruin's changing power.\"\nmsgstr \"La transformation est relative à l'intelligence. Les créatures dotées d'une conscience ont un fort désir de préserver leur ego. La Ruine peut les tromper quelques fois, mais plus tard, elles deviennent invulnérables au pouvoir changeant de la Ruine.\"\n\n#. Key:\tSoAct3_EG_Act3PipeGroupSecond_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"More Drones\"\nmsgstr \"Davantage de Drones\"\n\n#. Key:\tSoAct3_EG_Act3RangedCleanerTwins_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Ruin's nature is confusing for the human mind. It can build, it can destroy, it can use, it can be used. These actions have the same priority for Ruin. All that matters is that it can do something. And with time it wants more and more.\"\nmsgstr \"La nature de la Ruine est déroutante pour l'esprit humain. Il peut construire, il peut détruire, il peut utiliser, il peut être utilisé. Ces actions ont la même priorité pour la Ruine. Tout ce qui compte, c'est qu'elle peut faire quelque chose. Et avec le temps, il en veut de plus en plus.\"\n\n#. Key:\tSoAct3_EG_Act3RangedCleanerTwins_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Cleaner Twins\"\nmsgstr \"Jumeaux Nettoyeurs\"\n\n#. Key:\tSoAct3_EG_Act3VacuumTwins_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Ruin's logic is predictable when you understand its nature. When it's not possible to create more the creation process can be restarted by destroying everything first.\"\nmsgstr \"La logique de la Ruine est prévisible quand on en comprend la nature. Lorsqu'il n'est pas possible d'en créer davantage, le processus de création peut être relancé en détruisant d'abord tout.\"\n\n#. Key:\tSoAct3_EG_Act3VacuumTwins_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Elite Twins\"\nmsgstr \"Jumeaux d'Elite\"\n\n#. Key:\tWhiteWall_EG_AfterKobold_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Creating intelligence was not enough for the Golem Makers. They wanted to get even further. They wanted to create Golems with emotions.\"\nmsgstr \"La création d'intelligence ne suffisait pas pour les Créateurs de Golem. Ils voulaient aller encore plus loin. Ils voulaient créer des Golems avec des émotions.\"\n\n#. Key:\tWhiteWall_EG_AfterKobold_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Flying Maintainer\"\nmsgstr \"Responsables de Vol\"\n\n#. Key:\tWhiteWall_EG_BeforeKobold_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"When the Cataclysm happened and Ruin came the Golems started to change. Instead of doing their daily work some of them turned against their masters.\"\nmsgstr \"Lorsque le Cataclysme s'est produit et que la Ruine est arrivée, les Golems ont commencé à changer. Au lieu de faire leur travail quotidien, certains d'entre eux se sont retournés contre leurs maîtres.\"\n\n#. Key:\tWhiteWall_EG_BeforeKobold_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Infected Golems\"\nmsgstr \"Golems Infectés\"\n\n#. Key:\tWhiteWall_EG_FirstCombat_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Cleaners were the first Golems ever made. Before the Cataclysm they did all the monoton work so that the people had more time to think and to create.\"\nmsgstr \"Les Nettoyeurs ont été les premiers Golems jamais fabriqués. Avant le Cataclysme, ils faisaient tout le travail monotone pour que les gens aient plus de temps pour réfléchir et créer.\"\n\n#. Key:\tWhiteWall_EG_FirstCombat_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Whitewall Cleaners\"\nmsgstr \"Nettoyeurs du Mur Blanc\"\n\n#. Key:\tWhiteWall_EG_FirstOptionalCombat_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"After the different types of Cleaners, Golem Makers wanted to create something greater than working robots. They started to design creatures with intelligence.\"\nmsgstr \"Après les différents types de Nettoyeurs, les Créateurs de Golem voulaient créer quelque chose de plus grand que des robots en fonctionnement. Ils ont commencé à concevoir des créatures intelligentes.\"\n\n#. Key:\tWhiteWall_EG_FirstOptionalCombat_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Whitewall Maintainers\"\nmsgstr \"Responsables du Mur Blanc\"\n\n#. Key:\tAbacus_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/Abacus.Abacus.Description\n#: /Game/SO/Items/QuestItems/Abacus.Abacus.Description\nmsgctxt \"ItemData\"\nmsgid \"When you don't have enough fingers to count something you need this abacus.\"\nmsgstr \"Quand vous n'avez pas assez de doigts pour compter quelque chose, vous avez besoin de ce boulier.\"\n\n#. Key:\tAbacus_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/Abacus.Abacus.Name\n#: /Game/SO/Items/QuestItems/Abacus.Abacus.Name\nmsgctxt \"ItemData\"\nmsgid \"Abacus\"\nmsgstr \"Boulier\"\n\n#. Key:\tAbacusGhost_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/AbacusGhost.AbacusGhost.Description\n#: /Game/SO/Items/QuestItems/AbacusGhost.AbacusGhost.Description\nmsgctxt \"ItemData\"\nmsgid \"When the Abacus is killed its spirit might return to get even with its murderer.\"\nmsgstr \"Lorsque le Boulier est tué, son esprit peut revenir pour se venger de son meurtrier.\"\n\n#. Key:\tAbacusGhost_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/AbacusGhost.AbacusGhost.Name\n#: /Game/SO/Items/QuestItems/AbacusGhost.AbacusGhost.Name\nmsgctxt \"ItemData\"\nmsgid \"Ghost Abacus\"\nmsgstr \"Boulier Fantôme\"\n\n#. Key:\tAbacusGhostFlower_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/AbacusGhostFlower.AbacusGhostFlower.Description\n#: /Game/SO/Items/QuestItems/AbacusGhostFlower.AbacusGhostFlower.Description\nmsgctxt \"ItemData\"\nmsgid \"Petals of a ghost flower.\"\nmsgstr \"Pétales d'une fleur fantôme.\"\n\n#. Key:\tAbacusGhostFlower_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/AbacusGhostFlower.AbacusGhostFlower.Name\n#: /Game/SO/Items/QuestItems/AbacusGhostFlower.AbacusGhostFlower.Name\nmsgctxt \"ItemData\"\nmsgid \"Ghost Petals\"\nmsgstr \"Pétales de Fantôme\"\n\n#. Key:\tAbacusSpellBook_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/AbacusSpellBook.AbacusSpellBook.Description\n#: /Game/SO/Items/QuestItems/AbacusSpellBook.AbacusSpellBook.Description\nmsgctxt \"ItemData\"\nmsgid \"An ancient paper\"\nmsgstr \"Un papier ancien\"\n\n#. Key:\tAbacusSpellBook_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/AbacusSpellBook.AbacusSpellBook.Name\n#: /Game/SO/Items/QuestItems/AbacusSpellBook.AbacusSpellBook.Name\nmsgctxt \"ItemData\"\nmsgid \"Scroll of Surrection\"\nmsgstr \"Parchemin de Surrection\"\n\n#. Key:\tAbacusSpellBook_page_0\n#. SourceLocation:\t/Game/SO/Items/QuestItems/AbacusSpellBook.AbacusSpellBook.Pages(0).Pages\n#: /Game/SO/Items/QuestItems/AbacusSpellBook.AbacusSpellBook.Pages(0).Pages\nmsgctxt \"ItemData\"\nmsgid \"Wisy et al. [3152] point out that any entity can be banished by throwing the proper object into his/her/its face a few times, making him/her/it annoyed thus unconcerned, as long as the target entity has a face.\\r\\n\\r\\nThe proper object in case of ghosts is something Surrected [Inti and Clevi 3153], as only Surrected substance can interact with ghosts.\\r\\n\\r\\nAny object covered with petals of Ghost Flower can be Surrected using the following method:\\r\\n\\r\\n- Say \\\"Sorry my <object name>!\\\"\\r\\n- Break the object into pieces with a heated hammer\\r\\n- Say your favourite color\\r\\n- Croon \\\"La La LaLaLa LaLaLa\\\" until the object is coagulated into a single Surrected object\"\nmsgstr \"Wisy et al. [3152] soulignent que toute entité peut être bannie en lui lançant plusieurs fois l'objet approprié à la figure, ce qui la met en colère et la laisse indifférente, tant que l'entité cible a un visage.\\n\\nL'objet approprié dans le cas des fantômes est quelque chose de Surrecté [Inti et Clevi 3153], car seule la substance Surrectée peut interagir avec les fantômes.\\n\\nTout objet recouvert de pétales de Fleur de Fantôme peut être Surrecté en utilisant la méthode suivante :\\n\\n- Dites \\\"Désolé mon <object name> !\\\"\\n- Cassez l'objet en morceaux avec un marteau chauffé\\n- Dites votre couleur préférée\\n- Chantez \\\"La La LaLaLa LaLaLa\\\" jusqu'à ce que l'objet soit coagulé en un seul objet Surrecté\"\n\n#. Key:\tAbacusSpellBook_page_1\n#. SourceLocation:\t/Game/SO/Items/QuestItems/AbacusSpellBook.AbacusSpellBook.Pages(1).Pages\n#: /Game/SO/Items/QuestItems/AbacusSpellBook.AbacusSpellBook.Pages(1).Pages\nmsgctxt \"ItemData\"\nmsgid \"WARNING: not following the instructions exactly leads to failure and also increases the probability of injury and or death [Carfy 3154].\\r\\n\\r\\nREFERENCES:\\r\\n\\r\\nWISY, W., BUSY, B., WEIRDY, Y., AND LUCKY, L. 3152. The best ways to get rid of anyone potentially distracting us with questions like \\\"What do you read?\\\"\\r\\n\\r\\nInti, I., AND Clevi, C. 3153. Insulting dead ancestors using Surrected objects\\r\\n\\r\\nCarfy C. 3154. What happened to Clevi, C. and Inti, I.\"\nmsgstr \"AVERTISSEMENT : le fait de ne pas suivre exactement les instructions entraîne une défaillance et augmente également la probabilité de blessure et/ou de décès [Carfy 3154].\\n\\nRÉFÉRENCES :\\n\\nWISY, W., BUSY, B., WEIRDY, Y., ET CHANCEUX, L. 3152. Les meilleurs moyens de se débarrasser de toute personne susceptible de nous distraire avec des questions comme \\\"Que lisez-vous ?\\\"\\n\\nInti, I., et Clevi, C. 3153. Insulter les ancêtres morts en utilisant les objets de Surrection\\n\\nCarfy C. 3154. Qu'est-il arrivé à Clevi, C. et Inti, I.\"\n\n#. Key:\tAll_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/All.All.Description\n#: /Game/SO/Items/QuestItems/All.All.Description\nmsgctxt \"ItemData\"\nmsgid \"Maybe it was a bit too much?\"\nmsgstr \"Peut-être était-ce un peu trop ?\"\n\n#. Key:\tAll_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/All.All.Name\n#: /Game/SO/Items/QuestItems/All.All.Name\nmsgctxt \"ItemData\"\nmsgid \"Everything, except an Abacus\"\nmsgstr \"Tout, sauf un Boulier\"\n\n#. Key:\tArtifact_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/Artifact.Artifact.Description\n#: /Game/SO/Items/QuestItems/Artifact.Artifact.Description\nmsgctxt \"ItemData\"\nmsgid \"A very rare and powerful item which is used for opening a portal into the Unknown Realm. If you gather three and give them to the Wizard he shall set you free.\"\nmsgstr \"Un objet très rare et puissant qui sert à ouvrir un portail dans le royaume inconnu. Si vous en rassemblez trois et les donnez au Magicien, il vous libérera.\"\n\n#. Key:\tArtifact_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/Artifact.Artifact.Name\n#: /Game/SO/Items/QuestItems/Artifact.Artifact.Name\nmsgctxt \"ItemData\"\nmsgid \"Artifact\"\nmsgstr \"Artefact\"\n\n#. Key:\tAxeMainGame_desc\n#. SourceLocation:\t/Game/SO/Items/Weapons/AxeMainGame.AxeMainGame.Description\n#. Key:\tAxe_desc\n#. SourceLocation:\t/Game/SO/Items/Weapons/Axe.Axe.Description\n#: /Game/SO/Items/Weapons/Axe.Axe.Description\n#: /Game/SO/Items/Weapons/AxeMainGame.AxeMainGame.Description\nmsgctxt \"ItemData\"\nmsgid \"Axes are usefull, but if you don't need them you can just throw them away.\"\nmsgstr \"Les haches sont utiles, mais si vous n'en avez pas besoin, vous pouvez les jeter.\"\n\n#. Key:\tAxeMainGame_name\n#. SourceLocation:\t/Game/SO/Items/Weapons/AxeMainGame.AxeMainGame.Name\n#. Key:\tAxe_name\n#. SourceLocation:\t/Game/SO/Items/Weapons/Axe.Axe.Name\n#: /Game/SO/Items/Weapons/Axe.Axe.Name\n#: /Game/SO/Items/Weapons/AxeMainGame.AxeMainGame.Name\nmsgctxt \"ItemData\"\nmsgid \"Axes\"\nmsgstr \"Haches\"\n\n#. Key:\tBlueCrystal_desc\n#. SourceLocation:\t/Game/SO/Items/Valuable/BlueCrystal.BlueCrystal.Description\n#: /Game/SO/Items/Valuable/BlueCrystal.BlueCrystal.Description\nmsgctxt \"ItemData\"\nmsgid \"An ancient crystal people like to buy.\"\nmsgstr \"Un ancien peuple de cristal aime en acheter.\"\n\n#. Key:\tBlueCrystal_name\n#. SourceLocation:\t/Game/SO/Items/Valuable/BlueCrystal.BlueCrystal.Name\n#: /Game/SO/Items/Valuable/BlueCrystal.BlueCrystal.Name\nmsgctxt \"ItemData\"\nmsgid \"Blue Crystal\"\nmsgstr \"Cristal Bleu\"\n\n#. Key:\tBlueGem_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/BlueGem.BlueGem.Description\n#: /Game/SO/Items/QuestItems/BlueGem.BlueGem.Description\nmsgctxt \"ItemData\"\nmsgid \"A small precious blue stone.\"\nmsgstr \"Une petite pierre bleue précieuse.\"\n\n#. Key:\tBlueGem_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/BlueGem.BlueGem.Name\n#: /Game/SO/Items/QuestItems/BlueGem.BlueGem.Name\nmsgctxt \"ItemData\"\nmsgid \"Blue Gem\"\nmsgstr \"Gemme Bleue\"\n\n#. Key:\tDemonSword_desc\n#. SourceLocation:\t/Game/SO/Items/Weapons/DemonSword.DemonSword.Description\n#: /Game/SO/Items/Weapons/DemonSword.DemonSword.Description\nmsgctxt \"ItemData\"\nmsgid \"The mighty sword of Kharutar the Demon Ruler. Legend says he once cut one of his fingers with it and in his rage he broke the sword into two. Later it was reforged but some say it would still need some more fixes.\"\nmsgstr \"La puissante épée de Kharutar le Chef des Démons. La légende raconte qu'une fois, il s'est coupé un doigt avec et, dans sa rage, il a brisé l'épée en deux. Plus tard, elle a été reforgée, mais certains disent qu'elle aurait encore besoin d'être réparée.\"\n\n#. Key:\tDemonSword_name\n#. SourceLocation:\t/Game/SO/Items/Weapons/DemonSword.DemonSword.Name\n#: /Game/SO/Items/Weapons/DemonSword.DemonSword.Name\nmsgctxt \"ItemData\"\nmsgid \"Demon Sword\"\nmsgstr \"Épée du Démon\"\n\n#. Key:\tDOKitchenKey_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/DOKitchenKey.DOKitchenKey.Description\n#: /Game/SO/Items/Keys/DOKitchenKey.DOKitchenKey.Description\nmsgctxt \"ItemData\"\nmsgid \"This is one of the many spare keys of the Dwarven Outpost Kitchen. Being able to get into the kitchen was always very important for dwarves.\"\nmsgstr \"C'est l'une des nombreuses clés de rechange de la Cuisine de l'Avant-Poste Nain. Pouvoir entrer dans la cuisine a toujours été très important pour les nains.\"\n\n#. Key:\tDOKitchenKey_name\n#. SourceLocation:\t/Game/SO/Items/Keys/DOKitchenKey.DOKitchenKey.Name\n#: /Game/SO/Items/Keys/DOKitchenKey.DOKitchenKey.Name\nmsgctxt \"ItemData\"\nmsgid \"Kitchen Key\"\nmsgstr \"Clé de la Cuisine\"\n\n#. Key:\tDualBlade_desc\n#. SourceLocation:\t/Game/SO/Items/Weapons/DualBlade.DualBlade.Description\n#: /Game/SO/Items/Weapons/DualBlade.DualBlade.Description\nmsgctxt \"ItemData\"\nmsgid \"In case of trouble, it's better to have double.\"\nmsgstr \"En cas de problème, il est préférable d'en avoir deux.\"\n\n#. Key:\tDualBlade_name\n#. SourceLocation:\t/Game/SO/Items/Weapons/DualBlade.DualBlade.Name\n#: /Game/SO/Items/Weapons/DualBlade.DualBlade.Name\nmsgctxt \"ItemData\"\nmsgid \"Double Sword\"\nmsgstr \"Double Épée\"\n\n#. Key:\tElevatorGem_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/ElevatorGem.ElevatorGem.Description\n#: /Game/SO/Items/QuestItems/ElevatorGem.ElevatorGem.Description\nmsgctxt \"ItemData\"\nmsgid \"A shiny green crystal which activates a weight lifting mechanism. At least by the look of it.\"\nmsgstr \"Un cristal vert brillant qui active un mécanisme de levage de poids. Du moins à première vue.\"\n\n#. Key:\tElevatorGem_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/ElevatorGem.ElevatorGem.Name\n#: /Game/SO/Items/QuestItems/ElevatorGem.ElevatorGem.Name\nmsgctxt \"ItemData\"\nmsgid \"Elevator Gem\"\nmsgstr \"Gemme de l'Ascenceur\"\n\n#. Key:\tElevatorLeverCrystal_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/ElevatorLeverCrystal.ElevatorLeverCrystal.Description\n#: /Game/SO/Items/QuestItems/ElevatorLeverCrystal.ElevatorLeverCrystal.Description\nmsgctxt \"ItemData\"\nmsgid \"You got this item for free from a Merchant so you hardly believe it has any value. It might be used as some sort of a mechanism activator though. Hopefully not for a trap.\"\nmsgstr \"Vous avez obtenu cet article gratuitement auprès d'un marchand, vous ne croyez donc pas qu'il ait une quelconque valeur. Il peut cependant être utilisé comme une sorte de déclencheur de mécanisme. Espérons que ce n'est pas un piège.\"\n\n#. Key:\tElevatorLeverCrystal_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/ElevatorLeverCrystal.ElevatorLeverCrystal.Name\n#: /Game/SO/Items/QuestItems/ElevatorLeverCrystal.ElevatorLeverCrystal.Name\nmsgctxt \"ItemData\"\nmsgid \"Elevator Crystal\"\nmsgstr \"Cristal de l'Ascenceur\"\n\n#. Key:\tFountainFlower_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/FountainFlower.FountainFlower.Description\n#: /Game/SO/Items/QuestItems/FountainFlower.FountainFlower.Description\nmsgctxt \"ItemData\"\nmsgid \"Flower acquired from a fountain.\"\nmsgstr \"Fleur obtenue à partir d'une fontaine.\"\n\n#. Key:\tFountainFlower_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/FountainFlower.FountainFlower.Name\n#: /Game/SO/Items/QuestItems/FountainFlower.FountainFlower.Name\nmsgctxt \"ItemData\"\nmsgid \"Fountain Flower\"\nmsgstr \"Fleur de Fontaine\"\n\n#. Key:\tGateKeeperSeat_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/GateKeeperSeat.GateKeeperSeat.Description\n#: /Game/SO/Items/QuestItems/GateKeeperSeat.GateKeeperSeat.Description\nmsgctxt \"ItemData\"\nmsgid \"A simple seat of size XXXXXXXXXL\"\nmsgstr \"Un simple siège de taille XXXXXXXXXL\"\n\n#. Key:\tGateKeeperSeat_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/GateKeeperSeat.GateKeeperSeat.Name\n#: /Game/SO/Items/QuestItems/GateKeeperSeat.GateKeeperSeat.Name\nmsgctxt \"ItemData\"\nmsgid \"Giant Seat\"\nmsgstr \"Siège Géant\"\n\n#. Key:\tKeyAADoorNearDungeonExit_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyAADoorNearDungeonExit.KeyAADoorNearDungeonExit.Description\n#: /Game/SO/Items/Keys/KeyAADoorNearDungeonExit.KeyAADoorNearDungeonExit.Description\nmsgctxt \"ItemData\"\nmsgid \"A key without a proper item description\"\nmsgstr \"Une clé sans description correcte de l'article\"\n\n#. Key:\tKeyAADoorNearDungeonExit_name\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyAADoorNearDungeonExit.KeyAADoorNearDungeonExit.Name\n#: /Game/SO/Items/Keys/KeyAADoorNearDungeonExit.KeyAADoorNearDungeonExit.Name\nmsgctxt \"ItemData\"\nmsgid \"Arcade Key\"\nmsgstr \"Clé de l'Arcade\"\n\n#. Key:\tKeyAAFirstFight_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyAAFirstFight.KeyAAFirstFight.Description\n#: /Game/SO/Items/Keys/KeyAAFirstFight.KeyAAFirstFight.Description\nmsgctxt \"ItemData\"\nmsgid \"Weird\"\nmsgstr \"Bizarre\"\n\n#. Key:\tKeyAAFirstFight_name\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyAAFirstFight.KeyAAFirstFight.Name\n#: /Game/SO/Items/Keys/KeyAAFirstFight.KeyAAFirstFight.Name\nmsgctxt \"ItemData\"\nmsgid \"Weird Key\"\nmsgstr \"Clé Bizarre\"\n\n#. Key:\tKeyAAMainFirstDoor_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyAAMainFirstDoor.KeyAAMainFirstDoor.Description\n#: /Game/SO/Items/Keys/KeyAAMainFirstDoor.KeyAAMainFirstDoor.Description\nmsgctxt \"ItemData\"\nmsgid \"Sometimes the lock is harder to find than the key.\"\nmsgstr \"Parfois, la serrure est plus difficile à trouver que la clé.\"\n\n#. Key:\tKeyAAMainFirstDoor_name\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyAAMainFirstDoor.KeyAAMainFirstDoor.Name\n#: /Game/SO/Items/Keys/KeyAAMainFirstDoor.KeyAAMainFirstDoor.Name\nmsgctxt \"ItemData\"\nmsgid \"Key of Something\"\nmsgstr \"Clé de quelque chose\"\n\n#. Key:\tKeyAGPortalFight_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyAGPortalFight.KeyAGPortalFight.Description\n#: /Game/SO/Items/Keys/KeyAGPortalFight.KeyAGPortalFight.Description\nmsgctxt \"ItemData\"\nmsgid \"Just another key.\"\nmsgstr \"Juste une autre clé.\"\n\n#. Key:\tKeyAGPortalFight_name\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyAGPortalFight.KeyAGPortalFight.Name\n#: /Game/SO/Items/Keys/KeyAGPortalFight.KeyAGPortalFight.Name\nmsgctxt \"ItemData\"\nmsgid \"Eastern Key\"\nmsgstr \"Clé de l'Est\"\n\n#. Key:\tKeyBronze_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyBronze.KeyBronze.Description\n#: /Game/SO/Items/Keys/KeyBronze.KeyBronze.Description\nmsgctxt \"ItemData\"\nmsgid \"A reforged Bronze Key.\"\nmsgstr \"Une Clé en Bronze reforgée.\"\n\n#. Key:\tKeyBronze_name\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyBronze.KeyBronze.Name\n#: /Game/SO/Items/Keys/KeyBronze.KeyBronze.Name\nmsgctxt \"ItemData\"\nmsgid \"Bronze Key\"\nmsgstr \"Clé en Bronze\"\n\n#. Key:\tKeyCatacombs0_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyCatacombs0.KeyCatacombs0.Description\n#: /Game/SO/Items/Keys/KeyCatacombs0.KeyCatacombs0.Description\nmsgctxt \"ItemData\"\nmsgid \"There are a ridiculous amount of keys in this world, right?\"\nmsgstr \"Il y a une quantité ridicule de clés dans ce monde, n'est-ce pas ?\"\n\n#. Key:\tKeyCatacombs0_name\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyCatacombs0.KeyCatacombs0.Name\n#: /Game/SO/Items/Keys/KeyCatacombs0.KeyCatacombs0.Name\nmsgctxt \"ItemData\"\nmsgid \"Key Of The Room Below\"\nmsgstr \"Clé de la Salle En Dessous\"\n\n#. Key:\tKeyCopper_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyCopper.KeyCopper.Description\n#: /Game/SO/Items/Keys/KeyCopper.KeyCopper.Description\nmsgctxt \"ItemData\"\nmsgid \"A reforged Copper Key.\"\nmsgstr \"Une Clé en Cuivre reforgée.\"\n\n#. Key:\tKeyCopper_name\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyCopper.KeyCopper.Name\n#: /Game/SO/Items/Keys/KeyCopper.KeyCopper.Name\nmsgctxt \"ItemData\"\nmsgid \"Copper Key\"\nmsgstr \"Clé en Cuivre\"\n\n#. Key:\tKeyDCMainOut_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyDCMainOut.KeyDCMainOut.Description\n#: /Game/SO/Items/Keys/KeyDCMainOut.KeyDCMainOut.Description\nmsgctxt \"ItemData\"\nmsgid \"Just an old, rusty iron key without a proper item description\"\nmsgstr \"Juste une vieille clé en fer rouillée sans description correcte de l'objet\"\n\n#. Key:\tKeyDCMainOut_name\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyDCMainOut.KeyDCMainOut.Name\n#: /Game/SO/Items/Keys/KeyDCMainOut.KeyDCMainOut.Name\nmsgctxt \"ItemData\"\nmsgid \"Catacomb Key\"\nmsgstr \"Clé des Catacombes\"\n\n#. Key:\tKeyIron_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyIron.KeyIron.Description\n#: /Game/SO/Items/Keys/KeyIron.KeyIron.Description\nmsgctxt \"ItemData\"\nmsgid \"A reforged Iron Key.\"\nmsgstr \"Une Clé de Fer reforgée.\"\n\n#. Key:\tKeyIron_name\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyIron.KeyIron.Name\n#: /Game/SO/Items/Keys/KeyIron.KeyIron.Name\nmsgctxt \"ItemData\"\nmsgid \"Iron Key\"\nmsgstr \"Clé en Fer\"\n\n#. Key:\tKeyMaster_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyMaster.KeyMaster.Description\n#: /Game/SO/Items/Keys/KeyMaster.KeyMaster.Description\nmsgctxt \"ItemData\"\nmsgid \"This key can be used to open any door equipped with a special kind of lock, but breaks during the process.\"\nmsgstr \"Cette clé peut être utilisée pour ouvrir n'importe quelle porte équipée d'un type de serrure spécial, mais se brise pendant le processus.\"\n\n#. Key:\tKeyMaster_name\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyMaster.KeyMaster.Name\n#: /Game/SO/Items/Keys/KeyMaster.KeyMaster.Name\nmsgctxt \"ItemData\"\nmsgid \"Master Key\"\nmsgstr \"Clé Principale\"\n\n#. Key:\tKeyMerchant_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyMerchant.KeyMerchant.Description\n#: /Game/SO/Items/Keys/KeyMerchant.KeyMerchant.Description\nmsgctxt \"ItemData\"\nmsgid \"Does it really work? You will find out soon...\"\nmsgstr \"Cela fonctionne-t-il vraiment ? Vous le découvrirez bientôt...\"\n\n#. Key:\tKeyMerchant_name\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyMerchant.KeyMerchant.Name\n#: /Game/SO/Items/Keys/KeyMerchant.KeyMerchant.Name\nmsgctxt \"ItemData\"\nmsgid \"A very small key\"\nmsgstr \"Une toute petite clé\"\n\n#. Key:\tKeyOutpostWall_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyOutpostWall.KeyOutpostWall.Description\n#: /Game/SO/Items/Keys/KeyOutpostWall.KeyOutpostWall.Description\nmsgctxt \"ItemData\"\nmsgid \"Do you really read the key descriptions?\"\nmsgstr \"Vous lisez vraiment les descriptions des clés ?\"\n\n#. Key:\tKeyOutpostWall_name\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyOutpostWall.KeyOutpostWall.Name\n#: /Game/SO/Items/Keys/KeyOutpostWall.KeyOutpostWall.Name\nmsgctxt \"ItemData\"\nmsgid \"Key Of The Outpost Wall\"\nmsgstr \"Clé du Mur de l'Avant-Poste\"\n\n#. Key:\tKeyOutpostWallOptional_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyOutpostWallOptional.KeyOutpostWallOptional.Description\n#: /Game/SO/Items/Keys/KeyOutpostWallOptional.KeyOutpostWallOptional.Description\nmsgctxt \"ItemData\"\nmsgid \"I would rather sleep, but the item descriptions won't write themselves.\"\nmsgstr \"Je préfèrerais dormir, mais les descriptions des articles ne s'écriveront pas toutes seules.\"\n\n#. Key:\tKeyOutpostWallOptional_name\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyOutpostWallOptional.KeyOutpostWallOptional.Name\n#: /Game/SO/Items/Keys/KeyOutpostWallOptional.KeyOutpostWallOptional.Name\nmsgctxt \"ItemData\"\nmsgid \"Second Key Of The Outpost Wall\"\nmsgstr \"Deuxième clé du Mur de l'Avant-Poste\"\n\n#. Key:\tKeyPiecesBronze0_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyPiecesBronze0.KeyPiecesBronze0.Description\n#: /Game/SO/Items/Keys/KeyPiecesBronze0.KeyPiecesBronze0.Description\nmsgctxt \"ItemData\"\nmsgid \"Half of a broken Bronze Key\"\nmsgstr \"La moitié d'une Clé en Bronze brisée\"\n\n#. Key:\tKeyPiecesBronze0_name\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyPiecesBronze0.KeyPiecesBronze0.Name\n#: /Game/SO/Items/Keys/KeyPiecesBronze0.KeyPiecesBronze0.Name\nmsgctxt \"ItemData\"\nmsgid \"Half Bronze Key\"\nmsgstr \"Moitié de Clé en Bronze\"\n\n#. Key:\tKeyPiecesCopper0_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyPiecesCopper0.KeyPiecesCopper0.Description\n#: /Game/SO/Items/Keys/KeyPiecesCopper0.KeyPiecesCopper0.Description\nmsgctxt \"ItemData\"\nmsgid \"Half of a broken Copper Key\"\nmsgstr \"La moitié d'une Clé en Cuivre brisée\"\n\n#. Key:\tKeyPiecesCopper0_name\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyPiecesCopper0.KeyPiecesCopper0.Name\n#: /Game/SO/Items/Keys/KeyPiecesCopper0.KeyPiecesCopper0.Name\nmsgctxt \"ItemData\"\nmsgid \"Half Copper Key\"\nmsgstr \"Moitié de Clé en Cuivre\"\n\n#. Key:\tKeyPiecesIron0_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyPiecesIron0.KeyPiecesIron0.Description\n#: /Game/SO/Items/Keys/KeyPiecesIron0.KeyPiecesIron0.Description\nmsgctxt \"ItemData\"\nmsgid \"Half of a broken Iron Key\"\nmsgstr \"La moitié d'une Clé en Fer brisée\"\n\n#. Key:\tKeyPiecesIron0_name\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyPiecesIron0.KeyPiecesIron0.Name\n#: /Game/SO/Items/Keys/KeyPiecesIron0.KeyPiecesIron0.Name\nmsgctxt \"ItemData\"\nmsgid \"Half Iron Key\"\nmsgstr \"Moitié de Clé en Fer\"\n\n#. Key:\tKeySA_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/KeySA.KeySA.Description\n#: /Game/SO/Items/Keys/KeySA.KeySA.Description\nmsgctxt \"ItemData\"\nmsgid \"Looks like there are tons of these\"\nmsgstr \"Il semble en avoir plein de ce genre\"\n\n#. Key:\tKeySA_name\n#. SourceLocation:\t/Game/SO/Items/Keys/KeySA.KeySA.Name\n#: /Game/SO/Items/Keys/KeySA.KeySA.Name\nmsgctxt \"ItemData\"\nmsgid \"Another Key\"\nmsgstr \"Une Autre Clé\"\n\n#. Key:\tKeySASewerCreatureCell_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/KeySASewerCreatureCell.KeySASewerCreatureCell.Description\n#: /Game/SO/Items/Keys/KeySASewerCreatureCell.KeySASewerCreatureCell.Description\nmsgctxt \"ItemData\"\nmsgid \"A small key you got from the Pipe Walkers.\"\nmsgstr \"Une petite clé que vous avez obtenue des Tuyauteurs.\"\n\n#. Key:\tKeyTLElevatorRoom_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyTLElevatorRoom.KeyTLElevatorRoom.Description\n#: /Game/SO/Items/Keys/KeyTLElevatorRoom.KeyTLElevatorRoom.Description\nmsgctxt \"ItemData\"\nmsgid \"A key without any sign of interest.\"\nmsgstr \"Une clé sans aucun signe d'intérêt.\"\n\n#. Key:\tKeyTLElevatorRoom_name\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyTLElevatorRoom.KeyTLElevatorRoom.Name\n#: /Game/SO/Items/Keys/KeyTLElevatorRoom.KeyTLElevatorRoom.Name\nmsgctxt \"ItemData\"\nmsgid \"Unconcerned Key\"\nmsgstr \"Clé Insouciante\"\n\n#. Key:\tKeyWWFirstGate_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyWWFirstGate.KeyWWFirstGate.Description\n#: /Game/SO/Items/Keys/KeyWWFirstGate.KeyWWFirstGate.Description\nmsgctxt \"ItemData\"\nmsgid \"It will open a gate somewhere. Probably.\"\nmsgstr \"Elle ouvrira une porte quelque part. Probablement.\"\n\n#. Key:\tKeyWWFirstGate_name\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyWWFirstGate.KeyWWFirstGate.Name\n#: /Game/SO/Items/Keys/KeyWWFirstGate.KeyWWFirstGate.Name\nmsgctxt \"ItemData\"\nmsgid \"Railway Gate Key\"\nmsgstr \"Clé de la Porte du Chemin de Fer\"\n\n#. Key:\tKeyWWPortal_desc\n#. SourceLocation:\t/Game/SO/Items/WhiteWallItems/KeyWWPortal.KeyWWPortal.Description\n#: /Game/SO/Items/WhiteWallItems/KeyWWPortal.KeyWWPortal.Description\nmsgctxt \"ItemData\"\nmsgid \"A fancy iron key with a shiny gem in its grip. It must be really precious.\"\nmsgstr \"Une clé en fer sophistiquée avec une gemme brillante dans sa poignée. Elle doit être vraiment précieuse.\"\n\n#. Key:\tKeyWWPortal_name\n#. SourceLocation:\t/Game/SO/Items/WhiteWallItems/KeyWWPortal.KeyWWPortal.Name\n#: /Game/SO/Items/WhiteWallItems/KeyWWPortal.KeyWWPortal.Name\nmsgctxt \"ItemData\"\nmsgid \"Portal Key\"\nmsgstr \"Clé du Portail\"\n\n#. Key:\tKEYWWSewerCreatureCell_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/KEYWWSewerCreatureCell.KEYWWSewerCreatureCell.Description\n#: /Game/SO/Items/Keys/KEYWWSewerCreatureCell.KEYWWSewerCreatureCell.Description\nmsgctxt \"ItemData\"\nmsgid \"A small key you got from a chest in the middle of nowhere.\"\nmsgstr \"Une petite clé que vous avez trouvée dans un coffre au milieu de nulle part.\"\n\n#. Key:\tKEYWWSewerCreatureCell_name\n#. SourceLocation:\t/Game/SO/Items/Keys/KEYWWSewerCreatureCell.KEYWWSewerCreatureCell.Name\n#. Key:\tKeySASewerCreatureCell_name\n#. SourceLocation:\t/Game/SO/Items/Keys/KeySASewerCreatureCell.KeySASewerCreatureCell.Name\n#: /Game/SO/Items/Keys/KeySASewerCreatureCell.KeySASewerCreatureCell.Name\n#: /Game/SO/Items/Keys/KEYWWSewerCreatureCell.KEYWWSewerCreatureCell.Name\nmsgctxt \"ItemData\"\nmsgid \"Small Cell Key\"\nmsgstr \"Petite Clé de Cellule\"\n\n#. Key:\tKeyWWWhiteWall_desc\n#. SourceLocation:\t/Game/SO/Items/WhiteWallItems/KeyWWWhiteWall.KeyWWWhiteWall.Description\n#: /Game/SO/Items/WhiteWallItems/KeyWWWhiteWall.KeyWWWhiteWall.Description\nmsgctxt \"ItemData\"\nmsgid \"A robust iron key with a carved script: <Bold>'Outer Wall Tower'</>.\"\nmsgstr \"Une clé en fer robuste avec une écriture sculptée : <Bold> \\\"Tour du Mur extérieure\\\"</>.\"\n\n#. Key:\tKeyWWWhiteWall_name\n#. SourceLocation:\t/Game/SO/Items/WhiteWallItems/KeyWWWhiteWall.KeyWWWhiteWall.Name\n#: /Game/SO/Items/WhiteWallItems/KeyWWWhiteWall.KeyWWWhiteWall.Name\nmsgctxt \"ItemData\"\nmsgid \"White Wall Key\"\nmsgstr \"Clé du Mur Blanc\"\n\n#. Key:\tKoboldCoin_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/KoboldCoin.KoboldCoin.Description\n#: /Game/SO/Items/QuestItems/KoboldCoin.KoboldCoin.Description\nmsgctxt \"ItemData\"\nmsgid \"Some Coins you found in a chest.\"\nmsgstr \"Des Pièces que vous avez trouvées dans un coffre.\"\n\n#. Key:\tKoboldCoin_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/KoboldCoin.KoboldCoin.Name\n#: /Game/SO/Items/QuestItems/KoboldCoin.KoboldCoin.Name\nmsgctxt \"ItemData\"\nmsgid \"Kobold Coins\"\nmsgstr \"Pièces de Kobold\"\n\n#. Key:\tKoboldPotion_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/KoboldPotion.KoboldPotion.Description\n#: /Game/SO/Items/QuestItems/KoboldPotion.KoboldPotion.Description\nmsgctxt \"ItemData\"\nmsgid \"Weird liquid in a bottle. The kobold calls it Soup.\"\nmsgstr \"Un liquide bizarre dans une bouteille. Le kobold l'appelle Soupe.\"\n\n#. Key:\tKoboldPotion_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/KoboldPotion.KoboldPotion.Name\n#: /Game/SO/Items/QuestItems/KoboldPotion.KoboldPotion.Name\nmsgctxt \"ItemData\"\nmsgid \"Kobold Soup\"\nmsgstr \"Soupe Kobold\"\n\n#. Key:\tLavaGolemToken_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/LavaGolemToken.LavaGolemToken.Description\n#: /Game/SO/Items/QuestItems/LavaGolemToken.LavaGolemToken.Description\nmsgctxt \"ItemData\"\nmsgid \"A unique stone you can use to prove that you have eliminated a golem.\"\nmsgstr \"Une pierre unique que vous pouvez utiliser pour prouver que vous avez éliminé un golem.\"\n\n#. Key:\tLavaGolemToken_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/LavaGolemToken.LavaGolemToken.Name\n#: /Game/SO/Items/QuestItems/LavaGolemToken.LavaGolemToken.Name\nmsgctxt \"ItemData\"\nmsgid \"Stone Token\"\nmsgstr \"Jeton de Pierre\"\n\n#. Key:\tLeafMace_desc\n#. SourceLocation:\t/Game/SO/Items/Weapons/LeafMace.LeafMace.Description\n#: /Game/SO/Items/Weapons/LeafMace.LeafMace.Description\nmsgctxt \"ItemData\"\nmsgid \"If someone would fail in cutting his/her/its way out of a hard situation, crushing your way through can still work out pretty well - it is said to be more effective if golems or certain mechanical devices / creatures are involved in the conflict.\"\nmsgstr \"Si quelqu'un ne parvient pas à se sortir d'une situation difficile, l'écrasement peut quand même fonctionner assez bien - on dit qu'il est plus efficace si des golems ou certains dispositifs ou créatures mécaniques sont impliqués dans le conflit.\"\n\n#. Key:\tLeafMace_name\n#. SourceLocation:\t/Game/SO/Items/Weapons/LeafMace.LeafMace.Name\n#: /Game/SO/Items/Weapons/LeafMace.LeafMace.Name\nmsgctxt \"ItemData\"\nmsgid \"Leaf Mace\"\nmsgstr \"Masse de feuilles\"\n\n#. Key:\tLEKeyCage_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/LEKeyCage.LEKeyCage.Description\n#: /Game/SO/Items/Keys/LEKeyCage.LEKeyCage.Description\nmsgctxt \"ItemData\"\nmsgid \"You won't believe it but it is a key for a cage.\"\nmsgstr \"Vous ne le croirez pas, mais c'est une clé pour une cage.\"\n\n#. Key:\tLEKeyCage_name\n#. SourceLocation:\t/Game/SO/Items/Keys/LEKeyCage.LEKeyCage.Name\n#: /Game/SO/Items/Keys/LEKeyCage.LEKeyCage.Name\nmsgctxt \"ItemData\"\nmsgid \"Cage Key\"\nmsgstr \"Clé de Cage\"\n\n#. Key:\tLETempleKey_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/LETempleKey.LETempleKey.Description\n#: /Game/SO/Items/Keys/LETempleKey.LETempleKey.Description\nmsgctxt \"ItemData\"\nmsgid \"This is one of the spare keys of the Ancient Temple. Just in case the original would be dropped into the lava accidentally.\"\nmsgstr \"C'est l'une des clés de réserve du Temple Antique. Juste au cas où l'originale serait accidentellement tombé dans la lave.\"\n\n#. Key:\tLETempleKey_name\n#. SourceLocation:\t/Game/SO/Items/Keys/LETempleKey.LETempleKey.Name\n#: /Game/SO/Items/Keys/LETempleKey.LETempleKey.Name\nmsgctxt \"ItemData\"\nmsgid \"Ancient Temple Key\"\nmsgstr \"Clé de Temple Antique\"\n\n#. Key:\tLoryBooks_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/LoryBooks.LoryBooks.Description\n#: /Game/SO/Items/QuestItems/LoryBooks.LoryBooks.Description\nmsgctxt \"ItemData\"\nmsgid \"Two ancient books with the titles \\\"True value of your family\\\" and \\\"How much does a brother cost?\\\". They look boring so you decide not to open them.\"\nmsgstr \"Deux livres anciens avec les titres \\\"La vraie valeur de votre famille\\\" et \\\"Combien coûte un frère ?\\\". Ils ont l'air ennuyeux, alors vous décidez de ne pas les ouvrir.\"\n\n#. Key:\tLoryBooks_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/LoryBooks.LoryBooks.Name\n#: /Game/SO/Items/QuestItems/LoryBooks.LoryBooks.Name\nmsgctxt \"ItemData\"\nmsgid \"Old books\"\nmsgstr \"Vieux livres\"\n\n#. Key:\tMemoryCrystal1_desc\n#. SourceLocation:\t/Game/SO/Items/MemoryStone/MemoryCrystal1.MemoryCrystal1.Description\n#: /Game/SO/Items/MemoryStone/MemoryCrystal1.MemoryCrystal1.Description\nmsgctxt \"ItemData\"\nmsgid \"'According to the very few survivors, White Tower, our capital was completely destroyed by a magical phenomena called Ruin. At that time I was at Grey Gate so I can't tell anything for sure.'\\r\\n\\r\\nThe Last Sane Golem Maker, A.C. 16. September 4.\"\nmsgstr \"'Selon les rares survivants, la Tour Blanche, notre capitale, a été complètement détruite par un phénomène magique appelé Ruine. A cette époque, j'étais à la Porte Grise, donc je ne suis sûr de rien.'\\n\\nLe Dernier Créateur de Golem Sensé, 4 Septembre A.C. 16.\"\n\n#. Key:\tMemoryCrystal1_name\n#. SourceLocation:\t/Game/SO/Items/MemoryStone/MemoryCrystal1.MemoryCrystal1.Name\n#: /Game/SO/Items/MemoryStone/MemoryCrystal1.MemoryCrystal1.Name\nmsgctxt \"ItemData\"\nmsgid \"Magical Phenomena\"\nmsgstr \"Phénomènes Magiques\"\n\n#. Key:\tMemoryCrystal2_desc\n#. SourceLocation:\t/Game/SO/Items/MemoryStone/MemoryCrystal2.MemoryCrystal2.Description\n#: /Game/SO/Items/MemoryStone/MemoryCrystal2.MemoryCrystal2.Description\nmsgctxt \"ItemData\"\nmsgid \"'Those who escaped Ruin have... changed.'\\r\\n'I've met a scientist who noticed how madness takes control over him. Perhaps he can find a solution.'\\r\\n\\r\\nThe Last Sane Golem Maker, A.C. 17. January 1.\"\nmsgstr \"'Ceux qui ont échappé à la Ruine ont... changé.'\\n'J'ai rencontré un scientifique qui a remarqué comment la folie prenait le dessus sur lui. Peut-être qu'il peut trouver une solution.'\\n\\nLe Dernier Créateur de Golem Sensé, 1er Janvier A.C. 17.\"\n\n#. Key:\tMemoryCrystal2_name\n#. SourceLocation:\t/Game/SO/Items/MemoryStone/MemoryCrystal2.MemoryCrystal2.Name\n#: /Game/SO/Items/MemoryStone/MemoryCrystal2.MemoryCrystal2.Name\nmsgctxt \"ItemData\"\nmsgid \"Degeneration and mutation\"\nmsgstr \"Dégénérescence et mutation\"\n\n#. Key:\tMemoryCrystal3_desc\n#. SourceLocation:\t/Game/SO/Items/MemoryStone/MemoryCrystal3.MemoryCrystal3.Description\n#: /Game/SO/Items/MemoryStone/MemoryCrystal3.MemoryCrystal3.Description\nmsgctxt \"ItemData\"\nmsgid \"'It's hard to tell but I think colours are fading away. The World was brighter before.'\\r\\n'The Monk won't help me. He stubbornly believes we are doomed.'\\r\\n\\r\\nThe Last Sane Golem Maker, A.C. 17. March 11.\"\nmsgstr \"'C'est difficile à dire, mais je pense que les couleurs s'estompent. Le monde était plus lumineux avant.'\\n'Le Moine ne veut pas m'aider. Il s'obstine à penser que nous sommes condamnés.'\\n\\nLe Dernier Créateur de Golem Sensé, 11 Mars A.C. 17.\"\n\n#. Key:\tMemoryCrystal3_name\n#. SourceLocation:\t/Game/SO/Items/MemoryStone/MemoryCrystal3.MemoryCrystal3.Name\n#: /Game/SO/Items/MemoryStone/MemoryCrystal3.MemoryCrystal3.Name\nmsgctxt \"ItemData\"\nmsgid \"Fading Colours\"\nmsgstr \"Couleurs Estompées\"\n\n#. Key:\tMemoryCrystal4_desc\n#. SourceLocation:\t/Game/SO/Items/MemoryStone/MemoryCrystal4.MemoryCrystal4.Description\n#: /Game/SO/Items/MemoryStone/MemoryCrystal4.MemoryCrystal4.Description\nmsgctxt \"ItemData\"\nmsgid \"'Madness takes control over those who get too close to Ruin.'\\r\\n'Maintainers forgot to speak. I understand some of the phrases they try to say: \\\"Dinner is served\\\", \\\"At your service\\\", \\\"Your order\\\" - a mockery of their former intelligence!'\\r\\n\\r\\nThe Last Sane Golem Maker, A.C. 21. January 26.\"\nmsgstr \"'La folie prend le contrôle de ceux qui s'approchent trop près de la ruine.'\\n'Les responsables ont cessé de parler. Je comprends certaines des phrases qu'ils essaient de dire : \\\"Le dîner est servi\\\", \\\"A votre service\\\", \\\"Votre commande\\\" - un affront à leur ancienne intelligence !'\\n\\nLe Dernier Créateur de Golem Sensé, 26 Janvier A.C. 21.\"\n\n#. Key:\tMemoryCrystal4_name\n#. SourceLocation:\t/Game/SO/Items/MemoryStone/MemoryCrystal4.MemoryCrystal4.Name\n#: /Game/SO/Items/MemoryStone/MemoryCrystal4.MemoryCrystal4.Name\nmsgctxt \"ItemData\"\nmsgid \"Madness\"\nmsgstr \"Folie\"\n\n#. Key:\tMemoryCrystal5_desc\n#. SourceLocation:\t/Game/SO/Items/MemoryStone/MemoryCrystal5.MemoryCrystal5.Description\n#: /Game/SO/Items/MemoryStone/MemoryCrystal5.MemoryCrystal5.Description\nmsgctxt \"ItemData\"\nmsgid \"'Now I have seen it with my own eyes: the touch of the Ruin makes the World literally fall apart.'\\r\\n\\r\\nThe Last Sane Golem Maker, A.C. 25. September 4.\"\nmsgstr \"'Maintenant, je l'ai vu de mes propres yeux : le toucher de la Ruine fait littéralement s'effondrer le monde.'\\n\\nLe Dernier Créateur de Golem Sensé, 4 Septembre A.C. 25.\"\n\n#. Key:\tMemoryCrystal5_name\n#. SourceLocation:\t/Game/SO/Items/MemoryStone/MemoryCrystal5.MemoryCrystal5.Name\n#: /Game/SO/Items/MemoryStone/MemoryCrystal5.MemoryCrystal5.Name\nmsgctxt \"ItemData\"\nmsgid \"Falling Apart\"\nmsgstr \"Effondrement\"\n\n#. Key:\tMemoryCrystal6_desc\n#. SourceLocation:\t/Game/SO/Items/MemoryStone/MemoryCrystal6.MemoryCrystal6.Description\n#: /Game/SO/Items/MemoryStone/MemoryCrystal6.MemoryCrystal6.Description\nmsgctxt \"ItemData\"\nmsgid \"'This is my 87 birthday. It's obvious that my body doesn't get older with time. How long can I preserve my sanity?'\\r\\n'Drones can no longer be trusted. They resisted Ruin for the longest.'\\r\\n\\r\\nThe Last Sane Golem Maker, A.C. 52. July 9.\"\nmsgstr \"'C'est mon 87e anniversaire. Il est évident que mon corps ne vieillit pas avec le temps. Combien de temps puis-je préserver ma santé mentale ?'\\n'On ne peut plus faire appel aux drones. Ils ont résisté à la Ruine pendant longtemps.'\\n\\nLe Dernier Créateur de Golem Sensé, 9 Juillet A.C. 52.\"\n\n#. Key:\tMemoryCrystal6_name\n#. SourceLocation:\t/Game/SO/Items/MemoryStone/MemoryCrystal6.MemoryCrystal6.Name\n#: /Game/SO/Items/MemoryStone/MemoryCrystal6.MemoryCrystal6.Name\nmsgctxt \"ItemData\"\nmsgid \"Preservation of Ruin\"\nmsgstr \"Préservation de la Ruine\"\n\n#. Key:\tMemoryCrystal7_desc\n#. SourceLocation:\t/Game/SO/Items/MemoryStone/MemoryCrystal7.MemoryCrystal7.Description\n#: /Game/SO/Items/MemoryStone/MemoryCrystal7.MemoryCrystal7.Description\nmsgctxt \"ItemData\"\nmsgid \"'Ruin will soon reach Grey Gate, our very last city. I need to move deeper into the Realm, further away from Ruin.'\\r\\n'I decided to create some new golems. Golems that resist Ruin.'\\r\\n\\r\\nThe Last Sane Golem Maker, A.C. 315. April 8.\"\nmsgstr \"'La Ruine atteindra bientôt la Porte Grise, notre toute dernière ville. Je dois m'enfoncer plus profondément dans le royaume, loin de la Ruine.'\\n'J'ai décidé de créer de nouveaux golems. Des golems qui résistent à la Ruine.'\\n\\nLe Dernier Créateur de Golem Sensé, 8 Avril A.C. 315.\"\n\n#. Key:\tMemoryCrystal7_name\n#. SourceLocation:\t/Game/SO/Items/MemoryStone/MemoryCrystal7.MemoryCrystal7.Name\n#: /Game/SO/Items/MemoryStone/MemoryCrystal7.MemoryCrystal7.Name\nmsgctxt \"ItemData\"\nmsgid \"New Hope\"\nmsgstr \"Nouvel Espoir\"\n\n#. Key:\tMemoryCrystal8_desc\n#. SourceLocation:\t/Game/SO/Items/MemoryStone/MemoryCrystal8.MemoryCrystal8.Description\n#: /Game/SO/Items/MemoryStone/MemoryCrystal8.MemoryCrystal8.Description\nmsgctxt \"ItemData\"\nmsgid \"'I don't think I can keep up. There are times when I no longer know what I'm doing. I still have clear moments but they become more and more rare. I've recorded my memories to keep them safe.'\\r\\n\\r\\nThe Last Sane Golem Maker, about A.C. 500.\\r\\n\"\nmsgstr \"'Je ne pense pas pouvoir suivre. Il y a des moments où je ne sais plus ce que je fais. J'ai encore des moments de lucidité, mais ils se font de plus en plus rares. J'ai consigné mes souvenirs pour les garder en sécurité.'\\n\\nLe Dernier Créateur de Golem Sensé, vers A.C. 500.\\n\"\n\n#. Key:\tMemoryCrystal8_name\n#. SourceLocation:\t/Game/SO/Items/MemoryStone/MemoryCrystal8.MemoryCrystal8.Name\n#: /Game/SO/Items/MemoryStone/MemoryCrystal8.MemoryCrystal8.Name\nmsgctxt \"ItemData\"\nmsgid \"Final Decision\"\nmsgstr \"Décision Finale\"\n\n#. Key:\tPergamen_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/Pergamen.Pergamen.Description\n#: /Game/SO/Items/QuestItems/Pergamen.Pergamen.Description\nmsgctxt \"ItemData\"\nmsgid \"'This chest and everything inside belongs to me, the Chef.'\"\nmsgstr \"'Ce coffre et tout ce qu'il contient m'appartient, à moi, le chef.'\"\n\n#. Key:\tPergamen_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/Pergamen.Pergamen.Name\n#: /Game/SO/Items/QuestItems/Pergamen.Pergamen.Name\nmsgctxt \"ItemData\"\nmsgid \"Parchment\"\nmsgstr \"Parchemin\"\n\n#. Key:\tPortalGem_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/PortalGem.PortalGem.Description\n#: /Game/SO/Items/QuestItems/PortalGem.PortalGem.Description\nmsgctxt \"ItemData\"\nmsgid \"There are so many stones around. You are still not sure what's the point of picking up some of them.\"\nmsgstr \"Il y a tellement de pierres autour. Vous ne savez toujours pas à quoi bon en ramasser quelques-unes.\"\n\n#. Key:\tPortalGem_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/PortalGem.PortalGem.Name\n#: /Game/SO/Items/QuestItems/PortalGem.PortalGem.Name\nmsgctxt \"ItemData\"\nmsgid \"Lock Gem\"\nmsgstr \"Gemme de Verrouillage\"\n\n#. Key:\tPotionOfWorthiness_desc\n#. SourceLocation:\t/Game/SO/Items/Useable/PotionOfWorthiness.PotionOfWorthiness.Description\n#: /Game/SO/Items/Useable/PotionOfWorthiness.PotionOfWorthiness.Description\nmsgctxt \"ItemData\"\nmsgid \"This might not be the weirdest side effect one can have when drinking something suspicious but it is definitely in the top five.\"\nmsgstr \"Ce n'est peut-être pas l'effet secondaire le plus bizarre que l'on puisse avoir en buvant quelque chose de suspect, mais c'est certainement dans le top cinq.\"\n\n#. Key:\tPotionOfWorthiness_name\n#. SourceLocation:\t/Game/SO/Items/Useable/PotionOfWorthiness.PotionOfWorthiness.Name\n#: /Game/SO/Items/Useable/PotionOfWorthiness.PotionOfWorthiness.Name\nmsgctxt \"ItemData\"\nmsgid \"Potion Of Worthiness\"\nmsgstr \"Potion du Mérite\"\n\n#. Key:\tPurpleMushroom_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/PurpleMushroom.PurpleMushroom.Description\n#: /Game/SO/Items/QuestItems/PurpleMushroom.PurpleMushroom.Description\nmsgctxt \"ItemData\"\nmsgid \"The most purple mushrooms you could find. You hope these will be enough.\"\nmsgstr \"Les champignons les plus violets que l'on puisse trouver. Vous espérez que cela suffira.\"\n\n#. Key:\tPurpleMushroom_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/PurpleMushroom.PurpleMushroom.Name\n#: /Game/SO/Items/QuestItems/PurpleMushroom.PurpleMushroom.Name\nmsgctxt \"ItemData\"\nmsgid \"Purple Mushrooms\"\nmsgstr \"Champignons Violets\"\n\n#. Key:\tRavenFeather_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/RavenFeather.RavenFeather.Description\n#: /Game/SO/Items/QuestItems/RavenFeather.RavenFeather.Description\nmsgctxt \"ItemData\"\nmsgid \"A magical item which gives you the ability to fly... or something like that.\"\nmsgstr \"Un objet magique qui vous donne la possibilité de voler... ou quelque chose comme ça.\"\n\n#. Key:\tRavenFeather_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/RavenFeather.RavenFeather.Name\n#: /Game/SO/Items/QuestItems/RavenFeather.RavenFeather.Name\nmsgctxt \"ItemData\"\nmsgid \"Raven Feather\"\nmsgstr \"Plume de Corbeau\"\n\n#. Key:\tRope_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/Rope.Rope.Description\n#: /Game/SO/Items/QuestItems/Rope.Rope.Description\nmsgctxt \"ItemData\"\nmsgid \"You do wonder when the area is full of ropes why this is the only one which can be taken...\"\nmsgstr \"On se demande, quand la zone est pleine de cordes, pourquoi c'est la seule qui peut être prise...\"\n\n#. Key:\tRope_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/Rope.Rope.Name\n#: /Game/SO/Items/QuestItems/Rope.Rope.Name\nmsgctxt \"ItemData\"\nmsgid \"Rope\"\nmsgstr \"Corde\"\n\n#. Key:\tRuneStoneBonusHPMagical_desc\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneBonusHPMagical.RuneStoneBonusHPMagical.Description\n#: /Game/SO/Items/RuneStones/RuneStoneBonusHPMagical.RuneStoneBonusHPMagical.Description\nmsgctxt \"ItemData\"\nmsgid \"Absorbs <Blue>30</> magical damage.\"\nmsgstr \"Absorbe <Blue>30</> de dommages magiques.\"\n\n#. Key:\tRuneStoneBonusHPMagical_name\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneBonusHPMagical.RuneStoneBonusHPMagical.Name\n#: /Game/SO/Items/RuneStones/RuneStoneBonusHPMagical.RuneStoneBonusHPMagical.Name\nmsgctxt \"ItemData\"\nmsgid \"Bluestone\"\nmsgstr \"Pierre Bleue\"\n\n#. Key:\tRuneStoneBonusHPPhysical_desc\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneBonusHPPhysical.RuneStoneBonusHPPhysical.Description\n#: /Game/SO/Items/RuneStones/RuneStoneBonusHPPhysical.RuneStoneBonusHPPhysical.Description\nmsgctxt \"ItemData\"\nmsgid \"Absorbs <White>30</> physical damage.\"\nmsgstr \"Absorbe <White>30</> de dommages physiques.\"\n\n#. Key:\tRuneStoneBonusHPPhysical_name\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneBonusHPPhysical.RuneStoneBonusHPPhysical.Name\n#: /Game/SO/Items/RuneStones/RuneStoneBonusHPPhysical.RuneStoneBonusHPPhysical.Name\nmsgctxt \"ItemData\"\nmsgid \"Graystone\"\nmsgstr \"Pierre Grise\"\n\n#. Key:\tRuneStoneBounce_desc\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.Description\n#. Key:\tRuneStoneBounce_level_desc_0\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.LevelBasedDescOverride(0).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.Description\n#: /Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.LevelBasedDescOverride(0).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Provides the ability to bounce from enemies for <Green>8</> seconds. Doing so causes <Blue>12</> damage to the target.\"\nmsgstr \"Offre la possibilité de rebondir sur les ennemis pendant <Green>8</> secondes. Ce faisant, cela provoque <Blue>12</>de dégâts à la cible.\"\n\n#. Key:\tRuneStoneBounce_level_desc_1\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.LevelBasedDescOverride(1).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.LevelBasedDescOverride(1).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Provides the ability to bounce from enemies for <Green>16</> seconds. Doing so causes <Blue>18</> damage to the target.\"\nmsgstr \"Offre la possibilité de rebondir sur les ennemis pendant <Green>16</> secondes. Ce faisant, cela provoque <Blue>18</>de dégâts à la cible.\"\n\n#. Key:\tRuneStoneBounce_level_desc_2\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.LevelBasedDescOverride(2).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.LevelBasedDescOverride(2).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Provides the ability to bounce from enemies for <Green>16</> seconds. Doing so causes <Blue>18</> damage and applies <Yellow>Stun</> on the target.\"\nmsgstr \"Offre la possibilité de rebondir sur les ennemis pendant <Green>16</> secondes. Ce faisant, cela provoque <Blue>18</>de dégâts et inflige <Yellow>Étourdissement</> à la cible.\"\n\n#. Key:\tRuneStoneBounce_level_desc_3\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.LevelBasedDescOverride(3).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.LevelBasedDescOverride(3).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Provides the ability to bounce from enemies for <Green>16</> seconds. Doing so causes <Blue>24</> damage and applies <Yellow>Stun</> on the target.\"\nmsgstr \"Offre la possibilité de rebondir sur les ennemis pendant <Green>16</> secondes. Ce faisant, cela provoque <Blue>24</>de dégâts et inflige <Yellow>Étourdissement</> à la cible.\"\n\n#. Key:\tRuneStoneBounce_level_desc_4\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.LevelBasedDescOverride(4).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.LevelBasedDescOverride(4).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Provides the ability to bounce from enemies for <Green>16</> seconds. Doing so causes <Blue>30</> damage and applies <Yellow>Stun</> on the target.\"\nmsgstr \"Offre la possibilité de rebondir sur les ennemis pendant <Green>16</> secondes. Ce faisant, cela provoque <Blue>30</>de dégâts et inflige <Yellow>Étourdissement</> à la cible.\"\n\n#. Key:\tRuneStoneBounce_level_up_desc_0\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.LevelUpBasedDescOverride(0).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.LevelUpBasedDescOverride(0).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Provides the ability to bounce from enemies for <Green>8</><YellowH>(→16)</> seconds. Doing so causes <Blue>12</><YellowH>(→18)</> damage to the target.\"\nmsgstr \"Offre la possibilité de rebondir sur les ennemis pendant <Green>8</><YellowH>(→16)</> secondes. Ce faisant, cela provoque <Blue>12</><YellowH>(→18)</> de dégâts à la cible.\"\n\n#. Key:\tRuneStoneBounce_level_up_desc_1\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.LevelUpBasedDescOverride(1).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.LevelUpBasedDescOverride(1).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Provides the ability to bounce from enemies for <Green>16</> seconds. Doing so causes <Blue>18</> damage <YellowH>and applies Stun on the target.</>\"\nmsgstr \"Offre la possibilité de rebondir sur les ennemis pendant <Green>16</> secondes. Ce faisant, cela provoque <Blue>18</>de dégâts <YellowH>et inflige Étourdissement à la cible.</>\"\n\n#. Key:\tRuneStoneBounce_level_up_desc_2\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.LevelUpBasedDescOverride(2).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.LevelUpBasedDescOverride(2).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Provides the ability to bounce from enemies for <Green>16</> seconds. Doing so causes <Blue>18</><YellowH>(→24)</> damage and applies <Yellow>Stun</> on the target.\"\nmsgstr \"Offre la possibilité de rebondir sur les ennemis pendant <Green>16</> secondes. Ce faisant, cela provoque <Blue>18</><YellowH>(→24)</> de dégâts et inflige <Yellow>Étourdissement</> à la cible.\"\n\n#. Key:\tRuneStoneBounce_level_up_desc_3\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.LevelUpBasedDescOverride(3).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.LevelUpBasedDescOverride(3).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Provides the ability to bounce from enemies for <Green>16</> seconds. Doing so causes <Blue>24</><YellowH>(→30)</> damage and applies <Yellow>Stun</> on the target.\"\nmsgstr \"Offre la possibilité de rebondir sur les ennemis pendant <Green>16</> secondes. Ce faisant, cela provoque <Blue>24</><YellowH>(→30)</> de dégâts et inflige <Yellow>Étourdissement</> à la cible.\"\n\n#. Key:\tRuneStoneBounce_name\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.Name\n#: /Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.Name\nmsgctxt \"ItemData\"\nmsgid \"Bouncestone\"\nmsgstr \"Pierre de Rebond\"\n\n#. Key:\tRuneStoneEnergy_desc\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneEnergy.RuneStoneEnergy.Description\n#: /Game/SO/Items/RuneStones/RuneStoneEnergy.RuneStoneEnergy.Description\nmsgctxt \"ItemData\"\nmsgid \"Strikes and spell cooldowns are decreased by 90% for 10 seconds.\"\nmsgstr \"Les coups et les recharges de sorts sont réduits de 90 % pendant 10 secondes.\"\n\n#. Key:\tRuneStoneEnergy_name\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneEnergy.RuneStoneEnergy.Name\n#: /Game/SO/Items/RuneStones/RuneStoneEnergy.RuneStoneEnergy.Name\nmsgctxt \"ItemData\"\nmsgid \"Energystone\"\nmsgstr \"Pierre d'Énergie\"\n\n#. Key:\tRuneStoneFire0_desc\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneFire0.RuneStoneFire0.Description\n#. Key:\tRuneStoneFire0_level_desc_0\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneFire0.RuneStoneFire0.LevelBasedDescOverride(0).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneFire0.RuneStoneFire0.Description\n#: /Game/SO/Items/RuneStones/RuneStoneFire0.RuneStoneFire0.LevelBasedDescOverride(0).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons a powerful blast roasting anything in a straight line.\\nCauses <Blue>16</> damage.\"\nmsgstr \"Invoque une puissante explosion qui brûle tout en ligne droite.\\nProvoque <Blue>16</> de dégâts.\"\n\n#. Key:\tRuneStoneFire0_level_desc_1\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneFire0.RuneStoneFire0.LevelBasedDescOverride(1).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneFire0.RuneStoneFire0.LevelBasedDescOverride(1).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons a powerful blast roasting anything in a straight line.\\nCauses <Blue>32</> damage.\"\nmsgstr \"Invoque une puissante explosion qui brûle tout en ligne droite.\\nProvoque <Blue>32</> de dégâts.\"\n\n#. Key:\tRuneStoneFire0_level_desc_2\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneFire0.RuneStoneFire0.LevelBasedDescOverride(2).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneFire0.RuneStoneFire0.LevelBasedDescOverride(2).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons a powerful blast roasting anything in a straight line.\\nCauses <Blue>36</> damage. The spell has <Green>50%</> chance to <Purple>Instant Recharge.</>\"\nmsgstr \"Invoque une puissante explosion qui brûle tout en ligne droite.\\nProvoque <Blue>36</> de dégâts. Le sort a <Green>50%</> de chances de se <Purple>Recharger Instantanément.</>\"\n\n#. Key:\tRuneStoneFire0_level_desc_3\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneFire0.RuneStoneFire0.LevelBasedDescOverride(3).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneFire0.RuneStoneFire0.LevelBasedDescOverride(3).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons a powerful blast roasting anything in a straight line.\\nCauses <Blue>52</> damage. The spell has <Green>50%</> chance to <Purple>Instant Recharge.</>\"\nmsgstr \"Invoque une puissante explosion qui brûle tout en ligne droite.\\nProvoque <Blue>52</> de dégâts. Le sort a <Green>50%</> de chances de se <Purple>Recharger Instantanément.</>\"\n\n#. Key:\tRuneStoneFire0_level_up_desc_0\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneFire0.RuneStoneFire0.LevelUpBasedDescOverride(0).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneFire0.RuneStoneFire0.LevelUpBasedDescOverride(0).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons a powerful blast roasting anything in a straight line.\\nCauses <Blue>16</><YellowH>(→32)</> damage.\"\nmsgstr \"Invoque une puissante explosion qui brûle tout en ligne droite.\\nProvoque <Blue>16</><YellowH>(→32)</> de dégâts.\"\n\n#. Key:\tRuneStoneFire0_level_up_desc_1\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneFire0.RuneStoneFire0.LevelUpBasedDescOverride(1).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneFire0.RuneStoneFire0.LevelUpBasedDescOverride(1).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons a powerful blast roasting anything in a straight line.\\nCauses <Blue>32</><YellowH>(→36)</> damage. <YellowH>The spell has </><GreenH>50%</> <YellowH>chance to </><PurpleH>Instant Recharge.</>\"\nmsgstr \"Invoque une puissante explosion qui brûle tout en ligne droite.\\nProvoque <Blue>32</><YellowH>(→36)</> de dégâts. <YellowH>Le sort a </><Green>50%</> <YellowH>de chances de se </><Purple>Recharger Instantanément.</>\"\n\n#. Key:\tRuneStoneFire0_level_up_desc_2\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneFire0.RuneStoneFire0.LevelUpBasedDescOverride(2).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneFire0.RuneStoneFire0.LevelUpBasedDescOverride(2).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons a powerful blast roasting anything in a straight line.\\nCauses <Blue>36</><YellowH>(→52)</> damage. The spell has <Green>50%</> chance to <Purple>Instant Recharge.</>\"\nmsgstr \"Invoque une puissante explosion qui brûle tout en ligne droite.\\nProvoque <Blue>36</><YellowH>(→52)</> de dégâts. Le sort a<Green>50%</> de chances de se <Purple>Recharger Instantanément.</>\"\n\n#. Key:\tRuneStoneFire0_name\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneFire0.RuneStoneFire0.Name\n#: /Game/SO/Items/RuneStones/RuneStoneFire0.RuneStoneFire0.Name\nmsgctxt \"ItemData\"\nmsgid \"Firestone\"\nmsgstr \"Pierre de Feu\"\n\n#. Key:\tRuneStoneHeal_desc\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneHeal.RuneStoneHeal.Description\n#: /Game/SO/Items/RuneStones/RuneStoneHeal.RuneStoneHeal.Description\nmsgctxt \"ItemData\"\nmsgid \"Restores <Green>30</> health points.\"\nmsgstr \"Restaure <Green>30</> points de santé.\"\n\n#. Key:\tRuneStoneHeal_name\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneHeal.RuneStoneHeal.Name\n#: /Game/SO/Items/RuneStones/RuneStoneHeal.RuneStoneHeal.Name\nmsgctxt \"ItemData\"\nmsgid \"Healstone\"\nmsgstr \"Pierre de Soin\"\n\n#. Key:\tRuneStoneLightningWalk_desc\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneLightningWalk.RuneStoneLightningWalk.Description\n#: /Game/SO/Items/RuneStones/RuneStoneLightningWalk.RuneStoneLightningWalk.Description\nmsgctxt \"ItemData\"\nmsgid \"Grants the shocking ability to walk through your enemies for <Green>2</> sec. The shock causes <Blue>10</> damage.\"\nmsgstr \"Donne la capacité choquante de marcher à travers vos ennemis pendant <Green>2</> sec. Le choc provoque <Blue>10</> de dégâts.\"\n\n#. Key:\tRuneStoneLightningWalk_level_desc_0\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneLightningWalk.RuneStoneLightningWalk.LevelBasedDescOverride(0).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneLightningWalk.RuneStoneLightningWalk.LevelBasedDescOverride(0).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Grants the shocking ability to walk through your enemies for <Green>2</> sec. The shock causes <Blue>16</> damage.\"\nmsgstr \"Donne la capacité choquante de marcher à travers vos ennemis pendant <Green>2</> sec. Le choc provoque <Blue>16</> de dégâts.\"\n\n#. Key:\tRuneStoneLightningWalk_level_desc_1\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneLightningWalk.RuneStoneLightningWalk.LevelBasedDescOverride(1).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneLightningWalk.RuneStoneLightningWalk.LevelBasedDescOverride(1).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Grants the shocking ability to walk through your enemies for <Green>3</> sec. The shock causes <Blue>28</> damage.\"\nmsgstr \"Donne la capacité choquante de marcher à travers vos ennemis pendant <Green>3</> sec. Le choc provoque <Blue>28</> de dégâts.\"\n\n#. Key:\tRuneStoneLightningWalk_level_desc_2\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneLightningWalk.RuneStoneLightningWalk.LevelBasedDescOverride(2).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneLightningWalk.RuneStoneLightningWalk.LevelBasedDescOverride(2).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Grants the shocking ability to walk through your enemies for <Green>4</> sec. The shock causes <Blue>32</> damage and has a <Green>30%</> chance to <Yellow>stun</> the target.\"\nmsgstr \"Donne la capacité choquante de marcher à travers vos ennemis pendant <Green>4</> sec. Le choc provoque <Blue>32</> de dégâts et a <Green>30%</> de chance <Yellow>d'étourdir</> la cible.\"\n\n#. Key:\tRuneStoneLightningWalk_level_desc_3\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneLightningWalk.RuneStoneLightningWalk.LevelBasedDescOverride(3).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneLightningWalk.RuneStoneLightningWalk.LevelBasedDescOverride(3).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Grants the shocking ability to walk through your enemies for <Green>4</> sec. The shock causes <Blue>32</> damage and has a <Green>40%</> chance to <Yellow>stun</> the target.\"\nmsgstr \"Donne la capacité choquante de marcher à travers vos ennemis pendant <Green>4</> sec. Le choc provoque <Blue>32</> de dégâts et a <Green>40%</> de chance <Yellow>d'étourdir</> la cible.\"\n\n#. Key:\tRuneStoneLightningWalk_level_up_desc_0\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneLightningWalk.RuneStoneLightningWalk.LevelUpBasedDescOverride(0).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneLightningWalk.RuneStoneLightningWalk.LevelUpBasedDescOverride(0).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Grants the shocking ability to walk through your enemies for <Green>2</><YellowH>(→3)</> sec. The shock causes <Blue>16</> <YellowH>(→28)</>damage.\"\nmsgstr \"Donne la capacité choquante de marcher à travers vos ennemis pendant <Green>2</><YellowH>(→3)</> sec. Le choc provoque <Blue>16</> <YellowH>(→28)</>de dégâts.\"\n\n#. Key:\tRuneStoneLightningWalk_level_up_desc_1\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneLightningWalk.RuneStoneLightningWalk.LevelUpBasedDescOverride(1).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneLightningWalk.RuneStoneLightningWalk.LevelUpBasedDescOverride(1).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Grants the shocking ability to walk through your enemies for <Green>3</><YellowH>(→4)</> sec. The shock causes <Blue>28</> <YellowH>(→36)</>damage <YellowH>and has a </><GreenH>30%</> <YellowH>chance to stun the target.</>\"\nmsgstr \"Donne la capacité choquante de marcher à travers vos ennemis pendant <Green>3</><YellowH>(→4)</> sec. Le choc provoque <Blue>28</> de dégâts <YellowH>et a </><Green>30%</> <YellowH>de chance d'étourdir la cible.</>\"\n\n#. Key:\tRuneStoneLightningWalk_level_up_desc_2\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneLightningWalk.RuneStoneLightningWalk.LevelUpBasedDescOverride(2).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneLightningWalk.RuneStoneLightningWalk.LevelUpBasedDescOverride(2).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Grants the shocking ability to walk through your enemies for <Green>4</> sec. The shock causes <Blue>32</> damage and has a <Green>30%</> <YellowH>(→40%)</> chance to <Yellow>stun</> the target.\"\nmsgstr \"Donne la capacité choquante de marcher à travers vos ennemis pendant <Green>4</> sec. Le choc provoque <Blue>32</> de dégâts et a <Green>30%</> <YellowH>(→40%)</> de chance d'<Yellow>étourdir</> la cible.\"\n\n#. Key:\tRuneStoneLightningWalk_name\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneLightningWalk.RuneStoneLightningWalk.Name\n#: /Game/SO/Items/RuneStones/RuneStoneLightningWalk.RuneStoneLightningWalk.Name\nmsgctxt \"ItemData\"\nmsgid \"Lightningstone\"\nmsgstr \"Pierre Foudre\"\n\n#. Key:\tRuneStoneMagicMissle_desc\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMagicMissle.RuneStoneMagicMissle.Description\n#: /Game/SO/Items/RuneStones/RuneStoneMagicMissle.RuneStoneMagicMissle.Description\nmsgctxt \"ItemData\"\nmsgid \"Summons a homing projectile targeted at a close foe - prefers flying targets.\"\nmsgstr \"Invoque un projectile guidé ciblant un ennemi proche - préfère les cibles volantes.\"\n\n#. Key:\tRuneStoneMagicMissle_level_desc_0\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMagicMissle.RuneStoneMagicMissle.LevelBasedDescOverride(0).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneMagicMissle.RuneStoneMagicMissle.LevelBasedDescOverride(0).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons <Green>1</> homing projectile targeted at a close foe - prefers flying targets. Causes <Blue>16</> damage on impact.\"\nmsgstr \"Invoque <Green>1</> projectiles guidés ciblant un ennemi proche - préfère les cibles volantes. Chaque projectile provoque <Blue>16</> de dommages à l'impact.\"\n\n#. Key:\tRuneStoneMagicMissle_level_desc_1\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMagicMissle.RuneStoneMagicMissle.LevelBasedDescOverride(1).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneMagicMissle.RuneStoneMagicMissle.LevelBasedDescOverride(1).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons <Green>2</> homing projectile targeted at a close foe - prefers flying targets. Each projectile causes <Blue>16</> damage on impact.\"\nmsgstr \"Invoque <Green>2</> projectiles guidés ciblant un ennemi proche - préfère les cibles volantes. Chaque projectile provoque <Blue>16</> de dommages à l'impact.\"\n\n#. Key:\tRuneStoneMagicMissle_level_desc_2\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMagicMissle.RuneStoneMagicMissle.LevelBasedDescOverride(2).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneMagicMissle.RuneStoneMagicMissle.LevelBasedDescOverride(2).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons <Green>3</> homing projectile targeted at a close foe - prefers flying targets. Each projectile causes <Blue>16</> damage and applies <Orange>Slow</> on impact.\"\nmsgstr \"Invoque <Green>3</> projectiles guidés ciblant un ennemi proche - préfère les cibles volantes. Chaque projectile provoque <Blue>16</> de dommages et inflige <Orange>Lenteur</> à l'impact.\"\n\n#. Key:\tRuneStoneMagicMissle_level_desc_3\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMagicMissle.RuneStoneMagicMissle.LevelBasedDescOverride(3).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneMagicMissle.RuneStoneMagicMissle.LevelBasedDescOverride(3).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons <Green>4</> homing projectile targeted at a close foe - prefers flying targets. Each projectile causes <Blue>16</> damage and applies <Orange>Slow</> on impact.\"\nmsgstr \"Invoque <Green>4</> projectiles guidés ciblant un ennemi proche - préfère les cibles volantes. Chaque projectile provoque <Blue>16</> de dommages et inflige <Orange>Lenteur</> à l'impact.\"\n\n#. Key:\tRuneStoneMagicMissle_level_up_desc_0\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMagicMissle.RuneStoneMagicMissle.LevelUpBasedDescOverride(0).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneMagicMissle.RuneStoneMagicMissle.LevelUpBasedDescOverride(0).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons <Green>1</><YellowH>(→2)</> homing projectile targeted at a close foe - prefers flying targets. Each projectile causes <Blue>16</> damage on impact.\"\nmsgstr \"Invoque <Green>1</><YellowH>(→2)</> projectiles guidés ciblant un ennemi proche - préfère les cibles volantes. Chaque projectile provoque <Blue>16</> de dommages à l'impact.\"\n\n#. Key:\tRuneStoneMagicMissle_level_up_desc_1\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMagicMissle.RuneStoneMagicMissle.LevelUpBasedDescOverride(1).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneMagicMissle.RuneStoneMagicMissle.LevelUpBasedDescOverride(1).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons <Green>2</><YellowH>(→3)</> homing projectile targeted at a close foe - prefers flying targets. Each projectile causes <Blue>16</> damage <YellowH>and applies</> <OrangeH>Slow</> on impact.\"\nmsgstr \"Invoque <Green>2</><YellowH>(3)</> projectiles guidés ciblant un ennemi proche - préfère les cibles volantes. Chaque projectile provoque <Blue>16</> de dommages <YellowH>et inflige</> <Orange>Lenteur</> à l'impact.\"\n\n#. Key:\tRuneStoneMagicMissle_level_up_desc_2\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMagicMissle.RuneStoneMagicMissle.LevelUpBasedDescOverride(2).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneMagicMissle.RuneStoneMagicMissle.LevelUpBasedDescOverride(2).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons <Green>3</><YellowH>(→4)</> homing projectile targeted at a close foe - prefers flying targets. Each projectile causes <Blue>16</> damage and applies <Orange>Slow</> on impact.\"\nmsgstr \"Invoque <Green>3</><YellowH>(→4)</> projectiles guidés ciblant un ennemi proche - préfère les cibles volantes. Chaque projectile provoque <Blue>16</> de dommages et inflige <Orange>Lenteur</> à l'impact.\"\n\n#. Key:\tRuneStoneMagicMissle_name\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMagicMissle.RuneStoneMagicMissle.Name\n#: /Game/SO/Items/RuneStones/RuneStoneMagicMissle.RuneStoneMagicMissle.Name\nmsgctxt \"ItemData\"\nmsgid \"Tealstone\"\nmsgstr \"Pierre Sarcelle\"\n\n#. Key:\tRuneStoneMassMagicMissle_desc\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMassMagicMissle.RuneStoneMassMagicMissle.Description\n#. Key:\tRuneStoneMassMagicMissle_level_desc_0\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMassMagicMissle.RuneStoneMassMagicMissle.LevelBasedDescOverride(0).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneMassMagicMissle.RuneStoneMassMagicMissle.Description\n#: /Game/SO/Items/RuneStones/RuneStoneMassMagicMissle.RuneStoneMassMagicMissle.LevelBasedDescOverride(0).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons a homing projectile for each nearby enemy, causing <Blue>20</> damage on impact.\"\nmsgstr \"Invoque un projectile guidé vers chaque ennemi proche, causant <Blue>20</> de dommages à l'impact.\"\n\n#. Key:\tRuneStoneMassMagicMissle_level_desc_1\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMassMagicMissle.RuneStoneMassMagicMissle.LevelBasedDescOverride(1).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneMassMagicMissle.RuneStoneMassMagicMissle.LevelBasedDescOverride(1).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons a homing projectile for each nearby enemy, causing <Blue>40</> damage on impact.\"\nmsgstr \"Invoque un projectile guidé vers chaque ennemi proche, causant <Blue>40</> de dommages à l'impact.\"\n\n#. Key:\tRuneStoneMassMagicMissle_level_desc_2\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMassMagicMissle.RuneStoneMassMagicMissle.LevelBasedDescOverride(2).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneMassMagicMissle.RuneStoneMassMagicMissle.LevelBasedDescOverride(2).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons a homing projectile for each nearby enemy, causing <Blue>50</> damage on impact. The target has a <Green>30%</> chance to become <Orange>Slow</>.\"\nmsgstr \"Invoque un projectile guidé vers chaque ennemi proche, causant <Blue>50</> de dommages à l'impact. La cible a <GreenH>30%</> de chance de devenir</> <Orange>Lente</>.\"\n\n#. Key:\tRuneStoneMassMagicMissle_level_up_desc_0\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMassMagicMissle.RuneStoneMassMagicMissle.LevelUpBasedDescOverride(0).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneMassMagicMissle.RuneStoneMassMagicMissle.LevelUpBasedDescOverride(0).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons a homing projectile for each nearby enemy, causing <Blue>20</><YellowH>(→40)</> damage on impact.\"\nmsgstr \"Invoque un projectile guidé vers chaque ennemi proche, causant <Blue>20</><YellowH>(→40)</> de dommages à l'impact.\"\n\n#. Key:\tRuneStoneMassMagicMissle_level_up_desc_1\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMassMagicMissle.RuneStoneMassMagicMissle.LevelUpBasedDescOverride(1).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneMassMagicMissle.RuneStoneMassMagicMissle.LevelUpBasedDescOverride(1).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons a homing projectile for each nearby enemy, causing <Blue>20</><YellowH>(→50)</> damage on impact. <YellowH>The target has a</> <GreenH>30%</> <YellowH>chance to become</> <Orange>Slow</>.\"\nmsgstr \"Invoque un projectile guidé vers chaque ennemi proche, causant <Blue>20</><YellowH>(→50)</> de dommages à l'impact. <YellowH>La cible a </> <GreenH>30%</> <YellowH>de chance de devenir</> <Orange>Lente</>.\"\n\n#. Key:\tRuneStoneMassMagicMissle_name\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMassMagicMissle.RuneStoneMassMagicMissle.Name\n#: /Game/SO/Items/RuneStones/RuneStoneMassMagicMissle.RuneStoneMassMagicMissle.Name\nmsgctxt \"ItemData\"\nmsgid \"Tealstone, but better\"\nmsgstr \"Pierre Sarcelle, mais en mieux\"\n\n#. Key:\tRuneStoneMassSlow_desc\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMassSlow.RuneStoneMassSlow.Description\n#: /Game/SO/Items/RuneStones/RuneStoneMassSlow.RuneStoneMassSlow.Description\nmsgctxt \"ItemData\"\nmsgid \"Slows all enemy targets around the caster.\"\nmsgstr \"Ralentit toutes les cibles ennemies autour du lanceur.\"\n\n#. Key:\tRuneStoneMassSlow_level_desc_0\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMassSlow.RuneStoneMassSlow.LevelBasedDescOverride(0).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneMassSlow.RuneStoneMassSlow.LevelBasedDescOverride(0).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"All enemy target becomes <Orange>Slow</> for <Green>3</> seconds.\"\nmsgstr \"Toutes les cibles ennemies deviennent <Orange>Lentes</> pendant <Green>3</> secondes.\"\n\n#. Key:\tRuneStoneMassSlow_name\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMassSlow.RuneStoneMassSlow.Name\n#: /Game/SO/Items/RuneStones/RuneStoneMassSlow.RuneStoneMassSlow.Name\nmsgctxt \"ItemData\"\nmsgid \"Slowstone\"\nmsgstr \"Pierre Nonchalante\"\n\n#. Key:\tRuneStoneMeteorShower_desc\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMeteorShower.RuneStoneMeteorShower.Description\n#: /Game/SO/Items/RuneStones/RuneStoneMeteorShower.RuneStoneMeteorShower.Description\nmsgctxt \"ItemData\"\nmsgid \"Summons 12 deadly meteors around the caster, each causing 16 damage on impact.\"\nmsgstr \"Invoque 12 météores mortels autour du lanceur, chacun causant 32 de dommages à l'impact.\"\n\n#. Key:\tRuneStoneMeteorShower_level_desc_0\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMeteorShower.RuneStoneMeteorShower.LevelBasedDescOverride(0).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneMeteorShower.RuneStoneMeteorShower.LevelBasedDescOverride(0).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons <Green>12</> deadly meteors around the caster, each causing <White>16</> damage on impact.\"\nmsgstr \"Invoque <Green>12</> météores mortels autour du lanceur, chacun causant <White>16</> de dommages à l'impact.\"\n\n#. Key:\tRuneStoneMeteorShower_level_desc_1\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMeteorShower.RuneStoneMeteorShower.LevelBasedDescOverride(1).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneMeteorShower.RuneStoneMeteorShower.LevelBasedDescOverride(1).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons <Green>16</> deadly meteors around the caster, each causing <White>24</> damage on impact.\"\nmsgstr \"Invoque <Green>16</> météores mortels autour du lanceur, chacun causant <White>24</> de dommages à l'impact.\"\n\n#. Key:\tRuneStoneMeteorShower_level_desc_2\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMeteorShower.RuneStoneMeteorShower.LevelBasedDescOverride(2).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneMeteorShower.RuneStoneMeteorShower.LevelBasedDescOverride(2).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons <Green>20</> deadly meteors around the caster, each causing <White>32</> damage on impact. Each meteor has a <Green>30%</> chance to <Yellow>Stun</> the target.\"\nmsgstr \"Invoque <Green>20</> météores mortels autour du lanceur, chacun causant <White>32</> de dommages à l'impact. Chaque météore a <GreenH>30%</> de chance <Yellow>d'Étourdir</> la cible.\"\n\n#. Key:\tRuneStoneMeteorShower_level_up_desc_0\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMeteorShower.RuneStoneMeteorShower.LevelUpBasedDescOverride(0).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneMeteorShower.RuneStoneMeteorShower.LevelUpBasedDescOverride(0).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons <Green>12</><YellowH>(→16)</> deadly meteors around the caster, each causing <White>16</><YellowH>(→24)</> damage on impact.\"\nmsgstr \"Invoque <Green>12</><YellowH>(→16)</> météores mortels autour du lanceur, chacun causant <White>16</><YellowH>(→24)</> de dommages à l'impact.\"\n\n#. Key:\tRuneStoneMeteorShower_level_up_desc_1\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMeteorShower.RuneStoneMeteorShower.LevelUpBasedDescOverride(1).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneMeteorShower.RuneStoneMeteorShower.LevelUpBasedDescOverride(1).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons <Green>16</><YellowH>(→20)</> deadly meteors around the caster, each causing <White>24</><YellowH>(→32)</> damage on impact. <YellowH>Each meteor has a</> <GreenH>30%</> <YellowH>chance to Stun the target.</>\"\nmsgstr \"Invoque <Green>16</><YellowH>(→20)</> météores mortels autour du lanceur, chacun causant <White>24</><YellowH>(→32)</> de dommages à l'impact. <YellowH>Chaque météore a</> <GreenH>30%</> <YellowH>de chance d'Étourdir la cible.</>\"\n\n#. Key:\tRuneStoneMeteorShower_name\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMeteorShower.RuneStoneMeteorShower.Name\n#: /Game/SO/Items/RuneStones/RuneStoneMeteorShower.RuneStoneMeteorShower.Name\nmsgctxt \"ItemData\"\nmsgid \"Meteorstone\"\nmsgstr \"Pierre Météore\"\n\n#. Key:\tRuneStoneShadowWalk_desc\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneShadowWalk.RuneStoneShadowWalk.Description\n#. Key:\tRuneStoneShadowWalk_level_desc_0\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneShadowWalk.RuneStoneShadowWalk.LevelBasedDescOverride(0).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneShadowWalk.RuneStoneShadowWalk.Description\n#: /Game/SO/Items/RuneStones/RuneStoneShadowWalk.RuneStoneShadowWalk.LevelBasedDescOverride(0).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Grants the ability to walk through your enemies for <Green>2</> seconds.\"\nmsgstr \"Donne la possibilité de marcher en traversant vos ennemis pendant <Green>2</> secondes.\"\n\n#. Key:\tRuneStoneShadowWalk_level_desc_1\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneShadowWalk.RuneStoneShadowWalk.LevelBasedDescOverride(1).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneShadowWalk.RuneStoneShadowWalk.LevelBasedDescOverride(1).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Grants the ability to walk through your enemies for <Green>4</> seconds.\"\nmsgstr \"Donne la possibilité de marcher en traversant vos ennemis pendant <Green>4</> secondes.\"\n\n#. Key:\tRuneStoneShadowWalk_level_desc_2\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneShadowWalk.RuneStoneShadowWalk.LevelBasedDescOverride(2).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneShadowWalk.RuneStoneShadowWalk.LevelBasedDescOverride(2).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Grants the ability to walk through your enemies for <Green>4</> seconds. Your magical resistance is increased by <Green>0.2.</>\"\nmsgstr \"Donne la possibilité de marcher en traversant vos ennemis pendant <Green>4</> secondes. Votre résistance à la magie est augmentée de</> <Green>0.2</>\"\n\n#. Key:\tRuneStoneShadowWalk_level_desc_3\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneShadowWalk.RuneStoneShadowWalk.LevelBasedDescOverride(3).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneShadowWalk.RuneStoneShadowWalk.LevelBasedDescOverride(3).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Grants the ability to walk through your enemies for <Green>5</> seconds. Your magical resistance is increased by <Green>0.3.</>\"\nmsgstr \"Donne la possibilité de marcher en traversant vos ennemis pendant <Green>5</> secondes. Votre résistance à la magie est augmentée de</> <Green>0.3</>\"\n\n#. Key:\tRuneStoneShadowWalk_level_up_desc_0\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneShadowWalk.RuneStoneShadowWalk.LevelUpBasedDescOverride(0).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneShadowWalk.RuneStoneShadowWalk.LevelUpBasedDescOverride(0).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Grants the ability to walk through your enemies for <Green>2</> <YellowH>(→4)</> seconds.\"\nmsgstr \"Donne la possibilité de marcher en traversant vos ennemis pendant <Green>2</> <YellowH>(→4)</>secondes.\"\n\n#. Key:\tRuneStoneShadowWalk_level_up_desc_1\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneShadowWalk.RuneStoneShadowWalk.LevelUpBasedDescOverride(1).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneShadowWalk.RuneStoneShadowWalk.LevelUpBasedDescOverride(1).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Grants the ability to walk through your enemies for <Green>4</> seconds. <YellowH>Your magical resistance is increased by</> <GreenH>0.2.</>\"\nmsgstr \"Donne la possibilité de marcher en traversant vos ennemis pendant <Green>4</> secondes. <YellowH>Votre résistance à la magie est augmentée de</> <Green>0.2</>\"\n\n#. Key:\tRuneStoneShadowWalk_level_up_desc_2\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneShadowWalk.RuneStoneShadowWalk.LevelUpBasedDescOverride(2).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneShadowWalk.RuneStoneShadowWalk.LevelUpBasedDescOverride(2).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Grants the ability to walk through your enemies for <Green>4</> <YellowH>(→5)</> seconds. Your magical resistance is increased by <Green>0.2</> <YellowH>(→0.3).</>\"\nmsgstr \"Donne la possibilité de marcher en traversant vos ennemis pendant <Green>4</> <YellowH>(→5)</> secondes. Votre résistance à la magie est augmentée de <Green>0.2</> <YellowH>(→0.3).</>\"\n\n#. Key:\tRuneStoneShadowWalk_name\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneShadowWalk.RuneStoneShadowWalk.Name\n#: /Game/SO/Items/RuneStones/RuneStoneShadowWalk.RuneStoneShadowWalk.Name\nmsgctxt \"ItemData\"\nmsgid \"Shadestone\"\nmsgstr \"Pierre Ombrée\"\n\n#. Key:\tRuneStoneSoulkeeper_desc\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneSoulkeeper.RuneStoneSoulkeeper.Description\n#: /Game/SO/Items/RuneStones/RuneStoneSoulkeeper.RuneStoneSoulkeeper.Description\nmsgctxt \"ItemData\"\nmsgid \"Summons the Soulkeeper, a powerful spirit capable of gathering your essence should something bad happen to you.\\r\\n\\r\\nReleasing the spirit recharges the stone.\"\nmsgstr \"Invoque le Gardien de l'Âme, un esprit puissant capable de rassembler votre essence si quelque chose de mal devait vous arriver.\\r\\n\\r\\nLibérer l'esprit recharge la pierre.\"\n\n#. Key:\tRuneStoneSoulkeeper_name\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneSoulkeeper.RuneStoneSoulkeeper.Name\n#: /Game/SO/Items/RuneStones/RuneStoneSoulkeeper.RuneStoneSoulkeeper.Name\nmsgctxt \"ItemData\"\nmsgid \"Soulstone\"\nmsgstr \"Pierre d'Âme\"\n\n#. Key:\tRuneStoneSoulkeeperInfinite_desc\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneSoulkeeperInfinite.RuneStoneSoulkeeperInfinite.Description\n#: /Game/SO/Items/RuneStones/RuneStoneSoulkeeperInfinite.RuneStoneSoulkeeperInfinite.Description\nmsgctxt \"ItemData\"\nmsgid \"Summons the Soulkeeper, a powerful spirit capable of gathering your essence should something bad happen to you.\"\nmsgstr \"Invoque le Gardien de l'Âme, un esprit puissant capable de rassembler votre essence si quelque chose de mal devait vous arriver.\"\n\n#. Key:\tRuneStoneSoulkeeperInfinite_name\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneSoulkeeperInfinite.RuneStoneSoulkeeperInfinite.Name\n#: /Game/SO/Items/RuneStones/RuneStoneSoulkeeperInfinite.RuneStoneSoulkeeperInfinite.Name\nmsgctxt \"ItemData\"\nmsgid \"Elite Soulstone\"\nmsgstr \"Pierre d'Âme Elite\"\n\n#. Key:\tRuneStoneSpellRegain_desc\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneSpellRegain.RuneStoneSpellRegain.Description\n#: /Game/SO/Items/RuneStones/RuneStoneSpellRegain.RuneStoneSpellRegain.Description\nmsgctxt \"ItemData\"\nmsgid \"Regenerates all other spell charges.\"\nmsgstr \"Régénère toutes les autres charges de sorts.\"\n\n#. Key:\tRuneStoneSpellRegain_name\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneSpellRegain.RuneStoneSpellRegain.Name\n#: /Game/SO/Items/RuneStones/RuneStoneSpellRegain.RuneStoneSpellRegain.Name\nmsgctxt \"ItemData\"\nmsgid \"Spiritstone\"\nmsgstr \"Pierre d'Esprit\"\n\n#. Key:\tRuneStoneSwap_desc\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.Description\n#. Key:\tRuneStoneSwap_level_desc_0\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.LevelBasedDescOverride(0).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.Description\n#: /Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.LevelBasedDescOverride(0).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Swaps the position of the caster with the closest target in front of him/her/it.\"\nmsgstr \"Échange la position du lanceur avec la cible la plus proche.\"\n\n#. Key:\tRuneStoneSwap_level_desc_1\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.LevelBasedDescOverride(1).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.LevelBasedDescOverride(1).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Swaps the position of the caster with the closest target in front of him/her/it. The selected target suffers <Blue>20</> damage.\"\nmsgstr \"Échange la position du lanceur avec la cible la plus proche. La cible sélectionnée subit <Blue>20</>de dommages.\"\n\n#. Key:\tRuneStoneSwap_level_desc_2\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.LevelBasedDescOverride(2).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.LevelBasedDescOverride(2).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Swaps the position of the caster with the closest target in front of him/her/it. The selected target suffers <Blue>30</> damage and becomes <Orange>Slow</>.\"\nmsgstr \"Échange la position du lanceur avec la cible la plus proche. La cible sélectionnée subit <Blue>30</>de dommages et devient <Orange>Lente</>.\"\n\n#. Key:\tRuneStoneSwap_level_desc_3\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.LevelBasedDescOverride(3).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.LevelBasedDescOverride(3).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Swaps the position of the caster with the closest target in front of him/her/it. The selected target suffers <Blue>40</> damage and becomes <Orange>Slow</>.\"\nmsgstr \"Échange la position du lanceur avec la cible la plus proche. La cible sélectionnée subit <Blue>40</>de dommages et devient <Orange>Lente</>.\"\n\n#. Key:\tRuneStoneSwap_level_desc_4\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.LevelBasedDescOverride(4).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.LevelBasedDescOverride(4).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Swaps the position of the caster with the closest target in front of him/her/it. The selected target suffers <Blue>50</> damage and becomes <Orange>Slow</>.\"\nmsgstr \"Échange la position du lanceur avec la cible la plus proche. La cible sélectionnée subit <Blue>50</>de dommages et devient <Orange>Lente</>.\"\n\n#. Key:\tRuneStoneSwap_level_up_desc_0\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.LevelUpBasedDescOverride(0).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.LevelUpBasedDescOverride(0).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Swaps the position of the caster with the closest target in front of him/her/it. <YellowH>The selected target suffers</> <BlueH>20</> <YellowH>damage.</>\"\nmsgstr \"Échange la position du lanceur avec la cible la plus proche. <YellowH> La cible sélectionnée subit</> <Blue>20</><YellowH>de dommages.</>\"\n\n#. Key:\tRuneStoneSwap_level_up_desc_1\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.LevelUpBasedDescOverride(1).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.LevelUpBasedDescOverride(1).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Swaps the position of the caster with the closest target in front of him/her/it. The selected target suffers <Blue>20</><YellowH>(→30)</> damage <YellowH>and becomes </><Orange>Slow.</>\"\nmsgstr \"Échange la position du lanceur avec la cible la plus proche. La cible sélectionnée subit <Blue>20</><YellowH>(→30)</> de dommages<YellowH> et devient</> <Orange>Lente.</>\"\n\n#. Key:\tRuneStoneSwap_level_up_desc_2\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.LevelUpBasedDescOverride(2).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.LevelUpBasedDescOverride(2).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Swaps the position of the caster with the closest target in front of him/her/it. The selected target suffers <Blue>30</><YellowH>(→40)</> damage and becomes <Orange>Slow.</>\"\nmsgstr \"Échange la position du lanceur avec la cible la plus proche. La cible sélectionnée subit <Blue>30</><YellowH>(→40)</> de dommages et devient <Orange>Lente.</>\"\n\n#. Key:\tRuneStoneSwap_level_up_desc_3\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.LevelUpBasedDescOverride(3).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.LevelUpBasedDescOverride(3).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Swaps the position of the caster with the closest target in front of him/her/it. The selected target suffers <Blue>40</><YellowH>(→50)</> damage and becomes <Orange>Slow.</>\"\nmsgstr \"Échange la position du lanceur avec la cible la plus proche. La cible sélectionnée subit <Blue>40</><YellowH>(→50)</> de dommages et devient <Orange>Lente.</>\"\n\n#. Key:\tRuneStoneSwap_name\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.Name\n#: /Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.Name\nmsgctxt \"ItemData\"\nmsgid \"Swapstone\"\nmsgstr \"Pierre d'Échange\"\n\n#. Key:\tRuneStoneWeaponFlame_desc\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.Description\n#: /Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.Description\nmsgctxt \"ItemData\"\nmsgid \"Enchants your active weapon with green flames - it causes an additional 0.3x damage for 4 seconds.\"\nmsgstr \"Enchantez votre arme active avec des flammes vertes - cela provoque 0,3x de dégâts pendant 4 secondes.\"\n\n#. Key:\tRuneStoneWeaponFlame_level_desc_0\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.LevelBasedDescOverride(0).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.LevelBasedDescOverride(0).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Enchants your active weapon - it causes an additional <Green>0.5x</> damage for <Green>5</> seconds.\"\nmsgstr \"Enchante votre arme active - elle cause <Green>0,5x</> dommages supplémentaires pendant <Green>5</> secondes.\"\n\n#. Key:\tRuneStoneWeaponFlame_level_desc_1\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.LevelBasedDescOverride(1).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.LevelBasedDescOverride(1).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Enchants your active weapon - it causes an additional <Green>0.6x</> damage for <Green>5</> seconds. Each strike has a <Green>15%</> chance to apply <DarkGreen>Poison</>, causing an additional <Blue>18</> damage over <Green>6</> seconds.\"\nmsgstr \"Enchante votre arme active - elle cause <Green>0,6x</> dommages supplémentaires pendant <Green>5</> secondes. Chaque coup a <Green>15%</> de chance d'appliquer du <DarkGreen>Poison</>, causant <Blue>18</> de dommages supplémentaires pendant <Green>6</> secondes.\"\n\n#. Key:\tRuneStoneWeaponFlame_level_desc_2\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.LevelBasedDescOverride(2).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.LevelBasedDescOverride(2).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Enchants your active weapon - it causes an additional <Green>0.7x</> damage for <Green>6</> seconds. Each strike has a <Green>20%</> chance to apply <DarkGreen>Poison</>, causing an additional <Blue>24</> damage over <Green>6</> seconds.\"\nmsgstr \"Enchante votre arme active - elle cause <Green>0,7x</> dommages supplémentaires pendant <Green>6</> secondes. Chaque coup a <Green>20%</> de chance d'appliquer du <DarkGreen>Poison</>, causant <Blue>24</> de dommages supplémentaires pendant <Green>6</> secondes.\"\n\n#. Key:\tRuneStoneWeaponFlame_level_desc_3\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.LevelBasedDescOverride(3).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.LevelBasedDescOverride(3).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Enchants your active weapon - it causes an additional <Green>0.8x</> damage for <Green>6</> seconds. Each strike has a <Green>25%</> chance to apply <DarkGreen>Poison</>, causing an additional <Blue>30</> damage over <Green>6</> seconds.\"\nmsgstr \"Enchante votre arme active - elle cause <Green>0,8x</> dommages supplémentaires pendant <Green>6</> secondes. Chaque coup a <Green>25%</> de chance d'appliquer du <DarkGreen>Poison</>, causant <Blue>30</> de dommages supplémentaires pendant <Green>6</> secondes.\"\n\n#. Key:\tRuneStoneWeaponFlame_level_desc_4\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.LevelBasedDescOverride(4).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.LevelBasedDescOverride(4).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Enchants your active weapon - it causes an additional <Green>0.9x</> damage for <Green>6</> seconds. Each strike has a <Green>30%</> chance to apply <DarkGreen>Poison</>, causing an additional <Blue>36</> damage over <Green>6</> seconds.\"\nmsgstr \"Enchante votre arme active - elle cause <Green>0,9x</> dommages supplémentaires pendant <Green>6</> secondes. Chaque coup a <Green>30%</> de chance d'appliquer du <DarkGreen>Poison</>, causant <Blue>36</> de dommages supplémentaires pendant <Green>6</> secondes.\"\n\n#. Key:\tRuneStoneWeaponFlame_level_up_desc_0\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.LevelUpBasedDescOverride(0).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.LevelUpBasedDescOverride(0).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Enchants your active weapon - it causes an additional <Green>0.5x</><YellowH>(→0.6x)</> damage for <Green>5</> seconds. <YellowH>Each strike has a</> <GreenH>15%</> <YellowH>chance to apply </><DarkGreenH>Poison</><YellowH>, causing an additional</> <BlueH>18</> <YellowH>damage over</> <GreenH>6</> <YellowH>seconds.</>\"\nmsgstr \"Enchante votre arme active - elle cause <Green>0,5x</><YellowH>(→0.6x)</> dommages supplémentaires pendant <Green>5</> secondes. Chaque coup a </> <GreenH>15%</> <YellowH> de chance d'appliquer du <DarkGreen>Poison</><YellowH>, causant</> <Blue>18</><YellowH> de dommages supplémentaires pendant</> <GreenH>6</> <YellowH> secondes.</>\"\n\n#. Key:\tRuneStoneWeaponFlame_level_up_desc_1\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.LevelUpBasedDescOverride(1).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.LevelUpBasedDescOverride(1).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Enchants your active weapon - it causes an additional <Green>0.6x</><YellowH>(→0.7x)</> damage for <Green>5</><YellowH>(→6)</> seconds. Each strike has a <Green>15%</><YellowH>(→20%)</> chance to apply <DarkGreen>Poison</>, causing an additional <Blue>18</><YellowH>(→24)</> damage over <Green>6</> seconds.\"\nmsgstr \"Enchante votre arme active - elle cause <Green>0,6x</><YellowH>(→0.7x)</> dommages supplémentaires pendant <Green>5</> secondes. Chaque coup a <Green>15%</><YellowH>(→20%)</> de chance d'appliquer du <DarkGreen>Poison</>, causant <Blue>18</><YellowH>(→24)</> de dommages supplémentaires pendant <Green>6</> secondes.\"\n\n#. Key:\tRuneStoneWeaponFlame_level_up_desc_2\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.LevelUpBasedDescOverride(2).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.LevelUpBasedDescOverride(2).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Enchants your active weapon - it causes an additional <Green>0.7x</><YellowH>(→0.8x)</> damage for <Green>6</> seconds. Each strike has a <Green>20%</><YellowH>(→25%)</> chance to apply <DarkGreen>Poison</>, causing an additional <Blue>24</><YellowH>(→30)</> damage over <Green>6</> seconds.\"\nmsgstr \"Enchante votre arme active - elle cause <Green>0,7x</><YellowH>(→0.8x)</> dommages supplémentaires pendant <Green>6</> secondes. Chaque coup a <Green>20%</><YellowH>(→25%)</> de chance d'appliquer du <DarkGreen>Poison</>, causant <Blue>24</><YellowH>(→30)</> de dommages supplémentaires pendant <Green>6</> secondes.\"\n\n#. Key:\tRuneStoneWeaponFlame_level_up_desc_3\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.LevelUpBasedDescOverride(3).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.LevelUpBasedDescOverride(3).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Enchants your active weapon - it causes an additional <Green>0.8x</><YellowH>(→0.9x)</> damage for <Green>6</> seconds. Each strike has a <Green>25%</><YellowH>(→30%)</> chance to apply <DarkGreen>Poison</>, causing an additional <Blue>30</><YellowH>(→36)</> damage over <Green>6</> seconds.\"\nmsgstr \"Enchante votre arme active - elle cause <Green>0,8x</><YellowH>(→0.9x)</> dommages supplémentaires pendant <Green>6</> secondes. Chaque coup a <Green>25%</><YellowH>(→30%)</> de chance d'appliquer du <DarkGreen>Poison</>, causant <Blue>30</><YellowH>(→36)</> de dommages supplémentaires pendant <Green>6</> secondes.\"\n\n#. Key:\tRuneStoneWeaponFlame_name\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.Name\n#: /Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.Name\nmsgctxt \"ItemData\"\nmsgid \"Green Flamestone\"\nmsgstr \"Pierre de Feu Verte\"\n\n#. Key:\tSabre_desc\n#. SourceLocation:\t/Game/SO/Items/Weapons/Sabre.Sabre.Description\n#: /Game/SO/Items/Weapons/Sabre.Sabre.Description\nmsgctxt \"ItemData\"\nmsgid \"Rangol was a legendary blacksmith who practiced his crafting art for a hundred years. This sabre was made on day one.\"\nmsgstr \"Rangol était un forgeron légendaire ayant pratiqué son art artisanal pendant cent ans. Ce sabre a été fabriqué le premier jour.\"\n\n#. Key:\tSabre_name\n#. SourceLocation:\t/Game/SO/Items/Weapons/Sabre.Sabre.Name\n#: /Game/SO/Items/Weapons/Sabre.Sabre.Name\nmsgctxt \"ItemData\"\nmsgid \"First Sabre of Rangol\"\nmsgstr \"Premier Sabre de Rangol\"\n\n#. Key:\tSecondChance_desc\n#. SourceLocation:\t/Game/SO/Items/RuneStones/SecondChance.SecondChance.Description\n#: /Game/SO/Items/RuneStones/SecondChance.SecondChance.Description\nmsgctxt \"ItemData\"\nmsgid \"Prevents death.\"\nmsgstr \"Empêche la mort.\"\n\n#. Key:\tSecondChance_name\n#. SourceLocation:\t/Game/SO/Items/RuneStones/SecondChance.SecondChance.Name\n#: /Game/SO/Items/RuneStones/SecondChance.SecondChance.Name\nmsgctxt \"ItemData\"\nmsgid \"Chancestone\"\nmsgstr \"Pierre de Chance\"\n\n#. Key:\tSecretWeirdDevice_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/SecretWeirdDevice.SecretWeirdDevice.Description\n#: /Game/SO/Items/QuestItems/SecretWeirdDevice.SecretWeirdDevice.Description\nmsgctxt \"ItemData\"\nmsgid \"A weird device, most likely one of the inventions of the Secret Science Society.\"\nmsgstr \"Un étrange dispositif, très probablement l'une des inventions de la Société des Sciences Secrètes.\"\n\n#. Key:\tSecretWeirdDevice_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/SecretWeirdDevice.SecretWeirdDevice.Name\n#: /Game/SO/Items/QuestItems/SecretWeirdDevice.SecretWeirdDevice.Name\nmsgctxt \"ItemData\"\nmsgid \"Weird Device\"\nmsgstr \"Dispositif Étrange\"\n\n#. Key:\tShardAmber_desc\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardAmber.ShardAmber.Description\n#: /Game/SO/Items/Shards/ShardAmber.ShardAmber.Description\nmsgctxt \"ItemData\"\nmsgid \"Each melee strike has an additional <Yellow>10%</> chance to cause a critical hit, causing <Green>200%</> of your normal weapon damage.\"\nmsgstr \"Chaque attaque de mêlée a une chance supplémentaire de <Yellow>10%</> de causer un coup critique, causant <Green>200%</> des dégâts normaux de votre arme.\"\n\n#. Key:\tShardAmber_name\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardAmber.ShardAmber.Name\n#: /Game/SO/Items/Shards/ShardAmber.ShardAmber.Name\nmsgctxt \"ItemData\"\nmsgid \"Amber Shard\"\nmsgstr \"Éclat d'Ambre\"\n\n#. Key:\tShardAmberBright_desc\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardAmberBright.ShardAmberBright.Description\n#: /Game/SO/Items/Shards/ShardAmberBright.ShardAmberBright.Description\nmsgctxt \"ItemData\"\nmsgid \"Each melee strike has an additional <Yellow>20%</> chance to cause a critical hit, causing <Green>200%</> of your normal weapon damage.\"\nmsgstr \"Chaque attaque de mêlée a une chance supplémentaire de <Yellow>20%</> de causer un coup critique, causant <Green>200%</> des dégâts normaux de votre arme.\"\n\n#. Key:\tShardAmberBright_name\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardAmberBright.ShardAmberBright.Name\n#: /Game/SO/Items/Shards/ShardAmberBright.ShardAmberBright.Name\nmsgctxt \"ItemData\"\nmsgid \"Bright Amber Shard\"\nmsgstr \"Éclat d'Ambre Vif\"\n\n#. Key:\tShardAqua_desc\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardAqua.ShardAqua.Description\n#: /Game/SO/Items/Shards/ShardAqua.ShardAqua.Description\nmsgctxt \"ItemData\"\nmsgid \"Cooldown recharge speed is increased by <Blue>20%</>.\"\nmsgstr \"La vitesse de rechargement est augmentée de <Blue>20%</>.\"\n\n#. Key:\tShardAqua_name\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardAqua.ShardAqua.Name\n#: /Game/SO/Items/Shards/ShardAqua.ShardAqua.Name\nmsgctxt \"ItemData\"\nmsgid \"Aqua Shard\"\nmsgstr \"Éclat d'Eau\"\n\n#. Key:\tShardAquaBright_desc\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardAquaBright.ShardAquaBright.Description\n#: /Game/SO/Items/Shards/ShardAquaBright.ShardAquaBright.Description\nmsgctxt \"ItemData\"\nmsgid \"Cooldown recharge speed is increased by <Blue>40%</>.\"\nmsgstr \"La vitesse de rechargement est augmentée de <Blue>40%</>.\"\n\n#. Key:\tShardAquaBright_name\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardAquaBright.ShardAquaBright.Name\n#: /Game/SO/Items/Shards/ShardAquaBright.ShardAquaBright.Name\nmsgctxt \"ItemData\"\nmsgid \"Bright Aqua Shard\"\nmsgstr \"Éclat d'Eau Vif\"\n\n#. Key:\tShardBlack_desc\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardBlack.ShardBlack.Description\n#: /Game/SO/Items/Shards/ShardBlack.ShardBlack.Description\nmsgctxt \"ItemData\"\nmsgid \"Every time an enemy hits you with a melee strike or overlaps you it is turned into a boot for a short time.\"\nmsgstr \"Chaque fois qu'un ennemi vous frappe en mêlée ou vous piétine, il se transforme en botte pendant une courte période.\"\n\n#. Key:\tShardBlack_name\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardBlack.ShardBlack.Name\n#: /Game/SO/Items/Shards/ShardBlack.ShardBlack.Name\nmsgctxt \"ItemData\"\nmsgid \"Black Shard\"\nmsgstr \"Éclat Noir\"\n\n#. Key:\tShardBlue_desc\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardBlue.ShardBlue.Description\n#: /Game/SO/Items/Shards/ShardBlue.ShardBlue.Description\nmsgctxt \"ItemData\"\nmsgid \"Decreases the incoming <Blue>Magical Damage</> by <Blue>20%.</>\"\nmsgstr \"Diminue les <Blue>Dommages Magiques</> de <Blue>20%.</>\"\n\n#. Key:\tShardBlue_name\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardBlue.ShardBlue.Name\n#: /Game/SO/Items/Shards/ShardBlue.ShardBlue.Name\nmsgctxt \"ItemData\"\nmsgid \"Blue Shard\"\nmsgstr \"Éclat Bleu\"\n\n#. Key:\tShardBlueBright_desc\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardBlueBright.ShardBlueBright.Description\n#: /Game/SO/Items/Shards/ShardBlueBright.ShardBlueBright.Description\nmsgctxt \"ItemData\"\nmsgid \"Decreases the incoming <Blue>Magical Damage</> by <Blue>30%.</>\"\nmsgstr \"Diminue les <Blue>Dommages Magiques</> de <Blue>30%.</>\"\n\n#. Key:\tShardBlueBright_name\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardBlueBright.ShardBlueBright.Name\n#: /Game/SO/Items/Shards/ShardBlueBright.ShardBlueBright.Name\nmsgctxt \"ItemData\"\nmsgid \"Bright Blue Shard\"\nmsgstr \"Éclat Bleu VIf\"\n\n#. Key:\tShardGreen_desc\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardGreen.ShardGreen.Description\n#: /Game/SO/Items/Shards/ShardGreen.ShardGreen.Description\nmsgctxt \"ItemData\"\nmsgid \"Increases the attack speed by <Green>20%</>\"\nmsgstr \"Augmente la vitesse d'attaque de <Green>20%</>\"\n\n#. Key:\tShardGreen_name\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardGreen.ShardGreen.Name\n#: /Game/SO/Items/Shards/ShardGreen.ShardGreen.Name\nmsgctxt \"ItemData\"\nmsgid \"Green Shard\"\nmsgstr \"Éclat Vert\"\n\n#. Key:\tShardGreenBright_desc\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardGreenBright.ShardGreenBright.Description\n#: /Game/SO/Items/Shards/ShardGreenBright.ShardGreenBright.Description\nmsgctxt \"ItemData\"\nmsgid \"Increases the attack speed by <Green>30%</>\"\nmsgstr \"Augmente la vitesse d'attaque de <Green>30%</>\"\n\n#. Key:\tShardGreenBright_name\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardGreenBright.ShardGreenBright.Name\n#: /Game/SO/Items/Shards/ShardGreenBright.ShardGreenBright.Name\nmsgctxt \"ItemData\"\nmsgid \"Bright Green Shard\"\nmsgstr \"Éclat Vert Vif\"\n\n#. Key:\tShardPurple_desc\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardPurple.ShardPurple.Description\n#: /Game/SO/Items/Shards/ShardPurple.ShardPurple.Description\nmsgctxt \"ItemData\"\nmsgid \"Each time you cast a charge based spell you have a <Purple>25%</> chance to regain the charge.\"\nmsgstr \"Chaque fois que vous lancez un sort basé sur une charge, vous avez <Purple>25%</> de chance de récupérer la charge.\"\n\n#. Key:\tShardPurple_name\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardPurple.ShardPurple.Name\n#: /Game/SO/Items/Shards/ShardPurple.ShardPurple.Name\nmsgctxt \"ItemData\"\nmsgid \"Purple Shard\"\nmsgstr \"Éclat Violet\"\n\n#. Key:\tShardPurpleBright_desc\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardPurpleBright.ShardPurpleBright.Description\n#: /Game/SO/Items/Shards/ShardPurpleBright.ShardPurpleBright.Description\nmsgctxt \"ItemData\"\nmsgid \"Each time you cast a charge based spell you have a <Purple>50%</> chance to regain the charge.\"\nmsgstr \"Chaque fois que vous lancez un sort basé sur une charge, vous avez <Purple>50%</> de chance de récupérer la charge.\"\n\n#. Key:\tShardPurpleBright_name\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardPurpleBright.ShardPurpleBright.Name\n#: /Game/SO/Items/Shards/ShardPurpleBright.ShardPurpleBright.Name\nmsgctxt \"ItemData\"\nmsgid \"Bright Purple Shard\"\nmsgstr \"Éclat Violet Vif\"\n\n#. Key:\tShardRed_desc\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardRed.ShardRed.Description\n#: /Game/SO/Items/Shards/ShardRed.ShardRed.Description\nmsgctxt \"ItemData\"\nmsgid \"You heal <Red>5%</> of the melee damage you inflict on your enemies.\"\nmsgstr \"Vous vous soignez de <Red>5%</> des dégâts de mêlée que vous infligez à vos ennemis.\"\n\n#. Key:\tShardRed_name\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardRed.ShardRed.Name\n#: /Game/SO/Items/Shards/ShardRed.ShardRed.Name\nmsgctxt \"ItemData\"\nmsgid \"Red Shard\"\nmsgstr \"Éclat Rouge\"\n\n#. Key:\tShardRedBright_desc\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardRedBright.ShardRedBright.Description\n#: /Game/SO/Items/Shards/ShardRedBright.ShardRedBright.Description\nmsgctxt \"ItemData\"\nmsgid \"You heal <Red>10%</> of the melee damage you inflict on your enemies.\"\nmsgstr \"Vous vous soignez de <Red>10%</> des dégâts de mêlée que vous infligez à vos ennemis.\"\n\n#. Key:\tShardRedBright_name\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardRedBright.ShardRedBright.Name\n#: /Game/SO/Items/Shards/ShardRedBright.ShardRedBright.Name\nmsgctxt \"ItemData\"\nmsgid \"Bright Red Shard\"\nmsgstr \"Éclat Rouge Vif\"\n\n#. Key:\tShardSilver_desc\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardSilver.ShardSilver.Description\n#: /Game/SO/Items/Shards/ShardSilver.ShardSilver.Description\nmsgctxt \"ItemData\"\nmsgid \"Decreases the incoming <White>Physical Damage</> by <White>20%.</>\"\nmsgstr \"Diminue les <White>Dommages physiques</> entrants de <White>20%.</>\"\n\n#. Key:\tShardSilver_name\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardSilver.ShardSilver.Name\n#: /Game/SO/Items/Shards/ShardSilver.ShardSilver.Name\nmsgctxt \"ItemData\"\nmsgid \"Silver Shard\"\nmsgstr \"Éclat Argenté\"\n\n#. Key:\tShardSilverBright_desc\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardSilverBright.ShardSilverBright.Description\n#: /Game/SO/Items/Shards/ShardSilverBright.ShardSilverBright.Description\nmsgctxt \"ItemData\"\nmsgid \"Decreases the incoming <White>Physical Damage</> by <White>30%.</>\"\nmsgstr \"Diminue les <White>Dommages physiques</> entrants de <White>30%.</>\"\n\n#. Key:\tShardSilverBright_name\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardSilverBright.ShardSilverBright.Name\n#: /Game/SO/Items/Shards/ShardSilverBright.ShardSilverBright.Name\nmsgctxt \"ItemData\"\nmsgid \"Bright Silver Shard\"\nmsgstr \"Éclat Argenté Vif\"\n\n#. Key:\tShardTeal_desc\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardTeal.ShardTeal.Description\n#: /Game/SO/Items/Shards/ShardTeal.ShardTeal.Description\nmsgctxt \"ItemData\"\nmsgid \"Each time an enemy hits you with a melee strike it suffers the same damage.\"\nmsgstr \"Chaque fois qu'un ennemi vous frappe avec une attaque de mêlée, il subit les mêmes dommages.\"\n\n#. Key:\tShardTeal_name\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardTeal.ShardTeal.Name\n#: /Game/SO/Items/Shards/ShardTeal.ShardTeal.Name\nmsgctxt \"ItemData\"\nmsgid \"Teal Shard\"\nmsgstr \"Éclat Turquoise\"\n\n#. Key:\tShardTealBright_desc\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardTealBright.ShardTealBright.Description\n#: /Game/SO/Items/Shards/ShardTealBright.ShardTealBright.Description\nmsgctxt \"ItemData\"\nmsgid \"Each time an enemy hits you, it suffers <Green>200%</> of the damage.\"\nmsgstr \"Chaque fois qu'un ennemi vous touche, il subit <Green>200%</> des dégâts.\"\n\n#. Key:\tShardTealBright_name\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardTealBright.ShardTealBright.Name\n#: /Game/SO/Items/Shards/ShardTealBright.ShardTealBright.Name\nmsgctxt \"ItemData\"\nmsgid \"Bright Teal Shard\"\nmsgstr \"Éclat Turquoise Vif\"\n\n#. Key:\tShardWhite_desc\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardWhite.ShardWhite.Description\n#: /Game/SO/Items/Shards/ShardWhite.ShardWhite.Description\nmsgctxt \"ItemData\"\nmsgid \"Increases your damage by <Green>20%</>\"\nmsgstr \"Augmente vos dégâts de <Green>20%</>\"\n\n#. Key:\tShardWhite_name\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardWhite.ShardWhite.Name\n#: /Game/SO/Items/Shards/ShardWhite.ShardWhite.Name\nmsgctxt \"ItemData\"\nmsgid \"White Shard\"\nmsgstr \"Éclat Blanc\"\n\n#. Key:\tShardWhiteBright_desc\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardWhiteBright.ShardWhiteBright.Description\n#: /Game/SO/Items/Shards/ShardWhiteBright.ShardWhiteBright.Description\nmsgctxt \"ItemData\"\nmsgid \"Increases your damage by <Green>30%</>.\"\nmsgstr \"Augmente vos dégâts de <Green>30%</>.\"\n\n#. Key:\tShardWhiteBright_name\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardWhiteBright.ShardWhiteBright.Name\n#: /Game/SO/Items/Shards/ShardWhiteBright.ShardWhiteBright.Name\nmsgctxt \"ItemData\"\nmsgid \"Bright White Shard\"\nmsgstr \"Éclat Blanc Vif\"\n\n#. Key:\tShardYellow_desc\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardYellow.ShardYellow.Description\n#: /Game/SO/Items/Shards/ShardYellow.ShardYellow.Description\nmsgctxt \"ItemData\"\nmsgid \"Each melee strike has a <Yellow>10%</> chance to <Yellow>Stun</> the target.\"\nmsgstr \"Chaque coup de mêlée a <Yellow>10%</> de chances d'<Yellow>Étourdir</> la cible.\"\n\n#. Key:\tShardYellow_name\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardYellow.ShardYellow.Name\n#: /Game/SO/Items/Shards/ShardYellow.ShardYellow.Name\nmsgctxt \"ItemData\"\nmsgid \"Yellow Shard\"\nmsgstr \"Éclat Jaune\"\n\n#. Key:\tShardYellowBright_desc\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardYellowBright.ShardYellowBright.Description\n#: /Game/SO/Items/Shards/ShardYellowBright.ShardYellowBright.Description\nmsgctxt \"ItemData\"\nmsgid \"Each melee strike has a <Yellow>20%</> chance to <Yellow>Stun</> the target.\"\nmsgstr \"Chaque coup de mêlée a <Yellow>20%</> de chances d'<Yellow>Étourdir</> la cible.\"\n\n#. Key:\tShardYellowBright_name\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardYellowBright.ShardYellowBright.Name\n#: /Game/SO/Items/Shards/ShardYellowBright.ShardYellowBright.Name\nmsgctxt \"ItemData\"\nmsgid \"Bright Yellow Shard\"\nmsgstr \"Éclat Jaune Vif\"\n\n#. Key:\tSpellCaster_desc\n#. SourceLocation:\t/Game/SO/Items/Useable/SpellCaster.SpellCaster.Description\n#: /Game/SO/Items/Useable/SpellCaster.SpellCaster.Description\nmsgctxt \"ItemData\"\nmsgid \"A magical artefact with the following worn text engraved on the back:\\r\\n\\r\\nInsert Runestones to ... spells\\r\\nKeep .... .... children\\r\\nMade in .....\"\nmsgstr \"Un artefact magique dont ce texte usé est gravé au dos :\\n\\nInsérer les Pierres Runiques de ... sorts\\nGarder .... .... l'enfant\\nFabriqué en ....\"\n\n#. Key:\tSpellCaster_name\n#. SourceLocation:\t/Game/SO/Items/Useable/SpellCaster.SpellCaster.Name\n#: /Game/SO/Items/Useable/SpellCaster.SpellCaster.Name\nmsgctxt \"ItemData\"\nmsgid \"Spellcaster\"\nmsgstr \"Lanceur de Sorts\"\n\n#. Key:\tStraightSword_desc\n#. SourceLocation:\t/Game/SO/Items/Weapons/StraightSword.StraightSword.Description\n#: /Game/SO/Items/Weapons/StraightSword.StraightSword.Description\nmsgctxt \"ItemData\"\nmsgid \"A simple yet effective weapon. Not too rusty, not too sharp. If someone looks close enough it looks a bit low budget, but the ones looking close enough won't talk about anything anymore, will they?\"\nmsgstr \"Une arme simple mais efficace. Pas trop rouillée, pas trop tranchante. Si quelqu'un regarde d'assez près, cela semble un peu trop limité, mais ceux qui regardent d'assez près n'en diront rien, n'est-ce pas ?\"\n\n#. Key:\tStraightSword_name\n#. SourceLocation:\t/Game/SO/Items/Weapons/StraightSword.StraightSword.Name\n#: /Game/SO/Items/Weapons/StraightSword.StraightSword.Name\nmsgctxt \"ItemData\"\nmsgid \"Straight Sword\"\nmsgstr \"Épée Droite\"\n\n#. Key:\tTestStoneBag_desc\n#. SourceLocation:\t/Game/SO/Items/Useable/TestStoneBag.TestStoneBag.Description\n#: /Game/SO/Items/Useable/TestStoneBag.TestStoneBag.Description\nmsgctxt \"ItemData\"\nmsgid \"When you are the one in the team who has the job to enter every dungeon first, you will become a careful one too... if you live long enough for that.\"\nmsgstr \"Lorsque vous êtes celui qui, dans l'équipe, a la tâche d'entrer le premier dans chaque donjon, vous deviendrez aussi quelqu'un de prudent... si vous vivez assez longtemps pour cela.\"\n\n#. Key:\tTestStoneBag_name\n#. SourceLocation:\t/Game/SO/Items/Useable/TestStoneBag.TestStoneBag.Name\n#: /Game/SO/Items/Useable/TestStoneBag.TestStoneBag.Name\nmsgctxt \"ItemData\"\nmsgid \"Bag of the Careful One\"\nmsgstr \"Le Sac de la Prudence\"\n\n#. Key:\tWheel_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/Wheel.Wheel.Description\n#: /Game/SO/Items/QuestItems/Wheel.Wheel.Description\nmsgctxt \"ItemData\"\nmsgid \"One of the first greatest inventions of humans. Because they envied balls for their rolling skill.\"\nmsgstr \"Une des premières grandes inventions de l'homme. Parce qu'ils enviaient les balles pour leur habileté à rouler.\"\n\n#. Key:\tWheel_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/Wheel.Wheel.Name\n#: /Game/SO/Items/QuestItems/Wheel.Wheel.Name\nmsgctxt \"ItemData\"\nmsgid \"Wheel\"\nmsgstr \"Roue\"\n\n#. Key:\tWWBossShipLock_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/WWBossShipLock.WWBossShipLock.Description\n#: /Game/SO/Items/Keys/WWBossShipLock.WWBossShipLock.Description\nmsgctxt \"ItemData\"\nmsgid \"Rusty key of a rusty lock.\"\nmsgstr \"La clé rouillée d'une serrure tout aussi rouillée.\"\n\n#. Key:\tWWBossShipLock_name\n#. SourceLocation:\t/Game/SO/Items/Keys/WWBossShipLock.WWBossShipLock.Name\n#: /Game/SO/Items/Keys/WWBossShipLock.WWBossShipLock.Name\nmsgctxt \"ItemData\"\nmsgid \"Rusty Key\"\nmsgstr \"Clé Rouillée\"\n\n#. Key:\t0BFD568E4989A20D66B91DA476C0E6B4\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_6.Text\n#: /Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_6.Text\nmsgctxt \"Notes\"\nmsgid \"I promised Fountain to give its flower to the Magic Mirror.\"\nmsgstr \"J'ai promis à la Fontaine de donner sa fleur au Miroir Magique.\"\n\n#. Key:\t1ABD11A64A7649801A6AB6A8BBDC686C\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_9.Text\n#: /Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_9.Text\nmsgctxt \"Notes\"\nmsgid \"The Ghost Dwarf needs a ghost abacus\"\nmsgstr \"Le Fantôme Nain a besoin d'un boulier fantôme\"\n\n#. Key:\t57CBE1274A1B4EC7FD68EA9288161AAD\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_7.Text\n#: /Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_7.Text\nmsgctxt \"Notes\"\nmsgid \"The Chef wants me to clear the shore\"\nmsgstr \"Le Chef veut que je nettoie le rivage\"\n\n#. Key:\t77693D6C43702786250364932BD34BCD\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note.Text\n#: /Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note.Text\nmsgctxt \"Notes\"\nmsgid \"The GateKeeper could use a chair\"\nmsgstr \"Le Gardien du Portail pourrait avoir besoin d'une chaise\"\n\n#. Key:\t9C3FB78C4598A48BC187B580CBB070F6\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_8.Text\n#: /Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_8.Text\nmsgctxt \"Notes\"\nmsgid \"The Dwarf wants me to clear the Dwarven Fortress\"\nmsgstr \"Le Nain veut que je nettoie la Forteresse des Nains\"\n\n#. Key:\tAA94EB6E4B0A505D730971932A3DE0CC\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_5.Text\n#: /Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_5.Text\nmsgctxt \"Notes\"\nmsgid \"The Golem Maker wants me to hunt some Golems\"\nmsgstr \"Le Créateur de Golems veut que je chasse des Golems\"\n\n#. Key:\tAE371E564EC1D75947ECF98AAA896A2C\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_11.Text\n#: /Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_11.Text\nmsgctxt \"Notes\"\nmsgid \"A Pipe Walker is trapped in a cage\"\nmsgstr \"Un Tuyauteur est enfermé dans une cage\"\n\n#. Key:\tB12481ED4CFF0182EDB7ACAA416B55FC\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_4.Text\n#: /Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_4.Text\nmsgctxt \"Notes\"\nmsgid \"Gnory needs a wheel\"\nmsgstr \"Gnory a besoin d'une roue\"\n\n#. Key:\tD3B6D81E433CBE8461E2B1AFE06E9741\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_13.Text\n#: /Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_13.Text\nmsgctxt \"Notes\"\nmsgid \"The Chef asked me to bring him some Purple Mushroom\"\nmsgstr \"Le Chef m'a demandé de lui apporter du Champignon Violet\"\n\n#. Key:\tD8C4FFC7435C6A2E7C88BBA7109A1907\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_12.Text\n#: /Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_12.Text\nmsgctxt \"Notes\"\nmsgid \"I need to learn Dwarven to open a gate\"\nmsgstr \"Je dois apprendre la Langue des Nains pour ouvrir une porte\"\n\n#. Key:\tE3857F07468C2A0B34A98887E3BBB1DA\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_10.Text\n#: /Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_10.Text\nmsgctxt \"Notes\"\nmsgid \"I feel the Tomb of Tabby is important somehow\"\nmsgstr \"Je pense que la Tombe de Tabby est importante d'une certaine manière\"\n\n#. Key:\tE9DA40684B9375A5F78D18A138C75174\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_2.Text\n#: /Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_2.Text\nmsgctxt \"Notes\"\nmsgid \"Teachy asked for a strangely unique device\"\nmsgstr \"Le Prof est en quête d'un dispositif étrangement unique\"\n\n#. Key:\tF109A1614B16565CC1846C8D0A46672E\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_1.Text\n#: /Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_1.Text\nmsgctxt \"Notes\"\nmsgid \"I promised Lory to bring her some books\"\nmsgstr \"J'ai promis à Lory de lui ramener quelques livres\"\n\n#. Key:\taway\n#. SourceLocation:\tSource/SOrb/UI/InGame/SoUIStationPanel.cpp:98\n#: Source/SOrb/UI/InGame/SoUIStationPanel.cpp:98\nmsgctxt \"StationNames\"\nmsgid \"World's End\"\nmsgstr \"La Fin du Monde\"\n\n#. Key:\tcrossroadcave\n#. SourceLocation:\tSource/SOrb/UI/InGame/SoUIStationPanel.cpp:94\n#: Source/SOrb/UI/InGame/SoUIStationPanel.cpp:94\nmsgctxt \"StationNames\"\nmsgid \"Crossroad Cave\"\nmsgstr \"Grotte du Croisement\"\n\n#. Key:\tlavatemple\n#. SourceLocation:\tSource/SOrb/UI/InGame/SoUIStationPanel.cpp:96\n#: Source/SOrb/UI/InGame/SoUIStationPanel.cpp:96\nmsgctxt \"StationNames\"\nmsgid \"Remnant Road\"\nmsgstr \"Ce qu'il reste de la Route\"\n\n#. Key:\toutpost\n#. SourceLocation:\tSource/SOrb/UI/InGame/SoUIStationPanel.cpp:95\n#: Source/SOrb/UI/InGame/SoUIStationPanel.cpp:95\nmsgctxt \"StationNames\"\nmsgid \"Obedient Outpost\"\nmsgstr \"Avant-Poste des Obédiences\"\n\n#. Key:\tstay\n#. SourceLocation:\tSource/SOrb/UI/InGame/SoUIStationPanel.cpp:99\n#: Source/SOrb/UI/InGame/SoUIStationPanel.cpp:99\nmsgctxt \"StationNames\"\nmsgid \"Stay\"\nmsgstr \"Rester\"\n\n#. Key:\twrackedWaters\n#. SourceLocation:\tSource/SOrb/UI/InGame/SoUIStationPanel.cpp:97\n#: Source/SOrb/UI/InGame/SoUIStationPanel.cpp:97\nmsgctxt \"StationNames\"\nmsgid \"Wracked Waters\"\nmsgstr \"En Eaux Troubles\"\n\n"
  },
  {
    "path": "Content/Localization/Warriorb/hu/Warriorb.po",
    "content": "﻿# Warriorb Hungarian translation.\n# Copyright 1998-2019 Epic Games, Inc. All Rights Reserved.\n# \nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: Warriorb\\n\"\n\"POT-Creation-Date: 2020-10-07 08:12\\n\"\n\"PO-Revision-Date: 2020-10-07 08:12\\n\"\n\"Language-Team: \\n\"\n\"Language: hu\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Plural-Forms: nplurals=2; plural=(n != 1);\\n\"\n\n#. Key:\t78A72CB345FCC7ECDCFD8181471D78D8\n#. SourceLocation:\t/Game/SO/GUI/UI_Credits.UI_Credits_C:WidgetTree.CreditsText.Text\n#: /Game/SO/GUI/UI_Credits.UI_Credits_C:WidgetTree.CreditsText.Text\nmsgid \"<T>-- Not Yet Team --</>\\r\\n\\r\\n\\r\\nAnna Molnár\\r\\n<R>2D art, Environment Design</>\\r\\n\\r\\n\\r\\nCsaba Molnár\\r\\n<R>Code, Design</>\\r\\n\\r\\n\\r\\nDaniel Butum\\r\\n<R>Code</>\\r\\n\\r\\n\\r\\nGéza Molnár\\r\\n<R>3D art, Design</>\\r\\n\\r\\n\\r\\nRichárd Ráski\\r\\n<R>Sound Design</>\\r\\n\\r\\n\\r\\n\\r\\n<T>-- Music --</>\\r\\n\\r\\nBenjámin Kuli\\r\\n\\r\\n\\r\\nGisula\\r\\n\\r\\n\\r\\n\\r\\n<T>-- Voice Over --</>\\r\\n\\r\\n\\r\\nPeter Luzsi - @peterluzsi\\r\\n<R>WarriOrb, Gatekeeper, Ghost Armor, Principal</>\\r\\n\\r\\n\\r\\nBrent Miller\\r\\n<R>WarriOrb - Trailer</>\\r\\n\\r\\n\\r\\nPierce Riola\\r\\n<R>Wizard, Gnory</>\\r\\n\\r\\n\\r\\nEir Causey\\r\\n<R>Raven, Teachy, Ghost Dwarf, Unknown Wizard, Fishy</>\\r\\n\\r\\n\\r\\nJack Broadbent\\r\\n<R>Monk, Flybug</>\\r\\n\\r\\n\\r\\nEmil Hagg\\r\\n<R>Supper Dwarf, Kobold Chef, Fallen Druid, Dwarven Statue</>\\r\\n\\r\\n\\r\\nErick Nita\\r\\n<R>Golem Maker, Armour Wrath</>\\r\\n\\r\\n\\r\\nAlain Vega\\r\\n<R>Merch Ant</>\\r\\n\\r\\n\\r\\nAngela Tran\\r\\n<R>Lillian, Pipe Walker</>\\r\\n\\r\\n\\r\\nBrittany Ann Phillips\\r\\n<R>Lory</>\\r\\n\\r\\n\\r\\nAurore Gautheur\\r\\n<R>Fountain, Shade</>\\r\\n\\r\\n\\r\\nAlexander Blairlex\\r\\n<R>Primitive Fishy, Ghost Helmet</>\\r\\n\\r\\n\\r\\nSophie Ryder\\r\\n<R>Shadesphere</>\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n<T>-- Partners --</>\\r\\n\\r\\n\\r\\nMaple Whispering\\r\\n<R>Chineese localization</>\\r\\n<R>Publisher - China, PC</>\\r\\n\\r\\n\\r\\nNovy Unlimited\\r\\n<R>PR and Marketing</>\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n<T>-- Localization --</>\\r\\n\\r\\n\\r\\nVera Liscovschi\\r\\n<R>Russian</>\\r\\n\\r\\n\\r\\nJay Johnstone\\r\\n<R>Spanish</>\\r\\n\\r\\n\\r\\nBertin William\\r\\n<R>French</>\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n<T>-- Testers --</>\\r\\n\\r\\n\\r\\nSaleymander\\r\\n\\r\\n\\r\\nHitch\\r\\n\\r\\n\\r\\nMrCalculated\\r\\n\\r\\n\\r\\n<img id=\\\"Rainbow\\\"/>Scorpion253<img id=\\\"Rainbow\\\"/>\\r\\n\\r\\n\\r\\nmoses\\r\\n\\r\\n\\r\\nNinjin42\\r\\n\\r\\n\\r\\nKonstantinos Xenitidis\\r\\n\\r\\n\\r\\nPhyronnaz\\r\\n\\r\\n\\r\\nArthur\\r\\n\\r\\n\\r\\nMaster1G\\r\\n\\r\\n\\r\\nDávid Bartók\\r\\n\\r\\n\\r\\nLiDuGaming\\r\\n\\r\\n\\r\\nClaudiu Coman\\r\\n\\r\\n\\r\\nÁron Ürögdi\\r\\n\\r\\n\\r\\nDukenukemboi\\r\\n\\r\\n\\r\\nBart Cools\\r\\n\\r\\n\\r\\nGlenn De Jonghe\\r\\n\\r\\n\\r\\nDomonkos Péter Madarász\\r\\n\\r\\n\\r\\nGergő Gyarmati\\r\\n\\r\\n\\r\\nRéka Gyarmati\\r\\n\\r\\n\\r\\nKincső Petraskó\\r\\n\\r\\n\\r\\nGergő Petraskó\\r\\n\\r\\n\\r\\nDániel Garamvölgyi\\r\\n\\r\\n\\r\\nDanny \\\"GHelmet\\\" Cloutier\\r\\n\\r\\n\\r\\nAnna Boglárka Tóth\\r\\n\\r\\n\\r\\nBíborka Roxána Kubik\\r\\n\\r\\n\\r\\nVirág Miklós\\r\\n\\r\\n\\r\\nBenedek Marozsák\\r\\n\\r\\n\\r\\nDániel Marozsák\\r\\n\\r\\n\\r\\nGereon Bartel\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n<T>-- Prologue Speedrun Competition Winner --</>\\r\\n\\r\\n-7\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n<T>-- Special Thanks --</>\\r\\n\\r\\n\\r\\nMalazan Discord Server Community\\r\\n\\r\\n\\r\\n/r/metroidvenia Discord Server Community\\r\\n\\r\\n\\r\\nUnreal Slackers Discord Server Community\\r\\n\\r\\n\\r\\nIMGUR\\r\\n\\r\\n\\r\\nBíborka Roxána Kubik\\r\\n\\r\\n\\r\\nSergiu Crăiţoiu\\r\\n\\r\\n\\r\\nJuhász Ernő\\r\\n\\r\\n\\r\\nRacheal Smith\\r\\n\\r\\n\\r\\nRuxandra Seniuc\\r\\n\\r\\n\\r\\nthottee\\r\\n\\r\\n\\r\\nAndrew Pappas\\r\\n\\r\\n\\r\\nJonathan Lampel\\r\\n\\r\\n\\r\\nRichárd Németh\\r\\n\\r\\n\\r\\nAlex Gorcea\\r\\n\\r\\n\\r\\nNotRealVitor\\r\\n\\r\\n\\r\\nKinga Surján\\r\\n\\r\\n\\r\\nAnna Boglárka Tóth\\r\\n\\r\\n\\r\\nÉvi Fekete\\r\\n\\r\\n\\r\\nGergő Sielaf\\r\\n\\r\\n\\r\\n<img id=\\\"Rainbow\\\"/>Scorpion253<img id=\\\"Rainbow\\\"/>\\r\\n\\r\\n\\r\\nMainiac\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n<T>-- Technology --</>\\r\\n\\r\\n\\r\\n<R>WarriOrb uses the Unreal® Engine.</>\\r\\n<R>Unreal® is a trademark or registered trademark of Epic Games, Inc. in the United States of America and elsewhere</>\\r\\n\\r\\n<R>Unreal® Engine, Copyright 1998 – 2020, Epic Games, Inc. All rights reserved.</>\\r\\n\\r\\n\\r\\n\\r\\n<R>Made with FMOD Studio by Firelight Technologies Pty Ltd.</>\"\nmsgstr \"<T>-- Not Yet Team --</>\\n\\n\\nMolnár Anna\\n<R>2D art, Environment Design</>\\n\\n\\nMolnár Csaba\\n<R>Kód, Design</>\\n\\n\\nDaniel Butum\\n<R>Kód</>\\n\\n\\nMolnár Géza\\n<R>3D art, Design</>\\n\\n\\nRáski Richárd\\n<R>Sound Design</>\\n\\n\\n\\n<T>-- Zene --</>\\n\\nKuli Benjámin\\n\\n\\nGisula\\n\\n\\n\\n<T>-- Szinkronhangok --</>\\n\\n\\nLuzsi Péter - @peterluzsi\\n<R>WarriOrb, Kapuőr, Szellem Páncél, Megbízó</>\\n\\n\\nBrent Miller\\n<R>WarriOrb - Trailer</>\\n\\n\\nPierce Riola\\n<R>Varázsló, Gnory</>\\n\\n\\nEir Causey\\n<R>Holló, Tani, Szellem Törp, Ismeretlen Varázsló, Hali</>\\n\\n\\nJack Broadbent\\n<R>Szerzetes, Légy</>\\n\\n\\nEmil Hagg\\n<R>Leves Törp, Kobold Szakács, Bukott Druida, Törp Szobor</>\\n\\n\\nErick Nita\\n<R>Gólem Készítő, Harag Vért</>\\n\\n\\nAlain Vega\\n<R>Han, Gyakori Termékek Árusa</>\\n\\n\\nAngela Tran\\n<R>Lillian, Battyogó</>\\n\\n\\nBrittany Ann Phillips\\n<R>Lory</>\\n\\n\\nAurore Gautheur\\n<R>Szökőkút, Árny</>\\n\\n\\nAlexander Blairlex\\n<R>Primitív Hali, Szellem Sisak</>\\n\\n\\nSophie Ryder\\n<R>Árnygömb</>\\n\\n\\n\\n\\n<T>-- Partnerek --</>\\n\\n\\nMaple Whispering\\n<R>Chineese localization</>\\n<R>Publisher - China, PC</>\\n\\n\\nNovy Unlimited\\n<R>PR and Marketing</>\\n\\n\\n\\n\\n<T>-- Localization --</>\\n\\n\\nVera Liscovschi\\n<R>Orosz</>\\n\\n\\nJay Johnstone\\n<R>Spanyol</>\\n\\n\\nBertin William\\n<R>Francia</>\\n\\n\\n\\n\\n<T>-- Teszterek --</>\\n\\n\\nSaleymander\\n\\n\\nHitch\\n\\n\\nMrCalculated\\n\\n\\n<img id=\\\"Rainbow\\\"/>Scorpion253<img id=\\\"Rainbow\\\"/>\\n\\n\\nmoses\\n\\n\\nNinjin42\\n\\n\\nKonstantinos Xenitidis\\n\\n\\nPhyronnaz\\n\\n\\nArthur\\n\\n\\nMaster1G\\n\\n\\nBartók Dávid\\n\\n\\nLiDuGaming\\n\\n\\nClaudiu Coman\\n\\n\\nÜrögdi Áron\\n\\n\\nDukenukemboi\\n\\n\\nBart Cools\\n\\n\\nGlenn De Jonghe\\n\\n\\nMadarász Péter Domonkos\\n\\n\\nGyarmati Gergő\\n\\n\\nGyarmati Réka\\n\\n\\nPetraskó Kincső\\n\\n\\nPetraskó Gergő\\n\\n\\nGaramvölgyi Dániel\\n\\n\\nDanny \\\"GHelmet\\\" Cloutier\\n\\n\\nTóth Boglárka Anna\\n\\n\\nKubik Roxána Bíborka\\n\\n\\nMiklós Virág\\n\\n\\nMarozsák Benedek\\n\\n\\nMarozsák Dániel\\n\\n\\nGereon Bartel\\n\\n\\n\\n\\n<T>-- Prologue Speedrun Competition Winner --</>\\n\\n-7\\n\\n\\n\\n\\n<T>-- Külön köszönet --</>\\n\\n\\nMalazan Discord Server Community\\n\\n\\n/r/metroidvenia Discord Server Community\\n\\n\\nUnreal Slackers Discord Server Community\\n\\n\\nIMGUR\\n\\n\\nKubik Roxána Bíborka\\n\\n\\nSergiu Crăiţoiu\\n\\n\\nJuhász Ernő\\n\\n\\nRacheal Smith\\n\\n\\nRuxandra Seniuc\\n\\n\\nthottee\\n\\n\\nAndrew Pappas\\n\\n\\nJonathan Lampel\\n\\n\\nNémeth Richárd\\n\\n\\nAlex Gorcea\\n\\n\\nNotRealVitor\\n\\n\\nSurján Kinga\\n\\n\\nTóth Boglárka Anna\\n\\n\\nFekete Évi\\n\\n\\nSielaf Gergő\\n\\n\\n<img id=\\\"Rainbow\\\"/>Scorpion253<img id=\\\"Rainbow\\\"/>\\n\\n\\nMainiac\\n\\n\\n\\n\\n<T>-- Technology --</>\\n\\n\\n<R>WarriOrb uses the Unreal® Engine.</>\\n<R>Unreal® is a trademark or registered trademark of Epic Games, Inc. in the United States of America and elsewhere</>\\n\\n<R>Unreal® Engine, Copyright 1998 – 2020, Epic Games, Inc. All rights reserved.</>\\n\\n\\n\\n<R>Made with FMOD Studio by Firelight Technologies Pty Ltd.</>\"\n\n#. Key:\tAxeSpecial_name\n#. SourceLocation:\t/Game/SO/CharacterStrikes/AxeSpecial.AxeSpecial.StrikeName\n#: /Game/SO/CharacterStrikes/AxeSpecial.AxeSpecial.StrikeName\nmsgctxt \"CharacterStrike\"\nmsgid \"Throw\"\nmsgstr \"Fejszedobás\"\n\n#. Key:\tDemonSwordSpecial_name\n#. SourceLocation:\t/Game/SO/CharacterStrikes/DemonSwordSpecial.DemonSwordSpecial.StrikeName\n#: /Game/SO/CharacterStrikes/DemonSwordSpecial.DemonSwordSpecial.StrikeName\nmsgctxt \"CharacterStrike\"\nmsgid \"Downstrike\"\nmsgstr \"Lecsapás\"\n\n#. Key:\tDualBladeSpecial_name\n#. SourceLocation:\t/Game/SO/CharacterStrikes/DualBladeSpecial.DualBladeSpecial.StrikeName\n#: /Game/SO/CharacterStrikes/DualBladeSpecial.DualBladeSpecial.StrikeName\nmsgctxt \"CharacterStrike\"\nmsgid \"Backslash\"\nmsgstr \"Hátravetődés\"\n\n#. Key:\tLeafMaceSpecial_name\n#. SourceLocation:\t/Game/SO/CharacterStrikes/LeafMaceSpecial.LeafMaceSpecial.StrikeName\n#: /Game/SO/CharacterStrikes/LeafMaceSpecial.LeafMaceSpecial.StrikeName\nmsgctxt \"CharacterStrike\"\nmsgid \"Crushing Blow\"\nmsgstr \"Letaglózó Csapás\"\n\n#. Key:\tSabreSpecial_name\n#. SourceLocation:\t/Game/SO/CharacterStrikes/SabreSpecial.SabreSpecial.StrikeName\n#: /Game/SO/CharacterStrikes/SabreSpecial.SabreSpecial.StrikeName\nmsgctxt \"CharacterStrike\"\nmsgid \"Floating Strikes\"\nmsgstr \"Lebegő Csapás\"\n\n#. Key:\tSwordSpecialAirStrike_name\n#. SourceLocation:\t/Game/SO/CharacterStrikes/SwordSpecialAirStrike.SwordSpecialAirStrike.StrikeName\n#: /Game/SO/CharacterStrikes/SwordSpecialAirStrike.SwordSpecialAirStrike.StrikeName\nmsgctxt \"CharacterStrike\"\nmsgid \"Air Strike\"\nmsgstr \"Ugró Csapás\"\n\n#. Key:\tBPEftAttackSpeedMultiplier_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/BPEftAttackSpeedMultiplier.Default__BPEftAttackSpeedMultiplier_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/BPEftAttackSpeedMultiplier.Default__BPEftAttackSpeedMultiplier_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Quick Hands\"\nmsgstr \"Gyors kéz\"\n\n#. Key:\tBPEftBootTransmutation_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/BPEftBootTransmutation.Default__BPEftBootTransmutation_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/BPEftBootTransmutation.Default__BPEftBootTransmutation_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Protective Transmutation\"\nmsgstr \"Védelmező Átalakítás\"\n\n#. Key:\tBPEftBounce_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftBounce.Default__BPEftBounce_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftBounce.Default__BPEftBounce_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Charged Bounce\"\nmsgstr \"Villám Pattanás\"\n\n#. Key:\tBPEftCooldownReducePassive02_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/BPEftCooldownReducePassive02.Default__BPEftCooldownReducePassive02_C.DisplayName\n#. Key:\tBPEftCooldownReduce_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/BPEftCooldownReduce.Default__BPEftCooldownReduce_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/BPEftCooldownReduce.Default__BPEftCooldownReduce_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/BPEftCooldownReducePassive02.Default__BPEftCooldownReducePassive02_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Restlessness\"\nmsgstr \"Éberség\"\n\n#. Key:\tBPEftCriticalChanceBoost10_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/BPEftCriticalChanceBoost10.Default__BPEftCriticalChanceBoost10_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/BPEftCriticalChanceBoost10.Default__BPEftCriticalChanceBoost10_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Critical Chance\"\nmsgstr \"Kritikus ütés\"\n\n#. Key:\tBPEftDamageReflection_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/BPEftDamageReflection.Default__BPEftDamageReflection_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/BPEftDamageReflection.Default__BPEftDamageReflection_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Sparks of Vengeance\"\nmsgstr \"A Bosszú Szikrái\"\n\n#. Key:\tBPEftDmgModifier_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftDmgModifier.Default__BPEftDmgModifier_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftDmgModifier.Default__BPEftDmgModifier_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Perfect Hands\"\nmsgstr \"Biztos Kéz\"\n\n#. Key:\tBPEftHeal3_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/BPEftHeal3.Default__BPEftHeal3_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/BPEftHeal3.Default__BPEftHeal3_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Heal\"\nmsgstr \"Gyógyítás\"\n\n#. Key:\tBPEftLifeLeech5_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/BPEftLifeLeech5.Default__BPEftLifeLeech5_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/BPEftLifeLeech5.Default__BPEftLifeLeech5_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Life Leech\"\nmsgstr \"Élet Lopás\"\n\n#. Key:\tBPEftMagicMissle_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftMagicMissle.Default__BPEftMagicMissle_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftMagicMissle.Default__BPEftMagicMissle_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Magic Missile\"\nmsgstr \"Mágikus Lövedék\"\n\n#. Key:\tBPEftMassMagicMissle_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftMassMagicMissle.Default__BPEftMassMagicMissle_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftMassMagicMissle.Default__BPEftMassMagicMissle_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Magic Missiles\"\nmsgstr \"Mágikus Lövedék\"\n\n#. Key:\tBPEftMassSlow_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftMassSlow.Default__BPEftMassSlow_C.DisplayName\n#. Key:\tBPEftSlow_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/BPEftSlow.Default__BPEftSlow_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/BPEftSlow.Default__BPEftSlow_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftMassSlow.Default__BPEftMassSlow_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Slow\"\nmsgstr \"Lassítás\"\n\n#. Key:\tBPEftMeteorShower_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftMeteorShower.Default__BPEftMeteorShower_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftMeteorShower.Default__BPEftMeteorShower_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Meteor Shower\"\nmsgstr \"Meteor Eső\"\n\n#. Key:\tBPEftRegainSpellPassive25_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/BPEftRegainSpellPassive25.Default__BPEftRegainSpellPassive25_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/BPEftRegainSpellPassive25.Default__BPEftRegainSpellPassive25_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Arcane Luck\"\nmsgstr \"Misztikus Szerencse\"\n\n#. Key:\tBPEftRegainSpells_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/BPEftRegainSpells.Default__BPEftRegainSpells_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/BPEftRegainSpells.Default__BPEftRegainSpells_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Restoration\"\nmsgstr \"Feltöltődés\"\n\n#. Key:\tBPEftResModifierMagicalStrong_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftResModifierMagicalStrong.Default__BPEftResModifierMagicalStrong_C.DisplayName\n#. Key:\tBPEftResModifierMagical_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftResModifierMagical.Default__BPEftResModifierMagical_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftResModifierMagical.Default__BPEftResModifierMagical_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftResModifierMagicalStrong.Default__BPEftResModifierMagicalStrong_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Wardskin\"\nmsgstr \"Páncélbőr\"\n\n#. Key:\tBPEftResModifierPhysical_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftResModifierPhysical.Default__BPEftResModifierPhysical_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftResModifierPhysical.Default__BPEftResModifierPhysical_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Stoneskin\"\nmsgstr \"Kőbőr\"\n\n#. Key:\tBPEftSecondChance_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/BPEftSecondChance.Default__BPEftSecondChance_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/BPEftSecondChance.Default__BPEftSecondChance_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Second Chance\"\nmsgstr \"Második Esély\"\n\n#. Key:\tBPEftSpellFire0_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftSpellFire0.Default__BPEftSpellFire0_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftSpellFire0.Default__BPEftSpellFire0_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Firestrike\"\nmsgstr \"Tűzcsapás\"\n\n#. Key:\tBPEftSpellLightningWalk_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftSpellLightningWalk.Default__BPEftSpellLightningWalk_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftSpellLightningWalk.Default__BPEftSpellLightningWalk_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Shockwalk\"\nmsgstr \"Gömbvillám\"\n\n#. Key:\tBPEftSpellShadowWalk_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftSpellShadowWalk.Default__BPEftSpellShadowWalk_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftSpellShadowWalk.Default__BPEftSpellShadowWalk_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Shadewalk\"\nmsgstr \"Árnyjárás\"\n\n#. Key:\tBPEftSpellShield_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftSpellShield.Default__BPEftSpellShield_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftSpellShield.Default__BPEftSpellShield_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Shield\"\nmsgstr \"Pajzs\"\n\n#. Key:\tBPEftSpellSoulKeeper_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftSpellSoulKeeper.Default__BPEftSpellSoulKeeper_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftSpellSoulKeeper.Default__BPEftSpellSoulKeeper_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Soulbind\"\nmsgstr \"Lélekkötelék\"\n\n#. Key:\tBPEftStun_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/BPEftStun.Default__BPEftStun_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/BPEftStun.Default__BPEftStun_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Stun\"\nmsgstr \"Kábít\"\n\n#. Key:\tBPEftStunPassive10_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/BPEftStunPassive10.Default__BPEftStunPassive10_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/BPEftStunPassive10.Default__BPEftStunPassive10_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Stun Chance\"\nmsgstr \"Kábítás Esély\"\n\n#. Key:\tBPEftSwap_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftSwap.Default__BPEftSwap_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftSwap.Default__BPEftSwap_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Swap\"\nmsgstr \"Csere\"\n\n#. Key:\tBPEftTempHPMagical_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftTempHPMagical.Default__BPEftTempHPMagical_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftTempHPMagical.Default__BPEftTempHPMagical_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Magical Protection\"\nmsgstr \"Mágikus Védelem\"\n\n#. Key:\tBPEftTempHPPhysical_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftTempHPPhysical.Default__BPEftTempHPPhysical_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftTempHPPhysical.Default__BPEftTempHPPhysical_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Physical Protection\"\nmsgstr \"Fizikális Védelem\"\n\n#. Key:\tBPEftWeaponFlamesTimeBased_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/BPEftWeaponFlamesTimeBased.Default__BPEftWeaponFlamesTimeBased_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/BPEftWeaponFlamesTimeBased.Default__BPEftWeaponFlamesTimeBased_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Greenflame\"\nmsgstr \"Zöldláng\"\n\n#. Key:\tBPEftWorthy_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/BPEftWorthy.Default__BPEftWorthy_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/BPEftWorthy.Default__BPEftWorthy_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Worthy\"\nmsgstr \"Méltó\"\n\n#. Key:\t1E42901841F4C7CEF39536A762076EDF\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.UI_EndScreen_SaveCreatures_C:WidgetTree.TBC1.Text\n#. Key:\t5D04206A499A8B42AF77BAA8BC9B4B8B\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.UI_EndScreen_SaveCreatures_C:WidgetTree.TBC0.Text\n#. Key:\tB0EEBB754110D2821640BE990002AC36\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.UI_EndScreen_SaveCreatures_C:WidgetTree.TBC2.Text\n#. Key:\tD75DCE214B56BA6FD9A58F9EEA9291A5\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.UI_EndScreen_C:WidgetTree.TBC0.Text\n#: /Game/SO/GUI/InGame/UI_EndScreen.UI_EndScreen_C:WidgetTree.TBC0.Text\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.UI_EndScreen_SaveCreatures_C:WidgetTree.TBC0.Text\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.UI_EndScreen_SaveCreatures_C:WidgetTree.TBC1.Text\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.UI_EndScreen_SaveCreatures_C:WidgetTree.TBC2.Text\nmsgctxt \"EndScreen\"\nmsgid \"With his quest completed Monk decided to look for another activity. He thought: <Quote>‘If I could resist madness, others should be able to do the same.’</> And so he opened a monastery to share his mental training techniques with anyone willing to save its sanity.\"\nmsgstr \"Szerzetes küldetése sikerrel zárult, de az élet ettől függetlenül konokul haladt tovább. Egy gondolat nem hagyott neki nyugtot:\\n<Quote>- Ha én képes vagyok ellenállni a Fertőzésnek, akkor másoknak is menni fog.</> Úgy döntött, monostort alapít, ahol megosztja mentális képzésének fortélyait azokkal, akik szeretnék megőrizni vagy visszanyerni ép elméjüket.\\\"\"\n\n#. Key:\t7279EA4741D3DAC5AE92EB99AB851ED9\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.UI_EndScreen_SaveCreatures_C:WidgetTree.TBD0.Text\n#. Key:\t77E809914A65796364FE94B8C2361FD7\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.UI_EndScreen_SaveCreatures_C:WidgetTree.TBD2.Text\n#. Key:\t9C1B477D4582ABAEDC90FCB3AC6737E7\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.UI_EndScreen_C:WidgetTree.TBD0.Text\n#. Key:\tE98C3FDD453FF80CA8EBBE94459A5CAF\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.UI_EndScreen_SaveCreatures_C:WidgetTree.TBD1.Text\n#: /Game/SO/GUI/InGame/UI_EndScreen.UI_EndScreen_C:WidgetTree.TBD0.Text\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.UI_EndScreen_SaveCreatures_C:WidgetTree.TBD0.Text\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.UI_EndScreen_SaveCreatures_C:WidgetTree.TBD1.Text\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.UI_EndScreen_SaveCreatures_C:WidgetTree.TBD2.Text\nmsgctxt \"EndScreen\"\nmsgid \"<Size42>Separating the World also changed something in the Ruined Realm. The wind turned and even Ruin stopped for a moment.</>\"\nmsgstr \"<Size42>A Világok szétválasztásával a Fertőzött Földön is megváltozott valami. Megfordult a szél, egy pillanatra mintha a Fertőzés is megtorpant volna.</>\"\n\n#. Key:\t9B476D3D4A603658683498B09968F8AA\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.UI_EndScreen_C:WidgetTree.TBB0.Text\n#: /Game/SO/GUI/InGame/UI_EndScreen.UI_EndScreen_C:WidgetTree.TBB0.Text\nmsgctxt \"EndScreen\"\nmsgid \"When he heard about the lost Kobold tribe he got a bit excited.<Quote>‘Kobolds reserved the ancient knowledge in their rituals’</> he said. <Quote>‘If there is something we can do with Ruin it must be connected to the rituals. I’ll go with you.’</>\"\nmsgstr \"Az eltűnt kobold törzs híre egészen fellelkesítette.\\n<Quote>- A koboldok sokat megőriztek az Ősi tudásból szertartásaikban -</> magyarázta. <Quote>- Ha van valami, amit tehetünk a Fertőzés ellen, akkor ez lesz a kulcs. Veletek megyek.</>\"\n\n#. Key:\tDF7F9F754F4FC9CB19DF92AFCE96C5C1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.UI_EndScreen_SaveCreatures_C:WidgetTree.TBA2.Text\n#. Key:\tE8401550448E14DD70717EB7EED0582B\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.UI_EndScreen_SaveCreatures_C:WidgetTree.TBA1.Text\n#. Key:\tUI_EndScreen_entry_0_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(0).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(0).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.UI_EndScreen_SaveCreatures_C:WidgetTree.TBA1.Text\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.UI_EndScreen_SaveCreatures_C:WidgetTree.TBA2.Text\nmsgctxt \"EndScreen\"\nmsgid \"The people soon forgot about the threat, some of them argued that Ruin ever existed.\"\nmsgstr \"A pánikhangulat hamar eloszlott, sokan vitatták, hogy egyáltalán bármi alapja lett volna a rémhíreknek.\"\n\n#. Key:\tE9F6E1064D5B2046DF1DEDA386012E2D\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.UI_EndScreen_C:WidgetTree.TBB2.Text\n#. Key:\tUI_EndScreen_entry_6_text_2\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(6).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(6).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.UI_EndScreen_C:WidgetTree.TBB2.Text\nmsgctxt \"EndScreen\"\nmsgid \"He opened a monastery to share his mental training techniques with anyone willing to save its sanity.\"\nmsgstr \"Úgy döntött, monostort alapít, ahol megosztja mentális képzésének fortélyait azokkal, akik szeretnék megőrizni vagy visszanyerni ép elméjüket.\"\n\n#. Key:\tF0EAD93B44D8D7AEF306EAB75D83FB37\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.UI_EndScreen_C:WidgetTree.TBB1.Text\n#: /Game/SO/GUI/InGame/UI_EndScreen.UI_EndScreen_C:WidgetTree.TBB1.Text\nmsgctxt \"EndScreen\"\nmsgid \"<Quote>‘If I could resist madness, others should be able to do the same’</> - he thought.\"\nmsgstr \"Egy gondolat nem hagyott neki nyugtot:<Quote>- Ha én képes vagyok ellenállni a Fertőzésnek, akkor másoknak is menni fog.</>\"\n\n#. Key:\tUI_EndScreen_entry_0_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(0).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(0).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Once the Boundaries of Worlds were sealed, Ruin could do no harm to the Human Realm again.\"\nmsgstr \"Miután a Világokat összekötő Határ lezárult, a Fertőzés nem jelentett többé fenyegetést az Emberek Világára.\"\n\n#. Key:\tUI_EndScreen_entry_10_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(10).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(10).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Hearing these news made the Chef really excited.\"\nmsgstr \"A szakács rendkívül izgatott lett a hír hallatán.\"\n\n#. Key:\tUI_EndScreen_entry_10_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(10).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(10).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"<Quote>'Could there be other survivors of my tribe?'</>\"\nmsgstr \"<Quote>'Lehetséges, hogy vannak még túlélők a törzsemből?'</>\"\n\n#. Key:\tUI_EndScreen_entry_10_text_2\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(10).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(10).EndingLogic.Texts(2).Texts\nmsgctxt \"EndScreen\"\nmsgid \"He decided to leave his kitchen and search for his lost relatives.\"\nmsgstr \"Úgy döntött, visszatér a Fertőzött Földre, és felkutatja elveszett rokonait.\"\n\n#. Key:\tUI_EndScreen_entry_11_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(11).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(11).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"No one knows how he could possibly know about the soup, but Supper Dwarf also appeared to taste the food.\"\nmsgstr \"Örök rejtély, hogy Leves Törp honnan szerzett tudomást az ingyen ebéd lehetőségéről, de az tény, hogy már a terítés befejezte előtt felbukkant.\"\n\n#. Key:\tUI_EndScreen_entry_11_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(11).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(11).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"When he heard that the chef is leaving he offered his help with the trains.\"\nmsgstr \"Szakács elhatározását hallva felajánlotta segítségét a vonatokkal.\"\n\n#. Key:\tUI_EndScreen_entry_11_text_2\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(11).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(11).EndingLogic.Texts(2).Texts\nmsgctxt \"EndScreen\"\nmsgid \"<Quote>‘And I would also like to check what do they eat for supper.’</> he said. <Quote>‘I’m going with you.’</>\"\nmsgstr \"<Quote>- Valamint érdekelne, náluk mi lesz ebédre</> - mondta. <Quote>- Veled megyek.</>\\\"\"\n\n#. Key:\tUI_EndScreen_entry_12_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(12).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(12).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"On their way they stopped by the Golem Maker.\"\nmsgstr \"Útközben összefutottak a Gólem Készítővel.\"\n\n#. Key:\tUI_EndScreen_entry_12_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(12).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(12).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"He was just sitting and staring at nothing.\"\nmsgstr \"A csontváz némán ücsörgött, üres szemgödreivel a semmibe bámulva.\"\n\n#. Key:\tUI_EndScreen_entry_12_text_2\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(12).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(12).EndingLogic.Texts(2).Texts\nmsgctxt \"EndScreen\"\nmsgid \"It was still hard for the Maker to accept that all his work was for nothing.\"\nmsgstr \"Nem tudta túltenni magát azon, hogy minden munkája hiábavaló volt.\"\n\n#. Key:\tUI_EndScreen_entry_12_text_3\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(12).EndingLogic.Texts(3).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(12).EndingLogic.Texts(3).Texts\nmsgctxt \"EndScreen\"\nmsgid \"At least he stopped creating mindless stone golems.\"\nmsgstr \"Egyik Gólemével sem jutott semmire.\"\n\n#. Key:\tUI_EndScreen_entry_13_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(13).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(13).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"When he heard about the lost Kobold tribe he got a bit excited.\"\nmsgstr \"Az eltűnt kobold törzs híre egészen fellelkesítette.\"\n\n#. Key:\tUI_EndScreen_entry_13_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(13).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(13).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"<Quote>‘Kobolds reserved the ancient knowledge in their rituals’</> he said.\"\nmsgstr \"<Quote>- A koboldok sokat megőriztek az Ősi tudásból szertartásaikban</> - mondta a Gólem Készítő.\"\n\n#. Key:\tUI_EndScreen_entry_13_text_2\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(13).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(13).EndingLogic.Texts(2).Texts\nmsgctxt \"EndScreen\"\nmsgid \"<Quote>‘If there is something we can do with Ruin it must be connected to the rituals. I’ll go with you.’</>\"\nmsgstr \"<Quote>- Ha van valami, amit tehetünk a Fertőzés ellen, akkor ez lesz a kulcs. Én is megyek.</>\"\n\n#. Key:\tUI_EndScreen_entry_14_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(14).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(14).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"However there are things which never change.\"\nmsgstr \"Vannak dolgok, amik soha nem változnak.\"\n\n#. Key:\tUI_EndScreen_entry_14_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(14).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(14).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"After days of arguing on who undermined whose business Lory and Gnory separated once again.\"\nmsgstr \"Többnapos heves eszmecsere után arról, hogy ki ásta alá kinek az üzletét, Lory és Gnory útjai ismét külön váltak.\"\n\n#. Key:\tUI_EndScreen_entry_15_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(15).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(15).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"While they were arguing Fishy decided to leave Gnory and set out on his own.\"\nmsgstr \"Hali nem várta meg a vita végét, úgy döntött, elhagyja Gnoryt, és a saját feje után megy.\"\n\n#. Key:\tUI_EndScreen_entry_15_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(15).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(15).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"He had no idea where he was going.\"\nmsgstr \"Bár azt maga sem tudta, pontosan hova.\"\n\n#. Key:\tUI_EndScreen_entry_16_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(16).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(16).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"After weeks of walking alone, he heard a faint excited voice:\"\nmsgstr \"Már hetek óta bóklászott magányosan, mikor egy halk, izgatott hang ütötte meg a fülét:\"\n\n#. Key:\tUI_EndScreen_entry_1_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(1).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(1).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"The Mage Council didn’t believe a single word Lillian or Scholar told them about the events.\"\nmsgstr \"Lillian és Tudós beszámolt a történtekről a Mágus Tanácsnak, de komoly bizonyíték híján egy árva szavukat sem hitték el.\"\n\n#. Key:\tUI_EndScreen_entry_1_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(1).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(1).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"They claimed that Wizard died in an unfortunate accident and his device could never actually work anyway.\"\nmsgstr \"A hivatalos álláspont szerint a Varázsló egy sajnálatos labori baleset áldozata lett, a Szerkezet pedig, amelyen titokban dolgozott, egyébként sem működött volna.\"\n\n#. Key:\tUI_EndScreen_entry_2_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(2).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(2).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Although Lillian inherited her father’s castle she was sent to an Orphanage until she came into age to live on her own.\"\nmsgstr \"A Varázsló kastélyát Lillian örökölte, azzal a kitétellel, hogy csak felnőtt korában veheti birtokba. Addig az időig otthonának egy árvaházat jelöltek ki.\"\n\n#. Key:\tUI_EndScreen_entry_2_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(2).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(2).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Scholar was upset by Lillian’s decision on letting the Ruined Realm fall but he promised Lillian that he will make the Wizard’s Council let Lillian live in his estate.\"\nmsgstr \"Tudós neheztelt Lillianra, amiért veszni hagyta a Fertőzött Földet, de ettől függetlenül igyekezett kiharcolni, hogy a kislány hamarabb visszaköltözhessen igazi otthonába.\"\n\n#. Key:\tUI_EndScreen_entry_3_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(3).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(3).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Lillian didn't let the unfortunate events to overcome her. She stopped Ruin even if no one believed her.\"\nmsgstr \"Lillian nem hagyta, hogy a tragikus események maguk alá gyűrjék. Sikerült megállítania a Fertőzést, akkor is, ha ezt a saját világa nem ismerte el.\"\n\n#. Key:\tUI_EndScreen_entry_3_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(3).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(3).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"She also knew that the Ruined Realm still had at least a half century before it was totally destroyed so she decided to keep on looking for a way to save it.\"\nmsgstr \"Úgy vélte, a Fertőzött Földnek még mindig van legalább ötven éve a teljes megsemmisülés előtt. Talán még van remény arra, hogy megmentsen belőle valamit.\"\n\n#. Key:\tUI_EndScreen_entry_3_text_2\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(3).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(3).EndingLogic.Texts(2).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Now that her own Realm was safe she could focus on the other Realms.\"\nmsgstr \"Most, hogy a saját Világa biztonságáról gondoskodott, nyugodtan foglalkozhatott a többi Világgal.\"\n\n#. Key:\tUI_EndScreen_entry_4_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(4).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(4).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"<Size42>Separating the World also changed something in the Ruined Realm.</>\"\nmsgstr \"<Size42>A Világok szétválasztásával a Fertőzött Földön is megváltozott valami.</>\"\n\n#. Key:\tUI_EndScreen_entry_4_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(4).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(4).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"<Size42>The wind turned and even Ruin stopped for a moment.</>\"\nmsgstr \"<Size42>Megfordult a szél, egy pillanatra mintha a Fertőzés is megtorpant volna.</>\"\n\n#. Key:\tUI_EndScreen_entry_5_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(5).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(5).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"When it was certain that no one will be saved from Ruin, as a last desperate act Gate Keeper tried to open a Gate to the Human Realm himself.\"\nmsgstr \"Mikor biztossá vált, hogy senkit nem fognak kimenteni, a Kapuőr megkísérelt saját maga Átjárót nyitni az Emberek Világába.\"\n\n#. Key:\tUI_EndScreen_entry_5_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(5).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(5).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"A portal opened and swallowed the Keeper.\"\nmsgstr \"A Kapu néhány másodpercre csakugyan megjelent, és magába szippantotta a Gólemet.\"\n\n#. Key:\tUI_EndScreen_entry_5_text_2\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(5).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(5).EndingLogic.Texts(2).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Some believed he survived but no one ever met him again.\"\nmsgstr \"Néhányan úgy vélik, túlélte az utazást, de hogy hova került, az rejtély maradt.\"\n\n#. Key:\tUI_EndScreen_entry_6_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(6).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(6).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"With his quest completed Monk decided to look for another activity.\"\nmsgstr \"Szerzetes küldetése sikerrel zárult, de az élet ettől függetlenül konokul haladt tovább. Tudta, új feladatot kell találnia.\"\n\n#. Key:\tUI_EndScreen_entry_6_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(6).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(6).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"<Quote>‘If I could resist madness, shouldn't others be able to do the same?’</>- he wondered.\"\nmsgstr \"<Quote>- Ha én ellen tudok állni a Fertőzésnek, mások miért ne lennének képesek rá?</> - tűnődött.\"\n\n#. Key:\tUI_EndScreen_entry_7_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(7).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(7).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"To the surprise of many Teachy also joined Monk and soon he became his best student.\"\nmsgstr \"Meglepő módon Tani az elsők között jelentkezett Szerzetesnél, és rövidesen ő lett a legjobb tanítvány.\"\n\n#. Key:\tUI_EndScreen_entry_7_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(7).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(7).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"<Quote>‘To be honest I never actually wanted to be a teacher‘</> - said Teachy.\"\nmsgstr \"<Quote>- Az igazat megvallva</> - mondta Tani - <Quote>soha nem is akartam tanár lenni.</>\"\n\n#. Key:\tUI_EndScreen_entry_7_text_2\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(7).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(7).EndingLogic.Texts(2).Texts\nmsgctxt \"EndScreen\"\nmsgid \"<Quote>'I also knew that I was a bit mad and since for my insane mind training in a monastery looked like a crazy idea I immediately knew that in fact that's the most sane thing to do.’</>\"\nmsgstr \"<Quote>- Azzal is tisztában voltam, hogy egy kicsit őrült vagyok, és miután eszement elmém számára a monostori képzés a világ legnagyobb hülyeségének hangzott, azonnal tudtam, hogy valójában ez a legértelmesebb, amit tehetek.</>\"\n\n#. Key:\tUI_EndScreen_entry_8_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(8).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(8).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Losing his connection to his master, Raven had to think again about his purpose.\"\nmsgstr \"Miután gazdáját elvesztette, Hollónak újra kellett gondolnia céljait.\"\n\n#. Key:\tUI_EndScreen_entry_8_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(8).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(8).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"<Quote>‘I think therefore I am not a bird’</> - he said.\"\nmsgstr \"<Quote>- Gondolkodom, tehát nem vagyok madár</> - mondta.\"\n\n#. Key:\tUI_EndScreen_entry_8_text_2\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(8).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(8).EndingLogic.Texts(2).Texts\nmsgctxt \"EndScreen\"\nmsgid \"With his vast experience he couldn’t become the same thoughtless bird he once was.\"\nmsgstr \"Azzal a tudással és tapasztalattal, amit az évek során összegyűjtött, már képtelen volt egy közönséges madár életét élni.\"\n\n#. Key:\tUI_EndScreen_entry_8_text_3\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(8).EndingLogic.Texts(3).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(8).EndingLogic.Texts(3).Texts\nmsgctxt \"EndScreen\"\nmsgid \"He joined Monk’s monastery to teach philosophy.\"\nmsgstr \"Végül csatlakozott Szerzetes monostorához, mint filozófia tanár.\"\n\n#. Key:\tUI_EndScreen_entry_8_text_4\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(8).EndingLogic.Texts(4).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(8).EndingLogic.Texts(4).Texts\nmsgctxt \"EndScreen\"\nmsgid \"In his free hours he kept on studying the Ancient’s technology hoping that one day he will find a way back to Lillian.\"\nmsgstr \"A tanítás ideje nagy részét elvette, de mindig talált szabad órákat arra, hogy az Ősi technológiát tanulmányozza. Remélte, egy nap megtalálja a Lillian világába vezető utat.\"\n\n#. Key:\tUI_EndScreen_entry_9_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(9).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(9).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"When the soup was almost ready the Pipe Walkers smelled the flavour and they all gathered for a last dinner.\"\nmsgstr \"A készülő leves illata a konyhába csalogatta a Tó körül élő Battyogókat.\"\n\n#. Key:\tUI_EndScreen_entry_9_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(9).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(9).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"After lunch they started to talk.\"\nmsgstr \"Ebéd után hosszas beszélgetés vette kezdetét.\"\n\n#. Key:\tUI_EndScreen_entry_9_text_2\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(9).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(9).EndingLogic.Texts(2).Texts\nmsgctxt \"EndScreen\"\nmsgid \"One of the Pipe Walkers, who had been in many cages mentioned that she actually met some kobolds far away.\"\nmsgstr \"Az egyik Battyogó, aki vándor élete folyamán számos helyre rács-odálkozott, említette, hogy már találkozott koboldokkal is.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_0_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(0).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(0).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"By the time the furious crowd broke into the Wizard’s Castle the Device was completely destroyed.\"\nmsgstr \"Mire a felbőszült csőcselék betört a kastélyba, a Szerkezet már darabokban hevert.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_0_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(0).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(0).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Some left, others started to investigate the building hoping to find something which might stop Ruin.\"\nmsgstr \"Néhányan távoztak, mások nekiláttak átkutatni a kastélyt, hátha találnak valamit a Fertőzés ellen.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_10_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(10).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(10).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"<Quote>‘Kobolds reserved the ancient knowledge in their rituals’</> Golem Maker said. <Quote>‘If there is something we can do with Ruin it must be connected to the rituals. I’ll go with you.’</>\"\nmsgstr \"<Quote>- A koboldok sokat megőriztek az Ősi tudásból szertartásaikban</> - jegyezte meg Gólem Készítő. <Quote>- Ha van valami, amit tehetünk a Fertőzés ellen, akkor ez lesz a kulcs. Veletek megyek.</>\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_10_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(10).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(10).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Golem Maker was a huge help to Lillian with his knowledge on Golemology and it was not easy for Lillian to let him go.\"\nmsgstr \"A Készítő Gólemológiai ismeretei sokat segítettek Lilliannak, ezért nem volt könnyű az elválás.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_10_text_2\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(10).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(10).EndingLogic.Texts(2).Texts\nmsgctxt \"EndScreen\"\nmsgid \"<Quote>‘Have no fear!’</> Golem Maker said. <Quote>‘I will return with even more knowledge and we’ll stop Ruin once and for all.’</>\"\nmsgstr \"<Quote>- Egyet se félj!</> - mondta Gólem Készítő. <Quote>- Több ismeretet hozok majd vissza, mint amennyit elviszek. Meglátod, rájövünk még, hogyan állítsuk meg a Fertőzést.</>\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_11_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(11).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(11).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"After Kobold Chef left, Supper Dwarf had to take care of the kitchen.\"\nmsgstr \"Miután Szakács távozott, Leves Törp vette át a konyhát.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_11_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(11).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(11).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"It turned out that he is also really talented at making food.\"\nmsgstr \"Kisült, hogy maga is remekel a főzésben.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_11_text_2\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(11).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(11).EndingLogic.Texts(2).Texts\nmsgctxt \"EndScreen\"\nmsgid \"<Quote> ‘That is because I know exactly what the final result should be’</> he explained.\"\nmsgstr \"<Quote>- Azért, mert pontosan tudom, hogy milyennek kell lennie a végeredménynek</> - magyarázta.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_11_text_3\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(11).EndingLogic.Texts(3).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(11).EndingLogic.Texts(3).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Later he opened a restaurant which soon became really popular.\"\nmsgstr \"Később éttermet nyitott, ami pillanatok alatt népszerű lett.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_11_text_4\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(11).EndingLogic.Texts(4).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(11).EndingLogic.Texts(4).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Some say mostly because he hired Pipe Walkers to serve the meal and for marketing purposes.\"\nmsgstr \"Sokak szerint ebben jelentős szerepe volt a Battyogó személyzetnek, akiket Leves Törp kuktának, pincérnek és marketing célokra alkalmazott.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_12_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(12).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(12).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Monk decided to stay in the Ruined Realm.\"\nmsgstr \"Szerzetes úgy döntött, nem hagyja el a Fertőzött Földet.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_12_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(12).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(12).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"<Quote>‘Even if it was not enough I did all I could. I’m done.’</> he said.\"\nmsgstr \"<Quote>- Bár kudarcot vallottam, már mindent megtettem, ami tőlem tellett</> - mondta.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_12_text_2\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(12).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(12).EndingLogic.Texts(2).Texts\nmsgctxt \"EndScreen\"\nmsgid \"He sat down on a mountaintop and started meditating.\"\nmsgstr \"Azzal leült, és meditálni kezdett.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_13_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(13).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(13).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"A few weeks later he realized that even though he failed his quest he still should do something.\"\nmsgstr \"Néhány hétnyi szótlan ücsörgés után arra jutott, kudarc ide vagy oda, mégiscsak csinálhatna valamit.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_13_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(13).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(13).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"<Quote>‘Due to my training I can resist Ruin’</> he thought. <Quote>‘No one has ever seen what’s there where Ruin destroyed the lands. If I train harder I might be able to get closer to Ruin to see what it really is.’</>\"\nmsgstr \"<Quote>Szerzetesi képzésemnek köszönhetően ellen tudok állni a Fertőzésnek</> - gondolta. <Quote>- Senki nem látta még, mi van a Fertőzés szívében. Ha keményebben edzek, talán elég közel juthatok ahhoz, hogy rájöjjek, micsoda a Fertőzés valójában.</>\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_13_text_2\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(13).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(13).EndingLogic.Texts(2).Texts\nmsgctxt \"EndScreen\"\nmsgid \"He kept on practising and soon set out on a journey into the heart of Ruin to find answers to questions even he didn’t know.\"\nmsgstr \"Folytatta tehát elméje élesítését, majd felkerekedett, hogy válaszokat találjon azokra a kérdésekre, amelyeket eddig nem mert feltenni magának.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_14_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(14).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(14).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Lory and Gnory suddenly found themselves in a world full of possible customers.\"\nmsgstr \"Lory és Gnory hamar ráeszmélt, hogy az Ember Világ tele van potenciális vásárlóval.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_14_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(14).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(14).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Of course it didn’t mean they stopped arguing on who undermined whose business but finally they both had the chance to run a successful trading company.\"\nmsgstr \"Ez persze nem jelentette azt, hogy ne civakodtak volna tovább, de végre mindkettőjük számára lehetőség nyílt sikeres kereskedői karrier befutására.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_15_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(15).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(15).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Gnory specialized himself in selling medicine which were said to heal the sickness which was spreading as Ruin reached closer.\"\nmsgstr \"Gnory gyógyszereket árult, amelyek állítólag megvédtek a Fertőzéstől.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_15_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(15).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(15).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Lory specialized in medicine which were said to heal the sickness which was caused by the medicine of Gnory.\"\nmsgstr \"Ezzel szemben Lory olyan gyógyszernek nem minősülő gyógyhatású tablettákat forgalmazott, amik tényleg kigyógyítottak azokból a betegségekből, amiket a Gnory-féle gyógyszerek okoztak.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_16_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(16).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(16).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Lory’s herbaria worked out.\"\nmsgstr \"Lory patikája sikeres lett.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_16_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(16).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(16).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Soon she started to sell other medicine and healing devices as well.\"\nmsgstr \"Hamarosan egyéb gyógyszerek és gyógyászati eszközök is megjelentek a repertoárjában.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_17_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(17).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(17).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"As for Gnory, he decided to sell lots of different things in the City Prison which turned out to be his new home for a while.\"\nmsgstr \"Ami Gnory-t illeti, ő más jellegű termékek forgalmazásába kezdett, amik jól mentek új otthonában, a Városi Börtönben.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_18_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(18).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(18).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Fishy didn’t like the medicine business so he left Gnory.\"\nmsgstr \"Halinak nem tetszett a gyógyszer üzlet, ezért elhagyta Gnoryt.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_18_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(18).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(18).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"He joined Monk for a while to learn the mental training techniques which reserved Monk’s sanity.\"\nmsgstr \"Csatlakozott Szerzeteshez, hogy elsajátítsa azokat a képzési módszereket, amelyek megvédik az elmét a Fertőzéstől.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_18_text_2\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(18).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(18).EndingLogic.Texts(2).Texts\nmsgctxt \"EndScreen\"\nmsgid \"<Quote>‘Fishy think it is important’ </>he said.<Quote> ‘If Monk go to see Ruin, Fishy need to learn it.’</>\"\nmsgstr \"<Quote>- Hali azt mondja, ez fontos</> - jelentette ki. <Quote>- Ha Szerzetes elmegy, Halinak kell megtanulnia.</>\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_18_text_3\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(18).EndingLogic.Texts(3).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(18).EndingLogic.Texts(3).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Monk accepted Fishy as his apprentice and taught him all that was possible.\"\nmsgstr \"Szerzetes tiszteletét rögtön kivívta Hali elhatározása, és mindent tőle telhetőt megtett, hogy alaposan felkészítse.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_18_text_4\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(18).EndingLogic.Texts(4).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(18).EndingLogic.Texts(4).Texts\nmsgctxt \"EndScreen\"\nmsgid \"<Quote>‘Now is the time’</> Monk said one day. <Quote>’Go to the Human Realm and prepare the people.’</>\"\nmsgstr \"<Quote>- Eljött az idő</> - mondta Szerzetes egy nap. <Quote>- Térj vissza az Ember Világba, és készítsd fel őket!</>\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_19_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(19).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(19).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"On his way to the Human Realm Fishy heard a faint excited voice:\"\nmsgstr \"A visszaúton egyszer csak egy halk, izgatott hang ütötte meg Hali fülét:\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_19_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(19).EndingLogic.Texts(1).Texts\n#. Key:\tUI_EndScreen_entry_16_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(16).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(16).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(19).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"<Quote>‘Hey there! I’m fed up with microtransactions. Can I go with ya man?’</>\"\nmsgstr \"<Quote>- Hékás! Elegem van a mikrotranzakciókból! Leszünk spanok?</>\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_19_text_2\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(19).EndingLogic.Texts(2).Texts\n#. Key:\tUI_EndScreen_entry_16_text_2\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(16).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(16).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(19).EndingLogic.Texts(2).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Merch Ant and Fishy soon became best friends and ventured on together.\"\nmsgstr \"Han és Hali gyorsan összebarátkoztak, és együtt folytatták kalandos útjukat.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_1_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(1).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(1).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"A few hours later members of the Mage Council arrived along with the city guards.\"\nmsgstr \"Pár óra múltán megérkezett a Mágus Tanács néhány tagja a városőrséggel.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_1_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(1).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(1).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"The Council claimed that Wizard died in an unfortunate accident, his device could never actually work anyway and Ruin is nothing to fear of.\"\nmsgstr \"A Tanács leszögezte, hogy a Varázsló egy sajnálatos labori balesetben hunyt el, a Szerkezet egyébként sem működött volna, a Fertőzés pedig szófiabeszéd csupán.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_1_text_2\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(1).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(1).EndingLogic.Texts(2).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Although it was total nonsense Lillian and Scholar was happy that the crowd were taken away from the Castle.\"\nmsgstr \"Dacára, hogy az elhangzottak finoman szólva is köszönőviszonyban sem voltak a valósággal, Lillian és Tudós örült, hogy a csőcseléket kitessékelik a kastélyból, és nem álltak le vitatkozni.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_20_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(20).EndingLogic.Texts(0).Texts\n#. Key:\tUI_EndScreen_entry_17_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(17).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(17).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(20).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"The World was still about to end, but as one Pipe Walker wisely said:\"\nmsgstr \"A Világvégét nem sikerült elhárítani ugyan, de, ahogy azt az egyik Battyogó bölcsen megállapította:\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_21_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(21).EndingLogic.Texts(0).Texts\n#. Key:\tUI_EndScreen_entry_18_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(18).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(18).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(21).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"As some stories ended some new ones begun. Though what happened afterwards is not yet known.\"\nmsgstr \"Ahol egy történet véget ér, egy új kezdődik. Hogy ezután mi fog történni, azt még nem tudhatjuk.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_2_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(2).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(2).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"When they were left alone they quickly started the evacuation of the Ruined Realm.\"\nmsgstr \"Mikor végre magukra maradtak, megkezdhették a Fertőzött Föld lakóinak kimentését.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_3_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(3).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(3).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Even though she lost her father Lillian couldn’t afford to let sadness overcome her.\"\nmsgstr \"Lillian most már egyedül maradt a családjából, de nem hagyhatta, hogy a gyász maga alá gyűrje.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_3_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(3).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(3).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Ruin was more of a threat now than ever before, and since the Mage Council didn’t believe in Ruin it was the task of Lillian and Scholar to repair the device.\"\nmsgstr \"A Fertőzés most még nagyobb fenyegetést jelentett, mint eddig bármikor. Miután a Mágus Tanács nem volt hajlandó elfogadni a veszély létét, Lillianra és Tudósra hárult a feladat, hogy a Szerkezetet rendbe hozzák.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_4_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(4).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(4).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Scholar was really proud of Lillian because she managed to save time for the evacuation.\"\nmsgstr \"Tudós rendkívül büszke volt Lillianra, amiért sikerült időt nyernie a Fertőzött Föld lakóinak kimentésére.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_4_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(4).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(4).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"<Quote>‘I know Wizard would have disagreed but you did the right thing. We still have time to face Ruin. We couldn’t let everyone die there.’</>\"\nmsgstr \"<Quote>- Tudom, hogy Varázsló nem értett volna egyet, de hidd el, a helyes utat választottad. Még van időnk megállítani a Fertőzést. Nem hagyhattunk mindenkit elpusztulni a Fertőzött Földön.</>\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_5_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(5).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(5).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"As time passed Scholar started to behave a bit odd which made Lillian really anxious.\"\nmsgstr \"Ahogy haladt az idő, Tudós egyre furábban viselkedett, ami igencsak aggasztotta Lilliant.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_5_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(5).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(5).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Ruin was close and the solution was still far away.\"\nmsgstr \"A Fertőzés egyre közelebb ért, a megoldás pedig csak nem akart megszületni.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_5_text_2\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(5).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(5).EndingLogic.Texts(2).Texts\nmsgctxt \"EndScreen\"\nmsgid \"When she talked about her concerns to Raven, the bird said:\"\nmsgstr \"<Quote>- Összpontosíts a célodra, Lillian! -</> próbált segíteni Holló.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_5_text_3\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(5).EndingLogic.Texts(3).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(5).EndingLogic.Texts(3).Texts\nmsgctxt \"EndScreen\"\nmsgid \"<Quote>‘Focus on what you are doing Lillian. He was a bit odd anyway.’</>\"\nmsgstr \"<Quote>- Tudós egyébként is fura volt egy kicsit.</>\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_6_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(6).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(6).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"To the surprise of many Teachy turned out to be an excellent researcher.\"\nmsgstr \"Meglepő módon Tani kiváló kutatónak bizonyult.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_6_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(6).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(6).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"<Quote>‘To be honest I never wanted to be a teacher’ </>he said. <Quote>‘I only stayed at University so that I can do some more research work. But my students never let me research during lectures.’</>\"\nmsgstr \"<Quote>- Őszintén szólva, soha nem is akartam tanár lenni</> - mondta. <Quote>- Csak azért maradtam az egyetemen, hogy kutatómunkákat csinálhassak. Kár, hogy a diákok sosem hagytak olvasni az óráimon.</>\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_6_text_2\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(6).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(6).EndingLogic.Texts(2).Texts\nmsgctxt \"EndScreen\"\nmsgid \"He joined Lillian and dug into every book he could possibly find on the Ancient’s technology.\"\nmsgstr \"Csatlakozott Lillianhoz, és minden könyvön végigrágta magát, aminek csak köze volt az Ősi technológiához.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_7_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(7).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(7).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"The new environment and being a bit further from Ruin made good to the Gate Keeper.\"\nmsgstr \"Az új környezet, és a távollét a Fertőzéstől jót tett a Kapuőrnek.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_7_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(7).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(7).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"He organized some of the cleaners to repair the Castle so that Lillian can keep on with her work.\"\nmsgstr \"Csoportokba szervezte a Tisztítókat, és nekiláttak a kastély rendbetételének.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_7_text_2\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(7).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(7).EndingLogic.Texts(2).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Later he started to remember things from the Runic Realm which helped Lillian a lot.\"\nmsgstr \"Később eszébe jutottak dolgok a Rúna Rend korából, ami sokat segítettek Lilliannak a kutatásában.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_8_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(8).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(8).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"One day a Pipe Walker, who had been in many cages mentioned that she met some kobolds far away who might be other survivors of the Kobold Chef’s tribe.\"\nmsgstr \"Az egyik Battyogó, aki vándor élete folyamán számos helyre rács-odálkozott, említette, hogy már találkozott koboldokkal, akik talán a Szakács rokonai lehettek.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_9_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(9).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(9).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Hearing this news made Kobold Chef really excited.\"\nmsgstr \"Szakács rendkívül izgatott lett a hír hallatán.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_9_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(9).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(9).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"He decided to return to the Ruined Realm and search for his lost relatives.\"\nmsgstr \"Úgy döntött, visszatér a Fertőzött Földre, és felkutatja elveszett rokonait.\"\n\n#. Key:\tSoAct1_EG_AAFirstDroneTrio_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Drones were even more intelligent than Maintainers. They not only memorized texts, they helped correct grammar, changed the message if it was too insulting or even made up poems if they were asked to do so.\"\nmsgstr \"A Drónok még a Karbantartóknál is intelligensebbek voltak. Nem csak megjegyezni tudták az üzeneteket. Nyelvtani és etikai hibákat javítottak, kérésre akár verset is költöttek.\"\n\n#. Key:\tSoAct1_EG_AAFirstDroneTrio_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"The Flying Three\"\nmsgstr \"A Repülő Hármas\"\n\n#. Key:\tSoAct1_EG_AfterGateCleaners_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Citizens of Cerulean requested to have their own unique Golems, but it was always rejected. This situation was very good for the Black Golem Market, because this way it was always easy to find customers.\"\nmsgstr \"Mélykék Metropolisz lakói többször is kérvényezték, hogy egyedi Gólemeik lehessenek, de kérésüket minduntalan visszautasították. Ez a helyzet virágoztatta fel a Fekete Gólem Piacot.\"\n\n#. Key:\tSoAct1_EG_AfterGateCleaners_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Cleaners of Cerulean\"\nmsgstr \"Mélykék Tisztítók\"\n\n#. Key:\tSoAct1_EG_AfterGateElits_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"The Runic Realm's Government didn't allow the Golems to become the privilege of the rich. Even though the elite were not allowed to have different Golems they always found a way to make their servants different than the ones owned by the poor.\"\nmsgstr \"A Rúna Rend nem hagyta, hogy a Gólem birtoklás a gazdagok kiváltsága legyen. Noha az elit réteg hivatalosan ugyanazokkal a Gólemekkel rendelkezhetett, mint bárki más, azért mindig találtak módot arra, hogy az övéik eltérőnek tűnjenek.\"\n\n#. Key:\tSoAct1_EG_AfterGateElits_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Capetainers\"\nmsgstr \"Köpitány\"\n\n#. Key:\tSoAct1_EG_AGRightFromPortal_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"'Just keep cleaning! Cleaning, cleaning...'\"\nmsgstr \"\\\"Húzz és seperj! Seperj, seperj...\\\"\"\n\n#. Key:\tSoAct1_EG_AGRightFromPortal_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Cleaner Invasion\"\nmsgstr \"Takarító Invázió\"\n\n#. Key:\tSoAct1_EG_AGTestStoneCircle_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"The Black Golem Market was funded by a Golem Maker apprentice who failed his master exam and was banished from school. No wonder his golems were... unique.\"\nmsgstr \"A Fekete Gólem Piacot eredetileg egy Gólem Készítő tanítvány alapította, akinek nem sikerült átmennie a vizsgákon. Nem csoda, hogy a Gólemei... egyediek voltak.\"\n\n#. Key:\tSoAct1_EG_AGTestStoneCircle_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Weird Golems\"\nmsgstr \"Fura Gólemek\"\n\n#. Key:\tSoAct1_EG_AGWallJumpTeam_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"The cleaning plan for this area fell apart with the participants.\"\nmsgstr \"A rendezési terv darabjaira hullott a résztvevőkkel egyetemben.\"\n\n#. Key:\tSoAct1_EG_AGWallJumpTeam_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"The North Team\"\nmsgstr \"Északi Csapat\"\n\n#. Key:\tSoAct1_EG_ArcadeDungeonCleaners_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"The Golem's behaviour was specified by the Golem Makers. Only very simple personalities were made at the beginning. The Cleaners, for example, only desired to keep the place tidy and make sure they don't harm the people.\"\nmsgstr \"A Gólemek természetét a Gólem Készítő határozta meg. Kezdetben csak nagyon egyszerű viselkedési mintázatok jöttek számításba. Például a Takarítók másra sem vágytak, mint hogy rendben tartsák az épületeket, és ne ártsanak az embernek.\"\n\n#. Key:\tSoAct1_EG_ArcadeDungeonCleaners_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Arcade Cleaners\"\nmsgstr \"Árkád Takarítók\"\n\n#. Key:\tSoAct1_EG_ArcadeDungeonExit_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"After creating intelligence Golem Makers wanted even more. They wanted complex personality. They wanted Golems that can not only think but also feel. That was the idea behind designing the Gatekeepers.\"\nmsgstr \"A Gólem Készítők alkotási vágya az Intelligencia létrehozása után sem csillapodott. Még többet akartak. Olyan teremtményeket, amelyek nem csak gondolkodnak, de képesek érezni is. Ezzel az elhatározással álltak neki a Kapuőrök tervezésének.\"\n\n#. Key:\tSoAct1_EG_ArcadeDungeonExit_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Arcade Servants\"\nmsgstr \"Árkád Személyzet\"\n\n#. Key:\tSoAct1_EG_ArcadeDungeonOptional_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"You might wonder if a Vacuum Cleaner is designed to clean dust away why does it need a laser caster?\"\nmsgstr \"Azért jogos a kérdés, hogy ha a Porszívót a por eltüntetésére tervezték, akkor minek raktak rá lézervetőt? \"\n\n#. Key:\tSoAct1_EG_ArcadeDungeonOptional_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Vacuum Cleaners group\"\nmsgstr \"Porszívó Banda\"\n\n#. Key:\tSoAct1_EG_ArcadeMaintainers_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"The very first Golems were made to do the most monotonic work so that people have more time to think and to create. Once they were friendly but as Ruin came their behaviour changed.\"\nmsgstr \"Az első Gólemeket azért készítették, hogy elvégezzék az unalmas munkákat az emberek helyett. Így több idő maradt gondolkodni és alkotni. Ezek a Gólemek ártalmatlanok voltak - a Fertőzés előtt.\"\n\n#. Key:\tSoAct1_EG_ArcadeMaintainers_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Arcade Cleaner Golems\"\nmsgstr \"Árkád Takarító Gólemek\"\n\n#. Key:\tSoAct1_EG_Chest_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"The poor chest was minding his own business before you started to insult him.\"\nmsgstr \"Szegény láda békében elvolt, amíg nem kezdted piszkálni.\"\n\n#. Key:\tSoAct1_EG_Chest_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Chest\"\nmsgstr \"Láda\"\n\n#. Key:\tSoAct1_EG_GGMiniBoss_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Maybe it only depends on the creation process, but some Golems had stronger personality. In general, Golems with more intelligence resisted Ruin longer and Golems with strong personality were more vulnerable to the infection.\"\nmsgstr \"Talán a készítési folyamaton is múlik, de néhány Gólemnek sokkal erősebb személyisége lett. Általánosságban a nagyobb intelligenciával bíró Gólemek tovább ellenálltak a Fertőzésnek, még az erősebb személyiséggel bírók kiszolgáltatottabbaknak bizonyultak.\"\n\n#. Key:\tSoAct1_EG_GGMiniBoss_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Wickeds\"\nmsgstr \"Romlottak\"\n\n#. Key:\tSoAct1_EG_LoneDrone_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Drones delivered messages and gifts before Ruin. People were happy when they heard them approaching back then.\"\nmsgstr \"A Fertőzés előtt a Drónok üzeneteket és ajándékokat kézbesítettek. Az emberek akkor még örültek, ha meghallottál a propellerek zúgását.\"\n\n#. Key:\tSoAct1_EG_LoneDrone_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Lone Drone\"\nmsgstr \"Magányos Drón\"\n\n#. Key:\tSoAct1_EG_LoneSewerDrone_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"After Ruin most Golems liked to group together. Only a few chose to stay alone.\"\nmsgstr \"A Fertőzés után a Gólemek előszeretettel keresték egymás társaságát. Csak néhányuk maradt egyedül.\"\n\n#. Key:\tSoAct1_EG_LoneSewerDrone_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Another Lone Drone\"\nmsgstr \"Még egy Magányos Drón\"\n\n#. Key:\tSoAct1_EG_MaceGroup_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"'Attention: our enemies greatest weapon, the holy Mace is stolen. We truly should have destroyed it as the Council suggested.'\"\nmsgstr \"\\\"Figyelem: az ellenség leghatalmasabb fegyvere, az Egy Buzogány eltűnt. Lehet mégis meg kellett volna semmisíteni, ahogy a Tanács javasolta.\\\"\"\n\n#. Key:\tSoAct1_EG_MaceGroup_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Mace Defenders\"\nmsgstr \"Buzogány Őrök\"\n\n#. Key:\tSoAct1_EG_MaintainerInvestigatorInvestigators_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"After Ruin, Golems started to have strange behavior. There were a group of them who used the pipes to flood a part of the City. Later these places were called the Sewer.\"\nmsgstr \"A Fertőzés után a Gólemek viselkedése megváltozott. Néhányan a Csőrendszer karbantartói közül arra használták a vízvezetékeket, hogy elárasszák a Város egy részét. Később ezt a helyet Csöpögő Csatornának nevezték.\"\n\n#. Key:\tSoAct1_EG_MaintainerInvestigatorInvestigators_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Pipe Golems\"\nmsgstr \"Cső Gólemek\"\n\n#. Key:\tSoAct1_EG_MaintainerInvestigators_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Not only the Golems were created by using the Spirits of the Unknown World before Ruin. People found other ways of using this new technology. They created pipes to convey hot water to heat the city and cold water to drink.\"\nmsgstr \"A Fertőzés előtt nem csak Gólemkészítésre használták az Ismeretlen Világ Szellemeit. Ugyanez az energia működtette a Csőrendszert, ami a város fűtését és vízellátását biztosította.\"\n\n#. Key:\tSoAct1_EG_MaintainerInvestigators_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Maintainers of the Pipes\"\nmsgstr \"A Csőrendszer Karbantartói\"\n\n#. Key:\tSoAct1_EG_SABeforeWallJump_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Some believed cold can resist Ruin longer than magic. They created places where they kept the temperature beneath the freezing point. As it turned out, not even coldness can resist Ruin forever.\"\nmsgstr \"Egyes nézetek szerint a hideg tovább ellen tud állni a Fertőzésnek, mint a mágiával megerősített épületek. Az elképzelés alapján készült néhány hűtőkamra, de - mint az később kiderült - ezek sem tartottak ki örökké.\"\n\n#. Key:\tSoAct1_EG_SABeforeWallJump_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Cleaners of the Refrigerator.\"\nmsgstr \"Léhűtő Tarkarítók\"\n\n#. Key:\tSoAct1_EG_SAFightMustHave_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"'We won't clear anymore!' said the rebel Maintainer.\\r\\n'Let's declear War!'\"\nmsgstr \"\"\n\n#. Key:\tSoAct1_EG_SAFightMustHave_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Underground Cleaner Band\"\nmsgstr \"Földalatti Takarító Csapat\"\n\n#. Key:\tSoAct1_EG_SAFightOptional_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"'Let's make something clear. Maybe this room?'\"\nmsgstr \"Tisztázzunk valamit. Mondjuk ezt a szobát.\"\n\n#. Key:\tSoAct1_EG_SAFightOptional_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Underground Cleaner Band B\"\nmsgstr \"Földalatti Takarító Csoport B\"\n\n#. Key:\tSoAct1_EG_SewerCircleVacuumCleaners_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"People realised that Golem's Spirits have a power beyond imagination. They called it the Ancient Magic. Vacuum Cleaners could use this magic to do their job even better.\"\nmsgstr \"Az emberek rájöttek, hogy a Gólemkészítéshez használt szellemekben minden képzeletet felülmúló energia lakozik. Úgy hívták, az Ősi Mágia. A Porszívó volt az első típus, ami nem csak mozgásra és gondolkodásra használta ezt az erőt.\"\n\n#. Key:\tSoAct1_EG_SewerCircleVacuumCleaners_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Vacuum Cleaners\"\nmsgstr \"Porszívók\"\n\n#. Key:\tSoAct1_EG_SewerTeam_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Golem Makers wanted to create something more intelligent as they learned more. They shaped the Maintainers, the first golems capable of talking. Sadly their intelligence vanished as Ruin came.\"\nmsgstr \"Ahogy egyre gyakorlottabbá váltak, a Gólem Készítők egyre intelligensebb példányokat gyártottak. Ezen a téren átütő eredménynek számítottak a Karbantartók, akik képesek voltak beszélni. Sajnos az intelligenciájuk odaveszett, amikor a Fertőzés elérte őket.\"\n\n#. Key:\tSoAct1_EG_SewerTeam_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Sewer Golems\"\nmsgstr \"Csatorna Gólem\"\n\n#. Key:\tSoAct1_EG_TL_VacuumTwins_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Libraries were important in the life of the former Realm's citizens. No wonder that many of the golems were created only to dust and organize the books.\"\nmsgstr \"A könyvtárak fontos szerepet töltöttek be a néhai birodalom lakóinak életében. Nem csoda, hogy külön gólem típusokat készítettek a könyvek karbantartására.\"\n\n#. Key:\tSoAct1_EG_TL_VacuumTwins_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Library Cleaners\"\nmsgstr \"Könyvtár Takarítók\"\n\n#. Key:\tSoAct1_EG_TLSewerCreatureWatch_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Golems never ever attacked the Pipe Walkers. The reason is only known by the wisest Pipe Walker himself. It is because, as he explained: 'Nun dara bum, tuk la.'\"\nmsgstr \"A Fertőzött Gólemek soha nem támadtak rá a Battyogókra. Hogy ennek mi az oka, azt csak a legbölcsebb Battyogó ismeri. Ő röviden így magyarázza: \\\"Nun dara bum, tuk la.\\\"\"\n\n#. Key:\tSoAct1_EG_TLSewerCreatureWatch_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Sewer Team B\"\nmsgstr \"B Csatorna Csapat\"\n\n#. Key:\tSoAct1_EG_TowerTrio_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"They spent most of their time on the top of those towers - it was clear to me that they would die there as well.\"\nmsgstr \"Feszt a tornyok tetején lébecoltak, biztos voltam benne, hogy ott is fognak meghalni.\"\n\n#. Key:\tSoAct1_EG_TowerTrio_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"The Tower Trio\"\nmsgstr \"Torony Trió\"\n\n#. Key:\tSoAct2_EG_BounceTrio_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Lava Jumpers are former Golems who fell into the lava. Some of them return to join their former Golem companions.\"\nmsgstr \"A Láva Ugrók olyan Gólemek, akik a lávába estek. Néhányan közülük visszatértek egykori Gólem társaikhoz.\"\n\n#. Key:\tSoAct2_EG_BounceTrio_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Bounce Trio\"\nmsgstr \"Ugró Hármas\"\n\n#. Key:\tSoAct2_EG_C_BeforeKey_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"It's still unclear what makes some creatures touched by Ruin to group together. Some believes those who had similar emotions when Ruin came were likely to form a group.\"\nmsgstr \"Nem tisztázott, mi alapján alakulnak a Fertőzés által létrehozott lénycsoportok. Néhányan úgy vélik, a hasonló érzelmekkel bíró lények kerülnek közös csoportba.\"\n\n#. Key:\tSoAct2_EG_C_BeforeKey_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Anxious Armours\"\nmsgstr \"Vaduló Vértek\"\n\n#. Key:\tSoAct2_EG_C_Bridge_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Crafting was always the obsession of Dwarves. In their workshops they forged mighty weapons and wondrous armours. Their love for their craft was so strong that instead of their body, Ruin preserved their iron works.\"\nmsgstr \"A barkácsolás a Törpök második legnagyobb szenvedélye. Műhelyeikben sorra készültek a fegyverek és páncélok. Annyira kötődtek az alkotásaikhoz, hogy a Fertőzés végül azokat őrizte meg a testük helyett.\"\n\n#. Key:\tSoAct2_EG_C_Bridge_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Bridge Brigade\"\nmsgstr \"Híd Hadtest\"\n\n#. Key:\tSoAct2_EG_C_LoneShadeSphere_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Before Ruin there was no other humanoid race but human. New races are created by Ruin's Shades. They roam the lands looking for any living being which they can possess. Once they become part of a creature its body will start to change.\"\nmsgstr \"A Fertőzés előtt az ember volt az egyetlen értelmes lény. Az új fajokat a Fertőzés Árnyai hozták létre. Észrevétlen járták a világot, gazdatestet keresve. Ha egyszer valakiben otthonra leltek, az illető teste változásnak indult.\"\n\n#. Key:\tSoAct2_EG_C_LoneShadeSphere_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Weird Floating Thing\"\nmsgstr \"Fura Lebegő Izé\"\n\n#. Key:\tSoAct2_EG_C_OfficeGuards_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Watching the only way to the Office did not bring enough protection. If any intruder managed to pass the Patrols he still had to face the Guardians to proceed.\"\nmsgstr \"Az egyetlen út felügyelete természetesen nem volt elégséges védelem. Ha valaki átjutott az Őrökön, még szembe kellett néznie a Őrzőkkel.\"\n\n#. Key:\tSoAct2_EG_C_OfficeGuards_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Guardians of the Law\"\nmsgstr \"A Törvény Őrei\"\n\n#. Key:\tSoAct2_EG_C_OfficePatrols_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Going into the Law's High Office was forbidden even for most of the Dwarves. Only one path lead to the Office and that was guarded by the Patrols.\"\nmsgstr \"A Törvény Legfőbb Irodája még a Törpök többsége számára is tiltott terület volt. Egyetlen út vezet az Irodához, amit az Őrjárat felügyel.\"\n\n#. Key:\tSoAct2_EG_C_OfficePatrols_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Patrols of the Law\"\nmsgstr \"A Törvény Őrei\"\n\n#. Key:\tSoAct2_EG_DG_Left_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Deep beneath the Catacombs there is a secret place called the Dwarven Gate. Elite dwarves who worked here were placed above the Law. They were seeking a way to fight Ruin with Ruin's magic.\"\nmsgstr \"Mélyen a Tárnák alatt fekszik egy titkos hely, amit Törp Kapunak hívnak. Azok az Elit Törpök, akik itt dolgoztak, a törvény felett álltak. Azt kutatták, hogy lehet a Fertőzést használni a Fertőzés ellen.\"\n\n#. Key:\tSoAct2_EG_DG_Left_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Glorious Group\"\nmsgstr \"Csoda Csapat\"\n\n#. Key:\tSoAct2_EG_DG_RightFloor_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Even though most of the common Dwarves never even heard about Dwarven Gate some were needed to do the hard work. Now that Ruin won, Dwarves are finally equal.\"\nmsgstr \"Noha a Törp Kapu létezését a közönséges Törpök előtt titokban tartották, néhányukra szükség volt, hogy a fizikai munkát elvégezzék odalent. Most, hogy a Fertőzés nyert, már minden Törpe egyenlő.\"\n\n#. Key:\tSoAct2_EG_DG_RightFloor_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Not so Elite Dwarves\"\nmsgstr \"Annyira nem is Elit Törpök\"\n\n#. Key:\tSoAct2_EG_DG_RightUpOptional_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"One idea of the Elite Dwarves was to create giant statues which are able to trap Ruin's essence. Even if they were right they never managed to make enough sculptures.\"\nmsgstr \"Az Elit Törpök nagy ötlete az volt, hogy a Fertőzés esszenciáját óriási szobrokba zárják. A dolog elvben működhetett volna, de soha nem sikerült elég szobrot készíteniük.\"\n\n#. Key:\tSoAct2_EG_DG_RightUpOptional_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Sculptors\"\nmsgstr \"Szobrászok\"\n\n#. Key:\tSoAct2_EG_DwarfBoss_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Dwarven Statues were meant to imprison the essence of Ruin. However there were some Dwarven scientists who feared that the statues were not safe and in the long run they wouldn't be able to resist the power of Ruin...\"\nmsgstr \"A Törp Szobrokat azért készítették, hogy csapdába ejtsék bennük a Fertőzést. Néhány tudós úgy vélte, nem biztos, hogy a szobrok hosszú távon is biztonságosak maradnak...\"\n\n#. Key:\tSoAct2_EG_DwarfBoss_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Dwarven Statue\"\nmsgstr \"Törp Szobor\"\n\n#. Key:\tSoAct2_EG_GolemFirst_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Stone Golems are the cheap copies of the Runic Realm Golems. If Ruin twists the creatures mind then it will definitely have no effect on these ones.\"\nmsgstr \"A Kőgólemek olcsó utánzatai csupán a Rúna Rend alkotásainak. Ha a Fertőzés a teremtmények elméjére gyakorol hatást, akkor a Kőgólemeknek nincs mitől tartaniuk.\"\n\n#. Key:\tSoAct2_EG_GolemFirst_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Sphere Golem\"\nmsgstr \"Gömb Gólem\"\n\n#. Key:\tSoAct2_EG_GolemSecond_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Looks like the second try is just as bad as the first one.\"\nmsgstr \"Úgy tűnik, a második verzió pont olyan rossz, mint az első.\"\n\n#. Key:\tSoAct2_EG_GolemSecond_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Second Sphere Golem\"\nmsgstr \"Második Gömb Gólem\"\n\n#. Key:\tSoAct2_EG_GolemThird_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Whoever made this Golem, he should have stopped after the second try.\"\nmsgstr \"Bárki is készítette ezt a Gólemet, fel kellett volna adnia a második verziónál.\"\n\n#. Key:\tSoAct2_EG_GolemThird_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Third Sphere Golem\"\nmsgstr \"Harmadik Gömb Gólem\"\n\n#. Key:\tSoAct2_EG_HutFishies_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Now that the Fishys are gone, the Lake's piranhas can live in peace and eat whoever comes close.\"\nmsgstr \"Most, hogy a Halik kihaltak, a pirannyák szabadon ehetnek meg bárkit, aki erre jár.\"\n\n#. Key:\tSoAct2_EG_HutFishies_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Abandoned Fishy Slaves\"\nmsgstr \"Elhagyott Hali Rabszolgák\"\n\n#. Key:\tSoAct2_EG_HutFlyArmy_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"No one knows where the Flies came from. Although you have a very clear idea on where they should go...\"\nmsgstr \"Senki nem tudja, honnan jöttek a Röppenők, de arról elég határozott elképzelésed van, hova kéne menniük.\"\n\n#. Key:\tSoAct2_EG_HutFlyArmy_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Annoying Flies\"\nmsgstr \"Szemtelen Pofátlan Piaci Legyek\"\n\n#. Key:\tSoAct2_EG_LavaBoss_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Armour Wrath was the most ambitious and majestic work of the Golem Maker. He used all his remaining strength to create this mighty Golem. It's a pity that all his efforts were in vain.\"\nmsgstr \"Harag Vért volt a Gólem Készítő legnagyobb munkája. Minden tudását és maradék erejét felhasználta az elkészítéséhez. Sajnos erőfeszítése hiábavalónak bizonyult.\"\n\n#. Key:\tSoAct2_EG_LavaBoss_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Armour Wrath\"\nmsgstr \"Harag Vért\"\n\n#. Key:\tSoAct2_EG_LavaDeepTeam_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"A fourth Sphere Golem? Someone never gives up...\"\nmsgstr \"Negyedik Gömb Gólem? Valaki nem tudja feladni...\"\n\n#. Key:\tSoAct2_EG_LavaDeepTeam_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Fourth Sphere Golem\"\nmsgstr \"Negyedik Gömb Gólem\"\n\n#. Key:\tSoAct2_EG_LavaJumpers_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"When a Golem falls into the lava its stone body will melt away. The spirit however resists the heat and will be looking for another body...\"\nmsgstr \"Amikor egy Gólem a lávába esik, a teste elolvad, de a lelke nem szűnik meg létezni, hanem új testet keres...\"\n\n#. Key:\tSoAct2_EG_LavaJumpers_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Lava Jumpers\"\nmsgstr \"Láva Ugrók\"\n\n#. Key:\tSoAct2_EG_LavaTeamX_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Divided they fall, united they divide...\"\nmsgstr \"Ahol egy elbukna, ott több összeveszik.\"\n\n#. Key:\tSoAct2_EG_LavaTeamX_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Golem Group\"\nmsgstr \"Gólem Csapat\"\n\n#. Key:\tSoAct2_EG_LavaTrio_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Wherever Golems go after death these three will go there together.\"\nmsgstr \"Bárhová is kerüljenek a Gólemek a halál után, ezek hárman oda is együtt mennek.\"\n\n#. Key:\tSoAct2_EG_LavaTrio_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Golem Trio\"\nmsgstr \"Gólem Trió\"\n\n#. Key:\tSoAct2_EG_OutpostLeft_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"To keep Ruin away dwarves forbade everything related to Ruin's magic. This might have worked in theory but they failed to notice that their mechanical devices were also powered by Ruin.\"\nmsgstr \"Hogy a Fertőzést visszaszorítsák, a Törpök mindent betiltottak, ami a Fertőzés Erejét használta. Ez elméletben segíthetett volna, de azt valahogy nem vették számításba, hogy a legtöbb mechanikus eszközüket szintén a Fertőzés hajtotta.\"\n\n#. Key:\tSoAct2_EG_OutpostLeft_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Guardians of the West Wall\"\nmsgstr \"A Nyugati Fal Őrei\"\n\n#. Key:\tSoAct2_EG_OutpostRight_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Ruin was not only meant for destruction, it could also preserve. Ruin gave endless life for those who survived at the cost of twisting their minds.\"\nmsgstr \"A Fertőzés nem csak pusztítani, de oltalmazni is tudott. Örök létet adott a túlélőknek, ép elméjükért cserébe.\"\n\n#. Key:\tSoAct2_EG_OutpostRight_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Guardians of the East Wall\"\nmsgstr \"A Keleti Fal Őrei\"\n\n#. Key:\tSoAct2_EG_OutpostWallFirst_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Dwarves fought Ruin with Rules. These soldiers were ordered here to guard the Outpost. Their will to obey the order was so strong that even death couldn't break it.\"\nmsgstr \"A Törpök Szabályokkal próbálták felvenni a harcot a Fertőzés ellen. Ha a katonák azt a parancsot kapták, hogy védjék a falakat, akkor ebben még a halál sem akadályozhatta őket.\"\n\n#. Key:\tSoAct2_EG_OutpostWallFirst_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Patrols of the Outpost Wall\"\nmsgstr \"A Helyőrség Falának Őrei\"\n\n#. Key:\tSoAct2_EG_Shore_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"After Ruin turned them into Monsters some creatures gathered together. Whether it's the effect of Ruin or something from their former life is unclear.\"\nmsgstr \"Miután a Fertőzés szörnyeteggé alakította őket, zömmel csoportokba verődtek. Hogy ez a Fertőzés hatása-e, vagy valami, ami a korábbi életükből maradt, nem tisztázott.\"\n\n#. Key:\tSoAct2_EG_Shore_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Shore Monsters\"\nmsgstr \"Parti Szörnyek\"\n\n#. Key:\tSoAct2_EG_SlideFishyTeam_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Fishys were produced by the Great Kobold tribe for slaves. Some of them managed to escape, but they couldn't go far from the Lake.\"\nmsgstr \"A Halikat a Nagy Koboldok tenyésztették rabszolgának. Néhányuknak sikerült elmenekülniük, de ők sem mentek messze a Tótól.\"\n\n#. Key:\tSoAct2_EG_SlideFishyTeam_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Deserter Fishys\"\nmsgstr \"Szökevény Halik\"\n\n#. Key:\tSoAct2_EG_SlidePathEnd_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Deserter Fishys always kept a Fishy group close to the exit of their secret hideout. They protected the others and watched the kobolds to find the right time to venture back to the Lake.\"\nmsgstr \"A Szökevény Halik mindig állomásoztattak egy csapatot a rejtekhelyük bejáratánál. Ők vigyáztak a többiekre, és lesték ki, mikor lehet visszatérni a Tóhoz. \"\n\n#. Key:\tSoAct2_EG_SlidePathEnd_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Patrol Fishys\"\nmsgstr \"Hali Őrök\"\n\n#. Key:\tSoAct2_EG_WormHole_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Worms kept distance from each other before Ruin. It's strange how a force which tears everything apart can also unite.\"\nmsgstr \"A Fertőzés előtt a Férgek egymástól tisztes távolságban éltek. Érdekes, hogy ugyanaz az erő, amely darabokra szedi a világot, máshol közelebb visz dolgokat egymáshoz.\"\n\n#. Key:\tSoAct2_EG_WormHole_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Worms\"\nmsgstr \"Férgek\"\n\n#. Key:\tSoAct2_EG_Wormy_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"There was a time when Worms only made damage to fields and gardens. Now they are a bit more ambitious...\"\nmsgstr \"Volt idő, amikor a Férgek még csak a vetésben tettek kárt. Most már picit ambiciózusabbak ennél...\"\n\n#. Key:\tSoAct2_EG_Wormy_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Worm\"\nmsgstr \"Féreg\"\n\n#. Key:\tSoAct2_EG_WWBoss_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"When Ruin appeared some decided to abandon civilization and return to nature. Their leader, the Fallen Druid cast an ancient spell to protect his plants from Ruin. His spell partly worked but at a terrible cost.\"\nmsgstr \"A Fertőzést követően néhányan hátrahagyták a civilizációt, hogy visszatérjenek a természetbe. Vezetőjük, a Bukott Druida védelmező varázslatot szőtt új otthonukra. A varázslat valamennyire működött, de hatalmas árat kellett fizetni érte.\"\n\n#. Key:\tSoAct2_EG_WWBoss_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Fallen Druid\"\nmsgstr \"Bukott Druida\"\n\n#. Key:\tSoAct3_EG_Act3BubbleGroundMain_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Ruin's power is not only in destruction. When it can't change something it will preserve those attributes which can prepare the possibility to change again. Ruin's power is in change.\"\nmsgstr \"A Fertőzés nem csak pusztít. Ha valamit képtelen megváltoztatni, akkor támogatni fogja azokat a tulajdonságokat, amik magukban hordozzák a változás lehetőségét. A Fertőzés ereje a változásban van.\"\n\n#. Key:\tSoAct3_EG_Act3BubbleGroundMain_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Maintainer Spellcasters\"\nmsgstr \"Karbantartó Varázsló\"\n\n#. Key:\tSoAct3_EG_Act3FinalBattle_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Even though Ruin doesn't have consciousness nor the ability to think it somehow reacts to your presence. As if it knew the threat you present, Ruin tries all it can to stop you from leaving the Ruined Realm.\"\nmsgstr \"A Fertőzésnek nincs tudata, és gondolkodni sem tud, de valahogy mégis képes reagálni a jelenlétedre. Mintha csak érezné, milyen fenyegetést jelentesz rá, mindent megtesz, hogy megállítson.\"\n\n#. Key:\tSoAct3_EG_Act3FinalBattle_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Ruined Convention\"\nmsgstr \"A Fertőzés Parancsára\"\n\n#. Key:\tSoAct3_EG_Act3PipeGroupFirst_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"There is a difference between how Humans and Golems are transformed by Ruin. Human bodies reach their final form in a few decades but Golems never stop changing. There is always a new, more vicious type.\"\nmsgstr \"Van egy alapvető különbség abban, ahogy az ember és a gólem átváltozik. Az emberi test eléri végleges formáját néhány évtized alatt, de a gólemek soha nem hagynak fel a változással. Mindig lesz egy újabb, még veszélyesebb változat.\"\n\n#. Key:\tSoAct3_EG_Act3PipeGroupFirst_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Red Drones\"\nmsgstr \"Vörös Drónok\"\n\n#. Key:\tSoAct3_EG_Act3PipeGroupSecond_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Transformation is relative to intelligence. Creatures with consciousness have a strong desire to reserve their ego. Ruin can fool them a few times but later they become invulnerable to Ruin's changing power.\"\nmsgstr \"Az Átváltozás szorosan összefügg az intelligenciával. A Tudattal bíró lényekben erős az akarat egójuk megőrzésére. A Fertőzés kijátszhatja őket néhány alkalommal, de egy idő után már nem lesznek hajlandóak változni.\"\n\n#. Key:\tSoAct3_EG_Act3PipeGroupSecond_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"More Drones\"\nmsgstr \"Még több Drón\"\n\n#. Key:\tSoAct3_EG_Act3RangedCleanerTwins_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Ruin's nature is confusing for the human mind. It can build, it can destroy, it can use, it can be used. These actions have the same priority for Ruin. All that matters is that it can do something. And with time it wants more and more.\"\nmsgstr \"A Fertőzés természetét nem könnyű megérteni. Ugyanúgy képes építeni, mint ahogy rombolni. Használ, és használható. Minden cselekvés egyenrangú a Fertőzés számára. Az egyetlen, ami számít, hogy valamit csináljon.\"\n\n#. Key:\tSoAct3_EG_Act3RangedCleanerTwins_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Cleaner Twins\"\nmsgstr \"Takarító Ikrek\"\n\n#. Key:\tSoAct3_EG_Act3VacuumTwins_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Ruin's logic is predictable when you understand its nature. When it's not possible to create more the creation process can be restarted by destroying everything first.\"\nmsgstr \"A Fertőzés kiszámítható, ha megérted a működését. Ha már nincs lehetőség tovább fejlődni, mindent le kell rombolni, hogy újra fejlődni lehessen.\"\n\n#. Key:\tSoAct3_EG_Act3VacuumTwins_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Elite Twins\"\nmsgstr \"Elit Ikrek\"\n\n#. Key:\tWhiteWall_EG_AfterKobold_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Creating intelligence was not enough for the Golem Makers. They wanted to get even further. They wanted to create Golems with emotions.\"\nmsgstr \"Egy idő után már az intelligencia sem volt elég a Gólem Készítőknek. Még többre vágytak. Valamire, vagy inkább valakire, aki képes érezni is.\"\n\n#. Key:\tWhiteWall_EG_AfterKobold_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Flying Maintainer\"\nmsgstr \"Fennkölt Fenntartó\"\n\n#. Key:\tWhiteWall_EG_BeforeKobold_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"When the Cataclysm happened and Ruin came the Golems started to change. Instead of doing their daily work some of them turned against their masters.\"\nmsgstr \"Az Összeomlás után valami megváltozott a Gólemekben. Sokan közülük otthagyták eredeti munkájukat, és a gazdáik ellen fordultak.\"\n\n#. Key:\tWhiteWall_EG_BeforeKobold_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Infected Golems\"\nmsgstr \"Meghibásodott Gólemek\"\n\n#. Key:\tWhiteWall_EG_FirstCombat_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Cleaners were the first Golems ever made. Before the Cataclysm they did all the monoton work so that the people had more time to think and to create.\"\nmsgstr \"Az első gólemek a Takarítók voltak. Az Összeomlás előtt ők végezték az alja munkát, hogy az embernek több ideje legyen gondolkodni és alkotni.\"\n\n#. Key:\tWhiteWall_EG_FirstCombat_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Whitewall Cleaners\"\nmsgstr \"Fehér Fellegvár Takarítók\"\n\n#. Key:\tWhiteWall_EG_FirstOptionalCombat_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"After the different types of Cleaners, Golem Makers wanted to create something greater than working robots. They started to design creatures with intelligence.\"\nmsgstr \"A Takarítók megalkotása után a Gólem Készítők többre vágytak egyszerű munkagépek tervezésénél. Olyan teremtményt szerettek volna, amely intelligenciával bír.\"\n\n#. Key:\tWhiteWall_EG_FirstOptionalCombat_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Whitewall Maintainers\"\nmsgstr \"Fehér Fellegvár Fenntartók\"\n\n#. Key:\tAbacus_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/Abacus.Abacus.Description\n#: /Game/SO/Items/QuestItems/Abacus.Abacus.Description\nmsgctxt \"ItemData\"\nmsgid \"When you don't have enough fingers to count something you need this abacus.\"\nmsgstr \"Ha nincs elég ujjad ahhoz, hogy megszámolj valamit, akkor jól jön egy Abakusz.\"\n\n#. Key:\tAbacus_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/Abacus.Abacus.Name\n#: /Game/SO/Items/QuestItems/Abacus.Abacus.Name\nmsgctxt \"ItemData\"\nmsgid \"Abacus\"\nmsgstr \"Abakusz\"\n\n#. Key:\tAbacusGhost_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/AbacusGhost.AbacusGhost.Description\n#: /Game/SO/Items/QuestItems/AbacusGhost.AbacusGhost.Description\nmsgctxt \"ItemData\"\nmsgid \"When the Abacus is killed its spirit might return to get even with its murderer.\"\nmsgstr \"Előfordul, hogy az Abakusz szelleme visszatér leszámolni gyilkosával.\"\n\n#. Key:\tAbacusGhost_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/AbacusGhost.AbacusGhost.Name\n#: /Game/SO/Items/QuestItems/AbacusGhost.AbacusGhost.Name\nmsgctxt \"ItemData\"\nmsgid \"Ghost Abacus\"\nmsgstr \"Szellem Abakusz\"\n\n#. Key:\tAbacusGhostFlower_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/AbacusGhostFlower.AbacusGhostFlower.Description\n#: /Game/SO/Items/QuestItems/AbacusGhostFlower.AbacusGhostFlower.Description\nmsgctxt \"ItemData\"\nmsgid \"Petals of a ghost flower.\"\nmsgstr \"Egy szellem virág szirmai.\"\n\n#. Key:\tAbacusGhostFlower_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/AbacusGhostFlower.AbacusGhostFlower.Name\n#: /Game/SO/Items/QuestItems/AbacusGhostFlower.AbacusGhostFlower.Name\nmsgctxt \"ItemData\"\nmsgid \"Ghost Petals\"\nmsgstr \"Szellem Szirmok\"\n\n#. Key:\tAbacusSpellBook_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/AbacusSpellBook.AbacusSpellBook.Description\n#: /Game/SO/Items/QuestItems/AbacusSpellBook.AbacusSpellBook.Description\nmsgctxt \"ItemData\"\nmsgid \"An ancient paper\"\nmsgstr \"Egy régi papiros\"\n\n#. Key:\tAbacusSpellBook_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/AbacusSpellBook.AbacusSpellBook.Name\n#: /Game/SO/Items/QuestItems/AbacusSpellBook.AbacusSpellBook.Name\nmsgctxt \"ItemData\"\nmsgid \"Scroll of Surrection\"\nmsgstr \"Visszahívás Tekercs\"\n\n#. Key:\tAbacusSpellBook_page_0\n#. SourceLocation:\t/Game/SO/Items/QuestItems/AbacusSpellBook.AbacusSpellBook.Pages(0).Pages\n#: /Game/SO/Items/QuestItems/AbacusSpellBook.AbacusSpellBook.Pages(0).Pages\nmsgctxt \"ItemData\"\nmsgid \"Wisy et al. [3152] point out that any entity can be banished by throwing the proper object into his/her/its face a few times, making him/her/it annoyed thus unconcerned, as long as the target entity has a face.\\r\\n\\r\\nThe proper object in case of ghosts is something Surrected [Inti and Clevi 3153], as only Surrected substance can interact with ghosts.\\r\\n\\r\\nAny object covered with petals of Ghost Flower can be Surrected using the following method:\\r\\n\\r\\n- Say \\\"Sorry my <object name>!\\\"\\r\\n- Break the object into pieces with a heated hammer\\r\\n- Say your favourite color\\r\\n- Croon \\\"La La LaLaLa LaLaLa\\\" until the object is coagulated into a single Surrected object\"\nmsgstr \"Bölcsi és kutatótársai (3152) kimutatták, hogy bármilyen teremtmény elzavarható egy pár jól irányzott, megfelelő objektummal elvgézett arcondobással, melynek hatására a felbosszantott lény elveszíti érdeklődését a közelben maradásról, amennyiben a szóban forgó lény rendelkezik arccal.\\r\\n\\r\\nA megfelelő tárgy a szellemek esetén egy Támasztott objektum (Oki és Doki 3153), mivel csak a Támasztott anyag képes interaktálni a szellemekkel.\\r\\n\\r\\nBármilyen szellem szirmokkal borított objektum Támasztható az alábbi módon:\\r\\n\\r\\n- Suttogd: \\\"Sajnálom <tárgy neve>!\\\"\\r\\n- Törd össze a tárgyat egy felmelegített kalapáccsal\\r\\n- Suttogd a kedvenc színed\\r\\n- Kántáld, hogy \\\"La La LaLaLa LaLaLa\\\" amíg az objektum Támasztottá nem válik\"\n\n#. Key:\tAbacusSpellBook_page_1\n#. SourceLocation:\t/Game/SO/Items/QuestItems/AbacusSpellBook.AbacusSpellBook.Pages(1).Pages\n#: /Game/SO/Items/QuestItems/AbacusSpellBook.AbacusSpellBook.Pages(1).Pages\nmsgctxt \"ItemData\"\nmsgid \"WARNING: not following the instructions exactly leads to failure and also increases the probability of injury and or death [Carfy 3154].\\r\\n\\r\\nREFERENCES:\\r\\n\\r\\nWISY, W., BUSY, B., WEIRDY, Y., AND LUCKY, L. 3152. The best ways to get rid of anyone potentially distracting us with questions like \\\"What do you read?\\\"\\r\\n\\r\\nInti, I., AND Clevi, C. 3153. Insulting dead ancestors using Surrected objects\\r\\n\\r\\nCarfy C. 3154. What happened to Clevi, C. and Inti, I.\"\nmsgstr \"\\\"Figyelmeztetés: az utasítások be nem tartása hibákhoz vezethet, és drasztikusan megnöveli a sérülések szerzésének, és elhalálozásnak az esélyét (Óvati 3154).\\r\\n\\r\\nREFERENCIÁK:\\r\\n\\r\\nBÖLCSI, B., SZORGI, SZ., FURI, F., ÉS MÁZLI, M. 3152. A bosszantó kérdésekkel zaklatóktól való megszabadulás legjobb módjai (Mit olvasol?)\\r\\n\\r\\nOKI, O., ÉS DOKI, D. 3153. Eltávozott ősök bosszantása Támasztott tárgyak segítségével\\r\\n\\r\\nÓVATI Ó. 3154. Hová tűnt Oki O. és Doki D.\"\n\n#. Key:\tAll_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/All.All.Description\n#: /Game/SO/Items/QuestItems/All.All.Description\nmsgctxt \"ItemData\"\nmsgid \"Maybe it was a bit too much?\"\nmsgstr \"Talán picit több volt a kelleténél?\"\n\n#. Key:\tAll_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/All.All.Name\n#: /Game/SO/Items/QuestItems/All.All.Name\nmsgctxt \"ItemData\"\nmsgid \"Everything, except an Abacus\"\nmsgstr \"Minden, kivéve egy Abakuszt\"\n\n#. Key:\tArtifact_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/Artifact.Artifact.Description\n#: /Game/SO/Items/QuestItems/Artifact.Artifact.Description\nmsgctxt \"ItemData\"\nmsgid \"A very rare and powerful item which is used for opening a portal into the Unknown Realm. If you gather three and give them to the Wizard he shall set you free.\"\nmsgstr \"Egy nagyon ritka, felbecsülhetetlen értékű tárgy, amit arra használnak, hogy Kaput nyissanak az Ismeretlen Világba. Ha hármat összegyűjtesz belőlük, akkor a Varázsló hazajuttat.\"\n\n#. Key:\tArtifact_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/Artifact.Artifact.Name\n#: /Game/SO/Items/QuestItems/Artifact.Artifact.Name\nmsgctxt \"ItemData\"\nmsgid \"Artifact\"\nmsgstr \"Varázstárgy\"\n\n#. Key:\tAxeMainGame_desc\n#. SourceLocation:\t/Game/SO/Items/Weapons/AxeMainGame.AxeMainGame.Description\n#. Key:\tAxe_desc\n#. SourceLocation:\t/Game/SO/Items/Weapons/Axe.Axe.Description\n#: /Game/SO/Items/Weapons/Axe.Axe.Description\n#: /Game/SO/Items/Weapons/AxeMainGame.AxeMainGame.Description\nmsgctxt \"ItemData\"\nmsgid \"Axes are usefull, but if you don't need them you can just throw them away.\"\nmsgstr \"A fejsze hasznos szerszám, de ha mégse lenne rá szükséged, nyugodtan eldobhatod.\"\n\n#. Key:\tAxeMainGame_name\n#. SourceLocation:\t/Game/SO/Items/Weapons/AxeMainGame.AxeMainGame.Name\n#. Key:\tAxe_name\n#. SourceLocation:\t/Game/SO/Items/Weapons/Axe.Axe.Name\n#: /Game/SO/Items/Weapons/Axe.Axe.Name\n#: /Game/SO/Items/Weapons/AxeMainGame.AxeMainGame.Name\nmsgctxt \"ItemData\"\nmsgid \"Axes\"\nmsgstr \"Fejszék\"\n\n#. Key:\tBlueCrystal_desc\n#. SourceLocation:\t/Game/SO/Items/Valuable/BlueCrystal.BlueCrystal.Description\n#: /Game/SO/Items/Valuable/BlueCrystal.BlueCrystal.Description\nmsgctxt \"ItemData\"\nmsgid \"An ancient crystal people like to buy.\"\nmsgstr \"Valami régi kőféle, amit az emberek szeretnek megvenni.\"\n\n#. Key:\tBlueCrystal_name\n#. SourceLocation:\t/Game/SO/Items/Valuable/BlueCrystal.BlueCrystal.Name\n#: /Game/SO/Items/Valuable/BlueCrystal.BlueCrystal.Name\nmsgctxt \"ItemData\"\nmsgid \"Blue Crystal\"\nmsgstr \"Kék kristály\"\n\n#. Key:\tBlueGem_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/BlueGem.BlueGem.Description\n#: /Game/SO/Items/QuestItems/BlueGem.BlueGem.Description\nmsgctxt \"ItemData\"\nmsgid \"A small precious blue stone.\"\nmsgstr \"Kicsi, értékes, kék kő.\"\n\n#. Key:\tBlueGem_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/BlueGem.BlueGem.Name\n#: /Game/SO/Items/QuestItems/BlueGem.BlueGem.Name\nmsgctxt \"ItemData\"\nmsgid \"Blue Gem\"\nmsgstr \"Kék Kő\"\n\n#. Key:\tDemonSword_desc\n#. SourceLocation:\t/Game/SO/Items/Weapons/DemonSword.DemonSword.Description\n#: /Game/SO/Items/Weapons/DemonSword.DemonSword.Description\nmsgctxt \"ItemData\"\nmsgid \"The mighty sword of Kharutar the Demon Ruler. Legend says he once cut one of his fingers with it and in his rage he broke the sword into two. Later it was reforged but some say it would still need some more fixes.\"\nmsgstr \"A legendás Démon Nagyúr, Kharatur kardja. A történet szerint egyszer véletlen elvágta vele az ujját, és ezért dühében ketté törte. Azóta úgy ahogy újrakovácsolták, de azért még ráférne némi javítás.\"\n\n#. Key:\tDemonSword_name\n#. SourceLocation:\t/Game/SO/Items/Weapons/DemonSword.DemonSword.Name\n#: /Game/SO/Items/Weapons/DemonSword.DemonSword.Name\nmsgctxt \"ItemData\"\nmsgid \"Demon Sword\"\nmsgstr \"Démon Kard\"\n\n#. Key:\tDOKitchenKey_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/DOKitchenKey.DOKitchenKey.Description\n#: /Game/SO/Items/Keys/DOKitchenKey.DOKitchenKey.Description\nmsgctxt \"ItemData\"\nmsgid \"This is one of the many spare keys of the Dwarven Outpost Kitchen. Being able to get into the kitchen was always very important for dwarves.\"\nmsgstr \"A számos tartalék konyhakulcs egyike. A törpék számára rendkívül fontos volt, hogy be tudjanak jutni a konyhába.\"\n\n#. Key:\tDOKitchenKey_name\n#. SourceLocation:\t/Game/SO/Items/Keys/DOKitchenKey.DOKitchenKey.Name\n#: /Game/SO/Items/Keys/DOKitchenKey.DOKitchenKey.Name\nmsgctxt \"ItemData\"\nmsgid \"Kitchen Key\"\nmsgstr \"Konyha Kulcs\"\n\n#. Key:\tDualBlade_desc\n#. SourceLocation:\t/Game/SO/Items/Weapons/DualBlade.DualBlade.Description\n#: /Game/SO/Items/Weapons/DualBlade.DualBlade.Description\nmsgctxt \"ItemData\"\nmsgid \"In case of trouble, it's better to have double.\"\nmsgstr \"Jobb kétszer, mint egyszer sem - mondta a fegyver kovács.\"\n\n#. Key:\tDualBlade_name\n#. SourceLocation:\t/Game/SO/Items/Weapons/DualBlade.DualBlade.Name\n#: /Game/SO/Items/Weapons/DualBlade.DualBlade.Name\nmsgctxt \"ItemData\"\nmsgid \"Double Sword\"\nmsgstr \"Dupla Kard\"\n\n#. Key:\tElevatorGem_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/ElevatorGem.ElevatorGem.Description\n#: /Game/SO/Items/QuestItems/ElevatorGem.ElevatorGem.Description\nmsgctxt \"ItemData\"\nmsgid \"A shiny green crystal which activates a weight lifting mechanism. At least by the look of it.\"\nmsgstr \"Fényes kis zöld kristály, ami egy felvonószerkezetet hoz működésbe. Legalábbis a kinézete alapján.\"\n\n#. Key:\tElevatorGem_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/ElevatorGem.ElevatorGem.Name\n#: /Game/SO/Items/QuestItems/ElevatorGem.ElevatorGem.Name\nmsgctxt \"ItemData\"\nmsgid \"Elevator Gem\"\nmsgstr \"Felvonó Kő\"\n\n#. Key:\tElevatorLeverCrystal_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/ElevatorLeverCrystal.ElevatorLeverCrystal.Description\n#: /Game/SO/Items/QuestItems/ElevatorLeverCrystal.ElevatorLeverCrystal.Description\nmsgctxt \"ItemData\"\nmsgid \"You got this item for free from a Merchant so you hardly believe it has any value. It might be used as some sort of a mechanism activator though. Hopefully not for a trap.\"\nmsgstr \"Minthogy ingyen kaptad egy kereskedőtől, kizárt, hogy bármi értéke legyen. Viszont elvileg aktiválhat valami szerkezetet. Remélhetőleg nem csapdát...\"\n\n#. Key:\tElevatorLeverCrystal_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/ElevatorLeverCrystal.ElevatorLeverCrystal.Name\n#: /Game/SO/Items/QuestItems/ElevatorLeverCrystal.ElevatorLeverCrystal.Name\nmsgctxt \"ItemData\"\nmsgid \"Elevator Crystal\"\nmsgstr \"Felvonó Kristály\"\n\n#. Key:\tFountainFlower_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/FountainFlower.FountainFlower.Description\n#: /Game/SO/Items/QuestItems/FountainFlower.FountainFlower.Description\nmsgctxt \"ItemData\"\nmsgid \"Flower acquired from a fountain.\"\nmsgstr \"Virág, amit egy Szökőkúttól kaptál.\"\n\n#. Key:\tFountainFlower_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/FountainFlower.FountainFlower.Name\n#: /Game/SO/Items/QuestItems/FountainFlower.FountainFlower.Name\nmsgctxt \"ItemData\"\nmsgid \"Fountain Flower\"\nmsgstr \"Virág a Szökőkútról\"\n\n#. Key:\tGateKeeperSeat_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/GateKeeperSeat.GateKeeperSeat.Description\n#: /Game/SO/Items/QuestItems/GateKeeperSeat.GateKeeperSeat.Description\nmsgctxt \"ItemData\"\nmsgid \"A simple seat of size XXXXXXXXXL\"\nmsgstr \"Egy sima mezei szék XXXXXXXXL méretben.\"\n\n#. Key:\tGateKeeperSeat_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/GateKeeperSeat.GateKeeperSeat.Name\n#: /Game/SO/Items/QuestItems/GateKeeperSeat.GateKeeperSeat.Name\nmsgctxt \"ItemData\"\nmsgid \"Giant Seat\"\nmsgstr \"Óriási Szék\"\n\n#. Key:\tKeyAADoorNearDungeonExit_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyAADoorNearDungeonExit.KeyAADoorNearDungeonExit.Description\n#: /Game/SO/Items/Keys/KeyAADoorNearDungeonExit.KeyAADoorNearDungeonExit.Description\nmsgctxt \"ItemData\"\nmsgid \"A key without a proper item description\"\nmsgstr \"Kulcs, megfelelő leírás nélkül\"\n\n#. Key:\tKeyAADoorNearDungeonExit_name\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyAADoorNearDungeonExit.KeyAADoorNearDungeonExit.Name\n#: /Game/SO/Items/Keys/KeyAADoorNearDungeonExit.KeyAADoorNearDungeonExit.Name\nmsgctxt \"ItemData\"\nmsgid \"Arcade Key\"\nmsgstr \"Árkád Kulcs\"\n\n#. Key:\tKeyAAFirstFight_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyAAFirstFight.KeyAAFirstFight.Description\n#: /Game/SO/Items/Keys/KeyAAFirstFight.KeyAAFirstFight.Description\nmsgctxt \"ItemData\"\nmsgid \"Weird\"\nmsgstr \"Fura\"\n\n#. Key:\tKeyAAFirstFight_name\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyAAFirstFight.KeyAAFirstFight.Name\n#: /Game/SO/Items/Keys/KeyAAFirstFight.KeyAAFirstFight.Name\nmsgctxt \"ItemData\"\nmsgid \"Weird Key\"\nmsgstr \"Fura Kulcs\"\n\n#. Key:\tKeyAAMainFirstDoor_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyAAMainFirstDoor.KeyAAMainFirstDoor.Description\n#: /Game/SO/Items/Keys/KeyAAMainFirstDoor.KeyAAMainFirstDoor.Description\nmsgctxt \"ItemData\"\nmsgid \"Sometimes the lock is harder to find than the key.\"\nmsgstr \"Néha a zárat nehezebb megtalálni, mint a kulcsot.\"\n\n#. Key:\tKeyAAMainFirstDoor_name\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyAAMainFirstDoor.KeyAAMainFirstDoor.Name\n#: /Game/SO/Items/Keys/KeyAAMainFirstDoor.KeyAAMainFirstDoor.Name\nmsgctxt \"ItemData\"\nmsgid \"Key of Something\"\nmsgstr \"Valaminek a Kulcsa\"\n\n#. Key:\tKeyAGPortalFight_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyAGPortalFight.KeyAGPortalFight.Description\n#: /Game/SO/Items/Keys/KeyAGPortalFight.KeyAGPortalFight.Description\nmsgctxt \"ItemData\"\nmsgid \"Just another key.\"\nmsgstr \"Még egy Kulcs.\"\n\n#. Key:\tKeyAGPortalFight_name\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyAGPortalFight.KeyAGPortalFight.Name\n#: /Game/SO/Items/Keys/KeyAGPortalFight.KeyAGPortalFight.Name\nmsgctxt \"ItemData\"\nmsgid \"Eastern Key\"\nmsgstr \"Keleti Kulcs\"\n\n#. Key:\tKeyBronze_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyBronze.KeyBronze.Description\n#: /Game/SO/Items/Keys/KeyBronze.KeyBronze.Description\nmsgctxt \"ItemData\"\nmsgid \"A reforged Bronze Key.\"\nmsgstr \"Egybe forrasztott Bronz Kulcs\"\n\n#. Key:\tKeyBronze_name\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyBronze.KeyBronze.Name\n#: /Game/SO/Items/Keys/KeyBronze.KeyBronze.Name\nmsgctxt \"ItemData\"\nmsgid \"Bronze Key\"\nmsgstr \"Bronz Kulcs\"\n\n#. Key:\tKeyCatacombs0_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyCatacombs0.KeyCatacombs0.Description\n#: /Game/SO/Items/Keys/KeyCatacombs0.KeyCatacombs0.Description\nmsgctxt \"ItemData\"\nmsgid \"There are a ridiculous amount of keys in this world, right?\"\nmsgstr \"Nevetségesen sok kulcs van ebben a világban, nem?\"\n\n#. Key:\tKeyCatacombs0_name\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyCatacombs0.KeyCatacombs0.Name\n#: /Game/SO/Items/Keys/KeyCatacombs0.KeyCatacombs0.Name\nmsgctxt \"ItemData\"\nmsgid \"Key Of The Room Below\"\nmsgstr \"Kulcs a Lenti Szobából\"\n\n#. Key:\tKeyCopper_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyCopper.KeyCopper.Description\n#: /Game/SO/Items/Keys/KeyCopper.KeyCopper.Description\nmsgctxt \"ItemData\"\nmsgid \"A reforged Copper Key.\"\nmsgstr \"Egybe forrasztott Réz Kulcs.\"\n\n#. Key:\tKeyCopper_name\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyCopper.KeyCopper.Name\n#: /Game/SO/Items/Keys/KeyCopper.KeyCopper.Name\nmsgctxt \"ItemData\"\nmsgid \"Copper Key\"\nmsgstr \"Réz Kulcs\"\n\n#. Key:\tKeyDCMainOut_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyDCMainOut.KeyDCMainOut.Description\n#: /Game/SO/Items/Keys/KeyDCMainOut.KeyDCMainOut.Description\nmsgctxt \"ItemData\"\nmsgid \"Just an old, rusty iron key without a proper item description\"\nmsgstr \"Csak egy régi, rozsdás kulcs, rendes leírás nélkül.\"\n\n#. Key:\tKeyDCMainOut_name\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyDCMainOut.KeyDCMainOut.Name\n#: /Game/SO/Items/Keys/KeyDCMainOut.KeyDCMainOut.Name\nmsgctxt \"ItemData\"\nmsgid \"Catacomb Key\"\nmsgstr \"Tárna Kulcs\"\n\n#. Key:\tKeyIron_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyIron.KeyIron.Description\n#: /Game/SO/Items/Keys/KeyIron.KeyIron.Description\nmsgctxt \"ItemData\"\nmsgid \"A reforged Iron Key.\"\nmsgstr \"Újrakovácsolt Vas Kulcs.\"\n\n#. Key:\tKeyIron_name\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyIron.KeyIron.Name\n#: /Game/SO/Items/Keys/KeyIron.KeyIron.Name\nmsgctxt \"ItemData\"\nmsgid \"Iron Key\"\nmsgstr \"Vas Kulcs\"\n\n#. Key:\tKeyMaster_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyMaster.KeyMaster.Description\n#: /Game/SO/Items/Keys/KeyMaster.KeyMaster.Description\nmsgctxt \"ItemData\"\nmsgid \"This key can be used to open any door equipped with a special kind of lock, but breaks during the process.\"\nmsgstr \"Ezzel a kulccsal egy speciális zárat tudsz kinyitni, de a kulcs eltörik, ha használod.\"\n\n#. Key:\tKeyMaster_name\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyMaster.KeyMaster.Name\n#: /Game/SO/Items/Keys/KeyMaster.KeyMaster.Name\nmsgctxt \"ItemData\"\nmsgid \"Master Key\"\nmsgstr \"Mester Kulcs\"\n\n#. Key:\tKeyMerchant_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyMerchant.KeyMerchant.Description\n#: /Game/SO/Items/Keys/KeyMerchant.KeyMerchant.Description\nmsgctxt \"ItemData\"\nmsgid \"Does it really work? You will find out soon...\"\nmsgstr \"Tényleg működik? Rövidesen kiderül...\"\n\n#. Key:\tKeyMerchant_name\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyMerchant.KeyMerchant.Name\n#: /Game/SO/Items/Keys/KeyMerchant.KeyMerchant.Name\nmsgctxt \"ItemData\"\nmsgid \"A very small key\"\nmsgstr \"Egy (tényleg) nagyon kicsi Kulcs\"\n\n#. Key:\tKeyOutpostWall_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyOutpostWall.KeyOutpostWall.Description\n#: /Game/SO/Items/Keys/KeyOutpostWall.KeyOutpostWall.Description\nmsgctxt \"ItemData\"\nmsgid \"Do you really read the key descriptions?\"\nmsgstr \"Hűha, valaki még mindig olvassa a kulcs leírásokat.\"\n\n#. Key:\tKeyOutpostWall_name\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyOutpostWall.KeyOutpostWall.Name\n#: /Game/SO/Items/Keys/KeyOutpostWall.KeyOutpostWall.Name\nmsgctxt \"ItemData\"\nmsgid \"Key Of The Outpost Wall\"\nmsgstr \"Helyőrség Fal Kulcs\"\n\n#. Key:\tKeyOutpostWallOptional_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyOutpostWallOptional.KeyOutpostWallOptional.Description\n#: /Game/SO/Items/Keys/KeyOutpostWallOptional.KeyOutpostWallOptional.Description\nmsgctxt \"ItemData\"\nmsgid \"I would rather sleep, but the item descriptions won't write themselves.\"\nmsgstr \"Már rég aludnom kéne, de sajna egyik tárgy leírás sem fogja magát megírni\"\n\n#. Key:\tKeyOutpostWallOptional_name\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyOutpostWallOptional.KeyOutpostWallOptional.Name\n#: /Game/SO/Items/Keys/KeyOutpostWallOptional.KeyOutpostWallOptional.Name\nmsgctxt \"ItemData\"\nmsgid \"Second Key Of The Outpost Wall\"\nmsgstr \"Második Helyőrség Fal Kulcs\"\n\n#. Key:\tKeyPiecesBronze0_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyPiecesBronze0.KeyPiecesBronze0.Description\n#: /Game/SO/Items/Keys/KeyPiecesBronze0.KeyPiecesBronze0.Description\nmsgctxt \"ItemData\"\nmsgid \"Half of a broken Bronze Key\"\nmsgstr \"Egy törött Bronz Kulcs egyik fele\"\n\n#. Key:\tKeyPiecesBronze0_name\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyPiecesBronze0.KeyPiecesBronze0.Name\n#: /Game/SO/Items/Keys/KeyPiecesBronze0.KeyPiecesBronze0.Name\nmsgctxt \"ItemData\"\nmsgid \"Half Bronze Key\"\nmsgstr \"Fél Bronz Kulcs\"\n\n#. Key:\tKeyPiecesCopper0_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyPiecesCopper0.KeyPiecesCopper0.Description\n#: /Game/SO/Items/Keys/KeyPiecesCopper0.KeyPiecesCopper0.Description\nmsgctxt \"ItemData\"\nmsgid \"Half of a broken Copper Key\"\nmsgstr \"Egy törött Réz Kulcs fele\"\n\n#. Key:\tKeyPiecesCopper0_name\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyPiecesCopper0.KeyPiecesCopper0.Name\n#: /Game/SO/Items/Keys/KeyPiecesCopper0.KeyPiecesCopper0.Name\nmsgctxt \"ItemData\"\nmsgid \"Half Copper Key\"\nmsgstr \"Fél Réz Kulcs\"\n\n#. Key:\tKeyPiecesIron0_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyPiecesIron0.KeyPiecesIron0.Description\n#: /Game/SO/Items/Keys/KeyPiecesIron0.KeyPiecesIron0.Description\nmsgctxt \"ItemData\"\nmsgid \"Half of a broken Iron Key\"\nmsgstr \"Egy törött Vas Kulcs egyik fele\"\n\n#. Key:\tKeyPiecesIron0_name\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyPiecesIron0.KeyPiecesIron0.Name\n#: /Game/SO/Items/Keys/KeyPiecesIron0.KeyPiecesIron0.Name\nmsgctxt \"ItemData\"\nmsgid \"Half Iron Key\"\nmsgstr \"Fél Vas Kulcs\"\n\n#. Key:\tKeySA_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/KeySA.KeySA.Description\n#: /Game/SO/Items/Keys/KeySA.KeySA.Description\nmsgctxt \"ItemData\"\nmsgid \"Looks like there are tons of these\"\nmsgstr \"Úgy látszik ezekből mindig van egy újabb\"\n\n#. Key:\tKeySA_name\n#. SourceLocation:\t/Game/SO/Items/Keys/KeySA.KeySA.Name\n#: /Game/SO/Items/Keys/KeySA.KeySA.Name\nmsgctxt \"ItemData\"\nmsgid \"Another Key\"\nmsgstr \"Egy mégmásikabb Kulcs\"\n\n#. Key:\tKeySASewerCreatureCell_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/KeySASewerCreatureCell.KeySASewerCreatureCell.Description\n#: /Game/SO/Items/Keys/KeySASewerCreatureCell.KeySASewerCreatureCell.Description\nmsgctxt \"ItemData\"\nmsgid \"A small key you got from the Pipe Walkers.\"\nmsgstr \"Kis Kulcs, amit a Battyogóktól kaptál.\"\n\n#. Key:\tKeyTLElevatorRoom_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyTLElevatorRoom.KeyTLElevatorRoom.Description\n#: /Game/SO/Items/Keys/KeyTLElevatorRoom.KeyTLElevatorRoom.Description\nmsgctxt \"ItemData\"\nmsgid \"A key without any sign of interest.\"\nmsgstr \"Egy Kulcs, mindenféle különösebb azonosítójel nélkül.\"\n\n#. Key:\tKeyTLElevatorRoom_name\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyTLElevatorRoom.KeyTLElevatorRoom.Name\n#: /Game/SO/Items/Keys/KeyTLElevatorRoom.KeyTLElevatorRoom.Name\nmsgctxt \"ItemData\"\nmsgid \"Unconcerned Key\"\nmsgstr \"Közönséges Kulcs\"\n\n#. Key:\tKeyWWFirstGate_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyWWFirstGate.KeyWWFirstGate.Description\n#: /Game/SO/Items/Keys/KeyWWFirstGate.KeyWWFirstGate.Description\nmsgctxt \"ItemData\"\nmsgid \"It will open a gate somewhere. Probably.\"\nmsgstr \"Egy zárat nyit valahol. Vélhetőleg.\"\n\n#. Key:\tKeyWWFirstGate_name\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyWWFirstGate.KeyWWFirstGate.Name\n#: /Game/SO/Items/Keys/KeyWWFirstGate.KeyWWFirstGate.Name\nmsgctxt \"ItemData\"\nmsgid \"Railway Gate Key\"\nmsgstr \"Állomás Kapu Kulcs\"\n\n#. Key:\tKeyWWPortal_desc\n#. SourceLocation:\t/Game/SO/Items/WhiteWallItems/KeyWWPortal.KeyWWPortal.Description\n#: /Game/SO/Items/WhiteWallItems/KeyWWPortal.KeyWWPortal.Description\nmsgctxt \"ItemData\"\nmsgid \"A fancy iron key with a shiny gem in its grip. It must be really precious.\"\nmsgstr \"Agyoncizellált vas kulcs, kis ékkő foglalattal. Biztos nagyon fontos lehet.\"\n\n#. Key:\tKeyWWPortal_name\n#. SourceLocation:\t/Game/SO/Items/WhiteWallItems/KeyWWPortal.KeyWWPortal.Name\n#: /Game/SO/Items/WhiteWallItems/KeyWWPortal.KeyWWPortal.Name\nmsgctxt \"ItemData\"\nmsgid \"Portal Key\"\nmsgstr \"Portál Kulcs\"\n\n#. Key:\tKEYWWSewerCreatureCell_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/KEYWWSewerCreatureCell.KEYWWSewerCreatureCell.Description\n#: /Game/SO/Items/Keys/KEYWWSewerCreatureCell.KEYWWSewerCreatureCell.Description\nmsgctxt \"ItemData\"\nmsgid \"A small key you got from a chest in the middle of nowhere.\"\nmsgstr \"Egy kis kulcs, amit egy ládában találtál a semmi közepén.\"\n\n#. Key:\tKEYWWSewerCreatureCell_name\n#. SourceLocation:\t/Game/SO/Items/Keys/KEYWWSewerCreatureCell.KEYWWSewerCreatureCell.Name\n#. Key:\tKeySASewerCreatureCell_name\n#. SourceLocation:\t/Game/SO/Items/Keys/KeySASewerCreatureCell.KeySASewerCreatureCell.Name\n#: /Game/SO/Items/Keys/KeySASewerCreatureCell.KeySASewerCreatureCell.Name\n#: /Game/SO/Items/Keys/KEYWWSewerCreatureCell.KEYWWSewerCreatureCell.Name\nmsgctxt \"ItemData\"\nmsgid \"Small Cell Key\"\nmsgstr \"Kis Ketrec Kulcs\"\n\n#. Key:\tKeyWWWhiteWall_desc\n#. SourceLocation:\t/Game/SO/Items/WhiteWallItems/KeyWWWhiteWall.KeyWWWhiteWall.Description\n#: /Game/SO/Items/WhiteWallItems/KeyWWWhiteWall.KeyWWWhiteWall.Description\nmsgctxt \"ItemData\"\nmsgid \"A robust iron key with a carved script: <Bold>'Outer Wall Tower'</>.\"\nmsgstr \"Méretes vas kulcs, rajta a következő felirat: <Bold>'Külső Fal Torony'</>.\"\n\n#. Key:\tKeyWWWhiteWall_name\n#. SourceLocation:\t/Game/SO/Items/WhiteWallItems/KeyWWWhiteWall.KeyWWWhiteWall.Name\n#: /Game/SO/Items/WhiteWallItems/KeyWWWhiteWall.KeyWWWhiteWall.Name\nmsgctxt \"ItemData\"\nmsgid \"White Wall Key\"\nmsgstr \"Fehér Fal Kulcs\"\n\n#. Key:\tKoboldCoin_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/KoboldCoin.KoboldCoin.Description\n#: /Game/SO/Items/QuestItems/KoboldCoin.KoboldCoin.Description\nmsgctxt \"ItemData\"\nmsgid \"Some Coins you found in a chest.\"\nmsgstr \"Néhány Aranytallér, amit egy ládában találtál.\"\n\n#. Key:\tKoboldCoin_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/KoboldCoin.KoboldCoin.Name\n#: /Game/SO/Items/QuestItems/KoboldCoin.KoboldCoin.Name\nmsgctxt \"ItemData\"\nmsgid \"Kobold Coins\"\nmsgstr \"Kobold Érmék\"\n\n#. Key:\tKoboldPotion_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/KoboldPotion.KoboldPotion.Description\n#: /Game/SO/Items/QuestItems/KoboldPotion.KoboldPotion.Description\nmsgctxt \"ItemData\"\nmsgid \"Weird liquid in a bottle. The kobold calls it Soup.\"\nmsgstr \"Fura lötty palackban. A kobold Levesnek hívta.\"\n\n#. Key:\tKoboldPotion_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/KoboldPotion.KoboldPotion.Name\n#: /Game/SO/Items/QuestItems/KoboldPotion.KoboldPotion.Name\nmsgctxt \"ItemData\"\nmsgid \"Kobold Soup\"\nmsgstr \"Kobold Leves\"\n\n#. Key:\tLavaGolemToken_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/LavaGolemToken.LavaGolemToken.Description\n#: /Game/SO/Items/QuestItems/LavaGolemToken.LavaGolemToken.Description\nmsgctxt \"ItemData\"\nmsgid \"A unique stone you can use to prove that you have eliminated a golem.\"\nmsgstr \"Egyedi azonosító kő, ami bizonyítja, hogy kiiktattál egy Gólemet.\"\n\n#. Key:\tLavaGolemToken_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/LavaGolemToken.LavaGolemToken.Name\n#: /Game/SO/Items/QuestItems/LavaGolemToken.LavaGolemToken.Name\nmsgctxt \"ItemData\"\nmsgid \"Stone Token\"\nmsgstr \"Kő Azonosító\"\n\n#. Key:\tLeafMace_desc\n#. SourceLocation:\t/Game/SO/Items/Weapons/LeafMace.LeafMace.Description\n#: /Game/SO/Items/Weapons/LeafMace.LeafMace.Description\nmsgctxt \"ItemData\"\nmsgid \"If someone would fail in cutting his/her/its way out of a hard situation, crushing your way through can still work out pretty well - it is said to be more effective if golems or certain mechanical devices / creatures are involved in the conflict.\"\nmsgstr \"Ha nem sikerül kivágnod magad egy kínos szituációból, még mindig megpróbálhatod kizúzni.\"\n\n#. Key:\tLeafMace_name\n#. SourceLocation:\t/Game/SO/Items/Weapons/LeafMace.LeafMace.Name\n#: /Game/SO/Items/Weapons/LeafMace.LeafMace.Name\nmsgctxt \"ItemData\"\nmsgid \"Leaf Mace\"\nmsgstr \"Buzogány\"\n\n#. Key:\tLEKeyCage_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/LEKeyCage.LEKeyCage.Description\n#: /Game/SO/Items/Keys/LEKeyCage.LEKeyCage.Description\nmsgctxt \"ItemData\"\nmsgid \"You won't believe it but it is a key for a cage.\"\nmsgstr \"Ez most meglepő lesz, de ez egy ketrec kulcsa.\"\n\n#. Key:\tLEKeyCage_name\n#. SourceLocation:\t/Game/SO/Items/Keys/LEKeyCage.LEKeyCage.Name\n#: /Game/SO/Items/Keys/LEKeyCage.LEKeyCage.Name\nmsgctxt \"ItemData\"\nmsgid \"Cage Key\"\nmsgstr \"Ketrec Kulcs\"\n\n#. Key:\tLETempleKey_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/LETempleKey.LETempleKey.Description\n#: /Game/SO/Items/Keys/LETempleKey.LETempleKey.Description\nmsgctxt \"ItemData\"\nmsgid \"This is one of the spare keys of the Ancient Temple. Just in case the original would be dropped into the lava accidentally.\"\nmsgstr \"Tartalék kulcs a Tűz Templomához, hátha az eredetit beleejtik a lávába, vagy valami.\"\n\n#. Key:\tLETempleKey_name\n#. SourceLocation:\t/Game/SO/Items/Keys/LETempleKey.LETempleKey.Name\n#: /Game/SO/Items/Keys/LETempleKey.LETempleKey.Name\nmsgctxt \"ItemData\"\nmsgid \"Ancient Temple Key\"\nmsgstr \"Tűz Templom Kulcs\"\n\n#. Key:\tLoryBooks_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/LoryBooks.LoryBooks.Description\n#: /Game/SO/Items/QuestItems/LoryBooks.LoryBooks.Description\nmsgctxt \"ItemData\"\nmsgid \"Two ancient books with the titles \\\"True value of your family\\\" and \\\"How much does a brother cost?\\\". They look boring so you decide not to open them.\"\nmsgstr \"Két poros könyv, név szerint \\\"Miért a Család a legfontosabb?\\\" és \\\"Mennyit ér egy testvér?\\\". Nem tűnnek túl érdekfeszítőnek, ezért nem nyitod ki őket.\"\n\n#. Key:\tLoryBooks_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/LoryBooks.LoryBooks.Name\n#: /Game/SO/Items/QuestItems/LoryBooks.LoryBooks.Name\nmsgctxt \"ItemData\"\nmsgid \"Old books\"\nmsgstr \"Régi Könyvek\"\n\n#. Key:\tMemoryCrystal1_desc\n#. SourceLocation:\t/Game/SO/Items/MemoryStone/MemoryCrystal1.MemoryCrystal1.Description\n#: /Game/SO/Items/MemoryStone/MemoryCrystal1.MemoryCrystal1.Description\nmsgctxt \"ItemData\"\nmsgid \"'According to the very few survivors, White Tower, our capital was completely destroyed by a magical phenomena called Ruin. At that time I was at Grey Gate so I can't tell anything for sure.'\\r\\n\\r\\nThe Last Sane Golem Maker, A.C. 16. September 4.\"\nmsgstr \"\\\"Néhány menekült szerint a fővárost, Fehérvárat teljesen elpusztította a Fertőzésnek nevezett természetfeletti jelenség. Ebben az időben Kék Kapuban tartózkodtam, még nem tudok semmi biztosat.\\n\\nAz Utolsó Épelméjű Gólem Készítő, K.U. 16. Szept. 4.\"\n\n#. Key:\tMemoryCrystal1_name\n#. SourceLocation:\t/Game/SO/Items/MemoryStone/MemoryCrystal1.MemoryCrystal1.Name\n#: /Game/SO/Items/MemoryStone/MemoryCrystal1.MemoryCrystal1.Name\nmsgctxt \"ItemData\"\nmsgid \"Magical Phenomena\"\nmsgstr \"Természetfeletti Jelenség\"\n\n#. Key:\tMemoryCrystal2_desc\n#. SourceLocation:\t/Game/SO/Items/MemoryStone/MemoryCrystal2.MemoryCrystal2.Description\n#: /Game/SO/Items/MemoryStone/MemoryCrystal2.MemoryCrystal2.Description\nmsgctxt \"ItemData\"\nmsgid \"'Those who escaped Ruin have... changed.'\\r\\n'I've met a scientist who noticed how madness takes control over him. Perhaps he can find a solution.'\\r\\n\\r\\nThe Last Sane Golem Maker, A.C. 17. January 1.\"\nmsgstr \"\\\"Akiknek sikerült kimenekülni a Fertőzésből, azok... megváltoztak.\\n\\\"Találkoztam egy tudóssal, aki a saját elméjének elváltozását tanulmányozza. Ha valaki talál megoldást a Fertőzés okozta őrültségre, akkor az jó eséllyel ő lesz.\\\"\\n\\nAz Utolsó Épelméjű Gólem Készítő, K.U. 17. Jan. 1.\"\n\n#. Key:\tMemoryCrystal2_name\n#. SourceLocation:\t/Game/SO/Items/MemoryStone/MemoryCrystal2.MemoryCrystal2.Name\n#: /Game/SO/Items/MemoryStone/MemoryCrystal2.MemoryCrystal2.Name\nmsgctxt \"ItemData\"\nmsgid \"Degeneration and mutation\"\nmsgstr \"Degeneráció és mutáció\"\n\n#. Key:\tMemoryCrystal3_desc\n#. SourceLocation:\t/Game/SO/Items/MemoryStone/MemoryCrystal3.MemoryCrystal3.Description\n#: /Game/SO/Items/MemoryStone/MemoryCrystal3.MemoryCrystal3.Description\nmsgctxt \"ItemData\"\nmsgid \"'It's hard to tell but I think colours are fading away. The World was brighter before.'\\r\\n'The Monk won't help me. He stubbornly believes we are doomed.'\\r\\n\\r\\nThe Last Sane Golem Maker, A.C. 17. March 11.\"\nmsgstr \"\\\"Nehéz megítélni, de azt hiszem, a színek egyre fakóbbak. A Világ színesebb volt ezelőtt.\\\"\\n\\\"Szerzetes nem fog segíteni. A rögeszméje, hogy a Világunk halálra van ítélve.\\\"\\n\\nAz Utolsó Épelméjű Gólem Készítő, K.U. 17. Márc. 11.\"\n\n#. Key:\tMemoryCrystal3_name\n#. SourceLocation:\t/Game/SO/Items/MemoryStone/MemoryCrystal3.MemoryCrystal3.Name\n#: /Game/SO/Items/MemoryStone/MemoryCrystal3.MemoryCrystal3.Name\nmsgctxt \"ItemData\"\nmsgid \"Fading Colours\"\nmsgstr \"Fakuló Színek\"\n\n#. Key:\tMemoryCrystal4_desc\n#. SourceLocation:\t/Game/SO/Items/MemoryStone/MemoryCrystal4.MemoryCrystal4.Description\n#: /Game/SO/Items/MemoryStone/MemoryCrystal4.MemoryCrystal4.Description\nmsgctxt \"ItemData\"\nmsgid \"'Madness takes control over those who get too close to Ruin.'\\r\\n'Maintainers forgot to speak. I understand some of the phrases they try to say: \\\"Dinner is served\\\", \\\"At your service\\\", \\\"Your order\\\" - a mockery of their former intelligence!'\\r\\n\\r\\nThe Last Sane Golem Maker, A.C. 21. January 26.\"\nmsgstr \"\\\"Akik túl közel kerülnek a Fertőzéshez, idővel megőrülnek.\\\"\\n\\n\\\"A Karbantartók elvesztették a beszéd képességét. Makogásuk egykori intelligenciájuk kigúnyolása csupán.\\n\\nAz Utolsó Épelméjű Gólem Készítő, K.U. 21. Jan. 26.\"\n\n#. Key:\tMemoryCrystal4_name\n#. SourceLocation:\t/Game/SO/Items/MemoryStone/MemoryCrystal4.MemoryCrystal4.Name\n#: /Game/SO/Items/MemoryStone/MemoryCrystal4.MemoryCrystal4.Name\nmsgctxt \"ItemData\"\nmsgid \"Madness\"\nmsgstr \"Őrület\"\n\n#. Key:\tMemoryCrystal5_desc\n#. SourceLocation:\t/Game/SO/Items/MemoryStone/MemoryCrystal5.MemoryCrystal5.Description\n#: /Game/SO/Items/MemoryStone/MemoryCrystal5.MemoryCrystal5.Description\nmsgctxt \"ItemData\"\nmsgid \"'Now I have seen it with my own eyes: the touch of the Ruin makes the World literally fall apart.'\\r\\n\\r\\nThe Last Sane Golem Maker, A.C. 25. September 4.\"\nmsgstr \"\\\"Tényleg igaz: a Fertőzés szó szerint darabokra szedi a Világot.\\\"\\n\\nAz Utolsó Épelméjű Gólem Készítő, K.U. 25. Szept. 4.\"\n\n#. Key:\tMemoryCrystal5_name\n#. SourceLocation:\t/Game/SO/Items/MemoryStone/MemoryCrystal5.MemoryCrystal5.Name\n#: /Game/SO/Items/MemoryStone/MemoryCrystal5.MemoryCrystal5.Name\nmsgctxt \"ItemData\"\nmsgid \"Falling Apart\"\nmsgstr \"Darabokra Hullva\"\n\n#. Key:\tMemoryCrystal6_desc\n#. SourceLocation:\t/Game/SO/Items/MemoryStone/MemoryCrystal6.MemoryCrystal6.Description\n#: /Game/SO/Items/MemoryStone/MemoryCrystal6.MemoryCrystal6.Description\nmsgctxt \"ItemData\"\nmsgid \"'This is my 87 birthday. It's obvious that my body doesn't get older with time. How long can I preserve my sanity?'\\r\\n'Drones can no longer be trusted. They resisted Ruin for the longest.'\\r\\n\\r\\nThe Last Sane Golem Maker, A.C. 52. July 9.\"\nmsgstr \"\\\"Ma van a 87. szülinapom. Egyértelmű, hogy a testemen nem fog az idő. De vajon az elmémet sem kezdi ki?\\\"\\n\\\"A Drónok már nem beszámíthatóak. Pedig ők álltak ellen a legtovább a Fertőzésnek.\\\"\\n\\nAz Utolsó Épelméjű Gólem Készítő, K.U. 52. Júl. 9.\"\n\n#. Key:\tMemoryCrystal6_name\n#. SourceLocation:\t/Game/SO/Items/MemoryStone/MemoryCrystal6.MemoryCrystal6.Name\n#: /Game/SO/Items/MemoryStone/MemoryCrystal6.MemoryCrystal6.Name\nmsgctxt \"ItemData\"\nmsgid \"Preservation of Ruin\"\nmsgstr \"A Fertőzés Oltalmazó ereje\"\n\n#. Key:\tMemoryCrystal7_desc\n#. SourceLocation:\t/Game/SO/Items/MemoryStone/MemoryCrystal7.MemoryCrystal7.Description\n#: /Game/SO/Items/MemoryStone/MemoryCrystal7.MemoryCrystal7.Description\nmsgctxt \"ItemData\"\nmsgid \"'Ruin will soon reach Grey Gate, our very last city. I need to move deeper into the Realm, further away from Ruin.'\\r\\n'I decided to create some new golems. Golems that resist Ruin.'\\r\\n\\r\\nThe Last Sane Golem Maker, A.C. 315. April 8.\"\nmsgstr \"\\\"A Fertőzés Rövidesen eléri Kék Kaput, az utolsó városunkat. Tovább kell mennem, messzebb a Fertőzéstől.\\\"\\n\\\"Úgy döntöttem, Gólemeket fogok készíteni. Gólemeket, amik ellenállnak a Fertőzésnek.\\\"\\n\\nAz Utolsó Épelméjű Gólem Készítő, K.U. 315. Ápr. 8.\"\n\n#. Key:\tMemoryCrystal7_name\n#. SourceLocation:\t/Game/SO/Items/MemoryStone/MemoryCrystal7.MemoryCrystal7.Name\n#: /Game/SO/Items/MemoryStone/MemoryCrystal7.MemoryCrystal7.Name\nmsgctxt \"ItemData\"\nmsgid \"New Hope\"\nmsgstr \"Új Remény\"\n\n#. Key:\tMemoryCrystal8_desc\n#. SourceLocation:\t/Game/SO/Items/MemoryStone/MemoryCrystal8.MemoryCrystal8.Description\n#: /Game/SO/Items/MemoryStone/MemoryCrystal8.MemoryCrystal8.Description\nmsgctxt \"ItemData\"\nmsgid \"'I don't think I can keep up. There are times when I no longer know what I'm doing. I still have clear moments but they become more and more rare. I've recorded my memories to keep them safe.'\\r\\n\\r\\nThe Last Sane Golem Maker, about A.C. 500.\\r\\n\"\nmsgstr \"Már nem bírom sokáig. Vannak idők, amikor fogalmam sincs, mit miért csinálok. Egyre ritkábbak a tiszta pillanatok. Rögzítettem az emlékeimet, hátha valakinek számítanak még.\\n\\nAz Utolsó Épelméjű Gólem Készítő, K.U. 500.\\n\"\n\n#. Key:\tMemoryCrystal8_name\n#. SourceLocation:\t/Game/SO/Items/MemoryStone/MemoryCrystal8.MemoryCrystal8.Name\n#: /Game/SO/Items/MemoryStone/MemoryCrystal8.MemoryCrystal8.Name\nmsgctxt \"ItemData\"\nmsgid \"Final Decision\"\nmsgstr \"Végrendelet\"\n\n#. Key:\tPergamen_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/Pergamen.Pergamen.Description\n#: /Game/SO/Items/QuestItems/Pergamen.Pergamen.Description\nmsgctxt \"ItemData\"\nmsgid \"'This chest and everything inside belongs to me, the Chef.'\"\nmsgstr \"\\\"A láda minden ingóságával az én (Kobold Szakács) tulajdonomat képezi.\\\"\"\n\n#. Key:\tPergamen_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/Pergamen.Pergamen.Name\n#: /Game/SO/Items/QuestItems/Pergamen.Pergamen.Name\nmsgctxt \"ItemData\"\nmsgid \"Parchment\"\nmsgstr \"Pergamen\"\n\n#. Key:\tPortalGem_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/PortalGem.PortalGem.Description\n#: /Game/SO/Items/QuestItems/PortalGem.PortalGem.Description\nmsgctxt \"ItemData\"\nmsgid \"There are so many stones around. You are still not sure what's the point of picking up some of them.\"\nmsgstr \"Annyi kő van itt mindenfelé. Mi értelme volt pont ezt felvenni?\"\n\n#. Key:\tPortalGem_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/PortalGem.PortalGem.Name\n#: /Game/SO/Items/QuestItems/PortalGem.PortalGem.Name\nmsgctxt \"ItemData\"\nmsgid \"Lock Gem\"\nmsgstr \"Zár Kő\"\n\n#. Key:\tPotionOfWorthiness_desc\n#. SourceLocation:\t/Game/SO/Items/Useable/PotionOfWorthiness.PotionOfWorthiness.Description\n#: /Game/SO/Items/Useable/PotionOfWorthiness.PotionOfWorthiness.Description\nmsgctxt \"ItemData\"\nmsgid \"This might not be the weirdest side effect one can have when drinking something suspicious but it is definitely in the top five.\"\nmsgstr \"Lehet nem ez a legfurább, ami azután történik veled, hogy megiszol valami gyanús löttyöt, de azért biztos benne van az első 5-ben.\"\n\n#. Key:\tPotionOfWorthiness_name\n#. SourceLocation:\t/Game/SO/Items/Useable/PotionOfWorthiness.PotionOfWorthiness.Name\n#: /Game/SO/Items/Useable/PotionOfWorthiness.PotionOfWorthiness.Name\nmsgctxt \"ItemData\"\nmsgid \"Potion Of Worthiness\"\nmsgstr \"A Méltóság Itala\"\n\n#. Key:\tPurpleMushroom_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/PurpleMushroom.PurpleMushroom.Description\n#: /Game/SO/Items/QuestItems/PurpleMushroom.PurpleMushroom.Description\nmsgctxt \"ItemData\"\nmsgid \"The most purple mushrooms you could find. You hope these will be enough.\"\nmsgstr \"A legrózsaszínűbb gomba, amit csak találni tudtál. Reméled jó lesz.\"\n\n#. Key:\tPurpleMushroom_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/PurpleMushroom.PurpleMushroom.Name\n#: /Game/SO/Items/QuestItems/PurpleMushroom.PurpleMushroom.Name\nmsgctxt \"ItemData\"\nmsgid \"Purple Mushrooms\"\nmsgstr \"Rózsaszín Gombák\"\n\n#. Key:\tRavenFeather_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/RavenFeather.RavenFeather.Description\n#: /Game/SO/Items/QuestItems/RavenFeather.RavenFeather.Description\nmsgctxt \"ItemData\"\nmsgid \"A magical item which gives you the ability to fly... or something like that.\"\nmsgstr \"Mágikus eszköz, ami képessé tesz repülni... vagy valami ilyesmi.\"\n\n#. Key:\tRavenFeather_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/RavenFeather.RavenFeather.Name\n#: /Game/SO/Items/QuestItems/RavenFeather.RavenFeather.Name\nmsgctxt \"ItemData\"\nmsgid \"Raven Feather\"\nmsgstr \"Holló Toll\"\n\n#. Key:\tRope_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/Rope.Rope.Description\n#: /Game/SO/Items/QuestItems/Rope.Rope.Description\nmsgctxt \"ItemData\"\nmsgid \"You do wonder when the area is full of ropes why this is the only one which can be taken...\"\nmsgstr \"Rejtélyes kérdés, miért csak ezt lehet felvenni, amikor az egész környék tele van kötéllel.\"\n\n#. Key:\tRope_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/Rope.Rope.Name\n#: /Game/SO/Items/QuestItems/Rope.Rope.Name\nmsgctxt \"ItemData\"\nmsgid \"Rope\"\nmsgstr \"Kötél\"\n\n#. Key:\tRuneStoneBonusHPMagical_desc\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneBonusHPMagical.RuneStoneBonusHPMagical.Description\n#: /Game/SO/Items/RuneStones/RuneStoneBonusHPMagical.RuneStoneBonusHPMagical.Description\nmsgctxt \"ItemData\"\nmsgid \"Absorbs <Blue>30</> magical damage.\"\nmsgstr \"Elnyel <Blue>30</> mágikus sebzést.\"\n\n#. Key:\tRuneStoneBonusHPMagical_name\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneBonusHPMagical.RuneStoneBonusHPMagical.Name\n#: /Game/SO/Items/RuneStones/RuneStoneBonusHPMagical.RuneStoneBonusHPMagical.Name\nmsgctxt \"ItemData\"\nmsgid \"Bluestone\"\nmsgstr \"Kékkő\"\n\n#. Key:\tRuneStoneBonusHPPhysical_desc\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneBonusHPPhysical.RuneStoneBonusHPPhysical.Description\n#: /Game/SO/Items/RuneStones/RuneStoneBonusHPPhysical.RuneStoneBonusHPPhysical.Description\nmsgctxt \"ItemData\"\nmsgid \"Absorbs <White>30</> physical damage.\"\nmsgstr \"Elnyel <White>30</> fizikális sebzést.\"\n\n#. Key:\tRuneStoneBonusHPPhysical_name\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneBonusHPPhysical.RuneStoneBonusHPPhysical.Name\n#: /Game/SO/Items/RuneStones/RuneStoneBonusHPPhysical.RuneStoneBonusHPPhysical.Name\nmsgctxt \"ItemData\"\nmsgid \"Graystone\"\nmsgstr \"Szürkekő\"\n\n#. Key:\tRuneStoneBounce_desc\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.Description\n#. Key:\tRuneStoneBounce_level_desc_0\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.LevelBasedDescOverride(0).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.Description\n#: /Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.LevelBasedDescOverride(0).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Provides the ability to bounce from enemies for <Green>8</> seconds. Doing so causes <Blue>12</> damage to the target.\"\nmsgstr \"Képessé tesz pattani ellenfeleidről <Green>8</> másodpercig. Minden pattanás <Blue>12</> sebzést okoz.\"\n\n#. Key:\tRuneStoneBounce_level_desc_1\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.LevelBasedDescOverride(1).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.LevelBasedDescOverride(1).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Provides the ability to bounce from enemies for <Green>16</> seconds. Doing so causes <Blue>18</> damage to the target.\"\nmsgstr \"Képessé tesz pattani ellenfeleidről <Green>16</> másodpercig. Minden pattanás <Blue>18</> sebzést okoz.\"\n\n#. Key:\tRuneStoneBounce_level_desc_2\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.LevelBasedDescOverride(2).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.LevelBasedDescOverride(2).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Provides the ability to bounce from enemies for <Green>16</> seconds. Doing so causes <Blue>18</> damage and applies <Yellow>Stun</> on the target.\"\nmsgstr \"Képessé tesz pattani ellenfeleidről <Green>16</> másodpercig. Minden pattanás <Blue>18</> sebzést okoz, és <Yellow>Kábít</>.\"\n\n#. Key:\tRuneStoneBounce_level_desc_3\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.LevelBasedDescOverride(3).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.LevelBasedDescOverride(3).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Provides the ability to bounce from enemies for <Green>16</> seconds. Doing so causes <Blue>24</> damage and applies <Yellow>Stun</> on the target.\"\nmsgstr \"Képessé tesz pattanni az ellenfeleidről <Green>16</> másodpercig. Minden pattanás <Blue>24</> sebzést okoz, és <Yellow>Kábítja</> az ellenfelet.\"\n\n#. Key:\tRuneStoneBounce_level_desc_4\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.LevelBasedDescOverride(4).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.LevelBasedDescOverride(4).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Provides the ability to bounce from enemies for <Green>16</> seconds. Doing so causes <Blue>30</> damage and applies <Yellow>Stun</> on the target.\"\nmsgstr \"Képessé tesz pattani ellenfeleidről <Green>16</> másodpercig. Minden pattanás <Blue>30</> sebzést okoz, és <Yellow>Kábít</>.\"\n\n#. Key:\tRuneStoneBounce_level_up_desc_0\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.LevelUpBasedDescOverride(0).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.LevelUpBasedDescOverride(0).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Provides the ability to bounce from enemies for <Green>8</><YellowH>(→16)</> seconds. Doing so causes <Blue>12</><YellowH>(→18)</> damage to the target.\"\nmsgstr \"Képessé tesz pattani ellenfeleidről <Green>8</><YellowH>(→16)</> másodpercig. Minden pattanás <Blue>12</><YellowH>(→18)</> sebzést okoz.\"\n\n#. Key:\tRuneStoneBounce_level_up_desc_1\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.LevelUpBasedDescOverride(1).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.LevelUpBasedDescOverride(1).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Provides the ability to bounce from enemies for <Green>16</> seconds. Doing so causes <Blue>18</> damage <YellowH>and applies Stun on the target.</>\"\nmsgstr \"Képessé tesz pattani ellenfeleidről <Green>16</> másodpercig. Minden pattanás <Blue>18</> sebzést okoz, és <Yellow>Kábít</>.\"\n\n#. Key:\tRuneStoneBounce_level_up_desc_2\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.LevelUpBasedDescOverride(2).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.LevelUpBasedDescOverride(2).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Provides the ability to bounce from enemies for <Green>16</> seconds. Doing so causes <Blue>18</><YellowH>(→24)</> damage and applies <Yellow>Stun</> on the target.\"\nmsgstr \"Képessé tesz pattani ellenfeleidről <Green>16</> másodpercig. Minden pattanás <Blue>18</><YellowH>(→24)</> sebzést okoz, és <Yellow>Kábít</>.\"\n\n#. Key:\tRuneStoneBounce_level_up_desc_3\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.LevelUpBasedDescOverride(3).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.LevelUpBasedDescOverride(3).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Provides the ability to bounce from enemies for <Green>16</> seconds. Doing so causes <Blue>24</><YellowH>(→30)</> damage and applies <Yellow>Stun</> on the target.\"\nmsgstr \"Képessé tesz pattanni ellenfeleidről <Green>16</> másodpercig. Minden pattanás <Blue>24</><YellowH>(→30)</> sebzést okoz és <Yellow>Kábít</>.\"\n\n#. Key:\tRuneStoneBounce_name\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.Name\n#: /Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.Name\nmsgctxt \"ItemData\"\nmsgid \"Bouncestone\"\nmsgstr \"Pattogáskő\"\n\n#. Key:\tRuneStoneEnergy_desc\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneEnergy.RuneStoneEnergy.Description\n#: /Game/SO/Items/RuneStones/RuneStoneEnergy.RuneStoneEnergy.Description\nmsgctxt \"ItemData\"\nmsgid \"Strikes and spell cooldowns are decreased by 90% for 10 seconds.\"\nmsgstr \"Minden csapás és varázslat visszatöltődési ideje 90%-kal csökken 10 mp-ig.\"\n\n#. Key:\tRuneStoneEnergy_name\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneEnergy.RuneStoneEnergy.Name\n#: /Game/SO/Items/RuneStones/RuneStoneEnergy.RuneStoneEnergy.Name\nmsgctxt \"ItemData\"\nmsgid \"Energystone\"\nmsgstr \"Energiakő\"\n\n#. Key:\tRuneStoneFire0_desc\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneFire0.RuneStoneFire0.Description\n#. Key:\tRuneStoneFire0_level_desc_0\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneFire0.RuneStoneFire0.LevelBasedDescOverride(0).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneFire0.RuneStoneFire0.Description\n#: /Game/SO/Items/RuneStones/RuneStoneFire0.RuneStoneFire0.LevelBasedDescOverride(0).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons a powerful blast roasting anything in a straight line.\\nCauses <Blue>16</> damage.\"\nmsgstr \"Tűzcsóvát idéz, megpirítva mindent, ami az útjába akad. \\n<Blue>16</> sebzést okoz.\"\n\n#. Key:\tRuneStoneFire0_level_desc_1\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneFire0.RuneStoneFire0.LevelBasedDescOverride(1).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneFire0.RuneStoneFire0.LevelBasedDescOverride(1).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons a powerful blast roasting anything in a straight line.\\nCauses <Blue>32</> damage.\"\nmsgstr \"Tűzcsóvát idéz, megpirítva mindent, ami az útjába akad.\\n<Blue>32</> sebzést okoz.\"\n\n#. Key:\tRuneStoneFire0_level_desc_2\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneFire0.RuneStoneFire0.LevelBasedDescOverride(2).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneFire0.RuneStoneFire0.LevelBasedDescOverride(2).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons a powerful blast roasting anything in a straight line.\\nCauses <Blue>36</> damage. The spell has <Green>50%</> chance to <Purple>Instant Recharge.</>\"\nmsgstr \"Tűzcsóvát idéz, megpirítva mindent, ami az útjába akad.\\n<Blue>36</> sebzést okoz. <Green>50%</> eséllyel <Purple>Azonnal Visszatöltődik.</>\"\n\n#. Key:\tRuneStoneFire0_level_desc_3\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneFire0.RuneStoneFire0.LevelBasedDescOverride(3).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneFire0.RuneStoneFire0.LevelBasedDescOverride(3).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons a powerful blast roasting anything in a straight line.\\nCauses <Blue>52</> damage. The spell has <Green>50%</> chance to <Purple>Instant Recharge.</>\"\nmsgstr \"Tűzcsóvát idéz, megpirítva mindent, ami az útjába akad. \\n<Blue>52</> sebzést okoz. <Green>50%</> eséllyel <Purple> Azonnal Visszatöltődik</>\"\n\n#. Key:\tRuneStoneFire0_level_up_desc_0\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneFire0.RuneStoneFire0.LevelUpBasedDescOverride(0).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneFire0.RuneStoneFire0.LevelUpBasedDescOverride(0).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons a powerful blast roasting anything in a straight line.\\nCauses <Blue>16</><YellowH>(→32)</> damage.\"\nmsgstr \"Tűzcsóvát idéz, megpirítva mindent, ami az útjába akad.\\n<Blue>16</><YellowH>(→32)</> sebzést okoz.\"\n\n#. Key:\tRuneStoneFire0_level_up_desc_1\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneFire0.RuneStoneFire0.LevelUpBasedDescOverride(1).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneFire0.RuneStoneFire0.LevelUpBasedDescOverride(1).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons a powerful blast roasting anything in a straight line.\\nCauses <Blue>32</><YellowH>(→36)</> damage. <YellowH>The spell has </><GreenH>50%</> <YellowH>chance to </><PurpleH>Instant Recharge.</>\"\nmsgstr \"Tűzcsóvát idéz, megpirítva mindent, ami az útjába akad.\\n<Blue>32</><YellowH>(→36)</> sebzést okoz. </><GreenH>50%</> eséllyel <PurpleH>Azonnal Visszatöltődik.</>\"\n\n#. Key:\tRuneStoneFire0_level_up_desc_2\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneFire0.RuneStoneFire0.LevelUpBasedDescOverride(2).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneFire0.RuneStoneFire0.LevelUpBasedDescOverride(2).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons a powerful blast roasting anything in a straight line.\\nCauses <Blue>36</><YellowH>(→52)</> damage. The spell has <Green>50%</> chance to <Purple>Instant Recharge.</>\"\nmsgstr \"Tűzcsóvát idéz, megpirítva mindent, ami az útjába akad.\\n<Blue>36</><YellowH>(→52)</> sebzést okoz. <Green>50%</> eséllyel <Purple>Azonnal Visszatöltődik.</>\"\n\n#. Key:\tRuneStoneFire0_name\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneFire0.RuneStoneFire0.Name\n#: /Game/SO/Items/RuneStones/RuneStoneFire0.RuneStoneFire0.Name\nmsgctxt \"ItemData\"\nmsgid \"Firestone\"\nmsgstr \"Tűz Kő\"\n\n#. Key:\tRuneStoneHeal_desc\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneHeal.RuneStoneHeal.Description\n#: /Game/SO/Items/RuneStones/RuneStoneHeal.RuneStoneHeal.Description\nmsgctxt \"ItemData\"\nmsgid \"Restores <Green>30</> health points.\"\nmsgstr \"Visszaad <Green>30</> életerőt.\"\n\n#. Key:\tRuneStoneHeal_name\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneHeal.RuneStoneHeal.Name\n#: /Game/SO/Items/RuneStones/RuneStoneHeal.RuneStoneHeal.Name\nmsgctxt \"ItemData\"\nmsgid \"Healstone\"\nmsgstr \"Gyógykő\"\n\n#. Key:\tRuneStoneLightningWalk_desc\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneLightningWalk.RuneStoneLightningWalk.Description\n#: /Game/SO/Items/RuneStones/RuneStoneLightningWalk.RuneStoneLightningWalk.Description\nmsgctxt \"ItemData\"\nmsgid \"Grants the shocking ability to walk through your enemies for <Green>2</> sec. The shock causes <Blue>10</> damage.\"\nmsgstr \"Képessé tesz átmenni ellenfeleiden <Green>2</> másodpercig. Ezen felül <Blue>10</> sebzést okoz annak, akin átmész.\"\n\n#. Key:\tRuneStoneLightningWalk_level_desc_0\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneLightningWalk.RuneStoneLightningWalk.LevelBasedDescOverride(0).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneLightningWalk.RuneStoneLightningWalk.LevelBasedDescOverride(0).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Grants the shocking ability to walk through your enemies for <Green>2</> sec. The shock causes <Blue>16</> damage.\"\nmsgstr \"Képessé tesz átmenni ellenfeleiden <Green>2</> másodpercig. Ezen felül <Blue>16</> sebzést okoz annak, akin átmész.\"\n\n#. Key:\tRuneStoneLightningWalk_level_desc_1\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneLightningWalk.RuneStoneLightningWalk.LevelBasedDescOverride(1).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneLightningWalk.RuneStoneLightningWalk.LevelBasedDescOverride(1).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Grants the shocking ability to walk through your enemies for <Green>3</> sec. The shock causes <Blue>28</> damage.\"\nmsgstr \"Képessé tesz átmenni ellenfeleiden <Green>3</> másodpercig. Az áthaladás <Blue>28</> sebzést okoz ellenfelednek.\"\n\n#. Key:\tRuneStoneLightningWalk_level_desc_2\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneLightningWalk.RuneStoneLightningWalk.LevelBasedDescOverride(2).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneLightningWalk.RuneStoneLightningWalk.LevelBasedDescOverride(2).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Grants the shocking ability to walk through your enemies for <Green>4</> sec. The shock causes <Blue>32</> damage and has a <Green>30%</> chance to <Yellow>stun</> the target.\"\nmsgstr \"Képessé tesz átmenni ellenfeleiden <Green>4</> másodpercig. Ezen felül <Blue>32</> sebzést okoz annak, akin átmész, és <Green>30%</>eséllyel <Yellow>Kábít</>.\"\n\n#. Key:\tRuneStoneLightningWalk_level_desc_3\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneLightningWalk.RuneStoneLightningWalk.LevelBasedDescOverride(3).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneLightningWalk.RuneStoneLightningWalk.LevelBasedDescOverride(3).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Grants the shocking ability to walk through your enemies for <Green>4</> sec. The shock causes <Blue>32</> damage and has a <Green>40%</> chance to <Yellow>stun</> the target.\"\nmsgstr \"Képessé tesz átmenni ellenfeleiden <Green>4</> másodpercig. Ezen felül <Blue>32</> sebzést okoz annak, akin átmész, és <Green>40%</>eséllyel <Yellow>Kábít</>.\"\n\n#. Key:\tRuneStoneLightningWalk_level_up_desc_0\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneLightningWalk.RuneStoneLightningWalk.LevelUpBasedDescOverride(0).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneLightningWalk.RuneStoneLightningWalk.LevelUpBasedDescOverride(0).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Grants the shocking ability to walk through your enemies for <Green>2</><YellowH>(→3)</> sec. The shock causes <Blue>16</> <YellowH>(→28)</>damage.\"\nmsgstr \"Képessé tesz átmenni ellenfeleiden <Green>2</><YellowH>(→3)</> másodpercig. Ezen felül <Blue>16</> <YellowH>(→28)</> sebzést okoz annak, akin átmész.\"\n\n#. Key:\tRuneStoneLightningWalk_level_up_desc_1\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneLightningWalk.RuneStoneLightningWalk.LevelUpBasedDescOverride(1).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneLightningWalk.RuneStoneLightningWalk.LevelUpBasedDescOverride(1).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Grants the shocking ability to walk through your enemies for <Green>3</><YellowH>(→4)</> sec. The shock causes <Blue>28</> <YellowH>(→36)</>damage <YellowH>and has a </><GreenH>30%</> <YellowH>chance to stun the target.</>\"\nmsgstr \"Képessé tesz áthaladni ellenfeleiden <Green>3</><YellowH>(→4)</> mp-ig. Emellett <Blue>28</> <YellowH>(→36)</> sebzést okoz <YellowH>és </><GreenH>30%</> <YellowH>eséllyel elkábítja az ellent.</>\"\n\n#. Key:\tRuneStoneLightningWalk_level_up_desc_2\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneLightningWalk.RuneStoneLightningWalk.LevelUpBasedDescOverride(2).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneLightningWalk.RuneStoneLightningWalk.LevelUpBasedDescOverride(2).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Grants the shocking ability to walk through your enemies for <Green>4</> sec. The shock causes <Blue>32</> damage and has a <Green>30%</> <YellowH>(→40%)</> chance to <Yellow>stun</> the target.\"\nmsgstr \"Képessé tesz átmenni ellenfeleiden <Green>4</> másodpercig. Ezen felül <Blue>32</> sebzést okoz annak, akin átmész, és a <Green>30%</> <YellowH>(→40%)</> eséllyel <Yellow>Kábít</>.\"\n\n#. Key:\tRuneStoneLightningWalk_name\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneLightningWalk.RuneStoneLightningWalk.Name\n#: /Game/SO/Items/RuneStones/RuneStoneLightningWalk.RuneStoneLightningWalk.Name\nmsgctxt \"ItemData\"\nmsgid \"Lightningstone\"\nmsgstr \"Villámkő\"\n\n#. Key:\tRuneStoneMagicMissle_desc\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMagicMissle.RuneStoneMagicMissle.Description\n#: /Game/SO/Items/RuneStones/RuneStoneMagicMissle.RuneStoneMagicMissle.Description\nmsgctxt \"ItemData\"\nmsgid \"Summons a homing projectile targeted at a close foe - prefers flying targets.\"\nmsgstr \"Útjára indít egy követő lövedéket a legközelebbi (ha lehet, repülő) ellenségre.\"\n\n#. Key:\tRuneStoneMagicMissle_level_desc_0\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMagicMissle.RuneStoneMagicMissle.LevelBasedDescOverride(0).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneMagicMissle.RuneStoneMagicMissle.LevelBasedDescOverride(0).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons <Green>1</> homing projectile targeted at a close foe - prefers flying targets. Causes <Blue>16</> damage on impact.\"\nmsgstr \"Útjára indít <Green>1</> követő lövedéket a legközelebbi (lehetőleg repülő) ellenfél felé. <Blue>16</> sebzést okoz.\"\n\n#. Key:\tRuneStoneMagicMissle_level_desc_1\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMagicMissle.RuneStoneMagicMissle.LevelBasedDescOverride(1).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneMagicMissle.RuneStoneMagicMissle.LevelBasedDescOverride(1).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons <Green>2</> homing projectile targeted at a close foe - prefers flying targets. Each projectile causes <Blue>16</> damage on impact.\"\nmsgstr \"Útjára indít <Green>2</> követő lövedéket a legközelebbi (ha lehet, repülő) ellenségre. Minden lövedék <Blue>16</> sebzés okoz.\"\n\n#. Key:\tRuneStoneMagicMissle_level_desc_2\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMagicMissle.RuneStoneMagicMissle.LevelBasedDescOverride(2).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneMagicMissle.RuneStoneMagicMissle.LevelBasedDescOverride(2).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons <Green>3</> homing projectile targeted at a close foe - prefers flying targets. Each projectile causes <Blue>16</> damage and applies <Orange>Slow</> on impact.\"\nmsgstr \"<Green>3</> követő lövedéket lő egy közeli (lehetőleg repülő) ellenfélre. Mindegyik lövedék <Blue>16</> sebzést okoz, és <Orange>Lassít</>.\"\n\n#. Key:\tRuneStoneMagicMissle_level_desc_3\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMagicMissle.RuneStoneMagicMissle.LevelBasedDescOverride(3).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneMagicMissle.RuneStoneMagicMissle.LevelBasedDescOverride(3).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons <Green>4</> homing projectile targeted at a close foe - prefers flying targets. Each projectile causes <Blue>16</> damage and applies <Orange>Slow</> on impact.\"\nmsgstr \"<Green>4</> követő lövedéket lő egy közeli (lehetőleg repülő) ellenfélre. Mindegyik lövedék <Blue>16</> sebzést okoz, és <Orange>Lassít</>.\"\n\n#. Key:\tRuneStoneMagicMissle_level_up_desc_0\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMagicMissle.RuneStoneMagicMissle.LevelUpBasedDescOverride(0).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneMagicMissle.RuneStoneMagicMissle.LevelUpBasedDescOverride(0).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons <Green>1</><YellowH>(→2)</> homing projectile targeted at a close foe - prefers flying targets. Each projectile causes <Blue>16</> damage on impact.\"\nmsgstr \"Útjára indít <Green>1</><YellowH>(→2)</> követő lövedéket a legközelebbi (ha lehet, repülő) ellenségre. Minden lövedék <Blue>16</> sebzés okoz.\"\n\n#. Key:\tRuneStoneMagicMissle_level_up_desc_1\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMagicMissle.RuneStoneMagicMissle.LevelUpBasedDescOverride(1).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneMagicMissle.RuneStoneMagicMissle.LevelUpBasedDescOverride(1).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons <Green>2</><YellowH>(→3)</> homing projectile targeted at a close foe - prefers flying targets. Each projectile causes <Blue>16</> damage <YellowH>and applies</> <OrangeH>Slow</> on impact.\"\nmsgstr \"Útjára indít <Green>2</><YellowH>(→3)</> követő lövedéket a legközelebbi (ha lehet, repülő) ellenségre. Minden lövedék <Blue>16</> sebzés okoz, és <OrangeH>Lassít</>.\"\n\n#. Key:\tRuneStoneMagicMissle_level_up_desc_2\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMagicMissle.RuneStoneMagicMissle.LevelUpBasedDescOverride(2).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneMagicMissle.RuneStoneMagicMissle.LevelUpBasedDescOverride(2).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons <Green>3</><YellowH>(→4)</> homing projectile targeted at a close foe - prefers flying targets. Each projectile causes <Blue>16</> damage and applies <Orange>Slow</> on impact.\"\nmsgstr \"Útjára indít <Green>3</><YellowH>(→4)</> követő lövedéket a legközelebbi (lehetőség szerint repülő) ellenfélre. Mindegyik lövedék <Blue>16</> sebzést okoz, és <Orange>Lassítja</> az ellenfeledet.\"\n\n#. Key:\tRuneStoneMagicMissle_name\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMagicMissle.RuneStoneMagicMissle.Name\n#: /Game/SO/Items/RuneStones/RuneStoneMagicMissle.RuneStoneMagicMissle.Name\nmsgctxt \"ItemData\"\nmsgid \"Tealstone\"\nmsgstr \"Türkizkő\"\n\n#. Key:\tRuneStoneMassMagicMissle_desc\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMassMagicMissle.RuneStoneMassMagicMissle.Description\n#. Key:\tRuneStoneMassMagicMissle_level_desc_0\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMassMagicMissle.RuneStoneMassMagicMissle.LevelBasedDescOverride(0).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneMassMagicMissle.RuneStoneMassMagicMissle.Description\n#: /Game/SO/Items/RuneStones/RuneStoneMassMagicMissle.RuneStoneMassMagicMissle.LevelBasedDescOverride(0).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons a homing projectile for each nearby enemy, causing <Blue>20</> damage on impact.\"\nmsgstr \"Követő lövedéket lő a közeli ellenfelekre, találatonként <Blue>20</> sebzést okoz.\"\n\n#. Key:\tRuneStoneMassMagicMissle_level_desc_1\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMassMagicMissle.RuneStoneMassMagicMissle.LevelBasedDescOverride(1).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneMassMagicMissle.RuneStoneMassMagicMissle.LevelBasedDescOverride(1).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons a homing projectile for each nearby enemy, causing <Blue>40</> damage on impact.\"\nmsgstr \"Követő lövedéket lő minden közeli ellenfélre, <Blue>40</> sebzést okozva.\"\n\n#. Key:\tRuneStoneMassMagicMissle_level_desc_2\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMassMagicMissle.RuneStoneMassMagicMissle.LevelBasedDescOverride(2).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneMassMagicMissle.RuneStoneMassMagicMissle.LevelBasedDescOverride(2).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons a homing projectile for each nearby enemy, causing <Blue>50</> damage on impact. The target has a <Green>30%</> chance to become <Orange>Slow</>.\"\nmsgstr \"Követő lövedékeket lő minden közeli ellenfélre, <Blue>50</> sebzést okoz, <Green>30%</> eséllyel <Orange>Lassít</>.\"\n\n#. Key:\tRuneStoneMassMagicMissle_level_up_desc_0\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMassMagicMissle.RuneStoneMassMagicMissle.LevelUpBasedDescOverride(0).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneMassMagicMissle.RuneStoneMassMagicMissle.LevelUpBasedDescOverride(0).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons a homing projectile for each nearby enemy, causing <Blue>20</><YellowH>(→40)</> damage on impact.\"\nmsgstr \"Követő lövedéket lő ki minden közeli ellenségre, melyek <Blue>20</><YellowH>(→40)</> sebzést okoznak.\"\n\n#. Key:\tRuneStoneMassMagicMissle_level_up_desc_1\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMassMagicMissle.RuneStoneMassMagicMissle.LevelUpBasedDescOverride(1).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneMassMagicMissle.RuneStoneMassMagicMissle.LevelUpBasedDescOverride(1).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons a homing projectile for each nearby enemy, causing <Blue>20</><YellowH>(→50)</> damage on impact. <YellowH>The target has a</> <GreenH>30%</> <YellowH>chance to become</> <Orange>Slow</>.\"\nmsgstr \"Útjára indít egy követő lövedéket, amely <Blue>20</> + <YellowH>(→50)</> sebzést okoz. <YellowH>A célpont</> <GreenH>30%</> <YellowH>eséllyel</> <Orange>Lelassul</>.\"\n\n#. Key:\tRuneStoneMassMagicMissle_name\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMassMagicMissle.RuneStoneMassMagicMissle.Name\n#: /Game/SO/Items/RuneStones/RuneStoneMassMagicMissle.RuneStoneMassMagicMissle.Name\nmsgctxt \"ItemData\"\nmsgid \"Tealstone, but better\"\nmsgstr \"Türkizkő, csak jobb\"\n\n#. Key:\tRuneStoneMassSlow_desc\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMassSlow.RuneStoneMassSlow.Description\n#: /Game/SO/Items/RuneStones/RuneStoneMassSlow.RuneStoneMassSlow.Description\nmsgctxt \"ItemData\"\nmsgid \"Slows all enemy targets around the caster.\"\nmsgstr \"Lelassítja az ellenfeleket.\"\n\n#. Key:\tRuneStoneMassSlow_level_desc_0\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMassSlow.RuneStoneMassSlow.LevelBasedDescOverride(0).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneMassSlow.RuneStoneMassSlow.LevelBasedDescOverride(0).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"All enemy target becomes <Orange>Slow</> for <Green>3</> seconds.\"\nmsgstr \"Minden ellenfél <Orange>Lassul</> <Green>3</> másodpercig.\"\n\n#. Key:\tRuneStoneMassSlow_name\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMassSlow.RuneStoneMassSlow.Name\n#: /Game/SO/Items/RuneStones/RuneStoneMassSlow.RuneStoneMassSlow.Name\nmsgctxt \"ItemData\"\nmsgid \"Slowstone\"\nmsgstr \"Lassítókő\"\n\n#. Key:\tRuneStoneMeteorShower_desc\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMeteorShower.RuneStoneMeteorShower.Description\n#: /Game/SO/Items/RuneStones/RuneStoneMeteorShower.RuneStoneMeteorShower.Description\nmsgctxt \"ItemData\"\nmsgid \"Summons 12 deadly meteors around the caster, each causing 16 damage on impact.\"\nmsgstr \"Megidéz <Green>12</> halálos meteort, amely <White>16</> sebzést okoz találatonként.\"\n\n#. Key:\tRuneStoneMeteorShower_level_desc_0\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMeteorShower.RuneStoneMeteorShower.LevelBasedDescOverride(0).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneMeteorShower.RuneStoneMeteorShower.LevelBasedDescOverride(0).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons <Green>12</> deadly meteors around the caster, each causing <White>16</> damage on impact.\"\nmsgstr \"<Green>12</> halálos meteort idéz, melyek mindegyike <White>16</> sebzést okoz.\"\n\n#. Key:\tRuneStoneMeteorShower_level_desc_1\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMeteorShower.RuneStoneMeteorShower.LevelBasedDescOverride(1).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneMeteorShower.RuneStoneMeteorShower.LevelBasedDescOverride(1).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons <Green>16</> deadly meteors around the caster, each causing <White>24</> damage on impact.\"\nmsgstr \"<Green>16</> halálos meteort idéz, melyek mindegyike <White>24</> sebzést okoz.\"\n\n#. Key:\tRuneStoneMeteorShower_level_desc_2\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMeteorShower.RuneStoneMeteorShower.LevelBasedDescOverride(2).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneMeteorShower.RuneStoneMeteorShower.LevelBasedDescOverride(2).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons <Green>20</> deadly meteors around the caster, each causing <White>32</> damage on impact. Each meteor has a <Green>30%</> chance to <Yellow>Stun</> the target.\"\nmsgstr \"Megidéz <Green>20</> halálos meteort, amely <White>32</> sebzést okoz találatonként. Minden meteornak <Green>30%</> esélye van arra, hogy <Yellow>Kábítsa</> az ellent.\"\n\n#. Key:\tRuneStoneMeteorShower_level_up_desc_0\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMeteorShower.RuneStoneMeteorShower.LevelUpBasedDescOverride(0).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneMeteorShower.RuneStoneMeteorShower.LevelUpBasedDescOverride(0).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons <Green>12</><YellowH>(→16)</> deadly meteors around the caster, each causing <White>16</><YellowH>(→24)</> damage on impact.\"\nmsgstr \"Megidéz <Green>12</><YellowH>(→16)</> halálos meteort, amely <White>16</><YellowH>(→24)</> sebzést okoz találatonként.\"\n\n#. Key:\tRuneStoneMeteorShower_level_up_desc_1\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMeteorShower.RuneStoneMeteorShower.LevelUpBasedDescOverride(1).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneMeteorShower.RuneStoneMeteorShower.LevelUpBasedDescOverride(1).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons <Green>16</><YellowH>(→20)</> deadly meteors around the caster, each causing <White>24</><YellowH>(→32)</> damage on impact. <YellowH>Each meteor has a</> <GreenH>30%</> <YellowH>chance to Stun the target.</>\"\nmsgstr \"<Green>16</><YellowH>(→20)</> halálos meteort idéz, melynek mindegyike <White>24</><YellowH>(→32)</> sebzést okoz, és </> <GreenH>30%</> eséllyel <Yellow>Kábít</>.\"\n\n#. Key:\tRuneStoneMeteorShower_name\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMeteorShower.RuneStoneMeteorShower.Name\n#: /Game/SO/Items/RuneStones/RuneStoneMeteorShower.RuneStoneMeteorShower.Name\nmsgctxt \"ItemData\"\nmsgid \"Meteorstone\"\nmsgstr \"Meteorkő\"\n\n#. Key:\tRuneStoneShadowWalk_desc\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneShadowWalk.RuneStoneShadowWalk.Description\n#. Key:\tRuneStoneShadowWalk_level_desc_0\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneShadowWalk.RuneStoneShadowWalk.LevelBasedDescOverride(0).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneShadowWalk.RuneStoneShadowWalk.Description\n#: /Game/SO/Items/RuneStones/RuneStoneShadowWalk.RuneStoneShadowWalk.LevelBasedDescOverride(0).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Grants the ability to walk through your enemies for <Green>2</> seconds.\"\nmsgstr \"Képessé tesz áthaladni ellenfeleiden <Green>2</> másodperc erejéig.\"\n\n#. Key:\tRuneStoneShadowWalk_level_desc_1\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneShadowWalk.RuneStoneShadowWalk.LevelBasedDescOverride(1).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneShadowWalk.RuneStoneShadowWalk.LevelBasedDescOverride(1).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Grants the ability to walk through your enemies for <Green>4</> seconds.\"\nmsgstr \"Képessé tesz áthaladni ellenfeleiden <Green>4</> másodperc erejéig.\"\n\n#. Key:\tRuneStoneShadowWalk_level_desc_2\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneShadowWalk.RuneStoneShadowWalk.LevelBasedDescOverride(2).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneShadowWalk.RuneStoneShadowWalk.LevelBasedDescOverride(2).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Grants the ability to walk through your enemies for <Green>4</> seconds. Your magical resistance is increased by <Green>0.2.</>\"\nmsgstr \"Képessé tesz áthaladni ellenfeleiden <Green>4</> másodperc erejéig. Mágikus ellenállásod <Green>0.2</>-vel nő.\"\n\n#. Key:\tRuneStoneShadowWalk_level_desc_3\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneShadowWalk.RuneStoneShadowWalk.LevelBasedDescOverride(3).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneShadowWalk.RuneStoneShadowWalk.LevelBasedDescOverride(3).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Grants the ability to walk through your enemies for <Green>5</> seconds. Your magical resistance is increased by <Green>0.3.</>\"\nmsgstr \"Képessé tesz áthaladni ellenfeleiden <Green>2</> másodperc erejéig. Mágikus ellenállásod <Green>0.3</>-mal nő.\"\n\n#. Key:\tRuneStoneShadowWalk_level_up_desc_0\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneShadowWalk.RuneStoneShadowWalk.LevelUpBasedDescOverride(0).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneShadowWalk.RuneStoneShadowWalk.LevelUpBasedDescOverride(0).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Grants the ability to walk through your enemies for <Green>2</> <YellowH>(→4)</> seconds.\"\nmsgstr \"Képessé tesz áthaladni ellenfeleiden <Green>2</> <YellowH>(→4)</> másodperc erejéig.\"\n\n#. Key:\tRuneStoneShadowWalk_level_up_desc_1\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneShadowWalk.RuneStoneShadowWalk.LevelUpBasedDescOverride(1).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneShadowWalk.RuneStoneShadowWalk.LevelUpBasedDescOverride(1).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Grants the ability to walk through your enemies for <Green>4</> seconds. <YellowH>Your magical resistance is increased by</> <GreenH>0.2.</>\"\nmsgstr \"Képessé tesz áthaladni ellenfeleiden <Green>4</> másodperc erejéig. <YellowH>Mágikus ellenállásod</> <GreenH>0.2</>-vel nő.\"\n\n#. Key:\tRuneStoneShadowWalk_level_up_desc_2\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneShadowWalk.RuneStoneShadowWalk.LevelUpBasedDescOverride(2).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneShadowWalk.RuneStoneShadowWalk.LevelUpBasedDescOverride(2).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Grants the ability to walk through your enemies for <Green>4</> <YellowH>(→5)</> seconds. Your magical resistance is increased by <Green>0.2</> <YellowH>(→0.3).</>\"\nmsgstr \"Képessé tesz áthaladni ellenfeleiden <Green>4</> <YellowH>(→5)</> másodperc erejéig. Mágikus ellenállásod <Green>0.2-vel</> <YellowH>(→0.3-mal)</> nő.\"\n\n#. Key:\tRuneStoneShadowWalk_name\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneShadowWalk.RuneStoneShadowWalk.Name\n#: /Game/SO/Items/RuneStones/RuneStoneShadowWalk.RuneStoneShadowWalk.Name\nmsgctxt \"ItemData\"\nmsgid \"Shadestone\"\nmsgstr \"Szellem Kő\"\n\n#. Key:\tRuneStoneSoulkeeper_desc\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneSoulkeeper.RuneStoneSoulkeeper.Description\n#: /Game/SO/Items/RuneStones/RuneStoneSoulkeeper.RuneStoneSoulkeeper.Description\nmsgctxt \"ItemData\"\nmsgid \"Summons the Soulkeeper, a powerful spirit capable of gathering your essence should something bad happen to you.\\r\\n\\r\\nReleasing the spirit recharges the stone.\"\nmsgstr \"Megidézi a Lélekőrt, egy nagyhatalmú szellemet, aki képes összegyűjteni az esszenciádat, ha váratlanul elhaláloznál. Sokkal kényelmesebb módja a feltámadásnak, mintha Varázslónak kell visszaidéznie.\\n\\nHa elengeded a szellemet, a kő visszatöltődik.\"\n\n#. Key:\tRuneStoneSoulkeeper_name\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneSoulkeeper.RuneStoneSoulkeeper.Name\n#: /Game/SO/Items/RuneStones/RuneStoneSoulkeeper.RuneStoneSoulkeeper.Name\nmsgctxt \"ItemData\"\nmsgid \"Soulstone\"\nmsgstr \"Lélekkő\"\n\n#. Key:\tRuneStoneSoulkeeperInfinite_desc\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneSoulkeeperInfinite.RuneStoneSoulkeeperInfinite.Description\n#: /Game/SO/Items/RuneStones/RuneStoneSoulkeeperInfinite.RuneStoneSoulkeeperInfinite.Description\nmsgctxt \"ItemData\"\nmsgid \"Summons the Soulkeeper, a powerful spirit capable of gathering your essence should something bad happen to you.\"\nmsgstr \"Megidézi a Lélekőrt, egy nagyhatalmú szellemet, aki képes összegyűjteni az esszenciádat, ha valami rossz történne veled. Sokkal kényelmesebb, mintha Varázslónak kell visszaidéznie.\"\n\n#. Key:\tRuneStoneSoulkeeperInfinite_name\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneSoulkeeperInfinite.RuneStoneSoulkeeperInfinite.Name\n#: /Game/SO/Items/RuneStones/RuneStoneSoulkeeperInfinite.RuneStoneSoulkeeperInfinite.Name\nmsgctxt \"ItemData\"\nmsgid \"Elite Soulstone\"\nmsgstr \"Elit Lélekkő\"\n\n#. Key:\tRuneStoneSpellRegain_desc\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneSpellRegain.RuneStoneSpellRegain.Description\n#: /Game/SO/Items/RuneStones/RuneStoneSpellRegain.RuneStoneSpellRegain.Description\nmsgctxt \"ItemData\"\nmsgid \"Regenerates all other spell charges.\"\nmsgstr \"Minden más követ visszatölt.\"\n\n#. Key:\tRuneStoneSpellRegain_name\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneSpellRegain.RuneStoneSpellRegain.Name\n#: /Game/SO/Items/RuneStones/RuneStoneSpellRegain.RuneStoneSpellRegain.Name\nmsgctxt \"ItemData\"\nmsgid \"Spiritstone\"\nmsgstr \"Szellemkő\"\n\n#. Key:\tRuneStoneSwap_desc\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.Description\n#. Key:\tRuneStoneSwap_level_desc_0\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.LevelBasedDescOverride(0).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.Description\n#: /Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.LevelBasedDescOverride(0).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Swaps the position of the caster with the closest target in front of him/her/it.\"\nmsgstr \"Helyet cserélsz a legközelebbi ellenféllel.\"\n\n#. Key:\tRuneStoneSwap_level_desc_1\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.LevelBasedDescOverride(1).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.LevelBasedDescOverride(1).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Swaps the position of the caster with the closest target in front of him/her/it. The selected target suffers <Blue>20</> damage.\"\nmsgstr \"Helyet cserélsz a legközelebbi ellenféllel, aki <Blue>20</> sebzést szenved el.\"\n\n#. Key:\tRuneStoneSwap_level_desc_2\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.LevelBasedDescOverride(2).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.LevelBasedDescOverride(2).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Swaps the position of the caster with the closest target in front of him/her/it. The selected target suffers <Blue>30</> damage and becomes <Orange>Slow</>.\"\nmsgstr \"Helyet cserélsz a legközelebbi ellenféllel, aki <Blue>30</> sebzést szenved el, és <Orange>Lelassul</>.\"\n\n#. Key:\tRuneStoneSwap_level_desc_3\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.LevelBasedDescOverride(3).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.LevelBasedDescOverride(3).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Swaps the position of the caster with the closest target in front of him/her/it. The selected target suffers <Blue>40</> damage and becomes <Orange>Slow</>.\"\nmsgstr \"Helyet cserélsz a legközelebbi ellenféllel, aki <Blue>40</> sebzést szenved el, és <Orange>Lelassul</>.\"\n\n#. Key:\tRuneStoneSwap_level_desc_4\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.LevelBasedDescOverride(4).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.LevelBasedDescOverride(4).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Swaps the position of the caster with the closest target in front of him/her/it. The selected target suffers <Blue>50</> damage and becomes <Orange>Slow</>.\"\nmsgstr \"Helyet cserélsz a legközelebbi ellennel, aki <Blue>50</>sebzést szenved el, és <Orange>Lelassul</>.\"\n\n#. Key:\tRuneStoneSwap_level_up_desc_0\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.LevelUpBasedDescOverride(0).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.LevelUpBasedDescOverride(0).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Swaps the position of the caster with the closest target in front of him/her/it. <YellowH>The selected target suffers</> <BlueH>20</> <YellowH>damage.</>\"\nmsgstr \"Helyet cserélsz a hozzád legközelebbi ellenféllel. <YellowH>Ellenfeled</> <BlueH>20</> <YellowH>sebzést szenved el.</>\"\n\n#. Key:\tRuneStoneSwap_level_up_desc_1\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.LevelUpBasedDescOverride(1).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.LevelUpBasedDescOverride(1).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Swaps the position of the caster with the closest target in front of him/her/it. The selected target suffers <Blue>20</><YellowH>(→30)</> damage <YellowH>and becomes </><Orange>Slow.</>\"\nmsgstr \"Helyet cserélsz a legközelebbi ellenféllel, aki <Blue>20</><YellowH>(→30)</> sebzést szenved el és <Orange>Lassul.</>\"\n\n#. Key:\tRuneStoneSwap_level_up_desc_2\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.LevelUpBasedDescOverride(2).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.LevelUpBasedDescOverride(2).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Swaps the position of the caster with the closest target in front of him/her/it. The selected target suffers <Blue>30</><YellowH>(→40)</> damage and becomes <Orange>Slow.</>\"\nmsgstr \"Helyet cserélsz a legközelebbi ellenféllel, aki <Blue>30</><YellowH>(→40)</> sebzést szenved el, és <Orange>Lelassul</>.\"\n\n#. Key:\tRuneStoneSwap_level_up_desc_3\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.LevelUpBasedDescOverride(3).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.LevelUpBasedDescOverride(3).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Swaps the position of the caster with the closest target in front of him/her/it. The selected target suffers <Blue>40</><YellowH>(→50)</> damage and becomes <Orange>Slow.</>\"\nmsgstr \"Helyet cserélsz a legközelebbi ellennel, aki <Blue>40</><YellowH>(→50)</>sebzést szenved el, és <Orange>Lelassul.</>\"\n\n#. Key:\tRuneStoneSwap_name\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.Name\n#: /Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.Name\nmsgctxt \"ItemData\"\nmsgid \"Swapstone\"\nmsgstr \"Cserekő\"\n\n#. Key:\tRuneStoneWeaponFlame_desc\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.Description\n#: /Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.Description\nmsgctxt \"ItemData\"\nmsgid \"Enchants your active weapon with green flames - it causes an additional 0.3x damage for 4 seconds.\"\nmsgstr \"Megbűvöli a fegyveredet, ezzel <Green>0.3x</> sebzést adva <Green>4</> másodpercig.\"\n\n#. Key:\tRuneStoneWeaponFlame_level_desc_0\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.LevelBasedDescOverride(0).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.LevelBasedDescOverride(0).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Enchants your active weapon - it causes an additional <Green>0.5x</> damage for <Green>5</> seconds.\"\nmsgstr \"Megbűvöli a fegyveredet, ezzel <Green>0.5x</> sebzést adva <Green>5</> másodpercig.\"\n\n#. Key:\tRuneStoneWeaponFlame_level_desc_1\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.LevelBasedDescOverride(1).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.LevelBasedDescOverride(1).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Enchants your active weapon - it causes an additional <Green>0.6x</> damage for <Green>5</> seconds. Each strike has a <Green>15%</> chance to apply <DarkGreen>Poison</>, causing an additional <Blue>18</> damage over <Green>6</> seconds.\"\nmsgstr \"Megbűvöli a fegyveredet, ezzel <Green>0.6x</> sebzést adva <Green>5</> másodpercig. Minden ütés <Green>15%</> eséllyel <DarkGreen>Mérgezést</> okoz, ami <Blue>18</> sebzést jelent <Green>6</> másodpercen át.\"\n\n#. Key:\tRuneStoneWeaponFlame_level_desc_2\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.LevelBasedDescOverride(2).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.LevelBasedDescOverride(2).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Enchants your active weapon - it causes an additional <Green>0.7x</> damage for <Green>6</> seconds. Each strike has a <Green>20%</> chance to apply <DarkGreen>Poison</>, causing an additional <Blue>24</> damage over <Green>6</> seconds.\"\nmsgstr \"Megbűvöli a fegyveredet, ezzel <Green>0.7x</> sebzést adva <Green>6</> másodpercig. Minden találat <Green>20%</> eséllyel <DarkGreen>Mérgezést</> okoz, ami plusz <Blue>24</> sebzést jelent <Green>6</> másodpercen át.\"\n\n#. Key:\tRuneStoneWeaponFlame_level_desc_3\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.LevelBasedDescOverride(3).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.LevelBasedDescOverride(3).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Enchants your active weapon - it causes an additional <Green>0.8x</> damage for <Green>6</> seconds. Each strike has a <Green>25%</> chance to apply <DarkGreen>Poison</>, causing an additional <Blue>30</> damage over <Green>6</> seconds.\"\nmsgstr \"Megbűvöli a fegyveredet, ezzel <Green>0.8x</> sebzést adva <Green>6</> másodpercig. Minden találat <Green>25%</> eséllyel <DarkGreen>Mérgezést</> okoz, ami plusz <Blue>30</> sebzést jelent <Green>6</> másodpercen át.\"\n\n#. Key:\tRuneStoneWeaponFlame_level_desc_4\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.LevelBasedDescOverride(4).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.LevelBasedDescOverride(4).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Enchants your active weapon - it causes an additional <Green>0.9x</> damage for <Green>6</> seconds. Each strike has a <Green>30%</> chance to apply <DarkGreen>Poison</>, causing an additional <Blue>36</> damage over <Green>6</> seconds.\"\nmsgstr \"Megbűvöli a fegyveredet, ezzel <Green>0.9x</> sebzést adva <Green>6</> másodpercig. Minden ütés <Green>30%</> eséllyel <DarkGreen>Mérgezést</> okoz, ami <Blue>36</> sebzést jelent <Green>6</> másodpercen át.\"\n\n#. Key:\tRuneStoneWeaponFlame_level_up_desc_0\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.LevelUpBasedDescOverride(0).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.LevelUpBasedDescOverride(0).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Enchants your active weapon - it causes an additional <Green>0.5x</><YellowH>(→0.6x)</> damage for <Green>5</> seconds. <YellowH>Each strike has a</> <GreenH>15%</> <YellowH>chance to apply </><DarkGreenH>Poison</><YellowH>, causing an additional</> <BlueH>18</> <YellowH>damage over</> <GreenH>6</> <YellowH>seconds.</>\"\nmsgstr \"Megbűvöli a fegyveredet, ezzel <Green>0.5x</><YellowH>(→0.6x)</> sebzést adva <Green>5</> másodpercig. <YellowH>Minden ütés</> <GreenH>15%</> <YellowH>eséllyel </><DarkGreenH>Mérgezést</><YellowH> okoz, ami plusz</> <BlueH>18</> <YellowH>sebzést jelent </> <GreenH>6</> <YellowH> másodpercen át.</>\"\n\n#. Key:\tRuneStoneWeaponFlame_level_up_desc_1\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.LevelUpBasedDescOverride(1).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.LevelUpBasedDescOverride(1).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Enchants your active weapon - it causes an additional <Green>0.6x</><YellowH>(→0.7x)</> damage for <Green>5</><YellowH>(→6)</> seconds. Each strike has a <Green>15%</><YellowH>(→20%)</> chance to apply <DarkGreen>Poison</>, causing an additional <Blue>18</><YellowH>(→24)</> damage over <Green>6</> seconds.\"\nmsgstr \"Megbűvöli a fegyveredet, ezzel plusz <Green>0.6x</><YellowH>(→0.7x)</> sebzést adva <Green>5</><YellowH>(→6)</> másodpercig. Minden ütés <Green>15%</><YellowH>(→20%)</> eséllyel <DarkGreen>Mérgezést</> okoz, ami plusz <Blue>18</><YellowH>(→24)</> sebzést jelent <Green>6</> másodpercen át.\"\n\n#. Key:\tRuneStoneWeaponFlame_level_up_desc_2\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.LevelUpBasedDescOverride(2).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.LevelUpBasedDescOverride(2).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Enchants your active weapon - it causes an additional <Green>0.7x</><YellowH>(→0.8x)</> damage for <Green>6</> seconds. Each strike has a <Green>20%</><YellowH>(→25%)</> chance to apply <DarkGreen>Poison</>, causing an additional <Blue>24</><YellowH>(→30)</> damage over <Green>6</> seconds.\"\nmsgstr \"Megbűvöli a fegyveredet, ezáltal <Green>0.7x</><YellowH>(→0.8x)</> extra sebzést biztosít <Green>6</> másodpercig. Minden ütés <Green>20%</><YellowH>(→25%)</> eséllyel <DarkGreen>Mérgezést</> okoz, ami <Blue>24</><YellowH>(→30)</> sebzést jelent <Green>6</> másodpercen át.\"\n\n#. Key:\tRuneStoneWeaponFlame_level_up_desc_3\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.LevelUpBasedDescOverride(3).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.LevelUpBasedDescOverride(3).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Enchants your active weapon - it causes an additional <Green>0.8x</><YellowH>(→0.9x)</> damage for <Green>6</> seconds. Each strike has a <Green>25%</><YellowH>(→30%)</> chance to apply <DarkGreen>Poison</>, causing an additional <Blue>30</><YellowH>(→36)</> damage over <Green>6</> seconds.\"\nmsgstr \"Megbűvöli a fegyveredet, ezzel <Green>0.8x</><YellowH>(→0.9x)</> sebzést adva <Green>6</> másodpercig. Minden találat <Green>25%</><YellowH>(→30%)</> eséllyel <DarkGreen>Mérgezést</> okoz, ami plusz <Blue>30</><YellowH>(→36)</> sebzést jelent <Green>6</> másodpercen át.\"\n\n#. Key:\tRuneStoneWeaponFlame_name\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.Name\n#: /Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.Name\nmsgctxt \"ItemData\"\nmsgid \"Green Flamestone\"\nmsgstr \"Zöld Lángkő\"\n\n#. Key:\tSabre_desc\n#. SourceLocation:\t/Game/SO/Items/Weapons/Sabre.Sabre.Description\n#: /Game/SO/Items/Weapons/Sabre.Sabre.Description\nmsgctxt \"ItemData\"\nmsgid \"Rangol was a legendary blacksmith who practiced his crafting art for a hundred years. This sabre was made on day one.\"\nmsgstr \"Rangol világhírű kovács volt, aki száz éven keresztül tökéletesítette művészetét. Ez a száz év első napján készült.\"\n\n#. Key:\tSabre_name\n#. SourceLocation:\t/Game/SO/Items/Weapons/Sabre.Sabre.Name\n#: /Game/SO/Items/Weapons/Sabre.Sabre.Name\nmsgctxt \"ItemData\"\nmsgid \"First Sabre of Rangol\"\nmsgstr \"Rangol Első Szablyája\"\n\n#. Key:\tSecondChance_desc\n#. SourceLocation:\t/Game/SO/Items/RuneStones/SecondChance.SecondChance.Description\n#: /Game/SO/Items/RuneStones/SecondChance.SecondChance.Description\nmsgctxt \"ItemData\"\nmsgid \"Prevents death.\"\nmsgstr \"Megelőzi a halált.\"\n\n#. Key:\tSecondChance_name\n#. SourceLocation:\t/Game/SO/Items/RuneStones/SecondChance.SecondChance.Name\n#: /Game/SO/Items/RuneStones/SecondChance.SecondChance.Name\nmsgctxt \"ItemData\"\nmsgid \"Chancestone\"\nmsgstr \"Esélykő\"\n\n#. Key:\tSecretWeirdDevice_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/SecretWeirdDevice.SecretWeirdDevice.Description\n#: /Game/SO/Items/QuestItems/SecretWeirdDevice.SecretWeirdDevice.Description\nmsgctxt \"ItemData\"\nmsgid \"A weird device, most likely one of the inventions of the Secret Science Society.\"\nmsgstr \"Fura eszköz, valószínűleg a Titkos Tudós Társaság találmánya.\"\n\n#. Key:\tSecretWeirdDevice_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/SecretWeirdDevice.SecretWeirdDevice.Name\n#: /Game/SO/Items/QuestItems/SecretWeirdDevice.SecretWeirdDevice.Name\nmsgctxt \"ItemData\"\nmsgid \"Weird Device\"\nmsgstr \"Fura Eszköz\"\n\n#. Key:\tShardAmber_desc\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardAmber.ShardAmber.Description\n#: /Game/SO/Items/Shards/ShardAmber.ShardAmber.Description\nmsgctxt \"ItemData\"\nmsgid \"Each melee strike has an additional <Yellow>10%</> chance to cause a critical hit, causing <Green>200%</> of your normal weapon damage.\"\nmsgstr \"Minden közelharci csapásod <Yellow>10%</> eséllyel kritikusnak számít, ezzel a megszokott sebzés <Green>200%</>-át okozva.\"\n\n#. Key:\tShardAmber_name\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardAmber.ShardAmber.Name\n#: /Game/SO/Items/Shards/ShardAmber.ShardAmber.Name\nmsgctxt \"ItemData\"\nmsgid \"Amber Shard\"\nmsgstr \"Borostyán Szilánk\"\n\n#. Key:\tShardAmberBright_desc\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardAmberBright.ShardAmberBright.Description\n#: /Game/SO/Items/Shards/ShardAmberBright.ShardAmberBright.Description\nmsgctxt \"ItemData\"\nmsgid \"Each melee strike has an additional <Yellow>20%</> chance to cause a critical hit, causing <Green>200%</> of your normal weapon damage.\"\nmsgstr \"Minden közelharci ütés <Yellow>20%</> eséllyel kritikus találatnak számít, ami a normál sebzés <Green>200%</>-át jelenti.\"\n\n#. Key:\tShardAmberBright_name\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardAmberBright.ShardAmberBright.Name\n#: /Game/SO/Items/Shards/ShardAmberBright.ShardAmberBright.Name\nmsgctxt \"ItemData\"\nmsgid \"Bright Amber Shard\"\nmsgstr \"Fényes Borostyánkő\"\n\n#. Key:\tShardAqua_desc\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardAqua.ShardAqua.Description\n#: /Game/SO/Items/Shards/ShardAqua.ShardAqua.Description\nmsgctxt \"ItemData\"\nmsgid \"Cooldown recharge speed is increased by <Blue>20%</>.\"\nmsgstr \"Csökkenti a Visszatöltődés idejét <Blue>20%</>-kal.\"\n\n#. Key:\tShardAqua_name\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardAqua.ShardAqua.Name\n#: /Game/SO/Items/Shards/ShardAqua.ShardAqua.Name\nmsgctxt \"ItemData\"\nmsgid \"Aqua Shard\"\nmsgstr \"Égkék Szilánk\"\n\n#. Key:\tShardAquaBright_desc\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardAquaBright.ShardAquaBright.Description\n#: /Game/SO/Items/Shards/ShardAquaBright.ShardAquaBright.Description\nmsgctxt \"ItemData\"\nmsgid \"Cooldown recharge speed is increased by <Blue>40%</>.\"\nmsgstr \"Csökkenti a Visszatöltődés idejét <Blue>40%</>-kal.\"\n\n#. Key:\tShardAquaBright_name\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardAquaBright.ShardAquaBright.Name\n#: /Game/SO/Items/Shards/ShardAquaBright.ShardAquaBright.Name\nmsgctxt \"ItemData\"\nmsgid \"Bright Aqua Shard\"\nmsgstr \"Fényes Égkék Szilánk\"\n\n#. Key:\tShardBlack_desc\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardBlack.ShardBlack.Description\n#: /Game/SO/Items/Shards/ShardBlack.ShardBlack.Description\nmsgctxt \"ItemData\"\nmsgid \"Every time an enemy hits you with a melee strike or overlaps you it is turned into a boot for a short time.\"\nmsgstr \"Ha valaki sebez rajtad, csizmává változik.\"\n\n#. Key:\tShardBlack_name\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardBlack.ShardBlack.Name\n#: /Game/SO/Items/Shards/ShardBlack.ShardBlack.Name\nmsgctxt \"ItemData\"\nmsgid \"Black Shard\"\nmsgstr \"Fekete Szilánk\"\n\n#. Key:\tShardBlue_desc\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardBlue.ShardBlue.Description\n#: /Game/SO/Items/Shards/ShardBlue.ShardBlue.Description\nmsgctxt \"ItemData\"\nmsgid \"Decreases the incoming <Blue>Magical Damage</> by <Blue>20%.</>\"\nmsgstr \"Csökkenti a rád mért <Blue>Mágikus Sebzést</> <Blue>20%.</>-kal.\"\n\n#. Key:\tShardBlue_name\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardBlue.ShardBlue.Name\n#: /Game/SO/Items/Shards/ShardBlue.ShardBlue.Name\nmsgctxt \"ItemData\"\nmsgid \"Blue Shard\"\nmsgstr \"Kék Szilánk\"\n\n#. Key:\tShardBlueBright_desc\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardBlueBright.ShardBlueBright.Description\n#: /Game/SO/Items/Shards/ShardBlueBright.ShardBlueBright.Description\nmsgctxt \"ItemData\"\nmsgid \"Decreases the incoming <Blue>Magical Damage</> by <Blue>30%.</>\"\nmsgstr \"Csökkenti a rád mért <Blue>Mágikus Sebzést</> <Blue>30%</>-kal.\"\n\n#. Key:\tShardBlueBright_name\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardBlueBright.ShardBlueBright.Name\n#: /Game/SO/Items/Shards/ShardBlueBright.ShardBlueBright.Name\nmsgctxt \"ItemData\"\nmsgid \"Bright Blue Shard\"\nmsgstr \"Királykék Szilánk\"\n\n#. Key:\tShardGreen_desc\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardGreen.ShardGreen.Description\n#: /Game/SO/Items/Shards/ShardGreen.ShardGreen.Description\nmsgctxt \"ItemData\"\nmsgid \"Increases the attack speed by <Green>20%</>\"\nmsgstr \"Növeli csapásaid gyorsaságát <Green>20%</>-kal.\"\n\n#. Key:\tShardGreen_name\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardGreen.ShardGreen.Name\n#: /Game/SO/Items/Shards/ShardGreen.ShardGreen.Name\nmsgctxt \"ItemData\"\nmsgid \"Green Shard\"\nmsgstr \"Zöld Szilánk\"\n\n#. Key:\tShardGreenBright_desc\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardGreenBright.ShardGreenBright.Description\n#: /Game/SO/Items/Shards/ShardGreenBright.ShardGreenBright.Description\nmsgctxt \"ItemData\"\nmsgid \"Increases the attack speed by <Green>30%</>\"\nmsgstr \"Növeli csapásaid gyorsaságát <Green>30%</>-kal.\"\n\n#. Key:\tShardGreenBright_name\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardGreenBright.ShardGreenBright.Name\n#: /Game/SO/Items/Shards/ShardGreenBright.ShardGreenBright.Name\nmsgctxt \"ItemData\"\nmsgid \"Bright Green Shard\"\nmsgstr \"Fényes Zöld Szilánk\"\n\n#. Key:\tShardPurple_desc\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardPurple.ShardPurple.Description\n#: /Game/SO/Items/Shards/ShardPurple.ShardPurple.Description\nmsgctxt \"ItemData\"\nmsgid \"Each time you cast a charge based spell you have a <Purple>25%</> chance to regain the charge.\"\nmsgstr \"Minden töltet alapú varázslat használatakor <Purple>25%</> eséllyel visszakapod a varázslat töltetet.\"\n\n#. Key:\tShardPurple_name\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardPurple.ShardPurple.Name\n#: /Game/SO/Items/Shards/ShardPurple.ShardPurple.Name\nmsgctxt \"ItemData\"\nmsgid \"Purple Shard\"\nmsgstr \"Bíbor Szilánk\"\n\n#. Key:\tShardPurpleBright_desc\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardPurpleBright.ShardPurpleBright.Description\n#: /Game/SO/Items/Shards/ShardPurpleBright.ShardPurpleBright.Description\nmsgctxt \"ItemData\"\nmsgid \"Each time you cast a charge based spell you have a <Purple>50%</> chance to regain the charge.\"\nmsgstr \"Minden töltet alapú varázslat használatakor <Purple>50%</> eséllyel visszakapod a varázslat töltetet.\"\n\n#. Key:\tShardPurpleBright_name\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardPurpleBright.ShardPurpleBright.Name\n#: /Game/SO/Items/Shards/ShardPurpleBright.ShardPurpleBright.Name\nmsgctxt \"ItemData\"\nmsgid \"Bright Purple Shard\"\nmsgstr \"Fényes Bíbor Szilánk\"\n\n#. Key:\tShardRed_desc\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardRed.ShardRed.Description\n#: /Game/SO/Items/Shards/ShardRed.ShardRed.Description\nmsgctxt \"ItemData\"\nmsgid \"You heal <Red>5%</> of the melee damage you inflict on your enemies.\"\nmsgstr \"A közelharcban okozott sebzésed <Red>5%</>-át gyógyulod.\"\n\n#. Key:\tShardRed_name\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardRed.ShardRed.Name\n#: /Game/SO/Items/Shards/ShardRed.ShardRed.Name\nmsgctxt \"ItemData\"\nmsgid \"Red Shard\"\nmsgstr \"Vörös Szilánk\"\n\n#. Key:\tShardRedBright_desc\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardRedBright.ShardRedBright.Description\n#: /Game/SO/Items/Shards/ShardRedBright.ShardRedBright.Description\nmsgctxt \"ItemData\"\nmsgid \"You heal <Red>10%</> of the melee damage you inflict on your enemies.\"\nmsgstr \"A közelharcban okozott sebzésed <Red>10%</>-át gyógyulod.\"\n\n#. Key:\tShardRedBright_name\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardRedBright.ShardRedBright.Name\n#: /Game/SO/Items/Shards/ShardRedBright.ShardRedBright.Name\nmsgctxt \"ItemData\"\nmsgid \"Bright Red Shard\"\nmsgstr \"Fényes Vörös Szilánk\"\n\n#. Key:\tShardSilver_desc\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardSilver.ShardSilver.Description\n#: /Game/SO/Items/Shards/ShardSilver.ShardSilver.Description\nmsgctxt \"ItemData\"\nmsgid \"Decreases the incoming <White>Physical Damage</> by <White>20%.</>\"\nmsgstr \"Csökkenti a rád mért <White>Fizikális Sebzést</> <White>20%</>-kal.\"\n\n#. Key:\tShardSilver_name\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardSilver.ShardSilver.Name\n#: /Game/SO/Items/Shards/ShardSilver.ShardSilver.Name\nmsgctxt \"ItemData\"\nmsgid \"Silver Shard\"\nmsgstr \"Ezüst Szilánk\"\n\n#. Key:\tShardSilverBright_desc\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardSilverBright.ShardSilverBright.Description\n#: /Game/SO/Items/Shards/ShardSilverBright.ShardSilverBright.Description\nmsgctxt \"ItemData\"\nmsgid \"Decreases the incoming <White>Physical Damage</> by <White>30%.</>\"\nmsgstr \"Csökkenti a rád mért <White>Fizikális Sebzést</> <White>30%</>-kal.\"\n\n#. Key:\tShardSilverBright_name\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardSilverBright.ShardSilverBright.Name\n#: /Game/SO/Items/Shards/ShardSilverBright.ShardSilverBright.Name\nmsgctxt \"ItemData\"\nmsgid \"Bright Silver Shard\"\nmsgstr \"Fehér Ezüst Szilánk\"\n\n#. Key:\tShardTeal_desc\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardTeal.ShardTeal.Description\n#: /Game/SO/Items/Shards/ShardTeal.ShardTeal.Description\nmsgctxt \"ItemData\"\nmsgid \"Each time an enemy hits you with a melee strike it suffers the same damage.\"\nmsgstr \"Ha valaki közelharcban megüt, ő is elszenvedi ugyanazt a sérülést.\"\n\n#. Key:\tShardTeal_name\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardTeal.ShardTeal.Name\n#: /Game/SO/Items/Shards/ShardTeal.ShardTeal.Name\nmsgctxt \"ItemData\"\nmsgid \"Teal Shard\"\nmsgstr \"Égkék Szilánk\"\n\n#. Key:\tShardTealBright_desc\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardTealBright.ShardTealBright.Description\n#: /Game/SO/Items/Shards/ShardTealBright.ShardTealBright.Description\nmsgctxt \"ItemData\"\nmsgid \"Each time an enemy hits you, it suffers <Green>200%</> of the damage.\"\nmsgstr \"Ha valaki közelharcban megüt, ő is elszenvedi ugyanannak a sérülésnek a <Green>200%</>-át.\"\n\n#. Key:\tShardTealBright_name\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardTealBright.ShardTealBright.Name\n#: /Game/SO/Items/Shards/ShardTealBright.ShardTealBright.Name\nmsgctxt \"ItemData\"\nmsgid \"Bright Teal Shard\"\nmsgstr \"Fényes Égkék Szilánk\"\n\n#. Key:\tShardWhite_desc\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardWhite.ShardWhite.Description\n#: /Game/SO/Items/Shards/ShardWhite.ShardWhite.Description\nmsgctxt \"ItemData\"\nmsgid \"Increases your damage by <Green>20%</>\"\nmsgstr \"<Green>20%</>-kal növeli a sebzésedet.\"\n\n#. Key:\tShardWhite_name\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardWhite.ShardWhite.Name\n#: /Game/SO/Items/Shards/ShardWhite.ShardWhite.Name\nmsgctxt \"ItemData\"\nmsgid \"White Shard\"\nmsgstr \"Fehér Szilánk\"\n\n#. Key:\tShardWhiteBright_desc\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardWhiteBright.ShardWhiteBright.Description\n#: /Game/SO/Items/Shards/ShardWhiteBright.ShardWhiteBright.Description\nmsgctxt \"ItemData\"\nmsgid \"Increases your damage by <Green>30%</>.\"\nmsgstr \"<Green>30%</>-kal növeli a sebzésedet.\"\n\n#. Key:\tShardWhiteBright_name\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardWhiteBright.ShardWhiteBright.Name\n#: /Game/SO/Items/Shards/ShardWhiteBright.ShardWhiteBright.Name\nmsgctxt \"ItemData\"\nmsgid \"Bright White Shard\"\nmsgstr \"Fényes Fehér Szilánk\"\n\n#. Key:\tShardYellow_desc\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardYellow.ShardYellow.Description\n#: /Game/SO/Items/Shards/ShardYellow.ShardYellow.Description\nmsgctxt \"ItemData\"\nmsgid \"Each melee strike has a <Yellow>10%</> chance to <Yellow>Stun</> the target.\"\nmsgstr \"Minden közelharci csapásod <Yellow>10%</> eséllyel <Yellow>Kábít</>.\"\n\n#. Key:\tShardYellow_name\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardYellow.ShardYellow.Name\n#: /Game/SO/Items/Shards/ShardYellow.ShardYellow.Name\nmsgctxt \"ItemData\"\nmsgid \"Yellow Shard\"\nmsgstr \"Sárga Szilánk\"\n\n#. Key:\tShardYellowBright_desc\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardYellowBright.ShardYellowBright.Description\n#: /Game/SO/Items/Shards/ShardYellowBright.ShardYellowBright.Description\nmsgctxt \"ItemData\"\nmsgid \"Each melee strike has a <Yellow>20%</> chance to <Yellow>Stun</> the target.\"\nmsgstr \"Minden közelharci csapásod <Yellow>20%</> eséllyel <Yellow>Kábít</>.\"\n\n#. Key:\tShardYellowBright_name\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardYellowBright.ShardYellowBright.Name\n#: /Game/SO/Items/Shards/ShardYellowBright.ShardYellowBright.Name\nmsgctxt \"ItemData\"\nmsgid \"Bright Yellow Shard\"\nmsgstr \"Fényes Sárga Szilánk\"\n\n#. Key:\tSpellCaster_desc\n#. SourceLocation:\t/Game/SO/Items/Useable/SpellCaster.SpellCaster.Description\n#: /Game/SO/Items/Useable/SpellCaster.SpellCaster.Description\nmsgctxt \"ItemData\"\nmsgid \"A magical artefact with the following worn text engraved on the back:\\r\\n\\r\\nInsert Runestones to ... spells\\r\\nKeep .... .... children\\r\\nMade in .....\"\nmsgstr \"Ódon mágikus ereklye, rajta a következő, kissé kopottas véset:\\n\\nAz eszköz Rúnakővel ...\\nGyermekektől .... tartandó\\nKészült: ...\"\n\n#. Key:\tSpellCaster_name\n#. SourceLocation:\t/Game/SO/Items/Useable/SpellCaster.SpellCaster.Name\n#: /Game/SO/Items/Useable/SpellCaster.SpellCaster.Name\nmsgctxt \"ItemData\"\nmsgid \"Spellcaster\"\nmsgstr \"Bűvölő\"\n\n#. Key:\tStraightSword_desc\n#. SourceLocation:\t/Game/SO/Items/Weapons/StraightSword.StraightSword.Description\n#: /Game/SO/Items/Weapons/StraightSword.StraightSword.Description\nmsgctxt \"ItemData\"\nmsgid \"A simple yet effective weapon. Not too rusty, not too sharp. If someone looks close enough it looks a bit low budget, but the ones looking close enough won't talk about anything anymore, will they?\"\nmsgstr \"Egyszerű, de hatékony fegyver, nem túl rozsdás, nem túl éles. Ha valaki közelebbről is megvizsgálja, biztos talál benne hibát, de hát aki annyira közel kerül hozzá, az már úgyse fog róla beszélni, nem igaz?\"\n\n#. Key:\tStraightSword_name\n#. SourceLocation:\t/Game/SO/Items/Weapons/StraightSword.StraightSword.Name\n#: /Game/SO/Items/Weapons/StraightSword.StraightSword.Name\nmsgctxt \"ItemData\"\nmsgid \"Straight Sword\"\nmsgstr \"Hosszúkard\"\n\n#. Key:\tTestStoneBag_desc\n#. SourceLocation:\t/Game/SO/Items/Useable/TestStoneBag.TestStoneBag.Description\n#: /Game/SO/Items/Useable/TestStoneBag.TestStoneBag.Description\nmsgctxt \"ItemData\"\nmsgid \"When you are the one in the team who has the job to enter every dungeon first, you will become a careful one too... if you live long enough for that.\"\nmsgstr \"Ha neked kell a csapatból elsőnek benéznie a katakombákba, akkor idővel óvatossá válsz... már ha megéled.\"\n\n#. Key:\tTestStoneBag_name\n#. SourceLocation:\t/Game/SO/Items/Useable/TestStoneBag.TestStoneBag.Name\n#: /Game/SO/Items/Useable/TestStoneBag.TestStoneBag.Name\nmsgctxt \"ItemData\"\nmsgid \"Bag of the Careful One\"\nmsgstr \"Az Óvatos Ember Zsákja\"\n\n#. Key:\tWheel_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/Wheel.Wheel.Description\n#: /Game/SO/Items/QuestItems/Wheel.Wheel.Description\nmsgctxt \"ItemData\"\nmsgid \"One of the first greatest inventions of humans. Because they envied balls for their rolling skill.\"\nmsgstr \"Az emberiség első komoly találmánya. Nyilván irigyelték a labdákat a gurulási képességeikért.\"\n\n#. Key:\tWheel_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/Wheel.Wheel.Name\n#: /Game/SO/Items/QuestItems/Wheel.Wheel.Name\nmsgctxt \"ItemData\"\nmsgid \"Wheel\"\nmsgstr \"Kerék\"\n\n#. Key:\tWWBossShipLock_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/WWBossShipLock.WWBossShipLock.Description\n#: /Game/SO/Items/Keys/WWBossShipLock.WWBossShipLock.Description\nmsgctxt \"ItemData\"\nmsgid \"Rusty key of a rusty lock.\"\nmsgstr \"Rozsdás kulcs, rozsdás zárhoz.\"\n\n#. Key:\tWWBossShipLock_name\n#. SourceLocation:\t/Game/SO/Items/Keys/WWBossShipLock.WWBossShipLock.Name\n#: /Game/SO/Items/Keys/WWBossShipLock.WWBossShipLock.Name\nmsgctxt \"ItemData\"\nmsgid \"Rusty Key\"\nmsgstr \"Rozsdás Kulcs\"\n\n#. Key:\t0BFD568E4989A20D66B91DA476C0E6B4\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_6.Text\n#: /Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_6.Text\nmsgctxt \"Notes\"\nmsgid \"I promised Fountain to give its flower to the Magic Mirror.\"\nmsgstr \"Megígértem Szökőkútnak, hogy odaadom a virágát a Varázstükör-nek.\"\n\n#. Key:\t1ABD11A64A7649801A6AB6A8BBDC686C\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_9.Text\n#: /Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_9.Text\nmsgctxt \"Notes\"\nmsgid \"The Ghost Dwarf needs a ghost abacus\"\nmsgstr \"Szellem Törpnek jól jönne egy szellem abakusz\"\n\n#. Key:\t57CBE1274A1B4EC7FD68EA9288161AAD\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_7.Text\n#: /Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_7.Text\nmsgctxt \"Notes\"\nmsgid \"The Chef wants me to clear the shore\"\nmsgstr \"Szakács örülne neki, ha megtisztítanám a tópartot a szörnyektől\"\n\n#. Key:\t77693D6C43702786250364932BD34BCD\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note.Text\n#: /Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note.Text\nmsgctxt \"Notes\"\nmsgid \"The GateKeeper could use a chair\"\nmsgstr \"Kapuőrnek kéne egy méretben megfelelő szék\"\n\n#. Key:\t9C3FB78C4598A48BC187B580CBB070F6\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_8.Text\n#: /Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_8.Text\nmsgctxt \"Notes\"\nmsgid \"The Dwarf wants me to clear the Dwarven Fortress\"\nmsgstr \"Leves Törp szeretné, ha kiűzném az ellenséget a Helyőrségből\"\n\n#. Key:\tAA94EB6E4B0A505D730971932A3DE0CC\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_5.Text\n#: /Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_5.Text\nmsgctxt \"Notes\"\nmsgid \"The Golem Maker wants me to hunt some Golems\"\nmsgstr \"A Gólem Készítő szeretné, ha levadásznám a félresikerült Gólemeit\"\n\n#. Key:\tAE371E564EC1D75947ECF98AAA896A2C\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_11.Text\n#: /Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_11.Text\nmsgctxt \"Notes\"\nmsgid \"A Pipe Walker is trapped in a cage\"\nmsgstr \"Egy Battyogó csapdába esett\"\n\n#. Key:\tB12481ED4CFF0182EDB7ACAA416B55FC\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_4.Text\n#: /Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_4.Text\nmsgctxt \"Notes\"\nmsgid \"Gnory needs a wheel\"\nmsgstr \"Gnorynak nincs ki mind a négy kereke\"\n\n#. Key:\tD3B6D81E433CBE8461E2B1AFE06E9741\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_13.Text\n#: /Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_13.Text\nmsgctxt \"Notes\"\nmsgid \"The Chef asked me to bring him some Purple Mushroom\"\nmsgstr \"Szakács megkért, hogy hozzak pár Rózsaszínű Gombát\"\n\n#. Key:\tD8C4FFC7435C6A2E7C88BBA7109A1907\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_12.Text\n#: /Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_12.Text\nmsgctxt \"Notes\"\nmsgid \"I need to learn Dwarven to open a gate\"\nmsgstr \"Meg kéne tanulnom törpül, hogy ki tudjam nyitni a kaput\"\n\n#. Key:\tE3857F07468C2A0B34A98887E3BBB1DA\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_10.Text\n#: /Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_10.Text\nmsgctxt \"Notes\"\nmsgid \"I feel the Tomb of Tabby is important somehow\"\nmsgstr \"Valamiért úgy érzem, Cirmos Sírja fontos\"\n\n#. Key:\tE9DA40684B9375A5F78D18A138C75174\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_2.Text\n#: /Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_2.Text\nmsgctxt \"Notes\"\nmsgid \"Teachy asked for a strangely unique device\"\nmsgstr \"Taninak kellene valami fura eszköz\"\n\n#. Key:\tF109A1614B16565CC1846C8D0A46672E\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_1.Text\n#: /Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_1.Text\nmsgctxt \"Notes\"\nmsgid \"I promised Lory to bring her some books\"\nmsgstr \"Megígértem Lorynak, hogy elhozok neki néhány könyvet\"\n\n#. Key:\taway\n#. SourceLocation:\tSource/SOrb/UI/InGame/SoUIStationPanel.cpp:98\n#: Source/SOrb/UI/InGame/SoUIStationPanel.cpp:98\nmsgctxt \"StationNames\"\nmsgid \"World's End\"\nmsgstr \"Világ Vége\"\n\n#. Key:\tcrossroadcave\n#. SourceLocation:\tSource/SOrb/UI/InGame/SoUIStationPanel.cpp:94\n#: Source/SOrb/UI/InGame/SoUIStationPanel.cpp:94\nmsgctxt \"StationNames\"\nmsgid \"Crossroad Cave\"\nmsgstr \"Keresztút Kő\"\n\n#. Key:\tlavatemple\n#. SourceLocation:\tSource/SOrb/UI/InGame/SoUIStationPanel.cpp:96\n#: Source/SOrb/UI/InGame/SoUIStationPanel.cpp:96\nmsgctxt \"StationNames\"\nmsgid \"Remnant Road\"\nmsgstr \"Örök Ösvény\"\n\n#. Key:\toutpost\n#. SourceLocation:\tSource/SOrb/UI/InGame/SoUIStationPanel.cpp:95\n#: Source/SOrb/UI/InGame/SoUIStationPanel.cpp:95\nmsgctxt \"StationNames\"\nmsgid \"Obedient Outpost\"\nmsgstr \"Törvény Torony\"\n\n#. Key:\tstay\n#. SourceLocation:\tSource/SOrb/UI/InGame/SoUIStationPanel.cpp:99\n#: Source/SOrb/UI/InGame/SoUIStationPanel.cpp:99\nmsgctxt \"StationNames\"\nmsgid \"Stay\"\nmsgstr \"Marad\"\n\n#. Key:\twrackedWaters\n#. SourceLocation:\tSource/SOrb/UI/InGame/SoUIStationPanel.cpp:97\n#: Source/SOrb/UI/InGame/SoUIStationPanel.cpp:97\nmsgctxt \"StationNames\"\nmsgid \"Wracked Waters\"\nmsgstr \"Túlélő Tó\"\n\n"
  },
  {
    "path": "Content/Localization/Warriorb/ro/Warriorb.po",
    "content": "﻿# Warriorb Romanian translation.\n# Copyright 1998-2019 Epic Games, Inc. All Rights Reserved.\n# \nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: Warriorb\\n\"\n\"POT-Creation-Date: 2020-10-07 08:12\\n\"\n\"PO-Revision-Date: 2020-10-07 08:12\\n\"\n\"Language-Team: \\n\"\n\"Language: ro\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Plural-Forms: nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?2:1));\\n\"\n\n#. Key:\t78A72CB345FCC7ECDCFD8181471D78D8\n#. SourceLocation:\t/Game/SO/GUI/UI_Credits.UI_Credits_C:WidgetTree.CreditsText.Text\n#: /Game/SO/GUI/UI_Credits.UI_Credits_C:WidgetTree.CreditsText.Text\nmsgid \"<T>-- Not Yet Team --</>\\r\\n\\r\\n\\r\\nAnna Molnár\\r\\n<R>2D art, Environment Design</>\\r\\n\\r\\n\\r\\nCsaba Molnár\\r\\n<R>Code, Design</>\\r\\n\\r\\n\\r\\nDaniel Butum\\r\\n<R>Code</>\\r\\n\\r\\n\\r\\nGéza Molnár\\r\\n<R>3D art, Design</>\\r\\n\\r\\n\\r\\nRichárd Ráski\\r\\n<R>Sound Design</>\\r\\n\\r\\n\\r\\n\\r\\n<T>-- Music --</>\\r\\n\\r\\nBenjámin Kuli\\r\\n\\r\\n\\r\\nGisula\\r\\n\\r\\n\\r\\n\\r\\n<T>-- Voice Over --</>\\r\\n\\r\\n\\r\\nPeter Luzsi - @peterluzsi\\r\\n<R>WarriOrb, Gatekeeper, Ghost Armor, Principal</>\\r\\n\\r\\n\\r\\nBrent Miller\\r\\n<R>WarriOrb - Trailer</>\\r\\n\\r\\n\\r\\nPierce Riola\\r\\n<R>Wizard, Gnory</>\\r\\n\\r\\n\\r\\nEir Causey\\r\\n<R>Raven, Teachy, Ghost Dwarf, Unknown Wizard, Fishy</>\\r\\n\\r\\n\\r\\nJack Broadbent\\r\\n<R>Monk, Flybug</>\\r\\n\\r\\n\\r\\nEmil Hagg\\r\\n<R>Supper Dwarf, Kobold Chef, Fallen Druid, Dwarven Statue</>\\r\\n\\r\\n\\r\\nErick Nita\\r\\n<R>Golem Maker, Armour Wrath</>\\r\\n\\r\\n\\r\\nAlain Vega\\r\\n<R>Merch Ant</>\\r\\n\\r\\n\\r\\nAngela Tran\\r\\n<R>Lillian, Pipe Walker</>\\r\\n\\r\\n\\r\\nBrittany Ann Phillips\\r\\n<R>Lory</>\\r\\n\\r\\n\\r\\nAurore Gautheur\\r\\n<R>Fountain, Shade</>\\r\\n\\r\\n\\r\\nAlexander Blairlex\\r\\n<R>Primitive Fishy, Ghost Helmet</>\\r\\n\\r\\n\\r\\nSophie Ryder\\r\\n<R>Shadesphere</>\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n<T>-- Partners --</>\\r\\n\\r\\n\\r\\nMaple Whispering\\r\\n<R>Chineese localization</>\\r\\n<R>Publisher - China, PC</>\\r\\n\\r\\n\\r\\nNovy Unlimited\\r\\n<R>PR and Marketing</>\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n<T>-- Localization --</>\\r\\n\\r\\n\\r\\nVera Liscovschi\\r\\n<R>Russian</>\\r\\n\\r\\n\\r\\nJay Johnstone\\r\\n<R>Spanish</>\\r\\n\\r\\n\\r\\nBertin William\\r\\n<R>French</>\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n<T>-- Testers --</>\\r\\n\\r\\n\\r\\nSaleymander\\r\\n\\r\\n\\r\\nHitch\\r\\n\\r\\n\\r\\nMrCalculated\\r\\n\\r\\n\\r\\n<img id=\\\"Rainbow\\\"/>Scorpion253<img id=\\\"Rainbow\\\"/>\\r\\n\\r\\n\\r\\nmoses\\r\\n\\r\\n\\r\\nNinjin42\\r\\n\\r\\n\\r\\nKonstantinos Xenitidis\\r\\n\\r\\n\\r\\nPhyronnaz\\r\\n\\r\\n\\r\\nArthur\\r\\n\\r\\n\\r\\nMaster1G\\r\\n\\r\\n\\r\\nDávid Bartók\\r\\n\\r\\n\\r\\nLiDuGaming\\r\\n\\r\\n\\r\\nClaudiu Coman\\r\\n\\r\\n\\r\\nÁron Ürögdi\\r\\n\\r\\n\\r\\nDukenukemboi\\r\\n\\r\\n\\r\\nBart Cools\\r\\n\\r\\n\\r\\nGlenn De Jonghe\\r\\n\\r\\n\\r\\nDomonkos Péter Madarász\\r\\n\\r\\n\\r\\nGergő Gyarmati\\r\\n\\r\\n\\r\\nRéka Gyarmati\\r\\n\\r\\n\\r\\nKincső Petraskó\\r\\n\\r\\n\\r\\nGergő Petraskó\\r\\n\\r\\n\\r\\nDániel Garamvölgyi\\r\\n\\r\\n\\r\\nDanny \\\"GHelmet\\\" Cloutier\\r\\n\\r\\n\\r\\nAnna Boglárka Tóth\\r\\n\\r\\n\\r\\nBíborka Roxána Kubik\\r\\n\\r\\n\\r\\nVirág Miklós\\r\\n\\r\\n\\r\\nBenedek Marozsák\\r\\n\\r\\n\\r\\nDániel Marozsák\\r\\n\\r\\n\\r\\nGereon Bartel\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n<T>-- Prologue Speedrun Competition Winner --</>\\r\\n\\r\\n-7\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n<T>-- Special Thanks --</>\\r\\n\\r\\n\\r\\nMalazan Discord Server Community\\r\\n\\r\\n\\r\\n/r/metroidvenia Discord Server Community\\r\\n\\r\\n\\r\\nUnreal Slackers Discord Server Community\\r\\n\\r\\n\\r\\nIMGUR\\r\\n\\r\\n\\r\\nBíborka Roxána Kubik\\r\\n\\r\\n\\r\\nSergiu Crăiţoiu\\r\\n\\r\\n\\r\\nJuhász Ernő\\r\\n\\r\\n\\r\\nRacheal Smith\\r\\n\\r\\n\\r\\nRuxandra Seniuc\\r\\n\\r\\n\\r\\nthottee\\r\\n\\r\\n\\r\\nAndrew Pappas\\r\\n\\r\\n\\r\\nJonathan Lampel\\r\\n\\r\\n\\r\\nRichárd Németh\\r\\n\\r\\n\\r\\nAlex Gorcea\\r\\n\\r\\n\\r\\nNotRealVitor\\r\\n\\r\\n\\r\\nKinga Surján\\r\\n\\r\\n\\r\\nAnna Boglárka Tóth\\r\\n\\r\\n\\r\\nÉvi Fekete\\r\\n\\r\\n\\r\\nGergő Sielaf\\r\\n\\r\\n\\r\\n<img id=\\\"Rainbow\\\"/>Scorpion253<img id=\\\"Rainbow\\\"/>\\r\\n\\r\\n\\r\\nMainiac\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n<T>-- Technology --</>\\r\\n\\r\\n\\r\\n<R>WarriOrb uses the Unreal® Engine.</>\\r\\n<R>Unreal® is a trademark or registered trademark of Epic Games, Inc. in the United States of America and elsewhere</>\\r\\n\\r\\n<R>Unreal® Engine, Copyright 1998 – 2020, Epic Games, Inc. All rights reserved.</>\\r\\n\\r\\n\\r\\n\\r\\n<R>Made with FMOD Studio by Firelight Technologies Pty Ltd.</>\"\nmsgstr \"\"\n\n#. Key:\tAxeSpecial_name\n#. SourceLocation:\t/Game/SO/CharacterStrikes/AxeSpecial.AxeSpecial.StrikeName\n#: /Game/SO/CharacterStrikes/AxeSpecial.AxeSpecial.StrikeName\nmsgctxt \"CharacterStrike\"\nmsgid \"Throw\"\nmsgstr \"Aruncă\"\n\n#. Key:\tDemonSwordSpecial_name\n#. SourceLocation:\t/Game/SO/CharacterStrikes/DemonSwordSpecial.DemonSwordSpecial.StrikeName\n#: /Game/SO/CharacterStrikes/DemonSwordSpecial.DemonSwordSpecial.StrikeName\nmsgctxt \"CharacterStrike\"\nmsgid \"Downstrike\"\nmsgstr \"Lovitura de jos\"\n\n#. Key:\tDualBladeSpecial_name\n#. SourceLocation:\t/Game/SO/CharacterStrikes/DualBladeSpecial.DualBladeSpecial.StrikeName\n#: /Game/SO/CharacterStrikes/DualBladeSpecial.DualBladeSpecial.StrikeName\nmsgctxt \"CharacterStrike\"\nmsgid \"Backslash\"\nmsgstr \"Tăietura de spate\"\n\n#. Key:\tLeafMaceSpecial_name\n#. SourceLocation:\t/Game/SO/CharacterStrikes/LeafMaceSpecial.LeafMaceSpecial.StrikeName\n#: /Game/SO/CharacterStrikes/LeafMaceSpecial.LeafMaceSpecial.StrikeName\nmsgctxt \"CharacterStrike\"\nmsgid \"Crushing Blow\"\nmsgstr \"Lovitura zdrobitoare\"\n\n#. Key:\tSabreSpecial_name\n#. SourceLocation:\t/Game/SO/CharacterStrikes/SabreSpecial.SabreSpecial.StrikeName\n#: /Game/SO/CharacterStrikes/SabreSpecial.SabreSpecial.StrikeName\nmsgctxt \"CharacterStrike\"\nmsgid \"Floating Strikes\"\nmsgstr \"Lovituri Plutitoare\"\n\n#. Key:\tSwordSpecialAirStrike_name\n#. SourceLocation:\t/Game/SO/CharacterStrikes/SwordSpecialAirStrike.SwordSpecialAirStrike.StrikeName\n#: /Game/SO/CharacterStrikes/SwordSpecialAirStrike.SwordSpecialAirStrike.StrikeName\nmsgctxt \"CharacterStrike\"\nmsgid \"Air Strike\"\nmsgstr \"Atac Aerian\"\n\n#. Key:\tBPEftAttackSpeedMultiplier_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/BPEftAttackSpeedMultiplier.Default__BPEftAttackSpeedMultiplier_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/BPEftAttackSpeedMultiplier.Default__BPEftAttackSpeedMultiplier_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Quick Hands\"\nmsgstr \"Mâini Rapide\"\n\n#. Key:\tBPEftBootTransmutation_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/BPEftBootTransmutation.Default__BPEftBootTransmutation_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/BPEftBootTransmutation.Default__BPEftBootTransmutation_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Protective Transmutation\"\nmsgstr \"Transmutarea Protectoare\"\n\n#. Key:\tBPEftBounce_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftBounce.Default__BPEftBounce_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftBounce.Default__BPEftBounce_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Charged Bounce\"\nmsgstr \"Săritură Încărcată\"\n\n#. Key:\tBPEftCooldownReducePassive02_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/BPEftCooldownReducePassive02.Default__BPEftCooldownReducePassive02_C.DisplayName\n#. Key:\tBPEftCooldownReduce_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/BPEftCooldownReduce.Default__BPEftCooldownReduce_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/BPEftCooldownReduce.Default__BPEftCooldownReduce_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/BPEftCooldownReducePassive02.Default__BPEftCooldownReducePassive02_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Restlessness\"\nmsgstr \"Neliniște\"\n\n#. Key:\tBPEftCriticalChanceBoost10_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/BPEftCriticalChanceBoost10.Default__BPEftCriticalChanceBoost10_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/BPEftCriticalChanceBoost10.Default__BPEftCriticalChanceBoost10_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Critical Chance\"\nmsgstr \"Șansă Critică\"\n\n#. Key:\tBPEftDamageReflection_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/BPEftDamageReflection.Default__BPEftDamageReflection_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/BPEftDamageReflection.Default__BPEftDamageReflection_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Sparks of Vengeance\"\nmsgstr \"Scântei de Răzbunare\"\n\n#. Key:\tBPEftDmgModifier_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftDmgModifier.Default__BPEftDmgModifier_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftDmgModifier.Default__BPEftDmgModifier_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Perfect Hands\"\nmsgstr \"Mâini Perfecte\"\n\n#. Key:\tBPEftHeal3_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/BPEftHeal3.Default__BPEftHeal3_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/BPEftHeal3.Default__BPEftHeal3_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Heal\"\nmsgstr \"Vindecă\"\n\n#. Key:\tBPEftLifeLeech5_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/BPEftLifeLeech5.Default__BPEftLifeLeech5_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/BPEftLifeLeech5.Default__BPEftLifeLeech5_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Life Leech\"\nmsgstr \"Lipitoare de Viață\"\n\n#. Key:\tBPEftMagicMissle_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftMagicMissle.Default__BPEftMagicMissle_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftMagicMissle.Default__BPEftMagicMissle_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Magic Missile\"\nmsgstr \"Racheta magică\"\n\n#. Key:\tBPEftMassMagicMissle_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftMassMagicMissle.Default__BPEftMassMagicMissle_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftMassMagicMissle.Default__BPEftMassMagicMissle_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Magic Missiles\"\nmsgstr \"Rachete magice\"\n\n#. Key:\tBPEftMassSlow_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftMassSlow.Default__BPEftMassSlow_C.DisplayName\n#. Key:\tBPEftSlow_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/BPEftSlow.Default__BPEftSlow_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/BPEftSlow.Default__BPEftSlow_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftMassSlow.Default__BPEftMassSlow_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Slow\"\nmsgstr \"Încet\"\n\n#. Key:\tBPEftMeteorShower_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftMeteorShower.Default__BPEftMeteorShower_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftMeteorShower.Default__BPEftMeteorShower_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Meteor Shower\"\nmsgstr \"Ploaia de Meteoriți\"\n\n#. Key:\tBPEftRegainSpellPassive25_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/BPEftRegainSpellPassive25.Default__BPEftRegainSpellPassive25_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/BPEftRegainSpellPassive25.Default__BPEftRegainSpellPassive25_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Arcane Luck\"\nmsgstr \"Noroc Arcane\"\n\n#. Key:\tBPEftRegainSpells_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/BPEftRegainSpells.Default__BPEftRegainSpells_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/BPEftRegainSpells.Default__BPEftRegainSpells_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Restoration\"\nmsgstr \"Restaurare\"\n\n#. Key:\tBPEftResModifierMagicalStrong_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftResModifierMagicalStrong.Default__BPEftResModifierMagicalStrong_C.DisplayName\n#. Key:\tBPEftResModifierMagical_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftResModifierMagical.Default__BPEftResModifierMagical_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftResModifierMagical.Default__BPEftResModifierMagical_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftResModifierMagicalStrong.Default__BPEftResModifierMagicalStrong_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Wardskin\"\nmsgstr \"Pielea de Gard\"\n\n#. Key:\tBPEftResModifierPhysical_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftResModifierPhysical.Default__BPEftResModifierPhysical_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftResModifierPhysical.Default__BPEftResModifierPhysical_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Stoneskin\"\nmsgstr \"Pielea de Piatră\"\n\n#. Key:\tBPEftSecondChance_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/BPEftSecondChance.Default__BPEftSecondChance_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/BPEftSecondChance.Default__BPEftSecondChance_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Second Chance\"\nmsgstr \"A doua șansă\"\n\n#. Key:\tBPEftSpellFire0_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftSpellFire0.Default__BPEftSpellFire0_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftSpellFire0.Default__BPEftSpellFire0_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Firestrike\"\nmsgstr \"Atac de Foc\"\n\n#. Key:\tBPEftSpellLightningWalk_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftSpellLightningWalk.Default__BPEftSpellLightningWalk_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftSpellLightningWalk.Default__BPEftSpellLightningWalk_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Shockwalk\"\nmsgstr \"Plimbarea de Șoc\"\n\n#. Key:\tBPEftSpellShadowWalk_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftSpellShadowWalk.Default__BPEftSpellShadowWalk_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftSpellShadowWalk.Default__BPEftSpellShadowWalk_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Shadewalk\"\nmsgstr \"Mersul Umbrei\"\n\n#. Key:\tBPEftSpellShield_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftSpellShield.Default__BPEftSpellShield_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftSpellShield.Default__BPEftSpellShield_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Shield\"\nmsgstr \"Scut\"\n\n#. Key:\tBPEftSpellSoulKeeper_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftSpellSoulKeeper.Default__BPEftSpellSoulKeeper_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftSpellSoulKeeper.Default__BPEftSpellSoulKeeper_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Soulbind\"\nmsgstr \"Legătura Sufletului\"\n\n#. Key:\tBPEftStun_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/BPEftStun.Default__BPEftStun_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/BPEftStun.Default__BPEftStun_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Stun\"\nmsgstr \"Amețește\"\n\n#. Key:\tBPEftStunPassive10_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/BPEftStunPassive10.Default__BPEftStunPassive10_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/BPEftStunPassive10.Default__BPEftStunPassive10_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Stun Chance\"\nmsgstr \"Șansa de Amețire\"\n\n#. Key:\tBPEftSwap_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftSwap.Default__BPEftSwap_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftSwap.Default__BPEftSwap_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Swap\"\nmsgstr \"Schimbă\"\n\n#. Key:\tBPEftTempHPMagical_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftTempHPMagical.Default__BPEftTempHPMagical_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftTempHPMagical.Default__BPEftTempHPMagical_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Magical Protection\"\nmsgstr \"Protecție Magică\"\n\n#. Key:\tBPEftTempHPPhysical_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftTempHPPhysical.Default__BPEftTempHPPhysical_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftTempHPPhysical.Default__BPEftTempHPPhysical_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Physical Protection\"\nmsgstr \"Protecție Fizică\"\n\n#. Key:\tBPEftWeaponFlamesTimeBased_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/BPEftWeaponFlamesTimeBased.Default__BPEftWeaponFlamesTimeBased_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/BPEftWeaponFlamesTimeBased.Default__BPEftWeaponFlamesTimeBased_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Greenflame\"\nmsgstr \"Flacăra verde\"\n\n#. Key:\tBPEftWorthy_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/BPEftWorthy.Default__BPEftWorthy_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/BPEftWorthy.Default__BPEftWorthy_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Worthy\"\nmsgstr \"Vrednic\"\n\n#. Key:\t1E42901841F4C7CEF39536A762076EDF\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.UI_EndScreen_SaveCreatures_C:WidgetTree.TBC1.Text\n#. Key:\t5D04206A499A8B42AF77BAA8BC9B4B8B\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.UI_EndScreen_SaveCreatures_C:WidgetTree.TBC0.Text\n#. Key:\tB0EEBB754110D2821640BE990002AC36\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.UI_EndScreen_SaveCreatures_C:WidgetTree.TBC2.Text\n#. Key:\tD75DCE214B56BA6FD9A58F9EEA9291A5\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.UI_EndScreen_C:WidgetTree.TBC0.Text\n#: /Game/SO/GUI/InGame/UI_EndScreen.UI_EndScreen_C:WidgetTree.TBC0.Text\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.UI_EndScreen_SaveCreatures_C:WidgetTree.TBC0.Text\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.UI_EndScreen_SaveCreatures_C:WidgetTree.TBC1.Text\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.UI_EndScreen_SaveCreatures_C:WidgetTree.TBC2.Text\nmsgctxt \"EndScreen\"\nmsgid \"With his quest completed Monk decided to look for another activity. He thought: <Quote>‘If I could resist madness, others should be able to do the same.’</> And so he opened a monastery to share his mental training techniques with anyone willing to save its sanity.\"\nmsgstr \"Odată cu căutarea finalizată, Călugărul a decis să caute o altă activitate. El a gândit: <Quote> „Dacă aș putea rezista nebuniei, alții ar trebui să poată face același lucru.” </> Și, astfel, a deschis o mănăstire pentru a împărtăși tehnicile sale de pregătire mentală cu oricine dorește să-și salveze sănătatea.\"\n\n#. Key:\t7279EA4741D3DAC5AE92EB99AB851ED9\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.UI_EndScreen_SaveCreatures_C:WidgetTree.TBD0.Text\n#. Key:\t77E809914A65796364FE94B8C2361FD7\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.UI_EndScreen_SaveCreatures_C:WidgetTree.TBD2.Text\n#. Key:\t9C1B477D4582ABAEDC90FCB3AC6737E7\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.UI_EndScreen_C:WidgetTree.TBD0.Text\n#. Key:\tE98C3FDD453FF80CA8EBBE94459A5CAF\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.UI_EndScreen_SaveCreatures_C:WidgetTree.TBD1.Text\n#: /Game/SO/GUI/InGame/UI_EndScreen.UI_EndScreen_C:WidgetTree.TBD0.Text\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.UI_EndScreen_SaveCreatures_C:WidgetTree.TBD0.Text\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.UI_EndScreen_SaveCreatures_C:WidgetTree.TBD1.Text\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.UI_EndScreen_SaveCreatures_C:WidgetTree.TBD2.Text\nmsgctxt \"EndScreen\"\nmsgid \"<Size42>Separating the World also changed something in the Ruined Realm. The wind turned and even Ruin stopped for a moment.</>\"\nmsgstr \"<Size42>Separarea lumii a schimbat și ceva pe Tărâmul Ruinat. Vântul sa schimbat și chiar Ruina sa oprit pentru o clipă.</>\"\n\n#. Key:\t9B476D3D4A603658683498B09968F8AA\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.UI_EndScreen_C:WidgetTree.TBB0.Text\n#: /Game/SO/GUI/InGame/UI_EndScreen.UI_EndScreen_C:WidgetTree.TBB0.Text\nmsgctxt \"EndScreen\"\nmsgid \"When he heard about the lost Kobold tribe he got a bit excited.<Quote>‘Kobolds reserved the ancient knowledge in their rituals’</> he said. <Quote>‘If there is something we can do with Ruin it must be connected to the rituals. I’ll go with you.’</>\"\nmsgstr \"Când a auzit despre tribul pierdut Kobold, el a fost un pic entuziasmat. <Quote> „Kobolds au rezervat cunoștințele antice în ritualurile lor </> a spus el. <Quote> „Dacă există ceva ce putem face cu Ruin, acesta trebuie conectat la ritualuri. Voi merge cu tine. ”</>\"\n\n#. Key:\tDF7F9F754F4FC9CB19DF92AFCE96C5C1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.UI_EndScreen_SaveCreatures_C:WidgetTree.TBA2.Text\n#. Key:\tE8401550448E14DD70717EB7EED0582B\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.UI_EndScreen_SaveCreatures_C:WidgetTree.TBA1.Text\n#. Key:\tUI_EndScreen_entry_0_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(0).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(0).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.UI_EndScreen_SaveCreatures_C:WidgetTree.TBA1.Text\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.UI_EndScreen_SaveCreatures_C:WidgetTree.TBA2.Text\nmsgctxt \"EndScreen\"\nmsgid \"The people soon forgot about the threat, some of them argued that Ruin ever existed.\"\nmsgstr \"Oamenii au uitat curând de amenințare, unii dintre ei au susținut că Ruina nu a existat vreodată.\"\n\n#. Key:\tE9F6E1064D5B2046DF1DEDA386012E2D\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.UI_EndScreen_C:WidgetTree.TBB2.Text\n#. Key:\tUI_EndScreen_entry_6_text_2\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(6).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(6).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.UI_EndScreen_C:WidgetTree.TBB2.Text\nmsgctxt \"EndScreen\"\nmsgid \"He opened a monastery to share his mental training techniques with anyone willing to save its sanity.\"\nmsgstr \"El a deschis o mănăstire pentru a împărtăși tehnicile sale de pregătire mentală cu oricine dorește să își salveze sănătatea.\"\n\n#. Key:\tF0EAD93B44D8D7AEF306EAB75D83FB37\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.UI_EndScreen_C:WidgetTree.TBB1.Text\n#: /Game/SO/GUI/InGame/UI_EndScreen.UI_EndScreen_C:WidgetTree.TBB1.Text\nmsgctxt \"EndScreen\"\nmsgid \"<Quote>‘If I could resist madness, others should be able to do the same’</> - he thought.\"\nmsgstr \"<Quote> „Dacă eu am putut rezista nebuniei, alții ar trebui să poată face același lucru </> - a crezut el.\"\n\n#. Key:\tUI_EndScreen_entry_0_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(0).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(0).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Once the Boundaries of Worlds were sealed, Ruin could do no harm to the Human Realm again.\"\nmsgstr \"După ce granițele lumilor au fost sigilate, Ruina nu mai poate face din nou niciun rău Tărâmului uman.\"\n\n#. Key:\tUI_EndScreen_entry_10_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(10).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(10).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Hearing these news made the Chef really excited.\"\nmsgstr \"Auzind aceste vești l-a făcut pe bucătar foarte bucuros.\"\n\n#. Key:\tUI_EndScreen_entry_10_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(10).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(10).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"<Quote>'Could there be other survivors of my tribe?'</>\"\nmsgstr \"<Quote>'Ar putea exista și alți supraviețuitori ai tribului meu?'</>\"\n\n#. Key:\tUI_EndScreen_entry_10_text_2\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(10).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(10).EndingLogic.Texts(2).Texts\nmsgctxt \"EndScreen\"\nmsgid \"He decided to leave his kitchen and search for his lost relatives.\"\nmsgstr \"A decis să părăsească bucătăria și să-și caute rudele pierdute.\"\n\n#. Key:\tUI_EndScreen_entry_11_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(11).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(11).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"No one knows how he could possibly know about the soup, but Supper Dwarf also appeared to taste the food.\"\nmsgstr \"Nimeni nu știe cum ar fi posibil să știe despre ciorbă, dar Piticul Ciorbă a apărut și el pentru a gusta mâncarea.\"\n\n#. Key:\tUI_EndScreen_entry_11_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(11).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(11).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"When he heard that the chef is leaving he offered his help with the trains.\"\nmsgstr \"Când a auzit că pleacă bucătarul, i-a oferit ajutorul cu trenurile.\"\n\n#. Key:\tUI_EndScreen_entry_11_text_2\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(11).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(11).EndingLogic.Texts(2).Texts\nmsgctxt \"EndScreen\"\nmsgid \"<Quote>‘And I would also like to check what do they eat for supper.’</> he said. <Quote>‘I’m going with you.’</>\"\nmsgstr \"<Quote> „Și aș dori, de asemenea, să verific ce mănâncă pentru cină”. </ema spus el. <Quote> „Mă duc cu tine.” </>\"\n\n#. Key:\tUI_EndScreen_entry_12_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(12).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(12).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"On their way they stopped by the Golem Maker.\"\nmsgstr \"În drum, s-au oprit lângă Creatorul Golemilor.\"\n\n#. Key:\tUI_EndScreen_entry_12_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(12).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(12).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"He was just sitting and staring at nothing.\"\nmsgstr \"Doar stătea și nu privea nimic.\"\n\n#. Key:\tUI_EndScreen_entry_12_text_2\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(12).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(12).EndingLogic.Texts(2).Texts\nmsgctxt \"EndScreen\"\nmsgid \"It was still hard for the Maker to accept that all his work was for nothing.\"\nmsgstr \"Încă a fost greu pentru Creator să accepte că toată munca lui a fost degeaba.\"\n\n#. Key:\tUI_EndScreen_entry_12_text_3\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(12).EndingLogic.Texts(3).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(12).EndingLogic.Texts(3).Texts\nmsgctxt \"EndScreen\"\nmsgid \"At least he stopped creating mindless stone golems.\"\nmsgstr \"Cel puțin a încetat să creeze Golemi de piatră fără minte.\"\n\n#. Key:\tUI_EndScreen_entry_13_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(13).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(13).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"When he heard about the lost Kobold tribe he got a bit excited.\"\nmsgstr \"Când a auzit despre tribul pierdut Kobold, a fost un pic entuziasmat.\"\n\n#. Key:\tUI_EndScreen_entry_13_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(13).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(13).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"<Quote>‘Kobolds reserved the ancient knowledge in their rituals’</> he said.\"\nmsgstr \"<Quote> „Kobolds și-a rezervat cunoștințele antice în ritualurile lor </> a spus el.\"\n\n#. Key:\tUI_EndScreen_entry_13_text_2\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(13).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(13).EndingLogic.Texts(2).Texts\nmsgctxt \"EndScreen\"\nmsgid \"<Quote>‘If there is something we can do with Ruin it must be connected to the rituals. I’ll go with you.’</>\"\nmsgstr \"<Quote> „Dacă există ceva ce putem face cu Ruin, acesta trebuie conectat la ritualuri. Voi merge cu tine. ”</>\"\n\n#. Key:\tUI_EndScreen_entry_14_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(14).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(14).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"However there are things which never change.\"\nmsgstr \"Cu toate acestea, există lucruri care nu se schimbă niciodată.\"\n\n#. Key:\tUI_EndScreen_entry_14_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(14).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(14).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"After days of arguing on who undermined whose business Lory and Gnory separated once again.\"\nmsgstr \"După câteva zile de ceartă cu privire la cine a subminat afacerea Lory și Gnory s-au separat din nou.\"\n\n#. Key:\tUI_EndScreen_entry_15_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(15).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(15).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"While they were arguing Fishy decided to leave Gnory and set out on his own.\"\nmsgstr \"În timp ce se certau, Fishy a decis să o părăsească pe Gnory și a pornit singur.\"\n\n#. Key:\tUI_EndScreen_entry_15_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(15).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(15).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"He had no idea where he was going.\"\nmsgstr \"Nu avea habar unde se ducea.\"\n\n#. Key:\tUI_EndScreen_entry_16_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(16).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(16).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"After weeks of walking alone, he heard a faint excited voice:\"\nmsgstr \"După câteva săptămâni de mers singur, a auzit o voce slabă încântată:\"\n\n#. Key:\tUI_EndScreen_entry_1_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(1).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(1).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"The Mage Council didn’t believe a single word Lillian or Scholar told them about the events.\"\nmsgstr \"Consiliul Magilor nu a crezut nici un singur cuvânt Lillian sau Savantul le-a spus despre evenimente.\"\n\n#. Key:\tUI_EndScreen_entry_1_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(1).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(1).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"They claimed that Wizard died in an unfortunate accident and his device could never actually work anyway.\"\nmsgstr \"Aceștia au afirmat că vrăjitorul a murit într-un accident nefericit și dispozitivul său nu ar putea funcționa oricum.\"\n\n#. Key:\tUI_EndScreen_entry_2_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(2).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(2).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Although Lillian inherited her father’s castle she was sent to an Orphanage until she came into age to live on her own.\"\nmsgstr \"Deși Lillian a moștenit castelul tatălui ei, ea a fost trimisă la un Orfelinat până când a împlinit vârsta pentru a trăi de una singură.\"\n\n#. Key:\tUI_EndScreen_entry_2_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(2).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(2).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Scholar was upset by Lillian’s decision on letting the Ruined Realm fall but he promised Lillian that he will make the Wizard’s Council let Lillian live in his estate.\"\nmsgstr \"Savantul a fost supărat de decizia lui Lillian de a lăsa tărâmul ruinat, dar i-a promis lui Lillian că va face Consiliul Vrăjitorului s-o lase pe Lillian să locuiască în moșia sa.\"\n\n#. Key:\tUI_EndScreen_entry_3_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(3).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(3).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Lillian didn't let the unfortunate events to overcome her. She stopped Ruin even if no one believed her.\"\nmsgstr \"Lillian nu a lăsat întâmplările nefericite să o depășească. O oprit Ruina, chiar dacă nimeni nu o credea.\"\n\n#. Key:\tUI_EndScreen_entry_3_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(3).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(3).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"She also knew that the Ruined Realm still had at least a half century before it was totally destroyed so she decided to keep on looking for a way to save it.\"\nmsgstr \"Știa, de asemenea, că tărâmul ruinat mai avea cel puțin o jumătate de secol înainte de a fi distrus în totalitate, așa că a decis să continue să caute o modalitate de a-l salva.\"\n\n#. Key:\tUI_EndScreen_entry_3_text_2\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(3).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(3).EndingLogic.Texts(2).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Now that her own Realm was safe she could focus on the other Realms.\"\nmsgstr \"Acum, când propriul ei tărâm era în siguranță, se putea concentra pe celelalte tărâmuri.\"\n\n#. Key:\tUI_EndScreen_entry_4_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(4).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(4).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"<Size42>Separating the World also changed something in the Ruined Realm.</>\"\nmsgstr \"<Size42>Separarea lumii a schimbat și ceva pe Tărâmul Ruinat.</>\"\n\n#. Key:\tUI_EndScreen_entry_4_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(4).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(4).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"<Size42>The wind turned and even Ruin stopped for a moment.</>\"\nmsgstr \"<Size42>Vântul se întoarse și chiar Ruina se opri o clipă.</>\"\n\n#. Key:\tUI_EndScreen_entry_5_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(5).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(5).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"When it was certain that no one will be saved from Ruin, as a last desperate act Gate Keeper tried to open a Gate to the Human Realm himself.\"\nmsgstr \"Când era sigur că nimeni nu va fi salvat de la Ruină, ca ultim act disperat, Portarul a încercat să deschidă el însuși o Poartă către Regatul Uman.\"\n\n#. Key:\tUI_EndScreen_entry_5_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(5).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(5).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"A portal opened and swallowed the Keeper.\"\nmsgstr \"Un portal -sa deschis și a înghițit Îngrijitorul.\"\n\n#. Key:\tUI_EndScreen_entry_5_text_2\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(5).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(5).EndingLogic.Texts(2).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Some believed he survived but no one ever met him again.\"\nmsgstr \"Unii au crezut că a supraviețuit, dar nimeni nu l-a mai întâlnit.\"\n\n#. Key:\tUI_EndScreen_entry_6_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(6).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(6).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"With his quest completed Monk decided to look for another activity.\"\nmsgstr \"Odată cu căutarea finalizată, Călugărul a decis să caute o altă activitate.\"\n\n#. Key:\tUI_EndScreen_entry_6_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(6).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(6).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"<Quote>‘If I could resist madness, shouldn't others be able to do the same?’</>- he wondered.\"\nmsgstr \"<Quote> „Dacă eu am putut rezista nebuniei, alții ar trebui să poată face același lucru </>> - se întreba el.\"\n\n#. Key:\tUI_EndScreen_entry_7_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(7).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(7).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"To the surprise of many Teachy also joined Monk and soon he became his best student.\"\nmsgstr \"Spre surprinderea multor Teachy s-a alăturat Călugărului și în curând a devenit cel mai bun student al său.\"\n\n#. Key:\tUI_EndScreen_entry_7_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(7).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(7).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"<Quote>‘To be honest I never actually wanted to be a teacher‘</> - said Teachy.\"\nmsgstr \"<Quote> „Să fiu sincer, nu am vrut niciodată să fiu profesor” </i> - a spus Teachy.\"\n\n#. Key:\tUI_EndScreen_entry_7_text_2\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(7).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(7).EndingLogic.Texts(2).Texts\nmsgctxt \"EndScreen\"\nmsgid \"<Quote>'I also knew that I was a bit mad and since for my insane mind training in a monastery looked like a crazy idea I immediately knew that in fact that's the most sane thing to do.’</>\"\nmsgstr \"<Quote>„Știam, de asemenea, că sunt un pic înnebunit și pentru o vreme pregătirea mea nebunească într-o mănăstire părea o idee nebună, am știut imediat că, de fapt, acesta este cel mai înțelept lucru.”</>\"\n\n#. Key:\tUI_EndScreen_entry_8_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(8).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(8).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Losing his connection to his master, Raven had to think again about his purpose.\"\nmsgstr \"Pierzându-și legătura cu stăpânul său, Corbul a trebuit să se gândească din nou la scopul său.\"\n\n#. Key:\tUI_EndScreen_entry_8_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(8).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(8).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"<Quote>‘I think therefore I am not a bird’</> - he said.\"\nmsgstr \"<Quote> „Cred că, prin urmare, nu sunt o pasăre \\\"</> - a spus el.\"\n\n#. Key:\tUI_EndScreen_entry_8_text_2\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(8).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(8).EndingLogic.Texts(2).Texts\nmsgctxt \"EndScreen\"\nmsgid \"With his vast experience he couldn’t become the same thoughtless bird he once was.\"\nmsgstr \"Cu vasta sa experiență, el nu a putut deveni aceeași pasăre fără gânduri așa cum a fost odată.\"\n\n#. Key:\tUI_EndScreen_entry_8_text_3\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(8).EndingLogic.Texts(3).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(8).EndingLogic.Texts(3).Texts\nmsgctxt \"EndScreen\"\nmsgid \"He joined Monk’s monastery to teach philosophy.\"\nmsgstr \"S-a alăturat mănăstirii Călugărului pentru a preda filozofia.\"\n\n#. Key:\tUI_EndScreen_entry_8_text_4\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(8).EndingLogic.Texts(4).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(8).EndingLogic.Texts(4).Texts\nmsgctxt \"EndScreen\"\nmsgid \"In his free hours he kept on studying the Ancient’s technology hoping that one day he will find a way back to Lillian.\"\nmsgstr \"În orele sale libere, a continuat să studieze tehnologia Antică, în speranța că într-o bună zi va găsi o cale de a se întoarcere către Lillian.\"\n\n#. Key:\tUI_EndScreen_entry_9_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(9).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(9).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"When the soup was almost ready the Pipe Walkers smelled the flavour and they all gathered for a last dinner.\"\nmsgstr \"Când ciorba era aproape gata, Mergătorii pe Țevi au miroset aroma și toți s-au adunat pentru o ultimă cină.\"\n\n#. Key:\tUI_EndScreen_entry_9_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(9).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(9).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"After lunch they started to talk.\"\nmsgstr \"După prânz au început să vorbească.\"\n\n#. Key:\tUI_EndScreen_entry_9_text_2\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(9).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(9).EndingLogic.Texts(2).Texts\nmsgctxt \"EndScreen\"\nmsgid \"One of the Pipe Walkers, who had been in many cages mentioned that she actually met some kobolds far away.\"\nmsgstr \"Unul dintre Mergătorii pe Țev , care fusese în multe cuști, a menționat că a întâlnit de fapt niște Kobolds departe.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_0_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(0).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(0).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"By the time the furious crowd broke into the Wizard’s Castle the Device was completely destroyed.\"\nmsgstr \"Când mulțimea furioasă a intrat în Castelul Vrăjitorului, Dispozitivul a fost complet distrus.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_0_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(0).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(0).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Some left, others started to investigate the building hoping to find something which might stop Ruin.\"\nmsgstr \"Unii au plecat, alții au început să cerceteze clădirea în speranța de a găsi ceva care ar putea opri Ruina.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_10_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(10).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(10).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"<Quote>‘Kobolds reserved the ancient knowledge in their rituals’</> Golem Maker said. <Quote>‘If there is something we can do with Ruin it must be connected to the rituals. I’ll go with you.’</>\"\nmsgstr \"<Quote>„Kobolds și-a rezervat cunoștințele străvechi în ritualurile lor\\\"</> Creatorul de Golemi a spus. <Quote>„Dacă există ceva ce putem face cu Ruin, acesta trebuie să fie conectat la ritualuri. Voi merge cu tine.\\\"</>\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_10_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(10).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(10).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Golem Maker was a huge help to Lillian with his knowledge on Golemology and it was not easy for Lillian to let him go.\"\nmsgstr \"Creatorul de Golemi a fost un ajutor uriaș pentru Lillian cu cunoștințele sale despre Golemi și nu a fost ușor pentru Lillian să-l lase să plece.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_10_text_2\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(10).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(10).EndingLogic.Texts(2).Texts\nmsgctxt \"EndScreen\"\nmsgid \"<Quote>‘Have no fear!’</> Golem Maker said. <Quote>‘I will return with even more knowledge and we’ll stop Ruin once and for all.’</>\"\nmsgstr \"<Quote>'Nu te teme!'</> Creatorul de Golemi a spus. <Quote>‘Voi reveni cu și mai multe cunoștințe și vom opri Ruina o dată pentru totdeauna.’</>\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_11_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(11).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(11).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"After Kobold Chef left, Supper Dwarf had to take care of the kitchen.\"\nmsgstr \"După ce Bucătarul Kobold plecat, Piticul Supă a trebuit să aibă grijă de bucătărie.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_11_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(11).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(11).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"It turned out that he is also really talented at making food.\"\nmsgstr \"S-a dovedit că este, de asemenea, cu adevărat talentat în a face mâncare.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_11_text_2\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(11).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(11).EndingLogic.Texts(2).Texts\nmsgctxt \"EndScreen\"\nmsgid \"<Quote> ‘That is because I know exactly what the final result should be’</> he explained.\"\nmsgstr \"<Quote> „Asta pentru că știu exact care ar trebui să fie rezultatul final” </> a explicat el.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_11_text_3\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(11).EndingLogic.Texts(3).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(11).EndingLogic.Texts(3).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Later he opened a restaurant which soon became really popular.\"\nmsgstr \"Mai târziu a deschis un restaurant care a devenit în curând foarte popular.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_11_text_4\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(11).EndingLogic.Texts(4).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(11).EndingLogic.Texts(4).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Some say mostly because he hired Pipe Walkers to serve the meal and for marketing purposes.\"\nmsgstr \"Unii spun mai ales pentru că a angajat Mergătorii pe Țevi pentru a servi masa și în scopuri de marketing.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_12_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(12).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(12).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Monk decided to stay in the Ruined Realm.\"\nmsgstr \"Călugărul a decis să rămână pe Tărâmul Ruinat.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_12_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(12).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(12).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"<Quote>‘Even if it was not enough I did all I could. I’m done.’</> he said.\"\nmsgstr \"<Quote> „Chiar dacă nu a fost suficient am făcut tot ce am putut. Am terminat. ”</> A spus el.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_12_text_2\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(12).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(12).EndingLogic.Texts(2).Texts\nmsgctxt \"EndScreen\"\nmsgid \"He sat down on a mountaintop and started meditating.\"\nmsgstr \"S-a așezat pe un munte și a început să mediteze.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_13_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(13).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(13).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"A few weeks later he realized that even though he failed his quest he still should do something.\"\nmsgstr \"Câteva săptămâni mai târziu și-a dat seama că, deși a eșuat în căutarea lui, tot ar trebui să facă ceva.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_13_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(13).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(13).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"<Quote>‘Due to my training I can resist Ruin’</> he thought. <Quote>‘No one has ever seen what’s there where Ruin destroyed the lands. If I train harder I might be able to get closer to Ruin to see what it really is.’</>\"\nmsgstr \"<Quote> „Datorită antrenamentului meu pot rezista ruinei” </> a gândit el. <Quote> „Nimeni nu a văzut ce este acolo unde Ruina a distrus țările. Dacă mă antrenez mai greu, aș putea să mă apropii de Ruin pentru a vedea care este cu adevărat. ”</>\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_13_text_2\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(13).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(13).EndingLogic.Texts(2).Texts\nmsgctxt \"EndScreen\"\nmsgid \"He kept on practising and soon set out on a journey into the heart of Ruin to find answers to questions even he didn’t know.\"\nmsgstr \"El a continuat să practice și a pornit curând într-o călătorie în inima Ruinei pentru a găsi răspunsuri la întrebări pe care nici el nu le știa.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_14_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(14).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(14).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Lory and Gnory suddenly found themselves in a world full of possible customers.\"\nmsgstr \"Lory și Gnory s-au trezit brusc într-o lume plină de clienți posibili.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_14_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(14).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(14).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Of course it didn’t mean they stopped arguing on who undermined whose business but finally they both had the chance to run a successful trading company.\"\nmsgstr \"Desigur, aceasta nu a însemnat că au încetat să se certe pe cine a subminat afacerea, dar în cele din urmă au avut șansa de a conduce o societate comercială de succes.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_15_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(15).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(15).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Gnory specialized himself in selling medicine which were said to heal the sickness which was spreading as Ruin reached closer.\"\nmsgstr \"Gnory s-a specializat în vânzarea de medicamente despre care se spune că vindecă boala care se răspândea pe măsură ce Ruina se apropia.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_15_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(15).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(15).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Lory specialized in medicine which were said to heal the sickness which was caused by the medicine of Gnory.\"\nmsgstr \"Lory s-a specializat în medicină despre care se spune că vindecă boala care a fost cauzată de medicamentele lui Gnory.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_16_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(16).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(16).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Lory’s herbaria worked out.\"\nmsgstr \"Herbarium lui Lory a funcționat.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_16_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(16).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(16).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Soon she started to sell other medicine and healing devices as well.\"\nmsgstr \"Curând a început să vândă și alte medicamente și dispozitive de vindecare.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_17_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(17).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(17).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"As for Gnory, he decided to sell lots of different things in the City Prison which turned out to be his new home for a while.\"\nmsgstr \"În ceea ce privește Gnory, a decis să vândă multe lucruri diferite în închisoarea din oraș, care s-a dovedit a fi noua lui casă pentru o perioadă.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_18_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(18).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(18).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Fishy didn’t like the medicine business so he left Gnory.\"\nmsgstr \"Lui Pește nu i-a plăcut afacerea cu medicamente, așa că a părăsit Gnory.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_18_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(18).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(18).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"He joined Monk for a while to learn the mental training techniques which reserved Monk’s sanity.\"\nmsgstr \"El s-a alăturat Călugărului pentru o vreme pentru a învăța tehnicile de antrenament mental care au păstrat sănătatea Călugărului.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_18_text_2\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(18).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(18).EndingLogic.Texts(2).Texts\nmsgctxt \"EndScreen\"\nmsgid \"<Quote>‘Fishy think it is important’ </>he said.<Quote> ‘If Monk go to see Ruin, Fishy need to learn it.’</>\"\nmsgstr \"<Quote> „Pește crede că este important” </> a spus el. <Quote> „Dacă călugărul va vedea Ruina, Peșțele trebuie să învețe.” </u>\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_18_text_3\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(18).EndingLogic.Texts(3).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(18).EndingLogic.Texts(3).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Monk accepted Fishy as his apprentice and taught him all that was possible.\"\nmsgstr \"Călugărul l-a acceptat pe Pește ca ucenic și i-a învățat tot ce era posibil.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_18_text_4\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(18).EndingLogic.Texts(4).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(18).EndingLogic.Texts(4).Texts\nmsgctxt \"EndScreen\"\nmsgid \"<Quote>‘Now is the time’</> Monk said one day. <Quote>’Go to the Human Realm and prepare the people.’</>\"\nmsgstr \"<Quote>‘Acuma este timpul’</> a spus Călugărul într-o zi. <Quote>„Mergi pe Tărâmul Uman și pregătiți oamenii.\\\"</>\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_19_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(19).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(19).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"On his way to the Human Realm Fishy heard a faint excited voice:\"\nmsgstr \"În drum spre Tărâmul Uman, Fishy a auzit o voce slab încântată:\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_19_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(19).EndingLogic.Texts(1).Texts\n#. Key:\tUI_EndScreen_entry_16_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(16).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(16).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(19).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"<Quote>‘Hey there! I’m fed up with microtransactions. Can I go with ya man?’</>\"\nmsgstr \"<Quote>'Buna! Sunt enervat de microtranzacții. Pot să merg cu tine?</>\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_19_text_2\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(19).EndingLogic.Texts(2).Texts\n#. Key:\tUI_EndScreen_entry_16_text_2\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(16).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(16).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(19).EndingLogic.Texts(2).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Merch Ant and Fishy soon became best friends and ventured on together.\"\nmsgstr \"Furnica Comerciant și Pește au devenit curând cei mai buni prieteni și s-au aventurat împreună.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_1_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(1).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(1).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"A few hours later members of the Mage Council arrived along with the city guards.\"\nmsgstr \"Câteva ore mai târziu, membrii Consiliului Vrăjitorilor au sosit împreună cu paznicii orașului.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_1_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(1).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(1).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"The Council claimed that Wizard died in an unfortunate accident, his device could never actually work anyway and Ruin is nothing to fear of.\"\nmsgstr \"Consiliul a afirmat că vrăjitorul a murit într-un accident nefericit, dispozitivul său niciodată nu ar putea funcționa oricum și Ruin nu este ceva de care să îți fie teamă.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_1_text_2\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(1).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(1).EndingLogic.Texts(2).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Although it was total nonsense Lillian and Scholar was happy that the crowd were taken away from the Castle.\"\nmsgstr \"Deși era o prostie totală, Lillian și Savantul erau fericiți că mulțimea a fost luată departe de Castel.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_20_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(20).EndingLogic.Texts(0).Texts\n#. Key:\tUI_EndScreen_entry_17_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(17).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(17).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(20).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"The World was still about to end, but as one Pipe Walker wisely said:\"\nmsgstr \"Lumea era încă pe punctul de a se sfârși, dar așa cum a spus un înțelept Mergător pe Țevi:\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_21_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(21).EndingLogic.Texts(0).Texts\n#. Key:\tUI_EndScreen_entry_18_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(18).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(18).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(21).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"As some stories ended some new ones begun. Though what happened afterwards is not yet known.\"\nmsgstr \"Pe măsură ce unele povești s-au încheiat, au început unele noi. Deși ceea ce s-a întâmplat ulterior nu se știe încă.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_2_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(2).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(2).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"When they were left alone they quickly started the evacuation of the Ruined Realm.\"\nmsgstr \"Când au fost lăsați singuri, au început rapid evacuarea Tărâmului Ruinat.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_3_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(3).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(3).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Even though she lost her father Lillian couldn’t afford to let sadness overcome her.\"\nmsgstr \"Chiar dacă și-a pierdut tatăl, Lillian nu și-a permis să lase tristețea să o învingă.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_3_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(3).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(3).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Ruin was more of a threat now than ever before, and since the Mage Council didn’t believe in Ruin it was the task of Lillian and Scholar to repair the device.\"\nmsgstr \"Ruina era o amenințare mai mare ca niciodată și din momentul ce Consiliul Mage nu credea în Ruină, a fost sarcina lui Lillian și a Savantului să repare dispozitivul.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_4_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(4).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(4).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Scholar was really proud of Lillian because she managed to save time for the evacuation.\"\nmsgstr \"Savantul era cu adevărat mândru de Lillian pentru că a reușit să economisească timp pentru evacuare.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_4_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(4).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(4).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"<Quote>‘I know Wizard would have disagreed but you did the right thing. We still have time to face Ruin. We couldn’t let everyone die there.’</>\"\nmsgstr \"<Quote>'Știu că vrăjitorul nu ar fi fost de acord, dar ai făcut ceea ce trebuie. Mai avem timp să ne confruntăm Ruina. Nu am putut lăsa pe toți să moară acolo. '</>\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_5_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(5).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(5).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"As time passed Scholar started to behave a bit odd which made Lillian really anxious.\"\nmsgstr \"Odată cu trecerea timpului, savantul a început să se comporte un pic ciudat, ceea ce a făcut-o pe Lillian să fie într-adevăr neliniștită.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_5_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(5).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(5).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Ruin was close and the solution was still far away.\"\nmsgstr \"Ruina era aproape și soluția era încă departe.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_5_text_2\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(5).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(5).EndingLogic.Texts(2).Texts\nmsgctxt \"EndScreen\"\nmsgid \"When she talked about her concerns to Raven, the bird said:\"\nmsgstr \"Când a vorbit despre preocupările sale cu Corbul, pasărea a spus:\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_5_text_3\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(5).EndingLogic.Texts(3).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(5).EndingLogic.Texts(3).Texts\nmsgctxt \"EndScreen\"\nmsgid \"<Quote>‘Focus on what you are doing Lillian. He was a bit odd anyway.’</>\"\nmsgstr \"<Quote>\\\"Concentrează-te pe ceea ce faci Lillian. Era oricum un pic ciudat. \\\"</>\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_6_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(6).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(6).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"To the surprise of many Teachy turned out to be an excellent researcher.\"\nmsgstr \"Spre surprinderea multor Teachy s-a dovedit a fi un cercetător excelent.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_6_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(6).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(6).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"<Quote>‘To be honest I never wanted to be a teacher’ </>he said. <Quote>‘I only stayed at University so that I can do some more research work. But my students never let me research during lectures.’</>\"\nmsgstr \"<Quote> „Ca să fiu sincer nu am vrut niciodată să fiu profesor” </> a spus el. <Quote> „Am rămas doar la Universitate, pentru a putea face și alte lucrări de cercetare. Dar studenții mei nu m-au lăsat niciodată să cercetez în timpul lecturilor. ”</>\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_6_text_2\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(6).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(6).EndingLogic.Texts(2).Texts\nmsgctxt \"EndScreen\"\nmsgid \"He joined Lillian and dug into every book he could possibly find on the Ancient’s technology.\"\nmsgstr \"S-a alăturat lui Lillian și a căutat în fiecare carte pe care ar putea să o găsească despre Tehnologia Anticilor.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_7_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(7).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(7).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"The new environment and being a bit further from Ruin made good to the Gate Keeper.\"\nmsgstr \"Noul mediu și fiind un pic mai departe de Ruin i-au făcut bine Portarilor.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_7_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(7).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(7).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"He organized some of the cleaners to repair the Castle so that Lillian can keep on with her work.\"\nmsgstr \"El a organizat câțiva dintre curățătorii pentru a repara Castelul, pentru ca Lillian să poată continua munca ei.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_7_text_2\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(7).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(7).EndingLogic.Texts(2).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Later he started to remember things from the Runic Realm which helped Lillian a lot.\"\nmsgstr \"Mai târziu a început să-și amintească lucruri de pe tărâmul Runic, care l-au ajutat foarte mult pe Lillian.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_8_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(8).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(8).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"One day a Pipe Walker, who had been in many cages mentioned that she met some kobolds far away who might be other survivors of the Kobold Chef’s tribe.\"\nmsgstr \"Într-o zi, un Mergător pe Țeavă, care fusese în multe cuști, a menționat că a întâlnit niște Kobolds departe, care ar putea fi alți supraviețuitori ai tribului Bucătarului Kobold.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_9_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(9).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(9).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Hearing this news made Kobold Chef really excited.\"\nmsgstr \"Auzind această veste l-a făcut pe Bucătarul Kobold cu adevărat încântat.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_9_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(9).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(9).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"He decided to return to the Ruined Realm and search for his lost relatives.\"\nmsgstr \"A decis să se întoarcă pe Tărâmul Ruinat și să-și caute rudele pierdute.\"\n\n#. Key:\tSoAct1_EG_AAFirstDroneTrio_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Drones were even more intelligent than Maintainers. They not only memorized texts, they helped correct grammar, changed the message if it was too insulting or even made up poems if they were asked to do so.\"\nmsgstr \"Dronele erau chiar mai inteligente decât întreținătorii. Nu numai că au memorat textele, ci au ajutat la corectarea gramaticii, au schimbat mesajul dacă a fost prea insultător sau chiar au alcătuit poezii dacă li s-a cerut acest lucru.\"\n\n#. Key:\tSoAct1_EG_AAFirstDroneTrio_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"The Flying Three\"\nmsgstr \"Cei Trei Zburători\"\n\n#. Key:\tSoAct1_EG_AfterGateCleaners_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Citizens of Cerulean requested to have their own unique Golems, but it was always rejected. This situation was very good for the Black Golem Market, because this way it was always easy to find customers.\"\nmsgstr \"Cetățenii din Cerulean au cerut să aibă propriile lor Gooemi, dar a fost întotdeauna respins. Această situație a fost foarte bună pentru piața Neagră de Golemi, deoarece în acest fel a fost întotdeauna ușor să găsești clienți.\"\n\n#. Key:\tSoAct1_EG_AfterGateCleaners_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Cleaners of Cerulean\"\nmsgstr \"Curățătorii Ceruleanului\"\n\n#. Key:\tSoAct1_EG_AfterGateElits_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"The Runic Realm's Government didn't allow the Golems to become the privilege of the rich. Even though the elite were not allowed to have different Golems they always found a way to make their servants different than the ones owned by the poor.\"\nmsgstr \"Guvernul Regatului Runic nu a permis Golemii să devină privilegiul celor bogați. Chiar dacă elitei nu li s-a permis să aibă Golemi diferiți, au găsit întotdeauna o modalitate de a-i face pe slujitorii lor diferiți de cei deținuți de săraci.\"\n\n#. Key:\tSoAct1_EG_AfterGateElits_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Capetainers\"\nmsgstr \"Curățătorii Căpitani\"\n\n#. Key:\tSoAct1_EG_AGRightFromPortal_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"'Just keep cleaning! Cleaning, cleaning...'\"\nmsgstr \"„Continuați curățarea! Curățare, curățare ... '\"\n\n#. Key:\tSoAct1_EG_AGRightFromPortal_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Cleaner Invasion\"\nmsgstr \"Invazie Curățătorilor\"\n\n#. Key:\tSoAct1_EG_AGTestStoneCircle_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"The Black Golem Market was funded by a Golem Maker apprentice who failed his master exam and was banished from school. No wonder his golems were... unique.\"\nmsgstr \"Piața Neagră a Golemilor a fost finanțată de un Creator ucenic de Golemi care nu a reușit examenul de master și a fost alungat de la școală. Nu e de mirare că golemurile lui erau... unice.\"\n\n#. Key:\tSoAct1_EG_AGTestStoneCircle_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Weird Golems\"\nmsgstr \"Golemi ciudați\"\n\n#. Key:\tSoAct1_EG_AGWallJumpTeam_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"The cleaning plan for this area fell apart with the participants.\"\nmsgstr \"Planul de curățenie pentru această zonă s-a destrămat cu participanții.\"\n\n#. Key:\tSoAct1_EG_AGWallJumpTeam_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"The North Team\"\nmsgstr \"Echipa de Nord\"\n\n#. Key:\tSoAct1_EG_ArcadeDungeonCleaners_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"The Golem's behaviour was specified by the Golem Makers. Only very simple personalities were made at the beginning. The Cleaners, for example, only desired to keep the place tidy and make sure they don't harm the people.\"\nmsgstr \"Comportamentul Golemilor a fost specificat de Creatorii de Golemi. La început, au fost făcute doar personalități foarte simple. De exemplu, Golemii de curățare au dorit doar să păstreze locul ordonat și să se asigure că nu fac rău oamenilor.\"\n\n#. Key:\tSoAct1_EG_ArcadeDungeonCleaners_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Arcade Cleaners\"\nmsgstr \"Curățătorii Arcadei\"\n\n#. Key:\tSoAct1_EG_ArcadeDungeonExit_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"After creating intelligence Golem Makers wanted even more. They wanted complex personality. They wanted Golems that can not only think but also feel. That was the idea behind designing the Gatekeepers.\"\nmsgstr \"După crearea inteligenței, Creatorii de Golemi și-au dorit și mai mult. Își doreau personalitate complexă. Au dorit Golemi care nu numai că pot gândi, dar și simți. Aceasta a fost ideea din spatele proiectării Portarilor.\"\n\n#. Key:\tSoAct1_EG_ArcadeDungeonExit_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Arcade Servants\"\nmsgstr \"Slujitori Arcadei\"\n\n#. Key:\tSoAct1_EG_ArcadeDungeonOptional_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"You might wonder if a Vacuum Cleaner is designed to clean dust away why does it need a laser caster?\"\nmsgstr \"Te-ai putea întreba dacă un aspirator este conceput pentru a curăța praful de ce are nevoie de un laser?\"\n\n#. Key:\tSoAct1_EG_ArcadeDungeonOptional_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Vacuum Cleaners group\"\nmsgstr \"Grupul Aspiratoarelor\"\n\n#. Key:\tSoAct1_EG_ArcadeMaintainers_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"The very first Golems were made to do the most monotonic work so that people have more time to think and to create. Once they were friendly but as Ruin came their behaviour changed.\"\nmsgstr \"Primii Golemi au fost făcuți să facă cea mai monotonă muncă, astfel încât oamenii să aibă mai mult timp să gândească și să creeze. Odată au fost prietenoși, dar pe măsură ce Ruina a venit comportamentul lor s-a schimbat.\"\n\n#. Key:\tSoAct1_EG_ArcadeMaintainers_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Arcade Cleaner Golems\"\nmsgstr \"Golemi pentru curățarea arcadelor\"\n\n#. Key:\tSoAct1_EG_Chest_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"The poor chest was minding his own business before you started to insult him.\"\nmsgstr \"Bietul cufăr își vedea de propria treabă înainte să îl jignești.\"\n\n#. Key:\tSoAct1_EG_Chest_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Chest\"\nmsgstr \"Cufăr\"\n\n#. Key:\tSoAct1_EG_GGMiniBoss_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Maybe it only depends on the creation process, but some Golems had stronger personality. In general, Golems with more intelligence resisted Ruin longer and Golems with strong personality were more vulnerable to the infection.\"\nmsgstr \"Poate că depinde doar de procesul de creație, dar unii Golemi aveau o personalitate mai puternică. În general, Golemii cu mai multă inteligență au rezistat mai mult Ruinei și Golemii cu personalitate puternică au fost mai vulnerabili la infecție.\"\n\n#. Key:\tSoAct1_EG_GGMiniBoss_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Wickeds\"\nmsgstr \"Rău\"\n\n#. Key:\tSoAct1_EG_LoneDrone_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Drones delivered messages and gifts before Ruin. People were happy when they heard them approaching back then.\"\nmsgstr \"Înainte de Ruină Dronele au livrat mesaje și cadouri. Înainte erau multe zboruri în aerul orașului. Pe atunci oamenii erau fericiți când au auzit o dronă apropiindu-se.\"\n\n#. Key:\tSoAct1_EG_LoneDrone_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Lone Drone\"\nmsgstr \"Dronă Singuratică\"\n\n#. Key:\tSoAct1_EG_LoneSewerDrone_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"After Ruin most Golems liked to group together. Only a few chose to stay alone.\"\nmsgstr \"După Ruină celor mai mulți Golemi le plăcea să stea in grupuri. Numai câțiva au decis să stea singuri.\"\n\n#. Key:\tSoAct1_EG_LoneSewerDrone_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Another Lone Drone\"\nmsgstr \"Înca o Dronă Singuratică\"\n\n#. Key:\tSoAct1_EG_MaceGroup_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"'Attention: our enemies greatest weapon, the holy Mace is stolen. We truly should have destroyed it as the Council suggested.'\"\nmsgstr \"'Atenție: cea mai mare armă a dușmanilor noștri, sfântul Buzdugan este furat. Ar fi trebuit să o distrugem așa cum a sugerat Consiliul. ”\"\n\n#. Key:\tSoAct1_EG_MaceGroup_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Mace Defenders\"\nmsgstr \"Apărătorii Buzduganului\"\n\n#. Key:\tSoAct1_EG_MaintainerInvestigatorInvestigators_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"After Ruin, Golems started to have strange behavior. There were a group of them who used the pipes to flood a part of the City. Later these places were called the Sewer.\"\nmsgstr \"După Ruin, Golemii au început să aibă un comportament ciudat. Au fost un grup dintre ei care au folosit conductele pentru a inunda o parte a orașului. Mai târziu aceste locuri au fost numite Canalizare.\"\n\n#. Key:\tSoAct1_EG_MaintainerInvestigatorInvestigators_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Pipe Golems\"\nmsgstr \"Golemii de pe Țevi\"\n\n#. Key:\tSoAct1_EG_MaintainerInvestigators_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Not only the Golems were created by using the Spirits of the Unknown World before Ruin. People found other ways of using this new technology. They created pipes to convey hot water to heat the city and cold water to drink.\"\nmsgstr \"Înainte de ruina nu numai Golemii au fost creați prin utilizarea spiritelor lumii necunoscute, oamenii au găsit curând alte modalități de utilizare a noilor tehnologii. Au creat țevi pentru a transmite apă caldă pentru a încălzi orașul și apă rece pentru a o bea.\"\n\n#. Key:\tSoAct1_EG_MaintainerInvestigators_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Maintainers of the Pipes\"\nmsgstr \"Întreținătorii Țevilor\"\n\n#. Key:\tSoAct1_EG_SABeforeWallJump_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Some believed cold can resist Ruin longer than magic. They created places where they kept the temperature beneath the freezing point. As it turned out, not even coldness can resist Ruin forever.\"\nmsgstr \"Unii credeau că frigul poate rezista Ruinei mai mult decât magia. Au creat locuri unde au menținut temperatura sub punctul de îngheț. Așa cum s-a dovedit, nici măcar răceala nu poate rezista Ruina pentru totdeauna.\"\n\n#. Key:\tSoAct1_EG_SABeforeWallJump_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Cleaners of the Refrigerator.\"\nmsgstr \"Curățătorii Frigiderului.\"\n\n#. Key:\tSoAct1_EG_SAFightMustHave_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"'We won't clear anymore!' said the rebel Maintainer.\\r\\n'Let's declear War!'\"\nmsgstr \"\"\n\n#. Key:\tSoAct1_EG_SAFightMustHave_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Underground Cleaner Band\"\nmsgstr \"Banda de Curățare Subterană\"\n\n#. Key:\tSoAct1_EG_SAFightOptional_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"'Let's make something clear. Maybe this room?'\"\nmsgstr \"„Să curățăm ceva. Poate această cameră.\\\"\"\n\n#. Key:\tSoAct1_EG_SAFightOptional_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Underground Cleaner Band B\"\nmsgstr \"Banda de curățare subterană B\"\n\n#. Key:\tSoAct1_EG_SewerCircleVacuumCleaners_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"People realised that Golem's Spirits have a power beyond imagination. They called it the Ancient Magic. Vacuum Cleaners could use this magic to do their job even better.\"\nmsgstr \"Oamenii și-au dat seama că spiritele Golemilor au o putere dincolo de imaginație. Ei au numit-o Magia Antică. Aspiratoarele ar putea folosi această magie pentru a-și face treaba și mai bine.\"\n\n#. Key:\tSoAct1_EG_SewerCircleVacuumCleaners_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Vacuum Cleaners\"\nmsgstr \"Aspiratoare\"\n\n#. Key:\tSoAct1_EG_SewerTeam_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Golem Makers wanted to create something more intelligent as they learned more. They shaped the Maintainers, the first golems capable of talking. Sadly their intelligence vanished as Ruin came.\"\nmsgstr \"Pe măsură ce au aflat mai multe, Creatorii Golemilor au dorit să creeze ceva mai inteligent. Așa că i-au modelat pe menținerii care puteau să vorbească și să facă orice fel de muncă. Din păcate, inteligența lor a dispărut pe măsură ce Ruina a venit.\"\n\n#. Key:\tSoAct1_EG_SewerTeam_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Sewer Golems\"\nmsgstr \"Golemii de Canal\"\n\n#. Key:\tSoAct1_EG_TL_VacuumTwins_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Libraries were important in the life of the former Realm's citizens. No wonder that many of the golems were created only to dust and organize the books.\"\nmsgstr \"Bibliotecile au fost importante în viața cetățenilor fostului tărâm. Nu este de mirare că mulți dintre Golemi au fost creați doar pentru a curăța praful și a organiza cărțile.\"\n\n#. Key:\tSoAct1_EG_TL_VacuumTwins_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Library Cleaners\"\nmsgstr \"Curățătorii de la Bibliotecă\"\n\n#. Key:\tSoAct1_EG_TLSewerCreatureWatch_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Golems never ever attacked the Pipe Walkers. The reason is only known by the wisest Pipe Walker himself. It is because, as he explained: 'Nun dara bum, tuk la.'\"\nmsgstr \"Golemii nu a atacat niciodată pe Mergătorii pe Țevi. Motivul este cunoscut doar de înțeleptul Mergător pe Țevi însuși. Se datorează faptului că, după cum a explicat: „Nun dara bum, tuk la.”\"\n\n#. Key:\tSoAct1_EG_TLSewerCreatureWatch_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Sewer Team B\"\nmsgstr \"Echipa de Canalizare B\"\n\n#. Key:\tSoAct1_EG_TowerTrio_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"They spent most of their time on the top of those towers - it was clear to me that they would die there as well.\"\nmsgstr \"Și-au petrecut cea mai mare parte a timpului în acelor turnuri - mi-a fost clar că vor muri acolo.\"\n\n#. Key:\tSoAct1_EG_TowerTrio_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"The Tower Trio\"\nmsgstr \"Turnul Trio\"\n\n#. Key:\tSoAct2_EG_BounceTrio_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Lava Jumpers are former Golems who fell into the lava. Some of them return to join their former Golem companions.\"\nmsgstr \"Săritorii de Lavs sunt foști Golemi care au căzut în lavă. Unii dintre ei se întorc să se alăture foștilor lor tovarăși Golemi.\"\n\n#. Key:\tSoAct2_EG_BounceTrio_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Bounce Trio\"\nmsgstr \"Săritura Trio\"\n\n#. Key:\tSoAct2_EG_C_BeforeKey_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"It's still unclear what makes some creatures touched by Ruin to group together. Some believes those who had similar emotions when Ruin came were likely to form a group.\"\nmsgstr \"Încă nu este clar ce face ca unele creaturi să fie atinse de Ruin să se grupeze. Unii consideră că cei care au avut emoții similare atunci când a venit Ruina au avut șansa mai mare să formeze un grup.\"\n\n#. Key:\tSoAct2_EG_C_BeforeKey_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Anxious Armours\"\nmsgstr \"Armuri Anxioase\"\n\n#. Key:\tSoAct2_EG_C_Bridge_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Crafting was always the obsession of Dwarves. In their workshops they forged mighty weapons and wondrous armours. Their love for their craft was so strong that instead of their body, Ruin preserved their iron works.\"\nmsgstr \"Meșteșugul a fost întotdeauna obsesia piticilor. În atelierele lor au creat arme puternice și armuri minunate. Dragostea lor pentru meseria lor a fost atât de puternică încât în loc de corpul lor, Ruina a păstrat lucrările de fier.\"\n\n#. Key:\tSoAct2_EG_C_Bridge_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Bridge Brigade\"\nmsgstr \"Brigada Podului\"\n\n#. Key:\tSoAct2_EG_C_LoneShadeSphere_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Before Ruin there was no other humanoid race but human. New races are created by Ruin's Shades. They roam the lands looking for any living being which they can possess. Once they become part of a creature its body will start to change.\"\nmsgstr \"Înainte de Ruin nu exista o altă rasă umanoidă decât oamenii. Noi rase sunt create de Umbrele Ruinei. Ei cutreieră pământurile căutând orice ființă vie pe care o pot avea. Odată ce vor face parte dintr-o creatură corpul său va începe să se schimbe.\"\n\n#. Key:\tSoAct2_EG_C_LoneShadeSphere_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Weird Floating Thing\"\nmsgstr \"Ciudat Cucru Plutitor\"\n\n#. Key:\tSoAct2_EG_C_OfficeGuards_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Watching the only way to the Office did not bring enough protection. If any intruder managed to pass the Patrols he still had to face the Guardians to proceed.\"\nmsgstr \"Urmărirea singurului drum către Birou nu a adus suficientă protecție. Dacă vreun intrus reușea să treacă de Patrule, tot trebuia să se înfrunte cu Gardienii pentru a continua.\"\n\n#. Key:\tSoAct2_EG_C_OfficeGuards_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Guardians of the Law\"\nmsgstr \"Păzitorii Legii\"\n\n#. Key:\tSoAct2_EG_C_OfficePatrols_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Going into the Law's High Office was forbidden even for most of the Dwarves. Only one path lead to the Office and that was guarded by the Patrols.\"\nmsgstr \"Chiar și pentru majoritatea piticilor intrarea în Înaltul Birou al Legii era interzis. Doar o singură cale duce la Birou și care o fost păzită de patrule.\"\n\n#. Key:\tSoAct2_EG_C_OfficePatrols_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Patrols of the Law\"\nmsgstr \"Patrulele Legii\"\n\n#. Key:\tSoAct2_EG_DG_Left_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Deep beneath the Catacombs there is a secret place called the Dwarven Gate. Elite dwarves who worked here were placed above the Law. They were seeking a way to fight Ruin with Ruin's magic.\"\nmsgstr \"Adânc sub Catacombe există un loc secret numit Poarta Pitică. Piticii de elită care au lucrat aici au fost puși deasupra Legii. Căutau o modalitate de a combate Ruina cu magia Ruinei.\"\n\n#. Key:\tSoAct2_EG_DG_Left_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Glorious Group\"\nmsgstr \"Grupul Glorios\"\n\n#. Key:\tSoAct2_EG_DG_RightFloor_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Even though most of the common Dwarves never even heard about Dwarven Gate some were needed to do the hard work. Now that Ruin won, Dwarves are finally equal.\"\nmsgstr \"Chiar dacă majoritatea piticilor obișnuiți nu au auzit niciodată despre Poarta Piticilor, unii au fost nevoiți să facă munca grea. Acum că Ruina a câștigat, piticii sunt în sfârșit egali.\"\n\n#. Key:\tSoAct2_EG_DG_RightFloor_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Not so Elite Dwarves\"\nmsgstr \"Nu chiar Piticii de Elită\"\n\n#. Key:\tSoAct2_EG_DG_RightUpOptional_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"One idea of the Elite Dwarves was to create giant statues which are able to trap Ruin's essence. Even if they were right they never managed to make enough sculptures.\"\nmsgstr \"O idee a piticilor de elită a fost crearea de statui uriașe care să poată captura esența Ruinei. Chiar dacă aveau dreptate, nu au reușit niciodată să facă suficiente statui.\"\n\n#. Key:\tSoAct2_EG_DG_RightUpOptional_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Sculptors\"\nmsgstr \"Sculptori\"\n\n#. Key:\tSoAct2_EG_DwarfBoss_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Dwarven Statues were meant to imprison the essence of Ruin. However there were some Dwarven scientists who feared that the statues were not safe and in the long run they wouldn't be able to resist the power of Ruin...\"\nmsgstr \"Statuile pitice aveau menirea de a întemnița esența Ruinei. Cu toate acestea, au existat unii oameni de știință pitici care s-au temut că statuile nu sunt în siguranță și, pe termen lung, nu vor putea rezista puterii Ruinei ...\"\n\n#. Key:\tSoAct2_EG_DwarfBoss_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Dwarven Statue\"\nmsgstr \"Statuia Piticilor\"\n\n#. Key:\tSoAct2_EG_GolemFirst_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Stone Golems are the cheap copies of the Runic Realm Golems. If Ruin twists the creatures mind then it will definitely have no effect on these ones.\"\nmsgstr \"Golemurile de piatră sunt exemplarele ieftine ale Golemelor din Tărâmul Runic. Dacă Ruin răsucește mintea creaturilor, cu siguranță nu va avea niciun efect asupra acestora.\"\n\n#. Key:\tSoAct2_EG_GolemFirst_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Sphere Golem\"\nmsgstr \"Sfera Golem\"\n\n#. Key:\tSoAct2_EG_GolemSecond_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Looks like the second try is just as bad as the first one.\"\nmsgstr \"Se pare că a doua încercare este la fel de rea ca și prima.\"\n\n#. Key:\tSoAct2_EG_GolemSecond_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Second Sphere Golem\"\nmsgstr \"A Doua Sferă Golem\"\n\n#. Key:\tSoAct2_EG_GolemThird_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Whoever made this Golem, he should have stopped after the second try.\"\nmsgstr \"Cine a făcut acest Golem, ar fi trebuit să se oprească după a doua încercare.\"\n\n#. Key:\tSoAct2_EG_GolemThird_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Third Sphere Golem\"\nmsgstr \"A Treia Sferă Golem\"\n\n#. Key:\tSoAct2_EG_HutFishies_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Now that the Fishys are gone, the Lake's piranhas can live in peace and eat whoever comes close.\"\nmsgstr \"Acum că Peștii a dispărut, piranhale lacului pot trăi în pace și mânca pe oricine se apropie.\"\n\n#. Key:\tSoAct2_EG_HutFishies_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Abandoned Fishy Slaves\"\nmsgstr \"Sclavi Pești Abandonți\"\n\n#. Key:\tSoAct2_EG_HutFlyArmy_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"No one knows where the Flies came from. Although you have a very clear idea on where they should go...\"\nmsgstr \"Nimeni nu știe de unde au venit muștele. Deși ai o idee foarte clară despre unde ar trebui să meargă ...\"\n\n#. Key:\tSoAct2_EG_HutFlyArmy_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Annoying Flies\"\nmsgstr \"Muște Enervante\"\n\n#. Key:\tSoAct2_EG_LavaBoss_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Armour Wrath was the most ambitious and majestic work of the Golem Maker. He used all his remaining strength to create this mighty Golem. It's a pity that all his efforts were in vain.\"\nmsgstr \"Armura Mâniei a fost cea mai ambițioasă și maiestuoasă lucrare a Creatorului Golem. El și-a folosit toată puterea rămasă pentru a crea acest Golem puternic. Păcat că toate eforturile sale au fost în zadar.\"\n\n#. Key:\tSoAct2_EG_LavaBoss_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Armour Wrath\"\nmsgstr \"Armura Mâniei\"\n\n#. Key:\tSoAct2_EG_LavaDeepTeam_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"A fourth Sphere Golem? Someone never gives up...\"\nmsgstr \"A Patra Sferă Golem? Cineva nu se dă bătut...\"\n\n#. Key:\tSoAct2_EG_LavaDeepTeam_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Fourth Sphere Golem\"\nmsgstr \"A Patra Sferă Golem\"\n\n#. Key:\tSoAct2_EG_LavaJumpers_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"When a Golem falls into the lava its stone body will melt away. The spirit however resists the heat and will be looking for another body...\"\nmsgstr \"Când un Golem cade în lavă, corpul său de piatră se va topi. Totuși, spiritul rezistă la căldură și va căuta un alt corp ...\"\n\n#. Key:\tSoAct2_EG_LavaJumpers_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Lava Jumpers\"\nmsgstr \"Săritorii de Lavă\"\n\n#. Key:\tSoAct2_EG_LavaTeamX_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Divided they fall, united they divide...\"\nmsgstr \"Împărțiți cad, uniți se împart ...\"\n\n#. Key:\tSoAct2_EG_LavaTeamX_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Golem Group\"\nmsgstr \"Grupul Golemilor\"\n\n#. Key:\tSoAct2_EG_LavaTrio_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Wherever Golems go after death these three will go there together.\"\nmsgstr \"Oriunde merg Golemii după moarte, acești trei vor merge acolo împreună.\"\n\n#. Key:\tSoAct2_EG_LavaTrio_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Golem Trio\"\nmsgstr \"Golem Trio\"\n\n#. Key:\tSoAct2_EG_OutpostLeft_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"To keep Ruin away dwarves forbade everything related to Ruin's magic. This might have worked in theory but they failed to notice that their mechanical devices were also powered by Ruin.\"\nmsgstr \"Pentru a ține ruina departe piticii interzis tot ceea ce ține de magia Ruinei. Poate că acest lucru a funcționat în teorie, însă nu au reușit să observe că dispozitivele lor mecanice au fost alimentate și de Ruin.\"\n\n#. Key:\tSoAct2_EG_OutpostLeft_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Guardians of the West Wall\"\nmsgstr \"Păzitorii Zidului de Vest\"\n\n#. Key:\tSoAct2_EG_OutpostRight_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Ruin was not only meant for destruction, it could also preserve. Ruin gave endless life for those who survived at the cost of twisting their minds.\"\nmsgstr \"Ruina nu a fost destinată numai distrugerii, ci a putut si conserva. Ruian a dat viață nesfârșită celor care au supraviețuit cu prețul de a-și răsuci mințile.\"\n\n#. Key:\tSoAct2_EG_OutpostRight_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Guardians of the East Wall\"\nmsgstr \"Păzitorii Zidului de Est\"\n\n#. Key:\tSoAct2_EG_OutpostWallFirst_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Dwarves fought Ruin with Rules. These soldiers were ordered here to guard the Outpost. Their will to obey the order was so strong that even death couldn't break it.\"\nmsgstr \"Piticii s-au luptat cu Ruina cu Regulile. Acești soldați au primit ordin să păzească Avanpostul. Voința lor de a se supune ordinului a fost atât de puternică încât nici măcar moartea nu a putut-o rupe.\"\n\n#. Key:\tSoAct2_EG_OutpostWallFirst_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Patrols of the Outpost Wall\"\nmsgstr \"Patrulele zidului din Avanpost\"\n\n#. Key:\tSoAct2_EG_Shore_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"After Ruin turned them into Monsters some creatures gathered together. Whether it's the effect of Ruin or something from their former life is unclear.\"\nmsgstr \"După ce Ruinul i-a transformat în Monștri, niște creaturi s-au adunat împreuna. Nu este clar dacă este efectul Ruinelor sau ceva din viața lor anterioară.\"\n\n#. Key:\tSoAct2_EG_Shore_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Shore Monsters\"\nmsgstr \"Monșțrii Malului\"\n\n#. Key:\tSoAct2_EG_SlideFishyTeam_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Fishys were produced by the Great Kobold tribe for slaves. Some of them managed to escape, but they couldn't go far from the Lake.\"\nmsgstr \"Peștele a fost produs de tribul Mare Kobold pentru sclavi. Unii dintre ei au reușit să scape, dar nu au putut pleca departe de Lac.\"\n\n#. Key:\tSoAct2_EG_SlideFishyTeam_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Deserter Fishys\"\nmsgstr \"Peștii Dezertori\"\n\n#. Key:\tSoAct2_EG_SlidePathEnd_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Deserter Fishys always kept a Fishy group close to the exit of their secret hideout. They protected the others and watched the kobolds to find the right time to venture back to the Lake.\"\nmsgstr \"Peștii Dezertori au ținut întotdeauna un grup de Pești aproape de ieșirea din ascunzătoarea lor secretă. I-au protejat pe ceilalți și i-au urmărit pe kobolds să găsească momentul potrivit pentru a se aventura înapoi în lac.\"\n\n#. Key:\tSoAct2_EG_SlidePathEnd_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Patrol Fishys\"\nmsgstr \"Peștii Patrulând\"\n\n#. Key:\tSoAct2_EG_WormHole_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Worms kept distance from each other before Ruin. It's strange how a force which tears everything apart can also unite.\"\nmsgstr \"Înainte de Ruinei Viermii țineau distanța unul de altul. Este ciudat cum o forța care distruge totul poate și uni.\"\n\n#. Key:\tSoAct2_EG_WormHole_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Worms\"\nmsgstr \"Viermi\"\n\n#. Key:\tSoAct2_EG_Wormy_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"There was a time when Worms only made damage to fields and gardens. Now they are a bit more ambitious...\"\nmsgstr \"A fost o perioadă în care Viermii au făcut pagube doar câmpurilor și grădinilor. Acum sunt un pic mai ambițioși ...\"\n\n#. Key:\tSoAct2_EG_Wormy_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Worm\"\nmsgstr \"Vierme\"\n\n#. Key:\tSoAct2_EG_WWBoss_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"When Ruin appeared some decided to abandon civilization and return to nature. Their leader, the Fallen Druid cast an ancient spell to protect his plants from Ruin. His spell partly worked but at a terrible cost.\"\nmsgstr \"Când a apărut Ruin, unii au decis să abandoneze civilizația și să se întoarcă la natură. Liderul lor, Druidul Căzut a aruncat o vrajă străveche pentru a-și proteja plantele de ruină. Vraja lui a funcționat parțial, dar cu un cost teribil.\"\n\n#. Key:\tSoAct2_EG_WWBoss_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Fallen Druid\"\nmsgstr \"Druidul Căzut\"\n\n#. Key:\tSoAct3_EG_Act3BubbleGroundMain_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Ruin's power is not only in destruction. When it can't change something it will preserve those attributes which can prepare the possibility to change again. Ruin's power is in change.\"\nmsgstr \"Puterea ruinei nu este doar în distrugere. Când nu poate schimba ceva, va păstra acele atribute care pot pregăti posibilitatea de a schimba din nou. Puterea Ruinei este în schimbare.\"\n\n#. Key:\tSoAct3_EG_Act3BubbleGroundMain_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Maintainer Spellcasters\"\nmsgstr \"Întreținătorii Vrăjitori\"\n\n#. Key:\tSoAct3_EG_Act3FinalBattle_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Even though Ruin doesn't have consciousness nor the ability to think it somehow reacts to your presence. As if it knew the threat you present, Ruin tries all it can to stop you from leaving the Ruined Realm.\"\nmsgstr \"Chiar dacă Ruina nu are conștiință și nici capacitatea de a gândi, reacționează cumva la prezența ta. Ca și cum ar ști amenințarea pe care o prezinți, Ruina încearcă tot ce poate pentru a te opri să părăsiți Tărâmul Ruinat.\"\n\n#. Key:\tSoAct3_EG_Act3FinalBattle_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Ruined Convention\"\nmsgstr \"Convenția în Ruină\"\n\n#. Key:\tSoAct3_EG_Act3PipeGroupFirst_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"There is a difference between how Humans and Golems are transformed by Ruin. Human bodies reach their final form in a few decades but Golems never stop changing. There is always a new, more vicious type.\"\nmsgstr \"Există o diferență între modul în care Oamenii și Golemii sunt transformate de Ruină. Corpurile umane își ating forma finală în câteva decenii, dar Golemii nu încetează niciodată să se schimbe. Există întotdeauna un tip nou, mai vicios.\"\n\n#. Key:\tSoAct3_EG_Act3PipeGroupFirst_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Red Drones\"\nmsgstr \"Drone Roșii\"\n\n#. Key:\tSoAct3_EG_Act3PipeGroupSecond_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Transformation is relative to intelligence. Creatures with consciousness have a strong desire to reserve their ego. Ruin can fool them a few times but later they become invulnerable to Ruin's changing power.\"\nmsgstr \"Transformarea este relativă la inteligență. Creaturile cu conștiință au o dorință puternică de a-și rezerva ego-ul. Ruina îi poate păcăli de câteva ori, dar mai târziu devin invulnerabili puterii de schimbare a ruinei.\"\n\n#. Key:\tSoAct3_EG_Act3PipeGroupSecond_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"More Drones\"\nmsgstr \"Mai multe Drone\"\n\n#. Key:\tSoAct3_EG_Act3RangedCleanerTwins_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Ruin's nature is confusing for the human mind. It can build, it can destroy, it can use, it can be used. These actions have the same priority for Ruin. All that matters is that it can do something. And with time it wants more and more.\"\nmsgstr \"Natura ruinei este confuză pentru mintea umană. Poate construi, poate distruge, poate folosi, poate fi folosit. Aceste acțiuni au aceeași prioritate pentru Ruină. Tot ce contează este că poate face ceva. Și cu timpul vrea din ce în ce mai mult.\"\n\n#. Key:\tSoAct3_EG_Act3RangedCleanerTwins_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Cleaner Twins\"\nmsgstr \"Gemeni mai Curați\"\n\n#. Key:\tSoAct3_EG_Act3VacuumTwins_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Ruin's logic is predictable when you understand its nature. When it's not possible to create more the creation process can be restarted by destroying everything first.\"\nmsgstr \"Logica ruinei este previzibilă atunci când îi înțelegi natura. Când nu este posibil să creezi mai mult, procesul de creare poate fi repornit distrugând totul mai întâi.\"\n\n#. Key:\tSoAct3_EG_Act3VacuumTwins_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Elite Twins\"\nmsgstr \"Gemeni de Elită\"\n\n#. Key:\tWhiteWall_EG_AfterKobold_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Creating intelligence was not enough for the Golem Makers. They wanted to get even further. They wanted to create Golems with emotions.\"\nmsgstr \"Crearea inteligenței nu a fost suficientă pentru producătorii de Golemi. Au vrut să ajungă și mai departe. Au vrut să creeze Golemi cu emoții.\"\n\n#. Key:\tWhiteWall_EG_AfterKobold_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Flying Maintainer\"\nmsgstr \"Curățătorii zburători\"\n\n#. Key:\tWhiteWall_EG_BeforeKobold_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"When the Cataclysm happened and Ruin came the Golems started to change. Instead of doing their daily work some of them turned against their masters.\"\nmsgstr \"Când s-a întâmplat cataclismul și a venit Ruina, Golemii au început să se schimbe. În loc să își facă munca zilnică, unii dintre ei s-au întors împotriva stăpânilor lor.\"\n\n#. Key:\tWhiteWall_EG_BeforeKobold_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Infected Golems\"\nmsgstr \"Golemii Infectați\"\n\n#. Key:\tWhiteWall_EG_FirstCombat_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Cleaners were the first Golems ever made. Before the Cataclysm they did all the monoton work so that the people had more time to think and to create.\"\nmsgstr \"Curățătorii au fost primii Golemi făcuți vreodată. Înainte de cataclism au făcut toate lucrările monotone, astfel încât oamenii au avut mai mult timp să gândească și să creeze.\"\n\n#. Key:\tWhiteWall_EG_FirstCombat_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Whitewall Cleaners\"\nmsgstr \"Curățătorii de la Zidul Alb\"\n\n#. Key:\tWhiteWall_EG_FirstOptionalCombat_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"After the different types of Cleaners, Golem Makers wanted to create something greater than working robots. They started to design creatures with intelligence.\"\nmsgstr \"După diferitele tipuri de Curățători, Creatorii de Golemi au dorit să creeze ceva mai mare decât roboții care funcționează. Au început să proiecteze creaturi cu inteligență.\"\n\n#. Key:\tWhiteWall_EG_FirstOptionalCombat_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Whitewall Maintainers\"\nmsgstr \"Întreținătorii de la Zidul Alb\"\n\n#. Key:\tAbacus_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/Abacus.Abacus.Description\n#: /Game/SO/Items/QuestItems/Abacus.Abacus.Description\nmsgctxt \"ItemData\"\nmsgid \"When you don't have enough fingers to count something you need this abacus.\"\nmsgstr \"Când nu ai suficiente degete pentru a număra ceva, ai nevoie de acest abac.\"\n\n#. Key:\tAbacus_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/Abacus.Abacus.Name\n#: /Game/SO/Items/QuestItems/Abacus.Abacus.Name\nmsgctxt \"ItemData\"\nmsgid \"Abacus\"\nmsgstr \"Abac\"\n\n#. Key:\tAbacusGhost_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/AbacusGhost.AbacusGhost.Description\n#: /Game/SO/Items/QuestItems/AbacusGhost.AbacusGhost.Description\nmsgctxt \"ItemData\"\nmsgid \"When the Abacus is killed its spirit might return to get even with its murderer.\"\nmsgstr \"Atunci când Abacul este ucis, spiritul său s-ar putea întoarce să fie chit cu criminalul său.\"\n\n#. Key:\tAbacusGhost_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/AbacusGhost.AbacusGhost.Name\n#: /Game/SO/Items/QuestItems/AbacusGhost.AbacusGhost.Name\nmsgctxt \"ItemData\"\nmsgid \"Ghost Abacus\"\nmsgstr \"Abacul Fantomă\"\n\n#. Key:\tAbacusGhostFlower_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/AbacusGhostFlower.AbacusGhostFlower.Description\n#: /Game/SO/Items/QuestItems/AbacusGhostFlower.AbacusGhostFlower.Description\nmsgctxt \"ItemData\"\nmsgid \"Petals of a ghost flower.\"\nmsgstr \"Petale ale unei flori fantomă.\"\n\n#. Key:\tAbacusGhostFlower_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/AbacusGhostFlower.AbacusGhostFlower.Name\n#: /Game/SO/Items/QuestItems/AbacusGhostFlower.AbacusGhostFlower.Name\nmsgctxt \"ItemData\"\nmsgid \"Ghost Petals\"\nmsgstr \"Petale Fantomă\"\n\n#. Key:\tAbacusSpellBook_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/AbacusSpellBook.AbacusSpellBook.Description\n#: /Game/SO/Items/QuestItems/AbacusSpellBook.AbacusSpellBook.Description\nmsgctxt \"ItemData\"\nmsgid \"An ancient paper\"\nmsgstr \"O hârtie străveche\"\n\n#. Key:\tAbacusSpellBook_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/AbacusSpellBook.AbacusSpellBook.Name\n#: /Game/SO/Items/QuestItems/AbacusSpellBook.AbacusSpellBook.Name\nmsgctxt \"ItemData\"\nmsgid \"Scroll of Surrection\"\nmsgstr \"Sulul Învierii\"\n\n#. Key:\tAbacusSpellBook_page_0\n#. SourceLocation:\t/Game/SO/Items/QuestItems/AbacusSpellBook.AbacusSpellBook.Pages(0).Pages\n#: /Game/SO/Items/QuestItems/AbacusSpellBook.AbacusSpellBook.Pages(0).Pages\nmsgctxt \"ItemData\"\nmsgid \"Wisy et al. [3152] point out that any entity can be banished by throwing the proper object into his/her/its face a few times, making him/her/it annoyed thus unconcerned, as long as the target entity has a face.\\r\\n\\r\\nThe proper object in case of ghosts is something Surrected [Inti and Clevi 3153], as only Surrected substance can interact with ghosts.\\r\\n\\r\\nAny object covered with petals of Ghost Flower can be Surrected using the following method:\\r\\n\\r\\n- Say \\\"Sorry my <object name>!\\\"\\r\\n- Break the object into pieces with a heated hammer\\r\\n- Say your favourite color\\r\\n- Croon \\\"La La LaLaLa LaLaLa\\\" until the object is coagulated into a single Surrected object\"\nmsgstr \"Wisy et al. [3152] subliniază faptul că orice entitate poate fi alungată aruncând de câteva ori obiectul corespunzător pe fața sa, făcându-l să se enerveze astfel să nu fie preocupat, atât timp cât entitatea țintă are o față\\n\\nObiectul potrivit în cazul fantomelor este ceva reînviat [Inti and Clevi 3153], deoarece numai substanța reînviată poate interacționa cu fantomele.\\n\\nOrice obiect acoperit cu petalele de la Floare Fantomă poate fi reînviat folosind următoarea metodă::\\n\\n- Spune \\\"Îmi pare rău <nume obiect>!\\\"\\n- Rupe obiectul în bucăți cu un ciocan încălzit\\n- Spune culoarea preferată\\n- Cântă \\\"La La LaLaLa LaLaLa\\\" până când obiectul este coagulat într-un singur obiect resuscitat\"\n\n#. Key:\tAbacusSpellBook_page_1\n#. SourceLocation:\t/Game/SO/Items/QuestItems/AbacusSpellBook.AbacusSpellBook.Pages(1).Pages\n#: /Game/SO/Items/QuestItems/AbacusSpellBook.AbacusSpellBook.Pages(1).Pages\nmsgctxt \"ItemData\"\nmsgid \"WARNING: not following the instructions exactly leads to failure and also increases the probability of injury and or death [Carfy 3154].\\r\\n\\r\\nREFERENCES:\\r\\n\\r\\nWISY, W., BUSY, B., WEIRDY, Y., AND LUCKY, L. 3152. The best ways to get rid of anyone potentially distracting us with questions like \\\"What do you read?\\\"\\r\\n\\r\\nInti, I., AND Clevi, C. 3153. Insulting dead ancestors using Surrected objects\\r\\n\\r\\nCarfy C. 3154. What happened to Clevi, C. and Inti, I.\"\nmsgstr \"AVERTIZARE: nerespectarea instrucțiunilor duce exact la eșec și crește, de asemenea, probabilitatea de rănire și deces [Carfy 3154].\\n\\nREFERINȚE:\\n\\nWISY, W., BUSY, B., WEIRDY, Y., AND LUCKY, L. 3152. Cele mai bune metode de a scăpa de oricine ne poate distrage cu întrebări de genul „Ce citești?”\\n\\nInti, I., AND Clevi, C. 3153. Insultând strămoșii morți folosind obiecte reînviate\\n\\nCarfy C. 3154. Ce s-a întâmplat cu Clevi, C. and Inti, I.\"\n\n#. Key:\tAll_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/All.All.Description\n#: /Game/SO/Items/QuestItems/All.All.Description\nmsgctxt \"ItemData\"\nmsgid \"Maybe it was a bit too much?\"\nmsgstr \"Poate a fost un pic prea mult?\"\n\n#. Key:\tAll_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/All.All.Name\n#: /Game/SO/Items/QuestItems/All.All.Name\nmsgctxt \"ItemData\"\nmsgid \"Everything, except an Abacus\"\nmsgstr \"Totul, cu excepția unui Abacus\"\n\n#. Key:\tArtifact_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/Artifact.Artifact.Description\n#: /Game/SO/Items/QuestItems/Artifact.Artifact.Description\nmsgctxt \"ItemData\"\nmsgid \"A very rare and powerful item which is used for opening a portal into the Unknown Realm. If you gather three and give them to the Wizard he shall set you free.\"\nmsgstr \"Un articol foarte rar și puternic, care este folosit pentru deschiderea unui portal în Lumea Necunoscută Dacă aduni trei și îi dai vrăjitorului, el te va elibera.\"\n\n#. Key:\tArtifact_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/Artifact.Artifact.Name\n#: /Game/SO/Items/QuestItems/Artifact.Artifact.Name\nmsgctxt \"ItemData\"\nmsgid \"Artifact\"\nmsgstr \"Artefact\"\n\n#. Key:\tAxeMainGame_desc\n#. SourceLocation:\t/Game/SO/Items/Weapons/AxeMainGame.AxeMainGame.Description\n#. Key:\tAxe_desc\n#. SourceLocation:\t/Game/SO/Items/Weapons/Axe.Axe.Description\n#: /Game/SO/Items/Weapons/Axe.Axe.Description\n#: /Game/SO/Items/Weapons/AxeMainGame.AxeMainGame.Description\nmsgctxt \"ItemData\"\nmsgid \"Axes are usefull, but if you don't need them you can just throw them away.\"\nmsgstr \"Topoarele sunt utile, dar dacă nu îți sunt folositoare le poți arunca.\"\n\n#. Key:\tAxeMainGame_name\n#. SourceLocation:\t/Game/SO/Items/Weapons/AxeMainGame.AxeMainGame.Name\n#. Key:\tAxe_name\n#. SourceLocation:\t/Game/SO/Items/Weapons/Axe.Axe.Name\n#: /Game/SO/Items/Weapons/Axe.Axe.Name\n#: /Game/SO/Items/Weapons/AxeMainGame.AxeMainGame.Name\nmsgctxt \"ItemData\"\nmsgid \"Axes\"\nmsgstr \"Topoare\"\n\n#. Key:\tBlueCrystal_desc\n#. SourceLocation:\t/Game/SO/Items/Valuable/BlueCrystal.BlueCrystal.Description\n#: /Game/SO/Items/Valuable/BlueCrystal.BlueCrystal.Description\nmsgctxt \"ItemData\"\nmsgid \"An ancient crystal people like to buy.\"\nmsgstr \"Un cristal antic care la oameni le place să îl cumpere.\"\n\n#. Key:\tBlueCrystal_name\n#. SourceLocation:\t/Game/SO/Items/Valuable/BlueCrystal.BlueCrystal.Name\n#: /Game/SO/Items/Valuable/BlueCrystal.BlueCrystal.Name\nmsgctxt \"ItemData\"\nmsgid \"Blue Crystal\"\nmsgstr \"Cristal albastru\"\n\n#. Key:\tBlueGem_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/BlueGem.BlueGem.Description\n#: /Game/SO/Items/QuestItems/BlueGem.BlueGem.Description\nmsgctxt \"ItemData\"\nmsgid \"A small precious blue stone.\"\nmsgstr \"O mică piatră prețioasă albastră.\"\n\n#. Key:\tBlueGem_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/BlueGem.BlueGem.Name\n#: /Game/SO/Items/QuestItems/BlueGem.BlueGem.Name\nmsgctxt \"ItemData\"\nmsgid \"Blue Gem\"\nmsgstr \"Bijuterie Albastră\"\n\n#. Key:\tDemonSword_desc\n#. SourceLocation:\t/Game/SO/Items/Weapons/DemonSword.DemonSword.Description\n#: /Game/SO/Items/Weapons/DemonSword.DemonSword.Description\nmsgctxt \"ItemData\"\nmsgid \"The mighty sword of Kharutar the Demon Ruler. Legend says he once cut one of his fingers with it and in his rage he broke the sword into two. Later it was reforged but some say it would still need some more fixes.\"\nmsgstr \"Sabia puternică a lui Kharutar, conducătorul Demonilor. Legenda spune că odată și-a tăiat unul din degete și cu furie a rupt sabia în două. Ulterior a fost reforjat, dar unii spun că ar mai avea nevoie de alte corecții.\"\n\n#. Key:\tDemonSword_name\n#. SourceLocation:\t/Game/SO/Items/Weapons/DemonSword.DemonSword.Name\n#: /Game/SO/Items/Weapons/DemonSword.DemonSword.Name\nmsgctxt \"ItemData\"\nmsgid \"Demon Sword\"\nmsgstr \"Sabia Demonului\"\n\n#. Key:\tDOKitchenKey_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/DOKitchenKey.DOKitchenKey.Description\n#: /Game/SO/Items/Keys/DOKitchenKey.DOKitchenKey.Description\nmsgctxt \"ItemData\"\nmsgid \"This is one of the many spare keys of the Dwarven Outpost Kitchen. Being able to get into the kitchen was always very important for dwarves.\"\nmsgstr \"Aceasta este una dintre numeroasele chei de rezervă ale Bucătăriei Piticilor din Cetate. A putea intra în bucătărie a fost întotdeauna foarte important pentru pitici.\"\n\n#. Key:\tDOKitchenKey_name\n#. SourceLocation:\t/Game/SO/Items/Keys/DOKitchenKey.DOKitchenKey.Name\n#: /Game/SO/Items/Keys/DOKitchenKey.DOKitchenKey.Name\nmsgctxt \"ItemData\"\nmsgid \"Kitchen Key\"\nmsgstr \"Cheia Bucătăriei\"\n\n#. Key:\tDualBlade_desc\n#. SourceLocation:\t/Game/SO/Items/Weapons/DualBlade.DualBlade.Description\n#: /Game/SO/Items/Weapons/DualBlade.DualBlade.Description\nmsgctxt \"ItemData\"\nmsgid \"In case of trouble, it's better to have double.\"\nmsgstr \"În caz de probleme, este mai bine să ai dublu.\"\n\n#. Key:\tDualBlade_name\n#. SourceLocation:\t/Game/SO/Items/Weapons/DualBlade.DualBlade.Name\n#: /Game/SO/Items/Weapons/DualBlade.DualBlade.Name\nmsgctxt \"ItemData\"\nmsgid \"Double Sword\"\nmsgstr \"Sabia Dublă\"\n\n#. Key:\tElevatorGem_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/ElevatorGem.ElevatorGem.Description\n#: /Game/SO/Items/QuestItems/ElevatorGem.ElevatorGem.Description\nmsgctxt \"ItemData\"\nmsgid \"A shiny green crystal which activates a weight lifting mechanism. At least by the look of it.\"\nmsgstr \"Un cristal verde strălucitor care activează un mecanism de ridicare a greutății. Cel puțin prin aspectul acesteia.\"\n\n#. Key:\tElevatorGem_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/ElevatorGem.ElevatorGem.Name\n#: /Game/SO/Items/QuestItems/ElevatorGem.ElevatorGem.Name\nmsgctxt \"ItemData\"\nmsgid \"Elevator Gem\"\nmsgstr \"Bijuteria de la Lift\"\n\n#. Key:\tElevatorLeverCrystal_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/ElevatorLeverCrystal.ElevatorLeverCrystal.Description\n#: /Game/SO/Items/QuestItems/ElevatorLeverCrystal.ElevatorLeverCrystal.Description\nmsgctxt \"ItemData\"\nmsgid \"You got this item for free from a Merchant so you hardly believe it has any value. It might be used as some sort of a mechanism activator though. Hopefully not for a trap.\"\nmsgstr \"Deoarece ai primit acest articol gratuit de la un comerciant, cu greu crezi că are vreo valoare. Deși ar putea fi folosit ca un fel de activator al mecanismului. Să sperăm că nu pentru o capcană ...\"\n\n#. Key:\tElevatorLeverCrystal_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/ElevatorLeverCrystal.ElevatorLeverCrystal.Name\n#: /Game/SO/Items/QuestItems/ElevatorLeverCrystal.ElevatorLeverCrystal.Name\nmsgctxt \"ItemData\"\nmsgid \"Elevator Crystal\"\nmsgstr \"Cristalul de la Lift\"\n\n#. Key:\tFountainFlower_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/FountainFlower.FountainFlower.Description\n#: /Game/SO/Items/QuestItems/FountainFlower.FountainFlower.Description\nmsgctxt \"ItemData\"\nmsgid \"Flower acquired from a fountain.\"\nmsgstr \"Floare dobândită dintr-o fântână.\"\n\n#. Key:\tFountainFlower_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/FountainFlower.FountainFlower.Name\n#: /Game/SO/Items/QuestItems/FountainFlower.FountainFlower.Name\nmsgctxt \"ItemData\"\nmsgid \"Fountain Flower\"\nmsgstr \"Fântână cu Flori\"\n\n#. Key:\tGateKeeperSeat_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/GateKeeperSeat.GateKeeperSeat.Description\n#: /Game/SO/Items/QuestItems/GateKeeperSeat.GateKeeperSeat.Description\nmsgctxt \"ItemData\"\nmsgid \"A simple seat of size XXXXXXXXXL\"\nmsgstr \"Un scaun simplu de dimensiuni XXXXXXXXXL\"\n\n#. Key:\tGateKeeperSeat_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/GateKeeperSeat.GateKeeperSeat.Name\n#: /Game/SO/Items/QuestItems/GateKeeperSeat.GateKeeperSeat.Name\nmsgctxt \"ItemData\"\nmsgid \"Giant Seat\"\nmsgstr \"Scaun Gigant\"\n\n#. Key:\tKeyAADoorNearDungeonExit_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyAADoorNearDungeonExit.KeyAADoorNearDungeonExit.Description\n#: /Game/SO/Items/Keys/KeyAADoorNearDungeonExit.KeyAADoorNearDungeonExit.Description\nmsgctxt \"ItemData\"\nmsgid \"A key without a proper item description\"\nmsgstr \"O cheie fără o descriere corespunzătoare\"\n\n#. Key:\tKeyAADoorNearDungeonExit_name\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyAADoorNearDungeonExit.KeyAADoorNearDungeonExit.Name\n#: /Game/SO/Items/Keys/KeyAADoorNearDungeonExit.KeyAADoorNearDungeonExit.Name\nmsgctxt \"ItemData\"\nmsgid \"Arcade Key\"\nmsgstr \"Cheia Arcadei\"\n\n#. Key:\tKeyAAFirstFight_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyAAFirstFight.KeyAAFirstFight.Description\n#: /Game/SO/Items/Keys/KeyAAFirstFight.KeyAAFirstFight.Description\nmsgctxt \"ItemData\"\nmsgid \"Weird\"\nmsgstr \"Ciudat\"\n\n#. Key:\tKeyAAFirstFight_name\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyAAFirstFight.KeyAAFirstFight.Name\n#: /Game/SO/Items/Keys/KeyAAFirstFight.KeyAAFirstFight.Name\nmsgctxt \"ItemData\"\nmsgid \"Weird Key\"\nmsgstr \"Cheie ciudată\"\n\n#. Key:\tKeyAAMainFirstDoor_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyAAMainFirstDoor.KeyAAMainFirstDoor.Description\n#: /Game/SO/Items/Keys/KeyAAMainFirstDoor.KeyAAMainFirstDoor.Description\nmsgctxt \"ItemData\"\nmsgid \"Sometimes the lock is harder to find than the key.\"\nmsgstr \"Uneori, încuietoarea este mai greu de găsit decât cheia.\"\n\n#. Key:\tKeyAAMainFirstDoor_name\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyAAMainFirstDoor.KeyAAMainFirstDoor.Name\n#: /Game/SO/Items/Keys/KeyAAMainFirstDoor.KeyAAMainFirstDoor.Name\nmsgctxt \"ItemData\"\nmsgid \"Key of Something\"\nmsgstr \"Cheia a Ceva\"\n\n#. Key:\tKeyAGPortalFight_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyAGPortalFight.KeyAGPortalFight.Description\n#: /Game/SO/Items/Keys/KeyAGPortalFight.KeyAGPortalFight.Description\nmsgctxt \"ItemData\"\nmsgid \"Just another key.\"\nmsgstr \"Doar o altă cheie.\"\n\n#. Key:\tKeyAGPortalFight_name\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyAGPortalFight.KeyAGPortalFight.Name\n#: /Game/SO/Items/Keys/KeyAGPortalFight.KeyAGPortalFight.Name\nmsgctxt \"ItemData\"\nmsgid \"Eastern Key\"\nmsgstr \"Cheia de Est\"\n\n#. Key:\tKeyBronze_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyBronze.KeyBronze.Description\n#: /Game/SO/Items/Keys/KeyBronze.KeyBronze.Description\nmsgctxt \"ItemData\"\nmsgid \"A reforged Bronze Key.\"\nmsgstr \"O cheie de bronz transformată.\"\n\n#. Key:\tKeyBronze_name\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyBronze.KeyBronze.Name\n#: /Game/SO/Items/Keys/KeyBronze.KeyBronze.Name\nmsgctxt \"ItemData\"\nmsgid \"Bronze Key\"\nmsgstr \"Cheia de bronz\"\n\n#. Key:\tKeyCatacombs0_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyCatacombs0.KeyCatacombs0.Description\n#: /Game/SO/Items/Keys/KeyCatacombs0.KeyCatacombs0.Description\nmsgctxt \"ItemData\"\nmsgid \"There are a ridiculous amount of keys in this world, right?\"\nmsgstr \"Există o cantitate ridicolă de chei în această lume, nu?\"\n\n#. Key:\tKeyCatacombs0_name\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyCatacombs0.KeyCatacombs0.Name\n#: /Game/SO/Items/Keys/KeyCatacombs0.KeyCatacombs0.Name\nmsgctxt \"ItemData\"\nmsgid \"Key Of The Room Below\"\nmsgstr \"Cheia camerei de mai jos\"\n\n#. Key:\tKeyCopper_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyCopper.KeyCopper.Description\n#: /Game/SO/Items/Keys/KeyCopper.KeyCopper.Description\nmsgctxt \"ItemData\"\nmsgid \"A reforged Copper Key.\"\nmsgstr \"O cheie de cupru armată.\"\n\n#. Key:\tKeyCopper_name\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyCopper.KeyCopper.Name\n#: /Game/SO/Items/Keys/KeyCopper.KeyCopper.Name\nmsgctxt \"ItemData\"\nmsgid \"Copper Key\"\nmsgstr \"Cheie de cupru\"\n\n#. Key:\tKeyDCMainOut_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyDCMainOut.KeyDCMainOut.Description\n#: /Game/SO/Items/Keys/KeyDCMainOut.KeyDCMainOut.Description\nmsgctxt \"ItemData\"\nmsgid \"Just an old, rusty iron key without a proper item description\"\nmsgstr \"Doar o cheie de fier vechi, ruginită, fără o descriere corespunzătoare a articolului\"\n\n#. Key:\tKeyDCMainOut_name\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyDCMainOut.KeyDCMainOut.Name\n#: /Game/SO/Items/Keys/KeyDCMainOut.KeyDCMainOut.Name\nmsgctxt \"ItemData\"\nmsgid \"Catacomb Key\"\nmsgstr \"Cheia Catacombei\"\n\n#. Key:\tKeyIron_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyIron.KeyIron.Description\n#: /Game/SO/Items/Keys/KeyIron.KeyIron.Description\nmsgctxt \"ItemData\"\nmsgid \"A reforged Iron Key.\"\nmsgstr \"O cheie de fier transformată.\"\n\n#. Key:\tKeyIron_name\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyIron.KeyIron.Name\n#: /Game/SO/Items/Keys/KeyIron.KeyIron.Name\nmsgctxt \"ItemData\"\nmsgid \"Iron Key\"\nmsgstr \"Cheia de fier\"\n\n#. Key:\tKeyMaster_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyMaster.KeyMaster.Description\n#: /Game/SO/Items/Keys/KeyMaster.KeyMaster.Description\nmsgctxt \"ItemData\"\nmsgid \"This key can be used to open any door equipped with a special kind of lock, but breaks during the process.\"\nmsgstr \"Această cheie poate fi folosită pentru a deschide orice ușă echipată cu o încuietoare speciala, dar se rupe în timpul procesului.\"\n\n#. Key:\tKeyMaster_name\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyMaster.KeyMaster.Name\n#: /Game/SO/Items/Keys/KeyMaster.KeyMaster.Name\nmsgctxt \"ItemData\"\nmsgid \"Master Key\"\nmsgstr \"Cheia principală\"\n\n#. Key:\tKeyMerchant_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyMerchant.KeyMerchant.Description\n#: /Game/SO/Items/Keys/KeyMerchant.KeyMerchant.Description\nmsgctxt \"ItemData\"\nmsgid \"Does it really work? You will find out soon...\"\nmsgstr \"Chiar funcționează? Vei afla în curând ...\"\n\n#. Key:\tKeyMerchant_name\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyMerchant.KeyMerchant.Name\n#: /Game/SO/Items/Keys/KeyMerchant.KeyMerchant.Name\nmsgctxt \"ItemData\"\nmsgid \"A very small key\"\nmsgstr \"O cheie foarte mică\"\n\n#. Key:\tKeyOutpostWall_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyOutpostWall.KeyOutpostWall.Description\n#: /Game/SO/Items/Keys/KeyOutpostWall.KeyOutpostWall.Description\nmsgctxt \"ItemData\"\nmsgid \"Do you really read the key descriptions?\"\nmsgstr \"Citești cu adevărat descrierile cheilor?\"\n\n#. Key:\tKeyOutpostWall_name\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyOutpostWall.KeyOutpostWall.Name\n#: /Game/SO/Items/Keys/KeyOutpostWall.KeyOutpostWall.Name\nmsgctxt \"ItemData\"\nmsgid \"Key Of The Outpost Wall\"\nmsgstr \"Cheia Zidului Avanpostului\"\n\n#. Key:\tKeyOutpostWallOptional_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyOutpostWallOptional.KeyOutpostWallOptional.Description\n#: /Game/SO/Items/Keys/KeyOutpostWallOptional.KeyOutpostWallOptional.Description\nmsgctxt \"ItemData\"\nmsgid \"I would rather sleep, but the item descriptions won't write themselves.\"\nmsgstr \"Aș prefera să dorm, dar descrierile articolelor nu se vor scrie singure.\"\n\n#. Key:\tKeyOutpostWallOptional_name\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyOutpostWallOptional.KeyOutpostWallOptional.Name\n#: /Game/SO/Items/Keys/KeyOutpostWallOptional.KeyOutpostWallOptional.Name\nmsgctxt \"ItemData\"\nmsgid \"Second Key Of The Outpost Wall\"\nmsgstr \"A doua Cheie a Peretelui Avanpostului\"\n\n#. Key:\tKeyPiecesBronze0_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyPiecesBronze0.KeyPiecesBronze0.Description\n#: /Game/SO/Items/Keys/KeyPiecesBronze0.KeyPiecesBronze0.Description\nmsgctxt \"ItemData\"\nmsgid \"Half of a broken Bronze Key\"\nmsgstr \"Jumătate dintr-o cheie de Bronz Spartă\"\n\n#. Key:\tKeyPiecesBronze0_name\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyPiecesBronze0.KeyPiecesBronze0.Name\n#: /Game/SO/Items/Keys/KeyPiecesBronze0.KeyPiecesBronze0.Name\nmsgctxt \"ItemData\"\nmsgid \"Half Bronze Key\"\nmsgstr \"Cheie pe Jumătate din Bronz\"\n\n#. Key:\tKeyPiecesCopper0_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyPiecesCopper0.KeyPiecesCopper0.Description\n#: /Game/SO/Items/Keys/KeyPiecesCopper0.KeyPiecesCopper0.Description\nmsgctxt \"ItemData\"\nmsgid \"Half of a broken Copper Key\"\nmsgstr \"Jumătate dintr-o Cheie de Cupru spartă\"\n\n#. Key:\tKeyPiecesCopper0_name\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyPiecesCopper0.KeyPiecesCopper0.Name\n#: /Game/SO/Items/Keys/KeyPiecesCopper0.KeyPiecesCopper0.Name\nmsgctxt \"ItemData\"\nmsgid \"Half Copper Key\"\nmsgstr \"Cheie pe jumătate din Cupru\"\n\n#. Key:\tKeyPiecesIron0_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyPiecesIron0.KeyPiecesIron0.Description\n#: /Game/SO/Items/Keys/KeyPiecesIron0.KeyPiecesIron0.Description\nmsgctxt \"ItemData\"\nmsgid \"Half of a broken Iron Key\"\nmsgstr \"Jumătate dintr-o cheie de Fier spartă\"\n\n#. Key:\tKeyPiecesIron0_name\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyPiecesIron0.KeyPiecesIron0.Name\n#: /Game/SO/Items/Keys/KeyPiecesIron0.KeyPiecesIron0.Name\nmsgctxt \"ItemData\"\nmsgid \"Half Iron Key\"\nmsgstr \"Cheie pe jumătate din Fier\"\n\n#. Key:\tKeySA_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/KeySA.KeySA.Description\n#: /Game/SO/Items/Keys/KeySA.KeySA.Description\nmsgctxt \"ItemData\"\nmsgid \"Looks like there are tons of these\"\nmsgstr \"Se pare că există o gramadă de acestea\"\n\n#. Key:\tKeySA_name\n#. SourceLocation:\t/Game/SO/Items/Keys/KeySA.KeySA.Name\n#: /Game/SO/Items/Keys/KeySA.KeySA.Name\nmsgctxt \"ItemData\"\nmsgid \"Another Key\"\nmsgstr \"O altă Cheie\"\n\n#. Key:\tKeySASewerCreatureCell_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/KeySASewerCreatureCell.KeySASewerCreatureCell.Description\n#: /Game/SO/Items/Keys/KeySASewerCreatureCell.KeySASewerCreatureCell.Description\nmsgctxt \"ItemData\"\nmsgid \"A small key you got from the Pipe Walkers.\"\nmsgstr \"O mică cheie pe care ai primit-o de la Mergătorii pe Țevi.\"\n\n#. Key:\tKeyTLElevatorRoom_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyTLElevatorRoom.KeyTLElevatorRoom.Description\n#: /Game/SO/Items/Keys/KeyTLElevatorRoom.KeyTLElevatorRoom.Description\nmsgctxt \"ItemData\"\nmsgid \"A key without any sign of interest.\"\nmsgstr \"O cheie fără niciun semn de interes.\"\n\n#. Key:\tKeyTLElevatorRoom_name\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyTLElevatorRoom.KeyTLElevatorRoom.Name\n#: /Game/SO/Items/Keys/KeyTLElevatorRoom.KeyTLElevatorRoom.Name\nmsgctxt \"ItemData\"\nmsgid \"Unconcerned Key\"\nmsgstr \"Cheie necunoscută\"\n\n#. Key:\tKeyWWFirstGate_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyWWFirstGate.KeyWWFirstGate.Description\n#: /Game/SO/Items/Keys/KeyWWFirstGate.KeyWWFirstGate.Description\nmsgctxt \"ItemData\"\nmsgid \"It will open a gate somewhere. Probably.\"\nmsgstr \"Va deschide undeva o poartă. Probabil.\"\n\n#. Key:\tKeyWWFirstGate_name\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyWWFirstGate.KeyWWFirstGate.Name\n#: /Game/SO/Items/Keys/KeyWWFirstGate.KeyWWFirstGate.Name\nmsgctxt \"ItemData\"\nmsgid \"Railway Gate Key\"\nmsgstr \"Cheia porții de cale ferată\"\n\n#. Key:\tKeyWWPortal_desc\n#. SourceLocation:\t/Game/SO/Items/WhiteWallItems/KeyWWPortal.KeyWWPortal.Description\n#: /Game/SO/Items/WhiteWallItems/KeyWWPortal.KeyWWPortal.Description\nmsgctxt \"ItemData\"\nmsgid \"A fancy iron key with a shiny gem in its grip. It must be really precious.\"\nmsgstr \"O cheie extravagantă de fier, cu o bijuterie strălucitoare. Trebuie să fie cu adevărat prețioasă.\"\n\n#. Key:\tKeyWWPortal_name\n#. SourceLocation:\t/Game/SO/Items/WhiteWallItems/KeyWWPortal.KeyWWPortal.Name\n#: /Game/SO/Items/WhiteWallItems/KeyWWPortal.KeyWWPortal.Name\nmsgctxt \"ItemData\"\nmsgid \"Portal Key\"\nmsgstr \"Cheia Portalului\"\n\n#. Key:\tKEYWWSewerCreatureCell_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/KEYWWSewerCreatureCell.KEYWWSewerCreatureCell.Description\n#: /Game/SO/Items/Keys/KEYWWSewerCreatureCell.KEYWWSewerCreatureCell.Description\nmsgctxt \"ItemData\"\nmsgid \"A small key you got from a chest in the middle of nowhere.\"\nmsgstr \"O mică cheie pe care ai primit-o dintr-un cufăr din mijlocul nicăieri.\"\n\n#. Key:\tKEYWWSewerCreatureCell_name\n#. SourceLocation:\t/Game/SO/Items/Keys/KEYWWSewerCreatureCell.KEYWWSewerCreatureCell.Name\n#. Key:\tKeySASewerCreatureCell_name\n#. SourceLocation:\t/Game/SO/Items/Keys/KeySASewerCreatureCell.KeySASewerCreatureCell.Name\n#: /Game/SO/Items/Keys/KeySASewerCreatureCell.KeySASewerCreatureCell.Name\n#: /Game/SO/Items/Keys/KEYWWSewerCreatureCell.KEYWWSewerCreatureCell.Name\nmsgctxt \"ItemData\"\nmsgid \"Small Cell Key\"\nmsgstr \"Cheie pentru o Celulă Mică\"\n\n#. Key:\tKeyWWWhiteWall_desc\n#. SourceLocation:\t/Game/SO/Items/WhiteWallItems/KeyWWWhiteWall.KeyWWWhiteWall.Description\n#: /Game/SO/Items/WhiteWallItems/KeyWWWhiteWall.KeyWWWhiteWall.Description\nmsgctxt \"ItemData\"\nmsgid \"A robust iron key with a carved script: <Bold>'Outer Wall Tower'</>.\"\nmsgstr \"O cheie robustă de fier cu un text cioplit: <Bold>'Turnul de la zidul exterior'</>.\"\n\n#. Key:\tKeyWWWhiteWall_name\n#. SourceLocation:\t/Game/SO/Items/WhiteWallItems/KeyWWWhiteWall.KeyWWWhiteWall.Name\n#: /Game/SO/Items/WhiteWallItems/KeyWWWhiteWall.KeyWWWhiteWall.Name\nmsgctxt \"ItemData\"\nmsgid \"White Wall Key\"\nmsgstr \"Cheia de la Zidul Alb\"\n\n#. Key:\tKoboldCoin_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/KoboldCoin.KoboldCoin.Description\n#: /Game/SO/Items/QuestItems/KoboldCoin.KoboldCoin.Description\nmsgctxt \"ItemData\"\nmsgid \"Some Coins you found in a chest.\"\nmsgstr \"Niște monede pe care le-ai găsit într-un cufăr.\"\n\n#. Key:\tKoboldCoin_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/KoboldCoin.KoboldCoin.Name\n#: /Game/SO/Items/QuestItems/KoboldCoin.KoboldCoin.Name\nmsgctxt \"ItemData\"\nmsgid \"Kobold Coins\"\nmsgstr \"Monede Kobold\"\n\n#. Key:\tKoboldPotion_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/KoboldPotion.KoboldPotion.Description\n#: /Game/SO/Items/QuestItems/KoboldPotion.KoboldPotion.Description\nmsgctxt \"ItemData\"\nmsgid \"Weird liquid in a bottle. The kobold calls it Soup.\"\nmsgstr \"Lichid ciudat într-o sticlă. Kobold-ul îl numește supă.\"\n\n#. Key:\tKoboldPotion_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/KoboldPotion.KoboldPotion.Name\n#: /Game/SO/Items/QuestItems/KoboldPotion.KoboldPotion.Name\nmsgctxt \"ItemData\"\nmsgid \"Kobold Soup\"\nmsgstr \"Supă de Kobold\"\n\n#. Key:\tLavaGolemToken_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/LavaGolemToken.LavaGolemToken.Description\n#: /Game/SO/Items/QuestItems/LavaGolemToken.LavaGolemToken.Description\nmsgctxt \"ItemData\"\nmsgid \"A unique stone you can use to prove that you have eliminated a golem.\"\nmsgstr \"O piatră unică pe care o poți folosi pentru a demonstra că ai eliminat un golem.\"\n\n#. Key:\tLavaGolemToken_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/LavaGolemToken.LavaGolemToken.Name\n#: /Game/SO/Items/QuestItems/LavaGolemToken.LavaGolemToken.Name\nmsgctxt \"ItemData\"\nmsgid \"Stone Token\"\nmsgstr \"Jeton de Piatră\"\n\n#. Key:\tLeafMace_desc\n#. SourceLocation:\t/Game/SO/Items/Weapons/LeafMace.LeafMace.Description\n#: /Game/SO/Items/Weapons/LeafMace.LeafMace.Description\nmsgctxt \"ItemData\"\nmsgid \"If someone would fail in cutting his/her/its way out of a hard situation, crushing your way through can still work out pretty well - it is said to be more effective if golems or certain mechanical devices / creatures are involved in the conflict.\"\nmsgstr \"Dacă cineva nu reușește să-și taie drumul dintr-o situație grea, zdrobirea drumului tău poate totuși să funcționeze destul de bine - se spune că este mai eficient dacă în conflict sunt implicați Golemi sau anumite dispozitive / creaturi mecanice.\"\n\n#. Key:\tLeafMace_name\n#. SourceLocation:\t/Game/SO/Items/Weapons/LeafMace.LeafMace.Name\n#: /Game/SO/Items/Weapons/LeafMace.LeafMace.Name\nmsgctxt \"ItemData\"\nmsgid \"Leaf Mace\"\nmsgstr \"Buzduganul Frunză\"\n\n#. Key:\tLEKeyCage_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/LEKeyCage.LEKeyCage.Description\n#: /Game/SO/Items/Keys/LEKeyCage.LEKeyCage.Description\nmsgctxt \"ItemData\"\nmsgid \"You won't believe it but it is a key for a cage.\"\nmsgstr \"Nu vei crede, dar este o cheie pentru o cușcă.\"\n\n#. Key:\tLEKeyCage_name\n#. SourceLocation:\t/Game/SO/Items/Keys/LEKeyCage.LEKeyCage.Name\n#: /Game/SO/Items/Keys/LEKeyCage.LEKeyCage.Name\nmsgctxt \"ItemData\"\nmsgid \"Cage Key\"\nmsgstr \"Cheia Coliviei\"\n\n#. Key:\tLETempleKey_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/LETempleKey.LETempleKey.Description\n#: /Game/SO/Items/Keys/LETempleKey.LETempleKey.Description\nmsgctxt \"ItemData\"\nmsgid \"This is one of the spare keys of the Ancient Temple. Just in case the original would be dropped into the lava accidentally.\"\nmsgstr \"Aceasta este una dintre cheile de rezervă ale Templului Antic. Doar în cazul în care originalul ar fi aruncat în lavă accidental.\"\n\n#. Key:\tLETempleKey_name\n#. SourceLocation:\t/Game/SO/Items/Keys/LETempleKey.LETempleKey.Name\n#: /Game/SO/Items/Keys/LETempleKey.LETempleKey.Name\nmsgctxt \"ItemData\"\nmsgid \"Ancient Temple Key\"\nmsgstr \"Cheia Templului Antic\"\n\n#. Key:\tLoryBooks_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/LoryBooks.LoryBooks.Description\n#: /Game/SO/Items/QuestItems/LoryBooks.LoryBooks.Description\nmsgctxt \"ItemData\"\nmsgid \"Two ancient books with the titles \\\"True value of your family\\\" and \\\"How much does a brother cost?\\\". They look boring so you decide not to open them.\"\nmsgstr \"Două cărți antice cu titlurile „Valoarea adevărată a familiei tale” și „Cât costă un frate?”. Par plictisitoare, deci decizi să nu le deschizi.\"\n\n#. Key:\tLoryBooks_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/LoryBooks.LoryBooks.Name\n#: /Game/SO/Items/QuestItems/LoryBooks.LoryBooks.Name\nmsgctxt \"ItemData\"\nmsgid \"Old books\"\nmsgstr \"Cărți vechi\"\n\n#. Key:\tMemoryCrystal1_desc\n#. SourceLocation:\t/Game/SO/Items/MemoryStone/MemoryCrystal1.MemoryCrystal1.Description\n#: /Game/SO/Items/MemoryStone/MemoryCrystal1.MemoryCrystal1.Description\nmsgctxt \"ItemData\"\nmsgid \"'According to the very few survivors, White Tower, our capital was completely destroyed by a magical phenomena called Ruin. At that time I was at Grey Gate so I can't tell anything for sure.'\\r\\n\\r\\nThe Last Sane Golem Maker, A.C. 16. September 4.\"\nmsgstr \"„După poveștile a foarte puțini supraviețuitori, Turnul Alb, capitala noastră a fost complet distrusă de un fenomen magic numit Ruin. Pe atunci eram la Poarta Gri, deci nu pot spune nimic sigur.\\\"\\n\\nUltimul Creator de Golemi Normal, A.C. 16. 4 Septembrie.\"\n\n#. Key:\tMemoryCrystal1_name\n#. SourceLocation:\t/Game/SO/Items/MemoryStone/MemoryCrystal1.MemoryCrystal1.Name\n#: /Game/SO/Items/MemoryStone/MemoryCrystal1.MemoryCrystal1.Name\nmsgctxt \"ItemData\"\nmsgid \"Magical Phenomena\"\nmsgstr \"Fenomene Magice\"\n\n#. Key:\tMemoryCrystal2_desc\n#. SourceLocation:\t/Game/SO/Items/MemoryStone/MemoryCrystal2.MemoryCrystal2.Description\n#: /Game/SO/Items/MemoryStone/MemoryCrystal2.MemoryCrystal2.Description\nmsgctxt \"ItemData\"\nmsgid \"'Those who escaped Ruin have... changed.'\\r\\n'I've met a scientist who noticed how madness takes control over him. Perhaps he can find a solution.'\\r\\n\\r\\nThe Last Sane Golem Maker, A.C. 17. January 1.\"\nmsgstr \"„Cei care au scăpat de Ruina s-au schimbat”.\\n„Am întâlnit un om de știință care a observat cum nebunia preia controlul asupra lui. Poate că poate găsi o soluție.\\\"\\n\\nUltimul Creator de Golemi Normal, A.C. 17. 1 Ianuarie.\"\n\n#. Key:\tMemoryCrystal2_name\n#. SourceLocation:\t/Game/SO/Items/MemoryStone/MemoryCrystal2.MemoryCrystal2.Name\n#: /Game/SO/Items/MemoryStone/MemoryCrystal2.MemoryCrystal2.Name\nmsgctxt \"ItemData\"\nmsgid \"Degeneration and mutation\"\nmsgstr \"Degenerare și Mutație\"\n\n#. Key:\tMemoryCrystal3_desc\n#. SourceLocation:\t/Game/SO/Items/MemoryStone/MemoryCrystal3.MemoryCrystal3.Description\n#: /Game/SO/Items/MemoryStone/MemoryCrystal3.MemoryCrystal3.Description\nmsgctxt \"ItemData\"\nmsgid \"'It's hard to tell but I think colours are fading away. The World was brighter before.'\\r\\n'The Monk won't help me. He stubbornly believes we are doomed.'\\r\\n\\r\\nThe Last Sane Golem Maker, A.C. 17. March 11.\"\nmsgstr \"„Este greu de spus, dar cred că culorile se estompează. Lumea era mai strălucitoare înainte. \\\"\\n„Călugărul nu mă va ajuta. Se încăpățânează să creadă că suntem condamnați.\\\"\\n\\nUltimul Creator de Golemi Normal, A.C. 17. 11 Martie.\"\n\n#. Key:\tMemoryCrystal3_name\n#. SourceLocation:\t/Game/SO/Items/MemoryStone/MemoryCrystal3.MemoryCrystal3.Name\n#: /Game/SO/Items/MemoryStone/MemoryCrystal3.MemoryCrystal3.Name\nmsgctxt \"ItemData\"\nmsgid \"Fading Colours\"\nmsgstr \"Culori Decolorate\"\n\n#. Key:\tMemoryCrystal4_desc\n#. SourceLocation:\t/Game/SO/Items/MemoryStone/MemoryCrystal4.MemoryCrystal4.Description\n#: /Game/SO/Items/MemoryStone/MemoryCrystal4.MemoryCrystal4.Description\nmsgctxt \"ItemData\"\nmsgid \"'Madness takes control over those who get too close to Ruin.'\\r\\n'Maintainers forgot to speak. I understand some of the phrases they try to say: \\\"Dinner is served\\\", \\\"At your service\\\", \\\"Your order\\\" - a mockery of their former intelligence!'\\r\\n\\r\\nThe Last Sane Golem Maker, A.C. 21. January 26.\"\nmsgstr \"„Nebunia preia controlul asupra celor care se apropie prea mult de Ruin.\\\"\\n„Curățătorii au uitat să vorbească. Înțeleg unele dintre frazele pe care încearcă să le spună: „Cina este servită”, „La slujba ta”, „Comanda ta” - o batjocură a fostei lor inteligențe!\\\"\\n\\nUltimul Creator de Golemi Normal, A.C. 21. 26 Ianuarie.\"\n\n#. Key:\tMemoryCrystal4_name\n#. SourceLocation:\t/Game/SO/Items/MemoryStone/MemoryCrystal4.MemoryCrystal4.Name\n#: /Game/SO/Items/MemoryStone/MemoryCrystal4.MemoryCrystal4.Name\nmsgctxt \"ItemData\"\nmsgid \"Madness\"\nmsgstr \"Nebunie\"\n\n#. Key:\tMemoryCrystal5_desc\n#. SourceLocation:\t/Game/SO/Items/MemoryStone/MemoryCrystal5.MemoryCrystal5.Description\n#: /Game/SO/Items/MemoryStone/MemoryCrystal5.MemoryCrystal5.Description\nmsgctxt \"ItemData\"\nmsgid \"'Now I have seen it with my own eyes: the touch of the Ruin makes the World literally fall apart.'\\r\\n\\r\\nThe Last Sane Golem Maker, A.C. 25. September 4.\"\nmsgstr \"„Acum am văzut-o cu proprii mei ochi: atingerea Ruinei face ca lumea să cadă literalmente.”\\n\\nUltimul Creator de Golemi Normal, A.C. 25. 4 Septembrie.\"\n\n#. Key:\tMemoryCrystal5_name\n#. SourceLocation:\t/Game/SO/Items/MemoryStone/MemoryCrystal5.MemoryCrystal5.Name\n#: /Game/SO/Items/MemoryStone/MemoryCrystal5.MemoryCrystal5.Name\nmsgctxt \"ItemData\"\nmsgid \"Falling Apart\"\nmsgstr \"Se destramă\"\n\n#. Key:\tMemoryCrystal6_desc\n#. SourceLocation:\t/Game/SO/Items/MemoryStone/MemoryCrystal6.MemoryCrystal6.Description\n#: /Game/SO/Items/MemoryStone/MemoryCrystal6.MemoryCrystal6.Description\nmsgctxt \"ItemData\"\nmsgid \"'This is my 87 birthday. It's obvious that my body doesn't get older with time. How long can I preserve my sanity?'\\r\\n'Drones can no longer be trusted. They resisted Ruin for the longest.'\\r\\n\\r\\nThe Last Sane Golem Maker, A.C. 52. July 9.\"\nmsgstr \"„Aceasta este ziua mea de 87 de ani. Este evident că corpul meu nu îmbătrânește cu timpul. Cât timp îmi pot păstra sănătatea?\\\"\\n„Dronele nu mai pot fi de încredere. Au rezistat Ruina cel mai mult timp. \\\"\\n\\nUltimul Creator de Golemi Normal, A.C. 52. 9 Iulie.\"\n\n#. Key:\tMemoryCrystal6_name\n#. SourceLocation:\t/Game/SO/Items/MemoryStone/MemoryCrystal6.MemoryCrystal6.Name\n#: /Game/SO/Items/MemoryStone/MemoryCrystal6.MemoryCrystal6.Name\nmsgctxt \"ItemData\"\nmsgid \"Preservation of Ruin\"\nmsgstr \"Conservarea ruinei\"\n\n#. Key:\tMemoryCrystal7_desc\n#. SourceLocation:\t/Game/SO/Items/MemoryStone/MemoryCrystal7.MemoryCrystal7.Description\n#: /Game/SO/Items/MemoryStone/MemoryCrystal7.MemoryCrystal7.Description\nmsgctxt \"ItemData\"\nmsgid \"'Ruin will soon reach Grey Gate, our very last city. I need to move deeper into the Realm, further away from Ruin.'\\r\\n'I decided to create some new golems. Golems that resist Ruin.'\\r\\n\\r\\nThe Last Sane Golem Maker, A.C. 315. April 8.\"\nmsgstr \"„Ruina va ajunge în curând la Poarta Gri, chiar ultimul nostru oraș. Trebuie să mă aventurez mai adânc pe tărâm, mai departe de Ruină.\\\"\\n„Am decis să creez câțiva golemi noi. Golemi care rezistă ruinei.\\\"\\n\\nUltimul Creator de Golemi Normal, A.C. 315. 8 Aprilie.\"\n\n#. Key:\tMemoryCrystal7_name\n#. SourceLocation:\t/Game/SO/Items/MemoryStone/MemoryCrystal7.MemoryCrystal7.Name\n#: /Game/SO/Items/MemoryStone/MemoryCrystal7.MemoryCrystal7.Name\nmsgctxt \"ItemData\"\nmsgid \"New Hope\"\nmsgstr \"Speranța Nouă\"\n\n#. Key:\tMemoryCrystal8_desc\n#. SourceLocation:\t/Game/SO/Items/MemoryStone/MemoryCrystal8.MemoryCrystal8.Description\n#: /Game/SO/Items/MemoryStone/MemoryCrystal8.MemoryCrystal8.Description\nmsgctxt \"ItemData\"\nmsgid \"'I don't think I can keep up. There are times when I no longer know what I'm doing. I still have clear moments but they become more and more rare. I've recorded my memories to keep them safe.'\\r\\n\\r\\nThe Last Sane Golem Maker, about A.C. 500.\\r\\n\"\nmsgstr \"„Nu cred că pot ține pasul. Sunt momente în care nu mai știu ce fac. Încă am momente clare, dar devin din ce în ce mai rare. Mi-am înregistrat amintirile pentru a le păstra în siguranță.\\\"\\n\\nUltimul Creator de Golemi Normal, în jur de A.C. 500.\\n\"\n\n#. Key:\tMemoryCrystal8_name\n#. SourceLocation:\t/Game/SO/Items/MemoryStone/MemoryCrystal8.MemoryCrystal8.Name\n#: /Game/SO/Items/MemoryStone/MemoryCrystal8.MemoryCrystal8.Name\nmsgctxt \"ItemData\"\nmsgid \"Final Decision\"\nmsgstr \"Decizia finală\"\n\n#. Key:\tPergamen_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/Pergamen.Pergamen.Description\n#: /Game/SO/Items/QuestItems/Pergamen.Pergamen.Description\nmsgctxt \"ItemData\"\nmsgid \"'This chest and everything inside belongs to me, the Chef.'\"\nmsgstr \"„Cufărul acesta și tot ceea ce este înăuntru îmi aparțin mie, Bucătarul.”\"\n\n#. Key:\tPergamen_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/Pergamen.Pergamen.Name\n#: /Game/SO/Items/QuestItems/Pergamen.Pergamen.Name\nmsgctxt \"ItemData\"\nmsgid \"Parchment\"\nmsgstr \"Pergament\"\n\n#. Key:\tPortalGem_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/PortalGem.PortalGem.Description\n#: /Game/SO/Items/QuestItems/PortalGem.PortalGem.Description\nmsgctxt \"ItemData\"\nmsgid \"There are so many stones around. You are still not sure what's the point of picking up some of them.\"\nmsgstr \"Sunt atât de multe pietre în jur. Încă nu ești sigur care este punctul de a alege unele dintre ele.\"\n\n#. Key:\tPortalGem_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/PortalGem.PortalGem.Name\n#: /Game/SO/Items/QuestItems/PortalGem.PortalGem.Name\nmsgctxt \"ItemData\"\nmsgid \"Lock Gem\"\nmsgstr \"Bijuteria Inchuietoarei\"\n\n#. Key:\tPotionOfWorthiness_desc\n#. SourceLocation:\t/Game/SO/Items/Useable/PotionOfWorthiness.PotionOfWorthiness.Description\n#: /Game/SO/Items/Useable/PotionOfWorthiness.PotionOfWorthiness.Description\nmsgctxt \"ItemData\"\nmsgid \"This might not be the weirdest side effect one can have when drinking something suspicious but it is definitely in the top five.\"\nmsgstr \"Acesta s-ar putea să nu fie cel mai ciudat efect secundar pe care îl putem avea atunci când bei ceva suspect, dar este cu siguranță în primele cinci.\"\n\n#. Key:\tPotionOfWorthiness_name\n#. SourceLocation:\t/Game/SO/Items/Useable/PotionOfWorthiness.PotionOfWorthiness.Name\n#: /Game/SO/Items/Useable/PotionOfWorthiness.PotionOfWorthiness.Name\nmsgctxt \"ItemData\"\nmsgid \"Potion Of Worthiness\"\nmsgstr \"Poțiune Demnității\"\n\n#. Key:\tPurpleMushroom_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/PurpleMushroom.PurpleMushroom.Description\n#: /Game/SO/Items/QuestItems/PurpleMushroom.PurpleMushroom.Description\nmsgctxt \"ItemData\"\nmsgid \"The most purple mushrooms you could find. You hope these will be enough.\"\nmsgstr \"Ciupercile cele mai violete pe care le-ai putea găsi. Speri că acestea vor fi suficiente.\"\n\n#. Key:\tPurpleMushroom_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/PurpleMushroom.PurpleMushroom.Name\n#: /Game/SO/Items/QuestItems/PurpleMushroom.PurpleMushroom.Name\nmsgctxt \"ItemData\"\nmsgid \"Purple Mushrooms\"\nmsgstr \"Ciuperci Violet\"\n\n#. Key:\tRavenFeather_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/RavenFeather.RavenFeather.Description\n#: /Game/SO/Items/QuestItems/RavenFeather.RavenFeather.Description\nmsgctxt \"ItemData\"\nmsgid \"A magical item which gives you the ability to fly... or something like that.\"\nmsgstr \"Un articol magic care îțî oferă capacitatea de a zbura ... sau ceva de genul.\"\n\n#. Key:\tRavenFeather_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/RavenFeather.RavenFeather.Name\n#: /Game/SO/Items/QuestItems/RavenFeather.RavenFeather.Name\nmsgctxt \"ItemData\"\nmsgid \"Raven Feather\"\nmsgstr \"Pana de Corb\"\n\n#. Key:\tRope_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/Rope.Rope.Description\n#: /Game/SO/Items/QuestItems/Rope.Rope.Description\nmsgctxt \"ItemData\"\nmsgid \"You do wonder when the area is full of ropes why this is the only one which can be taken...\"\nmsgstr \"Te întrebi când zona este plină de funii de ce acesta este singurul care poate fi luată ...\"\n\n#. Key:\tRope_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/Rope.Rope.Name\n#: /Game/SO/Items/QuestItems/Rope.Rope.Name\nmsgctxt \"ItemData\"\nmsgid \"Rope\"\nmsgstr \"Funie\"\n\n#. Key:\tRuneStoneBonusHPMagical_desc\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneBonusHPMagical.RuneStoneBonusHPMagical.Description\n#: /Game/SO/Items/RuneStones/RuneStoneBonusHPMagical.RuneStoneBonusHPMagical.Description\nmsgctxt \"ItemData\"\nmsgid \"Absorbs <Blue>30</> magical damage.\"\nmsgstr \"Absoarbe <Blue>30</> daune magice.\"\n\n#. Key:\tRuneStoneBonusHPMagical_name\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneBonusHPMagical.RuneStoneBonusHPMagical.Name\n#: /Game/SO/Items/RuneStones/RuneStoneBonusHPMagical.RuneStoneBonusHPMagical.Name\nmsgctxt \"ItemData\"\nmsgid \"Bluestone\"\nmsgstr \"Piatra Albastră\"\n\n#. Key:\tRuneStoneBonusHPPhysical_desc\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneBonusHPPhysical.RuneStoneBonusHPPhysical.Description\n#: /Game/SO/Items/RuneStones/RuneStoneBonusHPPhysical.RuneStoneBonusHPPhysical.Description\nmsgctxt \"ItemData\"\nmsgid \"Absorbs <White>30</> physical damage.\"\nmsgstr \"Absoarbe <Blue>30</> daune fizice.\"\n\n#. Key:\tRuneStoneBonusHPPhysical_name\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneBonusHPPhysical.RuneStoneBonusHPPhysical.Name\n#: /Game/SO/Items/RuneStones/RuneStoneBonusHPPhysical.RuneStoneBonusHPPhysical.Name\nmsgctxt \"ItemData\"\nmsgid \"Graystone\"\nmsgstr \"Piatra Gri\"\n\n#. Key:\tRuneStoneBounce_desc\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.Description\n#. Key:\tRuneStoneBounce_level_desc_0\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.LevelBasedDescOverride(0).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.Description\n#: /Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.LevelBasedDescOverride(0).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Provides the ability to bounce from enemies for <Green>8</> seconds. Doing so causes <Blue>12</> damage to the target.\"\nmsgstr \"Oferă capacitatea de a sări de la dușmani pentru<Green>8</> secunde. A face acest lucru cauzează<Blue>12</> daune țintei.\"\n\n#. Key:\tRuneStoneBounce_level_desc_1\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.LevelBasedDescOverride(1).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.LevelBasedDescOverride(1).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Provides the ability to bounce from enemies for <Green>16</> seconds. Doing so causes <Blue>18</> damage to the target.\"\nmsgstr \"Oferă capacitatea de a sări de la dușmani pentru<Green>16</> secunde. A face acest lucru cauzează<Blue>18</> daune țintei.\"\n\n#. Key:\tRuneStoneBounce_level_desc_2\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.LevelBasedDescOverride(2).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.LevelBasedDescOverride(2).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Provides the ability to bounce from enemies for <Green>16</> seconds. Doing so causes <Blue>18</> damage and applies <Yellow>Stun</> on the target.\"\nmsgstr \"Oferă capacitatea de a sări de la dușmani pentru<Green>16</> secunde. A face acest lucru cauzează<Blue>18</> daune și <Yellow>Amețește</> ținta.\"\n\n#. Key:\tRuneStoneBounce_level_desc_3\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.LevelBasedDescOverride(3).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.LevelBasedDescOverride(3).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Provides the ability to bounce from enemies for <Green>16</> seconds. Doing so causes <Blue>24</> damage and applies <Yellow>Stun</> on the target.\"\nmsgstr \"Oferă capacitatea de a sări de la dușmani pentru<Green>16</> secunde. A face acest lucru cauzează<Blue>24</> daune și <Yellow>Amețește</> ținta.\"\n\n#. Key:\tRuneStoneBounce_level_desc_4\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.LevelBasedDescOverride(4).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.LevelBasedDescOverride(4).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Provides the ability to bounce from enemies for <Green>16</> seconds. Doing so causes <Blue>30</> damage and applies <Yellow>Stun</> on the target.\"\nmsgstr \"Oferă capacitatea de a sări de la dușmani pentru<Green>16</> secunde. A face acest lucru cauzează<Blue>30</> daune și <Yellow>Amețește</> ținta.\"\n\n#. Key:\tRuneStoneBounce_level_up_desc_0\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.LevelUpBasedDescOverride(0).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.LevelUpBasedDescOverride(0).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Provides the ability to bounce from enemies for <Green>8</><YellowH>(→16)</> seconds. Doing so causes <Blue>12</><YellowH>(→18)</> damage to the target.\"\nmsgstr \"Oferă capacitatea de a sări de la dușmani pentru<Green>8</><YellowH>(→16)</> secunde. A face acest lucru cauzează<Blue>12</><YellowH>(→18)</> daune țintei.\"\n\n#. Key:\tRuneStoneBounce_level_up_desc_1\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.LevelUpBasedDescOverride(1).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.LevelUpBasedDescOverride(1).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Provides the ability to bounce from enemies for <Green>16</> seconds. Doing so causes <Blue>18</> damage <YellowH>and applies Stun on the target.</>\"\nmsgstr \"Oferă capacitatea de a sări de la dușmani pentru<Green>16</> secunde. A face acest lucru cauzează<Blue>18</> daune <Yellow>și Amețește ținta.</>\"\n\n#. Key:\tRuneStoneBounce_level_up_desc_2\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.LevelUpBasedDescOverride(2).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.LevelUpBasedDescOverride(2).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Provides the ability to bounce from enemies for <Green>16</> seconds. Doing so causes <Blue>18</><YellowH>(→24)</> damage and applies <Yellow>Stun</> on the target.\"\nmsgstr \"Oferă capacitatea de a sări de la dușmani pentru<Green>16</> secunde. A face acest lucru cauzează<Blue>18</><YellowH>(→24)</> daune și <Yellow>Amețește</> ținta.\"\n\n#. Key:\tRuneStoneBounce_level_up_desc_3\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.LevelUpBasedDescOverride(3).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.LevelUpBasedDescOverride(3).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Provides the ability to bounce from enemies for <Green>16</> seconds. Doing so causes <Blue>24</><YellowH>(→30)</> damage and applies <Yellow>Stun</> on the target.\"\nmsgstr \"Oferă capacitatea de a sări de la dușmani pentru<Green>16</> secunde. A face acest lucru cauzează<Blue>24</><YellowH>(→30)</> daune și <Yellow>Amețește</> ținta.\"\n\n#. Key:\tRuneStoneBounce_name\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.Name\n#: /Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.Name\nmsgctxt \"ItemData\"\nmsgid \"Bouncestone\"\nmsgstr \"Piatra Săriturii\"\n\n#. Key:\tRuneStoneEnergy_desc\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneEnergy.RuneStoneEnergy.Description\n#: /Game/SO/Items/RuneStones/RuneStoneEnergy.RuneStoneEnergy.Description\nmsgctxt \"ItemData\"\nmsgid \"Strikes and spell cooldowns are decreased by 90% for 10 seconds.\"\nmsgstr \"Viteza de reîncărcare pentru lovituri și vrăji este redusa cu 90% timp de 10 secunde.\"\n\n#. Key:\tRuneStoneEnergy_name\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneEnergy.RuneStoneEnergy.Name\n#: /Game/SO/Items/RuneStones/RuneStoneEnergy.RuneStoneEnergy.Name\nmsgctxt \"ItemData\"\nmsgid \"Energystone\"\nmsgstr \"Piatra Energiei\"\n\n#. Key:\tRuneStoneFire0_desc\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneFire0.RuneStoneFire0.Description\n#. Key:\tRuneStoneFire0_level_desc_0\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneFire0.RuneStoneFire0.LevelBasedDescOverride(0).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneFire0.RuneStoneFire0.Description\n#: /Game/SO/Items/RuneStones/RuneStoneFire0.RuneStoneFire0.LevelBasedDescOverride(0).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons a powerful blast roasting anything in a straight line.\\nCauses <Blue>16</> damage.\"\nmsgstr \"Invocă o explozie puternică care prăjește orice într-o linie dreaptă.\\nCauzează <Blue>16</> vătămare.\"\n\n#. Key:\tRuneStoneFire0_level_desc_1\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneFire0.RuneStoneFire0.LevelBasedDescOverride(1).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneFire0.RuneStoneFire0.LevelBasedDescOverride(1).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons a powerful blast roasting anything in a straight line.\\nCauses <Blue>32</> damage.\"\nmsgstr \"Invocă o explozie puternică care prăjește orice într-o linie dreaptă.\\nCauzează <Blue>32</> vătămare.\"\n\n#. Key:\tRuneStoneFire0_level_desc_2\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneFire0.RuneStoneFire0.LevelBasedDescOverride(2).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneFire0.RuneStoneFire0.LevelBasedDescOverride(2).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons a powerful blast roasting anything in a straight line.\\nCauses <Blue>36</> damage. The spell has <Green>50%</> chance to <Purple>Instant Recharge.</>\"\nmsgstr \"Invocă o explozie puternică care prăjește orice într-o linie dreaptă.\\nCauzează <Blue>36</> vătămare. Vraja are <Green>50%</> șansă să se <Purple>Reîncarce imediat.</>\"\n\n#. Key:\tRuneStoneFire0_level_desc_3\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneFire0.RuneStoneFire0.LevelBasedDescOverride(3).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneFire0.RuneStoneFire0.LevelBasedDescOverride(3).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons a powerful blast roasting anything in a straight line.\\nCauses <Blue>52</> damage. The spell has <Green>50%</> chance to <Purple>Instant Recharge.</>\"\nmsgstr \"Invocă o explozie puternică care prăjește orice într-o linie dreaptă.\\nCauzează <Blue>52</> vătămare. Vraja are <Green>50%</> șansă să se <Purple>Reîncarce imediat.</>\"\n\n#. Key:\tRuneStoneFire0_level_up_desc_0\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneFire0.RuneStoneFire0.LevelUpBasedDescOverride(0).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneFire0.RuneStoneFire0.LevelUpBasedDescOverride(0).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons a powerful blast roasting anything in a straight line.\\nCauses <Blue>16</><YellowH>(→32)</> damage.\"\nmsgstr \"Invocă o explozie puternică care prăjește orice într-o linie dreaptă.\\nCauzează <Blue>16</><YellowH>(→32)</> vătămare.\"\n\n#. Key:\tRuneStoneFire0_level_up_desc_1\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneFire0.RuneStoneFire0.LevelUpBasedDescOverride(1).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneFire0.RuneStoneFire0.LevelUpBasedDescOverride(1).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons a powerful blast roasting anything in a straight line.\\nCauses <Blue>32</><YellowH>(→36)</> damage. <YellowH>The spell has </><GreenH>50%</> <YellowH>chance to </><PurpleH>Instant Recharge.</>\"\nmsgstr \"Invocă o explozie puternică care prăjește orice într-o linie dreaptă.\\nCauzează <Blue>32</><YellowH>(→36)</> vătămare. <YellowH>Vraja are </><Green>50%</> <YellowH>șansă să se </><Purple>Reîncarce imediat.</>\"\n\n#. Key:\tRuneStoneFire0_level_up_desc_2\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneFire0.RuneStoneFire0.LevelUpBasedDescOverride(2).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneFire0.RuneStoneFire0.LevelUpBasedDescOverride(2).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons a powerful blast roasting anything in a straight line.\\nCauses <Blue>36</><YellowH>(→52)</> damage. The spell has <Green>50%</> chance to <Purple>Instant Recharge.</>\"\nmsgstr \"Invocă o explozie puternică care prăjește orice într-o linie dreaptă..\\nCauzează <Blue>36</><YellowH>(→52)</> vătămare. Vraja are <Green>50%</> șansă să se <Purple>Reîncarce imediat.</>\"\n\n#. Key:\tRuneStoneFire0_name\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneFire0.RuneStoneFire0.Name\n#: /Game/SO/Items/RuneStones/RuneStoneFire0.RuneStoneFire0.Name\nmsgctxt \"ItemData\"\nmsgid \"Firestone\"\nmsgstr \"Piatră de Foc\"\n\n#. Key:\tRuneStoneHeal_desc\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneHeal.RuneStoneHeal.Description\n#: /Game/SO/Items/RuneStones/RuneStoneHeal.RuneStoneHeal.Description\nmsgctxt \"ItemData\"\nmsgid \"Restores <Green>30</> health points.\"\nmsgstr \"Restaurează <Green>30</> de punte de viață.\"\n\n#. Key:\tRuneStoneHeal_name\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneHeal.RuneStoneHeal.Name\n#: /Game/SO/Items/RuneStones/RuneStoneHeal.RuneStoneHeal.Name\nmsgctxt \"ItemData\"\nmsgid \"Healstone\"\nmsgstr \"Piatra Vindecării\"\n\n#. Key:\tRuneStoneLightningWalk_desc\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneLightningWalk.RuneStoneLightningWalk.Description\n#: /Game/SO/Items/RuneStones/RuneStoneLightningWalk.RuneStoneLightningWalk.Description\nmsgctxt \"ItemData\"\nmsgid \"Grants the shocking ability to walk through your enemies for <Green>2</> sec. The shock causes <Blue>10</> damage.\"\nmsgstr \"Oferă abilitatea șocantă de a merge prin inamici pentru <Green>2</> secunde. Șocul cauzează <Blue>10</> daune.\"\n\n#. Key:\tRuneStoneLightningWalk_level_desc_0\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneLightningWalk.RuneStoneLightningWalk.LevelBasedDescOverride(0).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneLightningWalk.RuneStoneLightningWalk.LevelBasedDescOverride(0).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Grants the shocking ability to walk through your enemies for <Green>2</> sec. The shock causes <Blue>16</> damage.\"\nmsgstr \"Oferă abilitatea șocantă de a merge prin inamici pentru <Green>2</> secunde. Șocul cauzează <Blue>16</> daune.\"\n\n#. Key:\tRuneStoneLightningWalk_level_desc_1\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneLightningWalk.RuneStoneLightningWalk.LevelBasedDescOverride(1).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneLightningWalk.RuneStoneLightningWalk.LevelBasedDescOverride(1).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Grants the shocking ability to walk through your enemies for <Green>3</> sec. The shock causes <Blue>28</> damage.\"\nmsgstr \"Oferă abilitatea șocantă de a merge prin inamici pentru <Green>3</> secunde. Șocul cauzează <Blue>28</> daune.\"\n\n#. Key:\tRuneStoneLightningWalk_level_desc_2\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneLightningWalk.RuneStoneLightningWalk.LevelBasedDescOverride(2).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneLightningWalk.RuneStoneLightningWalk.LevelBasedDescOverride(2).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Grants the shocking ability to walk through your enemies for <Green>4</> sec. The shock causes <Blue>32</> damage and has a <Green>30%</> chance to <Yellow>stun</> the target.\"\nmsgstr \"Oferă abilitatea șocantă de a merge prin inamici pentru <Green>4</> secunde. Șocul cauzează <Blue>32</> daune și are o șansă de <Green>30%</> de a <Yellow>Ameți</> ținta.\"\n\n#. Key:\tRuneStoneLightningWalk_level_desc_3\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneLightningWalk.RuneStoneLightningWalk.LevelBasedDescOverride(3).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneLightningWalk.RuneStoneLightningWalk.LevelBasedDescOverride(3).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Grants the shocking ability to walk through your enemies for <Green>4</> sec. The shock causes <Blue>32</> damage and has a <Green>40%</> chance to <Yellow>stun</> the target.\"\nmsgstr \"Oferă abilitatea șocantă de a merge prin inamici pentru <Green>4</> secunde. Șocul cauzează <Blue>32</> daune și are o șansă de <Green>40%</> de a <Yellow>Ameți</> ținta.\"\n\n#. Key:\tRuneStoneLightningWalk_level_up_desc_0\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneLightningWalk.RuneStoneLightningWalk.LevelUpBasedDescOverride(0).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneLightningWalk.RuneStoneLightningWalk.LevelUpBasedDescOverride(0).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Grants the shocking ability to walk through your enemies for <Green>2</><YellowH>(→3)</> sec. The shock causes <Blue>16</> <YellowH>(→28)</>damage.\"\nmsgstr \"Oferă abilitatea șocantă de a merge prin inamici pentru <Green>2</><YellowH>(→3)</> secunde. Șocul cauzează <Blue>16</><YellowH>(→28)</> daune.\"\n\n#. Key:\tRuneStoneLightningWalk_level_up_desc_1\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneLightningWalk.RuneStoneLightningWalk.LevelUpBasedDescOverride(1).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneLightningWalk.RuneStoneLightningWalk.LevelUpBasedDescOverride(1).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Grants the shocking ability to walk through your enemies for <Green>3</><YellowH>(→4)</> sec. The shock causes <Blue>28</> <YellowH>(→36)</>damage <YellowH>and has a </><GreenH>30%</> <YellowH>chance to stun the target.</>\"\nmsgstr \"Oferă abilitatea șocantă de a merge prin inamici pentru <Green>3</><YellowH>(→4)</> secunde. Șocul cauzează <Blue>28</><YellowH>(→36)</> daune <YellowH>și are o șansă de </><Green>30%</> <Yellow>de a Ameți ținta.</>\"\n\n#. Key:\tRuneStoneLightningWalk_level_up_desc_2\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneLightningWalk.RuneStoneLightningWalk.LevelUpBasedDescOverride(2).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneLightningWalk.RuneStoneLightningWalk.LevelUpBasedDescOverride(2).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Grants the shocking ability to walk through your enemies for <Green>4</> sec. The shock causes <Blue>32</> damage and has a <Green>30%</> <YellowH>(→40%)</> chance to <Yellow>stun</> the target.\"\nmsgstr \"Oferă abilitatea șocantă de a merge prin inamici pentru <Green>4</> secunde. Șocul cauzează <Blue>32</> daune și are o șansă de <Green>30%</><YellowH>(→40%)</> de a <Yellow>Ameți</> ținta.\"\n\n#. Key:\tRuneStoneLightningWalk_name\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneLightningWalk.RuneStoneLightningWalk.Name\n#: /Game/SO/Items/RuneStones/RuneStoneLightningWalk.RuneStoneLightningWalk.Name\nmsgctxt \"ItemData\"\nmsgid \"Lightningstone\"\nmsgstr \"Piatra Fulgerului\"\n\n#. Key:\tRuneStoneMagicMissle_desc\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMagicMissle.RuneStoneMagicMissle.Description\n#: /Game/SO/Items/RuneStones/RuneStoneMagicMissle.RuneStoneMagicMissle.Description\nmsgctxt \"ItemData\"\nmsgid \"Summons a homing projectile targeted at a close foe - prefers flying targets.\"\nmsgstr \"Invocă un proiectil care vizează un inamic apropiat - preferă țintele în zbor.\"\n\n#. Key:\tRuneStoneMagicMissle_level_desc_0\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMagicMissle.RuneStoneMagicMissle.LevelBasedDescOverride(0).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneMagicMissle.RuneStoneMagicMissle.LevelBasedDescOverride(0).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons <Green>1</> homing projectile targeted at a close foe - prefers flying targets. Causes <Blue>16</> damage on impact.\"\nmsgstr \"Cheamă <Green>1</> proiectil țintit la inamicul cel mai aproape - preferă țintele zburătoare. Cauzează <Blue>16</> daune la impact.\"\n\n#. Key:\tRuneStoneMagicMissle_level_desc_1\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMagicMissle.RuneStoneMagicMissle.LevelBasedDescOverride(1).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneMagicMissle.RuneStoneMagicMissle.LevelBasedDescOverride(1).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons <Green>2</> homing projectile targeted at a close foe - prefers flying targets. Each projectile causes <Blue>16</> damage on impact.\"\nmsgstr \"Cheamă <Green>2</> proiectile țintite la inamicul cel mai aproape - preferă țintele zburătoare. Fiecare proiectil cauzează <Blue>16</> daune la impact.\"\n\n#. Key:\tRuneStoneMagicMissle_level_desc_2\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMagicMissle.RuneStoneMagicMissle.LevelBasedDescOverride(2).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneMagicMissle.RuneStoneMagicMissle.LevelBasedDescOverride(2).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons <Green>3</> homing projectile targeted at a close foe - prefers flying targets. Each projectile causes <Blue>16</> damage and applies <Orange>Slow</> on impact.\"\nmsgstr \"Cheamă <Green>3</> proiectile țintite la inamicul cel mai aproape - preferă țintele zburătoare. Fiecare proiectil cauzează <Blue>16</> daune și aplică <Orange>Încetinire</> la impact.\"\n\n#. Key:\tRuneStoneMagicMissle_level_desc_3\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMagicMissle.RuneStoneMagicMissle.LevelBasedDescOverride(3).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneMagicMissle.RuneStoneMagicMissle.LevelBasedDescOverride(3).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons <Green>4</> homing projectile targeted at a close foe - prefers flying targets. Each projectile causes <Blue>16</> damage and applies <Orange>Slow</> on impact.\"\nmsgstr \"Cheamă <Green>4</> proiectile țintite la inamicul cel mai aproape - preferă țintele zburătoare. Fiecare proiectil cauzează <Blue>16</> daune și aplică <Orange>Încetinire</> la impact.\"\n\n#. Key:\tRuneStoneMagicMissle_level_up_desc_0\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMagicMissle.RuneStoneMagicMissle.LevelUpBasedDescOverride(0).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneMagicMissle.RuneStoneMagicMissle.LevelUpBasedDescOverride(0).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons <Green>1</><YellowH>(→2)</> homing projectile targeted at a close foe - prefers flying targets. Each projectile causes <Blue>16</> damage on impact.\"\nmsgstr \"Cheamă <Green>1</><YellowH>(→2)</> proiectil țintit la inamicul cel mai aproape - preferă țintele zburătoare. Fiecare proiect cauzează <Blue>16</> daune la impact.\"\n\n#. Key:\tRuneStoneMagicMissle_level_up_desc_1\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMagicMissle.RuneStoneMagicMissle.LevelUpBasedDescOverride(1).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneMagicMissle.RuneStoneMagicMissle.LevelUpBasedDescOverride(1).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons <Green>2</><YellowH>(→3)</> homing projectile targeted at a close foe - prefers flying targets. Each projectile causes <Blue>16</> damage <YellowH>and applies</> <OrangeH>Slow</> on impact.\"\nmsgstr \"Cheamă <Green>2</><YellowH>(→3)</> proiectile țintite la inamicul cel mai aproape - preferă țintele zburătoare. Fiecare proiectil cauzează <Blue>16</> daune <YellowH>și aplică</> <Orange>Încetinire</> la impact.\"\n\n#. Key:\tRuneStoneMagicMissle_level_up_desc_2\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMagicMissle.RuneStoneMagicMissle.LevelUpBasedDescOverride(2).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneMagicMissle.RuneStoneMagicMissle.LevelUpBasedDescOverride(2).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons <Green>3</><YellowH>(→4)</> homing projectile targeted at a close foe - prefers flying targets. Each projectile causes <Blue>16</> damage and applies <Orange>Slow</> on impact.\"\nmsgstr \"Cheamă <Green>3</><YellowH>(→4)</> proiectile țintite la inamicul cel mai aproape - preferă țintele zburătoare. Fiecare proiectil cauzează <Blue>16</> daune și aplică <Orange>Încetinire</> la impact.\"\n\n#. Key:\tRuneStoneMagicMissle_name\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMagicMissle.RuneStoneMagicMissle.Name\n#: /Game/SO/Items/RuneStones/RuneStoneMagicMissle.RuneStoneMagicMissle.Name\nmsgctxt \"ItemData\"\nmsgid \"Tealstone\"\nmsgstr \"Piatra de Turcoaz\"\n\n#. Key:\tRuneStoneMassMagicMissle_desc\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMassMagicMissle.RuneStoneMassMagicMissle.Description\n#. Key:\tRuneStoneMassMagicMissle_level_desc_0\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMassMagicMissle.RuneStoneMassMagicMissle.LevelBasedDescOverride(0).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneMassMagicMissle.RuneStoneMassMagicMissle.Description\n#: /Game/SO/Items/RuneStones/RuneStoneMassMagicMissle.RuneStoneMassMagicMissle.LevelBasedDescOverride(0).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons a homing projectile for each nearby enemy, causing <Blue>20</> damage on impact.\"\nmsgstr \"Cheamă un proiectil țintit către fiecare inamic apropiat, cauzează <Blue>20</> daune la impact.\"\n\n#. Key:\tRuneStoneMassMagicMissle_level_desc_1\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMassMagicMissle.RuneStoneMassMagicMissle.LevelBasedDescOverride(1).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneMassMagicMissle.RuneStoneMassMagicMissle.LevelBasedDescOverride(1).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons a homing projectile for each nearby enemy, causing <Blue>40</> damage on impact.\"\nmsgstr \"Cheamă un proiectil țintit către fiecare inamic apropiat, cauzează <Blue>40</> daune la impact.\"\n\n#. Key:\tRuneStoneMassMagicMissle_level_desc_2\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMassMagicMissle.RuneStoneMassMagicMissle.LevelBasedDescOverride(2).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneMassMagicMissle.RuneStoneMassMagicMissle.LevelBasedDescOverride(2).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons a homing projectile for each nearby enemy, causing <Blue>50</> damage on impact. The target has a <Green>30%</> chance to become <Orange>Slow</>.\"\nmsgstr \"Cheamă un proiectil țintit către fiecare inamic apropiat, cauzează <Blue>50</> daune la impact. Ținta are o șansă de <Green>30%</> să devină <Orange>Încetinită</>.\"\n\n#. Key:\tRuneStoneMassMagicMissle_level_up_desc_0\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMassMagicMissle.RuneStoneMassMagicMissle.LevelUpBasedDescOverride(0).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneMassMagicMissle.RuneStoneMassMagicMissle.LevelUpBasedDescOverride(0).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons a homing projectile for each nearby enemy, causing <Blue>20</><YellowH>(→40)</> damage on impact.\"\nmsgstr \"Cheamă un proiectil țintit către fiecare inamic apropiat, cauzează <Blue>20</><YellowH>(→40)</> daune la impact.\"\n\n#. Key:\tRuneStoneMassMagicMissle_level_up_desc_1\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMassMagicMissle.RuneStoneMassMagicMissle.LevelUpBasedDescOverride(1).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneMassMagicMissle.RuneStoneMassMagicMissle.LevelUpBasedDescOverride(1).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons a homing projectile for each nearby enemy, causing <Blue>20</><YellowH>(→50)</> damage on impact. <YellowH>The target has a</> <GreenH>30%</> <YellowH>chance to become</> <Orange>Slow</>.\"\nmsgstr \"Cheamă un proiectil țintit către fiecare inamic apropiat, cauzează <Blue>20</><YellowH>(→50)</> daune la impact. <YellowH>Ținta are o șansă de</> <Green>30%</> <YellowH>să devină</> <Orange>Încetinită</>.\"\n\n#. Key:\tRuneStoneMassMagicMissle_name\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMassMagicMissle.RuneStoneMassMagicMissle.Name\n#: /Game/SO/Items/RuneStones/RuneStoneMassMagicMissle.RuneStoneMassMagicMissle.Name\nmsgctxt \"ItemData\"\nmsgid \"Tealstone, but better\"\nmsgstr \"Piatra de turcoaz, dar mai bună\"\n\n#. Key:\tRuneStoneMassSlow_desc\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMassSlow.RuneStoneMassSlow.Description\n#: /Game/SO/Items/RuneStones/RuneStoneMassSlow.RuneStoneMassSlow.Description\nmsgctxt \"ItemData\"\nmsgid \"Slows all enemy targets around the caster.\"\nmsgstr \"Încetinește toate țintele inamice din jurul tău.\"\n\n#. Key:\tRuneStoneMassSlow_level_desc_0\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMassSlow.RuneStoneMassSlow.LevelBasedDescOverride(0).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneMassSlow.RuneStoneMassSlow.LevelBasedDescOverride(0).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"All enemy target becomes <Orange>Slow</> for <Green>3</> seconds.\"\nmsgstr \"Toate țintele inamice devin <Orange>Încete</> timp de <Green>3</> secunde.\"\n\n#. Key:\tRuneStoneMassSlow_name\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMassSlow.RuneStoneMassSlow.Name\n#: /Game/SO/Items/RuneStones/RuneStoneMassSlow.RuneStoneMassSlow.Name\nmsgctxt \"ItemData\"\nmsgid \"Slowstone\"\nmsgstr \"Piatra Lentă\"\n\n#. Key:\tRuneStoneMeteorShower_desc\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMeteorShower.RuneStoneMeteorShower.Description\n#: /Game/SO/Items/RuneStones/RuneStoneMeteorShower.RuneStoneMeteorShower.Description\nmsgctxt \"ItemData\"\nmsgid \"Summons 12 deadly meteors around the caster, each causing 16 damage on impact.\"\nmsgstr \"Cheamă 12 meteori mortali în jurul vrăjitorului, fiecare cauzând 16 daune la impact.\"\n\n#. Key:\tRuneStoneMeteorShower_level_desc_0\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMeteorShower.RuneStoneMeteorShower.LevelBasedDescOverride(0).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneMeteorShower.RuneStoneMeteorShower.LevelBasedDescOverride(0).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons <Green>12</> deadly meteors around the caster, each causing <White>16</> damage on impact.\"\nmsgstr \"Cheamă <Green>12</> meteoriți mortali in jurul tău, fiecare cauzează <White>16</> daune la impact.\"\n\n#. Key:\tRuneStoneMeteorShower_level_desc_1\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMeteorShower.RuneStoneMeteorShower.LevelBasedDescOverride(1).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneMeteorShower.RuneStoneMeteorShower.LevelBasedDescOverride(1).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons <Green>16</> deadly meteors around the caster, each causing <White>24</> damage on impact.\"\nmsgstr \"Cheamă <Green>16</> meteoriți mortali in jurul tău, fiecare cauzează <White>24</> daune la impact.\"\n\n#. Key:\tRuneStoneMeteorShower_level_desc_2\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMeteorShower.RuneStoneMeteorShower.LevelBasedDescOverride(2).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneMeteorShower.RuneStoneMeteorShower.LevelBasedDescOverride(2).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons <Green>20</> deadly meteors around the caster, each causing <White>32</> damage on impact. Each meteor has a <Green>30%</> chance to <Yellow>Stun</> the target.\"\nmsgstr \"Cheamă <Green>20</> meteoriți mortali in jurul tău, fiecare cauzează <White>32</> daune la impact. Fiecare meteorit are o șansă de <Green>30%</> să <Yellow>Încetinească</> ținta.\"\n\n#. Key:\tRuneStoneMeteorShower_level_up_desc_0\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMeteorShower.RuneStoneMeteorShower.LevelUpBasedDescOverride(0).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneMeteorShower.RuneStoneMeteorShower.LevelUpBasedDescOverride(0).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons <Green>12</><YellowH>(→16)</> deadly meteors around the caster, each causing <White>16</><YellowH>(→24)</> damage on impact.\"\nmsgstr \"Cheamă <Green>12</><YellowH>(→16)</> meteoriți mortali in jurul tău, fiecare cauzează <White>16</><YellowH>(→24)</> daune la impact.\"\n\n#. Key:\tRuneStoneMeteorShower_level_up_desc_1\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMeteorShower.RuneStoneMeteorShower.LevelUpBasedDescOverride(1).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneMeteorShower.RuneStoneMeteorShower.LevelUpBasedDescOverride(1).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons <Green>16</><YellowH>(→20)</> deadly meteors around the caster, each causing <White>24</><YellowH>(→32)</> damage on impact. <YellowH>Each meteor has a</> <GreenH>30%</> <YellowH>chance to Stun the target.</>\"\nmsgstr \"Cheamă <Green>20</><YellowH>(→20)</> meteoriți mortali in jurul tău, fiecare cauzează <White>24</><YellowH>(→32)</> daune la impact. <YellowH>Fiecare meteorit are o șansă de</> <Green>30%</> <Yellow>să Încetinească ținta.</>\"\n\n#. Key:\tRuneStoneMeteorShower_name\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMeteorShower.RuneStoneMeteorShower.Name\n#: /Game/SO/Items/RuneStones/RuneStoneMeteorShower.RuneStoneMeteorShower.Name\nmsgctxt \"ItemData\"\nmsgid \"Meteorstone\"\nmsgstr \"Piatra Meteoritului\"\n\n#. Key:\tRuneStoneShadowWalk_desc\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneShadowWalk.RuneStoneShadowWalk.Description\n#. Key:\tRuneStoneShadowWalk_level_desc_0\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneShadowWalk.RuneStoneShadowWalk.LevelBasedDescOverride(0).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneShadowWalk.RuneStoneShadowWalk.Description\n#: /Game/SO/Items/RuneStones/RuneStoneShadowWalk.RuneStoneShadowWalk.LevelBasedDescOverride(0).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Grants the ability to walk through your enemies for <Green>2</> seconds.\"\nmsgstr \"Acordă capacitatea de a merge prin inamici timp de <Green>2</> secunde.\"\n\n#. Key:\tRuneStoneShadowWalk_level_desc_1\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneShadowWalk.RuneStoneShadowWalk.LevelBasedDescOverride(1).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneShadowWalk.RuneStoneShadowWalk.LevelBasedDescOverride(1).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Grants the ability to walk through your enemies for <Green>4</> seconds.\"\nmsgstr \"Acordă capacitatea de a merge prin inamici timp de <Green>4</> secunde.\"\n\n#. Key:\tRuneStoneShadowWalk_level_desc_2\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneShadowWalk.RuneStoneShadowWalk.LevelBasedDescOverride(2).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneShadowWalk.RuneStoneShadowWalk.LevelBasedDescOverride(2).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Grants the ability to walk through your enemies for <Green>4</> seconds. Your magical resistance is increased by <Green>0.2.</>\"\nmsgstr \"Acordă capacitatea de a merge prin inamici timp de <Green>4</> secunde. Rezistența magică este crescută cu <Green>0.2.</>\"\n\n#. Key:\tRuneStoneShadowWalk_level_desc_3\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneShadowWalk.RuneStoneShadowWalk.LevelBasedDescOverride(3).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneShadowWalk.RuneStoneShadowWalk.LevelBasedDescOverride(3).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Grants the ability to walk through your enemies for <Green>5</> seconds. Your magical resistance is increased by <Green>0.3.</>\"\nmsgstr \"Acordă capacitatea de a merge prin inamici timp de <Green>5</> secunde. Rezistența magică este crescută cu <Green>0.3.</>\"\n\n#. Key:\tRuneStoneShadowWalk_level_up_desc_0\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneShadowWalk.RuneStoneShadowWalk.LevelUpBasedDescOverride(0).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneShadowWalk.RuneStoneShadowWalk.LevelUpBasedDescOverride(0).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Grants the ability to walk through your enemies for <Green>2</> <YellowH>(→4)</> seconds.\"\nmsgstr \"Acordă capacitatea de a merge prin inamici timp de <Green>2</> <YellowH>(→4)</> secunde.\"\n\n#. Key:\tRuneStoneShadowWalk_level_up_desc_1\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneShadowWalk.RuneStoneShadowWalk.LevelUpBasedDescOverride(1).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneShadowWalk.RuneStoneShadowWalk.LevelUpBasedDescOverride(1).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Grants the ability to walk through your enemies for <Green>4</> seconds. <YellowH>Your magical resistance is increased by</> <GreenH>0.2.</>\"\nmsgstr \"Acordă capacitatea de a merge prin inamici timp de <Green>4</> secunde. <YellowH> Rezistența magică este crescută cu</> <Green>0.2.</>\"\n\n#. Key:\tRuneStoneShadowWalk_level_up_desc_2\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneShadowWalk.RuneStoneShadowWalk.LevelUpBasedDescOverride(2).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneShadowWalk.RuneStoneShadowWalk.LevelUpBasedDescOverride(2).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Grants the ability to walk through your enemies for <Green>4</> <YellowH>(→5)</> seconds. Your magical resistance is increased by <Green>0.2</> <YellowH>(→0.3).</>\"\nmsgstr \"Acordă capacitatea de a merge prin inamici timp de <Green>4</> <YellowH>(→5)</> secunde. Rezistența magică este crescută cu <Green>0.2</> <YellowH>(→0.3).</>\"\n\n#. Key:\tRuneStoneShadowWalk_name\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneShadowWalk.RuneStoneShadowWalk.Name\n#: /Game/SO/Items/RuneStones/RuneStoneShadowWalk.RuneStoneShadowWalk.Name\nmsgctxt \"ItemData\"\nmsgid \"Shadestone\"\nmsgstr \"Piatră de Umbră\"\n\n#. Key:\tRuneStoneSoulkeeper_desc\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneSoulkeeper.RuneStoneSoulkeeper.Description\n#: /Game/SO/Items/RuneStones/RuneStoneSoulkeeper.RuneStoneSoulkeeper.Description\nmsgctxt \"ItemData\"\nmsgid \"Summons the Soulkeeper, a powerful spirit capable of gathering your essence should something bad happen to you.\\r\\n\\r\\nReleasing the spirit recharges the stone.\"\nmsgstr \"Convocă Deținătorul Sufletului - un spirit puternic capabil să îți adune esența în cazul în care ți se întâmplă ceva rău - este mai puțin dureros decât să fii chemat înapoi de vrăjitor.\\n\\nEliberarea spiritului reîncarcă piatra, reîncărcarea pietrei eliberează spiritul.\"\n\n#. Key:\tRuneStoneSoulkeeper_name\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneSoulkeeper.RuneStoneSoulkeeper.Name\n#: /Game/SO/Items/RuneStones/RuneStoneSoulkeeper.RuneStoneSoulkeeper.Name\nmsgctxt \"ItemData\"\nmsgid \"Soulstone\"\nmsgstr \"Piatra Sufletului\"\n\n#. Key:\tRuneStoneSoulkeeperInfinite_desc\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneSoulkeeperInfinite.RuneStoneSoulkeeperInfinite.Description\n#: /Game/SO/Items/RuneStones/RuneStoneSoulkeeperInfinite.RuneStoneSoulkeeperInfinite.Description\nmsgctxt \"ItemData\"\nmsgid \"Summons the Soulkeeper, a powerful spirit capable of gathering your essence should something bad happen to you.\"\nmsgstr \"Convocă Deținătorul Sufletului - un spirit puternic capabil să îți adune esența în cazul în care ți se întâmplă ceva rău - este mai puțin dureros decât să fii chemat înapoi de vrăjitor.\"\n\n#. Key:\tRuneStoneSoulkeeperInfinite_name\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneSoulkeeperInfinite.RuneStoneSoulkeeperInfinite.Name\n#: /Game/SO/Items/RuneStones/RuneStoneSoulkeeperInfinite.RuneStoneSoulkeeperInfinite.Name\nmsgctxt \"ItemData\"\nmsgid \"Elite Soulstone\"\nmsgstr \"Piatra de Elită al Sufletului\"\n\n#. Key:\tRuneStoneSpellRegain_desc\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneSpellRegain.RuneStoneSpellRegain.Description\n#: /Game/SO/Items/RuneStones/RuneStoneSpellRegain.RuneStoneSpellRegain.Description\nmsgctxt \"ItemData\"\nmsgid \"Regenerates all other spell charges.\"\nmsgstr \"Regenerează toate încărcările de vrajă.\"\n\n#. Key:\tRuneStoneSpellRegain_name\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneSpellRegain.RuneStoneSpellRegain.Name\n#: /Game/SO/Items/RuneStones/RuneStoneSpellRegain.RuneStoneSpellRegain.Name\nmsgctxt \"ItemData\"\nmsgid \"Spiritstone\"\nmsgstr \"Piatra Spiritului\"\n\n#. Key:\tRuneStoneSwap_desc\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.Description\n#. Key:\tRuneStoneSwap_level_desc_0\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.LevelBasedDescOverride(0).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.Description\n#: /Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.LevelBasedDescOverride(0).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Swaps the position of the caster with the closest target in front of him/her/it.\"\nmsgstr \"Schimbă poziția cu cea mai apropiată țintă din fața ta.\"\n\n#. Key:\tRuneStoneSwap_level_desc_1\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.LevelBasedDescOverride(1).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.LevelBasedDescOverride(1).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Swaps the position of the caster with the closest target in front of him/her/it. The selected target suffers <Blue>20</> damage.\"\nmsgstr \"Schimbă poziția cu cea mai apropiată țintă din fața ta. Ținta selectată suferă <Blue>20</> daune.\"\n\n#. Key:\tRuneStoneSwap_level_desc_2\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.LevelBasedDescOverride(2).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.LevelBasedDescOverride(2).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Swaps the position of the caster with the closest target in front of him/her/it. The selected target suffers <Blue>30</> damage and becomes <Orange>Slow</>.\"\nmsgstr \"Schimbă poziția cu cea mai apropiată țintă din fața ta. Ținta selectată suferă <Blue>30</> daune și devine <Orange>Înceată</>.\"\n\n#. Key:\tRuneStoneSwap_level_desc_3\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.LevelBasedDescOverride(3).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.LevelBasedDescOverride(3).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Swaps the position of the caster with the closest target in front of him/her/it. The selected target suffers <Blue>40</> damage and becomes <Orange>Slow</>.\"\nmsgstr \"Schimbă poziția cu cea mai apropiată țintă din fața ta. Ținta selectată suferă <Blue>40</> daune și devine <Orange>Înceată</>.\"\n\n#. Key:\tRuneStoneSwap_level_desc_4\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.LevelBasedDescOverride(4).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.LevelBasedDescOverride(4).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Swaps the position of the caster with the closest target in front of him/her/it. The selected target suffers <Blue>50</> damage and becomes <Orange>Slow</>.\"\nmsgstr \"Schimbă poziția cu cea mai apropiată țintă din fața ta. Ținta selectată suferă <Blue>50</> daune și devine <Orange>Înceată</>.\"\n\n#. Key:\tRuneStoneSwap_level_up_desc_0\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.LevelUpBasedDescOverride(0).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.LevelUpBasedDescOverride(0).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Swaps the position of the caster with the closest target in front of him/her/it. <YellowH>The selected target suffers</> <BlueH>20</> <YellowH>damage.</>\"\nmsgstr \"Schimbă poziția cu cea mai apropiată țintă din fața ta. <YellowH>Ținta selectată suferă</> <Blue>20</> <YellowH>daune.</>\"\n\n#. Key:\tRuneStoneSwap_level_up_desc_1\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.LevelUpBasedDescOverride(1).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.LevelUpBasedDescOverride(1).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Swaps the position of the caster with the closest target in front of him/her/it. The selected target suffers <Blue>20</><YellowH>(→30)</> damage <YellowH>and becomes </><Orange>Slow.</>\"\nmsgstr \"Schimbă poziția cu cea mai apropiată țintă din fața ta. Ținta selectată suferă <Blue>20</><YellowH>(→30)</> daune <YellowH>și devine</> <Orange>Înceată.</>\"\n\n#. Key:\tRuneStoneSwap_level_up_desc_2\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.LevelUpBasedDescOverride(2).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.LevelUpBasedDescOverride(2).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Swaps the position of the caster with the closest target in front of him/her/it. The selected target suffers <Blue>30</><YellowH>(→40)</> damage and becomes <Orange>Slow.</>\"\nmsgstr \"Schimbă poziția cu cea mai apropiată țintă din fața ta. Ținta selectată suferă <Blue>30</><YellowH>(→40)</> daune și devine <Orange>Înceată.</>\"\n\n#. Key:\tRuneStoneSwap_level_up_desc_3\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.LevelUpBasedDescOverride(3).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.LevelUpBasedDescOverride(3).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Swaps the position of the caster with the closest target in front of him/her/it. The selected target suffers <Blue>40</><YellowH>(→50)</> damage and becomes <Orange>Slow.</>\"\nmsgstr \"Schimbă poziția cu cea mai apropiată țintă din fața ta. Ținta selectată suferă <Blue>40</><YellowH>(→50)</> daune și devine <Orange>Înceată.</>\"\n\n#. Key:\tRuneStoneSwap_name\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.Name\n#: /Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.Name\nmsgctxt \"ItemData\"\nmsgid \"Swapstone\"\nmsgstr \"Piatra Schimbării\"\n\n#. Key:\tRuneStoneWeaponFlame_desc\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.Description\n#: /Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.Description\nmsgctxt \"ItemData\"\nmsgid \"Enchants your active weapon with green flames - it causes an additional 0.3x damage for 4 seconds.\"\nmsgstr \"Farmecă arma activă cu o flacără verde - cauzează 0.3x daune adiționale pentru 4 secunde.\"\n\n#. Key:\tRuneStoneWeaponFlame_level_desc_0\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.LevelBasedDescOverride(0).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.LevelBasedDescOverride(0).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Enchants your active weapon - it causes an additional <Green>0.5x</> damage for <Green>5</> seconds.\"\nmsgstr \"Farmecă arma activă - cauzează <Green>0.5x</> daune adiționale pentru <Green>5</> secunde.\"\n\n#. Key:\tRuneStoneWeaponFlame_level_desc_1\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.LevelBasedDescOverride(1).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.LevelBasedDescOverride(1).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Enchants your active weapon - it causes an additional <Green>0.6x</> damage for <Green>5</> seconds. Each strike has a <Green>15%</> chance to apply <DarkGreen>Poison</>, causing an additional <Blue>18</> damage over <Green>6</> seconds.\"\nmsgstr \"Farmecă arma activă - cauzează <Green>0.6x</> daune adiționale pentru <Green>5</> secunde. Fiecare lovitură are o șansă de <Green>15%</> să aplice <DarkGreen>Otravă</>, cauzând <Blue>18</> daune adiționale timp de <Green>6</> secunde.\"\n\n#. Key:\tRuneStoneWeaponFlame_level_desc_2\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.LevelBasedDescOverride(2).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.LevelBasedDescOverride(2).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Enchants your active weapon - it causes an additional <Green>0.7x</> damage for <Green>6</> seconds. Each strike has a <Green>20%</> chance to apply <DarkGreen>Poison</>, causing an additional <Blue>24</> damage over <Green>6</> seconds.\"\nmsgstr \"Farmecă arma activă - cauzează <Green>0.7x</> daune adiționale pentru <Green>6</> secunde. Fiecare lovitură are o șansă de <Green>20%</> să aplice <DarkGreen>Otravă</>, cauzând <Blue>24</> daune adiționale timp de <Green>6</> secunde.\"\n\n#. Key:\tRuneStoneWeaponFlame_level_desc_3\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.LevelBasedDescOverride(3).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.LevelBasedDescOverride(3).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Enchants your active weapon - it causes an additional <Green>0.8x</> damage for <Green>6</> seconds. Each strike has a <Green>25%</> chance to apply <DarkGreen>Poison</>, causing an additional <Blue>30</> damage over <Green>6</> seconds.\"\nmsgstr \"Farmecă arma activă - cauzează <Green>0.8x</> daune adiționale pentru <Green>6</> secunde. Fiecare lovitură are o șansă de <Green>25%</> să aplice <DarkGreen>Otravă</>, cauzând <Blue>30</> daune adiționale timp de <Green>6</> secunde.\"\n\n#. Key:\tRuneStoneWeaponFlame_level_desc_4\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.LevelBasedDescOverride(4).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.LevelBasedDescOverride(4).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Enchants your active weapon - it causes an additional <Green>0.9x</> damage for <Green>6</> seconds. Each strike has a <Green>30%</> chance to apply <DarkGreen>Poison</>, causing an additional <Blue>36</> damage over <Green>6</> seconds.\"\nmsgstr \"Farmecă arma activă - cauzează <Green>0.9x</> daune adiționale pentru <Green>6</> secunde. Fiecare lovitură are o șansă de <Green>30%</> să aplice <DarkGreen>Otravă</>, cauzând <Blue>36</> daune adiționale timp de <Green>6</> secunde.\"\n\n#. Key:\tRuneStoneWeaponFlame_level_up_desc_0\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.LevelUpBasedDescOverride(0).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.LevelUpBasedDescOverride(0).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Enchants your active weapon - it causes an additional <Green>0.5x</><YellowH>(→0.6x)</> damage for <Green>5</> seconds. <YellowH>Each strike has a</> <GreenH>15%</> <YellowH>chance to apply </><DarkGreenH>Poison</><YellowH>, causing an additional</> <BlueH>18</> <YellowH>damage over</> <GreenH>6</> <YellowH>seconds.</>\"\nmsgstr \"Farmecă arma activă - cauzează <Green>0.5x</><YellowH>(→0.6x)</> daune adiționale pentru <Green>5</> secunde. <YellowH>Fiecare lovitură are o șansă de</> <Green>15%</> <YellowH>să aplice</> <DarkGreen>Otravă</>, <YellowH>cauzând</> <Blue>18</> <YellowH>daune adiționale timp de</> <Green>6</> <YellowH>secunde.</>\"\n\n#. Key:\tRuneStoneWeaponFlame_level_up_desc_1\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.LevelUpBasedDescOverride(1).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.LevelUpBasedDescOverride(1).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Enchants your active weapon - it causes an additional <Green>0.6x</><YellowH>(→0.7x)</> damage for <Green>5</><YellowH>(→6)</> seconds. Each strike has a <Green>15%</><YellowH>(→20%)</> chance to apply <DarkGreen>Poison</>, causing an additional <Blue>18</><YellowH>(→24)</> damage over <Green>6</> seconds.\"\nmsgstr \"Farmecă arma activă - cauzează <Green>0.6x</><YellowH>(→0.7x)</> daune adiționale pentru <Green>5</><YellowH>(→6)</> secunde. Fiecare lovitură are o șansă de <Green>15%</><YellowH>(→20%)</> să aplice <DarkGreen>Otravă</>, cauzând <Blue>18</><YellowH>(→24)</> daune adiționale timp de <Green>6</> secunde.\"\n\n#. Key:\tRuneStoneWeaponFlame_level_up_desc_2\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.LevelUpBasedDescOverride(2).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.LevelUpBasedDescOverride(2).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Enchants your active weapon - it causes an additional <Green>0.7x</><YellowH>(→0.8x)</> damage for <Green>6</> seconds. Each strike has a <Green>20%</><YellowH>(→25%)</> chance to apply <DarkGreen>Poison</>, causing an additional <Blue>24</><YellowH>(→30)</> damage over <Green>6</> seconds.\"\nmsgstr \"Farmecă arma activă - cauzează <Green>0.7x</><YellowH>(→0.8x)</> daune adiționale pentru <Green>6</> secunde. Fiecare lovitură are o șansă de <Green>20%</><YellowH>(→25%)</> să aplice <DarkGreen>Otravă</>, cauzând <Blue>24</><YellowH>(→30)</> daune adiționale timp de <Green>6</> secunde.\"\n\n#. Key:\tRuneStoneWeaponFlame_level_up_desc_3\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.LevelUpBasedDescOverride(3).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.LevelUpBasedDescOverride(3).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Enchants your active weapon - it causes an additional <Green>0.8x</><YellowH>(→0.9x)</> damage for <Green>6</> seconds. Each strike has a <Green>25%</><YellowH>(→30%)</> chance to apply <DarkGreen>Poison</>, causing an additional <Blue>30</><YellowH>(→36)</> damage over <Green>6</> seconds.\"\nmsgstr \"Farmecă arma activă - cauzează <Green>0.8x</><YellowH>(→0.9x)</> daune adiționale pentru <Green>6</> secunde. Fiecare lovitură are o șansă de <Green>25%</><YellowH>(→30%)</> să aplice <DarkGreen>Otravă</>, cauzând <Blue>30</><YellowH>(→36)</> daune adiționale timp de <Green>6</> secunde.\"\n\n#. Key:\tRuneStoneWeaponFlame_name\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.Name\n#: /Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.Name\nmsgctxt \"ItemData\"\nmsgid \"Green Flamestone\"\nmsgstr \"Piatra Verde de Flacără\"\n\n#. Key:\tSabre_desc\n#. SourceLocation:\t/Game/SO/Items/Weapons/Sabre.Sabre.Description\n#: /Game/SO/Items/Weapons/Sabre.Sabre.Description\nmsgctxt \"ItemData\"\nmsgid \"Rangol was a legendary blacksmith who practiced his crafting art for a hundred years. This sabre was made on day one.\"\nmsgstr \"Rangol a fost un fierar legendar care și-a practicat arta meșteșugărească timp de o sută de ani. Această sabie a fost realizat în prima zi.\"\n\n#. Key:\tSabre_name\n#. SourceLocation:\t/Game/SO/Items/Weapons/Sabre.Sabre.Name\n#: /Game/SO/Items/Weapons/Sabre.Sabre.Name\nmsgctxt \"ItemData\"\nmsgid \"First Sabre of Rangol\"\nmsgstr \"Primul Paloș al lui Rangol\"\n\n#. Key:\tSecondChance_desc\n#. SourceLocation:\t/Game/SO/Items/RuneStones/SecondChance.SecondChance.Description\n#: /Game/SO/Items/RuneStones/SecondChance.SecondChance.Description\nmsgctxt \"ItemData\"\nmsgid \"Prevents death.\"\nmsgstr \"Previne moartea.\"\n\n#. Key:\tSecondChance_name\n#. SourceLocation:\t/Game/SO/Items/RuneStones/SecondChance.SecondChance.Name\n#: /Game/SO/Items/RuneStones/SecondChance.SecondChance.Name\nmsgctxt \"ItemData\"\nmsgid \"Chancestone\"\nmsgstr \"Piatra de Șanse\"\n\n#. Key:\tSecretWeirdDevice_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/SecretWeirdDevice.SecretWeirdDevice.Description\n#: /Game/SO/Items/QuestItems/SecretWeirdDevice.SecretWeirdDevice.Description\nmsgctxt \"ItemData\"\nmsgid \"A weird device, most likely one of the inventions of the Secret Science Society.\"\nmsgstr \"Un dispozitiv ciudat, cel mai probabil una dintre invențiile Societății de Știință Secretă.\"\n\n#. Key:\tSecretWeirdDevice_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/SecretWeirdDevice.SecretWeirdDevice.Name\n#: /Game/SO/Items/QuestItems/SecretWeirdDevice.SecretWeirdDevice.Name\nmsgctxt \"ItemData\"\nmsgid \"Weird Device\"\nmsgstr \"Dispozitiv Ciudat\"\n\n#. Key:\tShardAmber_desc\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardAmber.ShardAmber.Description\n#: /Game/SO/Items/Shards/ShardAmber.ShardAmber.Description\nmsgctxt \"ItemData\"\nmsgid \"Each melee strike has an additional <Yellow>10%</> chance to cause a critical hit, causing <Green>200%</> of your normal weapon damage.\"\nmsgstr \"Fiecare atac cu arme are o șansă în plus de <Yellow>10%</> să cauzeze un atac critic de <Green>200%</> din vătămarea normală a armei tale.\"\n\n#. Key:\tShardAmber_name\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardAmber.ShardAmber.Name\n#: /Game/SO/Items/Shards/ShardAmber.ShardAmber.Name\nmsgctxt \"ItemData\"\nmsgid \"Amber Shard\"\nmsgstr \"Ciob de Chihlimbar\"\n\n#. Key:\tShardAmberBright_desc\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardAmberBright.ShardAmberBright.Description\n#: /Game/SO/Items/Shards/ShardAmberBright.ShardAmberBright.Description\nmsgctxt \"ItemData\"\nmsgid \"Each melee strike has an additional <Yellow>20%</> chance to cause a critical hit, causing <Green>200%</> of your normal weapon damage.\"\nmsgstr \"Fiecare lovitură la corp are o șansă suplimentară de <Yellow>20%</> de a provoca o lovitură critică, provocând <Green>200%</> din atacul normal al armei.\"\n\n#. Key:\tShardAmberBright_name\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardAmberBright.ShardAmberBright.Name\n#: /Game/SO/Items/Shards/ShardAmberBright.ShardAmberBright.Name\nmsgctxt \"ItemData\"\nmsgid \"Bright Amber Shard\"\nmsgstr \"Ciob de Chihlimbar Strălucitor\"\n\n#. Key:\tShardAqua_desc\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardAqua.ShardAqua.Description\n#: /Game/SO/Items/Shards/ShardAqua.ShardAqua.Description\nmsgctxt \"ItemData\"\nmsgid \"Cooldown recharge speed is increased by <Blue>20%</>.\"\nmsgstr \"Viteza de reîncărcare este crescută cu <Blue>20%</>.\"\n\n#. Key:\tShardAqua_name\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardAqua.ShardAqua.Name\n#: /Game/SO/Items/Shards/ShardAqua.ShardAqua.Name\nmsgctxt \"ItemData\"\nmsgid \"Aqua Shard\"\nmsgstr \"Ciob Acvatic\"\n\n#. Key:\tShardAquaBright_desc\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardAquaBright.ShardAquaBright.Description\n#: /Game/SO/Items/Shards/ShardAquaBright.ShardAquaBright.Description\nmsgctxt \"ItemData\"\nmsgid \"Cooldown recharge speed is increased by <Blue>40%</>.\"\nmsgstr \"Viteza de reîncărcare este crescută cu <Blue>40%</>.\"\n\n#. Key:\tShardAquaBright_name\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardAquaBright.ShardAquaBright.Name\n#: /Game/SO/Items/Shards/ShardAquaBright.ShardAquaBright.Name\nmsgctxt \"ItemData\"\nmsgid \"Bright Aqua Shard\"\nmsgstr \"Ciob Acvatic Strălucitor\"\n\n#. Key:\tShardBlack_desc\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardBlack.ShardBlack.Description\n#: /Game/SO/Items/Shards/ShardBlack.ShardBlack.Description\nmsgctxt \"ItemData\"\nmsgid \"Every time an enemy hits you with a melee strike or overlaps you it is turned into a boot for a short time.\"\nmsgstr \"De fiecare dată când un inamic te lovește sau te suprapune, acesta este transformat într-o gheată pentru o scurtă perioadă de timp.\"\n\n#. Key:\tShardBlack_name\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardBlack.ShardBlack.Name\n#: /Game/SO/Items/Shards/ShardBlack.ShardBlack.Name\nmsgctxt \"ItemData\"\nmsgid \"Black Shard\"\nmsgstr \"Ciob Negru\"\n\n#. Key:\tShardBlue_desc\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardBlue.ShardBlue.Description\n#: /Game/SO/Items/Shards/ShardBlue.ShardBlue.Description\nmsgctxt \"ItemData\"\nmsgid \"Decreases the incoming <Blue>Magical Damage</> by <Blue>20%.</>\"\nmsgstr \"Scade <Blue>Daunele Magice</> primite cu <Blue>20%.</>\"\n\n#. Key:\tShardBlue_name\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardBlue.ShardBlue.Name\n#: /Game/SO/Items/Shards/ShardBlue.ShardBlue.Name\nmsgctxt \"ItemData\"\nmsgid \"Blue Shard\"\nmsgstr \"Ciob Albastru\"\n\n#. Key:\tShardBlueBright_desc\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardBlueBright.ShardBlueBright.Description\n#: /Game/SO/Items/Shards/ShardBlueBright.ShardBlueBright.Description\nmsgctxt \"ItemData\"\nmsgid \"Decreases the incoming <Blue>Magical Damage</> by <Blue>30%.</>\"\nmsgstr \"Descrește <Blue>Vătămarea Magică</> primită cu <Blue>30%.</>\"\n\n#. Key:\tShardBlueBright_name\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardBlueBright.ShardBlueBright.Name\n#: /Game/SO/Items/Shards/ShardBlueBright.ShardBlueBright.Name\nmsgctxt \"ItemData\"\nmsgid \"Bright Blue Shard\"\nmsgstr \"Ciob Albastru Strălucitor\"\n\n#. Key:\tShardGreen_desc\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardGreen.ShardGreen.Description\n#: /Game/SO/Items/Shards/ShardGreen.ShardGreen.Description\nmsgctxt \"ItemData\"\nmsgid \"Increases the attack speed by <Green>20%</>\"\nmsgstr \"Crește viteza de atac cu <Green>20%</>\"\n\n#. Key:\tShardGreen_name\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardGreen.ShardGreen.Name\n#: /Game/SO/Items/Shards/ShardGreen.ShardGreen.Name\nmsgctxt \"ItemData\"\nmsgid \"Green Shard\"\nmsgstr \"Ciob Verde\"\n\n#. Key:\tShardGreenBright_desc\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardGreenBright.ShardGreenBright.Description\n#: /Game/SO/Items/Shards/ShardGreenBright.ShardGreenBright.Description\nmsgctxt \"ItemData\"\nmsgid \"Increases the attack speed by <Green>30%</>\"\nmsgstr \"Crește viteza de atac cu <Green>30%</>\"\n\n#. Key:\tShardGreenBright_name\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardGreenBright.ShardGreenBright.Name\n#: /Game/SO/Items/Shards/ShardGreenBright.ShardGreenBright.Name\nmsgctxt \"ItemData\"\nmsgid \"Bright Green Shard\"\nmsgstr \"Ciob Verde Strălucitor\"\n\n#. Key:\tShardPurple_desc\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardPurple.ShardPurple.Description\n#: /Game/SO/Items/Shards/ShardPurple.ShardPurple.Description\nmsgctxt \"ItemData\"\nmsgid \"Each time you cast a charge based spell you have a <Purple>25%</> chance to regain the charge.\"\nmsgstr \"De fiecare dată când arunci o vrajă cu încărcare ai o șansă de <Purple>25%</> să obții o reîncărcare.\"\n\n#. Key:\tShardPurple_name\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardPurple.ShardPurple.Name\n#: /Game/SO/Items/Shards/ShardPurple.ShardPurple.Name\nmsgctxt \"ItemData\"\nmsgid \"Purple Shard\"\nmsgstr \"Ciob Violet\"\n\n#. Key:\tShardPurpleBright_desc\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardPurpleBright.ShardPurpleBright.Description\n#: /Game/SO/Items/Shards/ShardPurpleBright.ShardPurpleBright.Description\nmsgctxt \"ItemData\"\nmsgid \"Each time you cast a charge based spell you have a <Purple>50%</> chance to regain the charge.\"\nmsgstr \"De fiecare dată când arunci o vrajă cu încărcare ai o șansă de <Purple>50%</> să obții o reîncărcare.\"\n\n#. Key:\tShardPurpleBright_name\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardPurpleBright.ShardPurpleBright.Name\n#: /Game/SO/Items/Shards/ShardPurpleBright.ShardPurpleBright.Name\nmsgctxt \"ItemData\"\nmsgid \"Bright Purple Shard\"\nmsgstr \"Ciob Violet Strălucitor\"\n\n#. Key:\tShardRed_desc\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardRed.ShardRed.Description\n#: /Game/SO/Items/Shards/ShardRed.ShardRed.Description\nmsgctxt \"ItemData\"\nmsgid \"You heal <Red>5%</> of the melee damage you inflict on your enemies.\"\nmsgstr \"Te vindeci <Red>5%</> din daunele fizice provocate pe care le cauzezi inamicilor tăi.\"\n\n#. Key:\tShardRed_name\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardRed.ShardRed.Name\n#: /Game/SO/Items/Shards/ShardRed.ShardRed.Name\nmsgctxt \"ItemData\"\nmsgid \"Red Shard\"\nmsgstr \"Ciob Roșu\"\n\n#. Key:\tShardRedBright_desc\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardRedBright.ShardRedBright.Description\n#: /Game/SO/Items/Shards/ShardRedBright.ShardRedBright.Description\nmsgctxt \"ItemData\"\nmsgid \"You heal <Red>10%</> of the melee damage you inflict on your enemies.\"\nmsgstr \"Te vindeci <Red>10%</> din daunele fizice provocate pe care le cauzezi inamicilor tăi.\"\n\n#. Key:\tShardRedBright_name\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardRedBright.ShardRedBright.Name\n#: /Game/SO/Items/Shards/ShardRedBright.ShardRedBright.Name\nmsgctxt \"ItemData\"\nmsgid \"Bright Red Shard\"\nmsgstr \"Ciob Roșu Strălucitor\"\n\n#. Key:\tShardSilver_desc\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardSilver.ShardSilver.Description\n#: /Game/SO/Items/Shards/ShardSilver.ShardSilver.Description\nmsgctxt \"ItemData\"\nmsgid \"Decreases the incoming <White>Physical Damage</> by <White>20%.</>\"\nmsgstr \"Diminuează <White>Daunele Fizice</> cu <White>20%.</>\"\n\n#. Key:\tShardSilver_name\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardSilver.ShardSilver.Name\n#: /Game/SO/Items/Shards/ShardSilver.ShardSilver.Name\nmsgctxt \"ItemData\"\nmsgid \"Silver Shard\"\nmsgstr \"Ciob Argintiu\"\n\n#. Key:\tShardSilverBright_desc\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardSilverBright.ShardSilverBright.Description\n#: /Game/SO/Items/Shards/ShardSilverBright.ShardSilverBright.Description\nmsgctxt \"ItemData\"\nmsgid \"Decreases the incoming <White>Physical Damage</> by <White>30%.</>\"\nmsgstr \"Descrește <White>Vătămarea Fizică</> primită cu <White>30%.</>\"\n\n#. Key:\tShardSilverBright_name\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardSilverBright.ShardSilverBright.Name\n#: /Game/SO/Items/Shards/ShardSilverBright.ShardSilverBright.Name\nmsgctxt \"ItemData\"\nmsgid \"Bright Silver Shard\"\nmsgstr \"Ciob de Argint Luminos\"\n\n#. Key:\tShardTeal_desc\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardTeal.ShardTeal.Description\n#: /Game/SO/Items/Shards/ShardTeal.ShardTeal.Description\nmsgctxt \"ItemData\"\nmsgid \"Each time an enemy hits you with a melee strike it suffers the same damage.\"\nmsgstr \"De fiecare dată când un inamic te lovește cu o lovitură la corp suferă aceeași pagubă.\"\n\n#. Key:\tShardTeal_name\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardTeal.ShardTeal.Name\n#: /Game/SO/Items/Shards/ShardTeal.ShardTeal.Name\nmsgctxt \"ItemData\"\nmsgid \"Teal Shard\"\nmsgstr \"Ciob Turcoaz\"\n\n#. Key:\tShardTealBright_desc\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardTealBright.ShardTealBright.Description\n#: /Game/SO/Items/Shards/ShardTealBright.ShardTealBright.Description\nmsgctxt \"ItemData\"\nmsgid \"Each time an enemy hits you, it suffers <Green>200%</> of the damage.\"\nmsgstr \"De fiecare dată când un inamic te lovește, suferă <Green>200%</> din pagube.\"\n\n#. Key:\tShardTealBright_name\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardTealBright.ShardTealBright.Name\n#: /Game/SO/Items/Shards/ShardTealBright.ShardTealBright.Name\nmsgctxt \"ItemData\"\nmsgid \"Bright Teal Shard\"\nmsgstr \"Ciob Turcoaz Strălucitor\"\n\n#. Key:\tShardWhite_desc\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardWhite.ShardWhite.Description\n#: /Game/SO/Items/Shards/ShardWhite.ShardWhite.Description\nmsgctxt \"ItemData\"\nmsgid \"Increases your damage by <Green>20%</>\"\nmsgstr \"Mărește-ți daunele cu <Green>20%</>\"\n\n#. Key:\tShardWhite_name\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardWhite.ShardWhite.Name\n#: /Game/SO/Items/Shards/ShardWhite.ShardWhite.Name\nmsgctxt \"ItemData\"\nmsgid \"White Shard\"\nmsgstr \"Ciob Alb\"\n\n#. Key:\tShardWhiteBright_desc\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardWhiteBright.ShardWhiteBright.Description\n#: /Game/SO/Items/Shards/ShardWhiteBright.ShardWhiteBright.Description\nmsgctxt \"ItemData\"\nmsgid \"Increases your damage by <Green>30%</>.\"\nmsgstr \"Mărește-ți daunele cu <Green>30%</>.\"\n\n#. Key:\tShardWhiteBright_name\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardWhiteBright.ShardWhiteBright.Name\n#: /Game/SO/Items/Shards/ShardWhiteBright.ShardWhiteBright.Name\nmsgctxt \"ItemData\"\nmsgid \"Bright White Shard\"\nmsgstr \"Ciob Alb Strălucitor\"\n\n#. Key:\tShardYellow_desc\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardYellow.ShardYellow.Description\n#: /Game/SO/Items/Shards/ShardYellow.ShardYellow.Description\nmsgctxt \"ItemData\"\nmsgid \"Each melee strike has a <Yellow>10%</> chance to <Yellow>Stun</> the target.\"\nmsgstr \"Fiecare lovitură la corp are o șansă de <Yellow>10%</> să <Yellow>Amețească</> ținta.\"\n\n#. Key:\tShardYellow_name\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardYellow.ShardYellow.Name\n#: /Game/SO/Items/Shards/ShardYellow.ShardYellow.Name\nmsgctxt \"ItemData\"\nmsgid \"Yellow Shard\"\nmsgstr \"Ciob Galben\"\n\n#. Key:\tShardYellowBright_desc\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardYellowBright.ShardYellowBright.Description\n#: /Game/SO/Items/Shards/ShardYellowBright.ShardYellowBright.Description\nmsgctxt \"ItemData\"\nmsgid \"Each melee strike has a <Yellow>20%</> chance to <Yellow>Stun</> the target.\"\nmsgstr \"Fiecare lovitură la corp are o șansă de <Yellow>20%</> să <Yellow>Amețească</> ținta.\"\n\n#. Key:\tShardYellowBright_name\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardYellowBright.ShardYellowBright.Name\n#: /Game/SO/Items/Shards/ShardYellowBright.ShardYellowBright.Name\nmsgctxt \"ItemData\"\nmsgid \"Bright Yellow Shard\"\nmsgstr \"Ciob Galben Strălucitor\"\n\n#. Key:\tSpellCaster_desc\n#. SourceLocation:\t/Game/SO/Items/Useable/SpellCaster.SpellCaster.Description\n#: /Game/SO/Items/Useable/SpellCaster.SpellCaster.Description\nmsgctxt \"ItemData\"\nmsgid \"A magical artefact with the following worn text engraved on the back:\\r\\n\\r\\nInsert Runestones to ... spells\\r\\nKeep .... .... children\\r\\nMade in .....\"\nmsgstr \"Un artefact magic cu următorul text gravat pe partea din spate:\\n\\nIntroduceți Pietrele Rună în ... vrăji\\nPăstrați .... .... copii\\nFăcut in .....\"\n\n#. Key:\tSpellCaster_name\n#. SourceLocation:\t/Game/SO/Items/Useable/SpellCaster.SpellCaster.Name\n#: /Game/SO/Items/Useable/SpellCaster.SpellCaster.Name\nmsgctxt \"ItemData\"\nmsgid \"Spellcaster\"\nmsgstr \"Articol de făcut Vrăji\"\n\n#. Key:\tStraightSword_desc\n#. SourceLocation:\t/Game/SO/Items/Weapons/StraightSword.StraightSword.Description\n#: /Game/SO/Items/Weapons/StraightSword.StraightSword.Description\nmsgctxt \"ItemData\"\nmsgid \"A simple yet effective weapon. Not too rusty, not too sharp. If someone looks close enough it looks a bit low budget, but the ones looking close enough won't talk about anything anymore, will they?\"\nmsgstr \"O armă simplă, dar eficientă. Nu prea ruginită, nu prea ascuțita. Dacă cineva se uit de aproape pare a fi de proastă calitate dar cei care se uită de aproape nu vor mai vorbi mult, nu-i așa?\"\n\n#. Key:\tStraightSword_name\n#. SourceLocation:\t/Game/SO/Items/Weapons/StraightSword.StraightSword.Name\n#: /Game/SO/Items/Weapons/StraightSword.StraightSword.Name\nmsgctxt \"ItemData\"\nmsgid \"Straight Sword\"\nmsgstr \"Sabie dreaptă\"\n\n#. Key:\tTestStoneBag_desc\n#. SourceLocation:\t/Game/SO/Items/Useable/TestStoneBag.TestStoneBag.Description\n#: /Game/SO/Items/Useable/TestStoneBag.TestStoneBag.Description\nmsgctxt \"ItemData\"\nmsgid \"When you are the one in the team who has the job to enter every dungeon first, you will become a careful one too... if you live long enough for that.\"\nmsgstr \"Când vei fi cel din echipă care trebuie să intre în fiecare temniță primul, vei deveni și unul atent ... dacă trăiești suficient de mult pentru asta.\"\n\n#. Key:\tTestStoneBag_name\n#. SourceLocation:\t/Game/SO/Items/Useable/TestStoneBag.TestStoneBag.Name\n#: /Game/SO/Items/Useable/TestStoneBag.TestStoneBag.Name\nmsgctxt \"ItemData\"\nmsgid \"Bag of the Careful One\"\nmsgstr \"Geanta celui atent\"\n\n#. Key:\tWheel_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/Wheel.Wheel.Description\n#: /Game/SO/Items/QuestItems/Wheel.Wheel.Description\nmsgctxt \"ItemData\"\nmsgid \"One of the first greatest inventions of humans. Because they envied balls for their rolling skill.\"\nmsgstr \"Una dintre primele mari invenții ale oamenilor. Pentru că au invidiat bile pentru abilitatea lor de rostogolire.\"\n\n#. Key:\tWheel_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/Wheel.Wheel.Name\n#: /Game/SO/Items/QuestItems/Wheel.Wheel.Name\nmsgctxt \"ItemData\"\nmsgid \"Wheel\"\nmsgstr \"Roată\"\n\n#. Key:\tWWBossShipLock_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/WWBossShipLock.WWBossShipLock.Description\n#: /Game/SO/Items/Keys/WWBossShipLock.WWBossShipLock.Description\nmsgctxt \"ItemData\"\nmsgid \"Rusty key of a rusty lock.\"\nmsgstr \"Cheia ruginită a unei încuietori ruginite.\"\n\n#. Key:\tWWBossShipLock_name\n#. SourceLocation:\t/Game/SO/Items/Keys/WWBossShipLock.WWBossShipLock.Name\n#: /Game/SO/Items/Keys/WWBossShipLock.WWBossShipLock.Name\nmsgctxt \"ItemData\"\nmsgid \"Rusty Key\"\nmsgstr \"Cheia Ruginită\"\n\n#. Key:\t0BFD568E4989A20D66B91DA476C0E6B4\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_6.Text\n#: /Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_6.Text\nmsgctxt \"Notes\"\nmsgid \"I promised Fountain to give its flower to the Magic Mirror.\"\nmsgstr \"I-am promis Fântânei să-i dea floarea Oglinzii Magice.\"\n\n#. Key:\t1ABD11A64A7649801A6AB6A8BBDC686C\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_9.Text\n#: /Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_9.Text\nmsgctxt \"Notes\"\nmsgid \"The Ghost Dwarf needs a ghost abacus\"\nmsgstr \"Fantoma Piticului are nevoie de un abac fantomă\"\n\n#. Key:\t57CBE1274A1B4EC7FD68EA9288161AAD\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_7.Text\n#: /Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_7.Text\nmsgctxt \"Notes\"\nmsgid \"The Chef wants me to clear the shore\"\nmsgstr \"Bucătarul vrea să curăț țărmul\"\n\n#. Key:\t77693D6C43702786250364932BD34BCD\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note.Text\n#: /Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note.Text\nmsgctxt \"Notes\"\nmsgid \"The GateKeeper could use a chair\"\nmsgstr \"Portarul ar putea folosi un scaun\"\n\n#. Key:\t9C3FB78C4598A48BC187B580CBB070F6\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_8.Text\n#: /Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_8.Text\nmsgctxt \"Notes\"\nmsgid \"The Dwarf wants me to clear the Dwarven Fortress\"\nmsgstr \"Piticul vrea să eliberez Cetatea Piticilor\"\n\n#. Key:\tAA94EB6E4B0A505D730971932A3DE0CC\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_5.Text\n#: /Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_5.Text\nmsgctxt \"Notes\"\nmsgid \"The Golem Maker wants me to hunt some Golems\"\nmsgstr \"Creatorul de Golemi vrea să vânez niște Golemi\"\n\n#. Key:\tAE371E564EC1D75947ECF98AAA896A2C\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_11.Text\n#: /Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_11.Text\nmsgctxt \"Notes\"\nmsgid \"A Pipe Walker is trapped in a cage\"\nmsgstr \"Un Mergător pe Țevi este prins într-o cușcă\"\n\n#. Key:\tB12481ED4CFF0182EDB7ACAA416B55FC\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_4.Text\n#: /Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_4.Text\nmsgctxt \"Notes\"\nmsgid \"Gnory needs a wheel\"\nmsgstr \"Gnory are nevoie de o roată\"\n\n#. Key:\tD3B6D81E433CBE8461E2B1AFE06E9741\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_13.Text\n#: /Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_13.Text\nmsgctxt \"Notes\"\nmsgid \"The Chef asked me to bring him some Purple Mushroom\"\nmsgstr \"Bucătarul mi-a cerut să-i aduc o Ciupercă Purpurie\"\n\n#. Key:\tD8C4FFC7435C6A2E7C88BBA7109A1907\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_12.Text\n#: /Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_12.Text\nmsgctxt \"Notes\"\nmsgid \"I need to learn Dwarven to open a gate\"\nmsgstr \"Trebuie să învăț Limba Piticilor pentru a deschide o poartă\"\n\n#. Key:\tE3857F07468C2A0B34A98887E3BBB1DA\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_10.Text\n#: /Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_10.Text\nmsgctxt \"Notes\"\nmsgid \"I feel the Tomb of Tabby is important somehow\"\nmsgstr \"Simt că Mormântul lui Tabby este important cumva\"\n\n#. Key:\tE9DA40684B9375A5F78D18A138C75174\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_2.Text\n#: /Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_2.Text\nmsgctxt \"Notes\"\nmsgid \"Teachy asked for a strangely unique device\"\nmsgstr \"Teachy a cerut un dispozitiv unic ciudat\"\n\n#. Key:\tF109A1614B16565CC1846C8D0A46672E\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_1.Text\n#: /Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_1.Text\nmsgctxt \"Notes\"\nmsgid \"I promised Lory to bring her some books\"\nmsgstr \"I-am promis lui Lory că-i aducă niște cărți\"\n\n#. Key:\taway\n#. SourceLocation:\tSource/SOrb/UI/InGame/SoUIStationPanel.cpp:98\n#: Source/SOrb/UI/InGame/SoUIStationPanel.cpp:98\nmsgctxt \"StationNames\"\nmsgid \"World's End\"\nmsgstr \"Sfârșitul lumii\"\n\n#. Key:\tcrossroadcave\n#. SourceLocation:\tSource/SOrb/UI/InGame/SoUIStationPanel.cpp:94\n#: Source/SOrb/UI/InGame/SoUIStationPanel.cpp:94\nmsgctxt \"StationNames\"\nmsgid \"Crossroad Cave\"\nmsgstr \"Peștera de la Intersecție\"\n\n#. Key:\tlavatemple\n#. SourceLocation:\tSource/SOrb/UI/InGame/SoUIStationPanel.cpp:96\n#: Source/SOrb/UI/InGame/SoUIStationPanel.cpp:96\nmsgctxt \"StationNames\"\nmsgid \"Remnant Road\"\nmsgstr \"Drumul Rămășiței\"\n\n#. Key:\toutpost\n#. SourceLocation:\tSource/SOrb/UI/InGame/SoUIStationPanel.cpp:95\n#: Source/SOrb/UI/InGame/SoUIStationPanel.cpp:95\nmsgctxt \"StationNames\"\nmsgid \"Obedient Outpost\"\nmsgstr \"Avanpostul Ascultător\"\n\n#. Key:\tstay\n#. SourceLocation:\tSource/SOrb/UI/InGame/SoUIStationPanel.cpp:99\n#: Source/SOrb/UI/InGame/SoUIStationPanel.cpp:99\nmsgctxt \"StationNames\"\nmsgid \"Stay\"\nmsgstr \"Stai\"\n\n#. Key:\twrackedWaters\n#. SourceLocation:\tSource/SOrb/UI/InGame/SoUIStationPanel.cpp:97\n#: Source/SOrb/UI/InGame/SoUIStationPanel.cpp:97\nmsgctxt \"StationNames\"\nmsgid \"Wracked Waters\"\nmsgstr \"Apele Împrăștiate\"\n\n"
  },
  {
    "path": "Content/Localization/Warriorb/ru/Warriorb.po",
    "content": "﻿# Warriorb Russian translation.\n# Copyright 1998-2019 Epic Games, Inc. All Rights Reserved.\n# \nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: Warriorb\\n\"\n\"POT-Creation-Date: 2020-10-07 08:12\\n\"\n\"PO-Revision-Date: 2020-10-07 08:12\\n\"\n\"Language-Team: \\n\"\n\"Language: ru\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\\n\"\n\n#. Key:\t78A72CB345FCC7ECDCFD8181471D78D8\n#. SourceLocation:\t/Game/SO/GUI/UI_Credits.UI_Credits_C:WidgetTree.CreditsText.Text\n#: /Game/SO/GUI/UI_Credits.UI_Credits_C:WidgetTree.CreditsText.Text\nmsgid \"<T>-- Not Yet Team --</>\\r\\n\\r\\n\\r\\nAnna Molnár\\r\\n<R>2D art, Environment Design</>\\r\\n\\r\\n\\r\\nCsaba Molnár\\r\\n<R>Code, Design</>\\r\\n\\r\\n\\r\\nDaniel Butum\\r\\n<R>Code</>\\r\\n\\r\\n\\r\\nGéza Molnár\\r\\n<R>3D art, Design</>\\r\\n\\r\\n\\r\\nRichárd Ráski\\r\\n<R>Sound Design</>\\r\\n\\r\\n\\r\\n\\r\\n<T>-- Music --</>\\r\\n\\r\\nBenjámin Kuli\\r\\n\\r\\n\\r\\nGisula\\r\\n\\r\\n\\r\\n\\r\\n<T>-- Voice Over --</>\\r\\n\\r\\n\\r\\nPeter Luzsi - @peterluzsi\\r\\n<R>WarriOrb, Gatekeeper, Ghost Armor, Principal</>\\r\\n\\r\\n\\r\\nBrent Miller\\r\\n<R>WarriOrb - Trailer</>\\r\\n\\r\\n\\r\\nPierce Riola\\r\\n<R>Wizard, Gnory</>\\r\\n\\r\\n\\r\\nEir Causey\\r\\n<R>Raven, Teachy, Ghost Dwarf, Unknown Wizard, Fishy</>\\r\\n\\r\\n\\r\\nJack Broadbent\\r\\n<R>Monk, Flybug</>\\r\\n\\r\\n\\r\\nEmil Hagg\\r\\n<R>Supper Dwarf, Kobold Chef, Fallen Druid, Dwarven Statue</>\\r\\n\\r\\n\\r\\nErick Nita\\r\\n<R>Golem Maker, Armour Wrath</>\\r\\n\\r\\n\\r\\nAlain Vega\\r\\n<R>Merch Ant</>\\r\\n\\r\\n\\r\\nAngela Tran\\r\\n<R>Lillian, Pipe Walker</>\\r\\n\\r\\n\\r\\nBrittany Ann Phillips\\r\\n<R>Lory</>\\r\\n\\r\\n\\r\\nAurore Gautheur\\r\\n<R>Fountain, Shade</>\\r\\n\\r\\n\\r\\nAlexander Blairlex\\r\\n<R>Primitive Fishy, Ghost Helmet</>\\r\\n\\r\\n\\r\\nSophie Ryder\\r\\n<R>Shadesphere</>\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n<T>-- Partners --</>\\r\\n\\r\\n\\r\\nMaple Whispering\\r\\n<R>Chineese localization</>\\r\\n<R>Publisher - China, PC</>\\r\\n\\r\\n\\r\\nNovy Unlimited\\r\\n<R>PR and Marketing</>\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n<T>-- Localization --</>\\r\\n\\r\\n\\r\\nVera Liscovschi\\r\\n<R>Russian</>\\r\\n\\r\\n\\r\\nJay Johnstone\\r\\n<R>Spanish</>\\r\\n\\r\\n\\r\\nBertin William\\r\\n<R>French</>\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n<T>-- Testers --</>\\r\\n\\r\\n\\r\\nSaleymander\\r\\n\\r\\n\\r\\nHitch\\r\\n\\r\\n\\r\\nMrCalculated\\r\\n\\r\\n\\r\\n<img id=\\\"Rainbow\\\"/>Scorpion253<img id=\\\"Rainbow\\\"/>\\r\\n\\r\\n\\r\\nmoses\\r\\n\\r\\n\\r\\nNinjin42\\r\\n\\r\\n\\r\\nKonstantinos Xenitidis\\r\\n\\r\\n\\r\\nPhyronnaz\\r\\n\\r\\n\\r\\nArthur\\r\\n\\r\\n\\r\\nMaster1G\\r\\n\\r\\n\\r\\nDávid Bartók\\r\\n\\r\\n\\r\\nLiDuGaming\\r\\n\\r\\n\\r\\nClaudiu Coman\\r\\n\\r\\n\\r\\nÁron Ürögdi\\r\\n\\r\\n\\r\\nDukenukemboi\\r\\n\\r\\n\\r\\nBart Cools\\r\\n\\r\\n\\r\\nGlenn De Jonghe\\r\\n\\r\\n\\r\\nDomonkos Péter Madarász\\r\\n\\r\\n\\r\\nGergő Gyarmati\\r\\n\\r\\n\\r\\nRéka Gyarmati\\r\\n\\r\\n\\r\\nKincső Petraskó\\r\\n\\r\\n\\r\\nGergő Petraskó\\r\\n\\r\\n\\r\\nDániel Garamvölgyi\\r\\n\\r\\n\\r\\nDanny \\\"GHelmet\\\" Cloutier\\r\\n\\r\\n\\r\\nAnna Boglárka Tóth\\r\\n\\r\\n\\r\\nBíborka Roxána Kubik\\r\\n\\r\\n\\r\\nVirág Miklós\\r\\n\\r\\n\\r\\nBenedek Marozsák\\r\\n\\r\\n\\r\\nDániel Marozsák\\r\\n\\r\\n\\r\\nGereon Bartel\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n<T>-- Prologue Speedrun Competition Winner --</>\\r\\n\\r\\n-7\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n<T>-- Special Thanks --</>\\r\\n\\r\\n\\r\\nMalazan Discord Server Community\\r\\n\\r\\n\\r\\n/r/metroidvenia Discord Server Community\\r\\n\\r\\n\\r\\nUnreal Slackers Discord Server Community\\r\\n\\r\\n\\r\\nIMGUR\\r\\n\\r\\n\\r\\nBíborka Roxána Kubik\\r\\n\\r\\n\\r\\nSergiu Crăiţoiu\\r\\n\\r\\n\\r\\nJuhász Ernő\\r\\n\\r\\n\\r\\nRacheal Smith\\r\\n\\r\\n\\r\\nRuxandra Seniuc\\r\\n\\r\\n\\r\\nthottee\\r\\n\\r\\n\\r\\nAndrew Pappas\\r\\n\\r\\n\\r\\nJonathan Lampel\\r\\n\\r\\n\\r\\nRichárd Németh\\r\\n\\r\\n\\r\\nAlex Gorcea\\r\\n\\r\\n\\r\\nNotRealVitor\\r\\n\\r\\n\\r\\nKinga Surján\\r\\n\\r\\n\\r\\nAnna Boglárka Tóth\\r\\n\\r\\n\\r\\nÉvi Fekete\\r\\n\\r\\n\\r\\nGergő Sielaf\\r\\n\\r\\n\\r\\n<img id=\\\"Rainbow\\\"/>Scorpion253<img id=\\\"Rainbow\\\"/>\\r\\n\\r\\n\\r\\nMainiac\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n<T>-- Technology --</>\\r\\n\\r\\n\\r\\n<R>WarriOrb uses the Unreal® Engine.</>\\r\\n<R>Unreal® is a trademark or registered trademark of Epic Games, Inc. in the United States of America and elsewhere</>\\r\\n\\r\\n<R>Unreal® Engine, Copyright 1998 – 2020, Epic Games, Inc. All rights reserved.</>\\r\\n\\r\\n\\r\\n\\r\\n<R>Made with FMOD Studio by Firelight Technologies Pty Ltd.</>\"\nmsgstr \"<T> - Команда Not Yet - </>\\r\\n\\n\\nАнна Мольнар\\n<R> 2D-арт, Дизайн среды </>\\n\\n\\nЧаба Мольнар\\n<R> Код, Дизайн </>\\n\\n\\nДаниэль Бутум\\n<R> код </>\\n\\n\\nГеза Мольнар\\n<R> 3D-арт, дизайн </>\\n\\n\\nРичард Раски\\n<R> Звуковое оформление </>\\n\\n\\n\\n<T> - Музыка - </>\\n\\nБенджамин Кули\\n\\n\\nГисула\\n\\n\\n\\n<T> - Озвучили - </>\\n\\n\\nПитер Лузси - @peterluzsi\\n<R> WarriOrb, Хранитель Врат, Призрачная Броня, Директор </>\\n\\n\\nБрент Миллер\\n<R> WarriOrb - Трейлер </>\\n\\n\\nПирс Риола\\n<R> Волшебник, Гнори </>\\n\\n\\nЭйр Кози\\n<R> Ворон, Ученый, Призрачный Гном, Неизвестный Волшебник, Фиши </>\\n\\n\\nДжек Бродбент\\n<R> Монах, Муха-жук </>\\n\\n\\nЭмиль Хагг\\n<R> Гном Едун, Повар Коболд, Падший Друид, Статуя Гномов, Вступительный рассказчик </>\\n\\n\\nЭрик Нита\\n<R> Создатели Големов, Броня Гнева </>\\n\\n\\nАлен Вега\\n<R> Торгаш </>\\n\\n\\nАнжела Тран\\n<R> Лилиан, Трубоходики </>\\n\\n\\nБритни Энн Филлипс\\n<R> Лори </>\\n\\n\\nАвроре Готер\\n<R> Фонтан, Тень </>\\n\\n\\nАлександр Блэрлекс\\n<R> Примитивный Фиши, Шлем-призрак </>\\n\\n\\nСофи Райдер\\n<R> Теневая Сфера </>\\n\\n\\n\\n\\n<T> - Партнеры - </>\\n\\n\\nMaple Whispering\\n<R> Китайская локализация </>\\n<R> Издатель - Китай, ПК </>\\n\\n\\nNovy Unlimited\\n<R> PR и маркетинг </>\\n\\n\\n\\n\\n<T> - Локализация - </>\\n\\n\\nВера Лисковски\\n<R> Русский </>\\n\\n\\nДжей Джонстон\\n<R> Испанский </>\\n\\n\\nБертин Уильям\\n<R> Французский </>\\n\\n\\n\\n\\n<T> - Тестеры - </>\\n\\n\\nSaleymander\\n\\n\\n\\n\\nHitch\\n\\n\\n\\n\\n\\nMrCalculated\\n\\n\\n\\n\\n\\n<img id=\\\"Rainbow\\\"/>Scorpion253<img id=\\\"Rainbow\\\"/>\\n\\n\\n\\n\\n\\nmoses\\n\\n\\n\\n\\n\\nNinjin42\\n\\n\\n\\n\\n\\nКонстантинос Ксенитидис\\n\\n\\nPhyronnaz\\n\\n\\nАртур\\n\\n\\nMaster1G\\n\\n\\nДавид Барток\\n\\n\\nLiDuGaming\\n\\n\\nКлаудиу Коман\\n\\n\\nАрон Урёгди\\n\\n\\nDukenukemboi\\n\\n\\nБарт Кулс\\n\\n\\nГленн Де Йонге\\n\\n\\nДомонкос Петер Мадараш\\n\\n\\nГерго Гьярмати\\n\\n\\nРека Гьярмати\\n\\n\\nКинче Петраско\\n\\n\\nГерго Петраско\\n\\n\\nДаниэль Гарамвёлги\\n\\n\\nДэнни “GHelmet” Cloutier\\n\\n\\nАнна Богларка Тот\\n\\n\\nБиборка Роксана Кубик\\n\\n\\nВираг Миклош\\n\\n\\nБенедек Марозак\\n\\n\\nДаниэль Марозак\\n\\n\\nГереон Бартель\\n\\n\\n\\n\\n<T> - Победитель Конкурса Prologue Speedrun - </>\\n\\n-7\\n\\n\\n\\n\\n<T> - Особая благодарность - </>\\n\\n\\nСообществу Malazan Discord Server\\n\\n\\n/ r / metroidvenia Сообществу Discord Server\\n\\n\\nСообществу Unreal Slackers Discord Server\\n\\n\\nImgur\\n\\n\\nБиборка Роксана Кубик\\n\\n\\nСерджю Крэицою\\n\\n\\nЮхас Эрну\\n\\n\\nРейчел Смит\\n\\n\\nРуксандра Сенюк\\n\\n\\nthottee\\n\\n\\nЭндрю Паппас\\n\\n\\nДжонатан Лампель\\n\\n\\nРичард Немет\\n\\n\\nАлекс Горча\\n\\n\\nNotRealVitor\\n\\n\\nКинга Сурьян\\n\\n\\nАнна Богларка Тот\\n\\n\\nЭви Фекете\\n\\n\\nГерго Силаф\\n\\n\\n<img id=\\\"Rainbow\\\"/>Scorpion253<img id=\\\"Rainbow\\\"/>\\n\\n\\n\\nMainiac\\n\\n\\n\\n\\n<T> - Технология - </>\\n\\n\\n<R> WarriOrb использует двигатель Unreal®. </>\\n<R> Unreal® является товарным знаком или зарегистрированным товарным знаком Epic Games, Inc. в Соединенных Штатах Америки и других странах </>\\n\\n<R> Unreal® Engine, Copyright 1998 - 2020, Epic Games, Inc. Все права защищены. </>\\n\\n\\n\\n<R> Сделано с FMOD Studio компанией Firelight Technologies Pty Ltd. </>\"\n\n#. Key:\tAxeSpecial_name\n#. SourceLocation:\t/Game/SO/CharacterStrikes/AxeSpecial.AxeSpecial.StrikeName\n#: /Game/SO/CharacterStrikes/AxeSpecial.AxeSpecial.StrikeName\nmsgctxt \"CharacterStrike\"\nmsgid \"Throw\"\nmsgstr \"Метание топора\"\n\n#. Key:\tDemonSwordSpecial_name\n#. SourceLocation:\t/Game/SO/CharacterStrikes/DemonSwordSpecial.DemonSwordSpecial.StrikeName\n#: /Game/SO/CharacterStrikes/DemonSwordSpecial.DemonSwordSpecial.StrikeName\nmsgctxt \"CharacterStrike\"\nmsgid \"Downstrike\"\nmsgstr \"Удар вниз\"\n\n#. Key:\tDualBladeSpecial_name\n#. SourceLocation:\t/Game/SO/CharacterStrikes/DualBladeSpecial.DualBladeSpecial.StrikeName\n#: /Game/SO/CharacterStrikes/DualBladeSpecial.DualBladeSpecial.StrikeName\nmsgctxt \"CharacterStrike\"\nmsgid \"Backslash\"\nmsgstr \"Рассекающее сальто назад\"\n\n#. Key:\tLeafMaceSpecial_name\n#. SourceLocation:\t/Game/SO/CharacterStrikes/LeafMaceSpecial.LeafMaceSpecial.StrikeName\n#: /Game/SO/CharacterStrikes/LeafMaceSpecial.LeafMaceSpecial.StrikeName\nmsgctxt \"CharacterStrike\"\nmsgid \"Crushing Blow\"\nmsgstr \"Сокрушительный Удар\"\n\n#. Key:\tSabreSpecial_name\n#. SourceLocation:\t/Game/SO/CharacterStrikes/SabreSpecial.SabreSpecial.StrikeName\n#: /Game/SO/CharacterStrikes/SabreSpecial.SabreSpecial.StrikeName\nmsgctxt \"CharacterStrike\"\nmsgid \"Floating Strikes\"\nmsgstr \"Порхающие Удары\"\n\n#. Key:\tSwordSpecialAirStrike_name\n#. SourceLocation:\t/Game/SO/CharacterStrikes/SwordSpecialAirStrike.SwordSpecialAirStrike.StrikeName\n#: /Game/SO/CharacterStrikes/SwordSpecialAirStrike.SwordSpecialAirStrike.StrikeName\nmsgctxt \"CharacterStrike\"\nmsgid \"Air Strike\"\nmsgstr \"Рассекающее сальто\"\n\n#. Key:\tBPEftAttackSpeedMultiplier_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/BPEftAttackSpeedMultiplier.Default__BPEftAttackSpeedMultiplier_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/BPEftAttackSpeedMultiplier.Default__BPEftAttackSpeedMultiplier_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Quick Hands\"\nmsgstr \"Быстрые Руки\"\n\n#. Key:\tBPEftBootTransmutation_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/BPEftBootTransmutation.Default__BPEftBootTransmutation_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/BPEftBootTransmutation.Default__BPEftBootTransmutation_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Protective Transmutation\"\nmsgstr \"Защитная трансмутация\"\n\n#. Key:\tBPEftBounce_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftBounce.Default__BPEftBounce_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftBounce.Default__BPEftBounce_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Charged Bounce\"\nmsgstr \"Заряженный прыжок\"\n\n#. Key:\tBPEftCooldownReducePassive02_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/BPEftCooldownReducePassive02.Default__BPEftCooldownReducePassive02_C.DisplayName\n#. Key:\tBPEftCooldownReduce_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/BPEftCooldownReduce.Default__BPEftCooldownReduce_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/BPEftCooldownReduce.Default__BPEftCooldownReduce_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/BPEftCooldownReducePassive02.Default__BPEftCooldownReducePassive02_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Restlessness\"\nmsgstr \"Неугомонность\"\n\n#. Key:\tBPEftCriticalChanceBoost10_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/BPEftCriticalChanceBoost10.Default__BPEftCriticalChanceBoost10_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/BPEftCriticalChanceBoost10.Default__BPEftCriticalChanceBoost10_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Critical Chance\"\nmsgstr \"Критический Шанс\"\n\n#. Key:\tBPEftDamageReflection_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/BPEftDamageReflection.Default__BPEftDamageReflection_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/BPEftDamageReflection.Default__BPEftDamageReflection_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Sparks of Vengeance\"\nmsgstr \"Искры Мести\"\n\n#. Key:\tBPEftDmgModifier_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftDmgModifier.Default__BPEftDmgModifier_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftDmgModifier.Default__BPEftDmgModifier_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Perfect Hands\"\nmsgstr \"Идеальные Руки\"\n\n#. Key:\tBPEftHeal3_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/BPEftHeal3.Default__BPEftHeal3_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/BPEftHeal3.Default__BPEftHeal3_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Heal\"\nmsgstr \"Лечение\"\n\n#. Key:\tBPEftLifeLeech5_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/BPEftLifeLeech5.Default__BPEftLifeLeech5_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/BPEftLifeLeech5.Default__BPEftLifeLeech5_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Life Leech\"\nmsgstr \"Высасывание здоровья\"\n\n#. Key:\tBPEftMagicMissle_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftMagicMissle.Default__BPEftMagicMissle_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftMagicMissle.Default__BPEftMagicMissle_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Magic Missile\"\nmsgstr \"Волшебная Ракета\"\n\n#. Key:\tBPEftMassMagicMissle_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftMassMagicMissle.Default__BPEftMassMagicMissle_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftMassMagicMissle.Default__BPEftMassMagicMissle_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Magic Missiles\"\nmsgstr \"Волшебные Ракеты\"\n\n#. Key:\tBPEftMassSlow_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftMassSlow.Default__BPEftMassSlow_C.DisplayName\n#. Key:\tBPEftSlow_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/BPEftSlow.Default__BPEftSlow_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/BPEftSlow.Default__BPEftSlow_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftMassSlow.Default__BPEftMassSlow_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Slow\"\nmsgstr \"Замедление\"\n\n#. Key:\tBPEftMeteorShower_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftMeteorShower.Default__BPEftMeteorShower_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftMeteorShower.Default__BPEftMeteorShower_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Meteor Shower\"\nmsgstr \"Метеоритный Дождь\"\n\n#. Key:\tBPEftRegainSpellPassive25_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/BPEftRegainSpellPassive25.Default__BPEftRegainSpellPassive25_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/BPEftRegainSpellPassive25.Default__BPEftRegainSpellPassive25_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Arcane Luck\"\nmsgstr \"Таинственная Удача\"\n\n#. Key:\tBPEftRegainSpells_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/BPEftRegainSpells.Default__BPEftRegainSpells_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/BPEftRegainSpells.Default__BPEftRegainSpells_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Restoration\"\nmsgstr \"Возобновление\"\n\n#. Key:\tBPEftResModifierMagicalStrong_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftResModifierMagicalStrong.Default__BPEftResModifierMagicalStrong_C.DisplayName\n#. Key:\tBPEftResModifierMagical_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftResModifierMagical.Default__BPEftResModifierMagical_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftResModifierMagical.Default__BPEftResModifierMagical_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftResModifierMagicalStrong.Default__BPEftResModifierMagicalStrong_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Wardskin\"\nmsgstr \"Защитный покров\"\n\n#. Key:\tBPEftResModifierPhysical_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftResModifierPhysical.Default__BPEftResModifierPhysical_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftResModifierPhysical.Default__BPEftResModifierPhysical_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Stoneskin\"\nmsgstr \"Каменный покров\"\n\n#. Key:\tBPEftSecondChance_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/BPEftSecondChance.Default__BPEftSecondChance_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/BPEftSecondChance.Default__BPEftSecondChance_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Second Chance\"\nmsgstr \"Второй Шанс\"\n\n#. Key:\tBPEftSpellFire0_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftSpellFire0.Default__BPEftSpellFire0_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftSpellFire0.Default__BPEftSpellFire0_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Firestrike\"\nmsgstr \"Огненный Удар\"\n\n#. Key:\tBPEftSpellLightningWalk_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftSpellLightningWalk.Default__BPEftSpellLightningWalk_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftSpellLightningWalk.Default__BPEftSpellLightningWalk_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Shockwalk\"\nmsgstr \"Шокоход\"\n\n#. Key:\tBPEftSpellShadowWalk_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftSpellShadowWalk.Default__BPEftSpellShadowWalk_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftSpellShadowWalk.Default__BPEftSpellShadowWalk_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Shadewalk\"\nmsgstr \"Тениход\"\n\n#. Key:\tBPEftSpellShield_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftSpellShield.Default__BPEftSpellShield_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftSpellShield.Default__BPEftSpellShield_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Shield\"\nmsgstr \"Щит\"\n\n#. Key:\tBPEftSpellSoulKeeper_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftSpellSoulKeeper.Default__BPEftSpellSoulKeeper_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftSpellSoulKeeper.Default__BPEftSpellSoulKeeper_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Soulbind\"\nmsgstr \"Связка душ\"\n\n#. Key:\tBPEftStun_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/BPEftStun.Default__BPEftStun_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/BPEftStun.Default__BPEftStun_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Stun\"\nmsgstr \"Оглушить\"\n\n#. Key:\tBPEftStunPassive10_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/BPEftStunPassive10.Default__BPEftStunPassive10_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/BPEftStunPassive10.Default__BPEftStunPassive10_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Stun Chance\"\nmsgstr \"Шанс Оглушить\"\n\n#. Key:\tBPEftSwap_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftSwap.Default__BPEftSwap_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftSwap.Default__BPEftSwap_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Swap\"\nmsgstr \"Замена\"\n\n#. Key:\tBPEftTempHPMagical_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftTempHPMagical.Default__BPEftTempHPMagical_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftTempHPMagical.Default__BPEftTempHPMagical_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Magical Protection\"\nmsgstr \"Волшебная Защита\"\n\n#. Key:\tBPEftTempHPPhysical_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftTempHPPhysical.Default__BPEftTempHPPhysical_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftTempHPPhysical.Default__BPEftTempHPPhysical_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Physical Protection\"\nmsgstr \"Физическая Защита\"\n\n#. Key:\tBPEftWeaponFlamesTimeBased_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/BPEftWeaponFlamesTimeBased.Default__BPEftWeaponFlamesTimeBased_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/BPEftWeaponFlamesTimeBased.Default__BPEftWeaponFlamesTimeBased_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Greenflame\"\nmsgstr \"Зеленое Пламя\"\n\n#. Key:\tBPEftWorthy_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/BPEftWorthy.Default__BPEftWorthy_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/BPEftWorthy.Default__BPEftWorthy_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Worthy\"\nmsgstr \"Достойный\"\n\n#. Key:\t1E42901841F4C7CEF39536A762076EDF\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.UI_EndScreen_SaveCreatures_C:WidgetTree.TBC1.Text\n#. Key:\t5D04206A499A8B42AF77BAA8BC9B4B8B\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.UI_EndScreen_SaveCreatures_C:WidgetTree.TBC0.Text\n#. Key:\tB0EEBB754110D2821640BE990002AC36\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.UI_EndScreen_SaveCreatures_C:WidgetTree.TBC2.Text\n#. Key:\tD75DCE214B56BA6FD9A58F9EEA9291A5\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.UI_EndScreen_C:WidgetTree.TBC0.Text\n#: /Game/SO/GUI/InGame/UI_EndScreen.UI_EndScreen_C:WidgetTree.TBC0.Text\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.UI_EndScreen_SaveCreatures_C:WidgetTree.TBC0.Text\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.UI_EndScreen_SaveCreatures_C:WidgetTree.TBC1.Text\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.UI_EndScreen_SaveCreatures_C:WidgetTree.TBC2.Text\nmsgctxt \"EndScreen\"\nmsgid \"With his quest completed Monk decided to look for another activity. He thought: <Quote>‘If I could resist madness, others should be able to do the same.’</> And so he opened a monastery to share his mental training techniques with anyone willing to save its sanity.\"\nmsgstr \"Завершив свое задание, Монах решил поискать другое занятие. Он подумал: <Quote>”Если я могу противостоять безумию, другие смогут сделать то же самое.”</> И поэтому он открыл монастырь, чтобы поделиться своими умственными способностями с каждым, кто хочет спасти его вменяемость.\"\n\n#. Key:\t7279EA4741D3DAC5AE92EB99AB851ED9\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.UI_EndScreen_SaveCreatures_C:WidgetTree.TBD0.Text\n#. Key:\t77E809914A65796364FE94B8C2361FD7\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.UI_EndScreen_SaveCreatures_C:WidgetTree.TBD2.Text\n#. Key:\t9C1B477D4582ABAEDC90FCB3AC6737E7\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.UI_EndScreen_C:WidgetTree.TBD0.Text\n#. Key:\tE98C3FDD453FF80CA8EBBE94459A5CAF\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.UI_EndScreen_SaveCreatures_C:WidgetTree.TBD1.Text\n#: /Game/SO/GUI/InGame/UI_EndScreen.UI_EndScreen_C:WidgetTree.TBD0.Text\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.UI_EndScreen_SaveCreatures_C:WidgetTree.TBD0.Text\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.UI_EndScreen_SaveCreatures_C:WidgetTree.TBD1.Text\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.UI_EndScreen_SaveCreatures_C:WidgetTree.TBD2.Text\nmsgctxt \"EndScreen\"\nmsgid \"<Size42>Separating the World also changed something in the Ruined Realm. The wind turned and even Ruin stopped for a moment.</>\"\nmsgstr \"<Size42> Разделение Мира также поменяло кое-что в Разрушенном Царстве. Ветер изменился, и даже Руин остановился на мгновение.</>\"\n\n#. Key:\t9B476D3D4A603658683498B09968F8AA\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.UI_EndScreen_C:WidgetTree.TBB0.Text\n#: /Game/SO/GUI/InGame/UI_EndScreen.UI_EndScreen_C:WidgetTree.TBB0.Text\nmsgctxt \"EndScreen\"\nmsgid \"When he heard about the lost Kobold tribe he got a bit excited.<Quote>‘Kobolds reserved the ancient knowledge in their rituals’</> he said. <Quote>‘If there is something we can do with Ruin it must be connected to the rituals. I’ll go with you.’</>\"\nmsgstr \"Услышав о потерянном племени Коболд, он немного взволновался. <Quote> “Коболды хранили древние знания в своих ритуалах” </> - сказал он. <Quote>”Если есть что-то, что мы можем сделать с Руином, это должно быть связано с ритуалами. Я пойду с тобой.”</>\"\n\n#. Key:\tDF7F9F754F4FC9CB19DF92AFCE96C5C1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.UI_EndScreen_SaveCreatures_C:WidgetTree.TBA2.Text\n#. Key:\tE8401550448E14DD70717EB7EED0582B\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.UI_EndScreen_SaveCreatures_C:WidgetTree.TBA1.Text\n#. Key:\tUI_EndScreen_entry_0_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(0).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(0).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.UI_EndScreen_SaveCreatures_C:WidgetTree.TBA1.Text\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.UI_EndScreen_SaveCreatures_C:WidgetTree.TBA2.Text\nmsgctxt \"EndScreen\"\nmsgid \"The people soon forgot about the threat, some of them argued that Ruin ever existed.\"\nmsgstr \"Люди вскоре забыли об угрозе, некоторые из них спорили, если “Руин” когда-либо существовал.\"\n\n#. Key:\tE9F6E1064D5B2046DF1DEDA386012E2D\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.UI_EndScreen_C:WidgetTree.TBB2.Text\n#. Key:\tUI_EndScreen_entry_6_text_2\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(6).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(6).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.UI_EndScreen_C:WidgetTree.TBB2.Text\nmsgctxt \"EndScreen\"\nmsgid \"He opened a monastery to share his mental training techniques with anyone willing to save its sanity.\"\nmsgstr \"Он открыл монастырь, чтобы поделиться своими умственными способностями с каждым, кто хочет спасти его вменяемость.\"\n\n#. Key:\tF0EAD93B44D8D7AEF306EAB75D83FB37\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.UI_EndScreen_C:WidgetTree.TBB1.Text\n#: /Game/SO/GUI/InGame/UI_EndScreen.UI_EndScreen_C:WidgetTree.TBB1.Text\nmsgctxt \"EndScreen\"\nmsgid \"<Quote>‘If I could resist madness, others should be able to do the same’</> - he thought.\"\nmsgstr \"<Quote>”Если я могу противостоять безумию, другие смогут сделать то же самое.”</> - подумал он.\"\n\n#. Key:\tUI_EndScreen_entry_0_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(0).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(0).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Once the Boundaries of Worlds were sealed, Ruin could do no harm to the Human Realm again.\"\nmsgstr \"После того, как Границы Миров были запечатаны, Руин больше не мог причинить никакого вреда Человеческому Царству.\"\n\n#. Key:\tUI_EndScreen_entry_10_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(10).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(10).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Hearing these news made the Chef really excited.\"\nmsgstr \"Услышав эти новости, Повар очень обрадовался.\"\n\n#. Key:\tUI_EndScreen_entry_10_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(10).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(10).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"<Quote>'Could there be other survivors of my tribe?'</>\"\nmsgstr \"<Quote>”Могут ли там быть другие выжившими из моего племени?”</>\"\n\n#. Key:\tUI_EndScreen_entry_10_text_2\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(10).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(10).EndingLogic.Texts(2).Texts\nmsgctxt \"EndScreen\"\nmsgid \"He decided to leave his kitchen and search for his lost relatives.\"\nmsgstr \"Он решил покинуть свою кухню и найти своих потерянных родственников.\"\n\n#. Key:\tUI_EndScreen_entry_11_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(11).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(11).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"No one knows how he could possibly know about the soup, but Supper Dwarf also appeared to taste the food.\"\nmsgstr \"Никто не знает, откуда он мог знать о супе, но Гном Едун тоже появился, чтобы попробовать еду.\"\n\n#. Key:\tUI_EndScreen_entry_11_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(11).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(11).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"When he heard that the chef is leaving he offered his help with the trains.\"\nmsgstr \"Когда он услышал, что Повар уходит, он предложил свою помощь с поездами.\"\n\n#. Key:\tUI_EndScreen_entry_11_text_2\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(11).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(11).EndingLogic.Texts(2).Texts\nmsgctxt \"EndScreen\"\nmsgid \"<Quote>‘And I would also like to check what do they eat for supper.’</> he said. <Quote>‘I’m going with you.’</>\"\nmsgstr \"<Quote>“А еще я хотел бы проверить, что они едят на ужин.”</> - сказал он. <Quote>“Я пойду с тобой.”</>\"\n\n#. Key:\tUI_EndScreen_entry_12_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(12).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(12).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"On their way they stopped by the Golem Maker.\"\nmsgstr \"По пути они остановились у Создателя Големов.\"\n\n#. Key:\tUI_EndScreen_entry_12_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(12).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(12).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"He was just sitting and staring at nothing.\"\nmsgstr \"Он просто сидел и смотрел в никуда.\"\n\n#. Key:\tUI_EndScreen_entry_12_text_2\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(12).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(12).EndingLogic.Texts(2).Texts\nmsgctxt \"EndScreen\"\nmsgid \"It was still hard for the Maker to accept that all his work was for nothing.\"\nmsgstr \"Создателю все еще было трудно принять, что вся его работа была напрасной.\"\n\n#. Key:\tUI_EndScreen_entry_12_text_3\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(12).EndingLogic.Texts(3).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(12).EndingLogic.Texts(3).Texts\nmsgctxt \"EndScreen\"\nmsgid \"At least he stopped creating mindless stone golems.\"\nmsgstr \"По крайней мере, он перестал создавать безрассудных каменных големов.\"\n\n#. Key:\tUI_EndScreen_entry_13_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(13).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(13).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"When he heard about the lost Kobold tribe he got a bit excited.\"\nmsgstr \"Услышав о потерянном племени Коболд, он немного взволновался.\"\n\n#. Key:\tUI_EndScreen_entry_13_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(13).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(13).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"<Quote>‘Kobolds reserved the ancient knowledge in their rituals’</> he said.\"\nmsgstr \"<Quote> “Коболды хранили древние знания в своих ритуалах” </> - сказал он.\"\n\n#. Key:\tUI_EndScreen_entry_13_text_2\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(13).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(13).EndingLogic.Texts(2).Texts\nmsgctxt \"EndScreen\"\nmsgid \"<Quote>‘If there is something we can do with Ruin it must be connected to the rituals. I’ll go with you.’</>\"\nmsgstr \"<Quote>”Если есть что-то, что мы можем сделать с Руином, это должно быть связано с ритуалами. Я пойду с тобой.”</>\"\n\n#. Key:\tUI_EndScreen_entry_14_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(14).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(14).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"However there are things which never change.\"\nmsgstr \"Однако есть вещи, которые никогда не меняются.\"\n\n#. Key:\tUI_EndScreen_entry_14_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(14).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(14).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"After days of arguing on who undermined whose business Lory and Gnory separated once again.\"\nmsgstr \"После нескольких дней споров о том, кто подорвал чей бизнес Лори и Гнори снова разошлись.\"\n\n#. Key:\tUI_EndScreen_entry_15_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(15).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(15).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"While they were arguing Fishy decided to leave Gnory and set out on his own.\"\nmsgstr \"Пока они спорили, Фиши решил покинуть Гнори и отправится в путь самостоятельно.\"\n\n#. Key:\tUI_EndScreen_entry_15_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(15).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(15).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"He had no idea where he was going.\"\nmsgstr \"Он понятия не имел, куда идет.\"\n\n#. Key:\tUI_EndScreen_entry_16_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(16).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(16).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"After weeks of walking alone, he heard a faint excited voice:\"\nmsgstr \"После нескольких недель странствий в одиночестве, он услышал слабый приветливый голос:\"\n\n#. Key:\tUI_EndScreen_entry_1_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(1).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(1).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"The Mage Council didn’t believe a single word Lillian or Scholar told them about the events.\"\nmsgstr \"Совет Магов не поверил ни единому слову Лилиан или Профессора, сказанному им о событиях.\"\n\n#. Key:\tUI_EndScreen_entry_1_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(1).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(1).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"They claimed that Wizard died in an unfortunate accident and his device could never actually work anyway.\"\nmsgstr \"Они утверждали, что Волшебник погиб в несчастном случае, и его устройство все равно никогда бы не cработало.\"\n\n#. Key:\tUI_EndScreen_entry_2_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(2).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(2).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Although Lillian inherited her father’s castle she was sent to an Orphanage until she came into age to live on her own.\"\nmsgstr \"Хотя Лилиан унаследовала замок своего отца, ее отправили в детский дом, пока она не достигла совершеннолетия, чтобы жить самостоятельно.\"\n\n#. Key:\tUI_EndScreen_entry_2_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(2).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(2).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Scholar was upset by Lillian’s decision on letting the Ruined Realm fall but he promised Lillian that he will make the Wizard’s Council let Lillian live in his estate.\"\nmsgstr \"Профессор был расстроен решением Лилиан, позволить Разрушенному Царству пасть, но он пообещал Лилиан, что заставит Совет Волшебников отпустить Лилиан жить в его поместье.\"\n\n#. Key:\tUI_EndScreen_entry_3_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(3).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(3).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Lillian didn't let the unfortunate events to overcome her. She stopped Ruin even if no one believed her.\"\nmsgstr \"Лилиан не позволила несчастным событиям преодолеть ее. Она остановила Руин, даже если ей никто не верил.\"\n\n#. Key:\tUI_EndScreen_entry_3_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(3).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(3).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"She also knew that the Ruined Realm still had at least a half century before it was totally destroyed so she decided to keep on looking for a way to save it.\"\nmsgstr \"Она также знала, что у Разрушенное Царство все еще есть полвека до того, как оно будет полностью разрушено, поэтому она решила продолжать искать способы спасти его.\"\n\n#. Key:\tUI_EndScreen_entry_3_text_2\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(3).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(3).EndingLogic.Texts(2).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Now that her own Realm was safe she could focus on the other Realms.\"\nmsgstr \"Теперь, когда ее собственное Царство в безопасности, она может сосредоточиться на других Царствах.\"\n\n#. Key:\tUI_EndScreen_entry_4_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(4).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(4).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"<Size42>Separating the World also changed something in the Ruined Realm.</>\"\nmsgstr \"<Size42> Разделение Мира также поменяло что-то в Разрушенном Царстве.</>\"\n\n#. Key:\tUI_EndScreen_entry_4_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(4).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(4).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"<Size42>The wind turned and even Ruin stopped for a moment.</>\"\nmsgstr \"<Size42>Ветра изменился и даже Руин остановился на мгновение.</>\"\n\n#. Key:\tUI_EndScreen_entry_5_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(5).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(5).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"When it was certain that no one will be saved from Ruin, as a last desperate act Gate Keeper tried to open a Gate to the Human Realm himself.\"\nmsgstr \"Когда стало ясно, что никто не спасется от Руина, как последний отчаянный поступок Хранитель Врат попытался сам открыть Врата в Человеческое Царство.\"\n\n#. Key:\tUI_EndScreen_entry_5_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(5).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(5).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"A portal opened and swallowed the Keeper.\"\nmsgstr \"Портал открылся и проглотил Хранителя.\"\n\n#. Key:\tUI_EndScreen_entry_5_text_2\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(5).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(5).EndingLogic.Texts(2).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Some believed he survived but no one ever met him again.\"\nmsgstr \"Некоторые верили, что он выжил, но никто его больше не видел.\"\n\n#. Key:\tUI_EndScreen_entry_6_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(6).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(6).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"With his quest completed Monk decided to look for another activity.\"\nmsgstr \"Завершив свое задание, Монах решил поискать другое занятие.\"\n\n#. Key:\tUI_EndScreen_entry_6_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(6).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(6).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"<Quote>‘If I could resist madness, shouldn't others be able to do the same?’</>- he wondered.\"\nmsgstr \"<Quote>”Если я могу противостоять безумию, другие смогут сделать то же самое.”</> - подумал он.\"\n\n#. Key:\tUI_EndScreen_entry_7_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(7).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(7).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"To the surprise of many Teachy also joined Monk and soon he became his best student.\"\nmsgstr \"К удивлению многих Ученый также присоединился к Монаху, и вскоре он стал его лучшим учеником.\"\n\n#. Key:\tUI_EndScreen_entry_7_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(7).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(7).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"<Quote>‘To be honest I never actually wanted to be a teacher‘</> - said Teachy.\"\nmsgstr \"<Quote>”Честно говоря, я никогда на самом деле не хотел быть ученым”</> - сказал Ученый.\"\n\n#. Key:\tUI_EndScreen_entry_7_text_2\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(7).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(7).EndingLogic.Texts(2).Texts\nmsgctxt \"EndScreen\"\nmsgid \"<Quote>'I also knew that I was a bit mad and since for my insane mind training in a monastery looked like a crazy idea I immediately knew that in fact that's the most sane thing to do.’</>\"\nmsgstr \"<Quote>”Я также знал, что я слегка безумен, и так как для моего безумного ума обучение в монастыре выглядело как сумасшедшая идея, я сразу же понял, что на самом деле это самая разумная вещь.”</>\"\n\n#. Key:\tUI_EndScreen_entry_8_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(8).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(8).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Losing his connection to his master, Raven had to think again about his purpose.\"\nmsgstr \"Потеряв связь со своим мастером, Ворон был вынужден подумать еще раз о своей цели.\"\n\n#. Key:\tUI_EndScreen_entry_8_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(8).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(8).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"<Quote>‘I think therefore I am not a bird’</> - he said.\"\nmsgstr \"<Quote>”Думаю, поэтому я не птица”</> - сказал он.\"\n\n#. Key:\tUI_EndScreen_entry_8_text_2\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(8).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(8).EndingLogic.Texts(2).Texts\nmsgctxt \"EndScreen\"\nmsgid \"With his vast experience he couldn’t become the same thoughtless bird he once was.\"\nmsgstr \"Со своим огромным опытом он не мог стать такой же легкомысленной птицей, какой когда-то был.\"\n\n#. Key:\tUI_EndScreen_entry_8_text_3\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(8).EndingLogic.Texts(3).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(8).EndingLogic.Texts(3).Texts\nmsgctxt \"EndScreen\"\nmsgid \"He joined Monk’s monastery to teach philosophy.\"\nmsgstr \"Он присоединился к монастырю Монаха, чтобы преподавать философию.\"\n\n#. Key:\tUI_EndScreen_entry_8_text_4\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(8).EndingLogic.Texts(4).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(8).EndingLogic.Texts(4).Texts\nmsgctxt \"EndScreen\"\nmsgid \"In his free hours he kept on studying the Ancient’s technology hoping that one day he will find a way back to Lillian.\"\nmsgstr \"В свободное время он продолжал изучать технологию Древних в надежде, что однажды он найдет путь обратно к Лилиан.\"\n\n#. Key:\tUI_EndScreen_entry_9_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(9).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(9).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"When the soup was almost ready the Pipe Walkers smelled the flavour and they all gathered for a last dinner.\"\nmsgstr \"Когда суп был почти готов, Трубоходики почувствовали запах, и все собрались за последним ужином.\"\n\n#. Key:\tUI_EndScreen_entry_9_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(9).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(9).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"After lunch they started to talk.\"\nmsgstr \"После ужина они начали разговаривать.\"\n\n#. Key:\tUI_EndScreen_entry_9_text_2\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(9).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(9).EndingLogic.Texts(2).Texts\nmsgctxt \"EndScreen\"\nmsgid \"One of the Pipe Walkers, who had been in many cages mentioned that she actually met some kobolds far away.\"\nmsgstr \"Одна из Трубоходиков, которая была во многих клетках, упомянула, что она на самом деле встретила несколько коболдов вдали отсюда.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_0_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(0).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(0).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"By the time the furious crowd broke into the Wizard’s Castle the Device was completely destroyed.\"\nmsgstr \"К тому времени, как разъяренная толпа ворвалась в замок Волшебника, Устройство было полностью уничтожено.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_0_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(0).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(0).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Some left, others started to investigate the building hoping to find something which might stop Ruin.\"\nmsgstr \"Одни ушли, другие начали расследование здания в надежде найти что-нибудь, что могло бы остановить Руин.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_10_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(10).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(10).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"<Quote>‘Kobolds reserved the ancient knowledge in their rituals’</> Golem Maker said. <Quote>‘If there is something we can do with Ruin it must be connected to the rituals. I’ll go with you.’</>\"\nmsgstr \"<Quote> “Коболды хранили древние знания в своих ритуалах” </> - сказал Создатель Големов. <Quote>”Если есть что-то, что мы можем сделать с Руином, это должно быть связано с ритуалами. Я пойду с тобой.”</>\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_10_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(10).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(10).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Golem Maker was a huge help to Lillian with his knowledge on Golemology and it was not easy for Lillian to let him go.\"\nmsgstr \"Создатель Големов оказал огромную помощь Лилиан своими знаниями по Големологии, и Лилиан было нелегко отпустить его.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_10_text_2\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(10).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(10).EndingLogic.Texts(2).Texts\nmsgctxt \"EndScreen\"\nmsgid \"<Quote>‘Have no fear!’</> Golem Maker said. <Quote>‘I will return with even more knowledge and we’ll stop Ruin once and for all.’</>\"\nmsgstr \"<Quote>”Не бойся!”</> - сказал Создатель Големов. <Quote>”Я вернусь с более глубокими знаниями, и мы остановим Руин раз и навсегда.”</>\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_11_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(11).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(11).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"After Kobold Chef left, Supper Dwarf had to take care of the kitchen.\"\nmsgstr \"После ухода Повара Коболда, Гному Едуну пришлось позаботиться о кухне.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_11_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(11).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(11).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"It turned out that he is also really talented at making food.\"\nmsgstr \"Оказалось, что он также очень талантлив в приготовлении еды.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_11_text_2\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(11).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(11).EndingLogic.Texts(2).Texts\nmsgctxt \"EndScreen\"\nmsgid \"<Quote> ‘That is because I know exactly what the final result should be’</> he explained.\"\nmsgstr \"<Quote> “Это потому, что я точно знаю, каким должен быть итог”</> объяснил он.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_11_text_3\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(11).EndingLogic.Texts(3).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(11).EndingLogic.Texts(3).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Later he opened a restaurant which soon became really popular.\"\nmsgstr \"Позже он открыл ресторан, который вскоре стал очень популярным.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_11_text_4\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(11).EndingLogic.Texts(4).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(11).EndingLogic.Texts(4).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Some say mostly because he hired Pipe Walkers to serve the meal and for marketing purposes.\"\nmsgstr \"Некоторые говорят, что в основном потому, что он нанял Трубоходиков, чтобы они подавали еду и в маркетинговых целях.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_12_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(12).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(12).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Monk decided to stay in the Ruined Realm.\"\nmsgstr \"Монах решил остаться в Разрушенном Царстве.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_12_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(12).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(12).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"<Quote>‘Even if it was not enough I did all I could. I’m done.’</> he said.\"\nmsgstr \"<Quote>“Даже если этого было недостаточно, я сделал все, что смог. С меня хватит.”</> сказал он.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_12_text_2\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(12).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(12).EndingLogic.Texts(2).Texts\nmsgctxt \"EndScreen\"\nmsgid \"He sat down on a mountaintop and started meditating.\"\nmsgstr \"Он сел на вершину горы и начал медитировать.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_13_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(13).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(13).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"A few weeks later he realized that even though he failed his quest he still should do something.\"\nmsgstr \"Несколько недель спустя он понял, что не смотря на то, что он провалил свое задание, он все равно должен что-то сделать.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_13_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(13).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(13).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"<Quote>‘Due to my training I can resist Ruin’</> he thought. <Quote>‘No one has ever seen what’s there where Ruin destroyed the lands. If I train harder I might be able to get closer to Ruin to see what it really is.’</>\"\nmsgstr \"<Quote>”Благодаря моей подготовке я могу сопротивляться Руину”</> он подумал. <Quote>”Никто никогда не видел, что именно там, где Руин уничтожил земли. Если я буду тренироваться сильнее, я смогу приблизиться к Руину, чтобы увидеть, что это такое на самом деле.”</>\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_13_text_2\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(13).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(13).EndingLogic.Texts(2).Texts\nmsgctxt \"EndScreen\"\nmsgid \"He kept on practising and soon set out on a journey into the heart of Ruin to find answers to questions even he didn’t know.\"\nmsgstr \"Он продолжал практиковаться и вскоре отправился в путешествие в сердце Руина, чтобы найти ответы на вопросы, которые даже он не знал.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_14_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(14).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(14).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Lory and Gnory suddenly found themselves in a world full of possible customers.\"\nmsgstr \"Лори и Гнори внезапно оказались в мире, полном возможных клиентов.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_14_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(14).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(14).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Of course it didn’t mean they stopped arguing on who undermined whose business but finally they both had the chance to run a successful trading company.\"\nmsgstr \"Конечно, это не означало, что они перестали спорить о том, кто чей бизнес подрывает, но, в конце концов, у них обоих появился шанс управлять успешной коммерческой компанией.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_15_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(15).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(15).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Gnory specialized himself in selling medicine which were said to heal the sickness which was spreading as Ruin reached closer.\"\nmsgstr \"Гнори специализировался на продаже лекарств, которые, как утверждалось, исцеляли болезнь, которая распространялась по мере приближения Руина.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_15_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(15).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(15).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Lory specialized in medicine which were said to heal the sickness which was caused by the medicine of Gnory.\"\nmsgstr \"Лори специализировался на лекарствах, которые, по словам Лори, исцеляли болезнь, вызванную медициной Гнория.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_16_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(16).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(16).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Lory’s herbaria worked out.\"\nmsgstr \"Гербарии Лори хорошо сработали.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_16_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(16).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(16).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Soon she started to sell other medicine and healing devices as well.\"\nmsgstr \"Вскоре она начала продавать и другие лекарства и целебные средства.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_17_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(17).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(17).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"As for Gnory, he decided to sell lots of different things in the City Prison which turned out to be his new home for a while.\"\nmsgstr \"Что касается Гнори, то он решил продавать много разных вещей в городской тюрьме, которая на некоторое время оказалась его новым домом.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_18_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(18).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(18).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Fishy didn’t like the medicine business so he left Gnory.\"\nmsgstr \"Фиши не понравился медицинский бизнес, поэтому он ушел от Гнори.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_18_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(18).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(18).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"He joined Monk for a while to learn the mental training techniques which reserved Monk’s sanity.\"\nmsgstr \"Он присоединился к Монаху на некоторое время, чтобы научиться техникам психологической подготовки, которые сохранили здравомыслие Монаха.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_18_text_2\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(18).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(18).EndingLogic.Texts(2).Texts\nmsgctxt \"EndScreen\"\nmsgid \"<Quote>‘Fishy think it is important’ </>he said.<Quote> ‘If Monk go to see Ruin, Fishy need to learn it.’</>\"\nmsgstr \"<Quote>”Фиши думать, это важно” </> сказал он.<Quote> “Если Монах идти к Руину, Фиши нужно это выучить”. </>\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_18_text_3\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(18).EndingLogic.Texts(3).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(18).EndingLogic.Texts(3).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Monk accepted Fishy as his apprentice and taught him all that was possible.\"\nmsgstr \"Монах принял Фиши как ученика и научил его всему, что было возможно.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_18_text_4\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(18).EndingLogic.Texts(4).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(18).EndingLogic.Texts(4).Texts\nmsgctxt \"EndScreen\"\nmsgid \"<Quote>‘Now is the time’</> Monk said one day. <Quote>’Go to the Human Realm and prepare the people.’</>\"\nmsgstr \"<Quote>”Время пришло”</> - сказал Монах однажды. <Quote>”Отправляйся в Человеческое Царство и подготовь людей.” </>\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_19_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(19).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(19).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"On his way to the Human Realm Fishy heard a faint excited voice:\"\nmsgstr \"По дороге в Человеческое царство Фиши услышал слабый взволнованный голос:\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_19_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(19).EndingLogic.Texts(1).Texts\n#. Key:\tUI_EndScreen_entry_16_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(16).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(16).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(19).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"<Quote>‘Hey there! I’m fed up with microtransactions. Can I go with ya man?’</>\"\nmsgstr \"<Quote>”Слышь! Я сыт по горло микротранзакциями. Могу я пойти с тобой, чувак?”</>\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_19_text_2\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(19).EndingLogic.Texts(2).Texts\n#. Key:\tUI_EndScreen_entry_16_text_2\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(16).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(16).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(19).EndingLogic.Texts(2).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Merch Ant and Fishy soon became best friends and ventured on together.\"\nmsgstr \"Торгаш и Фиши вскоре стали лучшими друзьями и отважились работать вместе.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_1_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(1).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(1).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"A few hours later members of the Mage Council arrived along with the city guards.\"\nmsgstr \"Через несколько часов прибыли члены Совета Магов вместе с городской стражей.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_1_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(1).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(1).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"The Council claimed that Wizard died in an unfortunate accident, his device could never actually work anyway and Ruin is nothing to fear of.\"\nmsgstr \"Совет утверждал, что Волшебник погиб в несчастном случае, его устройство все равно никогда не сможет реально работать, и Руина бояться нечего.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_1_text_2\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(1).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(1).EndingLogic.Texts(2).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Although it was total nonsense Lillian and Scholar was happy that the crowd were taken away from the Castle.\"\nmsgstr \"Хотя это была полная чушь, Лилиан и Профессор были счастливы, что толпу увели из замка.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_20_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(20).EndingLogic.Texts(0).Texts\n#. Key:\tUI_EndScreen_entry_17_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(17).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(17).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(20).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"The World was still about to end, but as one Pipe Walker wisely said:\"\nmsgstr \"Конец света все еще был близок, но, как мудро сказал один Трубоходик:\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_21_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(21).EndingLogic.Texts(0).Texts\n#. Key:\tUI_EndScreen_entry_18_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(18).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(18).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(21).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"As some stories ended some new ones begun. Though what happened afterwards is not yet known.\"\nmsgstr \"По мере того, как заканчиваются некоторые истории, начинаются новые. Хотя то, что случилось потом, еще не известно.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_2_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(2).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(2).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"When they were left alone they quickly started the evacuation of the Ruined Realm.\"\nmsgstr \"Когда их оставили в покое, они быстро начали эвакуацию Разрушенного Царства.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_3_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(3).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(3).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Even though she lost her father Lillian couldn’t afford to let sadness overcome her.\"\nmsgstr \"Несмотря на то, что она потеряла отца, Лилиан не могла позволить грусти преодолеть ее.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_3_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(3).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(3).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Ruin was more of a threat now than ever before, and since the Mage Council didn’t believe in Ruin it was the task of Lillian and Scholar to repair the device.\"\nmsgstr \"Руин сейчас более опасен, чем когда-либо прежде, и поскольку Совет Магов не верил в Руин, задача Лиллиан и Профессора состояла в том, чтобы починить устройство.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_4_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(4).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(4).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Scholar was really proud of Lillian because she managed to save time for the evacuation.\"\nmsgstr \"Профессор очень гордился Лилиан, потому что ей удалось выиграть немного времени на эвакуацию.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_4_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(4).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(4).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"<Quote>‘I know Wizard would have disagreed but you did the right thing. We still have time to face Ruin. We couldn’t let everyone die there.’</>\"\nmsgstr \"<Quote>“Я знаю, что Волшебник не согласился бы, но ты поступила правильно. У нас еще есть время сразиться с Руином. Мы не могли позволить всем умереть там.”</>\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_5_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(5).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(5).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"As time passed Scholar started to behave a bit odd which made Lillian really anxious.\"\nmsgstr \"Со временем Профессор начал вести себя немного странно, что сильно встревожило Лилиан.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_5_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(5).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(5).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Ruin was close and the solution was still far away.\"\nmsgstr \"Руин был близко, а решение все еще не найдено.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_5_text_2\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(5).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(5).EndingLogic.Texts(2).Texts\nmsgctxt \"EndScreen\"\nmsgid \"When she talked about her concerns to Raven, the bird said:\"\nmsgstr \"Когда она рассказала о своих проблемах Ворону, птица сказала:\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_5_text_3\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(5).EndingLogic.Texts(3).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(5).EndingLogic.Texts(3).Texts\nmsgctxt \"EndScreen\"\nmsgid \"<Quote>‘Focus on what you are doing Lillian. He was a bit odd anyway.’</>\"\nmsgstr \"<Quote>”Сосредоточься на том, что ты делаешь, Лилиан. Он все равно был немного странным.”</>\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_6_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(6).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(6).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"To the surprise of many Teachy turned out to be an excellent researcher.\"\nmsgstr \"К удивлению многих Ученый оказался отличным исследователем.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_6_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(6).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(6).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"<Quote>‘To be honest I never wanted to be a teacher’ </>he said. <Quote>‘I only stayed at University so that I can do some more research work. But my students never let me research during lectures.’</>\"\nmsgstr \"<Quote>“Честно говоря, я никогда не хотел быть ученым”</>- сказал он.<Quote>”Я остался в университете только для того, чтобы заниматься исследовательской работой. Но мои студенты никогда не позволяли мне заниматься исследованиями во время лекций”.</>\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_6_text_2\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(6).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(6).EndingLogic.Texts(2).Texts\nmsgctxt \"EndScreen\"\nmsgid \"He joined Lillian and dug into every book he could possibly find on the Ancient’s technology.\"\nmsgstr \"Он присоединился к Лилиан и изучил каждую книгу о технологии Древних.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_7_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(7).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(7).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"The new environment and being a bit further from Ruin made good to the Gate Keeper.\"\nmsgstr \"Новое окружение и находясь вдали от Руина, принесло пользу Хранителю Врат.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_7_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(7).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(7).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"He organized some of the cleaners to repair the Castle so that Lillian can keep on with her work.\"\nmsgstr \"Он собрал несколько уборщиков для ремонта Замка, чтобы Лилиан могла продолжить свою работу.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_7_text_2\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(7).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(7).EndingLogic.Texts(2).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Later he started to remember things from the Runic Realm which helped Lillian a lot.\"\nmsgstr \"Позже он начал вспоминать вещи из Рунического Царства, которые очень помогли Лилиан.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_8_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(8).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(8).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"One day a Pipe Walker, who had been in many cages mentioned that she met some kobolds far away who might be other survivors of the Kobold Chef’s tribe.\"\nmsgstr \"Однажды одна из Трубоходиков, которая была во многих клетках, упомянула, что она встретила несколько коболдов вдали отсюда, которые могли быть другими выжившими из племени Повара Коболда.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_9_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(9).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(9).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Hearing this news made Kobold Chef really excited.\"\nmsgstr \"Услышав эти новости, Повар Коболд очень обрадовался.\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_9_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(9).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(9).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"He decided to return to the Ruined Realm and search for his lost relatives.\"\nmsgstr \"Он решил вернуться в Разрушенное Царство и заняться поиском своих потерянных родственников.\"\n\n#. Key:\tSoAct1_EG_AAFirstDroneTrio_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Drones were even more intelligent than Maintainers. They not only memorized texts, they helped correct grammar, changed the message if it was too insulting or even made up poems if they were asked to do so.\"\nmsgstr \"Дроны были гораздо умнее, чем Прислужники. Они не только запоминали тексты, но и помогали исправлять грамматику, меняли послание, если оно было слишком оскорбительным и даже придумывали стихи, если их об этом просили.\"\n\n#. Key:\tSoAct1_EG_AAFirstDroneTrio_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"The Flying Three\"\nmsgstr \"Летающая Тройка\"\n\n#. Key:\tSoAct1_EG_AfterGateCleaners_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Citizens of Cerulean requested to have their own unique Golems, but it was always rejected. This situation was very good for the Black Golem Market, because this way it was always easy to find customers.\"\nmsgstr \"Жители Лазурного города просили, чтобы у них был свой уникальный Голем, но это всегда отвергалось. Эта ситуация была очень выгодна для Черного рынка Големов, потому что таким образом всегда было легко найти клиентов.\"\n\n#. Key:\tSoAct1_EG_AfterGateCleaners_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Cleaners of Cerulean\"\nmsgstr \"Уборщики Лазурного Города\"\n\n#. Key:\tSoAct1_EG_AfterGateElits_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"The Runic Realm's Government didn't allow the Golems to become the privilege of the rich. Even though the elite were not allowed to have different Golems they always found a way to make their servants different than the ones owned by the poor.\"\nmsgstr \"Правительство Рунического царства не позволило Големам стать привилегией богатых. Несмотря на то, что элите не разрешалось иметь разных големов, она всегда находила способ отличать своих слуг от бедных.\"\n\n#. Key:\tSoAct1_EG_AfterGateElits_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Capetainers\"\nmsgstr \"Кэпслужники\"\n\n#. Key:\tSoAct1_EG_AGRightFromPortal_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"'Just keep cleaning! Cleaning, cleaning...'\"\nmsgstr \"“Просто продолжай убирать! Убирать, убирать…”\"\n\n#. Key:\tSoAct1_EG_AGRightFromPortal_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Cleaner Invasion\"\nmsgstr \"Нашествие Уборщиков\"\n\n#. Key:\tSoAct1_EG_AGTestStoneCircle_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"The Black Golem Market was funded by a Golem Maker apprentice who failed his master exam and was banished from school. No wonder his golems were... unique.\"\nmsgstr \"Черный рынок Големов финансировался бывшим учеником Создателя Големов, который провалил экзамен на звание мастера и был изгнан из школы. Неудивительно, что его големы были… уникальны.\"\n\n#. Key:\tSoAct1_EG_AGTestStoneCircle_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Weird Golems\"\nmsgstr \"Чудные Големы\"\n\n#. Key:\tSoAct1_EG_AGWallJumpTeam_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"The cleaning plan for this area fell apart with the participants.\"\nmsgstr \"План уборки этой территории разделился между участниками.\"\n\n#. Key:\tSoAct1_EG_AGWallJumpTeam_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"The North Team\"\nmsgstr \"Команда Севера\"\n\n#. Key:\tSoAct1_EG_ArcadeDungeonCleaners_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"The Golem's behaviour was specified by the Golem Makers. Only very simple personalities were made at the beginning. The Cleaners, for example, only desired to keep the place tidy and make sure they don't harm the people.\"\nmsgstr \"Поведение Големов было определено Создателями Големов. В начале были созданы только очень простые личности. Уборщики, например, хотели только, чтобы место было опрятным и чтобы они не навредили людям.\"\n\n#. Key:\tSoAct1_EG_ArcadeDungeonCleaners_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Arcade Cleaners\"\nmsgstr \"Аркадные Уборщики\"\n\n#. Key:\tSoAct1_EG_ArcadeDungeonExit_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"After creating intelligence Golem Makers wanted even more. They wanted complex personality. They wanted Golems that can not only think but also feel. That was the idea behind designing the Gatekeepers.\"\nmsgstr \"После создания интеллекта создатели големов хотели еще большего. Они хотели сложные личности. Они хотели Големов, способных не только думать, но и чувствовать. Такова была идея при создании Хранителей Врат.\"\n\n#. Key:\tSoAct1_EG_ArcadeDungeonExit_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Arcade Servants\"\nmsgstr \"Слуги Аркады\"\n\n#. Key:\tSoAct1_EG_ArcadeDungeonOptional_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"You might wonder if a Vacuum Cleaner is designed to clean dust away why does it need a laser caster?\"\nmsgstr \"Может быть, вы задаетесь вопросом, если Пылесосун предназначен для очистки от пыли, зачем ему нужен лазерный затвор?\"\n\n#. Key:\tSoAct1_EG_ArcadeDungeonOptional_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Vacuum Cleaners group\"\nmsgstr \"Группа Пылесосунов\"\n\n#. Key:\tSoAct1_EG_ArcadeMaintainers_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"The very first Golems were made to do the most monotonic work so that people have more time to think and to create. Once they were friendly but as Ruin came their behaviour changed.\"\nmsgstr \"Самые первые Големы были созданы для того, чтобы сделать самую монотонную работу, чтобы у людей было больше времени на размышления и творчество. Когда-то они были дружелюбны, но с наступлением Руина их поведение изменилось.\"\n\n#. Key:\tSoAct1_EG_ArcadeMaintainers_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Arcade Cleaner Golems\"\nmsgstr \"Аркадные Големы-Уборщики\"\n\n#. Key:\tSoAct1_EG_Chest_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"The poor chest was minding his own business before you started to insult him.\"\nmsgstr \"Бедный сундук занимался своими делами до того, как ты начал его оскорблять.\"\n\n#. Key:\tSoAct1_EG_Chest_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Chest\"\nmsgstr \"Сундук\"\n\n#. Key:\tSoAct1_EG_GGMiniBoss_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Maybe it only depends on the creation process, but some Golems had stronger personality. In general, Golems with more intelligence resisted Ruin longer and Golems with strong personality were more vulnerable to the infection.\"\nmsgstr \"Может быть, это зависит только от процесса создания, но у некоторых Големов была более сильная личность. В целом, големы с более развитым интеллектом дольше сопротивлялись Руину, а големы с сильной личностью были более уязвимы к инфекции.\"\n\n#. Key:\tSoAct1_EG_GGMiniBoss_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Wickeds\"\nmsgstr \"Злыдни\"\n\n#. Key:\tSoAct1_EG_LoneDrone_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Drones delivered messages and gifts before Ruin. People were happy when they heard them approaching back then.\"\nmsgstr \"До Руина Дроны доставляли сообщения и подарки. Тогда люди были счастливы, когда слышали, как они приближались.\"\n\n#. Key:\tSoAct1_EG_LoneDrone_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Lone Drone\"\nmsgstr \"Одинокий Дрон\"\n\n#. Key:\tSoAct1_EG_LoneSewerDrone_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"After Ruin most Golems liked to group together. Only a few chose to stay alone.\"\nmsgstr \"После Руина большинству Големов нравилось собираться вместе. Лишь немногие решили остаться в одиночестве.\"\n\n#. Key:\tSoAct1_EG_LoneSewerDrone_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Another Lone Drone\"\nmsgstr \"Другой Одинокий Дрон\"\n\n#. Key:\tSoAct1_EG_MaceGroup_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"'Attention: our enemies greatest weapon, the holy Mace is stolen. We truly should have destroyed it as the Council suggested.'\"\nmsgstr \"“Внимание: величайшее оружие наших врагов, Святая Булава была похищена. Мы действительно должны были уничтожить ее, как Совет и предлагал”.\"\n\n#. Key:\tSoAct1_EG_MaceGroup_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Mace Defenders\"\nmsgstr \"Защитники Булавы\"\n\n#. Key:\tSoAct1_EG_MaintainerInvestigatorInvestigators_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"After Ruin, Golems started to have strange behavior. There were a group of them who used the pipes to flood a part of the City. Later these places were called the Sewer.\"\nmsgstr \"После Руина Големы начали вести себя странно. Была группа, которая использовала трубы, чтобы затопить часть города. Позже эти места стали называться Канализацией.\"\n\n#. Key:\tSoAct1_EG_MaintainerInvestigatorInvestigators_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Pipe Golems\"\nmsgstr \"Големы Труб\"\n\n#. Key:\tSoAct1_EG_MaintainerInvestigators_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Not only the Golems were created by using the Spirits of the Unknown World before Ruin. People found other ways of using this new technology. They created pipes to convey hot water to heat the city and cold water to drink.\"\nmsgstr \"Не только Големы были созданы с помощью Духов Неизвестного Мира до Руина. Люди нашли другие способы использования этой новой технологии. Они создали трубы для подачи горячей воды для обогрева города и холодной воды для питья.\"\n\n#. Key:\tSoAct1_EG_MaintainerInvestigators_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Maintainers of the Pipes\"\nmsgstr \"Прислужники Труб\"\n\n#. Key:\tSoAct1_EG_SABeforeWallJump_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Some believed cold can resist Ruin longer than magic. They created places where they kept the temperature beneath the freezing point. As it turned out, not even coldness can resist Ruin forever.\"\nmsgstr \"Некоторые считали, что холод может сопротивляться Руину дольше, чем магия. Они создавали места, где поддерживали температуру ниже нуля. Как оказалось, даже холод не может противостоять Руину вечно.\"\n\n#. Key:\tSoAct1_EG_SABeforeWallJump_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Cleaners of the Refrigerator.\"\nmsgstr \"Уборщики Холодильника.\"\n\n#. Key:\tSoAct1_EG_SAFightMustHave_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"'We won't clear anymore!' said the rebel Maintainer.\\r\\n'Let's declear War!'\"\nmsgstr \"\"\n\n#. Key:\tSoAct1_EG_SAFightMustHave_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Underground Cleaner Band\"\nmsgstr \"Подземная Банда Уборщиков\"\n\n#. Key:\tSoAct1_EG_SAFightOptional_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"'Let's make something clear. Maybe this room?'\"\nmsgstr \"“Давайте кое-что прочистим. Может, в эту комнату?”\"\n\n#. Key:\tSoAct1_EG_SAFightOptional_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Underground Cleaner Band B\"\nmsgstr \"Подземная Банда Уборщиков Б\"\n\n#. Key:\tSoAct1_EG_SewerCircleVacuumCleaners_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"People realised that Golem's Spirits have a power beyond imagination. They called it the Ancient Magic. Vacuum Cleaners could use this magic to do their job even better.\"\nmsgstr \"Люди поняли, что Духи Големов обладают силой, превосходящей воображение. Они называли это Древней Магией. Пылесосуны могли использовать эту магию, чтобы сделать свою работу еще лучше.\"\n\n#. Key:\tSoAct1_EG_SewerCircleVacuumCleaners_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Vacuum Cleaners\"\nmsgstr \"Пылесосуны\"\n\n#. Key:\tSoAct1_EG_SewerTeam_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Golem Makers wanted to create something more intelligent as they learned more. They shaped the Maintainers, the first golems capable of talking. Sadly their intelligence vanished as Ruin came.\"\nmsgstr \"Голомские создатели хотели создать что-то более умное, по мере того, как они узнавали больше. Они разработали Прислужников, первых големов, способных разговаривать. К сожалению, их интеллект исчез, когда Руин наступил.\"\n\n#. Key:\tSoAct1_EG_SewerTeam_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Sewer Golems\"\nmsgstr \"Канализационные Големы\"\n\n#. Key:\tSoAct1_EG_TL_VacuumTwins_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Libraries were important in the life of the former Realm's citizens. No wonder that many of the golems were created only to dust and organize the books.\"\nmsgstr \"Библиотеки играли важную роль в жизни бывших жителей царства. Неудивительно, что многие големы создавались только для того, чтобы пылиться и организовывать книги.\"\n\n#. Key:\tSoAct1_EG_TL_VacuumTwins_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Library Cleaners\"\nmsgstr \"Уборщики Библиотеки\"\n\n#. Key:\tSoAct1_EG_TLSewerCreatureWatch_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Golems never ever attacked the Pipe Walkers. The reason is only known by the wisest Pipe Walker himself. It is because, as he explained: 'Nun dara bum, tuk la.'\"\nmsgstr \"Големы никогда не нападали на Трубоходиков. Причина известна только самому мудрому Трубоходику. Это потому, что, как он объяснил: “ Нун Дара Бум, тук ла”.\"\n\n#. Key:\tSoAct1_EG_TLSewerCreatureWatch_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Sewer Team B\"\nmsgstr \"Канализационная команда Б\"\n\n#. Key:\tSoAct1_EG_TowerTrio_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"They spent most of their time on the top of those towers - it was clear to me that they would die there as well.\"\nmsgstr \"Большую часть времени они провели на вершине этих башен - мне было ясно, что они бы там и умерли.\"\n\n#. Key:\tSoAct1_EG_TowerTrio_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"The Tower Trio\"\nmsgstr \"Башня Трио\"\n\n#. Key:\tSoAct2_EG_BounceTrio_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Lava Jumpers are former Golems who fell into the lava. Some of them return to join their former Golem companions.\"\nmsgstr \"Лава Прыгуны - это бывшие Големы, которые упали в лаву. Некоторые из них возвращаются, чтобы присоединиться к своим бывшим големовским товарищам.\"\n\n#. Key:\tSoAct2_EG_BounceTrio_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Bounce Trio\"\nmsgstr \"Прыжок Трио\"\n\n#. Key:\tSoAct2_EG_C_BeforeKey_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"It's still unclear what makes some creatures touched by Ruin to group together. Some believes those who had similar emotions when Ruin came were likely to form a group.\"\nmsgstr \"До сих пор неясно, что заставляет некоторых существ, тронутых Руином, группироваться. Некоторые считают, что те, у кого были похожие эмоции, когда Руин пришел, скорее всего, сформировали группу.\"\n\n#. Key:\tSoAct2_EG_C_BeforeKey_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Anxious Armours\"\nmsgstr \"Тревожные Доспехи\"\n\n#. Key:\tSoAct2_EG_C_Bridge_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Crafting was always the obsession of Dwarves. In their workshops they forged mighty weapons and wondrous armours. Their love for their craft was so strong that instead of their body, Ruin preserved their iron works.\"\nmsgstr \"Мастерство всегда было навязчивой идеей Гномов. В своих мастерских они ковали могучее оружие и чудесные доспехи. Их любовь к своему ремеслу была настолько сильна, что вместо тела Руин сохранил их железные изделия.\"\n\n#. Key:\tSoAct2_EG_C_Bridge_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Bridge Brigade\"\nmsgstr \"Мостовая Бригада\"\n\n#. Key:\tSoAct2_EG_C_LoneShadeSphere_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Before Ruin there was no other humanoid race but human. New races are created by Ruin's Shades. They roam the lands looking for any living being which they can possess. Once they become part of a creature its body will start to change.\"\nmsgstr \"До Руина не было никакой другой гуманоидной расы, кроме человека. Новые расы создаются “ Руинскими Тенями”. Они бродят по землям в поисках любого живого существа, которым они могут владеть. Как только они становятся частью существа, его тело начинает меняться.\"\n\n#. Key:\tSoAct2_EG_C_LoneShadeSphere_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Weird Floating Thing\"\nmsgstr \"Странная Парящая Штука\"\n\n#. Key:\tSoAct2_EG_C_OfficeGuards_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Watching the only way to the Office did not bring enough protection. If any intruder managed to pass the Patrols he still had to face the Guardians to proceed.\"\nmsgstr \"Просто смотреть единственный путь в офис было, конечно, не достаточно для защиты. Если злоумышленнику удавалось пройти мимо патрулей, ему все равно приходилось сталкиваться со Стражами, чтобы пройти дальше.\"\n\n#. Key:\tSoAct2_EG_C_OfficeGuards_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Guardians of the Law\"\nmsgstr \"Стражи Закона\"\n\n#. Key:\tSoAct2_EG_C_OfficePatrols_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Going into the Law's High Office was forbidden even for most of the Dwarves. Only one path lead to the Office and that was guarded by the Patrols.\"\nmsgstr \"Вход в Высший Офис Закона был запрещен даже большинству Гномов. Только один путь ведет к Офису и он охраняется Патрулями.\"\n\n#. Key:\tSoAct2_EG_C_OfficePatrols_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Patrols of the Law\"\nmsgstr \"Патрули закона\"\n\n#. Key:\tSoAct2_EG_DG_Left_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Deep beneath the Catacombs there is a secret place called the Dwarven Gate. Elite dwarves who worked here were placed above the Law. They were seeking a way to fight Ruin with Ruin's magic.\"\nmsgstr \"Глубоко под Катакомбами есть секретное место, называемое Гномовые ворота. Элитные гномы, которые здесь работали, были поставлены выше Закона. Они искали способ бороться с Руином с помощью магии Руина.\"\n\n#. Key:\tSoAct2_EG_DG_Left_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Glorious Group\"\nmsgstr \"Великая группа\"\n\n#. Key:\tSoAct2_EG_DG_RightFloor_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Even though most of the common Dwarves never even heard about Dwarven Gate some were needed to do the hard work. Now that Ruin won, Dwarves are finally equal.\"\nmsgstr \"Несмотря на то, что большинство обычных Гномов никогда даже не слышали о Гномовых Вратах, некоторые из них были необходимы для выполнения тяжелой работы. Теперь, когда Руин выиграл, Гномы наконец-то стали равны.\"\n\n#. Key:\tSoAct2_EG_DG_RightFloor_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Not so Elite Dwarves\"\nmsgstr \"Не такие уж и Элитные Гномы\"\n\n#. Key:\tSoAct2_EG_DG_RightUpOptional_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"One idea of the Elite Dwarves was to create giant statues which are able to trap Ruin's essence. Even if they were right they never managed to make enough sculptures.\"\nmsgstr \"Одной из идей Элитных Гномов было создание гигантских статуй, способных заманить в ловушку сущность Руина. Даже если бы они и были правы, им так и не удалось создать достаточное количество скульптур.\"\n\n#. Key:\tSoAct2_EG_DG_RightUpOptional_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Sculptors\"\nmsgstr \"Скульпторы\"\n\n#. Key:\tSoAct2_EG_DwarfBoss_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Dwarven Statues were meant to imprison the essence of Ruin. However there were some Dwarven scientists who feared that the statues were not safe and in the long run they wouldn't be able to resist the power of Ruin...\"\nmsgstr \"Статуи Гномов должны были заточить сущность Руина. Однако некоторые Гномы-ученые опасались, что статуи небезопасны, и в конечном счете они не смогут устоять перед властью Руина…\"\n\n#. Key:\tSoAct2_EG_DwarfBoss_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Dwarven Statue\"\nmsgstr \"Статуя Гнома\"\n\n#. Key:\tSoAct2_EG_GolemFirst_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Stone Golems are the cheap copies of the Runic Realm Golems. If Ruin twists the creatures mind then it will definitely have no effect on these ones.\"\nmsgstr \"Каменный Голем - дешевая копия Рунического Царства Големов. Если Pуин искривляет разум существ, то она определённо не будет иметь никакого эффекта на этих существ.\"\n\n#. Key:\tSoAct2_EG_GolemFirst_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Sphere Golem\"\nmsgstr \"Сфера-Голем\"\n\n#. Key:\tSoAct2_EG_GolemSecond_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Looks like the second try is just as bad as the first one.\"\nmsgstr \"Похоже, что вторая попытка так же плоха, как и первая.\"\n\n#. Key:\tSoAct2_EG_GolemSecond_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Second Sphere Golem\"\nmsgstr \"Второй Сфера-Голем\"\n\n#. Key:\tSoAct2_EG_GolemThird_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Whoever made this Golem, he should have stopped after the second try.\"\nmsgstr \"Тот, кто создал этого Голема, должен был остановиться после второй попытки.\"\n\n#. Key:\tSoAct2_EG_GolemThird_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Third Sphere Golem\"\nmsgstr \"Третий Сфера-Голем\"\n\n#. Key:\tSoAct2_EG_HutFishies_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Now that the Fishys are gone, the Lake's piranhas can live in peace and eat whoever comes close.\"\nmsgstr \"Теперь, когда Фиши ушли, пираньи озера могут жить в мире и есть того, кто подойдет поближе.\"\n\n#. Key:\tSoAct2_EG_HutFishies_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Abandoned Fishy Slaves\"\nmsgstr \"Покинутые Фиши Рабы\"\n\n#. Key:\tSoAct2_EG_HutFlyArmy_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"No one knows where the Flies came from. Although you have a very clear idea on where they should go...\"\nmsgstr \"Никто не знает, откуда появились Мухи. Хотя у вас есть очень четкое представление о том, куда они должны отправиться…\"\n\n#. Key:\tSoAct2_EG_HutFlyArmy_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Annoying Flies\"\nmsgstr \"Раздражающие Мухи\"\n\n#. Key:\tSoAct2_EG_LavaBoss_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Armour Wrath was the most ambitious and majestic work of the Golem Maker. He used all his remaining strength to create this mighty Golem. It's a pity that all his efforts were in vain.\"\nmsgstr \"Броневой Гнев был самым амбициозным и величественным произведением Создателя Големов. Он использовал все свои оставшиеся силы, чтобы создать этого могучего Голема. Жаль, что все его усилия были напрасны.\"\n\n#. Key:\tSoAct2_EG_LavaBoss_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Armour Wrath\"\nmsgstr \"Броневой Гнев\"\n\n#. Key:\tSoAct2_EG_LavaDeepTeam_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"A fourth Sphere Golem? Someone never gives up...\"\nmsgstr \"Четвертый Сферо-Голем? Кто-то никогда не сдается…\"\n\n#. Key:\tSoAct2_EG_LavaDeepTeam_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Fourth Sphere Golem\"\nmsgstr \"Четвертый Сфера-Голем\"\n\n#. Key:\tSoAct2_EG_LavaJumpers_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"When a Golem falls into the lava its stone body will melt away. The spirit however resists the heat and will be looking for another body...\"\nmsgstr \"Когда голем падает в лаву, его каменное тело плавится. Однако дух сопротивляется жаре и будет искать другое тело…\"\n\n#. Key:\tSoAct2_EG_LavaJumpers_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Lava Jumpers\"\nmsgstr \"Лавовые Прыгуны\"\n\n#. Key:\tSoAct2_EG_LavaTeamX_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Divided they fall, united they divide...\"\nmsgstr \"Разделяя они падают, объединяясь, они делятся…\"\n\n#. Key:\tSoAct2_EG_LavaTeamX_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Golem Group\"\nmsgstr \"Группа Големов\"\n\n#. Key:\tSoAct2_EG_LavaTrio_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Wherever Golems go after death these three will go there together.\"\nmsgstr \"Куда бы Големы не пошли после смерти, эти трое пойдут туда вместе.\"\n\n#. Key:\tSoAct2_EG_LavaTrio_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Golem Trio\"\nmsgstr \"Троица Големов\"\n\n#. Key:\tSoAct2_EG_OutpostLeft_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"To keep Ruin away dwarves forbade everything related to Ruin's magic. This might have worked in theory but they failed to notice that their mechanical devices were also powered by Ruin.\"\nmsgstr \"Чтобы удержать Руина подальше, гномы запретили все, что связано с магией Руина. Это могло сработать в теории, но они не заметили, что их механические устройства также питались от Руина.\"\n\n#. Key:\tSoAct2_EG_OutpostLeft_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Guardians of the West Wall\"\nmsgstr \"Стражники Западной стены\"\n\n#. Key:\tSoAct2_EG_OutpostRight_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Ruin was not only meant for destruction, it could also preserve. Ruin gave endless life for those who survived at the cost of twisting their minds.\"\nmsgstr \"Руин предназначался не только для разрушения, но и для сохранения. Руин дал бесконечную жизнь тем, кто выжил ценой превращения в бездумных.\"\n\n#. Key:\tSoAct2_EG_OutpostRight_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Guardians of the East Wall\"\nmsgstr \"Стражники Восточной стены\"\n\n#. Key:\tSoAct2_EG_OutpostWallFirst_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Dwarves fought Ruin with Rules. These soldiers were ordered here to guard the Outpost. Their will to obey the order was so strong that even death couldn't break it.\"\nmsgstr \"Гномы сражались с Руином по правилам. Этим солдатам было приказано охранять заставу. Их воля подчиниться приказу была настолько сильна, что даже смерть не смогла его нарушить.\"\n\n#. Key:\tSoAct2_EG_OutpostWallFirst_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Patrols of the Outpost Wall\"\nmsgstr \"Патрули Заставы\"\n\n#. Key:\tSoAct2_EG_Shore_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"After Ruin turned them into Monsters some creatures gathered together. Whether it's the effect of Ruin or something from their former life is unclear.\"\nmsgstr \"После того, как Руин превратил их в монстров, некоторые существа собрались вместе. Будь то эффект Руина или что-то из их прежней жизни, неясно.\"\n\n#. Key:\tSoAct2_EG_Shore_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Shore Monsters\"\nmsgstr \"Береговые монстры\"\n\n#. Key:\tSoAct2_EG_SlideFishyTeam_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Fishys were produced by the Great Kobold tribe for slaves. Some of them managed to escape, but they couldn't go far from the Lake.\"\nmsgstr \"Фиши были созданы Великим Племенем Коболдов в качестве рабов. Некоторым из них удалось бежать, но они не могли уйти далеко от озера.\"\n\n#. Key:\tSoAct2_EG_SlideFishyTeam_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Deserter Fishys\"\nmsgstr \"Фиши Дезертиры\"\n\n#. Key:\tSoAct2_EG_SlidePathEnd_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Deserter Fishys always kept a Fishy group close to the exit of their secret hideout. They protected the others and watched the kobolds to find the right time to venture back to the Lake.\"\nmsgstr \"Фиши Дезертиры всегда держали группу Фиши близко к выходу из своего тайного укрытия. Они защищали остальных и наблюдали за коболдами, чтобы подобрать подходящее время, когда можно было бы вернуться к озеру.\"\n\n#. Key:\tSoAct2_EG_SlidePathEnd_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Patrol Fishys\"\nmsgstr \"Патрульные Фиши\"\n\n#. Key:\tSoAct2_EG_WormHole_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Worms kept distance from each other before Ruin. It's strange how a force which tears everything apart can also unite.\"\nmsgstr \"Черви держались на расстоянии друг от друга до Руина. Странно, как сила, которая разрывает все на части, может также соединить.\"\n\n#. Key:\tSoAct2_EG_WormHole_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Worms\"\nmsgstr \"Черви\"\n\n#. Key:\tSoAct2_EG_Wormy_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"There was a time when Worms only made damage to fields and gardens. Now they are a bit more ambitious...\"\nmsgstr \"Было время, когда Черви причиняли вред только полям и садам. Теперь они более амбициозны…\"\n\n#. Key:\tSoAct2_EG_Wormy_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Worm\"\nmsgstr \"Червь\"\n\n#. Key:\tSoAct2_EG_WWBoss_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"When Ruin appeared some decided to abandon civilization and return to nature. Their leader, the Fallen Druid cast an ancient spell to protect his plants from Ruin. His spell partly worked but at a terrible cost.\"\nmsgstr \"Когда появился Руин, некоторые решили отказаться от цивилизации и вернуться к природе. Их предводитель, Падший Друид наложил древнее заклинание, чтобы защитить свои растения от Руина. Его заклинание частично сработало, но ужасной ценой.\"\n\n#. Key:\tSoAct2_EG_WWBoss_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Fallen Druid\"\nmsgstr \"Падший Друид\"\n\n#. Key:\tSoAct3_EG_Act3BubbleGroundMain_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Ruin's power is not only in destruction. When it can't change something it will preserve those attributes which can prepare the possibility to change again. Ruin's power is in change.\"\nmsgstr \"Сила Руина не только в разрушении. Когда она не может что-то изменить, она сохраняет те атрибуты, которые могут подготовить возможность измениться снова. Сила Руина в изменении.\"\n\n#. Key:\tSoAct3_EG_Act3BubbleGroundMain_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Maintainer Spellcasters\"\nmsgstr \"Прислужники Заклинатели\"\n\n#. Key:\tSoAct3_EG_Act3FinalBattle_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Even though Ruin doesn't have consciousness nor the ability to think it somehow reacts to your presence. As if it knew the threat you present, Ruin tries all it can to stop you from leaving the Ruined Realm.\"\nmsgstr \"Несмотря на то, что Руин не имеет ни сознания, ни способности думать, он как-то реагирует на твое присутствие. Как будто оно знает угрозу, которую ты представляешь, Руин пытается сделать все возможное, чтобы помешать тебе покинуть Разрушенное Царство.\"\n\n#. Key:\tSoAct3_EG_Act3FinalBattle_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Ruined Convention\"\nmsgstr \"Разрушенная Конвенция\"\n\n#. Key:\tSoAct3_EG_Act3PipeGroupFirst_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"There is a difference between how Humans and Golems are transformed by Ruin. Human bodies reach their final form in a few decades but Golems never stop changing. There is always a new, more vicious type.\"\nmsgstr \"Есть разница между тем, как Руин преображает Людей и Големов. Человеческие тела достигают своей окончательной формы за несколько десятилетий, но Големы никогда не перестают меняться. Всегда есть новый, более злобный тип.\"\n\n#. Key:\tSoAct3_EG_Act3PipeGroupFirst_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Red Drones\"\nmsgstr \"Красные Дроны\"\n\n#. Key:\tSoAct3_EG_Act3PipeGroupSecond_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Transformation is relative to intelligence. Creatures with consciousness have a strong desire to reserve their ego. Ruin can fool them a few times but later they become invulnerable to Ruin's changing power.\"\nmsgstr \"Трансформация касается интеллекта. Существа с сознанием имеют сильное желание сохранить свое эго. Руин может обмануть их несколько раз, но позже они становятся неуязвимыми перед изменением от силы Руина.\"\n\n#. Key:\tSoAct3_EG_Act3PipeGroupSecond_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"More Drones\"\nmsgstr \"Больше Дронов\"\n\n#. Key:\tSoAct3_EG_Act3RangedCleanerTwins_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Ruin's nature is confusing for the human mind. It can build, it can destroy, it can use, it can be used. These actions have the same priority for Ruin. All that matters is that it can do something. And with time it wants more and more.\"\nmsgstr \"Природа Руина сбивает с толку человеческий разум. Оно может строить, оно может разрушать, оно может использовать, оно может быть использовано. Эти действия имеют тот же приоритет для Руина. Важно только то, что оно может что-то сделать. И со временем оно хочет все больше и больше.\"\n\n#. Key:\tSoAct3_EG_Act3RangedCleanerTwins_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Cleaner Twins\"\nmsgstr \"Близнецы-уборщики\"\n\n#. Key:\tSoAct3_EG_Act3VacuumTwins_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Ruin's logic is predictable when you understand its nature. When it's not possible to create more the creation process can be restarted by destroying everything first.\"\nmsgstr \"Логика Руина предсказуема, когда ты понимаешь ее природу. Когда невозможно создать больше, процесс создания можно перезапустить, сначала уничтожив все.\"\n\n#. Key:\tSoAct3_EG_Act3VacuumTwins_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Elite Twins\"\nmsgstr \"Близнецы элиты\"\n\n#. Key:\tWhiteWall_EG_AfterKobold_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Creating intelligence was not enough for the Golem Makers. They wanted to get even further. They wanted to create Golems with emotions.\"\nmsgstr \"Создание интеллекта было недостаточным для Создателей Големов. Они хотели еще большего. Они хотели создать Големов с эмоциями.\"\n\n#. Key:\tWhiteWall_EG_AfterKobold_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Flying Maintainer\"\nmsgstr \"Летающий Прислужник\"\n\n#. Key:\tWhiteWall_EG_BeforeKobold_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"When the Cataclysm happened and Ruin came the Golems started to change. Instead of doing their daily work some of them turned against their masters.\"\nmsgstr \"Когда случился Катаклизм и Руин пришел, Големы начали меняться. Вместо того, чтобы делать свою повседневную работу, некоторые из них обратились против своих хозяев.\"\n\n#. Key:\tWhiteWall_EG_BeforeKobold_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Infected Golems\"\nmsgstr \"Заражённые Големы\"\n\n#. Key:\tWhiteWall_EG_FirstCombat_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Cleaners were the first Golems ever made. Before the Cataclysm they did all the monoton work so that the people had more time to think and to create.\"\nmsgstr \"Уборщики были первыми големами, когда-либо созданными. До Катаклизма они делали всю нудную работу, чтобы у людей было больше времени на размышления и творчество.\"\n\n#. Key:\tWhiteWall_EG_FirstCombat_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Whitewall Cleaners\"\nmsgstr \"Уборщики Белой Стены\"\n\n#. Key:\tWhiteWall_EG_FirstOptionalCombat_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"After the different types of Cleaners, Golem Makers wanted to create something greater than working robots. They started to design creatures with intelligence.\"\nmsgstr \"После различных типов Уборщиков, Создатели Големов захотели создать нечто большее, чем рабочие роботы. Они начали создавать существа с интеллектом.\"\n\n#. Key:\tWhiteWall_EG_FirstOptionalCombat_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Whitewall Maintainers\"\nmsgstr \"Прислужники Белой Стены\"\n\n#. Key:\tAbacus_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/Abacus.Abacus.Description\n#: /Game/SO/Items/QuestItems/Abacus.Abacus.Description\nmsgctxt \"ItemData\"\nmsgid \"When you don't have enough fingers to count something you need this abacus.\"\nmsgstr \"Когда у тебя не хватает пальцев, чтобы сосчитать что-то, то тебе нужен этот абакус.\"\n\n#. Key:\tAbacus_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/Abacus.Abacus.Name\n#: /Game/SO/Items/QuestItems/Abacus.Abacus.Name\nmsgctxt \"ItemData\"\nmsgid \"Abacus\"\nmsgstr \"Абакус\"\n\n#. Key:\tAbacusGhost_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/AbacusGhost.AbacusGhost.Description\n#: /Game/SO/Items/QuestItems/AbacusGhost.AbacusGhost.Description\nmsgctxt \"ItemData\"\nmsgid \"When the Abacus is killed its spirit might return to get even with its murderer.\"\nmsgstr \"Когда Абакус убит, его дух может вернуться, чтобы отомстить убийце.\"\n\n#. Key:\tAbacusGhost_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/AbacusGhost.AbacusGhost.Name\n#: /Game/SO/Items/QuestItems/AbacusGhost.AbacusGhost.Name\nmsgctxt \"ItemData\"\nmsgid \"Ghost Abacus\"\nmsgstr \"Абакус Призрак\"\n\n#. Key:\tAbacusGhostFlower_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/AbacusGhostFlower.AbacusGhostFlower.Description\n#: /Game/SO/Items/QuestItems/AbacusGhostFlower.AbacusGhostFlower.Description\nmsgctxt \"ItemData\"\nmsgid \"Petals of a ghost flower.\"\nmsgstr \"Лепестки цветка-призрака.\"\n\n#. Key:\tAbacusGhostFlower_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/AbacusGhostFlower.AbacusGhostFlower.Name\n#: /Game/SO/Items/QuestItems/AbacusGhostFlower.AbacusGhostFlower.Name\nmsgctxt \"ItemData\"\nmsgid \"Ghost Petals\"\nmsgstr \"Лепестки-Призрак\"\n\n#. Key:\tAbacusSpellBook_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/AbacusSpellBook.AbacusSpellBook.Description\n#: /Game/SO/Items/QuestItems/AbacusSpellBook.AbacusSpellBook.Description\nmsgctxt \"ItemData\"\nmsgid \"An ancient paper\"\nmsgstr \"Древняя бумага\"\n\n#. Key:\tAbacusSpellBook_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/AbacusSpellBook.AbacusSpellBook.Name\n#: /Game/SO/Items/QuestItems/AbacusSpellBook.AbacusSpellBook.Name\nmsgctxt \"ItemData\"\nmsgid \"Scroll of Surrection\"\nmsgstr \"Свиток Воскрешения\"\n\n#. Key:\tAbacusSpellBook_page_0\n#. SourceLocation:\t/Game/SO/Items/QuestItems/AbacusSpellBook.AbacusSpellBook.Pages(0).Pages\n#: /Game/SO/Items/QuestItems/AbacusSpellBook.AbacusSpellBook.Pages(0).Pages\nmsgctxt \"ItemData\"\nmsgid \"Wisy et al. [3152] point out that any entity can be banished by throwing the proper object into his/her/its face a few times, making him/her/it annoyed thus unconcerned, as long as the target entity has a face.\\r\\n\\r\\nThe proper object in case of ghosts is something Surrected [Inti and Clevi 3153], as only Surrected substance can interact with ghosts.\\r\\n\\r\\nAny object covered with petals of Ghost Flower can be Surrected using the following method:\\r\\n\\r\\n- Say \\\"Sorry my <object name>!\\\"\\r\\n- Break the object into pieces with a heated hammer\\r\\n- Say your favourite color\\r\\n- Croon \\\"La La LaLaLa LaLaLa\\\" until the object is coagulated into a single Surrected object\"\nmsgstr \"Мудрый и др. [год 3152] указывает на то, что любая сущность может быть изгнана, бросив соответствующий объект в лицо несколько раз, тем самым раздражая ее и не обращая на это внимания продолжать, до тех пор, пока у целевой сущности есть лицо.\\n\\nПодходящий объект в случае с призраками - это нечто Воскресшее [Разумный и Умный, год 3153], поскольку только Воскрешенное вещество может взаимодействовать с призраками.\\n\\nЛюбой объект, покрытый лепестками Призрачного Цветка, может быть Воскрешен следующим методом:\\n\\n- Скажите “Извините мое <object name>”!\\n- Разбейте объект на куски нагретым молотком.\\n- Скажи свой любимый цвет\\n- Напевайте “Лa Ла ЛаЛаЛа ЛаЛаЛа”, пока объект не коагулируется в один воскрешенный объект\"\n\n#. Key:\tAbacusSpellBook_page_1\n#. SourceLocation:\t/Game/SO/Items/QuestItems/AbacusSpellBook.AbacusSpellBook.Pages(1).Pages\n#: /Game/SO/Items/QuestItems/AbacusSpellBook.AbacusSpellBook.Pages(1).Pages\nmsgctxt \"ItemData\"\nmsgid \"WARNING: not following the instructions exactly leads to failure and also increases the probability of injury and or death [Carfy 3154].\\r\\n\\r\\nREFERENCES:\\r\\n\\r\\nWISY, W., BUSY, B., WEIRDY, Y., AND LUCKY, L. 3152. The best ways to get rid of anyone potentially distracting us with questions like \\\"What do you read?\\\"\\r\\n\\r\\nInti, I., AND Clevi, C. 3153. Insulting dead ancestors using Surrected objects\\r\\n\\r\\nCarfy C. 3154. What happened to Clevi, C. and Inti, I.\"\nmsgstr \"ПРЕДУПРЕЖДЕНИЕ: несоблюдение указаний в точности приводит к неудаче, а также повышает вероятность получения травм или смерти [Осторожный 3154].\\r\\n\\r\\nССЫЛКИ:\\r\\n\\r\\nМУДРЫЙ, М., ЗАНЯТОЙ, З., СТРАННЫЙ, С., И ВЕЗУЧИЙ, В. 3152. Лучший способ избавиться от кого-либо, кто потенциально может отвлечь нас вопросами типа “Что ты читаешь?”\\r\\n\\r\\nРАЗУМНЫЙ, Р и Умный, У. 3153. Оскорбление мертвых предков с помощью Воскрешенных объектов.\\r\\n\\r\\nОсторожный, О. 3154. Что случилось с Умным, У. и Разумным, Р.\"\n\n#. Key:\tAll_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/All.All.Description\n#: /Game/SO/Items/QuestItems/All.All.Description\nmsgctxt \"ItemData\"\nmsgid \"Maybe it was a bit too much?\"\nmsgstr \"Может быть, это было слишком?\"\n\n#. Key:\tAll_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/All.All.Name\n#: /Game/SO/Items/QuestItems/All.All.Name\nmsgctxt \"ItemData\"\nmsgid \"Everything, except an Abacus\"\nmsgstr \"Все, кроме Абакуса\"\n\n#. Key:\tArtifact_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/Artifact.Artifact.Description\n#: /Game/SO/Items/QuestItems/Artifact.Artifact.Description\nmsgctxt \"ItemData\"\nmsgid \"A very rare and powerful item which is used for opening a portal into the Unknown Realm. If you gather three and give them to the Wizard he shall set you free.\"\nmsgstr \"Очень редкий и мощный предмет, который используется для открытия портала в Неизвестное Царство. Если ты соберешь три и отдашь их Волшебнику, он освободит тебя.\"\n\n#. Key:\tArtifact_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/Artifact.Artifact.Name\n#: /Game/SO/Items/QuestItems/Artifact.Artifact.Name\nmsgctxt \"ItemData\"\nmsgid \"Artifact\"\nmsgstr \"Артефакт\"\n\n#. Key:\tAxeMainGame_desc\n#. SourceLocation:\t/Game/SO/Items/Weapons/AxeMainGame.AxeMainGame.Description\n#. Key:\tAxe_desc\n#. SourceLocation:\t/Game/SO/Items/Weapons/Axe.Axe.Description\n#: /Game/SO/Items/Weapons/Axe.Axe.Description\n#: /Game/SO/Items/Weapons/AxeMainGame.AxeMainGame.Description\nmsgctxt \"ItemData\"\nmsgid \"Axes are usefull, but if you don't need them you can just throw them away.\"\nmsgstr \"Топоры полезны, но если они тебе не нужны, ты можешь их просто выбросить.\"\n\n#. Key:\tAxeMainGame_name\n#. SourceLocation:\t/Game/SO/Items/Weapons/AxeMainGame.AxeMainGame.Name\n#. Key:\tAxe_name\n#. SourceLocation:\t/Game/SO/Items/Weapons/Axe.Axe.Name\n#: /Game/SO/Items/Weapons/Axe.Axe.Name\n#: /Game/SO/Items/Weapons/AxeMainGame.AxeMainGame.Name\nmsgctxt \"ItemData\"\nmsgid \"Axes\"\nmsgstr \"Топоры\"\n\n#. Key:\tBlueCrystal_desc\n#. SourceLocation:\t/Game/SO/Items/Valuable/BlueCrystal.BlueCrystal.Description\n#: /Game/SO/Items/Valuable/BlueCrystal.BlueCrystal.Description\nmsgctxt \"ItemData\"\nmsgid \"An ancient crystal people like to buy.\"\nmsgstr \"Древний Хрусталь люди любят покупать.\"\n\n#. Key:\tBlueCrystal_name\n#. SourceLocation:\t/Game/SO/Items/Valuable/BlueCrystal.BlueCrystal.Name\n#: /Game/SO/Items/Valuable/BlueCrystal.BlueCrystal.Name\nmsgctxt \"ItemData\"\nmsgid \"Blue Crystal\"\nmsgstr \"Голубой Хрусталь\"\n\n#. Key:\tBlueGem_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/BlueGem.BlueGem.Description\n#: /Game/SO/Items/QuestItems/BlueGem.BlueGem.Description\nmsgctxt \"ItemData\"\nmsgid \"A small precious blue stone.\"\nmsgstr \"Маленький драгоценный синий камень.\"\n\n#. Key:\tBlueGem_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/BlueGem.BlueGem.Name\n#: /Game/SO/Items/QuestItems/BlueGem.BlueGem.Name\nmsgctxt \"ItemData\"\nmsgid \"Blue Gem\"\nmsgstr \"Голубой Самоцвет\"\n\n#. Key:\tDemonSword_desc\n#. SourceLocation:\t/Game/SO/Items/Weapons/DemonSword.DemonSword.Description\n#: /Game/SO/Items/Weapons/DemonSword.DemonSword.Description\nmsgctxt \"ItemData\"\nmsgid \"The mighty sword of Kharutar the Demon Ruler. Legend says he once cut one of his fingers with it and in his rage he broke the sword into two. Later it was reforged but some say it would still need some more fixes.\"\nmsgstr \"Могучий меч правителя демонов Харутара. Легенда гласит, что однажды он порезал им один из пальцев и в ярости разбил меч на два. Позже он был переделан, но некоторые говорят, что ему все равно понадобится еще несколько поправок.\"\n\n#. Key:\tDemonSword_name\n#. SourceLocation:\t/Game/SO/Items/Weapons/DemonSword.DemonSword.Name\n#: /Game/SO/Items/Weapons/DemonSword.DemonSword.Name\nmsgctxt \"ItemData\"\nmsgid \"Demon Sword\"\nmsgstr \"Демонический меч\"\n\n#. Key:\tDOKitchenKey_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/DOKitchenKey.DOKitchenKey.Description\n#: /Game/SO/Items/Keys/DOKitchenKey.DOKitchenKey.Description\nmsgctxt \"ItemData\"\nmsgid \"This is one of the many spare keys of the Dwarven Outpost Kitchen. Being able to get into the kitchen was always very important for dwarves.\"\nmsgstr \"Это один из многих запасных ключей от кухни Заставы Гномов. Возможность попасть на кухню всегда была очень важна для гномов.\"\n\n#. Key:\tDOKitchenKey_name\n#. SourceLocation:\t/Game/SO/Items/Keys/DOKitchenKey.DOKitchenKey.Name\n#: /Game/SO/Items/Keys/DOKitchenKey.DOKitchenKey.Name\nmsgctxt \"ItemData\"\nmsgid \"Kitchen Key\"\nmsgstr \"Ключ от кухни\"\n\n#. Key:\tDualBlade_desc\n#. SourceLocation:\t/Game/SO/Items/Weapons/DualBlade.DualBlade.Description\n#: /Game/SO/Items/Weapons/DualBlade.DualBlade.Description\nmsgctxt \"ItemData\"\nmsgid \"In case of trouble, it's better to have double.\"\nmsgstr \"В случае неприятностей лучше иметь два.\"\n\n#. Key:\tDualBlade_name\n#. SourceLocation:\t/Game/SO/Items/Weapons/DualBlade.DualBlade.Name\n#: /Game/SO/Items/Weapons/DualBlade.DualBlade.Name\nmsgctxt \"ItemData\"\nmsgid \"Double Sword\"\nmsgstr \"Двойной Меч\"\n\n#. Key:\tElevatorGem_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/ElevatorGem.ElevatorGem.Description\n#: /Game/SO/Items/QuestItems/ElevatorGem.ElevatorGem.Description\nmsgctxt \"ItemData\"\nmsgid \"A shiny green crystal which activates a weight lifting mechanism. At least by the look of it.\"\nmsgstr \"Блестящий зеленый кристалл, который активирует механизм подъема груза. По крайней мере, по внешнему виду.\"\n\n#. Key:\tElevatorGem_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/ElevatorGem.ElevatorGem.Name\n#: /Game/SO/Items/QuestItems/ElevatorGem.ElevatorGem.Name\nmsgctxt \"ItemData\"\nmsgid \"Elevator Gem\"\nmsgstr \"Самоцвет Лифта\"\n\n#. Key:\tElevatorLeverCrystal_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/ElevatorLeverCrystal.ElevatorLeverCrystal.Description\n#: /Game/SO/Items/QuestItems/ElevatorLeverCrystal.ElevatorLeverCrystal.Description\nmsgctxt \"ItemData\"\nmsgid \"You got this item for free from a Merchant so you hardly believe it has any value. It might be used as some sort of a mechanism activator though. Hopefully not for a trap.\"\nmsgstr \"Ты получил этот предмет бесплатно от купца, так что сложно поверить, что он имеет какую-нибудь ценность. Тем не менее, его можно использовать как некий активатор механизма. Надеюсь, не для ловушки.\"\n\n#. Key:\tElevatorLeverCrystal_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/ElevatorLeverCrystal.ElevatorLeverCrystal.Name\n#: /Game/SO/Items/QuestItems/ElevatorLeverCrystal.ElevatorLeverCrystal.Name\nmsgctxt \"ItemData\"\nmsgid \"Elevator Crystal\"\nmsgstr \"Кристалл лифта\"\n\n#. Key:\tFountainFlower_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/FountainFlower.FountainFlower.Description\n#: /Game/SO/Items/QuestItems/FountainFlower.FountainFlower.Description\nmsgctxt \"ItemData\"\nmsgid \"Flower acquired from a fountain.\"\nmsgstr \"Цветок, приобретенный из фонтана.\"\n\n#. Key:\tFountainFlower_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/FountainFlower.FountainFlower.Name\n#: /Game/SO/Items/QuestItems/FountainFlower.FountainFlower.Name\nmsgctxt \"ItemData\"\nmsgid \"Fountain Flower\"\nmsgstr \"Цветок Фонтана\"\n\n#. Key:\tGateKeeperSeat_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/GateKeeperSeat.GateKeeperSeat.Description\n#: /Game/SO/Items/QuestItems/GateKeeperSeat.GateKeeperSeat.Description\nmsgctxt \"ItemData\"\nmsgid \"A simple seat of size XXXXXXXXXL\"\nmsgstr \"Простое сиденье размером XXXXXXXXXL\"\n\n#. Key:\tGateKeeperSeat_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/GateKeeperSeat.GateKeeperSeat.Name\n#: /Game/SO/Items/QuestItems/GateKeeperSeat.GateKeeperSeat.Name\nmsgctxt \"ItemData\"\nmsgid \"Giant Seat\"\nmsgstr \"Гигантское сиденье\"\n\n#. Key:\tKeyAADoorNearDungeonExit_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyAADoorNearDungeonExit.KeyAADoorNearDungeonExit.Description\n#: /Game/SO/Items/Keys/KeyAADoorNearDungeonExit.KeyAADoorNearDungeonExit.Description\nmsgctxt \"ItemData\"\nmsgid \"A key without a proper item description\"\nmsgstr \"Ключ без нормального описания\"\n\n#. Key:\tKeyAADoorNearDungeonExit_name\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyAADoorNearDungeonExit.KeyAADoorNearDungeonExit.Name\n#: /Game/SO/Items/Keys/KeyAADoorNearDungeonExit.KeyAADoorNearDungeonExit.Name\nmsgctxt \"ItemData\"\nmsgid \"Arcade Key\"\nmsgstr \"Ключ Аркады\"\n\n#. Key:\tKeyAAFirstFight_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyAAFirstFight.KeyAAFirstFight.Description\n#: /Game/SO/Items/Keys/KeyAAFirstFight.KeyAAFirstFight.Description\nmsgctxt \"ItemData\"\nmsgid \"Weird\"\nmsgstr \"Странный\"\n\n#. Key:\tKeyAAFirstFight_name\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyAAFirstFight.KeyAAFirstFight.Name\n#: /Game/SO/Items/Keys/KeyAAFirstFight.KeyAAFirstFight.Name\nmsgctxt \"ItemData\"\nmsgid \"Weird Key\"\nmsgstr \"Странный Ключ\"\n\n#. Key:\tKeyAAMainFirstDoor_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyAAMainFirstDoor.KeyAAMainFirstDoor.Description\n#: /Game/SO/Items/Keys/KeyAAMainFirstDoor.KeyAAMainFirstDoor.Description\nmsgctxt \"ItemData\"\nmsgid \"Sometimes the lock is harder to find than the key.\"\nmsgstr \"Иногда замок сложнее найти, чем ключ.\"\n\n#. Key:\tKeyAAMainFirstDoor_name\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyAAMainFirstDoor.KeyAAMainFirstDoor.Name\n#: /Game/SO/Items/Keys/KeyAAMainFirstDoor.KeyAAMainFirstDoor.Name\nmsgctxt \"ItemData\"\nmsgid \"Key of Something\"\nmsgstr \"Ключ от чего-то\"\n\n#. Key:\tKeyAGPortalFight_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyAGPortalFight.KeyAGPortalFight.Description\n#: /Game/SO/Items/Keys/KeyAGPortalFight.KeyAGPortalFight.Description\nmsgctxt \"ItemData\"\nmsgid \"Just another key.\"\nmsgstr \"Еще один ключ.\"\n\n#. Key:\tKeyAGPortalFight_name\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyAGPortalFight.KeyAGPortalFight.Name\n#: /Game/SO/Items/Keys/KeyAGPortalFight.KeyAGPortalFight.Name\nmsgctxt \"ItemData\"\nmsgid \"Eastern Key\"\nmsgstr \"Восточный Ключ\"\n\n#. Key:\tKeyBronze_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyBronze.KeyBronze.Description\n#: /Game/SO/Items/Keys/KeyBronze.KeyBronze.Description\nmsgctxt \"ItemData\"\nmsgid \"A reforged Bronze Key.\"\nmsgstr \"Переделанный Бронзовый Ключ.\"\n\n#. Key:\tKeyBronze_name\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyBronze.KeyBronze.Name\n#: /Game/SO/Items/Keys/KeyBronze.KeyBronze.Name\nmsgctxt \"ItemData\"\nmsgid \"Bronze Key\"\nmsgstr \"Бронзовый Ключ\"\n\n#. Key:\tKeyCatacombs0_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyCatacombs0.KeyCatacombs0.Description\n#: /Game/SO/Items/Keys/KeyCatacombs0.KeyCatacombs0.Description\nmsgctxt \"ItemData\"\nmsgid \"There are a ridiculous amount of keys in this world, right?\"\nmsgstr \"В этом мире нелепое количество ключей, верно?\"\n\n#. Key:\tKeyCatacombs0_name\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyCatacombs0.KeyCatacombs0.Name\n#: /Game/SO/Items/Keys/KeyCatacombs0.KeyCatacombs0.Name\nmsgctxt \"ItemData\"\nmsgid \"Key Of The Room Below\"\nmsgstr \"Ключ от Комнаты Внизу\"\n\n#. Key:\tKeyCopper_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyCopper.KeyCopper.Description\n#: /Game/SO/Items/Keys/KeyCopper.KeyCopper.Description\nmsgctxt \"ItemData\"\nmsgid \"A reforged Copper Key.\"\nmsgstr \"Переделанный Медный Ключ.\"\n\n#. Key:\tKeyCopper_name\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyCopper.KeyCopper.Name\n#: /Game/SO/Items/Keys/KeyCopper.KeyCopper.Name\nmsgctxt \"ItemData\"\nmsgid \"Copper Key\"\nmsgstr \"Медный Ключ\"\n\n#. Key:\tKeyDCMainOut_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyDCMainOut.KeyDCMainOut.Description\n#: /Game/SO/Items/Keys/KeyDCMainOut.KeyDCMainOut.Description\nmsgctxt \"ItemData\"\nmsgid \"Just an old, rusty iron key without a proper item description\"\nmsgstr \"Просто старый, ржавый железный ключ без надлежащего описания предмета\"\n\n#. Key:\tKeyDCMainOut_name\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyDCMainOut.KeyDCMainOut.Name\n#: /Game/SO/Items/Keys/KeyDCMainOut.KeyDCMainOut.Name\nmsgctxt \"ItemData\"\nmsgid \"Catacomb Key\"\nmsgstr \"Ключ Катакомбы\"\n\n#. Key:\tKeyIron_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyIron.KeyIron.Description\n#: /Game/SO/Items/Keys/KeyIron.KeyIron.Description\nmsgctxt \"ItemData\"\nmsgid \"A reforged Iron Key.\"\nmsgstr \"Переделанный Железный Ключ.\"\n\n#. Key:\tKeyIron_name\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyIron.KeyIron.Name\n#: /Game/SO/Items/Keys/KeyIron.KeyIron.Name\nmsgctxt \"ItemData\"\nmsgid \"Iron Key\"\nmsgstr \"Железный Ключ\"\n\n#. Key:\tKeyMaster_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyMaster.KeyMaster.Description\n#: /Game/SO/Items/Keys/KeyMaster.KeyMaster.Description\nmsgctxt \"ItemData\"\nmsgid \"This key can be used to open any door equipped with a special kind of lock, but breaks during the process.\"\nmsgstr \"С помощью этого ключа можно открыть любую дверь, оснащенную замком специального типа, но в процессе он ломается.\"\n\n#. Key:\tKeyMaster_name\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyMaster.KeyMaster.Name\n#: /Game/SO/Items/Keys/KeyMaster.KeyMaster.Name\nmsgctxt \"ItemData\"\nmsgid \"Master Key\"\nmsgstr \"Мастер-ключ\"\n\n#. Key:\tKeyMerchant_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyMerchant.KeyMerchant.Description\n#: /Game/SO/Items/Keys/KeyMerchant.KeyMerchant.Description\nmsgctxt \"ItemData\"\nmsgid \"Does it really work? You will find out soon...\"\nmsgstr \"Действительно ли это работает? Скоро узнаешь…\"\n\n#. Key:\tKeyMerchant_name\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyMerchant.KeyMerchant.Name\n#: /Game/SO/Items/Keys/KeyMerchant.KeyMerchant.Name\nmsgctxt \"ItemData\"\nmsgid \"A very small key\"\nmsgstr \"Очень маленький ключ\"\n\n#. Key:\tKeyOutpostWall_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyOutpostWall.KeyOutpostWall.Description\n#: /Game/SO/Items/Keys/KeyOutpostWall.KeyOutpostWall.Description\nmsgctxt \"ItemData\"\nmsgid \"Do you really read the key descriptions?\"\nmsgstr \"Ты действительно читаешь описания ключей?\"\n\n#. Key:\tKeyOutpostWall_name\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyOutpostWall.KeyOutpostWall.Name\n#: /Game/SO/Items/Keys/KeyOutpostWall.KeyOutpostWall.Name\nmsgctxt \"ItemData\"\nmsgid \"Key Of The Outpost Wall\"\nmsgstr \"Ключ к Стене Заставы\"\n\n#. Key:\tKeyOutpostWallOptional_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyOutpostWallOptional.KeyOutpostWallOptional.Description\n#: /Game/SO/Items/Keys/KeyOutpostWallOptional.KeyOutpostWallOptional.Description\nmsgctxt \"ItemData\"\nmsgid \"I would rather sleep, but the item descriptions won't write themselves.\"\nmsgstr \"Я бы лучше поспал, но описания предметов сами по себе не напишутся.\"\n\n#. Key:\tKeyOutpostWallOptional_name\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyOutpostWallOptional.KeyOutpostWallOptional.Name\n#: /Game/SO/Items/Keys/KeyOutpostWallOptional.KeyOutpostWallOptional.Name\nmsgctxt \"ItemData\"\nmsgid \"Second Key Of The Outpost Wall\"\nmsgstr \"Второй Ключ от Стены Заставы\"\n\n#. Key:\tKeyPiecesBronze0_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyPiecesBronze0.KeyPiecesBronze0.Description\n#: /Game/SO/Items/Keys/KeyPiecesBronze0.KeyPiecesBronze0.Description\nmsgctxt \"ItemData\"\nmsgid \"Half of a broken Bronze Key\"\nmsgstr \"Половина сломанного Бронзового Ключа\"\n\n#. Key:\tKeyPiecesBronze0_name\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyPiecesBronze0.KeyPiecesBronze0.Name\n#: /Game/SO/Items/Keys/KeyPiecesBronze0.KeyPiecesBronze0.Name\nmsgctxt \"ItemData\"\nmsgid \"Half Bronze Key\"\nmsgstr \"Половина Бронзового Ключ\"\n\n#. Key:\tKeyPiecesCopper0_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyPiecesCopper0.KeyPiecesCopper0.Description\n#: /Game/SO/Items/Keys/KeyPiecesCopper0.KeyPiecesCopper0.Description\nmsgctxt \"ItemData\"\nmsgid \"Half of a broken Copper Key\"\nmsgstr \"Половина сломанного Медного Ключа\"\n\n#. Key:\tKeyPiecesCopper0_name\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyPiecesCopper0.KeyPiecesCopper0.Name\n#: /Game/SO/Items/Keys/KeyPiecesCopper0.KeyPiecesCopper0.Name\nmsgctxt \"ItemData\"\nmsgid \"Half Copper Key\"\nmsgstr \"Половина Медного Ключ\"\n\n#. Key:\tKeyPiecesIron0_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyPiecesIron0.KeyPiecesIron0.Description\n#: /Game/SO/Items/Keys/KeyPiecesIron0.KeyPiecesIron0.Description\nmsgctxt \"ItemData\"\nmsgid \"Half of a broken Iron Key\"\nmsgstr \"Половина сломанного Железного ключа\"\n\n#. Key:\tKeyPiecesIron0_name\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyPiecesIron0.KeyPiecesIron0.Name\n#: /Game/SO/Items/Keys/KeyPiecesIron0.KeyPiecesIron0.Name\nmsgctxt \"ItemData\"\nmsgid \"Half Iron Key\"\nmsgstr \"Половина Железного Ключ\"\n\n#. Key:\tKeySA_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/KeySA.KeySA.Description\n#: /Game/SO/Items/Keys/KeySA.KeySA.Description\nmsgctxt \"ItemData\"\nmsgid \"Looks like there are tons of these\"\nmsgstr \"Похоже там тонны таких\"\n\n#. Key:\tKeySA_name\n#. SourceLocation:\t/Game/SO/Items/Keys/KeySA.KeySA.Name\n#: /Game/SO/Items/Keys/KeySA.KeySA.Name\nmsgctxt \"ItemData\"\nmsgid \"Another Key\"\nmsgstr \"Другой Ключ\"\n\n#. Key:\tKeySASewerCreatureCell_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/KeySASewerCreatureCell.KeySASewerCreatureCell.Description\n#: /Game/SO/Items/Keys/KeySASewerCreatureCell.KeySASewerCreatureCell.Description\nmsgctxt \"ItemData\"\nmsgid \"A small key you got from the Pipe Walkers.\"\nmsgstr \"Маленький ключ, который ты получил от Трубоходиков.\"\n\n#. Key:\tKeyTLElevatorRoom_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyTLElevatorRoom.KeyTLElevatorRoom.Description\n#: /Game/SO/Items/Keys/KeyTLElevatorRoom.KeyTLElevatorRoom.Description\nmsgctxt \"ItemData\"\nmsgid \"A key without any sign of interest.\"\nmsgstr \"Ключ без каких-либо признаков значимости.\"\n\n#. Key:\tKeyTLElevatorRoom_name\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyTLElevatorRoom.KeyTLElevatorRoom.Name\n#: /Game/SO/Items/Keys/KeyTLElevatorRoom.KeyTLElevatorRoom.Name\nmsgctxt \"ItemData\"\nmsgid \"Unconcerned Key\"\nmsgstr \"Непонятный ключ\"\n\n#. Key:\tKeyWWFirstGate_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyWWFirstGate.KeyWWFirstGate.Description\n#: /Game/SO/Items/Keys/KeyWWFirstGate.KeyWWFirstGate.Description\nmsgctxt \"ItemData\"\nmsgid \"It will open a gate somewhere. Probably.\"\nmsgstr \"Он откроет какие-то врата. Наверное.\"\n\n#. Key:\tKeyWWFirstGate_name\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyWWFirstGate.KeyWWFirstGate.Name\n#: /Game/SO/Items/Keys/KeyWWFirstGate.KeyWWFirstGate.Name\nmsgctxt \"ItemData\"\nmsgid \"Railway Gate Key\"\nmsgstr \"Ключ от Железнодорожных Ворот\"\n\n#. Key:\tKeyWWPortal_desc\n#. SourceLocation:\t/Game/SO/Items/WhiteWallItems/KeyWWPortal.KeyWWPortal.Description\n#: /Game/SO/Items/WhiteWallItems/KeyWWPortal.KeyWWPortal.Description\nmsgctxt \"ItemData\"\nmsgid \"A fancy iron key with a shiny gem in its grip. It must be really precious.\"\nmsgstr \"Замысловатый железный ключ с блестящим драгоценным камнем в рукоятке. Должно быть, он очень ценный.\"\n\n#. Key:\tKeyWWPortal_name\n#. SourceLocation:\t/Game/SO/Items/WhiteWallItems/KeyWWPortal.KeyWWPortal.Name\n#: /Game/SO/Items/WhiteWallItems/KeyWWPortal.KeyWWPortal.Name\nmsgctxt \"ItemData\"\nmsgid \"Portal Key\"\nmsgstr \"Ключ от Портала\"\n\n#. Key:\tKEYWWSewerCreatureCell_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/KEYWWSewerCreatureCell.KEYWWSewerCreatureCell.Description\n#: /Game/SO/Items/Keys/KEYWWSewerCreatureCell.KEYWWSewerCreatureCell.Description\nmsgctxt \"ItemData\"\nmsgid \"A small key you got from a chest in the middle of nowhere.\"\nmsgstr \"Маленький ключ, который ты взял из сундука что ты нашел в глуши.\"\n\n#. Key:\tKEYWWSewerCreatureCell_name\n#. SourceLocation:\t/Game/SO/Items/Keys/KEYWWSewerCreatureCell.KEYWWSewerCreatureCell.Name\n#. Key:\tKeySASewerCreatureCell_name\n#. SourceLocation:\t/Game/SO/Items/Keys/KeySASewerCreatureCell.KeySASewerCreatureCell.Name\n#: /Game/SO/Items/Keys/KeySASewerCreatureCell.KeySASewerCreatureCell.Name\n#: /Game/SO/Items/Keys/KEYWWSewerCreatureCell.KEYWWSewerCreatureCell.Name\nmsgctxt \"ItemData\"\nmsgid \"Small Cell Key\"\nmsgstr \"Маленький Ключ от Камеры\"\n\n#. Key:\tKeyWWWhiteWall_desc\n#. SourceLocation:\t/Game/SO/Items/WhiteWallItems/KeyWWWhiteWall.KeyWWWhiteWall.Description\n#: /Game/SO/Items/WhiteWallItems/KeyWWWhiteWall.KeyWWWhiteWall.Description\nmsgctxt \"ItemData\"\nmsgid \"A robust iron key with a carved script: <Bold>'Outer Wall Tower'</>.\"\nmsgstr \"Прочный железный ключ с выгравированным текстом: <Bold>“Внешняя Стена Башни”</>.\"\n\n#. Key:\tKeyWWWhiteWall_name\n#. SourceLocation:\t/Game/SO/Items/WhiteWallItems/KeyWWWhiteWall.KeyWWWhiteWall.Name\n#: /Game/SO/Items/WhiteWallItems/KeyWWWhiteWall.KeyWWWhiteWall.Name\nmsgctxt \"ItemData\"\nmsgid \"White Wall Key\"\nmsgstr \"Ключ Белой Стены\"\n\n#. Key:\tKoboldCoin_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/KoboldCoin.KoboldCoin.Description\n#: /Game/SO/Items/QuestItems/KoboldCoin.KoboldCoin.Description\nmsgctxt \"ItemData\"\nmsgid \"Some Coins you found in a chest.\"\nmsgstr \"Несколько монет, которые ты нашел в сундуке.\"\n\n#. Key:\tKoboldCoin_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/KoboldCoin.KoboldCoin.Name\n#: /Game/SO/Items/QuestItems/KoboldCoin.KoboldCoin.Name\nmsgctxt \"ItemData\"\nmsgid \"Kobold Coins\"\nmsgstr \"Монеты Коболда\"\n\n#. Key:\tKoboldPotion_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/KoboldPotion.KoboldPotion.Description\n#: /Game/SO/Items/QuestItems/KoboldPotion.KoboldPotion.Description\nmsgctxt \"ItemData\"\nmsgid \"Weird liquid in a bottle. The kobold calls it Soup.\"\nmsgstr \"Странная жидкость в бутылке. Коболд называет это Супом.\"\n\n#. Key:\tKoboldPotion_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/KoboldPotion.KoboldPotion.Name\n#: /Game/SO/Items/QuestItems/KoboldPotion.KoboldPotion.Name\nmsgctxt \"ItemData\"\nmsgid \"Kobold Soup\"\nmsgstr \"Суп Коболда\"\n\n#. Key:\tLavaGolemToken_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/LavaGolemToken.LavaGolemToken.Description\n#: /Game/SO/Items/QuestItems/LavaGolemToken.LavaGolemToken.Description\nmsgctxt \"ItemData\"\nmsgid \"A unique stone you can use to prove that you have eliminated a golem.\"\nmsgstr \"Уникальный камень, который ты можешь использовать, чтобы доказать, что ты уничтожил голема.\"\n\n#. Key:\tLavaGolemToken_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/LavaGolemToken.LavaGolemToken.Name\n#: /Game/SO/Items/QuestItems/LavaGolemToken.LavaGolemToken.Name\nmsgctxt \"ItemData\"\nmsgid \"Stone Token\"\nmsgstr \"Каменный Жетон\"\n\n#. Key:\tLeafMace_desc\n#. SourceLocation:\t/Game/SO/Items/Weapons/LeafMace.LeafMace.Description\n#: /Game/SO/Items/Weapons/LeafMace.LeafMace.Description\nmsgctxt \"ItemData\"\nmsgid \"If someone would fail in cutting his/her/its way out of a hard situation, crushing your way through can still work out pretty well - it is said to be more effective if golems or certain mechanical devices / creatures are involved in the conflict.\"\nmsgstr \"Если кому-то не удается прорубиться из трудной ситуации, то сокрушить все на своем пути можно считать неплохим вариантом- говорят, что это более эффективно, если в конфликте участвуют големы или определенные механические устройства/существа.\"\n\n#. Key:\tLeafMace_name\n#. SourceLocation:\t/Game/SO/Items/Weapons/LeafMace.LeafMace.Name\n#: /Game/SO/Items/Weapons/LeafMace.LeafMace.Name\nmsgctxt \"ItemData\"\nmsgid \"Leaf Mace\"\nmsgstr \"Листовая Булава\"\n\n#. Key:\tLEKeyCage_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/LEKeyCage.LEKeyCage.Description\n#: /Game/SO/Items/Keys/LEKeyCage.LEKeyCage.Description\nmsgctxt \"ItemData\"\nmsgid \"You won't believe it but it is a key for a cage.\"\nmsgstr \"Ты не поверишь, но это ключ от клетки.\"\n\n#. Key:\tLEKeyCage_name\n#. SourceLocation:\t/Game/SO/Items/Keys/LEKeyCage.LEKeyCage.Name\n#: /Game/SO/Items/Keys/LEKeyCage.LEKeyCage.Name\nmsgctxt \"ItemData\"\nmsgid \"Cage Key\"\nmsgstr \"Ключ от Клетки\"\n\n#. Key:\tLETempleKey_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/LETempleKey.LETempleKey.Description\n#: /Game/SO/Items/Keys/LETempleKey.LETempleKey.Description\nmsgctxt \"ItemData\"\nmsgid \"This is one of the spare keys of the Ancient Temple. Just in case the original would be dropped into the lava accidentally.\"\nmsgstr \"Это один из запасных ключей от Древнего Храма. На случай, если оригинал случайно упадет в лаву.\"\n\n#. Key:\tLETempleKey_name\n#. SourceLocation:\t/Game/SO/Items/Keys/LETempleKey.LETempleKey.Name\n#: /Game/SO/Items/Keys/LETempleKey.LETempleKey.Name\nmsgctxt \"ItemData\"\nmsgid \"Ancient Temple Key\"\nmsgstr \"Ключ от Древнего Храма\"\n\n#. Key:\tLoryBooks_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/LoryBooks.LoryBooks.Description\n#: /Game/SO/Items/QuestItems/LoryBooks.LoryBooks.Description\nmsgctxt \"ItemData\"\nmsgid \"Two ancient books with the titles \\\"True value of your family\\\" and \\\"How much does a brother cost?\\\". They look boring so you decide not to open them.\"\nmsgstr \"Две старинные книги с названиями “Истинная ценность вашей семьи” и “Сколько стоит брат?”. Они выглядят скучно, поэтому ты решил их не открывать.\"\n\n#. Key:\tLoryBooks_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/LoryBooks.LoryBooks.Name\n#: /Game/SO/Items/QuestItems/LoryBooks.LoryBooks.Name\nmsgctxt \"ItemData\"\nmsgid \"Old books\"\nmsgstr \"Старые книги\"\n\n#. Key:\tMemoryCrystal1_desc\n#. SourceLocation:\t/Game/SO/Items/MemoryStone/MemoryCrystal1.MemoryCrystal1.Description\n#: /Game/SO/Items/MemoryStone/MemoryCrystal1.MemoryCrystal1.Description\nmsgctxt \"ItemData\"\nmsgid \"'According to the very few survivors, White Tower, our capital was completely destroyed by a magical phenomena called Ruin. At that time I was at Grey Gate so I can't tell anything for sure.'\\r\\n\\r\\nThe Last Sane Golem Maker, A.C. 16. September 4.\"\nmsgstr \"“По словам очень немногих выживших, Белая Башня, наша столица была полностью разрушена магическим феноменом под названием “Руин”. В то время я был у Серых Врат, так что я ничего не могу сказать наверняка”.\\n\\nПоследний Разумный Создатель Големов, 16 сентября 4 год н. э.\"\n\n#. Key:\tMemoryCrystal1_name\n#. SourceLocation:\t/Game/SO/Items/MemoryStone/MemoryCrystal1.MemoryCrystal1.Name\n#: /Game/SO/Items/MemoryStone/MemoryCrystal1.MemoryCrystal1.Name\nmsgctxt \"ItemData\"\nmsgid \"Magical Phenomena\"\nmsgstr \"Магический Феномен\"\n\n#. Key:\tMemoryCrystal2_desc\n#. SourceLocation:\t/Game/SO/Items/MemoryStone/MemoryCrystal2.MemoryCrystal2.Description\n#: /Game/SO/Items/MemoryStone/MemoryCrystal2.MemoryCrystal2.Description\nmsgctxt \"ItemData\"\nmsgid \"'Those who escaped Ruin have... changed.'\\r\\n'I've met a scientist who noticed how madness takes control over him. Perhaps he can find a solution.'\\r\\n\\r\\nThe Last Sane Golem Maker, A.C. 17. January 1.\"\nmsgstr \"“Те, кто сбежал из Руина… изменились.”\\n“Я встретил ученого, который заметил, как безумие берет контроль над ним. Возможно, он сможет найти решение.”\\n\\nПоследний Разумный Создатель Големов, 1 января. 17-й год н. э.\"\n\n#. Key:\tMemoryCrystal2_name\n#. SourceLocation:\t/Game/SO/Items/MemoryStone/MemoryCrystal2.MemoryCrystal2.Name\n#: /Game/SO/Items/MemoryStone/MemoryCrystal2.MemoryCrystal2.Name\nmsgctxt \"ItemData\"\nmsgid \"Degeneration and mutation\"\nmsgstr \"Дегенерация и мутация\"\n\n#. Key:\tMemoryCrystal3_desc\n#. SourceLocation:\t/Game/SO/Items/MemoryStone/MemoryCrystal3.MemoryCrystal3.Description\n#: /Game/SO/Items/MemoryStone/MemoryCrystal3.MemoryCrystal3.Description\nmsgctxt \"ItemData\"\nmsgid \"'It's hard to tell but I think colours are fading away. The World was brighter before.'\\r\\n'The Monk won't help me. He stubbornly believes we are doomed.'\\r\\n\\r\\nThe Last Sane Golem Maker, A.C. 17. March 11.\"\nmsgstr \"“Трудно сказать, но я думаю, что цвета исчезают. Раньше мир был ярче”.\\n“Монах мне не поможет. Он упрямо верит, что мы обречены.”\\n\\nПоследний Разумный Создатель Големов, 11 марта. 17-й год н.э.\"\n\n#. Key:\tMemoryCrystal3_name\n#. SourceLocation:\t/Game/SO/Items/MemoryStone/MemoryCrystal3.MemoryCrystal3.Name\n#: /Game/SO/Items/MemoryStone/MemoryCrystal3.MemoryCrystal3.Name\nmsgctxt \"ItemData\"\nmsgid \"Fading Colours\"\nmsgstr \"Исчезающие Цвета\"\n\n#. Key:\tMemoryCrystal4_desc\n#. SourceLocation:\t/Game/SO/Items/MemoryStone/MemoryCrystal4.MemoryCrystal4.Description\n#: /Game/SO/Items/MemoryStone/MemoryCrystal4.MemoryCrystal4.Description\nmsgctxt \"ItemData\"\nmsgid \"'Madness takes control over those who get too close to Ruin.'\\r\\n'Maintainers forgot to speak. I understand some of the phrases they try to say: \\\"Dinner is served\\\", \\\"At your service\\\", \\\"Your order\\\" - a mockery of their former intelligence!'\\r\\n\\r\\nThe Last Sane Golem Maker, A.C. 21. January 26.\"\nmsgstr \"“Безумие берет под контроль тех, кто подбирается слишком близко к Руину”.\\n“Прислужники разучились говорить. Я понимаю некоторые фразы, которые они пытаются сказать: “Ужин подан”, “К вашим услугам”, “Ваш заказ” - насмешка над их бывшим интеллектом!”\\n\\nПоследний Разумный Создатель Големов, 26 января. 21-й год н.э.\"\n\n#. Key:\tMemoryCrystal4_name\n#. SourceLocation:\t/Game/SO/Items/MemoryStone/MemoryCrystal4.MemoryCrystal4.Name\n#: /Game/SO/Items/MemoryStone/MemoryCrystal4.MemoryCrystal4.Name\nmsgctxt \"ItemData\"\nmsgid \"Madness\"\nmsgstr \"Безумие\"\n\n#. Key:\tMemoryCrystal5_desc\n#. SourceLocation:\t/Game/SO/Items/MemoryStone/MemoryCrystal5.MemoryCrystal5.Description\n#: /Game/SO/Items/MemoryStone/MemoryCrystal5.MemoryCrystal5.Description\nmsgctxt \"ItemData\"\nmsgid \"'Now I have seen it with my own eyes: the touch of the Ruin makes the World literally fall apart.'\\r\\n\\r\\nThe Last Sane Golem Maker, A.C. 25. September 4.\"\nmsgstr \"“Теперь я видел это собственными глазами: прикосновение Руина делает мир буквально рушится на части”.\\n\\nПоследний Разумный Создатель Големов, 4 сентября 25 года н.э.\"\n\n#. Key:\tMemoryCrystal5_name\n#. SourceLocation:\t/Game/SO/Items/MemoryStone/MemoryCrystal5.MemoryCrystal5.Name\n#: /Game/SO/Items/MemoryStone/MemoryCrystal5.MemoryCrystal5.Name\nmsgctxt \"ItemData\"\nmsgid \"Falling Apart\"\nmsgstr \"Распадаться на части\"\n\n#. Key:\tMemoryCrystal6_desc\n#. SourceLocation:\t/Game/SO/Items/MemoryStone/MemoryCrystal6.MemoryCrystal6.Description\n#: /Game/SO/Items/MemoryStone/MemoryCrystal6.MemoryCrystal6.Description\nmsgctxt \"ItemData\"\nmsgid \"'This is my 87 birthday. It's obvious that my body doesn't get older with time. How long can I preserve my sanity?'\\r\\n'Drones can no longer be trusted. They resisted Ruin for the longest.'\\r\\n\\r\\nThe Last Sane Golem Maker, A.C. 52. July 9.\"\nmsgstr \"“Это мой 87 день рождения. Очевидно, что мое тело не стареет со временем. Как долго я смогу сохранять здравомыслие?”\\n“Дронам больше нельзя доверять. Они сопротивлялись Руину дольше всех.”\\n\\nПоследний Разумный Создатель Големов, 9 июля. 52-й год н. э.\"\n\n#. Key:\tMemoryCrystal6_name\n#. SourceLocation:\t/Game/SO/Items/MemoryStone/MemoryCrystal6.MemoryCrystal6.Name\n#: /Game/SO/Items/MemoryStone/MemoryCrystal6.MemoryCrystal6.Name\nmsgctxt \"ItemData\"\nmsgid \"Preservation of Ruin\"\nmsgstr \"Защита от Руина\"\n\n#. Key:\tMemoryCrystal7_desc\n#. SourceLocation:\t/Game/SO/Items/MemoryStone/MemoryCrystal7.MemoryCrystal7.Description\n#: /Game/SO/Items/MemoryStone/MemoryCrystal7.MemoryCrystal7.Description\nmsgctxt \"ItemData\"\nmsgid \"'Ruin will soon reach Grey Gate, our very last city. I need to move deeper into the Realm, further away from Ruin.'\\r\\n'I decided to create some new golems. Golems that resist Ruin.'\\r\\n\\r\\nThe Last Sane Golem Maker, A.C. 315. April 8.\"\nmsgstr \"“Руины” скоро доберутся до Серых Врат, нашего последнего города. Мне нужно углубиться в царство, подальше от Руина”.\\n“Я решил создать несколько новых големов. Големов, которые противостоят Руину.”\\n\\nПоследний Разумный Создатель Големов, 8 апреля. 315-й год н. э.\"\n\n#. Key:\tMemoryCrystal7_name\n#. SourceLocation:\t/Game/SO/Items/MemoryStone/MemoryCrystal7.MemoryCrystal7.Name\n#: /Game/SO/Items/MemoryStone/MemoryCrystal7.MemoryCrystal7.Name\nmsgctxt \"ItemData\"\nmsgid \"New Hope\"\nmsgstr \"Новая надежда\"\n\n#. Key:\tMemoryCrystal8_desc\n#. SourceLocation:\t/Game/SO/Items/MemoryStone/MemoryCrystal8.MemoryCrystal8.Description\n#: /Game/SO/Items/MemoryStone/MemoryCrystal8.MemoryCrystal8.Description\nmsgctxt \"ItemData\"\nmsgid \"'I don't think I can keep up. There are times when I no longer know what I'm doing. I still have clear moments but they become more and more rare. I've recorded my memories to keep them safe.'\\r\\n\\r\\nThe Last Sane Golem Maker, about A.C. 500.\\r\\n\"\nmsgstr \"“Я не думаю, что смогу продолжать в том же духе. Бывают моменты, когда я больше не понимаю, что делаю. У меня все еще есть моменты ясности, но они становятся все более и более редкими. Я записал свои воспоминания, чтобы сохранить их в целости и сохранности.”\\n\\nПоследний Разумный Создатель Големов, около 500 год н. э.\\n\"\n\n#. Key:\tMemoryCrystal8_name\n#. SourceLocation:\t/Game/SO/Items/MemoryStone/MemoryCrystal8.MemoryCrystal8.Name\n#: /Game/SO/Items/MemoryStone/MemoryCrystal8.MemoryCrystal8.Name\nmsgctxt \"ItemData\"\nmsgid \"Final Decision\"\nmsgstr \"Окончательное Решение\"\n\n#. Key:\tPergamen_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/Pergamen.Pergamen.Description\n#: /Game/SO/Items/QuestItems/Pergamen.Pergamen.Description\nmsgctxt \"ItemData\"\nmsgid \"'This chest and everything inside belongs to me, the Chef.'\"\nmsgstr \"“Этот сундук и все, что внутри, принадлежит мне, Повару”.\"\n\n#. Key:\tPergamen_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/Pergamen.Pergamen.Name\n#: /Game/SO/Items/QuestItems/Pergamen.Pergamen.Name\nmsgctxt \"ItemData\"\nmsgid \"Parchment\"\nmsgstr \"Пергамент\"\n\n#. Key:\tPortalGem_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/PortalGem.PortalGem.Description\n#: /Game/SO/Items/QuestItems/PortalGem.PortalGem.Description\nmsgctxt \"ItemData\"\nmsgid \"There are so many stones around. You are still not sure what's the point of picking up some of them.\"\nmsgstr \"Вокруг столько камней. Ты все еще не знаешь, какой смысл брать некоторые из них.\"\n\n#. Key:\tPortalGem_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/PortalGem.PortalGem.Name\n#: /Game/SO/Items/QuestItems/PortalGem.PortalGem.Name\nmsgctxt \"ItemData\"\nmsgid \"Lock Gem\"\nmsgstr \"Самоцвет Замка\"\n\n#. Key:\tPotionOfWorthiness_desc\n#. SourceLocation:\t/Game/SO/Items/Useable/PotionOfWorthiness.PotionOfWorthiness.Description\n#: /Game/SO/Items/Useable/PotionOfWorthiness.PotionOfWorthiness.Description\nmsgctxt \"ItemData\"\nmsgid \"This might not be the weirdest side effect one can have when drinking something suspicious but it is definitely in the top five.\"\nmsgstr \"Это может быть не самый странный побочный эффект, который можно испытать, когда пьешь что-то подозрительное, но он определенно входит в первую пятерку.\"\n\n#. Key:\tPotionOfWorthiness_name\n#. SourceLocation:\t/Game/SO/Items/Useable/PotionOfWorthiness.PotionOfWorthiness.Name\n#: /Game/SO/Items/Useable/PotionOfWorthiness.PotionOfWorthiness.Name\nmsgctxt \"ItemData\"\nmsgid \"Potion Of Worthiness\"\nmsgstr \"Зелье Достойности\"\n\n#. Key:\tPurpleMushroom_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/PurpleMushroom.PurpleMushroom.Description\n#: /Game/SO/Items/QuestItems/PurpleMushroom.PurpleMushroom.Description\nmsgctxt \"ItemData\"\nmsgid \"The most purple mushrooms you could find. You hope these will be enough.\"\nmsgstr \"Самые пурпурные грибы, какие только можно найти. Ты надеешься, что их будет достаточно.\"\n\n#. Key:\tPurpleMushroom_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/PurpleMushroom.PurpleMushroom.Name\n#: /Game/SO/Items/QuestItems/PurpleMushroom.PurpleMushroom.Name\nmsgctxt \"ItemData\"\nmsgid \"Purple Mushrooms\"\nmsgstr \"Пурпурные Грибы\"\n\n#. Key:\tRavenFeather_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/RavenFeather.RavenFeather.Description\n#: /Game/SO/Items/QuestItems/RavenFeather.RavenFeather.Description\nmsgctxt \"ItemData\"\nmsgid \"A magical item which gives you the ability to fly... or something like that.\"\nmsgstr \"Волшебный предмет, который дает тебе способность летать… или что-то вроде этого.\"\n\n#. Key:\tRavenFeather_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/RavenFeather.RavenFeather.Name\n#: /Game/SO/Items/QuestItems/RavenFeather.RavenFeather.Name\nmsgctxt \"ItemData\"\nmsgid \"Raven Feather\"\nmsgstr \"Перо Ворона\"\n\n#. Key:\tRope_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/Rope.Rope.Description\n#: /Game/SO/Items/QuestItems/Rope.Rope.Description\nmsgctxt \"ItemData\"\nmsgid \"You do wonder when the area is full of ropes why this is the only one which can be taken...\"\nmsgstr \"Ты задаешься вопросом, когда в этом месте полно веревок, почему это единственное, что можно взять…\"\n\n#. Key:\tRope_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/Rope.Rope.Name\n#: /Game/SO/Items/QuestItems/Rope.Rope.Name\nmsgctxt \"ItemData\"\nmsgid \"Rope\"\nmsgstr \"Веревка\"\n\n#. Key:\tRuneStoneBonusHPMagical_desc\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneBonusHPMagical.RuneStoneBonusHPMagical.Description\n#: /Game/SO/Items/RuneStones/RuneStoneBonusHPMagical.RuneStoneBonusHPMagical.Description\nmsgctxt \"ItemData\"\nmsgid \"Absorbs <Blue>30</> magical damage.\"\nmsgstr \"Поглощает <Blue>30</> магического урона.\"\n\n#. Key:\tRuneStoneBonusHPMagical_name\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneBonusHPMagical.RuneStoneBonusHPMagical.Name\n#: /Game/SO/Items/RuneStones/RuneStoneBonusHPMagical.RuneStoneBonusHPMagical.Name\nmsgctxt \"ItemData\"\nmsgid \"Bluestone\"\nmsgstr \"Голубой камень\"\n\n#. Key:\tRuneStoneBonusHPPhysical_desc\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneBonusHPPhysical.RuneStoneBonusHPPhysical.Description\n#: /Game/SO/Items/RuneStones/RuneStoneBonusHPPhysical.RuneStoneBonusHPPhysical.Description\nmsgctxt \"ItemData\"\nmsgid \"Absorbs <White>30</> physical damage.\"\nmsgstr \"Поглощает <белый>30</> физического урона.\"\n\n#. Key:\tRuneStoneBonusHPPhysical_name\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneBonusHPPhysical.RuneStoneBonusHPPhysical.Name\n#: /Game/SO/Items/RuneStones/RuneStoneBonusHPPhysical.RuneStoneBonusHPPhysical.Name\nmsgctxt \"ItemData\"\nmsgid \"Graystone\"\nmsgstr \"Серый камень\"\n\n#. Key:\tRuneStoneBounce_desc\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.Description\n#. Key:\tRuneStoneBounce_level_desc_0\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.LevelBasedDescOverride(0).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.Description\n#: /Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.LevelBasedDescOverride(0).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Provides the ability to bounce from enemies for <Green>8</> seconds. Doing so causes <Blue>12</> damage to the target.\"\nmsgstr \"Предоставляет возможность отскакивать от врагов на <Green>8</> секунд. Это наносит <Blue>12</> урона цели.\"\n\n#. Key:\tRuneStoneBounce_level_desc_1\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.LevelBasedDescOverride(1).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.LevelBasedDescOverride(1).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Provides the ability to bounce from enemies for <Green>16</> seconds. Doing so causes <Blue>18</> damage to the target.\"\nmsgstr \"Предоставляет возможность отскакивать от врагов на <Green>16</> секунд. Это наносит <Blue>18</> урон цели.\"\n\n#. Key:\tRuneStoneBounce_level_desc_2\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.LevelBasedDescOverride(2).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.LevelBasedDescOverride(2).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Provides the ability to bounce from enemies for <Green>16</> seconds. Doing so causes <Blue>18</> damage and applies <Yellow>Stun</> on the target.\"\nmsgstr \"Предоставляет возможность отскакивать от врагов на <Green>16</> секунд. Это наносит <Blue>18</> урона и <Yellow>Оглушает</> цель.\"\n\n#. Key:\tRuneStoneBounce_level_desc_3\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.LevelBasedDescOverride(3).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.LevelBasedDescOverride(3).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Provides the ability to bounce from enemies for <Green>16</> seconds. Doing so causes <Blue>24</> damage and applies <Yellow>Stun</> on the target.\"\nmsgstr \"Предоставляет возможность отскакивать от врагов на <Green>16</> секунд. Это наносит <Blue>24</> урона и применяется <Yellow> Оглушение </> на цели.\"\n\n#. Key:\tRuneStoneBounce_level_desc_4\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.LevelBasedDescOverride(4).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.LevelBasedDescOverride(4).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Provides the ability to bounce from enemies for <Green>16</> seconds. Doing so causes <Blue>30</> damage and applies <Yellow>Stun</> on the target.\"\nmsgstr \"Предоставляет возможность отскакивать от врагов на <Green>16</> секунд. Это наносит <Blue>30</> урона и применяется <Yellow> Оглушение </> на цели.\"\n\n#. Key:\tRuneStoneBounce_level_up_desc_0\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.LevelUpBasedDescOverride(0).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.LevelUpBasedDescOverride(0).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Provides the ability to bounce from enemies for <Green>8</><YellowH>(→16)</> seconds. Doing so causes <Blue>12</><YellowH>(→18)</> damage to the target.\"\nmsgstr \"Предоставляет возможность отскакивать от врагов на <Green>8</><YellowH>(→16)</> секунд. При этом наносит <Blue>12</><YellowH>(→18)</> урон цели.\"\n\n#. Key:\tRuneStoneBounce_level_up_desc_1\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.LevelUpBasedDescOverride(1).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.LevelUpBasedDescOverride(1).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Provides the ability to bounce from enemies for <Green>16</> seconds. Doing so causes <Blue>18</> damage <YellowH>and applies Stun on the target.</>\"\nmsgstr \"Предоставляет возможность отскакивать от врагов на <Green>16</> секунд. Это наносит <Blue>18</> урона <YellowH> и применяется Оглушение цели.</>\"\n\n#. Key:\tRuneStoneBounce_level_up_desc_2\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.LevelUpBasedDescOverride(2).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.LevelUpBasedDescOverride(2).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Provides the ability to bounce from enemies for <Green>16</> seconds. Doing so causes <Blue>18</><YellowH>(→24)</> damage and applies <Yellow>Stun</> on the target.\"\nmsgstr \"Предоставляет возможность отскакивать от врагов на <Green>16</> секунд. Это вызывает <Blue>18</><YellowH>(→24)</> урона и применяется <Yellow>Оглушение</> цели.\"\n\n#. Key:\tRuneStoneBounce_level_up_desc_3\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.LevelUpBasedDescOverride(3).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.LevelUpBasedDescOverride(3).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Provides the ability to bounce from enemies for <Green>16</> seconds. Doing so causes <Blue>24</><YellowH>(→30)</> damage and applies <Yellow>Stun</> on the target.\"\nmsgstr \"Предоставляет возможность отскакивать от врагов на <Green>16</> секунд. Это вызывает <Blue>24</><YellowH>(→30)</> урона и применяется <Yellow>Оглушение</> цели.\"\n\n#. Key:\tRuneStoneBounce_name\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.Name\n#: /Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.Name\nmsgctxt \"ItemData\"\nmsgid \"Bouncestone\"\nmsgstr \"Камень Прыжка\"\n\n#. Key:\tRuneStoneEnergy_desc\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneEnergy.RuneStoneEnergy.Description\n#: /Game/SO/Items/RuneStones/RuneStoneEnergy.RuneStoneEnergy.Description\nmsgctxt \"ItemData\"\nmsgid \"Strikes and spell cooldowns are decreased by 90% for 10 seconds.\"\nmsgstr \"Восстановление ударов и заклинаний уменьшаются на 90% на 10 секунд.\"\n\n#. Key:\tRuneStoneEnergy_name\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneEnergy.RuneStoneEnergy.Name\n#: /Game/SO/Items/RuneStones/RuneStoneEnergy.RuneStoneEnergy.Name\nmsgctxt \"ItemData\"\nmsgid \"Energystone\"\nmsgstr \"Энергокамень\"\n\n#. Key:\tRuneStoneFire0_desc\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneFire0.RuneStoneFire0.Description\n#. Key:\tRuneStoneFire0_level_desc_0\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneFire0.RuneStoneFire0.LevelBasedDescOverride(0).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneFire0.RuneStoneFire0.Description\n#: /Game/SO/Items/RuneStones/RuneStoneFire0.RuneStoneFire0.LevelBasedDescOverride(0).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons a powerful blast roasting anything in a straight line.\\nCauses <Blue>16</> damage.\"\nmsgstr \"Провоцирует мощный взрыв, обжигающий все, что угодно вдоль прямой линии.\\nНаносит <Blue>16</> урона.\"\n\n#. Key:\tRuneStoneFire0_level_desc_1\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneFire0.RuneStoneFire0.LevelBasedDescOverride(1).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneFire0.RuneStoneFire0.LevelBasedDescOverride(1).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons a powerful blast roasting anything in a straight line.\\nCauses <Blue>32</> damage.\"\nmsgstr \"Провоцирует мощный взрыв, обжигающий все, что угодно вдоль прямой линии.\\nНаносит <Blue>32</> урона.\"\n\n#. Key:\tRuneStoneFire0_level_desc_2\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneFire0.RuneStoneFire0.LevelBasedDescOverride(2).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneFire0.RuneStoneFire0.LevelBasedDescOverride(2).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons a powerful blast roasting anything in a straight line.\\nCauses <Blue>36</> damage. The spell has <Green>50%</> chance to <Purple>Instant Recharge.</>\"\nmsgstr \"Провоцирует мощный взрыв, обжигающий все, что угодно вдоль прямой линии.\\nНаносит <Blue>36</> урона. Заклинание имеет <Green> 50% </> шанс на <Purple> Мгновенную Перезарядку. </>\"\n\n#. Key:\tRuneStoneFire0_level_desc_3\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneFire0.RuneStoneFire0.LevelBasedDescOverride(3).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneFire0.RuneStoneFire0.LevelBasedDescOverride(3).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons a powerful blast roasting anything in a straight line.\\nCauses <Blue>52</> damage. The spell has <Green>50%</> chance to <Purple>Instant Recharge.</>\"\nmsgstr \"Провоцирует мощный взрыв, обжигающий все, что угодно вдоль прямой линии.\\nНаносит <Blue>52</> урона. Заклинание имеет <Green> 50% </> шанс на <Purple> Мгновенную Перезарядку. </>\"\n\n#. Key:\tRuneStoneFire0_level_up_desc_0\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneFire0.RuneStoneFire0.LevelUpBasedDescOverride(0).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneFire0.RuneStoneFire0.LevelUpBasedDescOverride(0).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons a powerful blast roasting anything in a straight line.\\nCauses <Blue>16</><YellowH>(→32)</> damage.\"\nmsgstr \"Провоцирует мощный взрыв, обжигающий все, что угодно вдоль прямой линии.\\nНаносит <Blue>16</><YellowH>(→32)</> урона.\"\n\n#. Key:\tRuneStoneFire0_level_up_desc_1\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneFire0.RuneStoneFire0.LevelUpBasedDescOverride(1).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneFire0.RuneStoneFire0.LevelUpBasedDescOverride(1).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons a powerful blast roasting anything in a straight line.\\nCauses <Blue>32</><YellowH>(→36)</> damage. <YellowH>The spell has </><GreenH>50%</> <YellowH>chance to </><PurpleH>Instant Recharge.</>\"\nmsgstr \"Провоцирует мощный взрыв, обжигающий все, что угодно вдоль прямой линии.\\nНаносит <Blue>32</><YellowH>(→36)</> урона. <YellowH>Заклинание имеет </><Green> 50% </> <YellowH>шанс на </><Purple>Мгновенную Перезарядку.</>\"\n\n#. Key:\tRuneStoneFire0_level_up_desc_2\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneFire0.RuneStoneFire0.LevelUpBasedDescOverride(2).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneFire0.RuneStoneFire0.LevelUpBasedDescOverride(2).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons a powerful blast roasting anything in a straight line.\\nCauses <Blue>36</><YellowH>(→52)</> damage. The spell has <Green>50%</> chance to <Purple>Instant Recharge.</>\"\nmsgstr \"Провоцирует мощный взрыв, обжигающий все, что угодно вдоль прямой линии.\\nНаносит <Blue>36</><YellowH>(→52)</> урона. Заклинание имеет <Green> 50% </> шанс на <Purple>Мгновенную Перезарядку.</>\"\n\n#. Key:\tRuneStoneFire0_name\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneFire0.RuneStoneFire0.Name\n#: /Game/SO/Items/RuneStones/RuneStoneFire0.RuneStoneFire0.Name\nmsgctxt \"ItemData\"\nmsgid \"Firestone\"\nmsgstr \"Огненный Камень\"\n\n#. Key:\tRuneStoneHeal_desc\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneHeal.RuneStoneHeal.Description\n#: /Game/SO/Items/RuneStones/RuneStoneHeal.RuneStoneHeal.Description\nmsgctxt \"ItemData\"\nmsgid \"Restores <Green>30</> health points.\"\nmsgstr \"Восстанавливает <Green> 30 </> очков здоровья.\"\n\n#. Key:\tRuneStoneHeal_name\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneHeal.RuneStoneHeal.Name\n#: /Game/SO/Items/RuneStones/RuneStoneHeal.RuneStoneHeal.Name\nmsgctxt \"ItemData\"\nmsgid \"Healstone\"\nmsgstr \"Лечебный Камень\"\n\n#. Key:\tRuneStoneLightningWalk_desc\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneLightningWalk.RuneStoneLightningWalk.Description\n#: /Game/SO/Items/RuneStones/RuneStoneLightningWalk.RuneStoneLightningWalk.Description\nmsgctxt \"ItemData\"\nmsgid \"Grants the shocking ability to walk through your enemies for <Green>2</> sec. The shock causes <Blue>10</> damage.\"\nmsgstr \"Дает шокирующую способность пройти сквозь врагов на <Green> 2 </> секунды. Шок наносит <Blue> 10 </> урона.\"\n\n#. Key:\tRuneStoneLightningWalk_level_desc_0\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneLightningWalk.RuneStoneLightningWalk.LevelBasedDescOverride(0).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneLightningWalk.RuneStoneLightningWalk.LevelBasedDescOverride(0).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Grants the shocking ability to walk through your enemies for <Green>2</> sec. The shock causes <Blue>16</> damage.\"\nmsgstr \"Дает шокирующую способность пройти сквозь врагов на <Green> 2 </> секунды. Шок наносит <Blue>16</> урона.\"\n\n#. Key:\tRuneStoneLightningWalk_level_desc_1\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneLightningWalk.RuneStoneLightningWalk.LevelBasedDescOverride(1).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneLightningWalk.RuneStoneLightningWalk.LevelBasedDescOverride(1).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Grants the shocking ability to walk through your enemies for <Green>3</> sec. The shock causes <Blue>28</> damage.\"\nmsgstr \"Дает шокирующую способность пройти сквозь врагов на <Green> 3 </> секунды. Шок наносит <Blue>28</> урона.\"\n\n#. Key:\tRuneStoneLightningWalk_level_desc_2\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneLightningWalk.RuneStoneLightningWalk.LevelBasedDescOverride(2).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneLightningWalk.RuneStoneLightningWalk.LevelBasedDescOverride(2).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Grants the shocking ability to walk through your enemies for <Green>4</> sec. The shock causes <Blue>32</> damage and has a <Green>30%</> chance to <Yellow>stun</> the target.\"\nmsgstr \"Дает шокирующую способность пройти сквозь врагов на <Green>4</> секунды. Шок наносит <Blue>32</> урона и <Green>30%</> шанс на <Yellow>оглушение</> цели.\"\n\n#. Key:\tRuneStoneLightningWalk_level_desc_3\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneLightningWalk.RuneStoneLightningWalk.LevelBasedDescOverride(3).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneLightningWalk.RuneStoneLightningWalk.LevelBasedDescOverride(3).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Grants the shocking ability to walk through your enemies for <Green>4</> sec. The shock causes <Blue>32</> damage and has a <Green>40%</> chance to <Yellow>stun</> the target.\"\nmsgstr \"Дает шокирующую способность пройти сквозь врагов на <Green>4</> секунды. Шок наносит <Blue>32</> урона и <Green>40%</> шанс <Yellow>оглушить</> цель.\"\n\n#. Key:\tRuneStoneLightningWalk_level_up_desc_0\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneLightningWalk.RuneStoneLightningWalk.LevelUpBasedDescOverride(0).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneLightningWalk.RuneStoneLightningWalk.LevelUpBasedDescOverride(0).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Grants the shocking ability to walk through your enemies for <Green>2</><YellowH>(→3)</> sec. The shock causes <Blue>16</> <YellowH>(→28)</>damage.\"\nmsgstr \"Дает шокирующую способность пройти сквозь врагов на <Green> 2 </> <YellowH> (→ 3) </> секунды. Шок наносит <Blue> 16 </> <YellowH> (→ 28) </> урона.\"\n\n#. Key:\tRuneStoneLightningWalk_level_up_desc_1\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneLightningWalk.RuneStoneLightningWalk.LevelUpBasedDescOverride(1).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneLightningWalk.RuneStoneLightningWalk.LevelUpBasedDescOverride(1).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Grants the shocking ability to walk through your enemies for <Green>3</><YellowH>(→4)</> sec. The shock causes <Blue>28</> <YellowH>(→36)</>damage <YellowH>and has a </><GreenH>30%</> <YellowH>chance to stun the target.</>\"\nmsgstr \"Дает шокирующую способность пройти сквозь врагов на <Green> 3 </> <YellowH> (→ 4) </> секунды. Шок наносит <Blue> 28 </> <YellowH> (→ 36) </> урона <YellowH> и имеет </> <GreenH> 30% </> <YellowH> шанс оглушить цель. </>\"\n\n#. Key:\tRuneStoneLightningWalk_level_up_desc_2\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneLightningWalk.RuneStoneLightningWalk.LevelUpBasedDescOverride(2).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneLightningWalk.RuneStoneLightningWalk.LevelUpBasedDescOverride(2).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Grants the shocking ability to walk through your enemies for <Green>4</> sec. The shock causes <Blue>32</> damage and has a <Green>30%</> <YellowH>(→40%)</> chance to <Yellow>stun</> the target.\"\nmsgstr \"Дает шокирующую способность пройти сквозь врагов на <Green> 4 </> секунды. Шок наносит <Blue> 32 </> урона и имеет <Green> 30% </> <YellowH> (→ 40%) </> шанс <Yellow> оглушить </> цель.\"\n\n#. Key:\tRuneStoneLightningWalk_name\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneLightningWalk.RuneStoneLightningWalk.Name\n#: /Game/SO/Items/RuneStones/RuneStoneLightningWalk.RuneStoneLightningWalk.Name\nmsgctxt \"ItemData\"\nmsgid \"Lightningstone\"\nmsgstr \"Молниеносный Камень\"\n\n#. Key:\tRuneStoneMagicMissle_desc\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMagicMissle.RuneStoneMagicMissle.Description\n#: /Game/SO/Items/RuneStones/RuneStoneMagicMissle.RuneStoneMagicMissle.Description\nmsgctxt \"ItemData\"\nmsgid \"Summons a homing projectile targeted at a close foe - prefers flying targets.\"\nmsgstr \"Вызывает самонаводящийся снаряд, нацеленный на ближайшего противника - предпочитает летающие цели.\"\n\n#. Key:\tRuneStoneMagicMissle_level_desc_0\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMagicMissle.RuneStoneMagicMissle.LevelBasedDescOverride(0).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneMagicMissle.RuneStoneMagicMissle.LevelBasedDescOverride(0).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons <Green>1</> homing projectile targeted at a close foe - prefers flying targets. Causes <Blue>16</> damage on impact.\"\nmsgstr \"Вызывает <Green>1</> самонаводящийся снаряд, нацеленный на ближайшего противника - предпочитает летающие цели. Наносит <Blue>16</> урона при ударе.\"\n\n#. Key:\tRuneStoneMagicMissle_level_desc_1\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMagicMissle.RuneStoneMagicMissle.LevelBasedDescOverride(1).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneMagicMissle.RuneStoneMagicMissle.LevelBasedDescOverride(1).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons <Green>2</> homing projectile targeted at a close foe - prefers flying targets. Each projectile causes <Blue>16</> damage on impact.\"\nmsgstr \"Вызывает <Green>2</> самонаводящийся снаряд, нацеленный на ближайшего противника - предпочитает летающие цели. Каждый снаряд при ударе наносит <Blue>16</> урона.\"\n\n#. Key:\tRuneStoneMagicMissle_level_desc_2\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMagicMissle.RuneStoneMagicMissle.LevelBasedDescOverride(2).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneMagicMissle.RuneStoneMagicMissle.LevelBasedDescOverride(2).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons <Green>3</> homing projectile targeted at a close foe - prefers flying targets. Each projectile causes <Blue>16</> damage and applies <Orange>Slow</> on impact.\"\nmsgstr \"Вызывает <Green>3</> самонаводящийся снаряд, нацеленный на ближайшего противника - предпочитает летающие цели. Каждый снаряд наносит <Blue> 16 </> урон и накладывает <Orange> Замедление </> при ударе.\"\n\n#. Key:\tRuneStoneMagicMissle_level_desc_3\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMagicMissle.RuneStoneMagicMissle.LevelBasedDescOverride(3).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneMagicMissle.RuneStoneMagicMissle.LevelBasedDescOverride(3).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons <Green>4</> homing projectile targeted at a close foe - prefers flying targets. Each projectile causes <Blue>16</> damage and applies <Orange>Slow</> on impact.\"\nmsgstr \"Вызывает <Green>4</> самонаводящийся снаряд, нацеленный на ближайшего противника - предпочитает летающие цели. Каждый снаряд наносит <Blue> 16 </> урон и накладывает <Orange> Замедление </> при ударе.\"\n\n#. Key:\tRuneStoneMagicMissle_level_up_desc_0\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMagicMissle.RuneStoneMagicMissle.LevelUpBasedDescOverride(0).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneMagicMissle.RuneStoneMagicMissle.LevelUpBasedDescOverride(0).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons <Green>1</><YellowH>(→2)</> homing projectile targeted at a close foe - prefers flying targets. Each projectile causes <Blue>16</> damage on impact.\"\nmsgstr \"Вызывает <Green>1</><YellowH>(→2)</> самонаводящийся снаряд, нацеленный на ближайшего противника - предпочитает летающие цели. Каждый снаряд при ударе наносит <Blue>16</> урона.\"\n\n#. Key:\tRuneStoneMagicMissle_level_up_desc_1\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMagicMissle.RuneStoneMagicMissle.LevelUpBasedDescOverride(1).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneMagicMissle.RuneStoneMagicMissle.LevelUpBasedDescOverride(1).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons <Green>2</><YellowH>(→3)</> homing projectile targeted at a close foe - prefers flying targets. Each projectile causes <Blue>16</> damage <YellowH>and applies</> <OrangeH>Slow</> on impact.\"\nmsgstr \"Вызывает <Green>2</><YellowH>(→3)</> самонаводящийся снаряд, нацеленный на ближайшего противника - предпочитает летающие цели. Каждый снаряд наносит <Blue> 16 </> урон <YellowH>и накладывает <OrangeH> Замедление </> при ударе.\"\n\n#. Key:\tRuneStoneMagicMissle_level_up_desc_2\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMagicMissle.RuneStoneMagicMissle.LevelUpBasedDescOverride(2).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneMagicMissle.RuneStoneMagicMissle.LevelUpBasedDescOverride(2).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons <Green>3</><YellowH>(→4)</> homing projectile targeted at a close foe - prefers flying targets. Each projectile causes <Blue>16</> damage and applies <Orange>Slow</> on impact.\"\nmsgstr \"Вызывает <Green>3</><YellowH>(→4)</> самонаводящийся снаряд, нацеленный на ближайшего противника - предпочитает летающие цели. Каждый снаряд наносит <Blue> 16 </> урон и накладывает <Orange> Замедление </> при ударе.\"\n\n#. Key:\tRuneStoneMagicMissle_name\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMagicMissle.RuneStoneMagicMissle.Name\n#: /Game/SO/Items/RuneStones/RuneStoneMagicMissle.RuneStoneMagicMissle.Name\nmsgctxt \"ItemData\"\nmsgid \"Tealstone\"\nmsgstr \"Тиловый камень\"\n\n#. Key:\tRuneStoneMassMagicMissle_desc\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMassMagicMissle.RuneStoneMassMagicMissle.Description\n#. Key:\tRuneStoneMassMagicMissle_level_desc_0\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMassMagicMissle.RuneStoneMassMagicMissle.LevelBasedDescOverride(0).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneMassMagicMissle.RuneStoneMassMagicMissle.Description\n#: /Game/SO/Items/RuneStones/RuneStoneMassMagicMissle.RuneStoneMassMagicMissle.LevelBasedDescOverride(0).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons a homing projectile for each nearby enemy, causing <Blue>20</> damage on impact.\"\nmsgstr \"Выпускает самонаводящийся снаряд для каждого находящегося поблизости врага, нанося <Blue>20</> урон при ударе.\"\n\n#. Key:\tRuneStoneMassMagicMissle_level_desc_1\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMassMagicMissle.RuneStoneMassMagicMissle.LevelBasedDescOverride(1).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneMassMagicMissle.RuneStoneMassMagicMissle.LevelBasedDescOverride(1).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons a homing projectile for each nearby enemy, causing <Blue>40</> damage on impact.\"\nmsgstr \"Выпускает самонаводящийся снаряд для каждого находящегося поблизости врага, нанося <Blue>40</> урон при ударе.\"\n\n#. Key:\tRuneStoneMassMagicMissle_level_desc_2\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMassMagicMissle.RuneStoneMassMagicMissle.LevelBasedDescOverride(2).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneMassMagicMissle.RuneStoneMassMagicMissle.LevelBasedDescOverride(2).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons a homing projectile for each nearby enemy, causing <Blue>50</> damage on impact. The target has a <Green>30%</> chance to become <Orange>Slow</>.\"\nmsgstr \"Выпускает самонаводящийся снаряд для каждого находящегося поблизости врага, нанося <Blue>50</> урон при ударе. Цель имеет <Green>30%</> шанс <Orange>Замедлиться</>.\"\n\n#. Key:\tRuneStoneMassMagicMissle_level_up_desc_0\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMassMagicMissle.RuneStoneMassMagicMissle.LevelUpBasedDescOverride(0).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneMassMagicMissle.RuneStoneMassMagicMissle.LevelUpBasedDescOverride(0).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons a homing projectile for each nearby enemy, causing <Blue>20</><YellowH>(→40)</> damage on impact.\"\nmsgstr \"Вызывает самонаводящийся снаряд для каждого находящегося поблизости врага, нанося <Blue>20</><YellowH>(→40)</> урон при ударе.\"\n\n#. Key:\tRuneStoneMassMagicMissle_level_up_desc_1\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMassMagicMissle.RuneStoneMassMagicMissle.LevelUpBasedDescOverride(1).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneMassMagicMissle.RuneStoneMassMagicMissle.LevelUpBasedDescOverride(1).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons a homing projectile for each nearby enemy, causing <Blue>20</><YellowH>(→50)</> damage on impact. <YellowH>The target has a</> <GreenH>30%</> <YellowH>chance to become</> <Orange>Slow</>.\"\nmsgstr \"Вызывает самонаводящийся снаряд для каждого находящегося поблизости врага, нанося <Blue>20</><YellowH>(→50)</> урон при ударе. <YellowH>Цель имеет </> <Green>30%</> <YellowH>шанс </> <Orange>Замедлиться</>.\"\n\n#. Key:\tRuneStoneMassMagicMissle_name\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMassMagicMissle.RuneStoneMassMagicMissle.Name\n#: /Game/SO/Items/RuneStones/RuneStoneMassMagicMissle.RuneStoneMassMagicMissle.Name\nmsgctxt \"ItemData\"\nmsgid \"Tealstone, but better\"\nmsgstr \"Тиловый камень только лучше\"\n\n#. Key:\tRuneStoneMassSlow_desc\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMassSlow.RuneStoneMassSlow.Description\n#: /Game/SO/Items/RuneStones/RuneStoneMassSlow.RuneStoneMassSlow.Description\nmsgctxt \"ItemData\"\nmsgid \"Slows all enemy targets around the caster.\"\nmsgstr \"Замедляет все вражеские цели вокруг заклинателя.\"\n\n#. Key:\tRuneStoneMassSlow_level_desc_0\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMassSlow.RuneStoneMassSlow.LevelBasedDescOverride(0).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneMassSlow.RuneStoneMassSlow.LevelBasedDescOverride(0).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"All enemy target becomes <Orange>Slow</> for <Green>3</> seconds.\"\nmsgstr \"Все вражеские цели <Orange>Замедляются</> на <Green>3</> секунды.\"\n\n#. Key:\tRuneStoneMassSlow_name\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMassSlow.RuneStoneMassSlow.Name\n#: /Game/SO/Items/RuneStones/RuneStoneMassSlow.RuneStoneMassSlow.Name\nmsgctxt \"ItemData\"\nmsgid \"Slowstone\"\nmsgstr \"Замедляющий камень\"\n\n#. Key:\tRuneStoneMeteorShower_desc\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMeteorShower.RuneStoneMeteorShower.Description\n#: /Game/SO/Items/RuneStones/RuneStoneMeteorShower.RuneStoneMeteorShower.Description\nmsgctxt \"ItemData\"\nmsgid \"Summons 12 deadly meteors around the caster, each causing 16 damage on impact.\"\nmsgstr \"Вызывает 12 смертоносных метеоров вокруг заклинателя, каждый из которых наносит 16 урона при ударе.\"\n\n#. Key:\tRuneStoneMeteorShower_level_desc_0\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMeteorShower.RuneStoneMeteorShower.LevelBasedDescOverride(0).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneMeteorShower.RuneStoneMeteorShower.LevelBasedDescOverride(0).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons <Green>12</> deadly meteors around the caster, each causing <White>16</> damage on impact.\"\nmsgstr \"Вызывает <Green>12</> смертоносных метеоров вокруг заклинателя, каждый из которых наносит <White>16</> урона при ударе.\"\n\n#. Key:\tRuneStoneMeteorShower_level_desc_1\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMeteorShower.RuneStoneMeteorShower.LevelBasedDescOverride(1).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneMeteorShower.RuneStoneMeteorShower.LevelBasedDescOverride(1).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons <Green>16</> deadly meteors around the caster, each causing <White>24</> damage on impact.\"\nmsgstr \"Вызывает <Green>16</> смертоносных метеоров вокруг заклинателя, каждый из которых наносит <White>24</> урона при ударе.\"\n\n#. Key:\tRuneStoneMeteorShower_level_desc_2\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMeteorShower.RuneStoneMeteorShower.LevelBasedDescOverride(2).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneMeteorShower.RuneStoneMeteorShower.LevelBasedDescOverride(2).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons <Green>20</> deadly meteors around the caster, each causing <White>32</> damage on impact. Each meteor has a <Green>30%</> chance to <Yellow>Stun</> the target.\"\nmsgstr \"Вызывает <Green> 20 </> смертоносных метеоров вокруг заклинателя, каждый из которых наносит <White> 32 </> урон при ударе. Каждый метеор имеет <Green> 30% </> шанс <Yellow> Оглушить </> цель.\"\n\n#. Key:\tRuneStoneMeteorShower_level_up_desc_0\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMeteorShower.RuneStoneMeteorShower.LevelUpBasedDescOverride(0).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneMeteorShower.RuneStoneMeteorShower.LevelUpBasedDescOverride(0).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons <Green>12</><YellowH>(→16)</> deadly meteors around the caster, each causing <White>16</><YellowH>(→24)</> damage on impact.\"\nmsgstr \"Вызывает <Green>12</><YellowH>(→16)</> смертоносных метеоров вокруг заклинателя, каждый из которых наносит <White>16</><YellowH>(→24)</> урона при ударе.\"\n\n#. Key:\tRuneStoneMeteorShower_level_up_desc_1\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMeteorShower.RuneStoneMeteorShower.LevelUpBasedDescOverride(1).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneMeteorShower.RuneStoneMeteorShower.LevelUpBasedDescOverride(1).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons <Green>16</><YellowH>(→20)</> deadly meteors around the caster, each causing <White>24</><YellowH>(→32)</> damage on impact. <YellowH>Each meteor has a</> <GreenH>30%</> <YellowH>chance to Stun the target.</>\"\nmsgstr \"Вызывает <Green> 16 </> <YellowH> (→ 20) </> смертоносных метеоров вокруг заклинателя, каждый из которых наносит <White> 24 </> <YellowH> (→ 32) </> при ударе. <YellowH> Каждый метеор имеет </> <GreenH> 30% </> <YellowH> шанс Оглушить цель. </>\"\n\n#. Key:\tRuneStoneMeteorShower_name\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMeteorShower.RuneStoneMeteorShower.Name\n#: /Game/SO/Items/RuneStones/RuneStoneMeteorShower.RuneStoneMeteorShower.Name\nmsgctxt \"ItemData\"\nmsgid \"Meteorstone\"\nmsgstr \"Метеорный Камень\"\n\n#. Key:\tRuneStoneShadowWalk_desc\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneShadowWalk.RuneStoneShadowWalk.Description\n#. Key:\tRuneStoneShadowWalk_level_desc_0\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneShadowWalk.RuneStoneShadowWalk.LevelBasedDescOverride(0).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneShadowWalk.RuneStoneShadowWalk.Description\n#: /Game/SO/Items/RuneStones/RuneStoneShadowWalk.RuneStoneShadowWalk.LevelBasedDescOverride(0).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Grants the ability to walk through your enemies for <Green>2</> seconds.\"\nmsgstr \"Дает возможность пройти сквозь врагов на <Green>2</> секунды.\"\n\n#. Key:\tRuneStoneShadowWalk_level_desc_1\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneShadowWalk.RuneStoneShadowWalk.LevelBasedDescOverride(1).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneShadowWalk.RuneStoneShadowWalk.LevelBasedDescOverride(1).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Grants the ability to walk through your enemies for <Green>4</> seconds.\"\nmsgstr \"Дает возможность пройти сквозь врагов на <Green>4</> секунды.\"\n\n#. Key:\tRuneStoneShadowWalk_level_desc_2\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneShadowWalk.RuneStoneShadowWalk.LevelBasedDescOverride(2).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneShadowWalk.RuneStoneShadowWalk.LevelBasedDescOverride(2).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Grants the ability to walk through your enemies for <Green>4</> seconds. Your magical resistance is increased by <Green>0.2.</>\"\nmsgstr \"Дает возможность пройти сквозь врагов на <Green>4</> секунды. Твое сопротивление магии увеличивается на <Green>0.2.</>\"\n\n#. Key:\tRuneStoneShadowWalk_level_desc_3\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneShadowWalk.RuneStoneShadowWalk.LevelBasedDescOverride(3).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneShadowWalk.RuneStoneShadowWalk.LevelBasedDescOverride(3).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Grants the ability to walk through your enemies for <Green>5</> seconds. Your magical resistance is increased by <Green>0.3.</>\"\nmsgstr \"Дает возможность пройти сквозь врагов на <Green>5</> секунды. Твое сопротивление магии увеличивается на <Green>0.3.</>\"\n\n#. Key:\tRuneStoneShadowWalk_level_up_desc_0\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneShadowWalk.RuneStoneShadowWalk.LevelUpBasedDescOverride(0).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneShadowWalk.RuneStoneShadowWalk.LevelUpBasedDescOverride(0).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Grants the ability to walk through your enemies for <Green>2</> <YellowH>(→4)</> seconds.\"\nmsgstr \"Дает возможность пройти сквозь врагов на <Green>2</> <YellowH>(→4)</> секунды.\"\n\n#. Key:\tRuneStoneShadowWalk_level_up_desc_1\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneShadowWalk.RuneStoneShadowWalk.LevelUpBasedDescOverride(1).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneShadowWalk.RuneStoneShadowWalk.LevelUpBasedDescOverride(1).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Grants the ability to walk through your enemies for <Green>4</> seconds. <YellowH>Your magical resistance is increased by</> <GreenH>0.2.</>\"\nmsgstr \"Дает возможность пройти сквозь врагов на <Green>4</> секунды. <YellowH>Твое сопротивление магии увеличивается на </> <Green>0.2.</>\"\n\n#. Key:\tRuneStoneShadowWalk_level_up_desc_2\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneShadowWalk.RuneStoneShadowWalk.LevelUpBasedDescOverride(2).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneShadowWalk.RuneStoneShadowWalk.LevelUpBasedDescOverride(2).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Grants the ability to walk through your enemies for <Green>4</> <YellowH>(→5)</> seconds. Your magical resistance is increased by <Green>0.2</> <YellowH>(→0.3).</>\"\nmsgstr \"Дает возможность пройти сквозь врагов на <Green>4</><YellowH>(→5)</> секунды. Твое сопротивление магии увеличивается на <Green>0.2</> <YellowH>(→0.3).</>\"\n\n#. Key:\tRuneStoneShadowWalk_name\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneShadowWalk.RuneStoneShadowWalk.Name\n#: /Game/SO/Items/RuneStones/RuneStoneShadowWalk.RuneStoneShadowWalk.Name\nmsgctxt \"ItemData\"\nmsgid \"Shadestone\"\nmsgstr \"Камень Тени\"\n\n#. Key:\tRuneStoneSoulkeeper_desc\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneSoulkeeper.RuneStoneSoulkeeper.Description\n#: /Game/SO/Items/RuneStones/RuneStoneSoulkeeper.RuneStoneSoulkeeper.Description\nmsgctxt \"ItemData\"\nmsgid \"Summons the Soulkeeper, a powerful spirit capable of gathering your essence should something bad happen to you.\\r\\n\\r\\nReleasing the spirit recharges the stone.\"\nmsgstr \"Вызывает Хранителя Душ, могущественный дух, способный восстановить твою сущность, если с тобой случится что-нибудь плохое.\\n\\nОсвобождение духа заряжает камень.\"\n\n#. Key:\tRuneStoneSoulkeeper_name\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneSoulkeeper.RuneStoneSoulkeeper.Name\n#: /Game/SO/Items/RuneStones/RuneStoneSoulkeeper.RuneStoneSoulkeeper.Name\nmsgctxt \"ItemData\"\nmsgid \"Soulstone\"\nmsgstr \"Камень Души\"\n\n#. Key:\tRuneStoneSoulkeeperInfinite_desc\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneSoulkeeperInfinite.RuneStoneSoulkeeperInfinite.Description\n#: /Game/SO/Items/RuneStones/RuneStoneSoulkeeperInfinite.RuneStoneSoulkeeperInfinite.Description\nmsgctxt \"ItemData\"\nmsgid \"Summons the Soulkeeper, a powerful spirit capable of gathering your essence should something bad happen to you.\"\nmsgstr \"Вызывает Хранителя Душ, могущественный дух, способный восстановить твою сущность, если с тобой случится что-нибудь плохое.\"\n\n#. Key:\tRuneStoneSoulkeeperInfinite_name\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneSoulkeeperInfinite.RuneStoneSoulkeeperInfinite.Name\n#: /Game/SO/Items/RuneStones/RuneStoneSoulkeeperInfinite.RuneStoneSoulkeeperInfinite.Name\nmsgctxt \"ItemData\"\nmsgid \"Elite Soulstone\"\nmsgstr \"Элитный Камень Души\"\n\n#. Key:\tRuneStoneSpellRegain_desc\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneSpellRegain.RuneStoneSpellRegain.Description\n#: /Game/SO/Items/RuneStones/RuneStoneSpellRegain.RuneStoneSpellRegain.Description\nmsgctxt \"ItemData\"\nmsgid \"Regenerates all other spell charges.\"\nmsgstr \"Регенерирует все остальные заклинания.\"\n\n#. Key:\tRuneStoneSpellRegain_name\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneSpellRegain.RuneStoneSpellRegain.Name\n#: /Game/SO/Items/RuneStones/RuneStoneSpellRegain.RuneStoneSpellRegain.Name\nmsgctxt \"ItemData\"\nmsgid \"Spiritstone\"\nmsgstr \"Духовный Камень\"\n\n#. Key:\tRuneStoneSwap_desc\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.Description\n#. Key:\tRuneStoneSwap_level_desc_0\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.LevelBasedDescOverride(0).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.Description\n#: /Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.LevelBasedDescOverride(0).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Swaps the position of the caster with the closest target in front of him/her/it.\"\nmsgstr \"Заклинатель меняется местами с ближайшей перед ним целью.\"\n\n#. Key:\tRuneStoneSwap_level_desc_1\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.LevelBasedDescOverride(1).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.LevelBasedDescOverride(1).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Swaps the position of the caster with the closest target in front of him/her/it. The selected target suffers <Blue>20</> damage.\"\nmsgstr \"Заклинатель меняется местами с ближайшей перед ним целью. Цель получает урон <Blue>20</>.\"\n\n#. Key:\tRuneStoneSwap_level_desc_2\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.LevelBasedDescOverride(2).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.LevelBasedDescOverride(2).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Swaps the position of the caster with the closest target in front of him/her/it. The selected target suffers <Blue>30</> damage and becomes <Orange>Slow</>.\"\nmsgstr \"Заклинатель меняется местами с ближайшей перед ним целью. Цель получает <Blue>30</> урона и <Orange>Замедляется</>.\"\n\n#. Key:\tRuneStoneSwap_level_desc_3\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.LevelBasedDescOverride(3).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.LevelBasedDescOverride(3).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Swaps the position of the caster with the closest target in front of him/her/it. The selected target suffers <Blue>40</> damage and becomes <Orange>Slow</>.\"\nmsgstr \"Заклинатель меняется местами с ближайшей перед ним целью. Цель получает <Blue>40</> урона и <Orange>Замедляется</>.\"\n\n#. Key:\tRuneStoneSwap_level_desc_4\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.LevelBasedDescOverride(4).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.LevelBasedDescOverride(4).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Swaps the position of the caster with the closest target in front of him/her/it. The selected target suffers <Blue>50</> damage and becomes <Orange>Slow</>.\"\nmsgstr \"Заклинатель меняется местами с ближайшей перед ним целью. Цель получает <Blue>50</> урона и <Orange>Замедляется</>.\"\n\n#. Key:\tRuneStoneSwap_level_up_desc_0\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.LevelUpBasedDescOverride(0).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.LevelUpBasedDescOverride(0).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Swaps the position of the caster with the closest target in front of him/her/it. <YellowH>The selected target suffers</> <BlueH>20</> <YellowH>damage.</>\"\nmsgstr \"Заклинатель меняется местами с ближайшей перед ним целью. <YellowH>Цель получает </> <BlueH>20</> <YellowH> урона.</>\"\n\n#. Key:\tRuneStoneSwap_level_up_desc_1\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.LevelUpBasedDescOverride(1).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.LevelUpBasedDescOverride(1).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Swaps the position of the caster with the closest target in front of him/her/it. The selected target suffers <Blue>20</><YellowH>(→30)</> damage <YellowH>and becomes </><Orange>Slow.</>\"\nmsgstr \"Заклинатель меняется местами с ближайшей перед ним целью. Цель получает <Blue>20</><YellowH>(→30)</> урона <YellowH>и </><Orange>Замедляется.</>\"\n\n#. Key:\tRuneStoneSwap_level_up_desc_2\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.LevelUpBasedDescOverride(2).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.LevelUpBasedDescOverride(2).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Swaps the position of the caster with the closest target in front of him/her/it. The selected target suffers <Blue>30</><YellowH>(→40)</> damage and becomes <Orange>Slow.</>\"\nmsgstr \"Заклинатель меняется местами с ближайшей перед ним целью. Цель получает <Blue>30</><YellowH>(→40)</> урона и <Orange>Замедляется.</>\"\n\n#. Key:\tRuneStoneSwap_level_up_desc_3\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.LevelUpBasedDescOverride(3).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.LevelUpBasedDescOverride(3).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Swaps the position of the caster with the closest target in front of him/her/it. The selected target suffers <Blue>40</><YellowH>(→50)</> damage and becomes <Orange>Slow.</>\"\nmsgstr \"Заклинатель меняется местами с ближайшей перед ним целью. Цель получает <Blue>40</><YellowH>(→50)</> урона и <Orange>Замедляется.</>\"\n\n#. Key:\tRuneStoneSwap_name\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.Name\n#: /Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.Name\nmsgctxt \"ItemData\"\nmsgid \"Swapstone\"\nmsgstr \"Своп-камень\"\n\n#. Key:\tRuneStoneWeaponFlame_desc\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.Description\n#: /Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.Description\nmsgctxt \"ItemData\"\nmsgid \"Enchants your active weapon with green flames - it causes an additional 0.3x damage for 4 seconds.\"\nmsgstr \"Зачаровывает твое активное оружие зеленым пламенем - наносит дополнительный урон 0.3x на 4 секунды.\"\n\n#. Key:\tRuneStoneWeaponFlame_level_desc_0\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.LevelBasedDescOverride(0).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.LevelBasedDescOverride(0).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Enchants your active weapon - it causes an additional <Green>0.5x</> damage for <Green>5</> seconds.\"\nmsgstr \"Зачаровывает твое активное оружие зеленым пламенем - наносит дополнительный <Green>0.5x</> урона на <Green>5</> секунды.\"\n\n#. Key:\tRuneStoneWeaponFlame_level_desc_1\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.LevelBasedDescOverride(1).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.LevelBasedDescOverride(1).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Enchants your active weapon - it causes an additional <Green>0.6x</> damage for <Green>5</> seconds. Each strike has a <Green>15%</> chance to apply <DarkGreen>Poison</>, causing an additional <Blue>18</> damage over <Green>6</> seconds.\"\nmsgstr \"Зачаровывает твое активное оружие - оно наносит дополнительный урон <Green>0.6x</> на <Green>5</> секунд. Каждый удар имеет <Green>15%</> шанс применить <DarkGreen>Яд </>, нанося дополнительный <Blue>18</> урон на <Green>6</> секунд.\"\n\n#. Key:\tRuneStoneWeaponFlame_level_desc_2\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.LevelBasedDescOverride(2).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.LevelBasedDescOverride(2).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Enchants your active weapon - it causes an additional <Green>0.7x</> damage for <Green>6</> seconds. Each strike has a <Green>20%</> chance to apply <DarkGreen>Poison</>, causing an additional <Blue>24</> damage over <Green>6</> seconds.\"\nmsgstr \"Зачаровывает твое активное оружие - оно наносит дополнительный урон <Green>0.7x</> на <Green>6</> секунд. Каждый удар имеет <Green>20%</> шанс применить <DarkGreen>Яд </>, нанося дополнительный <Blue>24</> урон на <Green>6</> секунд.\"\n\n#. Key:\tRuneStoneWeaponFlame_level_desc_3\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.LevelBasedDescOverride(3).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.LevelBasedDescOverride(3).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Enchants your active weapon - it causes an additional <Green>0.8x</> damage for <Green>6</> seconds. Each strike has a <Green>25%</> chance to apply <DarkGreen>Poison</>, causing an additional <Blue>30</> damage over <Green>6</> seconds.\"\nmsgstr \"Зачаровывает твое активное оружие - оно наносит дополнительный урон <Green>0.8x</> на <Green>6</> секунд. Каждый удар имеет <Green>25%</> шанс применить <DarkGreen>Яд </>, нанося дополнительный <Blue>30</> урон на <Green>6</> секунд.\"\n\n#. Key:\tRuneStoneWeaponFlame_level_desc_4\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.LevelBasedDescOverride(4).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.LevelBasedDescOverride(4).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Enchants your active weapon - it causes an additional <Green>0.9x</> damage for <Green>6</> seconds. Each strike has a <Green>30%</> chance to apply <DarkGreen>Poison</>, causing an additional <Blue>36</> damage over <Green>6</> seconds.\"\nmsgstr \"Зачаровывает твое активное оружие - оно наносит дополнительный урон <Green>0.9x</> на <Green>6</> секунд. Каждый удар имеет <Green>30%</> шанс применить <DarkGreen>Яд </>, нанося дополнительный <Blue>36</> урон на <Green>6</> секунд.\"\n\n#. Key:\tRuneStoneWeaponFlame_level_up_desc_0\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.LevelUpBasedDescOverride(0).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.LevelUpBasedDescOverride(0).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Enchants your active weapon - it causes an additional <Green>0.5x</><YellowH>(→0.6x)</> damage for <Green>5</> seconds. <YellowH>Each strike has a</> <GreenH>15%</> <YellowH>chance to apply </><DarkGreenH>Poison</><YellowH>, causing an additional</> <BlueH>18</> <YellowH>damage over</> <GreenH>6</> <YellowH>seconds.</>\"\nmsgstr \"Зачаровывает твое активное оружие - оно наносит дополнительный урон <Green>0.5x</><YellowH>(→0.6x)</> на <Green>5</> секунд. <YellowH>Каждый удар имеет </> <Green>15%</> <YellowH>шанс применить</> <DarkGreen>Яд </>, <YellowH>нанося дополнительный</> <Blue>18</> <YellowH>урон на </> <GreenH>6</> <YellowH> секунд.</>\"\n\n#. Key:\tRuneStoneWeaponFlame_level_up_desc_1\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.LevelUpBasedDescOverride(1).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.LevelUpBasedDescOverride(1).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Enchants your active weapon - it causes an additional <Green>0.6x</><YellowH>(→0.7x)</> damage for <Green>5</><YellowH>(→6)</> seconds. Each strike has a <Green>15%</><YellowH>(→20%)</> chance to apply <DarkGreen>Poison</>, causing an additional <Blue>18</><YellowH>(→24)</> damage over <Green>6</> seconds.\"\nmsgstr \"Зачаровывает твое активное оружие - оно наносит дополнительный урон <Green>0.6x</><YellowH>(→0.7x)</> на <Green>5</><YellowH>(→6)</> секунд. Каждый удар имеет <Green>15%</><YellowH>(→20%)</>шанс применить</> <DarkGreen>Яд </>, нанося дополнительный <Blue>18</><YellowH>(→24)</> урон на <GreenH>6</> секунд.\"\n\n#. Key:\tRuneStoneWeaponFlame_level_up_desc_2\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.LevelUpBasedDescOverride(2).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.LevelUpBasedDescOverride(2).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Enchants your active weapon - it causes an additional <Green>0.7x</><YellowH>(→0.8x)</> damage for <Green>6</> seconds. Each strike has a <Green>20%</><YellowH>(→25%)</> chance to apply <DarkGreen>Poison</>, causing an additional <Blue>24</><YellowH>(→30)</> damage over <Green>6</> seconds.\"\nmsgstr \"Зачаровывает твое активное оружие - оно наносит дополнительный урон <Green>0.7x</><YellowH>(→0.8x)</> на <Green>6</> секунд. Каждый удар имеет <Green>20%</><YellowH>(→25%)</> шанс применить</> <DarkGreen>Яд </>, нанося дополнительный <Blue>24</><YellowH>(→30)</> урона на <GreenH>6</> секунд.\"\n\n#. Key:\tRuneStoneWeaponFlame_level_up_desc_3\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.LevelUpBasedDescOverride(3).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.LevelUpBasedDescOverride(3).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Enchants your active weapon - it causes an additional <Green>0.8x</><YellowH>(→0.9x)</> damage for <Green>6</> seconds. Each strike has a <Green>25%</><YellowH>(→30%)</> chance to apply <DarkGreen>Poison</>, causing an additional <Blue>30</><YellowH>(→36)</> damage over <Green>6</> seconds.\"\nmsgstr \"Зачаровывает твое активное оружие - оно наносит дополнительный урон <Green>0.8x</><YellowH>(→0.9x)</> на <Green>6</> секунд. Каждый удар имеет <Green>25%</><YellowH>(→30%)</> шанс применить</> <DarkGreen>Яд </>, нанося дополнительный <Blue>30</><YellowH>(→36)</> урона на <GreenH>6</> секунд.\"\n\n#. Key:\tRuneStoneWeaponFlame_name\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.Name\n#: /Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.Name\nmsgctxt \"ItemData\"\nmsgid \"Green Flamestone\"\nmsgstr \"Зеленый Пламенный Камень\"\n\n#. Key:\tSabre_desc\n#. SourceLocation:\t/Game/SO/Items/Weapons/Sabre.Sabre.Description\n#: /Game/SO/Items/Weapons/Sabre.Sabre.Description\nmsgctxt \"ItemData\"\nmsgid \"Rangol was a legendary blacksmith who practiced his crafting art for a hundred years. This sabre was made on day one.\"\nmsgstr \"Рангол был легендарным кузнецом, который сто лет занимался своим ремеслом. Эта сабля была сделана в первый день.\"\n\n#. Key:\tSabre_name\n#. SourceLocation:\t/Game/SO/Items/Weapons/Sabre.Sabre.Name\n#: /Game/SO/Items/Weapons/Sabre.Sabre.Name\nmsgctxt \"ItemData\"\nmsgid \"First Sabre of Rangol\"\nmsgstr \"Первая Сабля Рангола\"\n\n#. Key:\tSecondChance_desc\n#. SourceLocation:\t/Game/SO/Items/RuneStones/SecondChance.SecondChance.Description\n#: /Game/SO/Items/RuneStones/SecondChance.SecondChance.Description\nmsgctxt \"ItemData\"\nmsgid \"Prevents death.\"\nmsgstr \"Предотвращает смерть.\"\n\n#. Key:\tSecondChance_name\n#. SourceLocation:\t/Game/SO/Items/RuneStones/SecondChance.SecondChance.Name\n#: /Game/SO/Items/RuneStones/SecondChance.SecondChance.Name\nmsgctxt \"ItemData\"\nmsgid \"Chancestone\"\nmsgstr \"Шанс-камень\"\n\n#. Key:\tSecretWeirdDevice_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/SecretWeirdDevice.SecretWeirdDevice.Description\n#: /Game/SO/Items/QuestItems/SecretWeirdDevice.SecretWeirdDevice.Description\nmsgctxt \"ItemData\"\nmsgid \"A weird device, most likely one of the inventions of the Secret Science Society.\"\nmsgstr \"Странное устройство, скорее всего, одно из изобретений Тайного Научного Общества.\"\n\n#. Key:\tSecretWeirdDevice_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/SecretWeirdDevice.SecretWeirdDevice.Name\n#: /Game/SO/Items/QuestItems/SecretWeirdDevice.SecretWeirdDevice.Name\nmsgctxt \"ItemData\"\nmsgid \"Weird Device\"\nmsgstr \"Странное Устройство\"\n\n#. Key:\tShardAmber_desc\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardAmber.ShardAmber.Description\n#: /Game/SO/Items/Shards/ShardAmber.ShardAmber.Description\nmsgctxt \"ItemData\"\nmsgid \"Each melee strike has an additional <Yellow>10%</> chance to cause a critical hit, causing <Green>200%</> of your normal weapon damage.\"\nmsgstr \"Каждый удар в ближнем бою имеет дополнительный <Yellow>10%</> шанс нанести критический удар, нанося <Green>200%</> урона от твоего обычного оружия.\"\n\n#. Key:\tShardAmber_name\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardAmber.ShardAmber.Name\n#: /Game/SO/Items/Shards/ShardAmber.ShardAmber.Name\nmsgctxt \"ItemData\"\nmsgid \"Amber Shard\"\nmsgstr \"Янтарный Осколок\"\n\n#. Key:\tShardAmberBright_desc\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardAmberBright.ShardAmberBright.Description\n#: /Game/SO/Items/Shards/ShardAmberBright.ShardAmberBright.Description\nmsgctxt \"ItemData\"\nmsgid \"Each melee strike has an additional <Yellow>20%</> chance to cause a critical hit, causing <Green>200%</> of your normal weapon damage.\"\nmsgstr \"Каждый удар в ближнем бою имеет дополнительный <Yellow>20%</> шанс на критический удар, нанося <Green>200%</> обычного урона от оружия.\"\n\n#. Key:\tShardAmberBright_name\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardAmberBright.ShardAmberBright.Name\n#: /Game/SO/Items/Shards/ShardAmberBright.ShardAmberBright.Name\nmsgctxt \"ItemData\"\nmsgid \"Bright Amber Shard\"\nmsgstr \"Яркий Янтарный Осколок\"\n\n#. Key:\tShardAqua_desc\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardAqua.ShardAqua.Description\n#: /Game/SO/Items/Shards/ShardAqua.ShardAqua.Description\nmsgctxt \"ItemData\"\nmsgid \"Cooldown recharge speed is increased by <Blue>20%</>.\"\nmsgstr \"Скорость Восстановления увеличена на <Blue>20%</>.\"\n\n#. Key:\tShardAqua_name\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardAqua.ShardAqua.Name\n#: /Game/SO/Items/Shards/ShardAqua.ShardAqua.Name\nmsgctxt \"ItemData\"\nmsgid \"Aqua Shard\"\nmsgstr \"Аква-Осколок\"\n\n#. Key:\tShardAquaBright_desc\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardAquaBright.ShardAquaBright.Description\n#: /Game/SO/Items/Shards/ShardAquaBright.ShardAquaBright.Description\nmsgctxt \"ItemData\"\nmsgid \"Cooldown recharge speed is increased by <Blue>40%</>.\"\nmsgstr \"Скорость Восстановления увеличена на <Blue>40%</>.\"\n\n#. Key:\tShardAquaBright_name\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardAquaBright.ShardAquaBright.Name\n#: /Game/SO/Items/Shards/ShardAquaBright.ShardAquaBright.Name\nmsgctxt \"ItemData\"\nmsgid \"Bright Aqua Shard\"\nmsgstr \"Яркий Аква-Осколок\"\n\n#. Key:\tShardBlack_desc\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardBlack.ShardBlack.Description\n#: /Game/SO/Items/Shards/ShardBlack.ShardBlack.Description\nmsgctxt \"ItemData\"\nmsgid \"Every time an enemy hits you with a melee strike or overlaps you it is turned into a boot for a short time.\"\nmsgstr \"Каждый раз, когда враг наносит тебе удар ближнего боя или перекрывает тебя, он на короткое время превращается в ботинок.\"\n\n#. Key:\tShardBlack_name\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardBlack.ShardBlack.Name\n#: /Game/SO/Items/Shards/ShardBlack.ShardBlack.Name\nmsgctxt \"ItemData\"\nmsgid \"Black Shard\"\nmsgstr \"Чёрный Осколок\"\n\n#. Key:\tShardBlue_desc\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardBlue.ShardBlue.Description\n#: /Game/SO/Items/Shards/ShardBlue.ShardBlue.Description\nmsgctxt \"ItemData\"\nmsgid \"Decreases the incoming <Blue>Magical Damage</> by <Blue>20%.</>\"\nmsgstr \"Уменьшает поступающий <Blue>урон Магии</> на <Blue>20%.</>\"\n\n#. Key:\tShardBlue_name\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardBlue.ShardBlue.Name\n#: /Game/SO/Items/Shards/ShardBlue.ShardBlue.Name\nmsgctxt \"ItemData\"\nmsgid \"Blue Shard\"\nmsgstr \"Голубой Осколок\"\n\n#. Key:\tShardBlueBright_desc\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardBlueBright.ShardBlueBright.Description\n#: /Game/SO/Items/Shards/ShardBlueBright.ShardBlueBright.Description\nmsgctxt \"ItemData\"\nmsgid \"Decreases the incoming <Blue>Magical Damage</> by <Blue>30%.</>\"\nmsgstr \"Уменьшает поступающий <Blue>урон Магии</> на <Blue>30%.</>\"\n\n#. Key:\tShardBlueBright_name\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardBlueBright.ShardBlueBright.Name\n#: /Game/SO/Items/Shards/ShardBlueBright.ShardBlueBright.Name\nmsgctxt \"ItemData\"\nmsgid \"Bright Blue Shard\"\nmsgstr \"Ярко-голубой Осколок\"\n\n#. Key:\tShardGreen_desc\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardGreen.ShardGreen.Description\n#: /Game/SO/Items/Shards/ShardGreen.ShardGreen.Description\nmsgctxt \"ItemData\"\nmsgid \"Increases the attack speed by <Green>20%</>\"\nmsgstr \"Увеличивает скорость атаки на <Green>20%</>\"\n\n#. Key:\tShardGreen_name\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardGreen.ShardGreen.Name\n#: /Game/SO/Items/Shards/ShardGreen.ShardGreen.Name\nmsgctxt \"ItemData\"\nmsgid \"Green Shard\"\nmsgstr \"Зелёный Осколок\"\n\n#. Key:\tShardGreenBright_desc\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardGreenBright.ShardGreenBright.Description\n#: /Game/SO/Items/Shards/ShardGreenBright.ShardGreenBright.Description\nmsgctxt \"ItemData\"\nmsgid \"Increases the attack speed by <Green>30%</>\"\nmsgstr \"Увеличивает скорость атаки на <Green>30%</>\"\n\n#. Key:\tShardGreenBright_name\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardGreenBright.ShardGreenBright.Name\n#: /Game/SO/Items/Shards/ShardGreenBright.ShardGreenBright.Name\nmsgctxt \"ItemData\"\nmsgid \"Bright Green Shard\"\nmsgstr \"Ярко-зелёный Осколок\"\n\n#. Key:\tShardPurple_desc\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardPurple.ShardPurple.Description\n#: /Game/SO/Items/Shards/ShardPurple.ShardPurple.Description\nmsgctxt \"ItemData\"\nmsgid \"Each time you cast a charge based spell you have a <Purple>25%</> chance to regain the charge.\"\nmsgstr \"Каждый раз, когда ты сотворяешь заряженное заклинание, ты имеешь <Purple>25%</> шанс восстановить заряд.\"\n\n#. Key:\tShardPurple_name\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardPurple.ShardPurple.Name\n#: /Game/SO/Items/Shards/ShardPurple.ShardPurple.Name\nmsgctxt \"ItemData\"\nmsgid \"Purple Shard\"\nmsgstr \"Пурпурный Осколок\"\n\n#. Key:\tShardPurpleBright_desc\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardPurpleBright.ShardPurpleBright.Description\n#: /Game/SO/Items/Shards/ShardPurpleBright.ShardPurpleBright.Description\nmsgctxt \"ItemData\"\nmsgid \"Each time you cast a charge based spell you have a <Purple>50%</> chance to regain the charge.\"\nmsgstr \"Каждый раз, когда ты сотворяешь заряженное заклинание, ты имеешь <Purple>50%</> шанс восстановить заряд.\"\n\n#. Key:\tShardPurpleBright_name\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardPurpleBright.ShardPurpleBright.Name\n#: /Game/SO/Items/Shards/ShardPurpleBright.ShardPurpleBright.Name\nmsgctxt \"ItemData\"\nmsgid \"Bright Purple Shard\"\nmsgstr \"Ярко-пурпурный Осколок\"\n\n#. Key:\tShardRed_desc\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardRed.ShardRed.Description\n#: /Game/SO/Items/Shards/ShardRed.ShardRed.Description\nmsgctxt \"ItemData\"\nmsgid \"You heal <Red>5%</> of the melee damage you inflict on your enemies.\"\nmsgstr \"Ты лечишься <Red>5%</> от урона, нанесенного в ближнем бою твоим врагам.\"\n\n#. Key:\tShardRed_name\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardRed.ShardRed.Name\n#: /Game/SO/Items/Shards/ShardRed.ShardRed.Name\nmsgctxt \"ItemData\"\nmsgid \"Red Shard\"\nmsgstr \"Красный Осколок\"\n\n#. Key:\tShardRedBright_desc\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardRedBright.ShardRedBright.Description\n#: /Game/SO/Items/Shards/ShardRedBright.ShardRedBright.Description\nmsgctxt \"ItemData\"\nmsgid \"You heal <Red>10%</> of the melee damage you inflict on your enemies.\"\nmsgstr \"Ты лечишься <Red>10%</> от урона, нанесенного в ближнем бою твоим врагам.\"\n\n#. Key:\tShardRedBright_name\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardRedBright.ShardRedBright.Name\n#: /Game/SO/Items/Shards/ShardRedBright.ShardRedBright.Name\nmsgctxt \"ItemData\"\nmsgid \"Bright Red Shard\"\nmsgstr \"Ярко-красный Осколок\"\n\n#. Key:\tShardSilver_desc\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardSilver.ShardSilver.Description\n#: /Game/SO/Items/Shards/ShardSilver.ShardSilver.Description\nmsgctxt \"ItemData\"\nmsgid \"Decreases the incoming <White>Physical Damage</> by <White>20%.</>\"\nmsgstr \"Уменьшает поступающий <White>Физический урон</> на <White>20%.</>\"\n\n#. Key:\tShardSilver_name\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardSilver.ShardSilver.Name\n#: /Game/SO/Items/Shards/ShardSilver.ShardSilver.Name\nmsgctxt \"ItemData\"\nmsgid \"Silver Shard\"\nmsgstr \"Серебряный осколок\"\n\n#. Key:\tShardSilverBright_desc\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardSilverBright.ShardSilverBright.Description\n#: /Game/SO/Items/Shards/ShardSilverBright.ShardSilverBright.Description\nmsgctxt \"ItemData\"\nmsgid \"Decreases the incoming <White>Physical Damage</> by <White>30%.</>\"\nmsgstr \"Уменьшает поступающий <White>Физический урон</> на <White>30%.</>\"\n\n#. Key:\tShardSilverBright_name\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardSilverBright.ShardSilverBright.Name\n#: /Game/SO/Items/Shards/ShardSilverBright.ShardSilverBright.Name\nmsgctxt \"ItemData\"\nmsgid \"Bright Silver Shard\"\nmsgstr \"Яркий Серебряный Осколок\"\n\n#. Key:\tShardTeal_desc\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardTeal.ShardTeal.Description\n#: /Game/SO/Items/Shards/ShardTeal.ShardTeal.Description\nmsgctxt \"ItemData\"\nmsgid \"Each time an enemy hits you with a melee strike it suffers the same damage.\"\nmsgstr \"Каждый раз, когда враг ударяет тебя в ближнем бою, он получает такой же урон.\"\n\n#. Key:\tShardTeal_name\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardTeal.ShardTeal.Name\n#: /Game/SO/Items/Shards/ShardTeal.ShardTeal.Name\nmsgctxt \"ItemData\"\nmsgid \"Teal Shard\"\nmsgstr \"Тиловый Осколок\"\n\n#. Key:\tShardTealBright_desc\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardTealBright.ShardTealBright.Description\n#: /Game/SO/Items/Shards/ShardTealBright.ShardTealBright.Description\nmsgctxt \"ItemData\"\nmsgid \"Each time an enemy hits you, it suffers <Green>200%</> of the damage.\"\nmsgstr \"Каждый раз, когда враг ударяет тебя, он получает <Green>200%</> урона.\"\n\n#. Key:\tShardTealBright_name\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardTealBright.ShardTealBright.Name\n#: /Game/SO/Items/Shards/ShardTealBright.ShardTealBright.Name\nmsgctxt \"ItemData\"\nmsgid \"Bright Teal Shard\"\nmsgstr \"Яркий Тиловый Осколок\"\n\n#. Key:\tShardWhite_desc\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardWhite.ShardWhite.Description\n#: /Game/SO/Items/Shards/ShardWhite.ShardWhite.Description\nmsgctxt \"ItemData\"\nmsgid \"Increases your damage by <Green>20%</>\"\nmsgstr \"Увеличивает твой урон на <Green>20%</>\"\n\n#. Key:\tShardWhite_name\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardWhite.ShardWhite.Name\n#: /Game/SO/Items/Shards/ShardWhite.ShardWhite.Name\nmsgctxt \"ItemData\"\nmsgid \"White Shard\"\nmsgstr \"Белый Осколок\"\n\n#. Key:\tShardWhiteBright_desc\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardWhiteBright.ShardWhiteBright.Description\n#: /Game/SO/Items/Shards/ShardWhiteBright.ShardWhiteBright.Description\nmsgctxt \"ItemData\"\nmsgid \"Increases your damage by <Green>30%</>.\"\nmsgstr \"Увеличивает твой урон на <Green>30%</>.\"\n\n#. Key:\tShardWhiteBright_name\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardWhiteBright.ShardWhiteBright.Name\n#: /Game/SO/Items/Shards/ShardWhiteBright.ShardWhiteBright.Name\nmsgctxt \"ItemData\"\nmsgid \"Bright White Shard\"\nmsgstr \"Ярко-белый Осколок\"\n\n#. Key:\tShardYellow_desc\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardYellow.ShardYellow.Description\n#: /Game/SO/Items/Shards/ShardYellow.ShardYellow.Description\nmsgctxt \"ItemData\"\nmsgid \"Each melee strike has a <Yellow>10%</> chance to <Yellow>Stun</> the target.\"\nmsgstr \"Каждый удар в ближнем бою имеет <Yellow>10%</> шанс <Yellow>Оглушить</> цель.\"\n\n#. Key:\tShardYellow_name\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardYellow.ShardYellow.Name\n#: /Game/SO/Items/Shards/ShardYellow.ShardYellow.Name\nmsgctxt \"ItemData\"\nmsgid \"Yellow Shard\"\nmsgstr \"Желтый Осколок\"\n\n#. Key:\tShardYellowBright_desc\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardYellowBright.ShardYellowBright.Description\n#: /Game/SO/Items/Shards/ShardYellowBright.ShardYellowBright.Description\nmsgctxt \"ItemData\"\nmsgid \"Each melee strike has a <Yellow>20%</> chance to <Yellow>Stun</> the target.\"\nmsgstr \"Каждый удар в ближнем бою имеет <Yellow>20%</> шанс <Yellow>Оглушить</> цель.\"\n\n#. Key:\tShardYellowBright_name\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardYellowBright.ShardYellowBright.Name\n#: /Game/SO/Items/Shards/ShardYellowBright.ShardYellowBright.Name\nmsgctxt \"ItemData\"\nmsgid \"Bright Yellow Shard\"\nmsgstr \"Ярко-желтый Осколок\"\n\n#. Key:\tSpellCaster_desc\n#. SourceLocation:\t/Game/SO/Items/Useable/SpellCaster.SpellCaster.Description\n#: /Game/SO/Items/Useable/SpellCaster.SpellCaster.Description\nmsgctxt \"ItemData\"\nmsgid \"A magical artefact with the following worn text engraved on the back:\\r\\n\\r\\nInsert Runestones to ... spells\\r\\nKeep .... .... children\\r\\nMade in .....\"\nmsgstr \"Волшебный артефакт со следующим потертым текстом, выгравированным на обратной стороне:\\n\\nВставка рунических камней в … заклинания\\nБереги …. … детей.\\nСделано в ..…\"\n\n#. Key:\tSpellCaster_name\n#. SourceLocation:\t/Game/SO/Items/Useable/SpellCaster.SpellCaster.Name\n#: /Game/SO/Items/Useable/SpellCaster.SpellCaster.Name\nmsgctxt \"ItemData\"\nmsgid \"Spellcaster\"\nmsgstr \"Заклинатель\"\n\n#. Key:\tStraightSword_desc\n#. SourceLocation:\t/Game/SO/Items/Weapons/StraightSword.StraightSword.Description\n#: /Game/SO/Items/Weapons/StraightSword.StraightSword.Description\nmsgctxt \"ItemData\"\nmsgid \"A simple yet effective weapon. Not too rusty, not too sharp. If someone looks close enough it looks a bit low budget, but the ones looking close enough won't talk about anything anymore, will they?\"\nmsgstr \"Простое, но эффективное оружие. Не слишком ржавое, не слишком острое. На первый взгляд оно выглядит немного дешево но те кто подойдут присмотреться поближе больше никогда, ни о чем, не заговорят, не так ли?\"\n\n#. Key:\tStraightSword_name\n#. SourceLocation:\t/Game/SO/Items/Weapons/StraightSword.StraightSword.Name\n#: /Game/SO/Items/Weapons/StraightSword.StraightSword.Name\nmsgctxt \"ItemData\"\nmsgid \"Straight Sword\"\nmsgstr \"Прямой Меч\"\n\n#. Key:\tTestStoneBag_desc\n#. SourceLocation:\t/Game/SO/Items/Useable/TestStoneBag.TestStoneBag.Description\n#: /Game/SO/Items/Useable/TestStoneBag.TestStoneBag.Description\nmsgctxt \"ItemData\"\nmsgid \"When you are the one in the team who has the job to enter every dungeon first, you will become a careful one too... if you live long enough for that.\"\nmsgstr \"Когда ты тот, чья работа в команде состоит в том, чтобы войти в каждое подземелье первым, ты тоже станешь осторожным…если ты конечно доживешь до этого.\"\n\n#. Key:\tTestStoneBag_name\n#. SourceLocation:\t/Game/SO/Items/Useable/TestStoneBag.TestStoneBag.Name\n#: /Game/SO/Items/Useable/TestStoneBag.TestStoneBag.Name\nmsgctxt \"ItemData\"\nmsgid \"Bag of the Careful One\"\nmsgstr \"Мешок Осторожного\"\n\n#. Key:\tWheel_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/Wheel.Wheel.Description\n#: /Game/SO/Items/QuestItems/Wheel.Wheel.Description\nmsgctxt \"ItemData\"\nmsgid \"One of the first greatest inventions of humans. Because they envied balls for their rolling skill.\"\nmsgstr \"Одно из первых величайших изобретений человека. Потому что они завидовали шарам за их умение катиться.\"\n\n#. Key:\tWheel_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/Wheel.Wheel.Name\n#: /Game/SO/Items/QuestItems/Wheel.Wheel.Name\nmsgctxt \"ItemData\"\nmsgid \"Wheel\"\nmsgstr \"Колесо\"\n\n#. Key:\tWWBossShipLock_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/WWBossShipLock.WWBossShipLock.Description\n#: /Game/SO/Items/Keys/WWBossShipLock.WWBossShipLock.Description\nmsgctxt \"ItemData\"\nmsgid \"Rusty key of a rusty lock.\"\nmsgstr \"Ржавый ключ от ржавого замка.\"\n\n#. Key:\tWWBossShipLock_name\n#. SourceLocation:\t/Game/SO/Items/Keys/WWBossShipLock.WWBossShipLock.Name\n#: /Game/SO/Items/Keys/WWBossShipLock.WWBossShipLock.Name\nmsgctxt \"ItemData\"\nmsgid \"Rusty Key\"\nmsgstr \"Ржавый Ключ\"\n\n#. Key:\t0BFD568E4989A20D66B91DA476C0E6B4\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_6.Text\n#: /Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_6.Text\nmsgctxt \"Notes\"\nmsgid \"I promised Fountain to give its flower to the Magic Mirror.\"\nmsgstr \"Я пообещал Фонтану что передам его цветок Волшебному Зеркалу.\"\n\n#. Key:\t1ABD11A64A7649801A6AB6A8BBDC686C\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_9.Text\n#: /Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_9.Text\nmsgctxt \"Notes\"\nmsgid \"The Ghost Dwarf needs a ghost abacus\"\nmsgstr \"Гному-призраку нужен призрачный абакус\"\n\n#. Key:\t57CBE1274A1B4EC7FD68EA9288161AAD\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_7.Text\n#: /Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_7.Text\nmsgctxt \"Notes\"\nmsgid \"The Chef wants me to clear the shore\"\nmsgstr \"Повар хочет, чтобы я очистил берег\"\n\n#. Key:\t77693D6C43702786250364932BD34BCD\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note.Text\n#: /Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note.Text\nmsgctxt \"Notes\"\nmsgid \"The GateKeeper could use a chair\"\nmsgstr \"Хранителю Врат не помешало бы иметь стул\"\n\n#. Key:\t9C3FB78C4598A48BC187B580CBB070F6\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_8.Text\n#: /Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_8.Text\nmsgctxt \"Notes\"\nmsgid \"The Dwarf wants me to clear the Dwarven Fortress\"\nmsgstr \"Гном хочет, чтобы я очистил крепость Гномов\"\n\n#. Key:\tAA94EB6E4B0A505D730971932A3DE0CC\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_5.Text\n#: /Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_5.Text\nmsgctxt \"Notes\"\nmsgid \"The Golem Maker wants me to hunt some Golems\"\nmsgstr \"Создатель Големов хочет, чтобы я поохотился на Големов\"\n\n#. Key:\tAE371E564EC1D75947ECF98AAA896A2C\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_11.Text\n#: /Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_11.Text\nmsgctxt \"Notes\"\nmsgid \"A Pipe Walker is trapped in a cage\"\nmsgstr \"Трубоходик заперт в клетке\"\n\n#. Key:\tB12481ED4CFF0182EDB7ACAA416B55FC\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_4.Text\n#: /Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_4.Text\nmsgctxt \"Notes\"\nmsgid \"Gnory needs a wheel\"\nmsgstr \"Гнори нужно колесо\"\n\n#. Key:\tD3B6D81E433CBE8461E2B1AFE06E9741\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_13.Text\n#: /Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_13.Text\nmsgctxt \"Notes\"\nmsgid \"The Chef asked me to bring him some Purple Mushroom\"\nmsgstr \"Повар попросил меня принести ему пурпурных грибов\"\n\n#. Key:\tD8C4FFC7435C6A2E7C88BBA7109A1907\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_12.Text\n#: /Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_12.Text\nmsgctxt \"Notes\"\nmsgid \"I need to learn Dwarven to open a gate\"\nmsgstr \"Мне нужно выучить Гномский язык чтобы открыть врата…\"\n\n#. Key:\tE3857F07468C2A0B34A98887E3BBB1DA\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_10.Text\n#: /Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_10.Text\nmsgctxt \"Notes\"\nmsgid \"I feel the Tomb of Tabby is important somehow\"\nmsgstr \"Я чувствую, что Гробница Табби как-то важна\"\n\n#. Key:\tE9DA40684B9375A5F78D18A138C75174\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_2.Text\n#: /Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_2.Text\nmsgctxt \"Notes\"\nmsgid \"Teachy asked for a strangely unique device\"\nmsgstr \"Ученый попросил странно уникальное устройство\"\n\n#. Key:\tF109A1614B16565CC1846C8D0A46672E\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_1.Text\n#: /Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_1.Text\nmsgctxt \"Notes\"\nmsgid \"I promised Lory to bring her some books\"\nmsgstr \"Я пообещал Лори принести ей несколько книг\"\n\n#. Key:\taway\n#. SourceLocation:\tSource/SOrb/UI/InGame/SoUIStationPanel.cpp:98\n#: Source/SOrb/UI/InGame/SoUIStationPanel.cpp:98\nmsgctxt \"StationNames\"\nmsgid \"World's End\"\nmsgstr \"Конец Света\"\n\n#. Key:\tcrossroadcave\n#. SourceLocation:\tSource/SOrb/UI/InGame/SoUIStationPanel.cpp:94\n#: Source/SOrb/UI/InGame/SoUIStationPanel.cpp:94\nmsgctxt \"StationNames\"\nmsgid \"Crossroad Cave\"\nmsgstr \"Пещера Кроссроуд\"\n\n#. Key:\tlavatemple\n#. SourceLocation:\tSource/SOrb/UI/InGame/SoUIStationPanel.cpp:96\n#: Source/SOrb/UI/InGame/SoUIStationPanel.cpp:96\nmsgctxt \"StationNames\"\nmsgid \"Remnant Road\"\nmsgstr \"Оставшаяся дорога\"\n\n#. Key:\toutpost\n#. SourceLocation:\tSource/SOrb/UI/InGame/SoUIStationPanel.cpp:95\n#: Source/SOrb/UI/InGame/SoUIStationPanel.cpp:95\nmsgctxt \"StationNames\"\nmsgid \"Obedient Outpost\"\nmsgstr \"Послушная Застава\"\n\n#. Key:\tstay\n#. SourceLocation:\tSource/SOrb/UI/InGame/SoUIStationPanel.cpp:99\n#: Source/SOrb/UI/InGame/SoUIStationPanel.cpp:99\nmsgctxt \"StationNames\"\nmsgid \"Stay\"\nmsgstr \"Остаться\"\n\n#. Key:\twrackedWaters\n#. SourceLocation:\tSource/SOrb/UI/InGame/SoUIStationPanel.cpp:97\n#: Source/SOrb/UI/InGame/SoUIStationPanel.cpp:97\nmsgctxt \"StationNames\"\nmsgid \"Wracked Waters\"\nmsgstr \"Отводные воды\"\n\n"
  },
  {
    "path": "Content/Localization/Warriorb/uk/Warriorb.po",
    "content": "﻿# Warriorb Ukrainian translation.\n# Copyright 1998-2019 Epic Games, Inc. All Rights Reserved.\n# \nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: Warriorb\\n\"\n\"POT-Creation-Date: 2020-10-07 08:12\\n\"\n\"PO-Revision-Date: 2020-10-07 08:12\\n\"\n\"Language-Team: \\n\"\n\"Language: uk\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\\n\"\n\n#. Key:\t78A72CB345FCC7ECDCFD8181471D78D8\n#. SourceLocation:\t/Game/SO/GUI/UI_Credits.UI_Credits_C:WidgetTree.CreditsText.Text\n#: /Game/SO/GUI/UI_Credits.UI_Credits_C:WidgetTree.CreditsText.Text\nmsgid \"<T>-- Not Yet Team --</>\\r\\n\\r\\n\\r\\nAnna Molnár\\r\\n<R>2D art, Environment Design</>\\r\\n\\r\\n\\r\\nCsaba Molnár\\r\\n<R>Code, Design</>\\r\\n\\r\\n\\r\\nDaniel Butum\\r\\n<R>Code</>\\r\\n\\r\\n\\r\\nGéza Molnár\\r\\n<R>3D art, Design</>\\r\\n\\r\\n\\r\\nRichárd Ráski\\r\\n<R>Sound Design</>\\r\\n\\r\\n\\r\\n\\r\\n<T>-- Music --</>\\r\\n\\r\\nBenjámin Kuli\\r\\n\\r\\n\\r\\nGisula\\r\\n\\r\\n\\r\\n\\r\\n<T>-- Voice Over --</>\\r\\n\\r\\n\\r\\nPeter Luzsi - @peterluzsi\\r\\n<R>WarriOrb, Gatekeeper, Ghost Armor, Principal</>\\r\\n\\r\\n\\r\\nBrent Miller\\r\\n<R>WarriOrb - Trailer</>\\r\\n\\r\\n\\r\\nPierce Riola\\r\\n<R>Wizard, Gnory</>\\r\\n\\r\\n\\r\\nEir Causey\\r\\n<R>Raven, Teachy, Ghost Dwarf, Unknown Wizard, Fishy</>\\r\\n\\r\\n\\r\\nJack Broadbent\\r\\n<R>Monk, Flybug</>\\r\\n\\r\\n\\r\\nEmil Hagg\\r\\n<R>Supper Dwarf, Kobold Chef, Fallen Druid, Dwarven Statue</>\\r\\n\\r\\n\\r\\nErick Nita\\r\\n<R>Golem Maker, Armour Wrath</>\\r\\n\\r\\n\\r\\nAlain Vega\\r\\n<R>Merch Ant</>\\r\\n\\r\\n\\r\\nAngela Tran\\r\\n<R>Lillian, Pipe Walker</>\\r\\n\\r\\n\\r\\nBrittany Ann Phillips\\r\\n<R>Lory</>\\r\\n\\r\\n\\r\\nAurore Gautheur\\r\\n<R>Fountain, Shade</>\\r\\n\\r\\n\\r\\nAlexander Blairlex\\r\\n<R>Primitive Fishy, Ghost Helmet</>\\r\\n\\r\\n\\r\\nSophie Ryder\\r\\n<R>Shadesphere</>\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n<T>-- Partners --</>\\r\\n\\r\\n\\r\\nMaple Whispering\\r\\n<R>Chineese localization</>\\r\\n<R>Publisher - China, PC</>\\r\\n\\r\\n\\r\\nNovy Unlimited\\r\\n<R>PR and Marketing</>\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n<T>-- Localization --</>\\r\\n\\r\\n\\r\\nVera Liscovschi\\r\\n<R>Russian</>\\r\\n\\r\\n\\r\\nJay Johnstone\\r\\n<R>Spanish</>\\r\\n\\r\\n\\r\\nBertin William\\r\\n<R>French</>\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n<T>-- Testers --</>\\r\\n\\r\\n\\r\\nSaleymander\\r\\n\\r\\n\\r\\nHitch\\r\\n\\r\\n\\r\\nMrCalculated\\r\\n\\r\\n\\r\\n<img id=\\\"Rainbow\\\"/>Scorpion253<img id=\\\"Rainbow\\\"/>\\r\\n\\r\\n\\r\\nmoses\\r\\n\\r\\n\\r\\nNinjin42\\r\\n\\r\\n\\r\\nKonstantinos Xenitidis\\r\\n\\r\\n\\r\\nPhyronnaz\\r\\n\\r\\n\\r\\nArthur\\r\\n\\r\\n\\r\\nMaster1G\\r\\n\\r\\n\\r\\nDávid Bartók\\r\\n\\r\\n\\r\\nLiDuGaming\\r\\n\\r\\n\\r\\nClaudiu Coman\\r\\n\\r\\n\\r\\nÁron Ürögdi\\r\\n\\r\\n\\r\\nDukenukemboi\\r\\n\\r\\n\\r\\nBart Cools\\r\\n\\r\\n\\r\\nGlenn De Jonghe\\r\\n\\r\\n\\r\\nDomonkos Péter Madarász\\r\\n\\r\\n\\r\\nGergő Gyarmati\\r\\n\\r\\n\\r\\nRéka Gyarmati\\r\\n\\r\\n\\r\\nKincső Petraskó\\r\\n\\r\\n\\r\\nGergő Petraskó\\r\\n\\r\\n\\r\\nDániel Garamvölgyi\\r\\n\\r\\n\\r\\nDanny \\\"GHelmet\\\" Cloutier\\r\\n\\r\\n\\r\\nAnna Boglárka Tóth\\r\\n\\r\\n\\r\\nBíborka Roxána Kubik\\r\\n\\r\\n\\r\\nVirág Miklós\\r\\n\\r\\n\\r\\nBenedek Marozsák\\r\\n\\r\\n\\r\\nDániel Marozsák\\r\\n\\r\\n\\r\\nGereon Bartel\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n<T>-- Prologue Speedrun Competition Winner --</>\\r\\n\\r\\n-7\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n<T>-- Special Thanks --</>\\r\\n\\r\\n\\r\\nMalazan Discord Server Community\\r\\n\\r\\n\\r\\n/r/metroidvenia Discord Server Community\\r\\n\\r\\n\\r\\nUnreal Slackers Discord Server Community\\r\\n\\r\\n\\r\\nIMGUR\\r\\n\\r\\n\\r\\nBíborka Roxána Kubik\\r\\n\\r\\n\\r\\nSergiu Crăiţoiu\\r\\n\\r\\n\\r\\nJuhász Ernő\\r\\n\\r\\n\\r\\nRacheal Smith\\r\\n\\r\\n\\r\\nRuxandra Seniuc\\r\\n\\r\\n\\r\\nthottee\\r\\n\\r\\n\\r\\nAndrew Pappas\\r\\n\\r\\n\\r\\nJonathan Lampel\\r\\n\\r\\n\\r\\nRichárd Németh\\r\\n\\r\\n\\r\\nAlex Gorcea\\r\\n\\r\\n\\r\\nNotRealVitor\\r\\n\\r\\n\\r\\nKinga Surján\\r\\n\\r\\n\\r\\nAnna Boglárka Tóth\\r\\n\\r\\n\\r\\nÉvi Fekete\\r\\n\\r\\n\\r\\nGergő Sielaf\\r\\n\\r\\n\\r\\n<img id=\\\"Rainbow\\\"/>Scorpion253<img id=\\\"Rainbow\\\"/>\\r\\n\\r\\n\\r\\nMainiac\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n<T>-- Technology --</>\\r\\n\\r\\n\\r\\n<R>WarriOrb uses the Unreal® Engine.</>\\r\\n<R>Unreal® is a trademark or registered trademark of Epic Games, Inc. in the United States of America and elsewhere</>\\r\\n\\r\\n<R>Unreal® Engine, Copyright 1998 – 2020, Epic Games, Inc. All rights reserved.</>\\r\\n\\r\\n\\r\\n\\r\\n<R>Made with FMOD Studio by Firelight Technologies Pty Ltd.</>\"\nmsgstr \"\"\n\n#. Key:\tAxeSpecial_name\n#. SourceLocation:\t/Game/SO/CharacterStrikes/AxeSpecial.AxeSpecial.StrikeName\n#: /Game/SO/CharacterStrikes/AxeSpecial.AxeSpecial.StrikeName\nmsgctxt \"CharacterStrike\"\nmsgid \"Throw\"\nmsgstr \"\"\n\n#. Key:\tDemonSwordSpecial_name\n#. SourceLocation:\t/Game/SO/CharacterStrikes/DemonSwordSpecial.DemonSwordSpecial.StrikeName\n#: /Game/SO/CharacterStrikes/DemonSwordSpecial.DemonSwordSpecial.StrikeName\nmsgctxt \"CharacterStrike\"\nmsgid \"Downstrike\"\nmsgstr \"\"\n\n#. Key:\tDualBladeSpecial_name\n#. SourceLocation:\t/Game/SO/CharacterStrikes/DualBladeSpecial.DualBladeSpecial.StrikeName\n#: /Game/SO/CharacterStrikes/DualBladeSpecial.DualBladeSpecial.StrikeName\nmsgctxt \"CharacterStrike\"\nmsgid \"Backslash\"\nmsgstr \"\"\n\n#. Key:\tLeafMaceSpecial_name\n#. SourceLocation:\t/Game/SO/CharacterStrikes/LeafMaceSpecial.LeafMaceSpecial.StrikeName\n#: /Game/SO/CharacterStrikes/LeafMaceSpecial.LeafMaceSpecial.StrikeName\nmsgctxt \"CharacterStrike\"\nmsgid \"Crushing Blow\"\nmsgstr \"\"\n\n#. Key:\tSabreSpecial_name\n#. SourceLocation:\t/Game/SO/CharacterStrikes/SabreSpecial.SabreSpecial.StrikeName\n#: /Game/SO/CharacterStrikes/SabreSpecial.SabreSpecial.StrikeName\nmsgctxt \"CharacterStrike\"\nmsgid \"Floating Strikes\"\nmsgstr \"\"\n\n#. Key:\tSwordSpecialAirStrike_name\n#. SourceLocation:\t/Game/SO/CharacterStrikes/SwordSpecialAirStrike.SwordSpecialAirStrike.StrikeName\n#: /Game/SO/CharacterStrikes/SwordSpecialAirStrike.SwordSpecialAirStrike.StrikeName\nmsgctxt \"CharacterStrike\"\nmsgid \"Air Strike\"\nmsgstr \"\"\n\n#. Key:\tBPEftAttackSpeedMultiplier_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/BPEftAttackSpeedMultiplier.Default__BPEftAttackSpeedMultiplier_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/BPEftAttackSpeedMultiplier.Default__BPEftAttackSpeedMultiplier_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Quick Hands\"\nmsgstr \"\"\n\n#. Key:\tBPEftBootTransmutation_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/BPEftBootTransmutation.Default__BPEftBootTransmutation_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/BPEftBootTransmutation.Default__BPEftBootTransmutation_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Protective Transmutation\"\nmsgstr \"\"\n\n#. Key:\tBPEftBounce_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftBounce.Default__BPEftBounce_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftBounce.Default__BPEftBounce_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Charged Bounce\"\nmsgstr \"\"\n\n#. Key:\tBPEftCooldownReducePassive02_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/BPEftCooldownReducePassive02.Default__BPEftCooldownReducePassive02_C.DisplayName\n#. Key:\tBPEftCooldownReduce_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/BPEftCooldownReduce.Default__BPEftCooldownReduce_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/BPEftCooldownReduce.Default__BPEftCooldownReduce_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/BPEftCooldownReducePassive02.Default__BPEftCooldownReducePassive02_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Restlessness\"\nmsgstr \"\"\n\n#. Key:\tBPEftCriticalChanceBoost10_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/BPEftCriticalChanceBoost10.Default__BPEftCriticalChanceBoost10_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/BPEftCriticalChanceBoost10.Default__BPEftCriticalChanceBoost10_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Critical Chance\"\nmsgstr \"\"\n\n#. Key:\tBPEftDamageReflection_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/BPEftDamageReflection.Default__BPEftDamageReflection_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/BPEftDamageReflection.Default__BPEftDamageReflection_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Sparks of Vengeance\"\nmsgstr \"\"\n\n#. Key:\tBPEftDmgModifier_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftDmgModifier.Default__BPEftDmgModifier_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftDmgModifier.Default__BPEftDmgModifier_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Perfect Hands\"\nmsgstr \"\"\n\n#. Key:\tBPEftHeal3_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/BPEftHeal3.Default__BPEftHeal3_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/BPEftHeal3.Default__BPEftHeal3_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Heal\"\nmsgstr \"\"\n\n#. Key:\tBPEftLifeLeech5_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/BPEftLifeLeech5.Default__BPEftLifeLeech5_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/BPEftLifeLeech5.Default__BPEftLifeLeech5_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Life Leech\"\nmsgstr \"\"\n\n#. Key:\tBPEftMagicMissle_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftMagicMissle.Default__BPEftMagicMissle_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftMagicMissle.Default__BPEftMagicMissle_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Magic Missile\"\nmsgstr \"\"\n\n#. Key:\tBPEftMassMagicMissle_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftMassMagicMissle.Default__BPEftMassMagicMissle_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftMassMagicMissle.Default__BPEftMassMagicMissle_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Magic Missiles\"\nmsgstr \"\"\n\n#. Key:\tBPEftMassSlow_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftMassSlow.Default__BPEftMassSlow_C.DisplayName\n#. Key:\tBPEftSlow_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/BPEftSlow.Default__BPEftSlow_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/BPEftSlow.Default__BPEftSlow_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftMassSlow.Default__BPEftMassSlow_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Slow\"\nmsgstr \"\"\n\n#. Key:\tBPEftMeteorShower_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftMeteorShower.Default__BPEftMeteorShower_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftMeteorShower.Default__BPEftMeteorShower_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Meteor Shower\"\nmsgstr \"\"\n\n#. Key:\tBPEftRegainSpellPassive25_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/BPEftRegainSpellPassive25.Default__BPEftRegainSpellPassive25_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/BPEftRegainSpellPassive25.Default__BPEftRegainSpellPassive25_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Arcane Luck\"\nmsgstr \"\"\n\n#. Key:\tBPEftRegainSpells_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/BPEftRegainSpells.Default__BPEftRegainSpells_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/BPEftRegainSpells.Default__BPEftRegainSpells_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Restoration\"\nmsgstr \"\"\n\n#. Key:\tBPEftResModifierMagicalStrong_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftResModifierMagicalStrong.Default__BPEftResModifierMagicalStrong_C.DisplayName\n#. Key:\tBPEftResModifierMagical_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftResModifierMagical.Default__BPEftResModifierMagical_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftResModifierMagical.Default__BPEftResModifierMagical_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftResModifierMagicalStrong.Default__BPEftResModifierMagicalStrong_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Wardskin\"\nmsgstr \"\"\n\n#. Key:\tBPEftResModifierPhysical_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftResModifierPhysical.Default__BPEftResModifierPhysical_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftResModifierPhysical.Default__BPEftResModifierPhysical_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Stoneskin\"\nmsgstr \"\"\n\n#. Key:\tBPEftSecondChance_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/BPEftSecondChance.Default__BPEftSecondChance_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/BPEftSecondChance.Default__BPEftSecondChance_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Second Chance\"\nmsgstr \"\"\n\n#. Key:\tBPEftSpellFire0_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftSpellFire0.Default__BPEftSpellFire0_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftSpellFire0.Default__BPEftSpellFire0_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Firestrike\"\nmsgstr \"\"\n\n#. Key:\tBPEftSpellLightningWalk_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftSpellLightningWalk.Default__BPEftSpellLightningWalk_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftSpellLightningWalk.Default__BPEftSpellLightningWalk_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Shockwalk\"\nmsgstr \"\"\n\n#. Key:\tBPEftSpellShadowWalk_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftSpellShadowWalk.Default__BPEftSpellShadowWalk_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftSpellShadowWalk.Default__BPEftSpellShadowWalk_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Shadewalk\"\nmsgstr \"\"\n\n#. Key:\tBPEftSpellShield_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftSpellShield.Default__BPEftSpellShield_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftSpellShield.Default__BPEftSpellShield_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Shield\"\nmsgstr \"\"\n\n#. Key:\tBPEftSpellSoulKeeper_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftSpellSoulKeeper.Default__BPEftSpellSoulKeeper_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftSpellSoulKeeper.Default__BPEftSpellSoulKeeper_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Soulbind\"\nmsgstr \"\"\n\n#. Key:\tBPEftStun_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/BPEftStun.Default__BPEftStun_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/BPEftStun.Default__BPEftStun_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Stun\"\nmsgstr \"\"\n\n#. Key:\tBPEftStunPassive10_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/BPEftStunPassive10.Default__BPEftStunPassive10_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/BPEftStunPassive10.Default__BPEftStunPassive10_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Stun Chance\"\nmsgstr \"\"\n\n#. Key:\tBPEftSwap_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftSwap.Default__BPEftSwap_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftSwap.Default__BPEftSwap_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Swap\"\nmsgstr \"\"\n\n#. Key:\tBPEftTempHPMagical_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftTempHPMagical.Default__BPEftTempHPMagical_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftTempHPMagical.Default__BPEftTempHPMagical_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Magical Protection\"\nmsgstr \"\"\n\n#. Key:\tBPEftTempHPPhysical_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftTempHPPhysical.Default__BPEftTempHPPhysical_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftTempHPPhysical.Default__BPEftTempHPPhysical_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Physical Protection\"\nmsgstr \"\"\n\n#. Key:\tBPEftWeaponFlamesTimeBased_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/BPEftWeaponFlamesTimeBased.Default__BPEftWeaponFlamesTimeBased_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/BPEftWeaponFlamesTimeBased.Default__BPEftWeaponFlamesTimeBased_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Greenflame\"\nmsgstr \"\"\n\n#. Key:\tBPEftWorthy_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/BPEftWorthy.Default__BPEftWorthy_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/BPEftWorthy.Default__BPEftWorthy_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Worthy\"\nmsgstr \"\"\n\n#. Key:\t1E42901841F4C7CEF39536A762076EDF\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.UI_EndScreen_SaveCreatures_C:WidgetTree.TBC1.Text\n#. Key:\t5D04206A499A8B42AF77BAA8BC9B4B8B\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.UI_EndScreen_SaveCreatures_C:WidgetTree.TBC0.Text\n#. Key:\tB0EEBB754110D2821640BE990002AC36\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.UI_EndScreen_SaveCreatures_C:WidgetTree.TBC2.Text\n#. Key:\tD75DCE214B56BA6FD9A58F9EEA9291A5\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.UI_EndScreen_C:WidgetTree.TBC0.Text\n#: /Game/SO/GUI/InGame/UI_EndScreen.UI_EndScreen_C:WidgetTree.TBC0.Text\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.UI_EndScreen_SaveCreatures_C:WidgetTree.TBC0.Text\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.UI_EndScreen_SaveCreatures_C:WidgetTree.TBC1.Text\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.UI_EndScreen_SaveCreatures_C:WidgetTree.TBC2.Text\nmsgctxt \"EndScreen\"\nmsgid \"With his quest completed Monk decided to look for another activity. He thought: <Quote>‘If I could resist madness, others should be able to do the same.’</> And so he opened a monastery to share his mental training techniques with anyone willing to save its sanity.\"\nmsgstr \"\"\n\n#. Key:\t7279EA4741D3DAC5AE92EB99AB851ED9\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.UI_EndScreen_SaveCreatures_C:WidgetTree.TBD0.Text\n#. Key:\t77E809914A65796364FE94B8C2361FD7\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.UI_EndScreen_SaveCreatures_C:WidgetTree.TBD2.Text\n#. Key:\t9C1B477D4582ABAEDC90FCB3AC6737E7\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.UI_EndScreen_C:WidgetTree.TBD0.Text\n#. Key:\tE98C3FDD453FF80CA8EBBE94459A5CAF\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.UI_EndScreen_SaveCreatures_C:WidgetTree.TBD1.Text\n#: /Game/SO/GUI/InGame/UI_EndScreen.UI_EndScreen_C:WidgetTree.TBD0.Text\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.UI_EndScreen_SaveCreatures_C:WidgetTree.TBD0.Text\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.UI_EndScreen_SaveCreatures_C:WidgetTree.TBD1.Text\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.UI_EndScreen_SaveCreatures_C:WidgetTree.TBD2.Text\nmsgctxt \"EndScreen\"\nmsgid \"<Size42>Separating the World also changed something in the Ruined Realm. The wind turned and even Ruin stopped for a moment.</>\"\nmsgstr \"\"\n\n#. Key:\t9B476D3D4A603658683498B09968F8AA\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.UI_EndScreen_C:WidgetTree.TBB0.Text\n#: /Game/SO/GUI/InGame/UI_EndScreen.UI_EndScreen_C:WidgetTree.TBB0.Text\nmsgctxt \"EndScreen\"\nmsgid \"When he heard about the lost Kobold tribe he got a bit excited.<Quote>‘Kobolds reserved the ancient knowledge in their rituals’</> he said. <Quote>‘If there is something we can do with Ruin it must be connected to the rituals. I’ll go with you.’</>\"\nmsgstr \"\"\n\n#. Key:\tDF7F9F754F4FC9CB19DF92AFCE96C5C1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.UI_EndScreen_SaveCreatures_C:WidgetTree.TBA2.Text\n#. Key:\tE8401550448E14DD70717EB7EED0582B\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.UI_EndScreen_SaveCreatures_C:WidgetTree.TBA1.Text\n#. Key:\tUI_EndScreen_entry_0_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(0).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(0).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.UI_EndScreen_SaveCreatures_C:WidgetTree.TBA1.Text\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.UI_EndScreen_SaveCreatures_C:WidgetTree.TBA2.Text\nmsgctxt \"EndScreen\"\nmsgid \"The people soon forgot about the threat, some of them argued that Ruin ever existed.\"\nmsgstr \"\"\n\n#. Key:\tE9F6E1064D5B2046DF1DEDA386012E2D\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.UI_EndScreen_C:WidgetTree.TBB2.Text\n#. Key:\tUI_EndScreen_entry_6_text_2\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(6).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(6).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.UI_EndScreen_C:WidgetTree.TBB2.Text\nmsgctxt \"EndScreen\"\nmsgid \"He opened a monastery to share his mental training techniques with anyone willing to save its sanity.\"\nmsgstr \"\"\n\n#. Key:\tF0EAD93B44D8D7AEF306EAB75D83FB37\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.UI_EndScreen_C:WidgetTree.TBB1.Text\n#: /Game/SO/GUI/InGame/UI_EndScreen.UI_EndScreen_C:WidgetTree.TBB1.Text\nmsgctxt \"EndScreen\"\nmsgid \"<Quote>‘If I could resist madness, others should be able to do the same’</> - he thought.\"\nmsgstr \"\"\n\n#. Key:\tUI_EndScreen_entry_0_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(0).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(0).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Once the Boundaries of Worlds were sealed, Ruin could do no harm to the Human Realm again.\"\nmsgstr \"\"\n\n#. Key:\tUI_EndScreen_entry_10_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(10).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(10).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Hearing these news made the Chef really excited.\"\nmsgstr \"\"\n\n#. Key:\tUI_EndScreen_entry_10_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(10).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(10).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"<Quote>'Could there be other survivors of my tribe?'</>\"\nmsgstr \"\"\n\n#. Key:\tUI_EndScreen_entry_10_text_2\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(10).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(10).EndingLogic.Texts(2).Texts\nmsgctxt \"EndScreen\"\nmsgid \"He decided to leave his kitchen and search for his lost relatives.\"\nmsgstr \"\"\n\n#. Key:\tUI_EndScreen_entry_11_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(11).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(11).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"No one knows how he could possibly know about the soup, but Supper Dwarf also appeared to taste the food.\"\nmsgstr \"\"\n\n#. Key:\tUI_EndScreen_entry_11_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(11).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(11).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"When he heard that the chef is leaving he offered his help with the trains.\"\nmsgstr \"\"\n\n#. Key:\tUI_EndScreen_entry_11_text_2\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(11).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(11).EndingLogic.Texts(2).Texts\nmsgctxt \"EndScreen\"\nmsgid \"<Quote>‘And I would also like to check what do they eat for supper.’</> he said. <Quote>‘I’m going with you.’</>\"\nmsgstr \"\"\n\n#. Key:\tUI_EndScreen_entry_12_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(12).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(12).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"On their way they stopped by the Golem Maker.\"\nmsgstr \"\"\n\n#. Key:\tUI_EndScreen_entry_12_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(12).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(12).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"He was just sitting and staring at nothing.\"\nmsgstr \"\"\n\n#. Key:\tUI_EndScreen_entry_12_text_2\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(12).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(12).EndingLogic.Texts(2).Texts\nmsgctxt \"EndScreen\"\nmsgid \"It was still hard for the Maker to accept that all his work was for nothing.\"\nmsgstr \"\"\n\n#. Key:\tUI_EndScreen_entry_12_text_3\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(12).EndingLogic.Texts(3).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(12).EndingLogic.Texts(3).Texts\nmsgctxt \"EndScreen\"\nmsgid \"At least he stopped creating mindless stone golems.\"\nmsgstr \"\"\n\n#. Key:\tUI_EndScreen_entry_13_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(13).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(13).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"When he heard about the lost Kobold tribe he got a bit excited.\"\nmsgstr \"\"\n\n#. Key:\tUI_EndScreen_entry_13_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(13).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(13).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"<Quote>‘Kobolds reserved the ancient knowledge in their rituals’</> he said.\"\nmsgstr \"\"\n\n#. Key:\tUI_EndScreen_entry_13_text_2\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(13).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(13).EndingLogic.Texts(2).Texts\nmsgctxt \"EndScreen\"\nmsgid \"<Quote>‘If there is something we can do with Ruin it must be connected to the rituals. I’ll go with you.’</>\"\nmsgstr \"\"\n\n#. Key:\tUI_EndScreen_entry_14_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(14).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(14).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"However there are things which never change.\"\nmsgstr \"\"\n\n#. Key:\tUI_EndScreen_entry_14_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(14).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(14).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"After days of arguing on who undermined whose business Lory and Gnory separated once again.\"\nmsgstr \"\"\n\n#. Key:\tUI_EndScreen_entry_15_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(15).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(15).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"While they were arguing Fishy decided to leave Gnory and set out on his own.\"\nmsgstr \"\"\n\n#. Key:\tUI_EndScreen_entry_15_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(15).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(15).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"He had no idea where he was going.\"\nmsgstr \"\"\n\n#. Key:\tUI_EndScreen_entry_16_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(16).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(16).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"After weeks of walking alone, he heard a faint excited voice:\"\nmsgstr \"\"\n\n#. Key:\tUI_EndScreen_entry_1_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(1).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(1).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"The Mage Council didn’t believe a single word Lillian or Scholar told them about the events.\"\nmsgstr \"\"\n\n#. Key:\tUI_EndScreen_entry_1_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(1).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(1).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"They claimed that Wizard died in an unfortunate accident and his device could never actually work anyway.\"\nmsgstr \"\"\n\n#. Key:\tUI_EndScreen_entry_2_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(2).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(2).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Although Lillian inherited her father’s castle she was sent to an Orphanage until she came into age to live on her own.\"\nmsgstr \"\"\n\n#. Key:\tUI_EndScreen_entry_2_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(2).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(2).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Scholar was upset by Lillian’s decision on letting the Ruined Realm fall but he promised Lillian that he will make the Wizard’s Council let Lillian live in his estate.\"\nmsgstr \"\"\n\n#. Key:\tUI_EndScreen_entry_3_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(3).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(3).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Lillian didn't let the unfortunate events to overcome her. She stopped Ruin even if no one believed her.\"\nmsgstr \"\"\n\n#. Key:\tUI_EndScreen_entry_3_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(3).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(3).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"She also knew that the Ruined Realm still had at least a half century before it was totally destroyed so she decided to keep on looking for a way to save it.\"\nmsgstr \"\"\n\n#. Key:\tUI_EndScreen_entry_3_text_2\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(3).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(3).EndingLogic.Texts(2).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Now that her own Realm was safe she could focus on the other Realms.\"\nmsgstr \"\"\n\n#. Key:\tUI_EndScreen_entry_4_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(4).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(4).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"<Size42>Separating the World also changed something in the Ruined Realm.</>\"\nmsgstr \"\"\n\n#. Key:\tUI_EndScreen_entry_4_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(4).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(4).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"<Size42>The wind turned and even Ruin stopped for a moment.</>\"\nmsgstr \"\"\n\n#. Key:\tUI_EndScreen_entry_5_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(5).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(5).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"When it was certain that no one will be saved from Ruin, as a last desperate act Gate Keeper tried to open a Gate to the Human Realm himself.\"\nmsgstr \"\"\n\n#. Key:\tUI_EndScreen_entry_5_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(5).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(5).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"A portal opened and swallowed the Keeper.\"\nmsgstr \"\"\n\n#. Key:\tUI_EndScreen_entry_5_text_2\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(5).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(5).EndingLogic.Texts(2).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Some believed he survived but no one ever met him again.\"\nmsgstr \"\"\n\n#. Key:\tUI_EndScreen_entry_6_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(6).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(6).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"With his quest completed Monk decided to look for another activity.\"\nmsgstr \"\"\n\n#. Key:\tUI_EndScreen_entry_6_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(6).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(6).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"<Quote>‘If I could resist madness, shouldn't others be able to do the same?’</>- he wondered.\"\nmsgstr \"\"\n\n#. Key:\tUI_EndScreen_entry_7_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(7).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(7).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"To the surprise of many Teachy also joined Monk and soon he became his best student.\"\nmsgstr \"\"\n\n#. Key:\tUI_EndScreen_entry_7_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(7).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(7).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"<Quote>‘To be honest I never actually wanted to be a teacher‘</> - said Teachy.\"\nmsgstr \"\"\n\n#. Key:\tUI_EndScreen_entry_7_text_2\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(7).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(7).EndingLogic.Texts(2).Texts\nmsgctxt \"EndScreen\"\nmsgid \"<Quote>'I also knew that I was a bit mad and since for my insane mind training in a monastery looked like a crazy idea I immediately knew that in fact that's the most sane thing to do.’</>\"\nmsgstr \"\"\n\n#. Key:\tUI_EndScreen_entry_8_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(8).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(8).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Losing his connection to his master, Raven had to think again about his purpose.\"\nmsgstr \"\"\n\n#. Key:\tUI_EndScreen_entry_8_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(8).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(8).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"<Quote>‘I think therefore I am not a bird’</> - he said.\"\nmsgstr \"\"\n\n#. Key:\tUI_EndScreen_entry_8_text_2\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(8).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(8).EndingLogic.Texts(2).Texts\nmsgctxt \"EndScreen\"\nmsgid \"With his vast experience he couldn’t become the same thoughtless bird he once was.\"\nmsgstr \"\"\n\n#. Key:\tUI_EndScreen_entry_8_text_3\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(8).EndingLogic.Texts(3).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(8).EndingLogic.Texts(3).Texts\nmsgctxt \"EndScreen\"\nmsgid \"He joined Monk’s monastery to teach philosophy.\"\nmsgstr \"\"\n\n#. Key:\tUI_EndScreen_entry_8_text_4\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(8).EndingLogic.Texts(4).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(8).EndingLogic.Texts(4).Texts\nmsgctxt \"EndScreen\"\nmsgid \"In his free hours he kept on studying the Ancient’s technology hoping that one day he will find a way back to Lillian.\"\nmsgstr \"\"\n\n#. Key:\tUI_EndScreen_entry_9_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(9).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(9).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"When the soup was almost ready the Pipe Walkers smelled the flavour and they all gathered for a last dinner.\"\nmsgstr \"\"\n\n#. Key:\tUI_EndScreen_entry_9_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(9).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(9).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"After lunch they started to talk.\"\nmsgstr \"\"\n\n#. Key:\tUI_EndScreen_entry_9_text_2\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(9).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(9).EndingLogic.Texts(2).Texts\nmsgctxt \"EndScreen\"\nmsgid \"One of the Pipe Walkers, who had been in many cages mentioned that she actually met some kobolds far away.\"\nmsgstr \"\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_0_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(0).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(0).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"By the time the furious crowd broke into the Wizard’s Castle the Device was completely destroyed.\"\nmsgstr \"\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_0_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(0).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(0).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Some left, others started to investigate the building hoping to find something which might stop Ruin.\"\nmsgstr \"\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_10_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(10).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(10).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"<Quote>‘Kobolds reserved the ancient knowledge in their rituals’</> Golem Maker said. <Quote>‘If there is something we can do with Ruin it must be connected to the rituals. I’ll go with you.’</>\"\nmsgstr \"\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_10_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(10).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(10).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Golem Maker was a huge help to Lillian with his knowledge on Golemology and it was not easy for Lillian to let him go.\"\nmsgstr \"\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_10_text_2\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(10).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(10).EndingLogic.Texts(2).Texts\nmsgctxt \"EndScreen\"\nmsgid \"<Quote>‘Have no fear!’</> Golem Maker said. <Quote>‘I will return with even more knowledge and we’ll stop Ruin once and for all.’</>\"\nmsgstr \"\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_11_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(11).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(11).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"After Kobold Chef left, Supper Dwarf had to take care of the kitchen.\"\nmsgstr \"\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_11_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(11).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(11).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"It turned out that he is also really talented at making food.\"\nmsgstr \"\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_11_text_2\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(11).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(11).EndingLogic.Texts(2).Texts\nmsgctxt \"EndScreen\"\nmsgid \"<Quote> ‘That is because I know exactly what the final result should be’</> he explained.\"\nmsgstr \"\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_11_text_3\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(11).EndingLogic.Texts(3).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(11).EndingLogic.Texts(3).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Later he opened a restaurant which soon became really popular.\"\nmsgstr \"\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_11_text_4\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(11).EndingLogic.Texts(4).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(11).EndingLogic.Texts(4).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Some say mostly because he hired Pipe Walkers to serve the meal and for marketing purposes.\"\nmsgstr \"\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_12_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(12).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(12).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Monk decided to stay in the Ruined Realm.\"\nmsgstr \"\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_12_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(12).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(12).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"<Quote>‘Even if it was not enough I did all I could. I’m done.’</> he said.\"\nmsgstr \"\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_12_text_2\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(12).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(12).EndingLogic.Texts(2).Texts\nmsgctxt \"EndScreen\"\nmsgid \"He sat down on a mountaintop and started meditating.\"\nmsgstr \"\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_13_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(13).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(13).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"A few weeks later he realized that even though he failed his quest he still should do something.\"\nmsgstr \"\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_13_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(13).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(13).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"<Quote>‘Due to my training I can resist Ruin’</> he thought. <Quote>‘No one has ever seen what’s there where Ruin destroyed the lands. If I train harder I might be able to get closer to Ruin to see what it really is.’</>\"\nmsgstr \"\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_13_text_2\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(13).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(13).EndingLogic.Texts(2).Texts\nmsgctxt \"EndScreen\"\nmsgid \"He kept on practising and soon set out on a journey into the heart of Ruin to find answers to questions even he didn’t know.\"\nmsgstr \"\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_14_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(14).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(14).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Lory and Gnory suddenly found themselves in a world full of possible customers.\"\nmsgstr \"\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_14_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(14).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(14).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Of course it didn’t mean they stopped arguing on who undermined whose business but finally they both had the chance to run a successful trading company.\"\nmsgstr \"\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_15_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(15).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(15).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Gnory specialized himself in selling medicine which were said to heal the sickness which was spreading as Ruin reached closer.\"\nmsgstr \"\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_15_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(15).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(15).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Lory specialized in medicine which were said to heal the sickness which was caused by the medicine of Gnory.\"\nmsgstr \"\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_16_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(16).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(16).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Lory’s herbaria worked out.\"\nmsgstr \"\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_16_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(16).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(16).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Soon she started to sell other medicine and healing devices as well.\"\nmsgstr \"\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_17_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(17).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(17).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"As for Gnory, he decided to sell lots of different things in the City Prison which turned out to be his new home for a while.\"\nmsgstr \"\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_18_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(18).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(18).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Fishy didn’t like the medicine business so he left Gnory.\"\nmsgstr \"\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_18_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(18).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(18).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"He joined Monk for a while to learn the mental training techniques which reserved Monk’s sanity.\"\nmsgstr \"\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_18_text_2\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(18).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(18).EndingLogic.Texts(2).Texts\nmsgctxt \"EndScreen\"\nmsgid \"<Quote>‘Fishy think it is important’ </>he said.<Quote> ‘If Monk go to see Ruin, Fishy need to learn it.’</>\"\nmsgstr \"\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_18_text_3\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(18).EndingLogic.Texts(3).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(18).EndingLogic.Texts(3).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Monk accepted Fishy as his apprentice and taught him all that was possible.\"\nmsgstr \"\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_18_text_4\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(18).EndingLogic.Texts(4).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(18).EndingLogic.Texts(4).Texts\nmsgctxt \"EndScreen\"\nmsgid \"<Quote>‘Now is the time’</> Monk said one day. <Quote>’Go to the Human Realm and prepare the people.’</>\"\nmsgstr \"\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_19_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(19).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(19).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"On his way to the Human Realm Fishy heard a faint excited voice:\"\nmsgstr \"\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_19_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(19).EndingLogic.Texts(1).Texts\n#. Key:\tUI_EndScreen_entry_16_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(16).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(16).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(19).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"<Quote>‘Hey there! I’m fed up with microtransactions. Can I go with ya man?’</>\"\nmsgstr \"\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_19_text_2\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(19).EndingLogic.Texts(2).Texts\n#. Key:\tUI_EndScreen_entry_16_text_2\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(16).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(16).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(19).EndingLogic.Texts(2).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Merch Ant and Fishy soon became best friends and ventured on together.\"\nmsgstr \"\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_1_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(1).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(1).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"A few hours later members of the Mage Council arrived along with the city guards.\"\nmsgstr \"\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_1_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(1).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(1).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"The Council claimed that Wizard died in an unfortunate accident, his device could never actually work anyway and Ruin is nothing to fear of.\"\nmsgstr \"\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_1_text_2\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(1).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(1).EndingLogic.Texts(2).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Although it was total nonsense Lillian and Scholar was happy that the crowd were taken away from the Castle.\"\nmsgstr \"\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_20_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(20).EndingLogic.Texts(0).Texts\n#. Key:\tUI_EndScreen_entry_17_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(17).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(17).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(20).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"The World was still about to end, but as one Pipe Walker wisely said:\"\nmsgstr \"\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_21_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(21).EndingLogic.Texts(0).Texts\n#. Key:\tUI_EndScreen_entry_18_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(18).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(18).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(21).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"As some stories ended some new ones begun. Though what happened afterwards is not yet known.\"\nmsgstr \"\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_2_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(2).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(2).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"When they were left alone they quickly started the evacuation of the Ruined Realm.\"\nmsgstr \"\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_3_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(3).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(3).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Even though she lost her father Lillian couldn’t afford to let sadness overcome her.\"\nmsgstr \"\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_3_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(3).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(3).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Ruin was more of a threat now than ever before, and since the Mage Council didn’t believe in Ruin it was the task of Lillian and Scholar to repair the device.\"\nmsgstr \"\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_4_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(4).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(4).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Scholar was really proud of Lillian because she managed to save time for the evacuation.\"\nmsgstr \"\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_4_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(4).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(4).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"<Quote>‘I know Wizard would have disagreed but you did the right thing. We still have time to face Ruin. We couldn’t let everyone die there.’</>\"\nmsgstr \"\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_5_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(5).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(5).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"As time passed Scholar started to behave a bit odd which made Lillian really anxious.\"\nmsgstr \"\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_5_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(5).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(5).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Ruin was close and the solution was still far away.\"\nmsgstr \"\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_5_text_2\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(5).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(5).EndingLogic.Texts(2).Texts\nmsgctxt \"EndScreen\"\nmsgid \"When she talked about her concerns to Raven, the bird said:\"\nmsgstr \"\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_5_text_3\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(5).EndingLogic.Texts(3).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(5).EndingLogic.Texts(3).Texts\nmsgctxt \"EndScreen\"\nmsgid \"<Quote>‘Focus on what you are doing Lillian. He was a bit odd anyway.’</>\"\nmsgstr \"\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_6_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(6).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(6).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"To the surprise of many Teachy turned out to be an excellent researcher.\"\nmsgstr \"\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_6_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(6).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(6).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"<Quote>‘To be honest I never wanted to be a teacher’ </>he said. <Quote>‘I only stayed at University so that I can do some more research work. But my students never let me research during lectures.’</>\"\nmsgstr \"\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_6_text_2\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(6).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(6).EndingLogic.Texts(2).Texts\nmsgctxt \"EndScreen\"\nmsgid \"He joined Lillian and dug into every book he could possibly find on the Ancient’s technology.\"\nmsgstr \"\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_7_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(7).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(7).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"The new environment and being a bit further from Ruin made good to the Gate Keeper.\"\nmsgstr \"\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_7_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(7).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(7).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"He organized some of the cleaners to repair the Castle so that Lillian can keep on with her work.\"\nmsgstr \"\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_7_text_2\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(7).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(7).EndingLogic.Texts(2).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Later he started to remember things from the Runic Realm which helped Lillian a lot.\"\nmsgstr \"\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_8_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(8).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(8).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"One day a Pipe Walker, who had been in many cages mentioned that she met some kobolds far away who might be other survivors of the Kobold Chef’s tribe.\"\nmsgstr \"\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_9_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(9).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(9).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Hearing this news made Kobold Chef really excited.\"\nmsgstr \"\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_9_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(9).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(9).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"He decided to return to the Ruined Realm and search for his lost relatives.\"\nmsgstr \"\"\n\n#. Key:\tSoAct1_EG_AAFirstDroneTrio_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Drones were even more intelligent than Maintainers. They not only memorized texts, they helped correct grammar, changed the message if it was too insulting or even made up poems if they were asked to do so.\"\nmsgstr \"\"\n\n#. Key:\tSoAct1_EG_AAFirstDroneTrio_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"The Flying Three\"\nmsgstr \"\"\n\n#. Key:\tSoAct1_EG_AfterGateCleaners_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Citizens of Cerulean requested to have their own unique Golems, but it was always rejected. This situation was very good for the Black Golem Market, because this way it was always easy to find customers.\"\nmsgstr \"\"\n\n#. Key:\tSoAct1_EG_AfterGateCleaners_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Cleaners of Cerulean\"\nmsgstr \"\"\n\n#. Key:\tSoAct1_EG_AfterGateElits_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"The Runic Realm's Government didn't allow the Golems to become the privilege of the rich. Even though the elite were not allowed to have different Golems they always found a way to make their servants different than the ones owned by the poor.\"\nmsgstr \"\"\n\n#. Key:\tSoAct1_EG_AfterGateElits_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Capetainers\"\nmsgstr \"\"\n\n#. Key:\tSoAct1_EG_AGRightFromPortal_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"'Just keep cleaning! Cleaning, cleaning...'\"\nmsgstr \"\"\n\n#. Key:\tSoAct1_EG_AGRightFromPortal_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Cleaner Invasion\"\nmsgstr \"\"\n\n#. Key:\tSoAct1_EG_AGTestStoneCircle_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"The Black Golem Market was funded by a Golem Maker apprentice who failed his master exam and was banished from school. No wonder his golems were... unique.\"\nmsgstr \"\"\n\n#. Key:\tSoAct1_EG_AGTestStoneCircle_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Weird Golems\"\nmsgstr \"\"\n\n#. Key:\tSoAct1_EG_AGWallJumpTeam_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"The cleaning plan for this area fell apart with the participants.\"\nmsgstr \"\"\n\n#. Key:\tSoAct1_EG_AGWallJumpTeam_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"The North Team\"\nmsgstr \"\"\n\n#. Key:\tSoAct1_EG_ArcadeDungeonCleaners_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"The Golem's behaviour was specified by the Golem Makers. Only very simple personalities were made at the beginning. The Cleaners, for example, only desired to keep the place tidy and make sure they don't harm the people.\"\nmsgstr \"\"\n\n#. Key:\tSoAct1_EG_ArcadeDungeonCleaners_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Arcade Cleaners\"\nmsgstr \"\"\n\n#. Key:\tSoAct1_EG_ArcadeDungeonExit_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"After creating intelligence Golem Makers wanted even more. They wanted complex personality. They wanted Golems that can not only think but also feel. That was the idea behind designing the Gatekeepers.\"\nmsgstr \"\"\n\n#. Key:\tSoAct1_EG_ArcadeDungeonExit_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Arcade Servants\"\nmsgstr \"\"\n\n#. Key:\tSoAct1_EG_ArcadeDungeonOptional_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"You might wonder if a Vacuum Cleaner is designed to clean dust away why does it need a laser caster?\"\nmsgstr \"\"\n\n#. Key:\tSoAct1_EG_ArcadeDungeonOptional_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Vacuum Cleaners group\"\nmsgstr \"\"\n\n#. Key:\tSoAct1_EG_ArcadeMaintainers_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"The very first Golems were made to do the most monotonic work so that people have more time to think and to create. Once they were friendly but as Ruin came their behaviour changed.\"\nmsgstr \"\"\n\n#. Key:\tSoAct1_EG_ArcadeMaintainers_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Arcade Cleaner Golems\"\nmsgstr \"\"\n\n#. Key:\tSoAct1_EG_Chest_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"The poor chest was minding his own business before you started to insult him.\"\nmsgstr \"\"\n\n#. Key:\tSoAct1_EG_Chest_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Chest\"\nmsgstr \"\"\n\n#. Key:\tSoAct1_EG_GGMiniBoss_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Maybe it only depends on the creation process, but some Golems had stronger personality. In general, Golems with more intelligence resisted Ruin longer and Golems with strong personality were more vulnerable to the infection.\"\nmsgstr \"\"\n\n#. Key:\tSoAct1_EG_GGMiniBoss_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Wickeds\"\nmsgstr \"\"\n\n#. Key:\tSoAct1_EG_LoneDrone_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Drones delivered messages and gifts before Ruin. People were happy when they heard them approaching back then.\"\nmsgstr \"\"\n\n#. Key:\tSoAct1_EG_LoneDrone_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Lone Drone\"\nmsgstr \"\"\n\n#. Key:\tSoAct1_EG_LoneSewerDrone_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"After Ruin most Golems liked to group together. Only a few chose to stay alone.\"\nmsgstr \"\"\n\n#. Key:\tSoAct1_EG_LoneSewerDrone_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Another Lone Drone\"\nmsgstr \"\"\n\n#. Key:\tSoAct1_EG_MaceGroup_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"'Attention: our enemies greatest weapon, the holy Mace is stolen. We truly should have destroyed it as the Council suggested.'\"\nmsgstr \"\"\n\n#. Key:\tSoAct1_EG_MaceGroup_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Mace Defenders\"\nmsgstr \"\"\n\n#. Key:\tSoAct1_EG_MaintainerInvestigatorInvestigators_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"After Ruin, Golems started to have strange behavior. There were a group of them who used the pipes to flood a part of the City. Later these places were called the Sewer.\"\nmsgstr \"\"\n\n#. Key:\tSoAct1_EG_MaintainerInvestigatorInvestigators_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Pipe Golems\"\nmsgstr \"\"\n\n#. Key:\tSoAct1_EG_MaintainerInvestigators_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Not only the Golems were created by using the Spirits of the Unknown World before Ruin. People found other ways of using this new technology. They created pipes to convey hot water to heat the city and cold water to drink.\"\nmsgstr \"\"\n\n#. Key:\tSoAct1_EG_MaintainerInvestigators_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Maintainers of the Pipes\"\nmsgstr \"\"\n\n#. Key:\tSoAct1_EG_SABeforeWallJump_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Some believed cold can resist Ruin longer than magic. They created places where they kept the temperature beneath the freezing point. As it turned out, not even coldness can resist Ruin forever.\"\nmsgstr \"\"\n\n#. Key:\tSoAct1_EG_SABeforeWallJump_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Cleaners of the Refrigerator.\"\nmsgstr \"\"\n\n#. Key:\tSoAct1_EG_SAFightMustHave_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"'We won't clear anymore!' said the rebel Maintainer.\\r\\n'Let's declear War!'\"\nmsgstr \"\"\n\n#. Key:\tSoAct1_EG_SAFightMustHave_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Underground Cleaner Band\"\nmsgstr \"\"\n\n#. Key:\tSoAct1_EG_SAFightOptional_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"'Let's make something clear. Maybe this room?'\"\nmsgstr \"\"\n\n#. Key:\tSoAct1_EG_SAFightOptional_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Underground Cleaner Band B\"\nmsgstr \"\"\n\n#. Key:\tSoAct1_EG_SewerCircleVacuumCleaners_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"People realised that Golem's Spirits have a power beyond imagination. They called it the Ancient Magic. Vacuum Cleaners could use this magic to do their job even better.\"\nmsgstr \"\"\n\n#. Key:\tSoAct1_EG_SewerCircleVacuumCleaners_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Vacuum Cleaners\"\nmsgstr \"\"\n\n#. Key:\tSoAct1_EG_SewerTeam_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Golem Makers wanted to create something more intelligent as they learned more. They shaped the Maintainers, the first golems capable of talking. Sadly their intelligence vanished as Ruin came.\"\nmsgstr \"\"\n\n#. Key:\tSoAct1_EG_SewerTeam_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Sewer Golems\"\nmsgstr \"\"\n\n#. Key:\tSoAct1_EG_TL_VacuumTwins_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Libraries were important in the life of the former Realm's citizens. No wonder that many of the golems were created only to dust and organize the books.\"\nmsgstr \"\"\n\n#. Key:\tSoAct1_EG_TL_VacuumTwins_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Library Cleaners\"\nmsgstr \"\"\n\n#. Key:\tSoAct1_EG_TLSewerCreatureWatch_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Golems never ever attacked the Pipe Walkers. The reason is only known by the wisest Pipe Walker himself. It is because, as he explained: 'Nun dara bum, tuk la.'\"\nmsgstr \"\"\n\n#. Key:\tSoAct1_EG_TLSewerCreatureWatch_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Sewer Team B\"\nmsgstr \"\"\n\n#. Key:\tSoAct1_EG_TowerTrio_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"They spent most of their time on the top of those towers - it was clear to me that they would die there as well.\"\nmsgstr \"\"\n\n#. Key:\tSoAct1_EG_TowerTrio_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"The Tower Trio\"\nmsgstr \"\"\n\n#. Key:\tSoAct2_EG_BounceTrio_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Lava Jumpers are former Golems who fell into the lava. Some of them return to join their former Golem companions.\"\nmsgstr \"\"\n\n#. Key:\tSoAct2_EG_BounceTrio_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Bounce Trio\"\nmsgstr \"\"\n\n#. Key:\tSoAct2_EG_C_BeforeKey_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"It's still unclear what makes some creatures touched by Ruin to group together. Some believes those who had similar emotions when Ruin came were likely to form a group.\"\nmsgstr \"\"\n\n#. Key:\tSoAct2_EG_C_BeforeKey_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Anxious Armours\"\nmsgstr \"\"\n\n#. Key:\tSoAct2_EG_C_Bridge_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Crafting was always the obsession of Dwarves. In their workshops they forged mighty weapons and wondrous armours. Their love for their craft was so strong that instead of their body, Ruin preserved their iron works.\"\nmsgstr \"\"\n\n#. Key:\tSoAct2_EG_C_Bridge_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Bridge Brigade\"\nmsgstr \"\"\n\n#. Key:\tSoAct2_EG_C_LoneShadeSphere_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Before Ruin there was no other humanoid race but human. New races are created by Ruin's Shades. They roam the lands looking for any living being which they can possess. Once they become part of a creature its body will start to change.\"\nmsgstr \"\"\n\n#. Key:\tSoAct2_EG_C_LoneShadeSphere_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Weird Floating Thing\"\nmsgstr \"\"\n\n#. Key:\tSoAct2_EG_C_OfficeGuards_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Watching the only way to the Office did not bring enough protection. If any intruder managed to pass the Patrols he still had to face the Guardians to proceed.\"\nmsgstr \"\"\n\n#. Key:\tSoAct2_EG_C_OfficeGuards_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Guardians of the Law\"\nmsgstr \"\"\n\n#. Key:\tSoAct2_EG_C_OfficePatrols_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Going into the Law's High Office was forbidden even for most of the Dwarves. Only one path lead to the Office and that was guarded by the Patrols.\"\nmsgstr \"\"\n\n#. Key:\tSoAct2_EG_C_OfficePatrols_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Patrols of the Law\"\nmsgstr \"\"\n\n#. Key:\tSoAct2_EG_DG_Left_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Deep beneath the Catacombs there is a secret place called the Dwarven Gate. Elite dwarves who worked here were placed above the Law. They were seeking a way to fight Ruin with Ruin's magic.\"\nmsgstr \"\"\n\n#. Key:\tSoAct2_EG_DG_Left_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Glorious Group\"\nmsgstr \"\"\n\n#. Key:\tSoAct2_EG_DG_RightFloor_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Even though most of the common Dwarves never even heard about Dwarven Gate some were needed to do the hard work. Now that Ruin won, Dwarves are finally equal.\"\nmsgstr \"\"\n\n#. Key:\tSoAct2_EG_DG_RightFloor_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Not so Elite Dwarves\"\nmsgstr \"\"\n\n#. Key:\tSoAct2_EG_DG_RightUpOptional_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"One idea of the Elite Dwarves was to create giant statues which are able to trap Ruin's essence. Even if they were right they never managed to make enough sculptures.\"\nmsgstr \"\"\n\n#. Key:\tSoAct2_EG_DG_RightUpOptional_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Sculptors\"\nmsgstr \"\"\n\n#. Key:\tSoAct2_EG_DwarfBoss_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Dwarven Statues were meant to imprison the essence of Ruin. However there were some Dwarven scientists who feared that the statues were not safe and in the long run they wouldn't be able to resist the power of Ruin...\"\nmsgstr \"\"\n\n#. Key:\tSoAct2_EG_DwarfBoss_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Dwarven Statue\"\nmsgstr \"\"\n\n#. Key:\tSoAct2_EG_GolemFirst_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Stone Golems are the cheap copies of the Runic Realm Golems. If Ruin twists the creatures mind then it will definitely have no effect on these ones.\"\nmsgstr \"\"\n\n#. Key:\tSoAct2_EG_GolemFirst_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Sphere Golem\"\nmsgstr \"\"\n\n#. Key:\tSoAct2_EG_GolemSecond_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Looks like the second try is just as bad as the first one.\"\nmsgstr \"\"\n\n#. Key:\tSoAct2_EG_GolemSecond_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Second Sphere Golem\"\nmsgstr \"\"\n\n#. Key:\tSoAct2_EG_GolemThird_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Whoever made this Golem, he should have stopped after the second try.\"\nmsgstr \"\"\n\n#. Key:\tSoAct2_EG_GolemThird_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Third Sphere Golem\"\nmsgstr \"\"\n\n#. Key:\tSoAct2_EG_HutFishies_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Now that the Fishys are gone, the Lake's piranhas can live in peace and eat whoever comes close.\"\nmsgstr \"\"\n\n#. Key:\tSoAct2_EG_HutFishies_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Abandoned Fishy Slaves\"\nmsgstr \"\"\n\n#. Key:\tSoAct2_EG_HutFlyArmy_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"No one knows where the Flies came from. Although you have a very clear idea on where they should go...\"\nmsgstr \"\"\n\n#. Key:\tSoAct2_EG_HutFlyArmy_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Annoying Flies\"\nmsgstr \"\"\n\n#. Key:\tSoAct2_EG_LavaBoss_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Armour Wrath was the most ambitious and majestic work of the Golem Maker. He used all his remaining strength to create this mighty Golem. It's a pity that all his efforts were in vain.\"\nmsgstr \"\"\n\n#. Key:\tSoAct2_EG_LavaBoss_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Armour Wrath\"\nmsgstr \"\"\n\n#. Key:\tSoAct2_EG_LavaDeepTeam_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"A fourth Sphere Golem? Someone never gives up...\"\nmsgstr \"\"\n\n#. Key:\tSoAct2_EG_LavaDeepTeam_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Fourth Sphere Golem\"\nmsgstr \"\"\n\n#. Key:\tSoAct2_EG_LavaJumpers_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"When a Golem falls into the lava its stone body will melt away. The spirit however resists the heat and will be looking for another body...\"\nmsgstr \"\"\n\n#. Key:\tSoAct2_EG_LavaJumpers_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Lava Jumpers\"\nmsgstr \"\"\n\n#. Key:\tSoAct2_EG_LavaTeamX_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Divided they fall, united they divide...\"\nmsgstr \"\"\n\n#. Key:\tSoAct2_EG_LavaTeamX_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Golem Group\"\nmsgstr \"\"\n\n#. Key:\tSoAct2_EG_LavaTrio_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Wherever Golems go after death these three will go there together.\"\nmsgstr \"\"\n\n#. Key:\tSoAct2_EG_LavaTrio_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Golem Trio\"\nmsgstr \"\"\n\n#. Key:\tSoAct2_EG_OutpostLeft_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"To keep Ruin away dwarves forbade everything related to Ruin's magic. This might have worked in theory but they failed to notice that their mechanical devices were also powered by Ruin.\"\nmsgstr \"\"\n\n#. Key:\tSoAct2_EG_OutpostLeft_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Guardians of the West Wall\"\nmsgstr \"\"\n\n#. Key:\tSoAct2_EG_OutpostRight_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Ruin was not only meant for destruction, it could also preserve. Ruin gave endless life for those who survived at the cost of twisting their minds.\"\nmsgstr \"\"\n\n#. Key:\tSoAct2_EG_OutpostRight_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Guardians of the East Wall\"\nmsgstr \"\"\n\n#. Key:\tSoAct2_EG_OutpostWallFirst_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Dwarves fought Ruin with Rules. These soldiers were ordered here to guard the Outpost. Their will to obey the order was so strong that even death couldn't break it.\"\nmsgstr \"\"\n\n#. Key:\tSoAct2_EG_OutpostWallFirst_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Patrols of the Outpost Wall\"\nmsgstr \"\"\n\n#. Key:\tSoAct2_EG_Shore_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"After Ruin turned them into Monsters some creatures gathered together. Whether it's the effect of Ruin or something from their former life is unclear.\"\nmsgstr \"\"\n\n#. Key:\tSoAct2_EG_Shore_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Shore Monsters\"\nmsgstr \"\"\n\n#. Key:\tSoAct2_EG_SlideFishyTeam_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Fishys were produced by the Great Kobold tribe for slaves. Some of them managed to escape, but they couldn't go far from the Lake.\"\nmsgstr \"\"\n\n#. Key:\tSoAct2_EG_SlideFishyTeam_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Deserter Fishys\"\nmsgstr \"\"\n\n#. Key:\tSoAct2_EG_SlidePathEnd_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Deserter Fishys always kept a Fishy group close to the exit of their secret hideout. They protected the others and watched the kobolds to find the right time to venture back to the Lake.\"\nmsgstr \"\"\n\n#. Key:\tSoAct2_EG_SlidePathEnd_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Patrol Fishys\"\nmsgstr \"\"\n\n#. Key:\tSoAct2_EG_WormHole_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Worms kept distance from each other before Ruin. It's strange how a force which tears everything apart can also unite.\"\nmsgstr \"\"\n\n#. Key:\tSoAct2_EG_WormHole_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Worms\"\nmsgstr \"\"\n\n#. Key:\tSoAct2_EG_Wormy_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"There was a time when Worms only made damage to fields and gardens. Now they are a bit more ambitious...\"\nmsgstr \"\"\n\n#. Key:\tSoAct2_EG_Wormy_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Worm\"\nmsgstr \"\"\n\n#. Key:\tSoAct2_EG_WWBoss_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"When Ruin appeared some decided to abandon civilization and return to nature. Their leader, the Fallen Druid cast an ancient spell to protect his plants from Ruin. His spell partly worked but at a terrible cost.\"\nmsgstr \"\"\n\n#. Key:\tSoAct2_EG_WWBoss_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Fallen Druid\"\nmsgstr \"\"\n\n#. Key:\tSoAct3_EG_Act3BubbleGroundMain_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Ruin's power is not only in destruction. When it can't change something it will preserve those attributes which can prepare the possibility to change again. Ruin's power is in change.\"\nmsgstr \"\"\n\n#. Key:\tSoAct3_EG_Act3BubbleGroundMain_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Maintainer Spellcasters\"\nmsgstr \"\"\n\n#. Key:\tSoAct3_EG_Act3FinalBattle_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Even though Ruin doesn't have consciousness nor the ability to think it somehow reacts to your presence. As if it knew the threat you present, Ruin tries all it can to stop you from leaving the Ruined Realm.\"\nmsgstr \"\"\n\n#. Key:\tSoAct3_EG_Act3FinalBattle_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Ruined Convention\"\nmsgstr \"\"\n\n#. Key:\tSoAct3_EG_Act3PipeGroupFirst_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"There is a difference between how Humans and Golems are transformed by Ruin. Human bodies reach their final form in a few decades but Golems never stop changing. There is always a new, more vicious type.\"\nmsgstr \"\"\n\n#. Key:\tSoAct3_EG_Act3PipeGroupFirst_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Red Drones\"\nmsgstr \"\"\n\n#. Key:\tSoAct3_EG_Act3PipeGroupSecond_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Transformation is relative to intelligence. Creatures with consciousness have a strong desire to reserve their ego. Ruin can fool them a few times but later they become invulnerable to Ruin's changing power.\"\nmsgstr \"\"\n\n#. Key:\tSoAct3_EG_Act3PipeGroupSecond_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"More Drones\"\nmsgstr \"\"\n\n#. Key:\tSoAct3_EG_Act3RangedCleanerTwins_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Ruin's nature is confusing for the human mind. It can build, it can destroy, it can use, it can be used. These actions have the same priority for Ruin. All that matters is that it can do something. And with time it wants more and more.\"\nmsgstr \"\"\n\n#. Key:\tSoAct3_EG_Act3RangedCleanerTwins_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Cleaner Twins\"\nmsgstr \"\"\n\n#. Key:\tSoAct3_EG_Act3VacuumTwins_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Ruin's logic is predictable when you understand its nature. When it's not possible to create more the creation process can be restarted by destroying everything first.\"\nmsgstr \"\"\n\n#. Key:\tSoAct3_EG_Act3VacuumTwins_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Elite Twins\"\nmsgstr \"\"\n\n#. Key:\tWhiteWall_EG_AfterKobold_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Creating intelligence was not enough for the Golem Makers. They wanted to get even further. They wanted to create Golems with emotions.\"\nmsgstr \"\"\n\n#. Key:\tWhiteWall_EG_AfterKobold_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Flying Maintainer\"\nmsgstr \"\"\n\n#. Key:\tWhiteWall_EG_BeforeKobold_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"When the Cataclysm happened and Ruin came the Golems started to change. Instead of doing their daily work some of them turned against their masters.\"\nmsgstr \"\"\n\n#. Key:\tWhiteWall_EG_BeforeKobold_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Infected Golems\"\nmsgstr \"\"\n\n#. Key:\tWhiteWall_EG_FirstCombat_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Cleaners were the first Golems ever made. Before the Cataclysm they did all the monoton work so that the people had more time to think and to create.\"\nmsgstr \"\"\n\n#. Key:\tWhiteWall_EG_FirstCombat_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Whitewall Cleaners\"\nmsgstr \"\"\n\n#. Key:\tWhiteWall_EG_FirstOptionalCombat_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"After the different types of Cleaners, Golem Makers wanted to create something greater than working robots. They started to design creatures with intelligence.\"\nmsgstr \"\"\n\n#. Key:\tWhiteWall_EG_FirstOptionalCombat_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Whitewall Maintainers\"\nmsgstr \"\"\n\n#. Key:\tAbacus_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/Abacus.Abacus.Description\n#: /Game/SO/Items/QuestItems/Abacus.Abacus.Description\nmsgctxt \"ItemData\"\nmsgid \"When you don't have enough fingers to count something you need this abacus.\"\nmsgstr \"\"\n\n#. Key:\tAbacus_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/Abacus.Abacus.Name\n#: /Game/SO/Items/QuestItems/Abacus.Abacus.Name\nmsgctxt \"ItemData\"\nmsgid \"Abacus\"\nmsgstr \"\"\n\n#. Key:\tAbacusGhost_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/AbacusGhost.AbacusGhost.Description\n#: /Game/SO/Items/QuestItems/AbacusGhost.AbacusGhost.Description\nmsgctxt \"ItemData\"\nmsgid \"When the Abacus is killed its spirit might return to get even with its murderer.\"\nmsgstr \"\"\n\n#. Key:\tAbacusGhost_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/AbacusGhost.AbacusGhost.Name\n#: /Game/SO/Items/QuestItems/AbacusGhost.AbacusGhost.Name\nmsgctxt \"ItemData\"\nmsgid \"Ghost Abacus\"\nmsgstr \"\"\n\n#. Key:\tAbacusGhostFlower_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/AbacusGhostFlower.AbacusGhostFlower.Description\n#: /Game/SO/Items/QuestItems/AbacusGhostFlower.AbacusGhostFlower.Description\nmsgctxt \"ItemData\"\nmsgid \"Petals of a ghost flower.\"\nmsgstr \"\"\n\n#. Key:\tAbacusGhostFlower_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/AbacusGhostFlower.AbacusGhostFlower.Name\n#: /Game/SO/Items/QuestItems/AbacusGhostFlower.AbacusGhostFlower.Name\nmsgctxt \"ItemData\"\nmsgid \"Ghost Petals\"\nmsgstr \"\"\n\n#. Key:\tAbacusSpellBook_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/AbacusSpellBook.AbacusSpellBook.Description\n#: /Game/SO/Items/QuestItems/AbacusSpellBook.AbacusSpellBook.Description\nmsgctxt \"ItemData\"\nmsgid \"An ancient paper\"\nmsgstr \"\"\n\n#. Key:\tAbacusSpellBook_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/AbacusSpellBook.AbacusSpellBook.Name\n#: /Game/SO/Items/QuestItems/AbacusSpellBook.AbacusSpellBook.Name\nmsgctxt \"ItemData\"\nmsgid \"Scroll of Surrection\"\nmsgstr \"\"\n\n#. Key:\tAbacusSpellBook_page_0\n#. SourceLocation:\t/Game/SO/Items/QuestItems/AbacusSpellBook.AbacusSpellBook.Pages(0).Pages\n#: /Game/SO/Items/QuestItems/AbacusSpellBook.AbacusSpellBook.Pages(0).Pages\nmsgctxt \"ItemData\"\nmsgid \"Wisy et al. [3152] point out that any entity can be banished by throwing the proper object into his/her/its face a few times, making him/her/it annoyed thus unconcerned, as long as the target entity has a face.\\r\\n\\r\\nThe proper object in case of ghosts is something Surrected [Inti and Clevi 3153], as only Surrected substance can interact with ghosts.\\r\\n\\r\\nAny object covered with petals of Ghost Flower can be Surrected using the following method:\\r\\n\\r\\n- Say \\\"Sorry my <object name>!\\\"\\r\\n- Break the object into pieces with a heated hammer\\r\\n- Say your favourite color\\r\\n- Croon \\\"La La LaLaLa LaLaLa\\\" until the object is coagulated into a single Surrected object\"\nmsgstr \"\"\n\n#. Key:\tAbacusSpellBook_page_1\n#. SourceLocation:\t/Game/SO/Items/QuestItems/AbacusSpellBook.AbacusSpellBook.Pages(1).Pages\n#: /Game/SO/Items/QuestItems/AbacusSpellBook.AbacusSpellBook.Pages(1).Pages\nmsgctxt \"ItemData\"\nmsgid \"WARNING: not following the instructions exactly leads to failure and also increases the probability of injury and or death [Carfy 3154].\\r\\n\\r\\nREFERENCES:\\r\\n\\r\\nWISY, W., BUSY, B., WEIRDY, Y., AND LUCKY, L. 3152. The best ways to get rid of anyone potentially distracting us with questions like \\\"What do you read?\\\"\\r\\n\\r\\nInti, I., AND Clevi, C. 3153. Insulting dead ancestors using Surrected objects\\r\\n\\r\\nCarfy C. 3154. What happened to Clevi, C. and Inti, I.\"\nmsgstr \"\"\n\n#. Key:\tAll_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/All.All.Description\n#: /Game/SO/Items/QuestItems/All.All.Description\nmsgctxt \"ItemData\"\nmsgid \"Maybe it was a bit too much?\"\nmsgstr \"\"\n\n#. Key:\tAll_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/All.All.Name\n#: /Game/SO/Items/QuestItems/All.All.Name\nmsgctxt \"ItemData\"\nmsgid \"Everything, except an Abacus\"\nmsgstr \"\"\n\n#. Key:\tArtifact_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/Artifact.Artifact.Description\n#: /Game/SO/Items/QuestItems/Artifact.Artifact.Description\nmsgctxt \"ItemData\"\nmsgid \"A very rare and powerful item which is used for opening a portal into the Unknown Realm. If you gather three and give them to the Wizard he shall set you free.\"\nmsgstr \"\"\n\n#. Key:\tArtifact_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/Artifact.Artifact.Name\n#: /Game/SO/Items/QuestItems/Artifact.Artifact.Name\nmsgctxt \"ItemData\"\nmsgid \"Artifact\"\nmsgstr \"\"\n\n#. Key:\tAxeMainGame_desc\n#. SourceLocation:\t/Game/SO/Items/Weapons/AxeMainGame.AxeMainGame.Description\n#. Key:\tAxe_desc\n#. SourceLocation:\t/Game/SO/Items/Weapons/Axe.Axe.Description\n#: /Game/SO/Items/Weapons/Axe.Axe.Description\n#: /Game/SO/Items/Weapons/AxeMainGame.AxeMainGame.Description\nmsgctxt \"ItemData\"\nmsgid \"Axes are usefull, but if you don't need them you can just throw them away.\"\nmsgstr \"\"\n\n#. Key:\tAxeMainGame_name\n#. SourceLocation:\t/Game/SO/Items/Weapons/AxeMainGame.AxeMainGame.Name\n#. Key:\tAxe_name\n#. SourceLocation:\t/Game/SO/Items/Weapons/Axe.Axe.Name\n#: /Game/SO/Items/Weapons/Axe.Axe.Name\n#: /Game/SO/Items/Weapons/AxeMainGame.AxeMainGame.Name\nmsgctxt \"ItemData\"\nmsgid \"Axes\"\nmsgstr \"\"\n\n#. Key:\tBlueCrystal_desc\n#. SourceLocation:\t/Game/SO/Items/Valuable/BlueCrystal.BlueCrystal.Description\n#: /Game/SO/Items/Valuable/BlueCrystal.BlueCrystal.Description\nmsgctxt \"ItemData\"\nmsgid \"An ancient crystal people like to buy.\"\nmsgstr \"\"\n\n#. Key:\tBlueCrystal_name\n#. SourceLocation:\t/Game/SO/Items/Valuable/BlueCrystal.BlueCrystal.Name\n#: /Game/SO/Items/Valuable/BlueCrystal.BlueCrystal.Name\nmsgctxt \"ItemData\"\nmsgid \"Blue Crystal\"\nmsgstr \"\"\n\n#. Key:\tBlueGem_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/BlueGem.BlueGem.Description\n#: /Game/SO/Items/QuestItems/BlueGem.BlueGem.Description\nmsgctxt \"ItemData\"\nmsgid \"A small precious blue stone.\"\nmsgstr \"\"\n\n#. Key:\tBlueGem_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/BlueGem.BlueGem.Name\n#: /Game/SO/Items/QuestItems/BlueGem.BlueGem.Name\nmsgctxt \"ItemData\"\nmsgid \"Blue Gem\"\nmsgstr \"\"\n\n#. Key:\tDemonSword_desc\n#. SourceLocation:\t/Game/SO/Items/Weapons/DemonSword.DemonSword.Description\n#: /Game/SO/Items/Weapons/DemonSword.DemonSword.Description\nmsgctxt \"ItemData\"\nmsgid \"The mighty sword of Kharutar the Demon Ruler. Legend says he once cut one of his fingers with it and in his rage he broke the sword into two. Later it was reforged but some say it would still need some more fixes.\"\nmsgstr \"\"\n\n#. Key:\tDemonSword_name\n#. SourceLocation:\t/Game/SO/Items/Weapons/DemonSword.DemonSword.Name\n#: /Game/SO/Items/Weapons/DemonSword.DemonSword.Name\nmsgctxt \"ItemData\"\nmsgid \"Demon Sword\"\nmsgstr \"\"\n\n#. Key:\tDOKitchenKey_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/DOKitchenKey.DOKitchenKey.Description\n#: /Game/SO/Items/Keys/DOKitchenKey.DOKitchenKey.Description\nmsgctxt \"ItemData\"\nmsgid \"This is one of the many spare keys of the Dwarven Outpost Kitchen. Being able to get into the kitchen was always very important for dwarves.\"\nmsgstr \"\"\n\n#. Key:\tDOKitchenKey_name\n#. SourceLocation:\t/Game/SO/Items/Keys/DOKitchenKey.DOKitchenKey.Name\n#: /Game/SO/Items/Keys/DOKitchenKey.DOKitchenKey.Name\nmsgctxt \"ItemData\"\nmsgid \"Kitchen Key\"\nmsgstr \"\"\n\n#. Key:\tDualBlade_desc\n#. SourceLocation:\t/Game/SO/Items/Weapons/DualBlade.DualBlade.Description\n#: /Game/SO/Items/Weapons/DualBlade.DualBlade.Description\nmsgctxt \"ItemData\"\nmsgid \"In case of trouble, it's better to have double.\"\nmsgstr \"\"\n\n#. Key:\tDualBlade_name\n#. SourceLocation:\t/Game/SO/Items/Weapons/DualBlade.DualBlade.Name\n#: /Game/SO/Items/Weapons/DualBlade.DualBlade.Name\nmsgctxt \"ItemData\"\nmsgid \"Double Sword\"\nmsgstr \"\"\n\n#. Key:\tElevatorGem_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/ElevatorGem.ElevatorGem.Description\n#: /Game/SO/Items/QuestItems/ElevatorGem.ElevatorGem.Description\nmsgctxt \"ItemData\"\nmsgid \"A shiny green crystal which activates a weight lifting mechanism. At least by the look of it.\"\nmsgstr \"\"\n\n#. Key:\tElevatorGem_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/ElevatorGem.ElevatorGem.Name\n#: /Game/SO/Items/QuestItems/ElevatorGem.ElevatorGem.Name\nmsgctxt \"ItemData\"\nmsgid \"Elevator Gem\"\nmsgstr \"\"\n\n#. Key:\tElevatorLeverCrystal_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/ElevatorLeverCrystal.ElevatorLeverCrystal.Description\n#: /Game/SO/Items/QuestItems/ElevatorLeverCrystal.ElevatorLeverCrystal.Description\nmsgctxt \"ItemData\"\nmsgid \"You got this item for free from a Merchant so you hardly believe it has any value. It might be used as some sort of a mechanism activator though. Hopefully not for a trap.\"\nmsgstr \"\"\n\n#. Key:\tElevatorLeverCrystal_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/ElevatorLeverCrystal.ElevatorLeverCrystal.Name\n#: /Game/SO/Items/QuestItems/ElevatorLeverCrystal.ElevatorLeverCrystal.Name\nmsgctxt \"ItemData\"\nmsgid \"Elevator Crystal\"\nmsgstr \"\"\n\n#. Key:\tFountainFlower_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/FountainFlower.FountainFlower.Description\n#: /Game/SO/Items/QuestItems/FountainFlower.FountainFlower.Description\nmsgctxt \"ItemData\"\nmsgid \"Flower acquired from a fountain.\"\nmsgstr \"\"\n\n#. Key:\tFountainFlower_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/FountainFlower.FountainFlower.Name\n#: /Game/SO/Items/QuestItems/FountainFlower.FountainFlower.Name\nmsgctxt \"ItemData\"\nmsgid \"Fountain Flower\"\nmsgstr \"\"\n\n#. Key:\tGateKeeperSeat_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/GateKeeperSeat.GateKeeperSeat.Description\n#: /Game/SO/Items/QuestItems/GateKeeperSeat.GateKeeperSeat.Description\nmsgctxt \"ItemData\"\nmsgid \"A simple seat of size XXXXXXXXXL\"\nmsgstr \"\"\n\n#. Key:\tGateKeeperSeat_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/GateKeeperSeat.GateKeeperSeat.Name\n#: /Game/SO/Items/QuestItems/GateKeeperSeat.GateKeeperSeat.Name\nmsgctxt \"ItemData\"\nmsgid \"Giant Seat\"\nmsgstr \"\"\n\n#. Key:\tKeyAADoorNearDungeonExit_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyAADoorNearDungeonExit.KeyAADoorNearDungeonExit.Description\n#: /Game/SO/Items/Keys/KeyAADoorNearDungeonExit.KeyAADoorNearDungeonExit.Description\nmsgctxt \"ItemData\"\nmsgid \"A key without a proper item description\"\nmsgstr \"\"\n\n#. Key:\tKeyAADoorNearDungeonExit_name\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyAADoorNearDungeonExit.KeyAADoorNearDungeonExit.Name\n#: /Game/SO/Items/Keys/KeyAADoorNearDungeonExit.KeyAADoorNearDungeonExit.Name\nmsgctxt \"ItemData\"\nmsgid \"Arcade Key\"\nmsgstr \"\"\n\n#. Key:\tKeyAAFirstFight_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyAAFirstFight.KeyAAFirstFight.Description\n#: /Game/SO/Items/Keys/KeyAAFirstFight.KeyAAFirstFight.Description\nmsgctxt \"ItemData\"\nmsgid \"Weird\"\nmsgstr \"\"\n\n#. Key:\tKeyAAFirstFight_name\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyAAFirstFight.KeyAAFirstFight.Name\n#: /Game/SO/Items/Keys/KeyAAFirstFight.KeyAAFirstFight.Name\nmsgctxt \"ItemData\"\nmsgid \"Weird Key\"\nmsgstr \"\"\n\n#. Key:\tKeyAAMainFirstDoor_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyAAMainFirstDoor.KeyAAMainFirstDoor.Description\n#: /Game/SO/Items/Keys/KeyAAMainFirstDoor.KeyAAMainFirstDoor.Description\nmsgctxt \"ItemData\"\nmsgid \"Sometimes the lock is harder to find than the key.\"\nmsgstr \"\"\n\n#. Key:\tKeyAAMainFirstDoor_name\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyAAMainFirstDoor.KeyAAMainFirstDoor.Name\n#: /Game/SO/Items/Keys/KeyAAMainFirstDoor.KeyAAMainFirstDoor.Name\nmsgctxt \"ItemData\"\nmsgid \"Key of Something\"\nmsgstr \"\"\n\n#. Key:\tKeyAGPortalFight_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyAGPortalFight.KeyAGPortalFight.Description\n#: /Game/SO/Items/Keys/KeyAGPortalFight.KeyAGPortalFight.Description\nmsgctxt \"ItemData\"\nmsgid \"Just another key.\"\nmsgstr \"\"\n\n#. Key:\tKeyAGPortalFight_name\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyAGPortalFight.KeyAGPortalFight.Name\n#: /Game/SO/Items/Keys/KeyAGPortalFight.KeyAGPortalFight.Name\nmsgctxt \"ItemData\"\nmsgid \"Eastern Key\"\nmsgstr \"\"\n\n#. Key:\tKeyBronze_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyBronze.KeyBronze.Description\n#: /Game/SO/Items/Keys/KeyBronze.KeyBronze.Description\nmsgctxt \"ItemData\"\nmsgid \"A reforged Bronze Key.\"\nmsgstr \"\"\n\n#. Key:\tKeyBronze_name\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyBronze.KeyBronze.Name\n#: /Game/SO/Items/Keys/KeyBronze.KeyBronze.Name\nmsgctxt \"ItemData\"\nmsgid \"Bronze Key\"\nmsgstr \"\"\n\n#. Key:\tKeyCatacombs0_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyCatacombs0.KeyCatacombs0.Description\n#: /Game/SO/Items/Keys/KeyCatacombs0.KeyCatacombs0.Description\nmsgctxt \"ItemData\"\nmsgid \"There are a ridiculous amount of keys in this world, right?\"\nmsgstr \"\"\n\n#. Key:\tKeyCatacombs0_name\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyCatacombs0.KeyCatacombs0.Name\n#: /Game/SO/Items/Keys/KeyCatacombs0.KeyCatacombs0.Name\nmsgctxt \"ItemData\"\nmsgid \"Key Of The Room Below\"\nmsgstr \"\"\n\n#. Key:\tKeyCopper_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyCopper.KeyCopper.Description\n#: /Game/SO/Items/Keys/KeyCopper.KeyCopper.Description\nmsgctxt \"ItemData\"\nmsgid \"A reforged Copper Key.\"\nmsgstr \"\"\n\n#. Key:\tKeyCopper_name\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyCopper.KeyCopper.Name\n#: /Game/SO/Items/Keys/KeyCopper.KeyCopper.Name\nmsgctxt \"ItemData\"\nmsgid \"Copper Key\"\nmsgstr \"\"\n\n#. Key:\tKeyDCMainOut_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyDCMainOut.KeyDCMainOut.Description\n#: /Game/SO/Items/Keys/KeyDCMainOut.KeyDCMainOut.Description\nmsgctxt \"ItemData\"\nmsgid \"Just an old, rusty iron key without a proper item description\"\nmsgstr \"\"\n\n#. Key:\tKeyDCMainOut_name\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyDCMainOut.KeyDCMainOut.Name\n#: /Game/SO/Items/Keys/KeyDCMainOut.KeyDCMainOut.Name\nmsgctxt \"ItemData\"\nmsgid \"Catacomb Key\"\nmsgstr \"\"\n\n#. Key:\tKeyIron_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyIron.KeyIron.Description\n#: /Game/SO/Items/Keys/KeyIron.KeyIron.Description\nmsgctxt \"ItemData\"\nmsgid \"A reforged Iron Key.\"\nmsgstr \"\"\n\n#. Key:\tKeyIron_name\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyIron.KeyIron.Name\n#: /Game/SO/Items/Keys/KeyIron.KeyIron.Name\nmsgctxt \"ItemData\"\nmsgid \"Iron Key\"\nmsgstr \"\"\n\n#. Key:\tKeyMaster_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyMaster.KeyMaster.Description\n#: /Game/SO/Items/Keys/KeyMaster.KeyMaster.Description\nmsgctxt \"ItemData\"\nmsgid \"This key can be used to open any door equipped with a special kind of lock, but breaks during the process.\"\nmsgstr \"\"\n\n#. Key:\tKeyMaster_name\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyMaster.KeyMaster.Name\n#: /Game/SO/Items/Keys/KeyMaster.KeyMaster.Name\nmsgctxt \"ItemData\"\nmsgid \"Master Key\"\nmsgstr \"\"\n\n#. Key:\tKeyMerchant_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyMerchant.KeyMerchant.Description\n#: /Game/SO/Items/Keys/KeyMerchant.KeyMerchant.Description\nmsgctxt \"ItemData\"\nmsgid \"Does it really work? You will find out soon...\"\nmsgstr \"\"\n\n#. Key:\tKeyMerchant_name\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyMerchant.KeyMerchant.Name\n#: /Game/SO/Items/Keys/KeyMerchant.KeyMerchant.Name\nmsgctxt \"ItemData\"\nmsgid \"A very small key\"\nmsgstr \"\"\n\n#. Key:\tKeyOutpostWall_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyOutpostWall.KeyOutpostWall.Description\n#: /Game/SO/Items/Keys/KeyOutpostWall.KeyOutpostWall.Description\nmsgctxt \"ItemData\"\nmsgid \"Do you really read the key descriptions?\"\nmsgstr \"\"\n\n#. Key:\tKeyOutpostWall_name\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyOutpostWall.KeyOutpostWall.Name\n#: /Game/SO/Items/Keys/KeyOutpostWall.KeyOutpostWall.Name\nmsgctxt \"ItemData\"\nmsgid \"Key Of The Outpost Wall\"\nmsgstr \"\"\n\n#. Key:\tKeyOutpostWallOptional_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyOutpostWallOptional.KeyOutpostWallOptional.Description\n#: /Game/SO/Items/Keys/KeyOutpostWallOptional.KeyOutpostWallOptional.Description\nmsgctxt \"ItemData\"\nmsgid \"I would rather sleep, but the item descriptions won't write themselves.\"\nmsgstr \"\"\n\n#. Key:\tKeyOutpostWallOptional_name\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyOutpostWallOptional.KeyOutpostWallOptional.Name\n#: /Game/SO/Items/Keys/KeyOutpostWallOptional.KeyOutpostWallOptional.Name\nmsgctxt \"ItemData\"\nmsgid \"Second Key Of The Outpost Wall\"\nmsgstr \"\"\n\n#. Key:\tKeyPiecesBronze0_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyPiecesBronze0.KeyPiecesBronze0.Description\n#: /Game/SO/Items/Keys/KeyPiecesBronze0.KeyPiecesBronze0.Description\nmsgctxt \"ItemData\"\nmsgid \"Half of a broken Bronze Key\"\nmsgstr \"\"\n\n#. Key:\tKeyPiecesBronze0_name\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyPiecesBronze0.KeyPiecesBronze0.Name\n#: /Game/SO/Items/Keys/KeyPiecesBronze0.KeyPiecesBronze0.Name\nmsgctxt \"ItemData\"\nmsgid \"Half Bronze Key\"\nmsgstr \"\"\n\n#. Key:\tKeyPiecesCopper0_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyPiecesCopper0.KeyPiecesCopper0.Description\n#: /Game/SO/Items/Keys/KeyPiecesCopper0.KeyPiecesCopper0.Description\nmsgctxt \"ItemData\"\nmsgid \"Half of a broken Copper Key\"\nmsgstr \"\"\n\n#. Key:\tKeyPiecesCopper0_name\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyPiecesCopper0.KeyPiecesCopper0.Name\n#: /Game/SO/Items/Keys/KeyPiecesCopper0.KeyPiecesCopper0.Name\nmsgctxt \"ItemData\"\nmsgid \"Half Copper Key\"\nmsgstr \"\"\n\n#. Key:\tKeyPiecesIron0_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyPiecesIron0.KeyPiecesIron0.Description\n#: /Game/SO/Items/Keys/KeyPiecesIron0.KeyPiecesIron0.Description\nmsgctxt \"ItemData\"\nmsgid \"Half of a broken Iron Key\"\nmsgstr \"\"\n\n#. Key:\tKeyPiecesIron0_name\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyPiecesIron0.KeyPiecesIron0.Name\n#: /Game/SO/Items/Keys/KeyPiecesIron0.KeyPiecesIron0.Name\nmsgctxt \"ItemData\"\nmsgid \"Half Iron Key\"\nmsgstr \"\"\n\n#. Key:\tKeySA_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/KeySA.KeySA.Description\n#: /Game/SO/Items/Keys/KeySA.KeySA.Description\nmsgctxt \"ItemData\"\nmsgid \"Looks like there are tons of these\"\nmsgstr \"\"\n\n#. Key:\tKeySA_name\n#. SourceLocation:\t/Game/SO/Items/Keys/KeySA.KeySA.Name\n#: /Game/SO/Items/Keys/KeySA.KeySA.Name\nmsgctxt \"ItemData\"\nmsgid \"Another Key\"\nmsgstr \"\"\n\n#. Key:\tKeySASewerCreatureCell_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/KeySASewerCreatureCell.KeySASewerCreatureCell.Description\n#: /Game/SO/Items/Keys/KeySASewerCreatureCell.KeySASewerCreatureCell.Description\nmsgctxt \"ItemData\"\nmsgid \"A small key you got from the Pipe Walkers.\"\nmsgstr \"\"\n\n#. Key:\tKeyTLElevatorRoom_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyTLElevatorRoom.KeyTLElevatorRoom.Description\n#: /Game/SO/Items/Keys/KeyTLElevatorRoom.KeyTLElevatorRoom.Description\nmsgctxt \"ItemData\"\nmsgid \"A key without any sign of interest.\"\nmsgstr \"\"\n\n#. Key:\tKeyTLElevatorRoom_name\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyTLElevatorRoom.KeyTLElevatorRoom.Name\n#: /Game/SO/Items/Keys/KeyTLElevatorRoom.KeyTLElevatorRoom.Name\nmsgctxt \"ItemData\"\nmsgid \"Unconcerned Key\"\nmsgstr \"\"\n\n#. Key:\tKeyWWFirstGate_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyWWFirstGate.KeyWWFirstGate.Description\n#: /Game/SO/Items/Keys/KeyWWFirstGate.KeyWWFirstGate.Description\nmsgctxt \"ItemData\"\nmsgid \"It will open a gate somewhere. Probably.\"\nmsgstr \"\"\n\n#. Key:\tKeyWWFirstGate_name\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyWWFirstGate.KeyWWFirstGate.Name\n#: /Game/SO/Items/Keys/KeyWWFirstGate.KeyWWFirstGate.Name\nmsgctxt \"ItemData\"\nmsgid \"Railway Gate Key\"\nmsgstr \"\"\n\n#. Key:\tKeyWWPortal_desc\n#. SourceLocation:\t/Game/SO/Items/WhiteWallItems/KeyWWPortal.KeyWWPortal.Description\n#: /Game/SO/Items/WhiteWallItems/KeyWWPortal.KeyWWPortal.Description\nmsgctxt \"ItemData\"\nmsgid \"A fancy iron key with a shiny gem in its grip. It must be really precious.\"\nmsgstr \"\"\n\n#. Key:\tKeyWWPortal_name\n#. SourceLocation:\t/Game/SO/Items/WhiteWallItems/KeyWWPortal.KeyWWPortal.Name\n#: /Game/SO/Items/WhiteWallItems/KeyWWPortal.KeyWWPortal.Name\nmsgctxt \"ItemData\"\nmsgid \"Portal Key\"\nmsgstr \"\"\n\n#. Key:\tKEYWWSewerCreatureCell_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/KEYWWSewerCreatureCell.KEYWWSewerCreatureCell.Description\n#: /Game/SO/Items/Keys/KEYWWSewerCreatureCell.KEYWWSewerCreatureCell.Description\nmsgctxt \"ItemData\"\nmsgid \"A small key you got from a chest in the middle of nowhere.\"\nmsgstr \"\"\n\n#. Key:\tKEYWWSewerCreatureCell_name\n#. SourceLocation:\t/Game/SO/Items/Keys/KEYWWSewerCreatureCell.KEYWWSewerCreatureCell.Name\n#. Key:\tKeySASewerCreatureCell_name\n#. SourceLocation:\t/Game/SO/Items/Keys/KeySASewerCreatureCell.KeySASewerCreatureCell.Name\n#: /Game/SO/Items/Keys/KeySASewerCreatureCell.KeySASewerCreatureCell.Name\n#: /Game/SO/Items/Keys/KEYWWSewerCreatureCell.KEYWWSewerCreatureCell.Name\nmsgctxt \"ItemData\"\nmsgid \"Small Cell Key\"\nmsgstr \"\"\n\n#. Key:\tKeyWWWhiteWall_desc\n#. SourceLocation:\t/Game/SO/Items/WhiteWallItems/KeyWWWhiteWall.KeyWWWhiteWall.Description\n#: /Game/SO/Items/WhiteWallItems/KeyWWWhiteWall.KeyWWWhiteWall.Description\nmsgctxt \"ItemData\"\nmsgid \"A robust iron key with a carved script: <Bold>'Outer Wall Tower'</>.\"\nmsgstr \"\"\n\n#. Key:\tKeyWWWhiteWall_name\n#. SourceLocation:\t/Game/SO/Items/WhiteWallItems/KeyWWWhiteWall.KeyWWWhiteWall.Name\n#: /Game/SO/Items/WhiteWallItems/KeyWWWhiteWall.KeyWWWhiteWall.Name\nmsgctxt \"ItemData\"\nmsgid \"White Wall Key\"\nmsgstr \"\"\n\n#. Key:\tKoboldCoin_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/KoboldCoin.KoboldCoin.Description\n#: /Game/SO/Items/QuestItems/KoboldCoin.KoboldCoin.Description\nmsgctxt \"ItemData\"\nmsgid \"Some Coins you found in a chest.\"\nmsgstr \"\"\n\n#. Key:\tKoboldCoin_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/KoboldCoin.KoboldCoin.Name\n#: /Game/SO/Items/QuestItems/KoboldCoin.KoboldCoin.Name\nmsgctxt \"ItemData\"\nmsgid \"Kobold Coins\"\nmsgstr \"\"\n\n#. Key:\tKoboldPotion_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/KoboldPotion.KoboldPotion.Description\n#: /Game/SO/Items/QuestItems/KoboldPotion.KoboldPotion.Description\nmsgctxt \"ItemData\"\nmsgid \"Weird liquid in a bottle. The kobold calls it Soup.\"\nmsgstr \"\"\n\n#. Key:\tKoboldPotion_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/KoboldPotion.KoboldPotion.Name\n#: /Game/SO/Items/QuestItems/KoboldPotion.KoboldPotion.Name\nmsgctxt \"ItemData\"\nmsgid \"Kobold Soup\"\nmsgstr \"\"\n\n#. Key:\tLavaGolemToken_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/LavaGolemToken.LavaGolemToken.Description\n#: /Game/SO/Items/QuestItems/LavaGolemToken.LavaGolemToken.Description\nmsgctxt \"ItemData\"\nmsgid \"A unique stone you can use to prove that you have eliminated a golem.\"\nmsgstr \"\"\n\n#. Key:\tLavaGolemToken_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/LavaGolemToken.LavaGolemToken.Name\n#: /Game/SO/Items/QuestItems/LavaGolemToken.LavaGolemToken.Name\nmsgctxt \"ItemData\"\nmsgid \"Stone Token\"\nmsgstr \"\"\n\n#. Key:\tLeafMace_desc\n#. SourceLocation:\t/Game/SO/Items/Weapons/LeafMace.LeafMace.Description\n#: /Game/SO/Items/Weapons/LeafMace.LeafMace.Description\nmsgctxt \"ItemData\"\nmsgid \"If someone would fail in cutting his/her/its way out of a hard situation, crushing your way through can still work out pretty well - it is said to be more effective if golems or certain mechanical devices / creatures are involved in the conflict.\"\nmsgstr \"\"\n\n#. Key:\tLeafMace_name\n#. SourceLocation:\t/Game/SO/Items/Weapons/LeafMace.LeafMace.Name\n#: /Game/SO/Items/Weapons/LeafMace.LeafMace.Name\nmsgctxt \"ItemData\"\nmsgid \"Leaf Mace\"\nmsgstr \"\"\n\n#. Key:\tLEKeyCage_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/LEKeyCage.LEKeyCage.Description\n#: /Game/SO/Items/Keys/LEKeyCage.LEKeyCage.Description\nmsgctxt \"ItemData\"\nmsgid \"You won't believe it but it is a key for a cage.\"\nmsgstr \"\"\n\n#. Key:\tLEKeyCage_name\n#. SourceLocation:\t/Game/SO/Items/Keys/LEKeyCage.LEKeyCage.Name\n#: /Game/SO/Items/Keys/LEKeyCage.LEKeyCage.Name\nmsgctxt \"ItemData\"\nmsgid \"Cage Key\"\nmsgstr \"\"\n\n#. Key:\tLETempleKey_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/LETempleKey.LETempleKey.Description\n#: /Game/SO/Items/Keys/LETempleKey.LETempleKey.Description\nmsgctxt \"ItemData\"\nmsgid \"This is one of the spare keys of the Ancient Temple. Just in case the original would be dropped into the lava accidentally.\"\nmsgstr \"\"\n\n#. Key:\tLETempleKey_name\n#. SourceLocation:\t/Game/SO/Items/Keys/LETempleKey.LETempleKey.Name\n#: /Game/SO/Items/Keys/LETempleKey.LETempleKey.Name\nmsgctxt \"ItemData\"\nmsgid \"Ancient Temple Key\"\nmsgstr \"\"\n\n#. Key:\tLoryBooks_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/LoryBooks.LoryBooks.Description\n#: /Game/SO/Items/QuestItems/LoryBooks.LoryBooks.Description\nmsgctxt \"ItemData\"\nmsgid \"Two ancient books with the titles \\\"True value of your family\\\" and \\\"How much does a brother cost?\\\". They look boring so you decide not to open them.\"\nmsgstr \"\"\n\n#. Key:\tLoryBooks_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/LoryBooks.LoryBooks.Name\n#: /Game/SO/Items/QuestItems/LoryBooks.LoryBooks.Name\nmsgctxt \"ItemData\"\nmsgid \"Old books\"\nmsgstr \"\"\n\n#. Key:\tMemoryCrystal1_desc\n#. SourceLocation:\t/Game/SO/Items/MemoryStone/MemoryCrystal1.MemoryCrystal1.Description\n#: /Game/SO/Items/MemoryStone/MemoryCrystal1.MemoryCrystal1.Description\nmsgctxt \"ItemData\"\nmsgid \"'According to the very few survivors, White Tower, our capital was completely destroyed by a magical phenomena called Ruin. At that time I was at Grey Gate so I can't tell anything for sure.'\\r\\n\\r\\nThe Last Sane Golem Maker, A.C. 16. September 4.\"\nmsgstr \"\"\n\n#. Key:\tMemoryCrystal1_name\n#. SourceLocation:\t/Game/SO/Items/MemoryStone/MemoryCrystal1.MemoryCrystal1.Name\n#: /Game/SO/Items/MemoryStone/MemoryCrystal1.MemoryCrystal1.Name\nmsgctxt \"ItemData\"\nmsgid \"Magical Phenomena\"\nmsgstr \"\"\n\n#. Key:\tMemoryCrystal2_desc\n#. SourceLocation:\t/Game/SO/Items/MemoryStone/MemoryCrystal2.MemoryCrystal2.Description\n#: /Game/SO/Items/MemoryStone/MemoryCrystal2.MemoryCrystal2.Description\nmsgctxt \"ItemData\"\nmsgid \"'Those who escaped Ruin have... changed.'\\r\\n'I've met a scientist who noticed how madness takes control over him. Perhaps he can find a solution.'\\r\\n\\r\\nThe Last Sane Golem Maker, A.C. 17. January 1.\"\nmsgstr \"\"\n\n#. Key:\tMemoryCrystal2_name\n#. SourceLocation:\t/Game/SO/Items/MemoryStone/MemoryCrystal2.MemoryCrystal2.Name\n#: /Game/SO/Items/MemoryStone/MemoryCrystal2.MemoryCrystal2.Name\nmsgctxt \"ItemData\"\nmsgid \"Degeneration and mutation\"\nmsgstr \"\"\n\n#. Key:\tMemoryCrystal3_desc\n#. SourceLocation:\t/Game/SO/Items/MemoryStone/MemoryCrystal3.MemoryCrystal3.Description\n#: /Game/SO/Items/MemoryStone/MemoryCrystal3.MemoryCrystal3.Description\nmsgctxt \"ItemData\"\nmsgid \"'It's hard to tell but I think colours are fading away. The World was brighter before.'\\r\\n'The Monk won't help me. He stubbornly believes we are doomed.'\\r\\n\\r\\nThe Last Sane Golem Maker, A.C. 17. March 11.\"\nmsgstr \"\"\n\n#. Key:\tMemoryCrystal3_name\n#. SourceLocation:\t/Game/SO/Items/MemoryStone/MemoryCrystal3.MemoryCrystal3.Name\n#: /Game/SO/Items/MemoryStone/MemoryCrystal3.MemoryCrystal3.Name\nmsgctxt \"ItemData\"\nmsgid \"Fading Colours\"\nmsgstr \"\"\n\n#. Key:\tMemoryCrystal4_desc\n#. SourceLocation:\t/Game/SO/Items/MemoryStone/MemoryCrystal4.MemoryCrystal4.Description\n#: /Game/SO/Items/MemoryStone/MemoryCrystal4.MemoryCrystal4.Description\nmsgctxt \"ItemData\"\nmsgid \"'Madness takes control over those who get too close to Ruin.'\\r\\n'Maintainers forgot to speak. I understand some of the phrases they try to say: \\\"Dinner is served\\\", \\\"At your service\\\", \\\"Your order\\\" - a mockery of their former intelligence!'\\r\\n\\r\\nThe Last Sane Golem Maker, A.C. 21. January 26.\"\nmsgstr \"\"\n\n#. Key:\tMemoryCrystal4_name\n#. SourceLocation:\t/Game/SO/Items/MemoryStone/MemoryCrystal4.MemoryCrystal4.Name\n#: /Game/SO/Items/MemoryStone/MemoryCrystal4.MemoryCrystal4.Name\nmsgctxt \"ItemData\"\nmsgid \"Madness\"\nmsgstr \"\"\n\n#. Key:\tMemoryCrystal5_desc\n#. SourceLocation:\t/Game/SO/Items/MemoryStone/MemoryCrystal5.MemoryCrystal5.Description\n#: /Game/SO/Items/MemoryStone/MemoryCrystal5.MemoryCrystal5.Description\nmsgctxt \"ItemData\"\nmsgid \"'Now I have seen it with my own eyes: the touch of the Ruin makes the World literally fall apart.'\\r\\n\\r\\nThe Last Sane Golem Maker, A.C. 25. September 4.\"\nmsgstr \"\"\n\n#. Key:\tMemoryCrystal5_name\n#. SourceLocation:\t/Game/SO/Items/MemoryStone/MemoryCrystal5.MemoryCrystal5.Name\n#: /Game/SO/Items/MemoryStone/MemoryCrystal5.MemoryCrystal5.Name\nmsgctxt \"ItemData\"\nmsgid \"Falling Apart\"\nmsgstr \"\"\n\n#. Key:\tMemoryCrystal6_desc\n#. SourceLocation:\t/Game/SO/Items/MemoryStone/MemoryCrystal6.MemoryCrystal6.Description\n#: /Game/SO/Items/MemoryStone/MemoryCrystal6.MemoryCrystal6.Description\nmsgctxt \"ItemData\"\nmsgid \"'This is my 87 birthday. It's obvious that my body doesn't get older with time. How long can I preserve my sanity?'\\r\\n'Drones can no longer be trusted. They resisted Ruin for the longest.'\\r\\n\\r\\nThe Last Sane Golem Maker, A.C. 52. July 9.\"\nmsgstr \"\"\n\n#. Key:\tMemoryCrystal6_name\n#. SourceLocation:\t/Game/SO/Items/MemoryStone/MemoryCrystal6.MemoryCrystal6.Name\n#: /Game/SO/Items/MemoryStone/MemoryCrystal6.MemoryCrystal6.Name\nmsgctxt \"ItemData\"\nmsgid \"Preservation of Ruin\"\nmsgstr \"\"\n\n#. Key:\tMemoryCrystal7_desc\n#. SourceLocation:\t/Game/SO/Items/MemoryStone/MemoryCrystal7.MemoryCrystal7.Description\n#: /Game/SO/Items/MemoryStone/MemoryCrystal7.MemoryCrystal7.Description\nmsgctxt \"ItemData\"\nmsgid \"'Ruin will soon reach Grey Gate, our very last city. I need to move deeper into the Realm, further away from Ruin.'\\r\\n'I decided to create some new golems. Golems that resist Ruin.'\\r\\n\\r\\nThe Last Sane Golem Maker, A.C. 315. April 8.\"\nmsgstr \"\"\n\n#. Key:\tMemoryCrystal7_name\n#. SourceLocation:\t/Game/SO/Items/MemoryStone/MemoryCrystal7.MemoryCrystal7.Name\n#: /Game/SO/Items/MemoryStone/MemoryCrystal7.MemoryCrystal7.Name\nmsgctxt \"ItemData\"\nmsgid \"New Hope\"\nmsgstr \"\"\n\n#. Key:\tMemoryCrystal8_desc\n#. SourceLocation:\t/Game/SO/Items/MemoryStone/MemoryCrystal8.MemoryCrystal8.Description\n#: /Game/SO/Items/MemoryStone/MemoryCrystal8.MemoryCrystal8.Description\nmsgctxt \"ItemData\"\nmsgid \"'I don't think I can keep up. There are times when I no longer know what I'm doing. I still have clear moments but they become more and more rare. I've recorded my memories to keep them safe.'\\r\\n\\r\\nThe Last Sane Golem Maker, about A.C. 500.\\r\\n\"\nmsgstr \"\"\n\n#. Key:\tMemoryCrystal8_name\n#. SourceLocation:\t/Game/SO/Items/MemoryStone/MemoryCrystal8.MemoryCrystal8.Name\n#: /Game/SO/Items/MemoryStone/MemoryCrystal8.MemoryCrystal8.Name\nmsgctxt \"ItemData\"\nmsgid \"Final Decision\"\nmsgstr \"\"\n\n#. Key:\tPergamen_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/Pergamen.Pergamen.Description\n#: /Game/SO/Items/QuestItems/Pergamen.Pergamen.Description\nmsgctxt \"ItemData\"\nmsgid \"'This chest and everything inside belongs to me, the Chef.'\"\nmsgstr \"\"\n\n#. Key:\tPergamen_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/Pergamen.Pergamen.Name\n#: /Game/SO/Items/QuestItems/Pergamen.Pergamen.Name\nmsgctxt \"ItemData\"\nmsgid \"Parchment\"\nmsgstr \"\"\n\n#. Key:\tPortalGem_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/PortalGem.PortalGem.Description\n#: /Game/SO/Items/QuestItems/PortalGem.PortalGem.Description\nmsgctxt \"ItemData\"\nmsgid \"There are so many stones around. You are still not sure what's the point of picking up some of them.\"\nmsgstr \"\"\n\n#. Key:\tPortalGem_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/PortalGem.PortalGem.Name\n#: /Game/SO/Items/QuestItems/PortalGem.PortalGem.Name\nmsgctxt \"ItemData\"\nmsgid \"Lock Gem\"\nmsgstr \"\"\n\n#. Key:\tPotionOfWorthiness_desc\n#. SourceLocation:\t/Game/SO/Items/Useable/PotionOfWorthiness.PotionOfWorthiness.Description\n#: /Game/SO/Items/Useable/PotionOfWorthiness.PotionOfWorthiness.Description\nmsgctxt \"ItemData\"\nmsgid \"This might not be the weirdest side effect one can have when drinking something suspicious but it is definitely in the top five.\"\nmsgstr \"\"\n\n#. Key:\tPotionOfWorthiness_name\n#. SourceLocation:\t/Game/SO/Items/Useable/PotionOfWorthiness.PotionOfWorthiness.Name\n#: /Game/SO/Items/Useable/PotionOfWorthiness.PotionOfWorthiness.Name\nmsgctxt \"ItemData\"\nmsgid \"Potion Of Worthiness\"\nmsgstr \"\"\n\n#. Key:\tPurpleMushroom_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/PurpleMushroom.PurpleMushroom.Description\n#: /Game/SO/Items/QuestItems/PurpleMushroom.PurpleMushroom.Description\nmsgctxt \"ItemData\"\nmsgid \"The most purple mushrooms you could find. You hope these will be enough.\"\nmsgstr \"\"\n\n#. Key:\tPurpleMushroom_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/PurpleMushroom.PurpleMushroom.Name\n#: /Game/SO/Items/QuestItems/PurpleMushroom.PurpleMushroom.Name\nmsgctxt \"ItemData\"\nmsgid \"Purple Mushrooms\"\nmsgstr \"\"\n\n#. Key:\tRavenFeather_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/RavenFeather.RavenFeather.Description\n#: /Game/SO/Items/QuestItems/RavenFeather.RavenFeather.Description\nmsgctxt \"ItemData\"\nmsgid \"A magical item which gives you the ability to fly... or something like that.\"\nmsgstr \"\"\n\n#. Key:\tRavenFeather_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/RavenFeather.RavenFeather.Name\n#: /Game/SO/Items/QuestItems/RavenFeather.RavenFeather.Name\nmsgctxt \"ItemData\"\nmsgid \"Raven Feather\"\nmsgstr \"\"\n\n#. Key:\tRope_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/Rope.Rope.Description\n#: /Game/SO/Items/QuestItems/Rope.Rope.Description\nmsgctxt \"ItemData\"\nmsgid \"You do wonder when the area is full of ropes why this is the only one which can be taken...\"\nmsgstr \"\"\n\n#. Key:\tRope_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/Rope.Rope.Name\n#: /Game/SO/Items/QuestItems/Rope.Rope.Name\nmsgctxt \"ItemData\"\nmsgid \"Rope\"\nmsgstr \"\"\n\n#. Key:\tRuneStoneBonusHPMagical_desc\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneBonusHPMagical.RuneStoneBonusHPMagical.Description\n#: /Game/SO/Items/RuneStones/RuneStoneBonusHPMagical.RuneStoneBonusHPMagical.Description\nmsgctxt \"ItemData\"\nmsgid \"Absorbs <Blue>30</> magical damage.\"\nmsgstr \"\"\n\n#. Key:\tRuneStoneBonusHPMagical_name\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneBonusHPMagical.RuneStoneBonusHPMagical.Name\n#: /Game/SO/Items/RuneStones/RuneStoneBonusHPMagical.RuneStoneBonusHPMagical.Name\nmsgctxt \"ItemData\"\nmsgid \"Bluestone\"\nmsgstr \"\"\n\n#. Key:\tRuneStoneBonusHPPhysical_desc\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneBonusHPPhysical.RuneStoneBonusHPPhysical.Description\n#: /Game/SO/Items/RuneStones/RuneStoneBonusHPPhysical.RuneStoneBonusHPPhysical.Description\nmsgctxt \"ItemData\"\nmsgid \"Absorbs <White>30</> physical damage.\"\nmsgstr \"\"\n\n#. Key:\tRuneStoneBonusHPPhysical_name\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneBonusHPPhysical.RuneStoneBonusHPPhysical.Name\n#: /Game/SO/Items/RuneStones/RuneStoneBonusHPPhysical.RuneStoneBonusHPPhysical.Name\nmsgctxt \"ItemData\"\nmsgid \"Graystone\"\nmsgstr \"\"\n\n#. Key:\tRuneStoneBounce_desc\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.Description\n#. Key:\tRuneStoneBounce_level_desc_0\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.LevelBasedDescOverride(0).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.Description\n#: /Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.LevelBasedDescOverride(0).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Provides the ability to bounce from enemies for <Green>8</> seconds. Doing so causes <Blue>12</> damage to the target.\"\nmsgstr \"\"\n\n#. Key:\tRuneStoneBounce_level_desc_1\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.LevelBasedDescOverride(1).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.LevelBasedDescOverride(1).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Provides the ability to bounce from enemies for <Green>16</> seconds. Doing so causes <Blue>18</> damage to the target.\"\nmsgstr \"\"\n\n#. Key:\tRuneStoneBounce_level_desc_2\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.LevelBasedDescOverride(2).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.LevelBasedDescOverride(2).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Provides the ability to bounce from enemies for <Green>16</> seconds. Doing so causes <Blue>18</> damage and applies <Yellow>Stun</> on the target.\"\nmsgstr \"\"\n\n#. Key:\tRuneStoneBounce_level_desc_3\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.LevelBasedDescOverride(3).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.LevelBasedDescOverride(3).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Provides the ability to bounce from enemies for <Green>16</> seconds. Doing so causes <Blue>24</> damage and applies <Yellow>Stun</> on the target.\"\nmsgstr \"\"\n\n#. Key:\tRuneStoneBounce_level_desc_4\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.LevelBasedDescOverride(4).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.LevelBasedDescOverride(4).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Provides the ability to bounce from enemies for <Green>16</> seconds. Doing so causes <Blue>30</> damage and applies <Yellow>Stun</> on the target.\"\nmsgstr \"\"\n\n#. Key:\tRuneStoneBounce_level_up_desc_0\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.LevelUpBasedDescOverride(0).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.LevelUpBasedDescOverride(0).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Provides the ability to bounce from enemies for <Green>8</><YellowH>(→16)</> seconds. Doing so causes <Blue>12</><YellowH>(→18)</> damage to the target.\"\nmsgstr \"\"\n\n#. Key:\tRuneStoneBounce_level_up_desc_1\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.LevelUpBasedDescOverride(1).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.LevelUpBasedDescOverride(1).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Provides the ability to bounce from enemies for <Green>16</> seconds. Doing so causes <Blue>18</> damage <YellowH>and applies Stun on the target.</>\"\nmsgstr \"\"\n\n#. Key:\tRuneStoneBounce_level_up_desc_2\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.LevelUpBasedDescOverride(2).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.LevelUpBasedDescOverride(2).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Provides the ability to bounce from enemies for <Green>16</> seconds. Doing so causes <Blue>18</><YellowH>(→24)</> damage and applies <Yellow>Stun</> on the target.\"\nmsgstr \"\"\n\n#. Key:\tRuneStoneBounce_level_up_desc_3\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.LevelUpBasedDescOverride(3).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.LevelUpBasedDescOverride(3).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Provides the ability to bounce from enemies for <Green>16</> seconds. Doing so causes <Blue>24</><YellowH>(→30)</> damage and applies <Yellow>Stun</> on the target.\"\nmsgstr \"\"\n\n#. Key:\tRuneStoneBounce_name\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.Name\n#: /Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.Name\nmsgctxt \"ItemData\"\nmsgid \"Bouncestone\"\nmsgstr \"\"\n\n#. Key:\tRuneStoneEnergy_desc\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneEnergy.RuneStoneEnergy.Description\n#: /Game/SO/Items/RuneStones/RuneStoneEnergy.RuneStoneEnergy.Description\nmsgctxt \"ItemData\"\nmsgid \"Strikes and spell cooldowns are decreased by 90% for 10 seconds.\"\nmsgstr \"\"\n\n#. Key:\tRuneStoneEnergy_name\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneEnergy.RuneStoneEnergy.Name\n#: /Game/SO/Items/RuneStones/RuneStoneEnergy.RuneStoneEnergy.Name\nmsgctxt \"ItemData\"\nmsgid \"Energystone\"\nmsgstr \"\"\n\n#. Key:\tRuneStoneFire0_desc\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneFire0.RuneStoneFire0.Description\n#. Key:\tRuneStoneFire0_level_desc_0\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneFire0.RuneStoneFire0.LevelBasedDescOverride(0).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneFire0.RuneStoneFire0.Description\n#: /Game/SO/Items/RuneStones/RuneStoneFire0.RuneStoneFire0.LevelBasedDescOverride(0).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons a powerful blast roasting anything in a straight line.\\nCauses <Blue>16</> damage.\"\nmsgstr \"\"\n\n#. Key:\tRuneStoneFire0_level_desc_1\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneFire0.RuneStoneFire0.LevelBasedDescOverride(1).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneFire0.RuneStoneFire0.LevelBasedDescOverride(1).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons a powerful blast roasting anything in a straight line.\\nCauses <Blue>32</> damage.\"\nmsgstr \"\"\n\n#. Key:\tRuneStoneFire0_level_desc_2\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneFire0.RuneStoneFire0.LevelBasedDescOverride(2).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneFire0.RuneStoneFire0.LevelBasedDescOverride(2).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons a powerful blast roasting anything in a straight line.\\nCauses <Blue>36</> damage. The spell has <Green>50%</> chance to <Purple>Instant Recharge.</>\"\nmsgstr \"\"\n\n#. Key:\tRuneStoneFire0_level_desc_3\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneFire0.RuneStoneFire0.LevelBasedDescOverride(3).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneFire0.RuneStoneFire0.LevelBasedDescOverride(3).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons a powerful blast roasting anything in a straight line.\\nCauses <Blue>52</> damage. The spell has <Green>50%</> chance to <Purple>Instant Recharge.</>\"\nmsgstr \"\"\n\n#. Key:\tRuneStoneFire0_level_up_desc_0\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneFire0.RuneStoneFire0.LevelUpBasedDescOverride(0).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneFire0.RuneStoneFire0.LevelUpBasedDescOverride(0).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons a powerful blast roasting anything in a straight line.\\nCauses <Blue>16</><YellowH>(→32)</> damage.\"\nmsgstr \"\"\n\n#. Key:\tRuneStoneFire0_level_up_desc_1\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneFire0.RuneStoneFire0.LevelUpBasedDescOverride(1).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneFire0.RuneStoneFire0.LevelUpBasedDescOverride(1).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons a powerful blast roasting anything in a straight line.\\nCauses <Blue>32</><YellowH>(→36)</> damage. <YellowH>The spell has </><GreenH>50%</> <YellowH>chance to </><PurpleH>Instant Recharge.</>\"\nmsgstr \"\"\n\n#. Key:\tRuneStoneFire0_level_up_desc_2\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneFire0.RuneStoneFire0.LevelUpBasedDescOverride(2).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneFire0.RuneStoneFire0.LevelUpBasedDescOverride(2).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons a powerful blast roasting anything in a straight line.\\nCauses <Blue>36</><YellowH>(→52)</> damage. The spell has <Green>50%</> chance to <Purple>Instant Recharge.</>\"\nmsgstr \"\"\n\n#. Key:\tRuneStoneFire0_name\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneFire0.RuneStoneFire0.Name\n#: /Game/SO/Items/RuneStones/RuneStoneFire0.RuneStoneFire0.Name\nmsgctxt \"ItemData\"\nmsgid \"Firestone\"\nmsgstr \"\"\n\n#. Key:\tRuneStoneHeal_desc\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneHeal.RuneStoneHeal.Description\n#: /Game/SO/Items/RuneStones/RuneStoneHeal.RuneStoneHeal.Description\nmsgctxt \"ItemData\"\nmsgid \"Restores <Green>30</> health points.\"\nmsgstr \"\"\n\n#. Key:\tRuneStoneHeal_name\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneHeal.RuneStoneHeal.Name\n#: /Game/SO/Items/RuneStones/RuneStoneHeal.RuneStoneHeal.Name\nmsgctxt \"ItemData\"\nmsgid \"Healstone\"\nmsgstr \"\"\n\n#. Key:\tRuneStoneLightningWalk_desc\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneLightningWalk.RuneStoneLightningWalk.Description\n#: /Game/SO/Items/RuneStones/RuneStoneLightningWalk.RuneStoneLightningWalk.Description\nmsgctxt \"ItemData\"\nmsgid \"Grants the shocking ability to walk through your enemies for <Green>2</> sec. The shock causes <Blue>10</> damage.\"\nmsgstr \"\"\n\n#. Key:\tRuneStoneLightningWalk_level_desc_0\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneLightningWalk.RuneStoneLightningWalk.LevelBasedDescOverride(0).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneLightningWalk.RuneStoneLightningWalk.LevelBasedDescOverride(0).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Grants the shocking ability to walk through your enemies for <Green>2</> sec. The shock causes <Blue>16</> damage.\"\nmsgstr \"\"\n\n#. Key:\tRuneStoneLightningWalk_level_desc_1\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneLightningWalk.RuneStoneLightningWalk.LevelBasedDescOverride(1).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneLightningWalk.RuneStoneLightningWalk.LevelBasedDescOverride(1).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Grants the shocking ability to walk through your enemies for <Green>3</> sec. The shock causes <Blue>28</> damage.\"\nmsgstr \"\"\n\n#. Key:\tRuneStoneLightningWalk_level_desc_2\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneLightningWalk.RuneStoneLightningWalk.LevelBasedDescOverride(2).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneLightningWalk.RuneStoneLightningWalk.LevelBasedDescOverride(2).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Grants the shocking ability to walk through your enemies for <Green>4</> sec. The shock causes <Blue>32</> damage and has a <Green>30%</> chance to <Yellow>stun</> the target.\"\nmsgstr \"\"\n\n#. Key:\tRuneStoneLightningWalk_level_desc_3\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneLightningWalk.RuneStoneLightningWalk.LevelBasedDescOverride(3).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneLightningWalk.RuneStoneLightningWalk.LevelBasedDescOverride(3).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Grants the shocking ability to walk through your enemies for <Green>4</> sec. The shock causes <Blue>32</> damage and has a <Green>40%</> chance to <Yellow>stun</> the target.\"\nmsgstr \"\"\n\n#. Key:\tRuneStoneLightningWalk_level_up_desc_0\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneLightningWalk.RuneStoneLightningWalk.LevelUpBasedDescOverride(0).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneLightningWalk.RuneStoneLightningWalk.LevelUpBasedDescOverride(0).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Grants the shocking ability to walk through your enemies for <Green>2</><YellowH>(→3)</> sec. The shock causes <Blue>16</> <YellowH>(→28)</>damage.\"\nmsgstr \"\"\n\n#. Key:\tRuneStoneLightningWalk_level_up_desc_1\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneLightningWalk.RuneStoneLightningWalk.LevelUpBasedDescOverride(1).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneLightningWalk.RuneStoneLightningWalk.LevelUpBasedDescOverride(1).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Grants the shocking ability to walk through your enemies for <Green>3</><YellowH>(→4)</> sec. The shock causes <Blue>28</> <YellowH>(→36)</>damage <YellowH>and has a </><GreenH>30%</> <YellowH>chance to stun the target.</>\"\nmsgstr \"\"\n\n#. Key:\tRuneStoneLightningWalk_level_up_desc_2\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneLightningWalk.RuneStoneLightningWalk.LevelUpBasedDescOverride(2).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneLightningWalk.RuneStoneLightningWalk.LevelUpBasedDescOverride(2).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Grants the shocking ability to walk through your enemies for <Green>4</> sec. The shock causes <Blue>32</> damage and has a <Green>30%</> <YellowH>(→40%)</> chance to <Yellow>stun</> the target.\"\nmsgstr \"\"\n\n#. Key:\tRuneStoneLightningWalk_name\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneLightningWalk.RuneStoneLightningWalk.Name\n#: /Game/SO/Items/RuneStones/RuneStoneLightningWalk.RuneStoneLightningWalk.Name\nmsgctxt \"ItemData\"\nmsgid \"Lightningstone\"\nmsgstr \"\"\n\n#. Key:\tRuneStoneMagicMissle_desc\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMagicMissle.RuneStoneMagicMissle.Description\n#: /Game/SO/Items/RuneStones/RuneStoneMagicMissle.RuneStoneMagicMissle.Description\nmsgctxt \"ItemData\"\nmsgid \"Summons a homing projectile targeted at a close foe - prefers flying targets.\"\nmsgstr \"\"\n\n#. Key:\tRuneStoneMagicMissle_level_desc_0\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMagicMissle.RuneStoneMagicMissle.LevelBasedDescOverride(0).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneMagicMissle.RuneStoneMagicMissle.LevelBasedDescOverride(0).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons <Green>1</> homing projectile targeted at a close foe - prefers flying targets. Causes <Blue>16</> damage on impact.\"\nmsgstr \"\"\n\n#. Key:\tRuneStoneMagicMissle_level_desc_1\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMagicMissle.RuneStoneMagicMissle.LevelBasedDescOverride(1).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneMagicMissle.RuneStoneMagicMissle.LevelBasedDescOverride(1).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons <Green>2</> homing projectile targeted at a close foe - prefers flying targets. Each projectile causes <Blue>16</> damage on impact.\"\nmsgstr \"\"\n\n#. Key:\tRuneStoneMagicMissle_level_desc_2\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMagicMissle.RuneStoneMagicMissle.LevelBasedDescOverride(2).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneMagicMissle.RuneStoneMagicMissle.LevelBasedDescOverride(2).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons <Green>3</> homing projectile targeted at a close foe - prefers flying targets. Each projectile causes <Blue>16</> damage and applies <Orange>Slow</> on impact.\"\nmsgstr \"\"\n\n#. Key:\tRuneStoneMagicMissle_level_desc_3\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMagicMissle.RuneStoneMagicMissle.LevelBasedDescOverride(3).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneMagicMissle.RuneStoneMagicMissle.LevelBasedDescOverride(3).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons <Green>4</> homing projectile targeted at a close foe - prefers flying targets. Each projectile causes <Blue>16</> damage and applies <Orange>Slow</> on impact.\"\nmsgstr \"\"\n\n#. Key:\tRuneStoneMagicMissle_level_up_desc_0\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMagicMissle.RuneStoneMagicMissle.LevelUpBasedDescOverride(0).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneMagicMissle.RuneStoneMagicMissle.LevelUpBasedDescOverride(0).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons <Green>1</><YellowH>(→2)</> homing projectile targeted at a close foe - prefers flying targets. Each projectile causes <Blue>16</> damage on impact.\"\nmsgstr \"\"\n\n#. Key:\tRuneStoneMagicMissle_level_up_desc_1\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMagicMissle.RuneStoneMagicMissle.LevelUpBasedDescOverride(1).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneMagicMissle.RuneStoneMagicMissle.LevelUpBasedDescOverride(1).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons <Green>2</><YellowH>(→3)</> homing projectile targeted at a close foe - prefers flying targets. Each projectile causes <Blue>16</> damage <YellowH>and applies</> <OrangeH>Slow</> on impact.\"\nmsgstr \"\"\n\n#. Key:\tRuneStoneMagicMissle_level_up_desc_2\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMagicMissle.RuneStoneMagicMissle.LevelUpBasedDescOverride(2).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneMagicMissle.RuneStoneMagicMissle.LevelUpBasedDescOverride(2).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons <Green>3</><YellowH>(→4)</> homing projectile targeted at a close foe - prefers flying targets. Each projectile causes <Blue>16</> damage and applies <Orange>Slow</> on impact.\"\nmsgstr \"\"\n\n#. Key:\tRuneStoneMagicMissle_name\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMagicMissle.RuneStoneMagicMissle.Name\n#: /Game/SO/Items/RuneStones/RuneStoneMagicMissle.RuneStoneMagicMissle.Name\nmsgctxt \"ItemData\"\nmsgid \"Tealstone\"\nmsgstr \"\"\n\n#. Key:\tRuneStoneMassMagicMissle_desc\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMassMagicMissle.RuneStoneMassMagicMissle.Description\n#. Key:\tRuneStoneMassMagicMissle_level_desc_0\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMassMagicMissle.RuneStoneMassMagicMissle.LevelBasedDescOverride(0).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneMassMagicMissle.RuneStoneMassMagicMissle.Description\n#: /Game/SO/Items/RuneStones/RuneStoneMassMagicMissle.RuneStoneMassMagicMissle.LevelBasedDescOverride(0).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons a homing projectile for each nearby enemy, causing <Blue>20</> damage on impact.\"\nmsgstr \"\"\n\n#. Key:\tRuneStoneMassMagicMissle_level_desc_1\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMassMagicMissle.RuneStoneMassMagicMissle.LevelBasedDescOverride(1).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneMassMagicMissle.RuneStoneMassMagicMissle.LevelBasedDescOverride(1).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons a homing projectile for each nearby enemy, causing <Blue>40</> damage on impact.\"\nmsgstr \"\"\n\n#. Key:\tRuneStoneMassMagicMissle_level_desc_2\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMassMagicMissle.RuneStoneMassMagicMissle.LevelBasedDescOverride(2).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneMassMagicMissle.RuneStoneMassMagicMissle.LevelBasedDescOverride(2).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons a homing projectile for each nearby enemy, causing <Blue>50</> damage on impact. The target has a <Green>30%</> chance to become <Orange>Slow</>.\"\nmsgstr \"\"\n\n#. Key:\tRuneStoneMassMagicMissle_level_up_desc_0\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMassMagicMissle.RuneStoneMassMagicMissle.LevelUpBasedDescOverride(0).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneMassMagicMissle.RuneStoneMassMagicMissle.LevelUpBasedDescOverride(0).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons a homing projectile for each nearby enemy, causing <Blue>20</><YellowH>(→40)</> damage on impact.\"\nmsgstr \"\"\n\n#. Key:\tRuneStoneMassMagicMissle_level_up_desc_1\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMassMagicMissle.RuneStoneMassMagicMissle.LevelUpBasedDescOverride(1).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneMassMagicMissle.RuneStoneMassMagicMissle.LevelUpBasedDescOverride(1).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons a homing projectile for each nearby enemy, causing <Blue>20</><YellowH>(→50)</> damage on impact. <YellowH>The target has a</> <GreenH>30%</> <YellowH>chance to become</> <Orange>Slow</>.\"\nmsgstr \"\"\n\n#. Key:\tRuneStoneMassMagicMissle_name\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMassMagicMissle.RuneStoneMassMagicMissle.Name\n#: /Game/SO/Items/RuneStones/RuneStoneMassMagicMissle.RuneStoneMassMagicMissle.Name\nmsgctxt \"ItemData\"\nmsgid \"Tealstone, but better\"\nmsgstr \"\"\n\n#. Key:\tRuneStoneMassSlow_desc\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMassSlow.RuneStoneMassSlow.Description\n#: /Game/SO/Items/RuneStones/RuneStoneMassSlow.RuneStoneMassSlow.Description\nmsgctxt \"ItemData\"\nmsgid \"Slows all enemy targets around the caster.\"\nmsgstr \"\"\n\n#. Key:\tRuneStoneMassSlow_level_desc_0\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMassSlow.RuneStoneMassSlow.LevelBasedDescOverride(0).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneMassSlow.RuneStoneMassSlow.LevelBasedDescOverride(0).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"All enemy target becomes <Orange>Slow</> for <Green>3</> seconds.\"\nmsgstr \"\"\n\n#. Key:\tRuneStoneMassSlow_name\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMassSlow.RuneStoneMassSlow.Name\n#: /Game/SO/Items/RuneStones/RuneStoneMassSlow.RuneStoneMassSlow.Name\nmsgctxt \"ItemData\"\nmsgid \"Slowstone\"\nmsgstr \"\"\n\n#. Key:\tRuneStoneMeteorShower_desc\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMeteorShower.RuneStoneMeteorShower.Description\n#: /Game/SO/Items/RuneStones/RuneStoneMeteorShower.RuneStoneMeteorShower.Description\nmsgctxt \"ItemData\"\nmsgid \"Summons 12 deadly meteors around the caster, each causing 16 damage on impact.\"\nmsgstr \"\"\n\n#. Key:\tRuneStoneMeteorShower_level_desc_0\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMeteorShower.RuneStoneMeteorShower.LevelBasedDescOverride(0).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneMeteorShower.RuneStoneMeteorShower.LevelBasedDescOverride(0).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons <Green>12</> deadly meteors around the caster, each causing <White>16</> damage on impact.\"\nmsgstr \"\"\n\n#. Key:\tRuneStoneMeteorShower_level_desc_1\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMeteorShower.RuneStoneMeteorShower.LevelBasedDescOverride(1).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneMeteorShower.RuneStoneMeteorShower.LevelBasedDescOverride(1).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons <Green>16</> deadly meteors around the caster, each causing <White>24</> damage on impact.\"\nmsgstr \"\"\n\n#. Key:\tRuneStoneMeteorShower_level_desc_2\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMeteorShower.RuneStoneMeteorShower.LevelBasedDescOverride(2).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneMeteorShower.RuneStoneMeteorShower.LevelBasedDescOverride(2).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons <Green>20</> deadly meteors around the caster, each causing <White>32</> damage on impact. Each meteor has a <Green>30%</> chance to <Yellow>Stun</> the target.\"\nmsgstr \"\"\n\n#. Key:\tRuneStoneMeteorShower_level_up_desc_0\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMeteorShower.RuneStoneMeteorShower.LevelUpBasedDescOverride(0).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneMeteorShower.RuneStoneMeteorShower.LevelUpBasedDescOverride(0).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons <Green>12</><YellowH>(→16)</> deadly meteors around the caster, each causing <White>16</><YellowH>(→24)</> damage on impact.\"\nmsgstr \"\"\n\n#. Key:\tRuneStoneMeteorShower_level_up_desc_1\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMeteorShower.RuneStoneMeteorShower.LevelUpBasedDescOverride(1).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneMeteorShower.RuneStoneMeteorShower.LevelUpBasedDescOverride(1).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons <Green>16</><YellowH>(→20)</> deadly meteors around the caster, each causing <White>24</><YellowH>(→32)</> damage on impact. <YellowH>Each meteor has a</> <GreenH>30%</> <YellowH>chance to Stun the target.</>\"\nmsgstr \"\"\n\n#. Key:\tRuneStoneMeteorShower_name\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMeteorShower.RuneStoneMeteorShower.Name\n#: /Game/SO/Items/RuneStones/RuneStoneMeteorShower.RuneStoneMeteorShower.Name\nmsgctxt \"ItemData\"\nmsgid \"Meteorstone\"\nmsgstr \"\"\n\n#. Key:\tRuneStoneShadowWalk_desc\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneShadowWalk.RuneStoneShadowWalk.Description\n#. Key:\tRuneStoneShadowWalk_level_desc_0\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneShadowWalk.RuneStoneShadowWalk.LevelBasedDescOverride(0).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneShadowWalk.RuneStoneShadowWalk.Description\n#: /Game/SO/Items/RuneStones/RuneStoneShadowWalk.RuneStoneShadowWalk.LevelBasedDescOverride(0).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Grants the ability to walk through your enemies for <Green>2</> seconds.\"\nmsgstr \"\"\n\n#. Key:\tRuneStoneShadowWalk_level_desc_1\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneShadowWalk.RuneStoneShadowWalk.LevelBasedDescOverride(1).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneShadowWalk.RuneStoneShadowWalk.LevelBasedDescOverride(1).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Grants the ability to walk through your enemies for <Green>4</> seconds.\"\nmsgstr \"\"\n\n#. Key:\tRuneStoneShadowWalk_level_desc_2\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneShadowWalk.RuneStoneShadowWalk.LevelBasedDescOverride(2).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneShadowWalk.RuneStoneShadowWalk.LevelBasedDescOverride(2).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Grants the ability to walk through your enemies for <Green>4</> seconds. Your magical resistance is increased by <Green>0.2.</>\"\nmsgstr \"\"\n\n#. Key:\tRuneStoneShadowWalk_level_desc_3\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneShadowWalk.RuneStoneShadowWalk.LevelBasedDescOverride(3).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneShadowWalk.RuneStoneShadowWalk.LevelBasedDescOverride(3).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Grants the ability to walk through your enemies for <Green>5</> seconds. Your magical resistance is increased by <Green>0.3.</>\"\nmsgstr \"\"\n\n#. Key:\tRuneStoneShadowWalk_level_up_desc_0\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneShadowWalk.RuneStoneShadowWalk.LevelUpBasedDescOverride(0).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneShadowWalk.RuneStoneShadowWalk.LevelUpBasedDescOverride(0).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Grants the ability to walk through your enemies for <Green>2</> <YellowH>(→4)</> seconds.\"\nmsgstr \"\"\n\n#. Key:\tRuneStoneShadowWalk_level_up_desc_1\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneShadowWalk.RuneStoneShadowWalk.LevelUpBasedDescOverride(1).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneShadowWalk.RuneStoneShadowWalk.LevelUpBasedDescOverride(1).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Grants the ability to walk through your enemies for <Green>4</> seconds. <YellowH>Your magical resistance is increased by</> <GreenH>0.2.</>\"\nmsgstr \"\"\n\n#. Key:\tRuneStoneShadowWalk_level_up_desc_2\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneShadowWalk.RuneStoneShadowWalk.LevelUpBasedDescOverride(2).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneShadowWalk.RuneStoneShadowWalk.LevelUpBasedDescOverride(2).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Grants the ability to walk through your enemies for <Green>4</> <YellowH>(→5)</> seconds. Your magical resistance is increased by <Green>0.2</> <YellowH>(→0.3).</>\"\nmsgstr \"\"\n\n#. Key:\tRuneStoneShadowWalk_name\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneShadowWalk.RuneStoneShadowWalk.Name\n#: /Game/SO/Items/RuneStones/RuneStoneShadowWalk.RuneStoneShadowWalk.Name\nmsgctxt \"ItemData\"\nmsgid \"Shadestone\"\nmsgstr \"\"\n\n#. Key:\tRuneStoneSoulkeeper_desc\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneSoulkeeper.RuneStoneSoulkeeper.Description\n#: /Game/SO/Items/RuneStones/RuneStoneSoulkeeper.RuneStoneSoulkeeper.Description\nmsgctxt \"ItemData\"\nmsgid \"Summons the Soulkeeper, a powerful spirit capable of gathering your essence should something bad happen to you.\\r\\n\\r\\nReleasing the spirit recharges the stone.\"\nmsgstr \"\"\n\n#. Key:\tRuneStoneSoulkeeper_name\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneSoulkeeper.RuneStoneSoulkeeper.Name\n#: /Game/SO/Items/RuneStones/RuneStoneSoulkeeper.RuneStoneSoulkeeper.Name\nmsgctxt \"ItemData\"\nmsgid \"Soulstone\"\nmsgstr \"\"\n\n#. Key:\tRuneStoneSoulkeeperInfinite_desc\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneSoulkeeperInfinite.RuneStoneSoulkeeperInfinite.Description\n#: /Game/SO/Items/RuneStones/RuneStoneSoulkeeperInfinite.RuneStoneSoulkeeperInfinite.Description\nmsgctxt \"ItemData\"\nmsgid \"Summons the Soulkeeper, a powerful spirit capable of gathering your essence should something bad happen to you.\"\nmsgstr \"\"\n\n#. Key:\tRuneStoneSoulkeeperInfinite_name\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneSoulkeeperInfinite.RuneStoneSoulkeeperInfinite.Name\n#: /Game/SO/Items/RuneStones/RuneStoneSoulkeeperInfinite.RuneStoneSoulkeeperInfinite.Name\nmsgctxt \"ItemData\"\nmsgid \"Elite Soulstone\"\nmsgstr \"\"\n\n#. Key:\tRuneStoneSpellRegain_desc\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneSpellRegain.RuneStoneSpellRegain.Description\n#: /Game/SO/Items/RuneStones/RuneStoneSpellRegain.RuneStoneSpellRegain.Description\nmsgctxt \"ItemData\"\nmsgid \"Regenerates all other spell charges.\"\nmsgstr \"\"\n\n#. Key:\tRuneStoneSpellRegain_name\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneSpellRegain.RuneStoneSpellRegain.Name\n#: /Game/SO/Items/RuneStones/RuneStoneSpellRegain.RuneStoneSpellRegain.Name\nmsgctxt \"ItemData\"\nmsgid \"Spiritstone\"\nmsgstr \"\"\n\n#. Key:\tRuneStoneSwap_desc\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.Description\n#. Key:\tRuneStoneSwap_level_desc_0\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.LevelBasedDescOverride(0).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.Description\n#: /Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.LevelBasedDescOverride(0).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Swaps the position of the caster with the closest target in front of him/her/it.\"\nmsgstr \"\"\n\n#. Key:\tRuneStoneSwap_level_desc_1\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.LevelBasedDescOverride(1).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.LevelBasedDescOverride(1).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Swaps the position of the caster with the closest target in front of him/her/it. The selected target suffers <Blue>20</> damage.\"\nmsgstr \"\"\n\n#. Key:\tRuneStoneSwap_level_desc_2\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.LevelBasedDescOverride(2).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.LevelBasedDescOverride(2).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Swaps the position of the caster with the closest target in front of him/her/it. The selected target suffers <Blue>30</> damage and becomes <Orange>Slow</>.\"\nmsgstr \"\"\n\n#. Key:\tRuneStoneSwap_level_desc_3\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.LevelBasedDescOverride(3).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.LevelBasedDescOverride(3).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Swaps the position of the caster with the closest target in front of him/her/it. The selected target suffers <Blue>40</> damage and becomes <Orange>Slow</>.\"\nmsgstr \"\"\n\n#. Key:\tRuneStoneSwap_level_desc_4\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.LevelBasedDescOverride(4).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.LevelBasedDescOverride(4).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Swaps the position of the caster with the closest target in front of him/her/it. The selected target suffers <Blue>50</> damage and becomes <Orange>Slow</>.\"\nmsgstr \"\"\n\n#. Key:\tRuneStoneSwap_level_up_desc_0\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.LevelUpBasedDescOverride(0).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.LevelUpBasedDescOverride(0).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Swaps the position of the caster with the closest target in front of him/her/it. <YellowH>The selected target suffers</> <BlueH>20</> <YellowH>damage.</>\"\nmsgstr \"\"\n\n#. Key:\tRuneStoneSwap_level_up_desc_1\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.LevelUpBasedDescOverride(1).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.LevelUpBasedDescOverride(1).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Swaps the position of the caster with the closest target in front of him/her/it. The selected target suffers <Blue>20</><YellowH>(→30)</> damage <YellowH>and becomes </><Orange>Slow.</>\"\nmsgstr \"\"\n\n#. Key:\tRuneStoneSwap_level_up_desc_2\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.LevelUpBasedDescOverride(2).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.LevelUpBasedDescOverride(2).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Swaps the position of the caster with the closest target in front of him/her/it. The selected target suffers <Blue>30</><YellowH>(→40)</> damage and becomes <Orange>Slow.</>\"\nmsgstr \"\"\n\n#. Key:\tRuneStoneSwap_level_up_desc_3\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.LevelUpBasedDescOverride(3).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.LevelUpBasedDescOverride(3).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Swaps the position of the caster with the closest target in front of him/her/it. The selected target suffers <Blue>40</><YellowH>(→50)</> damage and becomes <Orange>Slow.</>\"\nmsgstr \"\"\n\n#. Key:\tRuneStoneSwap_name\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.Name\n#: /Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.Name\nmsgctxt \"ItemData\"\nmsgid \"Swapstone\"\nmsgstr \"\"\n\n#. Key:\tRuneStoneWeaponFlame_desc\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.Description\n#: /Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.Description\nmsgctxt \"ItemData\"\nmsgid \"Enchants your active weapon with green flames - it causes an additional 0.3x damage for 4 seconds.\"\nmsgstr \"\"\n\n#. Key:\tRuneStoneWeaponFlame_level_desc_0\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.LevelBasedDescOverride(0).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.LevelBasedDescOverride(0).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Enchants your active weapon - it causes an additional <Green>0.5x</> damage for <Green>5</> seconds.\"\nmsgstr \"\"\n\n#. Key:\tRuneStoneWeaponFlame_level_desc_1\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.LevelBasedDescOverride(1).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.LevelBasedDescOverride(1).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Enchants your active weapon - it causes an additional <Green>0.6x</> damage for <Green>5</> seconds. Each strike has a <Green>15%</> chance to apply <DarkGreen>Poison</>, causing an additional <Blue>18</> damage over <Green>6</> seconds.\"\nmsgstr \"\"\n\n#. Key:\tRuneStoneWeaponFlame_level_desc_2\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.LevelBasedDescOverride(2).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.LevelBasedDescOverride(2).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Enchants your active weapon - it causes an additional <Green>0.7x</> damage for <Green>6</> seconds. Each strike has a <Green>20%</> chance to apply <DarkGreen>Poison</>, causing an additional <Blue>24</> damage over <Green>6</> seconds.\"\nmsgstr \"\"\n\n#. Key:\tRuneStoneWeaponFlame_level_desc_3\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.LevelBasedDescOverride(3).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.LevelBasedDescOverride(3).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Enchants your active weapon - it causes an additional <Green>0.8x</> damage for <Green>6</> seconds. Each strike has a <Green>25%</> chance to apply <DarkGreen>Poison</>, causing an additional <Blue>30</> damage over <Green>6</> seconds.\"\nmsgstr \"\"\n\n#. Key:\tRuneStoneWeaponFlame_level_desc_4\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.LevelBasedDescOverride(4).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.LevelBasedDescOverride(4).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Enchants your active weapon - it causes an additional <Green>0.9x</> damage for <Green>6</> seconds. Each strike has a <Green>30%</> chance to apply <DarkGreen>Poison</>, causing an additional <Blue>36</> damage over <Green>6</> seconds.\"\nmsgstr \"\"\n\n#. Key:\tRuneStoneWeaponFlame_level_up_desc_0\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.LevelUpBasedDescOverride(0).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.LevelUpBasedDescOverride(0).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Enchants your active weapon - it causes an additional <Green>0.5x</><YellowH>(→0.6x)</> damage for <Green>5</> seconds. <YellowH>Each strike has a</> <GreenH>15%</> <YellowH>chance to apply </><DarkGreenH>Poison</><YellowH>, causing an additional</> <BlueH>18</> <YellowH>damage over</> <GreenH>6</> <YellowH>seconds.</>\"\nmsgstr \"\"\n\n#. Key:\tRuneStoneWeaponFlame_level_up_desc_1\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.LevelUpBasedDescOverride(1).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.LevelUpBasedDescOverride(1).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Enchants your active weapon - it causes an additional <Green>0.6x</><YellowH>(→0.7x)</> damage for <Green>5</><YellowH>(→6)</> seconds. Each strike has a <Green>15%</><YellowH>(→20%)</> chance to apply <DarkGreen>Poison</>, causing an additional <Blue>18</><YellowH>(→24)</> damage over <Green>6</> seconds.\"\nmsgstr \"\"\n\n#. Key:\tRuneStoneWeaponFlame_level_up_desc_2\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.LevelUpBasedDescOverride(2).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.LevelUpBasedDescOverride(2).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Enchants your active weapon - it causes an additional <Green>0.7x</><YellowH>(→0.8x)</> damage for <Green>6</> seconds. Each strike has a <Green>20%</><YellowH>(→25%)</> chance to apply <DarkGreen>Poison</>, causing an additional <Blue>24</><YellowH>(→30)</> damage over <Green>6</> seconds.\"\nmsgstr \"\"\n\n#. Key:\tRuneStoneWeaponFlame_level_up_desc_3\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.LevelUpBasedDescOverride(3).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.LevelUpBasedDescOverride(3).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Enchants your active weapon - it causes an additional <Green>0.8x</><YellowH>(→0.9x)</> damage for <Green>6</> seconds. Each strike has a <Green>25%</><YellowH>(→30%)</> chance to apply <DarkGreen>Poison</>, causing an additional <Blue>30</><YellowH>(→36)</> damage over <Green>6</> seconds.\"\nmsgstr \"\"\n\n#. Key:\tRuneStoneWeaponFlame_name\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.Name\n#: /Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.Name\nmsgctxt \"ItemData\"\nmsgid \"Green Flamestone\"\nmsgstr \"\"\n\n#. Key:\tSabre_desc\n#. SourceLocation:\t/Game/SO/Items/Weapons/Sabre.Sabre.Description\n#: /Game/SO/Items/Weapons/Sabre.Sabre.Description\nmsgctxt \"ItemData\"\nmsgid \"Rangol was a legendary blacksmith who practiced his crafting art for a hundred years. This sabre was made on day one.\"\nmsgstr \"\"\n\n#. Key:\tSabre_name\n#. SourceLocation:\t/Game/SO/Items/Weapons/Sabre.Sabre.Name\n#: /Game/SO/Items/Weapons/Sabre.Sabre.Name\nmsgctxt \"ItemData\"\nmsgid \"First Sabre of Rangol\"\nmsgstr \"\"\n\n#. Key:\tSecondChance_desc\n#. SourceLocation:\t/Game/SO/Items/RuneStones/SecondChance.SecondChance.Description\n#: /Game/SO/Items/RuneStones/SecondChance.SecondChance.Description\nmsgctxt \"ItemData\"\nmsgid \"Prevents death.\"\nmsgstr \"\"\n\n#. Key:\tSecondChance_name\n#. SourceLocation:\t/Game/SO/Items/RuneStones/SecondChance.SecondChance.Name\n#: /Game/SO/Items/RuneStones/SecondChance.SecondChance.Name\nmsgctxt \"ItemData\"\nmsgid \"Chancestone\"\nmsgstr \"\"\n\n#. Key:\tSecretWeirdDevice_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/SecretWeirdDevice.SecretWeirdDevice.Description\n#: /Game/SO/Items/QuestItems/SecretWeirdDevice.SecretWeirdDevice.Description\nmsgctxt \"ItemData\"\nmsgid \"A weird device, most likely one of the inventions of the Secret Science Society.\"\nmsgstr \"\"\n\n#. Key:\tSecretWeirdDevice_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/SecretWeirdDevice.SecretWeirdDevice.Name\n#: /Game/SO/Items/QuestItems/SecretWeirdDevice.SecretWeirdDevice.Name\nmsgctxt \"ItemData\"\nmsgid \"Weird Device\"\nmsgstr \"\"\n\n#. Key:\tShardAmber_desc\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardAmber.ShardAmber.Description\n#: /Game/SO/Items/Shards/ShardAmber.ShardAmber.Description\nmsgctxt \"ItemData\"\nmsgid \"Each melee strike has an additional <Yellow>10%</> chance to cause a critical hit, causing <Green>200%</> of your normal weapon damage.\"\nmsgstr \"\"\n\n#. Key:\tShardAmber_name\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardAmber.ShardAmber.Name\n#: /Game/SO/Items/Shards/ShardAmber.ShardAmber.Name\nmsgctxt \"ItemData\"\nmsgid \"Amber Shard\"\nmsgstr \"\"\n\n#. Key:\tShardAmberBright_desc\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardAmberBright.ShardAmberBright.Description\n#: /Game/SO/Items/Shards/ShardAmberBright.ShardAmberBright.Description\nmsgctxt \"ItemData\"\nmsgid \"Each melee strike has an additional <Yellow>20%</> chance to cause a critical hit, causing <Green>200%</> of your normal weapon damage.\"\nmsgstr \"\"\n\n#. Key:\tShardAmberBright_name\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardAmberBright.ShardAmberBright.Name\n#: /Game/SO/Items/Shards/ShardAmberBright.ShardAmberBright.Name\nmsgctxt \"ItemData\"\nmsgid \"Bright Amber Shard\"\nmsgstr \"\"\n\n#. Key:\tShardAqua_desc\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardAqua.ShardAqua.Description\n#: /Game/SO/Items/Shards/ShardAqua.ShardAqua.Description\nmsgctxt \"ItemData\"\nmsgid \"Cooldown recharge speed is increased by <Blue>20%</>.\"\nmsgstr \"\"\n\n#. Key:\tShardAqua_name\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardAqua.ShardAqua.Name\n#: /Game/SO/Items/Shards/ShardAqua.ShardAqua.Name\nmsgctxt \"ItemData\"\nmsgid \"Aqua Shard\"\nmsgstr \"\"\n\n#. Key:\tShardAquaBright_desc\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardAquaBright.ShardAquaBright.Description\n#: /Game/SO/Items/Shards/ShardAquaBright.ShardAquaBright.Description\nmsgctxt \"ItemData\"\nmsgid \"Cooldown recharge speed is increased by <Blue>40%</>.\"\nmsgstr \"\"\n\n#. Key:\tShardAquaBright_name\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardAquaBright.ShardAquaBright.Name\n#: /Game/SO/Items/Shards/ShardAquaBright.ShardAquaBright.Name\nmsgctxt \"ItemData\"\nmsgid \"Bright Aqua Shard\"\nmsgstr \"\"\n\n#. Key:\tShardBlack_desc\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardBlack.ShardBlack.Description\n#: /Game/SO/Items/Shards/ShardBlack.ShardBlack.Description\nmsgctxt \"ItemData\"\nmsgid \"Every time an enemy hits you with a melee strike or overlaps you it is turned into a boot for a short time.\"\nmsgstr \"\"\n\n#. Key:\tShardBlack_name\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardBlack.ShardBlack.Name\n#: /Game/SO/Items/Shards/ShardBlack.ShardBlack.Name\nmsgctxt \"ItemData\"\nmsgid \"Black Shard\"\nmsgstr \"\"\n\n#. Key:\tShardBlue_desc\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardBlue.ShardBlue.Description\n#: /Game/SO/Items/Shards/ShardBlue.ShardBlue.Description\nmsgctxt \"ItemData\"\nmsgid \"Decreases the incoming <Blue>Magical Damage</> by <Blue>20%.</>\"\nmsgstr \"\"\n\n#. Key:\tShardBlue_name\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardBlue.ShardBlue.Name\n#: /Game/SO/Items/Shards/ShardBlue.ShardBlue.Name\nmsgctxt \"ItemData\"\nmsgid \"Blue Shard\"\nmsgstr \"\"\n\n#. Key:\tShardBlueBright_desc\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardBlueBright.ShardBlueBright.Description\n#: /Game/SO/Items/Shards/ShardBlueBright.ShardBlueBright.Description\nmsgctxt \"ItemData\"\nmsgid \"Decreases the incoming <Blue>Magical Damage</> by <Blue>30%.</>\"\nmsgstr \"\"\n\n#. Key:\tShardBlueBright_name\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardBlueBright.ShardBlueBright.Name\n#: /Game/SO/Items/Shards/ShardBlueBright.ShardBlueBright.Name\nmsgctxt \"ItemData\"\nmsgid \"Bright Blue Shard\"\nmsgstr \"\"\n\n#. Key:\tShardGreen_desc\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardGreen.ShardGreen.Description\n#: /Game/SO/Items/Shards/ShardGreen.ShardGreen.Description\nmsgctxt \"ItemData\"\nmsgid \"Increases the attack speed by <Green>20%</>\"\nmsgstr \"\"\n\n#. Key:\tShardGreen_name\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardGreen.ShardGreen.Name\n#: /Game/SO/Items/Shards/ShardGreen.ShardGreen.Name\nmsgctxt \"ItemData\"\nmsgid \"Green Shard\"\nmsgstr \"\"\n\n#. Key:\tShardGreenBright_desc\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardGreenBright.ShardGreenBright.Description\n#: /Game/SO/Items/Shards/ShardGreenBright.ShardGreenBright.Description\nmsgctxt \"ItemData\"\nmsgid \"Increases the attack speed by <Green>30%</>\"\nmsgstr \"\"\n\n#. Key:\tShardGreenBright_name\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardGreenBright.ShardGreenBright.Name\n#: /Game/SO/Items/Shards/ShardGreenBright.ShardGreenBright.Name\nmsgctxt \"ItemData\"\nmsgid \"Bright Green Shard\"\nmsgstr \"\"\n\n#. Key:\tShardPurple_desc\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardPurple.ShardPurple.Description\n#: /Game/SO/Items/Shards/ShardPurple.ShardPurple.Description\nmsgctxt \"ItemData\"\nmsgid \"Each time you cast a charge based spell you have a <Purple>25%</> chance to regain the charge.\"\nmsgstr \"\"\n\n#. Key:\tShardPurple_name\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardPurple.ShardPurple.Name\n#: /Game/SO/Items/Shards/ShardPurple.ShardPurple.Name\nmsgctxt \"ItemData\"\nmsgid \"Purple Shard\"\nmsgstr \"\"\n\n#. Key:\tShardPurpleBright_desc\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardPurpleBright.ShardPurpleBright.Description\n#: /Game/SO/Items/Shards/ShardPurpleBright.ShardPurpleBright.Description\nmsgctxt \"ItemData\"\nmsgid \"Each time you cast a charge based spell you have a <Purple>50%</> chance to regain the charge.\"\nmsgstr \"\"\n\n#. Key:\tShardPurpleBright_name\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardPurpleBright.ShardPurpleBright.Name\n#: /Game/SO/Items/Shards/ShardPurpleBright.ShardPurpleBright.Name\nmsgctxt \"ItemData\"\nmsgid \"Bright Purple Shard\"\nmsgstr \"\"\n\n#. Key:\tShardRed_desc\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardRed.ShardRed.Description\n#: /Game/SO/Items/Shards/ShardRed.ShardRed.Description\nmsgctxt \"ItemData\"\nmsgid \"You heal <Red>5%</> of the melee damage you inflict on your enemies.\"\nmsgstr \"\"\n\n#. Key:\tShardRed_name\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardRed.ShardRed.Name\n#: /Game/SO/Items/Shards/ShardRed.ShardRed.Name\nmsgctxt \"ItemData\"\nmsgid \"Red Shard\"\nmsgstr \"\"\n\n#. Key:\tShardRedBright_desc\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardRedBright.ShardRedBright.Description\n#: /Game/SO/Items/Shards/ShardRedBright.ShardRedBright.Description\nmsgctxt \"ItemData\"\nmsgid \"You heal <Red>10%</> of the melee damage you inflict on your enemies.\"\nmsgstr \"\"\n\n#. Key:\tShardRedBright_name\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardRedBright.ShardRedBright.Name\n#: /Game/SO/Items/Shards/ShardRedBright.ShardRedBright.Name\nmsgctxt \"ItemData\"\nmsgid \"Bright Red Shard\"\nmsgstr \"\"\n\n#. Key:\tShardSilver_desc\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardSilver.ShardSilver.Description\n#: /Game/SO/Items/Shards/ShardSilver.ShardSilver.Description\nmsgctxt \"ItemData\"\nmsgid \"Decreases the incoming <White>Physical Damage</> by <White>20%.</>\"\nmsgstr \"\"\n\n#. Key:\tShardSilver_name\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardSilver.ShardSilver.Name\n#: /Game/SO/Items/Shards/ShardSilver.ShardSilver.Name\nmsgctxt \"ItemData\"\nmsgid \"Silver Shard\"\nmsgstr \"\"\n\n#. Key:\tShardSilverBright_desc\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardSilverBright.ShardSilverBright.Description\n#: /Game/SO/Items/Shards/ShardSilverBright.ShardSilverBright.Description\nmsgctxt \"ItemData\"\nmsgid \"Decreases the incoming <White>Physical Damage</> by <White>30%.</>\"\nmsgstr \"\"\n\n#. Key:\tShardSilverBright_name\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardSilverBright.ShardSilverBright.Name\n#: /Game/SO/Items/Shards/ShardSilverBright.ShardSilverBright.Name\nmsgctxt \"ItemData\"\nmsgid \"Bright Silver Shard\"\nmsgstr \"\"\n\n#. Key:\tShardTeal_desc\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardTeal.ShardTeal.Description\n#: /Game/SO/Items/Shards/ShardTeal.ShardTeal.Description\nmsgctxt \"ItemData\"\nmsgid \"Each time an enemy hits you with a melee strike it suffers the same damage.\"\nmsgstr \"\"\n\n#. Key:\tShardTeal_name\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardTeal.ShardTeal.Name\n#: /Game/SO/Items/Shards/ShardTeal.ShardTeal.Name\nmsgctxt \"ItemData\"\nmsgid \"Teal Shard\"\nmsgstr \"\"\n\n#. Key:\tShardTealBright_desc\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardTealBright.ShardTealBright.Description\n#: /Game/SO/Items/Shards/ShardTealBright.ShardTealBright.Description\nmsgctxt \"ItemData\"\nmsgid \"Each time an enemy hits you, it suffers <Green>200%</> of the damage.\"\nmsgstr \"\"\n\n#. Key:\tShardTealBright_name\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardTealBright.ShardTealBright.Name\n#: /Game/SO/Items/Shards/ShardTealBright.ShardTealBright.Name\nmsgctxt \"ItemData\"\nmsgid \"Bright Teal Shard\"\nmsgstr \"\"\n\n#. Key:\tShardWhite_desc\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardWhite.ShardWhite.Description\n#: /Game/SO/Items/Shards/ShardWhite.ShardWhite.Description\nmsgctxt \"ItemData\"\nmsgid \"Increases your damage by <Green>20%</>\"\nmsgstr \"\"\n\n#. Key:\tShardWhite_name\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardWhite.ShardWhite.Name\n#: /Game/SO/Items/Shards/ShardWhite.ShardWhite.Name\nmsgctxt \"ItemData\"\nmsgid \"White Shard\"\nmsgstr \"\"\n\n#. Key:\tShardWhiteBright_desc\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardWhiteBright.ShardWhiteBright.Description\n#: /Game/SO/Items/Shards/ShardWhiteBright.ShardWhiteBright.Description\nmsgctxt \"ItemData\"\nmsgid \"Increases your damage by <Green>30%</>.\"\nmsgstr \"\"\n\n#. Key:\tShardWhiteBright_name\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardWhiteBright.ShardWhiteBright.Name\n#: /Game/SO/Items/Shards/ShardWhiteBright.ShardWhiteBright.Name\nmsgctxt \"ItemData\"\nmsgid \"Bright White Shard\"\nmsgstr \"\"\n\n#. Key:\tShardYellow_desc\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardYellow.ShardYellow.Description\n#: /Game/SO/Items/Shards/ShardYellow.ShardYellow.Description\nmsgctxt \"ItemData\"\nmsgid \"Each melee strike has a <Yellow>10%</> chance to <Yellow>Stun</> the target.\"\nmsgstr \"\"\n\n#. Key:\tShardYellow_name\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardYellow.ShardYellow.Name\n#: /Game/SO/Items/Shards/ShardYellow.ShardYellow.Name\nmsgctxt \"ItemData\"\nmsgid \"Yellow Shard\"\nmsgstr \"\"\n\n#. Key:\tShardYellowBright_desc\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardYellowBright.ShardYellowBright.Description\n#: /Game/SO/Items/Shards/ShardYellowBright.ShardYellowBright.Description\nmsgctxt \"ItemData\"\nmsgid \"Each melee strike has a <Yellow>20%</> chance to <Yellow>Stun</> the target.\"\nmsgstr \"\"\n\n#. Key:\tShardYellowBright_name\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardYellowBright.ShardYellowBright.Name\n#: /Game/SO/Items/Shards/ShardYellowBright.ShardYellowBright.Name\nmsgctxt \"ItemData\"\nmsgid \"Bright Yellow Shard\"\nmsgstr \"\"\n\n#. Key:\tSpellCaster_desc\n#. SourceLocation:\t/Game/SO/Items/Useable/SpellCaster.SpellCaster.Description\n#: /Game/SO/Items/Useable/SpellCaster.SpellCaster.Description\nmsgctxt \"ItemData\"\nmsgid \"A magical artefact with the following worn text engraved on the back:\\r\\n\\r\\nInsert Runestones to ... spells\\r\\nKeep .... .... children\\r\\nMade in .....\"\nmsgstr \"\"\n\n#. Key:\tSpellCaster_name\n#. SourceLocation:\t/Game/SO/Items/Useable/SpellCaster.SpellCaster.Name\n#: /Game/SO/Items/Useable/SpellCaster.SpellCaster.Name\nmsgctxt \"ItemData\"\nmsgid \"Spellcaster\"\nmsgstr \"\"\n\n#. Key:\tStraightSword_desc\n#. SourceLocation:\t/Game/SO/Items/Weapons/StraightSword.StraightSword.Description\n#: /Game/SO/Items/Weapons/StraightSword.StraightSword.Description\nmsgctxt \"ItemData\"\nmsgid \"A simple yet effective weapon. Not too rusty, not too sharp. If someone looks close enough it looks a bit low budget, but the ones looking close enough won't talk about anything anymore, will they?\"\nmsgstr \"\"\n\n#. Key:\tStraightSword_name\n#. SourceLocation:\t/Game/SO/Items/Weapons/StraightSword.StraightSword.Name\n#: /Game/SO/Items/Weapons/StraightSword.StraightSword.Name\nmsgctxt \"ItemData\"\nmsgid \"Straight Sword\"\nmsgstr \"\"\n\n#. Key:\tTestStoneBag_desc\n#. SourceLocation:\t/Game/SO/Items/Useable/TestStoneBag.TestStoneBag.Description\n#: /Game/SO/Items/Useable/TestStoneBag.TestStoneBag.Description\nmsgctxt \"ItemData\"\nmsgid \"When you are the one in the team who has the job to enter every dungeon first, you will become a careful one too... if you live long enough for that.\"\nmsgstr \"\"\n\n#. Key:\tTestStoneBag_name\n#. SourceLocation:\t/Game/SO/Items/Useable/TestStoneBag.TestStoneBag.Name\n#: /Game/SO/Items/Useable/TestStoneBag.TestStoneBag.Name\nmsgctxt \"ItemData\"\nmsgid \"Bag of the Careful One\"\nmsgstr \"\"\n\n#. Key:\tWheel_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/Wheel.Wheel.Description\n#: /Game/SO/Items/QuestItems/Wheel.Wheel.Description\nmsgctxt \"ItemData\"\nmsgid \"One of the first greatest inventions of humans. Because they envied balls for their rolling skill.\"\nmsgstr \"\"\n\n#. Key:\tWheel_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/Wheel.Wheel.Name\n#: /Game/SO/Items/QuestItems/Wheel.Wheel.Name\nmsgctxt \"ItemData\"\nmsgid \"Wheel\"\nmsgstr \"\"\n\n#. Key:\tWWBossShipLock_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/WWBossShipLock.WWBossShipLock.Description\n#: /Game/SO/Items/Keys/WWBossShipLock.WWBossShipLock.Description\nmsgctxt \"ItemData\"\nmsgid \"Rusty key of a rusty lock.\"\nmsgstr \"\"\n\n#. Key:\tWWBossShipLock_name\n#. SourceLocation:\t/Game/SO/Items/Keys/WWBossShipLock.WWBossShipLock.Name\n#: /Game/SO/Items/Keys/WWBossShipLock.WWBossShipLock.Name\nmsgctxt \"ItemData\"\nmsgid \"Rusty Key\"\nmsgstr \"\"\n\n#. Key:\t0BFD568E4989A20D66B91DA476C0E6B4\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_6.Text\n#: /Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_6.Text\nmsgctxt \"Notes\"\nmsgid \"I promised Fountain to give its flower to the Magic Mirror.\"\nmsgstr \"\"\n\n#. Key:\t1ABD11A64A7649801A6AB6A8BBDC686C\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_9.Text\n#: /Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_9.Text\nmsgctxt \"Notes\"\nmsgid \"The Ghost Dwarf needs a ghost abacus\"\nmsgstr \"\"\n\n#. Key:\t57CBE1274A1B4EC7FD68EA9288161AAD\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_7.Text\n#: /Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_7.Text\nmsgctxt \"Notes\"\nmsgid \"The Chef wants me to clear the shore\"\nmsgstr \"\"\n\n#. Key:\t77693D6C43702786250364932BD34BCD\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note.Text\n#: /Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note.Text\nmsgctxt \"Notes\"\nmsgid \"The GateKeeper could use a chair\"\nmsgstr \"\"\n\n#. Key:\t9C3FB78C4598A48BC187B580CBB070F6\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_8.Text\n#: /Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_8.Text\nmsgctxt \"Notes\"\nmsgid \"The Dwarf wants me to clear the Dwarven Fortress\"\nmsgstr \"\"\n\n#. Key:\tAA94EB6E4B0A505D730971932A3DE0CC\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_5.Text\n#: /Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_5.Text\nmsgctxt \"Notes\"\nmsgid \"The Golem Maker wants me to hunt some Golems\"\nmsgstr \"\"\n\n#. Key:\tAE371E564EC1D75947ECF98AAA896A2C\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_11.Text\n#: /Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_11.Text\nmsgctxt \"Notes\"\nmsgid \"A Pipe Walker is trapped in a cage\"\nmsgstr \"\"\n\n#. Key:\tB12481ED4CFF0182EDB7ACAA416B55FC\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_4.Text\n#: /Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_4.Text\nmsgctxt \"Notes\"\nmsgid \"Gnory needs a wheel\"\nmsgstr \"\"\n\n#. Key:\tD3B6D81E433CBE8461E2B1AFE06E9741\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_13.Text\n#: /Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_13.Text\nmsgctxt \"Notes\"\nmsgid \"The Chef asked me to bring him some Purple Mushroom\"\nmsgstr \"\"\n\n#. Key:\tD8C4FFC7435C6A2E7C88BBA7109A1907\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_12.Text\n#: /Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_12.Text\nmsgctxt \"Notes\"\nmsgid \"I need to learn Dwarven to open a gate\"\nmsgstr \"\"\n\n#. Key:\tE3857F07468C2A0B34A98887E3BBB1DA\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_10.Text\n#: /Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_10.Text\nmsgctxt \"Notes\"\nmsgid \"I feel the Tomb of Tabby is important somehow\"\nmsgstr \"\"\n\n#. Key:\tE9DA40684B9375A5F78D18A138C75174\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_2.Text\n#: /Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_2.Text\nmsgctxt \"Notes\"\nmsgid \"Teachy asked for a strangely unique device\"\nmsgstr \"\"\n\n#. Key:\tF109A1614B16565CC1846C8D0A46672E\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_1.Text\n#: /Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_1.Text\nmsgctxt \"Notes\"\nmsgid \"I promised Lory to bring her some books\"\nmsgstr \"\"\n\n#. Key:\taway\n#. SourceLocation:\tSource/SOrb/UI/InGame/SoUIStationPanel.cpp:98\n#: Source/SOrb/UI/InGame/SoUIStationPanel.cpp:98\nmsgctxt \"StationNames\"\nmsgid \"World's End\"\nmsgstr \"\"\n\n#. Key:\tcrossroadcave\n#. SourceLocation:\tSource/SOrb/UI/InGame/SoUIStationPanel.cpp:94\n#: Source/SOrb/UI/InGame/SoUIStationPanel.cpp:94\nmsgctxt \"StationNames\"\nmsgid \"Crossroad Cave\"\nmsgstr \"\"\n\n#. Key:\tlavatemple\n#. SourceLocation:\tSource/SOrb/UI/InGame/SoUIStationPanel.cpp:96\n#: Source/SOrb/UI/InGame/SoUIStationPanel.cpp:96\nmsgctxt \"StationNames\"\nmsgid \"Remnant Road\"\nmsgstr \"\"\n\n#. Key:\toutpost\n#. SourceLocation:\tSource/SOrb/UI/InGame/SoUIStationPanel.cpp:95\n#: Source/SOrb/UI/InGame/SoUIStationPanel.cpp:95\nmsgctxt \"StationNames\"\nmsgid \"Obedient Outpost\"\nmsgstr \"\"\n\n#. Key:\tstay\n#. SourceLocation:\tSource/SOrb/UI/InGame/SoUIStationPanel.cpp:99\n#: Source/SOrb/UI/InGame/SoUIStationPanel.cpp:99\nmsgctxt \"StationNames\"\nmsgid \"Stay\"\nmsgstr \"\"\n\n#. Key:\twrackedWaters\n#. SourceLocation:\tSource/SOrb/UI/InGame/SoUIStationPanel.cpp:97\n#: Source/SOrb/UI/InGame/SoUIStationPanel.cpp:97\nmsgctxt \"StationNames\"\nmsgid \"Wracked Waters\"\nmsgstr \"\"\n\n"
  },
  {
    "path": "Content/Localization/Warriorb/zh-Hans/Warriorb.po",
    "content": "﻿# Warriorb Chinese (Simplified) translation.\n# Copyright 1998-2019 Epic Games, Inc. All Rights Reserved.\n# \nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: Warriorb\\n\"\n\"POT-Creation-Date: 2020-10-07 08:12\\n\"\n\"PO-Revision-Date: 2020-10-07 08:12\\n\"\n\"Language-Team: \\n\"\n\"Language: zh-Hans\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Plural-Forms: nplurals=1; plural=0;\\n\"\n\n#. Key:\t78A72CB345FCC7ECDCFD8181471D78D8\n#. SourceLocation:\t/Game/SO/GUI/UI_Credits.UI_Credits_C:WidgetTree.CreditsText.Text\n#: /Game/SO/GUI/UI_Credits.UI_Credits_C:WidgetTree.CreditsText.Text\nmsgid \"<T>-- Not Yet Team --</>\\r\\n\\r\\n\\r\\nAnna Molnár\\r\\n<R>2D art, Environment Design</>\\r\\n\\r\\n\\r\\nCsaba Molnár\\r\\n<R>Code, Design</>\\r\\n\\r\\n\\r\\nDaniel Butum\\r\\n<R>Code</>\\r\\n\\r\\n\\r\\nGéza Molnár\\r\\n<R>3D art, Design</>\\r\\n\\r\\n\\r\\nRichárd Ráski\\r\\n<R>Sound Design</>\\r\\n\\r\\n\\r\\n\\r\\n<T>-- Music --</>\\r\\n\\r\\nBenjámin Kuli\\r\\n\\r\\n\\r\\nGisula\\r\\n\\r\\n\\r\\n\\r\\n<T>-- Voice Over --</>\\r\\n\\r\\n\\r\\nPeter Luzsi - @peterluzsi\\r\\n<R>WarriOrb, Gatekeeper, Ghost Armor, Principal</>\\r\\n\\r\\n\\r\\nBrent Miller\\r\\n<R>WarriOrb - Trailer</>\\r\\n\\r\\n\\r\\nPierce Riola\\r\\n<R>Wizard, Gnory</>\\r\\n\\r\\n\\r\\nEir Causey\\r\\n<R>Raven, Teachy, Ghost Dwarf, Unknown Wizard, Fishy</>\\r\\n\\r\\n\\r\\nJack Broadbent\\r\\n<R>Monk, Flybug</>\\r\\n\\r\\n\\r\\nEmil Hagg\\r\\n<R>Supper Dwarf, Kobold Chef, Fallen Druid, Dwarven Statue</>\\r\\n\\r\\n\\r\\nErick Nita\\r\\n<R>Golem Maker, Armour Wrath</>\\r\\n\\r\\n\\r\\nAlain Vega\\r\\n<R>Merch Ant</>\\r\\n\\r\\n\\r\\nAngela Tran\\r\\n<R>Lillian, Pipe Walker</>\\r\\n\\r\\n\\r\\nBrittany Ann Phillips\\r\\n<R>Lory</>\\r\\n\\r\\n\\r\\nAurore Gautheur\\r\\n<R>Fountain, Shade</>\\r\\n\\r\\n\\r\\nAlexander Blairlex\\r\\n<R>Primitive Fishy, Ghost Helmet</>\\r\\n\\r\\n\\r\\nSophie Ryder\\r\\n<R>Shadesphere</>\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n<T>-- Partners --</>\\r\\n\\r\\n\\r\\nMaple Whispering\\r\\n<R>Chineese localization</>\\r\\n<R>Publisher - China, PC</>\\r\\n\\r\\n\\r\\nNovy Unlimited\\r\\n<R>PR and Marketing</>\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n<T>-- Localization --</>\\r\\n\\r\\n\\r\\nVera Liscovschi\\r\\n<R>Russian</>\\r\\n\\r\\n\\r\\nJay Johnstone\\r\\n<R>Spanish</>\\r\\n\\r\\n\\r\\nBertin William\\r\\n<R>French</>\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n<T>-- Testers --</>\\r\\n\\r\\n\\r\\nSaleymander\\r\\n\\r\\n\\r\\nHitch\\r\\n\\r\\n\\r\\nMrCalculated\\r\\n\\r\\n\\r\\n<img id=\\\"Rainbow\\\"/>Scorpion253<img id=\\\"Rainbow\\\"/>\\r\\n\\r\\n\\r\\nmoses\\r\\n\\r\\n\\r\\nNinjin42\\r\\n\\r\\n\\r\\nKonstantinos Xenitidis\\r\\n\\r\\n\\r\\nPhyronnaz\\r\\n\\r\\n\\r\\nArthur\\r\\n\\r\\n\\r\\nMaster1G\\r\\n\\r\\n\\r\\nDávid Bartók\\r\\n\\r\\n\\r\\nLiDuGaming\\r\\n\\r\\n\\r\\nClaudiu Coman\\r\\n\\r\\n\\r\\nÁron Ürögdi\\r\\n\\r\\n\\r\\nDukenukemboi\\r\\n\\r\\n\\r\\nBart Cools\\r\\n\\r\\n\\r\\nGlenn De Jonghe\\r\\n\\r\\n\\r\\nDomonkos Péter Madarász\\r\\n\\r\\n\\r\\nGergő Gyarmati\\r\\n\\r\\n\\r\\nRéka Gyarmati\\r\\n\\r\\n\\r\\nKincső Petraskó\\r\\n\\r\\n\\r\\nGergő Petraskó\\r\\n\\r\\n\\r\\nDániel Garamvölgyi\\r\\n\\r\\n\\r\\nDanny \\\"GHelmet\\\" Cloutier\\r\\n\\r\\n\\r\\nAnna Boglárka Tóth\\r\\n\\r\\n\\r\\nBíborka Roxána Kubik\\r\\n\\r\\n\\r\\nVirág Miklós\\r\\n\\r\\n\\r\\nBenedek Marozsák\\r\\n\\r\\n\\r\\nDániel Marozsák\\r\\n\\r\\n\\r\\nGereon Bartel\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n<T>-- Prologue Speedrun Competition Winner --</>\\r\\n\\r\\n-7\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n<T>-- Special Thanks --</>\\r\\n\\r\\n\\r\\nMalazan Discord Server Community\\r\\n\\r\\n\\r\\n/r/metroidvenia Discord Server Community\\r\\n\\r\\n\\r\\nUnreal Slackers Discord Server Community\\r\\n\\r\\n\\r\\nIMGUR\\r\\n\\r\\n\\r\\nBíborka Roxána Kubik\\r\\n\\r\\n\\r\\nSergiu Crăiţoiu\\r\\n\\r\\n\\r\\nJuhász Ernő\\r\\n\\r\\n\\r\\nRacheal Smith\\r\\n\\r\\n\\r\\nRuxandra Seniuc\\r\\n\\r\\n\\r\\nthottee\\r\\n\\r\\n\\r\\nAndrew Pappas\\r\\n\\r\\n\\r\\nJonathan Lampel\\r\\n\\r\\n\\r\\nRichárd Németh\\r\\n\\r\\n\\r\\nAlex Gorcea\\r\\n\\r\\n\\r\\nNotRealVitor\\r\\n\\r\\n\\r\\nKinga Surján\\r\\n\\r\\n\\r\\nAnna Boglárka Tóth\\r\\n\\r\\n\\r\\nÉvi Fekete\\r\\n\\r\\n\\r\\nGergő Sielaf\\r\\n\\r\\n\\r\\n<img id=\\\"Rainbow\\\"/>Scorpion253<img id=\\\"Rainbow\\\"/>\\r\\n\\r\\n\\r\\nMainiac\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n<T>-- Technology --</>\\r\\n\\r\\n\\r\\n<R>WarriOrb uses the Unreal® Engine.</>\\r\\n<R>Unreal® is a trademark or registered trademark of Epic Games, Inc. in the United States of America and elsewhere</>\\r\\n\\r\\n<R>Unreal® Engine, Copyright 1998 – 2020, Epic Games, Inc. All rights reserved.</>\\r\\n\\r\\n\\r\\n\\r\\n<R>Made with FMOD Studio by Firelight Technologies Pty Ltd.</>\"\nmsgstr \"\"\n\n#. Key:\tAxeSpecial_name\n#. SourceLocation:\t/Game/SO/CharacterStrikes/AxeSpecial.AxeSpecial.StrikeName\n#: /Game/SO/CharacterStrikes/AxeSpecial.AxeSpecial.StrikeName\nmsgctxt \"CharacterStrike\"\nmsgid \"Throw\"\nmsgstr \"扔\"\n\n#. Key:\tDemonSwordSpecial_name\n#. SourceLocation:\t/Game/SO/CharacterStrikes/DemonSwordSpecial.DemonSwordSpecial.StrikeName\n#. /Game/SO/CharacterStrikes/DemonSwordSpecial.DemonSwordSpecial.StrikeName\n#: /Game/SO/CharacterStrikes/DemonSwordSpecial.DemonSwordSpecial.StrikeName\nmsgctxt \"CharacterStrike\"\nmsgid \"Downstrike\"\nmsgstr \"下击\"\n\n#. Key:\tDualBladeSpecial_name\n#. SourceLocation:\t/Game/SO/CharacterStrikes/DualBladeSpecial.DualBladeSpecial.StrikeName\n#. /Game/SO/CharacterStrikes/DualBladeSpecial.DualBladeSpecial.StrikeName\n#: /Game/SO/CharacterStrikes/DualBladeSpecial.DualBladeSpecial.StrikeName\nmsgctxt \"CharacterStrike\"\nmsgid \"Backslash\"\nmsgstr \"背砍\"\n\n#. Key:\tLeafMaceSpecial_name\n#. SourceLocation:\t/Game/SO/CharacterStrikes/LeafMaceSpecial.LeafMaceSpecial.StrikeName\n#. /Game/SO/CharacterStrikes/LeafMaceSpecial.LeafMaceSpecial.StrikeName\n#: /Game/SO/CharacterStrikes/LeafMaceSpecial.LeafMaceSpecial.StrikeName\nmsgctxt \"CharacterStrike\"\nmsgid \"Crushing Blow\"\nmsgstr \"粉碎打击\"\n\n#. Key:\tSabreSpecial_name\n#. SourceLocation:\t/Game/SO/CharacterStrikes/SabreSpecial.SabreSpecial.StrikeName\n#. /Game/SO/CharacterStrikes/SabreSpecial.SabreSpecial.StrikeName\n#: /Game/SO/CharacterStrikes/SabreSpecial.SabreSpecial.StrikeName\nmsgctxt \"CharacterStrike\"\nmsgid \"Floating Strikes\"\nmsgstr \"浮空打击\"\n\n#. Key:\tSwordSpecialAirStrike_name\n#. SourceLocation:\t/Game/SO/CharacterStrikes/SwordSpecialAirStrike.SwordSpecialAirStrike.StrikeName\n#. /Game/SO/CharacterStrikes/SwordSpecialAirStrike.SwordSpecialAirStrike.StrikeName\n#: /Game/SO/CharacterStrikes/SwordSpecialAirStrike.SwordSpecialAirStrike.StrikeName\nmsgctxt \"CharacterStrike\"\nmsgid \"Air Strike\"\nmsgstr \"空袭\"\n\n#. Key:\tBPEftAttackSpeedMultiplier_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/BPEftAttackSpeedMultiplier.Default__BPEftAttackSpeedMultiplier_C.DisplayName\n#. /Game/SO/Blueprints/EffectInstances/BPEftAttackSpeedMultiplier.Default__BPEftAttackSpeedMultiplier_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/BPEftAttackSpeedMultiplier.Default__BPEftAttackSpeedMultiplier_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Quick Hands\"\nmsgstr \"快手\"\n\n#. Key:\tBPEftBootTransmutation_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/BPEftBootTransmutation.Default__BPEftBootTransmutation_C.DisplayName\n#. /Game/SO/Blueprints/EffectInstances/BPEftBootTransmutation.Default__BPEftBootTransmutation_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/BPEftBootTransmutation.Default__BPEftBootTransmutation_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Protective Transmutation\"\nmsgstr \"保护性转化\"\n\n#. Key:\tBPEftBounce_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftBounce.Default__BPEftBounce_C.DisplayName\n#. /Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftBounce.Default__BPEftBounce_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftBounce.Default__BPEftBounce_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Charged Bounce\"\nmsgstr \"蓄力弹跳\"\n\n#. Key:\tBPEftCooldownReducePassive02_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/BPEftCooldownReducePassive02.Default__BPEftCooldownReducePassive02_C.DisplayName\n#. Key:\tBPEftCooldownReduce_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/BPEftCooldownReduce.Default__BPEftCooldownReduce_C.DisplayName\n#. /Game/SO/Blueprints/EffectInstances/BPEftCooldownReducePassive02.Default__BPEftCooldownReducePassive02_C.DisplayName\n#. /Game/SO/Blueprints/EffectInstances/BPEftCooldownReduce.Default__BPEftCooldownReduce_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/BPEftCooldownReduce.Default__BPEftCooldownReduce_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/BPEftCooldownReducePassive02.Default__BPEftCooldownReducePassive02_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Restlessness\"\nmsgstr \"不安\"\n\n#. Key:\tBPEftCriticalChanceBoost10_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/BPEftCriticalChanceBoost10.Default__BPEftCriticalChanceBoost10_C.DisplayName\n#. /Game/SO/Blueprints/EffectInstances/BPEftCriticalChanceBoost10.Default__BPEftCriticalChanceBoost10_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/BPEftCriticalChanceBoost10.Default__BPEftCriticalChanceBoost10_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Critical Chance\"\nmsgstr \"暴击率\"\n\n#. Key:\tBPEftDamageReflection_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/BPEftDamageReflection.Default__BPEftDamageReflection_C.DisplayName\n#. /Game/SO/Blueprints/EffectInstances/BPEftDamageReflection.Default__BPEftDamageReflection_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/BPEftDamageReflection.Default__BPEftDamageReflection_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Sparks of Vengeance\"\nmsgstr \"复仇火花\"\n\n#. Key:\tBPEftDmgModifier_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftDmgModifier.Default__BPEftDmgModifier_C.DisplayName\n#. /Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftDmgModifier.Default__BPEftDmgModifier_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftDmgModifier.Default__BPEftDmgModifier_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Perfect Hands\"\nmsgstr \"完美之手\"\n\n#. Key:\tBPEftHeal3_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/BPEftHeal3.Default__BPEftHeal3_C.DisplayName\n#. /Game/SO/Blueprints/EffectInstances/BPEftHeal3.Default__BPEftHeal3_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/BPEftHeal3.Default__BPEftHeal3_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Heal\"\nmsgstr \"治愈\"\n\n#. Key:\tBPEftLifeLeech5_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/BPEftLifeLeech5.Default__BPEftLifeLeech5_C.DisplayName\n#. /Game/SO/Blueprints/EffectInstances/BPEftLifeLeech5.Default__BPEftLifeLeech5_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/BPEftLifeLeech5.Default__BPEftLifeLeech5_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Life Leech\"\nmsgstr \"活水蛭\"\n\n#. Key:\tBPEftMagicMissle_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftMagicMissle.Default__BPEftMagicMissle_C.DisplayName\n#. /Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftMagicMissle.Default__BPEftMagicMissle_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftMagicMissle.Default__BPEftMagicMissle_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Magic Missile\"\nmsgstr \"魔法导弹\"\n\n#. Key:\tBPEftMassMagicMissle_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftMassMagicMissle.Default__BPEftMassMagicMissle_C.DisplayName\n#. /Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftMassMagicMissle.Default__BPEftMassMagicMissle_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftMassMagicMissle.Default__BPEftMassMagicMissle_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Magic Missiles\"\nmsgstr \"魔法导弹\"\n\n#. Key:\tBPEftMassSlow_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftMassSlow.Default__BPEftMassSlow_C.DisplayName\n#. Key:\tBPEftSlow_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/BPEftSlow.Default__BPEftSlow_C.DisplayName\n#. /Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftMassSlow.Default__BPEftMassSlow_C.DisplayName\n#. /Game/SO/Blueprints/EffectInstances/BPEftSlow.Default__BPEftSlow_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/BPEftSlow.Default__BPEftSlow_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftMassSlow.Default__BPEftMassSlow_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Slow\"\nmsgstr \"减速\"\n\n#. Key:\tBPEftMeteorShower_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftMeteorShower.Default__BPEftMeteorShower_C.DisplayName\n#. /Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftMeteorShower.Default__BPEftMeteorShower_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftMeteorShower.Default__BPEftMeteorShower_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Meteor Shower\"\nmsgstr \"流星雨\"\n\n#. Key:\tBPEftRegainSpellPassive25_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/BPEftRegainSpellPassive25.Default__BPEftRegainSpellPassive25_C.DisplayName\n#. /Game/SO/Blueprints/EffectInstances/BPEftRegainSpellPassive25.Default__BPEftRegainSpellPassive25_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/BPEftRegainSpellPassive25.Default__BPEftRegainSpellPassive25_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Arcane Luck\"\nmsgstr \"神秘运气\"\n\n#. Key:\tBPEftRegainSpells_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/BPEftRegainSpells.Default__BPEftRegainSpells_C.DisplayName\n#. /Game/SO/Blueprints/EffectInstances/BPEftRegainSpells.Default__BPEftRegainSpells_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/BPEftRegainSpells.Default__BPEftRegainSpells_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Restoration\"\nmsgstr \"恢复\"\n\n#. Key:\tBPEftResModifierMagicalStrong_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftResModifierMagicalStrong.Default__BPEftResModifierMagicalStrong_C.DisplayName\n#. Key:\tBPEftResModifierMagical_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftResModifierMagical.Default__BPEftResModifierMagical_C.DisplayName\n#. /Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftResModifierMagicalStrong.Default__BPEftResModifierMagicalStrong_C.DisplayName\n#. /Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftResModifierMagical.Default__BPEftResModifierMagical_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftResModifierMagical.Default__BPEftResModifierMagical_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftResModifierMagicalStrong.Default__BPEftResModifierMagicalStrong_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Wardskin\"\nmsgstr \"防护皮肤\"\n\n#. Key:\tBPEftResModifierPhysical_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftResModifierPhysical.Default__BPEftResModifierPhysical_C.DisplayName\n#. /Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftResModifierPhysical.Default__BPEftResModifierPhysical_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftResModifierPhysical.Default__BPEftResModifierPhysical_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Stoneskin\"\nmsgstr \"石化皮肤\"\n\n#. Key:\tBPEftSecondChance_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/BPEftSecondChance.Default__BPEftSecondChance_C.DisplayName\n#. /Game/SO/Blueprints/EffectInstances/BPEftSecondChance.Default__BPEftSecondChance_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/BPEftSecondChance.Default__BPEftSecondChance_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Second Chance\"\nmsgstr \"第二次机会\"\n\n#. Key:\tBPEftSpellFire0_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftSpellFire0.Default__BPEftSpellFire0_C.DisplayName\n#. /Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftSpellFire0.Default__BPEftSpellFire0_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftSpellFire0.Default__BPEftSpellFire0_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Firestrike\"\nmsgstr \"火焰袭击\"\n\n#. Key:\tBPEftSpellLightningWalk_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftSpellLightningWalk.Default__BPEftSpellLightningWalk_C.DisplayName\n#. /Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftSpellLightningWalk.Default__BPEftSpellLightningWalk_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftSpellLightningWalk.Default__BPEftSpellLightningWalk_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Shockwalk\"\nmsgstr \"冲击步\"\n\n#. Key:\tBPEftSpellShadowWalk_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftSpellShadowWalk.Default__BPEftSpellShadowWalk_C.DisplayName\n#. /Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftSpellShadowWalk.Default__BPEftSpellShadowWalk_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftSpellShadowWalk.Default__BPEftSpellShadowWalk_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Shadewalk\"\nmsgstr \"暗影疾步\"\n\n#. Key:\tBPEftSpellShield_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftSpellShield.Default__BPEftSpellShield_C.DisplayName\n#. /Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftSpellShield.Default__BPEftSpellShield_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftSpellShield.Default__BPEftSpellShield_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Shield\"\nmsgstr \"护盾\"\n\n#. Key:\tBPEftSpellSoulKeeper_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftSpellSoulKeeper.Default__BPEftSpellSoulKeeper_C.DisplayName\n#. /Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftSpellSoulKeeper.Default__BPEftSpellSoulKeeper_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftSpellSoulKeeper.Default__BPEftSpellSoulKeeper_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Soulbind\"\nmsgstr \"灵魂束缚\"\n\n#. Key:\tBPEftStun_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/BPEftStun.Default__BPEftStun_C.DisplayName\n#. /Game/SO/Blueprints/EffectInstances/BPEftStun.Default__BPEftStun_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/BPEftStun.Default__BPEftStun_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Stun\"\nmsgstr \"眩晕\"\n\n#. Key:\tBPEftStunPassive10_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/BPEftStunPassive10.Default__BPEftStunPassive10_C.DisplayName\n#. /Game/SO/Blueprints/EffectInstances/BPEftStunPassive10.Default__BPEftStunPassive10_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/BPEftStunPassive10.Default__BPEftStunPassive10_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Stun Chance\"\nmsgstr \"眩晕几率\"\n\n#. Key:\tBPEftSwap_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftSwap.Default__BPEftSwap_C.DisplayName\n#. /Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftSwap.Default__BPEftSwap_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftSwap.Default__BPEftSwap_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Swap\"\nmsgstr \"交换\"\n\n#. Key:\tBPEftTempHPMagical_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftTempHPMagical.Default__BPEftTempHPMagical_C.DisplayName\n#. /Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftTempHPMagical.Default__BPEftTempHPMagical_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftTempHPMagical.Default__BPEftTempHPMagical_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Magical Protection\"\nmsgstr \"魔法防护\"\n\n#. Key:\tBPEftTempHPPhysical_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftTempHPPhysical.Default__BPEftTempHPPhysical_C.DisplayName\n#. /Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftTempHPPhysical.Default__BPEftTempHPPhysical_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftTempHPPhysical.Default__BPEftTempHPPhysical_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Physical Protection\"\nmsgstr \"物理防护\"\n\n#. Key:\tBPEftWeaponFlamesTimeBased_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/BPEftWeaponFlamesTimeBased.Default__BPEftWeaponFlamesTimeBased_C.DisplayName\n#. /Game/SO/Blueprints/EffectInstances/BPEftWeaponFlamesTimeBased.Default__BPEftWeaponFlamesTimeBased_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/BPEftWeaponFlamesTimeBased.Default__BPEftWeaponFlamesTimeBased_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Greenflame\"\nmsgstr \"绿焰\"\n\n#. Key:\tBPEftWorthy_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/BPEftWorthy.Default__BPEftWorthy_C.DisplayName\n#. /Game/SO/Blueprints/EffectInstances/BPEftWorthy.Default__BPEftWorthy_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/BPEftWorthy.Default__BPEftWorthy_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Worthy\"\nmsgstr \"价值\"\n\n#. Key:\t1E42901841F4C7CEF39536A762076EDF\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.UI_EndScreen_SaveCreatures_C:WidgetTree.TBC1.Text\n#. Key:\t5D04206A499A8B42AF77BAA8BC9B4B8B\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.UI_EndScreen_SaveCreatures_C:WidgetTree.TBC0.Text\n#. Key:\tB0EEBB754110D2821640BE990002AC36\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.UI_EndScreen_SaveCreatures_C:WidgetTree.TBC2.Text\n#. Key:\tD75DCE214B56BA6FD9A58F9EEA9291A5\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.UI_EndScreen_C:WidgetTree.TBC0.Text\n#. /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.UI_EndScreen_SaveCreatures_C:WidgetTree.TBC1.Text\n#. /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.UI_EndScreen_SaveCreatures_C:WidgetTree.TBC0.Text\n#. /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.UI_EndScreen_SaveCreatures_C:WidgetTree.TBC2.Text\n#. /Game/SO/GUI/InGame/UI_EndScreen.UI_EndScreen_C:WidgetTree.TBC0.Text\n#: /Game/SO/GUI/InGame/UI_EndScreen.UI_EndScreen_C:WidgetTree.TBC0.Text\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.UI_EndScreen_SaveCreatures_C:WidgetTree.TBC0.Text\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.UI_EndScreen_SaveCreatures_C:WidgetTree.TBC1.Text\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.UI_EndScreen_SaveCreatures_C:WidgetTree.TBC2.Text\nmsgctxt \"EndScreen\"\nmsgid \"With his quest completed Monk decided to look for another activity. He thought: <Quote>‘If I could resist madness, others should be able to do the same.’</> And so he opened a monastery to share his mental training techniques with anyone willing to save its sanity.\"\nmsgstr \"任务完成后，修道士决定寻找另一个活动。他想着: <Quote>‘如果我能抵抗疯狂，其他人也应该能做到。’</> 于是他开办了一座修道院，与任何愿意拯救它的人分享他的精神训练技巧。\"\n\n#. Key:\t7279EA4741D3DAC5AE92EB99AB851ED9\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.UI_EndScreen_SaveCreatures_C:WidgetTree.TBD0.Text\n#. Key:\t77E809914A65796364FE94B8C2361FD7\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.UI_EndScreen_SaveCreatures_C:WidgetTree.TBD2.Text\n#. Key:\t9C1B477D4582ABAEDC90FCB3AC6737E7\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.UI_EndScreen_C:WidgetTree.TBD0.Text\n#. Key:\tE98C3FDD453FF80CA8EBBE94459A5CAF\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.UI_EndScreen_SaveCreatures_C:WidgetTree.TBD1.Text\n#. /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.UI_EndScreen_SaveCreatures_C:WidgetTree.TBD0.Text\n#. /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.UI_EndScreen_SaveCreatures_C:WidgetTree.TBD2.Text\n#. /Game/SO/GUI/InGame/UI_EndScreen.UI_EndScreen_C:WidgetTree.TBD0.Text\n#. /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.UI_EndScreen_SaveCreatures_C:WidgetTree.TBD1.Text\n#: /Game/SO/GUI/InGame/UI_EndScreen.UI_EndScreen_C:WidgetTree.TBD0.Text\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.UI_EndScreen_SaveCreatures_C:WidgetTree.TBD0.Text\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.UI_EndScreen_SaveCreatures_C:WidgetTree.TBD1.Text\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.UI_EndScreen_SaveCreatures_C:WidgetTree.TBD2.Text\nmsgctxt \"EndScreen\"\nmsgid \"<Size42>Separating the World also changed something in the Ruined Realm. The wind turned and even Ruin stopped for a moment.</>\"\nmsgstr \"<Size42>世界的分离也改变了毁灭王国的一些东西。风向变了，甚至连毁灭也消停了一段时间。</>\"\n\n#. Key:\t9B476D3D4A603658683498B09968F8AA\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.UI_EndScreen_C:WidgetTree.TBB0.Text\n#. /Game/SO/GUI/InGame/UI_EndScreen.UI_EndScreen_C:WidgetTree.TBB0.Text\n#: /Game/SO/GUI/InGame/UI_EndScreen.UI_EndScreen_C:WidgetTree.TBB0.Text\nmsgctxt \"EndScreen\"\nmsgid \"When he heard about the lost Kobold tribe he got a bit excited.<Quote>‘Kobolds reserved the ancient knowledge in their rituals’</> he said. <Quote>‘If there is something we can do with Ruin it must be connected to the rituals. I’ll go with you.’</>\"\nmsgstr \"当他听说流失的地精部落时，显得有些兴奋。<Quote>‘地精保留了仪式中古老的知识。’</> 他说道。 <Quote>‘如果我们能对毁灭做点什么，那一定是与宗教仪式有关。我和你一起去。’</>\"\n\n#. Key:\tDF7F9F754F4FC9CB19DF92AFCE96C5C1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.UI_EndScreen_SaveCreatures_C:WidgetTree.TBA2.Text\n#. Key:\tE8401550448E14DD70717EB7EED0582B\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.UI_EndScreen_SaveCreatures_C:WidgetTree.TBA1.Text\n#. Key:\tUI_EndScreen_entry_0_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(0).EndingLogic.Texts(1).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.UI_EndScreen_SaveCreatures_C:WidgetTree.TBA2.Text\n#. /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.UI_EndScreen_SaveCreatures_C:WidgetTree.TBA1.Text\n#. /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(0).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(0).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.UI_EndScreen_SaveCreatures_C:WidgetTree.TBA1.Text\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.UI_EndScreen_SaveCreatures_C:WidgetTree.TBA2.Text\nmsgctxt \"EndScreen\"\nmsgid \"The people soon forgot about the threat, some of them argued that Ruin ever existed.\"\nmsgstr \"人们很快就忘记了这个威胁，他们中的一些人甚至认为毁灭根本没有存在过。\"\n\n#. Key:\tE9F6E1064D5B2046DF1DEDA386012E2D\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.UI_EndScreen_C:WidgetTree.TBB2.Text\n#. Key:\tUI_EndScreen_entry_6_text_2\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(6).EndingLogic.Texts(2).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen.UI_EndScreen_C:WidgetTree.TBB2.Text\n#. /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(6).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(6).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.UI_EndScreen_C:WidgetTree.TBB2.Text\nmsgctxt \"EndScreen\"\nmsgid \"He opened a monastery to share his mental training techniques with anyone willing to save its sanity.\"\nmsgstr \"他开设了一座修道院，与任何愿意保持清醒的个体分享他的精神训练技巧。\"\n\n#. Key:\tF0EAD93B44D8D7AEF306EAB75D83FB37\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.UI_EndScreen_C:WidgetTree.TBB1.Text\n#. /Game/SO/GUI/InGame/UI_EndScreen.UI_EndScreen_C:WidgetTree.TBB1.Text\n#: /Game/SO/GUI/InGame/UI_EndScreen.UI_EndScreen_C:WidgetTree.TBB1.Text\nmsgctxt \"EndScreen\"\nmsgid \"<Quote>‘If I could resist madness, others should be able to do the same’</> - he thought.\"\nmsgstr \"<Quote>‘如果我能抵抗疯狂，其他人也应该能做到。’</> - 他如此想着。\"\n\n#. Key:\tUI_EndScreen_entry_0_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(0).EndingLogic.Texts(0).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(0).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(0).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Once the Boundaries of Worlds were sealed, Ruin could do no harm to the Human Realm again.\"\nmsgstr \"一旦世界的边界被封闭，毁灭就不会再对人类王国造成伤害。\"\n\n#. Key:\tUI_EndScreen_entry_10_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(10).EndingLogic.Texts(0).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(10).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(10).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Hearing these news made the Chef really excited.\"\nmsgstr \"听到这个消息，厨师非常兴奋。\"\n\n#. Key:\tUI_EndScreen_entry_10_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(10).EndingLogic.Texts(1).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(10).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(10).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"<Quote>'Could there be other survivors of my tribe?'</>\"\nmsgstr \"<Quote>'我的部落里还有其他幸存者吗?'</>\"\n\n#. Key:\tUI_EndScreen_entry_10_text_2\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(10).EndingLogic.Texts(2).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(10).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(10).EndingLogic.Texts(2).Texts\nmsgctxt \"EndScreen\"\nmsgid \"He decided to leave his kitchen and search for his lost relatives.\"\nmsgstr \"他决定离开厨房去寻找走失的亲人。\"\n\n#. Key:\tUI_EndScreen_entry_11_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(11).EndingLogic.Texts(0).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(11).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(11).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"No one knows how he could possibly know about the soup, but Supper Dwarf also appeared to taste the food.\"\nmsgstr \"没人知道他怎么可能知道汤的事，但晚餐矮人似乎也尝到了食物的味道。\"\n\n#. Key:\tUI_EndScreen_entry_11_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(11).EndingLogic.Texts(1).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(11).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(11).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"When he heard that the chef is leaving he offered his help with the trains.\"\nmsgstr \"当他听说厨师要走的时候，他主动提出要帮忙修火车。\"\n\n#. Key:\tUI_EndScreen_entry_11_text_2\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(11).EndingLogic.Texts(2).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(11).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(11).EndingLogic.Texts(2).Texts\nmsgctxt \"EndScreen\"\nmsgid \"<Quote>‘And I would also like to check what do they eat for supper.’</> he said. <Quote>‘I’m going with you.’</>\"\nmsgstr \"<Quote>‘我还想看看他们晚饭吃什么。’</> 他说道。 <Quote>‘我和你一起去。’</>\"\n\n#. Key:\tUI_EndScreen_entry_12_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(12).EndingLogic.Texts(0).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(12).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(12).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"On their way they stopped by the Golem Maker.\"\nmsgstr \"路上，他们顺道拜访了机器人制造者。\"\n\n#. Key:\tUI_EndScreen_entry_12_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(12).EndingLogic.Texts(1).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(12).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(12).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"He was just sitting and staring at nothing.\"\nmsgstr \"他只是坐着，眼神放空。\"\n\n#. Key:\tUI_EndScreen_entry_12_text_2\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(12).EndingLogic.Texts(2).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(12).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(12).EndingLogic.Texts(2).Texts\nmsgctxt \"EndScreen\"\nmsgid \"It was still hard for the Maker to accept that all his work was for nothing.\"\nmsgstr \"制作者仍然很难接受他所有的工作都是徒劳的。\"\n\n#. Key:\tUI_EndScreen_entry_12_text_3\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(12).EndingLogic.Texts(3).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(12).EndingLogic.Texts(3).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(12).EndingLogic.Texts(3).Texts\nmsgctxt \"EndScreen\"\nmsgid \"At least he stopped creating mindless stone golems.\"\nmsgstr \"至少他不再创造没有头脑的机器人了。\"\n\n#. Key:\tUI_EndScreen_entry_13_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(13).EndingLogic.Texts(0).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(13).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(13).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"When he heard about the lost Kobold tribe he got a bit excited.\"\nmsgstr \"当他听说流失的地精部落时，显得有些兴奋。\"\n\n#. Key:\tUI_EndScreen_entry_13_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(13).EndingLogic.Texts(1).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(13).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(13).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"<Quote>‘Kobolds reserved the ancient knowledge in their rituals’</> he said.\"\nmsgstr \"<Quote>‘地精保留了仪式中那些古老的知识’</> 他说道。\"\n\n#. Key:\tUI_EndScreen_entry_13_text_2\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(13).EndingLogic.Texts(2).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(13).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(13).EndingLogic.Texts(2).Texts\nmsgctxt \"EndScreen\"\nmsgid \"<Quote>‘If there is something we can do with Ruin it must be connected to the rituals. I’ll go with you.’</>\"\nmsgstr \"<Quote>‘如果我们能对毁灭做点什么，那一定是与宗教仪式有关。我要和你一起去.’</>\"\n\n#. Key:\tUI_EndScreen_entry_14_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(14).EndingLogic.Texts(0).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(14).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(14).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"However there are things which never change.\"\nmsgstr \"然而，有些事情永远不会改变。\"\n\n#. Key:\tUI_EndScreen_entry_14_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(14).EndingLogic.Texts(1).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(14).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(14).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"After days of arguing on who undermined whose business Lory and Gnory separated once again.\"\nmsgstr \"争论了几天关于谁搅黄了谁的生意之后，劳里和格诺里又分开了。\"\n\n#. Key:\tUI_EndScreen_entry_15_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(15).EndingLogic.Texts(0).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(15).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(15).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"While they were arguing Fishy decided to leave Gnory and set out on his own.\"\nmsgstr \"当他们在争论的时候，呆鱼决定离开格诺里，独自上路。\"\n\n#. Key:\tUI_EndScreen_entry_15_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(15).EndingLogic.Texts(1).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(15).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(15).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"He had no idea where he was going.\"\nmsgstr \"他不知道自己要去哪里。\"\n\n#. Key:\tUI_EndScreen_entry_16_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(16).EndingLogic.Texts(0).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(16).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(16).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"After weeks of walking alone, he heard a faint excited voice:\"\nmsgstr \"独自行走了几个星期后，他听到一个微弱而兴奋的声音:\"\n\n#. Key:\tUI_EndScreen_entry_1_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(1).EndingLogic.Texts(0).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(1).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(1).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"The Mage Council didn’t believe a single word Lillian or Scholar told them about the events.\"\nmsgstr \"法师协对于莉莉安和斯考拉关于这次事件的描述一个字也不相信。\"\n\n#. Key:\tUI_EndScreen_entry_1_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(1).EndingLogic.Texts(1).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(1).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(1).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"They claimed that Wizard died in an unfortunate accident and his device could never actually work anyway.\"\nmsgstr \"他们声称巫师死于一场不幸的事故，他的装置永远也不能真正地运作起来。\"\n\n#. Key:\tUI_EndScreen_entry_2_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(2).EndingLogic.Texts(0).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(2).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(2).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Although Lillian inherited her father’s castle she was sent to an Orphanage until she came into age to live on her own.\"\nmsgstr \"尽管莉莉安继承了她父亲的城堡，她还是被送进了孤儿院，直到她长大后能独立生活。\"\n\n#. Key:\tUI_EndScreen_entry_2_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(2).EndingLogic.Texts(1).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(2).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(2).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Scholar was upset by Lillian’s decision on letting the Ruined Realm fall but he promised Lillian that he will make the Wizard’s Council let Lillian live in his estate.\"\nmsgstr \"斯科拉对于莉莉安让这个毁灭王国沦陷的决定感到沮丧，但他答应莉莉安，他会让巫师协会让莉莉安住在他的庄园里。\"\n\n#. Key:\tUI_EndScreen_entry_3_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(3).EndingLogic.Texts(0).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(3).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(3).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Lillian didn't let the unfortunate events to overcome her. She stopped Ruin even if no one believed her.\"\nmsgstr \"莉莉安没有让这些不幸的事情压倒她。她阻止了毁灭，即使没有人相信她。\"\n\n#. Key:\tUI_EndScreen_entry_3_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(3).EndingLogic.Texts(1).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(3).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(3).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"She also knew that the Ruined Realm still had at least a half century before it was totally destroyed so she decided to keep on looking for a way to save it.\"\nmsgstr \"她也知道，毁灭王国至少还有半个世纪才会完全被摧毁，所以她决定继续寻找拯救它的方法。\"\n\n#. Key:\tUI_EndScreen_entry_3_text_2\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(3).EndingLogic.Texts(2).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(3).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(3).EndingLogic.Texts(2).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Now that her own Realm was safe she could focus on the other Realms.\"\nmsgstr \"现在她自己的王国是安全的，她可以专注于其他王国。\"\n\n#. Key:\tUI_EndScreen_entry_4_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(4).EndingLogic.Texts(0).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(4).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(4).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"<Size42>Separating the World also changed something in the Ruined Realm.</>\"\nmsgstr \"<Size42>世界的分离也改变了毁灭王国的一些东西。</>\"\n\n#. Key:\tUI_EndScreen_entry_4_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(4).EndingLogic.Texts(1).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(4).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(4).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"<Size42>The wind turned and even Ruin stopped for a moment.</>\"\nmsgstr \"<Size42>风向变了，甚至连毁灭也消停了一段时间。</>\"\n\n#. Key:\tUI_EndScreen_entry_5_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(5).EndingLogic.Texts(0).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(5).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(5).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"When it was certain that no one will be saved from Ruin, as a last desperate act Gate Keeper tried to open a Gate to the Human Realm himself.\"\nmsgstr \"当最后一个绝望的守护者试图自己打开通往人类王国的大门时，没有人能从毁灭中被拯救出来。\"\n\n#. Key:\tUI_EndScreen_entry_5_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(5).EndingLogic.Texts(1).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(5).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(5).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"A portal opened and swallowed the Keeper.\"\nmsgstr \"一个入口打开了，吞噬了守护者。\"\n\n#. Key:\tUI_EndScreen_entry_5_text_2\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(5).EndingLogic.Texts(2).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(5).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(5).EndingLogic.Texts(2).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Some believed he survived but no one ever met him again.\"\nmsgstr \"一些人相信他肯定活了下来，但是没有人再见过他。\"\n\n#. Key:\tUI_EndScreen_entry_6_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(6).EndingLogic.Texts(0).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(6).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(6).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"With his quest completed Monk decided to look for another activity.\"\nmsgstr \"任务完成后，修道士决定寻找另一个活动。\"\n\n#. Key:\tUI_EndScreen_entry_6_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(6).EndingLogic.Texts(1).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(6).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(6).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"<Quote>‘If I could resist madness, shouldn't others be able to do the same?’</>- he wondered.\"\nmsgstr \"<Quote>“如果我能抵抗疯狂，其他人难道不可以吗?”</>- 他想知道。\"\n\n#. Key:\tUI_EndScreen_entry_7_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(7).EndingLogic.Texts(0).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(7).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(7).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"To the surprise of many Teachy also joined Monk and soon he became his best student.\"\nmsgstr \"令大家惊讶的是，老师也投靠了修道士，并且很快成为他最好的学生。\"\n\n#. Key:\tUI_EndScreen_entry_7_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(7).EndingLogic.Texts(1).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(7).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(7).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"<Quote>‘To be honest I never actually wanted to be a teacher‘</> - said Teachy.\"\nmsgstr \"<Quote>“说实话，我从来没有真正想过要当一名老师。”</> 老师说道。\"\n\n#. Key:\tUI_EndScreen_entry_7_text_2\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(7).EndingLogic.Texts(2).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(7).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(7).EndingLogic.Texts(2).Texts\nmsgctxt \"EndScreen\"\nmsgid \"<Quote>'I also knew that I was a bit mad and since for my insane mind training in a monastery looked like a crazy idea I immediately knew that in fact that's the most sane thing to do.’</>\"\nmsgstr \"<Quote>“我也知道我有点疯魔了，因为我在修道院接受的精神训练看起来实在有点疯狂，我立刻意识到，这是最理智的做法。”</>\"\n\n#. Key:\tUI_EndScreen_entry_8_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(8).EndingLogic.Texts(0).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(8).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(8).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Losing his connection to his master, Raven had to think again about his purpose.\"\nmsgstr \"乌鸦与主人失去了联系，不得不重新考虑他的目标。\"\n\n#. Key:\tUI_EndScreen_entry_8_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(8).EndingLogic.Texts(1).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(8).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(8).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"<Quote>‘I think therefore I am not a bird’</> - he said.\"\nmsgstr \"<Quote>‘因此，我想我不是一只鸟。’</> - 他说道。\"\n\n#. Key:\tUI_EndScreen_entry_8_text_2\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(8).EndingLogic.Texts(2).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(8).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(8).EndingLogic.Texts(2).Texts\nmsgctxt \"EndScreen\"\nmsgid \"With his vast experience he couldn’t become the same thoughtless bird he once was.\"\nmsgstr \"有了丰富的经验，他不可能再像以前那样粗心大意了。\"\n\n#. Key:\tUI_EndScreen_entry_8_text_3\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(8).EndingLogic.Texts(3).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(8).EndingLogic.Texts(3).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(8).EndingLogic.Texts(3).Texts\nmsgctxt \"EndScreen\"\nmsgid \"He joined Monk’s monastery to teach philosophy.\"\nmsgstr \"他到修道院去教哲学。\"\n\n#. Key:\tUI_EndScreen_entry_8_text_4\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(8).EndingLogic.Texts(4).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(8).EndingLogic.Texts(4).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(8).EndingLogic.Texts(4).Texts\nmsgctxt \"EndScreen\"\nmsgid \"In his free hours he kept on studying the Ancient’s technology hoping that one day he will find a way back to Lillian.\"\nmsgstr \"在他空闲的时候，他继续研究古人的技术，希望有一天他会找到一个方法回到莉莉安身边。\"\n\n#. Key:\tUI_EndScreen_entry_9_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(9).EndingLogic.Texts(0).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(9).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(9).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"When the soup was almost ready the Pipe Walkers smelled the flavour and they all gathered for a last dinner.\"\nmsgstr \"当汤差不多准备好的时候，管道行走者闻到了味道，他们全体聚集在一起吃了最后一顿饭。\"\n\n#. Key:\tUI_EndScreen_entry_9_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(9).EndingLogic.Texts(1).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(9).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(9).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"After lunch they started to talk.\"\nmsgstr \"午饭后，他们开始交谈。\"\n\n#. Key:\tUI_EndScreen_entry_9_text_2\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(9).EndingLogic.Texts(2).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(9).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(9).EndingLogic.Texts(2).Texts\nmsgctxt \"EndScreen\"\nmsgid \"One of the Pipe Walkers, who had been in many cages mentioned that she actually met some kobolds far away.\"\nmsgstr \"其中一个曾经被关在笼子里的管道行走者提到，她实际上在很远的地方遇到了一些地精。\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_0_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(0).EndingLogic.Texts(0).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(0).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(0).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"By the time the furious crowd broke into the Wizard’s Castle the Device was completely destroyed.\"\nmsgstr \"当愤怒的人群冲进巫师的城堡时，那个装置已经完全被摧毁了。\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_0_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(0).EndingLogic.Texts(1).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(0).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(0).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Some left, others started to investigate the building hoping to find something which might stop Ruin.\"\nmsgstr \"一些人离开了，另一些人开始调查这座建筑，希望能找到一些可以阻止毁灭的东西。\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_10_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(10).EndingLogic.Texts(0).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(10).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(10).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"<Quote>‘Kobolds reserved the ancient knowledge in their rituals’</> Golem Maker said. <Quote>‘If there is something we can do with Ruin it must be connected to the rituals. I’ll go with you.’</>\"\nmsgstr \"<Quote>‘地精在他们的仪式中保留了古老的知识. <Quote>‘如果我们能对毁灭做点什么，那一定是与宗教仪式有关。我和你一起去。’</>\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_10_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(10).EndingLogic.Texts(1).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(10).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(10).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Golem Maker was a huge help to Lillian with his knowledge on Golemology and it was not easy for Lillian to let him go.\"\nmsgstr \"机器人制造者用他的知识给了莉莉安很大的帮助，莉莉安让他离开是很不容易的。\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_10_text_2\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(10).EndingLogic.Texts(2).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(10).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(10).EndingLogic.Texts(2).Texts\nmsgctxt \"EndScreen\"\nmsgid \"<Quote>‘Have no fear!’</> Golem Maker said. <Quote>‘I will return with even more knowledge and we’ll stop Ruin once and for all.’</>\"\nmsgstr \"<Quote>‘不畏恐惧!’</> 机器人制造者说。 <Quote>‘我会带着更多的知识回来，我们将一劳永逸地阻止毁灭.’</>\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_11_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(11).EndingLogic.Texts(0).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(11).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(11).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"After Kobold Chef left, Supper Dwarf had to take care of the kitchen.\"\nmsgstr \"地精厨师离开后，晚餐矮人不得不负责厨房。\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_11_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(11).EndingLogic.Texts(1).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(11).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(11).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"It turned out that he is also really talented at making food.\"\nmsgstr \"那是因为我知道最终的结果应该是什么，他在做食物方面也很有天赋。\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_11_text_2\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(11).EndingLogic.Texts(2).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(11).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(11).EndingLogic.Texts(2).Texts\nmsgctxt \"EndScreen\"\nmsgid \"<Quote> ‘That is because I know exactly what the final result should be’</> he explained.\"\nmsgstr \"<Quote> ‘那是因为我知道最终的结果是什么’</> 他说道。\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_11_text_3\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(11).EndingLogic.Texts(3).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(11).EndingLogic.Texts(3).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(11).EndingLogic.Texts(3).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Later he opened a restaurant which soon became really popular.\"\nmsgstr \"后来他开了一家餐馆，很快就大受欢迎。\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_11_text_4\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(11).EndingLogic.Texts(4).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(11).EndingLogic.Texts(4).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(11).EndingLogic.Texts(4).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Some say mostly because he hired Pipe Walkers to serve the meal and for marketing purposes.\"\nmsgstr \"有些人说，这主要是因为一来他雇了一些管道行走者来布置餐品，二来出于营销的目的。\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_12_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(12).EndingLogic.Texts(0).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(12).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(12).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Monk decided to stay in the Ruined Realm.\"\nmsgstr \"修道士决定留在毁灭王国。\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_12_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(12).EndingLogic.Texts(1).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(12).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(12).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"<Quote>‘Even if it was not enough I did all I could. I’m done.’</> he said.\"\nmsgstr \"<Quote>“即使这还不够，但我已经做了我所能做的。我完成了。” < / >他说。\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_12_text_2\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(12).EndingLogic.Texts(2).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(12).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(12).EndingLogic.Texts(2).Texts\nmsgctxt \"EndScreen\"\nmsgid \"He sat down on a mountaintop and started meditating.\"\nmsgstr \"他坐在山顶上开始冥想。\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_13_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(13).EndingLogic.Texts(0).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(13).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(13).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"A few weeks later he realized that even though he failed his quest he still should do something.\"\nmsgstr \"几个星期后，他意识到，即使他所追寻的东西失败了，他仍然应该做些什么。\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_13_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(13).EndingLogic.Texts(1).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(13).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(13).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"<Quote>‘Due to my training I can resist Ruin’</> he thought. <Quote>‘No one has ever seen what’s there where Ruin destroyed the lands. If I train harder I might be able to get closer to Ruin to see what it really is.’</>\"\nmsgstr \"<Quote>‘由于我接受过训练，所以我能抵抗毁灭’</> 他如此想着。 <Quote>‘没有人见过那里有什么，那里的土地被摧毁了。如果我更努力地训练，我可能会离毁灭更近一些，看看它到底是什么。’</>\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_13_text_2\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(13).EndingLogic.Texts(2).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(13).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(13).EndingLogic.Texts(2).Texts\nmsgctxt \"EndScreen\"\nmsgid \"He kept on practising and soon set out on a journey into the heart of Ruin to find answers to questions even he didn’t know.\"\nmsgstr \"他继续着，很快就踏上了通往毁灭之心的旅程，去寻找那些连他自己都不知道的问题答案。\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_14_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(14).EndingLogic.Texts(0).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(14).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(14).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Lory and Gnory suddenly found themselves in a world full of possible customers.\"\nmsgstr \"劳里和格诺里突然发现他们所处的世界中到处都是潜在客户。\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_14_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(14).EndingLogic.Texts(1).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(14).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(14).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Of course it didn’t mean they stopped arguing on who undermined whose business but finally they both had the chance to run a successful trading company.\"\nmsgstr \"当然，这并不意味着他们不再争论谁破坏了谁的生意，但最终他们都有机会经营一家成功的贸易公司。\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_15_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(15).EndingLogic.Texts(0).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(15).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(15).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Gnory specialized himself in selling medicine which were said to heal the sickness which was spreading as Ruin reached closer.\"\nmsgstr \"格诺里专门卖药，据说这种药可以治疗随着毁灭的临近而扩散的疾病。\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_15_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(15).EndingLogic.Texts(1).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(15).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(15).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Lory specialized in medicine which were said to heal the sickness which was caused by the medicine of Gnory.\"\nmsgstr \"劳里专门研究医学，据说可以治疗由格诺里药物所引发的疾病。\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_16_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(16).EndingLogic.Texts(0).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(16).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(16).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Lory’s herbaria worked out.\"\nmsgstr \"劳里的草药成功了。\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_16_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(16).EndingLogic.Texts(1).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(16).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(16).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Soon she started to sell other medicine and healing devices as well.\"\nmsgstr \"不久，她开始出售其他药物和治疗设备。\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_17_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(17).EndingLogic.Texts(0).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(17).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(17).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"As for Gnory, he decided to sell lots of different things in the City Prison which turned out to be his new home for a while.\"\nmsgstr \"至于格诺里，他决定在城市监狱里卖很多不同的东西，这地方后来成了他的新家。\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_18_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(18).EndingLogic.Texts(0).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(18).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(18).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Fishy didn’t like the medicine business so he left Gnory.\"\nmsgstr \"呆鱼不喜欢研究医学，所以他离开了格诺里。\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_18_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(18).EndingLogic.Texts(1).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(18).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(18).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"He joined Monk for a while to learn the mental training techniques which reserved Monk’s sanity.\"\nmsgstr \"他成为修道士一段时间，学习心理训练技巧，正是这保留了他修道士般的理智。\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_18_text_2\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(18).EndingLogic.Texts(2).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(18).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(18).EndingLogic.Texts(2).Texts\nmsgctxt \"EndScreen\"\nmsgid \"<Quote>‘Fishy think it is important’ </>he said.<Quote> ‘If Monk go to see Ruin, Fishy need to learn it.’</>\"\nmsgstr \"<Quote>‘呆鱼认为这很重要’ </>他说道。<Quote> ‘如果修道士去看毁灭，呆鱼需要把它学会。’</>\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_18_text_3\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(18).EndingLogic.Texts(3).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(18).EndingLogic.Texts(3).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(18).EndingLogic.Texts(3).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Monk accepted Fishy as his apprentice and taught him all that was possible.\"\nmsgstr \"修道士接受了呆鱼做他的徒弟，并尽可能地传授本领给他。\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_18_text_4\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(18).EndingLogic.Texts(4).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(18).EndingLogic.Texts(4).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(18).EndingLogic.Texts(4).Texts\nmsgctxt \"EndScreen\"\nmsgid \"<Quote>‘Now is the time’</> Monk said one day. <Quote>’Go to the Human Realm and prepare the people.’</>\"\nmsgstr \"<Quote>‘时机已到’</> 修道士某天说道. <Quote>’进入人类王国，准备面对人类。’</>\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_19_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(19).EndingLogic.Texts(0).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(19).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(19).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"On his way to the Human Realm Fishy heard a faint excited voice:\"\nmsgstr \"在去人类王国的路上，呆鱼听到一个微弱而兴奋的声音:\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_19_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(19).EndingLogic.Texts(1).Texts\n#. Key:\tUI_EndScreen_entry_16_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(16).EndingLogic.Texts(1).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(19).EndingLogic.Texts(1).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(16).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(16).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(19).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"<Quote>‘Hey there! I’m fed up with microtransactions. Can I go with ya man?’</>\"\nmsgstr \"<Quote>‘嘿! 我受够了微交易。我能和你一起去吗?’</>\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_19_text_2\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(19).EndingLogic.Texts(2).Texts\n#. Key:\tUI_EndScreen_entry_16_text_2\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(16).EndingLogic.Texts(2).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(19).EndingLogic.Texts(2).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(16).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(16).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(19).EndingLogic.Texts(2).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Merch Ant and Fishy soon became best friends and ventured on together.\"\nmsgstr \"蚂蚁和呆鱼很快成为了最好的朋友，一起冒险。\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_1_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(1).EndingLogic.Texts(0).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(1).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(1).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"A few hours later members of the Mage Council arrived along with the city guards.\"\nmsgstr \"几个小时后，法师议会的成员和城市守卫也赶到了。\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_1_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(1).EndingLogic.Texts(1).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(1).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(1).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"The Council claimed that Wizard died in an unfortunate accident, his device could never actually work anyway and Ruin is nothing to fear of.\"\nmsgstr \"协会声称巫师死于一场不幸的事故，他的装置也不可能真正起到作用，另外毁灭也没什么可怕的。\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_1_text_2\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(1).EndingLogic.Texts(2).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(1).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(1).EndingLogic.Texts(2).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Although it was total nonsense Lillian and Scholar was happy that the crowd were taken away from the Castle.\"\nmsgstr \"尽管这完全是胡言乱语，莉莉安和斯考拉还是很高兴这群人被带离了城堡。\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_20_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(20).EndingLogic.Texts(0).Texts\n#. Key:\tUI_EndScreen_entry_17_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(17).EndingLogic.Texts(0).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(20).EndingLogic.Texts(0).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(17).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(17).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(20).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"The World was still about to end, but as one Pipe Walker wisely said:\"\nmsgstr \"世界即将毁灭，正如一位明智的管道行走者所说的那样:\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_21_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(21).EndingLogic.Texts(0).Texts\n#. Key:\tUI_EndScreen_entry_18_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(18).EndingLogic.Texts(0).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(21).EndingLogic.Texts(0).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(18).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(18).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(21).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"As some stories ended some new ones begun. Though what happened afterwards is not yet known.\"\nmsgstr \"一些故事的结束，意味着其它新故事的开始。虽然后面会发生什么目前还无所知晓。\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_2_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(2).EndingLogic.Texts(0).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(2).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(2).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"When they were left alone they quickly started the evacuation of the Ruined Realm.\"\nmsgstr \"当只剩下他们的时候，他们迅速开始撤离毁灭王国。\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_3_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(3).EndingLogic.Texts(0).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(3).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(3).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Even though she lost her father Lillian couldn’t afford to let sadness overcome her.\"\nmsgstr \"即使莉莉安失去了父亲，她也不能让自己被悲伤打倒。\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_3_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(3).EndingLogic.Texts(1).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(3).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(3).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Ruin was more of a threat now than ever before, and since the Mage Council didn’t believe in Ruin it was the task of Lillian and Scholar to repair the device.\"\nmsgstr \"现在的毁灭比以往任何时候都是一个威胁，因为法师议会不相信毁灭，所以维修这个装置变成了莉莉安和学者的任务。\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_4_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(4).EndingLogic.Texts(0).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(4).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(4).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Scholar was really proud of Lillian because she managed to save time for the evacuation.\"\nmsgstr \"斯考拉真的为莉莲感到骄傲，因为她设法并成功地节省了疏散的时间。\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_4_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(4).EndingLogic.Texts(1).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(4).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(4).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"<Quote>‘I know Wizard would have disagreed but you did the right thing. We still have time to face Ruin. We couldn’t let everyone die there.’</>\"\nmsgstr \"<Quote>‘我知道巫师会反对，但你做了正确的事。我们还有时间面对毁灭。我们不能让所有人都死在那里。’</>\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_5_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(5).EndingLogic.Texts(0).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(5).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(5).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"As time passed Scholar started to behave a bit odd which made Lillian really anxious.\"\nmsgstr \"随着时间的流逝， 斯考拉表现得有点古怪，这让莉莉安很担心。\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_5_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(5).EndingLogic.Texts(1).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(5).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(5).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Ruin was close and the solution was still far away.\"\nmsgstr \"毁灭近在咫尺，解决之道遥遥无期。\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_5_text_2\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(5).EndingLogic.Texts(2).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(5).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(5).EndingLogic.Texts(2).Texts\nmsgctxt \"EndScreen\"\nmsgid \"When she talked about her concerns to Raven, the bird said:\"\nmsgstr \"当她向乌鸦诉说她的苦恼时，这只鸟儿说道：\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_5_text_3\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(5).EndingLogic.Texts(3).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(5).EndingLogic.Texts(3).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(5).EndingLogic.Texts(3).Texts\nmsgctxt \"EndScreen\"\nmsgid \"<Quote>‘Focus on what you are doing Lillian. He was a bit odd anyway.’</>\"\nmsgstr \"<Quote>“专注于你自己的事就行，莉莉安。他一直有点古怪。”</>\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_6_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(6).EndingLogic.Texts(0).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(6).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(6).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"To the surprise of many Teachy turned out to be an excellent researcher.\"\nmsgstr \"令许多人吃惊的是，老师原来是一位优秀的研究员。\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_6_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(6).EndingLogic.Texts(1).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(6).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(6).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"<Quote>‘To be honest I never wanted to be a teacher’ </>he said. <Quote>‘I only stayed at University so that I can do some more research work. But my students never let me research during lectures.’</>\"\nmsgstr \"<Quote>“说实话，我从来就不想当老师” </>他说:<Quote>“老实说，我从来不想当老师。我留在大学只是为了能做更多的研究工作。但我的学生从来不让我在课堂上做研究。”</>\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_6_text_2\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(6).EndingLogic.Texts(2).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(6).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(6).EndingLogic.Texts(2).Texts\nmsgctxt \"EndScreen\"\nmsgid \"He joined Lillian and dug into every book he could possibly find on the Ancient’s technology.\"\nmsgstr \"他和莉莉安一起，翻遍了所有他能找到的关于古代科技的书。\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_7_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(7).EndingLogic.Texts(0).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(7).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(7).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"The new environment and being a bit further from Ruin made good to the Gate Keeper.\"\nmsgstr \"新环境离毁灭还有一段距离，这对守护者来说是件好事。\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_7_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(7).EndingLogic.Texts(1).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(7).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(7).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"He organized some of the cleaners to repair the Castle so that Lillian can keep on with her work.\"\nmsgstr \"他组织了一些清洁工来修理城堡，这样莉莉安就可以继续她的工作了。\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_7_text_2\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(7).EndingLogic.Texts(2).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(7).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(7).EndingLogic.Texts(2).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Later he started to remember things from the Runic Realm which helped Lillian a lot.\"\nmsgstr \"后来，他开始记起了符文王国的事情，这对莉莉安帮助很大。\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_8_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(8).EndingLogic.Texts(0).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(8).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(8).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"One day a Pipe Walker, who had been in many cages mentioned that she met some kobolds far away who might be other survivors of the Kobold Chef’s tribe.\"\nmsgstr \"有一天，一个曾经被关在许多笼子里的吹笛子的人提到，她在很远的地方遇到了一些地精，它们可能是地精厨师部落的幸存者。\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_9_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(9).EndingLogic.Texts(0).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(9).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(9).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Hearing this news made Kobold Chef really excited.\"\nmsgstr \"听到这个消息，地精厨师非常兴奋。\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_9_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(9).EndingLogic.Texts(1).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(9).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(9).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"He decided to return to the Ruined Realm and search for his lost relatives.\"\nmsgstr \"他决定回到毁灭王国去寻找他失踪的亲人。\"\n\n#. Key:\tSoAct1_EG_AAFirstDroneTrio_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Drones were even more intelligent than Maintainers. They not only memorized texts, they helped correct grammar, changed the message if it was too insulting or even made up poems if they were asked to do so.\"\nmsgstr \"无人机甚至比维修工更聪明。它们不仅能记忆课文，还能帮助纠正语法错误，如果文字信息有所冒犯，它们还能修改信息，如果有需要，他们甚至还能编写诗句。\"\n\n#. Key:\tSoAct1_EG_AAFirstDroneTrio_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"The Flying Three\"\nmsgstr \"飞行三重奏\"\n\n#. Key:\tSoAct1_EG_AfterGateCleaners_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Citizens of Cerulean requested to have their own unique Golems, but it was always rejected. This situation was very good for the Black Golem Market, because this way it was always easy to find customers.\"\nmsgstr \"蔚蓝之城的市民要求拥有自己独特的机器人，但总是遭到拒绝。这种情况对地下机器人市场非常有利，因为客户总是源源不断。\"\n\n#. Key:\tSoAct1_EG_AfterGateCleaners_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Cleaners of Cerulean\"\nmsgstr \"蔚蓝之城的清洁工\"\n\n#. Key:\tSoAct1_EG_AfterGateElits_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"The Runic Realm's Government didn't allow the Golems to become the privilege of the rich. Even though the elite were not allowed to have different Golems they always found a way to make their servants different than the ones owned by the poor.\"\nmsgstr \"符文王国的政府不允许机器人成为富人的特权。尽管精英们不允许拥有不同的机器人，但他们总能找到一种方法，让他们的仆人与穷人的仆人不同。\"\n\n#. Key:\tSoAct1_EG_AfterGateElits_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Capetainers\"\nmsgstr \"披肩训练者\"\n\n#. Key:\tSoAct1_EG_AGRightFromPortal_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"'Just keep cleaning! Cleaning, cleaning...'\"\nmsgstr \"“打扫！打扫、打扫……”\"\n\n#. Key:\tSoAct1_EG_AGRightFromPortal_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Cleaner Invasion\"\nmsgstr \"清洁者侵入\"\n\n#. Key:\tSoAct1_EG_AGTestStoneCircle_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"The Black Golem Market was funded by a Golem Maker apprentice who failed his master exam and was banished from school. No wonder his golems were... unique.\"\nmsgstr \"地下机器人市场是由一个机器人制造者出资建造的，他没有通过考试，被学校开除了。难怪他的机器人… 是那么独特。\"\n\n#. Key:\tSoAct1_EG_AGTestStoneCircle_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Weird Golems\"\nmsgstr \"奇怪的机器人\"\n\n#. Key:\tSoAct1_EG_AGWallJumpTeam_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"The cleaning plan for this area fell apart with the participants.\"\nmsgstr \"这个地区的清洁计划因参与者而失败了。\"\n\n#. Key:\tSoAct1_EG_AGWallJumpTeam_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"The North Team\"\nmsgstr \"北方团队\"\n\n#. Key:\tSoAct1_EG_ArcadeDungeonCleaners_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"The Golem's behaviour was specified by the Golem Makers. Only very simple personalities were made at the beginning. The Cleaners, for example, only desired to keep the place tidy and make sure they don't harm the people.\"\nmsgstr \"机器人的行为是由机器人制造者特定的。一开始，只有非常简单的人格被创造出来。例如，清洁工只被用于保持地方整洁，确保他们不会伤害人类。\"\n\n#. Key:\tSoAct1_EG_ArcadeDungeonCleaners_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Arcade Cleaners\"\nmsgstr \"回廊清洁工\"\n\n#. Key:\tSoAct1_EG_ArcadeDungeonExit_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"After creating intelligence Golem Makers wanted even more. They wanted complex personality. They wanted Golems that can not only think but also feel. That was the idea behind designing the Gatekeepers.\"\nmsgstr \"光有智能不够，机器人制造者想要更多。他们希望机器人拥有复杂的个性。他们想要的是既能思考又能感知的机器人。这就是设计“守护者”背后的想法。\"\n\n#. Key:\tSoAct1_EG_ArcadeDungeonExit_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Arcade Servants\"\nmsgstr \"回廊的侍者\"\n\n#. Key:\tSoAct1_EG_ArcadeDungeonOptional_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"You might wonder if a Vacuum Cleaner is designed to clean dust away why does it need a laser caster?\"\nmsgstr \"你可能会想，如果吸尘器是用来除尘的，那为什么还需要激光施放者呢？\"\n\n#. Key:\tSoAct1_EG_ArcadeDungeonOptional_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Vacuum Cleaners group\"\nmsgstr \"真空吸尘器集团\"\n\n#. Key:\tSoAct1_EG_ArcadeMaintainers_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"The very first Golems were made to do the most monotonic work so that people have more time to think and to create. Once they were friendly but as Ruin came their behaviour changed.\"\nmsgstr \"首批机器人是用来做最单调的工作，这样人们就有更多的时间去思考和创造。他们一度很友好，但随着毁灭的到来，他们的行为发生了改变。\"\n\n#. Key:\tSoAct1_EG_ArcadeMaintainers_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Arcade Cleaner Golems\"\nmsgstr \"回廊清洁机器人\"\n\n#. Key:\tSoAct1_EG_Chest_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"The poor chest was minding his own business before you started to insult him.\"\nmsgstr \"在你开始侮辱那个可怜的家伙之前，它在忙自己的事。\"\n\n#. Key:\tSoAct1_EG_Chest_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Chest\"\nmsgstr \"宝箱\"\n\n#. Key:\tSoAct1_EG_GGMiniBoss_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Maybe it only depends on the creation process, but some Golems had stronger personality. In general, Golems with more intelligence resisted Ruin longer and Golems with strong personality were more vulnerable to the infection.\"\nmsgstr \"也许这只取决于创造的过程，但有些机器人有更强的个性。一般来说，高智商的机器人抵抗毁灭的时间更长，个性强的机器人更容易受到感染。\"\n\n#. Key:\tSoAct1_EG_GGMiniBoss_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Wickeds\"\nmsgstr \"恶劣\"\n\n#. Key:\tSoAct1_EG_LoneDrone_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Drones delivered messages and gifts before Ruin. People were happy when they heard them approaching back then.\"\nmsgstr \"无人机在毁灭跟前传递信息和礼物。当人们听到他们回来的时候都很高兴。\"\n\n#. Key:\tSoAct1_EG_LoneDrone_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Lone Drone\"\nmsgstr \"孤独的无人机\"\n\n#. Key:\tSoAct1_EG_LoneSewerDrone_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"After Ruin most Golems liked to group together. Only a few chose to stay alone.\"\nmsgstr \"在毁灭之后，大多数的机器人喜欢聚集在一起。只有少数选择独自生活。\"\n\n#. Key:\tSoAct1_EG_LoneSewerDrone_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Another Lone Drone\"\nmsgstr \"另一架孤独的无人机\"\n\n#. Key:\tSoAct1_EG_MaceGroup_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"'Attention: our enemies greatest weapon, the holy Mace is stolen. We truly should have destroyed it as the Council suggested.'\"\nmsgstr \"“注意: 我们敌人最厉害的武器 - 神圣的权杖被偷走了。我们真应该按照协会的建议把它毁掉。”\"\n\n#. Key:\tSoAct1_EG_MaceGroup_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Mace Defenders\"\nmsgstr \"拐杖防御者\"\n\n#. Key:\tSoAct1_EG_MaintainerInvestigatorInvestigators_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"After Ruin, Golems started to have strange behavior. There were a group of them who used the pipes to flood a part of the City. Later these places were called the Sewer.\"\nmsgstr \"毁灭之后，机器人开始有奇怪的行为。有一群机器人用管道将城市的一部分淹没。后来这些地方被称为下水道。\"\n\n#. Key:\tSoAct1_EG_MaintainerInvestigatorInvestigators_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Pipe Golems\"\nmsgstr \"管道机器人\"\n\n#. Key:\tSoAct1_EG_MaintainerInvestigators_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Not only the Golems were created by using the Spirits of the Unknown World before Ruin. People found other ways of using this new technology. They created pipes to convey hot water to heat the city and cold water to drink.\"\nmsgstr \"不仅仅是机器人是在毁灭前利用未知世界的灵魂创造出来的。人们找到了使用这项新技术的其他方法。他们建造了管道，将热水输送给城市供暖，将冷水输送给城市饮用。\"\n\n#. Key:\tSoAct1_EG_MaintainerInvestigators_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Maintainers of the Pipes\"\nmsgstr \"管道的维修工\"\n\n#. Key:\tSoAct1_EG_SABeforeWallJump_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Some believed cold can resist Ruin longer than magic. They created places where they kept the temperature beneath the freezing point. As it turned out, not even coldness can resist Ruin forever.\"\nmsgstr \"有些人相信寒冷比魔法更能抵抗毁灭。他们创造了将温度保持在冰点以下的地方。事实证明，即使是寒冷也无法永远抵御毁灭。\"\n\n#. Key:\tSoAct1_EG_SABeforeWallJump_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Cleaners of the Refrigerator.\"\nmsgstr \"冰箱清洁者。\"\n\n#. Key:\tSoAct1_EG_SAFightMustHave_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"'We won't clear anymore!' said the rebel Maintainer.\\r\\n'Let's declear War!'\"\nmsgstr \"\"\n\n#. Key:\tSoAct1_EG_SAFightMustHave_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Underground Cleaner Band\"\nmsgstr \"地下清洁乐队\"\n\n#. Key:\tSoAct1_EG_SAFightOptional_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"'Let's make something clear. Maybe this room?'\"\nmsgstr \"“让我们来弄清楚。也许是这个房间?”\"\n\n#. Key:\tSoAct1_EG_SAFightOptional_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Underground Cleaner Band B\"\nmsgstr \"地下清洁乐队 B\"\n\n#. Key:\tSoAct1_EG_SewerCircleVacuumCleaners_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"People realised that Golem's Spirits have a power beyond imagination. They called it the Ancient Magic. Vacuum Cleaners could use this magic to do their job even better.\"\nmsgstr \"人们意识到机器人的精神有着超乎想象的力量。他们称之为古代魔法。真空吸尘器可以利用这种魔法更好地工作。\"\n\n#. Key:\tSoAct1_EG_SewerCircleVacuumCleaners_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Vacuum Cleaners\"\nmsgstr \"真空吸尘器\"\n\n#. Key:\tSoAct1_EG_SewerTeam_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Golem Makers wanted to create something more intelligent as they learned more. They shaped the Maintainers, the first golems capable of talking. Sadly their intelligence vanished as Ruin came.\"\nmsgstr \"当机器人制造者学到更多的时候，他们想要创造一些更智能的东西。他们塑造了维修者，也就是第一批会说话的机器人。不幸的是，随着毁灭的来临，他们的智慧消失了。\"\n\n#. Key:\tSoAct1_EG_SewerTeam_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Sewer Golems\"\nmsgstr \"下水道机器人\"\n\n#. Key:\tSoAct1_EG_TL_VacuumTwins_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Libraries were important in the life of the former Realm's citizens. No wonder that many of the golems were created only to dust and organize the books.\"\nmsgstr \"图书馆在以前王国市民的生活中很重要。难怪许多机器人被创造出来只是为了打扫和整理书籍。\"\n\n#. Key:\tSoAct1_EG_TL_VacuumTwins_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Library Cleaners\"\nmsgstr \"图书馆清洁工\"\n\n#. Key:\tSoAct1_EG_TLSewerCreatureWatch_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Golems never ever attacked the Pipe Walkers. The reason is only known by the wisest Pipe Walker himself. It is because, as he explained: 'Nun dara bum, tuk la.'\"\nmsgstr \"机器人从来没有攻击过管道行走者。这个原因只有最聪明的管道行走者自己知道。正如他所解释的那样，这是因为:“Nun dara bum， tuk la。”\"\n\n#. Key:\tSoAct1_EG_TLSewerCreatureWatch_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Sewer Team B\"\nmsgstr \"下水道B队\"\n\n#. Key:\tSoAct1_EG_TowerTrio_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"They spent most of their time on the top of those towers - it was clear to me that they would die there as well.\"\nmsgstr \"他们大部分时间都呆在那些塔的顶端——我很清楚他们也会死在那里。\"\n\n#. Key:\tSoAct1_EG_TowerTrio_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"The Tower Trio\"\nmsgstr \"塔之三重奏\"\n\n#. Key:\tSoAct2_EG_BounceTrio_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Lava Jumpers are former Golems who fell into the lava. Some of them return to join their former Golem companions.\"\nmsgstr \"熔岩跳跃者是落入熔岩的前机器人。他们中的一些回到了以前的伙伴那里。\"\n\n#. Key:\tSoAct2_EG_BounceTrio_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Bounce Trio\"\nmsgstr \"弹跳三重奏\"\n\n#. Key:\tSoAct2_EG_C_BeforeKey_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"It's still unclear what makes some creatures touched by Ruin to group together. Some believes those who had similar emotions when Ruin came were likely to form a group.\"\nmsgstr \"目前还不清楚是什么原因使得一些被毁灭触碰过的生物聚集在一起。一些人认为，当毁灭来临的时候，那些有类似情绪的家伙可能会形成一个群体。\"\n\n#. Key:\tSoAct2_EG_C_BeforeKey_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Anxious Armours\"\nmsgstr \"焦虑的铠甲\"\n\n#. Key:\tSoAct2_EG_C_Bridge_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Crafting was always the obsession of Dwarves. In their workshops they forged mighty weapons and wondrous armours. Their love for their craft was so strong that instead of their body, Ruin preserved their iron works.\"\nmsgstr \"地精一直痴迷于手工艺。在他们的工坊里，它们制造了强大的武器和神奇的盔甲。它们对自己手艺的热爱是如此强烈，以至于它们的铁制品没有被毁灭，反而被保存了下来。\"\n\n#. Key:\tSoAct2_EG_C_Bridge_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Bridge Brigade\"\nmsgstr \"桥上部队\"\n\n#. Key:\tSoAct2_EG_C_LoneShadeSphere_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Before Ruin there was no other humanoid race but human. New races are created by Ruin's Shades. They roam the lands looking for any living being which they can possess. Once they become part of a creature its body will start to change.\"\nmsgstr \"在毁灭之前没有其他类人种族，只有人类。毁灭阴影创造了新的种族。他们四处流浪，寻找任何他们可以拥有的生物。一旦它们成为生物的一部分，它的身体就会开始改变。\"\n\n#. Key:\tSoAct2_EG_C_LoneShadeSphere_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Weird Floating Thing\"\nmsgstr \"奇怪的飘浮物\"\n\n#. Key:\tSoAct2_EG_C_OfficeGuards_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Watching the only way to the Office did not bring enough protection. If any intruder managed to pass the Patrols he still had to face the Guardians to proceed.\"\nmsgstr \"监视通向办公室的唯一道路并没有带来足够的保护。如果有任何入侵者设法通过巡逻队，他仍然不得不面对守卫者继续前进。\"\n\n#. Key:\tSoAct2_EG_C_OfficeGuards_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Guardians of the Law\"\nmsgstr \"法律守护者\"\n\n#. Key:\tSoAct2_EG_C_OfficePatrols_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Going into the Law's High Office was forbidden even for most of the Dwarves. Only one path lead to the Office and that was guarded by the Patrols.\"\nmsgstr \"即使对大多数地精来说，进入法律界高层办公室也是被禁止的。只有一条路通向办公室，由巡逻队把守。\"\n\n#. Key:\tSoAct2_EG_C_OfficePatrols_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Patrols of the Law\"\nmsgstr \"执法巡逻\"\n\n#. Key:\tSoAct2_EG_DG_Left_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Deep beneath the Catacombs there is a secret place called the Dwarven Gate. Elite dwarves who worked here were placed above the Law. They were seeking a way to fight Ruin with Ruin's magic.\"\nmsgstr \"在地下墓穴的深处有一个秘密的地方，叫做地精之门。在这里工作的精英地精凌驾于法律之上。他们在寻找一种借助毁灭魔法与毁灭作斗争的方法。\"\n\n#. Key:\tSoAct2_EG_DG_Left_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Glorious Group\"\nmsgstr \"光荣小分队\"\n\n#. Key:\tSoAct2_EG_DG_RightFloor_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Even though most of the common Dwarves never even heard about Dwarven Gate some were needed to do the hard work. Now that Ruin won, Dwarves are finally equal.\"\nmsgstr \"尽管大多数普通的地精甚至从未听说过地精之门，但还是需要一些人来做这些艰苦的工作。现在毁灭赢了，地精们终于平等了。\"\n\n#. Key:\tSoAct2_EG_DG_RightFloor_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Not so Elite Dwarves\"\nmsgstr \"不是精英地精\"\n\n#. Key:\tSoAct2_EG_DG_RightUpOptional_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"One idea of the Elite Dwarves was to create giant statues which are able to trap Ruin's essence. Even if they were right they never managed to make enough sculptures.\"\nmsgstr \"精英地精的一个想法是创造出巨大的雕像，这些雕像能够抓住毁灭的本质。即使他们是对的，他们也没能做出足够多的雕塑。\"\n\n#. Key:\tSoAct2_EG_DG_RightUpOptional_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Sculptors\"\nmsgstr \"雕刻家\"\n\n#. Key:\tSoAct2_EG_DwarfBoss_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Dwarven Statues were meant to imprison the essence of Ruin. However there were some Dwarven scientists who feared that the statues were not safe and in the long run they wouldn't be able to resist the power of Ruin...\"\nmsgstr \"地精雕像是用来囚禁毁灭精华的。然而，也有一些地精科学家担心这些雕像不安全，从长远来看，它们将无法抵抗毁灭的力量……\"\n\n#. Key:\tSoAct2_EG_DwarfBoss_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Dwarven Statue\"\nmsgstr \"地精雕像\"\n\n#. Key:\tSoAct2_EG_GolemFirst_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Stone Golems are the cheap copies of the Runic Realm Golems. If Ruin twists the creatures mind then it will definitely have no effect on these ones.\"\nmsgstr \"石制机器人是廉价的符文王国机器人的复制品。如果毁灭扭曲了这些生物的思想，那么它肯定不会对这些生物产生影响。\"\n\n#. Key:\tSoAct2_EG_GolemFirst_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Sphere Golem\"\nmsgstr \"球形机器人\"\n\n#. Key:\tSoAct2_EG_GolemSecond_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Looks like the second try is just as bad as the first one.\"\nmsgstr \"看来第二次和第一次一样糟糕。\"\n\n#. Key:\tSoAct2_EG_GolemSecond_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Second Sphere Golem\"\nmsgstr \"第二个球形机器人\"\n\n#. Key:\tSoAct2_EG_GolemThird_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Whoever made this Golem, he should have stopped after the second try.\"\nmsgstr \"无论谁制造了这个机器人，他应该在第二次尝试后就收手。\"\n\n#. Key:\tSoAct2_EG_GolemThird_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Third Sphere Golem\"\nmsgstr \"第三个球形机器人\"\n\n#. Key:\tSoAct2_EG_HutFishies_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Now that the Fishys are gone, the Lake's piranhas can live in peace and eat whoever comes close.\"\nmsgstr \"现在呆鱼都走了，湖里的食人鱼可以平静地生活，谁靠近都可以吃掉谁。\"\n\n#. Key:\tSoAct2_EG_HutFishies_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Abandoned Fishy Slaves\"\nmsgstr \"被抛弃的呆鱼奴隶\"\n\n#. Key:\tSoAct2_EG_HutFlyArmy_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"No one knows where the Flies came from. Although you have a very clear idea on where they should go...\"\nmsgstr \"没有人知道苍蝇是从哪里来的。虽然你很清楚它们应该去哪里……\"\n\n#. Key:\tSoAct2_EG_HutFlyArmy_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Annoying Flies\"\nmsgstr \"讨厌的苍蝇\"\n\n#. Key:\tSoAct2_EG_LavaBoss_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Armour Wrath was the most ambitious and majestic work of the Golem Maker. He used all his remaining strength to create this mighty Golem. It's a pity that all his efforts were in vain.\"\nmsgstr \"铠甲之怒是机器人制造者最具野心、最宏伟的作品。他用所有剩余的力量创造了这个强大的机器人。真遗憾，他所有的努力都白费了。\"\n\n#. Key:\tSoAct2_EG_LavaBoss_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Armour Wrath\"\nmsgstr \"铠甲之怒\"\n\n#. Key:\tSoAct2_EG_LavaDeepTeam_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"A fourth Sphere Golem? Someone never gives up...\"\nmsgstr \"第四个球形机器人？总有人不轻言放弃...\"\n\n#. Key:\tSoAct2_EG_LavaDeepTeam_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Fourth Sphere Golem\"\nmsgstr \"第四个球形机器人\"\n\n#. Key:\tSoAct2_EG_LavaJumpers_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"When a Golem falls into the lava its stone body will melt away. The spirit however resists the heat and will be looking for another body...\"\nmsgstr \"当一个机器人掉入熔岩中时，它的石头身体就会融化。然而灵魂会抵抗热量，将寻找另一个身体…\"\n\n#. Key:\tSoAct2_EG_LavaJumpers_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Lava Jumpers\"\nmsgstr \"熔岩跳跃者\"\n\n#. Key:\tSoAct2_EG_LavaTeamX_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Divided they fall, united they divide...\"\nmsgstr \"分裂就会垮台，团结就会分裂……\"\n\n#. Key:\tSoAct2_EG_LavaTeamX_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Golem Group\"\nmsgstr \"机器人小分队\"\n\n#. Key:\tSoAct2_EG_LavaTrio_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Wherever Golems go after death these three will go there together.\"\nmsgstr \"不管机器人死后去哪里，他们三个都会一起去。\"\n\n#. Key:\tSoAct2_EG_LavaTrio_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Golem Trio\"\nmsgstr \"机器人三重奏\"\n\n#. Key:\tSoAct2_EG_OutpostLeft_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"To keep Ruin away dwarves forbade everything related to Ruin's magic. This might have worked in theory but they failed to notice that their mechanical devices were also powered by Ruin.\"\nmsgstr \"为了避开毁灭，地精们禁止一切与毁灭魔法有关的东西。这在理论上可能行得通，但它们没有意识到，它们的机械设备也是由毁灭提供动力的。\"\n\n#. Key:\tSoAct2_EG_OutpostLeft_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Guardians of the West Wall\"\nmsgstr \"西墙守护者\"\n\n#. Key:\tSoAct2_EG_OutpostRight_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Ruin was not only meant for destruction, it could also preserve. Ruin gave endless life for those who survived at the cost of twisting their minds.\"\nmsgstr \"毁灭不仅带来摧毁，它还会保存。毁灭给了那些以扭曲思想为代价生存下来的人无尽的生命。\"\n\n#. Key:\tSoAct2_EG_OutpostRight_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Guardians of the East Wall\"\nmsgstr \"东墙守护者\"\n\n#. Key:\tSoAct2_EG_OutpostWallFirst_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Dwarves fought Ruin with Rules. These soldiers were ordered here to guard the Outpost. Their will to obey the order was so strong that even death couldn't break it.\"\nmsgstr \"地精们使用规则来对抗毁灭。这些士兵奉命在这里守卫前哨。他们服从命令的意志是如此强烈，即使死亡也无法阻止他们。\"\n\n#. Key:\tSoAct2_EG_OutpostWallFirst_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Patrols of the Outpost Wall\"\nmsgstr \"前哨墙的巡逻队\"\n\n#. Key:\tSoAct2_EG_Shore_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"After Ruin turned them into Monsters some creatures gathered together. Whether it's the effect of Ruin or something from their former life is unclear.\"\nmsgstr \"在毁灭把它们变成怪物之后，有一些生物聚集在一起。这是毁灭造成的还是他们曾经生活中的某些东西导致的尚不清楚。\"\n\n#. Key:\tSoAct2_EG_Shore_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Shore Monsters\"\nmsgstr \"海岸怪物\"\n\n#. Key:\tSoAct2_EG_SlideFishyTeam_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Fishys were produced by the Great Kobold tribe for slaves. Some of them managed to escape, but they couldn't go far from the Lake.\"\nmsgstr \"呆鱼是伟大的地精部落为奴隶生产的。它们中的一些设法逃走了，但没法离湖太远。\"\n\n#. Key:\tSoAct2_EG_SlideFishyTeam_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Deserter Fishys\"\nmsgstr \"逃兵鱼\"\n\n#. Key:\tSoAct2_EG_SlidePathEnd_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Deserter Fishys always kept a Fishy group close to the exit of their secret hideout. They protected the others and watched the kobolds to find the right time to venture back to the Lake.\"\nmsgstr \"逃兵鱼总是把一群鱼放在它们秘密藏身处的出口附近。它们保护着其他的地精，看着他们寻找合适的时间冒险回到湖边。\"\n\n#. Key:\tSoAct2_EG_SlidePathEnd_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Patrol Fishys\"\nmsgstr \"巡逻鱼\"\n\n#. Key:\tSoAct2_EG_WormHole_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Worms kept distance from each other before Ruin. It's strange how a force which tears everything apart can also unite.\"\nmsgstr \"蠕虫在毁灭前彼此保持距离。奇怪的是，一股撕裂一切的力量也能团结起来。\"\n\n#. Key:\tSoAct2_EG_WormHole_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Worms\"\nmsgstr \"蠕虫\"\n\n#. Key:\tSoAct2_EG_Wormy_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"There was a time when Worms only made damage to fields and gardens. Now they are a bit more ambitious...\"\nmsgstr \"曾经有一段时间，蠕虫只会破坏农田和花园。现在它们的野心更大了……\"\n\n#. Key:\tSoAct2_EG_Wormy_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Worm\"\nmsgstr \"蠕虫\"\n\n#. Key:\tSoAct2_EG_WWBoss_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"When Ruin appeared some decided to abandon civilization and return to nature. Their leader, the Fallen Druid cast an ancient spell to protect his plants from Ruin. His spell partly worked but at a terrible cost.\"\nmsgstr \"当毁灭出现时，一些人决定放弃文明，回归自然。他们的领袖，堕落的德鲁伊施放了一个古老的咒语来保护他的植物免于毁灭。他的咒语部分奏效了，但代价惨重。\"\n\n#. Key:\tSoAct2_EG_WWBoss_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Fallen Druid\"\nmsgstr \"堕落的德鲁伊\"\n\n#. Key:\tSoAct3_EG_Act3BubbleGroundMain_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Ruin's power is not only in destruction. When it can't change something it will preserve those attributes which can prepare the possibility to change again. Ruin's power is in change.\"\nmsgstr \"毁灭的力量不仅在于破坏。当它不能改变某件事时，它会保留那些可以为再次改变做好准备的属性。毁灭的力量在变化。\"\n\n#. Key:\tSoAct3_EG_Act3BubbleGroundMain_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Maintainer Spellcasters\"\nmsgstr \"维修工施法者\"\n\n#. Key:\tSoAct3_EG_Act3FinalBattle_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Even though Ruin doesn't have consciousness nor the ability to think it somehow reacts to your presence. As if it knew the threat you present, Ruin tries all it can to stop you from leaving the Ruined Realm.\"\nmsgstr \"即使毁灭没有意识，也没有能力去思考它对你的存在有什么反应。就好像它知道你的威胁一样，毁灭竭尽所能阻止你离开这个毁灭王国。\"\n\n#. Key:\tSoAct3_EG_Act3FinalBattle_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Ruined Convention\"\nmsgstr \"王国的约定\"\n\n#. Key:\tSoAct3_EG_Act3PipeGroupFirst_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"There is a difference between how Humans and Golems are transformed by Ruin. Human bodies reach their final form in a few decades but Golems never stop changing. There is always a new, more vicious type.\"\nmsgstr \"关于人类和机器人是如何被毁灭转化，这是有区别的。人类的身体在几十年后会达到最后的形态，但是机器人从来不会停止变化。总会有一种新的、更邪恶的类型出现。\"\n\n#. Key:\tSoAct3_EG_Act3PipeGroupFirst_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Red Drones\"\nmsgstr \"红色无人机\"\n\n#. Key:\tSoAct3_EG_Act3PipeGroupSecond_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Transformation is relative to intelligence. Creatures with consciousness have a strong desire to reserve their ego. Ruin can fool them a few times but later they become invulnerable to Ruin's changing power.\"\nmsgstr \"转变与智力有关。有意识的生物有强烈的欲望去保留他们的自我。毁灭可以愚弄他们几次，但后来他们变得坚不可摧的毁灭的变化的力量。\"\n\n#. Key:\tSoAct3_EG_Act3PipeGroupSecond_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"More Drones\"\nmsgstr \"更多的无人机\"\n\n#. Key:\tSoAct3_EG_Act3RangedCleanerTwins_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Ruin's nature is confusing for the human mind. It can build, it can destroy, it can use, it can be used. These actions have the same priority for Ruin. All that matters is that it can do something. And with time it wants more and more.\"\nmsgstr \"毁灭的本性使人困惑。它可以建造，可以摧毁，可以使用，可以被使用。这些行为对于毁灭具有同样的优先级。重要的是它能有所作为。随着时间的推移，它想要的越来越多。\"\n\n#. Key:\tSoAct3_EG_Act3RangedCleanerTwins_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Cleaner Twins\"\nmsgstr \"清洁工双胞胎\"\n\n#. Key:\tSoAct3_EG_Act3VacuumTwins_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Ruin's logic is predictable when you understand its nature. When it's not possible to create more the creation process can be restarted by destroying everything first.\"\nmsgstr \"当你了解了毁灭的本质后，它的逻辑是可预测的。当无法创建更多时，首先可以通过销毁所有内容来重新启动创建过程。\"\n\n#. Key:\tSoAct3_EG_Act3VacuumTwins_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Elite Twins\"\nmsgstr \"精英双胞胎\"\n\n#. Key:\tWhiteWall_EG_AfterKobold_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Creating intelligence was not enough for the Golem Makers. They wanted to get even further. They wanted to create Golems with emotions.\"\nmsgstr \"光给机器人赋予智力对制造者来说是不够的。他们想更进一步，创造出有感情的机器人。\"\n\n#. Key:\tWhiteWall_EG_AfterKobold_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Flying Maintainer\"\nmsgstr \"飞行维修者\"\n\n#. Key:\tWhiteWall_EG_BeforeKobold_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"When the Cataclysm happened and Ruin came the Golems started to change. Instead of doing their daily work some of them turned against their masters.\"\nmsgstr \"当大灾难发生，毁灭来临的时候，机器人开始改变。他们中有些人不再做日常工作，转而开始与他们的主人对着干。\"\n\n#. Key:\tWhiteWall_EG_BeforeKobold_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Infected Golems\"\nmsgstr \"被感染的机器人\"\n\n#. Key:\tWhiteWall_EG_FirstCombat_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Cleaners were the first Golems ever made. Before the Cataclysm they did all the monoton work so that the people had more time to think and to create.\"\nmsgstr \"清洁机器人是第一批制造出来的。在大灾难来临之前，他们完成了所有单调的工作，这样人们就有更多的时间进行思考和创造。\"\n\n#. Key:\tWhiteWall_EG_FirstCombat_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Whitewall Cleaners\"\nmsgstr \"白色巨墙清洁者\"\n\n#. Key:\tWhiteWall_EG_FirstOptionalCombat_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"After the different types of Cleaners, Golem Makers wanted to create something greater than working robots. They started to design creatures with intelligence.\"\nmsgstr \"在生产出不同类型的清洁型机器人后，机器人制造者想要创造出比工作机器人更伟大的东西。他们开始设计具有智力的生物。\"\n\n#. Key:\tWhiteWall_EG_FirstOptionalCombat_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Whitewall Maintainers\"\nmsgstr \"白色巨墙维修者\"\n\n#. Key:\tAbacus_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/Abacus.Abacus.Description\n#: /Game/SO/Items/QuestItems/Abacus.Abacus.Description\nmsgctxt \"ItemData\"\nmsgid \"When you don't have enough fingers to count something you need this abacus.\"\nmsgstr \"计算的时候如果手指不够用，你就需要这个算盘。\"\n\n#. Key:\tAbacus_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/Abacus.Abacus.Name\n#: /Game/SO/Items/QuestItems/Abacus.Abacus.Name\nmsgctxt \"ItemData\"\nmsgid \"Abacus\"\nmsgstr \"算盘\"\n\n#. Key:\tAbacusGhost_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/AbacusGhost.AbacusGhost.Description\n#. /Game/SO/Items/QuestItems/AbacusGhost.AbacusGhost.Description\n#: /Game/SO/Items/QuestItems/AbacusGhost.AbacusGhost.Description\nmsgctxt \"ItemData\"\nmsgid \"When the Abacus is killed its spirit might return to get even with its murderer.\"\nmsgstr \"当算盘被杀死时，它的灵魂可能会回来报复凶手。\"\n\n#. Key:\tAbacusGhost_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/AbacusGhost.AbacusGhost.Name\n#: /Game/SO/Items/QuestItems/AbacusGhost.AbacusGhost.Name\nmsgctxt \"ItemData\"\nmsgid \"Ghost Abacus\"\nmsgstr \"幽灵算盘\"\n\n#. Key:\tAbacusGhostFlower_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/AbacusGhostFlower.AbacusGhostFlower.Description\n#. /Game/SO/Items/QuestItems/AbacusGhostFlower.AbacusGhostFlower.Description\n#: /Game/SO/Items/QuestItems/AbacusGhostFlower.AbacusGhostFlower.Description\nmsgctxt \"ItemData\"\nmsgid \"Petals of a ghost flower.\"\nmsgstr \"幽灵之花的花瓣\"\n\n#. Key:\tAbacusGhostFlower_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/AbacusGhostFlower.AbacusGhostFlower.Name\n#. /Game/SO/Items/QuestItems/AbacusGhostFlower.AbacusGhostFlower.Name\n#: /Game/SO/Items/QuestItems/AbacusGhostFlower.AbacusGhostFlower.Name\nmsgctxt \"ItemData\"\nmsgid \"Ghost Petals\"\nmsgstr \"幽灵花瓣\"\n\n#. Key:\tAbacusSpellBook_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/AbacusSpellBook.AbacusSpellBook.Description\n#. /Game/SO/Items/QuestItems/AbacusSpellBook.AbacusSpellBook.Description\n#: /Game/SO/Items/QuestItems/AbacusSpellBook.AbacusSpellBook.Description\nmsgctxt \"ItemData\"\nmsgid \"An ancient paper\"\nmsgstr \"古老纸张\"\n\n#. Key:\tAbacusSpellBook_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/AbacusSpellBook.AbacusSpellBook.Name\n#. /Game/SO/Items/QuestItems/AbacusSpellBook.AbacusSpellBook.Name\n#: /Game/SO/Items/QuestItems/AbacusSpellBook.AbacusSpellBook.Name\nmsgctxt \"ItemData\"\nmsgid \"Scroll of Surrection\"\nmsgstr \"复活卷轴\"\n\n#. Key:\tAbacusSpellBook_page_0\n#. SourceLocation:\t/Game/SO/Items/QuestItems/AbacusSpellBook.AbacusSpellBook.Pages(0).Pages\n#. /Game/SO/Items/QuestItems/AbacusSpellBook.AbacusSpellBook.Pages(0).Pages\n#: /Game/SO/Items/QuestItems/AbacusSpellBook.AbacusSpellBook.Pages(0).Pages\nmsgctxt \"ItemData\"\nmsgid \"Wisy et al. [3152] point out that any entity can be banished by throwing the proper object into his/her/its face a few times, making him/her/it annoyed thus unconcerned, as long as the target entity has a face.\\r\\n\\r\\nThe proper object in case of ghosts is something Surrected [Inti and Clevi 3153], as only Surrected substance can interact with ghosts.\\r\\n\\r\\nAny object covered with petals of Ghost Flower can be Surrected using the following method:\\r\\n\\r\\n- Say \\\"Sorry my <object name>!\\\"\\r\\n- Break the object into pieces with a heated hammer\\r\\n- Say your favourite color\\r\\n- Croon \\\"La La LaLaLa LaLaLa\\\" until the object is coagulated into a single Surrected object\"\nmsgstr \"Wisy et al. [3152]报告指出，只要目标实体有一张脸，任何实体都可以通过将合适的物体扔到他/她/它的脸上几次而被驱逐，从而使他/她/它从厌烦到麻木。\\r\\n\\r\\n对于幽灵来说，合适的对象是被复活的物体[Inti and Clevi 3153]，因为只有被复活的物体才能与幽灵相互作用。\\r\\n\\r\\n任何被幽灵之花花瓣覆盖的物体都可以用以下方法替代超越物:\\r\\n\\r\\n-说\\\"对不起，我的<object name>!\\\"\\r\\n-用加热的锤子把物体打碎\\r\\n-说出你最喜欢的颜色\\r\\n-低吟“啦啦啦啦啦啦啦啦啦啦啦”“直到物体凝固成一个完整的物体”\"\n\n#. Key:\tAbacusSpellBook_page_1\n#. SourceLocation:\t/Game/SO/Items/QuestItems/AbacusSpellBook.AbacusSpellBook.Pages(1).Pages\n#. /Game/SO/Items/QuestItems/AbacusSpellBook.AbacusSpellBook.Pages(1).Pages\n#: /Game/SO/Items/QuestItems/AbacusSpellBook.AbacusSpellBook.Pages(1).Pages\nmsgctxt \"ItemData\"\nmsgid \"WARNING: not following the instructions exactly leads to failure and also increases the probability of injury and or death [Carfy 3154].\\r\\n\\r\\nREFERENCES:\\r\\n\\r\\nWISY, W., BUSY, B., WEIRDY, Y., AND LUCKY, L. 3152. The best ways to get rid of anyone potentially distracting us with questions like \\\"What do you read?\\\"\\r\\n\\r\\nInti, I., AND Clevi, C. 3153. Insulting dead ancestors using Surrected objects\\r\\n\\r\\nCarfy C. 3154. What happened to Clevi, C. and Inti, I.\"\nmsgstr \"“警告:不遵守说明将导致失败，并增加受伤或死亡的可能性[Carfy 3154]。\\r\\n\\r\\n引用:\\r\\n\\r\\n最好的解决办法就是不要问一些可能会分散我们注意力的问题，比如“你读的书是什么?”\\r\\n\\r\\n用复活侮辱了死去的祖先\\r\\n\\r\\n发生了什么事?”\"\n\n#. Key:\tAll_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/All.All.Description\n#: /Game/SO/Items/QuestItems/All.All.Description\nmsgctxt \"ItemData\"\nmsgid \"Maybe it was a bit too much?\"\nmsgstr \"也许有点过分了?\"\n\n#. Key:\tAll_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/All.All.Name\n#: /Game/SO/Items/QuestItems/All.All.Name\nmsgctxt \"ItemData\"\nmsgid \"Everything, except an Abacus\"\nmsgstr \"除了算盘，什么都没有\"\n\n#. Key:\tArtifact_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/Artifact.Artifact.Description\n#: /Game/SO/Items/QuestItems/Artifact.Artifact.Description\nmsgctxt \"ItemData\"\nmsgid \"A very rare and powerful item which is used for opening a portal into the Unknown Realm. If you gather three and give them to the Wizard he shall set you free.\"\nmsgstr \"一件非常罕见且强大的物品，用于打开进入未知王国的入口。如果你收集到三个，把它们交给巫师，他就会还你自由之身。\"\n\n#. Key:\tArtifact_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/Artifact.Artifact.Name\n#: /Game/SO/Items/QuestItems/Artifact.Artifact.Name\nmsgctxt \"ItemData\"\nmsgid \"Artifact\"\nmsgstr \"手工艺品\"\n\n#. Key:\tAxeMainGame_desc\n#. SourceLocation:\t/Game/SO/Items/Weapons/AxeMainGame.AxeMainGame.Description\n#. Key:\tAxe_desc\n#. SourceLocation:\t/Game/SO/Items/Weapons/Axe.Axe.Description\n#: /Game/SO/Items/Weapons/Axe.Axe.Description\n#: /Game/SO/Items/Weapons/AxeMainGame.AxeMainGame.Description\nmsgctxt \"ItemData\"\nmsgid \"Axes are usefull, but if you don't need them you can just throw them away.\"\nmsgstr \"斧子是有用的，但如果你不需要它们，可以把它们扔掉。\"\n\n#. Key:\tAxeMainGame_name\n#. SourceLocation:\t/Game/SO/Items/Weapons/AxeMainGame.AxeMainGame.Name\n#. Key:\tAxe_name\n#. SourceLocation:\t/Game/SO/Items/Weapons/Axe.Axe.Name\n#: /Game/SO/Items/Weapons/Axe.Axe.Name\n#: /Game/SO/Items/Weapons/AxeMainGame.AxeMainGame.Name\nmsgctxt \"ItemData\"\nmsgid \"Axes\"\nmsgstr \"斧子\"\n\n#. Key:\tBlueCrystal_desc\n#. SourceLocation:\t/Game/SO/Items/Valuable/BlueCrystal.BlueCrystal.Description\n#: /Game/SO/Items/Valuable/BlueCrystal.BlueCrystal.Description\nmsgctxt \"ItemData\"\nmsgid \"An ancient crystal people like to buy.\"\nmsgstr \"人们喜欢买这种古老的水晶。\"\n\n#. Key:\tBlueCrystal_name\n#. SourceLocation:\t/Game/SO/Items/Valuable/BlueCrystal.BlueCrystal.Name\n#: /Game/SO/Items/Valuable/BlueCrystal.BlueCrystal.Name\nmsgctxt \"ItemData\"\nmsgid \"Blue Crystal\"\nmsgstr \"蓝水晶\"\n\n#. Key:\tBlueGem_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/BlueGem.BlueGem.Description\n#: /Game/SO/Items/QuestItems/BlueGem.BlueGem.Description\nmsgctxt \"ItemData\"\nmsgid \"A small precious blue stone.\"\nmsgstr \"一颗小而珍贵的蓝色宝石。\"\n\n#. Key:\tBlueGem_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/BlueGem.BlueGem.Name\n#: /Game/SO/Items/QuestItems/BlueGem.BlueGem.Name\nmsgctxt \"ItemData\"\nmsgid \"Blue Gem\"\nmsgstr \"蓝宝石\"\n\n#. Key:\tDemonSword_desc\n#. SourceLocation:\t/Game/SO/Items/Weapons/DemonSword.DemonSword.Description\n#: /Game/SO/Items/Weapons/DemonSword.DemonSword.Description\nmsgctxt \"ItemData\"\nmsgid \"The mighty sword of Kharutar the Demon Ruler. Legend says he once cut one of his fingers with it and in his rage he broke the sword into two. Later it was reforged but some say it would still need some more fixes.\"\nmsgstr \"恶魔统治者卡鲁塔的利剑。传说他曾经用它割破了自己的一个手指，盛怒之下，他把剑劈成了两半。后来它被重新铸造，但一些人说它需要进一步修复。\"\n\n#. Key:\tDemonSword_name\n#. SourceLocation:\t/Game/SO/Items/Weapons/DemonSword.DemonSword.Name\n#: /Game/SO/Items/Weapons/DemonSword.DemonSword.Name\nmsgctxt \"ItemData\"\nmsgid \"Demon Sword\"\nmsgstr \"恶魔之剑\"\n\n#. Key:\tDOKitchenKey_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/DOKitchenKey.DOKitchenKey.Description\n#: /Game/SO/Items/Keys/DOKitchenKey.DOKitchenKey.Description\nmsgctxt \"ItemData\"\nmsgid \"This is one of the many spare keys of the Dwarven Outpost Kitchen. Being able to get into the kitchen was always very important for dwarves.\"\nmsgstr \"这是地精前哨厨房的备用钥匙之一。能够进入厨房对地精来说总是非常重要的。\"\n\n#. Key:\tDOKitchenKey_name\n#. SourceLocation:\t/Game/SO/Items/Keys/DOKitchenKey.DOKitchenKey.Name\n#: /Game/SO/Items/Keys/DOKitchenKey.DOKitchenKey.Name\nmsgctxt \"ItemData\"\nmsgid \"Kitchen Key\"\nmsgstr \"厨房钥匙\"\n\n#. Key:\tDualBlade_desc\n#. SourceLocation:\t/Game/SO/Items/Weapons/DualBlade.DualBlade.Description\n#: /Game/SO/Items/Weapons/DualBlade.DualBlade.Description\nmsgctxt \"ItemData\"\nmsgid \"In case of trouble, it's better to have double.\"\nmsgstr \"两手准备\"\n\n#. Key:\tDualBlade_name\n#. SourceLocation:\t/Game/SO/Items/Weapons/DualBlade.DualBlade.Name\n#: /Game/SO/Items/Weapons/DualBlade.DualBlade.Name\nmsgctxt \"ItemData\"\nmsgid \"Double Sword\"\nmsgstr \"双剑\"\n\n#. Key:\tElevatorGem_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/ElevatorGem.ElevatorGem.Description\n#. /Game/SO/Items/QuestItems/ElevatorGem.ElevatorGem.Description\n#: /Game/SO/Items/QuestItems/ElevatorGem.ElevatorGem.Description\nmsgctxt \"ItemData\"\nmsgid \"A shiny green crystal which activates a weight lifting mechanism. At least by the look of it.\"\nmsgstr \"一种闪亮的绿色水晶，可以激活起重装置。至少从表面上看是这样。\"\n\n#. Key:\tElevatorGem_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/ElevatorGem.ElevatorGem.Name\n#: /Game/SO/Items/QuestItems/ElevatorGem.ElevatorGem.Name\nmsgctxt \"ItemData\"\nmsgid \"Elevator Gem\"\nmsgstr \"电梯宝石\"\n\n#. Key:\tElevatorLeverCrystal_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/ElevatorLeverCrystal.ElevatorLeverCrystal.Description\n#. /Game/SO/Items/QuestItems/ElevatorLeverCrystal.ElevatorLeverCrystal.Description\n#: /Game/SO/Items/QuestItems/ElevatorLeverCrystal.ElevatorLeverCrystal.Description\nmsgctxt \"ItemData\"\nmsgid \"You got this item for free from a Merchant so you hardly believe it has any value. It might be used as some sort of a mechanism activator though. Hopefully not for a trap.\"\nmsgstr \"你从一个商人那里免费得到这个东西，所以你认为它几乎没什么价值。它可能被用于触发某种机关。希望这不是个陷阱。\"\n\n#. Key:\tElevatorLeverCrystal_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/ElevatorLeverCrystal.ElevatorLeverCrystal.Name\n#. /Game/SO/Items/QuestItems/ElevatorLeverCrystal.ElevatorLeverCrystal.Name\n#: /Game/SO/Items/QuestItems/ElevatorLeverCrystal.ElevatorLeverCrystal.Name\nmsgctxt \"ItemData\"\nmsgid \"Elevator Crystal\"\nmsgstr \"电梯水晶\"\n\n#. Key:\tFountainFlower_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/FountainFlower.FountainFlower.Description\n#. /Game/SO/Items/QuestItems/FountainFlower.FountainFlower.Description\n#: /Game/SO/Items/QuestItems/FountainFlower.FountainFlower.Description\nmsgctxt \"ItemData\"\nmsgid \"Flower acquired from a fountain.\"\nmsgstr \"从喷泉中采来的花。\"\n\n#. Key:\tFountainFlower_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/FountainFlower.FountainFlower.Name\n#. /Game/SO/Items/QuestItems/FountainFlower.FountainFlower.Name\n#: /Game/SO/Items/QuestItems/FountainFlower.FountainFlower.Name\nmsgctxt \"ItemData\"\nmsgid \"Fountain Flower\"\nmsgstr \"喷泉之花\"\n\n#. Key:\tGateKeeperSeat_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/GateKeeperSeat.GateKeeperSeat.Description\n#. /Game/SO/Items/QuestItems/GateKeeperSeat.GateKeeperSeat.Description\n#: /Game/SO/Items/QuestItems/GateKeeperSeat.GateKeeperSeat.Description\nmsgctxt \"ItemData\"\nmsgid \"A simple seat of size XXXXXXXXXL\"\nmsgstr \"一个简易座位，尺寸是XXXXXXXXXL\"\n\n#. Key:\tGateKeeperSeat_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/GateKeeperSeat.GateKeeperSeat.Name\n#. /Game/SO/Items/QuestItems/GateKeeperSeat.GateKeeperSeat.Name\n#: /Game/SO/Items/QuestItems/GateKeeperSeat.GateKeeperSeat.Name\nmsgctxt \"ItemData\"\nmsgid \"Giant Seat\"\nmsgstr \"巨大座椅\"\n\n#. Key:\tKeyAADoorNearDungeonExit_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyAADoorNearDungeonExit.KeyAADoorNearDungeonExit.Description\n#. /Game/SO/Items/Keys/KeyAADoorNearDungeonExit.KeyAADoorNearDungeonExit.Description\n#: /Game/SO/Items/Keys/KeyAADoorNearDungeonExit.KeyAADoorNearDungeonExit.Description\nmsgctxt \"ItemData\"\nmsgid \"A key without a proper item description\"\nmsgstr \"没有确切描述的钥匙\"\n\n#. Key:\tKeyAADoorNearDungeonExit_name\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyAADoorNearDungeonExit.KeyAADoorNearDungeonExit.Name\n#. /Game/SO/Items/Keys/KeyAADoorNearDungeonExit.KeyAADoorNearDungeonExit.Name\n#: /Game/SO/Items/Keys/KeyAADoorNearDungeonExit.KeyAADoorNearDungeonExit.Name\nmsgctxt \"ItemData\"\nmsgid \"Arcade Key\"\nmsgstr \"回廊钥匙\"\n\n#. Key:\tKeyAAFirstFight_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyAAFirstFight.KeyAAFirstFight.Description\n#. /Game/SO/Items/Keys/KeyAAFirstFight.KeyAAFirstFight.Description\n#: /Game/SO/Items/Keys/KeyAAFirstFight.KeyAAFirstFight.Description\nmsgctxt \"ItemData\"\nmsgid \"Weird\"\nmsgstr \"奇怪的\"\n\n#. Key:\tKeyAAFirstFight_name\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyAAFirstFight.KeyAAFirstFight.Name\n#: /Game/SO/Items/Keys/KeyAAFirstFight.KeyAAFirstFight.Name\nmsgctxt \"ItemData\"\nmsgid \"Weird Key\"\nmsgstr \"奇怪的钥匙\"\n\n#. Key:\tKeyAAMainFirstDoor_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyAAMainFirstDoor.KeyAAMainFirstDoor.Description\n#. /Game/SO/Items/Keys/KeyAAMainFirstDoor.KeyAAMainFirstDoor.Description\n#: /Game/SO/Items/Keys/KeyAAMainFirstDoor.KeyAAMainFirstDoor.Description\nmsgctxt \"ItemData\"\nmsgid \"Sometimes the lock is harder to find than the key.\"\nmsgstr \"有时锁比钥匙更难找。\"\n\n#. Key:\tKeyAAMainFirstDoor_name\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyAAMainFirstDoor.KeyAAMainFirstDoor.Name\n#. /Game/SO/Items/Keys/KeyAAMainFirstDoor.KeyAAMainFirstDoor.Name\n#: /Game/SO/Items/Keys/KeyAAMainFirstDoor.KeyAAMainFirstDoor.Name\nmsgctxt \"ItemData\"\nmsgid \"Key of Something\"\nmsgstr \"某处的钥匙\"\n\n#. Key:\tKeyAGPortalFight_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyAGPortalFight.KeyAGPortalFight.Description\n#. /Game/SO/Items/Keys/KeyAGPortalFight.KeyAGPortalFight.Description\n#: /Game/SO/Items/Keys/KeyAGPortalFight.KeyAGPortalFight.Description\nmsgctxt \"ItemData\"\nmsgid \"Just another key.\"\nmsgstr \"另一把钥匙\"\n\n#. Key:\tKeyAGPortalFight_name\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyAGPortalFight.KeyAGPortalFight.Name\n#: /Game/SO/Items/Keys/KeyAGPortalFight.KeyAGPortalFight.Name\nmsgctxt \"ItemData\"\nmsgid \"Eastern Key\"\nmsgstr \"东部钥匙\"\n\n#. Key:\tKeyBronze_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyBronze.KeyBronze.Description\n#: /Game/SO/Items/Keys/KeyBronze.KeyBronze.Description\nmsgctxt \"ItemData\"\nmsgid \"A reforged Bronze Key.\"\nmsgstr \"一把重新锻造的青铜钥匙。\"\n\n#. Key:\tKeyBronze_name\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyBronze.KeyBronze.Name\n#: /Game/SO/Items/Keys/KeyBronze.KeyBronze.Name\nmsgctxt \"ItemData\"\nmsgid \"Bronze Key\"\nmsgstr \"青铜钥匙\"\n\n#. Key:\tKeyCatacombs0_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyCatacombs0.KeyCatacombs0.Description\n#: /Game/SO/Items/Keys/KeyCatacombs0.KeyCatacombs0.Description\nmsgctxt \"ItemData\"\nmsgid \"There are a ridiculous amount of keys in this world, right?\"\nmsgstr \"这个世界上的钥匙数量简直多得可笑，对吧?\"\n\n#. Key:\tKeyCatacombs0_name\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyCatacombs0.KeyCatacombs0.Name\n#: /Game/SO/Items/Keys/KeyCatacombs0.KeyCatacombs0.Name\nmsgctxt \"ItemData\"\nmsgid \"Key Of The Room Below\"\nmsgstr \"下面房间的钥匙\"\n\n#. Key:\tKeyCopper_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyCopper.KeyCopper.Description\n#: /Game/SO/Items/Keys/KeyCopper.KeyCopper.Description\nmsgctxt \"ItemData\"\nmsgid \"A reforged Copper Key.\"\nmsgstr \"一把重新锻造的铜钥匙。\"\n\n#. Key:\tKeyCopper_name\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyCopper.KeyCopper.Name\n#: /Game/SO/Items/Keys/KeyCopper.KeyCopper.Name\nmsgctxt \"ItemData\"\nmsgid \"Copper Key\"\nmsgstr \"铜钥匙\"\n\n#. Key:\tKeyDCMainOut_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyDCMainOut.KeyDCMainOut.Description\n#: /Game/SO/Items/Keys/KeyDCMainOut.KeyDCMainOut.Description\nmsgctxt \"ItemData\"\nmsgid \"Just an old, rusty iron key without a proper item description\"\nmsgstr \"一把陈旧且生锈的铁钥匙，没有确切描述\"\n\n#. Key:\tKeyDCMainOut_name\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyDCMainOut.KeyDCMainOut.Name\n#: /Game/SO/Items/Keys/KeyDCMainOut.KeyDCMainOut.Name\nmsgctxt \"ItemData\"\nmsgid \"Catacomb Key\"\nmsgstr \"地下墓穴钥匙\"\n\n#. Key:\tKeyIron_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyIron.KeyIron.Description\n#: /Game/SO/Items/Keys/KeyIron.KeyIron.Description\nmsgctxt \"ItemData\"\nmsgid \"A reforged Iron Key.\"\nmsgstr \"一把重新锻造的铁钥匙。\"\n\n#. Key:\tKeyIron_name\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyIron.KeyIron.Name\n#: /Game/SO/Items/Keys/KeyIron.KeyIron.Name\nmsgctxt \"ItemData\"\nmsgid \"Iron Key\"\nmsgstr \"铁钥匙\"\n\n#. Key:\tKeyMaster_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyMaster.KeyMaster.Description\n#: /Game/SO/Items/Keys/KeyMaster.KeyMaster.Description\nmsgctxt \"ItemData\"\nmsgid \"This key can be used to open any door equipped with a special kind of lock, but breaks during the process.\"\nmsgstr \"这把钥匙可以用来打开任何装有特殊锁的门，但在打开过程中会损坏。\"\n\n#. Key:\tKeyMaster_name\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyMaster.KeyMaster.Name\n#: /Game/SO/Items/Keys/KeyMaster.KeyMaster.Name\nmsgctxt \"ItemData\"\nmsgid \"Master Key\"\nmsgstr \"万能钥匙\"\n\n#. Key:\tKeyMerchant_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyMerchant.KeyMerchant.Description\n#: /Game/SO/Items/Keys/KeyMerchant.KeyMerchant.Description\nmsgctxt \"ItemData\"\nmsgid \"Does it really work? You will find out soon...\"\nmsgstr \"这真的有用吗? 你很快就会知道……\"\n\n#. Key:\tKeyMerchant_name\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyMerchant.KeyMerchant.Name\n#: /Game/SO/Items/Keys/KeyMerchant.KeyMerchant.Name\nmsgctxt \"ItemData\"\nmsgid \"A very small key\"\nmsgstr \"非常小的钥匙\"\n\n#. Key:\tKeyOutpostWall_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyOutpostWall.KeyOutpostWall.Description\n#. /Game/SO/Items/Keys/KeyOutpostWall.KeyOutpostWall.Description\n#: /Game/SO/Items/Keys/KeyOutpostWall.KeyOutpostWall.Description\nmsgctxt \"ItemData\"\nmsgid \"Do you really read the key descriptions?\"\nmsgstr \"你真的看过钥匙的描述吗?\"\n\n#. Key:\tKeyOutpostWall_name\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyOutpostWall.KeyOutpostWall.Name\n#: /Game/SO/Items/Keys/KeyOutpostWall.KeyOutpostWall.Name\nmsgctxt \"ItemData\"\nmsgid \"Key Of The Outpost Wall\"\nmsgstr \"前哨墙的钥匙\"\n\n#. Key:\tKeyOutpostWallOptional_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyOutpostWallOptional.KeyOutpostWallOptional.Description\n#. /Game/SO/Items/Keys/KeyOutpostWallOptional.KeyOutpostWallOptional.Description\n#: /Game/SO/Items/Keys/KeyOutpostWallOptional.KeyOutpostWallOptional.Description\nmsgctxt \"ItemData\"\nmsgid \"I would rather sleep, but the item descriptions won't write themselves.\"\nmsgstr \"我好想睡觉，可是物品描述又不会自己生成。\"\n\n#. Key:\tKeyOutpostWallOptional_name\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyOutpostWallOptional.KeyOutpostWallOptional.Name\n#. /Game/SO/Items/Keys/KeyOutpostWallOptional.KeyOutpostWallOptional.Name\n#: /Game/SO/Items/Keys/KeyOutpostWallOptional.KeyOutpostWallOptional.Name\nmsgctxt \"ItemData\"\nmsgid \"Second Key Of The Outpost Wall\"\nmsgstr \"前哨墙的第二把钥匙\"\n\n#. Key:\tKeyPiecesBronze0_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyPiecesBronze0.KeyPiecesBronze0.Description\n#. /Game/SO/Items/Keys/KeyPiecesBronze0.KeyPiecesBronze0.Description\n#: /Game/SO/Items/Keys/KeyPiecesBronze0.KeyPiecesBronze0.Description\nmsgctxt \"ItemData\"\nmsgid \"Half of a broken Bronze Key\"\nmsgstr \"半把坏了的青铜钥匙\"\n\n#. Key:\tKeyPiecesBronze0_name\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyPiecesBronze0.KeyPiecesBronze0.Name\n#: /Game/SO/Items/Keys/KeyPiecesBronze0.KeyPiecesBronze0.Name\nmsgctxt \"ItemData\"\nmsgid \"Half Bronze Key\"\nmsgstr \"半把青铜钥匙\"\n\n#. Key:\tKeyPiecesCopper0_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyPiecesCopper0.KeyPiecesCopper0.Description\n#. /Game/SO/Items/Keys/KeyPiecesCopper0.KeyPiecesCopper0.Description\n#: /Game/SO/Items/Keys/KeyPiecesCopper0.KeyPiecesCopper0.Description\nmsgctxt \"ItemData\"\nmsgid \"Half of a broken Copper Key\"\nmsgstr \"半把坏了的铜钥匙\"\n\n#. Key:\tKeyPiecesCopper0_name\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyPiecesCopper0.KeyPiecesCopper0.Name\n#: /Game/SO/Items/Keys/KeyPiecesCopper0.KeyPiecesCopper0.Name\nmsgctxt \"ItemData\"\nmsgid \"Half Copper Key\"\nmsgstr \"半把铜钥匙\"\n\n#. Key:\tKeyPiecesIron0_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyPiecesIron0.KeyPiecesIron0.Description\n#. /Game/SO/Items/Keys/KeyPiecesIron0.KeyPiecesIron0.Description\n#: /Game/SO/Items/Keys/KeyPiecesIron0.KeyPiecesIron0.Description\nmsgctxt \"ItemData\"\nmsgid \"Half of a broken Iron Key\"\nmsgstr \"半把坏了的铁钥匙\"\n\n#. Key:\tKeyPiecesIron0_name\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyPiecesIron0.KeyPiecesIron0.Name\n#: /Game/SO/Items/Keys/KeyPiecesIron0.KeyPiecesIron0.Name\nmsgctxt \"ItemData\"\nmsgid \"Half Iron Key\"\nmsgstr \"半把铁钥匙\"\n\n#. Key:\tKeySA_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/KeySA.KeySA.Description\n#: /Game/SO/Items/Keys/KeySA.KeySA.Description\nmsgctxt \"ItemData\"\nmsgid \"Looks like there are tons of these\"\nmsgstr \"看起来有很多\"\n\n#. Key:\tKeySA_name\n#. SourceLocation:\t/Game/SO/Items/Keys/KeySA.KeySA.Name\n#: /Game/SO/Items/Keys/KeySA.KeySA.Name\nmsgctxt \"ItemData\"\nmsgid \"Another Key\"\nmsgstr \"另一把钥匙\"\n\n#. Key:\tKeySASewerCreatureCell_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/KeySASewerCreatureCell.KeySASewerCreatureCell.Description\n#. /Game/SO/Items/Keys/KeySASewerCreatureCell.KeySASewerCreatureCell.Description\n#: /Game/SO/Items/Keys/KeySASewerCreatureCell.KeySASewerCreatureCell.Description\nmsgctxt \"ItemData\"\nmsgid \"A small key you got from the Pipe Walkers.\"\nmsgstr \"你从管道行走者那里得到的一把小钥匙。\"\n\n#. Key:\tKeyTLElevatorRoom_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyTLElevatorRoom.KeyTLElevatorRoom.Description\n#. /Game/SO/Items/Keys/KeyTLElevatorRoom.KeyTLElevatorRoom.Description\n#: /Game/SO/Items/Keys/KeyTLElevatorRoom.KeyTLElevatorRoom.Description\nmsgctxt \"ItemData\"\nmsgid \"A key without any sign of interest.\"\nmsgstr \"没有任何兴趣点的钥匙。\"\n\n#. Key:\tKeyTLElevatorRoom_name\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyTLElevatorRoom.KeyTLElevatorRoom.Name\n#. /Game/SO/Items/Keys/KeyTLElevatorRoom.KeyTLElevatorRoom.Name\n#: /Game/SO/Items/Keys/KeyTLElevatorRoom.KeyTLElevatorRoom.Name\nmsgctxt \"ItemData\"\nmsgid \"Unconcerned Key\"\nmsgstr \"无关的钥匙\"\n\n#. Key:\tKeyWWFirstGate_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyWWFirstGate.KeyWWFirstGate.Description\n#. /Game/SO/Items/Keys/KeyWWFirstGate.KeyWWFirstGate.Description\n#: /Game/SO/Items/Keys/KeyWWFirstGate.KeyWWFirstGate.Description\nmsgctxt \"ItemData\"\nmsgid \"It will open a gate somewhere. Probably.\"\nmsgstr \"可能，某个地方会打开一扇门。\"\n\n#. Key:\tKeyWWFirstGate_name\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyWWFirstGate.KeyWWFirstGate.Name\n#: /Game/SO/Items/Keys/KeyWWFirstGate.KeyWWFirstGate.Name\nmsgctxt \"ItemData\"\nmsgid \"Railway Gate Key\"\nmsgstr \"铁道门钥匙\"\n\n#. Key:\tKeyWWPortal_desc\n#. SourceLocation:\t/Game/SO/Items/WhiteWallItems/KeyWWPortal.KeyWWPortal.Description\n#. /Game/SO/Items/WhiteWallItems/KeyWWPortal.KeyWWPortal.Description\n#: /Game/SO/Items/WhiteWallItems/KeyWWPortal.KeyWWPortal.Description\nmsgctxt \"ItemData\"\nmsgid \"A fancy iron key with a shiny gem in its grip. It must be really precious.\"\nmsgstr \"一把别致的铁钥匙，镶嵌着一颗闪亮的宝石。它一定很珍贵。\"\n\n#. Key:\tKeyWWPortal_name\n#. SourceLocation:\t/Game/SO/Items/WhiteWallItems/KeyWWPortal.KeyWWPortal.Name\n#: /Game/SO/Items/WhiteWallItems/KeyWWPortal.KeyWWPortal.Name\nmsgctxt \"ItemData\"\nmsgid \"Portal Key\"\nmsgstr \"入口钥匙\"\n\n#. Key:\tKEYWWSewerCreatureCell_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/KEYWWSewerCreatureCell.KEYWWSewerCreatureCell.Description\n#. /Game/SO/Items/Keys/KEYWWSewerCreatureCell.KEYWWSewerCreatureCell.Description\n#: /Game/SO/Items/Keys/KEYWWSewerCreatureCell.KEYWWSewerCreatureCell.Description\nmsgctxt \"ItemData\"\nmsgid \"A small key you got from a chest in the middle of nowhere.\"\nmsgstr \"一把小钥匙，你从一个偏僻的地方从箱子里拿出来的。\"\n\n#. Key:\tKEYWWSewerCreatureCell_name\n#. SourceLocation:\t/Game/SO/Items/Keys/KEYWWSewerCreatureCell.KEYWWSewerCreatureCell.Name\n#. Key:\tKeySASewerCreatureCell_name\n#. SourceLocation:\t/Game/SO/Items/Keys/KeySASewerCreatureCell.KeySASewerCreatureCell.Name\n#. /Game/SO/Items/Keys/KEYWWSewerCreatureCell.KEYWWSewerCreatureCell.Name\n#. /Game/SO/Items/Keys/KeySASewerCreatureCell.KeySASewerCreatureCell.Name\n#: /Game/SO/Items/Keys/KeySASewerCreatureCell.KeySASewerCreatureCell.Name\n#: /Game/SO/Items/Keys/KEYWWSewerCreatureCell.KEYWWSewerCreatureCell.Name\nmsgctxt \"ItemData\"\nmsgid \"Small Cell Key\"\nmsgstr \"小细胞钥匙\"\n\n#. Key:\tKeyWWWhiteWall_desc\n#. SourceLocation:\t/Game/SO/Items/WhiteWallItems/KeyWWWhiteWall.KeyWWWhiteWall.Description\n#. /Game/SO/Items/WhiteWallItems/KeyWWWhiteWall.KeyWWWhiteWall.Description\n#: /Game/SO/Items/WhiteWallItems/KeyWWWhiteWall.KeyWWWhiteWall.Description\nmsgctxt \"ItemData\"\nmsgid \"A robust iron key with a carved script: <Bold>'Outer Wall Tower'</>.\"\nmsgstr \"一把粗糙的带有刻字的铁钥匙:<Bold>'外墙塔'</>。\"\n\n#. Key:\tKeyWWWhiteWall_name\n#. SourceLocation:\t/Game/SO/Items/WhiteWallItems/KeyWWWhiteWall.KeyWWWhiteWall.Name\n#. /Game/SO/Items/WhiteWallItems/KeyWWWhiteWall.KeyWWWhiteWall.Name\n#: /Game/SO/Items/WhiteWallItems/KeyWWWhiteWall.KeyWWWhiteWall.Name\nmsgctxt \"ItemData\"\nmsgid \"White Wall Key\"\nmsgstr \"白色巨墙钥匙\"\n\n#. Key:\tKoboldCoin_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/KoboldCoin.KoboldCoin.Description\n#: /Game/SO/Items/QuestItems/KoboldCoin.KoboldCoin.Description\nmsgctxt \"ItemData\"\nmsgid \"Some Coins you found in a chest.\"\nmsgstr \"你在箱子里找到的一些硬币。\"\n\n#. Key:\tKoboldCoin_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/KoboldCoin.KoboldCoin.Name\n#: /Game/SO/Items/QuestItems/KoboldCoin.KoboldCoin.Name\nmsgctxt \"ItemData\"\nmsgid \"Kobold Coins\"\nmsgstr \"地精硬币\"\n\n#. Key:\tKoboldPotion_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/KoboldPotion.KoboldPotion.Description\n#. /Game/SO/Items/QuestItems/KoboldPotion.KoboldPotion.Description\n#: /Game/SO/Items/QuestItems/KoboldPotion.KoboldPotion.Description\nmsgctxt \"ItemData\"\nmsgid \"Weird liquid in a bottle. The kobold calls it Soup.\"\nmsgstr \"瓶子里装着奇怪的液体。地精管这个叫汤。\"\n\n#. Key:\tKoboldPotion_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/KoboldPotion.KoboldPotion.Name\n#: /Game/SO/Items/QuestItems/KoboldPotion.KoboldPotion.Name\nmsgctxt \"ItemData\"\nmsgid \"Kobold Soup\"\nmsgstr \"地精汤\"\n\n#. Key:\tLavaGolemToken_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/LavaGolemToken.LavaGolemToken.Description\n#. /Game/SO/Items/QuestItems/LavaGolemToken.LavaGolemToken.Description\n#: /Game/SO/Items/QuestItems/LavaGolemToken.LavaGolemToken.Description\nmsgctxt \"ItemData\"\nmsgid \"A unique stone you can use to prove that you have eliminated a golem.\"\nmsgstr \"一种独特的石头，你可以用它来证明你消灭了一个机器人。\"\n\n#. Key:\tLavaGolemToken_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/LavaGolemToken.LavaGolemToken.Name\n#. /Game/SO/Items/QuestItems/LavaGolemToken.LavaGolemToken.Name\n#: /Game/SO/Items/QuestItems/LavaGolemToken.LavaGolemToken.Name\nmsgctxt \"ItemData\"\nmsgid \"Stone Token\"\nmsgstr \"石制徽章\"\n\n#. Key:\tLeafMace_desc\n#. SourceLocation:\t/Game/SO/Items/Weapons/LeafMace.LeafMace.Description\n#: /Game/SO/Items/Weapons/LeafMace.LeafMace.Description\nmsgctxt \"ItemData\"\nmsgid \"If someone would fail in cutting his/her/its way out of a hard situation, crushing your way through can still work out pretty well - it is said to be more effective if golems or certain mechanical devices / creatures are involved in the conflict.\"\nmsgstr \"如果有人没能从困境中脱身，你也可以很好地破土而出——据说如果机器人或某些机械设备/生物卷入冲突中，效果会更好。\"\n\n#. Key:\tLeafMace_name\n#. SourceLocation:\t/Game/SO/Items/Weapons/LeafMace.LeafMace.Name\n#: /Game/SO/Items/Weapons/LeafMace.LeafMace.Name\nmsgctxt \"ItemData\"\nmsgid \"Leaf Mace\"\nmsgstr \"叶子权杖\"\n\n#. Key:\tLEKeyCage_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/LEKeyCage.LEKeyCage.Description\n#: /Game/SO/Items/Keys/LEKeyCage.LEKeyCage.Description\nmsgctxt \"ItemData\"\nmsgid \"You won't believe it but it is a key for a cage.\"\nmsgstr \"也许你不会相信，但这的确是笼子的钥匙。\"\n\n#. Key:\tLEKeyCage_name\n#. SourceLocation:\t/Game/SO/Items/Keys/LEKeyCage.LEKeyCage.Name\n#: /Game/SO/Items/Keys/LEKeyCage.LEKeyCage.Name\nmsgctxt \"ItemData\"\nmsgid \"Cage Key\"\nmsgstr \"笼子钥匙\"\n\n#. Key:\tLETempleKey_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/LETempleKey.LETempleKey.Description\n#: /Game/SO/Items/Keys/LETempleKey.LETempleKey.Description\nmsgctxt \"ItemData\"\nmsgid \"This is one of the spare keys of the Ancient Temple. Just in case the original would be dropped into the lava accidentally.\"\nmsgstr \"这是古庙的备用钥匙之一。只是为了防止原物不小心掉进熔岩里。\"\n\n#. Key:\tLETempleKey_name\n#. SourceLocation:\t/Game/SO/Items/Keys/LETempleKey.LETempleKey.Name\n#: /Game/SO/Items/Keys/LETempleKey.LETempleKey.Name\nmsgctxt \"ItemData\"\nmsgid \"Ancient Temple Key\"\nmsgstr \"古庙的钥匙\"\n\n#. Key:\tLoryBooks_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/LoryBooks.LoryBooks.Description\n#: /Game/SO/Items/QuestItems/LoryBooks.LoryBooks.Description\nmsgctxt \"ItemData\"\nmsgid \"Two ancient books with the titles \\\"True value of your family\\\" and \\\"How much does a brother cost?\\\". They look boring so you decide not to open them.\"\nmsgstr \"这是两本古书，书名分别是《家庭的真正价值》以及《一个兄弟值多少钱?》。看起来很无聊，所以你决定不打开它们。\"\n\n#. Key:\tLoryBooks_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/LoryBooks.LoryBooks.Name\n#: /Game/SO/Items/QuestItems/LoryBooks.LoryBooks.Name\nmsgctxt \"ItemData\"\nmsgid \"Old books\"\nmsgstr \"旧书\"\n\n#. Key:\tMemoryCrystal1_desc\n#. SourceLocation:\t/Game/SO/Items/MemoryStone/MemoryCrystal1.MemoryCrystal1.Description\n#. /Game/SO/Items/MemoryStone/MemoryCrystal1.MemoryCrystal1.Description\n#: /Game/SO/Items/MemoryStone/MemoryCrystal1.MemoryCrystal1.Description\nmsgctxt \"ItemData\"\nmsgid \"'According to the very few survivors, White Tower, our capital was completely destroyed by a magical phenomena called Ruin. At that time I was at Grey Gate so I can't tell anything for sure.'\\r\\n\\r\\nThe Last Sane Golem Maker, A.C. 16. September 4.\"\nmsgstr \"“‘据白塔上仅有的几个幸存者说，我们的首都被一种叫做毁灭的神奇现象完全摧毁了。那时我在格雷之门，所以我也不确定是不是真的。”\\r\\n\\r\\n最后一个心智健全的机器人制造者，A.C. 16。9月4日。\"\n\n#. Key:\tMemoryCrystal1_name\n#. SourceLocation:\t/Game/SO/Items/MemoryStone/MemoryCrystal1.MemoryCrystal1.Name\n#. /Game/SO/Items/MemoryStone/MemoryCrystal1.MemoryCrystal1.Name\n#: /Game/SO/Items/MemoryStone/MemoryCrystal1.MemoryCrystal1.Name\nmsgctxt \"ItemData\"\nmsgid \"Magical Phenomena\"\nmsgstr \"魔法现象\"\n\n#. Key:\tMemoryCrystal2_desc\n#. SourceLocation:\t/Game/SO/Items/MemoryStone/MemoryCrystal2.MemoryCrystal2.Description\n#. /Game/SO/Items/MemoryStone/MemoryCrystal2.MemoryCrystal2.Description\n#: /Game/SO/Items/MemoryStone/MemoryCrystal2.MemoryCrystal2.Description\nmsgctxt \"ItemData\"\nmsgid \"'Those who escaped Ruin have... changed.'\\r\\n'I've met a scientist who noticed how madness takes control over him. Perhaps he can find a solution.'\\r\\n\\r\\nThe Last Sane Golem Maker, A.C. 17. January 1.\"\nmsgstr \"“那些逃离了毁灭的人已经... 改变了。”\\r\\n“我遇到一个科学家，他注意到自己是如何受疯狂控制的。也许他能找到解决办法。”\\r\\n\\r\\n最后一个心智健全的机器人制造者，A.C. 17。1月1日。\"\n\n#. Key:\tMemoryCrystal2_name\n#. SourceLocation:\t/Game/SO/Items/MemoryStone/MemoryCrystal2.MemoryCrystal2.Name\n#. /Game/SO/Items/MemoryStone/MemoryCrystal2.MemoryCrystal2.Name\n#: /Game/SO/Items/MemoryStone/MemoryCrystal2.MemoryCrystal2.Name\nmsgctxt \"ItemData\"\nmsgid \"Degeneration and mutation\"\nmsgstr \"退化和变异\"\n\n#. Key:\tMemoryCrystal3_desc\n#. SourceLocation:\t/Game/SO/Items/MemoryStone/MemoryCrystal3.MemoryCrystal3.Description\n#. /Game/SO/Items/MemoryStone/MemoryCrystal3.MemoryCrystal3.Description\n#: /Game/SO/Items/MemoryStone/MemoryCrystal3.MemoryCrystal3.Description\nmsgctxt \"ItemData\"\nmsgid \"'It's hard to tell but I think colours are fading away. The World was brighter before.'\\r\\n'The Monk won't help me. He stubbornly believes we are doomed.'\\r\\n\\r\\nThe Last Sane Golem Maker, A.C. 17. March 11.\"\nmsgstr \"“这很难说，但我觉得颜色正在消失。以前的世界更美好。”\\r\\n“那个修道士不肯帮我。他固执地认为我们注定要失败。”\\r\\n\\r\\n最后一个心智健全的机器人制造者，A.C. 17。3月11日。\"\n\n#. Key:\tMemoryCrystal3_name\n#. SourceLocation:\t/Game/SO/Items/MemoryStone/MemoryCrystal3.MemoryCrystal3.Name\n#. /Game/SO/Items/MemoryStone/MemoryCrystal3.MemoryCrystal3.Name\n#: /Game/SO/Items/MemoryStone/MemoryCrystal3.MemoryCrystal3.Name\nmsgctxt \"ItemData\"\nmsgid \"Fading Colours\"\nmsgstr \"褪去的颜色\"\n\n#. Key:\tMemoryCrystal4_desc\n#. SourceLocation:\t/Game/SO/Items/MemoryStone/MemoryCrystal4.MemoryCrystal4.Description\n#. /Game/SO/Items/MemoryStone/MemoryCrystal4.MemoryCrystal4.Description\n#: /Game/SO/Items/MemoryStone/MemoryCrystal4.MemoryCrystal4.Description\nmsgctxt \"ItemData\"\nmsgid \"'Madness takes control over those who get too close to Ruin.'\\r\\n'Maintainers forgot to speak. I understand some of the phrases they try to say: \\\"Dinner is served\\\", \\\"At your service\\\", \\\"Your order\\\" - a mockery of their former intelligence!'\\r\\n\\r\\nThe Last Sane Golem Maker, A.C. 21. January 26.\"\nmsgstr \"“疯狂会控制那些过于接近毁灭的人。”\\r\\n“维修者忘记开口。我明白他们想说的一些话，如:“饭端上来了”、“听候您的吩咐”、“您点的菜”——这是对他们曾经智慧的嘲讽！”\\r\\n\\r\\n最后一个心智健全的机器人制造者，A.C. 17。1月26日。\"\n\n#. Key:\tMemoryCrystal4_name\n#. SourceLocation:\t/Game/SO/Items/MemoryStone/MemoryCrystal4.MemoryCrystal4.Name\n#. /Game/SO/Items/MemoryStone/MemoryCrystal4.MemoryCrystal4.Name\n#: /Game/SO/Items/MemoryStone/MemoryCrystal4.MemoryCrystal4.Name\nmsgctxt \"ItemData\"\nmsgid \"Madness\"\nmsgstr \"疯狂\"\n\n#. Key:\tMemoryCrystal5_desc\n#. SourceLocation:\t/Game/SO/Items/MemoryStone/MemoryCrystal5.MemoryCrystal5.Description\n#. /Game/SO/Items/MemoryStone/MemoryCrystal5.MemoryCrystal5.Description\n#: /Game/SO/Items/MemoryStone/MemoryCrystal5.MemoryCrystal5.Description\nmsgctxt \"ItemData\"\nmsgid \"'Now I have seen it with my own eyes: the touch of the Ruin makes the World literally fall apart.'\\r\\n\\r\\nThe Last Sane Golem Maker, A.C. 25. September 4.\"\nmsgstr \"“现在我亲眼所见: 毁灭的轻轻一触，就能让世界分崩离析。”\\r\\n\\r\\n最后一个心智健全的机器人制造者，A.C. 25。9月4日。\"\n\n#. Key:\tMemoryCrystal5_name\n#. SourceLocation:\t/Game/SO/Items/MemoryStone/MemoryCrystal5.MemoryCrystal5.Name\n#. /Game/SO/Items/MemoryStone/MemoryCrystal5.MemoryCrystal5.Name\n#: /Game/SO/Items/MemoryStone/MemoryCrystal5.MemoryCrystal5.Name\nmsgctxt \"ItemData\"\nmsgid \"Falling Apart\"\nmsgstr \"分崩离析\"\n\n#. Key:\tMemoryCrystal6_desc\n#. SourceLocation:\t/Game/SO/Items/MemoryStone/MemoryCrystal6.MemoryCrystal6.Description\n#. /Game/SO/Items/MemoryStone/MemoryCrystal6.MemoryCrystal6.Description\n#: /Game/SO/Items/MemoryStone/MemoryCrystal6.MemoryCrystal6.Description\nmsgctxt \"ItemData\"\nmsgid \"'This is my 87 birthday. It's obvious that my body doesn't get older with time. How long can I preserve my sanity?'\\r\\n'Drones can no longer be trusted. They resisted Ruin for the longest.'\\r\\n\\r\\nThe Last Sane Golem Maker, A.C. 52. July 9.\"\nmsgstr \"“今天是我87岁的生日。显而易见的是，我的身体并没有随着岁月的流逝而衰老。我能一直保持清醒的头脑吗？”\\r\\n“无人机不再可信。他们抵抗毁灭的时间最长。”\\r\\n\\r\\n最后一个心智健全的机器人制造者，A.C. 52。7月9日。\"\n\n#. Key:\tMemoryCrystal6_name\n#. SourceLocation:\t/Game/SO/Items/MemoryStone/MemoryCrystal6.MemoryCrystal6.Name\n#. /Game/SO/Items/MemoryStone/MemoryCrystal6.MemoryCrystal6.Name\n#: /Game/SO/Items/MemoryStone/MemoryCrystal6.MemoryCrystal6.Name\nmsgctxt \"ItemData\"\nmsgid \"Preservation of Ruin\"\nmsgstr \"王国的保存\"\n\n#. Key:\tMemoryCrystal7_desc\n#. SourceLocation:\t/Game/SO/Items/MemoryStone/MemoryCrystal7.MemoryCrystal7.Description\n#. /Game/SO/Items/MemoryStone/MemoryCrystal7.MemoryCrystal7.Description\n#: /Game/SO/Items/MemoryStone/MemoryCrystal7.MemoryCrystal7.Description\nmsgctxt \"ItemData\"\nmsgid \"'Ruin will soon reach Grey Gate, our very last city. I need to move deeper into the Realm, further away from Ruin.'\\r\\n'I decided to create some new golems. Golems that resist Ruin.'\\r\\n\\r\\nThe Last Sane Golem Maker, A.C. 315. April 8.\"\nmsgstr \"“毁灭将很快到达灰暗之门，我们最后的城市。我需要深入王国，远离毁灭。”\\r\\n“我决定创造一些新的机器人。能抵抗毁灭的机器人。”\\r\\n\\r\\n最后一个神志清醒的假人，A.C. 315。4月8日\"\n\n#. Key:\tMemoryCrystal7_name\n#. SourceLocation:\t/Game/SO/Items/MemoryStone/MemoryCrystal7.MemoryCrystal7.Name\n#. /Game/SO/Items/MemoryStone/MemoryCrystal7.MemoryCrystal7.Name\n#: /Game/SO/Items/MemoryStone/MemoryCrystal7.MemoryCrystal7.Name\nmsgctxt \"ItemData\"\nmsgid \"New Hope\"\nmsgstr \"新的绳子\"\n\n#. Key:\tMemoryCrystal8_desc\n#. SourceLocation:\t/Game/SO/Items/MemoryStone/MemoryCrystal8.MemoryCrystal8.Description\n#. /Game/SO/Items/MemoryStone/MemoryCrystal8.MemoryCrystal8.Description\n#: /Game/SO/Items/MemoryStone/MemoryCrystal8.MemoryCrystal8.Description\nmsgctxt \"ItemData\"\nmsgid \"'I don't think I can keep up. There are times when I no longer know what I'm doing. I still have clear moments but they become more and more rare. I've recorded my memories to keep them safe.'\\r\\n\\r\\nThe Last Sane Golem Maker, about A.C. 500.\\r\\n\"\nmsgstr \"“我想我的头脑快不行了。有些时候我甚至不知道自己在做什么。虽然我也不是一直糊涂，但清醒的时间已经越来越少。我已经把自己的记忆给记录下来，以保证它们得以保存。”\\r\\n\\r\\n最后一个神志清醒的假人，A.C. 500.\\n\"\n\n#. Key:\tMemoryCrystal8_name\n#. SourceLocation:\t/Game/SO/Items/MemoryStone/MemoryCrystal8.MemoryCrystal8.Name\n#. /Game/SO/Items/MemoryStone/MemoryCrystal8.MemoryCrystal8.Name\n#: /Game/SO/Items/MemoryStone/MemoryCrystal8.MemoryCrystal8.Name\nmsgctxt \"ItemData\"\nmsgid \"Final Decision\"\nmsgstr \"最终决定\"\n\n#. Key:\tPergamen_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/Pergamen.Pergamen.Description\n#: /Game/SO/Items/QuestItems/Pergamen.Pergamen.Description\nmsgctxt \"ItemData\"\nmsgid \"'This chest and everything inside belongs to me, the Chef.'\"\nmsgstr \"“这个箱子和里面的一切都属于我，厨师。”\"\n\n#. Key:\tPergamen_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/Pergamen.Pergamen.Name\n#: /Game/SO/Items/QuestItems/Pergamen.Pergamen.Name\nmsgctxt \"ItemData\"\nmsgid \"Parchment\"\nmsgstr \"羊皮纸\"\n\n#. Key:\tPortalGem_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/PortalGem.PortalGem.Description\n#: /Game/SO/Items/QuestItems/PortalGem.PortalGem.Description\nmsgctxt \"ItemData\"\nmsgid \"There are so many stones around. You are still not sure what's the point of picking up some of them.\"\nmsgstr \"周围有很多石头。你仍然不确定它们有什么意义。\"\n\n#. Key:\tPortalGem_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/PortalGem.PortalGem.Name\n#: /Game/SO/Items/QuestItems/PortalGem.PortalGem.Name\nmsgctxt \"ItemData\"\nmsgid \"Lock Gem\"\nmsgstr \"锁宝石\"\n\n#. Key:\tPotionOfWorthiness_desc\n#. SourceLocation:\t/Game/SO/Items/Useable/PotionOfWorthiness.PotionOfWorthiness.Description\n#. /Game/SO/Items/Useable/PotionOfWorthiness.PotionOfWorthiness.Description\n#: /Game/SO/Items/Useable/PotionOfWorthiness.PotionOfWorthiness.Description\nmsgctxt \"ItemData\"\nmsgid \"This might not be the weirdest side effect one can have when drinking something suspicious but it is definitely in the top five.\"\nmsgstr \"也许喝下它所产生的副作用不是第一名，但也足以位列前五。\"\n\n#. Key:\tPotionOfWorthiness_name\n#. SourceLocation:\t/Game/SO/Items/Useable/PotionOfWorthiness.PotionOfWorthiness.Name\n#. /Game/SO/Items/Useable/PotionOfWorthiness.PotionOfWorthiness.Name\n#: /Game/SO/Items/Useable/PotionOfWorthiness.PotionOfWorthiness.Name\nmsgctxt \"ItemData\"\nmsgid \"Potion Of Worthiness\"\nmsgstr \"药剂的价值\"\n\n#. Key:\tPurpleMushroom_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/PurpleMushroom.PurpleMushroom.Description\n#. /Game/SO/Items/QuestItems/PurpleMushroom.PurpleMushroom.Description\n#: /Game/SO/Items/QuestItems/PurpleMushroom.PurpleMushroom.Description\nmsgctxt \"ItemData\"\nmsgid \"The most purple mushrooms you could find. You hope these will be enough.\"\nmsgstr \"你能找到的颜色最紫的蘑菇。你希望这些数量已经够了。\"\n\n#. Key:\tPurpleMushroom_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/PurpleMushroom.PurpleMushroom.Name\n#. /Game/SO/Items/QuestItems/PurpleMushroom.PurpleMushroom.Name\n#: /Game/SO/Items/QuestItems/PurpleMushroom.PurpleMushroom.Name\nmsgctxt \"ItemData\"\nmsgid \"Purple Mushrooms\"\nmsgstr \"紫色蘑菇\"\n\n#. Key:\tRavenFeather_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/RavenFeather.RavenFeather.Description\n#. /Game/SO/Items/QuestItems/RavenFeather.RavenFeather.Description\n#: /Game/SO/Items/QuestItems/RavenFeather.RavenFeather.Description\nmsgctxt \"ItemData\"\nmsgid \"A magical item which gives you the ability to fly... or something like that.\"\nmsgstr \"一件神奇的物品，可以让你飞起来... 差不多是这意思。\"\n\n#. Key:\tRavenFeather_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/RavenFeather.RavenFeather.Name\n#: /Game/SO/Items/QuestItems/RavenFeather.RavenFeather.Name\nmsgctxt \"ItemData\"\nmsgid \"Raven Feather\"\nmsgstr \"乌鸦的羽毛\"\n\n#. Key:\tRope_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/Rope.Rope.Description\n#: /Game/SO/Items/QuestItems/Rope.Rope.Description\nmsgctxt \"ItemData\"\nmsgid \"You do wonder when the area is full of ropes why this is the only one which can be taken...\"\nmsgstr \"你一定想知道为什么在这个到处是绳子的房间里只有一件东西可拿...\"\n\n#. Key:\tRope_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/Rope.Rope.Name\n#: /Game/SO/Items/QuestItems/Rope.Rope.Name\nmsgctxt \"ItemData\"\nmsgid \"Rope\"\nmsgstr \"绳子\"\n\n#. Key:\tRuneStoneBonusHPMagical_desc\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneBonusHPMagical.RuneStoneBonusHPMagical.Description\n#. /Game/SO/Items/RuneStones/RuneStoneBonusHPMagical.RuneStoneBonusHPMagical.Description\n#: /Game/SO/Items/RuneStones/RuneStoneBonusHPMagical.RuneStoneBonusHPMagical.Description\nmsgctxt \"ItemData\"\nmsgid \"Absorbs <Blue>30</> magical damage.\"\nmsgstr \"吸收 <Blue>30</> 魔法伤害。\"\n\n#. Key:\tRuneStoneBonusHPMagical_name\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneBonusHPMagical.RuneStoneBonusHPMagical.Name\n#. /Game/SO/Items/RuneStones/RuneStoneBonusHPMagical.RuneStoneBonusHPMagical.Name\n#: /Game/SO/Items/RuneStones/RuneStoneBonusHPMagical.RuneStoneBonusHPMagical.Name\nmsgctxt \"ItemData\"\nmsgid \"Bluestone\"\nmsgstr \"蓝色石\"\n\n#. Key:\tRuneStoneBonusHPPhysical_desc\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneBonusHPPhysical.RuneStoneBonusHPPhysical.Description\n#. /Game/SO/Items/RuneStones/RuneStoneBonusHPPhysical.RuneStoneBonusHPPhysical.Description\n#: /Game/SO/Items/RuneStones/RuneStoneBonusHPPhysical.RuneStoneBonusHPPhysical.Description\nmsgctxt \"ItemData\"\nmsgid \"Absorbs <White>30</> physical damage.\"\nmsgstr \"吸收 <White>30</> 物理伤害。\"\n\n#. Key:\tRuneStoneBonusHPPhysical_name\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneBonusHPPhysical.RuneStoneBonusHPPhysical.Name\n#. /Game/SO/Items/RuneStones/RuneStoneBonusHPPhysical.RuneStoneBonusHPPhysical.Name\n#: /Game/SO/Items/RuneStones/RuneStoneBonusHPPhysical.RuneStoneBonusHPPhysical.Name\nmsgctxt \"ItemData\"\nmsgid \"Graystone\"\nmsgstr \"灰色石\"\n\n#. Key:\tRuneStoneBounce_desc\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.Description\n#. Key:\tRuneStoneBounce_level_desc_0\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.LevelBasedDescOverride(0).LevelBasedDescOverride\n#. /Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.Description\n#. /Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.LevelBasedDescOverride(0).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.Description\n#: /Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.LevelBasedDescOverride(0).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Provides the ability to bounce from enemies for <Green>8</> seconds. Doing so causes <Blue>12</> damage to the target.\"\nmsgstr \"赋予在敌人身上反弹 <Green>8</> 秒的能力。对目标造成 <Blue>12</> 伤害。\"\n\n#. Key:\tRuneStoneBounce_level_desc_1\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.LevelBasedDescOverride(1).LevelBasedDescOverride\n#. /Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.LevelBasedDescOverride(1).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.LevelBasedDescOverride(1).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Provides the ability to bounce from enemies for <Green>16</> seconds. Doing so causes <Blue>18</> damage to the target.\"\nmsgstr \"赋予在敌人身上反弹 <Green>16</> 秒的能力。对目标造成 <Blue>18</> 伤害。\"\n\n#. Key:\tRuneStoneBounce_level_desc_2\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.LevelBasedDescOverride(2).LevelBasedDescOverride\n#. /Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.LevelBasedDescOverride(2).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.LevelBasedDescOverride(2).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Provides the ability to bounce from enemies for <Green>16</> seconds. Doing so causes <Blue>18</> damage and applies <Yellow>Stun</> on the target.\"\nmsgstr \"赋予在敌人身上反弹 <Green>16</> 秒的能力。造成 <Blue>18</> 伤害 <YellowH> 并对目标产生 <Yellow>晕眩</>。\"\n\n#. Key:\tRuneStoneBounce_level_desc_3\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.LevelBasedDescOverride(3).LevelBasedDescOverride\n#. /Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.LevelBasedDescOverride(3).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.LevelBasedDescOverride(3).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Provides the ability to bounce from enemies for <Green>16</> seconds. Doing so causes <Blue>24</> damage and applies <Yellow>Stun</> on the target.\"\nmsgstr \"赋予在敌人身上反弹 <Green>16</> 秒的能力。造成 <Blue>24</> 伤害 <YellowH> 并对目标产生 <Yellow>晕眩</>。\"\n\n#. Key:\tRuneStoneBounce_level_desc_4\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.LevelBasedDescOverride(4).LevelBasedDescOverride\n#. /Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.LevelBasedDescOverride(4).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.LevelBasedDescOverride(4).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Provides the ability to bounce from enemies for <Green>16</> seconds. Doing so causes <Blue>30</> damage and applies <Yellow>Stun</> on the target.\"\nmsgstr \"赋予在敌人身上反弹 <Green>16</> 秒的能力。造成 <Blue>30</> 伤害 <YellowH> 并对目标产生 <Yellow>晕眩</>。\"\n\n#. Key:\tRuneStoneBounce_level_up_desc_0\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.LevelUpBasedDescOverride(0).LevelUpBasedDescOverride\n#. /Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.LevelUpBasedDescOverride(0).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.LevelUpBasedDescOverride(0).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Provides the ability to bounce from enemies for <Green>8</><YellowH>(→16)</> seconds. Doing so causes <Blue>12</><YellowH>(→18)</> damage to the target.\"\nmsgstr \"赋予在敌人身上反弹 <Green>8</><YellowH>(→16)</> 秒的能力。对目标造成 <Blue>12</><YellowH>(→18)</> 伤害。\"\n\n#. Key:\tRuneStoneBounce_level_up_desc_1\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.LevelUpBasedDescOverride(1).LevelUpBasedDescOverride\n#. /Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.LevelUpBasedDescOverride(1).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.LevelUpBasedDescOverride(1).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Provides the ability to bounce from enemies for <Green>16</> seconds. Doing so causes <Blue>18</> damage <YellowH>and applies Stun on the target.</>\"\nmsgstr \"赋予在敌人身上反弹 <Green>16</> 秒的能力。造成 <Blue>18</> 伤害 <YellowH> 并对目标产生 <Yellow>晕眩</>。\"\n\n#. Key:\tRuneStoneBounce_level_up_desc_2\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.LevelUpBasedDescOverride(2).LevelUpBasedDescOverride\n#. /Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.LevelUpBasedDescOverride(2).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.LevelUpBasedDescOverride(2).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Provides the ability to bounce from enemies for <Green>16</> seconds. Doing so causes <Blue>18</><YellowH>(→24)</> damage and applies <Yellow>Stun</> on the target.\"\nmsgstr \"赋予在敌人身上反弹 <Green>16</> 秒的能力。造成 <Blue>18</><YellowH>(→24)</> 伤害并对目标产生 <Yellow>晕眩</>。\"\n\n#. Key:\tRuneStoneBounce_level_up_desc_3\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.LevelUpBasedDescOverride(3).LevelUpBasedDescOverride\n#. /Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.LevelUpBasedDescOverride(3).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.LevelUpBasedDescOverride(3).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Provides the ability to bounce from enemies for <Green>16</> seconds. Doing so causes <Blue>24</><YellowH>(→30)</> damage and applies <Yellow>Stun</> on the target.\"\nmsgstr \"赋予在敌人身上反弹 <Green>16</> 秒的能力。造成 <Blue>24</><YellowH>(→30)</> 伤害并对目标产生 <Yellow>晕眩</>。\"\n\n#. Key:\tRuneStoneBounce_name\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.Name\n#. /Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.Name\n#: /Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.Name\nmsgctxt \"ItemData\"\nmsgid \"Bouncestone\"\nmsgstr \"弹力石\"\n\n#. Key:\tRuneStoneEnergy_desc\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneEnergy.RuneStoneEnergy.Description\n#. /Game/SO/Items/RuneStones/RuneStoneEnergy.RuneStoneEnergy.Description\n#: /Game/SO/Items/RuneStones/RuneStoneEnergy.RuneStoneEnergy.Description\nmsgctxt \"ItemData\"\nmsgid \"Strikes and spell cooldowns are decreased by 90% for 10 seconds.\"\nmsgstr \"攻击和法术冷却时间减少90%，持续10秒。\"\n\n#. Key:\tRuneStoneEnergy_name\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneEnergy.RuneStoneEnergy.Name\n#. /Game/SO/Items/RuneStones/RuneStoneEnergy.RuneStoneEnergy.Name\n#: /Game/SO/Items/RuneStones/RuneStoneEnergy.RuneStoneEnergy.Name\nmsgctxt \"ItemData\"\nmsgid \"Energystone\"\nmsgstr \"能量石\"\n\n#. Key:\tRuneStoneFire0_desc\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneFire0.RuneStoneFire0.Description\n#. Key:\tRuneStoneFire0_level_desc_0\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneFire0.RuneStoneFire0.LevelBasedDescOverride(0).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneFire0.RuneStoneFire0.Description\n#: /Game/SO/Items/RuneStones/RuneStoneFire0.RuneStoneFire0.LevelBasedDescOverride(0).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons a powerful blast roasting anything in a straight line.\\nCauses <Blue>16</> damage.\"\nmsgstr \"召唤一股强大的冲击波，能把任何东西烤成一条直线。\\n造成 <Blue>16</> 伤害。\"\n\n#. Key:\tRuneStoneFire0_level_desc_1\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneFire0.RuneStoneFire0.LevelBasedDescOverride(1).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneFire0.RuneStoneFire0.LevelBasedDescOverride(1).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons a powerful blast roasting anything in a straight line.\\nCauses <Blue>32</> damage.\"\nmsgstr \"召唤一股强大的冲击波，能把任何东西烤成一条直线。\\n造成  <Blue>32</> 伤害。\"\n\n#. Key:\tRuneStoneFire0_level_desc_2\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneFire0.RuneStoneFire0.LevelBasedDescOverride(2).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneFire0.RuneStoneFire0.LevelBasedDescOverride(2).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons a powerful blast roasting anything in a straight line.\\nCauses <Blue>36</> damage. The spell has <Green>50%</> chance to <Purple>Instant Recharge.</>\"\nmsgstr \"召唤一股强大的冲击波，能把任何东西烤成一条直线。\\n造成 <Blue>36</> 伤害。该法术有 <Green>50%</> 机率 <Purple>获得迅速补给.</>\"\n\n#. Key:\tRuneStoneFire0_level_desc_3\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneFire0.RuneStoneFire0.LevelBasedDescOverride(3).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneFire0.RuneStoneFire0.LevelBasedDescOverride(3).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons a powerful blast roasting anything in a straight line.\\nCauses <Blue>52</> damage. The spell has <Green>50%</> chance to <Purple>Instant Recharge.</>\"\nmsgstr \"召唤一股强大的冲击波，能把任何东西烤成一条直线。\\n造成 <Blue>52</> 伤害。该法术有 <Green>50%</> 机率 <Purple>获得迅速补给.</>\"\n\n#. Key:\tRuneStoneFire0_level_up_desc_0\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneFire0.RuneStoneFire0.LevelUpBasedDescOverride(0).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneFire0.RuneStoneFire0.LevelUpBasedDescOverride(0).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons a powerful blast roasting anything in a straight line.\\nCauses <Blue>16</><YellowH>(→32)</> damage.\"\nmsgstr \"召唤一股强大的冲击波，能把任何东西烤成一条直线。\\n造成 <Blue>16</><YellowH>(→32)</> 伤害。\"\n\n#. Key:\tRuneStoneFire0_level_up_desc_1\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneFire0.RuneStoneFire0.LevelUpBasedDescOverride(1).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneFire0.RuneStoneFire0.LevelUpBasedDescOverride(1).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons a powerful blast roasting anything in a straight line.\\nCauses <Blue>32</><YellowH>(→36)</> damage. <YellowH>The spell has </><GreenH>50%</> <YellowH>chance to </><PurpleH>Instant Recharge.</>\"\nmsgstr \"召唤一股强大的冲击波，能把任何东西烤成一条直线。\\n造成 <Blue>32</><YellowH>(→36)</>  伤害。<YellowH>该法术有 </><GreenH>50%</> <YellowH> 机率 </><PurpleH>获得迅速补给.</>\"\n\n#. Key:\tRuneStoneFire0_level_up_desc_2\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneFire0.RuneStoneFire0.LevelUpBasedDescOverride(2).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneFire0.RuneStoneFire0.LevelUpBasedDescOverride(2).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons a powerful blast roasting anything in a straight line.\\nCauses <Blue>36</><YellowH>(→52)</> damage. The spell has <Green>50%</> chance to <Purple>Instant Recharge.</>\"\nmsgstr \"召唤一股强大的冲击波，能把任何东西烤成一条直线。\\n造成 <Blue>36</><YellowH>(→52)</> 伤害。该法术有 <Green>50%</> 机率 <Purple>获得迅速补给.</>\"\n\n#. Key:\tRuneStoneFire0_name\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneFire0.RuneStoneFire0.Name\n#. /Game/SO/Items/RuneStones/RuneStoneFire0.RuneStoneFire0.Name\n#: /Game/SO/Items/RuneStones/RuneStoneFire0.RuneStoneFire0.Name\nmsgctxt \"ItemData\"\nmsgid \"Firestone\"\nmsgstr \"燧石\"\n\n#. Key:\tRuneStoneHeal_desc\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneHeal.RuneStoneHeal.Description\n#. /Game/SO/Items/RuneStones/RuneStoneHeal.RuneStoneHeal.Description\n#: /Game/SO/Items/RuneStones/RuneStoneHeal.RuneStoneHeal.Description\nmsgctxt \"ItemData\"\nmsgid \"Restores <Green>30</> health points.\"\nmsgstr \"恢复 <Green>30</> 生命值。\"\n\n#. Key:\tRuneStoneHeal_name\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneHeal.RuneStoneHeal.Name\n#: /Game/SO/Items/RuneStones/RuneStoneHeal.RuneStoneHeal.Name\nmsgctxt \"ItemData\"\nmsgid \"Healstone\"\nmsgstr \"治愈石\"\n\n#. Key:\tRuneStoneLightningWalk_desc\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneLightningWalk.RuneStoneLightningWalk.Description\n#. /Game/SO/Items/RuneStones/RuneStoneLightningWalk.RuneStoneLightningWalk.Description\n#: /Game/SO/Items/RuneStones/RuneStoneLightningWalk.RuneStoneLightningWalk.Description\nmsgctxt \"ItemData\"\nmsgid \"Grants the shocking ability to walk through your enemies for <Green>2</> sec. The shock causes <Blue>10</> damage.\"\nmsgstr \"赋予你穿过敌人的惊人能力，持续 <Green>2</> 秒。可造成 <Blue>10</> 秒。\"\n\n#. Key:\tRuneStoneLightningWalk_level_desc_0\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneLightningWalk.RuneStoneLightningWalk.LevelBasedDescOverride(0).LevelBasedDescOverride\n#. /Game/SO/Items/RuneStones/RuneStoneLightningWalk.RuneStoneLightningWalk.LevelBasedDescOverride(0).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneLightningWalk.RuneStoneLightningWalk.LevelBasedDescOverride(0).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Grants the shocking ability to walk through your enemies for <Green>2</> sec. The shock causes <Blue>16</> damage.\"\nmsgstr \"赋予你穿过敌人的惊人能力，持续 <Green>2</> 秒。可造成 <Blue>16</> 秒。\"\n\n#. Key:\tRuneStoneLightningWalk_level_desc_1\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneLightningWalk.RuneStoneLightningWalk.LevelBasedDescOverride(1).LevelBasedDescOverride\n#. /Game/SO/Items/RuneStones/RuneStoneLightningWalk.RuneStoneLightningWalk.LevelBasedDescOverride(1).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneLightningWalk.RuneStoneLightningWalk.LevelBasedDescOverride(1).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Grants the shocking ability to walk through your enemies for <Green>3</> sec. The shock causes <Blue>28</> damage.\"\nmsgstr \"赋予你穿过敌人的惊人能力，持续 <Green>3</> 秒。可造成 <Blue>28</> 秒。\"\n\n#. Key:\tRuneStoneLightningWalk_level_desc_2\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneLightningWalk.RuneStoneLightningWalk.LevelBasedDescOverride(2).LevelBasedDescOverride\n#. /Game/SO/Items/RuneStones/RuneStoneLightningWalk.RuneStoneLightningWalk.LevelBasedDescOverride(2).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneLightningWalk.RuneStoneLightningWalk.LevelBasedDescOverride(2).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Grants the shocking ability to walk through your enemies for <Green>4</> sec. The shock causes <Blue>32</> damage and has a <Green>30%</> chance to <Yellow>stun</> the target.\"\nmsgstr \"赋予你穿过敌人的惊人能力，持续 <Green>4</> 秒。可造成 <Blue>32</> 伤害并有 <Green>30%</> 机率对目标造成 <Yellow>晕眩</>。\"\n\n#. Key:\tRuneStoneLightningWalk_level_desc_3\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneLightningWalk.RuneStoneLightningWalk.LevelBasedDescOverride(3).LevelBasedDescOverride\n#. /Game/SO/Items/RuneStones/RuneStoneLightningWalk.RuneStoneLightningWalk.LevelBasedDescOverride(3).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneLightningWalk.RuneStoneLightningWalk.LevelBasedDescOverride(3).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Grants the shocking ability to walk through your enemies for <Green>4</> sec. The shock causes <Blue>32</> damage and has a <Green>40%</> chance to <Yellow>stun</> the target.\"\nmsgstr \"赋予你穿过敌人的惊人能力，持续 <Green>4</> 秒。可造成 <Blue>32</> 伤害并有 <Green>40%</> 机率对目标造成 <Yellow>晕眩</>。\"\n\n#. Key:\tRuneStoneLightningWalk_level_up_desc_0\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneLightningWalk.RuneStoneLightningWalk.LevelUpBasedDescOverride(0).LevelUpBasedDescOverride\n#. /Game/SO/Items/RuneStones/RuneStoneLightningWalk.RuneStoneLightningWalk.LevelUpBasedDescOverride(0).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneLightningWalk.RuneStoneLightningWalk.LevelUpBasedDescOverride(0).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Grants the shocking ability to walk through your enemies for <Green>2</><YellowH>(→3)</> sec. The shock causes <Blue>16</> <YellowH>(→28)</>damage.\"\nmsgstr \"赋予你穿过敌人的惊人能力，持续 <Green>2</><YellowH>(→3)</> 秒。可造成 <Blue>16</> <YellowH>(→28)</> 伤害。\"\n\n#. Key:\tRuneStoneLightningWalk_level_up_desc_1\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneLightningWalk.RuneStoneLightningWalk.LevelUpBasedDescOverride(1).LevelUpBasedDescOverride\n#. /Game/SO/Items/RuneStones/RuneStoneLightningWalk.RuneStoneLightningWalk.LevelUpBasedDescOverride(1).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneLightningWalk.RuneStoneLightningWalk.LevelUpBasedDescOverride(1).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Grants the shocking ability to walk through your enemies for <Green>3</><YellowH>(→4)</> sec. The shock causes <Blue>28</> <YellowH>(→36)</>damage <YellowH>and has a </><GreenH>30%</> <YellowH>chance to stun the target.</>\"\nmsgstr \"赋予你穿过敌人的惊人能力，持续 <Green>3</><YellowH>(→4)</> 秒。可造成<Blue>28</> <YellowH>(→36)</> 伤害 <YellowH>并有</><GreenH>30%</> <YellowH>机率对目标造成晕眩，</>\"\n\n#. Key:\tRuneStoneLightningWalk_level_up_desc_2\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneLightningWalk.RuneStoneLightningWalk.LevelUpBasedDescOverride(2).LevelUpBasedDescOverride\n#. /Game/SO/Items/RuneStones/RuneStoneLightningWalk.RuneStoneLightningWalk.LevelUpBasedDescOverride(2).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneLightningWalk.RuneStoneLightningWalk.LevelUpBasedDescOverride(2).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Grants the shocking ability to walk through your enemies for <Green>4</> sec. The shock causes <Blue>32</> damage and has a <Green>30%</> <YellowH>(→40%)</> chance to <Yellow>stun</> the target.\"\nmsgstr \"赋予你穿过敌人的惊人能力，持续<Green>4</> 秒。可造成 <Blue>32</> 伤害并拥有 <Green>30%</> <YellowH>(→40%)</> 机率对目标造成 <Yellow>晕眩</>。\"\n\n#. Key:\tRuneStoneLightningWalk_name\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneLightningWalk.RuneStoneLightningWalk.Name\n#. /Game/SO/Items/RuneStones/RuneStoneLightningWalk.RuneStoneLightningWalk.Name\n#: /Game/SO/Items/RuneStones/RuneStoneLightningWalk.RuneStoneLightningWalk.Name\nmsgctxt \"ItemData\"\nmsgid \"Lightningstone\"\nmsgstr \"闪电石\"\n\n#. Key:\tRuneStoneMagicMissle_desc\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMagicMissle.RuneStoneMagicMissle.Description\n#. /Game/SO/Items/RuneStones/RuneStoneMagicMissle.RuneStoneMagicMissle.Description\n#: /Game/SO/Items/RuneStones/RuneStoneMagicMissle.RuneStoneMagicMissle.Description\nmsgctxt \"ItemData\"\nmsgid \"Summons a homing projectile targeted at a close foe - prefers flying targets.\"\nmsgstr \"对一个近距离的敌人- 特别是飞行的目标召唤一个导炮弹。\"\n\n#. Key:\tRuneStoneMagicMissle_level_desc_0\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMagicMissle.RuneStoneMagicMissle.LevelBasedDescOverride(0).LevelBasedDescOverride\n#. /Game/SO/Items/RuneStones/RuneStoneMagicMissle.RuneStoneMagicMissle.LevelBasedDescOverride(0).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneMagicMissle.RuneStoneMagicMissle.LevelBasedDescOverride(0).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons <Green>1</> homing projectile targeted at a close foe - prefers flying targets. Causes <Blue>16</> damage on impact.\"\nmsgstr \"对一个近距离的敌人- 特别是飞行的目标召唤 <Green>1</> 导炮弹。每个炮弹造成  <Blue>16</> 伤害并产生<Orange>减速</> 。\"\n\n#. Key:\tRuneStoneMagicMissle_level_desc_1\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMagicMissle.RuneStoneMagicMissle.LevelBasedDescOverride(1).LevelBasedDescOverride\n#. /Game/SO/Items/RuneStones/RuneStoneMagicMissle.RuneStoneMagicMissle.LevelBasedDescOverride(1).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneMagicMissle.RuneStoneMagicMissle.LevelBasedDescOverride(1).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons <Green>2</> homing projectile targeted at a close foe - prefers flying targets. Each projectile causes <Blue>16</> damage on impact.\"\nmsgstr \"对一个近距离的敌人- 特别是飞行的目标召唤 <Green>2</> 导炮弹。每个炮弹造成  <Blue>16</> 伤害并产生 。\"\n\n#. Key:\tRuneStoneMagicMissle_level_desc_2\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMagicMissle.RuneStoneMagicMissle.LevelBasedDescOverride(2).LevelBasedDescOverride\n#. /Game/SO/Items/RuneStones/RuneStoneMagicMissle.RuneStoneMagicMissle.LevelBasedDescOverride(2).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneMagicMissle.RuneStoneMagicMissle.LevelBasedDescOverride(2).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons <Green>3</> homing projectile targeted at a close foe - prefers flying targets. Each projectile causes <Blue>16</> damage and applies <Orange>Slow</> on impact.\"\nmsgstr \"对一个近距离的敌人- 特别是飞行的目标召唤 <Green>3</> 导炮弹。每个炮弹造成  <Blue>16</> 伤害并产生<Orange>减速</> 。\"\n\n#. Key:\tRuneStoneMagicMissle_level_desc_3\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMagicMissle.RuneStoneMagicMissle.LevelBasedDescOverride(3).LevelBasedDescOverride\n#. /Game/SO/Items/RuneStones/RuneStoneMagicMissle.RuneStoneMagicMissle.LevelBasedDescOverride(3).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneMagicMissle.RuneStoneMagicMissle.LevelBasedDescOverride(3).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons <Green>4</> homing projectile targeted at a close foe - prefers flying targets. Each projectile causes <Blue>16</> damage and applies <Orange>Slow</> on impact.\"\nmsgstr \"对一个近距离的敌人- 特别是飞行的目标召唤 <Green>4</> 导炮弹。每个炮弹造成  <Blue>16</> 伤害并产生<Orange>减速</> 。\"\n\n#. Key:\tRuneStoneMagicMissle_level_up_desc_0\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMagicMissle.RuneStoneMagicMissle.LevelUpBasedDescOverride(0).LevelUpBasedDescOverride\n#. /Game/SO/Items/RuneStones/RuneStoneMagicMissle.RuneStoneMagicMissle.LevelUpBasedDescOverride(0).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneMagicMissle.RuneStoneMagicMissle.LevelUpBasedDescOverride(0).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons <Green>1</><YellowH>(→2)</> homing projectile targeted at a close foe - prefers flying targets. Each projectile causes <Blue>16</> damage on impact.\"\nmsgstr \"对一个近距离的敌人- 特别是飞行的目标召唤 <Green>1</><YellowH>(→2)</> 导炮弹。每个炮弹造成  <Blue>16</> 伤害。\"\n\n#. Key:\tRuneStoneMagicMissle_level_up_desc_1\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMagicMissle.RuneStoneMagicMissle.LevelUpBasedDescOverride(1).LevelUpBasedDescOverride\n#. /Game/SO/Items/RuneStones/RuneStoneMagicMissle.RuneStoneMagicMissle.LevelUpBasedDescOverride(1).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneMagicMissle.RuneStoneMagicMissle.LevelUpBasedDescOverride(1).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons <Green>2</><YellowH>(→3)</> homing projectile targeted at a close foe - prefers flying targets. Each projectile causes <Blue>16</> damage <YellowH>and applies</> <OrangeH>Slow</> on impact.\"\nmsgstr \"对一个近距离的敌人- 特别是飞行的目标召唤 <Green>2</><YellowH>(→3)</> 个导炮弹。每个炮弹造成 <Blue>16</> 伤害 <YellowH>并产生 <OrangeH>减速</> 效果。\"\n\n#. Key:\tRuneStoneMagicMissle_level_up_desc_2\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMagicMissle.RuneStoneMagicMissle.LevelUpBasedDescOverride(2).LevelUpBasedDescOverride\n#. /Game/SO/Items/RuneStones/RuneStoneMagicMissle.RuneStoneMagicMissle.LevelUpBasedDescOverride(2).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneMagicMissle.RuneStoneMagicMissle.LevelUpBasedDescOverride(2).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons <Green>3</><YellowH>(→4)</> homing projectile targeted at a close foe - prefers flying targets. Each projectile causes <Blue>16</> damage and applies <Orange>Slow</> on impact.\"\nmsgstr \"对一个近距离的敌人- 特别是飞行的目标召唤 <Green>3</><YellowH>(→4)</> 个导炮弹。每个炮弹造成 <Blue>16</> 伤害并产生 <Orange>减速</> 效果。\"\n\n#. Key:\tRuneStoneMagicMissle_name\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMagicMissle.RuneStoneMagicMissle.Name\n#. /Game/SO/Items/RuneStones/RuneStoneMagicMissle.RuneStoneMagicMissle.Name\n#: /Game/SO/Items/RuneStones/RuneStoneMagicMissle.RuneStoneMagicMissle.Name\nmsgctxt \"ItemData\"\nmsgid \"Tealstone\"\nmsgstr \"青色石\"\n\n#. Key:\tRuneStoneMassMagicMissle_desc\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMassMagicMissle.RuneStoneMassMagicMissle.Description\n#. Key:\tRuneStoneMassMagicMissle_level_desc_0\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMassMagicMissle.RuneStoneMassMagicMissle.LevelBasedDescOverride(0).LevelBasedDescOverride\n#. /Game/SO/Items/RuneStones/RuneStoneMassMagicMissle.RuneStoneMassMagicMissle.Description\n#. /Game/SO/Items/RuneStones/RuneStoneMassMagicMissle.RuneStoneMassMagicMissle.LevelBasedDescOverride(0).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneMassMagicMissle.RuneStoneMassMagicMissle.Description\n#: /Game/SO/Items/RuneStones/RuneStoneMassMagicMissle.RuneStoneMassMagicMissle.LevelBasedDescOverride(0).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons a homing projectile for each nearby enemy, causing <Blue>20</> damage on impact.\"\nmsgstr \"给周围每个敌人都召唤一个导炮弹, 造成 <Blue>20</> 伤害。\"\n\n#. Key:\tRuneStoneMassMagicMissle_level_desc_1\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMassMagicMissle.RuneStoneMassMagicMissle.LevelBasedDescOverride(1).LevelBasedDescOverride\n#. /Game/SO/Items/RuneStones/RuneStoneMassMagicMissle.RuneStoneMassMagicMissle.LevelBasedDescOverride(1).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneMassMagicMissle.RuneStoneMassMagicMissle.LevelBasedDescOverride(1).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons a homing projectile for each nearby enemy, causing <Blue>40</> damage on impact.\"\nmsgstr \"给周围每个敌人都召唤一个导炮弹, 造成 <Blue>40</> 伤害。\"\n\n#. Key:\tRuneStoneMassMagicMissle_level_desc_2\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMassMagicMissle.RuneStoneMassMagicMissle.LevelBasedDescOverride(2).LevelBasedDescOverride\n#. /Game/SO/Items/RuneStones/RuneStoneMassMagicMissle.RuneStoneMassMagicMissle.LevelBasedDescOverride(2).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneMassMagicMissle.RuneStoneMassMagicMissle.LevelBasedDescOverride(2).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons a homing projectile for each nearby enemy, causing <Blue>50</> damage on impact. The target has a <Green>30%</> chance to become <Orange>Slow</>.\"\nmsgstr \"给周围每个敌人都召唤一个导炮弹, 造成 <Blue>50</> 伤害。 目标有 <Green>30%</> <Orange>机率</> <Orange>减速</>。\"\n\n#. Key:\tRuneStoneMassMagicMissle_level_up_desc_0\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMassMagicMissle.RuneStoneMassMagicMissle.LevelUpBasedDescOverride(0).LevelUpBasedDescOverride\n#. /Game/SO/Items/RuneStones/RuneStoneMassMagicMissle.RuneStoneMassMagicMissle.LevelUpBasedDescOverride(0).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneMassMagicMissle.RuneStoneMassMagicMissle.LevelUpBasedDescOverride(0).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons a homing projectile for each nearby enemy, causing <Blue>20</><YellowH>(→40)</> damage on impact.\"\nmsgstr \"给周围每个敌人都召唤一个导炮弹, 造成 <Blue>20</><YellowH>(→40)</> 伤害。\"\n\n#. Key:\tRuneStoneMassMagicMissle_level_up_desc_1\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMassMagicMissle.RuneStoneMassMagicMissle.LevelUpBasedDescOverride(1).LevelUpBasedDescOverride\n#. /Game/SO/Items/RuneStones/RuneStoneMassMagicMissle.RuneStoneMassMagicMissle.LevelUpBasedDescOverride(1).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneMassMagicMissle.RuneStoneMassMagicMissle.LevelUpBasedDescOverride(1).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons a homing projectile for each nearby enemy, causing <Blue>20</><YellowH>(→50)</> damage on impact. <YellowH>The target has a</> <GreenH>30%</> <YellowH>chance to become</> <Orange>Slow</>.\"\nmsgstr \"给周围每个敌人都召唤一个导炮弹, 造成 <Blue>20</><YellowH>(→50)</> 伤害。 <YellowH>目标有</> <GreenH>30%</> <YellowH>机率</> <Orange>减速</>。\"\n\n#. Key:\tRuneStoneMassMagicMissle_name\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMassMagicMissle.RuneStoneMassMagicMissle.Name\n#. /Game/SO/Items/RuneStones/RuneStoneMassMagicMissle.RuneStoneMassMagicMissle.Name\n#: /Game/SO/Items/RuneStones/RuneStoneMassMagicMissle.RuneStoneMassMagicMissle.Name\nmsgctxt \"ItemData\"\nmsgid \"Tealstone, but better\"\nmsgstr \"青色石，更好\"\n\n#. Key:\tRuneStoneMassSlow_desc\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMassSlow.RuneStoneMassSlow.Description\n#. /Game/SO/Items/RuneStones/RuneStoneMassSlow.RuneStoneMassSlow.Description\n#: /Game/SO/Items/RuneStones/RuneStoneMassSlow.RuneStoneMassSlow.Description\nmsgctxt \"ItemData\"\nmsgid \"Slows all enemy targets around the caster.\"\nmsgstr \"降低施法者周围的所有敌人目标的速度。\"\n\n#. Key:\tRuneStoneMassSlow_level_desc_0\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMassSlow.RuneStoneMassSlow.LevelBasedDescOverride(0).LevelBasedDescOverride\n#. /Game/SO/Items/RuneStones/RuneStoneMassSlow.RuneStoneMassSlow.LevelBasedDescOverride(0).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneMassSlow.RuneStoneMassSlow.LevelBasedDescOverride(0).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"All enemy target becomes <Orange>Slow</> for <Green>3</> seconds.\"\nmsgstr \"所有敌人目标<Orange>减速</> 持续 <Green>3</> 秒。\"\n\n#. Key:\tRuneStoneMassSlow_name\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMassSlow.RuneStoneMassSlow.Name\n#. /Game/SO/Items/RuneStones/RuneStoneMassSlow.RuneStoneMassSlow.Name\n#: /Game/SO/Items/RuneStones/RuneStoneMassSlow.RuneStoneMassSlow.Name\nmsgctxt \"ItemData\"\nmsgid \"Slowstone\"\nmsgstr \"减速石\"\n\n#. Key:\tRuneStoneMeteorShower_desc\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMeteorShower.RuneStoneMeteorShower.Description\n#. /Game/SO/Items/RuneStones/RuneStoneMeteorShower.RuneStoneMeteorShower.Description\n#: /Game/SO/Items/RuneStones/RuneStoneMeteorShower.RuneStoneMeteorShower.Description\nmsgctxt \"ItemData\"\nmsgid \"Summons 12 deadly meteors around the caster, each causing 16 damage on impact.\"\nmsgstr \"在施法者周围召唤12颗致命流星，每颗造成16点伤害。\"\n\n#. Key:\tRuneStoneMeteorShower_level_desc_0\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMeteorShower.RuneStoneMeteorShower.LevelBasedDescOverride(0).LevelBasedDescOverride\n#. /Game/SO/Items/RuneStones/RuneStoneMeteorShower.RuneStoneMeteorShower.LevelBasedDescOverride(0).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneMeteorShower.RuneStoneMeteorShower.LevelBasedDescOverride(0).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons <Green>12</> deadly meteors around the caster, each causing <White>16</> damage on impact.\"\nmsgstr \"在施法者周围召唤 <Green>12</> 颗致命流星, 每一个可造成 <White>16</> 伤害。 \"\n\n#. Key:\tRuneStoneMeteorShower_level_desc_1\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMeteorShower.RuneStoneMeteorShower.LevelBasedDescOverride(1).LevelBasedDescOverride\n#. /Game/SO/Items/RuneStones/RuneStoneMeteorShower.RuneStoneMeteorShower.LevelBasedDescOverride(1).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneMeteorShower.RuneStoneMeteorShower.LevelBasedDescOverride(1).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons <Green>16</> deadly meteors around the caster, each causing <White>24</> damage on impact.\"\nmsgstr \"在施法者周围召唤 <Green>16</> 颗致命流星, 每一个可造成 <White>24</> 伤害。 \"\n\n#. Key:\tRuneStoneMeteorShower_level_desc_2\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMeteorShower.RuneStoneMeteorShower.LevelBasedDescOverride(2).LevelBasedDescOverride\n#. /Game/SO/Items/RuneStones/RuneStoneMeteorShower.RuneStoneMeteorShower.LevelBasedDescOverride(2).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneMeteorShower.RuneStoneMeteorShower.LevelBasedDescOverride(2).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons <Green>20</> deadly meteors around the caster, each causing <White>32</> damage on impact. Each meteor has a <Green>30%</> chance to <Yellow>Stun</> the target.\"\nmsgstr \"在施法者周围召唤<Green>20</> 颗致命流星, 每一个可造成<White>32</> 伤害。 <YellowH>每颗流星有</> <GreenH>30%</> <YellowH>机率使目标 <Yellow>眩晕</>。\"\n\n#. Key:\tRuneStoneMeteorShower_level_up_desc_0\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMeteorShower.RuneStoneMeteorShower.LevelUpBasedDescOverride(0).LevelUpBasedDescOverride\n#. /Game/SO/Items/RuneStones/RuneStoneMeteorShower.RuneStoneMeteorShower.LevelUpBasedDescOverride(0).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneMeteorShower.RuneStoneMeteorShower.LevelUpBasedDescOverride(0).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons <Green>12</><YellowH>(→16)</> deadly meteors around the caster, each causing <White>16</><YellowH>(→24)</> damage on impact.\"\nmsgstr \"在施法者周围召唤<Green>12</><YellowH>(→16)</> 颗致命流星, 每一个可造成 <White>16</><YellowH>(→24)</> 伤害。 \"\n\n#. Key:\tRuneStoneMeteorShower_level_up_desc_1\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMeteorShower.RuneStoneMeteorShower.LevelUpBasedDescOverride(1).LevelUpBasedDescOverride\n#. /Game/SO/Items/RuneStones/RuneStoneMeteorShower.RuneStoneMeteorShower.LevelUpBasedDescOverride(1).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneMeteorShower.RuneStoneMeteorShower.LevelUpBasedDescOverride(1).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons <Green>16</><YellowH>(→20)</> deadly meteors around the caster, each causing <White>24</><YellowH>(→32)</> damage on impact. <YellowH>Each meteor has a</> <GreenH>30%</> <YellowH>chance to Stun the target.</>\"\nmsgstr \"在施法者周围召唤<Green>16</><YellowH>(→20)</> 颗致命流星, 每一个可造成 <White>24</><YellowH>(→32)</> 伤害。 <YellowH>每颗流星有</> <GreenH>30%</> 机率使目标 <YellowH>晕眩。</>\"\n\n#. Key:\tRuneStoneMeteorShower_name\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMeteorShower.RuneStoneMeteorShower.Name\n#. /Game/SO/Items/RuneStones/RuneStoneMeteorShower.RuneStoneMeteorShower.Name\n#: /Game/SO/Items/RuneStones/RuneStoneMeteorShower.RuneStoneMeteorShower.Name\nmsgctxt \"ItemData\"\nmsgid \"Meteorstone\"\nmsgstr \"流星石\"\n\n#. Key:\tRuneStoneShadowWalk_desc\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneShadowWalk.RuneStoneShadowWalk.Description\n#. Key:\tRuneStoneShadowWalk_level_desc_0\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneShadowWalk.RuneStoneShadowWalk.LevelBasedDescOverride(0).LevelBasedDescOverride\n#. /Game/SO/Items/RuneStones/RuneStoneShadowWalk.RuneStoneShadowWalk.Description\n#. /Game/SO/Items/RuneStones/RuneStoneShadowWalk.RuneStoneShadowWalk.LevelBasedDescOverride(0).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneShadowWalk.RuneStoneShadowWalk.Description\n#: /Game/SO/Items/RuneStones/RuneStoneShadowWalk.RuneStoneShadowWalk.LevelBasedDescOverride(0).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Grants the ability to walk through your enemies for <Green>2</> seconds.\"\nmsgstr \"赋予穿越敌人的能力，持续时间<Green>2</>秒。\"\n\n#. Key:\tRuneStoneShadowWalk_level_desc_1\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneShadowWalk.RuneStoneShadowWalk.LevelBasedDescOverride(1).LevelBasedDescOverride\n#. /Game/SO/Items/RuneStones/RuneStoneShadowWalk.RuneStoneShadowWalk.LevelBasedDescOverride(1).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneShadowWalk.RuneStoneShadowWalk.LevelBasedDescOverride(1).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Grants the ability to walk through your enemies for <Green>4</> seconds.\"\nmsgstr \"赋予穿越敌人的能力，持续时间<Green>4</>秒。\"\n\n#. Key:\tRuneStoneShadowWalk_level_desc_2\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneShadowWalk.RuneStoneShadowWalk.LevelBasedDescOverride(2).LevelBasedDescOverride\n#. /Game/SO/Items/RuneStones/RuneStoneShadowWalk.RuneStoneShadowWalk.LevelBasedDescOverride(2).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneShadowWalk.RuneStoneShadowWalk.LevelBasedDescOverride(2).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Grants the ability to walk through your enemies for <Green>4</> seconds. Your magical resistance is increased by <Green>0.2.</>\"\nmsgstr \"赋予穿越敌人的能力，持续时间<Green>4</>秒。你的魔法抗性增加</> <GreenH>0.2.</>\"\n\n#. Key:\tRuneStoneShadowWalk_level_desc_3\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneShadowWalk.RuneStoneShadowWalk.LevelBasedDescOverride(3).LevelBasedDescOverride\n#. /Game/SO/Items/RuneStones/RuneStoneShadowWalk.RuneStoneShadowWalk.LevelBasedDescOverride(3).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneShadowWalk.RuneStoneShadowWalk.LevelBasedDescOverride(3).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Grants the ability to walk through your enemies for <Green>5</> seconds. Your magical resistance is increased by <Green>0.3.</>\"\nmsgstr \"赋予穿越敌人的能力，持续时间 <Green>5</> 秒。你的魔法抗性增加<Green>0.3.</>\"\n\n#. Key:\tRuneStoneShadowWalk_level_up_desc_0\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneShadowWalk.RuneStoneShadowWalk.LevelUpBasedDescOverride(0).LevelUpBasedDescOverride\n#. /Game/SO/Items/RuneStones/RuneStoneShadowWalk.RuneStoneShadowWalk.LevelUpBasedDescOverride(0).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneShadowWalk.RuneStoneShadowWalk.LevelUpBasedDescOverride(0).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Grants the ability to walk through your enemies for <Green>2</> <YellowH>(→4)</> seconds.\"\nmsgstr \"赋予穿越敌人的能力，持续时间<Green>2</> <YellowH>(→4)</>秒。\"\n\n#. Key:\tRuneStoneShadowWalk_level_up_desc_1\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneShadowWalk.RuneStoneShadowWalk.LevelUpBasedDescOverride(1).LevelUpBasedDescOverride\n#. /Game/SO/Items/RuneStones/RuneStoneShadowWalk.RuneStoneShadowWalk.LevelUpBasedDescOverride(1).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneShadowWalk.RuneStoneShadowWalk.LevelUpBasedDescOverride(1).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Grants the ability to walk through your enemies for <Green>4</> seconds. <YellowH>Your magical resistance is increased by</> <GreenH>0.2.</>\"\nmsgstr \"赋予穿越敌人的能力，持续时间<Green>4</>秒。<YellowH>你的魔法抗性增加</> <GreenH>0.2.</>\"\n\n#. Key:\tRuneStoneShadowWalk_level_up_desc_2\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneShadowWalk.RuneStoneShadowWalk.LevelUpBasedDescOverride(2).LevelUpBasedDescOverride\n#. /Game/SO/Items/RuneStones/RuneStoneShadowWalk.RuneStoneShadowWalk.LevelUpBasedDescOverride(2).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneShadowWalk.RuneStoneShadowWalk.LevelUpBasedDescOverride(2).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Grants the ability to walk through your enemies for <Green>4</> <YellowH>(→5)</> seconds. Your magical resistance is increased by <Green>0.2</> <YellowH>(→0.3).</>\"\nmsgstr \"赋予穿越敌人的能力，持续时间 <Green>4</> <YellowH>(→5)</>秒。你的魔法抗性增加<Green>0.2</> <YellowH>(→0.3).</>\"\n\n#. Key:\tRuneStoneShadowWalk_name\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneShadowWalk.RuneStoneShadowWalk.Name\n#. /Game/SO/Items/RuneStones/RuneStoneShadowWalk.RuneStoneShadowWalk.Name\n#: /Game/SO/Items/RuneStones/RuneStoneShadowWalk.RuneStoneShadowWalk.Name\nmsgctxt \"ItemData\"\nmsgid \"Shadestone\"\nmsgstr \"暗影石\"\n\n#. Key:\tRuneStoneSoulkeeper_desc\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneSoulkeeper.RuneStoneSoulkeeper.Description\n#. /Game/SO/Items/RuneStones/RuneStoneSoulkeeper.RuneStoneSoulkeeper.Description\n#: /Game/SO/Items/RuneStones/RuneStoneSoulkeeper.RuneStoneSoulkeeper.Description\nmsgctxt \"ItemData\"\nmsgid \"Summons the Soulkeeper, a powerful spirit capable of gathering your essence should something bad happen to you.\\r\\n\\r\\nReleasing the spirit recharges the stone.\"\nmsgstr \"召唤灵魂看守者，一个强大的灵魂，能够收集你的精华，如果有什么不好的事情发生在你身上。\\r\\n释放灵魂会给石头充电。”\"\n\n#. Key:\tRuneStoneSoulkeeper_name\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneSoulkeeper.RuneStoneSoulkeeper.Name\n#. /Game/SO/Items/RuneStones/RuneStoneSoulkeeper.RuneStoneSoulkeeper.Name\n#: /Game/SO/Items/RuneStones/RuneStoneSoulkeeper.RuneStoneSoulkeeper.Name\nmsgctxt \"ItemData\"\nmsgid \"Soulstone\"\nmsgstr \"灵魂石\"\n\n#. Key:\tRuneStoneSoulkeeperInfinite_desc\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneSoulkeeperInfinite.RuneStoneSoulkeeperInfinite.Description\n#. /Game/SO/Items/RuneStones/RuneStoneSoulkeeperInfinite.RuneStoneSoulkeeperInfinite.Description\n#: /Game/SO/Items/RuneStones/RuneStoneSoulkeeperInfinite.RuneStoneSoulkeeperInfinite.Description\nmsgctxt \"ItemData\"\nmsgid \"Summons the Soulkeeper, a powerful spirit capable of gathering your essence should something bad happen to you.\"\nmsgstr \"召唤灵魂守护者，一个强大的灵魂能够在你遇到坏事的时候聚集你的精华。\"\n\n#. Key:\tRuneStoneSoulkeeperInfinite_name\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneSoulkeeperInfinite.RuneStoneSoulkeeperInfinite.Name\n#. /Game/SO/Items/RuneStones/RuneStoneSoulkeeperInfinite.RuneStoneSoulkeeperInfinite.Name\n#: /Game/SO/Items/RuneStones/RuneStoneSoulkeeperInfinite.RuneStoneSoulkeeperInfinite.Name\nmsgctxt \"ItemData\"\nmsgid \"Elite Soulstone\"\nmsgstr \"精英灵魂石\"\n\n#. Key:\tRuneStoneSpellRegain_desc\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneSpellRegain.RuneStoneSpellRegain.Description\n#. /Game/SO/Items/RuneStones/RuneStoneSpellRegain.RuneStoneSpellRegain.Description\n#: /Game/SO/Items/RuneStones/RuneStoneSpellRegain.RuneStoneSpellRegain.Description\nmsgctxt \"ItemData\"\nmsgid \"Regenerates all other spell charges.\"\nmsgstr \"重新生成所有其他法术充能。\"\n\n#. Key:\tRuneStoneSpellRegain_name\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneSpellRegain.RuneStoneSpellRegain.Name\n#. /Game/SO/Items/RuneStones/RuneStoneSpellRegain.RuneStoneSpellRegain.Name\n#: /Game/SO/Items/RuneStones/RuneStoneSpellRegain.RuneStoneSpellRegain.Name\nmsgctxt \"ItemData\"\nmsgid \"Spiritstone\"\nmsgstr \"精神石\"\n\n#. Key:\tRuneStoneSwap_desc\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.Description\n#. Key:\tRuneStoneSwap_level_desc_0\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.LevelBasedDescOverride(0).LevelBasedDescOverride\n#. /Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.Description\n#. /Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.LevelBasedDescOverride(0).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.Description\n#: /Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.LevelBasedDescOverride(0).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Swaps the position of the caster with the closest target in front of him/her/it.\"\nmsgstr \"将施法者的位置与他/她/它前面最近的目标互换。\"\n\n#. Key:\tRuneStoneSwap_level_desc_1\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.LevelBasedDescOverride(1).LevelBasedDescOverride\n#. /Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.LevelBasedDescOverride(1).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.LevelBasedDescOverride(1).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Swaps the position of the caster with the closest target in front of him/her/it. The selected target suffers <Blue>20</> damage.\"\nmsgstr \"将施法者的位置与他/她/它前面最近的目标互换。所选目标将受到 <Blue>20</> 伤害。\"\n\n#. Key:\tRuneStoneSwap_level_desc_2\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.LevelBasedDescOverride(2).LevelBasedDescOverride\n#. /Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.LevelBasedDescOverride(2).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.LevelBasedDescOverride(2).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Swaps the position of the caster with the closest target in front of him/her/it. The selected target suffers <Blue>30</> damage and becomes <Orange>Slow</>.\"\nmsgstr \"将施法者的位置与他/她/它前面最近的目标互换。所选目标将受到 <Blue>30</> 伤害并 <Orange>减速</>。\"\n\n#. Key:\tRuneStoneSwap_level_desc_3\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.LevelBasedDescOverride(3).LevelBasedDescOverride\n#. /Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.LevelBasedDescOverride(3).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.LevelBasedDescOverride(3).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Swaps the position of the caster with the closest target in front of him/her/it. The selected target suffers <Blue>40</> damage and becomes <Orange>Slow</>.\"\nmsgstr \"将施法者的位置与他/她/它前面最近的目标互换。所选目标将受到 <Blue>40</> 伤害并 <Orange>减速</>。\"\n\n#. Key:\tRuneStoneSwap_level_desc_4\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.LevelBasedDescOverride(4).LevelBasedDescOverride\n#. /Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.LevelBasedDescOverride(4).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.LevelBasedDescOverride(4).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Swaps the position of the caster with the closest target in front of him/her/it. The selected target suffers <Blue>50</> damage and becomes <Orange>Slow</>.\"\nmsgstr \"将施法者的位置与他/她/它前面最近的目标互换。所选目标将受到 <Blue>50</> 伤害并 <Orange>减速</>。\"\n\n#. Key:\tRuneStoneSwap_level_up_desc_0\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.LevelUpBasedDescOverride(0).LevelUpBasedDescOverride\n#. /Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.LevelUpBasedDescOverride(0).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.LevelUpBasedDescOverride(0).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Swaps the position of the caster with the closest target in front of him/her/it. <YellowH>The selected target suffers</> <BlueH>20</> <YellowH>damage.</>\"\nmsgstr \"将施法者的位置与他/她/它前面最近的目标互换。<YellowH>所选目标将受到</> <BlueH>20</> <YellowH>伤害。</>\"\n\n#. Key:\tRuneStoneSwap_level_up_desc_1\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.LevelUpBasedDescOverride(1).LevelUpBasedDescOverride\n#. /Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.LevelUpBasedDescOverride(1).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.LevelUpBasedDescOverride(1).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Swaps the position of the caster with the closest target in front of him/her/it. The selected target suffers <Blue>20</><YellowH>(→30)</> damage <YellowH>and becomes </><Orange>Slow.</>\"\nmsgstr \"将施法者的位置与他/她/它前面最近的目标互换。所选目标将受到<Blue>20</><YellowH>(→30)</> 伤害并<Orange>减速。</>\"\n\n#. Key:\tRuneStoneSwap_level_up_desc_2\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.LevelUpBasedDescOverride(2).LevelUpBasedDescOverride\n#. /Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.LevelUpBasedDescOverride(2).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.LevelUpBasedDescOverride(2).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Swaps the position of the caster with the closest target in front of him/her/it. The selected target suffers <Blue>30</><YellowH>(→40)</> damage and becomes <Orange>Slow.</>\"\nmsgstr \"将施法者的位置与他/她/它前面最近的目标互换。所选目标将受到<Blue>30</><YellowH>(→40)</> 伤害并<Orange>减速。</>\"\n\n#. Key:\tRuneStoneSwap_level_up_desc_3\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.LevelUpBasedDescOverride(3).LevelUpBasedDescOverride\n#. /Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.LevelUpBasedDescOverride(3).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.LevelUpBasedDescOverride(3).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Swaps the position of the caster with the closest target in front of him/her/it. The selected target suffers <Blue>40</><YellowH>(→50)</> damage and becomes <Orange>Slow.</>\"\nmsgstr \"将施法者的位置与他/她/它前面最近的目标互换。所选目标将受到<Blue>40</><YellowH>(→50)</> 伤害并 <Orange>减速。</>\"\n\n#. Key:\tRuneStoneSwap_name\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.Name\n#: /Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.Name\nmsgctxt \"ItemData\"\nmsgid \"Swapstone\"\nmsgstr \"交换石\"\n\n#. Key:\tRuneStoneWeaponFlame_desc\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.Description\n#. /Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.Description\n#: /Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.Description\nmsgctxt \"ItemData\"\nmsgid \"Enchants your active weapon with green flames - it causes an additional 0.3x damage for 4 seconds.\"\nmsgstr \"用绿色火焰附魔你的激活武器 - 造成额外的 0.3x 伤害并持续 4 秒。\"\n\n#. Key:\tRuneStoneWeaponFlame_level_desc_0\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.LevelBasedDescOverride(0).LevelBasedDescOverride\n#. /Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.LevelBasedDescOverride(0).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.LevelBasedDescOverride(0).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Enchants your active weapon - it causes an additional <Green>0.5x</> damage for <Green>5</> seconds.\"\nmsgstr \"附魔你的激活武器 -  它会造成额外的 <Green>0.5x</> 伤害并持续 <Green>5</> 秒。\"\n\n#. Key:\tRuneStoneWeaponFlame_level_desc_1\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.LevelBasedDescOverride(1).LevelBasedDescOverride\n#. /Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.LevelBasedDescOverride(1).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.LevelBasedDescOverride(1).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Enchants your active weapon - it causes an additional <Green>0.6x</> damage for <Green>5</> seconds. Each strike has a <Green>15%</> chance to apply <DarkGreen>Poison</>, causing an additional <Blue>18</> damage over <Green>6</> seconds.\"\nmsgstr \"附魔你的激活武器 -  它会造成额外的 <Green>0.6x</> 伤害并持续 <Green>5</> 秒。 每次攻击有 <Green>15%</> 机率使用 <DarkGreen>毒药</>, 造成额外的 <Blue>18</> 伤害并持续 <Green>6</> 秒。\"\n\n#. Key:\tRuneStoneWeaponFlame_level_desc_2\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.LevelBasedDescOverride(2).LevelBasedDescOverride\n#. /Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.LevelBasedDescOverride(2).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.LevelBasedDescOverride(2).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Enchants your active weapon - it causes an additional <Green>0.7x</> damage for <Green>6</> seconds. Each strike has a <Green>20%</> chance to apply <DarkGreen>Poison</>, causing an additional <Blue>24</> damage over <Green>6</> seconds.\"\nmsgstr \"附魔你的激活武器 -  它会造成额外的 <Green>0.7x</> 伤害并持续 <Green>6</> 秒。 每次攻击有 <Green>20%</> 机率使用 <DarkGreen>毒药</>, 造成额外的 <Blue>24</> 伤害并持续 <Green>6</> 秒。\"\n\n#. Key:\tRuneStoneWeaponFlame_level_desc_3\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.LevelBasedDescOverride(3).LevelBasedDescOverride\n#. /Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.LevelBasedDescOverride(3).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.LevelBasedDescOverride(3).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Enchants your active weapon - it causes an additional <Green>0.8x</> damage for <Green>6</> seconds. Each strike has a <Green>25%</> chance to apply <DarkGreen>Poison</>, causing an additional <Blue>30</> damage over <Green>6</> seconds.\"\nmsgstr \"附魔你的激活武器 -  它会造成额外的 <Green>0.8x</> 伤害并持续 <Green>6</> 秒。 每次攻击有 <Green>25%</> 机率使用 <DarkGreen>毒药</>, 造成额外的 <Blue>30</> 伤害并持续 <Green>6</> 秒。\"\n\n#. Key:\tRuneStoneWeaponFlame_level_desc_4\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.LevelBasedDescOverride(4).LevelBasedDescOverride\n#. /Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.LevelBasedDescOverride(4).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.LevelBasedDescOverride(4).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Enchants your active weapon - it causes an additional <Green>0.9x</> damage for <Green>6</> seconds. Each strike has a <Green>30%</> chance to apply <DarkGreen>Poison</>, causing an additional <Blue>36</> damage over <Green>6</> seconds.\"\nmsgstr \"附魔你的激活武器 -  它会造成额外的 <Green>0.9x</> 伤害并持续 <Green>6</> 秒。 每次攻击有 <Green>30%</> 机率使用 <DarkGreen>毒药</>, 造成额外的 <Blue>36</> 伤害并持续 <Green>6</> 秒。\"\n\n#. Key:\tRuneStoneWeaponFlame_level_up_desc_0\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.LevelUpBasedDescOverride(0).LevelUpBasedDescOverride\n#. /Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.LevelUpBasedDescOverride(0).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.LevelUpBasedDescOverride(0).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Enchants your active weapon - it causes an additional <Green>0.5x</><YellowH>(→0.6x)</> damage for <Green>5</> seconds. <YellowH>Each strike has a</> <GreenH>15%</> <YellowH>chance to apply </><DarkGreenH>Poison</><YellowH>, causing an additional</> <BlueH>18</> <YellowH>damage over</> <GreenH>6</> <YellowH>seconds.</>\"\nmsgstr \"附魔你的激活武器 -  它会造成额外的 <Green>0.5x</><YellowH>(→0.6x)</> 伤害并持续<Green>5</> 秒。 <YellowH>每次攻击有</> <GreenH>15%</> <YellowH> 机率使用 </><DarkGreenH>毒药</><YellowH>, 造成额外的 </> <BlueH>18</> <YellowH>伤害并持续</> <GreenH>6</> <YellowH>秒。</>\"\n\n#. Key:\tRuneStoneWeaponFlame_level_up_desc_1\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.LevelUpBasedDescOverride(1).LevelUpBasedDescOverride\n#. /Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.LevelUpBasedDescOverride(1).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.LevelUpBasedDescOverride(1).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Enchants your active weapon - it causes an additional <Green>0.6x</><YellowH>(→0.7x)</> damage for <Green>5</><YellowH>(→6)</> seconds. Each strike has a <Green>15%</><YellowH>(→20%)</> chance to apply <DarkGreen>Poison</>, causing an additional <Blue>18</><YellowH>(→24)</> damage over <Green>6</> seconds.\"\nmsgstr \"附魔你的激活武器 -  它会造成额外的 <Green>0.6x</><YellowH>(→0.7x)</> 伤害并持续 <Green>5</> 秒。 每次攻击有 <Green>15%</><YellowH>(→20%)</> 机率使用 <DarkGreen>毒药</>, 造成额外的 <Blue>18</><YellowH>(→24)</> 伤害并持续 <Green>6</> 秒。\"\n\n#. Key:\tRuneStoneWeaponFlame_level_up_desc_2\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.LevelUpBasedDescOverride(2).LevelUpBasedDescOverride\n#. /Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.LevelUpBasedDescOverride(2).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.LevelUpBasedDescOverride(2).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Enchants your active weapon - it causes an additional <Green>0.7x</><YellowH>(→0.8x)</> damage for <Green>6</> seconds. Each strike has a <Green>20%</><YellowH>(→25%)</> chance to apply <DarkGreen>Poison</>, causing an additional <Blue>24</><YellowH>(→30)</> damage over <Green>6</> seconds.\"\nmsgstr \"附魔你的激活武器 -  它会造成额外的 <Green>0.7x</><YellowH>(→0.8x)</> 伤害并持续 <Green>6</> 秒。 每次攻击有 <Green>20%</><YellowH>(→25%)</> 机率使用 <DarkGreen>毒药</>, 造成额外的 <Blue>24</><YellowH>(→30)</> 伤害并持续 <Green>6</> 秒。\"\n\n#. Key:\tRuneStoneWeaponFlame_level_up_desc_3\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.LevelUpBasedDescOverride(3).LevelUpBasedDescOverride\n#. /Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.LevelUpBasedDescOverride(3).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.LevelUpBasedDescOverride(3).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Enchants your active weapon - it causes an additional <Green>0.8x</><YellowH>(→0.9x)</> damage for <Green>6</> seconds. Each strike has a <Green>25%</><YellowH>(→30%)</> chance to apply <DarkGreen>Poison</>, causing an additional <Blue>30</><YellowH>(→36)</> damage over <Green>6</> seconds.\"\nmsgstr \"附魔你的激活武器 -  它会造成额外的 <Green>0.8x</><YellowH>(→0.9x)</> 伤害并持续 <Green>6</> 秒。 每次攻击有 <Green>25%</><YellowH>(→30%)</> 机率使用 <DarkGreen>毒药</>, 造成额外的 <Blue>30</><YellowH>(→36)</> 伤害并持续 <Green>6</> 秒。\"\n\n#. Key:\tRuneStoneWeaponFlame_name\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.Name\n#. /Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.Name\n#: /Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.Name\nmsgctxt \"ItemData\"\nmsgid \"Green Flamestone\"\nmsgstr \"绿焰石\"\n\n#. Key:\tSabre_desc\n#. SourceLocation:\t/Game/SO/Items/Weapons/Sabre.Sabre.Description\n#: /Game/SO/Items/Weapons/Sabre.Sabre.Description\nmsgctxt \"ItemData\"\nmsgid \"Rangol was a legendary blacksmith who practiced his crafting art for a hundred years. This sabre was made on day one.\"\nmsgstr \"拉古尔是一个传奇的铁匠，他练习手工艺已经足足有100年。这把军刀是他第一天制造的。\"\n\n#. Key:\tSabre_name\n#. SourceLocation:\t/Game/SO/Items/Weapons/Sabre.Sabre.Name\n#: /Game/SO/Items/Weapons/Sabre.Sabre.Name\nmsgctxt \"ItemData\"\nmsgid \"First Sabre of Rangol\"\nmsgstr \"拉古尔的首把军刀\"\n\n#. Key:\tSecondChance_desc\n#. SourceLocation:\t/Game/SO/Items/RuneStones/SecondChance.SecondChance.Description\n#. /Game/SO/Items/RuneStones/SecondChance.SecondChance.Description\n#: /Game/SO/Items/RuneStones/SecondChance.SecondChance.Description\nmsgctxt \"ItemData\"\nmsgid \"Prevents death.\"\nmsgstr \"避免死亡。\"\n\n#. Key:\tSecondChance_name\n#. SourceLocation:\t/Game/SO/Items/RuneStones/SecondChance.SecondChance.Name\n#: /Game/SO/Items/RuneStones/SecondChance.SecondChance.Name\nmsgctxt \"ItemData\"\nmsgid \"Chancestone\"\nmsgstr \"机遇石\"\n\n#. Key:\tSecretWeirdDevice_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/SecretWeirdDevice.SecretWeirdDevice.Description\n#. /Game/SO/Items/QuestItems/SecretWeirdDevice.SecretWeirdDevice.Description\n#: /Game/SO/Items/QuestItems/SecretWeirdDevice.SecretWeirdDevice.Description\nmsgctxt \"ItemData\"\nmsgid \"A weird device, most likely one of the inventions of the Secret Science Society.\"\nmsgstr \"一个奇怪的装置，很可能是秘密科学协会的发明之一。\"\n\n#. Key:\tSecretWeirdDevice_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/SecretWeirdDevice.SecretWeirdDevice.Name\n#. /Game/SO/Items/QuestItems/SecretWeirdDevice.SecretWeirdDevice.Name\n#: /Game/SO/Items/QuestItems/SecretWeirdDevice.SecretWeirdDevice.Name\nmsgctxt \"ItemData\"\nmsgid \"Weird Device\"\nmsgstr \"奇怪装置\"\n\n#. Key:\tShardAmber_desc\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardAmber.ShardAmber.Description\n#: /Game/SO/Items/Shards/ShardAmber.ShardAmber.Description\nmsgctxt \"ItemData\"\nmsgid \"Each melee strike has an additional <Yellow>10%</> chance to cause a critical hit, causing <Green>200%</> of your normal weapon damage.\"\nmsgstr \"每一次近战攻击都有额外的<Yellow>10%</>机率造成致命一击，使你的普通武器造成<Green>200%</>伤害。\"\n\n#. Key:\tShardAmber_name\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardAmber.ShardAmber.Name\n#: /Game/SO/Items/Shards/ShardAmber.ShardAmber.Name\nmsgctxt \"ItemData\"\nmsgid \"Amber Shard\"\nmsgstr \"琥珀碎片\"\n\n#. Key:\tShardAmberBright_desc\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardAmberBright.ShardAmberBright.Description\n#. /Game/SO/Items/Shards/ShardAmberBright.ShardAmberBright.Description\n#: /Game/SO/Items/Shards/ShardAmberBright.ShardAmberBright.Description\nmsgctxt \"ItemData\"\nmsgid \"Each melee strike has an additional <Yellow>20%</> chance to cause a critical hit, causing <Green>200%</> of your normal weapon damage.\"\nmsgstr \"每一次近战攻击都有额外的<Yellow>20%</>机率造成致命一击，使你的普通武器造成<Green>200%</>伤害。\"\n\n#. Key:\tShardAmberBright_name\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardAmberBright.ShardAmberBright.Name\n#. /Game/SO/Items/Shards/ShardAmberBright.ShardAmberBright.Name\n#: /Game/SO/Items/Shards/ShardAmberBright.ShardAmberBright.Name\nmsgctxt \"ItemData\"\nmsgid \"Bright Amber Shard\"\nmsgstr \"明亮琥珀碎片\"\n\n#. Key:\tShardAqua_desc\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardAqua.ShardAqua.Description\n#: /Game/SO/Items/Shards/ShardAqua.ShardAqua.Description\nmsgctxt \"ItemData\"\nmsgid \"Cooldown recharge speed is increased by <Blue>20%</>.\"\nmsgstr \"冷却充能速度提升<Blue>20%</>。\"\n\n#. Key:\tShardAqua_name\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardAqua.ShardAqua.Name\n#: /Game/SO/Items/Shards/ShardAqua.ShardAqua.Name\nmsgctxt \"ItemData\"\nmsgid \"Aqua Shard\"\nmsgstr \"浅绿碎片\"\n\n#. Key:\tShardAquaBright_desc\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardAquaBright.ShardAquaBright.Description\n#. /Game/SO/Items/Shards/ShardAquaBright.ShardAquaBright.Description\n#: /Game/SO/Items/Shards/ShardAquaBright.ShardAquaBright.Description\nmsgctxt \"ItemData\"\nmsgid \"Cooldown recharge speed is increased by <Blue>40%</>.\"\nmsgstr \"冷却充能速度提升<Blue>40%</>。\"\n\n#. Key:\tShardAquaBright_name\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardAquaBright.ShardAquaBright.Name\n#: /Game/SO/Items/Shards/ShardAquaBright.ShardAquaBright.Name\nmsgctxt \"ItemData\"\nmsgid \"Bright Aqua Shard\"\nmsgstr \"明亮浅绿碎片\"\n\n#. Key:\tShardBlack_desc\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardBlack.ShardBlack.Description\n#: /Game/SO/Items/Shards/ShardBlack.ShardBlack.Description\nmsgctxt \"ItemData\"\nmsgid \"Every time an enemy hits you with a melee strike or overlaps you it is turned into a boot for a short time.\"\nmsgstr \"每当一个敌人用近战攻击攻击你或与你重叠时，它会在短时间内变成一只靴子。\"\n\n#. Key:\tShardBlack_name\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardBlack.ShardBlack.Name\n#: /Game/SO/Items/Shards/ShardBlack.ShardBlack.Name\nmsgctxt \"ItemData\"\nmsgid \"Black Shard\"\nmsgstr \"黑色碎片\"\n\n#. Key:\tShardBlue_desc\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardBlue.ShardBlue.Description\n#: /Game/SO/Items/Shards/ShardBlue.ShardBlue.Description\nmsgctxt \"ItemData\"\nmsgid \"Decreases the incoming <Blue>Magical Damage</> by <Blue>20%.</>\"\nmsgstr \"降低受到的<Blue>魔法伤害</> <Blue>20%。\"\n\n#. Key:\tShardBlue_name\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardBlue.ShardBlue.Name\n#: /Game/SO/Items/Shards/ShardBlue.ShardBlue.Name\nmsgctxt \"ItemData\"\nmsgid \"Blue Shard\"\nmsgstr \"蓝色碎片\"\n\n#. Key:\tShardBlueBright_desc\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardBlueBright.ShardBlueBright.Description\n#. /Game/SO/Items/Shards/ShardBlueBright.ShardBlueBright.Description\n#: /Game/SO/Items/Shards/ShardBlueBright.ShardBlueBright.Description\nmsgctxt \"ItemData\"\nmsgid \"Decreases the incoming <Blue>Magical Damage</> by <Blue>30%.</>\"\nmsgstr \"使下一次<Blue>魔法伤害</> 降低 <Blue>30%.</>\"\n\n#. Key:\tShardBlueBright_name\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardBlueBright.ShardBlueBright.Name\n#: /Game/SO/Items/Shards/ShardBlueBright.ShardBlueBright.Name\nmsgctxt \"ItemData\"\nmsgid \"Bright Blue Shard\"\nmsgstr \"明亮蓝色碎片\"\n\n#. Key:\tShardGreen_desc\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardGreen.ShardGreen.Description\n#: /Game/SO/Items/Shards/ShardGreen.ShardGreen.Description\nmsgctxt \"ItemData\"\nmsgid \"Increases the attack speed by <Green>20%</>\"\nmsgstr \"提升你 <Green>20%</>攻击速度 。\"\n\n#. Key:\tShardGreen_name\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardGreen.ShardGreen.Name\n#: /Game/SO/Items/Shards/ShardGreen.ShardGreen.Name\nmsgctxt \"ItemData\"\nmsgid \"Green Shard\"\nmsgstr \"绿色碎片\"\n\n#. Key:\tShardGreenBright_desc\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardGreenBright.ShardGreenBright.Description\n#. /Game/SO/Items/Shards/ShardGreenBright.ShardGreenBright.Description\n#: /Game/SO/Items/Shards/ShardGreenBright.ShardGreenBright.Description\nmsgctxt \"ItemData\"\nmsgid \"Increases the attack speed by <Green>30%</>\"\nmsgstr \"提升你 <Green>30%</>攻击速度 。\"\n\n#. Key:\tShardGreenBright_name\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardGreenBright.ShardGreenBright.Name\n#. /Game/SO/Items/Shards/ShardGreenBright.ShardGreenBright.Name\n#: /Game/SO/Items/Shards/ShardGreenBright.ShardGreenBright.Name\nmsgctxt \"ItemData\"\nmsgid \"Bright Green Shard\"\nmsgstr \"明亮绿色碎片\"\n\n#. Key:\tShardPurple_desc\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardPurple.ShardPurple.Description\n#: /Game/SO/Items/Shards/ShardPurple.ShardPurple.Description\nmsgctxt \"ItemData\"\nmsgid \"Each time you cast a charge based spell you have a <Purple>25%</> chance to regain the charge.\"\nmsgstr \"每次你施放一个需要充能的法术，你将有<Purple>25%</>机率获得充能。\"\n\n#. Key:\tShardPurple_name\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardPurple.ShardPurple.Name\n#: /Game/SO/Items/Shards/ShardPurple.ShardPurple.Name\nmsgctxt \"ItemData\"\nmsgid \"Purple Shard\"\nmsgstr \"紫色碎片\"\n\n#. Key:\tShardPurpleBright_desc\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardPurpleBright.ShardPurpleBright.Description\n#. /Game/SO/Items/Shards/ShardPurpleBright.ShardPurpleBright.Description\n#: /Game/SO/Items/Shards/ShardPurpleBright.ShardPurpleBright.Description\nmsgctxt \"ItemData\"\nmsgid \"Each time you cast a charge based spell you have a <Purple>50%</> chance to regain the charge.\"\nmsgstr \"每次你施放一个需要充能的法术，你将有<Purple>50%</>机率获得充能。\"\n\n#. Key:\tShardPurpleBright_name\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardPurpleBright.ShardPurpleBright.Name\n#. /Game/SO/Items/Shards/ShardPurpleBright.ShardPurpleBright.Name\n#: /Game/SO/Items/Shards/ShardPurpleBright.ShardPurpleBright.Name\nmsgctxt \"ItemData\"\nmsgid \"Bright Purple Shard\"\nmsgstr \"明亮紫色碎片\"\n\n#. Key:\tShardRed_desc\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardRed.ShardRed.Description\n#: /Game/SO/Items/Shards/ShardRed.ShardRed.Description\nmsgctxt \"ItemData\"\nmsgid \"You heal <Red>5%</> of the melee damage you inflict on your enemies.\"\nmsgstr \"你可恢复<Red>5%</>你给敌人造成的近战伤害。\"\n\n#. Key:\tShardRed_name\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardRed.ShardRed.Name\n#: /Game/SO/Items/Shards/ShardRed.ShardRed.Name\nmsgctxt \"ItemData\"\nmsgid \"Red Shard\"\nmsgstr \"红色碎片\"\n\n#. Key:\tShardRedBright_desc\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardRedBright.ShardRedBright.Description\n#. /Game/SO/Items/Shards/ShardRedBright.ShardRedBright.Description\n#: /Game/SO/Items/Shards/ShardRedBright.ShardRedBright.Description\nmsgctxt \"ItemData\"\nmsgid \"You heal <Red>10%</> of the melee damage you inflict on your enemies.\"\nmsgstr \"你可恢复<Red>10%</>你给敌人造成的近战伤害。\"\n\n#. Key:\tShardRedBright_name\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardRedBright.ShardRedBright.Name\n#: /Game/SO/Items/Shards/ShardRedBright.ShardRedBright.Name\nmsgctxt \"ItemData\"\nmsgid \"Bright Red Shard\"\nmsgstr \"明亮红色碎片\"\n\n#. Key:\tShardSilver_desc\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardSilver.ShardSilver.Description\n#: /Game/SO/Items/Shards/ShardSilver.ShardSilver.Description\nmsgctxt \"ItemData\"\nmsgid \"Decreases the incoming <White>Physical Damage</> by <White>20%.</>\"\nmsgstr \"降低遭受的 <White>物理伤害</> <White>20%。</>\"\n\n#. Key:\tShardSilver_name\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardSilver.ShardSilver.Name\n#: /Game/SO/Items/Shards/ShardSilver.ShardSilver.Name\nmsgctxt \"ItemData\"\nmsgid \"Silver Shard\"\nmsgstr \"银色碎片\"\n\n#. Key:\tShardSilverBright_desc\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardSilverBright.ShardSilverBright.Description\n#. /Game/SO/Items/Shards/ShardSilverBright.ShardSilverBright.Description\n#: /Game/SO/Items/Shards/ShardSilverBright.ShardSilverBright.Description\nmsgctxt \"ItemData\"\nmsgid \"Decreases the incoming <White>Physical Damage</> by <White>30%.</>\"\nmsgstr \"使下一次<White>物理伤害</> 降低 <White>30%。</>\"\n\n#. Key:\tShardSilverBright_name\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardSilverBright.ShardSilverBright.Name\n#. /Game/SO/Items/Shards/ShardSilverBright.ShardSilverBright.Name\n#: /Game/SO/Items/Shards/ShardSilverBright.ShardSilverBright.Name\nmsgctxt \"ItemData\"\nmsgid \"Bright Silver Shard\"\nmsgstr \"明亮银色碎片\"\n\n#. Key:\tShardTeal_desc\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardTeal.ShardTeal.Description\n#: /Game/SO/Items/Shards/ShardTeal.ShardTeal.Description\nmsgctxt \"ItemData\"\nmsgid \"Each time an enemy hits you with a melee strike it suffers the same damage.\"\nmsgstr \"每次敌人用近战攻击攻击你，它都会受到相同的伤害。\"\n\n#. Key:\tShardTeal_name\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardTeal.ShardTeal.Name\n#: /Game/SO/Items/Shards/ShardTeal.ShardTeal.Name\nmsgctxt \"ItemData\"\nmsgid \"Teal Shard\"\nmsgstr \"青色碎片\"\n\n#. Key:\tShardTealBright_desc\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardTealBright.ShardTealBright.Description\n#. /Game/SO/Items/Shards/ShardTealBright.ShardTealBright.Description\n#: /Game/SO/Items/Shards/ShardTealBright.ShardTealBright.Description\nmsgctxt \"ItemData\"\nmsgid \"Each time an enemy hits you, it suffers <Green>200%</> of the damage.\"\nmsgstr \"每次敌人攻击你，它都会受到<Green>200%</>的伤害。\"\n\n#. Key:\tShardTealBright_name\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardTealBright.ShardTealBright.Name\n#: /Game/SO/Items/Shards/ShardTealBright.ShardTealBright.Name\nmsgctxt \"ItemData\"\nmsgid \"Bright Teal Shard\"\nmsgstr \"明亮青色碎片\"\n\n#. Key:\tShardWhite_desc\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardWhite.ShardWhite.Description\n#: /Game/SO/Items/Shards/ShardWhite.ShardWhite.Description\nmsgctxt \"ItemData\"\nmsgid \"Increases your damage by <Green>20%</>\"\nmsgstr \"提升你的伤害 <Green>20%</>。\"\n\n#. Key:\tShardWhite_name\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardWhite.ShardWhite.Name\n#: /Game/SO/Items/Shards/ShardWhite.ShardWhite.Name\nmsgctxt \"ItemData\"\nmsgid \"White Shard\"\nmsgstr \"白色碎片\"\n\n#. Key:\tShardWhiteBright_desc\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardWhiteBright.ShardWhiteBright.Description\n#. /Game/SO/Items/Shards/ShardWhiteBright.ShardWhiteBright.Description\n#: /Game/SO/Items/Shards/ShardWhiteBright.ShardWhiteBright.Description\nmsgctxt \"ItemData\"\nmsgid \"Increases your damage by <Green>30%</>.\"\nmsgstr \"提升你的伤害 <Green>30%</>。\"\n\n#. Key:\tShardWhiteBright_name\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardWhiteBright.ShardWhiteBright.Name\n#. /Game/SO/Items/Shards/ShardWhiteBright.ShardWhiteBright.Name\n#: /Game/SO/Items/Shards/ShardWhiteBright.ShardWhiteBright.Name\nmsgctxt \"ItemData\"\nmsgid \"Bright White Shard\"\nmsgstr \"明亮白色碎片\"\n\n#. Key:\tShardYellow_desc\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardYellow.ShardYellow.Description\n#: /Game/SO/Items/Shards/ShardYellow.ShardYellow.Description\nmsgctxt \"ItemData\"\nmsgid \"Each melee strike has a <Yellow>10%</> chance to <Yellow>Stun</> the target.\"\nmsgstr \"每次近战攻击有 <Yellow>10%</> 机率 <Yellow>击晕</> 对方。\"\n\n#. Key:\tShardYellow_name\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardYellow.ShardYellow.Name\n#: /Game/SO/Items/Shards/ShardYellow.ShardYellow.Name\nmsgctxt \"ItemData\"\nmsgid \"Yellow Shard\"\nmsgstr \"黄色碎片\"\n\n#. Key:\tShardYellowBright_desc\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardYellowBright.ShardYellowBright.Description\n#. /Game/SO/Items/Shards/ShardYellowBright.ShardYellowBright.Description\n#: /Game/SO/Items/Shards/ShardYellowBright.ShardYellowBright.Description\nmsgctxt \"ItemData\"\nmsgid \"Each melee strike has a <Yellow>20%</> chance to <Yellow>Stun</> the target.\"\nmsgstr \"每次近战攻击有 <Yellow>20%</> 机率 <Yellow>击晕</> 对方。\"\n\n#. Key:\tShardYellowBright_name\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardYellowBright.ShardYellowBright.Name\n#. /Game/SO/Items/Shards/ShardYellowBright.ShardYellowBright.Name\n#: /Game/SO/Items/Shards/ShardYellowBright.ShardYellowBright.Name\nmsgctxt \"ItemData\"\nmsgid \"Bright Yellow Shard\"\nmsgstr \"明亮黄色碎片\"\n\n#. Key:\tSpellCaster_desc\n#. SourceLocation:\t/Game/SO/Items/Useable/SpellCaster.SpellCaster.Description\n#: /Game/SO/Items/Useable/SpellCaster.SpellCaster.Description\nmsgctxt \"ItemData\"\nmsgid \"A magical artefact with the following worn text engraved on the back:\\r\\n\\r\\nInsert Runestones to ... spells\\r\\nKeep .... .... children\\r\\nMade in .....\"\nmsgstr \"这是一件神奇的工艺品，背面刻有如下文字:\\n\\n插入符石到…法术\\n保持.... ....孩子们\\n制造者为.....\"\n\n#. Key:\tSpellCaster_name\n#. SourceLocation:\t/Game/SO/Items/Useable/SpellCaster.SpellCaster.Name\n#: /Game/SO/Items/Useable/SpellCaster.SpellCaster.Name\nmsgctxt \"ItemData\"\nmsgid \"Spellcaster\"\nmsgstr \"施法者\"\n\n#. Key:\tStraightSword_desc\n#. SourceLocation:\t/Game/SO/Items/Weapons/StraightSword.StraightSword.Description\n#. /Game/SO/Items/Weapons/StraightSword.StraightSword.Description\n#: /Game/SO/Items/Weapons/StraightSword.StraightSword.Description\nmsgctxt \"ItemData\"\nmsgid \"A simple yet effective weapon. Not too rusty, not too sharp. If someone looks close enough it looks a bit low budget, but the ones looking close enough won't talk about anything anymore, will they?\"\nmsgstr \"一个简单而有效的武器。并无多少生锈，却也不太锋利。\"\n\n#. Key:\tStraightSword_name\n#. SourceLocation:\t/Game/SO/Items/Weapons/StraightSword.StraightSword.Name\n#: /Game/SO/Items/Weapons/StraightSword.StraightSword.Name\nmsgctxt \"ItemData\"\nmsgid \"Straight Sword\"\nmsgstr \"直剑\"\n\n#. Key:\tTestStoneBag_desc\n#. SourceLocation:\t/Game/SO/Items/Useable/TestStoneBag.TestStoneBag.Description\n#. /Game/SO/Items/Useable/TestStoneBag.TestStoneBag.Description\n#: /Game/SO/Items/Useable/TestStoneBag.TestStoneBag.Description\nmsgctxt \"ItemData\"\nmsgid \"When you are the one in the team who has the job to enter every dungeon first, you will become a careful one too... if you live long enough for that.\"\nmsgstr \"当你成为团队中每次第一个进入地牢的人，你也是最小心的那个…… 如果你能活得足够长。\"\n\n#. Key:\tTestStoneBag_name\n#. SourceLocation:\t/Game/SO/Items/Useable/TestStoneBag.TestStoneBag.Name\n#: /Game/SO/Items/Useable/TestStoneBag.TestStoneBag.Name\nmsgctxt \"ItemData\"\nmsgid \"Bag of the Careful One\"\nmsgstr \"细心袋子\"\n\n#. Key:\tWheel_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/Wheel.Wheel.Description\n#: /Game/SO/Items/QuestItems/Wheel.Wheel.Description\nmsgctxt \"ItemData\"\nmsgid \"One of the first greatest inventions of humans. Because they envied balls for their rolling skill.\"\nmsgstr \"人类最伟大的发明之一。因为他们羡慕球形物体的滚动技术。\"\n\n#. Key:\tWheel_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/Wheel.Wheel.Name\n#: /Game/SO/Items/QuestItems/Wheel.Wheel.Name\nmsgctxt \"ItemData\"\nmsgid \"Wheel\"\nmsgstr \"轮子\"\n\n#. Key:\tWWBossShipLock_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/WWBossShipLock.WWBossShipLock.Description\n#. /Game/SO/Items/Keys/WWBossShipLock.WWBossShipLock.Description\n#: /Game/SO/Items/Keys/WWBossShipLock.WWBossShipLock.Description\nmsgctxt \"ItemData\"\nmsgid \"Rusty key of a rusty lock.\"\nmsgstr \"生锈锁的生锈钥匙。\"\n\n#. Key:\tWWBossShipLock_name\n#. SourceLocation:\t/Game/SO/Items/Keys/WWBossShipLock.WWBossShipLock.Name\n#: /Game/SO/Items/Keys/WWBossShipLock.WWBossShipLock.Name\nmsgctxt \"ItemData\"\nmsgid \"Rusty Key\"\nmsgstr \"生锈的钥匙\"\n\n#. Key:\t0BFD568E4989A20D66B91DA476C0E6B4\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_6.Text\n#: /Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_6.Text\nmsgctxt \"Notes\"\nmsgid \"I promised Fountain to give its flower to the Magic Mirror.\"\nmsgstr \"我答应许愿泉把它的花送给魔镜。\"\n\n#. Key:\t1ABD11A64A7649801A6AB6A8BBDC686C\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_9.Text\n#. /Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_9.Text\n#: /Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_9.Text\nmsgctxt \"Notes\"\nmsgid \"The Ghost Dwarf needs a ghost abacus\"\nmsgstr \"这个矮人幽魂需要一个幽灵算盘\"\n\n#. Key:\t57CBE1274A1B4EC7FD68EA9288161AAD\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_7.Text\n#. /Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_7.Text\n#: /Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_7.Text\nmsgctxt \"Notes\"\nmsgid \"The Chef wants me to clear the shore\"\nmsgstr \"厨师要我清理海岸\"\n\n#. Key:\t77693D6C43702786250364932BD34BCD\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note.Text\n#. /Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note.Text\n#: /Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note.Text\nmsgctxt \"Notes\"\nmsgid \"The GateKeeper could use a chair\"\nmsgstr \"守护者可以使用一把椅子\"\n\n#. Key:\t9C3FB78C4598A48BC187B580CBB070F6\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_8.Text\n#. /Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_8.Text\n#: /Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_8.Text\nmsgctxt \"Notes\"\nmsgid \"The Dwarf wants me to clear the Dwarven Fortress\"\nmsgstr \"矮人要我清除矮人要塞\"\n\n#. Key:\tAA94EB6E4B0A505D730971932A3DE0CC\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_5.Text\n#. /Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_5.Text\n#: /Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_5.Text\nmsgctxt \"Notes\"\nmsgid \"The Golem Maker wants me to hunt some Golems\"\nmsgstr \"机器人制造者要我去捕猎一些机器人\"\n\n#. Key:\tAE371E564EC1D75947ECF98AAA896A2C\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_11.Text\n#. /Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_11.Text\n#: /Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_11.Text\nmsgctxt \"Notes\"\nmsgid \"A Pipe Walker is trapped in a cage\"\nmsgstr \"一个管道行走者被困在笼子里\"\n\n#. Key:\tB12481ED4CFF0182EDB7ACAA416B55FC\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_4.Text\n#. /Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_4.Text\n#: /Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_4.Text\nmsgctxt \"Notes\"\nmsgid \"Gnory needs a wheel\"\nmsgstr \"格诺里需要一个轮子\"\n\n#. Key:\tD3B6D81E433CBE8461E2B1AFE06E9741\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_13.Text\n#. /Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_13.Text\n#: /Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_13.Text\nmsgctxt \"Notes\"\nmsgid \"The Chef asked me to bring him some Purple Mushroom\"\nmsgstr \"厨师让我给他带些紫色蘑菇\"\n\n#. Key:\tD8C4FFC7435C6A2E7C88BBA7109A1907\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_12.Text\n#. /Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_12.Text\n#: /Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_12.Text\nmsgctxt \"Notes\"\nmsgid \"I need to learn Dwarven to open a gate\"\nmsgstr \"我需要学习矮人如何开门\"\n\n#. Key:\tE3857F07468C2A0B34A98887E3BBB1DA\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_10.Text\n#. /Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_10.Text\n#: /Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_10.Text\nmsgctxt \"Notes\"\nmsgid \"I feel the Tomb of Tabby is important somehow\"\nmsgstr \"我觉得泰比之墓很重要。\"\n\n#. Key:\tE9DA40684B9375A5F78D18A138C75174\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_2.Text\n#. /Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_2.Text\n#: /Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_2.Text\nmsgctxt \"Notes\"\nmsgid \"Teachy asked for a strangely unique device\"\nmsgstr \"老师需要一种奇特而独特的装置\"\n\n#. Key:\tF109A1614B16565CC1846C8D0A46672E\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_1.Text\n#. /Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_1.Text\n#: /Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_1.Text\nmsgctxt \"Notes\"\nmsgid \"I promised Lory to bring her some books\"\nmsgstr \"我答应劳里给她带几本书来\"\n\n#. Key:\taway\n#. SourceLocation:\tSource/SOrb/UI/InGame/SoUIStationPanel.cpp:98\n#: Source/SOrb/UI/InGame/SoUIStationPanel.cpp:98\nmsgctxt \"StationNames\"\nmsgid \"World's End\"\nmsgstr \"世界尽头\"\n\n#. Key:\tcrossroadcave\n#. SourceLocation:\tSource/SOrb/UI/InGame/SoUIStationPanel.cpp:94\n#: Source/SOrb/UI/InGame/SoUIStationPanel.cpp:94\nmsgctxt \"StationNames\"\nmsgid \"Crossroad Cave\"\nmsgstr \"十字路口洞穴\"\n\n#. Key:\tlavatemple\n#. SourceLocation:\tSource/SOrb/UI/InGame/SoUIStationPanel.cpp:96\n#: Source/SOrb/UI/InGame/SoUIStationPanel.cpp:96\nmsgctxt \"StationNames\"\nmsgid \"Remnant Road\"\nmsgstr \"残余之路\"\n\n#. Key:\toutpost\n#. SourceLocation:\tSource/SOrb/UI/InGame/SoUIStationPanel.cpp:95\n#: Source/SOrb/UI/InGame/SoUIStationPanel.cpp:95\nmsgctxt \"StationNames\"\nmsgid \"Obedient Outpost\"\nmsgstr \"顺从的前哨\"\n\n#. Key:\tstay\n#. SourceLocation:\tSource/SOrb/UI/InGame/SoUIStationPanel.cpp:99\n#: Source/SOrb/UI/InGame/SoUIStationPanel.cpp:99\nmsgctxt \"StationNames\"\nmsgid \"Stay\"\nmsgstr \"停留\"\n\n#. Key:\twrackedWaters\n#. SourceLocation:\tSource/SOrb/UI/InGame/SoUIStationPanel.cpp:97\n#: Source/SOrb/UI/InGame/SoUIStationPanel.cpp:97\nmsgctxt \"StationNames\"\nmsgid \"Wracked Waters\"\nmsgstr \"毁坏之水\"\n\n"
  },
  {
    "path": "Content/Localization/Warriorb/zh-Hant/Warriorb.po",
    "content": "﻿# Warriorb Chinese (Traditional) translation.\n# Copyright 1998-2019 Epic Games, Inc. All Rights Reserved.\n# \nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: Warriorb\\n\"\n\"POT-Creation-Date: 2020-10-07 08:12\\n\"\n\"PO-Revision-Date: 2020-10-07 08:12\\n\"\n\"Language-Team: \\n\"\n\"Language: zh-Hant\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Plural-Forms: nplurals=1; plural=0;\\n\"\n\n#. Key:\t78A72CB345FCC7ECDCFD8181471D78D8\n#. SourceLocation:\t/Game/SO/GUI/UI_Credits.UI_Credits_C:WidgetTree.CreditsText.Text\n#: /Game/SO/GUI/UI_Credits.UI_Credits_C:WidgetTree.CreditsText.Text\nmsgid \"<T>-- Not Yet Team --</>\\r\\n\\r\\n\\r\\nAnna Molnár\\r\\n<R>2D art, Environment Design</>\\r\\n\\r\\n\\r\\nCsaba Molnár\\r\\n<R>Code, Design</>\\r\\n\\r\\n\\r\\nDaniel Butum\\r\\n<R>Code</>\\r\\n\\r\\n\\r\\nGéza Molnár\\r\\n<R>3D art, Design</>\\r\\n\\r\\n\\r\\nRichárd Ráski\\r\\n<R>Sound Design</>\\r\\n\\r\\n\\r\\n\\r\\n<T>-- Music --</>\\r\\n\\r\\nBenjámin Kuli\\r\\n\\r\\n\\r\\nGisula\\r\\n\\r\\n\\r\\n\\r\\n<T>-- Voice Over --</>\\r\\n\\r\\n\\r\\nPeter Luzsi - @peterluzsi\\r\\n<R>WarriOrb, Gatekeeper, Ghost Armor, Principal</>\\r\\n\\r\\n\\r\\nBrent Miller\\r\\n<R>WarriOrb - Trailer</>\\r\\n\\r\\n\\r\\nPierce Riola\\r\\n<R>Wizard, Gnory</>\\r\\n\\r\\n\\r\\nEir Causey\\r\\n<R>Raven, Teachy, Ghost Dwarf, Unknown Wizard, Fishy</>\\r\\n\\r\\n\\r\\nJack Broadbent\\r\\n<R>Monk, Flybug</>\\r\\n\\r\\n\\r\\nEmil Hagg\\r\\n<R>Supper Dwarf, Kobold Chef, Fallen Druid, Dwarven Statue</>\\r\\n\\r\\n\\r\\nErick Nita\\r\\n<R>Golem Maker, Armour Wrath</>\\r\\n\\r\\n\\r\\nAlain Vega\\r\\n<R>Merch Ant</>\\r\\n\\r\\n\\r\\nAngela Tran\\r\\n<R>Lillian, Pipe Walker</>\\r\\n\\r\\n\\r\\nBrittany Ann Phillips\\r\\n<R>Lory</>\\r\\n\\r\\n\\r\\nAurore Gautheur\\r\\n<R>Fountain, Shade</>\\r\\n\\r\\n\\r\\nAlexander Blairlex\\r\\n<R>Primitive Fishy, Ghost Helmet</>\\r\\n\\r\\n\\r\\nSophie Ryder\\r\\n<R>Shadesphere</>\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n<T>-- Partners --</>\\r\\n\\r\\n\\r\\nMaple Whispering\\r\\n<R>Chineese localization</>\\r\\n<R>Publisher - China, PC</>\\r\\n\\r\\n\\r\\nNovy Unlimited\\r\\n<R>PR and Marketing</>\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n<T>-- Localization --</>\\r\\n\\r\\n\\r\\nVera Liscovschi\\r\\n<R>Russian</>\\r\\n\\r\\n\\r\\nJay Johnstone\\r\\n<R>Spanish</>\\r\\n\\r\\n\\r\\nBertin William\\r\\n<R>French</>\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n<T>-- Testers --</>\\r\\n\\r\\n\\r\\nSaleymander\\r\\n\\r\\n\\r\\nHitch\\r\\n\\r\\n\\r\\nMrCalculated\\r\\n\\r\\n\\r\\n<img id=\\\"Rainbow\\\"/>Scorpion253<img id=\\\"Rainbow\\\"/>\\r\\n\\r\\n\\r\\nmoses\\r\\n\\r\\n\\r\\nNinjin42\\r\\n\\r\\n\\r\\nKonstantinos Xenitidis\\r\\n\\r\\n\\r\\nPhyronnaz\\r\\n\\r\\n\\r\\nArthur\\r\\n\\r\\n\\r\\nMaster1G\\r\\n\\r\\n\\r\\nDávid Bartók\\r\\n\\r\\n\\r\\nLiDuGaming\\r\\n\\r\\n\\r\\nClaudiu Coman\\r\\n\\r\\n\\r\\nÁron Ürögdi\\r\\n\\r\\n\\r\\nDukenukemboi\\r\\n\\r\\n\\r\\nBart Cools\\r\\n\\r\\n\\r\\nGlenn De Jonghe\\r\\n\\r\\n\\r\\nDomonkos Péter Madarász\\r\\n\\r\\n\\r\\nGergő Gyarmati\\r\\n\\r\\n\\r\\nRéka Gyarmati\\r\\n\\r\\n\\r\\nKincső Petraskó\\r\\n\\r\\n\\r\\nGergő Petraskó\\r\\n\\r\\n\\r\\nDániel Garamvölgyi\\r\\n\\r\\n\\r\\nDanny \\\"GHelmet\\\" Cloutier\\r\\n\\r\\n\\r\\nAnna Boglárka Tóth\\r\\n\\r\\n\\r\\nBíborka Roxána Kubik\\r\\n\\r\\n\\r\\nVirág Miklós\\r\\n\\r\\n\\r\\nBenedek Marozsák\\r\\n\\r\\n\\r\\nDániel Marozsák\\r\\n\\r\\n\\r\\nGereon Bartel\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n<T>-- Prologue Speedrun Competition Winner --</>\\r\\n\\r\\n-7\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n<T>-- Special Thanks --</>\\r\\n\\r\\n\\r\\nMalazan Discord Server Community\\r\\n\\r\\n\\r\\n/r/metroidvenia Discord Server Community\\r\\n\\r\\n\\r\\nUnreal Slackers Discord Server Community\\r\\n\\r\\n\\r\\nIMGUR\\r\\n\\r\\n\\r\\nBíborka Roxána Kubik\\r\\n\\r\\n\\r\\nSergiu Crăiţoiu\\r\\n\\r\\n\\r\\nJuhász Ernő\\r\\n\\r\\n\\r\\nRacheal Smith\\r\\n\\r\\n\\r\\nRuxandra Seniuc\\r\\n\\r\\n\\r\\nthottee\\r\\n\\r\\n\\r\\nAndrew Pappas\\r\\n\\r\\n\\r\\nJonathan Lampel\\r\\n\\r\\n\\r\\nRichárd Németh\\r\\n\\r\\n\\r\\nAlex Gorcea\\r\\n\\r\\n\\r\\nNotRealVitor\\r\\n\\r\\n\\r\\nKinga Surján\\r\\n\\r\\n\\r\\nAnna Boglárka Tóth\\r\\n\\r\\n\\r\\nÉvi Fekete\\r\\n\\r\\n\\r\\nGergő Sielaf\\r\\n\\r\\n\\r\\n<img id=\\\"Rainbow\\\"/>Scorpion253<img id=\\\"Rainbow\\\"/>\\r\\n\\r\\n\\r\\nMainiac\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n<T>-- Technology --</>\\r\\n\\r\\n\\r\\n<R>WarriOrb uses the Unreal® Engine.</>\\r\\n<R>Unreal® is a trademark or registered trademark of Epic Games, Inc. in the United States of America and elsewhere</>\\r\\n\\r\\n<R>Unreal® Engine, Copyright 1998 – 2020, Epic Games, Inc. All rights reserved.</>\\r\\n\\r\\n\\r\\n\\r\\n<R>Made with FMOD Studio by Firelight Technologies Pty Ltd.</>\"\nmsgstr \"\"\n\n#. Key:\tAxeSpecial_name\n#. SourceLocation:\t/Game/SO/CharacterStrikes/AxeSpecial.AxeSpecial.StrikeName\n#: /Game/SO/CharacterStrikes/AxeSpecial.AxeSpecial.StrikeName\nmsgctxt \"CharacterStrike\"\nmsgid \"Throw\"\nmsgstr \"扔\"\n\n#. Key:\tDemonSwordSpecial_name\n#. SourceLocation:\t/Game/SO/CharacterStrikes/DemonSwordSpecial.DemonSwordSpecial.StrikeName\n#. /Game/SO/CharacterStrikes/DemonSwordSpecial.DemonSwordSpecial.StrikeName\n#: /Game/SO/CharacterStrikes/DemonSwordSpecial.DemonSwordSpecial.StrikeName\nmsgctxt \"CharacterStrike\"\nmsgid \"Downstrike\"\nmsgstr \"下擊\"\n\n#. Key:\tDualBladeSpecial_name\n#. SourceLocation:\t/Game/SO/CharacterStrikes/DualBladeSpecial.DualBladeSpecial.StrikeName\n#. /Game/SO/CharacterStrikes/DualBladeSpecial.DualBladeSpecial.StrikeName\n#: /Game/SO/CharacterStrikes/DualBladeSpecial.DualBladeSpecial.StrikeName\nmsgctxt \"CharacterStrike\"\nmsgid \"Backslash\"\nmsgstr \"背砍\"\n\n#. Key:\tLeafMaceSpecial_name\n#. SourceLocation:\t/Game/SO/CharacterStrikes/LeafMaceSpecial.LeafMaceSpecial.StrikeName\n#. /Game/SO/CharacterStrikes/LeafMaceSpecial.LeafMaceSpecial.StrikeName\n#: /Game/SO/CharacterStrikes/LeafMaceSpecial.LeafMaceSpecial.StrikeName\nmsgctxt \"CharacterStrike\"\nmsgid \"Crushing Blow\"\nmsgstr \"粉碎打擊\"\n\n#. Key:\tSabreSpecial_name\n#. SourceLocation:\t/Game/SO/CharacterStrikes/SabreSpecial.SabreSpecial.StrikeName\n#. /Game/SO/CharacterStrikes/SabreSpecial.SabreSpecial.StrikeName\n#: /Game/SO/CharacterStrikes/SabreSpecial.SabreSpecial.StrikeName\nmsgctxt \"CharacterStrike\"\nmsgid \"Floating Strikes\"\nmsgstr \"浮空打擊\"\n\n#. Key:\tSwordSpecialAirStrike_name\n#. SourceLocation:\t/Game/SO/CharacterStrikes/SwordSpecialAirStrike.SwordSpecialAirStrike.StrikeName\n#. /Game/SO/CharacterStrikes/SwordSpecialAirStrike.SwordSpecialAirStrike.StrikeName\n#: /Game/SO/CharacterStrikes/SwordSpecialAirStrike.SwordSpecialAirStrike.StrikeName\nmsgctxt \"CharacterStrike\"\nmsgid \"Air Strike\"\nmsgstr \"空襲\"\n\n#. Key:\tBPEftAttackSpeedMultiplier_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/BPEftAttackSpeedMultiplier.Default__BPEftAttackSpeedMultiplier_C.DisplayName\n#. /Game/SO/Blueprints/EffectInstances/BPEftAttackSpeedMultiplier.Default__BPEftAttackSpeedMultiplier_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/BPEftAttackSpeedMultiplier.Default__BPEftAttackSpeedMultiplier_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Quick Hands\"\nmsgstr \"快手\"\n\n#. Key:\tBPEftBootTransmutation_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/BPEftBootTransmutation.Default__BPEftBootTransmutation_C.DisplayName\n#. /Game/SO/Blueprints/EffectInstances/BPEftBootTransmutation.Default__BPEftBootTransmutation_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/BPEftBootTransmutation.Default__BPEftBootTransmutation_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Protective Transmutation\"\nmsgstr \"實體轉化\"\n\n#. Key:\tBPEftBounce_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftBounce.Default__BPEftBounce_C.DisplayName\n#. /Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftBounce.Default__BPEftBounce_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftBounce.Default__BPEftBounce_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Charged Bounce\"\nmsgstr \"蓄力彈跳\"\n\n#. Key:\tBPEftCooldownReducePassive02_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/BPEftCooldownReducePassive02.Default__BPEftCooldownReducePassive02_C.DisplayName\n#. Key:\tBPEftCooldownReduce_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/BPEftCooldownReduce.Default__BPEftCooldownReduce_C.DisplayName\n#. /Game/SO/Blueprints/EffectInstances/BPEftCooldownReducePassive02.Default__BPEftCooldownReducePassive02_C.DisplayName\n#. /Game/SO/Blueprints/EffectInstances/BPEftCooldownReduce.Default__BPEftCooldownReduce_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/BPEftCooldownReduce.Default__BPEftCooldownReduce_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/BPEftCooldownReducePassive02.Default__BPEftCooldownReducePassive02_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Restlessness\"\nmsgstr \"不安\"\n\n#. Key:\tBPEftCriticalChanceBoost10_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/BPEftCriticalChanceBoost10.Default__BPEftCriticalChanceBoost10_C.DisplayName\n#. /Game/SO/Blueprints/EffectInstances/BPEftCriticalChanceBoost10.Default__BPEftCriticalChanceBoost10_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/BPEftCriticalChanceBoost10.Default__BPEftCriticalChanceBoost10_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Critical Chance\"\nmsgstr \"暴擊率\"\n\n#. Key:\tBPEftDamageReflection_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/BPEftDamageReflection.Default__BPEftDamageReflection_C.DisplayName\n#. /Game/SO/Blueprints/EffectInstances/BPEftDamageReflection.Default__BPEftDamageReflection_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/BPEftDamageReflection.Default__BPEftDamageReflection_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Sparks of Vengeance\"\nmsgstr \"復仇火花\"\n\n#. Key:\tBPEftDmgModifier_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftDmgModifier.Default__BPEftDmgModifier_C.DisplayName\n#. /Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftDmgModifier.Default__BPEftDmgModifier_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftDmgModifier.Default__BPEftDmgModifier_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Perfect Hands\"\nmsgstr \"完美之手\"\n\n#. Key:\tBPEftHeal3_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/BPEftHeal3.Default__BPEftHeal3_C.DisplayName\n#. /Game/SO/Blueprints/EffectInstances/BPEftHeal3.Default__BPEftHeal3_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/BPEftHeal3.Default__BPEftHeal3_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Heal\"\nmsgstr \"治愈\"\n\n#. Key:\tBPEftLifeLeech5_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/BPEftLifeLeech5.Default__BPEftLifeLeech5_C.DisplayName\n#. /Game/SO/Blueprints/EffectInstances/BPEftLifeLeech5.Default__BPEftLifeLeech5_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/BPEftLifeLeech5.Default__BPEftLifeLeech5_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Life Leech\"\nmsgstr \"活水蛭\"\n\n#. Key:\tBPEftMagicMissle_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftMagicMissle.Default__BPEftMagicMissle_C.DisplayName\n#. /Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftMagicMissle.Default__BPEftMagicMissle_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftMagicMissle.Default__BPEftMagicMissle_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Magic Missile\"\nmsgstr \"魔法導彈\"\n\n#. Key:\tBPEftMassMagicMissle_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftMassMagicMissle.Default__BPEftMassMagicMissle_C.DisplayName\n#. /Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftMassMagicMissle.Default__BPEftMassMagicMissle_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftMassMagicMissle.Default__BPEftMassMagicMissle_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Magic Missiles\"\nmsgstr \"魔法導彈\"\n\n#. Key:\tBPEftMassSlow_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftMassSlow.Default__BPEftMassSlow_C.DisplayName\n#. Key:\tBPEftSlow_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/BPEftSlow.Default__BPEftSlow_C.DisplayName\n#. /Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftMassSlow.Default__BPEftMassSlow_C.DisplayName\n#. /Game/SO/Blueprints/EffectInstances/BPEftSlow.Default__BPEftSlow_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/BPEftSlow.Default__BPEftSlow_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftMassSlow.Default__BPEftMassSlow_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Slow\"\nmsgstr \"慢\"\n\n#. Key:\tBPEftMeteorShower_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftMeteorShower.Default__BPEftMeteorShower_C.DisplayName\n#. /Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftMeteorShower.Default__BPEftMeteorShower_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftMeteorShower.Default__BPEftMeteorShower_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Meteor Shower\"\nmsgstr \"流星雨\"\n\n#. Key:\tBPEftRegainSpellPassive25_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/BPEftRegainSpellPassive25.Default__BPEftRegainSpellPassive25_C.DisplayName\n#. /Game/SO/Blueprints/EffectInstances/BPEftRegainSpellPassive25.Default__BPEftRegainSpellPassive25_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/BPEftRegainSpellPassive25.Default__BPEftRegainSpellPassive25_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Arcane Luck\"\nmsgstr \"奧術運氣\"\n\n#. Key:\tBPEftRegainSpells_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/BPEftRegainSpells.Default__BPEftRegainSpells_C.DisplayName\n#. /Game/SO/Blueprints/EffectInstances/BPEftRegainSpells.Default__BPEftRegainSpells_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/BPEftRegainSpells.Default__BPEftRegainSpells_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Restoration\"\nmsgstr \"恢復\"\n\n#. Key:\tBPEftResModifierMagicalStrong_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftResModifierMagicalStrong.Default__BPEftResModifierMagicalStrong_C.DisplayName\n#. Key:\tBPEftResModifierMagical_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftResModifierMagical.Default__BPEftResModifierMagical_C.DisplayName\n#. /Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftResModifierMagicalStrong.Default__BPEftResModifierMagicalStrong_C.DisplayName\n#. /Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftResModifierMagical.Default__BPEftResModifierMagical_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftResModifierMagical.Default__BPEftResModifierMagical_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftResModifierMagicalStrong.Default__BPEftResModifierMagicalStrong_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Wardskin\"\nmsgstr \"防護皮膚\"\n\n#. Key:\tBPEftResModifierPhysical_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftResModifierPhysical.Default__BPEftResModifierPhysical_C.DisplayName\n#. /Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftResModifierPhysical.Default__BPEftResModifierPhysical_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftResModifierPhysical.Default__BPEftResModifierPhysical_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Stoneskin\"\nmsgstr \"石化皮膚\"\n\n#. Key:\tBPEftSecondChance_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/BPEftSecondChance.Default__BPEftSecondChance_C.DisplayName\n#. /Game/SO/Blueprints/EffectInstances/BPEftSecondChance.Default__BPEftSecondChance_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/BPEftSecondChance.Default__BPEftSecondChance_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Second Chance\"\nmsgstr \"第二次機會\"\n\n#. Key:\tBPEftSpellFire0_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftSpellFire0.Default__BPEftSpellFire0_C.DisplayName\n#. /Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftSpellFire0.Default__BPEftSpellFire0_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftSpellFire0.Default__BPEftSpellFire0_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Firestrike\"\nmsgstr \"火焰襲擊\"\n\n#. Key:\tBPEftSpellLightningWalk_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftSpellLightningWalk.Default__BPEftSpellLightningWalk_C.DisplayName\n#. /Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftSpellLightningWalk.Default__BPEftSpellLightningWalk_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftSpellLightningWalk.Default__BPEftSpellLightningWalk_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Shockwalk\"\nmsgstr \"沖擊步\"\n\n#. Key:\tBPEftSpellShadowWalk_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftSpellShadowWalk.Default__BPEftSpellShadowWalk_C.DisplayName\n#. /Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftSpellShadowWalk.Default__BPEftSpellShadowWalk_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftSpellShadowWalk.Default__BPEftSpellShadowWalk_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Shadewalk\"\nmsgstr \"暗影疾步\"\n\n#. Key:\tBPEftSpellShield_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftSpellShield.Default__BPEftSpellShield_C.DisplayName\n#. /Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftSpellShield.Default__BPEftSpellShield_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftSpellShield.Default__BPEftSpellShield_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Shield\"\nmsgstr \"護盾\"\n\n#. Key:\tBPEftSpellSoulKeeper_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftSpellSoulKeeper.Default__BPEftSpellSoulKeeper_C.DisplayName\n#. /Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftSpellSoulKeeper.Default__BPEftSpellSoulKeeper_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftSpellSoulKeeper.Default__BPEftSpellSoulKeeper_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Soulbind\"\nmsgstr \"靈魂束縛\"\n\n#. Key:\tBPEftStun_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/BPEftStun.Default__BPEftStun_C.DisplayName\n#. /Game/SO/Blueprints/EffectInstances/BPEftStun.Default__BPEftStun_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/BPEftStun.Default__BPEftStun_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Stun\"\nmsgstr \"眩暈\"\n\n#. Key:\tBPEftStunPassive10_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/BPEftStunPassive10.Default__BPEftStunPassive10_C.DisplayName\n#. /Game/SO/Blueprints/EffectInstances/BPEftStunPassive10.Default__BPEftStunPassive10_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/BPEftStunPassive10.Default__BPEftStunPassive10_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Stun Chance\"\nmsgstr \"眩暈幾率\"\n\n#. Key:\tBPEftSwap_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftSwap.Default__BPEftSwap_C.DisplayName\n#. /Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftSwap.Default__BPEftSwap_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftSwap.Default__BPEftSwap_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Swap\"\nmsgstr \"交換\"\n\n#. Key:\tBPEftTempHPMagical_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftTempHPMagical.Default__BPEftTempHPMagical_C.DisplayName\n#. /Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftTempHPMagical.Default__BPEftTempHPMagical_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftTempHPMagical.Default__BPEftTempHPMagical_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Magical Protection\"\nmsgstr \"魔法防護\"\n\n#. Key:\tBPEftTempHPPhysical_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftTempHPPhysical.Default__BPEftTempHPPhysical_C.DisplayName\n#. /Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftTempHPPhysical.Default__BPEftTempHPPhysical_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/CharacterSpells/BPEftTempHPPhysical.Default__BPEftTempHPPhysical_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Physical Protection\"\nmsgstr \"物理防護\"\n\n#. Key:\tBPEftWeaponFlamesTimeBased_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/BPEftWeaponFlamesTimeBased.Default__BPEftWeaponFlamesTimeBased_C.DisplayName\n#. /Game/SO/Blueprints/EffectInstances/BPEftWeaponFlamesTimeBased.Default__BPEftWeaponFlamesTimeBased_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/BPEftWeaponFlamesTimeBased.Default__BPEftWeaponFlamesTimeBased_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Greenflame\"\nmsgstr \"慘綠魔焰\"\n\n#. Key:\tBPEftWorthy_name\n#. SourceLocation:\t/Game/SO/Blueprints/EffectInstances/BPEftWorthy.Default__BPEftWorthy_C.DisplayName\n#. /Game/SO/Blueprints/EffectInstances/BPEftWorthy.Default__BPEftWorthy_C.DisplayName\n#: /Game/SO/Blueprints/EffectInstances/BPEftWorthy.Default__BPEftWorthy_C.DisplayName\nmsgctxt \"EffectInstance\"\nmsgid \"Worthy\"\nmsgstr \"有價值的\"\n\n#. Key:\t1E42901841F4C7CEF39536A762076EDF\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.UI_EndScreen_SaveCreatures_C:WidgetTree.TBC1.Text\n#. Key:\t5D04206A499A8B42AF77BAA8BC9B4B8B\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.UI_EndScreen_SaveCreatures_C:WidgetTree.TBC0.Text\n#. Key:\tB0EEBB754110D2821640BE990002AC36\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.UI_EndScreen_SaveCreatures_C:WidgetTree.TBC2.Text\n#. Key:\tD75DCE214B56BA6FD9A58F9EEA9291A5\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.UI_EndScreen_C:WidgetTree.TBC0.Text\n#. /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.UI_EndScreen_SaveCreatures_C:WidgetTree.TBC1.Text\n#. /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.UI_EndScreen_SaveCreatures_C:WidgetTree.TBC0.Text\n#. /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.UI_EndScreen_SaveCreatures_C:WidgetTree.TBC2.Text\n#. /Game/SO/GUI/InGame/UI_EndScreen.UI_EndScreen_C:WidgetTree.TBC0.Text\n#: /Game/SO/GUI/InGame/UI_EndScreen.UI_EndScreen_C:WidgetTree.TBC0.Text\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.UI_EndScreen_SaveCreatures_C:WidgetTree.TBC0.Text\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.UI_EndScreen_SaveCreatures_C:WidgetTree.TBC1.Text\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.UI_EndScreen_SaveCreatures_C:WidgetTree.TBC2.Text\nmsgctxt \"EndScreen\"\nmsgid \"With his quest completed Monk decided to look for another activity. He thought: <Quote>‘If I could resist madness, others should be able to do the same.’</> And so he opened a monastery to share his mental training techniques with anyone willing to save its sanity.\"\nmsgstr \"任務完成後，修道士決定尋找另壹個活動。他想著: <Quote>‘如果我能抵抗瘋狂，其他人也應該能做到。’</> 於是他開辦了壹座修道院，與任何願意拯救它的人分享他的精神訓練技巧。\"\n\n#. Key:\t7279EA4741D3DAC5AE92EB99AB851ED9\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.UI_EndScreen_SaveCreatures_C:WidgetTree.TBD0.Text\n#. Key:\t77E809914A65796364FE94B8C2361FD7\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.UI_EndScreen_SaveCreatures_C:WidgetTree.TBD2.Text\n#. Key:\t9C1B477D4582ABAEDC90FCB3AC6737E7\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.UI_EndScreen_C:WidgetTree.TBD0.Text\n#. Key:\tE98C3FDD453FF80CA8EBBE94459A5CAF\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.UI_EndScreen_SaveCreatures_C:WidgetTree.TBD1.Text\n#. /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.UI_EndScreen_SaveCreatures_C:WidgetTree.TBD0.Text\n#. /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.UI_EndScreen_SaveCreatures_C:WidgetTree.TBD2.Text\n#. /Game/SO/GUI/InGame/UI_EndScreen.UI_EndScreen_C:WidgetTree.TBD0.Text\n#. /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.UI_EndScreen_SaveCreatures_C:WidgetTree.TBD1.Text\n#: /Game/SO/GUI/InGame/UI_EndScreen.UI_EndScreen_C:WidgetTree.TBD0.Text\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.UI_EndScreen_SaveCreatures_C:WidgetTree.TBD0.Text\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.UI_EndScreen_SaveCreatures_C:WidgetTree.TBD1.Text\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.UI_EndScreen_SaveCreatures_C:WidgetTree.TBD2.Text\nmsgctxt \"EndScreen\"\nmsgid \"<Size42>Separating the World also changed something in the Ruined Realm. The wind turned and even Ruin stopped for a moment.</>\"\nmsgstr \"<Size42>分隔世界也改變了被毀滅王國的壹些東西。風向變了，甚至廢墟也停了壹會兒。</>\"\n\n#. Key:\t9B476D3D4A603658683498B09968F8AA\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.UI_EndScreen_C:WidgetTree.TBB0.Text\n#. /Game/SO/GUI/InGame/UI_EndScreen.UI_EndScreen_C:WidgetTree.TBB0.Text\n#: /Game/SO/GUI/InGame/UI_EndScreen.UI_EndScreen_C:WidgetTree.TBB0.Text\nmsgctxt \"EndScreen\"\nmsgid \"When he heard about the lost Kobold tribe he got a bit excited.<Quote>‘Kobolds reserved the ancient knowledge in their rituals’</> he said. <Quote>‘If there is something we can do with Ruin it must be connected to the rituals. I’ll go with you.’</>\"\nmsgstr \"當他聽說失落的地精部落時，他有點興奮.<Quote>‘地精在他們的儀式中保留了古老的知識。’</> 他說道。 <Quote>‘如果我們能對毀滅做點什麽，那壹定是與宗教儀式有關。我和妳壹起去。’</>\"\n\n#. Key:\tDF7F9F754F4FC9CB19DF92AFCE96C5C1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.UI_EndScreen_SaveCreatures_C:WidgetTree.TBA2.Text\n#. Key:\tE8401550448E14DD70717EB7EED0582B\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.UI_EndScreen_SaveCreatures_C:WidgetTree.TBA1.Text\n#. Key:\tUI_EndScreen_entry_0_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(0).EndingLogic.Texts(1).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.UI_EndScreen_SaveCreatures_C:WidgetTree.TBA2.Text\n#. /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.UI_EndScreen_SaveCreatures_C:WidgetTree.TBA1.Text\n#. /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(0).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(0).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.UI_EndScreen_SaveCreatures_C:WidgetTree.TBA1.Text\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.UI_EndScreen_SaveCreatures_C:WidgetTree.TBA2.Text\nmsgctxt \"EndScreen\"\nmsgid \"The people soon forgot about the threat, some of them argued that Ruin ever existed.\"\nmsgstr \"人們很快就忘記了這個威脅，他們中的壹些人認為曾經有過毀滅。\"\n\n#. Key:\tE9F6E1064D5B2046DF1DEDA386012E2D\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.UI_EndScreen_C:WidgetTree.TBB2.Text\n#. Key:\tUI_EndScreen_entry_6_text_2\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(6).EndingLogic.Texts(2).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen.UI_EndScreen_C:WidgetTree.TBB2.Text\n#. /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(6).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(6).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.UI_EndScreen_C:WidgetTree.TBB2.Text\nmsgctxt \"EndScreen\"\nmsgid \"He opened a monastery to share his mental training techniques with anyone willing to save its sanity.\"\nmsgstr \"他開設了壹座修道院，與任何願意拯救它的人分享他的精神訓練技巧。\"\n\n#. Key:\tF0EAD93B44D8D7AEF306EAB75D83FB37\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.UI_EndScreen_C:WidgetTree.TBB1.Text\n#. /Game/SO/GUI/InGame/UI_EndScreen.UI_EndScreen_C:WidgetTree.TBB1.Text\n#: /Game/SO/GUI/InGame/UI_EndScreen.UI_EndScreen_C:WidgetTree.TBB1.Text\nmsgctxt \"EndScreen\"\nmsgid \"<Quote>‘If I could resist madness, others should be able to do the same’</> - he thought.\"\nmsgstr \"<Quote>‘如果我能抵抗瘋狂，其他人也應該能做到。’</> - 他如此想著。\"\n\n#. Key:\tUI_EndScreen_entry_0_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(0).EndingLogic.Texts(0).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(0).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(0).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Once the Boundaries of Worlds were sealed, Ruin could do no harm to the Human Realm again.\"\nmsgstr \"壹旦世界的邊界被封閉，毀滅就不會再對人類王國造成傷害。\"\n\n#. Key:\tUI_EndScreen_entry_10_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(10).EndingLogic.Texts(0).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(10).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(10).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Hearing these news made the Chef really excited.\"\nmsgstr \"聽到這個消息，廚師非常興奮。\"\n\n#. Key:\tUI_EndScreen_entry_10_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(10).EndingLogic.Texts(1).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(10).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(10).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"<Quote>'Could there be other survivors of my tribe?'</>\"\nmsgstr \"<Quote>'我的部落裡還有其他倖存者嗎?'</>\"\n\n#. Key:\tUI_EndScreen_entry_10_text_2\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(10).EndingLogic.Texts(2).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(10).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(10).EndingLogic.Texts(2).Texts\nmsgctxt \"EndScreen\"\nmsgid \"He decided to leave his kitchen and search for his lost relatives.\"\nmsgstr \"他決定離開廚房去尋找走失的親人。\"\n\n#. Key:\tUI_EndScreen_entry_11_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(11).EndingLogic.Texts(0).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(11).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(11).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"No one knows how he could possibly know about the soup, but Supper Dwarf also appeared to taste the food.\"\nmsgstr \"沒人知道他怎麽可能知道湯的事，但晚餐矮人似乎也嘗到了食物的味道。\"\n\n#. Key:\tUI_EndScreen_entry_11_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(11).EndingLogic.Texts(1).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(11).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(11).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"When he heard that the chef is leaving he offered his help with the trains.\"\nmsgstr \"當他聽說廚師要走的時候，他主動提出要幫忙修火車。\"\n\n#. Key:\tUI_EndScreen_entry_11_text_2\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(11).EndingLogic.Texts(2).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(11).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(11).EndingLogic.Texts(2).Texts\nmsgctxt \"EndScreen\"\nmsgid \"<Quote>‘And I would also like to check what do they eat for supper.’</> he said. <Quote>‘I’m going with you.’</>\"\nmsgstr \"<Quote>‘我還想看看他們晚飯吃什麽。’</> 他說道。 <Quote>‘我和妳壹起去。’</>\"\n\n#. Key:\tUI_EndScreen_entry_12_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(12).EndingLogic.Texts(0).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(12).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(12).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"On their way they stopped by the Golem Maker.\"\nmsgstr \"路上，他們順道拜訪了機器人制造者。\"\n\n#. Key:\tUI_EndScreen_entry_12_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(12).EndingLogic.Texts(1).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(12).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(12).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"He was just sitting and staring at nothing.\"\nmsgstr \"他只是坐著，眼神放空。\"\n\n#. Key:\tUI_EndScreen_entry_12_text_2\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(12).EndingLogic.Texts(2).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(12).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(12).EndingLogic.Texts(2).Texts\nmsgctxt \"EndScreen\"\nmsgid \"It was still hard for the Maker to accept that all his work was for nothing.\"\nmsgstr \"制作者仍然很難接受他所有的工作都是徒勞的。\"\n\n#. Key:\tUI_EndScreen_entry_12_text_3\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(12).EndingLogic.Texts(3).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(12).EndingLogic.Texts(3).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(12).EndingLogic.Texts(3).Texts\nmsgctxt \"EndScreen\"\nmsgid \"At least he stopped creating mindless stone golems.\"\nmsgstr \"至少他不再創造沒有頭腦的機器人了。\"\n\n#. Key:\tUI_EndScreen_entry_13_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(13).EndingLogic.Texts(0).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(13).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(13).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"When he heard about the lost Kobold tribe he got a bit excited.\"\nmsgstr \"當他聽說流失的地精部落時，他顯得有些興奮。\"\n\n#. Key:\tUI_EndScreen_entry_13_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(13).EndingLogic.Texts(1).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(13).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(13).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"<Quote>‘Kobolds reserved the ancient knowledge in their rituals’</> he said.\"\nmsgstr \"<Quote>‘地精在他們的儀式中保留了古老的知識’</> 他說道。\"\n\n#. Key:\tUI_EndScreen_entry_13_text_2\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(13).EndingLogic.Texts(2).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(13).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(13).EndingLogic.Texts(2).Texts\nmsgctxt \"EndScreen\"\nmsgid \"<Quote>‘If there is something we can do with Ruin it must be connected to the rituals. I’ll go with you.’</>\"\nmsgstr \"<Quote>‘如果我們能對毀滅做點什麽，那壹定是與宗教儀式有關。我要和妳壹起去.’</>\"\n\n#. Key:\tUI_EndScreen_entry_14_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(14).EndingLogic.Texts(0).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(14).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(14).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"However there are things which never change.\"\nmsgstr \"然而，有些事情永遠不會改變。\"\n\n#. Key:\tUI_EndScreen_entry_14_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(14).EndingLogic.Texts(1).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(14).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(14).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"After days of arguing on who undermined whose business Lory and Gnory separated once again.\"\nmsgstr \"在幾天關於誰攪黃了誰生意的爭論後，洛裏和格諾裏又分開了。\"\n\n#. Key:\tUI_EndScreen_entry_15_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(15).EndingLogic.Texts(0).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(15).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(15).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"While they were arguing Fishy decided to leave Gnory and set out on his own.\"\nmsgstr \"當他們在爭論的時候，呆魚決定離開格諾裏，獨自上路。\"\n\n#. Key:\tUI_EndScreen_entry_15_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(15).EndingLogic.Texts(1).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(15).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(15).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"He had no idea where he was going.\"\nmsgstr \"他不知道自己要去哪裏。\"\n\n#. Key:\tUI_EndScreen_entry_16_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(16).EndingLogic.Texts(0).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(16).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(16).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"After weeks of walking alone, he heard a faint excited voice:\"\nmsgstr \"獨自行走了幾個星期後，他聽到壹個微弱而興奮的聲音:\"\n\n#. Key:\tUI_EndScreen_entry_1_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(1).EndingLogic.Texts(0).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(1).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(1).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"The Mage Council didn’t believe a single word Lillian or Scholar told them about the events.\"\nmsgstr \"法師協對於莉莉安或斯考拉對於這次事件的描述壹個字也不相信。\"\n\n#. Key:\tUI_EndScreen_entry_1_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(1).EndingLogic.Texts(1).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(1).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(1).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"They claimed that Wizard died in an unfortunate accident and his device could never actually work anyway.\"\nmsgstr \"他們聲稱巫師死於壹場不幸的事故，他的裝置永遠也不能真正工作。\"\n\n#. Key:\tUI_EndScreen_entry_2_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(2).EndingLogic.Texts(0).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(2).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(2).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Although Lillian inherited her father’s castle she was sent to an Orphanage until she came into age to live on her own.\"\nmsgstr \"盡管莉莉安繼承了她父親的城堡，她還是被送進了孤兒院，直到她長大獨立生活。\"\n\n#. Key:\tUI_EndScreen_entry_2_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(2).EndingLogic.Texts(1).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(2).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(2).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Scholar was upset by Lillian’s decision on letting the Ruined Realm fall but he promised Lillian that he will make the Wizard’s Council let Lillian live in his estate.\"\nmsgstr \"斯科拉對莉莉安讓這個被摧毀的王國淪陷的決定感到沮喪，但他答應莉莉安，他會讓巫師協會讓莉莉安住在他的莊園裏。\"\n\n#. Key:\tUI_EndScreen_entry_3_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(3).EndingLogic.Texts(0).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(3).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(3).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Lillian didn't let the unfortunate events to overcome her. She stopped Ruin even if no one believed her.\"\nmsgstr \"莉莉安沒有讓這些不幸的事情壓倒她。即使沒有人相信她，她也不會破產。\"\n\n#. Key:\tUI_EndScreen_entry_3_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(3).EndingLogic.Texts(1).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(3).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(3).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"She also knew that the Ruined Realm still had at least a half century before it was totally destroyed so she decided to keep on looking for a way to save it.\"\nmsgstr \"她也知道，被摧毀的王國至少還有半個世紀才會完全被摧毀，所以她決定繼續尋找拯救它的方法。\"\n\n#. Key:\tUI_EndScreen_entry_3_text_2\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(3).EndingLogic.Texts(2).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(3).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(3).EndingLogic.Texts(2).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Now that her own Realm was safe she could focus on the other Realms.\"\nmsgstr \"現在她自己的領域是安全的，她可以專註於其他領域。\"\n\n#. Key:\tUI_EndScreen_entry_4_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(4).EndingLogic.Texts(0).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(4).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(4).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"<Size42>Separating the World also changed something in the Ruined Realm.</>\"\nmsgstr \"<Size42>世界的分離也改變了這片廢墟上的壹些東西。</>\"\n\n#. Key:\tUI_EndScreen_entry_4_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(4).EndingLogic.Texts(1).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(4).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(4).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"<Size42>The wind turned and even Ruin stopped for a moment.</>\"\nmsgstr \"<Size42>風向轉了，甚至廢墟也停了壹會兒。</>\"\n\n#. Key:\tUI_EndScreen_entry_5_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(5).EndingLogic.Texts(0).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(5).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(5).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"When it was certain that no one will be saved from Ruin, as a last desperate act Gate Keeper tried to open a Gate to the Human Realm himself.\"\nmsgstr \"當最後壹個絕望的守護者試圖自己打開通往人類王國的大門時，沒有人能從廢墟中被拯救出來。\"\n\n#. Key:\tUI_EndScreen_entry_5_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(5).EndingLogic.Texts(1).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(5).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(5).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"A portal opened and swallowed the Keeper.\"\nmsgstr \"壹個入口打開了，吞噬了守護者。\"\n\n#. Key:\tUI_EndScreen_entry_5_text_2\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(5).EndingLogic.Texts(2).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(5).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(5).EndingLogic.Texts(2).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Some believed he survived but no one ever met him again.\"\nmsgstr \"壹些人相信他肯定活了下來，但是沒有人再見到他。\"\n\n#. Key:\tUI_EndScreen_entry_6_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(6).EndingLogic.Texts(0).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(6).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(6).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"With his quest completed Monk decided to look for another activity.\"\nmsgstr \"任務完成後，修道士決定尋找另壹個活動。\"\n\n#. Key:\tUI_EndScreen_entry_6_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(6).EndingLogic.Texts(1).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(6).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(6).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"<Quote>‘If I could resist madness, shouldn't others be able to do the same?’</>- he wondered.\"\nmsgstr \"<Quote>“如果我能抵抗瘋狂，其他人難道不能做同樣的事嗎?”</>- 他想知道。\"\n\n#. Key:\tUI_EndScreen_entry_7_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(7).EndingLogic.Texts(0).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(7).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(7).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"To the surprise of many Teachy also joined Monk and soon he became his best student.\"\nmsgstr \"令許多老師驚訝的是，他也加入了修道院，並且很快成為他最好的學生。\"\n\n#. Key:\tUI_EndScreen_entry_7_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(7).EndingLogic.Texts(1).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(7).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(7).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"<Quote>‘To be honest I never actually wanted to be a teacher‘</> - said Teachy.\"\nmsgstr \"<Quote>“說實話，我從來沒有真正想過要當壹名老師。”</> 呆魚說道。\"\n\n#. Key:\tUI_EndScreen_entry_7_text_2\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(7).EndingLogic.Texts(2).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(7).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(7).EndingLogic.Texts(2).Texts\nmsgctxt \"EndScreen\"\nmsgid \"<Quote>'I also knew that I was a bit mad and since for my insane mind training in a monastery looked like a crazy idea I immediately knew that in fact that's the most sane thing to do.’</>\"\nmsgstr \"<Quote>“我也知道我有點瘋了，因為我在修道院接受的精神訓練看起來像壹個瘋狂的想法，我立刻意識到這是最理智的做法。”</>\"\n\n#. Key:\tUI_EndScreen_entry_8_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(8).EndingLogic.Texts(0).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(8).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(8).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Losing his connection to his master, Raven had to think again about his purpose.\"\nmsgstr \"烏鴉失去了與主人的聯系，不得不重新考慮他的目標。\"\n\n#. Key:\tUI_EndScreen_entry_8_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(8).EndingLogic.Texts(1).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(8).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(8).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"<Quote>‘I think therefore I am not a bird’</> - he said.\"\nmsgstr \"<Quote>‘因此，我想我不是壹只鳥。’</> - 他說道。\"\n\n#. Key:\tUI_EndScreen_entry_8_text_2\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(8).EndingLogic.Texts(2).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(8).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(8).EndingLogic.Texts(2).Texts\nmsgctxt \"EndScreen\"\nmsgid \"With his vast experience he couldn’t become the same thoughtless bird he once was.\"\nmsgstr \"有了豐富的經驗，他不可能再像以前那樣粗心大意了。\"\n\n#. Key:\tUI_EndScreen_entry_8_text_3\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(8).EndingLogic.Texts(3).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(8).EndingLogic.Texts(3).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(8).EndingLogic.Texts(3).Texts\nmsgctxt \"EndScreen\"\nmsgid \"He joined Monk’s monastery to teach philosophy.\"\nmsgstr \"他到修道院去教哲學。\"\n\n#. Key:\tUI_EndScreen_entry_8_text_4\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(8).EndingLogic.Texts(4).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(8).EndingLogic.Texts(4).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(8).EndingLogic.Texts(4).Texts\nmsgctxt \"EndScreen\"\nmsgid \"In his free hours he kept on studying the Ancient’s technology hoping that one day he will find a way back to Lillian.\"\nmsgstr \"在他空閑的時候，他繼續研究古人的技術，希望有壹天他會找到壹個方法回到莉莉安身邊。\"\n\n#. Key:\tUI_EndScreen_entry_9_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(9).EndingLogic.Texts(0).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(9).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(9).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"When the soup was almost ready the Pipe Walkers smelled the flavour and they all gathered for a last dinner.\"\nmsgstr \"當湯差不多準備好的時候，管道行走者聞到了味道，他們全體聚集在壹起吃最後壹頓飯。\"\n\n#. Key:\tUI_EndScreen_entry_9_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(9).EndingLogic.Texts(1).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(9).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(9).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"After lunch they started to talk.\"\nmsgstr \"午飯後，他們開始交談。\"\n\n#. Key:\tUI_EndScreen_entry_9_text_2\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(9).EndingLogic.Texts(2).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(9).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(9).EndingLogic.Texts(2).Texts\nmsgctxt \"EndScreen\"\nmsgid \"One of the Pipe Walkers, who had been in many cages mentioned that she actually met some kobolds far away.\"\nmsgstr \"其中壹個曾經被關在籠子裏的管道行走者提到，她實際上在很遠的地方遇到了壹些地精。\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_0_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(0).EndingLogic.Texts(0).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(0).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(0).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"By the time the furious crowd broke into the Wizard’s Castle the Device was completely destroyed.\"\nmsgstr \"當憤怒的人群沖進巫師的城堡時，那個裝置已經完全被摧毀了。\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_0_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(0).EndingLogic.Texts(1).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(0).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(0).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Some left, others started to investigate the building hoping to find something which might stop Ruin.\"\nmsgstr \"壹些人離開了，另壹些人開始調查這座建築，希望能找到壹些可以阻止破壞的東西。\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_10_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(10).EndingLogic.Texts(0).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(10).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(10).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"<Quote>‘Kobolds reserved the ancient knowledge in their rituals’</> Golem Maker said. <Quote>‘If there is something we can do with Ruin it must be connected to the rituals. I’ll go with you.’</>\"\nmsgstr \"<Quote>‘地精在他們的儀式中保留了古老的知識. <Quote>‘如果我們能對毀滅做點什麽，那壹定是與宗教儀式有關。我和妳壹起去。’</>\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_10_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(10).EndingLogic.Texts(1).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(10).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(10).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Golem Maker was a huge help to Lillian with his knowledge on Golemology and it was not easy for Lillian to let him go.\"\nmsgstr \"機器人制造者用他的知識給了莉莉安很大的幫助，讓莉莉安離開很不容易。\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_10_text_2\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(10).EndingLogic.Texts(2).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(10).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(10).EndingLogic.Texts(2).Texts\nmsgctxt \"EndScreen\"\nmsgid \"<Quote>‘Have no fear!’</> Golem Maker said. <Quote>‘I will return with even more knowledge and we’ll stop Ruin once and for all.’</>\"\nmsgstr \"<Quote>‘不要恐懼!’</> 機器人制造者說。 <Quote>‘我將學到更多的知識回來，我們將壹勞永逸地停止毀滅.’</>\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_11_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(11).EndingLogic.Texts(0).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(11).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(11).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"After Kobold Chef left, Supper Dwarf had to take care of the kitchen.\"\nmsgstr \"地精廚師離開後，晚餐矮人不得不負責廚房。\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_11_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(11).EndingLogic.Texts(1).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(11).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(11).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"It turned out that he is also really talented at making food.\"\nmsgstr \"那是因為我知道最終的結果應該是什麽，他在做食物方面也很有天賦。\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_11_text_2\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(11).EndingLogic.Texts(2).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(11).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(11).EndingLogic.Texts(2).Texts\nmsgctxt \"EndScreen\"\nmsgid \"<Quote> ‘That is because I know exactly what the final result should be’</> he explained.\"\nmsgstr \"<Quote> ‘那是因為我知道最終的結果是什麽’</> 他說道。\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_11_text_3\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(11).EndingLogic.Texts(3).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(11).EndingLogic.Texts(3).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(11).EndingLogic.Texts(3).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Later he opened a restaurant which soon became really popular.\"\nmsgstr \"後來他開了壹家餐館，很快就大受歡迎。\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_11_text_4\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(11).EndingLogic.Texts(4).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(11).EndingLogic.Texts(4).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(11).EndingLogic.Texts(4).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Some say mostly because he hired Pipe Walkers to serve the meal and for marketing purposes.\"\nmsgstr \"有些人說，這主要是因為壹來他雇了壹些管道行走者來布置餐品，二來出於營銷的目的。\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_12_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(12).EndingLogic.Texts(0).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(12).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(12).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Monk decided to stay in the Ruined Realm.\"\nmsgstr \"修道士決定留在這片廢墟上。\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_12_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(12).EndingLogic.Texts(1).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(12).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(12).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"<Quote>‘Even if it was not enough I did all I could. I’m done.’</> he said.\"\nmsgstr \"<Quote>“即使這還不夠，但我已經做了我所能做的。我完成了。” < / >他說。\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_12_text_2\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(12).EndingLogic.Texts(2).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(12).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(12).EndingLogic.Texts(2).Texts\nmsgctxt \"EndScreen\"\nmsgid \"He sat down on a mountaintop and started meditating.\"\nmsgstr \"他坐在山頂上開始冥想。\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_13_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(13).EndingLogic.Texts(0).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(13).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(13).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"A few weeks later he realized that even though he failed his quest he still should do something.\"\nmsgstr \"幾個星期後，他意識到，即使他所追尋的東西失敗了，他仍然應該做些什麽。\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_13_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(13).EndingLogic.Texts(1).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(13).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(13).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"<Quote>‘Due to my training I can resist Ruin’</> he thought. <Quote>‘No one has ever seen what’s there where Ruin destroyed the lands. If I train harder I might be able to get closer to Ruin to see what it really is.’</>\"\nmsgstr \"<Quote>‘由於我接受過訓練，所以我能抵抗毀滅’</> 他如此想著。 <Quote>‘沒有人見過那裏有什麽，那裏的土地被毀滅了。如果我更努力地訓練，我可能會離毀滅更近壹些，看看它到底是什麽。’</>\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_13_text_2\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(13).EndingLogic.Texts(2).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(13).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(13).EndingLogic.Texts(2).Texts\nmsgctxt \"EndScreen\"\nmsgid \"He kept on practising and soon set out on a journey into the heart of Ruin to find answers to questions even he didn’t know.\"\nmsgstr \"他繼續著，很快就踏上了通往毀滅之心的旅程，去尋找那些連他自己都不知道的問題答案。\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_14_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(14).EndingLogic.Texts(0).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(14).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(14).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Lory and Gnory suddenly found themselves in a world full of possible customers.\"\nmsgstr \"勞裏和格諾裏突然發現自己身處壹個到處都遍布著潛在客戶的世界。\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_14_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(14).EndingLogic.Texts(1).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(14).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(14).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Of course it didn’t mean they stopped arguing on who undermined whose business but finally they both had the chance to run a successful trading company.\"\nmsgstr \"當然，這並不意味著他們不再爭論誰破壞了誰的生意，但最終他們都有機會經營壹家成功的貿易公司。\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_15_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(15).EndingLogic.Texts(0).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(15).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(15).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Gnory specialized himself in selling medicine which were said to heal the sickness which was spreading as Ruin reached closer.\"\nmsgstr \"格諾裏專門賣藥，據說這種藥可以治療隨著毀滅的臨近而擴散的疾病。\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_15_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(15).EndingLogic.Texts(1).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(15).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(15).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Lory specialized in medicine which were said to heal the sickness which was caused by the medicine of Gnory.\"\nmsgstr \"勞裏專門從事醫學，據說可以治療由格諾裏藥物所引發的疾病。\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_16_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(16).EndingLogic.Texts(0).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(16).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(16).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Lory’s herbaria worked out.\"\nmsgstr \"勞裏的草藥成功了。\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_16_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(16).EndingLogic.Texts(1).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(16).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(16).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Soon she started to sell other medicine and healing devices as well.\"\nmsgstr \"不久，她開始出售其他藥物和治療設備。\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_17_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(17).EndingLogic.Texts(0).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(17).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(17).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"As for Gnory, he decided to sell lots of different things in the City Prison which turned out to be his new home for a while.\"\nmsgstr \"至於格諾裏，他決定在城市監獄裏賣很多不同的東西，這地方後來成了他的新家。\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_18_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(18).EndingLogic.Texts(0).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(18).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(18).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Fishy didn’t like the medicine business so he left Gnory.\"\nmsgstr \"呆魚不喜歡醫藥行業，所以他離開了格諾裏。\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_18_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(18).EndingLogic.Texts(1).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(18).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(18).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"He joined Monk for a while to learn the mental training techniques which reserved Monk’s sanity.\"\nmsgstr \"他加入修道士壹段時間，學習心理訓練技巧，正是這保留了修道士的理智。\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_18_text_2\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(18).EndingLogic.Texts(2).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(18).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(18).EndingLogic.Texts(2).Texts\nmsgctxt \"EndScreen\"\nmsgid \"<Quote>‘Fishy think it is important’ </>he said.<Quote> ‘If Monk go to see Ruin, Fishy need to learn it.’</>\"\nmsgstr \"<Quote>‘呆魚認為這很重要’ </>他說道。<Quote> ‘如果修道士去看廢墟，呆魚需要學它。’</>\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_18_text_3\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(18).EndingLogic.Texts(3).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(18).EndingLogic.Texts(3).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(18).EndingLogic.Texts(3).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Monk accepted Fishy as his apprentice and taught him all that was possible.\"\nmsgstr \"修道士接受了呆魚做他的徒弟，並教會了他所有可能的事情。\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_18_text_4\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(18).EndingLogic.Texts(4).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(18).EndingLogic.Texts(4).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(18).EndingLogic.Texts(4).Texts\nmsgctxt \"EndScreen\"\nmsgid \"<Quote>‘Now is the time’</> Monk said one day. <Quote>’Go to the Human Realm and prepare the people.’</>\"\nmsgstr \"<Quote>‘時機已到’</> 修道士某天說道. <Quote>’進入人類的王國，讓人們做好準備.’</>\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_19_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(19).EndingLogic.Texts(0).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(19).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(19).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"On his way to the Human Realm Fishy heard a faint excited voice:\"\nmsgstr \"在去人類王國的路上，呆魚聽到壹個微弱而興奮的聲音:\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_19_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(19).EndingLogic.Texts(1).Texts\n#. Key:\tUI_EndScreen_entry_16_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(16).EndingLogic.Texts(1).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(19).EndingLogic.Texts(1).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(16).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(16).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(19).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"<Quote>‘Hey there! I’m fed up with microtransactions. Can I go with ya man?’</>\"\nmsgstr \"<Quote>‘嘿!我受夠了微交易。我能和妳壹起去嗎?’</>\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_19_text_2\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(19).EndingLogic.Texts(2).Texts\n#. Key:\tUI_EndScreen_entry_16_text_2\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(16).EndingLogic.Texts(2).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(19).EndingLogic.Texts(2).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(16).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(16).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(19).EndingLogic.Texts(2).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Merch Ant and Fishy soon became best friends and ventured on together.\"\nmsgstr \"螞蟻和呆魚很快成為了最好的朋友，壹起冒險。\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_1_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(1).EndingLogic.Texts(0).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(1).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(1).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"A few hours later members of the Mage Council arrived along with the city guards.\"\nmsgstr \"幾個小時後，法師議會的成員和城市守衛也趕到了。\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_1_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(1).EndingLogic.Texts(1).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(1).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(1).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"The Council claimed that Wizard died in an unfortunate accident, his device could never actually work anyway and Ruin is nothing to fear of.\"\nmsgstr \"協會聲稱巫師死於壹場不幸的事故，他的裝置無論如何都不可能真正起作用，另外毀滅也沒什麽可怕的。\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_1_text_2\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(1).EndingLogic.Texts(2).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(1).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(1).EndingLogic.Texts(2).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Although it was total nonsense Lillian and Scholar was happy that the crowd were taken away from the Castle.\"\nmsgstr \"盡管這完全是胡言亂語，莉莉安和斯考拉還是很高興這群人被帶離了城堡。\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_20_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(20).EndingLogic.Texts(0).Texts\n#. Key:\tUI_EndScreen_entry_17_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(17).EndingLogic.Texts(0).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(20).EndingLogic.Texts(0).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(17).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(17).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(20).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"The World was still about to end, but as one Pipe Walker wisely said:\"\nmsgstr \"世界即將毀滅，正如壹位明智的管道行走者所說的那樣:\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_21_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(21).EndingLogic.Texts(0).Texts\n#. Key:\tUI_EndScreen_entry_18_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(18).EndingLogic.Texts(0).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(21).EndingLogic.Texts(0).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(18).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen.Default__UI_EndScreen_C.EndingLogic(18).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(21).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"As some stories ended some new ones begun. Though what happened afterwards is not yet known.\"\nmsgstr \"壹些故事的結束，意味著其它新故事又開始了。雖然後面發生的事目前還無所知曉。\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_2_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(2).EndingLogic.Texts(0).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(2).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(2).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"When they were left alone they quickly started the evacuation of the Ruined Realm.\"\nmsgstr \"當只剩下他們的時候，他們迅速開始撤離這個被毀壞的王國。\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_3_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(3).EndingLogic.Texts(0).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(3).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(3).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Even though she lost her father Lillian couldn’t afford to let sadness overcome her.\"\nmsgstr \"即使她失去了父親，莉莉安也不能讓自己被悲傷打倒。\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_3_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(3).EndingLogic.Texts(1).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(3).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(3).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Ruin was more of a threat now than ever before, and since the Mage Council didn’t believe in Ruin it was the task of Lillian and Scholar to repair the device.\"\nmsgstr \"現在的毀滅比以往任何時候都是一個威脅，因為法師議會不相信毀滅，所以維修這個裝置變成了莉莉安和學者的任務。\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_4_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(4).EndingLogic.Texts(0).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(4).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(4).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Scholar was really proud of Lillian because she managed to save time for the evacuation.\"\nmsgstr \"斯考拉真的為莉蓮感到驕傲，因為她設法並成功地節省了疏散的時間。\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_4_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(4).EndingLogic.Texts(1).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(4).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(4).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"<Quote>‘I know Wizard would have disagreed but you did the right thing. We still have time to face Ruin. We couldn’t let everyone die there.’</>\"\nmsgstr \"<Quote>‘我知道巫師會反對，但妳做了正確的事。我們還有時間面對毀滅。我們不能讓所有人都死在那裏。’</>\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_5_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(5).EndingLogic.Texts(0).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(5).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(5).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"As time passed Scholar started to behave a bit odd which made Lillian really anxious.\"\nmsgstr \"隨著時間的流逝， 斯考拉表現得有點古怪，這讓莉莉安很擔心。\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_5_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(5).EndingLogic.Texts(1).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(5).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(5).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Ruin was close and the solution was still far away.\"\nmsgstr \"毀滅近在咫尺，解決之道遙遙無期。\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_5_text_2\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(5).EndingLogic.Texts(2).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(5).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(5).EndingLogic.Texts(2).Texts\nmsgctxt \"EndScreen\"\nmsgid \"When she talked about her concerns to Raven, the bird said:\"\nmsgstr \"當她向烏鴉訴說她的苦惱時，這只鳥兒說道：\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_5_text_3\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(5).EndingLogic.Texts(3).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(5).EndingLogic.Texts(3).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(5).EndingLogic.Texts(3).Texts\nmsgctxt \"EndScreen\"\nmsgid \"<Quote>‘Focus on what you are doing Lillian. He was a bit odd anyway.’</>\"\nmsgstr \"<Quote>“專註於妳自己的事就行，莉莉安。他壹直有點古怪。”</>\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_6_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(6).EndingLogic.Texts(0).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(6).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(6).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"To the surprise of many Teachy turned out to be an excellent researcher.\"\nmsgstr \"令許多人吃驚的是，提奇原來是壹位優秀的研究員。\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_6_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(6).EndingLogic.Texts(1).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(6).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(6).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"<Quote>‘To be honest I never wanted to be a teacher’ </>he said. <Quote>‘I only stayed at University so that I can do some more research work. But my students never let me research during lectures.’</>\"\nmsgstr \"<Quote>“說實話，我從來就不想當老師” </>他說:<Quote>“老實說，我從來不想當老師。我留在大學只是為了能做更多的研究工作。但我的學生從來不讓我在課堂上做研究。”</>\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_6_text_2\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(6).EndingLogic.Texts(2).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(6).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(6).EndingLogic.Texts(2).Texts\nmsgctxt \"EndScreen\"\nmsgid \"He joined Lillian and dug into every book he could possibly find on the Ancient’s technology.\"\nmsgstr \"他和莉莉安一起，翻遍了所有他能找到的關於古代科技的書。\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_7_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(7).EndingLogic.Texts(0).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(7).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(7).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"The new environment and being a bit further from Ruin made good to the Gate Keeper.\"\nmsgstr \"新環境離毀滅還有壹段距離，這對守門人來說是件好事。\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_7_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(7).EndingLogic.Texts(1).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(7).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(7).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"He organized some of the cleaners to repair the Castle so that Lillian can keep on with her work.\"\nmsgstr \"他組織了壹些清潔工來修理城堡，這樣莉莉安就可以繼續她的工作了。\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_7_text_2\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(7).EndingLogic.Texts(2).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(7).EndingLogic.Texts(2).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(7).EndingLogic.Texts(2).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Later he started to remember things from the Runic Realm which helped Lillian a lot.\"\nmsgstr \"後來，他開始記起了神秘王國的事情，這對莉莉安幫助很大。\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_8_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(8).EndingLogic.Texts(0).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(8).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(8).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"One day a Pipe Walker, who had been in many cages mentioned that she met some kobolds far away who might be other survivors of the Kobold Chef’s tribe.\"\nmsgstr \"有壹天，壹個曾經被關在許多籠子裏的吹笛子的人提到，她在很遠的地方遇到了壹些地精，它們可能是狗頭廚師部落的其他幸存者。\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_9_text_0\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(9).EndingLogic.Texts(0).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(9).EndingLogic.Texts(0).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(9).EndingLogic.Texts(0).Texts\nmsgctxt \"EndScreen\"\nmsgid \"Hearing this news made Kobold Chef really excited.\"\nmsgstr \"聽到這個消息，地精廚師非常興奮。\"\n\n#. Key:\tUI_EndScreen_SaveCreatures_entry_9_text_1\n#. SourceLocation:\t/Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(9).EndingLogic.Texts(1).Texts\n#. /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(9).EndingLogic.Texts(1).Texts\n#: /Game/SO/GUI/InGame/UI_EndScreen_SaveCreatures.Default__UI_EndScreen_SaveCreatures_C.EndingLogic(9).EndingLogic.Texts(1).Texts\nmsgctxt \"EndScreen\"\nmsgid \"He decided to return to the Ruined Realm and search for his lost relatives.\"\nmsgstr \"他決定回到廢墟王國去尋找他失蹤的親人。\"\n\n#. Key:\tSoAct1_EG_AAFirstDroneTrio_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Drones were even more intelligent than Maintainers. They not only memorized texts, they helped correct grammar, changed the message if it was too insulting or even made up poems if they were asked to do so.\"\nmsgstr \"無人機甚至比維修工更聰明。它們不僅能記憶課文，還能幫助糾正語法錯誤，如果信息文字有所冒犯，它們還能修改信息，如果有所需要，他們甚至還能編詩。\"\n\n#. Key:\tSoAct1_EG_AAFirstDroneTrio_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"The Flying Three\"\nmsgstr \"飛行三重奏\"\n\n#. Key:\tSoAct1_EG_AfterGateCleaners_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Citizens of Cerulean requested to have their own unique Golems, but it was always rejected. This situation was very good for the Black Golem Market, because this way it was always easy to find customers.\"\nmsgstr \"蔚藍之城的市民要求擁有自己獨特的機器人，但總是遭到拒絕。這種情況對地下機器人市場非常有利，因為客源總是源源不斷。\"\n\n#. Key:\tSoAct1_EG_AfterGateCleaners_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Cleaners of Cerulean\"\nmsgstr \"蔚藍之城的清潔工\"\n\n#. Key:\tSoAct1_EG_AfterGateElits_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"The Runic Realm's Government didn't allow the Golems to become the privilege of the rich. Even though the elite were not allowed to have different Golems they always found a way to make their servants different than the ones owned by the poor.\"\nmsgstr \"符文王國的政府不允許機器人成為富人的特權。盡管精英們不允許擁有不同的機器人，但他們總能找到壹種方法，讓他們的仆人與窮人的仆人不同。\"\n\n#. Key:\tSoAct1_EG_AfterGateElits_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Capetainers\"\nmsgstr \"披肩訓練者\"\n\n#. Key:\tSoAct1_EG_AGRightFromPortal_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"'Just keep cleaning! Cleaning, cleaning...'\"\nmsgstr \"“保持清潔！清潔、清潔……”\"\n\n#. Key:\tSoAct1_EG_AGRightFromPortal_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Cleaner Invasion\"\nmsgstr \"清潔者侵入\"\n\n#. Key:\tSoAct1_EG_AGTestStoneCircle_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"The Black Golem Market was funded by a Golem Maker apprentice who failed his master exam and was banished from school. No wonder his golems were... unique.\"\nmsgstr \"地下機器人市場是由壹個制造機器人的出資建造的，他沒有通過考試，被學校開除了。難怪他的機器人… 是獨壹無二的。\"\n\n#. Key:\tSoAct1_EG_AGTestStoneCircle_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Weird Golems\"\nmsgstr \"奇怪的機器人\"\n\n#. Key:\tSoAct1_EG_AGWallJumpTeam_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"The cleaning plan for this area fell apart with the participants.\"\nmsgstr \"這個地區的清潔計劃因參與者而失敗了。\"\n\n#. Key:\tSoAct1_EG_AGWallJumpTeam_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"The North Team\"\nmsgstr \"北方團隊\"\n\n#. Key:\tSoAct1_EG_ArcadeDungeonCleaners_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"The Golem's behaviour was specified by the Golem Makers. Only very simple personalities were made at the beginning. The Cleaners, for example, only desired to keep the place tidy and make sure they don't harm the people.\"\nmsgstr \"機器人的行為是由機器人制造者特定的。壹開始，只有非常簡單的人格被創造出來。例如，清潔工只被用於保持地方整潔，確保他們不會傷害人們。\"\n\n#. Key:\tSoAct1_EG_ArcadeDungeonCleaners_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Arcade Cleaners\"\nmsgstr \"回廊清潔工\"\n\n#. Key:\tSoAct1_EG_ArcadeDungeonExit_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"After creating intelligence Golem Makers wanted even more. They wanted complex personality. They wanted Golems that can not only think but also feel. That was the idea behind designing the Gatekeepers.\"\nmsgstr \"在創造了智能之後，機器人制造者想要更多。他們想要復雜的個性。他們想要的是既能思考又能感知的機器人。這就是設計“看門人”背後的想法。\"\n\n#. Key:\tSoAct1_EG_ArcadeDungeonExit_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Arcade Servants\"\nmsgstr \"回廊的侍者\"\n\n#. Key:\tSoAct1_EG_ArcadeDungeonOptional_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"You might wonder if a Vacuum Cleaner is designed to clean dust away why does it need a laser caster?\"\nmsgstr \"妳可能會想，如果吸塵器是用來除塵的，那為什麽還需要激光施法者呢？\"\n\n#. Key:\tSoAct1_EG_ArcadeDungeonOptional_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Vacuum Cleaners group\"\nmsgstr \"真空吸塵器集團\"\n\n#. Key:\tSoAct1_EG_ArcadeMaintainers_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"The very first Golems were made to do the most monotonic work so that people have more time to think and to create. Once they were friendly but as Ruin came their behaviour changed.\"\nmsgstr \"最早的機器人被要求做最單調的工作，這樣人們就有更多的時間去思考和創造。他們壹度很友好，但隨著毀滅的到來，他們的行為改變了。\"\n\n#. Key:\tSoAct1_EG_ArcadeMaintainers_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Arcade Cleaner Golems\"\nmsgstr \"回廊清潔機器人\"\n\n#. Key:\tSoAct1_EG_Chest_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"The poor chest was minding his own business before you started to insult him.\"\nmsgstr \"在妳開始侮辱那個可憐的家夥之前，它在忙自己的事。\"\n\n#. Key:\tSoAct1_EG_Chest_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Chest\"\nmsgstr \"寶箱\"\n\n#. Key:\tSoAct1_EG_GGMiniBoss_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Maybe it only depends on the creation process, but some Golems had stronger personality. In general, Golems with more intelligence resisted Ruin longer and Golems with strong personality were more vulnerable to the infection.\"\nmsgstr \"也許這只取決於創造的過程，但有些機器人有更強的個性。壹般來說，高智商的機器人抵抗毀滅的時間更長，個性強的機器人更容易受到感染。\"\n\n#. Key:\tSoAct1_EG_GGMiniBoss_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Wickeds\"\nmsgstr \"惡劣\"\n\n#. Key:\tSoAct1_EG_LoneDrone_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Drones delivered messages and gifts before Ruin. People were happy when they heard them approaching back then.\"\nmsgstr \"無人機在廢墟前傳遞信息和禮物。當人們聽到他們回來的時候都很高興。\"\n\n#. Key:\tSoAct1_EG_LoneDrone_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Lone Drone\"\nmsgstr \"孤獨的無人機\"\n\n#. Key:\tSoAct1_EG_LoneSewerDrone_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"After Ruin most Golems liked to group together. Only a few chose to stay alone.\"\nmsgstr \"在毀滅之後，大多數的機器人喜歡聚集在壹起。只有少數人選擇獨自生活。\"\n\n#. Key:\tSoAct1_EG_LoneSewerDrone_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Another Lone Drone\"\nmsgstr \"另壹個孤獨的無人機\"\n\n#. Key:\tSoAct1_EG_MaceGroup_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"'Attention: our enemies greatest weapon, the holy Mace is stolen. We truly should have destroyed it as the Council suggested.'\"\nmsgstr \"“註意:我們的敵人最大的武器，神聖的權杖被偷走了。我們真應該按照協會的建議把它毀掉。”\"\n\n#. Key:\tSoAct1_EG_MaceGroup_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Mace Defenders\"\nmsgstr \"拐杖防禦者\"\n\n#. Key:\tSoAct1_EG_MaintainerInvestigatorInvestigators_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"After Ruin, Golems started to have strange behavior. There were a group of them who used the pipes to flood a part of the City. Later these places were called the Sewer.\"\nmsgstr \"毀滅之後，機器人開始有奇怪的行為。有壹群機器人用管道將城市的壹部分淹沒。後來這些地方被稱為下水道。\"\n\n#. Key:\tSoAct1_EG_MaintainerInvestigatorInvestigators_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Pipe Golems\"\nmsgstr \"管道機器人\"\n\n#. Key:\tSoAct1_EG_MaintainerInvestigators_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Not only the Golems were created by using the Spirits of the Unknown World before Ruin. People found other ways of using this new technology. They created pipes to convey hot water to heat the city and cold water to drink.\"\nmsgstr \"不僅僅是機器人是在毀滅前利用未知世界的靈魂創造出來的。人們找到了使用這項新技術的其他方法。他們建造了管道，將熱水輸送給城市供暖，將冷水輸送給城市飲用。\"\n\n#. Key:\tSoAct1_EG_MaintainerInvestigators_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Maintainers of the Pipes\"\nmsgstr \"管道的維修工\"\n\n#. Key:\tSoAct1_EG_SABeforeWallJump_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Some believed cold can resist Ruin longer than magic. They created places where they kept the temperature beneath the freezing point. As it turned out, not even coldness can resist Ruin forever.\"\nmsgstr \"有些人相信寒冷比魔法更能抵抗毀滅。他們創造了將溫度保持在冰點以下的程度。事實證明，即使是冷漠也無法永遠抵禦毀滅。\"\n\n#. Key:\tSoAct1_EG_SABeforeWallJump_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Cleaners of the Refrigerator.\"\nmsgstr \"冰箱清潔工。\"\n\n#. Key:\tSoAct1_EG_SAFightMustHave_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"'We won't clear anymore!' said the rebel Maintainer.\\r\\n'Let's declear War!'\"\nmsgstr \"\"\n\n#. Key:\tSoAct1_EG_SAFightMustHave_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Underground Cleaner Band\"\nmsgstr \"地下清潔樂隊\"\n\n#. Key:\tSoAct1_EG_SAFightOptional_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"'Let's make something clear. Maybe this room?'\"\nmsgstr \"“讓我們來弄清楚。也許是這個房間?”\"\n\n#. Key:\tSoAct1_EG_SAFightOptional_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Underground Cleaner Band B\"\nmsgstr \"地下清潔樂隊 B\"\n\n#. Key:\tSoAct1_EG_SewerCircleVacuumCleaners_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"People realised that Golem's Spirits have a power beyond imagination. They called it the Ancient Magic. Vacuum Cleaners could use this magic to do their job even better.\"\nmsgstr \"人們意識到機器人的精神有著超乎想象的力量。他們稱之為古代魔法。真空吸塵器可以利用這種魔法更好地工作。\"\n\n#. Key:\tSoAct1_EG_SewerCircleVacuumCleaners_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Vacuum Cleaners\"\nmsgstr \"真空吸塵器\"\n\n#. Key:\tSoAct1_EG_SewerTeam_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Golem Makers wanted to create something more intelligent as they learned more. They shaped the Maintainers, the first golems capable of talking. Sadly their intelligence vanished as Ruin came.\"\nmsgstr \"當機器人制造者學到更多的時候，他們想要創造壹些更智能的東西。他們塑造了維修者，也就是第壹批會說話的機器人。不幸的是，隨著毀滅的來臨，他們的智慧消失了。\"\n\n#. Key:\tSoAct1_EG_SewerTeam_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Sewer Golems\"\nmsgstr \"下水道機器人\"\n\n#. Key:\tSoAct1_EG_TL_VacuumTwins_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Libraries were important in the life of the former Realm's citizens. No wonder that many of the golems were created only to dust and organize the books.\"\nmsgstr \"圖書館在前王國公民的生活中很重要。難怪許多機器人被創造出來只是為了打掃和整理書籍。\"\n\n#. Key:\tSoAct1_EG_TL_VacuumTwins_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Library Cleaners\"\nmsgstr \"圖書館清潔工\"\n\n#. Key:\tSoAct1_EG_TLSewerCreatureWatch_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Golems never ever attacked the Pipe Walkers. The reason is only known by the wisest Pipe Walker himself. It is because, as he explained: 'Nun dara bum, tuk la.'\"\nmsgstr \"機器人從來沒有攻擊過管道行走者。這個原因只有最聰明的管道行走者自己知道。正如他所解釋的那樣，這是因為:“Nun dara bum， tuk la。”\"\n\n#. Key:\tSoAct1_EG_TLSewerCreatureWatch_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Sewer Team B\"\nmsgstr \"下水道B隊\"\n\n#. Key:\tSoAct1_EG_TowerTrio_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"They spent most of their time on the top of those towers - it was clear to me that they would die there as well.\"\nmsgstr \"他們大部分時間都呆在那些塔的頂端——我很清楚他們也會死在那裏。\"\n\n#. Key:\tSoAct1_EG_TowerTrio_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"The Tower Trio\"\nmsgstr \"塔之三重奏\"\n\n#. Key:\tSoAct2_EG_BounceTrio_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Lava Jumpers are former Golems who fell into the lava. Some of them return to join their former Golem companions.\"\nmsgstr \"熔巖跳躍者是落入熔巖的前機器人。他們中的壹些回到了以前的夥伴那裏。\"\n\n#. Key:\tSoAct2_EG_BounceTrio_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Bounce Trio\"\nmsgstr \"彈跳三重奏\"\n\n#. Key:\tSoAct2_EG_C_BeforeKey_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"It's still unclear what makes some creatures touched by Ruin to group together. Some believes those who had similar emotions when Ruin came were likely to form a group.\"\nmsgstr \"目前還不清楚是什麽原因使得壹些被廢墟觸碰過的生物聚集在壹起。壹些人認為，當毀滅來臨的時候，那些有類似情緒的家夥可能會形成壹個群體。\"\n\n#. Key:\tSoAct2_EG_C_BeforeKey_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Anxious Armours\"\nmsgstr \"焦慮的鎧甲\"\n\n#. Key:\tSoAct2_EG_C_Bridge_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Crafting was always the obsession of Dwarves. In their workshops they forged mighty weapons and wondrous armours. Their love for their craft was so strong that instead of their body, Ruin preserved their iron works.\"\nmsgstr \"地精壹直癡迷於手工藝。在他們的工坊裏，它們制造了強大的武器和神奇的盔甲。它們對自己手藝的熱愛是如此強烈，以至於它們的鐵制品不但沒有被毀滅，反而被保存了下來。\"\n\n#. Key:\tSoAct2_EG_C_Bridge_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Bridge Brigade\"\nmsgstr \"橋的部隊\"\n\n#. Key:\tSoAct2_EG_C_LoneShadeSphere_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Before Ruin there was no other humanoid race but human. New races are created by Ruin's Shades. They roam the lands looking for any living being which they can possess. Once they become part of a creature its body will start to change.\"\nmsgstr \"在毀滅之前沒有其他類人種族，只有人類。毀滅的陰影創造了新的種族。他們四處流浪，尋找任何他們可以擁有的生物。壹旦它們成為生物的壹部分，它的身體就會開始改變。\"\n\n#. Key:\tSoAct2_EG_C_LoneShadeSphere_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Weird Floating Thing\"\nmsgstr \"奇怪的浮動物\"\n\n#. Key:\tSoAct2_EG_C_OfficeGuards_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Watching the only way to the Office did not bring enough protection. If any intruder managed to pass the Patrols he still had to face the Guardians to proceed.\"\nmsgstr \"監視通向辦公室的唯壹道路並沒有帶來足夠的保護。如果有任何入侵者設法通過巡邏隊，他仍然不得不面對守衛者繼續前進。\"\n\n#. Key:\tSoAct2_EG_C_OfficeGuards_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Guardians of the Law\"\nmsgstr \"法律守護者\"\n\n#. Key:\tSoAct2_EG_C_OfficePatrols_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Going into the Law's High Office was forbidden even for most of the Dwarves. Only one path lead to the Office and that was guarded by the Patrols.\"\nmsgstr \"即使對大多數地精來說，進入法律界的高層辦公室也是被禁止的。只有壹條路通向辦公室，那是由巡邏隊把守的。\"\n\n#. Key:\tSoAct2_EG_C_OfficePatrols_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Patrols of the Law\"\nmsgstr \"執法巡邏\"\n\n#. Key:\tSoAct2_EG_DG_Left_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Deep beneath the Catacombs there is a secret place called the Dwarven Gate. Elite dwarves who worked here were placed above the Law. They were seeking a way to fight Ruin with Ruin's magic.\"\nmsgstr \"在地下墓穴的深處有壹個秘密的地方，叫做地精之門。在這裏工作的精英地精被置於法律之上。他們在尋找壹種用毀滅魔法與毀滅作鬥爭的方法。\"\n\n#. Key:\tSoAct2_EG_DG_Left_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Glorious Group\"\nmsgstr \"光榮小組\"\n\n#. Key:\tSoAct2_EG_DG_RightFloor_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Even though most of the common Dwarves never even heard about Dwarven Gate some were needed to do the hard work. Now that Ruin won, Dwarves are finally equal.\"\nmsgstr \"盡管大多數普通的地精甚至從未聽說過地精之門，但還是需要壹些人來做這些艱苦的工作。現在毀滅贏了，地精們終於平等了。\"\n\n#. Key:\tSoAct2_EG_DG_RightFloor_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Not so Elite Dwarves\"\nmsgstr \"不是精英地精\"\n\n#. Key:\tSoAct2_EG_DG_RightUpOptional_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"One idea of the Elite Dwarves was to create giant statues which are able to trap Ruin's essence. Even if they were right they never managed to make enough sculptures.\"\nmsgstr \"精英地精的壹個想法是創造出巨大的雕像，這些雕像能夠抓住毀滅的本質。即使他們是對的，他們也沒能做出足夠多的雕塑。\"\n\n#. Key:\tSoAct2_EG_DG_RightUpOptional_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Sculptors\"\nmsgstr \"雕刻家\"\n\n#. Key:\tSoAct2_EG_DwarfBoss_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Dwarven Statues were meant to imprison the essence of Ruin. However there were some Dwarven scientists who feared that the statues were not safe and in the long run they wouldn't be able to resist the power of Ruin...\"\nmsgstr \"地精雕像是用來囚禁廢墟的精華的。然而，也有壹些地精科學家擔心這些雕像不安全，從長遠來看，它們將無法抵抗毀滅的力量……\"\n\n#. Key:\tSoAct2_EG_DwarfBoss_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Dwarven Statue\"\nmsgstr \"地精雕像\"\n\n#. Key:\tSoAct2_EG_GolemFirst_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Stone Golems are the cheap copies of the Runic Realm Golems. If Ruin twists the creatures mind then it will definitely have no effect on these ones.\"\nmsgstr \"石制機器人是廉價的符文領域機器人的復制品。如果毀滅扭曲了這些生物的思想，那麽它肯定不會對這些生物產生影響。\"\n\n#. Key:\tSoAct2_EG_GolemFirst_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Sphere Golem\"\nmsgstr \"球形機器人\"\n\n#. Key:\tSoAct2_EG_GolemSecond_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Looks like the second try is just as bad as the first one.\"\nmsgstr \"看來第二次和第壹次壹樣糟糕。\"\n\n#. Key:\tSoAct2_EG_GolemSecond_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Second Sphere Golem\"\nmsgstr \"第二個球形機器人\"\n\n#. Key:\tSoAct2_EG_GolemThird_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Whoever made this Golem, he should have stopped after the second try.\"\nmsgstr \"無論誰制造了這個機器人，他應該在第二次嘗試後停止。\"\n\n#. Key:\tSoAct2_EG_GolemThird_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Third Sphere Golem\"\nmsgstr \"第三個球形機器人\"\n\n#. Key:\tSoAct2_EG_HutFishies_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Now that the Fishys are gone, the Lake's piranhas can live in peace and eat whoever comes close.\"\nmsgstr \"現在呆魚都走了，湖裏的食人魚可以平靜地生活，誰靠近都可以吃掉誰。\"\n\n#. Key:\tSoAct2_EG_HutFishies_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Abandoned Fishy Slaves\"\nmsgstr \"被拋棄的呆魚奴隸\"\n\n#. Key:\tSoAct2_EG_HutFlyArmy_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"No one knows where the Flies came from. Although you have a very clear idea on where they should go...\"\nmsgstr \"沒有人知道蒼蠅是從哪裏來的。雖然妳很清楚它們應該去哪裏……\"\n\n#. Key:\tSoAct2_EG_HutFlyArmy_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Annoying Flies\"\nmsgstr \"討厭的蒼蠅\"\n\n#. Key:\tSoAct2_EG_LavaBoss_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Armour Wrath was the most ambitious and majestic work of the Golem Maker. He used all his remaining strength to create this mighty Golem. It's a pity that all his efforts were in vain.\"\nmsgstr \"《鎧甲之怒》是機器人制造者最具野心、最宏偉的作品。他用所有剩余的力量創造了這個強大的機器人。真遺憾，他所有的努力都白費了。\"\n\n#. Key:\tSoAct2_EG_LavaBoss_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Armour Wrath\"\nmsgstr \"鎧甲之怒\"\n\n#. Key:\tSoAct2_EG_LavaDeepTeam_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"A fourth Sphere Golem? Someone never gives up...\"\nmsgstr \"第四個球形機器人？總有人不輕言放棄...\"\n\n#. Key:\tSoAct2_EG_LavaDeepTeam_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Fourth Sphere Golem\"\nmsgstr \"第四個球形機器人\"\n\n#. Key:\tSoAct2_EG_LavaJumpers_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"When a Golem falls into the lava its stone body will melt away. The spirit however resists the heat and will be looking for another body...\"\nmsgstr \"當壹個機器人掉入熔巖中時，它的石頭身體就會融化。然而靈魂抵抗熱量，將尋找另壹個身體…\"\n\n#. Key:\tSoAct2_EG_LavaJumpers_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Lava Jumpers\"\nmsgstr \"熔巖跳躍者\"\n\n#. Key:\tSoAct2_EG_LavaTeamX_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Divided they fall, united they divide...\"\nmsgstr \"分裂就會垮臺，團結就會分裂……\"\n\n#. Key:\tSoAct2_EG_LavaTeamX_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Golem Group\"\nmsgstr \"機器人小組\"\n\n#. Key:\tSoAct2_EG_LavaTrio_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Wherever Golems go after death these three will go there together.\"\nmsgstr \"不管機器人死後去哪裏，他們三個都會壹起去。\"\n\n#. Key:\tSoAct2_EG_LavaTrio_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Golem Trio\"\nmsgstr \"機器人三重奏\"\n\n#. Key:\tSoAct2_EG_OutpostLeft_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"To keep Ruin away dwarves forbade everything related to Ruin's magic. This might have worked in theory but they failed to notice that their mechanical devices were also powered by Ruin.\"\nmsgstr \"為了避開毀滅，地精們禁止壹切與毀滅的魔法有關的東西。這在理論上可能行得通，但它們沒有註意到，它們的機械設備也是由廢墟提供動力的。\"\n\n#. Key:\tSoAct2_EG_OutpostLeft_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Guardians of the West Wall\"\nmsgstr \"西墻守護者\"\n\n#. Key:\tSoAct2_EG_OutpostRight_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Ruin was not only meant for destruction, it could also preserve. Ruin gave endless life for those who survived at the cost of twisting their minds.\"\nmsgstr \"毀滅不僅意味著摧毀，它還意味著保存。毀滅給了那些以扭曲思想為代價生存下來的人無盡的生命。\"\n\n#. Key:\tSoAct2_EG_OutpostRight_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Guardians of the East Wall\"\nmsgstr \"東墻守護者\"\n\n#. Key:\tSoAct2_EG_OutpostWallFirst_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Dwarves fought Ruin with Rules. These soldiers were ordered here to guard the Outpost. Their will to obey the order was so strong that even death couldn't break it.\"\nmsgstr \"地精們用規則來對抗毀滅。這些士兵奉命在這裏守衛前哨。他們服從命令的意誌是如此強烈，即使死亡也無法打破它。\"\n\n#. Key:\tSoAct2_EG_OutpostWallFirst_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Patrols of the Outpost Wall\"\nmsgstr \"前哨墻的巡邏隊\"\n\n#. Key:\tSoAct2_EG_Shore_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"After Ruin turned them into Monsters some creatures gathered together. Whether it's the effect of Ruin or something from their former life is unclear.\"\nmsgstr \"在廢墟把它們變成怪物之後，壹些生物聚集在壹起。這是毀滅造成的還是他們以前生活中的某些東西導致的尚不清楚。\"\n\n#. Key:\tSoAct2_EG_Shore_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Shore Monsters\"\nmsgstr \"海岸怪物\"\n\n#. Key:\tSoAct2_EG_SlideFishyTeam_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Fishys were produced by the Great Kobold tribe for slaves. Some of them managed to escape, but they couldn't go far from the Lake.\"\nmsgstr \"魚是偉大的地精部落為奴隸生產的。它們中的壹些設法逃走了，但沒法離開湖太遠。\"\n\n#. Key:\tSoAct2_EG_SlideFishyTeam_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Deserter Fishys\"\nmsgstr \"逃兵魚\"\n\n#. Key:\tSoAct2_EG_SlidePathEnd_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Deserter Fishys always kept a Fishy group close to the exit of their secret hideout. They protected the others and watched the kobolds to find the right time to venture back to the Lake.\"\nmsgstr \"逃兵魚總是把壹群魚放在它們秘密藏身處的出口附近。它們保護著其他的地精，看著他們尋找合適的時間冒險回到湖邊。\"\n\n#. Key:\tSoAct2_EG_SlidePathEnd_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Patrol Fishys\"\nmsgstr \"巡邏魚\"\n\n#. Key:\tSoAct2_EG_WormHole_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Worms kept distance from each other before Ruin. It's strange how a force which tears everything apart can also unite.\"\nmsgstr \"蠕蟲在毀滅前彼此保持距離。奇怪的是，壹股撕裂壹切的力量也能團結起來。\"\n\n#. Key:\tSoAct2_EG_WormHole_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Worms\"\nmsgstr \"蠕蟲\"\n\n#. Key:\tSoAct2_EG_Wormy_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"There was a time when Worms only made damage to fields and gardens. Now they are a bit more ambitious...\"\nmsgstr \"曾經有壹段時間，蠕蟲只會破壞農田和花園。現在它們的野心更大了……\"\n\n#. Key:\tSoAct2_EG_Wormy_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Worm\"\nmsgstr \"蠕蟲\"\n\n#. Key:\tSoAct2_EG_WWBoss_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"When Ruin appeared some decided to abandon civilization and return to nature. Their leader, the Fallen Druid cast an ancient spell to protect his plants from Ruin. His spell partly worked but at a terrible cost.\"\nmsgstr \"當毀滅出現時，壹些人決定放棄文明，回歸自然。他們的領袖，墮落的德魯伊施放了壹個古老的咒語來保護他的植物免於毀滅。他的咒語部分奏效了，但代價慘重。\"\n\n#. Key:\tSoAct2_EG_WWBoss_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Fallen Druid\"\nmsgstr \"墮落的德魯伊\"\n\n#. Key:\tSoAct3_EG_Act3BubbleGroundMain_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Ruin's power is not only in destruction. When it can't change something it will preserve those attributes which can prepare the possibility to change again. Ruin's power is in change.\"\nmsgstr \"毀滅的力量不僅在於毀滅。當它不能改變某件事時，它會保留那些可以為再次改變做好準備的屬性。毀滅的力量在變化。\"\n\n#. Key:\tSoAct3_EG_Act3BubbleGroundMain_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Maintainer Spellcasters\"\nmsgstr \"維修工施法者\"\n\n#. Key:\tSoAct3_EG_Act3FinalBattle_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Even though Ruin doesn't have consciousness nor the ability to think it somehow reacts to your presence. As if it knew the threat you present, Ruin tries all it can to stop you from leaving the Ruined Realm.\"\nmsgstr \"即使毀滅沒有意識，也沒有能力去思考它對妳的存在有什麽反應。就好像它知道妳的威脅壹樣，毀滅竭盡所能阻止妳離開這個荒廢領域。\"\n\n#. Key:\tSoAct3_EG_Act3FinalBattle_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Ruined Convention\"\nmsgstr \"廢墟約定\"\n\n#. Key:\tSoAct3_EG_Act3PipeGroupFirst_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"There is a difference between how Humans and Golems are transformed by Ruin. Human bodies reach their final form in a few decades but Golems never stop changing. There is always a new, more vicious type.\"\nmsgstr \"關於人類和機器人是如何被毀滅轉化的，這是有區別的。人類的身體在幾十年後會達到最後的形態，但是機器人從來不會停止變化。總會有壹種新的、更邪惡的類型。\"\n\n#. Key:\tSoAct3_EG_Act3PipeGroupFirst_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Red Drones\"\nmsgstr \"紅色無人機\"\n\n#. Key:\tSoAct3_EG_Act3PipeGroupSecond_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Transformation is relative to intelligence. Creatures with consciousness have a strong desire to reserve their ego. Ruin can fool them a few times but later they become invulnerable to Ruin's changing power.\"\nmsgstr \"轉變與智力有關。有意識的生物有強烈的欲望去保留他們的自我。毀滅可以愚弄他們幾次，但後來他們變得堅不可摧的毀滅的變化的力量。\"\n\n#. Key:\tSoAct3_EG_Act3PipeGroupSecond_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"More Drones\"\nmsgstr \"更多的無人機\"\n\n#. Key:\tSoAct3_EG_Act3RangedCleanerTwins_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Ruin's nature is confusing for the human mind. It can build, it can destroy, it can use, it can be used. These actions have the same priority for Ruin. All that matters is that it can do something. And with time it wants more and more.\"\nmsgstr \"毀滅的本性使人困惑。它可以建造，可以摧毀，可以使用，可以被使用。這些行為對於毀滅具有同樣的優先級。重要的是它能有所作為。隨著時間的推移，它想要的越來越多。\"\n\n#. Key:\tSoAct3_EG_Act3RangedCleanerTwins_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Cleaner Twins\"\nmsgstr \"更幹凈的雙胞胎\"\n\n#. Key:\tSoAct3_EG_Act3VacuumTwins_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Ruin's logic is predictable when you understand its nature. When it's not possible to create more the creation process can be restarted by destroying everything first.\"\nmsgstr \"當妳了解了毀滅的實質後，它的邏輯是可預測的。當無法創建更多時，可以通過首先銷毀所有內容來重新啟動創建過程。\"\n\n#. Key:\tSoAct3_EG_Act3VacuumTwins_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Elite Twins\"\nmsgstr \"精英雙胞胎\"\n\n#. Key:\tWhiteWall_EG_AfterKobold_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Creating intelligence was not enough for the Golem Makers. They wanted to get even further. They wanted to create Golems with emotions.\"\nmsgstr \"光給機器人創造智力對制造者來說是不夠的。他們想更進壹步，想創造有感情的機器人。\"\n\n#. Key:\tWhiteWall_EG_AfterKobold_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Flying Maintainer\"\nmsgstr \"飛行維護者\"\n\n#. Key:\tWhiteWall_EG_BeforeKobold_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"When the Cataclysm happened and Ruin came the Golems started to change. Instead of doing their daily work some of them turned against their masters.\"\nmsgstr \"當大災難發生，毀滅來臨的時候，機器人開始改變。他們中有些人不再做日常工作，轉而開始與他們的主人對著幹。\"\n\n#. Key:\tWhiteWall_EG_BeforeKobold_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Infected Golems\"\nmsgstr \"被感染的機器人\"\n\n#. Key:\tWhiteWall_EG_FirstCombat_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Cleaners were the first Golems ever made. Before the Cataclysm they did all the monoton work so that the people had more time to think and to create.\"\nmsgstr \"清潔機器人是第壹批制造出來的。在大災難來臨之前，他們完成了所有單調的工作，這樣人們就有更多的時間進行思考和創造。\"\n\n#. Key:\tWhiteWall_EG_FirstCombat_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Whitewall Cleaners\"\nmsgstr \"白色巨墻清潔者\"\n\n#. Key:\tWhiteWall_EG_FirstOptionalCombat_desc\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"After the different types of Cleaners, Golem Makers wanted to create something greater than working robots. They started to design creatures with intelligence.\"\nmsgstr \"在生產出不同類型的清潔型機器人後，機器人制造者想要創造出比工作機器人更偉大的東西。他們開始設計具有智力的生物。\"\n\n#. Key:\tWhiteWall_EG_FirstOptionalCombat_name\n#. SourceLocation:\tConfig/DefaultSoGameSingleton.ini:23\n#: Config/DefaultSoGameSingleton.ini:23\nmsgctxt \"EnemyGroupData\"\nmsgid \"Whitewall Maintainers\"\nmsgstr \"白色巨墻維護者\"\n\n#. Key:\tAbacus_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/Abacus.Abacus.Description\n#: /Game/SO/Items/QuestItems/Abacus.Abacus.Description\nmsgctxt \"ItemData\"\nmsgid \"When you don't have enough fingers to count something you need this abacus.\"\nmsgstr \"當妳計算中手不夠用時，妳需要這個算盤。\"\n\n#. Key:\tAbacus_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/Abacus.Abacus.Name\n#: /Game/SO/Items/QuestItems/Abacus.Abacus.Name\nmsgctxt \"ItemData\"\nmsgid \"Abacus\"\nmsgstr \"算盤\"\n\n#. Key:\tAbacusGhost_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/AbacusGhost.AbacusGhost.Description\n#. /Game/SO/Items/QuestItems/AbacusGhost.AbacusGhost.Description\n#: /Game/SO/Items/QuestItems/AbacusGhost.AbacusGhost.Description\nmsgctxt \"ItemData\"\nmsgid \"When the Abacus is killed its spirit might return to get even with its murderer.\"\nmsgstr \"當算盤被殺死時，它的靈魂可能會回來報復兇手。\"\n\n#. Key:\tAbacusGhost_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/AbacusGhost.AbacusGhost.Name\n#: /Game/SO/Items/QuestItems/AbacusGhost.AbacusGhost.Name\nmsgctxt \"ItemData\"\nmsgid \"Ghost Abacus\"\nmsgstr \"幽靈算盤\"\n\n#. Key:\tAbacusGhostFlower_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/AbacusGhostFlower.AbacusGhostFlower.Description\n#. /Game/SO/Items/QuestItems/AbacusGhostFlower.AbacusGhostFlower.Description\n#: /Game/SO/Items/QuestItems/AbacusGhostFlower.AbacusGhostFlower.Description\nmsgctxt \"ItemData\"\nmsgid \"Petals of a ghost flower.\"\nmsgstr \"幽靈之花的花瓣\"\n\n#. Key:\tAbacusGhostFlower_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/AbacusGhostFlower.AbacusGhostFlower.Name\n#. /Game/SO/Items/QuestItems/AbacusGhostFlower.AbacusGhostFlower.Name\n#: /Game/SO/Items/QuestItems/AbacusGhostFlower.AbacusGhostFlower.Name\nmsgctxt \"ItemData\"\nmsgid \"Ghost Petals\"\nmsgstr \"幽靈花瓣\"\n\n#. Key:\tAbacusSpellBook_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/AbacusSpellBook.AbacusSpellBook.Description\n#. /Game/SO/Items/QuestItems/AbacusSpellBook.AbacusSpellBook.Description\n#: /Game/SO/Items/QuestItems/AbacusSpellBook.AbacusSpellBook.Description\nmsgctxt \"ItemData\"\nmsgid \"An ancient paper\"\nmsgstr \"古老紙張\"\n\n#. Key:\tAbacusSpellBook_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/AbacusSpellBook.AbacusSpellBook.Name\n#. /Game/SO/Items/QuestItems/AbacusSpellBook.AbacusSpellBook.Name\n#: /Game/SO/Items/QuestItems/AbacusSpellBook.AbacusSpellBook.Name\nmsgctxt \"ItemData\"\nmsgid \"Scroll of Surrection\"\nmsgstr \"復活卷軸\"\n\n#. Key:\tAbacusSpellBook_page_0\n#. SourceLocation:\t/Game/SO/Items/QuestItems/AbacusSpellBook.AbacusSpellBook.Pages(0).Pages\n#. /Game/SO/Items/QuestItems/AbacusSpellBook.AbacusSpellBook.Pages(0).Pages\n#: /Game/SO/Items/QuestItems/AbacusSpellBook.AbacusSpellBook.Pages(0).Pages\nmsgctxt \"ItemData\"\nmsgid \"Wisy et al. [3152] point out that any entity can be banished by throwing the proper object into his/her/its face a few times, making him/her/it annoyed thus unconcerned, as long as the target entity has a face.\\r\\n\\r\\nThe proper object in case of ghosts is something Surrected [Inti and Clevi 3153], as only Surrected substance can interact with ghosts.\\r\\n\\r\\nAny object covered with petals of Ghost Flower can be Surrected using the following method:\\r\\n\\r\\n- Say \\\"Sorry my <object name>!\\\"\\r\\n- Break the object into pieces with a heated hammer\\r\\n- Say your favourite color\\r\\n- Croon \\\"La La LaLaLa LaLaLa\\\" until the object is coagulated into a single Surrected object\"\nmsgstr \"Wisy et al. [3152]報告指出，只要目標實體有一張臉，任何實體都可以通過將合適的物體扔到他/她/它的臉上幾次而被驅逐，從而使他/她/它從厭煩到麻木。\\r\\n\\r\\n對於幽靈來說，合適的對像是被復活的物體[Inti and Clevi 3153]，因為只有被復活的物體才能與幽靈相互作用。\\r\\n\\r\\n任何被幽靈之花花瓣覆蓋的物體都可以用以下方法替代超越物:\\r\\n\\r\\n-說\\\"對不起，我的<object name>!\\\"\\r\\n-用加熱的錘子把物體打碎\\r\\n-說出你最喜歡的顏色\\r\\n-低吟“啦啦啦啦啦啦啦啦啦啦啦”“直到物體凝固成一個完整的物體”\"\n\n#. Key:\tAbacusSpellBook_page_1\n#. SourceLocation:\t/Game/SO/Items/QuestItems/AbacusSpellBook.AbacusSpellBook.Pages(1).Pages\n#. /Game/SO/Items/QuestItems/AbacusSpellBook.AbacusSpellBook.Pages(1).Pages\n#: /Game/SO/Items/QuestItems/AbacusSpellBook.AbacusSpellBook.Pages(1).Pages\nmsgctxt \"ItemData\"\nmsgid \"WARNING: not following the instructions exactly leads to failure and also increases the probability of injury and or death [Carfy 3154].\\r\\n\\r\\nREFERENCES:\\r\\n\\r\\nWISY, W., BUSY, B., WEIRDY, Y., AND LUCKY, L. 3152. The best ways to get rid of anyone potentially distracting us with questions like \\\"What do you read?\\\"\\r\\n\\r\\nInti, I., AND Clevi, C. 3153. Insulting dead ancestors using Surrected objects\\r\\n\\r\\nCarfy C. 3154. What happened to Clevi, C. and Inti, I.\"\nmsgstr \"“警告:不遵守說明將導致失敗，並增加受傷或死亡的可能性[Carfy 3154]。\\r\\n\\r\\n引用:\\r\\n\\r\\n最好的解決辦法就是不要問一些可能會分散我們注意力的問題，比如“你讀的書是什麼?”\\r\\n\\r\\n用複活侮辱了死去的祖先\\r\\n\\r\\n發生了什麼事?”\"\n\n#. Key:\tAll_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/All.All.Description\n#: /Game/SO/Items/QuestItems/All.All.Description\nmsgctxt \"ItemData\"\nmsgid \"Maybe it was a bit too much?\"\nmsgstr \"也許有點太過分了?\"\n\n#. Key:\tAll_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/All.All.Name\n#: /Game/SO/Items/QuestItems/All.All.Name\nmsgctxt \"ItemData\"\nmsgid \"Everything, except an Abacus\"\nmsgstr \"除了算盤，什麽都沒有\"\n\n#. Key:\tArtifact_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/Artifact.Artifact.Description\n#: /Game/SO/Items/QuestItems/Artifact.Artifact.Description\nmsgctxt \"ItemData\"\nmsgid \"A very rare and powerful item which is used for opening a portal into the Unknown Realm. If you gather three and give them to the Wizard he shall set you free.\"\nmsgstr \"壹件非常罕見且強大的物品，用於打開進入未知領域的入口。如果妳收集到三個，把它們交給巫師，他就會讓妳自由。\"\n\n#. Key:\tArtifact_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/Artifact.Artifact.Name\n#: /Game/SO/Items/QuestItems/Artifact.Artifact.Name\nmsgctxt \"ItemData\"\nmsgid \"Artifact\"\nmsgstr \"手工藝品\"\n\n#. Key:\tAxeMainGame_desc\n#. SourceLocation:\t/Game/SO/Items/Weapons/AxeMainGame.AxeMainGame.Description\n#. Key:\tAxe_desc\n#. SourceLocation:\t/Game/SO/Items/Weapons/Axe.Axe.Description\n#: /Game/SO/Items/Weapons/Axe.Axe.Description\n#: /Game/SO/Items/Weapons/AxeMainGame.AxeMainGame.Description\nmsgctxt \"ItemData\"\nmsgid \"Axes are usefull, but if you don't need them you can just throw them away.\"\nmsgstr \"斧子是有用的，但如果妳不需要它們，可以把它們扔掉。\"\n\n#. Key:\tAxeMainGame_name\n#. SourceLocation:\t/Game/SO/Items/Weapons/AxeMainGame.AxeMainGame.Name\n#. Key:\tAxe_name\n#. SourceLocation:\t/Game/SO/Items/Weapons/Axe.Axe.Name\n#: /Game/SO/Items/Weapons/Axe.Axe.Name\n#: /Game/SO/Items/Weapons/AxeMainGame.AxeMainGame.Name\nmsgctxt \"ItemData\"\nmsgid \"Axes\"\nmsgstr \"斧子\"\n\n#. Key:\tBlueCrystal_desc\n#. SourceLocation:\t/Game/SO/Items/Valuable/BlueCrystal.BlueCrystal.Description\n#: /Game/SO/Items/Valuable/BlueCrystal.BlueCrystal.Description\nmsgctxt \"ItemData\"\nmsgid \"An ancient crystal people like to buy.\"\nmsgstr \"人們喜歡買這種古老的水晶。\"\n\n#. Key:\tBlueCrystal_name\n#. SourceLocation:\t/Game/SO/Items/Valuable/BlueCrystal.BlueCrystal.Name\n#: /Game/SO/Items/Valuable/BlueCrystal.BlueCrystal.Name\nmsgctxt \"ItemData\"\nmsgid \"Blue Crystal\"\nmsgstr \"藍水晶\"\n\n#. Key:\tBlueGem_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/BlueGem.BlueGem.Description\n#: /Game/SO/Items/QuestItems/BlueGem.BlueGem.Description\nmsgctxt \"ItemData\"\nmsgid \"A small precious blue stone.\"\nmsgstr \"壹顆小而珍貴的藍色寶石。\"\n\n#. Key:\tBlueGem_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/BlueGem.BlueGem.Name\n#: /Game/SO/Items/QuestItems/BlueGem.BlueGem.Name\nmsgctxt \"ItemData\"\nmsgid \"Blue Gem\"\nmsgstr \"藍寶石\"\n\n#. Key:\tDemonSword_desc\n#. SourceLocation:\t/Game/SO/Items/Weapons/DemonSword.DemonSword.Description\n#: /Game/SO/Items/Weapons/DemonSword.DemonSword.Description\nmsgctxt \"ItemData\"\nmsgid \"The mighty sword of Kharutar the Demon Ruler. Legend says he once cut one of his fingers with it and in his rage he broke the sword into two. Later it was reforged but some say it would still need some more fixes.\"\nmsgstr \"惡魔統治者卡魯塔的利劍。傳說他曾經用它割破了自己的壹個手指，盛怒之下，他把劍劈成了兩半。後來它被重新鑄造，但壹些人說它需要進壹步修復。\"\n\n#. Key:\tDemonSword_name\n#. SourceLocation:\t/Game/SO/Items/Weapons/DemonSword.DemonSword.Name\n#: /Game/SO/Items/Weapons/DemonSword.DemonSword.Name\nmsgctxt \"ItemData\"\nmsgid \"Demon Sword\"\nmsgstr \"惡魔之劍\"\n\n#. Key:\tDOKitchenKey_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/DOKitchenKey.DOKitchenKey.Description\n#: /Game/SO/Items/Keys/DOKitchenKey.DOKitchenKey.Description\nmsgctxt \"ItemData\"\nmsgid \"This is one of the many spare keys of the Dwarven Outpost Kitchen. Being able to get into the kitchen was always very important for dwarves.\"\nmsgstr \"這是地精前哨廚房的備用鑰匙之壹。能夠進入廚房對地精來說總是非常重要的。\"\n\n#. Key:\tDOKitchenKey_name\n#. SourceLocation:\t/Game/SO/Items/Keys/DOKitchenKey.DOKitchenKey.Name\n#: /Game/SO/Items/Keys/DOKitchenKey.DOKitchenKey.Name\nmsgctxt \"ItemData\"\nmsgid \"Kitchen Key\"\nmsgstr \"廚房鑰匙\"\n\n#. Key:\tDualBlade_desc\n#. SourceLocation:\t/Game/SO/Items/Weapons/DualBlade.DualBlade.Description\n#: /Game/SO/Items/Weapons/DualBlade.DualBlade.Description\nmsgctxt \"ItemData\"\nmsgid \"In case of trouble, it's better to have double.\"\nmsgstr \"好事成雙\"\n\n#. Key:\tDualBlade_name\n#. SourceLocation:\t/Game/SO/Items/Weapons/DualBlade.DualBlade.Name\n#: /Game/SO/Items/Weapons/DualBlade.DualBlade.Name\nmsgctxt \"ItemData\"\nmsgid \"Double Sword\"\nmsgstr \"雙劍\"\n\n#. Key:\tElevatorGem_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/ElevatorGem.ElevatorGem.Description\n#. /Game/SO/Items/QuestItems/ElevatorGem.ElevatorGem.Description\n#: /Game/SO/Items/QuestItems/ElevatorGem.ElevatorGem.Description\nmsgctxt \"ItemData\"\nmsgid \"A shiny green crystal which activates a weight lifting mechanism. At least by the look of it.\"\nmsgstr \"壹種閃亮的綠色水晶，可以激活起重裝置。至少從表面上看是這樣。\"\n\n#. Key:\tElevatorGem_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/ElevatorGem.ElevatorGem.Name\n#: /Game/SO/Items/QuestItems/ElevatorGem.ElevatorGem.Name\nmsgctxt \"ItemData\"\nmsgid \"Elevator Gem\"\nmsgstr \"電梯寶石\"\n\n#. Key:\tElevatorLeverCrystal_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/ElevatorLeverCrystal.ElevatorLeverCrystal.Description\n#. /Game/SO/Items/QuestItems/ElevatorLeverCrystal.ElevatorLeverCrystal.Description\n#: /Game/SO/Items/QuestItems/ElevatorLeverCrystal.ElevatorLeverCrystal.Description\nmsgctxt \"ItemData\"\nmsgid \"You got this item for free from a Merchant so you hardly believe it has any value. It might be used as some sort of a mechanism activator though. Hopefully not for a trap.\"\nmsgstr \"妳從壹個商人那裏免費得到這個東西，所以妳幾乎不相信它有任何價值。它可能被用作某種機關激活物。希望不是陷阱。\"\n\n#. Key:\tElevatorLeverCrystal_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/ElevatorLeverCrystal.ElevatorLeverCrystal.Name\n#. /Game/SO/Items/QuestItems/ElevatorLeverCrystal.ElevatorLeverCrystal.Name\n#: /Game/SO/Items/QuestItems/ElevatorLeverCrystal.ElevatorLeverCrystal.Name\nmsgctxt \"ItemData\"\nmsgid \"Elevator Crystal\"\nmsgstr \"電梯水晶\"\n\n#. Key:\tFountainFlower_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/FountainFlower.FountainFlower.Description\n#. /Game/SO/Items/QuestItems/FountainFlower.FountainFlower.Description\n#: /Game/SO/Items/QuestItems/FountainFlower.FountainFlower.Description\nmsgctxt \"ItemData\"\nmsgid \"Flower acquired from a fountain.\"\nmsgstr \"從噴泉中采來的花。\"\n\n#. Key:\tFountainFlower_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/FountainFlower.FountainFlower.Name\n#. /Game/SO/Items/QuestItems/FountainFlower.FountainFlower.Name\n#: /Game/SO/Items/QuestItems/FountainFlower.FountainFlower.Name\nmsgctxt \"ItemData\"\nmsgid \"Fountain Flower\"\nmsgstr \"噴泉之花\"\n\n#. Key:\tGateKeeperSeat_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/GateKeeperSeat.GateKeeperSeat.Description\n#. /Game/SO/Items/QuestItems/GateKeeperSeat.GateKeeperSeat.Description\n#: /Game/SO/Items/QuestItems/GateKeeperSeat.GateKeeperSeat.Description\nmsgctxt \"ItemData\"\nmsgid \"A simple seat of size XXXXXXXXXL\"\nmsgstr \"壹個簡潔的座位，尺寸是XXXXXXXXXL\"\n\n#. Key:\tGateKeeperSeat_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/GateKeeperSeat.GateKeeperSeat.Name\n#. /Game/SO/Items/QuestItems/GateKeeperSeat.GateKeeperSeat.Name\n#: /Game/SO/Items/QuestItems/GateKeeperSeat.GateKeeperSeat.Name\nmsgctxt \"ItemData\"\nmsgid \"Giant Seat\"\nmsgstr \"巨大座椅\"\n\n#. Key:\tKeyAADoorNearDungeonExit_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyAADoorNearDungeonExit.KeyAADoorNearDungeonExit.Description\n#. /Game/SO/Items/Keys/KeyAADoorNearDungeonExit.KeyAADoorNearDungeonExit.Description\n#: /Game/SO/Items/Keys/KeyAADoorNearDungeonExit.KeyAADoorNearDungeonExit.Description\nmsgctxt \"ItemData\"\nmsgid \"A key without a proper item description\"\nmsgstr \"沒有確切描述的鑰匙\"\n\n#. Key:\tKeyAADoorNearDungeonExit_name\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyAADoorNearDungeonExit.KeyAADoorNearDungeonExit.Name\n#. /Game/SO/Items/Keys/KeyAADoorNearDungeonExit.KeyAADoorNearDungeonExit.Name\n#: /Game/SO/Items/Keys/KeyAADoorNearDungeonExit.KeyAADoorNearDungeonExit.Name\nmsgctxt \"ItemData\"\nmsgid \"Arcade Key\"\nmsgstr \"回廊鑰匙\"\n\n#. Key:\tKeyAAFirstFight_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyAAFirstFight.KeyAAFirstFight.Description\n#. /Game/SO/Items/Keys/KeyAAFirstFight.KeyAAFirstFight.Description\n#: /Game/SO/Items/Keys/KeyAAFirstFight.KeyAAFirstFight.Description\nmsgctxt \"ItemData\"\nmsgid \"Weird\"\nmsgstr \"奇怪的\"\n\n#. Key:\tKeyAAFirstFight_name\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyAAFirstFight.KeyAAFirstFight.Name\n#: /Game/SO/Items/Keys/KeyAAFirstFight.KeyAAFirstFight.Name\nmsgctxt \"ItemData\"\nmsgid \"Weird Key\"\nmsgstr \"奇怪的鑰匙\"\n\n#. Key:\tKeyAAMainFirstDoor_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyAAMainFirstDoor.KeyAAMainFirstDoor.Description\n#. /Game/SO/Items/Keys/KeyAAMainFirstDoor.KeyAAMainFirstDoor.Description\n#: /Game/SO/Items/Keys/KeyAAMainFirstDoor.KeyAAMainFirstDoor.Description\nmsgctxt \"ItemData\"\nmsgid \"Sometimes the lock is harder to find than the key.\"\nmsgstr \"有時鎖比鑰匙更難找。\"\n\n#. Key:\tKeyAAMainFirstDoor_name\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyAAMainFirstDoor.KeyAAMainFirstDoor.Name\n#. /Game/SO/Items/Keys/KeyAAMainFirstDoor.KeyAAMainFirstDoor.Name\n#: /Game/SO/Items/Keys/KeyAAMainFirstDoor.KeyAAMainFirstDoor.Name\nmsgctxt \"ItemData\"\nmsgid \"Key of Something\"\nmsgstr \"某處的鑰匙\"\n\n#. Key:\tKeyAGPortalFight_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyAGPortalFight.KeyAGPortalFight.Description\n#. /Game/SO/Items/Keys/KeyAGPortalFight.KeyAGPortalFight.Description\n#: /Game/SO/Items/Keys/KeyAGPortalFight.KeyAGPortalFight.Description\nmsgctxt \"ItemData\"\nmsgid \"Just another key.\"\nmsgstr \"另壹把鑰匙\"\n\n#. Key:\tKeyAGPortalFight_name\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyAGPortalFight.KeyAGPortalFight.Name\n#: /Game/SO/Items/Keys/KeyAGPortalFight.KeyAGPortalFight.Name\nmsgctxt \"ItemData\"\nmsgid \"Eastern Key\"\nmsgstr \"東部鑰匙\"\n\n#. Key:\tKeyBronze_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyBronze.KeyBronze.Description\n#: /Game/SO/Items/Keys/KeyBronze.KeyBronze.Description\nmsgctxt \"ItemData\"\nmsgid \"A reforged Bronze Key.\"\nmsgstr \"壹把重新鍛造的青銅鑰匙。\"\n\n#. Key:\tKeyBronze_name\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyBronze.KeyBronze.Name\n#: /Game/SO/Items/Keys/KeyBronze.KeyBronze.Name\nmsgctxt \"ItemData\"\nmsgid \"Bronze Key\"\nmsgstr \"青銅鑰匙\"\n\n#. Key:\tKeyCatacombs0_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyCatacombs0.KeyCatacombs0.Description\n#: /Game/SO/Items/Keys/KeyCatacombs0.KeyCatacombs0.Description\nmsgctxt \"ItemData\"\nmsgid \"There are a ridiculous amount of keys in this world, right?\"\nmsgstr \"這個世界上的鑰匙數量多得可笑，對吧?\"\n\n#. Key:\tKeyCatacombs0_name\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyCatacombs0.KeyCatacombs0.Name\n#: /Game/SO/Items/Keys/KeyCatacombs0.KeyCatacombs0.Name\nmsgctxt \"ItemData\"\nmsgid \"Key Of The Room Below\"\nmsgstr \"下面房間的鑰匙\"\n\n#. Key:\tKeyCopper_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyCopper.KeyCopper.Description\n#: /Game/SO/Items/Keys/KeyCopper.KeyCopper.Description\nmsgctxt \"ItemData\"\nmsgid \"A reforged Copper Key.\"\nmsgstr \"壹把重新鍛造的銅鑰匙。\"\n\n#. Key:\tKeyCopper_name\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyCopper.KeyCopper.Name\n#: /Game/SO/Items/Keys/KeyCopper.KeyCopper.Name\nmsgctxt \"ItemData\"\nmsgid \"Copper Key\"\nmsgstr \"銅鑰匙\"\n\n#. Key:\tKeyDCMainOut_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyDCMainOut.KeyDCMainOut.Description\n#: /Game/SO/Items/Keys/KeyDCMainOut.KeyDCMainOut.Description\nmsgctxt \"ItemData\"\nmsgid \"Just an old, rusty iron key without a proper item description\"\nmsgstr \"壹把陳舊且生銹的鐵鑰匙，沒有確切描述\"\n\n#. Key:\tKeyDCMainOut_name\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyDCMainOut.KeyDCMainOut.Name\n#: /Game/SO/Items/Keys/KeyDCMainOut.KeyDCMainOut.Name\nmsgctxt \"ItemData\"\nmsgid \"Catacomb Key\"\nmsgstr \"地下墓穴鑰匙\"\n\n#. Key:\tKeyIron_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyIron.KeyIron.Description\n#: /Game/SO/Items/Keys/KeyIron.KeyIron.Description\nmsgctxt \"ItemData\"\nmsgid \"A reforged Iron Key.\"\nmsgstr \"壹把重新鍛造的鐵鑰匙。\"\n\n#. Key:\tKeyIron_name\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyIron.KeyIron.Name\n#: /Game/SO/Items/Keys/KeyIron.KeyIron.Name\nmsgctxt \"ItemData\"\nmsgid \"Iron Key\"\nmsgstr \"鐵鑰匙\"\n\n#. Key:\tKeyMaster_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyMaster.KeyMaster.Description\n#: /Game/SO/Items/Keys/KeyMaster.KeyMaster.Description\nmsgctxt \"ItemData\"\nmsgid \"This key can be used to open any door equipped with a special kind of lock, but breaks during the process.\"\nmsgstr \"這把鑰匙可以用來打開任何裝有特殊鎖的門，但在打開過程中會損壞。\"\n\n#. Key:\tKeyMaster_name\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyMaster.KeyMaster.Name\n#: /Game/SO/Items/Keys/KeyMaster.KeyMaster.Name\nmsgctxt \"ItemData\"\nmsgid \"Master Key\"\nmsgstr \"萬能鑰匙\"\n\n#. Key:\tKeyMerchant_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyMerchant.KeyMerchant.Description\n#: /Game/SO/Items/Keys/KeyMerchant.KeyMerchant.Description\nmsgctxt \"ItemData\"\nmsgid \"Does it really work? You will find out soon...\"\nmsgstr \"這真的有用嗎? 妳很快就會知道……\"\n\n#. Key:\tKeyMerchant_name\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyMerchant.KeyMerchant.Name\n#: /Game/SO/Items/Keys/KeyMerchant.KeyMerchant.Name\nmsgctxt \"ItemData\"\nmsgid \"A very small key\"\nmsgstr \"非常小的鑰匙\"\n\n#. Key:\tKeyOutpostWall_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyOutpostWall.KeyOutpostWall.Description\n#. /Game/SO/Items/Keys/KeyOutpostWall.KeyOutpostWall.Description\n#: /Game/SO/Items/Keys/KeyOutpostWall.KeyOutpostWall.Description\nmsgctxt \"ItemData\"\nmsgid \"Do you really read the key descriptions?\"\nmsgstr \"妳真的看過鑰匙的描述嗎?\"\n\n#. Key:\tKeyOutpostWall_name\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyOutpostWall.KeyOutpostWall.Name\n#: /Game/SO/Items/Keys/KeyOutpostWall.KeyOutpostWall.Name\nmsgctxt \"ItemData\"\nmsgid \"Key Of The Outpost Wall\"\nmsgstr \"前哨墻的鑰匙\"\n\n#. Key:\tKeyOutpostWallOptional_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyOutpostWallOptional.KeyOutpostWallOptional.Description\n#. /Game/SO/Items/Keys/KeyOutpostWallOptional.KeyOutpostWallOptional.Description\n#: /Game/SO/Items/Keys/KeyOutpostWallOptional.KeyOutpostWallOptional.Description\nmsgctxt \"ItemData\"\nmsgid \"I would rather sleep, but the item descriptions won't write themselves.\"\nmsgstr \"我想睡覺，但物品描述不會自己書寫。\"\n\n#. Key:\tKeyOutpostWallOptional_name\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyOutpostWallOptional.KeyOutpostWallOptional.Name\n#. /Game/SO/Items/Keys/KeyOutpostWallOptional.KeyOutpostWallOptional.Name\n#: /Game/SO/Items/Keys/KeyOutpostWallOptional.KeyOutpostWallOptional.Name\nmsgctxt \"ItemData\"\nmsgid \"Second Key Of The Outpost Wall\"\nmsgstr \"前哨墻的第二把鑰匙\"\n\n#. Key:\tKeyPiecesBronze0_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyPiecesBronze0.KeyPiecesBronze0.Description\n#. /Game/SO/Items/Keys/KeyPiecesBronze0.KeyPiecesBronze0.Description\n#: /Game/SO/Items/Keys/KeyPiecesBronze0.KeyPiecesBronze0.Description\nmsgctxt \"ItemData\"\nmsgid \"Half of a broken Bronze Key\"\nmsgstr \"半把壞了的青銅鑰匙\"\n\n#. Key:\tKeyPiecesBronze0_name\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyPiecesBronze0.KeyPiecesBronze0.Name\n#: /Game/SO/Items/Keys/KeyPiecesBronze0.KeyPiecesBronze0.Name\nmsgctxt \"ItemData\"\nmsgid \"Half Bronze Key\"\nmsgstr \"半把青銅鑰匙\"\n\n#. Key:\tKeyPiecesCopper0_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyPiecesCopper0.KeyPiecesCopper0.Description\n#. /Game/SO/Items/Keys/KeyPiecesCopper0.KeyPiecesCopper0.Description\n#: /Game/SO/Items/Keys/KeyPiecesCopper0.KeyPiecesCopper0.Description\nmsgctxt \"ItemData\"\nmsgid \"Half of a broken Copper Key\"\nmsgstr \"半把壞了的銅鑰匙\"\n\n#. Key:\tKeyPiecesCopper0_name\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyPiecesCopper0.KeyPiecesCopper0.Name\n#: /Game/SO/Items/Keys/KeyPiecesCopper0.KeyPiecesCopper0.Name\nmsgctxt \"ItemData\"\nmsgid \"Half Copper Key\"\nmsgstr \"半把銅鑰匙\"\n\n#. Key:\tKeyPiecesIron0_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyPiecesIron0.KeyPiecesIron0.Description\n#. /Game/SO/Items/Keys/KeyPiecesIron0.KeyPiecesIron0.Description\n#: /Game/SO/Items/Keys/KeyPiecesIron0.KeyPiecesIron0.Description\nmsgctxt \"ItemData\"\nmsgid \"Half of a broken Iron Key\"\nmsgstr \"半把壞了的鐵鑰匙\"\n\n#. Key:\tKeyPiecesIron0_name\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyPiecesIron0.KeyPiecesIron0.Name\n#: /Game/SO/Items/Keys/KeyPiecesIron0.KeyPiecesIron0.Name\nmsgctxt \"ItemData\"\nmsgid \"Half Iron Key\"\nmsgstr \"半把鐵鑰匙\"\n\n#. Key:\tKeySA_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/KeySA.KeySA.Description\n#: /Game/SO/Items/Keys/KeySA.KeySA.Description\nmsgctxt \"ItemData\"\nmsgid \"Looks like there are tons of these\"\nmsgstr \"看起來有很多\"\n\n#. Key:\tKeySA_name\n#. SourceLocation:\t/Game/SO/Items/Keys/KeySA.KeySA.Name\n#: /Game/SO/Items/Keys/KeySA.KeySA.Name\nmsgctxt \"ItemData\"\nmsgid \"Another Key\"\nmsgstr \"另壹把鑰匙\"\n\n#. Key:\tKeySASewerCreatureCell_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/KeySASewerCreatureCell.KeySASewerCreatureCell.Description\n#. /Game/SO/Items/Keys/KeySASewerCreatureCell.KeySASewerCreatureCell.Description\n#: /Game/SO/Items/Keys/KeySASewerCreatureCell.KeySASewerCreatureCell.Description\nmsgctxt \"ItemData\"\nmsgid \"A small key you got from the Pipe Walkers.\"\nmsgstr \"妳從管道行走者那裏得到的壹把小鑰匙。\"\n\n#. Key:\tKeyTLElevatorRoom_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyTLElevatorRoom.KeyTLElevatorRoom.Description\n#. /Game/SO/Items/Keys/KeyTLElevatorRoom.KeyTLElevatorRoom.Description\n#: /Game/SO/Items/Keys/KeyTLElevatorRoom.KeyTLElevatorRoom.Description\nmsgctxt \"ItemData\"\nmsgid \"A key without any sign of interest.\"\nmsgstr \"沒有任何興趣點的鑰匙。\"\n\n#. Key:\tKeyTLElevatorRoom_name\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyTLElevatorRoom.KeyTLElevatorRoom.Name\n#. /Game/SO/Items/Keys/KeyTLElevatorRoom.KeyTLElevatorRoom.Name\n#: /Game/SO/Items/Keys/KeyTLElevatorRoom.KeyTLElevatorRoom.Name\nmsgctxt \"ItemData\"\nmsgid \"Unconcerned Key\"\nmsgstr \"不受關註的鑰匙\"\n\n#. Key:\tKeyWWFirstGate_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyWWFirstGate.KeyWWFirstGate.Description\n#. /Game/SO/Items/Keys/KeyWWFirstGate.KeyWWFirstGate.Description\n#: /Game/SO/Items/Keys/KeyWWFirstGate.KeyWWFirstGate.Description\nmsgctxt \"ItemData\"\nmsgid \"It will open a gate somewhere. Probably.\"\nmsgstr \"可能，它會在某個地方打開壹扇門。\"\n\n#. Key:\tKeyWWFirstGate_name\n#. SourceLocation:\t/Game/SO/Items/Keys/KeyWWFirstGate.KeyWWFirstGate.Name\n#: /Game/SO/Items/Keys/KeyWWFirstGate.KeyWWFirstGate.Name\nmsgctxt \"ItemData\"\nmsgid \"Railway Gate Key\"\nmsgstr \"鐵道門鑰匙\"\n\n#. Key:\tKeyWWPortal_desc\n#. SourceLocation:\t/Game/SO/Items/WhiteWallItems/KeyWWPortal.KeyWWPortal.Description\n#. /Game/SO/Items/WhiteWallItems/KeyWWPortal.KeyWWPortal.Description\n#: /Game/SO/Items/WhiteWallItems/KeyWWPortal.KeyWWPortal.Description\nmsgctxt \"ItemData\"\nmsgid \"A fancy iron key with a shiny gem in its grip. It must be really precious.\"\nmsgstr \"壹把別致的鐵鑰匙，鑲嵌著壹顆閃亮的寶石。它壹定很珍貴。\"\n\n#. Key:\tKeyWWPortal_name\n#. SourceLocation:\t/Game/SO/Items/WhiteWallItems/KeyWWPortal.KeyWWPortal.Name\n#: /Game/SO/Items/WhiteWallItems/KeyWWPortal.KeyWWPortal.Name\nmsgctxt \"ItemData\"\nmsgid \"Portal Key\"\nmsgstr \"入口鑰匙\"\n\n#. Key:\tKEYWWSewerCreatureCell_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/KEYWWSewerCreatureCell.KEYWWSewerCreatureCell.Description\n#. /Game/SO/Items/Keys/KEYWWSewerCreatureCell.KEYWWSewerCreatureCell.Description\n#: /Game/SO/Items/Keys/KEYWWSewerCreatureCell.KEYWWSewerCreatureCell.Description\nmsgctxt \"ItemData\"\nmsgid \"A small key you got from a chest in the middle of nowhere.\"\nmsgstr \"壹把小鑰匙，妳從壹個偏僻的地方從箱子裏拿出來的。\"\n\n#. Key:\tKEYWWSewerCreatureCell_name\n#. SourceLocation:\t/Game/SO/Items/Keys/KEYWWSewerCreatureCell.KEYWWSewerCreatureCell.Name\n#. Key:\tKeySASewerCreatureCell_name\n#. SourceLocation:\t/Game/SO/Items/Keys/KeySASewerCreatureCell.KeySASewerCreatureCell.Name\n#. /Game/SO/Items/Keys/KEYWWSewerCreatureCell.KEYWWSewerCreatureCell.Name\n#. /Game/SO/Items/Keys/KeySASewerCreatureCell.KeySASewerCreatureCell.Name\n#: /Game/SO/Items/Keys/KeySASewerCreatureCell.KeySASewerCreatureCell.Name\n#: /Game/SO/Items/Keys/KEYWWSewerCreatureCell.KEYWWSewerCreatureCell.Name\nmsgctxt \"ItemData\"\nmsgid \"Small Cell Key\"\nmsgstr \"小細胞鑰匙\"\n\n#. Key:\tKeyWWWhiteWall_desc\n#. SourceLocation:\t/Game/SO/Items/WhiteWallItems/KeyWWWhiteWall.KeyWWWhiteWall.Description\n#. /Game/SO/Items/WhiteWallItems/KeyWWWhiteWall.KeyWWWhiteWall.Description\n#: /Game/SO/Items/WhiteWallItems/KeyWWWhiteWall.KeyWWWhiteWall.Description\nmsgctxt \"ItemData\"\nmsgid \"A robust iron key with a carved script: <Bold>'Outer Wall Tower'</>.\"\nmsgstr \"壹把粗糙的帶有刻字的鐵鑰匙:<Bold>'外墻塔'</>。\"\n\n#. Key:\tKeyWWWhiteWall_name\n#. SourceLocation:\t/Game/SO/Items/WhiteWallItems/KeyWWWhiteWall.KeyWWWhiteWall.Name\n#. /Game/SO/Items/WhiteWallItems/KeyWWWhiteWall.KeyWWWhiteWall.Name\n#: /Game/SO/Items/WhiteWallItems/KeyWWWhiteWall.KeyWWWhiteWall.Name\nmsgctxt \"ItemData\"\nmsgid \"White Wall Key\"\nmsgstr \"白色巨墻鑰匙\"\n\n#. Key:\tKoboldCoin_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/KoboldCoin.KoboldCoin.Description\n#: /Game/SO/Items/QuestItems/KoboldCoin.KoboldCoin.Description\nmsgctxt \"ItemData\"\nmsgid \"Some Coins you found in a chest.\"\nmsgstr \"妳在箱子裏找到的壹些硬幣。\"\n\n#. Key:\tKoboldCoin_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/KoboldCoin.KoboldCoin.Name\n#: /Game/SO/Items/QuestItems/KoboldCoin.KoboldCoin.Name\nmsgctxt \"ItemData\"\nmsgid \"Kobold Coins\"\nmsgstr \"地精硬幣\"\n\n#. Key:\tKoboldPotion_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/KoboldPotion.KoboldPotion.Description\n#. /Game/SO/Items/QuestItems/KoboldPotion.KoboldPotion.Description\n#: /Game/SO/Items/QuestItems/KoboldPotion.KoboldPotion.Description\nmsgctxt \"ItemData\"\nmsgid \"Weird liquid in a bottle. The kobold calls it Soup.\"\nmsgstr \"瓶子裏裝著奇怪的液體。地精管這個叫湯。\"\n\n#. Key:\tKoboldPotion_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/KoboldPotion.KoboldPotion.Name\n#: /Game/SO/Items/QuestItems/KoboldPotion.KoboldPotion.Name\nmsgctxt \"ItemData\"\nmsgid \"Kobold Soup\"\nmsgstr \"地精湯\"\n\n#. Key:\tLavaGolemToken_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/LavaGolemToken.LavaGolemToken.Description\n#. /Game/SO/Items/QuestItems/LavaGolemToken.LavaGolemToken.Description\n#: /Game/SO/Items/QuestItems/LavaGolemToken.LavaGolemToken.Description\nmsgctxt \"ItemData\"\nmsgid \"A unique stone you can use to prove that you have eliminated a golem.\"\nmsgstr \"壹種獨特的石頭，妳可以用它來證明妳消滅了壹個機器人。\"\n\n#. Key:\tLavaGolemToken_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/LavaGolemToken.LavaGolemToken.Name\n#. /Game/SO/Items/QuestItems/LavaGolemToken.LavaGolemToken.Name\n#: /Game/SO/Items/QuestItems/LavaGolemToken.LavaGolemToken.Name\nmsgctxt \"ItemData\"\nmsgid \"Stone Token\"\nmsgstr \"石制徽章\"\n\n#. Key:\tLeafMace_desc\n#. SourceLocation:\t/Game/SO/Items/Weapons/LeafMace.LeafMace.Description\n#: /Game/SO/Items/Weapons/LeafMace.LeafMace.Description\nmsgctxt \"ItemData\"\nmsgid \"If someone would fail in cutting his/her/its way out of a hard situation, crushing your way through can still work out pretty well - it is said to be more effective if golems or certain mechanical devices / creatures are involved in the conflict.\"\nmsgstr \"如果有人沒能從困境中脫身，妳也可以很好地破土而出——據說如果假人或某些機械設備/生物卷入沖突中，效果會更好。\"\n\n#. Key:\tLeafMace_name\n#. SourceLocation:\t/Game/SO/Items/Weapons/LeafMace.LeafMace.Name\n#: /Game/SO/Items/Weapons/LeafMace.LeafMace.Name\nmsgctxt \"ItemData\"\nmsgid \"Leaf Mace\"\nmsgstr \"葉子權杖\"\n\n#. Key:\tLEKeyCage_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/LEKeyCage.LEKeyCage.Description\n#: /Game/SO/Items/Keys/LEKeyCage.LEKeyCage.Description\nmsgctxt \"ItemData\"\nmsgid \"You won't believe it but it is a key for a cage.\"\nmsgstr \"也許妳不會相信，但它的確是籠子的鑰匙。\"\n\n#. Key:\tLEKeyCage_name\n#. SourceLocation:\t/Game/SO/Items/Keys/LEKeyCage.LEKeyCage.Name\n#: /Game/SO/Items/Keys/LEKeyCage.LEKeyCage.Name\nmsgctxt \"ItemData\"\nmsgid \"Cage Key\"\nmsgstr \"籠子鑰匙\"\n\n#. Key:\tLETempleKey_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/LETempleKey.LETempleKey.Description\n#: /Game/SO/Items/Keys/LETempleKey.LETempleKey.Description\nmsgctxt \"ItemData\"\nmsgid \"This is one of the spare keys of the Ancient Temple. Just in case the original would be dropped into the lava accidentally.\"\nmsgstr \"這是古廟的備用鑰匙之壹。只是為了防止原物不小心掉進熔巖裏。\"\n\n#. Key:\tLETempleKey_name\n#. SourceLocation:\t/Game/SO/Items/Keys/LETempleKey.LETempleKey.Name\n#: /Game/SO/Items/Keys/LETempleKey.LETempleKey.Name\nmsgctxt \"ItemData\"\nmsgid \"Ancient Temple Key\"\nmsgstr \"古廟的鑰匙\"\n\n#. Key:\tLoryBooks_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/LoryBooks.LoryBooks.Description\n#: /Game/SO/Items/QuestItems/LoryBooks.LoryBooks.Description\nmsgctxt \"ItemData\"\nmsgid \"Two ancient books with the titles \\\"True value of your family\\\" and \\\"How much does a brother cost?\\\". They look boring so you decide not to open them.\"\nmsgstr \"這是兩本古書，書名分別是《妳的家庭的真正價值》心臟《壹個兄弟值多少錢?》。看起來很無聊，所以妳決定不打開它們。\"\n\n#. Key:\tLoryBooks_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/LoryBooks.LoryBooks.Name\n#: /Game/SO/Items/QuestItems/LoryBooks.LoryBooks.Name\nmsgctxt \"ItemData\"\nmsgid \"Old books\"\nmsgstr \"舊書\"\n\n#. Key:\tMemoryCrystal1_desc\n#. SourceLocation:\t/Game/SO/Items/MemoryStone/MemoryCrystal1.MemoryCrystal1.Description\n#. /Game/SO/Items/MemoryStone/MemoryCrystal1.MemoryCrystal1.Description\n#: /Game/SO/Items/MemoryStone/MemoryCrystal1.MemoryCrystal1.Description\nmsgctxt \"ItemData\"\nmsgid \"'According to the very few survivors, White Tower, our capital was completely destroyed by a magical phenomena called Ruin. At that time I was at Grey Gate so I can't tell anything for sure.'\\r\\n\\r\\nThe Last Sane Golem Maker, A.C. 16. September 4.\"\nmsgstr \"“‘據白塔上僅有的幾個倖存者說，我們的首都被一種叫做毀滅的神奇現象完全摧毀了。那時我在格雷之門，所以我也不確定是不是真的。 ”\\r\\n\\r\\n最後一個心智健全的機器人製造者，A.C. 16。9月4日。 \"\n\n#. Key:\tMemoryCrystal1_name\n#. SourceLocation:\t/Game/SO/Items/MemoryStone/MemoryCrystal1.MemoryCrystal1.Name\n#. /Game/SO/Items/MemoryStone/MemoryCrystal1.MemoryCrystal1.Name\n#: /Game/SO/Items/MemoryStone/MemoryCrystal1.MemoryCrystal1.Name\nmsgctxt \"ItemData\"\nmsgid \"Magical Phenomena\"\nmsgstr \"魔法現象\"\n\n#. Key:\tMemoryCrystal2_desc\n#. SourceLocation:\t/Game/SO/Items/MemoryStone/MemoryCrystal2.MemoryCrystal2.Description\n#. /Game/SO/Items/MemoryStone/MemoryCrystal2.MemoryCrystal2.Description\n#: /Game/SO/Items/MemoryStone/MemoryCrystal2.MemoryCrystal2.Description\nmsgctxt \"ItemData\"\nmsgid \"'Those who escaped Ruin have... changed.'\\r\\n'I've met a scientist who noticed how madness takes control over him. Perhaps he can find a solution.'\\r\\n\\r\\nThe Last Sane Golem Maker, A.C. 17. January 1.\"\nmsgstr \"“那些逃離了毀滅的人已經... 改變了。 ”\\r\\n“我遇到一個科學家，他注意到自己是如何受瘋狂控制的。也許他能找到解決辦法。”\\r\\n\\r\\n最後一個心智健全的機器人製造者，A.C. 17。1月1日。 \"\n\n#. Key:\tMemoryCrystal2_name\n#. SourceLocation:\t/Game/SO/Items/MemoryStone/MemoryCrystal2.MemoryCrystal2.Name\n#. /Game/SO/Items/MemoryStone/MemoryCrystal2.MemoryCrystal2.Name\n#: /Game/SO/Items/MemoryStone/MemoryCrystal2.MemoryCrystal2.Name\nmsgctxt \"ItemData\"\nmsgid \"Degeneration and mutation\"\nmsgstr \"退化和變異\"\n\n#. Key:\tMemoryCrystal3_desc\n#. SourceLocation:\t/Game/SO/Items/MemoryStone/MemoryCrystal3.MemoryCrystal3.Description\n#. /Game/SO/Items/MemoryStone/MemoryCrystal3.MemoryCrystal3.Description\n#: /Game/SO/Items/MemoryStone/MemoryCrystal3.MemoryCrystal3.Description\nmsgctxt \"ItemData\"\nmsgid \"'It's hard to tell but I think colours are fading away. The World was brighter before.'\\r\\n'The Monk won't help me. He stubbornly believes we are doomed.'\\r\\n\\r\\nThe Last Sane Golem Maker, A.C. 17. March 11.\"\nmsgstr \"“這很難說，但我覺得顏色正在消失。以前的世界更美好。 ”\\r\\n“那個修道士不肯幫我。他固執地認為我們注定要失敗。”\\r\\n\\r\\n最後一個心智健全的機器人製造者，A.C. 17。3月11日。 \"\n\n#. Key:\tMemoryCrystal3_name\n#. SourceLocation:\t/Game/SO/Items/MemoryStone/MemoryCrystal3.MemoryCrystal3.Name\n#. /Game/SO/Items/MemoryStone/MemoryCrystal3.MemoryCrystal3.Name\n#: /Game/SO/Items/MemoryStone/MemoryCrystal3.MemoryCrystal3.Name\nmsgctxt \"ItemData\"\nmsgid \"Fading Colours\"\nmsgstr \"褪去的顏色\"\n\n#. Key:\tMemoryCrystal4_desc\n#. SourceLocation:\t/Game/SO/Items/MemoryStone/MemoryCrystal4.MemoryCrystal4.Description\n#. /Game/SO/Items/MemoryStone/MemoryCrystal4.MemoryCrystal4.Description\n#: /Game/SO/Items/MemoryStone/MemoryCrystal4.MemoryCrystal4.Description\nmsgctxt \"ItemData\"\nmsgid \"'Madness takes control over those who get too close to Ruin.'\\r\\n'Maintainers forgot to speak. I understand some of the phrases they try to say: \\\"Dinner is served\\\", \\\"At your service\\\", \\\"Your order\\\" - a mockery of their former intelligence!'\\r\\n\\r\\nThe Last Sane Golem Maker, A.C. 21. January 26.\"\nmsgstr \"“瘋狂會控制那些過於接近毀滅的人。 ”\\r\\n“維修者忘記開口。我明白他們想說的一些話，如:“飯端上來了”、“聽候您的吩咐”、“您點的菜”——這是對他們曾經智慧的嘲諷！”\\r\\n\\r\\n最後一個心智健全的機器人製造者，A.C. 17。1月26日。 \"\n\n#. Key:\tMemoryCrystal4_name\n#. SourceLocation:\t/Game/SO/Items/MemoryStone/MemoryCrystal4.MemoryCrystal4.Name\n#. /Game/SO/Items/MemoryStone/MemoryCrystal4.MemoryCrystal4.Name\n#: /Game/SO/Items/MemoryStone/MemoryCrystal4.MemoryCrystal4.Name\nmsgctxt \"ItemData\"\nmsgid \"Madness\"\nmsgstr \"瘋狂\"\n\n#. Key:\tMemoryCrystal5_desc\n#. SourceLocation:\t/Game/SO/Items/MemoryStone/MemoryCrystal5.MemoryCrystal5.Description\n#. /Game/SO/Items/MemoryStone/MemoryCrystal5.MemoryCrystal5.Description\n#: /Game/SO/Items/MemoryStone/MemoryCrystal5.MemoryCrystal5.Description\nmsgctxt \"ItemData\"\nmsgid \"'Now I have seen it with my own eyes: the touch of the Ruin makes the World literally fall apart.'\\r\\n\\r\\nThe Last Sane Golem Maker, A.C. 25. September 4.\"\nmsgstr \"“現在我親眼所見: 毀滅的輕輕一觸，就能讓世界分崩離析。 ”\\r\\n\\r\\n最後一個心智健全的機器人製造者，A.C. 25。9月4日。 \"\n\n#. Key:\tMemoryCrystal5_name\n#. SourceLocation:\t/Game/SO/Items/MemoryStone/MemoryCrystal5.MemoryCrystal5.Name\n#. /Game/SO/Items/MemoryStone/MemoryCrystal5.MemoryCrystal5.Name\n#: /Game/SO/Items/MemoryStone/MemoryCrystal5.MemoryCrystal5.Name\nmsgctxt \"ItemData\"\nmsgid \"Falling Apart\"\nmsgstr \"分崩離析\"\n\n#. Key:\tMemoryCrystal6_desc\n#. SourceLocation:\t/Game/SO/Items/MemoryStone/MemoryCrystal6.MemoryCrystal6.Description\n#. /Game/SO/Items/MemoryStone/MemoryCrystal6.MemoryCrystal6.Description\n#: /Game/SO/Items/MemoryStone/MemoryCrystal6.MemoryCrystal6.Description\nmsgctxt \"ItemData\"\nmsgid \"'This is my 87 birthday. It's obvious that my body doesn't get older with time. How long can I preserve my sanity?'\\r\\n'Drones can no longer be trusted. They resisted Ruin for the longest.'\\r\\n\\r\\nThe Last Sane Golem Maker, A.C. 52. July 9.\"\nmsgstr \"“今天是我87歲的生日。顯而易見的是，我的身體並沒有隨著歲月的流逝而衰老。我能一直保持清醒的頭腦嗎？ ”\\r\\n“無人機不再可信。他們抵抗毀滅的時間最長。”\\r\\n\\r\\n最後一個心智健全的機器人製造者，A.C. 52。7月9日。 \"\n\n#. Key:\tMemoryCrystal6_name\n#. SourceLocation:\t/Game/SO/Items/MemoryStone/MemoryCrystal6.MemoryCrystal6.Name\n#. /Game/SO/Items/MemoryStone/MemoryCrystal6.MemoryCrystal6.Name\n#: /Game/SO/Items/MemoryStone/MemoryCrystal6.MemoryCrystal6.Name\nmsgctxt \"ItemData\"\nmsgid \"Preservation of Ruin\"\nmsgstr \"廢墟的保存\"\n\n#. Key:\tMemoryCrystal7_desc\n#. SourceLocation:\t/Game/SO/Items/MemoryStone/MemoryCrystal7.MemoryCrystal7.Description\n#. /Game/SO/Items/MemoryStone/MemoryCrystal7.MemoryCrystal7.Description\n#: /Game/SO/Items/MemoryStone/MemoryCrystal7.MemoryCrystal7.Description\nmsgctxt \"ItemData\"\nmsgid \"'Ruin will soon reach Grey Gate, our very last city. I need to move deeper into the Realm, further away from Ruin.'\\r\\n'I decided to create some new golems. Golems that resist Ruin.'\\r\\n\\r\\nThe Last Sane Golem Maker, A.C. 315. April 8.\"\nmsgstr \"“毀滅將很快到達灰暗之門，我們最後的城市。我需要深入王國，遠離毀滅。 ”\\r\\n“我決定創造一些新的機器人。能抵抗毀滅的機器人。”\\r\\n\\r\\n最後一個神誌清醒的假人，A.C. 315。4月8日\"\n\n#. Key:\tMemoryCrystal7_name\n#. SourceLocation:\t/Game/SO/Items/MemoryStone/MemoryCrystal7.MemoryCrystal7.Name\n#. /Game/SO/Items/MemoryStone/MemoryCrystal7.MemoryCrystal7.Name\n#: /Game/SO/Items/MemoryStone/MemoryCrystal7.MemoryCrystal7.Name\nmsgctxt \"ItemData\"\nmsgid \"New Hope\"\nmsgstr \"新的繩子\"\n\n#. Key:\tMemoryCrystal8_desc\n#. SourceLocation:\t/Game/SO/Items/MemoryStone/MemoryCrystal8.MemoryCrystal8.Description\n#. /Game/SO/Items/MemoryStone/MemoryCrystal8.MemoryCrystal8.Description\n#: /Game/SO/Items/MemoryStone/MemoryCrystal8.MemoryCrystal8.Description\nmsgctxt \"ItemData\"\nmsgid \"'I don't think I can keep up. There are times when I no longer know what I'm doing. I still have clear moments but they become more and more rare. I've recorded my memories to keep them safe.'\\r\\n\\r\\nThe Last Sane Golem Maker, about A.C. 500.\\r\\n\"\nmsgstr \"“我想我的頭腦快不行了。有些時候我甚至不知道自己在做什麼。雖然我也不是一直糊塗，但清醒的時間已經越來越少。我已經把自己的記憶給記錄下來，以保證它們得以保存。 ”\\r\\n\\r\\n最後一個神誌清醒的假人，A.C. 500.\\n\"\n\n#. Key:\tMemoryCrystal8_name\n#. SourceLocation:\t/Game/SO/Items/MemoryStone/MemoryCrystal8.MemoryCrystal8.Name\n#. /Game/SO/Items/MemoryStone/MemoryCrystal8.MemoryCrystal8.Name\n#: /Game/SO/Items/MemoryStone/MemoryCrystal8.MemoryCrystal8.Name\nmsgctxt \"ItemData\"\nmsgid \"Final Decision\"\nmsgstr \"最後決定\"\n\n#. Key:\tPergamen_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/Pergamen.Pergamen.Description\n#: /Game/SO/Items/QuestItems/Pergamen.Pergamen.Description\nmsgctxt \"ItemData\"\nmsgid \"'This chest and everything inside belongs to me, the Chef.'\"\nmsgstr \"“這個箱子和裏面的壹切都屬於我，廚師。”\"\n\n#. Key:\tPergamen_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/Pergamen.Pergamen.Name\n#: /Game/SO/Items/QuestItems/Pergamen.Pergamen.Name\nmsgctxt \"ItemData\"\nmsgid \"Parchment\"\nmsgstr \"羊皮紙\"\n\n#. Key:\tPortalGem_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/PortalGem.PortalGem.Description\n#: /Game/SO/Items/QuestItems/PortalGem.PortalGem.Description\nmsgctxt \"ItemData\"\nmsgid \"There are so many stones around. You are still not sure what's the point of picking up some of them.\"\nmsgstr \"周圍有很多石頭。妳仍然不確定拿起它們有什麽意義。\"\n\n#. Key:\tPortalGem_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/PortalGem.PortalGem.Name\n#: /Game/SO/Items/QuestItems/PortalGem.PortalGem.Name\nmsgctxt \"ItemData\"\nmsgid \"Lock Gem\"\nmsgstr \"鎖寶石\"\n\n#. Key:\tPotionOfWorthiness_desc\n#. SourceLocation:\t/Game/SO/Items/Useable/PotionOfWorthiness.PotionOfWorthiness.Description\n#. /Game/SO/Items/Useable/PotionOfWorthiness.PotionOfWorthiness.Description\n#: /Game/SO/Items/Useable/PotionOfWorthiness.PotionOfWorthiness.Description\nmsgctxt \"ItemData\"\nmsgid \"This might not be the weirdest side effect one can have when drinking something suspicious but it is definitely in the top five.\"\nmsgstr \"也許喝下它所產生的副作用不是第壹名，但也足以位列前五。\"\n\n#. Key:\tPotionOfWorthiness_name\n#. SourceLocation:\t/Game/SO/Items/Useable/PotionOfWorthiness.PotionOfWorthiness.Name\n#. /Game/SO/Items/Useable/PotionOfWorthiness.PotionOfWorthiness.Name\n#: /Game/SO/Items/Useable/PotionOfWorthiness.PotionOfWorthiness.Name\nmsgctxt \"ItemData\"\nmsgid \"Potion Of Worthiness\"\nmsgstr \"藥劑的價值\"\n\n#. Key:\tPurpleMushroom_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/PurpleMushroom.PurpleMushroom.Description\n#. /Game/SO/Items/QuestItems/PurpleMushroom.PurpleMushroom.Description\n#: /Game/SO/Items/QuestItems/PurpleMushroom.PurpleMushroom.Description\nmsgctxt \"ItemData\"\nmsgid \"The most purple mushrooms you could find. You hope these will be enough.\"\nmsgstr \"妳能找到的顏色最紫的蘑菇。妳希望這些數量足夠。\"\n\n#. Key:\tPurpleMushroom_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/PurpleMushroom.PurpleMushroom.Name\n#. /Game/SO/Items/QuestItems/PurpleMushroom.PurpleMushroom.Name\n#: /Game/SO/Items/QuestItems/PurpleMushroom.PurpleMushroom.Name\nmsgctxt \"ItemData\"\nmsgid \"Purple Mushrooms\"\nmsgstr \"紫色蘑菇\"\n\n#. Key:\tRavenFeather_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/RavenFeather.RavenFeather.Description\n#. /Game/SO/Items/QuestItems/RavenFeather.RavenFeather.Description\n#: /Game/SO/Items/QuestItems/RavenFeather.RavenFeather.Description\nmsgctxt \"ItemData\"\nmsgid \"A magical item which gives you the ability to fly... or something like that.\"\nmsgstr \"壹件神奇的物品，可以讓妳飛起來... 差不多這意思。\"\n\n#. Key:\tRavenFeather_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/RavenFeather.RavenFeather.Name\n#: /Game/SO/Items/QuestItems/RavenFeather.RavenFeather.Name\nmsgctxt \"ItemData\"\nmsgid \"Raven Feather\"\nmsgstr \"烏鴉的羽毛\"\n\n#. Key:\tRope_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/Rope.Rope.Description\n#: /Game/SO/Items/QuestItems/Rope.Rope.Description\nmsgctxt \"ItemData\"\nmsgid \"You do wonder when the area is full of ropes why this is the only one which can be taken...\"\nmsgstr \"妳壹定想知道為什麽在這個布滿了繩子的房間裏只有壹件東西可拿...\"\n\n#. Key:\tRope_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/Rope.Rope.Name\n#: /Game/SO/Items/QuestItems/Rope.Rope.Name\nmsgctxt \"ItemData\"\nmsgid \"Rope\"\nmsgstr \"繩子\"\n\n#. Key:\tRuneStoneBonusHPMagical_desc\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneBonusHPMagical.RuneStoneBonusHPMagical.Description\n#. /Game/SO/Items/RuneStones/RuneStoneBonusHPMagical.RuneStoneBonusHPMagical.Description\n#: /Game/SO/Items/RuneStones/RuneStoneBonusHPMagical.RuneStoneBonusHPMagical.Description\nmsgctxt \"ItemData\"\nmsgid \"Absorbs <Blue>30</> magical damage.\"\nmsgstr \"吸收 <Blue>30</> 魔法傷害。\"\n\n#. Key:\tRuneStoneBonusHPMagical_name\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneBonusHPMagical.RuneStoneBonusHPMagical.Name\n#. /Game/SO/Items/RuneStones/RuneStoneBonusHPMagical.RuneStoneBonusHPMagical.Name\n#: /Game/SO/Items/RuneStones/RuneStoneBonusHPMagical.RuneStoneBonusHPMagical.Name\nmsgctxt \"ItemData\"\nmsgid \"Bluestone\"\nmsgstr \"藍色石\"\n\n#. Key:\tRuneStoneBonusHPPhysical_desc\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneBonusHPPhysical.RuneStoneBonusHPPhysical.Description\n#. /Game/SO/Items/RuneStones/RuneStoneBonusHPPhysical.RuneStoneBonusHPPhysical.Description\n#: /Game/SO/Items/RuneStones/RuneStoneBonusHPPhysical.RuneStoneBonusHPPhysical.Description\nmsgctxt \"ItemData\"\nmsgid \"Absorbs <White>30</> physical damage.\"\nmsgstr \"吸收 <White>30</> 物理傷害。\"\n\n#. Key:\tRuneStoneBonusHPPhysical_name\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneBonusHPPhysical.RuneStoneBonusHPPhysical.Name\n#. /Game/SO/Items/RuneStones/RuneStoneBonusHPPhysical.RuneStoneBonusHPPhysical.Name\n#: /Game/SO/Items/RuneStones/RuneStoneBonusHPPhysical.RuneStoneBonusHPPhysical.Name\nmsgctxt \"ItemData\"\nmsgid \"Graystone\"\nmsgstr \"灰色石\"\n\n#. Key:\tRuneStoneBounce_desc\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.Description\n#. Key:\tRuneStoneBounce_level_desc_0\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.LevelBasedDescOverride(0).LevelBasedDescOverride\n#. /Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.Description\n#. /Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.LevelBasedDescOverride(0).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.Description\n#: /Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.LevelBasedDescOverride(0).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Provides the ability to bounce from enemies for <Green>8</> seconds. Doing so causes <Blue>12</> damage to the target.\"\nmsgstr \"賦予在敵人身上反彈 <Green>8</> 秒的能力。對目標造成 <Blue>12</> 傷害。\"\n\n#. Key:\tRuneStoneBounce_level_desc_1\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.LevelBasedDescOverride(1).LevelBasedDescOverride\n#. /Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.LevelBasedDescOverride(1).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.LevelBasedDescOverride(1).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Provides the ability to bounce from enemies for <Green>16</> seconds. Doing so causes <Blue>18</> damage to the target.\"\nmsgstr \"賦予在敵人身上反彈 <Green>16</> 秒的能力。對目標造成 <Blue>18</> 傷害。\"\n\n#. Key:\tRuneStoneBounce_level_desc_2\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.LevelBasedDescOverride(2).LevelBasedDescOverride\n#. /Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.LevelBasedDescOverride(2).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.LevelBasedDescOverride(2).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Provides the ability to bounce from enemies for <Green>16</> seconds. Doing so causes <Blue>18</> damage and applies <Yellow>Stun</> on the target.\"\nmsgstr \"賦予在敵人身上反彈 <Green>16</> 秒的能力。造成 <Blue>18</> 傷害 <YellowH> 並對目標產生 <Yellow>暈眩</>。\"\n\n#. Key:\tRuneStoneBounce_level_desc_3\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.LevelBasedDescOverride(3).LevelBasedDescOverride\n#. /Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.LevelBasedDescOverride(3).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.LevelBasedDescOverride(3).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Provides the ability to bounce from enemies for <Green>16</> seconds. Doing so causes <Blue>24</> damage and applies <Yellow>Stun</> on the target.\"\nmsgstr \"賦予在敵人身上反彈 <Green>16</> 秒的能力。造成 <Blue>24</> 傷害 <YellowH> 並對目標產生 <Yellow>暈眩</>。\"\n\n#. Key:\tRuneStoneBounce_level_desc_4\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.LevelBasedDescOverride(4).LevelBasedDescOverride\n#. /Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.LevelBasedDescOverride(4).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.LevelBasedDescOverride(4).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Provides the ability to bounce from enemies for <Green>16</> seconds. Doing so causes <Blue>30</> damage and applies <Yellow>Stun</> on the target.\"\nmsgstr \"賦予在敵人身上反彈 <Green>16</> 秒的能力。造成 <Blue>30</> 傷害 <YellowH> 並對目標產生 <Yellow>暈眩</>。\"\n\n#. Key:\tRuneStoneBounce_level_up_desc_0\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.LevelUpBasedDescOverride(0).LevelUpBasedDescOverride\n#. /Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.LevelUpBasedDescOverride(0).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.LevelUpBasedDescOverride(0).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Provides the ability to bounce from enemies for <Green>8</><YellowH>(→16)</> seconds. Doing so causes <Blue>12</><YellowH>(→18)</> damage to the target.\"\nmsgstr \"賦予在敵人身上反彈 <Green>8</><YellowH>(→16)</> 秒的能力。對目標造成 <Blue>12</><YellowH>(→18)</> 傷害。\"\n\n#. Key:\tRuneStoneBounce_level_up_desc_1\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.LevelUpBasedDescOverride(1).LevelUpBasedDescOverride\n#. /Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.LevelUpBasedDescOverride(1).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.LevelUpBasedDescOverride(1).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Provides the ability to bounce from enemies for <Green>16</> seconds. Doing so causes <Blue>18</> damage <YellowH>and applies Stun on the target.</>\"\nmsgstr \"賦予在敵人身上反彈 <Green>16</> 秒的能力。造成 <Blue>18</> 傷害 <YellowH> 並對目標產生 <Yellow>暈眩</>。\"\n\n#. Key:\tRuneStoneBounce_level_up_desc_2\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.LevelUpBasedDescOverride(2).LevelUpBasedDescOverride\n#. /Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.LevelUpBasedDescOverride(2).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.LevelUpBasedDescOverride(2).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Provides the ability to bounce from enemies for <Green>16</> seconds. Doing so causes <Blue>18</><YellowH>(→24)</> damage and applies <Yellow>Stun</> on the target.\"\nmsgstr \"賦予在敵人身上反彈 <Green>16</> 秒的能力。造成 <Blue>18</><YellowH>(→24)</> 傷害並對目標產生 <Yellow>暈眩</>。\"\n\n#. Key:\tRuneStoneBounce_level_up_desc_3\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.LevelUpBasedDescOverride(3).LevelUpBasedDescOverride\n#. /Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.LevelUpBasedDescOverride(3).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.LevelUpBasedDescOverride(3).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Provides the ability to bounce from enemies for <Green>16</> seconds. Doing so causes <Blue>24</><YellowH>(→30)</> damage and applies <Yellow>Stun</> on the target.\"\nmsgstr \"賦予在敵人身上反彈 <Green>16</> 秒的能力。造成 <Blue>24</><YellowH>(→30)</> 傷害並對目標產生 <Yellow>暈眩</>。\"\n\n#. Key:\tRuneStoneBounce_name\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.Name\n#. /Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.Name\n#: /Game/SO/Items/RuneStones/RuneStoneBounce.RuneStoneBounce.Name\nmsgctxt \"ItemData\"\nmsgid \"Bouncestone\"\nmsgstr \"彈力石\"\n\n#. Key:\tRuneStoneEnergy_desc\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneEnergy.RuneStoneEnergy.Description\n#. /Game/SO/Items/RuneStones/RuneStoneEnergy.RuneStoneEnergy.Description\n#: /Game/SO/Items/RuneStones/RuneStoneEnergy.RuneStoneEnergy.Description\nmsgctxt \"ItemData\"\nmsgid \"Strikes and spell cooldowns are decreased by 90% for 10 seconds.\"\nmsgstr \"攻擊和法術冷卻時間減少90%，持續10秒。\"\n\n#. Key:\tRuneStoneEnergy_name\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneEnergy.RuneStoneEnergy.Name\n#. /Game/SO/Items/RuneStones/RuneStoneEnergy.RuneStoneEnergy.Name\n#: /Game/SO/Items/RuneStones/RuneStoneEnergy.RuneStoneEnergy.Name\nmsgctxt \"ItemData\"\nmsgid \"Energystone\"\nmsgstr \"能量石\"\n\n#. Key:\tRuneStoneFire0_desc\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneFire0.RuneStoneFire0.Description\n#. Key:\tRuneStoneFire0_level_desc_0\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneFire0.RuneStoneFire0.LevelBasedDescOverride(0).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneFire0.RuneStoneFire0.Description\n#: /Game/SO/Items/RuneStones/RuneStoneFire0.RuneStoneFire0.LevelBasedDescOverride(0).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons a powerful blast roasting anything in a straight line.\\nCauses <Blue>16</> damage.\"\nmsgstr \"召喚壹股強大的沖擊波，能把任何東西烤成壹條直線。\\n造成 <Blue>16</> 傷害。\"\n\n#. Key:\tRuneStoneFire0_level_desc_1\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneFire0.RuneStoneFire0.LevelBasedDescOverride(1).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneFire0.RuneStoneFire0.LevelBasedDescOverride(1).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons a powerful blast roasting anything in a straight line.\\nCauses <Blue>32</> damage.\"\nmsgstr \"召喚壹股強大的沖擊波，能把任何東西烤成壹條直線。\\n造成  <Blue>32</> 傷害。\"\n\n#. Key:\tRuneStoneFire0_level_desc_2\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneFire0.RuneStoneFire0.LevelBasedDescOverride(2).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneFire0.RuneStoneFire0.LevelBasedDescOverride(2).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons a powerful blast roasting anything in a straight line.\\nCauses <Blue>36</> damage. The spell has <Green>50%</> chance to <Purple>Instant Recharge.</>\"\nmsgstr \"召喚壹股強大的沖擊波，能把任何東西烤成壹條直線。\\n造成 <Blue>36</> 傷害。該法術有 <Green>50%</> 機率 <Purple>獲得迅速補給.</>\"\n\n#. Key:\tRuneStoneFire0_level_desc_3\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneFire0.RuneStoneFire0.LevelBasedDescOverride(3).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneFire0.RuneStoneFire0.LevelBasedDescOverride(3).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons a powerful blast roasting anything in a straight line.\\nCauses <Blue>52</> damage. The spell has <Green>50%</> chance to <Purple>Instant Recharge.</>\"\nmsgstr \"召喚壹股強大的沖擊波，能把任何東西烤成壹條直線。\\n造成 <Blue>52</> 傷害。該法術有 <Green>50%</> 機率 <Purple>獲得迅速補給.</>\"\n\n#. Key:\tRuneStoneFire0_level_up_desc_0\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneFire0.RuneStoneFire0.LevelUpBasedDescOverride(0).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneFire0.RuneStoneFire0.LevelUpBasedDescOverride(0).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons a powerful blast roasting anything in a straight line.\\nCauses <Blue>16</><YellowH>(→32)</> damage.\"\nmsgstr \"召喚壹股強大的沖擊波，能把任何東西烤成壹條直線。\\n造成 <Blue>16</><YellowH>(→32)</> 傷害。\"\n\n#. Key:\tRuneStoneFire0_level_up_desc_1\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneFire0.RuneStoneFire0.LevelUpBasedDescOverride(1).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneFire0.RuneStoneFire0.LevelUpBasedDescOverride(1).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons a powerful blast roasting anything in a straight line.\\nCauses <Blue>32</><YellowH>(→36)</> damage. <YellowH>The spell has </><GreenH>50%</> <YellowH>chance to </><PurpleH>Instant Recharge.</>\"\nmsgstr \"召喚壹股強大的沖擊波，能把任何東西烤成壹條直線。\\n造成 <Blue>32</><YellowH>(→36)</>  傷害。<YellowH>該法術有 </><GreenH>50%</> <YellowH> 機率 </><PurpleH>獲得迅速補給.</>\"\n\n#. Key:\tRuneStoneFire0_level_up_desc_2\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneFire0.RuneStoneFire0.LevelUpBasedDescOverride(2).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneFire0.RuneStoneFire0.LevelUpBasedDescOverride(2).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons a powerful blast roasting anything in a straight line.\\nCauses <Blue>36</><YellowH>(→52)</> damage. The spell has <Green>50%</> chance to <Purple>Instant Recharge.</>\"\nmsgstr \"召喚壹股強大的沖擊波，能把任何東西烤成壹條直線。\\n造成 <Blue>36</><YellowH>(→52)</> 傷害。該法術有 <Green>50%</> 機率 <Purple>獲得迅速補給.</>\"\n\n#. Key:\tRuneStoneFire0_name\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneFire0.RuneStoneFire0.Name\n#. /Game/SO/Items/RuneStones/RuneStoneFire0.RuneStoneFire0.Name\n#: /Game/SO/Items/RuneStones/RuneStoneFire0.RuneStoneFire0.Name\nmsgctxt \"ItemData\"\nmsgid \"Firestone\"\nmsgstr \"燧石\"\n\n#. Key:\tRuneStoneHeal_desc\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneHeal.RuneStoneHeal.Description\n#. /Game/SO/Items/RuneStones/RuneStoneHeal.RuneStoneHeal.Description\n#: /Game/SO/Items/RuneStones/RuneStoneHeal.RuneStoneHeal.Description\nmsgctxt \"ItemData\"\nmsgid \"Restores <Green>30</> health points.\"\nmsgstr \"恢復 <Green>30</> 生命值。\"\n\n#. Key:\tRuneStoneHeal_name\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneHeal.RuneStoneHeal.Name\n#: /Game/SO/Items/RuneStones/RuneStoneHeal.RuneStoneHeal.Name\nmsgctxt \"ItemData\"\nmsgid \"Healstone\"\nmsgstr \"治愈石\"\n\n#. Key:\tRuneStoneLightningWalk_desc\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneLightningWalk.RuneStoneLightningWalk.Description\n#. /Game/SO/Items/RuneStones/RuneStoneLightningWalk.RuneStoneLightningWalk.Description\n#: /Game/SO/Items/RuneStones/RuneStoneLightningWalk.RuneStoneLightningWalk.Description\nmsgctxt \"ItemData\"\nmsgid \"Grants the shocking ability to walk through your enemies for <Green>2</> sec. The shock causes <Blue>10</> damage.\"\nmsgstr \"賦予妳穿過敵人的驚人能力，持續 <Green>2</> 秒。可造成 <Blue>10</> 秒。\"\n\n#. Key:\tRuneStoneLightningWalk_level_desc_0\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneLightningWalk.RuneStoneLightningWalk.LevelBasedDescOverride(0).LevelBasedDescOverride\n#. /Game/SO/Items/RuneStones/RuneStoneLightningWalk.RuneStoneLightningWalk.LevelBasedDescOverride(0).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneLightningWalk.RuneStoneLightningWalk.LevelBasedDescOverride(0).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Grants the shocking ability to walk through your enemies for <Green>2</> sec. The shock causes <Blue>16</> damage.\"\nmsgstr \"賦予妳穿過敵人的驚人能力，持續 <Green>2</> 秒。可造成 <Blue>16</> 秒。\"\n\n#. Key:\tRuneStoneLightningWalk_level_desc_1\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneLightningWalk.RuneStoneLightningWalk.LevelBasedDescOverride(1).LevelBasedDescOverride\n#. /Game/SO/Items/RuneStones/RuneStoneLightningWalk.RuneStoneLightningWalk.LevelBasedDescOverride(1).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneLightningWalk.RuneStoneLightningWalk.LevelBasedDescOverride(1).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Grants the shocking ability to walk through your enemies for <Green>3</> sec. The shock causes <Blue>28</> damage.\"\nmsgstr \"賦予妳穿過敵人的驚人能力，持續 <Green>3</> 秒。可造成 <Blue>28</> 秒。\"\n\n#. Key:\tRuneStoneLightningWalk_level_desc_2\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneLightningWalk.RuneStoneLightningWalk.LevelBasedDescOverride(2).LevelBasedDescOverride\n#. /Game/SO/Items/RuneStones/RuneStoneLightningWalk.RuneStoneLightningWalk.LevelBasedDescOverride(2).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneLightningWalk.RuneStoneLightningWalk.LevelBasedDescOverride(2).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Grants the shocking ability to walk through your enemies for <Green>4</> sec. The shock causes <Blue>32</> damage and has a <Green>30%</> chance to <Yellow>stun</> the target.\"\nmsgstr \"賦予妳穿過敵人的驚人能力，持續 <Green>4</> 秒。可造成 <Blue>32</> 傷害並有 <Green>30%</> 機率對目標造成 <Yellow>暈眩</>。\"\n\n#. Key:\tRuneStoneLightningWalk_level_desc_3\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneLightningWalk.RuneStoneLightningWalk.LevelBasedDescOverride(3).LevelBasedDescOverride\n#. /Game/SO/Items/RuneStones/RuneStoneLightningWalk.RuneStoneLightningWalk.LevelBasedDescOverride(3).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneLightningWalk.RuneStoneLightningWalk.LevelBasedDescOverride(3).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Grants the shocking ability to walk through your enemies for <Green>4</> sec. The shock causes <Blue>32</> damage and has a <Green>40%</> chance to <Yellow>stun</> the target.\"\nmsgstr \"賦予妳穿過敵人的驚人能力，持續 <Green>4</> 秒。可造成 <Blue>32</> 傷害並有 <Green>40%</> 機率對目標造成 <Yellow>暈眩</>。\"\n\n#. Key:\tRuneStoneLightningWalk_level_up_desc_0\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneLightningWalk.RuneStoneLightningWalk.LevelUpBasedDescOverride(0).LevelUpBasedDescOverride\n#. /Game/SO/Items/RuneStones/RuneStoneLightningWalk.RuneStoneLightningWalk.LevelUpBasedDescOverride(0).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneLightningWalk.RuneStoneLightningWalk.LevelUpBasedDescOverride(0).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Grants the shocking ability to walk through your enemies for <Green>2</><YellowH>(→3)</> sec. The shock causes <Blue>16</> <YellowH>(→28)</>damage.\"\nmsgstr \"賦予妳穿過敵人的驚人能力，持續 <Green>2</><YellowH>(→3)</> 秒。可造成 <Blue>16</> <YellowH>(→28)</> 傷害。\"\n\n#. Key:\tRuneStoneLightningWalk_level_up_desc_1\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneLightningWalk.RuneStoneLightningWalk.LevelUpBasedDescOverride(1).LevelUpBasedDescOverride\n#. /Game/SO/Items/RuneStones/RuneStoneLightningWalk.RuneStoneLightningWalk.LevelUpBasedDescOverride(1).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneLightningWalk.RuneStoneLightningWalk.LevelUpBasedDescOverride(1).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Grants the shocking ability to walk through your enemies for <Green>3</><YellowH>(→4)</> sec. The shock causes <Blue>28</> <YellowH>(→36)</>damage <YellowH>and has a </><GreenH>30%</> <YellowH>chance to stun the target.</>\"\nmsgstr \"賦予妳穿過敵人的驚人能力，持續 <Green>3</><YellowH>(→4)</> 秒。可造成<Blue>28</> <YellowH>(→36)</> 傷害 <YellowH>並有</><GreenH>30%</> <YellowH>機率對目標造成暈眩，</>\"\n\n#. Key:\tRuneStoneLightningWalk_level_up_desc_2\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneLightningWalk.RuneStoneLightningWalk.LevelUpBasedDescOverride(2).LevelUpBasedDescOverride\n#. /Game/SO/Items/RuneStones/RuneStoneLightningWalk.RuneStoneLightningWalk.LevelUpBasedDescOverride(2).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneLightningWalk.RuneStoneLightningWalk.LevelUpBasedDescOverride(2).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Grants the shocking ability to walk through your enemies for <Green>4</> sec. The shock causes <Blue>32</> damage and has a <Green>30%</> <YellowH>(→40%)</> chance to <Yellow>stun</> the target.\"\nmsgstr \"賦予妳穿過敵人的驚人能力，持續<Green>4</> 秒。可造成 <Blue>32</> 傷害並擁有 <Green>30%</> <YellowH>(→40%)</> 機率對目標造成 <Yellow>暈眩</>。\"\n\n#. Key:\tRuneStoneLightningWalk_name\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneLightningWalk.RuneStoneLightningWalk.Name\n#. /Game/SO/Items/RuneStones/RuneStoneLightningWalk.RuneStoneLightningWalk.Name\n#: /Game/SO/Items/RuneStones/RuneStoneLightningWalk.RuneStoneLightningWalk.Name\nmsgctxt \"ItemData\"\nmsgid \"Lightningstone\"\nmsgstr \"閃電石\"\n\n#. Key:\tRuneStoneMagicMissle_desc\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMagicMissle.RuneStoneMagicMissle.Description\n#. /Game/SO/Items/RuneStones/RuneStoneMagicMissle.RuneStoneMagicMissle.Description\n#: /Game/SO/Items/RuneStones/RuneStoneMagicMissle.RuneStoneMagicMissle.Description\nmsgctxt \"ItemData\"\nmsgid \"Summons a homing projectile targeted at a close foe - prefers flying targets.\"\nmsgstr \"對壹個近距離的敵人- 特別是飛行的目標召喚壹個導炮彈。\"\n\n#. Key:\tRuneStoneMagicMissle_level_desc_0\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMagicMissle.RuneStoneMagicMissle.LevelBasedDescOverride(0).LevelBasedDescOverride\n#. /Game/SO/Items/RuneStones/RuneStoneMagicMissle.RuneStoneMagicMissle.LevelBasedDescOverride(0).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneMagicMissle.RuneStoneMagicMissle.LevelBasedDescOverride(0).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons <Green>1</> homing projectile targeted at a close foe - prefers flying targets. Causes <Blue>16</> damage on impact.\"\nmsgstr \"對壹個近距離的敵人- 特別是飛行的目標召喚 <Green>1</> 導炮彈。每個炮彈造成  <Blue>16</> 傷害並產生<Orange>減速</> 。\"\n\n#. Key:\tRuneStoneMagicMissle_level_desc_1\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMagicMissle.RuneStoneMagicMissle.LevelBasedDescOverride(1).LevelBasedDescOverride\n#. /Game/SO/Items/RuneStones/RuneStoneMagicMissle.RuneStoneMagicMissle.LevelBasedDescOverride(1).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneMagicMissle.RuneStoneMagicMissle.LevelBasedDescOverride(1).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons <Green>2</> homing projectile targeted at a close foe - prefers flying targets. Each projectile causes <Blue>16</> damage on impact.\"\nmsgstr \"對壹個近距離的敵人- 特別是飛行的目標召喚 <Green>2</> 導炮彈。每個炮彈造成  <Blue>16</> 傷害並產生<Orange>減速</> 。\"\n\n#. Key:\tRuneStoneMagicMissle_level_desc_2\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMagicMissle.RuneStoneMagicMissle.LevelBasedDescOverride(2).LevelBasedDescOverride\n#. /Game/SO/Items/RuneStones/RuneStoneMagicMissle.RuneStoneMagicMissle.LevelBasedDescOverride(2).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneMagicMissle.RuneStoneMagicMissle.LevelBasedDescOverride(2).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons <Green>3</> homing projectile targeted at a close foe - prefers flying targets. Each projectile causes <Blue>16</> damage and applies <Orange>Slow</> on impact.\"\nmsgstr \"對壹個近距離的敵人- 特別是飛行的目標召喚 <Green>3</> 導炮彈。每個炮彈造成  <Blue>16</> 傷害並產生<Orange>減速</> 。\"\n\n#. Key:\tRuneStoneMagicMissle_level_desc_3\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMagicMissle.RuneStoneMagicMissle.LevelBasedDescOverride(3).LevelBasedDescOverride\n#. /Game/SO/Items/RuneStones/RuneStoneMagicMissle.RuneStoneMagicMissle.LevelBasedDescOverride(3).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneMagicMissle.RuneStoneMagicMissle.LevelBasedDescOverride(3).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons <Green>4</> homing projectile targeted at a close foe - prefers flying targets. Each projectile causes <Blue>16</> damage and applies <Orange>Slow</> on impact.\"\nmsgstr \"對壹個近距離的敵人- 特別是飛行的目標召喚 <Green>4</> 導炮彈。每個炮彈造成  <Blue>16</> 傷害並產生<Orange>減速</> 。\"\n\n#. Key:\tRuneStoneMagicMissle_level_up_desc_0\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMagicMissle.RuneStoneMagicMissle.LevelUpBasedDescOverride(0).LevelUpBasedDescOverride\n#. /Game/SO/Items/RuneStones/RuneStoneMagicMissle.RuneStoneMagicMissle.LevelUpBasedDescOverride(0).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneMagicMissle.RuneStoneMagicMissle.LevelUpBasedDescOverride(0).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons <Green>1</><YellowH>(→2)</> homing projectile targeted at a close foe - prefers flying targets. Each projectile causes <Blue>16</> damage on impact.\"\nmsgstr \"對壹個近距離的敵人- 特別是飛行的目標召喚 <Green>1</><YellowH>(→2)</> 導炮彈。每個炮彈造成  <Blue>16</> 傷害。\"\n\n#. Key:\tRuneStoneMagicMissle_level_up_desc_1\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMagicMissle.RuneStoneMagicMissle.LevelUpBasedDescOverride(1).LevelUpBasedDescOverride\n#. /Game/SO/Items/RuneStones/RuneStoneMagicMissle.RuneStoneMagicMissle.LevelUpBasedDescOverride(1).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneMagicMissle.RuneStoneMagicMissle.LevelUpBasedDescOverride(1).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons <Green>2</><YellowH>(→3)</> homing projectile targeted at a close foe - prefers flying targets. Each projectile causes <Blue>16</> damage <YellowH>and applies</> <OrangeH>Slow</> on impact.\"\nmsgstr \"對壹個近距離的敵人- 特別是飛行的目標召喚 <Green>2</><YellowH>(→3)</> 個導炮彈。每個炮彈造成 <Blue>16</> 傷害 <YellowH>並產生 <OrangeH>減速</> 效果。\"\n\n#. Key:\tRuneStoneMagicMissle_level_up_desc_2\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMagicMissle.RuneStoneMagicMissle.LevelUpBasedDescOverride(2).LevelUpBasedDescOverride\n#. /Game/SO/Items/RuneStones/RuneStoneMagicMissle.RuneStoneMagicMissle.LevelUpBasedDescOverride(2).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneMagicMissle.RuneStoneMagicMissle.LevelUpBasedDescOverride(2).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons <Green>3</><YellowH>(→4)</> homing projectile targeted at a close foe - prefers flying targets. Each projectile causes <Blue>16</> damage and applies <Orange>Slow</> on impact.\"\nmsgstr \"對壹個近距離的敵人- 特別是飛行的目標召喚 <Green>3</><YellowH>(→4)</> 個導炮彈。每個炮彈造成 <Blue>16</> 傷害並產生 <Orange>減速</> 效果。\"\n\n#. Key:\tRuneStoneMagicMissle_name\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMagicMissle.RuneStoneMagicMissle.Name\n#. /Game/SO/Items/RuneStones/RuneStoneMagicMissle.RuneStoneMagicMissle.Name\n#: /Game/SO/Items/RuneStones/RuneStoneMagicMissle.RuneStoneMagicMissle.Name\nmsgctxt \"ItemData\"\nmsgid \"Tealstone\"\nmsgstr \"青色石\"\n\n#. Key:\tRuneStoneMassMagicMissle_desc\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMassMagicMissle.RuneStoneMassMagicMissle.Description\n#. Key:\tRuneStoneMassMagicMissle_level_desc_0\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMassMagicMissle.RuneStoneMassMagicMissle.LevelBasedDescOverride(0).LevelBasedDescOverride\n#. /Game/SO/Items/RuneStones/RuneStoneMassMagicMissle.RuneStoneMassMagicMissle.Description\n#. /Game/SO/Items/RuneStones/RuneStoneMassMagicMissle.RuneStoneMassMagicMissle.LevelBasedDescOverride(0).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneMassMagicMissle.RuneStoneMassMagicMissle.Description\n#: /Game/SO/Items/RuneStones/RuneStoneMassMagicMissle.RuneStoneMassMagicMissle.LevelBasedDescOverride(0).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons a homing projectile for each nearby enemy, causing <Blue>20</> damage on impact.\"\nmsgstr \"給周圍每個敵人都召喚壹個導炮彈, 造成 <Blue>20</> 傷害。\"\n\n#. Key:\tRuneStoneMassMagicMissle_level_desc_1\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMassMagicMissle.RuneStoneMassMagicMissle.LevelBasedDescOverride(1).LevelBasedDescOverride\n#. /Game/SO/Items/RuneStones/RuneStoneMassMagicMissle.RuneStoneMassMagicMissle.LevelBasedDescOverride(1).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneMassMagicMissle.RuneStoneMassMagicMissle.LevelBasedDescOverride(1).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons a homing projectile for each nearby enemy, causing <Blue>40</> damage on impact.\"\nmsgstr \"給周圍每個敵人都召喚壹個導炮彈, 造成 <Blue>40</> 傷害。\"\n\n#. Key:\tRuneStoneMassMagicMissle_level_desc_2\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMassMagicMissle.RuneStoneMassMagicMissle.LevelBasedDescOverride(2).LevelBasedDescOverride\n#. /Game/SO/Items/RuneStones/RuneStoneMassMagicMissle.RuneStoneMassMagicMissle.LevelBasedDescOverride(2).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneMassMagicMissle.RuneStoneMassMagicMissle.LevelBasedDescOverride(2).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons a homing projectile for each nearby enemy, causing <Blue>50</> damage on impact. The target has a <Green>30%</> chance to become <Orange>Slow</>.\"\nmsgstr \"給周圍每個敵人都召喚壹個導炮彈, 造成 <Blue>50</> 傷害。 目標有 <Green>30%</> <Orange>機率</> <Orange>減速</>。\"\n\n#. Key:\tRuneStoneMassMagicMissle_level_up_desc_0\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMassMagicMissle.RuneStoneMassMagicMissle.LevelUpBasedDescOverride(0).LevelUpBasedDescOverride\n#. /Game/SO/Items/RuneStones/RuneStoneMassMagicMissle.RuneStoneMassMagicMissle.LevelUpBasedDescOverride(0).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneMassMagicMissle.RuneStoneMassMagicMissle.LevelUpBasedDescOverride(0).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons a homing projectile for each nearby enemy, causing <Blue>20</><YellowH>(→40)</> damage on impact.\"\nmsgstr \"給周圍每個敵人都召喚壹個導炮彈, 造成 <Blue>20</><YellowH>(→40)</> 傷害。\"\n\n#. Key:\tRuneStoneMassMagicMissle_level_up_desc_1\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMassMagicMissle.RuneStoneMassMagicMissle.LevelUpBasedDescOverride(1).LevelUpBasedDescOverride\n#. /Game/SO/Items/RuneStones/RuneStoneMassMagicMissle.RuneStoneMassMagicMissle.LevelUpBasedDescOverride(1).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneMassMagicMissle.RuneStoneMassMagicMissle.LevelUpBasedDescOverride(1).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons a homing projectile for each nearby enemy, causing <Blue>20</><YellowH>(→50)</> damage on impact. <YellowH>The target has a</> <GreenH>30%</> <YellowH>chance to become</> <Orange>Slow</>.\"\nmsgstr \"給周圍每個敵人都召喚壹個導炮彈, 造成 <Blue>20</><YellowH>(→50)</> 傷害。 <YellowH>目標有</> <GreenH>30%</> <YellowH>機率</> <Orange>減速</>。\"\n\n#. Key:\tRuneStoneMassMagicMissle_name\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMassMagicMissle.RuneStoneMassMagicMissle.Name\n#. /Game/SO/Items/RuneStones/RuneStoneMassMagicMissle.RuneStoneMassMagicMissle.Name\n#: /Game/SO/Items/RuneStones/RuneStoneMassMagicMissle.RuneStoneMassMagicMissle.Name\nmsgctxt \"ItemData\"\nmsgid \"Tealstone, but better\"\nmsgstr \"青色石，更好\"\n\n#. Key:\tRuneStoneMassSlow_desc\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMassSlow.RuneStoneMassSlow.Description\n#. /Game/SO/Items/RuneStones/RuneStoneMassSlow.RuneStoneMassSlow.Description\n#: /Game/SO/Items/RuneStones/RuneStoneMassSlow.RuneStoneMassSlow.Description\nmsgctxt \"ItemData\"\nmsgid \"Slows all enemy targets around the caster.\"\nmsgstr \"降低施法者周圍的所有敵人目標的速度。\"\n\n#. Key:\tRuneStoneMassSlow_level_desc_0\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMassSlow.RuneStoneMassSlow.LevelBasedDescOverride(0).LevelBasedDescOverride\n#. /Game/SO/Items/RuneStones/RuneStoneMassSlow.RuneStoneMassSlow.LevelBasedDescOverride(0).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneMassSlow.RuneStoneMassSlow.LevelBasedDescOverride(0).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"All enemy target becomes <Orange>Slow</> for <Green>3</> seconds.\"\nmsgstr \"所有敵人目標<Orange>減速</> 持續 <Green>3</> 秒。\"\n\n#. Key:\tRuneStoneMassSlow_name\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMassSlow.RuneStoneMassSlow.Name\n#. /Game/SO/Items/RuneStones/RuneStoneMassSlow.RuneStoneMassSlow.Name\n#: /Game/SO/Items/RuneStones/RuneStoneMassSlow.RuneStoneMassSlow.Name\nmsgctxt \"ItemData\"\nmsgid \"Slowstone\"\nmsgstr \"減速石\"\n\n#. Key:\tRuneStoneMeteorShower_desc\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMeteorShower.RuneStoneMeteorShower.Description\n#. /Game/SO/Items/RuneStones/RuneStoneMeteorShower.RuneStoneMeteorShower.Description\n#: /Game/SO/Items/RuneStones/RuneStoneMeteorShower.RuneStoneMeteorShower.Description\nmsgctxt \"ItemData\"\nmsgid \"Summons 12 deadly meteors around the caster, each causing 16 damage on impact.\"\nmsgstr \"在施法者周圍召喚12顆致命流星，每顆造成16點傷害。\"\n\n#. Key:\tRuneStoneMeteorShower_level_desc_0\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMeteorShower.RuneStoneMeteorShower.LevelBasedDescOverride(0).LevelBasedDescOverride\n#. /Game/SO/Items/RuneStones/RuneStoneMeteorShower.RuneStoneMeteorShower.LevelBasedDescOverride(0).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneMeteorShower.RuneStoneMeteorShower.LevelBasedDescOverride(0).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons <Green>12</> deadly meteors around the caster, each causing <White>16</> damage on impact.\"\nmsgstr \"在施法者周圍召喚 <Green>12</> 顆致命流星, 每壹個可造成 <White>16</> 傷害。\"\n\n#. Key:\tRuneStoneMeteorShower_level_desc_1\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMeteorShower.RuneStoneMeteorShower.LevelBasedDescOverride(1).LevelBasedDescOverride\n#. /Game/SO/Items/RuneStones/RuneStoneMeteorShower.RuneStoneMeteorShower.LevelBasedDescOverride(1).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneMeteorShower.RuneStoneMeteorShower.LevelBasedDescOverride(1).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons <Green>16</> deadly meteors around the caster, each causing <White>24</> damage on impact.\"\nmsgstr \"在施法者周圍召喚 <Green>16</> 顆致命流星, 每壹個可造成 <White>24</> 傷害。\"\n\n#. Key:\tRuneStoneMeteorShower_level_desc_2\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMeteorShower.RuneStoneMeteorShower.LevelBasedDescOverride(2).LevelBasedDescOverride\n#. /Game/SO/Items/RuneStones/RuneStoneMeteorShower.RuneStoneMeteorShower.LevelBasedDescOverride(2).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneMeteorShower.RuneStoneMeteorShower.LevelBasedDescOverride(2).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons <Green>20</> deadly meteors around the caster, each causing <White>32</> damage on impact. Each meteor has a <Green>30%</> chance to <Yellow>Stun</> the target.\"\nmsgstr \"在施法者周圍召喚<Green>20</><YellowH>(→16)</> 顆致命流星, 每壹個可造成<White>32</> 傷害。 <YellowH>每顆流星有</> <GreenH>30%</> <YellowH>機率使目標 <Yellow>眩暈</>。\"\n\n#. Key:\tRuneStoneMeteorShower_level_up_desc_0\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMeteorShower.RuneStoneMeteorShower.LevelUpBasedDescOverride(0).LevelUpBasedDescOverride\n#. /Game/SO/Items/RuneStones/RuneStoneMeteorShower.RuneStoneMeteorShower.LevelUpBasedDescOverride(0).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneMeteorShower.RuneStoneMeteorShower.LevelUpBasedDescOverride(0).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons <Green>12</><YellowH>(→16)</> deadly meteors around the caster, each causing <White>16</><YellowH>(→24)</> damage on impact.\"\nmsgstr \"在施法者周圍召喚<Green>12</><YellowH>(→16)</> 顆致命流星, 每壹個可造成 <White>16</><YellowH>(→24)</> 傷害。\"\n\n#. Key:\tRuneStoneMeteorShower_level_up_desc_1\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMeteorShower.RuneStoneMeteorShower.LevelUpBasedDescOverride(1).LevelUpBasedDescOverride\n#. /Game/SO/Items/RuneStones/RuneStoneMeteorShower.RuneStoneMeteorShower.LevelUpBasedDescOverride(1).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneMeteorShower.RuneStoneMeteorShower.LevelUpBasedDescOverride(1).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Summons <Green>16</><YellowH>(→20)</> deadly meteors around the caster, each causing <White>24</><YellowH>(→32)</> damage on impact. <YellowH>Each meteor has a</> <GreenH>30%</> <YellowH>chance to Stun the target.</>\"\nmsgstr \"在施法者周圍召喚<Green>16</><YellowH>(→20)</> 顆致命流星, 每壹個可造成 <White>24</><YellowH>(→32)</> 傷害。 <YellowH>每顆流星有</> <GreenH>30%</> 機率使目標 <YellowH>暈眩。</>\"\n\n#. Key:\tRuneStoneMeteorShower_name\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneMeteorShower.RuneStoneMeteorShower.Name\n#. /Game/SO/Items/RuneStones/RuneStoneMeteorShower.RuneStoneMeteorShower.Name\n#: /Game/SO/Items/RuneStones/RuneStoneMeteorShower.RuneStoneMeteorShower.Name\nmsgctxt \"ItemData\"\nmsgid \"Meteorstone\"\nmsgstr \"流星石\"\n\n#. Key:\tRuneStoneShadowWalk_desc\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneShadowWalk.RuneStoneShadowWalk.Description\n#. Key:\tRuneStoneShadowWalk_level_desc_0\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneShadowWalk.RuneStoneShadowWalk.LevelBasedDescOverride(0).LevelBasedDescOverride\n#. /Game/SO/Items/RuneStones/RuneStoneShadowWalk.RuneStoneShadowWalk.Description\n#. /Game/SO/Items/RuneStones/RuneStoneShadowWalk.RuneStoneShadowWalk.LevelBasedDescOverride(0).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneShadowWalk.RuneStoneShadowWalk.Description\n#: /Game/SO/Items/RuneStones/RuneStoneShadowWalk.RuneStoneShadowWalk.LevelBasedDescOverride(0).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Grants the ability to walk through your enemies for <Green>2</> seconds.\"\nmsgstr \"賦予穿越敵人的能力，持續時間<Green>2</>秒。\"\n\n#. Key:\tRuneStoneShadowWalk_level_desc_1\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneShadowWalk.RuneStoneShadowWalk.LevelBasedDescOverride(1).LevelBasedDescOverride\n#. /Game/SO/Items/RuneStones/RuneStoneShadowWalk.RuneStoneShadowWalk.LevelBasedDescOverride(1).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneShadowWalk.RuneStoneShadowWalk.LevelBasedDescOverride(1).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Grants the ability to walk through your enemies for <Green>4</> seconds.\"\nmsgstr \"賦予穿越敵人的能力，持續時間<Green>4</>秒。\"\n\n#. Key:\tRuneStoneShadowWalk_level_desc_2\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneShadowWalk.RuneStoneShadowWalk.LevelBasedDescOverride(2).LevelBasedDescOverride\n#. /Game/SO/Items/RuneStones/RuneStoneShadowWalk.RuneStoneShadowWalk.LevelBasedDescOverride(2).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneShadowWalk.RuneStoneShadowWalk.LevelBasedDescOverride(2).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Grants the ability to walk through your enemies for <Green>4</> seconds. Your magical resistance is increased by <Green>0.2.</>\"\nmsgstr \"賦予穿越敵人的能力，持續時間<Green>4</>秒。妳的魔法抗性增加</> <GreenH>0.2.</>\"\n\n#. Key:\tRuneStoneShadowWalk_level_desc_3\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneShadowWalk.RuneStoneShadowWalk.LevelBasedDescOverride(3).LevelBasedDescOverride\n#. /Game/SO/Items/RuneStones/RuneStoneShadowWalk.RuneStoneShadowWalk.LevelBasedDescOverride(3).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneShadowWalk.RuneStoneShadowWalk.LevelBasedDescOverride(3).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Grants the ability to walk through your enemies for <Green>5</> seconds. Your magical resistance is increased by <Green>0.3.</>\"\nmsgstr \"賦予穿越敵人的能力，持續時間 <Green>5</> 秒。妳的魔法抗性增加<Green>0.3.</>\"\n\n#. Key:\tRuneStoneShadowWalk_level_up_desc_0\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneShadowWalk.RuneStoneShadowWalk.LevelUpBasedDescOverride(0).LevelUpBasedDescOverride\n#. /Game/SO/Items/RuneStones/RuneStoneShadowWalk.RuneStoneShadowWalk.LevelUpBasedDescOverride(0).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneShadowWalk.RuneStoneShadowWalk.LevelUpBasedDescOverride(0).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Grants the ability to walk through your enemies for <Green>2</> <YellowH>(→4)</> seconds.\"\nmsgstr \"賦予穿越敵人的能力，持續時間<Green>2</> <YellowH>(→4)</>秒。\"\n\n#. Key:\tRuneStoneShadowWalk_level_up_desc_1\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneShadowWalk.RuneStoneShadowWalk.LevelUpBasedDescOverride(1).LevelUpBasedDescOverride\n#. /Game/SO/Items/RuneStones/RuneStoneShadowWalk.RuneStoneShadowWalk.LevelUpBasedDescOverride(1).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneShadowWalk.RuneStoneShadowWalk.LevelUpBasedDescOverride(1).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Grants the ability to walk through your enemies for <Green>4</> seconds. <YellowH>Your magical resistance is increased by</> <GreenH>0.2.</>\"\nmsgstr \"賦予穿越敵人的能力，持續時間<Green>4</>秒。<YellowH>妳的魔法抗性增加</> <GreenH>0.2.</>\"\n\n#. Key:\tRuneStoneShadowWalk_level_up_desc_2\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneShadowWalk.RuneStoneShadowWalk.LevelUpBasedDescOverride(2).LevelUpBasedDescOverride\n#. /Game/SO/Items/RuneStones/RuneStoneShadowWalk.RuneStoneShadowWalk.LevelUpBasedDescOverride(2).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneShadowWalk.RuneStoneShadowWalk.LevelUpBasedDescOverride(2).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Grants the ability to walk through your enemies for <Green>4</> <YellowH>(→5)</> seconds. Your magical resistance is increased by <Green>0.2</> <YellowH>(→0.3).</>\"\nmsgstr \"賦予穿越敵人的能力，持續時間 <Green>4</> <YellowH>(→5)</>秒。妳的魔法抗性增加<Green>0.2</> <YellowH>(→0.3).</>\"\n\n#. Key:\tRuneStoneShadowWalk_name\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneShadowWalk.RuneStoneShadowWalk.Name\n#. /Game/SO/Items/RuneStones/RuneStoneShadowWalk.RuneStoneShadowWalk.Name\n#: /Game/SO/Items/RuneStones/RuneStoneShadowWalk.RuneStoneShadowWalk.Name\nmsgctxt \"ItemData\"\nmsgid \"Shadestone\"\nmsgstr \"暗影石\"\n\n#. Key:\tRuneStoneSoulkeeper_desc\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneSoulkeeper.RuneStoneSoulkeeper.Description\n#. /Game/SO/Items/RuneStones/RuneStoneSoulkeeper.RuneStoneSoulkeeper.Description\n#: /Game/SO/Items/RuneStones/RuneStoneSoulkeeper.RuneStoneSoulkeeper.Description\nmsgctxt \"ItemData\"\nmsgid \"Summons the Soulkeeper, a powerful spirit capable of gathering your essence should something bad happen to you.\\r\\n\\r\\nReleasing the spirit recharges the stone.\"\nmsgstr \"召喚靈魂看守者，一個強大的靈魂，能夠收集你的精華，如果有什麼不好的事情發生在你身上。\\r\\n釋放靈魂會給石頭充電。 ”\"\n\n#. Key:\tRuneStoneSoulkeeper_name\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneSoulkeeper.RuneStoneSoulkeeper.Name\n#. /Game/SO/Items/RuneStones/RuneStoneSoulkeeper.RuneStoneSoulkeeper.Name\n#: /Game/SO/Items/RuneStones/RuneStoneSoulkeeper.RuneStoneSoulkeeper.Name\nmsgctxt \"ItemData\"\nmsgid \"Soulstone\"\nmsgstr \"靈魂石\"\n\n#. Key:\tRuneStoneSoulkeeperInfinite_desc\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneSoulkeeperInfinite.RuneStoneSoulkeeperInfinite.Description\n#. /Game/SO/Items/RuneStones/RuneStoneSoulkeeperInfinite.RuneStoneSoulkeeperInfinite.Description\n#: /Game/SO/Items/RuneStones/RuneStoneSoulkeeperInfinite.RuneStoneSoulkeeperInfinite.Description\nmsgctxt \"ItemData\"\nmsgid \"Summons the Soulkeeper, a powerful spirit capable of gathering your essence should something bad happen to you.\"\nmsgstr \"召喚靈魂守護者，壹個強大的靈魂能夠收集妳的精華，如果有什麽不好的事情發生在妳身上。\"\n\n#. Key:\tRuneStoneSoulkeeperInfinite_name\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneSoulkeeperInfinite.RuneStoneSoulkeeperInfinite.Name\n#. /Game/SO/Items/RuneStones/RuneStoneSoulkeeperInfinite.RuneStoneSoulkeeperInfinite.Name\n#: /Game/SO/Items/RuneStones/RuneStoneSoulkeeperInfinite.RuneStoneSoulkeeperInfinite.Name\nmsgctxt \"ItemData\"\nmsgid \"Elite Soulstone\"\nmsgstr \"精英靈魂石\"\n\n#. Key:\tRuneStoneSpellRegain_desc\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneSpellRegain.RuneStoneSpellRegain.Description\n#. /Game/SO/Items/RuneStones/RuneStoneSpellRegain.RuneStoneSpellRegain.Description\n#: /Game/SO/Items/RuneStones/RuneStoneSpellRegain.RuneStoneSpellRegain.Description\nmsgctxt \"ItemData\"\nmsgid \"Regenerates all other spell charges.\"\nmsgstr \"重新生成所有其他法術充能。\"\n\n#. Key:\tRuneStoneSpellRegain_name\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneSpellRegain.RuneStoneSpellRegain.Name\n#. /Game/SO/Items/RuneStones/RuneStoneSpellRegain.RuneStoneSpellRegain.Name\n#: /Game/SO/Items/RuneStones/RuneStoneSpellRegain.RuneStoneSpellRegain.Name\nmsgctxt \"ItemData\"\nmsgid \"Spiritstone\"\nmsgstr \"精神石\"\n\n#. Key:\tRuneStoneSwap_desc\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.Description\n#. Key:\tRuneStoneSwap_level_desc_0\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.LevelBasedDescOverride(0).LevelBasedDescOverride\n#. /Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.Description\n#. /Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.LevelBasedDescOverride(0).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.Description\n#: /Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.LevelBasedDescOverride(0).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Swaps the position of the caster with the closest target in front of him/her/it.\"\nmsgstr \"將施法者的位置與他/她/它前面最近的目標互換。\"\n\n#. Key:\tRuneStoneSwap_level_desc_1\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.LevelBasedDescOverride(1).LevelBasedDescOverride\n#. /Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.LevelBasedDescOverride(1).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.LevelBasedDescOverride(1).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Swaps the position of the caster with the closest target in front of him/her/it. The selected target suffers <Blue>20</> damage.\"\nmsgstr \"將施法者的位置與他/她/它前面最近的目標互換。所選目標將受到 <Blue>20</> 傷害並 <Orange>減速</>。\"\n\n#. Key:\tRuneStoneSwap_level_desc_2\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.LevelBasedDescOverride(2).LevelBasedDescOverride\n#. /Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.LevelBasedDescOverride(2).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.LevelBasedDescOverride(2).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Swaps the position of the caster with the closest target in front of him/her/it. The selected target suffers <Blue>30</> damage and becomes <Orange>Slow</>.\"\nmsgstr \"將施法者的位置與他/她/它前面最近的目標互換。所選目標將受到 <Blue>30</> 傷害並 <Orange>減速</>。\"\n\n#. Key:\tRuneStoneSwap_level_desc_3\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.LevelBasedDescOverride(3).LevelBasedDescOverride\n#. /Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.LevelBasedDescOverride(3).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.LevelBasedDescOverride(3).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Swaps the position of the caster with the closest target in front of him/her/it. The selected target suffers <Blue>40</> damage and becomes <Orange>Slow</>.\"\nmsgstr \"將施法者的位置與他/她/它前面最近的目標互換。所選目標將受到 <Blue>40</> 傷害並 <Orange>減速</>。\"\n\n#. Key:\tRuneStoneSwap_level_desc_4\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.LevelBasedDescOverride(4).LevelBasedDescOverride\n#. /Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.LevelBasedDescOverride(4).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.LevelBasedDescOverride(4).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Swaps the position of the caster with the closest target in front of him/her/it. The selected target suffers <Blue>50</> damage and becomes <Orange>Slow</>.\"\nmsgstr \"將施法者的位置與他/她/它前面最近的目標互換。所選目標將受到 <Blue>50</> 傷害並 <Orange>減速</>。\"\n\n#. Key:\tRuneStoneSwap_level_up_desc_0\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.LevelUpBasedDescOverride(0).LevelUpBasedDescOverride\n#. /Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.LevelUpBasedDescOverride(0).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.LevelUpBasedDescOverride(0).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Swaps the position of the caster with the closest target in front of him/her/it. <YellowH>The selected target suffers</> <BlueH>20</> <YellowH>damage.</>\"\nmsgstr \"將施法者的位置與他/她/它前面最近的目標互換。<YellowH>所選目標將受到</> <BlueH>20</> <YellowH>傷害。</>\"\n\n#. Key:\tRuneStoneSwap_level_up_desc_1\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.LevelUpBasedDescOverride(1).LevelUpBasedDescOverride\n#. /Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.LevelUpBasedDescOverride(1).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.LevelUpBasedDescOverride(1).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Swaps the position of the caster with the closest target in front of him/her/it. The selected target suffers <Blue>20</><YellowH>(→30)</> damage <YellowH>and becomes </><Orange>Slow.</>\"\nmsgstr \"將施法者的位置與他/她/它前面最近的目標互換。所選目標將受到<Blue>20</><YellowH>(→30)</> 傷害並<Orange>減速。</>\"\n\n#. Key:\tRuneStoneSwap_level_up_desc_2\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.LevelUpBasedDescOverride(2).LevelUpBasedDescOverride\n#. /Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.LevelUpBasedDescOverride(2).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.LevelUpBasedDescOverride(2).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Swaps the position of the caster with the closest target in front of him/her/it. The selected target suffers <Blue>30</><YellowH>(→40)</> damage and becomes <Orange>Slow.</>\"\nmsgstr \"將施法者的位置與他/她/它前面最近的目標互換。所選目標將受到<Blue>30</><YellowH>(→40)</> 傷害並<Orange>減速。</>\"\n\n#. Key:\tRuneStoneSwap_level_up_desc_3\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.LevelUpBasedDescOverride(3).LevelUpBasedDescOverride\n#. /Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.LevelUpBasedDescOverride(3).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.LevelUpBasedDescOverride(3).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Swaps the position of the caster with the closest target in front of him/her/it. The selected target suffers <Blue>40</><YellowH>(→50)</> damage and becomes <Orange>Slow.</>\"\nmsgstr \"將施法者的位置與他/她/它前面最近的目標互換。所選目標將受到<Blue>40</><YellowH>(→50)</> 傷害並 <Orange>減速。</>\"\n\n#. Key:\tRuneStoneSwap_name\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.Name\n#: /Game/SO/Items/RuneStones/RuneStoneSwap.RuneStoneSwap.Name\nmsgctxt \"ItemData\"\nmsgid \"Swapstone\"\nmsgstr \"交換石\"\n\n#. Key:\tRuneStoneWeaponFlame_desc\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.Description\n#. /Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.Description\n#: /Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.Description\nmsgctxt \"ItemData\"\nmsgid \"Enchants your active weapon with green flames - it causes an additional 0.3x damage for 4 seconds.\"\nmsgstr \"用綠色火焰附魔妳的激活武器 - 造成額外的 0.3x 傷害並持續 4 秒。\"\n\n#. Key:\tRuneStoneWeaponFlame_level_desc_0\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.LevelBasedDescOverride(0).LevelBasedDescOverride\n#. /Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.LevelBasedDescOverride(0).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.LevelBasedDescOverride(0).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Enchants your active weapon - it causes an additional <Green>0.5x</> damage for <Green>5</> seconds.\"\nmsgstr \"附魔妳的激活武器 -  它會造成額外的 <Green>0.5x</> 傷害並持續 <Green>5</> 秒。\"\n\n#. Key:\tRuneStoneWeaponFlame_level_desc_1\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.LevelBasedDescOverride(1).LevelBasedDescOverride\n#. /Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.LevelBasedDescOverride(1).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.LevelBasedDescOverride(1).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Enchants your active weapon - it causes an additional <Green>0.6x</> damage for <Green>5</> seconds. Each strike has a <Green>15%</> chance to apply <DarkGreen>Poison</>, causing an additional <Blue>18</> damage over <Green>6</> seconds.\"\nmsgstr \"附魔妳的激活武器 -  它會造成額外的 <Green>0.6x</> 傷害並持續 <Green>5</> 秒。 每次攻擊有 <Green>15%</> 機率使用 <DarkGreen>毒藥</>, 造成額外的 <Blue>18</> 傷害並持續 <Green>6</> 秒。\"\n\n#. Key:\tRuneStoneWeaponFlame_level_desc_2\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.LevelBasedDescOverride(2).LevelBasedDescOverride\n#. /Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.LevelBasedDescOverride(2).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.LevelBasedDescOverride(2).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Enchants your active weapon - it causes an additional <Green>0.7x</> damage for <Green>6</> seconds. Each strike has a <Green>20%</> chance to apply <DarkGreen>Poison</>, causing an additional <Blue>24</> damage over <Green>6</> seconds.\"\nmsgstr \"附魔妳的激活武器 -  它會造成額外的 <Green>0.7x</> 傷害並持續 <Green>6</> 秒。 每次攻擊有 <Green>20%</> 機率使用 <DarkGreen>毒藥</>, 造成額外的 <Blue>24</> 傷害並持續 <Green>6</> 秒。\"\n\n#. Key:\tRuneStoneWeaponFlame_level_desc_3\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.LevelBasedDescOverride(3).LevelBasedDescOverride\n#. /Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.LevelBasedDescOverride(3).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.LevelBasedDescOverride(3).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Enchants your active weapon - it causes an additional <Green>0.8x</> damage for <Green>6</> seconds. Each strike has a <Green>25%</> chance to apply <DarkGreen>Poison</>, causing an additional <Blue>30</> damage over <Green>6</> seconds.\"\nmsgstr \"附魔妳的激活武器 -  它會造成額外的 <Green>0.8x</> 傷害並持續 <Green>6</> 秒。 每次攻擊有 <Green>25%</> 機率使用 <DarkGreen>毒藥</>, 造成額外的 <Blue>30</> 傷害並持續 <Green>6</> 秒。\"\n\n#. Key:\tRuneStoneWeaponFlame_level_desc_4\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.LevelBasedDescOverride(4).LevelBasedDescOverride\n#. /Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.LevelBasedDescOverride(4).LevelBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.LevelBasedDescOverride(4).LevelBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Enchants your active weapon - it causes an additional <Green>0.9x</> damage for <Green>6</> seconds. Each strike has a <Green>30%</> chance to apply <DarkGreen>Poison</>, causing an additional <Blue>36</> damage over <Green>6</> seconds.\"\nmsgstr \"附魔妳的激活武器 -  它會造成額外的 <Green>0.9x</> 傷害並持續 <Green>6</> 秒。 每次攻擊有 <Green>30%</> 機率使用 <DarkGreen>毒藥</>, 造成額外的 <Blue>36</> 傷害並持續 <Green>6</> 秒。\"\n\n#. Key:\tRuneStoneWeaponFlame_level_up_desc_0\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.LevelUpBasedDescOverride(0).LevelUpBasedDescOverride\n#. /Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.LevelUpBasedDescOverride(0).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.LevelUpBasedDescOverride(0).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Enchants your active weapon - it causes an additional <Green>0.5x</><YellowH>(→0.6x)</> damage for <Green>5</> seconds. <YellowH>Each strike has a</> <GreenH>15%</> <YellowH>chance to apply </><DarkGreenH>Poison</><YellowH>, causing an additional</> <BlueH>18</> <YellowH>damage over</> <GreenH>6</> <YellowH>seconds.</>\"\nmsgstr \"附魔妳的激活武器 -  它會造成額外的 <Green>0.5x</><YellowH>(→0.6x)</> 傷害並持續<Green>5</> 秒。 <YellowH>每次攻擊有</> <GreenH>15%</> <YellowH> 機率使用 </><DarkGreenH>毒藥</><YellowH>, 造成額外的 </> <BlueH>18</> <YellowH>傷害並持續</> <GreenH>6</> <YellowH>秒。</>\"\n\n#. Key:\tRuneStoneWeaponFlame_level_up_desc_1\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.LevelUpBasedDescOverride(1).LevelUpBasedDescOverride\n#. /Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.LevelUpBasedDescOverride(1).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.LevelUpBasedDescOverride(1).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Enchants your active weapon - it causes an additional <Green>0.6x</><YellowH>(→0.7x)</> damage for <Green>5</><YellowH>(→6)</> seconds. Each strike has a <Green>15%</><YellowH>(→20%)</> chance to apply <DarkGreen>Poison</>, causing an additional <Blue>18</><YellowH>(→24)</> damage over <Green>6</> seconds.\"\nmsgstr \"附魔妳的激活武器 -  它會造成額外的 <Green>0.6x</><YellowH>(→0.7x)</> 傷害並持續 <Green>5</> 秒。 每次攻擊有 <Green>15%</><YellowH>(→20%)</> 機率使用 <DarkGreen>毒藥</>, 造成額外的 <Blue>18</><YellowH>(→24)</> 傷害並持續 <Green>6</> 秒。\"\n\n#. Key:\tRuneStoneWeaponFlame_level_up_desc_2\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.LevelUpBasedDescOverride(2).LevelUpBasedDescOverride\n#. /Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.LevelUpBasedDescOverride(2).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.LevelUpBasedDescOverride(2).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Enchants your active weapon - it causes an additional <Green>0.7x</><YellowH>(→0.8x)</> damage for <Green>6</> seconds. Each strike has a <Green>20%</><YellowH>(→25%)</> chance to apply <DarkGreen>Poison</>, causing an additional <Blue>24</><YellowH>(→30)</> damage over <Green>6</> seconds.\"\nmsgstr \"附魔妳的激活武器 -  它會造成額外的 <Green>0.7x</><YellowH>(→0.8x)</> 傷害並持續 <Green>6</> 秒。 每次攻擊有 <Green>20%</><YellowH>(→25%)</> 機率使用 <DarkGreen>毒藥</>, 造成額外的 <Blue>24</><YellowH>(→30)</> 傷害並持續 <Green>6</> 秒。\"\n\n#. Key:\tRuneStoneWeaponFlame_level_up_desc_3\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.LevelUpBasedDescOverride(3).LevelUpBasedDescOverride\n#. /Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.LevelUpBasedDescOverride(3).LevelUpBasedDescOverride\n#: /Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.LevelUpBasedDescOverride(3).LevelUpBasedDescOverride\nmsgctxt \"ItemData\"\nmsgid \"Enchants your active weapon - it causes an additional <Green>0.8x</><YellowH>(→0.9x)</> damage for <Green>6</> seconds. Each strike has a <Green>25%</><YellowH>(→30%)</> chance to apply <DarkGreen>Poison</>, causing an additional <Blue>30</><YellowH>(→36)</> damage over <Green>6</> seconds.\"\nmsgstr \"附魔妳的激活武器 -  它會造成額外的 <Green>0.8x</><YellowH>(→0.9x)</> 傷害並持續 <Green>6</> 秒。 每次攻擊有 <Green>25%</><YellowH>(→30%)</> 機率使用 <DarkGreen>毒藥</>, 造成額外的 <Blue>30</><YellowH>(→36)</> 傷害並持續 <Green>6</> 秒。\"\n\n#. Key:\tRuneStoneWeaponFlame_name\n#. SourceLocation:\t/Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.Name\n#. /Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.Name\n#: /Game/SO/Items/RuneStones/RuneStoneWeaponFlame.RuneStoneWeaponFlame.Name\nmsgctxt \"ItemData\"\nmsgid \"Green Flamestone\"\nmsgstr \"綠色火焰石\"\n\n#. Key:\tSabre_desc\n#. SourceLocation:\t/Game/SO/Items/Weapons/Sabre.Sabre.Description\n#: /Game/SO/Items/Weapons/Sabre.Sabre.Description\nmsgctxt \"ItemData\"\nmsgid \"Rangol was a legendary blacksmith who practiced his crafting art for a hundred years. This sabre was made on day one.\"\nmsgstr \"拉古爾是一個傳奇的鐵匠，他練習手工藝已經足足有100年。這把軍刀是他第一天製造的。\"\n\n#. Key:\tSabre_name\n#. SourceLocation:\t/Game/SO/Items/Weapons/Sabre.Sabre.Name\n#: /Game/SO/Items/Weapons/Sabre.Sabre.Name\nmsgctxt \"ItemData\"\nmsgid \"First Sabre of Rangol\"\nmsgstr \"拉古爾的首把軍刀\"\n\n#. Key:\tSecondChance_desc\n#. SourceLocation:\t/Game/SO/Items/RuneStones/SecondChance.SecondChance.Description\n#. /Game/SO/Items/RuneStones/SecondChance.SecondChance.Description\n#: /Game/SO/Items/RuneStones/SecondChance.SecondChance.Description\nmsgctxt \"ItemData\"\nmsgid \"Prevents death.\"\nmsgstr \"避免死亡。\"\n\n#. Key:\tSecondChance_name\n#. SourceLocation:\t/Game/SO/Items/RuneStones/SecondChance.SecondChance.Name\n#: /Game/SO/Items/RuneStones/SecondChance.SecondChance.Name\nmsgctxt \"ItemData\"\nmsgid \"Chancestone\"\nmsgstr \"機遇石\"\n\n#. Key:\tSecretWeirdDevice_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/SecretWeirdDevice.SecretWeirdDevice.Description\n#. /Game/SO/Items/QuestItems/SecretWeirdDevice.SecretWeirdDevice.Description\n#: /Game/SO/Items/QuestItems/SecretWeirdDevice.SecretWeirdDevice.Description\nmsgctxt \"ItemData\"\nmsgid \"A weird device, most likely one of the inventions of the Secret Science Society.\"\nmsgstr \"壹個奇怪的裝置，很可能是秘密科學協會的發明之壹。\"\n\n#. Key:\tSecretWeirdDevice_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/SecretWeirdDevice.SecretWeirdDevice.Name\n#. /Game/SO/Items/QuestItems/SecretWeirdDevice.SecretWeirdDevice.Name\n#: /Game/SO/Items/QuestItems/SecretWeirdDevice.SecretWeirdDevice.Name\nmsgctxt \"ItemData\"\nmsgid \"Weird Device\"\nmsgstr \"奇怪裝置\"\n\n#. Key:\tShardAmber_desc\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardAmber.ShardAmber.Description\n#: /Game/SO/Items/Shards/ShardAmber.ShardAmber.Description\nmsgctxt \"ItemData\"\nmsgid \"Each melee strike has an additional <Yellow>10%</> chance to cause a critical hit, causing <Green>200%</> of your normal weapon damage.\"\nmsgstr \"每壹次近戰攻擊都有額外的<Yellow>10%</>機率造成致命壹擊，使妳的普通武器造成<Green>200%</>傷害。\"\n\n#. Key:\tShardAmber_name\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardAmber.ShardAmber.Name\n#: /Game/SO/Items/Shards/ShardAmber.ShardAmber.Name\nmsgctxt \"ItemData\"\nmsgid \"Amber Shard\"\nmsgstr \"琥珀碎片\"\n\n#. Key:\tShardAmberBright_desc\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardAmberBright.ShardAmberBright.Description\n#. /Game/SO/Items/Shards/ShardAmberBright.ShardAmberBright.Description\n#: /Game/SO/Items/Shards/ShardAmberBright.ShardAmberBright.Description\nmsgctxt \"ItemData\"\nmsgid \"Each melee strike has an additional <Yellow>20%</> chance to cause a critical hit, causing <Green>200%</> of your normal weapon damage.\"\nmsgstr \"每壹次近戰攻擊都有額外的<Yellow>20%</>機率造成致命壹擊，使妳的普通武器造成<Green>200%</>傷害。\"\n\n#. Key:\tShardAmberBright_name\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardAmberBright.ShardAmberBright.Name\n#. /Game/SO/Items/Shards/ShardAmberBright.ShardAmberBright.Name\n#: /Game/SO/Items/Shards/ShardAmberBright.ShardAmberBright.Name\nmsgctxt \"ItemData\"\nmsgid \"Bright Amber Shard\"\nmsgstr \"明亮琥珀碎片\"\n\n#. Key:\tShardAqua_desc\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardAqua.ShardAqua.Description\n#: /Game/SO/Items/Shards/ShardAqua.ShardAqua.Description\nmsgctxt \"ItemData\"\nmsgid \"Cooldown recharge speed is increased by <Blue>20%</>.\"\nmsgstr \"冷卻充能速度提升<Blue>20%</>。\"\n\n#. Key:\tShardAqua_name\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardAqua.ShardAqua.Name\n#: /Game/SO/Items/Shards/ShardAqua.ShardAqua.Name\nmsgctxt \"ItemData\"\nmsgid \"Aqua Shard\"\nmsgstr \"淺綠碎片\"\n\n#. Key:\tShardAquaBright_desc\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardAquaBright.ShardAquaBright.Description\n#. /Game/SO/Items/Shards/ShardAquaBright.ShardAquaBright.Description\n#: /Game/SO/Items/Shards/ShardAquaBright.ShardAquaBright.Description\nmsgctxt \"ItemData\"\nmsgid \"Cooldown recharge speed is increased by <Blue>40%</>.\"\nmsgstr \"冷卻充能速度提升<Blue>40%</>。\"\n\n#. Key:\tShardAquaBright_name\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardAquaBright.ShardAquaBright.Name\n#: /Game/SO/Items/Shards/ShardAquaBright.ShardAquaBright.Name\nmsgctxt \"ItemData\"\nmsgid \"Bright Aqua Shard\"\nmsgstr \"明亮淺綠碎片\"\n\n#. Key:\tShardBlack_desc\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardBlack.ShardBlack.Description\n#: /Game/SO/Items/Shards/ShardBlack.ShardBlack.Description\nmsgctxt \"ItemData\"\nmsgid \"Every time an enemy hits you with a melee strike or overlaps you it is turned into a boot for a short time.\"\nmsgstr \"每當壹個敵人用近戰攻擊攻擊妳或與妳重疊時，它會在短時間內變成壹只靴子。\"\n\n#. Key:\tShardBlack_name\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardBlack.ShardBlack.Name\n#: /Game/SO/Items/Shards/ShardBlack.ShardBlack.Name\nmsgctxt \"ItemData\"\nmsgid \"Black Shard\"\nmsgstr \"黑色碎片\"\n\n#. Key:\tShardBlue_desc\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardBlue.ShardBlue.Description\n#: /Game/SO/Items/Shards/ShardBlue.ShardBlue.Description\nmsgctxt \"ItemData\"\nmsgid \"Decreases the incoming <Blue>Magical Damage</> by <Blue>20%.</>\"\nmsgstr \"降低受到的<Blue>魔法傷害</> <Blue>20%。\"\n\n#. Key:\tShardBlue_name\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardBlue.ShardBlue.Name\n#: /Game/SO/Items/Shards/ShardBlue.ShardBlue.Name\nmsgctxt \"ItemData\"\nmsgid \"Blue Shard\"\nmsgstr \"藍色碎片\"\n\n#. Key:\tShardBlueBright_desc\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardBlueBright.ShardBlueBright.Description\n#. /Game/SO/Items/Shards/ShardBlueBright.ShardBlueBright.Description\n#: /Game/SO/Items/Shards/ShardBlueBright.ShardBlueBright.Description\nmsgctxt \"ItemData\"\nmsgid \"Decreases the incoming <Blue>Magical Damage</> by <Blue>30%.</>\"\nmsgstr \"使下壹次<Blue>魔法傷害</> 降低 <Blue>30%.</>\"\n\n#. Key:\tShardBlueBright_name\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardBlueBright.ShardBlueBright.Name\n#: /Game/SO/Items/Shards/ShardBlueBright.ShardBlueBright.Name\nmsgctxt \"ItemData\"\nmsgid \"Bright Blue Shard\"\nmsgstr \"明亮藍色碎片\"\n\n#. Key:\tShardGreen_desc\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardGreen.ShardGreen.Description\n#: /Game/SO/Items/Shards/ShardGreen.ShardGreen.Description\nmsgctxt \"ItemData\"\nmsgid \"Increases the attack speed by <Green>20%</>\"\nmsgstr \"提升妳 <Green>20%</>攻擊速度 。\"\n\n#. Key:\tShardGreen_name\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardGreen.ShardGreen.Name\n#: /Game/SO/Items/Shards/ShardGreen.ShardGreen.Name\nmsgctxt \"ItemData\"\nmsgid \"Green Shard\"\nmsgstr \"綠色碎片\"\n\n#. Key:\tShardGreenBright_desc\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardGreenBright.ShardGreenBright.Description\n#. /Game/SO/Items/Shards/ShardGreenBright.ShardGreenBright.Description\n#: /Game/SO/Items/Shards/ShardGreenBright.ShardGreenBright.Description\nmsgctxt \"ItemData\"\nmsgid \"Increases the attack speed by <Green>30%</>\"\nmsgstr \"提升妳 <Green>30%</>攻擊速度 。\"\n\n#. Key:\tShardGreenBright_name\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardGreenBright.ShardGreenBright.Name\n#. /Game/SO/Items/Shards/ShardGreenBright.ShardGreenBright.Name\n#: /Game/SO/Items/Shards/ShardGreenBright.ShardGreenBright.Name\nmsgctxt \"ItemData\"\nmsgid \"Bright Green Shard\"\nmsgstr \"明亮綠色碎片\"\n\n#. Key:\tShardPurple_desc\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardPurple.ShardPurple.Description\n#: /Game/SO/Items/Shards/ShardPurple.ShardPurple.Description\nmsgctxt \"ItemData\"\nmsgid \"Each time you cast a charge based spell you have a <Purple>25%</> chance to regain the charge.\"\nmsgstr \"每次你施放一個需要充能的法術，你將有<Purple>25%</>機率獲得充能。\"\n\n#. Key:\tShardPurple_name\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardPurple.ShardPurple.Name\n#: /Game/SO/Items/Shards/ShardPurple.ShardPurple.Name\nmsgctxt \"ItemData\"\nmsgid \"Purple Shard\"\nmsgstr \"紫色碎片\"\n\n#. Key:\tShardPurpleBright_desc\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardPurpleBright.ShardPurpleBright.Description\n#. /Game/SO/Items/Shards/ShardPurpleBright.ShardPurpleBright.Description\n#: /Game/SO/Items/Shards/ShardPurpleBright.ShardPurpleBright.Description\nmsgctxt \"ItemData\"\nmsgid \"Each time you cast a charge based spell you have a <Purple>50%</> chance to regain the charge.\"\nmsgstr \"每次你施放一個需要充能的法術，你將有<Purple>50%</>機率獲得充能。\"\n\n#. Key:\tShardPurpleBright_name\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardPurpleBright.ShardPurpleBright.Name\n#. /Game/SO/Items/Shards/ShardPurpleBright.ShardPurpleBright.Name\n#: /Game/SO/Items/Shards/ShardPurpleBright.ShardPurpleBright.Name\nmsgctxt \"ItemData\"\nmsgid \"Bright Purple Shard\"\nmsgstr \"明亮紫色碎片\"\n\n#. Key:\tShardRed_desc\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardRed.ShardRed.Description\n#: /Game/SO/Items/Shards/ShardRed.ShardRed.Description\nmsgctxt \"ItemData\"\nmsgid \"You heal <Red>5%</> of the melee damage you inflict on your enemies.\"\nmsgstr \"妳可恢復<Red>5%</>妳給敵人造成的近戰傷害。\"\n\n#. Key:\tShardRed_name\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardRed.ShardRed.Name\n#: /Game/SO/Items/Shards/ShardRed.ShardRed.Name\nmsgctxt \"ItemData\"\nmsgid \"Red Shard\"\nmsgstr \"紅色碎片\"\n\n#. Key:\tShardRedBright_desc\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardRedBright.ShardRedBright.Description\n#. /Game/SO/Items/Shards/ShardRedBright.ShardRedBright.Description\n#: /Game/SO/Items/Shards/ShardRedBright.ShardRedBright.Description\nmsgctxt \"ItemData\"\nmsgid \"You heal <Red>10%</> of the melee damage you inflict on your enemies.\"\nmsgstr \"妳可恢復<Red>10%</>妳給敵人造成的近戰傷害。\"\n\n#. Key:\tShardRedBright_name\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardRedBright.ShardRedBright.Name\n#: /Game/SO/Items/Shards/ShardRedBright.ShardRedBright.Name\nmsgctxt \"ItemData\"\nmsgid \"Bright Red Shard\"\nmsgstr \"明亮紅色碎片\"\n\n#. Key:\tShardSilver_desc\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardSilver.ShardSilver.Description\n#: /Game/SO/Items/Shards/ShardSilver.ShardSilver.Description\nmsgctxt \"ItemData\"\nmsgid \"Decreases the incoming <White>Physical Damage</> by <White>20%.</>\"\nmsgstr \"降低遭受的 <White>物理傷害</> <White>20%。</>\"\n\n#. Key:\tShardSilver_name\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardSilver.ShardSilver.Name\n#: /Game/SO/Items/Shards/ShardSilver.ShardSilver.Name\nmsgctxt \"ItemData\"\nmsgid \"Silver Shard\"\nmsgstr \"銀色碎片\"\n\n#. Key:\tShardSilverBright_desc\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardSilverBright.ShardSilverBright.Description\n#. /Game/SO/Items/Shards/ShardSilverBright.ShardSilverBright.Description\n#: /Game/SO/Items/Shards/ShardSilverBright.ShardSilverBright.Description\nmsgctxt \"ItemData\"\nmsgid \"Decreases the incoming <White>Physical Damage</> by <White>30%.</>\"\nmsgstr \"使下壹次<White>物理傷害</> 降低 <White>30%。</>\"\n\n#. Key:\tShardSilverBright_name\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardSilverBright.ShardSilverBright.Name\n#. /Game/SO/Items/Shards/ShardSilverBright.ShardSilverBright.Name\n#: /Game/SO/Items/Shards/ShardSilverBright.ShardSilverBright.Name\nmsgctxt \"ItemData\"\nmsgid \"Bright Silver Shard\"\nmsgstr \"明亮銀色碎片\"\n\n#. Key:\tShardTeal_desc\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardTeal.ShardTeal.Description\n#: /Game/SO/Items/Shards/ShardTeal.ShardTeal.Description\nmsgctxt \"ItemData\"\nmsgid \"Each time an enemy hits you with a melee strike it suffers the same damage.\"\nmsgstr \"每次敵人用近戰攻擊攻擊妳，它都會受到相同的傷害。\"\n\n#. Key:\tShardTeal_name\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardTeal.ShardTeal.Name\n#: /Game/SO/Items/Shards/ShardTeal.ShardTeal.Name\nmsgctxt \"ItemData\"\nmsgid \"Teal Shard\"\nmsgstr \"青色碎片\"\n\n#. Key:\tShardTealBright_desc\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardTealBright.ShardTealBright.Description\n#. /Game/SO/Items/Shards/ShardTealBright.ShardTealBright.Description\n#: /Game/SO/Items/Shards/ShardTealBright.ShardTealBright.Description\nmsgctxt \"ItemData\"\nmsgid \"Each time an enemy hits you, it suffers <Green>200%</> of the damage.\"\nmsgstr \"每次敵人攻擊妳，它都會受到<Green>200%</>的傷害。\"\n\n#. Key:\tShardTealBright_name\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardTealBright.ShardTealBright.Name\n#: /Game/SO/Items/Shards/ShardTealBright.ShardTealBright.Name\nmsgctxt \"ItemData\"\nmsgid \"Bright Teal Shard\"\nmsgstr \"明亮青色碎片\"\n\n#. Key:\tShardWhite_desc\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardWhite.ShardWhite.Description\n#: /Game/SO/Items/Shards/ShardWhite.ShardWhite.Description\nmsgctxt \"ItemData\"\nmsgid \"Increases your damage by <Green>20%</>\"\nmsgstr \"提升妳的傷害 <Green>20%</>。\"\n\n#. Key:\tShardWhite_name\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardWhite.ShardWhite.Name\n#: /Game/SO/Items/Shards/ShardWhite.ShardWhite.Name\nmsgctxt \"ItemData\"\nmsgid \"White Shard\"\nmsgstr \"白色碎片\"\n\n#. Key:\tShardWhiteBright_desc\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardWhiteBright.ShardWhiteBright.Description\n#. /Game/SO/Items/Shards/ShardWhiteBright.ShardWhiteBright.Description\n#: /Game/SO/Items/Shards/ShardWhiteBright.ShardWhiteBright.Description\nmsgctxt \"ItemData\"\nmsgid \"Increases your damage by <Green>30%</>.\"\nmsgstr \"提升妳的傷害 <Green>30%</>。\"\n\n#. Key:\tShardWhiteBright_name\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardWhiteBright.ShardWhiteBright.Name\n#. /Game/SO/Items/Shards/ShardWhiteBright.ShardWhiteBright.Name\n#: /Game/SO/Items/Shards/ShardWhiteBright.ShardWhiteBright.Name\nmsgctxt \"ItemData\"\nmsgid \"Bright White Shard\"\nmsgstr \"明亮白色碎片\"\n\n#. Key:\tShardYellow_desc\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardYellow.ShardYellow.Description\n#: /Game/SO/Items/Shards/ShardYellow.ShardYellow.Description\nmsgctxt \"ItemData\"\nmsgid \"Each melee strike has a <Yellow>10%</> chance to <Yellow>Stun</> the target.\"\nmsgstr \"每次近戰攻擊有 <Yellow>10%</> 機率 <Yellow>擊暈</> 對方。\"\n\n#. Key:\tShardYellow_name\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardYellow.ShardYellow.Name\n#: /Game/SO/Items/Shards/ShardYellow.ShardYellow.Name\nmsgctxt \"ItemData\"\nmsgid \"Yellow Shard\"\nmsgstr \"黃色碎片\"\n\n#. Key:\tShardYellowBright_desc\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardYellowBright.ShardYellowBright.Description\n#. /Game/SO/Items/Shards/ShardYellowBright.ShardYellowBright.Description\n#: /Game/SO/Items/Shards/ShardYellowBright.ShardYellowBright.Description\nmsgctxt \"ItemData\"\nmsgid \"Each melee strike has a <Yellow>20%</> chance to <Yellow>Stun</> the target.\"\nmsgstr \"每次近戰攻擊有 <Yellow>20%</> 機率 <Yellow>擊暈</> 對方。\"\n\n#. Key:\tShardYellowBright_name\n#. SourceLocation:\t/Game/SO/Items/Shards/ShardYellowBright.ShardYellowBright.Name\n#. /Game/SO/Items/Shards/ShardYellowBright.ShardYellowBright.Name\n#: /Game/SO/Items/Shards/ShardYellowBright.ShardYellowBright.Name\nmsgctxt \"ItemData\"\nmsgid \"Bright Yellow Shard\"\nmsgstr \"明亮黃色碎片\"\n\n#. Key:\tSpellCaster_desc\n#. SourceLocation:\t/Game/SO/Items/Useable/SpellCaster.SpellCaster.Description\n#: /Game/SO/Items/Useable/SpellCaster.SpellCaster.Description\nmsgctxt \"ItemData\"\nmsgid \"A magical artefact with the following worn text engraved on the back:\\r\\n\\r\\nInsert Runestones to ... spells\\r\\nKeep .... .... children\\r\\nMade in .....\"\nmsgstr \"這是壹件神奇的人工制品，背面刻有如下文字:\\n\\n插入符石到…法術\\n保持.... ....孩子們\\n制造者為.....\"\n\n#. Key:\tSpellCaster_name\n#. SourceLocation:\t/Game/SO/Items/Useable/SpellCaster.SpellCaster.Name\n#: /Game/SO/Items/Useable/SpellCaster.SpellCaster.Name\nmsgctxt \"ItemData\"\nmsgid \"Spellcaster\"\nmsgstr \"施法者\"\n\n#. Key:\tStraightSword_desc\n#. SourceLocation:\t/Game/SO/Items/Weapons/StraightSword.StraightSword.Description\n#. /Game/SO/Items/Weapons/StraightSword.StraightSword.Description\n#: /Game/SO/Items/Weapons/StraightSword.StraightSword.Description\nmsgctxt \"ItemData\"\nmsgid \"A simple yet effective weapon. Not too rusty, not too sharp. If someone looks close enough it looks a bit low budget, but the ones looking close enough won't talk about anything anymore, will they?\"\nmsgstr \"壹個簡單而有效的武器。並無多少生銹，卻也不太鋒利。\"\n\n#. Key:\tStraightSword_name\n#. SourceLocation:\t/Game/SO/Items/Weapons/StraightSword.StraightSword.Name\n#: /Game/SO/Items/Weapons/StraightSword.StraightSword.Name\nmsgctxt \"ItemData\"\nmsgid \"Straight Sword\"\nmsgstr \"直劍\"\n\n#. Key:\tTestStoneBag_desc\n#. SourceLocation:\t/Game/SO/Items/Useable/TestStoneBag.TestStoneBag.Description\n#. /Game/SO/Items/Useable/TestStoneBag.TestStoneBag.Description\n#: /Game/SO/Items/Useable/TestStoneBag.TestStoneBag.Description\nmsgctxt \"ItemData\"\nmsgid \"When you are the one in the team who has the job to enter every dungeon first, you will become a careful one too... if you live long enough for that.\"\nmsgstr \"當妳是團隊中每次第壹個進入地牢的人，妳也會成為壹個細心的人……如果妳能活得足夠長。\"\n\n#. Key:\tTestStoneBag_name\n#. SourceLocation:\t/Game/SO/Items/Useable/TestStoneBag.TestStoneBag.Name\n#: /Game/SO/Items/Useable/TestStoneBag.TestStoneBag.Name\nmsgctxt \"ItemData\"\nmsgid \"Bag of the Careful One\"\nmsgstr \"細心袋子\"\n\n#. Key:\tWheel_desc\n#. SourceLocation:\t/Game/SO/Items/QuestItems/Wheel.Wheel.Description\n#: /Game/SO/Items/QuestItems/Wheel.Wheel.Description\nmsgctxt \"ItemData\"\nmsgid \"One of the first greatest inventions of humans. Because they envied balls for their rolling skill.\"\nmsgstr \"人類最偉大的發明之壹。因為他們羨慕球的滾動技術。\"\n\n#. Key:\tWheel_name\n#. SourceLocation:\t/Game/SO/Items/QuestItems/Wheel.Wheel.Name\n#: /Game/SO/Items/QuestItems/Wheel.Wheel.Name\nmsgctxt \"ItemData\"\nmsgid \"Wheel\"\nmsgstr \"輪子\"\n\n#. Key:\tWWBossShipLock_desc\n#. SourceLocation:\t/Game/SO/Items/Keys/WWBossShipLock.WWBossShipLock.Description\n#. /Game/SO/Items/Keys/WWBossShipLock.WWBossShipLock.Description\n#: /Game/SO/Items/Keys/WWBossShipLock.WWBossShipLock.Description\nmsgctxt \"ItemData\"\nmsgid \"Rusty key of a rusty lock.\"\nmsgstr \"生銹鎖的生銹鑰匙。\"\n\n#. Key:\tWWBossShipLock_name\n#. SourceLocation:\t/Game/SO/Items/Keys/WWBossShipLock.WWBossShipLock.Name\n#: /Game/SO/Items/Keys/WWBossShipLock.WWBossShipLock.Name\nmsgctxt \"ItemData\"\nmsgid \"Rusty Key\"\nmsgstr \"生銹的鑰匙\"\n\n#. Key:\t0BFD568E4989A20D66B91DA476C0E6B4\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_6.Text\n#: /Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_6.Text\nmsgctxt \"Notes\"\nmsgid \"I promised Fountain to give its flower to the Magic Mirror.\"\nmsgstr \"我答應許願泉把它的花送給魔鏡。\"\n\n#. Key:\t1ABD11A64A7649801A6AB6A8BBDC686C\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_9.Text\n#. /Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_9.Text\n#: /Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_9.Text\nmsgctxt \"Notes\"\nmsgid \"The Ghost Dwarf needs a ghost abacus\"\nmsgstr \"這個矮人幽魂需要壹個幽靈算盤\"\n\n#. Key:\t57CBE1274A1B4EC7FD68EA9288161AAD\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_7.Text\n#. /Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_7.Text\n#: /Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_7.Text\nmsgctxt \"Notes\"\nmsgid \"The Chef wants me to clear the shore\"\nmsgstr \"廚師要我清理海岸\"\n\n#. Key:\t77693D6C43702786250364932BD34BCD\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note.Text\n#. /Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note.Text\n#: /Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note.Text\nmsgctxt \"Notes\"\nmsgid \"The GateKeeper could use a chair\"\nmsgstr \"看門人可以使用壹把椅子\"\n\n#. Key:\t9C3FB78C4598A48BC187B580CBB070F6\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_8.Text\n#. /Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_8.Text\n#: /Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_8.Text\nmsgctxt \"Notes\"\nmsgid \"The Dwarf wants me to clear the Dwarven Fortress\"\nmsgstr \"矮人要我清除矮人要塞\"\n\n#. Key:\tAA94EB6E4B0A505D730971932A3DE0CC\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_5.Text\n#. /Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_5.Text\n#: /Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_5.Text\nmsgctxt \"Notes\"\nmsgid \"The Golem Maker wants me to hunt some Golems\"\nmsgstr \"機器制造人要我去捕獵壹些機器人\"\n\n#. Key:\tAE371E564EC1D75947ECF98AAA896A2C\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_11.Text\n#. /Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_11.Text\n#: /Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_11.Text\nmsgctxt \"Notes\"\nmsgid \"A Pipe Walker is trapped in a cage\"\nmsgstr \"壹個管道行走者被困在籠子裏\"\n\n#. Key:\tB12481ED4CFF0182EDB7ACAA416B55FC\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_4.Text\n#. /Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_4.Text\n#: /Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_4.Text\nmsgctxt \"Notes\"\nmsgid \"Gnory needs a wheel\"\nmsgstr \"格諾裏需要壹個輪子\"\n\n#. Key:\tD3B6D81E433CBE8461E2B1AFE06E9741\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_13.Text\n#. /Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_13.Text\n#: /Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_13.Text\nmsgctxt \"Notes\"\nmsgid \"The Chef asked me to bring him some Purple Mushroom\"\nmsgstr \"廚師讓我給他帶些紫色蘑菇\"\n\n#. Key:\tD8C4FFC7435C6A2E7C88BBA7109A1907\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_12.Text\n#. /Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_12.Text\n#: /Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_12.Text\nmsgctxt \"Notes\"\nmsgid \"I need to learn Dwarven to open a gate\"\nmsgstr \"我需要學習矮人如何開門\"\n\n#. Key:\tE3857F07468C2A0B34A98887E3BBB1DA\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_10.Text\n#. /Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_10.Text\n#: /Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_10.Text\nmsgctxt \"Notes\"\nmsgid \"I feel the Tomb of Tabby is important somehow\"\nmsgstr \"我覺得泰比之墓很重要。\"\n\n#. Key:\tE9DA40684B9375A5F78D18A138C75174\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_2.Text\n#. /Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_2.Text\n#: /Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_2.Text\nmsgctxt \"Notes\"\nmsgid \"Teachy asked for a strangely unique device\"\nmsgstr \"蒂奇需要壹種奇特而獨特的裝置\"\n\n#. Key:\tF109A1614B16565CC1846C8D0A46672E\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_1.Text\n#. /Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_1.Text\n#: /Game/SO/GUI/InGame/CharacterPanels/Notes/UI_Notes.UI_Notes_C:WidgetTree.UI_Note_C_1.Text\nmsgctxt \"Notes\"\nmsgid \"I promised Lory to bring her some books\"\nmsgstr \"我答應羅裏給她帶幾本書來\"\n\n#. Key:\taway\n#. SourceLocation:\tSource/SOrb/UI/InGame/SoUIStationPanel.cpp:98\n#: Source/SOrb/UI/InGame/SoUIStationPanel.cpp:98\nmsgctxt \"StationNames\"\nmsgid \"World's End\"\nmsgstr \"世界盡頭\"\n\n#. Key:\tcrossroadcave\n#. SourceLocation:\tSource/SOrb/UI/InGame/SoUIStationPanel.cpp:94\n#: Source/SOrb/UI/InGame/SoUIStationPanel.cpp:94\nmsgctxt \"StationNames\"\nmsgid \"Crossroad Cave\"\nmsgstr \"十字路口的洞穴\"\n\n#. Key:\tlavatemple\n#. SourceLocation:\tSource/SOrb/UI/InGame/SoUIStationPanel.cpp:96\n#: Source/SOrb/UI/InGame/SoUIStationPanel.cpp:96\nmsgctxt \"StationNames\"\nmsgid \"Remnant Road\"\nmsgstr \"殘余之路\"\n\n#. Key:\toutpost\n#. SourceLocation:\tSource/SOrb/UI/InGame/SoUIStationPanel.cpp:95\n#: Source/SOrb/UI/InGame/SoUIStationPanel.cpp:95\nmsgctxt \"StationNames\"\nmsgid \"Obedient Outpost\"\nmsgstr \"順從的前哨\"\n\n#. Key:\tstay\n#. SourceLocation:\tSource/SOrb/UI/InGame/SoUIStationPanel.cpp:99\n#: Source/SOrb/UI/InGame/SoUIStationPanel.cpp:99\nmsgctxt \"StationNames\"\nmsgid \"Stay\"\nmsgstr \"停留\"\n\n#. Key:\twrackedWaters\n#. SourceLocation:\tSource/SOrb/UI/InGame/SoUIStationPanel.cpp:97\n#: Source/SOrb/UI/InGame/SoUIStationPanel.cpp:97\nmsgctxt \"StationNames\"\nmsgid \"Wracked Waters\"\nmsgstr \"毀壞之水\"\n\n"
  },
  {
    "path": "Content/Localization/WarriorbDemo/WarriorbDemo.csv",
    "content": "Date/Time,Word Count,en,es,fr,hu,ro,ru,uk,zh-Hans,zh-Hant\n2019.10.20-14.28.46,18,18,0,0,0,0,0,0,0,0\n2019.10.20-14.32.19,1607,1607,0,0,0,0,0,0,0,0\n2019.10.20-14.46.32,4000,4000,0,0,0,0,0,0,0,0\n2019.10.20-14.47.19,3900,3900,0,0,0,0,0,0,0,0\n2019.10.20-14.48.41,1596,1596,0,0,0,0,0,0,0,0\n2019.10.20-14.52.54,1591,1591,0,0,0,0,0,0,0,0\n2019.10.20-15.13.10,2011,2011,0,0,0,0,0,0,0,0\n2019.10.20-15.59.22,2002,2002,0,0,0,0,0,0,0,0\n2019.10.20-16.06.19,2002,2002,0,0,0,1,0,0,0,0\n2019.10.21-08.12.51,2002,2002,0,0,1999,1,0,0,0,0\n2019.10.21-12.40.57,2261,2261,0,0,2003,1,0,0,0,0\n2019.10.21-12.47.33,2314,2314,0,0,2003,1,0,0,0,0\n2019.10.21-12.57.35,2306,2306,0,0,2003,1,0,0,0,0\n2019.10.21-12.59.13,2305,2305,0,0,2003,1,0,0,0,0\n2019.10.21-13.16.47,2305,2305,0,0,2305,1,0,0,0,0\n2019.10.22-09.27.52,2311,2311,0,0,2305,1,0,0,0,0\n2019.10.22-09.28.17,2311,2311,0,0,2306,1,0,0,0,0\n2019.11.01-09.15.58,2311,2311,0,0,2306,1,0,0,2310,0\n2019.11.01-09.16.56,2320,2320,0,0,2298,1,0,0,2302,0\n2019.11.01-09.34.49,2319,2319,0,0,2298,1,0,0,2302,0\n2019.11.13-17.01.53,2590,2590,0,0,2298,1,0,0,2302,0\n2019.11.13-17.02.34,2590,2590,0,0,2298,2319,0,0,2302,0\n2019.11.13-20.40.50,2590,2590,0,0,2298,2531,0,0,2302,0\n2019.11.13-20.41.17,2614,2614,0,0,2298,2510,0,0,2302,0\n2019.11.13-20.49.19,2602,2602,0,0,2298,2510,0,0,2302,0\n2019.11.13-20.49.43,2602,2602,0,0,2298,2589,0,0,2302,0\n2019.11.13-20.51.37,2602,2602,0,0,2298,2602,0,0,2302,0\n2019.11.14-21.14.15,2602,2602,0,0,2298,2602,0,0,2302,2302\n2019.11.19-13.05.23,2623,2623,0,0,2298,2602,0,0,2302,2302\n2019.11.19-13.12.10,2623,2623,0,0,2298,2623,0,0,2302,2302\n2019.11.20-12.21.47,2623,2623,0,0,2298,2623,0,0,2623,2623\n2019.11.26-09.55.51,2623,2623,0,0,2623,2623,0,0,2623,2623\n2019.11.26-11.24.52,2698,2698,0,0,2597,2597,0,0,2597,2597\n2019.11.26-13.08.03,2698,2698,0,0,2698,2597,0,0,2597,2597\n2019.11.26-13.53.31,2710,2710,0,0,2698,2597,0,0,2597,2597\n2019.11.26-13.58.00,2710,2710,0,0,2710,2597,0,0,2597,2597\n2019.11.28-19.46.23,2710,2710,0,0,2710,2610,0,0,2597,2597\n2019.12.04-11.57.11,2704,2704,0,0,2703,2603,0,0,2590,2590\n2019.12.04-12.08.08,2704,2704,0,0,2701,2603,0,0,2590,2590\n2019.12.04-12.08.48,2704,2704,0,0,2701,2702,0,0,2590,2590\n2019.12.04-12.11.17,2704,2704,0,0,2701,2704,0,0,2590,2590\n2019.12.04-12.12.34,2704,2704,0,0,2703,2704,0,0,2590,2590\n2019.12.05-16.06.00,2724,2724,0,0,2703,2704,0,0,2590,2590\n2019.12.09-21.45.35,2778,2778,0,0,2700,2701,0,0,2587,2587\n2019.12.09-21.46.15,2778,2778,0,0,2700,2701,0,0,2721,2721\n2019.12.09-21.53.14,2778,2778,0,0,2702,2760,0,0,2723,2723\n2019.12.09-22.19.05,2771,2771,0,0,2673,2731,0,0,2676,2676\n2019.12.11-12.17.16,2771,2771,0,0,2673,2731,0,0,2771,2771\n2019.12.11-12.24.29,2771,2771,0,0,2673,2771,0,0,2771,2771\n2019.12.11-13.44.47,2771,2771,0,0,2771,2771,0,0,2771,2771\n2019.12.11-16.06.34,2785,2785,0,0,2771,2771,0,0,2771,2771\n2019.12.11-18.13.56,2785,2785,0,0,2785,2771,0,0,2771,2771\n2019.12.12-00.17.30,2785,2785,0,0,2771,2771,0,0,2771,2771\n2019.12.12-11.52.25,2785,2785,0,0,2785,2785,0,0,2771,2771\n2019.12.13-10.40.10,2785,2785,0,0,2785,2785,0,0,2785,2785\n2020.01.05-17.55.58,3054,3054,0,0,2785,2785,0,0,2785,2785\n2020.01.08-19.20.14,3054,3054,0,0,2782,2782,0,0,2782,2782\n2020.01.10-21.11.29,3054,3054,0,0,2782,2799,0,0,2782,2782\n2020.01.15-12.19.46,3079,3079,0,0,2702,2719,0,0,2702,2702\n2020.01.15-12.20.22,3079,3079,0,0,2704,2727,0,0,2704,2704\n2020.01.22-15.24.39,3193,3193,0,0,2704,2727,0,0,2704,2704\n2020.01.22-15.25.33,3193,3193,0,0,3039,2727,0,0,2704,2704\n2020.01.22-18.57.49,3193,3193,0,0,3193,2727,0,0,2704,2704\n2020.01.26-11.31.21,3198,3198,0,0,3193,2727,0,0,2704,2704\n2020.01.26-11.32.19,3198,3198,0,0,3198,2727,0,0,2704,2704\n2020.01.27-22.16.09,3307,3307,0,0,2727,2298,0,0,2280,2280\n2020.01.27-22.44.35,3307,3307,0,0,2782,2298,0,0,2280,2280\n2020.01.27-23.23.53,3474,3474,0,0,2782,2298,0,0,2280,2280\n2020.01.27-23.53.24,3462,3462,0,0,2758,2298,0,0,2280,2280\n2020.01.27-23.54.05,3462,3462,0,0,2758,2327,0,0,2309,2309\n2020.01.28-00.04.12,3462,3462,0,0,2770,2339,0,0,2321,2321\n2020.01.28-15.00.27,3475,3475,0,0,2769,2338,0,0,2320,2320\n2020.01.28-16.10.14,3516,3516,0,0,2769,2338,0,0,2320,2320\n2020.01.28-18.20.22,3516,3516,0,0,2824,2338,0,0,2320,2320\n2020.01.28-19.03.54,3569,3569,0,0,2824,2338,0,0,2320,2320\n2020.01.28-19.51.42,3570,3570,0,0,2824,2338,0,0,2320,2320\n2020.01.28-19.52.05,3569,3569,0,0,2824,2338,0,0,2320,2320\n2020.01.28-20.12.58,3569,3569,0,0,2875,2338,0,0,2320,2320\n2020.01.29-11.19.13,3607,3607,0,0,2875,2338,0,0,2320,2320\n2020.01.29-11.19.48,3607,3607,0,0,2877,2338,0,0,2320,2320\n2020.01.29-11.27.06,3609,3609,0,0,2877,2338,0,0,2320,2320\n2020.01.29-11.51.48,3609,3609,0,0,2916,2338,0,0,2320,2320\n2020.01.29-13.00.46,3617,3617,0,0,2916,2338,0,0,2320,2320\n2020.01.29-13.06.14,3617,3617,0,0,2922,2338,0,0,2320,2320\n2020.01.29-15.19.06,3626,3626,0,0,2922,2338,0,0,2320,2320\n2020.01.29-15.35.06,3624,3624,0,0,2922,2338,0,0,2320,2320\n2020.01.29-15.35.46,3624,3624,0,0,2931,2338,0,0,2320,2320\n2020.01.29-16.07.07,3627,3627,0,0,2931,2338,0,0,2320,2320\n2020.01.29-16.20.33,3627,3627,0,0,2934,2338,0,0,2320,2320\n2020.01.29-17.38.02,3668,3668,0,0,2934,2338,0,0,2320,2320\n2020.01.29-17.47.13,3668,3668,0,0,2975,2338,0,0,2320,2320\n2020.01.30-15.26.56,3688,3688,0,0,2975,2338,0,0,2320,2320\n2020.01.30-15.34.33,3688,3688,0,0,2995,2338,0,0,2320,2320\n2020.01.30-16.17.08,3732,3732,0,0,2991,2338,0,0,2320,2320\n2020.01.30-16.17.48,3732,3728,0,0,2991,2338,0,0,2320,2320\n2020.01.30-16.26.26,3732,3732,0,0,2991,2338,0,0,2320,2320\n2020.01.30-16.35.18,3732,3732,0,0,3039,2338,0,0,2320,2320\n2020.01.31-19.12.22,3555,3555,0,0,2862,2161,0,0,2143,2143\n2020.02.01-16.16.30,3287,3287,0,0,2594,1893,0,0,1875,1875\n2020.02.01-19.20.45,5157,5157,0,0,2594,1893,0,0,1875,1875\n2020.02.01-19.27.59,3287,3287,0,0,2594,1893,0,0,1875,1875\n2020.02.01-20.03.11,3181,3181,0,0,2488,1787,0,0,1769,1769\n2020.02.02-11.20.33,3177,3177,0,0,2484,1783,0,0,1765,1765\n2020.02.02-11.29.39,3175,3175,0,0,2482,1781,0,0,1763,1763\n2020.02.02-12.33.26,3176,3176,0,0,2482,1781,0,0,1763,1763\n2020.02.02-12.41.26,3173,3173,0,0,2479,1778,0,0,1760,1760\n2020.02.02-12.52.18,3173,3173,0,0,2480,1778,0,0,1760,1760\n2020.02.02-13.18.36,3198,3198,0,0,2480,1778,0,0,1760,1760\n2020.02.02-13.29.41,3198,3198,0,0,2505,1778,0,0,1760,1760\n2020.02.02-17.31.52,3191,3191,0,0,2385,1710,0,0,1692,1692\n2020.02.02-17.32.30,3191,3191,0,0,2385,2033,0,0,1692,1692\n2020.02.02-17.41.16,3191,3191,0,0,2498,2101,0,0,1760,1760\n2020.02.03-14.11.22,3191,3191,0,0,2475,2101,0,0,1760,1760\n2020.02.03-14.12.00,3191,3191,0,0,2475,2712,0,0,1760,1760\n2020.02.03-14.38.42,3191,3191,0,0,2475,2735,0,0,1760,1760\n2020.02.04-16.41.50,3194,3194,0,0,2475,2735,0,0,1760,1760\n2020.02.05-19.17.03,3194,3194,0,0,2475,2738,0,0,1760,1760\n2020.02.06-18.02.38,3194,3194,0,0,2470,2733,0,0,1755,1755\n2020.02.06-18.16.27,3194,3194,0,0,2475,2738,0,0,1760,1760\n2020.02.10-23.31.30,3210,3210,0,0,2475,2738,0,0,1760,1760\n2020.02.17-11.52.06,3601,3601,0,0,2475,2738,0,0,1760,1760\n2020.02.17-11.52.47,3601,3601,0,0,3210,2738,0,0,1760,1760\n2020.02.18-21.55.41,3601,3601,0,0,3601,2738,0,0,1760,1760\n2020.02.21-15.25.37,3608,3608,0,0,3590,2738,0,0,1760,1760\n2020.02.25-10.27.37,3606,3606,0,0,3565,2713,0,0,1741,1741\n2020.02.25-12.52.08,3606,3606,0,0,3606,2713,0,0,1741,1741\n2020.02.25-18.11.31,3646,3646,0,0,3606,2713,0,0,1741,1741\n2020.02.25-18.49.40,3656,3656,0,0,3576,2713,0,0,1741,1741\n2020.02.25-18.50.10,3667,3667,0,0,3576,2713,0,0,1741,1741\n2020.02.25-18.50.49,3667,3667,0,0,3576,3144,0,0,1741,1741\n2020.02.25-19.00.16,3667,3667,0,0,3576,3195,0,0,1741,1741\n2020.02.25-21.11.29,3668,3668,0,0,3562,3196,0,0,1741,1741\n2020.02.26-12.50.34,3674,3674,0,0,3562,3196,0,0,1741,1741\n2020.02.26-17.24.37,3674,3674,0,0,3562,3202,0,0,1741,1741\n2020.02.26-17.33.12,3674,3674,0,0,3513,3153,0,0,1694,1694\n2020.02.26-20.00.40,3674,3674,0,0,3562,3202,0,0,1741,1741\n2020.03.05-11.13.50,3671,3671,0,0,3520,3160,0,0,1733,1733\n2020.03.05-16.31.50,3668,3668,0,0,3517,3157,0,0,1730,1730\n2020.03.05-16.41.49,3668,3668,0,0,3515,3155,0,0,1730,1730\n2020.03.05-17.07.27,3668,3668,0,3627,3515,3155,0,0,1730,1730\n2020.03.05-17.24.56,3697,3697,0,3627,3515,3155,0,0,1730,1730\n2020.03.06-11.16.53,3697,3697,0,3697,3515,3155,3155,0,1730,1730\n2020.03.06-12.41.31,3697,3697,0,3697,3515,3155,3225,0,1730,1730\n2020.03.06-17.03.25,3697,3697,0,3697,3515,3155,3225,0,2640,1730\n2020.03.06-19.51.35,3697,3697,3155,3697,3515,3155,3225,0,2640,1730\n2020.03.06-20.17.51,3697,3697,3225,3697,3515,3155,3225,0,2640,1730\n2020.03.13-09.18.07,3697,3697,3225,3697,3515,3155,3225,0,3213,1730\n2020.03.16-10.13.05,3717,3717,3225,3697,3515,3155,3225,0,3213,1730\n2020.03.19-12.52.14,3717,3717,3225,3697,3572,3155,3225,0,3213,1730\n2020.03.19-15.04.49,3717,3717,3225,3697,3717,3155,3225,0,3213,1730\n2020.03.20-12.33.01,3717,3717,3225,3697,3717,3245,3225,0,3213,1730\n2020.03.20-16.02.17,3718,3718,3225,3697,3717,3245,3225,0,3213,1730\n2020.03.23-10.59.17,3769,3769,3202,3674,3694,3222,3202,0,3190,1730\n2020.03.23-10.59.54,3769,3769,3222,3674,3694,3222,3202,0,3190,1730\n2020.03.23-11.16.36,3765,3765,3222,3674,3694,3222,3202,0,3190,1730\n2020.03.27-09.49.59,3292,3292,3221,3201,3221,3221,3201,0,3189,1729\n2020.03.30-13.37.30,3292,3292,3292,3292,3221,3221,3292,0,3189,1729\n2020.04.02-12.18.10,3292,3292,3292,3292,3221,3221,3292,0,3292,3292\n2020.04.02-14.53.32,3292,3292,3292,3292,3221,3292,3292,0,3292,3292\n2020.04.17-14.36.53,3332,3332,3269,3269,3198,3269,3269,0,3269,3269\n2020.04.17-14.59.39,3332,3332,3267,3267,3196,3267,3267,0,3267,3267\n2020.04.17-15.00.41,3332,3332,3268,3268,3198,3269,3269,0,3269,3269\n2020.04.17-16.55.26,3454,3454,3262,3262,3192,3263,3263,0,3263,3263\n2020.04.17-23.16.16,3469,3469,3262,3262,3192,3263,3263,0,3263,3263\n2020.04.19-22.11.47,3489,3489,3262,3262,3192,3263,3263,0,3263,3263\n2020.04.20-13.27.22,3489,3489,3262,3262,3489,3263,3263,0,3263,3263\n2020.04.21-20.00.29,3489,3489,3489,3262,3489,3263,3489,0,3263,3263\n2020.04.21-20.08.26,3489,3489,3489,3262,3489,3263,3489,0,3489,3489\n2020.04.23-12.14.58,3489,3489,3489,3262,3489,3489,3489,0,3489,3489\n2020.04.24-09.38.39,3489,3489,3489,3489,3489,3489,3489,0,3489,3489\n2020.04.26-21.49.36,3536,3536,3489,3489,3489,3489,3489,0,3489,3489\n2020.04.27-14.22.07,3536,3536,3536,3536,3536,3536,3536,0,3536,3536\n2020.05.01-21.21.16,3564,3564,3536,3536,3536,3536,3536,0,3536,3536\n2020.05.01-21.55.02,3564,3564,3564,3564,3564,3564,3564,0,3564,3564\n2020.05.11-13.16.29,3538,3538,3514,3514,3514,3514,3514,0,3514,3514\n2020.05.11-13.21.27,3538,3538,3538,3538,3538,3538,3538,0,3538,3538\n2020.06.06-11.07.07,3557,3557,3538,3538,3538,3538,3538,0,3538,3538\n2020.06.06-11.18.02,3557,3557,3540,3540,3540,3540,3540,0,3540,3540\n2020.06.15-14.02.22,3558,3558,3531,3531,3531,3531,3531,0,3531,3531\n2020.06.15-14.14.08,3560,3560,3531,3531,3531,3531,3531,0,3531,3531\n2020.06.15-14.42.33,3560,3560,3543,3543,3543,3543,3543,0,3543,3543\n2020.06.25-10.19.13,3561,3561,3532,3532,3532,3532,3532,0,3532,3532\n2020.06.25-10.33.41,3561,3561,3544,3544,3544,3544,3544,0,3544,3544\n2020.06.25-10.48.13,3561,3561,3544,3544,3561,3544,3544,0,3544,3544\n2020.06.25-11.53.26,3570,3570,3541,3541,3558,3541,3541,0,3541,3541\n2020.06.25-12.25.37,3570,3570,3553,3553,3570,3553,3553,0,3553,3553\n2020.06.25-12.38.05,3581,3581,3553,3553,3570,3553,3553,0,3553,3553\n2020.06.29-19.40.15,3581,3581,3553,3581,3570,3581,3581,0,3581,3581\n2020.06.29-22.42.52,3581,3581,3553,3581,3581,3581,3581,0,3581,3581\n2020.07.01-22.30.14,3581,3581,3581,3581,3581,3581,3581,0,3581,3581\n2020.07.15-15.36.24,3613,3613,3581,3581,3581,3581,3581,0,3581,3581\n2020.07.15-16.10.45,3613,3613,3613,3613,3613,3581,3613,0,3613,3613\n2020.07.15-16.21.58,3621,3621,3613,3613,3613,3581,3613,0,3613,3613\n2020.07.15-16.33.44,3621,3621,3621,3621,3621,3581,3621,0,3621,3621\n2020.07.15-19.44.46,3621,3621,3621,3621,3621,3621,3621,0,3621,3621\n2020.07.16-21.11.52,3622,3622,3621,3621,3621,3621,3621,0,3621,3621\n2020.08.04-17.43.48,3627,3627,3621,3621,3621,3621,3621,0,3621,3621\n2020.08.20-13.25.32,3638,3638,3584,3584,3584,3584,3584,0,3584,3584\n2020.08.20-13.26.36,3638,3638,3591,3591,3591,3591,3591,0,3591,3591\n2020.08.20-15.14.38,3638,3638,3638,3638,3638,3627,3638,0,3638,3638\n2020.08.20-15.30.08,3662,3662,3638,3638,3638,3627,3638,0,3638,3638\n2020.08.20-16.01.45,3662,3662,3662,3662,3662,3662,3662,0,3662,3662\n2020.10.07-09.22.12,3663,3663,3662,3662,3662,3662,3662,0,3662,3662\n2020.10.07-10.09.02,3663,3663,3663,3663,3663,3663,3663,0,3663,3663\n"
  },
  {
    "path": "Content/Localization/WarriorbDemo/WarriorbDemo_Conflicts.txt",
    "content": ""
  },
  {
    "path": "Content/Localization/WarriorbDemo/en/WarriorbDemo.po",
    "content": "﻿# WarriorbDemo English translation.\n# Copyright 1998-2019 Epic Games, Inc. All Rights Reserved.\n# \nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: WarriorbDemo\\n\"\n\"POT-Creation-Date: 2020-10-07 08:08\\n\"\n\"PO-Revision-Date: 2020-10-07 08:08\\n\"\n\"Language-Team: \\n\"\n\"Language: en\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Plural-Forms: nplurals=2; plural=(n != 1);\\n\"\n\n#. Key:\tact1_loading\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"You are a Mighty Spirit from the Unknown Realm. You were torn away from your home by a pathetic mortal Wizard. After a magical accident your essence is bound to an unlikely body. Find a way out of your ball-body prison!\"\nmsgstr \"You are a Mighty Spirit from the Unknown Realm. You were torn away from your home by a pathetic mortal Wizard. After a magical accident your essence is bound to an unlikely body. Find a way out of your ball-body prison!\"\n\n#. Key:\tact2_loading\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Reaching Crossroad Cave you are a step closer to the Three Artifacts - and to freedom.\"\nmsgstr \"Reaching Crossroad Cave you are a step closer to the Three Artifacts - and to freedom.\"\n\n#. Key:\tact3_loading\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Finding the Three Artifacts required all your skills and strength. You hope that delivering them to the Wizard will be less difficult.\"\nmsgstr \"Finding the Three Artifacts required all your skills and strength. You hope that delivering them to the Wizard will be less difficult.\"\n\n#. Key:\tact_1\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"text displayed on black screen the first time a chapter is started\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Act I\"\nmsgstr \"Act I\"\n\n#. Key:\tact_2\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"text displayed on black screen the first time a chapter is started\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Act II\"\nmsgstr \"Act II\"\n\n#. Key:\tact_3\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"text displayed on black screen the first time a chapter is started\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Act III\"\nmsgstr \"Act III\"\n\n#. Key:\tancient_arcade\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an area\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Ancient Arcade\"\nmsgstr \"Ancient Arcade\"\n\n#. Key:\tbubble_border\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an area\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Bubble Border\"\nmsgstr \"Bubble Border\"\n\n#. Key:\tcerulean_city\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an area\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Cerulean City\"\nmsgstr \"Cerulean City\"\n\n#. Key:\tchasm_chamber\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an area\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Chasm Chamber\"\nmsgstr \"Chasm Chamber\"\n\n#. Key:\tcrossroad_cave\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an area\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Crossroad Cave\"\nmsgstr \"Crossroad Cave\"\n\n#. Key:\tdarkest_dungeon\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an area\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Darkest Dungeon\"\nmsgstr \"Darkest Dungeon\"\n\n#. Key:\tdwarven_dungeons\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an area\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Dwarven Dungeons\"\nmsgstr \"Dwarven Dungeons\"\n\n#. Key:\tending_loading\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Finally! You did your part of the deal, now it's the Wizard's turn to get you back home.\"\nmsgstr \"Finally! You did your part of the deal, now it's the Wizard's turn to get you back home.\"\n\n#. Key:\tepilogue\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"text displayed on black screen the first time a chapter is started\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Epilogue\"\nmsgstr \"Epilogue\"\n\n#. Key:\tgrey_gate\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an area\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Grey Gate\"\nmsgstr \"Grey Gate\"\n\n#. Key:\thallowed_heart\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an area, Hallowed as in made holy; consecrated.\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Hallowed Heart\"\nmsgstr \"Hallowed Heart\"\n\n#. Key:\tintro_subtitle_0\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" intro subtitle line 1\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"I wish I could just... turn back time to undo what I have done.\"\nmsgstr \"I wish I could just... turn back time to undo what I have done.\"\n\n#. Key:\tintro_subtitle_1\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" intro subtitle line 01\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"However the past is behind us\"\nmsgstr \"However the past is behind us\"\n\n#. Key:\tintro_subtitle_2\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" intro subtitle line 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"and all I can change now\"\nmsgstr \"and all I can change now\"\n\n#. Key:\tintro_subtitle_3\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" intro subtitle line 3\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"is the future.\"\nmsgstr \"is the future.\"\n\n#. Key:\tlast_land\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an area\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Last Land\"\nmsgstr \"Last Land\"\n\n#. Key:\tlava_lair\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an area\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Lava Lair\"\nmsgstr \"Lava Lair\"\n\n#. Key:\tloading_tip_act1_0\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 1\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"In Ball form you go faster.\"\nmsgstr \"In Ball form you go faster.\"\n\n#. Key:\tloading_tip_act1_1\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 1\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"In Ball form you bounce back when you hit a surface.\"\nmsgstr \"In Ball form you bounce back when you hit a surface.\"\n\n#. Key:\tloading_tip_act1_2\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 1\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Each weapon has its own unique special strike.\"\nmsgstr \"Each weapon has its own unique special strike.\"\n\n#. Key:\tloading_tip_act1_3\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 1\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Most of the people died after Ruin happened, but there are still some survivors.\"\nmsgstr \"Most of the people died after Ruin happened, but there are still some survivors.\"\n\n#. Key:\tloading_tip_act1_4\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 1\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Some items can’t be used but merchants still like to buy them.\"\nmsgstr \"Some items can’t be used but merchants still like to buy them.\"\n\n#. Key:\tloading_tip_act1_5\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 1\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"There are many keys, and when I say many, I mean it.\"\nmsgstr \"There are many keys, and when I say many, I mean it.\"\n\n#. Key:\tloading_tip_act1_6\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 1\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"When you find an item it would make sense to check what it is, wouldn’t it?\"\nmsgstr \"When you find an item it would make sense to check what it is, wouldn’t it?\"\n\n#. Key:\tloading_tip_act1_7\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 1\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Spells can make combat easier.\"\nmsgstr \"Spells can make combat easier.\"\n\n#. Key:\tloading_tip_act1_8\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 1\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Dying often is absolutely normal. If you don’t die a lot, you are doing something wrong.\"\nmsgstr \"Dying often is absolutely normal. If you don’t die a lot, you are doing something wrong.\"\n\n#. Key:\tloading_tip_act1_9\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 1\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"You can always check the Sidenotes in your Inventory to see if you have any side quests.\"\nmsgstr \"You can always check the Sidenotes in your Inventory to see if you have any side quests.\"\n\n#. Key:\tloading_tip_act2_0\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Using the Railway can shorten your journey.\"\nmsgstr \"Using the Railway can shorten your journey.\"\n\n#. Key:\tloading_tip_act2_1\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"We’ll try to make our next game without any loading screens, we promise...\"\nmsgstr \"We’ll try to make our next game without any loading screens, we promise...\"\n\n#. Key:\tloading_tip_act2_2\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Choosing the right weapon against a Boss will make your life easier.\"\nmsgstr \"Choosing the right weapon against a Boss will make your life easier.\"\n\n#. Key:\tloading_tip_act2_3\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Don’t forget to use the Soulkeeper!\"\nmsgstr \"Don’t forget to use the Soulkeeper!\"\n\n#. Key:\tloading_tip_act2_4\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Finding the Artefacts might be hard, but this is your only chance to get out.\"\nmsgstr \"Finding the Artefacts might be hard, but this is your only chance to get out.\"\n\n#. Key:\tloading_tip_act2_5\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Talk to any Survivor if you can. They might be able to help you.\"\nmsgstr \"Talk to any Survivor if you can. They might be able to help you.\"\n\n#. Key:\tloading_tip_act2_6\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"If you find an area too difficult you can always go to another area first.\"\nmsgstr \"If you find an area too difficult you can always go to another area first.\"\n\n#. Key:\tloading_tip_act2_7\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Don’t forget to spend your gold! (Ad sponsored by Gnory)\"\nmsgstr \"Don’t forget to spend your gold! (Ad sponsored by Gnory)\"\n\n#. Key:\tloading_tip_act2_8\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Equipping the right items will make the combat easier.\"\nmsgstr \"Equipping the right items will make the combat easier.\"\n\n#. Key:\tloading_tip_act2_9\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"If you manage to defeat every member of a group you won’t have to fight them ever again.\"\nmsgstr \"If you manage to defeat every member of a group you won’t have to fight them ever again.\"\n\n#. Key:\tloading_tip_act3_0\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 3\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Using the Railway can also make your Journey longer.\"\nmsgstr \"Using the Railway can also make your Journey longer.\"\n\n#. Key:\tloading_tip_act3_1\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 3\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"If you got this far, you surely know everything now.\"\nmsgstr \"If you got this far, you surely know everything now.\"\n\n#. Key:\tloading_tip_act3_2\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 3\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Loading screen tips are very useful - except in a few cases.\"\nmsgstr \"Loading screen tips are very useful - except in a few cases.\"\n\n#. Key:\tloading_tip_act3_3\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 3\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Now is your time to think about the fate of the Ruined Realm.\"\nmsgstr \"Now is your time to think about the fate of the Ruined Realm.\"\n\n#. Key:\tloading_tip_act3_4\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 3\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"The End is near... I mean no loading screen can take forever, right?\"\nmsgstr \"The End is near... I mean no loading screen can take forever, right?\"\n\n#. Key:\tloading_tip_act3_5\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 3\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Now your only task is to bring the Artefacts to Wizard.\"\nmsgstr \"Now your only task is to bring the Artefacts to Wizard.\"\n\n#. Key:\tloading_tip_act3_6\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 3\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"If you find a combat too hard try to use different shards, spells, and weapons.\"\nmsgstr \"If you find a combat too hard try to use different shards, spells, and weapons.\"\n\n#. Key:\tloading_tip_act3_7\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 3\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Don’t give up! Victory is close.\"\nmsgstr \"Don’t give up! Victory is close.\"\n\n#. Key:\tloading_tip_end_0\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for epilogue\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"The Human Realm is a weird place...\"\nmsgstr \"The Human Realm is a weird place...\"\n\n#. Key:\tloading_tip_end_1\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for epilogue\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"You really did your part of the deal, now it’s time to go home!\"\nmsgstr \"You really did your part of the deal, now it’s time to go home!\"\n\n#. Key:\tloading_tip_end_2\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for epilogue\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Should you care about the fate of the Realms?\"\nmsgstr \"Should you care about the fate of the Realms?\"\n\n#. Key:\tloading_tip_end_3\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for epilogue\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Looks like it’s always you who has to take care of the mess others left behind.\"\nmsgstr \"Looks like it’s always you who has to take care of the mess others left behind.\"\n\n#. Key:\tloading_tip_end_4\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for epilogue\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Time to finish what you started. One way or another.\"\nmsgstr \"Time to finish what you started. One way or another.\"\n\n#. Key:\tlost_land\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an area\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Lost Land\"\nmsgstr \"Lost Land\"\n\n#. Key:\tobedient_outpost\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an area\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Obedient Outpost\"\nmsgstr \"Obedient Outpost\"\n\n#. Key:\tperfect_palace\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an area\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Perfect Palace\"\nmsgstr \"Perfect Palace\"\n\n#. Key:\tportal_place\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an area\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Portal Place\"\nmsgstr \"Portal Place\"\n\n#. Key:\tprogress_act1_arcade1\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Remnants of a Realm\"\nmsgstr \"Remnants of a Realm\"\n\n#. Key:\tprogress_act1_arcade2\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Discovering Ancient Technology\"\nmsgstr \"Discovering Ancient Technology\"\n\n#. Key:\tprogress_act1_before_raven\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Searching for a way out\"\nmsgstr \"Searching for a way out\"\n\n#. Key:\tprogress_act1_boss_fight\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Facing the Keeper\"\nmsgstr \"Facing the Keeper\"\n\n#. Key:\tprogress_act1_gem\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Looking for a Gem\"\nmsgstr \"Looking for a Gem\"\n\n#. Key:\tprogress_act1_infuse\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Infusing the Gem\"\nmsgstr \"Infusing the Gem\"\n\n#. Key:\tprogress_act1_portals\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Looking for a Portal\"\nmsgstr \"Looking for a Portal\"\n\n#. Key:\tprogress_act1_start\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Lost in Ruin\"\nmsgstr \"Lost in Ruin\"\n\n#. Key:\tprogress_act1_test_stone\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Bouncing Stones\"\nmsgstr \"Bouncing Stones\"\n\n#. Key:\tprogress_act1_tut1\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Am I Worthy?\"\nmsgstr \"Am I Worthy?\"\n\n#. Key:\tprogress_act1_tut2\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Sewer again\"\nmsgstr \"Sewer again\"\n\n#. Key:\tprogress_act1_tut3\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Third time Worthy\"\nmsgstr \"Third time Worthy\"\n\n#. Key:\tprogress_act2_crossroad\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"At a crossroad\"\nmsgstr \"At a crossroad\"\n\n#. Key:\tprogress_act2_dwarf_0\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Into the Blue\"\nmsgstr \"Into the Blue\"\n\n#. Key:\tprogress_act2_dwarf_1\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Elevator Gem and Key\"\nmsgstr \"Elevator Gem and Key\"\n\n#. Key:\tprogress_act2_dwarf_2\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Opening the Gate\"\nmsgstr \"Opening the Gate\"\n\n#. Key:\tprogress_act2_dwarf_boss\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Dwarven Statue\"\nmsgstr \"Dwarven Statue\"\n\n#. Key:\tprogress_act2_end\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"To the Fourth Station\"\nmsgstr \"To the Fourth Station\"\n\n#. Key:\tprogress_act2_lava_0\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Into the Red\"\nmsgstr \"Into the Red\"\n\n#. Key:\tprogress_act2_lava_1\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Uniting Key Pieces\"\nmsgstr \"Uniting Key Pieces\"\n\n#. Key:\tprogress_act2_lava_2\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Climbing the Tower\"\nmsgstr \"Climbing the Tower\"\n\n#. Key:\tprogress_act2_lava_boss\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Armour Wrath\"\nmsgstr \"Armour Wrath\"\n\n#. Key:\tprogress_act2_ww_0\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Into the Green\"\nmsgstr \"Into the Green\"\n\n#. Key:\tprogress_act2_ww_1\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Through the Lake\"\nmsgstr \"Through the Lake\"\n\n#. Key:\tprogress_act2_ww_2\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Being Followed\"\nmsgstr \"Being Followed\"\n\n#. Key:\tprogress_act2_ww_boss\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Fallen Druid\"\nmsgstr \"Fallen Druid\"\n\n#. Key:\tprogress_act3_floating\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in act 3\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Floating\"\nmsgstr \"Floating\"\n\n#. Key:\tprogress_act3_monk\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in act 3\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Monk's Home\"\nmsgstr \"Monk's Home\"\n\n#. Key:\tprogress_act3_pipes\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in act 3\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Moving Pipes\"\nmsgstr \"Moving Pipes\"\n\n#. Key:\tprogress_act3_start\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in act 3\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Lost in the Caves\"\nmsgstr \"Lost in the Caves\"\n\n#. Key:\tprogress_act3_way_out\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in act 3\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Way out of the Realm\"\nmsgstr \"Way out of the Realm\"\n\n#. Key:\tprogress_epilogue_boss\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in epilogue\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"The Real Demon\"\nmsgstr \"The Real Demon\"\n\n#. Key:\tprogress_epilogue_castle\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in epilogue\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Wizard's Castle\"\nmsgstr \"Wizard's Castle\"\n\n#. Key:\tprogress_epilogue_past_and_future\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in epilogue\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Past and Future\"\nmsgstr \"Past and Future\"\n\n#. Key:\tprogress_epilogue_save_creatures\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in epilogue\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Chance for everyone\"\nmsgstr \"Chance for everyone\"\n\n#. Key:\tprogress_epilogue_separate_worlds\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in epilogue\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Separated Worlds\"\nmsgstr \"Separated Worlds\"\n\n#. Key:\tprologue\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"text displayed on black screen the first time a chapter is started\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Prologue\"\nmsgstr \"Prologue\"\n\n#. Key:\tremnant_road\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an area\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Remnant Road\"\nmsgstr \"Remnant Road\"\n\n#. Key:\truined_realm\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Ruined Realm\"\nmsgstr \"Ruined Realm\"\n\n#. Key:\tsnake_slide\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an area\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Snake Slide\"\nmsgstr \"Snake Slide\"\n\n#. Key:\tsunken_sewer\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an area\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Sunken Sewer\"\nmsgstr \"Sunken Sewer\"\n\n#. Key:\twhite_wall\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"White Wall\"\nmsgstr \"White Wall\"\n\n#. Key:\twracked_waters\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an area\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Wracked Waters\"\nmsgstr \"Wracked Waters\"\n\n#. Key:\tcredits_fmod\n#. SourceLocation:\tLocalization/StringTables/Credits.csv\n#: Localization/StringTables/Credits.csv\nmsgctxt \"Credits\"\nmsgid \"Made with FMOD Studio by Firelight Technologies Pty Ltd.\"\nmsgstr \"Made with FMOD Studio by Firelight Technologies Pty Ltd.\"\n\n#. Key:\tMonthApril\n#. SourceLocation:\tSource/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:17\n#: Source/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:17\nmsgctxt \"DateTimeHelper\"\nmsgid \"April\"\nmsgstr \"April\"\n\n#. Key:\tMonthAugust\n#. SourceLocation:\tSource/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:21\n#: Source/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:21\nmsgctxt \"DateTimeHelper\"\nmsgid \"August\"\nmsgstr \"August\"\n\n#. Key:\tMonthDecember\n#. SourceLocation:\tSource/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:26\n#: Source/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:26\nmsgctxt \"DateTimeHelper\"\nmsgid \"December\"\nmsgstr \"December\"\n\n#. Key:\tMonthFebruary\n#. SourceLocation:\tSource/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:15\n#: Source/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:15\nmsgctxt \"DateTimeHelper\"\nmsgid \"February\"\nmsgstr \"February\"\n\n#. Key:\tMonthJanuary\n#. SourceLocation:\tSource/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:14\n#: Source/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:14\nmsgctxt \"DateTimeHelper\"\nmsgid \"January\"\nmsgstr \"January\"\n\n#. Key:\tMonthJuly\n#. SourceLocation:\tSource/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:20\n#: Source/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:20\nmsgctxt \"DateTimeHelper\"\nmsgid \"July\"\nmsgstr \"July\"\n\n#. Key:\tMonthJune\n#. SourceLocation:\tSource/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:19\n#: Source/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:19\nmsgctxt \"DateTimeHelper\"\nmsgid \"June\"\nmsgstr \"June\"\n\n#. Key:\tMonthMarch\n#. SourceLocation:\tSource/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:16\n#: Source/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:16\nmsgctxt \"DateTimeHelper\"\nmsgid \"March\"\nmsgstr \"March\"\n\n#. Key:\tMonthMay\n#. SourceLocation:\tSource/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:18\n#: Source/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:18\nmsgctxt \"DateTimeHelper\"\nmsgid \"May\"\nmsgstr \"May\"\n\n#. Key:\tMonthNovember\n#. SourceLocation:\tSource/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:24\n#: Source/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:24\nmsgctxt \"DateTimeHelper\"\nmsgid \"November\"\nmsgstr \"November\"\n\n#. Key:\tMonthOctober\n#. SourceLocation:\tSource/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:23\n#: Source/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:23\nmsgctxt \"DateTimeHelper\"\nmsgid \"October\"\nmsgstr \"October\"\n\n#. Key:\tMonthSeptember\n#. SourceLocation:\tSource/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:22\n#: Source/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:22\nmsgctxt \"DateTimeHelper\"\nmsgid \"September\"\nmsgstr \"September\"\n\n#. Key:\tSecondsToTime\n#. SourceLocation:\tSource/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:48\n#: Source/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:48\nmsgctxt \"DateTimeHelper\"\nmsgid \"{Minutes}:{Seconds}\"\nmsgstr \"{Minutes}:{Seconds}\"\n\n#. Key:\tSecondsToTimeMinusSeconds\n#. SourceLocation:\tSource/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:51\n#: Source/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:51\nmsgctxt \"DateTimeHelper\"\nmsgid \"{Hours}:{Minutes}:{Seconds}\"\nmsgstr \"{Hours}:{Minutes}:{Seconds}\"\n\n#. Key:\tchar_name_ball_e\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"possible display name for character\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"BALL-E\"\nmsgstr \"BALL-E\"\n\n#. Key:\tchar_name_destroyer\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"possible display name for character\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Destroyer\"\nmsgstr \"Destroyer\"\n\n#. Key:\tchar_name_dont_buy\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"possible display name for character\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Don't buy\"\nmsgstr \"Don't buy\"\n\n#. Key:\tchar_name_dr_ball\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"possible display name for character\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Dr. Ball\"\nmsgstr \"Dr. Ball\"\n\n#. Key:\tchar_name_epic_sphero\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"possible display name for character\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Epic Sphero\"\nmsgstr \"Epic Sphero\"\n\n#. Key:\tchar_name_failed_one\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"possible display name for character\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Failed One\"\nmsgstr \"Failed One\"\n\n#. Key:\tchar_name_saviour\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"possible display name for character\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Saviour\"\nmsgstr \"Saviour\"\n\n#. Key:\tchar_name_sorbcerer\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"possible display name for character\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Sorbcerer\"\nmsgstr \"Sorbcerer\"\n\n#. Key:\tchar_name_spirit_of_the_unknown\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"possible display name for character\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Spirit Of the Unknown\"\nmsgstr \"Spirit Of the Unknown\"\n\n#. Key:\tchar_name_ultimate_frisbee\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"possible display name for character\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Ultimate Frisbee\"\nmsgstr \"Ultimate Frisbee\"\n\n#. Key:\tchar_name_wanderer\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"possible display name for character\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Wanderer\"\nmsgstr \"Wanderer\"\n\n#. Key:\tchar_name_warlorb\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"possible display name for character\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Warlorb\"\nmsgstr \"Warlorb\"\n\n#. Key:\tchar_name_warriorb\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"possible display name for character\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"WarriOrb\"\nmsgstr \"WarriOrb\"\n\n#. Key:\tfinish\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"default option\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Finish\"\nmsgstr \"Finish\"\n\n#. Key:\tgold_gained\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"{0} Gold Gained\"\nmsgstr \"{0} Gold Gained\"\n\n#. Key:\tgold_lost\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"{0} Gold Lost\"\nmsgstr \"{0} Gold Lost\"\n\n#. Key:\titem_gained\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"{ItemName} gained!\"\nmsgstr \"{ItemName} gained!\"\n\n#. Key:\titem_gained_n\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"{Amount} {ItemName} gained!\"\nmsgstr \"{Amount} {ItemName} gained!\"\n\n#. Key:\titem_lost\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"{ItemName} lost!\"\nmsgstr \"{ItemName} lost!\"\n\n#. Key:\titem_lost_n\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"{Amount} {ItemName} lost!\"\nmsgstr \"{Amount} {ItemName} lost!\"\n\n#. Key:\tnext\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"default option\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Next\"\nmsgstr \"Next\"\n\n#. Key:\tnpc_altar\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"npc if BPLanguage Improver\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Altar\"\nmsgstr \"Altar\"\n\n#. Key:\tnpc_ancient_gate\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an npc\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Ancient Gate\"\nmsgstr \"Ancient Gate\"\n\n#. Key:\tnpc_demon_lillian\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"name of the final boss\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Demon Lillian\"\nmsgstr \"Demon Lillian\"\n\n#. Key:\tnpc_dwarven_workshop\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"name of the place the character can have a dialogue to craft a quest item\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Dwarven Workshop\"\nmsgstr \"Dwarven Workshop\"\n\n#. Key:\tnpc_fishy\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"display name of an npc\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Fishy\"\nmsgstr \"Fishy\"\n\n#. Key:\tnpc_fountain\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"display name of a fountain the character can talk with\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Fountain\"\nmsgstr \"Fountain\"\n\n#. Key:\tnpc_gatekeeper\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an npc\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Gatekeeper\"\nmsgstr \"Gatekeeper\"\n\n#. Key:\tnpc_ghost_dwarf\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an npc (actually a ghost of a dwarf)\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Ghost Dwarf\"\nmsgstr \"Ghost Dwarf\"\n\n#. Key:\tnpc_gnory\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an npc\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Gnory\"\nmsgstr \"Gnory\"\n\n#. Key:\tnpc_golem_maker\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an npc\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Golem Maker\"\nmsgstr \"Golem Maker\"\n\n#. Key:\tnpc_lory\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an npc\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Lory\"\nmsgstr \"Lory\"\n\n#. Key:\tnpc_lory_unkown\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"display name of Lory before she introduces herself\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Gnome Lady\"\nmsgstr \"Gnome Lady\"\n\n#. Key:\tnpc_magic_mirror\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an npc\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Magic Mirror\"\nmsgstr \"Magic Mirror\"\n\n#. Key:\tnpc_merchant\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an npc\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Merch Ant\"\nmsgstr \"Merch Ant\"\n\n#. Key:\tnpc_merchant_voice\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"name of a small ant until he says his name (only a voice cause player can not see it)\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Voice\"\nmsgstr \"Voice\"\n\n#. Key:\tnpc_monk\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an npc\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Monk\"\nmsgstr \"Monk\"\n\n#. Key:\tnpc_name_kobold\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Kobold Chef\"\nmsgstr \"Kobold Chef\"\n\n#. Key:\tnpc_pipe_walker\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"display name of some weird creatures\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Pipe Walker\"\nmsgstr \"Pipe Walker\"\n\n#. Key:\tnpc_raven\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an npc (he is actually a bird)\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Raven\"\nmsgstr \"Raven\"\n\n#. Key:\tnpc_scholar\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an npc\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Scholar\"\nmsgstr \"Scholar\"\n\n#. Key:\tnpc_secret_hideout\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"display name of a door asking for a password\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Secret Hideout Gate\"\nmsgstr \"Secret Hideout Gate\"\n\n#. Key:\tnpc_sewer_creature\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an npc\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Sewer Creature\"\nmsgstr \"Sewer Creature\"\n\n#. Key:\tnpc_statue\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an npc\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Statue\"\nmsgstr \"Statue\"\n\n#. Key:\tnpc_supper_dwarf\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"display name of an npc. Supper refers here an evening meal, typically a light or informal one.\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Supper Dwarf\"\nmsgstr \"Supper Dwarf\"\n\n#. Key:\tnpc_teachy\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an npc\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Teachy\"\nmsgstr \"Teachy\"\n\n#. Key:\tnpc_teachy_unkown\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"name of Teachy before introduction\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Bored Gnome\"\nmsgstr \"Bored Gnome\"\n\n#. Key:\tnpc_tomb\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"display name of a tomb a character can talk to\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Tomb\"\nmsgstr \"Tomb\"\n\n#. Key:\tnpc_unknown_wizard\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"display name of an npc\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Unknown Wizard\"\nmsgstr \"Unknown Wizard\"\n\n#. Key:\tnpc_wizard\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"display name of the wizard npc\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Wizard\"\nmsgstr \"Wizard\"\n\n#. Key:\t022227664F6F422B20B109A19B8789AA\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"I’m glad you are back again!\"\nmsgstr \"I’m glad you are back again!\"\n\n#. Key:\t0944D8A541F933BEB5DD068CA9099075\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_44.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_44.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"I think I managed to activate the device on the wall of the Portal Tower.\"\nmsgstr \"I think I managed to activate the device on the wall of the Portal Tower.\"\n\n#. Key:\t10ADF4F948FB99445BF791BB0722AD90\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_25.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_25.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Good idea.\"\nmsgstr \"Good idea.\"\n\n#. Key:\t137B87BB447D45E46C0425A940E8B7F0\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_46.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_46.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"You said you wouldn't do it...\"\nmsgstr \"You said you wouldn't do it...\"\n\n#. Key:\t16358AE840D8B8553E8930A3B7E69BBA\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"You know, sometimes I miss the Pipewalkers...\"\nmsgstr \"You know, sometimes I miss the Pipewalkers...\"\n\n#. Key:\t1B9834C6405C60960F322585AB0F1704\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_38.Text\n#. Key:\t2189E8064ACF974902FBA49BD12D0F47\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_38.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Could you activate it for me?\"\nmsgstr \"Could you activate it for me?\"\n\n#. Key:\t274EB7AD410061E3E200A9813A54AB29\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"I think I've already done that.\"\nmsgstr \"I think I've already done that.\"\n\n#. Key:\t2A57878148EFCC8532E34CAE1B9C9A0F\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"You? I never thought I’ll see you in this shape again.\"\nmsgstr \"You? I never thought I’ll see you in this shape again.\"\n\n#. Key:\t3764BB48401ABEDCD125F186B4BF0E17\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"And it also attracts the Pipewalkers.\"\nmsgstr \"And it also attracts the Pipewalkers.\"\n\n#. Key:\t3A0924F7449355545C0A98B94994616B\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"I want to find my tribe.\"\nmsgstr \"I want to find my tribe.\"\n\n#. Key:\t3C0498284D71B7B64FEA4094F42A5502\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_23.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_23.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Do you think you will find Pipewalkers here?\"\nmsgstr \"Do you think you will find Pipewalkers here?\"\n\n#. Key:\t3DCACAB047175FB687542AB0CA25D972\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_38.Children(1).Children.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_38.Children(1).Children.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Decline\"\nmsgstr \"Decline\"\n\n#. Key:\t41C1FCA947041D49247FC8A157D7407F\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_52.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_52.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"All right, thank you.\"\nmsgstr \"All right, thank you.\"\n\n#. Key:\t43C8FE9248340E49F1F31882D7B96642\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"If they are still alive they must be beyond that Purple Portal.\"\nmsgstr \"If they are still alive they must be beyond that Purple Portal.\"\n\n#. Key:\t444DD931423A98C7DD95D4BB73F0F1C6\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_39.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_39.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Sure! I’ll see what I can do.\"\nmsgstr \"Sure! I’ll see what I can do.\"\n\n#. Key:\t4FF2FA154BEFBD448EFDB0BB7FE3F0AF\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_11.Children(1).Children.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_11.Children(1).Children.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Tribe\"\nmsgstr \"Tribe\"\n\n#. Key:\t52A8B1F04C37F262E014DEA14AB68957\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Because I’m a chef.\"\nmsgstr \"Because I’m a chef.\"\n\n#. Key:\t5F376BF945B8CE4AA12B7EB05F8C62A5\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_11.Children(6).Children.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_11.Children(6).Children.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Leave\"\nmsgstr \"Leave\"\n\n#. Key:\t63EA4DDD45390542E3A904928143D9AF\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Haha... Yes I’m back again.\"\nmsgstr \"Haha... Yes I’m back again.\"\n\n#. Key:\t64EE856046A396F2750AE1BC1042CF26\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_30.Text\n#. Key:\tE3F52F4F47289406E4A546BB0BF3AC3F\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_50.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_30.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_50.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Thanks!\"\nmsgstr \"Thanks!\"\n\n#. Key:\t694B6E3F4F4C7CEAAACB51A2D30FFD26\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_11.Children(2).Children.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_11.Children(2).Children.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Ruin\"\nmsgstr \"Ruin\"\n\n#. Key:\t7304F1034A83C6D17E274090FA8E543B\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_41.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_41.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Thank you!\"\nmsgstr \"Thank you!\"\n\n#. Key:\t73240093450B12BEEA1EB78C9CF7D89E\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_11.Children(0).Children.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_11.Children(0).Children.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Purple Portal\"\nmsgstr \"Purple Portal\"\n\n#. Key:\t804671AF40165C92FA6A8F8A5AE97997\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_60.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_60.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Looks like I can’t get rid of this body.\"\nmsgstr \"Looks like I can’t get rid of this body.\"\n\n#. Key:\t807FF1A945548216DAD305B4D5A4437F\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_24.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_24.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"If there are any they will come here when they smell the soup.\"\nmsgstr \"If there are any they will come here when they smell the soup.\"\n\n#. Key:\t8240EF7946C8434333AFAEBEF3583917\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_34.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_34.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Do you need help with something?\"\nmsgstr \"Do you need help with something?\"\n\n#. Key:\t833BB4384231444247779CAB596D0259\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_40.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_40.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"I’m sorry but that sounds complicated.\"\nmsgstr \"I’m sorry but that sounds complicated.\"\n\n#. Key:\t85656A9E46844B03D49E13AC951FDE07\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_59.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_59.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"See you!\"\nmsgstr \"See you!\"\n\n#. Key:\t869485E24E19938DEE48BFB5C5240BB3\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_29.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_29.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"I’m not sure... but I have a key which might be useful.\"\nmsgstr \"I’m not sure... but I have a key which might be useful.\"\n\n#. Key:\t86FBA5A24734DD97167512A054A2E0D9\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Oh, it’s you.\"\nmsgstr \"Oh, it’s you.\"\n\n#. Key:\t891684A24BA64E351E7F0B9ADEA3D6DF\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"No. To be honest I don’t care much about Ruin.\"\nmsgstr \"No. To be honest I don’t care much about Ruin.\"\n\n#. Key:\t8FF6BF7B4745BB75C2D8F7873C492C2D\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_11.Children(4).Children.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_11.Children(4).Children.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Can I help?\"\nmsgstr \"Can I help?\"\n\n#. Key:\t93B13014434102C8033B41A06DBED69B\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_11.Children(5).Children.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_11.Children(5).Children.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Tower Device\"\nmsgstr \"Tower Device\"\n\n#. Key:\t95A7C27A44B78CBF17C1FD8C9446CBD7\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Take it! I still need some time to finish the soup anyway.\"\nmsgstr \"Take it! I still need some time to finish the soup anyway.\"\n\n#. Key:\t97E4FDC74B47A6037D6023A4C65B2934\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_37.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_37.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"If you activate it I’ll be able to use the portal to teleport to other places.\"\nmsgstr \"If you activate it I’ll be able to use the portal to teleport to other places.\"\n\n#. Key:\t9FD2679D44BEBBFBBAD2EAAECFFEE0D5\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_42.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_42.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"I can’t promise I’ll do that.\"\nmsgstr \"I can’t promise I’ll do that.\"\n\n#. Key:\tAA1C6EF444BAB6A929E953A87BB87ABB\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_56.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_56.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"I've got to go. See you soon!\"\nmsgstr \"I've got to go. See you soon!\"\n\n#. Key:\tAED4FBE3422E0FC4AC4BD38650F95CA9\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_26.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_26.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Thanks.\"\nmsgstr \"Thanks.\"\n\n#. Key:\tB0BAD1934671ADCB2DD1E1BA582E3C68\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Why are you making soup?\"\nmsgstr \"Why are you making soup?\"\n\n#. Key:\tB621AECE42A14A508C945595493F3A3A\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Really? Anyway, I’m happy to see you.\"\nmsgstr \"Really? Anyway, I’m happy to see you.\"\n\n#. Key:\tBA715D554C47932C092462B36ADEA081\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_58.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_58.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Good bye!\"\nmsgstr \"Good bye!\"\n\n#. Key:\tBE7B3444431F43E8E1487F8702B94845\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_57.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_57.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"It was nice to meet you.\"\nmsgstr \"It was nice to meet you.\"\n\n#. Key:\tC1BB24A443D4297B17E2F6A280B02E91\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_36.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_36.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Yes. According to a book I read here there is a device on the wall of the Portal Tower.\"\nmsgstr \"Yes. According to a book I read here there is a device on the wall of the Portal Tower.\"\n\n#. Key:\tC339B87742C2B475E2387F93418AA855\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Have you found out anything about Ruin?\"\nmsgstr \"Have you found out anything about Ruin?\"\n\n#. Key:\tC4D263AB48B800D5522A24923C541ED3\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_11.Children(3).Children.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_11.Children(3).Children.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Soup\"\nmsgstr \"Soup\"\n\n#. Key:\tC530096E4FA1A2B68077C3AD6AC1BF44\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_38.Children(0).Children.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_38.Children(0).Children.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Accept Quest\"\nmsgstr \"Accept Quest\"\n\n#. Key:\tC82668E6497A810FA6ADC0AB6F362B47\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"The soup is almost ready...\"\nmsgstr \"The soup is almost ready...\"\n\n#. Key:\tCD8CDA3443CDE79BE257B99A0801B209\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_43.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_43.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"No problem.\"\nmsgstr \"No problem.\"\n\n#. Key:\tD058108241051A9FD0D130B3C9EA4B8B\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"It helps me keep my mind clear.\"\nmsgstr \"It helps me keep my mind clear.\"\n\n#. Key:\tD8F879684C57BB474E7153B971073663\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_49.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_49.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Meanwhile I cooked something special for you. Take this!\"\nmsgstr \"Meanwhile I cooked something special for you. Take this!\"\n\n#. Key:\tDA9D493F42420BE9442B1EA983AEF9C2\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Any news on your lost tribe?\"\nmsgstr \"Any news on your lost tribe?\"\n\n#. Key:\tDE2390ED4366A621E4D220A3761333DE\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_54.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_54.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"I need to go now.\"\nmsgstr \"I need to go now.\"\n\n#. Key:\tDE668E4B4A3D0F785A693B9190E635D3\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_47.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_47.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"How on earth have you managed to reach this node?\"\nmsgstr \"How on earth have you managed to reach this node?\"\n\n#. Key:\tE29E2D044497A86DD0FCA8B540703597\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_48.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_48.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Pls. report it as a bug.\"\nmsgstr \"Pls. report it as a bug.\"\n\n#. Key:\tE6D3401944B2FF128DD1689F5159AF96\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_45.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_45.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Nice, well done!\"\nmsgstr \"Nice, well done!\"\n\n#. Key:\tE83287164D066CCE8FBFDE835FBD4CFB\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_55.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_55.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"I'm on my way. Take care!\"\nmsgstr \"I'm on my way. Take care!\"\n\n#. Key:\tEBC97F7C45858FE6DC72209536FC5C3B\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_27.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_27.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Do you know how can I reach that Purple Portal?\"\nmsgstr \"Do you know how can I reach that Purple Portal?\"\n\n#. Key:\tF911D6CB45AA59448C03379A1C07DD60\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_51.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_51.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"It wasn’t that complicated after all.\"\nmsgstr \"It wasn’t that complicated after all.\"\n\n#. Key:\tF9EBA1684D435C8AEB14129A7B57A604\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"I think they came here and followed the messages just like you.\"\nmsgstr \"I think they came here and followed the messages just like you.\"\n\n#. Key:\t3DAA74ED48BE31E35D868FB1492E57A8\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/WW_Pergamen.WW_Pergamen:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/WhiteWall/WW_Pergamen.WW_Pergamen:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_WW_Pergamen\"\nmsgid \"'Ruin took over some of us. It's no longer safe here.'\"\nmsgstr \"'Ruin took over some of us. It's no longer safe here.'\"\n\n#. Key:\tB10818134FFE3A1E99A9D789BFABBBEE\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/WW_Pergamen.WW_Pergamen:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/WhiteWall/WW_Pergamen.WW_Pergamen:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_WW_Pergamen\"\nmsgid \"'Come visit us beyond the Purple Portal!'\"\nmsgstr \"'Come visit us beyond the Purple Portal!'\"\n\n#. Key:\tD292364A4E58F52FB874AA98C1F969A6\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/WW_Pergamen.WW_Pergamen:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/WhiteWall/WW_Pergamen.WW_Pergamen:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_WW_Pergamen\"\nmsgid \"'We are close to the solution, but your help is still needed.'\"\nmsgstr \"'We are close to the solution, but your help is still needed.'\"\n\n#. Key:\t0CD0FD884718EF68B38D578CDE17110A\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/WW_Statue.WW_Statue:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/WhiteWall/WW_Statue.WW_Statue:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_WW_Statue\"\nmsgid \"Oooops...\"\nmsgstr \"Oooops...\"\n\n#. Key:\t2D531D384CB6A56DBC4834BD229622E7\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/WW_Statue.WW_Statue:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/WhiteWall/WW_Statue.WW_Statue:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_WW_Statue\"\nmsgid \"'White Wall will never fall!'\"\nmsgstr \"'White Wall will never fall!'\"\n\n#. Key:\t2690E77045D5E42F32AC6582BAFF27AA\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/WW_StatueWelcome.WW_StatueWelcome:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/WhiteWall/WW_StatueWelcome.WW_StatueWelcome:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_WW_StatueWelcome\"\nmsgid \"'We know how to stop Ruin.'\"\nmsgstr \"'We know how to stop Ruin.'\"\n\n#. Key:\t7C3340434A4C80010AC2D58BF8504339\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/WW_StatueWelcome.WW_StatueWelcome:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/WhiteWall/WW_StatueWelcome.WW_StatueWelcome:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_WW_StatueWelcome\"\nmsgid \"'There is still hope.'\"\nmsgstr \"'There is still hope.'\"\n\n#. Key:\tarmour_wrath_name\n#. SourceLocation:\tLocalization/StringTables/Enemies.csv\n#. InfoMetaData:\t\"Comment\" : \"display name of an npc boss\"\n#: Localization/StringTables/Enemies.csv\nmsgctxt \"Enemies\"\nmsgid \"Armour Wrath\"\nmsgstr \"Armour Wrath\"\n\n#. Key:\tdwarf_name\n#. SourceLocation:\tLocalization/StringTables/Enemies.csv\n#. InfoMetaData:\t\"Comment\" : \"display name of an npc boss\"\n#: Localization/StringTables/Enemies.csv\nmsgctxt \"Enemies\"\nmsgid \"Dwarf\"\nmsgstr \"Dwarf\"\n\n#. Key:\tfallen_druid_name\n#. SourceLocation:\tLocalization/StringTables/Enemies.csv\n#. InfoMetaData:\t\"Comment\" : \"display name of an npc boss\"\n#: Localization/StringTables/Enemies.csv\nmsgctxt \"Enemies\"\nmsgid \"Fallen Druid\"\nmsgstr \"Fallen Druid\"\n\n#. Key:\tdreamhack_completed_desc\n#. SourceLocation:\tLocalization/StringTables/Episodes.csv\n#: Localization/StringTables/Episodes.csv\nmsgctxt \"Episodes\"\nmsgid \"Thanks for playing the game, we hope you had a great time!\"\nmsgstr \"Thanks for playing the game, we hope you had a great time!\"\n\n#. Key:\tdreamhack_completed_subtitle\n#. SourceLocation:\tLocalization/StringTables/Episodes.csv\n#: Localization/StringTables/Episodes.csv\nmsgctxt \"Episodes\"\nmsgid \"Dreamhack Demo\"\nmsgstr \"Dreamhack Demo\"\n\n#. Key:\tdreamhack_desc\n#. SourceLocation:\tLocalization/StringTables/Episodes.csv\n#: Localization/StringTables/Episodes.csv\nmsgctxt \"Episodes\"\nmsgid \"What happens when you lock a mighty demon's spirit inside a ball body?\"\nmsgstr \"What happens when you lock a mighty demon's spirit inside a ball body?\"\n\n#. Key:\tdreamhack_friendly_name\n#. SourceLocation:\tLocalization/StringTables/Episodes.csv\n#: Localization/StringTables/Episodes.csv\nmsgctxt \"Episodes\"\nmsgid \"Dreamhack\"\nmsgstr \"Dreamhack\"\n\n#. Key:\tepisode_end_main_title\n#. SourceLocation:\tLocalization/StringTables/Episodes.csv\n#. InfoMetaData:\t\"Comment\" : \"episode map end panel text\"\n#: Localization/StringTables/Episodes.csv\nmsgctxt \"Episodes\"\nmsgid \"Episode Completed!\"\nmsgstr \"Episode Completed!\"\n\n#. Key:\tescape_darkness_completed_desc\n#. SourceLocation:\tLocalization/StringTables/Episodes.csv\n#: Localization/StringTables/Episodes.csv\nmsgctxt \"Episodes\"\nmsgid \"\\\"And as Darkness spreads an unknown Warriorb will rise...\\\"\"\nmsgstr \"\\\"And as Darkness spreads an unknown Warriorb will rise...\\\"\"\n\n#. Key:\tescape_darkness_completed_subtitle\n#. SourceLocation:\tLocalization/StringTables/Episodes.csv\n#: Localization/StringTables/Episodes.csv\nmsgctxt \"Episodes\"\nmsgid \"Escaped from Darkness\"\nmsgstr \"Escaped from Darkness\"\n\n#. Key:\tescape_darkness_desc\n#. SourceLocation:\tLocalization/StringTables/Episodes.csv\n#: Localization/StringTables/Episodes.csv\nmsgctxt \"Episodes\"\nmsgid \"Are you fast enough to race against Darkness itself?\"\nmsgstr \"Are you fast enough to race against Darkness itself?\"\n\n#. Key:\tescape_darkness_friendly_name\n#. SourceLocation:\tLocalization/StringTables/Episodes.csv\n#: Localization/StringTables/Episodes.csv\nmsgctxt \"Episodes\"\nmsgid \"Escape Darkness\"\nmsgstr \"Escape Darkness\"\n\n#. Key:\twhite_wall_completed_desc\n#. SourceLocation:\tLocalization/StringTables/Episodes.csv\n#. InfoMetaData:\t\"Comment\" : \"short text on the ending panel when player finishes this episode\"\n#: Localization/StringTables/Episodes.csv\nmsgctxt \"Episodes\"\nmsgid \"What happened beyond the portal is another story, which will be told at another time.\"\nmsgstr \"What happened beyond the portal is another story, which will be told at another time.\"\n\n#. Key:\twhite_wall_completed_subtitle\n#. SourceLocation:\tLocalization/StringTables/Episodes.csv\n#. InfoMetaData:\t\"Comment\" : \"subtitle of the ending panel when player finishes this episode\"\n#. Key:\twhite_wall_friendly_name\n#. InfoMetaData:\t\"Comment\" : \"name the episode is displayed with in the ui\"\n#: Localization/StringTables/Episodes.csv\nmsgctxt \"Episodes\"\nmsgid \"White Wall\"\nmsgstr \"White Wall\"\n\n#. Key:\twhite_wall_desc\n#. SourceLocation:\tLocalization/StringTables/Episodes.csv\n#. InfoMetaData:\t\"Comment\" : \"map desc when the player can select the episode\"\n#: Localization/StringTables/Episodes.csv\nmsgctxt \"Episodes\"\nmsgid \"Although it's long abandoned the fortress of White Wall still stands against Ruin. After centuries of silence some groups of unexpected visitors broke the loneliness of the decaying city.\"\nmsgstr \"Although it's long abandoned the fortress of White Wall still stands against Ruin. After centuries of silence some groups of unexpected visitors broke the loneliness of the decaying city.\"\n\n#. Key:\twhite_wall_loadingscreen_desc\n#. SourceLocation:\tLocalization/StringTables/Episodes.csv\n#. InfoMetaData:\t\"Comment\" : \"text on loading screen\"\n#: Localization/StringTables/Episodes.csv\nmsgctxt \"Episodes\"\nmsgid \"After months of researching I found a way to return back to the Ruined Realm. Ironically enough I have to use the same body I was trapped in before. I'll need to be quick and clever for this might be my very last chance to stop Ruin before it devours the World.\"\nmsgstr \"After months of researching I found a way to return back to the Ruined Realm. Ironically enough I have to use the same body I was trapped in before. I'll need to be quick and clever for this might be my very last chance to stop Ruin before it devours the World.\"\n\n#. Key:\tchar_vo_armourwrath_attack_clap\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I won't fail the Maker!\"\nmsgstr \"I won't fail the Maker!\"\n\n#. Key:\tchar_vo_armourwrath_attack_die\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"No... I'm still... perfect\"\nmsgstr \"No... I'm still... perfect\"\n\n#. Key:\tchar_vo_armourwrath_attack_magic\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Resist Ruin!\"\nmsgstr \"Resist Ruin!\"\n\n#. Key:\tchar_vo_armourwrath_attack_strike_down\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Out of my way!\"\nmsgstr \"Out of my way!\"\n\n#. Key:\tchar_vo_armourwrath_attack_strike_down_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I am perfect\"\nmsgstr \"I am perfect\"\n\n#. Key:\tchar_vo_dwarvenstatue_attack_axe_point\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I keep Ruin\"\nmsgstr \"I keep Ruin\"\n\n#. Key:\tchar_vo_dwarvenstatue_attack_axe_strike_down\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"We are above the Law!\"\nmsgstr \"We are above the Law!\"\n\n#. Key:\tchar_vo_dwarvenstatue_attack_meteor\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I can take more!\"\nmsgstr \"I can take more!\"\n\n#. Key:\tchar_vo_dwarvenstatue_die\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I won't move... again\"\nmsgstr \"I won't move... again\"\n\n#. Key:\tchar_vo_dwarvenstatue_shield_knock\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I hold it back!\"\nmsgstr \"I hold it back!\"\n\n#. Key:\tchar_vo_fallendruid_attack_flybug\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"It's safe here.\"\nmsgstr \"It's safe here.\"\n\n#. Key:\tchar_vo_fallendruid_attack_spike\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"This place shall stand!\"\nmsgstr \"This place shall stand!\"\n\n#. Key:\tchar_vo_fallendruid_attack_tendril\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Nature will survive!\"\nmsgstr \"Nature will survive!\"\n\n#. Key:\tchar_vo_fallendruid_attack_thorn_sphere\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Out with you, Ruin!\"\nmsgstr \"Out with you, Ruin!\"\n\n#. Key:\tchar_vo_fallendruid_die\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I have... failed\"\nmsgstr \"I have... failed\"\n\n#. Key:\tchar_vo_final_boss_p1_blue\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#. Key:\tchar_vo_final_boss_p2_blue\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I'm the daughter of the Wizard!\"\nmsgstr \"I'm the daughter of the Wizard!\"\n\n#. Key:\tchar_vo_final_boss_p1_green\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#. Key:\tchar_vo_final_boss_p2_red_up\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I can create!\"\nmsgstr \"I can create!\"\n\n#. Key:\tchar_vo_final_boss_p1_red\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I'm human!\"\nmsgstr \"I'm human!\"\n\n#. Key:\tchar_vo_final_boss_p2_green\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#. Key:\tchar_vo_final_boss_p3_green\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"That sounds funny!\"\nmsgstr \"That sounds funny!\"\n\n#. Key:\tchar_vo_final_boss_p2_red_down\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I can destroy!\"\nmsgstr \"I can destroy!\"\n\n#. Key:\tchar_vo_final_boss_p3_blue\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I'm free!\"\nmsgstr \"I'm free!\"\n\n#. Key:\tchar_vo_final_boss_p3_red\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"What makes you say that?\"\nmsgstr \"What makes you say that?\"\n\n#. Key:\tchar_vo_fishy_idle_hiss\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Hissing\"\nmsgstr \"Hissing\"\n\n#. Key:\tchar_vo_flybug_attack_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Huh! Surprised?\"\nmsgstr \"Huh! Surprised?\"\n\n#. Key:\tchar_vo_flybug_attack_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Take this!\"\nmsgstr \"Take this!\"\n\n#. Key:\tchar_vo_flybug_damaged_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Careful!\"\nmsgstr \"Careful!\"\n\n#. Key:\tchar_vo_flybug_damaged_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"It's not funny!\"\nmsgstr \"It's not funny!\"\n\n#. Key:\tchar_vo_flybug_die_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"All right, gg!\"\nmsgstr \"All right, gg!\"\n\n#. Key:\tchar_vo_flybug_idle_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"What is it like down there? Heh?\"\nmsgstr \"What is it like down there? Heh?\"\n\n#. Key:\tchar_vo_flybug_idle_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Easy man, easy!\"\nmsgstr \"Easy man, easy!\"\n\n#. Key:\tchar_vo_gatekeeper_attack_aimed\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Avoid these!\"\nmsgstr \"Avoid these!\"\n\n#. Key:\tchar_vo_gatekeeper_attack_aimed_phase_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Watch out where you bounce to!\"\nmsgstr \"Watch out where you bounce to!\"\n\n#. Key:\tchar_vo_gatekeeper_attack_electric_bubbles\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Attention to the heights!\"\nmsgstr \"Attention to the heights!\"\n\n#. Key:\tchar_vo_gatekeeper_attack_electric_bubbles_phase_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Attention to the heights again!\"\nmsgstr \"Attention to the heights again!\"\n\n#. Key:\tchar_vo_gatekeeper_attack_meteors\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Watch out for your head!\"\nmsgstr \"Watch out for your head!\"\n\n#. Key:\tchar_vo_gatekeeper_attack_shield\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Do you really think you are worthy?\"\nmsgstr \"Do you really think you are worthy?\"\n\n#. Key:\tchar_vo_ghostarmor__die\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I... don't...\"\nmsgstr \"I... don't...\"\n\n#. Key:\tchar_vo_ghostarmor_attack_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"You shall perish!\"\nmsgstr \"You shall perish!\"\n\n#. Key:\tchar_vo_ghostarmor_attack_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"For justice!\"\nmsgstr \"For justice!\"\n\n#. Key:\tchar_vo_ghostarmor_attack_fall\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Death to the outlaw!\"\nmsgstr \"Death to the outlaw!\"\n\n#. Key:\tchar_vo_ghostarmor_damaged_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Just a scratch.\"\nmsgstr \"Just a scratch.\"\n\n#. Key:\tchar_vo_ghostarmor_damaged_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"You... can't.\"\nmsgstr \"You... can't.\"\n\n#. Key:\tchar_vo_ghostarmor_idle_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"We keep the Wall.\"\nmsgstr \"We keep the Wall.\"\n\n#. Key:\tchar_vo_ghostarmor_idle_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Follow the rules!\"\nmsgstr \"Follow the rules!\"\n\n#. Key:\tchar_vo_ghosthelmet_attack_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Aaaaaaargh!\"\nmsgstr \"Aaaaaaargh!\"\n\n#. Key:\tchar_vo_ghosthelmet_attack_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Chaaaaaarge!\"\nmsgstr \"Chaaaaaarge!\"\n\n#. Key:\tchar_vo_ghosthelmet_damaged_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I'll need a blacksmith!\"\nmsgstr \"I'll need a blacksmith!\"\n\n#. Key:\tchar_vo_ghosthelmet_damaged_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Send someone for a hammer!\"\nmsgstr \"Send someone for a hammer!\"\n\n#. Key:\tchar_vo_ghosthelmet_die\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Be right back!\"\nmsgstr \"Be right back!\"\n\n#. Key:\tchar_vo_ghosthelmet_idle_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Use your head... or mine!\"\nmsgstr \"Use your head... or mine!\"\n\n#. Key:\tchar_vo_ghosthelmet_idle_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Let's head east!\"\nmsgstr \"Let's head east!\"\n\n#. Key:\tchar_vo_gnory_idle_humming\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Humming\"\nmsgstr \"Humming\"\n\n#. Key:\tchar_vo_gnory_idle_whistle\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Whistling\"\nmsgstr \"Whistling\"\n\n#. Key:\tchar_vo_golemmaker_idle_explain_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I create essence which resists the ruin.\"\nmsgstr \"I create essence which resists the ruin.\"\n\n#. Key:\tchar_vo_golemmaker_idle_mindlessly_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Knowledge is Lost, All is Lost.\"\nmsgstr \"Knowledge is Lost, All is Lost.\"\n\n#. Key:\tchar_vo_golemmaker_idle_mindlessly_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"All is Lost.\"\nmsgstr \"All is Lost.\"\n\n#. Key:\tchar_vo_golemmaker_idle_moan_aaahhh\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Aaahhh\"\nmsgstr \"Aaahhh\"\n\n#. Key:\tchar_vo_golemmaker_idle_moan_ooohhh\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Ooohhh\"\nmsgstr \"Ooohhh\"\n\n#. Key:\tchar_vo_golemmaker_idle_sad_onon\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Onon\"\nmsgstr \"Onon\"\n\n#. Key:\tchar_vo_golemmaker_idle_tries_to_remember\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Your words remind me of something.\"\nmsgstr \"Your words remind me of something.\"\n\n#. Key:\tchar_vo_koboldchef_idle_01\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Too hot!\"\nmsgstr \"Too hot!\"\n\n#. Key:\tchar_vo_koboldchef_idle_02\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"It needs more salt!\"\nmsgstr \"It needs more salt!\"\n\n#. Key:\tchar_vo_koboldchef_idle_03\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"It will be delicious.\"\nmsgstr \"It will be delicious.\"\n\n#. Key:\tchar_vo_koboldchef_idle_04\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Hmm...\"\nmsgstr \"Hmm...\"\n\n#. Key:\tchar_vo_lory_idle_croon\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Croon\"\nmsgstr \"Croon\"\n\n#. Key:\tchar_vo_lory_idle_humming_0\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Ohh\"\nmsgstr \"Ohh\"\n\n#. Key:\tchar_vo_lory_idle_humming_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#. Key:\tchar_vo_supperdwarf_idle_2_humming_1\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Hmmm\"\nmsgstr \"Hmmm\"\n\n#. Key:\tchar_vo_lory_idle_humming_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Ommm\"\nmsgstr \"Ommm\"\n\n#. Key:\tchar_vo_lory_idle_humming_3\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Auch\"\nmsgstr \"Auch\"\n\n#. Key:\tchar_vo_maintainer_attack_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Dinner is served!\"\nmsgstr \"Dinner is served!\"\n\n#. Key:\tchar_vo_maintainer_attack_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Now it's clean!\"\nmsgstr \"Now it's clean!\"\n\n#. Key:\tchar_vo_maintainer_damaged_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I'll need to be repaired.\"\nmsgstr \"I'll need to be repaired.\"\n\n#. Key:\tchar_vo_maintainer_damaged_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I still serve.\"\nmsgstr \"I still serve.\"\n\n#. Key:\tchar_vo_maintainer_die\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I'll need... replacement.\"\nmsgstr \"I'll need... replacement.\"\n\n#. Key:\tchar_vo_maintainer_elite_idle_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Serve...\"\nmsgstr \"Serve...\"\n\n#. Key:\tchar_vo_maintainer_elite_idle_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Order...\"\nmsgstr \"Order...\"\n\n#. Key:\tchar_vo_maintainer_idle_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"At your service.\"\nmsgstr \"At your service.\"\n\n#. Key:\tchar_vo_maintainer_idle_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Your order?\"\nmsgstr \"Your order?\"\n\n#. Key:\tchar_vo_maintainer_miniboss_attack_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"This is my order!\"\nmsgstr \"This is my order!\"\n\n#. Key:\tchar_vo_maintainer_miniboss_attack_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I'll reorganize!\"\nmsgstr \"I'll reorganize!\"\n\n#. Key:\tchar_vo_maintainer_miniboss_attack_meteor\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I'm above!\"\nmsgstr \"I'm above!\"\n\n#. Key:\tchar_vo_maintainer_miniboss_attack_spawn_enemy\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Order, order, order!\"\nmsgstr \"Order, order, order!\"\n\n#. Key:\tchar_vo_maintainer_miniboss_damaged_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I can fix this\"\nmsgstr \"I can fix this\"\n\n#. Key:\tchar_vo_maintainer_miniboss_damaged_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Don't do that again!\"\nmsgstr \"Don't do that again!\"\n\n#. Key:\tchar_vo_maintainer_miniboss_die\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I can't... I was... above.\"\nmsgstr \"I can't... I was... above.\"\n\n#. Key:\tchar_vo_primitivefishy_attack_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Srrrr!\"\nmsgstr \"Srrrr!\"\n\n#. Key:\tchar_vo_primitivefishy_attack_long_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Hurray!\"\nmsgstr \"Hurray!\"\n\n#. Key:\tchar_vo_primitivefishy_attack_long_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Flyyyyyyy!\"\nmsgstr \"Flyyyyyyy!\"\n\n#. Key:\tchar_vo_primitivefishy_damaged_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Uuush!\"\nmsgstr \"Uuush!\"\n\n#. Key:\tchar_vo_primitivefishy_damaged_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Shish!\"\nmsgstr \"Shish!\"\n\n#. Key:\tchar_vo_primitivefishy_die\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Fishy leaves.\"\nmsgstr \"Fishy leaves.\"\n\n#. Key:\tchar_vo_primitivefishy_idle_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I need some fish!\"\nmsgstr \"I need some fish!\"\n\n#. Key:\tchar_vo_primitivefishy_idle_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Did you hear that?\"\nmsgstr \"Did you hear that?\"\n\n#. Key:\tchar_vo_shade_attack_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Join me!\"\nmsgstr \"Join me!\"\n\n#. Key:\tchar_vo_shade_attack_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"You shall die too!\"\nmsgstr \"You shall die too!\"\n\n#. Key:\tchar_vo_shade_damaged_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Is this the end?\"\nmsgstr \"Is this the end?\"\n\n#. Key:\tchar_vo_shade_damaged_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Pain...\"\nmsgstr \"Pain...\"\n\n#. Key:\tchar_vo_shade_die\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Death... again?!\"\nmsgstr \"Death... again?!\"\n\n#. Key:\tchar_vo_shade_idle_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I can't rest.\"\nmsgstr \"I can't rest.\"\n\n#. Key:\tchar_vo_shade_idle_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Death is not peace.\"\nmsgstr \"Death is not peace.\"\n\n#. Key:\tchar_vo_shadesphere_attack_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I'll change you!\"\nmsgstr \"I'll change you!\"\n\n#. Key:\tchar_vo_shadesphere_attack_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Do not resist me!\"\nmsgstr \"Do not resist me!\"\n\n#. Key:\tchar_vo_shadesphere_damaged_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"It's still... me...\"\nmsgstr \"It's still... me...\"\n\n#. Key:\tchar_vo_shadesphere_damaged_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Why did you...?\"\nmsgstr \"Why did you...?\"\n\n#. Key:\tchar_vo_shadesphere_die\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"You changed... me?\"\nmsgstr \"You changed... me?\"\n\n#. Key:\tchar_vo_shadesphere_idle_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"What do you wish to be?\"\nmsgstr \"What do you wish to be?\"\n\n#. Key:\tchar_vo_shadesphere_idle_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Come to me!\"\nmsgstr \"Come to me!\"\n\n#. Key:\tchar_vo_supperdwarf_idle_1_eating_food_0\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Yum-yum hmmmm... delicious\"\nmsgstr \"Yum-yum hmmmm... delicious\"\n\n#. Key:\tchar_vo_supperdwarf_idle_1_eating_food_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Hmmm... tasty\"\nmsgstr \"Hmmm... tasty\"\n\n#. Key:\tchar_vo_supperdwarf_idle_1_eating_food_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Ehmmm... where is my spoon?\"\nmsgstr \"Ehmmm... where is my spoon?\"\n\n#. Key:\tchar_vo_supperdwarf_idle_2_humming_0\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Ehemm, ehemm\"\nmsgstr \"Ehemm, ehemm\"\n\n#. Key:\tchar_vo_supperdwarf_idle_2_humming_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Ohm\"\nmsgstr \"Ohm\"\n\n#. Key:\tchar_vo_teachy_idle_book_down_0\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Walking ball?\"\nmsgstr \"Walking ball?\"\n\n#. Key:\tchar_vo_teachy_idle_book_down_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"You?\"\nmsgstr \"You?\"\n\n#. Key:\tchar_vo_teachy_idle_book_down_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Do you exist outside of my mind?\"\nmsgstr \"Do you exist outside of my mind?\"\n\n#. Key:\tchar_vo_teachy_idle_book_down_3\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Ehm, what?\"\nmsgstr \"Ehm, what?\"\n\n#. Key:\tchar_vo_teachy_idle_book_up_0\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Ehmm\"\nmsgstr \"Ehmm\"\n\n#. Key:\tchar_vo_teachy_idle_book_up_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Humm\"\nmsgstr \"Humm\"\n\n#. Key:\tchar_vo_teachy_idle_book_up_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Hemm\"\nmsgstr \"Hemm\"\n\n#. Key:\tchar_vo_teachy_idle_book_up_3\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Ahm\"\nmsgstr \"Ahm\"\n\n#. Key:\tchar_vo_teachy_idle_humming_0\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Hmmm-hmmm-hmm\"\nmsgstr \"Hmmm-hmmm-hmm\"\n\n#. Key:\tchar_vo_teachy_idle_humming_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Ehmm-hmmm-uhmm\"\nmsgstr \"Ehmm-hmmm-uhmm\"\n\n#. Key:\tchar_vo_teachy_idle_humming_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Umm-huhummm\"\nmsgstr \"Umm-huhummm\"\n\n#. Key:\tchar_vo_teachy_idle_humming_speaking_long_0\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I am, therefore I think!\"\nmsgstr \"I am, therefore I think!\"\n\n#. Key:\tchar_vo_teachy_idle_humming_speaking_long_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I think... I am...\"\nmsgstr \"I think... I am...\"\n\n#. Key:\tchar_vo_teachy_idle_humming_speaking_long_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"The unexamined life is not worth living!\"\nmsgstr \"The unexamined life is not worth living!\"\n\n#. Key:\tchar_vo_teachy_idle_humming_speaking_long_3\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"The mind is furnished with ideas by a drunk upholsterer...\"\nmsgstr \"The mind is furnished with ideas by a drunk upholsterer...\"\n\n#. Key:\tchar_vo_teachy_idle_humming_speaking_short_0\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Tic-tac\"\nmsgstr \"Tic-tac\"\n\n#. Key:\tchar_vo_teachy_idle_humming_speaking_short_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"To be...\"\nmsgstr \"To be...\"\n\n#. Key:\tchar_vo_teachy_idle_humming_speaking_short_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Weird\"\nmsgstr \"Weird\"\n\n#. Key:\tAnyKey\n#. SourceLocation:\tSource/SOrb/Settings/Input/SoInputNames.cpp:347\n#: Source/SOrb/Settings/Input/SoInputNames.cpp:347\nmsgctxt \"InputKeys\"\nmsgid \"Any Key\"\nmsgstr \"Any Key\"\n\n#. Key:\tDown\n#. SourceLocation:\tSource/SOrb/Settings/Input/SoInputNames.cpp:376\n#: Source/SOrb/Settings/Input/SoInputNames.cpp:376\nmsgctxt \"InputKeys\"\nmsgid \"Down\"\nmsgstr \"Down\"\n\n#. Key:\tLeft\n#. SourceLocation:\tSource/SOrb/Settings/Input/SoInputNames.cpp:373\n#: Source/SOrb/Settings/Input/SoInputNames.cpp:373\nmsgctxt \"InputKeys\"\nmsgid \"Left\"\nmsgstr \"Left\"\n\n#. Key:\tRight\n#. SourceLocation:\tSource/SOrb/Settings/Input/SoInputNames.cpp:375\n#: Source/SOrb/Settings/Input/SoInputNames.cpp:375\nmsgctxt \"InputKeys\"\nmsgid \"Right\"\nmsgstr \"Right\"\n\n#. Key:\tUp\n#. SourceLocation:\tSource/SOrb/Settings/Input/SoInputNames.cpp:374\n#: Source/SOrb/Settings/Input/SoInputNames.cpp:374\nmsgctxt \"InputKeys\"\nmsgid \"Up\"\nmsgstr \"Up\"\n\n#. Key:\tabsorb_energy\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Absorb Energy\"\nmsgstr \"Absorb Energy\"\n\n#. Key:\tacquired_few_item\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"message when more than one item is received at once\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"A few items acquired\"\nmsgstr \"A few items acquired\"\n\n#. Key:\tacquired_item\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"{0} is replaced with an item name\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"{0} acquired\"\nmsgstr \"{0} acquired\"\n\n#. Key:\tactivate\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Activate\"\nmsgstr \"Activate\"\n\n#. Key:\tactivate_elevator\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Activate Elevator\"\nmsgstr \"Activate Elevator\"\n\n#. Key:\taquired_silver_key\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"optional bonus message\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Silver Key Acquired\"\nmsgstr \"Silver Key Acquired\"\n\n#. Key:\tascend\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"climb up a ladder or rope or go up with an elevator\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Ascend\"\nmsgstr \"Ascend\"\n\n#. Key:\tbed\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"examine Bed\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Bed\"\nmsgstr \"Bed\"\n\n#. Key:\tboat_to_kitchen\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"use a boat to get to the kitchen\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Boat to the Kitchen\"\nmsgstr \"Boat to the Kitchen\"\n\n#. Key:\tboat_to_ruins\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"use a boat to get to a place where there are some ancient ruins\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Boat to the Ruins\"\nmsgstr \"Boat to the Ruins\"\n\n#. Key:\tboat_to_station\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"use a boat to get to the Station\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Boat to the Station\"\nmsgstr \"Boat to the Station\"\n\n#. Key:\tcall_elevator\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Call Elevator\"\nmsgstr \"Call Elevator\"\n\n#. Key:\tcandles\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"examine Candles\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Candles\"\nmsgstr \"Candles\"\n\n#. Key:\tcat_bed\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"examine Tabbys (cat name) bed\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Tabby's Bed\"\nmsgstr \"Tabby's Bed\"\n\n#. Key:\tchair\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"examine Chair\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Chair\"\nmsgstr \"Chair\"\n\n#. Key:\tchange_spells\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Change Spells\"\nmsgstr \"Change Spells\"\n\n#. Key:\tcharge\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"charge gem in Act I\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Charge\"\nmsgstr \"Charge\"\n\n#. Key:\tcheck_door\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"check door \"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Check Door\"\nmsgstr \"Check Door\"\n\n#. Key:\tchest\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"examine Chest\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Chest\"\nmsgstr \"Chest\"\n\n#. Key:\tchest_check\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Check Chest\"\nmsgstr \"Check Chest\"\n\n#. Key:\tchest_check_small\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Check Small Chest\"\nmsgstr \"Check Small Chest\"\n\n#. Key:\tchest_close\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Close Chest\"\nmsgstr \"Close Chest\"\n\n#. Key:\tchest_close_small\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Close Small Chest\"\nmsgstr \"Close Small Chest\"\n\n#. Key:\tchest_open\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Open Chest\"\nmsgstr \"Open Chest\"\n\n#. Key:\tchest_open_small\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Open Small Chest\"\nmsgstr \"Open Small Chest\"\n\n#. Key:\tclose_door\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Close Door\"\nmsgstr \"Close Door\"\n\n#. Key:\tcross_planks\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Cross Planks\"\nmsgstr \"Cross Planks\"\n\n#. Key:\tdads_room\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"examine Dad's Room\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Daddy's Room\"\nmsgstr \"Daddy's Room\"\n\n#. Key:\tdescend\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"climb down a ladder or rope or go down with an elevator\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Descend\"\nmsgstr \"Descend\"\n\n#. Key:\tdestroy\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"destroy device in EndFinal level\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Destroy\"\nmsgstr \"Destroy\"\n\n#. Key:\tdevice\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"use Device\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Device\"\nmsgstr \"Device\"\n\n#. Key:\tdoor\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"examine Door\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Door\"\nmsgstr \"Door\"\n\n#. Key:\tdoor_does_not_open_from_this_side\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"message when character tries to open a door but it can only be openned from the other side\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Door does not open from this side!\"\nmsgstr \"Door does not open from this side!\"\n\n#. Key:\tdoor_opened\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"door openned\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Door opened\"\nmsgstr \"Door opened\"\n\n#. Key:\tdrop\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"drop box or carryable\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Drop\"\nmsgstr \"Drop\"\n\n#. Key:\televator_activated\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Elevator Activated\"\nmsgstr \"Elevator Activated\"\n\n#. Key:\televator_inactive\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"player tries to use the elevator but it is inactive\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"The elevator seems to be inactive\"\nmsgstr \"The elevator seems to be inactive\"\n\n#. Key:\televator_not_move_to_dir\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"player tries to use an elevator but the direction is not activated yet\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"The elevator does not move to the selected direction\"\nmsgstr \"The elevator does not move to the selected direction\"\n\n#. Key:\tenter\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"teleport - enter a room or a portal\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Enter\"\nmsgstr \"Enter\"\n\n#. Key:\tenter_bridge\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Enter Bridge\"\nmsgstr \"Enter Bridge\"\n\n#. Key:\tenter_cave\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Enter Cave\"\nmsgstr \"Enter Cave\"\n\n#. Key:\tenter_flames\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Enter Flames\"\nmsgstr \"Enter Flames\"\n\n#. Key:\tenter_gate\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Enter Gate\"\nmsgstr \"Enter Gate\"\n\n#. Key:\tenter_hut\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Enter Hut\"\nmsgstr \"Enter Hut\"\n\n#. Key:\tenter_kitchen\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Enter Kitchen\"\nmsgstr \"Enter Kitchen\"\n\n#. Key:\tenter_pipe\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Enter Pipe\"\nmsgstr \"Enter Pipe\"\n\n#. Key:\tenter_portal\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Enter Portal\"\nmsgstr \"Enter Portal\"\n\n#. Key:\tenter_stairs_left\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Enter Stairs on the Left\"\nmsgstr \"Enter Stairs on the Left\"\n\n#. Key:\tenter_stairs_right\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Enter Stairs on the Right\"\nmsgstr \"Enter Stairs on the Right\"\n\n#. Key:\tenter_tower\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Enter Tower\"\nmsgstr \"Enter Tower\"\n\n#. Key:\tentrace_locked\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Entrance locked from the other side\"\nmsgstr \"Entrance locked from the other side\"\n\n#. Key:\texamine\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"examine a statue or some other interactable object which triggers dialogue or hint message\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Examine\"\nmsgstr \"Examine\"\n\n#. Key:\texamine_device\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Examine Device\"\nmsgstr \"Examine Device\"\n\n#. Key:\texamine_elevator\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Examine Elevator\"\nmsgstr \"Examine Elevator\"\n\n#. Key:\texamine_switch\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"it is a lightswitch\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Examine Switch\"\nmsgstr \"Examine Switch\"\n\n#. Key:\texit\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"exit room\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Exit\"\nmsgstr \"Exit\"\n\n#. Key:\texplore_stations\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Explore more stations before using the railway system.\"\nmsgstr \"Explore more stations before using the railway system.\"\n\n#. Key:\tfinish_demo\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"teleport at the end of demo\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Finish Demo\"\nmsgstr \"Finish Demo\"\n\n#. Key:\tfire\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"fires a cannon\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Fire\"\nmsgstr \"Fire\"\n\n#. Key:\tgo_down\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"go down the stairs\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Go down\"\nmsgstr \"Go down\"\n\n#. Key:\tgo_up\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"go up the stairs\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Go up\"\nmsgstr \"Go up\"\n\n#. Key:\tinspect_fountain\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Inspect Fountain\"\nmsgstr \"Inspect Fountain\"\n\n#. Key:\tinventory\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"hint for hotkey to open the inventory\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Inventory\"\nmsgstr \"Inventory\"\n\n#. Key:\tkey_missing\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"{0} is the key name\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Key Missing: {0}\"\nmsgstr \"Key Missing: {0}\"\n\n#. Key:\tkick_rope\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"a pile of rope can be kicked to be able to climb up/down on it\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Kick Rope\"\nmsgstr \"Kick Rope\"\n\n#. Key:\tlaboratory\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"examine/enter Laboratory\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Laboratory\"\nmsgstr \"Laboratory\"\n\n#. Key:\tlamps\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"examine Lamps\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Lamps\"\nmsgstr \"Lamps\"\n\n#. Key:\tleave\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"teleport - leave a room, chest, level\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Leave\"\nmsgstr \"Leave\"\n\n#. Key:\tleave_bridge\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Leave Bridge\"\nmsgstr \"Leave Bridge\"\n\n#. Key:\tleave_cave\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Leave Cave\"\nmsgstr \"Leave Cave\"\n\n#. Key:\tleave_circle\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Leave Circle\"\nmsgstr \"Leave Circle\"\n\n#. Key:\tleave_hut\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Leave Hut\"\nmsgstr \"Leave Hut\"\n\n#. Key:\tleft_lever\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"use Left Lever\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Left Lever\"\nmsgstr \"Left Lever\"\n\n#. Key:\tlever_is_active\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Lever activated. The crystal broke.\"\nmsgstr \"Lever activated. The crystal broke.\"\n\n#. Key:\tlever_is_inactive\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"a lever\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Seems to be inactive\"\nmsgstr \"Seems to be inactive\"\n\n#. Key:\tmemory_stone_aquire\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Acquire Memory Stone\"\nmsgstr \"Acquire Memory Stone\"\n\n#. Key:\tmemory_stone_gained\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Memory Stone Gained\"\nmsgstr \"Memory Stone Gained\"\n\n#. Key:\tmiddle_lever\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"use Middle Lever \"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Middle Lever\"\nmsgstr \"Middle Lever\"\n\n#. Key:\tmoms_room\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"examine Mom's Room\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Mom's Room\"\nmsgstr \"Mom's Room\"\n\n#. Key:\tnotebook\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"examine Notebook\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Notebook\"\nmsgstr \"Notebook\"\n\n#. Key:\topen\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"door can be openned\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Open\"\nmsgstr \"Open\"\n\n#. Key:\topen_door\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Open Door\"\nmsgstr \"Open Door\"\n\n#. Key:\tpainting\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"examine Painting\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Painting\"\nmsgstr \"Painting\"\n\n#. Key:\tpaintings\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"examine Paintings\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Paintings\"\nmsgstr \"Paintings\"\n\n#. Key:\tpass_bridge\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Pass Bridge\"\nmsgstr \"Pass Bridge\"\n\n#. Key:\tpick_up\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"pick up box or carryable\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Pick Up\"\nmsgstr \"Pick Up\"\n\n#. Key:\tplace_rope\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Place Rope\"\nmsgstr \"Place Rope\"\n\n#. Key:\tprimary_strike\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"hint with control key for strike 1 of the character\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Primary Strike\"\nmsgstr \"Primary Strike\"\n\n#. Key:\tpull\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"pull a lever\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Pull\"\nmsgstr \"Pull\"\n\n#. Key:\tpull_lever\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Pull Lever\"\nmsgstr \"Pull Lever\"\n\n#. Key:\tpush\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"push a sphere shaped rock from the edge to break some stuff\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Push\"\nmsgstr \"Push\"\n\n#. Key:\tput_weapon_away\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"hint with control key to show how to put the weapon away\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Put Weapon Away\"\nmsgstr \"Put Weapon Away\"\n\n#. Key:\tread\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"interaction hint if the character can read a scroll or book\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Read\"\nmsgstr \"Read\"\n\n#. Key:\tread_dictionary\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Read Dictionary\"\nmsgstr \"Read Dictionary\"\n\n#. Key:\tread_symbols\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Read Symbols\"\nmsgstr \"Read Symbols\"\n\n#. Key:\trelease_keeper\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Release Keeper\"\nmsgstr \"Release Keeper\"\n\n#. Key:\treplay_boss_fight\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"interaction hint to play a boss fight which was already won\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Replay Boss Fight\"\nmsgstr \"Replay Boss Fight\"\n\n#. Key:\treset_portals\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"lever\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Reset Portals\"\nmsgstr \"Reset Portals\"\n\n#. Key:\trest\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"rest near a checkpoint statue where character can sleep and change spells and listen to music\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Rest\"\nmsgstr \"Rest\"\n\n#. Key:\trestore\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"restore the HP\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Restore\"\nmsgstr \"Restore\"\n\n#. Key:\tright_lever\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"use Right Lever\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Right Lever\"\nmsgstr \"Right Lever\"\n\n#. Key:\tring_bell\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"there is a bell the character has to use to start the conversation with a merchant\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Ring the bell\"\nmsgstr \"Ring the bell\"\n\n#. Key:\trope_can_be_placed\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"A rope could be placed here\"\nmsgstr \"A rope could be placed here\"\n\n#. Key:\trope_kicked\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"feedback on the kick rope action\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Rope kicked\"\nmsgstr \"Rope kicked\"\n\n#. Key:\trope_placed\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Rope placed\"\nmsgstr \"Rope placed\"\n\n#. Key:\tsail\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"use ship for travel\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Sail\"\nmsgstr \"Sail\"\n\n#. Key:\tsoulkeeper_released\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Soulkeeper released\"\nmsgstr \"Soulkeeper released\"\n\n#. Key:\tspecial_strike\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"hint with control key for strike 2 of the character\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Special Strike\"\nmsgstr \"Special Strike\"\n\n#. Key:\tstairs\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"enter stairs\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Stairs\"\nmsgstr \"Stairs\"\n\n#. Key:\tstone_added\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"{0} is the stone amount, {1} is the stone name\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"{0} {1} added to your bag!\"\nmsgstr \"{0} {1} added to your bag!\"\n\n#. Key:\tstone_cant_carry\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"{0} is the stone name\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"You can't carry more {0}\"\nmsgstr \"You can't carry more {0}\"\n\n#. Key:\tstone_cant_store\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"{0} is the stone name\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"You don't have anything you could use to store {0}\"\nmsgstr \"You don't have anything you could use to store {0}\"\n\n#. Key:\tswing\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"Swings on the pole with the arms\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Swing\"\nmsgstr \"Swing\"\n\n#. Key:\tswitch_interact\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"Switch interact alternative,  between the two modes\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Switch\"\nmsgstr \"Switch\"\n\n#. Key:\ttake\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"character can take an item\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Take\"\nmsgstr \"Take\"\n\n#. Key:\ttake_a_seat\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Take a seat\"\nmsgstr \"Take a seat\"\n\n#. Key:\ttake_abacus\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Take Abacus\"\nmsgstr \"Take Abacus\"\n\n#. Key:\ttake_all\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Take All\"\nmsgstr \"Take All\"\n\n#. Key:\ttake_axe\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"character can take a weapon\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Take Axe\"\nmsgstr \"Take Axe\"\n\n#. Key:\ttake_blades\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"character can take two swords to go dual wield\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Take Blades\"\nmsgstr \"Take Blades\"\n\n#. Key:\ttake_books\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"character can take (two) books\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Take Books\"\nmsgstr \"Take Books\"\n\n#. Key:\ttake_mace\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"character can take a weapon\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Take Mace\"\nmsgstr \"Take Mace\"\n\n#. Key:\ttake_mushrooms\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Take Mushrooms\"\nmsgstr \"Take Mushrooms\"\n\n#. Key:\ttake_rope\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Take Rope\"\nmsgstr \"Take Rope\"\n\n#. Key:\ttake_sabre\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"character can take a weapon\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Take Sabre\"\nmsgstr \"Take Sabre\"\n\n#. Key:\ttake_spellcaster\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"the Spellcaster is an amulet the character can use to cast spells\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Take Spellcaster\"\nmsgstr \"Take Spellcaster\"\n\n#. Key:\ttake_stones\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Take Stones\"\nmsgstr \"Take Stones\"\n\n#. Key:\ttake_sword\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"character can take a weapon\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Take Sword\"\nmsgstr \"Take Sword\"\n\n#. Key:\ttake_wheel\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Take Wheel\"\nmsgstr \"Take Wheel\"\n\n#. Key:\ttalk\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Talk\"\nmsgstr \"Talk\"\n\n#. Key:\ttoggle_switch\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"it is a lightswitch\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Toggle Switch\"\nmsgstr \"Toggle Switch\"\n\n#. Key:\ttouch_statue\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Touch Statue\"\nmsgstr \"Touch Statue\"\n\n#. Key:\ttravel\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"travel on the train station path\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Travel\"\nmsgstr \"Travel\"\n\n#. Key:\tunlocked_with\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"{0} is the key name\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Unlocked with {0}\"\nmsgstr \"Unlocked with {0}\"\n\n#. Key:\tuse\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"use device in EndFinal level\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Use\"\nmsgstr \"Use\"\n\n#. Key:\tuse_active_item\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"uses the active item\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Use Active Item\"\nmsgstr \"Use Active Item\"\n\n#. Key:\tuse_crystal\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Use Crystal\"\nmsgstr \"Use Crystal\"\n\n#. Key:\tuse_destroy_explained\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Destroy the device to save the creatures of Ruined Realm\"\nmsgstr \"Destroy the device to save the creatures of Ruined Realm\"\n\n#. Key:\tuse_device\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Use Device\"\nmsgstr \"Use Device\"\n\n#. Key:\tuse_elevator\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Use Elevator\"\nmsgstr \"Use Elevator\"\n\n#. Key:\tuse_elevator_gem\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Use Elevator Gem\"\nmsgstr \"Use Elevator Gem\"\n\n#. Key:\tuse_magic_mirror\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Use Magic Mirror\"\nmsgstr \"Use Magic Mirror\"\n\n#. Key:\tuse_separate_explained\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Use the device to separate the Realms\"\nmsgstr \"Use the device to separate the Realms\"\n\n#. Key:\tuse_switch\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"for the moria gate\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Use switch\"\nmsgstr \"Use switch\"\n\n#. Key:\tuse_workshop\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Use Workshop\"\nmsgstr \"Use Workshop\"\n\n#. Key:\twheel_release\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"release lever wheel\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Release\"\nmsgstr \"Release\"\n\n#. Key:\twheel_turn\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"turn lever wheel\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Turn\"\nmsgstr \"Turn\"\n\n#. Key:\twindow\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"examine Window\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Window\"\nmsgstr \"Window\"\n\n#. Key:\tworkroom\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"examine/enter Workroom\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Workroom\"\nmsgstr \"Workroom\"\n\n#. Key:\tyou_are_worthy\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"gate golem tutorial level message interaction\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"You are not worthy!\"\nmsgstr \"You are not worthy!\"\n\n#. Key:\tice_stone_Name\n#. SourceLocation:\tLocalization/StringTables/Items.csv\n#: Localization/StringTables/Items.csv\nmsgctxt \"Items\"\nmsgid \"Ice Stone\"\nmsgstr \"Ice Stone\"\n\n#. Key:\ttest_stone_name\n#. SourceLocation:\tLocalization/StringTables/Items.csv\n#: Localization/StringTables/Items.csv\nmsgctxt \"Items\"\nmsgid \"Test Stone\"\nmsgstr \"Test Stone\"\n\n#. Key:\tbook\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:494\n#: Source/SOrb/Basic/SoGameSingleton.cpp:494\nmsgctxt \"ItemsCommon\"\nmsgid \"Something to read\"\nmsgstr \"Something to read\"\n\n#. Key:\tcooldown\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:501\n#: Source/SOrb/Basic/SoGameSingleton.cpp:501\nmsgctxt \"ItemsCommon\"\nmsgid \"Cooldown\"\nmsgstr \"Cooldown\"\n\n#. Key:\tcrossbow\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:487\n#: Source/SOrb/Basic/SoGameSingleton.cpp:487\nmsgctxt \"ItemsCommon\"\nmsgid \"Something to shoot with\"\nmsgstr \"Something to shoot with\"\n\n#. Key:\tdefensive\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:472\n#: Source/SOrb/Basic/SoGameSingleton.cpp:472\nmsgctxt \"ItemsCommon\"\nmsgid \"Shard of Protection\"\nmsgstr \"Shard of Protection\"\n\n#. Key:\tdualwield\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:480\n#: Source/SOrb/Basic/SoGameSingleton.cpp:480\nmsgctxt \"ItemsCommon\"\nmsgid \"Dual Wield Weapon\"\nmsgstr \"Dual Wield Weapon\"\n\n#. Key:\thealth\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:498\n#: Source/SOrb/Basic/SoGameSingleton.cpp:498\nmsgctxt \"ItemsCommon\"\nmsgid \"Health\"\nmsgstr \"Health\"\n\n#. Key:\tinvalid_shard_max\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:475\n#: Source/SOrb/Basic/SoGameSingleton.cpp:475\nmsgctxt \"ItemsCommon\"\nmsgid \"Invalid\"\nmsgstr \"Invalid\"\n\n#. Key:\tinvalid_weapon_max\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:481\n#: Source/SOrb/Basic/SoGameSingleton.cpp:481\nmsgctxt \"ItemsCommon\"\nmsgid \"Invalid Weapon\"\nmsgstr \"Invalid Weapon\"\n\n#. Key:\titem\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:492\n#. Key:\tkeylikeitem\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:491\n#: Source/SOrb/Basic/SoGameSingleton.cpp:491\n#: Source/SOrb/Basic/SoGameSingleton.cpp:492\nmsgctxt \"ItemsCommon\"\nmsgid \"Something interesting\"\nmsgstr \"Something interesting\"\n\n#. Key:\tjewelry\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:469\n#: Source/SOrb/Basic/SoGameSingleton.cpp:469\nmsgctxt \"ItemsCommon\"\nmsgid \"Valuable\"\nmsgstr \"Valuable\"\n\n#. Key:\tkey\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:466\n#: Source/SOrb/Basic/SoGameSingleton.cpp:466\nmsgctxt \"ItemsCommon\"\nmsgid \"Key\"\nmsgstr \"Key\"\n\n#. Key:\tMemoryStone\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:465\n#: Source/SOrb/Basic/SoGameSingleton.cpp:465\nmsgctxt \"ItemsCommon\"\nmsgid \"Memory Stone\"\nmsgstr \"Memory Stone\"\n\n#. Key:\toffensive\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:473\n#: Source/SOrb/Basic/SoGameSingleton.cpp:473\nmsgctxt \"ItemsCommon\"\nmsgid \"Shard of Justice\"\nmsgstr \"Shard of Justice\"\n\n#. Key:\tonehanded\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:478\n#: Source/SOrb/Basic/SoGameSingleton.cpp:478\nmsgctxt \"ItemsCommon\"\nmsgid \"One-Handed Weapon\"\nmsgstr \"One-Handed Weapon\"\n\n#. Key:\tpotion\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:484\n#: Source/SOrb/Basic/SoGameSingleton.cpp:484\nmsgctxt \"ItemsCommon\"\nmsgid \"Something to drink\"\nmsgstr \"Something to drink\"\n\n#. Key:\tQuestItem\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:464\n#: Source/SOrb/Basic/SoGameSingleton.cpp:464\nmsgctxt \"ItemsCommon\"\nmsgid \"Quest Item\"\nmsgstr \"Quest Item\"\n\n#. Key:\tRuneStone\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:467\n#: Source/SOrb/Basic/SoGameSingleton.cpp:467\nmsgctxt \"ItemsCommon\"\nmsgid \"Runestone\"\nmsgstr \"Runestone\"\n\n#. Key:\tshard\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:462\n#: Source/SOrb/Basic/SoGameSingleton.cpp:462\nmsgctxt \"ItemsCommon\"\nmsgid \"Shard\"\nmsgstr \"Shard\"\n\n#. Key:\tsomething_unlock\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:490\n#: Source/SOrb/Basic/SoGameSingleton.cpp:490\nmsgctxt \"ItemsCommon\"\nmsgid \"Something to unlock with\"\nmsgstr \"Something to unlock with\"\n\n#. Key:\tspecial\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:474\n#: Source/SOrb/Basic/SoGameSingleton.cpp:474\nmsgctxt \"ItemsCommon\"\nmsgid \"Shard of Wonder\"\nmsgstr \"Shard of Wonder\"\n\n#. Key:\tspeed\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:497\n#: Source/SOrb/Basic/SoGameSingleton.cpp:497\nmsgctxt \"ItemsCommon\"\nmsgid \"Attack Speed\"\nmsgstr \"Attack Speed\"\n\n#. Key:\tspell\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:486\n#: Source/SOrb/Basic/SoGameSingleton.cpp:486\nmsgctxt \"ItemsCommon\"\nmsgid \"Something to cast with\"\nmsgstr \"Something to cast with\"\n\n#. Key:\tspellcapacitycost\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:499\n#: Source/SOrb/Basic/SoGameSingleton.cpp:499\nmsgctxt \"ItemsCommon\"\nmsgid \"Capacity Cost\"\nmsgstr \"Capacity Cost\"\n\n#. Key:\tspellusagecount\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:500\n#: Source/SOrb/Basic/SoGameSingleton.cpp:500\nmsgctxt \"ItemsCommon\"\nmsgid \"Charge\"\nmsgstr \"Charge\"\n\n#. Key:\tthrowable\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:485\n#: Source/SOrb/Basic/SoGameSingleton.cpp:485\nmsgctxt \"ItemsCommon\"\nmsgid \"Something to throw\"\nmsgstr \"Something to throw\"\n\n#. Key:\ttwohanded\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:479\n#: Source/SOrb/Basic/SoGameSingleton.cpp:479\nmsgctxt \"ItemsCommon\"\nmsgid \"Two-Handed Weapon\"\nmsgstr \"Two-Handed Weapon\"\n\n#. Key:\tusable\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:463\n#: Source/SOrb/Basic/SoGameSingleton.cpp:463\nmsgctxt \"ItemsCommon\"\nmsgid \"Usable\"\nmsgstr \"Usable\"\n\n#. Key:\tweapon\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:468\n#: Source/SOrb/Basic/SoGameSingleton.cpp:468\nmsgctxt \"ItemsCommon\"\nmsgid \"Weapon\"\nmsgstr \"Weapon\"\n\n#. Key:\tmus1_combat_1_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(6).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(6).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Disfunctional Golems\"\nmsgstr \"Disfunctional Golems\"\n\n#. Key:\tmus1_combat_2_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(16).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(16).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Machine Rage\"\nmsgstr \"Machine Rage\"\n\n#. Key:\tmus1_combat_GateKeeper_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(2).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(2).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Worthy\"\nmsgstr \"Worthy\"\n\n#. Key:\tmus1_dlg_Generic_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(7).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(7).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Unexpected Friend\"\nmsgstr \"Unexpected Friend\"\n\n#. Key:\tmus1_dlg_Golem_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(9).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(9).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Duty\"\nmsgstr \"Duty\"\n\n#. Key:\tmus1_dlg_Lory_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(8).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(8).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"The other Bell\"\nmsgstr \"The other Bell\"\n\n#. Key:\tmus1_dlg_Monk_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(10).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(10).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Enlightened Mind\"\nmsgstr \"Enlightened Mind\"\n\n#. Key:\tmus1_dlg_Raven_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(11).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(11).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Winged Wisdom\"\nmsgstr \"Winged Wisdom\"\n\n#. Key:\tmus1_dlg_SewerCreature_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(32).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(32).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Pipe Walkers\"\nmsgstr \"Pipe Walkers\"\n\n#. Key:\tmus1_dlg_Teachy_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(12).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(12).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Just a bit crazy\"\nmsgstr \"Just a bit crazy\"\n\n#. Key:\tmus1_env_AncientArcade_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(1).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(1).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Remnant Colors\"\nmsgstr \"Remnant Colors\"\n\n#. Key:\tmus1_env_GreyGate_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(5).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(5).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Touch of Ruin\"\nmsgstr \"Touch of Ruin\"\n\n#. Key:\tmus1_env_SecondArcade_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(17).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(17).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"In Memoriam\"\nmsgstr \"In Memoriam\"\n\n#. Key:\tmus1_env_TutorialLevel_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(3).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(3).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Sunken Sewer\"\nmsgstr \"Sunken Sewer\"\n\n#. Key:\tmus2_combat_catacombs_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(18).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(18).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Armours of the Deep\"\nmsgstr \"Armours of the Deep\"\n\n#. Key:\tmus2_combat_DwarvenBoss_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(19).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(19).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"I hold it back\"\nmsgstr \"I hold it back\"\n\n#. Key:\tmus2_combat_LavaBoss_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(20).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(20).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Meant to be Perfect\"\nmsgstr \"Meant to be Perfect\"\n\n#. Key:\tmus2_combat_WrackedWaterpath_2_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(22).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(22).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Wracked Warriors\"\nmsgstr \"Wracked Warriors\"\n\n#. Key:\tmus2_combat_WrackedWaterpath_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(21).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(21).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Those who survived\"\nmsgstr \"Those who survived\"\n\n#. Key:\tmus2_combat_WWBoss_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(23).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(23).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"No price too high\"\nmsgstr \"No price too high\"\n\n#. Key:\tmus2_dlg_Gnory_Fishy_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(33).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(33).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Intelligence and Wisdom\"\nmsgstr \"Intelligence and Wisdom\"\n\n#. Key:\tmus2_dlg_GolemMaker_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(34).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(34).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Lost Memories\"\nmsgstr \"Lost Memories\"\n\n#. Key:\tmus2_dlg_MerchAnt_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(35).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(35).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Small but Tiny\"\nmsgstr \"Small but Tiny\"\n\n#. Key:\tmus2_dlg_SupperDwarf_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(36).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(36).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Supper time\"\nmsgstr \"Supper time\"\n\n#. Key:\tmus2_env_Catacombs_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(24).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(24).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Dwarven Catacombs\"\nmsgstr \"Dwarven Catacombs\"\n\n#. Key:\tmus2_env_CrossroadCave_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(25).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(25).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Railway Station\"\nmsgstr \"Railway Station\"\n\n#. Key:\tmus2_env_DwarvenGate_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(26).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(26).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Sanctuary of Law\"\nmsgstr \"Sanctuary of Law\"\n\n#. Key:\tmus2_env_DwarvenOutpost_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(27).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(27).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Where the rail leads\"\nmsgstr \"Where the rail leads\"\n\n#. Key:\tmus2_env_Kobold_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(15).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(15).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Last of his Tribe\"\nmsgstr \"Last of his Tribe\"\n\n#. Key:\tmus2_env_LavaDeep_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(28).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(28).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Temple for the Ancestors\"\nmsgstr \"Temple for the Ancestors\"\n\n#. Key:\tmus2_env_LavaEntrance_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(29).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(29).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Pilgrim Road\"\nmsgstr \"Pilgrim Road\"\n\n#. Key:\tmus2_env_WrackedWaterpath_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(30).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(30).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Quick and Clever\"\nmsgstr \"Quick and Clever\"\n\n#. Key:\tmus3_combat_Bubble_Ground_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(14).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(14).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Infected Golems\"\nmsgstr \"Infected Golems\"\n\n#. Key:\tmus3_env_BubbleGround_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(38).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(38).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"So close yet so far\"\nmsgstr \"So close yet so far\"\n\n#. Key:\tmus3_env_CaveHouse_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(39).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(39).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Last Shalter\"\nmsgstr \"Last Shalter\"\n\n#. Key:\tmus3_env_PipePuzzle_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(40).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(40).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Moving Pipes\"\nmsgstr \"Moving Pipes\"\n\n#. Key:\tmus3_env_Raven_Puzzle_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(41).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(41).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"One would fail\"\nmsgstr \"One would fail\"\n\n#. Key:\tmus3_env_RuinedRealm_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(42).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(42).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"The end, really\"\nmsgstr \"The end, really\"\n\n#. Key:\tmus_chase_theme_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(4).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(4).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Jump for your life!\"\nmsgstr \"Jump for your life!\"\n\n#. Key:\tmus_cm_WhiteWall_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(13).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(13).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Decaying City\"\nmsgstr \"Decaying City\"\n\n#. Key:\tmus_ending_dlg_UnknownWizard_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(37).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(37).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"All is lost\"\nmsgstr \"All is lost\"\n\n#. Key:\tmus_main_theme_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(0).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(0).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Spirit of the Unknown\"\nmsgstr \"Spirit of the Unknown\"\n\n#. Key:\tmus_waterpath_alter_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(43).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(43).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Stories never end\"\nmsgstr \"Stories never end\"\n\n#. Key:\tblocked\n#. SourceLocation:\tLocalization/StringTables/Spells.csv\n#. InfoMetaData:\t\"Comment\" : \" displayed as floating test ingame when a certain enemy blocks certain attacks\"\n#: Localization/StringTables/Spells.csv\nmsgctxt \"Spells\"\nmsgid \"Blocked\"\nmsgstr \"Blocked\"\n\n#. Key:\tcant_use_in_air\n#. SourceLocation:\tLocalization/StringTables/Spells.csv\n#. InfoMetaData:\t\"Comment\" : \" displayed as floating test ingame when the character tries to use a spell in air which can not be used there\"\n#: Localization/StringTables/Spells.csv\nmsgctxt \"Spells\"\nmsgid \"Can't in air\"\nmsgstr \"Can't in air\"\n\n#. Key:\tcant_use_sk_free_zone\n#. SourceLocation:\tLocalization/StringTables/Spells.csv\n#. InfoMetaData:\t\"Comment\" : \" displayed as floating test ingame when character tries to use the respawn point spell on a location when it is not allowed\"\n#: Localization/StringTables/Spells.csv\nmsgctxt \"Spells\"\nmsgid \"Dangerous Location\"\nmsgstr \"Dangerous Location\"\n\n#. Key:\thp_gained\n#. SourceLocation:\tLocalization/StringTables/Spells.csv\n#. InfoMetaData:\t\"Comment\" : \" displayed as floating test ingame when the character increases his max health\"\n#: Localization/StringTables/Spells.csv\nmsgctxt \"Spells\"\nmsgid \"Health Increased!\"\nmsgstr \"Health Increased!\"\n\n#. Key:\timmune\n#. SourceLocation:\tLocalization/StringTables/Spells.csv\n#. InfoMetaData:\t\"Comment\" : \"displayed as floating text ingame if enemy is immune to a spell or damage type\"\n#: Localization/StringTables/Spells.csv\nmsgctxt \"Spells\"\nmsgid \"Immune\"\nmsgstr \"Immune\"\n\n#. Key:\tinfected\n#. SourceLocation:\tLocalization/StringTables/Spells.csv\n#. InfoMetaData:\t\"Comment\" : \" displayed as floating test ingame when dmg over time effect is applied on enemy\"\n#: Localization/StringTables/Spells.csv\nmsgctxt \"Spells\"\nmsgid \"Infected\"\nmsgstr \"Infected\"\n\n#. Key:\tinstant_recharge\n#. SourceLocation:\tLocalization/StringTables/Spells.csv\n#. InfoMetaData:\t\"Comment\" : \" displayed as floating test ingame when a spell can be used again without waiting for the cooldown time\"\n#: Localization/StringTables/Spells.csv\nmsgctxt \"Spells\"\nmsgid \"Instant Recharge\"\nmsgstr \"Instant Recharge\"\n\n#. Key:\tmissing_target\n#. SourceLocation:\tLocalization/StringTables/Spells.csv\n#. InfoMetaData:\t\"Comment\" : \" displayed as floating test ingame when the character tries to use a spell which requires a target but there is none in range\"\n#: Localization/StringTables/Spells.csv\nmsgctxt \"Spells\"\nmsgid \"Who? Where? What?!\"\nmsgstr \"Who? Where? What?!\"\n\n#. Key:\tno_need_for_heal\n#. SourceLocation:\tLocalization/StringTables/Spells.csv\n#. InfoMetaData:\t\"Comment\" : \" displayed as floating test ingame when the character tries to use heal spell but has max health already\"\n#: Localization/StringTables/Spells.csv\nmsgctxt \"Spells\"\nmsgid \"No need\"\nmsgstr \"No need\"\n\n#. Key:\tresisted\n#. SourceLocation:\tLocalization/StringTables/Spells.csv\n#. InfoMetaData:\t\"Comment\" : \"displayed as floating text ingame if enemy has a chance to avoid an effect and he is lucky\"\n#: Localization/StringTables/Spells.csv\nmsgctxt \"Spells\"\nmsgid \"Resisted\"\nmsgstr \"Resisted\"\n\n#. Key:\tsecond_chance\n#. SourceLocation:\tLocalization/StringTables/Spells.csv\n#. InfoMetaData:\t\"Comment\" : \" displayed as floating test ingame if char has the effect on and dies and respawns because the effect saves him\"\n#: Localization/StringTables/Spells.csv\nmsgctxt \"Spells\"\nmsgid \"Second Chance\"\nmsgstr \"Second Chance\"\n\n#. Key:\tspell_capacity_gained\n#. SourceLocation:\tLocalization/StringTables/Spells.csv\n#. InfoMetaData:\t\"Comment\" : \" displayed as floating test ingame when the character increases his spellpower\"\n#: Localization/StringTables/Spells.csv\nmsgctxt \"Spells\"\nmsgid \"Spellpower Increased!\"\nmsgstr \"Spellpower Increased!\"\n\n#. Key:\tspell_regained\n#. SourceLocation:\tLocalization/StringTables/Spells.csv\n#. InfoMetaData:\t\"Comment\" : \" displayed as floating test ingame when the character regains a spell (can cast again)\"\n#: Localization/StringTables/Spells.csv\nmsgctxt \"Spells\"\nmsgid \"Spell Charge Regained!\"\nmsgstr \"Spell Charge Regained!\"\n\n#. Key:\tacknowledge\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Button\"\n#. Key:\tgroup_defeated_ack\n#. InfoMetaData:\t\"Comment\" : \"the hotkey to close the group defeated panel\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Acknowledge\"\nmsgstr \"Acknowledge\"\n\n#. Key:\tback\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Button\"\n#. Key:\tpanel_command_inv_back\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Back\"\nmsgstr \"Back\"\n\n#. Key:\tblack_fade_teleport_text_1\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Now I remember the night when it started...\"\nmsgstr \"Now I remember the night when it started...\"\n\n#. Key:\tbubble_float\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"bubble tip for the char to float\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Float\"\nmsgstr \"Float\"\n\n#. Key:\tbubble_jump\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"bubble tip for the char to jump\"\n#. Key:\tinput_jump\n#. InfoMetaData:\t\"Comment\" : \"Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Jump\"\nmsgstr \"Jump\"\n\n#. Key:\tbuy\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"buy item\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Buy\"\nmsgstr \"Buy\"\n\n#. Key:\tbuy_back\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"buy back item\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Buy Back\"\nmsgstr \"Buy Back\"\n\n#. Key:\tbuy_on_steam_and_follow\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Buy WarriOrb in Steam and follow us on social media:\"\nmsgstr \"Buy WarriOrb in Steam and follow us on social media:\"\n\n#. Key:\tcancel\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Confirm popup\"\n#. Key:\tsettings_cancel\n#. InfoMetaData:\t\"Comment\" : \"Settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Cancel\"\nmsgstr \"Cancel\"\n\n#. Key:\tchange_user\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Change User\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Change User\"\nmsgstr \"Change User\"\n\n#. Key:\tchapter\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Stats for saves\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Chapter\"\nmsgstr \"Chapter\"\n\n#. Key:\tchapter1_completed\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Temporary for chapter 1\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Chapter 1 completed. Save is Locked.\"\nmsgstr \"Chapter 1 completed. Save is Locked.\"\n\n#. Key:\tcharacter_skin_classic\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"name of the original character skin\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Classic\"\nmsgstr \"Classic\"\n\n#. Key:\tcharacter_skin_desc\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"description for the character skin option\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Changes the visuals of the player character\"\nmsgstr \"Changes the visuals of the player character\"\n\n#. Key:\tcharacter_skin_mummy\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"name of the alternative character skin\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Mummy\"\nmsgstr \"Mummy\"\n\n#. Key:\tcharacter_skin_pumpkin\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"name of the alternative character skin\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Pumpkin\"\nmsgstr \"Pumpkin\"\n\n#. Key:\tcharacter_skin_title\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"option to change character skin\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Character Skin\"\nmsgstr \"Character Skin\"\n\n#. Key:\tcheckpoint\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Stats for saves\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Checkpoint\"\nmsgstr \"Checkpoint\"\n\n#. Key:\tchest_examine\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Examine\"\nmsgstr \"Examine\"\n\n#. Key:\tchest_leave\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Leave\"\nmsgstr \"Leave\"\n\n#. Key:\tchest_loot\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"hotkey tip on chest\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Loot\"\nmsgstr \"Loot\"\n\n#. Key:\tclose\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"close book\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Close\"\nmsgstr \"Close\"\n\n#. Key:\tcompleted_in_time\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Custom Map\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Completed in {time}\"\nmsgstr \"Completed in {time}\"\n\n#. Key:\tconfirm\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Confirm popup\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Confirm\"\nmsgstr \"Confirm\"\n\n#. Key:\tconfirm_keyboard_settings_reset\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Confirm keyboard settings\"\n#. Key:\tdifficulty_confirm_question\n#. InfoMetaData:\t\"Comment\" : \"Confirm difficulty selected popup\"\n#. Key:\tsave_slots_remove_confirm\n#. InfoMetaData:\t\"Comment\" : \"remove save slot confirm dialogue\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Are you sure?\"\nmsgstr \"Are you sure?\"\n\n#. Key:\tconsole_ps4\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"PlayStation 4\"\nmsgstr \"PlayStation 4\"\n\n#. Key:\tconsole_switch\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Switch\"\nmsgstr \"Switch\"\n\n#. Key:\tconsole_xbox_one\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"XBox One\"\nmsgstr \"XBox One\"\n\n#. Key:\tcontinue\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Menu Continue\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Continue\"\nmsgstr \"Continue\"\n\n#. Key:\tcontroller_recommended\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Main Menu\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Note: Playing with a controller is recommended\"\nmsgstr \"Note: Playing with a controller is recommended\"\n\n#. Key:\tcredits\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Menu credits\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Credits\"\nmsgstr \"Credits\"\n\n#. Key:\tcustom_map_x\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Custom Map\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Custom Map {0}\"\nmsgstr \"Custom Map {0}\"\n\n#. Key:\tcustom_maps\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Menu custom Maps\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Custom Maps\"\nmsgstr \"Custom Maps\"\n\n#. Key:\tdescription\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Of something\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Description\"\nmsgstr \"Description\"\n\n#. Key:\tdifficulty\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Stats for saves\"\n#. Key:\tdifficulty_title\n#. InfoMetaData:\t\"Comment\" : \"title of difficulty selection\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Difficulty\"\nmsgstr \"Difficulty\"\n\n#. Key:\tdifficulty_confirm_subtext\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Confirm difficulty selected popup subtext\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"This choice is permanent\"\nmsgstr \"This choice is permanent\"\n\n#. Key:\tdifficulty_desc_insane\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"description of hard difficulty\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"- The <Blue>SoulKeeper</> (Portable Checkpoint) spell is removed from the game\\n- Increased incoming damage\\n- Increased Enemy Health\"\nmsgstr \"- The <Blue>SoulKeeper</> (Portable Checkpoint) spell is removed from the game\\n- Increased incoming damage\\n- Increased Enemy Health\"\n\n#. Key:\tdifficulty_desc_intended\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"description of normal difficulty\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"The way the game is meant to be played\"\nmsgstr \"The way the game is meant to be played\"\n\n#. Key:\tdifficulty_desc_sane\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"description of easy difficulty\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"- Infinite <Blue>SoulKeeper</> (Checkpoint) spell charges\\n- No health penalty when respawning near the <Blue>SoulKeeper</>\\n- Decreased incoming damage\\n- Decreased Enemy Health\"\nmsgstr \"- Infinite <Blue>SoulKeeper</> (Checkpoint) spell charges\\n- No health penalty when respawning near the <Blue>SoulKeeper</>\\n- Decreased incoming damage\\n- Decreased Enemy Health\"\n\n#. Key:\tdifficulty_insane\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"name of hard difficulty\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"As hard as it can get\"\nmsgstr \"As hard as it can get\"\n\n#. Key:\tdifficulty_intended\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"name of normal difficulty\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"A true challenge\"\nmsgstr \"A true challenge\"\n\n#. Key:\tdifficulty_normal\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Normal\"\nmsgstr \"Normal\"\n\n#. Key:\tdifficulty_sane\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"name of easy difficulty\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Just an adventure\"\nmsgstr \"Just an adventure\"\n\n#. Key:\tdisabled\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Widget is disabled\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Disabled\"\nmsgstr \"Disabled\"\n\n#. Key:\tdiscord\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Discord\"\nmsgstr \"Discord\"\n\n#. Key:\tdrm_defeatead_description\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"check only in pirated copies \"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"We suspect that you play a pirated copy of the game.\\nIt's fine. We hope you will enjoy it!\\n\\nIf you like the game, please tell your friends about it, and maybe even consider buying it.\\n\\nWe would love to keep making games!\"\nmsgstr \"We suspect that you play a pirated copy of the game.\\nIt's fine. We hope you will enjoy it!\\n\\nIf you like the game, please tell your friends about it, and maybe even consider buying it.\\n\\nWe would love to keep making games!\"\n\n#. Key:\tdrm_defeatead_title\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"check only in pirated copies \"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"WarriOrb DRM\"\nmsgstr \"WarriOrb DRM\"\n\n#. Key:\tdwarf_language\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Dwarf language\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Dwarf\"\nmsgstr \"Dwarf\"\n\n#. Key:\tempty\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Empty\"\nmsgstr \"Empty\"\n\n#. Key:\tempty_line\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"-\"\nmsgstr \"-\"\n\n#. Key:\tencourage_line1\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Before Main Menu\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"The path ahead is challenging. Do not despise failure. Every wrong attempt discarded is another step forward.\"\nmsgstr \"The path ahead is challenging. Do not despise failure. Every wrong attempt discarded is another step forward.\"\n\n#. Key:\tessence\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"essence represents the Health of the character\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Essence\"\nmsgstr \"Essence\"\n\n#. Key:\tfeedback\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Discord external button\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Feedback\"\nmsgstr \"Feedback\"\n\n#. Key:\tgame_defeated\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"end screen\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Game Defeated!\"\nmsgstr \"Game Defeated!\"\n\n#. Key:\tgame_is_wip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Main Menu\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Game currently under development\"\nmsgstr \"Game currently under development\"\n\n#. Key:\tgame_over_retreat\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"control tip which is only visible in boss areas where the player can either restart the fight or retreat from the place\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Retreat\"\nmsgstr \"Retreat\"\n\n#. Key:\tgame_over_retry\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"control tip which is always visible on game over\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Retry\"\nmsgstr \"Retry\"\n\n#. Key:\tgamepad_special_left_xbox\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"xbox view button\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"View button\"\nmsgstr \"View button\"\n\n#. Key:\tgamepad_special_right_xbox\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"xbox Menu button\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Menu button\"\nmsgstr \"Menu button\"\n\n#. Key:\tgo_back_to_menu\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Go back to main menu\"\nmsgstr \"Go back to main menu\"\n\n#. Key:\tgold_x\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"{x} is the gold amount\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"+{x} GOLD\"\nmsgstr \"+{x} GOLD\"\n\n#. Key:\tgroup_defeated_title\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"title of the group defeated panel\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Group Defeated\"\nmsgstr \"Group Defeated\"\n\n#. Key:\tinput_action_back\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"UI Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"UI Action Back\"\nmsgstr \"UI Action Back\"\n\n#. Key:\tinput_action_first\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"UI Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"UI Action First\"\nmsgstr \"UI Action First\"\n\n#. Key:\tinput_action_second\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"UI Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"UI Action Second\"\nmsgstr \"UI Action Second\"\n\n#. Key:\tinput_action_third\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"UI Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"UI Action Third\"\nmsgstr \"UI Action Third\"\n\n#. Key:\tinput_actions_conflicts\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input remap.  {Key} = key display name. {NumAction} the number of actions, this will determine what to choose between one and other.\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Selected button = {Key}, will get unbound from the {NumActions}|plural(one=Action,other=Actions) = {ActionNames}\"\nmsgstr \"Selected button = {Key}, will get unbound from the {NumActions}|plural(one=Action,other=Actions) = {ActionNames}\"\n\n#. Key:\tinput_alt_interact\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Interact Alternative\"\nmsgstr \"Interact Alternative\"\n\n#. Key:\tinput_change_item\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input Action Name\"\n#. Key:\tpanel_command_inv_change_item\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Change Item\"\nmsgstr \"Change Item\"\n\n#. Key:\tinput_change_spell\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Change Spell\"\nmsgstr \"Change Spell\"\n\n#. Key:\tinput_change_weapon\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Change Weapon\"\nmsgstr \"Change Weapon\"\n\n#. Key:\tinput_down\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"UI Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"UI Move Down\"\nmsgstr \"UI Move Down\"\n\n#. Key:\tinput_float\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Floating\"\nmsgstr \"Floating\"\n\n#. Key:\tinput_interact\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Interact\"\nmsgstr \"Interact\"\n\n#. Key:\tinput_left\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Move Left\"\nmsgstr \"Move Left\"\n\n#. Key:\tinput_menu_back\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"UI Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Open Menu/Escape/Back\"\nmsgstr \"Open Menu/Escape/Back\"\n\n#. Key:\tinput_not_allowed_options_menu_button\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input remap gamepad\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Not allowed to remap to the Menu button\"\nmsgstr \"Not allowed to remap to the Menu button\"\n\n#. Key:\tinput_not_allowed_options_menu_button_switch\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input remap gamepad\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Not allowed to remap to the + Button\"\nmsgstr \"Not allowed to remap to the + Button\"\n\n#. Key:\tinput_not_allowed_thumbsticks\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input remap gamepad\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Not allowed to remap to thumbsticks\"\nmsgstr \"Not allowed to remap to thumbsticks\"\n\n#. Key:\tinput_not_allowed_thumbsticks_switch\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input remap gamepad switch\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Not allowed to remap to Left Stick or Right Stick\"\nmsgstr \"Not allowed to remap to Left Stick or Right Stick\"\n\n#. Key:\tinput_open_inventory\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Open Inventory\"\nmsgstr \"Open Inventory\"\n\n#. Key:\tinput_right\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Move Right\"\nmsgstr \"Move Right\"\n\n#. Key:\tinput_roll\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Roll\"\nmsgstr \"Roll\"\n\n#. Key:\tinput_selected_key_not_allowed\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input remap. {Key} = key display name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Selected button = {Key}, is not allowed as an input option\"\nmsgstr \"Selected button = {Key}, is not allowed as an input option\"\n\n#. Key:\tinput_spell_down\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"UI Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"UI Spell Down\"\nmsgstr \"UI Spell Down\"\n\n#. Key:\tinput_spell_left\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"UI Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"UI Spell Left\"\nmsgstr \"UI Spell Left\"\n\n#. Key:\tinput_spell_right\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"UI Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"UI Spell Right\"\nmsgstr \"UI Spell Right\"\n\n#. Key:\tinput_spell_select\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"UI Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"UI Spell Select\"\nmsgstr \"UI Spell Select\"\n\n#. Key:\tinput_spell_select_and_cast\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"UI Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"UI Spell Select & Cast\"\nmsgstr \"UI Spell Select & Cast\"\n\n#. Key:\tinput_spell_up\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"UI Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"UI Spell Up\"\nmsgstr \"UI Spell Up\"\n\n#. Key:\tinput_strike_primary\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Primary Strike\"\nmsgstr \"Primary Strike\"\n\n#. Key:\tinput_strike_special\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Special Strike\"\nmsgstr \"Special Strike\"\n\n#. Key:\tinput_take_weapon\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Take Weapon Away\"\nmsgstr \"Take Weapon Away\"\n\n#. Key:\tinput_top_left\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"UI Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"UI Top Left\"\nmsgstr \"UI Top Left\"\n\n#. Key:\tinput_top_right\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"UI Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"UI Top Right\"\nmsgstr \"UI Top Right\"\n\n#. Key:\tinput_unbound\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Unbound input\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Unbound\"\nmsgstr \"Unbound\"\n\n#. Key:\tinput_up\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"UI Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"UI Move Up\"\nmsgstr \"UI Move Up\"\n\n#. Key:\tinput_use_item\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Use Item\"\nmsgstr \"Use Item\"\n\n#. Key:\tinventory_item_amount\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"the item amount displayed in inventory/trade panel/etc.\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Amount: {0}\"\nmsgstr \"Amount: {0}\"\n\n#. Key:\tinventory_item_tooltip_cooldown\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Cooldown\"\nmsgstr \"Cooldown\"\n\n#. Key:\tinventory_item_tooltip_damage\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"damage text on item descriptions\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Damage\"\nmsgstr \"Damage\"\n\n#. Key:\tinventory_item_tooltip_sec\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"duration of something (e.g. cooldown)\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"{0} sec\"\nmsgstr \"{0} sec\"\n\n#. Key:\titem_equipped\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Item Tooltip\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"---Equipped---\"\nmsgstr \"---Equipped---\"\n\n#. Key:\titem_not_For_sale\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Item Tooltip\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Not for sale\"\nmsgstr \"Not for sale\"\n\n#. Key:\titem_rarity_0\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"item rarity text on the bottom of tooltips\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Better than nothing, right?\"\nmsgstr \"Better than nothing, right?\"\n\n#. Key:\titem_rarity_1\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"item rarity text on the bottom of tooltips\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Better than nothing\"\nmsgstr \"Better than nothing\"\n\n#. Key:\titem_rarity_2\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"item rarity text on the bottom of tooltips\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Good stuff\"\nmsgstr \"Good stuff\"\n\n#. Key:\titem_rarity_3\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"item rarity text on the bottom of tooltips\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Pretty good stuff\"\nmsgstr \"Pretty good stuff\"\n\n#. Key:\titem_rarity_4\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"item rarity text on the bottom of tooltips\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Amazing stuff\"\nmsgstr \"Amazing stuff\"\n\n#. Key:\tkey_selection_current\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Select Input key\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Currently selected button:\"\nmsgstr \"Currently selected button:\"\n\n#. Key:\tkey_selection_empty\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Select Input key\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"[Empty Button]\"\nmsgstr \"[Empty Button]\"\n\n#. Key:\tkey_selection_press\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Select Input key\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"[Press Button]\"\nmsgstr \"[Press Button]\"\n\n#. Key:\tkey_selection_press_button\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Select Input key\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Press the button you want to assign to the action:\"\nmsgstr \"Press the button you want to assign to the action:\"\n\n#. Key:\tline_three_dots\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"...\"\nmsgstr \"...\"\n\n#. Key:\tloading_screen_press_key\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Press any key to continue...\"\nmsgstr \"Press any key to continue...\"\n\n#. Key:\tloading_screen_press_key_switch\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Press any button to continue...\"\nmsgstr \"Press any button to continue...\"\n\n#. Key:\tloading_screen_text_1\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"This is a loading screen. We wait a few seconds here to look more professional.\"\nmsgstr \"This is a loading screen. We wait a few seconds here to look more professional.\"\n\n#. Key:\tmailing_list\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Mailing List\"\nmsgstr \"Mailing List\"\n\n#. Key:\tnever_completed\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Custom Map\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Never completed\"\nmsgstr \"Never completed\"\n\n#. Key:\tno\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Confirm popup\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"No\"\nmsgstr \"No\"\n\n#. Key:\tpanel_character_sheet\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Character Panel\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Character Sheet\"\nmsgstr \"Character Sheet\"\n\n#. Key:\tpanel_command_inv_compare\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Compare\"\nmsgstr \"Compare\"\n\n#. Key:\tpanel_command_inv_drink\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Drink\"\nmsgstr \"Drink\"\n\n#. Key:\tpanel_command_inv_equip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"control key tip in inventory\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Equip\"\nmsgstr \"Equip\"\n\n#. Key:\tpanel_command_inv_equip_item\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Equip Item\"\nmsgstr \"Equip Item\"\n\n#. Key:\tpanel_command_inv_equip_next\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Equip Next\"\nmsgstr \"Equip Next\"\n\n#. Key:\tpanel_command_inv_read\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Read\"\nmsgstr \"Read\"\n\n#. Key:\tpanel_command_inv_unequip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Unequip\"\nmsgstr \"Unequip\"\n\n#. Key:\tpanel_command_spell_add\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"add spell to equipped spells\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Add\"\nmsgstr \"Add\"\n\n#. Key:\tpanel_command_spell_remove\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"remove spell from equipped spells\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Remove\"\nmsgstr \"Remove\"\n\n#. Key:\tpanel_equipped_spells\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Spell Selection panel\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Equipped Spells\"\nmsgstr \"Equipped Spells\"\n\n#. Key:\tpanel_inventory\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Character Panel\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Inventory\"\nmsgstr \"Inventory\"\n\n#. Key:\tpanel_notes\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Character Panel\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Sidenotes\"\nmsgstr \"Sidenotes\"\n\n#. Key:\tpaneL_resistances\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Character Sheet Panel\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Resistances\"\nmsgstr \"Resistances\"\n\n#. Key:\tpanel_rest_no_item\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"You don't have the necessary item to use spells!\"\nmsgstr \"You don't have the necessary item to use spells!\"\n\n#. Key:\tpanel_rest_option_change_spells\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Change Spells\"\nmsgstr \"Change Spells\"\n\n#. Key:\tpanel_rest_option_listen_to_music\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Listen to Music\"\nmsgstr \"Listen to Music\"\n\n#. Key:\tpanel_rest_option_sleep\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Sleep\"\nmsgstr \"Sleep\"\n\n#. Key:\tpanel_rest_option_wake_up\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Wake Up\"\nmsgstr \"Wake Up\"\n\n#. Key:\tpanel_spell_capacity\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Spell Selection panel\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Capacity: {0}/{1}\"\nmsgstr \"Capacity: {0}/{1}\"\n\n#. Key:\tpanel_spell_selection_denied\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Spell Selection panel\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"You can only change the equipped spells near ancient statues.\"\nmsgstr \"You can only change the equipped spells near ancient statues.\"\n\n#. Key:\tpanel_spells\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Character Panel\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Spells\"\nmsgstr \"Spells\"\n\n#. Key:\tpercentage_argument\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Slider\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"{0}%\"\nmsgstr \"{0}%\"\n\n#. Key:\tplay_time\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Stats for saves\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Play Time\"\nmsgstr \"Play Time\"\n\n#. Key:\tprogress_saved\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Confirm Quit popup\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Progress will be saved\"\nmsgstr \"Progress will be saved\"\n\n#. Key:\tprogress_saved_automatically\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Before Main Menu\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Your progress is saved automatically whenever this icon is displayed\"\nmsgstr \"Your progress is saved automatically whenever this icon is displayed\"\n\n#. Key:\tquit_game\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Menu Quit Game\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Quit Game\"\nmsgstr \"Quit Game\"\n\n#. Key:\tquit_game_question\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Confirm Quit popup\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Quit Game?\"\nmsgstr \"Quit Game?\"\n\n#. Key:\tquit_to_menu\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Menu Quit To Menu\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Quit to Menu\"\nmsgstr \"Quit to Menu\"\n\n#. Key:\tquit_to_menu_question\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Confirm Quit popup\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Quit to Menu?\"\nmsgstr \"Quit to Menu?\"\n\n#. Key:\treset_keyboard_arrows\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Confirm keyboard settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Reset to Arrow defaults\"\nmsgstr \"Reset to Arrow defaults\"\n\n#. Key:\treset_keyboard_wasd\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Confirm keyboard settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Reset to WASD defaults\"\nmsgstr \"Reset to WASD defaults\"\n\n#. Key:\trestart\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Restart the game\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Restart\"\nmsgstr \"Restart\"\n\n#. Key:\trestart_game_question\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Confirm Restart popup\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Restart Game?\"\nmsgstr \"Restart Game?\"\n\n#. Key:\trestart_game_warning\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Confirm Restart popup\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"All progress will be lost\"\nmsgstr \"All progress will be lost\"\n\n#. Key:\tsave_slots_clear\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"clears the save slot\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Clear\"\nmsgstr \"Clear\"\n\n#. Key:\tsave_slots_loaded\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"text on currently loaded save slot if there is any\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"- Loaded -\"\nmsgstr \"- Loaded -\"\n\n#. Key:\tsave_slots_new_game\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"text on empty save slot\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"New Game\"\nmsgstr \"New Game\"\n\n#. Key:\tsave_slots_playtime\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"playtime displayed, {0} is the hours, {1} is the minutes\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"{0} H {1} M\"\nmsgstr \"{0} H {1} M\"\n\n#. Key:\tsave_slots_playtime_short\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"playtime displayed if it did not reach an hour, {0} is the time in minutes\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"{0} M\"\nmsgstr \"{0} M\"\n\n#. Key:\tsave_slots_remove_confirm_subtext\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"remove save slot confirm dialogue\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Progress will be lost\"\nmsgstr \"Progress will be lost\"\n\n#. Key:\tsave_slots_select\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"loads the game or creates a new one using the active slot\"\n#. Key:\tselect\n#. InfoMetaData:\t\"Comment\" : \"Button\"\n#. Key:\tspell_cast_switch_select\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Select\"\nmsgstr \"Select\"\n\n#. Key:\tsaves\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Menu saves\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Save Slots\"\nmsgstr \"Save Slots\"\n\n#. Key:\tseconds\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"seconds\"\nmsgstr \"seconds\"\n\n#. Key:\tselect_spells\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input right  thumbstick\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Select spells\"\nmsgstr \"Select spells\"\n\n#. Key:\tsell\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"sell item\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Sell\"\nmsgstr \"Sell\"\n\n#. Key:\tsend_automatically\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Analytics popup\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Send Automatically\"\nmsgstr \"Send Automatically\"\n\n#. Key:\tsend_no\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Analytics popup\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Do not Send\"\nmsgstr \"Do not Send\"\n\n#. Key:\tsettings\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Menu settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Settings\"\nmsgstr \"Settings\"\n\n#. Key:\tsettings_antialising\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Anti-Aliasing\"\nmsgstr \"Anti-Aliasing\"\n\n#. Key:\tsettings_antialising_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Smooths out the edges by blending the colors of the pixels around the object to create the illusion of smoothness.\"\nmsgstr \"Smooths out the edges by blending the colors of the pixels around the object to create the illusion of smoothness.\"\n\n#. Key:\tsettings_apply\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Apply\"\nmsgstr \"Apply\"\n\n#. Key:\tsettings_aspect_ratio\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Aspect Ratio\"\nmsgstr \"Aspect Ratio\"\n\n#. Key:\tsettings_aspect_ratio_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Defines what aspect ratios are available for your resolution.\"\nmsgstr \"Defines what aspect ratios are available for your resolution.\"\n\n#. Key:\tsettings_audio\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Settings panels\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Audio\"\nmsgstr \"Audio\"\n\n#. Key:\tsettings_auto_detect_controller\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Gamepad settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Auto detect Gamepad Layout\"\nmsgstr \"Auto detect Gamepad Layout\"\n\n#. Key:\tsettings_borderless\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Borderless\"\nmsgstr \"Borderless\"\n\n#. Key:\tsettings_brightness\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Settings panels\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Brightness\"\nmsgstr \"Brightness\"\n\n#. Key:\tsettings_brightness_default_value\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Brightness settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Default Value is 100%\"\nmsgstr \"Default Value is 100%\"\n\n#. Key:\tsettings_brightness_description\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Brightness settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Please adjust the brightness of the game to your display\"\nmsgstr \"Please adjust the brightness of the game to your display\"\n\n#. Key:\tsettings_collect_analytics\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Game Settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Collect Usage Statistics\"\nmsgstr \"Collect Usage Statistics\"\n\n#. Key:\tsettings_collect_analytics_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Game Settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"These are not used to identify individuals, but help us to understand players needs to improve our game.\"\nmsgstr \"These are not used to identify individuals, but help us to understand players needs to improve our game.\"\n\n#. Key:\tsettings_confirm_display_title\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings confirm\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Confirm Display Settings in\"\nmsgstr \"Confirm Display Settings in\"\n\n#. Key:\tsettings_controller\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Settings panels\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Gamepad\"\nmsgstr \"Gamepad\"\n\n#. Key:\tsettings_controller_platform\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Gamepad Layout settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Layout\"\nmsgstr \"Layout\"\n\n#. Key:\tsettings_controller_remap\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Gamepad settings\"\n#. Key:\tsettings_controller_remap_single\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Remap Controls\"\nmsgstr \"Remap Controls\"\n\n#. Key:\tsettings_controller_remap_noedit\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Gamepad settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Please use a gamepad in order to remap\"\nmsgstr \"Please use a gamepad in order to remap\"\n\n#. Key:\tsettings_controller_switch\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Settings panels\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Controls\"\nmsgstr \"Controls\"\n\n#. Key:\tsettings_display\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Settings panels\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Display\"\nmsgstr \"Display\"\n\n#. Key:\tsettings_display_damage\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Game settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Display Damage\"\nmsgstr \"Display Damage\"\n\n#. Key:\tsettings_display_damage_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Game settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Show damage as a floating number on the screen\"\nmsgstr \"Show damage as a floating number on the screen\"\n\n#. Key:\tsettings_display_enemy_hp\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Game settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Display Enemy Health\"\nmsgstr \"Display Enemy Health\"\n\n#. Key:\tsettings_display_enemy_hp_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Game settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Show a small health bar above injured enemies\"\nmsgstr \"Show a small health bar above injured enemies\"\n\n#. Key:\tsettings_display_floating_vo\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Game settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Display Floating Voice Lines\"\nmsgstr \"Display Floating Voice Lines\"\n\n#. Key:\tsettings_display_floating_vo_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Game settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Show voice lines as floating texts\"\nmsgstr \"Show voice lines as floating texts\"\n\n#. Key:\tsettings_display_fps\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Game settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Display FPS\"\nmsgstr \"Display FPS\"\n\n#. Key:\tsettings_display_fps_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Game settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Show FPS counter\"\nmsgstr \"Show FPS counter\"\n\n#. Key:\tsettings_display_mode\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Display Mode\"\nmsgstr \"Display Mode\"\n\n#. Key:\tsettings_display_mode_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"In Windowed mode you can interact with other windows easier. In Borderless mode you can quickly switch between applications.\"\nmsgstr \"In Windowed mode you can interact with other windows easier. In Borderless mode you can quickly switch between applications.\"\n\n#. Key:\tsettings_display_play_time\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Game settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Display Play Time\"\nmsgstr \"Display Play Time\"\n\n#. Key:\tsettings_display_play_time_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Game settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Show current play time\"\nmsgstr \"Show current play time\"\n\n#. Key:\tsettings_effects\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Effect Quality\"\nmsgstr \"Effect Quality\"\n\n#. Key:\tsettings_effects_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Affects the quality of particles in the world, a lower quality might make some projectiles in the world harder to see.\"\nmsgstr \"Affects the quality of particles in the world, a lower quality might make some projectiles in the world harder to see.\"\n\n#. Key:\tsettings_effects_volume\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Audio settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Sound Effects volume\"\nmsgstr \"Sound Effects volume\"\n\n#. Key:\tsettings_effects_volume_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Audio settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Adjust the sound effects volume\"\nmsgstr \"Adjust the sound effects volume\"\n\n#. Key:\tsettings_force_weak_hardware_opt\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Additional Optimizations\"\nmsgstr \"Additional Optimizations\"\n\n#. Key:\tsettings_force_weak_hardware_opt_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"In certain areas background traps are deactivated or background visuals look cheaper to gain more performance.\"\nmsgstr \"In certain areas background traps are deactivated or background visuals look cheaper to gain more performance.\"\n\n#. Key:\tsettings_fps_unlimited\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings frame limit\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Unlimited\"\nmsgstr \"Unlimited\"\n\n#. Key:\tsettings_frame_limit\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Frame Limit (FPS)\"\nmsgstr \"Frame Limit (FPS)\"\n\n#. Key:\tsettings_frame_limit_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Limit the maximum frame rate for a consistent experience.\"\nmsgstr \"Limit the maximum frame rate for a consistent experience.\"\n\n#. Key:\tsettings_fullscreen\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Fullscreen\"\nmsgstr \"Fullscreen\"\n\n#. Key:\tsettings_game\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Settings panels\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Game\"\nmsgstr \"Game\"\n\n#. Key:\tsettings_game_speed\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Game settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Game Speed\"\nmsgstr \"Game Speed\"\n\n#. Key:\tsettings_game_speed_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Game settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Changes the speed of the game.\\nHigher speed might make the game have lower FPS.\"\nmsgstr \"Changes the speed of the game.\\nHigher speed might make the game have lower FPS.\"\n\n#. Key:\tsettings_gamepad_vibration\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Gamepad Vibration intensity settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Vibration\"\nmsgstr \"Vibration\"\n\n#. Key:\tsettings_keyboard\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Settings panels\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Keyboard\"\nmsgstr \"Keyboard\"\n\n#. Key:\tsettings_keyboard_remap_noedit\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Keyboard Settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Please use a keyboard in order to change the keyboard input\"\nmsgstr \"Please use a keyboard in order to change the keyboard input\"\n\n#. Key:\tsettings_language\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Game settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Language\"\nmsgstr \"Language\"\n\n#. Key:\tsettings_language_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Game settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Change the display and locale (numbers, dates) language\"\nmsgstr \"Change the display and locale (numbers, dates) language\"\n\n#. Key:\tsettings_master_volume\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Audio settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Master volume\"\nmsgstr \"Master volume\"\n\n#. Key:\tsettings_master_volume_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Audio settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Adjust the master volume\"\nmsgstr \"Adjust the master volume\"\n\n#. Key:\tsettings_merciful_bounce\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"game settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Merciful Bounce Mode\"\nmsgstr \"Merciful Bounce Mode\"\n\n#. Key:\tsettings_merciful_bounce_always\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"defines when (in which difficulty mode) is the easier bounce mode active\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Always\"\nmsgstr \"Always\"\n\n#. Key:\tsettings_merciful_bounce_never\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"defines when (in which difficulty mode) is the easier bounce mode active\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Never\"\nmsgstr \"Never\"\n\n#. Key:\tsettings_merciful_bounce_on_easy\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"defines when (in which difficulty mode) is the easier bounce mode active\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"On Easy\"\nmsgstr \"On Easy\"\n\n#. Key:\tsettings_merciful_bounce_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"tooltip for Merciful Bounce Mode option\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Allows Higher Bounce even if the Jump button is pressed after the character hits the ground\"\nmsgstr \"Allows Higher Bounce even if the Jump button is pressed after the character hits the ground\"\n\n#. Key:\tsettings_move_left_right\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Move left/right\"\nmsgstr \"Move left/right\"\n\n#. Key:\tsettings_music_volume\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Audio settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Music volume\"\nmsgstr \"Music volume\"\n\n#. Key:\tsettings_music_volume_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Audio settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Adjust the music volume\"\nmsgstr \"Adjust the music volume\"\n\n#. Key:\tsettings_mute_audio\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Audio settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Mute audio\"\nmsgstr \"Mute audio\"\n\n#. Key:\tsettings_mute_audio_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Audio settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Mute all audio\"\nmsgstr \"Mute all audio\"\n\n#. Key:\tsettings_mute_audio_unfocused\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Audio settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Mute audio when in background\"\nmsgstr \"Mute audio when in background\"\n\n#. Key:\tsettings_mute_audio_unfocused_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Audio settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Mute the audio when the game window is not in focus\"\nmsgstr \"Mute the audio when the game window is not in focus\"\n\n#. Key:\tsettings_mute_dialogue_voice\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Audio settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Mute voices in dialogues\"\nmsgstr \"Mute voices in dialogues\"\n\n#. Key:\tsettings_mute_dialogue_voice_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Audio settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Mute the gibberish voices inside the dialogues\"\nmsgstr \"Mute the gibberish voices inside the dialogues\"\n\n#. Key:\tsettings_mute_voice\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Audio settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Mute voices outside of dialogues\"\nmsgstr \"Mute voices outside of dialogues\"\n\n#. Key:\tsettings_mute_voice_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Audio settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Mute the gibberish voices outside the dialogues\"\nmsgstr \"Mute the gibberish voices outside the dialogues\"\n\n#. Key:\tsettings_pause_game_idle\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Game settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Pause game when idle\"\nmsgstr \"Pause game when idle\"\n\n#. Key:\tsettings_pause_game_idle_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Game settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Pauses the game when the user is idle for a certain amount of minutes\"\nmsgstr \"Pauses the game when the user is idle for a certain amount of minutes\"\n\n#. Key:\tsettings_pause_game_unfocused\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Game settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Pause game when unfocused\"\nmsgstr \"Pause game when unfocused\"\n\n#. Key:\tsettings_pause_game_unfocused_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Game settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Pauses the game when the game loses focus\"\nmsgstr \"Pauses the game when the game loses focus\"\n\n#. Key:\tsettings_post_effects\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Post-Effects\"\nmsgstr \"Post-Effects\"\n\n#. Key:\tsettings_post_effects_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Affects the quality of the post process effects after the scene is rendered.\"\nmsgstr \"Affects the quality of the post process effects after the scene is rendered.\"\n\n#. Key:\tsettings_quality_epic\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings quality\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Epic\"\nmsgstr \"Epic\"\n\n#. Key:\tsettings_quality_high\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings quality\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"High\"\nmsgstr \"High\"\n\n#. Key:\tsettings_quality_low\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings quality\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Low\"\nmsgstr \"Low\"\n\n#. Key:\tsettings_quality_medium\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings quality\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Medium\"\nmsgstr \"Medium\"\n\n#. Key:\tsettings_ratio_16_10\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings Aspect Ratio\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"16:10\"\nmsgstr \"16:10\"\n\n#. Key:\tsettings_ratio_16_9\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings Aspect Ratio\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"16:9\"\nmsgstr \"16:9\"\n\n#. Key:\tsettings_ratio_4_3\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings Aspect Ratio\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"4:3\"\nmsgstr \"4:3\"\n\n#. Key:\tsettings_reset\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Reset\"\nmsgstr \"Reset\"\n\n#. Key:\tsettings_reset_default\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Settings reset to default\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Reset to Defaults\"\nmsgstr \"Reset to Defaults\"\n\n#. Key:\tsettings_reset_input_key\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input reset key to default\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Reset button to default\"\nmsgstr \"Reset button to default\"\n\n#. Key:\tsettings_resolution\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Resolution\"\nmsgstr \"Resolution\"\n\n#. Key:\tsettings_resolution_entry\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings. {0} - x, {1} - Y\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"{0}x{1}\"\nmsgstr \"{0}x{1}\"\n\n#. Key:\tsettings_resolution_scale\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Resolution Scale\"\nmsgstr \"Resolution Scale\"\n\n#. Key:\tsettings_resolution_scale_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"The desired resolution to use when rendering the game. It does not affect the UI.\\nLowering it improves performance on lower end machines.\"\nmsgstr \"The desired resolution to use when rendering the game. It does not affect the UI.\\nLowering it improves performance on lower end machines.\"\n\n#. Key:\tsettings_resolution_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Allows changing the Screen Resolution.\"\nmsgstr \"Allows changing the Screen Resolution.\"\n\n#. Key:\tsettings_select_another\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Settings input\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Select another\"\nmsgstr \"Select another\"\n\n#. Key:\tsettings_shadows\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Shadow Quality\"\nmsgstr \"Shadow Quality\"\n\n#. Key:\tsettings_shadows_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"The higher the quality the finer the shadow.\"\nmsgstr \"The higher the quality the finer the shadow.\"\n\n#. Key:\tsettings_textures\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Texture Quality\"\nmsgstr \"Texture Quality\"\n\n#. Key:\tsettings_textures_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Surfaces of the game world will increase in fidelity if the setting is higher.\"\nmsgstr \"Surfaces of the game world will increase in fidelity if the setting is higher.\"\n\n#. Key:\tsettings_unknown\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Unknown\"\nmsgstr \"Unknown\"\n\n#. Key:\tsettings_volumetric_fog\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Volumetric Fog\"\nmsgstr \"Volumetric Fog\"\n\n#. Key:\tsettings_volumetric_fog_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Realistic looking fog. Has a high performance impact, disable it to improve performance.\"\nmsgstr \"Realistic looking fog. Has a high performance impact, disable it to improve performance.\"\n\n#. Key:\tsettings_vsync\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Vertical Sync\"\nmsgstr \"Vertical Sync\"\n\n#. Key:\tsettings_vsync_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Synchronize the game refresh rate with the monitor refresh rate. Disable it for higher framerate and better input response.\\nWhen enabled it prevents screen tearing.\"\nmsgstr \"Synchronize the game refresh rate with the monitor refresh rate. Disable it for higher framerate and better input response.\\nWhen enabled it prevents screen tearing.\"\n\n#. Key:\tsettings_windowed\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Windowed\"\nmsgstr \"Windowed\"\n\n#. Key:\tskip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"text near the press and hold to skip confirmation button\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Skip\"\nmsgstr \"Skip\"\n\n#. Key:\tspell_cast_switch_controls\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Quick select spells up/down/left/right\"\nmsgstr \"Quick select spells up/down/left/right\"\n\n#. Key:\tspell_cast_switch_select_cast\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Select & Cast\"\nmsgstr \"Select & Cast\"\n\n#. Key:\tspell_cooldown_stops_in_air\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Spell\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Cooldown only starts on ground\"\nmsgstr \"Cooldown only starts on ground\"\n\n#. Key:\tspell_only_in_air\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Spell\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Can not be used in air\"\nmsgstr \"Can not be used in air\"\n\n#. Key:\tspell_restricted\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Spell\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Can not be used in restricted areas\"\nmsgstr \"Can not be used in restricted areas\"\n\n#. Key:\tstart\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"The name of the checkpoint. Custom Map action\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Start\"\nmsgstr \"Start\"\n\n#. Key:\tstart_game\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Menu Start Game\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Start Game\"\nmsgstr \"Start Game\"\n\n#. Key:\tstats_usage_description\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Analytics popup\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Not Yet would like to collect usage statistics from your game automatically.\\nThese are not used to identify individuals, but help us to understand players needs to improve our game.\\n\\nSelect \\\"Send Automatically\\\" to allow collection of usage statistics,\\nor \\\"Do Not Send\\\" to prevent the game from sending information to Not Yet.\\n\\nYou can change this setting at any time via the Settings Game tab.\"\nmsgstr \"Not Yet would like to collect usage statistics from your game automatically.\\nThese are not used to identify individuals, but help us to understand players needs to improve our game.\\n\\nSelect \\\"Send Automatically\\\" to allow collection of usage statistics,\\nor \\\"Do Not Send\\\" to prevent the game from sending information to Not Yet.\\n\\nYou can change this setting at any time via the Settings Game tab.\"\n\n#. Key:\tstats_usage_title\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Analytics popup\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Usage Statistics\"\nmsgstr \"Usage Statistics\"\n\n#. Key:\tstatus\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Status of a save/custom map\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Status\"\nmsgstr \"Status\"\n\n#. Key:\tsteam_main_game\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Wishlist\"\nmsgstr \"Wishlist\"\n\n#. Key:\tsteam_main_game_buy\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Buy Full Game\"\nmsgstr \"Buy Full Game\"\n\n#. Key:\tSwitch_FaceButton_Bottom\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"B Button\"\nmsgstr \"B Button\"\n\n#. Key:\tSwitch_FaceButton_Left\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Y Button\"\nmsgstr \"Y Button\"\n\n#. Key:\tSwitch_FaceButton_Right\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"A Button\"\nmsgstr \"A Button\"\n\n#. Key:\tSwitch_FaceButton_Top\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"X Button\"\nmsgstr \"X Button\"\n\n#. Key:\tSwitch_Gamepad_LeftStick_Down\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \" Switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Left Stick Down\"\nmsgstr \"Left Stick Down\"\n\n#. Key:\tSwitch_Gamepad_LeftStick_Left\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \" Switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Left Stick Left\"\nmsgstr \"Left Stick Left\"\n\n#. Key:\tSwitch_Gamepad_LeftStick_Right\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \" Switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Left Stick Right\"\nmsgstr \"Left Stick Right\"\n\n#. Key:\tSwitch_Gamepad_LeftStick_Up\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \" Switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Left Stick Up\"\nmsgstr \"Left Stick Up\"\n\n#. Key:\tSwitch_Gamepad_RightStick_Down\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \" Switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Right Stick Down\"\nmsgstr \"Right Stick Down\"\n\n#. Key:\tSwitch_Gamepad_RightStick_Left\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \" Switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Right Stick Left\"\nmsgstr \"Right Stick Left\"\n\n#. Key:\tSwitch_Gamepad_RightStick_Right\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \" Switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Right Stick Right\"\nmsgstr \"Right Stick Right\"\n\n#. Key:\tSwitch_Gamepad_RightStick_Up\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \" Switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Right Stick Up\"\nmsgstr \"Right Stick Up\"\n\n#. Key:\tSwitch_LeftThumbstick\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \" Switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Left Stick\"\nmsgstr \"Left Stick\"\n\n#. Key:\tSwitch_RightThumbstick\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \" Switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Right Stick\"\nmsgstr \"Right Stick\"\n\n#. Key:\tSwitch_Shoulder_Left\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"L Button\"\nmsgstr \"L Button\"\n\n#. Key:\tSwitch_Shoulder_Right\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"R Button\"\nmsgstr \"R Button\"\n\n#. Key:\tSwitch_special_dpad_down\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \" Switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Down Button\"\nmsgstr \"Down Button\"\n\n#. Key:\tSwitch_special_dpad_left\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \" Switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Left Button\"\nmsgstr \"Left Button\"\n\n#. Key:\tSwitch_special_dpad_right\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \" Switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Right Button\"\nmsgstr \"Right Button\"\n\n#. Key:\tSwitch_special_dpad_up\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \" Switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Up Button\"\nmsgstr \"Up Button\"\n\n#. Key:\tSwitch_special_left\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"- Button\"\nmsgstr \"- Button\"\n\n#. Key:\tSwitch_special_right\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"+ Button\"\nmsgstr \"+ Button\"\n\n#. Key:\tSwitch_Trigger_Left\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"ZL Button\"\nmsgstr \"ZL Button\"\n\n#. Key:\tSwitch_Trigger_Right\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"ZR Button\"\nmsgstr \"ZR Button\"\n\n#. Key:\tteleport_to_cp\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Menu Teleport To Checkpoint\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Teleport To Checkpoint\"\nmsgstr \"Teleport To Checkpoint\"\n\n#. Key:\tteleport_to_sk\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Menu Teleport to Soulkeeper\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Teleport To SoulKeeper\"\nmsgstr \"Teleport To SoulKeeper\"\n\n#. Key:\tthank_you_prologue\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"THANK YOU FOR PLAYING WARRIORB DEMO PROLOGUE, WE HOPE YOU HAD A GREAT TIME!\"\nmsgstr \"THANK YOU FOR PLAYING WARRIORB DEMO PROLOGUE, WE HOPE YOU HAD A GREAT TIME!\"\n\n#. Key:\ttotal_deaths\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Stats for saves\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Total Deaths\"\nmsgstr \"Total Deaths\"\n\n#. Key:\ttrade_amount_x_x\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"trade confirmation UI. {0} is the current amount and {1} is the current amount times price per item\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"{0} for {1} gold\"\nmsgstr \"{0} for {1} gold\"\n\n#. Key:\ttrade_buy\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"trade confirmation UI\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Are you sure you want to buy {ItemName} for {Gold} gold?\"\nmsgstr \"Are you sure you want to buy {ItemName} for {Gold} gold?\"\n\n#. Key:\ttrade_buy_back\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"trade confirmation UI\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Are you sure you want to buy back {ItemName} for {Gold} gold?\"\nmsgstr \"Are you sure you want to buy back {ItemName} for {Gold} gold?\"\n\n#. Key:\ttrade_no_intrested\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"trade confirmation UI\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"The trader is not interested in buying that item from you!\"\nmsgstr \"The trader is not interested in buying that item from you!\"\n\n#. Key:\ttrade_nope\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"trade confirmation UI\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Nope!\"\nmsgstr \"Nope!\"\n\n#. Key:\ttrade_okay\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"trade confirmation UI\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Okay...\"\nmsgstr \"Okay...\"\n\n#. Key:\ttrade_sell\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"trade confirmation UI\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Are you sure you want to sell {ItemName} for {Gold} gold?\"\nmsgstr \"Are you sure you want to sell {ItemName} for {Gold} gold?\"\n\n#. Key:\ttwitter\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Twitter\"\nmsgstr \"Twitter\"\n\n#. Key:\tunknown\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Unknown input binding\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"UNKNOWN\"\nmsgstr \"UNKNOWN\"\n\n#. Key:\twarriorb\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"WarriOrb\"\nmsgstr \"WarriOrb\"\n\n#. Key:\txp\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Experience Points\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"XP\"\nmsgstr \"XP\"\n\n#. Key:\tyes\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Confirm popup\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Yes\"\nmsgstr \"Yes\"\n\n"
  },
  {
    "path": "Content/Localization/WarriorbDemo/es/WarriorbDemo.po",
    "content": "﻿# WarriorbDemo Spanish translation.\n# Copyright 1998-2019 Epic Games, Inc. All Rights Reserved.\n# \nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: WarriorbDemo\\n\"\n\"POT-Creation-Date: 2020-10-07 08:08\\n\"\n\"PO-Revision-Date: 2020-10-07 08:08\\n\"\n\"Language-Team: \\n\"\n\"Language: es\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Plural-Forms: nplurals=2; plural=(n != 1);\\n\"\n\n#. Key:\tact1_loading\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"You are a Mighty Spirit from the Unknown Realm. You were torn away from your home by a pathetic mortal Wizard. After a magical accident your essence is bound to an unlikely body. Find a way out of your ball-body prison!\"\nmsgstr \"Eres un espíritu poderoso del Reino Desconocido. Un patético Mago mortal te arrancó de tu hogar. Después de un accidente mágico, tu esencia está ligada a un cuerpo fuera de lo normal. ¡Encuentra una forma de escapar del cuerpo en la que estas encerrado!\"\n\n#. Key:\tact2_loading\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Reaching Crossroad Cave you are a step closer to the Three Artifacts - and to freedom.\"\nmsgstr \"Al llegar a Cueva Cruce Caminos, estás un paso más cerca de los Tres Artefactos, y de la libertad.\"\n\n#. Key:\tact3_loading\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Finding the Three Artifacts required all your skills and strength. You hope that delivering them to the Wizard will be less difficult.\"\nmsgstr \"Encontrar los Tres Artefactos requería todas tus habilidades y fuerza. Esperas que entregarlos al Mago sea menos difícil.\"\n\n#. Key:\tact_1\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"text displayed on black screen the first time a chapter is started\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Act I\"\nmsgstr \"Acto I\"\n\n#. Key:\tact_2\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"text displayed on black screen the first time a chapter is started\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Act II\"\nmsgstr \"Acto II\"\n\n#. Key:\tact_3\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"text displayed on black screen the first time a chapter is started\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Act III\"\nmsgstr \"Acto III\"\n\n#. Key:\tancient_arcade\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an area\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Ancient Arcade\"\nmsgstr \"Arcade antiguo\"\n\n#. Key:\tbubble_border\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an area\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Bubble Border\"\nmsgstr \"Frontera de Burbujas\"\n\n#. Key:\tcerulean_city\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an area\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Cerulean City\"\nmsgstr \"Ciudad de Cerulean\"\n\n#. Key:\tchasm_chamber\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an area\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Chasm Chamber\"\nmsgstr \"Cámara del abismo\"\n\n#. Key:\tcrossroad_cave\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an area\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Crossroad Cave\"\nmsgstr \"Cueva Cruce Caminos\"\n\n#. Key:\tdarkest_dungeon\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an area\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Darkest Dungeon\"\nmsgstr \"Mazmorra Oscura\"\n\n#. Key:\tdwarven_dungeons\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an area\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Dwarven Dungeons\"\nmsgstr \"Mazmorra de los Enanos\"\n\n#. Key:\tending_loading\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Finally! You did your part of the deal, now it's the Wizard's turn to get you back home.\"\nmsgstr \"¡Por fin! Hiciste tu parte del trato, ahora es el turno del Mago de llevarte a casa.\"\n\n#. Key:\tepilogue\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"text displayed on black screen the first time a chapter is started\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Epilogue\"\nmsgstr \"Epílogo\"\n\n#. Key:\tgrey_gate\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an area\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Grey Gate\"\nmsgstr \"Puerta Gris\"\n\n#. Key:\thallowed_heart\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an area, Hallowed as in made holy; consecrated.\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Hallowed Heart\"\nmsgstr \"Corazón Sagrado\"\n\n#. Key:\tintro_subtitle_0\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" intro subtitle line 1\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"I wish I could just... turn back time to undo what I have done.\"\nmsgstr \"Desearía poder... retroceder en el tiempo para deshacer lo que he hecho.\"\n\n#. Key:\tintro_subtitle_1\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" intro subtitle line 01\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"However the past is behind us\"\nmsgstr \"Pero el pasado está detrás de nosotros\"\n\n#. Key:\tintro_subtitle_2\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" intro subtitle line 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"and all I can change now\"\nmsgstr \"y todo lo que puedo cambiar\"\n\n#. Key:\tintro_subtitle_3\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" intro subtitle line 3\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"is the future.\"\nmsgstr \"es el futuro.\"\n\n#. Key:\tlast_land\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an area\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Last Land\"\nmsgstr \"La Última Tierra\"\n\n#. Key:\tlava_lair\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an area\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Lava Lair\"\nmsgstr \"Guarida de Lava\"\n\n#. Key:\tloading_tip_act1_0\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 1\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"In Ball form you go faster.\"\nmsgstr \"En forma de pelota vas más rápido.\"\n\n#. Key:\tloading_tip_act1_1\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 1\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"In Ball form you bounce back when you hit a surface.\"\nmsgstr \"En forma de pelota, rebotas cuando chocas con una superficie.\"\n\n#. Key:\tloading_tip_act1_2\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 1\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Each weapon has its own unique special strike.\"\nmsgstr \"Cada arma tiene su golpe especial único.\"\n\n#. Key:\tloading_tip_act1_3\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 1\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Most of the people died after Ruin happened, but there are still some survivors.\"\nmsgstr \"La mayoría de la gente murió después de que Ruin ocurriera, pero todavía hay algunos supervivientes.\"\n\n#. Key:\tloading_tip_act1_4\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 1\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Some items can’t be used but merchants still like to buy them.\"\nmsgstr \"Algunos artículos no se pueden usar pero a los comerciantes les gusta comprarlos.\"\n\n#. Key:\tloading_tip_act1_5\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 1\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"There are many keys, and when I say many, I mean it.\"\nmsgstr \"Hay muchas llaves, y cuando digo muchas, lo digo en serio.\"\n\n#. Key:\tloading_tip_act1_6\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 1\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"When you find an item it would make sense to check what it is, wouldn’t it?\"\nmsgstr \"Cuando encuentre un artículo, tendría sentido comprobar qué es, ¿no?\"\n\n#. Key:\tloading_tip_act1_7\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 1\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Spells can make combat easier.\"\nmsgstr \"Los hechizos pueden facilitar el combate.\"\n\n#. Key:\tloading_tip_act1_8\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 1\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Dying often is absolutely normal. If you don’t die a lot, you are doing something wrong.\"\nmsgstr \"Morir a menudo es absolutamente normal. Si no mueres mucho, estás haciendo algo mal.\"\n\n#. Key:\tloading_tip_act1_9\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 1\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"You can always check the Sidenotes in your Inventory to see if you have any side quests.\"\nmsgstr \"Siempre puede mirar las Notas en su Inventario para ver si tiene alguna misión secundaria.\"\n\n#. Key:\tloading_tip_act2_0\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Using the Railway can shorten your journey.\"\nmsgstr \"Usar el ferrocarril puede reducir su viaje.\"\n\n#. Key:\tloading_tip_act2_1\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"We’ll try to make our next game without any loading screens, we promise...\"\nmsgstr \"Intentaremos hacer nuestro próximo juego sin pantallas de carga, te lo prometemos...\"\n\n#. Key:\tloading_tip_act2_2\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Choosing the right weapon against a Boss will make your life easier.\"\nmsgstr \"Elegir el arma correcta contra un jefe te hará la vida más fácil.\"\n\n#. Key:\tloading_tip_act2_3\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Don’t forget to use the Soulkeeper!\"\nmsgstr \"¡No olvides usar el Guardián de Almas!\"\n\n#. Key:\tloading_tip_act2_4\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Finding the Artefacts might be hard, but this is your only chance to get out.\"\nmsgstr \"Encontrar los artefactos puede ser difícil, pero esta es tu única oportunidad de salir.\"\n\n#. Key:\tloading_tip_act2_5\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Talk to any Survivor if you can. They might be able to help you.\"\nmsgstr \"Habla con cualquier Superviviente si puedes. Podrían ayudarte.\"\n\n#. Key:\tloading_tip_act2_6\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"If you find an area too difficult you can always go to another area first.\"\nmsgstr \"Si encuentra un área demasiado difícil, siempre puede ir a otra área primero.\"\n\n#. Key:\tloading_tip_act2_7\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Don’t forget to spend your gold! (Ad sponsored by Gnory)\"\nmsgstr \"¡No olvides gastar tu oro! (Anuncio patrocinado por Gnory)\"\n\n#. Key:\tloading_tip_act2_8\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Equipping the right items will make the combat easier.\"\nmsgstr \"Equipar los elementos correctos facilitará el combate.\"\n\n#. Key:\tloading_tip_act2_9\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"If you manage to defeat every member of a group you won’t have to fight them ever again.\"\nmsgstr \"Si logras derrotar a todos los miembros de un grupo, no tendrás que luchar contra ellos nunca más.\"\n\n#. Key:\tloading_tip_act3_0\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 3\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Using the Railway can also make your Journey longer.\"\nmsgstr \"Usar el ferrocarril también puede hacer que tu viaje sea más largo.\"\n\n#. Key:\tloading_tip_act3_1\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 3\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"If you got this far, you surely know everything now.\"\nmsgstr \"Si llegaste tan lejos, seguramente ya lo sabes todo.\"\n\n#. Key:\tloading_tip_act3_2\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 3\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Loading screen tips are very useful - except in a few cases.\"\nmsgstr \"Los consejos de la pantalla de carga son muy útiles, excepto en algunos casos.\"\n\n#. Key:\tloading_tip_act3_3\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 3\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Now is your time to think about the fate of the Ruined Realm.\"\nmsgstr \"Ahora es tu momento de pensar en el destino del Reino Arruinado.\"\n\n#. Key:\tloading_tip_act3_4\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 3\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"The End is near... I mean no loading screen can take forever, right?\"\nmsgstr \"El fin está cerca... quiero decir que ninguna pantalla de carga puede durar para siempre, ¿verdad?\"\n\n#. Key:\tloading_tip_act3_5\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 3\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Now your only task is to bring the Artefacts to Wizard.\"\nmsgstr \"Ahora tu única tarea es llevar los Artefactos al Mago.\"\n\n#. Key:\tloading_tip_act3_6\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 3\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"If you find a combat too hard try to use different shards, spells, and weapons.\"\nmsgstr \"Si encuentras un combate demasiado difícil, intenta usar diferentes fragmentos, hechizos y armas.\"\n\n#. Key:\tloading_tip_act3_7\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 3\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Don’t give up! Victory is close.\"\nmsgstr \"¡No te rindas! La victoria está cerca.\"\n\n#. Key:\tloading_tip_end_0\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for epilogue\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"The Human Realm is a weird place...\"\nmsgstr \"El Reino Humano es un lugar extraño...\"\n\n#. Key:\tloading_tip_end_1\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for epilogue\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"You really did your part of the deal, now it’s time to go home!\"\nmsgstr \"Realmente hiciste tu parte del trato, ¡ahora es el momento de ir a casa!\"\n\n#. Key:\tloading_tip_end_2\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for epilogue\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Should you care about the fate of the Realms?\"\nmsgstr \"¿Deberías preocuparte por el destino de los Reinos?\"\n\n#. Key:\tloading_tip_end_3\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for epilogue\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Looks like it’s always you who has to take care of the mess others left behind.\"\nmsgstr \"Parece que siempre eres tú quien tiene que ocuparse del desorden que otros han dejado.\"\n\n#. Key:\tloading_tip_end_4\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for epilogue\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Time to finish what you started. One way or another.\"\nmsgstr \"Es hora de terminar lo que empezaste. De una manera u otra.\"\n\n#. Key:\tlost_land\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an area\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Lost Land\"\nmsgstr \"Tierra Perdida\"\n\n#. Key:\tobedient_outpost\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an area\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Obedient Outpost\"\nmsgstr \"Puesto Avanzado Obediente\"\n\n#. Key:\tperfect_palace\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an area\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Perfect Palace\"\nmsgstr \"Palacio Perfecto\"\n\n#. Key:\tportal_place\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an area\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Portal Place\"\nmsgstr \"Lugar del Portal\"\n\n#. Key:\tprogress_act1_arcade1\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Remnants of a Realm\"\nmsgstr \"Restos de un Reino\"\n\n#. Key:\tprogress_act1_arcade2\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Discovering Ancient Technology\"\nmsgstr \"Descubriendo Tecnología Antigua\"\n\n#. Key:\tprogress_act1_before_raven\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Searching for a way out\"\nmsgstr \"Buscando una salida\"\n\n#. Key:\tprogress_act1_boss_fight\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Facing the Keeper\"\nmsgstr \"Enfrentar al Guardián\"\n\n#. Key:\tprogress_act1_gem\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Looking for a Gem\"\nmsgstr \"Buscando una Gema\"\n\n#. Key:\tprogress_act1_infuse\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Infusing the Gem\"\nmsgstr \"Infundiendo la Gema\"\n\n#. Key:\tprogress_act1_portals\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Looking for a Portal\"\nmsgstr \"Buscando un Portal\"\n\n#. Key:\tprogress_act1_start\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Lost in Ruin\"\nmsgstr \"Perdido en Ruin\"\n\n#. Key:\tprogress_act1_test_stone\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Bouncing Stones\"\nmsgstr \"Piedras Rebotando\"\n\n#. Key:\tprogress_act1_tut1\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Am I Worthy?\"\nmsgstr \"¿Soy Digno?\"\n\n#. Key:\tprogress_act1_tut2\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Sewer again\"\nmsgstr \"Alcantarilla de nuevo\"\n\n#. Key:\tprogress_act1_tut3\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Third time Worthy\"\nmsgstr \"Tercera vez Digno\"\n\n#. Key:\tprogress_act2_crossroad\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"At a crossroad\"\nmsgstr \"En un cruce de caminos\"\n\n#. Key:\tprogress_act2_dwarf_0\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Into the Blue\"\nmsgstr \"En el Azul\"\n\n#. Key:\tprogress_act2_dwarf_1\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Elevator Gem and Key\"\nmsgstr \"Ascensor Gema y Llave\"\n\n#. Key:\tprogress_act2_dwarf_2\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Opening the Gate\"\nmsgstr \"Abriendo la Puerta\"\n\n#. Key:\tprogress_act2_dwarf_boss\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Dwarven Statue\"\nmsgstr \"Estatua de los Enanos\"\n\n#. Key:\tprogress_act2_end\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"To the Fourth Station\"\nmsgstr \"A la Cuarta Estación\"\n\n#. Key:\tprogress_act2_lava_0\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Into the Red\"\nmsgstr \"En el Rojo\"\n\n#. Key:\tprogress_act2_lava_1\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Uniting Key Pieces\"\nmsgstr \"Uniendo Piezas de Llave\"\n\n#. Key:\tprogress_act2_lava_2\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Climbing the Tower\"\nmsgstr \"Escalando la Torre\"\n\n#. Key:\tprogress_act2_lava_boss\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Armour Wrath\"\nmsgstr \"Ira de Armadura\"\n\n#. Key:\tprogress_act2_ww_0\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Into the Green\"\nmsgstr \"En el Verde\"\n\n#. Key:\tprogress_act2_ww_1\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Through the Lake\"\nmsgstr \"A Través del Lago\"\n\n#. Key:\tprogress_act2_ww_2\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Being Followed\"\nmsgstr \"Siendo Seguido\"\n\n#. Key:\tprogress_act2_ww_boss\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Fallen Druid\"\nmsgstr \"Druida Caído\"\n\n#. Key:\tprogress_act3_floating\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in act 3\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Floating\"\nmsgstr \"Flotando\"\n\n#. Key:\tprogress_act3_monk\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in act 3\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Monk's Home\"\nmsgstr \"Hogar del Monje\"\n\n#. Key:\tprogress_act3_pipes\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in act 3\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Moving Pipes\"\nmsgstr \"Tuberías móviles\"\n\n#. Key:\tprogress_act3_start\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in act 3\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Lost in the Caves\"\nmsgstr \"Perdido en las Cuevas\"\n\n#. Key:\tprogress_act3_way_out\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in act 3\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Way out of the Realm\"\nmsgstr \"Salida del Reino\"\n\n#. Key:\tprogress_epilogue_boss\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in epilogue\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"The Real Demon\"\nmsgstr \"El Verdadero Demonio\"\n\n#. Key:\tprogress_epilogue_castle\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in epilogue\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Wizard's Castle\"\nmsgstr \"Castillo del Mago\"\n\n#. Key:\tprogress_epilogue_past_and_future\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in epilogue\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Past and Future\"\nmsgstr \"Pasado y Futuro\"\n\n#. Key:\tprogress_epilogue_save_creatures\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in epilogue\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Chance for everyone\"\nmsgstr \"Oportunidad para todos\"\n\n#. Key:\tprogress_epilogue_separate_worlds\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in epilogue\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Separated Worlds\"\nmsgstr \"Mundos Separados\"\n\n#. Key:\tprologue\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"text displayed on black screen the first time a chapter is started\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Prologue\"\nmsgstr \"Prólogo\"\n\n#. Key:\tremnant_road\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an area\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Remnant Road\"\nmsgstr \"Camino Remanente\"\n\n#. Key:\truined_realm\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Ruined Realm\"\nmsgstr \"Reino Arruinado\"\n\n#. Key:\tsnake_slide\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an area\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Snake Slide\"\nmsgstr \"Tobogán de Serpiente\"\n\n#. Key:\tsunken_sewer\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an area\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Sunken Sewer\"\nmsgstr \"Alcantarilla Hundida\"\n\n#. Key:\twhite_wall\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"White Wall\"\nmsgstr \"Pared Blanca\"\n\n#. Key:\twracked_waters\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an area\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Wracked Waters\"\nmsgstr \"Aguas Destrozadas\"\n\n#. Key:\tcredits_fmod\n#. SourceLocation:\tLocalization/StringTables/Credits.csv\n#: Localization/StringTables/Credits.csv\nmsgctxt \"Credits\"\nmsgid \"Made with FMOD Studio by Firelight Technologies Pty Ltd.\"\nmsgstr \"Hecho con FMOD Studio por Firelight Technologies Pty Ltd.\"\n\n#. Key:\tMonthApril\n#. SourceLocation:\tSource/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:17\n#: Source/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:17\nmsgctxt \"DateTimeHelper\"\nmsgid \"April\"\nmsgstr \"Abril\"\n\n#. Key:\tMonthAugust\n#. SourceLocation:\tSource/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:21\n#: Source/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:21\nmsgctxt \"DateTimeHelper\"\nmsgid \"August\"\nmsgstr \"Agosto\"\n\n#. Key:\tMonthDecember\n#. SourceLocation:\tSource/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:26\n#: Source/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:26\nmsgctxt \"DateTimeHelper\"\nmsgid \"December\"\nmsgstr \"Diciembre\"\n\n#. Key:\tMonthFebruary\n#. SourceLocation:\tSource/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:15\n#: Source/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:15\nmsgctxt \"DateTimeHelper\"\nmsgid \"February\"\nmsgstr \"Febrero\"\n\n#. Key:\tMonthJanuary\n#. SourceLocation:\tSource/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:14\n#: Source/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:14\nmsgctxt \"DateTimeHelper\"\nmsgid \"January\"\nmsgstr \"Enero\"\n\n#. Key:\tMonthJuly\n#. SourceLocation:\tSource/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:20\n#: Source/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:20\nmsgctxt \"DateTimeHelper\"\nmsgid \"July\"\nmsgstr \"Julio\"\n\n#. Key:\tMonthJune\n#. SourceLocation:\tSource/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:19\n#: Source/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:19\nmsgctxt \"DateTimeHelper\"\nmsgid \"June\"\nmsgstr \"Junio\"\n\n#. Key:\tMonthMarch\n#. SourceLocation:\tSource/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:16\n#: Source/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:16\nmsgctxt \"DateTimeHelper\"\nmsgid \"March\"\nmsgstr \"Marzo\"\n\n#. Key:\tMonthMay\n#. SourceLocation:\tSource/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:18\n#: Source/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:18\nmsgctxt \"DateTimeHelper\"\nmsgid \"May\"\nmsgstr \"Mayo\"\n\n#. Key:\tMonthNovember\n#. SourceLocation:\tSource/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:24\n#: Source/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:24\nmsgctxt \"DateTimeHelper\"\nmsgid \"November\"\nmsgstr \"Noviembre\"\n\n#. Key:\tMonthOctober\n#. SourceLocation:\tSource/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:23\n#: Source/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:23\nmsgctxt \"DateTimeHelper\"\nmsgid \"October\"\nmsgstr \"Octubre\"\n\n#. Key:\tMonthSeptember\n#. SourceLocation:\tSource/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:22\n#: Source/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:22\nmsgctxt \"DateTimeHelper\"\nmsgid \"September\"\nmsgstr \"Septiembre\"\n\n#. Key:\tSecondsToTime\n#. SourceLocation:\tSource/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:48\n#: Source/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:48\nmsgctxt \"DateTimeHelper\"\nmsgid \"{Minutes}:{Seconds}\"\nmsgstr \"{Minutes}:{Seconds}\"\n\n#. Key:\tSecondsToTimeMinusSeconds\n#. SourceLocation:\tSource/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:51\n#: Source/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:51\nmsgctxt \"DateTimeHelper\"\nmsgid \"{Hours}:{Minutes}:{Seconds}\"\nmsgstr \"{Hours}:{Minutes}:{Seconds}\"\n\n#. Key:\tchar_name_ball_e\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"possible display name for character\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"BALL-E\"\nmsgstr \"BOLA-E\"\n\n#. Key:\tchar_name_destroyer\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"possible display name for character\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Destroyer\"\nmsgstr \"Destructor\"\n\n#. Key:\tchar_name_dont_buy\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"possible display name for character\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Don't buy\"\nmsgstr \"No compres\"\n\n#. Key:\tchar_name_dr_ball\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"possible display name for character\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Dr. Ball\"\nmsgstr \"Dr. Pelota\"\n\n#. Key:\tchar_name_epic_sphero\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"possible display name for character\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Epic Sphero\"\nmsgstr \"Sphero Épico\"\n\n#. Key:\tchar_name_failed_one\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"possible display name for character\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Failed One\"\nmsgstr \"El Fallado\"\n\n#. Key:\tchar_name_saviour\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"possible display name for character\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Saviour\"\nmsgstr \"Salvador\"\n\n#. Key:\tchar_name_sorbcerer\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"possible display name for character\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Sorbcerer\"\nmsgstr \"Hechicero\"\n\n#. Key:\tchar_name_spirit_of_the_unknown\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"possible display name for character\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Spirit Of the Unknown\"\nmsgstr \"Espíritu de lo Desconocido\"\n\n#. Key:\tchar_name_ultimate_frisbee\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"possible display name for character\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Ultimate Frisbee\"\nmsgstr \"Ultimate Frisbee\"\n\n#. Key:\tchar_name_wanderer\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"possible display name for character\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Wanderer\"\nmsgstr \"Errante\"\n\n#. Key:\tchar_name_warlorb\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"possible display name for character\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Warlorb\"\nmsgstr \"Warlorb\"\n\n#. Key:\tchar_name_warriorb\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"possible display name for character\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"WarriOrb\"\nmsgstr \"WarriOrb\"\n\n#. Key:\tfinish\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"default option\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Finish\"\nmsgstr \"Terminar\"\n\n#. Key:\tgold_gained\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"{0} Gold Gained\"\nmsgstr \"{0} Oro obtenido\"\n\n#. Key:\tgold_lost\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"{0} Gold Lost\"\nmsgstr \"{0} Oro perdido\"\n\n#. Key:\titem_gained\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"{ItemName} gained!\"\nmsgstr \"¡{ItemName} conseguido!\"\n\n#. Key:\titem_gained_n\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"{Amount} {ItemName} gained!\"\nmsgstr \"¡{Amount} {ItemName} conseguido!\"\n\n#. Key:\titem_lost\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"{ItemName} lost!\"\nmsgstr \"¡{ItemName} perdido!\"\n\n#. Key:\titem_lost_n\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"{Amount} {ItemName} lost!\"\nmsgstr \"¡{Amount} {ItemName} perdido!\"\n\n#. Key:\tnext\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"default option\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Next\"\nmsgstr \"Siguiente\"\n\n#. Key:\tnpc_altar\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"npc if BPLanguage Improver\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Altar\"\nmsgstr \"Altar\"\n\n#. Key:\tnpc_ancient_gate\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an npc\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Ancient Gate\"\nmsgstr \"Puerta Antigua\"\n\n#. Key:\tnpc_demon_lillian\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"name of the final boss\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Demon Lillian\"\nmsgstr \"Demonio lillian\"\n\n#. Key:\tnpc_dwarven_workshop\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"name of the place the character can have a dialogue to craft a quest item\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Dwarven Workshop\"\nmsgstr \"Taller de los Enanos\"\n\n#. Key:\tnpc_fishy\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"display name of an npc\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Fishy\"\nmsgstr \"Fishy\"\n\n#. Key:\tnpc_fountain\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"display name of a fountain the character can talk with\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Fountain\"\nmsgstr \"Fuente\"\n\n#. Key:\tnpc_gatekeeper\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an npc\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Gatekeeper\"\nmsgstr \"Guardián de la Puerta\"\n\n#. Key:\tnpc_ghost_dwarf\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an npc (actually a ghost of a dwarf)\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Ghost Dwarf\"\nmsgstr \"Fantasnano\"\n\n#. Key:\tnpc_gnory\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an npc\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Gnory\"\nmsgstr \"Gnory\"\n\n#. Key:\tnpc_golem_maker\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an npc\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Golem Maker\"\nmsgstr \"Creador de Golems\"\n\n#. Key:\tnpc_lory\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an npc\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Lory\"\nmsgstr \"Lory\"\n\n#. Key:\tnpc_lory_unkown\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"display name of Lory before she introduces herself\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Gnome Lady\"\nmsgstr \"Señora Gnomo\"\n\n#. Key:\tnpc_magic_mirror\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an npc\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Magic Mirror\"\nmsgstr \"Espejo Mágico\"\n\n#. Key:\tnpc_merchant\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an npc\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Merch Ant\"\nmsgstr \"Hormiga Merch\"\n\n#. Key:\tnpc_merchant_voice\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"name of a small ant until he says his name (only a voice cause player can not see it)\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Voice\"\nmsgstr \"Voz\"\n\n#. Key:\tnpc_monk\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an npc\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Monk\"\nmsgstr \"Monje\"\n\n#. Key:\tnpc_name_kobold\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Kobold Chef\"\nmsgstr \"Cocinero Kobold\"\n\n#. Key:\tnpc_pipe_walker\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"display name of some weird creatures\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Pipe Walker\"\nmsgstr \"Trotadesagües\"\n\n#. Key:\tnpc_raven\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an npc (he is actually a bird)\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Raven\"\nmsgstr \"Cuervo\"\n\n#. Key:\tnpc_scholar\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an npc\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Scholar\"\nmsgstr \"Erudito\"\n\n#. Key:\tnpc_secret_hideout\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"display name of a door asking for a password\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Secret Hideout Gate\"\nmsgstr \"Puerta de Escondite Secreto\"\n\n#. Key:\tnpc_sewer_creature\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an npc\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Sewer Creature\"\nmsgstr \"Criatura de Alcantarilla\"\n\n#. Key:\tnpc_statue\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an npc\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Statue\"\nmsgstr \"Estatua\"\n\n#. Key:\tnpc_supper_dwarf\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"display name of an npc. Supper refers here an evening meal, typically a light or informal one.\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Supper Dwarf\"\nmsgstr \"cEnano\"\n\n#. Key:\tnpc_teachy\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an npc\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Teachy\"\nmsgstr \"Teachy\"\n\n#. Key:\tnpc_teachy_unkown\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"name of Teachy before introduction\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Bored Gnome\"\nmsgstr \"Gnomo aburrido\"\n\n#. Key:\tnpc_tomb\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"display name of a tomb a character can talk to\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Tomb\"\nmsgstr \"Tumba\"\n\n#. Key:\tnpc_unknown_wizard\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"display name of an npc\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Unknown Wizard\"\nmsgstr \"Mago Desconocido\"\n\n#. Key:\tnpc_wizard\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"display name of the wizard npc\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Wizard\"\nmsgstr \"Mago\"\n\n#. Key:\t022227664F6F422B20B109A19B8789AA\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"I’m glad you are back again!\"\nmsgstr \"¡Me alegro de que hayas vuelto!\"\n\n#. Key:\t0944D8A541F933BEB5DD068CA9099075\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_44.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_44.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"I think I managed to activate the device on the wall of the Portal Tower.\"\nmsgstr \"Creo que logré activar el aparato en la pared de la Torre del Portal.\"\n\n#. Key:\t10ADF4F948FB99445BF791BB0722AD90\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_25.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_25.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Good idea.\"\nmsgstr \"Buena idea.\"\n\n#. Key:\t137B87BB447D45E46C0425A940E8B7F0\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_46.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_46.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"You said you wouldn't do it...\"\nmsgstr \"Dijiste que no lo harías...\"\n\n#. Key:\t16358AE840D8B8553E8930A3B7E69BBA\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"You know, sometimes I miss the Pipewalkers...\"\nmsgstr \"Sabes, a veces extraño a los Caminantes de las Tuberías...\"\n\n#. Key:\t1B9834C6405C60960F322585AB0F1704\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_38.Text\n#. Key:\t2189E8064ACF974902FBA49BD12D0F47\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_38.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Could you activate it for me?\"\nmsgstr \"¿Podrías activarlo por mí?\"\n\n#. Key:\t274EB7AD410061E3E200A9813A54AB29\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"I think I've already done that.\"\nmsgstr \"Creo que ya lo hice.\"\n\n#. Key:\t2A57878148EFCC8532E34CAE1B9C9A0F\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"You? I never thought I’ll see you in this shape again.\"\nmsgstr \"¿Tú? Nunca pensé que volvería a verte en esta forma.\"\n\n#. Key:\t3764BB48401ABEDCD125F186B4BF0E17\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"And it also attracts the Pipewalkers.\"\nmsgstr \"Y también atrae a los Caminantes de las Tuberías.\"\n\n#. Key:\t3A0924F7449355545C0A98B94994616B\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"I want to find my tribe.\"\nmsgstr \"Quiero encontrar mi tribu.\"\n\n#. Key:\t3C0498284D71B7B64FEA4094F42A5502\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_23.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_23.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Do you think you will find Pipewalkers here?\"\nmsgstr \"¿Crees que encontrarás los Caminantes de las Tuberías aquí?\"\n\n#. Key:\t3DCACAB047175FB687542AB0CA25D972\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_38.Children(1).Children.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_38.Children(1).Children.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Decline\"\nmsgstr \"Rechazar\"\n\n#. Key:\t41C1FCA947041D49247FC8A157D7407F\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_52.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_52.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"All right, thank you.\"\nmsgstr \"Está bien. Gracias.\"\n\n#. Key:\t43C8FE9248340E49F1F31882D7B96642\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"If they are still alive they must be beyond that Purple Portal.\"\nmsgstr \"Si todavía están vivos, deben estar más allá de ese Portal Morado.\"\n\n#. Key:\t444DD931423A98C7DD95D4BB73F0F1C6\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_39.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_39.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Sure! I’ll see what I can do.\"\nmsgstr \"¡Vale! Veré lo que puedo hacer.\"\n\n#. Key:\t4FF2FA154BEFBD448EFDB0BB7FE3F0AF\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_11.Children(1).Children.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_11.Children(1).Children.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Tribe\"\nmsgstr \"Tribu\"\n\n#. Key:\t52A8B1F04C37F262E014DEA14AB68957\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Because I’m a chef.\"\nmsgstr \"Porque soy cocinero.\"\n\n#. Key:\t5F376BF945B8CE4AA12B7EB05F8C62A5\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_11.Children(6).Children.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_11.Children(6).Children.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Leave\"\nmsgstr \"Salir\"\n\n#. Key:\t63EA4DDD45390542E3A904928143D9AF\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Haha... Yes I’m back again.\"\nmsgstr \"Jaja... Sí, estoy de vuelta otra vez.\"\n\n#. Key:\t64EE856046A396F2750AE1BC1042CF26\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_30.Text\n#. Key:\tE3F52F4F47289406E4A546BB0BF3AC3F\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_50.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_30.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_50.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Thanks!\"\nmsgstr \"¡Gracias!\"\n\n#. Key:\t694B6E3F4F4C7CEAAACB51A2D30FFD26\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_11.Children(2).Children.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_11.Children(2).Children.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Ruin\"\nmsgstr \"Ruin\"\n\n#. Key:\t7304F1034A83C6D17E274090FA8E543B\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_41.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_41.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Thank you!\"\nmsgstr \"¡Gracias!\"\n\n#. Key:\t73240093450B12BEEA1EB78C9CF7D89E\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_11.Children(0).Children.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_11.Children(0).Children.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Purple Portal\"\nmsgstr \"Portal Morado\"\n\n#. Key:\t804671AF40165C92FA6A8F8A5AE97997\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_60.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_60.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Looks like I can’t get rid of this body.\"\nmsgstr \"Parece que no puedo deshacerme de este cuerpo.\"\n\n#. Key:\t807FF1A945548216DAD305B4D5A4437F\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_24.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_24.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"If there are any they will come here when they smell the soup.\"\nmsgstr \"Si hay alguno, vendrán aquí cuando huelan la sopa.\"\n\n#. Key:\t8240EF7946C8434333AFAEBEF3583917\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_34.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_34.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Do you need help with something?\"\nmsgstr \"¿Necesitas ayuda con algo?\"\n\n#. Key:\t833BB4384231444247779CAB596D0259\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_40.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_40.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"I’m sorry but that sounds complicated.\"\nmsgstr \"Lo siento pero eso suena complicado.\"\n\n#. Key:\t85656A9E46844B03D49E13AC951FDE07\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_59.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_59.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"See you!\"\nmsgstr \"¡Nos vemos!\"\n\n#. Key:\t869485E24E19938DEE48BFB5C5240BB3\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_29.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_29.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"I’m not sure... but I have a key which might be useful.\"\nmsgstr \"No estoy seguro... pero tengo una llave que podría ser útil.\"\n\n#. Key:\t86FBA5A24734DD97167512A054A2E0D9\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Oh, it’s you.\"\nmsgstr \"Oh, eres tú.\"\n\n#. Key:\t891684A24BA64E351E7F0B9ADEA3D6DF\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"No. To be honest I don’t care much about Ruin.\"\nmsgstr \"No. Para ser honesto, no me importa mucho sobre Ruin.\"\n\n#. Key:\t8FF6BF7B4745BB75C2D8F7873C492C2D\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_11.Children(4).Children.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_11.Children(4).Children.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Can I help?\"\nmsgstr \"¿Puedo ayudar?\"\n\n#. Key:\t93B13014434102C8033B41A06DBED69B\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_11.Children(5).Children.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_11.Children(5).Children.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Tower Device\"\nmsgstr \"Aparato de la Torre\"\n\n#. Key:\t95A7C27A44B78CBF17C1FD8C9446CBD7\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Take it! I still need some time to finish the soup anyway.\"\nmsgstr \"¡Llévatelo! Todavía necesito algo de tiempo para terminar la sopa de todos modos.\"\n\n#. Key:\t97E4FDC74B47A6037D6023A4C65B2934\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_37.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_37.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"If you activate it I’ll be able to use the portal to teleport to other places.\"\nmsgstr \"Si lo activa, podré usar el portal para teletransportarme a otros lugares.\"\n\n#. Key:\t9FD2679D44BEBBFBBAD2EAAECFFEE0D5\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_42.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_42.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"I can’t promise I’ll do that.\"\nmsgstr \"No puedo prometer que haré eso.\"\n\n#. Key:\tAA1C6EF444BAB6A929E953A87BB87ABB\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_56.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_56.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"I've got to go. See you soon!\"\nmsgstr \"Tengo que ir. ¡Te veo pronto!\"\n\n#. Key:\tAED4FBE3422E0FC4AC4BD38650F95CA9\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_26.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_26.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Thanks.\"\nmsgstr \"Gracias.\"\n\n#. Key:\tB0BAD1934671ADCB2DD1E1BA582E3C68\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Why are you making soup?\"\nmsgstr \"¿Por qué estás haciendo sopa?\"\n\n#. Key:\tB621AECE42A14A508C945595493F3A3A\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Really? Anyway, I’m happy to see you.\"\nmsgstr \"De Verdad? De todos modos, estoy feliz de verte.\"\n\n#. Key:\tBA715D554C47932C092462B36ADEA081\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_58.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_58.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Good bye!\"\nmsgstr \"¡Adiós!\"\n\n#. Key:\tBE7B3444431F43E8E1487F8702B94845\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_57.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_57.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"It was nice to meet you.\"\nmsgstr \"Fue un placer conocerte.\"\n\n#. Key:\tC1BB24A443D4297B17E2F6A280B02E91\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_36.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_36.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Yes. According to a book I read here there is a device on the wall of the Portal Tower.\"\nmsgstr \"Si. Según un libro que leí aquí, hay un aparato en la pared de la Torre del Portal.\"\n\n#. Key:\tC339B87742C2B475E2387F93418AA855\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Have you found out anything about Ruin?\"\nmsgstr \"¿Has descubierto algo sobre Ruin?\"\n\n#. Key:\tC4D263AB48B800D5522A24923C541ED3\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_11.Children(3).Children.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_11.Children(3).Children.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Soup\"\nmsgstr \"Sopa\"\n\n#. Key:\tC530096E4FA1A2B68077C3AD6AC1BF44\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_38.Children(0).Children.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_38.Children(0).Children.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Accept Quest\"\nmsgstr \"Aceptar Misión\"\n\n#. Key:\tC82668E6497A810FA6ADC0AB6F362B47\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"The soup is almost ready...\"\nmsgstr \"La sopa está casi lista...\"\n\n#. Key:\tCD8CDA3443CDE79BE257B99A0801B209\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_43.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_43.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"No problem.\"\nmsgstr \"No hay problema.\"\n\n#. Key:\tD058108241051A9FD0D130B3C9EA4B8B\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"It helps me keep my mind clear.\"\nmsgstr \"Me ayuda a mantener mi mente despejada.\"\n\n#. Key:\tD8F879684C57BB474E7153B971073663\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_49.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_49.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Meanwhile I cooked something special for you. Take this!\"\nmsgstr \"Mientras he cocinado algo especial para ti. ¡Toma esto!\"\n\n#. Key:\tDA9D493F42420BE9442B1EA983AEF9C2\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Any news on your lost tribe?\"\nmsgstr \"¿Alguna noticia sobre tu tribu perdida?\"\n\n#. Key:\tDE2390ED4366A621E4D220A3761333DE\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_54.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_54.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"I need to go now.\"\nmsgstr \"Necesito ir ahora.\"\n\n#. Key:\tDE668E4B4A3D0F785A693B9190E635D3\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_47.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_47.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"How on earth have you managed to reach this node?\"\nmsgstr \"¿Cómo has logrado llegar a este nodo?\"\n\n#. Key:\tE29E2D044497A86DD0FCA8B540703597\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_48.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_48.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Pls. report it as a bug.\"\nmsgstr \"Por favor informarlo como un error.\"\n\n#. Key:\tE6D3401944B2FF128DD1689F5159AF96\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_45.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_45.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Nice, well done!\"\nmsgstr \"¡Bien hecho!\"\n\n#. Key:\tE83287164D066CCE8FBFDE835FBD4CFB\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_55.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_55.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"I'm on my way. Take care!\"\nmsgstr \"Estoy en camino. ¡Cuídate!\"\n\n#. Key:\tEBC97F7C45858FE6DC72209536FC5C3B\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_27.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_27.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Do you know how can I reach that Purple Portal?\"\nmsgstr \"¿Sabes cómo puedo llegar a ese Portal Morado?\"\n\n#. Key:\tF911D6CB45AA59448C03379A1C07DD60\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_51.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_51.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"It wasn’t that complicated after all.\"\nmsgstr \"No fue tan complicado después de todo.\"\n\n#. Key:\tF9EBA1684D435C8AEB14129A7B57A604\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"I think they came here and followed the messages just like you.\"\nmsgstr \"Creo que vinieron aquí y siguieron los mensajes como tú.\"\n\n#. Key:\t3DAA74ED48BE31E35D868FB1492E57A8\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/WW_Pergamen.WW_Pergamen:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/WhiteWall/WW_Pergamen.WW_Pergamen:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_WW_Pergamen\"\nmsgid \"'Ruin took over some of us. It's no longer safe here.'\"\nmsgstr \"Ruin se hizo cargo de algunos de nosotros. Ya no es seguro aquí.\"\n\n#. Key:\tB10818134FFE3A1E99A9D789BFABBBEE\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/WW_Pergamen.WW_Pergamen:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/WhiteWall/WW_Pergamen.WW_Pergamen:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_WW_Pergamen\"\nmsgid \"'Come visit us beyond the Purple Portal!'\"\nmsgstr \"¡Ven a visitarnos más allá del Portal Morado!\"\n\n#. Key:\tD292364A4E58F52FB874AA98C1F969A6\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/WW_Pergamen.WW_Pergamen:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/WhiteWall/WW_Pergamen.WW_Pergamen:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_WW_Pergamen\"\nmsgid \"'We are close to the solution, but your help is still needed.'\"\nmsgstr \"\\\"Estamos cerca de la solución, pero todavía se necesita su ayuda\\\".\"\n\n#. Key:\t0CD0FD884718EF68B38D578CDE17110A\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/WW_Statue.WW_Statue:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/WhiteWall/WW_Statue.WW_Statue:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_WW_Statue\"\nmsgid \"Oooops...\"\nmsgstr \"Oooops...\"\n\n#. Key:\t2D531D384CB6A56DBC4834BD229622E7\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/WW_Statue.WW_Statue:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/WhiteWall/WW_Statue.WW_Statue:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_WW_Statue\"\nmsgid \"'White Wall will never fall!'\"\nmsgstr \"¡El Muro Blanco nunca caerá!\"\n\n#. Key:\t2690E77045D5E42F32AC6582BAFF27AA\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/WW_StatueWelcome.WW_StatueWelcome:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/WhiteWall/WW_StatueWelcome.WW_StatueWelcome:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_WW_StatueWelcome\"\nmsgid \"'We know how to stop Ruin.'\"\nmsgstr \"'Sabemos cómo detener a Ruin'.\"\n\n#. Key:\t7C3340434A4C80010AC2D58BF8504339\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/WW_StatueWelcome.WW_StatueWelcome:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/WhiteWall/WW_StatueWelcome.WW_StatueWelcome:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_WW_StatueWelcome\"\nmsgid \"'There is still hope.'\"\nmsgstr \"'Aún hay esperanza'.\"\n\n#. Key:\tarmour_wrath_name\n#. SourceLocation:\tLocalization/StringTables/Enemies.csv\n#. InfoMetaData:\t\"Comment\" : \"display name of an npc boss\"\n#: Localization/StringTables/Enemies.csv\nmsgctxt \"Enemies\"\nmsgid \"Armour Wrath\"\nmsgstr \"Ira de Armadura\"\n\n#. Key:\tdwarf_name\n#. SourceLocation:\tLocalization/StringTables/Enemies.csv\n#. InfoMetaData:\t\"Comment\" : \"display name of an npc boss\"\n#: Localization/StringTables/Enemies.csv\nmsgctxt \"Enemies\"\nmsgid \"Dwarf\"\nmsgstr \"Enano\"\n\n#. Key:\tfallen_druid_name\n#. SourceLocation:\tLocalization/StringTables/Enemies.csv\n#. InfoMetaData:\t\"Comment\" : \"display name of an npc boss\"\n#: Localization/StringTables/Enemies.csv\nmsgctxt \"Enemies\"\nmsgid \"Fallen Druid\"\nmsgstr \"Druida Caído\"\n\n#. Key:\tdreamhack_completed_desc\n#. SourceLocation:\tLocalization/StringTables/Episodes.csv\n#: Localization/StringTables/Episodes.csv\nmsgctxt \"Episodes\"\nmsgid \"Thanks for playing the game, we hope you had a great time!\"\nmsgstr \"Gracias por jugar, ¡esperamos que lo hayas pasado genial!\"\n\n#. Key:\tdreamhack_completed_subtitle\n#. SourceLocation:\tLocalization/StringTables/Episodes.csv\n#: Localization/StringTables/Episodes.csv\nmsgctxt \"Episodes\"\nmsgid \"Dreamhack Demo\"\nmsgstr \"Demo de Dreamhack\"\n\n#. Key:\tdreamhack_desc\n#. SourceLocation:\tLocalization/StringTables/Episodes.csv\n#: Localization/StringTables/Episodes.csv\nmsgctxt \"Episodes\"\nmsgid \"What happens when you lock a mighty demon's spirit inside a ball body?\"\nmsgstr \"¿Qué sucede cuando encierras el espíritu de un poderoso demonio dentro del cuerpo de una pelota?\"\n\n#. Key:\tdreamhack_friendly_name\n#. SourceLocation:\tLocalization/StringTables/Episodes.csv\n#: Localization/StringTables/Episodes.csv\nmsgctxt \"Episodes\"\nmsgid \"Dreamhack\"\nmsgstr \"Dreamhack\"\n\n#. Key:\tepisode_end_main_title\n#. SourceLocation:\tLocalization/StringTables/Episodes.csv\n#. InfoMetaData:\t\"Comment\" : \"episode map end panel text\"\n#: Localization/StringTables/Episodes.csv\nmsgctxt \"Episodes\"\nmsgid \"Episode Completed!\"\nmsgstr \"¡Episodio completado!\"\n\n#. Key:\tescape_darkness_completed_desc\n#. SourceLocation:\tLocalization/StringTables/Episodes.csv\n#: Localization/StringTables/Episodes.csv\nmsgctxt \"Episodes\"\nmsgid \"\\\"And as Darkness spreads an unknown Warriorb will rise...\\\"\"\nmsgstr \"\\\"Y a medida que la Oscuridad se extienda, un Warriorb desconocido ascenderá\\\"\"\n\n#. Key:\tescape_darkness_completed_subtitle\n#. SourceLocation:\tLocalization/StringTables/Episodes.csv\n#: Localization/StringTables/Episodes.csv\nmsgctxt \"Episodes\"\nmsgid \"Escaped from Darkness\"\nmsgstr \"Escapó de la Oscuridad\"\n\n#. Key:\tescape_darkness_desc\n#. SourceLocation:\tLocalization/StringTables/Episodes.csv\n#: Localization/StringTables/Episodes.csv\nmsgctxt \"Episodes\"\nmsgid \"Are you fast enough to race against Darkness itself?\"\nmsgstr \"¿Eres lo suficientemente rápido como para competir contra la propia Oscuridad?\"\n\n#. Key:\tescape_darkness_friendly_name\n#. SourceLocation:\tLocalization/StringTables/Episodes.csv\n#: Localization/StringTables/Episodes.csv\nmsgctxt \"Episodes\"\nmsgid \"Escape Darkness\"\nmsgstr \"Escapar de la Oscuridad\"\n\n#. Key:\twhite_wall_completed_desc\n#. SourceLocation:\tLocalization/StringTables/Episodes.csv\n#. InfoMetaData:\t\"Comment\" : \"short text on the ending panel when player finishes this episode\"\n#: Localization/StringTables/Episodes.csv\nmsgctxt \"Episodes\"\nmsgid \"What happened beyond the portal is another story, which will be told at another time.\"\nmsgstr \"Lo que sucedió más allá del portal es otra historia, que se contará en otro momento.\"\n\n#. Key:\twhite_wall_completed_subtitle\n#. SourceLocation:\tLocalization/StringTables/Episodes.csv\n#. InfoMetaData:\t\"Comment\" : \"subtitle of the ending panel when player finishes this episode\"\n#. Key:\twhite_wall_friendly_name\n#. InfoMetaData:\t\"Comment\" : \"name the episode is displayed with in the ui\"\n#: Localization/StringTables/Episodes.csv\nmsgctxt \"Episodes\"\nmsgid \"White Wall\"\nmsgstr \"Muro Blanco\"\n\n#. Key:\twhite_wall_desc\n#. SourceLocation:\tLocalization/StringTables/Episodes.csv\n#. InfoMetaData:\t\"Comment\" : \"map desc when the player can select the episode\"\n#: Localization/StringTables/Episodes.csv\nmsgctxt \"Episodes\"\nmsgid \"Although it's long abandoned the fortress of White Wall still stands against Ruin. After centuries of silence some groups of unexpected visitors broke the loneliness of the decaying city.\"\nmsgstr \"Aunque hace tiempo que se abandona, la fortaleza del Muro Blanco sigue en pie contra Ruin. Después de siglos de silencio, algunos grupos de visitantes inesperados rompieron la soledad de la ciudad en ruinas.\"\n\n#. Key:\twhite_wall_loadingscreen_desc\n#. SourceLocation:\tLocalization/StringTables/Episodes.csv\n#. InfoMetaData:\t\"Comment\" : \"text on loading screen\"\n#: Localization/StringTables/Episodes.csv\nmsgctxt \"Episodes\"\nmsgid \"After months of researching I found a way to return back to the Ruined Realm. Ironically enough I have to use the same body I was trapped in before. I'll need to be quick and clever for this might be my very last chance to stop Ruin before it devours the World.\"\nmsgstr \"Después de meses de investigación, encontré una manera de regresar al Reino Arruinado. Irónicamente, tengo que usar el mismo cuerpo en el que estaba atrapado antes. Necesitaré ser rápido e inteligente porque esta podría ser mi última oportunidad para detener a Ruin antes de que devore el mundo.\"\n\n#. Key:\tchar_vo_armourwrath_attack_clap\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I won't fail the Maker!\"\nmsgstr \"¡No le fallaré al Creador!\"\n\n#. Key:\tchar_vo_armourwrath_attack_die\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"No... I'm still... perfect\"\nmsgstr \"No... sigo... perfecto\"\n\n#. Key:\tchar_vo_armourwrath_attack_magic\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Resist Ruin!\"\nmsgstr \"¡Resiste al Ruin!\"\n\n#. Key:\tchar_vo_armourwrath_attack_strike_down\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Out of my way!\"\nmsgstr \"¡Fuera de mi camino!\"\n\n#. Key:\tchar_vo_armourwrath_attack_strike_down_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I am perfect\"\nmsgstr \"Soy perfecto\"\n\n#. Key:\tchar_vo_dwarvenstatue_attack_axe_point\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I keep Ruin\"\nmsgstr \"Mantengo Ruin\"\n\n#. Key:\tchar_vo_dwarvenstatue_attack_axe_strike_down\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"We are above the Law!\"\nmsgstr \"¡Estamos por encima de la ley!\"\n\n#. Key:\tchar_vo_dwarvenstatue_attack_meteor\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I can take more!\"\nmsgstr \"¡Puedo llevar más!\"\n\n#. Key:\tchar_vo_dwarvenstatue_die\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I won't move... again\"\nmsgstr \"No me moveré... otra vez\"\n\n#. Key:\tchar_vo_dwarvenstatue_shield_knock\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I hold it back!\"\nmsgstr \"¡Lo contengo!\"\n\n#. Key:\tchar_vo_fallendruid_attack_flybug\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"It's safe here.\"\nmsgstr \"Aquí es seguro.\"\n\n#. Key:\tchar_vo_fallendruid_attack_spike\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"This place shall stand!\"\nmsgstr \"¡Este lugar se mantendrá!\"\n\n#. Key:\tchar_vo_fallendruid_attack_tendril\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Nature will survive!\"\nmsgstr \"¡La naturaleza sobrevivirá!\"\n\n#. Key:\tchar_vo_fallendruid_attack_thorn_sphere\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Out with you, Ruin!\"\nmsgstr \"¡Fuera contigo, Ruin!\"\n\n#. Key:\tchar_vo_fallendruid_die\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I have... failed\"\nmsgstr \"He fracasado\"\n\n#. Key:\tchar_vo_final_boss_p1_blue\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#. Key:\tchar_vo_final_boss_p2_blue\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I'm the daughter of the Wizard!\"\nmsgstr \"Soy la hija del Mago!\"\n\n#. Key:\tchar_vo_final_boss_p1_green\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#. Key:\tchar_vo_final_boss_p2_red_up\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I can create!\"\nmsgstr \"¡Puedo crear!\"\n\n#. Key:\tchar_vo_final_boss_p1_red\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I'm human!\"\nmsgstr \"¡Soy humano!\"\n\n#. Key:\tchar_vo_final_boss_p2_green\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#. Key:\tchar_vo_final_boss_p3_green\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"That sounds funny!\"\nmsgstr \"¡Eso suena gracioso!\"\n\n#. Key:\tchar_vo_final_boss_p2_red_down\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I can destroy!\"\nmsgstr \"¡Puedo destruir!\"\n\n#. Key:\tchar_vo_final_boss_p3_blue\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I'm free!\"\nmsgstr \"¡Soy libre!\"\n\n#. Key:\tchar_vo_final_boss_p3_red\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"What makes you say that?\"\nmsgstr \"¿Qué te hace decir eso?\"\n\n#. Key:\tchar_vo_fishy_idle_hiss\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Hissing\"\nmsgstr \"Siseó\"\n\n#. Key:\tchar_vo_flybug_attack_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Huh! Surprised?\"\nmsgstr \"¡Huh! ¿Sorprendido?\"\n\n#. Key:\tchar_vo_flybug_attack_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Take this!\"\nmsgstr \"¡Toma esto!\"\n\n#. Key:\tchar_vo_flybug_damaged_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Careful!\"\nmsgstr \"¡Cuidado!\"\n\n#. Key:\tchar_vo_flybug_damaged_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"It's not funny!\"\nmsgstr \"¡No es gracioso!\"\n\n#. Key:\tchar_vo_flybug_die_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"All right, gg!\"\nmsgstr \"¡Muy bien, gg!\"\n\n#. Key:\tchar_vo_flybug_idle_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"What is it like down there? Heh?\"\nmsgstr \"¿Cómo es ahí abajo? ¿Je?\"\n\n#. Key:\tchar_vo_flybug_idle_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Easy man, easy!\"\nmsgstr \"¡Hombre fácil, fácil!\"\n\n#. Key:\tchar_vo_gatekeeper_attack_aimed\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Avoid these!\"\nmsgstr \"¡Evita estos!\"\n\n#. Key:\tchar_vo_gatekeeper_attack_aimed_phase_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Watch out where you bounce to!\"\nmsgstr \"¡Cuidado donde rebotas!\"\n\n#. Key:\tchar_vo_gatekeeper_attack_electric_bubbles\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Attention to the heights!\"\nmsgstr \"¡Atención a las alturas!\"\n\n#. Key:\tchar_vo_gatekeeper_attack_electric_bubbles_phase_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Attention to the heights again!\"\nmsgstr \"¡Atención a las alturas otra vez!\"\n\n#. Key:\tchar_vo_gatekeeper_attack_meteors\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Watch out for your head!\"\nmsgstr \"¡Cuidado con tu cabeza!\"\n\n#. Key:\tchar_vo_gatekeeper_attack_shield\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Do you really think you are worthy?\"\nmsgstr \"¿De verdad crees que eres digno?\"\n\n#. Key:\tchar_vo_ghostarmor__die\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I... don't...\"\nmsgstr \"Yo no...\"\n\n#. Key:\tchar_vo_ghostarmor_attack_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"You shall perish!\"\nmsgstr \"¡Perecerás!\"\n\n#. Key:\tchar_vo_ghostarmor_attack_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"For justice!\"\nmsgstr \"¡Para la justicia!\"\n\n#. Key:\tchar_vo_ghostarmor_attack_fall\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Death to the outlaw!\"\nmsgstr \"¡Muerte al bandido!\"\n\n#. Key:\tchar_vo_ghostarmor_damaged_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Just a scratch.\"\nmsgstr \"Solo un rasguño.\"\n\n#. Key:\tchar_vo_ghostarmor_damaged_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"You... can't.\"\nmsgstr \"No... puedes.\"\n\n#. Key:\tchar_vo_ghostarmor_idle_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"We keep the Wall.\"\nmsgstr \"Mantenemos el Muro.\"\n\n#. Key:\tchar_vo_ghostarmor_idle_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Follow the rules!\"\nmsgstr \"¡Sigue las reglas!\"\n\n#. Key:\tchar_vo_ghosthelmet_attack_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Aaaaaaargh!\"\nmsgstr \"¡Aaaaaaargh!\"\n\n#. Key:\tchar_vo_ghosthelmet_attack_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Chaaaaaarge!\"\nmsgstr \"¡A la Ataque!\"\n\n#. Key:\tchar_vo_ghosthelmet_damaged_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I'll need a blacksmith!\"\nmsgstr \"¡Necesitaré un herrero!\"\n\n#. Key:\tchar_vo_ghosthelmet_damaged_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Send someone for a hammer!\"\nmsgstr \"¡Envía a alguien por un martillo!\"\n\n#. Key:\tchar_vo_ghosthelmet_die\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Be right back!\"\nmsgstr \"¡Vuelvo enseguida!\"\n\n#. Key:\tchar_vo_ghosthelmet_idle_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Use your head... or mine!\"\nmsgstr \"Usa tu cabeza... ¡o la mía!\"\n\n#. Key:\tchar_vo_ghosthelmet_idle_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Let's head east!\"\nmsgstr \"¡Vamos al este!\"\n\n#. Key:\tchar_vo_gnory_idle_humming\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Humming\"\nmsgstr \"Tarareando\"\n\n#. Key:\tchar_vo_gnory_idle_whistle\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Whistling\"\nmsgstr \"Silbido\"\n\n#. Key:\tchar_vo_golemmaker_idle_explain_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I create essence which resists the ruin.\"\nmsgstr \"Creo esencia que resiste la ruina.\"\n\n#. Key:\tchar_vo_golemmaker_idle_mindlessly_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Knowledge is Lost, All is Lost.\"\nmsgstr \"El Conocimiento está perdido, Todo está Perdido.\"\n\n#. Key:\tchar_vo_golemmaker_idle_mindlessly_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"All is Lost.\"\nmsgstr \"Todo está Perdido.\"\n\n#. Key:\tchar_vo_golemmaker_idle_moan_aaahhh\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Aaahhh\"\nmsgstr \"Aaahhh\"\n\n#. Key:\tchar_vo_golemmaker_idle_moan_ooohhh\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Ooohhh\"\nmsgstr \"Ooohhh\"\n\n#. Key:\tchar_vo_golemmaker_idle_sad_onon\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Onon\"\nmsgstr \"Onon\"\n\n#. Key:\tchar_vo_golemmaker_idle_tries_to_remember\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Your words remind me of something.\"\nmsgstr \"Tus palabras me recuerdan algo.\"\n\n#. Key:\tchar_vo_koboldchef_idle_01\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Too hot!\"\nmsgstr \"¡Demasiado caliente!\"\n\n#. Key:\tchar_vo_koboldchef_idle_02\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"It needs more salt!\"\nmsgstr \"¡Necesita más sal!\"\n\n#. Key:\tchar_vo_koboldchef_idle_03\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"It will be delicious.\"\nmsgstr \"Será delicioso.\"\n\n#. Key:\tchar_vo_koboldchef_idle_04\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Hmm...\"\nmsgstr \"Hmm...\"\n\n#. Key:\tchar_vo_lory_idle_croon\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Croon\"\nmsgstr \"Canturrear\"\n\n#. Key:\tchar_vo_lory_idle_humming_0\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Ohh\"\nmsgstr \"Ohh\"\n\n#. Key:\tchar_vo_lory_idle_humming_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#. Key:\tchar_vo_supperdwarf_idle_2_humming_1\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Hmmm\"\nmsgstr \"Mmmm\"\n\n#. Key:\tchar_vo_lory_idle_humming_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Ommm\"\nmsgstr \"Ommm\"\n\n#. Key:\tchar_vo_lory_idle_humming_3\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Auch\"\nmsgstr \"Auch\"\n\n#. Key:\tchar_vo_maintainer_attack_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Dinner is served!\"\nmsgstr \"¡La cena está servida!\"\n\n#. Key:\tchar_vo_maintainer_attack_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Now it's clean!\"\nmsgstr \"¡Ahora está limpio!\"\n\n#. Key:\tchar_vo_maintainer_damaged_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I'll need to be repaired.\"\nmsgstr \"Necesitaré ser reparado.\"\n\n#. Key:\tchar_vo_maintainer_damaged_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I still serve.\"\nmsgstr \"Yo sigo sirviendo.\"\n\n#. Key:\tchar_vo_maintainer_die\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I'll need... replacement.\"\nmsgstr \"Necesitaré... reemplazo.\"\n\n#. Key:\tchar_vo_maintainer_elite_idle_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Serve...\"\nmsgstr \"Servir...\"\n\n#. Key:\tchar_vo_maintainer_elite_idle_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Order...\"\nmsgstr \"Orden...\"\n\n#. Key:\tchar_vo_maintainer_idle_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"At your service.\"\nmsgstr \"A su servicio.\"\n\n#. Key:\tchar_vo_maintainer_idle_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Your order?\"\nmsgstr \"¿Su pedido?\"\n\n#. Key:\tchar_vo_maintainer_miniboss_attack_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"This is my order!\"\nmsgstr \"¡Este es mi pedido!\"\n\n#. Key:\tchar_vo_maintainer_miniboss_attack_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I'll reorganize!\"\nmsgstr \"¡Me reorganizaré!\"\n\n#. Key:\tchar_vo_maintainer_miniboss_attack_meteor\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I'm above!\"\nmsgstr \"¡Estoy arriba!\"\n\n#. Key:\tchar_vo_maintainer_miniboss_attack_spawn_enemy\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Order, order, order!\"\nmsgstr \"¡Orden, orden, orden!\"\n\n#. Key:\tchar_vo_maintainer_miniboss_damaged_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I can fix this\"\nmsgstr \"Puedo arreglar esto\"\n\n#. Key:\tchar_vo_maintainer_miniboss_damaged_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Don't do that again!\"\nmsgstr \"¡No vuelvas a hacer eso!\"\n\n#. Key:\tchar_vo_maintainer_miniboss_die\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I can't... I was... above.\"\nmsgstr \"No puedo... estaba... arriba.\"\n\n#. Key:\tchar_vo_primitivefishy_attack_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Srrrr!\"\nmsgstr \"¡Srrrr!\"\n\n#. Key:\tchar_vo_primitivefishy_attack_long_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Hurray!\"\nmsgstr \"¡Hurra!\"\n\n#. Key:\tchar_vo_primitivefishy_attack_long_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Flyyyyyyy!\"\nmsgstr \"¡Vuelaaaaa!\"\n\n#. Key:\tchar_vo_primitivefishy_damaged_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Uuush!\"\nmsgstr \"¡Uuush!\"\n\n#. Key:\tchar_vo_primitivefishy_damaged_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Shish!\"\nmsgstr \"¡Shish!\"\n\n#. Key:\tchar_vo_primitivefishy_die\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Fishy leaves.\"\nmsgstr \"Fishy se va.\"\n\n#. Key:\tchar_vo_primitivefishy_idle_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I need some fish!\"\nmsgstr \"¡Necesito un poco de pescado!\"\n\n#. Key:\tchar_vo_primitivefishy_idle_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Did you hear that?\"\nmsgstr \"¿Escuchaste eso?\"\n\n#. Key:\tchar_vo_shade_attack_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Join me!\"\nmsgstr \"¡Únete a mi!\"\n\n#. Key:\tchar_vo_shade_attack_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"You shall die too!\"\nmsgstr \"¡Tú también morirás!\"\n\n#. Key:\tchar_vo_shade_damaged_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Is this the end?\"\nmsgstr \"¿Es este el final?\"\n\n#. Key:\tchar_vo_shade_damaged_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Pain...\"\nmsgstr \"Dolor...\"\n\n#. Key:\tchar_vo_shade_die\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Death... again?!\"\nmsgstr \"¡¿Muerte... otra vez?!\"\n\n#. Key:\tchar_vo_shade_idle_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I can't rest.\"\nmsgstr \"No puedo descansar.\"\n\n#. Key:\tchar_vo_shade_idle_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Death is not peace.\"\nmsgstr \"La muerte no es paz.\"\n\n#. Key:\tchar_vo_shadesphere_attack_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I'll change you!\"\nmsgstr \"¡Te voy a cambiar!\"\n\n#. Key:\tchar_vo_shadesphere_attack_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Do not resist me!\"\nmsgstr \"¡No me resistas!\"\n\n#. Key:\tchar_vo_shadesphere_damaged_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"It's still... me...\"\nmsgstr \"Todavía soy... yo...\"\n\n#. Key:\tchar_vo_shadesphere_damaged_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Why did you...?\"\nmsgstr \"¿Por qué lo hiciste...?\"\n\n#. Key:\tchar_vo_shadesphere_die\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"You changed... me?\"\nmsgstr \"¿Tu me cambiaste?\"\n\n#. Key:\tchar_vo_shadesphere_idle_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"What do you wish to be?\"\nmsgstr \"¿Que quieres ser?\"\n\n#. Key:\tchar_vo_shadesphere_idle_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Come to me!\"\nmsgstr \"¡Ven a mi!\"\n\n#. Key:\tchar_vo_supperdwarf_idle_1_eating_food_0\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Yum-yum hmmmm... delicious\"\nmsgstr \"Ñam ñam hmmmm... delicioso\"\n\n#. Key:\tchar_vo_supperdwarf_idle_1_eating_food_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Hmmm... tasty\"\nmsgstr \"Hmmm... sabroso\"\n\n#. Key:\tchar_vo_supperdwarf_idle_1_eating_food_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Ehmmm... where is my spoon?\"\nmsgstr \"Ehmmm... ¿dónde está mi cuchara?\"\n\n#. Key:\tchar_vo_supperdwarf_idle_2_humming_0\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Ehemm, ehemm\"\nmsgstr \"Ehemm, ehemm\"\n\n#. Key:\tchar_vo_supperdwarf_idle_2_humming_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Ohm\"\nmsgstr \"Ohm\"\n\n#. Key:\tchar_vo_teachy_idle_book_down_0\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Walking ball?\"\nmsgstr \"¿Una pelota que camina?\"\n\n#. Key:\tchar_vo_teachy_idle_book_down_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"You?\"\nmsgstr \"¿Tu?\"\n\n#. Key:\tchar_vo_teachy_idle_book_down_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Do you exist outside of my mind?\"\nmsgstr \"¿Existes fuera de mi mente?\"\n\n#. Key:\tchar_vo_teachy_idle_book_down_3\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Ehm, what?\"\nmsgstr \"Ehm, ¿que?\"\n\n#. Key:\tchar_vo_teachy_idle_book_up_0\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Ehmm\"\nmsgstr \"Ehmm\"\n\n#. Key:\tchar_vo_teachy_idle_book_up_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Humm\"\nmsgstr \"Humm\"\n\n#. Key:\tchar_vo_teachy_idle_book_up_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Hemm\"\nmsgstr \"Hemm\"\n\n#. Key:\tchar_vo_teachy_idle_book_up_3\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Ahm\"\nmsgstr \"Ahm\"\n\n#. Key:\tchar_vo_teachy_idle_humming_0\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Hmmm-hmmm-hmm\"\nmsgstr \"Hmmm-hmmm-hmm\"\n\n#. Key:\tchar_vo_teachy_idle_humming_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Ehmm-hmmm-uhmm\"\nmsgstr \"Ehmm-hmmm-uhmm\"\n\n#. Key:\tchar_vo_teachy_idle_humming_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Umm-huhummm\"\nmsgstr \"Umm-huhummm\"\n\n#. Key:\tchar_vo_teachy_idle_humming_speaking_long_0\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I am, therefore I think!\"\nmsgstr \"¡Lo estoy, por lo tanto, creo!\"\n\n#. Key:\tchar_vo_teachy_idle_humming_speaking_long_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I think... I am...\"\nmsgstr \"Creo que estoy...\"\n\n#. Key:\tchar_vo_teachy_idle_humming_speaking_long_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"The unexamined life is not worth living!\"\nmsgstr \"¡La vida no examinada no vale la pena vivir!\"\n\n#. Key:\tchar_vo_teachy_idle_humming_speaking_long_3\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"The mind is furnished with ideas by a drunk upholsterer...\"\nmsgstr \"La mente está lleno de ideas por un tapicero borracho...\"\n\n#. Key:\tchar_vo_teachy_idle_humming_speaking_short_0\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Tic-tac\"\nmsgstr \"TIC Tac\"\n\n#. Key:\tchar_vo_teachy_idle_humming_speaking_short_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"To be...\"\nmsgstr \"Estar...\"\n\n#. Key:\tchar_vo_teachy_idle_humming_speaking_short_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Weird\"\nmsgstr \"Extraño\"\n\n#. Key:\tAnyKey\n#. SourceLocation:\tSource/SOrb/Settings/Input/SoInputNames.cpp:347\n#: Source/SOrb/Settings/Input/SoInputNames.cpp:347\nmsgctxt \"InputKeys\"\nmsgid \"Any Key\"\nmsgstr \"Cualquier tecla\"\n\n#. Key:\tDown\n#. SourceLocation:\tSource/SOrb/Settings/Input/SoInputNames.cpp:376\n#: Source/SOrb/Settings/Input/SoInputNames.cpp:376\nmsgctxt \"InputKeys\"\nmsgid \"Down\"\nmsgstr \"Abajo\"\n\n#. Key:\tLeft\n#. SourceLocation:\tSource/SOrb/Settings/Input/SoInputNames.cpp:373\n#: Source/SOrb/Settings/Input/SoInputNames.cpp:373\nmsgctxt \"InputKeys\"\nmsgid \"Left\"\nmsgstr \"Izquierda\"\n\n#. Key:\tRight\n#. SourceLocation:\tSource/SOrb/Settings/Input/SoInputNames.cpp:375\n#: Source/SOrb/Settings/Input/SoInputNames.cpp:375\nmsgctxt \"InputKeys\"\nmsgid \"Right\"\nmsgstr \"Derecha\"\n\n#. Key:\tUp\n#. SourceLocation:\tSource/SOrb/Settings/Input/SoInputNames.cpp:374\n#: Source/SOrb/Settings/Input/SoInputNames.cpp:374\nmsgctxt \"InputKeys\"\nmsgid \"Up\"\nmsgstr \"Arriba\"\n\n#. Key:\tabsorb_energy\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Absorb Energy\"\nmsgstr \"Absorber Energía\"\n\n#. Key:\tacquired_few_item\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"message when more than one item is received at once\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"A few items acquired\"\nmsgstr \"Algunos artículos adquiridos\"\n\n#. Key:\tacquired_item\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"{0} is replaced with an item name\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"{0} acquired\"\nmsgstr \"{0} adquirido\"\n\n#. Key:\tactivate\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Activate\"\nmsgstr \"Activar\"\n\n#. Key:\tactivate_elevator\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Activate Elevator\"\nmsgstr \"Activar Ascensor\"\n\n#. Key:\taquired_silver_key\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"optional bonus message\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Silver Key Acquired\"\nmsgstr \"Llave plateada adquirida\"\n\n#. Key:\tascend\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"climb up a ladder or rope or go up with an elevator\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Ascend\"\nmsgstr \"Ascender\"\n\n#. Key:\tbed\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"examine Bed\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Bed\"\nmsgstr \"Cama\"\n\n#. Key:\tboat_to_kitchen\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"use a boat to get to the kitchen\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Boat to the Kitchen\"\nmsgstr \"Utilizar el Barco a la Cocina\"\n\n#. Key:\tboat_to_ruins\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"use a boat to get to a place where there are some ancient ruins\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Boat to the Ruins\"\nmsgstr \"Utilizar el Barco a las Ruinas\"\n\n#. Key:\tboat_to_station\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"use a boat to get to the Station\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Boat to the Station\"\nmsgstr \"Utilizar el Barco a la Estación\"\n\n#. Key:\tcall_elevator\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Call Elevator\"\nmsgstr \"Llamar el Ascensor\"\n\n#. Key:\tcandles\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"examine Candles\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Candles\"\nmsgstr \"Velas\"\n\n#. Key:\tcat_bed\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"examine Tabbys (cat name) bed\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Tabby's Bed\"\nmsgstr \"Cama de Tabby\"\n\n#. Key:\tchair\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"examine Chair\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Chair\"\nmsgstr \"Silla\"\n\n#. Key:\tchange_spells\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Change Spells\"\nmsgstr \"Cambiar Hechizos\"\n\n#. Key:\tcharge\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"charge gem in Act I\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Charge\"\nmsgstr \"Cargar\"\n\n#. Key:\tcheck_door\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"check door \"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Check Door\"\nmsgstr \"Comprobar Puerta\"\n\n#. Key:\tchest\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"examine Chest\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Chest\"\nmsgstr \"Cofre\"\n\n#. Key:\tchest_check\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Check Chest\"\nmsgstr \"Comprobar Cofre\"\n\n#. Key:\tchest_check_small\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Check Small Chest\"\nmsgstr \"Comprobar Cofre Pequeño\"\n\n#. Key:\tchest_close\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Close Chest\"\nmsgstr \"Cerrar Cofre\"\n\n#. Key:\tchest_close_small\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Close Small Chest\"\nmsgstr \"Cerrar Cofre Pequeño\"\n\n#. Key:\tchest_open\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Open Chest\"\nmsgstr \"Abrir Cofre\"\n\n#. Key:\tchest_open_small\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Open Small Chest\"\nmsgstr \"Abrir Cofre Pequeño\"\n\n#. Key:\tclose_door\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Close Door\"\nmsgstr \"Cerrar Puerta\"\n\n#. Key:\tcross_planks\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Cross Planks\"\nmsgstr \"Cruzar Tablones\"\n\n#. Key:\tdads_room\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"examine Dad's Room\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Daddy's Room\"\nmsgstr \"Habitación de Papa\"\n\n#. Key:\tdescend\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"climb down a ladder or rope or go down with an elevator\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Descend\"\nmsgstr \"Descender\"\n\n#. Key:\tdestroy\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"destroy device in EndFinal level\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Destroy\"\nmsgstr \"Destruir\"\n\n#. Key:\tdevice\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"use Device\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Device\"\nmsgstr \"Aparato\"\n\n#. Key:\tdoor\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"examine Door\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Door\"\nmsgstr \"Puerta\"\n\n#. Key:\tdoor_does_not_open_from_this_side\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"message when character tries to open a door but it can only be openned from the other side\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Door does not open from this side!\"\nmsgstr \"¡La puerta no se abre desde este lado!\"\n\n#. Key:\tdoor_opened\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"door openned\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Door opened\"\nmsgstr \"Puerta abierta\"\n\n#. Key:\tdrop\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"drop box or carryable\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Drop\"\nmsgstr \"Soltar\"\n\n#. Key:\televator_activated\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Elevator Activated\"\nmsgstr \"Ascensor Activado\"\n\n#. Key:\televator_inactive\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"player tries to use the elevator but it is inactive\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"The elevator seems to be inactive\"\nmsgstr \"El ascensor parece estar inactivo\"\n\n#. Key:\televator_not_move_to_dir\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"player tries to use an elevator but the direction is not activated yet\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"The elevator does not move to the selected direction\"\nmsgstr \"El ascensor no se mueve a la dirección seleccionada\"\n\n#. Key:\tenter\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"teleport - enter a room or a portal\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Enter\"\nmsgstr \"Entrar\"\n\n#. Key:\tenter_bridge\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Enter Bridge\"\nmsgstr \"Entrar en el Puente\"\n\n#. Key:\tenter_cave\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Enter Cave\"\nmsgstr \"Entrar en la Cueva\"\n\n#. Key:\tenter_flames\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Enter Flames\"\nmsgstr \"Entrar en las Llamas\"\n\n#. Key:\tenter_gate\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Enter Gate\"\nmsgstr \"Entrar por la Puerta\"\n\n#. Key:\tenter_hut\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Enter Hut\"\nmsgstr \"Entrar en la Choza\"\n\n#. Key:\tenter_kitchen\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Enter Kitchen\"\nmsgstr \"Entrar en la Cocina\"\n\n#. Key:\tenter_pipe\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Enter Pipe\"\nmsgstr \"Entrar en la Tubería\"\n\n#. Key:\tenter_portal\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Enter Portal\"\nmsgstr \"Entrar al portal\"\n\n#. Key:\tenter_stairs_left\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Enter Stairs on the Left\"\nmsgstr \"Entrar Escaleras a la Izquierda\"\n\n#. Key:\tenter_stairs_right\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Enter Stairs on the Right\"\nmsgstr \"Entrar Escaleras a la Derecha\"\n\n#. Key:\tenter_tower\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Enter Tower\"\nmsgstr \"Entrar en la Torre\"\n\n#. Key:\tentrace_locked\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Entrance locked from the other side\"\nmsgstr \"Entrada cerrada desde el otro lado\"\n\n#. Key:\texamine\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"examine a statue or some other interactable object which triggers dialogue or hint message\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Examine\"\nmsgstr \"Examinar\"\n\n#. Key:\texamine_device\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Examine Device\"\nmsgstr \"Examinar Aparato\"\n\n#. Key:\texamine_elevator\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Examine Elevator\"\nmsgstr \"Examinar Ascensor\"\n\n#. Key:\texamine_switch\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"it is a lightswitch\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Examine Switch\"\nmsgstr \"Examinar interruptor\"\n\n#. Key:\texit\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"exit room\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Exit\"\nmsgstr \"Salir\"\n\n#. Key:\texplore_stations\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Explore more stations before using the railway system.\"\nmsgstr \"Explore más estaciones antes de usar el sistema ferroviario.\"\n\n#. Key:\tfinish_demo\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"teleport at the end of demo\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Finish Demo\"\nmsgstr \"Finalizar demo\"\n\n#. Key:\tfire\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"fires a cannon\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Fire\"\nmsgstr \"Fuego\"\n\n#. Key:\tgo_down\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"go down the stairs\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Go down\"\nmsgstr \"Bajar\"\n\n#. Key:\tgo_up\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"go up the stairs\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Go up\"\nmsgstr \"Subir\"\n\n#. Key:\tinspect_fountain\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Inspect Fountain\"\nmsgstr \"Inspeccionar Fuente\"\n\n#. Key:\tinventory\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"hint for hotkey to open the inventory\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Inventory\"\nmsgstr \"Inventario\"\n\n#. Key:\tkey_missing\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"{0} is the key name\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Key Missing: {0}\"\nmsgstr \"Llaves perdido: {0}\"\n\n#. Key:\tkick_rope\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"a pile of rope can be kicked to be able to climb up/down on it\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Kick Rope\"\nmsgstr \"Patear la Cuerda\"\n\n#. Key:\tlaboratory\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"examine/enter Laboratory\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Laboratory\"\nmsgstr \"Laboratorio\"\n\n#. Key:\tlamps\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"examine Lamps\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Lamps\"\nmsgstr \"Lámparas\"\n\n#. Key:\tleave\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"teleport - leave a room, chest, level\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Leave\"\nmsgstr \"Salir\"\n\n#. Key:\tleave_bridge\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Leave Bridge\"\nmsgstr \"Salir del Puente\"\n\n#. Key:\tleave_cave\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Leave Cave\"\nmsgstr \"Salir de la Cueva\"\n\n#. Key:\tleave_circle\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Leave Circle\"\nmsgstr \"Salir del Círculo\"\n\n#. Key:\tleave_hut\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Leave Hut\"\nmsgstr \"Salir de la Choza\"\n\n#. Key:\tleft_lever\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"use Left Lever\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Left Lever\"\nmsgstr \"Palanca Izquierda\"\n\n#. Key:\tlever_is_active\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Lever activated. The crystal broke.\"\nmsgstr \"Palanca activada. El cristal se rompió.\"\n\n#. Key:\tlever_is_inactive\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"a lever\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Seems to be inactive\"\nmsgstr \"Parece estar inactivo\"\n\n#. Key:\tmemory_stone_aquire\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Acquire Memory Stone\"\nmsgstr \"Adquiere Piedra de Memoria\"\n\n#. Key:\tmemory_stone_gained\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Memory Stone Gained\"\nmsgstr \"Piedra de Memoria Obtenida\"\n\n#. Key:\tmiddle_lever\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"use Middle Lever \"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Middle Lever\"\nmsgstr \"Palanca del Centro\"\n\n#. Key:\tmoms_room\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"examine Mom's Room\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Mom's Room\"\nmsgstr \"Habitación de mamá\"\n\n#. Key:\tnotebook\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"examine Notebook\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Notebook\"\nmsgstr \"Cuaderno de Apuntes\"\n\n#. Key:\topen\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"door can be openned\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Open\"\nmsgstr \"Abrir\"\n\n#. Key:\topen_door\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Open Door\"\nmsgstr \"Abrir la Puerta\"\n\n#. Key:\tpainting\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"examine Painting\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Painting\"\nmsgstr \"Pintura\"\n\n#. Key:\tpaintings\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"examine Paintings\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Paintings\"\nmsgstr \"Pinturas\"\n\n#. Key:\tpass_bridge\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Pass Bridge\"\nmsgstr \"Pasar el Puente\"\n\n#. Key:\tpick_up\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"pick up box or carryable\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Pick Up\"\nmsgstr \"Recoger\"\n\n#. Key:\tplace_rope\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Place Rope\"\nmsgstr \"Colocar Cuerda\"\n\n#. Key:\tprimary_strike\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"hint with control key for strike 1 of the character\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Primary Strike\"\nmsgstr \"Ataque Primario\"\n\n#. Key:\tpull\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"pull a lever\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Pull\"\nmsgstr \"Tirar\"\n\n#. Key:\tpull_lever\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Pull Lever\"\nmsgstr \"Tire de la Palanca\"\n\n#. Key:\tpush\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"push a sphere shaped rock from the edge to break some stuff\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Push\"\nmsgstr \"Empujar\"\n\n#. Key:\tput_weapon_away\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"hint with control key to show how to put the weapon away\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Put Weapon Away\"\nmsgstr \"Guarda el Arma\"\n\n#. Key:\tread\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"interaction hint if the character can read a scroll or book\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Read\"\nmsgstr \"Leer\"\n\n#. Key:\tread_dictionary\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Read Dictionary\"\nmsgstr \"Leer el Diccionario\"\n\n#. Key:\tread_symbols\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Read Symbols\"\nmsgstr \"Leer los símbolos\"\n\n#. Key:\trelease_keeper\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Release Keeper\"\nmsgstr \"Soltar el Guardián\"\n\n#. Key:\treplay_boss_fight\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"interaction hint to play a boss fight which was already won\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Replay Boss Fight\"\nmsgstr \"Repetir la Batalla con el Jefe\"\n\n#. Key:\treset_portals\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"lever\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Reset Portals\"\nmsgstr \"Restablecer portales\"\n\n#. Key:\trest\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"rest near a checkpoint statue where character can sleep and change spells and listen to music\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Rest\"\nmsgstr \"Descansar\"\n\n#. Key:\trestore\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"restore the HP\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Restore\"\nmsgstr \"Restaurar\"\n\n#. Key:\tright_lever\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"use Right Lever\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Right Lever\"\nmsgstr \"Palanca Derecha\"\n\n#. Key:\tring_bell\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"there is a bell the character has to use to start the conversation with a merchant\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Ring the bell\"\nmsgstr \"Tocar la campana\"\n\n#. Key:\trope_can_be_placed\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"A rope could be placed here\"\nmsgstr \"Una cuerda podría ser colocada aquí\"\n\n#. Key:\trope_kicked\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"feedback on the kick rope action\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Rope kicked\"\nmsgstr \"Cuerda pateada\"\n\n#. Key:\trope_placed\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Rope placed\"\nmsgstr \"Cuerda colocada\"\n\n#. Key:\tsail\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"use ship for travel\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Sail\"\nmsgstr \"Vela\"\n\n#. Key:\tsoulkeeper_released\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Soulkeeper released\"\nmsgstr \"Guardian de Almas liberado\"\n\n#. Key:\tspecial_strike\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"hint with control key for strike 2 of the character\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Special Strike\"\nmsgstr \"Ataque Especial\"\n\n#. Key:\tstairs\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"enter stairs\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Stairs\"\nmsgstr \"Escaleras\"\n\n#. Key:\tstone_added\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"{0} is the stone amount, {1} is the stone name\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"{0} {1} added to your bag!\"\nmsgstr \"¡{0} {1} añadido a tu bolsa!\"\n\n#. Key:\tstone_cant_carry\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"{0} is the stone name\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"You can't carry more {0}\"\nmsgstr \"No puedes llevar más {0}\"\n\n#. Key:\tstone_cant_store\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"{0} is the stone name\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"You don't have anything you could use to store {0}\"\nmsgstr \"No tiene nada que pueda usar para almacenar {0}\"\n\n#. Key:\tswing\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"Swings on the pole with the arms\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Swing\"\nmsgstr \"Balancear\"\n\n#. Key:\tswitch_interact\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"Switch interact alternative,  between the two modes\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Switch\"\nmsgstr \"Intercambiar\"\n\n#. Key:\ttake\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"character can take an item\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Take\"\nmsgstr \"Llevar\"\n\n#. Key:\ttake_a_seat\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Take a seat\"\nmsgstr \"Toma asiento\"\n\n#. Key:\ttake_abacus\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Take Abacus\"\nmsgstr \"Llevar Abacus\"\n\n#. Key:\ttake_all\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Take All\"\nmsgstr \"Llevarlo Todo\"\n\n#. Key:\ttake_axe\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"character can take a weapon\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Take Axe\"\nmsgstr \"Llevar el Hacha\"\n\n#. Key:\ttake_blades\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"character can take two swords to go dual wield\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Take Blades\"\nmsgstr \"Llevar las Cuchillas\"\n\n#. Key:\ttake_books\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"character can take (two) books\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Take Books\"\nmsgstr \"Llevar los Libros\"\n\n#. Key:\ttake_mace\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"character can take a weapon\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Take Mace\"\nmsgstr \"Llevar la Maza\"\n\n#. Key:\ttake_mushrooms\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Take Mushrooms\"\nmsgstr \"Llevar Setas\"\n\n#. Key:\ttake_rope\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Take Rope\"\nmsgstr \"Llevar la Cuerda\"\n\n#. Key:\ttake_sabre\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"character can take a weapon\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Take Sabre\"\nmsgstr \"Llevar Sable\"\n\n#. Key:\ttake_spellcaster\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"the Spellcaster is an amulet the character can use to cast spells\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Take Spellcaster\"\nmsgstr \"Llevar Lanza Hechizos\"\n\n#. Key:\ttake_stones\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Take Stones\"\nmsgstr \"Llevar Piedras\"\n\n#. Key:\ttake_sword\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"character can take a weapon\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Take Sword\"\nmsgstr \"Llevar la Espada\"\n\n#. Key:\ttake_wheel\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Take Wheel\"\nmsgstr \"Llevar la Rueda\"\n\n#. Key:\ttalk\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Talk\"\nmsgstr \"Hablar\"\n\n#. Key:\ttoggle_switch\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"it is a lightswitch\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Toggle Switch\"\nmsgstr \"Interruptor de Palanca\"\n\n#. Key:\ttouch_statue\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Touch Statue\"\nmsgstr \"Toque la Estatua\"\n\n#. Key:\ttravel\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"travel on the train station path\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Travel\"\nmsgstr \"Viajar\"\n\n#. Key:\tunlocked_with\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"{0} is the key name\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Unlocked with {0}\"\nmsgstr \"Desbloqueado con {0}\"\n\n#. Key:\tuse\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"use device in EndFinal level\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Use\"\nmsgstr \"Usar\"\n\n#. Key:\tuse_active_item\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"uses the active item\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Use Active Item\"\nmsgstr \"Usar Objeto Activo\"\n\n#. Key:\tuse_crystal\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Use Crystal\"\nmsgstr \"Usar Cristal\"\n\n#. Key:\tuse_destroy_explained\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Destroy the device to save the creatures of Ruined Realm\"\nmsgstr \"Destruye el aparato para salvar a las criaturas del Reino Arruinado\"\n\n#. Key:\tuse_device\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Use Device\"\nmsgstr \"Usar Aparato\"\n\n#. Key:\tuse_elevator\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Use Elevator\"\nmsgstr \"Usar ascensor\"\n\n#. Key:\tuse_elevator_gem\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Use Elevator Gem\"\nmsgstr \"Usar gema del Ascensor\"\n\n#. Key:\tuse_magic_mirror\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Use Magic Mirror\"\nmsgstr \"Usar Espejo Mágico\"\n\n#. Key:\tuse_separate_explained\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Use the device to separate the Realms\"\nmsgstr \"Usa el dispositivo para separar los Reinos\"\n\n#. Key:\tuse_switch\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"for the moria gate\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Use switch\"\nmsgstr \"Usar interruptor\"\n\n#. Key:\tuse_workshop\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Use Workshop\"\nmsgstr \"Usar Taller\"\n\n#. Key:\twheel_release\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"release lever wheel\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Release\"\nmsgstr \"Soltar\"\n\n#. Key:\twheel_turn\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"turn lever wheel\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Turn\"\nmsgstr \"Girar\"\n\n#. Key:\twindow\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"examine Window\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Window\"\nmsgstr \"Ventana\"\n\n#. Key:\tworkroom\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"examine/enter Workroom\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Workroom\"\nmsgstr \"Cuarto de trabajo\"\n\n#. Key:\tyou_are_worthy\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"gate golem tutorial level message interaction\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"You are not worthy!\"\nmsgstr \"¡No eres digno!\"\n\n#. Key:\tice_stone_Name\n#. SourceLocation:\tLocalization/StringTables/Items.csv\n#: Localization/StringTables/Items.csv\nmsgctxt \"Items\"\nmsgid \"Ice Stone\"\nmsgstr \"Piedra de Hielo\"\n\n#. Key:\ttest_stone_name\n#. SourceLocation:\tLocalization/StringTables/Items.csv\n#: Localization/StringTables/Items.csv\nmsgctxt \"Items\"\nmsgid \"Test Stone\"\nmsgstr \"Piedra de Prueba\"\n\n#. Key:\tbook\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:494\n#: Source/SOrb/Basic/SoGameSingleton.cpp:494\nmsgctxt \"ItemsCommon\"\nmsgid \"Something to read\"\nmsgstr \"Algo para leer\"\n\n#. Key:\tcooldown\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:501\n#: Source/SOrb/Basic/SoGameSingleton.cpp:501\nmsgctxt \"ItemsCommon\"\nmsgid \"Cooldown\"\nmsgstr \"Enfriamiento\"\n\n#. Key:\tcrossbow\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:487\n#: Source/SOrb/Basic/SoGameSingleton.cpp:487\nmsgctxt \"ItemsCommon\"\nmsgid \"Something to shoot with\"\nmsgstr \"Algo para disparar con\"\n\n#. Key:\tdefensive\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:472\n#: Source/SOrb/Basic/SoGameSingleton.cpp:472\nmsgctxt \"ItemsCommon\"\nmsgid \"Shard of Protection\"\nmsgstr \"Fragmento de Protección\"\n\n#. Key:\tdualwield\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:480\n#: Source/SOrb/Basic/SoGameSingleton.cpp:480\nmsgctxt \"ItemsCommon\"\nmsgid \"Dual Wield Weapon\"\nmsgstr \"Arma de doble empuñadura\"\n\n#. Key:\thealth\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:498\n#: Source/SOrb/Basic/SoGameSingleton.cpp:498\nmsgctxt \"ItemsCommon\"\nmsgid \"Health\"\nmsgstr \"Salud\"\n\n#. Key:\tinvalid_shard_max\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:475\n#: Source/SOrb/Basic/SoGameSingleton.cpp:475\nmsgctxt \"ItemsCommon\"\nmsgid \"Invalid\"\nmsgstr \"No válido\"\n\n#. Key:\tinvalid_weapon_max\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:481\n#: Source/SOrb/Basic/SoGameSingleton.cpp:481\nmsgctxt \"ItemsCommon\"\nmsgid \"Invalid Weapon\"\nmsgstr \"Arma inválida\"\n\n#. Key:\titem\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:492\n#. Key:\tkeylikeitem\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:491\n#: Source/SOrb/Basic/SoGameSingleton.cpp:491\n#: Source/SOrb/Basic/SoGameSingleton.cpp:492\nmsgctxt \"ItemsCommon\"\nmsgid \"Something interesting\"\nmsgstr \"Algo interesante\"\n\n#. Key:\tjewelry\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:469\n#: Source/SOrb/Basic/SoGameSingleton.cpp:469\nmsgctxt \"ItemsCommon\"\nmsgid \"Valuable\"\nmsgstr \"Valioso\"\n\n#. Key:\tkey\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:466\n#: Source/SOrb/Basic/SoGameSingleton.cpp:466\nmsgctxt \"ItemsCommon\"\nmsgid \"Key\"\nmsgstr \"Llave\"\n\n#. Key:\tMemoryStone\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:465\n#: Source/SOrb/Basic/SoGameSingleton.cpp:465\nmsgctxt \"ItemsCommon\"\nmsgid \"Memory Stone\"\nmsgstr \"Piedra de memoria\"\n\n#. Key:\toffensive\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:473\n#: Source/SOrb/Basic/SoGameSingleton.cpp:473\nmsgctxt \"ItemsCommon\"\nmsgid \"Shard of Justice\"\nmsgstr \"Fragmento de Justicia\"\n\n#. Key:\tonehanded\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:478\n#: Source/SOrb/Basic/SoGameSingleton.cpp:478\nmsgctxt \"ItemsCommon\"\nmsgid \"One-Handed Weapon\"\nmsgstr \"Arma de una mano\"\n\n#. Key:\tpotion\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:484\n#: Source/SOrb/Basic/SoGameSingleton.cpp:484\nmsgctxt \"ItemsCommon\"\nmsgid \"Something to drink\"\nmsgstr \"Algo de beber\"\n\n#. Key:\tQuestItem\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:464\n#: Source/SOrb/Basic/SoGameSingleton.cpp:464\nmsgctxt \"ItemsCommon\"\nmsgid \"Quest Item\"\nmsgstr \"Objeto de misión\"\n\n#. Key:\tRuneStone\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:467\n#: Source/SOrb/Basic/SoGameSingleton.cpp:467\nmsgctxt \"ItemsCommon\"\nmsgid \"Runestone\"\nmsgstr \"Piedra rúnica\"\n\n#. Key:\tshard\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:462\n#: Source/SOrb/Basic/SoGameSingleton.cpp:462\nmsgctxt \"ItemsCommon\"\nmsgid \"Shard\"\nmsgstr \"Fragmento\"\n\n#. Key:\tsomething_unlock\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:490\n#: Source/SOrb/Basic/SoGameSingleton.cpp:490\nmsgctxt \"ItemsCommon\"\nmsgid \"Something to unlock with\"\nmsgstr \"Algo para desbloquear con\"\n\n#. Key:\tspecial\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:474\n#: Source/SOrb/Basic/SoGameSingleton.cpp:474\nmsgctxt \"ItemsCommon\"\nmsgid \"Shard of Wonder\"\nmsgstr \"Fragmento de Maravilla\"\n\n#. Key:\tspeed\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:497\n#: Source/SOrb/Basic/SoGameSingleton.cpp:497\nmsgctxt \"ItemsCommon\"\nmsgid \"Attack Speed\"\nmsgstr \"Velocidad de ataque\"\n\n#. Key:\tspell\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:486\n#: Source/SOrb/Basic/SoGameSingleton.cpp:486\nmsgctxt \"ItemsCommon\"\nmsgid \"Something to cast with\"\nmsgstr \"Algo para lanzar con\"\n\n#. Key:\tspellcapacitycost\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:499\n#: Source/SOrb/Basic/SoGameSingleton.cpp:499\nmsgctxt \"ItemsCommon\"\nmsgid \"Capacity Cost\"\nmsgstr \"Coste de Capacidad\"\n\n#. Key:\tspellusagecount\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:500\n#: Source/SOrb/Basic/SoGameSingleton.cpp:500\nmsgctxt \"ItemsCommon\"\nmsgid \"Charge\"\nmsgstr \"Cargar\"\n\n#. Key:\tthrowable\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:485\n#: Source/SOrb/Basic/SoGameSingleton.cpp:485\nmsgctxt \"ItemsCommon\"\nmsgid \"Something to throw\"\nmsgstr \"Algo para tirar\"\n\n#. Key:\ttwohanded\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:479\n#: Source/SOrb/Basic/SoGameSingleton.cpp:479\nmsgctxt \"ItemsCommon\"\nmsgid \"Two-Handed Weapon\"\nmsgstr \"Arma de dos manos\"\n\n#. Key:\tusable\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:463\n#: Source/SOrb/Basic/SoGameSingleton.cpp:463\nmsgctxt \"ItemsCommon\"\nmsgid \"Usable\"\nmsgstr \"Usable\"\n\n#. Key:\tweapon\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:468\n#: Source/SOrb/Basic/SoGameSingleton.cpp:468\nmsgctxt \"ItemsCommon\"\nmsgid \"Weapon\"\nmsgstr \"Arma\"\n\n#. Key:\tmus1_combat_1_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(6).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(6).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Disfunctional Golems\"\nmsgstr \"Golems disfuncionales\"\n\n#. Key:\tmus1_combat_2_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(16).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(16).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Machine Rage\"\nmsgstr \"Ira de la Máquina\"\n\n#. Key:\tmus1_combat_GateKeeper_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(2).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(2).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Worthy\"\nmsgstr \"Digno\"\n\n#. Key:\tmus1_dlg_Generic_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(7).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(7).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Unexpected Friend\"\nmsgstr \"Amigo Inesperado\"\n\n#. Key:\tmus1_dlg_Golem_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(9).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(9).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Duty\"\nmsgstr \"Deber\"\n\n#. Key:\tmus1_dlg_Lory_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(8).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(8).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"The other Bell\"\nmsgstr \"La otra Campana\"\n\n#. Key:\tmus1_dlg_Monk_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(10).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(10).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Enlightened Mind\"\nmsgstr \"Mente Iluminada\"\n\n#. Key:\tmus1_dlg_Raven_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(11).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(11).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Winged Wisdom\"\nmsgstr \"Sabiduría Alada\"\n\n#. Key:\tmus1_dlg_SewerCreature_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(32).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(32).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Pipe Walkers\"\nmsgstr \"Trotadesagües\"\n\n#. Key:\tmus1_dlg_Teachy_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(12).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(12).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Just a bit crazy\"\nmsgstr \"Solo un poco loco\"\n\n#. Key:\tmus1_env_AncientArcade_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(1).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(1).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Remnant Colors\"\nmsgstr \"Colores Remanentes\"\n\n#. Key:\tmus1_env_GreyGate_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(5).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(5).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Touch of Ruin\"\nmsgstr \"Toque de Ruin\"\n\n#. Key:\tmus1_env_SecondArcade_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(17).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(17).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"In Memoriam\"\nmsgstr \"En Memoria\"\n\n#. Key:\tmus1_env_TutorialLevel_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(3).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(3).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Sunken Sewer\"\nmsgstr \"Alcantarilla Hundida\"\n\n#. Key:\tmus2_combat_catacombs_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(18).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(18).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Armours of the Deep\"\nmsgstr \"Armaduras de las Profundidades\"\n\n#. Key:\tmus2_combat_DwarvenBoss_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(19).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(19).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"I hold it back\"\nmsgstr \"Lo contengo\"\n\n#. Key:\tmus2_combat_LavaBoss_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(20).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(20).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Meant to be Perfect\"\nmsgstr \"Pretendía ser Perfecto\"\n\n#. Key:\tmus2_combat_WrackedWaterpath_2_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(22).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(22).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Wracked Warriors\"\nmsgstr \"Guerreros Destrozados\"\n\n#. Key:\tmus2_combat_WrackedWaterpath_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(21).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(21).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Those who survived\"\nmsgstr \"Los que sobrevivieron\"\n\n#. Key:\tmus2_combat_WWBoss_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(23).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(23).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"No price too high\"\nmsgstr \"No hay precio demasiado alto\"\n\n#. Key:\tmus2_dlg_Gnory_Fishy_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(33).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(33).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Intelligence and Wisdom\"\nmsgstr \"Inteligencia y Sabiduría\"\n\n#. Key:\tmus2_dlg_GolemMaker_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(34).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(34).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Lost Memories\"\nmsgstr \"Recuerdos Perdidos\"\n\n#. Key:\tmus2_dlg_MerchAnt_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(35).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(35).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Small but Tiny\"\nmsgstr \"Pequeño pero diminuto\"\n\n#. Key:\tmus2_dlg_SupperDwarf_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(36).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(36).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Supper time\"\nmsgstr \"Hora de la cena\"\n\n#. Key:\tmus2_env_Catacombs_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(24).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(24).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Dwarven Catacombs\"\nmsgstr \"Catacumbas de los Enanos\"\n\n#. Key:\tmus2_env_CrossroadCave_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(25).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(25).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Railway Station\"\nmsgstr \"Estación de ferrocarril\"\n\n#. Key:\tmus2_env_DwarvenGate_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(26).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(26).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Sanctuary of Law\"\nmsgstr \"Santuario de la Ley\"\n\n#. Key:\tmus2_env_DwarvenOutpost_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(27).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(27).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Where the rail leads\"\nmsgstr \"Donde el riel conduce\"\n\n#. Key:\tmus2_env_Kobold_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(15).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(15).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Last of his Tribe\"\nmsgstr \"Último de su Tribu\"\n\n#. Key:\tmus2_env_LavaDeep_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(28).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(28).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Temple for the Ancestors\"\nmsgstr \"Templo de los Antepasados\"\n\n#. Key:\tmus2_env_LavaEntrance_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(29).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(29).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Pilgrim Road\"\nmsgstr \"Camino de Peregrino\"\n\n#. Key:\tmus2_env_WrackedWaterpath_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(30).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(30).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Quick and Clever\"\nmsgstr \"Rápido e Inteligente\"\n\n#. Key:\tmus3_combat_Bubble_Ground_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(14).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(14).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Infected Golems\"\nmsgstr \"Gólems Infectados\"\n\n#. Key:\tmus3_env_BubbleGround_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(38).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(38).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"So close yet so far\"\nmsgstr \"Tan cerca pero tan lejos\"\n\n#. Key:\tmus3_env_CaveHouse_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(39).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(39).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Last Shalter\"\nmsgstr \"Ultimo Refugio\"\n\n#. Key:\tmus3_env_PipePuzzle_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(40).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(40).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Moving Pipes\"\nmsgstr \"Tuberías Móviles\"\n\n#. Key:\tmus3_env_Raven_Puzzle_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(41).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(41).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"One would fail\"\nmsgstr \"Uno fallaría\"\n\n#. Key:\tmus3_env_RuinedRealm_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(42).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(42).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"The end, really\"\nmsgstr \"Al final, realmente\"\n\n#. Key:\tmus_chase_theme_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(4).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(4).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Jump for your life!\"\nmsgstr \"¡Salta por tu vida!\"\n\n#. Key:\tmus_cm_WhiteWall_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(13).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(13).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Decaying City\"\nmsgstr \"Ciudad en Descomposición\"\n\n#. Key:\tmus_ending_dlg_UnknownWizard_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(37).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(37).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"All is lost\"\nmsgstr \"Todo está Perdido\"\n\n#. Key:\tmus_main_theme_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(0).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(0).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Spirit of the Unknown\"\nmsgstr \"Espíritu de lo Desconocido\"\n\n#. Key:\tmus_waterpath_alter_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(43).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(43).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Stories never end\"\nmsgstr \"Las historias nunca terminan\"\n\n#. Key:\tblocked\n#. SourceLocation:\tLocalization/StringTables/Spells.csv\n#. InfoMetaData:\t\"Comment\" : \" displayed as floating test ingame when a certain enemy blocks certain attacks\"\n#: Localization/StringTables/Spells.csv\nmsgctxt \"Spells\"\nmsgid \"Blocked\"\nmsgstr \"Bloqueado\"\n\n#. Key:\tcant_use_in_air\n#. SourceLocation:\tLocalization/StringTables/Spells.csv\n#. InfoMetaData:\t\"Comment\" : \" displayed as floating test ingame when the character tries to use a spell in air which can not be used there\"\n#: Localization/StringTables/Spells.csv\nmsgctxt \"Spells\"\nmsgid \"Can't in air\"\nmsgstr \"No puede en el aire\"\n\n#. Key:\tcant_use_sk_free_zone\n#. SourceLocation:\tLocalization/StringTables/Spells.csv\n#. InfoMetaData:\t\"Comment\" : \" displayed as floating test ingame when character tries to use the respawn point spell on a location when it is not allowed\"\n#: Localization/StringTables/Spells.csv\nmsgctxt \"Spells\"\nmsgid \"Dangerous Location\"\nmsgstr \"Lugar Peligroso\"\n\n#. Key:\thp_gained\n#. SourceLocation:\tLocalization/StringTables/Spells.csv\n#. InfoMetaData:\t\"Comment\" : \" displayed as floating test ingame when the character increases his max health\"\n#: Localization/StringTables/Spells.csv\nmsgctxt \"Spells\"\nmsgid \"Health Increased!\"\nmsgstr \"¡Salud aumentada!\"\n\n#. Key:\timmune\n#. SourceLocation:\tLocalization/StringTables/Spells.csv\n#. InfoMetaData:\t\"Comment\" : \"displayed as floating text ingame if enemy is immune to a spell or damage type\"\n#: Localization/StringTables/Spells.csv\nmsgctxt \"Spells\"\nmsgid \"Immune\"\nmsgstr \"Imune\"\n\n#. Key:\tinfected\n#. SourceLocation:\tLocalization/StringTables/Spells.csv\n#. InfoMetaData:\t\"Comment\" : \" displayed as floating test ingame when dmg over time effect is applied on enemy\"\n#: Localization/StringTables/Spells.csv\nmsgctxt \"Spells\"\nmsgid \"Infected\"\nmsgstr \"Infectado\"\n\n#. Key:\tinstant_recharge\n#. SourceLocation:\tLocalization/StringTables/Spells.csv\n#. InfoMetaData:\t\"Comment\" : \" displayed as floating test ingame when a spell can be used again without waiting for the cooldown time\"\n#: Localization/StringTables/Spells.csv\nmsgctxt \"Spells\"\nmsgid \"Instant Recharge\"\nmsgstr \"Recarga Instantánea\"\n\n#. Key:\tmissing_target\n#. SourceLocation:\tLocalization/StringTables/Spells.csv\n#. InfoMetaData:\t\"Comment\" : \" displayed as floating test ingame when the character tries to use a spell which requires a target but there is none in range\"\n#: Localization/StringTables/Spells.csv\nmsgctxt \"Spells\"\nmsgid \"Who? Where? What?!\"\nmsgstr \"¿Quien? ¿Dónde? ¡¿Qué?!\"\n\n#. Key:\tno_need_for_heal\n#. SourceLocation:\tLocalization/StringTables/Spells.csv\n#. InfoMetaData:\t\"Comment\" : \" displayed as floating test ingame when the character tries to use heal spell but has max health already\"\n#: Localization/StringTables/Spells.csv\nmsgctxt \"Spells\"\nmsgid \"No need\"\nmsgstr \"No hay necesidad\"\n\n#. Key:\tresisted\n#. SourceLocation:\tLocalization/StringTables/Spells.csv\n#. InfoMetaData:\t\"Comment\" : \"displayed as floating text ingame if enemy has a chance to avoid an effect and he is lucky\"\n#: Localization/StringTables/Spells.csv\nmsgctxt \"Spells\"\nmsgid \"Resisted\"\nmsgstr \"Resistido\"\n\n#. Key:\tsecond_chance\n#. SourceLocation:\tLocalization/StringTables/Spells.csv\n#. InfoMetaData:\t\"Comment\" : \" displayed as floating test ingame if char has the effect on and dies and respawns because the effect saves him\"\n#: Localization/StringTables/Spells.csv\nmsgctxt \"Spells\"\nmsgid \"Second Chance\"\nmsgstr \"Segunda Oportunidad\"\n\n#. Key:\tspell_capacity_gained\n#. SourceLocation:\tLocalization/StringTables/Spells.csv\n#. InfoMetaData:\t\"Comment\" : \" displayed as floating test ingame when the character increases his spellpower\"\n#: Localization/StringTables/Spells.csv\nmsgctxt \"Spells\"\nmsgid \"Spellpower Increased!\"\nmsgstr \"¡Poder de Hechizo Aumentado!\"\n\n#. Key:\tspell_regained\n#. SourceLocation:\tLocalization/StringTables/Spells.csv\n#. InfoMetaData:\t\"Comment\" : \" displayed as floating test ingame when the character regains a spell (can cast again)\"\n#: Localization/StringTables/Spells.csv\nmsgctxt \"Spells\"\nmsgid \"Spell Charge Regained!\"\nmsgstr \"¡Carga de Hechizo Recuperada!\"\n\n#. Key:\tacknowledge\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Button\"\n#. Key:\tgroup_defeated_ack\n#. InfoMetaData:\t\"Comment\" : \"the hotkey to close the group defeated panel\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Acknowledge\"\nmsgstr \"Reconocer\"\n\n#. Key:\tback\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Button\"\n#. Key:\tpanel_command_inv_back\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Back\"\nmsgstr \"Volver\"\n\n#. Key:\tblack_fade_teleport_text_1\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Now I remember the night when it started...\"\nmsgstr \"Ahora recuerdo la noche en que comenzó...\"\n\n#. Key:\tbubble_float\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"bubble tip for the char to float\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Float\"\nmsgstr \"Flotar\"\n\n#. Key:\tbubble_jump\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"bubble tip for the char to jump\"\n#. Key:\tinput_jump\n#. InfoMetaData:\t\"Comment\" : \"Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Jump\"\nmsgstr \"Saltar\"\n\n#. Key:\tbuy\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"buy item\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Buy\"\nmsgstr \"Comprar\"\n\n#. Key:\tbuy_back\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"buy back item\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Buy Back\"\nmsgstr \"Recomprar\"\n\n#. Key:\tbuy_on_steam_and_follow\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Buy WarriOrb in Steam and follow us on social media:\"\nmsgstr \"Comprar  WarriOrb en Steam y síguenos en las redes sociales:\"\n\n#. Key:\tcancel\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Confirm popup\"\n#. Key:\tsettings_cancel\n#. InfoMetaData:\t\"Comment\" : \"Settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Cancel\"\nmsgstr \"Cancelar\"\n\n#. Key:\tchange_user\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Change User\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Change User\"\nmsgstr \"Cambiar perfil\"\n\n#. Key:\tchapter\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Stats for saves\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Chapter\"\nmsgstr \"Capítulo\"\n\n#. Key:\tchapter1_completed\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Temporary for chapter 1\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Chapter 1 completed. Save is Locked.\"\nmsgstr \"Capítulo 1 completado. Guardar está bloqueado.\"\n\n#. Key:\tcharacter_skin_classic\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"name of the original character skin\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Classic\"\nmsgstr \"Classico\"\n\n#. Key:\tcharacter_skin_desc\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"description for the character skin option\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Changes the visuals of the player character\"\nmsgstr \"Cambia el aspecto del personaje del jugador\"\n\n#. Key:\tcharacter_skin_mummy\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"name of the alternative character skin\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Mummy\"\nmsgstr \"Momia\"\n\n#. Key:\tcharacter_skin_pumpkin\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"name of the alternative character skin\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Pumpkin\"\nmsgstr \"Calabaza\"\n\n#. Key:\tcharacter_skin_title\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"option to change character skin\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Character Skin\"\nmsgstr \"Piel de Personaje\"\n\n#. Key:\tcheckpoint\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Stats for saves\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Checkpoint\"\nmsgstr \"Punto de Control\"\n\n#. Key:\tchest_examine\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Examine\"\nmsgstr \"Examinar\"\n\n#. Key:\tchest_leave\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Leave\"\nmsgstr \"Salir\"\n\n#. Key:\tchest_loot\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"hotkey tip on chest\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Loot\"\nmsgstr \"Botín\"\n\n#. Key:\tclose\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"close book\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Close\"\nmsgstr \"Cerrar\"\n\n#. Key:\tcompleted_in_time\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Custom Map\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Completed in {time}\"\nmsgstr \"Completado en {time}\"\n\n#. Key:\tconfirm\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Confirm popup\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Confirm\"\nmsgstr \"Confirmar\"\n\n#. Key:\tconfirm_keyboard_settings_reset\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Confirm keyboard settings\"\n#. Key:\tdifficulty_confirm_question\n#. InfoMetaData:\t\"Comment\" : \"Confirm difficulty selected popup\"\n#. Key:\tsave_slots_remove_confirm\n#. InfoMetaData:\t\"Comment\" : \"remove save slot confirm dialogue\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Are you sure?\"\nmsgstr \"¿Estás seguro?\"\n\n#. Key:\tconsole_ps4\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"PlayStation 4\"\nmsgstr \"Playstation 4\"\n\n#. Key:\tconsole_switch\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Switch\"\nmsgstr \"Switch\"\n\n#. Key:\tconsole_xbox_one\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"XBox One\"\nmsgstr \"XBox One\"\n\n#. Key:\tcontinue\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Menu Continue\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Continue\"\nmsgstr \"Continuar\"\n\n#. Key:\tcontroller_recommended\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Main Menu\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Note: Playing with a controller is recommended\"\nmsgstr \"Nota: se recomienda jugar con un mando\"\n\n#. Key:\tcredits\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Menu credits\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Credits\"\nmsgstr \"Créditos\"\n\n#. Key:\tcustom_map_x\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Custom Map\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Custom Map {0}\"\nmsgstr \"Mapa Personalizado {0}\"\n\n#. Key:\tcustom_maps\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Menu custom Maps\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Custom Maps\"\nmsgstr \"Mapas Personalizados\"\n\n#. Key:\tdescription\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Of something\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Description\"\nmsgstr \"Descripción\"\n\n#. Key:\tdifficulty\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Stats for saves\"\n#. Key:\tdifficulty_title\n#. InfoMetaData:\t\"Comment\" : \"title of difficulty selection\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Difficulty\"\nmsgstr \"Dificultad\"\n\n#. Key:\tdifficulty_confirm_subtext\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Confirm difficulty selected popup subtext\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"This choice is permanent\"\nmsgstr \"Esta decisión es permanente\"\n\n#. Key:\tdifficulty_desc_insane\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"description of hard difficulty\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"- The <Blue>SoulKeeper</> (Portable Checkpoint) spell is removed from the game\\n- Increased incoming damage\\n- Increased Enemy Health\"\nmsgstr \"- Los <Blue> Guardian de Almas </> El hechizo (Punto de control portátil) se elimina del juego - Aumenta el daño entrante - Aumenta la Salud del Enemigo\"\n\n#. Key:\tdifficulty_desc_intended\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"description of normal difficulty\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"The way the game is meant to be played\"\nmsgstr \"La forma en que se debe jugar el juego\"\n\n#. Key:\tdifficulty_desc_sane\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"description of easy difficulty\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"- Infinite <Blue>SoulKeeper</> (Checkpoint) spell charges\\n- No health penalty when respawning near the <Blue>SoulKeeper</>\\n- Decreased incoming damage\\n- Decreased Enemy Health\"\nmsgstr \"- Infinito <Blue> Guardian de Almas </> Cargos de hechizo (punto de control): no hay penalización de salud al reaparecer cerca del <Blue> SoulKeeper </> - Disminución del daño entrante - Disminución de la Salud del Enemigo\"\n\n#. Key:\tdifficulty_insane\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"name of hard difficulty\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"As hard as it can get\"\nmsgstr \"Demente\"\n\n#. Key:\tdifficulty_intended\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"name of normal difficulty\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"A true challenge\"\nmsgstr \"Normal\"\n\n#. Key:\tdifficulty_normal\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Normal\"\nmsgstr \"Normal\"\n\n#. Key:\tdifficulty_sane\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"name of easy difficulty\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Just an adventure\"\nmsgstr \"Fácil\"\n\n#. Key:\tdisabled\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Widget is disabled\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Disabled\"\nmsgstr \"Desactivado\"\n\n#. Key:\tdiscord\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Discord\"\nmsgstr \"Discord\"\n\n#. Key:\tdrm_defeatead_description\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"check only in pirated copies \"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"We suspect that you play a pirated copy of the game.\\nIt's fine. We hope you will enjoy it!\\n\\nIf you like the game, please tell your friends about it, and maybe even consider buying it.\\n\\nWe would love to keep making games!\"\nmsgstr \"Sospechamos que juegas una copia pirata del juego.\\nEstá bien. ¡Esperamos que lo disfrutes!\\n\\nSi te gusta el juego, cuéntaselo a tus amigos y tal vez incluso consideres comprarlo.\\n\\n¡Nos encantaría seguir haciendo juegos!\"\n\n#. Key:\tdrm_defeatead_title\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"check only in pirated copies \"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"WarriOrb DRM\"\nmsgstr \"WarriOrb DRM\"\n\n#. Key:\tdwarf_language\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Dwarf language\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Dwarf\"\nmsgstr \"Enano\"\n\n#. Key:\tempty\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Empty\"\nmsgstr \"Vacío\"\n\n#. Key:\tempty_line\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"-\"\nmsgstr \"-\"\n\n#. Key:\tencourage_line1\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Before Main Menu\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"The path ahead is challenging. Do not despise failure. Every wrong attempt discarded is another step forward.\"\nmsgstr \"El camino por delante es desafiante. No desprecies el fracaso. Cada intento equivocado descartado es otro paso adelante.\"\n\n#. Key:\tessence\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"essence represents the Health of the character\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Essence\"\nmsgstr \"Esencia\"\n\n#. Key:\tfeedback\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Discord external button\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Feedback\"\nmsgstr \"Feedback\"\n\n#. Key:\tgame_defeated\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"end screen\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Game Defeated!\"\nmsgstr \"¡Juego derrotado!\"\n\n#. Key:\tgame_is_wip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Main Menu\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Game currently under development\"\nmsgstr \"Juego actualmente en desarrollo\"\n\n#. Key:\tgame_over_retreat\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"control tip which is only visible in boss areas where the player can either restart the fight or retreat from the place\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Retreat\"\nmsgstr \"Retirada\"\n\n#. Key:\tgame_over_retry\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"control tip which is always visible on game over\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Retry\"\nmsgstr \"Reintentar\"\n\n#. Key:\tgamepad_special_left_xbox\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"xbox view button\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"View button\"\nmsgstr \"Botón Vista\"\n\n#. Key:\tgamepad_special_right_xbox\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"xbox Menu button\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Menu button\"\nmsgstr \"botón Menú\"\n\n#. Key:\tgo_back_to_menu\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Go back to main menu\"\nmsgstr \"Volver al menú principal\"\n\n#. Key:\tgold_x\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"{x} is the gold amount\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"+{x} GOLD\"\nmsgstr \"+{x} ORO\"\n\n#. Key:\tgroup_defeated_title\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"title of the group defeated panel\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Group Defeated\"\nmsgstr \"Grupo Derrotado\"\n\n#. Key:\tinput_action_back\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"UI Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"UI Action Back\"\nmsgstr \"UI Acción Atrás\"\n\n#. Key:\tinput_action_first\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"UI Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"UI Action First\"\nmsgstr \"UI Acción Primero\"\n\n#. Key:\tinput_action_second\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"UI Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"UI Action Second\"\nmsgstr \"UI Acción Segundo\"\n\n#. Key:\tinput_action_third\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"UI Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"UI Action Third\"\nmsgstr \"UI Acción Tercero\"\n\n#. Key:\tinput_actions_conflicts\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input remap.  {Key} = key display name. {NumAction} the number of actions, this will determine what to choose between one and other.\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Selected button = {Key}, will get unbound from the {NumActions}|plural(one=Action,other=Actions) = {ActionNames}\"\nmsgstr \"El botón seleccionado = {Key}, se desligará de {NumActions}|plural(one=Action, other=Actions) = {ActionNames}\"\n\n#. Key:\tinput_alt_interact\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Interact Alternative\"\nmsgstr \"Alternativa de Interacción\"\n\n#. Key:\tinput_change_item\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input Action Name\"\n#. Key:\tpanel_command_inv_change_item\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Change Item\"\nmsgstr \"Cambiar Elemento\"\n\n#. Key:\tinput_change_spell\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Change Spell\"\nmsgstr \"Cambiar hechizo\"\n\n#. Key:\tinput_change_weapon\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Change Weapon\"\nmsgstr \"Cambiar arma\"\n\n#. Key:\tinput_down\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"UI Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"UI Move Down\"\nmsgstr \"UI Moverse Hacia Abajo\"\n\n#. Key:\tinput_float\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Floating\"\nmsgstr \"Flotando\"\n\n#. Key:\tinput_interact\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Interact\"\nmsgstr \"Interactuar\"\n\n#. Key:\tinput_left\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Move Left\"\nmsgstr \"Mover Hacia la Izquierda\"\n\n#. Key:\tinput_menu_back\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"UI Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Open Menu/Escape/Back\"\nmsgstr \"Abrir Menú /Escapar/ Atrás\"\n\n#. Key:\tinput_not_allowed_options_menu_button\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input remap gamepad\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Not allowed to remap to the Menu button\"\nmsgstr \"No se permite reasignar al botón Menú\"\n\n#. Key:\tinput_not_allowed_options_menu_button_switch\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input remap gamepad\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Not allowed to remap to the + Button\"\nmsgstr \"No se permite reasignar al botón +\"\n\n#. Key:\tinput_not_allowed_thumbsticks\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input remap gamepad\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Not allowed to remap to thumbsticks\"\nmsgstr \"No se permite reasignar a las joysticks\"\n\n#. Key:\tinput_not_allowed_thumbsticks_switch\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input remap gamepad switch\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Not allowed to remap to Left Stick or Right Stick\"\nmsgstr \"No se permite reasignar a las palanca izquierda / palanca derecha\"\n\n#. Key:\tinput_open_inventory\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Open Inventory\"\nmsgstr \"Abrir el Inventario\"\n\n#. Key:\tinput_right\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Move Right\"\nmsgstr \"Mover a la Derecha\"\n\n#. Key:\tinput_roll\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Roll\"\nmsgstr \"Rodar\"\n\n#. Key:\tinput_selected_key_not_allowed\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input remap. {Key} = key display name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Selected button = {Key}, is not allowed as an input option\"\nmsgstr \"El botón seleccionado = {Key}, no está permitida como una opción de entrada\"\n\n#. Key:\tinput_spell_down\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"UI Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"UI Spell Down\"\nmsgstr \"UI Hechizo Abajo\"\n\n#. Key:\tinput_spell_left\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"UI Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"UI Spell Left\"\nmsgstr \"UI Hechizo Izquierda\"\n\n#. Key:\tinput_spell_right\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"UI Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"UI Spell Right\"\nmsgstr \"UI Hechizo Derecha\"\n\n#. Key:\tinput_spell_select\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"UI Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"UI Spell Select\"\nmsgstr \"UI Seleccionar Hechizo\"\n\n#. Key:\tinput_spell_select_and_cast\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"UI Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"UI Spell Select & Cast\"\nmsgstr \"UI Seleccionar Hechizo y Lanzar\"\n\n#. Key:\tinput_spell_up\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"UI Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"UI Spell Up\"\nmsgstr \"UI Hechizo Arriba\"\n\n#. Key:\tinput_strike_primary\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Primary Strike\"\nmsgstr \"Ataque Primario\"\n\n#. Key:\tinput_strike_special\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Special Strike\"\nmsgstr \"Ataque Especial\"\n\n#. Key:\tinput_take_weapon\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Take Weapon Away\"\nmsgstr \"Quitar arma\"\n\n#. Key:\tinput_top_left\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"UI Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"UI Top Left\"\nmsgstr \"IU Arriba a la Izquierda\"\n\n#. Key:\tinput_top_right\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"UI Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"UI Top Right\"\nmsgstr \"IU Arriba a la Derecha\"\n\n#. Key:\tinput_unbound\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Unbound input\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Unbound\"\nmsgstr \"Desligado\"\n\n#. Key:\tinput_up\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"UI Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"UI Move Up\"\nmsgstr \"UI Mover hacia arriba\"\n\n#. Key:\tinput_use_item\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Use Item\"\nmsgstr \"Usar Objeto\"\n\n#. Key:\tinventory_item_amount\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"the item amount displayed in inventory/trade panel/etc.\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Amount: {0}\"\nmsgstr \"Cantidad: {0}\"\n\n#. Key:\tinventory_item_tooltip_cooldown\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Cooldown\"\nmsgstr \"Enfriamiento\"\n\n#. Key:\tinventory_item_tooltip_damage\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"damage text on item descriptions\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Damage\"\nmsgstr \"Daño\"\n\n#. Key:\tinventory_item_tooltip_sec\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"duration of something (e.g. cooldown)\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"{0} sec\"\nmsgstr \"{0} segundos\"\n\n#. Key:\titem_equipped\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Item Tooltip\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"---Equipped---\"\nmsgstr \"---Equipado---\"\n\n#. Key:\titem_not_For_sale\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Item Tooltip\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Not for sale\"\nmsgstr \"No para la venta\"\n\n#. Key:\titem_rarity_0\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"item rarity text on the bottom of tooltips\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Better than nothing, right?\"\nmsgstr \"Mejor que nada, ¿verdad?\"\n\n#. Key:\titem_rarity_1\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"item rarity text on the bottom of tooltips\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Better than nothing\"\nmsgstr \"Mejor que nada\"\n\n#. Key:\titem_rarity_2\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"item rarity text on the bottom of tooltips\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Good stuff\"\nmsgstr \"Buenas cosas\"\n\n#. Key:\titem_rarity_3\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"item rarity text on the bottom of tooltips\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Pretty good stuff\"\nmsgstr \"Muy buenas cosas\"\n\n#. Key:\titem_rarity_4\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"item rarity text on the bottom of tooltips\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Amazing stuff\"\nmsgstr \"Increíbles cosas\"\n\n#. Key:\tkey_selection_current\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Select Input key\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Currently selected button:\"\nmsgstr \"Botón seleccionado actualmente:\"\n\n#. Key:\tkey_selection_empty\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Select Input key\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"[Empty Button]\"\nmsgstr \"[botón vacío]\"\n\n#. Key:\tkey_selection_press\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Select Input key\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"[Press Button]\"\nmsgstr \"[presiona el botón]\"\n\n#. Key:\tkey_selection_press_button\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Select Input key\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Press the button you want to assign to the action:\"\nmsgstr \"Presione el botón que desea asignar a la acción:\"\n\n#. Key:\tline_three_dots\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"...\"\nmsgstr \"...\"\n\n#. Key:\tloading_screen_press_key\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Press any key to continue...\"\nmsgstr \"Pulse cualquier tecla para continuar...\"\n\n#. Key:\tloading_screen_press_key_switch\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Press any button to continue...\"\nmsgstr \"Presione cualquier botón para continuar...\"\n\n#. Key:\tloading_screen_text_1\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"This is a loading screen. We wait a few seconds here to look more professional.\"\nmsgstr \"Esta es una pantalla de carga. Esperamos unos segundos aquí para parecer más profesional.\"\n\n#. Key:\tmailing_list\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Mailing List\"\nmsgstr \"Lista de Correo\"\n\n#. Key:\tnever_completed\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Custom Map\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Never completed\"\nmsgstr \"Nunca completado\"\n\n#. Key:\tno\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Confirm popup\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"No\"\nmsgstr \"No\"\n\n#. Key:\tpanel_character_sheet\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Character Panel\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Character Sheet\"\nmsgstr \"Hoja del Personaje\"\n\n#. Key:\tpanel_command_inv_compare\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Compare\"\nmsgstr \"Comparar\"\n\n#. Key:\tpanel_command_inv_drink\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Drink\"\nmsgstr \"Beber\"\n\n#. Key:\tpanel_command_inv_equip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"control key tip in inventory\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Equip\"\nmsgstr \"Equipar\"\n\n#. Key:\tpanel_command_inv_equip_item\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Equip Item\"\nmsgstr \"Equipar Artículo\"\n\n#. Key:\tpanel_command_inv_equip_next\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Equip Next\"\nmsgstr \"Equipar Siguiente\"\n\n#. Key:\tpanel_command_inv_read\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Read\"\nmsgstr \"Leer\"\n\n#. Key:\tpanel_command_inv_unequip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Unequip\"\nmsgstr \"Desequipar\"\n\n#. Key:\tpanel_command_spell_add\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"add spell to equipped spells\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Add\"\nmsgstr \"Añadir\"\n\n#. Key:\tpanel_command_spell_remove\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"remove spell from equipped spells\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Remove\"\nmsgstr \"Quitar\"\n\n#. Key:\tpanel_equipped_spells\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Spell Selection panel\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Equipped Spells\"\nmsgstr \"Hechizos Equipados\"\n\n#. Key:\tpanel_inventory\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Character Panel\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Inventory\"\nmsgstr \"Inventario\"\n\n#. Key:\tpanel_notes\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Character Panel\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Sidenotes\"\nmsgstr \"Notas\"\n\n#. Key:\tpaneL_resistances\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Character Sheet Panel\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Resistances\"\nmsgstr \"Resistencias\"\n\n#. Key:\tpanel_rest_no_item\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"You don't have the necessary item to use spells!\"\nmsgstr \"¡No tienes el objeto necesario para usar hechizos!\"\n\n#. Key:\tpanel_rest_option_change_spells\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Change Spells\"\nmsgstr \"Cambiar Hechizos\"\n\n#. Key:\tpanel_rest_option_listen_to_music\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Listen to Music\"\nmsgstr \"Escuchar Música\"\n\n#. Key:\tpanel_rest_option_sleep\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Sleep\"\nmsgstr \"Dormir\"\n\n#. Key:\tpanel_rest_option_wake_up\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Wake Up\"\nmsgstr \"Despertar\"\n\n#. Key:\tpanel_spell_capacity\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Spell Selection panel\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Capacity: {0}/{1}\"\nmsgstr \"Capacidad: {0}/{1}\"\n\n#. Key:\tpanel_spell_selection_denied\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Spell Selection panel\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"You can only change the equipped spells near ancient statues.\"\nmsgstr \"Solo puedes cambiar los hechizos equipados cerca de estatuas antiguas.\"\n\n#. Key:\tpanel_spells\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Character Panel\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Spells\"\nmsgstr \"Hechizos\"\n\n#. Key:\tpercentage_argument\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Slider\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"{0}%\"\nmsgstr \"{0}%\"\n\n#. Key:\tplay_time\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Stats for saves\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Play Time\"\nmsgstr \"Tiempo de Juego\"\n\n#. Key:\tprogress_saved\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Confirm Quit popup\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Progress will be saved\"\nmsgstr \"El progreso se guardará\"\n\n#. Key:\tprogress_saved_automatically\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Before Main Menu\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Your progress is saved automatically whenever this icon is displayed\"\nmsgstr \"Su progreso se guarda automáticamente cada vez que se muestra este icono\"\n\n#. Key:\tquit_game\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Menu Quit Game\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Quit Game\"\nmsgstr \"Salir del Juego\"\n\n#. Key:\tquit_game_question\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Confirm Quit popup\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Quit Game?\"\nmsgstr \"Seguro que quieres salir del juego?\"\n\n#. Key:\tquit_to_menu\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Menu Quit To Menu\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Quit to Menu\"\nmsgstr \"Salir al menú\"\n\n#. Key:\tquit_to_menu_question\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Confirm Quit popup\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Quit to Menu?\"\nmsgstr \"¿Salir al menú?\"\n\n#. Key:\treset_keyboard_arrows\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Confirm keyboard settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Reset to Arrow defaults\"\nmsgstr \"Restablecer a los valores predeterminados de las teclas\"\n\n#. Key:\treset_keyboard_wasd\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Confirm keyboard settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Reset to WASD defaults\"\nmsgstr \"Restablecer los valores predeterminados de WASD\"\n\n#. Key:\trestart\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Restart the game\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Restart\"\nmsgstr \"Reiniciar\"\n\n#. Key:\trestart_game_question\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Confirm Restart popup\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Restart Game?\"\nmsgstr \"¿Reinicia el juego?\"\n\n#. Key:\trestart_game_warning\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Confirm Restart popup\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"All progress will be lost\"\nmsgstr \"Todo el progreso se perderá\"\n\n#. Key:\tsave_slots_clear\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"clears the save slot\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Clear\"\nmsgstr \"Limpiar\"\n\n#. Key:\tsave_slots_loaded\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"text on currently loaded save slot if there is any\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"- Loaded -\"\nmsgstr \"- Cargado -\"\n\n#. Key:\tsave_slots_new_game\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"text on empty save slot\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"New Game\"\nmsgstr \"Nuevo juego\"\n\n#. Key:\tsave_slots_playtime\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"playtime displayed, {0} is the hours, {1} is the minutes\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"{0} H {1} M\"\nmsgstr \"{0} H {1} M\"\n\n#. Key:\tsave_slots_playtime_short\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"playtime displayed if it did not reach an hour, {0} is the time in minutes\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"{0} M\"\nmsgstr \"{0} M\"\n\n#. Key:\tsave_slots_remove_confirm_subtext\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"remove save slot confirm dialogue\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Progress will be lost\"\nmsgstr \"Se perderá el progreso\"\n\n#. Key:\tsave_slots_select\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"loads the game or creates a new one using the active slot\"\n#. Key:\tselect\n#. InfoMetaData:\t\"Comment\" : \"Button\"\n#. Key:\tspell_cast_switch_select\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Select\"\nmsgstr \"Seleccionar\"\n\n#. Key:\tsaves\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Menu saves\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Save Slots\"\nmsgstr \"Ranuras para Guardar\"\n\n#. Key:\tseconds\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"seconds\"\nmsgstr \"segundos\"\n\n#. Key:\tselect_spells\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input right  thumbstick\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Select spells\"\nmsgstr \"Seleccionar hechizos\"\n\n#. Key:\tsell\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"sell item\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Sell\"\nmsgstr \"Vender\"\n\n#. Key:\tsend_automatically\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Analytics popup\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Send Automatically\"\nmsgstr \"Enviar automáticamente\"\n\n#. Key:\tsend_no\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Analytics popup\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Do not Send\"\nmsgstr \"No enviar\"\n\n#. Key:\tsettings\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Menu settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Settings\"\nmsgstr \"Ajustes\"\n\n#. Key:\tsettings_antialising\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Anti-Aliasing\"\nmsgstr \"Anti-Aliasing\"\n\n#. Key:\tsettings_antialising_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Smooths out the edges by blending the colors of the pixels around the object to create the illusion of smoothness.\"\nmsgstr \"Suaviza los bordes combinando los colores de los píxeles alrededor del objeto para crear la ilusión de suavidad.\"\n\n#. Key:\tsettings_apply\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Apply\"\nmsgstr \"Aplicar\"\n\n#. Key:\tsettings_aspect_ratio\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Aspect Ratio\"\nmsgstr \"Relación de Aspecto\"\n\n#. Key:\tsettings_aspect_ratio_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Defines what aspect ratios are available for your resolution.\"\nmsgstr \"Define qué relaciones de aspecto están disponibles para su resolución.\"\n\n#. Key:\tsettings_audio\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Settings panels\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Audio\"\nmsgstr \"Audio\"\n\n#. Key:\tsettings_auto_detect_controller\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Gamepad settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Auto detect Gamepad Layout\"\nmsgstr \"Detección automática de diseño de Gamepad\"\n\n#. Key:\tsettings_borderless\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Borderless\"\nmsgstr \"Sin márgenes\"\n\n#. Key:\tsettings_brightness\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Settings panels\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Brightness\"\nmsgstr \"Brillo\"\n\n#. Key:\tsettings_brightness_default_value\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Brightness settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Default Value is 100%\"\nmsgstr \"El valor predeterminado es 100%\"\n\n#. Key:\tsettings_brightness_description\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Brightness settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Please adjust the brightness of the game to your display\"\nmsgstr \"Ajusta el brillo del juego a tu pantalla\"\n\n#. Key:\tsettings_collect_analytics\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Game Settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Collect Usage Statistics\"\nmsgstr \"Recopilar estadísticas de uso\"\n\n#. Key:\tsettings_collect_analytics_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Game Settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"These are not used to identify individuals, but help us to understand players needs to improve our game.\"\nmsgstr \"No se utilizan para identificar individuos, pero nos ayudan a comprender las necesidades de los jugadores para mejorar nuestro juego.\"\n\n#. Key:\tsettings_confirm_display_title\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings confirm\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Confirm Display Settings in\"\nmsgstr \"Confirme la configuración de pantalla en\"\n\n#. Key:\tsettings_controller\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Settings panels\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Gamepad\"\nmsgstr \"Gamepad\"\n\n#. Key:\tsettings_controller_platform\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Gamepad Layout settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Layout\"\nmsgstr \"Diseño\"\n\n#. Key:\tsettings_controller_remap\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Gamepad settings\"\n#. Key:\tsettings_controller_remap_single\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Remap Controls\"\nmsgstr \"Reasignación de controles\"\n\n#. Key:\tsettings_controller_remap_noedit\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Gamepad settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Please use a gamepad in order to remap\"\nmsgstr \"Utilice un gamepad para reasignar\"\n\n#. Key:\tsettings_controller_switch\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Settings panels\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Controls\"\nmsgstr \"Controles\"\n\n#. Key:\tsettings_display\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Settings panels\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Display\"\nmsgstr \"Mostrar\"\n\n#. Key:\tsettings_display_damage\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Game settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Display Damage\"\nmsgstr \"Mostrar Daño\"\n\n#. Key:\tsettings_display_damage_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Game settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Show damage as a floating number on the screen\"\nmsgstr \"Mostrar daño como un número flotante en la pantalla\"\n\n#. Key:\tsettings_display_enemy_hp\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Game settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Display Enemy Health\"\nmsgstr \"Mostrar salud enemiga\"\n\n#. Key:\tsettings_display_enemy_hp_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Game settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Show a small health bar above injured enemies\"\nmsgstr \"Muestra una pequeña barra de salud sobre los enemigos heridos\"\n\n#. Key:\tsettings_display_floating_vo\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Game settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Display Floating Voice Lines\"\nmsgstr \"Mostrar líneas de voz flotantes\"\n\n#. Key:\tsettings_display_floating_vo_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Game settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Show voice lines as floating texts\"\nmsgstr \"Mostrar líneas de voz como textos flotantes\"\n\n#. Key:\tsettings_display_fps\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Game settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Display FPS\"\nmsgstr \"Mostrar FPS\"\n\n#. Key:\tsettings_display_fps_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Game settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Show FPS counter\"\nmsgstr \"Mostrar contador de FPS\"\n\n#. Key:\tsettings_display_mode\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Display Mode\"\nmsgstr \"Modo de visualización\"\n\n#. Key:\tsettings_display_mode_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"In Windowed mode you can interact with other windows easier. In Borderless mode you can quickly switch between applications.\"\nmsgstr \"En el modo Ventana puede interactuar con otras ventanas más fácilmente. En el modo sin bordes, puede cambiar rápidamente entre aplicaciones.\"\n\n#. Key:\tsettings_display_play_time\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Game settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Display Play Time\"\nmsgstr \"Mostrar Tiempo de Juego\"\n\n#. Key:\tsettings_display_play_time_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Game settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Show current play time\"\nmsgstr \"Mostrar tiempo de juego actual\"\n\n#. Key:\tsettings_effects\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Effect Quality\"\nmsgstr \"Calidad del Efecto\"\n\n#. Key:\tsettings_effects_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Affects the quality of particles in the world, a lower quality might make some projectiles in the world harder to see.\"\nmsgstr \"Afecta la calidad de las partículas en el mundo, una calidad inferior podría hacer que algunos proyectiles en el mundo sean más difíciles de ver.\"\n\n#. Key:\tsettings_effects_volume\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Audio settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Sound Effects volume\"\nmsgstr \"Volumen de Efectos de Sonido\"\n\n#. Key:\tsettings_effects_volume_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Audio settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Adjust the sound effects volume\"\nmsgstr \"Ajusta el volumen de los efectos de sonido\"\n\n#. Key:\tsettings_force_weak_hardware_opt\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Additional Optimizations\"\nmsgstr \"Optimizaciones Adicionales\"\n\n#. Key:\tsettings_force_weak_hardware_opt_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"In certain areas background traps are deactivated or background visuals look cheaper to gain more performance.\"\nmsgstr \"En ciertas áreas, las trampas de fondo se desactivan o las imágenes de fondo se ven más básicas para obtener mayor rendimiento.\"\n\n#. Key:\tsettings_fps_unlimited\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings frame limit\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Unlimited\"\nmsgstr \"Ilimitado\"\n\n#. Key:\tsettings_frame_limit\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Frame Limit (FPS)\"\nmsgstr \"Límite de Cuadros (FPS)\"\n\n#. Key:\tsettings_frame_limit_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Limit the maximum frame rate for a consistent experience.\"\nmsgstr \"Limite maxima de velocidad de cuadros para una experiencia consistente.\"\n\n#. Key:\tsettings_fullscreen\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Fullscreen\"\nmsgstr \"Pantalla completa\"\n\n#. Key:\tsettings_game\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Settings panels\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Game\"\nmsgstr \"Juego\"\n\n#. Key:\tsettings_game_speed\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Game settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Game Speed\"\nmsgstr \"Velocidad de Juego\"\n\n#. Key:\tsettings_game_speed_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Game settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Changes the speed of the game.\\nHigher speed might make the game have lower FPS.\"\nmsgstr \"Cambia la velocidad del Juego.\\nUna velocidad más alta podría hacer que el juego tenga un FPS más bajo.\"\n\n#. Key:\tsettings_gamepad_vibration\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Gamepad Vibration intensity settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Vibration\"\nmsgstr \"Vibración\"\n\n#. Key:\tsettings_keyboard\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Settings panels\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Keyboard\"\nmsgstr \"Teclado\"\n\n#. Key:\tsettings_keyboard_remap_noedit\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Keyboard Settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Please use a keyboard in order to change the keyboard input\"\nmsgstr \"Utilice un teclado para cambiar la entrada del teclado\"\n\n#. Key:\tsettings_language\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Game settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Language\"\nmsgstr \"Idioma\"\n\n#. Key:\tsettings_language_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Game settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Change the display and locale (numbers, dates) language\"\nmsgstr \"Cambiar el idioma de visualización y localización (números, fechas)\"\n\n#. Key:\tsettings_master_volume\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Audio settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Master volume\"\nmsgstr \"Volumen principal\"\n\n#. Key:\tsettings_master_volume_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Audio settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Adjust the master volume\"\nmsgstr \"Ajusta el volumen principal\"\n\n#. Key:\tsettings_merciful_bounce\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"game settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Merciful Bounce Mode\"\nmsgstr \"Modo de rebote misericordioso\"\n\n#. Key:\tsettings_merciful_bounce_always\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"defines when (in which difficulty mode) is the easier bounce mode active\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Always\"\nmsgstr \"Siempre\"\n\n#. Key:\tsettings_merciful_bounce_never\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"defines when (in which difficulty mode) is the easier bounce mode active\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Never\"\nmsgstr \"Nunca\"\n\n#. Key:\tsettings_merciful_bounce_on_easy\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"defines when (in which difficulty mode) is the easier bounce mode active\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"On Easy\"\nmsgstr \"En fácil\"\n\n#. Key:\tsettings_merciful_bounce_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"tooltip for Merciful Bounce Mode option\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Allows Higher Bounce even if the Jump button is pressed after the character hits the ground\"\nmsgstr \"Permite un rebote superior incluso si se presiona el botón de salto después de que el personaje toque el suelo\"\n\n#. Key:\tsettings_move_left_right\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Move left/right\"\nmsgstr \"Mover izquierda/derecha\"\n\n#. Key:\tsettings_music_volume\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Audio settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Music volume\"\nmsgstr \"Volumen de la música\"\n\n#. Key:\tsettings_music_volume_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Audio settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Adjust the music volume\"\nmsgstr \"Ajusta el volumen de la música\"\n\n#. Key:\tsettings_mute_audio\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Audio settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Mute audio\"\nmsgstr \"Silenciar el audio\"\n\n#. Key:\tsettings_mute_audio_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Audio settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Mute all audio\"\nmsgstr \"Silenciar todo el audio\"\n\n#. Key:\tsettings_mute_audio_unfocused\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Audio settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Mute audio when in background\"\nmsgstr \"Silenciar audio cuando está en el fondo\"\n\n#. Key:\tsettings_mute_audio_unfocused_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Audio settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Mute the audio when the game window is not in focus\"\nmsgstr \"Silencia el audio cuando la ventana del juego no está enfocada\"\n\n#. Key:\tsettings_mute_dialogue_voice\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Audio settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Mute voices in dialogues\"\nmsgstr \"Silenciar voces en diálogos\"\n\n#. Key:\tsettings_mute_dialogue_voice_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Audio settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Mute the gibberish voices inside the dialogues\"\nmsgstr \"Silencia las voces entrecortadas dentro de los diálogos\"\n\n#. Key:\tsettings_mute_voice\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Audio settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Mute voices outside of dialogues\"\nmsgstr \"Silenciar las voces fuera de los diálogos\"\n\n#. Key:\tsettings_mute_voice_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Audio settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Mute the gibberish voices outside the dialogues\"\nmsgstr \"Silenciar las voces galimatías fuera de los diálogos\"\n\n#. Key:\tsettings_pause_game_idle\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Game settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Pause game when idle\"\nmsgstr \"Pausa el juego cuando está inactivo\"\n\n#. Key:\tsettings_pause_game_idle_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Game settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Pauses the game when the user is idle for a certain amount of minutes\"\nmsgstr \"Pausa el juego cuando el usuario está inactivo durante una determinada cantidad de minutos\"\n\n#. Key:\tsettings_pause_game_unfocused\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Game settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Pause game when unfocused\"\nmsgstr \"Pausa el juego cuando está desenfocado\"\n\n#. Key:\tsettings_pause_game_unfocused_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Game settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Pauses the game when the game loses focus\"\nmsgstr \"Pausa el juego cuando el juego pierde el foco\"\n\n#. Key:\tsettings_post_effects\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Post-Effects\"\nmsgstr \"Efectos posteriores\"\n\n#. Key:\tsettings_post_effects_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Affects the quality of the post process effects after the scene is rendered.\"\nmsgstr \"Afecta la calidad de los efectos posteriores al proceso una vez que se renderiza la escena.\"\n\n#. Key:\tsettings_quality_epic\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings quality\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Epic\"\nmsgstr \"Epico\"\n\n#. Key:\tsettings_quality_high\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings quality\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"High\"\nmsgstr \"Alto\"\n\n#. Key:\tsettings_quality_low\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings quality\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Low\"\nmsgstr \"Bajo\"\n\n#. Key:\tsettings_quality_medium\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings quality\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Medium\"\nmsgstr \"Mediano\"\n\n#. Key:\tsettings_ratio_16_10\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings Aspect Ratio\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"16:10\"\nmsgstr \"16:10\"\n\n#. Key:\tsettings_ratio_16_9\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings Aspect Ratio\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"16:9\"\nmsgstr \"16:9\"\n\n#. Key:\tsettings_ratio_4_3\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings Aspect Ratio\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"4:3\"\nmsgstr \"4:3\"\n\n#. Key:\tsettings_reset\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Reset\"\nmsgstr \"Reiniciar\"\n\n#. Key:\tsettings_reset_default\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Settings reset to default\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Reset to Defaults\"\nmsgstr \"Reestablecer los Valores por Defecto\"\n\n#. Key:\tsettings_reset_input_key\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input reset key to default\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Reset button to default\"\nmsgstr \"Restablecer el botón a los valores predeterminados\"\n\n#. Key:\tsettings_resolution\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Resolution\"\nmsgstr \"Resolución\"\n\n#. Key:\tsettings_resolution_entry\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings. {0} - x, {1} - Y\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"{0}x{1}\"\nmsgstr \"{0}x{1}\"\n\n#. Key:\tsettings_resolution_scale\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Resolution Scale\"\nmsgstr \"Escala de Resolución\"\n\n#. Key:\tsettings_resolution_scale_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"The desired resolution to use when rendering the game. It does not affect the UI.\\nLowering it improves performance on lower end machines.\"\nmsgstr \"La resolución deseada para usar al renderizar el juego. No afecta a la interfaz de usuario.\\nBajarlo mejora el rendimiento en ordenadores de gama baja.\"\n\n#. Key:\tsettings_resolution_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Allows changing the Screen Resolution.\"\nmsgstr \"Permite cambiar la resolución de la pantalla.\"\n\n#. Key:\tsettings_select_another\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Settings input\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Select another\"\nmsgstr \"Seleccione otro\"\n\n#. Key:\tsettings_shadows\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Shadow Quality\"\nmsgstr \"Calidad de Sombra\"\n\n#. Key:\tsettings_shadows_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"The higher the quality the finer the shadow.\"\nmsgstr \"Cuanto mayor sea la calidad, más detallada será la sombra.\"\n\n#. Key:\tsettings_textures\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Texture Quality\"\nmsgstr \"Calidad de Textura\"\n\n#. Key:\tsettings_textures_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Surfaces of the game world will increase in fidelity if the setting is higher.\"\nmsgstr \"Las superficies del mundo del juego aumentarán en fidelidad si la configuración es más alta.\"\n\n#. Key:\tsettings_unknown\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Unknown\"\nmsgstr \"Desconocido\"\n\n#. Key:\tsettings_volumetric_fog\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Volumetric Fog\"\nmsgstr \"Niebla Volumétrica\"\n\n#. Key:\tsettings_volumetric_fog_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Realistic looking fog. Has a high performance impact, disable it to improve performance.\"\nmsgstr \"Niebla de aspecto realista. Tiene un alto impacto en el rendimiento, desactívelo para mejorar el rendimiento.\"\n\n#. Key:\tsettings_vsync\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Vertical Sync\"\nmsgstr \"Sincronización Vertical\"\n\n#. Key:\tsettings_vsync_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Synchronize the game refresh rate with the monitor refresh rate. Disable it for higher framerate and better input response.\\nWhen enabled it prevents screen tearing.\"\nmsgstr \"Sincronice la frecuencia de actualización del juego con la frecuencia de actualización del monitor. Inhabilítelo para obtener una mayor velocidad de cuadros y una mejor respuesta de entrada.\\nCuando está habilitado, evita el desgarro de la pantalla.\"\n\n#. Key:\tsettings_windowed\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Windowed\"\nmsgstr \"Ventana\"\n\n#. Key:\tskip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"text near the press and hold to skip confirmation button\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Skip\"\nmsgstr \"Omitir\"\n\n#. Key:\tspell_cast_switch_controls\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Quick select spells up/down/left/right\"\nmsgstr \"Selección rápida de hechizos arriba/abajo/izquierda/derecha\"\n\n#. Key:\tspell_cast_switch_select_cast\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Select & Cast\"\nmsgstr \"Seleccionar y Lanzar\"\n\n#. Key:\tspell_cooldown_stops_in_air\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Spell\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Cooldown only starts on ground\"\nmsgstr \"El enfriamiento solo comienza en el suelo\"\n\n#. Key:\tspell_only_in_air\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Spell\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Can not be used in air\"\nmsgstr \"No se puede usar en el aire\"\n\n#. Key:\tspell_restricted\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Spell\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Can not be used in restricted areas\"\nmsgstr \"No se puede usar en áreas restringidas\"\n\n#. Key:\tstart\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"The name of the checkpoint. Custom Map action\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Start\"\nmsgstr \"Inicio\"\n\n#. Key:\tstart_game\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Menu Start Game\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Start Game\"\nmsgstr \"Empezar juego\"\n\n#. Key:\tstats_usage_description\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Analytics popup\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Not Yet would like to collect usage statistics from your game automatically.\\nThese are not used to identify individuals, but help us to understand players needs to improve our game.\\n\\nSelect \\\"Send Automatically\\\" to allow collection of usage statistics,\\nor \\\"Do Not Send\\\" to prevent the game from sending information to Not Yet.\\n\\nYou can change this setting at any time via the Settings Game tab.\"\nmsgstr \"Not Yet quisiera recopilar estadísticas de uso de su juego automáticamente.\\nNo se utilizan para identificar individuos, pero nos ayudan a comprender las necesidades de los jugadores para mejorar nuestro juego.\\n\\nSeleccione \\\"Enviar automáticamente\\\" para permitir la recopilación de estadísticas de uso,\\no \\\"No enviar\\\" para evitar que el juego envíe información a Not Yet.\\n\\nPuede cambiar esta configuración en cualquier momento a través de la pestaña Configuración del juego.\"\n\n#. Key:\tstats_usage_title\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Analytics popup\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Usage Statistics\"\nmsgstr \"Estadísticas de uso\"\n\n#. Key:\tstatus\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Status of a save/custom map\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Status\"\nmsgstr \"Estado\"\n\n#. Key:\tsteam_main_game\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Wishlist\"\nmsgstr \"Lista de deseados\"\n\n#. Key:\tsteam_main_game_buy\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Buy Full Game\"\nmsgstr \"Compra el juego completo\"\n\n#. Key:\tSwitch_FaceButton_Bottom\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"B Button\"\nmsgstr \"botón B\"\n\n#. Key:\tSwitch_FaceButton_Left\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Y Button\"\nmsgstr \"botón Y\"\n\n#. Key:\tSwitch_FaceButton_Right\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"A Button\"\nmsgstr \"botón A\"\n\n#. Key:\tSwitch_FaceButton_Top\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"X Button\"\nmsgstr \"botón X\"\n\n#. Key:\tSwitch_Gamepad_LeftStick_Down\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \" Switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Left Stick Down\"\nmsgstr \"palanca izquierda - abajo\"\n\n#. Key:\tSwitch_Gamepad_LeftStick_Left\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \" Switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Left Stick Left\"\nmsgstr \"palanca izquierda - izquierda\"\n\n#. Key:\tSwitch_Gamepad_LeftStick_Right\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \" Switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Left Stick Right\"\nmsgstr \"palanca izquierda - derecha\"\n\n#. Key:\tSwitch_Gamepad_LeftStick_Up\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \" Switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Left Stick Up\"\nmsgstr \"palanca izquierda - arriba\"\n\n#. Key:\tSwitch_Gamepad_RightStick_Down\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \" Switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Right Stick Down\"\nmsgstr \"palanca derecha - abajo\"\n\n#. Key:\tSwitch_Gamepad_RightStick_Left\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \" Switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Right Stick Left\"\nmsgstr \"palanca derecha - izquierda\"\n\n#. Key:\tSwitch_Gamepad_RightStick_Right\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \" Switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Right Stick Right\"\nmsgstr \"palanca derecha - derecha\"\n\n#. Key:\tSwitch_Gamepad_RightStick_Up\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \" Switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Right Stick Up\"\nmsgstr \"palanca derecha - arriba\"\n\n#. Key:\tSwitch_LeftThumbstick\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \" Switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Left Stick\"\nmsgstr \"palanca izquierda\"\n\n#. Key:\tSwitch_RightThumbstick\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \" Switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Right Stick\"\nmsgstr \"palanca derecha\"\n\n#. Key:\tSwitch_Shoulder_Left\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"L Button\"\nmsgstr \"botón L\"\n\n#. Key:\tSwitch_Shoulder_Right\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"R Button\"\nmsgstr \"botón R\"\n\n#. Key:\tSwitch_special_dpad_down\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \" Switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Down Button\"\nmsgstr \"botón abajo\"\n\n#. Key:\tSwitch_special_dpad_left\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \" Switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Left Button\"\nmsgstr \"botón izquierda\"\n\n#. Key:\tSwitch_special_dpad_right\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \" Switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Right Button\"\nmsgstr \"botón derecha\"\n\n#. Key:\tSwitch_special_dpad_up\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \" Switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Up Button\"\nmsgstr \"botón arriba\"\n\n#. Key:\tSwitch_special_left\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"- Button\"\nmsgstr \"botón -\"\n\n#. Key:\tSwitch_special_right\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"+ Button\"\nmsgstr \"botón +\"\n\n#. Key:\tSwitch_Trigger_Left\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"ZL Button\"\nmsgstr \"botón ZL\"\n\n#. Key:\tSwitch_Trigger_Right\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"ZR Button\"\nmsgstr \"botón ZR\"\n\n#. Key:\tteleport_to_cp\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Menu Teleport To Checkpoint\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Teleport To Checkpoint\"\nmsgstr \"Teletransportarse al punto de control\"\n\n#. Key:\tteleport_to_sk\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Menu Teleport to Soulkeeper\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Teleport To SoulKeeper\"\nmsgstr \"Teletransporte al Guardián de Almas\"\n\n#. Key:\tthank_you_prologue\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"THANK YOU FOR PLAYING WARRIORB DEMO PROLOGUE, WE HOPE YOU HAD A GREAT TIME!\"\nmsgstr \"¡GRACIAS POR JUGAR EL PRÓLOGO DE WARRIORB, ESPERAMOS QUE LO HAYAS PASADO BIEN!\"\n\n#. Key:\ttotal_deaths\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Stats for saves\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Total Deaths\"\nmsgstr \"Muertes Totales\"\n\n#. Key:\ttrade_amount_x_x\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"trade confirmation UI. {0} is the current amount and {1} is the current amount times price per item\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"{0} for {1} gold\"\nmsgstr \"{0} por {1} oro\"\n\n#. Key:\ttrade_buy\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"trade confirmation UI\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Are you sure you want to buy {ItemName} for {Gold} gold?\"\nmsgstr \"¿Estás seguro de que quieres comprar {ItemName} por {Gold} oro?\"\n\n#. Key:\ttrade_buy_back\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"trade confirmation UI\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Are you sure you want to buy back {ItemName} for {Gold} gold?\"\nmsgstr \"¿Está seguro de que desea volver a comprar {ItemName} por {Gold} oro?\"\n\n#. Key:\ttrade_no_intrested\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"trade confirmation UI\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"The trader is not interested in buying that item from you!\"\nmsgstr \"¡El comerciante no está interesado en comprarle ese artículo!\"\n\n#. Key:\ttrade_nope\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"trade confirmation UI\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Nope!\"\nmsgstr \"No!\"\n\n#. Key:\ttrade_okay\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"trade confirmation UI\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Okay...\"\nmsgstr \"Okey...\"\n\n#. Key:\ttrade_sell\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"trade confirmation UI\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Are you sure you want to sell {ItemName} for {Gold} gold?\"\nmsgstr \"¿Estás seguro de que quieres vender {ItemName} por {Gold} oro?\"\n\n#. Key:\ttwitter\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Twitter\"\nmsgstr \"Twitter\"\n\n#. Key:\tunknown\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Unknown input binding\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"UNKNOWN\"\nmsgstr \"DESCONOCIDO\"\n\n#. Key:\twarriorb\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"WarriOrb\"\nmsgstr \"Warriorb\"\n\n#. Key:\txp\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Experience Points\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"XP\"\nmsgstr \"XP\"\n\n#. Key:\tyes\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Confirm popup\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Yes\"\nmsgstr \"Sí\"\n\n"
  },
  {
    "path": "Content/Localization/WarriorbDemo/fr/WarriorbDemo.po",
    "content": "﻿# WarriorbDemo French translation.\n# Copyright 1998-2019 Epic Games, Inc. All Rights Reserved.\n# \nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: WarriorbDemo\\n\"\n\"POT-Creation-Date: 2020-10-07 08:08\\n\"\n\"PO-Revision-Date: 2020-10-07 08:08\\n\"\n\"Language-Team: \\n\"\n\"Language: fr\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Plural-Forms: nplurals=2; plural=(n > 1);\\n\"\n\n#. Key:\tact1_loading\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"You are a Mighty Spirit from the Unknown Realm. You were torn away from your home by a pathetic mortal Wizard. After a magical accident your essence is bound to an unlikely body. Find a way out of your ball-body prison!\"\nmsgstr \"Vous êtes un Esprit Puissant du Royaume Inconnu. Vous avez été arraché de votre foyer par un pathétique Magicien mortel. Après un accident magique, votre essence est liée à un corps improbable. Trouvez un moyen de sortir de votre prison qu'est ce corps de boule !\"\n\n#. Key:\tact2_loading\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Reaching Crossroad Cave you are a step closer to the Three Artifacts - and to freedom.\"\nmsgstr \"En atteignant la Grotte du Croisement, vous vous rapprochez des Trois Artefacts - et de la liberté.\"\n\n#. Key:\tact3_loading\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Finding the Three Artifacts required all your skills and strength. You hope that delivering them to the Wizard will be less difficult.\"\nmsgstr \"Trouver les Trois Artefacts a nécessité toutes vos compétences et votre force. Espérons que les remettre au Magicien sera moins difficile.\"\n\n#. Key:\tact_1\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"text displayed on black screen the first time a chapter is started\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Act I\"\nmsgstr \"Acte I\"\n\n#. Key:\tact_2\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"text displayed on black screen the first time a chapter is started\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Act II\"\nmsgstr \"Acte II\"\n\n#. Key:\tact_3\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"text displayed on black screen the first time a chapter is started\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Act III\"\nmsgstr \"Acte III\"\n\n#. Key:\tancient_arcade\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an area\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Ancient Arcade\"\nmsgstr \"Ancienne Arcade\"\n\n#. Key:\tbubble_border\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an area\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Bubble Border\"\nmsgstr \"Bulle de Bordure\"\n\n#. Key:\tcerulean_city\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an area\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Cerulean City\"\nmsgstr \"Ville Céruléenne\"\n\n#. Key:\tchasm_chamber\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an area\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Chasm Chamber\"\nmsgstr \"Chambre du Gouffre\"\n\n#. Key:\tcrossroad_cave\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an area\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Crossroad Cave\"\nmsgstr \"Grotte du Croisement\"\n\n#. Key:\tdarkest_dungeon\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an area\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Darkest Dungeon\"\nmsgstr \"Sombre Donjon\"\n\n#. Key:\tdwarven_dungeons\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an area\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Dwarven Dungeons\"\nmsgstr \"Donjon des Nains\"\n\n#. Key:\tending_loading\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Finally! You did your part of the deal, now it's the Wizard's turn to get you back home.\"\nmsgstr \"Enfin ! Vous avez fait votre part du marché, maintenant c'est au tour du Sorcier de vous ramener chez vous.\"\n\n#. Key:\tepilogue\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"text displayed on black screen the first time a chapter is started\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Epilogue\"\nmsgstr \"Epilogue\"\n\n#. Key:\tgrey_gate\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an area\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Grey Gate\"\nmsgstr \"Porte Grise\"\n\n#. Key:\thallowed_heart\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an area, Hallowed as in made holy; consecrated.\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Hallowed Heart\"\nmsgstr \"Coeur sacré\"\n\n#. Key:\tintro_subtitle_0\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" intro subtitle line 1\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"I wish I could just... turn back time to undo what I have done.\"\nmsgstr \"J'aimerais pouvoir... remonter le temps pour défaire ce que j'ai fait.\"\n\n#. Key:\tintro_subtitle_1\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" intro subtitle line 01\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"However the past is behind us\"\nmsgstr \"Mais le passé est derrière nous\"\n\n#. Key:\tintro_subtitle_2\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" intro subtitle line 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"and all I can change now\"\nmsgstr \"et tout ce que je peux changer\"\n\n#. Key:\tintro_subtitle_3\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" intro subtitle line 3\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"is the future.\"\nmsgstr \"c'est le futur.\"\n\n#. Key:\tlast_land\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an area\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Last Land\"\nmsgstr \"Dernière Terre\"\n\n#. Key:\tlava_lair\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an area\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Lava Lair\"\nmsgstr \"Zone de Lave\"\n\n#. Key:\tloading_tip_act1_0\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 1\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"In Ball form you go faster.\"\nmsgstr \"En forme de balle, vous allez plus vite.\"\n\n#. Key:\tloading_tip_act1_1\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 1\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"In Ball form you bounce back when you hit a surface.\"\nmsgstr \"En forme de balle, vous rebondissez lorsque vous touchez une surface.\"\n\n#. Key:\tloading_tip_act1_2\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 1\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Each weapon has its own unique special strike.\"\nmsgstr \"Chaque arme a son propre coup spécial unique.\"\n\n#. Key:\tloading_tip_act1_3\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 1\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Most of the people died after Ruin happened, but there are still some survivors.\"\nmsgstr \"La plupart des personnes sont mortes après la Ruine, mais il y a encore quelques survivants.\"\n\n#. Key:\tloading_tip_act1_4\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 1\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Some items can’t be used but merchants still like to buy them.\"\nmsgstr \"Certains articles ne peuvent pas être utilisés, mais les commerçants aiment toujours les acheter.\"\n\n#. Key:\tloading_tip_act1_5\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 1\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"There are many keys, and when I say many, I mean it.\"\nmsgstr \"Il y a beaucoup de clés, et quand je dis beaucoup, je le pense.\"\n\n#. Key:\tloading_tip_act1_6\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 1\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"When you find an item it would make sense to check what it is, wouldn’t it?\"\nmsgstr \"Lorsque vous trouvez un objet, il est logique de vérifier ce que c'est, n'est-ce pas ?\"\n\n#. Key:\tloading_tip_act1_7\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 1\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Spells can make combat easier.\"\nmsgstr \"Les sorts peuvent rendre plus facile un combat.\"\n\n#. Key:\tloading_tip_act1_8\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 1\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Dying often is absolutely normal. If you don’t die a lot, you are doing something wrong.\"\nmsgstr \"Il est tout à fait normal de mourir souvent. Si vous ne mourez pas souvent, c'est que quelque chose ne va pas.\"\n\n#. Key:\tloading_tip_act1_9\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 1\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"You can always check the Sidenotes in your Inventory to see if you have any side quests.\"\nmsgstr \"Vous pouvez toujours vérifier les Notes dans votre inventaire pour voir si vous avez des quêtes secondaires.\"\n\n#. Key:\tloading_tip_act2_0\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Using the Railway can shorten your journey.\"\nmsgstr \"Utiliser le Chemin de Fer peut raccourcir votre voyage.\"\n\n#. Key:\tloading_tip_act2_1\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"We’ll try to make our next game without any loading screens, we promise...\"\nmsgstr \"Nous essaierons de réaliser notre prochain jeu sans les écrans de chargement, promis...\"\n\n#. Key:\tloading_tip_act2_2\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Choosing the right weapon against a Boss will make your life easier.\"\nmsgstr \"Choisir la bonne arme contre un Boss vous facilitera la vie.\"\n\n#. Key:\tloading_tip_act2_3\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Don’t forget to use the Soulkeeper!\"\nmsgstr \"N'oubliez pas d'utiliser le Gardien des Âmes !\"\n\n#. Key:\tloading_tip_act2_4\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Finding the Artefacts might be hard, but this is your only chance to get out.\"\nmsgstr \"Trouver les Artefacts peut être difficile, mais c'est votre seule chance de vous en sortir.\"\n\n#. Key:\tloading_tip_act2_5\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Talk to any Survivor if you can. They might be able to help you.\"\nmsgstr \"Parlez à n'importe quel Survivant si vous le pouvez. Ils pourront peut-être vous aider.\"\n\n#. Key:\tloading_tip_act2_6\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"If you find an area too difficult you can always go to another area first.\"\nmsgstr \"Si vous trouvez une zone trop difficile, vous pouvez toujours vous rendre d'abord dans une autre zone.\"\n\n#. Key:\tloading_tip_act2_7\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Don’t forget to spend your gold! (Ad sponsored by Gnory)\"\nmsgstr \"N'oubliez pas de dépenser votre or ! (Publicité sponsorisée par Gnory)\"\n\n#. Key:\tloading_tip_act2_8\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Equipping the right items will make the combat easier.\"\nmsgstr \"L'équipement adéquat permettra de faciliter le combat.\"\n\n#. Key:\tloading_tip_act2_9\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"If you manage to defeat every member of a group you won’t have to fight them ever again.\"\nmsgstr \"Si vous parvenez à vaincre tous les membres d'un groupe, vous n'aurez plus jamais à les combattre.\"\n\n#. Key:\tloading_tip_act3_0\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 3\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Using the Railway can also make your Journey longer.\"\nmsgstr \"L'utilisation du Chemin de Fer peut également prolonger votre voyage.\"\n\n#. Key:\tloading_tip_act3_1\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 3\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"If you got this far, you surely know everything now.\"\nmsgstr \"Si vous êtes arrivé jusqu'ici, vous savez sûrement tout maintenant.\"\n\n#. Key:\tloading_tip_act3_2\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 3\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Loading screen tips are very useful - except in a few cases.\"\nmsgstr \"Les conseils des écrans de chargement sont très utiles - sauf dans quelques cas.\"\n\n#. Key:\tloading_tip_act3_3\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 3\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Now is your time to think about the fate of the Ruined Realm.\"\nmsgstr \"Le moment est venu de réfléchir au sort du Royaume en Ruines.\"\n\n#. Key:\tloading_tip_act3_4\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 3\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"The End is near... I mean no loading screen can take forever, right?\"\nmsgstr \"La Fin est proche... Je veux dire qu'aucun écran de chargement ne peut prendre une éternité, non ?\"\n\n#. Key:\tloading_tip_act3_5\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 3\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Now your only task is to bring the Artefacts to Wizard.\"\nmsgstr \"Maintenant, votre seule tâche est d'apporter les Artefacts au Magicien.\"\n\n#. Key:\tloading_tip_act3_6\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 3\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"If you find a combat too hard try to use different shards, spells, and weapons.\"\nmsgstr \"Si vous trouvez un combat trop difficile, essayez d'utiliser des fragments, des sorts et des armes différentes.\"\n\n#. Key:\tloading_tip_act3_7\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 3\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Don’t give up! Victory is close.\"\nmsgstr \"N'abandonnez pas ! La victoire est proche.\"\n\n#. Key:\tloading_tip_end_0\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for epilogue\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"The Human Realm is a weird place...\"\nmsgstr \"Le Royaume de l'Homme est un endroit bizarre...\"\n\n#. Key:\tloading_tip_end_1\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for epilogue\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"You really did your part of the deal, now it’s time to go home!\"\nmsgstr \"Vous avez vraiment fait votre part du marché, maintenant il est temps de rentrer chez vous !\"\n\n#. Key:\tloading_tip_end_2\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for epilogue\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Should you care about the fate of the Realms?\"\nmsgstr \"Devriez-vous vous préoccuper du sort des Royaumes ?\"\n\n#. Key:\tloading_tip_end_3\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for epilogue\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Looks like it’s always you who has to take care of the mess others left behind.\"\nmsgstr \"On dirait que c'est toujours vous qui devez vous occuper du désordre que les autres ont laissé derrière eux.\"\n\n#. Key:\tloading_tip_end_4\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for epilogue\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Time to finish what you started. One way or another.\"\nmsgstr \"Il est temps de finir ce que vous avez commencé. D'une manière ou d'une autre.\"\n\n#. Key:\tlost_land\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an area\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Lost Land\"\nmsgstr \"Terre Perdue\"\n\n#. Key:\tobedient_outpost\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an area\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Obedient Outpost\"\nmsgstr \"Avant-Poste des Obédiences\"\n\n#. Key:\tperfect_palace\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an area\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Perfect Palace\"\nmsgstr \"Palace Parfait\"\n\n#. Key:\tportal_place\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an area\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Portal Place\"\nmsgstr \"Place du Portail\"\n\n#. Key:\tprogress_act1_arcade1\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Remnants of a Realm\"\nmsgstr \"Vestiges d'un Royaume\"\n\n#. Key:\tprogress_act1_arcade2\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Discovering Ancient Technology\"\nmsgstr \"Découvrir la Technologie Ancienne\"\n\n#. Key:\tprogress_act1_before_raven\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Searching for a way out\"\nmsgstr \"À la recherche d'une issue\"\n\n#. Key:\tprogress_act1_boss_fight\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Facing the Keeper\"\nmsgstr \"Face au Gardien\"\n\n#. Key:\tprogress_act1_gem\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Looking for a Gem\"\nmsgstr \"A la recherche d'une Gemme\"\n\n#. Key:\tprogress_act1_infuse\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Infusing the Gem\"\nmsgstr \"Infuser la Gemme\"\n\n#. Key:\tprogress_act1_portals\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Looking for a Portal\"\nmsgstr \"À la recherche d'un Portail\"\n\n#. Key:\tprogress_act1_start\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Lost in Ruin\"\nmsgstr \"Perdu dans les Ruines\"\n\n#. Key:\tprogress_act1_test_stone\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Bouncing Stones\"\nmsgstr \"Pierres Rebondissantes\"\n\n#. Key:\tprogress_act1_tut1\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Am I Worthy?\"\nmsgstr \"Suis-Je Digne ?\"\n\n#. Key:\tprogress_act1_tut2\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Sewer again\"\nmsgstr \"Encore des égouts\"\n\n#. Key:\tprogress_act1_tut3\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Third time Worthy\"\nmsgstr \"Troisième fois Digne\"\n\n#. Key:\tprogress_act2_crossroad\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"At a crossroad\"\nmsgstr \"A la croisée des chemins\"\n\n#. Key:\tprogress_act2_dwarf_0\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Into the Blue\"\nmsgstr \"Dans le Bleu\"\n\n#. Key:\tprogress_act2_dwarf_1\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Elevator Gem and Key\"\nmsgstr \"Gemme et Clé de l'ascenseur\"\n\n#. Key:\tprogress_act2_dwarf_2\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Opening the Gate\"\nmsgstr \"Ouvrir la Porte\"\n\n#. Key:\tprogress_act2_dwarf_boss\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Dwarven Statue\"\nmsgstr \"Statue Naine\"\n\n#. Key:\tprogress_act2_end\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"To the Fourth Station\"\nmsgstr \"Vers la Quatrième Station\"\n\n#. Key:\tprogress_act2_lava_0\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Into the Red\"\nmsgstr \"Dans le Rouge\"\n\n#. Key:\tprogress_act2_lava_1\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Uniting Key Pieces\"\nmsgstr \"Unir les Pièces Clés\"\n\n#. Key:\tprogress_act2_lava_2\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Climbing the Tower\"\nmsgstr \"Escalader la Tour\"\n\n#. Key:\tprogress_act2_lava_boss\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Armour Wrath\"\nmsgstr \"Armure de Colère\"\n\n#. Key:\tprogress_act2_ww_0\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Into the Green\"\nmsgstr \"Dans le Vert\"\n\n#. Key:\tprogress_act2_ww_1\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Through the Lake\"\nmsgstr \"À travers le lac\"\n\n#. Key:\tprogress_act2_ww_2\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Being Followed\"\nmsgstr \"Être suivi\"\n\n#. Key:\tprogress_act2_ww_boss\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Fallen Druid\"\nmsgstr \"Druide Déchu\"\n\n#. Key:\tprogress_act3_floating\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in act 3\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Floating\"\nmsgstr \"Flottant\"\n\n#. Key:\tprogress_act3_monk\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in act 3\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Monk's Home\"\nmsgstr \"Maison du Moine\"\n\n#. Key:\tprogress_act3_pipes\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in act 3\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Moving Pipes\"\nmsgstr \"Déplacer les Tuyaux\"\n\n#. Key:\tprogress_act3_start\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in act 3\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Lost in the Caves\"\nmsgstr \"Perdu dans les Grottes\"\n\n#. Key:\tprogress_act3_way_out\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in act 3\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Way out of the Realm\"\nmsgstr \"Sortir du Royaume\"\n\n#. Key:\tprogress_epilogue_boss\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in epilogue\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"The Real Demon\"\nmsgstr \"Le Vrai Démon\"\n\n#. Key:\tprogress_epilogue_castle\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in epilogue\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Wizard's Castle\"\nmsgstr \"Le Château du Sorcier\"\n\n#. Key:\tprogress_epilogue_past_and_future\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in epilogue\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Past and Future\"\nmsgstr \"Passé et Futur\"\n\n#. Key:\tprogress_epilogue_save_creatures\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in epilogue\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Chance for everyone\"\nmsgstr \"Tout le monde a sa chance\"\n\n#. Key:\tprogress_epilogue_separate_worlds\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in epilogue\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Separated Worlds\"\nmsgstr \"Mondes Séparés\"\n\n#. Key:\tprologue\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"text displayed on black screen the first time a chapter is started\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Prologue\"\nmsgstr \"Prologue\"\n\n#. Key:\tremnant_road\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an area\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Remnant Road\"\nmsgstr \"Ce qu'il reste de la Route\"\n\n#. Key:\truined_realm\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Ruined Realm\"\nmsgstr \"Royaume en Ruines\"\n\n#. Key:\tsnake_slide\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an area\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Snake Slide\"\nmsgstr \"Mouvement de Serpent\"\n\n#. Key:\tsunken_sewer\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an area\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Sunken Sewer\"\nmsgstr \"Égouts Submergés\"\n\n#. Key:\twhite_wall\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"White Wall\"\nmsgstr \"Mur Blanc\"\n\n#. Key:\twracked_waters\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an area\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Wracked Waters\"\nmsgstr \"En Eaux Troubles\"\n\n#. Key:\tcredits_fmod\n#. SourceLocation:\tLocalization/StringTables/Credits.csv\n#: Localization/StringTables/Credits.csv\nmsgctxt \"Credits\"\nmsgid \"Made with FMOD Studio by Firelight Technologies Pty Ltd.\"\nmsgstr \"Créé via FMOD Studio de Firelight Technologies Pty Ltd.\"\n\n#. Key:\tMonthApril\n#. SourceLocation:\tSource/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:17\n#: Source/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:17\nmsgctxt \"DateTimeHelper\"\nmsgid \"April\"\nmsgstr \"Avril\"\n\n#. Key:\tMonthAugust\n#. SourceLocation:\tSource/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:21\n#: Source/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:21\nmsgctxt \"DateTimeHelper\"\nmsgid \"August\"\nmsgstr \"Août\"\n\n#. Key:\tMonthDecember\n#. SourceLocation:\tSource/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:26\n#: Source/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:26\nmsgctxt \"DateTimeHelper\"\nmsgid \"December\"\nmsgstr \"Décembre\"\n\n#. Key:\tMonthFebruary\n#. SourceLocation:\tSource/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:15\n#: Source/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:15\nmsgctxt \"DateTimeHelper\"\nmsgid \"February\"\nmsgstr \"Février\"\n\n#. Key:\tMonthJanuary\n#. SourceLocation:\tSource/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:14\n#: Source/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:14\nmsgctxt \"DateTimeHelper\"\nmsgid \"January\"\nmsgstr \"Janvier\"\n\n#. Key:\tMonthJuly\n#. SourceLocation:\tSource/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:20\n#: Source/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:20\nmsgctxt \"DateTimeHelper\"\nmsgid \"July\"\nmsgstr \"Juillet\"\n\n#. Key:\tMonthJune\n#. SourceLocation:\tSource/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:19\n#: Source/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:19\nmsgctxt \"DateTimeHelper\"\nmsgid \"June\"\nmsgstr \"Juin\"\n\n#. Key:\tMonthMarch\n#. SourceLocation:\tSource/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:16\n#: Source/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:16\nmsgctxt \"DateTimeHelper\"\nmsgid \"March\"\nmsgstr \"Mars\"\n\n#. Key:\tMonthMay\n#. SourceLocation:\tSource/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:18\n#: Source/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:18\nmsgctxt \"DateTimeHelper\"\nmsgid \"May\"\nmsgstr \"Mai\"\n\n#. Key:\tMonthNovember\n#. SourceLocation:\tSource/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:24\n#: Source/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:24\nmsgctxt \"DateTimeHelper\"\nmsgid \"November\"\nmsgstr \"Novembre\"\n\n#. Key:\tMonthOctober\n#. SourceLocation:\tSource/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:23\n#: Source/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:23\nmsgctxt \"DateTimeHelper\"\nmsgid \"October\"\nmsgstr \"Octobre\"\n\n#. Key:\tMonthSeptember\n#. SourceLocation:\tSource/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:22\n#: Source/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:22\nmsgctxt \"DateTimeHelper\"\nmsgid \"September\"\nmsgstr \"Septembre\"\n\n#. Key:\tSecondsToTime\n#. SourceLocation:\tSource/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:48\n#: Source/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:48\nmsgctxt \"DateTimeHelper\"\nmsgid \"{Minutes}:{Seconds}\"\nmsgstr \"{Minutes}:{Seconds}\"\n\n#. Key:\tSecondsToTimeMinusSeconds\n#. SourceLocation:\tSource/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:51\n#: Source/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:51\nmsgctxt \"DateTimeHelper\"\nmsgid \"{Hours}:{Minutes}:{Seconds}\"\nmsgstr \"{Hours}:{Minutes}:{Seconds}\"\n\n#. Key:\tchar_name_ball_e\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"possible display name for character\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"BALL-E\"\nmsgstr \"BALL-E\"\n\n#. Key:\tchar_name_destroyer\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"possible display name for character\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Destroyer\"\nmsgstr \"Destructeur\"\n\n#. Key:\tchar_name_dont_buy\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"possible display name for character\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Don't buy\"\nmsgstr \"N'achetez pas\"\n\n#. Key:\tchar_name_dr_ball\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"possible display name for character\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Dr. Ball\"\nmsgstr \"Dr. Balle\"\n\n#. Key:\tchar_name_epic_sphero\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"possible display name for character\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Epic Sphero\"\nmsgstr \"Sphère Épique\"\n\n#. Key:\tchar_name_failed_one\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"possible display name for character\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Failed One\"\nmsgstr \"L'échoué\"\n\n#. Key:\tchar_name_saviour\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"possible display name for character\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Saviour\"\nmsgstr \"Sauveur\"\n\n#. Key:\tchar_name_sorbcerer\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"possible display name for character\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Sorbcerer\"\nmsgstr \"Sorbcier\"\n\n#. Key:\tchar_name_spirit_of_the_unknown\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"possible display name for character\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Spirit Of the Unknown\"\nmsgstr \"L'Esprit de l'Inconnu\"\n\n#. Key:\tchar_name_ultimate_frisbee\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"possible display name for character\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Ultimate Frisbee\"\nmsgstr \"Frisbee Ultime\"\n\n#. Key:\tchar_name_wanderer\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"possible display name for character\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Wanderer\"\nmsgstr \"Vagabond\"\n\n#. Key:\tchar_name_warlorb\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"possible display name for character\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Warlorb\"\nmsgstr \"Warlorb\"\n\n#. Key:\tchar_name_warriorb\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"possible display name for character\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"WarriOrb\"\nmsgstr \"WarriOrb\"\n\n#. Key:\tfinish\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"default option\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Finish\"\nmsgstr \"Terminer\"\n\n#. Key:\tgold_gained\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"{0} Gold Gained\"\nmsgstr \"{0} d'Or Gagné\"\n\n#. Key:\tgold_lost\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"{0} Gold Lost\"\nmsgstr \"{0} d'Or Perdu\"\n\n#. Key:\titem_gained\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"{ItemName} gained!\"\nmsgstr \"{ItemName} obtenu(e) !\"\n\n#. Key:\titem_gained_n\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"{Amount} {ItemName} gained!\"\nmsgstr \"{Amount} {ItemName} obtenu(e) !\"\n\n#. Key:\titem_lost\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"{ItemName} lost!\"\nmsgstr \"{ItemName} perdu(e) !\"\n\n#. Key:\titem_lost_n\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"{Amount} {ItemName} lost!\"\nmsgstr \"{Amount} {ItemName} perdu(e) !\"\n\n#. Key:\tnext\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"default option\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Next\"\nmsgstr \"Suivant\"\n\n#. Key:\tnpc_altar\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"npc if BPLanguage Improver\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Altar\"\nmsgstr \"Autel\"\n\n#. Key:\tnpc_ancient_gate\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an npc\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Ancient Gate\"\nmsgstr \"Ancienne Porte\"\n\n#. Key:\tnpc_demon_lillian\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"name of the final boss\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Demon Lillian\"\nmsgstr \"Le démon Lillian\"\n\n#. Key:\tnpc_dwarven_workshop\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"name of the place the character can have a dialogue to craft a quest item\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Dwarven Workshop\"\nmsgstr \"Atelier Nain\"\n\n#. Key:\tnpc_fishy\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"display name of an npc\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Fishy\"\nmsgstr \"Poisscaille\"\n\n#. Key:\tnpc_fountain\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"display name of a fountain the character can talk with\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Fountain\"\nmsgstr \"Fontaine\"\n\n#. Key:\tnpc_gatekeeper\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an npc\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Gatekeeper\"\nmsgstr \"Gardien de la Porte\"\n\n#. Key:\tnpc_ghost_dwarf\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an npc (actually a ghost of a dwarf)\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Ghost Dwarf\"\nmsgstr \"Nain Fantôme\"\n\n#. Key:\tnpc_gnory\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an npc\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Gnory\"\nmsgstr \"Gnory\"\n\n#. Key:\tnpc_golem_maker\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an npc\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Golem Maker\"\nmsgstr \"Créateur de Golem\"\n\n#. Key:\tnpc_lory\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an npc\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Lory\"\nmsgstr \"Lory\"\n\n#. Key:\tnpc_lory_unkown\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"display name of Lory before she introduces herself\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Gnome Lady\"\nmsgstr \"Femme gnome\"\n\n#. Key:\tnpc_magic_mirror\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an npc\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Magic Mirror\"\nmsgstr \"Miroir Magique\"\n\n#. Key:\tnpc_merchant\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an npc\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Merch Ant\"\nmsgstr \"Fourmi Marchande\"\n\n#. Key:\tnpc_merchant_voice\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"name of a small ant until he says his name (only a voice cause player can not see it)\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Voice\"\nmsgstr \"Voix\"\n\n#. Key:\tnpc_monk\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an npc\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Monk\"\nmsgstr \"Moine\"\n\n#. Key:\tnpc_name_kobold\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Kobold Chef\"\nmsgstr \"Chef Kobold\"\n\n#. Key:\tnpc_pipe_walker\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"display name of some weird creatures\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Pipe Walker\"\nmsgstr \"Tuyauteur\"\n\n#. Key:\tnpc_raven\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an npc (he is actually a bird)\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Raven\"\nmsgstr \"Corbeau\"\n\n#. Key:\tnpc_scholar\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an npc\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Scholar\"\nmsgstr \"Écolier\"\n\n#. Key:\tnpc_secret_hideout\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"display name of a door asking for a password\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Secret Hideout Gate\"\nmsgstr \"Porte secrète\"\n\n#. Key:\tnpc_sewer_creature\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an npc\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Sewer Creature\"\nmsgstr \"Créature des Égouts\"\n\n#. Key:\tnpc_statue\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an npc\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Statue\"\nmsgstr \"Statue\"\n\n#. Key:\tnpc_supper_dwarf\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"display name of an npc. Supper refers here an evening meal, typically a light or informal one.\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Supper Dwarf\"\nmsgstr \"Nain de table\"\n\n#. Key:\tnpc_teachy\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an npc\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Teachy\"\nmsgstr \"Prof\"\n\n#. Key:\tnpc_teachy_unkown\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"name of Teachy before introduction\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Bored Gnome\"\nmsgstr \"Gnome Ennuyé\"\n\n#. Key:\tnpc_tomb\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"display name of a tomb a character can talk to\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Tomb\"\nmsgstr \"Tombe\"\n\n#. Key:\tnpc_unknown_wizard\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"display name of an npc\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Unknown Wizard\"\nmsgstr \"Sorcier Inconnu\"\n\n#. Key:\tnpc_wizard\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"display name of the wizard npc\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Wizard\"\nmsgstr \"Sorcier\"\n\n#. Key:\t022227664F6F422B20B109A19B8789AA\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"I’m glad you are back again!\"\nmsgstr \"Je suis heureux que vous soyez de retour !\"\n\n#. Key:\t0944D8A541F933BEB5DD068CA9099075\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_44.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_44.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"I think I managed to activate the device on the wall of the Portal Tower.\"\nmsgstr \"Je pense que j'ai réussi à activer le dispositif sur le mur de la Tour du Portail.\"\n\n#. Key:\t10ADF4F948FB99445BF791BB0722AD90\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_25.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_25.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Good idea.\"\nmsgstr \"Bonne idée.\"\n\n#. Key:\t137B87BB447D45E46C0425A940E8B7F0\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_46.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_46.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"You said you wouldn't do it...\"\nmsgstr \"Il était question de ne pas le faire...\"\n\n#. Key:\t16358AE840D8B8553E8930A3B7E69BBA\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"You know, sometimes I miss the Pipewalkers...\"\nmsgstr \"Vous savez, parfois les Tuyauteurs me manquent...\"\n\n#. Key:\t1B9834C6405C60960F322585AB0F1704\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_38.Text\n#. Key:\t2189E8064ACF974902FBA49BD12D0F47\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_38.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Could you activate it for me?\"\nmsgstr \"Pourriez-vous l'activer pour moi ?\"\n\n#. Key:\t274EB7AD410061E3E200A9813A54AB29\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"I think I've already done that.\"\nmsgstr \"Je pense que je l'ai déjà fait.\"\n\n#. Key:\t2A57878148EFCC8532E34CAE1B9C9A0F\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"You? I never thought I’ll see you in this shape again.\"\nmsgstr \"Vous ? Je ne pensais pas vous revoir sous cette forme.\"\n\n#. Key:\t3764BB48401ABEDCD125F186B4BF0E17\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"And it also attracts the Pipewalkers.\"\nmsgstr \"Et cela attire aussi les Tuyauteurs.\"\n\n#. Key:\t3A0924F7449355545C0A98B94994616B\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"I want to find my tribe.\"\nmsgstr \"Je veux retrouver ma tribu.\"\n\n#. Key:\t3C0498284D71B7B64FEA4094F42A5502\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_23.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_23.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Do you think you will find Pipewalkers here?\"\nmsgstr \"Pensez-vous que vous trouverez des Tuyauteurs ici ?\"\n\n#. Key:\t3DCACAB047175FB687542AB0CA25D972\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_38.Children(1).Children.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_38.Children(1).Children.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Decline\"\nmsgstr \"Je décline\"\n\n#. Key:\t41C1FCA947041D49247FC8A157D7407F\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_52.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_52.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"All right, thank you.\"\nmsgstr \"Très bien, je vous remercie.\"\n\n#. Key:\t43C8FE9248340E49F1F31882D7B96642\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"If they are still alive they must be beyond that Purple Portal.\"\nmsgstr \"S'ils sont encore en vie, ils doivent être au-delà de ce Portail Violet.\"\n\n#. Key:\t444DD931423A98C7DD95D4BB73F0F1C6\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_39.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_39.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Sure! I’ll see what I can do.\"\nmsgstr \"Bien sûr ! Je vais voir ce que je peux faire.\"\n\n#. Key:\t4FF2FA154BEFBD448EFDB0BB7FE3F0AF\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_11.Children(1).Children.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_11.Children(1).Children.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Tribe\"\nmsgstr \"Tribu\"\n\n#. Key:\t52A8B1F04C37F262E014DEA14AB68957\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Because I’m a chef.\"\nmsgstr \"Parce que je suis un chef.\"\n\n#. Key:\t5F376BF945B8CE4AA12B7EB05F8C62A5\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_11.Children(6).Children.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_11.Children(6).Children.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Leave\"\nmsgstr \"Partez\"\n\n#. Key:\t63EA4DDD45390542E3A904928143D9AF\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Haha... Yes I’m back again.\"\nmsgstr \"Haha... Oui, je suis de retour.\"\n\n#. Key:\t64EE856046A396F2750AE1BC1042CF26\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_30.Text\n#. Key:\tE3F52F4F47289406E4A546BB0BF3AC3F\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_50.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_30.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_50.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Thanks!\"\nmsgstr \"Merci !\"\n\n#. Key:\t694B6E3F4F4C7CEAAACB51A2D30FFD26\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_11.Children(2).Children.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_11.Children(2).Children.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Ruin\"\nmsgstr \"Ruine\"\n\n#. Key:\t7304F1034A83C6D17E274090FA8E543B\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_41.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_41.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Thank you!\"\nmsgstr \"Merci bien !\"\n\n#. Key:\t73240093450B12BEEA1EB78C9CF7D89E\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_11.Children(0).Children.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_11.Children(0).Children.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Purple Portal\"\nmsgstr \"Portail Violet\"\n\n#. Key:\t804671AF40165C92FA6A8F8A5AE97997\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_60.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_60.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Looks like I can’t get rid of this body.\"\nmsgstr \"On dirait que je ne peux pas me débarrasser de ce corps.\"\n\n#. Key:\t807FF1A945548216DAD305B4D5A4437F\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_24.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_24.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"If there are any they will come here when they smell the soup.\"\nmsgstr \"S'il y en a, ils viendront ici quand ils sentiront la soupe.\"\n\n#. Key:\t8240EF7946C8434333AFAEBEF3583917\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_34.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_34.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Do you need help with something?\"\nmsgstr \"Vous avez besoin d'aide pour quelque chose ?\"\n\n#. Key:\t833BB4384231444247779CAB596D0259\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_40.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_40.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"I’m sorry but that sounds complicated.\"\nmsgstr \"Je suis désolé, mais cela semble compliqué.\"\n\n#. Key:\t85656A9E46844B03D49E13AC951FDE07\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_59.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_59.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"See you!\"\nmsgstr \"A bientôt !\"\n\n#. Key:\t869485E24E19938DEE48BFB5C5240BB3\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_29.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_29.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"I’m not sure... but I have a key which might be useful.\"\nmsgstr \"Je ne suis pas sûr... mais j'ai une clé qui pourrait être utile.\"\n\n#. Key:\t86FBA5A24734DD97167512A054A2E0D9\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Oh, it’s you.\"\nmsgstr \"Oh, c'est vous.\"\n\n#. Key:\t891684A24BA64E351E7F0B9ADEA3D6DF\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"No. To be honest I don’t care much about Ruin.\"\nmsgstr \"Non. Pour être honnête, je ne me soucie pas beaucoup de la Ruine.\"\n\n#. Key:\t8FF6BF7B4745BB75C2D8F7873C492C2D\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_11.Children(4).Children.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_11.Children(4).Children.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Can I help?\"\nmsgstr \"Puis-je vous aider ?\"\n\n#. Key:\t93B13014434102C8033B41A06DBED69B\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_11.Children(5).Children.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_11.Children(5).Children.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Tower Device\"\nmsgstr \"Mécanisme de la Tour\"\n\n#. Key:\t95A7C27A44B78CBF17C1FD8C9446CBD7\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Take it! I still need some time to finish the soup anyway.\"\nmsgstr \"Prenez ! J'ai encore besoin de temps pour finir la soupe de toute façon.\"\n\n#. Key:\t97E4FDC74B47A6037D6023A4C65B2934\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_37.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_37.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"If you activate it I’ll be able to use the portal to teleport to other places.\"\nmsgstr \"Si vous l'activez, je pourrai utiliser le portail pour me téléporter vers d'autres endroits.\"\n\n#. Key:\t9FD2679D44BEBBFBBAD2EAAECFFEE0D5\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_42.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_42.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"I can’t promise I’ll do that.\"\nmsgstr \"Je ne peux pas promettre que je le ferai.\"\n\n#. Key:\tAA1C6EF444BAB6A929E953A87BB87ABB\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_56.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_56.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"I've got to go. See you soon!\"\nmsgstr \"Je dois y aller. A bientôt !\"\n\n#. Key:\tAED4FBE3422E0FC4AC4BD38650F95CA9\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_26.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_26.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Thanks.\"\nmsgstr \"Merci.\"\n\n#. Key:\tB0BAD1934671ADCB2DD1E1BA582E3C68\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Why are you making soup?\"\nmsgstr \"Pourquoi faites-vous de la soupe ?\"\n\n#. Key:\tB621AECE42A14A508C945595493F3A3A\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Really? Anyway, I’m happy to see you.\"\nmsgstr \"Vraiment ? En tout cas, je suis content de vous voir.\"\n\n#. Key:\tBA715D554C47932C092462B36ADEA081\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_58.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_58.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Good bye!\"\nmsgstr \"Au revoir !\"\n\n#. Key:\tBE7B3444431F43E8E1487F8702B94845\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_57.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_57.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"It was nice to meet you.\"\nmsgstr \"C'était un plaisir de vous rencontrer.\"\n\n#. Key:\tC1BB24A443D4297B17E2F6A280B02E91\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_36.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_36.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Yes. According to a book I read here there is a device on the wall of the Portal Tower.\"\nmsgstr \"Oui. D'après un livre que j'ai lu ici, il y a un dispositif sur le mur de la Tour du Portail.\"\n\n#. Key:\tC339B87742C2B475E2387F93418AA855\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Have you found out anything about Ruin?\"\nmsgstr \"Avez-vous découvert quelque chose sur la Ruine ?\"\n\n#. Key:\tC4D263AB48B800D5522A24923C541ED3\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_11.Children(3).Children.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_11.Children(3).Children.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Soup\"\nmsgstr \"Soupe\"\n\n#. Key:\tC530096E4FA1A2B68077C3AD6AC1BF44\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_38.Children(0).Children.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_38.Children(0).Children.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Accept Quest\"\nmsgstr \"Accepter la Quête\"\n\n#. Key:\tC82668E6497A810FA6ADC0AB6F362B47\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"The soup is almost ready...\"\nmsgstr \"La soupe est presque prête...\"\n\n#. Key:\tCD8CDA3443CDE79BE257B99A0801B209\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_43.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_43.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"No problem.\"\nmsgstr \"Pas de soucis.\"\n\n#. Key:\tD058108241051A9FD0D130B3C9EA4B8B\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"It helps me keep my mind clear.\"\nmsgstr \"Cela m'aide à garder l'esprit clair.\"\n\n#. Key:\tD8F879684C57BB474E7153B971073663\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_49.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_49.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Meanwhile I cooked something special for you. Take this!\"\nmsgstr \"Pendant ce temps, je vous ai préparé quelque chose de spécial. Prenez ça !\"\n\n#. Key:\tDA9D493F42420BE9442B1EA983AEF9C2\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Any news on your lost tribe?\"\nmsgstr \"Des nouvelles de votre tribu perdue ?\"\n\n#. Key:\tDE2390ED4366A621E4D220A3761333DE\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_54.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_54.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"I need to go now.\"\nmsgstr \"Je dois y aller maintenant.\"\n\n#. Key:\tDE668E4B4A3D0F785A693B9190E635D3\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_47.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_47.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"How on earth have you managed to reach this node?\"\nmsgstr \"Comment diable avez-vous réussi à atteindre ce nœud ?\"\n\n#. Key:\tE29E2D044497A86DD0FCA8B540703597\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_48.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_48.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Pls. report it as a bug.\"\nmsgstr \"Svp. signalez ce bug.\"\n\n#. Key:\tE6D3401944B2FF128DD1689F5159AF96\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_45.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_45.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Nice, well done!\"\nmsgstr \"Bien, bien joué !\"\n\n#. Key:\tE83287164D066CCE8FBFDE835FBD4CFB\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_55.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_55.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"I'm on my way. Take care!\"\nmsgstr \"Je suis en route. Prenez soin de vous !\"\n\n#. Key:\tEBC97F7C45858FE6DC72209536FC5C3B\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_27.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_27.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Do you know how can I reach that Purple Portal?\"\nmsgstr \"Savez-vous comment atteindre ce Portail Violet ?\"\n\n#. Key:\tF911D6CB45AA59448C03379A1C07DD60\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_51.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_51.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"It wasn’t that complicated after all.\"\nmsgstr \"Ce n'était pas si compliqué après tout.\"\n\n#. Key:\tF9EBA1684D435C8AEB14129A7B57A604\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"I think they came here and followed the messages just like you.\"\nmsgstr \"Je pense qu'ils sont venus ici et ont suivi les messages tout comme vous.\"\n\n#. Key:\t3DAA74ED48BE31E35D868FB1492E57A8\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/WW_Pergamen.WW_Pergamen:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/WhiteWall/WW_Pergamen.WW_Pergamen:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_WW_Pergamen\"\nmsgid \"'Ruin took over some of us. It's no longer safe here.'\"\nmsgstr \"'La Ruine a pris le dessus sur certains d'entre nous. Ce n'est plus sûr ici.'\"\n\n#. Key:\tB10818134FFE3A1E99A9D789BFABBBEE\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/WW_Pergamen.WW_Pergamen:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/WhiteWall/WW_Pergamen.WW_Pergamen:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_WW_Pergamen\"\nmsgid \"'Come visit us beyond the Purple Portal!'\"\nmsgstr \"'Venez nous rendre visite au-delà du Portail Violet !'\"\n\n#. Key:\tD292364A4E58F52FB874AA98C1F969A6\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/WW_Pergamen.WW_Pergamen:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/WhiteWall/WW_Pergamen.WW_Pergamen:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_WW_Pergamen\"\nmsgid \"'We are close to the solution, but your help is still needed.'\"\nmsgstr \"'Nous sommes proches de la solution, mais votre aide est toujours nécessaire'\"\n\n#. Key:\t0CD0FD884718EF68B38D578CDE17110A\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/WW_Statue.WW_Statue:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/WhiteWall/WW_Statue.WW_Statue:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_WW_Statue\"\nmsgid \"Oooops...\"\nmsgstr \"Oouups...\"\n\n#. Key:\t2D531D384CB6A56DBC4834BD229622E7\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/WW_Statue.WW_Statue:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/WhiteWall/WW_Statue.WW_Statue:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_WW_Statue\"\nmsgid \"'White Wall will never fall!'\"\nmsgstr \"'Le Mur Blanc ne tombera jamais !'\"\n\n#. Key:\t2690E77045D5E42F32AC6582BAFF27AA\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/WW_StatueWelcome.WW_StatueWelcome:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/WhiteWall/WW_StatueWelcome.WW_StatueWelcome:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_WW_StatueWelcome\"\nmsgid \"'We know how to stop Ruin.'\"\nmsgstr \"'Nous savons comment arrêter la Ruine.'\"\n\n#. Key:\t7C3340434A4C80010AC2D58BF8504339\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/WW_StatueWelcome.WW_StatueWelcome:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/WhiteWall/WW_StatueWelcome.WW_StatueWelcome:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_WW_StatueWelcome\"\nmsgid \"'There is still hope.'\"\nmsgstr \"'Il y a encore de l'espoir.'\"\n\n#. Key:\tarmour_wrath_name\n#. SourceLocation:\tLocalization/StringTables/Enemies.csv\n#. InfoMetaData:\t\"Comment\" : \"display name of an npc boss\"\n#: Localization/StringTables/Enemies.csv\nmsgctxt \"Enemies\"\nmsgid \"Armour Wrath\"\nmsgstr \"Armure de la Colère\"\n\n#. Key:\tdwarf_name\n#. SourceLocation:\tLocalization/StringTables/Enemies.csv\n#. InfoMetaData:\t\"Comment\" : \"display name of an npc boss\"\n#: Localization/StringTables/Enemies.csv\nmsgctxt \"Enemies\"\nmsgid \"Dwarf\"\nmsgstr \"Nain\"\n\n#. Key:\tfallen_druid_name\n#. SourceLocation:\tLocalization/StringTables/Enemies.csv\n#. InfoMetaData:\t\"Comment\" : \"display name of an npc boss\"\n#: Localization/StringTables/Enemies.csv\nmsgctxt \"Enemies\"\nmsgid \"Fallen Druid\"\nmsgstr \"Druide Déchu\"\n\n#. Key:\tdreamhack_completed_desc\n#. SourceLocation:\tLocalization/StringTables/Episodes.csv\n#: Localization/StringTables/Episodes.csv\nmsgctxt \"Episodes\"\nmsgid \"Thanks for playing the game, we hope you had a great time!\"\nmsgstr \"Merci d'avoir joué au jeu, nous espérons que vous avez passé un bon moment !\"\n\n#. Key:\tdreamhack_completed_subtitle\n#. SourceLocation:\tLocalization/StringTables/Episodes.csv\n#: Localization/StringTables/Episodes.csv\nmsgctxt \"Episodes\"\nmsgid \"Dreamhack Demo\"\nmsgstr \"Demo Dreamhack\"\n\n#. Key:\tdreamhack_desc\n#. SourceLocation:\tLocalization/StringTables/Episodes.csv\n#: Localization/StringTables/Episodes.csv\nmsgctxt \"Episodes\"\nmsgid \"What happens when you lock a mighty demon's spirit inside a ball body?\"\nmsgstr \"Que se passe-t-il lorsque vous enfermez l'esprit d'un puissant démon dans un corps en forme de boule ?\"\n\n#. Key:\tdreamhack_friendly_name\n#. SourceLocation:\tLocalization/StringTables/Episodes.csv\n#: Localization/StringTables/Episodes.csv\nmsgctxt \"Episodes\"\nmsgid \"Dreamhack\"\nmsgstr \"Dreamhack\"\n\n#. Key:\tepisode_end_main_title\n#. SourceLocation:\tLocalization/StringTables/Episodes.csv\n#. InfoMetaData:\t\"Comment\" : \"episode map end panel text\"\n#: Localization/StringTables/Episodes.csv\nmsgctxt \"Episodes\"\nmsgid \"Episode Completed!\"\nmsgstr \"Épisode Terminé !\"\n\n#. Key:\tescape_darkness_completed_desc\n#. SourceLocation:\tLocalization/StringTables/Episodes.csv\n#: Localization/StringTables/Episodes.csv\nmsgctxt \"Episodes\"\nmsgid \"\\\"And as Darkness spreads an unknown Warriorb will rise...\\\"\"\nmsgstr \"\\\"Et tandis que l'obscurité se répandra, un Warriorb inconnu se lèvera...\\\"\"\n\n#. Key:\tescape_darkness_completed_subtitle\n#. SourceLocation:\tLocalization/StringTables/Episodes.csv\n#: Localization/StringTables/Episodes.csv\nmsgctxt \"Episodes\"\nmsgid \"Escaped from Darkness\"\nmsgstr \"Échappé des Ténèbres\"\n\n#. Key:\tescape_darkness_desc\n#. SourceLocation:\tLocalization/StringTables/Episodes.csv\n#: Localization/StringTables/Episodes.csv\nmsgctxt \"Episodes\"\nmsgid \"Are you fast enough to race against Darkness itself?\"\nmsgstr \"Êtes-vous assez rapide pour faire la course contre les Ténèbres elles-mêmes ?\"\n\n#. Key:\tescape_darkness_friendly_name\n#. SourceLocation:\tLocalization/StringTables/Episodes.csv\n#: Localization/StringTables/Episodes.csv\nmsgctxt \"Episodes\"\nmsgid \"Escape Darkness\"\nmsgstr \"Fuir les Ténèbres\"\n\n#. Key:\twhite_wall_completed_desc\n#. SourceLocation:\tLocalization/StringTables/Episodes.csv\n#. InfoMetaData:\t\"Comment\" : \"short text on the ending panel when player finishes this episode\"\n#: Localization/StringTables/Episodes.csv\nmsgctxt \"Episodes\"\nmsgid \"What happened beyond the portal is another story, which will be told at another time.\"\nmsgstr \"Ce qui s'est passé au-delà du portail est une autre histoire, qui sera racontée à un autre moment.\"\n\n#. Key:\twhite_wall_completed_subtitle\n#. SourceLocation:\tLocalization/StringTables/Episodes.csv\n#. InfoMetaData:\t\"Comment\" : \"subtitle of the ending panel when player finishes this episode\"\n#. Key:\twhite_wall_friendly_name\n#. InfoMetaData:\t\"Comment\" : \"name the episode is displayed with in the ui\"\n#: Localization/StringTables/Episodes.csv\nmsgctxt \"Episodes\"\nmsgid \"White Wall\"\nmsgstr \"Mur Blanc\"\n\n#. Key:\twhite_wall_desc\n#. SourceLocation:\tLocalization/StringTables/Episodes.csv\n#. InfoMetaData:\t\"Comment\" : \"map desc when the player can select the episode\"\n#: Localization/StringTables/Episodes.csv\nmsgctxt \"Episodes\"\nmsgid \"Although it's long abandoned the fortress of White Wall still stands against Ruin. After centuries of silence some groups of unexpected visitors broke the loneliness of the decaying city.\"\nmsgstr \"Bien qu'elle soit abandonnée depuis longtemps, la forteresse du Mur blanc se dresse toujours contre la Ruine. Après des siècles de silence, des groupes de visiteurs imprévus ont brisé la solitude de la ville en décomposition.\"\n\n#. Key:\twhite_wall_loadingscreen_desc\n#. SourceLocation:\tLocalization/StringTables/Episodes.csv\n#. InfoMetaData:\t\"Comment\" : \"text on loading screen\"\n#: Localization/StringTables/Episodes.csv\nmsgctxt \"Episodes\"\nmsgid \"After months of researching I found a way to return back to the Ruined Realm. Ironically enough I have to use the same body I was trapped in before. I'll need to be quick and clever for this might be my very last chance to stop Ruin before it devours the World.\"\nmsgstr \"Après des mois de recherches, j'ai trouvé un moyen de retourner au Royaume en Ruines. Ironiquement, je dois utiliser le même corps dans lequel j'ai été piégé auparavant. Je vais devoir être rapide et intelligent car cela pourrait être ma toute dernière chance d'arrêter la Ruine avant qu'elle ne dévore le Monde.\"\n\n#. Key:\tchar_vo_armourwrath_attack_clap\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I won't fail the Maker!\"\nmsgstr \"Je ne laisserai pas tomber le Créateur !\"\n\n#. Key:\tchar_vo_armourwrath_attack_die\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"No... I'm still... perfect\"\nmsgstr \"Non... je suis toujours... parfait\"\n\n#. Key:\tchar_vo_armourwrath_attack_magic\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Resist Ruin!\"\nmsgstr \"Il faut résister à la Ruine !\"\n\n#. Key:\tchar_vo_armourwrath_attack_strike_down\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Out of my way!\"\nmsgstr \"Hors de mon chemin !\"\n\n#. Key:\tchar_vo_armourwrath_attack_strike_down_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I am perfect\"\nmsgstr \"Je suis parfait\"\n\n#. Key:\tchar_vo_dwarvenstatue_attack_axe_point\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I keep Ruin\"\nmsgstr \"Je garde la Ruine\"\n\n#. Key:\tchar_vo_dwarvenstatue_attack_axe_strike_down\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"We are above the Law!\"\nmsgstr \"Nous sommes au-dessus de la Loi !\"\n\n#. Key:\tchar_vo_dwarvenstatue_attack_meteor\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I can take more!\"\nmsgstr \"Je peux en prendre plus !\"\n\n#. Key:\tchar_vo_dwarvenstatue_die\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I won't move... again\"\nmsgstr \"Je ne bougerai pas... encore une fois\"\n\n#. Key:\tchar_vo_dwarvenstatue_shield_knock\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I hold it back!\"\nmsgstr \"Je me retiens !\"\n\n#. Key:\tchar_vo_fallendruid_attack_flybug\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"It's safe here.\"\nmsgstr \"C'est un endroit sûr.\"\n\n#. Key:\tchar_vo_fallendruid_attack_spike\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"This place shall stand!\"\nmsgstr \"Cette place doit tenir !\"\n\n#. Key:\tchar_vo_fallendruid_attack_tendril\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Nature will survive!\"\nmsgstr \"La nature survivra !\"\n\n#. Key:\tchar_vo_fallendruid_attack_thorn_sphere\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Out with you, Ruin!\"\nmsgstr \"Va-t'en, Ruine !\"\n\n#. Key:\tchar_vo_fallendruid_die\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I have... failed\"\nmsgstr \"J'ai… échoué\"\n\n#. Key:\tchar_vo_final_boss_p1_blue\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#. Key:\tchar_vo_final_boss_p2_blue\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I'm the daughter of the Wizard!\"\nmsgstr \"Je suis la fille du Magicien !\"\n\n#. Key:\tchar_vo_final_boss_p1_green\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#. Key:\tchar_vo_final_boss_p2_red_up\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I can create!\"\nmsgstr \"Je peux créer !\"\n\n#. Key:\tchar_vo_final_boss_p1_red\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I'm human!\"\nmsgstr \"Je suis humain !\"\n\n#. Key:\tchar_vo_final_boss_p2_green\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#. Key:\tchar_vo_final_boss_p3_green\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"That sounds funny!\"\nmsgstr \"C'est amusant !\"\n\n#. Key:\tchar_vo_final_boss_p2_red_down\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I can destroy!\"\nmsgstr \"Je peux détruire !\"\n\n#. Key:\tchar_vo_final_boss_p3_blue\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I'm free!\"\nmsgstr \"Je suis libre !\"\n\n#. Key:\tchar_vo_final_boss_p3_red\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"What makes you say that?\"\nmsgstr \"Qu'est-ce qui te fait dire ça ?\"\n\n#. Key:\tchar_vo_fishy_idle_hiss\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Hissing\"\nmsgstr \"Grésillement\"\n\n#. Key:\tchar_vo_flybug_attack_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Huh! Surprised?\"\nmsgstr \"Huh ! Surpris ?\"\n\n#. Key:\tchar_vo_flybug_attack_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Take this!\"\nmsgstr \"Prends ça !\"\n\n#. Key:\tchar_vo_flybug_damaged_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Careful!\"\nmsgstr \"Attention !\"\n\n#. Key:\tchar_vo_flybug_damaged_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"It's not funny!\"\nmsgstr \"Ce n'est pas drôle !\"\n\n#. Key:\tchar_vo_flybug_die_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"All right, gg!\"\nmsgstr \"Ok, bien joué !\"\n\n#. Key:\tchar_vo_flybug_idle_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"What is it like down there? Heh?\"\nmsgstr \"Comment est-ce que c'est là-bas ? Hein ?\"\n\n#. Key:\tchar_vo_flybug_idle_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Easy man, easy!\"\nmsgstr \"Doucement, mec, doucement !\"\n\n#. Key:\tchar_vo_gatekeeper_attack_aimed\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Avoid these!\"\nmsgstr \"Évitez-les !\"\n\n#. Key:\tchar_vo_gatekeeper_attack_aimed_phase_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Watch out where you bounce to!\"\nmsgstr \"Faites attention où vous rebondissez !\"\n\n#. Key:\tchar_vo_gatekeeper_attack_electric_bubbles\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Attention to the heights!\"\nmsgstr \"Attention à la hauteur !\"\n\n#. Key:\tchar_vo_gatekeeper_attack_electric_bubbles_phase_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Attention to the heights again!\"\nmsgstr \"Attention à la hauteur, encore une fois !\"\n\n#. Key:\tchar_vo_gatekeeper_attack_meteors\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Watch out for your head!\"\nmsgstr \"Attention à votre tête !\"\n\n#. Key:\tchar_vo_gatekeeper_attack_shield\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Do you really think you are worthy?\"\nmsgstr \"Vous pensez vraiment être digne ?\"\n\n#. Key:\tchar_vo_ghostarmor__die\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I... don't...\"\nmsgstr \"Je… ne...\"\n\n#. Key:\tchar_vo_ghostarmor_attack_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"You shall perish!\"\nmsgstr \"Vous allez périr !\"\n\n#. Key:\tchar_vo_ghostarmor_attack_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"For justice!\"\nmsgstr \"Pour la justice !\"\n\n#. Key:\tchar_vo_ghostarmor_attack_fall\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Death to the outlaw!\"\nmsgstr \"Mort au hors-la-loi !\"\n\n#. Key:\tchar_vo_ghostarmor_damaged_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Just a scratch.\"\nmsgstr \"Juste une égratignure.\"\n\n#. Key:\tchar_vo_ghostarmor_damaged_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"You... can't.\"\nmsgstr \"Tu… ne peux pas.\"\n\n#. Key:\tchar_vo_ghostarmor_idle_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"We keep the Wall.\"\nmsgstr \"Nous gardons le Mur.\"\n\n#. Key:\tchar_vo_ghostarmor_idle_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Follow the rules!\"\nmsgstr \"Suivez les règles !\"\n\n#. Key:\tchar_vo_ghosthelmet_attack_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Aaaaaaargh!\"\nmsgstr \"Aaaaaaargh!\"\n\n#. Key:\tchar_vo_ghosthelmet_attack_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Chaaaaaarge!\"\nmsgstr \"Chaaaaaargez !\"\n\n#. Key:\tchar_vo_ghosthelmet_damaged_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I'll need a blacksmith!\"\nmsgstr \"J'aurai besoin d'un forgeron !\"\n\n#. Key:\tchar_vo_ghosthelmet_damaged_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Send someone for a hammer!\"\nmsgstr \"Envoyez quelqu'un chercher un marteau !\"\n\n#. Key:\tchar_vo_ghosthelmet_die\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Be right back!\"\nmsgstr \"Je reviens tout de suite !\"\n\n#. Key:\tchar_vo_ghosthelmet_idle_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Use your head... or mine!\"\nmsgstr \"Utilisez votre tête... ou la mienne !\"\n\n#. Key:\tchar_vo_ghosthelmet_idle_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Let's head east!\"\nmsgstr \"Allons vers l'est !\"\n\n#. Key:\tchar_vo_gnory_idle_humming\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Humming\"\nmsgstr \"Fredonnement\"\n\n#. Key:\tchar_vo_gnory_idle_whistle\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Whistling\"\nmsgstr \"Sifflement\"\n\n#. Key:\tchar_vo_golemmaker_idle_explain_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I create essence which resists the ruin.\"\nmsgstr \"Je crée une essence qui résiste à la ruine.\"\n\n#. Key:\tchar_vo_golemmaker_idle_mindlessly_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Knowledge is Lost, All is Lost.\"\nmsgstr \"La connaissance est perdue, tout est perdu.\"\n\n#. Key:\tchar_vo_golemmaker_idle_mindlessly_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"All is Lost.\"\nmsgstr \"Tout est perdu.\"\n\n#. Key:\tchar_vo_golemmaker_idle_moan_aaahhh\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Aaahhh\"\nmsgstr \"Aaahhh\"\n\n#. Key:\tchar_vo_golemmaker_idle_moan_ooohhh\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Ooohhh\"\nmsgstr \"Ooohhh\"\n\n#. Key:\tchar_vo_golemmaker_idle_sad_onon\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Onon\"\nmsgstr \"Onon\"\n\n#. Key:\tchar_vo_golemmaker_idle_tries_to_remember\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Your words remind me of something.\"\nmsgstr \"Ces mots me disent quelque chose.\"\n\n#. Key:\tchar_vo_koboldchef_idle_01\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Too hot!\"\nmsgstr \"Trop chaud !\"\n\n#. Key:\tchar_vo_koboldchef_idle_02\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"It needs more salt!\"\nmsgstr \"Il faut plus de sel !\"\n\n#. Key:\tchar_vo_koboldchef_idle_03\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"It will be delicious.\"\nmsgstr \"Il sera délicieux.\"\n\n#. Key:\tchar_vo_koboldchef_idle_04\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Hmm...\"\nmsgstr \"Hmm...\"\n\n#. Key:\tchar_vo_lory_idle_croon\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Croon\"\nmsgstr \"Fredonnement\"\n\n#. Key:\tchar_vo_lory_idle_humming_0\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Ohh\"\nmsgstr \"Ohh\"\n\n#. Key:\tchar_vo_lory_idle_humming_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#. Key:\tchar_vo_supperdwarf_idle_2_humming_1\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Hmmm\"\nmsgstr \"Hmmm\"\n\n#. Key:\tchar_vo_lory_idle_humming_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Ommm\"\nmsgstr \"Ommm\"\n\n#. Key:\tchar_vo_lory_idle_humming_3\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Auch\"\nmsgstr \"Auch\"\n\n#. Key:\tchar_vo_maintainer_attack_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Dinner is served!\"\nmsgstr \"Le dîner est servi !\"\n\n#. Key:\tchar_vo_maintainer_attack_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Now it's clean!\"\nmsgstr \"Maintenant, c'est propre !\"\n\n#. Key:\tchar_vo_maintainer_damaged_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I'll need to be repaired.\"\nmsgstr \"Je vais devoir être réparé.\"\n\n#. Key:\tchar_vo_maintainer_damaged_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I still serve.\"\nmsgstr \"Je suis toujours en service.\"\n\n#. Key:\tchar_vo_maintainer_die\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I'll need... replacement.\"\nmsgstr \"J'aurai besoin... d'un remplaçant.\"\n\n#. Key:\tchar_vo_maintainer_elite_idle_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Serve...\"\nmsgstr \"Servir...\"\n\n#. Key:\tchar_vo_maintainer_elite_idle_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Order...\"\nmsgstr \"Ordonner...\"\n\n#. Key:\tchar_vo_maintainer_idle_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"At your service.\"\nmsgstr \"A votre service.\"\n\n#. Key:\tchar_vo_maintainer_idle_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Your order?\"\nmsgstr \"Votre demande ?\"\n\n#. Key:\tchar_vo_maintainer_miniboss_attack_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"This is my order!\"\nmsgstr \"C'est ma demande !\"\n\n#. Key:\tchar_vo_maintainer_miniboss_attack_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I'll reorganize!\"\nmsgstr \"Je vais tout réorganiser !\"\n\n#. Key:\tchar_vo_maintainer_miniboss_attack_meteor\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I'm above!\"\nmsgstr \"Je suis au-dessus !\"\n\n#. Key:\tchar_vo_maintainer_miniboss_attack_spawn_enemy\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Order, order, order!\"\nmsgstr \"De l'ordre, de l'ordre, de l'ordre !\"\n\n#. Key:\tchar_vo_maintainer_miniboss_damaged_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I can fix this\"\nmsgstr \"Je peux régler ça\"\n\n#. Key:\tchar_vo_maintainer_miniboss_damaged_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Don't do that again!\"\nmsgstr \"Ne recommencez pas !\"\n\n#. Key:\tchar_vo_maintainer_miniboss_die\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I can't... I was... above.\"\nmsgstr \"Je ne peux pas... J'étais... au-dessus.\"\n\n#. Key:\tchar_vo_primitivefishy_attack_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Srrrr!\"\nmsgstr \"Srrrr!\"\n\n#. Key:\tchar_vo_primitivefishy_attack_long_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Hurray!\"\nmsgstr \"Houra !\"\n\n#. Key:\tchar_vo_primitivefishy_attack_long_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Flyyyyyyy!\"\nmsgstr \"Voooooole !\"\n\n#. Key:\tchar_vo_primitivefishy_damaged_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Uuush!\"\nmsgstr \"Uuush!\"\n\n#. Key:\tchar_vo_primitivefishy_damaged_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Shish!\"\nmsgstr \"Shish!\"\n\n#. Key:\tchar_vo_primitivefishy_die\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Fishy leaves.\"\nmsgstr \"Poiscaille s'en va.\"\n\n#. Key:\tchar_vo_primitivefishy_idle_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I need some fish!\"\nmsgstr \"J'ai besoin de poisson !\"\n\n#. Key:\tchar_vo_primitivefishy_idle_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Did you hear that?\"\nmsgstr \"Vous avez entendu ?\"\n\n#. Key:\tchar_vo_shade_attack_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Join me!\"\nmsgstr \"Rejoignez-moi !\"\n\n#. Key:\tchar_vo_shade_attack_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"You shall die too!\"\nmsgstr \"Vous aussi, vous allez mourir !\"\n\n#. Key:\tchar_vo_shade_damaged_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Is this the end?\"\nmsgstr \"Est-ce la fin ?\"\n\n#. Key:\tchar_vo_shade_damaged_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Pain...\"\nmsgstr \"Souffrance...\"\n\n#. Key:\tchar_vo_shade_die\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Death... again?!\"\nmsgstr \"Mort... encore ?!\"\n\n#. Key:\tchar_vo_shade_idle_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I can't rest.\"\nmsgstr \"Je ne peux pas tomber.\"\n\n#. Key:\tchar_vo_shade_idle_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Death is not peace.\"\nmsgstr \"La mort n'est pas la paix.\"\n\n#. Key:\tchar_vo_shadesphere_attack_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I'll change you!\"\nmsgstr \"Je vais vous changer !\"\n\n#. Key:\tchar_vo_shadesphere_attack_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Do not resist me!\"\nmsgstr \"Ne me résistez pas !\"\n\n#. Key:\tchar_vo_shadesphere_damaged_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"It's still... me...\"\nmsgstr \"C'est toujours... moi...\"\n\n#. Key:\tchar_vo_shadesphere_damaged_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Why did you...?\"\nmsgstr \"Pourquoi avez-vous... ?\"\n\n#. Key:\tchar_vo_shadesphere_die\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"You changed... me?\"\nmsgstr \"Tu m'as... changé ?\"\n\n#. Key:\tchar_vo_shadesphere_idle_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"What do you wish to be?\"\nmsgstr \"Que souhaitez-vous être ?\"\n\n#. Key:\tchar_vo_shadesphere_idle_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Come to me!\"\nmsgstr \"Venez à moi !\"\n\n#. Key:\tchar_vo_supperdwarf_idle_1_eating_food_0\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Yum-yum hmmmm... delicious\"\nmsgstr \"Miam-miam hmmmm... délicieux\"\n\n#. Key:\tchar_vo_supperdwarf_idle_1_eating_food_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Hmmm... tasty\"\nmsgstr \"Hmmm... savoureux\"\n\n#. Key:\tchar_vo_supperdwarf_idle_1_eating_food_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Ehmmm... where is my spoon?\"\nmsgstr \"Ehmmm... où est ma cuillère ?\"\n\n#. Key:\tchar_vo_supperdwarf_idle_2_humming_0\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Ehemm, ehemm\"\nmsgstr \"Ehemm, ehemm\"\n\n#. Key:\tchar_vo_supperdwarf_idle_2_humming_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Ohm\"\nmsgstr \"Ohm\"\n\n#. Key:\tchar_vo_teachy_idle_book_down_0\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Walking ball?\"\nmsgstr \"Une balle qui marche ?\"\n\n#. Key:\tchar_vo_teachy_idle_book_down_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"You?\"\nmsgstr \"Toi ?\"\n\n#. Key:\tchar_vo_teachy_idle_book_down_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Do you exist outside of my mind?\"\nmsgstr \"Existes-tu en dehors de mon esprit ?\"\n\n#. Key:\tchar_vo_teachy_idle_book_down_3\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Ehm, what?\"\nmsgstr \"Ehm, quoi ?\"\n\n#. Key:\tchar_vo_teachy_idle_book_up_0\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Ehmm\"\nmsgstr \"Ehmm\"\n\n#. Key:\tchar_vo_teachy_idle_book_up_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Humm\"\nmsgstr \"Humm\"\n\n#. Key:\tchar_vo_teachy_idle_book_up_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Hemm\"\nmsgstr \"Hemm\"\n\n#. Key:\tchar_vo_teachy_idle_book_up_3\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Ahm\"\nmsgstr \"Ahm\"\n\n#. Key:\tchar_vo_teachy_idle_humming_0\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Hmmm-hmmm-hmm\"\nmsgstr \"Hmmm-hmmm-hmm\"\n\n#. Key:\tchar_vo_teachy_idle_humming_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Ehmm-hmmm-uhmm\"\nmsgstr \"Ehmm-hmmm-uhmm\"\n\n#. Key:\tchar_vo_teachy_idle_humming_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Umm-huhummm\"\nmsgstr \"Umm-huhummm\"\n\n#. Key:\tchar_vo_teachy_idle_humming_speaking_long_0\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I am, therefore I think!\"\nmsgstr \"Je le suis, donc je pense !\"\n\n#. Key:\tchar_vo_teachy_idle_humming_speaking_long_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I think... I am...\"\nmsgstr \"Je pense... que je suis...\"\n\n#. Key:\tchar_vo_teachy_idle_humming_speaking_long_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"The unexamined life is not worth living!\"\nmsgstr \"La vie sans réflexion ne vaut pas la peine d'être vécue !\"\n\n#. Key:\tchar_vo_teachy_idle_humming_speaking_long_3\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"The mind is furnished with ideas by a drunk upholsterer...\"\nmsgstr \"L'esprit est meublé d'idées provenant d'un décorateur ivre...\"\n\n#. Key:\tchar_vo_teachy_idle_humming_speaking_short_0\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Tic-tac\"\nmsgstr \"Tic-tac\"\n\n#. Key:\tchar_vo_teachy_idle_humming_speaking_short_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"To be...\"\nmsgstr \"Être...\"\n\n#. Key:\tchar_vo_teachy_idle_humming_speaking_short_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Weird\"\nmsgstr \"Bizarre\"\n\n#. Key:\tAnyKey\n#. SourceLocation:\tSource/SOrb/Settings/Input/SoInputNames.cpp:347\n#: Source/SOrb/Settings/Input/SoInputNames.cpp:347\nmsgctxt \"InputKeys\"\nmsgid \"Any Key\"\nmsgstr \"N'importe quelle Touche\"\n\n#. Key:\tDown\n#. SourceLocation:\tSource/SOrb/Settings/Input/SoInputNames.cpp:376\n#: Source/SOrb/Settings/Input/SoInputNames.cpp:376\nmsgctxt \"InputKeys\"\nmsgid \"Down\"\nmsgstr \"Bas\"\n\n#. Key:\tLeft\n#. SourceLocation:\tSource/SOrb/Settings/Input/SoInputNames.cpp:373\n#: Source/SOrb/Settings/Input/SoInputNames.cpp:373\nmsgctxt \"InputKeys\"\nmsgid \"Left\"\nmsgstr \"Gauche\"\n\n#. Key:\tRight\n#. SourceLocation:\tSource/SOrb/Settings/Input/SoInputNames.cpp:375\n#: Source/SOrb/Settings/Input/SoInputNames.cpp:375\nmsgctxt \"InputKeys\"\nmsgid \"Right\"\nmsgstr \"Droite\"\n\n#. Key:\tUp\n#. SourceLocation:\tSource/SOrb/Settings/Input/SoInputNames.cpp:374\n#: Source/SOrb/Settings/Input/SoInputNames.cpp:374\nmsgctxt \"InputKeys\"\nmsgid \"Up\"\nmsgstr \"Haut\"\n\n#. Key:\tabsorb_energy\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Absorb Energy\"\nmsgstr \"Absorber l'Énergie\"\n\n#. Key:\tacquired_few_item\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"message when more than one item is received at once\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"A few items acquired\"\nmsgstr \"Quelques objets acquis\"\n\n#. Key:\tacquired_item\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"{0} is replaced with an item name\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"{0} acquired\"\nmsgstr \"{0} acquis\"\n\n#. Key:\tactivate\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Activate\"\nmsgstr \"Activer\"\n\n#. Key:\tactivate_elevator\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Activate Elevator\"\nmsgstr \"Activer l'Ascenseur\"\n\n#. Key:\taquired_silver_key\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"optional bonus message\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Silver Key Acquired\"\nmsgstr \"Clé d'Argent Obtenue\"\n\n#. Key:\tascend\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"climb up a ladder or rope or go up with an elevator\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Ascend\"\nmsgstr \"Ascension\"\n\n#. Key:\tbed\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"examine Bed\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Bed\"\nmsgstr \"Lit\"\n\n#. Key:\tboat_to_kitchen\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"use a boat to get to the kitchen\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Boat to the Kitchen\"\nmsgstr \"Du Bateau à la Cuisine\"\n\n#. Key:\tboat_to_ruins\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"use a boat to get to a place where there are some ancient ruins\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Boat to the Ruins\"\nmsgstr \"Du Bateau à la Ruine\"\n\n#. Key:\tboat_to_station\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"use a boat to get to the Station\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Boat to the Station\"\nmsgstr \"Du Bateau à la Station\"\n\n#. Key:\tcall_elevator\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Call Elevator\"\nmsgstr \"Appelez l'Ascenseur\"\n\n#. Key:\tcandles\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"examine Candles\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Candles\"\nmsgstr \"Bougies\"\n\n#. Key:\tcat_bed\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"examine Tabbys (cat name) bed\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Tabby's Bed\"\nmsgstr \"Lit de Tabby\"\n\n#. Key:\tchair\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"examine Chair\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Chair\"\nmsgstr \"Chaise\"\n\n#. Key:\tchange_spells\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Change Spells\"\nmsgstr \"Changer les Sorts\"\n\n#. Key:\tcharge\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"charge gem in Act I\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Charge\"\nmsgstr \"Charge\"\n\n#. Key:\tcheck_door\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"check door \"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Check Door\"\nmsgstr \"Vérification de la Porte\"\n\n#. Key:\tchest\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"examine Chest\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Chest\"\nmsgstr \"Coffre\"\n\n#. Key:\tchest_check\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Check Chest\"\nmsgstr \"Vérification du Coffre\"\n\n#. Key:\tchest_check_small\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Check Small Chest\"\nmsgstr \"Vérification du Petit Coffre\"\n\n#. Key:\tchest_close\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Close Chest\"\nmsgstr \"Fermer le Coffre\"\n\n#. Key:\tchest_close_small\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Close Small Chest\"\nmsgstr \"Fermer le Petit Coffre\"\n\n#. Key:\tchest_open\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Open Chest\"\nmsgstr \"Ouvrir le Coffre\"\n\n#. Key:\tchest_open_small\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Open Small Chest\"\nmsgstr \"Ouvrir le Petit Coffre\"\n\n#. Key:\tclose_door\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Close Door\"\nmsgstr \"Fermer la Porte\"\n\n#. Key:\tcross_planks\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Cross Planks\"\nmsgstr \"Planches Transversales\"\n\n#. Key:\tdads_room\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"examine Dad's Room\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Daddy's Room\"\nmsgstr \"Chambre de Papa\"\n\n#. Key:\tdescend\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"climb down a ladder or rope or go down with an elevator\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Descend\"\nmsgstr \"Descendre\"\n\n#. Key:\tdestroy\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"destroy device in EndFinal level\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Destroy\"\nmsgstr \"Détruire\"\n\n#. Key:\tdevice\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"use Device\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Device\"\nmsgstr \"Dispositif\"\n\n#. Key:\tdoor\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"examine Door\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Door\"\nmsgstr \"Porte\"\n\n#. Key:\tdoor_does_not_open_from_this_side\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"message when character tries to open a door but it can only be openned from the other side\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Door does not open from this side!\"\nmsgstr \"La porte ne s'ouvre pas de ce côté !\"\n\n#. Key:\tdoor_opened\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"door openned\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Door opened\"\nmsgstr \"Porte ouverte\"\n\n#. Key:\tdrop\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"drop box or carryable\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Drop\"\nmsgstr \"Déposer\"\n\n#. Key:\televator_activated\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Elevator Activated\"\nmsgstr \"Ascenseur Activé\"\n\n#. Key:\televator_inactive\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"player tries to use the elevator but it is inactive\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"The elevator seems to be inactive\"\nmsgstr \"L'ascenseur semble être inactif\"\n\n#. Key:\televator_not_move_to_dir\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"player tries to use an elevator but the direction is not activated yet\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"The elevator does not move to the selected direction\"\nmsgstr \"L'ascenseur ne se déplace pas dans la direction choisie\"\n\n#. Key:\tenter\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"teleport - enter a room or a portal\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Enter\"\nmsgstr \"Entrer\"\n\n#. Key:\tenter_bridge\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Enter Bridge\"\nmsgstr \"Entrer sur le Pont\"\n\n#. Key:\tenter_cave\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Enter Cave\"\nmsgstr \"Entrer dans la Grotte\"\n\n#. Key:\tenter_flames\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Enter Flames\"\nmsgstr \"Entrer dans les Flammes\"\n\n#. Key:\tenter_gate\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Enter Gate\"\nmsgstr \"Entrer par la Porte\"\n\n#. Key:\tenter_hut\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Enter Hut\"\nmsgstr \"Entrer dans la Cabane\"\n\n#. Key:\tenter_kitchen\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Enter Kitchen\"\nmsgstr \"Entrer dans la Cuisine\"\n\n#. Key:\tenter_pipe\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Enter Pipe\"\nmsgstr \"Entrer par le Tuyau\"\n\n#. Key:\tenter_portal\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Enter Portal\"\nmsgstr \"Entrer par le Portail\"\n\n#. Key:\tenter_stairs_left\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Enter Stairs on the Left\"\nmsgstr \"Entrer par les Escaliers de Gauche\"\n\n#. Key:\tenter_stairs_right\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Enter Stairs on the Right\"\nmsgstr \"Entrer par les Escaliers de Droite\"\n\n#. Key:\tenter_tower\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Enter Tower\"\nmsgstr \"Entrer dans la Tour\"\n\n#. Key:\tentrace_locked\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Entrance locked from the other side\"\nmsgstr \"Entrée verrouillée de l'autre côté\"\n\n#. Key:\texamine\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"examine a statue or some other interactable object which triggers dialogue or hint message\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Examine\"\nmsgstr \"Examiner\"\n\n#. Key:\texamine_device\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Examine Device\"\nmsgstr \"Examiner le Dispositif\"\n\n#. Key:\texamine_elevator\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Examine Elevator\"\nmsgstr \"Examiner l'Ascenseur\"\n\n#. Key:\texamine_switch\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"it is a lightswitch\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Examine Switch\"\nmsgstr \"Examiner l'Interrupteur\"\n\n#. Key:\texit\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"exit room\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Exit\"\nmsgstr \"Sortie\"\n\n#. Key:\texplore_stations\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Explore more stations before using the railway system.\"\nmsgstr \"Explorez d'autres gares avant d'utiliser le système ferroviaire.\"\n\n#. Key:\tfinish_demo\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"teleport at the end of demo\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Finish Demo\"\nmsgstr \"Terminer la démo\"\n\n#. Key:\tfire\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"fires a cannon\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Fire\"\nmsgstr \"Tirer\"\n\n#. Key:\tgo_down\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"go down the stairs\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Go down\"\nmsgstr \"Aller vers le bas\"\n\n#. Key:\tgo_up\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"go up the stairs\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Go up\"\nmsgstr \"Aller vers le haut\"\n\n#. Key:\tinspect_fountain\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Inspect Fountain\"\nmsgstr \"Inspecter la Fontaine\"\n\n#. Key:\tinventory\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"hint for hotkey to open the inventory\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Inventory\"\nmsgstr \"Inventaire\"\n\n#. Key:\tkey_missing\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"{0} is the key name\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Key Missing: {0}\"\nmsgstr \"Clé manquante : {0}\"\n\n#. Key:\tkick_rope\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"a pile of rope can be kicked to be able to climb up/down on it\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Kick Rope\"\nmsgstr \"Frapper la Corde\"\n\n#. Key:\tlaboratory\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"examine/enter Laboratory\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Laboratory\"\nmsgstr \"Laboratoire\"\n\n#. Key:\tlamps\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"examine Lamps\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Lamps\"\nmsgstr \"Lampes\"\n\n#. Key:\tleave\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"teleport - leave a room, chest, level\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Leave\"\nmsgstr \"Partir\"\n\n#. Key:\tleave_bridge\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Leave Bridge\"\nmsgstr \"Partir du Pont\"\n\n#. Key:\tleave_cave\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Leave Cave\"\nmsgstr \"Sortir de la Cave\"\n\n#. Key:\tleave_circle\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Leave Circle\"\nmsgstr \"Sortir du Cercle\"\n\n#. Key:\tleave_hut\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Leave Hut\"\nmsgstr \"Sortir de la Cabane\"\n\n#. Key:\tleft_lever\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"use Left Lever\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Left Lever\"\nmsgstr \"Levier Gauche\"\n\n#. Key:\tlever_is_active\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Lever activated. The crystal broke.\"\nmsgstr \"Levier activé. Le cristal s'est brisé.\"\n\n#. Key:\tlever_is_inactive\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"a lever\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Seems to be inactive\"\nmsgstr \"Semble être inactif\"\n\n#. Key:\tmemory_stone_aquire\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Acquire Memory Stone\"\nmsgstr \"Acquérir une Pierre de Mémoire\"\n\n#. Key:\tmemory_stone_gained\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Memory Stone Gained\"\nmsgstr \"Pierre de la Mémoire Obtenue\"\n\n#. Key:\tmiddle_lever\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"use Middle Lever \"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Middle Lever\"\nmsgstr \"Levier Central\"\n\n#. Key:\tmoms_room\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"examine Mom's Room\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Mom's Room\"\nmsgstr \"Chambre de Maman\"\n\n#. Key:\tnotebook\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"examine Notebook\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Notebook\"\nmsgstr \"Bloc-notes\"\n\n#. Key:\topen\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"door can be openned\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Open\"\nmsgstr \"Ouvrir\"\n\n#. Key:\topen_door\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Open Door\"\nmsgstr \"Ouvrir la Porte\"\n\n#. Key:\tpainting\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"examine Painting\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Painting\"\nmsgstr \"Peinture\"\n\n#. Key:\tpaintings\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"examine Paintings\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Paintings\"\nmsgstr \"Peintures\"\n\n#. Key:\tpass_bridge\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Pass Bridge\"\nmsgstr \"Traverser le Pont\"\n\n#. Key:\tpick_up\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"pick up box or carryable\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Pick Up\"\nmsgstr \"Ramasser\"\n\n#. Key:\tplace_rope\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Place Rope\"\nmsgstr \"Placer la Corde\"\n\n#. Key:\tprimary_strike\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"hint with control key for strike 1 of the character\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Primary Strike\"\nmsgstr \"Coup Principal\"\n\n#. Key:\tpull\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"pull a lever\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Pull\"\nmsgstr \"Tirer\"\n\n#. Key:\tpull_lever\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Pull Lever\"\nmsgstr \"Tirer le Levier\"\n\n#. Key:\tpush\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"push a sphere shaped rock from the edge to break some stuff\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Push\"\nmsgstr \"Pousser\"\n\n#. Key:\tput_weapon_away\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"hint with control key to show how to put the weapon away\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Put Weapon Away\"\nmsgstr \"Ranger les Armes\"\n\n#. Key:\tread\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"interaction hint if the character can read a scroll or book\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Read\"\nmsgstr \"Lire\"\n\n#. Key:\tread_dictionary\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Read Dictionary\"\nmsgstr \"Lire le Dictionnaire\"\n\n#. Key:\tread_symbols\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Read Symbols\"\nmsgstr \"Lire les Symboles\"\n\n#. Key:\trelease_keeper\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Release Keeper\"\nmsgstr \"Relâcher le Gardien\"\n\n#. Key:\treplay_boss_fight\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"interaction hint to play a boss fight which was already won\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Replay Boss Fight\"\nmsgstr \"Rejouer le Combat de Boss\"\n\n#. Key:\treset_portals\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"lever\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Reset Portals\"\nmsgstr \"Réinitialiser les Portails\"\n\n#. Key:\trest\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"rest near a checkpoint statue where character can sleep and change spells and listen to music\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Rest\"\nmsgstr \"Se Reposer\"\n\n#. Key:\trestore\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"restore the HP\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Restore\"\nmsgstr \"Restaurer\"\n\n#. Key:\tright_lever\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"use Right Lever\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Right Lever\"\nmsgstr \"Levier Droit\"\n\n#. Key:\tring_bell\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"there is a bell the character has to use to start the conversation with a merchant\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Ring the bell\"\nmsgstr \"Sonner la Cloche\"\n\n#. Key:\trope_can_be_placed\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"A rope could be placed here\"\nmsgstr \"Une corde pourrait être placée ici\"\n\n#. Key:\trope_kicked\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"feedback on the kick rope action\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Rope kicked\"\nmsgstr \"Corde frappée\"\n\n#. Key:\trope_placed\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Rope placed\"\nmsgstr \"Corde placée\"\n\n#. Key:\tsail\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"use ship for travel\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Sail\"\nmsgstr \"Voile\"\n\n#. Key:\tsoulkeeper_released\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Soulkeeper released\"\nmsgstr \"Gardien des Âmes sorti\"\n\n#. Key:\tspecial_strike\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"hint with control key for strike 2 of the character\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Special Strike\"\nmsgstr \"Coup Spécial\"\n\n#. Key:\tstairs\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"enter stairs\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Stairs\"\nmsgstr \"Escaliers\"\n\n#. Key:\tstone_added\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"{0} is the stone amount, {1} is the stone name\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"{0} {1} added to your bag!\"\nmsgstr \"{0} {1} ajouté à votre sac !\"\n\n#. Key:\tstone_cant_carry\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"{0} is the stone name\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"You can't carry more {0}\"\nmsgstr \"Vous ne pouvez pas transporter davantage de {0}\"\n\n#. Key:\tstone_cant_store\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"{0} is the stone name\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"You don't have anything you could use to store {0}\"\nmsgstr \"Vous n'avez rien que vous pourriez utiliser pour stocker {0}\"\n\n#. Key:\tswing\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"Swings on the pole with the arms\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Swing\"\nmsgstr \"Pivoter\"\n\n#. Key:\tswitch_interact\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"Switch interact alternative,  between the two modes\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Switch\"\nmsgstr \"Changer\"\n\n#. Key:\ttake\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"character can take an item\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Take\"\nmsgstr \"Prendre\"\n\n#. Key:\ttake_a_seat\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Take a seat\"\nmsgstr \"S'asseoir\"\n\n#. Key:\ttake_abacus\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Take Abacus\"\nmsgstr \"Prendre le Boulier\"\n\n#. Key:\ttake_all\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Take All\"\nmsgstr \"Tout Prendre\"\n\n#. Key:\ttake_axe\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"character can take a weapon\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Take Axe\"\nmsgstr \"Prendre les Haches\"\n\n#. Key:\ttake_blades\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"character can take two swords to go dual wield\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Take Blades\"\nmsgstr \"Prendre les Lames\"\n\n#. Key:\ttake_books\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"character can take (two) books\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Take Books\"\nmsgstr \"Prendre les Livres\"\n\n#. Key:\ttake_mace\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"character can take a weapon\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Take Mace\"\nmsgstr \"Prendre la Masse\"\n\n#. Key:\ttake_mushrooms\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Take Mushrooms\"\nmsgstr \"Prendre les Champignons\"\n\n#. Key:\ttake_rope\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Take Rope\"\nmsgstr \"Prendre la Corde\"\n\n#. Key:\ttake_sabre\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"character can take a weapon\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Take Sabre\"\nmsgstr \"Prendre le Sabre\"\n\n#. Key:\ttake_spellcaster\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"the Spellcaster is an amulet the character can use to cast spells\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Take Spellcaster\"\nmsgstr \"Prendre le Lanceur de Sorts\"\n\n#. Key:\ttake_stones\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Take Stones\"\nmsgstr \"Prendre les Pierres\"\n\n#. Key:\ttake_sword\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"character can take a weapon\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Take Sword\"\nmsgstr \"Prendre l'Épée\"\n\n#. Key:\ttake_wheel\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Take Wheel\"\nmsgstr \"Prendre la Roue\"\n\n#. Key:\ttalk\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Talk\"\nmsgstr \"Parler\"\n\n#. Key:\ttoggle_switch\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"it is a lightswitch\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Toggle Switch\"\nmsgstr \"Appuyer sur l'Interrupteur\"\n\n#. Key:\ttouch_statue\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Touch Statue\"\nmsgstr \"Toucher la Statue\"\n\n#. Key:\ttravel\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"travel on the train station path\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Travel\"\nmsgstr \"Voyager\"\n\n#. Key:\tunlocked_with\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"{0} is the key name\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Unlocked with {0}\"\nmsgstr \"Déverrouillé avec {0}\"\n\n#. Key:\tuse\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"use device in EndFinal level\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Use\"\nmsgstr \"Utiliser\"\n\n#. Key:\tuse_active_item\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"uses the active item\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Use Active Item\"\nmsgstr \"Utiliser l'Objet Actif\"\n\n#. Key:\tuse_crystal\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Use Crystal\"\nmsgstr \"Utiliser le Cristal\"\n\n#. Key:\tuse_destroy_explained\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Destroy the device to save the creatures of Ruined Realm\"\nmsgstr \"Détruire le dispositif pour sauver les créatures du Royaume en Ruines\"\n\n#. Key:\tuse_device\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Use Device\"\nmsgstr \"Utiliser le Dispositif\"\n\n#. Key:\tuse_elevator\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Use Elevator\"\nmsgstr \"Utiliser l'Ascenseur\"\n\n#. Key:\tuse_elevator_gem\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Use Elevator Gem\"\nmsgstr \"Utiliser la Gemme de l'Ascenseur\"\n\n#. Key:\tuse_magic_mirror\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Use Magic Mirror\"\nmsgstr \"Utiliser le Miroir Magique\"\n\n#. Key:\tuse_separate_explained\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Use the device to separate the Realms\"\nmsgstr \"Utiliser le dispositif pour séparer les Royaumes\"\n\n#. Key:\tuse_switch\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"for the moria gate\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Use switch\"\nmsgstr \"Utiliser l'interrupteur\"\n\n#. Key:\tuse_workshop\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Use Workshop\"\nmsgstr \"Utiliser l'Atelier\"\n\n#. Key:\twheel_release\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"release lever wheel\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Release\"\nmsgstr \"Relacher\"\n\n#. Key:\twheel_turn\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"turn lever wheel\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Turn\"\nmsgstr \"Tourner\"\n\n#. Key:\twindow\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"examine Window\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Window\"\nmsgstr \"Fenêtre\"\n\n#. Key:\tworkroom\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"examine/enter Workroom\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Workroom\"\nmsgstr \"Salle de Travail\"\n\n#. Key:\tyou_are_worthy\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"gate golem tutorial level message interaction\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"You are not worthy!\"\nmsgstr \"Vous n'en êtes pas digne !\"\n\n#. Key:\tice_stone_Name\n#. SourceLocation:\tLocalization/StringTables/Items.csv\n#: Localization/StringTables/Items.csv\nmsgctxt \"Items\"\nmsgid \"Ice Stone\"\nmsgstr \"Pierre de Glace\"\n\n#. Key:\ttest_stone_name\n#. SourceLocation:\tLocalization/StringTables/Items.csv\n#: Localization/StringTables/Items.csv\nmsgctxt \"Items\"\nmsgid \"Test Stone\"\nmsgstr \"Pierre de Test\"\n\n#. Key:\tbook\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:494\n#: Source/SOrb/Basic/SoGameSingleton.cpp:494\nmsgctxt \"ItemsCommon\"\nmsgid \"Something to read\"\nmsgstr \"Quelque chose à lire\"\n\n#. Key:\tcooldown\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:501\n#: Source/SOrb/Basic/SoGameSingleton.cpp:501\nmsgctxt \"ItemsCommon\"\nmsgid \"Cooldown\"\nmsgstr \"Délai\"\n\n#. Key:\tcrossbow\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:487\n#: Source/SOrb/Basic/SoGameSingleton.cpp:487\nmsgctxt \"ItemsCommon\"\nmsgid \"Something to shoot with\"\nmsgstr \"Quelque chose à tirer avec\"\n\n#. Key:\tdefensive\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:472\n#: Source/SOrb/Basic/SoGameSingleton.cpp:472\nmsgctxt \"ItemsCommon\"\nmsgid \"Shard of Protection\"\nmsgstr \"Fragment de Protection\"\n\n#. Key:\tdualwield\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:480\n#: Source/SOrb/Basic/SoGameSingleton.cpp:480\nmsgctxt \"ItemsCommon\"\nmsgid \"Dual Wield Weapon\"\nmsgstr \"Arme à Double Maniement\"\n\n#. Key:\thealth\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:498\n#: Source/SOrb/Basic/SoGameSingleton.cpp:498\nmsgctxt \"ItemsCommon\"\nmsgid \"Health\"\nmsgstr \"Santé\"\n\n#. Key:\tinvalid_shard_max\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:475\n#: Source/SOrb/Basic/SoGameSingleton.cpp:475\nmsgctxt \"ItemsCommon\"\nmsgid \"Invalid\"\nmsgstr \"Non Valide\"\n\n#. Key:\tinvalid_weapon_max\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:481\n#: Source/SOrb/Basic/SoGameSingleton.cpp:481\nmsgctxt \"ItemsCommon\"\nmsgid \"Invalid Weapon\"\nmsgstr \"Arme Non Valide\"\n\n#. Key:\titem\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:492\n#. Key:\tkeylikeitem\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:491\n#: Source/SOrb/Basic/SoGameSingleton.cpp:491\n#: Source/SOrb/Basic/SoGameSingleton.cpp:492\nmsgctxt \"ItemsCommon\"\nmsgid \"Something interesting\"\nmsgstr \"Quelque chose d'interessant\"\n\n#. Key:\tjewelry\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:469\n#: Source/SOrb/Basic/SoGameSingleton.cpp:469\nmsgctxt \"ItemsCommon\"\nmsgid \"Valuable\"\nmsgstr \"Précieux\"\n\n#. Key:\tkey\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:466\n#: Source/SOrb/Basic/SoGameSingleton.cpp:466\nmsgctxt \"ItemsCommon\"\nmsgid \"Key\"\nmsgstr \"Clé\"\n\n#. Key:\tMemoryStone\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:465\n#: Source/SOrb/Basic/SoGameSingleton.cpp:465\nmsgctxt \"ItemsCommon\"\nmsgid \"Memory Stone\"\nmsgstr \"Pierre de Mémoire\"\n\n#. Key:\toffensive\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:473\n#: Source/SOrb/Basic/SoGameSingleton.cpp:473\nmsgctxt \"ItemsCommon\"\nmsgid \"Shard of Justice\"\nmsgstr \"Fragment de Justice\"\n\n#. Key:\tonehanded\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:478\n#: Source/SOrb/Basic/SoGameSingleton.cpp:478\nmsgctxt \"ItemsCommon\"\nmsgid \"One-Handed Weapon\"\nmsgstr \"Arme à Une Main\"\n\n#. Key:\tpotion\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:484\n#: Source/SOrb/Basic/SoGameSingleton.cpp:484\nmsgctxt \"ItemsCommon\"\nmsgid \"Something to drink\"\nmsgstr \"Quelque chose à boire\"\n\n#. Key:\tQuestItem\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:464\n#: Source/SOrb/Basic/SoGameSingleton.cpp:464\nmsgctxt \"ItemsCommon\"\nmsgid \"Quest Item\"\nmsgstr \"Objet de Quête\"\n\n#. Key:\tRuneStone\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:467\n#: Source/SOrb/Basic/SoGameSingleton.cpp:467\nmsgctxt \"ItemsCommon\"\nmsgid \"Runestone\"\nmsgstr \"Pierre de Rune\"\n\n#. Key:\tshard\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:462\n#: Source/SOrb/Basic/SoGameSingleton.cpp:462\nmsgctxt \"ItemsCommon\"\nmsgid \"Shard\"\nmsgstr \"Fragment\"\n\n#. Key:\tsomething_unlock\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:490\n#: Source/SOrb/Basic/SoGameSingleton.cpp:490\nmsgctxt \"ItemsCommon\"\nmsgid \"Something to unlock with\"\nmsgstr \"Quelque chose à débloquer avec\"\n\n#. Key:\tspecial\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:474\n#: Source/SOrb/Basic/SoGameSingleton.cpp:474\nmsgctxt \"ItemsCommon\"\nmsgid \"Shard of Wonder\"\nmsgstr \"Fragment de Merveille\"\n\n#. Key:\tspeed\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:497\n#: Source/SOrb/Basic/SoGameSingleton.cpp:497\nmsgctxt \"ItemsCommon\"\nmsgid \"Attack Speed\"\nmsgstr \"Attaque Rapide\"\n\n#. Key:\tspell\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:486\n#: Source/SOrb/Basic/SoGameSingleton.cpp:486\nmsgctxt \"ItemsCommon\"\nmsgid \"Something to cast with\"\nmsgstr \"Quelque chose à invoquer avec\"\n\n#. Key:\tspellcapacitycost\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:499\n#: Source/SOrb/Basic/SoGameSingleton.cpp:499\nmsgctxt \"ItemsCommon\"\nmsgid \"Capacity Cost\"\nmsgstr \"Coût de Capacité\"\n\n#. Key:\tspellusagecount\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:500\n#: Source/SOrb/Basic/SoGameSingleton.cpp:500\nmsgctxt \"ItemsCommon\"\nmsgid \"Charge\"\nmsgstr \"Charge\"\n\n#. Key:\tthrowable\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:485\n#: Source/SOrb/Basic/SoGameSingleton.cpp:485\nmsgctxt \"ItemsCommon\"\nmsgid \"Something to throw\"\nmsgstr \"Quelque chose à lancer\"\n\n#. Key:\ttwohanded\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:479\n#: Source/SOrb/Basic/SoGameSingleton.cpp:479\nmsgctxt \"ItemsCommon\"\nmsgid \"Two-Handed Weapon\"\nmsgstr \"Arme à Deux Mains\"\n\n#. Key:\tusable\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:463\n#: Source/SOrb/Basic/SoGameSingleton.cpp:463\nmsgctxt \"ItemsCommon\"\nmsgid \"Usable\"\nmsgstr \"Utilisable\"\n\n#. Key:\tweapon\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:468\n#: Source/SOrb/Basic/SoGameSingleton.cpp:468\nmsgctxt \"ItemsCommon\"\nmsgid \"Weapon\"\nmsgstr \"Arme\"\n\n#. Key:\tmus1_combat_1_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(6).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(6).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Disfunctional Golems\"\nmsgstr \"Golems Dysfonctionnels\"\n\n#. Key:\tmus1_combat_2_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(16).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(16).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Machine Rage\"\nmsgstr \"La Rage des Machines\"\n\n#. Key:\tmus1_combat_GateKeeper_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(2).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(2).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Worthy\"\nmsgstr \"Digne\"\n\n#. Key:\tmus1_dlg_Generic_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(7).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(7).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Unexpected Friend\"\nmsgstr \"Un Ami Imprévu\"\n\n#. Key:\tmus1_dlg_Golem_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(9).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(9).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Duty\"\nmsgstr \"Devoir\"\n\n#. Key:\tmus1_dlg_Lory_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(8).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(8).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"The other Bell\"\nmsgstr \"L'autre Cloche\"\n\n#. Key:\tmus1_dlg_Monk_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(10).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(10).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Enlightened Mind\"\nmsgstr \"Un Esprit Éclairé\"\n\n#. Key:\tmus1_dlg_Raven_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(11).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(11).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Winged Wisdom\"\nmsgstr \"Sagesse Ailée\"\n\n#. Key:\tmus1_dlg_SewerCreature_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(32).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(32).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Pipe Walkers\"\nmsgstr \"Tuyauteurs\"\n\n#. Key:\tmus1_dlg_Teachy_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(12).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(12).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Just a bit crazy\"\nmsgstr \"Juste un peu fou\"\n\n#. Key:\tmus1_env_AncientArcade_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(1).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(1).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Remnant Colors\"\nmsgstr \"Couleurs Résiduelles\"\n\n#. Key:\tmus1_env_GreyGate_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(5).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(5).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Touch of Ruin\"\nmsgstr \"Une Touche de Ruine\"\n\n#. Key:\tmus1_env_SecondArcade_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(17).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(17).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"In Memoriam\"\nmsgstr \"In Memoriam\"\n\n#. Key:\tmus1_env_TutorialLevel_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(3).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(3).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Sunken Sewer\"\nmsgstr \"Égouts Inondés\"\n\n#. Key:\tmus2_combat_catacombs_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(18).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(18).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Armours of the Deep\"\nmsgstr \"Les Armures des Profondeurs\"\n\n#. Key:\tmus2_combat_DwarvenBoss_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(19).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(19).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"I hold it back\"\nmsgstr \"Je me retiens\"\n\n#. Key:\tmus2_combat_LavaBoss_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(20).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(20).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Meant to be Perfect\"\nmsgstr \"Pour être Parfait\"\n\n#. Key:\tmus2_combat_WrackedWaterpath_2_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(22).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(22).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Wracked Warriors\"\nmsgstr \"Guerriers Blessés\"\n\n#. Key:\tmus2_combat_WrackedWaterpath_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(21).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(21).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Those who survived\"\nmsgstr \"Ceux qui ont survécu\"\n\n#. Key:\tmus2_combat_WWBoss_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(23).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(23).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"No price too high\"\nmsgstr \"Un prix pas trop élevé\"\n\n#. Key:\tmus2_dlg_Gnory_Fishy_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(33).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(33).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Intelligence and Wisdom\"\nmsgstr \"Intelligence et Sagesse\"\n\n#. Key:\tmus2_dlg_GolemMaker_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(34).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(34).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Lost Memories\"\nmsgstr \"Souvenirs Perdus\"\n\n#. Key:\tmus2_dlg_MerchAnt_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(35).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(35).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Small but Tiny\"\nmsgstr \"Petit voir Minuscule\"\n\n#. Key:\tmus2_dlg_SupperDwarf_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(36).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(36).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Supper time\"\nmsgstr \"L'heure du dîner\"\n\n#. Key:\tmus2_env_Catacombs_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(24).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(24).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Dwarven Catacombs\"\nmsgstr \"Catacombes Naines\"\n\n#. Key:\tmus2_env_CrossroadCave_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(25).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(25).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Railway Station\"\nmsgstr \"Gare Ferroviaire\"\n\n#. Key:\tmus2_env_DwarvenGate_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(26).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(26).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Sanctuary of Law\"\nmsgstr \"Sanctuaire de la Loi\"\n\n#. Key:\tmus2_env_DwarvenOutpost_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(27).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(27).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Where the rail leads\"\nmsgstr \"Où mènent les rails\"\n\n#. Key:\tmus2_env_Kobold_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(15).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(15).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Last of his Tribe\"\nmsgstr \"Le Dernier de sa Tribu\"\n\n#. Key:\tmus2_env_LavaDeep_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(28).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(28).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Temple for the Ancestors\"\nmsgstr \"Le Temple des Ancêtres\"\n\n#. Key:\tmus2_env_LavaEntrance_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(29).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(29).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Pilgrim Road\"\nmsgstr \"La Route des Pèlerins\"\n\n#. Key:\tmus2_env_WrackedWaterpath_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(30).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(30).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Quick and Clever\"\nmsgstr \"Rapide et Intelligent\"\n\n#. Key:\tmus3_combat_Bubble_Ground_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(14).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(14).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Infected Golems\"\nmsgstr \"Golems Infectés\"\n\n#. Key:\tmus3_env_BubbleGround_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(38).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(38).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"So close yet so far\"\nmsgstr \"Si proche et pourtant si loin\"\n\n#. Key:\tmus3_env_CaveHouse_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(39).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(39).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Last Shalter\"\nmsgstr \"Dernière Chance\"\n\n#. Key:\tmus3_env_PipePuzzle_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(40).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(40).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Moving Pipes\"\nmsgstr \"Tuyaux Mouvants\"\n\n#. Key:\tmus3_env_Raven_Puzzle_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(41).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(41).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"One would fail\"\nmsgstr \"D'aucuns échoueraient\"\n\n#. Key:\tmus3_env_RuinedRealm_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(42).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(42).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"The end, really\"\nmsgstr \"La fin, vraiment\"\n\n#. Key:\tmus_chase_theme_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(4).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(4).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Jump for your life!\"\nmsgstr \"Sautez pour votre vie !\"\n\n#. Key:\tmus_cm_WhiteWall_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(13).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(13).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Decaying City\"\nmsgstr \"La Ville en Déclin\"\n\n#. Key:\tmus_ending_dlg_UnknownWizard_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(37).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(37).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"All is lost\"\nmsgstr \"Tout est perdu\"\n\n#. Key:\tmus_main_theme_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(0).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(0).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Spirit of the Unknown\"\nmsgstr \"L'Esprit de l'Inconnu\"\n\n#. Key:\tmus_waterpath_alter_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(43).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(43).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Stories never end\"\nmsgstr \"Les histoires ne finissent jamais\"\n\n#. Key:\tblocked\n#. SourceLocation:\tLocalization/StringTables/Spells.csv\n#. InfoMetaData:\t\"Comment\" : \" displayed as floating test ingame when a certain enemy blocks certain attacks\"\n#: Localization/StringTables/Spells.csv\nmsgctxt \"Spells\"\nmsgid \"Blocked\"\nmsgstr \"Bloqué\"\n\n#. Key:\tcant_use_in_air\n#. SourceLocation:\tLocalization/StringTables/Spells.csv\n#. InfoMetaData:\t\"Comment\" : \" displayed as floating test ingame when the character tries to use a spell in air which can not be used there\"\n#: Localization/StringTables/Spells.csv\nmsgctxt \"Spells\"\nmsgid \"Can't in air\"\nmsgstr \"Pas en l'air\"\n\n#. Key:\tcant_use_sk_free_zone\n#. SourceLocation:\tLocalization/StringTables/Spells.csv\n#. InfoMetaData:\t\"Comment\" : \" displayed as floating test ingame when character tries to use the respawn point spell on a location when it is not allowed\"\n#: Localization/StringTables/Spells.csv\nmsgctxt \"Spells\"\nmsgid \"Dangerous Location\"\nmsgstr \"Endroit Dangereux\"\n\n#. Key:\thp_gained\n#. SourceLocation:\tLocalization/StringTables/Spells.csv\n#. InfoMetaData:\t\"Comment\" : \" displayed as floating test ingame when the character increases his max health\"\n#: Localization/StringTables/Spells.csv\nmsgctxt \"Spells\"\nmsgid \"Health Increased!\"\nmsgstr \"Santé accrue !\"\n\n#. Key:\timmune\n#. SourceLocation:\tLocalization/StringTables/Spells.csv\n#. InfoMetaData:\t\"Comment\" : \"displayed as floating text ingame if enemy is immune to a spell or damage type\"\n#: Localization/StringTables/Spells.csv\nmsgctxt \"Spells\"\nmsgid \"Immune\"\nmsgstr \"Immunisé\"\n\n#. Key:\tinfected\n#. SourceLocation:\tLocalization/StringTables/Spells.csv\n#. InfoMetaData:\t\"Comment\" : \" displayed as floating test ingame when dmg over time effect is applied on enemy\"\n#: Localization/StringTables/Spells.csv\nmsgctxt \"Spells\"\nmsgid \"Infected\"\nmsgstr \"Infecté\"\n\n#. Key:\tinstant_recharge\n#. SourceLocation:\tLocalization/StringTables/Spells.csv\n#. InfoMetaData:\t\"Comment\" : \" displayed as floating test ingame when a spell can be used again without waiting for the cooldown time\"\n#: Localization/StringTables/Spells.csv\nmsgctxt \"Spells\"\nmsgid \"Instant Recharge\"\nmsgstr \"Recharge instantanée\"\n\n#. Key:\tmissing_target\n#. SourceLocation:\tLocalization/StringTables/Spells.csv\n#. InfoMetaData:\t\"Comment\" : \" displayed as floating test ingame when the character tries to use a spell which requires a target but there is none in range\"\n#: Localization/StringTables/Spells.csv\nmsgctxt \"Spells\"\nmsgid \"Who? Where? What?!\"\nmsgstr \"Qui ? Où ? Quoi ?!\"\n\n#. Key:\tno_need_for_heal\n#. SourceLocation:\tLocalization/StringTables/Spells.csv\n#. InfoMetaData:\t\"Comment\" : \" displayed as floating test ingame when the character tries to use heal spell but has max health already\"\n#: Localization/StringTables/Spells.csv\nmsgctxt \"Spells\"\nmsgid \"No need\"\nmsgstr \"Pas besoin\"\n\n#. Key:\tresisted\n#. SourceLocation:\tLocalization/StringTables/Spells.csv\n#. InfoMetaData:\t\"Comment\" : \"displayed as floating text ingame if enemy has a chance to avoid an effect and he is lucky\"\n#: Localization/StringTables/Spells.csv\nmsgctxt \"Spells\"\nmsgid \"Resisted\"\nmsgstr \"A résisté\"\n\n#. Key:\tsecond_chance\n#. SourceLocation:\tLocalization/StringTables/Spells.csv\n#. InfoMetaData:\t\"Comment\" : \" displayed as floating test ingame if char has the effect on and dies and respawns because the effect saves him\"\n#: Localization/StringTables/Spells.csv\nmsgctxt \"Spells\"\nmsgid \"Second Chance\"\nmsgstr \"Seconde Chance\"\n\n#. Key:\tspell_capacity_gained\n#. SourceLocation:\tLocalization/StringTables/Spells.csv\n#. InfoMetaData:\t\"Comment\" : \" displayed as floating test ingame when the character increases his spellpower\"\n#: Localization/StringTables/Spells.csv\nmsgctxt \"Spells\"\nmsgid \"Spellpower Increased!\"\nmsgstr \"Augmentation de la Puissance des Sorts !\"\n\n#. Key:\tspell_regained\n#. SourceLocation:\tLocalization/StringTables/Spells.csv\n#. InfoMetaData:\t\"Comment\" : \" displayed as floating test ingame when the character regains a spell (can cast again)\"\n#: Localization/StringTables/Spells.csv\nmsgctxt \"Spells\"\nmsgid \"Spell Charge Regained!\"\nmsgstr \"Charge du Sort regagnée !\"\n\n#. Key:\tacknowledge\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Button\"\n#. Key:\tgroup_defeated_ack\n#. InfoMetaData:\t\"Comment\" : \"the hotkey to close the group defeated panel\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Acknowledge\"\nmsgstr \"Informations\"\n\n#. Key:\tback\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Button\"\n#. Key:\tpanel_command_inv_back\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Back\"\nmsgstr \"Retour\"\n\n#. Key:\tblack_fade_teleport_text_1\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Now I remember the night when it started...\"\nmsgstr \"Maintenant, je me souviens de la nuit où tout a commencé...\"\n\n#. Key:\tbubble_float\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"bubble tip for the char to float\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Float\"\nmsgstr \"Flotter\"\n\n#. Key:\tbubble_jump\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"bubble tip for the char to jump\"\n#. Key:\tinput_jump\n#. InfoMetaData:\t\"Comment\" : \"Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Jump\"\nmsgstr \"Sauter\"\n\n#. Key:\tbuy\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"buy item\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Buy\"\nmsgstr \"Acheter\"\n\n#. Key:\tbuy_back\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"buy back item\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Buy Back\"\nmsgstr \"Rachat\"\n\n#. Key:\tbuy_on_steam_and_follow\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Buy WarriOrb in Steam and follow us on social media:\"\nmsgstr \"Acheter WarriOrb sur Steam et suivez-nous sur les médias sociaux:\"\n\n#. Key:\tcancel\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Confirm popup\"\n#. Key:\tsettings_cancel\n#. InfoMetaData:\t\"Comment\" : \"Settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Cancel\"\nmsgstr \"Annuler\"\n\n#. Key:\tchange_user\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Change User\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Change User\"\nmsgstr \"Changer de profil\"\n\n#. Key:\tchapter\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Stats for saves\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Chapter\"\nmsgstr \"Chapitre\"\n\n#. Key:\tchapter1_completed\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Temporary for chapter 1\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Chapter 1 completed. Save is Locked.\"\nmsgstr \"Chapitre 1 complété. Sauvegarde Verrouillée.\"\n\n#. Key:\tcharacter_skin_classic\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"name of the original character skin\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Classic\"\nmsgstr \"Classique\"\n\n#. Key:\tcharacter_skin_desc\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"description for the character skin option\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Changes the visuals of the player character\"\nmsgstr \"Modifie l'aspect visuel du personnage du joueur\"\n\n#. Key:\tcharacter_skin_mummy\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"name of the alternative character skin\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Mummy\"\nmsgstr \"Momie\"\n\n#. Key:\tcharacter_skin_pumpkin\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"name of the alternative character skin\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Pumpkin\"\nmsgstr \"Citrouille\"\n\n#. Key:\tcharacter_skin_title\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"option to change character skin\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Character Skin\"\nmsgstr \"Visuel du Personnage\"\n\n#. Key:\tcheckpoint\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Stats for saves\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Checkpoint\"\nmsgstr \"Point de Contrôle\"\n\n#. Key:\tchest_examine\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Examine\"\nmsgstr \"Examiner\"\n\n#. Key:\tchest_leave\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Leave\"\nmsgstr \"Partir\"\n\n#. Key:\tchest_loot\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"hotkey tip on chest\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Loot\"\nmsgstr \"Récupérer\"\n\n#. Key:\tclose\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"close book\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Close\"\nmsgstr \"Fermer\"\n\n#. Key:\tcompleted_in_time\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Custom Map\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Completed in {time}\"\nmsgstr \"Terminé en {time}\"\n\n#. Key:\tconfirm\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Confirm popup\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Confirm\"\nmsgstr \"Confirmer\"\n\n#. Key:\tconfirm_keyboard_settings_reset\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Confirm keyboard settings\"\n#. Key:\tdifficulty_confirm_question\n#. InfoMetaData:\t\"Comment\" : \"Confirm difficulty selected popup\"\n#. Key:\tsave_slots_remove_confirm\n#. InfoMetaData:\t\"Comment\" : \"remove save slot confirm dialogue\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Are you sure?\"\nmsgstr \"Êtes-vous sûr ?\"\n\n#. Key:\tconsole_ps4\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"PlayStation 4\"\nmsgstr \"PlayStation 4\"\n\n#. Key:\tconsole_switch\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Switch\"\nmsgstr \"Switch\"\n\n#. Key:\tconsole_xbox_one\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"XBox One\"\nmsgstr \"XBox One\"\n\n#. Key:\tcontinue\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Menu Continue\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Continue\"\nmsgstr \"Continuer\"\n\n#. Key:\tcontroller_recommended\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Main Menu\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Note: Playing with a controller is recommended\"\nmsgstr \"Note : Il est recommandé de jouer avec une manette\"\n\n#. Key:\tcredits\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Menu credits\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Credits\"\nmsgstr \"Générique\"\n\n#. Key:\tcustom_map_x\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Custom Map\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Custom Map {0}\"\nmsgstr \"Niveaux personnalisés {0}\"\n\n#. Key:\tcustom_maps\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Menu custom Maps\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Custom Maps\"\nmsgstr \"Niveaux personnalisés\"\n\n#. Key:\tdescription\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Of something\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Description\"\nmsgstr \"Déscription\"\n\n#. Key:\tdifficulty\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Stats for saves\"\n#. Key:\tdifficulty_title\n#. InfoMetaData:\t\"Comment\" : \"title of difficulty selection\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Difficulty\"\nmsgstr \"Difficulté\"\n\n#. Key:\tdifficulty_confirm_subtext\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Confirm difficulty selected popup subtext\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"This choice is permanent\"\nmsgstr \"Ce choix est permanent\"\n\n#. Key:\tdifficulty_desc_insane\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"description of hard difficulty\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"- The <Blue>SoulKeeper</> (Portable Checkpoint) spell is removed from the game\\n- Increased incoming damage\\n- Increased Enemy Health\"\nmsgstr \"- Le sort <Blue>Gardien des Âmes</> (Point de Contrôle Ambulant) est supprimé du jeu\\n- Augmentation des dommages reçus\\n- Augmentation de la santé des ennemis\"\n\n#. Key:\tdifficulty_desc_intended\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"description of normal difficulty\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"The way the game is meant to be played\"\nmsgstr \"La manière dont le jeu est censé être joué\"\n\n#. Key:\tdifficulty_desc_sane\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"description of easy difficulty\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"- Infinite <Blue>SoulKeeper</> (Checkpoint) spell charges\\n- No health penalty when respawning near the <Blue>SoulKeeper</>\\n- Decreased incoming damage\\n- Decreased Enemy Health\"\nmsgstr \"- Charge de sort infinies pour le <Blue>Gardien des Âmes</> (Point de Contrôle)\\n- Pas de sanction de santé lors de la réapparition près du <Blue>Gardien des Âmes</>\\n- Diminution des dégâts reçus\\n- Diminution de la Santé des Ennemis\"\n\n#. Key:\tdifficulty_insane\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"name of hard difficulty\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"As hard as it can get\"\nmsgstr \"Fou\"\n\n#. Key:\tdifficulty_intended\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"name of normal difficulty\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"A true challenge\"\nmsgstr \"Normal\"\n\n#. Key:\tdifficulty_normal\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Normal\"\nmsgstr \"Normal\"\n\n#. Key:\tdifficulty_sane\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"name of easy difficulty\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Just an adventure\"\nmsgstr \"Facile\"\n\n#. Key:\tdisabled\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Widget is disabled\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Disabled\"\nmsgstr \"Désactivé\"\n\n#. Key:\tdiscord\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Discord\"\nmsgstr \"Discord\"\n\n#. Key:\tdrm_defeatead_description\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"check only in pirated copies \"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"We suspect that you play a pirated copy of the game.\\nIt's fine. We hope you will enjoy it!\\n\\nIf you like the game, please tell your friends about it, and maybe even consider buying it.\\n\\nWe would love to keep making games!\"\nmsgstr \"Nous soupçonnons que vous jouez à une copie piratée du jeu.\\nPas de problème. Nous espérons que vous l'apprécierez !\\n\\nSi vous aimez le jeu, parlez-en à vos amis, et envisagez peut-être même de l'acheter.\\n\\nNous aimerions continuer à créer des jeux !\"\n\n#. Key:\tdrm_defeatead_title\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"check only in pirated copies \"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"WarriOrb DRM\"\nmsgstr \"WarriOrb DRM\"\n\n#. Key:\tdwarf_language\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Dwarf language\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Dwarf\"\nmsgstr \"Nain\"\n\n#. Key:\tempty\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Empty\"\nmsgstr \"Vide\"\n\n#. Key:\tempty_line\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"-\"\nmsgstr \"-\"\n\n#. Key:\tencourage_line1\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Before Main Menu\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"The path ahead is challenging. Do not despise failure. Every wrong attempt discarded is another step forward.\"\nmsgstr \"Le chemin est difficile. Ne méprisez pas l'échec. Chaque essai infructueux est un pas en avant.\"\n\n#. Key:\tessence\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"essence represents the Health of the character\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Essence\"\nmsgstr \"Essence\"\n\n#. Key:\tfeedback\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Discord external button\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Feedback\"\nmsgstr \"Commentaires\"\n\n#. Key:\tgame_defeated\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"end screen\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Game Defeated!\"\nmsgstr \"Partie Gagnée !\"\n\n#. Key:\tgame_is_wip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Main Menu\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Game currently under development\"\nmsgstr \"Jeu en cours de développement\"\n\n#. Key:\tgame_over_retreat\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"control tip which is only visible in boss areas where the player can either restart the fight or retreat from the place\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Retreat\"\nmsgstr \"Abandonner\"\n\n#. Key:\tgame_over_retry\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"control tip which is always visible on game over\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Retry\"\nmsgstr \"Recommencer\"\n\n#. Key:\tgamepad_special_left_xbox\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"xbox view button\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"View button\"\nmsgstr \"Touche Affichage\"\n\n#. Key:\tgamepad_special_right_xbox\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"xbox Menu button\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Menu button\"\nmsgstr \"Touche Menu\"\n\n#. Key:\tgo_back_to_menu\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Go back to main menu\"\nmsgstr \"Retour au menu principal\"\n\n#. Key:\tgold_x\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"{x} is the gold amount\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"+{x} GOLD\"\nmsgstr \"+{x} D'OR\"\n\n#. Key:\tgroup_defeated_title\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"title of the group defeated panel\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Group Defeated\"\nmsgstr \"Groupe Vaincu\"\n\n#. Key:\tinput_action_back\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"UI Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"UI Action Back\"\nmsgstr \"UI Action Retour\"\n\n#. Key:\tinput_action_first\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"UI Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"UI Action First\"\nmsgstr \"UI Action Première\"\n\n#. Key:\tinput_action_second\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"UI Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"UI Action Second\"\nmsgstr \"UI Action Seconde\"\n\n#. Key:\tinput_action_third\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"UI Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"UI Action Third\"\nmsgstr \"UI Action Troisième\"\n\n#. Key:\tinput_actions_conflicts\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input remap.  {Key} = key display name. {NumAction} the number of actions, this will determine what to choose between one and other.\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Selected button = {Key}, will get unbound from the {NumActions}|plural(one=Action,other=Actions) = {ActionNames}\"\nmsgstr \"Le bouton sélectionné = {Key}, ne sera plus liée à cette ou ces {NumActions}|plural(one=Action,other=Actions) = {ActionNames}\"\n\n#. Key:\tinput_alt_interact\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Interact Alternative\"\nmsgstr \"Interagir autrement\"\n\n#. Key:\tinput_change_item\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input Action Name\"\n#. Key:\tpanel_command_inv_change_item\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Change Item\"\nmsgstr \"Changer d'Objet\"\n\n#. Key:\tinput_change_spell\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Change Spell\"\nmsgstr \"Changer de Sort\"\n\n#. Key:\tinput_change_weapon\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Change Weapon\"\nmsgstr \"Changer d'Arme\"\n\n#. Key:\tinput_down\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"UI Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"UI Move Down\"\nmsgstr \"UI Bouger vers le Bas\"\n\n#. Key:\tinput_float\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Floating\"\nmsgstr \"Flotter\"\n\n#. Key:\tinput_interact\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Interact\"\nmsgstr \"Interagir\"\n\n#. Key:\tinput_left\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Move Left\"\nmsgstr \"Bouger à Gauche\"\n\n#. Key:\tinput_menu_back\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"UI Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Open Menu/Escape/Back\"\nmsgstr \"Ouvrir le Menu/Sortir/Revenir\"\n\n#. Key:\tinput_not_allowed_options_menu_button\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input remap gamepad\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Not allowed to remap to the Menu button\"\nmsgstr \"Impossible de modifier les Touche Menu\"\n\n#. Key:\tinput_not_allowed_options_menu_button_switch\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input remap gamepad\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Not allowed to remap to the + Button\"\nmsgstr \"Impossible de modifier les bouton +\"\n\n#. Key:\tinput_not_allowed_thumbsticks\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input remap gamepad\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Not allowed to remap to thumbsticks\"\nmsgstr \"Impossible de modifier les sticks\"\n\n#. Key:\tinput_not_allowed_thumbsticks_switch\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input remap gamepad switch\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Not allowed to remap to Left Stick or Right Stick\"\nmsgstr \"Impossible de modifier le stick gauche et le stick droit\"\n\n#. Key:\tinput_open_inventory\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Open Inventory\"\nmsgstr \"Ouvrir l'Inventaire\"\n\n#. Key:\tinput_right\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Move Right\"\nmsgstr \"Bouger à Droite\"\n\n#. Key:\tinput_roll\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Roll\"\nmsgstr \"Rouler\"\n\n#. Key:\tinput_selected_key_not_allowed\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input remap. {Key} = key display name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Selected button = {Key}, is not allowed as an input option\"\nmsgstr \"Le bouton sélectionné = {Key}, n'est pas autorisée\"\n\n#. Key:\tinput_spell_down\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"UI Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"UI Spell Down\"\nmsgstr \"UI Sort Bas\"\n\n#. Key:\tinput_spell_left\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"UI Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"UI Spell Left\"\nmsgstr \"UI Sort Gauche\"\n\n#. Key:\tinput_spell_right\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"UI Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"UI Spell Right\"\nmsgstr \"UI Sort Droite\"\n\n#. Key:\tinput_spell_select\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"UI Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"UI Spell Select\"\nmsgstr \"UI Sort Choisir\"\n\n#. Key:\tinput_spell_select_and_cast\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"UI Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"UI Spell Select & Cast\"\nmsgstr \"UI Sort Choisir & Lancer\"\n\n#. Key:\tinput_spell_up\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"UI Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"UI Spell Up\"\nmsgstr \"UI Sort Haut\"\n\n#. Key:\tinput_strike_primary\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Primary Strike\"\nmsgstr \"Coup Principal\"\n\n#. Key:\tinput_strike_special\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Special Strike\"\nmsgstr \"Coup Spécial\"\n\n#. Key:\tinput_take_weapon\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Take Weapon Away\"\nmsgstr \"Ranger les Armes\"\n\n#. Key:\tinput_top_left\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"UI Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"UI Top Left\"\nmsgstr \"UI en Haut à Gauche\"\n\n#. Key:\tinput_top_right\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"UI Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"UI Top Right\"\nmsgstr \"UI en Haut à Droite\"\n\n#. Key:\tinput_unbound\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Unbound input\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Unbound\"\nmsgstr \"Non lié\"\n\n#. Key:\tinput_up\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"UI Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"UI Move Up\"\nmsgstr \"UI Vers le Haut\"\n\n#. Key:\tinput_use_item\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Use Item\"\nmsgstr \"Utiliser l'Objet\"\n\n#. Key:\tinventory_item_amount\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"the item amount displayed in inventory/trade panel/etc.\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Amount: {0}\"\nmsgstr \"Quantité : {0}\"\n\n#. Key:\tinventory_item_tooltip_cooldown\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Cooldown\"\nmsgstr \"Recharge\"\n\n#. Key:\tinventory_item_tooltip_damage\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"damage text on item descriptions\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Damage\"\nmsgstr \"Dégâts\"\n\n#. Key:\tinventory_item_tooltip_sec\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"duration of something (e.g. cooldown)\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"{0} sec\"\nmsgstr \"{0} sec\"\n\n#. Key:\titem_equipped\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Item Tooltip\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"---Equipped---\"\nmsgstr \"---Équipé---\"\n\n#. Key:\titem_not_For_sale\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Item Tooltip\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Not for sale\"\nmsgstr \"Pas à vendre\"\n\n#. Key:\titem_rarity_0\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"item rarity text on the bottom of tooltips\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Better than nothing, right?\"\nmsgstr \"C'est mieux que rien, non ?\"\n\n#. Key:\titem_rarity_1\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"item rarity text on the bottom of tooltips\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Better than nothing\"\nmsgstr \"Mieux que rien\"\n\n#. Key:\titem_rarity_2\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"item rarity text on the bottom of tooltips\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Good stuff\"\nmsgstr \"Trucs de qualité\"\n\n#. Key:\titem_rarity_3\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"item rarity text on the bottom of tooltips\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Pretty good stuff\"\nmsgstr \"Trucs plutôt intéressants\"\n\n#. Key:\titem_rarity_4\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"item rarity text on the bottom of tooltips\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Amazing stuff\"\nmsgstr \"Trucs incroyables\"\n\n#. Key:\tkey_selection_current\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Select Input key\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Currently selected button:\"\nmsgstr \"Bouton actuellement sélectionné\"\n\n#. Key:\tkey_selection_empty\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Select Input key\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"[Empty Button]\"\nmsgstr \"Bouton Vide\"\n\n#. Key:\tkey_selection_press\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Select Input key\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"[Press Button]\"\nmsgstr \"[Appuyer sur un Bouton]\"\n\n#. Key:\tkey_selection_press_button\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Select Input key\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Press the button you want to assign to the action:\"\nmsgstr \"Appuyez sur le bouton que vous souhaitez attribuer à l'action :\"\n\n#. Key:\tline_three_dots\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"...\"\nmsgstr \"...\"\n\n#. Key:\tloading_screen_press_key\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Press any key to continue...\"\nmsgstr \"Appuyez sur n'importe quelle touche pour continuer...\"\n\n#. Key:\tloading_screen_press_key_switch\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Press any button to continue...\"\nmsgstr \"Appuyez sur n'importe quel bouton pour continuer...\"\n\n#. Key:\tloading_screen_text_1\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"This is a loading screen. We wait a few seconds here to look more professional.\"\nmsgstr \"Ceci est un écran de chargement. Nous attendons quelques secondes ici pour paraître plus professionnels.\"\n\n#. Key:\tmailing_list\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Mailing List\"\nmsgstr \"Liste de Diffusion\"\n\n#. Key:\tnever_completed\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Custom Map\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Never completed\"\nmsgstr \"Jamais completé\"\n\n#. Key:\tno\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Confirm popup\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"No\"\nmsgstr \"Non\"\n\n#. Key:\tpanel_character_sheet\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Character Panel\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Character Sheet\"\nmsgstr \"Personnage\"\n\n#. Key:\tpanel_command_inv_compare\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Compare\"\nmsgstr \"Comparer\"\n\n#. Key:\tpanel_command_inv_drink\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Drink\"\nmsgstr \"Boire\"\n\n#. Key:\tpanel_command_inv_equip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"control key tip in inventory\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Equip\"\nmsgstr \"Équiper\"\n\n#. Key:\tpanel_command_inv_equip_item\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Equip Item\"\nmsgstr \"Équiper l'Objet\"\n\n#. Key:\tpanel_command_inv_equip_next\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Equip Next\"\nmsgstr \"Équiper Suivant\"\n\n#. Key:\tpanel_command_inv_read\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Read\"\nmsgstr \"Lire\"\n\n#. Key:\tpanel_command_inv_unequip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Unequip\"\nmsgstr \"Déséquiper\"\n\n#. Key:\tpanel_command_spell_add\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"add spell to equipped spells\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Add\"\nmsgstr \"Ajouter\"\n\n#. Key:\tpanel_command_spell_remove\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"remove spell from equipped spells\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Remove\"\nmsgstr \"Enlever\"\n\n#. Key:\tpanel_equipped_spells\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Spell Selection panel\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Equipped Spells\"\nmsgstr \"Sorts Équipés\"\n\n#. Key:\tpanel_inventory\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Character Panel\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Inventory\"\nmsgstr \"Inventaire\"\n\n#. Key:\tpanel_notes\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Character Panel\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Sidenotes\"\nmsgstr \"Notes\"\n\n#. Key:\tpaneL_resistances\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Character Sheet Panel\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Resistances\"\nmsgstr \"Resistances\"\n\n#. Key:\tpanel_rest_no_item\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"You don't have the necessary item to use spells!\"\nmsgstr \"Vous n'avez pas l'objet nécessaire pour utiliser des sorts !\"\n\n#. Key:\tpanel_rest_option_change_spells\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Change Spells\"\nmsgstr \"Changer les Sorts\"\n\n#. Key:\tpanel_rest_option_listen_to_music\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Listen to Music\"\nmsgstr \"Écouter de la musique\"\n\n#. Key:\tpanel_rest_option_sleep\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Sleep\"\nmsgstr \"Dormir\"\n\n#. Key:\tpanel_rest_option_wake_up\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Wake Up\"\nmsgstr \"Se Réveiller\"\n\n#. Key:\tpanel_spell_capacity\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Spell Selection panel\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Capacity: {0}/{1}\"\nmsgstr \"Capacité : {0}/{1}\"\n\n#. Key:\tpanel_spell_selection_denied\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Spell Selection panel\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"You can only change the equipped spells near ancient statues.\"\nmsgstr \"Vous ne pouvez changer les sorts équipés qu'à proximité des anciennes statues.\"\n\n#. Key:\tpanel_spells\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Character Panel\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Spells\"\nmsgstr \"Sorts\"\n\n#. Key:\tpercentage_argument\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Slider\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"{0}%\"\nmsgstr \"{0}%\"\n\n#. Key:\tplay_time\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Stats for saves\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Play Time\"\nmsgstr \"Temps de Jeu\"\n\n#. Key:\tprogress_saved\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Confirm Quit popup\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Progress will be saved\"\nmsgstr \"Les progrès seront sauvegardés\"\n\n#. Key:\tprogress_saved_automatically\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Before Main Menu\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Your progress is saved automatically whenever this icon is displayed\"\nmsgstr \"Votre progression est automatiquement enregistrée à chaque fois que cette icône est affichée\"\n\n#. Key:\tquit_game\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Menu Quit Game\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Quit Game\"\nmsgstr \"Quitter\"\n\n#. Key:\tquit_game_question\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Confirm Quit popup\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Quit Game?\"\nmsgstr \"Quitter le Jeu ?\"\n\n#. Key:\tquit_to_menu\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Menu Quit To Menu\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Quit to Menu\"\nmsgstr \"Retour au Menu\"\n\n#. Key:\tquit_to_menu_question\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Confirm Quit popup\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Quit to Menu?\"\nmsgstr \"Quitter vers le Menu ?\"\n\n#. Key:\treset_keyboard_arrows\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Confirm keyboard settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Reset to Arrow defaults\"\nmsgstr \"Revenir aux Fléches par défaut\"\n\n#. Key:\treset_keyboard_wasd\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Confirm keyboard settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Reset to WASD defaults\"\nmsgstr \"Revenir à ZQSD par défaut\"\n\n#. Key:\trestart\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Restart the game\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Restart\"\nmsgstr \"Relancer\"\n\n#. Key:\trestart_game_question\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Confirm Restart popup\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Restart Game?\"\nmsgstr \"Relancer le Jeu ?\"\n\n#. Key:\trestart_game_warning\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Confirm Restart popup\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"All progress will be lost\"\nmsgstr \"Tous les progrès vont être perdus\"\n\n#. Key:\tsave_slots_clear\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"clears the save slot\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Clear\"\nmsgstr \"Terminé\"\n\n#. Key:\tsave_slots_loaded\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"text on currently loaded save slot if there is any\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"- Loaded -\"\nmsgstr \"- Chargé -\"\n\n#. Key:\tsave_slots_new_game\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"text on empty save slot\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"New Game\"\nmsgstr \"Nouvelle Partie\"\n\n#. Key:\tsave_slots_playtime\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"playtime displayed, {0} is the hours, {1} is the minutes\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"{0} H {1} M\"\nmsgstr \"{0} H {1} M\"\n\n#. Key:\tsave_slots_playtime_short\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"playtime displayed if it did not reach an hour, {0} is the time in minutes\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"{0} M\"\nmsgstr \"{0} M\"\n\n#. Key:\tsave_slots_remove_confirm_subtext\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"remove save slot confirm dialogue\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Progress will be lost\"\nmsgstr \"Les progrès vont être perdus\"\n\n#. Key:\tsave_slots_select\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"loads the game or creates a new one using the active slot\"\n#. Key:\tselect\n#. InfoMetaData:\t\"Comment\" : \"Button\"\n#. Key:\tspell_cast_switch_select\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Select\"\nmsgstr \"Sélectionner\"\n\n#. Key:\tsaves\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Menu saves\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Save Slots\"\nmsgstr \"Slots de Sauvegarde\"\n\n#. Key:\tseconds\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"seconds\"\nmsgstr \"secondes\"\n\n#. Key:\tselect_spells\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input right  thumbstick\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Select spells\"\nmsgstr \"Sélectionner les Sorts\"\n\n#. Key:\tsell\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"sell item\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Sell\"\nmsgstr \"Vendre\"\n\n#. Key:\tsend_automatically\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Analytics popup\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Send Automatically\"\nmsgstr \"Envoyer Automatiquement\"\n\n#. Key:\tsend_no\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Analytics popup\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Do not Send\"\nmsgstr \"Ne pas Envoyer\"\n\n#. Key:\tsettings\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Menu settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Settings\"\nmsgstr \"Options\"\n\n#. Key:\tsettings_antialising\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Anti-Aliasing\"\nmsgstr \"Anti-Aliasing\"\n\n#. Key:\tsettings_antialising_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Smooths out the edges by blending the colors of the pixels around the object to create the illusion of smoothness.\"\nmsgstr \"Lisse les bords en mélangeant les couleurs des pixels autour de l'objet pour créer une illusion de finesse.\"\n\n#. Key:\tsettings_apply\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Apply\"\nmsgstr \"Appliquer\"\n\n#. Key:\tsettings_aspect_ratio\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Aspect Ratio\"\nmsgstr \"Formats d'Affichage\"\n\n#. Key:\tsettings_aspect_ratio_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Defines what aspect ratios are available for your resolution.\"\nmsgstr \"Définit les formats d'image disponibles pour votre résolution.\"\n\n#. Key:\tsettings_audio\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Settings panels\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Audio\"\nmsgstr \"Audio\"\n\n#. Key:\tsettings_auto_detect_controller\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Gamepad settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Auto detect Gamepad Layout\"\nmsgstr \"Auto-Détection de la Manette\"\n\n#. Key:\tsettings_borderless\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Borderless\"\nmsgstr \"Sans Bordures\"\n\n#. Key:\tsettings_brightness\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Settings panels\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Brightness\"\nmsgstr \"Luminosité\"\n\n#. Key:\tsettings_brightness_default_value\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Brightness settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Default Value is 100%\"\nmsgstr \"La valeur par défaut est de 100%\"\n\n#. Key:\tsettings_brightness_description\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Brightness settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Please adjust the brightness of the game to your display\"\nmsgstr \"Veuillez régler la luminosité du jeu en fonction de votre écran\"\n\n#. Key:\tsettings_collect_analytics\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Game Settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Collect Usage Statistics\"\nmsgstr \"Collecter des Statistiques\"\n\n#. Key:\tsettings_collect_analytics_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Game Settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"These are not used to identify individuals, but help us to understand players needs to improve our game.\"\nmsgstr \"Cela ne sert pas à identifier les individus, mais nous aident à comprendre les besoins des joueurs pour améliorer notre jeu.\"\n\n#. Key:\tsettings_confirm_display_title\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings confirm\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Confirm Display Settings in\"\nmsgstr \"Confirmez les paramètres d'affichage\"\n\n#. Key:\tsettings_controller\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Settings panels\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Gamepad\"\nmsgstr \"Manette\"\n\n#. Key:\tsettings_controller_platform\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Gamepad Layout settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Layout\"\nmsgstr \"Disposition\"\n\n#. Key:\tsettings_controller_remap\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Gamepad settings\"\n#. Key:\tsettings_controller_remap_single\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Remap Controls\"\nmsgstr \"Modifier les Contrôles\"\n\n#. Key:\tsettings_controller_remap_noedit\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Gamepad settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Please use a gamepad in order to remap\"\nmsgstr \"Veuillez utiliser une manette de jeu pour modifier les contrôles\"\n\n#. Key:\tsettings_controller_switch\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Settings panels\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Controls\"\nmsgstr \"Contrôles\"\n\n#. Key:\tsettings_display\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Settings panels\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Display\"\nmsgstr \"Affichage\"\n\n#. Key:\tsettings_display_damage\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Game settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Display Damage\"\nmsgstr \"Afficher les Dégats\"\n\n#. Key:\tsettings_display_damage_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Game settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Show damage as a floating number on the screen\"\nmsgstr \"Afficher les dommages sous la forme d'un nombre flottant à l'écran\"\n\n#. Key:\tsettings_display_enemy_hp\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Game settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Display Enemy Health\"\nmsgstr \"Affichage de la Santé des Ennemis\"\n\n#. Key:\tsettings_display_enemy_hp_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Game settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Show a small health bar above injured enemies\"\nmsgstr \"Montrez une petite barre de santé au-dessus des ennemis blessés\"\n\n#. Key:\tsettings_display_floating_vo\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Game settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Display Floating Voice Lines\"\nmsgstr \"Affichage des Textes de Voix\"\n\n#. Key:\tsettings_display_floating_vo_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Game settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Show voice lines as floating texts\"\nmsgstr \"Afficher les voix sous forme de textes flottants\"\n\n#. Key:\tsettings_display_fps\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Game settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Display FPS\"\nmsgstr \"Afficher les FPS\"\n\n#. Key:\tsettings_display_fps_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Game settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Show FPS counter\"\nmsgstr \"Afficher le compteur de FPS\"\n\n#. Key:\tsettings_display_mode\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Display Mode\"\nmsgstr \"Mode d'Affichage\"\n\n#. Key:\tsettings_display_mode_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"In Windowed mode you can interact with other windows easier. In Borderless mode you can quickly switch between applications.\"\nmsgstr \"En mode fenêtré, vous pouvez interagir plus facilement avec d'autres fenêtres. En mode sans bordure, vous pouvez passer rapidement d'une application à l'autre.\"\n\n#. Key:\tsettings_display_play_time\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Game settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Display Play Time\"\nmsgstr \"Afficher le temps de jeu\"\n\n#. Key:\tsettings_display_play_time_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Game settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Show current play time\"\nmsgstr \"Afficher le temps de jeu actuel\"\n\n#. Key:\tsettings_effects\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Effect Quality\"\nmsgstr \"Qualité des Effets\"\n\n#. Key:\tsettings_effects_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Affects the quality of particles in the world, a lower quality might make some projectiles in the world harder to see.\"\nmsgstr \"Affecte la qualité des particules à l'écran, une qualité inférieure pourrait rendre certains projectiles plus difficiles à voir.\"\n\n#. Key:\tsettings_effects_volume\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Audio settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Sound Effects volume\"\nmsgstr \"Volume des Effets Sonores\"\n\n#. Key:\tsettings_effects_volume_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Audio settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Adjust the sound effects volume\"\nmsgstr \"Régler le volume des effets sonores\"\n\n#. Key:\tsettings_force_weak_hardware_opt\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Additional Optimizations\"\nmsgstr \"Optimisations Supplémentaires\"\n\n#. Key:\tsettings_force_weak_hardware_opt_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"In certain areas background traps are deactivated or background visuals look cheaper to gain more performance.\"\nmsgstr \"Dans certaines zones, les pièges à l'arrière-plan sont désactivés ou les images d'arrière-plan semblent moins attrayantes pour obtenir de meilleures performances.\"\n\n#. Key:\tsettings_fps_unlimited\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings frame limit\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Unlimited\"\nmsgstr \"Sans limites\"\n\n#. Key:\tsettings_frame_limit\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Frame Limit (FPS)\"\nmsgstr \"Limite d'Images par Seconde (FPS)\"\n\n#. Key:\tsettings_frame_limit_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Limit the maximum frame rate for a consistent experience.\"\nmsgstr \"Limiter la fréquence d'images maximale pour une expérience cohérente.\"\n\n#. Key:\tsettings_fullscreen\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Fullscreen\"\nmsgstr \"Plein Écran\"\n\n#. Key:\tsettings_game\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Settings panels\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Game\"\nmsgstr \"Jeu\"\n\n#. Key:\tsettings_game_speed\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Game settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Game Speed\"\nmsgstr \"Vitesse du Jeu\"\n\n#. Key:\tsettings_game_speed_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Game settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Changes the speed of the game.\\nHigher speed might make the game have lower FPS.\"\nmsgstr \"Changer la vitesse du jeu.\\nUne vitesse plus élevée peut faire baisser le FPS du jeu.\"\n\n#. Key:\tsettings_gamepad_vibration\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Gamepad Vibration intensity settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Vibration\"\nmsgstr \"Vibration\"\n\n#. Key:\tsettings_keyboard\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Settings panels\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Keyboard\"\nmsgstr \"Clavier\"\n\n#. Key:\tsettings_keyboard_remap_noedit\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Keyboard Settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Please use a keyboard in order to change the keyboard input\"\nmsgstr \"Veuillez utiliser un clavier afin de modifier les touches\"\n\n#. Key:\tsettings_language\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Game settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Language\"\nmsgstr \"Langue\"\n\n#. Key:\tsettings_language_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Game settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Change the display and locale (numbers, dates) language\"\nmsgstr \"Changer la langue d'affichage et de localisation (chiffres, dates)\"\n\n#. Key:\tsettings_master_volume\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Audio settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Master volume\"\nmsgstr \"Volume principal\"\n\n#. Key:\tsettings_master_volume_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Audio settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Adjust the master volume\"\nmsgstr \"Ajuster le volume principal\"\n\n#. Key:\tsettings_merciful_bounce\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"game settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Merciful Bounce Mode\"\nmsgstr \"Mode de Rebond Simplifié\"\n\n#. Key:\tsettings_merciful_bounce_always\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"defines when (in which difficulty mode) is the easier bounce mode active\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Always\"\nmsgstr \"Toujours\"\n\n#. Key:\tsettings_merciful_bounce_never\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"defines when (in which difficulty mode) is the easier bounce mode active\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Never\"\nmsgstr \"Jamais\"\n\n#. Key:\tsettings_merciful_bounce_on_easy\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"defines when (in which difficulty mode) is the easier bounce mode active\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"On Easy\"\nmsgstr \"En Facile\"\n\n#. Key:\tsettings_merciful_bounce_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"tooltip for Merciful Bounce Mode option\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Allows Higher Bounce even if the Jump button is pressed after the character hits the ground\"\nmsgstr \"Permet un Rebond plus important même si le bouton de Saut est appuyé après que le personnage ait touché le sol\"\n\n#. Key:\tsettings_move_left_right\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Move left/right\"\nmsgstr \"Déplacement gauche/droite\"\n\n#. Key:\tsettings_music_volume\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Audio settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Music volume\"\nmsgstr \"Volume des musiques\"\n\n#. Key:\tsettings_music_volume_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Audio settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Adjust the music volume\"\nmsgstr \"Ajuster le volume des musiques\"\n\n#. Key:\tsettings_mute_audio\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Audio settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Mute audio\"\nmsgstr \"Couper l'audio\"\n\n#. Key:\tsettings_mute_audio_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Audio settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Mute all audio\"\nmsgstr \"Couper tout l'audio\"\n\n#. Key:\tsettings_mute_audio_unfocused\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Audio settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Mute audio when in background\"\nmsgstr \"Couper le son en arrière-plan\"\n\n#. Key:\tsettings_mute_audio_unfocused_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Audio settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Mute the audio when the game window is not in focus\"\nmsgstr \"Couper le son lorsque la fenêtre du jeu n'est pas affichée\"\n\n#. Key:\tsettings_mute_dialogue_voice\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Audio settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Mute voices in dialogues\"\nmsgstr \"Voix muettes en dialogues\"\n\n#. Key:\tsettings_mute_dialogue_voice_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Audio settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Mute the gibberish voices inside the dialogues\"\nmsgstr \"Fait taire le charabia des dialogues\"\n\n#. Key:\tsettings_mute_voice\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Audio settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Mute voices outside of dialogues\"\nmsgstr \"Voix muettes en dehors des dialogues\"\n\n#. Key:\tsettings_mute_voice_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Audio settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Mute the gibberish voices outside the dialogues\"\nmsgstr \"Fait taire le charabia en dehors des dialogues\"\n\n#. Key:\tsettings_pause_game_idle\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Game settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Pause game when idle\"\nmsgstr \"Pause du jeu en cas d'inactivité\"\n\n#. Key:\tsettings_pause_game_idle_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Game settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Pauses the game when the user is idle for a certain amount of minutes\"\nmsgstr \"Met le jeu en pause lorsque l'utilisateur est inactif pendant un certain nombre de minutes\"\n\n#. Key:\tsettings_pause_game_unfocused\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Game settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Pause game when unfocused\"\nmsgstr \"Pause de la partie hors de l'écran\"\n\n#. Key:\tsettings_pause_game_unfocused_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Game settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Pauses the game when the game loses focus\"\nmsgstr \"Met le jeu en pause lorsque le jeu n'est plus affiché\"\n\n#. Key:\tsettings_post_effects\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Post-Effects\"\nmsgstr \"Post-Effects\"\n\n#. Key:\tsettings_post_effects_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Affects the quality of the post process effects after the scene is rendered.\"\nmsgstr \"Affecte la qualité des effets post-processus après le rendu de la scène.\"\n\n#. Key:\tsettings_quality_epic\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings quality\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Epic\"\nmsgstr \"Épique\"\n\n#. Key:\tsettings_quality_high\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings quality\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"High\"\nmsgstr \"Haut\"\n\n#. Key:\tsettings_quality_low\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings quality\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Low\"\nmsgstr \"Bas\"\n\n#. Key:\tsettings_quality_medium\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings quality\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Medium\"\nmsgstr \"Moyen\"\n\n#. Key:\tsettings_ratio_16_10\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings Aspect Ratio\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"16:10\"\nmsgstr \"16:10\"\n\n#. Key:\tsettings_ratio_16_9\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings Aspect Ratio\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"16:9\"\nmsgstr \"16:9\"\n\n#. Key:\tsettings_ratio_4_3\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings Aspect Ratio\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"4:3\"\nmsgstr \"4:3\"\n\n#. Key:\tsettings_reset\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Reset\"\nmsgstr \"Annuler\"\n\n#. Key:\tsettings_reset_default\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Settings reset to default\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Reset to Defaults\"\nmsgstr \"Rétablissement par défaut\"\n\n#. Key:\tsettings_reset_input_key\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input reset key to default\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Reset button to default\"\nmsgstr \"Réinitialiser le bouton par défaut\"\n\n#. Key:\tsettings_resolution\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Resolution\"\nmsgstr \"Résolution\"\n\n#. Key:\tsettings_resolution_entry\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings. {0} - x, {1} - Y\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"{0}x{1}\"\nmsgstr \"{0}x{1}\"\n\n#. Key:\tsettings_resolution_scale\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Resolution Scale\"\nmsgstr \"Échelle de Résolution\"\n\n#. Key:\tsettings_resolution_scale_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"The desired resolution to use when rendering the game. It does not affect the UI.\\nLowering it improves performance on lower end machines.\"\nmsgstr \"La résolution souhaitée à utiliser lors du rendu du jeu. Elle n'affecte pas l'interface utilisateur.\\nEn l'abaissant, on améliore les performances sur les machines bas de gamme.\"\n\n#. Key:\tsettings_resolution_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Allows changing the Screen Resolution.\"\nmsgstr \"Permet de modifier la Résolution de l'Écran.\"\n\n#. Key:\tsettings_select_another\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Settings input\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Select another\"\nmsgstr \"Choisir autre chose\"\n\n#. Key:\tsettings_shadows\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Shadow Quality\"\nmsgstr \"Qualité des Ombres\"\n\n#. Key:\tsettings_shadows_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"The higher the quality the finer the shadow.\"\nmsgstr \"Plus la qualité est élevée, plus l'ombre est fine.\"\n\n#. Key:\tsettings_textures\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Texture Quality\"\nmsgstr \"Qualité des Textures\"\n\n#. Key:\tsettings_textures_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Surfaces of the game world will increase in fidelity if the setting is higher.\"\nmsgstr \"La fidélité des surfaces du monde du jeu augmentera si le paramètre est plus élevé.\"\n\n#. Key:\tsettings_unknown\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Unknown\"\nmsgstr \"Inconnu\"\n\n#. Key:\tsettings_volumetric_fog\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Volumetric Fog\"\nmsgstr \"Brume Volumétrique\"\n\n#. Key:\tsettings_volumetric_fog_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Realistic looking fog. Has a high performance impact, disable it to improve performance.\"\nmsgstr \"Un brouillard réaliste. A un impact élevé sur les performances, désactivez-le pour améliorer les performances.\"\n\n#. Key:\tsettings_vsync\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Vertical Sync\"\nmsgstr \"Synchronisation Verticale\"\n\n#. Key:\tsettings_vsync_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Synchronize the game refresh rate with the monitor refresh rate. Disable it for higher framerate and better input response.\\nWhen enabled it prevents screen tearing.\"\nmsgstr \"Synchronisez le taux de rafraîchissement du jeu avec le taux de rafraîchissement du moniteur. Désactivez pour obtenir une cadence de rafraîchissement plus élevée et une meilleure réponse en retour.\\nLorsque cette fonction est activée, elle empêche le tearing de l'écran.\"\n\n#. Key:\tsettings_windowed\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Windowed\"\nmsgstr \"Fenêtré\"\n\n#. Key:\tskip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"text near the press and hold to skip confirmation button\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Skip\"\nmsgstr \"Passer\"\n\n#. Key:\tspell_cast_switch_controls\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Quick select spells up/down/left/right\"\nmsgstr \"Sélection rapide des pouvoirs haut/bas/gauche/droite\"\n\n#. Key:\tspell_cast_switch_select_cast\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Select & Cast\"\nmsgstr \"Sélection & Lancement\"\n\n#. Key:\tspell_cooldown_stops_in_air\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Spell\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Cooldown only starts on ground\"\nmsgstr \"Le rechargement ne débute que sur le sol\"\n\n#. Key:\tspell_only_in_air\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Spell\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Can not be used in air\"\nmsgstr \"Ne peut pas être utilisé en l'air\"\n\n#. Key:\tspell_restricted\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Spell\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Can not be used in restricted areas\"\nmsgstr \"Ne peut pas être utilisé dans les zones réglementées\"\n\n#. Key:\tstart\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"The name of the checkpoint. Custom Map action\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Start\"\nmsgstr \"Démarrer\"\n\n#. Key:\tstart_game\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Menu Start Game\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Start Game\"\nmsgstr \"Démarrer une Partie\"\n\n#. Key:\tstats_usage_description\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Analytics popup\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Not Yet would like to collect usage statistics from your game automatically.\\nThese are not used to identify individuals, but help us to understand players needs to improve our game.\\n\\nSelect \\\"Send Automatically\\\" to allow collection of usage statistics,\\nor \\\"Do Not Send\\\" to prevent the game from sending information to Not Yet.\\n\\nYou can change this setting at any time via the Settings Game tab.\"\nmsgstr \"Not Yet souhaite collecter automatiquement les statistiques relatives à votre usage du jeu.\\nCelles-ci ne servent pas à identifier des individus, mais nous aident à comprendre les besoins des joueurs pour améliorer notre jeu.\\n\\nSélectionnez \\\"Envoyer automatiquement\\\" pour permettre la collecte des statistiques,\\nou \\\"Ne Pas Envoyer\\\" pour empêcher le jeu d'envoyer des informations à Not Yet.\\n\\nVous pouvez modifier ce paramètre à tout moment via l'onglet Paramètres du Jeu.\"\n\n#. Key:\tstats_usage_title\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Analytics popup\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Usage Statistics\"\nmsgstr \"Statistiques d'Usage\"\n\n#. Key:\tstatus\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Status of a save/custom map\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Status\"\nmsgstr \"Statut\"\n\n#. Key:\tsteam_main_game\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Wishlist\"\nmsgstr \"Liste de Souhaits\"\n\n#. Key:\tsteam_main_game_buy\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Buy Full Game\"\nmsgstr \"Acheter un jeu complet\"\n\n#. Key:\tSwitch_FaceButton_Bottom\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"B Button\"\nmsgstr \"bouton B\"\n\n#. Key:\tSwitch_FaceButton_Left\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Y Button\"\nmsgstr \"bouton Y\"\n\n#. Key:\tSwitch_FaceButton_Right\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"A Button\"\nmsgstr \"bouton A\"\n\n#. Key:\tSwitch_FaceButton_Top\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"X Button\"\nmsgstr \"bouton X\"\n\n#. Key:\tSwitch_Gamepad_LeftStick_Down\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \" Switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Left Stick Down\"\nmsgstr \"stick gauche - bas\"\n\n#. Key:\tSwitch_Gamepad_LeftStick_Left\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \" Switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Left Stick Left\"\nmsgstr \"stick gauche - gauche\"\n\n#. Key:\tSwitch_Gamepad_LeftStick_Right\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \" Switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Left Stick Right\"\nmsgstr \"stick gauche - droite\"\n\n#. Key:\tSwitch_Gamepad_LeftStick_Up\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \" Switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Left Stick Up\"\nmsgstr \"stick gauche - haut\"\n\n#. Key:\tSwitch_Gamepad_RightStick_Down\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \" Switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Right Stick Down\"\nmsgstr \"stick droit - bas\"\n\n#. Key:\tSwitch_Gamepad_RightStick_Left\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \" Switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Right Stick Left\"\nmsgstr \"stick droit - gauche\"\n\n#. Key:\tSwitch_Gamepad_RightStick_Right\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \" Switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Right Stick Right\"\nmsgstr \"stick droit - droite\"\n\n#. Key:\tSwitch_Gamepad_RightStick_Up\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \" Switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Right Stick Up\"\nmsgstr \"stick droit - haut\"\n\n#. Key:\tSwitch_LeftThumbstick\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \" Switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Left Stick\"\nmsgstr \"stick gauche\"\n\n#. Key:\tSwitch_RightThumbstick\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \" Switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Right Stick\"\nmsgstr \"stick droit\"\n\n#. Key:\tSwitch_Shoulder_Left\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"L Button\"\nmsgstr \"bouton L\"\n\n#. Key:\tSwitch_Shoulder_Right\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"R Button\"\nmsgstr \"bouton R\"\n\n#. Key:\tSwitch_special_dpad_down\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \" Switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Down Button\"\nmsgstr \"bouton Bas\"\n\n#. Key:\tSwitch_special_dpad_left\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \" Switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Left Button\"\nmsgstr \"bouton Gauche\"\n\n#. Key:\tSwitch_special_dpad_right\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \" Switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Right Button\"\nmsgstr \"bouton Droite\"\n\n#. Key:\tSwitch_special_dpad_up\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \" Switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Up Button\"\nmsgstr \"bouton Haut\"\n\n#. Key:\tSwitch_special_left\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"- Button\"\nmsgstr \"bouton -\"\n\n#. Key:\tSwitch_special_right\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"+ Button\"\nmsgstr \"bouton +\"\n\n#. Key:\tSwitch_Trigger_Left\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"ZL Button\"\nmsgstr \"bouton ZL\"\n\n#. Key:\tSwitch_Trigger_Right\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"ZR Button\"\nmsgstr \"bouton ZR\"\n\n#. Key:\tteleport_to_cp\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Menu Teleport To Checkpoint\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Teleport To Checkpoint\"\nmsgstr \"Se Téléporter au Point de Contrôle\"\n\n#. Key:\tteleport_to_sk\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Menu Teleport to Soulkeeper\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Teleport To SoulKeeper\"\nmsgstr \"Se Téléporter au Gardien des Âmes\"\n\n#. Key:\tthank_you_prologue\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"THANK YOU FOR PLAYING WARRIORB DEMO PROLOGUE, WE HOPE YOU HAD A GREAT TIME!\"\nmsgstr \"MERCI D'AVOIR JOUÉ AU PROLOGUE DÉMO DE WARRIORB, NOUS ESPÉRONS QUE VOUS AVEZ PASSÉ UN BON MOMENT !\"\n\n#. Key:\ttotal_deaths\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Stats for saves\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Total Deaths\"\nmsgstr \"Total des Morts\"\n\n#. Key:\ttrade_amount_x_x\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"trade confirmation UI. {0} is the current amount and {1} is the current amount times price per item\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"{0} for {1} gold\"\nmsgstr \"{0} pour {1} d'or\"\n\n#. Key:\ttrade_buy\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"trade confirmation UI\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Are you sure you want to buy {ItemName} for {Gold} gold?\"\nmsgstr \"Êtes-vous sûr de vouloir acheter {ItemName} pour {Gold} d'or ?\"\n\n#. Key:\ttrade_buy_back\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"trade confirmation UI\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Are you sure you want to buy back {ItemName} for {Gold} gold?\"\nmsgstr \"Êtes-vous sûr de vouloir racheter {ItemName} pour {Gold} d'or ?\"\n\n#. Key:\ttrade_no_intrested\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"trade confirmation UI\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"The trader is not interested in buying that item from you!\"\nmsgstr \"Le vendeur n'est pas intéressé par l'achat de cet article !\"\n\n#. Key:\ttrade_nope\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"trade confirmation UI\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Nope!\"\nmsgstr \"Nope !\"\n\n#. Key:\ttrade_okay\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"trade confirmation UI\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Okay...\"\nmsgstr \"D'accord...\"\n\n#. Key:\ttrade_sell\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"trade confirmation UI\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Are you sure you want to sell {ItemName} for {Gold} gold?\"\nmsgstr \"Êtes-vous sûr de vouloir vendre {ItemName} pour {Gold} d'or ?\"\n\n#. Key:\ttwitter\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Twitter\"\nmsgstr \"Twitter\"\n\n#. Key:\tunknown\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Unknown input binding\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"UNKNOWN\"\nmsgstr \"INCONNU\"\n\n#. Key:\twarriorb\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"WarriOrb\"\nmsgstr \"WarriOrb\"\n\n#. Key:\txp\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Experience Points\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"XP\"\nmsgstr \"EXP\"\n\n#. Key:\tyes\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Confirm popup\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Yes\"\nmsgstr \"Oui\"\n\n"
  },
  {
    "path": "Content/Localization/WarriorbDemo/hu/WarriorbDemo.po",
    "content": "﻿# WarriorbDemo Hungarian translation.\n# Copyright 1998-2019 Epic Games, Inc. All Rights Reserved.\n# \nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: WarriorbDemo\\n\"\n\"POT-Creation-Date: 2020-10-07 08:08\\n\"\n\"PO-Revision-Date: 2020-10-07 08:08\\n\"\n\"Language-Team: \\n\"\n\"Language: hu\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Plural-Forms: nplurals=2; plural=(n != 1);\\n\"\n\n#. Key:\tact1_loading\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"You are a Mighty Spirit from the Unknown Realm. You were torn away from your home by a pathetic mortal Wizard. After a magical accident your essence is bound to an unlikely body. Find a way out of your ball-body prison!\"\nmsgstr \"Az Ismeretlen Világ Nagyhatalmú Szellemeként létezésed békés és nyugodt, még valami szánalmas földi varázsló ki nem rángat otthonodból. Ráadásul a félresikerült idézésnek és a sors fintorának hála fenséges esszenciád egy rongyokból összevart labdatestbe kerül. Meg kell találnod a módját, hogy szabadulj ki a kellemetlen helyzetből!\"\n\n#. Key:\tact2_loading\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Reaching Crossroad Cave you are a step closer to the Three Artifacts - and to freedom.\"\nmsgstr \"Keresztút Kőt elérve egy lépéssel közelebb vagy a Tárgyakhoz - és a szabadsághoz.\"\n\n#. Key:\tact3_loading\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Finding the Three Artifacts required all your skills and strength. You hope that delivering them to the Wizard will be less difficult.\"\nmsgstr \"A Három Varázstárgy felkutatása minden erődet igénybe vette. Reméled, hogy az elszállításuk már sima ügy lesz.\"\n\n#. Key:\tact_1\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"text displayed on black screen the first time a chapter is started\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Act I\"\nmsgstr \"I. Felvonás\"\n\n#. Key:\tact_2\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"text displayed on black screen the first time a chapter is started\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Act II\"\nmsgstr \"II. Felvonás\"\n\n#. Key:\tact_3\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"text displayed on black screen the first time a chapter is started\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Act III\"\nmsgstr \"III. Felvonás\"\n\n#. Key:\tancient_arcade\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an area\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Ancient Arcade\"\nmsgstr \"Antik Árkád\"\n\n#. Key:\tbubble_border\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an area\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Bubble Border\"\nmsgstr \"Hűvös Határ\"\n\n#. Key:\tcerulean_city\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an area\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Cerulean City\"\nmsgstr \"Mélykék Metropolisz\"\n\n#. Key:\tchasm_chamber\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an area\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Chasm Chamber\"\nmsgstr \"Csonka Csarnok\"\n\n#. Key:\tcrossroad_cave\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an area\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Crossroad Cave\"\nmsgstr \"Keresztút Kő\"\n\n#. Key:\tdarkest_dungeon\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an area\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Darkest Dungeon\"\nmsgstr \"Vak Vájat\"\n\n#. Key:\tdwarven_dungeons\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an area\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Dwarven Dungeons\"\nmsgstr \"Törp Tárnák\"\n\n#. Key:\tending_loading\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Finally! You did your part of the deal, now it's the Wizard's turn to get you back home.\"\nmsgstr \"Végre! Teljesítetted az alku rád eső részét, most a Varázslón a sor, hogy haza juttasson.\"\n\n#. Key:\tepilogue\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"text displayed on black screen the first time a chapter is started\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Epilogue\"\nmsgstr \"Befejezés\"\n\n#. Key:\tgrey_gate\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an area\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Grey Gate\"\nmsgstr \"Kék Kapu\"\n\n#. Key:\thallowed_heart\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an area, Hallowed as in made holy; consecrated.\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Hallowed Heart\"\nmsgstr \"Szobor Szentély\"\n\n#. Key:\tintro_subtitle_0\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" intro subtitle line 1\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"I wish I could just... turn back time to undo what I have done.\"\nmsgstr \"Bár visszafordíthatnám az időt... hogy mindent helyrehozhassak.\"\n\n#. Key:\tintro_subtitle_1\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" intro subtitle line 01\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"However the past is behind us\"\nmsgstr \"De a múlt felett nincs hatalmunk.\"\n\n#. Key:\tintro_subtitle_2\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" intro subtitle line 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"and all I can change now\"\nmsgstr \"Az egyetlen, amit még megváltoztathatok...\"\n\n#. Key:\tintro_subtitle_3\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" intro subtitle line 3\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"is the future.\"\nmsgstr \"az a jövő.\"\n\n#. Key:\tlast_land\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an area\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Last Land\"\nmsgstr \"Végső Váró\"\n\n#. Key:\tlava_lair\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an area\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Lava Lair\"\nmsgstr \"Tűz Templom\"\n\n#. Key:\tloading_tip_act1_0\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 1\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"In Ball form you go faster.\"\nmsgstr \"Labda formában gyorsabb vagy.\"\n\n#. Key:\tloading_tip_act1_1\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 1\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"In Ball form you bounce back when you hit a surface.\"\nmsgstr \"Labda formában visszapattansz a földről és a falakról.\"\n\n#. Key:\tloading_tip_act1_2\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 1\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Each weapon has its own unique special strike.\"\nmsgstr \"Minden fegyvernek megvan a maga saját különleges csapása.\"\n\n#. Key:\tloading_tip_act1_3\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 1\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Most of the people died after Ruin happened, but there are still some survivors.\"\nmsgstr \"Nagyon sokan estek a Fertőzés áldozatául, de azért akad pár túlélő.\"\n\n#. Key:\tloading_tip_act1_4\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 1\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Some items can’t be used but merchants still like to buy them.\"\nmsgstr \"Van pár tárgy, ami az égvilágon semmire sem jó, de a kereskedők ettől függetlenül is előszeretettel vásárolják őket.\"\n\n#. Key:\tloading_tip_act1_5\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 1\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"There are many keys, and when I say many, I mean it.\"\nmsgstr \"Nagyon sok kulcs van. Tényleg nagyon sok.\"\n\n#. Key:\tloading_tip_act1_6\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 1\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"When you find an item it would make sense to check what it is, wouldn’t it?\"\nmsgstr \"Ha találsz egy új tárgyat, nem ártana elolvasni a leírását, nem igaz?\"\n\n#. Key:\tloading_tip_act1_7\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 1\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Spells can make combat easier.\"\nmsgstr \"A varázslatok sokat könnyíthetnek a harcokon.\"\n\n#. Key:\tloading_tip_act1_8\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 1\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Dying often is absolutely normal. If you don’t die a lot, you are doing something wrong.\"\nmsgstr \"Teljesen normális, ha sűrűn elhalálozol. Sőt, ha gyanúsan sokáig nem halsz meg, akkor valamit rosszul csinálsz.\"\n\n#. Key:\tloading_tip_act1_9\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 1\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"You can always check the Sidenotes in your Inventory to see if you have any side quests.\"\nmsgstr \"A Jegyzetek-ben mindig ellenőrizheted, van-e valamilyen másodküldetésed.\"\n\n#. Key:\tloading_tip_act2_0\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Using the Railway can shorten your journey.\"\nmsgstr \"A Vasúttal sok időt spórolhatsz meg.\"\n\n#. Key:\tloading_tip_act2_1\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"We’ll try to make our next game without any loading screens, we promise...\"\nmsgstr \"A következő játékunkat megpróbáljuk töltőképernyők nélkül csinálni...\"\n\n#. Key:\tloading_tip_act2_2\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Choosing the right weapon against a Boss will make your life easier.\"\nmsgstr \"Ha jó fegyvert választasz, az lényegesen könnyíthet a Boss harcokon.\"\n\n#. Key:\tloading_tip_act2_3\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Don’t forget to use the Soulkeeper!\"\nmsgstr \"Ne feledkezz meg a Lélekőrről!\"\n\n#. Key:\tloading_tip_act2_4\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Finding the Artefacts might be hard, but this is your only chance to get out.\"\nmsgstr \"A Varázstárgyakat felkutatni nem egyszerű feladat, de ez az egyetlen esélyed a szabadulásra.\"\n\n#. Key:\tloading_tip_act2_5\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Talk to any Survivor if you can. They might be able to help you.\"\nmsgstr \"Próbálj szóba elegyedni a túlélőkkel! Nem kizárt, hogy tudnak segíteni rajtad.\"\n\n#. Key:\tloading_tip_act2_6\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"If you find an area too difficult you can always go to another area first.\"\nmsgstr \"Ha egy területet túl nehéznek találsz, érdemes lehet más részeket felfedezni először.\"\n\n#. Key:\tloading_tip_act2_7\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Don’t forget to spend your gold! (Ad sponsored by Gnory)\"\nmsgstr \"Ne felejtsd el elkölteni az aranyadat! (Gnory üzleti hirdetése)\"\n\n#. Key:\tloading_tip_act2_8\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Equipping the right items will make the combat easier.\"\nmsgstr \"A megfelelő tárgyak használata sokat segíthet a harcokban.\"\n\n#. Key:\tloading_tip_act2_9\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"If you manage to defeat every member of a group you won’t have to fight them ever again.\"\nmsgstr \"Ha egy Csoport minden tagját legyőzöd, többet nem kell megküzdened velük.\"\n\n#. Key:\tloading_tip_act3_0\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 3\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Using the Railway can also make your Journey longer.\"\nmsgstr \"A Vasúttal sok időt veszthetsz is...\"\n\n#. Key:\tloading_tip_act3_1\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 3\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"If you got this far, you surely know everything now.\"\nmsgstr \"Ha egész idáig eljutottál, akkor már mindent tudsz, nincs szükséged tippekre.\"\n\n#. Key:\tloading_tip_act3_2\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 3\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Loading screen tips are very useful - except in a few cases.\"\nmsgstr \"A töltőképernyőn lévő tippek nagyon hasznosak... a legtöbb esetben.\"\n\n#. Key:\tloading_tip_act3_3\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 3\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Now is your time to think about the fate of the Ruined Realm.\"\nmsgstr \"Most van időd átgondolni a Fertőzött Földek sorsát.\"\n\n#. Key:\tloading_tip_act3_4\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 3\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"The End is near... I mean no loading screen can take forever, right?\"\nmsgstr \"Közel a Vég... Úgy értem, egy loading screen sem tart örökké, nem igaz?\"\n\n#. Key:\tloading_tip_act3_5\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 3\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Now your only task is to bring the Artefacts to Wizard.\"\nmsgstr \"Most már csak vissza kell vinned a Varázstárgyakat Varázslónak.\"\n\n#. Key:\tloading_tip_act3_6\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 3\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"If you find a combat too hard try to use different shards, spells, and weapons.\"\nmsgstr \"Ha egy harcot túl nehéznek találsz, próbálj ki más szilánkokat, varázslatokat és fegyvereket.\"\n\n#. Key:\tloading_tip_act3_7\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 3\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Don’t give up! Victory is close.\"\nmsgstr \"Ne add fel! Közel a győzelem.\"\n\n#. Key:\tloading_tip_end_0\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for epilogue\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"The Human Realm is a weird place...\"\nmsgstr \"Az emberek világa egy fura hely...\"\n\n#. Key:\tloading_tip_end_1\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for epilogue\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"You really did your part of the deal, now it’s time to go home!\"\nmsgstr \"Te igazán teljesítetted az alku rád eső részét. Most a Varázslón a sor, hogy állja a szavát!\"\n\n#. Key:\tloading_tip_end_2\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for epilogue\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Should you care about the fate of the Realms?\"\nmsgstr \"Miért kellene törődnöd a Világok sorsával?\"\n\n#. Key:\tloading_tip_end_3\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for epilogue\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Looks like it’s always you who has to take care of the mess others left behind.\"\nmsgstr \"Úgy tűnik, végül mindig neked kell rendbe hozni a dolgokat, amiket mások elcsesznek.\"\n\n#. Key:\tloading_tip_end_4\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for epilogue\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Time to finish what you started. One way or another.\"\nmsgstr \"Itt az ideje pontot tenni az ügy végére. Így, vagy úgy.\"\n\n#. Key:\tlost_land\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an area\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Lost Land\"\nmsgstr \"Örök Öböl\"\n\n#. Key:\tobedient_outpost\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an area\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Obedient Outpost\"\nmsgstr \"Törvény Torony\"\n\n#. Key:\tperfect_palace\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an area\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Perfect Palace\"\nmsgstr \"Tökély Torony\"\n\n#. Key:\tportal_place\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an area\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Portal Place\"\nmsgstr \"Átjáró Állomás\"\n\n#. Key:\tprogress_act1_arcade1\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Remnants of a Realm\"\nmsgstr \"Egy Birodalom Romjai\"\n\n#. Key:\tprogress_act1_arcade2\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Discovering Ancient Technology\"\nmsgstr \"Ősi Technológia\"\n\n#. Key:\tprogress_act1_before_raven\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Searching for a way out\"\nmsgstr \"Kiutat keresve\"\n\n#. Key:\tprogress_act1_boss_fight\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Facing the Keeper\"\nmsgstr \"Harc a Kapuőrrel\"\n\n#. Key:\tprogress_act1_gem\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Looking for a Gem\"\nmsgstr \"Egy követ keresve\"\n\n#. Key:\tprogress_act1_infuse\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Infusing the Gem\"\nmsgstr \"A Kő feltöltése\"\n\n#. Key:\tprogress_act1_portals\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Looking for a Portal\"\nmsgstr \"Út az Átjáró felé\"\n\n#. Key:\tprogress_act1_start\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Lost in Ruin\"\nmsgstr \"Elveszve a romok közt\"\n\n#. Key:\tprogress_act1_test_stone\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Bouncing Stones\"\nmsgstr \"Pattanó kövek\"\n\n#. Key:\tprogress_act1_tut1\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Am I Worthy?\"\nmsgstr \"Méltó vagyok?\"\n\n#. Key:\tprogress_act1_tut2\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Sewer again\"\nmsgstr \"Megint a Csatorna\"\n\n#. Key:\tprogress_act1_tut3\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Third time Worthy\"\nmsgstr \"Harmadjára Méltó\"\n\n#. Key:\tprogress_act2_crossroad\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"At a crossroad\"\nmsgstr \"Válaszúton\"\n\n#. Key:\tprogress_act2_dwarf_0\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Into the Blue\"\nmsgstr \"A Kék felé\"\n\n#. Key:\tprogress_act2_dwarf_1\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Elevator Gem and Key\"\nmsgstr \"Felvonó Kő és Kulcs\"\n\n#. Key:\tprogress_act2_dwarf_2\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Opening the Gate\"\nmsgstr \"Kapunyitás\"\n\n#. Key:\tprogress_act2_dwarf_boss\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Dwarven Statue\"\nmsgstr \"Törp Szobor\"\n\n#. Key:\tprogress_act2_end\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"To the Fourth Station\"\nmsgstr \"A Negyedik Állomásra\"\n\n#. Key:\tprogress_act2_lava_0\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Into the Red\"\nmsgstr \"A Vörös felé\"\n\n#. Key:\tprogress_act2_lava_1\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Uniting Key Pieces\"\nmsgstr \"Kulcs darabokat egyesítve\"\n\n#. Key:\tprogress_act2_lava_2\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Climbing the Tower\"\nmsgstr \"A Toronyba fel\"\n\n#. Key:\tprogress_act2_lava_boss\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Armour Wrath\"\nmsgstr \"Harag Vért\"\n\n#. Key:\tprogress_act2_ww_0\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Into the Green\"\nmsgstr \"A Zöld felé\"\n\n#. Key:\tprogress_act2_ww_1\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Through the Lake\"\nmsgstr \"Át a Tavon\"\n\n#. Key:\tprogress_act2_ww_2\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Being Followed\"\nmsgstr \"Követve\"\n\n#. Key:\tprogress_act2_ww_boss\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Fallen Druid\"\nmsgstr \"Bukott Druida\"\n\n#. Key:\tprogress_act3_floating\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in act 3\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Floating\"\nmsgstr \"Lebegés\"\n\n#. Key:\tprogress_act3_monk\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in act 3\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Monk's Home\"\nmsgstr \"Szerzetes Otthona\"\n\n#. Key:\tprogress_act3_pipes\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in act 3\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Moving Pipes\"\nmsgstr \"Mozgó Csövek\"\n\n#. Key:\tprogress_act3_start\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in act 3\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Lost in the Caves\"\nmsgstr \"Elveszve a föld alatt\"\n\n#. Key:\tprogress_act3_way_out\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in act 3\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Way out of the Realm\"\nmsgstr \"Kiút\"\n\n#. Key:\tprogress_epilogue_boss\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in epilogue\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"The Real Demon\"\nmsgstr \"Az Igazi Démon\"\n\n#. Key:\tprogress_epilogue_castle\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in epilogue\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Wizard's Castle\"\nmsgstr \"Varázsló Tornya\"\n\n#. Key:\tprogress_epilogue_past_and_future\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in epilogue\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Past and Future\"\nmsgstr \"Múlt és Jövő\"\n\n#. Key:\tprogress_epilogue_save_creatures\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in epilogue\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Chance for everyone\"\nmsgstr \"Esély mindenkinek\"\n\n#. Key:\tprogress_epilogue_separate_worlds\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in epilogue\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Separated Worlds\"\nmsgstr \"Szétválasztott Világok\"\n\n#. Key:\tprologue\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"text displayed on black screen the first time a chapter is started\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Prologue\"\nmsgstr \"Prológus\"\n\n#. Key:\tremnant_road\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an area\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Remnant Road\"\nmsgstr \"Örök Ösvény\"\n\n#. Key:\truined_realm\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Ruined Realm\"\nmsgstr \"Fertőzött Föld\"\n\n#. Key:\tsnake_slide\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an area\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Snake Slide\"\nmsgstr \"Kígyó Kerülő\"\n\n#. Key:\tsunken_sewer\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an area\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Sunken Sewer\"\nmsgstr \"Csöpögő Csatorna\"\n\n#. Key:\twhite_wall\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"White Wall\"\nmsgstr \"Fehér Fellegvár\"\n\n#. Key:\twracked_waters\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an area\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Wracked Waters\"\nmsgstr \"Túlélő Tó\"\n\n#. Key:\tcredits_fmod\n#. SourceLocation:\tLocalization/StringTables/Credits.csv\n#: Localization/StringTables/Credits.csv\nmsgctxt \"Credits\"\nmsgid \"Made with FMOD Studio by Firelight Technologies Pty Ltd.\"\nmsgstr \"Made with FMOD Studio by Firelight Technologies Pty Ltd.\"\n\n#. Key:\tMonthApril\n#. SourceLocation:\tSource/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:17\n#: Source/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:17\nmsgctxt \"DateTimeHelper\"\nmsgid \"April\"\nmsgstr \"Április\"\n\n#. Key:\tMonthAugust\n#. SourceLocation:\tSource/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:21\n#: Source/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:21\nmsgctxt \"DateTimeHelper\"\nmsgid \"August\"\nmsgstr \"Augusztus\"\n\n#. Key:\tMonthDecember\n#. SourceLocation:\tSource/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:26\n#: Source/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:26\nmsgctxt \"DateTimeHelper\"\nmsgid \"December\"\nmsgstr \"December\"\n\n#. Key:\tMonthFebruary\n#. SourceLocation:\tSource/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:15\n#: Source/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:15\nmsgctxt \"DateTimeHelper\"\nmsgid \"February\"\nmsgstr \"Február\"\n\n#. Key:\tMonthJanuary\n#. SourceLocation:\tSource/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:14\n#: Source/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:14\nmsgctxt \"DateTimeHelper\"\nmsgid \"January\"\nmsgstr \"Január\"\n\n#. Key:\tMonthJuly\n#. SourceLocation:\tSource/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:20\n#: Source/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:20\nmsgctxt \"DateTimeHelper\"\nmsgid \"July\"\nmsgstr \"Július\"\n\n#. Key:\tMonthJune\n#. SourceLocation:\tSource/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:19\n#: Source/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:19\nmsgctxt \"DateTimeHelper\"\nmsgid \"June\"\nmsgstr \"Június\"\n\n#. Key:\tMonthMarch\n#. SourceLocation:\tSource/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:16\n#: Source/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:16\nmsgctxt \"DateTimeHelper\"\nmsgid \"March\"\nmsgstr \"Március\"\n\n#. Key:\tMonthMay\n#. SourceLocation:\tSource/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:18\n#: Source/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:18\nmsgctxt \"DateTimeHelper\"\nmsgid \"May\"\nmsgstr \"Május\"\n\n#. Key:\tMonthNovember\n#. SourceLocation:\tSource/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:24\n#: Source/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:24\nmsgctxt \"DateTimeHelper\"\nmsgid \"November\"\nmsgstr \"November\"\n\n#. Key:\tMonthOctober\n#. SourceLocation:\tSource/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:23\n#: Source/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:23\nmsgctxt \"DateTimeHelper\"\nmsgid \"October\"\nmsgstr \"Október\"\n\n#. Key:\tMonthSeptember\n#. SourceLocation:\tSource/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:22\n#: Source/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:22\nmsgctxt \"DateTimeHelper\"\nmsgid \"September\"\nmsgstr \"Szeptember\"\n\n#. Key:\tSecondsToTime\n#. SourceLocation:\tSource/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:48\n#: Source/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:48\nmsgctxt \"DateTimeHelper\"\nmsgid \"{Minutes}:{Seconds}\"\nmsgstr \"{Minutes}:{Seconds}\"\n\n#. Key:\tSecondsToTimeMinusSeconds\n#. SourceLocation:\tSource/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:51\n#: Source/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:51\nmsgctxt \"DateTimeHelper\"\nmsgid \"{Hours}:{Minutes}:{Seconds}\"\nmsgstr \"{Hours}:{Minutes}:{Seconds}\"\n\n#. Key:\tchar_name_ball_e\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"possible display name for character\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"BALL-E\"\nmsgstr \"BALL-E\"\n\n#. Key:\tchar_name_destroyer\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"possible display name for character\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Destroyer\"\nmsgstr \"Pusztító\"\n\n#. Key:\tchar_name_dont_buy\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"possible display name for character\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Don't buy\"\nmsgstr \"Nem veszek\"\n\n#. Key:\tchar_name_dr_ball\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"possible display name for character\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Dr. Ball\"\nmsgstr \"Dr. Labda\"\n\n#. Key:\tchar_name_epic_sphero\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"possible display name for character\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Epic Sphero\"\nmsgstr \"Gömbóc Artúr\"\n\n#. Key:\tchar_name_failed_one\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"possible display name for character\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Failed One\"\nmsgstr \"Bukott hős\"\n\n#. Key:\tchar_name_saviour\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"possible display name for character\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Saviour\"\nmsgstr \"Megmentő\"\n\n#. Key:\tchar_name_sorbcerer\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"possible display name for character\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Sorbcerer\"\nmsgstr \"Varázsgömb\"\n\n#. Key:\tchar_name_spirit_of_the_unknown\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"possible display name for character\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Spirit Of the Unknown\"\nmsgstr \"Lélek az Ismeretlenből\"\n\n#. Key:\tchar_name_ultimate_frisbee\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"possible display name for character\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Ultimate Frisbee\"\nmsgstr \"Kis Gömböc\"\n\n#. Key:\tchar_name_wanderer\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"possible display name for character\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Wanderer\"\nmsgstr \"Vándorló\"\n\n#. Key:\tchar_name_warlorb\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"possible display name for character\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Warlorb\"\nmsgstr \"Labdnagy\"\n\n#. Key:\tchar_name_warriorb\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"possible display name for character\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"WarriOrb\"\nmsgstr \"Gömbörző\"\n\n#. Key:\tfinish\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"default option\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Finish\"\nmsgstr \"Vége\"\n\n#. Key:\tgold_gained\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"{0} Gold Gained\"\nmsgstr \"Kaptál {0} Aranyat\"\n\n#. Key:\tgold_lost\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"{0} Gold Lost\"\nmsgstr \"Elvesztettél {0} Aranyat\"\n\n#. Key:\titem_gained\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"{ItemName} gained!\"\nmsgstr \"Új tárgy: {ItemName}\"\n\n#. Key:\titem_gained_n\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"{Amount} {ItemName} gained!\"\nmsgstr \"Új tárgy(ak): {Amount} {ItemName}\"\n\n#. Key:\titem_lost\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"{ItemName} lost!\"\nmsgstr \"Elvesztetted ezt: {ItemName}\"\n\n#. Key:\titem_lost_n\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"{Amount} {ItemName} lost!\"\nmsgstr \"Elvesztetted ezeket: {Amount} {ItemName}\"\n\n#. Key:\tnext\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"default option\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Next\"\nmsgstr \"Tovább\"\n\n#. Key:\tnpc_altar\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"npc if BPLanguage Improver\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Altar\"\nmsgstr \"Oltár\"\n\n#. Key:\tnpc_ancient_gate\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an npc\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Ancient Gate\"\nmsgstr \"Ősi Kapu\"\n\n#. Key:\tnpc_demon_lillian\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"name of the final boss\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Demon Lillian\"\nmsgstr \"Démon Lillian\"\n\n#. Key:\tnpc_dwarven_workshop\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"name of the place the character can have a dialogue to craft a quest item\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Dwarven Workshop\"\nmsgstr \"Törp Műhely\"\n\n#. Key:\tnpc_fishy\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"display name of an npc\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Fishy\"\nmsgstr \"Hali\"\n\n#. Key:\tnpc_fountain\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"display name of a fountain the character can talk with\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Fountain\"\nmsgstr \"Szökőkút\"\n\n#. Key:\tnpc_gatekeeper\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an npc\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Gatekeeper\"\nmsgstr \"Kapuőr\"\n\n#. Key:\tnpc_ghost_dwarf\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an npc (actually a ghost of a dwarf)\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Ghost Dwarf\"\nmsgstr \"Szellem Törp\"\n\n#. Key:\tnpc_gnory\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an npc\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Gnory\"\nmsgstr \"Gnory\"\n\n#. Key:\tnpc_golem_maker\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an npc\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Golem Maker\"\nmsgstr \"Gólem Készítő\"\n\n#. Key:\tnpc_lory\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an npc\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Lory\"\nmsgstr \"Lory\"\n\n#. Key:\tnpc_lory_unkown\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"display name of Lory before she introduces herself\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Gnome Lady\"\nmsgstr \"Gnóm Hölgy\"\n\n#. Key:\tnpc_magic_mirror\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an npc\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Magic Mirror\"\nmsgstr \"Varázstükör\"\n\n#. Key:\tnpc_merchant\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an npc\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Merch Ant\"\nmsgstr \"Han Gyufaárus\"\n\n#. Key:\tnpc_merchant_voice\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"name of a small ant until he says his name (only a voice cause player can not see it)\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Voice\"\nmsgstr \"Hang\"\n\n#. Key:\tnpc_monk\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an npc\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Monk\"\nmsgstr \"Szerzetes\"\n\n#. Key:\tnpc_name_kobold\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Kobold Chef\"\nmsgstr \"Szakács Kobold\"\n\n#. Key:\tnpc_pipe_walker\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"display name of some weird creatures\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Pipe Walker\"\nmsgstr \"Battyogó\"\n\n#. Key:\tnpc_raven\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an npc (he is actually a bird)\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Raven\"\nmsgstr \"Holló\"\n\n#. Key:\tnpc_scholar\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an npc\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Scholar\"\nmsgstr \"Tudós\"\n\n#. Key:\tnpc_secret_hideout\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"display name of a door asking for a password\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Secret Hideout Gate\"\nmsgstr \"Titkos Rejtekhely Kapu\"\n\n#. Key:\tnpc_sewer_creature\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an npc\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Sewer Creature\"\nmsgstr \"Battyogó\"\n\n#. Key:\tnpc_statue\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an npc\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Statue\"\nmsgstr \"Szobor\"\n\n#. Key:\tnpc_supper_dwarf\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"display name of an npc. Supper refers here an evening meal, typically a light or informal one.\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Supper Dwarf\"\nmsgstr \"Leves Törp\"\n\n#. Key:\tnpc_teachy\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an npc\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Teachy\"\nmsgstr \"Tani\"\n\n#. Key:\tnpc_teachy_unkown\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"name of Teachy before introduction\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Bored Gnome\"\nmsgstr \"Szórakozott Gnóm\"\n\n#. Key:\tnpc_tomb\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"display name of a tomb a character can talk to\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Tomb\"\nmsgstr \"Sír\"\n\n#. Key:\tnpc_unknown_wizard\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"display name of an npc\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Unknown Wizard\"\nmsgstr \"Ismeretlen Varázsló\"\n\n#. Key:\tnpc_wizard\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"display name of the wizard npc\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Wizard\"\nmsgstr \"Varázsló\"\n\n#. Key:\t022227664F6F422B20B109A19B8789AA\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"I’m glad you are back again!\"\nmsgstr \"Örülök, hogy újra itt vagy.\"\n\n#. Key:\t0944D8A541F933BEB5DD068CA9099075\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_44.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_44.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"I think I managed to activate the device on the wall of the Portal Tower.\"\nmsgstr \"Valamit sikerült állítanom a Torony Szerkezeten.\"\n\n#. Key:\t10ADF4F948FB99445BF791BB0722AD90\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_25.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_25.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Good idea.\"\nmsgstr \"Okos gondolat...\"\n\n#. Key:\t137B87BB447D45E46C0425A940E8B7F0\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_46.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_46.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"You said you wouldn't do it...\"\nmsgstr \"Azt mondtad, nem fogod megcsinálni...\"\n\n#. Key:\t16358AE840D8B8553E8930A3B7E69BBA\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"You know, sometimes I miss the Pipewalkers...\"\nmsgstr \"Tudod, néha hiányoznak a Battyogók...\"\n\n#. Key:\t1B9834C6405C60960F322585AB0F1704\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_38.Text\n#. Key:\t2189E8064ACF974902FBA49BD12D0F47\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_38.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Could you activate it for me?\"\nmsgstr \"Tudnál kezdeni vele valamit?\"\n\n#. Key:\t274EB7AD410061E3E200A9813A54AB29\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"I think I've already done that.\"\nmsgstr \"Már valamit bütyköltem rajta.\"\n\n#. Key:\t2A57878148EFCC8532E34CAE1B9C9A0F\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"You? I never thought I’ll see you in this shape again.\"\nmsgstr \"Te? Sose gondoltam volna, hogy ebben a formában látlak viszont.\"\n\n#. Key:\t3764BB48401ABEDCD125F186B4BF0E17\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"And it also attracts the Pipewalkers.\"\nmsgstr \"Meg a leves illata előcsalogatja a Battyogókat.\"\n\n#. Key:\t3A0924F7449355545C0A98B94994616B\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"I want to find my tribe.\"\nmsgstr \"A törzsemet akarom megtalálni.\"\n\n#. Key:\t3C0498284D71B7B64FEA4094F42A5502\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_23.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_23.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Do you think you will find Pipewalkers here?\"\nmsgstr \"Gondolod, hogy itt is élnek Battyogók?\"\n\n#. Key:\t3DCACAB047175FB687542AB0CA25D972\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_38.Children(1).Children.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_38.Children(1).Children.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Decline\"\nmsgstr \"Inkább nem\"\n\n#. Key:\t41C1FCA947041D49247FC8A157D7407F\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_52.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_52.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"All right, thank you.\"\nmsgstr \"Jó, kösz!\"\n\n#. Key:\t43C8FE9248340E49F1F31882D7B96642\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"If they are still alive they must be beyond that Purple Portal.\"\nmsgstr \"Ha még életben vannak, akkor a Bíbor Bejáró után fogom megtalálni őket.\"\n\n#. Key:\t444DD931423A98C7DD95D4BB73F0F1C6\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_39.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_39.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Sure! I’ll see what I can do.\"\nmsgstr \"Rendben, megnézem, mit tehetek.\"\n\n#. Key:\t4FF2FA154BEFBD448EFDB0BB7FE3F0AF\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_11.Children(1).Children.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_11.Children(1).Children.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Tribe\"\nmsgstr \"Kobold törzs\"\n\n#. Key:\t52A8B1F04C37F262E014DEA14AB68957\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Because I’m a chef.\"\nmsgstr \"Mert szakács vagyok.\"\n\n#. Key:\t5F376BF945B8CE4AA12B7EB05F8C62A5\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_11.Children(6).Children.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_11.Children(6).Children.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Leave\"\nmsgstr \"Távozok\"\n\n#. Key:\t63EA4DDD45390542E3A904928143D9AF\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Haha... Yes I’m back again.\"\nmsgstr \"Haha... Igen, visszatértem, kétszeresen is.\"\n\n#. Key:\t64EE856046A396F2750AE1BC1042CF26\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_30.Text\n#. Key:\tE3F52F4F47289406E4A546BB0BF3AC3F\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_50.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_30.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_50.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Thanks!\"\nmsgstr \"Kösz!\"\n\n#. Key:\t694B6E3F4F4C7CEAAACB51A2D30FFD26\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_11.Children(2).Children.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_11.Children(2).Children.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Ruin\"\nmsgstr \"Fertőzés\"\n\n#. Key:\t7304F1034A83C6D17E274090FA8E543B\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_41.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_41.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Thank you!\"\nmsgstr \"Kösz!\"\n\n#. Key:\t73240093450B12BEEA1EB78C9CF7D89E\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_11.Children(0).Children.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_11.Children(0).Children.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Purple Portal\"\nmsgstr \"Bíbor Bejáró\"\n\n#. Key:\t804671AF40165C92FA6A8F8A5AE97997\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_60.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_60.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Looks like I can’t get rid of this body.\"\nmsgstr \"Úgy tűnik, nem tudok megszabadulni ettől a testtől.\"\n\n#. Key:\t807FF1A945548216DAD305B4D5A4437F\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_24.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_24.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"If there are any they will come here when they smell the soup.\"\nmsgstr \"Majd meglátjuk.Ha igen, akkor elő fognak jönni a leves illatára.\"\n\n#. Key:\t8240EF7946C8434333AFAEBEF3583917\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_34.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_34.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Do you need help with something?\"\nmsgstr \"Szükséged van segítségre?\"\n\n#. Key:\t833BB4384231444247779CAB596D0259\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_40.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_40.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"I’m sorry but that sounds complicated.\"\nmsgstr \"Huh, elég vészesen hangzik.\"\n\n#. Key:\t85656A9E46844B03D49E13AC951FDE07\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_59.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_59.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"See you!\"\nmsgstr \"Úgy legyen!\"\n\n#. Key:\t869485E24E19938DEE48BFB5C5240BB3\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_29.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_29.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"I’m not sure... but I have a key which might be useful.\"\nmsgstr \"Nem jártam még arra... de van nálam egy kulcs, ami még jól jöhet.\"\n\n#. Key:\t86FBA5A24734DD97167512A054A2E0D9\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Oh, it’s you.\"\nmsgstr \"Óh, te vagy az...\"\n\n#. Key:\t891684A24BA64E351E7F0B9ADEA3D6DF\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"No. To be honest I don’t care much about Ruin.\"\nmsgstr \"Nem, de őszintén szólva most nem is foglalkoztat ez a kérdés.\"\n\n#. Key:\t8FF6BF7B4745BB75C2D8F7873C492C2D\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_11.Children(4).Children.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_11.Children(4).Children.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Can I help?\"\nmsgstr \"Segíthetek?\"\n\n#. Key:\t93B13014434102C8033B41A06DBED69B\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_11.Children(5).Children.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_11.Children(5).Children.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Tower Device\"\nmsgstr \"Torony Szerkezet\"\n\n#. Key:\t95A7C27A44B78CBF17C1FD8C9446CBD7\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Take it! I still need some time to finish the soup anyway.\"\nmsgstr \"Tessék! Én még úgyis elfőzögetek itt egy darabig.\"\n\n#. Key:\t97E4FDC74B47A6037D6023A4C65B2934\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_37.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_37.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"If you activate it I’ll be able to use the portal to teleport to other places.\"\nmsgstr \"Ha működésre tudnád bírni, átkapcsolhatnánk a Bejárót, hogy más helyekre is eljuttasson minket.\"\n\n#. Key:\t9FD2679D44BEBBFBBAD2EAAECFFEE0D5\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_42.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_42.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"I can’t promise I’ll do that.\"\nmsgstr \"Inkább nem ígérek semmit.\"\n\n#. Key:\tAA1C6EF444BAB6A929E953A87BB87ABB\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_56.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_56.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"I've got to go. See you soon!\"\nmsgstr \"Indulok, remélem még találkozunk!\"\n\n#. Key:\tAED4FBE3422E0FC4AC4BD38650F95CA9\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_26.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_26.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Thanks.\"\nmsgstr \"Kösz!\"\n\n#. Key:\tB0BAD1934671ADCB2DD1E1BA582E3C68\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Why are you making soup?\"\nmsgstr \"Miért főzöl levest?\"\n\n#. Key:\tB621AECE42A14A508C945595493F3A3A\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Really? Anyway, I’m happy to see you.\"\nmsgstr \"Csakugyan? Mindegy, így vagy úgy, örülök, hogy újra látlak.\"\n\n#. Key:\tBA715D554C47932C092462B36ADEA081\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_58.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_58.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Good bye!\"\nmsgstr \"Jó utat!\"\n\n#. Key:\tBE7B3444431F43E8E1487F8702B94845\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_57.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_57.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"It was nice to meet you.\"\nmsgstr \"Örülök, hogy találkoztunk!\"\n\n#. Key:\tC1BB24A443D4297B17E2F6A280B02E91\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_36.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_36.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Yes. According to a book I read here there is a device on the wall of the Portal Tower.\"\nmsgstr \"Aha. Egy feljegyzés szerint a Bíbor Bejáró tornyának külső falán van valami szerkezet.\"\n\n#. Key:\tC339B87742C2B475E2387F93418AA855\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Have you found out anything about Ruin?\"\nmsgstr \"Rájöttél valamire a Fertőzéssel kapcsolatban?\"\n\n#. Key:\tC4D263AB48B800D5522A24923C541ED3\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_11.Children(3).Children.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_11.Children(3).Children.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Soup\"\nmsgstr \"Leves\"\n\n#. Key:\tC530096E4FA1A2B68077C3AD6AC1BF44\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_38.Children(0).Children.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_38.Children(0).Children.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Accept Quest\"\nmsgstr \"Vállalom\"\n\n#. Key:\tC82668E6497A810FA6ADC0AB6F362B47\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"The soup is almost ready...\"\nmsgstr \"Már majdnem kész a leves...\"\n\n#. Key:\tCD8CDA3443CDE79BE257B99A0801B209\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_43.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_43.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"No problem.\"\nmsgstr \"Mindegy, nem gond.\"\n\n#. Key:\tD058108241051A9FD0D130B3C9EA4B8B\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"It helps me keep my mind clear.\"\nmsgstr \"És segít rendezni a gondolataimat.\"\n\n#. Key:\tD8F879684C57BB474E7153B971073663\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_49.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_49.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Meanwhile I cooked something special for you. Take this!\"\nmsgstr \"Közben feltettem neked is valamit a tűzre.\"\n\n#. Key:\tDA9D493F42420BE9442B1EA983AEF9C2\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Any news on your lost tribe?\"\nmsgstr \"Van valami hír az elveszett törzsedről?\"\n\n#. Key:\tDE2390ED4366A621E4D220A3761333DE\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_54.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_54.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"I need to go now.\"\nmsgstr \"Mennem kell.\"\n\n#. Key:\tDE668E4B4A3D0F785A693B9190E635D3\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_47.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_47.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"How on earth have you managed to reach this node?\"\nmsgstr \"Hogy jutottál el ide?\"\n\n#. Key:\tE29E2D044497A86DD0FCA8B540703597\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_48.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_48.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Pls. report it as a bug.\"\nmsgstr \"Jelentsd, ez egy bug.\"\n\n#. Key:\tE6D3401944B2FF128DD1689F5159AF96\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_45.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_45.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Nice, well done!\"\nmsgstr \"Nagyszerű, szép munka!\"\n\n#. Key:\tE83287164D066CCE8FBFDE835FBD4CFB\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_55.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_55.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"I'm on my way. Take care!\"\nmsgstr \"Léptem, vigyázz magadra!\"\n\n#. Key:\tEBC97F7C45858FE6DC72209536FC5C3B\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_27.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_27.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Do you know how can I reach that Purple Portal?\"\nmsgstr \"Tudod hogy jutok el ahhoz a Bíbor Bigyóhoz?\"\n\n#. Key:\tF911D6CB45AA59448C03379A1C07DD60\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_51.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_51.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"It wasn’t that complicated after all.\"\nmsgstr \"Végül mégis sikerült.\"\n\n#. Key:\tF9EBA1684D435C8AEB14129A7B57A604\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"I think they came here and followed the messages just like you.\"\nmsgstr \"Biztos, hogy jártak itt. Talán ugyanazokat az üzeneteket követték, mint amiket te is.\"\n\n#. Key:\t3DAA74ED48BE31E35D868FB1492E57A8\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/WW_Pergamen.WW_Pergamen:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/WhiteWall/WW_Pergamen.WW_Pergamen:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_WW_Pergamen\"\nmsgid \"'Ruin took over some of us. It's no longer safe here.'\"\nmsgstr \"'A Fertőzés egyre többünk elméjét rontja meg. Már nem biztonságos itt.'\"\n\n#. Key:\tB10818134FFE3A1E99A9D789BFABBBEE\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/WW_Pergamen.WW_Pergamen:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/WhiteWall/WW_Pergamen.WW_Pergamen:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_WW_Pergamen\"\nmsgid \"'Come visit us beyond the Purple Portal!'\"\nmsgstr \"'A Bíbor Bejáró mögött megtalálsz minket.’\"\n\n#. Key:\tD292364A4E58F52FB874AA98C1F969A6\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/WW_Pergamen.WW_Pergamen:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/WhiteWall/WW_Pergamen.WW_Pergamen:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_WW_Pergamen\"\nmsgid \"'We are close to the solution, but your help is still needed.'\"\nmsgstr \"'Közel a megoldás, de segítségre van szükségünk.’\"\n\n#. Key:\t0CD0FD884718EF68B38D578CDE17110A\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/WW_Statue.WW_Statue:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/WhiteWall/WW_Statue.WW_Statue:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_WW_Statue\"\nmsgid \"Oooops...\"\nmsgstr \"Uuuupsz...\"\n\n#. Key:\t2D531D384CB6A56DBC4834BD229622E7\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/WW_Statue.WW_Statue:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/WhiteWall/WW_Statue.WW_Statue:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_WW_Statue\"\nmsgid \"'White Wall will never fall!'\"\nmsgstr \"'A Fehér Fellegvár örökké állni fog!'\"\n\n#. Key:\t2690E77045D5E42F32AC6582BAFF27AA\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/WW_StatueWelcome.WW_StatueWelcome:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/WhiteWall/WW_StatueWelcome.WW_StatueWelcome:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_WW_StatueWelcome\"\nmsgid \"'We know how to stop Ruin.'\"\nmsgstr \"'Tudjuk, hogy állítsuk meg a Fertőzést.'\"\n\n#. Key:\t7C3340434A4C80010AC2D58BF8504339\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/WW_StatueWelcome.WW_StatueWelcome:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/WhiteWall/WW_StatueWelcome.WW_StatueWelcome:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_WW_StatueWelcome\"\nmsgid \"'There is still hope.'\"\nmsgstr \"'Még van remény.'\"\n\n#. Key:\tarmour_wrath_name\n#. SourceLocation:\tLocalization/StringTables/Enemies.csv\n#. InfoMetaData:\t\"Comment\" : \"display name of an npc boss\"\n#: Localization/StringTables/Enemies.csv\nmsgctxt \"Enemies\"\nmsgid \"Armour Wrath\"\nmsgstr \"Harag Vért\"\n\n#. Key:\tdwarf_name\n#. SourceLocation:\tLocalization/StringTables/Enemies.csv\n#. InfoMetaData:\t\"Comment\" : \"display name of an npc boss\"\n#: Localization/StringTables/Enemies.csv\nmsgctxt \"Enemies\"\nmsgid \"Dwarf\"\nmsgstr \"Törp\"\n\n#. Key:\tfallen_druid_name\n#. SourceLocation:\tLocalization/StringTables/Enemies.csv\n#. InfoMetaData:\t\"Comment\" : \"display name of an npc boss\"\n#: Localization/StringTables/Enemies.csv\nmsgctxt \"Enemies\"\nmsgid \"Fallen Druid\"\nmsgstr \"Bukott Druida\"\n\n#. Key:\tdreamhack_completed_desc\n#. SourceLocation:\tLocalization/StringTables/Episodes.csv\n#: Localization/StringTables/Episodes.csv\nmsgctxt \"Episodes\"\nmsgid \"Thanks for playing the game, we hope you had a great time!\"\nmsgstr \"Köszönjük a játékot, reméljük jól érezted magad!\"\n\n#. Key:\tdreamhack_completed_subtitle\n#. SourceLocation:\tLocalization/StringTables/Episodes.csv\n#: Localization/StringTables/Episodes.csv\nmsgctxt \"Episodes\"\nmsgid \"Dreamhack Demo\"\nmsgstr \"Dreamhack Demo\"\n\n#. Key:\tdreamhack_desc\n#. SourceLocation:\tLocalization/StringTables/Episodes.csv\n#: Localization/StringTables/Episodes.csv\nmsgctxt \"Episodes\"\nmsgid \"What happens when you lock a mighty demon's spirit inside a ball body?\"\nmsgstr \"Mit kapunk, ha egy nagyhatalmú démont labdatestbe zárunk?\"\n\n#. Key:\tdreamhack_friendly_name\n#. SourceLocation:\tLocalization/StringTables/Episodes.csv\n#: Localization/StringTables/Episodes.csv\nmsgctxt \"Episodes\"\nmsgid \"Dreamhack\"\nmsgstr \"Dreamhack\"\n\n#. Key:\tepisode_end_main_title\n#. SourceLocation:\tLocalization/StringTables/Episodes.csv\n#. InfoMetaData:\t\"Comment\" : \"episode map end panel text\"\n#: Localization/StringTables/Episodes.csv\nmsgctxt \"Episodes\"\nmsgid \"Episode Completed!\"\nmsgstr \"Epizód teljesítve!\"\n\n#. Key:\tescape_darkness_completed_desc\n#. SourceLocation:\tLocalization/StringTables/Episodes.csv\n#: Localization/StringTables/Episodes.csv\nmsgctxt \"Episodes\"\nmsgid \"\\\"And as Darkness spreads an unknown Warriorb will rise...\\\"\"\nmsgstr \"Mielőtt a Sötétség mindent elnyelne, ismeretlen harcos tűnik elő...\"\n\n#. Key:\tescape_darkness_completed_subtitle\n#. SourceLocation:\tLocalization/StringTables/Episodes.csv\n#: Localization/StringTables/Episodes.csv\nmsgctxt \"Episodes\"\nmsgid \"Escaped from Darkness\"\nmsgstr \"Kijutottál a Sötétből!\"\n\n#. Key:\tescape_darkness_desc\n#. SourceLocation:\tLocalization/StringTables/Episodes.csv\n#: Localization/StringTables/Episodes.csv\nmsgctxt \"Episodes\"\nmsgid \"Are you fast enough to race against Darkness itself?\"\nmsgstr \"Gyorsabb vagy, mint az árnyékod?\"\n\n#. Key:\tescape_darkness_friendly_name\n#. SourceLocation:\tLocalization/StringTables/Episodes.csv\n#: Localization/StringTables/Episodes.csv\nmsgctxt \"Episodes\"\nmsgid \"Escape Darkness\"\nmsgstr \"Sötét Hajsza\"\n\n#. Key:\twhite_wall_completed_desc\n#. SourceLocation:\tLocalization/StringTables/Episodes.csv\n#. InfoMetaData:\t\"Comment\" : \"short text on the ending panel when player finishes this episode\"\n#: Localization/StringTables/Episodes.csv\nmsgctxt \"Episodes\"\nmsgid \"What happened beyond the portal is another story, which will be told at another time.\"\nmsgstr \"Hogy mi történt a portál mögött, az már egy másik történet, elbeszélésére más alkalommal kerül sor.\"\n\n#. Key:\twhite_wall_completed_subtitle\n#. SourceLocation:\tLocalization/StringTables/Episodes.csv\n#. InfoMetaData:\t\"Comment\" : \"subtitle of the ending panel when player finishes this episode\"\n#. Key:\twhite_wall_friendly_name\n#. InfoMetaData:\t\"Comment\" : \"name the episode is displayed with in the ui\"\n#: Localization/StringTables/Episodes.csv\nmsgctxt \"Episodes\"\nmsgid \"White Wall\"\nmsgstr \"Fehér Fellegvár\"\n\n#. Key:\twhite_wall_desc\n#. SourceLocation:\tLocalization/StringTables/Episodes.csv\n#. InfoMetaData:\t\"Comment\" : \"map desc when the player can select the episode\"\n#: Localization/StringTables/Episodes.csv\nmsgctxt \"Episodes\"\nmsgid \"Although it's long abandoned the fortress of White Wall still stands against Ruin. After centuries of silence some groups of unexpected visitors broke the loneliness of the decaying city.\"\nmsgstr \"Noha lakói rég sorsára hagyták, a Fehér Fellegvár falai még mindig dacolnak a Fertőzéssel. Évszázados némaság után a pusztuló erőd csendjét váratlan látogatók érkezése töri meg.\"\n\n#. Key:\twhite_wall_loadingscreen_desc\n#. SourceLocation:\tLocalization/StringTables/Episodes.csv\n#. InfoMetaData:\t\"Comment\" : \"text on loading screen\"\n#: Localization/StringTables/Episodes.csv\nmsgctxt \"Episodes\"\nmsgid \"After months of researching I found a way to return back to the Ruined Realm. Ironically enough I have to use the same body I was trapped in before. I'll need to be quick and clever for this might be my very last chance to stop Ruin before it devours the World.\"\nmsgstr \"Több hónapnyi kutatásomba tellett, de sikerült rájönnöm, hogyan juthatok vissza a Fertőzött Földekre. Ironikus módon ehhez ugyanazt a labdatestet kell használnom, mint amibe korábban zártak. Nem késlekedhetek, talán ez az utolsó esélyem, hogy megállítsam a Fertőzést.\"\n\n#. Key:\tchar_vo_armourwrath_attack_clap\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I won't fail the Maker!\"\nmsgstr \"Nem hozok szégyent a Készítőre!\"\n\n#. Key:\tchar_vo_armourwrath_attack_die\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"No... I'm still... perfect\"\nmsgstr \"Nem... még mindig... tökéletes vagyok\"\n\n#. Key:\tchar_vo_armourwrath_attack_magic\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Resist Ruin!\"\nmsgstr \"Állj ellen a Fertőzésnek!\"\n\n#. Key:\tchar_vo_armourwrath_attack_strike_down\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Out of my way!\"\nmsgstr \"El az utamból!\"\n\n#. Key:\tchar_vo_armourwrath_attack_strike_down_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I am perfect\"\nmsgstr \"Tökéletes vagyok\"\n\n#. Key:\tchar_vo_dwarvenstatue_attack_axe_point\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I keep Ruin\"\nmsgstr \"Visszatartom a Fertőzést\"\n\n#. Key:\tchar_vo_dwarvenstatue_attack_axe_strike_down\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"We are above the Law!\"\nmsgstr \"A törvény felett állunk!\"\n\n#. Key:\tchar_vo_dwarvenstatue_attack_meteor\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I can take more!\"\nmsgstr \"Többet is bírok!\"\n\n#. Key:\tchar_vo_dwarvenstatue_die\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I won't move... again\"\nmsgstr \"Nem mozgok... többé\"\n\n#. Key:\tchar_vo_dwarvenstatue_shield_knock\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I hold it back!\"\nmsgstr \"Visszatartom!\"\n\n#. Key:\tchar_vo_fallendruid_attack_flybug\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"It's safe here.\"\nmsgstr \"Itt biztonságos.\"\n\n#. Key:\tchar_vo_fallendruid_attack_spike\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"This place shall stand!\"\nmsgstr \"Ez a hely romlatlan marad!\"\n\n#. Key:\tchar_vo_fallendruid_attack_tendril\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Nature will survive!\"\nmsgstr \"A természet győzni fog!\"\n\n#. Key:\tchar_vo_fallendruid_attack_thorn_sphere\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Out with you, Ruin!\"\nmsgstr \"El véled, Fertőzés!\"\n\n#. Key:\tchar_vo_fallendruid_die\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I have... failed\"\nmsgstr \"El... butkam\"\n\n#. Key:\tchar_vo_final_boss_p1_blue\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#. Key:\tchar_vo_final_boss_p2_blue\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I'm the daughter of the Wizard!\"\nmsgstr \"Én vagyok a Varázsló lánya!\"\n\n#. Key:\tchar_vo_final_boss_p1_green\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#. Key:\tchar_vo_final_boss_p2_red_up\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I can create!\"\nmsgstr \"Teremtek!\"\n\n#. Key:\tchar_vo_final_boss_p1_red\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I'm human!\"\nmsgstr \"Ember vagyok!\"\n\n#. Key:\tchar_vo_final_boss_p2_green\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#. Key:\tchar_vo_final_boss_p3_green\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"That sounds funny!\"\nmsgstr \"Jó mókának hangzik!\"\n\n#. Key:\tchar_vo_final_boss_p2_red_down\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I can destroy!\"\nmsgstr \"Pusztítok!\"\n\n#. Key:\tchar_vo_final_boss_p3_blue\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I'm free!\"\nmsgstr \"Szabad vagyok!\"\n\n#. Key:\tchar_vo_final_boss_p3_red\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"What makes you say that?\"\nmsgstr \"Miért mondod ezt?\"\n\n#. Key:\tchar_vo_fishy_idle_hiss\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Hissing\"\nmsgstr \"Sziszeg\"\n\n#. Key:\tchar_vo_flybug_attack_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Huh! Surprised?\"\nmsgstr \"Hah! Meglepődtél?\"\n\n#. Key:\tchar_vo_flybug_attack_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Take this!\"\nmsgstr \"Ezt neked!\"\n\n#. Key:\tchar_vo_flybug_damaged_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Careful!\"\nmsgstr \"Óvatosan!\"\n\n#. Key:\tchar_vo_flybug_damaged_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"It's not funny!\"\nmsgstr \"Nem vicces!\"\n\n#. Key:\tchar_vo_flybug_die_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"All right, gg!\"\nmsgstr \"Oké, gg!\"\n\n#. Key:\tchar_vo_flybug_idle_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"What is it like down there? Heh?\"\nmsgstr \"És milyen odalent, heh?\"\n\n#. Key:\tchar_vo_flybug_idle_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Easy man, easy!\"\nmsgstr \"Csak lazán, haver!\"\n\n#. Key:\tchar_vo_gatekeeper_attack_aimed\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Avoid these!\"\nmsgstr \"Térjen ki!\"\n\n#. Key:\tchar_vo_gatekeeper_attack_aimed_phase_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Watch out where you bounce to!\"\nmsgstr \"Figyeljen, meddig pattan!\"\n\n#. Key:\tchar_vo_gatekeeper_attack_electric_bubbles\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Attention to the heights!\"\nmsgstr \"Figyelje a magasságokat!\"\n\n#. Key:\tchar_vo_gatekeeper_attack_electric_bubbles_phase_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Attention to the heights again!\"\nmsgstr \"Figyelje a magasságokat ismételten!\"\n\n#. Key:\tchar_vo_gatekeeper_attack_meteors\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Watch out for your head!\"\nmsgstr \"Vigyázzon a fejére!\"\n\n#. Key:\tchar_vo_gatekeeper_attack_shield\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Do you really think you are worthy?\"\nmsgstr \"Méltónak érzi magát?\"\n\n#. Key:\tchar_vo_ghostarmor__die\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I... don't...\"\nmsgstr \"Én... nem...\"\n\n#. Key:\tchar_vo_ghostarmor_attack_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"You shall perish!\"\nmsgstr \"Pusztulj!\"\n\n#. Key:\tchar_vo_ghostarmor_attack_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"For justice!\"\nmsgstr \"Igazságot!\"\n\n#. Key:\tchar_vo_ghostarmor_attack_fall\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Death to the outlaw!\"\nmsgstr \"Halál a bűnösökre!\"\n\n#. Key:\tchar_vo_ghostarmor_damaged_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Just a scratch.\"\nmsgstr \"Csak egy karcolás.\"\n\n#. Key:\tchar_vo_ghostarmor_damaged_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"You... can't.\"\nmsgstr \"Ezt nem,,, teheted.\"\n\n#. Key:\tchar_vo_ghostarmor_idle_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"We keep the Wall.\"\nmsgstr \"Tartjuk a Falat.\"\n\n#. Key:\tchar_vo_ghostarmor_idle_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Follow the rules!\"\nmsgstr \"Tartsd be a törvényt!\"\n\n#. Key:\tchar_vo_ghosthelmet_attack_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Aaaaaaargh!\"\nmsgstr \"Aaaaaaargh!\"\n\n#. Key:\tchar_vo_ghosthelmet_attack_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Chaaaaaarge!\"\nmsgstr \"Rohaaaaam!\"\n\n#. Key:\tchar_vo_ghosthelmet_damaged_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I'll need a blacksmith!\"\nmsgstr \"Kéne egy kovács!\"\n\n#. Key:\tchar_vo_ghosthelmet_damaged_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Send someone for a hammer!\"\nmsgstr \"Hozzatok kalapácsot!\"\n\n#. Key:\tchar_vo_ghosthelmet_die\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Be right back!\"\nmsgstr \"Mindjárt jövök!\"\n\n#. Key:\tchar_vo_ghosthelmet_idle_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Use your head... or mine!\"\nmsgstr \"Használd a fejed... vagy az enyémet!\"\n\n#. Key:\tchar_vo_ghosthelmet_idle_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Let's head east!\"\nmsgstr \"Fejjel a falnak!\"\n\n#. Key:\tchar_vo_gnory_idle_humming\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Humming\"\nmsgstr \"Hümmög\"\n\n#. Key:\tchar_vo_gnory_idle_whistle\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Whistling\"\nmsgstr \"Fütyül\"\n\n#. Key:\tchar_vo_golemmaker_idle_explain_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I create essence which resists the ruin.\"\nmsgstr \"Ez ellen fog állni a Fertőzésnek.\"\n\n#. Key:\tchar_vo_golemmaker_idle_mindlessly_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Knowledge is Lost, All is Lost.\"\nmsgstr \"Elveszett a tudás. Minden elveszett.\"\n\n#. Key:\tchar_vo_golemmaker_idle_mindlessly_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"All is Lost.\"\nmsgstr \"Minden elveszett.\"\n\n#. Key:\tchar_vo_golemmaker_idle_moan_aaahhh\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Aaahhh\"\nmsgstr \"Aaahhh\"\n\n#. Key:\tchar_vo_golemmaker_idle_moan_ooohhh\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Ooohhh\"\nmsgstr \"Ooohhh\"\n\n#. Key:\tchar_vo_golemmaker_idle_sad_onon\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Onon\"\nmsgstr \"Onon\"\n\n#. Key:\tchar_vo_golemmaker_idle_tries_to_remember\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Your words remind me of something.\"\nmsgstr \"A szavaid emlékeztetnek valamire.\"\n\n#. Key:\tchar_vo_koboldchef_idle_01\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Too hot!\"\nmsgstr \"Túl forró!\"\n\n#. Key:\tchar_vo_koboldchef_idle_02\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"It needs more salt!\"\nmsgstr \"Több só kell!\"\n\n#. Key:\tchar_vo_koboldchef_idle_03\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"It will be delicious.\"\nmsgstr \"Finomnak ígérkezik.\"\n\n#. Key:\tchar_vo_koboldchef_idle_04\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Hmm...\"\nmsgstr \"Hmm...\"\n\n#. Key:\tchar_vo_lory_idle_croon\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Croon\"\nmsgstr \"Dúdol\"\n\n#. Key:\tchar_vo_lory_idle_humming_0\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Ohh\"\nmsgstr \"Ohh\"\n\n#. Key:\tchar_vo_lory_idle_humming_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#. Key:\tchar_vo_supperdwarf_idle_2_humming_1\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Hmmm\"\nmsgstr \"Hmmm\"\n\n#. Key:\tchar_vo_lory_idle_humming_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Ommm\"\nmsgstr \"Ommm\"\n\n#. Key:\tchar_vo_lory_idle_humming_3\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Auch\"\nmsgstr \"Auch\"\n\n#. Key:\tchar_vo_maintainer_attack_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Dinner is served!\"\nmsgstr \"A vacsora tálalva!\"\n\n#. Key:\tchar_vo_maintainer_attack_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Now it's clean!\"\nmsgstr \"Most már tiszta!\"\n\n#. Key:\tchar_vo_maintainer_damaged_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I'll need to be repaired.\"\nmsgstr \"Javításra lesz szükségem.\"\n\n#. Key:\tchar_vo_maintainer_damaged_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I still serve.\"\nmsgstr \"Még szolgálok.\"\n\n#. Key:\tchar_vo_maintainer_die\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I'll need... replacement.\"\nmsgstr \"Kell valaki... a helyemre.\"\n\n#. Key:\tchar_vo_maintainer_elite_idle_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Serve...\"\nmsgstr \"Szolgál...\"\n\n#. Key:\tchar_vo_maintainer_elite_idle_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Order...\"\nmsgstr \"Parancs...\"\n\n#. Key:\tchar_vo_maintainer_idle_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"At your service.\"\nmsgstr \"Szolgálatára.\"\n\n#. Key:\tchar_vo_maintainer_idle_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Your order?\"\nmsgstr \"Parancs?\"\n\n#. Key:\tchar_vo_maintainer_miniboss_attack_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"This is my order!\"\nmsgstr \"Ez az én parancsom!\"\n\n#. Key:\tchar_vo_maintainer_miniboss_attack_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I'll reorganize!\"\nmsgstr \"Rendbe rakom!\"\n\n#. Key:\tchar_vo_maintainer_miniboss_attack_meteor\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I'm above!\"\nmsgstr \"Én vagyok a legjobb!\"\n\n#. Key:\tchar_vo_maintainer_miniboss_attack_spawn_enemy\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Order, order, order!\"\nmsgstr \"Parancs, parancs, parancs!\"\n\n#. Key:\tchar_vo_maintainer_miniboss_damaged_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I can fix this\"\nmsgstr \"Máris javítom!\"\n\n#. Key:\tchar_vo_maintainer_miniboss_damaged_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Don't do that again!\"\nmsgstr \"Ilyet ne csinálj többet!\"\n\n#. Key:\tchar_vo_maintainer_miniboss_die\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I can't... I was... above.\"\nmsgstr \"De... én voltam... a legjobb\"\n\n#. Key:\tchar_vo_primitivefishy_attack_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Srrrr!\"\nmsgstr \"Srrrr!\"\n\n#. Key:\tchar_vo_primitivefishy_attack_long_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Hurray!\"\nmsgstr \"Hurrá!\"\n\n#. Key:\tchar_vo_primitivefishy_attack_long_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Flyyyyyyy!\"\nmsgstr \"Reeeeepcsi!\"\n\n#. Key:\tchar_vo_primitivefishy_damaged_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Uuush!\"\nmsgstr \"Uuush!\"\n\n#. Key:\tchar_vo_primitivefishy_damaged_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Shish!\"\nmsgstr \"Shish!\"\n\n#. Key:\tchar_vo_primitivefishy_die\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Fishy leaves.\"\nmsgstr \"Hali elmenni.\"\n\n#. Key:\tchar_vo_primitivefishy_idle_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I need some fish!\"\nmsgstr \"Halat!\"\n\n#. Key:\tchar_vo_primitivefishy_idle_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Did you hear that?\"\nmsgstr \"Hallottad?\"\n\n#. Key:\tchar_vo_shade_attack_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Join me!\"\nmsgstr \"Csatlakozz!\"\n\n#. Key:\tchar_vo_shade_attack_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"You shall die too!\"\nmsgstr \"Neked is halnod kell!\"\n\n#. Key:\tchar_vo_shade_damaged_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Is this the end?\"\nmsgstr \"Ez már a vég?\"\n\n#. Key:\tchar_vo_shade_damaged_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Pain...\"\nmsgstr \"Fájdalom...\"\n\n#. Key:\tchar_vo_shade_die\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Death... again?!\"\nmsgstr \"Halál... megint?!\"\n\n#. Key:\tchar_vo_shade_idle_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I can't rest.\"\nmsgstr \"Nincs nyugtom.\"\n\n#. Key:\tchar_vo_shade_idle_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Death is not peace.\"\nmsgstr \"A halál nem menekvés.\"\n\n#. Key:\tchar_vo_shadesphere_attack_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I'll change you!\"\nmsgstr \"Megváltoztatlak!\"\n\n#. Key:\tchar_vo_shadesphere_attack_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Do not resist me!\"\nmsgstr \"Ne állj ellen!\"\n\n#. Key:\tchar_vo_shadesphere_damaged_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"It's still... me...\"\nmsgstr \"Még mindig... én...\"\n\n#. Key:\tchar_vo_shadesphere_damaged_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Why did you...?\"\nmsgstr \"Miért?\"\n\n#. Key:\tchar_vo_shadesphere_die\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"You changed... me?\"\nmsgstr \"Te változtattál engem?\"\n\n#. Key:\tchar_vo_shadesphere_idle_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"What do you wish to be?\"\nmsgstr \"Mi szeretnél lenni?\"\n\n#. Key:\tchar_vo_shadesphere_idle_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Come to me!\"\nmsgstr \"Hozzám!\"\n\n#. Key:\tchar_vo_supperdwarf_idle_1_eating_food_0\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Yum-yum hmmmm... delicious\"\nmsgstr \"Nyamm-nyamm hmmm… finom\"\n\n#. Key:\tchar_vo_supperdwarf_idle_1_eating_food_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Hmmm... tasty\"\nmsgstr \"Hmmm… finom\"\n\n#. Key:\tchar_vo_supperdwarf_idle_1_eating_food_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Ehmmm... where is my spoon?\"\nmsgstr \"Ehmm… hol van a kanalam?\"\n\n#. Key:\tchar_vo_supperdwarf_idle_2_humming_0\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Ehemm, ehemm\"\nmsgstr \"Ehemm, ehemm\"\n\n#. Key:\tchar_vo_supperdwarf_idle_2_humming_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Ohm\"\nmsgstr \"Ohm\"\n\n#. Key:\tchar_vo_teachy_idle_book_down_0\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Walking ball?\"\nmsgstr \"Sétáló labda?\"\n\n#. Key:\tchar_vo_teachy_idle_book_down_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"You?\"\nmsgstr \"Te?\"\n\n#. Key:\tchar_vo_teachy_idle_book_down_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Do you exist outside of my mind?\"\nmsgstr \"Csak a fejemben létezel?\"\n\n#. Key:\tchar_vo_teachy_idle_book_down_3\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Ehm, what?\"\nmsgstr \"Ehm, mi?\"\n\n#. Key:\tchar_vo_teachy_idle_book_up_0\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Ehmm\"\nmsgstr \"Ehmm\"\n\n#. Key:\tchar_vo_teachy_idle_book_up_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Humm\"\nmsgstr \"Humm\"\n\n#. Key:\tchar_vo_teachy_idle_book_up_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Hemm\"\nmsgstr \"Hemm\"\n\n#. Key:\tchar_vo_teachy_idle_book_up_3\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Ahm\"\nmsgstr \"Ahm\"\n\n#. Key:\tchar_vo_teachy_idle_humming_0\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Hmmm-hmmm-hmm\"\nmsgstr \"Hmmm-hmmm-hmm\"\n\n#. Key:\tchar_vo_teachy_idle_humming_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Ehmm-hmmm-uhmm\"\nmsgstr \"Ehmm-hmmm-uhmm\"\n\n#. Key:\tchar_vo_teachy_idle_humming_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Umm-huhummm\"\nmsgstr \"Umm-huhummm\"\n\n#. Key:\tchar_vo_teachy_idle_humming_speaking_long_0\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I am, therefore I think!\"\nmsgstr \"Vagyok, tehát gondolkodom!\"\n\n#. Key:\tchar_vo_teachy_idle_humming_speaking_long_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I think... I am...\"\nmsgstr \"Gondolom... vagyok...\"\n\n#. Key:\tchar_vo_teachy_idle_humming_speaking_long_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"The unexamined life is not worth living!\"\nmsgstr \"A megfigyeletlen életet nem érdemes élni!\"\n\n#. Key:\tchar_vo_teachy_idle_humming_speaking_long_3\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"The mind is furnished with ideas by a drunk upholsterer...\"\nmsgstr \"Az elmében az ötleteket egy részeg kárpitos rendezte be...\"\n\n#. Key:\tchar_vo_teachy_idle_humming_speaking_short_0\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Tic-tac\"\nmsgstr \"Tik-tak\"\n\n#. Key:\tchar_vo_teachy_idle_humming_speaking_short_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"To be...\"\nmsgstr \"Lenni...\"\n\n#. Key:\tchar_vo_teachy_idle_humming_speaking_short_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Weird\"\nmsgstr \"Fura\"\n\n#. Key:\tAnyKey\n#. SourceLocation:\tSource/SOrb/Settings/Input/SoInputNames.cpp:347\n#: Source/SOrb/Settings/Input/SoInputNames.cpp:347\nmsgctxt \"InputKeys\"\nmsgid \"Any Key\"\nmsgstr \"Valami Kulcs\"\n\n#. Key:\tDown\n#. SourceLocation:\tSource/SOrb/Settings/Input/SoInputNames.cpp:376\n#: Source/SOrb/Settings/Input/SoInputNames.cpp:376\nmsgctxt \"InputKeys\"\nmsgid \"Down\"\nmsgstr \"Le\"\n\n#. Key:\tLeft\n#. SourceLocation:\tSource/SOrb/Settings/Input/SoInputNames.cpp:373\n#: Source/SOrb/Settings/Input/SoInputNames.cpp:373\nmsgctxt \"InputKeys\"\nmsgid \"Left\"\nmsgstr \"Bal\"\n\n#. Key:\tRight\n#. SourceLocation:\tSource/SOrb/Settings/Input/SoInputNames.cpp:375\n#: Source/SOrb/Settings/Input/SoInputNames.cpp:375\nmsgctxt \"InputKeys\"\nmsgid \"Right\"\nmsgstr \"Jobb\"\n\n#. Key:\tUp\n#. SourceLocation:\tSource/SOrb/Settings/Input/SoInputNames.cpp:374\n#: Source/SOrb/Settings/Input/SoInputNames.cpp:374\nmsgctxt \"InputKeys\"\nmsgid \"Up\"\nmsgstr \"Fel\"\n\n#. Key:\tabsorb_energy\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Absorb Energy\"\nmsgstr \"Energia Csapolás\"\n\n#. Key:\tacquired_few_item\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"message when more than one item is received at once\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"A few items acquired\"\nmsgstr \"Szereztél néhány tárgyat\"\n\n#. Key:\tacquired_item\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"{0} is replaced with an item name\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"{0} acquired\"\nmsgstr \"Talált tárgy: {0}\"\n\n#. Key:\tactivate\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Activate\"\nmsgstr \"Aktivál\"\n\n#. Key:\tactivate_elevator\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Activate Elevator\"\nmsgstr \"Felvonó aktiválása\"\n\n#. Key:\taquired_silver_key\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"optional bonus message\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Silver Key Acquired\"\nmsgstr \"Ezüst Kulcsot szereztél\"\n\n#. Key:\tascend\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"climb up a ladder or rope or go up with an elevator\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Ascend\"\nmsgstr \"Fel\"\n\n#. Key:\tbed\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"examine Bed\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Bed\"\nmsgstr \"Ágy\"\n\n#. Key:\tboat_to_kitchen\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"use a boat to get to the kitchen\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Boat to the Kitchen\"\nmsgstr \"Csónakkal a Konyhába\"\n\n#. Key:\tboat_to_ruins\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"use a boat to get to a place where there are some ancient ruins\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Boat to the Ruins\"\nmsgstr \"Csónakkal a Romokhoz\"\n\n#. Key:\tboat_to_station\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"use a boat to get to the Station\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Boat to the Station\"\nmsgstr \"Csónakkal az Állomásra\"\n\n#. Key:\tcall_elevator\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Call Elevator\"\nmsgstr \"Felvonó\"\n\n#. Key:\tcandles\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"examine Candles\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Candles\"\nmsgstr \"Gyertyák\"\n\n#. Key:\tcat_bed\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"examine Tabbys (cat name) bed\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Tabby's Bed\"\nmsgstr \"Cirmos ágya\"\n\n#. Key:\tchair\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"examine Chair\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Chair\"\nmsgstr \"Szék\"\n\n#. Key:\tchange_spells\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Change Spells\"\nmsgstr \"Varázslat választás\"\n\n#. Key:\tcharge\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"charge gem in Act I\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Charge\"\nmsgstr \"Tölt\"\n\n#. Key:\tcheck_door\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"check door \"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Check Door\"\nmsgstr \"Ajtó\"\n\n#. Key:\tchest\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"examine Chest\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Chest\"\nmsgstr \"Láda\"\n\n#. Key:\tchest_check\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Check Chest\"\nmsgstr \"Láda\"\n\n#. Key:\tchest_check_small\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Check Small Chest\"\nmsgstr \"Kis Láda\"\n\n#. Key:\tchest_close\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Close Chest\"\nmsgstr \"Bezár\"\n\n#. Key:\tchest_close_small\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Close Small Chest\"\nmsgstr \"Bezár\"\n\n#. Key:\tchest_open\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Open Chest\"\nmsgstr \"Kinyit\"\n\n#. Key:\tchest_open_small\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Open Small Chest\"\nmsgstr \"Kinyit\"\n\n#. Key:\tclose_door\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Close Door\"\nmsgstr \"Becsuk\"\n\n#. Key:\tcross_planks\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Cross Planks\"\nmsgstr \"Át a pallón\"\n\n#. Key:\tdads_room\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"examine Dad's Room\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Daddy's Room\"\nmsgstr \"Apa Szobája\"\n\n#. Key:\tdescend\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"climb down a ladder or rope or go down with an elevator\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Descend\"\nmsgstr \"Le\"\n\n#. Key:\tdestroy\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"destroy device in EndFinal level\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Destroy\"\nmsgstr \"Tönkretesz\"\n\n#. Key:\tdevice\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"use Device\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Device\"\nmsgstr \"Szerkezet\"\n\n#. Key:\tdoor\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"examine Door\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Door\"\nmsgstr \"Ajtó\"\n\n#. Key:\tdoor_does_not_open_from_this_side\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"message when character tries to open a door but it can only be openned from the other side\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Door does not open from this side!\"\nmsgstr \"Nem nyílik erről az oldalról!\"\n\n#. Key:\tdoor_opened\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"door openned\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Door opened\"\nmsgstr \"Ajtó kinyitva\"\n\n#. Key:\tdrop\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"drop box or carryable\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Drop\"\nmsgstr \"Letesz\"\n\n#. Key:\televator_activated\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Elevator Activated\"\nmsgstr \"Felvonó Aktiválva\"\n\n#. Key:\televator_inactive\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"player tries to use the elevator but it is inactive\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"The elevator seems to be inactive\"\nmsgstr \"Úgy tűnik, a felvonó nem üzemel\"\n\n#. Key:\televator_not_move_to_dir\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"player tries to use an elevator but the direction is not activated yet\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"The elevator does not move to the selected direction\"\nmsgstr \"A felvonó nem megy ebbe az irányba\"\n\n#. Key:\tenter\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"teleport - enter a room or a portal\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Enter\"\nmsgstr \"Be\"\n\n#. Key:\tenter_bridge\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Enter Bridge\"\nmsgstr \"Híd\"\n\n#. Key:\tenter_cave\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Enter Cave\"\nmsgstr \"Barlang\"\n\n#. Key:\tenter_flames\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Enter Flames\"\nmsgstr \"Lángok\"\n\n#. Key:\tenter_gate\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Enter Gate\"\nmsgstr \"Kapu\"\n\n#. Key:\tenter_hut\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Enter Hut\"\nmsgstr \"Kunyhó\"\n\n#. Key:\tenter_kitchen\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Enter Kitchen\"\nmsgstr \"Konyha\"\n\n#. Key:\tenter_pipe\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Enter Pipe\"\nmsgstr \"Cső\"\n\n#. Key:\tenter_portal\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Enter Portal\"\nmsgstr \"Átjáró\"\n\n#. Key:\tenter_stairs_left\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Enter Stairs on the Left\"\nmsgstr \"Bal Lépcső\"\n\n#. Key:\tenter_stairs_right\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Enter Stairs on the Right\"\nmsgstr \"Jobb Lépcső\"\n\n#. Key:\tenter_tower\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Enter Tower\"\nmsgstr \"Torony\"\n\n#. Key:\tentrace_locked\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Entrance locked from the other side\"\nmsgstr \"A bejárat a másik oldalról van lezárva\"\n\n#. Key:\texamine\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"examine a statue or some other interactable object which triggers dialogue or hint message\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Examine\"\nmsgstr \"Megvizsgál\"\n\n#. Key:\texamine_device\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Examine Device\"\nmsgstr \"Szerkezet\"\n\n#. Key:\texamine_elevator\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Examine Elevator\"\nmsgstr \"Felvonó\"\n\n#. Key:\texamine_switch\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"it is a lightswitch\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Examine Switch\"\nmsgstr \"Megvizsgál\"\n\n#. Key:\texit\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"exit room\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Exit\"\nmsgstr \"Kijárat\"\n\n#. Key:\texplore_stations\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Explore more stations before using the railway system.\"\nmsgstr \"Több állomást kell felfedezned, hogy vonattal utazhass.\"\n\n#. Key:\tfinish_demo\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"teleport at the end of demo\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Finish Demo\"\nmsgstr \"Demó vége\"\n\n#. Key:\tfire\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"fires a cannon\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Fire\"\nmsgstr \"Tűz\"\n\n#. Key:\tgo_down\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"go down the stairs\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Go down\"\nmsgstr \"Le\"\n\n#. Key:\tgo_up\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"go up the stairs\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Go up\"\nmsgstr \"Fel\"\n\n#. Key:\tinspect_fountain\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Inspect Fountain\"\nmsgstr \"Szökőkút\"\n\n#. Key:\tinventory\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"hint for hotkey to open the inventory\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Inventory\"\nmsgstr \"Felszerelés\"\n\n#. Key:\tkey_missing\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"{0} is the key name\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Key Missing: {0}\"\nmsgstr \"Hiányzó kulcs: {0}\"\n\n#. Key:\tkick_rope\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"a pile of rope can be kicked to be able to climb up/down on it\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Kick Rope\"\nmsgstr \"Kötél\"\n\n#. Key:\tlaboratory\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"examine/enter Laboratory\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Laboratory\"\nmsgstr \"Laborítórium\"\n\n#. Key:\tlamps\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"examine Lamps\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Lamps\"\nmsgstr \"Lámpák\"\n\n#. Key:\tleave\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"teleport - leave a room, chest, level\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Leave\"\nmsgstr \"Ki\"\n\n#. Key:\tleave_bridge\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Leave Bridge\"\nmsgstr \"Le a Hídról\"\n\n#. Key:\tleave_cave\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Leave Cave\"\nmsgstr \"Ki a Barlangból\"\n\n#. Key:\tleave_circle\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Leave Circle\"\nmsgstr \"Ki a Körből\"\n\n#. Key:\tleave_hut\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Leave Hut\"\nmsgstr \"Ki a Kunyhóból\"\n\n#. Key:\tleft_lever\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"use Left Lever\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Left Lever\"\nmsgstr \"Bal Kar\"\n\n#. Key:\tlever_is_active\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Lever activated. The crystal broke.\"\nmsgstr \"Kar aktiválva. A kristály eltört.\"\n\n#. Key:\tlever_is_inactive\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"a lever\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Seems to be inactive\"\nmsgstr \"Úgy tűnik, nem üzemel\"\n\n#. Key:\tmemory_stone_aquire\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Acquire Memory Stone\"\nmsgstr \"Emlék Kristály\"\n\n#. Key:\tmemory_stone_gained\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Memory Stone Gained\"\nmsgstr \"Emlékkövet szereztél\"\n\n#. Key:\tmiddle_lever\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"use Middle Lever \"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Middle Lever\"\nmsgstr \"Középső Kar\"\n\n#. Key:\tmoms_room\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"examine Mom's Room\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Mom's Room\"\nmsgstr \"Anyu Szobája\"\n\n#. Key:\tnotebook\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"examine Notebook\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Notebook\"\nmsgstr \"Jegyzet\"\n\n#. Key:\topen\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"door can be openned\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Open\"\nmsgstr \"Nyit\"\n\n#. Key:\topen_door\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Open Door\"\nmsgstr \"Ajtó\"\n\n#. Key:\tpainting\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"examine Painting\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Painting\"\nmsgstr \"Festmény\"\n\n#. Key:\tpaintings\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"examine Paintings\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Paintings\"\nmsgstr \"Festmények\"\n\n#. Key:\tpass_bridge\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Pass Bridge\"\nmsgstr \"Át a Hídon\"\n\n#. Key:\tpick_up\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"pick up box or carryable\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Pick Up\"\nmsgstr \"Felvesz\"\n\n#. Key:\tplace_rope\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Place Rope\"\nmsgstr \"Kötél\"\n\n#. Key:\tprimary_strike\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"hint with control key for strike 1 of the character\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Primary Strike\"\nmsgstr \"Alap Támadás\"\n\n#. Key:\tpull\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"pull a lever\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Pull\"\nmsgstr \"Húz\"\n\n#. Key:\tpull_lever\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Pull Lever\"\nmsgstr \"Kar\"\n\n#. Key:\tpush\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"push a sphere shaped rock from the edge to break some stuff\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Push\"\nmsgstr \"Tol\"\n\n#. Key:\tput_weapon_away\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"hint with control key to show how to put the weapon away\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Put Weapon Away\"\nmsgstr \"Fegyver eltétel\"\n\n#. Key:\tread\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"interaction hint if the character can read a scroll or book\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Read\"\nmsgstr \"Olvas\"\n\n#. Key:\tread_dictionary\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Read Dictionary\"\nmsgstr \"Szótár\"\n\n#. Key:\tread_symbols\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Read Symbols\"\nmsgstr \"Szimbólumok\"\n\n#. Key:\trelease_keeper\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Release Keeper\"\nmsgstr \"Őrző elengedése\"\n\n#. Key:\treplay_boss_fight\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"interaction hint to play a boss fight which was already won\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Replay Boss Fight\"\nmsgstr \"Küzdelem újrajátszása\"\n\n#. Key:\treset_portals\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"lever\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Reset Portals\"\nmsgstr \"Visszaállít\"\n\n#. Key:\trest\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"rest near a checkpoint statue where character can sleep and change spells and listen to music\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Rest\"\nmsgstr \"Pihen\"\n\n#. Key:\trestore\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"restore the HP\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Restore\"\nmsgstr \"Visszaállítás\"\n\n#. Key:\tright_lever\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"use Right Lever\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Right Lever\"\nmsgstr \"Jobb Kar\"\n\n#. Key:\tring_bell\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"there is a bell the character has to use to start the conversation with a merchant\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Ring the bell\"\nmsgstr \"Csengő\"\n\n#. Key:\trope_can_be_placed\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"A rope could be placed here\"\nmsgstr \"Kötelet rögzíthetsz ide\"\n\n#. Key:\trope_kicked\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"feedback on the kick rope action\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Rope kicked\"\nmsgstr \"Kötél lelökve\"\n\n#. Key:\trope_placed\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Rope placed\"\nmsgstr \"Kötél elhelyezve\"\n\n#. Key:\tsail\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"use ship for travel\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Sail\"\nmsgstr \"Vitorlás\"\n\n#. Key:\tsoulkeeper_released\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Soulkeeper released\"\nmsgstr \"Lélekőr elengedve\"\n\n#. Key:\tspecial_strike\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"hint with control key for strike 2 of the character\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Special Strike\"\nmsgstr \"Különleges Támadás\"\n\n#. Key:\tstairs\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"enter stairs\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Stairs\"\nmsgstr \"Lépcsők\"\n\n#. Key:\tstone_added\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"{0} is the stone amount, {1} is the stone name\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"{0} {1} added to your bag!\"\nmsgstr \"{0} {1} betéve a zsákba!\"\n\n#. Key:\tstone_cant_carry\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"{0} is the stone name\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"You can't carry more {0}\"\nmsgstr \"Nem tudsz többet elvinni ebből: {0}\"\n\n#. Key:\tstone_cant_store\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"{0} is the stone name\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"You don't have anything you could use to store {0}\"\nmsgstr \"Nincs nálad semmi, amiben ezt tarthatnád: {0}\"\n\n#. Key:\tswing\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"Swings on the pole with the arms\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Swing\"\nmsgstr \"Lengés\"\n\n#. Key:\tswitch_interact\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"Switch interact alternative,  between the two modes\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Switch\"\nmsgstr \"Vált\"\n\n#. Key:\ttake\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"character can take an item\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Take\"\nmsgstr \"Elvesz\"\n\n#. Key:\ttake_a_seat\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Take a seat\"\nmsgstr \"Szék\"\n\n#. Key:\ttake_abacus\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Take Abacus\"\nmsgstr \"Abakuszt elvesz\"\n\n#. Key:\ttake_all\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Take All\"\nmsgstr \"Mindent elvesz\"\n\n#. Key:\ttake_axe\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"character can take a weapon\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Take Axe\"\nmsgstr \"Fejszék\"\n\n#. Key:\ttake_blades\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"character can take two swords to go dual wield\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Take Blades\"\nmsgstr \"Pengék\"\n\n#. Key:\ttake_books\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"character can take (two) books\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Take Books\"\nmsgstr \"Könyvek\"\n\n#. Key:\ttake_mace\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"character can take a weapon\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Take Mace\"\nmsgstr \"Buzogány\"\n\n#. Key:\ttake_mushrooms\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Take Mushrooms\"\nmsgstr \"Gombák\"\n\n#. Key:\ttake_rope\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Take Rope\"\nmsgstr \"Kötél\"\n\n#. Key:\ttake_sabre\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"character can take a weapon\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Take Sabre\"\nmsgstr \"Szablya\"\n\n#. Key:\ttake_spellcaster\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"the Spellcaster is an amulet the character can use to cast spells\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Take Spellcaster\"\nmsgstr \"Bűvölő\"\n\n#. Key:\ttake_stones\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Take Stones\"\nmsgstr \"Kövek\"\n\n#. Key:\ttake_sword\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"character can take a weapon\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Take Sword\"\nmsgstr \"Kard\"\n\n#. Key:\ttake_wheel\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Take Wheel\"\nmsgstr \"Kerék\"\n\n#. Key:\ttalk\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Talk\"\nmsgstr \"Megszólít\"\n\n#. Key:\ttoggle_switch\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"it is a lightswitch\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Toggle Switch\"\nmsgstr \"Vált\"\n\n#. Key:\ttouch_statue\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Touch Statue\"\nmsgstr \"Szobor\"\n\n#. Key:\ttravel\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"travel on the train station path\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Travel\"\nmsgstr \"Utazás\"\n\n#. Key:\tunlocked_with\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"{0} is the key name\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Unlocked with {0}\"\nmsgstr \"Kinyitva ezzel: {0}\"\n\n#. Key:\tuse\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"use device in EndFinal level\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Use\"\nmsgstr \"Használ\"\n\n#. Key:\tuse_active_item\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"uses the active item\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Use Active Item\"\nmsgstr \"Használ\"\n\n#. Key:\tuse_crystal\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Use Crystal\"\nmsgstr \"Kristály\"\n\n#. Key:\tuse_destroy_explained\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Destroy the device to save the creatures of Ruined Realm\"\nmsgstr \"Elpusztítom a Szerkezetet, hogy megmentsem a Fertőzött Föld lakóit\"\n\n#. Key:\tuse_device\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Use Device\"\nmsgstr \"Használ\"\n\n#. Key:\tuse_elevator\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Use Elevator\"\nmsgstr \"Felvonó\"\n\n#. Key:\tuse_elevator_gem\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Use Elevator Gem\"\nmsgstr \"Felvonó Kő\"\n\n#. Key:\tuse_magic_mirror\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Use Magic Mirror\"\nmsgstr \"Varázstükör\"\n\n#. Key:\tuse_separate_explained\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Use the device to separate the Realms\"\nmsgstr \"Használom a Szerkezetet, hogy elválasszam a Világokat\"\n\n#. Key:\tuse_switch\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"for the moria gate\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Use switch\"\nmsgstr \"Kar\"\n\n#. Key:\tuse_workshop\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Use Workshop\"\nmsgstr \"Műhely\"\n\n#. Key:\twheel_release\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"release lever wheel\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Release\"\nmsgstr \"Elenged\"\n\n#. Key:\twheel_turn\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"turn lever wheel\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Turn\"\nmsgstr \"Forgat\"\n\n#. Key:\twindow\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"examine Window\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Window\"\nmsgstr \"Ablak\"\n\n#. Key:\tworkroom\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"examine/enter Workroom\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Workroom\"\nmsgstr \"Dolgozó Szoba\"\n\n#. Key:\tyou_are_worthy\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"gate golem tutorial level message interaction\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"You are not worthy!\"\nmsgstr \"Nem vagy méltó!\"\n\n#. Key:\tice_stone_Name\n#. SourceLocation:\tLocalization/StringTables/Items.csv\n#: Localization/StringTables/Items.csv\nmsgctxt \"Items\"\nmsgid \"Ice Stone\"\nmsgstr \"Jég Kő\"\n\n#. Key:\ttest_stone_name\n#. SourceLocation:\tLocalization/StringTables/Items.csv\n#: Localization/StringTables/Items.csv\nmsgctxt \"Items\"\nmsgid \"Test Stone\"\nmsgstr \"Teszt Kő\"\n\n#. Key:\tbook\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:494\n#: Source/SOrb/Basic/SoGameSingleton.cpp:494\nmsgctxt \"ItemsCommon\"\nmsgid \"Something to read\"\nmsgstr \"Olvasnivaló\"\n\n#. Key:\tcooldown\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:501\n#: Source/SOrb/Basic/SoGameSingleton.cpp:501\nmsgctxt \"ItemsCommon\"\nmsgid \"Cooldown\"\nmsgstr \"Újratöltődés\"\n\n#. Key:\tcrossbow\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:487\n#: Source/SOrb/Basic/SoGameSingleton.cpp:487\nmsgctxt \"ItemsCommon\"\nmsgid \"Something to shoot with\"\nmsgstr \"Lőfegyver\"\n\n#. Key:\tdefensive\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:472\n#: Source/SOrb/Basic/SoGameSingleton.cpp:472\nmsgctxt \"ItemsCommon\"\nmsgid \"Shard of Protection\"\nmsgstr \"Védelmező Szilánk\"\n\n#. Key:\tdualwield\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:480\n#: Source/SOrb/Basic/SoGameSingleton.cpp:480\nmsgctxt \"ItemsCommon\"\nmsgid \"Dual Wield Weapon\"\nmsgstr \"Dupla Fegyver\"\n\n#. Key:\thealth\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:498\n#: Source/SOrb/Basic/SoGameSingleton.cpp:498\nmsgctxt \"ItemsCommon\"\nmsgid \"Health\"\nmsgstr \"Életerő\"\n\n#. Key:\tinvalid_shard_max\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:475\n#: Source/SOrb/Basic/SoGameSingleton.cpp:475\nmsgctxt \"ItemsCommon\"\nmsgid \"Invalid\"\nmsgstr \"Érvénytelen\"\n\n#. Key:\tinvalid_weapon_max\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:481\n#: Source/SOrb/Basic/SoGameSingleton.cpp:481\nmsgctxt \"ItemsCommon\"\nmsgid \"Invalid Weapon\"\nmsgstr \"Érvénytelen Fegyver\"\n\n#. Key:\titem\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:492\n#. Key:\tkeylikeitem\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:491\n#: Source/SOrb/Basic/SoGameSingleton.cpp:491\n#: Source/SOrb/Basic/SoGameSingleton.cpp:492\nmsgctxt \"ItemsCommon\"\nmsgid \"Something interesting\"\nmsgstr \"Valami érdekes\"\n\n#. Key:\tjewelry\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:469\n#: Source/SOrb/Basic/SoGameSingleton.cpp:469\nmsgctxt \"ItemsCommon\"\nmsgid \"Valuable\"\nmsgstr \"Érték\"\n\n#. Key:\tkey\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:466\n#: Source/SOrb/Basic/SoGameSingleton.cpp:466\nmsgctxt \"ItemsCommon\"\nmsgid \"Key\"\nmsgstr \"Kulcs\"\n\n#. Key:\tMemoryStone\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:465\n#: Source/SOrb/Basic/SoGameSingleton.cpp:465\nmsgctxt \"ItemsCommon\"\nmsgid \"Memory Stone\"\nmsgstr \"Emlék Kő\"\n\n#. Key:\toffensive\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:473\n#: Source/SOrb/Basic/SoGameSingleton.cpp:473\nmsgctxt \"ItemsCommon\"\nmsgid \"Shard of Justice\"\nmsgstr \"Az Igazság Szilánkja\"\n\n#. Key:\tonehanded\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:478\n#: Source/SOrb/Basic/SoGameSingleton.cpp:478\nmsgctxt \"ItemsCommon\"\nmsgid \"One-Handed Weapon\"\nmsgstr \"Egykezes Fegyver\"\n\n#. Key:\tpotion\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:484\n#: Source/SOrb/Basic/SoGameSingleton.cpp:484\nmsgctxt \"ItemsCommon\"\nmsgid \"Something to drink\"\nmsgstr \"Innivaló\"\n\n#. Key:\tQuestItem\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:464\n#: Source/SOrb/Basic/SoGameSingleton.cpp:464\nmsgctxt \"ItemsCommon\"\nmsgid \"Quest Item\"\nmsgstr \"Küldetéssel kapcsolatos tárgy\"\n\n#. Key:\tRuneStone\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:467\n#: Source/SOrb/Basic/SoGameSingleton.cpp:467\nmsgctxt \"ItemsCommon\"\nmsgid \"Runestone\"\nmsgstr \"Rúna Kő\"\n\n#. Key:\tshard\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:462\n#: Source/SOrb/Basic/SoGameSingleton.cpp:462\nmsgctxt \"ItemsCommon\"\nmsgid \"Shard\"\nmsgstr \"Szilánk\"\n\n#. Key:\tsomething_unlock\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:490\n#: Source/SOrb/Basic/SoGameSingleton.cpp:490\nmsgctxt \"ItemsCommon\"\nmsgid \"Something to unlock with\"\nmsgstr \"Zárnyitó eszköz\"\n\n#. Key:\tspecial\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:474\n#: Source/SOrb/Basic/SoGameSingleton.cpp:474\nmsgctxt \"ItemsCommon\"\nmsgid \"Shard of Wonder\"\nmsgstr \"Csoda Szilánk\"\n\n#. Key:\tspeed\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:497\n#: Source/SOrb/Basic/SoGameSingleton.cpp:497\nmsgctxt \"ItemsCommon\"\nmsgid \"Attack Speed\"\nmsgstr \"Ütés gyorsaság\"\n\n#. Key:\tspell\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:486\n#: Source/SOrb/Basic/SoGameSingleton.cpp:486\nmsgctxt \"ItemsCommon\"\nmsgid \"Something to cast with\"\nmsgstr \"Igéző eszköz\"\n\n#. Key:\tspellcapacitycost\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:499\n#: Source/SOrb/Basic/SoGameSingleton.cpp:499\nmsgctxt \"ItemsCommon\"\nmsgid \"Capacity Cost\"\nmsgstr \"Fenntartási költség\"\n\n#. Key:\tspellusagecount\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:500\n#: Source/SOrb/Basic/SoGameSingleton.cpp:500\nmsgctxt \"ItemsCommon\"\nmsgid \"Charge\"\nmsgstr \"Töltet\"\n\n#. Key:\tthrowable\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:485\n#: Source/SOrb/Basic/SoGameSingleton.cpp:485\nmsgctxt \"ItemsCommon\"\nmsgid \"Something to throw\"\nmsgstr \"Hajítani való\"\n\n#. Key:\ttwohanded\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:479\n#: Source/SOrb/Basic/SoGameSingleton.cpp:479\nmsgctxt \"ItemsCommon\"\nmsgid \"Two-Handed Weapon\"\nmsgstr \"Kétkezes Fegyver\"\n\n#. Key:\tusable\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:463\n#: Source/SOrb/Basic/SoGameSingleton.cpp:463\nmsgctxt \"ItemsCommon\"\nmsgid \"Usable\"\nmsgstr \"Használati tárgy\"\n\n#. Key:\tweapon\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:468\n#: Source/SOrb/Basic/SoGameSingleton.cpp:468\nmsgctxt \"ItemsCommon\"\nmsgid \"Weapon\"\nmsgstr \"Fegyver\"\n\n#. Key:\tmus1_combat_1_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(6).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(6).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Disfunctional Golems\"\nmsgstr \"Hiba a készülékben\"\n\n#. Key:\tmus1_combat_2_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(16).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(16).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Machine Rage\"\nmsgstr \"A Gép bosszúja\"\n\n#. Key:\tmus1_combat_GateKeeper_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(2).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(2).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Worthy\"\nmsgstr \"Méltó\"\n\n#. Key:\tmus1_dlg_Generic_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(7).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(7).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Unexpected Friend\"\nmsgstr \"Váratlan barát\"\n\n#. Key:\tmus1_dlg_Golem_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(9).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(9).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Duty\"\nmsgstr \"Kötelesség\"\n\n#. Key:\tmus1_dlg_Lory_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(8).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(8).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"The other Bell\"\nmsgstr \"A másik csengő\"\n\n#. Key:\tmus1_dlg_Monk_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(10).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(10).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Enlightened Mind\"\nmsgstr \"Tiszta elme\"\n\n#. Key:\tmus1_dlg_Raven_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(11).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(11).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Winged Wisdom\"\nmsgstr \"Bölcs Barát\"\n\n#. Key:\tmus1_dlg_SewerCreature_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(32).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(32).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Pipe Walkers\"\nmsgstr \"Battyogók\"\n\n#. Key:\tmus1_dlg_Teachy_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(12).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(12).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Just a bit crazy\"\nmsgstr \"Csak kicsit őrült\"\n\n#. Key:\tmus1_env_AncientArcade_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(1).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(1).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Remnant Colors\"\nmsgstr \"A maradék szín\"\n\n#. Key:\tmus1_env_GreyGate_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(5).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(5).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Touch of Ruin\"\nmsgstr \"Fertőzés\"\n\n#. Key:\tmus1_env_SecondArcade_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(17).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(17).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"In Memoriam\"\nmsgstr \"Emlékezetül\"\n\n#. Key:\tmus1_env_TutorialLevel_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(3).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(3).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Sunken Sewer\"\nmsgstr \"Csöpögő Csatorna\"\n\n#. Key:\tmus2_combat_catacombs_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(18).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(18).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Armours of the Deep\"\nmsgstr \"A Mélység páncéljai\"\n\n#. Key:\tmus2_combat_DwarvenBoss_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(19).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(19).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"I hold it back\"\nmsgstr \"Visszatartom\"\n\n#. Key:\tmus2_combat_LavaBoss_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(20).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(20).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Meant to be Perfect\"\nmsgstr \"Tökéletesre tervezve\"\n\n#. Key:\tmus2_combat_WrackedWaterpath_2_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(22).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(22).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Wracked Warriors\"\nmsgstr \"Hiábavaló Harcosok\"\n\n#. Key:\tmus2_combat_WrackedWaterpath_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(21).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(21).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Those who survived\"\nmsgstr \"Akik megmaradtak\"\n\n#. Key:\tmus2_combat_WWBoss_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(23).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(23).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"No price too high\"\nmsgstr \"Nincs túl nagy ár\"\n\n#. Key:\tmus2_dlg_Gnory_Fishy_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(33).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(33).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Intelligence and Wisdom\"\nmsgstr \"Intelligencia és Bölcsesség\"\n\n#. Key:\tmus2_dlg_GolemMaker_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(34).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(34).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Lost Memories\"\nmsgstr \"Eltűnt Emlékek\"\n\n#. Key:\tmus2_dlg_MerchAnt_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(35).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(35).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Small but Tiny\"\nmsgstr \"Kicsi, de apró\"\n\n#. Key:\tmus2_dlg_SupperDwarf_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(36).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(36).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Supper time\"\nmsgstr \"Vacsora idő\"\n\n#. Key:\tmus2_env_Catacombs_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(24).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(24).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Dwarven Catacombs\"\nmsgstr \"Törp Tárnák\"\n\n#. Key:\tmus2_env_CrossroadCave_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(25).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(25).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Railway Station\"\nmsgstr \"Vasútállomás\"\n\n#. Key:\tmus2_env_DwarvenGate_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(26).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(26).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Sanctuary of Law\"\nmsgstr \"A Törvény Szentélye\"\n\n#. Key:\tmus2_env_DwarvenOutpost_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(27).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(27).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Where the rail leads\"\nmsgstr \"Ahová a vasút vezet\"\n\n#. Key:\tmus2_env_Kobold_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(15).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(15).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Last of his Tribe\"\nmsgstr \"Utolsó a törzsből\"\n\n#. Key:\tmus2_env_LavaDeep_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(28).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(28).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Temple for the Ancestors\"\nmsgstr \"Templom az Elődöknek\"\n\n#. Key:\tmus2_env_LavaEntrance_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(29).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(29).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Pilgrim Road\"\nmsgstr \"Zarándokút\"\n\n#. Key:\tmus2_env_WrackedWaterpath_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(30).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(30).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Quick and Clever\"\nmsgstr \"Gyors és eszes\"\n\n#. Key:\tmus3_combat_Bubble_Ground_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(14).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(14).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Infected Golems\"\nmsgstr \"Meghibásodott Gólemek\"\n\n#. Key:\tmus3_env_BubbleGround_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(38).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(38).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"So close yet so far\"\nmsgstr \"Oly közel, és mégis oly távol\"\n\n#. Key:\tmus3_env_CaveHouse_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(39).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(39).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Last Shalter\"\nmsgstr \"Utolsó Menedék\"\n\n#. Key:\tmus3_env_PipePuzzle_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(40).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(40).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Moving Pipes\"\nmsgstr \"Mozgó csövek\"\n\n#. Key:\tmus3_env_Raven_Puzzle_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(41).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(41).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"One would fail\"\nmsgstr \"Egy elbukna\"\n\n#. Key:\tmus3_env_RuinedRealm_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(42).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(42).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"The end, really\"\nmsgstr \"A vég, tényleg\"\n\n#. Key:\tmus_chase_theme_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(4).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(4).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Jump for your life!\"\nmsgstr \"Ugorj, ha kedves az életed!\"\n\n#. Key:\tmus_cm_WhiteWall_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(13).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(13).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Decaying City\"\nmsgstr \"Omladozó Város\"\n\n#. Key:\tmus_ending_dlg_UnknownWizard_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(37).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(37).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"All is lost\"\nmsgstr \"Minden elveszett\"\n\n#. Key:\tmus_main_theme_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(0).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(0).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Spirit of the Unknown\"\nmsgstr \"Lélek az Ismeretlenből\"\n\n#. Key:\tmus_waterpath_alter_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(43).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(43).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Stories never end\"\nmsgstr \"Minden történet végtelen\"\n\n#. Key:\tblocked\n#. SourceLocation:\tLocalization/StringTables/Spells.csv\n#. InfoMetaData:\t\"Comment\" : \" displayed as floating test ingame when a certain enemy blocks certain attacks\"\n#: Localization/StringTables/Spells.csv\nmsgctxt \"Spells\"\nmsgid \"Blocked\"\nmsgstr \"Kivédve\"\n\n#. Key:\tcant_use_in_air\n#. SourceLocation:\tLocalization/StringTables/Spells.csv\n#. InfoMetaData:\t\"Comment\" : \" displayed as floating test ingame when the character tries to use a spell in air which can not be used there\"\n#: Localization/StringTables/Spells.csv\nmsgctxt \"Spells\"\nmsgid \"Can't in air\"\nmsgstr \"Levegőben nem lehet\"\n\n#. Key:\tcant_use_sk_free_zone\n#. SourceLocation:\tLocalization/StringTables/Spells.csv\n#. InfoMetaData:\t\"Comment\" : \" displayed as floating test ingame when character tries to use the respawn point spell on a location when it is not allowed\"\n#: Localization/StringTables/Spells.csv\nmsgctxt \"Spells\"\nmsgid \"Dangerous Location\"\nmsgstr \"Veszélyes hely\"\n\n#. Key:\thp_gained\n#. SourceLocation:\tLocalization/StringTables/Spells.csv\n#. InfoMetaData:\t\"Comment\" : \" displayed as floating test ingame when the character increases his max health\"\n#: Localization/StringTables/Spells.csv\nmsgctxt \"Spells\"\nmsgid \"Health Increased!\"\nmsgstr \"Életerő növekedés\"\n\n#. Key:\timmune\n#. SourceLocation:\tLocalization/StringTables/Spells.csv\n#. InfoMetaData:\t\"Comment\" : \"displayed as floating text ingame if enemy is immune to a spell or damage type\"\n#: Localization/StringTables/Spells.csv\nmsgctxt \"Spells\"\nmsgid \"Immune\"\nmsgstr \"Immunins\"\n\n#. Key:\tinfected\n#. SourceLocation:\tLocalization/StringTables/Spells.csv\n#. InfoMetaData:\t\"Comment\" : \" displayed as floating test ingame when dmg over time effect is applied on enemy\"\n#: Localization/StringTables/Spells.csv\nmsgctxt \"Spells\"\nmsgid \"Infected\"\nmsgstr \"Fertőzve\"\n\n#. Key:\tinstant_recharge\n#. SourceLocation:\tLocalization/StringTables/Spells.csv\n#. InfoMetaData:\t\"Comment\" : \" displayed as floating test ingame when a spell can be used again without waiting for the cooldown time\"\n#: Localization/StringTables/Spells.csv\nmsgctxt \"Spells\"\nmsgid \"Instant Recharge\"\nmsgstr \"Azonnali visszatöltés\"\n\n#. Key:\tmissing_target\n#. SourceLocation:\tLocalization/StringTables/Spells.csv\n#. InfoMetaData:\t\"Comment\" : \" displayed as floating test ingame when the character tries to use a spell which requires a target but there is none in range\"\n#: Localization/StringTables/Spells.csv\nmsgctxt \"Spells\"\nmsgid \"Who? Where? What?!\"\nmsgstr \"Hol? Mit? Miért?\"\n\n#. Key:\tno_need_for_heal\n#. SourceLocation:\tLocalization/StringTables/Spells.csv\n#. InfoMetaData:\t\"Comment\" : \" displayed as floating test ingame when the character tries to use heal spell but has max health already\"\n#: Localization/StringTables/Spells.csv\nmsgctxt \"Spells\"\nmsgid \"No need\"\nmsgstr \"Nem szükséges\"\n\n#. Key:\tresisted\n#. SourceLocation:\tLocalization/StringTables/Spells.csv\n#. InfoMetaData:\t\"Comment\" : \"displayed as floating text ingame if enemy has a chance to avoid an effect and he is lucky\"\n#: Localization/StringTables/Spells.csv\nmsgctxt \"Spells\"\nmsgid \"Resisted\"\nmsgstr \"Ellenállt\"\n\n#. Key:\tsecond_chance\n#. SourceLocation:\tLocalization/StringTables/Spells.csv\n#. InfoMetaData:\t\"Comment\" : \" displayed as floating test ingame if char has the effect on and dies and respawns because the effect saves him\"\n#: Localization/StringTables/Spells.csv\nmsgctxt \"Spells\"\nmsgid \"Second Chance\"\nmsgstr \"Második Esély\"\n\n#. Key:\tspell_capacity_gained\n#. SourceLocation:\tLocalization/StringTables/Spells.csv\n#. InfoMetaData:\t\"Comment\" : \" displayed as floating test ingame when the character increases his spellpower\"\n#: Localization/StringTables/Spells.csv\nmsgctxt \"Spells\"\nmsgid \"Spellpower Increased!\"\nmsgstr \"Varázserő növekedés!\"\n\n#. Key:\tspell_regained\n#. SourceLocation:\tLocalization/StringTables/Spells.csv\n#. InfoMetaData:\t\"Comment\" : \" displayed as floating test ingame when the character regains a spell (can cast again)\"\n#: Localization/StringTables/Spells.csv\nmsgctxt \"Spells\"\nmsgid \"Spell Charge Regained!\"\nmsgstr \"Varázslat Újratöltés Visszanyerve!\"\n\n#. Key:\tacknowledge\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Button\"\n#. Key:\tgroup_defeated_ack\n#. InfoMetaData:\t\"Comment\" : \"the hotkey to close the group defeated panel\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Acknowledge\"\nmsgstr \"Tudomásul vesz\"\n\n#. Key:\tback\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Button\"\n#. Key:\tpanel_command_inv_back\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Back\"\nmsgstr \"Vissza\"\n\n#. Key:\tblack_fade_teleport_text_1\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Now I remember the night when it started...\"\nmsgstr \"Már emlékszem az estére, amikor az egész kezdődött...\"\n\n#. Key:\tbubble_float\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"bubble tip for the char to float\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Float\"\nmsgstr \"Lebeg\"\n\n#. Key:\tbubble_jump\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"bubble tip for the char to jump\"\n#. Key:\tinput_jump\n#. InfoMetaData:\t\"Comment\" : \"Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Jump\"\nmsgstr \"Ugrás\"\n\n#. Key:\tbuy\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"buy item\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Buy\"\nmsgstr \"Vesz\"\n\n#. Key:\tbuy_back\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"buy back item\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Buy Back\"\nmsgstr \"Visszavásárlás\"\n\n#. Key:\tbuy_on_steam_and_follow\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Buy WarriOrb in Steam and follow us on social media:\"\nmsgstr \"Vedd meg a WarriOrb-ot Steamen, és kövess minket a közösségi oldalakon:\"\n\n#. Key:\tcancel\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Confirm popup\"\n#. Key:\tsettings_cancel\n#. InfoMetaData:\t\"Comment\" : \"Settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Cancel\"\nmsgstr \"Mégsem\"\n\n#. Key:\tchange_user\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Change User\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Change User\"\nmsgstr \"Felhasználó Váltás\"\n\n#. Key:\tchapter\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Stats for saves\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Chapter\"\nmsgstr \"Fejezet\"\n\n#. Key:\tchapter1_completed\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Temporary for chapter 1\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Chapter 1 completed. Save is Locked.\"\nmsgstr \"Első fejezet teljesítve. Mentés lezárva.\"\n\n#. Key:\tcharacter_skin_classic\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"name of the original character skin\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Classic\"\nmsgstr \"Klasszikus\"\n\n#. Key:\tcharacter_skin_desc\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"description for the character skin option\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Changes the visuals of the player character\"\nmsgstr \"Megváltoztatja a játékos karakter kinézetét\"\n\n#. Key:\tcharacter_skin_mummy\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"name of the alternative character skin\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Mummy\"\nmsgstr \"Múmia\"\n\n#. Key:\tcharacter_skin_pumpkin\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"name of the alternative character skin\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Pumpkin\"\nmsgstr \"Tökfej\"\n\n#. Key:\tcharacter_skin_title\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"option to change character skin\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Character Skin\"\nmsgstr \"Karakter kinézet\"\n\n#. Key:\tcheckpoint\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Stats for saves\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Checkpoint\"\nmsgstr \"Mentéshely\"\n\n#. Key:\tchest_examine\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Examine\"\nmsgstr \"Megvizsgál\"\n\n#. Key:\tchest_leave\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Leave\"\nmsgstr \"Itthagy\"\n\n#. Key:\tchest_loot\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"hotkey tip on chest\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Loot\"\nmsgstr \"Elvesz\"\n\n#. Key:\tclose\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"close book\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Close\"\nmsgstr \"Csuk\"\n\n#. Key:\tcompleted_in_time\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Custom Map\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Completed in {time}\"\nmsgstr \"Menetidő: {time}\"\n\n#. Key:\tconfirm\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Confirm popup\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Confirm\"\nmsgstr \"Megerősít\"\n\n#. Key:\tconfirm_keyboard_settings_reset\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Confirm keyboard settings\"\n#. Key:\tdifficulty_confirm_question\n#. InfoMetaData:\t\"Comment\" : \"Confirm difficulty selected popup\"\n#. Key:\tsave_slots_remove_confirm\n#. InfoMetaData:\t\"Comment\" : \"remove save slot confirm dialogue\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Are you sure?\"\nmsgstr \"Biztos vagy benne?\"\n\n#. Key:\tconsole_ps4\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"PlayStation 4\"\nmsgstr \"PlayStation 4\"\n\n#. Key:\tconsole_switch\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Switch\"\nmsgstr \"Switch\"\n\n#. Key:\tconsole_xbox_one\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"XBox One\"\nmsgstr \"XBox One\"\n\n#. Key:\tcontinue\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Menu Continue\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Continue\"\nmsgstr \"Folytatás\"\n\n#. Key:\tcontroller_recommended\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Main Menu\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Note: Playing with a controller is recommended\"\nmsgstr \"Kontroller használata javasolt\"\n\n#. Key:\tcredits\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Menu credits\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Credits\"\nmsgstr \"Credits\"\n\n#. Key:\tcustom_map_x\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Custom Map\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Custom Map {0}\"\nmsgstr \"Epizód {0}\"\n\n#. Key:\tcustom_maps\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Menu custom Maps\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Custom Maps\"\nmsgstr \"Epizódok\"\n\n#. Key:\tdescription\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Of something\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Description\"\nmsgstr \"Leírás\"\n\n#. Key:\tdifficulty\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Stats for saves\"\n#. Key:\tdifficulty_title\n#. InfoMetaData:\t\"Comment\" : \"title of difficulty selection\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Difficulty\"\nmsgstr \"Nehézség\"\n\n#. Key:\tdifficulty_confirm_subtext\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Confirm difficulty selected popup subtext\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"This choice is permanent\"\nmsgstr \"Ez a döntés végleges.\"\n\n#. Key:\tdifficulty_desc_insane\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"description of hard difficulty\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"- The <Blue>SoulKeeper</> (Portable Checkpoint) spell is removed from the game\\n- Increased incoming damage\\n- Increased Enemy Health\"\nmsgstr \"- A <Blue>Lélekőr</> (Hordozható Checkpoint) varázslat nincs játékban\\n - Minden többet sebez\\n - Az ellenfeleknek több életerejük van\"\n\n#. Key:\tdifficulty_desc_intended\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"description of normal difficulty\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"The way the game is meant to be played\"\nmsgstr \"Amilyenre a játékot terveztük.\"\n\n#. Key:\tdifficulty_desc_sane\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"description of easy difficulty\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"- Infinite <Blue>SoulKeeper</> (Checkpoint) spell charges\\n- No health penalty when respawning near the <Blue>SoulKeeper</>\\n- Decreased incoming damage\\n- Decreased Enemy Health\"\nmsgstr \"- A <Blue>Lélekőr</> (Checkpoint) varázslatot korlátlan mennyiségben használhatod\\n - Nem csökken az életerőd, ha a <Blue>Lélekőrnél</> támadsz fel\\n - Csökkentett ellenfél sebzés\\n - Csökkentett ellenfél életerő\"\n\n#. Key:\tdifficulty_insane\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"name of hard difficulty\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"As hard as it can get\"\nmsgstr \"Tényleg nagyon nehéz\"\n\n#. Key:\tdifficulty_intended\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"name of normal difficulty\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"A true challenge\"\nmsgstr \"Egy igazi kihívás\"\n\n#. Key:\tdifficulty_normal\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Normal\"\nmsgstr \"Normál\"\n\n#. Key:\tdifficulty_sane\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"name of easy difficulty\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Just an adventure\"\nmsgstr \"Csak egy kaland\"\n\n#. Key:\tdisabled\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Widget is disabled\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Disabled\"\nmsgstr \"Kikapcsolva\"\n\n#. Key:\tdiscord\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Discord\"\nmsgstr \"Discord\"\n\n#. Key:\tdrm_defeatead_description\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"check only in pirated copies \"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"We suspect that you play a pirated copy of the game.\\nIt's fine. We hope you will enjoy it!\\n\\nIf you like the game, please tell your friends about it, and maybe even consider buying it.\\n\\nWe would love to keep making games!\"\nmsgstr \"Az a sanda gyanúnk, hogy a játék virágbolti változatával játszol.\\nRészünkről oké, reméljük, tetszik a játék!\\n\\nHa így van, örülnénk, ha mesélnél róla a barátaidnak, esetleg megfontolnád, hogy mégis megveszed.\\n\\nKirály lenne, ha lenne keretünk a későbbiekben is játékfejlesztésre.\"\n\n#. Key:\tdrm_defeatead_title\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"check only in pirated copies \"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"WarriOrb DRM\"\nmsgstr \"WarriOrb DRM\"\n\n#. Key:\tdwarf_language\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Dwarf language\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Dwarf\"\nmsgstr \"Törp\"\n\n#. Key:\tempty\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Empty\"\nmsgstr \"Üres\"\n\n#. Key:\tempty_line\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"-\"\nmsgstr \"-\"\n\n#. Key:\tencourage_line1\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Before Main Menu\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"The path ahead is challenging. Do not despise failure. Every wrong attempt discarded is another step forward.\"\nmsgstr \"Nehéz út áll előtted, ne hagyd, hogy a kudarc kedved szegje. Ne feledd: minden félresikerült próbálkozás egy újabb lépés a győzelem felé.\"\n\n#. Key:\tessence\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"essence represents the Health of the character\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Essence\"\nmsgstr \"Esszencia\"\n\n#. Key:\tfeedback\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Discord external button\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Feedback\"\nmsgstr \"Visszajelzés\"\n\n#. Key:\tgame_defeated\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"end screen\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Game Defeated!\"\nmsgstr \"Játék Legyőzve!\"\n\n#. Key:\tgame_is_wip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Main Menu\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Game currently under development\"\nmsgstr \"A játék jelenleg fejlesztés alatt áll\"\n\n#. Key:\tgame_over_retreat\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"control tip which is only visible in boss areas where the player can either restart the fight or retreat from the place\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Retreat\"\nmsgstr \"Visszavonulás\"\n\n#. Key:\tgame_over_retry\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"control tip which is always visible on game over\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Retry\"\nmsgstr \"Újra\"\n\n#. Key:\tgamepad_special_left_xbox\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"xbox view button\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"View button\"\nmsgstr \"View gomb\"\n\n#. Key:\tgamepad_special_right_xbox\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"xbox Menu button\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Menu button\"\nmsgstr \"Menü gomb\"\n\n#. Key:\tgo_back_to_menu\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Go back to main menu\"\nmsgstr \"Vissza a főmenübe\"\n\n#. Key:\tgold_x\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"{x} is the gold amount\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"+{x} GOLD\"\nmsgstr \"+{x} Arany\"\n\n#. Key:\tgroup_defeated_title\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"title of the group defeated panel\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Group Defeated\"\nmsgstr \"Csoport legyőzve\"\n\n#. Key:\tinput_action_back\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"UI Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"UI Action Back\"\nmsgstr \"UI Vissza\"\n\n#. Key:\tinput_action_first\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"UI Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"UI Action First\"\nmsgstr \"UI Első\"\n\n#. Key:\tinput_action_second\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"UI Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"UI Action Second\"\nmsgstr \"UI Második\"\n\n#. Key:\tinput_action_third\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"UI Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"UI Action Third\"\nmsgstr \"UI Harmadik\"\n\n#. Key:\tinput_actions_conflicts\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input remap.  {Key} = key display name. {NumAction} the number of actions, this will determine what to choose between one and other.\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Selected button = {Key}, will get unbound from the {NumActions}|plural(one=Action,other=Actions) = {ActionNames}\"\nmsgstr \"A választott billentyű: ({Key}). A hozzárendelt {NumActions}|plural(one=akció,other=akciók) ({ActionNames}) törlődni fognak.\"\n\n#. Key:\tinput_alt_interact\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Interact Alternative\"\nmsgstr \"Alternatív Interakció\"\n\n#. Key:\tinput_change_item\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input Action Name\"\n#. Key:\tpanel_command_inv_change_item\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Change Item\"\nmsgstr \"Tárgy csere\"\n\n#. Key:\tinput_change_spell\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Change Spell\"\nmsgstr \"Varázslat csere\"\n\n#. Key:\tinput_change_weapon\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Change Weapon\"\nmsgstr \"Fegyver csere\"\n\n#. Key:\tinput_down\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"UI Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"UI Move Down\"\nmsgstr \"UI Le\"\n\n#. Key:\tinput_float\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Floating\"\nmsgstr \"Lebegés\"\n\n#. Key:\tinput_interact\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Interact\"\nmsgstr \"Interakció\"\n\n#. Key:\tinput_left\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Move Left\"\nmsgstr \"Mozgás: Bal\"\n\n#. Key:\tinput_menu_back\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"UI Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Open Menu/Escape/Back\"\nmsgstr \"Menü/Bezár/Vissza\"\n\n#. Key:\tinput_not_allowed_options_menu_button\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input remap gamepad\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Not allowed to remap to the Menu button\"\nmsgstr \"A Menü gomb nem testreszabható\"\n\n#. Key:\tinput_not_allowed_options_menu_button_switch\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input remap gamepad\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Not allowed to remap to the + Button\"\nmsgstr \"A + gomb nem testreszabható\"\n\n#. Key:\tinput_not_allowed_thumbsticks\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input remap gamepad\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Not allowed to remap to thumbsticks\"\nmsgstr \"A Karok nem testreszabhatóak\"\n\n#. Key:\tinput_not_allowed_thumbsticks_switch\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input remap gamepad switch\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Not allowed to remap to Left Stick or Right Stick\"\nmsgstr \"A Bal Kar és Jobb Kar nem testreszabható\"\n\n#. Key:\tinput_open_inventory\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Open Inventory\"\nmsgstr \"Felszerelés\"\n\n#. Key:\tinput_right\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Move Right\"\nmsgstr \"Mozgás: Jobb\"\n\n#. Key:\tinput_roll\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Roll\"\nmsgstr \"Gurulás\"\n\n#. Key:\tinput_selected_key_not_allowed\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input remap. {Key} = key display name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Selected button = {Key}, is not allowed as an input option\"\nmsgstr \"A választott billentyű ({Key}) nem engedélyezett\"\n\n#. Key:\tinput_spell_down\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"UI Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"UI Spell Down\"\nmsgstr \"UI Varázslat Le\"\n\n#. Key:\tinput_spell_left\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"UI Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"UI Spell Left\"\nmsgstr \"UI Varázslat Bal\"\n\n#. Key:\tinput_spell_right\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"UI Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"UI Spell Right\"\nmsgstr \"UI Varázslat Jobb\"\n\n#. Key:\tinput_spell_select\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"UI Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"UI Spell Select\"\nmsgstr \"UI Varázslat Kiválaszt\"\n\n#. Key:\tinput_spell_select_and_cast\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"UI Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"UI Spell Select & Cast\"\nmsgstr \"UI Varázslat Használ\"\n\n#. Key:\tinput_spell_up\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"UI Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"UI Spell Up\"\nmsgstr \"UI Varázslat Fel\"\n\n#. Key:\tinput_strike_primary\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Primary Strike\"\nmsgstr \"Alap Támadás\"\n\n#. Key:\tinput_strike_special\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Special Strike\"\nmsgstr \"Különleges Támadás\"\n\n#. Key:\tinput_take_weapon\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Take Weapon Away\"\nmsgstr \"Fegyver eltétel\"\n\n#. Key:\tinput_top_left\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"UI Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"UI Top Left\"\nmsgstr \"UI Felső sor Balra\"\n\n#. Key:\tinput_top_right\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"UI Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"UI Top Right\"\nmsgstr \"UI Felső sor Jobbra\"\n\n#. Key:\tinput_unbound\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Unbound input\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Unbound\"\nmsgstr \"Leválaszt\"\n\n#. Key:\tinput_up\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"UI Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"UI Move Up\"\nmsgstr \"UI Fel\"\n\n#. Key:\tinput_use_item\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Use Item\"\nmsgstr \"Tárgy Használat\"\n\n#. Key:\tinventory_item_amount\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"the item amount displayed in inventory/trade panel/etc.\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Amount: {0}\"\nmsgstr \"Mennyiség: {0}\"\n\n#. Key:\tinventory_item_tooltip_cooldown\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Cooldown\"\nmsgstr \"Újratöltődés\"\n\n#. Key:\tinventory_item_tooltip_damage\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"damage text on item descriptions\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Damage\"\nmsgstr \"Sebzés\"\n\n#. Key:\tinventory_item_tooltip_sec\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"duration of something (e.g. cooldown)\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"{0} sec\"\nmsgstr \"{0} mp\"\n\n#. Key:\titem_equipped\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Item Tooltip\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"---Equipped---\"\nmsgstr \"---Saját tárgy---\"\n\n#. Key:\titem_not_For_sale\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Item Tooltip\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Not for sale\"\nmsgstr \"Nem eladó\"\n\n#. Key:\titem_rarity_0\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"item rarity text on the bottom of tooltips\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Better than nothing, right?\"\nmsgstr \"Jobb, mint a semmi, nem?\"\n\n#. Key:\titem_rarity_1\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"item rarity text on the bottom of tooltips\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Better than nothing\"\nmsgstr \"Jobb, mint a semmi\"\n\n#. Key:\titem_rarity_2\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"item rarity text on the bottom of tooltips\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Good stuff\"\nmsgstr \"Jó cucc\"\n\n#. Key:\titem_rarity_3\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"item rarity text on the bottom of tooltips\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Pretty good stuff\"\nmsgstr \"Elég jó cucc\"\n\n#. Key:\titem_rarity_4\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"item rarity text on the bottom of tooltips\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Amazing stuff\"\nmsgstr \"Nagyon jó cucc\"\n\n#. Key:\tkey_selection_current\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Select Input key\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Currently selected button:\"\nmsgstr \"Kiválasztott billentyű:\"\n\n#. Key:\tkey_selection_empty\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Select Input key\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"[Empty Button]\"\nmsgstr \"Üres Billentyű\"\n\n#. Key:\tkey_selection_press\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Select Input key\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"[Press Button]\"\nmsgstr \"Nyomj le egy Billentyűt\"\n\n#. Key:\tkey_selection_press_button\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Select Input key\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Press the button you want to assign to the action:\"\nmsgstr \"Nyomd le a gombot, amit ide akarsz párosítani:\"\n\n#. Key:\tline_three_dots\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"...\"\nmsgstr \"...\"\n\n#. Key:\tloading_screen_press_key\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Press any key to continue...\"\nmsgstr \"Nyomj le egy gombot a folytatáshoz...\"\n\n#. Key:\tloading_screen_press_key_switch\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Press any button to continue...\"\nmsgstr \"Nyomj le egy gombot a folytatáshoz...\"\n\n#. Key:\tloading_screen_text_1\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"This is a loading screen. We wait a few seconds here to look more professional.\"\nmsgstr \"Ez egy loading screen. Várunk egy picit, hogy profibbnak tűnjünk.\"\n\n#. Key:\tmailing_list\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Mailing List\"\nmsgstr \"Levelező lista\"\n\n#. Key:\tnever_completed\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Custom Map\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Never completed\"\nmsgstr \"Sosem teljesített\"\n\n#. Key:\tno\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Confirm popup\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"No\"\nmsgstr \"Nem\"\n\n#. Key:\tpanel_character_sheet\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Character Panel\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Character Sheet\"\nmsgstr \"Karakter lap\"\n\n#. Key:\tpanel_command_inv_compare\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Compare\"\nmsgstr \"Hasonlít\"\n\n#. Key:\tpanel_command_inv_drink\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Drink\"\nmsgstr \"Iszik\"\n\n#. Key:\tpanel_command_inv_equip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"control key tip in inventory\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Equip\"\nmsgstr \"Felvesz\"\n\n#. Key:\tpanel_command_inv_equip_item\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Equip Item\"\nmsgstr \"Tárgy előkészítése\"\n\n#. Key:\tpanel_command_inv_equip_next\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Equip Next\"\nmsgstr \"Következő előkészítése\"\n\n#. Key:\tpanel_command_inv_read\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Read\"\nmsgstr \"Olvas\"\n\n#. Key:\tpanel_command_inv_unequip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Unequip\"\nmsgstr \"Elrak\"\n\n#. Key:\tpanel_command_spell_add\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"add spell to equipped spells\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Add\"\nmsgstr \"Előkészít\"\n\n#. Key:\tpanel_command_spell_remove\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"remove spell from equipped spells\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Remove\"\nmsgstr \"Töröl\"\n\n#. Key:\tpanel_equipped_spells\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Spell Selection panel\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Equipped Spells\"\nmsgstr \"Előkészített Varázslatok\"\n\n#. Key:\tpanel_inventory\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Character Panel\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Inventory\"\nmsgstr \"Felszerelés\"\n\n#. Key:\tpanel_notes\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Character Panel\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Sidenotes\"\nmsgstr \"Jegyzetek\"\n\n#. Key:\tpaneL_resistances\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Character Sheet Panel\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Resistances\"\nmsgstr \"Ellenállás\"\n\n#. Key:\tpanel_rest_no_item\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"You don't have the necessary item to use spells!\"\nmsgstr \"Nem tudsz varázsolni a megfelelő eszköz nélkül!\"\n\n#. Key:\tpanel_rest_option_change_spells\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Change Spells\"\nmsgstr \"Varázslat választás\"\n\n#. Key:\tpanel_rest_option_listen_to_music\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Listen to Music\"\nmsgstr \"Zenehallgatás\"\n\n#. Key:\tpanel_rest_option_sleep\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Sleep\"\nmsgstr \"Alvás\"\n\n#. Key:\tpanel_rest_option_wake_up\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Wake Up\"\nmsgstr \"Tovább\"\n\n#. Key:\tpanel_spell_capacity\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Spell Selection panel\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Capacity: {0}/{1}\"\nmsgstr \"Fenntartás: {0}/{1}\"\n\n#. Key:\tpanel_spell_selection_denied\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Spell Selection panel\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"You can only change the equipped spells near ancient statues.\"\nmsgstr \"Csak az Ősi Szobroknál készíthetsz elő varázslatokat.\"\n\n#. Key:\tpanel_spells\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Character Panel\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Spells\"\nmsgstr \"Varázslatok\"\n\n#. Key:\tpercentage_argument\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Slider\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"{0}%\"\nmsgstr \"{0}%\"\n\n#. Key:\tplay_time\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Stats for saves\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Play Time\"\nmsgstr \"Játékidő\"\n\n#. Key:\tprogress_saved\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Confirm Quit popup\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Progress will be saved\"\nmsgstr \"Állásod mentődni fog\"\n\n#. Key:\tprogress_saved_automatically\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Before Main Menu\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Your progress is saved automatically whenever this icon is displayed\"\nmsgstr \"A játék ment, amikor ez az ikon látható\"\n\n#. Key:\tquit_game\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Menu Quit Game\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Quit Game\"\nmsgstr \"Kilépés\"\n\n#. Key:\tquit_game_question\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Confirm Quit popup\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Quit Game?\"\nmsgstr \"Kilépsz?\"\n\n#. Key:\tquit_to_menu\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Menu Quit To Menu\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Quit to Menu\"\nmsgstr \"Vissza a Menübe\"\n\n#. Key:\tquit_to_menu_question\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Confirm Quit popup\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Quit to Menu?\"\nmsgstr \"Vissza a Menübe?\"\n\n#. Key:\treset_keyboard_arrows\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Confirm keyboard settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Reset to Arrow defaults\"\nmsgstr \"Visszaállít nyilakra\"\n\n#. Key:\treset_keyboard_wasd\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Confirm keyboard settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Reset to WASD defaults\"\nmsgstr \"Visszaállít WASD-ra\"\n\n#. Key:\trestart\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Restart the game\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Restart\"\nmsgstr \"Újraindít\"\n\n#. Key:\trestart_game_question\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Confirm Restart popup\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Restart Game?\"\nmsgstr \"Játék újrakezdése?\"\n\n#. Key:\trestart_game_warning\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Confirm Restart popup\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"All progress will be lost\"\nmsgstr \"Mindent elölről kell kezdened\"\n\n#. Key:\tsave_slots_clear\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"clears the save slot\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Clear\"\nmsgstr \"Töröl\"\n\n#. Key:\tsave_slots_loaded\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"text on currently loaded save slot if there is any\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"- Loaded -\"\nmsgstr \"- Betöltve -\"\n\n#. Key:\tsave_slots_new_game\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"text on empty save slot\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"New Game\"\nmsgstr \"Új Játék\"\n\n#. Key:\tsave_slots_playtime\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"playtime displayed, {0} is the hours, {1} is the minutes\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"{0} H {1} M\"\nmsgstr \"{0} Ó {1} P\"\n\n#. Key:\tsave_slots_playtime_short\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"playtime displayed if it did not reach an hour, {0} is the time in minutes\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"{0} M\"\nmsgstr \"{0} P\"\n\n#. Key:\tsave_slots_remove_confirm_subtext\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"remove save slot confirm dialogue\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Progress will be lost\"\nmsgstr \"Elveszted, amit eddig elértél\"\n\n#. Key:\tsave_slots_select\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"loads the game or creates a new one using the active slot\"\n#. Key:\tselect\n#. InfoMetaData:\t\"Comment\" : \"Button\"\n#. Key:\tspell_cast_switch_select\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Select\"\nmsgstr \"Kiválaszt\"\n\n#. Key:\tsaves\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Menu saves\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Save Slots\"\nmsgstr \"Mentések\"\n\n#. Key:\tseconds\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"seconds\"\nmsgstr \"másodperc\"\n\n#. Key:\tselect_spells\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input right  thumbstick\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Select spells\"\nmsgstr \"Varázslatok kiválasztása\"\n\n#. Key:\tsell\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"sell item\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Sell\"\nmsgstr \"Elad\"\n\n#. Key:\tsend_automatically\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Analytics popup\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Send Automatically\"\nmsgstr \"Küldjön Automatikusan\"\n\n#. Key:\tsend_no\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Analytics popup\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Do not Send\"\nmsgstr \"Ne küldjön\"\n\n#. Key:\tsettings\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Menu settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Settings\"\nmsgstr \"Beállítások\"\n\n#. Key:\tsettings_antialising\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Anti-Aliasing\"\nmsgstr \"Anti-Aliasing\"\n\n#. Key:\tsettings_antialising_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Smooths out the edges by blending the colors of the pixels around the object to create the illusion of smoothness.\"\nmsgstr \"Összemossa a pixelek színeit az élek mentén, ezzel simább élhatást érve el.\"\n\n#. Key:\tsettings_apply\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Apply\"\nmsgstr \"Alkalmaz\"\n\n#. Key:\tsettings_aspect_ratio\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Aspect Ratio\"\nmsgstr \"Képarány\"\n\n#. Key:\tsettings_aspect_ratio_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Defines what aspect ratios are available for your resolution.\"\nmsgstr \"Meghatározza hogy milyen képarányokat használhatsz felbontásként.\"\n\n#. Key:\tsettings_audio\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Settings panels\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Audio\"\nmsgstr \"Hangok\"\n\n#. Key:\tsettings_auto_detect_controller\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Gamepad settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Auto detect Gamepad Layout\"\nmsgstr \"Automatikusan azonosítsa a kontroller típust\"\n\n#. Key:\tsettings_borderless\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Borderless\"\nmsgstr \"Borderless\"\n\n#. Key:\tsettings_brightness\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Settings panels\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Brightness\"\nmsgstr \"Fényerő\"\n\n#. Key:\tsettings_brightness_default_value\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Brightness settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Default Value is 100%\"\nmsgstr \"Alapérték 100%\"\n\n#. Key:\tsettings_brightness_description\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Brightness settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Please adjust the brightness of the game to your display\"\nmsgstr \"Állítsd be a megfelelő fényerősséget\"\n\n#. Key:\tsettings_collect_analytics\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Game Settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Collect Usage Statistics\"\nmsgstr \"Felhasználói adatok gyűjtése\"\n\n#. Key:\tsettings_collect_analytics_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Game Settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"These are not used to identify individuals, but help us to understand players needs to improve our game.\"\nmsgstr \"Ezen adatok alapján nem azonosítunk konkrét játékost, arra szolgálnak, hogy a segítségükkel jobban megértsük a játékosok igényeit, és javítsuk a játékélményt.\"\n\n#. Key:\tsettings_confirm_display_title\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings confirm\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Confirm Display Settings in\"\nmsgstr \"Megjelenítési beállítások elfogadása\"\n\n#. Key:\tsettings_controller\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Settings panels\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Gamepad\"\nmsgstr \"Kontroller\"\n\n#. Key:\tsettings_controller_platform\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Gamepad Layout settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Layout\"\nmsgstr \"Kiosztás\"\n\n#. Key:\tsettings_controller_remap\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Gamepad settings\"\n#. Key:\tsettings_controller_remap_single\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Remap Controls\"\nmsgstr \"Irányítás Testreszabása\"\n\n#. Key:\tsettings_controller_remap_noedit\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Gamepad settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Please use a gamepad in order to remap\"\nmsgstr \"Használd a kontrollert a testreszabáshoz\"\n\n#. Key:\tsettings_controller_switch\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Settings panels\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Controls\"\nmsgstr \"Irányítás\"\n\n#. Key:\tsettings_display\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Settings panels\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Display\"\nmsgstr \"Megjelenés\"\n\n#. Key:\tsettings_display_damage\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Game settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Display Damage\"\nmsgstr \"Sebzés Megjelenítése\"\n\n#. Key:\tsettings_display_damage_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Game settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Show damage as a floating number on the screen\"\nmsgstr \"Sebzés lebegő felirat megjelenítése\"\n\n#. Key:\tsettings_display_enemy_hp\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Game settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Display Enemy Health\"\nmsgstr \"Ellenfél Életerő megjelenítése\"\n\n#. Key:\tsettings_display_enemy_hp_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Game settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Show a small health bar above injured enemies\"\nmsgstr \"Kis Életerő csík a sérült ellenfelek felett\"\n\n#. Key:\tsettings_display_floating_vo\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Game settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Display Floating Voice Lines\"\nmsgstr \"Ellenfél felirat megjelenítése\"\n\n#. Key:\tsettings_display_floating_vo_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Game settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Show voice lines as floating texts\"\nmsgstr \"Ellenfél hang felirat megjelenítése\"\n\n#. Key:\tsettings_display_fps\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Game settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Display FPS\"\nmsgstr \"FPS megjelenítése\"\n\n#. Key:\tsettings_display_fps_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Game settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Show FPS counter\"\nmsgstr \"Mutatja az FPS-t\"\n\n#. Key:\tsettings_display_mode\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Display Mode\"\nmsgstr \"Megjelenítési Mód\"\n\n#. Key:\tsettings_display_mode_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"In Windowed mode you can interact with other windows easier. In Borderless mode you can quickly switch between applications.\"\nmsgstr \"Windowed módban könnyebben kattinthatsz más ablakokra, Borderless módban gyorsan válthatsz programok között.\"\n\n#. Key:\tsettings_display_play_time\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Game settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Display Play Time\"\nmsgstr \"Játékidő mutatása\"\n\n#. Key:\tsettings_display_play_time_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Game settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Show current play time\"\nmsgstr \"Aktuális játékidő megjelenítése\"\n\n#. Key:\tsettings_effects\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Effect Quality\"\nmsgstr \"Effect Minőség\"\n\n#. Key:\tsettings_effects_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Affects the quality of particles in the world, a lower quality might make some projectiles in the world harder to see.\"\nmsgstr \"Befolyásolja a vizuális effektek minőségét. Ha nagyon alacsony, akkor bizonyos effektek kevésbé láthatóak.\"\n\n#. Key:\tsettings_effects_volume\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Audio settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Sound Effects volume\"\nmsgstr \"Hang effekt hangerő\"\n\n#. Key:\tsettings_effects_volume_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Audio settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Adjust the sound effects volume\"\nmsgstr \"Szabályozza a hang effektek erősségét\"\n\n#. Key:\tsettings_force_weak_hardware_opt\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Additional Optimizations\"\nmsgstr \"További Optimalizálás\"\n\n#. Key:\tsettings_force_weak_hardware_opt_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"In certain areas background traps are deactivated or background visuals look cheaper to gain more performance.\"\nmsgstr \"Bizonyos területeken leállítja a csapdákat a háttérben, hogy kevésbé legyen számításigényes a renderelés\"\n\n#. Key:\tsettings_fps_unlimited\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings frame limit\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Unlimited\"\nmsgstr \"Korlátlan\"\n\n#. Key:\tsettings_frame_limit\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Frame Limit (FPS)\"\nmsgstr \"FPS Limit:\"\n\n#. Key:\tsettings_frame_limit_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Limit the maximum frame rate for a consistent experience.\"\nmsgstr \"Nem engedi az fps számot a megadott érték felé menni\"\n\n#. Key:\tsettings_fullscreen\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Fullscreen\"\nmsgstr \"Teljes Képernyő\"\n\n#. Key:\tsettings_game\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Settings panels\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Game\"\nmsgstr \"Játék\"\n\n#. Key:\tsettings_game_speed\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Game settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Game Speed\"\nmsgstr \"Játék Sebesség\"\n\n#. Key:\tsettings_game_speed_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Game settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Changes the speed of the game.\\nHigher speed might make the game have lower FPS.\"\nmsgstr \"Megváltoztatja a játék sebességét.\\nMagasabb érték kevesebb FPS-hez vezethet.\"\n\n#. Key:\tsettings_gamepad_vibration\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Gamepad Vibration intensity settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Vibration\"\nmsgstr \"Rezgés\"\n\n#. Key:\tsettings_keyboard\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Settings panels\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Keyboard\"\nmsgstr \"Billentyűzet\"\n\n#. Key:\tsettings_keyboard_remap_noedit\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Keyboard Settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Please use a keyboard in order to change the keyboard input\"\nmsgstr \"Használd a billentyűzetet a testreszabáshoz!\"\n\n#. Key:\tsettings_language\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Game settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Language\"\nmsgstr \"Nyelv\"\n\n#. Key:\tsettings_language_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Game settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Change the display and locale (numbers, dates) language\"\nmsgstr \"Megváltoztatja a játék szövegeinek nyelvét\"\n\n#. Key:\tsettings_master_volume\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Audio settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Master volume\"\nmsgstr \"Összesített hangerő\"\n\n#. Key:\tsettings_master_volume_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Audio settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Adjust the master volume\"\nmsgstr \"Minden hang hangerejét állítja\"\n\n#. Key:\tsettings_merciful_bounce\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"game settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Merciful Bounce Mode\"\nmsgstr \"Kíméletes Pattanás Mód\"\n\n#. Key:\tsettings_merciful_bounce_always\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"defines when (in which difficulty mode) is the easier bounce mode active\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Always\"\nmsgstr \"Mindig\"\n\n#. Key:\tsettings_merciful_bounce_never\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"defines when (in which difficulty mode) is the easier bounce mode active\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Never\"\nmsgstr \"Soha\"\n\n#. Key:\tsettings_merciful_bounce_on_easy\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"defines when (in which difficulty mode) is the easier bounce mode active\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"On Easy\"\nmsgstr \"Könnyű fokozaton\"\n\n#. Key:\tsettings_merciful_bounce_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"tooltip for Merciful Bounce Mode option\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Allows Higher Bounce even if the Jump button is pressed after the character hits the ground\"\nmsgstr \"Akkor is magasabbra pattansz, ha picit később sikerült megnyomnod az ugrást\"\n\n#. Key:\tsettings_move_left_right\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Move left/right\"\nmsgstr \"Mozgás bal/jobb\"\n\n#. Key:\tsettings_music_volume\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Audio settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Music volume\"\nmsgstr \"Zene Hangerő\"\n\n#. Key:\tsettings_music_volume_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Audio settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Adjust the music volume\"\nmsgstr \"Szabályozza a zene hangerejét\"\n\n#. Key:\tsettings_mute_audio\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Audio settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Mute audio\"\nmsgstr \"Hangok némítása\"\n\n#. Key:\tsettings_mute_audio_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Audio settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Mute all audio\"\nmsgstr \"Minden hangot elnémít\"\n\n#. Key:\tsettings_mute_audio_unfocused\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Audio settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Mute audio when in background\"\nmsgstr \"Némítás háttérben\"\n\n#. Key:\tsettings_mute_audio_unfocused_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Audio settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Mute the audio when the game window is not in focus\"\nmsgstr \"Elnémítja a játékot, ha az nem aktív\"\n\n#. Key:\tsettings_mute_dialogue_voice\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Audio settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Mute voices in dialogues\"\nmsgstr \"Párbeszéd némítása\"\n\n#. Key:\tsettings_mute_dialogue_voice_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Audio settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Mute the gibberish voices inside the dialogues\"\nmsgstr \"Elnémítja a halandzsa hangokat a párbeszédekben\"\n\n#. Key:\tsettings_mute_voice\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Audio settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Mute voices outside of dialogues\"\nmsgstr \"Ellenfél beszéd némítás\"\n\n#. Key:\tsettings_mute_voice_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Audio settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Mute the gibberish voices outside the dialogues\"\nmsgstr \"Elnémítja a halandzsa hangokat a párbeszédeken kívül\"\n\n#. Key:\tsettings_pause_game_idle\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Game settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Pause game when idle\"\nmsgstr \"Szünet, ha távol vagy\"\n\n#. Key:\tsettings_pause_game_idle_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Game settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Pauses the game when the user is idle for a certain amount of minutes\"\nmsgstr \"Szünetelteti a játékot, ha meghatározott ideig nincs játékos input\"\n\n#. Key:\tsettings_pause_game_unfocused\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Game settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Pause game when unfocused\"\nmsgstr \"Szünet, ha a játék inaktív\"\n\n#. Key:\tsettings_pause_game_unfocused_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Game settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Pauses the game when the game loses focus\"\nmsgstr \"Szünetelteti a játékot, ha az csak a háttérben fut\"\n\n#. Key:\tsettings_post_effects\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Post-Effects\"\nmsgstr \"Post-Effects\"\n\n#. Key:\tsettings_post_effects_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Affects the quality of the post process effects after the scene is rendered.\"\nmsgstr \"Befolyásolja a renderelés utáni képjavítást.\"\n\n#. Key:\tsettings_quality_epic\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings quality\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Epic\"\nmsgstr \"Kiválló\"\n\n#. Key:\tsettings_quality_high\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings quality\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"High\"\nmsgstr \"Magas\"\n\n#. Key:\tsettings_quality_low\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings quality\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Low\"\nmsgstr \"Alacsony\"\n\n#. Key:\tsettings_quality_medium\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings quality\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Medium\"\nmsgstr \"Közepes\"\n\n#. Key:\tsettings_ratio_16_10\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings Aspect Ratio\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"16:10\"\nmsgstr \"16:10\"\n\n#. Key:\tsettings_ratio_16_9\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings Aspect Ratio\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"16:9\"\nmsgstr \"16:9\"\n\n#. Key:\tsettings_ratio_4_3\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings Aspect Ratio\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"4:3\"\nmsgstr \"4:3\"\n\n#. Key:\tsettings_reset\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Reset\"\nmsgstr \"Visszaállít\"\n\n#. Key:\tsettings_reset_default\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Settings reset to default\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Reset to Defaults\"\nmsgstr \"Alap beállítások visszaállítása\"\n\n#. Key:\tsettings_reset_input_key\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input reset key to default\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Reset button to default\"\nmsgstr \"Billentyű visszaállítása\"\n\n#. Key:\tsettings_resolution\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Resolution\"\nmsgstr \"Felbontás\"\n\n#. Key:\tsettings_resolution_entry\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings. {0} - x, {1} - Y\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"{0}x{1}\"\nmsgstr \"{0}x{1}\"\n\n#. Key:\tsettings_resolution_scale\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Resolution Scale\"\nmsgstr \"Felbontás arány\"\n\n#. Key:\tsettings_resolution_scale_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"The desired resolution to use when rendering the game. It does not affect the UI.\\nLowering it improves performance on lower end machines.\"\nmsgstr \"A játék felbontása, nem befolyásolja a UI-t.\\nKisebb teljesítményű számítógépen javítja a teljesítményt.\"\n\n#. Key:\tsettings_resolution_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Allows changing the Screen Resolution.\"\nmsgstr \"Lehetővé teszi a Felbontás módosítását.\"\n\n#. Key:\tsettings_select_another\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Settings input\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Select another\"\nmsgstr \"Válassz másikat\"\n\n#. Key:\tsettings_shadows\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Shadow Quality\"\nmsgstr \"Árnyék Minőség\"\n\n#. Key:\tsettings_shadows_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"The higher the quality the finer the shadow.\"\nmsgstr \"Minél magasabb, annál részletesebbek az árnyékok.\"\n\n#. Key:\tsettings_textures\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Texture Quality\"\nmsgstr \"Textúra Minőség\"\n\n#. Key:\tsettings_textures_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Surfaces of the game world will increase in fidelity if the setting is higher.\"\nmsgstr \"A felületek részletesebbek, ha magasabbra van állítva.\"\n\n#. Key:\tsettings_unknown\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Unknown\"\nmsgstr \"Ismeretlen\"\n\n#. Key:\tsettings_volumetric_fog\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Volumetric Fog\"\nmsgstr \"Volumetric Köd\"\n\n#. Key:\tsettings_volumetric_fog_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Realistic looking fog. Has a high performance impact, disable it to improve performance.\"\nmsgstr \"Realisztikus köd. Számításigényes, érdemes kikapcsolni, ha nincs elég FPS.\"\n\n#. Key:\tsettings_vsync\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Vertical Sync\"\nmsgstr \"Vertical Sync\"\n\n#. Key:\tsettings_vsync_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Synchronize the game refresh rate with the monitor refresh rate. Disable it for higher framerate and better input response.\\nWhen enabled it prevents screen tearing.\"\nmsgstr \"Szinkronizálja a játék képfrissítését a monitor képfrissítésével. Érdemes kikapcsolni, ha nem elég nagy az FPS, vagy nem jó a játék reakcióideje.\\nHa be van kapcsolva, megakadályozza a kép elnyúlását.\"\n\n#. Key:\tsettings_windowed\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Windowed\"\nmsgstr \"Windowed\"\n\n#. Key:\tskip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"text near the press and hold to skip confirmation button\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Skip\"\nmsgstr \"Kihagy\"\n\n#. Key:\tspell_cast_switch_controls\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Quick select spells up/down/left/right\"\nmsgstr \"Gyors varázslat választás fel/le/jobbra/balra\"\n\n#. Key:\tspell_cast_switch_select_cast\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Select & Cast\"\nmsgstr \"Választ & Varázsol\"\n\n#. Key:\tspell_cooldown_stops_in_air\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Spell\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Cooldown only starts on ground\"\nmsgstr \"Az Újratöltődés csak a földön kezdődik\"\n\n#. Key:\tspell_only_in_air\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Spell\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Can not be used in air\"\nmsgstr \"Nem használható levegőben\"\n\n#. Key:\tspell_restricted\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Spell\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Can not be used in restricted areas\"\nmsgstr \"Nem mindenhol használható\"\n\n#. Key:\tstart\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"The name of the checkpoint. Custom Map action\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Start\"\nmsgstr \"Indít\"\n\n#. Key:\tstart_game\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Menu Start Game\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Start Game\"\nmsgstr \"Játék Indítása\"\n\n#. Key:\tstats_usage_description\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Analytics popup\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Not Yet would like to collect usage statistics from your game automatically.\\nThese are not used to identify individuals, but help us to understand players needs to improve our game.\\n\\nSelect \\\"Send Automatically\\\" to allow collection of usage statistics,\\nor \\\"Do Not Send\\\" to prevent the game from sending information to Not Yet.\\n\\nYou can change this setting at any time via the Settings Game tab.\"\nmsgstr \"A Not Yet szeretne automatikusan adatokat gyűjteni a játékmenetedből.\\nEzen adatok alapján nem azonosítunk konkrét játékosokat, viszont a statisztikák alapján próbáljuk fejleszteni a játékot.\\n\\nVálaszd a \\\"Küldjön Automatikusan\\\" opciót, ha hozzájárulsz, vagy a \\\"Ne Küldjön\\\" opciót, ha nem szeretnél adatot küldeni.\\n\\nEzt a beállítást bármikor megváltoztathatod.\"\n\n#. Key:\tstats_usage_title\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Analytics popup\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Usage Statistics\"\nmsgstr \"Felhasználói statisztika\"\n\n#. Key:\tstatus\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Status of a save/custom map\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Status\"\nmsgstr \"Státusz\"\n\n#. Key:\tsteam_main_game\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Wishlist\"\nmsgstr \"Kívánságlistára\"\n\n#. Key:\tsteam_main_game_buy\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Buy Full Game\"\nmsgstr \"Teljes játék vásárlása\"\n\n#. Key:\tSwitch_FaceButton_Bottom\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"B Button\"\nmsgstr \"B Gomb\"\n\n#. Key:\tSwitch_FaceButton_Left\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Y Button\"\nmsgstr \"Y Gomb\"\n\n#. Key:\tSwitch_FaceButton_Right\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"A Button\"\nmsgstr \"AB Gomb\"\n\n#. Key:\tSwitch_FaceButton_Top\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"X Button\"\nmsgstr \"X Gomb\"\n\n#. Key:\tSwitch_Gamepad_LeftStick_Down\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \" Switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Left Stick Down\"\nmsgstr \"Bal kar - le\"\n\n#. Key:\tSwitch_Gamepad_LeftStick_Left\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \" Switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Left Stick Left\"\nmsgstr \"Bal kar - bal\"\n\n#. Key:\tSwitch_Gamepad_LeftStick_Right\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \" Switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Left Stick Right\"\nmsgstr \"Bal kar - jobb\"\n\n#. Key:\tSwitch_Gamepad_LeftStick_Up\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \" Switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Left Stick Up\"\nmsgstr \"Bal kar - fel\"\n\n#. Key:\tSwitch_Gamepad_RightStick_Down\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \" Switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Right Stick Down\"\nmsgstr \"Jobb kar - le\"\n\n#. Key:\tSwitch_Gamepad_RightStick_Left\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \" Switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Right Stick Left\"\nmsgstr \"Jobb kar - bal\"\n\n#. Key:\tSwitch_Gamepad_RightStick_Right\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \" Switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Right Stick Right\"\nmsgstr \"Jobb kar - jobb\"\n\n#. Key:\tSwitch_Gamepad_RightStick_Up\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \" Switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Right Stick Up\"\nmsgstr \"Jobb kar - fel\"\n\n#. Key:\tSwitch_LeftThumbstick\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \" Switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Left Stick\"\nmsgstr \"Bal kar\"\n\n#. Key:\tSwitch_RightThumbstick\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \" Switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Right Stick\"\nmsgstr \"Jobb kar\"\n\n#. Key:\tSwitch_Shoulder_Left\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"L Button\"\nmsgstr \"L Gomb\"\n\n#. Key:\tSwitch_Shoulder_Right\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"R Button\"\nmsgstr \"R Gomb\"\n\n#. Key:\tSwitch_special_dpad_down\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \" Switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Down Button\"\nmsgstr \"Le Gomb\"\n\n#. Key:\tSwitch_special_dpad_left\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \" Switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Left Button\"\nmsgstr \"Bal Gomb\"\n\n#. Key:\tSwitch_special_dpad_right\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \" Switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Right Button\"\nmsgstr \"Jobb Gomb\"\n\n#. Key:\tSwitch_special_dpad_up\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \" Switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Up Button\"\nmsgstr \"Fel Gomb\"\n\n#. Key:\tSwitch_special_left\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"- Button\"\nmsgstr \"- Gomb\"\n\n#. Key:\tSwitch_special_right\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"+ Button\"\nmsgstr \"+ Gomb\"\n\n#. Key:\tSwitch_Trigger_Left\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"ZL Button\"\nmsgstr \"ZL Gomb\"\n\n#. Key:\tSwitch_Trigger_Right\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"ZR Button\"\nmsgstr \"ZR Gomb\"\n\n#. Key:\tteleport_to_cp\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Menu Teleport To Checkpoint\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Teleport To Checkpoint\"\nmsgstr \"Mentéshelyre teleportálás\"\n\n#. Key:\tteleport_to_sk\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Menu Teleport to Soulkeeper\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Teleport To SoulKeeper\"\nmsgstr \"Lélekőrhöz teleportálás\"\n\n#. Key:\tthank_you_prologue\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"THANK YOU FOR PLAYING WARRIORB DEMO PROLOGUE, WE HOPE YOU HAD A GREAT TIME!\"\nmsgstr \"Köszönjük a játékot, reméljük jól érezted magad!\"\n\n#. Key:\ttotal_deaths\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Stats for saves\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Total Deaths\"\nmsgstr \"Halálok száma\"\n\n#. Key:\ttrade_amount_x_x\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"trade confirmation UI. {0} is the current amount and {1} is the current amount times price per item\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"{0} for {1} gold\"\nmsgstr \"{0} db {1} aranyért\"\n\n#. Key:\ttrade_buy\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"trade confirmation UI\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Are you sure you want to buy {ItemName} for {Gold} gold?\"\nmsgstr \"Biztosan meg akarod venni ezt a tárgyat: {ItemName} {Gold} aranyért?\"\n\n#. Key:\ttrade_buy_back\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"trade confirmation UI\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Are you sure you want to buy back {ItemName} for {Gold} gold?\"\nmsgstr \"Biztosan vissza akarod venni ezt a tárgyat: {ItemName} {Gold} aranyért?\"\n\n#. Key:\ttrade_no_intrested\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"trade confirmation UI\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"The trader is not interested in buying that item from you!\"\nmsgstr \"A kereskedőt nem érdekli ez a tárgy.\"\n\n#. Key:\ttrade_nope\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"trade confirmation UI\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Nope!\"\nmsgstr \"Nem!\"\n\n#. Key:\ttrade_okay\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"trade confirmation UI\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Okay...\"\nmsgstr \"Rendben...\"\n\n#. Key:\ttrade_sell\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"trade confirmation UI\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Are you sure you want to sell {ItemName} for {Gold} gold?\"\nmsgstr \"Biztosan el akarod adni ezt a tárgyat: {ItemName} {Gold} aranyért?\"\n\n#. Key:\ttwitter\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Twitter\"\nmsgstr \"Twitter\"\n\n#. Key:\tunknown\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Unknown input binding\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"UNKNOWN\"\nmsgstr \"ISMERETLEN\"\n\n#. Key:\twarriorb\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"WarriOrb\"\nmsgstr \"WarriOrb\"\n\n#. Key:\txp\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Experience Points\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"XP\"\nmsgstr \"TP\"\n\n#. Key:\tyes\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Confirm popup\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Yes\"\nmsgstr \"Igen\"\n\n"
  },
  {
    "path": "Content/Localization/WarriorbDemo/ro/WarriorbDemo.po",
    "content": "﻿# WarriorbDemo Romanian translation.\n# Copyright 1998-2019 Epic Games, Inc. All Rights Reserved.\n# \nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: WarriorbDemo\\n\"\n\"POT-Creation-Date: 2020-10-07 08:08\\n\"\n\"PO-Revision-Date: 2020-10-07 08:08\\n\"\n\"Language-Team: \\n\"\n\"Language: ro\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Plural-Forms: nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?2:1));\\n\"\n\n#. Key:\tact1_loading\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"You are a Mighty Spirit from the Unknown Realm. You were torn away from your home by a pathetic mortal Wizard. After a magical accident your essence is bound to an unlikely body. Find a way out of your ball-body prison!\"\nmsgstr \"Ești un Duh Puternic din Tărâmul Necunoscut. Ai fost sfâșiat de acasă de un vrăjitor muritor patetic. După un accident magic esența ta este legată de un corp improbabil. Găsește o cale de a ieși din închisoarea corpul de bilă!\"\n\n#. Key:\tact2_loading\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Reaching Crossroad Cave you are a step closer to the Three Artifacts - and to freedom.\"\nmsgstr \"Ajungând în Peștera de la Intersecție ești un pas mai aproape de cele Trei Artefacte - și de libertate.\"\n\n#. Key:\tact3_loading\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Finding the Three Artifacts required all your skills and strength. You hope that delivering them to the Wizard will be less difficult.\"\nmsgstr \"Găsirea celor trei artefacte a necesitat toate abilitățile și forțele tale. Speri că livrarea lor către Vrăjitor va fi mai puțin dificilă.\"\n\n#. Key:\tact_1\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"text displayed on black screen the first time a chapter is started\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Act I\"\nmsgstr \"Actul I\"\n\n#. Key:\tact_2\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"text displayed on black screen the first time a chapter is started\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Act II\"\nmsgstr \"Actul II\"\n\n#. Key:\tact_3\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"text displayed on black screen the first time a chapter is started\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Act III\"\nmsgstr \"Actul III\"\n\n#. Key:\tancient_arcade\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an area\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Ancient Arcade\"\nmsgstr \"Arcada Antică\"\n\n#. Key:\tbubble_border\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an area\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Bubble Border\"\nmsgstr \"Granița de Baloane\"\n\n#. Key:\tcerulean_city\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an area\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Cerulean City\"\nmsgstr \"Orașul Cerulean\"\n\n#. Key:\tchasm_chamber\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an area\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Chasm Chamber\"\nmsgstr \"Camera Prăpastie\"\n\n#. Key:\tcrossroad_cave\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an area\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Crossroad Cave\"\nmsgstr \"Peștera de la Intersecție\"\n\n#. Key:\tdarkest_dungeon\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an area\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Darkest Dungeon\"\nmsgstr \"Cea mai Întunecată Temniță\"\n\n#. Key:\tdwarven_dungeons\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an area\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Dwarven Dungeons\"\nmsgstr \"Temnițele Piticilor\"\n\n#. Key:\tending_loading\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Finally! You did your part of the deal, now it's the Wizard's turn to get you back home.\"\nmsgstr \"În sfârșit! Ți-ai făcut partea din înțelegere, acum este rândul Vrăjitorului să te readucă acasă.\"\n\n#. Key:\tepilogue\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"text displayed on black screen the first time a chapter is started\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Epilogue\"\nmsgstr \"Epilog\"\n\n#. Key:\tgrey_gate\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an area\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Grey Gate\"\nmsgstr \"Poarta Gri\"\n\n#. Key:\thallowed_heart\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an area, Hallowed as in made holy; consecrated.\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Hallowed Heart\"\nmsgstr \"Inimia Sfințită\"\n\n#. Key:\tintro_subtitle_0\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" intro subtitle line 1\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"I wish I could just... turn back time to undo what I have done.\"\nmsgstr \"Mi-aș dori să pot ... întoarce timpul pentru a anula ceea ce am făcut.\"\n\n#. Key:\tintro_subtitle_1\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" intro subtitle line 01\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"However the past is behind us\"\nmsgstr \"Dar trecutul este în urma noastră\"\n\n#. Key:\tintro_subtitle_2\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" intro subtitle line 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"and all I can change now\"\nmsgstr \"și tot ce pot schimba\"\n\n#. Key:\tintro_subtitle_3\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" intro subtitle line 3\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"is the future.\"\nmsgstr \"este viitorul.\"\n\n#. Key:\tlast_land\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an area\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Last Land\"\nmsgstr \"Ultimul Pământ\"\n\n#. Key:\tlava_lair\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an area\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Lava Lair\"\nmsgstr \"Vizuina de Lavă\"\n\n#. Key:\tloading_tip_act1_0\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 1\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"In Ball form you go faster.\"\nmsgstr \"În formă de Minge mergi mai repede.\"\n\n#. Key:\tloading_tip_act1_1\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 1\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"In Ball form you bounce back when you hit a surface.\"\nmsgstr \"În formă de Minge sari înapoi când lovești o suprafață.\"\n\n#. Key:\tloading_tip_act1_2\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 1\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Each weapon has its own unique special strike.\"\nmsgstr \"Fiecare armă are propria sa lovitură specială unică.\"\n\n#. Key:\tloading_tip_act1_3\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 1\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Most of the people died after Ruin happened, but there are still some survivors.\"\nmsgstr \"Majoritatea oamenilor au murit după ce s-a întâmplat Ruina, dar mai există unii supraviețuitori.\"\n\n#. Key:\tloading_tip_act1_4\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 1\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Some items can’t be used but merchants still like to buy them.\"\nmsgstr \"Unele articole nu pot fi utilizate, dar comercianților le place să le cumpere.\"\n\n#. Key:\tloading_tip_act1_5\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 1\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"There are many keys, and when I say many, I mean it.\"\nmsgstr \"Sunt multe chei, iar când spun multe, mă refer la asta.\"\n\n#. Key:\tloading_tip_act1_6\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 1\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"When you find an item it would make sense to check what it is, wouldn’t it?\"\nmsgstr \"Când găsești un articol, ar fi logic să verifici ce este, nu?\"\n\n#. Key:\tloading_tip_act1_7\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 1\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Spells can make combat easier.\"\nmsgstr \"Vrăjile pot ușura lupta.\"\n\n#. Key:\tloading_tip_act1_8\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 1\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Dying often is absolutely normal. If you don’t die a lot, you are doing something wrong.\"\nmsgstr \"A muri deseori este absolut normal. Dacă nu mori mult, faci ceva greșit.\"\n\n#. Key:\tloading_tip_act1_9\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 1\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"You can always check the Sidenotes in your Inventory to see if you have any side quests.\"\nmsgstr \"Poți verifica întotdeauna Notițele din inventar, pentru a vedea dacă ai misiuni secundare.\"\n\n#. Key:\tloading_tip_act2_0\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Using the Railway can shorten your journey.\"\nmsgstr \"Folosirea căii ferate îți va scurta călătoria.\"\n\n#. Key:\tloading_tip_act2_1\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"We’ll try to make our next game without any loading screens, we promise...\"\nmsgstr \"Vom încerca să facem următorul nostru joc fără ecrane de încărcare, vă promitem...\"\n\n#. Key:\tloading_tip_act2_2\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Choosing the right weapon against a Boss will make your life easier.\"\nmsgstr \"Alegerea armei potrivite împotriva unui Șef îți va face viața mai ușoară.\"\n\n#. Key:\tloading_tip_act2_3\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Don’t forget to use the Soulkeeper!\"\nmsgstr \"Nu uitați să folosești Deținătorul Sufletului!\"\n\n#. Key:\tloading_tip_act2_4\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Finding the Artefacts might be hard, but this is your only chance to get out.\"\nmsgstr \"Găsirea artefactelor ar putea fi dificilă, dar aceasta este singura ta șansă de a ieși.\"\n\n#. Key:\tloading_tip_act2_5\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Talk to any Survivor if you can. They might be able to help you.\"\nmsgstr \"Discută cu orice Supraviețuitor dacă poți. S-ar putea să te ajute.\"\n\n#. Key:\tloading_tip_act2_6\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"If you find an area too difficult you can always go to another area first.\"\nmsgstr \"Dacă găsești o zonă prea dificilă, poți merge întotdeauna în altă zonă mai întâi.\"\n\n#. Key:\tloading_tip_act2_7\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Don’t forget to spend your gold! (Ad sponsored by Gnory)\"\nmsgstr \"Nu uita să îți cheltuiești aurul! (Anunț sponsorizat de Gnory)\"\n\n#. Key:\tloading_tip_act2_8\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Equipping the right items will make the combat easier.\"\nmsgstr \"Echiparea articolelor potrivite îți face lupta mai ușoară.\"\n\n#. Key:\tloading_tip_act2_9\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"If you manage to defeat every member of a group you won’t have to fight them ever again.\"\nmsgstr \"Dacă reușești să învingi pe fiecare membru al unui grup, nu va trebui să te mai lupți din nou cu ei.\"\n\n#. Key:\tloading_tip_act3_0\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 3\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Using the Railway can also make your Journey longer.\"\nmsgstr \"Folosirea căii ferate vă poate face, de asemenea, călătoria mai lungă.\"\n\n#. Key:\tloading_tip_act3_1\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 3\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"If you got this far, you surely know everything now.\"\nmsgstr \"Dacă ai ajuns până acum, cu siguranță știi totul acum.\"\n\n#. Key:\tloading_tip_act3_2\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 3\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Loading screen tips are very useful - except in a few cases.\"\nmsgstr \"Sfaturile ecranului de încărcare sunt foarte utile - cu excepția câtorva cazuri.\"\n\n#. Key:\tloading_tip_act3_3\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 3\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Now is your time to think about the fate of the Ruined Realm.\"\nmsgstr \"Acum este timpul tău să te gândești la soarta Tărâmului Ruinat.\"\n\n#. Key:\tloading_tip_act3_4\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 3\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"The End is near... I mean no loading screen can take forever, right?\"\nmsgstr \"Sfârșitul este aproape ... Adică niciun ecran de încărcare nu poate dura pentru totdeauna, nu?\"\n\n#. Key:\tloading_tip_act3_5\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 3\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Now your only task is to bring the Artefacts to Wizard.\"\nmsgstr \"Acum, singura ta sarcină este să aduci Artefactele la Vrăjitor.\"\n\n#. Key:\tloading_tip_act3_6\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 3\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"If you find a combat too hard try to use different shards, spells, and weapons.\"\nmsgstr \"Dacă găsești o luptă prea grea, încearcă să folosești diferite cioburi, vrăji și arme.\"\n\n#. Key:\tloading_tip_act3_7\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 3\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Don’t give up! Victory is close.\"\nmsgstr \"Nu renunța! Victoria este aproape.\"\n\n#. Key:\tloading_tip_end_0\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for epilogue\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"The Human Realm is a weird place...\"\nmsgstr \"Tărâmul Uman este un loc ciudat...\"\n\n#. Key:\tloading_tip_end_1\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for epilogue\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"You really did your part of the deal, now it’s time to go home!\"\nmsgstr \"Ți-ai făcut cu adevărat partea din afacere, acum este timpul să te întorci acasă!\"\n\n#. Key:\tloading_tip_end_2\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for epilogue\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Should you care about the fate of the Realms?\"\nmsgstr \"Ar trebui să îți pese de soarta Tărâmurilor?\"\n\n#. Key:\tloading_tip_end_3\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for epilogue\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Looks like it’s always you who has to take care of the mess others left behind.\"\nmsgstr \"Se pare că întotdeauna tu ești cel care trebuie să aibă grijă de mizeria lăsată de alții.\"\n\n#. Key:\tloading_tip_end_4\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for epilogue\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Time to finish what you started. One way or another.\"\nmsgstr \"E timpul să termini ce ai început. Într-un fel sau altul.\"\n\n#. Key:\tlost_land\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an area\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Lost Land\"\nmsgstr \"Pământul Pierdut\"\n\n#. Key:\tobedient_outpost\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an area\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Obedient Outpost\"\nmsgstr \"Avanpostul Ascultător\"\n\n#. Key:\tperfect_palace\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an area\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Perfect Palace\"\nmsgstr \"Palatul Perfect\"\n\n#. Key:\tportal_place\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an area\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Portal Place\"\nmsgstr \"Locul Portalului\"\n\n#. Key:\tprogress_act1_arcade1\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Remnants of a Realm\"\nmsgstr \"Resturi ale unui Tărâm\"\n\n#. Key:\tprogress_act1_arcade2\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Discovering Ancient Technology\"\nmsgstr \"Descoperind Tehnologii Antice\"\n\n#. Key:\tprogress_act1_before_raven\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Searching for a way out\"\nmsgstr \"Căutarea unei ieșiri\"\n\n#. Key:\tprogress_act1_boss_fight\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Facing the Keeper\"\nmsgstr \"Înfruntarea cu Paznicul\"\n\n#. Key:\tprogress_act1_gem\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Looking for a Gem\"\nmsgstr \"În căutarea unei Bijuterii\"\n\n#. Key:\tprogress_act1_infuse\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Infusing the Gem\"\nmsgstr \"Infuzarea Bijuterie\"\n\n#. Key:\tprogress_act1_portals\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Looking for a Portal\"\nmsgstr \"În căutarea unui Portal\"\n\n#. Key:\tprogress_act1_start\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Lost in Ruin\"\nmsgstr \"Pierdut în Ruină\"\n\n#. Key:\tprogress_act1_test_stone\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Bouncing Stones\"\nmsgstr \"Pietrele Săritoare\"\n\n#. Key:\tprogress_act1_tut1\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Am I Worthy?\"\nmsgstr \"Sunt demn?\"\n\n#. Key:\tprogress_act1_tut2\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Sewer again\"\nmsgstr \"Canalizare din nou\"\n\n#. Key:\tprogress_act1_tut3\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Third time Worthy\"\nmsgstr \"A Treia oară Demn\"\n\n#. Key:\tprogress_act2_crossroad\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"At a crossroad\"\nmsgstr \"La o intersecție\"\n\n#. Key:\tprogress_act2_dwarf_0\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Into the Blue\"\nmsgstr \"În Albastru\"\n\n#. Key:\tprogress_act2_dwarf_1\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Elevator Gem and Key\"\nmsgstr \"Bijuteria și Cheia Liftului\"\n\n#. Key:\tprogress_act2_dwarf_2\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Opening the Gate\"\nmsgstr \"Deschiderea Porții\"\n\n#. Key:\tprogress_act2_dwarf_boss\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Dwarven Statue\"\nmsgstr \"Statuia Piticului\"\n\n#. Key:\tprogress_act2_end\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"To the Fourth Station\"\nmsgstr \"Spre a Patra Stație\"\n\n#. Key:\tprogress_act2_lava_0\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Into the Red\"\nmsgstr \"În Roșu\"\n\n#. Key:\tprogress_act2_lava_1\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Uniting Key Pieces\"\nmsgstr \"Unirea pieselor Cheie\"\n\n#. Key:\tprogress_act2_lava_2\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Climbing the Tower\"\nmsgstr \"Urcând Turnul\"\n\n#. Key:\tprogress_act2_lava_boss\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Armour Wrath\"\nmsgstr \"Armura Mâniei\"\n\n#. Key:\tprogress_act2_ww_0\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Into the Green\"\nmsgstr \"În verde\"\n\n#. Key:\tprogress_act2_ww_1\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Through the Lake\"\nmsgstr \"Prin lac\"\n\n#. Key:\tprogress_act2_ww_2\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Being Followed\"\nmsgstr \"A fi Urmarit\"\n\n#. Key:\tprogress_act2_ww_boss\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Fallen Druid\"\nmsgstr \"Druidul Decăzut\"\n\n#. Key:\tprogress_act3_floating\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in act 3\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Floating\"\nmsgstr \"Plutitor\"\n\n#. Key:\tprogress_act3_monk\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in act 3\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Monk's Home\"\nmsgstr \"Casa Călugărului\"\n\n#. Key:\tprogress_act3_pipes\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in act 3\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Moving Pipes\"\nmsgstr \"Țevi de mișcare\"\n\n#. Key:\tprogress_act3_start\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in act 3\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Lost in the Caves\"\nmsgstr \"Pierdut în Peșteri\"\n\n#. Key:\tprogress_act3_way_out\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in act 3\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Way out of the Realm\"\nmsgstr \"O cale din Afara Tărâmului\"\n\n#. Key:\tprogress_epilogue_boss\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in epilogue\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"The Real Demon\"\nmsgstr \"Demonul Real\"\n\n#. Key:\tprogress_epilogue_castle\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in epilogue\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Wizard's Castle\"\nmsgstr \"Castelul Vrăjitorului\"\n\n#. Key:\tprogress_epilogue_past_and_future\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in epilogue\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Past and Future\"\nmsgstr \"Trecut și Viitor\"\n\n#. Key:\tprogress_epilogue_save_creatures\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in epilogue\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Chance for everyone\"\nmsgstr \"Șanse pentru toată lumea\"\n\n#. Key:\tprogress_epilogue_separate_worlds\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in epilogue\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Separated Worlds\"\nmsgstr \"Lumile Separate\"\n\n#. Key:\tprologue\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"text displayed on black screen the first time a chapter is started\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Prologue\"\nmsgstr \"Prolog\"\n\n#. Key:\tremnant_road\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an area\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Remnant Road\"\nmsgstr \"Drumul Rămășiței\"\n\n#. Key:\truined_realm\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Ruined Realm\"\nmsgstr \"Tărâmul Ruinat\"\n\n#. Key:\tsnake_slide\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an area\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Snake Slide\"\nmsgstr \"Leagănul Șarpelui\"\n\n#. Key:\tsunken_sewer\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an area\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Sunken Sewer\"\nmsgstr \"Canalizarea Scufundată\"\n\n#. Key:\twhite_wall\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"White Wall\"\nmsgstr \"Zidul Alb\"\n\n#. Key:\twracked_waters\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an area\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Wracked Waters\"\nmsgstr \"Apele Împrăștiate\"\n\n#. Key:\tcredits_fmod\n#. SourceLocation:\tLocalization/StringTables/Credits.csv\n#: Localization/StringTables/Credits.csv\nmsgctxt \"Credits\"\nmsgid \"Made with FMOD Studio by Firelight Technologies Pty Ltd.\"\nmsgstr \"Creat cu FMOD Studio de Firelight Technologies Pty Ltd.\"\n\n#. Key:\tMonthApril\n#. SourceLocation:\tSource/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:17\n#: Source/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:17\nmsgctxt \"DateTimeHelper\"\nmsgid \"April\"\nmsgstr \"Aprilie\"\n\n#. Key:\tMonthAugust\n#. SourceLocation:\tSource/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:21\n#: Source/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:21\nmsgctxt \"DateTimeHelper\"\nmsgid \"August\"\nmsgstr \"August\"\n\n#. Key:\tMonthDecember\n#. SourceLocation:\tSource/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:26\n#: Source/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:26\nmsgctxt \"DateTimeHelper\"\nmsgid \"December\"\nmsgstr \"Decembrie\"\n\n#. Key:\tMonthFebruary\n#. SourceLocation:\tSource/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:15\n#: Source/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:15\nmsgctxt \"DateTimeHelper\"\nmsgid \"February\"\nmsgstr \"Februarie\"\n\n#. Key:\tMonthJanuary\n#. SourceLocation:\tSource/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:14\n#: Source/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:14\nmsgctxt \"DateTimeHelper\"\nmsgid \"January\"\nmsgstr \"Ianuarie\"\n\n#. Key:\tMonthJuly\n#. SourceLocation:\tSource/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:20\n#: Source/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:20\nmsgctxt \"DateTimeHelper\"\nmsgid \"July\"\nmsgstr \"Iulie\"\n\n#. Key:\tMonthJune\n#. SourceLocation:\tSource/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:19\n#: Source/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:19\nmsgctxt \"DateTimeHelper\"\nmsgid \"June\"\nmsgstr \"Iunie\"\n\n#. Key:\tMonthMarch\n#. SourceLocation:\tSource/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:16\n#: Source/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:16\nmsgctxt \"DateTimeHelper\"\nmsgid \"March\"\nmsgstr \"Martie\"\n\n#. Key:\tMonthMay\n#. SourceLocation:\tSource/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:18\n#: Source/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:18\nmsgctxt \"DateTimeHelper\"\nmsgid \"May\"\nmsgstr \"Mai\"\n\n#. Key:\tMonthNovember\n#. SourceLocation:\tSource/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:24\n#: Source/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:24\nmsgctxt \"DateTimeHelper\"\nmsgid \"November\"\nmsgstr \"Noiembrie\"\n\n#. Key:\tMonthOctober\n#. SourceLocation:\tSource/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:23\n#: Source/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:23\nmsgctxt \"DateTimeHelper\"\nmsgid \"October\"\nmsgstr \"Cctombrie\"\n\n#. Key:\tMonthSeptember\n#. SourceLocation:\tSource/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:22\n#: Source/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:22\nmsgctxt \"DateTimeHelper\"\nmsgid \"September\"\nmsgstr \"Septembrie\"\n\n#. Key:\tSecondsToTime\n#. SourceLocation:\tSource/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:48\n#: Source/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:48\nmsgctxt \"DateTimeHelper\"\nmsgid \"{Minutes}:{Seconds}\"\nmsgstr \"{Minutes}:{Seconds}\"\n\n#. Key:\tSecondsToTimeMinusSeconds\n#. SourceLocation:\tSource/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:51\n#: Source/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:51\nmsgctxt \"DateTimeHelper\"\nmsgid \"{Hours}:{Minutes}:{Seconds}\"\nmsgstr \"{Hours}:{Minutes}:{Seconds}\"\n\n#. Key:\tchar_name_ball_e\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"possible display name for character\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"BALL-E\"\nmsgstr \"BALL-E\"\n\n#. Key:\tchar_name_destroyer\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"possible display name for character\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Destroyer\"\nmsgstr \"Distrugătorul\"\n\n#. Key:\tchar_name_dont_buy\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"possible display name for character\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Don't buy\"\nmsgstr \"Nu Cumpăra\"\n\n#. Key:\tchar_name_dr_ball\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"possible display name for character\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Dr. Ball\"\nmsgstr \"Dr. Minge\"\n\n#. Key:\tchar_name_epic_sphero\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"possible display name for character\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Epic Sphero\"\nmsgstr \"Sfera Epică\"\n\n#. Key:\tchar_name_failed_one\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"possible display name for character\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Failed One\"\nmsgstr \"Cel Eșuat\"\n\n#. Key:\tchar_name_saviour\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"possible display name for character\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Saviour\"\nmsgstr \"Salvator\"\n\n#. Key:\tchar_name_sorbcerer\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"possible display name for character\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Sorbcerer\"\nmsgstr \"Sorbcerer\"\n\n#. Key:\tchar_name_spirit_of_the_unknown\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"possible display name for character\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Spirit Of the Unknown\"\nmsgstr \"Spiritul Necunoscutului\"\n\n#. Key:\tchar_name_ultimate_frisbee\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"possible display name for character\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Ultimate Frisbee\"\nmsgstr \"Frisbee Final\"\n\n#. Key:\tchar_name_wanderer\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"possible display name for character\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Wanderer\"\nmsgstr \"Hoinar\"\n\n#. Key:\tchar_name_warlorb\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"possible display name for character\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Warlorb\"\nmsgstr \"Warlorb\"\n\n#. Key:\tchar_name_warriorb\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"possible display name for character\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"WarriOrb\"\nmsgstr \"Warriorb\"\n\n#. Key:\tfinish\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"default option\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Finish\"\nmsgstr \"Finalizare\"\n\n#. Key:\tgold_gained\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"{0} Gold Gained\"\nmsgstr \"{0} Aur Obținut\"\n\n#. Key:\tgold_lost\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"{0} Gold Lost\"\nmsgstr \"{0} Aur Pierdut\"\n\n#. Key:\titem_gained\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"{ItemName} gained!\"\nmsgstr \"{ItemName} câștigat!\"\n\n#. Key:\titem_gained_n\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"{Amount} {ItemName} gained!\"\nmsgstr \"{Amount} {ItemName} câștigat!\"\n\n#. Key:\titem_lost\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"{ItemName} lost!\"\nmsgstr \"{ItemName} pierdut!\"\n\n#. Key:\titem_lost_n\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"{Amount} {ItemName} lost!\"\nmsgstr \"{Amount} {ItemName} pierdut!\"\n\n#. Key:\tnext\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"default option\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Next\"\nmsgstr \"Următorul\"\n\n#. Key:\tnpc_altar\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"npc if BPLanguage Improver\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Altar\"\nmsgstr \"Altar\"\n\n#. Key:\tnpc_ancient_gate\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an npc\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Ancient Gate\"\nmsgstr \"Poarta Antică\"\n\n#. Key:\tnpc_demon_lillian\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"name of the final boss\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Demon Lillian\"\nmsgstr \"Demonul Lillian\"\n\n#. Key:\tnpc_dwarven_workshop\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"name of the place the character can have a dialogue to craft a quest item\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Dwarven Workshop\"\nmsgstr \"Ateleriul Piticilor\"\n\n#. Key:\tnpc_fishy\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"display name of an npc\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Fishy\"\nmsgstr \"Pește Dubios\"\n\n#. Key:\tnpc_fountain\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"display name of a fountain the character can talk with\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Fountain\"\nmsgstr \"Fântână\"\n\n#. Key:\tnpc_gatekeeper\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an npc\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Gatekeeper\"\nmsgstr \"Portar\"\n\n#. Key:\tnpc_ghost_dwarf\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an npc (actually a ghost of a dwarf)\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Ghost Dwarf\"\nmsgstr \"Fantoma Piticului\"\n\n#. Key:\tnpc_gnory\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an npc\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Gnory\"\nmsgstr \"Gnory\"\n\n#. Key:\tnpc_golem_maker\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an npc\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Golem Maker\"\nmsgstr \"Creatorul de Golemi\"\n\n#. Key:\tnpc_lory\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an npc\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Lory\"\nmsgstr \"Lory\"\n\n#. Key:\tnpc_lory_unkown\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"display name of Lory before she introduces herself\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Gnome Lady\"\nmsgstr \"Doamna Pitic\"\n\n#. Key:\tnpc_magic_mirror\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an npc\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Magic Mirror\"\nmsgstr \"Oglinda Magică\"\n\n#. Key:\tnpc_merchant\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an npc\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Merch Ant\"\nmsgstr \"Furnica Comerciant\"\n\n#. Key:\tnpc_merchant_voice\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"name of a small ant until he says his name (only a voice cause player can not see it)\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Voice\"\nmsgstr \"Voce\"\n\n#. Key:\tnpc_monk\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an npc\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Monk\"\nmsgstr \"Călugăr\"\n\n#. Key:\tnpc_name_kobold\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Kobold Chef\"\nmsgstr \"Bucătarul Goblin\"\n\n#. Key:\tnpc_pipe_walker\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"display name of some weird creatures\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Pipe Walker\"\nmsgstr \"Mergător pe Țevi\"\n\n#. Key:\tnpc_raven\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an npc (he is actually a bird)\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Raven\"\nmsgstr \"Corb\"\n\n#. Key:\tnpc_scholar\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an npc\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Scholar\"\nmsgstr \"Savant\"\n\n#. Key:\tnpc_secret_hideout\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"display name of a door asking for a password\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Secret Hideout Gate\"\nmsgstr \"Porta Secretă pentru Ascunzătoare\"\n\n#. Key:\tnpc_sewer_creature\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an npc\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Sewer Creature\"\nmsgstr \"Creatura de Canalizare\"\n\n#. Key:\tnpc_statue\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an npc\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Statue\"\nmsgstr \"Statuie\"\n\n#. Key:\tnpc_supper_dwarf\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"display name of an npc. Supper refers here an evening meal, typically a light or informal one.\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Supper Dwarf\"\nmsgstr \"Piticul Cinei\"\n\n#. Key:\tnpc_teachy\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an npc\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Teachy\"\nmsgstr \"Teachy\"\n\n#. Key:\tnpc_teachy_unkown\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"name of Teachy before introduction\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Bored Gnome\"\nmsgstr \"Pitic Plictisit\"\n\n#. Key:\tnpc_tomb\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"display name of a tomb a character can talk to\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Tomb\"\nmsgstr \"Mormânt\"\n\n#. Key:\tnpc_unknown_wizard\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"display name of an npc\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Unknown Wizard\"\nmsgstr \"Vrăjitor Necunoscut\"\n\n#. Key:\tnpc_wizard\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"display name of the wizard npc\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Wizard\"\nmsgstr \"Vrăjitor\"\n\n#. Key:\t022227664F6F422B20B109A19B8789AA\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"I’m glad you are back again!\"\nmsgstr \"Mă bucur că te-ai întors înapoi!\"\n\n#. Key:\t0944D8A541F933BEB5DD068CA9099075\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_44.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_44.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"I think I managed to activate the device on the wall of the Portal Tower.\"\nmsgstr \"Cred că am reușit să activez dispozitivul de pe peretele Turnului Portalului.\"\n\n#. Key:\t10ADF4F948FB99445BF791BB0722AD90\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_25.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_25.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Good idea.\"\nmsgstr \"Bună idee.\"\n\n#. Key:\t137B87BB447D45E46C0425A940E8B7F0\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_46.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_46.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"You said you wouldn't do it...\"\nmsgstr \"Ai spus că nu o vei face ...\"\n\n#. Key:\t16358AE840D8B8553E8930A3B7E69BBA\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"You know, sometimes I miss the Pipewalkers...\"\nmsgstr \"Știi, uneori mi-e dor de călătorii de conducte...\"\n\n#. Key:\t1B9834C6405C60960F322585AB0F1704\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_38.Text\n#. Key:\t2189E8064ACF974902FBA49BD12D0F47\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_38.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Could you activate it for me?\"\nmsgstr \"Ai putea să o activezi pentru mine?\"\n\n#. Key:\t274EB7AD410061E3E200A9813A54AB29\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"I think I've already done that.\"\nmsgstr \"Cred că am făcut deja asta.\"\n\n#. Key:\t2A57878148EFCC8532E34CAE1B9C9A0F\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"You? I never thought I’ll see you in this shape again.\"\nmsgstr \"Tu? Niciodată nu am crezut că te voi mai vedea în această formă.\"\n\n#. Key:\t3764BB48401ABEDCD125F186B4BF0E17\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"And it also attracts the Pipewalkers.\"\nmsgstr \"Și îi atrage și pe cei care călătoresc pe conducte.\"\n\n#. Key:\t3A0924F7449355545C0A98B94994616B\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"I want to find my tribe.\"\nmsgstr \"Vreau să-mi găsesc tribul.\"\n\n#. Key:\t3C0498284D71B7B64FEA4094F42A5502\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_23.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_23.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Do you think you will find Pipewalkers here?\"\nmsgstr \"Crezi că vei găsi aici călătorii de conducte?\"\n\n#. Key:\t3DCACAB047175FB687542AB0CA25D972\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_38.Children(1).Children.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_38.Children(1).Children.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Decline\"\nmsgstr \"Refuză\"\n\n#. Key:\t41C1FCA947041D49247FC8A157D7407F\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_52.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_52.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"All right, thank you.\"\nmsgstr \"In regula. Mulțumesc.\"\n\n#. Key:\t43C8FE9248340E49F1F31882D7B96642\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"If they are still alive they must be beyond that Purple Portal.\"\nmsgstr \"Dacă sunt încă în viață, trebuie să fie dincolo de portalul Violet.\"\n\n#. Key:\t444DD931423A98C7DD95D4BB73F0F1C6\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_39.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_39.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Sure! I’ll see what I can do.\"\nmsgstr \"Sigur! Voi vedea ce pot face.\"\n\n#. Key:\t4FF2FA154BEFBD448EFDB0BB7FE3F0AF\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_11.Children(1).Children.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_11.Children(1).Children.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Tribe\"\nmsgstr \"Trib\"\n\n#. Key:\t52A8B1F04C37F262E014DEA14AB68957\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Because I’m a chef.\"\nmsgstr \"Pentru că sunt bucătar.\"\n\n#. Key:\t5F376BF945B8CE4AA12B7EB05F8C62A5\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_11.Children(6).Children.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_11.Children(6).Children.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Leave\"\nmsgstr \"Ieși\"\n\n#. Key:\t63EA4DDD45390542E3A904928143D9AF\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Haha... Yes I’m back again.\"\nmsgstr \"Haha... Da, m-am întors din nou.\"\n\n#. Key:\t64EE856046A396F2750AE1BC1042CF26\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_30.Text\n#. Key:\tE3F52F4F47289406E4A546BB0BF3AC3F\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_50.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_30.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_50.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Thanks!\"\nmsgstr \"Mulțumesc!\"\n\n#. Key:\t694B6E3F4F4C7CEAAACB51A2D30FFD26\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_11.Children(2).Children.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_11.Children(2).Children.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Ruin\"\nmsgstr \"Ruină\"\n\n#. Key:\t7304F1034A83C6D17E274090FA8E543B\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_41.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_41.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Thank you!\"\nmsgstr \"Mulțumesc!\"\n\n#. Key:\t73240093450B12BEEA1EB78C9CF7D89E\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_11.Children(0).Children.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_11.Children(0).Children.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Purple Portal\"\nmsgstr \"Portal Violet\"\n\n#. Key:\t804671AF40165C92FA6A8F8A5AE97997\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_60.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_60.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Looks like I can’t get rid of this body.\"\nmsgstr \"Se pare că nu pot scăpa de acest corp.\"\n\n#. Key:\t807FF1A945548216DAD305B4D5A4437F\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_24.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_24.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"If there are any they will come here when they smell the soup.\"\nmsgstr \"Dacă există, vor veni aici când vor mirosi supa.\"\n\n#. Key:\t8240EF7946C8434333AFAEBEF3583917\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_34.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_34.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Do you need help with something?\"\nmsgstr \"Ai nevoie de ajutor cu ceva?\"\n\n#. Key:\t833BB4384231444247779CAB596D0259\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_40.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_40.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"I’m sorry but that sounds complicated.\"\nmsgstr \"Îmi pare rău, dar sună complicat.\"\n\n#. Key:\t85656A9E46844B03D49E13AC951FDE07\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_59.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_59.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"See you!\"\nmsgstr \"Te văd!\"\n\n#. Key:\t869485E24E19938DEE48BFB5C5240BB3\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_29.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_29.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"I’m not sure... but I have a key which might be useful.\"\nmsgstr \"Nu sunt sigur ... dar am o cheie care ar putea fi utilă.\"\n\n#. Key:\t86FBA5A24734DD97167512A054A2E0D9\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Oh, it’s you.\"\nmsgstr \"Oh, tu ești.\"\n\n#. Key:\t891684A24BA64E351E7F0B9ADEA3D6DF\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"No. To be honest I don’t care much about Ruin.\"\nmsgstr \"Nu. Să fiu sincer, nu-mi pasă prea mult de Ruină.\"\n\n#. Key:\t8FF6BF7B4745BB75C2D8F7873C492C2D\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_11.Children(4).Children.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_11.Children(4).Children.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Can I help?\"\nmsgstr \"Pot să ajut?\"\n\n#. Key:\t93B13014434102C8033B41A06DBED69B\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_11.Children(5).Children.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_11.Children(5).Children.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Tower Device\"\nmsgstr \"Dispozitiv pentru Turn\"\n\n#. Key:\t95A7C27A44B78CBF17C1FD8C9446CBD7\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Take it! I still need some time to finish the soup anyway.\"\nmsgstr \"Ia-l! Încă mai am nevoie de ceva timp pentru a termina supa.\"\n\n#. Key:\t97E4FDC74B47A6037D6023A4C65B2934\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_37.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_37.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"If you activate it I’ll be able to use the portal to teleport to other places.\"\nmsgstr \"Dacă îl activezi, voi putea folosi portalul pentru a mă teleporta în alte locuri.\"\n\n#. Key:\t9FD2679D44BEBBFBBAD2EAAECFFEE0D5\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_42.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_42.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"I can’t promise I’ll do that.\"\nmsgstr \"Nu pot promite că voi face asta.\"\n\n#. Key:\tAA1C6EF444BAB6A929E953A87BB87ABB\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_56.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_56.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"I've got to go. See you soon!\"\nmsgstr \"Trebuie să plec. Ne vedem în curând!\"\n\n#. Key:\tAED4FBE3422E0FC4AC4BD38650F95CA9\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_26.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_26.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Thanks.\"\nmsgstr \"Mulțumesc.\"\n\n#. Key:\tB0BAD1934671ADCB2DD1E1BA582E3C68\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Why are you making soup?\"\nmsgstr \"De ce faci supă?\"\n\n#. Key:\tB621AECE42A14A508C945595493F3A3A\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Really? Anyway, I’m happy to see you.\"\nmsgstr \"Serios? Oricum, sunt fericit să te văd.\"\n\n#. Key:\tBA715D554C47932C092462B36ADEA081\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_58.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_58.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Good bye!\"\nmsgstr \"La revedere!\"\n\n#. Key:\tBE7B3444431F43E8E1487F8702B94845\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_57.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_57.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"It was nice to meet you.\"\nmsgstr \"Mi-a făcut plăcere să te cunosc.\"\n\n#. Key:\tC1BB24A443D4297B17E2F6A280B02E91\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_36.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_36.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Yes. According to a book I read here there is a device on the wall of the Portal Tower.\"\nmsgstr \"Da. Conform unei cărți pe care am citit-o aici, există un dispozitiv pe peretele Turnului Portalului.\"\n\n#. Key:\tC339B87742C2B475E2387F93418AA855\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Have you found out anything about Ruin?\"\nmsgstr \"Ai aflat ceva despre Ruină?\"\n\n#. Key:\tC4D263AB48B800D5522A24923C541ED3\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_11.Children(3).Children.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_11.Children(3).Children.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Soup\"\nmsgstr \"Supă\"\n\n#. Key:\tC530096E4FA1A2B68077C3AD6AC1BF44\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_38.Children(0).Children.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_38.Children(0).Children.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Accept Quest\"\nmsgstr \"Acceptă misiune\"\n\n#. Key:\tC82668E6497A810FA6ADC0AB6F362B47\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"The soup is almost ready...\"\nmsgstr \"Supa este aproape gata ...\"\n\n#. Key:\tCD8CDA3443CDE79BE257B99A0801B209\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_43.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_43.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"No problem.\"\nmsgstr \"Nici o problemă.\"\n\n#. Key:\tD058108241051A9FD0D130B3C9EA4B8B\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"It helps me keep my mind clear.\"\nmsgstr \"Mă ajută să-mi țin mintea limpede.\"\n\n#. Key:\tD8F879684C57BB474E7153B971073663\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_49.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_49.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Meanwhile I cooked something special for you. Take this!\"\nmsgstr \"Între timp am gătit ceva special pentru tine. Ia asta!\"\n\n#. Key:\tDA9D493F42420BE9442B1EA983AEF9C2\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Any news on your lost tribe?\"\nmsgstr \"Ai vreo veste despre tribul tău pierdut?\"\n\n#. Key:\tDE2390ED4366A621E4D220A3761333DE\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_54.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_54.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"I need to go now.\"\nmsgstr \"Trebuie să plec acum.\"\n\n#. Key:\tDE668E4B4A3D0F785A693B9190E635D3\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_47.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_47.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"How on earth have you managed to reach this node?\"\nmsgstr \"Cum în plata domnului ai reușit să ajungi în acest nod?\"\n\n#. Key:\tE29E2D044497A86DD0FCA8B540703597\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_48.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_48.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Pls. report it as a bug.\"\nmsgstr \"Te rog, raportează-l ca o eroare.\"\n\n#. Key:\tE6D3401944B2FF128DD1689F5159AF96\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_45.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_45.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Nice, well done!\"\nmsgstr \"Frumos, bine făcut!\"\n\n#. Key:\tE83287164D066CCE8FBFDE835FBD4CFB\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_55.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_55.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"I'm on my way. Take care!\"\nmsgstr \"Sunt pe drum. Ai grijă!\"\n\n#. Key:\tEBC97F7C45858FE6DC72209536FC5C3B\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_27.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_27.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Do you know how can I reach that Purple Portal?\"\nmsgstr \"Ști cum pot ajunge la acel portal Violet?\"\n\n#. Key:\tF911D6CB45AA59448C03379A1C07DD60\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_51.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_51.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"It wasn’t that complicated after all.\"\nmsgstr \"La urma urmei, nu a fost atât de complicat.\"\n\n#. Key:\tF9EBA1684D435C8AEB14129A7B57A604\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"I think they came here and followed the messages just like you.\"\nmsgstr \"Cred că au venit aici și au urmărit mesajele la fel ca tine.\"\n\n#. Key:\t3DAA74ED48BE31E35D868FB1492E57A8\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/WW_Pergamen.WW_Pergamen:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/WhiteWall/WW_Pergamen.WW_Pergamen:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_WW_Pergamen\"\nmsgid \"'Ruin took over some of us. It's no longer safe here.'\"\nmsgstr \"'Ruina i-a preluat pe unii dintre noi. Nu mai este în siguranță aici.'\"\n\n#. Key:\tB10818134FFE3A1E99A9D789BFABBBEE\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/WW_Pergamen.WW_Pergamen:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/WhiteWall/WW_Pergamen.WW_Pergamen:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_WW_Pergamen\"\nmsgid \"'Come visit us beyond the Purple Portal!'\"\nmsgstr \"'Vino să ne vizitezi dincolo de portalul Violet!'\"\n\n#. Key:\tD292364A4E58F52FB874AA98C1F969A6\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/WW_Pergamen.WW_Pergamen:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/WhiteWall/WW_Pergamen.WW_Pergamen:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_WW_Pergamen\"\nmsgid \"'We are close to the solution, but your help is still needed.'\"\nmsgstr \"'Suntem aproape de soluție, dar ajutorul tău este încă necesar.'\"\n\n#. Key:\t0CD0FD884718EF68B38D578CDE17110A\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/WW_Statue.WW_Statue:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/WhiteWall/WW_Statue.WW_Statue:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_WW_Statue\"\nmsgid \"Oooops...\"\nmsgstr \"Aoooleu...\"\n\n#. Key:\t2D531D384CB6A56DBC4834BD229622E7\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/WW_Statue.WW_Statue:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/WhiteWall/WW_Statue.WW_Statue:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_WW_Statue\"\nmsgid \"'White Wall will never fall!'\"\nmsgstr \"'Zidul Alb nu va cădea niciodată!'\"\n\n#. Key:\t2690E77045D5E42F32AC6582BAFF27AA\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/WW_StatueWelcome.WW_StatueWelcome:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/WhiteWall/WW_StatueWelcome.WW_StatueWelcome:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_WW_StatueWelcome\"\nmsgid \"'We know how to stop Ruin.'\"\nmsgstr \"'Noi știm cum să oprim Ruina.'\"\n\n#. Key:\t7C3340434A4C80010AC2D58BF8504339\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/WW_StatueWelcome.WW_StatueWelcome:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/WhiteWall/WW_StatueWelcome.WW_StatueWelcome:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_WW_StatueWelcome\"\nmsgid \"'There is still hope.'\"\nmsgstr \"'Încă mai există speranță.'\"\n\n#. Key:\tarmour_wrath_name\n#. SourceLocation:\tLocalization/StringTables/Enemies.csv\n#. InfoMetaData:\t\"Comment\" : \"display name of an npc boss\"\n#: Localization/StringTables/Enemies.csv\nmsgctxt \"Enemies\"\nmsgid \"Armour Wrath\"\nmsgstr \"Armura Mâniei\"\n\n#. Key:\tdwarf_name\n#. SourceLocation:\tLocalization/StringTables/Enemies.csv\n#. InfoMetaData:\t\"Comment\" : \"display name of an npc boss\"\n#: Localization/StringTables/Enemies.csv\nmsgctxt \"Enemies\"\nmsgid \"Dwarf\"\nmsgstr \"Pitic\"\n\n#. Key:\tfallen_druid_name\n#. SourceLocation:\tLocalization/StringTables/Enemies.csv\n#. InfoMetaData:\t\"Comment\" : \"display name of an npc boss\"\n#: Localization/StringTables/Enemies.csv\nmsgctxt \"Enemies\"\nmsgid \"Fallen Druid\"\nmsgstr \"Druid Decăzut\"\n\n#. Key:\tdreamhack_completed_desc\n#. SourceLocation:\tLocalization/StringTables/Episodes.csv\n#: Localization/StringTables/Episodes.csv\nmsgctxt \"Episodes\"\nmsgid \"Thanks for playing the game, we hope you had a great time!\"\nmsgstr \"Vă mulțumim pentru că ați jucat jocul, sperăm că v-ați distrat de minune!\"\n\n#. Key:\tdreamhack_completed_subtitle\n#. SourceLocation:\tLocalization/StringTables/Episodes.csv\n#: Localization/StringTables/Episodes.csv\nmsgctxt \"Episodes\"\nmsgid \"Dreamhack Demo\"\nmsgstr \"Dreamhack Demo\"\n\n#. Key:\tdreamhack_desc\n#. SourceLocation:\tLocalization/StringTables/Episodes.csv\n#: Localization/StringTables/Episodes.csv\nmsgctxt \"Episodes\"\nmsgid \"What happens when you lock a mighty demon's spirit inside a ball body?\"\nmsgstr \"Ce se întâmplă când încui spiritul unui demon puternic în interiorul unui corp de bilă?\"\n\n#. Key:\tdreamhack_friendly_name\n#. SourceLocation:\tLocalization/StringTables/Episodes.csv\n#: Localization/StringTables/Episodes.csv\nmsgctxt \"Episodes\"\nmsgid \"Dreamhack\"\nmsgstr \"Dreamhack\"\n\n#. Key:\tepisode_end_main_title\n#. SourceLocation:\tLocalization/StringTables/Episodes.csv\n#. InfoMetaData:\t\"Comment\" : \"episode map end panel text\"\n#: Localization/StringTables/Episodes.csv\nmsgctxt \"Episodes\"\nmsgid \"Episode Completed!\"\nmsgstr \"Episod Completat!\"\n\n#. Key:\tescape_darkness_completed_desc\n#. SourceLocation:\tLocalization/StringTables/Episodes.csv\n#: Localization/StringTables/Episodes.csv\nmsgctxt \"Episodes\"\nmsgid \"\\\"And as Darkness spreads an unknown Warriorb will rise...\\\"\"\nmsgstr \"\\\"Și pe măsură ce Întunericul se va răspândi, un Războinic necunoscut va răsări... \\\"\"\n\n#. Key:\tescape_darkness_completed_subtitle\n#. SourceLocation:\tLocalization/StringTables/Episodes.csv\n#: Localization/StringTables/Episodes.csv\nmsgctxt \"Episodes\"\nmsgid \"Escaped from Darkness\"\nmsgstr \"Evadare din întuneric\"\n\n#. Key:\tescape_darkness_desc\n#. SourceLocation:\tLocalization/StringTables/Episodes.csv\n#: Localization/StringTables/Episodes.csv\nmsgctxt \"Episodes\"\nmsgid \"Are you fast enough to race against Darkness itself?\"\nmsgstr \"Ești suficient de rapid pentru a alerga împotriva întunericului în sine?\"\n\n#. Key:\tescape_darkness_friendly_name\n#. SourceLocation:\tLocalization/StringTables/Episodes.csv\n#: Localization/StringTables/Episodes.csv\nmsgctxt \"Episodes\"\nmsgid \"Escape Darkness\"\nmsgstr \"Evadarea întunericului\"\n\n#. Key:\twhite_wall_completed_desc\n#. SourceLocation:\tLocalization/StringTables/Episodes.csv\n#. InfoMetaData:\t\"Comment\" : \"short text on the ending panel when player finishes this episode\"\n#: Localization/StringTables/Episodes.csv\nmsgctxt \"Episodes\"\nmsgid \"What happened beyond the portal is another story, which will be told at another time.\"\nmsgstr \"Ceea ce s-a întâmplat dincolo de portal este o altă poveste, care va fi povestită în alt moment.\"\n\n#. Key:\twhite_wall_completed_subtitle\n#. SourceLocation:\tLocalization/StringTables/Episodes.csv\n#. InfoMetaData:\t\"Comment\" : \"subtitle of the ending panel when player finishes this episode\"\n#. Key:\twhite_wall_friendly_name\n#. InfoMetaData:\t\"Comment\" : \"name the episode is displayed with in the ui\"\n#: Localization/StringTables/Episodes.csv\nmsgctxt \"Episodes\"\nmsgid \"White Wall\"\nmsgstr \"Zidul Alb\"\n\n#. Key:\twhite_wall_desc\n#. SourceLocation:\tLocalization/StringTables/Episodes.csv\n#. InfoMetaData:\t\"Comment\" : \"map desc when the player can select the episode\"\n#: Localization/StringTables/Episodes.csv\nmsgctxt \"Episodes\"\nmsgid \"Although it's long abandoned the fortress of White Wall still stands against Ruin. After centuries of silence some groups of unexpected visitors broke the loneliness of the decaying city.\"\nmsgstr \"Deși a fost abandonată de mult timp, cetatea Zidului Alb încă stă împotriva Ruinei. După secole de tăcere, unele grupuri de vizitatori neașteptați au rupt singurătatea orașului în declin.\"\n\n#. Key:\twhite_wall_loadingscreen_desc\n#. SourceLocation:\tLocalization/StringTables/Episodes.csv\n#. InfoMetaData:\t\"Comment\" : \"text on loading screen\"\n#: Localization/StringTables/Episodes.csv\nmsgctxt \"Episodes\"\nmsgid \"After months of researching I found a way to return back to the Ruined Realm. Ironically enough I have to use the same body I was trapped in before. I'll need to be quick and clever for this might be my very last chance to stop Ruin before it devours the World.\"\nmsgstr \"După câteva luni de cercetare, am găsit o cale de a mă întoarce pe tărâmul ruinat. În mod ironic, trebuie să folosesc același corp în care am fost prins înainte. Va trebui să fiu rapid și inteligent pentru că aceasta va fi ultima mea șansă de a opri Ruina înainte să devoreze Lumea.\"\n\n#. Key:\tchar_vo_armourwrath_attack_clap\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I won't fail the Maker!\"\nmsgstr \"Nu voi da greș Creatorului!\"\n\n#. Key:\tchar_vo_armourwrath_attack_die\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"No... I'm still... perfect\"\nmsgstr \"Nu... Sunt încă... perfect\"\n\n#. Key:\tchar_vo_armourwrath_attack_magic\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Resist Ruin!\"\nmsgstr \"Rezistă Ruinei!\"\n\n#. Key:\tchar_vo_armourwrath_attack_strike_down\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Out of my way!\"\nmsgstr \"Dă-te din calea mea!\"\n\n#. Key:\tchar_vo_armourwrath_attack_strike_down_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I am perfect\"\nmsgstr \"Sunt perfect\"\n\n#. Key:\tchar_vo_dwarvenstatue_attack_axe_point\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I keep Ruin\"\nmsgstr \"Păstrez Ruina\"\n\n#. Key:\tchar_vo_dwarvenstatue_attack_axe_strike_down\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"We are above the Law!\"\nmsgstr \"Suntem deasupra Legii!\"\n\n#. Key:\tchar_vo_dwarvenstatue_attack_meteor\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I can take more!\"\nmsgstr \"Pot lua mai mult!\"\n\n#. Key:\tchar_vo_dwarvenstatue_die\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I won't move... again\"\nmsgstr \"Nu mă voi mișca ... din nou\"\n\n#. Key:\tchar_vo_dwarvenstatue_shield_knock\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I hold it back!\"\nmsgstr \"O rețin!\"\n\n#. Key:\tchar_vo_fallendruid_attack_flybug\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"It's safe here.\"\nmsgstr \"Este în siguranță aici.\"\n\n#. Key:\tchar_vo_fallendruid_attack_spike\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"This place shall stand!\"\nmsgstr \"Locul acesta va sta!\"\n\n#. Key:\tchar_vo_fallendruid_attack_tendril\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Nature will survive!\"\nmsgstr \"Natura va supraviețui!\"\n\n#. Key:\tchar_vo_fallendruid_attack_thorn_sphere\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Out with you, Ruin!\"\nmsgstr \"Afară cu tine, Ruină!\"\n\n#. Key:\tchar_vo_fallendruid_die\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I have... failed\"\nmsgstr \"Am eșuat\"\n\n#. Key:\tchar_vo_final_boss_p1_blue\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#. Key:\tchar_vo_final_boss_p2_blue\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I'm the daughter of the Wizard!\"\nmsgstr \"Sunt fiica Vrăjitorului!\"\n\n#. Key:\tchar_vo_final_boss_p1_green\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#. Key:\tchar_vo_final_boss_p2_red_up\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I can create!\"\nmsgstr \"Pot crea!\"\n\n#. Key:\tchar_vo_final_boss_p1_red\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I'm human!\"\nmsgstr \"Sunt uman!\"\n\n#. Key:\tchar_vo_final_boss_p2_green\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#. Key:\tchar_vo_final_boss_p3_green\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"That sounds funny!\"\nmsgstr \"Sună amuzant!\"\n\n#. Key:\tchar_vo_final_boss_p2_red_down\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I can destroy!\"\nmsgstr \"Pot distruge!\"\n\n#. Key:\tchar_vo_final_boss_p3_blue\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I'm free!\"\nmsgstr \"Sunt liber!\"\n\n#. Key:\tchar_vo_final_boss_p3_red\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"What makes you say that?\"\nmsgstr \"Ce te face să spui asta?\"\n\n#. Key:\tchar_vo_fishy_idle_hiss\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Hissing\"\nmsgstr \"Sâsâit\"\n\n#. Key:\tchar_vo_flybug_attack_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Huh! Surprised?\"\nmsgstr \"Huh! Uimit?\"\n\n#. Key:\tchar_vo_flybug_attack_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Take this!\"\nmsgstr \"Ia asta!\"\n\n#. Key:\tchar_vo_flybug_damaged_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Careful!\"\nmsgstr \"Fi Atent!\"\n\n#. Key:\tchar_vo_flybug_damaged_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"It's not funny!\"\nmsgstr \"Nu este amuzant!\"\n\n#. Key:\tchar_vo_flybug_die_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"All right, gg!\"\nmsgstr \"Bine, gg!\"\n\n#. Key:\tchar_vo_flybug_idle_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"What is it like down there? Heh?\"\nmsgstr \"Cum e acolo jos? Heh?\"\n\n#. Key:\tchar_vo_flybug_idle_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Easy man, easy!\"\nmsgstr \"Ușor omule, ușor!\"\n\n#. Key:\tchar_vo_gatekeeper_attack_aimed\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Avoid these!\"\nmsgstr \"Evitați acestea!\"\n\n#. Key:\tchar_vo_gatekeeper_attack_aimed_phase_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Watch out where you bounce to!\"\nmsgstr \"Atenție unde sări!\"\n\n#. Key:\tchar_vo_gatekeeper_attack_electric_bubbles\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Attention to the heights!\"\nmsgstr \"Atenție la înălțimi!\"\n\n#. Key:\tchar_vo_gatekeeper_attack_electric_bubbles_phase_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Attention to the heights again!\"\nmsgstr \"Atenție la înălțimi din nou!\"\n\n#. Key:\tchar_vo_gatekeeper_attack_meteors\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Watch out for your head!\"\nmsgstr \"Atenție la capul tău!\"\n\n#. Key:\tchar_vo_gatekeeper_attack_shield\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Do you really think you are worthy?\"\nmsgstr \"Chiar crezi că ești demn?\"\n\n#. Key:\tchar_vo_ghostarmor__die\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I... don't...\"\nmsgstr \"Eu ... nu ...\"\n\n#. Key:\tchar_vo_ghostarmor_attack_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"You shall perish!\"\nmsgstr \"Vei pieri!\"\n\n#. Key:\tchar_vo_ghostarmor_attack_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"For justice!\"\nmsgstr \"Pentru justiție!\"\n\n#. Key:\tchar_vo_ghostarmor_attack_fall\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Death to the outlaw!\"\nmsgstr \"Moarte infractorului!\"\n\n#. Key:\tchar_vo_ghostarmor_damaged_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Just a scratch.\"\nmsgstr \"Doar o zgârietură.\"\n\n#. Key:\tchar_vo_ghostarmor_damaged_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"You... can't.\"\nmsgstr \"Nu ... nu poți.\"\n\n#. Key:\tchar_vo_ghostarmor_idle_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"We keep the Wall.\"\nmsgstr \"Păstrăm Zidul.\"\n\n#. Key:\tchar_vo_ghostarmor_idle_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Follow the rules!\"\nmsgstr \"Urmează regulile!\"\n\n#. Key:\tchar_vo_ghosthelmet_attack_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Aaaaaaargh!\"\nmsgstr \"Aaaaaaargh!\"\n\n#. Key:\tchar_vo_ghosthelmet_attack_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Chaaaaaarge!\"\nmsgstr \"Ataaaaaaaaac!\"\n\n#. Key:\tchar_vo_ghosthelmet_damaged_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I'll need a blacksmith!\"\nmsgstr \"Am nevoie de un fierar!\"\n\n#. Key:\tchar_vo_ghosthelmet_damaged_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Send someone for a hammer!\"\nmsgstr \"Trimite pe cineva pentru un ciocan!\"\n\n#. Key:\tchar_vo_ghosthelmet_die\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Be right back!\"\nmsgstr \"Revin imediat!\"\n\n#. Key:\tchar_vo_ghosthelmet_idle_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Use your head... or mine!\"\nmsgstr \"Folosește-ți capul ... sau al meu!\"\n\n#. Key:\tchar_vo_ghosthelmet_idle_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Let's head east!\"\nmsgstr \"Hai să ne îndreptăm spre est!\"\n\n#. Key:\tchar_vo_gnory_idle_humming\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Humming\"\nmsgstr \"Zbârnăie\"\n\n#. Key:\tchar_vo_gnory_idle_whistle\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Whistling\"\nmsgstr \"Fluierat\"\n\n#. Key:\tchar_vo_golemmaker_idle_explain_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I create essence which resists the ruin.\"\nmsgstr \"Creez esență care rezistă ruinei.\"\n\n#. Key:\tchar_vo_golemmaker_idle_mindlessly_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Knowledge is Lost, All is Lost.\"\nmsgstr \"Cunoașterea este pierdută, totul este pierdut.\"\n\n#. Key:\tchar_vo_golemmaker_idle_mindlessly_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"All is Lost.\"\nmsgstr \"Totul este pierdut.\"\n\n#. Key:\tchar_vo_golemmaker_idle_moan_aaahhh\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Aaahhh\"\nmsgstr \"Aaahhh\"\n\n#. Key:\tchar_vo_golemmaker_idle_moan_ooohhh\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Ooohhh\"\nmsgstr \"Ooohhh\"\n\n#. Key:\tchar_vo_golemmaker_idle_sad_onon\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Onon\"\nmsgstr \"Onon\"\n\n#. Key:\tchar_vo_golemmaker_idle_tries_to_remember\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Your words remind me of something.\"\nmsgstr \"Cuvintele tale îmi amintesc de ceva.\"\n\n#. Key:\tchar_vo_koboldchef_idle_01\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Too hot!\"\nmsgstr \"Prea cald!\"\n\n#. Key:\tchar_vo_koboldchef_idle_02\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"It needs more salt!\"\nmsgstr \"Are nevoie de mai multă sare!\"\n\n#. Key:\tchar_vo_koboldchef_idle_03\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"It will be delicious.\"\nmsgstr \"Va fi delicios.\"\n\n#. Key:\tchar_vo_koboldchef_idle_04\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Hmm...\"\nmsgstr \"Hmm...\"\n\n#. Key:\tchar_vo_lory_idle_croon\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Croon\"\nmsgstr \"Fredonat\"\n\n#. Key:\tchar_vo_lory_idle_humming_0\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Ohh\"\nmsgstr \"Ohh\"\n\n#. Key:\tchar_vo_lory_idle_humming_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#. Key:\tchar_vo_supperdwarf_idle_2_humming_1\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Hmmm\"\nmsgstr \"Hmmm\"\n\n#. Key:\tchar_vo_lory_idle_humming_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Ommm\"\nmsgstr \"Ommm\"\n\n#. Key:\tchar_vo_lory_idle_humming_3\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Auch\"\nmsgstr \"Auch\"\n\n#. Key:\tchar_vo_maintainer_attack_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Dinner is served!\"\nmsgstr \"Cina este servită!\"\n\n#. Key:\tchar_vo_maintainer_attack_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Now it's clean!\"\nmsgstr \"Acum este curat!\"\n\n#. Key:\tchar_vo_maintainer_damaged_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I'll need to be repaired.\"\nmsgstr \"Va trebui să fiu reparat.\"\n\n#. Key:\tchar_vo_maintainer_damaged_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I still serve.\"\nmsgstr \"Încă slujesc.\"\n\n#. Key:\tchar_vo_maintainer_die\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I'll need... replacement.\"\nmsgstr \"Voi avea nevoie de ... înlocuire.\"\n\n#. Key:\tchar_vo_maintainer_elite_idle_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Serve...\"\nmsgstr \"Servește...\"\n\n#. Key:\tchar_vo_maintainer_elite_idle_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Order...\"\nmsgstr \"Ordine...\"\n\n#. Key:\tchar_vo_maintainer_idle_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"At your service.\"\nmsgstr \"La dispoziția ta.\"\n\n#. Key:\tchar_vo_maintainer_idle_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Your order?\"\nmsgstr \"Comanda ta?\"\n\n#. Key:\tchar_vo_maintainer_miniboss_attack_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"This is my order!\"\nmsgstr \"Acesta este ordinul meu!\"\n\n#. Key:\tchar_vo_maintainer_miniboss_attack_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I'll reorganize!\"\nmsgstr \"O să reorganizez!\"\n\n#. Key:\tchar_vo_maintainer_miniboss_attack_meteor\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I'm above!\"\nmsgstr \"Sunt deasupra!\"\n\n#. Key:\tchar_vo_maintainer_miniboss_attack_spawn_enemy\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Order, order, order!\"\nmsgstr \"Ordine, ordine, ordine!\"\n\n#. Key:\tchar_vo_maintainer_miniboss_damaged_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I can fix this\"\nmsgstr \"Pot să repar asta\"\n\n#. Key:\tchar_vo_maintainer_miniboss_damaged_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Don't do that again!\"\nmsgstr \"Nu mai fă asta niciodată!\"\n\n#. Key:\tchar_vo_maintainer_miniboss_die\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I can't... I was... above.\"\nmsgstr \"Nu pot ... Am fost ... mai sus.\"\n\n#. Key:\tchar_vo_primitivefishy_attack_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Srrrr!\"\nmsgstr \"Srrrr!\"\n\n#. Key:\tchar_vo_primitivefishy_attack_long_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Hurray!\"\nmsgstr \"Uraaaa!\"\n\n#. Key:\tchar_vo_primitivefishy_attack_long_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Flyyyyyyy!\"\nmsgstr \"Zboarăăăăă!\"\n\n#. Key:\tchar_vo_primitivefishy_damaged_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Uuush!\"\nmsgstr \"Uuush!\"\n\n#. Key:\tchar_vo_primitivefishy_damaged_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Shish!\"\nmsgstr \"Shish!\"\n\n#. Key:\tchar_vo_primitivefishy_die\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Fishy leaves.\"\nmsgstr \"Peștele pleacă.\"\n\n#. Key:\tchar_vo_primitivefishy_idle_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I need some fish!\"\nmsgstr \"Am nevoie de niște pește!\"\n\n#. Key:\tchar_vo_primitivefishy_idle_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Did you hear that?\"\nmsgstr \"Ai auzit asta?\"\n\n#. Key:\tchar_vo_shade_attack_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Join me!\"\nmsgstr \"Alătură-te mie!\"\n\n#. Key:\tchar_vo_shade_attack_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"You shall die too!\"\nmsgstr \"Vei muri și tu!\"\n\n#. Key:\tchar_vo_shade_damaged_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Is this the end?\"\nmsgstr \"Acesta este sfârșitul?\"\n\n#. Key:\tchar_vo_shade_damaged_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Pain...\"\nmsgstr \"Durere...\"\n\n#. Key:\tchar_vo_shade_die\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Death... again?!\"\nmsgstr \"Moartea... din nou?!\"\n\n#. Key:\tchar_vo_shade_idle_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I can't rest.\"\nmsgstr \"Nu mă pot odihni.\"\n\n#. Key:\tchar_vo_shade_idle_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Death is not peace.\"\nmsgstr \"Moartea nu este pace.\"\n\n#. Key:\tchar_vo_shadesphere_attack_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I'll change you!\"\nmsgstr \"Te voi schimba!\"\n\n#. Key:\tchar_vo_shadesphere_attack_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Do not resist me!\"\nmsgstr \"Nu mă rezista!\"\n\n#. Key:\tchar_vo_shadesphere_damaged_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"It's still... me...\"\nmsgstr \"Este încă ... eu ...\"\n\n#. Key:\tchar_vo_shadesphere_damaged_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Why did you...?\"\nmsgstr \"De ce ai făcut-o...?\"\n\n#. Key:\tchar_vo_shadesphere_die\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"You changed... me?\"\nmsgstr \"M-ai schimbat?\"\n\n#. Key:\tchar_vo_shadesphere_idle_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"What do you wish to be?\"\nmsgstr \"Ce vrei să fii?\"\n\n#. Key:\tchar_vo_shadesphere_idle_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Come to me!\"\nmsgstr \"Vino la mine!\"\n\n#. Key:\tchar_vo_supperdwarf_idle_1_eating_food_0\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Yum-yum hmmmm... delicious\"\nmsgstr \"Yum-yum hmmmm... delicios\"\n\n#. Key:\tchar_vo_supperdwarf_idle_1_eating_food_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Hmmm... tasty\"\nmsgstr \"Hmmm... gustos\"\n\n#. Key:\tchar_vo_supperdwarf_idle_1_eating_food_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Ehmmm... where is my spoon?\"\nmsgstr \"Ehmmm... unde este lingura mea?\"\n\n#. Key:\tchar_vo_supperdwarf_idle_2_humming_0\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Ehemm, ehemm\"\nmsgstr \"Ehemm, ehemm\"\n\n#. Key:\tchar_vo_supperdwarf_idle_2_humming_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Ohm\"\nmsgstr \"Ohm\"\n\n#. Key:\tchar_vo_teachy_idle_book_down_0\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Walking ball?\"\nmsgstr \"Minge plimbătoare?\"\n\n#. Key:\tchar_vo_teachy_idle_book_down_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"You?\"\nmsgstr \"Tu?\"\n\n#. Key:\tchar_vo_teachy_idle_book_down_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Do you exist outside of my mind?\"\nmsgstr \"Tu exiști în afara minții mele?\"\n\n#. Key:\tchar_vo_teachy_idle_book_down_3\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Ehm, what?\"\nmsgstr \"Ehm, ce?\"\n\n#. Key:\tchar_vo_teachy_idle_book_up_0\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Ehmm\"\nmsgstr \"Ehmm\"\n\n#. Key:\tchar_vo_teachy_idle_book_up_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Humm\"\nmsgstr \"Humm\"\n\n#. Key:\tchar_vo_teachy_idle_book_up_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Hemm\"\nmsgstr \"Hemm\"\n\n#. Key:\tchar_vo_teachy_idle_book_up_3\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Ahm\"\nmsgstr \"Ahm\"\n\n#. Key:\tchar_vo_teachy_idle_humming_0\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Hmmm-hmmm-hmm\"\nmsgstr \"Hmmm-hmmm-hmm\"\n\n#. Key:\tchar_vo_teachy_idle_humming_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Ehmm-hmmm-uhmm\"\nmsgstr \"Ehmm-hmmm-uhmm\"\n\n#. Key:\tchar_vo_teachy_idle_humming_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Umm-huhummm\"\nmsgstr \"Umm-huhummm\"\n\n#. Key:\tchar_vo_teachy_idle_humming_speaking_long_0\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I am, therefore I think!\"\nmsgstr \"Eu sunt, de aceea gândesc!\"\n\n#. Key:\tchar_vo_teachy_idle_humming_speaking_long_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I think... I am...\"\nmsgstr \"Gândesc... Că sunt...\"\n\n#. Key:\tchar_vo_teachy_idle_humming_speaking_long_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"The unexamined life is not worth living!\"\nmsgstr \"Viața neexaminată nu merita trăită!\"\n\n#. Key:\tchar_vo_teachy_idle_humming_speaking_long_3\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"The mind is furnished with ideas by a drunk upholsterer...\"\nmsgstr \"Mintea este dotată cu idei de la un tapițar beat ...\"\n\n#. Key:\tchar_vo_teachy_idle_humming_speaking_short_0\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Tic-tac\"\nmsgstr \"Tic-tac\"\n\n#. Key:\tchar_vo_teachy_idle_humming_speaking_short_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"To be...\"\nmsgstr \"A fi...\"\n\n#. Key:\tchar_vo_teachy_idle_humming_speaking_short_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Weird\"\nmsgstr \"Ciudat\"\n\n#. Key:\tAnyKey\n#. SourceLocation:\tSource/SOrb/Settings/Input/SoInputNames.cpp:347\n#: Source/SOrb/Settings/Input/SoInputNames.cpp:347\nmsgctxt \"InputKeys\"\nmsgid \"Any Key\"\nmsgstr \"Orice Tastă\"\n\n#. Key:\tDown\n#. SourceLocation:\tSource/SOrb/Settings/Input/SoInputNames.cpp:376\n#: Source/SOrb/Settings/Input/SoInputNames.cpp:376\nmsgctxt \"InputKeys\"\nmsgid \"Down\"\nmsgstr \"Jos\"\n\n#. Key:\tLeft\n#. SourceLocation:\tSource/SOrb/Settings/Input/SoInputNames.cpp:373\n#: Source/SOrb/Settings/Input/SoInputNames.cpp:373\nmsgctxt \"InputKeys\"\nmsgid \"Left\"\nmsgstr \"Stânga\"\n\n#. Key:\tRight\n#. SourceLocation:\tSource/SOrb/Settings/Input/SoInputNames.cpp:375\n#: Source/SOrb/Settings/Input/SoInputNames.cpp:375\nmsgctxt \"InputKeys\"\nmsgid \"Right\"\nmsgstr \"Dreapta\"\n\n#. Key:\tUp\n#. SourceLocation:\tSource/SOrb/Settings/Input/SoInputNames.cpp:374\n#: Source/SOrb/Settings/Input/SoInputNames.cpp:374\nmsgctxt \"InputKeys\"\nmsgid \"Up\"\nmsgstr \"Sus\"\n\n#. Key:\tabsorb_energy\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Absorb Energy\"\nmsgstr \"Absoarbe Energia\"\n\n#. Key:\tacquired_few_item\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"message when more than one item is received at once\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"A few items acquired\"\nmsgstr \"Câteva articole achiziționate\"\n\n#. Key:\tacquired_item\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"{0} is replaced with an item name\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"{0} acquired\"\nmsgstr \"{0} dobândit\"\n\n#. Key:\tactivate\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Activate\"\nmsgstr \"Activează\"\n\n#. Key:\tactivate_elevator\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Activate Elevator\"\nmsgstr \"Activează Liftul\"\n\n#. Key:\taquired_silver_key\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"optional bonus message\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Silver Key Acquired\"\nmsgstr \"Cheia de Argint Achiziționată\"\n\n#. Key:\tascend\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"climb up a ladder or rope or go up with an elevator\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Ascend\"\nmsgstr \"Urcă\"\n\n#. Key:\tbed\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"examine Bed\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Bed\"\nmsgstr \"Pat\"\n\n#. Key:\tboat_to_kitchen\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"use a boat to get to the kitchen\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Boat to the Kitchen\"\nmsgstr \"Barcă către Bucătărie\"\n\n#. Key:\tboat_to_ruins\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"use a boat to get to a place where there are some ancient ruins\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Boat to the Ruins\"\nmsgstr \"Barcă către Ruine\"\n\n#. Key:\tboat_to_station\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"use a boat to get to the Station\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Boat to the Station\"\nmsgstr \"Barcă către Stație\"\n\n#. Key:\tcall_elevator\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Call Elevator\"\nmsgstr \"Cheamă Liftul\"\n\n#. Key:\tcandles\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"examine Candles\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Candles\"\nmsgstr \"Lumânări\"\n\n#. Key:\tcat_bed\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"examine Tabbys (cat name) bed\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Tabby's Bed\"\nmsgstr \"Patul lui Tabby\"\n\n#. Key:\tchair\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"examine Chair\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Chair\"\nmsgstr \"Scaun\"\n\n#. Key:\tchange_spells\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Change Spells\"\nmsgstr \"Schimbă Vrăjile\"\n\n#. Key:\tcharge\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"charge gem in Act I\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Charge\"\nmsgstr \"Încarcă\"\n\n#. Key:\tcheck_door\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"check door \"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Check Door\"\nmsgstr \"Verifică Ușa\"\n\n#. Key:\tchest\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"examine Chest\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Chest\"\nmsgstr \"Cufăr\"\n\n#. Key:\tchest_check\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Check Chest\"\nmsgstr \"Verifică Cufărul\"\n\n#. Key:\tchest_check_small\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Check Small Chest\"\nmsgstr \"Verifică Cufărul Mic\"\n\n#. Key:\tchest_close\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Close Chest\"\nmsgstr \"Închide Cufărul\"\n\n#. Key:\tchest_close_small\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Close Small Chest\"\nmsgstr \"Închide Cufărul Mic\"\n\n#. Key:\tchest_open\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Open Chest\"\nmsgstr \"Deschide Cufărul\"\n\n#. Key:\tchest_open_small\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Open Small Chest\"\nmsgstr \"Deschide Cufărul Mic\"\n\n#. Key:\tclose_door\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Close Door\"\nmsgstr \"Închide Ușa\"\n\n#. Key:\tcross_planks\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Cross Planks\"\nmsgstr \"Scânduri Încrucișate\"\n\n#. Key:\tdads_room\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"examine Dad's Room\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Daddy's Room\"\nmsgstr \"Camera lui tati\"\n\n#. Key:\tdescend\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"climb down a ladder or rope or go down with an elevator\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Descend\"\nmsgstr \"Coboară\"\n\n#. Key:\tdestroy\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"destroy device in EndFinal level\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Destroy\"\nmsgstr \"Distruge\"\n\n#. Key:\tdevice\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"use Device\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Device\"\nmsgstr \"Dispozitiv\"\n\n#. Key:\tdoor\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"examine Door\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Door\"\nmsgstr \"Ușă\"\n\n#. Key:\tdoor_does_not_open_from_this_side\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"message when character tries to open a door but it can only be openned from the other side\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Door does not open from this side!\"\nmsgstr \"Ușa nu se deschide din partea asta!\"\n\n#. Key:\tdoor_opened\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"door openned\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Door opened\"\nmsgstr \"Ușă deschisă\"\n\n#. Key:\tdrop\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"drop box or carryable\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Drop\"\nmsgstr \"Lasă\"\n\n#. Key:\televator_activated\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Elevator Activated\"\nmsgstr \"Lift Activat\"\n\n#. Key:\televator_inactive\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"player tries to use the elevator but it is inactive\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"The elevator seems to be inactive\"\nmsgstr \"Se pare că liftul este inactiv\"\n\n#. Key:\televator_not_move_to_dir\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"player tries to use an elevator but the direction is not activated yet\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"The elevator does not move to the selected direction\"\nmsgstr \"Liftul nu se mișca in direcția selectată\"\n\n#. Key:\tenter\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"teleport - enter a room or a portal\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Enter\"\nmsgstr \"Intră\"\n\n#. Key:\tenter_bridge\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Enter Bridge\"\nmsgstr \"Intră pe Pod\"\n\n#. Key:\tenter_cave\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Enter Cave\"\nmsgstr \"Intră în Peșteră\"\n\n#. Key:\tenter_flames\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Enter Flames\"\nmsgstr \"Intră în Flăcări\"\n\n#. Key:\tenter_gate\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Enter Gate\"\nmsgstr \"Intră pe Poartă\"\n\n#. Key:\tenter_hut\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Enter Hut\"\nmsgstr \"Intră în Colibă\"\n\n#. Key:\tenter_kitchen\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Enter Kitchen\"\nmsgstr \"Intră în Bucătărie\"\n\n#. Key:\tenter_pipe\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Enter Pipe\"\nmsgstr \"Intră în Țeavă\"\n\n#. Key:\tenter_portal\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Enter Portal\"\nmsgstr \"Intră în Portal\"\n\n#. Key:\tenter_stairs_left\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Enter Stairs on the Left\"\nmsgstr \"Intră pe Scările din Stânga\"\n\n#. Key:\tenter_stairs_right\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Enter Stairs on the Right\"\nmsgstr \"Intră pe Scările din Dreapta\"\n\n#. Key:\tenter_tower\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Enter Tower\"\nmsgstr \"Intră în Turn\"\n\n#. Key:\tentrace_locked\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Entrance locked from the other side\"\nmsgstr \"Intrarea este blocată din cealaltă parte\"\n\n#. Key:\texamine\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"examine a statue or some other interactable object which triggers dialogue or hint message\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Examine\"\nmsgstr \"Examinează\"\n\n#. Key:\texamine_device\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Examine Device\"\nmsgstr \"Examinează Dispozitivul\"\n\n#. Key:\texamine_elevator\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Examine Elevator\"\nmsgstr \"Examinează Liftul\"\n\n#. Key:\texamine_switch\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"it is a lightswitch\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Examine Switch\"\nmsgstr \"Examinează Comutatorul\"\n\n#. Key:\texit\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"exit room\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Exit\"\nmsgstr \"Ieși\"\n\n#. Key:\texplore_stations\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Explore more stations before using the railway system.\"\nmsgstr \"Explorează mai multe stații înainte de a utiliza sistemul feroviar.\"\n\n#. Key:\tfinish_demo\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"teleport at the end of demo\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Finish Demo\"\nmsgstr \"Finalizare Demo\"\n\n#. Key:\tfire\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"fires a cannon\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Fire\"\nmsgstr \"Foc\"\n\n#. Key:\tgo_down\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"go down the stairs\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Go down\"\nmsgstr \"Coboară\"\n\n#. Key:\tgo_up\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"go up the stairs\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Go up\"\nmsgstr \"Urcă\"\n\n#. Key:\tinspect_fountain\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Inspect Fountain\"\nmsgstr \"Inspectează Fântâna\"\n\n#. Key:\tinventory\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"hint for hotkey to open the inventory\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Inventory\"\nmsgstr \"Inventar\"\n\n#. Key:\tkey_missing\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"{0} is the key name\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Key Missing: {0}\"\nmsgstr \"Cheie lipsă: {0}\"\n\n#. Key:\tkick_rope\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"a pile of rope can be kicked to be able to climb up/down on it\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Kick Rope\"\nmsgstr \"Lovește Funia\"\n\n#. Key:\tlaboratory\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"examine/enter Laboratory\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Laboratory\"\nmsgstr \"Laborator\"\n\n#. Key:\tlamps\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"examine Lamps\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Lamps\"\nmsgstr \"Lămpi\"\n\n#. Key:\tleave\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"teleport - leave a room, chest, level\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Leave\"\nmsgstr \"Ieși\"\n\n#. Key:\tleave_bridge\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Leave Bridge\"\nmsgstr \"Părăsește Podul\"\n\n#. Key:\tleave_cave\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Leave Cave\"\nmsgstr \"Părăsește Peștera\"\n\n#. Key:\tleave_circle\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Leave Circle\"\nmsgstr \"Părăsește Cercul\"\n\n#. Key:\tleave_hut\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Leave Hut\"\nmsgstr \"Părăsește Coliba\"\n\n#. Key:\tleft_lever\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"use Left Lever\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Left Lever\"\nmsgstr \"Maneta stângă\"\n\n#. Key:\tlever_is_active\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Lever activated. The crystal broke.\"\nmsgstr \"Maneta activată. Cristalul s-a spart.\"\n\n#. Key:\tlever_is_inactive\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"a lever\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Seems to be inactive\"\nmsgstr \"Pare a fi Inactiv\"\n\n#. Key:\tmemory_stone_aquire\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Acquire Memory Stone\"\nmsgstr \"Achiziționează Piatră de Memorie\"\n\n#. Key:\tmemory_stone_gained\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Memory Stone Gained\"\nmsgstr \"Piatra de Memorie Câștigată\"\n\n#. Key:\tmiddle_lever\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"use Middle Lever \"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Middle Lever\"\nmsgstr \"Maneta de mijloc\"\n\n#. Key:\tmoms_room\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"examine Mom's Room\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Mom's Room\"\nmsgstr \"Camera Mamei\"\n\n#. Key:\tnotebook\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"examine Notebook\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Notebook\"\nmsgstr \"Caiet\"\n\n#. Key:\topen\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"door can be openned\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Open\"\nmsgstr \"Deschide\"\n\n#. Key:\topen_door\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Open Door\"\nmsgstr \"Deschide Ușa\"\n\n#. Key:\tpainting\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"examine Painting\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Painting\"\nmsgstr \"Pictură\"\n\n#. Key:\tpaintings\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"examine Paintings\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Paintings\"\nmsgstr \"Picturi\"\n\n#. Key:\tpass_bridge\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Pass Bridge\"\nmsgstr \"Treci Podul\"\n\n#. Key:\tpick_up\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"pick up box or carryable\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Pick Up\"\nmsgstr \"Ridică\"\n\n#. Key:\tplace_rope\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Place Rope\"\nmsgstr \"Pune Funia\"\n\n#. Key:\tprimary_strike\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"hint with control key for strike 1 of the character\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Primary Strike\"\nmsgstr \"Atac Primar\"\n\n#. Key:\tpull\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"pull a lever\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Pull\"\nmsgstr \"Trage\"\n\n#. Key:\tpull_lever\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Pull Lever\"\nmsgstr \"Trage maneta\"\n\n#. Key:\tpush\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"push a sphere shaped rock from the edge to break some stuff\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Push\"\nmsgstr \"Împinge\"\n\n#. Key:\tput_weapon_away\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"hint with control key to show how to put the weapon away\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Put Weapon Away\"\nmsgstr \"Pune Arma Deoparte\"\n\n#. Key:\tread\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"interaction hint if the character can read a scroll or book\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Read\"\nmsgstr \"Citește\"\n\n#. Key:\tread_dictionary\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Read Dictionary\"\nmsgstr \"Citește dicționarul\"\n\n#. Key:\tread_symbols\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Read Symbols\"\nmsgstr \"Citește Simbolurile\"\n\n#. Key:\trelease_keeper\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Release Keeper\"\nmsgstr \"Eliberează Deținătorul\"\n\n#. Key:\treplay_boss_fight\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"interaction hint to play a boss fight which was already won\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Replay Boss Fight\"\nmsgstr \"Repornește Lupta cu Șeful\"\n\n#. Key:\treset_portals\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"lever\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Reset Portals\"\nmsgstr \"Resetează Portalurile\"\n\n#. Key:\trest\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"rest near a checkpoint statue where character can sleep and change spells and listen to music\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Rest\"\nmsgstr \"Odihnește-te\"\n\n#. Key:\trestore\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"restore the HP\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Restore\"\nmsgstr \"Restaurează\"\n\n#. Key:\tright_lever\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"use Right Lever\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Right Lever\"\nmsgstr \"Maneta dreaptă\"\n\n#. Key:\tring_bell\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"there is a bell the character has to use to start the conversation with a merchant\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Ring the bell\"\nmsgstr \"Sună clopotul\"\n\n#. Key:\trope_can_be_placed\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"A rope could be placed here\"\nmsgstr \"O funie ar putea fi așezata aici\"\n\n#. Key:\trope_kicked\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"feedback on the kick rope action\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Rope kicked\"\nmsgstr \"Funie lovită\"\n\n#. Key:\trope_placed\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Rope placed\"\nmsgstr \"Funie așezată\"\n\n#. Key:\tsail\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"use ship for travel\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Sail\"\nmsgstr \"Navighează\"\n\n#. Key:\tsoulkeeper_released\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Soulkeeper released\"\nmsgstr \"Deținătorul Sufletului eliberat\"\n\n#. Key:\tspecial_strike\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"hint with control key for strike 2 of the character\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Special Strike\"\nmsgstr \"Atac special\"\n\n#. Key:\tstairs\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"enter stairs\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Stairs\"\nmsgstr \"Scări\"\n\n#. Key:\tstone_added\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"{0} is the stone amount, {1} is the stone name\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"{0} {1} added to your bag!\"\nmsgstr \"{0} {1} adăugat în geantă!\"\n\n#. Key:\tstone_cant_carry\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"{0} is the stone name\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"You can't carry more {0}\"\nmsgstr \"Nu poți transporta mai multe {0}\"\n\n#. Key:\tstone_cant_store\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"{0} is the stone name\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"You don't have anything you could use to store {0}\"\nmsgstr \"Nu ai nimic care ai putea folosi pentru a stoca {0}\"\n\n#. Key:\tswing\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"Swings on the pole with the arms\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Swing\"\nmsgstr \"Balansează\"\n\n#. Key:\tswitch_interact\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"Switch interact alternative,  between the two modes\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Switch\"\nmsgstr \"Întrerupător\"\n\n#. Key:\ttake\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"character can take an item\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Take\"\nmsgstr \"Ia\"\n\n#. Key:\ttake_a_seat\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Take a seat\"\nmsgstr \"Ia un loc\"\n\n#. Key:\ttake_abacus\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Take Abacus\"\nmsgstr \"Ia Abacus\"\n\n#. Key:\ttake_all\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Take All\"\nmsgstr \"Ia Totul\"\n\n#. Key:\ttake_axe\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"character can take a weapon\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Take Axe\"\nmsgstr \"Ia Topor\"\n\n#. Key:\ttake_blades\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"character can take two swords to go dual wield\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Take Blades\"\nmsgstr \"Ia Săbile\"\n\n#. Key:\ttake_books\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"character can take (two) books\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Take Books\"\nmsgstr \"Ia Cărți\"\n\n#. Key:\ttake_mace\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"character can take a weapon\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Take Mace\"\nmsgstr \"Ia Buzdugan\"\n\n#. Key:\ttake_mushrooms\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Take Mushrooms\"\nmsgstr \"Ia Ciuperci\"\n\n#. Key:\ttake_rope\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Take Rope\"\nmsgstr \"Ia Funia\"\n\n#. Key:\ttake_sabre\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"character can take a weapon\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Take Sabre\"\nmsgstr \"Ia Paloș\"\n\n#. Key:\ttake_spellcaster\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"the Spellcaster is an amulet the character can use to cast spells\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Take Spellcaster\"\nmsgstr \"Ia articolul de vrăji\"\n\n#. Key:\ttake_stones\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Take Stones\"\nmsgstr \"Ia Pietrele\"\n\n#. Key:\ttake_sword\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"character can take a weapon\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Take Sword\"\nmsgstr \"Ia Sabia\"\n\n#. Key:\ttake_wheel\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Take Wheel\"\nmsgstr \"Ia Roata\"\n\n#. Key:\ttalk\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Talk\"\nmsgstr \"Vorbește\"\n\n#. Key:\ttoggle_switch\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"it is a lightswitch\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Toggle Switch\"\nmsgstr \"Comută\"\n\n#. Key:\ttouch_statue\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Touch Statue\"\nmsgstr \"Atinge Statuia\"\n\n#. Key:\ttravel\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"travel on the train station path\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Travel\"\nmsgstr \"Călătorește\"\n\n#. Key:\tunlocked_with\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"{0} is the key name\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Unlocked with {0}\"\nmsgstr \"Deblocat cu {0}\"\n\n#. Key:\tuse\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"use device in EndFinal level\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Use\"\nmsgstr \"Utilizează\"\n\n#. Key:\tuse_active_item\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"uses the active item\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Use Active Item\"\nmsgstr \"Utilizează Articolul Activ\"\n\n#. Key:\tuse_crystal\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Use Crystal\"\nmsgstr \"Utilizează Cristal\"\n\n#. Key:\tuse_destroy_explained\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Destroy the device to save the creatures of Ruined Realm\"\nmsgstr \"Distruge dispozitivul pentru a salva creaturile ale Tărâmului Ruinat\"\n\n#. Key:\tuse_device\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Use Device\"\nmsgstr \"Utilizează Dispozitiv\"\n\n#. Key:\tuse_elevator\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Use Elevator\"\nmsgstr \"Utilizează Liftul\"\n\n#. Key:\tuse_elevator_gem\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Use Elevator Gem\"\nmsgstr \"Utilizează Liftul Bijuteriei\"\n\n#. Key:\tuse_magic_mirror\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Use Magic Mirror\"\nmsgstr \"Utilizează Oglinda Magică\"\n\n#. Key:\tuse_separate_explained\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Use the device to separate the Realms\"\nmsgstr \"Folosește dispozitivul pentru a separa tărâmurile\"\n\n#. Key:\tuse_switch\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"for the moria gate\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Use switch\"\nmsgstr \"Utilizează Comutatorul\"\n\n#. Key:\tuse_workshop\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Use Workshop\"\nmsgstr \"Utilizează Atelierul\"\n\n#. Key:\twheel_release\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"release lever wheel\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Release\"\nmsgstr \"Eliberează\"\n\n#. Key:\twheel_turn\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"turn lever wheel\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Turn\"\nmsgstr \"Întoarce\"\n\n#. Key:\twindow\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"examine Window\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Window\"\nmsgstr \"Fereastră\"\n\n#. Key:\tworkroom\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"examine/enter Workroom\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Workroom\"\nmsgstr \"Atelier\"\n\n#. Key:\tyou_are_worthy\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"gate golem tutorial level message interaction\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"You are not worthy!\"\nmsgstr \"Nu ești vrednic!\"\n\n#. Key:\tice_stone_Name\n#. SourceLocation:\tLocalization/StringTables/Items.csv\n#: Localization/StringTables/Items.csv\nmsgctxt \"Items\"\nmsgid \"Ice Stone\"\nmsgstr \"Piatra de Gheață\"\n\n#. Key:\ttest_stone_name\n#. SourceLocation:\tLocalization/StringTables/Items.csv\n#: Localization/StringTables/Items.csv\nmsgctxt \"Items\"\nmsgid \"Test Stone\"\nmsgstr \"Piatra de Încercare\"\n\n#. Key:\tbook\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:494\n#: Source/SOrb/Basic/SoGameSingleton.cpp:494\nmsgctxt \"ItemsCommon\"\nmsgid \"Something to read\"\nmsgstr \"Ceva de citit\"\n\n#. Key:\tcooldown\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:501\n#: Source/SOrb/Basic/SoGameSingleton.cpp:501\nmsgctxt \"ItemsCommon\"\nmsgid \"Cooldown\"\nmsgstr \"Viteza de reîncărcare\"\n\n#. Key:\tcrossbow\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:487\n#: Source/SOrb/Basic/SoGameSingleton.cpp:487\nmsgctxt \"ItemsCommon\"\nmsgid \"Something to shoot with\"\nmsgstr \"Ceva cu care să tragi\"\n\n#. Key:\tdefensive\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:472\n#: Source/SOrb/Basic/SoGameSingleton.cpp:472\nmsgctxt \"ItemsCommon\"\nmsgid \"Shard of Protection\"\nmsgstr \"Ciob de Protecție\"\n\n#. Key:\tdualwield\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:480\n#: Source/SOrb/Basic/SoGameSingleton.cpp:480\nmsgctxt \"ItemsCommon\"\nmsgid \"Dual Wield Weapon\"\nmsgstr \"Armă Dublă\"\n\n#. Key:\thealth\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:498\n#: Source/SOrb/Basic/SoGameSingleton.cpp:498\nmsgctxt \"ItemsCommon\"\nmsgid \"Health\"\nmsgstr \"Viață\"\n\n#. Key:\tinvalid_shard_max\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:475\n#: Source/SOrb/Basic/SoGameSingleton.cpp:475\nmsgctxt \"ItemsCommon\"\nmsgid \"Invalid\"\nmsgstr \"Invalid\"\n\n#. Key:\tinvalid_weapon_max\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:481\n#: Source/SOrb/Basic/SoGameSingleton.cpp:481\nmsgctxt \"ItemsCommon\"\nmsgid \"Invalid Weapon\"\nmsgstr \"Armă Nevalidă\"\n\n#. Key:\titem\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:492\n#. Key:\tkeylikeitem\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:491\n#: Source/SOrb/Basic/SoGameSingleton.cpp:491\n#: Source/SOrb/Basic/SoGameSingleton.cpp:492\nmsgctxt \"ItemsCommon\"\nmsgid \"Something interesting\"\nmsgstr \"Ceva interesant\"\n\n#. Key:\tjewelry\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:469\n#: Source/SOrb/Basic/SoGameSingleton.cpp:469\nmsgctxt \"ItemsCommon\"\nmsgid \"Valuable\"\nmsgstr \"Valoros\"\n\n#. Key:\tkey\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:466\n#: Source/SOrb/Basic/SoGameSingleton.cpp:466\nmsgctxt \"ItemsCommon\"\nmsgid \"Key\"\nmsgstr \"Cheie\"\n\n#. Key:\tMemoryStone\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:465\n#: Source/SOrb/Basic/SoGameSingleton.cpp:465\nmsgctxt \"ItemsCommon\"\nmsgid \"Memory Stone\"\nmsgstr \"Piatra Memoriei\"\n\n#. Key:\toffensive\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:473\n#: Source/SOrb/Basic/SoGameSingleton.cpp:473\nmsgctxt \"ItemsCommon\"\nmsgid \"Shard of Justice\"\nmsgstr \"Ciobul de Sticlă al Justiției\"\n\n#. Key:\tonehanded\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:478\n#: Source/SOrb/Basic/SoGameSingleton.cpp:478\nmsgctxt \"ItemsCommon\"\nmsgid \"One-Handed Weapon\"\nmsgstr \"Arma pentru o singură Mână\"\n\n#. Key:\tpotion\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:484\n#: Source/SOrb/Basic/SoGameSingleton.cpp:484\nmsgctxt \"ItemsCommon\"\nmsgid \"Something to drink\"\nmsgstr \"Ceva de băut\"\n\n#. Key:\tQuestItem\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:464\n#: Source/SOrb/Basic/SoGameSingleton.cpp:464\nmsgctxt \"ItemsCommon\"\nmsgid \"Quest Item\"\nmsgstr \"Articol pentru misiune\"\n\n#. Key:\tRuneStone\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:467\n#: Source/SOrb/Basic/SoGameSingleton.cpp:467\nmsgctxt \"ItemsCommon\"\nmsgid \"Runestone\"\nmsgstr \"Runestone\"\n\n#. Key:\tshard\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:462\n#: Source/SOrb/Basic/SoGameSingleton.cpp:462\nmsgctxt \"ItemsCommon\"\nmsgid \"Shard\"\nmsgstr \"Ciob de sticlă\"\n\n#. Key:\tsomething_unlock\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:490\n#: Source/SOrb/Basic/SoGameSingleton.cpp:490\nmsgctxt \"ItemsCommon\"\nmsgid \"Something to unlock with\"\nmsgstr \"Ceva cu care să deblochezi\"\n\n#. Key:\tspecial\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:474\n#: Source/SOrb/Basic/SoGameSingleton.cpp:474\nmsgctxt \"ItemsCommon\"\nmsgid \"Shard of Wonder\"\nmsgstr \"Ciobul Miraculos\"\n\n#. Key:\tspeed\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:497\n#: Source/SOrb/Basic/SoGameSingleton.cpp:497\nmsgctxt \"ItemsCommon\"\nmsgid \"Attack Speed\"\nmsgstr \"Viteza de atac\"\n\n#. Key:\tspell\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:486\n#: Source/SOrb/Basic/SoGameSingleton.cpp:486\nmsgctxt \"ItemsCommon\"\nmsgid \"Something to cast with\"\nmsgstr \"Ceva cu care faci vrăji\"\n\n#. Key:\tspellcapacitycost\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:499\n#: Source/SOrb/Basic/SoGameSingleton.cpp:499\nmsgctxt \"ItemsCommon\"\nmsgid \"Capacity Cost\"\nmsgstr \"Costul capacității\"\n\n#. Key:\tspellusagecount\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:500\n#: Source/SOrb/Basic/SoGameSingleton.cpp:500\nmsgctxt \"ItemsCommon\"\nmsgid \"Charge\"\nmsgstr \"Încărca\"\n\n#. Key:\tthrowable\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:485\n#: Source/SOrb/Basic/SoGameSingleton.cpp:485\nmsgctxt \"ItemsCommon\"\nmsgid \"Something to throw\"\nmsgstr \"Ceva de aruncat\"\n\n#. Key:\ttwohanded\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:479\n#: Source/SOrb/Basic/SoGameSingleton.cpp:479\nmsgctxt \"ItemsCommon\"\nmsgid \"Two-Handed Weapon\"\nmsgstr \"Armă pentru două mâini\"\n\n#. Key:\tusable\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:463\n#: Source/SOrb/Basic/SoGameSingleton.cpp:463\nmsgctxt \"ItemsCommon\"\nmsgid \"Usable\"\nmsgstr \"Utilizabil\"\n\n#. Key:\tweapon\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:468\n#: Source/SOrb/Basic/SoGameSingleton.cpp:468\nmsgctxt \"ItemsCommon\"\nmsgid \"Weapon\"\nmsgstr \"Armă\"\n\n#. Key:\tmus1_combat_1_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(6).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(6).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Disfunctional Golems\"\nmsgstr \"Golemi disfuncționali\"\n\n#. Key:\tmus1_combat_2_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(16).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(16).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Machine Rage\"\nmsgstr \"Furia mașinei\"\n\n#. Key:\tmus1_combat_GateKeeper_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(2).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(2).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Worthy\"\nmsgstr \"Vrednic\"\n\n#. Key:\tmus1_dlg_Generic_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(7).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(7).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Unexpected Friend\"\nmsgstr \"Prieten Neașteptat\"\n\n#. Key:\tmus1_dlg_Golem_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(9).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(9).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Duty\"\nmsgstr \"Datorie\"\n\n#. Key:\tmus1_dlg_Lory_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(8).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(8).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"The other Bell\"\nmsgstr \"Celălalt Clopot\"\n\n#. Key:\tmus1_dlg_Monk_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(10).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(10).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Enlightened Mind\"\nmsgstr \"Minte Iluminată\"\n\n#. Key:\tmus1_dlg_Raven_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(11).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(11).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Winged Wisdom\"\nmsgstr \"Înțelepciunea cu Aripi\"\n\n#. Key:\tmus1_dlg_SewerCreature_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(32).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(32).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Pipe Walkers\"\nmsgstr \"Pietoni de pe Țeavă\"\n\n#. Key:\tmus1_dlg_Teachy_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(12).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(12).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Just a bit crazy\"\nmsgstr \"Doar un pic nebun\"\n\n#. Key:\tmus1_env_AncientArcade_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(1).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(1).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Remnant Colors\"\nmsgstr \"Culori rămase\"\n\n#. Key:\tmus1_env_GreyGate_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(5).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(5).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Touch of Ruin\"\nmsgstr \"Atingerea Ruinei\"\n\n#. Key:\tmus1_env_SecondArcade_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(17).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(17).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"In Memoriam\"\nmsgstr \"În memoria\"\n\n#. Key:\tmus1_env_TutorialLevel_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(3).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(3).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Sunken Sewer\"\nmsgstr \"Canalizare scufundată\"\n\n#. Key:\tmus2_combat_catacombs_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(18).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(18).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Armours of the Deep\"\nmsgstr \"Armuri ale adâncului\"\n\n#. Key:\tmus2_combat_DwarvenBoss_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(19).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(19).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"I hold it back\"\nmsgstr \"O rețin\"\n\n#. Key:\tmus2_combat_LavaBoss_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(20).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(20).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Meant to be Perfect\"\nmsgstr \"Înseamnă să fii perfect\"\n\n#. Key:\tmus2_combat_WrackedWaterpath_2_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(22).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(22).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Wracked Warriors\"\nmsgstr \"Războinicii înfocați\"\n\n#. Key:\tmus2_combat_WrackedWaterpath_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(21).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(21).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Those who survived\"\nmsgstr \"Cei care au supraviețuit\"\n\n#. Key:\tmus2_combat_WWBoss_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(23).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(23).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"No price too high\"\nmsgstr \"Nici un preț prea mare\"\n\n#. Key:\tmus2_dlg_Gnory_Fishy_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(33).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(33).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Intelligence and Wisdom\"\nmsgstr \"Inteligența și Înțelepciune\"\n\n#. Key:\tmus2_dlg_GolemMaker_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(34).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(34).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Lost Memories\"\nmsgstr \"Amintiri pierdute\"\n\n#. Key:\tmus2_dlg_MerchAnt_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(35).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(35).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Small but Tiny\"\nmsgstr \"Mic, dar minuscul\"\n\n#. Key:\tmus2_dlg_SupperDwarf_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(36).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(36).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Supper time\"\nmsgstr \"Ora de cină\"\n\n#. Key:\tmus2_env_Catacombs_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(24).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(24).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Dwarven Catacombs\"\nmsgstr \"Catacombele piticilor\"\n\n#. Key:\tmus2_env_CrossroadCave_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(25).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(25).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Railway Station\"\nmsgstr \"Gară\"\n\n#. Key:\tmus2_env_DwarvenGate_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(26).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(26).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Sanctuary of Law\"\nmsgstr \"Sanctuarul Justiției\"\n\n#. Key:\tmus2_env_DwarvenOutpost_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(27).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(27).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Where the rail leads\"\nmsgstr \"Unde conduce șina\"\n\n#. Key:\tmus2_env_Kobold_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(15).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(15).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Last of his Tribe\"\nmsgstr \"Ultimul din tribul lui\"\n\n#. Key:\tmus2_env_LavaDeep_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(28).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(28).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Temple for the Ancestors\"\nmsgstr \"Templul strămoșilor\"\n\n#. Key:\tmus2_env_LavaEntrance_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(29).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(29).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Pilgrim Road\"\nmsgstr \"Drumul pelerinilor\"\n\n#. Key:\tmus2_env_WrackedWaterpath_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(30).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(30).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Quick and Clever\"\nmsgstr \"Rapid și Inteligent\"\n\n#. Key:\tmus3_combat_Bubble_Ground_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(14).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(14).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Infected Golems\"\nmsgstr \"Golemi Infectați\"\n\n#. Key:\tmus3_env_BubbleGround_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(38).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(38).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"So close yet so far\"\nmsgstr \"Atât de aproape dar atât de departe\"\n\n#. Key:\tmus3_env_CaveHouse_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(39).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(39).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Last Shalter\"\nmsgstr \"Ultimul Adăpost\"\n\n#. Key:\tmus3_env_PipePuzzle_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(40).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(40).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Moving Pipes\"\nmsgstr \"Țevi în mișcare\"\n\n#. Key:\tmus3_env_Raven_Puzzle_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(41).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(41).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"One would fail\"\nmsgstr \"Unul ar eșua\"\n\n#. Key:\tmus3_env_RuinedRealm_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(42).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(42).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"The end, really\"\nmsgstr \"Finalul, într-adevăr\"\n\n#. Key:\tmus_chase_theme_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(4).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(4).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Jump for your life!\"\nmsgstr \"Sari pentru viața ta!\"\n\n#. Key:\tmus_cm_WhiteWall_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(13).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(13).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Decaying City\"\nmsgstr \"Orașul în declin\"\n\n#. Key:\tmus_ending_dlg_UnknownWizard_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(37).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(37).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"All is lost\"\nmsgstr \"Totul este pierdut\"\n\n#. Key:\tmus_main_theme_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(0).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(0).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Spirit of the Unknown\"\nmsgstr \"Spiritul Necunoscutului\"\n\n#. Key:\tmus_waterpath_alter_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(43).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(43).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Stories never end\"\nmsgstr \"Poveștile nu se termină niciodată\"\n\n#. Key:\tblocked\n#. SourceLocation:\tLocalization/StringTables/Spells.csv\n#. InfoMetaData:\t\"Comment\" : \" displayed as floating test ingame when a certain enemy blocks certain attacks\"\n#: Localization/StringTables/Spells.csv\nmsgctxt \"Spells\"\nmsgid \"Blocked\"\nmsgstr \"Blocat\"\n\n#. Key:\tcant_use_in_air\n#. SourceLocation:\tLocalization/StringTables/Spells.csv\n#. InfoMetaData:\t\"Comment\" : \" displayed as floating test ingame when the character tries to use a spell in air which can not be used there\"\n#: Localization/StringTables/Spells.csv\nmsgctxt \"Spells\"\nmsgid \"Can't in air\"\nmsgstr \"Nu poți în aer\"\n\n#. Key:\tcant_use_sk_free_zone\n#. SourceLocation:\tLocalization/StringTables/Spells.csv\n#. InfoMetaData:\t\"Comment\" : \" displayed as floating test ingame when character tries to use the respawn point spell on a location when it is not allowed\"\n#: Localization/StringTables/Spells.csv\nmsgctxt \"Spells\"\nmsgid \"Dangerous Location\"\nmsgstr \"Locație periculoasă\"\n\n#. Key:\thp_gained\n#. SourceLocation:\tLocalization/StringTables/Spells.csv\n#. InfoMetaData:\t\"Comment\" : \" displayed as floating test ingame when the character increases his max health\"\n#: Localization/StringTables/Spells.csv\nmsgctxt \"Spells\"\nmsgid \"Health Increased!\"\nmsgstr \"Viață crescută!\"\n\n#. Key:\timmune\n#. SourceLocation:\tLocalization/StringTables/Spells.csv\n#. InfoMetaData:\t\"Comment\" : \"displayed as floating text ingame if enemy is immune to a spell or damage type\"\n#: Localization/StringTables/Spells.csv\nmsgctxt \"Spells\"\nmsgid \"Immune\"\nmsgstr \"Imun\"\n\n#. Key:\tinfected\n#. SourceLocation:\tLocalization/StringTables/Spells.csv\n#. InfoMetaData:\t\"Comment\" : \" displayed as floating test ingame when dmg over time effect is applied on enemy\"\n#: Localization/StringTables/Spells.csv\nmsgctxt \"Spells\"\nmsgid \"Infected\"\nmsgstr \"Infectat\"\n\n#. Key:\tinstant_recharge\n#. SourceLocation:\tLocalization/StringTables/Spells.csv\n#. InfoMetaData:\t\"Comment\" : \" displayed as floating test ingame when a spell can be used again without waiting for the cooldown time\"\n#: Localization/StringTables/Spells.csv\nmsgctxt \"Spells\"\nmsgid \"Instant Recharge\"\nmsgstr \"Reîncărcare imediată\"\n\n#. Key:\tmissing_target\n#. SourceLocation:\tLocalization/StringTables/Spells.csv\n#. InfoMetaData:\t\"Comment\" : \" displayed as floating test ingame when the character tries to use a spell which requires a target but there is none in range\"\n#: Localization/StringTables/Spells.csv\nmsgctxt \"Spells\"\nmsgid \"Who? Where? What?!\"\nmsgstr \"Cine? Unde? Ce?!\"\n\n#. Key:\tno_need_for_heal\n#. SourceLocation:\tLocalization/StringTables/Spells.csv\n#. InfoMetaData:\t\"Comment\" : \" displayed as floating test ingame when the character tries to use heal spell but has max health already\"\n#: Localization/StringTables/Spells.csv\nmsgctxt \"Spells\"\nmsgid \"No need\"\nmsgstr \"Nu este nevoie\"\n\n#. Key:\tresisted\n#. SourceLocation:\tLocalization/StringTables/Spells.csv\n#. InfoMetaData:\t\"Comment\" : \"displayed as floating text ingame if enemy has a chance to avoid an effect and he is lucky\"\n#: Localization/StringTables/Spells.csv\nmsgctxt \"Spells\"\nmsgid \"Resisted\"\nmsgstr \"Rezistat\"\n\n#. Key:\tsecond_chance\n#. SourceLocation:\tLocalization/StringTables/Spells.csv\n#. InfoMetaData:\t\"Comment\" : \" displayed as floating test ingame if char has the effect on and dies and respawns because the effect saves him\"\n#: Localization/StringTables/Spells.csv\nmsgctxt \"Spells\"\nmsgid \"Second Chance\"\nmsgstr \"A doua șansă\"\n\n#. Key:\tspell_capacity_gained\n#. SourceLocation:\tLocalization/StringTables/Spells.csv\n#. InfoMetaData:\t\"Comment\" : \" displayed as floating test ingame when the character increases his spellpower\"\n#: Localization/StringTables/Spells.csv\nmsgctxt \"Spells\"\nmsgid \"Spellpower Increased!\"\nmsgstr \"Puterea de vrajă a crescut!\"\n\n#. Key:\tspell_regained\n#. SourceLocation:\tLocalization/StringTables/Spells.csv\n#. InfoMetaData:\t\"Comment\" : \" displayed as floating test ingame when the character regains a spell (can cast again)\"\n#: Localization/StringTables/Spells.csv\nmsgctxt \"Spells\"\nmsgid \"Spell Charge Regained!\"\nmsgstr \"Sarcina de vrajă recâștigată!\"\n\n#. Key:\tacknowledge\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Button\"\n#. Key:\tgroup_defeated_ack\n#. InfoMetaData:\t\"Comment\" : \"the hotkey to close the group defeated panel\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Acknowledge\"\nmsgstr \"Confirmă\"\n\n#. Key:\tback\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Button\"\n#. Key:\tpanel_command_inv_back\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Back\"\nmsgstr \"Înapoi\"\n\n#. Key:\tblack_fade_teleport_text_1\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Now I remember the night when it started...\"\nmsgstr \"Acum îmi amintesc de noaptea când a început...\"\n\n#. Key:\tbubble_float\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"bubble tip for the char to float\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Float\"\nmsgstr \"Plutește\"\n\n#. Key:\tbubble_jump\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"bubble tip for the char to jump\"\n#. Key:\tinput_jump\n#. InfoMetaData:\t\"Comment\" : \"Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Jump\"\nmsgstr \"Sari\"\n\n#. Key:\tbuy\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"buy item\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Buy\"\nmsgstr \"Cumpără\"\n\n#. Key:\tbuy_back\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"buy back item\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Buy Back\"\nmsgstr \"Cumpără Înapoi\"\n\n#. Key:\tbuy_on_steam_and_follow\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Buy WarriOrb in Steam and follow us on social media:\"\nmsgstr \"Cumpară WarriOrb pe Steam și urmăreștene pe rețelele de socializare:\"\n\n#. Key:\tcancel\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Confirm popup\"\n#. Key:\tsettings_cancel\n#. InfoMetaData:\t\"Comment\" : \"Settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Cancel\"\nmsgstr \"Anulează\"\n\n#. Key:\tchange_user\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Change User\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Change User\"\nmsgstr \"Schimbă utilizatorul\"\n\n#. Key:\tchapter\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Stats for saves\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Chapter\"\nmsgstr \"Capitol\"\n\n#. Key:\tchapter1_completed\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Temporary for chapter 1\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Chapter 1 completed. Save is Locked.\"\nmsgstr \"Capitolul 1 completat. Salvarea este blocat.\"\n\n#. Key:\tcharacter_skin_classic\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"name of the original character skin\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Classic\"\nmsgstr \"Clasic\"\n\n#. Key:\tcharacter_skin_desc\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"description for the character skin option\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Changes the visuals of the player character\"\nmsgstr \"Modifică înfățișarea caracterului\"\n\n#. Key:\tcharacter_skin_mummy\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"name of the alternative character skin\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Mummy\"\nmsgstr \"Mumie\"\n\n#. Key:\tcharacter_skin_pumpkin\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"name of the alternative character skin\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Pumpkin\"\nmsgstr \"Dovleac\"\n\n#. Key:\tcharacter_skin_title\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"option to change character skin\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Character Skin\"\nmsgstr \"Înfățișarea Caracterului\"\n\n#. Key:\tcheckpoint\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Stats for saves\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Checkpoint\"\nmsgstr \"Punct de Control\"\n\n#. Key:\tchest_examine\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Examine\"\nmsgstr \"Examinează\"\n\n#. Key:\tchest_leave\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Leave\"\nmsgstr \"Ieși\"\n\n#. Key:\tchest_loot\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"hotkey tip on chest\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Loot\"\nmsgstr \"Jefuiește\"\n\n#. Key:\tclose\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"close book\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Close\"\nmsgstr \"Închide\"\n\n#. Key:\tcompleted_in_time\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Custom Map\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Completed in {time}\"\nmsgstr \"Terminat în {time}\"\n\n#. Key:\tconfirm\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Confirm popup\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Confirm\"\nmsgstr \"Confirmă\"\n\n#. Key:\tconfirm_keyboard_settings_reset\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Confirm keyboard settings\"\n#. Key:\tdifficulty_confirm_question\n#. InfoMetaData:\t\"Comment\" : \"Confirm difficulty selected popup\"\n#. Key:\tsave_slots_remove_confirm\n#. InfoMetaData:\t\"Comment\" : \"remove save slot confirm dialogue\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Are you sure?\"\nmsgstr \"Ești sigur?\"\n\n#. Key:\tconsole_ps4\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"PlayStation 4\"\nmsgstr \"PlayStation 4\"\n\n#. Key:\tconsole_switch\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Switch\"\nmsgstr \"Switch\"\n\n#. Key:\tconsole_xbox_one\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"XBox One\"\nmsgstr \"XBox One\"\n\n#. Key:\tcontinue\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Menu Continue\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Continue\"\nmsgstr \"Continuă\"\n\n#. Key:\tcontroller_recommended\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Main Menu\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Note: Playing with a controller is recommended\"\nmsgstr \"Notă: Jucarea cu un controler este recomandată\"\n\n#. Key:\tcredits\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Menu credits\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Credits\"\nmsgstr \"Credite\"\n\n#. Key:\tcustom_map_x\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Custom Map\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Custom Map {0}\"\nmsgstr \"Hartă personalizată {0}\"\n\n#. Key:\tcustom_maps\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Menu custom Maps\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Custom Maps\"\nmsgstr \"Hărți personalizate\"\n\n#. Key:\tdescription\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Of something\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Description\"\nmsgstr \"Descriere\"\n\n#. Key:\tdifficulty\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Stats for saves\"\n#. Key:\tdifficulty_title\n#. InfoMetaData:\t\"Comment\" : \"title of difficulty selection\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Difficulty\"\nmsgstr \"Dificultate\"\n\n#. Key:\tdifficulty_confirm_subtext\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Confirm difficulty selected popup subtext\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"This choice is permanent\"\nmsgstr \"Alegerea este permanentă\"\n\n#. Key:\tdifficulty_desc_insane\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"description of hard difficulty\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"- The <Blue>SoulKeeper</> (Portable Checkpoint) spell is removed from the game\\n- Increased incoming damage\\n- Increased Enemy Health\"\nmsgstr \"- <Blue>Deținătorul Sufletului</> (Punctul de control portabil) vraja este eliminată din joc\\n- Creșterea daunelor primite\\n- Viața sporită a inamicului\"\n\n#. Key:\tdifficulty_desc_intended\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"description of normal difficulty\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"The way the game is meant to be played\"\nmsgstr \"Modul în care jocul este menit să fie jucat\"\n\n#. Key:\tdifficulty_desc_sane\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"description of easy difficulty\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"- Infinite <Blue>SoulKeeper</> (Checkpoint) spell charges\\n- No health penalty when respawning near the <Blue>SoulKeeper</>\\n- Decreased incoming damage\\n- Decreased Enemy Health\"\nmsgstr \"- Număr Infinit de <Blue>Deținătorul Sufletului</> (Punctul de control) încărcări de vrajă \\n- Fără penalități de viață atunci când se regenerează în apropierea <Blue>Deținătorul Sufletului</>\\n- Diminuarea daunelor primite\\n- Scăderea vieții inamicului\"\n\n#. Key:\tdifficulty_insane\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"name of hard difficulty\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"As hard as it can get\"\nmsgstr \"Nebun\"\n\n#. Key:\tdifficulty_intended\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"name of normal difficulty\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"A true challenge\"\nmsgstr \"Normal\"\n\n#. Key:\tdifficulty_normal\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Normal\"\nmsgstr \"Normal\"\n\n#. Key:\tdifficulty_sane\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"name of easy difficulty\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Just an adventure\"\nmsgstr \"Ușor\"\n\n#. Key:\tdisabled\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Widget is disabled\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Disabled\"\nmsgstr \"Invalid\"\n\n#. Key:\tdiscord\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Discord\"\nmsgstr \"Discord\"\n\n#. Key:\tdrm_defeatead_description\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"check only in pirated copies \"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"We suspect that you play a pirated copy of the game.\\nIt's fine. We hope you will enjoy it!\\n\\nIf you like the game, please tell your friends about it, and maybe even consider buying it.\\n\\nWe would love to keep making games!\"\nmsgstr \"Bănuim că joci o copie piratată a jocului.\\nEste ok. Sperăm că îți va place!\\n\\nDacă vă place jocul, vă rugăm să spuneți prietenilor despre el, și poate chiar să luați în considerare cumpărarea acestuia.\\n\\nNe-ar plăcea să continuăm să facem jocuri in continuare!\"\n\n#. Key:\tdrm_defeatead_title\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"check only in pirated copies \"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"WarriOrb DRM\"\nmsgstr \"WarriOrb DRM\"\n\n#. Key:\tdwarf_language\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Dwarf language\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Dwarf\"\nmsgstr \"Pitic\"\n\n#. Key:\tempty\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Empty\"\nmsgstr \"Gol\"\n\n#. Key:\tempty_line\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"-\"\nmsgstr \"-\"\n\n#. Key:\tencourage_line1\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Before Main Menu\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"The path ahead is challenging. Do not despise failure. Every wrong attempt discarded is another step forward.\"\nmsgstr \"Calea din față este o provocare. Nu disprețuii eșecul. Orice încercare greșită este un pas înainte.\"\n\n#. Key:\tessence\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"essence represents the Health of the character\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Essence\"\nmsgstr \"Esență\"\n\n#. Key:\tfeedback\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Discord external button\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Feedback\"\nmsgstr \"Păreri\"\n\n#. Key:\tgame_defeated\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"end screen\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Game Defeated!\"\nmsgstr \"Joc Învins!\"\n\n#. Key:\tgame_is_wip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Main Menu\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Game currently under development\"\nmsgstr \"Jocul este în curs de dezvoltare\"\n\n#. Key:\tgame_over_retreat\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"control tip which is only visible in boss areas where the player can either restart the fight or retreat from the place\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Retreat\"\nmsgstr \"Retragete\"\n\n#. Key:\tgame_over_retry\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"control tip which is always visible on game over\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Retry\"\nmsgstr \"Reîncearcă\"\n\n#. Key:\tgamepad_special_left_xbox\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"xbox view button\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"View button\"\nmsgstr \"Butonul View\"\n\n#. Key:\tgamepad_special_right_xbox\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"xbox Menu button\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Menu button\"\nmsgstr \"Butonul Meniu\"\n\n#. Key:\tgo_back_to_menu\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Go back to main menu\"\nmsgstr \"Reveniți la meniul principal\"\n\n#. Key:\tgold_x\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"{x} is the gold amount\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"+{x} GOLD\"\nmsgstr \"+{x} AUR\"\n\n#. Key:\tgroup_defeated_title\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"title of the group defeated panel\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Group Defeated\"\nmsgstr \"Grup Învins\"\n\n#. Key:\tinput_action_back\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"UI Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"UI Action Back\"\nmsgstr \"UI Acțiunea de înapoi\"\n\n#. Key:\tinput_action_first\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"UI Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"UI Action First\"\nmsgstr \"UI Prima acțiune\"\n\n#. Key:\tinput_action_second\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"UI Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"UI Action Second\"\nmsgstr \"UI Acțiunea a doua\"\n\n#. Key:\tinput_action_third\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"UI Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"UI Action Third\"\nmsgstr \"UI Acțiunea a treia\"\n\n#. Key:\tinput_actions_conflicts\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input remap.  {Key} = key display name. {NumAction} the number of actions, this will determine what to choose between one and other.\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Selected button = {Key}, will get unbound from the {NumActions}|plural(one=Action,other=Actions) = {ActionNames}\"\nmsgstr \"Butonul selectat = {Key}, o să fie îndepărtată de la {NumActions}|plural(one=Acțiunea,other=Acțiunile) = {ActionNames}\"\n\n#. Key:\tinput_alt_interact\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Interact Alternative\"\nmsgstr \"Interacționează alternativ\"\n\n#. Key:\tinput_change_item\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input Action Name\"\n#. Key:\tpanel_command_inv_change_item\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Change Item\"\nmsgstr \"Schimbă articolul\"\n\n#. Key:\tinput_change_spell\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Change Spell\"\nmsgstr \"Schimbă vraja\"\n\n#. Key:\tinput_change_weapon\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Change Weapon\"\nmsgstr \"Schimbă arma\"\n\n#. Key:\tinput_down\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"UI Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"UI Move Down\"\nmsgstr \"UI Mută în jos\"\n\n#. Key:\tinput_float\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Floating\"\nmsgstr \"Plutește\"\n\n#. Key:\tinput_interact\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Interact\"\nmsgstr \"Interacționează\"\n\n#. Key:\tinput_left\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Move Left\"\nmsgstr \"Mișcă-te la stânga\"\n\n#. Key:\tinput_menu_back\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"UI Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Open Menu/Escape/Back\"\nmsgstr \"Deschide Meniu / Escape / Înapoi\"\n\n#. Key:\tinput_not_allowed_options_menu_button\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input remap gamepad\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Not allowed to remap to the Menu button\"\nmsgstr \"Nu este permisă remaparea pe butonul Meniu\"\n\n#. Key:\tinput_not_allowed_options_menu_button_switch\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input remap gamepad\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Not allowed to remap to the + Button\"\nmsgstr \"Nu ai voie să remapezi Butonul +\"\n\n#. Key:\tinput_not_allowed_thumbsticks\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input remap gamepad\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Not allowed to remap to thumbsticks\"\nmsgstr \"Nu este permis să remapezi la thumbsticks\"\n\n#. Key:\tinput_not_allowed_thumbsticks_switch\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input remap gamepad switch\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Not allowed to remap to Left Stick or Right Stick\"\nmsgstr \"Nu este permis să remapezi la Maneta Stângă / Maneta Dreaptă\"\n\n#. Key:\tinput_open_inventory\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Open Inventory\"\nmsgstr \"Deschide Inventarul\"\n\n#. Key:\tinput_right\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Move Right\"\nmsgstr \"Mișcă-te la dreapta\"\n\n#. Key:\tinput_roll\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Roll\"\nmsgstr \"Rostogoleștete\"\n\n#. Key:\tinput_selected_key_not_allowed\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input remap. {Key} = key display name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Selected button = {Key}, is not allowed as an input option\"\nmsgstr \"Butonul selectat = {Key}, nu este permisă ca o opțiune\"\n\n#. Key:\tinput_spell_down\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"UI Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"UI Spell Down\"\nmsgstr \"UI Vrajă jos\"\n\n#. Key:\tinput_spell_left\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"UI Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"UI Spell Left\"\nmsgstr \"UI Vrajă stânga\"\n\n#. Key:\tinput_spell_right\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"UI Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"UI Spell Right\"\nmsgstr \"UI Vrajă dreapta\"\n\n#. Key:\tinput_spell_select\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"UI Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"UI Spell Select\"\nmsgstr \"UI Selectare vrajă\"\n\n#. Key:\tinput_spell_select_and_cast\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"UI Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"UI Spell Select & Cast\"\nmsgstr \"UI Selectează & Cast Vrajă\"\n\n#. Key:\tinput_spell_up\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"UI Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"UI Spell Up\"\nmsgstr \"UI Vrajă sus\"\n\n#. Key:\tinput_strike_primary\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Primary Strike\"\nmsgstr \"Atac primar\"\n\n#. Key:\tinput_strike_special\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Special Strike\"\nmsgstr \"Atac special\"\n\n#. Key:\tinput_take_weapon\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Take Weapon Away\"\nmsgstr \"Pune arma deoparte\"\n\n#. Key:\tinput_top_left\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"UI Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"UI Top Left\"\nmsgstr \"UI Stânga sus\"\n\n#. Key:\tinput_top_right\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"UI Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"UI Top Right\"\nmsgstr \"UI Sus în dreapta\"\n\n#. Key:\tinput_unbound\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Unbound input\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Unbound\"\nmsgstr \"Nefolosit\"\n\n#. Key:\tinput_up\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"UI Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"UI Move Up\"\nmsgstr \"UI Mută în sus\"\n\n#. Key:\tinput_use_item\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Use Item\"\nmsgstr \"Folosește obiectul\"\n\n#. Key:\tinventory_item_amount\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"the item amount displayed in inventory/trade panel/etc.\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Amount: {0}\"\nmsgstr \"Cantitate: {0}\"\n\n#. Key:\tinventory_item_tooltip_cooldown\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Cooldown\"\nmsgstr \"Viteza de reîncărcare\"\n\n#. Key:\tinventory_item_tooltip_damage\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"damage text on item descriptions\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Damage\"\nmsgstr \"Avarie\"\n\n#. Key:\tinventory_item_tooltip_sec\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"duration of something (e.g. cooldown)\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"{0} sec\"\nmsgstr \"{0} sec\"\n\n#. Key:\titem_equipped\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Item Tooltip\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"---Equipped---\"\nmsgstr \"---Echipat---\"\n\n#. Key:\titem_not_For_sale\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Item Tooltip\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Not for sale\"\nmsgstr \"Nu este de vânzare\"\n\n#. Key:\titem_rarity_0\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"item rarity text on the bottom of tooltips\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Better than nothing, right?\"\nmsgstr \"Mai bine decât nimic, nu?\"\n\n#. Key:\titem_rarity_1\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"item rarity text on the bottom of tooltips\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Better than nothing\"\nmsgstr \"Mai bine decât nimic\"\n\n#. Key:\titem_rarity_2\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"item rarity text on the bottom of tooltips\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Good stuff\"\nmsgstr \"Lucruri bune\"\n\n#. Key:\titem_rarity_3\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"item rarity text on the bottom of tooltips\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Pretty good stuff\"\nmsgstr \"Lucruri destul de bune\"\n\n#. Key:\titem_rarity_4\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"item rarity text on the bottom of tooltips\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Amazing stuff\"\nmsgstr \"Lucruri uimitoare\"\n\n#. Key:\tkey_selection_current\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Select Input key\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Currently selected button:\"\nmsgstr \"Butonul selectat:\"\n\n#. Key:\tkey_selection_empty\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Select Input key\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"[Empty Button]\"\nmsgstr \"[Butonul Gol]\"\n\n#. Key:\tkey_selection_press\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Select Input key\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"[Press Button]\"\nmsgstr \"[Apasă Butonul]\"\n\n#. Key:\tkey_selection_press_button\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Select Input key\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Press the button you want to assign to the action:\"\nmsgstr \"Apasă butonul pe care dorești să o atribui acțiunii:\"\n\n#. Key:\tline_three_dots\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"...\"\nmsgstr \"...\"\n\n#. Key:\tloading_screen_press_key\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Press any key to continue...\"\nmsgstr \"Apasă orice tastă pentru a continua...\"\n\n#. Key:\tloading_screen_press_key_switch\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Press any button to continue...\"\nmsgstr \"Apăsați orice buton pentru a continua ...\"\n\n#. Key:\tloading_screen_text_1\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"This is a loading screen. We wait a few seconds here to look more professional.\"\nmsgstr \"Acesta este un ecran de încărcare. Așteptăm aicea câteva secunde pentru a arăta mai professional.\"\n\n#. Key:\tmailing_list\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Mailing List\"\nmsgstr \"Listă de email-uri\"\n\n#. Key:\tnever_completed\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Custom Map\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Never completed\"\nmsgstr \"Niciodată completat\"\n\n#. Key:\tno\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Confirm popup\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"No\"\nmsgstr \"Nu\"\n\n#. Key:\tpanel_character_sheet\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Character Panel\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Character Sheet\"\nmsgstr \"Fișa caracterului\"\n\n#. Key:\tpanel_command_inv_compare\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Compare\"\nmsgstr \"Compară\"\n\n#. Key:\tpanel_command_inv_drink\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Drink\"\nmsgstr \"Bea\"\n\n#. Key:\tpanel_command_inv_equip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"control key tip in inventory\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Equip\"\nmsgstr \"Echipează\"\n\n#. Key:\tpanel_command_inv_equip_item\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Equip Item\"\nmsgstr \"Echipează articol\"\n\n#. Key:\tpanel_command_inv_equip_next\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Equip Next\"\nmsgstr \"Echipează următoarea\"\n\n#. Key:\tpanel_command_inv_read\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Read\"\nmsgstr \"Citește\"\n\n#. Key:\tpanel_command_inv_unequip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Unequip\"\nmsgstr \"Dezechipă\"\n\n#. Key:\tpanel_command_spell_add\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"add spell to equipped spells\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Add\"\nmsgstr \"Adaugă\"\n\n#. Key:\tpanel_command_spell_remove\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"remove spell from equipped spells\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Remove\"\nmsgstr \"Elimină\"\n\n#. Key:\tpanel_equipped_spells\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Spell Selection panel\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Equipped Spells\"\nmsgstr \"Vrăji echipate\"\n\n#. Key:\tpanel_inventory\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Character Panel\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Inventory\"\nmsgstr \"Inventar\"\n\n#. Key:\tpanel_notes\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Character Panel\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Sidenotes\"\nmsgstr \"Note laterale\"\n\n#. Key:\tpaneL_resistances\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Character Sheet Panel\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Resistances\"\nmsgstr \"Rezistenţele\"\n\n#. Key:\tpanel_rest_no_item\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"You don't have the necessary item to use spells!\"\nmsgstr \"Nu ai articolulul necesar pentru a utiliza vrăji!\"\n\n#. Key:\tpanel_rest_option_change_spells\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Change Spells\"\nmsgstr \"Schimbă vrăjile\"\n\n#. Key:\tpanel_rest_option_listen_to_music\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Listen to Music\"\nmsgstr \"Ascultă muzică\"\n\n#. Key:\tpanel_rest_option_sleep\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Sleep\"\nmsgstr \"Dormi\"\n\n#. Key:\tpanel_rest_option_wake_up\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Wake Up\"\nmsgstr \"Trezește-te\"\n\n#. Key:\tpanel_spell_capacity\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Spell Selection panel\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Capacity: {0}/{1}\"\nmsgstr \"Capacitate: {0}/{1}\"\n\n#. Key:\tpanel_spell_selection_denied\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Spell Selection panel\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"You can only change the equipped spells near ancient statues.\"\nmsgstr \"Poți schimba vrăjile echipate numai în apropierea statuilor antice.\"\n\n#. Key:\tpanel_spells\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Character Panel\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Spells\"\nmsgstr \"Vrăji\"\n\n#. Key:\tpercentage_argument\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Slider\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"{0}%\"\nmsgstr \"{0}%\"\n\n#. Key:\tplay_time\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Stats for saves\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Play Time\"\nmsgstr \"Timpul de joacă\"\n\n#. Key:\tprogress_saved\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Confirm Quit popup\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Progress will be saved\"\nmsgstr \"Progresul va fi salvat\"\n\n#. Key:\tprogress_saved_automatically\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Before Main Menu\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Your progress is saved automatically whenever this icon is displayed\"\nmsgstr \"Progresul este salvat automat de fiecare dată când este afișată această pictogramă\"\n\n#. Key:\tquit_game\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Menu Quit Game\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Quit Game\"\nmsgstr \"Ieși din joc\"\n\n#. Key:\tquit_game_question\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Confirm Quit popup\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Quit Game?\"\nmsgstr \"Ieși din joc?\"\n\n#. Key:\tquit_to_menu\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Menu Quit To Menu\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Quit to Menu\"\nmsgstr \"Ieși în meniul principal\"\n\n#. Key:\tquit_to_menu_question\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Confirm Quit popup\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Quit to Menu?\"\nmsgstr \"Ieși în meniul principal?\"\n\n#. Key:\treset_keyboard_arrows\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Confirm keyboard settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Reset to Arrow defaults\"\nmsgstr \"Resetează la valorile implicite săgeată\"\n\n#. Key:\treset_keyboard_wasd\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Confirm keyboard settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Reset to WASD defaults\"\nmsgstr \"Resetează la valorile prestabilite WASD\"\n\n#. Key:\trestart\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Restart the game\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Restart\"\nmsgstr \"Repornește\"\n\n#. Key:\trestart_game_question\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Confirm Restart popup\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Restart Game?\"\nmsgstr \"Repornește Jocul?\"\n\n#. Key:\trestart_game_warning\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Confirm Restart popup\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"All progress will be lost\"\nmsgstr \"Tot progresul va fi pierdut\"\n\n#. Key:\tsave_slots_clear\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"clears the save slot\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Clear\"\nmsgstr \"Golește\"\n\n#. Key:\tsave_slots_loaded\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"text on currently loaded save slot if there is any\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"- Loaded -\"\nmsgstr \"- Încărcat -\"\n\n#. Key:\tsave_slots_new_game\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"text on empty save slot\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"New Game\"\nmsgstr \"Joc Nou\"\n\n#. Key:\tsave_slots_playtime\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"playtime displayed, {0} is the hours, {1} is the minutes\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"{0} H {1} M\"\nmsgstr \"{0} H {1} M\"\n\n#. Key:\tsave_slots_playtime_short\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"playtime displayed if it did not reach an hour, {0} is the time in minutes\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"{0} M\"\nmsgstr \"{0} M\"\n\n#. Key:\tsave_slots_remove_confirm_subtext\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"remove save slot confirm dialogue\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Progress will be lost\"\nmsgstr \"Progresul va fi pierdut\"\n\n#. Key:\tsave_slots_select\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"loads the game or creates a new one using the active slot\"\n#. Key:\tselect\n#. InfoMetaData:\t\"Comment\" : \"Button\"\n#. Key:\tspell_cast_switch_select\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Select\"\nmsgstr \"Selectează\"\n\n#. Key:\tsaves\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Menu saves\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Save Slots\"\nmsgstr \"Sloturi pentru salvări\"\n\n#. Key:\tseconds\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"seconds\"\nmsgstr \"secunde\"\n\n#. Key:\tselect_spells\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input right  thumbstick\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Select spells\"\nmsgstr \"Selectează vrăji\"\n\n#. Key:\tsell\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"sell item\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Sell\"\nmsgstr \"Vinde\"\n\n#. Key:\tsend_automatically\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Analytics popup\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Send Automatically\"\nmsgstr \"Trimite automat\"\n\n#. Key:\tsend_no\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Analytics popup\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Do not Send\"\nmsgstr \"Nu Trimite\"\n\n#. Key:\tsettings\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Menu settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Settings\"\nmsgstr \"Setări\"\n\n#. Key:\tsettings_antialising\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Anti-Aliasing\"\nmsgstr \"Anti-Aliasing\"\n\n#. Key:\tsettings_antialising_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Smooths out the edges by blending the colors of the pixels around the object to create the illusion of smoothness.\"\nmsgstr \"Netezește marginile prin amestecarea culorilor pixelilor din jurul obiectului pentru a crea iluzia de netezime.\"\n\n#. Key:\tsettings_apply\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Apply\"\nmsgstr \"Aplică\"\n\n#. Key:\tsettings_aspect_ratio\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Aspect Ratio\"\nmsgstr \"Raport aspect\"\n\n#. Key:\tsettings_aspect_ratio_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Defines what aspect ratios are available for your resolution.\"\nmsgstr \"Definește ce raporturi de aspect sunt disponibile pentru rezoluția selectată.\"\n\n#. Key:\tsettings_audio\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Settings panels\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Audio\"\nmsgstr \"Audio\"\n\n#. Key:\tsettings_auto_detect_controller\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Gamepad settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Auto detect Gamepad Layout\"\nmsgstr \"Detectează automat Schema Gamepad\"\n\n#. Key:\tsettings_borderless\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Borderless\"\nmsgstr \"Fără margini\"\n\n#. Key:\tsettings_brightness\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Settings panels\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Brightness\"\nmsgstr \"Luminozitate\"\n\n#. Key:\tsettings_brightness_default_value\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Brightness settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Default Value is 100%\"\nmsgstr \"Valoarea implicită este 100%\"\n\n#. Key:\tsettings_brightness_description\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Brightness settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Please adjust the brightness of the game to your display\"\nmsgstr \"Reglați luminozitatea jocului pe ecran\"\n\n#. Key:\tsettings_collect_analytics\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Game Settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Collect Usage Statistics\"\nmsgstr \"Colectează Statistici de Utilizare\"\n\n#. Key:\tsettings_collect_analytics_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Game Settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"These are not used to identify individuals, but help us to understand players needs to improve our game.\"\nmsgstr \"Acestea nu sunt folosite pentru a identifica indivizii, ci ne ajută să înțelegem nevoile jucătorilor pentru a îmbunătăți jocul nostru.\"\n\n#. Key:\tsettings_confirm_display_title\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings confirm\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Confirm Display Settings in\"\nmsgstr \"Confirmați setările afișajului în\"\n\n#. Key:\tsettings_controller\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Settings panels\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Gamepad\"\nmsgstr \"Gamepad\"\n\n#. Key:\tsettings_controller_platform\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Gamepad Layout settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Layout\"\nmsgstr \"Schemă\"\n\n#. Key:\tsettings_controller_remap\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Gamepad settings\"\n#. Key:\tsettings_controller_remap_single\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Remap Controls\"\nmsgstr \"Remapare controale\"\n\n#. Key:\tsettings_controller_remap_noedit\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Gamepad settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Please use a gamepad in order to remap\"\nmsgstr \"Te rog să utilizezi un gamepad pentru remapare\"\n\n#. Key:\tsettings_controller_switch\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Settings panels\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Controls\"\nmsgstr \"Controale\"\n\n#. Key:\tsettings_display\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Settings panels\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Display\"\nmsgstr \"Ecran\"\n\n#. Key:\tsettings_display_damage\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Game settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Display Damage\"\nmsgstr \"Afișează daune\"\n\n#. Key:\tsettings_display_damage_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Game settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Show damage as a floating number on the screen\"\nmsgstr \"Afișați daune ca număr plutitor pe ecran\"\n\n#. Key:\tsettings_display_enemy_hp\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Game settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Display Enemy Health\"\nmsgstr \"Afișează viața inamicului\"\n\n#. Key:\tsettings_display_enemy_hp_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Game settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Show a small health bar above injured enemies\"\nmsgstr \"Afisează o mică bară de viață deasupra dușmanilor răniți\"\n\n#. Key:\tsettings_display_floating_vo\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Game settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Display Floating Voice Lines\"\nmsgstr \"Afișează liniile de voce plutitoare\"\n\n#. Key:\tsettings_display_floating_vo_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Game settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Show voice lines as floating texts\"\nmsgstr \"Afisează linii vocale ca texte plutitoare\"\n\n#. Key:\tsettings_display_fps\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Game settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Display FPS\"\nmsgstr \"Afișare FPS\"\n\n#. Key:\tsettings_display_fps_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Game settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Show FPS counter\"\nmsgstr \"Afișează contorul FPS\"\n\n#. Key:\tsettings_display_mode\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Display Mode\"\nmsgstr \"Modul de Afișare\"\n\n#. Key:\tsettings_display_mode_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"In Windowed mode you can interact with other windows easier. In Borderless mode you can quickly switch between applications.\"\nmsgstr \"În modul Fereastră poți interacționa mai ușor cu alte ferestre. În modul fără margini puteți comuta rapid între aplicații.\"\n\n#. Key:\tsettings_display_play_time\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Game settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Display Play Time\"\nmsgstr \"Afișează ora de joc\"\n\n#. Key:\tsettings_display_play_time_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Game settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Show current play time\"\nmsgstr \"Afișează ora curentă de joc\"\n\n#. Key:\tsettings_effects\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Effect Quality\"\nmsgstr \"Calitatea Efectului\"\n\n#. Key:\tsettings_effects_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Affects the quality of particles in the world, a lower quality might make some projectiles in the world harder to see.\"\nmsgstr \"Afectează calitatea particulelor din lume, o calitate mai mică ar putea face ca unele proiectile din lume să fie mai greu de observat.\"\n\n#. Key:\tsettings_effects_volume\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Audio settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Sound Effects volume\"\nmsgstr \"Volumul Efectelor sonore\"\n\n#. Key:\tsettings_effects_volume_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Audio settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Adjust the sound effects volume\"\nmsgstr \"Reglează volumul efectelor sonore\"\n\n#. Key:\tsettings_force_weak_hardware_opt\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Additional Optimizations\"\nmsgstr \"Optimizări Suplimentare\"\n\n#. Key:\tsettings_force_weak_hardware_opt_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"In certain areas background traps are deactivated or background visuals look cheaper to gain more performance.\"\nmsgstr \"În anumite zone, capcanele de fundal sunt dezactivate sau imaginile de fundal arată mai ieftine pentru a obține mai multe performanță.\"\n\n#. Key:\tsettings_fps_unlimited\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings frame limit\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Unlimited\"\nmsgstr \"Nelimitat\"\n\n#. Key:\tsettings_frame_limit\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Frame Limit (FPS)\"\nmsgstr \"Limita Cadrelor (FPS)\"\n\n#. Key:\tsettings_frame_limit_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Limit the maximum frame rate for a consistent experience.\"\nmsgstr \"Limitează rata maximă de cadru pentru o experiență consecventă.\"\n\n#. Key:\tsettings_fullscreen\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Fullscreen\"\nmsgstr \"Ecran Complet\"\n\n#. Key:\tsettings_game\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Settings panels\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Game\"\nmsgstr \"Joc\"\n\n#. Key:\tsettings_game_speed\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Game settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Game Speed\"\nmsgstr \"Viteza Jocului\"\n\n#. Key:\tsettings_game_speed_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Game settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Changes the speed of the game.\\nHigher speed might make the game have lower FPS.\"\nmsgstr \"Schimbă viteza jocului.\\nViteza mai mare poate face ca jocul să aibă un FPS mai mic.\"\n\n#. Key:\tsettings_gamepad_vibration\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Gamepad Vibration intensity settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Vibration\"\nmsgstr \"Vibrație\"\n\n#. Key:\tsettings_keyboard\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Settings panels\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Keyboard\"\nmsgstr \"Tastatură\"\n\n#. Key:\tsettings_keyboard_remap_noedit\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Keyboard Settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Please use a keyboard in order to change the keyboard input\"\nmsgstr \"Vă rugăm să utilizați o tastatură pentru a schimba setările tastaturii\"\n\n#. Key:\tsettings_language\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Game settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Language\"\nmsgstr \"Limba\"\n\n#. Key:\tsettings_language_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Game settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Change the display and locale (numbers, dates) language\"\nmsgstr \"Modifică limba de afișare și localizare (numere, date)\"\n\n#. Key:\tsettings_master_volume\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Audio settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Master volume\"\nmsgstr \"Volumul Principal\"\n\n#. Key:\tsettings_master_volume_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Audio settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Adjust the master volume\"\nmsgstr \"Reglează volumul principal\"\n\n#. Key:\tsettings_merciful_bounce\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"game settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Merciful Bounce Mode\"\nmsgstr \"Mod de săritură milostiv\"\n\n#. Key:\tsettings_merciful_bounce_always\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"defines when (in which difficulty mode) is the easier bounce mode active\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Always\"\nmsgstr \"Tot timpul\"\n\n#. Key:\tsettings_merciful_bounce_never\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"defines when (in which difficulty mode) is the easier bounce mode active\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Never\"\nmsgstr \"Niciodată\"\n\n#. Key:\tsettings_merciful_bounce_on_easy\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"defines when (in which difficulty mode) is the easier bounce mode active\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"On Easy\"\nmsgstr \"Pe Ușor\"\n\n#. Key:\tsettings_merciful_bounce_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"tooltip for Merciful Bounce Mode option\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Allows Higher Bounce even if the Jump button is pressed after the character hits the ground\"\nmsgstr \"Permite o săritură mai mare chiar dacă butonul de Săritură este apăsat după ce personajul lovește pamântul\"\n\n#. Key:\tsettings_move_left_right\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Move left/right\"\nmsgstr \"Mișcare spre stânga / spre dreapta\"\n\n#. Key:\tsettings_music_volume\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Audio settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Music volume\"\nmsgstr \"Volumul Muzicii\"\n\n#. Key:\tsettings_music_volume_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Audio settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Adjust the music volume\"\nmsgstr \"Reglează volumul muzicii\"\n\n#. Key:\tsettings_mute_audio\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Audio settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Mute audio\"\nmsgstr \"Oprește sunetul\"\n\n#. Key:\tsettings_mute_audio_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Audio settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Mute all audio\"\nmsgstr \"Oprește toate sunetele\"\n\n#. Key:\tsettings_mute_audio_unfocused\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Audio settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Mute audio when in background\"\nmsgstr \"Oprește sunetul când jocul este in fundal\"\n\n#. Key:\tsettings_mute_audio_unfocused_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Audio settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Mute the audio when the game window is not in focus\"\nmsgstr \"Oprește sunetul atunci când fereastra jocului nu este focalizată\"\n\n#. Key:\tsettings_mute_dialogue_voice\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Audio settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Mute voices in dialogues\"\nmsgstr \"Oprește vocile în dialoguri\"\n\n#. Key:\tsettings_mute_dialogue_voice_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Audio settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Mute the gibberish voices inside the dialogues\"\nmsgstr \"Oprește vocile bolborosite din interiorul dialogurilor\"\n\n#. Key:\tsettings_mute_voice\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Audio settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Mute voices outside of dialogues\"\nmsgstr \"Oprește vocile din afară dialogurilor\"\n\n#. Key:\tsettings_mute_voice_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Audio settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Mute the gibberish voices outside the dialogues\"\nmsgstr \"Oprește vocile bolborosite din afara dialogurilor\"\n\n#. Key:\tsettings_pause_game_idle\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Game settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Pause game when idle\"\nmsgstr \"Pune pauză jocului atunci când este inactiv\"\n\n#. Key:\tsettings_pause_game_idle_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Game settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Pauses the game when the user is idle for a certain amount of minutes\"\nmsgstr \"Întrerupe jocul atunci când utilizatorul este inactiv pentru o anumită perioadă de timp\"\n\n#. Key:\tsettings_pause_game_unfocused\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Game settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Pause game when unfocused\"\nmsgstr \"Întrerupe jocul atunci când este nefocalizat\"\n\n#. Key:\tsettings_pause_game_unfocused_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Game settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Pauses the game when the game loses focus\"\nmsgstr \"Întrerupe jocul atunci când se pierde focalizarea\"\n\n#. Key:\tsettings_post_effects\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Post-Effects\"\nmsgstr \"Post-Efecte\"\n\n#. Key:\tsettings_post_effects_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Affects the quality of the post process effects after the scene is rendered.\"\nmsgstr \"Afectează calitatea efectelor post procesului după redarea scenei.\"\n\n#. Key:\tsettings_quality_epic\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings quality\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Epic\"\nmsgstr \"Epic\"\n\n#. Key:\tsettings_quality_high\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings quality\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"High\"\nmsgstr \"Ridicat\"\n\n#. Key:\tsettings_quality_low\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings quality\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Low\"\nmsgstr \"Scăzut\"\n\n#. Key:\tsettings_quality_medium\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings quality\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Medium\"\nmsgstr \"Mediu\"\n\n#. Key:\tsettings_ratio_16_10\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings Aspect Ratio\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"16:10\"\nmsgstr \"16:10\"\n\n#. Key:\tsettings_ratio_16_9\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings Aspect Ratio\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"16:9\"\nmsgstr \"16:9\"\n\n#. Key:\tsettings_ratio_4_3\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings Aspect Ratio\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"4:3\"\nmsgstr \"4:3\"\n\n#. Key:\tsettings_reset\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Reset\"\nmsgstr \"Resetează\"\n\n#. Key:\tsettings_reset_default\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Settings reset to default\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Reset to Defaults\"\nmsgstr \"Resetează la setări implicite\"\n\n#. Key:\tsettings_reset_input_key\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input reset key to default\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Reset button to default\"\nmsgstr \"Resetează butonul la valoarea implicită\"\n\n#. Key:\tsettings_resolution\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Resolution\"\nmsgstr \"Rezoluție\"\n\n#. Key:\tsettings_resolution_entry\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings. {0} - x, {1} - Y\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"{0}x{1}\"\nmsgstr \"{0}x{1}\"\n\n#. Key:\tsettings_resolution_scale\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Resolution Scale\"\nmsgstr \"Scară de Rezoluție\"\n\n#. Key:\tsettings_resolution_scale_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"The desired resolution to use when rendering the game. It does not affect the UI.\\nLowering it improves performance on lower end machines.\"\nmsgstr \"Rezoluția dorită de utilizat la redarea jocului. Nu afectează interfața de utilizator.\\nScăderea îmbunătățește performanțele la mașinile inferioare.\"\n\n#. Key:\tsettings_resolution_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Allows changing the Screen Resolution.\"\nmsgstr \"Permite modificarea rezoluției ecranului.\"\n\n#. Key:\tsettings_select_another\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Settings input\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Select another\"\nmsgstr \"Selectează alta\"\n\n#. Key:\tsettings_shadows\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Shadow Quality\"\nmsgstr \"Calitatea Umbrelor\"\n\n#. Key:\tsettings_shadows_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"The higher the quality the finer the shadow.\"\nmsgstr \"Cu cât calitatea este mai mare, cu atât este mai fină umbra.\"\n\n#. Key:\tsettings_textures\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Texture Quality\"\nmsgstr \"Calitatea Texturii\"\n\n#. Key:\tsettings_textures_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Surfaces of the game world will increase in fidelity if the setting is higher.\"\nmsgstr \"Suprafețele lumii jocului vor crește fidelitatea dacă setarea este mai mare.\"\n\n#. Key:\tsettings_unknown\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Unknown\"\nmsgstr \"Necunoscut\"\n\n#. Key:\tsettings_volumetric_fog\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Volumetric Fog\"\nmsgstr \"Ceață Volumetrică\"\n\n#. Key:\tsettings_volumetric_fog_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Realistic looking fog. Has a high performance impact, disable it to improve performance.\"\nmsgstr \"Ceată cu aspect realist. Are un impact performant ridicat, dezactivați-l pentru a îmbunătăți performanța.\"\n\n#. Key:\tsettings_vsync\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Vertical Sync\"\nmsgstr \"Sincronizare Verticală\"\n\n#. Key:\tsettings_vsync_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Synchronize the game refresh rate with the monitor refresh rate. Disable it for higher framerate and better input response.\\nWhen enabled it prevents screen tearing.\"\nmsgstr \"Sincronizați rata de actualizare a jocului cu rata de actualizare a monitorului. Dezactivați pentru un framerate mai mare și un răspuns de intrare mai bun.\\nCând este activat, acesta previne artefacte pe ecran.\"\n\n#. Key:\tsettings_windowed\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Windowed\"\nmsgstr \"Fereastră\"\n\n#. Key:\tskip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"text near the press and hold to skip confirmation button\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Skip\"\nmsgstr \"Treci Peste\"\n\n#. Key:\tspell_cast_switch_controls\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Quick select spells up/down/left/right\"\nmsgstr \"Selectează rapid vrăji în sus/jos/stânga/dreapta\"\n\n#. Key:\tspell_cast_switch_select_cast\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Select & Cast\"\nmsgstr \"Selectați & Cast\"\n\n#. Key:\tspell_cooldown_stops_in_air\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Spell\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Cooldown only starts on ground\"\nmsgstr \"Viteza de reîncărcare începe doar pe sol\"\n\n#. Key:\tspell_only_in_air\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Spell\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Can not be used in air\"\nmsgstr \"Nu poate fi utilizat în aer\"\n\n#. Key:\tspell_restricted\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Spell\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Can not be used in restricted areas\"\nmsgstr \"Nu poate fi utilizat în zone interzise\"\n\n#. Key:\tstart\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"The name of the checkpoint. Custom Map action\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Start\"\nmsgstr \"Începe\"\n\n#. Key:\tstart_game\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Menu Start Game\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Start Game\"\nmsgstr \"Începe Jocul\"\n\n#. Key:\tstats_usage_description\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Analytics popup\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Not Yet would like to collect usage statistics from your game automatically.\\nThese are not used to identify individuals, but help us to understand players needs to improve our game.\\n\\nSelect \\\"Send Automatically\\\" to allow collection of usage statistics,\\nor \\\"Do Not Send\\\" to prevent the game from sending information to Not Yet.\\n\\nYou can change this setting at any time via the Settings Game tab.\"\nmsgstr \"Not Yet ar dori să colecteze în mod automat statistici de utilizare din joc.\\nAcestea nu sunt folosite pentru a identifica indivizii, ci ne ajută să înțelegem nevoile jucătorilor pentru a îmbunătăți jocul nostru.\\n\\nSelectați „Trimiteți automat“ pentru a permite colectarea de statistici de utilizare,\\nsau „Nu trimiteți” pentru a împiedica jocul să trimită informații către Not Yet.\\n\\nPuteți modifica această setare în orice moment, prin Setările jocului.\"\n\n#. Key:\tstats_usage_title\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Analytics popup\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Usage Statistics\"\nmsgstr \"Statistici de utilizare\"\n\n#. Key:\tstatus\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Status of a save/custom map\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Status\"\nmsgstr \"Stare\"\n\n#. Key:\tsteam_main_game\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Wishlist\"\nmsgstr \"Adaugă în lista de dorințe\"\n\n#. Key:\tsteam_main_game_buy\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Buy Full Game\"\nmsgstr \"Cumpără jocul complet\"\n\n#. Key:\tSwitch_FaceButton_Bottom\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"B Button\"\nmsgstr \"Butonul B\"\n\n#. Key:\tSwitch_FaceButton_Left\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Y Button\"\nmsgstr \"Butonul Y\"\n\n#. Key:\tSwitch_FaceButton_Right\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"A Button\"\nmsgstr \"Butonul A\"\n\n#. Key:\tSwitch_FaceButton_Top\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"X Button\"\nmsgstr \"Butonul X\"\n\n#. Key:\tSwitch_Gamepad_LeftStick_Down\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \" Switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Left Stick Down\"\nmsgstr \"Maneta Stângă - Jos\"\n\n#. Key:\tSwitch_Gamepad_LeftStick_Left\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \" Switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Left Stick Left\"\nmsgstr \"Maneta Stângă - Stânga\"\n\n#. Key:\tSwitch_Gamepad_LeftStick_Right\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \" Switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Left Stick Right\"\nmsgstr \"Maneta Stângă - Dreapta\"\n\n#. Key:\tSwitch_Gamepad_LeftStick_Up\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \" Switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Left Stick Up\"\nmsgstr \"Maneta Stângă - Sus\"\n\n#. Key:\tSwitch_Gamepad_RightStick_Down\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \" Switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Right Stick Down\"\nmsgstr \"Maneta Dreaptă - Jos\"\n\n#. Key:\tSwitch_Gamepad_RightStick_Left\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \" Switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Right Stick Left\"\nmsgstr \"Maneta Dreaptă - Stânga\"\n\n#. Key:\tSwitch_Gamepad_RightStick_Right\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \" Switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Right Stick Right\"\nmsgstr \"Maneta Dreaptă - Dreapta\"\n\n#. Key:\tSwitch_Gamepad_RightStick_Up\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \" Switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Right Stick Up\"\nmsgstr \"Maneta Dreaptă - Sus\"\n\n#. Key:\tSwitch_LeftThumbstick\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \" Switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Left Stick\"\nmsgstr \"Maneta Stângă\"\n\n#. Key:\tSwitch_RightThumbstick\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \" Switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Right Stick\"\nmsgstr \"Maneta Dreaptă\"\n\n#. Key:\tSwitch_Shoulder_Left\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"L Button\"\nmsgstr \"Butonul L\"\n\n#. Key:\tSwitch_Shoulder_Right\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"R Button\"\nmsgstr \"Butonul R\"\n\n#. Key:\tSwitch_special_dpad_down\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \" Switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Down Button\"\nmsgstr \"Butonul Jos\"\n\n#. Key:\tSwitch_special_dpad_left\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \" Switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Left Button\"\nmsgstr \"Butonul Stânga\"\n\n#. Key:\tSwitch_special_dpad_right\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \" Switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Right Button\"\nmsgstr \"Butonul Dreapta\"\n\n#. Key:\tSwitch_special_dpad_up\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \" Switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Up Button\"\nmsgstr \"Butonul Sus\"\n\n#. Key:\tSwitch_special_left\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"- Button\"\nmsgstr \"Butonul -\"\n\n#. Key:\tSwitch_special_right\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"+ Button\"\nmsgstr \"Butonul +\"\n\n#. Key:\tSwitch_Trigger_Left\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"ZL Button\"\nmsgstr \"Butonul ZL\"\n\n#. Key:\tSwitch_Trigger_Right\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"ZR Button\"\nmsgstr \"Butonul ZR\"\n\n#. Key:\tteleport_to_cp\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Menu Teleport To Checkpoint\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Teleport To Checkpoint\"\nmsgstr \"Teleportare la punctul de control\"\n\n#. Key:\tteleport_to_sk\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Menu Teleport to Soulkeeper\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Teleport To SoulKeeper\"\nmsgstr \"Teleportare la Deținătorul Sufletului\"\n\n#. Key:\tthank_you_prologue\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"THANK YOU FOR PLAYING WARRIORB DEMO PROLOGUE, WE HOPE YOU HAD A GREAT TIME!\"\nmsgstr \"MULȚUMESC PENTRU CA AȚI JUCAT WARRIORB DEMO PROLOGUE, SPERĂM CĂ AȚI AVUT UN TIMP MINUNAT!\"\n\n#. Key:\ttotal_deaths\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Stats for saves\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Total Deaths\"\nmsgstr \"Decese totale\"\n\n#. Key:\ttrade_amount_x_x\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"trade confirmation UI. {0} is the current amount and {1} is the current amount times price per item\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"{0} for {1} gold\"\nmsgstr \"{0} pentru {1} aur\"\n\n#. Key:\ttrade_buy\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"trade confirmation UI\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Are you sure you want to buy {ItemName} for {Gold} gold?\"\nmsgstr \"Ești sigur că vrei să cumperi {ItemName} pentru {Gold} aur?\"\n\n#. Key:\ttrade_buy_back\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"trade confirmation UI\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Are you sure you want to buy back {ItemName} for {Gold} gold?\"\nmsgstr \"Ești sigur că vrei să cumperi înapoi {ItemName} pentru {Gold} aur?\"\n\n#. Key:\ttrade_no_intrested\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"trade confirmation UI\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"The trader is not interested in buying that item from you!\"\nmsgstr \"Comerciantul nu este interesat să cumpere acel articol de la tine!\"\n\n#. Key:\ttrade_nope\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"trade confirmation UI\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Nope!\"\nmsgstr \"Nu!\"\n\n#. Key:\ttrade_okay\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"trade confirmation UI\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Okay...\"\nmsgstr \"Okay...\"\n\n#. Key:\ttrade_sell\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"trade confirmation UI\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Are you sure you want to sell {ItemName} for {Gold} gold?\"\nmsgstr \"Ești sigur că vrei să vinzi {ItemName} pentru {Gold} aur?\"\n\n#. Key:\ttwitter\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Twitter\"\nmsgstr \"Twitter\"\n\n#. Key:\tunknown\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Unknown input binding\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"UNKNOWN\"\nmsgstr \"NECUNOSCUT\"\n\n#. Key:\twarriorb\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"WarriOrb\"\nmsgstr \"WarriOrb\"\n\n#. Key:\txp\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Experience Points\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"XP\"\nmsgstr \"XP\"\n\n#. Key:\tyes\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Confirm popup\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Yes\"\nmsgstr \"Da\"\n\n"
  },
  {
    "path": "Content/Localization/WarriorbDemo/ru/WarriorbDemo.po",
    "content": "﻿# WarriorbDemo Russian translation.\n# Copyright 1998-2019 Epic Games, Inc. All Rights Reserved.\n# \nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: WarriorbDemo\\n\"\n\"POT-Creation-Date: 2020-10-07 08:08\\n\"\n\"PO-Revision-Date: 2020-10-07 08:08\\n\"\n\"Language-Team: \\n\"\n\"Language: ru\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\\n\"\n\n#. Key:\tact1_loading\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"You are a Mighty Spirit from the Unknown Realm. You were torn away from your home by a pathetic mortal Wizard. After a magical accident your essence is bound to an unlikely body. Find a way out of your ball-body prison!\"\nmsgstr \"Ты - Могучий Дух из Неизвестного Царства. Ты был вырван из родного мира жалким смертным Волшебником. После магической случайности твоя сущность привязана к невероятному телу. Найди выход из плена своего шаровидного тела!\"\n\n#. Key:\tact2_loading\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Reaching Crossroad Cave you are a step closer to the Three Artifacts - and to freedom.\"\nmsgstr \"Добравшись до Пещеры Кроссроуд, ты на шаг ближе к Трем Артефактам - и к свободе.\"\n\n#. Key:\tact3_loading\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Finding the Three Artifacts required all your skills and strength. You hope that delivering them to the Wizard will be less difficult.\"\nmsgstr \"Поиск Трех Артефактов требует всех твоих навыков и сил. Ты надеешься, что доставить их Волшебнику будет не так уж и сложно.\"\n\n#. Key:\tact_1\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"text displayed on black screen the first time a chapter is started\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Act I\"\nmsgstr \"Акт I\"\n\n#. Key:\tact_2\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"text displayed on black screen the first time a chapter is started\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Act II\"\nmsgstr \"Акт II\"\n\n#. Key:\tact_3\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"text displayed on black screen the first time a chapter is started\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Act III\"\nmsgstr \"Акт III\"\n\n#. Key:\tancient_arcade\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an area\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Ancient Arcade\"\nmsgstr \"Античная Аркада\"\n\n#. Key:\tbubble_border\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an area\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Bubble Border\"\nmsgstr \"Граница Пузырей\"\n\n#. Key:\tcerulean_city\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an area\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Cerulean City\"\nmsgstr \"Лазурный Город\"\n\n#. Key:\tchasm_chamber\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an area\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Chasm Chamber\"\nmsgstr \"Комната Бездны\"\n\n#. Key:\tcrossroad_cave\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an area\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Crossroad Cave\"\nmsgstr \"Пещера Кроссроуд\"\n\n#. Key:\tdarkest_dungeon\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an area\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Darkest Dungeon\"\nmsgstr \"Мрачные Подземелья\"\n\n#. Key:\tdwarven_dungeons\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an area\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Dwarven Dungeons\"\nmsgstr \"Подземелья Гномов\"\n\n#. Key:\tending_loading\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Finally! You did your part of the deal, now it's the Wizard's turn to get you back home.\"\nmsgstr \"Наконец-то! Ты выполнил свою часть сделки, теперь очередь Волшебника вернуть тебя домой.\"\n\n#. Key:\tepilogue\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"text displayed on black screen the first time a chapter is started\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Epilogue\"\nmsgstr \"Эпилог\"\n\n#. Key:\tgrey_gate\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an area\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Grey Gate\"\nmsgstr \"Серые Врата\"\n\n#. Key:\thallowed_heart\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an area, Hallowed as in made holy; consecrated.\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Hallowed Heart\"\nmsgstr \"Святое Сердце\"\n\n#. Key:\tintro_subtitle_0\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" intro subtitle line 1\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"I wish I could just... turn back time to undo what I have done.\"\nmsgstr \"Хотел бы я просто… повернуть время вспять, чтобы исправить то, что я натворил.\"\n\n#. Key:\tintro_subtitle_1\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" intro subtitle line 01\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"However the past is behind us\"\nmsgstr \"Но прошлое уже позади\"\n\n#. Key:\tintro_subtitle_2\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" intro subtitle line 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"and all I can change now\"\nmsgstr \"и все что я могу изменить\"\n\n#. Key:\tintro_subtitle_3\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" intro subtitle line 3\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"is the future.\"\nmsgstr \"так это будущее.\"\n\n#. Key:\tlast_land\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an area\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Last Land\"\nmsgstr \"Последняя Земля\"\n\n#. Key:\tlava_lair\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an area\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Lava Lair\"\nmsgstr \"Лавовое Логово\"\n\n#. Key:\tloading_tip_act1_0\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 1\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"In Ball form you go faster.\"\nmsgstr \"В форме Шара ты быстрее.\"\n\n#. Key:\tloading_tip_act1_1\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 1\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"In Ball form you bounce back when you hit a surface.\"\nmsgstr \"В форме Шара ты отскакиваешь назад, когда ударяешься о поверхность.\"\n\n#. Key:\tloading_tip_act1_2\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 1\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Each weapon has its own unique special strike.\"\nmsgstr \"Каждое оружие имеет свой уникальный специальный удар.\"\n\n#. Key:\tloading_tip_act1_3\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 1\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Most of the people died after Ruin happened, but there are still some survivors.\"\nmsgstr \"Большинство людей умерло после того, как произошел Руин, но некоторые все же выжили.\"\n\n#. Key:\tloading_tip_act1_4\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 1\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Some items can’t be used but merchants still like to buy them.\"\nmsgstr \"Некоторые предметы не могут быть использованы, но купцы все равно любят их покупать.\"\n\n#. Key:\tloading_tip_act1_5\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 1\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"There are many keys, and when I say many, I mean it.\"\nmsgstr \"Там много ключей, и когда я говорю много, я не преувеличиваю.\"\n\n#. Key:\tloading_tip_act1_6\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 1\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"When you find an item it would make sense to check what it is, wouldn’t it?\"\nmsgstr \"Когда ты находишь какой-либо предмет, стоит проверить, что это такое, не так ли?\"\n\n#. Key:\tloading_tip_act1_7\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 1\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Spells can make combat easier.\"\nmsgstr \"Заклинания могут облегчить бой.\"\n\n#. Key:\tloading_tip_act1_8\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 1\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Dying often is absolutely normal. If you don’t die a lot, you are doing something wrong.\"\nmsgstr \"Часто умирать - это абсолютно нормально. Если ты не часто умираешь, ты делаешь что-то не так.\"\n\n#. Key:\tloading_tip_act1_9\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 1\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"You can always check the Sidenotes in your Inventory to see if you have any side quests.\"\nmsgstr \"Ты всегда можешь проверить Заметки в Инвентаре, чтобы узнать, есть ли у тебя дополнительные квесты.\"\n\n#. Key:\tloading_tip_act2_0\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Using the Railway can shorten your journey.\"\nmsgstr \"С помощью Железнодорожной Станции можно сократить путь.\"\n\n#. Key:\tloading_tip_act2_1\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"We’ll try to make our next game without any loading screens, we promise...\"\nmsgstr \"Мы постараемся сделать нашу следующую игру без экранов загрузки, обещаем…\"\n\n#. Key:\tloading_tip_act2_2\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Choosing the right weapon against a Boss will make your life easier.\"\nmsgstr \"Подбор правильного оружия против Босса сделает твою жизнь легче.\"\n\n#. Key:\tloading_tip_act2_3\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Don’t forget to use the Soulkeeper!\"\nmsgstr \"Не забудьте воспользоваться Хранилищем Душ!\"\n\n#. Key:\tloading_tip_act2_4\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Finding the Artefacts might be hard, but this is your only chance to get out.\"\nmsgstr \"Найти Артефакты может быть задача не из простых, но это твой единственный шанс выбраться.\"\n\n#. Key:\tloading_tip_act2_5\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Talk to any Survivor if you can. They might be able to help you.\"\nmsgstr \"Поговори с любым выжившим, если сможешь. Они могут тебе помочь.\"\n\n#. Key:\tloading_tip_act2_6\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"If you find an area too difficult you can always go to another area first.\"\nmsgstr \"Если тебе кажется, что локация слишком сложная, ты всегда можешь сначала пойти в другую локацию.\"\n\n#. Key:\tloading_tip_act2_7\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Don’t forget to spend your gold! (Ad sponsored by Gnory)\"\nmsgstr \"Не забудь потратить свое золото! (Спонсор объявления - Гнори.)\"\n\n#. Key:\tloading_tip_act2_8\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Equipping the right items will make the combat easier.\"\nmsgstr \"Правильно подобранное снаряжение облегчит бой.\"\n\n#. Key:\tloading_tip_act2_9\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"If you manage to defeat every member of a group you won’t have to fight them ever again.\"\nmsgstr \"Если тебе удастся победить каждого члена группы, то тебе больше никогда не придется с ними бороться.\"\n\n#. Key:\tloading_tip_act3_0\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 3\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Using the Railway can also make your Journey longer.\"\nmsgstr \"Использование Железнодорожной Станции также может сделать твое путешествие длиннее.\"\n\n#. Key:\tloading_tip_act3_1\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 3\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"If you got this far, you surely know everything now.\"\nmsgstr \"Если ты зашёл так далеко, то теперь ты точно всё знаешь.\"\n\n#. Key:\tloading_tip_act3_2\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 3\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Loading screen tips are very useful - except in a few cases.\"\nmsgstr \"Подсказки на экране загрузки очень полезны - за исключением нескольких случаев.\"\n\n#. Key:\tloading_tip_act3_3\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 3\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Now is your time to think about the fate of the Ruined Realm.\"\nmsgstr \"Пришло время подумать о судьбе Разрушенного Царства.\"\n\n#. Key:\tloading_tip_act3_4\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 3\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"The End is near... I mean no loading screen can take forever, right?\"\nmsgstr \"Конец близок… Я о том, что ни один экран загрузки не может длиться вечно, верно?\"\n\n#. Key:\tloading_tip_act3_5\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 3\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Now your only task is to bring the Artefacts to Wizard.\"\nmsgstr \"Теперь твоя единственная задача - доставить Артефакты Волшебнику.\"\n\n#. Key:\tloading_tip_act3_6\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 3\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"If you find a combat too hard try to use different shards, spells, and weapons.\"\nmsgstr \"Если ты считаешь что бой слишком сложный, попробуй использовать разные предметы/заклинания/оружие.\"\n\n#. Key:\tloading_tip_act3_7\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 3\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Don’t give up! Victory is close.\"\nmsgstr \"Не сдавайся! Победа не за горами.\"\n\n#. Key:\tloading_tip_end_0\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for epilogue\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"The Human Realm is a weird place...\"\nmsgstr \"Человеческое Царство - странное место…\"\n\n#. Key:\tloading_tip_end_1\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for epilogue\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"You really did your part of the deal, now it’s time to go home!\"\nmsgstr \"Ты действительно выполнил свою часть сделки, теперь пора домой!\"\n\n#. Key:\tloading_tip_end_2\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for epilogue\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Should you care about the fate of the Realms?\"\nmsgstr \"Должна ли тебя волновать судьба Царств?\"\n\n#. Key:\tloading_tip_end_3\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for epilogue\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Looks like it’s always you who has to take care of the mess others left behind.\"\nmsgstr \"Похоже, ты тот кому всегда приходится заботиться о бардаке, который оставили другие.\"\n\n#. Key:\tloading_tip_end_4\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for epilogue\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Time to finish what you started. One way or another.\"\nmsgstr \"Так или иначе. Пора закончить то, что ты начал.\"\n\n#. Key:\tlost_land\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an area\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Lost Land\"\nmsgstr \"Затерянные Земли\"\n\n#. Key:\tobedient_outpost\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an area\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Obedient Outpost\"\nmsgstr \"Послушная Застава\"\n\n#. Key:\tperfect_palace\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an area\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Perfect Palace\"\nmsgstr \"Совершенный Дворец\"\n\n#. Key:\tportal_place\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an area\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Portal Place\"\nmsgstr \"Место Портала\"\n\n#. Key:\tprogress_act1_arcade1\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Remnants of a Realm\"\nmsgstr \"Остатки Царства\"\n\n#. Key:\tprogress_act1_arcade2\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Discovering Ancient Technology\"\nmsgstr \"Открытие древних технологий\"\n\n#. Key:\tprogress_act1_before_raven\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Searching for a way out\"\nmsgstr \"В поисках выхода\"\n\n#. Key:\tprogress_act1_boss_fight\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Facing the Keeper\"\nmsgstr \"Встреча с Хранителем\"\n\n#. Key:\tprogress_act1_gem\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Looking for a Gem\"\nmsgstr \"В поисках Самоцвета\"\n\n#. Key:\tprogress_act1_infuse\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Infusing the Gem\"\nmsgstr \"Введение Самоцвета\"\n\n#. Key:\tprogress_act1_portals\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Looking for a Portal\"\nmsgstr \"В поисках портала\"\n\n#. Key:\tprogress_act1_start\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Lost in Ruin\"\nmsgstr \"Затерянный в Руине\"\n\n#. Key:\tprogress_act1_test_stone\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Bouncing Stones\"\nmsgstr \"Прыгающие камни\"\n\n#. Key:\tprogress_act1_tut1\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Am I Worthy?\"\nmsgstr \"Достойна ли я?\"\n\n#. Key:\tprogress_act1_tut2\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Sewer again\"\nmsgstr \"Снова канализация\"\n\n#. Key:\tprogress_act1_tut3\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Third time Worthy\"\nmsgstr \"Третий раз Достойный\"\n\n#. Key:\tprogress_act2_crossroad\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"At a crossroad\"\nmsgstr \"На перекрестке\"\n\n#. Key:\tprogress_act2_dwarf_0\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Into the Blue\"\nmsgstr \"В Синий\"\n\n#. Key:\tprogress_act2_dwarf_1\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Elevator Gem and Key\"\nmsgstr \"Самоцвет и ключ лифта\"\n\n#. Key:\tprogress_act2_dwarf_2\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Opening the Gate\"\nmsgstr \"Открытие ворот\"\n\n#. Key:\tprogress_act2_dwarf_boss\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Dwarven Statue\"\nmsgstr \"Статуя Гнома\"\n\n#. Key:\tprogress_act2_end\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"To the Fourth Station\"\nmsgstr \"На четвертую станцию\"\n\n#. Key:\tprogress_act2_lava_0\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Into the Red\"\nmsgstr \"В Красный\"\n\n#. Key:\tprogress_act2_lava_1\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Uniting Key Pieces\"\nmsgstr \"Объединение ключевых элементов\"\n\n#. Key:\tprogress_act2_lava_2\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Climbing the Tower\"\nmsgstr \"Поднятие на Башню\"\n\n#. Key:\tprogress_act2_lava_boss\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Armour Wrath\"\nmsgstr \"Броневой Гнев\"\n\n#. Key:\tprogress_act2_ww_0\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Into the Green\"\nmsgstr \"В Зелёный\"\n\n#. Key:\tprogress_act2_ww_1\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Through the Lake\"\nmsgstr \"Через озеро\"\n\n#. Key:\tprogress_act2_ww_2\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Being Followed\"\nmsgstr \"Быть преследуемым\"\n\n#. Key:\tprogress_act2_ww_boss\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Fallen Druid\"\nmsgstr \"Падший Друид\"\n\n#. Key:\tprogress_act3_floating\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in act 3\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Floating\"\nmsgstr \"Парящий\"\n\n#. Key:\tprogress_act3_monk\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in act 3\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Monk's Home\"\nmsgstr \"Дом Монаха\"\n\n#. Key:\tprogress_act3_pipes\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in act 3\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Moving Pipes\"\nmsgstr \"Движущиеся трубы\"\n\n#. Key:\tprogress_act3_start\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in act 3\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Lost in the Caves\"\nmsgstr \"Затерянный в Пещерах\"\n\n#. Key:\tprogress_act3_way_out\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in act 3\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Way out of the Realm\"\nmsgstr \"Выход из Царства\"\n\n#. Key:\tprogress_epilogue_boss\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in epilogue\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"The Real Demon\"\nmsgstr \"Настоящий Демон\"\n\n#. Key:\tprogress_epilogue_castle\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in epilogue\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Wizard's Castle\"\nmsgstr \"Замок Волшебника\"\n\n#. Key:\tprogress_epilogue_past_and_future\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in epilogue\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Past and Future\"\nmsgstr \"Прошлое и Будущее\"\n\n#. Key:\tprogress_epilogue_save_creatures\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in epilogue\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Chance for everyone\"\nmsgstr \"Шанс для всех\"\n\n#. Key:\tprogress_epilogue_separate_worlds\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in epilogue\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Separated Worlds\"\nmsgstr \"Раздельные Миры\"\n\n#. Key:\tprologue\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"text displayed on black screen the first time a chapter is started\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Prologue\"\nmsgstr \"Пролог\"\n\n#. Key:\tremnant_road\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an area\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Remnant Road\"\nmsgstr \"Оставшаяся Дорога\"\n\n#. Key:\truined_realm\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Ruined Realm\"\nmsgstr \"Разрушенное Царство\"\n\n#. Key:\tsnake_slide\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an area\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Snake Slide\"\nmsgstr \"Змеевидный Спуск\"\n\n#. Key:\tsunken_sewer\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an area\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Sunken Sewer\"\nmsgstr \"Затопленная Канализация\"\n\n#. Key:\twhite_wall\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"White Wall\"\nmsgstr \"Белая Стена\"\n\n#. Key:\twracked_waters\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an area\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Wracked Waters\"\nmsgstr \"Заражённые Воды\"\n\n#. Key:\tcredits_fmod\n#. SourceLocation:\tLocalization/StringTables/Credits.csv\n#: Localization/StringTables/Credits.csv\nmsgctxt \"Credits\"\nmsgid \"Made with FMOD Studio by Firelight Technologies Pty Ltd.\"\nmsgstr \"Создано с помощью FMOD Studio от Firelight Technologies Pty Ltd.\"\n\n#. Key:\tMonthApril\n#. SourceLocation:\tSource/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:17\n#: Source/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:17\nmsgctxt \"DateTimeHelper\"\nmsgid \"April\"\nmsgstr \"Апрель\"\n\n#. Key:\tMonthAugust\n#. SourceLocation:\tSource/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:21\n#: Source/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:21\nmsgctxt \"DateTimeHelper\"\nmsgid \"August\"\nmsgstr \"Август\"\n\n#. Key:\tMonthDecember\n#. SourceLocation:\tSource/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:26\n#: Source/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:26\nmsgctxt \"DateTimeHelper\"\nmsgid \"December\"\nmsgstr \"Декабрь\"\n\n#. Key:\tMonthFebruary\n#. SourceLocation:\tSource/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:15\n#: Source/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:15\nmsgctxt \"DateTimeHelper\"\nmsgid \"February\"\nmsgstr \"Февраль\"\n\n#. Key:\tMonthJanuary\n#. SourceLocation:\tSource/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:14\n#: Source/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:14\nmsgctxt \"DateTimeHelper\"\nmsgid \"January\"\nmsgstr \"Январь\"\n\n#. Key:\tMonthJuly\n#. SourceLocation:\tSource/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:20\n#: Source/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:20\nmsgctxt \"DateTimeHelper\"\nmsgid \"July\"\nmsgstr \"Июль\"\n\n#. Key:\tMonthJune\n#. SourceLocation:\tSource/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:19\n#: Source/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:19\nmsgctxt \"DateTimeHelper\"\nmsgid \"June\"\nmsgstr \"Июнь\"\n\n#. Key:\tMonthMarch\n#. SourceLocation:\tSource/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:16\n#: Source/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:16\nmsgctxt \"DateTimeHelper\"\nmsgid \"March\"\nmsgstr \"Март\"\n\n#. Key:\tMonthMay\n#. SourceLocation:\tSource/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:18\n#: Source/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:18\nmsgctxt \"DateTimeHelper\"\nmsgid \"May\"\nmsgstr \"Май\"\n\n#. Key:\tMonthNovember\n#. SourceLocation:\tSource/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:24\n#: Source/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:24\nmsgctxt \"DateTimeHelper\"\nmsgid \"November\"\nmsgstr \"Ноябрь\"\n\n#. Key:\tMonthOctober\n#. SourceLocation:\tSource/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:23\n#: Source/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:23\nmsgctxt \"DateTimeHelper\"\nmsgid \"October\"\nmsgstr \"Октябрь\"\n\n#. Key:\tMonthSeptember\n#. SourceLocation:\tSource/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:22\n#: Source/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:22\nmsgctxt \"DateTimeHelper\"\nmsgid \"September\"\nmsgstr \"Сентябрь\"\n\n#. Key:\tSecondsToTime\n#. SourceLocation:\tSource/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:48\n#: Source/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:48\nmsgctxt \"DateTimeHelper\"\nmsgid \"{Minutes}:{Seconds}\"\nmsgstr \"{Minutes}:{Seconds}\"\n\n#. Key:\tSecondsToTimeMinusSeconds\n#. SourceLocation:\tSource/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:51\n#: Source/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:51\nmsgctxt \"DateTimeHelper\"\nmsgid \"{Hours}:{Minutes}:{Seconds}\"\nmsgstr \"{Hours}:{Minutes}:{Seconds}\"\n\n#. Key:\tchar_name_ball_e\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"possible display name for character\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"BALL-E\"\nmsgstr \"БОЛЛ-И\"\n\n#. Key:\tchar_name_destroyer\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"possible display name for character\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Destroyer\"\nmsgstr \"Разрушитель\"\n\n#. Key:\tchar_name_dont_buy\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"possible display name for character\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Don't buy\"\nmsgstr \"Не покупай\"\n\n#. Key:\tchar_name_dr_ball\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"possible display name for character\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Dr. Ball\"\nmsgstr \"Доктор Бол\"\n\n#. Key:\tchar_name_epic_sphero\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"possible display name for character\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Epic Sphero\"\nmsgstr \"Эпический Сфероид\"\n\n#. Key:\tchar_name_failed_one\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"possible display name for character\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Failed One\"\nmsgstr \"Неудачник\"\n\n#. Key:\tchar_name_saviour\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"possible display name for character\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Saviour\"\nmsgstr \"Спаситель\"\n\n#. Key:\tchar_name_sorbcerer\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"possible display name for character\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Sorbcerer\"\nmsgstr \"Шародей\"\n\n#. Key:\tchar_name_spirit_of_the_unknown\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"possible display name for character\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Spirit Of the Unknown\"\nmsgstr \"Дух Неизвестного\"\n\n#. Key:\tchar_name_ultimate_frisbee\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"possible display name for character\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Ultimate Frisbee\"\nmsgstr \"Абсолютный Фрисби\"\n\n#. Key:\tchar_name_wanderer\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"possible display name for character\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Wanderer\"\nmsgstr \"Странник\"\n\n#. Key:\tchar_name_warlorb\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"possible display name for character\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Warlorb\"\nmsgstr \"Уорлорб\"\n\n#. Key:\tchar_name_warriorb\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"possible display name for character\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"WarriOrb\"\nmsgstr \"Уорриорб\"\n\n#. Key:\tfinish\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"default option\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Finish\"\nmsgstr \"Завершить\"\n\n#. Key:\tgold_gained\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"{0} Gold Gained\"\nmsgstr \"{0} Gold Gained\"\n\n#. Key:\tgold_lost\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"{0} Gold Lost\"\nmsgstr \"{0} Утеряно золото\"\n\n#. Key:\titem_gained\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"{ItemName} gained!\"\nmsgstr \"{ItemName} приобретен!\"\n\n#. Key:\titem_gained_n\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"{Amount} {ItemName} gained!\"\nmsgstr \"{Amount} {ItemName} приобретено!\"\n\n#. Key:\titem_lost\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"{ItemName} lost!\"\nmsgstr \"{ItemName} утерян!\"\n\n#. Key:\titem_lost_n\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"{Amount} {ItemName} lost!\"\nmsgstr \"{Amount} {ItemName} утеряно!\"\n\n#. Key:\tnext\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"default option\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Next\"\nmsgstr \"Далее\"\n\n#. Key:\tnpc_altar\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"npc if BPLanguage Improver\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Altar\"\nmsgstr \"Алтарь\"\n\n#. Key:\tnpc_ancient_gate\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an npc\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Ancient Gate\"\nmsgstr \"Древние Врата\"\n\n#. Key:\tnpc_demon_lillian\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"name of the final boss\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Demon Lillian\"\nmsgstr \"Демон Лиллиан\"\n\n#. Key:\tnpc_dwarven_workshop\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"name of the place the character can have a dialogue to craft a quest item\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Dwarven Workshop\"\nmsgstr \"Мастерская Гнома\"\n\n#. Key:\tnpc_fishy\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"display name of an npc\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Fishy\"\nmsgstr \"Фиши\"\n\n#. Key:\tnpc_fountain\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"display name of a fountain the character can talk with\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Fountain\"\nmsgstr \"Фонтан\"\n\n#. Key:\tnpc_gatekeeper\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an npc\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Gatekeeper\"\nmsgstr \"Хранитель Врат\"\n\n#. Key:\tnpc_ghost_dwarf\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an npc (actually a ghost of a dwarf)\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Ghost Dwarf\"\nmsgstr \"Карлик-Призрак\"\n\n#. Key:\tnpc_gnory\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an npc\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Gnory\"\nmsgstr \"Гнори\"\n\n#. Key:\tnpc_golem_maker\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an npc\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Golem Maker\"\nmsgstr \"Создатель Големов\"\n\n#. Key:\tnpc_lory\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an npc\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Lory\"\nmsgstr \"Лори\"\n\n#. Key:\tnpc_lory_unkown\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"display name of Lory before she introduces herself\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Gnome Lady\"\nmsgstr \"Леди Гном\"\n\n#. Key:\tnpc_magic_mirror\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an npc\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Magic Mirror\"\nmsgstr \"Волшебное Зеркало\"\n\n#. Key:\tnpc_merchant\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an npc\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Merch Ant\"\nmsgstr \"Торгаш\"\n\n#. Key:\tnpc_merchant_voice\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"name of a small ant until he says his name (only a voice cause player can not see it)\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Voice\"\nmsgstr \"Голос\"\n\n#. Key:\tnpc_monk\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an npc\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Monk\"\nmsgstr \"Монах\"\n\n#. Key:\tnpc_name_kobold\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Kobold Chef\"\nmsgstr \"Повар Коболд\"\n\n#. Key:\tnpc_pipe_walker\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"display name of some weird creatures\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Pipe Walker\"\nmsgstr \"Трубоходик\"\n\n#. Key:\tnpc_raven\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an npc (he is actually a bird)\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Raven\"\nmsgstr \"Ворон\"\n\n#. Key:\tnpc_scholar\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an npc\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Scholar\"\nmsgstr \"Профессор\"\n\n#. Key:\tnpc_secret_hideout\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"display name of a door asking for a password\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Secret Hideout Gate\"\nmsgstr \"Тайные Врата-Убежища\"\n\n#. Key:\tnpc_sewer_creature\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an npc\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Sewer Creature\"\nmsgstr \"Канализационное Существо\"\n\n#. Key:\tnpc_statue\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an npc\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Statue\"\nmsgstr \"Статуя\"\n\n#. Key:\tnpc_supper_dwarf\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"display name of an npc. Supper refers here an evening meal, typically a light or informal one.\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Supper Dwarf\"\nmsgstr \"Гном Едун\"\n\n#. Key:\tnpc_teachy\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an npc\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Teachy\"\nmsgstr \"Ученый\"\n\n#. Key:\tnpc_teachy_unkown\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"name of Teachy before introduction\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Bored Gnome\"\nmsgstr \"Унылый Гном\"\n\n#. Key:\tnpc_tomb\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"display name of a tomb a character can talk to\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Tomb\"\nmsgstr \"Гробница\"\n\n#. Key:\tnpc_unknown_wizard\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"display name of an npc\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Unknown Wizard\"\nmsgstr \"Неизвестный Волшебник\"\n\n#. Key:\tnpc_wizard\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"display name of the wizard npc\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Wizard\"\nmsgstr \"Волшебник\"\n\n#. Key:\t022227664F6F422B20B109A19B8789AA\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"I’m glad you are back again!\"\nmsgstr \"Я рад, что ты вернулся!\"\n\n#. Key:\t0944D8A541F933BEB5DD068CA9099075\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_44.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_44.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"I think I managed to activate the device on the wall of the Portal Tower.\"\nmsgstr \"Думаю, мне удалось активировать устройство на стене Портал-Башни.\"\n\n#. Key:\t10ADF4F948FB99445BF791BB0722AD90\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_25.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_25.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Good idea.\"\nmsgstr \"Хорошая идея.\"\n\n#. Key:\t137B87BB447D45E46C0425A940E8B7F0\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_46.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_46.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"You said you wouldn't do it...\"\nmsgstr \"Ты сказал, что не будешь этого делать…\"\n\n#. Key:\t16358AE840D8B8553E8930A3B7E69BBA\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"You know, sometimes I miss the Pipewalkers...\"\nmsgstr \"Знаешь, иногда я скучаю по Трубоходикам…\"\n\n#. Key:\t1B9834C6405C60960F322585AB0F1704\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_38.Text\n#. Key:\t2189E8064ACF974902FBA49BD12D0F47\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_38.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Could you activate it for me?\"\nmsgstr \"Можешь активировать его для меня?\"\n\n#. Key:\t274EB7AD410061E3E200A9813A54AB29\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"I think I've already done that.\"\nmsgstr \"Похоже, я это уже сделал.\"\n\n#. Key:\t2A57878148EFCC8532E34CAE1B9C9A0F\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"You? I never thought I’ll see you in this shape again.\"\nmsgstr \"Ты? Никогда бы не подумал, что увижу тебя вновь в этой форме.\"\n\n#. Key:\t3764BB48401ABEDCD125F186B4BF0E17\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"And it also attracts the Pipewalkers.\"\nmsgstr \"А также привлекает Трубоходиков.\"\n\n#. Key:\t3A0924F7449355545C0A98B94994616B\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"I want to find my tribe.\"\nmsgstr \"Я хочу найти свое племя.\"\n\n#. Key:\t3C0498284D71B7B64FEA4094F42A5502\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_23.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_23.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Do you think you will find Pipewalkers here?\"\nmsgstr \"Думаешь, ты найдешь здесь Трубоходиков?\"\n\n#. Key:\t3DCACAB047175FB687542AB0CA25D972\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_38.Children(1).Children.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_38.Children(1).Children.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Decline\"\nmsgstr \"Отклонить\"\n\n#. Key:\t41C1FCA947041D49247FC8A157D7407F\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_52.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_52.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"All right, thank you.\"\nmsgstr \"Ладно, спасибо.\"\n\n#. Key:\t43C8FE9248340E49F1F31882D7B96642\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"If they are still alive they must be beyond that Purple Portal.\"\nmsgstr \"Если они все еще живы, они должны быть за Пурпурным Порталом.\"\n\n#. Key:\t444DD931423A98C7DD95D4BB73F0F1C6\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_39.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_39.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Sure! I’ll see what I can do.\"\nmsgstr \"Конечно! Я посмотрю, что можно сделать.\"\n\n#. Key:\t4FF2FA154BEFBD448EFDB0BB7FE3F0AF\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_11.Children(1).Children.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_11.Children(1).Children.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Tribe\"\nmsgstr \"Племя\"\n\n#. Key:\t52A8B1F04C37F262E014DEA14AB68957\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Because I’m a chef.\"\nmsgstr \"Потому что я повар.\"\n\n#. Key:\t5F376BF945B8CE4AA12B7EB05F8C62A5\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_11.Children(6).Children.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_11.Children(6).Children.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Leave\"\nmsgstr \"Выход\"\n\n#. Key:\t63EA4DDD45390542E3A904928143D9AF\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Haha... Yes I’m back again.\"\nmsgstr \"Хаха… Да, я вернулся.\"\n\n#. Key:\t64EE856046A396F2750AE1BC1042CF26\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_30.Text\n#. Key:\tE3F52F4F47289406E4A546BB0BF3AC3F\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_50.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_30.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_50.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Thanks!\"\nmsgstr \"Спасибо!\"\n\n#. Key:\t694B6E3F4F4C7CEAAACB51A2D30FFD26\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_11.Children(2).Children.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_11.Children(2).Children.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Ruin\"\nmsgstr \"Руин\"\n\n#. Key:\t7304F1034A83C6D17E274090FA8E543B\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_41.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_41.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Thank you!\"\nmsgstr \"Спасибо!\"\n\n#. Key:\t73240093450B12BEEA1EB78C9CF7D89E\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_11.Children(0).Children.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_11.Children(0).Children.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Purple Portal\"\nmsgstr \"Пурпурный портал\"\n\n#. Key:\t804671AF40165C92FA6A8F8A5AE97997\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_60.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_60.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Looks like I can’t get rid of this body.\"\nmsgstr \"Похоже, я не могу избавиться от этого тела.\"\n\n#. Key:\t807FF1A945548216DAD305B4D5A4437F\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_24.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_24.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"If there are any they will come here when they smell the soup.\"\nmsgstr \"Если они здесь есть, они придут сюда, когда почувствуют запах супа.\"\n\n#. Key:\t8240EF7946C8434333AFAEBEF3583917\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_34.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_34.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Do you need help with something?\"\nmsgstr \"Тебе нужна помощь?\"\n\n#. Key:\t833BB4384231444247779CAB596D0259\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_40.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_40.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"I’m sorry but that sounds complicated.\"\nmsgstr \"Извини, но это звучит сложновато.\"\n\n#. Key:\t85656A9E46844B03D49E13AC951FDE07\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_59.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_59.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"See you!\"\nmsgstr \"Увидимся!\"\n\n#. Key:\t869485E24E19938DEE48BFB5C5240BB3\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_29.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_29.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"I’m not sure... but I have a key which might be useful.\"\nmsgstr \"Я не уверен…но у меня есть ключ, который может быть полезен.\"\n\n#. Key:\t86FBA5A24734DD97167512A054A2E0D9\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Oh, it’s you.\"\nmsgstr \"О, это ты.\"\n\n#. Key:\t891684A24BA64E351E7F0B9ADEA3D6DF\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"No. To be honest I don’t care much about Ruin.\"\nmsgstr \"Нет. Честно говоря, меня не очень то волнует “Руин”.\"\n\n#. Key:\t8FF6BF7B4745BB75C2D8F7873C492C2D\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_11.Children(4).Children.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_11.Children(4).Children.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Can I help?\"\nmsgstr \"Я могу помочь?\"\n\n#. Key:\t93B13014434102C8033B41A06DBED69B\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_11.Children(5).Children.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_11.Children(5).Children.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Tower Device\"\nmsgstr \"Устройство Башни\"\n\n#. Key:\t95A7C27A44B78CBF17C1FD8C9446CBD7\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Take it! I still need some time to finish the soup anyway.\"\nmsgstr \"Возьми его! Мне все равно нужно время, чтобы закончить суп.\"\n\n#. Key:\t97E4FDC74B47A6037D6023A4C65B2934\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_37.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_37.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"If you activate it I’ll be able to use the portal to teleport to other places.\"\nmsgstr \"Если ты активируешь его, я смогу использовать портал для телепортации в другие места.\"\n\n#. Key:\t9FD2679D44BEBBFBBAD2EAAECFFEE0D5\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_42.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_42.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"I can’t promise I’ll do that.\"\nmsgstr \"Я не могу обещать, что сделаю это.\"\n\n#. Key:\tAA1C6EF444BAB6A929E953A87BB87ABB\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_56.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_56.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"I've got to go. See you soon!\"\nmsgstr \"Мне пора. Еще увидимся!\"\n\n#. Key:\tAED4FBE3422E0FC4AC4BD38650F95CA9\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_26.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_26.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Thanks.\"\nmsgstr \"Спасибо.\"\n\n#. Key:\tB0BAD1934671ADCB2DD1E1BA582E3C68\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Why are you making soup?\"\nmsgstr \"Зачем ты готовишь суп?\"\n\n#. Key:\tB621AECE42A14A508C945595493F3A3A\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Really? Anyway, I’m happy to see you.\"\nmsgstr \"Правда? В любом случае, я рад тебя видеть.\"\n\n#. Key:\tBA715D554C47932C092462B36ADEA081\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_58.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_58.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Good bye!\"\nmsgstr \"Ага, пока!\"\n\n#. Key:\tBE7B3444431F43E8E1487F8702B94845\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_57.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_57.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"It was nice to meet you.\"\nmsgstr \"Приятно было повидаться.\"\n\n#. Key:\tC1BB24A443D4297B17E2F6A280B02E91\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_36.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_36.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Yes. According to a book I read here there is a device on the wall of the Portal Tower.\"\nmsgstr \"Да. Согласно книге, которую я здесь прочитал, на стене Портал-Башни есть устройство.\"\n\n#. Key:\tC339B87742C2B475E2387F93418AA855\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Have you found out anything about Ruin?\"\nmsgstr \"Ты узнал что-нибудь о Руине?\"\n\n#. Key:\tC4D263AB48B800D5522A24923C541ED3\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_11.Children(3).Children.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_11.Children(3).Children.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Soup\"\nmsgstr \"Суп\"\n\n#. Key:\tC530096E4FA1A2B68077C3AD6AC1BF44\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_38.Children(0).Children.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_38.Children(0).Children.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Accept Quest\"\nmsgstr \"Принять Квест\"\n\n#. Key:\tC82668E6497A810FA6ADC0AB6F362B47\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"The soup is almost ready...\"\nmsgstr \"Суп почти готов…\"\n\n#. Key:\tCD8CDA3443CDE79BE257B99A0801B209\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_43.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_43.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"No problem.\"\nmsgstr \"Без проблем.\"\n\n#. Key:\tD058108241051A9FD0D130B3C9EA4B8B\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"It helps me keep my mind clear.\"\nmsgstr \"Это помогает мне думать яснее.\"\n\n#. Key:\tD8F879684C57BB474E7153B971073663\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_49.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_49.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Meanwhile I cooked something special for you. Take this!\"\nmsgstr \"Тем временем я подготовил кое-что особенное для тебя. Держи!\"\n\n#. Key:\tDA9D493F42420BE9442B1EA983AEF9C2\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Any news on your lost tribe?\"\nmsgstr \"Есть новости о твоем пропавшем племени?\"\n\n#. Key:\tDE2390ED4366A621E4D220A3761333DE\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_54.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_54.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"I need to go now.\"\nmsgstr \"Мне пора идти.\"\n\n#. Key:\tDE668E4B4A3D0F785A693B9190E635D3\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_47.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_47.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"How on earth have you managed to reach this node?\"\nmsgstr \"Каким боком тебе удалось добраться до этого узла?\"\n\n#. Key:\tE29E2D044497A86DD0FCA8B540703597\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_48.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_48.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Pls. report it as a bug.\"\nmsgstr \"Сообщите нам, если вы обнаружили баг.\"\n\n#. Key:\tE6D3401944B2FF128DD1689F5159AF96\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_45.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_45.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Nice, well done!\"\nmsgstr \"Отлично, молодец!\"\n\n#. Key:\tE83287164D066CCE8FBFDE835FBD4CFB\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_55.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_55.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"I'm on my way. Take care!\"\nmsgstr \"Я уже в пути. Будь осторожен!\"\n\n#. Key:\tEBC97F7C45858FE6DC72209536FC5C3B\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_27.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_27.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Do you know how can I reach that Purple Portal?\"\nmsgstr \"Ты знаешь, как мне добраться до Пурпурного Портала?\"\n\n#. Key:\tF911D6CB45AA59448C03379A1C07DD60\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_51.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_51.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"It wasn’t that complicated after all.\"\nmsgstr \"В итоге все было не так уж и сложно.\"\n\n#. Key:\tF9EBA1684D435C8AEB14129A7B57A604\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"I think they came here and followed the messages just like you.\"\nmsgstr \"Я думаю, они были здесь и последовали за посланиями, как и ты.\"\n\n#. Key:\t3DAA74ED48BE31E35D868FB1492E57A8\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/WW_Pergamen.WW_Pergamen:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/WhiteWall/WW_Pergamen.WW_Pergamen:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_WW_Pergamen\"\nmsgid \"'Ruin took over some of us. It's no longer safe here.'\"\nmsgstr \"“Руин забрал несколько из наших. Здесь уже не безопасно.”\"\n\n#. Key:\tB10818134FFE3A1E99A9D789BFABBBEE\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/WW_Pergamen.WW_Pergamen:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/WhiteWall/WW_Pergamen.WW_Pergamen:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_WW_Pergamen\"\nmsgid \"'Come visit us beyond the Purple Portal!'\"\nmsgstr \"“Приходи повидать нас за Пурпурным Порталом.”\"\n\n#. Key:\tD292364A4E58F52FB874AA98C1F969A6\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/WW_Pergamen.WW_Pergamen:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/WhiteWall/WW_Pergamen.WW_Pergamen:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_WW_Pergamen\"\nmsgid \"'We are close to the solution, but your help is still needed.'\"\nmsgstr \"“Мы близки к развязке, но твоя помощь все еще нужна.”\"\n\n#. Key:\t0CD0FD884718EF68B38D578CDE17110A\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/WW_Statue.WW_Statue:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/WhiteWall/WW_Statue.WW_Statue:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_WW_Statue\"\nmsgid \"Oooops...\"\nmsgstr \"Ууупс…\"\n\n#. Key:\t2D531D384CB6A56DBC4834BD229622E7\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/WW_Statue.WW_Statue:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/WhiteWall/WW_Statue.WW_Statue:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_WW_Statue\"\nmsgid \"'White Wall will never fall!'\"\nmsgstr \"“Белая стена никогда не падет!”\"\n\n#. Key:\t2690E77045D5E42F32AC6582BAFF27AA\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/WW_StatueWelcome.WW_StatueWelcome:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/WhiteWall/WW_StatueWelcome.WW_StatueWelcome:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_WW_StatueWelcome\"\nmsgid \"'We know how to stop Ruin.'\"\nmsgstr \"“Мы знаем, как остановить Руин.”\"\n\n#. Key:\t7C3340434A4C80010AC2D58BF8504339\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/WW_StatueWelcome.WW_StatueWelcome:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/WhiteWall/WW_StatueWelcome.WW_StatueWelcome:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_WW_StatueWelcome\"\nmsgid \"'There is still hope.'\"\nmsgstr \"“Еще есть надежда”.\"\n\n#. Key:\tarmour_wrath_name\n#. SourceLocation:\tLocalization/StringTables/Enemies.csv\n#. InfoMetaData:\t\"Comment\" : \"display name of an npc boss\"\n#: Localization/StringTables/Enemies.csv\nmsgctxt \"Enemies\"\nmsgid \"Armour Wrath\"\nmsgstr \"Броневой Гнев\"\n\n#. Key:\tdwarf_name\n#. SourceLocation:\tLocalization/StringTables/Enemies.csv\n#. InfoMetaData:\t\"Comment\" : \"display name of an npc boss\"\n#: Localization/StringTables/Enemies.csv\nmsgctxt \"Enemies\"\nmsgid \"Dwarf\"\nmsgstr \"Гном\"\n\n#. Key:\tfallen_druid_name\n#. SourceLocation:\tLocalization/StringTables/Enemies.csv\n#. InfoMetaData:\t\"Comment\" : \"display name of an npc boss\"\n#: Localization/StringTables/Enemies.csv\nmsgctxt \"Enemies\"\nmsgid \"Fallen Druid\"\nmsgstr \"Падший Друид\"\n\n#. Key:\tdreamhack_completed_desc\n#. SourceLocation:\tLocalization/StringTables/Episodes.csv\n#: Localization/StringTables/Episodes.csv\nmsgctxt \"Episodes\"\nmsgid \"Thanks for playing the game, we hope you had a great time!\"\nmsgstr \"Спасибо за участие в игре, мы надеемся, что вы отлично провели время!\"\n\n#. Key:\tdreamhack_completed_subtitle\n#. SourceLocation:\tLocalization/StringTables/Episodes.csv\n#: Localization/StringTables/Episodes.csv\nmsgctxt \"Episodes\"\nmsgid \"Dreamhack Demo\"\nmsgstr \"Демо-версия Dreamhack\"\n\n#. Key:\tdreamhack_desc\n#. SourceLocation:\tLocalization/StringTables/Episodes.csv\n#: Localization/StringTables/Episodes.csv\nmsgctxt \"Episodes\"\nmsgid \"What happens when you lock a mighty demon's spirit inside a ball body?\"\nmsgstr \"Что же произойдет, если запереть дух могущественного демона внутри шаровидного тела?\"\n\n#. Key:\tdreamhack_friendly_name\n#. SourceLocation:\tLocalization/StringTables/Episodes.csv\n#: Localization/StringTables/Episodes.csv\nmsgctxt \"Episodes\"\nmsgid \"Dreamhack\"\nmsgstr \"Dreamhack\"\n\n#. Key:\tepisode_end_main_title\n#. SourceLocation:\tLocalization/StringTables/Episodes.csv\n#. InfoMetaData:\t\"Comment\" : \"episode map end panel text\"\n#: Localization/StringTables/Episodes.csv\nmsgctxt \"Episodes\"\nmsgid \"Episode Completed!\"\nmsgstr \"Эпизод Пройден!\"\n\n#. Key:\tescape_darkness_completed_desc\n#. SourceLocation:\tLocalization/StringTables/Episodes.csv\n#: Localization/StringTables/Episodes.csv\nmsgctxt \"Episodes\"\nmsgid \"\\\"And as Darkness spreads an unknown Warriorb will rise...\\\"\"\nmsgstr \"“И с распространением Тьмы восстанет неизвестный воин Уорриорб…”\"\n\n#. Key:\tescape_darkness_completed_subtitle\n#. SourceLocation:\tLocalization/StringTables/Episodes.csv\n#: Localization/StringTables/Episodes.csv\nmsgctxt \"Episodes\"\nmsgid \"Escaped from Darkness\"\nmsgstr \"Сбежавший от Тьмы\"\n\n#. Key:\tescape_darkness_desc\n#. SourceLocation:\tLocalization/StringTables/Episodes.csv\n#: Localization/StringTables/Episodes.csv\nmsgctxt \"Episodes\"\nmsgid \"Are you fast enough to race against Darkness itself?\"\nmsgstr \"Достаточно ли ты быстр, чтобы противостоять самой Тьме?\"\n\n#. Key:\tescape_darkness_friendly_name\n#. SourceLocation:\tLocalization/StringTables/Episodes.csv\n#: Localization/StringTables/Episodes.csv\nmsgctxt \"Episodes\"\nmsgid \"Escape Darkness\"\nmsgstr \"Побег из Тьмы\"\n\n#. Key:\twhite_wall_completed_desc\n#. SourceLocation:\tLocalization/StringTables/Episodes.csv\n#. InfoMetaData:\t\"Comment\" : \"short text on the ending panel when player finishes this episode\"\n#: Localization/StringTables/Episodes.csv\nmsgctxt \"Episodes\"\nmsgid \"What happened beyond the portal is another story, which will be told at another time.\"\nmsgstr \"Что произошло за порталом - это другая история, которая будет рассказана в другое время.\"\n\n#. Key:\twhite_wall_completed_subtitle\n#. SourceLocation:\tLocalization/StringTables/Episodes.csv\n#. InfoMetaData:\t\"Comment\" : \"subtitle of the ending panel when player finishes this episode\"\n#. Key:\twhite_wall_friendly_name\n#. InfoMetaData:\t\"Comment\" : \"name the episode is displayed with in the ui\"\n#: Localization/StringTables/Episodes.csv\nmsgctxt \"Episodes\"\nmsgid \"White Wall\"\nmsgstr \"Белая Стена\"\n\n#. Key:\twhite_wall_desc\n#. SourceLocation:\tLocalization/StringTables/Episodes.csv\n#. InfoMetaData:\t\"Comment\" : \"map desc when the player can select the episode\"\n#: Localization/StringTables/Episodes.csv\nmsgctxt \"Episodes\"\nmsgid \"Although it's long abandoned the fortress of White Wall still stands against Ruin. After centuries of silence some groups of unexpected visitors broke the loneliness of the decaying city.\"\nmsgstr \"Несмотря на то, что крепость Белой Стены уже давно заброшена, она все еще противостоит Руин. После столетий тишины ряд неизвестных посетителей рассеяли одиночество угасающего города.\"\n\n#. Key:\twhite_wall_loadingscreen_desc\n#. SourceLocation:\tLocalization/StringTables/Episodes.csv\n#. InfoMetaData:\t\"Comment\" : \"text on loading screen\"\n#: Localization/StringTables/Episodes.csv\nmsgctxt \"Episodes\"\nmsgid \"After months of researching I found a way to return back to the Ruined Realm. Ironically enough I have to use the same body I was trapped in before. I'll need to be quick and clever for this might be my very last chance to stop Ruin before it devours the World.\"\nmsgstr \"После нескольких месяцев исследований я нашел способ вернуться в Разрушенное царство. По иронии судьбы, мне придется использовать то же самое тело, внутри которого я уже был в ловушке. Я должен быть быстр и умен, так как это может стать моим последним шансом остановить Руин, прежде чем он поглотит мир.\"\n\n#. Key:\tchar_vo_armourwrath_attack_clap\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I won't fail the Maker!\"\nmsgstr \"Я не подведу Создателя!\"\n\n#. Key:\tchar_vo_armourwrath_attack_die\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"No... I'm still... perfect\"\nmsgstr \"Нет… Я все еще… совершенен…\"\n\n#. Key:\tchar_vo_armourwrath_attack_magic\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Resist Ruin!\"\nmsgstr \"Противостоять Руину!\"\n\n#. Key:\tchar_vo_armourwrath_attack_strike_down\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Out of my way!\"\nmsgstr \"Прочь с дороги!\"\n\n#. Key:\tchar_vo_armourwrath_attack_strike_down_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I am perfect\"\nmsgstr \"Я совершенен\"\n\n#. Key:\tchar_vo_dwarvenstatue_attack_axe_point\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I keep Ruin\"\nmsgstr \"Я храню Руин\"\n\n#. Key:\tchar_vo_dwarvenstatue_attack_axe_strike_down\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"We are above the Law!\"\nmsgstr \"Мы превыше Закона!\"\n\n#. Key:\tchar_vo_dwarvenstatue_attack_meteor\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I can take more!\"\nmsgstr \"Я могу выдержать больше!\"\n\n#. Key:\tchar_vo_dwarvenstatue_die\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I won't move... again\"\nmsgstr \"Я не сдвинусь с места… снова\"\n\n#. Key:\tchar_vo_dwarvenstatue_shield_knock\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I hold it back!\"\nmsgstr \"Я сдерживаю его!\"\n\n#. Key:\tchar_vo_fallendruid_attack_flybug\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"It's safe here.\"\nmsgstr \"Здесь безопасно.\"\n\n#. Key:\tchar_vo_fallendruid_attack_spike\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"This place shall stand!\"\nmsgstr \"Это место должно выстоять!\"\n\n#. Key:\tchar_vo_fallendruid_attack_tendril\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Nature will survive!\"\nmsgstr \"Природа \\nвыстоит!\"\n\n#. Key:\tchar_vo_fallendruid_attack_thorn_sphere\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Out with you, Ruin!\"\nmsgstr \"Проваливай, Руин!\"\n\n#. Key:\tchar_vo_fallendruid_die\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I have... failed\"\nmsgstr \"Я… подвел\"\n\n#. Key:\tchar_vo_final_boss_p1_blue\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#. Key:\tchar_vo_final_boss_p2_blue\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I'm the daughter of the Wizard!\"\nmsgstr \"Я дочь Волшебника!\"\n\n#. Key:\tchar_vo_final_boss_p1_green\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#. Key:\tchar_vo_final_boss_p2_red_up\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I can create!\"\nmsgstr \"Я могу создавать!\"\n\n#. Key:\tchar_vo_final_boss_p1_red\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I'm human!\"\nmsgstr \"Я человек!\"\n\n#. Key:\tchar_vo_final_boss_p2_green\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#. Key:\tchar_vo_final_boss_p3_green\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"That sounds funny!\"\nmsgstr \"Звучит забавно!\"\n\n#. Key:\tchar_vo_final_boss_p2_red_down\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I can destroy!\"\nmsgstr \"Я могу уничтожать!\"\n\n#. Key:\tchar_vo_final_boss_p3_blue\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I'm free!\"\nmsgstr \"Я свободен!\"\n\n#. Key:\tchar_vo_final_boss_p3_red\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"What makes you say that?\"\nmsgstr \"О чем ты говоришь?\"\n\n#. Key:\tchar_vo_fishy_idle_hiss\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Hissing\"\nmsgstr \"Шипеть\"\n\n#. Key:\tchar_vo_flybug_attack_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Huh! Surprised?\"\nmsgstr \"Ха! Удивлен?\"\n\n#. Key:\tchar_vo_flybug_attack_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Take this!\"\nmsgstr \"Получай!\"\n\n#. Key:\tchar_vo_flybug_damaged_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Careful!\"\nmsgstr \"Осторожно!\"\n\n#. Key:\tchar_vo_flybug_damaged_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"It's not funny!\"\nmsgstr \"Не смешно!\"\n\n#. Key:\tchar_vo_flybug_die_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"All right, gg!\"\nmsgstr \"Отлично, хорошая игра!\"\n\n#. Key:\tchar_vo_flybug_idle_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"What is it like down there? Heh?\"\nmsgstr \"Каково там внизу? А?\"\n\n#. Key:\tchar_vo_flybug_idle_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Easy man, easy!\"\nmsgstr \"Полегче, мужик, полегче!\"\n\n#. Key:\tchar_vo_gatekeeper_attack_aimed\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Avoid these!\"\nmsgstr \"Избегай их!\"\n\n#. Key:\tchar_vo_gatekeeper_attack_aimed_phase_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Watch out where you bounce to!\"\nmsgstr \"Будь осторожен, куда прыгаешь!\"\n\n#. Key:\tchar_vo_gatekeeper_attack_electric_bubbles\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Attention to the heights!\"\nmsgstr \"Внимание на высоты!\"\n\n#. Key:\tchar_vo_gatekeeper_attack_electric_bubbles_phase_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Attention to the heights again!\"\nmsgstr \"Осторожно, опять высоты!\"\n\n#. Key:\tchar_vo_gatekeeper_attack_meteors\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Watch out for your head!\"\nmsgstr \"Осторожнее с головой!\"\n\n#. Key:\tchar_vo_gatekeeper_attack_shield\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Do you really think you are worthy?\"\nmsgstr \"Ты правда считаешь себя достойным?\"\n\n#. Key:\tchar_vo_ghostarmor__die\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I... don't...\"\nmsgstr \"Я…не…\"\n\n#. Key:\tchar_vo_ghostarmor_attack_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"You shall perish!\"\nmsgstr \"Ты должен быть уничтожен!\"\n\n#. Key:\tchar_vo_ghostarmor_attack_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"For justice!\"\nmsgstr \"За справедливость!\"\n\n#. Key:\tchar_vo_ghostarmor_attack_fall\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Death to the outlaw!\"\nmsgstr \"Смерть преступнику!\"\n\n#. Key:\tchar_vo_ghostarmor_damaged_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Just a scratch.\"\nmsgstr \"Просто царапина.\"\n\n#. Key:\tchar_vo_ghostarmor_damaged_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"You... can't.\"\nmsgstr \"Ты…не можешь.\"\n\n#. Key:\tchar_vo_ghostarmor_idle_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"We keep the Wall.\"\nmsgstr \"Мы сохраним Стену.\"\n\n#. Key:\tchar_vo_ghostarmor_idle_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Follow the rules!\"\nmsgstr \"Следуй правилам!\"\n\n#. Key:\tchar_vo_ghosthelmet_attack_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Aaaaaaargh!\"\nmsgstr \"Ааааарррр!\"\n\n#. Key:\tchar_vo_ghosthelmet_attack_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Chaaaaaarge!\"\nmsgstr \"Заряжааааай!\"\n\n#. Key:\tchar_vo_ghosthelmet_damaged_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I'll need a blacksmith!\"\nmsgstr \"Мне нужен кузнец!\"\n\n#. Key:\tchar_vo_ghosthelmet_damaged_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Send someone for a hammer!\"\nmsgstr \"Пошли кого-нибудь за молотком!\"\n\n#. Key:\tchar_vo_ghosthelmet_die\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Be right back!\"\nmsgstr \"Скоро вернусь!\"\n\n#. Key:\tchar_vo_ghosthelmet_idle_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Use your head... or mine!\"\nmsgstr \"Думай своей головой… или моей!\"\n\n#. Key:\tchar_vo_ghosthelmet_idle_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Let's head east!\"\nmsgstr \"Поехали на восток!\"\n\n#. Key:\tchar_vo_gnory_idle_humming\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Humming\"\nmsgstr \"Напевать под нос\"\n\n#. Key:\tchar_vo_gnory_idle_whistle\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Whistling\"\nmsgstr \"Свистит\"\n\n#. Key:\tchar_vo_golemmaker_idle_explain_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I create essence which resists the ruin.\"\nmsgstr \"Я создаю сущность, которая противостоит Руине.\"\n\n#. Key:\tchar_vo_golemmaker_idle_mindlessly_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Knowledge is Lost, All is Lost.\"\nmsgstr \"Знания потеряны, все потеряно.\"\n\n#. Key:\tchar_vo_golemmaker_idle_mindlessly_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"All is Lost.\"\nmsgstr \"Все Потеряно.\"\n\n#. Key:\tchar_vo_golemmaker_idle_moan_aaahhh\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Aaahhh\"\nmsgstr \"Аааххх\"\n\n#. Key:\tchar_vo_golemmaker_idle_moan_ooohhh\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Ooohhh\"\nmsgstr \"Оооохх\"\n\n#. Key:\tchar_vo_golemmaker_idle_sad_onon\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Onon\"\nmsgstr \"Ооон\"\n\n#. Key:\tchar_vo_golemmaker_idle_tries_to_remember\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Your words remind me of something.\"\nmsgstr \"Твои слова мне кое о чем напоминают.\"\n\n#. Key:\tchar_vo_koboldchef_idle_01\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Too hot!\"\nmsgstr \"Слишком горячо!\"\n\n#. Key:\tchar_vo_koboldchef_idle_02\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"It needs more salt!\"\nmsgstr \"Нужно больше соли!\"\n\n#. Key:\tchar_vo_koboldchef_idle_03\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"It will be delicious.\"\nmsgstr \"Будет очень вкусно.\"\n\n#. Key:\tchar_vo_koboldchef_idle_04\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Hmm...\"\nmsgstr \"Ммм…\"\n\n#. Key:\tchar_vo_lory_idle_croon\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Croon\"\nmsgstr \"Напевать\"\n\n#. Key:\tchar_vo_lory_idle_humming_0\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Ohh\"\nmsgstr \"Ох\"\n\n#. Key:\tchar_vo_lory_idle_humming_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#. Key:\tchar_vo_supperdwarf_idle_2_humming_1\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Hmmm\"\nmsgstr \"Хммм\"\n\n#. Key:\tchar_vo_lory_idle_humming_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Ommm\"\nmsgstr \"Омммм\"\n\n#. Key:\tchar_vo_lory_idle_humming_3\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Auch\"\nmsgstr \"Ай\"\n\n#. Key:\tchar_vo_maintainer_attack_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Dinner is served!\"\nmsgstr \"Ужин подан!\"\n\n#. Key:\tchar_vo_maintainer_attack_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Now it's clean!\"\nmsgstr \"Теперь все чисто!\"\n\n#. Key:\tchar_vo_maintainer_damaged_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I'll need to be repaired.\"\nmsgstr \"Меня нужно будет починить.\"\n\n#. Key:\tchar_vo_maintainer_damaged_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I still serve.\"\nmsgstr \"Я все еще обслуживаю.\"\n\n#. Key:\tchar_vo_maintainer_die\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I'll need... replacement.\"\nmsgstr \"Мне понадобится… замена.\"\n\n#. Key:\tchar_vo_maintainer_elite_idle_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Serve...\"\nmsgstr \"Подавать…\"\n\n#. Key:\tchar_vo_maintainer_elite_idle_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Order...\"\nmsgstr \"Заказ…\"\n\n#. Key:\tchar_vo_maintainer_idle_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"At your service.\"\nmsgstr \"К вашим услугам.\"\n\n#. Key:\tchar_vo_maintainer_idle_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Your order?\"\nmsgstr \"Ваш заказ?\"\n\n#. Key:\tchar_vo_maintainer_miniboss_attack_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"This is my order!\"\nmsgstr \"Это мой приказ!\"\n\n#. Key:\tchar_vo_maintainer_miniboss_attack_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I'll reorganize!\"\nmsgstr \"Я переделаю!\"\n\n#. Key:\tchar_vo_maintainer_miniboss_attack_meteor\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I'm above!\"\nmsgstr \"Я наверху!\"\n\n#. Key:\tchar_vo_maintainer_miniboss_attack_spawn_enemy\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Order, order, order!\"\nmsgstr \"Заказ, заказ, заказ!\"\n\n#. Key:\tchar_vo_maintainer_miniboss_damaged_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I can fix this\"\nmsgstr \"Я могу это исправить\"\n\n#. Key:\tchar_vo_maintainer_miniboss_damaged_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Don't do that again!\"\nmsgstr \"Больше так не делай!\"\n\n#. Key:\tchar_vo_maintainer_miniboss_die\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I can't... I was... above.\"\nmsgstr \"Я не могу… Я был… наверху.\"\n\n#. Key:\tchar_vo_primitivefishy_attack_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Srrrr!\"\nmsgstr \"Грррр!\"\n\n#. Key:\tchar_vo_primitivefishy_attack_long_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Hurray!\"\nmsgstr \"Ура!\"\n\n#. Key:\tchar_vo_primitivefishy_attack_long_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Flyyyyyyy!\"\nmsgstr \"Летиииии!\"\n\n#. Key:\tchar_vo_primitivefishy_damaged_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Uuush!\"\nmsgstr \"Уууш!\"\n\n#. Key:\tchar_vo_primitivefishy_damaged_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Shish!\"\nmsgstr \"Шшш!\"\n\n#. Key:\tchar_vo_primitivefishy_die\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Fishy leaves.\"\nmsgstr \"Фиши покинул нас.\"\n\n#. Key:\tchar_vo_primitivefishy_idle_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I need some fish!\"\nmsgstr \"Мне нужно немного рыбы!\"\n\n#. Key:\tchar_vo_primitivefishy_idle_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Did you hear that?\"\nmsgstr \"Ты это слышал?\"\n\n#. Key:\tchar_vo_shade_attack_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Join me!\"\nmsgstr \"Присоединяйся!\"\n\n#. Key:\tchar_vo_shade_attack_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"You shall die too!\"\nmsgstr \"Ты тоже должен умереть!\"\n\n#. Key:\tchar_vo_shade_damaged_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Is this the end?\"\nmsgstr \"Это конец?\"\n\n#. Key:\tchar_vo_shade_damaged_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Pain...\"\nmsgstr \"Боль…\"\n\n#. Key:\tchar_vo_shade_die\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Death... again?!\"\nmsgstr \"Смерть… снова?!\"\n\n#. Key:\tchar_vo_shade_idle_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I can't rest.\"\nmsgstr \"Я не могу отдохнуть.\"\n\n#. Key:\tchar_vo_shade_idle_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Death is not peace.\"\nmsgstr \"Смерть - это не покой.\"\n\n#. Key:\tchar_vo_shadesphere_attack_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I'll change you!\"\nmsgstr \"Я изменю тебя!\"\n\n#. Key:\tchar_vo_shadesphere_attack_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Do not resist me!\"\nmsgstr \"Не сопротивляйся!\"\n\n#. Key:\tchar_vo_shadesphere_damaged_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"It's still... me...\"\nmsgstr \"Это все еще…я…\"\n\n#. Key:\tchar_vo_shadesphere_damaged_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Why did you...?\"\nmsgstr \"Почему ты…?\"\n\n#. Key:\tchar_vo_shadesphere_die\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"You changed... me?\"\nmsgstr \"Ты изменил…меня?\"\n\n#. Key:\tchar_vo_shadesphere_idle_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"What do you wish to be?\"\nmsgstr \"Кем ты хочешь быть?\"\n\n#. Key:\tchar_vo_shadesphere_idle_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Come to me!\"\nmsgstr \"Подойди ко мне!\"\n\n#. Key:\tchar_vo_supperdwarf_idle_1_eating_food_0\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Yum-yum hmmmm... delicious\"\nmsgstr \"Ням-ням… вкусно\"\n\n#. Key:\tchar_vo_supperdwarf_idle_1_eating_food_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Hmmm... tasty\"\nmsgstr \"Хм… вкусно\"\n\n#. Key:\tchar_vo_supperdwarf_idle_1_eating_food_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Ehmmm... where is my spoon?\"\nmsgstr \"Эммм… где моя ложка?\"\n\n#. Key:\tchar_vo_supperdwarf_idle_2_humming_0\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Ehemm, ehemm\"\nmsgstr \"Кхмм, кхмм\"\n\n#. Key:\tchar_vo_supperdwarf_idle_2_humming_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Ohm\"\nmsgstr \"Охм\"\n\n#. Key:\tchar_vo_teachy_idle_book_down_0\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Walking ball?\"\nmsgstr \"Ходячий шар?\"\n\n#. Key:\tchar_vo_teachy_idle_book_down_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"You?\"\nmsgstr \"Ты?\"\n\n#. Key:\tchar_vo_teachy_idle_book_down_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Do you exist outside of my mind?\"\nmsgstr \"Существуешь ли ты вне моего сознания?\"\n\n#. Key:\tchar_vo_teachy_idle_book_down_3\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Ehm, what?\"\nmsgstr \"Эмм, что?\"\n\n#. Key:\tchar_vo_teachy_idle_book_up_0\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Ehmm\"\nmsgstr \"Эмм\"\n\n#. Key:\tchar_vo_teachy_idle_book_up_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Humm\"\nmsgstr \"Хамм\"\n\n#. Key:\tchar_vo_teachy_idle_book_up_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Hemm\"\nmsgstr \"Хемм\"\n\n#. Key:\tchar_vo_teachy_idle_book_up_3\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Ahm\"\nmsgstr \"Ахм\"\n\n#. Key:\tchar_vo_teachy_idle_humming_0\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Hmmm-hmmm-hmm\"\nmsgstr \"Хмм-хмм-хмм\"\n\n#. Key:\tchar_vo_teachy_idle_humming_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Ehmm-hmmm-uhmm\"\nmsgstr \"Эмм-хммм-аммм\"\n\n#. Key:\tchar_vo_teachy_idle_humming_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Umm-huhummm\"\nmsgstr \"Умм-хуммумм\"\n\n#. Key:\tchar_vo_teachy_idle_humming_speaking_long_0\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I am, therefore I think!\"\nmsgstr \"Я существую, значит, я думаю!\"\n\n#. Key:\tchar_vo_teachy_idle_humming_speaking_long_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I think... I am...\"\nmsgstr \"Я думаю... Я...\"\n\n#. Key:\tchar_vo_teachy_idle_humming_speaking_long_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"The unexamined life is not worth living!\"\nmsgstr \"Неисследованная жизнь не стоит того, чтобы ее проживать!\"\n\n#. Key:\tchar_vo_teachy_idle_humming_speaking_long_3\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"The mind is furnished with ideas by a drunk upholsterer...\"\nmsgstr \"Разум наполнен идеями пьяного обивщика...\"\n\n#. Key:\tchar_vo_teachy_idle_humming_speaking_short_0\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Tic-tac\"\nmsgstr \"Тик-так\"\n\n#. Key:\tchar_vo_teachy_idle_humming_speaking_short_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"To be...\"\nmsgstr \"Быть…\"\n\n#. Key:\tchar_vo_teachy_idle_humming_speaking_short_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Weird\"\nmsgstr \"Странный\"\n\n#. Key:\tAnyKey\n#. SourceLocation:\tSource/SOrb/Settings/Input/SoInputNames.cpp:347\n#: Source/SOrb/Settings/Input/SoInputNames.cpp:347\nmsgctxt \"InputKeys\"\nmsgid \"Any Key\"\nmsgstr \"Любая клавиша\"\n\n#. Key:\tDown\n#. SourceLocation:\tSource/SOrb/Settings/Input/SoInputNames.cpp:376\n#: Source/SOrb/Settings/Input/SoInputNames.cpp:376\nmsgctxt \"InputKeys\"\nmsgid \"Down\"\nmsgstr \"Вниз\"\n\n#. Key:\tLeft\n#. SourceLocation:\tSource/SOrb/Settings/Input/SoInputNames.cpp:373\n#: Source/SOrb/Settings/Input/SoInputNames.cpp:373\nmsgctxt \"InputKeys\"\nmsgid \"Left\"\nmsgstr \"Влево\"\n\n#. Key:\tRight\n#. SourceLocation:\tSource/SOrb/Settings/Input/SoInputNames.cpp:375\n#: Source/SOrb/Settings/Input/SoInputNames.cpp:375\nmsgctxt \"InputKeys\"\nmsgid \"Right\"\nmsgstr \"Вправо\"\n\n#. Key:\tUp\n#. SourceLocation:\tSource/SOrb/Settings/Input/SoInputNames.cpp:374\n#: Source/SOrb/Settings/Input/SoInputNames.cpp:374\nmsgctxt \"InputKeys\"\nmsgid \"Up\"\nmsgstr \"Вверх\"\n\n#. Key:\tabsorb_energy\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Absorb Energy\"\nmsgstr \"Поглотить Энергию\"\n\n#. Key:\tacquired_few_item\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"message when more than one item is received at once\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"A few items acquired\"\nmsgstr \"Несколько приобретенных предметов\"\n\n#. Key:\tacquired_item\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"{0} is replaced with an item name\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"{0} acquired\"\nmsgstr \"{0} приобретено\"\n\n#. Key:\tactivate\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Activate\"\nmsgstr \"Активировать\"\n\n#. Key:\tactivate_elevator\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Activate Elevator\"\nmsgstr \"Запустить лифт\"\n\n#. Key:\taquired_silver_key\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"optional bonus message\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Silver Key Acquired\"\nmsgstr \"Приобретен Серебряный Ключ\"\n\n#. Key:\tascend\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"climb up a ladder or rope or go up with an elevator\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Ascend\"\nmsgstr \"Подняться\"\n\n#. Key:\tbed\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"examine Bed\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Bed\"\nmsgstr \"Кровать\"\n\n#. Key:\tboat_to_kitchen\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"use a boat to get to the kitchen\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Boat to the Kitchen\"\nmsgstr \"Лодка на кухню\"\n\n#. Key:\tboat_to_ruins\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"use a boat to get to a place where there are some ancient ruins\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Boat to the Ruins\"\nmsgstr \"Лодка к Руинам\"\n\n#. Key:\tboat_to_station\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"use a boat to get to the Station\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Boat to the Station\"\nmsgstr \"Лодка до Станции\"\n\n#. Key:\tcall_elevator\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Call Elevator\"\nmsgstr \"Вызывать Лифт\"\n\n#. Key:\tcandles\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"examine Candles\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Candles\"\nmsgstr \"Свечи\"\n\n#. Key:\tcat_bed\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"examine Tabbys (cat name) bed\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Tabby's Bed\"\nmsgstr \"Кровать Тэбби\"\n\n#. Key:\tchair\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"examine Chair\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Chair\"\nmsgstr \"Стул\"\n\n#. Key:\tchange_spells\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Change Spells\"\nmsgstr \"Поменять Заклинание\"\n\n#. Key:\tcharge\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"charge gem in Act I\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Charge\"\nmsgstr \"Заряд\"\n\n#. Key:\tcheck_door\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"check door \"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Check Door\"\nmsgstr \"Проверить Дверь\"\n\n#. Key:\tchest\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"examine Chest\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Chest\"\nmsgstr \"Сундук\"\n\n#. Key:\tchest_check\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Check Chest\"\nmsgstr \"Проверить Сундук\"\n\n#. Key:\tchest_check_small\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Check Small Chest\"\nmsgstr \"Проверить Маленький Сундук\"\n\n#. Key:\tchest_close\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Close Chest\"\nmsgstr \"Закрыть Сундук\"\n\n#. Key:\tchest_close_small\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Close Small Chest\"\nmsgstr \"Закрыть Маленький Сундук\"\n\n#. Key:\tchest_open\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Open Chest\"\nmsgstr \"Открыть Сундук\"\n\n#. Key:\tchest_open_small\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Open Small Chest\"\nmsgstr \"Открыть Маленький Сундук\"\n\n#. Key:\tclose_door\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Close Door\"\nmsgstr \"Закрыть Дверь\"\n\n#. Key:\tcross_planks\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Cross Planks\"\nmsgstr \"Пересечь Брусья\"\n\n#. Key:\tdads_room\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"examine Dad's Room\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Daddy's Room\"\nmsgstr \"Папина Комната\"\n\n#. Key:\tdescend\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"climb down a ladder or rope or go down with an elevator\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Descend\"\nmsgstr \"Спуститься\"\n\n#. Key:\tdestroy\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"destroy device in EndFinal level\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Destroy\"\nmsgstr \"Уничтожить\"\n\n#. Key:\tdevice\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"use Device\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Device\"\nmsgstr \"Устройство\"\n\n#. Key:\tdoor\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"examine Door\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Door\"\nmsgstr \"Дверь\"\n\n#. Key:\tdoor_does_not_open_from_this_side\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"message when character tries to open a door but it can only be openned from the other side\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Door does not open from this side!\"\nmsgstr \"Дверь не открывается с этой стороны!\"\n\n#. Key:\tdoor_opened\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"door openned\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Door opened\"\nmsgstr \"Дверь открыта\"\n\n#. Key:\tdrop\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"drop box or carryable\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Drop\"\nmsgstr \"Бросить\"\n\n#. Key:\televator_activated\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Elevator Activated\"\nmsgstr \"Лифт Активирован\"\n\n#. Key:\televator_inactive\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"player tries to use the elevator but it is inactive\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"The elevator seems to be inactive\"\nmsgstr \"Лифт, похоже, не работает\"\n\n#. Key:\televator_not_move_to_dir\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"player tries to use an elevator but the direction is not activated yet\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"The elevator does not move to the selected direction\"\nmsgstr \"Лифт не едет в заданном направлении\"\n\n#. Key:\tenter\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"teleport - enter a room or a portal\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Enter\"\nmsgstr \"Войти\"\n\n#. Key:\tenter_bridge\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Enter Bridge\"\nmsgstr \"Войти на Мост\"\n\n#. Key:\tenter_cave\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Enter Cave\"\nmsgstr \"Войти в Пещеру\"\n\n#. Key:\tenter_flames\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Enter Flames\"\nmsgstr \"Войти в Пламя\"\n\n#. Key:\tenter_gate\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Enter Gate\"\nmsgstr \"Войти в Ворота\"\n\n#. Key:\tenter_hut\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Enter Hut\"\nmsgstr \"Войти в Хижину\"\n\n#. Key:\tenter_kitchen\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Enter Kitchen\"\nmsgstr \"Войти на Кухню\"\n\n#. Key:\tenter_pipe\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Enter Pipe\"\nmsgstr \"Войти в Трубу\"\n\n#. Key:\tenter_portal\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Enter Portal\"\nmsgstr \"Войти в Портал\"\n\n#. Key:\tenter_stairs_left\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Enter Stairs on the Left\"\nmsgstr \"Войти по Лестнице Слева\"\n\n#. Key:\tenter_stairs_right\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Enter Stairs on the Right\"\nmsgstr \"Войти по Лестнице Справа\"\n\n#. Key:\tenter_tower\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Enter Tower\"\nmsgstr \"Войти в Башню\"\n\n#. Key:\tentrace_locked\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Entrance locked from the other side\"\nmsgstr \"Вход заблокирован с другой стороны\"\n\n#. Key:\texamine\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"examine a statue or some other interactable object which triggers dialogue or hint message\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Examine\"\nmsgstr \"Осмотреть\"\n\n#. Key:\texamine_device\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Examine Device\"\nmsgstr \"Осмотреть Устройство\"\n\n#. Key:\texamine_elevator\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Examine Elevator\"\nmsgstr \"Осмотреть Лифт\"\n\n#. Key:\texamine_switch\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"it is a lightswitch\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Examine Switch\"\nmsgstr \"Осмотреть Переключатель\"\n\n#. Key:\texit\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"exit room\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Exit\"\nmsgstr \"Выход\"\n\n#. Key:\texplore_stations\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Explore more stations before using the railway system.\"\nmsgstr \"Откройте для себя больше станций, прежде чем использовать железнодорожную систему.\"\n\n#. Key:\tfinish_demo\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"teleport at the end of demo\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Finish Demo\"\nmsgstr \"Закончить демо-версию\"\n\n#. Key:\tfire\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"fires a cannon\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Fire\"\nmsgstr \"Огонь\"\n\n#. Key:\tgo_down\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"go down the stairs\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Go down\"\nmsgstr \"Спуститься\"\n\n#. Key:\tgo_up\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"go up the stairs\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Go up\"\nmsgstr \"Пойти наверх\"\n\n#. Key:\tinspect_fountain\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Inspect Fountain\"\nmsgstr \"Проверить Фонтан\"\n\n#. Key:\tinventory\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"hint for hotkey to open the inventory\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Inventory\"\nmsgstr \"Инвентарь\"\n\n#. Key:\tkey_missing\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"{0} is the key name\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Key Missing: {0}\"\nmsgstr \"Отсутствуeт: {0}\"\n\n#. Key:\tkick_rope\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"a pile of rope can be kicked to be able to climb up/down on it\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Kick Rope\"\nmsgstr \"Пнуть Веревку\"\n\n#. Key:\tlaboratory\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"examine/enter Laboratory\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Laboratory\"\nmsgstr \"Лаборатория\"\n\n#. Key:\tlamps\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"examine Lamps\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Lamps\"\nmsgstr \"Лампы\"\n\n#. Key:\tleave\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"teleport - leave a room, chest, level\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Leave\"\nmsgstr \"Выйти\"\n\n#. Key:\tleave_bridge\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Leave Bridge\"\nmsgstr \"Выйти с Моста\"\n\n#. Key:\tleave_cave\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Leave Cave\"\nmsgstr \"Выйти из Пещеры\"\n\n#. Key:\tleave_circle\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Leave Circle\"\nmsgstr \"Выйти из Круга\"\n\n#. Key:\tleave_hut\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Leave Hut\"\nmsgstr \"Выйти из Хижины\"\n\n#. Key:\tleft_lever\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"use Left Lever\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Left Lever\"\nmsgstr \"Левый Рычаг\"\n\n#. Key:\tlever_is_active\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Lever activated. The crystal broke.\"\nmsgstr \"Рычаг активирован. Кристалл разбился.\"\n\n#. Key:\tlever_is_inactive\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"a lever\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Seems to be inactive\"\nmsgstr \"Похоже, что не работает\"\n\n#. Key:\tmemory_stone_aquire\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Acquire Memory Stone\"\nmsgstr \"Приобрести Камень Воспоминаний\"\n\n#. Key:\tmemory_stone_gained\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Memory Stone Gained\"\nmsgstr \"Камень Воспоминаний Приобретен\"\n\n#. Key:\tmiddle_lever\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"use Middle Lever \"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Middle Lever\"\nmsgstr \"Рычаг по Середине\"\n\n#. Key:\tmoms_room\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"examine Mom's Room\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Mom's Room\"\nmsgstr \"Мамина Комната\"\n\n#. Key:\tnotebook\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"examine Notebook\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Notebook\"\nmsgstr \"Дневник\"\n\n#. Key:\topen\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"door can be openned\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Open\"\nmsgstr \"Открыть\"\n\n#. Key:\topen_door\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Open Door\"\nmsgstr \"Открыть Дверь\"\n\n#. Key:\tpainting\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"examine Painting\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Painting\"\nmsgstr \"Картина\"\n\n#. Key:\tpaintings\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"examine Paintings\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Paintings\"\nmsgstr \"Картины\"\n\n#. Key:\tpass_bridge\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Pass Bridge\"\nmsgstr \"Перейти Мост\"\n\n#. Key:\tpick_up\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"pick up box or carryable\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Pick Up\"\nmsgstr \"Подобрать\"\n\n#. Key:\tplace_rope\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Place Rope\"\nmsgstr \"Положить Веревку\"\n\n#. Key:\tprimary_strike\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"hint with control key for strike 1 of the character\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Primary Strike\"\nmsgstr \"Основной Удар\"\n\n#. Key:\tpull\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"pull a lever\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Pull\"\nmsgstr \"Потянуть\"\n\n#. Key:\tpull_lever\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Pull Lever\"\nmsgstr \"Потянуть Рычаг\"\n\n#. Key:\tpush\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"push a sphere shaped rock from the edge to break some stuff\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Push\"\nmsgstr \"Толкнуть\"\n\n#. Key:\tput_weapon_away\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"hint with control key to show how to put the weapon away\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Put Weapon Away\"\nmsgstr \"Убрать Оружие\"\n\n#. Key:\tread\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"interaction hint if the character can read a scroll or book\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Read\"\nmsgstr \"Прочитать\"\n\n#. Key:\tread_dictionary\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Read Dictionary\"\nmsgstr \"Прочитать Словарь\"\n\n#. Key:\tread_symbols\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Read Symbols\"\nmsgstr \"Прочитать Символы\"\n\n#. Key:\trelease_keeper\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Release Keeper\"\nmsgstr \"Освободить Хранителя\"\n\n#. Key:\treplay_boss_fight\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"interaction hint to play a boss fight which was already won\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Replay Boss Fight\"\nmsgstr \"Воспроизвести Бой с Боссом\"\n\n#. Key:\treset_portals\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"lever\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Reset Portals\"\nmsgstr \"Сброс Порталов\"\n\n#. Key:\trest\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"rest near a checkpoint statue where character can sleep and change spells and listen to music\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Rest\"\nmsgstr \"Отдохнуть\"\n\n#. Key:\trestore\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"restore the HP\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Restore\"\nmsgstr \"Восстановить\"\n\n#. Key:\tright_lever\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"use Right Lever\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Right Lever\"\nmsgstr \"Правый Рычаг\"\n\n#. Key:\tring_bell\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"there is a bell the character has to use to start the conversation with a merchant\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Ring the bell\"\nmsgstr \"Позвонить в Колокол\"\n\n#. Key:\trope_can_be_placed\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"A rope could be placed here\"\nmsgstr \"Сюда можно поставить веревку\"\n\n#. Key:\trope_kicked\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"feedback on the kick rope action\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Rope kicked\"\nmsgstr \"Пнул Веревку\"\n\n#. Key:\trope_placed\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Rope placed\"\nmsgstr \"Веревка поставлена\"\n\n#. Key:\tsail\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"use ship for travel\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Sail\"\nmsgstr \"Отплыть\"\n\n#. Key:\tsoulkeeper_released\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Soulkeeper released\"\nmsgstr \"Хранитель Душ Освобожден\"\n\n#. Key:\tspecial_strike\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"hint with control key for strike 2 of the character\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Special Strike\"\nmsgstr \"Специальный Удар\"\n\n#. Key:\tstairs\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"enter stairs\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Stairs\"\nmsgstr \"Лестница\"\n\n#. Key:\tstone_added\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"{0} is the stone amount, {1} is the stone name\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"{0} {1} added to your bag!\"\nmsgstr \"{0} {1} добавлено в твою сумку!\"\n\n#. Key:\tstone_cant_carry\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"{0} is the stone name\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"You can't carry more {0}\"\nmsgstr \"Ты не можешь нести больше {0}\"\n\n#. Key:\tstone_cant_store\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"{0} is the stone name\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"You don't have anything you could use to store {0}\"\nmsgstr \"У тебя нет ничего, что можно было бы использовать для хранения {0}\"\n\n#. Key:\tswing\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"Swings on the pole with the arms\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Swing\"\nmsgstr \"Качаться\"\n\n#. Key:\tswitch_interact\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"Switch interact alternative,  between the two modes\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Switch\"\nmsgstr \"Переключить\"\n\n#. Key:\ttake\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"character can take an item\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Take\"\nmsgstr \"Взять\"\n\n#. Key:\ttake_a_seat\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Take a seat\"\nmsgstr \"Сесть\"\n\n#. Key:\ttake_abacus\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Take Abacus\"\nmsgstr \"Взять Абакус\"\n\n#. Key:\ttake_all\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Take All\"\nmsgstr \"Взять Все\"\n\n#. Key:\ttake_axe\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"character can take a weapon\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Take Axe\"\nmsgstr \"Взять Топор\"\n\n#. Key:\ttake_blades\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"character can take two swords to go dual wield\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Take Blades\"\nmsgstr \"Взять Клинки\"\n\n#. Key:\ttake_books\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"character can take (two) books\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Take Books\"\nmsgstr \"Взять Книги\"\n\n#. Key:\ttake_mace\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"character can take a weapon\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Take Mace\"\nmsgstr \"Взять Жезл\"\n\n#. Key:\ttake_mushrooms\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Take Mushrooms\"\nmsgstr \"Взять Грибы\"\n\n#. Key:\ttake_rope\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Take Rope\"\nmsgstr \"Взять Веревку\"\n\n#. Key:\ttake_sabre\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"character can take a weapon\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Take Sabre\"\nmsgstr \"Взять Саблю\"\n\n#. Key:\ttake_spellcaster\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"the Spellcaster is an amulet the character can use to cast spells\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Take Spellcaster\"\nmsgstr \"Взять Заклинатель Заклинаний\"\n\n#. Key:\ttake_stones\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Take Stones\"\nmsgstr \"Взять Камни\"\n\n#. Key:\ttake_sword\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"character can take a weapon\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Take Sword\"\nmsgstr \"Взять Меч\"\n\n#. Key:\ttake_wheel\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Take Wheel\"\nmsgstr \"Взять Колесо\"\n\n#. Key:\ttalk\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Talk\"\nmsgstr \"Поговорить\"\n\n#. Key:\ttoggle_switch\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"it is a lightswitch\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Toggle Switch\"\nmsgstr \"Тумблер\"\n\n#. Key:\ttouch_statue\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Touch Statue\"\nmsgstr \"Прикоснуться к Статуе\"\n\n#. Key:\ttravel\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"travel on the train station path\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Travel\"\nmsgstr \"Путешествовать\"\n\n#. Key:\tunlocked_with\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"{0} is the key name\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Unlocked with {0}\"\nmsgstr \"Открыт с {0}\"\n\n#. Key:\tuse\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"use device in EndFinal level\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Use\"\nmsgstr \"Использовать\"\n\n#. Key:\tuse_active_item\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"uses the active item\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Use Active Item\"\nmsgstr \"Использовать Активный Элемент\"\n\n#. Key:\tuse_crystal\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Use Crystal\"\nmsgstr \"Использовать Кристалл\"\n\n#. Key:\tuse_destroy_explained\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Destroy the device to save the creatures of Ruined Realm\"\nmsgstr \"Уничтожить устройство, чтобы спасти существ из Разрушенного Царства\"\n\n#. Key:\tuse_device\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Use Device\"\nmsgstr \"Использовать Устройство\"\n\n#. Key:\tuse_elevator\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Use Elevator\"\nmsgstr \"Использовать Лифт\"\n\n#. Key:\tuse_elevator_gem\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Use Elevator Gem\"\nmsgstr \"Использовать Самоцвет Лифта\"\n\n#. Key:\tuse_magic_mirror\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Use Magic Mirror\"\nmsgstr \"Использовать Волшебное Зеркало\"\n\n#. Key:\tuse_separate_explained\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Use the device to separate the Realms\"\nmsgstr \"Использовать устройство чтобы разделить Царства\"\n\n#. Key:\tuse_switch\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"for the moria gate\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Use switch\"\nmsgstr \"Использовать Переключатель\"\n\n#. Key:\tuse_workshop\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Use Workshop\"\nmsgstr \"Использовать Мастерскую\"\n\n#. Key:\twheel_release\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"release lever wheel\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Release\"\nmsgstr \"Отпустить\"\n\n#. Key:\twheel_turn\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"turn lever wheel\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Turn\"\nmsgstr \"Повернуть\"\n\n#. Key:\twindow\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"examine Window\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Window\"\nmsgstr \"Окно\"\n\n#. Key:\tworkroom\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"examine/enter Workroom\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Workroom\"\nmsgstr \"Мастерская\"\n\n#. Key:\tyou_are_worthy\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"gate golem tutorial level message interaction\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"You are not worthy!\"\nmsgstr \"Ты недостоин!\"\n\n#. Key:\tice_stone_Name\n#. SourceLocation:\tLocalization/StringTables/Items.csv\n#: Localization/StringTables/Items.csv\nmsgctxt \"Items\"\nmsgid \"Ice Stone\"\nmsgstr \"Ледяной Камень\"\n\n#. Key:\ttest_stone_name\n#. SourceLocation:\tLocalization/StringTables/Items.csv\n#: Localization/StringTables/Items.csv\nmsgctxt \"Items\"\nmsgid \"Test Stone\"\nmsgstr \"Пробный камень\"\n\n#. Key:\tbook\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:494\n#: Source/SOrb/Basic/SoGameSingleton.cpp:494\nmsgctxt \"ItemsCommon\"\nmsgid \"Something to read\"\nmsgstr \"Что-нибудь почитать\"\n\n#. Key:\tcooldown\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:501\n#: Source/SOrb/Basic/SoGameSingleton.cpp:501\nmsgctxt \"ItemsCommon\"\nmsgid \"Cooldown\"\nmsgstr \"Остывать\"\n\n#. Key:\tcrossbow\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:487\n#: Source/SOrb/Basic/SoGameSingleton.cpp:487\nmsgctxt \"ItemsCommon\"\nmsgid \"Something to shoot with\"\nmsgstr \"Что-нибудь для стрельбы\"\n\n#. Key:\tdefensive\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:472\n#: Source/SOrb/Basic/SoGameSingleton.cpp:472\nmsgctxt \"ItemsCommon\"\nmsgid \"Shard of Protection\"\nmsgstr \"Осколок Защиты\"\n\n#. Key:\tdualwield\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:480\n#: Source/SOrb/Basic/SoGameSingleton.cpp:480\nmsgctxt \"ItemsCommon\"\nmsgid \"Dual Wield Weapon\"\nmsgstr \"Двойное Оружие\"\n\n#. Key:\thealth\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:498\n#: Source/SOrb/Basic/SoGameSingleton.cpp:498\nmsgctxt \"ItemsCommon\"\nmsgid \"Health\"\nmsgstr \"Здоровье\"\n\n#. Key:\tinvalid_shard_max\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:475\n#: Source/SOrb/Basic/SoGameSingleton.cpp:475\nmsgctxt \"ItemsCommon\"\nmsgid \"Invalid\"\nmsgstr \"Недоступный\"\n\n#. Key:\tinvalid_weapon_max\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:481\n#: Source/SOrb/Basic/SoGameSingleton.cpp:481\nmsgctxt \"ItemsCommon\"\nmsgid \"Invalid Weapon\"\nmsgstr \"Недоступное Оружие\"\n\n#. Key:\titem\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:492\n#. Key:\tkeylikeitem\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:491\n#: Source/SOrb/Basic/SoGameSingleton.cpp:491\n#: Source/SOrb/Basic/SoGameSingleton.cpp:492\nmsgctxt \"ItemsCommon\"\nmsgid \"Something interesting\"\nmsgstr \"Кое-что интересное\"\n\n#. Key:\tjewelry\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:469\n#: Source/SOrb/Basic/SoGameSingleton.cpp:469\nmsgctxt \"ItemsCommon\"\nmsgid \"Valuable\"\nmsgstr \"Ценный\"\n\n#. Key:\tkey\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:466\n#: Source/SOrb/Basic/SoGameSingleton.cpp:466\nmsgctxt \"ItemsCommon\"\nmsgid \"Key\"\nmsgstr \"Ключ\"\n\n#. Key:\tMemoryStone\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:465\n#: Source/SOrb/Basic/SoGameSingleton.cpp:465\nmsgctxt \"ItemsCommon\"\nmsgid \"Memory Stone\"\nmsgstr \"Камень Воспоминаний\"\n\n#. Key:\toffensive\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:473\n#: Source/SOrb/Basic/SoGameSingleton.cpp:473\nmsgctxt \"ItemsCommon\"\nmsgid \"Shard of Justice\"\nmsgstr \"Осколок Справедливости\"\n\n#. Key:\tonehanded\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:478\n#: Source/SOrb/Basic/SoGameSingleton.cpp:478\nmsgctxt \"ItemsCommon\"\nmsgid \"One-Handed Weapon\"\nmsgstr \"Одноручное оружие\"\n\n#. Key:\tpotion\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:484\n#: Source/SOrb/Basic/SoGameSingleton.cpp:484\nmsgctxt \"ItemsCommon\"\nmsgid \"Something to drink\"\nmsgstr \"Что-нибудь выпить\"\n\n#. Key:\tQuestItem\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:464\n#: Source/SOrb/Basic/SoGameSingleton.cpp:464\nmsgctxt \"ItemsCommon\"\nmsgid \"Quest Item\"\nmsgstr \"Квест Предмет\"\n\n#. Key:\tRuneStone\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:467\n#: Source/SOrb/Basic/SoGameSingleton.cpp:467\nmsgctxt \"ItemsCommon\"\nmsgid \"Runestone\"\nmsgstr \"Рунный Камень\"\n\n#. Key:\tshard\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:462\n#: Source/SOrb/Basic/SoGameSingleton.cpp:462\nmsgctxt \"ItemsCommon\"\nmsgid \"Shard\"\nmsgstr \"Осколок\"\n\n#. Key:\tsomething_unlock\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:490\n#: Source/SOrb/Basic/SoGameSingleton.cpp:490\nmsgctxt \"ItemsCommon\"\nmsgid \"Something to unlock with\"\nmsgstr \"Что-нибудь, с чем можно открыть\"\n\n#. Key:\tspecial\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:474\n#: Source/SOrb/Basic/SoGameSingleton.cpp:474\nmsgctxt \"ItemsCommon\"\nmsgid \"Shard of Wonder\"\nmsgstr \"Осколок Чуда\"\n\n#. Key:\tspeed\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:497\n#: Source/SOrb/Basic/SoGameSingleton.cpp:497\nmsgctxt \"ItemsCommon\"\nmsgid \"Attack Speed\"\nmsgstr \"Скорость Атаки\"\n\n#. Key:\tspell\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:486\n#: Source/SOrb/Basic/SoGameSingleton.cpp:486\nmsgctxt \"ItemsCommon\"\nmsgid \"Something to cast with\"\nmsgstr \"Что-нибудь для заклинания\"\n\n#. Key:\tspellcapacitycost\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:499\n#: Source/SOrb/Basic/SoGameSingleton.cpp:499\nmsgctxt \"ItemsCommon\"\nmsgid \"Capacity Cost\"\nmsgstr \"Стоимость Мощность\"\n\n#. Key:\tspellusagecount\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:500\n#: Source/SOrb/Basic/SoGameSingleton.cpp:500\nmsgctxt \"ItemsCommon\"\nmsgid \"Charge\"\nmsgstr \"Charge\"\n\n#. Key:\tthrowable\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:485\n#: Source/SOrb/Basic/SoGameSingleton.cpp:485\nmsgctxt \"ItemsCommon\"\nmsgid \"Something to throw\"\nmsgstr \"Что-нибудь бросить\"\n\n#. Key:\ttwohanded\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:479\n#: Source/SOrb/Basic/SoGameSingleton.cpp:479\nmsgctxt \"ItemsCommon\"\nmsgid \"Two-Handed Weapon\"\nmsgstr \"Двуручное Оружие\"\n\n#. Key:\tusable\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:463\n#: Source/SOrb/Basic/SoGameSingleton.cpp:463\nmsgctxt \"ItemsCommon\"\nmsgid \"Usable\"\nmsgstr \"Пригодный\"\n\n#. Key:\tweapon\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:468\n#: Source/SOrb/Basic/SoGameSingleton.cpp:468\nmsgctxt \"ItemsCommon\"\nmsgid \"Weapon\"\nmsgstr \"Оружие\"\n\n#. Key:\tmus1_combat_1_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(6).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(6).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Disfunctional Golems\"\nmsgstr \"Неисправные Големы\"\n\n#. Key:\tmus1_combat_2_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(16).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(16).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Machine Rage\"\nmsgstr \"Машинная Ярость\"\n\n#. Key:\tmus1_combat_GateKeeper_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(2).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(2).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Worthy\"\nmsgstr \"Достойный\"\n\n#. Key:\tmus1_dlg_Generic_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(7).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(7).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Unexpected Friend\"\nmsgstr \"Неожиданный Друг\"\n\n#. Key:\tmus1_dlg_Golem_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(9).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(9).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Duty\"\nmsgstr \"Долг\"\n\n#. Key:\tmus1_dlg_Lory_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(8).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(8).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"The other Bell\"\nmsgstr \"Другой Колокол\"\n\n#. Key:\tmus1_dlg_Monk_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(10).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(10).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Enlightened Mind\"\nmsgstr \"Просветлённый Разум\"\n\n#. Key:\tmus1_dlg_Raven_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(11).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(11).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Winged Wisdom\"\nmsgstr \"Крылатая Мудрость\"\n\n#. Key:\tmus1_dlg_SewerCreature_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(32).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(32).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Pipe Walkers\"\nmsgstr \"Трубоходики\"\n\n#. Key:\tmus1_dlg_Teachy_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(12).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(12).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Just a bit crazy\"\nmsgstr \"Просто чуть-чуть сумасшедший\"\n\n#. Key:\tmus1_env_AncientArcade_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(1).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(1).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Remnant Colors\"\nmsgstr \"Остатки Цвета\"\n\n#. Key:\tmus1_env_GreyGate_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(5).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(5).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Touch of Ruin\"\nmsgstr \"Прикосновение Руина\"\n\n#. Key:\tmus1_env_SecondArcade_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(17).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(17).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"In Memoriam\"\nmsgstr \"В Памяти\"\n\n#. Key:\tmus1_env_TutorialLevel_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(3).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(3).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Sunken Sewer\"\nmsgstr \"Затопленная Канализация\"\n\n#. Key:\tmus2_combat_catacombs_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(18).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(18).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Armours of the Deep\"\nmsgstr \"Доспехи Глубоких\"\n\n#. Key:\tmus2_combat_DwarvenBoss_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(19).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(19).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"I hold it back\"\nmsgstr \"Я задержу его\"\n\n#. Key:\tmus2_combat_LavaBoss_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(20).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(20).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Meant to be Perfect\"\nmsgstr \"Быть Идеальным\"\n\n#. Key:\tmus2_combat_WrackedWaterpath_2_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(22).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(22).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Wracked Warriors\"\nmsgstr \"Побеждённые Воины\"\n\n#. Key:\tmus2_combat_WrackedWaterpath_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(21).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(21).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Those who survived\"\nmsgstr \"Те, что выжили\"\n\n#. Key:\tmus2_combat_WWBoss_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(23).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(23).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"No price too high\"\nmsgstr \"Нет слишком высокой цены\"\n\n#. Key:\tmus2_dlg_Gnory_Fishy_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(33).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(33).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Intelligence and Wisdom\"\nmsgstr \"Разум и Мудрость\"\n\n#. Key:\tmus2_dlg_GolemMaker_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(34).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(34).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Lost Memories\"\nmsgstr \"Потерянные Воспоминания\"\n\n#. Key:\tmus2_dlg_MerchAnt_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(35).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(35).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Small but Tiny\"\nmsgstr \"Маленький, совсем Крошечный\"\n\n#. Key:\tmus2_dlg_SupperDwarf_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(36).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(36).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Supper time\"\nmsgstr \"Время Ужина\"\n\n#. Key:\tmus2_env_Catacombs_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(24).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(24).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Dwarven Catacombs\"\nmsgstr \"Карликовые Катакомбы\"\n\n#. Key:\tmus2_env_CrossroadCave_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(25).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(25).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Railway Station\"\nmsgstr \"Железнодорожная Станция\"\n\n#. Key:\tmus2_env_DwarvenGate_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(26).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(26).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Sanctuary of Law\"\nmsgstr \"Святилище Правды\"\n\n#. Key:\tmus2_env_DwarvenOutpost_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(27).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(27).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Where the rail leads\"\nmsgstr \"Туда, куда ведут рельсы\"\n\n#. Key:\tmus2_env_Kobold_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(15).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(15).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Last of his Tribe\"\nmsgstr \"Последний из своего Племени\"\n\n#. Key:\tmus2_env_LavaDeep_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(28).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(28).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Temple for the Ancestors\"\nmsgstr \"Храм Предков\"\n\n#. Key:\tmus2_env_LavaEntrance_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(29).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(29).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Pilgrim Road\"\nmsgstr \"Паломническая Дорога\"\n\n#. Key:\tmus2_env_WrackedWaterpath_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(30).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(30).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Quick and Clever\"\nmsgstr \"Быстрый и Умный\"\n\n#. Key:\tmus3_combat_Bubble_Ground_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(14).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(14).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Infected Golems\"\nmsgstr \"Заражённые Големы\"\n\n#. Key:\tmus3_env_BubbleGround_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(38).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(38).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"So close yet so far\"\nmsgstr \"Так близко, но так далеко\"\n\n#. Key:\tmus3_env_CaveHouse_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(39).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(39).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Last Shalter\"\nmsgstr \"Последнее Убежище\"\n\n#. Key:\tmus3_env_PipePuzzle_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(40).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(40).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Moving Pipes\"\nmsgstr \"Подвижные трубы\"\n\n#. Key:\tmus3_env_Raven_Puzzle_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(41).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(41).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"One would fail\"\nmsgstr \"Один проиграет\"\n\n#. Key:\tmus3_env_RuinedRealm_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(42).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(42).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"The end, really\"\nmsgstr \"Конец, на самом деле\"\n\n#. Key:\tmus_chase_theme_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(4).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(4).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Jump for your life!\"\nmsgstr \"Прыгай ради своей жизни!\"\n\n#. Key:\tmus_cm_WhiteWall_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(13).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(13).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Decaying City\"\nmsgstr \"Распадающийся Город\"\n\n#. Key:\tmus_ending_dlg_UnknownWizard_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(37).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(37).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"All is lost\"\nmsgstr \"Все потеряно\"\n\n#. Key:\tmus_main_theme_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(0).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(0).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Spirit of the Unknown\"\nmsgstr \"Дух Неизвестного\"\n\n#. Key:\tmus_waterpath_alter_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(43).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(43).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Stories never end\"\nmsgstr \"Истории никогда не заканчиваются\"\n\n#. Key:\tblocked\n#. SourceLocation:\tLocalization/StringTables/Spells.csv\n#. InfoMetaData:\t\"Comment\" : \" displayed as floating test ingame when a certain enemy blocks certain attacks\"\n#: Localization/StringTables/Spells.csv\nmsgctxt \"Spells\"\nmsgid \"Blocked\"\nmsgstr \"Блок\"\n\n#. Key:\tcant_use_in_air\n#. SourceLocation:\tLocalization/StringTables/Spells.csv\n#. InfoMetaData:\t\"Comment\" : \" displayed as floating test ingame when the character tries to use a spell in air which can not be used there\"\n#: Localization/StringTables/Spells.csv\nmsgctxt \"Spells\"\nmsgid \"Can't in air\"\nmsgstr \"Не могу в воздухе\"\n\n#. Key:\tcant_use_sk_free_zone\n#. SourceLocation:\tLocalization/StringTables/Spells.csv\n#. InfoMetaData:\t\"Comment\" : \" displayed as floating test ingame when character tries to use the respawn point spell on a location when it is not allowed\"\n#: Localization/StringTables/Spells.csv\nmsgctxt \"Spells\"\nmsgid \"Dangerous Location\"\nmsgstr \"Опасное Место\"\n\n#. Key:\thp_gained\n#. SourceLocation:\tLocalization/StringTables/Spells.csv\n#. InfoMetaData:\t\"Comment\" : \" displayed as floating test ingame when the character increases his max health\"\n#: Localization/StringTables/Spells.csv\nmsgctxt \"Spells\"\nmsgid \"Health Increased!\"\nmsgstr \"Здоровье Восстановлено!\"\n\n#. Key:\timmune\n#. SourceLocation:\tLocalization/StringTables/Spells.csv\n#. InfoMetaData:\t\"Comment\" : \"displayed as floating text ingame if enemy is immune to a spell or damage type\"\n#: Localization/StringTables/Spells.csv\nmsgctxt \"Spells\"\nmsgid \"Immune\"\nmsgstr \"Неуязвим\"\n\n#. Key:\tinfected\n#. SourceLocation:\tLocalization/StringTables/Spells.csv\n#. InfoMetaData:\t\"Comment\" : \" displayed as floating test ingame when dmg over time effect is applied on enemy\"\n#: Localization/StringTables/Spells.csv\nmsgctxt \"Spells\"\nmsgid \"Infected\"\nmsgstr \"Заражён\"\n\n#. Key:\tinstant_recharge\n#. SourceLocation:\tLocalization/StringTables/Spells.csv\n#. InfoMetaData:\t\"Comment\" : \" displayed as floating test ingame when a spell can be used again without waiting for the cooldown time\"\n#: Localization/StringTables/Spells.csv\nmsgctxt \"Spells\"\nmsgid \"Instant Recharge\"\nmsgstr \"Мгновенная Подзарядка\"\n\n#. Key:\tmissing_target\n#. SourceLocation:\tLocalization/StringTables/Spells.csv\n#. InfoMetaData:\t\"Comment\" : \" displayed as floating test ingame when the character tries to use a spell which requires a target but there is none in range\"\n#: Localization/StringTables/Spells.csv\nmsgctxt \"Spells\"\nmsgid \"Who? Where? What?!\"\nmsgstr \"Кто? Где? Что?!\"\n\n#. Key:\tno_need_for_heal\n#. SourceLocation:\tLocalization/StringTables/Spells.csv\n#. InfoMetaData:\t\"Comment\" : \" displayed as floating test ingame when the character tries to use heal spell but has max health already\"\n#: Localization/StringTables/Spells.csv\nmsgctxt \"Spells\"\nmsgid \"No need\"\nmsgstr \"Не нужно\"\n\n#. Key:\tresisted\n#. SourceLocation:\tLocalization/StringTables/Spells.csv\n#. InfoMetaData:\t\"Comment\" : \"displayed as floating text ingame if enemy has a chance to avoid an effect and he is lucky\"\n#: Localization/StringTables/Spells.csv\nmsgctxt \"Spells\"\nmsgid \"Resisted\"\nmsgstr \"Устоит\"\n\n#. Key:\tsecond_chance\n#. SourceLocation:\tLocalization/StringTables/Spells.csv\n#. InfoMetaData:\t\"Comment\" : \" displayed as floating test ingame if char has the effect on and dies and respawns because the effect saves him\"\n#: Localization/StringTables/Spells.csv\nmsgctxt \"Spells\"\nmsgid \"Second Chance\"\nmsgstr \"Второй Шанс\"\n\n#. Key:\tspell_capacity_gained\n#. SourceLocation:\tLocalization/StringTables/Spells.csv\n#. InfoMetaData:\t\"Comment\" : \" displayed as floating test ingame when the character increases his spellpower\"\n#: Localization/StringTables/Spells.csv\nmsgctxt \"Spells\"\nmsgid \"Spellpower Increased!\"\nmsgstr \"Мощность Заклинаний Увеличена!\"\n\n#. Key:\tspell_regained\n#. SourceLocation:\tLocalization/StringTables/Spells.csv\n#. InfoMetaData:\t\"Comment\" : \" displayed as floating test ingame when the character regains a spell (can cast again)\"\n#: Localization/StringTables/Spells.csv\nmsgctxt \"Spells\"\nmsgid \"Spell Charge Regained!\"\nmsgstr \"Заряд заклинаний восстановлен!\"\n\n#. Key:\tacknowledge\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Button\"\n#. Key:\tgroup_defeated_ack\n#. InfoMetaData:\t\"Comment\" : \"the hotkey to close the group defeated panel\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Acknowledge\"\nmsgstr \"Подтвердить\"\n\n#. Key:\tback\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Button\"\n#. Key:\tpanel_command_inv_back\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Back\"\nmsgstr \"Назад\"\n\n#. Key:\tblack_fade_teleport_text_1\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Now I remember the night when it started...\"\nmsgstr \"Теперь я вспоминаю ночь, когда все началось…\"\n\n#. Key:\tbubble_float\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"bubble tip for the char to float\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Float\"\nmsgstr \"Плавать\"\n\n#. Key:\tbubble_jump\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"bubble tip for the char to jump\"\n#. Key:\tinput_jump\n#. InfoMetaData:\t\"Comment\" : \"Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Jump\"\nmsgstr \"Прыгать\"\n\n#. Key:\tbuy\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"buy item\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Buy\"\nmsgstr \"Купить\"\n\n#. Key:\tbuy_back\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"buy back item\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Buy Back\"\nmsgstr \"Выкупить обратно\"\n\n#. Key:\tbuy_on_steam_and_follow\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Buy WarriOrb in Steam and follow us on social media:\"\nmsgstr \"Покупайте WarriOrb в Steam и следите за нами в социальных сетях:\"\n\n#. Key:\tcancel\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Confirm popup\"\n#. Key:\tsettings_cancel\n#. InfoMetaData:\t\"Comment\" : \"Settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Cancel\"\nmsgstr \"Отменить\"\n\n#. Key:\tchange_user\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Change User\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Change User\"\nmsgstr \"Сменить профиль\"\n\n#. Key:\tchapter\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Stats for saves\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Chapter\"\nmsgstr \"Глава\"\n\n#. Key:\tchapter1_completed\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Temporary for chapter 1\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Chapter 1 completed. Save is Locked.\"\nmsgstr \"Глава 1 завершена. Функция “Сохранить” заблокирована.\"\n\n#. Key:\tcharacter_skin_classic\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"name of the original character skin\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Classic\"\nmsgstr \"Классический \"\n\n#. Key:\tcharacter_skin_desc\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"description for the character skin option\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Changes the visuals of the player character\"\nmsgstr \"Изменяет визуальный облик персонажа игрока.\"\n\n#. Key:\tcharacter_skin_mummy\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"name of the alternative character skin\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Mummy\"\nmsgstr \"Мумия \"\n\n#. Key:\tcharacter_skin_pumpkin\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"name of the alternative character skin\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Pumpkin\"\nmsgstr \"Тыква\"\n\n#. Key:\tcharacter_skin_title\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"option to change character skin\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Character Skin\"\nmsgstr \"Стиль Персонажа\"\n\n#. Key:\tcheckpoint\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Stats for saves\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Checkpoint\"\nmsgstr \"Чекпоинт\"\n\n#. Key:\tchest_examine\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Examine\"\nmsgstr \"Осмотреть\"\n\n#. Key:\tchest_leave\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Leave\"\nmsgstr \"Выйти\"\n\n#. Key:\tchest_loot\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"hotkey tip on chest\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Loot\"\nmsgstr \"Взять\"\n\n#. Key:\tclose\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"close book\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Close\"\nmsgstr \"Закрыть\"\n\n#. Key:\tcompleted_in_time\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Custom Map\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Completed in {time}\"\nmsgstr \"Завершено за {time}\"\n\n#. Key:\tconfirm\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Confirm popup\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Confirm\"\nmsgstr \"Подтвердить\"\n\n#. Key:\tconfirm_keyboard_settings_reset\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Confirm keyboard settings\"\n#. Key:\tdifficulty_confirm_question\n#. InfoMetaData:\t\"Comment\" : \"Confirm difficulty selected popup\"\n#. Key:\tsave_slots_remove_confirm\n#. InfoMetaData:\t\"Comment\" : \"remove save slot confirm dialogue\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Are you sure?\"\nmsgstr \"Ты уверен?\"\n\n#. Key:\tconsole_ps4\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"PlayStation 4\"\nmsgstr \"PlayStation 4\"\n\n#. Key:\tconsole_switch\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Switch\"\nmsgstr \"Switch\"\n\n#. Key:\tconsole_xbox_one\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"XBox One\"\nmsgstr \"XBox One\"\n\n#. Key:\tcontinue\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Menu Continue\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Continue\"\nmsgstr \"Продолжить\"\n\n#. Key:\tcontroller_recommended\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Main Menu\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Note: Playing with a controller is recommended\"\nmsgstr \"Примечание: Рекомендуется использовать контроллер\"\n\n#. Key:\tcredits\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Menu credits\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Credits\"\nmsgstr \"Титры\"\n\n#. Key:\tcustom_map_x\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Custom Map\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Custom Map {0}\"\nmsgstr \"Своих Карт {0}\"\n\n#. Key:\tcustom_maps\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Menu custom Maps\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Custom Maps\"\nmsgstr \"Свои Карты\"\n\n#. Key:\tdescription\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Of something\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Description\"\nmsgstr \"Описание\"\n\n#. Key:\tdifficulty\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Stats for saves\"\n#. Key:\tdifficulty_title\n#. InfoMetaData:\t\"Comment\" : \"title of difficulty selection\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Difficulty\"\nmsgstr \"Сложность\"\n\n#. Key:\tdifficulty_confirm_subtext\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Confirm difficulty selected popup subtext\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"This choice is permanent\"\nmsgstr \"Данный выбор будет необратим\"\n\n#. Key:\tdifficulty_desc_insane\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"description of hard difficulty\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"- The <Blue>SoulKeeper</> (Portable Checkpoint) spell is removed from the game\\n- Increased incoming damage\\n- Increased Enemy Health\"\nmsgstr \"- Заклинание <Blue>Хранитель Душ</> (Портативный Чекпоинт) удалено из игры\\n- Возросший урон\\n- Увеличенное здоровье\"\n\n#. Key:\tdifficulty_desc_intended\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"description of normal difficulty\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"The way the game is meant to be played\"\nmsgstr \"Так, как должна быть сыграна игра\"\n\n#. Key:\tdifficulty_desc_sane\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"description of easy difficulty\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"- Infinite <Blue>SoulKeeper</> (Checkpoint) spell charges\\n- No health penalty when respawning near the <Blue>SoulKeeper</>\\n- Decreased incoming damage\\n- Decreased Enemy Health\"\nmsgstr \"- Бесконечный <Blue>Хранитель Душ</> (Чекпоинт) заряд заклинаний\\n- Нет штрафа к здоровью при возрождении возле <Blue>Хранителя Душ</>\\n- Пониженный поступающий урон\\n- Пониженное здоровье врага\"\n\n#. Key:\tdifficulty_insane\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"name of hard difficulty\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"As hard as it can get\"\nmsgstr \"Безумный\"\n\n#. Key:\tdifficulty_intended\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"name of normal difficulty\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"A true challenge\"\nmsgstr \"Нормальный\"\n\n#. Key:\tdifficulty_normal\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Normal\"\nmsgstr \"Нормальный\"\n\n#. Key:\tdifficulty_sane\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"name of easy difficulty\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Just an adventure\"\nmsgstr \"Легкий\"\n\n#. Key:\tdisabled\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Widget is disabled\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Disabled\"\nmsgstr \"Отключен\"\n\n#. Key:\tdiscord\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Discord\"\nmsgstr \"Discord\"\n\n#. Key:\tdrm_defeatead_description\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"check only in pirated copies \"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"We suspect that you play a pirated copy of the game.\\nIt's fine. We hope you will enjoy it!\\n\\nIf you like the game, please tell your friends about it, and maybe even consider buying it.\\n\\nWe would love to keep making games!\"\nmsgstr \"Мы подозреваем, что Вы играете в пиратскую копию игры.\\nЭто не проблема. Мы надеемся, вам понравится!\\n\\n Если Вам понравилась игра, расскажите об этом друзьям и, может быть подумайте о ее покупке.\\n\\n Мы хотели бы продолжить создавать игры!\"\n\n#. Key:\tdrm_defeatead_title\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"check only in pirated copies \"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"WarriOrb DRM\"\nmsgstr \"WarriOrb ДРМ\"\n\n#. Key:\tdwarf_language\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Dwarf language\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Dwarf\"\nmsgstr \"Гном\"\n\n#. Key:\tempty\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Empty\"\nmsgstr \"Пустой\"\n\n#. Key:\tempty_line\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"-\"\nmsgstr \"-\"\n\n#. Key:\tencourage_line1\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Before Main Menu\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"The path ahead is challenging. Do not despise failure. Every wrong attempt discarded is another step forward.\"\nmsgstr \"Впереди трудный путь. Не стоит презирать неудачи. Каждая неверная попытка - это еще один шаг вперед.\"\n\n#. Key:\tessence\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"essence represents the Health of the character\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Essence\"\nmsgstr \"Сущность\"\n\n#. Key:\tfeedback\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Discord external button\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Feedback\"\nmsgstr \"Фидбэк\"\n\n#. Key:\tgame_defeated\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"end screen\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Game Defeated!\"\nmsgstr \"Игра Пройдена!\"\n\n#. Key:\tgame_is_wip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Main Menu\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Game currently under development\"\nmsgstr \"Игра в настоящее время в разработке\"\n\n#. Key:\tgame_over_retreat\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"control tip which is only visible in boss areas where the player can either restart the fight or retreat from the place\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Retreat\"\nmsgstr \"Отступить\"\n\n#. Key:\tgame_over_retry\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"control tip which is always visible on game over\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Retry\"\nmsgstr \"Повторить\"\n\n#. Key:\tgamepad_special_left_xbox\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"xbox view button\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"View button\"\nmsgstr \"Кнопка \\\"Просмотр\\\"\"\n\n#. Key:\tgamepad_special_right_xbox\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"xbox Menu button\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Menu button\"\nmsgstr \"Кнопка \\\"Меню\\\"\"\n\n#. Key:\tgo_back_to_menu\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Go back to main menu\"\nmsgstr \"Вернуться в главное меню\"\n\n#. Key:\tgold_x\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"{x} is the gold amount\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"+{x} GOLD\"\nmsgstr \"+{x} Золото\"\n\n#. Key:\tgroup_defeated_title\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"title of the group defeated panel\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Group Defeated\"\nmsgstr \"Группа была повержена\"\n\n#. Key:\tinput_action_back\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"UI Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"UI Action Back\"\nmsgstr \"Команда Назад\"\n\n#. Key:\tinput_action_first\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"UI Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"UI Action First\"\nmsgstr \"Первая Команда\"\n\n#. Key:\tinput_action_second\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"UI Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"UI Action Second\"\nmsgstr \"Вторая Команда\"\n\n#. Key:\tinput_action_third\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"UI Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"UI Action Third\"\nmsgstr \"Третья Команда\"\n\n#. Key:\tinput_actions_conflicts\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input remap.  {Key} = key display name. {NumAction} the number of actions, this will determine what to choose between one and other.\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Selected button = {Key}, will get unbound from the {NumActions}|plural(one=Action,other=Actions) = {ActionNames}\"\nmsgstr \"Выбранная кнопка = {Key}, будет сброшена c {NumActions}|plural(one=Команда,other=Команды) = {ActionNames}\"\n\n#. Key:\tinput_alt_interact\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Interact Alternative\"\nmsgstr \"Назначение клавиш\"\n\n#. Key:\tinput_change_item\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input Action Name\"\n#. Key:\tpanel_command_inv_change_item\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Change Item\"\nmsgstr \"Смените Элемент\"\n\n#. Key:\tinput_change_spell\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Change Spell\"\nmsgstr \"Смените Заклинание\"\n\n#. Key:\tinput_change_weapon\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Change Weapon\"\nmsgstr \"Смените Оружие\"\n\n#. Key:\tinput_down\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"UI Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"UI Move Down\"\nmsgstr \"Движение Вниз\"\n\n#. Key:\tinput_float\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Floating\"\nmsgstr \"Парить\"\n\n#. Key:\tinput_interact\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Interact\"\nmsgstr \"Изменить\"\n\n#. Key:\tinput_left\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Move Left\"\nmsgstr \"Движение Влево\"\n\n#. Key:\tinput_menu_back\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"UI Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Open Menu/Escape/Back\"\nmsgstr \"Открыть Меню/Сбежать/Назад\"\n\n#. Key:\tinput_not_allowed_options_menu_button\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input remap gamepad\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Not allowed to remap to the Menu button\"\nmsgstr \"Назначение действий на Кнопка \\\"Меню\\\"\"\n\n#. Key:\tinput_not_allowed_options_menu_button_switch\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input remap gamepad\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Not allowed to remap to the + Button\"\nmsgstr \"Назначение действий на Кнопка \\\"кнопка +\\\"\"\n\n#. Key:\tinput_not_allowed_thumbsticks\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input remap gamepad\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Not allowed to remap to thumbsticks\"\nmsgstr \"Назначение действий на L и R запрещено\"\n\n#. Key:\tinput_not_allowed_thumbsticks_switch\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input remap gamepad switch\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Not allowed to remap to Left Stick or Right Stick\"\nmsgstr \"Назначение действий на L и R запрещено\"\n\n#. Key:\tinput_open_inventory\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Open Inventory\"\nmsgstr \"Открыть Инвентарь\"\n\n#. Key:\tinput_right\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Move Right\"\nmsgstr \"Движение Вправо\"\n\n#. Key:\tinput_roll\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Roll\"\nmsgstr \"Катится\"\n\n#. Key:\tinput_selected_key_not_allowed\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input remap. {Key} = key display name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Selected button = {Key}, is not allowed as an input option\"\nmsgstr \"Выбранная кнопка = {Key}, не допускается в качестве опции ввода\"\n\n#. Key:\tinput_spell_down\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"UI Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"UI Spell Down\"\nmsgstr \"Заклинание Вниз\"\n\n#. Key:\tinput_spell_left\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"UI Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"UI Spell Left\"\nmsgstr \"Заклинание Слева\"\n\n#. Key:\tinput_spell_right\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"UI Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"UI Spell Right\"\nmsgstr \"Заклинание Вправо\"\n\n#. Key:\tinput_spell_select\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"UI Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"UI Spell Select\"\nmsgstr \"Выбрать Заклинание\"\n\n#. Key:\tinput_spell_select_and_cast\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"UI Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"UI Spell Select & Cast\"\nmsgstr \"Выбрать Заклинание & Заколдовать\"\n\n#. Key:\tinput_spell_up\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"UI Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"UI Spell Up\"\nmsgstr \"Заклинание Вверх\"\n\n#. Key:\tinput_strike_primary\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Primary Strike\"\nmsgstr \"Основной Удар\"\n\n#. Key:\tinput_strike_special\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Special Strike\"\nmsgstr \"Специальный Удар\"\n\n#. Key:\tinput_take_weapon\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Take Weapon Away\"\nmsgstr \"Убрать Оружие\"\n\n#. Key:\tinput_top_left\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"UI Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"UI Top Left\"\nmsgstr \"Вверху Слева\"\n\n#. Key:\tinput_top_right\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"UI Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"UI Top Right\"\nmsgstr \"Верху Справа\"\n\n#. Key:\tinput_unbound\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Unbound input\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Unbound\"\nmsgstr \"Заменить\"\n\n#. Key:\tinput_up\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"UI Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"UI Move Up\"\nmsgstr \"Движение Вверх\"\n\n#. Key:\tinput_use_item\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Use Item\"\nmsgstr \"Использовать предмет\"\n\n#. Key:\tinventory_item_amount\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"the item amount displayed in inventory/trade panel/etc.\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Amount: {0}\"\nmsgstr \"Количество: {0}\"\n\n#. Key:\tinventory_item_tooltip_cooldown\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Cooldown\"\nmsgstr \"Восстановение\"\n\n#. Key:\tinventory_item_tooltip_damage\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"damage text on item descriptions\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Damage\"\nmsgstr \"Урон\"\n\n#. Key:\tinventory_item_tooltip_sec\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"duration of something (e.g. cooldown)\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"{0} sec\"\nmsgstr \"{0} секунд\"\n\n#. Key:\titem_equipped\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Item Tooltip\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"---Equipped---\"\nmsgstr \"— Снаряжено—\"\n\n#. Key:\titem_not_For_sale\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Item Tooltip\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Not for sale\"\nmsgstr \"Не продается\"\n\n#. Key:\titem_rarity_0\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"item rarity text on the bottom of tooltips\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Better than nothing, right?\"\nmsgstr \"Лучше, чем ничего, верно?\"\n\n#. Key:\titem_rarity_1\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"item rarity text on the bottom of tooltips\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Better than nothing\"\nmsgstr \"Лучше, чем ничего\"\n\n#. Key:\titem_rarity_2\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"item rarity text on the bottom of tooltips\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Good stuff\"\nmsgstr \"Хорошая вещь\"\n\n#. Key:\titem_rarity_3\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"item rarity text on the bottom of tooltips\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Pretty good stuff\"\nmsgstr \"Довольно неплохая вещь\"\n\n#. Key:\titem_rarity_4\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"item rarity text on the bottom of tooltips\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Amazing stuff\"\nmsgstr \"Изумительная вещь\"\n\n#. Key:\tkey_selection_current\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Select Input key\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Currently selected button:\"\nmsgstr \"Выбранная кнопка:\"\n\n#. Key:\tkey_selection_empty\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Select Input key\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"[Empty Button]\"\nmsgstr \"[Пустая кнопка]\"\n\n#. Key:\tkey_selection_press\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Select Input key\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"[Press Button]\"\nmsgstr \"[Нажмите кнопку]\"\n\n#. Key:\tkey_selection_press_button\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Select Input key\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Press the button you want to assign to the action:\"\nmsgstr \"Нажмите кнопку, которую вы хотите задать этому действию:\"\n\n#. Key:\tline_three_dots\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"...\"\nmsgstr \"...\"\n\n#. Key:\tloading_screen_press_key\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Press any key to continue...\"\nmsgstr \"Нажмите любую кнопку, чтобы продолжить…\"\n\n#. Key:\tloading_screen_press_key_switch\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Press any button to continue...\"\nmsgstr \"Нажмите любую кнопку, чтобы продолжить…\"\n\n#. Key:\tloading_screen_text_1\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"This is a loading screen. We wait a few seconds here to look more professional.\"\nmsgstr \"Это экран загрузки. Чтобы выглядеть более профессионально, мы подождем здесь несколько секунд.\"\n\n#. Key:\tmailing_list\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Mailing List\"\nmsgstr \"Список Рассылки\"\n\n#. Key:\tnever_completed\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Custom Map\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Never completed\"\nmsgstr \"Так и не завершено\"\n\n#. Key:\tno\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Confirm popup\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"No\"\nmsgstr \"Нет\"\n\n#. Key:\tpanel_character_sheet\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Character Panel\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Character Sheet\"\nmsgstr \"Панель Персонажа\"\n\n#. Key:\tpanel_command_inv_compare\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Compare\"\nmsgstr \"Сравнить\"\n\n#. Key:\tpanel_command_inv_drink\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Drink\"\nmsgstr \"Выпить\"\n\n#. Key:\tpanel_command_inv_equip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"control key tip in inventory\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Equip\"\nmsgstr \"Снарядить\"\n\n#. Key:\tpanel_command_inv_equip_item\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Equip Item\"\nmsgstr \"Снарядить предмет\"\n\n#. Key:\tpanel_command_inv_equip_next\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Equip Next\"\nmsgstr \"Снарядить Следующее\"\n\n#. Key:\tpanel_command_inv_read\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Read\"\nmsgstr \"Прочитать\"\n\n#. Key:\tpanel_command_inv_unequip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Unequip\"\nmsgstr \"Снять\"\n\n#. Key:\tpanel_command_spell_add\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"add spell to equipped spells\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Add\"\nmsgstr \"Добавить\"\n\n#. Key:\tpanel_command_spell_remove\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"remove spell from equipped spells\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Remove\"\nmsgstr \"Убрать\"\n\n#. Key:\tpanel_equipped_spells\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Spell Selection panel\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Equipped Spells\"\nmsgstr \"Экипированые заклинания\"\n\n#. Key:\tpanel_inventory\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Character Panel\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Inventory\"\nmsgstr \"Инвентарь\"\n\n#. Key:\tpanel_notes\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Character Panel\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Sidenotes\"\nmsgstr \"Заметки\"\n\n#. Key:\tpaneL_resistances\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Character Sheet Panel\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Resistances\"\nmsgstr \"Сопротивление\"\n\n#. Key:\tpanel_rest_no_item\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"You don't have the necessary item to use spells!\"\nmsgstr \"У тебя нет необходимого предмета для использования заклинаний!\"\n\n#. Key:\tpanel_rest_option_change_spells\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Change Spells\"\nmsgstr \"Поменять Заклинание\"\n\n#. Key:\tpanel_rest_option_listen_to_music\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Listen to Music\"\nmsgstr \"Послушать музыку\"\n\n#. Key:\tpanel_rest_option_sleep\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Sleep\"\nmsgstr \"Поспать\"\n\n#. Key:\tpanel_rest_option_wake_up\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Wake Up\"\nmsgstr \"Проснуться\"\n\n#. Key:\tpanel_spell_capacity\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Spell Selection panel\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Capacity: {0}/{1}\"\nmsgstr \"Вместимость: {0}/{1}\"\n\n#. Key:\tpanel_spell_selection_denied\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Spell Selection panel\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"You can only change the equipped spells near ancient statues.\"\nmsgstr \"Сменить заклинания можно только у древних статуй.\"\n\n#. Key:\tpanel_spells\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Character Panel\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Spells\"\nmsgstr \"Заклинания\"\n\n#. Key:\tpercentage_argument\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Slider\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"{0}%\"\nmsgstr \"{0}%\"\n\n#. Key:\tplay_time\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Stats for saves\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Play Time\"\nmsgstr \"Время играть\"\n\n#. Key:\tprogress_saved\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Confirm Quit popup\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Progress will be saved\"\nmsgstr \"Прогресс будет сохранен\"\n\n#. Key:\tprogress_saved_automatically\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Before Main Menu\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Your progress is saved automatically whenever this icon is displayed\"\nmsgstr \"Ваш прогресс сохраняется автоматически всякий раз, когда отображается этот значок\"\n\n#. Key:\tquit_game\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Menu Quit Game\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Quit Game\"\nmsgstr \"Выйти из игры\"\n\n#. Key:\tquit_game_question\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Confirm Quit popup\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Quit Game?\"\nmsgstr \"Выйти из игры?\"\n\n#. Key:\tquit_to_menu\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Menu Quit To Menu\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Quit to Menu\"\nmsgstr \"В Главное Меню\"\n\n#. Key:\tquit_to_menu_question\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Confirm Quit popup\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Quit to Menu?\"\nmsgstr \"Перейти в Главное Меню?\"\n\n#. Key:\treset_keyboard_arrows\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Confirm keyboard settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Reset to Arrow defaults\"\nmsgstr \"Использовать Стрелки по умолчанию\"\n\n#. Key:\treset_keyboard_wasd\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Confirm keyboard settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Reset to WASD defaults\"\nmsgstr \"Использовать WASD по умолчанию\"\n\n#. Key:\trestart\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Restart the game\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Restart\"\nmsgstr \"Перезапустить\"\n\n#. Key:\trestart_game_question\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Confirm Restart popup\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Restart Game?\"\nmsgstr \"Перезапустить игру?\"\n\n#. Key:\trestart_game_warning\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Confirm Restart popup\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"All progress will be lost\"\nmsgstr \"Весь прогресс будет потерян\"\n\n#. Key:\tsave_slots_clear\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"clears the save slot\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Clear\"\nmsgstr \"Очистить\"\n\n#. Key:\tsave_slots_loaded\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"text on currently loaded save slot if there is any\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"- Loaded -\"\nmsgstr \"- Загружен -\"\n\n#. Key:\tsave_slots_new_game\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"text on empty save slot\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"New Game\"\nmsgstr \"Новая игра\"\n\n#. Key:\tsave_slots_playtime\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"playtime displayed, {0} is the hours, {1} is the minutes\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"{0} H {1} M\"\nmsgstr \"{0} В {1} M\"\n\n#. Key:\tsave_slots_playtime_short\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"playtime displayed if it did not reach an hour, {0} is the time in minutes\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"{0} M\"\nmsgstr \"{0} M\"\n\n#. Key:\tsave_slots_remove_confirm_subtext\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"remove save slot confirm dialogue\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Progress will be lost\"\nmsgstr \"Прогресс будет утерян\"\n\n#. Key:\tsave_slots_select\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"loads the game or creates a new one using the active slot\"\n#. Key:\tselect\n#. InfoMetaData:\t\"Comment\" : \"Button\"\n#. Key:\tspell_cast_switch_select\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Select\"\nmsgstr \"Выбрать\"\n\n#. Key:\tsaves\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Menu saves\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Save Slots\"\nmsgstr \"Сохранить слоты\"\n\n#. Key:\tseconds\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"seconds\"\nmsgstr \"секунды\"\n\n#. Key:\tselect_spells\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input right  thumbstick\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Select spells\"\nmsgstr \"Выбрать заклинания\"\n\n#. Key:\tsell\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"sell item\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Sell\"\nmsgstr \"Продать\"\n\n#. Key:\tsend_automatically\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Analytics popup\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Send Automatically\"\nmsgstr \"Отправлять автоматически\"\n\n#. Key:\tsend_no\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Analytics popup\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Do not Send\"\nmsgstr \"Не отправлять\"\n\n#. Key:\tsettings\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Menu settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Settings\"\nmsgstr \"Настройки\"\n\n#. Key:\tsettings_antialising\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Anti-Aliasing\"\nmsgstr \"Сглаживание\"\n\n#. Key:\tsettings_antialising_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Smooths out the edges by blending the colors of the pixels around the object to create the illusion of smoothness.\"\nmsgstr \"Сглаживает края, смешивая цвета пикселей вокруг объекта, создавая иллюзию гладкости.\"\n\n#. Key:\tsettings_apply\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Apply\"\nmsgstr \"Применить\"\n\n#. Key:\tsettings_aspect_ratio\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Aspect Ratio\"\nmsgstr \"Соотношение сторон\"\n\n#. Key:\tsettings_aspect_ratio_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Defines what aspect ratios are available for your resolution.\"\nmsgstr \"Определяет, какие пропорции доступны для вашего разрешения.\"\n\n#. Key:\tsettings_audio\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Settings panels\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Audio\"\nmsgstr \"Звук\"\n\n#. Key:\tsettings_auto_detect_controller\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Gamepad settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Auto detect Gamepad Layout\"\nmsgstr \"Автоматическое определение Раскладки Геймпада\"\n\n#. Key:\tsettings_borderless\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Borderless\"\nmsgstr \"Без Рамки\"\n\n#. Key:\tsettings_brightness\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Settings panels\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Brightness\"\nmsgstr \"Яркость\"\n\n#. Key:\tsettings_brightness_default_value\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Brightness settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Default Value is 100%\"\nmsgstr \"По умолчанию 100%\"\n\n#. Key:\tsettings_brightness_description\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Brightness settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Please adjust the brightness of the game to your display\"\nmsgstr \"Пожалуйста, настройте яркость игры на вашем дисплее\"\n\n#. Key:\tsettings_collect_analytics\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Game Settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Collect Usage Statistics\"\nmsgstr \"Статистика использования\"\n\n#. Key:\tsettings_collect_analytics_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Game Settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"These are not used to identify individuals, but help us to understand players needs to improve our game.\"\nmsgstr \"Они не используются для идентификации личности, но помогают нам понять потребности игроков для улучшения нашей игры.\"\n\n#. Key:\tsettings_confirm_display_title\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings confirm\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Confirm Display Settings in\"\nmsgstr \"Подтвердить настройки отображения в\"\n\n#. Key:\tsettings_controller\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Settings panels\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Gamepad\"\nmsgstr \"Геймпад\"\n\n#. Key:\tsettings_controller_platform\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Gamepad Layout settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Layout\"\nmsgstr \"Раскладка\"\n\n#. Key:\tsettings_controller_remap\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Gamepad settings\"\n#. Key:\tsettings_controller_remap_single\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Remap Controls\"\nmsgstr \"Управление кнопок\"\n\n#. Key:\tsettings_controller_remap_noedit\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Gamepad settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Please use a gamepad in order to remap\"\nmsgstr \"Пожалуйста, используйте геймпад, чтобы изменить управление\"\n\n#. Key:\tsettings_controller_switch\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Settings panels\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Controls\"\nmsgstr \"Управление\"\n\n#. Key:\tsettings_display\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Settings panels\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Display\"\nmsgstr \"Дисплей\"\n\n#. Key:\tsettings_display_damage\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Game settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Display Damage\"\nmsgstr \"Отображение Урона\"\n\n#. Key:\tsettings_display_damage_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Game settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Show damage as a floating number on the screen\"\nmsgstr \"Показывать повреждения в виде всплывающих чисел на экране\"\n\n#. Key:\tsettings_display_enemy_hp\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Game settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Display Enemy Health\"\nmsgstr \"Отображение здоровья врага\"\n\n#. Key:\tsettings_display_enemy_hp_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Game settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Show a small health bar above injured enemies\"\nmsgstr \"Показывать уровень здоровья над ранеными врагами\"\n\n#. Key:\tsettings_display_floating_vo\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Game settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Display Floating Voice Lines\"\nmsgstr \"Отображение всплывающего текста диалогов\"\n\n#. Key:\tsettings_display_floating_vo_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Game settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Show voice lines as floating texts\"\nmsgstr \"Показывать текст диалогов как всплывающие тексты\"\n\n#. Key:\tsettings_display_fps\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Game settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Display FPS\"\nmsgstr \"Отображение FPS\"\n\n#. Key:\tsettings_display_fps_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Game settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Show FPS counter\"\nmsgstr \"Показать счетчик FPS\"\n\n#. Key:\tsettings_display_mode\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Display Mode\"\nmsgstr \"Режим отображения\"\n\n#. Key:\tsettings_display_mode_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"In Windowed mode you can interact with other windows easier. In Borderless mode you can quickly switch between applications.\"\nmsgstr \"В Оконном режиме вы можете легче взаимодействовать с другими окнами. В режиме Без полей вы можете быстро переключаться между приложениями.\"\n\n#. Key:\tsettings_display_play_time\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Game settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Display Play Time\"\nmsgstr \"Отображение времени игры\"\n\n#. Key:\tsettings_display_play_time_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Game settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Show current play time\"\nmsgstr \"Показывать текущее время игры\"\n\n#. Key:\tsettings_effects\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Effect Quality\"\nmsgstr \"Качество эффектов\"\n\n#. Key:\tsettings_effects_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Affects the quality of particles in the world, a lower quality might make some projectiles in the world harder to see.\"\nmsgstr \"Влияет на качество частиц в игре, более низкое качество может сделать некоторые снаряды труднее увидеть.\"\n\n#. Key:\tsettings_effects_volume\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Audio settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Sound Effects volume\"\nmsgstr \"Громкость звуковых эффектов\"\n\n#. Key:\tsettings_effects_volume_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Audio settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Adjust the sound effects volume\"\nmsgstr \"Настройка громкости звуковых эффектов\"\n\n#. Key:\tsettings_force_weak_hardware_opt\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Additional Optimizations\"\nmsgstr \"Дополнительные оптимизации\"\n\n#. Key:\tsettings_force_weak_hardware_opt_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"In certain areas background traps are deactivated or background visuals look cheaper to gain more performance.\"\nmsgstr \"В некоторых местах ловушки на заднем плане отключены для повышения производительности.\"\n\n#. Key:\tsettings_fps_unlimited\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings frame limit\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Unlimited\"\nmsgstr \"Неограниченный\"\n\n#. Key:\tsettings_frame_limit\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Frame Limit (FPS)\"\nmsgstr \"Лимит частоты кадров (FPS):\"\n\n#. Key:\tsettings_frame_limit_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Limit the maximum frame rate for a consistent experience.\"\nmsgstr \"Ограничить максимальную частоту смены кадров для получения стабильной производительности.\"\n\n#. Key:\tsettings_fullscreen\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Fullscreen\"\nmsgstr \"Полный экран\"\n\n#. Key:\tsettings_game\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Settings panels\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Game\"\nmsgstr \"Игра\"\n\n#. Key:\tsettings_game_speed\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Game settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Game Speed\"\nmsgstr \"Скорость Игры\"\n\n#. Key:\tsettings_game_speed_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Game settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Changes the speed of the game.\\nHigher speed might make the game have lower FPS.\"\nmsgstr \"Меняет скорость игры. Высокая скорость игры может уменьшить FPS.\"\n\n#. Key:\tsettings_gamepad_vibration\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Gamepad Vibration intensity settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Vibration\"\nmsgstr \"Вибрация\"\n\n#. Key:\tsettings_keyboard\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Settings panels\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Keyboard\"\nmsgstr \"Клавиатура\"\n\n#. Key:\tsettings_keyboard_remap_noedit\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Keyboard Settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Please use a keyboard in order to change the keyboard input\"\nmsgstr \"Пожалуйста, используйте клавиатуру, чтобы изменить ввод с клавиш\"\n\n#. Key:\tsettings_language\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Game settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Language\"\nmsgstr \"Язык\"\n\n#. Key:\tsettings_language_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Game settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Change the display and locale (numbers, dates) language\"\nmsgstr \"Изменение языка отображения и локали (номера, даты)\"\n\n#. Key:\tsettings_master_volume\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Audio settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Master volume\"\nmsgstr \"Общая громкость\"\n\n#. Key:\tsettings_master_volume_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Audio settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Adjust the master volume\"\nmsgstr \"Настройка общей-громкости\"\n\n#. Key:\tsettings_merciful_bounce\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"game settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Merciful Bounce Mode\"\nmsgstr \"Милосердный Режим Прыжка\"\n\n#. Key:\tsettings_merciful_bounce_always\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"defines when (in which difficulty mode) is the easier bounce mode active\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Always\"\nmsgstr \"Всегда\"\n\n#. Key:\tsettings_merciful_bounce_never\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"defines when (in which difficulty mode) is the easier bounce mode active\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Never\"\nmsgstr \"Никогда\"\n\n#. Key:\tsettings_merciful_bounce_on_easy\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"defines when (in which difficulty mode) is the easier bounce mode active\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"On Easy\"\nmsgstr \"В Легком режиме\"\n\n#. Key:\tsettings_merciful_bounce_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"tooltip for Merciful Bounce Mode option\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Allows Higher Bounce even if the Jump button is pressed after the character hits the ground\"\nmsgstr \"Позволяет Увеличить Отскок, даже если кнопка “Прыжок “ нажата после того, как персонаж приземлился.\"\n\n#. Key:\tsettings_move_left_right\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Move left/right\"\nmsgstr \"Движение влево/вправо\"\n\n#. Key:\tsettings_music_volume\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Audio settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Music volume\"\nmsgstr \"Громкость музыки\"\n\n#. Key:\tsettings_music_volume_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Audio settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Adjust the music volume\"\nmsgstr \"Настройка громкости музыки\"\n\n#. Key:\tsettings_mute_audio\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Audio settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Mute audio\"\nmsgstr \"Отключить звук\"\n\n#. Key:\tsettings_mute_audio_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Audio settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Mute all audio\"\nmsgstr \"Отключить все звуки\"\n\n#. Key:\tsettings_mute_audio_unfocused\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Audio settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Mute audio when in background\"\nmsgstr \"Отключение звука, когда игра свернута\"\n\n#. Key:\tsettings_mute_audio_unfocused_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Audio settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Mute the audio when the game window is not in focus\"\nmsgstr \"Отключить звук, когда окно игры вне фокуса\"\n\n#. Key:\tsettings_mute_dialogue_voice\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Audio settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Mute voices in dialogues\"\nmsgstr \"Отключить голоса в диалогах\"\n\n#. Key:\tsettings_mute_dialogue_voice_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Audio settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Mute the gibberish voices inside the dialogues\"\nmsgstr \"Отключить тарабарщину внутри диалогов\"\n\n#. Key:\tsettings_mute_voice\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Audio settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Mute voices outside of dialogues\"\nmsgstr \"Отключить голоса вне диалогов\"\n\n#. Key:\tsettings_mute_voice_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Audio settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Mute the gibberish voices outside the dialogues\"\nmsgstr \"Отключить тарабарщину за пределами диалогов\"\n\n#. Key:\tsettings_pause_game_idle\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Game settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Pause game when idle\"\nmsgstr \"Приостановить игру, когда система находится в ждущем режиме\"\n\n#. Key:\tsettings_pause_game_idle_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Game settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Pauses the game when the user is idle for a certain amount of minutes\"\nmsgstr \"Приостановить игру если пользователь был неактивен несколько минут\"\n\n#. Key:\tsettings_pause_game_unfocused\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Game settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Pause game when unfocused\"\nmsgstr \"Приостановить игру, когда окно игры вне фокуса\"\n\n#. Key:\tsettings_pause_game_unfocused_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Game settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Pauses the game when the game loses focus\"\nmsgstr \"Отключить звук, когда окно игры вне фокуса\"\n\n#. Key:\tsettings_post_effects\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Post-Effects\"\nmsgstr \"Пост-эффекты\"\n\n#. Key:\tsettings_post_effects_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Affects the quality of the post process effects after the scene is rendered.\"\nmsgstr \"Влияет на качество эффектов постпроцесса после рендеринга сцены.\"\n\n#. Key:\tsettings_quality_epic\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings quality\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Epic\"\nmsgstr \"Эпический\"\n\n#. Key:\tsettings_quality_high\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings quality\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"High\"\nmsgstr \"Высокий\"\n\n#. Key:\tsettings_quality_low\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings quality\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Low\"\nmsgstr \"Низкий\"\n\n#. Key:\tsettings_quality_medium\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings quality\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Medium\"\nmsgstr \"Средний\"\n\n#. Key:\tsettings_ratio_16_10\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings Aspect Ratio\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"16:10\"\nmsgstr \"16:10\"\n\n#. Key:\tsettings_ratio_16_9\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings Aspect Ratio\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"16:9\"\nmsgstr \"16:9\"\n\n#. Key:\tsettings_ratio_4_3\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings Aspect Ratio\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"4:3\"\nmsgstr \"4:3\"\n\n#. Key:\tsettings_reset\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Reset\"\nmsgstr \"Сбросить\"\n\n#. Key:\tsettings_reset_default\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Settings reset to default\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Reset to Defaults\"\nmsgstr \"Сбросить к основным\"\n\n#. Key:\tsettings_reset_input_key\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input reset key to default\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Reset button to default\"\nmsgstr \"Кнопка сброса по умолчанию\"\n\n#. Key:\tsettings_resolution\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Resolution\"\nmsgstr \"Разрешение\"\n\n#. Key:\tsettings_resolution_entry\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings. {0} - x, {1} - Y\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"{0}x{1}\"\nmsgstr \"{0}x{1}\"\n\n#. Key:\tsettings_resolution_scale\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Resolution Scale\"\nmsgstr \"Масштаб разрешения\"\n\n#. Key:\tsettings_resolution_scale_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"The desired resolution to use when rendering the game. It does not affect the UI.\\nLowering it improves performance on lower end machines.\"\nmsgstr \"Желаемое разрешение для использования при рендеринге игры. Оно не влияет на пользовательский интерфейс.\\nПонижение его улучшает производительность на более слабых компьютерах.\"\n\n#. Key:\tsettings_resolution_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Allows changing the Screen Resolution.\"\nmsgstr \"Позволяет изменять разрешение экрана.\"\n\n#. Key:\tsettings_select_another\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Settings input\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Select another\"\nmsgstr \"Выбрать другое\"\n\n#. Key:\tsettings_shadows\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Shadow Quality\"\nmsgstr \"Качество Тени\"\n\n#. Key:\tsettings_shadows_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"The higher the quality the finer the shadow.\"\nmsgstr \"Чем выше качество, тем тоньше тень.\"\n\n#. Key:\tsettings_textures\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Texture Quality\"\nmsgstr \"Качество текстуры\"\n\n#. Key:\tsettings_textures_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Surfaces of the game world will increase in fidelity if the setting is higher.\"\nmsgstr \"Поверхности игрового мира будут более точными, если значение параметра выше.\"\n\n#. Key:\tsettings_unknown\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Unknown\"\nmsgstr \"Неизвестный\"\n\n#. Key:\tsettings_volumetric_fog\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Volumetric Fog\"\nmsgstr \"Объемный туман\"\n\n#. Key:\tsettings_volumetric_fog_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Realistic looking fog. Has a high performance impact, disable it to improve performance.\"\nmsgstr \"Реалистично выглядящий туман. Он воздействует на производительность, отключая ее для повышения производительности.\"\n\n#. Key:\tsettings_vsync\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Vertical Sync\"\nmsgstr \"Вертикальная синхронизация\"\n\n#. Key:\tsettings_vsync_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Synchronize the game refresh rate with the monitor refresh rate. Disable it for higher framerate and better input response.\\nWhen enabled it prevents screen tearing.\"\nmsgstr \"Синхронизация частоты обновления игры с частотой обновления экрана. Отключите ее для более высокой частоты кадров и лучшей загрузки.\\nПри включении предотвращает разрыв экрана.\"\n\n#. Key:\tsettings_windowed\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Windowed\"\nmsgstr \"Оконный\"\n\n#. Key:\tskip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"text near the press and hold to skip confirmation button\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Skip\"\nmsgstr \"Пропустить\"\n\n#. Key:\tspell_cast_switch_controls\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Quick select spells up/down/left/right\"\nmsgstr \"Быстрый выбор заклинаний вверх/вниз/влево/право\"\n\n#. Key:\tspell_cast_switch_select_cast\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Select & Cast\"\nmsgstr \"Выбрать Заклинание & Заколдовать\"\n\n#. Key:\tspell_cooldown_stops_in_air\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Spell\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Cooldown only starts on ground\"\nmsgstr \"Восстановление начинается только на земле\"\n\n#. Key:\tspell_only_in_air\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Spell\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Can not be used in air\"\nmsgstr \"Не может быть использован в воздухе\"\n\n#. Key:\tspell_restricted\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Spell\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Can not be used in restricted areas\"\nmsgstr \"Не может быть использовано в зонах ограниченного доступа\"\n\n#. Key:\tstart\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"The name of the checkpoint. Custom Map action\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Start\"\nmsgstr \"Старт\"\n\n#. Key:\tstart_game\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Menu Start Game\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Start Game\"\nmsgstr \"Начать Игру\"\n\n#. Key:\tstats_usage_description\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Analytics popup\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Not Yet would like to collect usage statistics from your game automatically.\\nThese are not used to identify individuals, but help us to understand players needs to improve our game.\\n\\nSelect \\\"Send Automatically\\\" to allow collection of usage statistics,\\nor \\\"Do Not Send\\\" to prevent the game from sending information to Not Yet.\\n\\nYou can change this setting at any time via the Settings Game tab.\"\nmsgstr \"Not Yet хотел бы автоматически собирать собирать пользовательскую статистику. \\nОна не используется для идентификации личности, но помогает нам понять потребности игроков в улучшении нашей игры.\\n\\nВыберите “Отправить автоматически”, чтобы разрешить сбор статистики,\\nили “Не посылать”, чтобы предотвратить отправку информации в “Not Yet”.\\nВы можете изменить эту настройку в любое время через вкладку “Настройки игры”.\"\n\n#. Key:\tstats_usage_title\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Analytics popup\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Usage Statistics\"\nmsgstr \"Статистика использования\"\n\n#. Key:\tstatus\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Status of a save/custom map\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Status\"\nmsgstr \"Статус\"\n\n#. Key:\tsteam_main_game\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Wishlist\"\nmsgstr \"В Желаемое\"\n\n#. Key:\tsteam_main_game_buy\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Buy Full Game\"\nmsgstr \"Купить Полную Игру\"\n\n#. Key:\tSwitch_FaceButton_Bottom\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"B Button\"\nmsgstr \"кнопка B\"\n\n#. Key:\tSwitch_FaceButton_Left\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Y Button\"\nmsgstr \"кнопка Y\"\n\n#. Key:\tSwitch_FaceButton_Right\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"A Button\"\nmsgstr \"кнопка A\"\n\n#. Key:\tSwitch_FaceButton_Top\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"X Button\"\nmsgstr \"кнопка X\"\n\n#. Key:\tSwitch_Gamepad_LeftStick_Down\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \" Switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Left Stick Down\"\nmsgstr \"левый мини-джойстик - Вниз\"\n\n#. Key:\tSwitch_Gamepad_LeftStick_Left\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \" Switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Left Stick Left\"\nmsgstr \"левый мини-джойстик - Влево\"\n\n#. Key:\tSwitch_Gamepad_LeftStick_Right\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \" Switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Left Stick Right\"\nmsgstr \"левый мини-джойстик - Вправо\"\n\n#. Key:\tSwitch_Gamepad_LeftStick_Up\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \" Switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Left Stick Up\"\nmsgstr \"левый мини-джойстик - Вверх\"\n\n#. Key:\tSwitch_Gamepad_RightStick_Down\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \" Switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Right Stick Down\"\nmsgstr \"правый мини-джойстик - Вниз\"\n\n#. Key:\tSwitch_Gamepad_RightStick_Left\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \" Switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Right Stick Left\"\nmsgstr \"правый мини-джойстик - Влево\"\n\n#. Key:\tSwitch_Gamepad_RightStick_Right\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \" Switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Right Stick Right\"\nmsgstr \"правый мини-джойстик - Вправо\"\n\n#. Key:\tSwitch_Gamepad_RightStick_Up\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \" Switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Right Stick Up\"\nmsgstr \"правый мини-джойстик - Вверх\"\n\n#. Key:\tSwitch_LeftThumbstick\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \" Switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Left Stick\"\nmsgstr \"левый мини-джойстик\"\n\n#. Key:\tSwitch_RightThumbstick\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \" Switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Right Stick\"\nmsgstr \"правый мини-джойстик\"\n\n#. Key:\tSwitch_Shoulder_Left\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"L Button\"\nmsgstr \"кнопка L\"\n\n#. Key:\tSwitch_Shoulder_Right\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"R Button\"\nmsgstr \"кнопка R\"\n\n#. Key:\tSwitch_special_dpad_down\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \" Switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Down Button\"\nmsgstr \"кнопка Вниз\"\n\n#. Key:\tSwitch_special_dpad_left\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \" Switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Left Button\"\nmsgstr \"кнопка Влево\"\n\n#. Key:\tSwitch_special_dpad_right\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \" Switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Right Button\"\nmsgstr \"кнопка Вправо\"\n\n#. Key:\tSwitch_special_dpad_up\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \" Switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Up Button\"\nmsgstr \"кнопка Вверх\"\n\n#. Key:\tSwitch_special_left\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"- Button\"\nmsgstr \"кнопка -\"\n\n#. Key:\tSwitch_special_right\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"+ Button\"\nmsgstr \"кнопка +\"\n\n#. Key:\tSwitch_Trigger_Left\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"ZL Button\"\nmsgstr \"кнопка ZL\"\n\n#. Key:\tSwitch_Trigger_Right\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"ZR Button\"\nmsgstr \"кнопка ZR\"\n\n#. Key:\tteleport_to_cp\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Menu Teleport To Checkpoint\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Teleport To Checkpoint\"\nmsgstr \"Телепорт на Чекпоинт\"\n\n#. Key:\tteleport_to_sk\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Menu Teleport to Soulkeeper\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Teleport To SoulKeeper\"\nmsgstr \"Телепорт к Хранителю Душ\"\n\n#. Key:\tthank_you_prologue\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"THANK YOU FOR PLAYING WARRIORB DEMO PROLOGUE, WE HOPE YOU HAD A GREAT TIME!\"\nmsgstr \"СПАСИБО ЗА ТО, ЧТО ИГРАЛИ В ДЕМО-ПРОЛОГ WARRIORB, НАДЕЕМСЯ, ВЫ ОТЛИЧНО ПРОВЕЛИ ВРЕМЯ!\"\n\n#. Key:\ttotal_deaths\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Stats for saves\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Total Deaths\"\nmsgstr \"Всего смертей\"\n\n#. Key:\ttrade_amount_x_x\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"trade confirmation UI. {0} is the current amount and {1} is the current amount times price per item\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"{0} for {1} gold\"\nmsgstr \"{0} за {1} золота\"\n\n#. Key:\ttrade_buy\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"trade confirmation UI\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Are you sure you want to buy {ItemName} for {Gold} gold?\"\nmsgstr \"Ты уверен, что хочешь купить {ItemName} за {Gold} золота?\"\n\n#. Key:\ttrade_buy_back\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"trade confirmation UI\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Are you sure you want to buy back {ItemName} for {Gold} gold?\"\nmsgstr \"Ты уверен, что хочешь выкупить {ItemName} за {Gold} золота?\"\n\n#. Key:\ttrade_no_intrested\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"trade confirmation UI\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"The trader is not interested in buying that item from you!\"\nmsgstr \"Торговец не заинтересован в покупке этого предмета!\"\n\n#. Key:\ttrade_nope\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"trade confirmation UI\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Nope!\"\nmsgstr \"Нет!\"\n\n#. Key:\ttrade_okay\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"trade confirmation UI\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Okay...\"\nmsgstr \"Ок…\"\n\n#. Key:\ttrade_sell\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"trade confirmation UI\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Are you sure you want to sell {ItemName} for {Gold} gold?\"\nmsgstr \"Ты уверен, что хочешь продать {ItemName} за {Gold}золота?\"\n\n#. Key:\ttwitter\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Twitter\"\nmsgstr \"Twitter\"\n\n#. Key:\tunknown\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Unknown input binding\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"UNKNOWN\"\nmsgstr \"Неизвестный\"\n\n#. Key:\twarriorb\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"WarriOrb\"\nmsgstr \"WarriOrb\"\n\n#. Key:\txp\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Experience Points\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"XP\"\nmsgstr \"XP\"\n\n#. Key:\tyes\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Confirm popup\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Yes\"\nmsgstr \"Да\"\n\n"
  },
  {
    "path": "Content/Localization/WarriorbDemo/uk/WarriorbDemo.po",
    "content": "﻿# WarriorbDemo Ukrainian translation.\n# Copyright 1998-2019 Epic Games, Inc. All Rights Reserved.\n# \nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: WarriorbDemo\\n\"\n\"POT-Creation-Date: 2020-10-07 08:08\\n\"\n\"PO-Revision-Date: 2020-10-07 08:08\\n\"\n\"Language-Team: \\n\"\n\"Language: uk\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\\n\"\n\n#. Key:\tact1_loading\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"You are a Mighty Spirit from the Unknown Realm. You were torn away from your home by a pathetic mortal Wizard. After a magical accident your essence is bound to an unlikely body. Find a way out of your ball-body prison!\"\nmsgstr \"\"\n\n#. Key:\tact2_loading\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Reaching Crossroad Cave you are a step closer to the Three Artifacts - and to freedom.\"\nmsgstr \"\"\n\n#. Key:\tact3_loading\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Finding the Three Artifacts required all your skills and strength. You hope that delivering them to the Wizard will be less difficult.\"\nmsgstr \"\"\n\n#. Key:\tact_1\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"text displayed on black screen the first time a chapter is started\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Act I\"\nmsgstr \"\"\n\n#. Key:\tact_2\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"text displayed on black screen the first time a chapter is started\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Act II\"\nmsgstr \"\"\n\n#. Key:\tact_3\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"text displayed on black screen the first time a chapter is started\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Act III\"\nmsgstr \"\"\n\n#. Key:\tancient_arcade\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an area\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Ancient Arcade\"\nmsgstr \"\"\n\n#. Key:\tbubble_border\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an area\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Bubble Border\"\nmsgstr \"\"\n\n#. Key:\tcerulean_city\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an area\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Cerulean City\"\nmsgstr \"\"\n\n#. Key:\tchasm_chamber\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an area\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Chasm Chamber\"\nmsgstr \"\"\n\n#. Key:\tcrossroad_cave\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an area\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Crossroad Cave\"\nmsgstr \"\"\n\n#. Key:\tdarkest_dungeon\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an area\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Darkest Dungeon\"\nmsgstr \"\"\n\n#. Key:\tdwarven_dungeons\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an area\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Dwarven Dungeons\"\nmsgstr \"\"\n\n#. Key:\tending_loading\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Finally! You did your part of the deal, now it's the Wizard's turn to get you back home.\"\nmsgstr \"\"\n\n#. Key:\tepilogue\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"text displayed on black screen the first time a chapter is started\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Epilogue\"\nmsgstr \"\"\n\n#. Key:\tgrey_gate\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an area\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Grey Gate\"\nmsgstr \"\"\n\n#. Key:\thallowed_heart\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an area, Hallowed as in made holy; consecrated.\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Hallowed Heart\"\nmsgstr \"\"\n\n#. Key:\tintro_subtitle_0\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" intro subtitle line 1\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"I wish I could just... turn back time to undo what I have done.\"\nmsgstr \"\"\n\n#. Key:\tintro_subtitle_1\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" intro subtitle line 01\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"However the past is behind us\"\nmsgstr \"\"\n\n#. Key:\tintro_subtitle_2\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" intro subtitle line 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"and all I can change now\"\nmsgstr \"\"\n\n#. Key:\tintro_subtitle_3\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" intro subtitle line 3\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"is the future.\"\nmsgstr \"\"\n\n#. Key:\tlast_land\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an area\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Last Land\"\nmsgstr \"\"\n\n#. Key:\tlava_lair\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an area\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Lava Lair\"\nmsgstr \"\"\n\n#. Key:\tloading_tip_act1_0\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 1\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"In Ball form you go faster.\"\nmsgstr \"\"\n\n#. Key:\tloading_tip_act1_1\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 1\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"In Ball form you bounce back when you hit a surface.\"\nmsgstr \"\"\n\n#. Key:\tloading_tip_act1_2\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 1\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Each weapon has its own unique special strike.\"\nmsgstr \"\"\n\n#. Key:\tloading_tip_act1_3\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 1\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Most of the people died after Ruin happened, but there are still some survivors.\"\nmsgstr \"\"\n\n#. Key:\tloading_tip_act1_4\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 1\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Some items can’t be used but merchants still like to buy them.\"\nmsgstr \"\"\n\n#. Key:\tloading_tip_act1_5\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 1\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"There are many keys, and when I say many, I mean it.\"\nmsgstr \"\"\n\n#. Key:\tloading_tip_act1_6\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 1\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"When you find an item it would make sense to check what it is, wouldn’t it?\"\nmsgstr \"\"\n\n#. Key:\tloading_tip_act1_7\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 1\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Spells can make combat easier.\"\nmsgstr \"\"\n\n#. Key:\tloading_tip_act1_8\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 1\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Dying often is absolutely normal. If you don’t die a lot, you are doing something wrong.\"\nmsgstr \"\"\n\n#. Key:\tloading_tip_act1_9\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 1\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"You can always check the Sidenotes in your Inventory to see if you have any side quests.\"\nmsgstr \"\"\n\n#. Key:\tloading_tip_act2_0\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Using the Railway can shorten your journey.\"\nmsgstr \"\"\n\n#. Key:\tloading_tip_act2_1\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"We’ll try to make our next game without any loading screens, we promise...\"\nmsgstr \"\"\n\n#. Key:\tloading_tip_act2_2\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Choosing the right weapon against a Boss will make your life easier.\"\nmsgstr \"\"\n\n#. Key:\tloading_tip_act2_3\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Don’t forget to use the Soulkeeper!\"\nmsgstr \"\"\n\n#. Key:\tloading_tip_act2_4\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Finding the Artefacts might be hard, but this is your only chance to get out.\"\nmsgstr \"\"\n\n#. Key:\tloading_tip_act2_5\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Talk to any Survivor if you can. They might be able to help you.\"\nmsgstr \"\"\n\n#. Key:\tloading_tip_act2_6\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"If you find an area too difficult you can always go to another area first.\"\nmsgstr \"\"\n\n#. Key:\tloading_tip_act2_7\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Don’t forget to spend your gold! (Ad sponsored by Gnory)\"\nmsgstr \"\"\n\n#. Key:\tloading_tip_act2_8\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Equipping the right items will make the combat easier.\"\nmsgstr \"\"\n\n#. Key:\tloading_tip_act2_9\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"If you manage to defeat every member of a group you won’t have to fight them ever again.\"\nmsgstr \"\"\n\n#. Key:\tloading_tip_act3_0\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 3\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Using the Railway can also make your Journey longer.\"\nmsgstr \"\"\n\n#. Key:\tloading_tip_act3_1\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 3\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"If you got this far, you surely know everything now.\"\nmsgstr \"\"\n\n#. Key:\tloading_tip_act3_2\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 3\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Loading screen tips are very useful - except in a few cases.\"\nmsgstr \"\"\n\n#. Key:\tloading_tip_act3_3\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 3\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Now is your time to think about the fate of the Ruined Realm.\"\nmsgstr \"\"\n\n#. Key:\tloading_tip_act3_4\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 3\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"The End is near... I mean no loading screen can take forever, right?\"\nmsgstr \"\"\n\n#. Key:\tloading_tip_act3_5\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 3\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Now your only task is to bring the Artefacts to Wizard.\"\nmsgstr \"\"\n\n#. Key:\tloading_tip_act3_6\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 3\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"If you find a combat too hard try to use different shards, spells, and weapons.\"\nmsgstr \"\"\n\n#. Key:\tloading_tip_act3_7\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 3\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Don’t give up! Victory is close.\"\nmsgstr \"\"\n\n#. Key:\tloading_tip_end_0\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for epilogue\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"The Human Realm is a weird place...\"\nmsgstr \"\"\n\n#. Key:\tloading_tip_end_1\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for epilogue\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"You really did your part of the deal, now it’s time to go home!\"\nmsgstr \"\"\n\n#. Key:\tloading_tip_end_2\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for epilogue\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Should you care about the fate of the Realms?\"\nmsgstr \"\"\n\n#. Key:\tloading_tip_end_3\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for epilogue\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Looks like it’s always you who has to take care of the mess others left behind.\"\nmsgstr \"\"\n\n#. Key:\tloading_tip_end_4\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for epilogue\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Time to finish what you started. One way or another.\"\nmsgstr \"\"\n\n#. Key:\tlost_land\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an area\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Lost Land\"\nmsgstr \"\"\n\n#. Key:\tobedient_outpost\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an area\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Obedient Outpost\"\nmsgstr \"\"\n\n#. Key:\tperfect_palace\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an area\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Perfect Palace\"\nmsgstr \"\"\n\n#. Key:\tportal_place\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an area\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Portal Place\"\nmsgstr \"\"\n\n#. Key:\tprogress_act1_arcade1\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Remnants of a Realm\"\nmsgstr \"\"\n\n#. Key:\tprogress_act1_arcade2\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Discovering Ancient Technology\"\nmsgstr \"\"\n\n#. Key:\tprogress_act1_before_raven\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Searching for a way out\"\nmsgstr \"\"\n\n#. Key:\tprogress_act1_boss_fight\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Facing the Keeper\"\nmsgstr \"\"\n\n#. Key:\tprogress_act1_gem\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Looking for a Gem\"\nmsgstr \"\"\n\n#. Key:\tprogress_act1_infuse\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Infusing the Gem\"\nmsgstr \"\"\n\n#. Key:\tprogress_act1_portals\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Looking for a Portal\"\nmsgstr \"\"\n\n#. Key:\tprogress_act1_start\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Lost in Ruin\"\nmsgstr \"\"\n\n#. Key:\tprogress_act1_test_stone\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Bouncing Stones\"\nmsgstr \"\"\n\n#. Key:\tprogress_act1_tut1\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Am I Worthy?\"\nmsgstr \"\"\n\n#. Key:\tprogress_act1_tut2\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Sewer again\"\nmsgstr \"\"\n\n#. Key:\tprogress_act1_tut3\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Third time Worthy\"\nmsgstr \"\"\n\n#. Key:\tprogress_act2_crossroad\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"At a crossroad\"\nmsgstr \"\"\n\n#. Key:\tprogress_act2_dwarf_0\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Into the Blue\"\nmsgstr \"\"\n\n#. Key:\tprogress_act2_dwarf_1\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Elevator Gem and Key\"\nmsgstr \"\"\n\n#. Key:\tprogress_act2_dwarf_2\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Opening the Gate\"\nmsgstr \"\"\n\n#. Key:\tprogress_act2_dwarf_boss\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Dwarven Statue\"\nmsgstr \"\"\n\n#. Key:\tprogress_act2_end\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"To the Fourth Station\"\nmsgstr \"\"\n\n#. Key:\tprogress_act2_lava_0\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Into the Red\"\nmsgstr \"\"\n\n#. Key:\tprogress_act2_lava_1\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Uniting Key Pieces\"\nmsgstr \"\"\n\n#. Key:\tprogress_act2_lava_2\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Climbing the Tower\"\nmsgstr \"\"\n\n#. Key:\tprogress_act2_lava_boss\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Armour Wrath\"\nmsgstr \"\"\n\n#. Key:\tprogress_act2_ww_0\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Into the Green\"\nmsgstr \"\"\n\n#. Key:\tprogress_act2_ww_1\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Through the Lake\"\nmsgstr \"\"\n\n#. Key:\tprogress_act2_ww_2\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Being Followed\"\nmsgstr \"\"\n\n#. Key:\tprogress_act2_ww_boss\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Fallen Druid\"\nmsgstr \"\"\n\n#. Key:\tprogress_act3_floating\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in act 3\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Floating\"\nmsgstr \"\"\n\n#. Key:\tprogress_act3_monk\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in act 3\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Monk's Home\"\nmsgstr \"\"\n\n#. Key:\tprogress_act3_pipes\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in act 3\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Moving Pipes\"\nmsgstr \"\"\n\n#. Key:\tprogress_act3_start\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in act 3\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Lost in the Caves\"\nmsgstr \"\"\n\n#. Key:\tprogress_act3_way_out\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in act 3\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Way out of the Realm\"\nmsgstr \"\"\n\n#. Key:\tprogress_epilogue_boss\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in epilogue\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"The Real Demon\"\nmsgstr \"\"\n\n#. Key:\tprogress_epilogue_castle\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in epilogue\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Wizard's Castle\"\nmsgstr \"\"\n\n#. Key:\tprogress_epilogue_past_and_future\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in epilogue\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Past and Future\"\nmsgstr \"\"\n\n#. Key:\tprogress_epilogue_save_creatures\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in epilogue\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Chance for everyone\"\nmsgstr \"\"\n\n#. Key:\tprogress_epilogue_separate_worlds\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in epilogue\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Separated Worlds\"\nmsgstr \"\"\n\n#. Key:\tprologue\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"text displayed on black screen the first time a chapter is started\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Prologue\"\nmsgstr \"\"\n\n#. Key:\tremnant_road\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an area\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Remnant Road\"\nmsgstr \"\"\n\n#. Key:\truined_realm\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Ruined Realm\"\nmsgstr \"\"\n\n#. Key:\tsnake_slide\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an area\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Snake Slide\"\nmsgstr \"\"\n\n#. Key:\tsunken_sewer\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an area\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Sunken Sewer\"\nmsgstr \"\"\n\n#. Key:\twhite_wall\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"White Wall\"\nmsgstr \"\"\n\n#. Key:\twracked_waters\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an area\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Wracked Waters\"\nmsgstr \"\"\n\n#. Key:\tcredits_fmod\n#. SourceLocation:\tLocalization/StringTables/Credits.csv\n#: Localization/StringTables/Credits.csv\nmsgctxt \"Credits\"\nmsgid \"Made with FMOD Studio by Firelight Technologies Pty Ltd.\"\nmsgstr \"\"\n\n#. Key:\tMonthApril\n#. SourceLocation:\tSource/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:17\n#: Source/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:17\nmsgctxt \"DateTimeHelper\"\nmsgid \"April\"\nmsgstr \"\"\n\n#. Key:\tMonthAugust\n#. SourceLocation:\tSource/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:21\n#: Source/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:21\nmsgctxt \"DateTimeHelper\"\nmsgid \"August\"\nmsgstr \"\"\n\n#. Key:\tMonthDecember\n#. SourceLocation:\tSource/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:26\n#: Source/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:26\nmsgctxt \"DateTimeHelper\"\nmsgid \"December\"\nmsgstr \"\"\n\n#. Key:\tMonthFebruary\n#. SourceLocation:\tSource/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:15\n#: Source/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:15\nmsgctxt \"DateTimeHelper\"\nmsgid \"February\"\nmsgstr \"\"\n\n#. Key:\tMonthJanuary\n#. SourceLocation:\tSource/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:14\n#: Source/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:14\nmsgctxt \"DateTimeHelper\"\nmsgid \"January\"\nmsgstr \"\"\n\n#. Key:\tMonthJuly\n#. SourceLocation:\tSource/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:20\n#: Source/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:20\nmsgctxt \"DateTimeHelper\"\nmsgid \"July\"\nmsgstr \"\"\n\n#. Key:\tMonthJune\n#. SourceLocation:\tSource/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:19\n#: Source/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:19\nmsgctxt \"DateTimeHelper\"\nmsgid \"June\"\nmsgstr \"\"\n\n#. Key:\tMonthMarch\n#. SourceLocation:\tSource/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:16\n#: Source/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:16\nmsgctxt \"DateTimeHelper\"\nmsgid \"March\"\nmsgstr \"\"\n\n#. Key:\tMonthMay\n#. SourceLocation:\tSource/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:18\n#: Source/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:18\nmsgctxt \"DateTimeHelper\"\nmsgid \"May\"\nmsgstr \"\"\n\n#. Key:\tMonthNovember\n#. SourceLocation:\tSource/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:24\n#: Source/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:24\nmsgctxt \"DateTimeHelper\"\nmsgid \"November\"\nmsgstr \"\"\n\n#. Key:\tMonthOctober\n#. SourceLocation:\tSource/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:23\n#: Source/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:23\nmsgctxt \"DateTimeHelper\"\nmsgid \"October\"\nmsgstr \"\"\n\n#. Key:\tMonthSeptember\n#. SourceLocation:\tSource/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:22\n#: Source/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:22\nmsgctxt \"DateTimeHelper\"\nmsgid \"September\"\nmsgstr \"\"\n\n#. Key:\tSecondsToTime\n#. SourceLocation:\tSource/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:48\n#: Source/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:48\nmsgctxt \"DateTimeHelper\"\nmsgid \"{Minutes}:{Seconds}\"\nmsgstr \"\"\n\n#. Key:\tSecondsToTimeMinusSeconds\n#. SourceLocation:\tSource/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:51\n#: Source/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:51\nmsgctxt \"DateTimeHelper\"\nmsgid \"{Hours}:{Minutes}:{Seconds}\"\nmsgstr \"\"\n\n#. Key:\tchar_name_ball_e\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"possible display name for character\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"BALL-E\"\nmsgstr \"\"\n\n#. Key:\tchar_name_destroyer\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"possible display name for character\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Destroyer\"\nmsgstr \"\"\n\n#. Key:\tchar_name_dont_buy\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"possible display name for character\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Don't buy\"\nmsgstr \"\"\n\n#. Key:\tchar_name_dr_ball\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"possible display name for character\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Dr. Ball\"\nmsgstr \"\"\n\n#. Key:\tchar_name_epic_sphero\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"possible display name for character\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Epic Sphero\"\nmsgstr \"\"\n\n#. Key:\tchar_name_failed_one\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"possible display name for character\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Failed One\"\nmsgstr \"\"\n\n#. Key:\tchar_name_saviour\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"possible display name for character\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Saviour\"\nmsgstr \"\"\n\n#. Key:\tchar_name_sorbcerer\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"possible display name for character\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Sorbcerer\"\nmsgstr \"\"\n\n#. Key:\tchar_name_spirit_of_the_unknown\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"possible display name for character\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Spirit Of the Unknown\"\nmsgstr \"\"\n\n#. Key:\tchar_name_ultimate_frisbee\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"possible display name for character\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Ultimate Frisbee\"\nmsgstr \"\"\n\n#. Key:\tchar_name_wanderer\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"possible display name for character\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Wanderer\"\nmsgstr \"\"\n\n#. Key:\tchar_name_warlorb\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"possible display name for character\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Warlorb\"\nmsgstr \"\"\n\n#. Key:\tchar_name_warriorb\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"possible display name for character\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"WarriOrb\"\nmsgstr \"\"\n\n#. Key:\tfinish\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"default option\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Finish\"\nmsgstr \"\"\n\n#. Key:\tgold_gained\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"{0} Gold Gained\"\nmsgstr \"\"\n\n#. Key:\tgold_lost\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"{0} Gold Lost\"\nmsgstr \"\"\n\n#. Key:\titem_gained\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"{ItemName} gained!\"\nmsgstr \"\"\n\n#. Key:\titem_gained_n\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"{Amount} {ItemName} gained!\"\nmsgstr \"\"\n\n#. Key:\titem_lost\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"{ItemName} lost!\"\nmsgstr \"\"\n\n#. Key:\titem_lost_n\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"{Amount} {ItemName} lost!\"\nmsgstr \"\"\n\n#. Key:\tnext\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"default option\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Next\"\nmsgstr \"\"\n\n#. Key:\tnpc_altar\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"npc if BPLanguage Improver\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Altar\"\nmsgstr \"\"\n\n#. Key:\tnpc_ancient_gate\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an npc\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Ancient Gate\"\nmsgstr \"\"\n\n#. Key:\tnpc_demon_lillian\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"name of the final boss\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Demon Lillian\"\nmsgstr \"\"\n\n#. Key:\tnpc_dwarven_workshop\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"name of the place the character can have a dialogue to craft a quest item\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Dwarven Workshop\"\nmsgstr \"\"\n\n#. Key:\tnpc_fishy\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"display name of an npc\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Fishy\"\nmsgstr \"\"\n\n#. Key:\tnpc_fountain\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"display name of a fountain the character can talk with\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Fountain\"\nmsgstr \"\"\n\n#. Key:\tnpc_gatekeeper\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an npc\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Gatekeeper\"\nmsgstr \"\"\n\n#. Key:\tnpc_ghost_dwarf\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an npc (actually a ghost of a dwarf)\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Ghost Dwarf\"\nmsgstr \"\"\n\n#. Key:\tnpc_gnory\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an npc\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Gnory\"\nmsgstr \"\"\n\n#. Key:\tnpc_golem_maker\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an npc\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Golem Maker\"\nmsgstr \"\"\n\n#. Key:\tnpc_lory\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an npc\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Lory\"\nmsgstr \"\"\n\n#. Key:\tnpc_lory_unkown\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"display name of Lory before she introduces herself\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Gnome Lady\"\nmsgstr \"\"\n\n#. Key:\tnpc_magic_mirror\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an npc\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Magic Mirror\"\nmsgstr \"\"\n\n#. Key:\tnpc_merchant\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an npc\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Merch Ant\"\nmsgstr \"\"\n\n#. Key:\tnpc_merchant_voice\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"name of a small ant until he says his name (only a voice cause player can not see it)\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Voice\"\nmsgstr \"\"\n\n#. Key:\tnpc_monk\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an npc\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Monk\"\nmsgstr \"\"\n\n#. Key:\tnpc_name_kobold\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Kobold Chef\"\nmsgstr \"\"\n\n#. Key:\tnpc_pipe_walker\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"display name of some weird creatures\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Pipe Walker\"\nmsgstr \"\"\n\n#. Key:\tnpc_raven\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an npc (he is actually a bird)\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Raven\"\nmsgstr \"\"\n\n#. Key:\tnpc_scholar\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an npc\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Scholar\"\nmsgstr \"\"\n\n#. Key:\tnpc_secret_hideout\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"display name of a door asking for a password\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Secret Hideout Gate\"\nmsgstr \"\"\n\n#. Key:\tnpc_sewer_creature\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an npc\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Sewer Creature\"\nmsgstr \"\"\n\n#. Key:\tnpc_statue\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an npc\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Statue\"\nmsgstr \"\"\n\n#. Key:\tnpc_supper_dwarf\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"display name of an npc. Supper refers here an evening meal, typically a light or informal one.\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Supper Dwarf\"\nmsgstr \"\"\n\n#. Key:\tnpc_teachy\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an npc\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Teachy\"\nmsgstr \"\"\n\n#. Key:\tnpc_teachy_unkown\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"name of Teachy before introduction\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Bored Gnome\"\nmsgstr \"\"\n\n#. Key:\tnpc_tomb\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"display name of a tomb a character can talk to\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Tomb\"\nmsgstr \"\"\n\n#. Key:\tnpc_unknown_wizard\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"display name of an npc\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Unknown Wizard\"\nmsgstr \"\"\n\n#. Key:\tnpc_wizard\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"display name of the wizard npc\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Wizard\"\nmsgstr \"\"\n\n#. Key:\t022227664F6F422B20B109A19B8789AA\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"I’m glad you are back again!\"\nmsgstr \"\"\n\n#. Key:\t0944D8A541F933BEB5DD068CA9099075\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_44.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_44.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"I think I managed to activate the device on the wall of the Portal Tower.\"\nmsgstr \"\"\n\n#. Key:\t10ADF4F948FB99445BF791BB0722AD90\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_25.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_25.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Good idea.\"\nmsgstr \"\"\n\n#. Key:\t137B87BB447D45E46C0425A940E8B7F0\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_46.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_46.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"You said you wouldn't do it...\"\nmsgstr \"\"\n\n#. Key:\t16358AE840D8B8553E8930A3B7E69BBA\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"You know, sometimes I miss the Pipewalkers...\"\nmsgstr \"\"\n\n#. Key:\t1B9834C6405C60960F322585AB0F1704\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_38.Text\n#. Key:\t2189E8064ACF974902FBA49BD12D0F47\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_38.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Could you activate it for me?\"\nmsgstr \"\"\n\n#. Key:\t274EB7AD410061E3E200A9813A54AB29\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"I think I've already done that.\"\nmsgstr \"\"\n\n#. Key:\t2A57878148EFCC8532E34CAE1B9C9A0F\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"You? I never thought I’ll see you in this shape again.\"\nmsgstr \"\"\n\n#. Key:\t3764BB48401ABEDCD125F186B4BF0E17\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"And it also attracts the Pipewalkers.\"\nmsgstr \"\"\n\n#. Key:\t3A0924F7449355545C0A98B94994616B\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"I want to find my tribe.\"\nmsgstr \"\"\n\n#. Key:\t3C0498284D71B7B64FEA4094F42A5502\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_23.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_23.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Do you think you will find Pipewalkers here?\"\nmsgstr \"\"\n\n#. Key:\t3DCACAB047175FB687542AB0CA25D972\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_38.Children(1).Children.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_38.Children(1).Children.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Decline\"\nmsgstr \"\"\n\n#. Key:\t41C1FCA947041D49247FC8A157D7407F\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_52.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_52.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"All right, thank you.\"\nmsgstr \"\"\n\n#. Key:\t43C8FE9248340E49F1F31882D7B96642\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"If they are still alive they must be beyond that Purple Portal.\"\nmsgstr \"\"\n\n#. Key:\t444DD931423A98C7DD95D4BB73F0F1C6\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_39.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_39.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Sure! I’ll see what I can do.\"\nmsgstr \"\"\n\n#. Key:\t4FF2FA154BEFBD448EFDB0BB7FE3F0AF\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_11.Children(1).Children.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_11.Children(1).Children.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Tribe\"\nmsgstr \"\"\n\n#. Key:\t52A8B1F04C37F262E014DEA14AB68957\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Because I’m a chef.\"\nmsgstr \"\"\n\n#. Key:\t5F376BF945B8CE4AA12B7EB05F8C62A5\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_11.Children(6).Children.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_11.Children(6).Children.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Leave\"\nmsgstr \"\"\n\n#. Key:\t63EA4DDD45390542E3A904928143D9AF\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Haha... Yes I’m back again.\"\nmsgstr \"\"\n\n#. Key:\t64EE856046A396F2750AE1BC1042CF26\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_30.Text\n#. Key:\tE3F52F4F47289406E4A546BB0BF3AC3F\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_50.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_30.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_50.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Thanks!\"\nmsgstr \"\"\n\n#. Key:\t694B6E3F4F4C7CEAAACB51A2D30FFD26\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_11.Children(2).Children.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_11.Children(2).Children.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Ruin\"\nmsgstr \"\"\n\n#. Key:\t7304F1034A83C6D17E274090FA8E543B\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_41.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_41.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Thank you!\"\nmsgstr \"\"\n\n#. Key:\t73240093450B12BEEA1EB78C9CF7D89E\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_11.Children(0).Children.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_11.Children(0).Children.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Purple Portal\"\nmsgstr \"\"\n\n#. Key:\t804671AF40165C92FA6A8F8A5AE97997\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_60.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_60.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Looks like I can’t get rid of this body.\"\nmsgstr \"\"\n\n#. Key:\t807FF1A945548216DAD305B4D5A4437F\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_24.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_24.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"If there are any they will come here when they smell the soup.\"\nmsgstr \"\"\n\n#. Key:\t8240EF7946C8434333AFAEBEF3583917\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_34.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_34.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Do you need help with something?\"\nmsgstr \"\"\n\n#. Key:\t833BB4384231444247779CAB596D0259\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_40.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_40.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"I’m sorry but that sounds complicated.\"\nmsgstr \"\"\n\n#. Key:\t85656A9E46844B03D49E13AC951FDE07\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_59.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_59.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"See you!\"\nmsgstr \"\"\n\n#. Key:\t869485E24E19938DEE48BFB5C5240BB3\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_29.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_29.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"I’m not sure... but I have a key which might be useful.\"\nmsgstr \"\"\n\n#. Key:\t86FBA5A24734DD97167512A054A2E0D9\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Oh, it’s you.\"\nmsgstr \"\"\n\n#. Key:\t891684A24BA64E351E7F0B9ADEA3D6DF\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"No. To be honest I don’t care much about Ruin.\"\nmsgstr \"\"\n\n#. Key:\t8FF6BF7B4745BB75C2D8F7873C492C2D\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_11.Children(4).Children.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_11.Children(4).Children.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Can I help?\"\nmsgstr \"\"\n\n#. Key:\t93B13014434102C8033B41A06DBED69B\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_11.Children(5).Children.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_11.Children(5).Children.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Tower Device\"\nmsgstr \"\"\n\n#. Key:\t95A7C27A44B78CBF17C1FD8C9446CBD7\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Take it! I still need some time to finish the soup anyway.\"\nmsgstr \"\"\n\n#. Key:\t97E4FDC74B47A6037D6023A4C65B2934\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_37.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_37.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"If you activate it I’ll be able to use the portal to teleport to other places.\"\nmsgstr \"\"\n\n#. Key:\t9FD2679D44BEBBFBBAD2EAAECFFEE0D5\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_42.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_42.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"I can’t promise I’ll do that.\"\nmsgstr \"\"\n\n#. Key:\tAA1C6EF444BAB6A929E953A87BB87ABB\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_56.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_56.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"I've got to go. See you soon!\"\nmsgstr \"\"\n\n#. Key:\tAED4FBE3422E0FC4AC4BD38650F95CA9\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_26.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_26.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Thanks.\"\nmsgstr \"\"\n\n#. Key:\tB0BAD1934671ADCB2DD1E1BA582E3C68\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Why are you making soup?\"\nmsgstr \"\"\n\n#. Key:\tB621AECE42A14A508C945595493F3A3A\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Really? Anyway, I’m happy to see you.\"\nmsgstr \"\"\n\n#. Key:\tBA715D554C47932C092462B36ADEA081\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_58.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_58.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Good bye!\"\nmsgstr \"\"\n\n#. Key:\tBE7B3444431F43E8E1487F8702B94845\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_57.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_57.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"It was nice to meet you.\"\nmsgstr \"\"\n\n#. Key:\tC1BB24A443D4297B17E2F6A280B02E91\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_36.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_36.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Yes. According to a book I read here there is a device on the wall of the Portal Tower.\"\nmsgstr \"\"\n\n#. Key:\tC339B87742C2B475E2387F93418AA855\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Have you found out anything about Ruin?\"\nmsgstr \"\"\n\n#. Key:\tC4D263AB48B800D5522A24923C541ED3\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_11.Children(3).Children.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_11.Children(3).Children.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Soup\"\nmsgstr \"\"\n\n#. Key:\tC530096E4FA1A2B68077C3AD6AC1BF44\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_38.Children(0).Children.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_38.Children(0).Children.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Accept Quest\"\nmsgstr \"\"\n\n#. Key:\tC82668E6497A810FA6ADC0AB6F362B47\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"The soup is almost ready...\"\nmsgstr \"\"\n\n#. Key:\tCD8CDA3443CDE79BE257B99A0801B209\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_43.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_43.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"No problem.\"\nmsgstr \"\"\n\n#. Key:\tD058108241051A9FD0D130B3C9EA4B8B\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"It helps me keep my mind clear.\"\nmsgstr \"\"\n\n#. Key:\tD8F879684C57BB474E7153B971073663\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_49.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_49.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Meanwhile I cooked something special for you. Take this!\"\nmsgstr \"\"\n\n#. Key:\tDA9D493F42420BE9442B1EA983AEF9C2\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Any news on your lost tribe?\"\nmsgstr \"\"\n\n#. Key:\tDE2390ED4366A621E4D220A3761333DE\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_54.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_54.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"I need to go now.\"\nmsgstr \"\"\n\n#. Key:\tDE668E4B4A3D0F785A693B9190E635D3\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_47.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_47.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"How on earth have you managed to reach this node?\"\nmsgstr \"\"\n\n#. Key:\tE29E2D044497A86DD0FCA8B540703597\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_48.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_48.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Pls. report it as a bug.\"\nmsgstr \"\"\n\n#. Key:\tE6D3401944B2FF128DD1689F5159AF96\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_45.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_45.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Nice, well done!\"\nmsgstr \"\"\n\n#. Key:\tE83287164D066CCE8FBFDE835FBD4CFB\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_55.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_55.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"I'm on my way. Take care!\"\nmsgstr \"\"\n\n#. Key:\tEBC97F7C45858FE6DC72209536FC5C3B\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_27.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_27.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Do you know how can I reach that Purple Portal?\"\nmsgstr \"\"\n\n#. Key:\tF911D6CB45AA59448C03379A1C07DD60\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_51.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_51.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"It wasn’t that complicated after all.\"\nmsgstr \"\"\n\n#. Key:\tF9EBA1684D435C8AEB14129A7B57A604\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"I think they came here and followed the messages just like you.\"\nmsgstr \"\"\n\n#. Key:\t3DAA74ED48BE31E35D868FB1492E57A8\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/WW_Pergamen.WW_Pergamen:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/WhiteWall/WW_Pergamen.WW_Pergamen:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_WW_Pergamen\"\nmsgid \"'Ruin took over some of us. It's no longer safe here.'\"\nmsgstr \"\"\n\n#. Key:\tB10818134FFE3A1E99A9D789BFABBBEE\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/WW_Pergamen.WW_Pergamen:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/WhiteWall/WW_Pergamen.WW_Pergamen:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_WW_Pergamen\"\nmsgid \"'Come visit us beyond the Purple Portal!'\"\nmsgstr \"\"\n\n#. Key:\tD292364A4E58F52FB874AA98C1F969A6\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/WW_Pergamen.WW_Pergamen:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/WhiteWall/WW_Pergamen.WW_Pergamen:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_WW_Pergamen\"\nmsgid \"'We are close to the solution, but your help is still needed.'\"\nmsgstr \"\"\n\n#. Key:\t0CD0FD884718EF68B38D578CDE17110A\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/WW_Statue.WW_Statue:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/WhiteWall/WW_Statue.WW_Statue:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_WW_Statue\"\nmsgid \"Oooops...\"\nmsgstr \"\"\n\n#. Key:\t2D531D384CB6A56DBC4834BD229622E7\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/WW_Statue.WW_Statue:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/WhiteWall/WW_Statue.WW_Statue:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_WW_Statue\"\nmsgid \"'White Wall will never fall!'\"\nmsgstr \"\"\n\n#. Key:\t2690E77045D5E42F32AC6582BAFF27AA\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/WW_StatueWelcome.WW_StatueWelcome:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/WhiteWall/WW_StatueWelcome.WW_StatueWelcome:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_WW_StatueWelcome\"\nmsgid \"'We know how to stop Ruin.'\"\nmsgstr \"\"\n\n#. Key:\t7C3340434A4C80010AC2D58BF8504339\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/WW_StatueWelcome.WW_StatueWelcome:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/WhiteWall/WW_StatueWelcome.WW_StatueWelcome:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_WW_StatueWelcome\"\nmsgid \"'There is still hope.'\"\nmsgstr \"\"\n\n#. Key:\tarmour_wrath_name\n#. SourceLocation:\tLocalization/StringTables/Enemies.csv\n#. InfoMetaData:\t\"Comment\" : \"display name of an npc boss\"\n#: Localization/StringTables/Enemies.csv\nmsgctxt \"Enemies\"\nmsgid \"Armour Wrath\"\nmsgstr \"\"\n\n#. Key:\tdwarf_name\n#. SourceLocation:\tLocalization/StringTables/Enemies.csv\n#. InfoMetaData:\t\"Comment\" : \"display name of an npc boss\"\n#: Localization/StringTables/Enemies.csv\nmsgctxt \"Enemies\"\nmsgid \"Dwarf\"\nmsgstr \"\"\n\n#. Key:\tfallen_druid_name\n#. SourceLocation:\tLocalization/StringTables/Enemies.csv\n#. InfoMetaData:\t\"Comment\" : \"display name of an npc boss\"\n#: Localization/StringTables/Enemies.csv\nmsgctxt \"Enemies\"\nmsgid \"Fallen Druid\"\nmsgstr \"\"\n\n#. Key:\tdreamhack_completed_desc\n#. SourceLocation:\tLocalization/StringTables/Episodes.csv\n#: Localization/StringTables/Episodes.csv\nmsgctxt \"Episodes\"\nmsgid \"Thanks for playing the game, we hope you had a great time!\"\nmsgstr \"\"\n\n#. Key:\tdreamhack_completed_subtitle\n#. SourceLocation:\tLocalization/StringTables/Episodes.csv\n#: Localization/StringTables/Episodes.csv\nmsgctxt \"Episodes\"\nmsgid \"Dreamhack Demo\"\nmsgstr \"\"\n\n#. Key:\tdreamhack_desc\n#. SourceLocation:\tLocalization/StringTables/Episodes.csv\n#: Localization/StringTables/Episodes.csv\nmsgctxt \"Episodes\"\nmsgid \"What happens when you lock a mighty demon's spirit inside a ball body?\"\nmsgstr \"\"\n\n#. Key:\tdreamhack_friendly_name\n#. SourceLocation:\tLocalization/StringTables/Episodes.csv\n#: Localization/StringTables/Episodes.csv\nmsgctxt \"Episodes\"\nmsgid \"Dreamhack\"\nmsgstr \"\"\n\n#. Key:\tepisode_end_main_title\n#. SourceLocation:\tLocalization/StringTables/Episodes.csv\n#. InfoMetaData:\t\"Comment\" : \"episode map end panel text\"\n#: Localization/StringTables/Episodes.csv\nmsgctxt \"Episodes\"\nmsgid \"Episode Completed!\"\nmsgstr \"\"\n\n#. Key:\tescape_darkness_completed_desc\n#. SourceLocation:\tLocalization/StringTables/Episodes.csv\n#: Localization/StringTables/Episodes.csv\nmsgctxt \"Episodes\"\nmsgid \"\\\"And as Darkness spreads an unknown Warriorb will rise...\\\"\"\nmsgstr \"\"\n\n#. Key:\tescape_darkness_completed_subtitle\n#. SourceLocation:\tLocalization/StringTables/Episodes.csv\n#: Localization/StringTables/Episodes.csv\nmsgctxt \"Episodes\"\nmsgid \"Escaped from Darkness\"\nmsgstr \"\"\n\n#. Key:\tescape_darkness_desc\n#. SourceLocation:\tLocalization/StringTables/Episodes.csv\n#: Localization/StringTables/Episodes.csv\nmsgctxt \"Episodes\"\nmsgid \"Are you fast enough to race against Darkness itself?\"\nmsgstr \"\"\n\n#. Key:\tescape_darkness_friendly_name\n#. SourceLocation:\tLocalization/StringTables/Episodes.csv\n#: Localization/StringTables/Episodes.csv\nmsgctxt \"Episodes\"\nmsgid \"Escape Darkness\"\nmsgstr \"\"\n\n#. Key:\twhite_wall_completed_desc\n#. SourceLocation:\tLocalization/StringTables/Episodes.csv\n#. InfoMetaData:\t\"Comment\" : \"short text on the ending panel when player finishes this episode\"\n#: Localization/StringTables/Episodes.csv\nmsgctxt \"Episodes\"\nmsgid \"What happened beyond the portal is another story, which will be told at another time.\"\nmsgstr \"\"\n\n#. Key:\twhite_wall_completed_subtitle\n#. SourceLocation:\tLocalization/StringTables/Episodes.csv\n#. InfoMetaData:\t\"Comment\" : \"subtitle of the ending panel when player finishes this episode\"\n#. Key:\twhite_wall_friendly_name\n#. InfoMetaData:\t\"Comment\" : \"name the episode is displayed with in the ui\"\n#: Localization/StringTables/Episodes.csv\nmsgctxt \"Episodes\"\nmsgid \"White Wall\"\nmsgstr \"\"\n\n#. Key:\twhite_wall_desc\n#. SourceLocation:\tLocalization/StringTables/Episodes.csv\n#. InfoMetaData:\t\"Comment\" : \"map desc when the player can select the episode\"\n#: Localization/StringTables/Episodes.csv\nmsgctxt \"Episodes\"\nmsgid \"Although it's long abandoned the fortress of White Wall still stands against Ruin. After centuries of silence some groups of unexpected visitors broke the loneliness of the decaying city.\"\nmsgstr \"\"\n\n#. Key:\twhite_wall_loadingscreen_desc\n#. SourceLocation:\tLocalization/StringTables/Episodes.csv\n#. InfoMetaData:\t\"Comment\" : \"text on loading screen\"\n#: Localization/StringTables/Episodes.csv\nmsgctxt \"Episodes\"\nmsgid \"After months of researching I found a way to return back to the Ruined Realm. Ironically enough I have to use the same body I was trapped in before. I'll need to be quick and clever for this might be my very last chance to stop Ruin before it devours the World.\"\nmsgstr \"\"\n\n#. Key:\tchar_vo_armourwrath_attack_clap\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I won't fail the Maker!\"\nmsgstr \"\"\n\n#. Key:\tchar_vo_armourwrath_attack_die\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"No... I'm still... perfect\"\nmsgstr \"\"\n\n#. Key:\tchar_vo_armourwrath_attack_magic\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Resist Ruin!\"\nmsgstr \"\"\n\n#. Key:\tchar_vo_armourwrath_attack_strike_down\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Out of my way!\"\nmsgstr \"\"\n\n#. Key:\tchar_vo_armourwrath_attack_strike_down_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I am perfect\"\nmsgstr \"\"\n\n#. Key:\tchar_vo_dwarvenstatue_attack_axe_point\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I keep Ruin\"\nmsgstr \"\"\n\n#. Key:\tchar_vo_dwarvenstatue_attack_axe_strike_down\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"We are above the Law!\"\nmsgstr \"\"\n\n#. Key:\tchar_vo_dwarvenstatue_attack_meteor\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I can take more!\"\nmsgstr \"\"\n\n#. Key:\tchar_vo_dwarvenstatue_die\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I won't move... again\"\nmsgstr \"\"\n\n#. Key:\tchar_vo_dwarvenstatue_shield_knock\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I hold it back!\"\nmsgstr \"\"\n\n#. Key:\tchar_vo_fallendruid_attack_flybug\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"It's safe here.\"\nmsgstr \"\"\n\n#. Key:\tchar_vo_fallendruid_attack_spike\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"This place shall stand!\"\nmsgstr \"\"\n\n#. Key:\tchar_vo_fallendruid_attack_tendril\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Nature will survive!\"\nmsgstr \"\"\n\n#. Key:\tchar_vo_fallendruid_attack_thorn_sphere\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Out with you, Ruin!\"\nmsgstr \"\"\n\n#. Key:\tchar_vo_fallendruid_die\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I have... failed\"\nmsgstr \"\"\n\n#. Key:\tchar_vo_final_boss_p1_blue\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#. Key:\tchar_vo_final_boss_p2_blue\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I'm the daughter of the Wizard!\"\nmsgstr \"\"\n\n#. Key:\tchar_vo_final_boss_p1_green\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#. Key:\tchar_vo_final_boss_p2_red_up\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I can create!\"\nmsgstr \"\"\n\n#. Key:\tchar_vo_final_boss_p1_red\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I'm human!\"\nmsgstr \"\"\n\n#. Key:\tchar_vo_final_boss_p2_green\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#. Key:\tchar_vo_final_boss_p3_green\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"That sounds funny!\"\nmsgstr \"\"\n\n#. Key:\tchar_vo_final_boss_p2_red_down\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I can destroy!\"\nmsgstr \"\"\n\n#. Key:\tchar_vo_final_boss_p3_blue\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I'm free!\"\nmsgstr \"\"\n\n#. Key:\tchar_vo_final_boss_p3_red\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"What makes you say that?\"\nmsgstr \"\"\n\n#. Key:\tchar_vo_fishy_idle_hiss\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Hissing\"\nmsgstr \"\"\n\n#. Key:\tchar_vo_flybug_attack_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Huh! Surprised?\"\nmsgstr \"\"\n\n#. Key:\tchar_vo_flybug_attack_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Take this!\"\nmsgstr \"\"\n\n#. Key:\tchar_vo_flybug_damaged_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Careful!\"\nmsgstr \"\"\n\n#. Key:\tchar_vo_flybug_damaged_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"It's not funny!\"\nmsgstr \"\"\n\n#. Key:\tchar_vo_flybug_die_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"All right, gg!\"\nmsgstr \"\"\n\n#. Key:\tchar_vo_flybug_idle_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"What is it like down there? Heh?\"\nmsgstr \"\"\n\n#. Key:\tchar_vo_flybug_idle_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Easy man, easy!\"\nmsgstr \"\"\n\n#. Key:\tchar_vo_gatekeeper_attack_aimed\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Avoid these!\"\nmsgstr \"\"\n\n#. Key:\tchar_vo_gatekeeper_attack_aimed_phase_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Watch out where you bounce to!\"\nmsgstr \"\"\n\n#. Key:\tchar_vo_gatekeeper_attack_electric_bubbles\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Attention to the heights!\"\nmsgstr \"\"\n\n#. Key:\tchar_vo_gatekeeper_attack_electric_bubbles_phase_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Attention to the heights again!\"\nmsgstr \"\"\n\n#. Key:\tchar_vo_gatekeeper_attack_meteors\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Watch out for your head!\"\nmsgstr \"\"\n\n#. Key:\tchar_vo_gatekeeper_attack_shield\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Do you really think you are worthy?\"\nmsgstr \"\"\n\n#. Key:\tchar_vo_ghostarmor__die\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I... don't...\"\nmsgstr \"\"\n\n#. Key:\tchar_vo_ghostarmor_attack_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"You shall perish!\"\nmsgstr \"\"\n\n#. Key:\tchar_vo_ghostarmor_attack_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"For justice!\"\nmsgstr \"\"\n\n#. Key:\tchar_vo_ghostarmor_attack_fall\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Death to the outlaw!\"\nmsgstr \"\"\n\n#. Key:\tchar_vo_ghostarmor_damaged_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Just a scratch.\"\nmsgstr \"\"\n\n#. Key:\tchar_vo_ghostarmor_damaged_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"You... can't.\"\nmsgstr \"\"\n\n#. Key:\tchar_vo_ghostarmor_idle_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"We keep the Wall.\"\nmsgstr \"\"\n\n#. Key:\tchar_vo_ghostarmor_idle_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Follow the rules!\"\nmsgstr \"\"\n\n#. Key:\tchar_vo_ghosthelmet_attack_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Aaaaaaargh!\"\nmsgstr \"\"\n\n#. Key:\tchar_vo_ghosthelmet_attack_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Chaaaaaarge!\"\nmsgstr \"\"\n\n#. Key:\tchar_vo_ghosthelmet_damaged_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I'll need a blacksmith!\"\nmsgstr \"\"\n\n#. Key:\tchar_vo_ghosthelmet_damaged_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Send someone for a hammer!\"\nmsgstr \"\"\n\n#. Key:\tchar_vo_ghosthelmet_die\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Be right back!\"\nmsgstr \"\"\n\n#. Key:\tchar_vo_ghosthelmet_idle_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Use your head... or mine!\"\nmsgstr \"\"\n\n#. Key:\tchar_vo_ghosthelmet_idle_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Let's head east!\"\nmsgstr \"\"\n\n#. Key:\tchar_vo_gnory_idle_humming\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Humming\"\nmsgstr \"\"\n\n#. Key:\tchar_vo_gnory_idle_whistle\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Whistling\"\nmsgstr \"\"\n\n#. Key:\tchar_vo_golemmaker_idle_explain_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I create essence which resists the ruin.\"\nmsgstr \"\"\n\n#. Key:\tchar_vo_golemmaker_idle_mindlessly_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Knowledge is Lost, All is Lost.\"\nmsgstr \"\"\n\n#. Key:\tchar_vo_golemmaker_idle_mindlessly_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"All is Lost.\"\nmsgstr \"\"\n\n#. Key:\tchar_vo_golemmaker_idle_moan_aaahhh\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Aaahhh\"\nmsgstr \"\"\n\n#. Key:\tchar_vo_golemmaker_idle_moan_ooohhh\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Ooohhh\"\nmsgstr \"\"\n\n#. Key:\tchar_vo_golemmaker_idle_sad_onon\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Onon\"\nmsgstr \"\"\n\n#. Key:\tchar_vo_golemmaker_idle_tries_to_remember\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Your words remind me of something.\"\nmsgstr \"\"\n\n#. Key:\tchar_vo_koboldchef_idle_01\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Too hot!\"\nmsgstr \"\"\n\n#. Key:\tchar_vo_koboldchef_idle_02\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"It needs more salt!\"\nmsgstr \"\"\n\n#. Key:\tchar_vo_koboldchef_idle_03\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"It will be delicious.\"\nmsgstr \"\"\n\n#. Key:\tchar_vo_koboldchef_idle_04\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Hmm...\"\nmsgstr \"\"\n\n#. Key:\tchar_vo_lory_idle_croon\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Croon\"\nmsgstr \"\"\n\n#. Key:\tchar_vo_lory_idle_humming_0\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Ohh\"\nmsgstr \"\"\n\n#. Key:\tchar_vo_lory_idle_humming_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#. Key:\tchar_vo_supperdwarf_idle_2_humming_1\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Hmmm\"\nmsgstr \"\"\n\n#. Key:\tchar_vo_lory_idle_humming_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Ommm\"\nmsgstr \"\"\n\n#. Key:\tchar_vo_lory_idle_humming_3\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Auch\"\nmsgstr \"\"\n\n#. Key:\tchar_vo_maintainer_attack_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Dinner is served!\"\nmsgstr \"\"\n\n#. Key:\tchar_vo_maintainer_attack_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Now it's clean!\"\nmsgstr \"\"\n\n#. Key:\tchar_vo_maintainer_damaged_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I'll need to be repaired.\"\nmsgstr \"\"\n\n#. Key:\tchar_vo_maintainer_damaged_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I still serve.\"\nmsgstr \"\"\n\n#. Key:\tchar_vo_maintainer_die\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I'll need... replacement.\"\nmsgstr \"\"\n\n#. Key:\tchar_vo_maintainer_elite_idle_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Serve...\"\nmsgstr \"\"\n\n#. Key:\tchar_vo_maintainer_elite_idle_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Order...\"\nmsgstr \"\"\n\n#. Key:\tchar_vo_maintainer_idle_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"At your service.\"\nmsgstr \"\"\n\n#. Key:\tchar_vo_maintainer_idle_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Your order?\"\nmsgstr \"\"\n\n#. Key:\tchar_vo_maintainer_miniboss_attack_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"This is my order!\"\nmsgstr \"\"\n\n#. Key:\tchar_vo_maintainer_miniboss_attack_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I'll reorganize!\"\nmsgstr \"\"\n\n#. Key:\tchar_vo_maintainer_miniboss_attack_meteor\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I'm above!\"\nmsgstr \"\"\n\n#. Key:\tchar_vo_maintainer_miniboss_attack_spawn_enemy\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Order, order, order!\"\nmsgstr \"\"\n\n#. Key:\tchar_vo_maintainer_miniboss_damaged_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I can fix this\"\nmsgstr \"\"\n\n#. Key:\tchar_vo_maintainer_miniboss_damaged_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Don't do that again!\"\nmsgstr \"\"\n\n#. Key:\tchar_vo_maintainer_miniboss_die\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I can't... I was... above.\"\nmsgstr \"\"\n\n#. Key:\tchar_vo_primitivefishy_attack_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Srrrr!\"\nmsgstr \"\"\n\n#. Key:\tchar_vo_primitivefishy_attack_long_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Hurray!\"\nmsgstr \"\"\n\n#. Key:\tchar_vo_primitivefishy_attack_long_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Flyyyyyyy!\"\nmsgstr \"\"\n\n#. Key:\tchar_vo_primitivefishy_damaged_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Uuush!\"\nmsgstr \"\"\n\n#. Key:\tchar_vo_primitivefishy_damaged_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Shish!\"\nmsgstr \"\"\n\n#. Key:\tchar_vo_primitivefishy_die\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Fishy leaves.\"\nmsgstr \"\"\n\n#. Key:\tchar_vo_primitivefishy_idle_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I need some fish!\"\nmsgstr \"\"\n\n#. Key:\tchar_vo_primitivefishy_idle_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Did you hear that?\"\nmsgstr \"\"\n\n#. Key:\tchar_vo_shade_attack_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Join me!\"\nmsgstr \"\"\n\n#. Key:\tchar_vo_shade_attack_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"You shall die too!\"\nmsgstr \"\"\n\n#. Key:\tchar_vo_shade_damaged_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Is this the end?\"\nmsgstr \"\"\n\n#. Key:\tchar_vo_shade_damaged_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Pain...\"\nmsgstr \"\"\n\n#. Key:\tchar_vo_shade_die\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Death... again?!\"\nmsgstr \"\"\n\n#. Key:\tchar_vo_shade_idle_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I can't rest.\"\nmsgstr \"\"\n\n#. Key:\tchar_vo_shade_idle_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Death is not peace.\"\nmsgstr \"\"\n\n#. Key:\tchar_vo_shadesphere_attack_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I'll change you!\"\nmsgstr \"\"\n\n#. Key:\tchar_vo_shadesphere_attack_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Do not resist me!\"\nmsgstr \"\"\n\n#. Key:\tchar_vo_shadesphere_damaged_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"It's still... me...\"\nmsgstr \"\"\n\n#. Key:\tchar_vo_shadesphere_damaged_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Why did you...?\"\nmsgstr \"\"\n\n#. Key:\tchar_vo_shadesphere_die\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"You changed... me?\"\nmsgstr \"\"\n\n#. Key:\tchar_vo_shadesphere_idle_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"What do you wish to be?\"\nmsgstr \"\"\n\n#. Key:\tchar_vo_shadesphere_idle_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Come to me!\"\nmsgstr \"\"\n\n#. Key:\tchar_vo_supperdwarf_idle_1_eating_food_0\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Yum-yum hmmmm... delicious\"\nmsgstr \"\"\n\n#. Key:\tchar_vo_supperdwarf_idle_1_eating_food_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Hmmm... tasty\"\nmsgstr \"\"\n\n#. Key:\tchar_vo_supperdwarf_idle_1_eating_food_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Ehmmm... where is my spoon?\"\nmsgstr \"\"\n\n#. Key:\tchar_vo_supperdwarf_idle_2_humming_0\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Ehemm, ehemm\"\nmsgstr \"\"\n\n#. Key:\tchar_vo_supperdwarf_idle_2_humming_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Ohm\"\nmsgstr \"\"\n\n#. Key:\tchar_vo_teachy_idle_book_down_0\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Walking ball?\"\nmsgstr \"\"\n\n#. Key:\tchar_vo_teachy_idle_book_down_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"You?\"\nmsgstr \"\"\n\n#. Key:\tchar_vo_teachy_idle_book_down_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Do you exist outside of my mind?\"\nmsgstr \"\"\n\n#. Key:\tchar_vo_teachy_idle_book_down_3\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Ehm, what?\"\nmsgstr \"\"\n\n#. Key:\tchar_vo_teachy_idle_book_up_0\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Ehmm\"\nmsgstr \"\"\n\n#. Key:\tchar_vo_teachy_idle_book_up_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Humm\"\nmsgstr \"\"\n\n#. Key:\tchar_vo_teachy_idle_book_up_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Hemm\"\nmsgstr \"\"\n\n#. Key:\tchar_vo_teachy_idle_book_up_3\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Ahm\"\nmsgstr \"\"\n\n#. Key:\tchar_vo_teachy_idle_humming_0\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Hmmm-hmmm-hmm\"\nmsgstr \"\"\n\n#. Key:\tchar_vo_teachy_idle_humming_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Ehmm-hmmm-uhmm\"\nmsgstr \"\"\n\n#. Key:\tchar_vo_teachy_idle_humming_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Umm-huhummm\"\nmsgstr \"\"\n\n#. Key:\tchar_vo_teachy_idle_humming_speaking_long_0\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I am, therefore I think!\"\nmsgstr \"\"\n\n#. Key:\tchar_vo_teachy_idle_humming_speaking_long_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I think... I am...\"\nmsgstr \"\"\n\n#. Key:\tchar_vo_teachy_idle_humming_speaking_long_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"The unexamined life is not worth living!\"\nmsgstr \"\"\n\n#. Key:\tchar_vo_teachy_idle_humming_speaking_long_3\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"The mind is furnished with ideas by a drunk upholsterer...\"\nmsgstr \"\"\n\n#. Key:\tchar_vo_teachy_idle_humming_speaking_short_0\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Tic-tac\"\nmsgstr \"\"\n\n#. Key:\tchar_vo_teachy_idle_humming_speaking_short_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"To be...\"\nmsgstr \"\"\n\n#. Key:\tchar_vo_teachy_idle_humming_speaking_short_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Weird\"\nmsgstr \"\"\n\n#. Key:\tAnyKey\n#. SourceLocation:\tSource/SOrb/Settings/Input/SoInputNames.cpp:347\n#: Source/SOrb/Settings/Input/SoInputNames.cpp:347\nmsgctxt \"InputKeys\"\nmsgid \"Any Key\"\nmsgstr \"\"\n\n#. Key:\tDown\n#. SourceLocation:\tSource/SOrb/Settings/Input/SoInputNames.cpp:376\n#: Source/SOrb/Settings/Input/SoInputNames.cpp:376\nmsgctxt \"InputKeys\"\nmsgid \"Down\"\nmsgstr \"\"\n\n#. Key:\tLeft\n#. SourceLocation:\tSource/SOrb/Settings/Input/SoInputNames.cpp:373\n#: Source/SOrb/Settings/Input/SoInputNames.cpp:373\nmsgctxt \"InputKeys\"\nmsgid \"Left\"\nmsgstr \"\"\n\n#. Key:\tRight\n#. SourceLocation:\tSource/SOrb/Settings/Input/SoInputNames.cpp:375\n#: Source/SOrb/Settings/Input/SoInputNames.cpp:375\nmsgctxt \"InputKeys\"\nmsgid \"Right\"\nmsgstr \"\"\n\n#. Key:\tUp\n#. SourceLocation:\tSource/SOrb/Settings/Input/SoInputNames.cpp:374\n#: Source/SOrb/Settings/Input/SoInputNames.cpp:374\nmsgctxt \"InputKeys\"\nmsgid \"Up\"\nmsgstr \"\"\n\n#. Key:\tabsorb_energy\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Absorb Energy\"\nmsgstr \"\"\n\n#. Key:\tacquired_few_item\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"message when more than one item is received at once\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"A few items acquired\"\nmsgstr \"\"\n\n#. Key:\tacquired_item\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"{0} is replaced with an item name\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"{0} acquired\"\nmsgstr \"\"\n\n#. Key:\tactivate\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Activate\"\nmsgstr \"\"\n\n#. Key:\tactivate_elevator\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Activate Elevator\"\nmsgstr \"\"\n\n#. Key:\taquired_silver_key\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"optional bonus message\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Silver Key Acquired\"\nmsgstr \"\"\n\n#. Key:\tascend\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"climb up a ladder or rope or go up with an elevator\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Ascend\"\nmsgstr \"\"\n\n#. Key:\tbed\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"examine Bed\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Bed\"\nmsgstr \"\"\n\n#. Key:\tboat_to_kitchen\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"use a boat to get to the kitchen\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Boat to the Kitchen\"\nmsgstr \"\"\n\n#. Key:\tboat_to_ruins\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"use a boat to get to a place where there are some ancient ruins\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Boat to the Ruins\"\nmsgstr \"\"\n\n#. Key:\tboat_to_station\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"use a boat to get to the Station\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Boat to the Station\"\nmsgstr \"\"\n\n#. Key:\tcall_elevator\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Call Elevator\"\nmsgstr \"\"\n\n#. Key:\tcandles\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"examine Candles\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Candles\"\nmsgstr \"\"\n\n#. Key:\tcat_bed\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"examine Tabbys (cat name) bed\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Tabby's Bed\"\nmsgstr \"\"\n\n#. Key:\tchair\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"examine Chair\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Chair\"\nmsgstr \"\"\n\n#. Key:\tchange_spells\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Change Spells\"\nmsgstr \"\"\n\n#. Key:\tcharge\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"charge gem in Act I\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Charge\"\nmsgstr \"\"\n\n#. Key:\tcheck_door\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"check door \"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Check Door\"\nmsgstr \"\"\n\n#. Key:\tchest\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"examine Chest\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Chest\"\nmsgstr \"\"\n\n#. Key:\tchest_check\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Check Chest\"\nmsgstr \"\"\n\n#. Key:\tchest_check_small\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Check Small Chest\"\nmsgstr \"\"\n\n#. Key:\tchest_close\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Close Chest\"\nmsgstr \"\"\n\n#. Key:\tchest_close_small\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Close Small Chest\"\nmsgstr \"\"\n\n#. Key:\tchest_open\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Open Chest\"\nmsgstr \"\"\n\n#. Key:\tchest_open_small\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Open Small Chest\"\nmsgstr \"\"\n\n#. Key:\tclose_door\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Close Door\"\nmsgstr \"\"\n\n#. Key:\tcross_planks\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Cross Planks\"\nmsgstr \"\"\n\n#. Key:\tdads_room\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"examine Dad's Room\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Daddy's Room\"\nmsgstr \"\"\n\n#. Key:\tdescend\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"climb down a ladder or rope or go down with an elevator\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Descend\"\nmsgstr \"\"\n\n#. Key:\tdestroy\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"destroy device in EndFinal level\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Destroy\"\nmsgstr \"\"\n\n#. Key:\tdevice\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"use Device\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Device\"\nmsgstr \"\"\n\n#. Key:\tdoor\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"examine Door\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Door\"\nmsgstr \"\"\n\n#. Key:\tdoor_does_not_open_from_this_side\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"message when character tries to open a door but it can only be openned from the other side\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Door does not open from this side!\"\nmsgstr \"\"\n\n#. Key:\tdoor_opened\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"door openned\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Door opened\"\nmsgstr \"\"\n\n#. Key:\tdrop\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"drop box or carryable\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Drop\"\nmsgstr \"\"\n\n#. Key:\televator_activated\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Elevator Activated\"\nmsgstr \"\"\n\n#. Key:\televator_inactive\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"player tries to use the elevator but it is inactive\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"The elevator seems to be inactive\"\nmsgstr \"\"\n\n#. Key:\televator_not_move_to_dir\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"player tries to use an elevator but the direction is not activated yet\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"The elevator does not move to the selected direction\"\nmsgstr \"\"\n\n#. Key:\tenter\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"teleport - enter a room or a portal\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Enter\"\nmsgstr \"\"\n\n#. Key:\tenter_bridge\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Enter Bridge\"\nmsgstr \"\"\n\n#. Key:\tenter_cave\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Enter Cave\"\nmsgstr \"\"\n\n#. Key:\tenter_flames\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Enter Flames\"\nmsgstr \"\"\n\n#. Key:\tenter_gate\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Enter Gate\"\nmsgstr \"\"\n\n#. Key:\tenter_hut\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Enter Hut\"\nmsgstr \"\"\n\n#. Key:\tenter_kitchen\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Enter Kitchen\"\nmsgstr \"\"\n\n#. Key:\tenter_pipe\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Enter Pipe\"\nmsgstr \"\"\n\n#. Key:\tenter_portal\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Enter Portal\"\nmsgstr \"\"\n\n#. Key:\tenter_stairs_left\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Enter Stairs on the Left\"\nmsgstr \"\"\n\n#. Key:\tenter_stairs_right\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Enter Stairs on the Right\"\nmsgstr \"\"\n\n#. Key:\tenter_tower\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Enter Tower\"\nmsgstr \"\"\n\n#. Key:\tentrace_locked\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Entrance locked from the other side\"\nmsgstr \"\"\n\n#. Key:\texamine\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"examine a statue or some other interactable object which triggers dialogue or hint message\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Examine\"\nmsgstr \"\"\n\n#. Key:\texamine_device\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Examine Device\"\nmsgstr \"\"\n\n#. Key:\texamine_elevator\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Examine Elevator\"\nmsgstr \"\"\n\n#. Key:\texamine_switch\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"it is a lightswitch\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Examine Switch\"\nmsgstr \"\"\n\n#. Key:\texit\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"exit room\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Exit\"\nmsgstr \"\"\n\n#. Key:\texplore_stations\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Explore more stations before using the railway system.\"\nmsgstr \"\"\n\n#. Key:\tfinish_demo\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"teleport at the end of demo\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Finish Demo\"\nmsgstr \"\"\n\n#. Key:\tfire\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"fires a cannon\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Fire\"\nmsgstr \"\"\n\n#. Key:\tgo_down\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"go down the stairs\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Go down\"\nmsgstr \"\"\n\n#. Key:\tgo_up\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"go up the stairs\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Go up\"\nmsgstr \"\"\n\n#. Key:\tinspect_fountain\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Inspect Fountain\"\nmsgstr \"\"\n\n#. Key:\tinventory\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"hint for hotkey to open the inventory\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Inventory\"\nmsgstr \"\"\n\n#. Key:\tkey_missing\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"{0} is the key name\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Key Missing: {0}\"\nmsgstr \"\"\n\n#. Key:\tkick_rope\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"a pile of rope can be kicked to be able to climb up/down on it\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Kick Rope\"\nmsgstr \"\"\n\n#. Key:\tlaboratory\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"examine/enter Laboratory\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Laboratory\"\nmsgstr \"\"\n\n#. Key:\tlamps\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"examine Lamps\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Lamps\"\nmsgstr \"\"\n\n#. Key:\tleave\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"teleport - leave a room, chest, level\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Leave\"\nmsgstr \"\"\n\n#. Key:\tleave_bridge\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Leave Bridge\"\nmsgstr \"\"\n\n#. Key:\tleave_cave\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Leave Cave\"\nmsgstr \"\"\n\n#. Key:\tleave_circle\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Leave Circle\"\nmsgstr \"\"\n\n#. Key:\tleave_hut\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Leave Hut\"\nmsgstr \"\"\n\n#. Key:\tleft_lever\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"use Left Lever\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Left Lever\"\nmsgstr \"\"\n\n#. Key:\tlever_is_active\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Lever activated. The crystal broke.\"\nmsgstr \"\"\n\n#. Key:\tlever_is_inactive\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"a lever\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Seems to be inactive\"\nmsgstr \"\"\n\n#. Key:\tmemory_stone_aquire\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Acquire Memory Stone\"\nmsgstr \"\"\n\n#. Key:\tmemory_stone_gained\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Memory Stone Gained\"\nmsgstr \"\"\n\n#. Key:\tmiddle_lever\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"use Middle Lever \"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Middle Lever\"\nmsgstr \"\"\n\n#. Key:\tmoms_room\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"examine Mom's Room\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Mom's Room\"\nmsgstr \"\"\n\n#. Key:\tnotebook\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"examine Notebook\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Notebook\"\nmsgstr \"\"\n\n#. Key:\topen\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"door can be openned\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Open\"\nmsgstr \"\"\n\n#. Key:\topen_door\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Open Door\"\nmsgstr \"\"\n\n#. Key:\tpainting\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"examine Painting\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Painting\"\nmsgstr \"\"\n\n#. Key:\tpaintings\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"examine Paintings\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Paintings\"\nmsgstr \"\"\n\n#. Key:\tpass_bridge\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Pass Bridge\"\nmsgstr \"\"\n\n#. Key:\tpick_up\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"pick up box or carryable\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Pick Up\"\nmsgstr \"\"\n\n#. Key:\tplace_rope\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Place Rope\"\nmsgstr \"\"\n\n#. Key:\tprimary_strike\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"hint with control key for strike 1 of the character\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Primary Strike\"\nmsgstr \"\"\n\n#. Key:\tpull\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"pull a lever\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Pull\"\nmsgstr \"\"\n\n#. Key:\tpull_lever\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Pull Lever\"\nmsgstr \"\"\n\n#. Key:\tpush\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"push a sphere shaped rock from the edge to break some stuff\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Push\"\nmsgstr \"\"\n\n#. Key:\tput_weapon_away\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"hint with control key to show how to put the weapon away\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Put Weapon Away\"\nmsgstr \"\"\n\n#. Key:\tread\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"interaction hint if the character can read a scroll or book\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Read\"\nmsgstr \"\"\n\n#. Key:\tread_dictionary\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Read Dictionary\"\nmsgstr \"\"\n\n#. Key:\tread_symbols\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Read Symbols\"\nmsgstr \"\"\n\n#. Key:\trelease_keeper\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Release Keeper\"\nmsgstr \"\"\n\n#. Key:\treplay_boss_fight\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"interaction hint to play a boss fight which was already won\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Replay Boss Fight\"\nmsgstr \"\"\n\n#. Key:\treset_portals\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"lever\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Reset Portals\"\nmsgstr \"\"\n\n#. Key:\trest\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"rest near a checkpoint statue where character can sleep and change spells and listen to music\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Rest\"\nmsgstr \"\"\n\n#. Key:\trestore\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"restore the HP\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Restore\"\nmsgstr \"\"\n\n#. Key:\tright_lever\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"use Right Lever\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Right Lever\"\nmsgstr \"\"\n\n#. Key:\tring_bell\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"there is a bell the character has to use to start the conversation with a merchant\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Ring the bell\"\nmsgstr \"\"\n\n#. Key:\trope_can_be_placed\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"A rope could be placed here\"\nmsgstr \"\"\n\n#. Key:\trope_kicked\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"feedback on the kick rope action\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Rope kicked\"\nmsgstr \"\"\n\n#. Key:\trope_placed\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Rope placed\"\nmsgstr \"\"\n\n#. Key:\tsail\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"use ship for travel\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Sail\"\nmsgstr \"\"\n\n#. Key:\tsoulkeeper_released\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Soulkeeper released\"\nmsgstr \"\"\n\n#. Key:\tspecial_strike\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"hint with control key for strike 2 of the character\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Special Strike\"\nmsgstr \"\"\n\n#. Key:\tstairs\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"enter stairs\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Stairs\"\nmsgstr \"\"\n\n#. Key:\tstone_added\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"{0} is the stone amount, {1} is the stone name\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"{0} {1} added to your bag!\"\nmsgstr \"\"\n\n#. Key:\tstone_cant_carry\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"{0} is the stone name\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"You can't carry more {0}\"\nmsgstr \"\"\n\n#. Key:\tstone_cant_store\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"{0} is the stone name\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"You don't have anything you could use to store {0}\"\nmsgstr \"\"\n\n#. Key:\tswing\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"Swings on the pole with the arms\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Swing\"\nmsgstr \"\"\n\n#. Key:\tswitch_interact\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"Switch interact alternative,  between the two modes\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Switch\"\nmsgstr \"\"\n\n#. Key:\ttake\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"character can take an item\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Take\"\nmsgstr \"\"\n\n#. Key:\ttake_a_seat\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Take a seat\"\nmsgstr \"\"\n\n#. Key:\ttake_abacus\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Take Abacus\"\nmsgstr \"\"\n\n#. Key:\ttake_all\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Take All\"\nmsgstr \"\"\n\n#. Key:\ttake_axe\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"character can take a weapon\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Take Axe\"\nmsgstr \"\"\n\n#. Key:\ttake_blades\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"character can take two swords to go dual wield\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Take Blades\"\nmsgstr \"\"\n\n#. Key:\ttake_books\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"character can take (two) books\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Take Books\"\nmsgstr \"\"\n\n#. Key:\ttake_mace\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"character can take a weapon\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Take Mace\"\nmsgstr \"\"\n\n#. Key:\ttake_mushrooms\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Take Mushrooms\"\nmsgstr \"\"\n\n#. Key:\ttake_rope\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Take Rope\"\nmsgstr \"\"\n\n#. Key:\ttake_sabre\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"character can take a weapon\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Take Sabre\"\nmsgstr \"\"\n\n#. Key:\ttake_spellcaster\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"the Spellcaster is an amulet the character can use to cast spells\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Take Spellcaster\"\nmsgstr \"\"\n\n#. Key:\ttake_stones\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Take Stones\"\nmsgstr \"\"\n\n#. Key:\ttake_sword\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"character can take a weapon\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Take Sword\"\nmsgstr \"\"\n\n#. Key:\ttake_wheel\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Take Wheel\"\nmsgstr \"\"\n\n#. Key:\ttalk\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Talk\"\nmsgstr \"\"\n\n#. Key:\ttoggle_switch\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"it is a lightswitch\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Toggle Switch\"\nmsgstr \"\"\n\n#. Key:\ttouch_statue\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Touch Statue\"\nmsgstr \"\"\n\n#. Key:\ttravel\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"travel on the train station path\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Travel\"\nmsgstr \"\"\n\n#. Key:\tunlocked_with\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"{0} is the key name\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Unlocked with {0}\"\nmsgstr \"\"\n\n#. Key:\tuse\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"use device in EndFinal level\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Use\"\nmsgstr \"\"\n\n#. Key:\tuse_active_item\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"uses the active item\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Use Active Item\"\nmsgstr \"\"\n\n#. Key:\tuse_crystal\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Use Crystal\"\nmsgstr \"\"\n\n#. Key:\tuse_destroy_explained\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Destroy the device to save the creatures of Ruined Realm\"\nmsgstr \"\"\n\n#. Key:\tuse_device\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Use Device\"\nmsgstr \"\"\n\n#. Key:\tuse_elevator\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Use Elevator\"\nmsgstr \"\"\n\n#. Key:\tuse_elevator_gem\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Use Elevator Gem\"\nmsgstr \"\"\n\n#. Key:\tuse_magic_mirror\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Use Magic Mirror\"\nmsgstr \"\"\n\n#. Key:\tuse_separate_explained\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Use the device to separate the Realms\"\nmsgstr \"\"\n\n#. Key:\tuse_switch\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"for the moria gate\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Use switch\"\nmsgstr \"\"\n\n#. Key:\tuse_workshop\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Use Workshop\"\nmsgstr \"\"\n\n#. Key:\twheel_release\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"release lever wheel\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Release\"\nmsgstr \"\"\n\n#. Key:\twheel_turn\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"turn lever wheel\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Turn\"\nmsgstr \"\"\n\n#. Key:\twindow\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"examine Window\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Window\"\nmsgstr \"\"\n\n#. Key:\tworkroom\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"examine/enter Workroom\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Workroom\"\nmsgstr \"\"\n\n#. Key:\tyou_are_worthy\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"gate golem tutorial level message interaction\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"You are not worthy!\"\nmsgstr \"\"\n\n#. Key:\tice_stone_Name\n#. SourceLocation:\tLocalization/StringTables/Items.csv\n#: Localization/StringTables/Items.csv\nmsgctxt \"Items\"\nmsgid \"Ice Stone\"\nmsgstr \"\"\n\n#. Key:\ttest_stone_name\n#. SourceLocation:\tLocalization/StringTables/Items.csv\n#: Localization/StringTables/Items.csv\nmsgctxt \"Items\"\nmsgid \"Test Stone\"\nmsgstr \"\"\n\n#. Key:\tbook\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:494\n#: Source/SOrb/Basic/SoGameSingleton.cpp:494\nmsgctxt \"ItemsCommon\"\nmsgid \"Something to read\"\nmsgstr \"\"\n\n#. Key:\tcooldown\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:501\n#: Source/SOrb/Basic/SoGameSingleton.cpp:501\nmsgctxt \"ItemsCommon\"\nmsgid \"Cooldown\"\nmsgstr \"\"\n\n#. Key:\tcrossbow\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:487\n#: Source/SOrb/Basic/SoGameSingleton.cpp:487\nmsgctxt \"ItemsCommon\"\nmsgid \"Something to shoot with\"\nmsgstr \"\"\n\n#. Key:\tdefensive\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:472\n#: Source/SOrb/Basic/SoGameSingleton.cpp:472\nmsgctxt \"ItemsCommon\"\nmsgid \"Shard of Protection\"\nmsgstr \"\"\n\n#. Key:\tdualwield\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:480\n#: Source/SOrb/Basic/SoGameSingleton.cpp:480\nmsgctxt \"ItemsCommon\"\nmsgid \"Dual Wield Weapon\"\nmsgstr \"\"\n\n#. Key:\thealth\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:498\n#: Source/SOrb/Basic/SoGameSingleton.cpp:498\nmsgctxt \"ItemsCommon\"\nmsgid \"Health\"\nmsgstr \"\"\n\n#. Key:\tinvalid_shard_max\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:475\n#: Source/SOrb/Basic/SoGameSingleton.cpp:475\nmsgctxt \"ItemsCommon\"\nmsgid \"Invalid\"\nmsgstr \"\"\n\n#. Key:\tinvalid_weapon_max\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:481\n#: Source/SOrb/Basic/SoGameSingleton.cpp:481\nmsgctxt \"ItemsCommon\"\nmsgid \"Invalid Weapon\"\nmsgstr \"\"\n\n#. Key:\titem\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:492\n#. Key:\tkeylikeitem\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:491\n#: Source/SOrb/Basic/SoGameSingleton.cpp:491\n#: Source/SOrb/Basic/SoGameSingleton.cpp:492\nmsgctxt \"ItemsCommon\"\nmsgid \"Something interesting\"\nmsgstr \"\"\n\n#. Key:\tjewelry\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:469\n#: Source/SOrb/Basic/SoGameSingleton.cpp:469\nmsgctxt \"ItemsCommon\"\nmsgid \"Valuable\"\nmsgstr \"\"\n\n#. Key:\tkey\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:466\n#: Source/SOrb/Basic/SoGameSingleton.cpp:466\nmsgctxt \"ItemsCommon\"\nmsgid \"Key\"\nmsgstr \"\"\n\n#. Key:\tMemoryStone\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:465\n#: Source/SOrb/Basic/SoGameSingleton.cpp:465\nmsgctxt \"ItemsCommon\"\nmsgid \"Memory Stone\"\nmsgstr \"\"\n\n#. Key:\toffensive\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:473\n#: Source/SOrb/Basic/SoGameSingleton.cpp:473\nmsgctxt \"ItemsCommon\"\nmsgid \"Shard of Justice\"\nmsgstr \"\"\n\n#. Key:\tonehanded\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:478\n#: Source/SOrb/Basic/SoGameSingleton.cpp:478\nmsgctxt \"ItemsCommon\"\nmsgid \"One-Handed Weapon\"\nmsgstr \"\"\n\n#. Key:\tpotion\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:484\n#: Source/SOrb/Basic/SoGameSingleton.cpp:484\nmsgctxt \"ItemsCommon\"\nmsgid \"Something to drink\"\nmsgstr \"\"\n\n#. Key:\tQuestItem\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:464\n#: Source/SOrb/Basic/SoGameSingleton.cpp:464\nmsgctxt \"ItemsCommon\"\nmsgid \"Quest Item\"\nmsgstr \"\"\n\n#. Key:\tRuneStone\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:467\n#: Source/SOrb/Basic/SoGameSingleton.cpp:467\nmsgctxt \"ItemsCommon\"\nmsgid \"Runestone\"\nmsgstr \"\"\n\n#. Key:\tshard\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:462\n#: Source/SOrb/Basic/SoGameSingleton.cpp:462\nmsgctxt \"ItemsCommon\"\nmsgid \"Shard\"\nmsgstr \"\"\n\n#. Key:\tsomething_unlock\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:490\n#: Source/SOrb/Basic/SoGameSingleton.cpp:490\nmsgctxt \"ItemsCommon\"\nmsgid \"Something to unlock with\"\nmsgstr \"\"\n\n#. Key:\tspecial\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:474\n#: Source/SOrb/Basic/SoGameSingleton.cpp:474\nmsgctxt \"ItemsCommon\"\nmsgid \"Shard of Wonder\"\nmsgstr \"\"\n\n#. Key:\tspeed\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:497\n#: Source/SOrb/Basic/SoGameSingleton.cpp:497\nmsgctxt \"ItemsCommon\"\nmsgid \"Attack Speed\"\nmsgstr \"\"\n\n#. Key:\tspell\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:486\n#: Source/SOrb/Basic/SoGameSingleton.cpp:486\nmsgctxt \"ItemsCommon\"\nmsgid \"Something to cast with\"\nmsgstr \"\"\n\n#. Key:\tspellcapacitycost\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:499\n#: Source/SOrb/Basic/SoGameSingleton.cpp:499\nmsgctxt \"ItemsCommon\"\nmsgid \"Capacity Cost\"\nmsgstr \"\"\n\n#. Key:\tspellusagecount\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:500\n#: Source/SOrb/Basic/SoGameSingleton.cpp:500\nmsgctxt \"ItemsCommon\"\nmsgid \"Charge\"\nmsgstr \"\"\n\n#. Key:\tthrowable\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:485\n#: Source/SOrb/Basic/SoGameSingleton.cpp:485\nmsgctxt \"ItemsCommon\"\nmsgid \"Something to throw\"\nmsgstr \"\"\n\n#. Key:\ttwohanded\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:479\n#: Source/SOrb/Basic/SoGameSingleton.cpp:479\nmsgctxt \"ItemsCommon\"\nmsgid \"Two-Handed Weapon\"\nmsgstr \"\"\n\n#. Key:\tusable\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:463\n#: Source/SOrb/Basic/SoGameSingleton.cpp:463\nmsgctxt \"ItemsCommon\"\nmsgid \"Usable\"\nmsgstr \"\"\n\n#. Key:\tweapon\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:468\n#: Source/SOrb/Basic/SoGameSingleton.cpp:468\nmsgctxt \"ItemsCommon\"\nmsgid \"Weapon\"\nmsgstr \"\"\n\n#. Key:\tmus1_combat_1_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(6).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(6).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Disfunctional Golems\"\nmsgstr \"\"\n\n#. Key:\tmus1_combat_2_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(16).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(16).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Machine Rage\"\nmsgstr \"\"\n\n#. Key:\tmus1_combat_GateKeeper_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(2).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(2).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Worthy\"\nmsgstr \"\"\n\n#. Key:\tmus1_dlg_Generic_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(7).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(7).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Unexpected Friend\"\nmsgstr \"\"\n\n#. Key:\tmus1_dlg_Golem_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(9).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(9).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Duty\"\nmsgstr \"\"\n\n#. Key:\tmus1_dlg_Lory_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(8).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(8).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"The other Bell\"\nmsgstr \"\"\n\n#. Key:\tmus1_dlg_Monk_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(10).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(10).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Enlightened Mind\"\nmsgstr \"\"\n\n#. Key:\tmus1_dlg_Raven_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(11).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(11).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Winged Wisdom\"\nmsgstr \"\"\n\n#. Key:\tmus1_dlg_SewerCreature_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(32).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(32).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Pipe Walkers\"\nmsgstr \"\"\n\n#. Key:\tmus1_dlg_Teachy_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(12).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(12).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Just a bit crazy\"\nmsgstr \"\"\n\n#. Key:\tmus1_env_AncientArcade_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(1).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(1).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Remnant Colors\"\nmsgstr \"\"\n\n#. Key:\tmus1_env_GreyGate_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(5).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(5).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Touch of Ruin\"\nmsgstr \"\"\n\n#. Key:\tmus1_env_SecondArcade_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(17).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(17).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"In Memoriam\"\nmsgstr \"\"\n\n#. Key:\tmus1_env_TutorialLevel_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(3).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(3).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Sunken Sewer\"\nmsgstr \"\"\n\n#. Key:\tmus2_combat_catacombs_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(18).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(18).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Armours of the Deep\"\nmsgstr \"\"\n\n#. Key:\tmus2_combat_DwarvenBoss_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(19).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(19).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"I hold it back\"\nmsgstr \"\"\n\n#. Key:\tmus2_combat_LavaBoss_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(20).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(20).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Meant to be Perfect\"\nmsgstr \"\"\n\n#. Key:\tmus2_combat_WrackedWaterpath_2_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(22).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(22).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Wracked Warriors\"\nmsgstr \"\"\n\n#. Key:\tmus2_combat_WrackedWaterpath_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(21).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(21).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Those who survived\"\nmsgstr \"\"\n\n#. Key:\tmus2_combat_WWBoss_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(23).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(23).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"No price too high\"\nmsgstr \"\"\n\n#. Key:\tmus2_dlg_Gnory_Fishy_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(33).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(33).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Intelligence and Wisdom\"\nmsgstr \"\"\n\n#. Key:\tmus2_dlg_GolemMaker_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(34).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(34).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Lost Memories\"\nmsgstr \"\"\n\n#. Key:\tmus2_dlg_MerchAnt_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(35).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(35).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Small but Tiny\"\nmsgstr \"\"\n\n#. Key:\tmus2_dlg_SupperDwarf_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(36).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(36).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Supper time\"\nmsgstr \"\"\n\n#. Key:\tmus2_env_Catacombs_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(24).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(24).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Dwarven Catacombs\"\nmsgstr \"\"\n\n#. Key:\tmus2_env_CrossroadCave_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(25).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(25).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Railway Station\"\nmsgstr \"\"\n\n#. Key:\tmus2_env_DwarvenGate_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(26).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(26).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Sanctuary of Law\"\nmsgstr \"\"\n\n#. Key:\tmus2_env_DwarvenOutpost_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(27).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(27).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Where the rail leads\"\nmsgstr \"\"\n\n#. Key:\tmus2_env_Kobold_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(15).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(15).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Last of his Tribe\"\nmsgstr \"\"\n\n#. Key:\tmus2_env_LavaDeep_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(28).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(28).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Temple for the Ancestors\"\nmsgstr \"\"\n\n#. Key:\tmus2_env_LavaEntrance_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(29).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(29).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Pilgrim Road\"\nmsgstr \"\"\n\n#. Key:\tmus2_env_WrackedWaterpath_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(30).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(30).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Quick and Clever\"\nmsgstr \"\"\n\n#. Key:\tmus3_combat_Bubble_Ground_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(14).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(14).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Infected Golems\"\nmsgstr \"\"\n\n#. Key:\tmus3_env_BubbleGround_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(38).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(38).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"So close yet so far\"\nmsgstr \"\"\n\n#. Key:\tmus3_env_CaveHouse_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(39).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(39).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Last Shalter\"\nmsgstr \"\"\n\n#. Key:\tmus3_env_PipePuzzle_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(40).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(40).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Moving Pipes\"\nmsgstr \"\"\n\n#. Key:\tmus3_env_Raven_Puzzle_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(41).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(41).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"One would fail\"\nmsgstr \"\"\n\n#. Key:\tmus3_env_RuinedRealm_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(42).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(42).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"The end, really\"\nmsgstr \"\"\n\n#. Key:\tmus_chase_theme_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(4).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(4).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Jump for your life!\"\nmsgstr \"\"\n\n#. Key:\tmus_cm_WhiteWall_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(13).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(13).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Decaying City\"\nmsgstr \"\"\n\n#. Key:\tmus_ending_dlg_UnknownWizard_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(37).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(37).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"All is lost\"\nmsgstr \"\"\n\n#. Key:\tmus_main_theme_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(0).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(0).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Spirit of the Unknown\"\nmsgstr \"\"\n\n#. Key:\tmus_waterpath_alter_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(43).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(43).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Stories never end\"\nmsgstr \"\"\n\n#. Key:\tblocked\n#. SourceLocation:\tLocalization/StringTables/Spells.csv\n#. InfoMetaData:\t\"Comment\" : \" displayed as floating test ingame when a certain enemy blocks certain attacks\"\n#: Localization/StringTables/Spells.csv\nmsgctxt \"Spells\"\nmsgid \"Blocked\"\nmsgstr \"\"\n\n#. Key:\tcant_use_in_air\n#. SourceLocation:\tLocalization/StringTables/Spells.csv\n#. InfoMetaData:\t\"Comment\" : \" displayed as floating test ingame when the character tries to use a spell in air which can not be used there\"\n#: Localization/StringTables/Spells.csv\nmsgctxt \"Spells\"\nmsgid \"Can't in air\"\nmsgstr \"\"\n\n#. Key:\tcant_use_sk_free_zone\n#. SourceLocation:\tLocalization/StringTables/Spells.csv\n#. InfoMetaData:\t\"Comment\" : \" displayed as floating test ingame when character tries to use the respawn point spell on a location when it is not allowed\"\n#: Localization/StringTables/Spells.csv\nmsgctxt \"Spells\"\nmsgid \"Dangerous Location\"\nmsgstr \"\"\n\n#. Key:\thp_gained\n#. SourceLocation:\tLocalization/StringTables/Spells.csv\n#. InfoMetaData:\t\"Comment\" : \" displayed as floating test ingame when the character increases his max health\"\n#: Localization/StringTables/Spells.csv\nmsgctxt \"Spells\"\nmsgid \"Health Increased!\"\nmsgstr \"\"\n\n#. Key:\timmune\n#. SourceLocation:\tLocalization/StringTables/Spells.csv\n#. InfoMetaData:\t\"Comment\" : \"displayed as floating text ingame if enemy is immune to a spell or damage type\"\n#: Localization/StringTables/Spells.csv\nmsgctxt \"Spells\"\nmsgid \"Immune\"\nmsgstr \"\"\n\n#. Key:\tinfected\n#. SourceLocation:\tLocalization/StringTables/Spells.csv\n#. InfoMetaData:\t\"Comment\" : \" displayed as floating test ingame when dmg over time effect is applied on enemy\"\n#: Localization/StringTables/Spells.csv\nmsgctxt \"Spells\"\nmsgid \"Infected\"\nmsgstr \"\"\n\n#. Key:\tinstant_recharge\n#. SourceLocation:\tLocalization/StringTables/Spells.csv\n#. InfoMetaData:\t\"Comment\" : \" displayed as floating test ingame when a spell can be used again without waiting for the cooldown time\"\n#: Localization/StringTables/Spells.csv\nmsgctxt \"Spells\"\nmsgid \"Instant Recharge\"\nmsgstr \"\"\n\n#. Key:\tmissing_target\n#. SourceLocation:\tLocalization/StringTables/Spells.csv\n#. InfoMetaData:\t\"Comment\" : \" displayed as floating test ingame when the character tries to use a spell which requires a target but there is none in range\"\n#: Localization/StringTables/Spells.csv\nmsgctxt \"Spells\"\nmsgid \"Who? Where? What?!\"\nmsgstr \"\"\n\n#. Key:\tno_need_for_heal\n#. SourceLocation:\tLocalization/StringTables/Spells.csv\n#. InfoMetaData:\t\"Comment\" : \" displayed as floating test ingame when the character tries to use heal spell but has max health already\"\n#: Localization/StringTables/Spells.csv\nmsgctxt \"Spells\"\nmsgid \"No need\"\nmsgstr \"\"\n\n#. Key:\tresisted\n#. SourceLocation:\tLocalization/StringTables/Spells.csv\n#. InfoMetaData:\t\"Comment\" : \"displayed as floating text ingame if enemy has a chance to avoid an effect and he is lucky\"\n#: Localization/StringTables/Spells.csv\nmsgctxt \"Spells\"\nmsgid \"Resisted\"\nmsgstr \"\"\n\n#. Key:\tsecond_chance\n#. SourceLocation:\tLocalization/StringTables/Spells.csv\n#. InfoMetaData:\t\"Comment\" : \" displayed as floating test ingame if char has the effect on and dies and respawns because the effect saves him\"\n#: Localization/StringTables/Spells.csv\nmsgctxt \"Spells\"\nmsgid \"Second Chance\"\nmsgstr \"\"\n\n#. Key:\tspell_capacity_gained\n#. SourceLocation:\tLocalization/StringTables/Spells.csv\n#. InfoMetaData:\t\"Comment\" : \" displayed as floating test ingame when the character increases his spellpower\"\n#: Localization/StringTables/Spells.csv\nmsgctxt \"Spells\"\nmsgid \"Spellpower Increased!\"\nmsgstr \"\"\n\n#. Key:\tspell_regained\n#. SourceLocation:\tLocalization/StringTables/Spells.csv\n#. InfoMetaData:\t\"Comment\" : \" displayed as floating test ingame when the character regains a spell (can cast again)\"\n#: Localization/StringTables/Spells.csv\nmsgctxt \"Spells\"\nmsgid \"Spell Charge Regained!\"\nmsgstr \"\"\n\n#. Key:\tacknowledge\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Button\"\n#. Key:\tgroup_defeated_ack\n#. InfoMetaData:\t\"Comment\" : \"the hotkey to close the group defeated panel\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Acknowledge\"\nmsgstr \"\"\n\n#. Key:\tback\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Button\"\n#. Key:\tpanel_command_inv_back\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Back\"\nmsgstr \"\"\n\n#. Key:\tblack_fade_teleport_text_1\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Now I remember the night when it started...\"\nmsgstr \"\"\n\n#. Key:\tbubble_float\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"bubble tip for the char to float\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Float\"\nmsgstr \"\"\n\n#. Key:\tbubble_jump\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"bubble tip for the char to jump\"\n#. Key:\tinput_jump\n#. InfoMetaData:\t\"Comment\" : \"Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Jump\"\nmsgstr \"\"\n\n#. Key:\tbuy\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"buy item\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Buy\"\nmsgstr \"\"\n\n#. Key:\tbuy_back\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"buy back item\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Buy Back\"\nmsgstr \"\"\n\n#. Key:\tbuy_on_steam_and_follow\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Buy WarriOrb in Steam and follow us on social media:\"\nmsgstr \"\"\n\n#. Key:\tcancel\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Confirm popup\"\n#. Key:\tsettings_cancel\n#. InfoMetaData:\t\"Comment\" : \"Settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Cancel\"\nmsgstr \"\"\n\n#. Key:\tchange_user\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Change User\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Change User\"\nmsgstr \"\"\n\n#. Key:\tchapter\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Stats for saves\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Chapter\"\nmsgstr \"\"\n\n#. Key:\tchapter1_completed\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Temporary for chapter 1\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Chapter 1 completed. Save is Locked.\"\nmsgstr \"\"\n\n#. Key:\tcharacter_skin_classic\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"name of the original character skin\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Classic\"\nmsgstr \"\"\n\n#. Key:\tcharacter_skin_desc\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"description for the character skin option\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Changes the visuals of the player character\"\nmsgstr \"\"\n\n#. Key:\tcharacter_skin_mummy\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"name of the alternative character skin\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Mummy\"\nmsgstr \"\"\n\n#. Key:\tcharacter_skin_pumpkin\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"name of the alternative character skin\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Pumpkin\"\nmsgstr \"\"\n\n#. Key:\tcharacter_skin_title\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"option to change character skin\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Character Skin\"\nmsgstr \"\"\n\n#. Key:\tcheckpoint\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Stats for saves\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Checkpoint\"\nmsgstr \"\"\n\n#. Key:\tchest_examine\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Examine\"\nmsgstr \"\"\n\n#. Key:\tchest_leave\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Leave\"\nmsgstr \"\"\n\n#. Key:\tchest_loot\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"hotkey tip on chest\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Loot\"\nmsgstr \"\"\n\n#. Key:\tclose\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"close book\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Close\"\nmsgstr \"\"\n\n#. Key:\tcompleted_in_time\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Custom Map\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Completed in {time}\"\nmsgstr \"\"\n\n#. Key:\tconfirm\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Confirm popup\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Confirm\"\nmsgstr \"\"\n\n#. Key:\tconfirm_keyboard_settings_reset\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Confirm keyboard settings\"\n#. Key:\tdifficulty_confirm_question\n#. InfoMetaData:\t\"Comment\" : \"Confirm difficulty selected popup\"\n#. Key:\tsave_slots_remove_confirm\n#. InfoMetaData:\t\"Comment\" : \"remove save slot confirm dialogue\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Are you sure?\"\nmsgstr \"\"\n\n#. Key:\tconsole_ps4\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"PlayStation 4\"\nmsgstr \"\"\n\n#. Key:\tconsole_switch\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Switch\"\nmsgstr \"\"\n\n#. Key:\tconsole_xbox_one\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"XBox One\"\nmsgstr \"\"\n\n#. Key:\tcontinue\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Menu Continue\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Continue\"\nmsgstr \"\"\n\n#. Key:\tcontroller_recommended\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Main Menu\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Note: Playing with a controller is recommended\"\nmsgstr \"\"\n\n#. Key:\tcredits\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Menu credits\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Credits\"\nmsgstr \"\"\n\n#. Key:\tcustom_map_x\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Custom Map\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Custom Map {0}\"\nmsgstr \"\"\n\n#. Key:\tcustom_maps\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Menu custom Maps\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Custom Maps\"\nmsgstr \"\"\n\n#. Key:\tdescription\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Of something\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Description\"\nmsgstr \"\"\n\n#. Key:\tdifficulty\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Stats for saves\"\n#. Key:\tdifficulty_title\n#. InfoMetaData:\t\"Comment\" : \"title of difficulty selection\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Difficulty\"\nmsgstr \"\"\n\n#. Key:\tdifficulty_confirm_subtext\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Confirm difficulty selected popup subtext\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"This choice is permanent\"\nmsgstr \"\"\n\n#. Key:\tdifficulty_desc_insane\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"description of hard difficulty\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"- The <Blue>SoulKeeper</> (Portable Checkpoint) spell is removed from the game\\n- Increased incoming damage\\n- Increased Enemy Health\"\nmsgstr \"\"\n\n#. Key:\tdifficulty_desc_intended\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"description of normal difficulty\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"The way the game is meant to be played\"\nmsgstr \"\"\n\n#. Key:\tdifficulty_desc_sane\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"description of easy difficulty\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"- Infinite <Blue>SoulKeeper</> (Checkpoint) spell charges\\n- No health penalty when respawning near the <Blue>SoulKeeper</>\\n- Decreased incoming damage\\n- Decreased Enemy Health\"\nmsgstr \"\"\n\n#. Key:\tdifficulty_insane\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"name of hard difficulty\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"As hard as it can get\"\nmsgstr \"\"\n\n#. Key:\tdifficulty_intended\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"name of normal difficulty\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"A true challenge\"\nmsgstr \"\"\n\n#. Key:\tdifficulty_normal\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Normal\"\nmsgstr \"\"\n\n#. Key:\tdifficulty_sane\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"name of easy difficulty\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Just an adventure\"\nmsgstr \"\"\n\n#. Key:\tdisabled\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Widget is disabled\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Disabled\"\nmsgstr \"\"\n\n#. Key:\tdiscord\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Discord\"\nmsgstr \"\"\n\n#. Key:\tdrm_defeatead_description\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"check only in pirated copies \"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"We suspect that you play a pirated copy of the game.\\nIt's fine. We hope you will enjoy it!\\n\\nIf you like the game, please tell your friends about it, and maybe even consider buying it.\\n\\nWe would love to keep making games!\"\nmsgstr \"\"\n\n#. Key:\tdrm_defeatead_title\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"check only in pirated copies \"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"WarriOrb DRM\"\nmsgstr \"\"\n\n#. Key:\tdwarf_language\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Dwarf language\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Dwarf\"\nmsgstr \"\"\n\n#. Key:\tempty\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Empty\"\nmsgstr \"\"\n\n#. Key:\tempty_line\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"-\"\nmsgstr \"\"\n\n#. Key:\tencourage_line1\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Before Main Menu\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"The path ahead is challenging. Do not despise failure. Every wrong attempt discarded is another step forward.\"\nmsgstr \"\"\n\n#. Key:\tessence\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"essence represents the Health of the character\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Essence\"\nmsgstr \"\"\n\n#. Key:\tfeedback\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Discord external button\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Feedback\"\nmsgstr \"\"\n\n#. Key:\tgame_defeated\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"end screen\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Game Defeated!\"\nmsgstr \"\"\n\n#. Key:\tgame_is_wip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Main Menu\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Game currently under development\"\nmsgstr \"\"\n\n#. Key:\tgame_over_retreat\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"control tip which is only visible in boss areas where the player can either restart the fight or retreat from the place\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Retreat\"\nmsgstr \"\"\n\n#. Key:\tgame_over_retry\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"control tip which is always visible on game over\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Retry\"\nmsgstr \"\"\n\n#. Key:\tgamepad_special_left_xbox\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"xbox view button\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"View button\"\nmsgstr \"\"\n\n#. Key:\tgamepad_special_right_xbox\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"xbox Menu button\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Menu button\"\nmsgstr \"\"\n\n#. Key:\tgo_back_to_menu\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Go back to main menu\"\nmsgstr \"\"\n\n#. Key:\tgold_x\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"{x} is the gold amount\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"+{x} GOLD\"\nmsgstr \"\"\n\n#. Key:\tgroup_defeated_title\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"title of the group defeated panel\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Group Defeated\"\nmsgstr \"\"\n\n#. Key:\tinput_action_back\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"UI Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"UI Action Back\"\nmsgstr \"\"\n\n#. Key:\tinput_action_first\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"UI Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"UI Action First\"\nmsgstr \"\"\n\n#. Key:\tinput_action_second\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"UI Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"UI Action Second\"\nmsgstr \"\"\n\n#. Key:\tinput_action_third\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"UI Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"UI Action Third\"\nmsgstr \"\"\n\n#. Key:\tinput_actions_conflicts\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input remap.  {Key} = key display name. {NumAction} the number of actions, this will determine what to choose between one and other.\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Selected button = {Key}, will get unbound from the {NumActions}|plural(one=Action,other=Actions) = {ActionNames}\"\nmsgstr \"\"\n\n#. Key:\tinput_alt_interact\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Interact Alternative\"\nmsgstr \"\"\n\n#. Key:\tinput_change_item\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input Action Name\"\n#. Key:\tpanel_command_inv_change_item\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Change Item\"\nmsgstr \"\"\n\n#. Key:\tinput_change_spell\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Change Spell\"\nmsgstr \"\"\n\n#. Key:\tinput_change_weapon\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Change Weapon\"\nmsgstr \"\"\n\n#. Key:\tinput_down\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"UI Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"UI Move Down\"\nmsgstr \"\"\n\n#. Key:\tinput_float\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Floating\"\nmsgstr \"\"\n\n#. Key:\tinput_interact\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Interact\"\nmsgstr \"\"\n\n#. Key:\tinput_left\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Move Left\"\nmsgstr \"\"\n\n#. Key:\tinput_menu_back\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"UI Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Open Menu/Escape/Back\"\nmsgstr \"\"\n\n#. Key:\tinput_not_allowed_options_menu_button\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input remap gamepad\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Not allowed to remap to the Menu button\"\nmsgstr \"\"\n\n#. Key:\tinput_not_allowed_options_menu_button_switch\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input remap gamepad\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Not allowed to remap to the + Button\"\nmsgstr \"\"\n\n#. Key:\tinput_not_allowed_thumbsticks\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input remap gamepad\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Not allowed to remap to thumbsticks\"\nmsgstr \"\"\n\n#. Key:\tinput_not_allowed_thumbsticks_switch\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input remap gamepad switch\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Not allowed to remap to Left Stick or Right Stick\"\nmsgstr \"\"\n\n#. Key:\tinput_open_inventory\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Open Inventory\"\nmsgstr \"\"\n\n#. Key:\tinput_right\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Move Right\"\nmsgstr \"\"\n\n#. Key:\tinput_roll\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Roll\"\nmsgstr \"\"\n\n#. Key:\tinput_selected_key_not_allowed\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input remap. {Key} = key display name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Selected button = {Key}, is not allowed as an input option\"\nmsgstr \"\"\n\n#. Key:\tinput_spell_down\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"UI Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"UI Spell Down\"\nmsgstr \"\"\n\n#. Key:\tinput_spell_left\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"UI Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"UI Spell Left\"\nmsgstr \"\"\n\n#. Key:\tinput_spell_right\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"UI Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"UI Spell Right\"\nmsgstr \"\"\n\n#. Key:\tinput_spell_select\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"UI Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"UI Spell Select\"\nmsgstr \"\"\n\n#. Key:\tinput_spell_select_and_cast\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"UI Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"UI Spell Select & Cast\"\nmsgstr \"\"\n\n#. Key:\tinput_spell_up\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"UI Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"UI Spell Up\"\nmsgstr \"\"\n\n#. Key:\tinput_strike_primary\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Primary Strike\"\nmsgstr \"\"\n\n#. Key:\tinput_strike_special\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Special Strike\"\nmsgstr \"\"\n\n#. Key:\tinput_take_weapon\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Take Weapon Away\"\nmsgstr \"\"\n\n#. Key:\tinput_top_left\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"UI Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"UI Top Left\"\nmsgstr \"\"\n\n#. Key:\tinput_top_right\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"UI Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"UI Top Right\"\nmsgstr \"\"\n\n#. Key:\tinput_unbound\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Unbound input\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Unbound\"\nmsgstr \"\"\n\n#. Key:\tinput_up\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"UI Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"UI Move Up\"\nmsgstr \"\"\n\n#. Key:\tinput_use_item\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Use Item\"\nmsgstr \"\"\n\n#. Key:\tinventory_item_amount\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"the item amount displayed in inventory/trade panel/etc.\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Amount: {0}\"\nmsgstr \"\"\n\n#. Key:\tinventory_item_tooltip_cooldown\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Cooldown\"\nmsgstr \"\"\n\n#. Key:\tinventory_item_tooltip_damage\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"damage text on item descriptions\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Damage\"\nmsgstr \"\"\n\n#. Key:\tinventory_item_tooltip_sec\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"duration of something (e.g. cooldown)\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"{0} sec\"\nmsgstr \"\"\n\n#. Key:\titem_equipped\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Item Tooltip\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"---Equipped---\"\nmsgstr \"\"\n\n#. Key:\titem_not_For_sale\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Item Tooltip\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Not for sale\"\nmsgstr \"\"\n\n#. Key:\titem_rarity_0\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"item rarity text on the bottom of tooltips\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Better than nothing, right?\"\nmsgstr \"\"\n\n#. Key:\titem_rarity_1\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"item rarity text on the bottom of tooltips\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Better than nothing\"\nmsgstr \"\"\n\n#. Key:\titem_rarity_2\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"item rarity text on the bottom of tooltips\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Good stuff\"\nmsgstr \"\"\n\n#. Key:\titem_rarity_3\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"item rarity text on the bottom of tooltips\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Pretty good stuff\"\nmsgstr \"\"\n\n#. Key:\titem_rarity_4\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"item rarity text on the bottom of tooltips\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Amazing stuff\"\nmsgstr \"\"\n\n#. Key:\tkey_selection_current\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Select Input key\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Currently selected button:\"\nmsgstr \"\"\n\n#. Key:\tkey_selection_empty\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Select Input key\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"[Empty Button]\"\nmsgstr \"\"\n\n#. Key:\tkey_selection_press\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Select Input key\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"[Press Button]\"\nmsgstr \"\"\n\n#. Key:\tkey_selection_press_button\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Select Input key\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Press the button you want to assign to the action:\"\nmsgstr \"\"\n\n#. Key:\tline_three_dots\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"...\"\nmsgstr \"\"\n\n#. Key:\tloading_screen_press_key\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Press any key to continue...\"\nmsgstr \"\"\n\n#. Key:\tloading_screen_press_key_switch\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Press any button to continue...\"\nmsgstr \"\"\n\n#. Key:\tloading_screen_text_1\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"This is a loading screen. We wait a few seconds here to look more professional.\"\nmsgstr \"\"\n\n#. Key:\tmailing_list\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Mailing List\"\nmsgstr \"\"\n\n#. Key:\tnever_completed\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Custom Map\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Never completed\"\nmsgstr \"\"\n\n#. Key:\tno\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Confirm popup\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"No\"\nmsgstr \"\"\n\n#. Key:\tpanel_character_sheet\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Character Panel\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Character Sheet\"\nmsgstr \"\"\n\n#. Key:\tpanel_command_inv_compare\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Compare\"\nmsgstr \"\"\n\n#. Key:\tpanel_command_inv_drink\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Drink\"\nmsgstr \"\"\n\n#. Key:\tpanel_command_inv_equip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"control key tip in inventory\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Equip\"\nmsgstr \"\"\n\n#. Key:\tpanel_command_inv_equip_item\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Equip Item\"\nmsgstr \"\"\n\n#. Key:\tpanel_command_inv_equip_next\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Equip Next\"\nmsgstr \"\"\n\n#. Key:\tpanel_command_inv_read\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Read\"\nmsgstr \"\"\n\n#. Key:\tpanel_command_inv_unequip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Unequip\"\nmsgstr \"\"\n\n#. Key:\tpanel_command_spell_add\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"add spell to equipped spells\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Add\"\nmsgstr \"\"\n\n#. Key:\tpanel_command_spell_remove\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"remove spell from equipped spells\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Remove\"\nmsgstr \"\"\n\n#. Key:\tpanel_equipped_spells\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Spell Selection panel\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Equipped Spells\"\nmsgstr \"\"\n\n#. Key:\tpanel_inventory\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Character Panel\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Inventory\"\nmsgstr \"\"\n\n#. Key:\tpanel_notes\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Character Panel\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Sidenotes\"\nmsgstr \"\"\n\n#. Key:\tpaneL_resistances\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Character Sheet Panel\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Resistances\"\nmsgstr \"\"\n\n#. Key:\tpanel_rest_no_item\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"You don't have the necessary item to use spells!\"\nmsgstr \"\"\n\n#. Key:\tpanel_rest_option_change_spells\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Change Spells\"\nmsgstr \"\"\n\n#. Key:\tpanel_rest_option_listen_to_music\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Listen to Music\"\nmsgstr \"\"\n\n#. Key:\tpanel_rest_option_sleep\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Sleep\"\nmsgstr \"\"\n\n#. Key:\tpanel_rest_option_wake_up\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Wake Up\"\nmsgstr \"\"\n\n#. Key:\tpanel_spell_capacity\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Spell Selection panel\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Capacity: {0}/{1}\"\nmsgstr \"\"\n\n#. Key:\tpanel_spell_selection_denied\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Spell Selection panel\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"You can only change the equipped spells near ancient statues.\"\nmsgstr \"\"\n\n#. Key:\tpanel_spells\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Character Panel\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Spells\"\nmsgstr \"\"\n\n#. Key:\tpercentage_argument\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Slider\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"{0}%\"\nmsgstr \"\"\n\n#. Key:\tplay_time\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Stats for saves\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Play Time\"\nmsgstr \"\"\n\n#. Key:\tprogress_saved\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Confirm Quit popup\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Progress will be saved\"\nmsgstr \"\"\n\n#. Key:\tprogress_saved_automatically\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Before Main Menu\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Your progress is saved automatically whenever this icon is displayed\"\nmsgstr \"\"\n\n#. Key:\tquit_game\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Menu Quit Game\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Quit Game\"\nmsgstr \"\"\n\n#. Key:\tquit_game_question\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Confirm Quit popup\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Quit Game?\"\nmsgstr \"\"\n\n#. Key:\tquit_to_menu\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Menu Quit To Menu\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Quit to Menu\"\nmsgstr \"\"\n\n#. Key:\tquit_to_menu_question\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Confirm Quit popup\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Quit to Menu?\"\nmsgstr \"\"\n\n#. Key:\treset_keyboard_arrows\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Confirm keyboard settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Reset to Arrow defaults\"\nmsgstr \"\"\n\n#. Key:\treset_keyboard_wasd\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Confirm keyboard settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Reset to WASD defaults\"\nmsgstr \"\"\n\n#. Key:\trestart\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Restart the game\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Restart\"\nmsgstr \"\"\n\n#. Key:\trestart_game_question\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Confirm Restart popup\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Restart Game?\"\nmsgstr \"\"\n\n#. Key:\trestart_game_warning\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Confirm Restart popup\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"All progress will be lost\"\nmsgstr \"\"\n\n#. Key:\tsave_slots_clear\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"clears the save slot\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Clear\"\nmsgstr \"\"\n\n#. Key:\tsave_slots_loaded\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"text on currently loaded save slot if there is any\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"- Loaded -\"\nmsgstr \"\"\n\n#. Key:\tsave_slots_new_game\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"text on empty save slot\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"New Game\"\nmsgstr \"\"\n\n#. Key:\tsave_slots_playtime\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"playtime displayed, {0} is the hours, {1} is the minutes\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"{0} H {1} M\"\nmsgstr \"\"\n\n#. Key:\tsave_slots_playtime_short\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"playtime displayed if it did not reach an hour, {0} is the time in minutes\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"{0} M\"\nmsgstr \"\"\n\n#. Key:\tsave_slots_remove_confirm_subtext\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"remove save slot confirm dialogue\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Progress will be lost\"\nmsgstr \"\"\n\n#. Key:\tsave_slots_select\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"loads the game or creates a new one using the active slot\"\n#. Key:\tselect\n#. InfoMetaData:\t\"Comment\" : \"Button\"\n#. Key:\tspell_cast_switch_select\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Select\"\nmsgstr \"\"\n\n#. Key:\tsaves\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Menu saves\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Save Slots\"\nmsgstr \"\"\n\n#. Key:\tseconds\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"seconds\"\nmsgstr \"\"\n\n#. Key:\tselect_spells\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input right  thumbstick\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Select spells\"\nmsgstr \"\"\n\n#. Key:\tsell\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"sell item\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Sell\"\nmsgstr \"\"\n\n#. Key:\tsend_automatically\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Analytics popup\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Send Automatically\"\nmsgstr \"\"\n\n#. Key:\tsend_no\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Analytics popup\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Do not Send\"\nmsgstr \"\"\n\n#. Key:\tsettings\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Menu settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Settings\"\nmsgstr \"\"\n\n#. Key:\tsettings_antialising\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Anti-Aliasing\"\nmsgstr \"\"\n\n#. Key:\tsettings_antialising_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Smooths out the edges by blending the colors of the pixels around the object to create the illusion of smoothness.\"\nmsgstr \"\"\n\n#. Key:\tsettings_apply\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Apply\"\nmsgstr \"\"\n\n#. Key:\tsettings_aspect_ratio\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Aspect Ratio\"\nmsgstr \"\"\n\n#. Key:\tsettings_aspect_ratio_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Defines what aspect ratios are available for your resolution.\"\nmsgstr \"\"\n\n#. Key:\tsettings_audio\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Settings panels\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Audio\"\nmsgstr \"\"\n\n#. Key:\tsettings_auto_detect_controller\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Gamepad settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Auto detect Gamepad Layout\"\nmsgstr \"\"\n\n#. Key:\tsettings_borderless\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Borderless\"\nmsgstr \"\"\n\n#. Key:\tsettings_brightness\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Settings panels\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Brightness\"\nmsgstr \"\"\n\n#. Key:\tsettings_brightness_default_value\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Brightness settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Default Value is 100%\"\nmsgstr \"\"\n\n#. Key:\tsettings_brightness_description\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Brightness settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Please adjust the brightness of the game to your display\"\nmsgstr \"\"\n\n#. Key:\tsettings_collect_analytics\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Game Settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Collect Usage Statistics\"\nmsgstr \"\"\n\n#. Key:\tsettings_collect_analytics_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Game Settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"These are not used to identify individuals, but help us to understand players needs to improve our game.\"\nmsgstr \"\"\n\n#. Key:\tsettings_confirm_display_title\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings confirm\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Confirm Display Settings in\"\nmsgstr \"\"\n\n#. Key:\tsettings_controller\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Settings panels\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Gamepad\"\nmsgstr \"\"\n\n#. Key:\tsettings_controller_platform\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Gamepad Layout settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Layout\"\nmsgstr \"\"\n\n#. Key:\tsettings_controller_remap\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Gamepad settings\"\n#. Key:\tsettings_controller_remap_single\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Remap Controls\"\nmsgstr \"\"\n\n#. Key:\tsettings_controller_remap_noedit\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Gamepad settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Please use a gamepad in order to remap\"\nmsgstr \"\"\n\n#. Key:\tsettings_controller_switch\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Settings panels\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Controls\"\nmsgstr \"\"\n\n#. Key:\tsettings_display\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Settings panels\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Display\"\nmsgstr \"\"\n\n#. Key:\tsettings_display_damage\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Game settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Display Damage\"\nmsgstr \"\"\n\n#. Key:\tsettings_display_damage_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Game settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Show damage as a floating number on the screen\"\nmsgstr \"\"\n\n#. Key:\tsettings_display_enemy_hp\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Game settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Display Enemy Health\"\nmsgstr \"\"\n\n#. Key:\tsettings_display_enemy_hp_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Game settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Show a small health bar above injured enemies\"\nmsgstr \"\"\n\n#. Key:\tsettings_display_floating_vo\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Game settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Display Floating Voice Lines\"\nmsgstr \"\"\n\n#. Key:\tsettings_display_floating_vo_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Game settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Show voice lines as floating texts\"\nmsgstr \"\"\n\n#. Key:\tsettings_display_fps\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Game settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Display FPS\"\nmsgstr \"\"\n\n#. Key:\tsettings_display_fps_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Game settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Show FPS counter\"\nmsgstr \"\"\n\n#. Key:\tsettings_display_mode\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Display Mode\"\nmsgstr \"\"\n\n#. Key:\tsettings_display_mode_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"In Windowed mode you can interact with other windows easier. In Borderless mode you can quickly switch between applications.\"\nmsgstr \"\"\n\n#. Key:\tsettings_display_play_time\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Game settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Display Play Time\"\nmsgstr \"\"\n\n#. Key:\tsettings_display_play_time_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Game settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Show current play time\"\nmsgstr \"\"\n\n#. Key:\tsettings_effects\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Effect Quality\"\nmsgstr \"\"\n\n#. Key:\tsettings_effects_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Affects the quality of particles in the world, a lower quality might make some projectiles in the world harder to see.\"\nmsgstr \"\"\n\n#. Key:\tsettings_effects_volume\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Audio settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Sound Effects volume\"\nmsgstr \"\"\n\n#. Key:\tsettings_effects_volume_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Audio settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Adjust the sound effects volume\"\nmsgstr \"\"\n\n#. Key:\tsettings_force_weak_hardware_opt\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Additional Optimizations\"\nmsgstr \"\"\n\n#. Key:\tsettings_force_weak_hardware_opt_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"In certain areas background traps are deactivated or background visuals look cheaper to gain more performance.\"\nmsgstr \"\"\n\n#. Key:\tsettings_fps_unlimited\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings frame limit\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Unlimited\"\nmsgstr \"\"\n\n#. Key:\tsettings_frame_limit\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Frame Limit (FPS)\"\nmsgstr \"\"\n\n#. Key:\tsettings_frame_limit_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Limit the maximum frame rate for a consistent experience.\"\nmsgstr \"\"\n\n#. Key:\tsettings_fullscreen\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Fullscreen\"\nmsgstr \"\"\n\n#. Key:\tsettings_game\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Settings panels\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Game\"\nmsgstr \"\"\n\n#. Key:\tsettings_game_speed\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Game settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Game Speed\"\nmsgstr \"\"\n\n#. Key:\tsettings_game_speed_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Game settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Changes the speed of the game.\\nHigher speed might make the game have lower FPS.\"\nmsgstr \"\"\n\n#. Key:\tsettings_gamepad_vibration\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Gamepad Vibration intensity settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Vibration\"\nmsgstr \"\"\n\n#. Key:\tsettings_keyboard\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Settings panels\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Keyboard\"\nmsgstr \"\"\n\n#. Key:\tsettings_keyboard_remap_noedit\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Keyboard Settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Please use a keyboard in order to change the keyboard input\"\nmsgstr \"\"\n\n#. Key:\tsettings_language\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Game settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Language\"\nmsgstr \"\"\n\n#. Key:\tsettings_language_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Game settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Change the display and locale (numbers, dates) language\"\nmsgstr \"\"\n\n#. Key:\tsettings_master_volume\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Audio settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Master volume\"\nmsgstr \"\"\n\n#. Key:\tsettings_master_volume_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Audio settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Adjust the master volume\"\nmsgstr \"\"\n\n#. Key:\tsettings_merciful_bounce\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"game settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Merciful Bounce Mode\"\nmsgstr \"\"\n\n#. Key:\tsettings_merciful_bounce_always\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"defines when (in which difficulty mode) is the easier bounce mode active\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Always\"\nmsgstr \"\"\n\n#. Key:\tsettings_merciful_bounce_never\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"defines when (in which difficulty mode) is the easier bounce mode active\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Never\"\nmsgstr \"\"\n\n#. Key:\tsettings_merciful_bounce_on_easy\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"defines when (in which difficulty mode) is the easier bounce mode active\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"On Easy\"\nmsgstr \"\"\n\n#. Key:\tsettings_merciful_bounce_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"tooltip for Merciful Bounce Mode option\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Allows Higher Bounce even if the Jump button is pressed after the character hits the ground\"\nmsgstr \"\"\n\n#. Key:\tsettings_move_left_right\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Move left/right\"\nmsgstr \"\"\n\n#. Key:\tsettings_music_volume\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Audio settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Music volume\"\nmsgstr \"\"\n\n#. Key:\tsettings_music_volume_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Audio settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Adjust the music volume\"\nmsgstr \"\"\n\n#. Key:\tsettings_mute_audio\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Audio settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Mute audio\"\nmsgstr \"\"\n\n#. Key:\tsettings_mute_audio_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Audio settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Mute all audio\"\nmsgstr \"\"\n\n#. Key:\tsettings_mute_audio_unfocused\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Audio settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Mute audio when in background\"\nmsgstr \"\"\n\n#. Key:\tsettings_mute_audio_unfocused_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Audio settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Mute the audio when the game window is not in focus\"\nmsgstr \"\"\n\n#. Key:\tsettings_mute_dialogue_voice\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Audio settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Mute voices in dialogues\"\nmsgstr \"\"\n\n#. Key:\tsettings_mute_dialogue_voice_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Audio settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Mute the gibberish voices inside the dialogues\"\nmsgstr \"\"\n\n#. Key:\tsettings_mute_voice\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Audio settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Mute voices outside of dialogues\"\nmsgstr \"\"\n\n#. Key:\tsettings_mute_voice_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Audio settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Mute the gibberish voices outside the dialogues\"\nmsgstr \"\"\n\n#. Key:\tsettings_pause_game_idle\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Game settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Pause game when idle\"\nmsgstr \"\"\n\n#. Key:\tsettings_pause_game_idle_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Game settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Pauses the game when the user is idle for a certain amount of minutes\"\nmsgstr \"\"\n\n#. Key:\tsettings_pause_game_unfocused\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Game settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Pause game when unfocused\"\nmsgstr \"\"\n\n#. Key:\tsettings_pause_game_unfocused_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Game settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Pauses the game when the game loses focus\"\nmsgstr \"\"\n\n#. Key:\tsettings_post_effects\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Post-Effects\"\nmsgstr \"\"\n\n#. Key:\tsettings_post_effects_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Affects the quality of the post process effects after the scene is rendered.\"\nmsgstr \"\"\n\n#. Key:\tsettings_quality_epic\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings quality\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Epic\"\nmsgstr \"\"\n\n#. Key:\tsettings_quality_high\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings quality\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"High\"\nmsgstr \"\"\n\n#. Key:\tsettings_quality_low\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings quality\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Low\"\nmsgstr \"\"\n\n#. Key:\tsettings_quality_medium\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings quality\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Medium\"\nmsgstr \"\"\n\n#. Key:\tsettings_ratio_16_10\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings Aspect Ratio\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"16:10\"\nmsgstr \"\"\n\n#. Key:\tsettings_ratio_16_9\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings Aspect Ratio\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"16:9\"\nmsgstr \"\"\n\n#. Key:\tsettings_ratio_4_3\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings Aspect Ratio\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"4:3\"\nmsgstr \"\"\n\n#. Key:\tsettings_reset\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Reset\"\nmsgstr \"\"\n\n#. Key:\tsettings_reset_default\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Settings reset to default\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Reset to Defaults\"\nmsgstr \"\"\n\n#. Key:\tsettings_reset_input_key\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input reset key to default\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Reset button to default\"\nmsgstr \"\"\n\n#. Key:\tsettings_resolution\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Resolution\"\nmsgstr \"\"\n\n#. Key:\tsettings_resolution_entry\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings. {0} - x, {1} - Y\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"{0}x{1}\"\nmsgstr \"\"\n\n#. Key:\tsettings_resolution_scale\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Resolution Scale\"\nmsgstr \"\"\n\n#. Key:\tsettings_resolution_scale_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"The desired resolution to use when rendering the game. It does not affect the UI.\\nLowering it improves performance on lower end machines.\"\nmsgstr \"\"\n\n#. Key:\tsettings_resolution_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Allows changing the Screen Resolution.\"\nmsgstr \"\"\n\n#. Key:\tsettings_select_another\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Settings input\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Select another\"\nmsgstr \"\"\n\n#. Key:\tsettings_shadows\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Shadow Quality\"\nmsgstr \"\"\n\n#. Key:\tsettings_shadows_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"The higher the quality the finer the shadow.\"\nmsgstr \"\"\n\n#. Key:\tsettings_textures\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Texture Quality\"\nmsgstr \"\"\n\n#. Key:\tsettings_textures_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Surfaces of the game world will increase in fidelity if the setting is higher.\"\nmsgstr \"\"\n\n#. Key:\tsettings_unknown\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Unknown\"\nmsgstr \"\"\n\n#. Key:\tsettings_volumetric_fog\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Volumetric Fog\"\nmsgstr \"\"\n\n#. Key:\tsettings_volumetric_fog_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Realistic looking fog. Has a high performance impact, disable it to improve performance.\"\nmsgstr \"\"\n\n#. Key:\tsettings_vsync\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Vertical Sync\"\nmsgstr \"\"\n\n#. Key:\tsettings_vsync_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Synchronize the game refresh rate with the monitor refresh rate. Disable it for higher framerate and better input response.\\nWhen enabled it prevents screen tearing.\"\nmsgstr \"\"\n\n#. Key:\tsettings_windowed\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Windowed\"\nmsgstr \"\"\n\n#. Key:\tskip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"text near the press and hold to skip confirmation button\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Skip\"\nmsgstr \"\"\n\n#. Key:\tspell_cast_switch_controls\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Quick select spells up/down/left/right\"\nmsgstr \"\"\n\n#. Key:\tspell_cast_switch_select_cast\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Select & Cast\"\nmsgstr \"\"\n\n#. Key:\tspell_cooldown_stops_in_air\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Spell\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Cooldown only starts on ground\"\nmsgstr \"\"\n\n#. Key:\tspell_only_in_air\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Spell\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Can not be used in air\"\nmsgstr \"\"\n\n#. Key:\tspell_restricted\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Spell\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Can not be used in restricted areas\"\nmsgstr \"\"\n\n#. Key:\tstart\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"The name of the checkpoint. Custom Map action\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Start\"\nmsgstr \"\"\n\n#. Key:\tstart_game\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Menu Start Game\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Start Game\"\nmsgstr \"\"\n\n#. Key:\tstats_usage_description\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Analytics popup\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Not Yet would like to collect usage statistics from your game automatically.\\nThese are not used to identify individuals, but help us to understand players needs to improve our game.\\n\\nSelect \\\"Send Automatically\\\" to allow collection of usage statistics,\\nor \\\"Do Not Send\\\" to prevent the game from sending information to Not Yet.\\n\\nYou can change this setting at any time via the Settings Game tab.\"\nmsgstr \"\"\n\n#. Key:\tstats_usage_title\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Analytics popup\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Usage Statistics\"\nmsgstr \"\"\n\n#. Key:\tstatus\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Status of a save/custom map\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Status\"\nmsgstr \"\"\n\n#. Key:\tsteam_main_game\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Wishlist\"\nmsgstr \"\"\n\n#. Key:\tsteam_main_game_buy\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Buy Full Game\"\nmsgstr \"\"\n\n#. Key:\tSwitch_FaceButton_Bottom\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"B Button\"\nmsgstr \"\"\n\n#. Key:\tSwitch_FaceButton_Left\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Y Button\"\nmsgstr \"\"\n\n#. Key:\tSwitch_FaceButton_Right\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"A Button\"\nmsgstr \"\"\n\n#. Key:\tSwitch_FaceButton_Top\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"X Button\"\nmsgstr \"\"\n\n#. Key:\tSwitch_Gamepad_LeftStick_Down\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \" Switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Left Stick Down\"\nmsgstr \"\"\n\n#. Key:\tSwitch_Gamepad_LeftStick_Left\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \" Switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Left Stick Left\"\nmsgstr \"\"\n\n#. Key:\tSwitch_Gamepad_LeftStick_Right\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \" Switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Left Stick Right\"\nmsgstr \"\"\n\n#. Key:\tSwitch_Gamepad_LeftStick_Up\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \" Switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Left Stick Up\"\nmsgstr \"\"\n\n#. Key:\tSwitch_Gamepad_RightStick_Down\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \" Switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Right Stick Down\"\nmsgstr \"\"\n\n#. Key:\tSwitch_Gamepad_RightStick_Left\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \" Switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Right Stick Left\"\nmsgstr \"\"\n\n#. Key:\tSwitch_Gamepad_RightStick_Right\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \" Switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Right Stick Right\"\nmsgstr \"\"\n\n#. Key:\tSwitch_Gamepad_RightStick_Up\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \" Switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Right Stick Up\"\nmsgstr \"\"\n\n#. Key:\tSwitch_LeftThumbstick\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \" Switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Left Stick\"\nmsgstr \"\"\n\n#. Key:\tSwitch_RightThumbstick\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \" Switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Right Stick\"\nmsgstr \"\"\n\n#. Key:\tSwitch_Shoulder_Left\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"L Button\"\nmsgstr \"\"\n\n#. Key:\tSwitch_Shoulder_Right\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"R Button\"\nmsgstr \"\"\n\n#. Key:\tSwitch_special_dpad_down\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \" Switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Down Button\"\nmsgstr \"\"\n\n#. Key:\tSwitch_special_dpad_left\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \" Switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Left Button\"\nmsgstr \"\"\n\n#. Key:\tSwitch_special_dpad_right\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \" Switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Right Button\"\nmsgstr \"\"\n\n#. Key:\tSwitch_special_dpad_up\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \" Switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Up Button\"\nmsgstr \"\"\n\n#. Key:\tSwitch_special_left\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"- Button\"\nmsgstr \"\"\n\n#. Key:\tSwitch_special_right\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"+ Button\"\nmsgstr \"\"\n\n#. Key:\tSwitch_Trigger_Left\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"ZL Button\"\nmsgstr \"\"\n\n#. Key:\tSwitch_Trigger_Right\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"ZR Button\"\nmsgstr \"\"\n\n#. Key:\tteleport_to_cp\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Menu Teleport To Checkpoint\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Teleport To Checkpoint\"\nmsgstr \"\"\n\n#. Key:\tteleport_to_sk\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Menu Teleport to Soulkeeper\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Teleport To SoulKeeper\"\nmsgstr \"\"\n\n#. Key:\tthank_you_prologue\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"THANK YOU FOR PLAYING WARRIORB DEMO PROLOGUE, WE HOPE YOU HAD A GREAT TIME!\"\nmsgstr \"\"\n\n#. Key:\ttotal_deaths\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Stats for saves\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Total Deaths\"\nmsgstr \"\"\n\n#. Key:\ttrade_amount_x_x\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"trade confirmation UI. {0} is the current amount and {1} is the current amount times price per item\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"{0} for {1} gold\"\nmsgstr \"\"\n\n#. Key:\ttrade_buy\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"trade confirmation UI\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Are you sure you want to buy {ItemName} for {Gold} gold?\"\nmsgstr \"\"\n\n#. Key:\ttrade_buy_back\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"trade confirmation UI\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Are you sure you want to buy back {ItemName} for {Gold} gold?\"\nmsgstr \"\"\n\n#. Key:\ttrade_no_intrested\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"trade confirmation UI\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"The trader is not interested in buying that item from you!\"\nmsgstr \"\"\n\n#. Key:\ttrade_nope\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"trade confirmation UI\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Nope!\"\nmsgstr \"\"\n\n#. Key:\ttrade_okay\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"trade confirmation UI\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Okay...\"\nmsgstr \"\"\n\n#. Key:\ttrade_sell\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"trade confirmation UI\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Are you sure you want to sell {ItemName} for {Gold} gold?\"\nmsgstr \"\"\n\n#. Key:\ttwitter\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Twitter\"\nmsgstr \"\"\n\n#. Key:\tunknown\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Unknown input binding\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"UNKNOWN\"\nmsgstr \"\"\n\n#. Key:\twarriorb\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"WarriOrb\"\nmsgstr \"\"\n\n#. Key:\txp\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Experience Points\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"XP\"\nmsgstr \"\"\n\n#. Key:\tyes\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Confirm popup\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Yes\"\nmsgstr \"\"\n\n"
  },
  {
    "path": "Content/Localization/WarriorbDemo/zh-Hans/WarriorbDemo.po",
    "content": "﻿# WarriorbDemo Chinese (Simplified) translation.\n# Copyright 1998-2019 Epic Games, Inc. All Rights Reserved.\n# \nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: WarriorbDemo\\n\"\n\"POT-Creation-Date: 2020-10-07 08:08\\n\"\n\"PO-Revision-Date: 2020-10-07 08:08\\n\"\n\"Language-Team: \\n\"\n\"Language: zh-Hans\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Plural-Forms: nplurals=1; plural=0;\\n\"\n\n#. Key:\tact1_loading\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"You are a Mighty Spirit from the Unknown Realm. You were torn away from your home by a pathetic mortal Wizard. After a magical accident your essence is bound to an unlikely body. Find a way out of your ball-body prison!\"\nmsgstr \"你是一个来自未知领域的强大灵魂。被一个卑微的家伙从家里带走。一次神奇的意外将你的灵魂被束缚在一个不可思议的躯体里。快想个办法将自己从这个球状的监狱里解脱出来!\"\n\n#. Key:\tact2_loading\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Reaching Crossroad Cave you are a step closer to the Three Artifacts - and to freedom.\"\nmsgstr \"到达十字路口的洞穴意味着离这三件古物又近了一步——也离自由更近了一步。\"\n\n#. Key:\tact3_loading\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Finding the Three Artifacts required all your skills and strength. You hope that delivering them to the Wizard will be less difficult.\"\nmsgstr \"找到这三件工艺品需要实力和技能。你希望完成这件事不会太困难。\"\n\n#. Key:\tact_1\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"text displayed on black screen the first time a chapter is started\"\n#. a chapter is started\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Act I\"\nmsgstr \"第一章\"\n\n#. Key:\tact_2\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"text displayed on black screen the first time a chapter is started\"\n#. a chapter is started\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Act II\"\nmsgstr \"第二章\"\n\n#. Key:\tact_3\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"text displayed on black screen the first time a chapter is started\"\n#. a chapter is started\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Act III\"\nmsgstr \"第三章\"\n\n#. Key:\tancient_arcade\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an area\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Ancient Arcade\"\nmsgstr \"古代回廊\"\n\n#. Key:\tbubble_border\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an area\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Bubble Border\"\nmsgstr \"泡沫边境\"\n\n#. Key:\tcerulean_city\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an area\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Cerulean City\"\nmsgstr \"蔚蓝之城\"\n\n#. Key:\tchasm_chamber\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an area\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Chasm Chamber\"\nmsgstr \"裂痕之间\"\n\n#. Key:\tcrossroad_cave\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an area\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Crossroad Cave\"\nmsgstr \"十字洞穴\"\n\n#. Key:\tdarkest_dungeon\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an area\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Darkest Dungeon\"\nmsgstr \"黑暗地牢\"\n\n#. Key:\tdwarven_dungeons\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an area\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Dwarven Dungeons\"\nmsgstr \"矮人地城\"\n\n#. Key:\tending_loading\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Finally! You did your part of the deal, now it's the Wizard's turn to get you back home.\"\nmsgstr \"终于!你完成了你的任务，现在轮到巫师带你回家了。\"\n\n#. Key:\tepilogue\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"text displayed on black screen the first time a chapter is started\"\n#. a chapter is started\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Epilogue\"\nmsgstr \"后记\"\n\n#. Key:\tgrey_gate\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an area\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Grey Gate\"\nmsgstr \"灰暗之门\"\n\n#. Key:\thallowed_heart\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an area, Hallowed as in made holy; consecrated.\"\n#. consecrated.\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Hallowed Heart\"\nmsgstr \"神圣之心\"\n\n#. Key:\tintro_subtitle_0\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" intro subtitle line 1\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"I wish I could just... turn back time to undo what I have done.\"\nmsgstr \"我希望我能…让时间倒流，来撤销我所做的一切。\"\n\n#. Key:\tintro_subtitle_1\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" intro subtitle line 01\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"However the past is behind us\"\nmsgstr \"但是过去已经过去了\"\n\n#. Key:\tintro_subtitle_2\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" intro subtitle line 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"and all I can change now\"\nmsgstr \"所有我能改变的\"\n\n#. Key:\tintro_subtitle_3\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" intro subtitle line 3\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"is the future.\"\nmsgstr \"只有未来。\"\n\n#. Key:\tlast_land\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an area\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Last Land\"\nmsgstr \"最后的土地\"\n\n#. Key:\tlava_lair\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an area\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Lava Lair\"\nmsgstr \"熔岩巢穴\"\n\n#. Key:\tloading_tip_act1_0\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 1\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"In Ball form you go faster.\"\nmsgstr \"球形态会使你跑得更快。\"\n\n#. Key:\tloading_tip_act1_1\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 1\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"In Ball form you bounce back when you hit a surface.\"\nmsgstr \"当你以球形态碰撞一个地面或墙面时，会反弹回来。\"\n\n#. Key:\tloading_tip_act1_2\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 1\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Each weapon has its own unique special strike.\"\nmsgstr \"每种武器都有自己独特的打击方式。\"\n\n#. Key:\tloading_tip_act1_3\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 1\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Most of the people died after Ruin happened, but there are still some survivors.\"\nmsgstr \"虽然有些人在废墟中死去，但仍有一些幸存者。\"\n\n#. Key:\tloading_tip_act1_4\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 1\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Some items can’t be used but merchants still like to buy them.\"\nmsgstr \"有些物品虽然不能使用，但商人们喜欢收购它们。\"\n\n#. Key:\tloading_tip_act1_5\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 1\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"There are many keys, and when I say many, I mean it.\"\nmsgstr \"钥匙数量很多，当我说很多的时候，我是认真的。\"\n\n#. Key:\tloading_tip_act1_6\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 1\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"When you find an item it would make sense to check what it is, wouldn’t it?\"\nmsgstr \"每当你找到一样新的物品时，最好先看看是做什么用的!\"\n\n#. Key:\tloading_tip_act1_7\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 1\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Spells can make combat easier.\"\nmsgstr \"法术可以使战斗变得更容易。\"\n\n#. Key:\tloading_tip_act1_8\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 1\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Dying often is absolutely normal. If you don’t die a lot, you are doing something wrong.\"\nmsgstr \"死亡是绝对正常的。如果你死得不多，那你一定是某个地方做错了。\"\n\n#. Key:\tloading_tip_act1_9\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 1\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"You can always check the Sidenotes in your Inventory to see if you have any side quests.\"\nmsgstr \"时不时翻翻你包里的笔记本，看看是否有支线任务要完成。\"\n\n#. Key:\tloading_tip_act2_0\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Using the Railway can shorten your journey.\"\nmsgstr \"坐火车可以缩短你的路程。\"\n\n#. Key:\tloading_tip_act2_1\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"We’ll try to make our next game without any loading screens, we promise...\"\nmsgstr \"我们努力让我们的下一个游戏没有任何加载画面，保证……\"\n\n#. Key:\tloading_tip_act2_2\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Choosing the right weapon against a Boss will make your life easier.\"\nmsgstr \"选择正确的武器对付BOSS会让你的生活变得更容易。\"\n\n#. Key:\tloading_tip_act2_3\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Don’t forget to use the Soulkeeper!\"\nmsgstr \"别忘了使用灵魂守护者!\"\n\n#. Key:\tloading_tip_act2_4\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Finding the Artefacts might be hard, but this is your only chance to get out.\"\nmsgstr \"找到这些工艺品会很艰难，但这是你唯一的机会。\"\n\n#. Key:\tloading_tip_act2_5\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Talk to any Survivor if you can. They might be able to help you.\"\nmsgstr \"多和幸存者谈谈。他们也许能帮助你。\"\n\n#. Key:\tloading_tip_act2_6\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"If you find an area too difficult you can always go to another area first.\"\nmsgstr \"如果你发现一个地方太难，可以先去另一个地方试试。\"\n\n#. Key:\tloading_tip_act2_7\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Don’t forget to spend your gold! (Ad sponsored by Gnory)\"\nmsgstr \"别忘了花光你的金子!(此条由格诺里赞助)\"\n\n#. Key:\tloading_tip_act2_8\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Equipping the right items will make the combat easier.\"\nmsgstr \"装备正确的物品将使战斗更容易。\"\n\n#. Key:\tloading_tip_act2_9\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"If you manage to defeat every member of a group you won’t have to fight them ever again.\"\nmsgstr \"如果你能打败团队中的每一个成员，你就不用再和他们战斗了。\"\n\n#. Key:\tloading_tip_act3_0\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 3\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Using the Railway can also make your Journey longer.\"\nmsgstr \"轨道交通也可能使你的旅程更长。\"\n\n#. Key:\tloading_tip_act3_1\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 3\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"If you got this far, you surely know everything now.\"\nmsgstr \"你走过的路越远，你知道的东西越多。\"\n\n#. Key:\tloading_tip_act3_2\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 3\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Loading screen tips are very useful - except in a few cases.\"\nmsgstr \"游戏加载时候的小贴士都是非常有用的-除了少部分...\"\n\n#. Key:\tloading_tip_act3_3\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 3\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Now is your time to think about the fate of the Ruined Realm.\"\nmsgstr \"现在是你们思考这片废墟命运的时候了。\"\n\n#. Key:\tloading_tip_act3_4\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 3\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"The End is near... I mean no loading screen can take forever, right?\"\nmsgstr \"快结束了……我的意思是加载画面没可能持续那么长时间的，对吧?\"\n\n#. Key:\tloading_tip_act3_5\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 3\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Now your only task is to bring the Artefacts to Wizard.\"\nmsgstr \"现在你唯一的任务就是把这些古代工艺品带给巫师。\"\n\n#. Key:\tloading_tip_act3_6\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 3\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"If you find a combat too hard try to use different shards, spells, and weapons.\"\nmsgstr \"如果你觉得战斗太困难，尝试使用不同的碎片，法术和武器。\"\n\n#. Key:\tloading_tip_act3_7\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 3\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Don’t give up! Victory is close.\"\nmsgstr \"别放弃!胜利近在眼前。\"\n\n#. Key:\tloading_tip_end_0\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for epilogue\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"The Human Realm is a weird place...\"\nmsgstr \"人类王国是个奇怪的地方……\"\n\n#. Key:\tloading_tip_end_1\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for epilogue\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"You really did your part of the deal, now it’s time to go home!\"\nmsgstr \"你确实做了你该做的，现在该回家了!\"\n\n#. Key:\tloading_tip_end_2\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for epilogue\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Should you care about the fate of the Realms?\"\nmsgstr \"你应该关心王国的命运吗?\"\n\n#. Key:\tloading_tip_end_3\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for epilogue\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Looks like it’s always you who has to take care of the mess others left behind.\"\nmsgstr \"看起来总是你来收拾别人留下的烂摊子。\"\n\n#. Key:\tloading_tip_end_4\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for epilogue\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Time to finish what you started. One way or another.\"\nmsgstr \"是时候完成你已经开始的事情了。不管怎样。\"\n\n#. Key:\tlost_land\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an area\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Lost Land\"\nmsgstr \"失落之地\"\n\n#. Key:\tobedient_outpost\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an area\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Obedient Outpost\"\nmsgstr \"前哨\"\n\n#. Key:\tperfect_palace\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an area\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Perfect Palace\"\nmsgstr \"完美宫殿\"\n\n#. Key:\tportal_place\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an area\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Portal Place\"\nmsgstr \"传送门\"\n\n#. Key:\tprogress_act1_arcade1\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Remnants of a Realm\"\nmsgstr \"王国遗迹\"\n\n#. Key:\tprogress_act1_arcade2\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Discovering Ancient Technology\"\nmsgstr \"发现古老科技\"\n\n#. Key:\tprogress_act1_before_raven\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Searching for a way out\"\nmsgstr \"寻找出路\"\n\n#. Key:\tprogress_act1_boss_fight\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Facing the Keeper\"\nmsgstr \"面对守护者\"\n\n#. Key:\tprogress_act1_gem\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Looking for a Gem\"\nmsgstr \"寻找宝石\"\n\n#. Key:\tprogress_act1_infuse\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Infusing the Gem\"\nmsgstr \"充能宝石\"\n\n#. Key:\tprogress_act1_portals\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Looking for a Portal\"\nmsgstr \"寻找传送门\"\n\n#. Key:\tprogress_act1_start\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Lost in Ruin\"\nmsgstr \"迷失之墟\"\n\n#. Key:\tprogress_act1_test_stone\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Bouncing Stones\"\nmsgstr \"跳石\"\n\n#. Key:\tprogress_act1_tut1\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Am I Worthy?\"\nmsgstr \"值得吗?\"\n\n#. Key:\tprogress_act1_tut2\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Sewer again\"\nmsgstr \"又见下水道\"\n\n#. Key:\tprogress_act1_tut3\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Third time Worthy\"\nmsgstr \"第三次\"\n\n#. Key:\tprogress_act2_crossroad\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"At a crossroad\"\nmsgstr \"在十字路口\"\n\n#. Key:\tprogress_act2_dwarf_0\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Into the Blue\"\nmsgstr \"深入蔚蓝\"\n\n#. Key:\tprogress_act2_dwarf_1\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Elevator Gem and Key\"\nmsgstr \"宝石与钥匙\"\n\n#. Key:\tprogress_act2_dwarf_2\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Opening the Gate\"\nmsgstr \"开门\"\n\n#. Key:\tprogress_act2_dwarf_boss\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Dwarven Statue\"\nmsgstr \"矮人雕像\"\n\n#. Key:\tprogress_act2_end\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"To the Fourth Station\"\nmsgstr \"第四站\"\n\n#. Key:\tprogress_act2_lava_0\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Into the Red\"\nmsgstr \"深入猩红\"\n\n#. Key:\tprogress_act2_lava_1\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Uniting Key Pieces\"\nmsgstr \"关键部分\"\n\n#. Key:\tprogress_act2_lava_2\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Climbing the Tower\"\nmsgstr \"爬塔\"\n\n#. Key:\tprogress_act2_lava_boss\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Armour Wrath\"\nmsgstr \"铠甲之怒\"\n\n#. Key:\tprogress_act2_ww_0\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Into the Green\"\nmsgstr \"深入翠绿\"\n\n#. Key:\tprogress_act2_ww_1\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Through the Lake\"\nmsgstr \"穿过湖泊\"\n\n#. Key:\tprogress_act2_ww_2\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Being Followed\"\nmsgstr \"被跟踪了\"\n\n#. Key:\tprogress_act2_ww_boss\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Fallen Druid\"\nmsgstr \"堕落的德鲁伊\"\n\n#. Key:\tprogress_act3_floating\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in act 3\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Floating\"\nmsgstr \"漂浮\"\n\n#. Key:\tprogress_act3_monk\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in act 3\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Monk's Home\"\nmsgstr \"修道士之家\"\n\n#. Key:\tprogress_act3_pipes\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in act 3\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Moving Pipes\"\nmsgstr \"移动管道\"\n\n#. Key:\tprogress_act3_start\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in act 3\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Lost in the Caves\"\nmsgstr \"迷失在洞穴\"\n\n#. Key:\tprogress_act3_way_out\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in act 3\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Way out of the Realm\"\nmsgstr \"离开废墟的方式\"\n\n#. Key:\tprogress_epilogue_boss\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in epilogue\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"The Real Demon\"\nmsgstr \"真正的恶魔\"\n\n#. Key:\tprogress_epilogue_castle\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in epilogue\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Wizard's Castle\"\nmsgstr \"巫师的城堡\"\n\n#. Key:\tprogress_epilogue_past_and_future\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in epilogue\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Past and Future\"\nmsgstr \"过去和未来\"\n\n#. Key:\tprogress_epilogue_save_creatures\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in epilogue\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Chance for everyone\"\nmsgstr \"人人都有机会\"\n\n#. Key:\tprogress_epilogue_separate_worlds\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in epilogue\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Separated Worlds\"\nmsgstr \"分离的世界\"\n\n#. Key:\tprologue\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"text displayed on black screen the first time a chapter is started\"\n#. a chapter is started\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Prologue\"\nmsgstr \"序章\"\n\n#. Key:\tremnant_road\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an area\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Remnant Road\"\nmsgstr \"残路\"\n\n#. Key:\truined_realm\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Ruined Realm\"\nmsgstr \"荒废领域\"\n\n#. Key:\tsnake_slide\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an area\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Snake Slide\"\nmsgstr \"蛇形滑梯\"\n\n#. Key:\tsunken_sewer\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an area\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Sunken Sewer\"\nmsgstr \"沉没的下水道\"\n\n#. Key:\twhite_wall\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"White Wall\"\nmsgstr \"白色巨墙\"\n\n#. Key:\twracked_waters\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an area\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Wracked Waters\"\nmsgstr \"废水\"\n\n#. Key:\tcredits_fmod\n#. SourceLocation:\tLocalization/StringTables/Credits.csv\n#: Localization/StringTables/Credits.csv\nmsgctxt \"Credits\"\nmsgid \"Made with FMOD Studio by Firelight Technologies Pty Ltd.\"\nmsgstr \"由Firelight Technologies Pty Ltd与FMOD Studio合作制作。\"\n\n#. Key:\tMonthApril\n#. SourceLocation:\tSource/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:17\n#: Source/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:17\nmsgctxt \"DateTimeHelper\"\nmsgid \"April\"\nmsgstr \"四月\"\n\n#. Key:\tMonthAugust\n#. SourceLocation:\tSource/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:21\n#: Source/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:21\nmsgctxt \"DateTimeHelper\"\nmsgid \"August\"\nmsgstr \"八月\"\n\n#. Key:\tMonthDecember\n#. SourceLocation:\tSource/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:26\n#: Source/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:26\nmsgctxt \"DateTimeHelper\"\nmsgid \"December\"\nmsgstr \"十二月\"\n\n#. Key:\tMonthFebruary\n#. SourceLocation:\tSource/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:15\n#: Source/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:15\nmsgctxt \"DateTimeHelper\"\nmsgid \"February\"\nmsgstr \"二月\"\n\n#. Key:\tMonthJanuary\n#. SourceLocation:\tSource/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:14\n#: Source/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:14\nmsgctxt \"DateTimeHelper\"\nmsgid \"January\"\nmsgstr \"一月\"\n\n#. Key:\tMonthJuly\n#. SourceLocation:\tSource/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:20\n#: Source/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:20\nmsgctxt \"DateTimeHelper\"\nmsgid \"July\"\nmsgstr \"七月\"\n\n#. Key:\tMonthJune\n#. SourceLocation:\tSource/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:19\n#: Source/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:19\nmsgctxt \"DateTimeHelper\"\nmsgid \"June\"\nmsgstr \"六月\"\n\n#. Key:\tMonthMarch\n#. SourceLocation:\tSource/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:16\n#: Source/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:16\nmsgctxt \"DateTimeHelper\"\nmsgid \"March\"\nmsgstr \"三月\"\n\n#. Key:\tMonthMay\n#. SourceLocation:\tSource/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:18\n#: Source/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:18\nmsgctxt \"DateTimeHelper\"\nmsgid \"May\"\nmsgstr \"五月\"\n\n#. Key:\tMonthNovember\n#. SourceLocation:\tSource/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:24\n#: Source/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:24\nmsgctxt \"DateTimeHelper\"\nmsgid \"November\"\nmsgstr \"十一月\"\n\n#. Key:\tMonthOctober\n#. SourceLocation:\tSource/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:23\n#: Source/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:23\nmsgctxt \"DateTimeHelper\"\nmsgid \"October\"\nmsgstr \"十月\"\n\n#. Key:\tMonthSeptember\n#. SourceLocation:\tSource/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:22\n#: Source/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:22\nmsgctxt \"DateTimeHelper\"\nmsgid \"September\"\nmsgstr \"九月\"\n\n#. Key:\tSecondsToTime\n#. SourceLocation:\tSource/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:48\n#: Source/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:48\nmsgctxt \"DateTimeHelper\"\nmsgid \"{Minutes}:{Seconds}\"\nmsgstr \"{Minutes}:{Seconds}\"\n\n#. Key:\tSecondsToTimeMinusSeconds\n#. SourceLocation:\tSource/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:51\n#: Source/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:51\nmsgctxt \"DateTimeHelper\"\nmsgid \"{Hours}:{Minutes}:{Seconds}\"\nmsgstr \"{Hours}:{Minutes}:{Seconds}\"\n\n#. Key:\tchar_name_ball_e\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"possible display name for character\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"BALL-E\"\nmsgstr \"E球\"\n\n#. Key:\tchar_name_destroyer\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"possible display name for character\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Destroyer\"\nmsgstr \"毁灭者\"\n\n#. Key:\tchar_name_dont_buy\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"possible display name for character\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Don't buy\"\nmsgstr \"不买\"\n\n#. Key:\tchar_name_dr_ball\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"possible display name for character\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Dr. Ball\"\nmsgstr \"球先生\"\n\n#. Key:\tchar_name_epic_sphero\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"possible display name for character\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Epic Sphero\"\nmsgstr \"史诗球面\"\n\n#. Key:\tchar_name_failed_one\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"possible display name for character\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Failed One\"\nmsgstr \"堕落者\"\n\n#. Key:\tchar_name_saviour\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"possible display name for character\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Saviour\"\nmsgstr \"救世主\"\n\n#. Key:\tchar_name_sorbcerer\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"possible display name for character\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Sorbcerer\"\nmsgstr \"巫师\"\n\n#. Key:\tchar_name_spirit_of_the_unknown\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"possible display name for character\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Spirit Of the Unknown\"\nmsgstr \"无名幽魂\"\n\n#. Key:\tchar_name_ultimate_frisbee\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"possible display name for character\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Ultimate Frisbee\"\nmsgstr \"极限飞盘\"\n\n#. Key:\tchar_name_wanderer\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"possible display name for character\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Wanderer\"\nmsgstr \"流浪者\"\n\n#. Key:\tchar_name_warlorb\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"possible display name for character\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Warlorb\"\nmsgstr \"球督\"\n\n#. Key:\tchar_name_warriorb\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"possible display name for character\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"WarriOrb\"\nmsgstr \"球魂\"\n\n#. Key:\tfinish\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"default option\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Finish\"\nmsgstr \"完成\"\n\n#. Key:\tgold_gained\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"{0} Gold Gained\"\nmsgstr \"获得 {0} 金币\"\n\n#. Key:\tgold_lost\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"{0} Gold Lost\"\nmsgstr \"失去 {0} 金币\"\n\n#. Key:\titem_gained\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"{ItemName} gained!\"\nmsgstr \"获得 {ItemName}！\"\n\n#. Key:\titem_gained_n\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"{Amount} {ItemName} gained!\"\nmsgstr \"获得 {Amount} {ItemName}！\"\n\n#. Key:\titem_lost\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"{ItemName} lost!\"\nmsgstr \"失去 {ItemName}！\"\n\n#. Key:\titem_lost_n\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"{Amount} {ItemName} lost!\"\nmsgstr \"失去 {Amount} {ItemName}！\"\n\n#. Key:\tnext\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"default option\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Next\"\nmsgstr \"下一个\"\n\n#. Key:\tnpc_altar\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"npc if BPLanguage Improver\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Altar\"\nmsgstr \"圣塔\"\n\n#. Key:\tnpc_ancient_gate\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an npc\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Ancient Gate\"\nmsgstr \"远古之门\"\n\n#. Key:\tnpc_demon_lillian\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"name of the final boss\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Demon Lillian\"\nmsgstr \"恶魔莉莉安\"\n\n#. Key:\tnpc_dwarven_workshop\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"name of the place the character can have a dialogue to craft a quest item\"\n#. dialogue to craft a quest item\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Dwarven Workshop\"\nmsgstr \"矮人工坊\"\n\n#. Key:\tnpc_fishy\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"display name of an npc\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Fishy\"\nmsgstr \"呆鱼\"\n\n#. Key:\tnpc_fountain\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"display name of a fountain the character can talk with\"\n#. talk with\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Fountain\"\nmsgstr \"喷泉\"\n\n#. Key:\tnpc_gatekeeper\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an npc\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Gatekeeper\"\nmsgstr \"看门人\"\n\n#. Key:\tnpc_ghost_dwarf\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an npc (actually a ghost of a dwarf)\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Ghost Dwarf\"\nmsgstr \"矮人幽魂\"\n\n#. Key:\tnpc_gnory\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an npc\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Gnory\"\nmsgstr \"格诺里\"\n\n#. Key:\tnpc_golem_maker\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an npc\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Golem Maker\"\nmsgstr \"机器人制造者\"\n\n#. Key:\tnpc_lory\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an npc\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Lory\"\nmsgstr \"劳里\"\n\n#. Key:\tnpc_lory_unkown\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"display name of Lory before she introduces herself\"\n#. herself\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Gnome Lady\"\nmsgstr \"侏儒女士\"\n\n#. Key:\tnpc_magic_mirror\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an npc\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Magic Mirror\"\nmsgstr \"魔镜\"\n\n#. Key:\tnpc_merchant\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an npc\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Merch Ant\"\nmsgstr \"默克蚂蚁\"\n\n#. Key:\tnpc_merchant_voice\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"name of a small ant until he says his name (only a voice cause player can not see it)\"\n#. (only a voice cause player can not see it)\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Voice\"\nmsgstr \"声音\"\n\n#. Key:\tnpc_monk\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an npc\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Monk\"\nmsgstr \"修道士\"\n\n#. Key:\tnpc_name_kobold\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Kobold Chef\"\nmsgstr \"地精厨师\"\n\n#. Key:\tnpc_pipe_walker\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"display name of some weird creatures\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Pipe Walker\"\nmsgstr \"管行者\"\n\n#. Key:\tnpc_raven\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an npc (he is actually a bird)\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Raven\"\nmsgstr \"乌鸦\"\n\n#. Key:\tnpc_scholar\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an npc\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Scholar\"\nmsgstr \"斯考拉\"\n\n#. Key:\tnpc_secret_hideout\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"display name of a door asking for a password\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Secret Hideout Gate\"\nmsgstr \"秘密藏身处的门\"\n\n#. Key:\tnpc_sewer_creature\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an npc\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Sewer Creature\"\nmsgstr \"下水道魔物\"\n\n#. Key:\tnpc_statue\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an npc\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Statue\"\nmsgstr \"雕像\"\n\n#. Key:\tnpc_supper_dwarf\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"display name of an npc. Supper refers here an evening meal, typically a light or informal one.\"\n#. evening meal, typically a light or informal one.\"\n#. here an evening meal, typically a light or informal one.\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Supper Dwarf\"\nmsgstr \"晚餐矮人\"\n\n#. Key:\tnpc_teachy\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an npc\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Teachy\"\nmsgstr \"提奇\"\n\n#. Key:\tnpc_teachy_unkown\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"name of Teachy before introduction\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Bored Gnome\"\nmsgstr \"无聊的侏儒\"\n\n#. Key:\tnpc_tomb\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"display name of a tomb a character can talk to\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Tomb\"\nmsgstr \"坟墓\"\n\n#. Key:\tnpc_unknown_wizard\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"display name of an npc\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Unknown Wizard\"\nmsgstr \"无名巫师\"\n\n#. Key:\tnpc_wizard\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"display name of the wizard npc\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Wizard\"\nmsgstr \"巫师\"\n\n#. Key:\t022227664F6F422B20B109A19B8789AA\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_8.Text\n#. /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"I’m glad you are back again!\"\nmsgstr \"很高兴你又回来了！\"\n\n#. Key:\t0944D8A541F933BEB5DD068CA9099075\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_44.Text\n#. /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_44.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_44.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"I think I managed to activate the device on the wall of the Portal Tower.\"\nmsgstr \"我想我成功激活了传送塔上的装置。\"\n\n#. Key:\t10ADF4F948FB99445BF791BB0722AD90\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_25.Text\n#. /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_25.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_25.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Good idea.\"\nmsgstr \"好主意。\"\n\n#. Key:\t137B87BB447D45E46C0425A940E8B7F0\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_46.Text\n#. /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_46.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_46.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"You said you wouldn't do it...\"\nmsgstr \"你说过你不会这么做的...\"\n\n#. Key:\t16358AE840D8B8553E8930A3B7E69BBA\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_9.Text\n#. /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"You know, sometimes I miss the Pipewalkers...\"\nmsgstr \"你知道，有时候我会想念那些管道中行走的家伙...\"\n\n#. Key:\t1B9834C6405C60960F322585AB0F1704\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_38.Text\n#. Key:\t2189E8064ACF974902FBA49BD12D0F47\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_2.Text\n#. /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_38.Text\n#. /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_38.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Could you activate it for me?\"\nmsgstr \"你能帮我激活它吗？\"\n\n#. Key:\t274EB7AD410061E3E200A9813A54AB29\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_4.Text\n#. /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"I think I've already done that.\"\nmsgstr \"我想我已经做过了。\"\n\n#. Key:\t2A57878148EFCC8532E34CAE1B9C9A0F\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_1.Text\n#. /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"You? I never thought I’ll see you in this shape again.\"\nmsgstr \"是你？没想到竟然还能见到你变成这副模样。\"\n\n#. Key:\t3764BB48401ABEDCD125F186B4BF0E17\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_22.Text\n#. /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"And it also attracts the Pipewalkers.\"\nmsgstr \"它还吸引了管道行走者。\"\n\n#. Key:\t3A0924F7449355545C0A98B94994616B\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_18.Text\n#. /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"I want to find my tribe.\"\nmsgstr \"我想找到我的部落。\"\n\n#. Key:\t3C0498284D71B7B64FEA4094F42A5502\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_23.Text\n#. /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_23.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_23.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Do you think you will find Pipewalkers here?\"\nmsgstr \"你觉得能在这里找到管道行走者吗？\"\n\n#. Key:\t3DCACAB047175FB687542AB0CA25D972\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_38.Children(1).Children.Text\n#. /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_38.Children(1).Children.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_38.Children(1).Children.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Decline\"\nmsgstr \"下降\"\n\n#. Key:\t41C1FCA947041D49247FC8A157D7407F\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_52.Text\n#. /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_52.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_52.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"All right, thank you.\"\nmsgstr \"好的，谢谢。\"\n\n#. Key:\t43C8FE9248340E49F1F31882D7B96642\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_14.Text\n#. /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"If they are still alive they must be beyond that Purple Portal.\"\nmsgstr \"如果他们还活着，一定能穿越这所紫色传送门。\"\n\n#. Key:\t444DD931423A98C7DD95D4BB73F0F1C6\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_39.Text\n#. /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_39.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_39.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Sure! I’ll see what I can do.\"\nmsgstr \"当然！我看看应该怎么做。\"\n\n#. Key:\t4FF2FA154BEFBD448EFDB0BB7FE3F0AF\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_11.Children(1).Children.Text\n#. /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_11.Children(1).Children.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_11.Children(1).Children.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Tribe\"\nmsgstr \"部落\"\n\n#. Key:\t52A8B1F04C37F262E014DEA14AB68957\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_20.Text\n#. /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Because I’m a chef.\"\nmsgstr \"因为我是一个厨师。\"\n\n#. Key:\t5F376BF945B8CE4AA12B7EB05F8C62A5\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_11.Children(6).Children.Text\n#. /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_11.Children(6).Children.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_11.Children(6).Children.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Leave\"\nmsgstr \"离开\"\n\n#. Key:\t63EA4DDD45390542E3A904928143D9AF\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_3.Text\n#. /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Haha... Yes I’m back again.\"\nmsgstr \"哈哈... 我又回来了。\"\n\n#. Key:\t64EE856046A396F2750AE1BC1042CF26\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_30.Text\n#. Key:\tE3F52F4F47289406E4A546BB0BF3AC3F\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_50.Text\n#. /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_30.Text\n#. /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_50.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_30.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_50.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Thanks!\"\nmsgstr \"谢谢！\"\n\n#. Key:\t694B6E3F4F4C7CEAAACB51A2D30FFD26\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_11.Children(2).Children.Text\n#. /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_11.Children(2).Children.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_11.Children(2).Children.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Ruin\"\nmsgstr \"毁灭\"\n\n#. Key:\t7304F1034A83C6D17E274090FA8E543B\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_41.Text\n#. /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_41.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_41.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Thank you!\"\nmsgstr \"谢谢！\"\n\n#. Key:\t73240093450B12BEEA1EB78C9CF7D89E\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_11.Children(0).Children.Text\n#. /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_11.Children(0).Children.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_11.Children(0).Children.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Purple Portal\"\nmsgstr \"紫色传送门\"\n\n#. Key:\t804671AF40165C92FA6A8F8A5AE97997\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_60.Text\n#. /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_60.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_60.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Looks like I can’t get rid of this body.\"\nmsgstr \"看来我无法摆脱这具身体。\"\n\n#. Key:\t807FF1A945548216DAD305B4D5A4437F\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_24.Text\n#. /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_24.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_24.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"If there are any they will come here when they smell the soup.\"\nmsgstr \"如果有的话，他们闻到汤味就会过来。\"\n\n#. Key:\t8240EF7946C8434333AFAEBEF3583917\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_34.Text\n#. /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_34.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_34.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Do you need help with something?\"\nmsgstr \"你需要帮助吗？\"\n\n#. Key:\t833BB4384231444247779CAB596D0259\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_40.Text\n#. /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_40.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_40.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"I’m sorry but that sounds complicated.\"\nmsgstr \"对不起，这听起来很复杂。\"\n\n#. Key:\t85656A9E46844B03D49E13AC951FDE07\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_59.Text\n#. /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_59.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_59.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"See you!\"\nmsgstr \"回头见！\"\n\n#. Key:\t869485E24E19938DEE48BFB5C5240BB3\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_29.Text\n#. /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_29.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_29.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"I’m not sure... but I have a key which might be useful.\"\nmsgstr \"我不确定… 但是我有一把可能会派上作用的钥匙。\"\n\n#. Key:\t86FBA5A24734DD97167512A054A2E0D9\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_10.Text\n#. /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Oh, it’s you.\"\nmsgstr \"哦，是你。\"\n\n#. Key:\t891684A24BA64E351E7F0B9ADEA3D6DF\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_17.Text\n#. /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"No. To be honest I don’t care much about Ruin.\"\nmsgstr \"不。说实话，我不太在乎毁灭。\"\n\n#. Key:\t8FF6BF7B4745BB75C2D8F7873C492C2D\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_11.Children(4).Children.Text\n#. /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_11.Children(4).Children.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_11.Children(4).Children.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Can I help?\"\nmsgstr \"我能帮忙吗？\"\n\n#. Key:\t93B13014434102C8033B41A06DBED69B\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_11.Children(5).Children.Text\n#. /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_11.Children(5).Children.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_11.Children(5).Children.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Tower Device\"\nmsgstr \"塔装置\"\n\n#. Key:\t95A7C27A44B78CBF17C1FD8C9446CBD7\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_28.Text\n#. /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Take it! I still need some time to finish the soup anyway.\"\nmsgstr \"拿着！我还需要点时间才能喝完这道汤。\"\n\n#. Key:\t97E4FDC74B47A6037D6023A4C65B2934\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_37.Text\n#. /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_37.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_37.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"If you activate it I’ll be able to use the portal to teleport to other places.\"\nmsgstr \"如果你激活它，我就可以使用传送门传送到其他地方。\"\n\n#. Key:\t9FD2679D44BEBBFBBAD2EAAECFFEE0D5\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_42.Text\n#. /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_42.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_42.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"I can’t promise I’ll do that.\"\nmsgstr \"我不能保证会那样做。\"\n\n#. Key:\tAA1C6EF444BAB6A929E953A87BB87ABB\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_56.Text\n#. /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_56.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_56.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"I've got to go. See you soon!\"\nmsgstr \"我得走了。再见！\"\n\n#. Key:\tAED4FBE3422E0FC4AC4BD38650F95CA9\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_26.Text\n#. /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_26.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_26.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Thanks.\"\nmsgstr \"谢谢。\"\n\n#. Key:\tB0BAD1934671ADCB2DD1E1BA582E3C68\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_19.Text\n#. /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Why are you making soup?\"\nmsgstr \"你为什么要做汤？\"\n\n#. Key:\tB621AECE42A14A508C945595493F3A3A\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_5.Text\n#. /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Really? Anyway, I’m happy to see you.\"\nmsgstr \"真的吗？不管怎样，很高兴见到你。\"\n\n#. Key:\tBA715D554C47932C092462B36ADEA081\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_58.Text\n#. /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_58.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_58.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Good bye!\"\nmsgstr \"再见！\"\n\n#. Key:\tBE7B3444431F43E8E1487F8702B94845\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_57.Text\n#. /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_57.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_57.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"It was nice to meet you.\"\nmsgstr \"见到你很高兴。\"\n\n#. Key:\tC1BB24A443D4297B17E2F6A280B02E91\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_36.Text\n#. /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_36.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_36.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Yes. According to a book I read here there is a device on the wall of the Portal Tower.\"\nmsgstr \"是的。根据我在这里读到的一本书上据说，传送塔的墙上有一个装置。\"\n\n#. Key:\tC339B87742C2B475E2387F93418AA855\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_15.Text\n#. /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Have you found out anything about Ruin?\"\nmsgstr \"你知道什么叫毁灭吗？\"\n\n#. Key:\tC4D263AB48B800D5522A24923C541ED3\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_11.Children(3).Children.Text\n#. /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_11.Children(3).Children.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_11.Children(3).Children.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Soup\"\nmsgstr \"汤\"\n\n#. Key:\tC530096E4FA1A2B68077C3AD6AC1BF44\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_38.Children(0).Children.Text\n#. /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_38.Children(0).Children.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_38.Children(0).Children.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Accept Quest\"\nmsgstr \"接受任务\"\n\n#. Key:\tC82668E6497A810FA6ADC0AB6F362B47\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_7.Text\n#. /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"The soup is almost ready...\"\nmsgstr \"汤已经准备好了...\"\n\n#. Key:\tCD8CDA3443CDE79BE257B99A0801B209\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_43.Text\n#. /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_43.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_43.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"No problem.\"\nmsgstr \"没问题。\"\n\n#. Key:\tD058108241051A9FD0D130B3C9EA4B8B\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_21.Text\n#. /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"It helps me keep my mind clear.\"\nmsgstr \"它帮助我保持头脑清醒。\"\n\n#. Key:\tD8F879684C57BB474E7153B971073663\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_49.Text\n#. /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_49.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_49.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Meanwhile I cooked something special for you. Take this!\"\nmsgstr \"同时，我为你做了一些特别的东西。拿好这个！\"\n\n#. Key:\tDA9D493F42420BE9442B1EA983AEF9C2\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_12.Text\n#. /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Any news on your lost tribe?\"\nmsgstr \"有你失踪部落的消息了吗？\"\n\n#. Key:\tDE2390ED4366A621E4D220A3761333DE\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_54.Text\n#. /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_54.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_54.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"I need to go now.\"\nmsgstr \"我得走了。\"\n\n#. Key:\tDE668E4B4A3D0F785A693B9190E635D3\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_47.Text\n#. /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_47.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_47.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"How on earth have you managed to reach this node?\"\nmsgstr \"你到底是怎么到达这个点的？\"\n\n#. Key:\tE29E2D044497A86DD0FCA8B540703597\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_48.Text\n#. /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_48.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_48.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Pls. report it as a bug.\"\nmsgstr \"请把这个作为错误进行报告。\"\n\n#. Key:\tE6D3401944B2FF128DD1689F5159AF96\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_45.Text\n#. /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_45.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_45.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Nice, well done!\"\nmsgstr \"好，做得好！\"\n\n#. Key:\tE83287164D066CCE8FBFDE835FBD4CFB\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_55.Text\n#. /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_55.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_55.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"I'm on my way. Take care!\"\nmsgstr \"我马上就来。保重！\"\n\n#. Key:\tEBC97F7C45858FE6DC72209536FC5C3B\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_27.Text\n#. /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_27.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_27.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Do you know how can I reach that Purple Portal?\"\nmsgstr \"你知道我怎样才能到达那个紫色传送门吗？\"\n\n#. Key:\tF911D6CB45AA59448C03379A1C07DD60\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_51.Text\n#. /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_51.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_51.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"It wasn’t that complicated after all.\"\nmsgstr \"其实并没有那么复杂。\"\n\n#. Key:\tF9EBA1684D435C8AEB14129A7B57A604\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_13.Text\n#. /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"I think they came here and followed the messages just like you.\"\nmsgstr \"我想他们跟你一样，来到这儿并且遵循信息指示行动。\"\n\n#. Key:\t3DAA74ED48BE31E35D868FB1492E57A8\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/WW_Pergamen.WW_Pergamen:DlgNode_Speech_1.Text\n#. /Game/SO/Dialogues/WhiteWall/WW_Pergamen.WW_Pergamen:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/WhiteWall/WW_Pergamen.WW_Pergamen:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_WW_Pergamen\"\nmsgid \"'Ruin took over some of us. It's no longer safe here.'\"\nmsgstr \"'毁灭摧毁了我们中的一些人。这个地方不再安全。'\"\n\n#. Key:\tB10818134FFE3A1E99A9D789BFABBBEE\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/WW_Pergamen.WW_Pergamen:DlgNode_Speech_3.Text\n#. /Game/SO/Dialogues/WhiteWall/WW_Pergamen.WW_Pergamen:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/WhiteWall/WW_Pergamen.WW_Pergamen:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_WW_Pergamen\"\nmsgid \"'Come visit us beyond the Purple Portal!'\"\nmsgstr \"'到紫色传送门那儿来找我们吧！'\"\n\n#. Key:\tD292364A4E58F52FB874AA98C1F969A6\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/WW_Pergamen.WW_Pergamen:DlgNode_Speech_2.Text\n#. /Game/SO/Dialogues/WhiteWall/WW_Pergamen.WW_Pergamen:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/WhiteWall/WW_Pergamen.WW_Pergamen:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_WW_Pergamen\"\nmsgid \"'We are close to the solution, but your help is still needed.'\"\nmsgstr \"'我们基本能解决问题了。但还需要你的帮助。'\"\n\n#. Key:\t0CD0FD884718EF68B38D578CDE17110A\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/WW_Statue.WW_Statue:DlgNode_Speech_2.Text\n#. /Game/SO/Dialogues/WhiteWall/WW_Statue.WW_Statue:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/WhiteWall/WW_Statue.WW_Statue:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_WW_Statue\"\nmsgid \"Oooops...\"\nmsgstr \"糟糕...\"\n\n#. Key:\t2D531D384CB6A56DBC4834BD229622E7\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/WW_Statue.WW_Statue:DlgNode_Speech_1.Text\n#. /Game/SO/Dialogues/WhiteWall/WW_Statue.WW_Statue:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/WhiteWall/WW_Statue.WW_Statue:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_WW_Statue\"\nmsgid \"'White Wall will never fall!'\"\nmsgstr \"'白色巨塔永不倒!'\"\n\n#. Key:\t2690E77045D5E42F32AC6582BAFF27AA\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/WW_StatueWelcome.WW_StatueWelcome:DlgNode_Speech_1.Text\n#. /Game/SO/Dialogues/WhiteWall/WW_StatueWelcome.WW_StatueWelcome:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/WhiteWall/WW_StatueWelcome.WW_StatueWelcome:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_WW_StatueWelcome\"\nmsgid \"'We know how to stop Ruin.'\"\nmsgstr \"“我们知道如何阻止毁灭。”\"\n\n#. Key:\t7C3340434A4C80010AC2D58BF8504339\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/WW_StatueWelcome.WW_StatueWelcome:DlgNode_Speech_2.Text\n#. /Game/SO/Dialogues/WhiteWall/WW_StatueWelcome.WW_StatueWelcome:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/WhiteWall/WW_StatueWelcome.WW_StatueWelcome:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_WW_StatueWelcome\"\nmsgid \"'There is still hope.'\"\nmsgstr \"“还有希望。”\"\n\n#. Key:\tarmour_wrath_name\n#. SourceLocation:\tLocalization/StringTables/Enemies.csv\n#. InfoMetaData:\t\"Comment\" : \"display name of an npc boss\"\n#: Localization/StringTables/Enemies.csv\nmsgctxt \"Enemies\"\nmsgid \"Armour Wrath\"\nmsgstr \"铠甲之怒\"\n\n#. Key:\tdwarf_name\n#. SourceLocation:\tLocalization/StringTables/Enemies.csv\n#. InfoMetaData:\t\"Comment\" : \"display name of an npc boss\"\n#: Localization/StringTables/Enemies.csv\nmsgctxt \"Enemies\"\nmsgid \"Dwarf\"\nmsgstr \"矮人\"\n\n#. Key:\tfallen_druid_name\n#. SourceLocation:\tLocalization/StringTables/Enemies.csv\n#. InfoMetaData:\t\"Comment\" : \"display name of an npc boss\"\n#: Localization/StringTables/Enemies.csv\nmsgctxt \"Enemies\"\nmsgid \"Fallen Druid\"\nmsgstr \"堕落的德鲁伊\"\n\n#. Key:\tdreamhack_completed_desc\n#. SourceLocation:\tLocalization/StringTables/Episodes.csv\n#: Localization/StringTables/Episodes.csv\nmsgctxt \"Episodes\"\nmsgid \"Thanks for playing the game, we hope you had a great time!\"\nmsgstr \"感谢体验！希望您游戏愉快！\"\n\n#. Key:\tdreamhack_completed_subtitle\n#. SourceLocation:\tLocalization/StringTables/Episodes.csv\n#: Localization/StringTables/Episodes.csv\nmsgctxt \"Episodes\"\nmsgid \"Dreamhack Demo\"\nmsgstr \"Dreamhack试玩\"\n\n#. Key:\tdreamhack_desc\n#. SourceLocation:\tLocalization/StringTables/Episodes.csv\n#: Localization/StringTables/Episodes.csv\nmsgctxt \"Episodes\"\nmsgid \"What happens when you lock a mighty demon's spirit inside a ball body?\"\nmsgstr \"当你把一个强大的恶魔之魂锁在一个球体内会发生什么？\"\n\n#. Key:\tdreamhack_friendly_name\n#. SourceLocation:\tLocalization/StringTables/Episodes.csv\n#: Localization/StringTables/Episodes.csv\nmsgctxt \"Episodes\"\nmsgid \"Dreamhack\"\nmsgstr \"Dreamhack\"\n\n#. Key:\tepisode_end_main_title\n#. SourceLocation:\tLocalization/StringTables/Episodes.csv\n#. InfoMetaData:\t\"Comment\" : \"episode map end panel text\"\n#: Localization/StringTables/Episodes.csv\nmsgctxt \"Episodes\"\nmsgid \"Episode Completed!\"\nmsgstr \"章节完成！\"\n\n#. Key:\tescape_darkness_completed_desc\n#. SourceLocation:\tLocalization/StringTables/Episodes.csv\n#: Localization/StringTables/Episodes.csv\nmsgctxt \"Episodes\"\nmsgid \"\\\"And as Darkness spreads an unknown Warriorb will rise...\\\"\"\nmsgstr \"“随着黑暗的蔓延，一个未知的球魂将崛起……”\"\n\n#. Key:\tescape_darkness_completed_subtitle\n#. SourceLocation:\tLocalization/StringTables/Episodes.csv\n#: Localization/StringTables/Episodes.csv\nmsgctxt \"Episodes\"\nmsgid \"Escaped from Darkness\"\nmsgstr \"逃离黑暗\"\n\n#. Key:\tescape_darkness_desc\n#. SourceLocation:\tLocalization/StringTables/Episodes.csv\n#: Localization/StringTables/Episodes.csv\nmsgctxt \"Episodes\"\nmsgid \"Are you fast enough to race against Darkness itself?\"\nmsgstr \"你有足够快的速度跑赢黑暗吗？\"\n\n#. Key:\tescape_darkness_friendly_name\n#. SourceLocation:\tLocalization/StringTables/Episodes.csv\n#: Localization/StringTables/Episodes.csv\nmsgctxt \"Episodes\"\nmsgid \"Escape Darkness\"\nmsgstr \"逃离黑暗\"\n\n#. Key:\twhite_wall_completed_desc\n#. SourceLocation:\tLocalization/StringTables/Episodes.csv\n#. InfoMetaData:\t\"Comment\" : \"short text on the ending panel when player finishes this episode\"\n#. finishes this episode\"\n#: Localization/StringTables/Episodes.csv\nmsgctxt \"Episodes\"\nmsgid \"What happened beyond the portal is another story, which will be told at another time.\"\nmsgstr \"传送门之外发生的另一个故事，我们将择日再进行讲述。\"\n\n#. Key:\twhite_wall_completed_subtitle\n#. SourceLocation:\tLocalization/StringTables/Episodes.csv\n#. InfoMetaData:\t\"Comment\" : \"subtitle of the ending panel when player finishes this episode\"\n#. Key:\twhite_wall_friendly_name\n#. InfoMetaData:\t\"Comment\" : \"name the episode is displayed with in the ui\"\n#. finishes this episode\"\n#: Localization/StringTables/Episodes.csv\nmsgctxt \"Episodes\"\nmsgid \"White Wall\"\nmsgstr \"白色巨墙\"\n\n#. Key:\twhite_wall_desc\n#. SourceLocation:\tLocalization/StringTables/Episodes.csv\n#. InfoMetaData:\t\"Comment\" : \"map desc when the player can select the episode\"\n#: Localization/StringTables/Episodes.csv\nmsgctxt \"Episodes\"\nmsgid \"Although it's long abandoned the fortress of White Wall still stands against Ruin. After centuries of silence some groups of unexpected visitors broke the loneliness of the decaying city.\"\nmsgstr \"虽然它已经废弃很久了，但白墙要塞仍然屹立着阻碍着毁灭的脚步。在沉寂了几个世纪之后，一些不速之客打破了这座衰败城市的孤独。\"\n\n#. Key:\twhite_wall_loadingscreen_desc\n#. SourceLocation:\tLocalization/StringTables/Episodes.csv\n#. InfoMetaData:\t\"Comment\" : \"text on loading screen\"\n#: Localization/StringTables/Episodes.csv\nmsgctxt \"Episodes\"\nmsgid \"After months of researching I found a way to return back to the Ruined Realm. Ironically enough I have to use the same body I was trapped in before. I'll need to be quick and clever for this might be my very last chance to stop Ruin before it devours the World.\"\nmsgstr \"经过几个月的研究，我发现了一个回到荒废领域的方法。讽刺的是，我不得不使用曾经将我困住的那个躯体。我需要快速行动并保持头脑灵活 ，因为这可能是我在毁灭吞噬世界之前能阻止它的最后机会。\"\n\n#. Key:\tchar_vo_armourwrath_attack_clap\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I won't fail the Maker!\"\nmsgstr \"我不会让制造者失望的！\"\n\n#. Key:\tchar_vo_armourwrath_attack_die\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"No... I'm still... perfect\"\nmsgstr \"不... 我依然... 完美\"\n\n#. Key:\tchar_vo_armourwrath_attack_magic\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Resist Ruin!\"\nmsgstr \"抵抗毁灭！\"\n\n#. Key:\tchar_vo_armourwrath_attack_strike_down\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Out of my way!\"\nmsgstr \"别挡道！\"\n\n#. Key:\tchar_vo_armourwrath_attack_strike_down_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I am perfect\"\nmsgstr \"我是完美的\"\n\n#. Key:\tchar_vo_dwarvenstatue_attack_axe_point\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I keep Ruin\"\nmsgstr \"我既是毁灭\"\n\n#. Key:\tchar_vo_dwarvenstatue_attack_axe_strike_down\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"We are above the Law!\"\nmsgstr \"我们凌驾于律法之上!\"\n\n#. Key:\tchar_vo_dwarvenstatue_attack_meteor\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I can take more!\"\nmsgstr \"我要更多!\"\n\n#. Key:\tchar_vo_dwarvenstatue_die\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I won't move... again\"\nmsgstr \"我不愿改变……再一次\"\n\n#. Key:\tchar_vo_dwarvenstatue_shield_knock\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I hold it back!\"\nmsgstr \"我忍住了!\"\n\n#. Key:\tchar_vo_fallendruid_attack_flybug\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"It's safe here.\"\nmsgstr \"这儿很安全。\"\n\n#. Key:\tchar_vo_fallendruid_attack_spike\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"This place shall stand!\"\nmsgstr \"此地将屹立不倒！\"\n\n#. Key:\tchar_vo_fallendruid_attack_tendril\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Nature will survive!\"\nmsgstr \"自然将永存！\"\n\n#. Key:\tchar_vo_fallendruid_attack_thorn_sphere\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Out with you, Ruin!\"\nmsgstr \"滚开，毁灭！\"\n\n#. Key:\tchar_vo_fallendruid_die\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I have... failed\"\nmsgstr \"我... 失败了\"\n\n#. Key:\tchar_vo_final_boss_p1_blue\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#. Key:\tchar_vo_final_boss_p2_blue\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I'm the daughter of the Wizard!\"\nmsgstr \"我是巫师的女儿！\"\n\n#. Key:\tchar_vo_final_boss_p1_green\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#. Key:\tchar_vo_final_boss_p2_red_up\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I can create!\"\nmsgstr \"我可以创造！\"\n\n#. Key:\tchar_vo_final_boss_p1_red\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I'm human!\"\nmsgstr \"我是人类！\"\n\n#. Key:\tchar_vo_final_boss_p2_green\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#. Key:\tchar_vo_final_boss_p3_green\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"That sounds funny!\"\nmsgstr \"听上去很有趣！\"\n\n#. Key:\tchar_vo_final_boss_p2_red_down\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I can destroy!\"\nmsgstr \"我可以摧毁！\"\n\n#. Key:\tchar_vo_final_boss_p3_blue\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I'm free!\"\nmsgstr \"我自由了！\"\n\n#. Key:\tchar_vo_final_boss_p3_red\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"What makes you say that?\"\nmsgstr \"你为什么这么说？\"\n\n#. Key:\tchar_vo_fishy_idle_hiss\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Hissing\"\nmsgstr \"嘶嘶声\"\n\n#. Key:\tchar_vo_flybug_attack_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Huh! Surprised?\"\nmsgstr \"哼！吃惊吗？\"\n\n#. Key:\tchar_vo_flybug_attack_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Take this!\"\nmsgstr \"拿着这个！\"\n\n#. Key:\tchar_vo_flybug_damaged_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Careful!\"\nmsgstr \"小心！\"\n\n#. Key:\tchar_vo_flybug_damaged_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"It's not funny!\"\nmsgstr \"一点也不好玩！\"\n\n#. Key:\tchar_vo_flybug_die_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"All right, gg!\"\nmsgstr \"好吧！\"\n\n#. Key:\tchar_vo_flybug_idle_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"What is it like down there? Heh?\"\nmsgstr \"下面是什么样子的？\"\n\n#. Key:\tchar_vo_flybug_idle_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Easy man, easy!\"\nmsgstr \"小伙子，放轻松！\"\n\n#. Key:\tchar_vo_gatekeeper_attack_aimed\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Avoid these!\"\nmsgstr \"避开那些！\"\n\n#. Key:\tchar_vo_gatekeeper_attack_aimed_phase_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Watch out where you bounce to!\"\nmsgstr \"当心你会跳去的地方！\"\n\n#. Key:\tchar_vo_gatekeeper_attack_electric_bubbles\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Attention to the heights!\"\nmsgstr \"注意高度!\"\n\n#. Key:\tchar_vo_gatekeeper_attack_electric_bubbles_phase_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Attention to the heights again!\"\nmsgstr \"再次注意高度!\"\n\n#. Key:\tchar_vo_gatekeeper_attack_meteors\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Watch out for your head!\"\nmsgstr \"小心你的头!\"\n\n#. Key:\tchar_vo_gatekeeper_attack_shield\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Do you really think you are worthy?\"\nmsgstr \"你真的认为自己有价值吗?\"\n\n#. Key:\tchar_vo_ghostarmor__die\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I... don't...\"\nmsgstr \"我.. 不...\"\n\n#. Key:\tchar_vo_ghostarmor_attack_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"You shall perish!\"\nmsgstr \"下地狱吧！\"\n\n#. Key:\tchar_vo_ghostarmor_attack_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"For justice!\"\nmsgstr \"为了正义！\"\n\n#. Key:\tchar_vo_ghostarmor_attack_fall\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Death to the outlaw!\"\nmsgstr \"亡命之徒！\"\n\n#. Key:\tchar_vo_ghostarmor_damaged_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Just a scratch.\"\nmsgstr \"一点皮毛伤。\"\n\n#. Key:\tchar_vo_ghostarmor_damaged_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"You... can't.\"\nmsgstr \"你... 不能...\"\n\n#. Key:\tchar_vo_ghostarmor_idle_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"We keep the Wall.\"\nmsgstr \"我们守着这堵墙。\"\n\n#. Key:\tchar_vo_ghostarmor_idle_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Follow the rules!\"\nmsgstr \"遵守规则！\"\n\n#. Key:\tchar_vo_ghosthelmet_attack_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Aaaaaaargh!\"\nmsgstr \"啊！\"\n\n#. Key:\tchar_vo_ghosthelmet_attack_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Chaaaaaarge!\"\nmsgstr \"补给！\"\n\n#. Key:\tchar_vo_ghosthelmet_damaged_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I'll need a blacksmith!\"\nmsgstr \"我需要一个铁匠！\"\n\n#. Key:\tchar_vo_ghosthelmet_damaged_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Send someone for a hammer!\"\nmsgstr \"派人去拿把锤子来！\"\n\n#. Key:\tchar_vo_ghosthelmet_die\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Be right back!\"\nmsgstr \"马上回来！\"\n\n#. Key:\tchar_vo_ghosthelmet_idle_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Use your head... or mine!\"\nmsgstr \"用你的头……我的也行！\"\n\n#. Key:\tchar_vo_ghosthelmet_idle_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Let's head east!\"\nmsgstr \"向东前进！\"\n\n#. Key:\tchar_vo_gnory_idle_humming\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Humming\"\nmsgstr \"嗡嗡声\"\n\n#. Key:\tchar_vo_gnory_idle_whistle\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Whistling\"\nmsgstr \"哨声\"\n\n#. Key:\tchar_vo_golemmaker_idle_explain_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I create essence which resists the ruin.\"\nmsgstr \"我创造了抵抗毁灭的精髓。\"\n\n#. Key:\tchar_vo_golemmaker_idle_mindlessly_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Knowledge is Lost, All is Lost.\"\nmsgstr \"不学无术，一无所有。\"\n\n#. Key:\tchar_vo_golemmaker_idle_mindlessly_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"All is Lost.\"\nmsgstr \"一无所有。\"\n\n#. Key:\tchar_vo_golemmaker_idle_moan_aaahhh\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Aaahhh\"\nmsgstr \"啊~~~\"\n\n#. Key:\tchar_vo_golemmaker_idle_moan_ooohhh\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Ooohhh\"\nmsgstr \"噢~~~\"\n\n#. Key:\tchar_vo_golemmaker_idle_sad_onon\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#. Localization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Onon\"\nmsgstr \"哟\"\n\n#. Key:\tchar_vo_golemmaker_idle_tries_to_remember\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Your words remind me of something.\"\nmsgstr \"你的话让我想起了一件事。\"\n\n#. Key:\tchar_vo_koboldchef_idle_01\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Too hot!\"\nmsgstr \"太热了！\"\n\n#. Key:\tchar_vo_koboldchef_idle_02\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"It needs more salt!\"\nmsgstr \"它需要更多的盐！\"\n\n#. Key:\tchar_vo_koboldchef_idle_03\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"It will be delicious.\"\nmsgstr \"一定很美味。\"\n\n#. Key:\tchar_vo_koboldchef_idle_04\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Hmm...\"\nmsgstr \"嗯...\"\n\n#. Key:\tchar_vo_lory_idle_croon\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Croon\"\nmsgstr \"低吟\"\n\n#. Key:\tchar_vo_lory_idle_humming_0\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Ohh\"\nmsgstr \"噢\"\n\n#. Key:\tchar_vo_lory_idle_humming_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#. Key:\tchar_vo_supperdwarf_idle_2_humming_1\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Hmmm\"\nmsgstr \"嗯...\"\n\n#. Key:\tchar_vo_lory_idle_humming_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Ommm\"\nmsgstr \"喔...\"\n\n#. Key:\tchar_vo_lory_idle_humming_3\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Auch\"\nmsgstr \"呼\"\n\n#. Key:\tchar_vo_maintainer_attack_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Dinner is served!\"\nmsgstr \"晚餐已就绪！\"\n\n#. Key:\tchar_vo_maintainer_attack_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Now it's clean!\"\nmsgstr \"现在它可干净了！\"\n\n#. Key:\tchar_vo_maintainer_damaged_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I'll need to be repaired.\"\nmsgstr \"我需要得到修理。\"\n\n#. Key:\tchar_vo_maintainer_damaged_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I still serve.\"\nmsgstr \"我依然提供服务。\"\n\n#. Key:\tchar_vo_maintainer_die\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I'll need... replacement.\"\nmsgstr \"我需要... 替代者。\"\n\n#. Key:\tchar_vo_maintainer_elite_idle_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Serve...\"\nmsgstr \"上菜...\"\n\n#. Key:\tchar_vo_maintainer_elite_idle_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Order...\"\nmsgstr \"点菜...\"\n\n#. Key:\tchar_vo_maintainer_idle_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"At your service.\"\nmsgstr \"乐意效劳。\"\n\n#. Key:\tchar_vo_maintainer_idle_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Your order?\"\nmsgstr \"你的命令吗？\"\n\n#. Key:\tchar_vo_maintainer_miniboss_attack_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"This is my order!\"\nmsgstr \"这是我的命令！\"\n\n#. Key:\tchar_vo_maintainer_miniboss_attack_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I'll reorganize!\"\nmsgstr \"我要重整旗鼓!\"\n\n#. Key:\tchar_vo_maintainer_miniboss_attack_meteor\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I'm above!\"\nmsgstr \"我在上面！\"\n\n#. Key:\tchar_vo_maintainer_miniboss_attack_spawn_enemy\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Order, order, order!\"\nmsgstr \"命令，命令，命令！\"\n\n#. Key:\tchar_vo_maintainer_miniboss_damaged_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I can fix this\"\nmsgstr \"我可以解决这个问题\"\n\n#. Key:\tchar_vo_maintainer_miniboss_damaged_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Don't do that again!\"\nmsgstr \"别再这样做了!\"\n\n#. Key:\tchar_vo_maintainer_miniboss_die\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I can't... I was... above.\"\nmsgstr \"我不能... 我在... 上面。\"\n\n#. Key:\tchar_vo_primitivefishy_attack_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Srrrr!\"\nmsgstr \"呃!\"\n\n#. Key:\tchar_vo_primitivefishy_attack_long_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Hurray!\"\nmsgstr \"万岁！\"\n\n#. Key:\tchar_vo_primitivefishy_attack_long_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Flyyyyyyy!\"\nmsgstr \"飞起！\"\n\n#. Key:\tchar_vo_primitivefishy_damaged_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Uuush!\"\nmsgstr \"嘘！\"\n\n#. Key:\tchar_vo_primitivefishy_damaged_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Shish!\"\nmsgstr \"烤肉！\"\n\n#. Key:\tchar_vo_primitivefishy_die\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Fishy leaves.\"\nmsgstr \"可疑的树叶。\"\n\n#. Key:\tchar_vo_primitivefishy_idle_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I need some fish!\"\nmsgstr \"我需要一些鱼!\"\n\n#. Key:\tchar_vo_primitivefishy_idle_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Did you hear that?\"\nmsgstr \"你听到了吗?\"\n\n#. Key:\tchar_vo_shade_attack_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Join me!\"\nmsgstr \"加入我！\"\n\n#. Key:\tchar_vo_shade_attack_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"You shall die too!\"\nmsgstr \"你也会死的！\"\n\n#. Key:\tchar_vo_shade_damaged_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Is this the end?\"\nmsgstr \"结束了吗？\"\n\n#. Key:\tchar_vo_shade_damaged_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Pain...\"\nmsgstr \"痛...\"\n\n#. Key:\tchar_vo_shade_die\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Death... again?!\"\nmsgstr \"又是... 死亡？！\"\n\n#. Key:\tchar_vo_shade_idle_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I can't rest.\"\nmsgstr \"我不能休息。\"\n\n#. Key:\tchar_vo_shade_idle_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Death is not peace.\"\nmsgstr \"死亡不代表和平。\"\n\n#. Key:\tchar_vo_shadesphere_attack_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I'll change you!\"\nmsgstr \"我会改变你的！\"\n\n#. Key:\tchar_vo_shadesphere_attack_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Do not resist me!\"\nmsgstr \"不要反抗我！\"\n\n#. Key:\tchar_vo_shadesphere_damaged_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"It's still... me...\"\nmsgstr \"还是... 我...\"\n\n#. Key:\tchar_vo_shadesphere_damaged_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Why did you...?\"\nmsgstr \"你为什么...？\"\n\n#. Key:\tchar_vo_shadesphere_die\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"You changed... me?\"\nmsgstr \"你把我... 修改了吗？\"\n\n#. Key:\tchar_vo_shadesphere_idle_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"What do you wish to be?\"\nmsgstr \"你想成为什么？\"\n\n#. Key:\tchar_vo_shadesphere_idle_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Come to me!\"\nmsgstr \"到我这儿来！\"\n\n#. Key:\tchar_vo_supperdwarf_idle_1_eating_food_0\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Yum-yum hmmmm... delicious\"\nmsgstr \"吧唧吧唧...  真美味\"\n\n#. Key:\tchar_vo_supperdwarf_idle_1_eating_food_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Hmmm... tasty\"\nmsgstr \"嗯....  好吃\"\n\n#. Key:\tchar_vo_supperdwarf_idle_1_eating_food_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Ehmmm... where is my spoon?\"\nmsgstr \"嗯.... 我的汤匙在哪儿？\"\n\n#. Key:\tchar_vo_supperdwarf_idle_2_humming_0\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Ehemm, ehemm\"\nmsgstr \"啦啦啦~\"\n\n#. Key:\tchar_vo_supperdwarf_idle_2_humming_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Ohm\"\nmsgstr \"噢~\"\n\n#. Key:\tchar_vo_teachy_idle_book_down_0\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Walking ball?\"\nmsgstr \"走路的球？\"\n\n#. Key:\tchar_vo_teachy_idle_book_down_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"You?\"\nmsgstr \"是你？\"\n\n#. Key:\tchar_vo_teachy_idle_book_down_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Do you exist outside of my mind?\"\nmsgstr \"你存在于我的脑海之外吗？\"\n\n#. Key:\tchar_vo_teachy_idle_book_down_3\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Ehm, what?\"\nmsgstr \"嗯，什么？\"\n\n#. Key:\tchar_vo_teachy_idle_book_up_0\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Ehmm\"\nmsgstr \"嗯\"\n\n#. Key:\tchar_vo_teachy_idle_book_up_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Humm\"\nmsgstr \"哈\"\n\n#. Key:\tchar_vo_teachy_idle_book_up_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Hemm\"\nmsgstr \"嘿\"\n\n#. Key:\tchar_vo_teachy_idle_book_up_3\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Ahm\"\nmsgstr \"啊\"\n\n#. Key:\tchar_vo_teachy_idle_humming_0\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Hmmm-hmmm-hmm\"\nmsgstr \"嗯-嗯-嗯\"\n\n#. Key:\tchar_vo_teachy_idle_humming_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Ehmm-hmmm-uhmm\"\nmsgstr \"嗯-哈-嘿\"\n\n#. Key:\tchar_vo_teachy_idle_humming_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Umm-huhummm\"\nmsgstr \"唔-咳\"\n\n#. Key:\tchar_vo_teachy_idle_humming_speaking_long_0\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I am, therefore I think!\"\nmsgstr \"是我，所以我想！\"\n\n#. Key:\tchar_vo_teachy_idle_humming_speaking_long_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I think... I am...\"\nmsgstr \"我想... 我是...\"\n\n#. Key:\tchar_vo_teachy_idle_humming_speaking_long_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"The unexamined life is not worth living!\"\nmsgstr \"缺乏考验的生活是没有价值的！\"\n\n#. Key:\tchar_vo_teachy_idle_humming_speaking_long_3\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"The mind is furnished with ideas by a drunk upholsterer...\"\nmsgstr \"这个头脑装满了来自一个醉醺醺的装饰工提供的各种想法……\"\n\n#. Key:\tchar_vo_teachy_idle_humming_speaking_short_0\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Tic-tac\"\nmsgstr \"嘀嗒，嘀嗒\"\n\n#. Key:\tchar_vo_teachy_idle_humming_speaking_short_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"To be...\"\nmsgstr \"...\"\n\n#. Key:\tchar_vo_teachy_idle_humming_speaking_short_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Weird\"\nmsgstr \"奇怪\"\n\n#. Key:\tAnyKey\n#. SourceLocation:\tSource/SOrb/Settings/Input/SoInputNames.cpp:347\n#: Source/SOrb/Settings/Input/SoInputNames.cpp:347\nmsgctxt \"InputKeys\"\nmsgid \"Any Key\"\nmsgstr \"任意键\"\n\n#. Key:\tDown\n#. SourceLocation:\tSource/SOrb/Settings/Input/SoInputNames.cpp:376\n#: Source/SOrb/Settings/Input/SoInputNames.cpp:376\nmsgctxt \"InputKeys\"\nmsgid \"Down\"\nmsgstr \"下\"\n\n#. Key:\tLeft\n#. SourceLocation:\tSource/SOrb/Settings/Input/SoInputNames.cpp:373\n#: Source/SOrb/Settings/Input/SoInputNames.cpp:373\nmsgctxt \"InputKeys\"\nmsgid \"Left\"\nmsgstr \"左\"\n\n#. Key:\tRight\n#. SourceLocation:\tSource/SOrb/Settings/Input/SoInputNames.cpp:375\n#: Source/SOrb/Settings/Input/SoInputNames.cpp:375\nmsgctxt \"InputKeys\"\nmsgid \"Right\"\nmsgstr \"右\"\n\n#. Key:\tUp\n#. SourceLocation:\tSource/SOrb/Settings/Input/SoInputNames.cpp:374\n#: Source/SOrb/Settings/Input/SoInputNames.cpp:374\nmsgctxt \"InputKeys\"\nmsgid \"Up\"\nmsgstr \"上\"\n\n#. Key:\tabsorb_energy\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Absorb Energy\"\nmsgstr \"吸收能量\"\n\n#. Key:\tacquired_few_item\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"message when more than one item is received at once\"\n#. once\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"A few items acquired\"\nmsgstr \"获得一些物品\"\n\n#. Key:\tacquired_item\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"{0} is replaced with an item name\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"{0} acquired\"\nmsgstr \"获得 {0}\"\n\n#. Key:\tactivate\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Activate\"\nmsgstr \"激活\"\n\n#. Key:\tactivate_elevator\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Activate Elevator\"\nmsgstr \"激活电梯\"\n\n#. Key:\taquired_silver_key\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"optional bonus message\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Silver Key Acquired\"\nmsgstr \"获得银钥匙\"\n\n#. Key:\tascend\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"climb up a ladder or rope or go up with an elevator\"\n#. elevator\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Ascend\"\nmsgstr \"使用\"\n\n#. Key:\tbed\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"examine Bed\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Bed\"\nmsgstr \"床\"\n\n#. Key:\tboat_to_kitchen\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"use a boat to get to the kitchen\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Boat to the Kitchen\"\nmsgstr \"乘船去厨房\"\n\n#. Key:\tboat_to_ruins\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"use a boat to get to a place where there are some ancient ruins\"\n#. some ancient ruins\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Boat to the Ruins\"\nmsgstr \"乘船去废墟\"\n\n#. Key:\tboat_to_station\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"use a boat to get to the Station\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Boat to the Station\"\nmsgstr \"乘船去车站\"\n\n#. Key:\tcall_elevator\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Call Elevator\"\nmsgstr \"呼叫电梯\"\n\n#. Key:\tcandles\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"examine Candles\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Candles\"\nmsgstr \"蜡烛\"\n\n#. Key:\tcat_bed\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"examine Tabbys (cat name) bed\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Tabby's Bed\"\nmsgstr \"泰比的床\"\n\n#. Key:\tchair\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"examine Chair\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Chair\"\nmsgstr \"椅子\"\n\n#. Key:\tchange_spells\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Change Spells\"\nmsgstr \"改变法术\"\n\n#. Key:\tcharge\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"charge gem in Act I\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Charge\"\nmsgstr \"充能\"\n\n#. Key:\tcheck_door\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"check door \"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Check Door\"\nmsgstr \"检查门\"\n\n#. Key:\tchest\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"examine Chest\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Chest\"\nmsgstr \"宝箱\"\n\n#. Key:\tchest_check\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Check Chest\"\nmsgstr \"查看宝箱\"\n\n#. Key:\tchest_check_small\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Check Small Chest\"\nmsgstr \"查看小宝箱\"\n\n#. Key:\tchest_close\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Close Chest\"\nmsgstr \"关闭宝箱\"\n\n#. Key:\tchest_close_small\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Close Small Chest\"\nmsgstr \"关闭小宝箱\"\n\n#. Key:\tchest_open\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Open Chest\"\nmsgstr \"打开宝箱\"\n\n#. Key:\tchest_open_small\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Open Small Chest\"\nmsgstr \"打开小宝箱\"\n\n#. Key:\tclose_door\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Close Door\"\nmsgstr \"关门\"\n\n#. Key:\tcross_planks\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Cross Planks\"\nmsgstr \"横木板\"\n\n#. Key:\tdads_room\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"examine Dad's Room\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Daddy's Room\"\nmsgstr \"爸爸的房间\"\n\n#. Key:\tdescend\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"climb down a ladder or rope or go down with an elevator\"\n#. elevator\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Descend\"\nmsgstr \"下降\"\n\n#. Key:\tdestroy\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"destroy device in EndFinal level\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Destroy\"\nmsgstr \"毁灭\"\n\n#. Key:\tdevice\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"use Device\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Device\"\nmsgstr \"装置\"\n\n#. Key:\tdoor\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"examine Door\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Door\"\nmsgstr \"门\"\n\n#. Key:\tdoor_does_not_open_from_this_side\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"message when character tries to open a door but it can only be openned from the other side\"\n#. but it can only be openned from the other side\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Door does not open from this side!\"\nmsgstr \"这扇门无法从这边打开！\"\n\n#. Key:\tdoor_opened\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"door openned\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Door opened\"\nmsgstr \"门已打开\"\n\n#. Key:\tdrop\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"drop box or carryable\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Drop\"\nmsgstr \"丢弃\"\n\n#. Key:\televator_activated\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Elevator Activated\"\nmsgstr \"电梯已启动\"\n\n#. Key:\televator_inactive\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"player tries to use the elevator but it is inactive\"\n#. inactive\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"The elevator seems to be inactive\"\nmsgstr \"电梯好像不动了\"\n\n#. Key:\televator_not_move_to_dir\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"player tries to use an elevator but the direction is not activated yet\"\n#. direction is not activated yet\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"The elevator does not move to the selected direction\"\nmsgstr \"电梯不向选定的方向移动\"\n\n#. Key:\tenter\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"teleport - enter a room or a portal\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Enter\"\nmsgstr \"进入\"\n\n#. Key:\tenter_bridge\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Enter Bridge\"\nmsgstr \"进入大桥\"\n\n#. Key:\tenter_cave\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Enter Cave\"\nmsgstr \"进入洞穴\"\n\n#. Key:\tenter_flames\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Enter Flames\"\nmsgstr \"进入烈焰\"\n\n#. Key:\tenter_gate\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Enter Gate\"\nmsgstr \"进入大门\"\n\n#. Key:\tenter_hut\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Enter Hut\"\nmsgstr \"进入小屋\"\n\n#. Key:\tenter_kitchen\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Enter Kitchen\"\nmsgstr \"进入厨房\"\n\n#. Key:\tenter_pipe\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Enter Pipe\"\nmsgstr \"进入管\"\n\n#. Key:\tenter_portal\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Enter Portal\"\nmsgstr \"进入门户\"\n\n#. Key:\tenter_stairs_left\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Enter Stairs on the Left\"\nmsgstr \"从左边上楼梯\"\n\n#. Key:\tenter_stairs_right\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Enter Stairs on the Right\"\nmsgstr \"从右边上楼梯\"\n\n#. Key:\tenter_tower\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Enter Tower\"\nmsgstr \"进入塔\"\n\n#. Key:\tentrace_locked\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Entrance locked from the other side\"\nmsgstr \"入口从另一边锁上了\"\n\n#. Key:\texamine\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"examine a statue or some other interactable object which triggers dialogue or hint message\"\n#. object which triggers dialogue or hint message\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Examine\"\nmsgstr \"检查\"\n\n#. Key:\texamine_device\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Examine Device\"\nmsgstr \"检查装置\"\n\n#. Key:\texamine_elevator\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Examine Elevator\"\nmsgstr \"检查电梯\"\n\n#. Key:\texamine_switch\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"it is a lightswitch\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Examine Switch\"\nmsgstr \"检查开关\"\n\n#. Key:\texit\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"exit room\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Exit\"\nmsgstr \"出口\"\n\n#. Key:\texplore_stations\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Explore more stations before using the railway system.\"\nmsgstr \"请在使用铁路系统之前探索更多的车站。\"\n\n#. Key:\tfinish_demo\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"teleport at the end of demo\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Finish Demo\"\nmsgstr \"完成试玩\"\n\n#. Key:\tfire\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"fires a cannon\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Fire\"\nmsgstr \"开火\"\n\n#. Key:\tgo_down\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"go down the stairs\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Go down\"\nmsgstr \"向下\"\n\n#. Key:\tgo_up\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"go up the stairs\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Go up\"\nmsgstr \"向上\"\n\n#. Key:\tinspect_fountain\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Inspect Fountain\"\nmsgstr \"检查喷泉\"\n\n#. Key:\tinventory\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"hint for hotkey to open the inventory\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Inventory\"\nmsgstr \"背包\"\n\n#. Key:\tkey_missing\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"{0} is the key name\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Key Missing: {0}\"\nmsgstr \"缺少的钥匙：{0}\"\n\n#. Key:\tkick_rope\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"a pile of rope can be kicked to be able to climb up/down on it\"\n#. climb up/down on it\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Kick Rope\"\nmsgstr \"踢绳索\"\n\n#. Key:\tlaboratory\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"examine/enter Laboratory\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Laboratory\"\nmsgstr \"实验室\"\n\n#. Key:\tlamps\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"examine Lamps\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Lamps\"\nmsgstr \"壁灯\"\n\n#. Key:\tleave\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"teleport - leave a room, chest, level\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Leave\"\nmsgstr \"离开\"\n\n#. Key:\tleave_bridge\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Leave Bridge\"\nmsgstr \"离开大桥\"\n\n#. Key:\tleave_cave\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Leave Cave\"\nmsgstr \"离开洞穴\"\n\n#. Key:\tleave_circle\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Leave Circle\"\nmsgstr \"离开圆环\"\n\n#. Key:\tleave_hut\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Leave Hut\"\nmsgstr \"离开小屋\"\n\n#. Key:\tleft_lever\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"use Left Lever\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Left Lever\"\nmsgstr \"左操纵杆\"\n\n#. Key:\tlever_is_active\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Lever activated. The crystal broke.\"\nmsgstr \"操纵杆激活。水晶破碎。\"\n\n#. Key:\tlever_is_inactive\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"a lever\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Seems to be inactive\"\nmsgstr \"似乎没有启动\"\n\n#. Key:\tmemory_stone_aquire\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Acquire Memory Stone\"\nmsgstr \"获取记忆之石\"\n\n#. Key:\tmemory_stone_gained\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Memory Stone Gained\"\nmsgstr \"记忆之石已获取\"\n\n#. Key:\tmiddle_lever\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"use Middle Lever \"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Middle Lever\"\nmsgstr \"中操纵杆\"\n\n#. Key:\tmoms_room\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"examine Mom's Room\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Mom's Room\"\nmsgstr \"母亲的房间\"\n\n#. Key:\tnotebook\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"examine Notebook\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Notebook\"\nmsgstr \"笔记本\"\n\n#. Key:\topen\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"door can be openned\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Open\"\nmsgstr \"打开\"\n\n#. Key:\topen_door\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Open Door\"\nmsgstr \"打开门\"\n\n#. Key:\tpainting\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"examine Painting\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Painting\"\nmsgstr \"绘画\"\n\n#. Key:\tpaintings\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"examine Paintings\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Paintings\"\nmsgstr \"绘画\"\n\n#. Key:\tpass_bridge\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Pass Bridge\"\nmsgstr \"过桥\"\n\n#. Key:\tpick_up\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"pick up box or carryable\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Pick Up\"\nmsgstr \"捡起\"\n\n#. Key:\tplace_rope\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Place Rope\"\nmsgstr \"把绳子\"\n\n#. Key:\tprimary_strike\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"hint with control key for strike 1 of the character\"\n#. character\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Primary Strike\"\nmsgstr \"常规攻击\"\n\n#. Key:\tpull\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"pull a lever\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Pull\"\nmsgstr \"拉\"\n\n#. Key:\tpull_lever\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Pull Lever\"\nmsgstr \"拉动操纵杆\"\n\n#. Key:\tpush\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"push a sphere shaped rock from the edge to break some stuff\"\n#. break some stuff\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Push\"\nmsgstr \"推\"\n\n#. Key:\tput_weapon_away\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"hint with control key to show how to put the weapon away\"\n#. weapon away\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Put Weapon Away\"\nmsgstr \"收起武器\"\n\n#. Key:\tread\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"interaction hint if the character can read a scroll or book\"\n#. scroll or book\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Read\"\nmsgstr \"阅读\"\n\n#. Key:\tread_dictionary\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Read Dictionary\"\nmsgstr \"阅读字典\"\n\n#. Key:\tread_symbols\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Read Symbols\"\nmsgstr \"读取符号\"\n\n#. Key:\trelease_keeper\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Release Keeper\"\nmsgstr \"释放守护者\"\n\n#. Key:\treplay_boss_fight\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"interaction hint to play a boss fight which was already won\"\n#. was already won\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Replay Boss Fight\"\nmsgstr \"重玩Boss战\"\n\n#. Key:\treset_portals\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"lever\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Reset Portals\"\nmsgstr \"重设传送门\"\n\n#. Key:\trest\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"rest near a checkpoint statue where character can sleep and change spells and listen to music\"\n#. can sleep and change spells and listen to music\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Rest\"\nmsgstr \"休息\"\n\n#. Key:\trestore\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"restore the HP\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Restore\"\nmsgstr \"恢复\"\n\n#. Key:\tright_lever\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"use Right Lever\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Right Lever\"\nmsgstr \"右操纵杆\"\n\n#. Key:\tring_bell\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"there is a bell the character has to use to start the conversation with a merchant\"\n#. start the conversation with a merchant\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Ring the bell\"\nmsgstr \"按铃\"\n\n#. Key:\trope_can_be_placed\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"A rope could be placed here\"\nmsgstr \"这里可以放置绳索\"\n\n#. Key:\trope_kicked\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"feedback on the kick rope action\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Rope kicked\"\nmsgstr \"绳索被踢走了\"\n\n#. Key:\trope_placed\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Rope placed\"\nmsgstr \"绳索已放置\"\n\n#. Key:\tsail\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"use ship for travel\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Sail\"\nmsgstr \"风帆\"\n\n#. Key:\tsoulkeeper_released\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Soulkeeper released\"\nmsgstr \"灵魂守护者已释放\"\n\n#. Key:\tspecial_strike\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"hint with control key for strike 2 of the character\"\n#. character\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Special Strike\"\nmsgstr \"特殊攻击\"\n\n#. Key:\tstairs\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"enter stairs\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Stairs\"\nmsgstr \"楼梯\"\n\n#. Key:\tstone_added\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"{0} is the stone amount, {1} is the stone name\"\n#. name\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"{0} {1} added to your bag!\"\nmsgstr \"{0}{1}添加至背包中!\"\n\n#. Key:\tstone_cant_carry\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"{0} is the stone name\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"You can't carry more {0}\"\nmsgstr \"你携带不了更多的{0}\"\n\n#. Key:\tstone_cant_store\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"{0} is the stone name\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"You don't have anything you could use to store {0}\"\nmsgstr \"你没有任何东西可以用来存储{0}\"\n\n#. Key:\tswing\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"Swings on the pole with the arms\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Swing\"\nmsgstr \"摇摆不定的\"\n\n#. Key:\tswitch_interact\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"Switch interact alternative,  between the two modes\"\n#. modes\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Switch\"\nmsgstr \"开关\"\n\n#. Key:\ttake\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"character can take an item\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Take\"\nmsgstr \"取走\"\n\n#. Key:\ttake_a_seat\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Take a seat\"\nmsgstr \"坐下\"\n\n#. Key:\ttake_abacus\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Take Abacus\"\nmsgstr \"取走算盘\"\n\n#. Key:\ttake_all\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Take All\"\nmsgstr \"取走所有物品\"\n\n#. Key:\ttake_axe\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"character can take a weapon\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Take Axe\"\nmsgstr \"取走斧子\"\n\n#. Key:\ttake_blades\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"character can take two swords to go dual wield\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Take Blades\"\nmsgstr \"取走刃剑\"\n\n#. Key:\ttake_books\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"character can take (two) books\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Take Books\"\nmsgstr \"取走书籍\"\n\n#. Key:\ttake_mace\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"character can take a weapon\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Take Mace\"\nmsgstr \"取走权杖\"\n\n#. Key:\ttake_mushrooms\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Take Mushrooms\"\nmsgstr \"取走蘑菇\"\n\n#. Key:\ttake_rope\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Take Rope\"\nmsgstr \"取走绳索\"\n\n#. Key:\ttake_sabre\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"character can take a weapon\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Take Sabre\"\nmsgstr \"取走军刀\"\n\n#. Key:\ttake_spellcaster\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"the Spellcaster is an amulet the character can use to cast spells\"\n#. use to cast spells\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Take Spellcaster\"\nmsgstr \"取走施法物\"\n\n#. Key:\ttake_stones\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Take Stones\"\nmsgstr \"取走石头\"\n\n#. Key:\ttake_sword\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"character can take a weapon\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Take Sword\"\nmsgstr \"取走宝剑\"\n\n#. Key:\ttake_wheel\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Take Wheel\"\nmsgstr \"取走轮子\"\n\n#. Key:\ttalk\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Talk\"\nmsgstr \"交谈\"\n\n#. Key:\ttoggle_switch\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"it is a lightswitch\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Toggle Switch\"\nmsgstr \"拨动开关\"\n\n#. Key:\ttouch_statue\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Touch Statue\"\nmsgstr \"触摸塑像\"\n\n#. Key:\ttravel\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"travel on the train station path\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Travel\"\nmsgstr \"旅行\"\n\n#. Key:\tunlocked_with\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"{0} is the key name\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Unlocked with {0}\"\nmsgstr \"用  {0} 解锁\"\n\n#. Key:\tuse\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"use device in EndFinal level\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Use\"\nmsgstr \"使用\"\n\n#. Key:\tuse_active_item\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"uses the active item\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Use Active Item\"\nmsgstr \"使用激活的物品\"\n\n#. Key:\tuse_crystal\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Use Crystal\"\nmsgstr \"使用水晶\"\n\n#. Key:\tuse_destroy_explained\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Destroy the device to save the creatures of Ruined Realm\"\nmsgstr \"摧毁这个装置来拯救毁灭王国的生物\"\n\n#. Key:\tuse_device\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Use Device\"\nmsgstr \"使用装置\"\n\n#. Key:\tuse_elevator\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Use Elevator\"\nmsgstr \"使用电梯\"\n\n#. Key:\tuse_elevator_gem\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Use Elevator Gem\"\nmsgstr \"使用电梯的宝石\"\n\n#. Key:\tuse_magic_mirror\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Use Magic Mirror\"\nmsgstr \"使用魔镜\"\n\n#. Key:\tuse_separate_explained\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Use the device to separate the Realms\"\nmsgstr \"使用这个装置将王国进行分离\"\n\n#. Key:\tuse_switch\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"for the moria gate\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Use switch\"\nmsgstr \"使用开关\"\n\n#. Key:\tuse_workshop\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Use Workshop\"\nmsgstr \"使用工坊\"\n\n#. Key:\twheel_release\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"release lever wheel\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Release\"\nmsgstr \"释放\"\n\n#. Key:\twheel_turn\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"turn lever wheel\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Turn\"\nmsgstr \"转\"\n\n#. Key:\twindow\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"examine Window\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Window\"\nmsgstr \"窗口\"\n\n#. Key:\tworkroom\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"examine/enter Workroom\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Workroom\"\nmsgstr \"工作室\"\n\n#. Key:\tyou_are_worthy\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"gate golem tutorial level message interaction\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"You are not worthy!\"\nmsgstr \"你不配!\"\n\n#. Key:\tice_stone_Name\n#. SourceLocation:\tLocalization/StringTables/Items.csv\n#: Localization/StringTables/Items.csv\nmsgctxt \"Items\"\nmsgid \"Ice Stone\"\nmsgstr \"冰石\"\n\n#. Key:\ttest_stone_name\n#. SourceLocation:\tLocalization/StringTables/Items.csv\n#: Localization/StringTables/Items.csv\nmsgctxt \"Items\"\nmsgid \"Test Stone\"\nmsgstr \"试炼之石\"\n\n#. Key:\tbook\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:494\n#: Source/SOrb/Basic/SoGameSingleton.cpp:494\nmsgctxt \"ItemsCommon\"\nmsgid \"Something to read\"\nmsgstr \"可读内容\"\n\n#. Key:\tcooldown\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:501\n#: Source/SOrb/Basic/SoGameSingleton.cpp:501\nmsgctxt \"ItemsCommon\"\nmsgid \"Cooldown\"\nmsgstr \"冷却\"\n\n#. Key:\tcrossbow\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:487\n#: Source/SOrb/Basic/SoGameSingleton.cpp:487\nmsgctxt \"ItemsCommon\"\nmsgid \"Something to shoot with\"\nmsgstr \"可以用来射击的东西\"\n\n#. Key:\tdefensive\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:472\n#: Source/SOrb/Basic/SoGameSingleton.cpp:472\nmsgctxt \"ItemsCommon\"\nmsgid \"Shard of Protection\"\nmsgstr \"保护碎片\"\n\n#. Key:\tdualwield\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:480\n#: Source/SOrb/Basic/SoGameSingleton.cpp:480\nmsgctxt \"ItemsCommon\"\nmsgid \"Dual Wield Weapon\"\nmsgstr \"双持武器\"\n\n#. Key:\thealth\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:498\n#: Source/SOrb/Basic/SoGameSingleton.cpp:498\nmsgctxt \"ItemsCommon\"\nmsgid \"Health\"\nmsgstr \"生命值\"\n\n#. Key:\tinvalid_shard_max\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:475\n#: Source/SOrb/Basic/SoGameSingleton.cpp:475\nmsgctxt \"ItemsCommon\"\nmsgid \"Invalid\"\nmsgstr \"无效的\"\n\n#. Key:\tinvalid_weapon_max\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:481\n#: Source/SOrb/Basic/SoGameSingleton.cpp:481\nmsgctxt \"ItemsCommon\"\nmsgid \"Invalid Weapon\"\nmsgstr \"无效武器\"\n\n#. Key:\titem\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:492\n#. Key:\tkeylikeitem\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:491\n#: Source/SOrb/Basic/SoGameSingleton.cpp:491\n#: Source/SOrb/Basic/SoGameSingleton.cpp:492\nmsgctxt \"ItemsCommon\"\nmsgid \"Something interesting\"\nmsgstr \"有趣的事物\"\n\n#. Key:\tjewelry\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:469\n#: Source/SOrb/Basic/SoGameSingleton.cpp:469\nmsgctxt \"ItemsCommon\"\nmsgid \"Valuable\"\nmsgstr \"有价值的\"\n\n#. Key:\tkey\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:466\n#: Source/SOrb/Basic/SoGameSingleton.cpp:466\nmsgctxt \"ItemsCommon\"\nmsgid \"Key\"\nmsgstr \"钥匙\"\n\n#. Key:\tMemoryStone\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:465\n#: Source/SOrb/Basic/SoGameSingleton.cpp:465\nmsgctxt \"ItemsCommon\"\nmsgid \"Memory Stone\"\nmsgstr \"记忆石\"\n\n#. Key:\toffensive\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:473\n#: Source/SOrb/Basic/SoGameSingleton.cpp:473\nmsgctxt \"ItemsCommon\"\nmsgid \"Shard of Justice\"\nmsgstr \"正义碎片\"\n\n#. Key:\tonehanded\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:478\n#: Source/SOrb/Basic/SoGameSingleton.cpp:478\nmsgctxt \"ItemsCommon\"\nmsgid \"One-Handed Weapon\"\nmsgstr \"单手武器\"\n\n#. Key:\tpotion\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:484\n#: Source/SOrb/Basic/SoGameSingleton.cpp:484\nmsgctxt \"ItemsCommon\"\nmsgid \"Something to drink\"\nmsgstr \"能喝的东西\"\n\n#. Key:\tQuestItem\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:464\n#: Source/SOrb/Basic/SoGameSingleton.cpp:464\nmsgctxt \"ItemsCommon\"\nmsgid \"Quest Item\"\nmsgstr \"任务物品\"\n\n#. Key:\tRuneStone\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:467\n#: Source/SOrb/Basic/SoGameSingleton.cpp:467\nmsgctxt \"ItemsCommon\"\nmsgid \"Runestone\"\nmsgstr \"符石\"\n\n#. Key:\tshard\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:462\n#: Source/SOrb/Basic/SoGameSingleton.cpp:462\nmsgctxt \"ItemsCommon\"\nmsgid \"Shard\"\nmsgstr \"碎片\"\n\n#. Key:\tsomething_unlock\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:490\n#: Source/SOrb/Basic/SoGameSingleton.cpp:490\nmsgctxt \"ItemsCommon\"\nmsgid \"Something to unlock with\"\nmsgstr \"可用来解锁的东西\"\n\n#. Key:\tspecial\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:474\n#: Source/SOrb/Basic/SoGameSingleton.cpp:474\nmsgctxt \"ItemsCommon\"\nmsgid \"Shard of Wonder\"\nmsgstr \"奇迹碎片\"\n\n#. Key:\tspeed\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:497\n#: Source/SOrb/Basic/SoGameSingleton.cpp:497\nmsgctxt \"ItemsCommon\"\nmsgid \"Attack Speed\"\nmsgstr \"攻击速度\"\n\n#. Key:\tspell\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:486\n#: Source/SOrb/Basic/SoGameSingleton.cpp:486\nmsgctxt \"ItemsCommon\"\nmsgid \"Something to cast with\"\nmsgstr \"可用来施法的东西\"\n\n#. Key:\tspellcapacitycost\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:499\n#: Source/SOrb/Basic/SoGameSingleton.cpp:499\nmsgctxt \"ItemsCommon\"\nmsgid \"Capacity Cost\"\nmsgstr \"能力消耗\"\n\n#. Key:\tspellusagecount\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:500\n#: Source/SOrb/Basic/SoGameSingleton.cpp:500\nmsgctxt \"ItemsCommon\"\nmsgid \"Charge\"\nmsgstr \"补给\"\n\n#. Key:\tthrowable\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:485\n#: Source/SOrb/Basic/SoGameSingleton.cpp:485\nmsgctxt \"ItemsCommon\"\nmsgid \"Something to throw\"\nmsgstr \"可扔的东西\"\n\n#. Key:\ttwohanded\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:479\n#: Source/SOrb/Basic/SoGameSingleton.cpp:479\nmsgctxt \"ItemsCommon\"\nmsgid \"Two-Handed Weapon\"\nmsgstr \"双手武器\"\n\n#. Key:\tusable\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:463\n#: Source/SOrb/Basic/SoGameSingleton.cpp:463\nmsgctxt \"ItemsCommon\"\nmsgid \"Usable\"\nmsgstr \"可用的\"\n\n#. Key:\tweapon\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:468\n#: Source/SOrb/Basic/SoGameSingleton.cpp:468\nmsgctxt \"ItemsCommon\"\nmsgid \"Weapon\"\nmsgstr \"武器\"\n\n#. Key:\tmus1_combat_1_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(6).MusicMap.DisplayName\n#. /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(6).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(6).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Disfunctional Golems\"\nmsgstr \"失效的机器人\"\n\n#. Key:\tmus1_combat_2_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(16).MusicMap.DisplayName\n#. /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(16).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(16).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Machine Rage\"\nmsgstr \"机器的愤怒\"\n\n#. Key:\tmus1_combat_GateKeeper_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(2).MusicMap.DisplayName\n#. /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(2).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(2).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Worthy\"\nmsgstr \"有价值的\"\n\n#. Key:\tmus1_dlg_Generic_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(7).MusicMap.DisplayName\n#. /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(7).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(7).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Unexpected Friend\"\nmsgstr \"意想不到的朋友\"\n\n#. Key:\tmus1_dlg_Golem_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(9).MusicMap.DisplayName\n#. /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(9).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(9).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Duty\"\nmsgstr \"责任\"\n\n#. Key:\tmus1_dlg_Lory_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(8).MusicMap.DisplayName\n#. /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(8).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(8).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"The other Bell\"\nmsgstr \"另一只钟\"\n\n#. Key:\tmus1_dlg_Monk_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(10).MusicMap.DisplayName\n#. /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(10).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(10).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Enlightened Mind\"\nmsgstr \"开明的思想\"\n\n#. Key:\tmus1_dlg_Raven_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(11).MusicMap.DisplayName\n#. /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(11).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(11).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Winged Wisdom\"\nmsgstr \"长翅膀的智者\"\n\n#. Key:\tmus1_dlg_SewerCreature_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(32).MusicMap.DisplayName\n#. /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(32).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(32).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Pipe Walkers\"\nmsgstr \"管道行走者\"\n\n#. Key:\tmus1_dlg_Teachy_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(12).MusicMap.DisplayName\n#. /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(12).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(12).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Just a bit crazy\"\nmsgstr \"有点疯狂\"\n\n#. Key:\tmus1_env_AncientArcade_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(1).MusicMap.DisplayName\n#. /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(1).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(1).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Remnant Colors\"\nmsgstr \"剩余的颜色\"\n\n#. Key:\tmus1_env_GreyGate_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(5).MusicMap.DisplayName\n#. /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(5).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(5).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Touch of Ruin\"\nmsgstr \"毁灭之触\"\n\n#. Key:\tmus1_env_SecondArcade_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(17).MusicMap.DisplayName\n#. /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(17).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(17).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"In Memoriam\"\nmsgstr \"悼念\"\n\n#. Key:\tmus1_env_TutorialLevel_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(3).MusicMap.DisplayName\n#. /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(3).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(3).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Sunken Sewer\"\nmsgstr \"沉没的下水道\"\n\n#. Key:\tmus2_combat_catacombs_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(18).MusicMap.DisplayName\n#. /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(18).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(18).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Armours of the Deep\"\nmsgstr \"深处的铠甲\"\n\n#. Key:\tmus2_combat_DwarvenBoss_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(19).MusicMap.DisplayName\n#. /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(19).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(19).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"I hold it back\"\nmsgstr \"我忍住了\"\n\n#. Key:\tmus2_combat_LavaBoss_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(20).MusicMap.DisplayName\n#. /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(20).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(20).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Meant to be Perfect\"\nmsgstr \"注定完美\"\n\n#. Key:\tmus2_combat_WrackedWaterpath_2_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(22).MusicMap.DisplayName\n#. /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(22).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(22).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Wracked Warriors\"\nmsgstr \"受尽折磨的勇士\"\n\n#. Key:\tmus2_combat_WrackedWaterpath_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(21).MusicMap.DisplayName\n#. /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(21).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(21).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Those who survived\"\nmsgstr \"那些幸存者们\"\n\n#. Key:\tmus2_combat_WWBoss_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(23).MusicMap.DisplayName\n#. /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(23).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(23).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"No price too high\"\nmsgstr \"价格再高也不过分\"\n\n#. Key:\tmus2_dlg_Gnory_Fishy_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(33).MusicMap.DisplayName\n#. /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(33).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(33).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Intelligence and Wisdom\"\nmsgstr \"聪明才智\"\n\n#. Key:\tmus2_dlg_GolemMaker_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(34).MusicMap.DisplayName\n#. /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(34).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(34).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Lost Memories\"\nmsgstr \"失去的记忆\"\n\n#. Key:\tmus2_dlg_MerchAnt_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(35).MusicMap.DisplayName\n#. /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(35).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(35).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Small but Tiny\"\nmsgstr \"迷你般的小\"\n\n#. Key:\tmus2_dlg_SupperDwarf_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(36).MusicMap.DisplayName\n#. /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(36).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(36).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Supper time\"\nmsgstr \"晚餐时间\"\n\n#. Key:\tmus2_env_Catacombs_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(24).MusicMap.DisplayName\n#. /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(24).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(24).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Dwarven Catacombs\"\nmsgstr \"矮人地下墓穴\"\n\n#. Key:\tmus2_env_CrossroadCave_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(25).MusicMap.DisplayName\n#. /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(25).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(25).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Railway Station\"\nmsgstr \"火车站\"\n\n#. Key:\tmus2_env_DwarvenGate_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(26).MusicMap.DisplayName\n#. /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(26).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(26).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Sanctuary of Law\"\nmsgstr \"律法庇护\"\n\n#. Key:\tmus2_env_DwarvenOutpost_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(27).MusicMap.DisplayName\n#. /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(27).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(27).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Where the rail leads\"\nmsgstr \"铁轨通向何方\"\n\n#. Key:\tmus2_env_Kobold_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(15).MusicMap.DisplayName\n#. /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(15).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(15).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Last of his Tribe\"\nmsgstr \"他的最后一个部落\"\n\n#. Key:\tmus2_env_LavaDeep_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(28).MusicMap.DisplayName\n#. /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(28).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(28).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Temple for the Ancestors\"\nmsgstr \"先祖庙\"\n\n#. Key:\tmus2_env_LavaEntrance_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(29).MusicMap.DisplayName\n#. /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(29).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(29).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Pilgrim Road\"\nmsgstr \"朝圣者之路\"\n\n#. Key:\tmus2_env_WrackedWaterpath_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(30).MusicMap.DisplayName\n#. /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(30).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(30).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Quick and Clever\"\nmsgstr \"又快又敏捷\"\n\n#. Key:\tmus3_combat_Bubble_Ground_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(14).MusicMap.DisplayName\n#. /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(14).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(14).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Infected Golems\"\nmsgstr \"受感染的机器人\"\n\n#. Key:\tmus3_env_BubbleGround_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(38).MusicMap.DisplayName\n#. /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(38).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(38).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"So close yet so far\"\nmsgstr \"如此近却又如此远\"\n\n#. Key:\tmus3_env_CaveHouse_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(39).MusicMap.DisplayName\n#. /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(39).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(39).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Last Shalter\"\nmsgstr \"最后的碎片\"\n\n#. Key:\tmus3_env_PipePuzzle_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(40).MusicMap.DisplayName\n#. /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(40).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(40).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Moving Pipes\"\nmsgstr \"移动管道\"\n\n#. Key:\tmus3_env_Raven_Puzzle_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(41).MusicMap.DisplayName\n#. /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(41).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(41).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"One would fail\"\nmsgstr \"注定失败\"\n\n#. Key:\tmus3_env_RuinedRealm_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(42).MusicMap.DisplayName\n#. /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(42).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(42).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"The end, really\"\nmsgstr \"最后，真的\"\n\n#. Key:\tmus_chase_theme_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(4).MusicMap.DisplayName\n#. /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(4).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(4).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Jump for your life!\"\nmsgstr \"为你的生命一跃而下！\"\n\n#. Key:\tmus_cm_WhiteWall_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(13).MusicMap.DisplayName\n#. /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(13).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(13).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Decaying City\"\nmsgstr \"腐烂的城市\"\n\n#. Key:\tmus_ending_dlg_UnknownWizard_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(37).MusicMap.DisplayName\n#. /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(37).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(37).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"All is lost\"\nmsgstr \"一切都失去了\"\n\n#. Key:\tmus_main_theme_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(0).MusicMap.DisplayName\n#. /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(0).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(0).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Spirit of the Unknown\"\nmsgstr \"未知的精神\"\n\n#. Key:\tmus_waterpath_alter_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(43).MusicMap.DisplayName\n#. /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(43).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(43).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Stories never end\"\nmsgstr \"故事永远不会结束\"\n\n#. Key:\tblocked\n#. SourceLocation:\tLocalization/StringTables/Spells.csv\n#. InfoMetaData:\t\"Comment\" : \" displayed as floating test ingame when a certain enemy blocks certain attacks\"\n#. certain enemy blocks certain attacks\"\n#: Localization/StringTables/Spells.csv\nmsgctxt \"Spells\"\nmsgid \"Blocked\"\nmsgstr \"锁定的\"\n\n#. Key:\tcant_use_in_air\n#. SourceLocation:\tLocalization/StringTables/Spells.csv\n#. InfoMetaData:\t\"Comment\" : \" displayed as floating test ingame when the character tries to use a spell in air which can not be used there\"\n#. character tries to use a spell in air which can not be used there\"\n#: Localization/StringTables/Spells.csv\nmsgctxt \"Spells\"\nmsgid \"Can't in air\"\nmsgstr \"不能在空中\"\n\n#. Key:\tcant_use_sk_free_zone\n#. SourceLocation:\tLocalization/StringTables/Spells.csv\n#. InfoMetaData:\t\"Comment\" : \" displayed as floating test ingame when character tries to use the respawn point spell on a location when it is not allowed\"\n#. character tries to use the respawn point spell on a location when it is not\n#. allowed\"\n#: Localization/StringTables/Spells.csv\nmsgctxt \"Spells\"\nmsgid \"Dangerous Location\"\nmsgstr \"危险的位置\"\n\n#. Key:\thp_gained\n#. SourceLocation:\tLocalization/StringTables/Spells.csv\n#. InfoMetaData:\t\"Comment\" : \" displayed as floating test ingame when the character increases his max health\"\n#. character increases his max health\"\n#: Localization/StringTables/Spells.csv\nmsgctxt \"Spells\"\nmsgid \"Health Increased!\"\nmsgstr \"生命值提升了！\"\n\n#. Key:\timmune\n#. SourceLocation:\tLocalization/StringTables/Spells.csv\n#. InfoMetaData:\t\"Comment\" : \"displayed as floating text ingame if enemy is immune to a spell or damage type\"\n#. immune to a spell or damage type\"\n#: Localization/StringTables/Spells.csv\nmsgctxt \"Spells\"\nmsgid \"Immune\"\nmsgstr \"免疫\"\n\n#. Key:\tinfected\n#. SourceLocation:\tLocalization/StringTables/Spells.csv\n#. InfoMetaData:\t\"Comment\" : \" displayed as floating test ingame when dmg over time effect is applied on enemy\"\n#. over time effect is applied on enemy\"\n#: Localization/StringTables/Spells.csv\nmsgctxt \"Spells\"\nmsgid \"Infected\"\nmsgstr \"被感染的\"\n\n#. Key:\tinstant_recharge\n#. SourceLocation:\tLocalization/StringTables/Spells.csv\n#. InfoMetaData:\t\"Comment\" : \" displayed as floating test ingame when a spell can be used again without waiting for the cooldown time\"\n#. spell can be used again without waiting for the cooldown time\"\n#: Localization/StringTables/Spells.csv\nmsgctxt \"Spells\"\nmsgid \"Instant Recharge\"\nmsgstr \"即时充能\"\n\n#. Key:\tmissing_target\n#. SourceLocation:\tLocalization/StringTables/Spells.csv\n#. InfoMetaData:\t\"Comment\" : \" displayed as floating test ingame when the character tries to use a spell which requires a target but there is none in range\"\n#. character tries to use a spell which requires a target but there is none in\n#. range\"\n#: Localization/StringTables/Spells.csv\nmsgctxt \"Spells\"\nmsgid \"Who? Where? What?!\"\nmsgstr \"是谁？在哪儿？什么？！\"\n\n#. Key:\tno_need_for_heal\n#. SourceLocation:\tLocalization/StringTables/Spells.csv\n#. InfoMetaData:\t\"Comment\" : \" displayed as floating test ingame when the character tries to use heal spell but has max health already\"\n#. character tries to use heal spell but has max health already\"\n#: Localization/StringTables/Spells.csv\nmsgctxt \"Spells\"\nmsgid \"No need\"\nmsgstr \"不需要\"\n\n#. Key:\tresisted\n#. SourceLocation:\tLocalization/StringTables/Spells.csv\n#. InfoMetaData:\t\"Comment\" : \"displayed as floating text ingame if enemy has a chance to avoid an effect and he is lucky\"\n#. a chance to avoid an effect and he is lucky\"\n#: Localization/StringTables/Spells.csv\nmsgctxt \"Spells\"\nmsgid \"Resisted\"\nmsgstr \"反抗的\"\n\n#. Key:\tsecond_chance\n#. SourceLocation:\tLocalization/StringTables/Spells.csv\n#. InfoMetaData:\t\"Comment\" : \" displayed as floating test ingame if char has the effect on and dies and respawns because the effect saves him\"\n#. the effect on and dies and respawns because the effect saves him\"\n#: Localization/StringTables/Spells.csv\nmsgctxt \"Spells\"\nmsgid \"Second Chance\"\nmsgstr \"第二次机会\"\n\n#. Key:\tspell_capacity_gained\n#. SourceLocation:\tLocalization/StringTables/Spells.csv\n#. InfoMetaData:\t\"Comment\" : \" displayed as floating test ingame when the character increases his spellpower\"\n#. character increases his spellpower\"\n#: Localization/StringTables/Spells.csv\nmsgctxt \"Spells\"\nmsgid \"Spellpower Increased!\"\nmsgstr \"法力增强！\"\n\n#. Key:\tspell_regained\n#. SourceLocation:\tLocalization/StringTables/Spells.csv\n#. InfoMetaData:\t\"Comment\" : \" displayed as floating test ingame when the character regains a spell (can cast again)\"\n#. character regains a spell (can cast again)\"\n#: Localization/StringTables/Spells.csv\nmsgctxt \"Spells\"\nmsgid \"Spell Charge Regained!\"\nmsgstr \"法术充能恢复！\"\n\n#. Key:\tacknowledge\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Button\"\n#. Key:\tgroup_defeated_ack\n#. InfoMetaData:\t\"Comment\" : \"the hotkey to close the group defeated panel\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Acknowledge\"\nmsgstr \"确认\"\n\n#. Key:\tback\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Button\"\n#. Key:\tpanel_command_inv_back\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Back\"\nmsgstr \"返回\"\n\n#. Key:\tblack_fade_teleport_text_1\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Now I remember the night when it started...\"\nmsgstr \"现在我还记得事情开始的那个晚上……\"\n\n#. Key:\tbubble_float\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"bubble tip for the char to float\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Float\"\nmsgstr \"漂浮\"\n\n#. Key:\tbubble_jump\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"bubble tip for the char to jump\"\n#. Key:\tinput_jump\n#. InfoMetaData:\t\"Comment\" : \"Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Jump\"\nmsgstr \"跳\"\n\n#. Key:\tbuy\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"buy item\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Buy\"\nmsgstr \"买\"\n\n#. Key:\tbuy_back\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"buy back item\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Buy Back\"\nmsgstr \"买回\"\n\n#. Key:\tbuy_on_steam_and_follow\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Buy WarriOrb in Steam and follow us on social media:\"\nmsgstr \"在Steam中购买WarriOrb并在社交媒体上关注我们：\"\n\n#. Key:\tcancel\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Confirm popup\"\n#. Key:\tsettings_cancel\n#. InfoMetaData:\t\"Comment\" : \"Settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Cancel\"\nmsgstr \"取消\"\n\n#. Key:\tchange_user\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Change User\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Change User\"\nmsgstr \"变更使用者\"\n\n#. Key:\tchapter\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Stats for saves\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Chapter\"\nmsgstr \"章节\"\n\n#. Key:\tchapter1_completed\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Temporary for chapter 1\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Chapter 1 completed. Save is Locked.\"\nmsgstr \"章节 1 已完成。存档已锁定。\"\n\n#. Key:\tcharacter_skin_classic\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"name of the original character skin\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Classic\"\nmsgstr \"经典\"\n\n#. Key:\tcharacter_skin_desc\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"description for the character skin option\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Changes the visuals of the player character\"\nmsgstr \"改变玩家角色的视觉效果\"\n\n#. Key:\tcharacter_skin_mummy\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"name of the alternative character skin\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Mummy\"\nmsgstr \"木乃伊\"\n\n#. Key:\tcharacter_skin_pumpkin\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"name of the alternative character skin\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Pumpkin\"\nmsgstr \"南瓜\"\n\n#. Key:\tcharacter_skin_title\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"option to change character skin\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Character Skin\"\nmsgstr \"角色皮肤\"\n\n#. Key:\tcheckpoint\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Stats for saves\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Checkpoint\"\nmsgstr \"关卡\"\n\n#. Key:\tchest_examine\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Examine\"\nmsgstr \"查看\"\n\n#. Key:\tchest_leave\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Leave\"\nmsgstr \"离开\"\n\n#. Key:\tchest_loot\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"hotkey tip on chest\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Loot\"\nmsgstr \"拾取\"\n\n#. Key:\tclose\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"close book\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Close\"\nmsgstr \"关闭\"\n\n#. Key:\tcompleted_in_time\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Custom Map\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Completed in {time}\"\nmsgstr \"在{time}内完成\"\n\n#. Key:\tconfirm\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Confirm popup\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Confirm\"\nmsgstr \"确定\"\n\n#. Key:\tconfirm_keyboard_settings_reset\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Confirm keyboard settings\"\n#. Key:\tdifficulty_confirm_question\n#. InfoMetaData:\t\"Comment\" : \"Confirm difficulty selected popup\"\n#. Key:\tsave_slots_remove_confirm\n#. InfoMetaData:\t\"Comment\" : \"remove save slot confirm dialogue\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Are you sure?\"\nmsgstr \"你确定?\"\n\n#. Key:\tconsole_ps4\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"PlayStation 4\"\nmsgstr \"PlayStation 4\"\n\n#. Key:\tconsole_switch\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Switch\"\nmsgstr \"Switch\"\n\n#. Key:\tconsole_xbox_one\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"XBox One\"\nmsgstr \"XBox One\"\n\n#. Key:\tcontinue\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Menu Continue\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Continue\"\nmsgstr \"继续\"\n\n#. Key:\tcontroller_recommended\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Main Menu\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Note: Playing with a controller is recommended\"\nmsgstr \"注意：推荐使用手柄进行游戏\"\n\n#. Key:\tcredits\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Menu credits\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Credits\"\nmsgstr \"制作名单\"\n\n#. Key:\tcustom_map_x\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Custom Map\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Custom Map {0}\"\nmsgstr \"自定义地图 {0}\"\n\n#. Key:\tcustom_maps\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Menu custom Maps\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Custom Maps\"\nmsgstr \"自定义地图\"\n\n#. Key:\tdescription\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Of something\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Description\"\nmsgstr \"描述\"\n\n#. Key:\tdifficulty\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Stats for saves\"\n#. Key:\tdifficulty_title\n#. InfoMetaData:\t\"Comment\" : \"title of difficulty selection\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Difficulty\"\nmsgstr \"难度\"\n\n#. Key:\tdifficulty_confirm_subtext\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Confirm difficulty selected popup subtext\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"This choice is permanent\"\nmsgstr \"选择将永久生效\"\n\n#. Key:\tdifficulty_desc_insane\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"description of hard difficulty\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"- The <Blue>SoulKeeper</> (Portable Checkpoint) spell is removed from the game\\n- Increased incoming damage\\n- Increased Enemy Health\"\nmsgstr \"- <Blue>灵魂守护者</> (检查点) 将被移除。\\n- 增加受到的伤害\\n- 增加敌人的生命值\"\n\n#. Key:\tdifficulty_desc_intended\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"description of normal difficulty\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"The way the game is meant to be played\"\nmsgstr \"原汁原味\"\n\n#. Key:\tdifficulty_desc_sane\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"description of easy difficulty\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"- Infinite <Blue>SoulKeeper</> (Checkpoint) spell charges\\n- No health penalty when respawning near the <Blue>SoulKeeper</>\\n- Decreased incoming damage\\n- Decreased Enemy Health\"\nmsgstr \"- 无限 <Blue>灵魂守护者</> (检查点)\\n- 在<Blue>灵魂守护者</>附近重生不会受到生命惩罚\\n- 减少受到的伤害\\n- 减少敌人的生命值\"\n\n#. Key:\tdifficulty_insane\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"name of hard difficulty\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"As hard as it can get\"\nmsgstr \"疯狂\"\n\n#. Key:\tdifficulty_intended\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"name of normal difficulty\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"A true challenge\"\nmsgstr \"普通\"\n\n#. Key:\tdifficulty_normal\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Normal\"\nmsgstr \"普通\"\n\n#. Key:\tdifficulty_sane\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"name of easy difficulty\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Just an adventure\"\nmsgstr \"简单\"\n\n#. Key:\tdisabled\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Widget is disabled\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Disabled\"\nmsgstr \"失效的\"\n\n#. Key:\tdiscord\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Discord\"\nmsgstr \"Discord\"\n\n#. Key:\tdrm_defeatead_description\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"check only in pirated copies \"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"We suspect that you play a pirated copy of the game.\\nIt's fine. We hope you will enjoy it!\\n\\nIf you like the game, please tell your friends about it, and maybe even consider buying it.\\n\\nWe would love to keep making games!\"\nmsgstr \"我们检测到您玩的可能是盗版。\\n没关系。我们希望游戏能给您到来快乐!\\n\\n如果您喜欢这个游戏，非常希望您能介绍给您的朋友，或者考虑购买正版。\\n\\n我们愿意继续将游戏做得更好!\"\n\n#. Key:\tdrm_defeatead_title\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"check only in pirated copies \"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"WarriOrb DRM\"\nmsgstr \"WarriOrb DRM\"\n\n#. Key:\tdwarf_language\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Dwarf language\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Dwarf\"\nmsgstr \"矮人语\"\n\n#. Key:\tempty\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Empty\"\nmsgstr \"空\"\n\n#. Key:\tempty_line\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"-\"\nmsgstr \"-\"\n\n#. Key:\tencourage_line1\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Before Main Menu\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"The path ahead is challenging. Do not despise failure. Every wrong attempt discarded is another step forward.\"\nmsgstr \"前方的道路充满挑战。不要害怕失败。每一次挫折都会让你更进一步。\"\n\n#. Key:\tessence\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"essence represents the Health of the character\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Essence\"\nmsgstr \"精华\"\n\n#. Key:\tfeedback\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Discord external button\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Feedback\"\nmsgstr \"反馈\"\n\n#. Key:\tgame_defeated\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"end screen\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Game Defeated!\"\nmsgstr \"游戏结束\"\n\n#. Key:\tgame_is_wip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Main Menu\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Game currently under development\"\nmsgstr \"游戏目前正在开发中\"\n\n#. Key:\tgame_over_retreat\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"control tip which is only visible in boss areas where the player can either restart the fight or retreat from the place\"\n#. areas where the player can either restart the fight or retreat from the\n#. place\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Retreat\"\nmsgstr \"撤回\"\n\n#. Key:\tgame_over_retry\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"control tip which is always visible on game over\"\n#. over\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Retry\"\nmsgstr \"重试\"\n\n#. Key:\tgamepad_special_left_xbox\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"xbox view button\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"View button\"\nmsgstr \"“视图”按钮\"\n\n#. Key:\tgamepad_special_right_xbox\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"xbox Menu button\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Menu button\"\nmsgstr \"“菜单”按钮\"\n\n#. Key:\tgo_back_to_menu\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Go back to main menu\"\nmsgstr \"返回主菜单\"\n\n#. Key:\tgold_x\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"{x} is the gold amount\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"+{x} GOLD\"\nmsgstr \"+{x}金币\"\n\n#. Key:\tgroup_defeated_title\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"title of the group defeated panel\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Group Defeated\"\nmsgstr \"击败的敌人\"\n\n#. Key:\tinput_action_back\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"UI Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"UI Action Back\"\nmsgstr \"界面行动 返回\"\n\n#. Key:\tinput_action_first\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"UI Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"UI Action First\"\nmsgstr \"界面行动 顺序一\"\n\n#. Key:\tinput_action_second\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"UI Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"UI Action Second\"\nmsgstr \"界面动作 顺序二\"\n\n#. Key:\tinput_action_third\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"UI Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"UI Action Third\"\nmsgstr \"界面动作 顺序三\"\n\n#. Key:\tinput_actions_conflicts\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input remap.  {Key} = key display name. {NumAction} the number of actions, this will determine what to choose between one and other.\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Selected button = {Key}, will get unbound from the {NumActions}|plural(one=Action,other=Actions) = {ActionNames}\"\nmsgstr \"被选中的按钮= {Key}, 将不受{NumActions}|plural(one=Action,other=Actions) = {ActionNames}的约束\"\n\n#. Key:\tinput_alt_interact\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Interact Alternative\"\nmsgstr \"替代交互\"\n\n#. Key:\tinput_change_item\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input Action Name\"\n#. Key:\tpanel_command_inv_change_item\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Change Item\"\nmsgstr \"切换物品\"\n\n#. Key:\tinput_change_spell\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Change Spell\"\nmsgstr \"切换法术\"\n\n#. Key:\tinput_change_weapon\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Change Weapon\"\nmsgstr \"切换武器\"\n\n#. Key:\tinput_down\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"UI Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"UI Move Down\"\nmsgstr \"界面向下移动\"\n\n#. Key:\tinput_float\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Floating\"\nmsgstr \"漂浮的\"\n\n#. Key:\tinput_interact\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Interact\"\nmsgstr \"交互\"\n\n#. Key:\tinput_left\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Move Left\"\nmsgstr \"向左移动\"\n\n#. Key:\tinput_menu_back\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"UI Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Open Menu/Escape/Back\"\nmsgstr \"打开菜单/逃跑/返回\"\n\n#. Key:\tinput_not_allowed_options_menu_button\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input remap gamepad\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Not allowed to remap to the Menu button\"\nmsgstr \"不允许重新映射到“菜单”按钮\"\n\n#. Key:\tinput_not_allowed_options_menu_button_switch\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input remap gamepad\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Not allowed to remap to the + Button\"\nmsgstr \"不允许重新映射到“+键”按钮\"\n\n#. Key:\tinput_not_allowed_thumbsticks\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input remap gamepad\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Not allowed to remap to thumbsticks\"\nmsgstr \"不允许重新映射到摇杆\"\n\n#. Key:\tinput_not_allowed_thumbsticks_switch\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input remap gamepad switch\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Not allowed to remap to Left Stick or Right Stick\"\nmsgstr \"不允许重新映射到摇杆\"\n\n#. Key:\tinput_open_inventory\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Open Inventory\"\nmsgstr \"打开物品栏\"\n\n#. Key:\tinput_right\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Move Right\"\nmsgstr \"向右移动\"\n\n#. Key:\tinput_roll\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Roll\"\nmsgstr \"滚动\"\n\n#. Key:\tinput_selected_key_not_allowed\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input remap. {Key} = key display name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Selected button = {Key}, is not allowed as an input option\"\nmsgstr \"被选中的按钮 = {Key}，不允许作为输入选项\"\n\n#. Key:\tinput_spell_down\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"UI Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"UI Spell Down\"\nmsgstr \"界面 法术向下\"\n\n#. Key:\tinput_spell_left\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"UI Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"UI Spell Left\"\nmsgstr \"界面 法术向左\"\n\n#. Key:\tinput_spell_right\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"UI Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"UI Spell Right\"\nmsgstr \"界面 法术向右\"\n\n#. Key:\tinput_spell_select\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"UI Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"UI Spell Select\"\nmsgstr \"界面 法术选择\"\n\n#. Key:\tinput_spell_select_and_cast\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"UI Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"UI Spell Select & Cast\"\nmsgstr \"界面 法术选择 & 施放\"\n\n#. Key:\tinput_spell_up\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"UI Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"UI Spell Up\"\nmsgstr \"界面 法术向上\"\n\n#. Key:\tinput_strike_primary\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Primary Strike\"\nmsgstr \"常规攻击\"\n\n#. Key:\tinput_strike_special\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Special Strike\"\nmsgstr \"特殊袭击\"\n\n#. Key:\tinput_take_weapon\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Take Weapon Away\"\nmsgstr \"拾取武器\"\n\n#. Key:\tinput_top_left\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"UI Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"UI Top Left\"\nmsgstr \"界面左上角\"\n\n#. Key:\tinput_top_right\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"UI Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"UI Top Right\"\nmsgstr \"界面右上角\"\n\n#. Key:\tinput_unbound\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Unbound input\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Unbound\"\nmsgstr \"自由的\"\n\n#. Key:\tinput_up\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"UI Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"UI Move Up\"\nmsgstr \"界面向上移动\"\n\n#. Key:\tinput_use_item\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Use Item\"\nmsgstr \"使用物品\"\n\n#. Key:\tinventory_item_amount\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"the item amount displayed in inventory/trade panel/etc.\"\n#. panel/etc.\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Amount: {0}\"\nmsgstr \"数量：{0}\"\n\n#. Key:\tinventory_item_tooltip_cooldown\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Cooldown\"\nmsgstr \"冷却\"\n\n#. Key:\tinventory_item_tooltip_damage\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"damage text on item descriptions\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Damage\"\nmsgstr \"伤害\"\n\n#. Key:\tinventory_item_tooltip_sec\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"duration of something (e.g. cooldown)\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"{0} sec\"\nmsgstr \"{0} 秒\"\n\n#. Key:\titem_equipped\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Item Tooltip\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"---Equipped---\"\nmsgstr \"---装备的---\"\n\n#. Key:\titem_not_For_sale\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Item Tooltip\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Not for sale\"\nmsgstr \"非卖品\"\n\n#. Key:\titem_rarity_0\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"item rarity text on the bottom of tooltips\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Better than nothing, right?\"\nmsgstr \"总比一无所获好吧？\"\n\n#. Key:\titem_rarity_1\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"item rarity text on the bottom of tooltips\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Better than nothing\"\nmsgstr \"有胜于无\"\n\n#. Key:\titem_rarity_2\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"item rarity text on the bottom of tooltips\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Good stuff\"\nmsgstr \"好东西\"\n\n#. Key:\titem_rarity_3\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"item rarity text on the bottom of tooltips\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Pretty good stuff\"\nmsgstr \"优质的东西\"\n\n#. Key:\titem_rarity_4\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"item rarity text on the bottom of tooltips\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Amazing stuff\"\nmsgstr \"令人惊叹的东西\"\n\n#. Key:\tkey_selection_current\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Select Input key\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Currently selected button:\"\nmsgstr \"当前选中的按钮：\"\n\n#. Key:\tkey_selection_empty\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Select Input key\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"[Empty Button]\"\nmsgstr \"空钮\"\n\n#. Key:\tkey_selection_press\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Select Input key\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"[Press Button]\"\nmsgstr \"[按下按钮]\"\n\n#. Key:\tkey_selection_press_button\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Select Input key\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Press the button you want to assign to the action:\"\nmsgstr \"按下你想分配的行动按钮：\"\n\n#. Key:\tline_three_dots\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"...\"\nmsgstr \"...\"\n\n#. Key:\tloading_screen_press_key\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Press any key to continue...\"\nmsgstr \"按任意键继续...\"\n\n#. Key:\tloading_screen_press_key_switch\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Press any button to continue...\"\nmsgstr \"按任意按钮继续...\"\n\n#. Key:\tloading_screen_text_1\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"This is a loading screen. We wait a few seconds here to look more professional.\"\nmsgstr \"这是一个加载中的显示。我们需要在此处等待几秒以展示我们的专业度。\"\n\n#. Key:\tmailing_list\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Mailing List\"\nmsgstr \"邮箱列表\"\n\n#. Key:\tnever_completed\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Custom Map\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Never completed\"\nmsgstr \"从未完成\"\n\n#. Key:\tno\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Confirm popup\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"No\"\nmsgstr \"否\"\n\n#. Key:\tpanel_character_sheet\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Character Panel\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Character Sheet\"\nmsgstr \"角色表\"\n\n#. Key:\tpanel_command_inv_compare\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Compare\"\nmsgstr \"比较\"\n\n#. Key:\tpanel_command_inv_drink\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Drink\"\nmsgstr \"喝\"\n\n#. Key:\tpanel_command_inv_equip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"control key tip in inventory\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Equip\"\nmsgstr \"装备\"\n\n#. Key:\tpanel_command_inv_equip_item\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Equip Item\"\nmsgstr \"装备物品\"\n\n#. Key:\tpanel_command_inv_equip_next\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Equip Next\"\nmsgstr \"装备下一个\"\n\n#. Key:\tpanel_command_inv_read\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Read\"\nmsgstr \"阅读\"\n\n#. Key:\tpanel_command_inv_unequip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Unequip\"\nmsgstr \"卸下\"\n\n#. Key:\tpanel_command_spell_add\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"add spell to equipped spells\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Add\"\nmsgstr \"增加\"\n\n#. Key:\tpanel_command_spell_remove\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"remove spell from equipped spells\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Remove\"\nmsgstr \"移除\"\n\n#. Key:\tpanel_equipped_spells\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Spell Selection panel\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Equipped Spells\"\nmsgstr \"装备的法术\"\n\n#. Key:\tpanel_inventory\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Character Panel\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Inventory\"\nmsgstr \"物品栏\"\n\n#. Key:\tpanel_notes\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Character Panel\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Sidenotes\"\nmsgstr \"旁注\"\n\n#. Key:\tpaneL_resistances\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Character Sheet Panel\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Resistances\"\nmsgstr \"抗性\"\n\n#. Key:\tpanel_rest_no_item\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"You don't have the necessary item to use spells!\"\nmsgstr \"你没有使用法术的必需品！\"\n\n#. Key:\tpanel_rest_option_change_spells\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Change Spells\"\nmsgstr \"切换法术\"\n\n#. Key:\tpanel_rest_option_listen_to_music\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Listen to Music\"\nmsgstr \"听音乐\"\n\n#. Key:\tpanel_rest_option_sleep\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Sleep\"\nmsgstr \"睡觉\"\n\n#. Key:\tpanel_rest_option_wake_up\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Wake Up\"\nmsgstr \"醒来\"\n\n#. Key:\tpanel_spell_capacity\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Spell Selection panel\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Capacity: {0}/{1}\"\nmsgstr \"能力: {0}/{1}\"\n\n#. Key:\tpanel_spell_selection_denied\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Spell Selection panel\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"You can only change the equipped spells near ancient statues.\"\nmsgstr \"你只能改变古代雕像附近的装备法术。\"\n\n#. Key:\tpanel_spells\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Character Panel\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Spells\"\nmsgstr \"法术\"\n\n#. Key:\tpercentage_argument\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Slider\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"{0}%\"\nmsgstr \"{0}%\"\n\n#. Key:\tplay_time\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Stats for saves\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Play Time\"\nmsgstr \"游戏时间\"\n\n#. Key:\tprogress_saved\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Confirm Quit popup\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Progress will be saved\"\nmsgstr \"进度将保存\"\n\n#. Key:\tprogress_saved_automatically\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Before Main Menu\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Your progress is saved automatically whenever this icon is displayed\"\nmsgstr \"每当显示此图标时，说明进度已经自动保存\"\n\n#. Key:\tquit_game\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Menu Quit Game\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Quit Game\"\nmsgstr \"退出游戏\"\n\n#. Key:\tquit_game_question\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Confirm Quit popup\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Quit Game?\"\nmsgstr \"确定退出游戏？\"\n\n#. Key:\tquit_to_menu\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Menu Quit To Menu\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Quit to Menu\"\nmsgstr \"退出到菜单\"\n\n#. Key:\tquit_to_menu_question\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Confirm Quit popup\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Quit to Menu?\"\nmsgstr \"确定退出到菜单？\"\n\n#. Key:\treset_keyboard_arrows\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Confirm keyboard settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Reset to Arrow defaults\"\nmsgstr \"重置为箭头默认值\"\n\n#. Key:\treset_keyboard_wasd\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Confirm keyboard settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Reset to WASD defaults\"\nmsgstr \"重置为WASD默认值\"\n\n#. Key:\trestart\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Restart the game\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Restart\"\nmsgstr \"重新开始\"\n\n#. Key:\trestart_game_question\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Confirm Restart popup\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Restart Game?\"\nmsgstr \"重新开始游戏？\"\n\n#. Key:\trestart_game_warning\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Confirm Restart popup\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"All progress will be lost\"\nmsgstr \"所有的进度都将丢失\"\n\n#. Key:\tsave_slots_clear\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"clears the save slot\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Clear\"\nmsgstr \"完成\"\n\n#. Key:\tsave_slots_loaded\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"text on currently loaded save slot if there is any\"\n#. any\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"- Loaded -\"\nmsgstr \"-已加载-\"\n\n#. Key:\tsave_slots_new_game\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"text on empty save slot\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"New Game\"\nmsgstr \"新游戏\"\n\n#. Key:\tsave_slots_playtime\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"playtime displayed, {0} is the hours, {1} is the minutes\"\n#. the minutes\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"{0} H {1} M\"\nmsgstr \"{0} H {1} M\"\n\n#. Key:\tsave_slots_playtime_short\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"playtime displayed if it did not reach an hour, {0} is the time in minutes\"\n#. hour, {0} is the time in minutes\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"{0} M\"\nmsgstr \"{0}M\"\n\n#. Key:\tsave_slots_remove_confirm_subtext\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"remove save slot confirm dialogue\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Progress will be lost\"\nmsgstr \"进度将丢失\"\n\n#. Key:\tsave_slots_select\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"loads the game or creates a new one using the active slot\"\n#. Key:\tselect\n#. InfoMetaData:\t\"Comment\" : \"Button\"\n#. Key:\tspell_cast_switch_select\n#. active slot\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Select\"\nmsgstr \"选择\"\n\n#. Key:\tsaves\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Menu saves\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Save Slots\"\nmsgstr \"存档\"\n\n#. Key:\tseconds\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"seconds\"\nmsgstr \"秒\"\n\n#. Key:\tselect_spells\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input right  thumbstick\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Select spells\"\nmsgstr \"选择法术\"\n\n#. Key:\tsell\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"sell item\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Sell\"\nmsgstr \"出售\"\n\n#. Key:\tsend_automatically\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Analytics popup\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Send Automatically\"\nmsgstr \"自动发送\"\n\n#. Key:\tsend_no\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Analytics popup\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Do not Send\"\nmsgstr \"不发送\"\n\n#. Key:\tsettings\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Menu settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Settings\"\nmsgstr \"设置\"\n\n#. Key:\tsettings_antialising\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Anti-Aliasing\"\nmsgstr \"抗锯齿\"\n\n#. Key:\tsettings_antialising_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Smooths out the edges by blending the colors of the pixels around the object to create the illusion of smoothness.\"\nmsgstr \"通过混合对象周围像素的颜色来平滑边缘，以创建平滑感。\"\n\n#. Key:\tsettings_apply\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Apply\"\nmsgstr \"应用\"\n\n#. Key:\tsettings_aspect_ratio\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Aspect Ratio\"\nmsgstr \"屏幕比例\"\n\n#. Key:\tsettings_aspect_ratio_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Defines what aspect ratios are available for your resolution.\"\nmsgstr \"根据你的屏幕分辨率决定纵横比例。\"\n\n#. Key:\tsettings_audio\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Settings panels\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Audio\"\nmsgstr \"声音\"\n\n#. Key:\tsettings_auto_detect_controller\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Gamepad settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Auto detect Gamepad Layout\"\nmsgstr \"自动检测手柄布局\"\n\n#. Key:\tsettings_borderless\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Borderless\"\nmsgstr \"无边框\"\n\n#. Key:\tsettings_brightness\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Settings panels\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Brightness\"\nmsgstr \"亮度\"\n\n#. Key:\tsettings_brightness_default_value\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Brightness settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Default Value is 100%\"\nmsgstr \"默认值为100%\"\n\n#. Key:\tsettings_brightness_description\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Brightness settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Please adjust the brightness of the game to your display\"\nmsgstr \"请调整游戏的亮度\"\n\n#. Key:\tsettings_collect_analytics\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Game Settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Collect Usage Statistics\"\nmsgstr \"收集使用情况统计信息\"\n\n#. Key:\tsettings_collect_analytics_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Game Settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"These are not used to identify individuals, but help us to understand players needs to improve our game.\"\nmsgstr \"这些不是用来纪录各种信息的，而是帮助我们理解玩家需要以便改进我们的游戏。\"\n\n#. Key:\tsettings_confirm_display_title\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings confirm\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Confirm Display Settings in\"\nmsgstr \"确认显示设置\"\n\n#. Key:\tsettings_controller\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Settings panels\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Gamepad\"\nmsgstr \"手柄\"\n\n#. Key:\tsettings_controller_platform\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Gamepad Layout settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Layout\"\nmsgstr \"布局\"\n\n#. Key:\tsettings_controller_remap\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Gamepad settings\"\n#. Key:\tsettings_controller_remap_single\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Remap Controls\"\nmsgstr \"重新映射控制器\"\n\n#. Key:\tsettings_controller_remap_noedit\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Gamepad settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Please use a gamepad in order to remap\"\nmsgstr \"请使用游戏手柄重新映射\"\n\n#. Key:\tsettings_controller_switch\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Settings panels\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Controls\"\nmsgstr \"控制项\"\n\n#. Key:\tsettings_display\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Settings panels\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Display\"\nmsgstr \"显示\"\n\n#. Key:\tsettings_display_damage\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Game settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Display Damage\"\nmsgstr \"显示伤害\"\n\n#. Key:\tsettings_display_damage_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Game settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Show damage as a floating number on the screen\"\nmsgstr \"在屏幕上以浮动数字显示伤害\"\n\n#. Key:\tsettings_display_enemy_hp\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Game settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Display Enemy Health\"\nmsgstr \"显示敌人的生命值\"\n\n#. Key:\tsettings_display_enemy_hp_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Game settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Show a small health bar above injured enemies\"\nmsgstr \"在受伤的敌人上方显示一个小的生命条\"\n\n#. Key:\tsettings_display_floating_vo\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Game settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Display Floating Voice Lines\"\nmsgstr \"显示浮动语音线路\"\n\n#. Key:\tsettings_display_floating_vo_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Game settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Show voice lines as floating texts\"\nmsgstr \"将语音线显示为浮动文本\"\n\n#. Key:\tsettings_display_fps\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Game settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Display FPS\"\nmsgstr \"显示帧\"\n\n#. Key:\tsettings_display_fps_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Game settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Show FPS counter\"\nmsgstr \"显示帧数\"\n\n#. Key:\tsettings_display_mode\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Display Mode\"\nmsgstr \"显示方式\"\n\n#. Key:\tsettings_display_mode_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"In Windowed mode you can interact with other windows easier. In Borderless mode you can quickly switch between applications.\"\nmsgstr \"在窗口模式下，我去可以更容易地与其他窗口交互。在无边框模式下，你可以在应用程序之间快速切换。\"\n\n#. Key:\tsettings_display_play_time\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Game settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Display Play Time\"\nmsgstr \"显示游戏时间\"\n\n#. Key:\tsettings_display_play_time_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Game settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Show current play time\"\nmsgstr \"显示当前游戏时间\"\n\n#. Key:\tsettings_effects\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Effect Quality\"\nmsgstr \"影响质量\"\n\n#. Key:\tsettings_effects_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Affects the quality of particles in the world, a lower quality might make some projectiles in the world harder to see.\"\nmsgstr \"此修改将影响游戏画面的粒子质量，较低的质量可能会使游戏展的一些抛射体更难被看到。\"\n\n#. Key:\tsettings_effects_volume\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Audio settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Sound Effects volume\"\nmsgstr \"音效音量\"\n\n#. Key:\tsettings_effects_volume_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Audio settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Adjust the sound effects volume\"\nmsgstr \"调整音效音量\"\n\n#. Key:\tsettings_force_weak_hardware_opt\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Additional Optimizations\"\nmsgstr \"其他优化\"\n\n#. Key:\tsettings_force_weak_hardware_opt_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"In certain areas background traps are deactivated or background visuals look cheaper to gain more performance.\"\nmsgstr \"取消某些区域背景或调低背景视觉效果，以获得更多的性能。\"\n\n#. Key:\tsettings_fps_unlimited\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings frame limit\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Unlimited\"\nmsgstr \"无限制\"\n\n#. Key:\tsettings_frame_limit\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Frame Limit (FPS)\"\nmsgstr \"框架限制(FPS)\"\n\n#. Key:\tsettings_frame_limit_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Limit the maximum frame rate for a consistent experience.\"\nmsgstr \"限制最大帧速率以获得最流畅的体验。\"\n\n#. Key:\tsettings_fullscreen\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Fullscreen\"\nmsgstr \"全屏\"\n\n#. Key:\tsettings_game\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Settings panels\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Game\"\nmsgstr \"游戏\"\n\n#. Key:\tsettings_game_speed\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Game settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Game Speed\"\nmsgstr \"游戏速度\"\n\n#. Key:\tsettings_game_speed_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Game settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Changes the speed of the game.\\nHigher speed might make the game have lower FPS.\"\nmsgstr \"调整游戏速度\\n更高的游戏速度可能会导致FPS降低\"\n\n#. Key:\tsettings_gamepad_vibration\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Gamepad Vibration intensity settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Vibration\"\nmsgstr \"振动\"\n\n#. Key:\tsettings_keyboard\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Settings panels\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Keyboard\"\nmsgstr \"键盘\"\n\n#. Key:\tsettings_keyboard_remap_noedit\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Keyboard Settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Please use a keyboard in order to change the keyboard input\"\nmsgstr \"请使用键盘来更改键盘输入\"\n\n#. Key:\tsettings_language\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Game settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Language\"\nmsgstr \"语言\"\n\n#. Key:\tsettings_language_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Game settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Change the display and locale (numbers, dates) language\"\nmsgstr \"更改显示和语言环境(数字、日期)\"\n\n#. Key:\tsettings_master_volume\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Audio settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Master volume\"\nmsgstr \"主音量\"\n\n#. Key:\tsettings_master_volume_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Audio settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Adjust the master volume\"\nmsgstr \"调节主音量\"\n\n#. Key:\tsettings_merciful_bounce\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"game settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Merciful Bounce Mode\"\nmsgstr \"仁慈的跳跳模式\"\n\n#. Key:\tsettings_merciful_bounce_always\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"defines when (in which difficulty mode) is the easier bounce mode active\"\n#. easier bounce mode active\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Always\"\nmsgstr \"经常\"\n\n#. Key:\tsettings_merciful_bounce_never\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"defines when (in which difficulty mode) is the easier bounce mode active\"\n#. easier bounce mode active\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Never\"\nmsgstr \"从不\"\n\n#. Key:\tsettings_merciful_bounce_on_easy\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"defines when (in which difficulty mode) is the easier bounce mode active\"\n#. easier bounce mode active\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"On Easy\"\nmsgstr \"在简单模式下\"\n\n#. Key:\tsettings_merciful_bounce_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"tooltip for Merciful Bounce Mode option\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Allows Higher Bounce even if the Jump button is pressed after the character hits the ground\"\nmsgstr \"在角色触地后按下跳跃按钮依然可以弹跳地更高\"\n\n#. Key:\tsettings_move_left_right\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Move left/right\"\nmsgstr \"向左/向右移动\"\n\n#. Key:\tsettings_music_volume\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Audio settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Music volume\"\nmsgstr \"音乐音量\"\n\n#. Key:\tsettings_music_volume_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Audio settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Adjust the music volume\"\nmsgstr \"调整音乐音量\"\n\n#. Key:\tsettings_mute_audio\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Audio settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Mute audio\"\nmsgstr \"静音\"\n\n#. Key:\tsettings_mute_audio_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Audio settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Mute all audio\"\nmsgstr \"关闭所有音频\"\n\n#. Key:\tsettings_mute_audio_unfocused\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Audio settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Mute audio when in background\"\nmsgstr \"调到后台时静默所有声音\"\n\n#. Key:\tsettings_mute_audio_unfocused_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Audio settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Mute the audio when the game window is not in focus\"\nmsgstr \"当游戏窗口不清晰时将音频静音\"\n\n#. Key:\tsettings_mute_dialogue_voice\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Audio settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Mute voices in dialogues\"\nmsgstr \"静默对话中的声音\"\n\n#. Key:\tsettings_mute_dialogue_voice_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Audio settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Mute the gibberish voices inside the dialogues\"\nmsgstr \"把对话中胡言乱语的声音消除\"\n\n#. Key:\tsettings_mute_voice\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Audio settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Mute voices outside of dialogues\"\nmsgstr \"静默对话外的声音\"\n\n#. Key:\tsettings_mute_voice_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Audio settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Mute the gibberish voices outside the dialogues\"\nmsgstr \"把对话外胡言乱语的声音消除\"\n\n#. Key:\tsettings_pause_game_idle\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Game settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Pause game when idle\"\nmsgstr \"空闲时暂停游戏\"\n\n#. Key:\tsettings_pause_game_idle_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Game settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Pauses the game when the user is idle for a certain amount of minutes\"\nmsgstr \"当用户空闲一定时间时即暂停游戏\"\n\n#. Key:\tsettings_pause_game_unfocused\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Game settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Pause game when unfocused\"\nmsgstr \"游戏失焦时暂停游戏\"\n\n#. Key:\tsettings_pause_game_unfocused_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Game settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Pauses the game when the game loses focus\"\nmsgstr \"当游戏失焦时暂停游戏\"\n\n#. Key:\tsettings_post_effects\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Post-Effects\"\nmsgstr \"后置效应\"\n\n#. Key:\tsettings_post_effects_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Affects the quality of the post process effects after the scene is rendered.\"\nmsgstr \"它会影响场景渲染后的后期效果的质量。\"\n\n#. Key:\tsettings_quality_epic\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings quality\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Epic\"\nmsgstr \"极致\"\n\n#. Key:\tsettings_quality_high\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings quality\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"High\"\nmsgstr \"高\"\n\n#. Key:\tsettings_quality_low\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings quality\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Low\"\nmsgstr \"低\"\n\n#. Key:\tsettings_quality_medium\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings quality\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Medium\"\nmsgstr \"中\"\n\n#. Key:\tsettings_ratio_16_10\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings Aspect Ratio\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"16:10\"\nmsgstr \"16:10\"\n\n#. Key:\tsettings_ratio_16_9\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings Aspect Ratio\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"16:9\"\nmsgstr \"16:9\"\n\n#. Key:\tsettings_ratio_4_3\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings Aspect Ratio\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"4:3\"\nmsgstr \"4:3\"\n\n#. Key:\tsettings_reset\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Reset\"\nmsgstr \"重置\"\n\n#. Key:\tsettings_reset_default\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Settings reset to default\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Reset to Defaults\"\nmsgstr \"重置为默认值\"\n\n#. Key:\tsettings_reset_input_key\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input reset key to default\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Reset button to default\"\nmsgstr \"重置按钮为默认值\"\n\n#. Key:\tsettings_resolution\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Resolution\"\nmsgstr \"分辨率\"\n\n#. Key:\tsettings_resolution_entry\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings. {0} - x, {1} - Y\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"{0}x{1}\"\nmsgstr \"{0}x{1}\"\n\n#. Key:\tsettings_resolution_scale\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Resolution Scale\"\nmsgstr \"分辨率\"\n\n#. Key:\tsettings_resolution_scale_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"The desired resolution to use when rendering the game. It does not affect the UI.\\nLowering it improves performance on lower end machines.\"\nmsgstr \"渲染游戏时所需的分辨率。它不影响UI。\\n降低它可以提高低端机器的性能。\"\n\n#. Key:\tsettings_resolution_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Allows changing the Screen Resolution.\"\nmsgstr \"允许改变屏幕分辨率。\"\n\n#. Key:\tsettings_select_another\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Settings input\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Select another\"\nmsgstr \"选另一个\"\n\n#. Key:\tsettings_shadows\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Shadow Quality\"\nmsgstr \"阴影质量\"\n\n#. Key:\tsettings_shadows_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"The higher the quality the finer the shadow.\"\nmsgstr \"质量越高，阴影越细。\"\n\n#. Key:\tsettings_textures\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Texture Quality\"\nmsgstr \"纹理质量\"\n\n#. Key:\tsettings_textures_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Surfaces of the game world will increase in fidelity if the setting is higher.\"\nmsgstr \"此项设置越高，游戏世界越真实。\"\n\n#. Key:\tsettings_unknown\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Unknown\"\nmsgstr \"未知\"\n\n#. Key:\tsettings_volumetric_fog\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Volumetric Fog\"\nmsgstr \"体积雾\"\n\n#. Key:\tsettings_volumetric_fog_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Realistic looking fog. Has a high performance impact, disable it to improve performance.\"\nmsgstr \"雾状效果具有较高的性能影响，禁用它可以提高性能。\"\n\n#. Key:\tsettings_vsync\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Vertical Sync\"\nmsgstr \"垂直同步\"\n\n#. Key:\tsettings_vsync_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Synchronize the game refresh rate with the monitor refresh rate. Disable it for higher framerate and better input response.\\nWhen enabled it prevents screen tearing.\"\nmsgstr \"将游戏刷新率与显示器刷新率同步。禁用它可以获得更高的帧率和更好的输入响应。\\n当启用时，它可以防止画面撕裂感。\"\n\n#. Key:\tsettings_windowed\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Windowed\"\nmsgstr \"窗口化\"\n\n#. Key:\tskip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"text near the press and hold to skip confirmation button\"\n#. confirmation button\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Skip\"\nmsgstr \"跳过\"\n\n#. Key:\tspell_cast_switch_controls\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Quick select spells up/down/left/right\"\nmsgstr \"快速选择法术向上/向下/向左/向右\"\n\n#. Key:\tspell_cast_switch_select_cast\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Select & Cast\"\nmsgstr \"选择 & 施放\"\n\n#. Key:\tspell_cooldown_stops_in_air\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Spell\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Cooldown only starts on ground\"\nmsgstr \"冷却只从地面开始计算\"\n\n#. Key:\tspell_only_in_air\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Spell\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Can not be used in air\"\nmsgstr \"不能在空中使用\"\n\n#. Key:\tspell_restricted\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Spell\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Can not be used in restricted areas\"\nmsgstr \"不能在某些禁区内使用\"\n\n#. Key:\tstart\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"The name of the checkpoint. Custom Map action\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Start\"\nmsgstr \"开始\"\n\n#. Key:\tstart_game\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Menu Start Game\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Start Game\"\nmsgstr \"开始游戏\"\n\n#. Key:\tstats_usage_description\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Analytics popup\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Not Yet would like to collect usage statistics from your game automatically.\\nThese are not used to identify individuals, but help us to understand players needs to improve our game.\\n\\nSelect \\\"Send Automatically\\\" to allow collection of usage statistics,\\nor \\\"Do Not Send\\\" to prevent the game from sending information to Not Yet.\\n\\nYou can change this setting at any time via the Settings Game tab.\"\nmsgstr \"尚未开始自动收集您游戏时的使用数据。\\n这些不是用来识别个人，而是帮助我们理解玩家需要改进我们的游戏。\\n选择“自动发送”，允许收集使用统计数据，\\n或“不发送”，防止游戏发送个人数据信息。\\n您可以随时通过设置游戏选项卡更改此设置。\"\n\n#. Key:\tstats_usage_title\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Analytics popup\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Usage Statistics\"\nmsgstr \"使用数据\"\n\n#. Key:\tstatus\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Status of a save/custom map\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Status\"\nmsgstr \"状态\"\n\n#. Key:\tsteam_main_game\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Wishlist\"\nmsgstr \"愿望单\"\n\n#. Key:\tsteam_main_game_buy\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Buy Full Game\"\nmsgstr \"Buy Full Game\"\n\n#. Key:\tSwitch_FaceButton_Bottom\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"B Button\"\nmsgstr \"B键\"\n\n#. Key:\tSwitch_FaceButton_Left\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Y Button\"\nmsgstr \"Y键\"\n\n#. Key:\tSwitch_FaceButton_Right\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"A Button\"\nmsgstr \"A键\"\n\n#. Key:\tSwitch_FaceButton_Top\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"X Button\"\nmsgstr \"X键\"\n\n#. Key:\tSwitch_Gamepad_LeftStick_Down\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \" Switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Left Stick Down\"\nmsgstr \"L摇杆 - 下\"\n\n#. Key:\tSwitch_Gamepad_LeftStick_Left\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \" Switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Left Stick Left\"\nmsgstr \"L摇杆 - 左\"\n\n#. Key:\tSwitch_Gamepad_LeftStick_Right\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \" Switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Left Stick Right\"\nmsgstr \"L摇杆 - 右\"\n\n#. Key:\tSwitch_Gamepad_LeftStick_Up\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \" Switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Left Stick Up\"\nmsgstr \"L摇杆 - 上\"\n\n#. Key:\tSwitch_Gamepad_RightStick_Down\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \" Switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Right Stick Down\"\nmsgstr \"R摇杆 - 下\"\n\n#. Key:\tSwitch_Gamepad_RightStick_Left\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \" Switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Right Stick Left\"\nmsgstr \"R摇杆 - 左\"\n\n#. Key:\tSwitch_Gamepad_RightStick_Right\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \" Switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Right Stick Right\"\nmsgstr \"R摇杆 - 右\"\n\n#. Key:\tSwitch_Gamepad_RightStick_Up\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \" Switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Right Stick Up\"\nmsgstr \"R摇杆 - 上\"\n\n#. Key:\tSwitch_LeftThumbstick\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \" Switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Left Stick\"\nmsgstr \"L摇杆\"\n\n#. Key:\tSwitch_RightThumbstick\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \" Switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Right Stick\"\nmsgstr \"R摇杆\"\n\n#. Key:\tSwitch_Shoulder_Left\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"L Button\"\nmsgstr \"L键\"\n\n#. Key:\tSwitch_Shoulder_Right\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"R Button\"\nmsgstr \"R键\"\n\n#. Key:\tSwitch_special_dpad_down\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \" Switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Down Button\"\nmsgstr \"下键\"\n\n#. Key:\tSwitch_special_dpad_left\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \" Switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Left Button\"\nmsgstr \"左键\"\n\n#. Key:\tSwitch_special_dpad_right\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \" Switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Right Button\"\nmsgstr \"右键\"\n\n#. Key:\tSwitch_special_dpad_up\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \" Switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Up Button\"\nmsgstr \"上键\"\n\n#. Key:\tSwitch_special_left\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"- Button\"\nmsgstr \"-键\"\n\n#. Key:\tSwitch_special_right\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"+ Button\"\nmsgstr \"+键\"\n\n#. Key:\tSwitch_Trigger_Left\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"ZL Button\"\nmsgstr \"ZL键\"\n\n#. Key:\tSwitch_Trigger_Right\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"ZR Button\"\nmsgstr \"ZR键\"\n\n#. Key:\tteleport_to_cp\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Menu Teleport To Checkpoint\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Teleport To Checkpoint\"\nmsgstr \"传送至关卡\"\n\n#. Key:\tteleport_to_sk\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Menu Teleport to Soulkeeper\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Teleport To SoulKeeper\"\nmsgstr \"传送至灵魂守护者\"\n\n#. Key:\tthank_you_prologue\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"THANK YOU FOR PLAYING WARRIORB DEMO PROLOGUE, WE HOPE YOU HAD A GREAT TIME!\"\nmsgstr \"感谢试玩《球魂》序章，希望你喜欢这个游戏！\"\n\n#. Key:\ttotal_deaths\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Stats for saves\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Total Deaths\"\nmsgstr \"总计死亡数\"\n\n#. Key:\ttrade_amount_x_x\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"trade confirmation UI. {0} is the current amount and {1} is the current amount times price per item\"\n#. amount and {1} is the current amount times price per item\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"{0} for {1} gold\"\nmsgstr \"{0}表示{1}金币\"\n\n#. Key:\ttrade_buy\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"trade confirmation UI\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Are you sure you want to buy {ItemName} for {Gold} gold?\"\nmsgstr \"您确定要用{Gold}金币购买{ItemName}吗?\"\n\n#. Key:\ttrade_buy_back\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"trade confirmation UI\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Are you sure you want to buy back {ItemName} for {Gold} gold?\"\nmsgstr \"您确定要以{Gold}金币换回{ItemName}吗?\"\n\n#. Key:\ttrade_no_intrested\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"trade confirmation UI\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"The trader is not interested in buying that item from you!\"\nmsgstr \"商人没有兴趣从你那里买东西!\"\n\n#. Key:\ttrade_nope\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"trade confirmation UI\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Nope!\"\nmsgstr \"不!\"\n\n#. Key:\ttrade_okay\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"trade confirmation UI\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Okay...\"\nmsgstr \"好吧……\"\n\n#. Key:\ttrade_sell\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"trade confirmation UI\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Are you sure you want to sell {ItemName} for {Gold} gold?\"\nmsgstr \"您确定要将{ItemName}以{Gold}金币出售吗?\"\n\n#. Key:\ttwitter\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Twitter\"\nmsgstr \"Twitter\"\n\n#. Key:\tunknown\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Unknown input binding\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"UNKNOWN\"\nmsgstr \"未知\"\n\n#. Key:\twarriorb\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"WarriOrb\"\nmsgstr \"球魂\"\n\n#. Key:\txp\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Experience Points\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"XP\"\nmsgstr \"经验值\"\n\n#. Key:\tyes\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Confirm popup\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Yes\"\nmsgstr \"是\"\n\n"
  },
  {
    "path": "Content/Localization/WarriorbDemo/zh-Hant/WarriorbDemo.po",
    "content": "﻿# WarriorbDemo Chinese (Traditional) translation.\n# Copyright 1998-2019 Epic Games, Inc. All Rights Reserved.\n# \nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: WarriorbDemo\\n\"\n\"POT-Creation-Date: 2020-10-07 08:08\\n\"\n\"PO-Revision-Date: 2020-10-07 08:08\\n\"\n\"Language-Team: \\n\"\n\"Language: zh-Hant\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Plural-Forms: nplurals=1; plural=0;\\n\"\n\n#. Key:\tact1_loading\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"You are a Mighty Spirit from the Unknown Realm. You were torn away from your home by a pathetic mortal Wizard. After a magical accident your essence is bound to an unlikely body. Find a way out of your ball-body prison!\"\nmsgstr \"妳是壹個來自未知領域的強大靈魂。被壹個卑微的家夥從家裏帶走。壹次神奇的意外將妳的靈魂被束縛在壹個不可思議的軀體裏。快想個辦法將自己從這個球狀的監獄裏解脫出來!\"\n\n#. Key:\tact2_loading\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Reaching Crossroad Cave you are a step closer to the Three Artifacts - and to freedom.\"\nmsgstr \"到達十字路口的洞穴意味著離這三件古物又近了壹步——也離自由更近了壹步。\"\n\n#. Key:\tact3_loading\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Finding the Three Artifacts required all your skills and strength. You hope that delivering them to the Wizard will be less difficult.\"\nmsgstr \"找到這三件工藝品需要實力和技能。你希望完成這件事不會太困難。\"\n\n#. Key:\tact_1\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"text displayed on black screen the first time a chapter is started\"\n#. a chapter is started\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Act I\"\nmsgstr \"第壹章\"\n\n#. Key:\tact_2\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"text displayed on black screen the first time a chapter is started\"\n#. a chapter is started\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Act II\"\nmsgstr \"第二章\"\n\n#. Key:\tact_3\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"text displayed on black screen the first time a chapter is started\"\n#. a chapter is started\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Act III\"\nmsgstr \"第三章\"\n\n#. Key:\tancient_arcade\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an area\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Ancient Arcade\"\nmsgstr \"古代回廊\"\n\n#. Key:\tbubble_border\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an area\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Bubble Border\"\nmsgstr \"泡沫邊境\"\n\n#. Key:\tcerulean_city\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an area\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Cerulean City\"\nmsgstr \"蔚藍之城\"\n\n#. Key:\tchasm_chamber\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an area\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Chasm Chamber\"\nmsgstr \"裂痕之間\"\n\n#. Key:\tcrossroad_cave\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an area\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Crossroad Cave\"\nmsgstr \"十字洞穴\"\n\n#. Key:\tdarkest_dungeon\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an area\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Darkest Dungeon\"\nmsgstr \"黑暗地牢\"\n\n#. Key:\tdwarven_dungeons\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an area\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Dwarven Dungeons\"\nmsgstr \"矮人地城\"\n\n#. Key:\tending_loading\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Finally! You did your part of the deal, now it's the Wizard's turn to get you back home.\"\nmsgstr \"終於!妳完成了妳的任務，現在輪到巫師帶妳回家了。\"\n\n#. Key:\tepilogue\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"text displayed on black screen the first time a chapter is started\"\n#. a chapter is started\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Epilogue\"\nmsgstr \"後記\"\n\n#. Key:\tgrey_gate\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an area\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Grey Gate\"\nmsgstr \"灰暗之門\"\n\n#. Key:\thallowed_heart\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an area, Hallowed as in made holy; consecrated.\"\n#. consecrated.\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Hallowed Heart\"\nmsgstr \"神聖之心\"\n\n#. Key:\tintro_subtitle_0\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" intro subtitle line 1\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"I wish I could just... turn back time to undo what I have done.\"\nmsgstr \"我希望我能…讓時間倒流，來撤銷我所做的壹切。\"\n\n#. Key:\tintro_subtitle_1\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" intro subtitle line 01\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"However the past is behind us\"\nmsgstr \"但是過去已經過去了\"\n\n#. Key:\tintro_subtitle_2\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" intro subtitle line 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"and all I can change now\"\nmsgstr \"所有我能改變的\"\n\n#. Key:\tintro_subtitle_3\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" intro subtitle line 3\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"is the future.\"\nmsgstr \"只有未來。\"\n\n#. Key:\tlast_land\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an area\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Last Land\"\nmsgstr \"最後的土地\"\n\n#. Key:\tlava_lair\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an area\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Lava Lair\"\nmsgstr \"熔巖巢穴\"\n\n#. Key:\tloading_tip_act1_0\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 1\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"In Ball form you go faster.\"\nmsgstr \"球形態會使妳跑得更快。\"\n\n#. Key:\tloading_tip_act1_1\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 1\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"In Ball form you bounce back when you hit a surface.\"\nmsgstr \"當妳以球形態碰撞壹個地面或墻面時，會反彈回來。\"\n\n#. Key:\tloading_tip_act1_2\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 1\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Each weapon has its own unique special strike.\"\nmsgstr \"每種武器都有自己獨特的打擊方式。\"\n\n#. Key:\tloading_tip_act1_3\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 1\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Most of the people died after Ruin happened, but there are still some survivors.\"\nmsgstr \"雖然有些人在廢墟中死去，但仍有壹些幸存者。\"\n\n#. Key:\tloading_tip_act1_4\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 1\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Some items can’t be used but merchants still like to buy them.\"\nmsgstr \"有些物品雖然不能使用，但商人們喜歡收購它們。\"\n\n#. Key:\tloading_tip_act1_5\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 1\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"There are many keys, and when I say many, I mean it.\"\nmsgstr \"鑰匙數量很多，當我說很多的時候，我是認真的。\"\n\n#. Key:\tloading_tip_act1_6\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 1\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"When you find an item it would make sense to check what it is, wouldn’t it?\"\nmsgstr \"每當妳找到壹樣新的物品時，最好先看看是做什麽用的!\"\n\n#. Key:\tloading_tip_act1_7\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 1\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Spells can make combat easier.\"\nmsgstr \"法術可以使戰鬥變得更容易。\"\n\n#. Key:\tloading_tip_act1_8\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 1\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Dying often is absolutely normal. If you don’t die a lot, you are doing something wrong.\"\nmsgstr \"死亡是絕對正常的。如果妳死得不多，那妳壹定是某個地方做錯了。\"\n\n#. Key:\tloading_tip_act1_9\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 1\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"You can always check the Sidenotes in your Inventory to see if you have any side quests.\"\nmsgstr \"時不時翻翻妳包裏的筆記本，看看是否有支線任務要完成。\"\n\n#. Key:\tloading_tip_act2_0\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Using the Railway can shorten your journey.\"\nmsgstr \"坐火車可以縮短妳的路程。\"\n\n#. Key:\tloading_tip_act2_1\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"We’ll try to make our next game without any loading screens, we promise...\"\nmsgstr \"我們努力讓我們的下壹個遊戲沒有任何加載畫面，保證……\"\n\n#. Key:\tloading_tip_act2_2\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Choosing the right weapon against a Boss will make your life easier.\"\nmsgstr \"選擇正確的武器對付BOSS會讓妳的生活變得更容易。\"\n\n#. Key:\tloading_tip_act2_3\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Don’t forget to use the Soulkeeper!\"\nmsgstr \"別忘了使用靈魂守護者!\"\n\n#. Key:\tloading_tip_act2_4\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Finding the Artefacts might be hard, but this is your only chance to get out.\"\nmsgstr \"找到這些工藝品會很艱難，但這是妳唯壹的機會。\"\n\n#. Key:\tloading_tip_act2_5\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Talk to any Survivor if you can. They might be able to help you.\"\nmsgstr \"多和幸存者談談。他們也許能幫助妳。\"\n\n#. Key:\tloading_tip_act2_6\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"If you find an area too difficult you can always go to another area first.\"\nmsgstr \"如果妳發現壹個地方太難，可以先去另壹個地方試試。\"\n\n#. Key:\tloading_tip_act2_7\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Don’t forget to spend your gold! (Ad sponsored by Gnory)\"\nmsgstr \"別忘了花光妳的金子!(此條由格諾裏贊助)\"\n\n#. Key:\tloading_tip_act2_8\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Equipping the right items will make the combat easier.\"\nmsgstr \"裝備正確的物品將使戰鬥更容易。\"\n\n#. Key:\tloading_tip_act2_9\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"If you manage to defeat every member of a group you won’t have to fight them ever again.\"\nmsgstr \"如果妳能打敗團隊中的每壹個成員，妳就不用再和他們戰鬥了。\"\n\n#. Key:\tloading_tip_act3_0\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 3\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Using the Railway can also make your Journey longer.\"\nmsgstr \"軌道交通也可能使妳的旅程更長。\"\n\n#. Key:\tloading_tip_act3_1\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 3\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"If you got this far, you surely know everything now.\"\nmsgstr \"妳走過的路越遠，妳知道的東西越多。\"\n\n#. Key:\tloading_tip_act3_2\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 3\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Loading screen tips are very useful - except in a few cases.\"\nmsgstr \"遊戲加載時候的小貼士都是非常有用的-除了少部分...\"\n\n#. Key:\tloading_tip_act3_3\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 3\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Now is your time to think about the fate of the Ruined Realm.\"\nmsgstr \"現在是妳們思考這片廢墟命運的時候了。\"\n\n#. Key:\tloading_tip_act3_4\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 3\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"The End is near... I mean no loading screen can take forever, right?\"\nmsgstr \"快結束了……我的意思是加載畫面沒可能持續那麽長時間的，對吧?\"\n\n#. Key:\tloading_tip_act3_5\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 3\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Now your only task is to bring the Artefacts to Wizard.\"\nmsgstr \"現在妳唯壹的任務就是把這些古代工藝品帶給巫師。\"\n\n#. Key:\tloading_tip_act3_6\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 3\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"If you find a combat too hard try to use different shards, spells, and weapons.\"\nmsgstr \"如果妳覺得戰鬥太困難，嘗試使用不同的碎片，法術和武器。\"\n\n#. Key:\tloading_tip_act3_7\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for act 3\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Don’t give up! Victory is close.\"\nmsgstr \"別放棄!勝利近在眼前。\"\n\n#. Key:\tloading_tip_end_0\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for epilogue\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"The Human Realm is a weird place...\"\nmsgstr \"人類王國是個奇怪的地方……\"\n\n#. Key:\tloading_tip_end_1\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for epilogue\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"You really did your part of the deal, now it’s time to go home!\"\nmsgstr \"妳確實做了妳該做的，現在該回家了!\"\n\n#. Key:\tloading_tip_end_2\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for epilogue\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Should you care about the fate of the Realms?\"\nmsgstr \"妳應該關心王國的命運嗎?\"\n\n#. Key:\tloading_tip_end_3\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for epilogue\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Looks like it’s always you who has to take care of the mess others left behind.\"\nmsgstr \"看起來總是妳來收拾別人留下的爛攤子。\"\n\n#. Key:\tloading_tip_end_4\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \" loading screen tip for epilogue\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Time to finish what you started. One way or another.\"\nmsgstr \"是時候完成妳已經開始的事情了。不管怎樣。\"\n\n#. Key:\tlost_land\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an area\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Lost Land\"\nmsgstr \"失落之地\"\n\n#. Key:\tobedient_outpost\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an area\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Obedient Outpost\"\nmsgstr \"前哨\"\n\n#. Key:\tperfect_palace\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an area\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Perfect Palace\"\nmsgstr \"完美宮殿\"\n\n#. Key:\tportal_place\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an area\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Portal Place\"\nmsgstr \"傳送門\"\n\n#. Key:\tprogress_act1_arcade1\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Remnants of a Realm\"\nmsgstr \"王國遺跡\"\n\n#. Key:\tprogress_act1_arcade2\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Discovering Ancient Technology\"\nmsgstr \"發現古老科技\"\n\n#. Key:\tprogress_act1_before_raven\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Searching for a way out\"\nmsgstr \"尋找出路\"\n\n#. Key:\tprogress_act1_boss_fight\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Facing the Keeper\"\nmsgstr \"面對守護者\"\n\n#. Key:\tprogress_act1_gem\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Looking for a Gem\"\nmsgstr \"尋找寶石\"\n\n#. Key:\tprogress_act1_infuse\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Infusing the Gem\"\nmsgstr \"充能寶石\"\n\n#. Key:\tprogress_act1_portals\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Looking for a Portal\"\nmsgstr \"尋找传送门\"\n\n#. Key:\tprogress_act1_start\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Lost in Ruin\"\nmsgstr \"迷失之墟\"\n\n#. Key:\tprogress_act1_test_stone\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Bouncing Stones\"\nmsgstr \"跳石\"\n\n#. Key:\tprogress_act1_tut1\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Am I Worthy?\"\nmsgstr \"值得嗎?\"\n\n#. Key:\tprogress_act1_tut2\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Sewer again\"\nmsgstr \"又見下水道\"\n\n#. Key:\tprogress_act1_tut3\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Third time Worthy\"\nmsgstr \"第三次\"\n\n#. Key:\tprogress_act2_crossroad\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"At a crossroad\"\nmsgstr \"在十字路口\"\n\n#. Key:\tprogress_act2_dwarf_0\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Into the Blue\"\nmsgstr \"深入蔚藍\"\n\n#. Key:\tprogress_act2_dwarf_1\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Elevator Gem and Key\"\nmsgstr \"寶石與鑰匙\"\n\n#. Key:\tprogress_act2_dwarf_2\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Opening the Gate\"\nmsgstr \"開門\"\n\n#. Key:\tprogress_act2_dwarf_boss\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Dwarven Statue\"\nmsgstr \"矮人雕像\"\n\n#. Key:\tprogress_act2_end\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"To the Fourth Station\"\nmsgstr \"第四站\"\n\n#. Key:\tprogress_act2_lava_0\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Into the Red\"\nmsgstr \"深入猩紅\"\n\n#. Key:\tprogress_act2_lava_1\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Uniting Key Pieces\"\nmsgstr \"關鍵部分\"\n\n#. Key:\tprogress_act2_lava_2\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Climbing the Tower\"\nmsgstr \"爬塔\"\n\n#. Key:\tprogress_act2_lava_boss\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Armour Wrath\"\nmsgstr \"鎧甲之怒\"\n\n#. Key:\tprogress_act2_ww_0\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Into the Green\"\nmsgstr \"深入翠綠\"\n\n#. Key:\tprogress_act2_ww_1\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Through the Lake\"\nmsgstr \"穿過湖泊\"\n\n#. Key:\tprogress_act2_ww_2\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Being Followed\"\nmsgstr \"被跟蹤了\"\n\n#. Key:\tprogress_act2_ww_boss\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in act 2\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Fallen Druid\"\nmsgstr \"墮落的德魯伊\"\n\n#. Key:\tprogress_act3_floating\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in act 3\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Floating\"\nmsgstr \"漂浮\"\n\n#. Key:\tprogress_act3_monk\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in act 3\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Monk's Home\"\nmsgstr \"修道士之家\"\n\n#. Key:\tprogress_act3_pipes\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in act 3\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Moving Pipes\"\nmsgstr \"移動管道\"\n\n#. Key:\tprogress_act3_start\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in act 3\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Lost in the Caves\"\nmsgstr \"迷失在洞穴\"\n\n#. Key:\tprogress_act3_way_out\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in act 3\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Way out of the Realm\"\nmsgstr \"離開廢墟的方式\"\n\n#. Key:\tprogress_epilogue_boss\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in epilogue\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"The Real Demon\"\nmsgstr \"真正的惡魔\"\n\n#. Key:\tprogress_epilogue_castle\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in epilogue\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Wizard's Castle\"\nmsgstr \"巫師的城堡\"\n\n#. Key:\tprogress_epilogue_past_and_future\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in epilogue\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Past and Future\"\nmsgstr \"過去和未來\"\n\n#. Key:\tprogress_epilogue_save_creatures\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in epilogue\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Chance for everyone\"\nmsgstr \"人人都有機會\"\n\n#. Key:\tprogress_epilogue_separate_worlds\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"progress info on save slots in epilogue\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Separated Worlds\"\nmsgstr \"分離的世界\"\n\n#. Key:\tprologue\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"text displayed on black screen the first time a chapter is started\"\n#. a chapter is started\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Prologue\"\nmsgstr \"序章\"\n\n#. Key:\tremnant_road\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an area\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Remnant Road\"\nmsgstr \"殘路\"\n\n#. Key:\truined_realm\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Ruined Realm\"\nmsgstr \"荒廢領域\"\n\n#. Key:\tsnake_slide\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an area\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Snake Slide\"\nmsgstr \"蛇形滑梯\"\n\n#. Key:\tsunken_sewer\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an area\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Sunken Sewer\"\nmsgstr \"沈沒的下水道\"\n\n#. Key:\twhite_wall\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"White Wall\"\nmsgstr \"白色巨墻\"\n\n#. Key:\twracked_waters\n#. SourceLocation:\tLocalization/StringTables/Areas.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an area\"\n#: Localization/StringTables/Areas.csv\nmsgctxt \"Areas\"\nmsgid \"Wracked Waters\"\nmsgstr \"廢水\"\n\n#. Key:\tcredits_fmod\n#. SourceLocation:\tLocalization/StringTables/Credits.csv\n#: Localization/StringTables/Credits.csv\nmsgctxt \"Credits\"\nmsgid \"Made with FMOD Studio by Firelight Technologies Pty Ltd.\"\nmsgstr \"由Firelight Technologies Pty Ltd與FMOD Studio合作制作。\"\n\n#. Key:\tMonthApril\n#. SourceLocation:\tSource/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:17\n#: Source/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:17\nmsgctxt \"DateTimeHelper\"\nmsgid \"April\"\nmsgstr \"四月\"\n\n#. Key:\tMonthAugust\n#. SourceLocation:\tSource/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:21\n#: Source/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:21\nmsgctxt \"DateTimeHelper\"\nmsgid \"August\"\nmsgstr \"八月\"\n\n#. Key:\tMonthDecember\n#. SourceLocation:\tSource/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:26\n#: Source/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:26\nmsgctxt \"DateTimeHelper\"\nmsgid \"December\"\nmsgstr \"十二月\"\n\n#. Key:\tMonthFebruary\n#. SourceLocation:\tSource/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:15\n#: Source/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:15\nmsgctxt \"DateTimeHelper\"\nmsgid \"February\"\nmsgstr \"二月\"\n\n#. Key:\tMonthJanuary\n#. SourceLocation:\tSource/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:14\n#: Source/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:14\nmsgctxt \"DateTimeHelper\"\nmsgid \"January\"\nmsgstr \"壹月\"\n\n#. Key:\tMonthJuly\n#. SourceLocation:\tSource/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:20\n#: Source/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:20\nmsgctxt \"DateTimeHelper\"\nmsgid \"July\"\nmsgstr \"七月\"\n\n#. Key:\tMonthJune\n#. SourceLocation:\tSource/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:19\n#: Source/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:19\nmsgctxt \"DateTimeHelper\"\nmsgid \"June\"\nmsgstr \"六月\"\n\n#. Key:\tMonthMarch\n#. SourceLocation:\tSource/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:16\n#: Source/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:16\nmsgctxt \"DateTimeHelper\"\nmsgid \"March\"\nmsgstr \"三月\"\n\n#. Key:\tMonthMay\n#. SourceLocation:\tSource/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:18\n#: Source/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:18\nmsgctxt \"DateTimeHelper\"\nmsgid \"May\"\nmsgstr \"五月\"\n\n#. Key:\tMonthNovember\n#. SourceLocation:\tSource/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:24\n#: Source/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:24\nmsgctxt \"DateTimeHelper\"\nmsgid \"November\"\nmsgstr \"十壹月\"\n\n#. Key:\tMonthOctober\n#. SourceLocation:\tSource/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:23\n#: Source/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:23\nmsgctxt \"DateTimeHelper\"\nmsgid \"October\"\nmsgstr \"十月\"\n\n#. Key:\tMonthSeptember\n#. SourceLocation:\tSource/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:22\n#: Source/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:22\nmsgctxt \"DateTimeHelper\"\nmsgid \"September\"\nmsgstr \"九月\"\n\n#. Key:\tSecondsToTime\n#. SourceLocation:\tSource/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:48\n#: Source/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:48\nmsgctxt \"DateTimeHelper\"\nmsgid \"{Minutes}:{Seconds}\"\nmsgstr \"{Minutes}:{Seconds}\"\n\n#. Key:\tSecondsToTimeMinusSeconds\n#. SourceLocation:\tSource/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:51\n#: Source/SOrb/Basic/Helpers/SoDateTimeHelper.cpp:51\nmsgctxt \"DateTimeHelper\"\nmsgid \"{Hours}:{Minutes}:{Seconds}\"\nmsgstr \"{Hours}:{Minutes}:{Seconds}\"\n\n#. Key:\tchar_name_ball_e\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"possible display name for character\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"BALL-E\"\nmsgstr \"E球\"\n\n#. Key:\tchar_name_destroyer\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"possible display name for character\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Destroyer\"\nmsgstr \"毀滅者\"\n\n#. Key:\tchar_name_dont_buy\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"possible display name for character\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Don't buy\"\nmsgstr \"不買\"\n\n#. Key:\tchar_name_dr_ball\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"possible display name for character\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Dr. Ball\"\nmsgstr \"球先生\"\n\n#. Key:\tchar_name_epic_sphero\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"possible display name for character\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Epic Sphero\"\nmsgstr \"史詩球面\"\n\n#. Key:\tchar_name_failed_one\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"possible display name for character\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Failed One\"\nmsgstr \"墮落者\"\n\n#. Key:\tchar_name_saviour\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"possible display name for character\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Saviour\"\nmsgstr \"救世主\"\n\n#. Key:\tchar_name_sorbcerer\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"possible display name for character\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Sorbcerer\"\nmsgstr \"巫師\"\n\n#. Key:\tchar_name_spirit_of_the_unknown\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"possible display name for character\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Spirit Of the Unknown\"\nmsgstr \"無名幽魂\"\n\n#. Key:\tchar_name_ultimate_frisbee\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"possible display name for character\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Ultimate Frisbee\"\nmsgstr \"極限飛盤\"\n\n#. Key:\tchar_name_wanderer\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"possible display name for character\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Wanderer\"\nmsgstr \"流浪者\"\n\n#. Key:\tchar_name_warlorb\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"possible display name for character\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Warlorb\"\nmsgstr \"球督\"\n\n#. Key:\tchar_name_warriorb\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"possible display name for character\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"WarriOrb\"\nmsgstr \"球魂\"\n\n#. Key:\tfinish\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"default option\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Finish\"\nmsgstr \"完成\"\n\n#. Key:\tgold_gained\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"{0} Gold Gained\"\nmsgstr \"獲得 {0} 金幣\"\n\n#. Key:\tgold_lost\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"{0} Gold Lost\"\nmsgstr \"失去 {0} 金幣\"\n\n#. Key:\titem_gained\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"{ItemName} gained!\"\nmsgstr \"獲得 {ItemName}！\"\n\n#. Key:\titem_gained_n\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"{Amount} {ItemName} gained!\"\nmsgstr \"獲得 {Amount} {ItemName}！\"\n\n#. Key:\titem_lost\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"{ItemName} lost!\"\nmsgstr \"失去 {ItemName}！\"\n\n#. Key:\titem_lost_n\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"{Amount} {ItemName} lost!\"\nmsgstr \"失去 {Amount} {ItemName}！\"\n\n#. Key:\tnext\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"default option\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Next\"\nmsgstr \"下壹個\"\n\n#. Key:\tnpc_altar\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"npc if BPLanguage Improver\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Altar\"\nmsgstr \"聖塔\"\n\n#. Key:\tnpc_ancient_gate\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an npc\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Ancient Gate\"\nmsgstr \"遠古之門\"\n\n#. Key:\tnpc_demon_lillian\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"name of the final boss\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Demon Lillian\"\nmsgstr \"惡魔莉莉安\"\n\n#. Key:\tnpc_dwarven_workshop\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"name of the place the character can have a dialogue to craft a quest item\"\n#. dialogue to craft a quest item\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Dwarven Workshop\"\nmsgstr \"矮人工坊\"\n\n#. Key:\tnpc_fishy\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"display name of an npc\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Fishy\"\nmsgstr \"呆魚\"\n\n#. Key:\tnpc_fountain\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"display name of a fountain the character can talk with\"\n#. talk with\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Fountain\"\nmsgstr \"噴泉\"\n\n#. Key:\tnpc_gatekeeper\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an npc\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Gatekeeper\"\nmsgstr \"看門人\"\n\n#. Key:\tnpc_ghost_dwarf\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an npc (actually a ghost of a dwarf)\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Ghost Dwarf\"\nmsgstr \"矮人幽魂\"\n\n#. Key:\tnpc_gnory\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an npc\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Gnory\"\nmsgstr \"格諾裏\"\n\n#. Key:\tnpc_golem_maker\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an npc\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Golem Maker\"\nmsgstr \"機器人制造者\"\n\n#. Key:\tnpc_lory\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an npc\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Lory\"\nmsgstr \"勞裏\"\n\n#. Key:\tnpc_lory_unkown\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"display name of Lory before she introduces herself\"\n#. herself\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Gnome Lady\"\nmsgstr \"侏儒女士\"\n\n#. Key:\tnpc_magic_mirror\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an npc\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Magic Mirror\"\nmsgstr \"魔鏡\"\n\n#. Key:\tnpc_merchant\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an npc\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Merch Ant\"\nmsgstr \"默克螞蟻\"\n\n#. Key:\tnpc_merchant_voice\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"name of a small ant until he says his name (only a voice cause player can not see it)\"\n#. (only a voice cause player can not see it)\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Voice\"\nmsgstr \"聲音\"\n\n#. Key:\tnpc_monk\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an npc\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Monk\"\nmsgstr \"修道士\"\n\n#. Key:\tnpc_name_kobold\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Kobold Chef\"\nmsgstr \"地精廚師\"\n\n#. Key:\tnpc_pipe_walker\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"display name of some weird creatures\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Pipe Walker\"\nmsgstr \"管行者\"\n\n#. Key:\tnpc_raven\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an npc (he is actually a bird)\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Raven\"\nmsgstr \"烏鴉\"\n\n#. Key:\tnpc_scholar\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an npc\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Scholar\"\nmsgstr \"斯考拉\"\n\n#. Key:\tnpc_secret_hideout\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"display name of a door asking for a password\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Secret Hideout Gate\"\nmsgstr \"秘密藏身處的門\"\n\n#. Key:\tnpc_sewer_creature\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an npc\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Sewer Creature\"\nmsgstr \"下水道魔物\"\n\n#. Key:\tnpc_statue\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an npc\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Statue\"\nmsgstr \"雕像\"\n\n#. Key:\tnpc_supper_dwarf\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"display name of an npc. Supper refers here an evening meal, typically a light or informal one.\"\n#. evening meal, typically a light or informal one.\"\n#. here an evening meal, typically a light or informal one.\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Supper Dwarf\"\nmsgstr \"晚餐矮人\"\n\n#. Key:\tnpc_teachy\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"name of an npc\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Teachy\"\nmsgstr \"提奇\"\n\n#. Key:\tnpc_teachy_unkown\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"name of Teachy before introduction\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Bored Gnome\"\nmsgstr \"無聊的侏儒\"\n\n#. Key:\tnpc_tomb\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"display name of a tomb a character can talk to\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Tomb\"\nmsgstr \"墳墓\"\n\n#. Key:\tnpc_unknown_wizard\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"display name of an npc\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Unknown Wizard\"\nmsgstr \"無名巫師\"\n\n#. Key:\tnpc_wizard\n#. SourceLocation:\tLocalization/StringTables/Dialogue.csv\n#. InfoMetaData:\t\"Comment\" : \"display name of the wizard npc\"\n#: Localization/StringTables/Dialogue.csv\nmsgctxt \"Dialogue\"\nmsgid \"Wizard\"\nmsgstr \"巫師\"\n\n#. Key:\t022227664F6F422B20B109A19B8789AA\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_8.Text\n#. /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"I’m glad you are back again!\"\nmsgstr \"很高興妳又回來了！\"\n\n#. Key:\t0944D8A541F933BEB5DD068CA9099075\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_44.Text\n#. /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_44.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_44.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"I think I managed to activate the device on the wall of the Portal Tower.\"\nmsgstr \"我想我成功激活了傳送塔上的裝置。\"\n\n#. Key:\t10ADF4F948FB99445BF791BB0722AD90\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_25.Text\n#. /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_25.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_25.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Good idea.\"\nmsgstr \"好主意。\"\n\n#. Key:\t137B87BB447D45E46C0425A940E8B7F0\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_46.Text\n#. /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_46.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_46.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"You said you wouldn't do it...\"\nmsgstr \"妳說過妳不會這麽做的...\"\n\n#. Key:\t16358AE840D8B8553E8930A3B7E69BBA\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_9.Text\n#. /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"You know, sometimes I miss the Pipewalkers...\"\nmsgstr \"妳知道，有時候我會想念那些管道中行走的家夥...\"\n\n#. Key:\t1B9834C6405C60960F322585AB0F1704\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_38.Text\n#. Key:\t2189E8064ACF974902FBA49BD12D0F47\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_2.Text\n#. /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_38.Text\n#. /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_38.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Could you activate it for me?\"\nmsgstr \"妳能幫我激活它嗎？\"\n\n#. Key:\t274EB7AD410061E3E200A9813A54AB29\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_4.Text\n#. /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"I think I've already done that.\"\nmsgstr \"我想我已經做過了。\"\n\n#. Key:\t2A57878148EFCC8532E34CAE1B9C9A0F\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_1.Text\n#. /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"You? I never thought I’ll see you in this shape again.\"\nmsgstr \"是妳？沒想到竟然還能見到妳變成這副模樣。\"\n\n#. Key:\t3764BB48401ABEDCD125F186B4BF0E17\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_22.Text\n#. /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"And it also attracts the Pipewalkers.\"\nmsgstr \"它還吸引了管道行走者。\"\n\n#. Key:\t3A0924F7449355545C0A98B94994616B\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_18.Text\n#. /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"I want to find my tribe.\"\nmsgstr \"我想找到我的部落。\"\n\n#. Key:\t3C0498284D71B7B64FEA4094F42A5502\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_23.Text\n#. /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_23.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_23.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Do you think you will find Pipewalkers here?\"\nmsgstr \"妳覺得能在這裏找到管道行走者嗎？\"\n\n#. Key:\t3DCACAB047175FB687542AB0CA25D972\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_38.Children(1).Children.Text\n#. /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_38.Children(1).Children.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_38.Children(1).Children.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Decline\"\nmsgstr \"下降\"\n\n#. Key:\t41C1FCA947041D49247FC8A157D7407F\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_52.Text\n#. /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_52.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_52.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"All right, thank you.\"\nmsgstr \"好的，謝謝。\"\n\n#. Key:\t43C8FE9248340E49F1F31882D7B96642\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_14.Text\n#. /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"If they are still alive they must be beyond that Purple Portal.\"\nmsgstr \"如果他們還活著，壹定在紫色傳送門後面。\"\n\n#. Key:\t444DD931423A98C7DD95D4BB73F0F1C6\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_39.Text\n#. /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_39.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_39.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Sure! I’ll see what I can do.\"\nmsgstr \"當然！我看看應該怎麽做。\"\n\n#. Key:\t4FF2FA154BEFBD448EFDB0BB7FE3F0AF\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_11.Children(1).Children.Text\n#. /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_11.Children(1).Children.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_11.Children(1).Children.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Tribe\"\nmsgstr \"部落\"\n\n#. Key:\t52A8B1F04C37F262E014DEA14AB68957\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_20.Text\n#. /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Because I’m a chef.\"\nmsgstr \"因為我是壹個廚師。\"\n\n#. Key:\t5F376BF945B8CE4AA12B7EB05F8C62A5\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_11.Children(6).Children.Text\n#. /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_11.Children(6).Children.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_11.Children(6).Children.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Leave\"\nmsgstr \"離開\"\n\n#. Key:\t63EA4DDD45390542E3A904928143D9AF\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_3.Text\n#. /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Haha... Yes I’m back again.\"\nmsgstr \"哈哈... 我又回來了。\"\n\n#. Key:\t64EE856046A396F2750AE1BC1042CF26\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_30.Text\n#. Key:\tE3F52F4F47289406E4A546BB0BF3AC3F\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_50.Text\n#. /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_30.Text\n#. /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_50.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_30.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_50.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Thanks!\"\nmsgstr \"謝謝！\"\n\n#. Key:\t694B6E3F4F4C7CEAAACB51A2D30FFD26\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_11.Children(2).Children.Text\n#. /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_11.Children(2).Children.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_11.Children(2).Children.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Ruin\"\nmsgstr \"毀滅\"\n\n#. Key:\t7304F1034A83C6D17E274090FA8E543B\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_41.Text\n#. /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_41.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_41.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Thank you!\"\nmsgstr \"謝謝！\"\n\n#. Key:\t73240093450B12BEEA1EB78C9CF7D89E\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_11.Children(0).Children.Text\n#. /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_11.Children(0).Children.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_11.Children(0).Children.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Purple Portal\"\nmsgstr \"紫色傳送門\"\n\n#. Key:\t804671AF40165C92FA6A8F8A5AE97997\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_60.Text\n#. /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_60.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_60.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Looks like I can’t get rid of this body.\"\nmsgstr \"看來我無法擺脫這具身體。\"\n\n#. Key:\t807FF1A945548216DAD305B4D5A4437F\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_24.Text\n#. /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_24.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_24.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"If there are any they will come here when they smell the soup.\"\nmsgstr \"如果有的話，他們聞到湯味就會過來。\"\n\n#. Key:\t8240EF7946C8434333AFAEBEF3583917\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_34.Text\n#. /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_34.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_34.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Do you need help with something?\"\nmsgstr \"妳需要幫助嗎？\"\n\n#. Key:\t833BB4384231444247779CAB596D0259\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_40.Text\n#. /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_40.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_40.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"I’m sorry but that sounds complicated.\"\nmsgstr \"對不起，這聽起來很復雜。\"\n\n#. Key:\t85656A9E46844B03D49E13AC951FDE07\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_59.Text\n#. /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_59.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_59.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"See you!\"\nmsgstr \"回頭見！\"\n\n#. Key:\t869485E24E19938DEE48BFB5C5240BB3\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_29.Text\n#. /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_29.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_29.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"I’m not sure... but I have a key which might be useful.\"\nmsgstr \"我不確定… 但是我有壹把可能會派上作用的鑰匙。\"\n\n#. Key:\t86FBA5A24734DD97167512A054A2E0D9\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_10.Text\n#. /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Oh, it’s you.\"\nmsgstr \"哦，是妳。\"\n\n#. Key:\t891684A24BA64E351E7F0B9ADEA3D6DF\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_17.Text\n#. /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"No. To be honest I don’t care much about Ruin.\"\nmsgstr \"不。說實話，我不太在乎毀滅。\"\n\n#. Key:\t8FF6BF7B4745BB75C2D8F7873C492C2D\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_11.Children(4).Children.Text\n#. /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_11.Children(4).Children.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_11.Children(4).Children.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Can I help?\"\nmsgstr \"我能幫忙嗎？\"\n\n#. Key:\t93B13014434102C8033B41A06DBED69B\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_11.Children(5).Children.Text\n#. /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_11.Children(5).Children.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_11.Children(5).Children.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Tower Device\"\nmsgstr \"塔裝置\"\n\n#. Key:\t95A7C27A44B78CBF17C1FD8C9446CBD7\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_28.Text\n#. /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Take it! I still need some time to finish the soup anyway.\"\nmsgstr \"拿著！我還需要點時間才能喝完這道湯。\"\n\n#. Key:\t97E4FDC74B47A6037D6023A4C65B2934\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_37.Text\n#. /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_37.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_37.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"If you activate it I’ll be able to use the portal to teleport to other places.\"\nmsgstr \"如果妳激活它，我就可以使用傳送門傳送到其他地方。\"\n\n#. Key:\t9FD2679D44BEBBFBBAD2EAAECFFEE0D5\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_42.Text\n#. /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_42.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_42.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"I can’t promise I’ll do that.\"\nmsgstr \"我不能保證會那樣做。\"\n\n#. Key:\tAA1C6EF444BAB6A929E953A87BB87ABB\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_56.Text\n#. /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_56.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_56.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"I've got to go. See you soon!\"\nmsgstr \"我得走了。再見！\"\n\n#. Key:\tAED4FBE3422E0FC4AC4BD38650F95CA9\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_26.Text\n#. /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_26.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_26.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Thanks.\"\nmsgstr \"謝謝。\"\n\n#. Key:\tB0BAD1934671ADCB2DD1E1BA582E3C68\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_19.Text\n#. /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Why are you making soup?\"\nmsgstr \"妳為什麽要做湯？\"\n\n#. Key:\tB621AECE42A14A508C945595493F3A3A\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_5.Text\n#. /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Really? Anyway, I’m happy to see you.\"\nmsgstr \"真的嗎？不管怎樣，很高興見到妳。\"\n\n#. Key:\tBA715D554C47932C092462B36ADEA081\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_58.Text\n#. /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_58.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_58.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Good bye!\"\nmsgstr \"再見！\"\n\n#. Key:\tBE7B3444431F43E8E1487F8702B94845\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_57.Text\n#. /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_57.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_57.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"It was nice to meet you.\"\nmsgstr \"見到妳很高興。\"\n\n#. Key:\tC1BB24A443D4297B17E2F6A280B02E91\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_36.Text\n#. /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_36.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_36.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Yes. According to a book I read here there is a device on the wall of the Portal Tower.\"\nmsgstr \"是的。根據我在這裏讀到的壹本書上據說，傳送塔的墻上有壹個裝置。\"\n\n#. Key:\tC339B87742C2B475E2387F93418AA855\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_15.Text\n#. /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Have you found out anything about Ruin?\"\nmsgstr \"妳知道什麽叫毀滅嗎？\"\n\n#. Key:\tC4D263AB48B800D5522A24923C541ED3\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_11.Children(3).Children.Text\n#. /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_11.Children(3).Children.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_11.Children(3).Children.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Soup\"\nmsgstr \"湯\"\n\n#. Key:\tC530096E4FA1A2B68077C3AD6AC1BF44\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_38.Children(0).Children.Text\n#. /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_38.Children(0).Children.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_38.Children(0).Children.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Accept Quest\"\nmsgstr \"接受任務\"\n\n#. Key:\tC82668E6497A810FA6ADC0AB6F362B47\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_7.Text\n#. /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"The soup is almost ready...\"\nmsgstr \"湯已經準備好了...\"\n\n#. Key:\tCD8CDA3443CDE79BE257B99A0801B209\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_43.Text\n#. /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_43.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_43.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"No problem.\"\nmsgstr \"沒問題。\"\n\n#. Key:\tD058108241051A9FD0D130B3C9EA4B8B\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_21.Text\n#. /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"It helps me keep my mind clear.\"\nmsgstr \"它幫助我保持頭腦清醒。\"\n\n#. Key:\tD8F879684C57BB474E7153B971073663\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_49.Text\n#. /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_49.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_49.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Meanwhile I cooked something special for you. Take this!\"\nmsgstr \"同時，我為妳做了壹些特別的東西。拿好這個！\"\n\n#. Key:\tDA9D493F42420BE9442B1EA983AEF9C2\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_12.Text\n#. /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Any news on your lost tribe?\"\nmsgstr \"有妳失蹤部落的消息了嗎？\"\n\n#. Key:\tDE2390ED4366A621E4D220A3761333DE\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_54.Text\n#. /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_54.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_54.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"I need to go now.\"\nmsgstr \"我得走了。\"\n\n#. Key:\tDE668E4B4A3D0F785A693B9190E635D3\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_47.Text\n#. /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_47.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_47.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"How on earth have you managed to reach this node?\"\nmsgstr \"妳到底是怎麽到達這個點的？\"\n\n#. Key:\tE29E2D044497A86DD0FCA8B540703597\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_48.Text\n#. /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_48.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_48.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Pls. report it as a bug.\"\nmsgstr \"請把這個作為錯誤進行報告。\"\n\n#. Key:\tE6D3401944B2FF128DD1689F5159AF96\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_45.Text\n#. /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_45.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_45.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Nice, well done!\"\nmsgstr \"好，做得好！\"\n\n#. Key:\tE83287164D066CCE8FBFDE835FBD4CFB\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_55.Text\n#. /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_55.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_55.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"I'm on my way. Take care!\"\nmsgstr \"我馬上就來。保重！\"\n\n#. Key:\tEBC97F7C45858FE6DC72209536FC5C3B\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_27.Text\n#. /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_27.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_27.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"Do you know how can I reach that Purple Portal?\"\nmsgstr \"妳知道我怎樣才能到達那個紫色傳送門嗎？\"\n\n#. Key:\tF911D6CB45AA59448C03379A1C07DD60\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_51.Text\n#. /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_51.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_51.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"It wasn’t that complicated after all.\"\nmsgstr \"其實並沒有那麽復雜。\"\n\n#. Key:\tF9EBA1684D435C8AEB14129A7B57A604\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_13.Text\n#. /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/WhiteWall/VV_Kobold.VV_Kobold:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_VV_Kobold\"\nmsgid \"I think they came here and followed the messages just like you.\"\nmsgstr \"我想他們跟妳壹樣，來到這兒並且遵循信息指示行動。\"\n\n#. Key:\t3DAA74ED48BE31E35D868FB1492E57A8\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/WW_Pergamen.WW_Pergamen:DlgNode_Speech_1.Text\n#. /Game/SO/Dialogues/WhiteWall/WW_Pergamen.WW_Pergamen:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/WhiteWall/WW_Pergamen.WW_Pergamen:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_WW_Pergamen\"\nmsgid \"'Ruin took over some of us. It's no longer safe here.'\"\nmsgstr \"毀滅摧毀了我們中的壹些人。這個地方不再安全。'\"\n\n#. Key:\tB10818134FFE3A1E99A9D789BFABBBEE\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/WW_Pergamen.WW_Pergamen:DlgNode_Speech_3.Text\n#. /Game/SO/Dialogues/WhiteWall/WW_Pergamen.WW_Pergamen:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/WhiteWall/WW_Pergamen.WW_Pergamen:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_WW_Pergamen\"\nmsgid \"'Come visit us beyond the Purple Portal!'\"\nmsgstr \"到紫色傳送門那兒來找我們吧！'\"\n\n#. Key:\tD292364A4E58F52FB874AA98C1F969A6\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/WW_Pergamen.WW_Pergamen:DlgNode_Speech_2.Text\n#. /Game/SO/Dialogues/WhiteWall/WW_Pergamen.WW_Pergamen:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/WhiteWall/WW_Pergamen.WW_Pergamen:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_WW_Pergamen\"\nmsgid \"'We are close to the solution, but your help is still needed.'\"\nmsgstr \"我們基本能解決問題了。但還需要妳的幫助。'\"\n\n#. Key:\t0CD0FD884718EF68B38D578CDE17110A\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/WW_Statue.WW_Statue:DlgNode_Speech_2.Text\n#. /Game/SO/Dialogues/WhiteWall/WW_Statue.WW_Statue:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/WhiteWall/WW_Statue.WW_Statue:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_WW_Statue\"\nmsgid \"Oooops...\"\nmsgstr \"糟糕...\"\n\n#. Key:\t2D531D384CB6A56DBC4834BD229622E7\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/WW_Statue.WW_Statue:DlgNode_Speech_1.Text\n#. /Game/SO/Dialogues/WhiteWall/WW_Statue.WW_Statue:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/WhiteWall/WW_Statue.WW_Statue:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_WW_Statue\"\nmsgid \"'White Wall will never fall!'\"\nmsgstr \"白色巨塔永不倒!'\"\n\n#. Key:\t2690E77045D5E42F32AC6582BAFF27AA\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/WW_StatueWelcome.WW_StatueWelcome:DlgNode_Speech_1.Text\n#. /Game/SO/Dialogues/WhiteWall/WW_StatueWelcome.WW_StatueWelcome:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/WhiteWall/WW_StatueWelcome.WW_StatueWelcome:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_WW_StatueWelcome\"\nmsgid \"'We know how to stop Ruin.'\"\nmsgstr \"“我們知道如何阻止毀滅。”\"\n\n#. Key:\t7C3340434A4C80010AC2D58BF8504339\n#. SourceLocation:\t/Game/SO/Dialogues/WhiteWall/WW_StatueWelcome.WW_StatueWelcome:DlgNode_Speech_2.Text\n#. /Game/SO/Dialogues/WhiteWall/WW_StatueWelcome.WW_StatueWelcome:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/WhiteWall/WW_StatueWelcome.WW_StatueWelcome:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_WW_StatueWelcome\"\nmsgid \"'There is still hope.'\"\nmsgstr \"“還有希望。”\"\n\n#. Key:\tarmour_wrath_name\n#. SourceLocation:\tLocalization/StringTables/Enemies.csv\n#. InfoMetaData:\t\"Comment\" : \"display name of an npc boss\"\n#: Localization/StringTables/Enemies.csv\nmsgctxt \"Enemies\"\nmsgid \"Armour Wrath\"\nmsgstr \"鎧甲之怒\"\n\n#. Key:\tdwarf_name\n#. SourceLocation:\tLocalization/StringTables/Enemies.csv\n#. InfoMetaData:\t\"Comment\" : \"display name of an npc boss\"\n#: Localization/StringTables/Enemies.csv\nmsgctxt \"Enemies\"\nmsgid \"Dwarf\"\nmsgstr \"矮人\"\n\n#. Key:\tfallen_druid_name\n#. SourceLocation:\tLocalization/StringTables/Enemies.csv\n#. InfoMetaData:\t\"Comment\" : \"display name of an npc boss\"\n#: Localization/StringTables/Enemies.csv\nmsgctxt \"Enemies\"\nmsgid \"Fallen Druid\"\nmsgstr \"墮落的德魯伊\"\n\n#. Key:\tdreamhack_completed_desc\n#. SourceLocation:\tLocalization/StringTables/Episodes.csv\n#: Localization/StringTables/Episodes.csv\nmsgctxt \"Episodes\"\nmsgid \"Thanks for playing the game, we hope you had a great time!\"\nmsgstr \"感謝體驗！希望您遊戲愉快！\"\n\n#. Key:\tdreamhack_completed_subtitle\n#. SourceLocation:\tLocalization/StringTables/Episodes.csv\n#: Localization/StringTables/Episodes.csv\nmsgctxt \"Episodes\"\nmsgid \"Dreamhack Demo\"\nmsgstr \"Dreamhack試玩\"\n\n#. Key:\tdreamhack_desc\n#. SourceLocation:\tLocalization/StringTables/Episodes.csv\n#: Localization/StringTables/Episodes.csv\nmsgctxt \"Episodes\"\nmsgid \"What happens when you lock a mighty demon's spirit inside a ball body?\"\nmsgstr \"當妳把壹個強大的惡魔之魂鎖在壹個球體內會發生什麽？\"\n\n#. Key:\tdreamhack_friendly_name\n#. SourceLocation:\tLocalization/StringTables/Episodes.csv\n#: Localization/StringTables/Episodes.csv\nmsgctxt \"Episodes\"\nmsgid \"Dreamhack\"\nmsgstr \"Dreamhack\"\n\n#. Key:\tepisode_end_main_title\n#. SourceLocation:\tLocalization/StringTables/Episodes.csv\n#. InfoMetaData:\t\"Comment\" : \"episode map end panel text\"\n#: Localization/StringTables/Episodes.csv\nmsgctxt \"Episodes\"\nmsgid \"Episode Completed!\"\nmsgstr \"章節完成！\"\n\n#. Key:\tescape_darkness_completed_desc\n#. SourceLocation:\tLocalization/StringTables/Episodes.csv\n#: Localization/StringTables/Episodes.csv\nmsgctxt \"Episodes\"\nmsgid \"\\\"And as Darkness spreads an unknown Warriorb will rise...\\\"\"\nmsgstr \"“隨著黑暗的蔓延，壹個未知的球魂將崛起……”\"\n\n#. Key:\tescape_darkness_completed_subtitle\n#. SourceLocation:\tLocalization/StringTables/Episodes.csv\n#: Localization/StringTables/Episodes.csv\nmsgctxt \"Episodes\"\nmsgid \"Escaped from Darkness\"\nmsgstr \"逃離黑暗\"\n\n#. Key:\tescape_darkness_desc\n#. SourceLocation:\tLocalization/StringTables/Episodes.csv\n#: Localization/StringTables/Episodes.csv\nmsgctxt \"Episodes\"\nmsgid \"Are you fast enough to race against Darkness itself?\"\nmsgstr \"妳有足夠快的速度跑贏黑暗嗎？\"\n\n#. Key:\tescape_darkness_friendly_name\n#. SourceLocation:\tLocalization/StringTables/Episodes.csv\n#: Localization/StringTables/Episodes.csv\nmsgctxt \"Episodes\"\nmsgid \"Escape Darkness\"\nmsgstr \"逃離黑暗\"\n\n#. Key:\twhite_wall_completed_desc\n#. SourceLocation:\tLocalization/StringTables/Episodes.csv\n#. InfoMetaData:\t\"Comment\" : \"short text on the ending panel when player finishes this episode\"\n#. finishes this episode\"\n#: Localization/StringTables/Episodes.csv\nmsgctxt \"Episodes\"\nmsgid \"What happened beyond the portal is another story, which will be told at another time.\"\nmsgstr \"傳送門之外發生的另壹個故事，我們將擇日再進行講述。\"\n\n#. Key:\twhite_wall_completed_subtitle\n#. SourceLocation:\tLocalization/StringTables/Episodes.csv\n#. InfoMetaData:\t\"Comment\" : \"subtitle of the ending panel when player finishes this episode\"\n#. Key:\twhite_wall_friendly_name\n#. InfoMetaData:\t\"Comment\" : \"name the episode is displayed with in the ui\"\n#. finishes this episode\"\n#: Localization/StringTables/Episodes.csv\nmsgctxt \"Episodes\"\nmsgid \"White Wall\"\nmsgstr \"白色巨墻\"\n\n#. Key:\twhite_wall_desc\n#. SourceLocation:\tLocalization/StringTables/Episodes.csv\n#. InfoMetaData:\t\"Comment\" : \"map desc when the player can select the episode\"\n#: Localization/StringTables/Episodes.csv\nmsgctxt \"Episodes\"\nmsgid \"Although it's long abandoned the fortress of White Wall still stands against Ruin. After centuries of silence some groups of unexpected visitors broke the loneliness of the decaying city.\"\nmsgstr \"雖然它已經廢棄很久了，但白墻要塞仍然屹立著阻礙著毀滅的腳步。在沈寂了幾個世紀之後，壹些不速之客打破了這座衰敗城市的孤獨。\"\n\n#. Key:\twhite_wall_loadingscreen_desc\n#. SourceLocation:\tLocalization/StringTables/Episodes.csv\n#. InfoMetaData:\t\"Comment\" : \"text on loading screen\"\n#: Localization/StringTables/Episodes.csv\nmsgctxt \"Episodes\"\nmsgid \"After months of researching I found a way to return back to the Ruined Realm. Ironically enough I have to use the same body I was trapped in before. I'll need to be quick and clever for this might be my very last chance to stop Ruin before it devours the World.\"\nmsgstr \"經過幾個月的研究，我發現了壹個回到荒廢領域的方法。諷刺的是，我不得不使用曾經將我困住的那個軀體。我需要快速行動並保持頭腦靈活 ，因為這可能是我在毀滅吞噬世界之前能阻止它的最後機會。\"\n\n#. Key:\tchar_vo_armourwrath_attack_clap\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I won't fail the Maker!\"\nmsgstr \"我不會讓製造者失望的！\"\n\n#. Key:\tchar_vo_armourwrath_attack_die\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"No... I'm still... perfect\"\nmsgstr \"不... 我依然... 完美\"\n\n#. Key:\tchar_vo_armourwrath_attack_magic\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Resist Ruin!\"\nmsgstr \"抵抗毀滅！\"\n\n#. Key:\tchar_vo_armourwrath_attack_strike_down\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Out of my way!\"\nmsgstr \"別擋道！\"\n\n#. Key:\tchar_vo_armourwrath_attack_strike_down_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I am perfect\"\nmsgstr \"我是完美的\"\n\n#. Key:\tchar_vo_dwarvenstatue_attack_axe_point\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I keep Ruin\"\nmsgstr \"我既是毀滅\"\n\n#. Key:\tchar_vo_dwarvenstatue_attack_axe_strike_down\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"We are above the Law!\"\nmsgstr \"我們淩駕於律法之上!\"\n\n#. Key:\tchar_vo_dwarvenstatue_attack_meteor\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I can take more!\"\nmsgstr \"我要更多!\"\n\n#. Key:\tchar_vo_dwarvenstatue_die\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I won't move... again\"\nmsgstr \"我不願改變……再壹次\"\n\n#. Key:\tchar_vo_dwarvenstatue_shield_knock\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I hold it back!\"\nmsgstr \"我忍住了!\"\n\n#. Key:\tchar_vo_fallendruid_attack_flybug\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"It's safe here.\"\nmsgstr \"這兒很安全。\"\n\n#. Key:\tchar_vo_fallendruid_attack_spike\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"This place shall stand!\"\nmsgstr \"此地將屹立不倒！\"\n\n#. Key:\tchar_vo_fallendruid_attack_tendril\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Nature will survive!\"\nmsgstr \"自然將永存！\"\n\n#. Key:\tchar_vo_fallendruid_attack_thorn_sphere\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Out with you, Ruin!\"\nmsgstr \"滾開，毀滅！\"\n\n#. Key:\tchar_vo_fallendruid_die\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I have... failed\"\nmsgstr \"我... 失敗了\"\n\n#. Key:\tchar_vo_final_boss_p1_blue\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#. Key:\tchar_vo_final_boss_p2_blue\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I'm the daughter of the Wizard!\"\nmsgstr \"我是巫師的女兒！\"\n\n#. Key:\tchar_vo_final_boss_p1_green\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#. Key:\tchar_vo_final_boss_p2_red_up\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I can create!\"\nmsgstr \"我可以創造！\"\n\n#. Key:\tchar_vo_final_boss_p1_red\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I'm human!\"\nmsgstr \"我是人類！\"\n\n#. Key:\tchar_vo_final_boss_p2_green\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#. Key:\tchar_vo_final_boss_p3_green\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"That sounds funny!\"\nmsgstr \"聽上去很有趣！\"\n\n#. Key:\tchar_vo_final_boss_p2_red_down\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I can destroy!\"\nmsgstr \"我可以摧毀！\"\n\n#. Key:\tchar_vo_final_boss_p3_blue\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I'm free!\"\nmsgstr \"我自由了！\"\n\n#. Key:\tchar_vo_final_boss_p3_red\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"What makes you say that?\"\nmsgstr \"你為什麼這麼說？\"\n\n#. Key:\tchar_vo_fishy_idle_hiss\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Hissing\"\nmsgstr \"嘶嘶聲\"\n\n#. Key:\tchar_vo_flybug_attack_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Huh! Surprised?\"\nmsgstr \"哼！吃驚嗎？\"\n\n#. Key:\tchar_vo_flybug_attack_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Take this!\"\nmsgstr \"拿著這個！\"\n\n#. Key:\tchar_vo_flybug_damaged_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Careful!\"\nmsgstr \"小心！\"\n\n#. Key:\tchar_vo_flybug_damaged_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"It's not funny!\"\nmsgstr \"一點也不好玩！\"\n\n#. Key:\tchar_vo_flybug_die_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"All right, gg!\"\nmsgstr \"好吧！\"\n\n#. Key:\tchar_vo_flybug_idle_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"What is it like down there? Heh?\"\nmsgstr \"下面是什麼樣子的？\"\n\n#. Key:\tchar_vo_flybug_idle_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Easy man, easy!\"\nmsgstr \"小伙子，放輕鬆！\"\n\n#. Key:\tchar_vo_gatekeeper_attack_aimed\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Avoid these!\"\nmsgstr \"避開那些！\"\n\n#. Key:\tchar_vo_gatekeeper_attack_aimed_phase_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Watch out where you bounce to!\"\nmsgstr \"當心你會跳去的地方！\"\n\n#. Key:\tchar_vo_gatekeeper_attack_electric_bubbles\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Attention to the heights!\"\nmsgstr \"註意高度!\"\n\n#. Key:\tchar_vo_gatekeeper_attack_electric_bubbles_phase_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Attention to the heights again!\"\nmsgstr \"再次註意高度!\"\n\n#. Key:\tchar_vo_gatekeeper_attack_meteors\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Watch out for your head!\"\nmsgstr \"小心妳的頭!\"\n\n#. Key:\tchar_vo_gatekeeper_attack_shield\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Do you really think you are worthy?\"\nmsgstr \"妳真的認為自己有價值嗎?\"\n\n#. Key:\tchar_vo_ghostarmor__die\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I... don't...\"\nmsgstr \"我.. 不...\"\n\n#. Key:\tchar_vo_ghostarmor_attack_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"You shall perish!\"\nmsgstr \"下地獄吧！\"\n\n#. Key:\tchar_vo_ghostarmor_attack_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"For justice!\"\nmsgstr \"為了正義！\"\n\n#. Key:\tchar_vo_ghostarmor_attack_fall\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Death to the outlaw!\"\nmsgstr \"亡命之徒！\"\n\n#. Key:\tchar_vo_ghostarmor_damaged_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Just a scratch.\"\nmsgstr \"壹點皮毛傷。\"\n\n#. Key:\tchar_vo_ghostarmor_damaged_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"You... can't.\"\nmsgstr \"妳... 不能...\"\n\n#. Key:\tchar_vo_ghostarmor_idle_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"We keep the Wall.\"\nmsgstr \"我們守著這堵墻。\"\n\n#. Key:\tchar_vo_ghostarmor_idle_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Follow the rules!\"\nmsgstr \"遵守規則！\"\n\n#. Key:\tchar_vo_ghosthelmet_attack_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Aaaaaaargh!\"\nmsgstr \"啊！\"\n\n#. Key:\tchar_vo_ghosthelmet_attack_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Chaaaaaarge!\"\nmsgstr \"補給！\"\n\n#. Key:\tchar_vo_ghosthelmet_damaged_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I'll need a blacksmith!\"\nmsgstr \"我需要壹個鐵匠！\"\n\n#. Key:\tchar_vo_ghosthelmet_damaged_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Send someone for a hammer!\"\nmsgstr \"派人去拿把錘子來！\"\n\n#. Key:\tchar_vo_ghosthelmet_die\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Be right back!\"\nmsgstr \"馬上回來！\"\n\n#. Key:\tchar_vo_ghosthelmet_idle_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Use your head... or mine!\"\nmsgstr \"用妳的頭……我的也行！\"\n\n#. Key:\tchar_vo_ghosthelmet_idle_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Let's head east!\"\nmsgstr \"向東前進！\"\n\n#. Key:\tchar_vo_gnory_idle_humming\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Humming\"\nmsgstr \"嗡嗡聲\"\n\n#. Key:\tchar_vo_gnory_idle_whistle\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Whistling\"\nmsgstr \"哨聲\"\n\n#. Key:\tchar_vo_golemmaker_idle_explain_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I create essence which resists the ruin.\"\nmsgstr \"我創造了抵抗毀滅的精髓。\"\n\n#. Key:\tchar_vo_golemmaker_idle_mindlessly_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Knowledge is Lost, All is Lost.\"\nmsgstr \"不學無術，壹無所有。\"\n\n#. Key:\tchar_vo_golemmaker_idle_mindlessly_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"All is Lost.\"\nmsgstr \"壹無所有。\"\n\n#. Key:\tchar_vo_golemmaker_idle_moan_aaahhh\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Aaahhh\"\nmsgstr \"啊~~~\"\n\n#. Key:\tchar_vo_golemmaker_idle_moan_ooohhh\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Ooohhh\"\nmsgstr \"噢~~~\"\n\n#. Key:\tchar_vo_golemmaker_idle_sad_onon\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#. Localization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Onon\"\nmsgstr \"喲\"\n\n#. Key:\tchar_vo_golemmaker_idle_tries_to_remember\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Your words remind me of something.\"\nmsgstr \"妳的話讓我想起了壹件事。\"\n\n#. Key:\tchar_vo_koboldchef_idle_01\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Too hot!\"\nmsgstr \"太熱了！\"\n\n#. Key:\tchar_vo_koboldchef_idle_02\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"It needs more salt!\"\nmsgstr \"它需要更多的鹽！\"\n\n#. Key:\tchar_vo_koboldchef_idle_03\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"It will be delicious.\"\nmsgstr \"壹定很美味。\"\n\n#. Key:\tchar_vo_koboldchef_idle_04\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Hmm...\"\nmsgstr \"嗯...\"\n\n#. Key:\tchar_vo_lory_idle_croon\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Croon\"\nmsgstr \"低吟\"\n\n#. Key:\tchar_vo_lory_idle_humming_0\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Ohh\"\nmsgstr \"噢\"\n\n#. Key:\tchar_vo_lory_idle_humming_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#. Key:\tchar_vo_supperdwarf_idle_2_humming_1\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Hmmm\"\nmsgstr \"嗯...\"\n\n#. Key:\tchar_vo_lory_idle_humming_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Ommm\"\nmsgstr \"喔...\"\n\n#. Key:\tchar_vo_lory_idle_humming_3\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Auch\"\nmsgstr \"呼\"\n\n#. Key:\tchar_vo_maintainer_attack_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Dinner is served!\"\nmsgstr \"晚餐已就緒！\"\n\n#. Key:\tchar_vo_maintainer_attack_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Now it's clean!\"\nmsgstr \"現在它可幹凈了！\"\n\n#. Key:\tchar_vo_maintainer_damaged_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I'll need to be repaired.\"\nmsgstr \"我需要得到修理。\"\n\n#. Key:\tchar_vo_maintainer_damaged_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I still serve.\"\nmsgstr \"我依然提供服務。\"\n\n#. Key:\tchar_vo_maintainer_die\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I'll need... replacement.\"\nmsgstr \"我需要... 更換。\"\n\n#. Key:\tchar_vo_maintainer_elite_idle_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Serve...\"\nmsgstr \"上菜...\"\n\n#. Key:\tchar_vo_maintainer_elite_idle_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Order...\"\nmsgstr \"點菜...\"\n\n#. Key:\tchar_vo_maintainer_idle_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"At your service.\"\nmsgstr \"樂意效勞。\"\n\n#. Key:\tchar_vo_maintainer_idle_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Your order?\"\nmsgstr \"妳的命令嗎？\"\n\n#. Key:\tchar_vo_maintainer_miniboss_attack_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"This is my order!\"\nmsgstr \"這是我的命令！\"\n\n#. Key:\tchar_vo_maintainer_miniboss_attack_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I'll reorganize!\"\nmsgstr \"我要重整旗鼓!\"\n\n#. Key:\tchar_vo_maintainer_miniboss_attack_meteor\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I'm above!\"\nmsgstr \"我在上面！\"\n\n#. Key:\tchar_vo_maintainer_miniboss_attack_spawn_enemy\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Order, order, order!\"\nmsgstr \"命令，命令，命令！\"\n\n#. Key:\tchar_vo_maintainer_miniboss_damaged_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I can fix this\"\nmsgstr \"我可以解決這個問題\"\n\n#. Key:\tchar_vo_maintainer_miniboss_damaged_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Don't do that again!\"\nmsgstr \"別再這樣做了!\"\n\n#. Key:\tchar_vo_maintainer_miniboss_die\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I can't... I was... above.\"\nmsgstr \"我不能... 我在... 上面。\"\n\n#. Key:\tchar_vo_primitivefishy_attack_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Srrrr!\"\nmsgstr \"呃!\"\n\n#. Key:\tchar_vo_primitivefishy_attack_long_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Hurray!\"\nmsgstr \"萬歲！\"\n\n#. Key:\tchar_vo_primitivefishy_attack_long_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Flyyyyyyy!\"\nmsgstr \"飛起！\"\n\n#. Key:\tchar_vo_primitivefishy_damaged_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Uuush!\"\nmsgstr \"噓！\"\n\n#. Key:\tchar_vo_primitivefishy_damaged_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Shish!\"\nmsgstr \"烤肉！\"\n\n#. Key:\tchar_vo_primitivefishy_die\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Fishy leaves.\"\nmsgstr \"可疑的樹葉。\"\n\n#. Key:\tchar_vo_primitivefishy_idle_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I need some fish!\"\nmsgstr \"我需要壹些魚!\"\n\n#. Key:\tchar_vo_primitivefishy_idle_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Did you hear that?\"\nmsgstr \"妳聽到了嗎?\"\n\n#. Key:\tchar_vo_shade_attack_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Join me!\"\nmsgstr \"加入我！\"\n\n#. Key:\tchar_vo_shade_attack_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"You shall die too!\"\nmsgstr \"妳也會死的！\"\n\n#. Key:\tchar_vo_shade_damaged_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Is this the end?\"\nmsgstr \"結束了嗎？\"\n\n#. Key:\tchar_vo_shade_damaged_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Pain...\"\nmsgstr \"痛...\"\n\n#. Key:\tchar_vo_shade_die\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Death... again?!\"\nmsgstr \"又是... 死亡？！\"\n\n#. Key:\tchar_vo_shade_idle_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I can't rest.\"\nmsgstr \"我不能休息。\"\n\n#. Key:\tchar_vo_shade_idle_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Death is not peace.\"\nmsgstr \"死亡不代表和平。\"\n\n#. Key:\tchar_vo_shadesphere_attack_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I'll change you!\"\nmsgstr \"我會改變妳的！\"\n\n#. Key:\tchar_vo_shadesphere_attack_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Do not resist me!\"\nmsgstr \"不要反抗我！\"\n\n#. Key:\tchar_vo_shadesphere_damaged_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"It's still... me...\"\nmsgstr \"還是... 我...\"\n\n#. Key:\tchar_vo_shadesphere_damaged_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Why did you...?\"\nmsgstr \"妳為什麽...？\"\n\n#. Key:\tchar_vo_shadesphere_die\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"You changed... me?\"\nmsgstr \"妳把我... 修改了嗎？\"\n\n#. Key:\tchar_vo_shadesphere_idle_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"What do you wish to be?\"\nmsgstr \"妳想成為什麽？\"\n\n#. Key:\tchar_vo_shadesphere_idle_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Come to me!\"\nmsgstr \"到我這兒來！\"\n\n#. Key:\tchar_vo_supperdwarf_idle_1_eating_food_0\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Yum-yum hmmmm... delicious\"\nmsgstr \"吧唧吧唧... 真美味\"\n\n#. Key:\tchar_vo_supperdwarf_idle_1_eating_food_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Hmmm... tasty\"\nmsgstr \"嗯.... 好吃\"\n\n#. Key:\tchar_vo_supperdwarf_idle_1_eating_food_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Ehmmm... where is my spoon?\"\nmsgstr \"嗯.... 我的湯匙在哪兒？\"\n\n#. Key:\tchar_vo_supperdwarf_idle_2_humming_0\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Ehemm, ehemm\"\nmsgstr \"啦啦啦~\"\n\n#. Key:\tchar_vo_supperdwarf_idle_2_humming_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Ohm\"\nmsgstr \"噢~\"\n\n#. Key:\tchar_vo_teachy_idle_book_down_0\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Walking ball?\"\nmsgstr \"走路的球？\"\n\n#. Key:\tchar_vo_teachy_idle_book_down_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"You?\"\nmsgstr \"是你？\"\n\n#. Key:\tchar_vo_teachy_idle_book_down_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Do you exist outside of my mind?\"\nmsgstr \"你存在於我的腦海之外嗎？\"\n\n#. Key:\tchar_vo_teachy_idle_book_down_3\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Ehm, what?\"\nmsgstr \"嗯，什麼？\"\n\n#. Key:\tchar_vo_teachy_idle_book_up_0\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Ehmm\"\nmsgstr \"嗯\"\n\n#. Key:\tchar_vo_teachy_idle_book_up_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Humm\"\nmsgstr \"哈\"\n\n#. Key:\tchar_vo_teachy_idle_book_up_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Hemm\"\nmsgstr \"嘿\"\n\n#. Key:\tchar_vo_teachy_idle_book_up_3\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Ahm\"\nmsgstr \"啊\"\n\n#. Key:\tchar_vo_teachy_idle_humming_0\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Hmmm-hmmm-hmm\"\nmsgstr \"嗯-嗯-嗯\"\n\n#. Key:\tchar_vo_teachy_idle_humming_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Ehmm-hmmm-uhmm\"\nmsgstr \"嗯-哈-嘿\"\n\n#. Key:\tchar_vo_teachy_idle_humming_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Umm-huhummm\"\nmsgstr \"唔-咳\"\n\n#. Key:\tchar_vo_teachy_idle_humming_speaking_long_0\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I am, therefore I think!\"\nmsgstr \"是我，所以我想！\"\n\n#. Key:\tchar_vo_teachy_idle_humming_speaking_long_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"I think... I am...\"\nmsgstr \"我想... 我是...\"\n\n#. Key:\tchar_vo_teachy_idle_humming_speaking_long_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"The unexamined life is not worth living!\"\nmsgstr \"缺乏考驗的生活是沒有價值的！\"\n\n#. Key:\tchar_vo_teachy_idle_humming_speaking_long_3\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"The mind is furnished with ideas by a drunk upholsterer...\"\nmsgstr \"這個頭腦裝滿了來自一個醉醺醺的裝飾工提供的各種想法……\"\n\n#. Key:\tchar_vo_teachy_idle_humming_speaking_short_0\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Tic-tac\"\nmsgstr \"嘀嗒，嘀嗒\"\n\n#. Key:\tchar_vo_teachy_idle_humming_speaking_short_1\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"To be...\"\nmsgstr \"...\"\n\n#. Key:\tchar_vo_teachy_idle_humming_speaking_short_2\n#. SourceLocation:\tLocalization/StringTables/FloatingEnemyAndNPCLines.csv\n#: Localization/StringTables/FloatingEnemyAndNPCLines.csv\nmsgctxt \"FloatingEnemyAndNPCLines\"\nmsgid \"Weird\"\nmsgstr \"奇怪\"\n\n#. Key:\tAnyKey\n#. SourceLocation:\tSource/SOrb/Settings/Input/SoInputNames.cpp:347\n#: Source/SOrb/Settings/Input/SoInputNames.cpp:347\nmsgctxt \"InputKeys\"\nmsgid \"Any Key\"\nmsgstr \"任意鍵\"\n\n#. Key:\tDown\n#. SourceLocation:\tSource/SOrb/Settings/Input/SoInputNames.cpp:376\n#: Source/SOrb/Settings/Input/SoInputNames.cpp:376\nmsgctxt \"InputKeys\"\nmsgid \"Down\"\nmsgstr \"下\"\n\n#. Key:\tLeft\n#. SourceLocation:\tSource/SOrb/Settings/Input/SoInputNames.cpp:373\n#: Source/SOrb/Settings/Input/SoInputNames.cpp:373\nmsgctxt \"InputKeys\"\nmsgid \"Left\"\nmsgstr \"左\"\n\n#. Key:\tRight\n#. SourceLocation:\tSource/SOrb/Settings/Input/SoInputNames.cpp:375\n#: Source/SOrb/Settings/Input/SoInputNames.cpp:375\nmsgctxt \"InputKeys\"\nmsgid \"Right\"\nmsgstr \"右\"\n\n#. Key:\tUp\n#. SourceLocation:\tSource/SOrb/Settings/Input/SoInputNames.cpp:374\n#: Source/SOrb/Settings/Input/SoInputNames.cpp:374\nmsgctxt \"InputKeys\"\nmsgid \"Up\"\nmsgstr \"上\"\n\n#. Key:\tabsorb_energy\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Absorb Energy\"\nmsgstr \"吸收能量\"\n\n#. Key:\tacquired_few_item\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"message when more than one item is received at once\"\n#. once\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"A few items acquired\"\nmsgstr \"獲得壹些物品\"\n\n#. Key:\tacquired_item\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"{0} is replaced with an item name\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"{0} acquired\"\nmsgstr \"獲得 {0}\"\n\n#. Key:\tactivate\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Activate\"\nmsgstr \"激活\"\n\n#. Key:\tactivate_elevator\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Activate Elevator\"\nmsgstr \"激活電梯\"\n\n#. Key:\taquired_silver_key\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"optional bonus message\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Silver Key Acquired\"\nmsgstr \"獲得銀鑰匙\"\n\n#. Key:\tascend\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"climb up a ladder or rope or go up with an elevator\"\n#. elevator\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Ascend\"\nmsgstr \"使用\"\n\n#. Key:\tbed\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"examine Bed\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Bed\"\nmsgstr \"床\"\n\n#. Key:\tboat_to_kitchen\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"use a boat to get to the kitchen\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Boat to the Kitchen\"\nmsgstr \"乘船去廚房\"\n\n#. Key:\tboat_to_ruins\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"use a boat to get to a place where there are some ancient ruins\"\n#. some ancient ruins\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Boat to the Ruins\"\nmsgstr \"乘船去廢墟\"\n\n#. Key:\tboat_to_station\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"use a boat to get to the Station\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Boat to the Station\"\nmsgstr \"乘船去車站\"\n\n#. Key:\tcall_elevator\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Call Elevator\"\nmsgstr \"呼叫電梯\"\n\n#. Key:\tcandles\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"examine Candles\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Candles\"\nmsgstr \"蠟燭\"\n\n#. Key:\tcat_bed\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"examine Tabbys (cat name) bed\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Tabby's Bed\"\nmsgstr \"泰比的床\"\n\n#. Key:\tchair\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"examine Chair\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Chair\"\nmsgstr \"椅子\"\n\n#. Key:\tchange_spells\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Change Spells\"\nmsgstr \"改變法術\"\n\n#. Key:\tcharge\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"charge gem in Act I\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Charge\"\nmsgstr \"充能\"\n\n#. Key:\tcheck_door\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"check door \"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Check Door\"\nmsgstr \"檢查門\"\n\n#. Key:\tchest\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"examine Chest\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Chest\"\nmsgstr \"寶箱\"\n\n#. Key:\tchest_check\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Check Chest\"\nmsgstr \"查看寶箱\"\n\n#. Key:\tchest_check_small\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Check Small Chest\"\nmsgstr \"查看小寶箱\"\n\n#. Key:\tchest_close\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Close Chest\"\nmsgstr \"關閉寶箱\"\n\n#. Key:\tchest_close_small\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Close Small Chest\"\nmsgstr \"關閉小寶箱\"\n\n#. Key:\tchest_open\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Open Chest\"\nmsgstr \"打開寶箱\"\n\n#. Key:\tchest_open_small\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Open Small Chest\"\nmsgstr \"打開小寶箱\"\n\n#. Key:\tclose_door\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Close Door\"\nmsgstr \"關門\"\n\n#. Key:\tcross_planks\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Cross Planks\"\nmsgstr \"橫木板\"\n\n#. Key:\tdads_room\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"examine Dad's Room\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Daddy's Room\"\nmsgstr \"爸爸的房間\"\n\n#. Key:\tdescend\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"climb down a ladder or rope or go down with an elevator\"\n#. elevator\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Descend\"\nmsgstr \"下降\"\n\n#. Key:\tdestroy\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"destroy device in EndFinal level\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Destroy\"\nmsgstr \"毀滅\"\n\n#. Key:\tdevice\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"use Device\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Device\"\nmsgstr \"裝置\"\n\n#. Key:\tdoor\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"examine Door\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Door\"\nmsgstr \"門\"\n\n#. Key:\tdoor_does_not_open_from_this_side\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"message when character tries to open a door but it can only be openned from the other side\"\n#. but it can only be openned from the other side\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Door does not open from this side!\"\nmsgstr \"這扇門無法從這邊打開！\"\n\n#. Key:\tdoor_opened\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"door openned\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Door opened\"\nmsgstr \"門已打開\"\n\n#. Key:\tdrop\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"drop box or carryable\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Drop\"\nmsgstr \"丟棄\"\n\n#. Key:\televator_activated\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Elevator Activated\"\nmsgstr \"電梯已啟動\"\n\n#. Key:\televator_inactive\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"player tries to use the elevator but it is inactive\"\n#. inactive\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"The elevator seems to be inactive\"\nmsgstr \"電梯好像不動了\"\n\n#. Key:\televator_not_move_to_dir\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"player tries to use an elevator but the direction is not activated yet\"\n#. direction is not activated yet\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"The elevator does not move to the selected direction\"\nmsgstr \"電梯不向選定的方向移動\"\n\n#. Key:\tenter\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"teleport - enter a room or a portal\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Enter\"\nmsgstr \"進入\"\n\n#. Key:\tenter_bridge\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Enter Bridge\"\nmsgstr \"進入大橋\"\n\n#. Key:\tenter_cave\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Enter Cave\"\nmsgstr \"進入洞穴\"\n\n#. Key:\tenter_flames\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Enter Flames\"\nmsgstr \"進入烈焰\"\n\n#. Key:\tenter_gate\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Enter Gate\"\nmsgstr \"進入大門\"\n\n#. Key:\tenter_hut\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Enter Hut\"\nmsgstr \"進入小屋\"\n\n#. Key:\tenter_kitchen\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Enter Kitchen\"\nmsgstr \"進入廚房\"\n\n#. Key:\tenter_pipe\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Enter Pipe\"\nmsgstr \"進入管\"\n\n#. Key:\tenter_portal\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Enter Portal\"\nmsgstr \"進入門戶\"\n\n#. Key:\tenter_stairs_left\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Enter Stairs on the Left\"\nmsgstr \"從左邊上樓梯\"\n\n#. Key:\tenter_stairs_right\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Enter Stairs on the Right\"\nmsgstr \"從右邊上樓梯\"\n\n#. Key:\tenter_tower\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Enter Tower\"\nmsgstr \"進入塔\"\n\n#. Key:\tentrace_locked\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Entrance locked from the other side\"\nmsgstr \"入口從另壹邊鎖上了\"\n\n#. Key:\texamine\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"examine a statue or some other interactable object which triggers dialogue or hint message\"\n#. object which triggers dialogue or hint message\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Examine\"\nmsgstr \"檢查\"\n\n#. Key:\texamine_device\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Examine Device\"\nmsgstr \"檢查裝置\"\n\n#. Key:\texamine_elevator\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Examine Elevator\"\nmsgstr \"檢查電梯\"\n\n#. Key:\texamine_switch\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"it is a lightswitch\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Examine Switch\"\nmsgstr \"檢查開關\"\n\n#. Key:\texit\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"exit room\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Exit\"\nmsgstr \"出口\"\n\n#. Key:\texplore_stations\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Explore more stations before using the railway system.\"\nmsgstr \"請在使用鐵路系統之前探索更多的車站。\"\n\n#. Key:\tfinish_demo\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"teleport at the end of demo\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Finish Demo\"\nmsgstr \"完成試玩\"\n\n#. Key:\tfire\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"fires a cannon\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Fire\"\nmsgstr \"開火\"\n\n#. Key:\tgo_down\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"go down the stairs\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Go down\"\nmsgstr \"向下\"\n\n#. Key:\tgo_up\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"go up the stairs\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Go up\"\nmsgstr \"向上\"\n\n#. Key:\tinspect_fountain\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Inspect Fountain\"\nmsgstr \"檢查噴泉\"\n\n#. Key:\tinventory\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"hint for hotkey to open the inventory\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Inventory\"\nmsgstr \"背包\"\n\n#. Key:\tkey_missing\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"{0} is the key name\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Key Missing: {0}\"\nmsgstr \"缺少的鑰匙：{0}\"\n\n#. Key:\tkick_rope\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"a pile of rope can be kicked to be able to climb up/down on it\"\n#. climb up/down on it\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Kick Rope\"\nmsgstr \"踢繩索\"\n\n#. Key:\tlaboratory\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"examine/enter Laboratory\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Laboratory\"\nmsgstr \"實驗室\"\n\n#. Key:\tlamps\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"examine Lamps\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Lamps\"\nmsgstr \"壁燈\"\n\n#. Key:\tleave\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"teleport - leave a room, chest, level\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Leave\"\nmsgstr \"離開\"\n\n#. Key:\tleave_bridge\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Leave Bridge\"\nmsgstr \"離開大橋\"\n\n#. Key:\tleave_cave\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Leave Cave\"\nmsgstr \"離開洞穴\"\n\n#. Key:\tleave_circle\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Leave Circle\"\nmsgstr \"離開圓環\"\n\n#. Key:\tleave_hut\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Leave Hut\"\nmsgstr \"離開小屋\"\n\n#. Key:\tleft_lever\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"use Left Lever\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Left Lever\"\nmsgstr \"左操縱桿\"\n\n#. Key:\tlever_is_active\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Lever activated. The crystal broke.\"\nmsgstr \"操縱桿激活。水晶破碎。\"\n\n#. Key:\tlever_is_inactive\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"a lever\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Seems to be inactive\"\nmsgstr \"似乎沒有啟動\"\n\n#. Key:\tmemory_stone_aquire\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Acquire Memory Stone\"\nmsgstr \"獲取記憶之石\"\n\n#. Key:\tmemory_stone_gained\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Memory Stone Gained\"\nmsgstr \"記憶之石已獲取\"\n\n#. Key:\tmiddle_lever\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"use Middle Lever \"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Middle Lever\"\nmsgstr \"中操縱桿\"\n\n#. Key:\tmoms_room\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"examine Mom's Room\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Mom's Room\"\nmsgstr \"母親的房間\"\n\n#. Key:\tnotebook\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"examine Notebook\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Notebook\"\nmsgstr \"筆記本\"\n\n#. Key:\topen\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"door can be openned\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Open\"\nmsgstr \"打開\"\n\n#. Key:\topen_door\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Open Door\"\nmsgstr \"打開門\"\n\n#. Key:\tpainting\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"examine Painting\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Painting\"\nmsgstr \"繪畫\"\n\n#. Key:\tpaintings\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"examine Paintings\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Paintings\"\nmsgstr \"繪畫\"\n\n#. Key:\tpass_bridge\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Pass Bridge\"\nmsgstr \"過橋\"\n\n#. Key:\tpick_up\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"pick up box or carryable\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Pick Up\"\nmsgstr \"撿起\"\n\n#. Key:\tplace_rope\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Place Rope\"\nmsgstr \"把繩子\"\n\n#. Key:\tprimary_strike\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"hint with control key for strike 1 of the character\"\n#. character\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Primary Strike\"\nmsgstr \"常規攻擊\"\n\n#. Key:\tpull\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"pull a lever\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Pull\"\nmsgstr \"拉\"\n\n#. Key:\tpull_lever\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Pull Lever\"\nmsgstr \"拉動操縱桿\"\n\n#. Key:\tpush\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"push a sphere shaped rock from the edge to break some stuff\"\n#. break some stuff\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Push\"\nmsgstr \"推\"\n\n#. Key:\tput_weapon_away\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"hint with control key to show how to put the weapon away\"\n#. weapon away\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Put Weapon Away\"\nmsgstr \"收集武器\"\n\n#. Key:\tread\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"interaction hint if the character can read a scroll or book\"\n#. scroll or book\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Read\"\nmsgstr \"閱讀\"\n\n#. Key:\tread_dictionary\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Read Dictionary\"\nmsgstr \"閱讀字典\"\n\n#. Key:\tread_symbols\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Read Symbols\"\nmsgstr \"讀取符號\"\n\n#. Key:\trelease_keeper\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Release Keeper\"\nmsgstr \"釋放守護者\"\n\n#. Key:\treplay_boss_fight\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"interaction hint to play a boss fight which was already won\"\n#. was already won\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Replay Boss Fight\"\nmsgstr \"重玩Boss戰\"\n\n#. Key:\treset_portals\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"lever\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Reset Portals\"\nmsgstr \"重設傳送門\"\n\n#. Key:\trest\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"rest near a checkpoint statue where character can sleep and change spells and listen to music\"\n#. can sleep and change spells and listen to music\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Rest\"\nmsgstr \"休息\"\n\n#. Key:\trestore\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"restore the HP\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Restore\"\nmsgstr \"恢復\"\n\n#. Key:\tright_lever\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"use Right Lever\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Right Lever\"\nmsgstr \"右操縱桿\"\n\n#. Key:\tring_bell\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"there is a bell the character has to use to start the conversation with a merchant\"\n#. start the conversation with a merchant\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Ring the bell\"\nmsgstr \"按鈴\"\n\n#. Key:\trope_can_be_placed\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"A rope could be placed here\"\nmsgstr \"這裏可以放置繩索\"\n\n#. Key:\trope_kicked\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"feedback on the kick rope action\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Rope kicked\"\nmsgstr \"繩索被踢走了\"\n\n#. Key:\trope_placed\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Rope placed\"\nmsgstr \"繩索已放置\"\n\n#. Key:\tsail\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"use ship for travel\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Sail\"\nmsgstr \"風帆\"\n\n#. Key:\tsoulkeeper_released\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Soulkeeper released\"\nmsgstr \"靈魂守護者已釋放\"\n\n#. Key:\tspecial_strike\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"hint with control key for strike 2 of the character\"\n#. character\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Special Strike\"\nmsgstr \"特殊攻擊\"\n\n#. Key:\tstairs\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"enter stairs\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Stairs\"\nmsgstr \"樓梯\"\n\n#. Key:\tstone_added\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"{0} is the stone amount, {1} is the stone name\"\n#. name\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"{0} {1} added to your bag!\"\nmsgstr \"{0}{1}添加至背包中!\"\n\n#. Key:\tstone_cant_carry\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"{0} is the stone name\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"You can't carry more {0}\"\nmsgstr \"妳攜帶不了更多的{0}\"\n\n#. Key:\tstone_cant_store\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"{0} is the stone name\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"You don't have anything you could use to store {0}\"\nmsgstr \"妳沒有任何東西可以用來存儲{0}\"\n\n#. Key:\tswing\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"Swings on the pole with the arms\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Swing\"\nmsgstr \"搖擺不定的\"\n\n#. Key:\tswitch_interact\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"Switch interact alternative,  between the two modes\"\n#. modes\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Switch\"\nmsgstr \"開關\"\n\n#. Key:\ttake\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"character can take an item\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Take\"\nmsgstr \"取走\"\n\n#. Key:\ttake_a_seat\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Take a seat\"\nmsgstr \"坐下\"\n\n#. Key:\ttake_abacus\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Take Abacus\"\nmsgstr \"取走算盤\"\n\n#. Key:\ttake_all\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Take All\"\nmsgstr \"取走所有物品\"\n\n#. Key:\ttake_axe\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"character can take a weapon\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Take Axe\"\nmsgstr \"取走斧子\"\n\n#. Key:\ttake_blades\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"character can take two swords to go dual wield\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Take Blades\"\nmsgstr \"取走刃劍\"\n\n#. Key:\ttake_books\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"character can take (two) books\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Take Books\"\nmsgstr \"取走書籍\"\n\n#. Key:\ttake_mace\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"character can take a weapon\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Take Mace\"\nmsgstr \"取走權杖\"\n\n#. Key:\ttake_mushrooms\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Take Mushrooms\"\nmsgstr \"取走蘑菇\"\n\n#. Key:\ttake_rope\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Take Rope\"\nmsgstr \"取走繩索\"\n\n#. Key:\ttake_sabre\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"character can take a weapon\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Take Sabre\"\nmsgstr \"取走軍刀\"\n\n#. Key:\ttake_spellcaster\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"the Spellcaster is an amulet the character can use to cast spells\"\n#. use to cast spells\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Take Spellcaster\"\nmsgstr \"取走施法物\"\n\n#. Key:\ttake_stones\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Take Stones\"\nmsgstr \"取走石頭\"\n\n#. Key:\ttake_sword\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"character can take a weapon\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Take Sword\"\nmsgstr \"取走寶劍\"\n\n#. Key:\ttake_wheel\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Take Wheel\"\nmsgstr \"取走輪子\"\n\n#. Key:\ttalk\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Talk\"\nmsgstr \"交談\"\n\n#. Key:\ttoggle_switch\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"it is a lightswitch\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Toggle Switch\"\nmsgstr \"撥動開關\"\n\n#. Key:\ttouch_statue\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Touch Statue\"\nmsgstr \"觸摸塑像\"\n\n#. Key:\ttravel\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"travel on the train station path\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Travel\"\nmsgstr \"旅行\"\n\n#. Key:\tunlocked_with\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"{0} is the key name\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Unlocked with {0}\"\nmsgstr \"用  {0} 解鎖\"\n\n#. Key:\tuse\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"use device in EndFinal level\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Use\"\nmsgstr \"使用\"\n\n#. Key:\tuse_active_item\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"uses the active item\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Use Active Item\"\nmsgstr \"使用激活的物品\"\n\n#. Key:\tuse_crystal\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Use Crystal\"\nmsgstr \"使用水晶\"\n\n#. Key:\tuse_destroy_explained\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Destroy the device to save the creatures of Ruined Realm\"\nmsgstr \"摧毀這個裝置來拯救毀滅王國的生物\"\n\n#. Key:\tuse_device\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Use Device\"\nmsgstr \"使用裝置\"\n\n#. Key:\tuse_elevator\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Use Elevator\"\nmsgstr \"使用電梯\"\n\n#. Key:\tuse_elevator_gem\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Use Elevator Gem\"\nmsgstr \"使用電梯的寶石\"\n\n#. Key:\tuse_magic_mirror\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Use Magic Mirror\"\nmsgstr \"使用魔鏡\"\n\n#. Key:\tuse_separate_explained\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Use the device to separate the Realms\"\nmsgstr \"使用這個裝置將王國進行分離\"\n\n#. Key:\tuse_switch\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"for the moria gate\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Use switch\"\nmsgstr \"使用開關\"\n\n#. Key:\tuse_workshop\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Use Workshop\"\nmsgstr \"使用工坊\"\n\n#. Key:\twheel_release\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"release lever wheel\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Release\"\nmsgstr \"釋放\"\n\n#. Key:\twheel_turn\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"turn lever wheel\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Turn\"\nmsgstr \"轉\"\n\n#. Key:\twindow\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"examine Window\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Window\"\nmsgstr \"窗口\"\n\n#. Key:\tworkroom\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"examine/enter Workroom\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"Workroom\"\nmsgstr \"工作室\"\n\n#. Key:\tyou_are_worthy\n#. SourceLocation:\tLocalization/StringTables/Interaction.csv\n#. InfoMetaData:\t\"Comment\" : \"gate golem tutorial level message interaction\"\n#: Localization/StringTables/Interaction.csv\nmsgctxt \"Interaction\"\nmsgid \"You are not worthy!\"\nmsgstr \"妳不配!\"\n\n#. Key:\tice_stone_Name\n#. SourceLocation:\tLocalization/StringTables/Items.csv\n#: Localization/StringTables/Items.csv\nmsgctxt \"Items\"\nmsgid \"Ice Stone\"\nmsgstr \"冰石\"\n\n#. Key:\ttest_stone_name\n#. SourceLocation:\tLocalization/StringTables/Items.csv\n#: Localization/StringTables/Items.csv\nmsgctxt \"Items\"\nmsgid \"Test Stone\"\nmsgstr \"試煉之石\"\n\n#. Key:\tbook\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:494\n#: Source/SOrb/Basic/SoGameSingleton.cpp:494\nmsgctxt \"ItemsCommon\"\nmsgid \"Something to read\"\nmsgstr \"可讀內容\"\n\n#. Key:\tcooldown\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:501\n#: Source/SOrb/Basic/SoGameSingleton.cpp:501\nmsgctxt \"ItemsCommon\"\nmsgid \"Cooldown\"\nmsgstr \"冷卻\"\n\n#. Key:\tcrossbow\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:487\n#: Source/SOrb/Basic/SoGameSingleton.cpp:487\nmsgctxt \"ItemsCommon\"\nmsgid \"Something to shoot with\"\nmsgstr \"可以用來射擊的東西\"\n\n#. Key:\tdefensive\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:472\n#: Source/SOrb/Basic/SoGameSingleton.cpp:472\nmsgctxt \"ItemsCommon\"\nmsgid \"Shard of Protection\"\nmsgstr \"保護碎片\"\n\n#. Key:\tdualwield\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:480\n#: Source/SOrb/Basic/SoGameSingleton.cpp:480\nmsgctxt \"ItemsCommon\"\nmsgid \"Dual Wield Weapon\"\nmsgstr \"雙持武器\"\n\n#. Key:\thealth\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:498\n#: Source/SOrb/Basic/SoGameSingleton.cpp:498\nmsgctxt \"ItemsCommon\"\nmsgid \"Health\"\nmsgstr \"生命值\"\n\n#. Key:\tinvalid_shard_max\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:475\n#: Source/SOrb/Basic/SoGameSingleton.cpp:475\nmsgctxt \"ItemsCommon\"\nmsgid \"Invalid\"\nmsgstr \"無效的\"\n\n#. Key:\tinvalid_weapon_max\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:481\n#: Source/SOrb/Basic/SoGameSingleton.cpp:481\nmsgctxt \"ItemsCommon\"\nmsgid \"Invalid Weapon\"\nmsgstr \"無效武器\"\n\n#. Key:\titem\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:492\n#. Key:\tkeylikeitem\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:491\n#: Source/SOrb/Basic/SoGameSingleton.cpp:491\n#: Source/SOrb/Basic/SoGameSingleton.cpp:492\nmsgctxt \"ItemsCommon\"\nmsgid \"Something interesting\"\nmsgstr \"有趣的事物\"\n\n#. Key:\tjewelry\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:469\n#: Source/SOrb/Basic/SoGameSingleton.cpp:469\nmsgctxt \"ItemsCommon\"\nmsgid \"Valuable\"\nmsgstr \"有價值的\"\n\n#. Key:\tkey\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:466\n#: Source/SOrb/Basic/SoGameSingleton.cpp:466\nmsgctxt \"ItemsCommon\"\nmsgid \"Key\"\nmsgstr \"鑰匙\"\n\n#. Key:\tMemoryStone\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:465\n#: Source/SOrb/Basic/SoGameSingleton.cpp:465\nmsgctxt \"ItemsCommon\"\nmsgid \"Memory Stone\"\nmsgstr \"記憶石\"\n\n#. Key:\toffensive\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:473\n#: Source/SOrb/Basic/SoGameSingleton.cpp:473\nmsgctxt \"ItemsCommon\"\nmsgid \"Shard of Justice\"\nmsgstr \"正義碎片\"\n\n#. Key:\tonehanded\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:478\n#: Source/SOrb/Basic/SoGameSingleton.cpp:478\nmsgctxt \"ItemsCommon\"\nmsgid \"One-Handed Weapon\"\nmsgstr \"單手武器\"\n\n#. Key:\tpotion\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:484\n#: Source/SOrb/Basic/SoGameSingleton.cpp:484\nmsgctxt \"ItemsCommon\"\nmsgid \"Something to drink\"\nmsgstr \"能喝的東西\"\n\n#. Key:\tQuestItem\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:464\n#: Source/SOrb/Basic/SoGameSingleton.cpp:464\nmsgctxt \"ItemsCommon\"\nmsgid \"Quest Item\"\nmsgstr \"任務物品\"\n\n#. Key:\tRuneStone\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:467\n#: Source/SOrb/Basic/SoGameSingleton.cpp:467\nmsgctxt \"ItemsCommon\"\nmsgid \"Runestone\"\nmsgstr \"符石\"\n\n#. Key:\tshard\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:462\n#: Source/SOrb/Basic/SoGameSingleton.cpp:462\nmsgctxt \"ItemsCommon\"\nmsgid \"Shard\"\nmsgstr \"碎片\"\n\n#. Key:\tsomething_unlock\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:490\n#: Source/SOrb/Basic/SoGameSingleton.cpp:490\nmsgctxt \"ItemsCommon\"\nmsgid \"Something to unlock with\"\nmsgstr \"可用來解鎖的東西\"\n\n#. Key:\tspecial\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:474\n#: Source/SOrb/Basic/SoGameSingleton.cpp:474\nmsgctxt \"ItemsCommon\"\nmsgid \"Shard of Wonder\"\nmsgstr \"奇跡碎片\"\n\n#. Key:\tspeed\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:497\n#: Source/SOrb/Basic/SoGameSingleton.cpp:497\nmsgctxt \"ItemsCommon\"\nmsgid \"Attack Speed\"\nmsgstr \"攻擊速度\"\n\n#. Key:\tspell\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:486\n#: Source/SOrb/Basic/SoGameSingleton.cpp:486\nmsgctxt \"ItemsCommon\"\nmsgid \"Something to cast with\"\nmsgstr \"可用來施法的東西\"\n\n#. Key:\tspellcapacitycost\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:499\n#: Source/SOrb/Basic/SoGameSingleton.cpp:499\nmsgctxt \"ItemsCommon\"\nmsgid \"Capacity Cost\"\nmsgstr \"能力消耗\"\n\n#. Key:\tspellusagecount\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:500\n#: Source/SOrb/Basic/SoGameSingleton.cpp:500\nmsgctxt \"ItemsCommon\"\nmsgid \"Charge\"\nmsgstr \"補給\"\n\n#. Key:\tthrowable\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:485\n#: Source/SOrb/Basic/SoGameSingleton.cpp:485\nmsgctxt \"ItemsCommon\"\nmsgid \"Something to throw\"\nmsgstr \"可扔的東西\"\n\n#. Key:\ttwohanded\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:479\n#: Source/SOrb/Basic/SoGameSingleton.cpp:479\nmsgctxt \"ItemsCommon\"\nmsgid \"Two-Handed Weapon\"\nmsgstr \"雙手武器\"\n\n#. Key:\tusable\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:463\n#: Source/SOrb/Basic/SoGameSingleton.cpp:463\nmsgctxt \"ItemsCommon\"\nmsgid \"Usable\"\nmsgstr \"可用的\"\n\n#. Key:\tweapon\n#. SourceLocation:\tSource/SOrb/Basic/SoGameSingleton.cpp:468\n#: Source/SOrb/Basic/SoGameSingleton.cpp:468\nmsgctxt \"ItemsCommon\"\nmsgid \"Weapon\"\nmsgstr \"武器\"\n\n#. Key:\tmus1_combat_1_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(6).MusicMap.DisplayName\n#. /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(6).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(6).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Disfunctional Golems\"\nmsgstr \"失效的機器人\"\n\n#. Key:\tmus1_combat_2_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(16).MusicMap.DisplayName\n#. /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(16).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(16).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Machine Rage\"\nmsgstr \"機器的憤怒\"\n\n#. Key:\tmus1_combat_GateKeeper_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(2).MusicMap.DisplayName\n#. /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(2).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(2).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Worthy\"\nmsgstr \"有價值的\"\n\n#. Key:\tmus1_dlg_Generic_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(7).MusicMap.DisplayName\n#. /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(7).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(7).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Unexpected Friend\"\nmsgstr \"意想不到的朋友\"\n\n#. Key:\tmus1_dlg_Golem_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(9).MusicMap.DisplayName\n#. /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(9).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(9).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Duty\"\nmsgstr \"責任\"\n\n#. Key:\tmus1_dlg_Lory_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(8).MusicMap.DisplayName\n#. /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(8).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(8).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"The other Bell\"\nmsgstr \"另壹只鐘\"\n\n#. Key:\tmus1_dlg_Monk_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(10).MusicMap.DisplayName\n#. /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(10).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(10).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Enlightened Mind\"\nmsgstr \"開明的思想\"\n\n#. Key:\tmus1_dlg_Raven_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(11).MusicMap.DisplayName\n#. /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(11).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(11).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Winged Wisdom\"\nmsgstr \"長翅膀的智者\"\n\n#. Key:\tmus1_dlg_SewerCreature_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(32).MusicMap.DisplayName\n#. /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(32).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(32).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Pipe Walkers\"\nmsgstr \"管道行走者\"\n\n#. Key:\tmus1_dlg_Teachy_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(12).MusicMap.DisplayName\n#. /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(12).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(12).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Just a bit crazy\"\nmsgstr \"有點瘋狂\"\n\n#. Key:\tmus1_env_AncientArcade_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(1).MusicMap.DisplayName\n#. /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(1).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(1).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Remnant Colors\"\nmsgstr \"剩余的顏色\"\n\n#. Key:\tmus1_env_GreyGate_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(5).MusicMap.DisplayName\n#. /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(5).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(5).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Touch of Ruin\"\nmsgstr \"毀滅之觸\"\n\n#. Key:\tmus1_env_SecondArcade_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(17).MusicMap.DisplayName\n#. /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(17).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(17).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"In Memoriam\"\nmsgstr \"悼念\"\n\n#. Key:\tmus1_env_TutorialLevel_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(3).MusicMap.DisplayName\n#. /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(3).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(3).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Sunken Sewer\"\nmsgstr \"沈沒的下水道\"\n\n#. Key:\tmus2_combat_catacombs_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(18).MusicMap.DisplayName\n#. /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(18).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(18).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Armours of the Deep\"\nmsgstr \"深處的鎧甲\"\n\n#. Key:\tmus2_combat_DwarvenBoss_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(19).MusicMap.DisplayName\n#. /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(19).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(19).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"I hold it back\"\nmsgstr \"我忍住了\"\n\n#. Key:\tmus2_combat_LavaBoss_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(20).MusicMap.DisplayName\n#. /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(20).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(20).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Meant to be Perfect\"\nmsgstr \"註定完美\"\n\n#. Key:\tmus2_combat_WrackedWaterpath_2_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(22).MusicMap.DisplayName\n#. /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(22).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(22).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Wracked Warriors\"\nmsgstr \"受盡折磨的勇士\"\n\n#. Key:\tmus2_combat_WrackedWaterpath_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(21).MusicMap.DisplayName\n#. /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(21).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(21).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Those who survived\"\nmsgstr \"那些幸存者們\"\n\n#. Key:\tmus2_combat_WWBoss_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(23).MusicMap.DisplayName\n#. /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(23).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(23).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"No price too high\"\nmsgstr \"價格再高也不過分\"\n\n#. Key:\tmus2_dlg_Gnory_Fishy_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(33).MusicMap.DisplayName\n#. /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(33).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(33).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Intelligence and Wisdom\"\nmsgstr \"聰明才智\"\n\n#. Key:\tmus2_dlg_GolemMaker_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(34).MusicMap.DisplayName\n#. /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(34).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(34).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Lost Memories\"\nmsgstr \"失去的記憶\"\n\n#. Key:\tmus2_dlg_MerchAnt_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(35).MusicMap.DisplayName\n#. /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(35).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(35).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Small but Tiny\"\nmsgstr \"迷妳般的小\"\n\n#. Key:\tmus2_dlg_SupperDwarf_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(36).MusicMap.DisplayName\n#. /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(36).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(36).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Supper time\"\nmsgstr \"晚餐時間\"\n\n#. Key:\tmus2_env_Catacombs_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(24).MusicMap.DisplayName\n#. /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(24).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(24).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Dwarven Catacombs\"\nmsgstr \"矮人地下墓穴\"\n\n#. Key:\tmus2_env_CrossroadCave_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(25).MusicMap.DisplayName\n#. /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(25).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(25).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Railway Station\"\nmsgstr \"火車站\"\n\n#. Key:\tmus2_env_DwarvenGate_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(26).MusicMap.DisplayName\n#. /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(26).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(26).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Sanctuary of Law\"\nmsgstr \"律法庇護\"\n\n#. Key:\tmus2_env_DwarvenOutpost_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(27).MusicMap.DisplayName\n#. /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(27).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(27).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Where the rail leads\"\nmsgstr \"鐵軌通向何方\"\n\n#. Key:\tmus2_env_Kobold_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(15).MusicMap.DisplayName\n#. /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(15).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(15).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Last of his Tribe\"\nmsgstr \"他的最後壹個部落\"\n\n#. Key:\tmus2_env_LavaDeep_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(28).MusicMap.DisplayName\n#. /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(28).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(28).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Temple for the Ancestors\"\nmsgstr \"先祖廟\"\n\n#. Key:\tmus2_env_LavaEntrance_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(29).MusicMap.DisplayName\n#. /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(29).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(29).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Pilgrim Road\"\nmsgstr \"朝聖者之路\"\n\n#. Key:\tmus2_env_WrackedWaterpath_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(30).MusicMap.DisplayName\n#. /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(30).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(30).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Quick and Clever\"\nmsgstr \"又快又敏捷\"\n\n#. Key:\tmus3_combat_Bubble_Ground_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(14).MusicMap.DisplayName\n#. /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(14).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(14).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Infected Golems\"\nmsgstr \"受感染的機器人\"\n\n#. Key:\tmus3_env_BubbleGround_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(38).MusicMap.DisplayName\n#. /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(38).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(38).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"So close yet so far\"\nmsgstr \"如此近卻又如此遠\"\n\n#. Key:\tmus3_env_CaveHouse_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(39).MusicMap.DisplayName\n#. /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(39).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(39).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Last Shalter\"\nmsgstr \"最後的碎片\"\n\n#. Key:\tmus3_env_PipePuzzle_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(40).MusicMap.DisplayName\n#. /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(40).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(40).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Moving Pipes\"\nmsgstr \"移動管道\"\n\n#. Key:\tmus3_env_Raven_Puzzle_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(41).MusicMap.DisplayName\n#. /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(41).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(41).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"One would fail\"\nmsgstr \"註定失敗\"\n\n#. Key:\tmus3_env_RuinedRealm_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(42).MusicMap.DisplayName\n#. /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(42).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(42).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"The end, really\"\nmsgstr \"最後，真的\"\n\n#. Key:\tmus_chase_theme_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(4).MusicMap.DisplayName\n#. /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(4).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(4).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Jump for your life!\"\nmsgstr \"為妳的生命壹躍而下！\"\n\n#. Key:\tmus_cm_WhiteWall_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(13).MusicMap.DisplayName\n#. /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(13).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(13).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Decaying City\"\nmsgstr \"腐爛的城市\"\n\n#. Key:\tmus_ending_dlg_UnknownWizard_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(37).MusicMap.DisplayName\n#. /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(37).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(37).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"All is lost\"\nmsgstr \"壹切都失去了\"\n\n#. Key:\tmus_main_theme_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(0).MusicMap.DisplayName\n#. /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(0).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(0).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Spirit of the Unknown\"\nmsgstr \"未知的精神\"\n\n#. Key:\tmus_waterpath_alter_display_name\n#. SourceLocation:\t/Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(43).MusicMap.DisplayName\n#. /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(43).MusicMap.DisplayName\n#: /Game/SO/GUI/InGame/CharacterPanels/UI_Rest.Default__UI_Rest_C.MusicMap(43).MusicMap.DisplayName\nmsgctxt \"MusicName\"\nmsgid \"Stories never end\"\nmsgstr \"故事永遠不會結束\"\n\n#. Key:\tblocked\n#. SourceLocation:\tLocalization/StringTables/Spells.csv\n#. InfoMetaData:\t\"Comment\" : \" displayed as floating test ingame when a certain enemy blocks certain attacks\"\n#. certain enemy blocks certain attacks\"\n#: Localization/StringTables/Spells.csv\nmsgctxt \"Spells\"\nmsgid \"Blocked\"\nmsgstr \"鎖定的\"\n\n#. Key:\tcant_use_in_air\n#. SourceLocation:\tLocalization/StringTables/Spells.csv\n#. InfoMetaData:\t\"Comment\" : \" displayed as floating test ingame when the character tries to use a spell in air which can not be used there\"\n#. character tries to use a spell in air which can not be used there\"\n#: Localization/StringTables/Spells.csv\nmsgctxt \"Spells\"\nmsgid \"Can't in air\"\nmsgstr \"不能在空中\"\n\n#. Key:\tcant_use_sk_free_zone\n#. SourceLocation:\tLocalization/StringTables/Spells.csv\n#. InfoMetaData:\t\"Comment\" : \" displayed as floating test ingame when character tries to use the respawn point spell on a location when it is not allowed\"\n#. character tries to use the respawn point spell on a location when it is not\n#. allowed\"\n#: Localization/StringTables/Spells.csv\nmsgctxt \"Spells\"\nmsgid \"Dangerous Location\"\nmsgstr \"危險的位置\"\n\n#. Key:\thp_gained\n#. SourceLocation:\tLocalization/StringTables/Spells.csv\n#. InfoMetaData:\t\"Comment\" : \" displayed as floating test ingame when the character increases his max health\"\n#. character increases his max health\"\n#: Localization/StringTables/Spells.csv\nmsgctxt \"Spells\"\nmsgid \"Health Increased!\"\nmsgstr \"生命值提升了！\"\n\n#. Key:\timmune\n#. SourceLocation:\tLocalization/StringTables/Spells.csv\n#. InfoMetaData:\t\"Comment\" : \"displayed as floating text ingame if enemy is immune to a spell or damage type\"\n#. immune to a spell or damage type\"\n#: Localization/StringTables/Spells.csv\nmsgctxt \"Spells\"\nmsgid \"Immune\"\nmsgstr \"免疫\"\n\n#. Key:\tinfected\n#. SourceLocation:\tLocalization/StringTables/Spells.csv\n#. InfoMetaData:\t\"Comment\" : \" displayed as floating test ingame when dmg over time effect is applied on enemy\"\n#. over time effect is applied on enemy\"\n#: Localization/StringTables/Spells.csv\nmsgctxt \"Spells\"\nmsgid \"Infected\"\nmsgstr \"被感染的\"\n\n#. Key:\tinstant_recharge\n#. SourceLocation:\tLocalization/StringTables/Spells.csv\n#. InfoMetaData:\t\"Comment\" : \" displayed as floating test ingame when a spell can be used again without waiting for the cooldown time\"\n#. spell can be used again without waiting for the cooldown time\"\n#: Localization/StringTables/Spells.csv\nmsgctxt \"Spells\"\nmsgid \"Instant Recharge\"\nmsgstr \"即時充能\"\n\n#. Key:\tmissing_target\n#. SourceLocation:\tLocalization/StringTables/Spells.csv\n#. InfoMetaData:\t\"Comment\" : \" displayed as floating test ingame when the character tries to use a spell which requires a target but there is none in range\"\n#. character tries to use a spell which requires a target but there is none in\n#. range\"\n#: Localization/StringTables/Spells.csv\nmsgctxt \"Spells\"\nmsgid \"Who? Where? What?!\"\nmsgstr \"是誰？在哪兒？什麽？！\"\n\n#. Key:\tno_need_for_heal\n#. SourceLocation:\tLocalization/StringTables/Spells.csv\n#. InfoMetaData:\t\"Comment\" : \" displayed as floating test ingame when the character tries to use heal spell but has max health already\"\n#. character tries to use heal spell but has max health already\"\n#: Localization/StringTables/Spells.csv\nmsgctxt \"Spells\"\nmsgid \"No need\"\nmsgstr \"不需要\"\n\n#. Key:\tresisted\n#. SourceLocation:\tLocalization/StringTables/Spells.csv\n#. InfoMetaData:\t\"Comment\" : \"displayed as floating text ingame if enemy has a chance to avoid an effect and he is lucky\"\n#. a chance to avoid an effect and he is lucky\"\n#: Localization/StringTables/Spells.csv\nmsgctxt \"Spells\"\nmsgid \"Resisted\"\nmsgstr \"反抗的\"\n\n#. Key:\tsecond_chance\n#. SourceLocation:\tLocalization/StringTables/Spells.csv\n#. InfoMetaData:\t\"Comment\" : \" displayed as floating test ingame if char has the effect on and dies and respawns because the effect saves him\"\n#. the effect on and dies and respawns because the effect saves him\"\n#: Localization/StringTables/Spells.csv\nmsgctxt \"Spells\"\nmsgid \"Second Chance\"\nmsgstr \"第二次機會\"\n\n#. Key:\tspell_capacity_gained\n#. SourceLocation:\tLocalization/StringTables/Spells.csv\n#. InfoMetaData:\t\"Comment\" : \" displayed as floating test ingame when the character increases his spellpower\"\n#. character increases his spellpower\"\n#: Localization/StringTables/Spells.csv\nmsgctxt \"Spells\"\nmsgid \"Spellpower Increased!\"\nmsgstr \"法力增強！\"\n\n#. Key:\tspell_regained\n#. SourceLocation:\tLocalization/StringTables/Spells.csv\n#. InfoMetaData:\t\"Comment\" : \" displayed as floating test ingame when the character regains a spell (can cast again)\"\n#. character regains a spell (can cast again)\"\n#: Localization/StringTables/Spells.csv\nmsgctxt \"Spells\"\nmsgid \"Spell Charge Regained!\"\nmsgstr \"法術充能恢復！\"\n\n#. Key:\tacknowledge\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Button\"\n#. Key:\tgroup_defeated_ack\n#. InfoMetaData:\t\"Comment\" : \"the hotkey to close the group defeated panel\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Acknowledge\"\nmsgstr \"確認\"\n\n#. Key:\tback\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Button\"\n#. Key:\tpanel_command_inv_back\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Back\"\nmsgstr \"返回\"\n\n#. Key:\tblack_fade_teleport_text_1\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Now I remember the night when it started...\"\nmsgstr \"現在我還記得事情開始的那個晚上……\"\n\n#. Key:\tbubble_float\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"bubble tip for the char to float\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Float\"\nmsgstr \"漂浮\"\n\n#. Key:\tbubble_jump\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"bubble tip for the char to jump\"\n#. Key:\tinput_jump\n#. InfoMetaData:\t\"Comment\" : \"Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Jump\"\nmsgstr \"跳\"\n\n#. Key:\tbuy\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"buy item\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Buy\"\nmsgstr \"買\"\n\n#. Key:\tbuy_back\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"buy back item\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Buy Back\"\nmsgstr \"買回\"\n\n#. Key:\tbuy_on_steam_and_follow\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Buy WarriOrb in Steam and follow us on social media:\"\nmsgstr \"在Steam中購買WarriOrb並在社交媒體上關注我們：\"\n\n#. Key:\tcancel\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Confirm popup\"\n#. Key:\tsettings_cancel\n#. InfoMetaData:\t\"Comment\" : \"Settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Cancel\"\nmsgstr \"取消\"\n\n#. Key:\tchange_user\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Change User\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Change User\"\nmsgstr \"變更使用者\"\n\n#. Key:\tchapter\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Stats for saves\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Chapter\"\nmsgstr \"章節\"\n\n#. Key:\tchapter1_completed\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Temporary for chapter 1\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Chapter 1 completed. Save is Locked.\"\nmsgstr \"章節 1 已完成。存檔已鎖定。\"\n\n#. Key:\tcharacter_skin_classic\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"name of the original character skin\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Classic\"\nmsgstr \"經典\"\n\n#. Key:\tcharacter_skin_desc\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"description for the character skin option\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Changes the visuals of the player character\"\nmsgstr \"改變玩家角色的視覺效果\"\n\n#. Key:\tcharacter_skin_mummy\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"name of the alternative character skin\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Mummy\"\nmsgstr \"木乃伊\"\n\n#. Key:\tcharacter_skin_pumpkin\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"name of the alternative character skin\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Pumpkin\"\nmsgstr \"南瓜\"\n\n#. Key:\tcharacter_skin_title\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"option to change character skin\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Character Skin\"\nmsgstr \"角色皮膚\"\n\n#. Key:\tcheckpoint\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Stats for saves\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Checkpoint\"\nmsgstr \"關卡\"\n\n#. Key:\tchest_examine\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Examine\"\nmsgstr \"查看\"\n\n#. Key:\tchest_leave\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Leave\"\nmsgstr \"離開\"\n\n#. Key:\tchest_loot\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"hotkey tip on chest\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Loot\"\nmsgstr \"拾取\"\n\n#. Key:\tclose\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"close book\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Close\"\nmsgstr \"關閉\"\n\n#. Key:\tcompleted_in_time\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Custom Map\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Completed in {time}\"\nmsgstr \"在{time}內完成\"\n\n#. Key:\tconfirm\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Confirm popup\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Confirm\"\nmsgstr \"確定\"\n\n#. Key:\tconfirm_keyboard_settings_reset\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Confirm keyboard settings\"\n#. Key:\tdifficulty_confirm_question\n#. InfoMetaData:\t\"Comment\" : \"Confirm difficulty selected popup\"\n#. Key:\tsave_slots_remove_confirm\n#. InfoMetaData:\t\"Comment\" : \"remove save slot confirm dialogue\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Are you sure?\"\nmsgstr \"妳確定?\"\n\n#. Key:\tconsole_ps4\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"PlayStation 4\"\nmsgstr \"PlayStation 4\"\n\n#. Key:\tconsole_switch\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Switch\"\nmsgstr \"Switch\"\n\n#. Key:\tconsole_xbox_one\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"XBox One\"\nmsgstr \"XBox One\"\n\n#. Key:\tcontinue\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Menu Continue\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Continue\"\nmsgstr \"繼續\"\n\n#. Key:\tcontroller_recommended\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Main Menu\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Note: Playing with a controller is recommended\"\nmsgstr \"註意：推薦使用手柄進行遊戲\"\n\n#. Key:\tcredits\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Menu credits\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Credits\"\nmsgstr \"制作名單\"\n\n#. Key:\tcustom_map_x\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Custom Map\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Custom Map {0}\"\nmsgstr \"自定義地圖 {0}\"\n\n#. Key:\tcustom_maps\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Menu custom Maps\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Custom Maps\"\nmsgstr \"自定義地圖\"\n\n#. Key:\tdescription\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Of something\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Description\"\nmsgstr \"描述\"\n\n#. Key:\tdifficulty\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Stats for saves\"\n#. Key:\tdifficulty_title\n#. InfoMetaData:\t\"Comment\" : \"title of difficulty selection\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Difficulty\"\nmsgstr \"困難\"\n\n#. Key:\tdifficulty_confirm_subtext\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Confirm difficulty selected popup subtext\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"This choice is permanent\"\nmsgstr \"選擇將永久生效\"\n\n#. Key:\tdifficulty_desc_insane\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"description of hard difficulty\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"- The <Blue>SoulKeeper</> (Portable Checkpoint) spell is removed from the game\\n- Increased incoming damage\\n- Increased Enemy Health\"\nmsgstr \"- <Blue>靈魂守護者</> (檢查點) 將被移除。\\n- 增加受到的傷害\\n- 增加敵人的生命值\"\n\n#. Key:\tdifficulty_desc_intended\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"description of normal difficulty\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"The way the game is meant to be played\"\nmsgstr \"遊戲玩法\"\n\n#. Key:\tdifficulty_desc_sane\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"description of easy difficulty\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"- Infinite <Blue>SoulKeeper</> (Checkpoint) spell charges\\n- No health penalty when respawning near the <Blue>SoulKeeper</>\\n- Decreased incoming damage\\n- Decreased Enemy Health\"\nmsgstr \"- 無限 <Blue>靈魂守護者</> (檢查點)\\n- 在<Blue>靈魂守護者</>附近重生不會受到生命懲罰\\n- 減少受到的傷害\\n- 減少敵人的生命值\"\n\n#. Key:\tdifficulty_insane\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"name of hard difficulty\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"As hard as it can get\"\nmsgstr \"瘋狂\"\n\n#. Key:\tdifficulty_intended\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"name of normal difficulty\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"A true challenge\"\nmsgstr \"普通\"\n\n#. Key:\tdifficulty_normal\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Normal\"\nmsgstr \"普通\"\n\n#. Key:\tdifficulty_sane\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"name of easy difficulty\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Just an adventure\"\nmsgstr \"簡單\"\n\n#. Key:\tdisabled\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Widget is disabled\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Disabled\"\nmsgstr \"失效的\"\n\n#. Key:\tdiscord\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Discord\"\nmsgstr \"Discord\"\n\n#. Key:\tdrm_defeatead_description\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"check only in pirated copies \"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"We suspect that you play a pirated copy of the game.\\nIt's fine. We hope you will enjoy it!\\n\\nIf you like the game, please tell your friends about it, and maybe even consider buying it.\\n\\nWe would love to keep making games!\"\nmsgstr \"我們檢測到您玩的可能是盜版。\\n沒關係。我們希望遊戲能給您到來快樂!\\n\\n如果您喜歡這個遊戲，非常希望您能介紹給您的朋友，或者考慮購買正版。\\n\\n我們願意繼續將游戲做得更好!\"\n\n#. Key:\tdrm_defeatead_title\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"check only in pirated copies \"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"WarriOrb DRM\"\nmsgstr \"WarriOrb DRM\"\n\n#. Key:\tdwarf_language\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Dwarf language\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Dwarf\"\nmsgstr \"矮人語\"\n\n#. Key:\tempty\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Empty\"\nmsgstr \"空\"\n\n#. Key:\tempty_line\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"-\"\nmsgstr \"-\"\n\n#. Key:\tencourage_line1\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Before Main Menu\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"The path ahead is challenging. Do not despise failure. Every wrong attempt discarded is another step forward.\"\nmsgstr \"前方的道路充滿挑戰。不要害怕失敗。每壹次挫折都會讓妳更進壹步。\"\n\n#. Key:\tessence\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"essence represents the Health of the character\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Essence\"\nmsgstr \"精華\"\n\n#. Key:\tfeedback\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Discord external button\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Feedback\"\nmsgstr \"反饋\"\n\n#. Key:\tgame_defeated\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"end screen\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Game Defeated!\"\nmsgstr \"遊戲結束\"\n\n#. Key:\tgame_is_wip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Main Menu\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Game currently under development\"\nmsgstr \"遊戲目前正在開發中\"\n\n#. Key:\tgame_over_retreat\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"control tip which is only visible in boss areas where the player can either restart the fight or retreat from the place\"\n#. areas where the player can either restart the fight or retreat from the\n#. place\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Retreat\"\nmsgstr \"撤回\"\n\n#. Key:\tgame_over_retry\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"control tip which is always visible on game over\"\n#. over\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Retry\"\nmsgstr \"重試\"\n\n#. Key:\tgamepad_special_left_xbox\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"xbox view button\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"View button\"\nmsgstr \"視圖按鈕\"\n\n#. Key:\tgamepad_special_right_xbox\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"xbox Menu button\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Menu button\"\nmsgstr \"選項按鈕\"\n\n#. Key:\tgo_back_to_menu\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Go back to main menu\"\nmsgstr \"返回主菜單\"\n\n#. Key:\tgold_x\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"{x} is the gold amount\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"+{x} GOLD\"\nmsgstr \"+{x}金幣\"\n\n#. Key:\tgroup_defeated_title\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"title of the group defeated panel\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Group Defeated\"\nmsgstr \"擊敗的敵人\"\n\n#. Key:\tinput_action_back\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"UI Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"UI Action Back\"\nmsgstr \"界面行動 返回\"\n\n#. Key:\tinput_action_first\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"UI Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"UI Action First\"\nmsgstr \"界面行動 順序壹\"\n\n#. Key:\tinput_action_second\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"UI Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"UI Action Second\"\nmsgstr \"界面動作 順序二\"\n\n#. Key:\tinput_action_third\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"UI Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"UI Action Third\"\nmsgstr \"界面動作 順序三\"\n\n#. Key:\tinput_actions_conflicts\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input remap.  {Key} = key display name. {NumAction} the number of actions, this will determine what to choose between one and other.\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Selected button = {Key}, will get unbound from the {NumActions}|plural(one=Action,other=Actions) = {ActionNames}\"\nmsgstr \"被選中的按鈕= {Key}, 將不受{NumActions}|plural(one=Action,other=Actions) = {ActionNames}的約束\"\n\n#. Key:\tinput_alt_interact\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Interact Alternative\"\nmsgstr \"替代交互\"\n\n#. Key:\tinput_change_item\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input Action Name\"\n#. Key:\tpanel_command_inv_change_item\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Change Item\"\nmsgstr \"切換物品\"\n\n#. Key:\tinput_change_spell\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Change Spell\"\nmsgstr \"切換法術\"\n\n#. Key:\tinput_change_weapon\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Change Weapon\"\nmsgstr \"切換武器\"\n\n#. Key:\tinput_down\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"UI Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"UI Move Down\"\nmsgstr \"界面向下移動\"\n\n#. Key:\tinput_float\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Floating\"\nmsgstr \"漂浮的\"\n\n#. Key:\tinput_interact\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Interact\"\nmsgstr \"交互\"\n\n#. Key:\tinput_left\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Move Left\"\nmsgstr \"向左移動\"\n\n#. Key:\tinput_menu_back\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"UI Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Open Menu/Escape/Back\"\nmsgstr \"打開菜單/逃跑/返回\"\n\n#. Key:\tinput_not_allowed_options_menu_button\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input remap gamepad\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Not allowed to remap to the Menu button\"\nmsgstr \"不允許重新映射到選項按鈕\"\n\n#. Key:\tinput_not_allowed_options_menu_button_switch\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input remap gamepad\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Not allowed to remap to the + Button\"\nmsgstr \"不允許重新映射到+鍵\"\n\n#. Key:\tinput_not_allowed_thumbsticks\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input remap gamepad\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Not allowed to remap to thumbsticks\"\nmsgstr \"不允許重新映射到搖桿\"\n\n#. Key:\tinput_not_allowed_thumbsticks_switch\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input remap gamepad switch\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Not allowed to remap to Left Stick or Right Stick\"\nmsgstr \"不允許重新映射到搖桿\"\n\n#. Key:\tinput_open_inventory\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Open Inventory\"\nmsgstr \"打開物品欄\"\n\n#. Key:\tinput_right\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Move Right\"\nmsgstr \"向右移動\"\n\n#. Key:\tinput_roll\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Roll\"\nmsgstr \"滾動\"\n\n#. Key:\tinput_selected_key_not_allowed\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input remap. {Key} = key display name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Selected button = {Key}, is not allowed as an input option\"\nmsgstr \"被選中的按鈕 = {Key}，不允許作為輸入選項\"\n\n#. Key:\tinput_spell_down\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"UI Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"UI Spell Down\"\nmsgstr \"界面 法術向下\"\n\n#. Key:\tinput_spell_left\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"UI Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"UI Spell Left\"\nmsgstr \"界面 法術向左\"\n\n#. Key:\tinput_spell_right\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"UI Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"UI Spell Right\"\nmsgstr \"界面 法術向右\"\n\n#. Key:\tinput_spell_select\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"UI Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"UI Spell Select\"\nmsgstr \"界面 法術選擇\"\n\n#. Key:\tinput_spell_select_and_cast\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"UI Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"UI Spell Select & Cast\"\nmsgstr \"界面 法術選擇 & 施放\"\n\n#. Key:\tinput_spell_up\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"UI Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"UI Spell Up\"\nmsgstr \"界面 法術向上\"\n\n#. Key:\tinput_strike_primary\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Primary Strike\"\nmsgstr \"常規攻擊\"\n\n#. Key:\tinput_strike_special\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Special Strike\"\nmsgstr \"特殊襲擊\"\n\n#. Key:\tinput_take_weapon\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Take Weapon Away\"\nmsgstr \"拾取武器\"\n\n#. Key:\tinput_top_left\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"UI Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"UI Top Left\"\nmsgstr \"界面左上角\"\n\n#. Key:\tinput_top_right\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"UI Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"UI Top Right\"\nmsgstr \"界面右上角\"\n\n#. Key:\tinput_unbound\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Unbound input\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Unbound\"\nmsgstr \"自由的\"\n\n#. Key:\tinput_up\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"UI Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"UI Move Up\"\nmsgstr \"界面向上移動\"\n\n#. Key:\tinput_use_item\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input Action Name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Use Item\"\nmsgstr \"使用物品\"\n\n#. Key:\tinventory_item_amount\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"the item amount displayed in inventory/trade panel/etc.\"\n#. panel/etc.\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Amount: {0}\"\nmsgstr \"數量：{0}\"\n\n#. Key:\tinventory_item_tooltip_cooldown\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Cooldown\"\nmsgstr \"冷卻\"\n\n#. Key:\tinventory_item_tooltip_damage\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"damage text on item descriptions\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Damage\"\nmsgstr \"傷害\"\n\n#. Key:\tinventory_item_tooltip_sec\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"duration of something (e.g. cooldown)\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"{0} sec\"\nmsgstr \"{0} 秒\"\n\n#. Key:\titem_equipped\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Item Tooltip\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"---Equipped---\"\nmsgstr \"---裝備的---\"\n\n#. Key:\titem_not_For_sale\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Item Tooltip\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Not for sale\"\nmsgstr \"非賣品\"\n\n#. Key:\titem_rarity_0\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"item rarity text on the bottom of tooltips\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Better than nothing, right?\"\nmsgstr \"總比壹無所獲好吧？\"\n\n#. Key:\titem_rarity_1\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"item rarity text on the bottom of tooltips\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Better than nothing\"\nmsgstr \"有勝於無\"\n\n#. Key:\titem_rarity_2\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"item rarity text on the bottom of tooltips\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Good stuff\"\nmsgstr \"好東西\"\n\n#. Key:\titem_rarity_3\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"item rarity text on the bottom of tooltips\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Pretty good stuff\"\nmsgstr \"優質的東西\"\n\n#. Key:\titem_rarity_4\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"item rarity text on the bottom of tooltips\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Amazing stuff\"\nmsgstr \"令人驚嘆的東西\"\n\n#. Key:\tkey_selection_current\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Select Input key\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Currently selected button:\"\nmsgstr \"當前選中的按鈕:\"\n\n#. Key:\tkey_selection_empty\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Select Input key\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"[Empty Button]\"\nmsgstr \"[空鈕]\"\n\n#. Key:\tkey_selection_press\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Select Input key\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"[Press Button]\"\nmsgstr \"[按鈕]\"\n\n#. Key:\tkey_selection_press_button\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Select Input key\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Press the button you want to assign to the action:\"\nmsgstr \"按下妳想分配的行動按鈕：\"\n\n#. Key:\tline_three_dots\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"...\"\nmsgstr \"...\"\n\n#. Key:\tloading_screen_press_key\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Press any key to continue...\"\nmsgstr \"按任意鍵繼續...\"\n\n#. Key:\tloading_screen_press_key_switch\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Press any button to continue...\"\nmsgstr \"按任意按鈕繼續...\"\n\n#. Key:\tloading_screen_text_1\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"This is a loading screen. We wait a few seconds here to look more professional.\"\nmsgstr \"這是壹個加載中的顯示。我們需要在此處等待幾秒以展示我們的專業度。\"\n\n#. Key:\tmailing_list\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Mailing List\"\nmsgstr \"郵箱列表\"\n\n#. Key:\tnever_completed\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Custom Map\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Never completed\"\nmsgstr \"從未完成\"\n\n#. Key:\tno\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Confirm popup\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"No\"\nmsgstr \"否\"\n\n#. Key:\tpanel_character_sheet\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Character Panel\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Character Sheet\"\nmsgstr \"角色表\"\n\n#. Key:\tpanel_command_inv_compare\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Compare\"\nmsgstr \"比較\"\n\n#. Key:\tpanel_command_inv_drink\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Drink\"\nmsgstr \"喝\"\n\n#. Key:\tpanel_command_inv_equip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"control key tip in inventory\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Equip\"\nmsgstr \"裝備\"\n\n#. Key:\tpanel_command_inv_equip_item\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Equip Item\"\nmsgstr \"裝備物品\"\n\n#. Key:\tpanel_command_inv_equip_next\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Equip Next\"\nmsgstr \"裝備下壹個\"\n\n#. Key:\tpanel_command_inv_read\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Read\"\nmsgstr \"閱讀\"\n\n#. Key:\tpanel_command_inv_unequip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Unequip\"\nmsgstr \"卸下\"\n\n#. Key:\tpanel_command_spell_add\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"add spell to equipped spells\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Add\"\nmsgstr \"增加\"\n\n#. Key:\tpanel_command_spell_remove\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"remove spell from equipped spells\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Remove\"\nmsgstr \"移除\"\n\n#. Key:\tpanel_equipped_spells\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Spell Selection panel\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Equipped Spells\"\nmsgstr \"裝備的法術\"\n\n#. Key:\tpanel_inventory\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Character Panel\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Inventory\"\nmsgstr \"物品欄\"\n\n#. Key:\tpanel_notes\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Character Panel\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Sidenotes\"\nmsgstr \"旁註\"\n\n#. Key:\tpaneL_resistances\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Character Sheet Panel\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Resistances\"\nmsgstr \"抗性\"\n\n#. Key:\tpanel_rest_no_item\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"You don't have the necessary item to use spells!\"\nmsgstr \"妳沒有使用法術的必需品！\"\n\n#. Key:\tpanel_rest_option_change_spells\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Change Spells\"\nmsgstr \"切換法術\"\n\n#. Key:\tpanel_rest_option_listen_to_music\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Listen to Music\"\nmsgstr \"聽音樂\"\n\n#. Key:\tpanel_rest_option_sleep\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Sleep\"\nmsgstr \"睡覺\"\n\n#. Key:\tpanel_rest_option_wake_up\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Wake Up\"\nmsgstr \"醒來\"\n\n#. Key:\tpanel_spell_capacity\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Spell Selection panel\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Capacity: {0}/{1}\"\nmsgstr \"能力: {0}/{1}\"\n\n#. Key:\tpanel_spell_selection_denied\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Spell Selection panel\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"You can only change the equipped spells near ancient statues.\"\nmsgstr \"妳只能改變古代雕像附近的裝備法術。\"\n\n#. Key:\tpanel_spells\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Character Panel\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Spells\"\nmsgstr \"法術\"\n\n#. Key:\tpercentage_argument\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Slider\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"{0}%\"\nmsgstr \"{0}%\"\n\n#. Key:\tplay_time\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Stats for saves\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Play Time\"\nmsgstr \"遊戲時間\"\n\n#. Key:\tprogress_saved\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Confirm Quit popup\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Progress will be saved\"\nmsgstr \"進度將保存\"\n\n#. Key:\tprogress_saved_automatically\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Before Main Menu\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Your progress is saved automatically whenever this icon is displayed\"\nmsgstr \"每當顯示此圖標時，說明進度已經自動保存\"\n\n#. Key:\tquit_game\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Menu Quit Game\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Quit Game\"\nmsgstr \"退出遊戲\"\n\n#. Key:\tquit_game_question\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Confirm Quit popup\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Quit Game?\"\nmsgstr \"確定退出遊戲？\"\n\n#. Key:\tquit_to_menu\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Menu Quit To Menu\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Quit to Menu\"\nmsgstr \"退出到菜單\"\n\n#. Key:\tquit_to_menu_question\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Confirm Quit popup\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Quit to Menu?\"\nmsgstr \"確定退出到菜單？\"\n\n#. Key:\treset_keyboard_arrows\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Confirm keyboard settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Reset to Arrow defaults\"\nmsgstr \"重置為箭頭默認值\"\n\n#. Key:\treset_keyboard_wasd\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Confirm keyboard settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Reset to WASD defaults\"\nmsgstr \"重置為WASD默認值\"\n\n#. Key:\trestart\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Restart the game\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Restart\"\nmsgstr \"重新開始\"\n\n#. Key:\trestart_game_question\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Confirm Restart popup\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Restart Game?\"\nmsgstr \"重新開始遊戲？\"\n\n#. Key:\trestart_game_warning\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Confirm Restart popup\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"All progress will be lost\"\nmsgstr \"所有的進度都將丟失\"\n\n#. Key:\tsave_slots_clear\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"clears the save slot\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Clear\"\nmsgstr \"完成\"\n\n#. Key:\tsave_slots_loaded\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"text on currently loaded save slot if there is any\"\n#. any\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"- Loaded -\"\nmsgstr \"-已加載-\"\n\n#. Key:\tsave_slots_new_game\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"text on empty save slot\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"New Game\"\nmsgstr \"新遊戲\"\n\n#. Key:\tsave_slots_playtime\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"playtime displayed, {0} is the hours, {1} is the minutes\"\n#. the minutes\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"{0} H {1} M\"\nmsgstr \"{0} H {1} M\"\n\n#. Key:\tsave_slots_playtime_short\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"playtime displayed if it did not reach an hour, {0} is the time in minutes\"\n#. hour, {0} is the time in minutes\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"{0} M\"\nmsgstr \"{0}M\"\n\n#. Key:\tsave_slots_remove_confirm_subtext\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"remove save slot confirm dialogue\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Progress will be lost\"\nmsgstr \"進度將丟失\"\n\n#. Key:\tsave_slots_select\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"loads the game or creates a new one using the active slot\"\n#. Key:\tselect\n#. InfoMetaData:\t\"Comment\" : \"Button\"\n#. Key:\tspell_cast_switch_select\n#. active slot\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Select\"\nmsgstr \"選擇\"\n\n#. Key:\tsaves\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Menu saves\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Save Slots\"\nmsgstr \"存檔\"\n\n#. Key:\tseconds\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"seconds\"\nmsgstr \"秒\"\n\n#. Key:\tselect_spells\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input right  thumbstick\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Select spells\"\nmsgstr \"選擇法術\"\n\n#. Key:\tsell\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"sell item\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Sell\"\nmsgstr \"出售\"\n\n#. Key:\tsend_automatically\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Analytics popup\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Send Automatically\"\nmsgstr \"自動發送\"\n\n#. Key:\tsend_no\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Analytics popup\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Do not Send\"\nmsgstr \"不發送\"\n\n#. Key:\tsettings\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Menu settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Settings\"\nmsgstr \"設置\"\n\n#. Key:\tsettings_antialising\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Anti-Aliasing\"\nmsgstr \"抗鋸齒\"\n\n#. Key:\tsettings_antialising_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Smooths out the edges by blending the colors of the pixels around the object to create the illusion of smoothness.\"\nmsgstr \"通過混合對象周圍像素的顏色來平滑邊緣，以創建平滑感。\"\n\n#. Key:\tsettings_apply\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Apply\"\nmsgstr \"應用\"\n\n#. Key:\tsettings_aspect_ratio\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Aspect Ratio\"\nmsgstr \"屏幕比例\"\n\n#. Key:\tsettings_aspect_ratio_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Defines what aspect ratios are available for your resolution.\"\nmsgstr \"根據妳的屏幕分辨率決定縱橫比例。\"\n\n#. Key:\tsettings_audio\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Settings panels\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Audio\"\nmsgstr \"聲音\"\n\n#. Key:\tsettings_auto_detect_controller\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Gamepad settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Auto detect Gamepad Layout\"\nmsgstr \"自動檢測手柄布局\"\n\n#. Key:\tsettings_borderless\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Borderless\"\nmsgstr \"無邊框\"\n\n#. Key:\tsettings_brightness\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Settings panels\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Brightness\"\nmsgstr \"亮度\"\n\n#. Key:\tsettings_brightness_default_value\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Brightness settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Default Value is 100%\"\nmsgstr \"默認值為100%\"\n\n#. Key:\tsettings_brightness_description\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Brightness settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Please adjust the brightness of the game to your display\"\nmsgstr \"請調整遊戲的亮度\"\n\n#. Key:\tsettings_collect_analytics\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Game Settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Collect Usage Statistics\"\nmsgstr \"收集使用情況統計信息\"\n\n#. Key:\tsettings_collect_analytics_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Game Settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"These are not used to identify individuals, but help us to understand players needs to improve our game.\"\nmsgstr \"這些不是用來紀錄各種信息的，而是幫助我們理解玩家需要以便改進我們的遊戲。\"\n\n#. Key:\tsettings_confirm_display_title\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings confirm\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Confirm Display Settings in\"\nmsgstr \"確認顯示設置\"\n\n#. Key:\tsettings_controller\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Settings panels\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Gamepad\"\nmsgstr \"手柄\"\n\n#. Key:\tsettings_controller_platform\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Gamepad Layout settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Layout\"\nmsgstr \"布局\"\n\n#. Key:\tsettings_controller_remap\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Gamepad settings\"\n#. Key:\tsettings_controller_remap_single\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Remap Controls\"\nmsgstr \"重新映射控制器\"\n\n#. Key:\tsettings_controller_remap_noedit\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Gamepad settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Please use a gamepad in order to remap\"\nmsgstr \"請使用遊戲手柄重新映射\"\n\n#. Key:\tsettings_controller_switch\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Settings panels\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Controls\"\nmsgstr \"控制項\"\n\n#. Key:\tsettings_display\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Settings panels\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Display\"\nmsgstr \"顯示\"\n\n#. Key:\tsettings_display_damage\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Game settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Display Damage\"\nmsgstr \"顯示傷害\"\n\n#. Key:\tsettings_display_damage_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Game settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Show damage as a floating number on the screen\"\nmsgstr \"在屏幕上以浮動數字顯示傷害\"\n\n#. Key:\tsettings_display_enemy_hp\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Game settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Display Enemy Health\"\nmsgstr \"顯示敵人的生命值\"\n\n#. Key:\tsettings_display_enemy_hp_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Game settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Show a small health bar above injured enemies\"\nmsgstr \"在受傷的敵人上方顯示壹個小的生命條\"\n\n#. Key:\tsettings_display_floating_vo\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Game settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Display Floating Voice Lines\"\nmsgstr \"顯示浮動語音線路\"\n\n#. Key:\tsettings_display_floating_vo_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Game settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Show voice lines as floating texts\"\nmsgstr \"將語音線顯示為浮動文本\"\n\n#. Key:\tsettings_display_fps\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Game settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Display FPS\"\nmsgstr \"顯示幀\"\n\n#. Key:\tsettings_display_fps_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Game settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Show FPS counter\"\nmsgstr \"顯示幀數\"\n\n#. Key:\tsettings_display_mode\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Display Mode\"\nmsgstr \"顯示方式\"\n\n#. Key:\tsettings_display_mode_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"In Windowed mode you can interact with other windows easier. In Borderless mode you can quickly switch between applications.\"\nmsgstr \"在窗口模式下，我去可以更容易地與其他窗口交互。在無邊框模式下，妳可以在應用程序之間快速切換。\"\n\n#. Key:\tsettings_display_play_time\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Game settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Display Play Time\"\nmsgstr \"顯示遊戲時間\"\n\n#. Key:\tsettings_display_play_time_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Game settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Show current play time\"\nmsgstr \"顯示當前遊戲時間\"\n\n#. Key:\tsettings_effects\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Effect Quality\"\nmsgstr \"影響質量\"\n\n#. Key:\tsettings_effects_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Affects the quality of particles in the world, a lower quality might make some projectiles in the world harder to see.\"\nmsgstr \"此修改將影響遊戲畫面的粒子質量，較低的質量可能會使遊戲展的壹些拋射體更難被看到。\"\n\n#. Key:\tsettings_effects_volume\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Audio settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Sound Effects volume\"\nmsgstr \"音效音量\"\n\n#. Key:\tsettings_effects_volume_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Audio settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Adjust the sound effects volume\"\nmsgstr \"調整音效音量\"\n\n#. Key:\tsettings_force_weak_hardware_opt\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Additional Optimizations\"\nmsgstr \"其他優化\"\n\n#. Key:\tsettings_force_weak_hardware_opt_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"In certain areas background traps are deactivated or background visuals look cheaper to gain more performance.\"\nmsgstr \"取消某些區域背景或調低背景視覺效果，以獲得更多的性能。\"\n\n#. Key:\tsettings_fps_unlimited\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings frame limit\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Unlimited\"\nmsgstr \"無限制\"\n\n#. Key:\tsettings_frame_limit\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Frame Limit (FPS)\"\nmsgstr \"框架限制(FPS)\"\n\n#. Key:\tsettings_frame_limit_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Limit the maximum frame rate for a consistent experience.\"\nmsgstr \"限制最大幀速率以獲得最流暢的體驗。\"\n\n#. Key:\tsettings_fullscreen\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Fullscreen\"\nmsgstr \"全屏\"\n\n#. Key:\tsettings_game\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Settings panels\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Game\"\nmsgstr \"遊戲\"\n\n#. Key:\tsettings_game_speed\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Game settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Game Speed\"\nmsgstr \"遊戲速度\"\n\n#. Key:\tsettings_game_speed_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Game settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Changes the speed of the game.\\nHigher speed might make the game have lower FPS.\"\nmsgstr \"調整遊戲速度\"\n\n#. Key:\tsettings_gamepad_vibration\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Gamepad Vibration intensity settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Vibration\"\nmsgstr \"振動\"\n\n#. Key:\tsettings_keyboard\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Settings panels\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Keyboard\"\nmsgstr \"鍵盤\"\n\n#. Key:\tsettings_keyboard_remap_noedit\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Keyboard Settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Please use a keyboard in order to change the keyboard input\"\nmsgstr \"請使用鍵盤來更改鍵盤輸入\"\n\n#. Key:\tsettings_language\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Game settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Language\"\nmsgstr \"語言\"\n\n#. Key:\tsettings_language_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Game settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Change the display and locale (numbers, dates) language\"\nmsgstr \"更改顯示和語言環境(數字、日期)\"\n\n#. Key:\tsettings_master_volume\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Audio settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Master volume\"\nmsgstr \"主音量\"\n\n#. Key:\tsettings_master_volume_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Audio settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Adjust the master volume\"\nmsgstr \"調節主音量\"\n\n#. Key:\tsettings_merciful_bounce\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"game settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Merciful Bounce Mode\"\nmsgstr \"仁慈的跳跳模式\"\n\n#. Key:\tsettings_merciful_bounce_always\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"defines when (in which difficulty mode) is the easier bounce mode active\"\n#. easier bounce mode active\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Always\"\nmsgstr \"經常\"\n\n#. Key:\tsettings_merciful_bounce_never\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"defines when (in which difficulty mode) is the easier bounce mode active\"\n#. easier bounce mode active\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Never\"\nmsgstr \"從不\"\n\n#. Key:\tsettings_merciful_bounce_on_easy\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"defines when (in which difficulty mode) is the easier bounce mode active\"\n#. easier bounce mode active\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"On Easy\"\nmsgstr \"在簡單模式下\"\n\n#. Key:\tsettings_merciful_bounce_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"tooltip for Merciful Bounce Mode option\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Allows Higher Bounce even if the Jump button is pressed after the character hits the ground\"\nmsgstr \"在角色觸地後按下跳躍按鈕依然可以彈跳地更高\"\n\n#. Key:\tsettings_move_left_right\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Move left/right\"\nmsgstr \"向左/向右移動\"\n\n#. Key:\tsettings_music_volume\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Audio settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Music volume\"\nmsgstr \"音樂音量\"\n\n#. Key:\tsettings_music_volume_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Audio settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Adjust the music volume\"\nmsgstr \"調整音樂音量\"\n\n#. Key:\tsettings_mute_audio\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Audio settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Mute audio\"\nmsgstr \"靜音\"\n\n#. Key:\tsettings_mute_audio_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Audio settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Mute all audio\"\nmsgstr \"關閉所有音頻\"\n\n#. Key:\tsettings_mute_audio_unfocused\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Audio settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Mute audio when in background\"\nmsgstr \"調到後臺時靜默所有聲音\"\n\n#. Key:\tsettings_mute_audio_unfocused_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Audio settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Mute the audio when the game window is not in focus\"\nmsgstr \"當遊戲窗口不清晰時將音頻靜音\"\n\n#. Key:\tsettings_mute_dialogue_voice\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Audio settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Mute voices in dialogues\"\nmsgstr \"靜默對話中的聲音\"\n\n#. Key:\tsettings_mute_dialogue_voice_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Audio settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Mute the gibberish voices inside the dialogues\"\nmsgstr \"把對話中胡言亂語的聲音消除\"\n\n#. Key:\tsettings_mute_voice\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Audio settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Mute voices outside of dialogues\"\nmsgstr \"靜默對話外的聲音\"\n\n#. Key:\tsettings_mute_voice_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Audio settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Mute the gibberish voices outside the dialogues\"\nmsgstr \"把對話外胡言亂語的聲音消除\"\n\n#. Key:\tsettings_pause_game_idle\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Game settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Pause game when idle\"\nmsgstr \"空閑時暫停遊戲\"\n\n#. Key:\tsettings_pause_game_idle_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Game settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Pauses the game when the user is idle for a certain amount of minutes\"\nmsgstr \"當用戶空閑壹定時間時即暫停遊戲\"\n\n#. Key:\tsettings_pause_game_unfocused\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Game settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Pause game when unfocused\"\nmsgstr \"遊戲失焦時暫停遊戲\"\n\n#. Key:\tsettings_pause_game_unfocused_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Game settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Pauses the game when the game loses focus\"\nmsgstr \"當遊戲失焦時暫停遊戲\"\n\n#. Key:\tsettings_post_effects\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Post-Effects\"\nmsgstr \"後置效應\"\n\n#. Key:\tsettings_post_effects_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Affects the quality of the post process effects after the scene is rendered.\"\nmsgstr \"它會影響場景渲染後的後期效果的質量。\"\n\n#. Key:\tsettings_quality_epic\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings quality\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Epic\"\nmsgstr \"極致\"\n\n#. Key:\tsettings_quality_high\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings quality\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"High\"\nmsgstr \"高\"\n\n#. Key:\tsettings_quality_low\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings quality\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Low\"\nmsgstr \"低\"\n\n#. Key:\tsettings_quality_medium\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings quality\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Medium\"\nmsgstr \"中\"\n\n#. Key:\tsettings_ratio_16_10\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings Aspect Ratio\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"16:10\"\nmsgstr \"16:10:00\"\n\n#. Key:\tsettings_ratio_16_9\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings Aspect Ratio\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"16:9\"\nmsgstr \"16:9\"\n\n#. Key:\tsettings_ratio_4_3\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings Aspect Ratio\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"4:3\"\nmsgstr \"4:3\"\n\n#. Key:\tsettings_reset\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Reset\"\nmsgstr \"重置\"\n\n#. Key:\tsettings_reset_default\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Settings reset to default\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Reset to Defaults\"\nmsgstr \"重置為默認值\"\n\n#. Key:\tsettings_reset_input_key\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Input reset key to default\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Reset button to default\"\nmsgstr \"重置按鈕為默認值\"\n\n#. Key:\tsettings_resolution\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Resolution\"\nmsgstr \"分辨率\"\n\n#. Key:\tsettings_resolution_entry\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings. {0} - x, {1} - Y\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"{0}x{1}\"\nmsgstr \"{0}x{1}\"\n\n#. Key:\tsettings_resolution_scale\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Resolution Scale\"\nmsgstr \"分辨率\"\n\n#. Key:\tsettings_resolution_scale_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"The desired resolution to use when rendering the game. It does not affect the UI.\\nLowering it improves performance on lower end machines.\"\nmsgstr \"渲染遊戲時所需的分辨率。它不影響UI。\\n降低它可以提高低端機器的性能。\"\n\n#. Key:\tsettings_resolution_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Allows changing the Screen Resolution.\"\nmsgstr \"允許改變屏幕分辨率。\"\n\n#. Key:\tsettings_select_another\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Settings input\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Select another\"\nmsgstr \"選另壹個\"\n\n#. Key:\tsettings_shadows\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Shadow Quality\"\nmsgstr \"陰影質量\"\n\n#. Key:\tsettings_shadows_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"The higher the quality the finer the shadow.\"\nmsgstr \"質量越高，陰影越細。\"\n\n#. Key:\tsettings_textures\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Texture Quality\"\nmsgstr \"紋理質量\"\n\n#. Key:\tsettings_textures_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Surfaces of the game world will increase in fidelity if the setting is higher.\"\nmsgstr \"此項設置越高，遊戲世界越真實。\"\n\n#. Key:\tsettings_unknown\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Unknown\"\nmsgstr \"未知\"\n\n#. Key:\tsettings_volumetric_fog\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Volumetric Fog\"\nmsgstr \"體積霧\"\n\n#. Key:\tsettings_volumetric_fog_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Realistic looking fog. Has a high performance impact, disable it to improve performance.\"\nmsgstr \"霧狀效果具有較高的性能影響，禁用它可以提高性能。\"\n\n#. Key:\tsettings_vsync\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Vertical Sync\"\nmsgstr \"垂直同步\"\n\n#. Key:\tsettings_vsync_tooltip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Synchronize the game refresh rate with the monitor refresh rate. Disable it for higher framerate and better input response.\\nWhen enabled it prevents screen tearing.\"\nmsgstr \"將遊戲刷新率與顯示器刷新率同步。禁用它可以獲得更高的幀率和更好的輸入響應。\\n當啟用時，它可以防止畫面撕裂感。\"\n\n#. Key:\tsettings_windowed\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Display settings\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Windowed\"\nmsgstr \"窗口化\"\n\n#. Key:\tskip\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"text near the press and hold to skip confirmation button\"\n#. confirmation button\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Skip\"\nmsgstr \"跳過\"\n\n#. Key:\tspell_cast_switch_controls\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Quick select spells up/down/left/right\"\nmsgstr \"快速選擇法術向上/向下/向左/向右\"\n\n#. Key:\tspell_cast_switch_select_cast\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Select & Cast\"\nmsgstr \"選擇 & 施放\"\n\n#. Key:\tspell_cooldown_stops_in_air\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Spell\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Cooldown only starts on ground\"\nmsgstr \"冷卻只從地面開始計算\"\n\n#. Key:\tspell_only_in_air\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Spell\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Can not be used in air\"\nmsgstr \"不能在空中使用\"\n\n#. Key:\tspell_restricted\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Spell\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Can not be used in restricted areas\"\nmsgstr \"不能在某些禁區內使用\"\n\n#. Key:\tstart\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"The name of the checkpoint. Custom Map action\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Start\"\nmsgstr \"開始\"\n\n#. Key:\tstart_game\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Menu Start Game\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Start Game\"\nmsgstr \"開始遊戲\"\n\n#. Key:\tstats_usage_description\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Analytics popup\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Not Yet would like to collect usage statistics from your game automatically.\\nThese are not used to identify individuals, but help us to understand players needs to improve our game.\\n\\nSelect \\\"Send Automatically\\\" to allow collection of usage statistics,\\nor \\\"Do Not Send\\\" to prevent the game from sending information to Not Yet.\\n\\nYou can change this setting at any time via the Settings Game tab.\"\nmsgstr \"尚未開始自動收集您遊戲時的使用數據。\\n這些不是用來識別個人，而是幫助我們理解玩家需要改進我們的遊戲。\\n選擇“自動發送”，允許收集使用統計數據，\\n或“不發送”，防止遊戲發送個人數據信息。\\n您可以隨時通過設置遊戲選項卡更改此設置。\"\n\n#. Key:\tstats_usage_title\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Analytics popup\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Usage Statistics\"\nmsgstr \"使用數據\"\n\n#. Key:\tstatus\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Status of a save/custom map\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Status\"\nmsgstr \"狀態\"\n\n#. Key:\tsteam_main_game\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Wishlist\"\nmsgstr \"願望單\"\n\n#. Key:\tsteam_main_game_buy\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Buy Full Game\"\nmsgstr \"購買完整遊戲\"\n\n#. Key:\tSwitch_FaceButton_Bottom\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"B Button\"\nmsgstr \"B鍵\"\n\n#. Key:\tSwitch_FaceButton_Left\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Y Button\"\nmsgstr \"Y鍵\"\n\n#. Key:\tSwitch_FaceButton_Right\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"A Button\"\nmsgstr \"A鍵\"\n\n#. Key:\tSwitch_FaceButton_Top\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"X Button\"\nmsgstr \"X鍵\"\n\n#. Key:\tSwitch_Gamepad_LeftStick_Down\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \" Switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Left Stick Down\"\nmsgstr \"L操控搖桿 - 下\"\n\n#. Key:\tSwitch_Gamepad_LeftStick_Left\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \" Switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Left Stick Left\"\nmsgstr \"L操控搖桿 - 左\"\n\n#. Key:\tSwitch_Gamepad_LeftStick_Right\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \" Switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Left Stick Right\"\nmsgstr \"L操控搖桿 - 右\"\n\n#. Key:\tSwitch_Gamepad_LeftStick_Up\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \" Switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Left Stick Up\"\nmsgstr \"L操控搖桿 - 上\"\n\n#. Key:\tSwitch_Gamepad_RightStick_Down\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \" Switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Right Stick Down\"\nmsgstr \"R操控搖桿 - 下\"\n\n#. Key:\tSwitch_Gamepad_RightStick_Left\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \" Switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Right Stick Left\"\nmsgstr \"R操控搖桿 - 左\"\n\n#. Key:\tSwitch_Gamepad_RightStick_Right\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \" Switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Right Stick Right\"\nmsgstr \"R操控搖桿 - 右\"\n\n#. Key:\tSwitch_Gamepad_RightStick_Up\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \" Switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Right Stick Up\"\nmsgstr \"R操控搖桿 - 上\"\n\n#. Key:\tSwitch_LeftThumbstick\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \" Switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Left Stick\"\nmsgstr \"L操控搖桿\"\n\n#. Key:\tSwitch_RightThumbstick\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \" Switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Right Stick\"\nmsgstr \"R操控搖桿\"\n\n#. Key:\tSwitch_Shoulder_Left\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"L Button\"\nmsgstr \"L鍵\"\n\n#. Key:\tSwitch_Shoulder_Right\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"R Button\"\nmsgstr \"R鍵\"\n\n#. Key:\tSwitch_special_dpad_down\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \" Switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Down Button\"\nmsgstr \"下鍵\"\n\n#. Key:\tSwitch_special_dpad_left\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \" Switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Left Button\"\nmsgstr \"左鍵\"\n\n#. Key:\tSwitch_special_dpad_right\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \" Switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Right Button\"\nmsgstr \"右鍵\"\n\n#. Key:\tSwitch_special_dpad_up\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \" Switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Up Button\"\nmsgstr \"上鍵\"\n\n#. Key:\tSwitch_special_left\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"- Button\"\nmsgstr \"-鍵\"\n\n#. Key:\tSwitch_special_right\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"+ Button\"\nmsgstr \"+鍵\"\n\n#. Key:\tSwitch_Trigger_Left\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"ZL Button\"\nmsgstr \"ZL鍵\"\n\n#. Key:\tSwitch_Trigger_Right\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"switch gamepad button name\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"ZR Button\"\nmsgstr \"ZL鍵\"\n\n#. Key:\tteleport_to_cp\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Menu Teleport To Checkpoint\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Teleport To Checkpoint\"\nmsgstr \"傳送至關卡\"\n\n#. Key:\tteleport_to_sk\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Menu Teleport to Soulkeeper\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Teleport To SoulKeeper\"\nmsgstr \"傳送至靈魂守護者\"\n\n#. Key:\tthank_you_prologue\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"THANK YOU FOR PLAYING WARRIORB DEMO PROLOGUE, WE HOPE YOU HAD A GREAT TIME!\"\nmsgstr \"感謝試玩《球魂》序章，希望妳喜歡這個遊戲！\"\n\n#. Key:\ttotal_deaths\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Stats for saves\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Total Deaths\"\nmsgstr \"總計死亡數\"\n\n#. Key:\ttrade_amount_x_x\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"trade confirmation UI. {0} is the current amount and {1} is the current amount times price per item\"\n#. amount and {1} is the current amount times price per item\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"{0} for {1} gold\"\nmsgstr \"{0}表示{1}金幣\"\n\n#. Key:\ttrade_buy\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"trade confirmation UI\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Are you sure you want to buy {ItemName} for {Gold} gold?\"\nmsgstr \"您確定要用{Gold}金幣購買{ItemName}嗎?\"\n\n#. Key:\ttrade_buy_back\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"trade confirmation UI\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Are you sure you want to buy back {ItemName} for {Gold} gold?\"\nmsgstr \"您確定要以{Gold}金幣換回{ItemName}嗎?\"\n\n#. Key:\ttrade_no_intrested\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"trade confirmation UI\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"The trader is not interested in buying that item from you!\"\nmsgstr \"商人沒有興趣從妳那裏買東西!\"\n\n#. Key:\ttrade_nope\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"trade confirmation UI\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Nope!\"\nmsgstr \"不!\"\n\n#. Key:\ttrade_okay\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"trade confirmation UI\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Okay...\"\nmsgstr \"好吧……\"\n\n#. Key:\ttrade_sell\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"trade confirmation UI\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Are you sure you want to sell {ItemName} for {Gold} gold?\"\nmsgstr \"您確定要將{ItemName}以{Gold}金幣出售嗎?\"\n\n#. Key:\ttwitter\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Twitter\"\nmsgstr \"Twitter\"\n\n#. Key:\tunknown\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Unknown input binding\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"UNKNOWN\"\nmsgstr \"未知\"\n\n#. Key:\twarriorb\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"WarriOrb\"\nmsgstr \"球魂\"\n\n#. Key:\txp\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Experience Points\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"XP\"\nmsgstr \"經驗值\"\n\n#. Key:\tyes\n#. SourceLocation:\tLocalization/StringTables/UI.csv\n#. InfoMetaData:\t\"Comment\" : \"Confirm popup\"\n#: Localization/StringTables/UI.csv\nmsgctxt \"UI\"\nmsgid \"Yes\"\nmsgstr \"是\"\n\n"
  },
  {
    "path": "Content/Localization/WarriorbDialogues/WarriorbDialogues.csv",
    "content": "Date/Time,Word Count,en,es,fr,hu,ro,ru,uk,zh-Hans,zh-Hant\n2020.01.15-12.47.11,20348,20348,0,0,0,0,0,0,0,0\n2020.01.15-12.48.47,19931,19931,0,0,0,0,0,0,0,0\n2020.01.15-13.25.01,19082,19082,0,0,0,0,0,0,0,0\n2020.01.15-14.00.43,19079,19079,0,0,0,0,0,0,0,0\n2020.01.22-15.25.48,19063,19063,0,0,0,0,0,0,0,0\n2020.01.22-15.26.42,19063,19031,0,0,0,0,0,0,0,0\n2020.01.22-16.04.08,19063,19063,0,0,0,0,0,0,0,0\n2020.01.23-09.58.00,15777,15777,0,0,0,0,0,0,0,0\n2020.01.23-09.58.51,15777,15777,0,0,2838,0,0,0,0,0\n2020.01.25-08.55.34,15777,15777,0,0,15777,0,0,0,0,0\n2020.01.27-19.19.37,15773,15773,0,0,15773,0,0,0,0,0\n2020.01.27-19.23.14,15764,15764,0,0,15764,0,0,0,0,0\n2020.02.01-16.40.06,15638,15638,0,0,15638,0,0,0,0,0\n2020.02.04-13.11.50,15592,15592,0,0,15592,0,0,0,0,0\n2020.02.06-18.03.26,15592,15592,0,0,15392,0,0,0,0,0\n2020.02.06-18.17.12,15592,15592,0,0,15592,0,0,0,0,0\n2020.02.10-11.41.23,15588,15588,0,0,15566,0,0,0,0,0\n2020.02.10-11.41.57,15588,15588,0,0,15566,1340,0,0,0,0\n2020.02.10-13.54.10,15589,15589,0,0,15506,1340,0,0,0,0\n2020.02.10-13.54.47,15589,15589,0,0,15506,3755,0,0,0,0\n2020.02.10-14.21.34,15589,15589,0,0,15502,3751,0,0,0,0\n2020.02.10-15.45.20,15586,15586,0,0,15453,3751,0,0,0,0\n2020.02.10-15.45.57,15586,15586,0,0,15453,4337,0,0,0,0\n2020.02.10-16.12.56,15582,15582,0,0,15449,4337,0,0,0,0\n2020.02.10-16.13.31,15582,15582,0,0,15449,5073,0,0,0,0\n2020.02.10-16.55.13,15585,15585,0,0,15393,5073,0,0,0,0\n2020.02.10-16.55.50,15585,15585,0,0,15418,5698,0,0,0,0\n2020.02.10-17.34.10,15585,15585,0,0,15382,5698,0,0,0,0\n2020.02.10-17.34.49,15585,15585,0,0,15382,6406,0,0,0,0\n2020.02.10-20.40.05,15582,15582,0,0,15304,6406,0,0,0,0\n2020.02.10-20.40.43,15582,15582,0,0,15304,7785,0,0,0,0\n2020.02.10-22.03.40,15582,15582,0,0,15286,7785,0,0,0,0\n2020.02.10-22.04.19,15582,15582,0,0,15286,8387,0,0,0,0\n2020.02.10-22.17.58,15582,15582,0,0,15582,8387,0,0,0,0\n2020.02.11-13.52.44,15576,15576,0,0,15522,8387,0,0,0,0\n2020.02.11-13.53.21,15576,15576,0,0,15522,9504,0,0,0,0\n2020.02.11-14.02.29,15576,15576,0,0,15522,9555,0,0,0,0\n2020.02.11-16.43.17,15578,15578,0,0,15404,9555,0,0,0,0\n2020.02.11-16.43.56,15578,15578,0,0,15404,10597,0,0,0,0\n2020.02.11-17.07.38,15577,15577,0,0,15391,10597,0,0,0,0\n2020.02.11-17.08.17,15577,15577,0,0,15391,10640,0,0,0,0\n2020.02.11-17.46.49,15569,15569,0,0,15277,10640,0,0,0,0\n2020.02.11-17.47.27,15569,15569,0,0,15277,11427,0,0,0,0\n2020.02.11-18.27.52,15570,15570,0,0,15263,11427,0,0,0,0\n2020.02.11-18.28.32,15570,15570,0,0,15263,11533,0,0,0,0\n2020.02.11-19.20.13,15571,15571,0,0,15174,11533,0,0,0,0\n2020.02.11-19.20.50,15571,15571,0,0,15174,12551,0,0,0,0\n2020.02.11-21.21.52,15570,15570,0,0,15120,12551,0,0,0,0\n2020.02.11-21.22.27,15570,15570,0,0,15120,14291,0,0,0,0\n2020.02.11-22.21.27,15570,15570,0,0,15090,14291,0,0,0,0\n2020.02.11-22.22.05,15570,15570,0,0,15528,15540,0,0,0,0\n2020.02.11-22.27.31,15570,15570,0,0,15558,15570,0,0,0,0\n2020.02.25-18.12.56,15570,15570,0,0,15570,15570,0,0,0,0\n2020.03.23-11.00.04,15584,15584,0,0,15526,15526,0,0,0,0\n2020.03.23-11.00.42,15584,15584,15526,0,15526,15526,0,0,0,0\n2020.03.23-12.52.30,15584,15584,15526,0,15526,15526,15526,0,0,0\n2020.03.23-12.59.36,15584,15584,15526,0,15531,15531,15526,0,0,0\n2020.03.25-14.32.00,15584,15584,15526,15531,15531,15531,15531,0,0,0\n2020.03.28-08.15.16,15592,15592,15286,15291,15291,15291,15291,0,0,0\n2020.03.28-08.25.44,15592,15592,15282,15287,15287,15287,15287,0,0,0\n2020.03.30-13.38.13,15592,15592,15592,15592,15287,15287,15592,0,0,0\n2020.04.02-12.18.52,15592,15592,15592,15592,15287,15287,15592,0,11151,0\n2020.04.02-14.54.15,15592,15592,15592,15592,15287,15592,15592,0,11151,0\n2020.04.07-18.25.59,15592,15592,15592,15592,15287,15592,15592,0,15584,0\n2020.04.17-14.38.12,15591,15591,15541,15541,15236,15541,15541,0,15533,0\n2020.04.19-22.12.59,15590,15590,15527,15527,15236,15527,15527,0,15519,0\n2020.04.20-13.28.35,15590,15590,15527,15527,15590,15527,15527,0,15519,0\n2020.04.21-20.01.25,15590,15590,15590,15527,15590,15527,15590,0,15519,0\n2020.04.21-20.09.18,15590,15590,15590,15527,15590,15527,15590,0,15590,15590\n2020.04.23-12.15.45,15590,15590,15590,15527,15590,15590,15590,0,15590,15590\n2020.04.24-09.39.21,15590,15590,15590,15590,15590,15590,15590,0,15590,15590\n2020.05.01-21.22.08,15590,15590,15585,15585,15585,15585,15585,0,15585,15585\n2020.05.01-21.22.48,15590,15590,15590,15590,15590,15590,15590,0,15590,15590\n"
  },
  {
    "path": "Content/Localization/WarriorbDialogues/WarriorbDialogues_Conflicts.txt",
    "content": ""
  },
  {
    "path": "Content/Localization/WarriorbDialogues/en/WarriorbDialogues.po",
    "content": "﻿# WarriorbDialogues English translation.\n# Copyright 1998-2019 Epic Games, Inc. All Rights Reserved.\n# \nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: WarriorbDialogues\\n\"\n\"POT-Creation-Date: 2020-10-07 08:09\\n\"\n\"PO-Revision-Date: 2020-10-07 08:09\\n\"\n\"Language-Team: \\n\"\n\"Language: en\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Plural-Forms: nplurals=2; plural=(n != 1);\\n\"\n\n#. Key:\t064BBCD1476819100C8D39881B7A7C56\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/2HW_LRDoor.2HW_LRDoor:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E2/2HW_LRDoor.2HW_LRDoor:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_2HW_LRDoor\"\nmsgid \"They still didn’t notice I locked them into the workroom.\"\nmsgstr \"They still didn’t notice I locked them into the workroom.\"\n\n#. Key:\t21412F0A4E45FA97703599BACD9C5D0E\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/2HW_LRDoor.2HW_LRDoor:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Ending/E2/2HW_LRDoor.2HW_LRDoor:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_2HW_LRDoor\"\nmsgid \"I entered into the Laboratory.\"\nmsgstr \"I entered into the Laboratory.\"\n\n#. Key:\t5A580A014B6E9907C819808423E10C30\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/2HW_LRDoor.2HW_LRDoor:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E2/2HW_LRDoor.2HW_LRDoor:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_2HW_LRDoor\"\nmsgid \"The Laboratory has strong secure spells. I can’t enter here without being noticed.\"\nmsgstr \"The Laboratory has strong secure spells. I can’t enter here without being noticed.\"\n\n#. Key:\t0530863744A9844E7F64009D82A189E4\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_2HW_WRDoor\"\nmsgid \"Ruin is close and we are all at risk. It’s not about you. It's about everyone.\"\nmsgstr \"Ruin is close and we are all at risk. It’s not about you. It's about everyone.\"\n\n#. Key:\t1AF2A89F4DCD86096D4343ABBE91BE51\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_2HW_WRDoor\"\nmsgid \"Something which doesn’t take my daughter’s soul...\"\nmsgstr \"Something which doesn’t take my daughter’s soul...\"\n\n#. Key:\t2C5B294847F0E41F2CA189904EE66059\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_2HW_WRDoor\"\nmsgid \"I heard father arguing with someone.\"\nmsgstr \"I heard father arguing with someone.\"\n\n#. Key:\t2C8DFF1042FB0480709877A366BE2F1D\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_2HW_WRDoor\"\nmsgid \"The device must be destroyed.. We’ll find something else to stop Ruin.\"\nmsgstr \"The device must be destroyed.. We’ll find something else to stop Ruin.\"\n\n#. Key:\t3F9D7D9C42A8550A6B282680BFAE2CCC\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_2HW_WRDoor\"\nmsgid \"I had to do this. At least for mom. So that she didn’t die in vain.\"\nmsgstr \"I had to do this. At least for mom. So that she didn’t die in vain.\"\n\n#. Key:\t7F6FC84C4D799841C6F42EB45A9D648F\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_2HW_WRDoor\"\nmsgid \"No, I won't risk losing her! She is bound to the device.\"\nmsgstr \"No, I won't risk losing her! She is bound to the device.\"\n\n#. Key:\tA03D724A4606AFFC00E417A5C3AB3BFF\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_2HW_WRDoor\"\nmsgid \"Lillian knew what she applied for. She must decide.\"\nmsgstr \"Lillian knew what she applied for. She must decide.\"\n\n#. Key:\tABA214914981F3E844F49483B43B5414\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_2HW_WRDoor\"\nmsgid \"I used the key to close the door.\"\nmsgstr \"I used the key to close the door.\"\n\n#. Key:\tB1ADF0404F97735215FCB9A47DD01640\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_2HW_WRDoor\"\nmsgid \"No, I’ve made my decision.\"\nmsgstr \"No, I’ve made my decision.\"\n\n#. Key:\tB26FAB564CA430617502FA85116629D0\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_2HW_WRDoor\"\nmsgid \"Even if our entire World needs to pay the price.\"\nmsgstr \"Even if our entire World needs to pay the price.\"\n\n#. Key:\tD6D2D64446B6D921576A20ACD653AF7E\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_2HW_WRDoor\"\nmsgid \"I knew he wouldn’t let me finish what we started.\"\nmsgstr \"I knew he wouldn’t let me finish what we started.\"\n\n#. Key:\t178EBCA541F7FEC3CA46B1B2818691D4\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/AABook.AABook:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/AABook.AABook:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_AABook\"\nmsgid \"'...the Wisest of the Arcade gathered here to discuss if the magical phenomena means any more threat...'\"\nmsgstr \"'...the Wisest of the Arcade gathered here to discuss if the magical phenomena means any more threat...'\"\n\n#. Key:\t8F2CCFF54FBAF7902DB6FEB0358ECFEF\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/AABook.AABook:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/AABook.AABook:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_AABook\"\nmsgid \"They were just like us. The next one hundred pages explain why Ruin will never reach the Arcade or how the Ancient Magic can stop it.\"\nmsgstr \"They were just like us. The next one hundred pages explain why Ruin will never reach the Arcade or how the Ancient Magic can stop it.\"\n\n#. Key:\tAC20B864497FB0D476C501AEF3B87508\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/AABook.AABook:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/AABook.AABook:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_AABook\"\nmsgid \"I hope you don’t want to read all that nonsense.\"\nmsgstr \"I hope you don’t want to read all that nonsense.\"\n\n#. Key:\tB112F657498F660766AA45974CB44137\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/AABook.AABook:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/AABook.AABook:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_AABook\"\nmsgid \"'Ten years after the Cataclysm (or recently named as Ruin)...'\"\nmsgstr \"'Ten years after the Cataclysm (or recently named as Ruin)...'\"\n\n#. Key:\t0F53B19F4EB2F7727B4907864AD3FF46\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_29.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_29.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"What if you just take a break from this and let me pass? Make an exception.\"\nmsgstr \"What if you just take a break from this and let me pass? Make an exception.\"\n\n#. Key:\t1707E0F34CFDC054DBEAD9AFB368A0A4\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"No rest, no sleep allowed.\"\nmsgstr \"No rest, no sleep allowed.\"\n\n#. Key:\t2524B3EC4DE1E2921C710CBE4511045F\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"...sometimes I could really appreciate a chair.\"\nmsgstr \"...sometimes I could really appreciate a chair.\"\n\n#. Key:\t29FE2AEF42639848EF3914B36BA2B633\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"I do ask you for apologies, young one.\"\nmsgstr \"I do ask you for apologies, young one.\"\n\n#. Key:\t2C1E7EA026080F0A003A0396BE7E0E7E\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"Take this rune stone as compensation.\"\nmsgstr \"Take this rune stone as compensation.\"\n\n#. Key:\t2C879B684B4B07B57D051797219E751E\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"You might have proven worthy for the Arcade Gate, yet there are some other doors, and they have different rules.\"\nmsgstr \"You might have proven worthy for the Arcade Gate, yet there are some other doors, and they have different rules.\"\n\n#. Key:\t3532C8254924CF13EA664CA11E256F07\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"Will you??? That's so kind of you... err... I mean...\"\nmsgstr \"Will you??? That's so kind of you... err... I mean...\"\n\n#. Key:\t353D6C8B4B5719B1EFD2A59BA0281DED\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_2.Children(2).Children.Text\n#. Key:\t8EED48724A0A860CAD791FAF95554F26\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_3.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_2.Children(2).Children.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_3.Children(1).Children.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"Skip?\"\nmsgstr \"Skip?\"\n\n#. Key:\t3FF1411844C23DB2FDFA47939169B5C3\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_14.Children(0).Children.Text\n#. Key:\t59EC5E56475DE41CFC723793CEEAFA82\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_3.Children(0).Children.Text\n#. Key:\t65DD6A464F04F8B0762D568046344C16\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_6.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_14.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_3.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_6.Children(0).Children.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"Accept challenge\"\nmsgstr \"Accept challenge\"\n\n#. Key:\t414D5CC44FFD640215B97BB6090627D6\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"That must be tough...\"\nmsgstr \"That must be tough...\"\n\n#. Key:\t4CAA2D0C4FB585A0EB5B4F87FE8A3A97\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"I accept my fate yet sometimes...\"\nmsgstr \"I accept my fate yet sometimes...\"\n\n#. Key:\t4F7460F540408D07FECEEB88DC0D7D25\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"Not so fast young lord!\"\nmsgstr \"Not so fast young lord!\"\n\n#. Key:\t52C3909F40026C52ADA498A5B60B3490\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_6.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_6.Children(1).Children.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"Poor Keeper\"\nmsgstr \"Poor Keeper\"\n\n#. Key:\t59141BA444003F36E1671CB4E91FFF0E\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"Farewell!\"\nmsgstr \"Farewell!\"\n\n#. Key:\t59AC0995469571DBE1B7B6BDF68FA37D\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"I am really sorry about that.\"\nmsgstr \"I am really sorry about that.\"\n\n#. Key:\t5C8404D34863129B221EF2BB1D0962CC\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_9.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_9.Children(0).Children.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"Yes?\"\nmsgstr \"Yes?\"\n\n#. Key:\t5FF922B94D3FCA5FD095FFB788F43D02\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"For there was a mistake.\"\nmsgstr \"For there was a mistake.\"\n\n#. Key:\t650DA55944F225C45BABE8B00D815A39\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_27.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_27.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"I guess you want me to go through some crazy traps again...\"\nmsgstr \"I guess you want me to go through some crazy traps again...\"\n\n#. Key:\t700A25DB401C6EDD1E9D1694DA1C1DA1\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"Keepers never fail their duty.\"\nmsgstr \"Keepers never fail their duty.\"\n\n#. Key:\t72D703F84C84CD07F7DA569D9B86AECB\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"There are times when you have to stand in front of a door for a really long time.\"\nmsgstr \"There are times when you have to stand in front of a door for a really long time.\"\n\n#. Key:\t8276A9AC4E3BAB81C41E6EAB12E4FED1\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_31.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_31.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"If I ever see a chair that's your size I will let you know.\"\nmsgstr \"If I ever see a chair that's your size I will let you know.\"\n\n#. Key:\t89421ED443CA8DD5A15DF289C5DC6C37\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_28.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_28.Children(0).Children.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"Accept Challenge\"\nmsgstr \"Accept Challenge\"\n\n#. Key:\t910F61A841D9E86D1B349E85A8A47FCF\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"Prove yourself worthy and I shall yield the path!\"\nmsgstr \"Prove yourself worthy and I shall yield the path!\"\n\n#. Key:\t9DAC66B94E5A37C628522B90029E8FCC\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_2.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_2.Children(0).Children.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"Not again\"\nmsgstr \"Not again\"\n\n#. Key:\t9F3FE24943FB7CE59B8453A2849E874A\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"This door is open and free of charge for everyone...\"\nmsgstr \"This door is open and free of charge for everyone...\"\n\n#. Key:\tA96E78A0410C87446F59ABAC1524A3F4\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_2.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_2.Children(1).Children.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"Let's do it!\"\nmsgstr \"Let's do it!\"\n\n#. Key:\tA9998DDC43D15F1EDE404B8A3E04E3B2\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"Keepers' lives are never easy.\"\nmsgstr \"Keepers' lives are never easy.\"\n\n#. Key:\tBCAE1C1D4890E79F187EF0940C6F7E84\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_12.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_12.Children(0).Children.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"Just get over\"\nmsgstr \"Just get over\"\n\n#. Key:\tC2F8F4E1457AC142E58D1EA3AF24AB56\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"I am all right with a few hundred years, but after a millennium my knees hurt like hell.\"\nmsgstr \"I am all right with a few hundred years, but after a millennium my knees hurt like hell.\"\n\n#. Key:\tC955446E4CA17593CCC57B9A73AAE824\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"What?? Do you mean that all those challenges that I had to pass were in vain?\"\nmsgstr \"What?? Do you mean that all those challenges that I had to pass were in vain?\"\n\n#. Key:\tC97F61DA4A49287F5242EEB43152D409\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"All right, you win. I'll go and do some jumping. Must be better than waiting here for an eternity.\"\nmsgstr \"All right, you win. I'll go and do some jumping. Must be better than waiting here for an eternity.\"\n\n#. Key:\tD318418D4CBBFA2AB381E6B287A8636F\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_30.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_30.Children(0).Children.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"Accept Challenge.\"\nmsgstr \"Accept Challenge.\"\n\n#. Key:\tD6BE170047C1A00770403087A7EBDF99\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_30.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_30.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"Hopefully, we will finish this soon.\"\nmsgstr \"Hopefully, we will finish this soon.\"\n\n#. Key:\tD72FF4F943571BE3DC8DB1877581D4CD\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"You shall prove yourself one more time.\"\nmsgstr \"You shall prove yourself one more time.\"\n\n#. Key:\tDFD8B1E0414F989D46ED9BB24610CDA8\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_12.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_12.Children(1).Children.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"I will help\"\nmsgstr \"I will help\"\n\n#. Key:\tFDDD27C544787C63B03CCE89B69A44E5\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"Well, thanks!\"\nmsgstr \"Well, thanks!\"\n\n#. Key:\t06D52FD74B0013A5A22FEBA7A6E82032\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Did you came back to check out my wares?\"\nmsgstr \"Did you came back to check out my wares?\"\n\n#. Key:\t07508A9F4A979D530AD8A9861F0C7D79\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Though maybe you will find relief by looking through my wares. Haha!\"\nmsgstr \"Though maybe you will find relief by looking through my wares. Haha!\"\n\n#. Key:\t0C1B7239419B00927360E1B9578540EA\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_27.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_27.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"That's a sad name indeed. If the old saying 'nomen est omen' is true, then it might not be the best choice.\"\nmsgstr \"That's a sad name indeed. If the old saying 'nomen est omen' is true, then it might not be the best choice.\"\n\n#. Key:\t0D8F81E140A7AF5369415FB1C081250E\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_10.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_10.Children(0).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Trade\"\nmsgstr \"Trade\"\n\n#. Key:\t1089DA0443D9B23C84B8B799EEEBCCC9\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_SpeechSequence_0.SpeechSequence(0).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_SpeechSequence_0.SpeechSequence(0).SpeechSequence.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Oh, that's sad my little one.\"\nmsgstr \"Oh, that's sad my little one.\"\n\n#. Key:\t16F6844C40498EC1B5CDAA87612D3982\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_42.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_42.Children(1).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"No way\"\nmsgstr \"No way\"\n\n#. Key:\t182D4124450BFA52EF26FBACE1706333\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_45.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_45.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"How noble of you!\"\nmsgstr \"How noble of you!\"\n\n#. Key:\t1922E4FD49ABC50B04A33CBA07B440D1\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_34.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_34.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"But I hope this doesn't mean that you want to join the Maintainers. Haha!\"\nmsgstr \"But I hope this doesn't mean that you want to join the Maintainers. Haha!\"\n\n#. Key:\t195B9BED4921EE6D732CA4BE6391A402\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_31.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_31.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"No, thanks!\"\nmsgstr \"No, thanks!\"\n\n#. Key:\t198A3D8D426F5202C280CE96202EB415\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_50.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_50.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"This is a sad name indeed. And if the old saying 'nomen est omen' is true, then this might not be the best choice.\"\nmsgstr \"This is a sad name indeed. And if the old saying 'nomen est omen' is true, then this might not be the best choice.\"\n\n#. Key:\t1AF2DDE74542524EEF19CA9567CFBDAF\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"{name}? It still sounds a bit weird, but I think I might like it.\"\nmsgstr \"{name}? It still sounds a bit weird, but I think I might like it.\"\n\n#. Key:\t1FC5AD3B488DB484169D0085D63ECC45\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"This sounds pretty epic but I wonder what nickname it might have?\"\nmsgstr \"This sounds pretty epic but I wonder what nickname it might have?\"\n\n#. Key:\t21FEE27B41116ADFBFD2B69333D6EB3F\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"By using some sort of ritual or spell...\"\nmsgstr \"By using some sort of ritual or spell...\"\n\n#. Key:\t25DCE964400342D4188412ADF43277E6\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_61.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_61.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"I am rewarding you with these shiny coins!\"\nmsgstr \"I am rewarding you with these shiny coins!\"\n\n#. Key:\t2717F0E0414D4828B67D9C9F9B7E5F84\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_62.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_62.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"See? I'm a gnome of my word!\"\nmsgstr \"See? I'm a gnome of my word!\"\n\n#. Key:\t2747A45248055455F9FA3B977A019EE0\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_44.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_44.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Well, you know where to find me... once you have some coins to spend!\"\nmsgstr \"Well, you know where to find me... once you have some coins to spend!\"\n\n#. Key:\t27CE4D1444C219D35B79F4A3B07CB67D\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"If you bring them to me, I will reward you with shiny golden coins!\"\nmsgstr \"If you bring them to me, I will reward you with shiny golden coins!\"\n\n#. Key:\t3040F4DC4C763062C8EFED9BCA5028C0\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_59.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_59.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"I would love to give you that name, but if you don't have the money to pay for it, we can't make the deal, it wouldn't be fair\"\nmsgstr \"I would love to give you that name, but if you don't have the money to pay for it, we can't make the deal, it wouldn't be fair\"\n\n#. Key:\t3124230541027A0022F54C8648E688C9\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Oh, a customer!\"\nmsgstr \"Oh, a customer!\"\n\n#. Key:\t31C147E1430106CD29C7D7B2F7E84975\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_23.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_23.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Oh, how sad.\"\nmsgstr \"Oh, how sad.\"\n\n#. Key:\t37CC1248471C360F8BB605A404ED1408\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_10.Children(4).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_10.Children(4).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Give books\"\nmsgstr \"Give books\"\n\n#. Key:\t3E0A0E06487AD4E75C3AF28786DE9CC7\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_16.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_16.Children(0).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Don't know\"\nmsgstr \"Don't know\"\n\n#. Key:\t40221BB0432119A5B1C285B748AEFB81\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_51.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_51.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"It sounds pretty epic, however I wonder what nickname it might have?\"\nmsgstr \"It sounds pretty epic, however I wonder what nickname it might have?\"\n\n#. Key:\t422B5CC14CA23A6563EDBDBBEA09C44B\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_73.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_73.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Farewell! Ha-ha...\"\nmsgstr \"Farewell! Ha-ha...\"\n\n#. Key:\t4574EE8E4B1EAB6C9310C4A19F77B170\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_10.Children(6).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_10.Children(6).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Leave\"\nmsgstr \"Leave\"\n\n#. Key:\t47F99BBF439F713C52279F86BDC4FDD5\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_72.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_72.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"No thanks, I'm leaving.\"\nmsgstr \"No thanks, I'm leaving.\"\n\n#. Key:\t4F31CEE0411BB60324FB58938857F162\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_16.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_16.Children(1).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"A mighty spirit\"\nmsgstr \"A mighty spirit\"\n\n#. Key:\t4FA29908450786B433C0FCA2E313D989\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_36.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_36.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Hi, I'm Lory.\"\nmsgstr \"Hi, I'm Lory.\"\n\n#. Key:\t4FCB34514D82104E732407A1CD985F6B\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_70.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_70.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Sure, show me what you've got!\"\nmsgstr \"Sure, show me what you've got!\"\n\n#. Key:\t53A46E1948B7CC1A9F8E02A3147FBF2D\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_67.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_67.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Sure, what can I do?\"\nmsgstr \"Sure, what can I do?\"\n\n#. Key:\t53E7A272465DE8D6E34AE7BE7435B1AC\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_25.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_25.Children(1).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Spirit of the Unknown\"\nmsgstr \"Spirit of the Unknown\"\n\n#. Key:\t54F8FB604F0409ED474FBFBAD8BFD3B3\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"And you are...\"\nmsgstr \"And you are...\"\n\n#. Key:\t58447CCB4EE84827DB8328A664C54198\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_24.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_24.Children(0).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Buy name\"\nmsgstr \"Buy name\"\n\n#. Key:\t589162A649D330D791082EB8FE3F6459\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_41.Children(4).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_41.Children(4).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Don't buy.\"\nmsgstr \"Don't buy.\"\n\n#. Key:\t58CC98724AFCD3826D69D482682AF352\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"\\\"The true value of your family\\\" and \\\"How much does a brother cost?\\\" can be two examples in this case.\"\nmsgstr \"\\\"The true value of your family\\\" and \\\"How much does a brother cost?\\\" can be two examples in this case.\"\n\n#. Key:\t5A249B2E47F62C59F66AD5848E6DEBFE\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_49.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_49.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"I'll see what I can do.\"\nmsgstr \"I'll see what I can do.\"\n\n#. Key:\t5A31E5D34729F7EAB69AC08238C1D32D\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_25.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_25.Children(0).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Failed One\"\nmsgstr \"Failed One\"\n\n#. Key:\t5BA1062346DF8BC47F97BA97653E6DDA\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_46.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_46.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Farewell then, and good luck with your quest! Ha-ha...\"\nmsgstr \"Farewell then, and good luck with your quest! Ha-ha...\"\n\n#. Key:\t6047D5334E0247BFB75EBAA7380C6800\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_68.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_68.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"I have some other important things to do right now.\"\nmsgstr \"I have some other important things to do right now.\"\n\n#. Key:\t60B184AF4F25AFB60380029BD2C17AAB\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_66.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_66.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"I'm a mighty spirit of the Unknown!\"\nmsgstr \"I'm a mighty spirit of the Unknown!\"\n\n#. Key:\t60CE0D4342B6E4971449D7BDDD62B13F\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_10.Children(3).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_10.Children(3).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Help\"\nmsgstr \"Help\"\n\n#. Key:\t62C5459E46C969412EAD70BAD466D808\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_SpeechSequence_0.SpeechSequence(1).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_SpeechSequence_0.SpeechSequence(1).SpeechSequence.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Life is relentless. Innocent people are trapped, enslaved or abused!\"\nmsgstr \"Life is relentless. Innocent people are trapped, enslaved or abused!\"\n\n#. Key:\t6DDEF0AB45B60A99946E8F9FC647DCDE\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_71.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_71.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"I need a proper name.\"\nmsgstr \"I need a proper name.\"\n\n#. Key:\t6F1C50A44DE698DF5BF089B1C9B29F06\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_69.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_69.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Right now I don't really have much money...\"\nmsgstr \"Right now I don't really have much money...\"\n\n#. Key:\t72272161488706E5E87697A755F11129\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Even though there are some other precious books that I could add to my collection...\"\nmsgstr \"Even though there are some other precious books that I could add to my collection...\"\n\n#. Key:\t764502A14C3C18B14F8A579A58CE5938\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"I know that some of those books must be in the Sewer's Library, but I couldn't find them.\"\nmsgstr \"I know that some of those books must be in the Sewer's Library, but I couldn't find them.\"\n\n#. Key:\t7A1853C7454D74FD1F371A92CEE47B4E\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"That's fine but I wonder, what is your name?\"\nmsgstr \"That's fine but I wonder, what is your name?\"\n\n#. Key:\t7BACFCA748AF641E051E2D8B8D8488FC\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"I don't know if I have one.\"\nmsgstr \"I don't know if I have one.\"\n\n#. Key:\t821021954082EA7E4B392FA89EE4DE91\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_41.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_41.Children(1).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Spirit of the Unknown (1 Gold)\"\nmsgstr \"Spirit of the Unknown (1 Gold)\"\n\n#. Key:\t83AECB5A4FCAB05CC81BCC9B810245B7\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_41.Children(2).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_41.Children(2).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"BALL-E (1 Gold)\"\nmsgstr \"BALL-E (1 Gold)\"\n\n#. Key:\t84ACF5E1449849CB79CF8AB10BE2FF2E\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"As you can observe, I have a pretty nice collection of books.\"\nmsgstr \"As you can observe, I have a pretty nice collection of books.\"\n\n#. Key:\t899D1E18420FDAD236BF3486B2A5A010\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Ring the bell if you need something.\"\nmsgstr \"Ring the bell if you need something.\"\n\n#. Key:\t8B33450F405DF08E72CE47B5FC66CDD5\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_55.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_55.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Spiry? Knowny?\"\nmsgstr \"Spiry? Knowny?\"\n\n#. Key:\t8CEC3E1943C3AB72CF3B71B160B9ADB9\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_10.Children(5).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_10.Children(5).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Need gold\"\nmsgstr \"Need gold\"\n\n#. Key:\t8D0FBCA540F73842DD3AC38A76A5B623\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_56.Text\n#. Key:\tF045657A439D69E3615B80A066E9CE86\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_33.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_33.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_56.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Nevermind! You chose well.\"\nmsgstr \"Nevermind! You chose well.\"\n\n#. Key:\t8F32BD4544F8C439D7344CBE1F9B4D8A\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_24.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_24.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Would you like to buy one? The first one is for free!\"\nmsgstr \"Would you like to buy one? The first one is for free!\"\n\n#. Key:\t94C0F9B34F439CDFBDFAD696E81983E5\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"I don't have much gold. Is there any way you could help me out?\"\nmsgstr \"I don't have much gold. Is there any way you could help me out?\"\n\n#. Key:\t9BA6BAA24E6C2B7F01964D892246E8F6\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"No, no, I meant the other bell.\"\nmsgstr \"No, no, I meant the other bell.\"\n\n#. Key:\tA9D4DF4C41BAD682571763BDA8DA6A62\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_10.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_10.Children(1).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Can't afford\"\nmsgstr \"Can't afford\"\n\n#. Key:\tAA6B105442F5099CE0F4E2AE0DFF7080\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_35.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_35.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Now that we're done with this, will you have a look at my wares?\"\nmsgstr \"Now that we're done with this, will you have a look at my wares?\"\n\n#. Key:\tAADE21D24A42CE7BD318478306BAFFF7\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_10.Children(2).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_10.Children(2).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"I need a name\"\nmsgstr \"I need a name\"\n\n#. Key:\tAB00899C4A94AA6458737BB28339A3EE\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Hush, hush, little one!\"\nmsgstr \"Hush, hush, little one!\"\n\n#. Key:\tAB431F244E4E18230CE5EAB99FB41A96\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_41.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_41.Children(0).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Failed One (1 Gold)\"\nmsgstr \"Failed One (1 Gold)\"\n\n#. Key:\tAB92E44E46B40EF16989FF850DE0F843\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_42.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_42.Children(0).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Interested\"\nmsgstr \"Interested\"\n\n#. Key:\tB0540325412D9839B33FB38C4FE73172\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Well, I guess that's a classic.\"\nmsgstr \"Well, I guess that's a classic.\"\n\n#. Key:\tB0EFD31840839CDA6F3D929514412D00\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Ok, I'll try not to be annoying this time.\"\nmsgstr \"Ok, I'll try not to be annoying this time.\"\n\n#. Key:\tB1F217944F6B9A29BD13FA926D8230E8\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_44.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_44.Children(0).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Farewell!\"\nmsgstr \"Farewell!\"\n\n#. Key:\tBA2B2F444FC2320349C4A0BABDA78B40\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_25.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_25.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"All right...\"\nmsgstr \"All right...\"\n\n#. Key:\tCADB3E394C94CDE32D9969B6C1A41F5C\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_47.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_47.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Take this Elevator Crystal as it might prove useful in your journey.\"\nmsgstr \"Take this Elevator Crystal as it might prove useful in your journey.\"\n\n#. Key:\tCB3F061042B8340154B4CD8AEED41348\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_42.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_42.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"However, there is a way, I can help you out. Of course, if you are interested.\"\nmsgstr \"However, there is a way, I can help you out. Of course, if you are interested.\"\n\n#. Key:\tCF24AD454E123F6D7D61029155390914\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_41.Children(3).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_41.Children(3).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Warriorb (1 Gold)\"\nmsgstr \"Warriorb (1 Gold)\"\n\n#. Key:\tD01937C848C69809890885BAB13042BE\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_65.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_65.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"I'm not quite sure.\"\nmsgstr \"I'm not quite sure.\"\n\n#. Key:\tD53097EB4EFC08C0C3261A9EEBD96B72\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_39.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_39.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"That's sad. Nothing is worse than a customer without any gold to spend!\"\nmsgstr \"That's sad. Nothing is worse than a customer without any gold to spend!\"\n\n#. Key:\tD63C08294AC09BF5B8E5D29EEC1C7D39\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"I'm forced to stay in this realm because I agreed to do some silly tasks for a wizard. I could really use some help.\"\nmsgstr \"I'm forced to stay in this realm because I agreed to do some silly tasks for a wizard. I could really use some help.\"\n\n#. Key:\tDB0CCA7746068ACFBE6F71963C398753\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_63.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_63.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"And now that you have some coins to spend it's time to talk about business!\"\nmsgstr \"And now that you have some coins to spend it's time to talk about business!\"\n\n#. Key:\tDC0F8EC0407F1C7B4FFED6A91CB961C5\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_57.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_57.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"I hope this doesn't mean that you want to join the Maintainers. Haha!\"\nmsgstr \"I hope this doesn't mean that you want to join the Maintainers. Haha!\"\n\n#. Key:\tDC475A6740B71354D90D53B6AD1C4740\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_60.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_60.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"How wondrous! You found my books!\"\nmsgstr \"How wondrous! You found my books!\"\n\n#. Key:\tE3B8F89B4D4AC0ABD2E35994ABFA9916\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"I understand if you have identity problems, but there must be a way... how do others call you?\"\nmsgstr \"I understand if you have identity problems, but there must be a way... how do others call you?\"\n\n#. Key:\tE6BD711C4E23B71F944EEFB1C8D09AB4\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_41.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_41.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"You've come to the right place! Haha!\"\nmsgstr \"You've come to the right place! Haha!\"\n\n#. Key:\tEDEB662C4A5024CC618A668699BFAC2C\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_SpeechSequence_0.SpeechSequence(2).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_SpeechSequence_0.SpeechSequence(2).SpeechSequence.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"There is no justice in this Realm.\"\nmsgstr \"There is no justice in this Realm.\"\n\n#. Key:\tF8814FA0497129A211F3F9BE01EAF378\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_29.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_29.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"That's a very cute name for a little one like you.\"\nmsgstr \"That's a very cute name for a little one like you.\"\n\n#. Key:\tF8BEB8C147C81D8B13E52AA9934891AB\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_58.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_58.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Nevermind, you can always come back.\"\nmsgstr \"Nevermind, you can always come back.\"\n\n#. Key:\tF97BE7FD49F465A97F7C8D9F308EAD3C\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_52.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_52.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"That's such a cute name for a little one.\"\nmsgstr \"That's such a cute name for a little one.\"\n\n#. Key:\tFAAAE5944AA8CCAEFC931CAA814C8621\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_54.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_54.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Which means you chose well.\"\nmsgstr \"Which means you chose well.\"\n\n#. Key:\tFAD10B404CF744B61DF5D093829CD1E9\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Of course! You need some gold, otherwise how would you buy my stuff?\"\nmsgstr \"Of course! You need some gold, otherwise how would you buy my stuff?\"\n\n#. Key:\tFE40092A444E97C59E8C6E94061D1134\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_30.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_30.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"However, I'd rather prefer: 'Nomen quantivis iam est pret!'\"\nmsgstr \"However, I'd rather prefer: 'Nomen quantivis iam est pret!'\"\n\n#. Key:\tFEE11C0F4A65DDFFDBF0BD8BB30CD438\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_25.Children(2).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_25.Children(2).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"BALL-E\"\nmsgstr \"BALL-E\"\n\n#. Key:\tFF0AFE8544814AE524115A853547D727\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_24.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_24.Children(1).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Refuse\"\nmsgstr \"Refuse\"\n\n#. Key:\t0648624E4922B098541A7EA738DABC92\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/AARagdoll.AARagdoll:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/AARagdoll.AARagdoll:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_AARagdoll\"\nmsgid \"Well that happens sometimes. Maybe that someone forgot to monopolize this ragdoll design.\"\nmsgstr \"Well that happens sometimes. Maybe that someone forgot to monopolize this ragdoll design.\"\n\n#. Key:\t2058DE654B2B75531C04628635169938\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/AARagdoll.AARagdoll:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/AARagdoll.AARagdoll:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_AARagdoll\"\nmsgid \"Just leave that doll.\"\nmsgstr \"Just leave that doll.\"\n\n#. Key:\t5A456D084D452C82038A04942002FAE6\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/AARagdoll.AARagdoll:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/AARagdoll.AARagdoll:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_AARagdoll\"\nmsgid \"It’s like the doll which was made by...\"\nmsgstr \"It’s like the doll which was made by...\"\n\n#. Key:\t7813ED164DF5CA7DE48A978F9A3DC959\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/AARagdoll.AARagdoll:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/AARagdoll.AARagdoll:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_AARagdoll\"\nmsgid \"How on earth did this get here?\"\nmsgstr \"How on earth did this get here?\"\n\n#. Key:\tC4403E4C4FD7D72CA3252FB31FF98FDF\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/AARagdoll.AARagdoll:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/AARagdoll.AARagdoll:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_AARagdoll\"\nmsgid \"...by someone I knew.\"\nmsgstr \"...by someone I knew.\"\n\n#. Key:\tE4CD5DBC4E4BB1E783B55D80F4296B97\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/AARagdoll.AARagdoll:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/AARagdoll.AARagdoll:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_AARagdoll\"\nmsgid \"There are many weird things all over this place. What makes this stand out?\"\nmsgstr \"There are many weird things all over this place. What makes this stand out?\"\n\n#. Key:\tEDD72B38407D0C33C5F7859D09BC132B\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/AARagdoll.AARagdoll:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/AARagdoll.AARagdoll:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_AARagdoll\"\nmsgid \"You are not funny.\"\nmsgstr \"You are not funny.\"\n\n#. Key:\t02767246403F00F0C866B2A7F3E22A47\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_72.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_72.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"You can hardly find anyone that has more information about the Realms.\"\nmsgstr \"You can hardly find anyone that has more information about the Realms.\"\n\n#. Key:\t04843D4A4D2DD4BC7CE50989C8F66FBA\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_2.SpeechSequence(2).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_2.SpeechSequence(2).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"How can I do something if I do not know what I have to do?\"\nmsgstr \"How can I do something if I do not know what I have to do?\"\n\n#. Key:\t071A801E44759E2681218497B9AE9A2B\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_53.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_53.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Your logic is incoherent.\"\nmsgstr \"Your logic is incoherent.\"\n\n#. Key:\t07488F9A4CC6F87DBC44F0A11700B370\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_70.Children(0).Children.Text\n#. Key:\tA67B3D3B4A3D17B37D585EBBBD9BBE92\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_75.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_70.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_75.Children(0).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"All right, I'm on it.\"\nmsgstr \"All right, I'm on it.\"\n\n#. Key:\t0757D23846F6BC96198472B7E9848D3F\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_52.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_52.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Maybe I should accept what I need to do now.\"\nmsgstr \"Maybe I should accept what I need to do now.\"\n\n#. Key:\t07D63011406134B07FB90B903825151C\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_8.SpeechSequence(2).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_8.SpeechSequence(2).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Make your wizard turn you back to normal.\"\nmsgstr \"Make your wizard turn you back to normal.\"\n\n#. Key:\t091DFEFA4B2DD8F9922A1B93534C66A8\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_70.Text\n#. Key:\t0F92571643C12F65C669F7812572B014\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_82.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_70.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_82.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven gives you one of his keys so that you can move around freely.\"\nmsgstr \"Raven gives you one of his keys so that you can move around freely.\"\n\n#. Key:\t0922ED5741BB89553CCB548D33566972\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_8.SpeechSequence(4).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_8.SpeechSequence(4).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven is something which won't make wizards turn Raven back.\"\nmsgstr \"Raven is something which won't make wizards turn Raven back.\"\n\n#. Key:\t0AAFADBB493DCFBA6C649EAC11133DC2\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_2.SpeechSequence(0).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_2.SpeechSequence(0).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"You don't have to know.\"\nmsgstr \"You don't have to know.\"\n\n#. Key:\t0E59A33E44BF6B212BF0EF8E8EFB3E39\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_6.SpeechSequence(2).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_6.SpeechSequence(2).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"A rich kingdom ruling all the other lands, powered by spirits of another world; these spirits were bound to metal.\"\nmsgstr \"A rich kingdom ruling all the other lands, powered by spirits of another world; these spirits were bound to metal.\"\n\n#. Key:\t0EACC01B4A4C4F8C5622B9BD291E0DB9\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_91.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_91.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"I'm not quite sure about this...\"\nmsgstr \"I'm not quite sure about this...\"\n\n#. Key:\t10142FA943B5E5D89F9E5AADC86EF413\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_113.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_113.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Yes.\"\nmsgstr \"Yes.\"\n\n#. Key:\t12375FB0475147E23E1C21A867CFF219\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_68.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_68.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Is there anything else on your mind?\"\nmsgstr \"Is there anything else on your mind?\"\n\n#. Key:\t12A0B58B446843DD24045394E8586D7D\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Krrr...\"\nmsgstr \"Krrr...\"\n\n#. Key:\t12B921E04D135919C7DA37ADDBD2A7DB\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_100.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_100.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"We still have some time left before this happens.\"\nmsgstr \"We still have some time left before this happens.\"\n\n#. Key:\t133F676B4DBA8B41F6B94387D51457D5\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_59.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_59.Children(1).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"No more Raven\"\nmsgstr \"No more Raven\"\n\n#. Key:\t13EF39EE4249FDD62208CFB7A41821D7\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_65.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_65.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Though Raven knows how you feel.\"\nmsgstr \"Though Raven knows how you feel.\"\n\n#. Key:\t15D06ACE4E8B5E4DA49297BBE436039D\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_80.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_80.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Now you only need to find a place where you can infuse it.\"\nmsgstr \"Now you only need to find a place where you can infuse it.\"\n\n#. Key:\t16D5522340AE76E69A4808A3C2D1C039\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_51.Children(1).Children.Text\n#. Key:\t2AD4608440348AC7C3E363A430B9848C\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_83.Children(0).Children.Text\n#. Key:\t57DDAE184F31D9761E3939B16E6B2E67\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_20.Children(1).Children.Text\n#. Key:\t59F157C64A5415C8B4E322B0FF5F2ACE\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_49.Children(1).Children.Text\n#. Key:\t73ACC7124190746F6D3EBF96C8202C25\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_77.Children(1).Children.Text\n#. Key:\t9900274346DCB374A4B222A6BFD67365\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_10.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_10.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_20.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_49.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_51.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_77.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_83.Children(0).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Chat\"\nmsgstr \"Chat\"\n\n#. Key:\t19FD8B0541A533338EA11B9CDA3719B2\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_74.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_74.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Now you only need to find a place where you can infuse it. Meanwhile, Raven must figure it out how to open the Gate with it.\"\nmsgstr \"Now you only need to find a place where you can infuse it. Meanwhile, Raven must figure it out how to open the Gate with it.\"\n\n#. Key:\t1BD7592A4F11AEC585ECA6A74A0E0D4E\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_9.SpeechSequence(4).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_9.SpeechSequence(4).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"In what way?\"\nmsgstr \"In what way?\"\n\n#. Key:\t1C30FADA4BB2B3CCE2140A8E192D9F14\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_34.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_34.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven is not like those dummy Living Armors, yet he does what he was made for.\"\nmsgstr \"Raven is not like those dummy Living Armors, yet he does what he was made for.\"\n\n#. Key:\t1C57460444A7E044DD96148495C4C217\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_6.SpeechSequence(4).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_6.SpeechSequence(4).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"They lost purpose and became reckless.\"\nmsgstr \"They lost purpose and became reckless.\"\n\n#. Key:\t1E3AF1D8483287CE52633EA41B89DF11\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_116.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_116.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"After he had some rest.\"\nmsgstr \"After he had some rest.\"\n\n#. Key:\t1ED675F344909355D41212988B736F70\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_1.SpeechSequence(3).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_1.SpeechSequence(3).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven's master would like to understand before doing anything.\"\nmsgstr \"Raven's master would like to understand before doing anything.\"\n\n#. Key:\t22E51DC245ABAE53146A71AAE8D5AB55\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"You will realize that 'sense' has no meaning in this realm anymore.\"\nmsgstr \"You will realize that 'sense' has no meaning in this realm anymore.\"\n\n#. Key:\t236E0B58451C947C0DB93E9E3408456D\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_45.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_45.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"They are humans.\"\nmsgstr \"They are humans.\"\n\n#. Key:\t254FBEE547ADDFCF33B350B04AE1EE16\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_95.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_95.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"I think I know all about the meaning of life and all, ok? Can we just go on?\"\nmsgstr \"I think I know all about the meaning of life and all, ok? Can we just go on?\"\n\n#. Key:\t2671F10D4257D8A3482009A9C042026D\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Hand it over to Raven so he could open the Gate!\"\nmsgstr \"Hand it over to Raven so he could open the Gate!\"\n\n#. Key:\t2845CBE64B1624C7EC4B81BC314B4F1B\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_27.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_27.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"The master gave Raven the ability to think and talk.\"\nmsgstr \"The master gave Raven the ability to think and talk.\"\n\n#. Key:\t29F405BF4233B5A8331B419747954425\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_77.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_77.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Why are you here?\"\nmsgstr \"Why are you here?\"\n\n#. Key:\t2B5FB92D4F98359F68AD58AB776FD9BA\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_9.SpeechSequence(1).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_9.SpeechSequence(1).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Seeking for knowledge, as always. And you? Never thought we’ll meet again. Still trying to take down these Realms forever?\"\nmsgstr \"Seeking for knowledge, as always. And you? Never thought we’ll meet again. Still trying to take down these Realms forever?\"\n\n#. Key:\t2B8CF34046D5486EB935CE919A1BD469\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_97.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_97.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"I'm new with all this wizard business thing. What was their conversation about?\"\nmsgstr \"I'm new with all this wizard business thing. What was their conversation about?\"\n\n#. Key:\t2C15668C26080F0A003A02E7BE7B5A65\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_8.SpeechSequence(1).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_8.SpeechSequence(1).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"It can happen again.\"\nmsgstr \"It can happen again.\"\n\n#. Key:\t2F226AC246B52387854AF5AFA09CEDD6\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_43.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_43.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"So we let those keys behind and set ourselves free from wizards?\"\nmsgstr \"So we let those keys behind and set ourselves free from wizards?\"\n\n#. Key:\t2FF7B3E84C009ECFDDE9F495092BEAA8\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_9.SpeechSequence(7).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_9.SpeechSequence(7).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"A pleasure to hear that. Talk to Raven about the details. Please excuse me for leaving so early, I have something important to do.\"\nmsgstr \"A pleasure to hear that. Talk to Raven about the details. Please excuse me for leaving so early, I have something important to do.\"\n\n#. Key:\t305333F348E677D8C3553999F412C8B6\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_36.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_36.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven knows he has different tasks now, compared to what he used to do before.\"\nmsgstr \"Raven knows he has different tasks now, compared to what he used to do before.\"\n\n#. Key:\t311A1E3745667AC6B4114D999B0E7C7F\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_83.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_83.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Go now! Raven still needs some more time to think about this.\"\nmsgstr \"Go now! Raven still needs some more time to think about this.\"\n\n#. Key:\t32F0018141E94BDE0921E9A54C1E4F20\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_1.SpeechSequence(0).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_1.SpeechSequence(0).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"They were always like this.\"\nmsgstr \"They were always like this.\"\n\n#. Key:\t34903F43484A4D6CE5735890AEEA294D\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_9.SpeechSequence(5).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_9.SpeechSequence(5).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"The Cerulean Gates are closed again. What if we share the work?\"\nmsgstr \"The Cerulean Gates are closed again. What if we share the work?\"\n\n#. Key:\t350270814B961A20E48267A4B1AE0538\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Yes! The Gem is fully charged!\"\nmsgstr \"Yes! The Gem is fully charged!\"\n\n#. Key:\t361D80AB46AC47E5A233ECA2323222A2\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_86.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_86.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Why are you obeying that wizard of yours?\"\nmsgstr \"Why are you obeying that wizard of yours?\"\n\n#. Key:\t365EDA2849D42A47D0D26DAC50DA6E94\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven is not that happy with those two, but Raven can accept that he is what he is.\"\nmsgstr \"Raven is not that happy with those two, but Raven can accept that he is what he is.\"\n\n#. Key:\t37C560AB4CCFAF4F8D26FAB1DE22453C\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_63.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_63.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Don't worry. You'll find some purpose.\"\nmsgstr \"Don't worry. You'll find some purpose.\"\n\n#. Key:\t39DAB8B641C31878F7312FA7807D9DA0\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_6.SpeechSequence(3).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_6.SpeechSequence(3).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"The residents of the Realm did not have to work. Their spirit slaves did everything for them, they accomplished all their desires.\"\nmsgstr \"The residents of the Realm did not have to work. Their spirit slaves did everything for them, they accomplished all their desires.\"\n\n#. Key:\t3B63606F48193748243DE6AB18D7A68C\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_40.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_40.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven thinks you might want to be something else. Something that you used to be, but you are not anymore.\"\nmsgstr \"Raven thinks you might want to be something else. Something that you used to be, but you are not anymore.\"\n\n#. Key:\t3C332B1C4ADB3C16C005E8AAF76A09B1\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_109.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_109.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Except...\"\nmsgstr \"Except...\"\n\n#. Key:\t3C9750814FC56947BDA7DFAF8A71DCC2\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_25.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_25.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"It is a long story and Raven doesn't really like to talk about it.\"\nmsgstr \"It is a long story and Raven doesn't really like to talk about it.\"\n\n#. Key:\t3D10982D4A6FA88941F13F82413D17AC\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_20.Children(0).Children.Text\n#. Key:\t3E117EBB48C1CF091F456CA0FB78EDD7\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_77.Children(0).Children.Text\n#. Key:\t59F0F04941BB918E08743E8A7C3734B2\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_32.Children(6).Children.Text\n#. Key:\t6556945844ED44678075CE8796F00800\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_51.Children(0).Children.Text\n#. Key:\t7EC3944940792EC71B6A2F8674250649\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_49.Children(0).Children.Text\n#. Key:\tC6963EAE43B4D0FD3C8FBAA80A38E2A2\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_83.Children(1).Children.Text\n#. Key:\tE048FA684AA7B8DE0F7273992DA4600E\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_3.Children(4).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_20.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_3.Children(4).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_32.Children(6).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_49.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_51.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_77.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_83.Children(1).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Leave\"\nmsgstr \"Leave\"\n\n#. Key:\t4417EE084F947AAF5D3285B086F741AC\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven is fine with talking. Ask me whatever you have on your mind!\"\nmsgstr \"Raven is fine with talking. Ask me whatever you have on your mind!\"\n\n#. Key:\t4485635A4832D9DC57240F8EF3323042\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Very nice! Raven likes that you are making progress.\"\nmsgstr \"Very nice! Raven likes that you are making progress.\"\n\n#. Key:\t480718E34822FD682466E7B217249ED0\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_47.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_47.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Which is technically the same.\"\nmsgstr \"Which is technically the same.\"\n\n#. Key:\t48B67F42417A2930A4D200B958FDFB58\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_38.Children(3).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_38.Children(3).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"I'm confused\"\nmsgstr \"I'm confused\"\n\n#. Key:\t49F0AC6A46EBF6C3148BC590CE56C297\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_10.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_10.Children(0).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Help\"\nmsgstr \"Help\"\n\n#. Key:\t4CB1CE8A4AEC18FA175BA98F831D3C3C\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_59.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_59.Children(0).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Farewell\"\nmsgstr \"Farewell\"\n\n#. Key:\t4D514A7D4CC96E3E79F464A6C0BF0C6E\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_2.SpeechSequence(4).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_2.SpeechSequence(4).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"What??\"\nmsgstr \"What??\"\n\n#. Key:\t4F8198D64A210B3A41EED8AA6AE64401\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_50.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_50.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven will just sit here for a short time before venturing into the Ruin.\"\nmsgstr \"Raven will just sit here for a short time before venturing into the Ruin.\"\n\n#. Key:\t503CD5334EE86CFBEC2E7EA67F45ACD9\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"So you're meant to open this dusty little door with Raven, aren't you?\"\nmsgstr \"So you're meant to open this dusty little door with Raven, aren't you?\"\n\n#. Key:\t512AEC2642B36D9DDF407EB447DF5A28\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_15.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_15.Children(1).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Let's have fun!\"\nmsgstr \"Let's have fun!\"\n\n#. Key:\t5142E71B48C2E993CC8026919A3FDBD6\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_87.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_87.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Er... okey, I was just asking.\"\nmsgstr \"Er... okey, I was just asking.\"\n\n#. Key:\t518038644F25D09C9DA7FF984C272B77\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_40.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_40.Children(1).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"That's stupid\"\nmsgstr \"That's stupid\"\n\n#. Key:\t53B5A1AC40CCF1CFBC106BA2BD8000E0\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_60.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_60.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Farewell, Raven!\"\nmsgstr \"Farewell, Raven!\"\n\n#. Key:\t54C0F3A6493E6D0671D38DB16BD4BF51\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"I would like to know...\"\nmsgstr \"I would like to know...\"\n\n#. Key:\t55665725414633C111356D94939362FF\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_67.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_67.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Let's open that gate. Quick!\"\nmsgstr \"Let's open that gate. Quick!\"\n\n#. Key:\t565D7DA644ADF0E536C2FC8F99B735A3\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_3.Children(2).Children.Text\n#. Key:\t934A23AD44787C735FCDE79A34657C90\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_32.Children(3).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_3.Children(2).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_32.Children(3).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Why is he here?\"\nmsgstr \"Why is he here?\"\n\n#. Key:\t57BE04074884DB4CC54AC691E156F0FC\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_38.Children(2).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_38.Children(2).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Freedom\"\nmsgstr \"Freedom\"\n\n#. Key:\t5919EDBF4799413180AF569CB920E436\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_90.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_90.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"You can't live your life like in the old days any longer and that's why you're staying with your master, right?\"\nmsgstr \"You can't live your life like in the old days any longer and that's why you're staying with your master, right?\"\n\n#. Key:\t592D458F40571927D0BB549F3614420E\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_32.Children(5).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_32.Children(5).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"End of the World\"\nmsgstr \"End of the World\"\n\n#. Key:\t596065A34760461993AC339C51D9E402\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_73.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_73.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"First you will need to find the Gem. Meanwhile, Raven must figure it out how to open the Gate with it.\"\nmsgstr \"First you will need to find the Gem. Meanwhile, Raven must figure it out how to open the Gate with it.\"\n\n#. Key:\t599A90394B8AC7A26D20FEB355A873FB\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_98.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_98.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"What are you doing here?\"\nmsgstr \"What are you doing here?\"\n\n#. Key:\t5A5D2F08427C4747F3EF529D6B73A21B\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Go on your search then! Unless you'd like to chat some more with Raven.\"\nmsgstr \"Go on your search then! Unless you'd like to chat some more with Raven.\"\n\n#. Key:\t5A63E364458C849C9B6FDD8491427051\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_8.SpeechSequence(5).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_8.SpeechSequence(5).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"But you could.\"\nmsgstr \"But you could.\"\n\n#. Key:\t5B07757F4CAAD674E09EBB835CEE230B\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_75.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_75.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"It must be somewhere close to the Arcade.\"\nmsgstr \"It must be somewhere close to the Arcade.\"\n\n#. Key:\t5B9CDB4340B5E65E59D3A18283A84CA5\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_64.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_64.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven knows some people that'd be glad with that.\"\nmsgstr \"Raven knows some people that'd be glad with that.\"\n\n#. Key:\t5BA0645E49A62C0945FB64BDF689721F\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_112.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_112.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Is that where I will find your artefacts?\"\nmsgstr \"Is that where I will find your artefacts?\"\n\n#. Key:\t5E70951F4E50B061FF2DA196F0207612\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_15.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_15.Children(0).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Save the world!\"\nmsgstr \"Save the world!\"\n\n#. Key:\t5F810A7D417E5B02025F30B21FEA5F03\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_79.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_79.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Niiice!\"\nmsgstr \"Niiice!\"\n\n#. Key:\t6441F8C2484FAA5219841C9D374F36C4\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_6.SpeechSequence(6).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_6.SpeechSequence(6).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"And now, even while we speak, their curse continues to spread.\"\nmsgstr \"And now, even while we speak, their curse continues to spread.\"\n\n#. Key:\t66A08695458FF9D46383F6A0AF609EFA\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_41.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_41.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"You are so hopeless...\"\nmsgstr \"You are so hopeless...\"\n\n#. Key:\t67EEF3DB42BA2C954AD566B4F95EBDB6\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_6.SpeechSequence(5).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_6.SpeechSequence(5).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Until one day the spirits broke loose and formed Ruin.\"\nmsgstr \"Until one day the spirits broke loose and formed Ruin.\"\n\n#. Key:\t68442CA14CECA9FB8A215EBEBC724F63\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Ask more from Raven if you like!\"\nmsgstr \"Ask more from Raven if you like!\"\n\n#. Key:\t694D416244358BD7DBED04A82390A146\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_51.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_51.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"One more,... and the Gem will be completed!\"\nmsgstr \"One more,... and the Gem will be completed!\"\n\n#. Key:\t6A463E0444754B73FE11988F07D5A58F\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_2.SpeechSequence(1).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_2.SpeechSequence(1).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"You just have to do it.\"\nmsgstr \"You just have to do it.\"\n\n#. Key:\t6A92F010409301669F7B83AD7901A469\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"A strange creature, yet a familiar aura! Tell me, my dear Wizard, what happened to Tabby?\"\nmsgstr \"A strange creature, yet a familiar aura! Tell me, my dear Wizard, what happened to Tabby?\"\n\n#. Key:\t6CC1259244D5FC82CA1C2EA314836741\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_1.SpeechSequence(1).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_1.SpeechSequence(1).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"They both accepted that there is a great threat in this realm.\"\nmsgstr \"They both accepted that there is a great threat in this realm.\"\n\n#. Key:\t6FB7AF774662247E2001F9AAF34FF134\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_111.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_111.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Somewhere beyond that Gate there's a Portal. It will take you into the heart of the Realm.\"\nmsgstr \"Somewhere beyond that Gate there's a Portal. It will take you into the heart of the Realm.\"\n\n#. Key:\t70A0BA47476A909013EFC0A574815B61\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_23.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_23.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"The Master and Raven are seeking knowledge about the Ruined Realm.\"\nmsgstr \"The Master and Raven are seeking knowledge about the Ruined Realm.\"\n\n#. Key:\t70ECE1B74BA0B02F2F0850937BF4FB02\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_3.Children(3).Children.Text\n#. Key:\tE9F5916345156A4E5F29AC886B49B8AD\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_32.Children(4).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_3.Children(3).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_32.Children(4).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"About Ruin\"\nmsgstr \"About Ruin\"\n\n#. Key:\t7311CA4B4D6B19C6C5C362AF522A9803\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_1.SpeechSequence(4).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_1.SpeechSequence(4).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Your master said he is done with that.\"\nmsgstr \"Your master said he is done with that.\"\n\n#. Key:\t74B8E0B44D4590E9970F4B9D09D3C4F9\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_6.SpeechSequence(1).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_6.SpeechSequence(1).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Long ago it was called the Runic Realm.\"\nmsgstr \"Long ago it was called the Runic Realm.\"\n\n#. Key:\t76756B1C48E93E907CE32D83A2C56C3E\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_7.SpeechSequence(0).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_7.SpeechSequence(0).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven is really sorry but he can't help you anymore.\"\nmsgstr \"Raven is really sorry but he can't help you anymore.\"\n\n#. Key:\t78C7CE5948D176704CA69289BEEBFBA7\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_44.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_44.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"And what about the Realm of the wizards? They did not go mad yet, did they?\"\nmsgstr \"And what about the Realm of the wizards? They did not go mad yet, did they?\"\n\n#. Key:\t7DFA4D494BD0536F925A94BBF7C71F36\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_66.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_66.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Focus on what you have to do and you will find the real you.\"\nmsgstr \"Focus on what you have to do and you will find the real you.\"\n\n#. Key:\t81F437694DEE3D32A0FC29B90688E8B9\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_38.Children(4).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_38.Children(4).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"This is stupid\"\nmsgstr \"This is stupid\"\n\n#. Key:\t82F473A04D250E98AD186185EBE95C04\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_5.SpeechSequence(0).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_5.SpeechSequence(0).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven thinks freedom is such an empty word.\"\nmsgstr \"Raven thinks freedom is such an empty word.\"\n\n#. Key:\t8688802A4303C53640C7BFAAA40226EC\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Almost there!\"\nmsgstr \"Almost there!\"\n\n#. Key:\t8728C02E46E7B681D0A792ACAFC3237D\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_28.Children(2).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_28.Children(2).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"He accepted his fate\"\nmsgstr \"He accepted his fate\"\n\n#. Key:\t8854653141FA36E731780F9111B82FAD\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_30.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_30.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"You are not listening to Raven's words!\"\nmsgstr \"You are not listening to Raven's words!\"\n\n#. Key:\t88FDA06B4A44ED1BF559D996E6AF7097\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_6.SpeechSequence(0).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_6.SpeechSequence(0).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Even so, Raven will tell you a bit.\"\nmsgstr \"Even so, Raven will tell you a bit.\"\n\n#. Key:\t8BA584404F2713EE39D74284F829C50A\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"You know what? Raven totally agrees with that!\"\nmsgstr \"You know what? Raven totally agrees with that!\"\n\n#. Key:\t8C272FBE47796CF8101D07AAD033C24B\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_62.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_62.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"The later we met the more time the World survived, didn't it?\"\nmsgstr \"The later we met the more time the World survived, didn't it?\"\n\n#. Key:\t8DD39A3D497411B348B883972CE6B442\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_6.SpeechSequence(7).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_6.SpeechSequence(7).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"At first, lands lose their colours, people go mad... and then, everything breaks into shards until solely hollowness remains...\"\nmsgstr \"At first, lands lose their colours, people go mad... and then, everything breaks into shards until solely hollowness remains...\"\n\n#. Key:\t8E02961D428949EE8176639F6AE84DD9\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_107.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_107.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"If the end is near, there is no point in making long term plans.\"\nmsgstr \"If the end is near, there is no point in making long term plans.\"\n\n#. Key:\t8EB8F2654B9C18135CBEB49D10485417\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_37.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_37.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"We all have a purpose in life.\"\nmsgstr \"We all have a purpose in life.\"\n\n#. Key:\t9131DE4C434AD9B22C7B1BAA588AF694\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_9.SpeechSequence(3).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_9.SpeechSequence(3).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Private business? All right! We might have different motivations, however working together could be fruitful.\"\nmsgstr \"Private business? All right! We might have different motivations, however working together could be fruitful.\"\n\n#. Key:\t91947E4046F96E9330EA5A94C367E2C5\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Forget it, I'm on my way now.\"\nmsgstr \"Forget it, I'm on my way now.\"\n\n#. Key:\t91BE2C7248B2BEBE1C376B989935E353\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"What else should Raven tell you?\"\nmsgstr \"What else should Raven tell you?\"\n\n#. Key:\t929558D0465B0884C4E373A602CCE9E5\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_59.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_59.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Farewell compeer until you meet Raven again!\"\nmsgstr \"Farewell compeer until you meet Raven again!\"\n\n#. Key:\t930942934A83107D86DB69A2C2EF11E0\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_117.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_117.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"The task is of high complexity.\"\nmsgstr \"The task is of high complexity.\"\n\n#. Key:\t93AFC24842A793D2BF7B43A64B6972AF\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_32.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_32.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Is there anything else for Raven?\"\nmsgstr \"Is there anything else for Raven?\"\n\n#. Key:\t9A9D5DA346251040AF73B7B100E1EBC9\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_35.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_35.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven used to like being a bird, but now he has no other choice. He must embrace what he became.\"\nmsgstr \"Raven used to like being a bird, but now he has no other choice. He must embrace what he became.\"\n\n#. Key:\t9B558C3045D4501AEAF3DD8694E2198F\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_105.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_105.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"We'd rather have some fun before it's all over.\"\nmsgstr \"We'd rather have some fun before it's all over.\"\n\n#. Key:\t9E598A384E301BCD345ABFB0C1312C12\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_78.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_78.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Krrr... Raven notices that you've found the Gem!\"\nmsgstr \"Krrr... Raven notices that you've found the Gem!\"\n\n#. Key:\t9FAD3A1A4E3EFE33C1CAB8BAAC8190D1\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_26.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_26.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Let Raven tell you something:\"\nmsgstr \"Let Raven tell you something:\"\n\n#. Key:\tA10F960549BD21AFAD4819BD5C74E651\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_2.SpeechSequence(5).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_2.SpeechSequence(5).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Nevermind. Raven is kidding.\"\nmsgstr \"Nevermind. Raven is kidding.\"\n\n#. Key:\tA4294A174F9EA54E0149839A84CE2B94\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_15.Children(2).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_15.Children(2).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Hopeless...\"\nmsgstr \"Hopeless...\"\n\n#. Key:\tA59406E8411939F96004EAA9D5707E08\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_28.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_28.Children(1).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"What?\"\nmsgstr \"What?\"\n\n#. Key:\tA5993D8047CDD35BA31D318832EB9C66\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_32.Children(2).Children.Text\n#. Key:\tB7AE6BEC4CA905BDED5990BFF4D0C93D\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_3.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_3.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_32.Children(2).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"About wizards\"\nmsgstr \"About wizards\"\n\n#. Key:\tA59A76814D8EAF5907CBC68AA63FE33F\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_2.SpeechSequence(3).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_2.SpeechSequence(3).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"How can I know that if you don't do it?\"\nmsgstr \"How can I know that if you don't do it?\"\n\n#. Key:\tA7C7D1EC45A072755BAAB099DB359290\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_55.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_55.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"They don't believe that Ruin can affect their World. They say that it has no effect.\"\nmsgstr \"They don't believe that Ruin can affect their World. They say that it has no effect.\"\n\n#. Key:\tA7D99136490D40CB08BA66A72192D6C0\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_7.SpeechSequence(2).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_7.SpeechSequence(2).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Go now! Raven needs to think.\"\nmsgstr \"Go now! Raven needs to think.\"\n\n#. Key:\tA80B626C41713C6E42E4DF8696FF842D\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_8.SpeechSequence(0).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_8.SpeechSequence(0).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"You were a bird once. Then you became something else.\"\nmsgstr \"You were a bird once. Then you became something else.\"\n\n#. Key:\tA8D429384EFE74E30720149A1C53ADE9\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_38.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_38.Children(0).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Don't know\"\nmsgstr \"Don't know\"\n\n#. Key:\tA9A73720489C122A81B84CBA262C329E\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_38.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_38.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven knows what his task is. Do you know yours?\"\nmsgstr \"Raven knows what his task is. Do you know yours?\"\n\n#. Key:\tAB41A75C432BEBDC81D63282FCC15F98\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_5.SpeechSequence(2).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_5.SpeechSequence(2).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Got it? Free like a bird! Ha-ha-ha!\"\nmsgstr \"Got it? Free like a bird! Ha-ha-ha!\"\n\n#. Key:\tAC52327249DB335CBAB9EDA6A3F4769E\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_31.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_31.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven is doing this because this is what he is.\"\nmsgstr \"Raven is doing this because this is what he is.\"\n\n#. Key:\tB2003CEE44335B30B9F85487521B7679\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_54.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_54.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Maybe.\"\nmsgstr \"Maybe.\"\n\n#. Key:\tB31EEC6247CDEF73BB4E5B84E2B66575\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_9.SpeechSequence(2).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_9.SpeechSequence(2).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"That’s over now. This time it's for private business.\"\nmsgstr \"That’s over now. This time it's for private business.\"\n\n#. Key:\tB3DD59C44422BA99C839FCAE63F05B9A\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_93.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_93.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"I want to be free again!\"\nmsgstr \"I want to be free again!\"\n\n#. Key:\tB789219A48C2A835F2DA4CA24064E1D3\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_92.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_92.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"I would like to go home.\"\nmsgstr \"I would like to go home.\"\n\n#. Key:\tB7D4201F41E5F018EFD49EAF52E443A8\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_76.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_76.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"You still haven't found the Gem.\"\nmsgstr \"You still haven't found the Gem.\"\n\n#. Key:\tB7EC6E4F4EDC448FD264999938414F3C\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Let's talk about something else!\"\nmsgstr \"Let's talk about something else!\"\n\n#. Key:\tB8BF08674C9E2FD0515998B95A1EA7CF\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_7.SpeechSequence(1).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_7.SpeechSequence(1).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"If you can't fulfill your task, then maybe your master should look for a better servant.\"\nmsgstr \"If you can't fulfill your task, then maybe your master should look for a better servant.\"\n\n#. Key:\tBD775EF74E334A4DEFA67BBF9034500E\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_84.Text\n#. Key:\tFA3FEF444FD2A3500FCCE98FAEAE923E\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_42.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_42.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_84.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Yes?\"\nmsgstr \"Yes?\"\n\n#. Key:\tBE2B9D7A45C2D43FF4C0BAAA284CBB97\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"No thanks! I'm on my way now.\"\nmsgstr \"No thanks! I'm on my way now.\"\n\n#. Key:\tC04CC9334FC3C2522793C2B97CC165D8\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_108.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_108.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"The gate is open!\"\nmsgstr \"The gate is open!\"\n\n#. Key:\tC0F2E4744D724A3D6A0DEF914C294CE1\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_38.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_38.Children(1).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Go home\"\nmsgstr \"Go home\"\n\n#. Key:\tC10018654B64193BBFF439B54EF02FB1\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"So why not open the gate?\"\nmsgstr \"So why not open the gate?\"\n\n#. Key:\tC18E2FB345BE76B6F51C71A2B6453316\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_99.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_99.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"What can you tell me about the Ruined Realm?\"\nmsgstr \"What can you tell me about the Ruined Realm?\"\n\n#. Key:\tC19082D247C23A21B632968FE6A644D1\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_8.SpeechSequence(3).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_8.SpeechSequence(3).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"You failed to see the meaning behind Raven's thoughts.\"\nmsgstr \"You failed to see the meaning behind Raven's thoughts.\"\n\n#. Key:\tC2DC44084098DD604B757A8A47AAC4FE\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_58.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_58.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"We'll see.\"\nmsgstr \"We'll see.\"\n\n#. Key:\tC53F5E0F46BBE7A1FD00EABD6E14848D\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_33.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_33.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Maybe you are wiser than Raven, but that's just a thought, little spirit.\"\nmsgstr \"Maybe you are wiser than Raven, but that's just a thought, little spirit.\"\n\n#. Key:\tC78588B64D12FFBE97C47AB7C046C14E\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_1.SpeechSequence(5).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_1.SpeechSequence(5).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven doesn't believe it's true.\"\nmsgstr \"Raven doesn't believe it's true.\"\n\n#. Key:\tC7F7F71F4FE0D19BDF86188BEFDDEEB1\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_5.SpeechSequence(1).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_5.SpeechSequence(1).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Just look at Raven! He's free like a bird.\"\nmsgstr \"Just look at Raven! He's free like a bird.\"\n\n#. Key:\tC82BE6E448D7C98D361CA1890FEE3B2C\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_9.SpeechSequence(6).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_9.SpeechSequence(6).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"I’m in.\"\nmsgstr \"I’m in.\"\n\n#. Key:\tCD1A68EF460B0C63C95340AC2076EBAF\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven notices that the gem is just as dull as before. Why did you return then?\"\nmsgstr \"Raven notices that the gem is just as dull as before. Why did you return then?\"\n\n#. Key:\tD3C84C884903F7FB53695AAE253C7982\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_40.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_40.Children(0).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Agree\"\nmsgstr \"Agree\"\n\n#. Key:\tD438ABB348A399ACB18DFD8F320CC7BB\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_57.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_57.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"And what's the truth?\"\nmsgstr \"And what's the truth?\"\n\n#. Key:\tD5DF32814FA17D7ED28BF0A91027A6E8\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_110.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_110.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Finally! From now on you won't need Raven anymore.\"\nmsgstr \"Finally! From now on you won't need Raven anymore.\"\n\n#. Key:\tD6A649B2453BCBAD95A16FA481664133\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_49.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_49.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Find the other Chargers and return to Raven when you are done.\"\nmsgstr \"Find the other Chargers and return to Raven when you are done.\"\n\n#. Key:\tD9959CF1439812F5615A38B9369F6E16\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_71.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_71.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven notices that you already have the Gem.\"\nmsgstr \"Raven notices that you already have the Gem.\"\n\n#. Key:\tD9A4F3D54EF460C09B2A6C9B8EB87D7C\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_32.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_32.Children(1).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"About my purpose...\"\nmsgstr \"About my purpose...\"\n\n#. Key:\tD9C6F8C14BC9C0BD83715E96DE5B7161\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_28.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_28.Children(0).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"He is a volunteer\"\nmsgstr \"He is a volunteer\"\n\n#. Key:\tDC7CA6DF4D684A7C2DBA739F404ABC36\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_94.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_94.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"I don't know what to do. I can't remember anything from my previous life.\"\nmsgstr \"I don't know what to do. I can't remember anything from my previous life.\"\n\n#. Key:\tDD8E05E541C32F05357D888FB6963FF0\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_114.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_114.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"All right, I go then.\"\nmsgstr \"All right, I go then.\"\n\n#. Key:\tDE3A0B8047C9980B6DED0BA39C777539\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_28.Children(3).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_28.Children(3).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Not interested\"\nmsgstr \"Not interested\"\n\n#. Key:\tDF86F9C84CF207616E931098F3C833D3\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"To activate the locking mechanism we need an infused Lock Gem.\"\nmsgstr \"To activate the locking mechanism we need an infused Lock Gem.\"\n\n#. Key:\tE0105C1845AF9211960E869AB234ED9A\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_89.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_89.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"So you are obeying because... that's the only thing that you can do?\"\nmsgstr \"So you are obeying because... that's the only thing that you can do?\"\n\n#. Key:\tE17598BB49D7E4083AD4AEA2DDFE293D\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_106.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_106.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"It would make sense to try to save the world, wouldn't it?\"\nmsgstr \"It would make sense to try to save the world, wouldn't it?\"\n\n#. Key:\tE1CFA5A44F4EF59527528DB6018ACF33\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_8.SpeechSequence(6).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_8.SpeechSequence(6).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven doesn't care about what he could do. Raven cares about what he does.\"\nmsgstr \"Raven doesn't care about what he could do. Raven cares about what he does.\"\n\n#. Key:\tE6FA584E454BC3943C927EADAEBA88C4\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_6.SpeechSequence(8).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_6.SpeechSequence(8).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"That's not too reassuring...\"\nmsgstr \"That's not too reassuring...\"\n\n#. Key:\tE9D9EC1F450276CF11B259978062AB7E\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_96.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_96.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"We shouldn't waste any more time on this.\"\nmsgstr \"We shouldn't waste any more time on this.\"\n\n#. Key:\tEC19AF0E4F2F4B488373FFBEDC272321\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_56.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_56.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Except for a few paranoid ones, like your master.\"\nmsgstr \"Except for a few paranoid ones, like your master.\"\n\n#. Key:\tEFC8B9984D9F4A9ACC9AE580E271E810\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_39.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_39.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Searching for a way to open this gate with the help of a talking Ball is so much fun!\"\nmsgstr \"Searching for a way to open this gate with the help of a talking Ball is so much fun!\"\n\n#. Key:\tEFCE20A646FA62188BE7EB85D6708843\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_115.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_115.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven will venture deeper into the Ruined Realm!\"\nmsgstr \"Raven will venture deeper into the Ruined Realm!\"\n\n#. Key:\tF0B00A30413914D09CA4488578B2FD7C\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_24.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_24.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven agrees.\"\nmsgstr \"Raven agrees.\"\n\n#. Key:\tF40AD31D4177DCB7BB138C9C139FB1A1\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_61.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_61.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"I hope that won't be too soon...\"\nmsgstr \"I hope that won't be too soon...\"\n\n#. Key:\tF4F8CBCD421083EDBF626AA47DEF4B50\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_88.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_88.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Do you mean that you are serving your wizard by your own will?\"\nmsgstr \"Do you mean that you are serving your wizard by your own will?\"\n\n#. Key:\tF5A7836549DF56B89620A386E7CCF708\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_48.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_48.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"But there is still so much left to do...\"\nmsgstr \"But there is still so much left to do...\"\n\n#. Key:\tF8361ECC401E740DEBF87FAE2A419EC8\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_32.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_32.Children(0).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven Servant?\"\nmsgstr \"Raven Servant?\"\n\n#. Key:\tFA5F957341772B0C4AFA33B1311CF7B4\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_69.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_69.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Except if we meet in the Afterworld.\"\nmsgstr \"Except if we meet in the Afterworld.\"\n\n#. Key:\tFA94A8EF4F8BF5EA422D27A9A205D866\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_3.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_3.Children(0).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven servant?\"\nmsgstr \"Raven servant?\"\n\n#. Key:\tFC0798A648BFC0E9BA70D6B20A46F447\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_1.SpeechSequence(2).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_1.SpeechSequence(2).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Your master seeks to stop it no matter the price he has to pay.\"\nmsgstr \"Your master seeks to stop it no matter the price he has to pay.\"\n\n#. Key:\tFCE7049641D2A70FC6B9E5B174919A64\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_9.SpeechSequence(0).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_9.SpeechSequence(0).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Tabby has retired. What did you come for?\"\nmsgstr \"Tabby has retired. What did you come for?\"\n\n#. Key:\tFD68B18A435050A137D8F0948F24E2DC\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Why are we messing with this door if the World is about to end?\"\nmsgstr \"Why are we messing with this door if the World is about to end?\"\n\n#. Key:\tFF3D9FCF4A840A8155A8D7AD9CC22F2D\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Obey? Raven doesn't obey.\"\nmsgstr \"Obey? Raven doesn't obey.\"\n\n#. Key:\tFFB203D94B0A5C22BA29B68A1A8A740F\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_9.SpeechSequence(8).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_9.SpeechSequence(8).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Farewell then.\"\nmsgstr \"Farewell then.\"\n\n#. Key:\t0C459FB64505D02011822A9EDFA8FCA4\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/AGStatue.AGStatue:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/AGStatue.AGStatue:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_AGStatue\"\nmsgid \"'We are the elite of the Runic Realm. Our wisdom is great, our magic is strong.'\"\nmsgstr \"'We are the elite of the Runic Realm. Our wisdom is great, our magic is strong.'\"\n\n#. Key:\t7DB580C64E9B33FD525DDF986BD5E4A4\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/AGStatue.AGStatue:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/AGStatue.AGStatue:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_AGStatue\"\nmsgid \"Looks like he was wrong...\"\nmsgstr \"Looks like he was wrong...\"\n\n#. Key:\tAFBD86084D8E6EBDF240998FA98D184D\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/AGStatue.AGStatue:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/AGStatue.AGStatue:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_AGStatue\"\nmsgid \"'We are Ceruleans! We do not escape!'\"\nmsgstr \"'We are Ceruleans! We do not escape!'\"\n\n#. Key:\tC2CC8EE94954A8DC42222FBB28A7656E\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/AGStatue.AGStatue:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/AGStatue.AGStatue:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_AGStatue\"\nmsgid \"'Citizens of Cerulean! Do not join the poor of Grey Gate!'\"\nmsgstr \"'Citizens of Cerulean! Do not join the poor of Grey Gate!'\"\n\n#. Key:\tD909E4A34387B448378464BDE8292B4D\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/AGStatue.AGStatue:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/AGStatue.AGStatue:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_AGStatue\"\nmsgid \"'Ruin can’t harm us!'\"\nmsgstr \"'Ruin can’t harm us!'\"\n\n#. Key:\t3CE243AA4AFB12B37239608C66537764\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/BeforeBoss.BeforeBoss:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/BeforeBoss.BeforeBoss:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_BeforeBoss\"\nmsgid \"Maybe you should talk to the gnome or the Keeper.\"\nmsgstr \"Maybe you should talk to the gnome or the Keeper.\"\n\n#. Key:\t4F35F4834FBCC04C218A879123EF8706\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/BeforeBoss.BeforeBoss:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/BeforeBoss.BeforeBoss:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_BeforeBoss\"\nmsgid \"Using the portals here one could get into any part of the World in no time.\"\nmsgstr \"Using the portals here one could get into any part of the World in no time.\"\n\n#. Key:\t62EDCB724DAC5317C72B99AEB9904F4E\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/BeforeBoss.BeforeBoss:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/BeforeBoss.BeforeBoss:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_BeforeBoss\"\nmsgid \"This place was the base of the formal Ruined Realm.\"\nmsgstr \"This place was the base of the formal Ruined Realm.\"\n\n#. Key:\tCB8B47F74583A48529A353B97C4909B9\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/BeforeBoss.BeforeBoss:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/BeforeBoss.BeforeBoss:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_BeforeBoss\"\nmsgid \"I hope at least some of the portals still work.\"\nmsgstr \"I hope at least some of the portals still work.\"\n\n#. Key:\t2A9CE8714E7E1ABC9365E5A1E2CE2EC8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/BossArmourWrath.BossArmourWrath:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Chapter2/BossArmourWrath.BossArmourWrath:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_BossArmourWrath\"\nmsgid \"Keep away from my artefact little thief or I will crush you!\"\nmsgstr \"Keep away from my artefact little thief or I will crush you!\"\n\n#. Key:\t3F79029C410F4CC3B41548A26A7D69EB\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/BossArmourWrath.BossArmourWrath:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Chapter2/BossArmourWrath.BossArmourWrath:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_BossArmourWrath\"\nmsgid \"Listen, I really need that. What if I give you something instead?\"\nmsgstr \"Listen, I really need that. What if I give you something instead?\"\n\n#. Key:\t451F1E844E29E674899BD3BEFBC17380\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/BossArmourWrath.BossArmourWrath:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter2/BossArmourWrath.BossArmourWrath:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_BossArmourWrath\"\nmsgid \"I’m here for the artefact... could you give it to me?\"\nmsgstr \"I’m here for the artefact... could you give it to me?\"\n\n#. Key:\tAC11C22040909F7F4DD1518AD5C14AFA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/BossArmourWrath.BossArmourWrath:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Chapter2/BossArmourWrath.BossArmourWrath:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_BossArmourWrath\"\nmsgid \"That is mine!\"\nmsgstr \"That is mine!\"\n\n#. Key:\tD30E184A406B5B1EFB87F3845CE82664\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/BossArmourWrath.BossArmourWrath:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter2/BossArmourWrath.BossArmourWrath:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_BossArmourWrath\"\nmsgid \"Have you come to worship my perfection?\"\nmsgstr \"Have you come to worship my perfection?\"\n\n#. Key:\tF626219F434EECD05727BC9FAB5CEB76\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/BossArmourWrath.BossArmourWrath:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Chapter2/BossArmourWrath.BossArmourWrath:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_BossArmourWrath\"\nmsgid \"Damn you and your perfection!\"\nmsgstr \"Damn you and your perfection!\"\n\n#. Key:\t2892C4AB4DACCAF48565619948DCA122\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/BossDwarvenStatue.BossDwarvenStatue:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter2/BossDwarvenStatue.BossDwarvenStatue:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_BossDwarvenStatue\"\nmsgid \"I am all right! I am still keeping it back!\"\nmsgstr \"I am all right! I am still keeping it back!\"\n\n#. Key:\t378D26B144B4B17F23F788B56F714118\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/BossDwarvenStatue.BossDwarvenStatue:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Chapter2/BossDwarvenStatue.BossDwarvenStatue:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_BossDwarvenStatue\"\nmsgid \"I am looking for an artefact...\"\nmsgstr \"I am looking for an artefact...\"\n\n#. Key:\t3956257F405EC80CE4547FBE57C53A11\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/BossDwarvenStatue.BossDwarvenStatue:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Chapter2/BossDwarvenStatue.BossDwarvenStatue:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_BossDwarvenStatue\"\nmsgid \"Do you...\"\nmsgstr \"Do you...\"\n\n#. Key:\t946CFCCE4CA505C7C4039A9FF196A35C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/BossDwarvenStatue.BossDwarvenStatue:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter2/BossDwarvenStatue.BossDwarvenStatue:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_BossDwarvenStatue\"\nmsgid \"Have the sculptors sent you?\"\nmsgstr \"Have the sculptors sent you?\"\n\n#. Key:\tA30FB80548251020E4AD859A928AB6B5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/BossDwarvenStatue.BossDwarvenStatue:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Chapter2/BossDwarvenStatue.BossDwarvenStatue:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_BossDwarvenStatue\"\nmsgid \"Go away! I hold it back!\"\nmsgstr \"Go away! I hold it back!\"\n\n#. Key:\tAC5220964331387202C55584104246C2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/BossDwarvenStatue.BossDwarvenStatue:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Chapter2/BossDwarvenStatue.BossDwarvenStatue:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_BossDwarvenStatue\"\nmsgid \"I have a bad feeling about this...\"\nmsgstr \"I have a bad feeling about this...\"\n\n#. Key:\tE05C384043C6F8407BDA2D97A1D64F96\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/BossDwarvenStatue.BossDwarvenStatue:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Chapter2/BossDwarvenStatue.BossDwarvenStatue:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_BossDwarvenStatue\"\nmsgid \"He has one of the artefacts. You need to get it somehow.\"\nmsgstr \"He has one of the artefacts. You need to get it somehow.\"\n\n#. Key:\tF9B8F4E9413785B5F59DD88CBF8D56CC\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/BossDwarvenStatue.BossDwarvenStatue:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Chapter2/BossDwarvenStatue.BossDwarvenStatue:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_BossDwarvenStatue\"\nmsgid \"Don’t come any closer! I’m still fine!\"\nmsgstr \"Don’t come any closer! I’m still fine!\"\n\n#. Key:\t49D7B5DA484C712573AE84B3A2609541\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/BossFallenDruid.BossFallenDruid:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Chapter2/BossFallenDruid.BossFallenDruid:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_BossFallenDruid\"\nmsgid \"You will never lay your hand on anything in this place!\"\nmsgstr \"You will never lay your hand on anything in this place!\"\n\n#. Key:\t9642DD9241E67544571A5EABA9EBC42B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/BossFallenDruid.BossFallenDruid:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter2/BossFallenDruid.BossFallenDruid:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_BossFallenDruid\"\nmsgid \"Actually I’m about to leave but I need the artefact first.\"\nmsgstr \"Actually I’m about to leave but I need the artefact first.\"\n\n#. Key:\t9A2BE08D4010C4D2425F96BA17A60936\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/BossFallenDruid.BossFallenDruid:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Chapter2/BossFallenDruid.BossFallenDruid:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_BossFallenDruid\"\nmsgid \"I shall purge my forest from your kind! To hell with you creature!\"\nmsgstr \"I shall purge my forest from your kind! To hell with you creature!\"\n\n#. Key:\tFC4A1C9748C31BD2AA2E4F93E5D56AF8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/BossFallenDruid.BossFallenDruid:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter2/BossFallenDruid.BossFallenDruid:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_BossFallenDruid\"\nmsgid \"Stay away from my sacred forests creature of Ruin!\"\nmsgstr \"Stay away from my sacred forests creature of Ruin!\"\n\n#. Key:\t3F4302BF46D1F9EA241446A796CE6AA5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Fishy.C3Fishy:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter3/C3Fishy.C3Fishy:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_C3Fishy\"\nmsgid \"Fishy will miss home.\"\nmsgstr \"Fishy will miss home.\"\n\n#. Key:\t52063C724F858E16B1E9B482E064B3FC\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Fishy.C3Fishy:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/Chapter3/C3Fishy.C3Fishy:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_C3Fishy\"\nmsgid \"Raven will try to take us into the Human Realm.\"\nmsgstr \"Raven will try to take us into the Human Realm.\"\n\n#. Key:\tBC79FC4E44CCD0BE44BAAAA5ED304C9D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3GateKeeper.C3GateKeeper:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Chapter3/C3GateKeeper.C3GateKeeper:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_C3GateKeeper\"\nmsgid \"I hope you will find us Worthy.\"\nmsgstr \"I hope you will find us Worthy.\"\n\n#. Key:\tDD8DEA6B4E1D6AABEB6B0483614A41BB\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3GateKeeper.C3GateKeeper:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter3/C3GateKeeper.C3GateKeeper:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_C3GateKeeper\"\nmsgid \"Welcome, my young Lord!\"\nmsgstr \"Welcome, my young Lord!\"\n\n#. Key:\tFCC28D1C4A19B1964301B388625A722F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3GateKeeper.C3GateKeeper:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter3/C3GateKeeper.C3GateKeeper:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_C3GateKeeper\"\nmsgid \"I heard this time you shall open a Gate for us.\"\nmsgstr \"I heard this time you shall open a Gate for us.\"\n\n#. Key:\t1F96C2364594513AB8DF00A8C11ADB2C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Gnory.C3Gnory:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Chapter3/C3Gnory.C3Gnory:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_C3Gnory\"\nmsgid \"I don’t want anything bad for business in the new Realm.\"\nmsgstr \"I don’t want anything bad for business in the new Realm.\"\n\n#. Key:\t24FA4B6840C3EEF0A9D418AED7C900A5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Gnory.C3Gnory:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/Chapter3/C3Gnory.C3Gnory:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_C3Gnory\"\nmsgid \"Eh, you again?\"\nmsgstr \"Eh, you again?\"\n\n#. Key:\t5CA8478D46ED1ADF6F0B5E82F1035ADE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Gnory.C3Gnory:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter3/C3Gnory.C3Gnory:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_C3Gnory\"\nmsgid \"A whole new World awaits for me and my shop.\"\nmsgstr \"A whole new World awaits for me and my shop.\"\n\n#. Key:\tA406AFAD47000D9338C978B2EB16A86F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Gnory.C3Gnory:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Chapter3/C3Gnory.C3Gnory:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_C3Gnory\"\nmsgid \"If you can arrange it I would be more happy if we could leave Lory here.\"\nmsgstr \"If you can arrange it I would be more happy if we could leave Lory here.\"\n\n#. Key:\tBA4D0C244931E6431FA17CA2257BDDE1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Gnory.C3Gnory:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter3/C3Gnory.C3Gnory:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_C3Gnory\"\nmsgid \"What a new opportunity! I don’t care about dwarves anymore.\"\nmsgstr \"What a new opportunity! I don’t care about dwarves anymore.\"\n\n#. Key:\t071AC5EE4AC65F5BE3CB61B64DE9E7FE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3GolemMaker.C3GolemMaker:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter3/C3GolemMaker.C3GolemMaker:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_C3GolemMaker\"\nmsgid \"I have to admit Ruin will win in the end.\"\nmsgstr \"I have to admit Ruin will win in the end.\"\n\n#. Key:\t18398E3A4C6E72AAE25F24A14596ECD8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3GolemMaker.C3GolemMaker:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter3/C3GolemMaker.C3GolemMaker:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_C3GolemMaker\"\nmsgid \"I fought Ruin for hundreds of years.\"\nmsgstr \"I fought Ruin for hundreds of years.\"\n\n#. Key:\t7800D3B64054BCE4A89E8E8E6265776B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3GolemMaker.C3GolemMaker:DlgNode_Speech_117.Text\n#: /Game/SO/Dialogues/Chapter3/C3GolemMaker.C3GolemMaker:DlgNode_Speech_117.Text\nmsgctxt \"Dialogue_C3GolemMaker\"\nmsgid \"I have a bad feeling about this all...\"\nmsgstr \"I have a bad feeling about this all...\"\n\n#. Key:\t334B64FA460A74FD99B4F3B9E4BE9E5A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3KoboldChef.C3KoboldChef:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter3/C3KoboldChef.C3KoboldChef:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_C3KoboldChef\"\nmsgid \"So it will be ready anytime now.\"\nmsgstr \"So it will be ready anytime now.\"\n\n#. Key:\t5B8874F14160F55182A93EBCF5680173\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3KoboldChef.C3KoboldChef:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter3/C3KoboldChef.C3KoboldChef:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_C3KoboldChef\"\nmsgid \"According to the recipe I need to swirl the ingredients until the end of the World.\"\nmsgstr \"According to the recipe I need to swirl the ingredients until the end of the World.\"\n\n#. Key:\t7DB6ED344E211B7A028C27BFB72750B1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3KoboldChef.C3KoboldChef:DlgNode_Speech_33.Text\n#: /Game/SO/Dialogues/Chapter3/C3KoboldChef.C3KoboldChef:DlgNode_Speech_33.Text\nmsgctxt \"Dialogue_C3KoboldChef\"\nmsgid \"This is a special soup.\"\nmsgstr \"This is a special soup.\"\n\n#. Key:\t7D583DB14783DCF7EEE294920F9A1D61\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Lory.C3Lory:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Chapter3/C3Lory.C3Lory:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_C3Lory\"\nmsgid \"Without paying a single gold coin. How sad.\"\nmsgstr \"Without paying a single gold coin. How sad.\"\n\n#. Key:\t8A26C9B24B810A94FED159B0D69D70D6\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Lory.C3Lory:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter3/C3Lory.C3Lory:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_C3Lory\"\nmsgid \"Hi, my dear Ball!\"\nmsgstr \"Hi, my dear Ball!\"\n\n#. Key:\t8CF637DC4D66B9BFBE098DA3EA434F27\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Lory.C3Lory:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/Chapter3/C3Lory.C3Lory:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_C3Lory\"\nmsgid \"Unfortunately I can't give you anything in return.\"\nmsgstr \"Unfortunately I can't give you anything in return.\"\n\n#. Key:\t90A13FAC4AA90E98DBEFFA9BB8DEDE80\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Lory.C3Lory:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Chapter3/C3Lory.C3Lory:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_C3Lory\"\nmsgid \"Oh, thank you! Books always matter.\"\nmsgstr \"Oh, thank you! Books always matter.\"\n\n#. Key:\t9C6E843645F86F1E39E6458952C7F283\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Lory.C3Lory:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Chapter3/C3Lory.C3Lory:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_C3Lory\"\nmsgid \"I hope I can open a new shop in the Human Realm.\"\nmsgstr \"I hope I can open a new shop in the Human Realm.\"\n\n#. Key:\tAE354F2C458C144C2825028174F91CCE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Lory.C3Lory:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Chapter3/C3Lory.C3Lory:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_C3Lory\"\nmsgid \"I don't know if it still matters but I have these books for you.\"\nmsgstr \"I don't know if it still matters but I have these books for you.\"\n\n#. Key:\tB5BCB95E43DB3854273F6AAA4067FC55\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Lory.C3Lory:DlgNode_Speech_42.Text\n#: /Game/SO/Dialogues/Chapter3/C3Lory.C3Lory:DlgNode_Speech_42.Text\nmsgctxt \"Dialogue_C3Lory\"\nmsgid \"Unfortunately I have nothing at the store right now. Ha-ha...\"\nmsgstr \"Unfortunately I have nothing at the store right now. Ha-ha...\"\n\n#. Key:\tC0E84ACD40CB002E0C30A289E0554EE9\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Lory.C3Lory:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/Chapter3/C3Lory.C3Lory:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_C3Lory\"\nmsgid \"No problem.\"\nmsgstr \"No problem.\"\n\n#. Key:\tFEFF93C84CC75D277EC221AD22338A75\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Lory.C3Lory:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter3/C3Lory.C3Lory:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_C3Lory\"\nmsgid \"Ruin took all my wares.\"\nmsgstr \"Ruin took all my wares.\"\n\n#. Key:\t090F12534A0096B8D4D7D9A5CDC9B3B5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_25.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_25.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Well I guess you don’t have many customer.\"\nmsgstr \"Well I guess you don’t have many customer.\"\n\n#. Key:\t10A1CF314EC02954FF38F1989C61DEE9\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"That’s only one man! I need three!\"\nmsgstr \"That’s only one man! I need three!\"\n\n#. Key:\t127DE2E049C91112F814C69348954F99\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_7.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_7.Children(1).Children.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Buy name\"\nmsgstr \"Buy name\"\n\n#. Key:\t1AF2DDE74542524EEF19CA9567CFBDAF\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_58.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_58.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"{name}? It still sounds a bit weird, but I think I might like it.\"\nmsgstr \"{name}? It still sounds a bit weird, but I think I might like it.\"\n\n#. Key:\t1C411E31405F157B2465229ECE66F4E0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_31.Children(2).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_31.Children(2).Children.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Wanderer\"\nmsgstr \"Wanderer\"\n\n#. Key:\t1ED747BD43E40D4096809696951517EE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"A special offer for ya! Give me three Blue Gems and I’ll give ya the key!\"\nmsgstr \"A special offer for ya! Give me three Blue Gems and I’ll give ya the key!\"\n\n#. Key:\t20B146B94D2E2FCE5E0C48BC64F7A1D6\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_19.Text\n#. Key:\t41E21D044B53E16C1BA8D7B720D84B50\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_36.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_36.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Sure man!\"\nmsgstr \"Sure man!\"\n\n#. Key:\t2BDF52EF43CA5FBB145EC1BA0014FC27\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_7.Children(3).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_7.Children(3).Children.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Who are you?\"\nmsgstr \"Who are you?\"\n\n#. Key:\t2DF772F14AAA9780F4D9E397DE723665\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_32.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_32.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Fearsome! At least for what you will destroy.\"\nmsgstr \"Fearsome! At least for what you will destroy.\"\n\n#. Key:\t312F26294ECE4F618D88BE84DE7A2F9A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_31.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_31.Children(1).Children.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Destroyer\"\nmsgstr \"Destroyer\"\n\n#. Key:\t328C9911427AA19B40B297ACC9D16447\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_31.Children(3).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_31.Children(3).Children.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Don't buy\"\nmsgstr \"Don't buy\"\n\n#. Key:\t32D3F53746DD2801BC1B04AF1C1753DD\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Don’t turn around I’m talking to ya big guy! Down here on the wood!\"\nmsgstr \"Don’t turn around I’m talking to ya big guy! Down here on the wood!\"\n\n#. Key:\t576A3CE049331518C8D1F196E6CC382C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Back on topic: will ya buy something?\"\nmsgstr \"Back on topic: will ya buy something?\"\n\n#. Key:\t5C1E07DF4B2D135102D6B09D3A04A726\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"C’mon man! Don’t just stand there tell me what ya want!\"\nmsgstr \"C’mon man! Don’t just stand there tell me what ya want!\"\n\n#. Key:\t62AA5DD54A8447F7A277B194B05FB74D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_23.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_23.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"What’s wrong with ya man?\"\nmsgstr \"What’s wrong with ya man?\"\n\n#. Key:\t6E13F5544C66EDB0CFE764A0F52269E1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_27.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_27.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"You know transporting breadcrumbs, marching onto various directions, the usual things.\"\nmsgstr \"You know transporting breadcrumbs, marching onto various directions, the usual things.\"\n\n#. Key:\t6F3C17894E694FC6215871B167087908\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_24.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_24.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"I’m Merch Ant doin’ Microtransactions. I’ve just told ya.\"\nmsgstr \"I’m Merch Ant doin’ Microtransactions. I’ve just told ya.\"\n\n#. Key:\t7169B2FA40F5F5F328D2A6B9D53D58C8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_7.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_7.Children(0).Children.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Trade\"\nmsgstr \"Trade\"\n\n#. Key:\t7B41C105431C54F2FDDEA6AA9A0E1C1A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Er... so who are you and what are you doing here?\"\nmsgstr \"Er... so who are you and what are you doing here?\"\n\n#. Key:\t8718A8F54D5722F666D83F8067476622\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"There is an iron door which blocks the path to the tower. Do you have something which opens it?\"\nmsgstr \"There is an iron door which blocks the path to the tower. Do you have something which opens it?\"\n\n#. Key:\t889B39EC4BC170A2BF493380947116A7\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Sure man! Microtransactions always work!\"\nmsgstr \"Sure man! Microtransactions always work!\"\n\n#. Key:\t9157AE9644A4A3B2C97F7482932160D2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"No man, we agreed on three!\"\nmsgstr \"No man, we agreed on three!\"\n\n#. Key:\t9283F6B1447C6992FE355289F3337472\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_7.Children(2).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_7.Children(2).Children.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Gate\"\nmsgstr \"Gate\"\n\n#. Key:\t99C44AA849A384C7941D3DAE1D6A3EFF\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Here is your Gem!\"\nmsgstr \"Here is your Gem!\"\n\n#. Key:\t9CA7941F42ABFAE5660895AF886CD62C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_31.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_31.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Sure man! I have some really cool ones for sale!\"\nmsgstr \"Sure man! I have some really cool ones for sale!\"\n\n#. Key:\tA3C6B03E404B1C039EF1C98C8E28AE22\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Show me what you've got for sale!\"\nmsgstr \"Show me what you've got for sale!\"\n\n#. Key:\tABE279924E0641DA18E9708F35F4500A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_29.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_29.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"I’ve got to go.\"\nmsgstr \"I’ve got to go.\"\n\n#. Key:\tAF1FECDB402777D850B819B934DF851D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_34.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_34.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Ah, never mind, here you go!\"\nmsgstr \"Ah, never mind, here you go!\"\n\n#. Key:\tB19FA067432CE0273A3652AA9A32F2DF\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Don’t be surprised!\"\nmsgstr \"Don’t be surprised!\"\n\n#. Key:\tB5F8E17E4712A37EF1C227AA7E99DBC8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Aren’t two Gems enough for you?\"\nmsgstr \"Aren’t two Gems enough for you?\"\n\n#. Key:\tBC5DEE9E4D39238451D1A2B9F8B20815\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_26.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_26.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Okey, okey! I have to admit I also do some regular ant work from time to time.\"\nmsgstr \"Okey, okey! I have to admit I also do some regular ant work from time to time.\"\n\n#. Key:\tBD7096344553E098E4A29787E1386B4A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Are you sure the key works?\"\nmsgstr \"Are you sure the key works?\"\n\n#. Key:\tC6A384624B53D808D62CB885A6573150\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Was nice to deal with ya!\"\nmsgstr \"Was nice to deal with ya!\"\n\n#. Key:\tC737154043396F726CF6B2814991B38D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_35.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_35.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"I've changed my mind. I'm fine with my current name.\"\nmsgstr \"I've changed my mind. I'm fine with my current name.\"\n\n#. Key:\tC94F33504E68364DE1BAA48FC0CA85E5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_7.Children(5).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_7.Children(5).Children.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Leave\"\nmsgstr \"Leave\"\n\n#. Key:\tCDA5A0164F5FDD87D0F4C0B10A5ED5DA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"I did my part. Give me the key!\"\nmsgstr \"I did my part. Give me the key!\"\n\n#. Key:\tD1B1D33742EAA6A9BCDC42B5EA72EB59\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_31.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_31.Children(0).Children.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Saviour\"\nmsgstr \"Saviour\"\n\n#. Key:\tD1E444764EDA1457DD7427A0EA75C65F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_7.Children(4).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_7.Children(4).Children.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Blue Gem\"\nmsgstr \"Blue Gem\"\n\n#. Key:\tD65AD8854E1A5BC2D37C208357BACDE3\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Due to my size!\"\nmsgstr \"Due to my size!\"\n\n#. Key:\tDDEB5C4B4A180E85B1D711815B4D32F3\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Can I buy a name from you?\"\nmsgstr \"Can I buy a name from you?\"\n\n#. Key:\tDE3F40384473EC97950CDDB43AFE439E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Easy man! Here ya go!\"\nmsgstr \"Easy man! Here ya go!\"\n\n#. Key:\tDEED1AF94E4BC154ED98A8B951AF0673\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Hey again!\"\nmsgstr \"Hey again!\"\n\n#. Key:\tE2C88DA74DA8B5935E15CC9FD337C307\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_39.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_39.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Come on man! You can't just wander around!\"\nmsgstr \"Come on man! You can't just wander around!\"\n\n#. Key:\tEA08DE334C7D8631989D159FB841367D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_30.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_30.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"See ya man!\"\nmsgstr \"See ya man!\"\n\n#. Key:\tEAB8C1DE4B07AD7EAF0A4B819E4522C6\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Hey there!\"\nmsgstr \"Hey there!\"\n\n#. Key:\tF780C72E4DDD9D9189C900836D4F7DBD\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"I’m Merch Ant, I deal with microtransactions.\"\nmsgstr \"I’m Merch Ant, I deal with microtransactions.\"\n\n#. Key:\tFED676B745409B7095EBB2994E581817\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_57.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_57.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"That's cool man. Though I wonder who will you save?\"\nmsgstr \"That's cool man. Though I wonder who will you save?\"\n\n#. Key:\t04F1EF4B4AFDE5759A25A1A4922E9EA8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"Yet they could do nothing.\"\nmsgstr \"Yet they could do nothing.\"\n\n#. Key:\t05E7A2224316FEED1A2CEB8AEFC46B41\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"We can’t let everyone die here.\"\nmsgstr \"We can’t let everyone die here.\"\n\n#. Key:\t078A48C347E2B23E79C495BA42BC7B6D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_25.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_25.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"We’ll have time to find a cure.\"\nmsgstr \"We’ll have time to find a cure.\"\n\n#. Key:\t0A857169478EC6929EFCA3B390C394DA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"Prepare for your last travel in the Ruined Realm. Head to the north from where the wind is blowing!\"\nmsgstr \"Prepare for your last travel in the Ruined Realm. Head to the north from where the wind is blowing!\"\n\n#. Key:\t1D8B6C81428A6D9F4C29AE9AD26206F2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_29.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_29.Children(1).Children.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"Can't leave them\"\nmsgstr \"Can't leave them\"\n\n#. Key:\t217F39F14762862B6EA18484EA74E987\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_37.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_37.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"I wish you better luck this time!\"\nmsgstr \"I wish you better luck this time!\"\n\n#. Key:\t22E17F2F4CFDD0CEB67AB0A91D872B3F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_4.Children(2).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_4.Children(2).Children.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"Not my problem\"\nmsgstr \"Not my problem\"\n\n#. Key:\t2685CE674BB3B11FD3CB3AA2460CE60A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"There is nothing we can do for this World.\"\nmsgstr \"There is nothing we can do for this World.\"\n\n#. Key:\t26A2075F407FF43E1AF8B6B38E9C4AEE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"Farewell!\"\nmsgstr \"Farewell!\"\n\n#. Key:\t2F7D7C46418E8E049493839A26DBB10E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"I’m ready to sacrifice myself but I feel sorrow for this world.\"\nmsgstr \"I’m ready to sacrifice myself but I feel sorrow for this world.\"\n\n#. Key:\t39172C7641A5973A4B5D8480EBDD2589\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_34.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_34.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"Back already?\"\nmsgstr \"Back already?\"\n\n#. Key:\t3D21436E48DA0DF9C3ACA3B11001B17C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"Yet, we need to save those we can.\"\nmsgstr \"Yet, we need to save those we can.\"\n\n#. Key:\t43B780AA4934FBE35679BFB3C1C92D56\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"Farewell Wanderer!\"\nmsgstr \"Farewell Wanderer!\"\n\n#. Key:\t4AD4171F4A1832148034BAA736FC587E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"Head to the north from where the wind is blowing!\"\nmsgstr \"Head to the north from where the wind is blowing!\"\n\n#. Key:\t4E65707F497B4B35E873138DDBF7B879\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"I will go home and you will solve your problems on your own.\"\nmsgstr \"I will go home and you will solve your problems on your own.\"\n\n#. Key:\t4EDA1AEF471537F758DD0491A7140073\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"This is none of my business.\"\nmsgstr \"This is none of my business.\"\n\n#. Key:\t58246AA446D982E55E53EAB34FFF6A81\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_34.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_34.Children(1).Children.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"Leave\"\nmsgstr \"Leave\"\n\n#. Key:\t67CB3C99468EEA39C4C18C8B0C28AFEA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_26.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_26.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"You? You mean the Wizard Council?\"\nmsgstr \"You? You mean the Wizard Council?\"\n\n#. Key:\t743DD4C048F8CD08A49805975183B54D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"I’m sorry it ends like this, Wanderer.\"\nmsgstr \"I’m sorry it ends like this, Wanderer.\"\n\n#. Key:\t7AB88DE549E213B71759699AD51CFD4C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"I’m really proud of you little spirit. This wasn’t an easy decision for me either.\"\nmsgstr \"I’m really proud of you little spirit. This wasn’t an easy decision for me either.\"\n\n#. Key:\t7DCF30E74F8C0F29DA4E668CE3435E89\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"Wizard can’t hear us here, we can talk freely.\"\nmsgstr \"Wizard can’t hear us here, we can talk freely.\"\n\n#. Key:\t8177A07D41AE7778BB4839AED3FEDACF\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_23.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_23.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"Do you know what you are risking?\"\nmsgstr \"Do you know what you are risking?\"\n\n#. Key:\t876B4752465406828E27A88C282EA5CD\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"From here I can teleport you close to the place where the Wizard will be able to get you out.\"\nmsgstr \"From here I can teleport you close to the place where the Wizard will be able to get you out.\"\n\n#. Key:\t9255CAD841A0C5B4DF3F4D8C5F5516B1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"So many great things will perish. So many...\"\nmsgstr \"So many great things will perish. So many...\"\n\n#. Key:\t95EDE8FB4CEC490381EBD990C7277009\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_38.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_38.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"Take your time!\"\nmsgstr \"Take your time!\"\n\n#. Key:\t9D46888D43C665A29506BF9CBB62F81D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_35.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_35.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"Let me try again!\"\nmsgstr \"Let me try again!\"\n\n#. Key:\tA1CF649542AAE3D8945327B9502E2E78\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_29.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_29.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"What chance do the humans have?\"\nmsgstr \"What chance do the humans have?\"\n\n#. Key:\tA60B94F64A0D02EA0DA9419741ED84F4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_36.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_36.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"I just need some rest.\"\nmsgstr \"I just need some rest.\"\n\n#. Key:\tA651056C4D344D685FEB53B2C3795966\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_34.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_34.Children(0).Children.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"Retry\"\nmsgstr \"Retry\"\n\n#. Key:\tAAE7046349DBE5359097179A42FDA255\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_33.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_33.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"This one was enough.\"\nmsgstr \"This one was enough.\"\n\n#. Key:\tB17D67194997EFAEF6B8678DB05894FD\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"Let’s get them out first and face Ruin after.\"\nmsgstr \"Let’s get them out first and face Ruin after.\"\n\n#. Key:\tB4E31022471B52056F7B5AA3BB322700\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"How can I get to the Wizard’s tower?\"\nmsgstr \"How can I get to the Wizard’s tower?\"\n\n#. Key:\tB6C99FC54E2A347994473EBF52B57EBD\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_4.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_4.Children(1).Children.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"Raven’s plan\"\nmsgstr \"Raven’s plan\"\n\n#. Key:\tB985955E4FC6D81FBD38D79ADE68BF1F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_4.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_4.Children(0).Children.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"Separate Worlds\"\nmsgstr \"Separate Worlds\"\n\n#. Key:\tC4BABAED4C790EDDF6AAF7A0D4CFA79B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_27.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_27.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"When Ruin started in the Runic Realm they had hundreds of Scientists who studied the force which made Ruin.\"\nmsgstr \"When Ruin started in the Runic Realm they had hundreds of Scientists who studied the force which made Ruin.\"\n\n#. Key:\tCB779F524992B29781C4778ED6E224A7\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_30.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_30.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"I just can’t leave them to die here...\"\nmsgstr \"I just can’t leave them to die here...\"\n\n#. Key:\tCDA7A09249E96A52B2FA3CA471D6C4B3\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"This is the end of the path where we last meet.\"\nmsgstr \"This is the end of the path where we last meet.\"\n\n#. Key:\tCF238FAA4941848AF7071A866B75B6EC\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"You are right. The only way to stop Ruin is to lock the Ruined Realm forever.\"\nmsgstr \"You are right. The only way to stop Ruin is to lock the Ruined Realm forever.\"\n\n#. Key:\tD1F3B7324351B25E8C55679BAC3BF1E0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"Have you made your decision?\"\nmsgstr \"Have you made your decision?\"\n\n#. Key:\tE164446B4944B4CAC8E5C1BF82A722A2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_24.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_24.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"If you bring infected people into the Human Realm Ruin will consume them.\"\nmsgstr \"If you bring infected people into the Human Realm Ruin will consume them.\"\n\n#. Key:\tE39531DE4350D6D86DF469839F1906E7\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_31.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_31.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"It’s your decision, Wanderer. I understand.\"\nmsgstr \"It’s your decision, Wanderer. I understand.\"\n\n#. Key:\tE46912D04BE67D3E2B0794BB632AEE98\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_32.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_32.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"I’ll stay here. I won’t be able to watch another World dying...\"\nmsgstr \"I’ll stay here. I won’t be able to watch another World dying...\"\n\n#. Key:\tF70B765F44DB17E1C6978D9D8652C911\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"Hello, little Wanderer!\"\nmsgstr \"Hello, little Wanderer!\"\n\n#. Key:\tFE709EDF4482B6FA7408DE99D95E8577\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_29.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_29.Children(0).Children.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"You are right\"\nmsgstr \"You are right\"\n\n#. Key:\tFE77F7964851F202F5C91396A4C7228E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"I’ll take you to the place where you can leave this Realm.\"\nmsgstr \"I’ll take you to the place where you can leave this Realm.\"\n\n#. Key:\t0B886754483D1C215FBEF5B7D19AF6A6\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"I know you have summoned a Spirit of the Unknown world. You were a fool to think you can get away with this.\"\nmsgstr \"I know you have summoned a Spirit of the Unknown world. You were a fool to think you can get away with this.\"\n\n#. Key:\t0BDF59D34A9E53B7FD5FD18F8E46F72F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"Argh! All right, here you go...\"\nmsgstr \"Argh! All right, here you go...\"\n\n#. Key:\t2A6837CA471604FCDD180E85BD23D676\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"Krrr... Raven gives you magic which will make you fly like a Raven.\"\nmsgstr \"Krrr... Raven gives you magic which will make you fly like a Raven.\"\n\n#. Key:\t2D8209F74AC3C9E042717A9FB108C051\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"Come on, go and try it!\"\nmsgstr \"Come on, go and try it!\"\n\n#. Key:\t39B1763740E9BB9B495A7997920A3401\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_12.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_12.Children(0).Children.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"How?\"\nmsgstr \"How?\"\n\n#. Key:\t3AE553D14FFB88C0518679B86691D508\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"Call your master little spirit, I have words with him.\"\nmsgstr \"Call your master little spirit, I have words with him.\"\n\n#. Key:\t3E02111D40F21C2C8C13F08729B4CDBC\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"I don’t know about any rule forbidding that...\"\nmsgstr \"I don’t know about any rule forbidding that...\"\n\n#. Key:\t453610F144D8CEB42138F0BB35B9692A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"Wait Scholar! Please give me a few more days!\"\nmsgstr \"Wait Scholar! Please give me a few more days!\"\n\n#. Key:\t4F0C40114C4DD1B345CF909E94F99D60\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"Why should I ask that?\"\nmsgstr \"Why should I ask that?\"\n\n#. Key:\t56F0D93740AB7555FF9370879D774842\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"I have no doubt how the Council will react.\"\nmsgstr \"I have no doubt how the Council will react.\"\n\n#. Key:\t60D3A9DA420ECD7DBF490BA233EA5C61\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"Because you would love to know how you can get out of here.\"\nmsgstr \"Because you would love to know how you can get out of here.\"\n\n#. Key:\t6125A956446F64BD91E1F5A282AC146D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"Don’t worry! I know your daughter is trapped in the Unknown and my research confirms there is a chance you can bring her back.\\r\\nI’ll help you bring the missing artefacts back.\"\nmsgstr \"Don’t worry! I know your daughter is trapped in the Unknown and my research confirms there is a chance you can bring her back.\\r\\nI’ll help you bring the missing artefacts back.\"\n\n#. Key:\t6B7478444FBC694480D442BB90F70B27\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"What do you want?\"\nmsgstr \"What do you want?\"\n\n#. Key:\t72D7F64D4051F9BF362B9B97FD30DB65\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_12.Children(2).Children.Text\n#. Key:\tF62125FB48F982D2A3D4FE9621810F64\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_12.Children(2).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"What?\"\nmsgstr \"What?\"\n\n#. Key:\t810BD4154FA6BC7F857F9CB14EDC6A1D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"Er... thanks!\"\nmsgstr \"Er... thanks!\"\n\n#. Key:\t8F439E124100E004BCCD4AA04F17CB3F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"How will we get out of here?\"\nmsgstr \"How will we get out of here?\"\n\n#. Key:\t9D31A0084CBBA499BA4E3BADB42E6E36\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"Rule? What rule should be needed for something which was thought to be impossible?\"\nmsgstr \"Rule? What rule should be needed for something which was thought to be impossible?\"\n\n#. Key:\t9F52551E46588D4F12CD7C8B63701FDE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_12.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_12.Children(1).Children.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"Why?\"\nmsgstr \"Why?\"\n\n#. Key:\tAAC96E3C4D4D303C9E692390612A7215\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"Ask how we will get out of here!\"\nmsgstr \"Ask how we will get out of here!\"\n\n#. Key:\tC0808C6545D02F43CB37A2AFB79EEC1F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"Actually it’s not that good but still better than nothing.\"\nmsgstr \"Actually it’s not that good but still better than nothing.\"\n\n#. Key:\tC19759F44A5A2AE21A04EBAF2A47E2D3\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"Take this!\"\nmsgstr \"Take this!\"\n\n#. Key:\tC8CEB3844A6C958FF42C74AA81D4A90F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"Finally, Raven found you!\"\nmsgstr \"Finally, Raven found you!\"\n\n#. Key:\tCF6DEF4D4F6F664CF24435AF248CE452\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"Raven and his fellow Ball on a quest again!\"\nmsgstr \"Raven and his fellow Ball on a quest again!\"\n\n#. Key:\tE52C31F241BCD21378696EB8761C0654\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"Let the masters talk in private and discuss how we will get out of here!\"\nmsgstr \"Let the masters talk in private and discuss how we will get out of here!\"\n\n#. Key:\t00ED8B314FC2DA3901823F92635D41D1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_26.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_26.Children(0).Children.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"You’ll be all dead\"\nmsgstr \"You’ll be all dead\"\n\n#. Key:\t23BA5AA446B44D107B9F3994ADDE1C43\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_22.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_22.Children(1).Children.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Save them!\"\nmsgstr \"Save them!\"\n\n#. Key:\t42395E7B4B735458E30557B9544073E3\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_8.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_8.Children(1).Children.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Leave\"\nmsgstr \"Leave\"\n\n#. Key:\t43A5BAA8417D3291E502AD9500873B9E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Rumours have been spread of Ruin and the people are scared. They demand the Wizard Council to separate the Human Realm from the Ruined Realm.\"\nmsgstr \"Rumours have been spread of Ruin and the people are scared. They demand the Wizard Council to separate the Human Realm from the Ruined Realm.\"\n\n#. Key:\t4FAAEE6240849C416541EDA8AB8083C8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_30.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_30.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Good luck, Raven!\"\nmsgstr \"Good luck, Raven!\"\n\n#. Key:\t559673484F3C66AADE37E787BA35824A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_33.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_33.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Only a fool would bring Ruin to his own World.\"\nmsgstr \"Only a fool would bring Ruin to his own World.\"\n\n#. Key:\t568124F448BE3AF41123A0B7BB158A53\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Krrrr! Raven and you make a really good team.\"\nmsgstr \"Krrrr! Raven and you make a really good team.\"\n\n#. Key:\t5853B8654DBD91894792DE803DE87271\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_27.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_27.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"You bring back the artefacts to rescue Lillian.\"\nmsgstr \"You bring back the artefacts to rescue Lillian.\"\n\n#. Key:\t5D71DA8F4134A1AA206F15B7587AA188\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_15.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_15.Children(0).Children.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Break in?\"\nmsgstr \"Break in?\"\n\n#. Key:\t6234A9A34854A37E0CA56987FDE81F5A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_26.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_26.Children(1).Children.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"You are right\"\nmsgstr \"You are right\"\n\n#. Key:\t6B07C6F34DF51DFA23A4278FCBECF303\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"What it will do?\"\nmsgstr \"What it will do?\"\n\n#. Key:\t6E5A51A34AB81094924512B92F25F41C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_32.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_32.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"You are trying to rescue a bunch of mad people so that they can live a few more years with the cost of destroying one more Realm.\"\nmsgstr \"You are trying to rescue a bunch of mad people so that they can live a few more years with the cost of destroying one more Realm.\"\n\n#. Key:\t70514624400617999FA05FAFAE67D60F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"What happened in the Human Realm?\"\nmsgstr \"What happened in the Human Realm?\"\n\n#. Key:\t71C42D6445782897EAF303BFA2C5C260\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"What will you do? What’s your part in this?\"\nmsgstr \"What will you do? What’s your part in this?\"\n\n#. Key:\t728B75824B28856156D207B71017C714\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Things are changing in the Human Realm and Raven has many things to do.\"\nmsgstr \"Things are changing in the Human Realm and Raven has many things to do.\"\n\n#. Key:\t7826765F45BE76393F3636B79BBC24C0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_24.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_24.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"You are right. We need to save them. What’s the plan?\"\nmsgstr \"You are right. We need to save them. What’s the plan?\"\n\n#. Key:\t866DA22D46D855A200BB7F9E71788367\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_22.Children(0).Children.Text\n#. Key:\tBA0DEBA04BF5C604A2B760B8275E2983\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_23.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_22.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_23.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Is that safe?\"\nmsgstr \"Is that safe?\"\n\n#. Key:\t86E69EA04F489DC54B48BEBE8B3762BF\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_1.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_1.Children(0).Children.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Agree\"\nmsgstr \"Agree\"\n\n#. Key:\t8D543992469624098751EAA474848F8C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Soon the Ruined Realm will be over. We cannot save it.\"\nmsgstr \"Soon the Ruined Realm will be over. We cannot save it.\"\n\n#. Key:\t943679734061A00F4CC99A8BC31078EA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Wizard won’t activate the device for them but some of them are fools enough to try it anyway.\"\nmsgstr \"Wizard won’t activate the device for them but some of them are fools enough to try it anyway.\"\n\n#. Key:\t978AEC8B45AC7E6ED3E814AB849CF96A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"So, what now?\"\nmsgstr \"So, what now?\"\n\n#. Key:\t99250A3F4973EBFB5A20A192DF8976AA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"With every day more and more people join their ranks.\"\nmsgstr \"With every day more and more people join their ranks.\"\n\n#. Key:\t9D81AC2C4900D6DDA6B17CAD7168020C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_31.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_31.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Farewell, compeer!\"\nmsgstr \"Farewell, compeer!\"\n\n#. Key:\tA5F24B3747918DB1E38CB98208FD6B1B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_35.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_35.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Or maybe you are wrong.\"\nmsgstr \"Or maybe you are wrong.\"\n\n#. Key:\tB0ECBFAF4E34AEDE88F1B7B7C7F7CC5B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_8.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_8.Children(0).Children.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"What happened?\"\nmsgstr \"What happened?\"\n\n#. Key:\tB1D891BF48298C5D4CF7D8957EACDD1B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Raven will gather as many survivors as Raven can.\"\nmsgstr \"Raven will gather as many survivors as Raven can.\"\n\n#. Key:\tB6CF3E424BAEA6EE368D508EEFDD5FF1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_36.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_36.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Farewell compeer! Raven will be on a quest on Raven’s own!\"\nmsgstr \"Farewell compeer! Raven will be on a quest on Raven’s own!\"\n\n#. Key:\tB87509FF4D29C2B3D25CCEB192090963\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"What happens if they break in?\"\nmsgstr \"What happens if they break in?\"\n\n#. Key:\tB89F014644B8D3E1754B1B8C796D5858\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_1.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_1.Children(1).Children.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Disagree\"\nmsgstr \"Disagree\"\n\n#. Key:\tBA14AAD54C3D4F7CF18F5D8560A62637\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Nothing good...\"\nmsgstr \"Nothing good...\"\n\n#. Key:\tC2E50DCB4E1171342DD931910E42549E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_37.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_37.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Farewell!\"\nmsgstr \"Farewell!\"\n\n#. Key:\tC3B19DAF4C0B491D9236CD99FD7DD603\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Except when you kill me with a laser beam.\"\nmsgstr \"Except when you kill me with a laser beam.\"\n\n#. Key:\tCBDDFBD14121FE1758B360A1775F2169\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Farewell compeer until you meet Raven again!\"\nmsgstr \"Farewell compeer until you meet Raven again!\"\n\n#. Key:\tCD19E0924BB1080025ABA19860F578CE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Somehow they know about the device the Wizard created. They surrounded the Wizard’s tower. Some even tried to break in.\"\nmsgstr \"Somehow they know about the device the Wizard created. They surrounded the Wizard’s tower. Some even tried to break in.\"\n\n#. Key:\tD54470AA424038F96824FC805AE3F0EE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_25.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_25.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Krrr! For them it’s much safer than staying here when the World is over.\"\nmsgstr \"Krrr! For them it’s much safer than staying here when the World is over.\"\n\n#. Key:\tD99400D94457B6779DE59DB94FDBF9D1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"We have really short time to act.\"\nmsgstr \"We have really short time to act.\"\n\n#. Key:\tDAEF711B41EC4EF72FC271B5AD98A238\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_26.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_26.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"There are hundreds of survivors. Races that don’t even exist anywhere else! Who are we if we don’t even try to save them?\"\nmsgstr \"There are hundreds of survivors. Races that don’t even exist anywhere else! Who are we if we don’t even try to save them?\"\n\n#. Key:\tDF872D134C82DFDD3F55F4A6FFF59673\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Except...\"\nmsgstr \"Except...\"\n\n#. Key:\tE64B8C0048D2D3357B74CD8D7C1B5407\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_34.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_34.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"You sound like that Monk, don’t you? Maybe you are right.\"\nmsgstr \"You sound like that Monk, don’t you? Maybe you are right.\"\n\n#. Key:\tEA01FB8248A5F30CF9D95AA292D5466A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"No problem.\"\nmsgstr \"No problem.\"\n\n#. Key:\tF1193DA54FBB289383D56F952818E67E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Raven’s master decided we need to gather every survivor and take them into the Human Realm.\"\nmsgstr \"Raven’s master decided we need to gather every survivor and take them into the Human Realm.\"\n\n#. Key:\tF19792CF477CD543AC05FCBEDA3EA88C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_15.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_15.Children(1).Children.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"To act?\"\nmsgstr \"To act?\"\n\n#. Key:\tF606FBDF4B7F3DFF9A55BE9CDB186CAC\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Farewell then!\"\nmsgstr \"Farewell then!\"\n\n#. Key:\tF8FA36BF4E3A4C028FBAF0A2AA531AA4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"You need to go on alone.\"\nmsgstr \"You need to go on alone.\"\n\n#. Key:\tFA02BBA74B601254CDA90A9300AD312F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_29.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_29.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"If all goes well you will meet Raven on the other side.\"\nmsgstr \"If all goes well you will meet Raven on the other side.\"\n\n#. Key:\tFA630952402B081C2D449DA3C091F33E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Yes, we did well. Thanks for the help!\"\nmsgstr \"Yes, we did well. Thanks for the help!\"\n\n#. Key:\t63338A0644CC3AE62BCC10B56EAAD524\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3SewerCreature.C3SewerCreature:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter3/C3SewerCreature.C3SewerCreature:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_C3SewerCreature\"\nmsgid \"Fear not, everything will be alright!\"\nmsgstr \"Fear not, everything will be alright!\"\n\n#. Key:\t2C1EC209404316CE23DC67B6E91AC661\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Statue.C3Statue:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter3/C3Statue.C3Statue:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_C3Statue\"\nmsgid \"Are you ready?\"\nmsgstr \"Are you ready?\"\n\n#. Key:\t33B337C9455FC32BF5C3C69F58843673\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Statue.C3Statue:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Chapter3/C3Statue.C3Statue:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_C3Statue\"\nmsgid \"Will you release me once I get into your tower?\"\nmsgstr \"Will you release me once I get into your tower?\"\n\n#. Key:\t4A8AD3EC428307141BD011B66448A7E5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Statue.C3Statue:DlgNode_Speech_2.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Statue.C3Statue:DlgNode_Speech_2.Children(0).Children.Text\nmsgctxt \"Dialogue_C3Statue\"\nmsgid \"Ready\"\nmsgstr \"Ready\"\n\n#. Key:\t9C5B29DF4784913DFF166BAD07AC1219\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Statue.C3Statue:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Chapter3/C3Statue.C3Statue:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_C3Statue\"\nmsgid \"Hurry! We don’t have much time.\"\nmsgstr \"Hurry! We don’t have much time.\"\n\n#. Key:\tB640545F41315B4C142083A2DB12A132\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Statue.C3Statue:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Chapter3/C3Statue.C3Statue:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_C3Statue\"\nmsgid \"Sure, we made a deal.\"\nmsgstr \"Sure, we made a deal.\"\n\n#. Key:\tC4EC98FC40F0181F5AFA60B4DFEF2D16\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Statue.C3Statue:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Chapter3/C3Statue.C3Statue:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_C3Statue\"\nmsgid \"Not yet. I’ll be back...\"\nmsgstr \"Not yet. I’ll be back...\"\n\n#. Key:\tCD542C81498F713774D43AB6EF126E32\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Statue.C3Statue:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter3/C3Statue.C3Statue:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_C3Statue\"\nmsgid \"Well done! From here I can take you to my tower.\"\nmsgstr \"Well done! From here I can take you to my tower.\"\n\n#. Key:\tF982C80748C46B117906F094608B7E2C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Statue.C3Statue:DlgNode_Speech_2.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Statue.C3Statue:DlgNode_Speech_2.Children(1).Children.Text\nmsgctxt \"Dialogue_C3Statue\"\nmsgid \"Stay\"\nmsgstr \"Stay\"\n\n#. Key:\tFE6723D8452B497B07504EA753F02F35\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Statue.C3Statue:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Chapter3/C3Statue.C3Statue:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_C3Statue\"\nmsgid \"Let’s go then!\"\nmsgstr \"Let’s go then!\"\n\n#. Key:\t7C2DF1BE46E7672A1C7092A330030B39\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3SupperDwarf.C3SupperDwarf:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter3/C3SupperDwarf.C3SupperDwarf:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_C3SupperDwarf\"\nmsgid \"Otherwise I would rather stay here.\"\nmsgstr \"Otherwise I would rather stay here.\"\n\n#. Key:\tFEB0911A412AF51088EC6A84D0FC7B3C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3SupperDwarf.C3SupperDwarf:DlgNode_Speech_80.Text\n#: /Game/SO/Dialogues/Chapter3/C3SupperDwarf.C3SupperDwarf:DlgNode_Speech_80.Text\nmsgctxt \"Dialogue_C3SupperDwarf\"\nmsgid \"I hope there is some delicious food in the Human Realm.\"\nmsgstr \"I hope there is some delicious food in the Human Realm.\"\n\n#. Key:\t360852FB41FBC269468577878A0CC719\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_C3Teachy\"\nmsgid \"Don’t say it, I know. I’m genius.\"\nmsgstr \"Don’t say it, I know. I’m genius.\"\n\n#. Key:\t39008A1943A63D4050295B9C508DF4CE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_C3Teachy\"\nmsgid \"He asked me to prove that I am worthy.\"\nmsgstr \"He asked me to prove that I am worthy.\"\n\n#. Key:\t5D3A77994D763C95F5655CAC4F228452\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_C3Teachy\"\nmsgid \"Oh, the walking ball again!\"\nmsgstr \"Oh, the walking ball again!\"\n\n#. Key:\t74789A0946246082325FCDB2600CEAA2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_C3Teachy\"\nmsgid \"I haven’t seen you since you left me there with that Keeper.\"\nmsgstr \"I haven’t seen you since you left me there with that Keeper.\"\n\n#. Key:\t81A13B9645C14341A7FA45BC7482AB58\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_C3Teachy\"\nmsgid \"I'm not sure if it still matters but here is the Weird Device I found in the hideout of the Secret Science Society.\"\nmsgstr \"I'm not sure if it still matters but here is the Weird Device I found in the hideout of the Secret Science Society.\"\n\n#. Key:\t8E2355CF4A1F7CCF4AF0FA8D95E2F503\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_C3Teachy\"\nmsgid \"After reordering the right side I got the final result:\\r\\n\\r\\nTEACHY = WORTHY\"\nmsgstr \"After reordering the right side I got the final result:\\r\\n\\r\\nTEACHY = WORTHY\"\n\n#. Key:\tA46C8D2749791CE910856BA8887272EB\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_C3Teachy\"\nmsgid \"That is amazing! Thank you, my globular friend! Take these coins, I am sure you will enjoy spending them... if you still can.\"\nmsgstr \"That is amazing! Thank you, my globular friend! Take these coins, I am sure you will enjoy spending them... if you still can.\"\n\n#. Key:\tBFA75D71419A3B5615D65980F9A2FC0E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_C3Teachy\"\nmsgid \"Well, alright, I’ll tell.\"\nmsgstr \"Well, alright, I’ll tell.\"\n\n#. Key:\tC09FB7394571D19280D0B68572C6DCBB\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_C3Teachy\"\nmsgid \"I bet you wonder how did I get out.\"\nmsgstr \"I bet you wonder how did I get out.\"\n\n#. Key:\tCC72AAE64CE58AECB367B0B2565A74CC\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_C3Teachy\"\nmsgid \"I made some cups of tea and slowly put them in a row. From that I had this formula:\\r\\n\\r\\nTIME = T\\r\\nCUP = C\\r\\nTEA * C = ROW * T\"\nmsgstr \"I made some cups of tea and slowly put them in a row. From that I had this formula:\\r\\n\\r\\nTIME = T\\r\\nCUP = C\\r\\nTEA * C = ROW * T\"\n\n#. Key:\tE907906F4A46886EFBA7F09E459F2663\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_C3Teachy\"\nmsgid \"Then I multiplied by HY, so I get:\\r\\n\\r\\nTEACHY = ROWTHY\"\nmsgstr \"Then I multiplied by HY, so I get:\\r\\n\\r\\nTEACHY = ROWTHY\"\n\n#. Key:\t298F025648B369E90753DA8D882DFDDB\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/DwarvenCatacombs/DCDictionary.DCDictionary:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Wizard/DwarvenCatacombs/DCDictionary.DCDictionary:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_DCDictionary\"\nmsgid \"Finally! A dictionary!\"\nmsgstr \"Finally! A dictionary!\"\n\n#. Key:\t3D4CF9424B28083560A64D8FA1232E9F\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/DwarvenCatacombs/DCDictionary.DCDictionary:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Wizard/DwarvenCatacombs/DCDictionary.DCDictionary:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_DCDictionary\"\nmsgid \"Wake me up when you are ready.\"\nmsgstr \"Wake me up when you are ready.\"\n\n#. Key:\t04B787DD4344DA8AD6B1E0B7925BBDCE\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/DwarvenCatacombs/DCSecretDoor.DCSecretDoor:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Wizard/DwarvenCatacombs/DCSecretDoor.DCSecretDoor:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_DCSecretDoor\"\nmsgid \"There is a hidden Dwarven Door somewhere around here.\"\nmsgstr \"There is a hidden Dwarven Door somewhere around here.\"\n\n#. Key:\t4412DD54423A17AF3BFBA89BAF42664D\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/DwarvenCatacombs/DCSecretDoor.DCSecretDoor:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Wizard/DwarvenCatacombs/DCSecretDoor.DCSecretDoor:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_DCSecretDoor\"\nmsgid \"Or if you toggle that switch.\"\nmsgstr \"Or if you toggle that switch.\"\n\n#. Key:\t5FDA3D2A49BD57C213F0E3869A366B76\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/DwarvenCatacombs/DCSecretDoor.DCSecretDoor:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Wizard/DwarvenCatacombs/DCSecretDoor.DCSecretDoor:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_DCSecretDoor\"\nmsgid \"This one can only be revealed on Christmas time if the full moon shines on it.\"\nmsgstr \"This one can only be revealed on Christmas time if the full moon shines on it.\"\n\n#. Key:\tCE7E6F5B4DB41F1055EAF1898F17E4EA\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/DwarvenCatacombs/DCSecretDoor.DCSecretDoor:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Wizard/DwarvenCatacombs/DCSecretDoor.DCSecretDoor:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_DCSecretDoor\"\nmsgid \"Dwarfs are fond of these. They can't be seen if you don't know their trick.\"\nmsgstr \"Dwarfs are fond of these. They can't be seen if you don't know their trick.\"\n\n#. Key:\t03067C1041952ECAC7D529AF2CC2ABEE\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_DemonLillian\"\nmsgid \"Who you just killed...\"\nmsgstr \"Who you just killed...\"\n\n#. Key:\t06C4895B4BA9C2F71F3007B00A680CFB\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_DemonLillian\"\nmsgid \"I'm free without any bounds! I'm human!\"\nmsgstr \"I'm free without any bounds! I'm human!\"\n\n#. Key:\t0E5418EA4828B840886434A250967CBE\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_DemonLillian\"\nmsgid \"You liar! I'm the daughter of the Wizard!\"\nmsgstr \"You liar! I'm the daughter of the Wizard!\"\n\n#. Key:\t15ED5E554FBF25A72BB12FA81F4076FF\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_DemonLillian\"\nmsgid \"Sister? What makes you say that?\"\nmsgstr \"Sister? What makes you say that?\"\n\n#. Key:\t2B375C424D4561D651214BA0F10CDB44\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_DemonLillian\"\nmsgid \"Siblings? What makes you say that?\"\nmsgstr \"Siblings? What makes you say that?\"\n\n#. Key:\t2F0A5F3442ACF917A0515892B0639541\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_2.Children(1).Children.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_2.Children(1).Children.Text\nmsgctxt \"Dialogue_DemonLillian\"\nmsgid \"Just passing\"\nmsgstr \"Just passing\"\n\n#. Key:\t36A3340F4333184F42874F88F23A710D\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_DemonLillian\"\nmsgid \"What are you doing here little toy?\"\nmsgstr \"What are you doing here little toy?\"\n\n#. Key:\t46C7EE464B94BCE5D8CE6DB96299A583\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_DemonLillian\"\nmsgid \"You are nonsense.\"\nmsgstr \"You are nonsense.\"\n\n#. Key:\t732777EC4B213BC797E24FBBC478D39F\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_DemonLillian\"\nmsgid \"You are a Spirit of the Unknown bound to this body by magic. Just like me.\"\nmsgstr \"You are a Spirit of the Unknown bound to this body by magic. Just like me.\"\n\n#. Key:\t819738554E1DD3694F3D0699221E6932\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_DemonLillian\"\nmsgid \"I'm just err... maybe we could play seek and hide?\"\nmsgstr \"I'm just err... maybe we could play seek and hide?\"\n\n#. Key:\tA02291F444C7907190F1D3AC78E5EAF0\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_2.Children(0).Children.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_2.Children(0).Children.Text\nmsgctxt \"Dialogue_DemonLillian\"\nmsgid \"I'll stop you!\"\nmsgstr \"I'll stop you!\"\n\n#. Key:\tA94658F148628400E971CD925A6B8713\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_DemonLillian\"\nmsgid \"Shaped like a human...\"\nmsgstr \"Shaped like a human...\"\n\n#. Key:\tBBBDA8B843BF5549EF4052894D9BB630\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_DemonLillian\"\nmsgid \"We are siblings right? You will surely let me pass...\"\nmsgstr \"We are siblings right? You will surely let me pass...\"\n\n#. Key:\tBF79A92B406E287D767E7799D78FCFD4\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_DemonLillian\"\nmsgid \"That sounds funny!\"\nmsgstr \"That sounds funny!\"\n\n#. Key:\tC6609DA7417A4DBC86F9809CE994E8BA\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_DemonLillian\"\nmsgid \"I'm power, I'm god!\"\nmsgstr \"I'm power, I'm god!\"\n\n#. Key:\tDD2EF1594AFD2B0C38845C9E36089B95\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_DemonLillian\"\nmsgid \"I've found you!\"\nmsgstr \"I've found you!\"\n\n#. Key:\tDD2F3A7048614E74B3A343BA474D8E49\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_DemonLillian\"\nmsgid \"I've come to stop you sister. The World is not your playground!\"\nmsgstr \"I've come to stop you sister. The World is not your playground!\"\n\n#. Key:\tE7FA21A04757D1EF04AE41AF4A13025A\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_DemonLillian\"\nmsgid \"I'm bored! Have you come to play with me?\"\nmsgstr \"I'm bored! Have you come to play with me?\"\n\n#. Key:\tFF05E84E4027C75294BAF4A589EEF6F9\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_DemonLillian\"\nmsgid \"I can create, I can destroy!\"\nmsgstr \"I can create, I can destroy!\"\n\n#. Key:\t025193144996A7024A7CF791B5A25EB7\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillianDefeated.DemonLillianDefeated:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillianDefeated.DemonLillianDefeated:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_DemonLillianDefeated\"\nmsgid \"What are you doing? Keep your hands away from me!\"\nmsgstr \"What are you doing? Keep your hands away from me!\"\n\n#. Key:\t2E05897C454C5C33BD76A6A4371A545C\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillianDefeated.DemonLillianDefeated:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillianDefeated.DemonLillianDefeated:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_DemonLillianDefeated\"\nmsgid \"I don't want to play anymore!\"\nmsgstr \"I don't want to play anymore!\"\n\n#. Key:\t77A82F8943F323744F9389BF22A80FDF\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillianDefeated.DemonLillianDefeated:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillianDefeated.DemonLillianDefeated:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_DemonLillianDefeated\"\nmsgid \"Farewell Spirit!\"\nmsgstr \"Farewell Spirit!\"\n\n#. Key:\t7831CD44458112E37918DF9082278603\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillianDefeated.DemonLillianDefeated:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillianDefeated.DemonLillianDefeated:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_DemonLillianDefeated\"\nmsgid \"Leave me alone!\"\nmsgstr \"Leave me alone!\"\n\n#. Key:\t79E4053F4B8A1AFE74064BA77037F13E\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillianDefeated.DemonLillianDefeated:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillianDefeated.DemonLillianDefeated:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_DemonLillianDefeated\"\nmsgid \"I am his daughter. And this body is mine.\"\nmsgstr \"I am his daughter. And this body is mine.\"\n\n#. Key:\t96BD08904BC50C912055C0977281D10F\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillianDefeated.DemonLillianDefeated:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillianDefeated.DemonLillianDefeated:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_DemonLillianDefeated\"\nmsgid \"I know this body...\"\nmsgstr \"I know this body...\"\n\n#. Key:\tA5634D7D4613C578AB85E48B2DBD422B\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillianDefeated.DemonLillianDefeated:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillianDefeated.DemonLillianDefeated:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_DemonLillianDefeated\"\nmsgid \"Away!\"\nmsgstr \"Away!\"\n\n#. Key:\tE09248B24E34823DDE71BAB68183AD2D\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillianDefeated.DemonLillianDefeated:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillianDefeated.DemonLillianDefeated:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_DemonLillianDefeated\"\nmsgid \"They were wrong all along.\"\nmsgstr \"They were wrong all along.\"\n\n#. Key:\t01C1D7AF4D8D7B3D628A089E38471479\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_74.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_74.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Thank you! Take this as reward.\"\nmsgstr \"Thank you! Take this as reward.\"\n\n#. Key:\t034DDD8F467E3B6E6A70CFBC1FA81D21\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_94.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_94.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Look what I have found for you!\"\nmsgstr \"Look what I have found for you!\"\n\n#. Key:\t046279EA4D7E44826F537DA0869C13DD\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_114.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_114.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"They are somewhere around.\"\nmsgstr \"They are somewhere around.\"\n\n#. Key:\t055FD02047EB0145285C8BB0B7A23F0A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_17.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_17.Children(0).Children.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"They fight Ruin\"\nmsgstr \"They fight Ruin\"\n\n#. Key:\t07684DB1418378D59D3741AE19AB22C1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(9).Children.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(9).Children.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Golems destroyed\"\nmsgstr \"Golems destroyed\"\n\n#. Key:\t0D548F74416A5C1D8220869DC707A575\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_127.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_127.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Even if he couldn't be what I wanted him to be, he was my greatest creation ever.\"\nmsgstr \"Even if he couldn't be what I wanted him to be, he was my greatest creation ever.\"\n\n#. Key:\t0E3082704C6E4BA14C554DA5B4306C88\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Could you merge these copper pieces?\"\nmsgstr \"Could you merge these copper pieces?\"\n\n#. Key:\t103CB0C84AEA077F78347A92E6389F32\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_10.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_10.Children(0).Children.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Don't know\"\nmsgstr \"Don't know\"\n\n#. Key:\t12C814BB44D434DFC5C35C882B4BF0DB\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_116.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_116.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Be aware of the Armour Wrath.\"\nmsgstr \"Be aware of the Armour Wrath.\"\n\n#. Key:\t14E2589C4CC2C6C77D37A5B50C61C266\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Could you merge these bronze pieces?\"\nmsgstr \"Could you merge these bronze pieces?\"\n\n#. Key:\t1770D8FE480B8C028F9ED989E22CF315\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"You are not one of my new creations. Yet not one of the ancients.\"\nmsgstr \"You are not one of my new creations. Yet not one of the ancients.\"\n\n#. Key:\t1C02E8BB400B379858A402B9621B68D6\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_129.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_129.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Take care!\"\nmsgstr \"Take care!\"\n\n#. Key:\t1CDE0CFA4DBF3794096E099B58726BD8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_36.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_36.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Nothing else matters.\"\nmsgstr \"Nothing else matters.\"\n\n#. Key:\t1FA243424440B0810651C79BD207FC2D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_33.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_33.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Too many spirits. They break loose. They couldn’t exist in our Realm. They formed Ruin.\"\nmsgstr \"Too many spirits. They break loose. They couldn’t exist in our Realm. They formed Ruin.\"\n\n#. Key:\t1FFE46404FBD26325B1348BF7A2935A7\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_92.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_92.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Oh, thank you! It also gives back some of my lost knowledge.\"\nmsgstr \"Oh, thank you! It also gives back some of my lost knowledge.\"\n\n#. Key:\t2084B3DE4CDAC5B7B9018994EE4DFAA4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_85.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_85.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"The end is close, yet knowing what I am makes my last days brighter.\"\nmsgstr \"The end is close, yet knowing what I am makes my last days brighter.\"\n\n#. Key:\t21883D3E4563FD95B13E8E8E25FB1D92\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_15.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_15.Children(0).Children.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Not my business\"\nmsgstr \"Not my business\"\n\n#. Key:\t2362D7ED44CEEE8592C72BB41ECC0CC0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_77.Text\n#. Key:\t969AF9184296C419E484BA80FF80F15B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_76.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_76.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_77.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Do you know a girl called Lillian?\"\nmsgstr \"Do you know a girl called Lillian?\"\n\n#. Key:\t2362FF25427C7C664ACE9297A20F3C65\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_81.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_81.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Memory Crystals? Can I touch them?\"\nmsgstr \"Memory Crystals? Can I touch them?\"\n\n#. Key:\t254431B64533FAD362B0AF93F8347842\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_119.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_119.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"You will find it if you reach the top of the Main Tower.\"\nmsgstr \"You will find it if you reach the top of the Main Tower.\"\n\n#. Key:\t26664D3045EDCEC9C09E9CBA8515C088\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I don't know... I'm forced to do tasks for a wizard. I'm lost and confused.\"\nmsgstr \"I don't know... I'm forced to do tasks for a wizard. I'm lost and confused.\"\n\n#. Key:\t280BE2914A227E7350F067BCB4CC49AD\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_86.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_86.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Hmmm...\"\nmsgstr \"Hmmm...\"\n\n#. Key:\t2B714CED45A868B1678C5E854160945E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_97.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_97.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Look, I have more crystals.\"\nmsgstr \"Look, I have more crystals.\"\n\n#. Key:\t2C052328496E84667F356F95F9F9C418\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"This is really not my problem. All I care about is to complete my task and go on my way.\"\nmsgstr \"This is really not my problem. All I care about is to complete my task and go on my way.\"\n\n#. Key:\t2C174523477E6720A5300DBFE343C3D8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_51.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_51.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I can no longer open a gate to the Unknown Realm.\"\nmsgstr \"I can no longer open a gate to the Unknown Realm.\"\n\n#. Key:\t2C7D234B4F377087E1D340986BD581AC\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_49.Text\n#. Key:\t417BB4E644EBC809C2489F85993A8E17\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_56.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_49.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_56.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"If you can summon Spirits you surely know a way to get me home.\"\nmsgstr \"If you can summon Spirits you surely know a way to get me home.\"\n\n#. Key:\t2DE200934F6AC1595216AA8050FF8F30\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_67.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_67.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I won’t work with anything else.\"\nmsgstr \"I won’t work with anything else.\"\n\n#. Key:\t2FC050C145CB19BD786157988C677AF5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(1).Children.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Bronze key\"\nmsgstr \"Bronze key\"\n\n#. Key:\t30AD4CBE4D6EFD170F43D9852A0CB50C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_108.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_108.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I can’t remember.\"\nmsgstr \"I can’t remember.\"\n\n#. Key:\t310B95624A8B2179F69A68BE2B0869C2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(4).Children.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(4).Children.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Making Golems?\"\nmsgstr \"Making Golems?\"\n\n#. Key:\t311039514F83A0ED4BE47A98BF5AE48E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_107.Text\n#. Key:\t5D08D2404686BF1E5D48AC8C63096F0D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_104.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_104.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_107.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Thank you Spirit! I will be forever in your debt.\"\nmsgstr \"Thank you Spirit! I will be forever in your debt.\"\n\n#. Key:\t3140425845B595B02CA8D3B8DBC6CE37\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_38.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_38.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"It's done. They are destroyed.\"\nmsgstr \"It's done. They are destroyed.\"\n\n#. Key:\t37835C204E4C4B17F2D55C9B23FD7D1E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_45.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_45.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"There is some kind of a connection between Ruin and the Spirits.\"\nmsgstr \"There is some kind of a connection between Ruin and the Spirits.\"\n\n#. Key:\t384F5CB146C9B6E7EFD361964FF11735\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"A spirit of the Unknown was summoned here by a Wizard of another world.\"\nmsgstr \"A spirit of the Unknown was summoned here by a Wizard of another world.\"\n\n#. Key:\t398124A4493A7325B284CA8105354F0C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_35.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_35.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Yet now the only important thing is to finish my golems.\"\nmsgstr \"Yet now the only important thing is to finish my golems.\"\n\n#. Key:\t39C014784CA9DF8247D2DDA5587BAB20\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(5).Children.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(5).Children.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Get me home!\"\nmsgstr \"Get me home!\"\n\n#. Key:\t3CE0431346C222ED2A6729AAEF8026DC\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(6).Children.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(6).Children.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"New body for me\"\nmsgstr \"New body for me\"\n\n#. Key:\t3DFB1F4D4BB673F983C8CDA4E9911BF2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_89.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_89.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Wait a minute! I’ll make something special for you.\"\nmsgstr \"Wait a minute! I’ll make something special for you.\"\n\n#. Key:\t3F7C1850478A14857F4FFD9D41BA39FC\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_87.Text\n#. Key:\t79079CCD4BB2C6244D6D7CB04BD4C42F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_84.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_84.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_87.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Yes, now I remember. Thank you little Spirit for giving my memories back.\"\nmsgstr \"Yes, now I remember. Thank you little Spirit for giving my memories back.\"\n\n#. Key:\t3FAB7E8D4E72D1EED6E11EA54A128836\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(3).Children.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(3).Children.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Copper Key\"\nmsgstr \"Copper Key\"\n\n#. Key:\t419879C24D39534867F656B704C579AC\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_110.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_110.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Even without my memories I liked to talk to her.\"\nmsgstr \"Even without my memories I liked to talk to her.\"\n\n#. Key:\t41B08BF1417C041EB3ACAE8C09C44872\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_17.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_17.Children(1).Children.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"They will fall\"\nmsgstr \"They will fall\"\n\n#. Key:\t41E19A0C420F2BD87AA91AB475D5BB0C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_128.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_128.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Please, leave me alone now.\"\nmsgstr \"Please, leave me alone now.\"\n\n#. Key:\t4438EF7A4D77A3314D2B6587DAE664AE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I can fix it!\"\nmsgstr \"I can fix it!\"\n\n#. Key:\t46730E7C433AE7B987C61D9DDF0161E2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_52.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_52.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"How do you make Golems then?\"\nmsgstr \"How do you make Golems then?\"\n\n#. Key:\t4816E7D14B256F62C2AFE0A3D5EC1987\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_113.Text\n#. Key:\tEC59F30D402E177B8C137DAA7A834F1A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_112.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_112.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_113.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I’m looking for three artefacts. Do you know something about them?\"\nmsgstr \"I’m looking for three artefacts. Do you know something about them?\"\n\n#. Key:\t49E3D8B84BD437A7195CB49B1C91A9B7\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_30.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_30.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"We created too many of them. Always new ones. We forgot about the old ones.\"\nmsgstr \"We created too many of them. Always new ones. We forgot about the old ones.\"\n\n#. Key:\t4CDF7F734B65BFB6575D66A2E40B64B6\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"You wonder if Ruin will destroy their World as well...\"\nmsgstr \"You wonder if Ruin will destroy their World as well...\"\n\n#. Key:\t4FD5FE974E1B8142471F8896818E875C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"What do you need?\"\nmsgstr \"What do you need?\"\n\n#. Key:\t5000F3F44A899815A0D341A3494E42AB\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_91.Text\n#. Key:\t6D5127FD45C09B33329F0EB0DDCE67D7\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_93.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_91.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_93.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Thank you!\"\nmsgstr \"Thank you!\"\n\n#. Key:\t50E6C4434BAC5A7F4B2C66BD8DB5E071\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_100.Text\n#. Key:\t64A5DE6941972506C0BECBB55BBE4FE5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_78.Text\n#. Key:\tB07790474D4C124CB72F128AE0FB2CC5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_95.Text\n#. Key:\tEF125F27496303716206D182C1ED460D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_39.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_100.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_39.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_78.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_95.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I think these crystals have something to do with you.\"\nmsgstr \"I think these crystals have something to do with you.\"\n\n#. Key:\t51C200AD42FCE6888DBF8C8C24A02283\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"It shall be done.\"\nmsgstr \"It shall be done.\"\n\n#. Key:\t52D4954E427C666F0F2F4A92F9BCFBC9\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_50.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_50.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I’m sorry but I can’t help you.\"\nmsgstr \"I’m sorry but I can’t help you.\"\n\n#. Key:\t5B1327C64C77C05C43CD728356DA4EC4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_58.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_58.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Knowledge lost. We are lost.\"\nmsgstr \"Knowledge lost. We are lost.\"\n\n#. Key:\t5E7AD2034CECCF124DA4E19D94B96433\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"It's nothing. Here it is.\"\nmsgstr \"It's nothing. Here it is.\"\n\n#. Key:\t5FB1520B447246A1A8BCD3BDDB44D145\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_65.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_65.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"No.\"\nmsgstr \"No.\"\n\n#. Key:\t5FBF0F3F4419A6AD796054841902FA7C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"They can't work together even if they share the same goal.\"\nmsgstr \"They can't work together even if they share the same goal.\"\n\n#. Key:\t60609E4049562CF11C05CB8DB96BBBB3\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"What do you mean by 'your creations'?\"\nmsgstr \"What do you mean by 'your creations'?\"\n\n#. Key:\t635D5E904325D51DFF19A1A862A3CC0B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_124.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_124.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"The Armour Wrath is no more.\"\nmsgstr \"The Armour Wrath is no more.\"\n\n#. Key:\t6585CAC84326A3EEE1682789B7BB3CB6\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_10.Children(2).Children.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_10.Children(2).Children.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Your creation?\"\nmsgstr \"Your creation?\"\n\n#. Key:\t65C3735740E5D7AF76376AB2B7B05CE9\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(12).Children.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(12).Children.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Leave\"\nmsgstr \"Leave\"\n\n#. Key:\t6A460D4A4751398E004298948D630BA4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_47.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_47.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I don’t think I will manage though. It’s already too late. But there is no reason to give up either.\"\nmsgstr \"I don’t think I will manage though. It’s already too late. But there is no reason to give up either.\"\n\n#. Key:\t6DC280B64766B5CB2049409B2F73CDB4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_40.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_40.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Is there a way I can help you?\"\nmsgstr \"Is there a way I can help you?\"\n\n#. Key:\t6DD3D7804417850FE8504286DD2B5D95\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_96.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_96.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"More Crystal? That's very kind.\"\nmsgstr \"More Crystal? That's very kind.\"\n\n#. Key:\t6E9DB27A4207FFA8409F61AE45282D53\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_41.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_41.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I have found one more crystal.\"\nmsgstr \"I have found one more crystal.\"\n\n#. Key:\t717452044F194A1C30FA3C8FBB94C9BF\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_73.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_73.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I’ll see what I can do.\"\nmsgstr \"I’ll see what I can do.\"\n\n#. Key:\t74670AB34D1A75913013BE8EE7C0B961\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_72.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_72.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I’ve already destroyed them.\"\nmsgstr \"I’ve already destroyed them.\"\n\n#. Key:\t752F67A54FA433AA588175AA7C64E367\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_43.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_43.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I try to create the perfect Golem. The one which resists Ruin.\"\nmsgstr \"I try to create the perfect Golem. The one which resists Ruin.\"\n\n#. Key:\t775C2189498804DBED7D81AB3EFEC96F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(11).Children.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(11).Children.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Lillian\"\nmsgstr \"Lillian\"\n\n#. Key:\t78C78DDD456328181EBCC78B20F9573D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_122.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_122.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Some of them are still out there.\"\nmsgstr \"Some of them are still out there.\"\n\n#. Key:\t7C7D08C340B478A9420331AD355B1FA5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_15.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_15.Children(1).Children.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Like you?\"\nmsgstr \"Like you?\"\n\n#. Key:\t7DCEFFEC46523960D1453DA93F36CAA5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_111.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_111.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I don’t know why but I feel in some way you are bound to her.\"\nmsgstr \"I don’t know why but I feel in some way you are bound to her.\"\n\n#. Key:\t7F44BD934784D4F3AA2C85985489590A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"A Wizard? So now the Human Realm's people are messing with Golem Technology.\"\nmsgstr \"A Wizard? So now the Human Realm's people are messing with Golem Technology.\"\n\n#. Key:\t80871D9C4CF37B5F2E7101B8A2565D73\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_70.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_70.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"It’s not safe for me to walk outside.\"\nmsgstr \"It’s not safe for me to walk outside.\"\n\n#. Key:\t83ACDDA4415211102DBE099F178B228B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_15.Children(2).Children.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_15.Children(2).Children.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"You mean Ruin\"\nmsgstr \"You mean Ruin\"\n\n#. Key:\t86B4FC23463D5507B11C3F826ADF6C7C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_10.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_10.Children(1).Children.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Spirit in a ball\"\nmsgstr \"Spirit in a ball\"\n\n#. Key:\t88A6486843FEC6A2125F79B8AED93F74\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_99.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_99.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Now there is only a few missing.\"\nmsgstr \"Now there is only a few missing.\"\n\n#. Key:\t8C2169FA47F83CA62B19F083EFC398F5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_26.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_26.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"That is me. And what are you creature?\"\nmsgstr \"That is me. And what are you creature?\"\n\n#. Key:\t8CC8368441F2CCDB0E7B22916F8A0622\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_88.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_88.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Getting back some of my lost knowledge also makes me feel happy.\"\nmsgstr \"Getting back some of my lost knowledge also makes me feel happy.\"\n\n#. Key:\t8E3399DA4F904AD46476418817CD78C4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_62.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_62.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Metal binds the will of the spirits. Rock is a bit less cruel but still weakens your will.\"\nmsgstr \"Metal binds the will of the spirits. Rock is a bit less cruel but still weakens your will.\"\n\n#. Key:\t8F4BB43A4656EAD257920492E10BC764\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_130.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_130.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Yes, they bring back some of my memories.\"\nmsgstr \"Yes, they bring back some of my memories.\"\n\n#. Key:\t8F9DF3254A02EFF2E623DB91935A1529\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_123.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_123.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Come back when you found all of them.\"\nmsgstr \"Come back when you found all of them.\"\n\n#. Key:\t97EE3A1B4AD2EB2E7ED2D1B1427E4A2A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_25.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_25.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"It's only me trying to recreate the perfect Golem.\"\nmsgstr \"It's only me trying to recreate the perfect Golem.\"\n\n#. Key:\t99BCAE80415145460126B08933AE6242\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_118.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_118.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"One of the artefacts is close.\"\nmsgstr \"One of the artefacts is close.\"\n\n#. Key:\t9A05FD0845F9149CEB6EB8889EB9A686\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"That won't happen.\"\nmsgstr \"That won't happen.\"\n\n#. Key:\t9B7BB6624923813EBF68C9BCE9FF8E49\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"There is nothing else I could say. See you later!\"\nmsgstr \"There is nothing else I could say. See you later!\"\n\n#. Key:\t9BEA36B448EC18A9280A5AAB78A46898\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_42.Text\n#. Key:\tD3AE25EC49FA7D2C78C1A382E5A01F28\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_37.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_37.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_42.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Why are you making Golems? What would you like to achieve?\"\nmsgstr \"Why are you making Golems? What would you like to achieve?\"\n\n#. Key:\t9CC2CAF14E5C04555E7329B6EA5082E0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(0).Children.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Armour Wrath\"\nmsgstr \"Armour Wrath\"\n\n#. Key:\t9EF4681A48ED6C909A4180BF823544BC\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(8).Children.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(8).Children.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Do you need help?\"\nmsgstr \"Do you need help?\"\n\n#. Key:\t9F3BC08D46169E8C4BB788893FFDBCD4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_68.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_68.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Yes.\"\nmsgstr \"Yes.\"\n\n#. Key:\tA10EF7404139EE7FE638BCA272C0B2CA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_71.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_71.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Destroy them if you can.\"\nmsgstr \"Destroy them if you can.\"\n\n#. Key:\tA13C1A6B4F187C1A3F682088B9CC9A6F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_23.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_23.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Didn't look too intelligent to me...\"\nmsgstr \"Didn't look too intelligent to me...\"\n\n#. Key:\tA28429434B394861A6E4D084CE5C243F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_61.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_61.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I could but I don’t think you would like it.\"\nmsgstr \"I could but I don’t think you would like it.\"\n\n#. Key:\tA2CBB6914F66C9963AFD34A21378EAA7\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_103.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_103.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"With this last one I have all my memories back.\"\nmsgstr \"With this last one I have all my memories back.\"\n\n#. Key:\tA33780CE4B9EABF54F612DBFCEB4B890\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I wonder if they will end like us.\"\nmsgstr \"I wonder if they will end like us.\"\n\n#. Key:\tA47024E844A13837A8FFFBB1EFA65633\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_44.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_44.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Though I forgot the reason.\"\nmsgstr \"Though I forgot the reason.\"\n\n#. Key:\tA4E91A924BA53F0A000CDB9FC351DDBA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_60.Text\n#. Key:\tB4F5B2E6479E0E1ACDADD8A40E21FB98\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_59.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_59.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_60.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Could you create a stronger body for me?\"\nmsgstr \"Could you create a stronger body for me?\"\n\n#. Key:\tA50F6A7B4A65712F990406B84E2AE072\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_98.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_98.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Thank you! I remember more and more.\"\nmsgstr \"Thank you! I remember more and more.\"\n\n#. Key:\tA586F33F460BD066761AAEBD18666F78\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_82.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_82.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Bring me more so that I can remember!\"\nmsgstr \"Bring me more so that I can remember!\"\n\n#. Key:\tA8A9ACBA47419C57AAA06098F7F91AD3\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_83.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_83.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Let me touch it! Hmmm...\"\nmsgstr \"Let me touch it! Hmmm...\"\n\n#. Key:\tAA5F0D5541366675A1D1819FDBDFA569\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"What happened to you?\"\nmsgstr \"What happened to you?\"\n\n#. Key:\tAD380C5F4F549229611DD9A79C7CD07E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_79.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_79.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"She was from the Human Realm. I liked her better than the other human.\"\nmsgstr \"She was from the Human Realm. I liked her better than the other human.\"\n\n#. Key:\tAE0D1C714FFCFCA51ACCD3A01D6C7FF5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_125.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_125.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Yes, I felt his presence disappearing.\"\nmsgstr \"Yes, I felt his presence disappearing.\"\n\n#. Key:\tAE6B02664FEE60818E0D32B7939907F8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_106.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_106.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Now I have all my memories back.\"\nmsgstr \"Now I have all my memories back.\"\n\n#. Key:\tB7638E004540ADC59420A5AA614C225D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_75.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_75.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I’ve destroyed the Golems near the Tomb.\"\nmsgstr \"I’ve destroyed the Golems near the Tomb.\"\n\n#. Key:\tB86428C143F7BBBC4A7B9A91C05F3D15\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"They are doomed.\"\nmsgstr \"They are doomed.\"\n\n#. Key:\tBB7DE71F44FE995BA4AF4C9F5E19961F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_46.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_46.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I try to create an Essence which resists Ruin. If it works it could stop Ruin.\"\nmsgstr \"I try to create an Essence which resists Ruin. If it works it could stop Ruin.\"\n\n#. Key:\tBCF49E21489280A32F859B9A6C2A78D4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"What are you creature?\"\nmsgstr \"What are you creature?\"\n\n#. Key:\tBDEEB7C2474E308C66B832B41D839FC6\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_66.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_66.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Metal is good for spirits. Even rock is dangerous.\"\nmsgstr \"Metal is good for spirits. Even rock is dangerous.\"\n\n#. Key:\tC0CAE1B14D0B0E551B690FB9F178A6EE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(10).Children.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(10).Children.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Memory Crystals\"\nmsgstr \"Memory Crystals\"\n\n#. Key:\tC86A03B046B8F005B1C91EB0F68E4C1E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_121.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_121.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Here, take this! It might help if you need to face my creature!\"\nmsgstr \"Here, take this! It might help if you need to face my creature!\"\n\n#. Key:\tCA35E144421C5594346DC9954052E633\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_57.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_57.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"No way home.\"\nmsgstr \"No way home.\"\n\n#. Key:\tCD223717428DAF54F5362BB744B6A633\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_53.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_53.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I reuse the old golems. Maybe that’s why I can’t succeed.\"\nmsgstr \"I reuse the old golems. Maybe that’s why I can’t succeed.\"\n\n#. Key:\tD06BA0C54CAA8E00ECAFBE9FAFBABE1F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Could you merge these iron pieces?\"\nmsgstr \"Could you merge these iron pieces?\"\n\n#. Key:\tD237C8514A69E0A7820941B9048B92DE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_90.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_90.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Here it is!\"\nmsgstr \"Here it is!\"\n\n#. Key:\tD2CEAC3040B9EBE5A98F249F60A7DAAA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(2).Children.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(2).Children.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Iron Key\"\nmsgstr \"Iron Key\"\n\n#. Key:\tD935FD314471404BAECA54BC3227D6E2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_69.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_69.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"There are too many unsuccessful golems.\"\nmsgstr \"There are too many unsuccessful golems.\"\n\n#. Key:\tDE3287A345E1E317061B45B64AAA0836\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_34.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_34.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Your words remind me of something. Something which was important.\"\nmsgstr \"Your words remind me of something. Something which was important.\"\n\n#. Key:\tDEC8E5D548AECD6D48B449B51967301B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_115.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_115.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"One is guarded by my worst creation.\"\nmsgstr \"One is guarded by my worst creation.\"\n\n#. Key:\tDEFA219E40FE5384D8B1F0A1CFD3AAD4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_80.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_80.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"She were... She said...\"\nmsgstr \"She were... She said...\"\n\n#. Key:\tE13D5CCE41818BAC4A6E52A965B0AEF8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_101.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_101.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Look at this!\"\nmsgstr \"Look at this!\"\n\n#. Key:\tE1CB9ABE410B3C818283BB9325F3A456\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_32.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_32.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I create golems. You go on with your quest. Nothing else matters.\"\nmsgstr \"I create golems. You go on with your quest. Nothing else matters.\"\n\n#. Key:\tE2AAAA4648BE8A7E73C761BDF72EC82D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_54.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_54.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Ruin caused too much damage.\"\nmsgstr \"Ruin caused too much damage.\"\n\n#. Key:\tE483CAFF4F7EF5607AA0A58F47EEF892\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_31.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_31.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"You are right. We are what we do. That keeps us alive.\"\nmsgstr \"You are right. We are what we do. That keeps us alive.\"\n\n#. Key:\tE9899191454A678E7C61B0A55047A725\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_126.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_126.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I'm glad you managed to defeat him and yet...\"\nmsgstr \"I'm glad you managed to defeat him and yet...\"\n\n#. Key:\tEA08D7B74E94A3D91DC825945916C312\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_102.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_102.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"One more Crystal for you!\"\nmsgstr \"One more Crystal for you!\"\n\n#. Key:\tEAF5836D4D35812F14EABFA43C849947\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_117.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_117.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I know what you are up to. I would like to help but I fear I can’t do much.\"\nmsgstr \"I know what you are up to. I would like to help but I fear I can’t do much.\"\n\n#. Key:\tEB0F70894E9A498111B9A9824589633B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I create Golems. I always did. I designed the most intelligent ones.\"\nmsgstr \"I create Golems. I always did. I designed the most intelligent ones.\"\n\n#. Key:\tF0A1D18E463DCD0CADD67690F691481B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_27.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_27.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"There are some seeking a way to stop Ruin. They don't care about using spirits as slaves.\"\nmsgstr \"There are some seeking a way to stop Ruin. They don't care about using spirits as slaves.\"\n\n#. Key:\tF10E8A9243616A85F71C01B0E57A2CC8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_105.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_105.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"And this is for you!\"\nmsgstr \"And this is for you!\"\n\n#. Key:\tF62B033A4054241E561B519B2AFFEBDB\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Do you mean those moving rock things out there?\"\nmsgstr \"Do you mean those moving rock things out there?\"\n\n#. Key:\tF783A4F44E12EDA97EDF08B60228ED06\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_109.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_109.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"She had heart, she cared about what’s going on here. For the others we were like some interesting study.\"\nmsgstr \"She had heart, she cared about what’s going on here. For the others we were like some interesting study.\"\n\n#. Key:\tF87968784C67FEEEBB78DBAD9D3C13F3\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_63.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_63.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"As for other materials I have no experience. Trust me you don’t want me to test out something on you for the first time.\"\nmsgstr \"As for other materials I have no experience. Trust me you don’t want me to test out something on you for the first time.\"\n\n#. Key:\tF9B8793C470BFE672214E1B82AE01B4E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_24.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_24.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Knowledge is lost. We are all lost.\"\nmsgstr \"Knowledge is lost. We are all lost.\"\n\n#. Key:\tF9DB2D444ADAC7A5C22AEC914EC7955F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(7).Children.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(7).Children.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Artefacts\"\nmsgstr \"Artefacts\"\n\n#. Key:\tFE7749AB4C91684B3438E7A1B5BF32D9\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_29.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_29.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"They can't do as they plan. Some of them don't even believe Ruin.\"\nmsgstr \"They can't do as they plan. Some of them don't even believe Ruin.\"\n\n#. Key:\tFF2914834A91E2B6E8696FA828FC9F94\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_120.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_120.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Though it is guarded by the worst Golem I ever made: the Armour Wrath...\"\nmsgstr \"Though it is guarded by the worst Golem I ever made: the Armour Wrath...\"\n\n#. Key:\t303FE4BA4765B90E9239FEB43AE2264C\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/DwarvenCatacombs/DO1Altar.DO1Altar:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Wizard/DwarvenCatacombs/DO1Altar.DO1Altar:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_DO1Altar\"\nmsgid \"Under section 1 of the first Act, an action of worship can not be aimed at any entity, god or divinity other than the Law itself.\"\nmsgstr \"Under section 1 of the first Act, an action of worship can not be aimed at any entity, god or divinity other than the Law itself.\"\n\n#. Key:\t73BA4B474C4DCF6CD31469A9FF120D58\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/DwarvenCatacombs/DO1Altar1.DO1Altar1:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Wizard/DwarvenCatacombs/DO1Altar1.DO1Altar1:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_DO1Altar1\"\nmsgid \"Under section 2 of the first Act... ??? There is section 3 of the first act, one would assume.\"\nmsgstr \"Under section 2 of the first Act... ??? There is section 3 of the first act, one would assume.\"\n\n#. Key:\t0D939EC3462DBDE895AD9F80CD4A9B99\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/DwarvenOutpost/DO1Arrive1DeadDwarves.DO1Arrive1DeadDwarves:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Wizard/DwarvenOutpost/DO1Arrive1DeadDwarves.DO1Arrive1DeadDwarves:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_DO1Arrive1DeadDwarves\"\nmsgid \"So they were the dwarfs who lived here.\"\nmsgstr \"So they were the dwarfs who lived here.\"\n\n#. Key:\t6E27805A491B0E0DEAC36F9189CA33F9\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/DwarvenOutpost/DO1Arrive1DeadDwarves.DO1Arrive1DeadDwarves:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Wizard/DwarvenOutpost/DO1Arrive1DeadDwarves.DO1Arrive1DeadDwarves:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_DO1Arrive1DeadDwarves\"\nmsgid \"I'm not sure why but I feel a bit of sorrow for them.\"\nmsgstr \"I'm not sure why but I feel a bit of sorrow for them.\"\n\n#. Key:\t7AD20FC74D56D0EE48CB5F92804EDAE5\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/DwarvenOutpost/DO1Arrive1DeadDwarves.DO1Arrive1DeadDwarves:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Wizard/DwarvenOutpost/DO1Arrive1DeadDwarves.DO1Arrive1DeadDwarves:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_DO1Arrive1DeadDwarves\"\nmsgid \"I wonder how you can tell them apart.\"\nmsgstr \"I wonder how you can tell them apart.\"\n\n#. Key:\tA6EB230647E9F8D38877FCA10CDE4875\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/DwarvenOutpost/DO1Arrive1DeadDwarves.DO1Arrive1DeadDwarves:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Wizard/DwarvenOutpost/DO1Arrive1DeadDwarves.DO1Arrive1DeadDwarves:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_DO1Arrive1DeadDwarves\"\nmsgid \"I knew these ones. That's Gwin and Traga, there's Krug...\"\nmsgstr \"I knew these ones. That's Gwin and Traga, there's Krug...\"\n\n#. Key:\t2858D4314420FB59E8BDC18DB625DC1F\n#. SourceLocation:\t/Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_6.SpeechSequence(1).SpeechSequence.Text\n#: /Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_6.SpeechSequence(1).SpeechSequence.Text\nmsgctxt \"Dialogue_DO1Gate\"\nmsgid \"I think you may mistranslated a word or two...\"\nmsgstr \"I think you may mistranslated a word or two...\"\n\n#. Key:\t2C08483A26080F0A003A02ADBE7A7D64\n#. SourceLocation:\t/Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_7.SpeechSequence(2).SpeechSequence.Text\n#: /Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_7.SpeechSequence(2).SpeechSequence.Text\nmsgctxt \"Dialogue_DO1Gate\"\nmsgid \"Dwarven letters are so similar...\"\nmsgstr \"Dwarven letters are so similar...\"\n\n#. Key:\t2C09D69026080F0A003A02ADBE7A7D4E\n#. SourceLocation:\t/Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_8.SpeechSequence(2).SpeechSequence.Text\n#: /Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_8.SpeechSequence(2).SpeechSequence.Text\nmsgctxt \"Dialogue_DO1Gate\"\nmsgid \"Dwarven language is stupid, these signs could mean anything!\"\nmsgstr \"Dwarven language is stupid, these signs could mean anything!\"\n\n#. Key:\t3D6EF5724190CE0AE579D69677BB8EAE\n#. SourceLocation:\t/Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_DO1Gate\"\nmsgid \"Associate!\"\nmsgstr \"Associate!\"\n\n#. Key:\t4758A32043FC23B4DC3D82B35EFB0D24\n#. SourceLocation:\t/Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_DO1Gate\"\nmsgid \"The Doors of Dwar — Lord of Dwartown. Speak, associate, and enter.\"\nmsgstr \"The Doors of Dwar — Lord of Dwartown. Speak, associate, and enter.\"\n\n#. Key:\t475CE3E94BA77F7596A7D8931D4D16C7\n#. SourceLocation:\t/Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_7.SpeechSequence(1).SpeechSequence.Text\n#: /Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_7.SpeechSequence(1).SpeechSequence.Text\nmsgctxt \"Dialogue_DO1Gate\"\nmsgid \"Are you sure that is what you just read?\"\nmsgstr \"Are you sure that is what you just read?\"\n\n#. Key:\t530C8841437C531647717B8B0BC07210\n#. SourceLocation:\t/Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_8.SpeechSequence(1).SpeechSequence.Text\n#: /Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_8.SpeechSequence(1).SpeechSequence.Text\nmsgctxt \"Dialogue_DO1Gate\"\nmsgid \"Nice try...\"\nmsgstr \"Nice try...\"\n\n#. Key:\t543858DE49FD03BF4F94C3BA47912E5E\n#. SourceLocation:\t/Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_9.SpeechSequence(1).SpeechSequence.Text\n#: /Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_9.SpeechSequence(1).SpeechSequence.Text\nmsgctxt \"Dialogue_DO1Gate\"\nmsgid \"I have to practice my Dwarven a bit more...!\"\nmsgstr \"I have to practice my Dwarven a bit more...!\"\n\n#. Key:\t5923FB9C4DC255ABAA6059B64B806802\n#. SourceLocation:\t/Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_6.SpeechSequence(3).SpeechSequence.Text\n#: /Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_6.SpeechSequence(3).SpeechSequence.Text\nmsgctxt \"Dialogue_DO1Gate\"\nmsgid \"I am going to open this door somehow.\"\nmsgstr \"I am going to open this door somehow.\"\n\n#. Key:\t7CF38D834DB6A7265EDE19AD158BFEBF\n#. SourceLocation:\t/Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_7.SpeechSequence(0).SpeechSequence.Text\n#: /Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_7.SpeechSequence(0).SpeechSequence.Text\nmsgctxt \"Dialogue_DO1Gate\"\nmsgid \"I want a Schnauser with my Wienerschnitzel\"\nmsgstr \"I want a Schnauser with my Wienerschnitzel\"\n\n#. Key:\t86311C104780BDB8A170538987EF7226\n#. SourceLocation:\t/Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_8.SpeechSequence(0).SpeechSequence.Text\n#: /Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_8.SpeechSequence(0).SpeechSequence.Text\nmsgctxt \"Dialogue_DO1Gate\"\nmsgid \"And on the day the Ball is set free, the gate opens and happiness finds everyone...\"\nmsgstr \"And on the day the Ball is set free, the gate opens and happiness finds everyone...\"\n\n#. Key:\tCD68B2244B57CA37D2940499F440149B\n#. SourceLocation:\t/Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_DO1Gate\"\nmsgid \"Associwhat?\"\nmsgstr \"Associwhat?\"\n\n#. Key:\tCE8E75E6422C068794CC91BDBA2C024A\n#. SourceLocation:\t/Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_6.SpeechSequence(2).SpeechSequence.Text\n#: /Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_6.SpeechSequence(2).SpeechSequence.Text\nmsgctxt \"Dialogue_DO1Gate\"\nmsgid \"Damn, my Dwarven is just not good enough, I have to practice a bit more...\"\nmsgstr \"Damn, my Dwarven is just not good enough, I have to practice a bit more...\"\n\n#. Key:\tCED9C6ED4B792FA939C759A79E4AB028\n#. SourceLocation:\t/Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_6.SpeechSequence(0).SpeechSequence.Text\n#: /Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_6.SpeechSequence(0).SpeechSequence.Text\nmsgctxt \"Dialogue_DO1Gate\"\nmsgid \"There is sauerkraut in my Lederhosen\"\nmsgstr \"There is sauerkraut in my Lederhosen\"\n\n#. Key:\tEC493B624D127AB87692BC983023FF18\n#. SourceLocation:\t/Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_7.SpeechSequence(3).SpeechSequence.Text\n#: /Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_7.SpeechSequence(3).SpeechSequence.Text\nmsgctxt \"Dialogue_DO1Gate\"\nmsgid \"There must be a way to open this door...\"\nmsgstr \"There must be a way to open this door...\"\n\n#. Key:\t6F5AF3DD4E848650EE74449420A90A25\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/DwarvenCatacombs/DO1Tomb.DO1Tomb:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Wizard/DwarvenCatacombs/DO1Tomb.DO1Tomb:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_DO1Tomb\"\nmsgid \"These are the orders of the Chancellor of Dwartown, unjustly murdered by order of Duality.\"\nmsgstr \"These are the orders of the Chancellor of Dwartown, unjustly murdered by order of Duality.\"\n\n#. Key:\t949EBB7A4FCEA61BB9B3589CFCC53C2B\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/DwarvenCatacombs/DO1Tomb1.DO1Tomb1:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Wizard/DwarvenCatacombs/DO1Tomb1.DO1Tomb1:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_DO1Tomb1\"\nmsgid \"Here lies the testament of the order of Duality, justly murdered by the Chancellor of Dwartown's spirit.\"\nmsgstr \"Here lies the testament of the order of Duality, justly murdered by the Chancellor of Dwartown's spirit.\"\n\n#. Key:\t110A2E27493EBAD78EE6E1B16F56912A\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E3/E3_Start.E3_Start:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E3/E3_Start.E3_Start:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_E3_Start\"\nmsgid \"I survived the Unknown. I know how to use the Device, but...\"\nmsgstr \"I survived the Unknown. I know how to use the Device, but...\"\n\n#. Key:\t2CB853A540A2B5BFD268DEAA124CEAD0\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E3/E3_Start.E3_Start:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Ending/E3/E3_Start.E3_Start:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_E3_Start\"\nmsgid \"I need to choose one last time. Once and for all.\"\nmsgstr \"I need to choose one last time. Once and for all.\"\n\n#. Key:\t416D47B6408622D8D01F61961C80ADD2\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E3/E3_Start.E3_Start:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E3/E3_Start.E3_Start:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_E3_Start\"\nmsgid \"I have already lost almost everything.\"\nmsgstr \"I have already lost almost everything.\"\n\n#. Key:\t75F863B843B253E3586DE991CDE546EA\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E3/E3_Start.E3_Start:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Ending/E3/E3_Start.E3_Start:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_E3_Start\"\nmsgid \"And here I am again. Is this how it will end?\"\nmsgstr \"And here I am again. Is this how it will end?\"\n\n#. Key:\t77BC194943A148967299F68B3522C696\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E3/E3_Start.E3_Start:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Ending/E3/E3_Start.E3_Start:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_E3_Start\"\nmsgid \"Do I really have to lose everyone I met in the Ruined Realm?\"\nmsgstr \"Do I really have to lose everyone I met in the Ruined Realm?\"\n\n#. Key:\tA50B792A4D68EC45BB9C3CBBF8836021\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E3/E3_Start.E3_Start:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Ending/E3/E3_Start.E3_Start:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_E3_Start\"\nmsgid \"Or would I only save them so that we can die together?\"\nmsgstr \"Or would I only save them so that we can die together?\"\n\n#. Key:\tE43A08E14831EBDC50AFC0B4A3178817\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E3/E3_Start.E3_Start:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Ending/E3/E3_Start.E3_Start:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_E3_Start\"\nmsgid \"I can hear the people outside the tower. I don’t have much time.\"\nmsgstr \"I can hear the people outside the tower. I don’t have much time.\"\n\n#. Key:\t042B7F534C07B3EC75BA9BA8F0BA7926\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_5.Children(0).Children.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_5.Children(0).Children.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"Worthy?\"\nmsgstr \"Worthy?\"\n\n#. Key:\t05E334DE42BAA89837B78B8F0F1CBD93\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"Get some rest and try again later.\"\nmsgstr \"Get some rest and try again later.\"\n\n#. Key:\t0BD769F745B35A106C7C0A83F6F9F246\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"All right so you just teleported me to this... what is this place?\"\nmsgstr \"All right so you just teleported me to this... what is this place?\"\n\n#. Key:\t0C9ECC3745963AB1D1FB6487E97513F9\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_24.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_24.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"So right now this is the most proper place to test your Worthiness.\"\nmsgstr \"So right now this is the most proper place to test your Worthiness.\"\n\n#. Key:\t1401CBDA425076C6AE74C9BF4558D8DD\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"You are not Worthy!\"\nmsgstr \"You are not Worthy!\"\n\n#. Key:\t21C3C1394F39821BC10FFFBE157AC5CF\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"Giving up is not an option.\"\nmsgstr \"Giving up is not an option.\"\n\n#. Key:\t2E7222EA4858A0ADE9CE3C84CA27B993\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_5.Children(3).Children.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_5.Children(3).Children.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"Skip\"\nmsgstr \"Skip\"\n\n#. Key:\t31BEA1764BA337B32B8038B31BE69C29\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"Farewell! I need to go now.\"\nmsgstr \"Farewell! I need to go now.\"\n\n#. Key:\t36B9EA924E623AFE9BF0B98402235EA4\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"Focus on the trial!\"\nmsgstr \"Focus on the trial!\"\n\n#. Key:\t4A4A86684E5C5742A70FE383461AD89C\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"Venture further down into the Sewer! You will find the answer.\"\nmsgstr \"Venture further down into the Sewer! You will find the answer.\"\n\n#. Key:\t54CA97394FDC12D0370C54995094819E\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"This trial will test your limits!\"\nmsgstr \"This trial will test your limits!\"\n\n#. Key:\t5D820AA647AE2540DE6C2D8D6F6BF88A\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_5.Children(4).Children.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_5.Children(4).Children.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"Give seat\"\nmsgstr \"Give seat\"\n\n#. Key:\t5F6629ED4E0857BBBA46ED9C51306215\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_5.Children(2).Children.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_5.Children(2).Children.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"Restore\"\nmsgstr \"Restore\"\n\n#. Key:\t618B587743F2F432D9D487AE0E909166\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"What?\"\nmsgstr \"What?\"\n\n#. Key:\t61D61006436DD6659A8846932697971A\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"Yes, you are!\"\nmsgstr \"Yes, you are!\"\n\n#. Key:\t6225912A49C32068D10ADB9C31A6BA3E\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"Of course!\"\nmsgstr \"Of course!\"\n\n#. Key:\t7DD5FF4D47DF6A461D44DDBA056A4100\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"I shall yield you to the right path!\"\nmsgstr \"I shall yield you to the right path!\"\n\n#. Key:\t8C3F3A364544B13A2C6687A99E6A792B\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"I'm fed up with your trial! Just teleport me back.\"\nmsgstr \"I'm fed up with your trial! Just teleport me back.\"\n\n#. Key:\t903D03CE41FD835E75059587288D9A1B\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_23.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_23.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"There used to be an Arena here to test the Adventurers of the Realm, but it has been flooded with water for a hundred years.\"\nmsgstr \"There used to be an Arena here to test the Adventurers of the Realm, but it has been flooded with water for a hundred years.\"\n\n#. Key:\t96C9A8DA496C0A8476E35AB942BE5EED\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"Am I Worthy?\"\nmsgstr \"Am I Worthy?\"\n\n#. Key:\t9826B62E48A67772A1850CADF1A83729\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_5.Children(1).Children.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_5.Children(1).Children.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"Where are we?\"\nmsgstr \"Where are we?\"\n\n#. Key:\t9A94E4FC46E3896BE05136A2A9EA4AF5\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_27.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_27.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"We don't have time for this now.\"\nmsgstr \"We don't have time for this now.\"\n\n#. Key:\t9B9B02AF404F9B8B9D8722A9006FC907\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"These are the remnants of the Ancient Sewer.\"\nmsgstr \"These are the remnants of the Ancient Sewer.\"\n\n#. Key:\tAAB9F101475D1407B58BECB2DA5E508D\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"So how am I supposed to complete your Trial?\"\nmsgstr \"So how am I supposed to complete your Trial?\"\n\n#. Key:\tAD3BADD6499C01410511E68C86F337C8\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"Your Worthiness has to be proven.\"\nmsgstr \"Your Worthiness has to be proven.\"\n\n#. Key:\tC0BA510B4875AD24C53663B01964B309\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"Go now, the Trial awaits you!\"\nmsgstr \"Go now, the Trial awaits you!\"\n\n#. Key:\tC252181740C4E256EDEB29B6B552BDD2\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"I'm tired, I will need some time to recover.\"\nmsgstr \"I'm tired, I will need some time to recover.\"\n\n#. Key:\tCCD8D1DD4859B067482612A3A9F32C06\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_5.Children(5).Children.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_5.Children(5).Children.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"Leave\"\nmsgstr \"Leave\"\n\n#. Key:\tCE0C3EBD41F17E82F8CF0E8D5E5E9F17\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"The Worthiness is strong in this one...\"\nmsgstr \"The Worthiness is strong in this one...\"\n\n#. Key:\tD229B47146585D051BEFF493C53ED01B\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_26.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_26.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"Stop!\"\nmsgstr \"Stop!\"\n\n#. Key:\tF043B1BF47F617255071EC9DB44CB78A\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"You have proven yourself Worthy!\"\nmsgstr \"You have proven yourself Worthy!\"\n\n#. Key:\tFBBCA0E043F139F203D62DAD1599143E\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"Your Worthiness has been proven again!\"\nmsgstr \"Your Worthiness has been proven again!\"\n\n#. Key:\tFE4F99AC4F23760ADD203083CA1497E3\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_25.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_25.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"I have found a...\"\nmsgstr \"I have found a...\"\n\n#. Key:\t00AD8B3D44461E4DBF800F92DDF0C6F5\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_Gatekeeper_AfterBattle\"\nmsgid \"What?! I understand that for a new gate to open one would have to prove something, but... in this case... I accept that...\"\nmsgstr \"What?! I understand that for a new gate to open one would have to prove something, but... in this case... I accept that...\"\n\n#. Key:\t0EC6953C4F07CFF6B7A13A9BCF224550\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_Gatekeeper_AfterBattle\"\nmsgid \"Enough!\"\nmsgstr \"Enough!\"\n\n#. Key:\t237714F14DC3F9D33F10E6B7761E47C4\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_Gatekeeper_AfterBattle\"\nmsgid \"What a coincidence! I also happen to be heading in that direction.\"\nmsgstr \"What a coincidence! I also happen to be heading in that direction.\"\n\n#. Key:\t28054AA74F9CEA976E653ABF5A5F5695\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_Gatekeeper_AfterBattle\"\nmsgid \"You can pass.\"\nmsgstr \"You can pass.\"\n\n#. Key:\t3D5BAB214968DBB31BE03EBE32B2DE6C\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_Gatekeeper_AfterBattle\"\nmsgid \"Farewell my Ball Lord! May the Great Gate open for you when the time comes!\"\nmsgstr \"Farewell my Ball Lord! May the Great Gate open for you when the time comes!\"\n\n#. Key:\t4D497F814F476FFA7F2A66A937EAFF3E\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_Gatekeeper_AfterBattle\"\nmsgid \"Noooooo...\"\nmsgstr \"Noooooo...\"\n\n#. Key:\t4FEA82084C2E2E09FE6699B2FB353E04\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_Gatekeeper_AfterBattle\"\nmsgid \"Could you just let me pass? Please?\"\nmsgstr \"Could you just let me pass? Please?\"\n\n#. Key:\t50005F6248946893250282B0B7D134F2\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_Gatekeeper_AfterBattle\"\nmsgid \"You have proved your Worthiness.\"\nmsgstr \"You have proved your Worthiness.\"\n\n#. Key:\t601E1BAC4E9C7A93B7A97AA787C14027\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_Gatekeeper_AfterBattle\"\nmsgid \"Farewell, Keeper!\"\nmsgstr \"Farewell, Keeper!\"\n\n#. Key:\t758788864E716DB2EC9F57B3042DC129\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_Gatekeeper_AfterBattle\"\nmsgid \"Ask him to take you to Crossroad Cave.\"\nmsgstr \"Ask him to take you to Crossroad Cave.\"\n\n#. Key:\t8170CF2C42A1894899BA98B33AB39A3F\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_Gatekeeper_AfterBattle\"\nmsgid \"Wait! What?\"\nmsgstr \"Wait! What?\"\n\n#. Key:\t86B7E3D34F2206BB44B0F88001F9E8BA\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_Gatekeeper_AfterBattle\"\nmsgid \"Then if you accept, let the trial begin!\"\nmsgstr \"Then if you accept, let the trial begin!\"\n\n#. Key:\tCC7215014B87E0910413F1AEECE0492F\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_Gatekeeper_AfterBattle\"\nmsgid \"Where do you want to go, Sir? Command me.\"\nmsgstr \"Where do you want to go, Sir? Command me.\"\n\n#. Key:\tD5FBCE5C4C97766EF3A852A2D96D1D30\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_Gatekeeper_AfterBattle\"\nmsgid \"Crossroad Cave!\"\nmsgstr \"Crossroad Cave!\"\n\n#. Key:\tE0032A09440BDE56BFAF2CBDBCFA2074\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_Gatekeeper_AfterBattle\"\nmsgid \"So be it!\"\nmsgstr \"So be it!\"\n\n#. Key:\tE8148F28483300CCD24473A30C028235\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_Gatekeeper_AfterBattle\"\nmsgid \"Once you have proven Worthy.\"\nmsgstr \"Once you have proven Worthy.\"\n\n#. Key:\t0BE62CA44198CAA4B4AF7D844B79EEC3\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_3.Children(2).Children.Text\n#. Key:\t17D2B5D7409FBE7F215265B5A8CBF8F8\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_21.Children(2).Children.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_21.Children(2).Children.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_3.Children(2).Children.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"Leave\"\nmsgstr \"Leave\"\n\n#. Key:\t2BFD355626080F0A003A025ABE793045\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_21.Children(0).Children.Text\n#. Key:\t2BFEA3D826080F0A003A025ABE79300B\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_3.Children(0).Children.Text\n#. Key:\t2C027C7626080F0A003A025ABE793F5F\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_18.Children(0).Children.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_18.Children(0).Children.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_21.Children(0).Children.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_3.Children(0).Children.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"Accept Challenge\"\nmsgstr \"Accept Challenge\"\n\n#. Key:\t2EDD3BEF4707FD59FE1ACB9A105F7EFC\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_3.Children(1).Children.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_3.Children(1).Children.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"Give seat\"\nmsgstr \"Give seat\"\n\n#. Key:\t4E4229704C95B2C73050E1AF65A29847\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"Did you come back to prove yourself?\"\nmsgstr \"Did you come back to prove yourself?\"\n\n#. Key:\t55B70B0345422648BB579C8D4E42FE86\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_18.Children(1).Children.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_18.Children(1).Children.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"Maybe later\"\nmsgstr \"Maybe later\"\n\n#. Key:\t62E33EC84A508E57233A6A9AF6DCDFBC\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"Only if you prove yourself worthy one more time.\"\nmsgstr \"Only if you prove yourself worthy one more time.\"\n\n#. Key:\t65A8C3BA420B4624960CBAB42930BB5F\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_13.Children(0).Children.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_13.Children(0).Children.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"Not fair\"\nmsgstr \"Not fair\"\n\n#. Key:\t688C407641B488D0FDC7F98D0F6CA826\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"Is that... is this really happening?\"\nmsgstr \"Is that... is this really happening?\"\n\n#. Key:\t77A739594D7ADA997DD300A7EE270D8F\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"I have found a seat that fits your size.\"\nmsgstr \"I have found a seat that fits your size.\"\n\n#. Key:\t8C9BCD2044EE9C5F4826D0B5C5CE22D4\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"Now... are you ready to prove yourself?\"\nmsgstr \"Now... are you ready to prove yourself?\"\n\n#. Key:\t8E33C12A42E9EAEDC20CD3B97F3AF9B2\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"Yes, I can.\"\nmsgstr \"Yes, I can.\"\n\n#. Key:\t91849BD64325E5B9D8A366921D4D1AA9\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"The best challenges were set aside just for you!\"\nmsgstr \"The best challenges were set aside just for you!\"\n\n#. Key:\t97D5940549A753A94A9F5AB46CCE14AF\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"I myself shall test your worthiness.\"\nmsgstr \"I myself shall test your worthiness.\"\n\n#. Key:\t9A158FA74FF1D9F99F5477856927AC90\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"I will make no exceptions! Your generous act gave me back my spirit. From now on I pledge to perform my task even better.\"\nmsgstr \"I will make no exceptions! Your generous act gave me back my spirit. From now on I pledge to perform my task even better.\"\n\n#. Key:\tA3863AD64404451005ECE392B123FFAE\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"Errr... maybe a bit later.\"\nmsgstr \"Errr... maybe a bit later.\"\n\n#. Key:\tAB2F0FFA45E0AF42B6035FA3D1F2D8DB\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"I am truly impressed. I will never forget about your kindness.\"\nmsgstr \"I am truly impressed. I will never forget about your kindness.\"\n\n#. Key:\tB284259646C0236570CF489DDCD88A29\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"Are you ready to prove yourself?\"\nmsgstr \"Are you ready to prove yourself?\"\n\n#. Key:\tB57F0D0442C167DADE576A9CBD2B3E96\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"Thank you! You can have this RuneStone as a compensation.\"\nmsgstr \"Thank you! You can have this RuneStone as a compensation.\"\n\n#. Key:\tB5F8117A4514A4207059EF8CD1C59420\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"All right, let's do it!\"\nmsgstr \"All right, let's do it!\"\n\n#. Key:\tC7DFED0F43E17F90C02E3D94D6F24200\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"What? Can't you just open that gate?\"\nmsgstr \"What? Can't you just open that gate?\"\n\n#. Key:\tCC1CBB8E4F710B337B3BCC8CB01DB8CE\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"Well that's very... kind of you, I guess.\"\nmsgstr \"Well that's very... kind of you, I guess.\"\n\n#. Key:\tDE0225744DA0777DC12392ABB187D653\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"Keeper! Can you open a Portal?\"\nmsgstr \"Keeper! Can you open a Portal?\"\n\n#. Key:\tDF53D02F4A6CD307A559E5BADBEF22FA\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_13.Children(1).Children.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_13.Children(1).Children.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"You are welcome\"\nmsgstr \"You are welcome\"\n\n#. Key:\tF0A6481A46B5FC65944D35ABFE94FA7E\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_21.Children(1).Children.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_21.Children(1).Children.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"Give Seat\"\nmsgstr \"Give Seat\"\n\n#. Key:\tFF3C850143B6609D7B1B878B8DEB8A13\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"This is your final trial.\"\nmsgstr \"This is your final trial.\"\n\n#. Key:\t018CF7BC4272B09AF7B646B0F9B2EB11\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_55.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_55.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"How did it happen? How was everything destroyed?\"\nmsgstr \"How did it happen? How was everything destroyed?\"\n\n#. Key:\t0BF674C94942E4E32FCB09BD7E7059B0\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_23.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_23.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"Those who stayed died.\"\nmsgstr \"Those who stayed died.\"\n\n#. Key:\t1BFE1DBE471281F60970F8BEBFDD6E40\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"It’s nice of the Mirror that he still remembers me. Could you give this flower to him to express my thankfulness?\"\nmsgstr \"It’s nice of the Mirror that he still remembers me. Could you give this flower to him to express my thankfulness?\"\n\n#. Key:\t2158D7A1470944D529FF138AB883DC10\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"Who lived in this Realm? Where are they now?\"\nmsgstr \"Who lived in this Realm? Where are they now?\"\n\n#. Key:\t2CCCBA97402EEFD5248D929680B0FF01\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_26.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_26.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"What was the Realm like before?\"\nmsgstr \"What was the Realm like before?\"\n\n#. Key:\t32DA4503499D5A01CB1E7DA7B51B4EB5\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_29.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_29.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"Majestic castles and towers up until the sky. The air fresh, the sun shining.\"\nmsgstr \"Majestic castles and towers up until the sky. The air fresh, the sun shining.\"\n\n#. Key:\t35903E9F471EECEC779D879565E189B6\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_12.Children(1).Children.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_12.Children(1).Children.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"Who lived here?\"\nmsgstr \"Who lived here?\"\n\n#. Key:\t3AD2CA8148AA6397B3D8818063269D67\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_14.Children(1).Children.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_14.Children(1).Children.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"No way\"\nmsgstr \"No way\"\n\n#. Key:\t3D4AF37842FD602384F0C79F2949BD07\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_14.Children(0).Children.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_14.Children(0).Children.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"Of course\"\nmsgstr \"Of course\"\n\n#. Key:\t41B0D00048A85B7122834B8F731AA8B4\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_25.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_25.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"Ruin preserves them. They can’t get old and die. Some of them are still visiting these parts of the Realm, but they no longer know what they are looking for.\"\nmsgstr \"Ruin preserves them. They can’t get old and die. Some of them are still visiting these parts of the Realm, but they no longer know what they are looking for.\"\n\n#. Key:\t47D0395F4DD63A6E2F68018719DC2CCD\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"Thank you!\"\nmsgstr \"Thank you!\"\n\n#. Key:\t57614F674FD8F9A5CF8CC0AFA4D57F37\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_12.Children(0).Children.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_12.Children(0).Children.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"Magic Mirror\"\nmsgstr \"Magic Mirror\"\n\n#. Key:\t5B00385B409CA39C5F2AFDA0E75EC4A0\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"I'm not a postman. Find someone else!\"\nmsgstr \"I'm not a postman. Find someone else!\"\n\n#. Key:\t5C83B0604CB1616D07BE209C08AE57B6\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_27.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_27.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"It was a wonderful world, full of life and joy.\"\nmsgstr \"It was a wonderful world, full of life and joy.\"\n\n#. Key:\t66409DBC4D55F6190D6F429F81CE7C0F\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_12.Children(2).Children.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_12.Children(2).Children.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"Realm's past\"\nmsgstr \"Realm's past\"\n\n#. Key:\t6728BD15433EBCF47B42DA8D84F3777C\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"I'll remember you!\"\nmsgstr \"I'll remember you!\"\n\n#. Key:\t764C9E864C4C345638C2A2B4019CE5FA\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"Sure, I will deliver the flower!\"\nmsgstr \"Sure, I will deliver the flower!\"\n\n#. Key:\t7F42828D4976A3366581BE9E067F3982\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_24.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_24.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"Those who escaped changed in body and mind.\"\nmsgstr \"Those who escaped changed in body and mind.\"\n\n#. Key:\t858E8AD741D48CFB58B94ABA5A6FCE9A\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"No problem. It doesn’t matter anyway.\"\nmsgstr \"No problem. It doesn’t matter anyway.\"\n\n#. Key:\t86DBF2164E3B1C4057320E8FC526AE5F\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_12.Children(3).Children.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_12.Children(3).Children.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"Cataclysm\"\nmsgstr \"Cataclysm\"\n\n#. Key:\t8C0E746A4C00A7B4792706A042588AA3\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_58.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_58.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"Until one day many of the imprisoned spirits broke loose from the golem bodies.\"\nmsgstr \"Until one day many of the imprisoned spirits broke loose from the golem bodies.\"\n\n#. Key:\t8DCB54DC429D8E328B791FA18261EBE4\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_30.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_30.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"Until it was all gone.\"\nmsgstr \"Until it was all gone.\"\n\n#. Key:\t933737274ACAC51A980A6985E9B985D2\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"I am here so that the past is not forgotten until the very end. Have some rest and remember!\"\nmsgstr \"I am here so that the past is not forgotten until the very end. Have some rest and remember!\"\n\n#. Key:\t9A6C35C143F4B6845772D4AF6C4C6213\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_56.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_56.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"The Golem Makers went too far. They made thousands and thousands of golems.\"\nmsgstr \"The Golem Makers went too far. They made thousands and thousands of golems.\"\n\n#. Key:\t9E254E4D4CA6D256A7EC8CA8ADC6EF19\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"Would you like to hear some other tales?\"\nmsgstr \"Would you like to hear some other tales?\"\n\n#. Key:\tAC50E6794072B525FD9144AB9B722F74\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_57.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_57.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"They always cared about the new ones and forgot about the obsolete ones.\"\nmsgstr \"They always cared about the new ones and forgot about the obsolete ones.\"\n\n#. Key:\tC03F20E6477984A6691145A40535FBBD\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_60.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_60.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"Is there anything else you want me to remember?\"\nmsgstr \"Is there anything else you want me to remember?\"\n\n#. Key:\tC9E74A374ED9F47999AA56BD16466899\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"The streets were clear and bright, trees and flowers everywhere.\"\nmsgstr \"The streets were clear and bright, trees and flowers everywhere.\"\n\n#. Key:\tCF0209FF4BC57A750F52F2B3CC710A6E\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"I think it likes you.\"\nmsgstr \"I think it likes you.\"\n\n#. Key:\tD11D82FA4AE733D55DCBA692A2A3C0C7\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"Now they are all gone.\"\nmsgstr \"Now they are all gone.\"\n\n#. Key:\tD88C72AE460756D4B619D7B8F924C7BB\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"Oh, there were many: proud, wise, brave, clever and majestic.\"\nmsgstr \"Oh, there were many: proud, wise, brave, clever and majestic.\"\n\n#. Key:\tDEA408E54892798F0112B0A92EE34D3A\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_12.Children(4).Children.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_12.Children(4).Children.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"Leave\"\nmsgstr \"Leave\"\n\n#. Key:\tEA384D06419AAB835765CF8D6ECE6495\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_59.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_59.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"They are what is now called Ruin. The power which is destroying the Realm.\"\nmsgstr \"They are what is now called Ruin. The power which is destroying the Realm.\"\n\n#. Key:\tED8571C94BCCF0F083CAD2A7439C10AA\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"I’ve met with a Magic Mirror who showed a picture of you.\"\nmsgstr \"I’ve met with a Magic Mirror who showed a picture of you.\"\n\n#. Key:\tF5C7F8254D29767753AEA3AB446B9B6E\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"I've got to go now.\"\nmsgstr \"I've got to go now.\"\n\n#. Key:\tF9E140154471CC466095ADBFF652E94D\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"Ask if you need to know more. I'll remember.\"\nmsgstr \"Ask if you need to know more. I'll remember.\"\n\n#. Key:\t04527B3745611117185CC09C4CD9018E\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"That’s more like it!\"\nmsgstr \"That’s more like it!\"\n\n#. Key:\t11C31D4D4DFD60259D68FCB3CD8E641E\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_13.Children(2).Children.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_13.Children(2).Children.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"Retreat\"\nmsgstr \"Retreat\"\n\n#. Key:\t29C3FE594DDD364CEED5EA9304BFAC43\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"How can I prove that I'm worthy?\"\nmsgstr \"How can I prove that I'm worthy?\"\n\n#. Key:\t2BC9EBB6451DB66B7767F1A0B663A06D\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"That’s awful, let’s try it in a different tone.\"\nmsgstr \"That’s awful, let’s try it in a different tone.\"\n\n#. Key:\t2BD75DF026080F0A003A0178BE75C345\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"Behold traveler!\"\nmsgstr \"Behold traveler!\"\n\n#. Key:\t302884BD4A306FB9614C51AF4790FAE4\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_13.Children(0).Children.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_13.Children(0).Children.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"How to prove?\"\nmsgstr \"How to prove?\"\n\n#. Key:\t370AC3D04CB9F6E443CAC2A8E270F289\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"No problem I don't really want to pass that gate anyway.\"\nmsgstr \"No problem I don't really want to pass that gate anyway.\"\n\n#. Key:\t4E231ED94F0794AE6342A8A2C7644D51\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"I am the Gatekeeper. I will only open this door if you prove to be worthy.\"\nmsgstr \"I am the Gatekeeper. I will only open this door if you prove to be worthy.\"\n\n#. Key:\t4F30265A4D22C52371CC8E9E188B2718\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"Open, now!\"\nmsgstr \"Open, now!\"\n\n#. Key:\t56B5D73646C6823598232BB3D2577305\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"Ask him to open the door.\"\nmsgstr \"Ask him to open the door.\"\n\n#. Key:\t7A52E2E14341A8CDBD77A4A30DDA22E3\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_13.Children(1).Children.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_13.Children(1).Children.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"Please let me in\"\nmsgstr \"Please let me in\"\n\n#. Key:\t835098BD4F5D14FAACF1209850607E04\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_15.Children(0).Children.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_15.Children(0).Children.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"Accept Challenge.\"\nmsgstr \"Accept Challenge.\"\n\n#. Key:\t83E15A3C46A1D2D4CE4FDDBE81130106\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"No way! Nobody can skip the Trial!\"\nmsgstr \"No way! Nobody can skip the Trial!\"\n\n#. Key:\t86D9667C43253BBFFA43E4ABED24369B\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"Still not...\"\nmsgstr \"Still not...\"\n\n#. Key:\t94A0124A401BA0CD029255B7D01E087E\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"There is no turning back now. The Trial awaits you!\"\nmsgstr \"There is no turning back now. The Trial awaits you!\"\n\n#. Key:\t964E5DC7491720F8C3EA53936CBC1DEA\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"The Trial will test you!\"\nmsgstr \"The Trial will test you!\"\n\n#. Key:\tA38AC02A4C258F538AC26686207D505F\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"...\"\nmsgstr \"...\"\n\n#. Key:\tABA8061E4F631608D712A0BDBC6D90D1\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"Ah, you can't speak! Hmm... Try now!\"\nmsgstr \"Ah, you can't speak! Hmm... Try now!\"\n\n#. Key:\tDA4C66AB4F7798DAD95EC5B83D422A03\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"Could you just let me pass this time?\"\nmsgstr \"Could you just let me pass this time?\"\n\n#. Key:\tF09A0C3F4BEA6AFBC9EE52AEB6A740AB\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"Open that gate, Keeper!\"\nmsgstr \"Open that gate, Keeper!\"\n\n#. Key:\tF32B1FEC4BB33670D336D28832F04312\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"I can only open this door for those who prove worthy.\"\nmsgstr \"I can only open this door for those who prove worthy.\"\n\n#. Key:\tFB74F24C4B8C2E6B4368B19D77F71606\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"Please, open the...\"\nmsgstr \"Please, open the...\"\n\n#. Key:\t0BAD4DEA4009823275249FB31070D002\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_7.Children(1).Children.Text\n#. Key:\t2F2169444BBDC9843E1B7DAEDE7F5104\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_4.Children(1).Children.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_4.Children(1).Children.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_7.Children(1).Children.Text\nmsgctxt \"Dialogue_GGGateKeeper2\"\nmsgid \"Leave\"\nmsgstr \"Leave\"\n\n#. Key:\t36FDC8384686644248F76B9EF8A22038\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_GGGateKeeper2\"\nmsgid \"Here we go again...\"\nmsgstr \"Here we go again...\"\n\n#. Key:\t3D7557464E3E19A1CF3447B555D4977D\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_GGGateKeeper2\"\nmsgid \"Well, of course.\"\nmsgstr \"Well, of course.\"\n\n#. Key:\t5463C10D4C56C2CD40338A9E5C33D995\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_GGGateKeeper2\"\nmsgid \"You know the rules.\"\nmsgstr \"You know the rules.\"\n\n#. Key:\t6E1915BC4A79E949C10BDCAADDA1E481\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_7.Children(0).Children.Text\n#. Key:\tACC5EBF441036AE06D207281CBE054D9\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_4.Children(0).Children.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_4.Children(0).Children.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_7.Children(0).Children.Text\nmsgctxt \"Dialogue_GGGateKeeper2\"\nmsgid \"Accept Challenge\"\nmsgstr \"Accept Challenge\"\n\n#. Key:\tA5CD165646DA7D531D23F7AAE5B0D701\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_GGGateKeeper2\"\nmsgid \"I mean: You shall not pass unless you prove yourself worthy!\"\nmsgstr \"I mean: You shall not pass unless you prove yourself worthy!\"\n\n#. Key:\tBABC111D4B5743B296E6AD84659E1910\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_GGGateKeeper2\"\nmsgid \"You shall not pass!!\"\nmsgstr \"You shall not pass!!\"\n\n#. Key:\tCAF6CA2C4159145B5FE684995956F155\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_GGGateKeeper2\"\nmsgid \"What?? I thought I will need to prove myself worthy.\"\nmsgstr \"What?? I thought I will need to prove myself worthy.\"\n\n#. Key:\t31B0B4214FE4324029BAB2A75CF7D1EA\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/GGSurviverNote.GGSurviverNote:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/GGSurviverNote.GGSurviverNote:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_GGSurviverNote\"\nmsgid \"'I made this statue to give me shelter from the Cataclysm. Only magic can keep it away.'\"\nmsgstr \"'I made this statue to give me shelter from the Cataclysm. Only magic can keep it away.'\"\n\n#. Key:\t852F18354CA9C8D46192CBBD14A325F7\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/GGSurviverNote.GGSurviverNote:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/GGSurviverNote.GGSurviverNote:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_GGSurviverNote\"\nmsgid \"'Cerulean is still safe. I managed to steal the Gem to open the Gate but I can’t use it.'\"\nmsgstr \"'Cerulean is still safe. I managed to steal the Gem to open the Gate but I can’t use it.'\"\n\n#. Key:\tDF72F90C478E18CFE9211C85CEF9ECBF\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/GGSurviverNote.GGSurviverNote:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/GGSurviverNote.GGSurviverNote:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_GGSurviverNote\"\nmsgid \"'I am doomed.'\"\nmsgstr \"'I am doomed.'\"\n\n#. Key:\t04737EC246700D406DAB46BE8091D09C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_1.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_1.Children(0).Children.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Sure\"\nmsgstr \"Sure\"\n\n#. Key:\t09BB4D9F428A5390E5F2ABA019B3ACDC\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_34.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_34.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Help you?! This is a courthouse not some charity club!\"\nmsgstr \"Help you?! This is a courthouse not some charity club!\"\n\n#. Key:\t0C7D87814BD76EAFE2DCB19B973F0D82\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_52.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_52.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"You know I heavily rely on my abacus. But being a ghost and all I can’t really use it.\"\nmsgstr \"You know I heavily rely on my abacus. But being a ghost and all I can’t really use it.\"\n\n#. Key:\t0E3535844D16D540C576AC9889D237C8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"I’m looking for three artefacts. Do you know anything about them?\"\nmsgstr \"I’m looking for three artefacts. Do you know anything about them?\"\n\n#. Key:\t0EB00CBB41338DE6294D6EAC2DE999B4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Actually it’s kinda awesome!\"\nmsgstr \"Actually it’s kinda awesome!\"\n\n#. Key:\t158F86F04D0040AA3D2814A674252E45\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Returning again and again is not a crime but maybe we should reconsider the Law regarding this statement.\"\nmsgstr \"Returning again and again is not a crime but maybe we should reconsider the Law regarding this statement.\"\n\n#. Key:\t15D395F84D3DBC3CCBC74988369A74DA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_27.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_27.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"The Law says many things about being dad but nothing about being dead...\"\nmsgstr \"The Law says many things about being dad but nothing about being dead...\"\n\n#. Key:\t2487D3CC4FCE404BEC866287E2057B3F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"I can’t rest until the Case is solved.\"\nmsgstr \"I can’t rest until the Case is solved.\"\n\n#. Key:\t2D976CD148FB41389A53ED8E499822B4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_54.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_54.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Could you get me a ghost abacus?\"\nmsgstr \"Could you get me a ghost abacus?\"\n\n#. Key:\t2F25CC2042D67E3AFB6F3FB5E1DF624D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_38.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_38.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Sure whatever...\"\nmsgstr \"Sure whatever...\"\n\n#. Key:\t344253F4469C163E87496A97C193F0A8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_31.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_31.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"If you found her please escort her to the Room of the Law so that her vicious acts can be judged.\"\nmsgstr \"If you found her please escort her to the Room of the Law so that her vicious acts can be judged.\"\n\n#. Key:\t34D243A343CDFEA68F2FAB88A4190464\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_5.Children(2).Children.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_5.Children(2).Children.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"You are dead\"\nmsgstr \"You are dead\"\n\n#. Key:\t367BD6CD40B7364D09A19A9F5F833937\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Could you help me? I'm forced into this Realm by a Wizard.\"\nmsgstr \"Could you help me? I'm forced into this Realm by a Wizard.\"\n\n#. Key:\t3BD4BD5742532C2DB9536F9540EA3D75\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_32.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_32.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Ah, even the World will be over sooner than all our cases.\"\nmsgstr \"Ah, even the World will be over sooner than all our cases.\"\n\n#. Key:\t45882C3C4470919D71E321BF5E1183B9\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_56.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_56.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"I've made you a Ghost Abacus.\"\nmsgstr \"I've made you a Ghost Abacus.\"\n\n#. Key:\t482C838F4E946005A3E4CAAB80DFE37F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_35.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_35.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"And being a Wizard is strictly forbidden! If I manage to prove you have some connection with that criminal Wizard I will judge you as well!\"\nmsgstr \"And being a Wizard is strictly forbidden! If I manage to prove you have some connection with that criminal Wizard I will judge you as well!\"\n\n#. Key:\t489CE6C840D8C3430F07FCBC8BAF3F6B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_23.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_23.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"The Law never writes it would be forbidden to be a walking ball. Therefore it is not a problem.\"\nmsgstr \"The Law never writes it would be forbidden to be a walking ball. Therefore it is not a problem.\"\n\n#. Key:\t512723AF4B51C5A843BEACBEA5427877\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Staring like that is strictly forbidden!\"\nmsgstr \"Staring like that is strictly forbidden!\"\n\n#. Key:\t5215675A4B0974C8993858B9F5D6A404\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"The Case of the Gnome traveller. A really complicated one.\"\nmsgstr \"The Case of the Gnome traveller. A really complicated one.\"\n\n#. Key:\t6922D9F143A5295C7C2D22A71EA4125B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_29.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_29.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Makes sense...\"\nmsgstr \"Makes sense...\"\n\n#. Key:\t74955E464A85ED006FF47894FD09BD28\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_4.Text\n#. Key:\tE7F9297B4FF3956A965042AA9D870A07\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_37.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_37.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"The Law says that.\"\nmsgstr \"The Law says that.\"\n\n#. Key:\t74BCB9E04AB452BA2A11088F25DD2FED\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"I guess they forgot to tell you but work time is long over...\"\nmsgstr \"I guess they forgot to tell you but work time is long over...\"\n\n#. Key:\t74F34750433EF722E89F8F85A871CE1B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_59.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_59.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Take this as a reward!\"\nmsgstr \"Take this as a reward!\"\n\n#. Key:\t766B27FA455983F70AE1F4BA56F4C1B3\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_57.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_57.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"How wondrous! I’m sure this will reduce my research time with years!\"\nmsgstr \"How wondrous! I’m sure this will reduce my research time with years!\"\n\n#. Key:\t784D8662443EA775B9554EAEB4C6CB8F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"You are guilty for bouncing too loudly! Just like my uncle...\"\nmsgstr \"You are guilty for bouncing too loudly! Just like my uncle...\"\n\n#. Key:\t791A095948CFB22CCAF59EAFC60D74EA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_0.SpeechSequence(1).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_0.SpeechSequence(1).SpeechSequence.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"We had to reread all the rules to find out if there is anything about this.\"\nmsgstr \"We had to reread all the rules to find out if there is anything about this.\"\n\n#. Key:\t7CBAE1084FC39423BBD706A9F939BB14\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"So what is this case you are working on?\"\nmsgstr \"So what is this case you are working on?\"\n\n#. Key:\t7DBA70D14A4EDDE22DABBBB75800865A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_5.Children(3).Children.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_5.Children(3).Children.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Help\"\nmsgstr \"Help\"\n\n#. Key:\t7DDD963C45C30134FA79CEAA1834C270\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_1.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_1.Children(1).Children.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"No way\"\nmsgstr \"No way\"\n\n#. Key:\t7E1EAB78482CF915AF8A96BA8E0A47F1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Just give me some more time and I will prove that you are guilty.\"\nmsgstr \"Just give me some more time and I will prove that you are guilty.\"\n\n#. Key:\t7E2FD8D443438BEFF933D1BA0F691A41\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_1.SpeechSequence(2).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_1.SpeechSequence(2).SpeechSequence.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Such a tragic death! Now I need to start everything from the beginning!\"\nmsgstr \"Such a tragic death! Now I need to start everything from the beginning!\"\n\n#. Key:\t7EA289C94C6CF1E43AE0B291AD0A1133\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_30.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_30.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Yes, she is a criminal for inhabiting the body of a cat. That is strictly forbidden!\"\nmsgstr \"Yes, she is a criminal for inhabiting the body of a cat. That is strictly forbidden!\"\n\n#. Key:\t80596D1B4384F83D73655AB76B2FA2D0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Incorrect. It is not.\"\nmsgstr \"Incorrect. It is not.\"\n\n#. Key:\t81C42F5340469CBB4AD780B01E7F02F8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_5.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_5.Children(1).Children.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Case\"\nmsgstr \"Case\"\n\n#. Key:\t830C84A74369239E2839638F8918E086\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_5.Children(4).Children.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_5.Children(4).Children.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Artefacts\"\nmsgstr \"Artefacts\"\n\n#. Key:\t9090EFE44CB8D7F54F996B970D9A97D2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Don’t disturb me!\"\nmsgstr \"Don’t disturb me!\"\n\n#. Key:\t90F79FAC440FB22F0A6BFCABE0963454\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_33.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_33.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"That’s very likely.\"\nmsgstr \"That’s very likely.\"\n\n#. Key:\t9600587D4E3C5B6F2C120BBFB9D40D6A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"What?\"\nmsgstr \"What?\"\n\n#. Key:\t96945AA143EF1F1B7CE4C0B8EEE4096F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_51.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_51.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"All right I was just asking. It’s not forbidden. At least in this case.\"\nmsgstr \"All right I was just asking. It’s not forbidden. At least in this case.\"\n\n#. Key:\t970DBE99476C7799B4B803B2EECE7E95\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"You are dead. Isn’t that a problem?\"\nmsgstr \"You are dead. Isn’t that a problem?\"\n\n#. Key:\t9B06B22F44D389959A3C99924145EAE7\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Do you know a girl called Lillian?\"\nmsgstr \"Do you know a girl called Lillian?\"\n\n#. Key:\t9C1B37574F81FDF4D3F03890504E3490\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Well, to be honest it is.\"\nmsgstr \"Well, to be honest it is.\"\n\n#. Key:\t9EE15BCA450900DEFFB839856BA78E09\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_55.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_55.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"I’ll see what I can do...\"\nmsgstr \"I’ll see what I can do...\"\n\n#. Key:\t9F3FBDE041EA6FDB7B30ECA1547E49A0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_0.SpeechSequence(3).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_0.SpeechSequence(3).SpeechSequence.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"We almost finished the process when the Gnome Traveller died of waiting.\"\nmsgstr \"We almost finished the process when the Gnome Traveller died of waiting.\"\n\n#. Key:\tA22CEEE34864BC25EECFF2BAED83789F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_18.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_18.Children(0).Children.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"It is\"\nmsgstr \"It is\"\n\n#. Key:\tA69BCEA14AD8A07AC8CC35871548973A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_5.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_5.Children(0).Children.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Give Abacus\"\nmsgstr \"Give Abacus\"\n\n#. Key:\tA7B9690142A3832182C004A99797AB21\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_26.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_26.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"And how about being dead?\"\nmsgstr \"And how about being dead?\"\n\n#. Key:\tA7EDDDCF423FF086BC0D0A891D232C87\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_0.SpeechSequence(0).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_0.SpeechSequence(0).SpeechSequence.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"He asked for permission to use the Railway. Which is really unusual. Before him only dwarves used the Railways.\"\nmsgstr \"He asked for permission to use the Railway. Which is really unusual. Before him only dwarves used the Railways.\"\n\n#. Key:\tA9FCBAD04E16A880C3E52AAA35864E35\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Respect the Law!\"\nmsgstr \"Respect the Law!\"\n\n#. Key:\tAA3210BC4B1C0875817CCDB5F4922AFA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_1.SpeechSequence(0).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_1.SpeechSequence(0).SpeechSequence.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"It’s not that simple. In his testament he asked us to bring his corpse home, on the railway.\"\nmsgstr \"It’s not that simple. In his testament he asked us to bring his corpse home, on the railway.\"\n\n#. Key:\tAA9613C041229946AD0033806D77D398\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_49.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_49.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"What can I do for you?\"\nmsgstr \"What can I do for you?\"\n\n#. Key:\tB2D504404A8475C7EFB445AFDA8597A9\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_5.Children(6).Children.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_5.Children(6).Children.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Leave\"\nmsgstr \"Leave\"\n\n#. Key:\tB3A305B84320145E4C0437B7ED50C5B9\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_25.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_25.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"The Law doesn’t forbid walking for balls. I guess you are right then.\"\nmsgstr \"The Law doesn’t forbid walking for balls. I guess you are right then.\"\n\n#. Key:\tB3E56D56494153D0C17355A59EC3F0E6\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Rest... err... work in peace!\"\nmsgstr \"Rest... err... work in peace!\"\n\n#. Key:\tB69AD6FC4D8373491561CFBCF26C2397\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_1.SpeechSequence(3).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_1.SpeechSequence(3).SpeechSequence.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Could you help me?\"\nmsgstr \"Could you help me?\"\n\n#. Key:\tBCFFF4F345E59362764C9AA6582C683C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_0.SpeechSequence(2).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_0.SpeechSequence(2).SpeechSequence.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"When we found out there are none, so we needed to create new rules. But for that we had to reread all the existing rules again.\"\nmsgstr \"When we found out there are none, so we needed to create new rules. But for that we had to reread all the existing rules again.\"\n\n#. Key:\tC5FDD0A14882D8F74A97B1BD53AFD4FE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_36.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_36.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"I don’t. But keep in mind if they were stolen and you find them you have to give them to the Dwarven King.\"\nmsgstr \"I don’t. But keep in mind if they were stolen and you find them you have to give them to the Dwarven King.\"\n\n#. Key:\tC81E287C4B4EF5B5E77E25A480FC2AEE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_18.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_18.Children(1).Children.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Not at all\"\nmsgstr \"Not at all\"\n\n#. Key:\tCCF4D5D04B8D4C57AAA75ABC5F9A1384\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_50.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_50.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"No, no, no! I have other things to do.\"\nmsgstr \"No, no, no! I have other things to do.\"\n\n#. Key:\tCD5EF4DE4D29CC774EB5A69A8A65CD95\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_5.Children(5).Children.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_5.Children(5).Children.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Lillian\"\nmsgstr \"Lillian\"\n\n#. Key:\tCFC9A6294B4D0653CA9B3384CBD2BC29\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_58.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_58.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Thank you! Thank you!\"\nmsgstr \"Thank you! Thank you!\"\n\n#. Key:\tCFEFA4DD4AFEF91C834684A49DFB5890\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_39.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_39.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"What crime did the Gnome commit?\"\nmsgstr \"What crime did the Gnome commit?\"\n\n#. Key:\tD83C186746373C67E8877594AA3523B8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_53.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_53.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"When I touch it my fingers slip past the abacus, I can’t move it.\"\nmsgstr \"When I touch it my fingers slip past the abacus, I can’t move it.\"\n\n#. Key:\tE00518FA4279FE57E9640F9007E4BC35\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_44.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_44.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"I would call that case solved...\"\nmsgstr \"I would call that case solved...\"\n\n#. Key:\tE8F4BE4848BE2E257972D09391B0F296\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_1.SpeechSequence(1).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_1.SpeechSequence(1).SpeechSequence.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"We decided that Gnomes can use the Railway, but how about Gnome Corpses? That’s a totally different issue.\"\nmsgstr \"We decided that Gnomes can use the Railway, but how about Gnome Corpses? That’s a totally different issue.\"\n\n#. Key:\tEB5B1E474DCFFCF9A38190B8FFAB7C50\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"I guess the same rules apply.\"\nmsgstr \"I guess the same rules apply.\"\n\n#. Key:\tEB5BFBDC40E1D6A1D5C054AD8B6424FD\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_24.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_24.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Hmmm... Let me see...\"\nmsgstr \"Hmmm... Let me see...\"\n\n#. Key:\tEF50A43049824F390D61A3A58D44185A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"And you are a walking ball. Isn’t that a problem?\"\nmsgstr \"And you are a walking ball. Isn’t that a problem?\"\n\n#. Key:\t01E5D5DE4524C5AECBE8DAA5A5C3047D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_111.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_111.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Fishy warns you! This path is dangerous! Turn back! Explore other places!\"\nmsgstr \"Fishy warns you! This path is dangerous! Turn back! Explore other places!\"\n\n#. Key:\t036B0B0E41C74704A5ED648091D58AB0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_65.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_65.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Long story short I almost reached the Outpost when my cargo went into a pothole and my wheel was broken.\"\nmsgstr \"Long story short I almost reached the Outpost when my cargo went into a pothole and my wheel was broken.\"\n\n#. Key:\t03B6BE674D69EF12EB862EB77CDC7F57\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_97.Text\n#. Key:\t4475043D4A9CFD057ED34FBB9695EC86\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_113.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_113.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_97.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Then I will give it for 10 Gold Coins.\"\nmsgstr \"Then I will give it for 10 Gold Coins.\"\n\n#. Key:\t0405D11C4961CFB7941F0F9727F80EAD\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_108.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_108.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"9 Gold I won't go any lower!\"\nmsgstr \"9 Gold I won't go any lower!\"\n\n#. Key:\t069FA4C94559002699885EACD6422FC7\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_115.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_115.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Such an insult! How dare you?\"\nmsgstr \"Such an insult! How dare you?\"\n\n#. Key:\t114F9B9345D0965FE6EFC592E29477FE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_54.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_54.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Wohoo! I have some really epic names just for you! Each name costs a Single Gold coin!\"\nmsgstr \"Wohoo! I have some really epic names just for you! Each name costs a Single Gold coin!\"\n\n#. Key:\t1164C89641A9E4970985919C8E86936E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(5).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(5).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Help me?\"\nmsgstr \"Help me?\"\n\n#. Key:\t11E01CA843185266C441ACBC460A5B06\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_39.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_39.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Do you really want to help me?\"\nmsgstr \"Do you really want to help me?\"\n\n#. Key:\t12F669184834CDC0466BA4A72BE38420\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Oh, you come to visit old Gnory again.\"\nmsgstr \"Oh, you come to visit old Gnory again.\"\n\n#. Key:\t148C738E422B1C7889EF8CAEF1E6D115\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(7).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(7).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Lory\"\nmsgstr \"Lory\"\n\n#. Key:\t14A787EF447C5AD6579ADDB271BD9B7E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_54.Children(2).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_54.Children(2).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Warlorb\"\nmsgstr \"Warlorb\"\n\n#. Key:\t14F4A36B4D34364D1BBB2DAAFA745C41\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_SpeechSequence_0.SpeechSequence(1).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_SpeechSequence_0.SpeechSequence(1).SpeechSequence.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"I so hated them...\"\nmsgstr \"I so hated them...\"\n\n#. Key:\t162A7A25421FFB9B368D60A9BC76FD38\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Oh, the three artefacts! That sounds a bit too ambitious but after all, they can be quite a unique gift for a young ball lady.\"\nmsgstr \"Oh, the three artefacts! That sounds a bit too ambitious but after all, they can be quite a unique gift for a young ball lady.\"\n\n#. Key:\t166AAF5241332C7954631F9D568B227B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_46.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_46.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"For everything as well.\"\nmsgstr \"For everything as well.\"\n\n#. Key:\t19190B2142877E8CBB6F6D8FBB8D2DB1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_42.Text\n#. Key:\t39E546F34A9886487CD938A70468AEC6\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_59.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_42.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_59.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"What?\"\nmsgstr \"What?\"\n\n#. Key:\t1AF2DDE74542524EEF19CA9567CFBDAF\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_58.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_58.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"{name}? It still sounds a bit weird, but I think I might like it.\"\nmsgstr \"{name}? It still sounds a bit weird, but I think I might like it.\"\n\n#. Key:\t22D86B8644CA5BFD8D4CA593C5E3A271\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_54.Children(4).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_54.Children(4).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Dr. Ball\"\nmsgstr \"Dr. Ball\"\n\n#. Key:\t2301BDF7421BB3665BED5F92074BB5A2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_84.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_84.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"I’ve found a wheel for you!\"\nmsgstr \"I’ve found a wheel for you!\"\n\n#. Key:\t25502F154A957ECD33B65E879E65B48B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_56.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_56.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"That's sad. Come back when you have some!\"\nmsgstr \"That's sad. Come back when you have some!\"\n\n#. Key:\t27BF125B4C46E41F58FD45947F1F5CF8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_49.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_49.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Fishy is Fishy!\"\nmsgstr \"Fishy is Fishy!\"\n\n#. Key:\t294C4DCC4E8A3A07F15BC8B8C1934BB0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_36.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_36.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"I've got to go now!\"\nmsgstr \"I've got to go now!\"\n\n#. Key:\t29EEF2B44C1FAE2BBA7518A685FC99B0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"An elixir that makes you attractive to the lady... err... balls?\"\nmsgstr \"An elixir that makes you attractive to the lady... err... balls?\"\n\n#. Key:\t2A8B24AE4D7C120048DEF2A76FD6D787\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(9).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(9).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Leave\"\nmsgstr \"Leave\"\n\n#. Key:\t2AC10A9B434CEADBA53C1F8C1DB0A26D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_41.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_41.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"I have some at my shop for sale!\"\nmsgstr \"I have some at my shop for sale!\"\n\n#. Key:\t2FCB0CE9458F40E2B6738B93937283D2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_107.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_107.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"See? And I have to listen to him all day!\"\nmsgstr \"See? And I have to listen to him all day!\"\n\n#. Key:\t303548794492148A0C7CE9961AB48C77\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_92.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_92.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"It's yours for 12 Gold Coins.\"\nmsgstr \"It's yours for 12 Gold Coins.\"\n\n#. Key:\t303B74844F6BC0691F880B970403BE91\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_106.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_106.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Then I will give it for 8 Gold Coins.\"\nmsgstr \"Then I will give it for 8 Gold Coins.\"\n\n#. Key:\t31FAEB004D0A1ED819BEF4BC369D9FD5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_51.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_51.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"I see one of your wagon wheels is broken.\"\nmsgstr \"I see one of your wagon wheels is broken.\"\n\n#. Key:\t336F7E9E46DDE33326081E937EC0024A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Don’t care about Fishy. He can’t really speak and I’m not sure if he even understands himself.\"\nmsgstr \"Don’t care about Fishy. He can’t really speak and I’m not sure if he even understands himself.\"\n\n#. Key:\t339A52E04EF86F99DE9BCEAA78F29025\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_66.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_66.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"See you later!\"\nmsgstr \"See you later!\"\n\n#. Key:\t34076BD4489E7C92D8DCB9BC1668B775\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_6.Text\n#. Key:\t5FC68B30456EA7BB5A381780426E2279\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_73.Text\n#. Key:\t89C71F00406C5A31D196B4994CEBBA22\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_50.Text\n#. Key:\t93A76F294E3B6B5AB77DD5A04E76F681\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_83.Text\n#. Key:\t9C69D11144FA077481C6C9865E6ED34A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_80.Text\n#. Key:\tA28EA457442D0820F3633A8ECACEDC75\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_76.Text\n#. Key:\tCC8A6DB3424E6813002643A97EFE6644\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_50.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_73.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_76.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_80.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_83.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Shut up Fishy!\"\nmsgstr \"Shut up Fishy!\"\n\n#. Key:\t365CB4EB4F04825B34F4ADB42F238552\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_85.Children(2).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_85.Children(2).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"12 Gold\"\nmsgstr \"12 Gold\"\n\n#. Key:\t3E650BC4417E6A004AF4549F412B1AF4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_26.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_26.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Ehm, ehm...\"\nmsgstr \"Ehm, ehm...\"\n\n#. Key:\t3E904B7D4D5694B715AC268086A4DB2F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_78.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_78.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"I’ve met another merchant called Lory. Is she your sister you talked about?\"\nmsgstr \"I’ve met another merchant called Lory. Is she your sister you talked about?\"\n\n#. Key:\t3EB6AD0C4D8896D36393BE878D3D641E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_100.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_100.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"What the holy Coins?! Now I'm getting angry!\"\nmsgstr \"What the holy Coins?! Now I'm getting angry!\"\n\n#. Key:\t43099059444ABE91D004D5992065A06F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_7.Text\n#. Key:\t5A2D69454EA8354F3DE4E6BB9D7BD912\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"And Fishy!\"\nmsgstr \"And Fishy!\"\n\n#. Key:\t43602C93451F3A59EB067ABF7A525D41\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Fishy know about them!\"\nmsgstr \"Fishy know about them!\"\n\n#. Key:\t43C2553447FC63D25E26E79ACE5D7316\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_74.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_74.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"He was a good merchant, so he understood. Business is hard. I always say that for a fair price I would even sell myself.\"\nmsgstr \"He was a good merchant, so he understood. Business is hard. I always say that for a fair price I would even sell myself.\"\n\n#. Key:\t477984834246057BF894629ABEA2F0CB\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_116.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_116.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"You know what? 9 Gold Coins! Take it or leave it that's my final offer!\"\nmsgstr \"You know what? 9 Gold Coins! Take it or leave it that's my final offer!\"\n\n#. Key:\t477CBB8C451F6255A8A4FAAE8272F700\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_54.Children(5).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_54.Children(5).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Don't buy\"\nmsgstr \"Don't buy\"\n\n#. Key:\t494F3D164E51E73CC76FD689BF2A4435\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_110.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_110.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Then I will give it for 9 Gold Coins.\"\nmsgstr \"Then I will give it for 9 Gold Coins.\"\n\n#. Key:\t4CBFFCE24BDAFBA592E846A4C6827F21\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_102.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_102.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"All right, you won. I will give it for 11 Gold Coins.\"\nmsgstr \"All right, you won. I will give it for 11 Gold Coins.\"\n\n#. Key:\t4D29AE254413D052D6FAA7AA259E2618\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_45.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_45.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"I see you do have a solution for everything.\"\nmsgstr \"I see you do have a solution for everything.\"\n\n#. Key:\t4EACFFA1414DBB56AA162789D34C76F2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_61.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_61.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Wow, that's magnificent!\"\nmsgstr \"Wow, that's magnificent!\"\n\n#. Key:\t4F5CF94B464ED01AB43521A56D7C3B13\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_53.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_53.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"I want to buy a new name!\"\nmsgstr \"I want to buy a new name!\"\n\n#. Key:\t51F2252D44A1B1B8B407938C06378303\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Fishy know a poem.\"\nmsgstr \"Fishy know a poem.\"\n\n#. Key:\t540DEA6540589E8E9BD5789F708F1D95\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_85.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_85.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"How much do you charge for it?\"\nmsgstr \"How much do you charge for it?\"\n\n#. Key:\t551FA87F4EC33961257CFBA46B24E39C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_25.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_25.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Oh, holy golden coins please no...\"\nmsgstr \"Oh, holy golden coins please no...\"\n\n#. Key:\t55C0627D41EBB98609EDA49E36CE00F3\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_87.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_87.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Tummm-dummm I would sell the whole World but who could possibly buy it?\\r\\nUhhh... Yes?\"\nmsgstr \"Tummm-dummm I would sell the whole World but who could possibly buy it?\\r\\nUhhh... Yes?\"\n\n#. Key:\t5977C80F49FF140CD397C1A3079F8A4C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_54.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_54.Children(1).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Ultimate Frisbee\"\nmsgstr \"Ultimate Frisbee\"\n\n#. Key:\t5D529690413CAE4F496DF4B7A3627528\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(6).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(6).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Broken wheel?\"\nmsgstr \"Broken wheel?\"\n\n#. Key:\t5D632016493E1D06116399A364FD3835\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_67.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_67.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Take care and don't spend Gold anywhere else!\"\nmsgstr \"Take care and don't spend Gold anywhere else!\"\n\n#. Key:\t5F1DF4B44C4E82D6A5FDB6BDF5172AEA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_96.Text\n#. Key:\t9592C2144A7237D49EC42E898AB73642\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_105.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_105.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_96.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"How about 10?\"\nmsgstr \"How about 10?\"\n\n#. Key:\t6179A2AF43798114CFEE12900CDAF8CA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_60.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_60.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Good choice!\"\nmsgstr \"Good choice!\"\n\n#. Key:\t6185906046DAF51843A52FA2FE2CF5AC\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_101.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_101.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"11 Gold Coins! Take it or leave it that's my final offer!\"\nmsgstr \"11 Gold Coins! Take it or leave it that's my final offer!\"\n\n#. Key:\t655C05DA44E2BCB7DCF0D38DFAD6182C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Let him tell the poem!\"\nmsgstr \"Let him tell the poem!\"\n\n#. Key:\t68761B744A892F85CEDB19B8DD6D9649\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_SpeechSequence_0.SpeechSequence(2).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_SpeechSequence_0.SpeechSequence(2).SpeechSequence.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Then I found out there is a Dwarven Outpost here which is still populated.\"\nmsgstr \"Then I found out there is a Dwarven Outpost here which is still populated.\"\n\n#. Key:\t6D8190E2491C99D14C4E37AA8F01E0BC\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"In Crossroad Cave the three are close.\\r\\nThough where exactly? This poem shows:\\r\\nFor the first one you need to be restless\\r\\nTo avoid the Catacomb death traps.\\r\\nFor the second you need to go down\\r\\nDeep until you reach the ancient fisher town.\\r\\nFor the third one go high and even higher,\\r\\nKeep on til you reach the never sleeping fire.\\r\\n\"\nmsgstr \"In Crossroad Cave the three are close.\\r\\nThough where exactly? This poem shows:\\r\\nFor the first one you need to be restless\\r\\nTo avoid the Catacomb death traps.\\r\\nFor the second you need to go down\\r\\nDeep until you reach the ancient fisher town.\\r\\nFor the third one go high and even higher,\\r\\nKeep on til you reach the never sleeping fire.\\r\\n\"\n\n#. Key:\t6F09C2F74E536AB6E4E7D8941571FBDF\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Sure. Shut up Fishy!\"\nmsgstr \"Sure. Shut up Fishy!\"\n\n#. Key:\t720870EC444670FB23244D964497F883\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_SpeechSequence_1.SpeechSequence(1).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_SpeechSequence_1.SpeechSequence(1).SpeechSequence.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"However business is business. She is bad for business! Trading with my customers before they could get to me!\"\nmsgstr \"However business is business. She is bad for business! Trading with my customers before they could get to me!\"\n\n#. Key:\t757069804B91FF89516ACDA0C1F59C6A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_103.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_103.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Arrrgh! Fishy please no more poems! My head aches.\"\nmsgstr \"Arrrgh! Fishy please no more poems! My head aches.\"\n\n#. Key:\t75A193EA4F6A7EE92BA73D809247B1A1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_62.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_62.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Dr. who? Oh, see, Dr. Ball.\"\nmsgstr \"Dr. who? Oh, see, Dr. Ball.\"\n\n#. Key:\t75EADAAB4ACE4E6ECE45BFA6611ED77A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_85.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_85.Children(0).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"8 Gold\"\nmsgstr \"8 Gold\"\n\n#. Key:\t7657DDE7438385D8BCC4B08B2BB5881A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_SpeechSequence_0.SpeechSequence(0).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_SpeechSequence_0.SpeechSequence(0).SpeechSequence.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"It all started when I was back with my family. Oh, those peaceful moments!\"\nmsgstr \"It all started when I was back with my family. Oh, those peaceful moments!\"\n\n#. Key:\t778E6A484D8669761018F38DF326C125\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_90.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_90.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"It's yours for 8 Gold Coins.\"\nmsgstr \"It's yours for 8 Gold Coins.\"\n\n#. Key:\t7A09AFFF435CC002F0B75989307D7791\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Well met dear err... traveler! How can a humble gnome merchant like me be at your service?\"\nmsgstr \"Well met dear err... traveler! How can a humble gnome merchant like me be at your service?\"\n\n#. Key:\t7E964EEC4406A06910B333A0F282360A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_70.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_70.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Sure! She is the lovely lady ball for whom you would like to buy a precious present, right?\"\nmsgstr \"Sure! She is the lovely lady ball for whom you would like to buy a precious present, right?\"\n\n#. Key:\t85D756624371CC3B3A37FC84C111DBB0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_54.Children(3).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_54.Children(3).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Sorbcerer\"\nmsgstr \"Sorbcerer\"\n\n#. Key:\t86C8F9B74B869FF4D34CF586AB5AC25E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_20.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_20.Children(1).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Shut up!\"\nmsgstr \"Shut up!\"\n\n#. Key:\t8701305446A6E0F5E5EA5F86B823273D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Shut up both of you!\"\nmsgstr \"Shut up both of you!\"\n\n#. Key:\t878BA65D462254D8A0FD36BA541E8C70\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_27.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_27.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"The three artefacts - by Fishy:\"\nmsgstr \"The three artefacts - by Fishy:\"\n\n#. Key:\t8A136EF74C7DE15BFBC664B8447366F1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(2).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(2).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"I need a name\"\nmsgstr \"I need a name\"\n\n#. Key:\t8C25603A4AE5F2D6294551AD2BA6322D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_40.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_40.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Of course! Are you lost in this hollow realm? Disappointed in all creature kind? Searching for a helpful hand? Not anymore!\"\nmsgstr \"Of course! Are you lost in this hollow realm? Disappointed in all creature kind? Searching for a helpful hand? Not anymore!\"\n\n#. Key:\t90F345C4482C46F4B1CD43B20F01B2B6\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_54.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_54.Children(0).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Epic Sphero\"\nmsgstr \"Epic Sphero\"\n\n#. Key:\t92F1D4A84B3609FDE38C82AD5A314554\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_72.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_72.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"And Fishy is the primitive monster.\"\nmsgstr \"And Fishy is the primitive monster.\"\n\n#. Key:\t9574E444465834A7D15565A14C7E0F1D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_SpeechSequence_0.SpeechSequence(5).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_SpeechSequence_0.SpeechSequence(5).SpeechSequence.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"My sister sold my brother, so I had enough money to set out.\"\nmsgstr \"My sister sold my brother, so I had enough money to set out.\"\n\n#. Key:\t976FD7AB4B31747EF35E3EBE9C82471F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_69.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_69.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Do you know a girl called Lillian?\"\nmsgstr \"Do you know a girl called Lillian?\"\n\n#. Key:\t9851A2064648DE26EF4501961D721109\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_68.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_68.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Wake up! He is back!\"\nmsgstr \"Wake up! He is back!\"\n\n#. Key:\t99CDA18D43B5FC74E152888E674B743C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_30.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_30.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Let’s talk about something else.\"\nmsgstr \"Let’s talk about something else.\"\n\n#. Key:\t9A5056F7472381107ACF5F849A322947\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_64.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_64.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Bye!\"\nmsgstr \"Bye!\"\n\n#. Key:\t9B4816554539F6616741FC8A6651FEDD\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_SpeechSequence_1.SpeechSequence(2).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_SpeechSequence_1.SpeechSequence(2).SpeechSequence.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"I will tell her what I think about this that’s for sure!\"\nmsgstr \"I will tell her what I think about this that’s for sure!\"\n\n#. Key:\t9FD161AC488FFD8D9C6BCAB518A6DFCA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_86.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_86.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Hello again!\"\nmsgstr \"Hello again!\"\n\n#. Key:\t9FFADAA44EE730442CFD76BBD942F478\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_38.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_38.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Fare thee well!\"\nmsgstr \"Fare thee well!\"\n\n#. Key:\tA0E3F7B44422A97F22E1FCB315DC498A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_48.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_48.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Who are you by the way?\"\nmsgstr \"Who are you by the way?\"\n\n#. Key:\tA3EE773446B69B8D37851BAFAD607A9F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_24.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_24.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Forget your artefacts I have plenty of other valuable items instead!\"\nmsgstr \"Forget your artefacts I have plenty of other valuable items instead!\"\n\n#. Key:\tA557A981439B7A1B4AA803941A8D6794\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_23.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_23.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"I guess you don’t know where they are...\"\nmsgstr \"I guess you don’t know where they are...\"\n\n#. Key:\tA571474F44F33104D2F93386A5C4009C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_75.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_75.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Yet no one ever wanted to buy him for a single copper coin.\"\nmsgstr \"Yet no one ever wanted to buy him for a single copper coin.\"\n\n#. Key:\tA67ADB3143798188EF7C1F8D4E59690C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_88.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_88.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Uhhh... Yes?\"\nmsgstr \"Uhhh... Yes?\"\n\n#. Key:\tA69D35084A31B957410EF889ED0EC4A4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_57.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_57.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Yes, yes that's it!\"\nmsgstr \"Yes, yes that's it!\"\n\n#. Key:\tAD70372E4A5B0594635FBBBE30CA53F1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_91.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_91.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"It's yours for 10 Gold Coins.\"\nmsgstr \"It's yours for 10 Gold Coins.\"\n\n#. Key:\tAE2E742F4A087974019D8F810FF97A2E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_104.Children(0).Children.Text\n#. Key:\tB59E143642BBE2D677AA6F97B46C3C06\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_105.Children(0).Children.Text\n#. Key:\tF0726C6B4F8F780C341F319D08E20CF9\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_96.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_104.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_105.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_96.Children(0).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Ok\"\nmsgstr \"Ok\"\n\n#. Key:\tAF7B14B241CED9B8BE3F23BC8C857A9A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_82.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_82.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Now you can imagine those peaceful moments when they were all together.\"\nmsgstr \"Now you can imagine those peaceful moments when they were all together.\"\n\n#. Key:\tB2F8DA594F1A58E8B2FCC7B16C368E21\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"What... uhhh... me?\"\nmsgstr \"What... uhhh... me?\"\n\n#. Key:\tBA5B75CD4087B53BB682CD97021FF821\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(3).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(3).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Artefacts\"\nmsgstr \"Artefacts\"\n\n#. Key:\tBBB67671475F19135DCD57AF771F0D85\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_43.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_43.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Helpful hands of course and all kind of stuffs. Equip yourself. Once you get rid of all your gold, you won’t be alone anymore...\"\nmsgstr \"Helpful hands of course and all kind of stuffs. Equip yourself. Once you get rid of all your gold, you won’t be alone anymore...\"\n\n#. Key:\tBD1AF6114DA5840A340F8DA65B7F59D2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_SpeechSequence_1.SpeechSequence(0).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_SpeechSequence_1.SpeechSequence(0).SpeechSequence.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Yes, she is my beloved sister!\"\nmsgstr \"Yes, she is my beloved sister!\"\n\n#. Key:\tBE8F496743A57B5F1AF81B8D48F128FE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Hello there!\"\nmsgstr \"Hello there!\"\n\n#. Key:\tBFA7C31A4443A6C89DB61D8556D62FCD\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(0).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Trade\"\nmsgstr \"Trade\"\n\n#. Key:\tC29FF9914C8C1F479E9F7BAB338B067A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_77.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_77.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"If you could bring me a new wheel I would pay for it with shiny Gold coins!\"\nmsgstr \"If you could bring me a new wheel I would pay for it with shiny Gold coins!\"\n\n#. Key:\tC5077FC14569C44087272C9E9DE07992\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_34.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_34.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Ok, I’ve got it.\"\nmsgstr \"Ok, I’ve got it.\"\n\n#. Key:\tC6F3C52D4719CE471B6EEB90FCE94E3B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_55.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_55.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Unfortunately I don't have enough gold.\"\nmsgstr \"Unfortunately I don't have enough gold.\"\n\n#. Key:\tCA1E8A5D4C07A81975C4B4B00572A0C8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_94.Text\n#. Key:\tDB9C0DB146BBE1DFC28F929A37C4408A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_93.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_93.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_94.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Ha-ha-ha! You must be kidding that's ridiculously high!\"\nmsgstr \"Ha-ha-ha! You must be kidding that's ridiculously high!\"\n\n#. Key:\tCB792FAD45F78755935423A5219271FC\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_98.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_98.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"9 Gold I won't go any higher!\"\nmsgstr \"9 Gold I won't go any higher!\"\n\n#. Key:\tCE99919C42EC2315EC5B33900FBC09C4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_95.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_95.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"That’s not fair. It would be a shame on me if I just robbed you like that!\"\nmsgstr \"That’s not fair. It would be a shame on me if I just robbed you like that!\"\n\n#. Key:\tD090388E4529CEC2D70899B520973064\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(4).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(4).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Who are you?\"\nmsgstr \"Who are you?\"\n\n#. Key:\tD0AA81A247BE4979A774F3B6095BB820\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_33.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_33.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"I am Gnory, traveler merchant. I wander the world, seeking rare items, secrets beneath dark doors, revealing truth of forg...\"\nmsgstr \"I am Gnory, traveler merchant. I wander the world, seeking rare items, secrets beneath dark doors, revealing truth of forg...\"\n\n#. Key:\tD23C65EB4F39580A06045FADE2BCD713\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_81.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_81.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"She saw our Realm through cat eyes,\\r\\nThe living fire, the dead ice.\\r\\nShe cared, she took care of us all.\\r\\nWhat was ruined she made it whole.\\r\\nThen she left us, this is how it ended.\\r\\nHer own Realm also needed to be mended.\\r\\n\"\nmsgstr \"She saw our Realm through cat eyes,\\r\\nThe living fire, the dead ice.\\r\\nShe cared, she took care of us all.\\r\\nWhat was ruined she made it whole.\\r\\nThen she left us, this is how it ended.\\r\\nHer own Realm also needed to be mended.\\r\\n\"\n\n#. Key:\tD30843A14519A490FEE89E82E3CB6735\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"I’m looking for three artefacts.\"\nmsgstr \"I’m looking for three artefacts.\"\n\n#. Key:\tD9B70A6A453A11FD2115FFB25CCFF195\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_54.Children(6).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_54.Children(6).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Not enough gold\"\nmsgstr \"Not enough gold\"\n\n#. Key:\tDB8982994F2BFF510A6A2EA1D40C68C6\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_37.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_37.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Good bye!\"\nmsgstr \"Good bye!\"\n\n#. Key:\tDC20CC924E5F898E715B668416678CA1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_104.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_104.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"How about 8?\"\nmsgstr \"How about 8?\"\n\n#. Key:\tDC989DED42077EBA3313C69150BB33F0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_63.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_63.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"That's a weird name I have to admit.\"\nmsgstr \"That's a weird name I have to admit.\"\n\n#. Key:\tDEC95D494680878D544FF49DACBDEE4F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_114.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_114.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"11 Gold I won't go any lower!\"\nmsgstr \"11 Gold I won't go any lower!\"\n\n#. Key:\tDF7B371841495C5FB98800BCF44B7C5B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_52.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_52.Children(1).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Skip yack-yack\"\nmsgstr \"Skip yack-yack\"\n\n#. Key:\tE1322541414052606F718FBF9B68D4B0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_79.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_79.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Fishy know her.\"\nmsgstr \"Fishy know her.\"\n\n#. Key:\tE3D668304EE4C7C2E77F3E9AF47CB84E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_SpeechSequence_0.SpeechSequence(4).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_SpeechSequence_0.SpeechSequence(4).SpeechSequence.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Fortunately I had a loving family I could always count on. Since they are all merchants, they could easily help me out.\"\nmsgstr \"Fortunately I had a loving family I could always count on. Since they are all merchants, they could easily help me out.\"\n\n#. Key:\tE5031E774F81A45ECB4731BC114AD2E2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_109.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_109.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"All right, no need to get angry! I can give you 9 Gold for it.\"\nmsgstr \"All right, no need to get angry! I can give you 9 Gold for it.\"\n\n#. Key:\tEBE094644F9C8DCEE025FDBF8346AD47\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_44.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_44.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"...with your problem.\"\nmsgstr \"...with your problem.\"\n\n#. Key:\tEC93512B48219F6BA6DDF5A3F100C19A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Show me what you have for sale!\"\nmsgstr \"Show me what you have for sale!\"\n\n#. Key:\tECF244164CDD4A29C96BBD8E13688FE7\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(1).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Sell Wheel\"\nmsgstr \"Sell Wheel\"\n\n#. Key:\tED410B224B09EFF36ED2AC9752AD59DA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_71.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_71.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"No, she is...\"\nmsgstr \"No, she is...\"\n\n#. Key:\tEDE4BF2D448CAFEF217C5E86885A7E81\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_117.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_117.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"All right, you won. I will give it for 9 Gold Coins.\"\nmsgstr \"All right, you won. I will give it for 9 Gold Coins.\"\n\n#. Key:\tEEA209E84766D4AF2BD804A7BA11F111\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_85.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_85.Children(1).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"10 Gold\"\nmsgstr \"10 Gold\"\n\n#. Key:\tEEE19423423A24146446EEBEB04FAEE9\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"I’m on a quest to find...\"\nmsgstr \"I’m on a quest to find...\"\n\n#. Key:\tF53E6D3443D37DA82663D2976AA90A85\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_20.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_20.Children(0).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Poem?\"\nmsgstr \"Poem?\"\n\n#. Key:\tF61EDE3940F24B15BE57D8B5A5AC5570\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_99.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_99.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Deal! Here you go!\"\nmsgstr \"Deal! Here you go!\"\n\n#. Key:\tF6A527234B894C18C0778C918EB1BA4E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_89.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_89.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Welcome back!\"\nmsgstr \"Welcome back!\"\n\n#. Key:\tF93CBC6640AF6143C7D1C5AA6F8C4ADF\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_52.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_52.Children(0).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Go on\"\nmsgstr \"Go on\"\n\n#. Key:\tF9EA93DE4B341581745785A7371F797A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(8).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(8).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Lillian\"\nmsgstr \"Lillian\"\n\n#. Key:\tFE3C4C72489A909B4D9F76A483D293AE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_SpeechSequence_0.SpeechSequence(3).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_SpeechSequence_0.SpeechSequence(3).SpeechSequence.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"This was my chance to make a hit as a merchant but I didn’t have the resources for a journey this long.\"\nmsgstr \"This was my chance to make a hit as a merchant but I didn’t have the resources for a journey this long.\"\n\n#. Key:\tFEF58E5B4FB18D128640689499752F75\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_29.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_29.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Do you call this a poem? Pathetic! Hardly any info and what a miserable structure! Shame on you Fishy!\"\nmsgstr \"Do you call this a poem? Pathetic! Hardly any info and what a miserable structure! Shame on you Fishy!\"\n\n#. Key:\tFF66071643E10E94DEFF70B8E20876EE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_52.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_52.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"That's a long and sad story...\"\nmsgstr \"That's a long and sad story...\"\n\n#. Key:\t1EA717114DFEF4490F58829C2F96566A\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/HW_Candlestick.HW_Candlestick:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E2/HW_Candlestick.HW_Candlestick:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_HW_Candlestick\"\nmsgid \"Even after mom passed the servants kept lighting the candles.\"\nmsgstr \"Even after mom passed the servants kept lighting the candles.\"\n\n#. Key:\t94195B6E4157A1A8BD74BE9224AEED42\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/HW_Candlestick.HW_Candlestick:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E2/HW_Candlestick.HW_Candlestick:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_HW_Candlestick\"\nmsgid \"After Mom got sick she really feared darkness.\"\nmsgstr \"After Mom got sick she really feared darkness.\"\n\n#. Key:\tEF9668BF44D4A52E46ACEA8B82011137\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/HW_Candlestick.HW_Candlestick:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Ending/E2/HW_Candlestick.HW_Candlestick:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_HW_Candlestick\"\nmsgid \"We always needed to light the hallway.\"\nmsgstr \"We always needed to light the hallway.\"\n\n#. Key:\t2EECB3024693C7F0EA176BB100D6779A\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/HW_Exit.HW_Exit:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E2/HW_Exit.HW_Exit:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_HW_Exit\"\nmsgid \"This door was really rusty.\"\nmsgstr \"This door was really rusty.\"\n\n#. Key:\t3C6E4A1C41A7EACE15C101A65BBE997A\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/HW_Exit.HW_Exit:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Ending/E2/HW_Exit.HW_Exit:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_HW_Exit\"\nmsgid \"I had to do something with it otherwise Father would have heard me.\"\nmsgstr \"I had to do something with it otherwise Father would have heard me.\"\n\n#. Key:\t8F63CC8C44D8F8432A66E6B65EC10AF5\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/HW_Exit.HW_Exit:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E2/HW_Exit.HW_Exit:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_HW_Exit\"\nmsgid \"I used oil on this rusty door. I didn’t want to be heard.\"\nmsgstr \"I used oil on this rusty door. I didn’t want to be heard.\"\n\n#. Key:\t55E7DD2B4C3D8852EC4A64AF44443BDA\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/HW_Explosion.HW_Explosion:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Ending/E1/HW_Explosion.HW_Explosion:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_HW_Explosion\"\nmsgid \"What was this? I have to go back to check what happened!\"\nmsgstr \"What was this? I have to go back to check what happened!\"\n\n#. Key:\t8060689940824917F595BF84B4E95A46\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/HW_FRDoor.HW_FRDoor:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E2/HW_FRDoor.HW_FRDoor:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_HW_FRDoor\"\nmsgid \"I always wondered why.\"\nmsgstr \"I always wondered why.\"\n\n#. Key:\t816B603341386CF6BB3ADCAAD21D68A3\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/HW_FRDoor.HW_FRDoor:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E2/HW_FRDoor.HW_FRDoor:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_HW_FRDoor\"\nmsgid \"Father moved to his workroom and sealed this door.\"\nmsgstr \"Father moved to his workroom and sealed this door.\"\n\n#. Key:\t125DACD243EA6EBCE76D8CB9F681C727\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/HW_MRDoor.HW_MRDoor:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E2/HW_MRDoor.HW_MRDoor:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_HW_MRDoor\"\nmsgid \"I felt I should have a last look before I go.\"\nmsgstr \"I felt I should have a last look before I go.\"\n\n#. Key:\tE8250D43437C1B1D45637F9499D20936\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/HW_MRDoor.HW_MRDoor:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E2/HW_MRDoor.HW_MRDoor:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_HW_MRDoor\"\nmsgid \"Mom’s room looked just like it was when she was still alive.\"\nmsgstr \"Mom’s room looked just like it was when she was still alive.\"\n\n#. Key:\tE0BB63A74E94DA1B327B11BB781EB4DB\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/HW_Painting.HW_Painting:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E2/HW_Painting.HW_Painting:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_HW_Painting\"\nmsgid \"Mom made this painting before she met Father.\"\nmsgstr \"Mom made this painting before she met Father.\"\n\n#. Key:\tEAD0C13D4BF1D35BDAEC14A3F25901F5\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/HW_Stairs.HW_Stairs:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E2/HW_Stairs.HW_Stairs:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_HW_Stairs\"\nmsgid \"I had to go really softly otherwise Father would have heard me.\"\nmsgstr \"I had to go really softly otherwise Father would have heard me.\"\n\n#. Key:\t0494D36047DDCE114A43C9901618D32B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_44.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_44.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Unfortunately I don't know where you can find them.\"\nmsgstr \"Unfortunately I don't know where you can find them.\"\n\n#. Key:\t0C3E31854B0EB053EABAD4B9DC3D8E60\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_57.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_57.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"That’s a serious threat, I have to admit.\"\nmsgstr \"That’s a serious threat, I have to admit.\"\n\n#. Key:\t0C7C89EB4E610752FBE119AA32B99F8B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_34.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_34.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Yes I know her. She couldn’t come here so she sent her cat.\"\nmsgstr \"Yes I know her. She couldn’t come here so she sent her cat.\"\n\n#. Key:\t0EDE363848C05F39DE478DA7A559CF54\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Could you bring them to me?\"\nmsgstr \"Could you bring them to me?\"\n\n#. Key:\t1A914576488DA1393ED641B9F315ABC6\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_53.Text\n#. Key:\t20DA5C2F49DCFADF17F1C983103C0D98\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_29.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_29.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_53.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Thanks!\"\nmsgstr \"Thanks!\"\n\n#. Key:\t1E7EE16F451CAB1193F0B8B3939273AA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_62.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_62.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"I managed to defeat one group of the monsters.\"\nmsgstr \"I managed to defeat one group of the monsters.\"\n\n#. Key:\t1F5BE4154412819180B1CA92E5B69377\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(6).Children.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(6).Children.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Artefacts\"\nmsgstr \"Artefacts\"\n\n#. Key:\t1FE89B7045E586E988BEC18B06BEEBDB\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(1).Children.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Purple Mushroom\"\nmsgstr \"Purple Mushroom\"\n\n#. Key:\t208B21DE484E3FE42C9978927BC91E78\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_51.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_51.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Uh... this was impressive!\"\nmsgstr \"Uh... this was impressive!\"\n\n#. Key:\t27DF1ABB483B5073D8C87DB48EF2613F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_70.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_70.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Well done!\"\nmsgstr \"Well done!\"\n\n#. Key:\t2892242A4E74642813A30CBAE853B674\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_27.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_27.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Anyway, if you give my Coin back I will apologize.\"\nmsgstr \"Anyway, if you give my Coin back I will apologize.\"\n\n#. Key:\t290F9EE34FA4EA41FE963CA61358D23B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_49.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_49.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"In theory if I add this to the soup...\"\nmsgstr \"In theory if I add this to the soup...\"\n\n#. Key:\t3015DA144833F0401BADE8B5E5F93BA8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_26.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_26.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Huh! Do you think chests are only there so that you can loot them?\"\nmsgstr \"Huh! Do you think chests are only there so that you can loot them?\"\n\n#. Key:\t331D8B314DAF15CD7E343BB7459927DD\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Give back my Coin!\"\nmsgstr \"Give back my Coin!\"\n\n#. Key:\t345BD57D40E09C73044BB981798E2449\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_43.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_43.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Purple Mushrooms. That’s the only mushroom which is purple. You can’t miss it.\"\nmsgstr \"Purple Mushrooms. That’s the only mushroom which is purple. You can’t miss it.\"\n\n#. Key:\t34B1483D4F1C580BB8DB61BEEBC5BC0F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"I saw that you opened my chest!\"\nmsgstr \"I saw that you opened my chest!\"\n\n#. Key:\t35DBF2874748AFCC34A3FAAC083EF9A0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_1.SpeechSequence(3).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_1.SpeechSequence(3).SpeechSequence.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"We had the key of the Ancient Temple. According to our prophecies that will fall to Ruin last.\"\nmsgstr \"We had the key of the Ancient Temple. According to our prophecies that will fall to Ruin last.\"\n\n#. Key:\t35FB567B4B09545830D61F84869FC7E7\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Here you go!\"\nmsgstr \"Here you go!\"\n\n#. Key:\t3AAE79234A4BD2F8BCA5F790D5E5D84B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_45.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_45.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"No problem. If I ever find one I will bring it to you.\"\nmsgstr \"No problem. If I ever find one I will bring it to you.\"\n\n#. Key:\t3AE46C894A0CD8F1AA049CB9970D65F3\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"I’m the chef and I’m making a soup.\"\nmsgstr \"I’m the chef and I’m making a soup.\"\n\n#. Key:\t3BB405034447D1C80B99A5A23AFC98FC\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"I know you are already hungry but the soup is not yet ready.\"\nmsgstr \"I know you are already hungry but the soup is not yet ready.\"\n\n#. Key:\t406361704988AD9ABD5DA4AF946451F2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_37.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_37.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"In return Lillian drew pictures for my tales.\"\nmsgstr \"In return Lillian drew pictures for my tales.\"\n\n#. Key:\t4152700A419F5AE41362D09E21835D98\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_46.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_46.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"I already have some...\"\nmsgstr \"I already have some...\"\n\n#. Key:\t4355EB74402DDFD5FF8697B1911593E8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_56.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_56.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"I won’t. And I won’t talk to you either.\"\nmsgstr \"I won’t. And I won’t talk to you either.\"\n\n#. Key:\t43C4F54B4ABBBB13E129148D9AF04976\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(4).Children.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(4).Children.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Village\"\nmsgstr \"Village\"\n\n#. Key:\t4614DBA24F54CB29C92BA9894849CC39\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_1.SpeechSequence(1).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_1.SpeechSequence(1).SpeechSequence.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Long ago we lived in peace and respected the ancestors. Even though they caused the Cataclysm.\"\nmsgstr \"Long ago we lived in peace and respected the ancestors. Even though they caused the Cataclysm.\"\n\n#. Key:\t4687EF7A45E5FC200C806AB829C64D78\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Is this a village? Where are the others?\"\nmsgstr \"Is this a village? Where are the others?\"\n\n#. Key:\t586F6370480889F551923A97FFF5E89C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_0.SpeechSequence(3).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_0.SpeechSequence(3).SpeechSequence.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"They enslaved all the other tribes and forbid us to do our rituals.\"\nmsgstr \"They enslaved all the other tribes and forbid us to do our rituals.\"\n\n#. Key:\t5BCF2C5D4CE9AD6AB4A09DB510BA2039\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"You again? Take a seat until the soup is ready!\"\nmsgstr \"You again? Take a seat until the soup is ready!\"\n\n#. Key:\t63B9B304450B276F0EC714B43A25F09D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"I’m looking for three artefacts. Do you know something about them?\"\nmsgstr \"I’m looking for three artefacts. Do you know something about them?\"\n\n#. Key:\t63C0EC124C1B42B5C5FD1F95B23B9155\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_65.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_65.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Take this! You deserve it.\"\nmsgstr \"Take this! You deserve it.\"\n\n#. Key:\t69E0738B489315662A55DA98EAC542E6\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_0.SpeechSequence(4).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_0.SpeechSequence(4).SpeechSequence.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"They used this village to produce Fishy slaves.\"\nmsgstr \"They used this village to produce Fishy slaves.\"\n\n#. Key:\t6CBCFFEB48FF8E0D97AAE4B1CB19CB52\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_22.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_22.Children(0).Children.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Give back\"\nmsgstr \"Give back\"\n\n#. Key:\t6EACCB4D4D91AF29F6452E81E4C01B57\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_32.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_32.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"I see you have a lot of things here. Do you have something for sale?\"\nmsgstr \"I see you have a lot of things here. Do you have something for sale?\"\n\n#. Key:\t7164FF5D440BCEF18CAC7E9104A324CF\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"I've got to go now!\"\nmsgstr \"I've got to go now!\"\n\n#. Key:\t75A92D46421FC2601A13B4BBE9BA4D11\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_54.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_54.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Er... I don’t have it. But I will get it back I promise!\"\nmsgstr \"Er... I don’t have it. But I will get it back I promise!\"\n\n#. Key:\t761F5734479CFA197266F382FD0A6452\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_23.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_23.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"I’m sorry, I didn’t know it was yours. There are chests like yours everywhere.\"\nmsgstr \"I’m sorry, I didn’t know it was yours. There are chests like yours everywhere.\"\n\n#. Key:\t7D87C5064D739F1EFF23AF8264E83235\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Well, this morning. But there are some very special ingredients which make the cook time way shorter.\"\nmsgstr \"Well, this morning. But there are some very special ingredients which make the cook time way shorter.\"\n\n#. Key:\t806AEB764A6118D4CBE9CCA71E98EF10\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_72.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_72.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Have no fear, I'll do it.\"\nmsgstr \"Have no fear, I'll do it.\"\n\n#. Key:\t80B60CA848D3C71B72514AAC976C3910\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Yes, the soup! A very special recipe. It takes years to finish.\"\nmsgstr \"Yes, the soup! A very special recipe. It takes years to finish.\"\n\n#. Key:\t8437D72C44494DE499E528A67B36A123\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_58.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_58.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Ah, it's you again.\"\nmsgstr \"Ah, it's you again.\"\n\n#. Key:\t885F9FDB498EC13B81E22580D33309F3\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(5).Children.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(5).Children.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Kobolds\"\nmsgstr \"Kobolds\"\n\n#. Key:\t8A6043D64FB7B61AF4D553A62D27229C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_36.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_36.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Every time the cat came I told him a tale about the ancestors.\"\nmsgstr \"Every time the cat came I told him a tale about the ancestors.\"\n\n#. Key:\t8B29FD7342676763EF53ACBB0677A1A4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"The soup still needs time.\"\nmsgstr \"The soup still needs time.\"\n\n#. Key:\t8E0F057044AE753D63AA23847B146662\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_67.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_67.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"This is yours.\"\nmsgstr \"This is yours.\"\n\n#. Key:\t8E4C4FB846539DD46577B490846383F1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_1.SpeechSequence(2).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_1.SpeechSequence(2).SpeechSequence.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"We decided to keep their knowledge in our rituals.\"\nmsgstr \"We decided to keep their knowledge in our rituals.\"\n\n#. Key:\t9132C2D24A241722115FD5ADB46B3145\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"And when did you start?\"\nmsgstr \"And when did you start?\"\n\n#. Key:\t958CE12E48F89AE79E5ED9A4FC4AF6E7\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_48.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_48.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"That's wonderful!\"\nmsgstr \"That's wonderful!\"\n\n#. Key:\t96E5FBCB4795EC1ADACEC7B6D814BD79\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(8).Children.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(8).Children.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Lillian\"\nmsgstr \"Lillian\"\n\n#. Key:\t9845BDB549EF25B9F5C11981123A5CCE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_33.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_33.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"You know I’m not really a trader but I might sell you some of them.\"\nmsgstr \"You know I’m not really a trader but I might sell you some of them.\"\n\n#. Key:\t9A420B814A1C1762130310AE90157BFD\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_31.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_31.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"No, I’m sorry.\"\nmsgstr \"No, I’m sorry.\"\n\n#. Key:\t9D8511F94E19183355A5CC8CE5B562E8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_61.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_61.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"That would be great. I appreciate your kindness.\"\nmsgstr \"That would be great. I appreciate your kindness.\"\n\n#. Key:\t9F2DE60B405A15F2BFB8409D162B42FD\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(3).Children.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(3).Children.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Soup\"\nmsgstr \"Soup\"\n\n#. Key:\tA53CDF2A4D9A582DD163C7B6D3DCE334\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_55.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_55.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Come back when you have my Coin.\"\nmsgstr \"Come back when you have my Coin.\"\n\n#. Key:\tA734229B44743F88ED135FB692B9C956\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Do you know a girl called Lillian?\"\nmsgstr \"Do you know a girl called Lillian?\"\n\n#. Key:\tA88F63334DD550FE9955A3A65B87ACDA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_63.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_63.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"I banished some of the monsters.\"\nmsgstr \"I banished some of the monsters.\"\n\n#. Key:\tA8B5BE484641EBB61B1168AE798DABF5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"So you are making soup...\"\nmsgstr \"So you are making soup...\"\n\n#. Key:\tAAE2E35045B8E0DF8A11BF8BC84A11EF\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_0.SpeechSequence(1).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_0.SpeechSequence(1).SpeechSequence.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Every year we made a pilgrimage to the Ancient Temple to express our respect to the ancestors.\"\nmsgstr \"Every year we made a pilgrimage to the Ancient Temple to express our respect to the ancestors.\"\n\n#. Key:\tAC26EB6F49B026C3E768398FA0A445CB\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_50.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_50.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"then...\"\nmsgstr \"then...\"\n\n#. Key:\tADE8569E4FC2DCB097FF3FA4B9A0A970\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_40.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_40.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Why not? What do you need?\"\nmsgstr \"Why not? What do you need?\"\n\n#. Key:\tAE35D91D450D0414FA5F54B71E359511\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(2).Children.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(2).Children.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Who are you?\"\nmsgstr \"Who are you?\"\n\n#. Key:\tAE387E9846A9C5A56569179359AD941C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_42.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_42.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"All right! I was just asking...\"\nmsgstr \"All right! I was just asking...\"\n\n#. Key:\tAF3D9214401FEEE552256A8BAE5F8E77\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_1.SpeechSequence(4).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_1.SpeechSequence(4).SpeechSequence.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"But now Kobolds are wrathful. They make wars. They don’t respect anyone.\"\nmsgstr \"But now Kobolds are wrathful. They make wars. They don’t respect anyone.\"\n\n#. Key:\tB06407B04855D558D1DB6B9A9A4E0B84\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_1.SpeechSequence(0).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_1.SpeechSequence(0).SpeechSequence.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Kobolds are no longer good.\"\nmsgstr \"Kobolds are no longer good.\"\n\n#. Key:\tB082CC4B405800544484B4B0C8A25762\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_41.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_41.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"No way!\"\nmsgstr \"No way!\"\n\n#. Key:\tB35F443641A7626AE4552F8D1045A95F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_38.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_38.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"I liked them very much.\"\nmsgstr \"I liked them very much.\"\n\n#. Key:\tB40C1B9948722A549DBC45A1D9C277C0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_24.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_24.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"I don’t want to leave my kitchen.\"\nmsgstr \"I don’t want to leave my kitchen.\"\n\n#. Key:\tB71FB3424C74B68E4B9CF9AF3828F867\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_64.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_64.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"I think I banished all the monsters.\"\nmsgstr \"I think I banished all the monsters.\"\n\n#. Key:\tB79F2026493F53FE90BABB987370695D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"What do you think honestly? You can just rob me and then come to have a chat?!\"\nmsgstr \"What do you think honestly? You can just rob me and then come to have a chat?!\"\n\n#. Key:\tB7B8A9294FA8D3754BB4CDA897B696BA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_69.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_69.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Great. The lake is already more peaceful.\"\nmsgstr \"Great. The lake is already more peaceful.\"\n\n#. Key:\tB9C3EC7342B52C04A491FF9AE87ABB42\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_0.SpeechSequence(0).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_0.SpeechSequence(0).SpeechSequence.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"This was the Village of my tribe. We lived here in peace.\"\nmsgstr \"This was the Village of my tribe. We lived here in peace.\"\n\n#. Key:\tBB45D70A4F2AF94BA7FCC9B3141FB98F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_17.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_17.Children(0).Children.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Accept\"\nmsgstr \"Accept\"\n\n#. Key:\tC297D79246A0792DCA2CA9AD693C3A55\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"That’s all.\"\nmsgstr \"That’s all.\"\n\n#. Key:\tC375726140A40243E29115B58048025E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_52.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_52.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Hmm... it’s delicious. Here take some!\"\nmsgstr \"Hmm... it’s delicious. Here take some!\"\n\n#. Key:\tC8BC1F254B61D749D62D4B9210DA1891\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"If you came for soup you will need to wait a bit more!\"\nmsgstr \"If you came for soup you will need to wait a bit more!\"\n\n#. Key:\tCB607C4842DF3781F8B6C9AB1A7D31F1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Where is my Coin?\"\nmsgstr \"Where is my Coin?\"\n\n#. Key:\tCE80654A43078EA1E53C5E9C5114DE54\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_60.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_60.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"I can help you banish the monsters around the lake.\"\nmsgstr \"I can help you banish the monsters around the lake.\"\n\n#. Key:\tD1412BF6490EA9357CE9F7A873B1FCAC\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_35.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_35.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"She was really curious about our rituals.\"\nmsgstr \"She was really curious about our rituals.\"\n\n#. Key:\tD76CDC9F410E2BCC21BCFB8D0D8A9E97\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_47.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_47.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"I’ve found some Purple Mushroom!\"\nmsgstr \"I’ve found some Purple Mushroom!\"\n\n#. Key:\tD87335EA45EAC6F84022FEBE57F5CADF\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_25.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_25.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Or what? Will you cook me?\"\nmsgstr \"Or what? Will you cook me?\"\n\n#. Key:\tD9B7F3E240430AA5EF537A8F81814751\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_71.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_71.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"I'm glad that the lake is peaceful again. Thank you!\"\nmsgstr \"I'm glad that the lake is peaceful again. Thank you!\"\n\n#. Key:\tE15F80EA40F193E47F372FA7EE9A949E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_0.SpeechSequence(5).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_0.SpeechSequence(5).SpeechSequence.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Now they are gone and I'm alone with the monsters they left here.\"\nmsgstr \"Now they are gone and I'm alone with the monsters they left here.\"\n\n#. Key:\tE3947B064E58A1FD7B96A3956C54415D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_0.SpeechSequence(2).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_0.SpeechSequence(2).SpeechSequence.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"But then other Kobolds came. They called themselves the Great Kobols.\"\nmsgstr \"But then other Kobolds came. They called themselves the Great Kobols.\"\n\n#. Key:\tE48A1DFB458275188357F5811E98CFD4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_59.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_59.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"And also take this! I could have not done the soup in time without your help.\"\nmsgstr \"And also take this! I could have not done the soup in time without your help.\"\n\n#. Key:\tE58EEE904A6CBF1A0E2E768583EB03DC\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(7).Children.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(7).Children.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Trade\"\nmsgstr \"Trade\"\n\n#. Key:\tE60B94C04C63F0E074A5B8ABFED7AE62\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_66.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_66.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"I have something for you.\"\nmsgstr \"I have something for you.\"\n\n#. Key:\tEA71F6A6412E69C31302A2B57BFD266F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_39.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_39.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Now they are both gone.\"\nmsgstr \"Now they are both gone.\"\n\n#. Key:\tECA4BB2D4EB774315D57FD9A5D66CF25\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_22.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_22.Children(1).Children.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Don't give\"\nmsgstr \"Don't give\"\n\n#. Key:\tED97FDEB46CAC89F65734D990569618C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_17.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_17.Children(1).Children.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Decline\"\nmsgstr \"Decline\"\n\n#. Key:\tEFD0511840178E579287BAB7FA3FDADE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(0).Children.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Banish Monsters\"\nmsgstr \"Banish Monsters\"\n\n#. Key:\tF5A08C63415DF9FE007B97931B7A7C31\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(9).Children.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(9).Children.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Leave\"\nmsgstr \"Leave\"\n\n#. Key:\tF7EA437842BBD099521D81B87211F49E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_30.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_30.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"I’m the last of my tribe.\"\nmsgstr \"I’m the last of my tribe.\"\n\n#. Key:\tFC8F235840D6AF4A86170791A617BCA9\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Who are you? What are you doing here?\"\nmsgstr \"Who are you? What are you doing here?\"\n\n#. Key:\tFF27D3BF4D181753D73AD79D384CD3ED\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"What are you Kobolds like? What are you doing?\"\nmsgstr \"What are you Kobolds like? What are you doing?\"\n\n#. Key:\t587277824A24A49F9319D0B452A709AD\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/LB_Device.LB_Device:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Ending/E1/LB_Device.LB_Device:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_LB_Device\"\nmsgid \"Monk wanted me to use this device to separate the Worlds.\"\nmsgstr \"Monk wanted me to use this device to separate the Worlds.\"\n\n#. Key:\t83B9F1E146084039E4BAD185B455209C\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LB_Device.LB_Device:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E2/LB_Device.LB_Device:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_LB_Device\"\nmsgid \"With Father we did all we could to make the device perfect. I won’t let us lose so close to the end!\"\nmsgstr \"With Father we did all we could to make the device perfect. I won’t let us lose so close to the end!\"\n\n#. Key:\t90E0E1E44BE9D84FC514248D73A31935\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LB_Device.LB_Device:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Ending/E2/LB_Device.LB_Device:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_LB_Device\"\nmsgid \"Three years of hard work.\"\nmsgstr \"Three years of hard work.\"\n\n#. Key:\tFB8EC2184310BA168B9C6E9DB51C4492\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LB_Device.LB_Device:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E2/LB_Device.LB_Device:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_LB_Device\"\nmsgid \"I need to pull the left lever first.\"\nmsgstr \"I need to pull the left lever first.\"\n\n#. Key:\tDAC636D74C51C30F4B790B9F87203957\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/LB_DeviceUse.LB_DeviceUse:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Ending/E1/LB_DeviceUse.LB_DeviceUse:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_LB_DeviceUse\"\nmsgid \"Er... so far pulling the levers worked but this machine looks fairly complicated.\"\nmsgstr \"Er... so far pulling the levers worked but this machine looks fairly complicated.\"\n\n#. Key:\tE0D3606C4F357F03FBC916AA3573A81D\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/LB_DeviceUse.LB_DeviceUse:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E1/LB_DeviceUse.LB_DeviceUse:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_LB_DeviceUse\"\nmsgid \"I should look around to find some instructions on how it works.\"\nmsgstr \"I should look around to find some instructions on how it works.\"\n\n#. Key:\t2DB770DF48D3199FFDEA3F8AB99126D5\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LB_LeftLever.LB_LeftLever:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Ending/E2/LB_LeftLever.LB_LeftLever:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_LB_LeftLever\"\nmsgid \"I heard them knocking on the door. They surely heard the alarm when I entered.\"\nmsgstr \"I heard them knocking on the door. They surely heard the alarm when I entered.\"\n\n#. Key:\tB5D008804CCD51DF8CA8F5B99CA0C0FB\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LB_LeftLever.LB_LeftLever:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E2/LB_LeftLever.LB_LeftLever:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_LB_LeftLever\"\nmsgid \"I need to hurry. The middle lever is the next one.\"\nmsgstr \"I need to hurry. The middle lever is the next one.\"\n\n#. Key:\tC7B08D314C68A7E4D21E20B128670516\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LB_MiddleLever.LB_MiddleLever:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Ending/E2/LB_MiddleLever.LB_MiddleLever:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_LB_MiddleLever\"\nmsgid \"We both made our decision three years ago.\"\nmsgstr \"We both made our decision three years ago.\"\n\n#. Key:\tFBC301B94D990F1F3FD30383FF916327\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LB_MiddleLever.LB_MiddleLever:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Ending/E2/LB_MiddleLever.LB_MiddleLever:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_LB_MiddleLever\"\nmsgid \"I’ve made my choice.\"\nmsgstr \"I’ve made my choice.\"\n\n#. Key:\tFD2036CF4FC103724FB18F83754367A0\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LB_MiddleLever.LB_MiddleLever:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E2/LB_MiddleLever.LB_MiddleLever:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_LB_MiddleLever\"\nmsgid \"I heard the door exploding. Father must be really mad but It doesn’t matter now.\"\nmsgstr \"I heard the door exploding. Father must be really mad but It doesn’t matter now.\"\n\n#. Key:\t98F843004F338E4480C942A9B9646BDE\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LB_RightLever.LB_RightLever:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E2/LB_RightLever.LB_RightLever:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_LB_RightLever\"\nmsgid \"I pulled the last lever.\"\nmsgstr \"I pulled the last lever.\"\n\n#. Key:\t9F6EBBE74FA6289497401C8E7400B01E\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LR_Bed.LR_Bed:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E2/LR_Bed.LR_Bed:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_LR_Bed\"\nmsgid \"Sleeping wasn’t easy since Mom was gone.\"\nmsgstr \"Sleeping wasn’t easy since Mom was gone.\"\n\n#. Key:\tAE56EE704265B61C84123F9775EB424C\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LR_Bed.LR_Bed:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E2/LR_Bed.LR_Bed:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_LR_Bed\"\nmsgid \"I really couldn’t sleep that night.\"\nmsgstr \"I really couldn’t sleep that night.\"\n\n#. Key:\t344E65304BB63905D487CCAF191DFE95\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LR_Chest.LR_Chest:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Ending/E2/LR_Chest.LR_Chest:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_LR_Chest\"\nmsgid \"It was half past eleven.\"\nmsgstr \"It was half past eleven.\"\n\n#. Key:\t5DD659BE428981065F3A989D284C3542\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LR_Chest.LR_Chest:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E2/LR_Chest.LR_Chest:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_LR_Chest\"\nmsgid \"I took the key.\"\nmsgstr \"I took the key.\"\n\n#. Key:\tF21CEE6143FD904B2285F9BEE01174A0\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LR_Chest.LR_Chest:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E2/LR_Chest.LR_Chest:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_LR_Chest\"\nmsgid \"Daddy didn’t like if I went out in the night but I felt something calling for me.\"\nmsgstr \"Daddy didn’t like if I went out in the night but I felt something calling for me.\"\n\n#. Key:\t8B18714145E8614E70F531BDB1A2AAAB\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LR_Door.LR_Door:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E2/LR_Door.LR_Door:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_LR_Door\"\nmsgid \"I always locked the door just to make sure I won’t sleep walk out.\"\nmsgstr \"I always locked the door just to make sure I won’t sleep walk out.\"\n\n#. Key:\tE5B14EEE4719891E2D2493A4E793A2C4\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LR_Door.LR_Door:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Ending/E2/LR_Door.LR_Door:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_LR_Door\"\nmsgid \"I opened the door.\"\nmsgstr \"I opened the door.\"\n\n#. Key:\tF8090D7B4DCD959D7893338BDA2B6256\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LR_Door.LR_Door:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E2/LR_Door.LR_Door:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_LR_Door\"\nmsgid \"I hid the key under the clock.\"\nmsgstr \"I hid the key under the clock.\"\n\n#. Key:\t8363A3C9426FA1F007A5E783B1D72171\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LR_Notebook.LR_Notebook:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E2/LR_Notebook.LR_Notebook:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_LR_Notebook\"\nmsgid \"Here I collected all my less scientific notes on the Ruined Realm.\"\nmsgstr \"Here I collected all my less scientific notes on the Ruined Realm.\"\n\n#. Key:\tA0B131B34A29BEADA3E3CDB74C7EDBCA\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LR_Notebook.LR_Notebook:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Ending/E2/LR_Notebook.LR_Notebook:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_LR_Notebook\"\nmsgid \"They deserve to be remembered. I will miss them.\"\nmsgstr \"They deserve to be remembered. I will miss them.\"\n\n#. Key:\tB66C98C34782719B5CF6F19F608C00F0\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LR_Notebook.LR_Notebook:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E2/LR_Notebook.LR_Notebook:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_LR_Notebook\"\nmsgid \"So many lovely people! Despite their madness.\"\nmsgstr \"So many lovely people! Despite their madness.\"\n\n#. Key:\t0DAF7BA0480BDF56BC47A7826A5186C2\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LR_TabbyBed.LR_TabbyBed:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E2/LR_TabbyBed.LR_TabbyBed:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_LR_TabbyBed\"\nmsgid \"Sometimes I wished there could be a place like that for me as well.\"\nmsgstr \"Sometimes I wished there could be a place like that for me as well.\"\n\n#. Key:\t6084018D4E86CF2ACA89219824C8F776\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LR_TabbyBed.LR_TabbyBed:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Ending/E2/LR_TabbyBed.LR_TabbyBed:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_LR_TabbyBed\"\nmsgid \"As usually Tabby was out there maybe hunting or just hanging out with other cats.\"\nmsgstr \"As usually Tabby was out there maybe hunting or just hanging out with other cats.\"\n\n#. Key:\t9702175346DD6BD2CBDB9C8D23460866\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LR_TabbyBed.LR_TabbyBed:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E2/LR_TabbyBed.LR_TabbyBed:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_LR_TabbyBed\"\nmsgid \"In this World, he was normal.\"\nmsgstr \"In this World, he was normal.\"\n\n#. Key:\t018B13FB403C2E979380C68B92CC1E46\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LR_Window.LR_Window:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Ending/E2/LR_Window.LR_Window:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_LR_Window\"\nmsgid \"Yet sometimes I liked to watch other kids playing in the castle garden.\"\nmsgstr \"Yet sometimes I liked to watch other kids playing in the castle garden.\"\n\n#. Key:\t15454EFF40C99A479173E294B612C66C\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LR_Window.LR_Window:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E2/LR_Window.LR_Window:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_LR_Window\"\nmsgid \"They didn’t understand how important my task was.\"\nmsgstr \"They didn’t understand how important my task was.\"\n\n#. Key:\t4460452B4A8B40C59075779751D3D760\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LR_Window.LR_Window:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Ending/E2/LR_Window.LR_Window:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_LR_Window\"\nmsgid \"I didn’t leave the castle since Mom died.\"\nmsgstr \"I didn’t leave the castle since Mom died.\"\n\n#. Key:\t795D92CB49E6F50CE37897A793C6A711\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LR_Window.LR_Window:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Ending/E2/LR_Window.LR_Window:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_LR_Window\"\nmsgid \"Two years passed and they still didn’t give up throwing balls on the window to get my attention.\"\nmsgstr \"Two years passed and they still didn’t give up throwing balls on the window to get my attention.\"\n\n#. Key:\tB1A689B24F5D77A715114AB718126A75\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LR_Window.LR_Window:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E2/LR_Window.LR_Window:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_LR_Window\"\nmsgid \"They will never understand.\"\nmsgstr \"They will never understand.\"\n\n#. Key:\t06B2BD844B477A747E086F9F0C3BCAFE\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"Well, that fountain is definitely not your cup of tea but you can accept that it might be the fairest for the Magic Mirror...\"\nmsgstr \"Well, that fountain is definitely not your cup of tea but you can accept that it might be the fairest for the Magic Mirror...\"\n\n#. Key:\t264C2C1040339F9680CA129F4E6E7764\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_65.Children(0).Children.Text\n#. Key:\t608D4BF341FEE76F239D6BA3B34F65E7\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_1.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_1.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_65.Children(0).Children.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"Who is the fairest?\"\nmsgstr \"Who is the fairest?\"\n\n#. Key:\t2C246C1326080F0A003A03BBBE7E9F40\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_39.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_39.Children(1).Children.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"Wish something\"\nmsgstr \"Wish something\"\n\n#. Key:\t2C6C88C54439E3C689E86DB30560B807\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_66.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_66.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"No matter how hard you try to receive a sign, the Mirror remains silent. It doesn't show you anything this time.\"\nmsgstr \"No matter how hard you try to receive a sign, the Mirror remains silent. It doesn't show you anything this time.\"\n\n#. Key:\t317248C14F0904B6E6B04080841C75D1\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_39.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_39.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"The water seems to be boiling and the bubbles pop when they hit the surface; it is indeed mesmerizing. Suddenly, something breaks the silence - you can hear whispers.\"\nmsgstr \"The water seems to be boiling and the bubbles pop when they hit the surface; it is indeed mesmerizing. Suddenly, something breaks the silence - you can hear whispers.\"\n\n#. Key:\t372D97104DC7D67AF4B2409B7CBC602D\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_66.Children(0).Children.Text\n#. Key:\t432E8D794C2FB271D9B39283EBD9E33B\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_1.Children(2).Children.Text\n#. Key:\tF212015B402EF862C9869394531175DC\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_65.Children(2).Children.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_1.Children(2).Children.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_65.Children(2).Children.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_66.Children(0).Children.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"Leave\"\nmsgstr \"Leave\"\n\n#. Key:\t3FBF959348F2AFFA8016AA9371DD0800\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"You politely explain that you want to see your past instead of your body, but the Mirror is stubbornly stuck on this image.\"\nmsgstr \"You politely explain that you want to see your past instead of your body, but the Mirror is stubbornly stuck on this image.\"\n\n#. Key:\t4620F3E84D5DC9847AB8A8891CF66F20\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_67.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_67.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"You place the flower and wait to see what happens.\"\nmsgstr \"You place the flower and wait to see what happens.\"\n\n#. Key:\t5C2363C64023EB8E1705D3BFC3310A8A\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_65.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_65.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"The vision fades away.\"\nmsgstr \"The vision fades away.\"\n\n#. Key:\t648780E44EF4F6587D31E7AE2BE4CCE4\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_68.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_68.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"The Mirror seems to be unavailable at the moment. It doesn't want to be bothered. Maybe you should return later.\"\nmsgstr \"The Mirror seems to be unavailable at the moment. It doesn't want to be bothered. Maybe you should return later.\"\n\n#. Key:\t74CAAA1D4671A258A6D188BCED32CCBD\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_69.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_69.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"The water turns still. Deep under the surface you notice a glimmering light.\"\nmsgstr \"The water turns still. Deep under the surface you notice a glimmering light.\"\n\n#. Key:\t7CD8BEEA40A36A22057920807BBEEC07\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"The Magic Mirror shows things that were, things that are, and things that yet may be. \\r\\nYou fill the basin with water and start contemplating. You meditate about...\"\nmsgstr \"The Magic Mirror shows things that were, things that are, and things that yet may be. \\r\\nYou fill the basin with water and start contemplating. You meditate about...\"\n\n#. Key:\t8226F9B3495DE20F137F95A7F3583FE0\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"Ruin left this place almost untouched. The street lamps spread light on a couple of metal benches and flower pots.\"\nmsgstr \"Ruin left this place almost untouched. The street lamps spread light on a couple of metal benches and flower pots.\"\n\n#. Key:\t82C33F1E49C5DC76BF19648A414F7209\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"You are watching the ball and start to get frustrated. You don't want to look at this body replacement... this raggy shell... You want answers!\"\nmsgstr \"You are watching the ball and start to get frustrated. You don't want to look at this body replacement... this raggy shell... You want answers!\"\n\n#. Key:\t8F94D5E34488ECDCE9E051BB1ABE66B9\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_1.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_1.Children(1).Children.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"Who you were in the past\"\nmsgstr \"Who you were in the past\"\n\n#. Key:\t9BA86AAD4282A943E8A57390E2C4E3CF\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_39.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_39.Children(0).Children.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"Floating Flower\"\nmsgstr \"Floating Flower\"\n\n#. Key:\tA8A6D8D44F9344A162FAA080C839B28A\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"There are glass shards all over the place. There's a ball on the floor next to the girl.\"\nmsgstr \"There are glass shards all over the place. There's a ball on the floor next to the girl.\"\n\n#. Key:\tAF212CEC43A56245A848DABD21ECBAFC\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_70.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_70.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"You reach for the light and your fingers grab onto something smooth and cold.\"\nmsgstr \"You reach for the light and your fingers grab onto something smooth and cold.\"\n\n#. Key:\tB8E2A52B442F3B45A1D993A8548DE124\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"You are seeing the wizard's room once more. There is a weakened little girl lying on the floor in the middle of the room. She is surrounded by stone runes, candles and magical potions.\"\nmsgstr \"You are seeing the wizard's room once more. There is a weakened little girl lying on the floor in the middle of the room. She is surrounded by stone runes, candles and magical potions.\"\n\n#. Key:\tB9217F85404B488DB6F4DDACFF2B824C\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_65.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_65.Children(1).Children.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"What you were before\"\nmsgstr \"What you were before\"\n\n#. Key:\tCD33272B416D2FDE283D44BA6F50475C\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"The image zooms in and you have a clearer view of the fountain. You are waiting for more, but nothing happens.\"\nmsgstr \"The image zooms in and you have a clearer view of the fountain. You are waiting for more, but nothing happens.\"\n\n#. Key:\tD64B38F1470B27D21AE539AE80AE666A\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"You are seeing the Ruined Realm from afar. The view gets closer until you find yourself looking at the top of a tower.\"\nmsgstr \"You are seeing the Ruined Realm from afar. The view gets closer until you find yourself looking at the top of a tower.\"\n\n#. Key:\tF3C496794CC4A68DDC764895FF2DFC77\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_72.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_72.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"You found a precious rune stone! Hmmm...Is this the gift offered by the Mirror in exchange for your enchanting flower?\"\nmsgstr \"You found a precious rune stone! Hmmm...Is this the gift offered by the Mirror in exchange for your enchanting flower?\"\n\n#. Key:\t10A6FAE44F71FBB21522B1AAE5E20DAE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_29.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_29.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"I don’t care what happens here after I’m back home.\"\nmsgstr \"I don’t care what happens here after I’m back home.\"\n\n#. Key:\t12C6550D4143AFE12C6986B427D2927A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"He can’t release his daughter. He can’t accept that she is gone. He wants to get her back even if it means they all die after a few months...\"\nmsgstr \"He can’t release his daughter. He can’t accept that she is gone. He wants to get her back even if it means they all die after a few months...\"\n\n#. Key:\t1C714E474408001FB67CEABF92FAB019\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Wait! You can’t just dis...\"\nmsgstr \"Wait! You can’t just dis...\"\n\n#. Key:\t209B77394D419812DD1BD7A3D7A92B94\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_39.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_39.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"All right and what can we do against it?\"\nmsgstr \"All right and what can we do against it?\"\n\n#. Key:\t209BF95E4275418CE020E3AB028AFC10\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Now it’s better.\"\nmsgstr \"Now it’s better.\"\n\n#. Key:\t230C6ED4416FDD6C5E00FAB8B30FBB17\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"To be honest I don’t have the faintest idea. I just want to be free again.\"\nmsgstr \"To be honest I don’t have the faintest idea. I just want to be free again.\"\n\n#. Key:\t25227AB342F4A0E76082539072C1143D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_37.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_37.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Do you think Ruin will stop after swallowing the Human Realm?\"\nmsgstr \"Do you think Ruin will stop after swallowing the Human Realm?\"\n\n#. Key:\t266261C240DB77D1306C5F8EEE3D0189\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"He says he wants his daughter back but I think he is still trying to close the Realm to stop Ruin.\"\nmsgstr \"He says he wants his daughter back but I think he is still trying to close the Realm to stop Ruin.\"\n\n#. Key:\t283810E04DE48471FBE6BD9BE9DD337D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Yet he doesn’t care about the World. He wants to get her back even if it means they all die after a few months...\"\nmsgstr \"Yet he doesn’t care about the World. He wants to get her back even if it means they all die after a few months...\"\n\n#. Key:\t2CE94F19412379ECE927A3AEEEAC3756\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_1.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_1.Children(1).Children.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Thanks for the Soulcaster\"\nmsgstr \"Thanks for the Soulcaster\"\n\n#. Key:\t2DB5F39F45BB9EC8ABBFEA9020DF94E7\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Why should it concern me if Ruin destroys your Realm? You deserve it for summoning us to do the hard work.\"\nmsgstr \"Why should it concern me if Ruin destroys your Realm? You deserve it for summoning us to do the hard work.\"\n\n#. Key:\t30E5A67B4135A5402AE021832F89D4D1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"You again? I told you if you want something from the Wizard go and find him yourself...\"\nmsgstr \"You again? I told you if you want something from the Wizard go and find him yourself...\"\n\n#. Key:\t34BCB98247406A77FB5A5C8942543588\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_38.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_38.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"It might take time but it will reach the Unknown Realm and all the spirits will become part of Ruin just like those who were summoned here.\"\nmsgstr \"It might take time but it will reach the Unknown Realm and all the spirits will become part of Ruin just like those who were summoned here.\"\n\n#. Key:\t379B50904FB774AD057BBB810BDD445C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_41.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_41.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"I’m not sure. I will think about it.\"\nmsgstr \"I’m not sure. I will think about it.\"\n\n#. Key:\t38BEECF94D2EB7B2C6596593E576A360\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_30.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_30.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"The Wizard created a device which can separate the Realms. This is the only way to stop Ruin from spreading.\"\nmsgstr \"The Wizard created a device which can separate the Realms. This is the only way to stop Ruin from spreading.\"\n\n#. Key:\t3D7B856A4D97FCCC2A2B89BCB6295471\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"This time I would like to talk to you...\"\nmsgstr \"This time I would like to talk to you...\"\n\n#. Key:\t40A329C7465166A11C73B694D6A79A00\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_12.Children(2).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_12.Children(2).Children.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Don’t know\"\nmsgstr \"Don’t know\"\n\n#. Key:\t4D356117496E625B6B4C64A611496A9F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_24.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_24.Children(1).Children.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Not my problem\"\nmsgstr \"Not my problem\"\n\n#. Key:\t4FE5ADF04D1079CCD1E16697E82B39B5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_35.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_35.Children(0).Children.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Accept plan\"\nmsgstr \"Accept plan\"\n\n#. Key:\t53D6055344A880433B1093B029DA8CA5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_12.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_12.Children(0).Children.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Bring back daughter\"\nmsgstr \"Bring back daughter\"\n\n#. Key:\t599FF022411F5BA2EB0F32A1F947C661\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_35.Children(2).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_35.Children(2).Children.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Not sure\"\nmsgstr \"Not sure\"\n\n#. Key:\t5FD6018040C38B8A3F40C78C913AC251\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_40.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_40.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Have no fear, I will have this done!\"\nmsgstr \"Have no fear, I will have this done!\"\n\n#. Key:\t6B3585BA4AFE614FF428FCAE698872A8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_33.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_33.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"For you this would be completely different. For you this is not a sacrifice but a way of going home!\"\nmsgstr \"For you this would be completely different. For you this is not a sacrifice but a way of going home!\"\n\n#. Key:\t6E1C94F24F493D7075A7509F8181AD27\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"You are wrong. The World is falling apart yet he doesn’t care about it even when he is the only one who could stop Ruin.\"\nmsgstr \"You are wrong. The World is falling apart yet he doesn’t care about it even when he is the only one who could stop Ruin.\"\n\n#. Key:\t71A64B804C0CCE26571E9E8237AA5000\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"I’m also glad. It was bloody damn difficult.\"\nmsgstr \"I’m also glad. It was bloody damn difficult.\"\n\n#. Key:\t78305AE64B56098D32806EB509133BBC\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_35.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_35.Children(1).Children.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Decline plan\"\nmsgstr \"Decline plan\"\n\n#. Key:\t7C92B8BF4CEA3093BB817682B501DC67\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"The World is falling apart and only the Wizard has a chance to stop this.\"\nmsgstr \"The World is falling apart and only the Wizard has a chance to stop this.\"\n\n#. Key:\t8B2CE8144EB2A7C89AFA1BACC3EE1B88\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Hello, little Wanderer! I’m glad you made it this far.\"\nmsgstr \"Hello, little Wanderer! I’m glad you made it this far.\"\n\n#. Key:\t8CC98B374125E6E6A6A20C97F4A3B067\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_24.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_24.Children(0).Children.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"I'm a demon\"\nmsgstr \"I'm a demon\"\n\n#. Key:\t8D4701A1469997CBC879788351B37B0A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_31.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_31.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"My plan is simple.\"\nmsgstr \"My plan is simple.\"\n\n#. Key:\t8E4693F04E60AFF4757A5887973894BE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_27.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_27.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"I saw Ruin and I don’t want the same to happen to any other Realm. What can I do?\"\nmsgstr \"I saw Ruin and I don’t want the same to happen to any other Realm. What can I do?\"\n\n#. Key:\t9193CB2747033644F006809E0E4A812A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_45.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_45.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"For the sake of all Realms I hope you will make the right decision.\"\nmsgstr \"For the sake of all Realms I hope you will make the right decision.\"\n\n#. Key:\t95D6FBCC42CC4F4041D0B5B64996FD5C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_35.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_35.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Once you are there find the Laboratory and activate the device! It will take you home and will separate the Worlds which means no spirit will be ever summoned again!\"\nmsgstr \"Once you are there find the Laboratory and activate the device! It will take you home and will separate the Worlds which means no spirit will be ever summoned again!\"\n\n#. Key:\t9ADEF37F49EA90EF320B5E8BB2D8D769\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"...and I don’t want our conversation to be overheard, so if you don’t mind...\"\nmsgstr \"...and I don’t want our conversation to be overheard, so if you don’t mind...\"\n\n#. Key:\t9F01EFC54F3FC5B709F697860BE0572D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_24.Children(2).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_24.Children(2).Children.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"How to save the World?\"\nmsgstr \"How to save the World?\"\n\n#. Key:\tA71226674132E2666925AEB28D2FC024\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_46.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_46.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Farewell Wanderer!\"\nmsgstr \"Farewell Wanderer!\"\n\n#. Key:\tB1E3A9DB4A75C08067DCA19113A6A8A2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Calm down little spirit.\"\nmsgstr \"Calm down little spirit.\"\n\n#. Key:\tB355BD604F9EC22514DA14B64B0F5E5E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_43.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_43.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Thank you Spirit! For the sake of all Realms I hope you won’t fail on your way!\"\nmsgstr \"Thank you Spirit! For the sake of all Realms I hope you won’t fail on your way!\"\n\n#. Key:\tB6D3E23045C4BC5B3E5F3D83E2DFBADB\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_19.Text\n#. Key:\tDC3219914721210BD169D2989F03D18D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"But we won’t let this happen, will we?\"\nmsgstr \"But we won’t let this happen, will we?\"\n\n#. Key:\tBAC828A540E6C81EE43EBF8036A8146A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_42.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_42.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"You deserve Ruin. I won’t save the Human Realm!\"\nmsgstr \"You deserve Ruin. I won’t save the Human Realm!\"\n\n#. Key:\tC837CED4495F79594133F4B2C0FCE5F8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Where shall I start? Do you know what the Wizard is up to? Did he tell you?\"\nmsgstr \"Where shall I start? Do you know what the Wizard is up to? Did he tell you?\"\n\n#. Key:\tD060173B4D5502FC06A69E865DAFD5E6\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_26.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_26.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"This is not my Realm and not my problem. All I want is to get out of here.\"\nmsgstr \"This is not my Realm and not my problem. All I want is to get out of here.\"\n\n#. Key:\tD520C3AC46F62B77554443A4589845C1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"He would like to bring his daughter back to life. For that he needs three artefacts which are somewhere here.\"\nmsgstr \"He would like to bring his daughter back to life. For that he needs three artefacts which are somewhere here.\"\n\n#. Key:\tD7F841B14E18D77AB5FBD2A34D59BC92\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_44.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_44.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"I understand your fury. Yet I hope you will change your mind.\"\nmsgstr \"I understand your fury. Yet I hope you will change your mind.\"\n\n#. Key:\tD80B81914A550F305934F9852C1DD6B0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_23.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_23.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"He lost his daughter and he can’t release her. He can’t accept that she is gone.\"\nmsgstr \"He lost his daughter and he can’t release her. He can’t accept that she is gone.\"\n\n#. Key:\tD816A79E4160BC4426CD22A63C7987A0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Before you go on I have something to discuss with you...\"\nmsgstr \"Before you go on I have something to discuss with you...\"\n\n#. Key:\tDD870754471358DEFE9CB5BFA554AB7C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_1.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_1.Children(0).Children.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Me too\"\nmsgstr \"Me too\"\n\n#. Key:\tE0CCA2604AA40FED355A859A1FA02DDA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_1.Children(2).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_1.Children(2).Children.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"I won’t deliver any message\"\nmsgstr \"I won’t deliver any message\"\n\n#. Key:\tE1C3F2E34680BA8B67521C905AD42ADA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"That’s correct. He can’t release his daughter. He can’t accept that she is gone.\"\nmsgstr \"That’s correct. He can’t release his daughter. He can’t accept that she is gone.\"\n\n#. Key:\tE93136104181FAA899F2CE801497DCBA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_25.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_25.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"I know right now it doesn’t look that way, but I’m a mighty demon of the Unknown Realm.\"\nmsgstr \"I know right now it doesn’t look that way, but I’m a mighty demon of the Unknown Realm.\"\n\n#. Key:\tEC116A8848A471EB2C5DC8BA1D187C9A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_12.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_12.Children(1).Children.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Close Ruined Realm\"\nmsgstr \"Close Ruined Realm\"\n\n#. Key:\tEC6221CE4B85E7D1887DBCA6D85D8238\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"It wasn’t easy but I made good use of the Spellcaster you gave me.\"\nmsgstr \"It wasn’t easy but I made good use of the Spellcaster you gave me.\"\n\n#. Key:\tED5356DE42F2ED2203F7AFB30231643E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_34.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_34.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"When you deliver the artefacts he will let you into his tower.\"\nmsgstr \"When you deliver the artefacts he will let you into his tower.\"\n\n#. Key:\tEE78AD4147800BD0E160A8B6A3F51FBD\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_32.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_32.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"When the Wizard’s daughter activated the device it transported her soul into the Unknown Realm. At that point the Wizard stopped the device so that he can summon his daughter back.\"\nmsgstr \"When the Wizard’s daughter activated the device it transported her soul into the Unknown Realm. At that point the Wizard stopped the device so that he can summon his daughter back.\"\n\n#. Key:\tEFACA50447BAC08293281BB11A5E11B3\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_36.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_36.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"This is just as much your problem as it is mine.\"\nmsgstr \"This is just as much your problem as it is mine.\"\n\n#. Key:\tFB0E702746132A3C688D9EA492A01B50\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"You made it and that is what matters.\"\nmsgstr \"You made it and that is what matters.\"\n\n#. Key:\t4BE3EE734EFED241B7FA2192EEB146A5\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/MR_Bed.MR_Bed:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Ending/E2/MR_Bed.MR_Bed:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_MR_Bed\"\nmsgid \"We always wore colourful clothes because that made her happy.\"\nmsgstr \"We always wore colourful clothes because that made her happy.\"\n\n#. Key:\t7F5F069D4E9C7F15ED2B8CA45154FCFE\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/MR_Bed.MR_Bed:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E2/MR_Bed.MR_Bed:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_MR_Bed\"\nmsgid \"Most of her time she just lied here and stared at nothing.\"\nmsgstr \"Most of her time she just lied here and stared at nothing.\"\n\n#. Key:\tEA25DBC34832960AB03A32A5B08AC404\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/MR_Bed.MR_Bed:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E2/MR_Bed.MR_Bed:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_MR_Bed\"\nmsgid \"Sometimes she talked about grey lands.\"\nmsgstr \"Sometimes she talked about grey lands.\"\n\n#. Key:\t58E06C3A45DD46A34F155BAA62933039\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/MR_Chair.MR_Chair:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Ending/E2/MR_Chair.MR_Chair:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_MR_Chair\"\nmsgid \"I hope they will never find out how wrong they were. I hope there is still time for our World.\"\nmsgstr \"I hope they will never find out how wrong they were. I hope there is still time for our World.\"\n\n#. Key:\t9EA75B664E62ABF38E44BE8DC3050AC9\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/MR_Chair.MR_Chair:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E2/MR_Chair.MR_Chair:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_MR_Chair\"\nmsgid \"This is where the doctor used to sit. He never believed that Mom was infected by the Ruin.\"\nmsgstr \"This is where the doctor used to sit. He never believed that Mom was infected by the Ruin.\"\n\n#. Key:\tA408630F44A3B2345A2D0AA8395D97F2\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/MR_Chair.MR_Chair:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E2/MR_Chair.MR_Chair:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_MR_Chair\"\nmsgid \"No one ever believed in Ruin.\"\nmsgstr \"No one ever believed in Ruin.\"\n\n#. Key:\t1AFEF7EB49BB3BEA5BB76793A60ED7C9\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/MR_Lamps.MR_Lamps:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E2/MR_Lamps.MR_Lamps:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_MR_Lamps\"\nmsgid \"This room was the brightest in the castle.\"\nmsgstr \"This room was the brightest in the castle.\"\n\n#. Key:\tC132BEA446B4441615D7029E8AA5BBB5\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/MR_Lamps.MR_Lamps:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E2/MR_Lamps.MR_Lamps:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_MR_Lamps\"\nmsgid \"I took some oil.\"\nmsgstr \"I took some oil.\"\n\n#. Key:\tFE826997431A2665AC2788A62558B88E\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/MR_Lamps.MR_Lamps:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Ending/E2/MR_Lamps.MR_Lamps:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_MR_Lamps\"\nmsgid \"Father bought some exotic lamp oil so that we had coloured lights.\"\nmsgstr \"Father bought some exotic lamp oil so that we had coloured lights.\"\n\n#. Key:\t430A10B04FAC9288EC2794A31DF6699E\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/MR_Paintings.MR_Paintings:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E2/MR_Paintings.MR_Paintings:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_MR_Paintings\"\nmsgid \"Mom was always fond of art.\"\nmsgstr \"Mom was always fond of art.\"\n\n#. Key:\t53AA7E134FA0E30F37FC8CB50425520F\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/MR_Paintings.MR_Paintings:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E2/MR_Paintings.MR_Paintings:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_MR_Paintings\"\nmsgid \"After she got sick she couldn’t paint the way she did before yet she still liked it.\"\nmsgstr \"After she got sick she couldn’t paint the way she did before yet she still liked it.\"\n\n#. Key:\t8484045A4107378E9CC8FFAA02C94A87\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/MR_Paintings.MR_Paintings:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Ending/E2/MR_Paintings.MR_Paintings:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_MR_Paintings\"\nmsgid \"It could engage her for hours.\"\nmsgstr \"It could engage her for hours.\"\n\n#. Key:\t009BF08145DBE86FFB07BA9A6BD77A8E\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_5.Children(2).Children.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_5.Children(2).Children.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"Not my business\"\nmsgstr \"Not my business\"\n\n#. Key:\t00DE9BE1446C5D5C0D62469B41A1B693\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_5.Children(0).Children.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_5.Children(0).Children.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"Lillian?\"\nmsgstr \"Lillian?\"\n\n#. Key:\t0C3B729C4618E8A817F019B8E916425B\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"Maybe we failed the ritual again and summoned another of your kind.\"\nmsgstr \"Maybe we failed the ritual again and summoned another of your kind.\"\n\n#. Key:\t0CAC15144B37144A99A9EB9D13CCC9DE\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_32.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_32.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"What do you expect me to do, Spirit?\"\nmsgstr \"What do you expect me to do, Spirit?\"\n\n#. Key:\t1493C597483503024A3C5CA8F0FA1327\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"I’ve already done way too much for you.\"\nmsgstr \"I’ve already done way too much for you.\"\n\n#. Key:\t15BAD73D49BF7C62469D8E9CD0B2AAF4\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"Now, take me home!\"\nmsgstr \"Now, take me home!\"\n\n#. Key:\t1962A69C42E8FDD365AFC9AB626605F7\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"We made the spell... and it worked!\"\nmsgstr \"We made the spell... and it worked!\"\n\n#. Key:\t1AC8DD104163078CA72065A0B43B5C57\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"And then what?\"\nmsgstr \"And then what?\"\n\n#. Key:\t2034A3164695766F8C17B69CD0937C02\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_25.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_25.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"And he...\"\nmsgstr \"And he...\"\n\n#. Key:\t22668011432DEF65ACF29793FF234E07\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_37.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_37.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"Someone like me...\"\nmsgstr \"Someone like me...\"\n\n#. Key:\t2386A8D24BD256982D486AAF71B57ABD\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_23.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_23.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"She destroyed half of the room before we could even cast a spell.\"\nmsgstr \"She destroyed half of the room before we could even cast a spell.\"\n\n#. Key:\t250E11A440445CAFB5252A92C5100735\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"That’s how you handle situations like these...\"\nmsgstr \"That’s how you handle situations like these...\"\n\n#. Key:\t298BEA5646602444742C3BAD65866EF9\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"I’m not sure... Everything happened so fast.\"\nmsgstr \"I’m not sure... Everything happened so fast.\"\n\n#. Key:\t2FAFABFC43A75D29B671739D16759E43\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"What happened?\"\nmsgstr \"What happened?\"\n\n#. Key:\t303D9BF54AB3034565A45594AB5636DF\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"I can’t... I’m sorry!\"\nmsgstr \"I can’t... I’m sorry!\"\n\n#. Key:\t378D7F984C821E23AF0CBEA7D24EFCC1\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"What happened to Lillian? Has she returned?\"\nmsgstr \"What happened to Lillian? Has she returned?\"\n\n#. Key:\t38EF0908448C7E5298C4F496DACAD5AD\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"Something... arrgh... something went wrong...\"\nmsgstr \"Something... arrgh... something went wrong...\"\n\n#. Key:\t3A328FA74AA2FBC2AFE84CA195DAE236\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"You are Raven’s master...\"\nmsgstr \"You are Raven’s master...\"\n\n#. Key:\t462226704638D0C32B1DEBA3DFE138A1\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"She was taken over by a wicked force and she unleashed boundless spells.\"\nmsgstr \"She was taken over by a wicked force and she unleashed boundless spells.\"\n\n#. Key:\t49B5501A4917D23E6B3B99B430076ABA\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"It was like the devil itself.\"\nmsgstr \"It was like the devil itself.\"\n\n#. Key:\t4B173FBD4D4F48A468016BB055CC573C\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"Where is Wizard? Something happened to him?\"\nmsgstr \"Where is Wizard? Something happened to him?\"\n\n#. Key:\t5341F61045AA32F212173EA9CAB67695\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_39.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_39.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"Wizard was right when he decided to trust you.\"\nmsgstr \"Wizard was right when he decided to trust you.\"\n\n#. Key:\t551AEBA64D1E99B2CCFA3DB13E168A02\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_27.Children(1).Children.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_27.Children(1).Children.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"I won’t fight\"\nmsgstr \"I won’t fight\"\n\n#. Key:\t592A8CF045DF1BD875B05F9493FE2BB4\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_38.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_38.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"I will face her!\"\nmsgstr \"I will face her!\"\n\n#. Key:\t5B65F12D43B12FA943D7469FEE2CE2E0\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"We made everything right...\"\nmsgstr \"We made everything right...\"\n\n#. Key:\t65A974C344D2B4DD644901994086A31D\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_30.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_30.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"Why is it that every time you refuse to face the consequences of your actions, it is me who needs to clean up your mess?\"\nmsgstr \"Why is it that every time you refuse to face the consequences of your actions, it is me who needs to clean up your mess?\"\n\n#. Key:\t66D0FDF04AF5351330E83080759ED974\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_40.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_40.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"I'm sorry that I can't help...\"\nmsgstr \"I'm sorry that I can't help...\"\n\n#. Key:\t7FFE18B74C54BB92334399983F82DBCA\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_34.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_34.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"You are free to do whatever you want!\"\nmsgstr \"You are free to do whatever you want!\"\n\n#. Key:\t8739EB3D48E4F2A997E604A60F7F32B3\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"Was it trapped inside a teddy bear?\"\nmsgstr \"Was it trapped inside a teddy bear?\"\n\n#. Key:\t8E2F09164340534A484A46AD45E4E105\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_27.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_27.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"The demon-Lillian left. There is no one who could stop her now...\"\nmsgstr \"The demon-Lillian left. There is no one who could stop her now...\"\n\n#. Key:\t900D084E4F673FEBEACE3E916103B93E\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"She had fire in her eyes...\"\nmsgstr \"She had fire in her eyes...\"\n\n#. Key:\t91C26C314425AB8C973F1FB54061F639\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"Lillian woke up and then...\"\nmsgstr \"Lillian woke up and then...\"\n\n#. Key:\t95CE9C6C4901E613AD5DB38E51AC0DB3\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_35.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_35.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"Leave and let me rest in peace...\"\nmsgstr \"Leave and let me rest in peace...\"\n\n#. Key:\t9AF3E069409F31E4F50A5990A416A39C\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_19.Children(1).Children.Text\n#. Key:\tF5A670D640D73DF452C02A948CB68F75\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_5.Children(1).Children.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_19.Children(1).Children.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_5.Children(1).Children.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"Wizard?\"\nmsgstr \"Wizard?\"\n\n#. Key:\t9B1B8322442B6D7D76F2119E0A0574FA\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"Is the Wizard safe? What happened afterwards?\"\nmsgstr \"Is the Wizard safe? What happened afterwards?\"\n\n#. Key:\tA82789354D984476223432A2BE199293\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_24.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_24.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"I was hit by the table.\"\nmsgstr \"I was hit by the table.\"\n\n#. Key:\tAA6EFD044C1D21008EEA189DE75740E7\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_41.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_41.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"Good luck with... everything!\"\nmsgstr \"Good luck with... everything!\"\n\n#. Key:\tACAF3D904A149C0E9F91E5AC852D8309\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_31.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_31.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"Let me go!\"\nmsgstr \"Let me go!\"\n\n#. Key:\tB223647F4C35858A62A5509C7B22C23B\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_27.Children(0).Children.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_27.Children(0).Children.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"I'll stop her\"\nmsgstr \"I'll stop her\"\n\n#. Key:\tD0E16FEF4D5415EC6D2C299252E5675D\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_26.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_26.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"He was burnt to ashes.\"\nmsgstr \"He was burnt to ashes.\"\n\n#. Key:\tD23076F4475E6CE385ECB2B3B2749CA9\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_36.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_36.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"I have always wanted to meet someone of my own kind anyway.\"\nmsgstr \"I have always wanted to meet someone of my own kind anyway.\"\n\n#. Key:\tD290445E4EB74446478970934785BA10\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"I can’t open a Gate without Wizard...\"\nmsgstr \"I can’t open a Gate without Wizard...\"\n\n#. Key:\tD6EB1BE248E9C483E6D94B8E8A7815F6\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"I don't understand... It is...\"\nmsgstr \"I don't understand... It is...\"\n\n#. Key:\tEC42D62E46269139E9E69B876EDED5B1\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_33.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_33.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"It wasn't me who brought you here.\"\nmsgstr \"It wasn't me who brought you here.\"\n\n#. Key:\tF0711D5F4698DAA99E484E94FDB3EF9C\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_19.Children(0).Children.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_19.Children(0).Children.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"Was it trapped?\"\nmsgstr \"Was it trapped?\"\n\n#. Key:\tFDE62A034456071EFE9639B73108BB1E\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"I can't let her destroy everything!\"\nmsgstr \"I can't let her destroy everything!\"\n\n#. Key:\tFDFD2B2B4352B564118519874199B48C\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_29.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_29.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"No-no-no!\"\nmsgstr \"No-no-no!\"\n\n#. Key:\t2E3C904D458640A4F06DD793B416366A\n#. SourceLocation:\t/Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_SewerCreatures\"\nmsgid \"All right, I will return when I'm done.\"\nmsgstr \"All right, I will return when I'm done.\"\n\n#. Key:\t41F6B75041803A654088469BCB887165\n#. SourceLocation:\t/Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_1.Children(0).Children.Text\n#: /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_1.Children(0).Children.Text\nmsgctxt \"Dialogue_SewerCreatures\"\nmsgid \"Really?\"\nmsgstr \"Really?\"\n\n#. Key:\t43EE0E60407CA7CB7431BDB2767C6E19\n#. SourceLocation:\t/Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_SewerCreatures\"\nmsgid \"That's sad. What happened exactly?\"\nmsgstr \"That's sad. What happened exactly?\"\n\n#. Key:\t53AC225B4F21B68CAC6F8997F324124E\n#. SourceLocation:\t/Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_29.Text\n#: /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_29.Text\nmsgctxt \"Dialogue_SewerCreatures\"\nmsgid \"Farewell until we meet again!\"\nmsgstr \"Farewell until we meet again!\"\n\n#. Key:\t5ED0CE6143EC50E6B5A1289D1A9A88E2\n#. SourceLocation:\t/Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_SewerCreatures\"\nmsgid \"I'm glad I could help.\"\nmsgstr \"I'm glad I could help.\"\n\n#. Key:\t65042BC342E9717229E74A9DD272DC5F\n#. SourceLocation:\t/Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_SewerCreatures\"\nmsgid \"It was nice to see you again.\"\nmsgstr \"It was nice to see you again.\"\n\n#. Key:\t77959A144131C47488B221ADD9B1E13B\n#. SourceLocation:\t/Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_SewerCreatures\"\nmsgid \"Don't worry! I'm still looking for it.\"\nmsgstr \"Don't worry! I'm still looking for it.\"\n\n#. Key:\t7914F3CA40844C2A13A760BB0DAE1BFA\n#. SourceLocation:\t/Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_SewerCreatures\"\nmsgid \"I don't have time for you creature! Stay out of my way!\"\nmsgstr \"I don't have time for you creature! Stay out of my way!\"\n\n#. Key:\t79A62658414FE0202F2E9AA0E0238BD4\n#. SourceLocation:\t/Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_9.Children(0).Children.Text\n#: /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_9.Children(0).Children.Text\nmsgctxt \"Dialogue_SewerCreatures\"\nmsgid \"Accept Quest\"\nmsgstr \"Accept Quest\"\n\n#. Key:\t7EF6CBFA4A9C0B85B26AA6830C6121A2\n#. SourceLocation:\t/Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_1.Children(2).Children.Text\n#: /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_1.Children(2).Children.Text\nmsgctxt \"Dialogue_SewerCreatures\"\nmsgid \"Leave\"\nmsgstr \"Leave\"\n\n#. Key:\t85A2E48A4B27C5EB7DA4CFAA23555629\n#. SourceLocation:\t/Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_26.Text\n#: /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_26.Text\nmsgctxt \"Dialogue_SewerCreatures\"\nmsgid \"Farewell and good luck to you as well!\"\nmsgstr \"Farewell and good luck to you as well!\"\n\n#. Key:\t9AEDA0E84BABEBCD8F18E8BC2D0B75D0\n#. SourceLocation:\t/Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_SewerCreatures\"\nmsgid \"Calm down creature! I mean you no harm.\"\nmsgstr \"Calm down creature! I mean you no harm.\"\n\n#. Key:\tB89304534B24114D19DF7AB07635FFDE\n#. SourceLocation:\t/Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_SewerCreatures\"\nmsgid \"All right I will see what I can do.\"\nmsgstr \"All right I will see what I can do.\"\n\n#. Key:\tB8BD374E4738BFFDAFAC4EAA19E7A9D2\n#. SourceLocation:\t/Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_23.Text\n#: /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_23.Text\nmsgctxt \"Dialogue_SewerCreatures\"\nmsgid \"Oh, thank you!\"\nmsgstr \"Oh, thank you!\"\n\n#. Key:\tCAFA874D4ECD3CBFC0ADFD93048A9AA5\n#. SourceLocation:\t/Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_SewerCreatures\"\nmsgid \"Just tell me what do you want...\"\nmsgstr \"Just tell me what do you want...\"\n\n#. Key:\tCF62984840B7508E82BAC0AB9D53EC0A\n#. SourceLocation:\t/Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_9.Children(1).Children.Text\n#: /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_9.Children(1).Children.Text\nmsgctxt \"Dialogue_SewerCreatures\"\nmsgid \"Decline\"\nmsgstr \"Decline\"\n\n#. Key:\tDA1FD0DC49E9B2999DCD489699C04106\n#. SourceLocation:\t/Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_1.Children(1).Children.Text\n#: /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_1.Children(1).Children.Text\nmsgctxt \"Dialogue_SewerCreatures\"\nmsgid \"Let it talk\"\nmsgstr \"Let it talk\"\n\n#. Key:\tEAD329F04773358B0CA339A4F155D990\n#. SourceLocation:\t/Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_SewerCreatures\"\nmsgid \"I'm sorry but I can't help you.\"\nmsgstr \"I'm sorry but I can't help you.\"\n\n#. Key:\tDA8649E54E3753ECDF9C4EAAB90D42B6\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/sewertut1.sewertut1:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/sewertut1.sewertut1:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_sewertut1\"\nmsgid \"I don't like the idea of this additional challenge, but without the help of the Keeper you won't be able to get out.\"\nmsgstr \"I don't like the idea of this additional challenge, but without the help of the Keeper you won't be able to get out.\"\n\n#. Key:\t462EF40B4BF77FA77FD98DB4656692A2\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/sewertut2_magicbox.sewertut2_magicbox:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/sewertut2_magicbox.sewertut2_magicbox:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_sewertut2_magicbox\"\nmsgid \"It's a magic box! That's what it's supposed to do, demon.\"\nmsgstr \"It's a magic box! That's what it's supposed to do, demon.\"\n\n#. Key:\tC34B7D8D499A8E8B767A58A19537A1EA\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/sewertut2_magicbox.sewertut2_magicbox:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/sewertut2_magicbox.sewertut2_magicbox:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_sewertut2_magicbox\"\nmsgid \"Is that box just floating in the air?\"\nmsgstr \"Is that box just floating in the air?\"\n\n#. Key:\t348CCFC54F7E952295416496617F7615\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/sewertut3_silverkey.sewertut3_silverkey:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/sewertut3_silverkey.sewertut3_silverkey:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_sewertut3_silverkey\"\nmsgid \"What is that crystal?\"\nmsgstr \"What is that crystal?\"\n\n#. Key:\t554B6C924D0234A869BDFF9412FC4F49\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/sewertut3_silverkey.sewertut3_silverkey:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/sewertut3_silverkey.sewertut3_silverkey:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_sewertut3_silverkey\"\nmsgid \"Don't care about that. Focus on finding a way out.\"\nmsgstr \"Don't care about that. Focus on finding a way out.\"\n\n#. Key:\t015A0B11422A6F2AE027FF8D9DF70664\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"We need his help.\"\nmsgstr \"We need his help.\"\n\n#. Key:\t03C73AA849BF05421AB97BA696A8C9C4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_79.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_79.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"They always wanted to invade the Outpost. They are many and we are few.\"\nmsgstr \"They always wanted to invade the Outpost. They are many and we are few.\"\n\n#. Key:\t0849CCCF4491D52B38AE7F827841E479\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Why should I set you free?\"\nmsgstr \"Why should I set you free?\"\n\n#. Key:\t090C7BBF4222952E1C3FD38F7CF9927E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_76.Text\n#. Key:\t0AC46EF744AA55EDDA83EDB6899BB2D1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_65.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_65.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_76.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Some say Tabby's spirit returned and took the artefacts to Lillian. Maybe that is what happened.\"\nmsgstr \"Some say Tabby's spirit returned and took the artefacts to Lillian. Maybe that is what happened.\"\n\n#. Key:\t094943BF4D9202CE7B1CFCBF151886D5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Back to the question: will you get me out?\"\nmsgstr \"Back to the question: will you get me out?\"\n\n#. Key:\t0DBF728A4C052550BE5EEDBC9DEFB2E0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_29.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_29.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"I would invite you for dinner but unfortunately the door is closed.\"\nmsgstr \"I would invite you for dinner but unfortunately the door is closed.\"\n\n#. Key:\t112A48C54853F7689E1676A11FA8C352\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_48.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_48.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"No time to talk!\"\nmsgstr \"No time to talk!\"\n\n#. Key:\t116C39AA495E99500962E8B3AF10DD4A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_83.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_83.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"I mean I'm sorry about the others... not that you survived.\"\nmsgstr \"I mean I'm sorry about the others... not that you survived.\"\n\n#. Key:\t134299214C22044B012C27B62337C08E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_69.Text\n#. Key:\tFD1574E845CB284B7A85F09CA1580DD4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_58.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_58.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_69.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"But she is gone for months and no one knows where she might be.\"\nmsgstr \"But she is gone for months and no one knows where she might be.\"\n\n#. Key:\t14BD2A7C45E85692430B34820042C96F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_73.Text\n#. Key:\tEA5320F3406E2BFA9BD954899BFA19DA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_62.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_62.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_73.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"He had so many friends. We all gathered and buried him near the Ancient Temple.\"\nmsgstr \"He had so many friends. We all gathered and buried him near the Ancient Temple.\"\n\n#. Key:\t16E175D0437B4A671F4753A56E840278\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_33.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_33.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"I’m looking for three artefacts. Do you know something about them?\"\nmsgstr \"I’m looking for three artefacts. Do you know something about them?\"\n\n#. Key:\t174BA1E34131FB1BD5A543A3CB86C724\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_35.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_35.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"I will return to the Main Station at Crossroad Cave and see what I can do with the trains.\"\nmsgstr \"I will return to the Main Station at Crossroad Cave and see what I can do with the trains.\"\n\n#. Key:\t1769115D4B72AB6CF8641487126A4A18\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"It has a key. The end of it is shaped like a dwarven helmet. You can easily recognise it.\"\nmsgstr \"It has a key. The end of it is shaped like a dwarven helmet. You can easily recognise it.\"\n\n#. Key:\t17CBB2E24B331E4C5682919AAD2E7F2E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_60.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_60.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"What happened to Tabby?\"\nmsgstr \"What happened to Tabby?\"\n\n#. Key:\t1AA8B2E541B2B2E7CA1E86B1E08C1E5A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"They are all dead...\"\nmsgstr \"They are all dead...\"\n\n#. Key:\t1FCCD37546681195736D2290A8DAE121\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Oh, it’s you again.\"\nmsgstr \"Oh, it’s you again.\"\n\n#. Key:\t2581B27E486A1C71835E5BB44B0AE05E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_37.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_37.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"But first I finish my supper. See you there!\"\nmsgstr \"But first I finish my supper. See you there!\"\n\n#. Key:\t2589E4AA4E5A406F6A98CB87D7382DC0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Just ask one of the other dwarfs to open the door.\"\nmsgstr \"Just ask one of the other dwarfs to open the door.\"\n\n#. Key:\t26162C784D2E65A2F8F491A80838F754\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_24.Children(4).Children.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_24.Children(4).Children.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Everyone dead?\"\nmsgstr \"Everyone dead?\"\n\n#. Key:\t2FEAED2844737D1B20BA64AE2414D8C6\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_72.Text\n#. Key:\tA119C2164FDE16E8F84B4E89578A1015\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_61.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_61.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_72.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"By the time I found him he was dead.\"\nmsgstr \"By the time I found him he was dead.\"\n\n#. Key:\t3203A6044456CD8213037A9B1B668763\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Please help me out!\"\nmsgstr \"Please help me out!\"\n\n#. Key:\t32C0BE7F49563BC2846691B4F163AEF7\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Well that explains why they didn’t come for me over the last four months.\"\nmsgstr \"Well that explains why they didn’t come for me over the last four months.\"\n\n#. Key:\t35F849134220FAE43E07268C439CE3A1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_31.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_31.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"What were you Dwarves doing here?\"\nmsgstr \"What were you Dwarves doing here?\"\n\n#. Key:\t39D36DCA4CD40A7E19D4F5AE69954DC3\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_71.Text\n#. Key:\tEFD384D542A5869726CAB7945F4C0EC4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_54.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_54.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_71.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Tabby found the three artefacts but on his way home he got injured.\"\nmsgstr \"Tabby found the three artefacts but on his way home he got injured.\"\n\n#. Key:\t39DEF30C4C3CCAB79867339AABD92BA0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_24.Children(3).Children.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_24.Children(3).Children.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Artefacts\"\nmsgstr \"Artefacts\"\n\n#. Key:\t3AF0406744C4656C5604EF931A688715\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_23.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_23.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"I've found the key!\"\nmsgstr \"I've found the key!\"\n\n#. Key:\t3E074E784D66BE166553EB9F85D9854A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"How can I set you free?\"\nmsgstr \"How can I set you free?\"\n\n#. Key:\t4100ECBE40C53051121F4C8A588FBDCB\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_24.Children(2).Children.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_24.Children(2).Children.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Train\"\nmsgstr \"Train\"\n\n#. Key:\t41085B174230937FAF97CDBC868F852A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_24.Children(5).Children.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_24.Children(5).Children.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Leave\"\nmsgstr \"Leave\"\n\n#. Key:\t4204AAFB49C665B3CC32D78301307582\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_45.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_45.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Do you mean those traps out there?\"\nmsgstr \"Do you mean those traps out there?\"\n\n#. Key:\t44AF6FF04B8A23F656F485AB9F1AFE60\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_36.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_36.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Catch me there if you need to go somewhere!\"\nmsgstr \"Catch me there if you need to go somewhere!\"\n\n#. Key:\t48FC728C4467C7CF9692AEB8CC71352D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_49.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_49.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"I will catch you at Crossroad Cave after I finished my supper.\"\nmsgstr \"I will catch you at Crossroad Cave after I finished my supper.\"\n\n#. Key:\t4A74231B43F74B39906C85904332EE87\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"What happened? How did you end up here?\"\nmsgstr \"What happened? How did you end up here?\"\n\n#. Key:\t4FE354D247D257B181993087E5ADC74C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Errr... I don’t know... out of pure righteousness perhaps?\"\nmsgstr \"Errr... I don’t know... out of pure righteousness perhaps?\"\n\n#. Key:\t529895FF4D6B505A0EDB5081215845AE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_53.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_53.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"He wasn't just an ordinary cat. He was somehow connected to a charming young girl called Lillian.\"\nmsgstr \"He wasn't just an ordinary cat. He was somehow connected to a charming young girl called Lillian.\"\n\n#. Key:\t5C005582439FD5753AA90BB72F3284C8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_44.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_44.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"We build walls. We create machines out of golem spirits with simple rules which can't go wrong.\"\nmsgstr \"We build walls. We create machines out of golem spirits with simple rules which can't go wrong.\"\n\n#. Key:\t5C48292B4E4F1FAF4D7BB487713EA0B1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_59.Text\n#. Key:\t7F06827C4756423AE024F99922B00FDE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_70.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_59.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_70.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"I hope she will return.\"\nmsgstr \"I hope she will return.\"\n\n#. Key:\t624EDA19418303508EA7F58C5BD0DB4E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"All right!\"\nmsgstr \"All right!\"\n\n#. Key:\t64E994E34D543F58D0F9DAA386AD7438\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Or do you like trains? I can help you redirect them to stations you couldn’t go otherwise.\"\nmsgstr \"Or do you like trains? I can help you redirect them to stations you couldn’t go otherwise.\"\n\n#. Key:\t674A3DC8404EF8FC317D72A70877A0FF\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Errr... You know, sometimes in the evening I come here and have some late dinner. And there are others who think it would be funny to close the door when I'm inside.\"\nmsgstr \"Errr... You know, sometimes in the evening I come here and have some late dinner. And there are others who think it would be funny to close the door when I'm inside.\"\n\n#. Key:\t6B07A15F4E86ECA507DE1DA9B0634774\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_74.Text\n#. Key:\t8F415D40481AA448025D79AB123B2DEB\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_63.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_63.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_74.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"He was a good friend. We all miss him.\"\nmsgstr \"He was a good friend. We all miss him.\"\n\n#. Key:\t6B47D3994D188506700B48BE85E0C740\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Once you collected all the artefacts you will need to take them back to a point where I can transport you to the Human Realm.\"\nmsgstr \"Once you collected all the artefacts you will need to take them back to a point where I can transport you to the Human Realm.\"\n\n#. Key:\t6B72634A488C0A9471F52AA154E56709\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_82.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_82.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"I’m sorry about that.\"\nmsgstr \"I’m sorry about that.\"\n\n#. Key:\t6C7C51F44B3881DDF4AE41B10F4D29E1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_52.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_52.Children(0).Children.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Tabby?\"\nmsgstr \"Tabby?\"\n\n#. Key:\t6EC585D64AFBB18576EE17B9DFC08AD7\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_2.Children(2).Children.Text\n#. Key:\tFB66CFE943F6EF32D1A40987B969DCDF\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_52.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_2.Children(2).Children.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_52.Children(1).Children.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"What happened?\"\nmsgstr \"What happened?\"\n\n#. Key:\t766A9A50425FA0D0A0374390B2AF5980\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"I like jokes and it would have been funny for I don’t know a few hours maybe...\"\nmsgstr \"I like jokes and it would have been funny for I don’t know a few hours maybe...\"\n\n#. Key:\t81ABC3E441BE2D3A19257BBC9DDD42D0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_41.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_41.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"You can go down there by using the elevator.\"\nmsgstr \"You can go down there by using the elevator.\"\n\n#. Key:\t85B4C0DB47A2A3C3D504C29965DB6390\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_75.Text\n#. Key:\tE6F106AA404B92C9C6E8889876002813\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_64.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_64.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_75.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"We left the artefacts at his tomb, but one day later they disappeared.\"\nmsgstr \"We left the artefacts at his tomb, but one day later they disappeared.\"\n\n#. Key:\t88F0611349D22BB5B8411FA1232B8724\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_38.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_38.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Bye!\"\nmsgstr \"Bye!\"\n\n#. Key:\t8A2BA24948D65C3EC801B6AA589C206F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_30.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_30.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Welcome back!\"\nmsgstr \"Welcome back!\"\n\n#. Key:\t8A3CCFA44EAB376D6CB4C3B7DD8CEE8D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_53.Children(0).Children.Text\n#. Key:\tEEEF64F84F3FE0A37D029EB1A8BBE8A9\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_55.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_53.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_55.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Lillian?\"\nmsgstr \"Lillian?\"\n\n#. Key:\t8B9C46EA4C46385E6B3770BBD4648280\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_67.Text\n#. Key:\t999245954FBA1853A5E67A88353F152E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_56.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_56.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_67.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Lillian was really kind to us Dwarves. We couldn't ever meet her in person but she could talk to us via the cat Tabby.\"\nmsgstr \"Lillian was really kind to us Dwarves. We couldn't ever meet her in person but she could talk to us via the cat Tabby.\"\n\n#. Key:\t90C6625D4ED5F6EA08B07A87450A1BC9\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_32.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_32.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"You said something about trains...\"\nmsgstr \"You said something about trains...\"\n\n#. Key:\t92793D7F4D0351BF74BB6A8C3EE6A182\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"How can I open the door?\"\nmsgstr \"How can I open the door?\"\n\n#. Key:\t941CF27C40D3D82D6B41F5B3DD6501BB\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_52.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_52.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"My friend Tabby was also looking for artefacts.\"\nmsgstr \"My friend Tabby was also looking for artefacts.\"\n\n#. Key:\t991D611A4F8BE2F8EAC77C9D746BAF95\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_78.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_78.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"I think the Kobolds attacked us by surprise.\"\nmsgstr \"I think the Kobolds attacked us by surprise.\"\n\n#. Key:\t9A7FA46C4687C80EBE3B4580631E9B8E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_43.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_43.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"After the Cataclysm we realized the only way to fight madness is to create rules to follow.\"\nmsgstr \"After the Cataclysm we realized the only way to fight madness is to create rules to follow.\"\n\n#. Key:\t9E9CE4714145ED45CA301AACA6CEBBAF\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_40.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_40.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"But there is a spare key in the Catacombs.\"\nmsgstr \"But there is a spare key in the Catacombs.\"\n\n#. Key:\t9ED5DDC74852A2007D25CDB418A3EDDA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_46.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_46.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"They surely have nothing to do with madness...\"\nmsgstr \"They surely have nothing to do with madness...\"\n\n#. Key:\tA0117BB74AB541DE10847FBC5E5CCB32\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"What we were doing? Well we Dwarves are not like other creatures you might have met.\"\nmsgstr \"What we were doing? Well we Dwarves are not like other creatures you might have met.\"\n\n#. Key:\tA258ABB740D6727685853E88F32936E2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"That sounds useful.\"\nmsgstr \"That sounds useful.\"\n\n#. Key:\tA3F231E34FB4B95DD27A84B9326E0BFE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_24.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_24.Children(0).Children.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Key\"\nmsgstr \"Key\"\n\n#. Key:\tB0B806C147D2EB9F312987B49DEBFC8F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_47.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_47.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"See? They are simple, effective and logical. Ruin can't harm us as long as we follow all the rules.\"\nmsgstr \"See? They are simple, effective and logical. Ruin can't harm us as long as we follow all the rules.\"\n\n#. Key:\tB464CECC4F774535530FC685E0F62787\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_77.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_77.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Do you have any idea how the others died?\"\nmsgstr \"Do you have any idea how the others died?\"\n\n#. Key:\tBE69B91C466965EEF56A6F920AF9E5A8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"I thought they were just kidding.\"\nmsgstr \"I thought they were just kidding.\"\n\n#. Key:\tBFEAB99A4FE8C61CC35BCC9E926EFA97\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_51.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_51.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Just help me out.\"\nmsgstr \"Just help me out.\"\n\n#. Key:\tC06E3A27466B5D6C7FC4A39E55739800\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"But being here for four months seems a bit too much for me.\"\nmsgstr \"But being here for four months seems a bit too much for me.\"\n\n#. Key:\tC31327F8430D2259C27BAE91F44F0119\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_2.Children(0).Children.Text\n#. Key:\tCCD4C84941546627E158A4915B41CDB7\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_19.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_19.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_2.Children(0).Children.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"How?\"\nmsgstr \"How?\"\n\n#. Key:\tC3BFAD59497E357A8180ADB86C75F14B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_68.Text\n#. Key:\tFF1A18C04F33FF434A2821A725CBFB5C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_57.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_57.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_68.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"She cared about us. She knew all our Strongholds and Outposts. She always warned us before the Kobolds attacked.\"\nmsgstr \"She cared about us. She knew all our Strongholds and Outposts. She always warned us before the Kobolds attacked.\"\n\n#. Key:\tC5A94EDD47BC3D5F422A29982308E78D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_19.Children(1).Children.Text\n#. Key:\tF811970946DF32346DAE66AFE2F64664\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_2.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_19.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_2.Children(1).Children.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Why?\"\nmsgstr \"Why?\"\n\n#. Key:\tC8E54B6E448A194DEB141C84323308F6\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_80.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_80.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"It was only a matter of time.\"\nmsgstr \"It was only a matter of time.\"\n\n#. Key:\tCA02594643A55D1128F06FB2E8FDE676\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_50.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_50.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Yes, trains. I can help you reach destinations you couldn't reach on your own.\"\nmsgstr \"Yes, trains. I can help you reach destinations you couldn't reach on your own.\"\n\n#. Key:\tCC191532450BFB2679AFD88AD95B72B2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Finally someone!\"\nmsgstr \"Finally someone!\"\n\n#. Key:\tCF4351D047E267981EF869BE88BB0753\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_24.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_24.Children(1).Children.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Dwarves\"\nmsgstr \"Dwarves\"\n\n#. Key:\tD2377C864A2A80F17AD81581D7A7807F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_81.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_81.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Odd that I survived.\"\nmsgstr \"Odd that I survived.\"\n\n#. Key:\tDF12303E4C7A4DFB00054EA7CE07FF88\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_39.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_39.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Errr... I don't know.\"\nmsgstr \"Errr... I don't know.\"\n\n#. Key:\tE8270F474353ECB77560C4A1173638A2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_27.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_27.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Any idea where that key might be?\"\nmsgstr \"Any idea where that key might be?\"\n\n#. Key:\tEF1EFC6E4119CC9B41AF21ACE008D3B5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_26.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_26.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Have you found the key?\"\nmsgstr \"Have you found the key?\"\n\n#. Key:\tF47418854FDFB9AD0E10468BEC8F1F58\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_42.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_42.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"I need to go now.\"\nmsgstr \"I need to go now.\"\n\n#. Key:\tF553C35F43DFC6CA04DA48A738597696\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_25.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_25.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Back already?\"\nmsgstr \"Back already?\"\n\n#. Key:\tFF942F904300D874A8C59AB8A954EF86\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_34.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_34.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Well done! Thank you! Thank you!\"\nmsgstr \"Well done! Thank you! Thank you!\"\n\n#. Key:\t0499C9ED4395C4DD8AD1E48E854CD983\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"It was nice to see you too!\"\nmsgstr \"It was nice to see you too!\"\n\n#. Key:\t07153D014D72AF193040BA91A18BDC0A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_24.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_24.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"Great!\"\nmsgstr \"Great!\"\n\n#. Key:\t106E51E34033895E5C7F348AF8994564\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"Er... Thanks! We'll talk about this later.\"\nmsgstr \"Er... Thanks! We'll talk about this later.\"\n\n#. Key:\t18E140B74385C5E48F23E0B7E862E569\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"Hello! It's nice to see you again.\"\nmsgstr \"Hello! It's nice to see you again.\"\n\n#. Key:\t25F72BCA416C39658A0879A27417EA6B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"Don’t worry, I’ll make ready a train for you heading that way.\"\nmsgstr \"Don’t worry, I’ll make ready a train for you heading that way.\"\n\n#. Key:\t26CBB1CD40F2080DE2183BA6AB3D2014\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"Ask him how you can travel to World’s End.\"\nmsgstr \"Ask him how you can travel to World’s End.\"\n\n#. Key:\t26D1F4534C708623FB300DBE4EECADD2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"But I can't go back, because it's not safe.\"\nmsgstr \"But I can't go back, because it's not safe.\"\n\n#. Key:\t2B14E76B4B16316D7525FFA6D37E4CBB\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"You know I'm a bit worried about what will happen to the Outpost.\"\nmsgstr \"You know I'm a bit worried about what will happen to the Outpost.\"\n\n#. Key:\t2BB0F16046A4CD8DF05DE6A95D2CF9B3\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"I’m really glad you found that key for me. Now I can finish my supper outside in fresh air!\"\nmsgstr \"I’m really glad you found that key for me. Now I can finish my supper outside in fresh air!\"\n\n#. Key:\t36EF13F042D5B5ADB870BEB97F688D08\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_29.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_29.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"Take this! You deserve it!\"\nmsgstr \"Take this! You deserve it!\"\n\n#. Key:\t3E09B8F746E999130D26A0BEA945E6D6\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"Is everything all right?\"\nmsgstr \"Is everything all right?\"\n\n#. Key:\t4D5A326948713FE977D0DBB68CF4A475\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_27.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_27.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"Except those crazy traps...\"\nmsgstr \"Except those crazy traps...\"\n\n#. Key:\t5BE2C4324B64B35BD181B49E2D63E87F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"By the way, in case you need to go somewhere with the train just let me know.\"\nmsgstr \"By the way, in case you need to go somewhere with the train just let me know.\"\n\n#. Key:\t66EDC37F4F3B3813F1B92D91A4107ADE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"I have banished some of the monsters lurking in the Outpost.\"\nmsgstr \"I have banished some of the monsters lurking in the Outpost.\"\n\n#. Key:\t67EED0C742F3B4ED0A9B929C4B517A4A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"The Outpost is safe again.\"\nmsgstr \"The Outpost is safe again.\"\n\n#. Key:\t6F1AF94E4DE4A338EFF79C85D99B944A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_19.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_19.Children(1).Children.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"Outpost\"\nmsgstr \"Outpost\"\n\n#. Key:\t84D15B994BADC0AAED61848E817E49E1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"Thanks!\"\nmsgstr \"Thanks!\"\n\n#. Key:\t8C7D69324C544DAC53C5CCA724B4B461\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_23.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_23.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"Could you somehow make the enemies move to somewhere else maybe?\"\nmsgstr \"Could you somehow make the enemies move to somewhere else maybe?\"\n\n#. Key:\t8F66738A44B7D19EABAD40873B3FCAA3\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_19.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_19.Children(0).Children.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"Do you need help?\"\nmsgstr \"Do you need help?\"\n\n#. Key:\t9249DFC34CFB46E1738C97A3283268D2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"Well done! Well done!\"\nmsgstr \"Well done! Well done!\"\n\n#. Key:\tA027C29849372B1C452083A84609B1F5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_19.Children(2).Children.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_19.Children(2).Children.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"Leave\"\nmsgstr \"Leave\"\n\n#. Key:\tA037C9E543AC131DAF4B6281A27BD56C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"Hello again my friend!\"\nmsgstr \"Hello again my friend!\"\n\n#. Key:\tA4F1343D4D537FC1907096B564D3842E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"Oh, it must be a charming place!\"\nmsgstr \"Oh, it must be a charming place!\"\n\n#. Key:\tACF022EF4C55A6553F29DB969827379D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_26.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_26.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"Anyway, take this for your effort!\"\nmsgstr \"Anyway, take this for your effort!\"\n\n#. Key:\tB680A1D54923C59C081E46A65A2754D1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"As the last Defender, it would be my duty to keep that place safe.\"\nmsgstr \"As the last Defender, it would be my duty to keep that place safe.\"\n\n#. Key:\tB9E0526D41FDB742FCB51991A0220B17\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"That’s where I can take you out of the Ruined Realm.\"\nmsgstr \"That’s where I can take you out of the Ruined Realm.\"\n\n#. Key:\tBF1AD65A407133C13B811CB14A997A2A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"We can talk some more once I've finished my supper...\"\nmsgstr \"We can talk some more once I've finished my supper...\"\n\n#. Key:\tE211EA4D4D69D09144B914850B17A8AE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_25.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_25.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"Well, I can't do my duty until you banish all of them.\"\nmsgstr \"Well, I can't do my duty until you banish all of them.\"\n\n#. Key:\tEFD408FF4DAFD18E10ED3282D959914E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"You don't need to go anywhere before you find the three artefacts.\"\nmsgstr \"You don't need to go anywhere before you find the three artefacts.\"\n\n#. Key:\tF500AA3C494B40302E298CA54FF3344B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"I would like to go to World’s End.\"\nmsgstr \"I would like to go to World’s End.\"\n\n#. Key:\tFDC63C35472E1752E2D092BC77DAD28B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"I'll see what I can do.\"\nmsgstr \"I'll see what I can do.\"\n\n#. Key:\t00A5A8684B1EF5FF2319428685540844\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_13.Children(0).Children.Text\n#. Key:\t471B46884399845B6D9442A8EADC2A48\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_9.Children(0).Children.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_13.Children(0).Children.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_9.Children(0).Children.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"Portal\"\nmsgstr \"Portal\"\n\n#. Key:\t03EA3D4249797B593981C1B699A2CF5A\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"Oh! The Walking Ball returned! Just in time!\"\nmsgstr \"Oh! The Walking Ball returned! Just in time!\"\n\n#. Key:\t04DC604342615AD3DCFCE99EB9AAF157\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_19.Children(1).Children.Text\n#. Key:\t1070909F4434D9B0D03DD3BD62692CE0\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_16.Children(0).Children.Text\n#. Key:\t76A679CE45B5A9A47CA620A396E02F48\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_13.Children(2).Children.Text\n#. Key:\t8FC1E822454A2FDA1847119C5004F161\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_21.Children(0).Children.Text\n#. Key:\t9036093D446B2F8C34705BBCFC73F4A0\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_9.Children(2).Children.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_13.Children(2).Children.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_16.Children(0).Children.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_19.Children(1).Children.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_21.Children(0).Children.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_9.Children(2).Children.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"Leave\"\nmsgstr \"Leave\"\n\n#. Key:\t142E85484BA4E9CF475F0780D951BAE5\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"But they were so tasty.\"\nmsgstr \"But they were so tasty.\"\n\n#. Key:\t1E763B4D4D535AA83B50D4B87DB5A15D\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"You again?\"\nmsgstr \"You again?\"\n\n#. Key:\t2430044E46A3456249D6A99D0FC31D30\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_9.Children(1).Children.Text\n#. Key:\tB3695A284A15574F3874BDAB1B8C14EB\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_19.Children(0).Children.Text\n#. Key:\tDC8D78774D326DA9A70EFC81A857A417\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_13.Children(1).Children.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_13.Children(1).Children.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_19.Children(0).Children.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_9.Children(1).Children.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"Give Weird Device\"\nmsgstr \"Give Weird Device\"\n\n#. Key:\t29AD586B41502E4FAFF79E94FDADA50D\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"Unfortunately I don't have any.\"\nmsgstr \"Unfortunately I don't have any.\"\n\n#. Key:\t3418CA5A44B4531926317CB100CEC2F4\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"Just let me know when you're done! Meanwhile, I'll be reading a few more pages.\"\nmsgstr \"Just let me know when you're done! Meanwhile, I'll be reading a few more pages.\"\n\n#. Key:\t37CD676C4C4F585C3CC048B56EEF6B92\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"I was supposed to find a portal here.\"\nmsgstr \"I was supposed to find a portal here.\"\n\n#. Key:\t3C2778B12A09151A002F016B1E3F6212\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"Also, if I hadn't drank the last two bottles... that would have helped...\"\nmsgstr \"Also, if I hadn't drank the last two bottles... that would have helped...\"\n\n#. Key:\t42E3EE32491F578E618913B4AF958187\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"Really? That sounds like my students! They were always complaining about unannounced examinations or even worse, \\\"Why are there no lessons tomorrow?\\\".\"\nmsgstr \"Really? That sounds like my students! They were always complaining about unannounced examinations or even worse, \\\"Why are there no lessons tomorrow?\\\".\"\n\n#. Key:\t44626CCD498CA592B8FAD1B01EDF33AB\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_2.Children(0).Children.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_2.Children(0).Children.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"Don't have\"\nmsgstr \"Don't have\"\n\n#. Key:\t55EAD2524D0BCF52B25A1B9EAB1754B2\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"That's it my ball! I wish I had more students like you.\"\nmsgstr \"That's it my ball! I wish I had more students like you.\"\n\n#. Key:\t6682474947E016803A188FA968FD76BE\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"Oh my...\"\nmsgstr \"Oh my...\"\n\n#. Key:\t786849EF4E531580865712BBEDD25B32\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"That is amazing! Thank you, my globular friend! Take these coins, I am sure that you will enjoy spending them on... on whatever Balls like you like to get.\"\nmsgstr \"That is amazing! Thank you, my globular friend! Take these coins, I am sure that you will enjoy spending them on... on whatever Balls like you like to get.\"\n\n#. Key:\t7FFC816545AA219D43FCA3A2ABF33E9E\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"Nevermind, I will just read a bit more... at least until a solution is found for the whole problem.\"\nmsgstr \"Nevermind, I will just read a bit more... at least until a solution is found for the whole problem.\"\n\n#. Key:\t818E4C1245F622C192178CB1F21694A3\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_2.Children(1).Children.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_2.Children(1).Children.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"What's the matter?\"\nmsgstr \"What's the matter?\"\n\n#. Key:\t84A119EB4FFB518BA7AA6394768F1DD3\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"Did the Gatekeeper open the gate for you?\"\nmsgstr \"Did the Gatekeeper open the gate for you?\"\n\n#. Key:\t88FD93954B70482DAC5F2AA5332F23D5\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"One must always be eager to solve a problem. No matter how challenging that is.\"\nmsgstr \"One must always be eager to solve a problem. No matter how challenging that is.\"\n\n#. Key:\t9CEE1942434DACB2DB3C1AA2005A1E94\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"But we might find another way to solve the problem.\"\nmsgstr \"But we might find another way to solve the problem.\"\n\n#. Key:\tC070EF8E47744D116D4E39AC8F7C1941\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"I hope that you still have at least one bottle of that potion of mine. I could really use some...\"\nmsgstr \"I hope that you still have at least one bottle of that potion of mine. I could really use some...\"\n\n#. Key:\tC39CD0F34CDFDCB0B2CF08917834F1A8\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"Here is a Weird Device that I found in the hideout of the Secret Science Society.\"\nmsgstr \"Here is a Weird Device that I found in the hideout of the Secret Science Society.\"\n\n#. Key:\tCBB0BCAF4E19F942AC57F988104A9A65\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"I've used all of them to get back from the Sewer. You should have told me that there is another way out!\"\nmsgstr \"I've used all of them to get back from the Sewer. You should have told me that there is another way out!\"\n\n#. Key:\tE866A83647B163E53260C2B541AA0D7B\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"Well, the portal is definitely here, but as you might have already noticed, the place is a bit worn.\"\nmsgstr \"Well, the portal is definitely here, but as you might have already noticed, the place is a bit worn.\"\n\n#. Key:\tF0A4AD1448267D94CAB7F79AD6CEFD59\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"Not Yet.\"\nmsgstr \"Not Yet.\"\n\n#. Key:\tF83C2C894C2EA511DCDCE6B824CC0591\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"Only the Gatekeeper can reopen the portal.\"\nmsgstr \"Only the Gatekeeper can reopen the portal.\"\n\n#. Key:\t76653DEC40EE0ED098B5EE8810B1A097\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/TL_GetSoulkeeper.TL_GetSoulkeeper:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/TL_GetSoulkeeper.TL_GetSoulkeeper:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_TL_GetSoulkeeper\"\nmsgid \"A Spellcaster. It makes you able to use the Ruined Realm's magic, at least, up to a certain level.\"\nmsgstr \"A Spellcaster. It makes you able to use the Ruined Realm's magic, at least, up to a certain level.\"\n\n#. Key:\tBD48F7804F49751510AB2E909906C52F\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/TL_GetSoulkeeper.TL_GetSoulkeeper:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/TL_GetSoulkeeper.TL_GetSoulkeeper:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_TL_GetSoulkeeper\"\nmsgid \"What is it?\"\nmsgstr \"What is it?\"\n\n#. Key:\tDFF1C93D4005A778F0B696A2DC949DC6\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/TL_GetSoulkeeper.TL_GetSoulkeeper:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/TL_GetSoulkeeper.TL_GetSoulkeeper:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_TL_GetSoulkeeper\"\nmsgid \"That amulet is useful.\"\nmsgstr \"That amulet is useful.\"\n\n#. Key:\t09CDAFF84CF3F066B25A228640D45277\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_TL_Monk\"\nmsgid \"Please tell your Wizard that Monk would like to have a word with him.\"\nmsgstr \"Please tell your Wizard that Monk would like to have a word with him.\"\n\n#. Key:\t0E97585C46B73E4AF939169CF45067A3\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_TL_Monk\"\nmsgid \"I can only guess that right now, he's complaining about me.\"\nmsgstr \"I can only guess that right now, he's complaining about me.\"\n\n#. Key:\t2E82A2B6449D8BA37ADBE7AEE1486791\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_TL_Monk\"\nmsgid \"Just get rid of him.\"\nmsgstr \"Just get rid of him.\"\n\n#. Key:\t430D927D40EF24EED23E55A83F48FDD7\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_TL_Monk\"\nmsgid \"I'm sorry but he doesn't want to talk to you.\"\nmsgstr \"I'm sorry but he doesn't want to talk to you.\"\n\n#. Key:\t59E21DC1476038EAD4EC91BC00DA4D8B\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_3.Children(2).Children.Text\n#: /Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_3.Children(2).Children.Text\nmsgctxt \"Dialogue_TL_Monk\"\nmsgid \"Ask Wizard\"\nmsgstr \"Ask Wizard\"\n\n#. Key:\t5AFB166C49DEB2D9017AED887A1E424D\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_TL_Monk\"\nmsgid \"Farewell, my friend, until we meet again!\"\nmsgstr \"Farewell, my friend, until we meet again!\"\n\n#. Key:\t5D80CBEB46203E3A759B498B95571F4F\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_3.Children(1).Children.Text\n#: /Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_3.Children(1).Children.Text\nmsgctxt \"Dialogue_TL_Monk\"\nmsgid \"I won't transfer!\"\nmsgstr \"I won't transfer!\"\n\n#. Key:\t66D9E1874A9749A8881372807C0B9D54\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_TL_Monk\"\nmsgid \"Ha-ha-ha... I know he heard everything.\"\nmsgstr \"Ha-ha-ha... I know he heard everything.\"\n\n#. Key:\t8BD7C20C4084000925D1489BE3F6EE15\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_TL_Monk\"\nmsgid \"I don't talk to him!\"\nmsgstr \"I don't talk to him!\"\n\n#. Key:\tA227CE5A47002A80D3988ABA1364CF3E\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_3.Children(0).Children.Text\n#: /Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_3.Children(0).Children.Text\nmsgctxt \"Dialogue_TL_Monk\"\nmsgid \"Wizard don't want\"\nmsgstr \"Wizard don't want\"\n\n#. Key:\tA8E469374586A1D8A734D696AF662F9A\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_TL_Monk\"\nmsgid \"I also have something for you, Wanderer!\"\nmsgstr \"I also have something for you, Wanderer!\"\n\n#. Key:\tCE0E3B1B424BEDDF4A830B8DD0BB3272\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_TL_Monk\"\nmsgid \"This might help you along the way.\"\nmsgstr \"This might help you along the way.\"\n\n#. Key:\tD6B184754B86F236C93454A95BF92B31\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_TL_Monk\"\nmsgid \"I won't deliver your messages anymore! If the two of you want something, then go get it yourselves!\"\nmsgstr \"I won't deliver your messages anymore! If the two of you want something, then go get it yourselves!\"\n\n#. Key:\tDB3AEAF24056B19A7D80E29E7D011D80\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_TL_Monk\"\nmsgid \"That's right. I will give him more time.\"\nmsgstr \"That's right. I will give him more time.\"\n\n#. Key:\tE2F9F07A4A2B8D1A578BCC9716AB4D44\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_TL_Monk\"\nmsgid \"Wizard! A fellow named Monk wants to talk to you!\"\nmsgstr \"Wizard! A fellow named Monk wants to talk to you!\"\n\n#. Key:\tE8987AC84528E4071DC27E9854C3C4DE\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_TL_Monk\"\nmsgid \"Hello, little Wanderer!\"\nmsgstr \"Hello, little Wanderer!\"\n\n#. Key:\tFF355D9347D0068FBB40879E3EAEA8FB\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_TL_Monk\"\nmsgid \"But please...\"\nmsgstr \"But please...\"\n\n#. Key:\tAC0DE5F1402FBAAFE6587B827D463C3C\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/TL_SoulkeeperHint.TL_SoulkeeperHint:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/TL_SoulkeeperHint.TL_SoulkeeperHint:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_TL_SoulkeeperHint\"\nmsgid \"Use the Soulstone to summon the Keeper.\"\nmsgstr \"Use the Soulstone to summon the Keeper.\"\n\n#. Key:\t031849B3493F1528A0146DA55BD7F00F\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/TL_TakeSoulkeeperHint.TL_TakeSoulkeeperHint:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/TL_TakeSoulkeeperHint.TL_TakeSoulkeeperHint:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_TL_TakeSoulkeeperHint\"\nmsgid \"It would be easier if I could just simply summon her back to me...\"\nmsgstr \"It would be easier if I could just simply summon her back to me...\"\n\n#. Key:\t259EE9E14B86B2597D5F4EA60831D269\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/TL_TakeSoulkeeperHint.TL_TakeSoulkeeperHint:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/TL_TakeSoulkeeperHint.TL_TakeSoulkeeperHint:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_TL_TakeSoulkeeperHint\"\nmsgid \"Be more careful the next time...\"\nmsgstr \"Be more careful the next time...\"\n\n#. Key:\t86266BC54CC02BE988EA24B18BF76359\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/TL_TakeSoulkeeperHint.TL_TakeSoulkeeperHint:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/TL_TakeSoulkeeperHint.TL_TakeSoulkeeperHint:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_TL_TakeSoulkeeperHint\"\nmsgid \"Now go back to the Soulkeeper.\"\nmsgstr \"Now go back to the Soulkeeper.\"\n\n#. Key:\tDCA8CF9A4CFF4644FBD42EADBFC6E773\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/TL_TakeSoulkeeperHint.TL_TakeSoulkeeperHint:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/TL_TakeSoulkeeperHint.TL_TakeSoulkeeperHint:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_TL_TakeSoulkeeperHint\"\nmsgid \"Er... It's still with me.\"\nmsgstr \"Er... It's still with me.\"\n\n#. Key:\t012DDB8E4423EB98285155B3E1EFBF9A\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_65.Children(2).Children.Text\n#. Key:\t3485AE344D04D0944341F3A7391703EF\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.Children(3).Children.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_65.Children(2).Children.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.Children(3).Children.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"Set me free\"\nmsgstr \"Set me free\"\n\n#. Key:\t04E44BE94ABFE8614689AC890D01001D\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_65.Children(1).Children.Text\n#. Key:\t275944AA468D9CA8613B9586EC3D9C62\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.Children(2).Children.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_65.Children(1).Children.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.Children(2).Children.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"How to open gate\"\nmsgstr \"How to open gate\"\n\n#. Key:\t10EB6BE941C633380422F7953F0171DA\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"I think... I am...\"\nmsgstr \"I think... I am...\"\n\n#. Key:\t22618C8F490BC5932411FFB41F38C383\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.SpeechSequence(0).SpeechSequence.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.SpeechSequence(0).SpeechSequence.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"Oh! A walking ball!\"\nmsgstr \"Oh! A walking ball!\"\n\n#. Key:\t28ED4B8B4023E9A859B8A4BFF7DFEE8A\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"I am crazy, therefore I think!\"\nmsgstr \"I am crazy, therefore I think!\"\n\n#. Key:\t389F7FA440377CA4EBA31DA4EE2FEEAE\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_65.Children(3).Children.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_65.Children(3).Children.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"Leave\"\nmsgstr \"Leave\"\n\n#. Key:\t408E74BC4DBA10DA41853B9421DBA07B\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_65.Children(0).Children.Text\n#. Key:\t55BC9258400712FE4D5CED8BFA0AD22C\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.Children(1).Children.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_65.Children(0).Children.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.Children(1).Children.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"How to prove Worthy\"\nmsgstr \"How to prove Worthy\"\n\n#. Key:\t5D0DBB0344815D41A50D9FA178339BCA\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_24.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_24.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"Here, take one!\"\nmsgstr \"Here, take one!\"\n\n#. Key:\t5E8C88684BE93A26C26BFBAF23D69FD9\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.SpeechSequence(5).SpeechSequence.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.SpeechSequence(5).SpeechSequence.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"And I am not wise. In fact, I am totally crazy. But look on the bright side! At least I am aware of it.\"\nmsgstr \"And I am not wise. In fact, I am totally crazy. But look on the bright side! At least I am aware of it.\"\n\n#. Key:\t5F9588AA4FFA9FEB2C7101B32CB98950\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_55.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_55.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"Come back if you change your mind!\"\nmsgstr \"Come back if you change your mind!\"\n\n#. Key:\t69BF5D3C44D3BE2468ADDF97E99920E9\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"I think something's happening with the door's mechanism... but who knows? I can definitely hear some creaking! It's hard to guess which one of those is the real one...\"\nmsgstr \"I think something's happening with the door's mechanism... but who knows? I can definitely hear some creaking! It's hard to guess which one of those is the real one...\"\n\n#. Key:\t6B46CC3F44284076B1F460BEE2D93116\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.SpeechSequence(1).SpeechSequence.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.SpeechSequence(1).SpeechSequence.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"How unique, how original, how... sporty!\"\nmsgstr \"How unique, how original, how... sporty!\"\n\n#. Key:\t6DFC995B4364B6358A8F00BEDD007C80\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"I am, therefore I think!\"\nmsgstr \"I am, therefore I think!\"\n\n#. Key:\t72FA8AF8413CF23907BB9EA6587F512E\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_63.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_63.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"I was pretty sure I had to face him too... that's why I prepared! Potion of Worthiness! I have a few bottles...\"\nmsgstr \"I was pretty sure I had to face him too... that's why I prepared! Potion of Worthiness! I have a few bottles...\"\n\n#. Key:\t7BB736394144C8B2173886993EE33ADA\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"Look, I'm forced to stay in this realm so that I could do all these silly tasks for a wizard. Any chance you could help me with that? Please?\"\nmsgstr \"Look, I'm forced to stay in this realm so that I could do all these silly tasks for a wizard. Any chance you could help me with that? Please?\"\n\n#. Key:\t7E8985A441145AE9365C64810036EBE0\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.SpeechSequence(3).SpeechSequence.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.SpeechSequence(3).SpeechSequence.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"Actually yes, I...\"\nmsgstr \"Actually yes, I...\"\n\n#. Key:\t85CB0B164556D460A07F948F942D7AC4\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_61.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_61.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"That's how these rusty monsters work like: you pull a few levers here and there, and... whoops, the door is open! It's called science!\"\nmsgstr \"That's how these rusty monsters work like: you pull a few levers here and there, and... whoops, the door is open! It's called science!\"\n\n#. Key:\t878921884D0FDCFC78971E828C7D7FBB\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_66.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_66.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"I've got to go...\"\nmsgstr \"I've got to go...\"\n\n#. Key:\t8FF0B1A64B29AAB8DABAC49F5EBCE625\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_60.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_60.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"That's easy! Just pull every single lever you can find.\"\nmsgstr \"That's easy! Just pull every single lever you can find.\"\n\n#. Key:\t9163F7AB40673D9EB5C936A37CC7B0C7\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_62.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_62.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"Sounds like you met the GateKeeper!\"\nmsgstr \"Sounds like you met the GateKeeper!\"\n\n#. Key:\t96EED9B34D798E48F9B47283A5290A5B\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.SpeechSequence(4).SpeechSequence.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.SpeechSequence(4).SpeechSequence.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"It was a rhetorical question. I am not old!\"\nmsgstr \"It was a rhetorical question. I am not old!\"\n\n#. Key:\tB3141D2247D5DF307B63A4BF330F8070\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_67.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_67.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"Not really, I don't feel like helping you out. And to be honest, I prefer to stay away from wizards. Sorry!\"\nmsgstr \"Not really, I don't feel like helping you out. And to be honest, I prefer to stay away from wizards. Sorry!\"\n\n#. Key:\tB7A8F5A6474D18116F76BC929DB28D40\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"It's been nice meeting you.\"\nmsgstr \"It's been nice meeting you.\"\n\n#. Key:\tBE16F7204818B7231748D1B9C55DB4F6\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"Here, take this! I hope it's worth the trouble... hahaha... Thanks to you I can continue with my journey... after I read a few more pages, of course.\"\nmsgstr \"Here, take this! I hope it's worth the trouble... hahaha... Thanks to you I can continue with my journey... after I read a few more pages, of course.\"\n\n#. Key:\tBF9983D645C558E1AB5D559E70FEFDA0\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.SpeechSequence(6).SpeechSequence.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.SpeechSequence(6).SpeechSequence.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"Is there anything a middle-aged crazy gnome scientist can do for you? Now, this one is not a rhetorical question!\"\nmsgstr \"Is there anything a middle-aged crazy gnome scientist can do for you? Now, this one is not a rhetorical question!\"\n\n#. Key:\tC29E98A84971D7F0585C0F9522C30209\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_64.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_64.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"I will give you one if you are kind enough to open this door for me! I am stuck on the other side, you see...\"\nmsgstr \"I will give you one if you are kind enough to open this door for me! I am stuck on the other side, you see...\"\n\n#. Key:\tC8BEE9304FE466C0EB9F76A0B8A770D6\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.Children(0).Children.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.Children(0).Children.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"No way!\"\nmsgstr \"No way!\"\n\n#. Key:\tCB197A5E46F44960333A02B7691B0EA6\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"Thanks and good luck!\"\nmsgstr \"Thanks and good luck!\"\n\n#. Key:\tCD2D130744EE2EDC8C96B1A286FCCD28\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"Getting help from a mad scientist? Thanks, but I would rather skip that!\"\nmsgstr \"Getting help from a mad scientist? Thanks, but I would rather skip that!\"\n\n#. Key:\tD0A8B5EA452D49F6400A18A2CDAC9A0E\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_29.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_29.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"I am crazy, therefore I am!\"\nmsgstr \"I am crazy, therefore I am!\"\n\n#. Key:\tDA95542D4776F0EF7909078DED258AF8\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_27.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_27.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"You managed to open the gate! Well done!\"\nmsgstr \"You managed to open the gate! Well done!\"\n\n#. Key:\tDEC93709471D0B331684CFAF42A65B49\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_37.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_37.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"How unfortunate! And I thought that I was the idiot here. You will totally need my help... you'll see.\"\nmsgstr \"How unfortunate! And I thought that I was the idiot here. You will totally need my help... you'll see.\"\n\n#. Key:\tDF18B66D4109CAA0BCC1FDBED74521CD\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"Some kind of golem sent me here to prove my worthiness... any idea how I could do that?\"\nmsgstr \"Some kind of golem sent me here to prove my worthiness... any idea how I could do that?\"\n\n#. Key:\tE546AE1443A4262B05869CB758E42CF2\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.SpeechSequence(2).SpeechSequence.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.SpeechSequence(2).SpeechSequence.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"Is there anything an old wise gnome scientist could do for you, I wonder?\"\nmsgstr \"Is there anything an old wise gnome scientist could do for you, I wonder?\"\n\n#. Key:\tEEA782044BAA1D5C3B77D49DAE004512\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_58.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_58.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"Any idea how I could open this gate for you?\"\nmsgstr \"Any idea how I could open this gate for you?\"\n\n#. Key:\t04BFEE6A43E303DB376ACFA5F270F846\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"I've managed to get this obelisk thing. Do you know what it is?\"\nmsgstr \"I've managed to get this obelisk thing. Do you know what it is?\"\n\n#. Key:\t0A6FE902444DF9B2F18A95B495FB7A90\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"I... I don't know. They are kinda predictable though...\"\nmsgstr \"I... I don't know. They are kinda predictable though...\"\n\n#. Key:\t0AB07AB7403AECECD38D479D8F4A32D2\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"Don't care about it and you'll live longer.\"\nmsgstr \"Don't care about it and you'll live longer.\"\n\n#. Key:\t1026E61D4F2798A2E0FEE0B9ACA2135B\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"There is a floating magical thing right there...\"\nmsgstr \"There is a floating magical thing right there...\"\n\n#. Key:\t174506D944E38D478377CDA1DEF299B4\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"Isn't it weird that doors are always closed around these places?\"\nmsgstr \"Isn't it weird that doors are always closed around these places?\"\n\n#. Key:\t240F98824200E33959D455AF1A3219B8\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_37.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_37.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"This is my research project! Looks totally garbage, but sometimes even I cannot understand my brilliance.\"\nmsgstr \"This is my research project! Looks totally garbage, but sometimes even I cannot understand my brilliance.\"\n\n#. Key:\t24286C6A494F848CE13B5C98E38D4718\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_6.Children(0).Children.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_6.Children(0).Children.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"Let him answer\"\nmsgstr \"Let him answer\"\n\n#. Key:\t26727CAB403FA6DED50EC38ED01E4241\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"I found the secret hideout of the Secret Science Society. Is there anything you could tell me about them?\"\nmsgstr \"I found the secret hideout of the Secret Science Society. Is there anything you could tell me about them?\"\n\n#. Key:\t2BF9EF0C41CB352340F460AE4BC0FE02\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"I guess he will be happy if you return this to him, but otherwise it's garbage.\"\nmsgstr \"I guess he will be happy if you return this to him, but otherwise it's garbage.\"\n\n#. Key:\t315BB85E475FAA4C715E7F850B0E5EE2\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_24.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_24.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"Really? Then maybe I should give you this: another bottle of Potion of Worthiness!\"\nmsgstr \"Really? Then maybe I should give you this: another bottle of Potion of Worthiness!\"\n\n#. Key:\t316CF9AD4CF36FAFFAC45CA0A488FE53\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_57.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_57.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"I've got to go...\"\nmsgstr \"I've got to go...\"\n\n#. Key:\t3A9767C34F0BB6E9E131D8BC7A8D9A25\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_26.Children(1).Children.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_26.Children(1).Children.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"Secret Science Society\"\nmsgstr \"Secret Science Society\"\n\n#. Key:\t3E857073418A17EC48A1EA9D2B28A43E\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_30.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_30.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"I pulled a few levers here and there...\"\nmsgstr \"I pulled a few levers here and there...\"\n\n#. Key:\t4671C3394EAF0988255C8090B409415D\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"Yes, things like that happen here all the time. You'll get used to it.\"\nmsgstr \"Yes, things like that happen here all the time. You'll get used to it.\"\n\n#. Key:\t4709B6384B48D479672BC69EBC640C7E\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_31.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_31.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"Oh, really? That was nice, even if it was absolutely unnecessary! Never mind, here is your reward!\"\nmsgstr \"Oh, really? That was nice, even if it was absolutely unnecessary! Never mind, here is your reward!\"\n\n#. Key:\t5AE5A1A6408BC2EB0F9F96BA0826ACB0\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"Hmm... One of the creaks was a bit odd. I think the door will open soon!\"\nmsgstr \"Hmm... One of the creaks was a bit odd. I think the door will open soon!\"\n\n#. Key:\t5C81129F4B064C44F44335A3AB1CC178\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_29.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_29.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"The mind is furnished with ideas by a drunk upholsterer...\"\nmsgstr \"The mind is furnished with ideas by a drunk upholsterer...\"\n\n#. Key:\t5E441CF6434D7CA180853BBCBD6DFE44\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"Also, reading something represents such a nice way of killing time when I encounter a closed door!\"\nmsgstr \"Also, reading something represents such a nice way of killing time when I encounter a closed door!\"\n\n#. Key:\t6B46D1EC463D3B9A4BFBBDB7725C0C22\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"How about a deal? Open this door and I will give you another bottle from my collection of Potions of Worthiness.\"\nmsgstr \"How about a deal? Open this door and I will give you another bottle from my collection of Potions of Worthiness.\"\n\n#. Key:\t745CA5274A281AAA12CF798A53D54ACE\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_26.Children(3).Children.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_26.Children(3).Children.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"Ask about the book\"\nmsgstr \"Ask about the book\"\n\n#. Key:\t84DCE2A448C57E7FAD93CB9029BBD605\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_26.Children(0).Children.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_26.Children(0).Children.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"Floating obelisk\"\nmsgstr \"Floating obelisk\"\n\n#. Key:\t922B00804A843BD8EC9DB984D794F145\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"We met before, right? Of course we did.\"\nmsgstr \"We met before, right? Of course we did.\"\n\n#. Key:\t9837238E42F28684DEBA2DAF9B332415\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"It might actually be total nonsense. That's what I am trying to find out at the moment, so I am reading it again and again and again...\"\nmsgstr \"It might actually be total nonsense. That's what I am trying to find out at the moment, so I am reading it again and again and again...\"\n\n#. Key:\t995EAB564791A7F8BF34D3A26026F383\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_26.Children(4).Children.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_26.Children(4).Children.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"Leave\"\nmsgstr \"Leave\"\n\n#. Key:\t9AD95267429D21EE59DC83937AD6811A\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"This is a Memory Crystal made by a really old looking man I've met long ago.\"\nmsgstr \"This is a Memory Crystal made by a really old looking man I've met long ago.\"\n\n#. Key:\tA9DF44F54971A33775FF939FB292E26E\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"No man's knowledge here can go beyond my experience!\"\nmsgstr \"No man's knowledge here can go beyond my experience!\"\n\n#. Key:\tAC59E35B420DF0F9B771B9938AC23891\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"I sure can! They used to invent cool stuff back in the days, before... you know, everyone's mind decided to go a bit insane.\"\nmsgstr \"I sure can! They used to invent cool stuff back in the days, before... you know, everyone's mind decided to go a bit insane.\"\n\n#. Key:\tB1E177F0430A3887A76CFAA46CE650AD\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"I don’t know why we are here... maybe to enjoy ourselves?\"\nmsgstr \"I don’t know why we are here... maybe to enjoy ourselves?\"\n\n#. Key:\tB5E57C3A4B0D51020B4F3C872164E8F2\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_26.Children(2).Children.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_26.Children(2).Children.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"Another door\"\nmsgstr \"Another door\"\n\n#. Key:\tBA0C0F42482F357506A9C7ABADB6E49A\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_33.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_33.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"On the other hand, everyone is crazy these days... so we don't need doors anymore!\"\nmsgstr \"On the other hand, everyone is crazy these days... so we don't need doors anymore!\"\n\n#. Key:\tBAC86050470A5EC67C30349C6B13DFE0\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"To be perceived is to be!\"\nmsgstr \"To be perceived is to be!\"\n\n#. Key:\tBAD7934444B3EB256141BFB689BB83A0\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"I will let you know when I come up with something.\"\nmsgstr \"I will let you know when I come up with something.\"\n\n#. Key:\tBE5570C5477044DD0B1EEE928EAD8FA8\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_32.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_32.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"Nah. The world is full of crazy people. If I were sane, I would have liked to have as many closed doors as possible between me and those weirdos.\"\nmsgstr \"Nah. The world is full of crazy people. If I were sane, I would have liked to have as many closed doors as possible between me and those weirdos.\"\n\n#. Key:\tBE8120CC4E6A028BB45F10843F98135D\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"The door asks for a password that members use to enter the hideout... any idea what that could be?\"\nmsgstr \"The door asks for a password that members use to enter the hideout... any idea what that could be?\"\n\n#. Key:\tC7BE32BF43F7BA6D88A666956FAC35F3\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"I am here because I actually have to prove my worth again...\"\nmsgstr \"I am here because I actually have to prove my worth again...\"\n\n#. Key:\tC7ECC6D9457A4C49B39E98AEB14474E5\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_25.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_25.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"And I would actually feel much happier if I were on the other side of the door! You know,... I tried to ask it nicely to open and it just ignored me!\"\nmsgstr \"And I would actually feel much happier if I were on the other side of the door! You know,... I tried to ask it nicely to open and it just ignored me!\"\n\n#. Key:\tD2F4B8E44239904A7BD4DD90336C871A\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_45.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_45.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"What kind of book is that?\"\nmsgstr \"What kind of book is that?\"\n\n#. Key:\tED75E2104CCC3912A77DF18F7C916690\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"It was nice seeing you...\"\nmsgstr \"It was nice seeing you...\"\n\n#. Key:\tF87975A94604B526DE1B638250BD85A9\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_27.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_27.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"The gate is open! Maybe this creature has a heart after all... and probably started feeling sorry for me as well.\"\nmsgstr \"The gate is open! Maybe this creature has a heart after all... and probably started feeling sorry for me as well.\"\n\n#. Key:\tFE470DB5464E438A122FAFAF593AF92B\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"Let me see! Yes... Oh...\"\nmsgstr \"Let me see! Yes... Oh...\"\n\n#. Key:\t066896454B62A9809060EBB3E0222D9A\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_SpeechSequence_1.SpeechSequence(3).SpeechSequence.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_SpeechSequence_1.SpeechSequence(3).SpeechSequence.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"Also, after skipping a couple of lectures, I got fired from university.\"\nmsgstr \"Also, after skipping a couple of lectures, I got fired from university.\"\n\n#. Key:\t17D1F3394E12F6C85A11C2B3D3BD1ACE\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_SpeechSequence_1.SpeechSequence(0).SpeechSequence.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_SpeechSequence_1.SpeechSequence(0).SpeechSequence.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"I am a scientist! I managed to prove it! I discovered this when I was conducting my research on gnome behavior...\"\nmsgstr \"I am a scientist! I managed to prove it! I discovered this when I was conducting my research on gnome behavior...\"\n\n#. Key:\t17D8D3C2484BA654BEAE8CACA3AD7501\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"Help me out with the door for the last time, and I will give you my last potion!\"\nmsgstr \"Help me out with the door for the last time, and I will give you my last potion!\"\n\n#. Key:\t22439DB6407947A700A6E9AFB4D29261\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"Hello again! You remember me, right? I'm the gnome who was crazy before it was cool!\"\nmsgstr \"Hello again! You remember me, right? I'm the gnome who was crazy before it was cool!\"\n\n#. Key:\t2546F34E402CB4B25911238CC1E7A70F\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_29.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_29.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"Be as you with to seem.\\r\\n... or was it seem as you wish to be?\"\nmsgstr \"Be as you with to seem.\\r\\n... or was it seem as you wish to be?\"\n\n#. Key:\t2A78FDD9465789DC4FF5EB970C63F618\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"That is amazing! Thank you, my globular friend! Take these coins, I am sure you will enjoy spending them on... on whatever Balls like you like to spend.\"\nmsgstr \"That is amazing! Thank you, my globular friend! Take these coins, I am sure you will enjoy spending them on... on whatever Balls like you like to spend.\"\n\n#. Key:\t2EB726F641E4EF882228F6B49DA2B313\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_26.Children(1).Children.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_26.Children(1).Children.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"Password\"\nmsgstr \"Password\"\n\n#. Key:\t339840D54BD71CF86F9DE4A801B1414F\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"I sure can! They used to invent cool stuff back in the days, before... you know, everyone's mind decided to go a bit insane.\"\nmsgstr \"I sure can! They used to invent cool stuff back in the days, before... you know, everyone's mind decided to go a bit insane.\"\n\n#. Key:\t3E639AB84A0D241D73AB8A991A483090\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_26.Children(4).Children.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_26.Children(4).Children.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"Leave\"\nmsgstr \"Leave\"\n\n#. Key:\t464D32224CC04AD1F97602803245A37C\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"Take this! You deserve it...\"\nmsgstr \"Take this! You deserve it...\"\n\n#. Key:\t4BB0354D4398A4115F3A78B8EFCC7D16\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_27.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_27.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"I can't believe my eyes! It is open!\"\nmsgstr \"I can't believe my eyes! It is open!\"\n\n#. Key:\t6488288A45256CE464004F9BFF776850\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_24.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_24.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"It's your lucky day! Take this... it's my last bottle, but I guess your needs are greater than mine!\"\nmsgstr \"It's your lucky day! Take this... it's my last bottle, but I guess your needs are greater than mine!\"\n\n#. Key:\t696219734B2E6966C53BE8B43A0C2212\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"The unexamined life is not worth living!\"\nmsgstr \"The unexamined life is not worth living!\"\n\n#. Key:\t6FD516D14E42F5EC1D05CEA0F476BDEC\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"If you manage to find a strangely unique device in the hideout, I would be more than happy to buy that from you...\"\nmsgstr \"If you manage to find a strangely unique device in the hideout, I would be more than happy to buy that from you...\"\n\n#. Key:\t75BBEA604E9A3BAEF7599AA937E1AB2A\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"And you have the habit of needing my potions..\"\nmsgstr \"And you have the habit of needing my potions..\"\n\n#. Key:\t7978DCFE4044A6A3EC9F6BA54BAAD8BF\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"Yes, I am pretty sure this week is \\\"The only true wisdom is in knowing you know everything.\\\".\"\nmsgstr \"Yes, I am pretty sure this week is \\\"The only true wisdom is in knowing you know everything.\\\".\"\n\n#. Key:\t88881A3742ABFEAB95CA938C1AA81B60\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_25.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_25.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"I guess we are in the same boat - well, more or less... figuratively speaking, of course, because I can't really stand boats!\"\nmsgstr \"I guess we are in the same boat - well, more or less... figuratively speaking, of course, because I can't really stand boats!\"\n\n#. Key:\t8A80B7554F39A818E4E66294BAFC9A76\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_26.Children(0).Children.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_26.Children(0).Children.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"Secret Science Society\"\nmsgstr \"Secret Science Society\"\n\n#. Key:\t91E6FD4A44AB2E17C88767B0F17D6D1E\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_30.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_30.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"Why do you think that you're crazy?\"\nmsgstr \"Why do you think that you're crazy?\"\n\n#. Key:\t98E36F354D811F5DE5F98A942250997E\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"It is always wrong to believe everything!\"\nmsgstr \"It is always wrong to believe everything!\"\n\n#. Key:\t9B6EADBA4946B100D566988907A9675D\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"Any luck with the password for the Secret Science Society door?\"\nmsgstr \"Any luck with the password for the Secret Science Society door?\"\n\n#. Key:\tA0F52B7148A942673A3489857B8C6EA9\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_26.Children(2).Children.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_26.Children(2).Children.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"Give Weird Device\"\nmsgstr \"Give Weird Device\"\n\n#. Key:\tABE60F4D4709CCE1AF2A5197C03C8193\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"See you later...\"\nmsgstr \"See you later...\"\n\n#. Key:\tB07C5C9A48839C3E81F6FA8B7550BBA4\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"I also have the bad habit of being obstructed by closed doors!\"\nmsgstr \"I also have the bad habit of being obstructed by closed doors!\"\n\n#. Key:\tB7C7314840274942F6D606B35398F039\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"The door asks for a password that members need to provide in order to enter the hideout... any idea what that could be?\"\nmsgstr \"The door asks for a password that members need to provide in order to enter the hideout... any idea what that could be?\"\n\n#. Key:\tBB1AEBA44695D09192D7CA98AF9166B0\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_SpeechSequence_1.SpeechSequence(2).SpeechSequence.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_SpeechSequence_1.SpeechSequence(2).SpeechSequence.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"No wonder everyone started to consider me an idiot.\"\nmsgstr \"No wonder everyone started to consider me an idiot.\"\n\n#. Key:\tC0B9CA5E4273E95306AD0C824ADFD84B\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_SpeechSequence_1.SpeechSequence(1).SpeechSequence.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_SpeechSequence_1.SpeechSequence(1).SpeechSequence.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"Long story short, I used to do all these crazy things, like talking about the weather or taking naps in the afternoon. At first, they seemed okay to me but in reality what I was doing was totally ridiculous!\"\nmsgstr \"Long story short, I used to do all these crazy things, like talking about the weather or taking naps in the afternoon. At first, they seemed okay to me but in reality what I was doing was totally ridiculous!\"\n\n#. Key:\tC4193800427609972A2DECAB99D8CE6C\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"Hmm... One of the creaks was a bit odd. I think the door will open soon!\"\nmsgstr \"Hmm... One of the creaks was a bit odd. I think the door will open soon!\"\n\n#. Key:\tD1254F624213EAE67D6DD780182AA2DA\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"It was nice seeing you!\"\nmsgstr \"It was nice seeing you!\"\n\n#. Key:\tD19327714CD0B2833BC7EBBD1E89CC83\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_26.Children(3).Children.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_26.Children(3).Children.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"You Crazy?\"\nmsgstr \"You Crazy?\"\n\n#. Key:\tE5C93E794F71C393568D0B855117C738\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"I found the secret hideout of the Secret Science Society. Do you know anything about them?\"\nmsgstr \"I found the secret hideout of the Secret Science Society. Do you know anything about them?\"\n\n#. Key:\tEF216A2549E20C15A2C28184B62D45E6\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_36.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_36.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"Turns out that you cannot skip lectures if you're the teacher.\"\nmsgstr \"Turns out that you cannot skip lectures if you're the teacher.\"\n\n#. Key:\tEF650E874498865FA9FE6F9B9C37AB71\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"Here is the Weird Device I found in the hideout of the Secret Science Society.\"\nmsgstr \"Here is the Weird Device I found in the hideout of the Secret Science Society.\"\n\n#. Key:\t17A0CE394E01E1FFB31AA9A485E033AC\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_2.Children(4).Children.Text\n#: /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_2.Children(4).Children.Text\nmsgctxt \"Dialogue_TLSecretSocietyGate\"\nmsgid \"Mellon\"\nmsgstr \"Mellon\"\n\n#. Key:\t3293778C41F588EAC2DECDA76DA86A8E\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_2.Children(0).Children.Text\n#: /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_2.Children(0).Children.Text\nmsgctxt \"Dialogue_TLSecretSocietyGate\"\nmsgid \"The only...\"\nmsgstr \"The only...\"\n\n#. Key:\t359996CC441CAB0497303A9C666F0CCD\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_TLSecretSocietyGate\"\nmsgid \"*******? No, that is not correct.\"\nmsgstr \"*******? No, that is not correct.\"\n\n#. Key:\t3C864B7F434DA42CAB07BCA70FB2E6A6\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_1.Children(0).Children.Text\n#: /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_1.Children(0).Children.Text\nmsgctxt \"Dialogue_TLSecretSocietyGate\"\nmsgid \"Okay, whatever\"\nmsgstr \"Okay, whatever\"\n\n#. Key:\t40C27B354470AB53239424BCC2B8D259\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_TLSecretSocietyGate\"\nmsgid \"Do you really think secret scientists would use an elven word as a password? I don't even know what that means.\"\nmsgstr \"Do you really think secret scientists would use an elven word as a password? I don't even know what that means.\"\n\n#. Key:\t4E89070F413EF5CD964EEF90234BEBC5\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_TLSecretSocietyGate\"\nmsgid \"I am pretty sure that it is better to avoid the Secret Science Society anyways...\"\nmsgstr \"I am pretty sure that it is better to avoid the Secret Science Society anyways...\"\n\n#. Key:\t515B5424465F983D14F3E09B7686899D\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_TLSecretSocietyGate\"\nmsgid \"STOP! Do not move! This gate is only for the members of the Secret Science Society!\"\nmsgstr \"STOP! Do not move! This gate is only for the members of the Secret Science Society!\"\n\n#. Key:\t51706AD44D697A14E6392B97A9E30AFC\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_TLSecretSocietyGate\"\nmsgid \"That is the silliest combination I have ever heard about in my whole life! That's the kind of thing an idiot would carry in his luggage!\"\nmsgstr \"That is the silliest combination I have ever heard about in my whole life! That's the kind of thing an idiot would carry in his luggage!\"\n\n#. Key:\t60B0B4E04E74C474AC2F4F8422DCE753\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_3.Children(0).Children.Text\n#: /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_3.Children(0).Children.Text\nmsgctxt \"Dialogue_TLSecretSocietyGate\"\nmsgid \"Leave the gate\"\nmsgstr \"Leave the gate\"\n\n#. Key:\t6EB7FD9546B2B89557D9708942CE54BD\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_2.Children(2).Children.Text\n#: /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_2.Children(2).Children.Text\nmsgctxt \"Dialogue_TLSecretSocietyGate\"\nmsgid \"12345\"\nmsgstr \"12345\"\n\n#. Key:\t749AB9CD48924031317291A953254917\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_TLSecretSocietyGate\"\nmsgid \"That password is for witch and wizard kids, not for old, wise, world renowned secret scientists!\"\nmsgstr \"That password is for witch and wizard kids, not for old, wise, world renowned secret scientists!\"\n\n#. Key:\t7BB8FA8B4D051983390D3D8D4287DFEC\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_2.Children(1).Children.Text\n#: /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_2.Children(1).Children.Text\nmsgctxt \"Dialogue_TLSecretSocietyGate\"\nmsgid \"hunter2\"\nmsgstr \"hunter2\"\n\n#. Key:\t8CD051C44D9FBBD6D60694AFD2156D24\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_2.Children(5).Children.Text\n#: /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_2.Children(5).Children.Text\nmsgctxt \"Dialogue_TLSecretSocietyGate\"\nmsgid \"Try to gain some time\"\nmsgstr \"Try to gain some time\"\n\n#. Key:\t8F2244144056B8C389345F87D8C8B171\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_TLSecretSocietyGate\"\nmsgid \"I... I think I forgot... I have to remember it. I'll be back...\"\nmsgstr \"I... I think I forgot... I have to remember it. I'll be back...\"\n\n#. Key:\t8FC96FE94C115E3EDB214CAA3B380072\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_TLSecretSocietyGate\"\nmsgid \"Let us go on with the standard protocol then. Tell me the password of the week.\"\nmsgstr \"Let us go on with the standard protocol then. Tell me the password of the week.\"\n\n#. Key:\tAA10FF02426D2C5DB9F7CF90596631C4\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_1.Children(1).Children.Text\n#: /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_1.Children(1).Children.Text\nmsgctxt \"Dialogue_TLSecretSocietyGate\"\nmsgid \"I am a member\"\nmsgstr \"I am a member\"\n\n#. Key:\tB5237D1B4EFB02B1ED5017B68EC5A7EC\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_TLSecretSocietyGate\"\nmsgid \"Are you a member? Prove it! What is the password of the week?\"\nmsgstr \"Are you a member? Prove it! What is the password of the week?\"\n\n#. Key:\tC8A1985C416AEA563142D7BF3B6DD77D\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_2.Children(3).Children.Text\n#: /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_2.Children(3).Children.Text\nmsgctxt \"Dialogue_TLSecretSocietyGate\"\nmsgid \"Caput Draconis\"\nmsgstr \"Caput Draconis\"\n\n#. Key:\tDC8F07EA44A20BEF70DFCDA4A62A421E\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_TLSecretSocietyGate\"\nmsgid \"Correct. Welcome to the secret hideout 12345, scientist!\"\nmsgstr \"Correct. Welcome to the secret hideout 12345, scientist!\"\n\n#. Key:\tE0C10509474191587635B48ED0AA6913\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_TLSecretSocietyGate\"\nmsgid \"The only true wisdom is in knowing you know everything!\"\nmsgstr \"The only true wisdom is in knowing you know everything!\"\n\n#. Key:\t0707F21D4313073F47F3C69B64D61DB7\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_TombOfTabby\"\nmsgid \"Take this. It's all I can give now.\"\nmsgstr \"Take this. It's all I can give now.\"\n\n#. Key:\t0918993B4F680528806DE680B471F795\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_TombOfTabby\"\nmsgid \"It was too much. I couldn’t keep on. I failed.\"\nmsgstr \"It was too much. I couldn’t keep on. I failed.\"\n\n#. Key:\t1598C2DE44A0BF92DC0E53BFAC47DEF5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_3.Children(3).Children.Text\n#: /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_3.Children(3).Children.Text\nmsgctxt \"Dialogue_TombOfTabby\"\nmsgid \"Leave\"\nmsgstr \"Leave\"\n\n#. Key:\t1EF84FFD484E968FBDFE1386018485DB\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_3.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_3.Children(1).Children.Text\nmsgctxt \"Dialogue_TombOfTabby\"\nmsgid \"Raven\"\nmsgstr \"Raven\"\n\n#. Key:\t3343471F42742EEE0678D49E466448F1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_TombOfTabby\"\nmsgid \"Tell me the name!\"\nmsgstr \"Tell me the name!\"\n\n#. Key:\t3DC816F147ACB79D6339D5AD31E0C5A5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_TombOfTabby\"\nmsgid \"Lillian!\"\nmsgstr \"Lillian!\"\n\n#. Key:\t3DE5FFEB4A5BEC150306999FDEF058BC\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_TombOfTabby\"\nmsgid \"Here lies Tabby, wanderer of the Ruined Realm. We will never forget what you did for us. May your spirit find peace in the afterlife.\"\nmsgstr \"Here lies Tabby, wanderer of the Ruined Realm. We will never forget what you did for us. May your spirit find peace in the afterlife.\"\n\n#. Key:\t43F7C0AE4CB91D3957AB4CA54C1D4426\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_TombOfTabby\"\nmsgid \"He took the artefacts. His master never knew it.\"\nmsgstr \"He took the artefacts. His master never knew it.\"\n\n#. Key:\t57A0634946BB9FD9603572ABD9368E52\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_3.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_3.Children(0).Children.Text\nmsgctxt \"Dialogue_TombOfTabby\"\nmsgid \"Wizard\"\nmsgstr \"Wizard\"\n\n#. Key:\t5A6E99154FB027A82922FA91A9448E14\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_TombOfTabby\"\nmsgid \"I’m leaving... I didn’t want to bother you. May you find peace at last.\"\nmsgstr \"I’m leaving... I didn’t want to bother you. May you find peace at last.\"\n\n#. Key:\t6A716E164BAACFAFB2EBDBBA8C04438F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_TombOfTabby\"\nmsgid \"He liked Lillian. He finished what I started.\"\nmsgstr \"He liked Lillian. He finished what I started.\"\n\n#. Key:\t7CDFB36B41931AADE01C10A465D09EAF\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_TombOfTabby\"\nmsgid \"Rest in peace!\"\nmsgstr \"Rest in peace!\"\n\n#. Key:\t831693034CD9AC88A07F1297BBB10056\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_TombOfTabby\"\nmsgid \"I will be there on her side again when the time comes.\"\nmsgstr \"I will be there on her side again when the time comes.\"\n\n#. Key:\tA78C16A943587C5EC876BFB0AA319421\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_TombOfTabby\"\nmsgid \"She is my only true master. I can’t leave her. Not yet.\"\nmsgstr \"She is my only true master. I can’t leave her. Not yet.\"\n\n#. Key:\tC86836A149E8580E4608259C8482314F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_TombOfTabby\"\nmsgid \"Raven!\"\nmsgstr \"Raven!\"\n\n#. Key:\tD05E5AEF498C383F88D1AFBBDF371CDA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_TombOfTabby\"\nmsgid \"He forced me. Though I understood. I wanted the same.\"\nmsgstr \"He forced me. Though I understood. I wanted the same.\"\n\n#. Key:\tE41ADE774AF3AF3FE637CE81531F3D29\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_3.Children(2).Children.Text\n#: /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_3.Children(2).Children.Text\nmsgctxt \"Dialogue_TombOfTabby\"\nmsgid \"Lillian\"\nmsgstr \"Lillian\"\n\n#. Key:\tED18C66D47BF594818C5DA8100AC2A36\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_TombOfTabby\"\nmsgid \"You are familiar... I almost remember...\"\nmsgstr \"You are familiar... I almost remember...\"\n\n#. Key:\tF6D8BC4F489D87A90E852CA3F97B479F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_TombOfTabby\"\nmsgid \"Wizard!\"\nmsgstr \"Wizard!\"\n\n#. Key:\t2A0E02C94A04642C5096038C615E0D5B\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/tut2.tut2:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/tut2.tut2:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_tut2\"\nmsgid \"I see you managed to shape that ball body of yours… that’s interesting.\"\nmsgstr \"I see you managed to shape that ball body of yours… that’s interesting.\"\n\n#. Key:\t4D59C307403F27C91A9168AB58CDB1B3\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/tut2.tut2:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/tut2.tut2:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_tut2\"\nmsgid \"I didn’t want to summon you. I wanted to get my daughter back.\"\nmsgstr \"I didn’t want to summon you. I wanted to get my daughter back.\"\n\n#. Key:\t8336FD024F34227E1AB7B1BFCCF7FFBF\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/tut2.tut2:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/tut2.tut2:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_tut2\"\nmsgid \"Your presence is not welcome here, demon!\"\nmsgstr \"Your presence is not welcome here, demon!\"\n\n#. Key:\t16A6E7D24DFE49D6844E92B8E476BA66\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/tut5.tut5:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/tut5.tut5:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_tut5\"\nmsgid \"Once you are done I will set you free.\"\nmsgstr \"Once you are done I will set you free.\"\n\n#. Key:\t48FA56EF4293C577CB1977BE694034CC\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/tut5.tut5:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/tut5.tut5:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_tut5\"\nmsgid \"This is the deal demon...\"\nmsgstr \"This is the deal demon...\"\n\n#. Key:\tA27765824FDD88A579AB6180DDEA06B1\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/tut5.tut5:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/tut5.tut5:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_tut5\"\nmsgid \"Get into the Heart of the Realm and find the three Artefacts! I need those to correct the summoning.\"\nmsgstr \"Get into the Heart of the Realm and find the three Artefacts! I need those to correct the summoning.\"\n\n#. Key:\t5E1F54384BC258A91FF1DD9ECBC0DF39\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/tut8.tut8:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/tut8.tut8:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_tut8\"\nmsgid \"A cat that used to help my daughter to explore these realms.\"\nmsgstr \"A cat that used to help my daughter to explore these realms.\"\n\n#. Key:\t859621E24125177084F4EAA39CF77902\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/tut8.tut8:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/tut8.tut8:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_tut8\"\nmsgid \"Who is Tabby?\"\nmsgstr \"Who is Tabby?\"\n\n#. Key:\tD0BFF857414714D7C5FCB9B526539215\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/tut8.tut8:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/tut8.tut8:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_tut8\"\nmsgid \"Tabby was formidable with her claws, but you will need that sword.\"\nmsgstr \"Tabby was formidable with her claws, but you will need that sword.\"\n\n#. Key:\tDFCB1A1E48763642E71FD7A040F72F1B\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/tut8.tut8:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/tut8.tut8:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_tut8\"\nmsgid \"So he did the hard job before me...\"\nmsgstr \"So he did the hard job before me...\"\n\n#. Key:\t2DD05A7E485B5C23DA0DCD84400D3F23\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/tut9.tut9:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/tut9.tut9:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_tut9\"\nmsgid \"What could be possibly weird for a walking ball?\"\nmsgstr \"What could be possibly weird for a walking ball?\"\n\n#. Key:\t62A1ECFC47B762221EA0B1B5B0E0BEF6\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/tut9.tut9:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/tut9.tut9:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_tut9\"\nmsgid \"This place is in a better shape...\"\nmsgstr \"This place is in a better shape...\"\n\n#. Key:\tA9BCFBB541A9A2CEA8FB90884B8557C5\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/tut9.tut9:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/tut9.tut9:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_tut9\"\nmsgid \"The Ancient Magic is still strong within these walls. It keeps the Ruin at bay.\"\nmsgstr \"The Ancient Magic is still strong within these walls. It keeps the Ruin at bay.\"\n\n#. Key:\tF9551D7849226F88A4FD15AAFB4789E6\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/tut9.tut9:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/tut9.tut9:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_tut9\"\nmsgid \"Be careful though... it can have the weirdest side effects.\"\nmsgstr \"Be careful though... it can have the weirdest side effects.\"\n\n#. Key:\t302976FD411E850B3CD7CEA7E0BF6924\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Wizard.Wizard:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/Ending/E1/Wizard.Wizard:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_Wizard\"\nmsgid \"Please wait outside until I repeat the spell. Once Lillian is back, I’ll take you home.\"\nmsgstr \"Please wait outside until I repeat the spell. Once Lillian is back, I’ll take you home.\"\n\n#. Key:\t3851C21F419E9F1D29A06DA3B2A0F553\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Wizard.Wizard:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Ending/E1/Wizard.Wizard:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_Wizard\"\nmsgid \"Er... your room is still as untidy as last time, but no problem.\"\nmsgstr \"Er... your room is still as untidy as last time, but no problem.\"\n\n#. Key:\t6CCE5BBC4135176C1FBD8E866FD4B098\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Wizard.Wizard:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Ending/E1/Wizard.Wizard:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_Wizard\"\nmsgid \"I’m sorry we met like this.\"\nmsgstr \"I’m sorry we met like this.\"\n\n#. Key:\t7511912D4F72D1D45CFFB9AA9815CCB2\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Wizard.Wizard:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E1/Wizard.Wizard:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_Wizard\"\nmsgid \"Yes... and thank you!\"\nmsgstr \"Yes... and thank you!\"\n\n#. Key:\tAC1641244DF694B660EAFDA1FC4A177B\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Wizard.Wizard:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E1/Wizard.Wizard:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_Wizard\"\nmsgid \"Here are your artefacts! I made my part of the deal.\"\nmsgstr \"Here are your artefacts! I made my part of the deal.\"\n\n#. Key:\tB567059148744E3F7A4D3B929F26CBB6\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Wizard.Wizard:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Ending/E1/Wizard.Wizard:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_Wizard\"\nmsgid \"Yes, we made a deal!\"\nmsgstr \"Yes, we made a deal!\"\n\n#. Key:\tC2ED3A564A55A644D33F9E9E38D1676A\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Wizard.Wizard:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Ending/E1/Wizard.Wizard:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_Wizard\"\nmsgid \"Give me a few more minutes to finish what we started!\"\nmsgstr \"Give me a few more minutes to finish what we started!\"\n\n#. Key:\tE1521B0B46F26BFA464C6C81EC2D4900\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Wizard.Wizard:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Ending/E1/Wizard.Wizard:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_Wizard\"\nmsgid \"Will you release me?\"\nmsgstr \"Will you release me?\"\n\n#. Key:\tFE3EE6014784FCE7EB8001BC1E77D833\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Wizard.Wizard:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Ending/E1/Wizard.Wizard:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_Wizard\"\nmsgid \"Er... excuse me for being rude with you. I might have misjudged you. And, anyway...\"\nmsgstr \"Er... excuse me for being rude with you. I might have misjudged you. And, anyway...\"\n\n#. Key:\t0D3B0F654B4B3FC1AE9B46809DA7FD74\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter2/Wizard_AfterMonk.Wizard_AfterMonk:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Wizard/Chapter2/Wizard_AfterMonk.Wizard_AfterMonk:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_Wizard_AfterMonk\"\nmsgid \"What did he say?\"\nmsgstr \"What did he say?\"\n\n#. Key:\tDE149D01484DA8CD03D1C0848D01BEA6\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter2/Wizard_AfterMonk.Wizard_AfterMonk:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Wizard/Chapter2/Wizard_AfterMonk.Wizard_AfterMonk:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_Wizard_AfterMonk\"\nmsgid \"Nothing...\"\nmsgstr \"Nothing...\"\n\n#. Key:\t1E43B5674AB45A7BDBEED1BE2AE25FE8\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter2/Wizard_Artefact1.Wizard_Artefact1:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Wizard/Chapter2/Wizard_Artefact1.Wizard_Artefact1:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_Wizard_Artefact1\"\nmsgid \"Well done. Now we have the first artefact. There are only two left...\"\nmsgstr \"Well done. Now we have the first artefact. There are only two left...\"\n\n#. Key:\t45AB81D94B2C6C9B13A49C944AD80389\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter2/Wizard_Artefact1.Wizard_Artefact1:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Wizard/Chapter2/Wizard_Artefact1.Wizard_Artefact1:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_Wizard_Artefact1\"\nmsgid \"Don’t tell me I will need to kill another two of these!\"\nmsgstr \"Don’t tell me I will need to kill another two of these!\"\n\n#. Key:\t3CBF720A438F217805FD5F85990FF515\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter2/Wizard_Artefact2.Wizard_Artefact2:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Wizard/Chapter2/Wizard_Artefact2.Wizard_Artefact2:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_Wizard_Artefact2\"\nmsgid \"We are close! Only one artefact is missing.\"\nmsgstr \"We are close! Only one artefact is missing.\"\n\n#. Key:\tFD6163CC43BF00E4DB95CBB11CA7D389\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter2/Wizard_Artefact2.Wizard_Artefact2:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Wizard/Chapter2/Wizard_Artefact2.Wizard_Artefact2:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_Wizard_Artefact2\"\nmsgid \"What I miss is a comfortable apartment somewhere safe...\"\nmsgstr \"What I miss is a comfortable apartment somewhere safe...\"\n\n#. Key:\t0D37E1DE44FDF7C5BF8DD28C038FA49D\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter2/Wizard_Artefact3.Wizard_Artefact3:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Wizard/Chapter2/Wizard_Artefact3.Wizard_Artefact3:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_Wizard_Artefact3\"\nmsgid \"What? Can’t you just... oh, forget it!\"\nmsgstr \"What? Can’t you just... oh, forget it!\"\n\n#. Key:\t2BDFD83247C8B644DED9CAA6486A064F\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter2/Wizard_Artefact3.Wizard_Artefact3:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Wizard/Chapter2/Wizard_Artefact3.Wizard_Artefact3:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_Wizard_Artefact3\"\nmsgid \"Yes, I’ve done what you asked. Now it’s your turn. Set me free!\"\nmsgstr \"Yes, I’ve done what you asked. Now it’s your turn. Set me free!\"\n\n#. Key:\t8CCAFBA148F1834EABE12CAC93669A79\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter2/Wizard_Artefact3.Wizard_Artefact3:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Wizard/Chapter2/Wizard_Artefact3.Wizard_Artefact3:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_Wizard_Artefact3\"\nmsgid \"I have to admit I’m impressed. You found all the three artefacts.\"\nmsgstr \"I have to admit I’m impressed. You found all the three artefacts.\"\n\n#. Key:\tA54C612946D6A5EB76D38B8622F4F76C\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter2/Wizard_Artefact3.Wizard_Artefact3:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Wizard/Chapter2/Wizard_Artefact3.Wizard_Artefact3:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_Wizard_Artefact3\"\nmsgid \"All right demon. Use the railways to travel to World’s End. That’s where I can bring you back.\"\nmsgstr \"All right demon. Use the railways to travel to World’s End. That’s where I can bring you back.\"\n\n#. Key:\t05FE50EE4B18F4FE9C1559979669E616\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"Still nothing, but nobody said anything about any visible change at this point, right?\"\nmsgstr \"Still nothing, but nobody said anything about any visible change at this point, right?\"\n\n#. Key:\t0DDE5A0E47BADFCA9E6E98A10F0AF114\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_1.Children(0).Children.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_1.Children(0).Children.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"Craft Ghost Abacus\"\nmsgstr \"Craft Ghost Abacus\"\n\n#. Key:\t0F4008294D6FA43C3D9C17BA600FB024\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"You have a glowing hammer. What's next?\"\nmsgstr \"You have a glowing hammer. What's next?\"\n\n#. Key:\t26089F6044B0FD1134C9C99AF17E9E0C\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_7.Children(4).Children.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_7.Children(4).Children.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"Say a different color\"\nmsgstr \"Say a different color\"\n\n#. Key:\t29FFB2FF49C6C231583FF1B549DA218C\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"Gnome magic at its best. Did you do everything the way it was supposed to be done? You should find out soon... maybe.\"\nmsgstr \"Gnome magic at its best. Did you do everything the way it was supposed to be done? You should find out soon... maybe.\"\n\n#. Key:\t2BF7D8D726080F0A003A0229BE7871C7\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"With the proper instructions and materials you could definitely create something valuable here.\"\nmsgstr \"With the proper instructions and materials you could definitely create something valuable here.\"\n\n#. Key:\t3231FF0D4A2BBEE3E3AD7598E5105E0E\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"The object is coagulated into a single Surrected object!\"\nmsgstr \"The object is coagulated into a single Surrected object!\"\n\n#. Key:\t41335322411CF278B19849AC696E6F93\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_2.Children(4).Children.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_2.Children(4).Children.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"Break the abacus into pieces\"\nmsgstr \"Break the abacus into pieces\"\n\n#. Key:\t4C74F3C342690A8246916B85FF4685C9\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"The abacus does not show any emotion.\"\nmsgstr \"The abacus does not show any emotion.\"\n\n#. Key:\t4F8E51DA4C0B33020E34AF9AB47BCCD5\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_7.Children(0).Children.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_7.Children(0).Children.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"Croon \\\"La La LaLaLa LaLaLa\\\"\"\nmsgstr \"Croon \\\"La La LaLaLa LaLaLa\\\"\"\n\n#. Key:\t5404D10943BB5F53229FDC845E60B000\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_7.Children(5).Children.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_7.Children(5).Children.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"Give up for now\"\nmsgstr \"Give up for now\"\n\n#. Key:\t5548D94E415483F129CCA7A3102B9DB3\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"Poor Abacus. It is broken into pieces now.\"\nmsgstr \"Poor Abacus. It is broken into pieces now.\"\n\n#. Key:\t6F3DE41D43326079A2BD72A29059FBA9\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"You have the Abacus and the Ghost Flower Petals in front of you. The workshop has all the tools you need. How do you proceed?\"\nmsgstr \"You have the Abacus and the Ghost Flower Petals in front of you. The workshop has all the tools you need. How do you proceed?\"\n\n#. Key:\t7EE3EE474090DCA65BB3199E69E83B43\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_1.Children(1).Children.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_1.Children(1).Children.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"Leave\"\nmsgstr \"Leave\"\n\n#. Key:\t87B760894A587B34EB825487D907D2E4\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_7.Children(1).Children.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_7.Children(1).Children.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"Croon \\\"La LaLa LaLaLa LaLaLa\\\"\"\nmsgstr \"Croon \\\"La LaLa LaLaLa LaLaLa\\\"\"\n\n#. Key:\t947E69AA4EEE6DB329FAD48214D4C416\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_2.Children(0).Children.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_2.Children(0).Children.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"Say \\\"Sorry my <object name>!\\\"\"\nmsgstr \"Say \\\"Sorry my <object name>!\\\"\"\n\n#. Key:\t95D5418F4145388680D7C99F720CE191\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_7.Children(3).Children.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_7.Children(3).Children.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"Say \\\"Brown\\\"\"\nmsgstr \"Say \\\"Brown\\\"\"\n\n#. Key:\tC184ED314482D706C3426CB5034C3AFD\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_7.Children(2).Children.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_7.Children(2).Children.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"Say \\\"Blue\\\"\"\nmsgstr \"Say \\\"Blue\\\"\"\n\n#. Key:\tC7EB7FC648E0005DC35550A3D71DF221\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_2.Children(3).Children.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_2.Children(3).Children.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"Cover the Abacus with Petals\"\nmsgstr \"Cover the Abacus with Petals\"\n\n#. Key:\tCA7A7E0A4F16FBE20EE16395D6565D7E\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"Maybe the abacus is a bit more ghosty now... or is it just you getting tired of trying?\"\nmsgstr \"Maybe the abacus is a bit more ghosty now... or is it just you getting tired of trying?\"\n\n#. Key:\tE0507C5E44553E824F998D8D4CB044A4\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"Your last action did not lead to any visible change. What is your next move?\"\nmsgstr \"Your last action did not lead to any visible change. What is your next move?\"\n\n#. Key:\tE8550D874C73F12B76345D9AAB2FEB80\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_2.Children(2).Children.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_2.Children(2).Children.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"Heat a hammer\"\nmsgstr \"Heat a hammer\"\n\n#. Key:\tE894C6624CC7A0F92CECBBB364C77CD1\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_2.Children(1).Children.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_2.Children(1).Children.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"Say \\\"Sorry my Abacus!\\\"\"\nmsgstr \"Say \\\"Sorry my Abacus!\\\"\"\n\n#. Key:\tEFC4E9AB4A1B8DF491B4FBABBC7FA560\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"The Abacus is covered with the Petals of the Ghost Flower.\"\nmsgstr \"The Abacus is covered with the Petals of the Ghost Flower.\"\n\n#. Key:\t100A735A460E0DE2B0D130B802762D8B\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter2/WW_Scroll_Inspect.WW_Scroll_Inspect:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Wizard/Chapter2/WW_Scroll_Inspect.WW_Scroll_Inspect:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_WW_Scroll_Inspect\"\nmsgid \"It says: \\\"Be careful: I think there are Fishies in the water!\\\"\"\nmsgstr \"It says: \\\"Be careful: I think there are Fishies in the water!\\\"\"\n\n#. Key:\t1D280F60496F7EF5DBDADB90674E8225\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter2/WW_Scroll_Inspect.WW_Scroll_Inspect:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Wizard/Chapter2/WW_Scroll_Inspect.WW_Scroll_Inspect:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_WW_Scroll_Inspect\"\nmsgid \"He was.\"\nmsgstr \"He was.\"\n\n#. Key:\t37D4983B49B8986752A095B03ADCD700\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter2/WW_Scroll_Inspect.WW_Scroll_Inspect:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Wizard/Chapter2/WW_Scroll_Inspect.WW_Scroll_Inspect:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_WW_Scroll_Inspect\"\nmsgid \"He was right.\"\nmsgstr \"He was right.\"\n\n#. Key:\t26432B92474630595CF8B6B44B02657B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_26.Text\n#: /Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_26.Text\nmsgctxt \"Dialogue_WWSewerCreatures\"\nmsgid \"Farewell and good luck to you as well!\"\nmsgstr \"Farewell and good luck to you as well!\"\n\n#. Key:\t2E3C904D458640A4F06DD793B416366A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_WWSewerCreatures\"\nmsgid \"All right, I will return when I'm done.\"\nmsgstr \"All right, I will return when I'm done.\"\n\n#. Key:\t382595684668BDA97AAB95BF129246E4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_WWSewerCreatures\"\nmsgid \"No problem. I always help when I can.\"\nmsgstr \"No problem. I always help when I can.\"\n\n#. Key:\t4BF10AD741739BE69EF797A32410C281\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_WWSewerCreatures\"\nmsgid \"One of your brothers is trapped? What happened?\"\nmsgstr \"One of your brothers is trapped? What happened?\"\n\n#. Key:\t52403E3341ECEA5801B0E58D2F472FD5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_1.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_1.Children(1).Children.Text\nmsgctxt \"Dialogue_WWSewerCreatures\"\nmsgid \"Leave\"\nmsgstr \"Leave\"\n\n#. Key:\t53AC225B4F21B68CAC6F8997F324124E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_29.Text\n#: /Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_29.Text\nmsgctxt \"Dialogue_WWSewerCreatures\"\nmsgid \"Farewell until we meet again!\"\nmsgstr \"Farewell until we meet again!\"\n\n#. Key:\t65042BC342E9717229E74A9DD272DC5F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_WWSewerCreatures\"\nmsgid \"It was nice to see you again.\"\nmsgstr \"It was nice to see you again.\"\n\n#. Key:\t77959A144131C47488B221ADD9B1E13B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_WWSewerCreatures\"\nmsgid \"Don't worry! I'm still looking for it.\"\nmsgstr \"Don't worry! I'm still looking for it.\"\n\n#. Key:\t7914F3CA40844C2A13A760BB0DAE1BFA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_WWSewerCreatures\"\nmsgid \"I don't have time for you creature! Stay out of my way!\"\nmsgstr \"I don't have time for you creature! Stay out of my way!\"\n\n#. Key:\t79A62658414FE0202F2E9AA0E0238BD4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_9.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_9.Children(0).Children.Text\nmsgctxt \"Dialogue_WWSewerCreatures\"\nmsgid \"Accept Quest\"\nmsgstr \"Accept Quest\"\n\n#. Key:\t9AEDA0E84BABEBCD8F18E8BC2D0B75D0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_WWSewerCreatures\"\nmsgid \"Calm down creature! I mean you no harm.\"\nmsgstr \"Calm down creature! I mean you no harm.\"\n\n#. Key:\tB89304534B24114D19DF7AB07635FFDE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_WWSewerCreatures\"\nmsgid \"All right I will see what I can do.\"\nmsgstr \"All right I will see what I can do.\"\n\n#. Key:\tB8BD374E4738BFFDAFAC4EAA19E7A9D2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_23.Text\n#: /Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_23.Text\nmsgctxt \"Dialogue_WWSewerCreatures\"\nmsgid \"Oh, thank you!\"\nmsgstr \"Oh, thank you!\"\n\n#. Key:\tCF62984840B7508E82BAC0AB9D53EC0A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_9.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_9.Children(1).Children.Text\nmsgctxt \"Dialogue_WWSewerCreatures\"\nmsgid \"Decline\"\nmsgstr \"Decline\"\n\n#. Key:\tEAD329F04773358B0CA339A4F155D990\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_WWSewerCreatures\"\nmsgid \"I'm sorry but I can't help you.\"\nmsgstr \"I'm sorry but I can't help you.\"\n\n#. Key:\tF281396D4110E61ACFEFDBB7AD8E44A8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_1.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_1.Children(0).Children.Text\nmsgctxt \"Dialogue_WWSewerCreatures\"\nmsgid \"Help\"\nmsgstr \"Help\"\n\n#. Key:\tedge_next\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_1.InnerEdges(0).InnerEdges.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_1.InnerEdges(0).InnerEdges.Text\nmsgctxt \"DlgSystemSettings\"\nmsgid \"Next\"\nmsgstr \"Next\"\n\n"
  },
  {
    "path": "Content/Localization/WarriorbDialogues/es/WarriorbDialogues.po",
    "content": "﻿# WarriorbDialogues Spanish translation.\n# Copyright 1998-2019 Epic Games, Inc. All Rights Reserved.\n# \nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: WarriorbDialogues\\n\"\n\"POT-Creation-Date: 2020-10-07 08:09\\n\"\n\"PO-Revision-Date: 2020-10-07 08:09\\n\"\n\"Language-Team: \\n\"\n\"Language: es\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Plural-Forms: nplurals=2; plural=(n != 1);\\n\"\n\n#. Key:\t064BBCD1476819100C8D39881B7A7C56\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/2HW_LRDoor.2HW_LRDoor:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E2/2HW_LRDoor.2HW_LRDoor:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_2HW_LRDoor\"\nmsgid \"They still didn’t notice I locked them into the workroom.\"\nmsgstr \"No se dieron cuenta de que los encerré en la cuarto de trabajo.\"\n\n#. Key:\t21412F0A4E45FA97703599BACD9C5D0E\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/2HW_LRDoor.2HW_LRDoor:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Ending/E2/2HW_LRDoor.2HW_LRDoor:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_2HW_LRDoor\"\nmsgid \"I entered into the Laboratory.\"\nmsgstr \"Entré en el laboratorio.\"\n\n#. Key:\t5A580A014B6E9907C819808423E10C30\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/2HW_LRDoor.2HW_LRDoor:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E2/2HW_LRDoor.2HW_LRDoor:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_2HW_LRDoor\"\nmsgid \"The Laboratory has strong secure spells. I can’t enter here without being noticed.\"\nmsgstr \"El laboratorio tiene fuertes hechizos de seguridad. No puedo entrar aquí sin ser notado.\"\n\n#. Key:\t0530863744A9844E7F64009D82A189E4\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_2HW_WRDoor\"\nmsgid \"Ruin is close and we are all at risk. It’s not about you. It's about everyone.\"\nmsgstr \"Ruin está cerca y todos estamos en riesgo. No es sobre ti. Se trata de todos.\"\n\n#. Key:\t1AF2A89F4DCD86096D4343ABBE91BE51\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_2HW_WRDoor\"\nmsgid \"Something which doesn’t take my daughter’s soul...\"\nmsgstr \"Algo que no toma el alma de mi hija...\"\n\n#. Key:\t2C5B294847F0E41F2CA189904EE66059\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_2HW_WRDoor\"\nmsgid \"I heard father arguing with someone.\"\nmsgstr \"Escuché a mi padre discutiendo con alguien.\"\n\n#. Key:\t2C8DFF1042FB0480709877A366BE2F1D\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_2HW_WRDoor\"\nmsgid \"The device must be destroyed.. We’ll find something else to stop Ruin.\"\nmsgstr \"El aparato debe ser destruido. Encontraremos algo más para detener a Ruin.\"\n\n#. Key:\t3F9D7D9C42A8550A6B282680BFAE2CCC\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_2HW_WRDoor\"\nmsgid \"I had to do this. At least for mom. So that she didn’t die in vain.\"\nmsgstr \"Tuve que hacer esto. Al menos para mamá. Para que no muriera en vano.\"\n\n#. Key:\t7F6FC84C4D799841C6F42EB45A9D648F\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_2HW_WRDoor\"\nmsgid \"No, I won't risk losing her! She is bound to the device.\"\nmsgstr \"¡No, no me arriesgaré a perderla! Ella está vinculada al aparato.\"\n\n#. Key:\tA03D724A4606AFFC00E417A5C3AB3BFF\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_2HW_WRDoor\"\nmsgid \"Lillian knew what she applied for. She must decide.\"\nmsgstr \"Lillian sabía lo que se ha metido Ella debe decidir.\"\n\n#. Key:\tABA214914981F3E844F49483B43B5414\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_2HW_WRDoor\"\nmsgid \"I used the key to close the door.\"\nmsgstr \"Usé la llave para cerrar la puerta.\"\n\n#. Key:\tB1ADF0404F97735215FCB9A47DD01640\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_2HW_WRDoor\"\nmsgid \"No, I’ve made my decision.\"\nmsgstr \"No, ya he tomado mi decisión.\"\n\n#. Key:\tB26FAB564CA430617502FA85116629D0\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_2HW_WRDoor\"\nmsgid \"Even if our entire World needs to pay the price.\"\nmsgstr \"Incluso si nuestro mundo entero necesita pagar el precio.\"\n\n#. Key:\tD6D2D64446B6D921576A20ACD653AF7E\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_2HW_WRDoor\"\nmsgid \"I knew he wouldn’t let me finish what we started.\"\nmsgstr \"Sabía que no me dejaría terminar lo que empezamos.\"\n\n#. Key:\t178EBCA541F7FEC3CA46B1B2818691D4\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/AABook.AABook:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/AABook.AABook:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_AABook\"\nmsgid \"'...the Wisest of the Arcade gathered here to discuss if the magical phenomena means any more threat...'\"\nmsgstr \"\\\"...los más sabios del Arcade se reunieron aquí para discutir si el fenómeno mágico significa más amenaza…\\\"\"\n\n#. Key:\t8F2CCFF54FBAF7902DB6FEB0358ECFEF\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/AABook.AABook:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/AABook.AABook:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_AABook\"\nmsgid \"They were just like us. The next one hundred pages explain why Ruin will never reach the Arcade or how the Ancient Magic can stop it.\"\nmsgstr \"Eran como nosotros. Las siguientes cien páginas explican por qué Ruin nunca llegará al Arcade o cómo la Magia Antigua puede detenerlo.\"\n\n#. Key:\tAC20B864497FB0D476C501AEF3B87508\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/AABook.AABook:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/AABook.AABook:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_AABook\"\nmsgid \"I hope you don’t want to read all that nonsense.\"\nmsgstr \"Espero que no quieras leer todas esas tonterías.\"\n\n#. Key:\tB112F657498F660766AA45974CB44137\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/AABook.AABook:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/AABook.AABook:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_AABook\"\nmsgid \"'Ten years after the Cataclysm (or recently named as Ruin)...'\"\nmsgstr \"\\\"Diez años después del Cataclismo (o recientemente nombrado como Ruin)…\\\"\"\n\n#. Key:\t0F53B19F4EB2F7727B4907864AD3FF46\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_29.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_29.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"What if you just take a break from this and let me pass? Make an exception.\"\nmsgstr \"¿Qué pasa si tomas un descanso y me dejas pasar? Hacer una excepción.\"\n\n#. Key:\t1707E0F34CFDC054DBEAD9AFB368A0A4\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"No rest, no sleep allowed.\"\nmsgstr \"No descanso, no se permite dormir.\"\n\n#. Key:\t2524B3EC4DE1E2921C710CBE4511045F\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"...sometimes I could really appreciate a chair.\"\nmsgstr \"...a veces podría apreciar una buena silla.\"\n\n#. Key:\t29FE2AEF42639848EF3914B36BA2B633\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"I do ask you for apologies, young one.\"\nmsgstr \"Te pido disculpas, joven.\"\n\n#. Key:\t2C1E7EA026080F0A003A0396BE7E0E7E\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"Take this rune stone as compensation.\"\nmsgstr \"Toma esta piedra rúnica como compensación.\"\n\n#. Key:\t2C879B684B4B07B57D051797219E751E\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"You might have proven worthy for the Arcade Gate, yet there are some other doors, and they have different rules.\"\nmsgstr \"Es posible que haya demostrado ser digno de la Puerta del Arcade, sin embargo, hay otras puertas y tienen reglas diferentes.\"\n\n#. Key:\t3532C8254924CF13EA664CA11E256F07\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"Will you??? That's so kind of you... err... I mean...\"\nmsgstr \"¿¿¿Podrías??? Es muy amable de su parte... err... quiero decir...\"\n\n#. Key:\t353D6C8B4B5719B1EFD2A59BA0281DED\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_2.Children(2).Children.Text\n#. Key:\t8EED48724A0A860CAD791FAF95554F26\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_3.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_2.Children(2).Children.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_3.Children(1).Children.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"Skip?\"\nmsgstr \"¿Omitir?\"\n\n#. Key:\t3FF1411844C23DB2FDFA47939169B5C3\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_14.Children(0).Children.Text\n#. Key:\t59EC5E56475DE41CFC723793CEEAFA82\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_3.Children(0).Children.Text\n#. Key:\t65DD6A464F04F8B0762D568046344C16\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_6.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_14.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_3.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_6.Children(0).Children.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"Accept challenge\"\nmsgstr \"Aceptar desafío\"\n\n#. Key:\t414D5CC44FFD640215B97BB6090627D6\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"That must be tough...\"\nmsgstr \"Eso debe ser duro...\"\n\n#. Key:\t4CAA2D0C4FB585A0EB5B4F87FE8A3A97\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"I accept my fate yet sometimes...\"\nmsgstr \"Acepto mi destino pero a veces...\"\n\n#. Key:\t4F7460F540408D07FECEEB88DC0D7D25\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"Not so fast young lord!\"\nmsgstr \"¡No tan rápido joven señor!\"\n\n#. Key:\t52C3909F40026C52ADA498A5B60B3490\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_6.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_6.Children(1).Children.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"Poor Keeper\"\nmsgstr \"Pobre Guardián\"\n\n#. Key:\t59141BA444003F36E1671CB4E91FFF0E\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"Farewell!\"\nmsgstr \"¡Adios!\"\n\n#. Key:\t59AC0995469571DBE1B7B6BDF68FA37D\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"I am really sorry about that.\"\nmsgstr \"Realmente lo siento por eso.\"\n\n#. Key:\t5C8404D34863129B221EF2BB1D0962CC\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_9.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_9.Children(0).Children.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"Yes?\"\nmsgstr \"¿Si?\"\n\n#. Key:\t5FF922B94D3FCA5FD095FFB788F43D02\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"For there was a mistake.\"\nmsgstr \"Porque hubo un error.\"\n\n#. Key:\t650DA55944F225C45BABE8B00D815A39\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_27.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_27.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"I guess you want me to go through some crazy traps again...\"\nmsgstr \"Supongo que quieres que vuelva a pasar por algunas trampas otra vez...\"\n\n#. Key:\t700A25DB401C6EDD1E9D1694DA1C1DA1\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"Keepers never fail their duty.\"\nmsgstr \"Los Guardianes nunca fallan en su deber.\"\n\n#. Key:\t72D703F84C84CD07F7DA569D9B86AECB\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"There are times when you have to stand in front of a door for a really long time.\"\nmsgstr \"Hay momentos en los que tienes que estar de pie en frente a una puerta durante mucho tiempo.\"\n\n#. Key:\t8276A9AC4E3BAB81C41E6EAB12E4FED1\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_31.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_31.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"If I ever see a chair that's your size I will let you know.\"\nmsgstr \"Si alguna vez veo una silla de su tamaño, te lo haré saber.\"\n\n#. Key:\t89421ED443CA8DD5A15DF289C5DC6C37\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_28.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_28.Children(0).Children.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"Accept Challenge\"\nmsgstr \"Aceptar Desafío\"\n\n#. Key:\t910F61A841D9E86D1B349E85A8A47FCF\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"Prove yourself worthy and I shall yield the path!\"\nmsgstr \"¡Demuestra tu valía y te cederé el camino!\"\n\n#. Key:\t9DAC66B94E5A37C628522B90029E8FCC\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_2.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_2.Children(0).Children.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"Not again\"\nmsgstr \"Otra vez no\"\n\n#. Key:\t9F3FE24943FB7CE59B8453A2849E874A\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"This door is open and free of charge for everyone...\"\nmsgstr \"Esta puerta está abierta y es gratuita para todos...\"\n\n#. Key:\tA96E78A0410C87446F59ABAC1524A3F4\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_2.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_2.Children(1).Children.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"Let's do it!\"\nmsgstr \"¡Hagámoslo!\"\n\n#. Key:\tA9998DDC43D15F1EDE404B8A3E04E3B2\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"Keepers' lives are never easy.\"\nmsgstr \"La vida de los Guardianes nunca es fácil.\"\n\n#. Key:\tBCAE1C1D4890E79F187EF0940C6F7E84\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_12.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_12.Children(0).Children.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"Just get over\"\nmsgstr \"Supéralo\"\n\n#. Key:\tC2F8F4E1457AC142E58D1EA3AF24AB56\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"I am all right with a few hundred years, but after a millennium my knees hurt like hell.\"\nmsgstr \"Estoy bien durante unos cientos de años, pero después de un milenio me duelen las rodillas.\"\n\n#. Key:\tC955446E4CA17593CCC57B9A73AAE824\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"What?? Do you mean that all those challenges that I had to pass were in vain?\"\nmsgstr \"¿¿Qué?? ¿Quieres decir que todos esos desafíos que tuve que pasar fueron en vano?\"\n\n#. Key:\tC97F61DA4A49287F5242EEB43152D409\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"All right, you win. I'll go and do some jumping. Must be better than waiting here for an eternity.\"\nmsgstr \"De acuerdo, tú ganas. Iré a saltar un poco. Debe ser mejor que esperar aquí por una eternidad.\"\n\n#. Key:\tD318418D4CBBFA2AB381E6B287A8636F\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_30.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_30.Children(0).Children.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"Accept Challenge.\"\nmsgstr \"Aceptar Desafío.\"\n\n#. Key:\tD6BE170047C1A00770403087A7EBDF99\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_30.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_30.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"Hopefully, we will finish this soon.\"\nmsgstr \"Con suerte, terminaremos esto pronto.\"\n\n#. Key:\tD72FF4F943571BE3DC8DB1877581D4CD\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"You shall prove yourself one more time.\"\nmsgstr \"Deberás demostrar a ti mismo una vez más.\"\n\n#. Key:\tDFD8B1E0414F989D46ED9BB24610CDA8\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_12.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_12.Children(1).Children.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"I will help\"\nmsgstr \"Le ayudaré\"\n\n#. Key:\tFDDD27C544787C63B03CCE89B69A44E5\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"Well, thanks!\"\nmsgstr \"¡Pues, gracias!\"\n\n#. Key:\t06D52FD74B0013A5A22FEBA7A6E82032\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Did you came back to check out my wares?\"\nmsgstr \"¿Volviste a ver mis productos?\"\n\n#. Key:\t07508A9F4A979D530AD8A9861F0C7D79\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Though maybe you will find relief by looking through my wares. Haha!\"\nmsgstr \"Aunque tal vez encuentres alivio mirando a través de mis productos. ¡Jaja!\"\n\n#. Key:\t0C1B7239419B00927360E1B9578540EA\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_27.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_27.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"That's a sad name indeed. If the old saying 'nomen est omen' is true, then it might not be the best choice.\"\nmsgstr \"Ese es un nombre triste de hecho. Si el viejo dicho 'nomen est omen' es verdadero, entonces podría no ser la mejor opción.\"\n\n#. Key:\t0D8F81E140A7AF5369415FB1C081250E\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_10.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_10.Children(0).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Trade\"\nmsgstr \"Comerciar\"\n\n#. Key:\t1089DA0443D9B23C84B8B799EEEBCCC9\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_SpeechSequence_0.SpeechSequence(0).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_SpeechSequence_0.SpeechSequence(0).SpeechSequence.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Oh, that's sad my little one.\"\nmsgstr \"Oh, eso es triste mi pequeño.\"\n\n#. Key:\t16F6844C40498EC1B5CDAA87612D3982\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_42.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_42.Children(1).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"No way\"\nmsgstr \"No es posible\"\n\n#. Key:\t182D4124450BFA52EF26FBACE1706333\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_45.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_45.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"How noble of you!\"\nmsgstr \"¡Qué noble de tu parte!\"\n\n#. Key:\t1922E4FD49ABC50B04A33CBA07B440D1\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_34.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_34.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"But I hope this doesn't mean that you want to join the Maintainers. Haha!\"\nmsgstr \"Pero espero que esto no signifique que quieras unirte a los Mantenedores. ¡Jaja!\"\n\n#. Key:\t195B9BED4921EE6D732CA4BE6391A402\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_31.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_31.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"No, thanks!\"\nmsgstr \"¡No, gracias!\"\n\n#. Key:\t198A3D8D426F5202C280CE96202EB415\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_50.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_50.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"This is a sad name indeed. And if the old saying 'nomen est omen' is true, then this might not be the best choice.\"\nmsgstr \"Este es un nombre triste, la verdad. Y si el viejo dicho 'nomen est omen' es cierto, entonces esta podría no ser la mejor opción.\"\n\n#. Key:\t1AF2DDE74542524EEF19CA9567CFBDAF\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"{name}? It still sounds a bit weird, but I think I might like it.\"\nmsgstr \"¿{nombre}? Todavía suena un poco raro, pero creo que me gustará.\"\n\n#. Key:\t1FC5AD3B488DB484169D0085D63ECC45\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"This sounds pretty epic but I wonder what nickname it might have?\"\nmsgstr \"Esto suena bastante épico, ¿pero me pregunto qué apodo podría tener?\"\n\n#. Key:\t21FEE27B41116ADFBFD2B69333D6EB3F\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"By using some sort of ritual or spell...\"\nmsgstr \"Al usar algún tipo de ritual o hechizo...\"\n\n#. Key:\t25DCE964400342D4188412ADF43277E6\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_61.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_61.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"I am rewarding you with these shiny coins!\"\nmsgstr \"¡Te estoy recompensando con estas monedas brillantes!\"\n\n#. Key:\t2717F0E0414D4828B67D9C9F9B7E5F84\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_62.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_62.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"See? I'm a gnome of my word!\"\nmsgstr \"¿Has visto? Soy un gnomo de mi palabra!\"\n\n#. Key:\t2747A45248055455F9FA3B977A019EE0\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_44.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_44.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Well, you know where to find me... once you have some coins to spend!\"\nmsgstr \"Bueno, ya sabes dónde encontrarme... ¡una vez que tengas algunas monedas para gastar!\"\n\n#. Key:\t27CE4D1444C219D35B79F4A3B07CB67D\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"If you bring them to me, I will reward you with shiny golden coins!\"\nmsgstr \"¡Si me los traes, te recompensaré con brillantes monedas de oro!\"\n\n#. Key:\t3040F4DC4C763062C8EFED9BCA5028C0\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_59.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_59.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"I would love to give you that name, but if you don't have the money to pay for it, we can't make the deal, it wouldn't be fair\"\nmsgstr \"Me encantaría darle ese nombre, pero si no tiene el dinero para pagarlo, no podemos hacer el trato, no sería justo\"\n\n#. Key:\t3124230541027A0022F54C8648E688C9\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Oh, a customer!\"\nmsgstr \"¡Oh, un cliente!\"\n\n#. Key:\t31C147E1430106CD29C7D7B2F7E84975\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_23.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_23.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Oh, how sad.\"\nmsgstr \"Oh que triste.\"\n\n#. Key:\t37CC1248471C360F8BB605A404ED1408\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_10.Children(4).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_10.Children(4).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Give books\"\nmsgstr \"Dar los libros\"\n\n#. Key:\t3E0A0E06487AD4E75C3AF28786DE9CC7\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_16.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_16.Children(0).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Don't know\"\nmsgstr \"No lo se\"\n\n#. Key:\t40221BB0432119A5B1C285B748AEFB81\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_51.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_51.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"It sounds pretty epic, however I wonder what nickname it might have?\"\nmsgstr \"Suena bastante épico, sin embargo, ¿me pregunto qué apodo podría tener?\"\n\n#. Key:\t422B5CC14CA23A6563EDBDBBEA09C44B\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_73.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_73.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Farewell! Ha-ha...\"\nmsgstr \"¡Adios! Jaja...\"\n\n#. Key:\t4574EE8E4B1EAB6C9310C4A19F77B170\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_10.Children(6).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_10.Children(6).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Leave\"\nmsgstr \"Salir\"\n\n#. Key:\t47F99BBF439F713C52279F86BDC4FDD5\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_72.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_72.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"No thanks, I'm leaving.\"\nmsgstr \"No gracias, me voy.\"\n\n#. Key:\t4F31CEE0411BB60324FB58938857F162\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_16.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_16.Children(1).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"A mighty spirit\"\nmsgstr \"Un espíritu poderoso\"\n\n#. Key:\t4FA29908450786B433C0FCA2E313D989\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_36.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_36.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Hi, I'm Lory.\"\nmsgstr \"Hola soy Lory.\"\n\n#. Key:\t4FCB34514D82104E732407A1CD985F6B\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_70.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_70.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Sure, show me what you've got!\"\nmsgstr \"Claro, muéstrame lo que tienes!\"\n\n#. Key:\t53A46E1948B7CC1A9F8E02A3147FBF2D\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_67.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_67.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Sure, what can I do?\"\nmsgstr \"Claro, ¿que puedo hacer?\"\n\n#. Key:\t53E7A272465DE8D6E34AE7BE7435B1AC\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_25.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_25.Children(1).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Spirit of the Unknown\"\nmsgstr \"Espíritu de lo Desconocido\"\n\n#. Key:\t54F8FB604F0409ED474FBFBAD8BFD3B3\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"And you are...\"\nmsgstr \"Y usted eres...\"\n\n#. Key:\t58447CCB4EE84827DB8328A664C54198\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_24.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_24.Children(0).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Buy name\"\nmsgstr \"Comprar nombre\"\n\n#. Key:\t589162A649D330D791082EB8FE3F6459\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_41.Children(4).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_41.Children(4).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Don't buy.\"\nmsgstr \"No comprar.\"\n\n#. Key:\t58CC98724AFCD3826D69D482682AF352\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"\\\"The true value of your family\\\" and \\\"How much does a brother cost?\\\" can be two examples in this case.\"\nmsgstr \"\\\"El verdadero valor de su familia\\\" y \\\"¿Cuánto cuesta un hermano?\\\" Pueden ser dos ejemplos en este caso.\"\n\n#. Key:\t5A249B2E47F62C59F66AD5848E6DEBFE\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_49.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_49.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"I'll see what I can do.\"\nmsgstr \"Veré lo que puedo hacer.\"\n\n#. Key:\t5A31E5D34729F7EAB69AC08238C1D32D\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_25.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_25.Children(0).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Failed One\"\nmsgstr \"El Fallado\"\n\n#. Key:\t5BA1062346DF8BC47F97BA97653E6DDA\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_46.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_46.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Farewell then, and good luck with your quest! Ha-ha...\"\nmsgstr \"¡Adiós, y buena suerte con tu misión! Jaja...\"\n\n#. Key:\t6047D5334E0247BFB75EBAA7380C6800\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_68.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_68.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"I have some other important things to do right now.\"\nmsgstr \"Tengo algunas otras cosas importantes que hacer en este momento.\"\n\n#. Key:\t60B184AF4F25AFB60380029BD2C17AAB\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_66.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_66.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"I'm a mighty spirit of the Unknown!\"\nmsgstr \"¡Soy un poderoso espíritu de lo Desconocido!\"\n\n#. Key:\t60CE0D4342B6E4971449D7BDDD62B13F\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_10.Children(3).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_10.Children(3).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Help\"\nmsgstr \"Ayuda\"\n\n#. Key:\t62C5459E46C969412EAD70BAD466D808\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_SpeechSequence_0.SpeechSequence(1).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_SpeechSequence_0.SpeechSequence(1).SpeechSequence.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Life is relentless. Innocent people are trapped, enslaved or abused!\"\nmsgstr \"La vida es implacable. ¡Personas inocentes están atrapadas, esclavizadas o maltratadas!\"\n\n#. Key:\t6DDEF0AB45B60A99946E8F9FC647DCDE\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_71.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_71.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"I need a proper name.\"\nmsgstr \"Necesito un nombre propio.\"\n\n#. Key:\t6F1C50A44DE698DF5BF089B1C9B29F06\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_69.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_69.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Right now I don't really have much money...\"\nmsgstr \"En este momento no tengo mucho dinero...\"\n\n#. Key:\t72272161488706E5E87697A755F11129\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Even though there are some other precious books that I could add to my collection...\"\nmsgstr \"Aunque hay algunos libros preciosos que podría añadir a mi colección...\"\n\n#. Key:\t764502A14C3C18B14F8A579A58CE5938\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"I know that some of those books must be in the Sewer's Library, but I couldn't find them.\"\nmsgstr \"Sé que algunos de esos libros deben estar en la Biblioteca de la Alcantarilla, pero no pude encontrarlos.\"\n\n#. Key:\t7A1853C7454D74FD1F371A92CEE47B4E\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"That's fine but I wonder, what is your name?\"\nmsgstr \"Eso está bien, pero me pregunto, ¿Cuál es tu nombre?\"\n\n#. Key:\t7BACFCA748AF641E051E2D8B8D8488FC\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"I don't know if I have one.\"\nmsgstr \"No sé si tengo uno.\"\n\n#. Key:\t821021954082EA7E4B392FA89EE4DE91\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_41.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_41.Children(1).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Spirit of the Unknown (1 Gold)\"\nmsgstr \"Espíritu de lo desconocido (1 Oro)\"\n\n#. Key:\t83AECB5A4FCAB05CC81BCC9B810245B7\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_41.Children(2).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_41.Children(2).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"BALL-E (1 Gold)\"\nmsgstr \"BOLA-E (1 Oro)\"\n\n#. Key:\t84ACF5E1449849CB79CF8AB10BE2FF2E\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"As you can observe, I have a pretty nice collection of books.\"\nmsgstr \"Como puede observar, tengo una buena colección de libros.\"\n\n#. Key:\t899D1E18420FDAD236BF3486B2A5A010\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Ring the bell if you need something.\"\nmsgstr \"Toca el timbre si necesitas algo.\"\n\n#. Key:\t8B33450F405DF08E72CE47B5FC66CDD5\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_55.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_55.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Spiry? Knowny?\"\nmsgstr \"¿Spiry? ¿Knowny?\"\n\n#. Key:\t8CEC3E1943C3AB72CF3B71B160B9ADB9\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_10.Children(5).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_10.Children(5).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Need gold\"\nmsgstr \"Necesita oro\"\n\n#. Key:\t8D0FBCA540F73842DD3AC38A76A5B623\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_56.Text\n#. Key:\tF045657A439D69E3615B80A066E9CE86\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_33.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_33.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_56.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Nevermind! You chose well.\"\nmsgstr \"¡No importa! Elegiste bien.\"\n\n#. Key:\t8F32BD4544F8C439D7344CBE1F9B4D8A\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_24.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_24.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Would you like to buy one? The first one is for free!\"\nmsgstr \"¿Te gustaría comprar uno? ¡El primero es gratis!\"\n\n#. Key:\t94C0F9B34F439CDFBDFAD696E81983E5\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"I don't have much gold. Is there any way you could help me out?\"\nmsgstr \"No tengo mucho oro ¿Hay alguna manera de que me puedas ayudar?\"\n\n#. Key:\t9BA6BAA24E6C2B7F01964D892246E8F6\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"No, no, I meant the other bell.\"\nmsgstr \"No, no, me refería a la otra campana.\"\n\n#. Key:\tA9D4DF4C41BAD682571763BDA8DA6A62\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_10.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_10.Children(1).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Can't afford\"\nmsgstr \"No puede pagar\"\n\n#. Key:\tAA6B105442F5099CE0F4E2AE0DFF7080\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_35.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_35.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Now that we're done with this, will you have a look at my wares?\"\nmsgstr \"Ahora que hemos terminado con esto, ¿echarás un vistazo a mis productos?\"\n\n#. Key:\tAADE21D24A42CE7BD318478306BAFFF7\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_10.Children(2).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_10.Children(2).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"I need a name\"\nmsgstr \"Necesito un nombre\"\n\n#. Key:\tAB00899C4A94AA6458737BB28339A3EE\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Hush, hush, little one!\"\nmsgstr \"¡Silencio, mi pequeñito!\"\n\n#. Key:\tAB431F244E4E18230CE5EAB99FB41A96\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_41.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_41.Children(0).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Failed One (1 Gold)\"\nmsgstr \"Fallido (1 Oro)\"\n\n#. Key:\tAB92E44E46B40EF16989FF850DE0F843\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_42.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_42.Children(0).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Interested\"\nmsgstr \"Interesado\"\n\n#. Key:\tB0540325412D9839B33FB38C4FE73172\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Well, I guess that's a classic.\"\nmsgstr \"Bueno, supongo que es un clásico.\"\n\n#. Key:\tB0EFD31840839CDA6F3D929514412D00\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Ok, I'll try not to be annoying this time.\"\nmsgstr \"Ok, intentaré no ser molesto esta vez.\"\n\n#. Key:\tB1F217944F6B9A29BD13FA926D8230E8\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_44.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_44.Children(0).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Farewell!\"\nmsgstr \"¡Adios!\"\n\n#. Key:\tBA2B2F444FC2320349C4A0BABDA78B40\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_25.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_25.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"All right...\"\nmsgstr \"Todo bien...\"\n\n#. Key:\tCADB3E394C94CDE32D9969B6C1A41F5C\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_47.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_47.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Take this Elevator Crystal as it might prove useful in your journey.\"\nmsgstr \"Tome este cristal de ascensor, ya que podría ser útil en su viaje.\"\n\n#. Key:\tCB3F061042B8340154B4CD8AEED41348\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_42.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_42.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"However, there is a way, I can help you out. Of course, if you are interested.\"\nmsgstr \"Sin embargo, hay una manera, que puedo ayudarte. Por supuesto, si te interesa.\"\n\n#. Key:\tCF24AD454E123F6D7D61029155390914\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_41.Children(3).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_41.Children(3).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Warriorb (1 Gold)\"\nmsgstr \"Warriorb (1 Oro)\"\n\n#. Key:\tD01937C848C69809890885BAB13042BE\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_65.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_65.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"I'm not quite sure.\"\nmsgstr \"No estoy muy seguro.\"\n\n#. Key:\tD53097EB4EFC08C0C3261A9EEBD96B72\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_39.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_39.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"That's sad. Nothing is worse than a customer without any gold to spend!\"\nmsgstr \"Eso es triste. ¡Nada es peor que un cliente sin oro para gastar!\"\n\n#. Key:\tD63C08294AC09BF5B8E5D29EEC1C7D39\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"I'm forced to stay in this realm because I agreed to do some silly tasks for a wizard. I could really use some help.\"\nmsgstr \"Me veo obligado a permanecer en este reino porque acepté hacer algunas tareas tontas para un mago. Realmente podría usar algo de ayuda.\"\n\n#. Key:\tDB0CCA7746068ACFBE6F71963C398753\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_63.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_63.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"And now that you have some coins to spend it's time to talk about business!\"\nmsgstr \"¡Y ahora que tiene algunas monedas para gastar, es hora de hablar de negocios!\"\n\n#. Key:\tDC0F8EC0407F1C7B4FFED6A91CB961C5\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_57.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_57.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"I hope this doesn't mean that you want to join the Maintainers. Haha!\"\nmsgstr \"Pero espero que esto no signifique que quieras unirte a los Mantenedores. ¡Jaja!\"\n\n#. Key:\tDC475A6740B71354D90D53B6AD1C4740\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_60.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_60.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"How wondrous! You found my books!\"\nmsgstr \"¡Qué maravilloso! ¡Encontraste mis libros!\"\n\n#. Key:\tE3B8F89B4D4AC0ABD2E35994ABFA9916\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"I understand if you have identity problems, but there must be a way... how do others call you?\"\nmsgstr \"Entiendo si tienes problemas de identidad, pero debe haber una forma... ¿cómo te llaman los demás?\"\n\n#. Key:\tE6BD711C4E23B71F944EEFB1C8D09AB4\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_41.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_41.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"You've come to the right place! Haha!\"\nmsgstr \"¡Has venido al lugar correcto! ¡Jaja!\"\n\n#. Key:\tEDEB662C4A5024CC618A668699BFAC2C\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_SpeechSequence_0.SpeechSequence(2).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_SpeechSequence_0.SpeechSequence(2).SpeechSequence.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"There is no justice in this Realm.\"\nmsgstr \"No hay justicia en este Reino.\"\n\n#. Key:\tF8814FA0497129A211F3F9BE01EAF378\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_29.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_29.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"That's a very cute name for a little one like you.\"\nmsgstr \"Ese es un nombre muy lindo para un pequeñito como tú.\"\n\n#. Key:\tF8BEB8C147C81D8B13E52AA9934891AB\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_58.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_58.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Nevermind, you can always come back.\"\nmsgstr \"No importa, siempre puedes volver.\"\n\n#. Key:\tF97BE7FD49F465A97F7C8D9F308EAD3C\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_52.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_52.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"That's such a cute name for a little one.\"\nmsgstr \"Que nombre tan lindo para un pequeñito.\"\n\n#. Key:\tFAAAE5944AA8CCAEFC931CAA814C8621\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_54.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_54.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Which means you chose well.\"\nmsgstr \"Lo que significa que elegiste bien.\"\n\n#. Key:\tFAD10B404CF744B61DF5D093829CD1E9\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Of course! You need some gold, otherwise how would you buy my stuff?\"\nmsgstr \"¡Por supuesto! Necesitas algo de oro, de lo contrario, ¿Cómo comprarías mis cosas?\"\n\n#. Key:\tFE40092A444E97C59E8C6E94061D1134\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_30.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_30.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"However, I'd rather prefer: 'Nomen quantivis iam est pret!'\"\nmsgstr \"Sin embargo, prefiero preferir: \\\"Nomen quantivis iam est pret!\\\"\"\n\n#. Key:\tFEE11C0F4A65DDFFDBF0BD8BB30CD438\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_25.Children(2).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_25.Children(2).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"BALL-E\"\nmsgstr \"BOLA-E\"\n\n#. Key:\tFF0AFE8544814AE524115A853547D727\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_24.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_24.Children(1).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Refuse\"\nmsgstr \"Rechazar\"\n\n#. Key:\t0648624E4922B098541A7EA738DABC92\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/AARagdoll.AARagdoll:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/AARagdoll.AARagdoll:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_AARagdoll\"\nmsgid \"Well that happens sometimes. Maybe that someone forgot to monopolize this ragdoll design.\"\nmsgstr \"Bueno, eso sucede a veces. Tal vez alguien olvidó monopolizar este diseño de muñeco.\"\n\n#. Key:\t2058DE654B2B75531C04628635169938\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/AARagdoll.AARagdoll:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/AARagdoll.AARagdoll:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_AARagdoll\"\nmsgid \"Just leave that doll.\"\nmsgstr \"Deja ese muñeco.\"\n\n#. Key:\t5A456D084D452C82038A04942002FAE6\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/AARagdoll.AARagdoll:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/AARagdoll.AARagdoll:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_AARagdoll\"\nmsgid \"It’s like the doll which was made by...\"\nmsgstr \"Es como el muñeco hecho por...\"\n\n#. Key:\t7813ED164DF5CA7DE48A978F9A3DC959\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/AARagdoll.AARagdoll:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/AARagdoll.AARagdoll:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_AARagdoll\"\nmsgid \"How on earth did this get here?\"\nmsgstr \"¿Cómo diablos llegó esto aquí?\"\n\n#. Key:\tC4403E4C4FD7D72CA3252FB31FF98FDF\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/AARagdoll.AARagdoll:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/AARagdoll.AARagdoll:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_AARagdoll\"\nmsgid \"...by someone I knew.\"\nmsgstr \"… por alguien que conocí.\"\n\n#. Key:\tE4CD5DBC4E4BB1E783B55D80F4296B97\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/AARagdoll.AARagdoll:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/AARagdoll.AARagdoll:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_AARagdoll\"\nmsgid \"There are many weird things all over this place. What makes this stand out?\"\nmsgstr \"Hay muchas cosas raras por este lugar. ¿Qué hace que esto se destaque?\"\n\n#. Key:\tEDD72B38407D0C33C5F7859D09BC132B\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/AARagdoll.AARagdoll:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/AARagdoll.AARagdoll:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_AARagdoll\"\nmsgid \"You are not funny.\"\nmsgstr \"No eres gracioso.\"\n\n#. Key:\t02767246403F00F0C866B2A7F3E22A47\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_72.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_72.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"You can hardly find anyone that has more information about the Realms.\"\nmsgstr \"Es difícil encontrar a alguien que tenga más información sobre los Reinos.\"\n\n#. Key:\t04843D4A4D2DD4BC7CE50989C8F66FBA\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_2.SpeechSequence(2).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_2.SpeechSequence(2).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"How can I do something if I do not know what I have to do?\"\nmsgstr \"¿Cómo puedo hacer algo si no sé lo que tengo que hacer?\"\n\n#. Key:\t071A801E44759E2681218497B9AE9A2B\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_53.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_53.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Your logic is incoherent.\"\nmsgstr \"Tu lógica es incoherente.\"\n\n#. Key:\t07488F9A4CC6F87DBC44F0A11700B370\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_70.Children(0).Children.Text\n#. Key:\tA67B3D3B4A3D17B37D585EBBBD9BBE92\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_75.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_70.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_75.Children(0).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"All right, I'm on it.\"\nmsgstr \"Muy bien, estoy en ello.\"\n\n#. Key:\t0757D23846F6BC96198472B7E9848D3F\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_52.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_52.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Maybe I should accept what I need to do now.\"\nmsgstr \"Tal vez debería aceptar lo que necesito hacer ahora.\"\n\n#. Key:\t07D63011406134B07FB90B903825151C\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_8.SpeechSequence(2).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_8.SpeechSequence(2).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Make your wizard turn you back to normal.\"\nmsgstr \"Haz que tu mago te vuelva a la normalidad.\"\n\n#. Key:\t091DFEFA4B2DD8F9922A1B93534C66A8\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_70.Text\n#. Key:\t0F92571643C12F65C669F7812572B014\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_82.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_70.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_82.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven gives you one of his keys so that you can move around freely.\"\nmsgstr \"Cuervo te da una de sus llaves para que puedas moverte libremente.\"\n\n#. Key:\t0922ED5741BB89553CCB548D33566972\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_8.SpeechSequence(4).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_8.SpeechSequence(4).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven is something which won't make wizards turn Raven back.\"\nmsgstr \"Cuervo es algo que no hará que los magos hagan retroceder a Cuervo.\"\n\n#. Key:\t0AAFADBB493DCFBA6C649EAC11133DC2\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_2.SpeechSequence(0).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_2.SpeechSequence(0).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"You don't have to know.\"\nmsgstr \"No tienes que saberlo.\"\n\n#. Key:\t0E59A33E44BF6B212BF0EF8E8EFB3E39\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_6.SpeechSequence(2).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_6.SpeechSequence(2).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"A rich kingdom ruling all the other lands, powered by spirits of another world; these spirits were bound to metal.\"\nmsgstr \"Un reino rico que gobierna todas las otras tierras, impulsado por espíritus de otro mundo; Estos espíritus estaban unidos al metal.\"\n\n#. Key:\t0EACC01B4A4C4F8C5622B9BD291E0DB9\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_91.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_91.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"I'm not quite sure about this...\"\nmsgstr \"No estoy muy seguro de esto...\"\n\n#. Key:\t10142FA943B5E5D89F9E5AADC86EF413\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_113.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_113.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Yes.\"\nmsgstr \"Sí.\"\n\n#. Key:\t12375FB0475147E23E1C21A867CFF219\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_68.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_68.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Is there anything else on your mind?\"\nmsgstr \"¿Hay algo más en tu mente?\"\n\n#. Key:\t12A0B58B446843DD24045394E8586D7D\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Krrr...\"\nmsgstr \"Krrr...\"\n\n#. Key:\t12B921E04D135919C7DA37ADDBD2A7DB\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_100.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_100.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"We still have some time left before this happens.\"\nmsgstr \"Todavía nos queda algo de tiempo antes de que esto suceda.\"\n\n#. Key:\t133F676B4DBA8B41F6B94387D51457D5\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_59.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_59.Children(1).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"No more Raven\"\nmsgstr \"No más Cuervo\"\n\n#. Key:\t13EF39EE4249FDD62208CFB7A41821D7\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_65.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_65.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Though Raven knows how you feel.\"\nmsgstr \"Aunque Cuervo sabe cómo te sientes.\"\n\n#. Key:\t15D06ACE4E8B5E4DA49297BBE436039D\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_80.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_80.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Now you only need to find a place where you can infuse it.\"\nmsgstr \"Ahora solo necesita encontrar un lugar donde pueda infundirlo.\"\n\n#. Key:\t16D5522340AE76E69A4808A3C2D1C039\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_51.Children(1).Children.Text\n#. Key:\t2AD4608440348AC7C3E363A430B9848C\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_83.Children(0).Children.Text\n#. Key:\t57DDAE184F31D9761E3939B16E6B2E67\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_20.Children(1).Children.Text\n#. Key:\t59F157C64A5415C8B4E322B0FF5F2ACE\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_49.Children(1).Children.Text\n#. Key:\t73ACC7124190746F6D3EBF96C8202C25\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_77.Children(1).Children.Text\n#. Key:\t9900274346DCB374A4B222A6BFD67365\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_10.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_10.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_20.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_49.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_51.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_77.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_83.Children(0).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Chat\"\nmsgstr \"Chat\"\n\n#. Key:\t19FD8B0541A533338EA11B9CDA3719B2\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_74.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_74.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Now you only need to find a place where you can infuse it. Meanwhile, Raven must figure it out how to open the Gate with it.\"\nmsgstr \"Ahora solo necesita encontrar un lugar donde pueda infundirlo. Mientras tanto, Cuervo debe descubrir cómo abrir la Puerta con él.\"\n\n#. Key:\t1BD7592A4F11AEC585ECA6A74A0E0D4E\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_9.SpeechSequence(4).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_9.SpeechSequence(4).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"In what way?\"\nmsgstr \"¿En qué manera?\"\n\n#. Key:\t1C30FADA4BB2B3CCE2140A8E192D9F14\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_34.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_34.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven is not like those dummy Living Armors, yet he does what he was made for.\"\nmsgstr \"Cuervo no es como esas armaduras vivientes ficticias, sin embargo, hace lo que sus creadores quieren que haga.\"\n\n#. Key:\t1C57460444A7E044DD96148495C4C217\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_6.SpeechSequence(4).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_6.SpeechSequence(4).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"They lost purpose and became reckless.\"\nmsgstr \"Perdieron propósito y se volvieron imprudentes.\"\n\n#. Key:\t1E3AF1D8483287CE52633EA41B89DF11\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_116.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_116.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"After he had some rest.\"\nmsgstr \"Después de descansar un poco.\"\n\n#. Key:\t1ED675F344909355D41212988B736F70\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_1.SpeechSequence(3).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_1.SpeechSequence(3).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven's master would like to understand before doing anything.\"\nmsgstr \"Al maestro de Cuervo le gustaría entender antes de hacer algo.\"\n\n#. Key:\t22E51DC245ABAE53146A71AAE8D5AB55\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"You will realize that 'sense' has no meaning in this realm anymore.\"\nmsgstr \"Te darás cuenta de que \\\"sentido\\\" ya no tiene significado en este reino.\"\n\n#. Key:\t236E0B58451C947C0DB93E9E3408456D\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_45.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_45.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"They are humans.\"\nmsgstr \"Son humanos.\"\n\n#. Key:\t254FBEE547ADDFCF33B350B04AE1EE16\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_95.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_95.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"I think I know all about the meaning of life and all, ok? Can we just go on?\"\nmsgstr \"Creo que sé todo sobre el significado de la vida y todo, ¿vale? ¿Podemos seguir?\"\n\n#. Key:\t2671F10D4257D8A3482009A9C042026D\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Hand it over to Raven so he could open the Gate!\"\nmsgstr \"¡Pásalo a Cuervo para que pueda abrir la Puerta!\"\n\n#. Key:\t2845CBE64B1624C7EC4B81BC314B4F1B\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_27.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_27.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"The master gave Raven the ability to think and talk.\"\nmsgstr \"El maestro le dio a Cuervo la capacidad de pensar y hablar.\"\n\n#. Key:\t29F405BF4233B5A8331B419747954425\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_77.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_77.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Why are you here?\"\nmsgstr \"¿Por qué estás aquí?\"\n\n#. Key:\t2B5FB92D4F98359F68AD58AB776FD9BA\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_9.SpeechSequence(1).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_9.SpeechSequence(1).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Seeking for knowledge, as always. And you? Never thought we’ll meet again. Still trying to take down these Realms forever?\"\nmsgstr \"Buscando el conocimiento, como siempre. ¿Y tú? Nunca pensé que nos encontraremos de nuevo. ¿Sigues intentando derribar estos Reinos para siempre?\"\n\n#. Key:\t2B8CF34046D5486EB935CE919A1BD469\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_97.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_97.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"I'm new with all this wizard business thing. What was their conversation about?\"\nmsgstr \"Soy nuevo con todo este asunto de los magos. ¿De qué se trataba la conversación?\"\n\n#. Key:\t2C15668C26080F0A003A02E7BE7B5A65\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_8.SpeechSequence(1).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_8.SpeechSequence(1).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"It can happen again.\"\nmsgstr \"Puede pasar otra vez.\"\n\n#. Key:\t2F226AC246B52387854AF5AFA09CEDD6\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_43.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_43.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"So we let those keys behind and set ourselves free from wizards?\"\nmsgstr \"Entonces, ¿dejamos atrás esas llaves y nos liberamos de los magos?\"\n\n#. Key:\t2FF7B3E84C009ECFDDE9F495092BEAA8\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_9.SpeechSequence(7).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_9.SpeechSequence(7).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"A pleasure to hear that. Talk to Raven about the details. Please excuse me for leaving so early, I have something important to do.\"\nmsgstr \"Un placer escuchar eso. Habla con Cuervo sobre los detalles. Disculpe por irme tan temprano, tengo algo importante que hacer.\"\n\n#. Key:\t305333F348E677D8C3553999F412C8B6\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_36.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_36.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven knows he has different tasks now, compared to what he used to do before.\"\nmsgstr \"Cuervo sabe que ahora tiene diferentes tareas, en comparación con lo que solía hacer antes.\"\n\n#. Key:\t311A1E3745667AC6B4114D999B0E7C7F\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_83.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_83.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Go now! Raven still needs some more time to think about this.\"\nmsgstr \"¡Ve ahora! Cuervo necesita más tiempo para pensar.\"\n\n#. Key:\t32F0018141E94BDE0921E9A54C1E4F20\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_1.SpeechSequence(0).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_1.SpeechSequence(0).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"They were always like this.\"\nmsgstr \"Siempre fueron así.\"\n\n#. Key:\t34903F43484A4D6CE5735890AEEA294D\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_9.SpeechSequence(5).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_9.SpeechSequence(5).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"The Cerulean Gates are closed again. What if we share the work?\"\nmsgstr \"Las puertas de Cerulean están cerradas de nuevo. ¿Qué pasa si compartimos el trabajo?\"\n\n#. Key:\t350270814B961A20E48267A4B1AE0538\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Yes! The Gem is fully charged!\"\nmsgstr \"¡Si! ¡La gema está completamente cargada!\"\n\n#. Key:\t361D80AB46AC47E5A233ECA2323222A2\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_86.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_86.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Why are you obeying that wizard of yours?\"\nmsgstr \"¿Por qué obedeces a ese mago?\"\n\n#. Key:\t365EDA2849D42A47D0D26DAC50DA6E94\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven is not that happy with those two, but Raven can accept that he is what he is.\"\nmsgstr \"Cuervo no está tan feliz con esos dos, pero puede aceptar que él es lo que es.\"\n\n#. Key:\t37C560AB4CCFAF4F8D26FAB1DE22453C\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_63.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_63.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Don't worry. You'll find some purpose.\"\nmsgstr \"No te preocupes Encontrarás algún propósito.\"\n\n#. Key:\t39DAB8B641C31878F7312FA7807D9DA0\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_6.SpeechSequence(3).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_6.SpeechSequence(3).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"The residents of the Realm did not have to work. Their spirit slaves did everything for them, they accomplished all their desires.\"\nmsgstr \"Los residentes del Reino no tenían que trabajar. Sus espíritus esclavos hicieron todo por ellos, lograron todos sus deseos.\"\n\n#. Key:\t3B63606F48193748243DE6AB18D7A68C\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_40.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_40.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven thinks you might want to be something else. Something that you used to be, but you are not anymore.\"\nmsgstr \"Cuervo cree que quizás quieras ser otra cosa. Algo que solías ser, pero ya no lo eres.\"\n\n#. Key:\t3C332B1C4ADB3C16C005E8AAF76A09B1\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_109.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_109.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Except...\"\nmsgstr \"Excepto...\"\n\n#. Key:\t3C9750814FC56947BDA7DFAF8A71DCC2\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_25.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_25.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"It is a long story and Raven doesn't really like to talk about it.\"\nmsgstr \"Es una larga historia y a Cuervo realmente no le gusta hablar de eso.\"\n\n#. Key:\t3D10982D4A6FA88941F13F82413D17AC\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_20.Children(0).Children.Text\n#. Key:\t3E117EBB48C1CF091F456CA0FB78EDD7\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_77.Children(0).Children.Text\n#. Key:\t59F0F04941BB918E08743E8A7C3734B2\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_32.Children(6).Children.Text\n#. Key:\t6556945844ED44678075CE8796F00800\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_51.Children(0).Children.Text\n#. Key:\t7EC3944940792EC71B6A2F8674250649\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_49.Children(0).Children.Text\n#. Key:\tC6963EAE43B4D0FD3C8FBAA80A38E2A2\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_83.Children(1).Children.Text\n#. Key:\tE048FA684AA7B8DE0F7273992DA4600E\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_3.Children(4).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_20.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_3.Children(4).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_32.Children(6).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_49.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_51.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_77.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_83.Children(1).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Leave\"\nmsgstr \"Salir\"\n\n#. Key:\t4417EE084F947AAF5D3285B086F741AC\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven is fine with talking. Ask me whatever you have on your mind!\"\nmsgstr \"Cuervo está bien hablando. ¡Pregúntame lo que tengas en mente!\"\n\n#. Key:\t4485635A4832D9DC57240F8EF3323042\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Very nice! Raven likes that you are making progress.\"\nmsgstr \"¡Muy agradable! A Cuervo le gusta que estés progresando.\"\n\n#. Key:\t480718E34822FD682466E7B217249ED0\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_47.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_47.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Which is technically the same.\"\nmsgstr \"Lo cual es técnicamente lo mismo.\"\n\n#. Key:\t48B67F42417A2930A4D200B958FDFB58\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_38.Children(3).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_38.Children(3).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"I'm confused\"\nmsgstr \"Estoy confundido\"\n\n#. Key:\t49F0AC6A46EBF6C3148BC590CE56C297\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_10.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_10.Children(0).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Help\"\nmsgstr \"Ayuda\"\n\n#. Key:\t4CB1CE8A4AEC18FA175BA98F831D3C3C\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_59.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_59.Children(0).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Farewell\"\nmsgstr \"Adios\"\n\n#. Key:\t4D514A7D4CC96E3E79F464A6C0BF0C6E\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_2.SpeechSequence(4).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_2.SpeechSequence(4).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"What??\"\nmsgstr \"¿¿Qué??\"\n\n#. Key:\t4F8198D64A210B3A41EED8AA6AE64401\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_50.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_50.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven will just sit here for a short time before venturing into the Ruin.\"\nmsgstr \"Cuervo solo se sentará aquí por un corto tiempo antes de aventurarse en Ruin.\"\n\n#. Key:\t503CD5334EE86CFBEC2E7EA67F45ACD9\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"So you're meant to open this dusty little door with Raven, aren't you?\"\nmsgstr \"Entonces estás destinado a abrir esta pequeña puerta con Cuervo, ¿verdad?\"\n\n#. Key:\t512AEC2642B36D9DDF407EB447DF5A28\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_15.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_15.Children(1).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Let's have fun!\"\nmsgstr \"¡Vamos a divertirnos!\"\n\n#. Key:\t5142E71B48C2E993CC8026919A3FDBD6\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_87.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_87.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Er... okey, I was just asking.\"\nmsgstr \"Eh... okay, solo preguntaba.\"\n\n#. Key:\t518038644F25D09C9DA7FF984C272B77\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_40.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_40.Children(1).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"That's stupid\"\nmsgstr \"Eso es estúpido\"\n\n#. Key:\t53B5A1AC40CCF1CFBC106BA2BD8000E0\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_60.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_60.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Farewell, Raven!\"\nmsgstr \"¡Adiós Cuervo!\"\n\n#. Key:\t54C0F3A6493E6D0671D38DB16BD4BF51\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"I would like to know...\"\nmsgstr \"Me gustaría saber...\"\n\n#. Key:\t55665725414633C111356D94939362FF\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_67.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_67.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Let's open that gate. Quick!\"\nmsgstr \"Abramos esa puerta. ¡Rápido!\"\n\n#. Key:\t565D7DA644ADF0E536C2FC8F99B735A3\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_3.Children(2).Children.Text\n#. Key:\t934A23AD44787C735FCDE79A34657C90\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_32.Children(3).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_3.Children(2).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_32.Children(3).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Why is he here?\"\nmsgstr \"¿Por qué él está aquí?\"\n\n#. Key:\t57BE04074884DB4CC54AC691E156F0FC\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_38.Children(2).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_38.Children(2).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Freedom\"\nmsgstr \"Libertad\"\n\n#. Key:\t5919EDBF4799413180AF569CB920E436\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_90.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_90.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"You can't live your life like in the old days any longer and that's why you're staying with your master, right?\"\nmsgstr \"Ya no puedes vivir tu vida como en los viejos tiempos y es por eso que te quedas con tu maestro, ¿verdad?\"\n\n#. Key:\t592D458F40571927D0BB549F3614420E\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_32.Children(5).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_32.Children(5).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"End of the World\"\nmsgstr \"Fin del Mundo\"\n\n#. Key:\t596065A34760461993AC339C51D9E402\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_73.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_73.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"First you will need to find the Gem. Meanwhile, Raven must figure it out how to open the Gate with it.\"\nmsgstr \"Primero deberás encontrar la Gema. Mientras tanto, Cuervo debe descubrir cómo abrir la Puerta con ella.\"\n\n#. Key:\t599A90394B8AC7A26D20FEB355A873FB\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_98.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_98.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"What are you doing here?\"\nmsgstr \"¿Qué estás haciendo aquí?\"\n\n#. Key:\t5A5D2F08427C4747F3EF529D6B73A21B\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Go on your search then! Unless you'd like to chat some more with Raven.\"\nmsgstr \"¡Continúa tu búsqueda entonces! A menos que quieras hablar un poco más con Cuervo.\"\n\n#. Key:\t5A63E364458C849C9B6FDD8491427051\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_8.SpeechSequence(5).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_8.SpeechSequence(5).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"But you could.\"\nmsgstr \"Pero podrías.\"\n\n#. Key:\t5B07757F4CAAD674E09EBB835CEE230B\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_75.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_75.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"It must be somewhere close to the Arcade.\"\nmsgstr \"Debe estar en algún lugar cerca del Arcade.\"\n\n#. Key:\t5B9CDB4340B5E65E59D3A18283A84CA5\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_64.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_64.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven knows some people that'd be glad with that.\"\nmsgstr \"Cuervo conoce a algunas personas que estarían contentas con eso.\"\n\n#. Key:\t5BA0645E49A62C0945FB64BDF689721F\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_112.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_112.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Is that where I will find your artefacts?\"\nmsgstr \"¿Es ahí donde encontraré tus artefactos?\"\n\n#. Key:\t5E70951F4E50B061FF2DA196F0207612\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_15.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_15.Children(0).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Save the world!\"\nmsgstr \"¡Salvar el mundo!\"\n\n#. Key:\t5F810A7D417E5B02025F30B21FEA5F03\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_79.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_79.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Niiice!\"\nmsgstr \"¡Buueeeno!\"\n\n#. Key:\t6441F8C2484FAA5219841C9D374F36C4\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_6.SpeechSequence(6).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_6.SpeechSequence(6).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"And now, even while we speak, their curse continues to spread.\"\nmsgstr \"Y ahora, incluso mientras hablamos, su maldición continúa extendiéndose.\"\n\n#. Key:\t66A08695458FF9D46383F6A0AF609EFA\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_41.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_41.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"You are so hopeless...\"\nmsgstr \"Eres tan desesperado...\"\n\n#. Key:\t67EEF3DB42BA2C954AD566B4F95EBDB6\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_6.SpeechSequence(5).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_6.SpeechSequence(5).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Until one day the spirits broke loose and formed Ruin.\"\nmsgstr \"Hasta que un día los espíritus se escaparon y formaron Ruin.\"\n\n#. Key:\t68442CA14CECA9FB8A215EBEBC724F63\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Ask more from Raven if you like!\"\nmsgstr \"¡Pide más a Cuervo si quieres!\"\n\n#. Key:\t694D416244358BD7DBED04A82390A146\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_51.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_51.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"One more,... and the Gem will be completed!\"\nmsgstr \"Una más, ¡y la Gema estará completa!\"\n\n#. Key:\t6A463E0444754B73FE11988F07D5A58F\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_2.SpeechSequence(1).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_2.SpeechSequence(1).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"You just have to do it.\"\nmsgstr \"Sólo tienes que hacerlo.\"\n\n#. Key:\t6A92F010409301669F7B83AD7901A469\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"A strange creature, yet a familiar aura! Tell me, my dear Wizard, what happened to Tabby?\"\nmsgstr \"¡Una criatura extraña, pero un aura familiar! Dime, mi querido mago, ¿Qué le pasó a Tabby?\"\n\n#. Key:\t6CC1259244D5FC82CA1C2EA314836741\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_1.SpeechSequence(1).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_1.SpeechSequence(1).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"They both accepted that there is a great threat in this realm.\"\nmsgstr \"Ambos aceptaron que hay una gran amenaza en este reino.\"\n\n#. Key:\t6FB7AF774662247E2001F9AAF34FF134\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_111.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_111.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Somewhere beyond that Gate there's a Portal. It will take you into the heart of the Realm.\"\nmsgstr \"En algún lugar más allá de esa Puerta hay un Portal. Te llevará al corazón del Reino.\"\n\n#. Key:\t70A0BA47476A909013EFC0A574815B61\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_23.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_23.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"The Master and Raven are seeking knowledge about the Ruined Realm.\"\nmsgstr \"El Maestro y el Cuervo están buscando conocimiento sobre el Reino Arruinado.\"\n\n#. Key:\t70ECE1B74BA0B02F2F0850937BF4FB02\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_3.Children(3).Children.Text\n#. Key:\tE9F5916345156A4E5F29AC886B49B8AD\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_32.Children(4).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_3.Children(3).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_32.Children(4).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"About Ruin\"\nmsgstr \"Sobre Ruina\"\n\n#. Key:\t7311CA4B4D6B19C6C5C362AF522A9803\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_1.SpeechSequence(4).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_1.SpeechSequence(4).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Your master said he is done with that.\"\nmsgstr \"Tu maestro dijo que terminó con eso.\"\n\n#. Key:\t74B8E0B44D4590E9970F4B9D09D3C4F9\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_6.SpeechSequence(1).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_6.SpeechSequence(1).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Long ago it was called the Runic Realm.\"\nmsgstr \"Hace mucho tiempo se llamaba el Reino Rúnico.\"\n\n#. Key:\t76756B1C48E93E907CE32D83A2C56C3E\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_7.SpeechSequence(0).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_7.SpeechSequence(0).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven is really sorry but he can't help you anymore.\"\nmsgstr \"Cuervo lo siente mucho, pero ya no puede ayudarte.\"\n\n#. Key:\t78C7CE5948D176704CA69289BEEBFBA7\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_44.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_44.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"And what about the Realm of the wizards? They did not go mad yet, did they?\"\nmsgstr \"¿Y qué hay del Reino de los magos? Todavía no se volvieron locos, ¿verdad?\"\n\n#. Key:\t7DFA4D494BD0536F925A94BBF7C71F36\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_66.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_66.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Focus on what you have to do and you will find the real you.\"\nmsgstr \"Concéntrese en lo que tiene que hacer y encontrarás el verdadero tu.\"\n\n#. Key:\t81F437694DEE3D32A0FC29B90688E8B9\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_38.Children(4).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_38.Children(4).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"This is stupid\"\nmsgstr \"Esto es estúpido\"\n\n#. Key:\t82F473A04D250E98AD186185EBE95C04\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_5.SpeechSequence(0).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_5.SpeechSequence(0).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven thinks freedom is such an empty word.\"\nmsgstr \"Cuervo piensa que libertad es una palabra tan vacía.\"\n\n#. Key:\t8688802A4303C53640C7BFAAA40226EC\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Almost there!\"\nmsgstr \"¡Ya queda nada!\"\n\n#. Key:\t8728C02E46E7B681D0A792ACAFC3237D\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_28.Children(2).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_28.Children(2).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"He accepted his fate\"\nmsgstr \"Aceptó su destino\"\n\n#. Key:\t8854653141FA36E731780F9111B82FAD\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_30.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_30.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"You are not listening to Raven's words!\"\nmsgstr \"¡No estás escuchando las palabras de Cuervo!\"\n\n#. Key:\t88FDA06B4A44ED1BF559D996E6AF7097\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_6.SpeechSequence(0).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_6.SpeechSequence(0).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Even so, Raven will tell you a bit.\"\nmsgstr \"Aun así, Cuervo te lo contará un poco.\"\n\n#. Key:\t8BA584404F2713EE39D74284F829C50A\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"You know what? Raven totally agrees with that!\"\nmsgstr \"¿Sabes que? ¡Cuervo está totalmente de acuerdo con eso!\"\n\n#. Key:\t8C272FBE47796CF8101D07AAD033C24B\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_62.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_62.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"The later we met the more time the World survived, didn't it?\"\nmsgstr \"Cuanto más tarde nos conocimos, más tiempo sobrevivió el mundo, ¿no?\"\n\n#. Key:\t8DD39A3D497411B348B883972CE6B442\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_6.SpeechSequence(7).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_6.SpeechSequence(7).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"At first, lands lose their colours, people go mad... and then, everything breaks into shards until solely hollowness remains...\"\nmsgstr \"Al principio, las tierras pierden sus colores, la gente se vuelve loca... y luego, todo se rompe en fragmentos hasta que solo queda el vacío...\"\n\n#. Key:\t8E02961D428949EE8176639F6AE84DD9\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_107.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_107.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"If the end is near, there is no point in making long term plans.\"\nmsgstr \"Si el final está cerca, no tiene sentido hacer planes a largo plazo.\"\n\n#. Key:\t8EB8F2654B9C18135CBEB49D10485417\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_37.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_37.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"We all have a purpose in life.\"\nmsgstr \"Todos tenemos un propósito en la vida.\"\n\n#. Key:\t9131DE4C434AD9B22C7B1BAA588AF694\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_9.SpeechSequence(3).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_9.SpeechSequence(3).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Private business? All right! We might have different motivations, however working together could be fruitful.\"\nmsgstr \"¿Negocios privados? ¡Todo bien! Podríamos tener diferentes motivaciones, sin embargo, trabajar juntos podría ser fructífero.\"\n\n#. Key:\t91947E4046F96E9330EA5A94C367E2C5\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Forget it, I'm on my way now.\"\nmsgstr \"Olvídalo, estoy en camino ahora.\"\n\n#. Key:\t91BE2C7248B2BEBE1C376B989935E353\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"What else should Raven tell you?\"\nmsgstr \"¿Qué más debería decirte Cuervo?\"\n\n#. Key:\t929558D0465B0884C4E373A602CCE9E5\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_59.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_59.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Farewell compeer until you meet Raven again!\"\nmsgstr \"¡Adiós compañero hasta que te encuentres con Cuervo otra vez!\"\n\n#. Key:\t930942934A83107D86DB69A2C2EF11E0\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_117.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_117.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"The task is of high complexity.\"\nmsgstr \"La tarea es de alta complejidad.\"\n\n#. Key:\t93AFC24842A793D2BF7B43A64B6972AF\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_32.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_32.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Is there anything else for Raven?\"\nmsgstr \"¿Hay algo más para Cuervo?\"\n\n#. Key:\t9A9D5DA346251040AF73B7B100E1EBC9\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_35.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_35.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven used to like being a bird, but now he has no other choice. He must embrace what he became.\"\nmsgstr \"A Cuervo le gustaba ser un pájaro, pero ahora no tiene otra opción. Debe aceptar en lo que se ha convertido.\"\n\n#. Key:\t9B558C3045D4501AEAF3DD8694E2198F\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_105.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_105.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"We'd rather have some fun before it's all over.\"\nmsgstr \"Preferimos divertirnos un poco antes de que todo ha terminado.\"\n\n#. Key:\t9E598A384E301BCD345ABFB0C1312C12\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_78.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_78.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Krrr... Raven notices that you've found the Gem!\"\nmsgstr \"Krrr... ¡Cuervo se da cuenta de que has encontrado la Gema!\"\n\n#. Key:\t9FAD3A1A4E3EFE33C1CAB8BAAC8190D1\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_26.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_26.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Let Raven tell you something:\"\nmsgstr \"Deja que Cuervo te cuente algo:\"\n\n#. Key:\tA10F960549BD21AFAD4819BD5C74E651\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_2.SpeechSequence(5).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_2.SpeechSequence(5).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Nevermind. Raven is kidding.\"\nmsgstr \"No importa. Cuervo está bromeando.\"\n\n#. Key:\tA4294A174F9EA54E0149839A84CE2B94\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_15.Children(2).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_15.Children(2).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Hopeless...\"\nmsgstr \"Sin esperanza...\"\n\n#. Key:\tA59406E8411939F96004EAA9D5707E08\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_28.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_28.Children(1).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"What?\"\nmsgstr \"¿Qué?\"\n\n#. Key:\tA5993D8047CDD35BA31D318832EB9C66\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_32.Children(2).Children.Text\n#. Key:\tB7AE6BEC4CA905BDED5990BFF4D0C93D\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_3.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_3.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_32.Children(2).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"About wizards\"\nmsgstr \"Sobre magos\"\n\n#. Key:\tA59A76814D8EAF5907CBC68AA63FE33F\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_2.SpeechSequence(3).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_2.SpeechSequence(3).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"How can I know that if you don't do it?\"\nmsgstr \"¿Cómo puedo saber eso si no lo haces?\"\n\n#. Key:\tA7C7D1EC45A072755BAAB099DB359290\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_55.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_55.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"They don't believe that Ruin can affect their World. They say that it has no effect.\"\nmsgstr \"No creen que Ruin pueda afectar su mundo. Dicen que no tiene ningún efecto.\"\n\n#. Key:\tA7D99136490D40CB08BA66A72192D6C0\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_7.SpeechSequence(2).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_7.SpeechSequence(2).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Go now! Raven needs to think.\"\nmsgstr \"¡Ve ahora! Cuervo necesita pensar.\"\n\n#. Key:\tA80B626C41713C6E42E4DF8696FF842D\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_8.SpeechSequence(0).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_8.SpeechSequence(0).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"You were a bird once. Then you became something else.\"\nmsgstr \"Eras un pájaro una vez. Y ahora eres otra cosa.\"\n\n#. Key:\tA8D429384EFE74E30720149A1C53ADE9\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_38.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_38.Children(0).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Don't know\"\nmsgstr \"No lo se\"\n\n#. Key:\tA9A73720489C122A81B84CBA262C329E\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_38.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_38.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven knows what his task is. Do you know yours?\"\nmsgstr \"Cuervo sabe cuál es su tarea. ¿Conoces el tuyo?\"\n\n#. Key:\tAB41A75C432BEBDC81D63282FCC15F98\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_5.SpeechSequence(2).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_5.SpeechSequence(2).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Got it? Free like a bird! Ha-ha-ha!\"\nmsgstr \"¿Lo tengo? ¡Libre como un pájaro! ¡Jajaja!\"\n\n#. Key:\tAC52327249DB335CBAB9EDA6A3F4769E\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_31.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_31.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven is doing this because this is what he is.\"\nmsgstr \"Cuervo está haciendo esto porque esto es lo que es.\"\n\n#. Key:\tB2003CEE44335B30B9F85487521B7679\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_54.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_54.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Maybe.\"\nmsgstr \"Tal vez.\"\n\n#. Key:\tB31EEC6247CDEF73BB4E5B84E2B66575\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_9.SpeechSequence(2).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_9.SpeechSequence(2).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"That’s over now. This time it's for private business.\"\nmsgstr \"Eso ya terminó. Esta vez es para negocios privados.\"\n\n#. Key:\tB3DD59C44422BA99C839FCAE63F05B9A\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_93.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_93.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"I want to be free again!\"\nmsgstr \"¡Quiero ser libre otra vez!\"\n\n#. Key:\tB789219A48C2A835F2DA4CA24064E1D3\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_92.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_92.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"I would like to go home.\"\nmsgstr \"Me gustaría ir a casa.\"\n\n#. Key:\tB7D4201F41E5F018EFD49EAF52E443A8\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_76.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_76.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"You still haven't found the Gem.\"\nmsgstr \"Aún no has encontrado la Gema.\"\n\n#. Key:\tB7EC6E4F4EDC448FD264999938414F3C\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Let's talk about something else!\"\nmsgstr \"¡Hablemos de otra cosa!\"\n\n#. Key:\tB8BF08674C9E2FD0515998B95A1EA7CF\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_7.SpeechSequence(1).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_7.SpeechSequence(1).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"If you can't fulfill your task, then maybe your master should look for a better servant.\"\nmsgstr \"Si no puede cumplir con su tarea, entonces tal vez su maestro debería buscar un mejor servidor.\"\n\n#. Key:\tBD775EF74E334A4DEFA67BBF9034500E\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_84.Text\n#. Key:\tFA3FEF444FD2A3500FCCE98FAEAE923E\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_42.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_42.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_84.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Yes?\"\nmsgstr \"¿Sí?\"\n\n#. Key:\tBE2B9D7A45C2D43FF4C0BAAA284CBB97\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"No thanks! I'm on my way now.\"\nmsgstr \"¡No, gracias! Estoy en camino ahora.\"\n\n#. Key:\tC04CC9334FC3C2522793C2B97CC165D8\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_108.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_108.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"The gate is open!\"\nmsgstr \"¡La puerta está abierta!\"\n\n#. Key:\tC0F2E4744D724A3D6A0DEF914C294CE1\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_38.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_38.Children(1).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Go home\"\nmsgstr \"Ir a casa\"\n\n#. Key:\tC10018654B64193BBFF439B54EF02FB1\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"So why not open the gate?\"\nmsgstr \"Entonces, ¿por qué no abres la puerta?\"\n\n#. Key:\tC18E2FB345BE76B6F51C71A2B6453316\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_99.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_99.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"What can you tell me about the Ruined Realm?\"\nmsgstr \"¿Qué me puedes decir sobre el Reino Arruinado?\"\n\n#. Key:\tC19082D247C23A21B632968FE6A644D1\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_8.SpeechSequence(3).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_8.SpeechSequence(3).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"You failed to see the meaning behind Raven's thoughts.\"\nmsgstr \"No lograste ver el significado detrás de los pensamientos de Cuervo.\"\n\n#. Key:\tC2DC44084098DD604B757A8A47AAC4FE\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_58.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_58.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"We'll see.\"\nmsgstr \"Ya veremos.\"\n\n#. Key:\tC53F5E0F46BBE7A1FD00EABD6E14848D\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_33.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_33.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Maybe you are wiser than Raven, but that's just a thought, little spirit.\"\nmsgstr \"Tal vez eres más sabio que Cuervo, pero eso es solo un pensamiento, pequeño espíritu.\"\n\n#. Key:\tC78588B64D12FFBE97C47AB7C046C14E\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_1.SpeechSequence(5).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_1.SpeechSequence(5).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven doesn't believe it's true.\"\nmsgstr \"Cuervo no cree que sea verdad.\"\n\n#. Key:\tC7F7F71F4FE0D19BDF86188BEFDDEEB1\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_5.SpeechSequence(1).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_5.SpeechSequence(1).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Just look at Raven! He's free like a bird.\"\nmsgstr \"¡Solo mira a Cuervo! Es libre como un pájaro.\"\n\n#. Key:\tC82BE6E448D7C98D361CA1890FEE3B2C\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_9.SpeechSequence(6).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_9.SpeechSequence(6).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"I’m in.\"\nmsgstr \"Estoy dentro.\"\n\n#. Key:\tCD1A68EF460B0C63C95340AC2076EBAF\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven notices that the gem is just as dull as before. Why did you return then?\"\nmsgstr \"Cuervo se da cuenta de que la gema es tan apagado como antes. ¿Por qué volviste entonces?\"\n\n#. Key:\tD3C84C884903F7FB53695AAE253C7982\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_40.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_40.Children(0).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Agree\"\nmsgstr \"Estoy de acuerdo\"\n\n#. Key:\tD438ABB348A399ACB18DFD8F320CC7BB\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_57.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_57.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"And what's the truth?\"\nmsgstr \"¿Y cual es la verdad?\"\n\n#. Key:\tD5DF32814FA17D7ED28BF0A91027A6E8\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_110.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_110.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Finally! From now on you won't need Raven anymore.\"\nmsgstr \"¡Finalmente! De ahora en adelante ya no necesitarás a Cuervo.\"\n\n#. Key:\tD6A649B2453BCBAD95A16FA481664133\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_49.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_49.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Find the other Chargers and return to Raven when you are done.\"\nmsgstr \"Encuentra los otros cargadores y regresa a Cuervo cuando hayas terminado.\"\n\n#. Key:\tD9959CF1439812F5615A38B9369F6E16\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_71.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_71.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven notices that you already have the Gem.\"\nmsgstr \"Cuervo se da cuenta de que ya tienes la Gema.\"\n\n#. Key:\tD9A4F3D54EF460C09B2A6C9B8EB87D7C\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_32.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_32.Children(1).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"About my purpose...\"\nmsgstr \"Sobre mi propósito...\"\n\n#. Key:\tD9C6F8C14BC9C0BD83715E96DE5B7161\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_28.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_28.Children(0).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"He is a volunteer\"\nmsgstr \"El es un voluntario\"\n\n#. Key:\tDC7CA6DF4D684A7C2DBA739F404ABC36\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_94.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_94.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"I don't know what to do. I can't remember anything from my previous life.\"\nmsgstr \"No se que hacer. No recuerdo nada de mi vida anterior.\"\n\n#. Key:\tDD8E05E541C32F05357D888FB6963FF0\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_114.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_114.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"All right, I go then.\"\nmsgstr \"Muy bien, entonces voy.\"\n\n#. Key:\tDE3A0B8047C9980B6DED0BA39C777539\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_28.Children(3).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_28.Children(3).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Not interested\"\nmsgstr \"No interesado\"\n\n#. Key:\tDF86F9C84CF207616E931098F3C833D3\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"To activate the locking mechanism we need an infused Lock Gem.\"\nmsgstr \"Para activar el mecanismo de bloqueo necesitamos una Gema de Bloqueo infundida.\"\n\n#. Key:\tE0105C1845AF9211960E869AB234ED9A\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_89.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_89.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"So you are obeying because... that's the only thing that you can do?\"\nmsgstr \"Entonces estás obedeciendo porque... ¿eso es lo único que puedes hacer?\"\n\n#. Key:\tE17598BB49D7E4083AD4AEA2DDFE293D\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_106.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_106.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"It would make sense to try to save the world, wouldn't it?\"\nmsgstr \"Tendría sentido intentar salvar el mundo, ¿no?\"\n\n#. Key:\tE1CFA5A44F4EF59527528DB6018ACF33\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_8.SpeechSequence(6).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_8.SpeechSequence(6).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven doesn't care about what he could do. Raven cares about what he does.\"\nmsgstr \"A Cuervo no le importa lo que pueda hacer. A Cuervo le importa lo que hace.\"\n\n#. Key:\tE6FA584E454BC3943C927EADAEBA88C4\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_6.SpeechSequence(8).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_6.SpeechSequence(8).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"That's not too reassuring...\"\nmsgstr \"Eso no me da mucha confianza...\"\n\n#. Key:\tE9D9EC1F450276CF11B259978062AB7E\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_96.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_96.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"We shouldn't waste any more time on this.\"\nmsgstr \"No deberíamos perder más tiempo en esto.\"\n\n#. Key:\tEC19AF0E4F2F4B488373FFBEDC272321\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_56.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_56.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Except for a few paranoid ones, like your master.\"\nmsgstr \"Excepto por algunos paranoicos, como tu maestro.\"\n\n#. Key:\tEFC8B9984D9F4A9ACC9AE580E271E810\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_39.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_39.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Searching for a way to open this gate with the help of a talking Ball is so much fun!\"\nmsgstr \"¡Es muy divertido buscar la manera de abrir esta puerta con la ayuda de una Pelota que habla!\"\n\n#. Key:\tEFCE20A646FA62188BE7EB85D6708843\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_115.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_115.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven will venture deeper into the Ruined Realm!\"\nmsgstr \"¡Cuervo se aventurará más profundamente en el Reino Arruinado!\"\n\n#. Key:\tF0B00A30413914D09CA4488578B2FD7C\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_24.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_24.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven agrees.\"\nmsgstr \"Cuervo está de acuerdo.\"\n\n#. Key:\tF40AD31D4177DCB7BB138C9C139FB1A1\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_61.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_61.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"I hope that won't be too soon...\"\nmsgstr \"Espero que no sea demasiado pronto...\"\n\n#. Key:\tF4F8CBCD421083EDBF626AA47DEF4B50\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_88.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_88.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Do you mean that you are serving your wizard by your own will?\"\nmsgstr \"¿Quieres decir que estás sirviendo a tu mago por tu propia voluntad?\"\n\n#. Key:\tF5A7836549DF56B89620A386E7CCF708\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_48.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_48.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"But there is still so much left to do...\"\nmsgstr \"Pero aún queda mucho por hacer...\"\n\n#. Key:\tF8361ECC401E740DEBF87FAE2A419EC8\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_32.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_32.Children(0).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven Servant?\"\nmsgstr \"¿Sirviente de Cuervo?\"\n\n#. Key:\tFA5F957341772B0C4AFA33B1311CF7B4\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_69.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_69.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Except if we meet in the Afterworld.\"\nmsgstr \"Excepto si nos encontramos en el Más Allá.\"\n\n#. Key:\tFA94A8EF4F8BF5EA422D27A9A205D866\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_3.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_3.Children(0).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven servant?\"\nmsgstr \"¿Sirviente de Cuervo?\"\n\n#. Key:\tFC0798A648BFC0E9BA70D6B20A46F447\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_1.SpeechSequence(2).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_1.SpeechSequence(2).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Your master seeks to stop it no matter the price he has to pay.\"\nmsgstr \"Tu maestro intenta detenerlo a cualquier precio.\"\n\n#. Key:\tFCE7049641D2A70FC6B9E5B174919A64\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_9.SpeechSequence(0).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_9.SpeechSequence(0).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Tabby has retired. What did you come for?\"\nmsgstr \"Tabby se ha retirado. ¿Para qué viniste?\"\n\n#. Key:\tFD68B18A435050A137D8F0948F24E2DC\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Why are we messing with this door if the World is about to end?\"\nmsgstr \"¿Por qué estamos gastando tiempo con esta puerta si el mundo está a punto de terminar?\"\n\n#. Key:\tFF3D9FCF4A840A8155A8D7AD9CC22F2D\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Obey? Raven doesn't obey.\"\nmsgstr \"¿Obedecer? Cuervo no obedece.\"\n\n#. Key:\tFFB203D94B0A5C22BA29B68A1A8A740F\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_9.SpeechSequence(8).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_9.SpeechSequence(8).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Farewell then.\"\nmsgstr \"Adiós entonces.\"\n\n#. Key:\t0C459FB64505D02011822A9EDFA8FCA4\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/AGStatue.AGStatue:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/AGStatue.AGStatue:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_AGStatue\"\nmsgid \"'We are the elite of the Runic Realm. Our wisdom is great, our magic is strong.'\"\nmsgstr \"\\\"Somos la élite del Reino Rúnico. Nuestra sabiduría es genial, nuestra magia es fuerte.\\\"\"\n\n#. Key:\t7DB580C64E9B33FD525DDF986BD5E4A4\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/AGStatue.AGStatue:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/AGStatue.AGStatue:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_AGStatue\"\nmsgid \"Looks like he was wrong...\"\nmsgstr \"Parece que estaba equivocado...\"\n\n#. Key:\tAFBD86084D8E6EBDF240998FA98D184D\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/AGStatue.AGStatue:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/AGStatue.AGStatue:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_AGStatue\"\nmsgid \"'We are Ceruleans! We do not escape!'\"\nmsgstr \"\\\"¡Somos cerúleos! ¡No escapamos!\\\"\"\n\n#. Key:\tC2CC8EE94954A8DC42222FBB28A7656E\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/AGStatue.AGStatue:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/AGStatue.AGStatue:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_AGStatue\"\nmsgid \"'Citizens of Cerulean! Do not join the poor of Grey Gate!'\"\nmsgstr \"¡Ciudadanos de Cerulean! ¡No te unas a los pobres de la Puerta Gris!\"\n\n#. Key:\tD909E4A34387B448378464BDE8292B4D\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/AGStatue.AGStatue:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/AGStatue.AGStatue:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_AGStatue\"\nmsgid \"'Ruin can’t harm us!'\"\nmsgstr \"\\\"¡Ruin no puede hacernos daño!\\\"\"\n\n#. Key:\t3CE243AA4AFB12B37239608C66537764\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/BeforeBoss.BeforeBoss:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/BeforeBoss.BeforeBoss:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_BeforeBoss\"\nmsgid \"Maybe you should talk to the gnome or the Keeper.\"\nmsgstr \"Tal vez deberías hablar con el gnomo o el Guardián.\"\n\n#. Key:\t4F35F4834FBCC04C218A879123EF8706\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/BeforeBoss.BeforeBoss:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/BeforeBoss.BeforeBoss:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_BeforeBoss\"\nmsgid \"Using the portals here one could get into any part of the World in no time.\"\nmsgstr \"Usando los portales, uno puede llegar a cualquier parte del mundo enseguida.\"\n\n#. Key:\t62EDCB724DAC5317C72B99AEB9904F4E\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/BeforeBoss.BeforeBoss:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/BeforeBoss.BeforeBoss:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_BeforeBoss\"\nmsgid \"This place was the base of the formal Ruined Realm.\"\nmsgstr \"Este lugar era la base del Reino Arruinado.\"\n\n#. Key:\tCB8B47F74583A48529A353B97C4909B9\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/BeforeBoss.BeforeBoss:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/BeforeBoss.BeforeBoss:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_BeforeBoss\"\nmsgid \"I hope at least some of the portals still work.\"\nmsgstr \"Espero que al menos algunos de los portales sigan funcionando.\"\n\n#. Key:\t2A9CE8714E7E1ABC9365E5A1E2CE2EC8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/BossArmourWrath.BossArmourWrath:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Chapter2/BossArmourWrath.BossArmourWrath:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_BossArmourWrath\"\nmsgid \"Keep away from my artefact little thief or I will crush you!\"\nmsgstr \"¡Mantente alejado de mi artefacto pequeño ladrón o te aplastaré!\"\n\n#. Key:\t3F79029C410F4CC3B41548A26A7D69EB\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/BossArmourWrath.BossArmourWrath:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Chapter2/BossArmourWrath.BossArmourWrath:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_BossArmourWrath\"\nmsgid \"Listen, I really need that. What if I give you something instead?\"\nmsgstr \"Escucha, realmente lo necesito. ¿Qué pasa si te doy algo en su lugar?\"\n\n#. Key:\t451F1E844E29E674899BD3BEFBC17380\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/BossArmourWrath.BossArmourWrath:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter2/BossArmourWrath.BossArmourWrath:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_BossArmourWrath\"\nmsgid \"I’m here for the artefact... could you give it to me?\"\nmsgstr \"Estoy aquí para el artefacto... ¿podrías dármelo?\"\n\n#. Key:\tAC11C22040909F7F4DD1518AD5C14AFA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/BossArmourWrath.BossArmourWrath:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Chapter2/BossArmourWrath.BossArmourWrath:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_BossArmourWrath\"\nmsgid \"That is mine!\"\nmsgstr \"¡Eso es mio!\"\n\n#. Key:\tD30E184A406B5B1EFB87F3845CE82664\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/BossArmourWrath.BossArmourWrath:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter2/BossArmourWrath.BossArmourWrath:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_BossArmourWrath\"\nmsgid \"Have you come to worship my perfection?\"\nmsgstr \"¿Has venido a adorar mi perfección?\"\n\n#. Key:\tF626219F434EECD05727BC9FAB5CEB76\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/BossArmourWrath.BossArmourWrath:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Chapter2/BossArmourWrath.BossArmourWrath:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_BossArmourWrath\"\nmsgid \"Damn you and your perfection!\"\nmsgstr \"¡Maldita sea tu y tu perfección!\"\n\n#. Key:\t2892C4AB4DACCAF48565619948DCA122\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/BossDwarvenStatue.BossDwarvenStatue:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter2/BossDwarvenStatue.BossDwarvenStatue:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_BossDwarvenStatue\"\nmsgid \"I am all right! I am still keeping it back!\"\nmsgstr \"¡Estoy bien! ¡Todavía lo estoy guardando!\"\n\n#. Key:\t378D26B144B4B17F23F788B56F714118\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/BossDwarvenStatue.BossDwarvenStatue:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Chapter2/BossDwarvenStatue.BossDwarvenStatue:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_BossDwarvenStatue\"\nmsgid \"I am looking for an artefact...\"\nmsgstr \"Estoy buscando un artefacto...\"\n\n#. Key:\t3956257F405EC80CE4547FBE57C53A11\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/BossDwarvenStatue.BossDwarvenStatue:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Chapter2/BossDwarvenStatue.BossDwarvenStatue:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_BossDwarvenStatue\"\nmsgid \"Do you...\"\nmsgstr \"Lo tienes...\"\n\n#. Key:\t946CFCCE4CA505C7C4039A9FF196A35C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/BossDwarvenStatue.BossDwarvenStatue:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter2/BossDwarvenStatue.BossDwarvenStatue:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_BossDwarvenStatue\"\nmsgid \"Have the sculptors sent you?\"\nmsgstr \"¿Te han enviado los escultores?\"\n\n#. Key:\tA30FB80548251020E4AD859A928AB6B5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/BossDwarvenStatue.BossDwarvenStatue:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Chapter2/BossDwarvenStatue.BossDwarvenStatue:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_BossDwarvenStatue\"\nmsgid \"Go away! I hold it back!\"\nmsgstr \"¡Vete! ¡Lo retendré!\"\n\n#. Key:\tAC5220964331387202C55584104246C2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/BossDwarvenStatue.BossDwarvenStatue:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Chapter2/BossDwarvenStatue.BossDwarvenStatue:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_BossDwarvenStatue\"\nmsgid \"I have a bad feeling about this...\"\nmsgstr \"Tengo un mal presentimiento...\"\n\n#. Key:\tE05C384043C6F8407BDA2D97A1D64F96\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/BossDwarvenStatue.BossDwarvenStatue:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Chapter2/BossDwarvenStatue.BossDwarvenStatue:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_BossDwarvenStatue\"\nmsgid \"He has one of the artefacts. You need to get it somehow.\"\nmsgstr \"Él tiene uno de los artefactos. Necesitas obtenerlo de alguna manera.\"\n\n#. Key:\tF9B8F4E9413785B5F59DD88CBF8D56CC\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/BossDwarvenStatue.BossDwarvenStatue:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Chapter2/BossDwarvenStatue.BossDwarvenStatue:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_BossDwarvenStatue\"\nmsgid \"Don’t come any closer! I’m still fine!\"\nmsgstr \"¡No te acerques más! ¡Todavía estoy bien!\"\n\n#. Key:\t49D7B5DA484C712573AE84B3A2609541\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/BossFallenDruid.BossFallenDruid:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Chapter2/BossFallenDruid.BossFallenDruid:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_BossFallenDruid\"\nmsgid \"You will never lay your hand on anything in this place!\"\nmsgstr \"¡Nunca pondrás tu mano sobre nada en este lugar!\"\n\n#. Key:\t9642DD9241E67544571A5EABA9EBC42B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/BossFallenDruid.BossFallenDruid:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter2/BossFallenDruid.BossFallenDruid:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_BossFallenDruid\"\nmsgid \"Actually I’m about to leave but I need the artefact first.\"\nmsgstr \"En realidad estoy a punto de irme, pero primero necesito el artefacto.\"\n\n#. Key:\t9A2BE08D4010C4D2425F96BA17A60936\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/BossFallenDruid.BossFallenDruid:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Chapter2/BossFallenDruid.BossFallenDruid:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_BossFallenDruid\"\nmsgid \"I shall purge my forest from your kind! To hell with you creature!\"\nmsgstr \"¡Purgaré mi bosque de los tuyos! Al diablo contigo criatura!\"\n\n#. Key:\tFC4A1C9748C31BD2AA2E4F93E5D56AF8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/BossFallenDruid.BossFallenDruid:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter2/BossFallenDruid.BossFallenDruid:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_BossFallenDruid\"\nmsgid \"Stay away from my sacred forests creature of Ruin!\"\nmsgstr \"¡Aléjate de mi bosque sagrado, criatura de la Ruin!\"\n\n#. Key:\t3F4302BF46D1F9EA241446A796CE6AA5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Fishy.C3Fishy:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter3/C3Fishy.C3Fishy:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_C3Fishy\"\nmsgid \"Fishy will miss home.\"\nmsgstr \"Fishy echará de menos su hogar.\"\n\n#. Key:\t52063C724F858E16B1E9B482E064B3FC\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Fishy.C3Fishy:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/Chapter3/C3Fishy.C3Fishy:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_C3Fishy\"\nmsgid \"Raven will try to take us into the Human Realm.\"\nmsgstr \"Cuervo intentará llevarnos al Reino Humano.\"\n\n#. Key:\tBC79FC4E44CCD0BE44BAAAA5ED304C9D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3GateKeeper.C3GateKeeper:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Chapter3/C3GateKeeper.C3GateKeeper:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_C3GateKeeper\"\nmsgid \"I hope you will find us Worthy.\"\nmsgstr \"Espero que nos encuentres dignos.\"\n\n#. Key:\tDD8DEA6B4E1D6AABEB6B0483614A41BB\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3GateKeeper.C3GateKeeper:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter3/C3GateKeeper.C3GateKeeper:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_C3GateKeeper\"\nmsgid \"Welcome, my young Lord!\"\nmsgstr \"¡Bienvenido, mi joven señor!\"\n\n#. Key:\tFCC28D1C4A19B1964301B388625A722F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3GateKeeper.C3GateKeeper:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter3/C3GateKeeper.C3GateKeeper:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_C3GateKeeper\"\nmsgid \"I heard this time you shall open a Gate for us.\"\nmsgstr \"Escuché que esta vez abrirás una Puerta para nosotros.\"\n\n#. Key:\t1F96C2364594513AB8DF00A8C11ADB2C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Gnory.C3Gnory:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Chapter3/C3Gnory.C3Gnory:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_C3Gnory\"\nmsgid \"I don’t want anything bad for business in the new Realm.\"\nmsgstr \"No quiero nada malo para los negocios en el nuevo Reino.\"\n\n#. Key:\t24FA4B6840C3EEF0A9D418AED7C900A5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Gnory.C3Gnory:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/Chapter3/C3Gnory.C3Gnory:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_C3Gnory\"\nmsgid \"Eh, you again?\"\nmsgstr \"Eh, ¿tu otra vez?\"\n\n#. Key:\t5CA8478D46ED1ADF6F0B5E82F1035ADE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Gnory.C3Gnory:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter3/C3Gnory.C3Gnory:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_C3Gnory\"\nmsgid \"A whole new World awaits for me and my shop.\"\nmsgstr \"Un Mundo completamente nuevo me espera a mí y a mi tienda.\"\n\n#. Key:\tA406AFAD47000D9338C978B2EB16A86F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Gnory.C3Gnory:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Chapter3/C3Gnory.C3Gnory:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_C3Gnory\"\nmsgid \"If you can arrange it I would be more happy if we could leave Lory here.\"\nmsgstr \"Si puede organizarlo, estaría más feliz si pudiéramos dejar a Lory aquí.\"\n\n#. Key:\tBA4D0C244931E6431FA17CA2257BDDE1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Gnory.C3Gnory:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter3/C3Gnory.C3Gnory:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_C3Gnory\"\nmsgid \"What a new opportunity! I don’t care about dwarves anymore.\"\nmsgstr \"¡Qué nueva oportunidad! Ya no me importan los enanos.\"\n\n#. Key:\t071AC5EE4AC65F5BE3CB61B64DE9E7FE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3GolemMaker.C3GolemMaker:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter3/C3GolemMaker.C3GolemMaker:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_C3GolemMaker\"\nmsgid \"I have to admit Ruin will win in the end.\"\nmsgstr \"Tengo que admitir que Ruin ganará al final.\"\n\n#. Key:\t18398E3A4C6E72AAE25F24A14596ECD8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3GolemMaker.C3GolemMaker:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter3/C3GolemMaker.C3GolemMaker:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_C3GolemMaker\"\nmsgid \"I fought Ruin for hundreds of years.\"\nmsgstr \"Luché contra Ruin durante cientos de años.\"\n\n#. Key:\t7800D3B64054BCE4A89E8E8E6265776B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3GolemMaker.C3GolemMaker:DlgNode_Speech_117.Text\n#: /Game/SO/Dialogues/Chapter3/C3GolemMaker.C3GolemMaker:DlgNode_Speech_117.Text\nmsgctxt \"Dialogue_C3GolemMaker\"\nmsgid \"I have a bad feeling about this all...\"\nmsgstr \"Tengo un mal presentimiento sobre todo esto...\"\n\n#. Key:\t334B64FA460A74FD99B4F3B9E4BE9E5A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3KoboldChef.C3KoboldChef:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter3/C3KoboldChef.C3KoboldChef:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_C3KoboldChef\"\nmsgid \"So it will be ready anytime now.\"\nmsgstr \"Entonces estará listo en cualquier momento.\"\n\n#. Key:\t5B8874F14160F55182A93EBCF5680173\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3KoboldChef.C3KoboldChef:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter3/C3KoboldChef.C3KoboldChef:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_C3KoboldChef\"\nmsgid \"According to the recipe I need to swirl the ingredients until the end of the World.\"\nmsgstr \"Según la receta, necesito girar los ingredientes hasta el fin del mundo.\"\n\n#. Key:\t7DB6ED344E211B7A028C27BFB72750B1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3KoboldChef.C3KoboldChef:DlgNode_Speech_33.Text\n#: /Game/SO/Dialogues/Chapter3/C3KoboldChef.C3KoboldChef:DlgNode_Speech_33.Text\nmsgctxt \"Dialogue_C3KoboldChef\"\nmsgid \"This is a special soup.\"\nmsgstr \"Esta es una sopa especial.\"\n\n#. Key:\t7D583DB14783DCF7EEE294920F9A1D61\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Lory.C3Lory:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Chapter3/C3Lory.C3Lory:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_C3Lory\"\nmsgid \"Without paying a single gold coin. How sad.\"\nmsgstr \"Sin pagar ni una sola moneda de oro. Qué triste.\"\n\n#. Key:\t8A26C9B24B810A94FED159B0D69D70D6\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Lory.C3Lory:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter3/C3Lory.C3Lory:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_C3Lory\"\nmsgid \"Hi, my dear Ball!\"\nmsgstr \"¡Hola mi querido Pelota!\"\n\n#. Key:\t8CF637DC4D66B9BFBE098DA3EA434F27\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Lory.C3Lory:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/Chapter3/C3Lory.C3Lory:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_C3Lory\"\nmsgid \"Unfortunately I can't give you anything in return.\"\nmsgstr \"Lamentablemente, no puedo darte nada a cambio.\"\n\n#. Key:\t90A13FAC4AA90E98DBEFFA9BB8DEDE80\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Lory.C3Lory:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Chapter3/C3Lory.C3Lory:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_C3Lory\"\nmsgid \"Oh, thank you! Books always matter.\"\nmsgstr \"¡Oh gracias! Los libros siempre importan.\"\n\n#. Key:\t9C6E843645F86F1E39E6458952C7F283\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Lory.C3Lory:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Chapter3/C3Lory.C3Lory:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_C3Lory\"\nmsgid \"I hope I can open a new shop in the Human Realm.\"\nmsgstr \"Espero poder abrir una nueva tienda en el Reino Humano.\"\n\n#. Key:\tAE354F2C458C144C2825028174F91CCE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Lory.C3Lory:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Chapter3/C3Lory.C3Lory:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_C3Lory\"\nmsgid \"I don't know if it still matters but I have these books for you.\"\nmsgstr \"No sé si todavía importa, pero tengo estos libros para ti.\"\n\n#. Key:\tB5BCB95E43DB3854273F6AAA4067FC55\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Lory.C3Lory:DlgNode_Speech_42.Text\n#: /Game/SO/Dialogues/Chapter3/C3Lory.C3Lory:DlgNode_Speech_42.Text\nmsgctxt \"Dialogue_C3Lory\"\nmsgid \"Unfortunately I have nothing at the store right now. Ha-ha...\"\nmsgstr \"Lamentablemente no tengo nada en la tienda ahora mismo. Jaja...\"\n\n#. Key:\tC0E84ACD40CB002E0C30A289E0554EE9\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Lory.C3Lory:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/Chapter3/C3Lory.C3Lory:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_C3Lory\"\nmsgid \"No problem.\"\nmsgstr \"No hay problema.\"\n\n#. Key:\tFEFF93C84CC75D277EC221AD22338A75\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Lory.C3Lory:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter3/C3Lory.C3Lory:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_C3Lory\"\nmsgid \"Ruin took all my wares.\"\nmsgstr \"Ruin se llevó todas mis mercancías.\"\n\n#. Key:\t090F12534A0096B8D4D7D9A5CDC9B3B5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_25.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_25.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Well I guess you don’t have many customer.\"\nmsgstr \"Bueno, supongo que no tienes muchos clientes.\"\n\n#. Key:\t10A1CF314EC02954FF38F1989C61DEE9\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"That’s only one man! I need three!\"\nmsgstr \"¡Ese es solo un hombre! Necesito tres!\"\n\n#. Key:\t127DE2E049C91112F814C69348954F99\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_7.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_7.Children(1).Children.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Buy name\"\nmsgstr \"Comprar nombre\"\n\n#. Key:\t1AF2DDE74542524EEF19CA9567CFBDAF\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_58.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_58.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"{name}? It still sounds a bit weird, but I think I might like it.\"\nmsgstr \"¿{nombre}? Todavía suena un poco raro, pero creo que me gustará.\"\n\n#. Key:\t1C411E31405F157B2465229ECE66F4E0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_31.Children(2).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_31.Children(2).Children.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Wanderer\"\nmsgstr \"Errante\"\n\n#. Key:\t1ED747BD43E40D4096809696951517EE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"A special offer for ya! Give me three Blue Gems and I’ll give ya the key!\"\nmsgstr \"¡Una oferta especial para ti! ¡Dame tres Gemas Azules y te daré la llave!\"\n\n#. Key:\t20B146B94D2E2FCE5E0C48BC64F7A1D6\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_19.Text\n#. Key:\t41E21D044B53E16C1BA8D7B720D84B50\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_36.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_36.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Sure man!\"\nmsgstr \"¡Claro hombre!\"\n\n#. Key:\t2BDF52EF43CA5FBB145EC1BA0014FC27\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_7.Children(3).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_7.Children(3).Children.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Who are you?\"\nmsgstr \"¿Quién eres?\"\n\n#. Key:\t2DF772F14AAA9780F4D9E397DE723665\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_32.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_32.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Fearsome! At least for what you will destroy.\"\nmsgstr \"¡Temible! Al menos por lo que destruirás.\"\n\n#. Key:\t312F26294ECE4F618D88BE84DE7A2F9A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_31.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_31.Children(1).Children.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Destroyer\"\nmsgstr \"Destructor\"\n\n#. Key:\t328C9911427AA19B40B297ACC9D16447\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_31.Children(3).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_31.Children(3).Children.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Don't buy\"\nmsgstr \"No comprar\"\n\n#. Key:\t32D3F53746DD2801BC1B04AF1C1753DD\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Don’t turn around I’m talking to ya big guy! Down here on the wood!\"\nmsgstr \"¡No te des la vuelta, te estoy hablando grandullón! ¡Aquí abajo en la madera!\"\n\n#. Key:\t576A3CE049331518C8D1F196E6CC382C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Back on topic: will ya buy something?\"\nmsgstr \"Volviendo al tema: ¿quieres comprar algo?\"\n\n#. Key:\t5C1E07DF4B2D135102D6B09D3A04A726\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"C’mon man! Don’t just stand there tell me what ya want!\"\nmsgstr \"¡Vamos hombre! ¡No te quedes ahí parado, dime qué quieres!\"\n\n#. Key:\t62AA5DD54A8447F7A277B194B05FB74D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_23.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_23.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"What’s wrong with ya man?\"\nmsgstr \"¿Qué te pasa hombre?\"\n\n#. Key:\t6E13F5544C66EDB0CFE764A0F52269E1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_27.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_27.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"You know transporting breadcrumbs, marching onto various directions, the usual things.\"\nmsgstr \"Ya sabes, transportar migas de pan, marchar en varias direcciones, cosas tipicas.\"\n\n#. Key:\t6F3C17894E694FC6215871B167087908\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_24.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_24.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"I’m Merch Ant doin’ Microtransactions. I’ve just told ya.\"\nmsgstr \"Soy Merch Ant haciendo Micro transacciones. Ya te lo dije.\"\n\n#. Key:\t7169B2FA40F5F5F328D2A6B9D53D58C8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_7.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_7.Children(0).Children.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Trade\"\nmsgstr \"Comerciar\"\n\n#. Key:\t7B41C105431C54F2FDDEA6AA9A0E1C1A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Er... so who are you and what are you doing here?\"\nmsgstr \"Er... entonces, ¿quién eres y qué haces aquí?\"\n\n#. Key:\t8718A8F54D5722F666D83F8067476622\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"There is an iron door which blocks the path to the tower. Do you have something which opens it?\"\nmsgstr \"Hay una puerta de hierro que bloquea el camino a la torre. ¿Tienes algo que lo abre?\"\n\n#. Key:\t889B39EC4BC170A2BF493380947116A7\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Sure man! Microtransactions always work!\"\nmsgstr \"¡Claro hombre! ¡Las micro transacciones siempre funcionan!\"\n\n#. Key:\t9157AE9644A4A3B2C97F7482932160D2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"No man, we agreed on three!\"\nmsgstr \"¡No tío, Nos pusimos de acuerdo en tres!\"\n\n#. Key:\t9283F6B1447C6992FE355289F3337472\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_7.Children(2).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_7.Children(2).Children.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Gate\"\nmsgstr \"Puerta\"\n\n#. Key:\t99C44AA849A384C7941D3DAE1D6A3EFF\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Here is your Gem!\"\nmsgstr \"Aquí está tu Gema!\"\n\n#. Key:\t9CA7941F42ABFAE5660895AF886CD62C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_31.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_31.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Sure man! I have some really cool ones for sale!\"\nmsgstr \"¡Claro hombre! ¡Tengo algunos muy geniales a la venta!\"\n\n#. Key:\tA3C6B03E404B1C039EF1C98C8E28AE22\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Show me what you've got for sale!\"\nmsgstr \"¡Muéstrame lo que tienes a la venta!\"\n\n#. Key:\tABE279924E0641DA18E9708F35F4500A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_29.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_29.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"I’ve got to go.\"\nmsgstr \"Tengo que ir.\"\n\n#. Key:\tAF1FECDB402777D850B819B934DF851D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_34.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_34.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Ah, never mind, here you go!\"\nmsgstr \"Ah, no importa, ¡aquí tienes!\"\n\n#. Key:\tB19FA067432CE0273A3652AA9A32F2DF\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Don’t be surprised!\"\nmsgstr \"¡No te sorprendas!\"\n\n#. Key:\tB5F8E17E4712A37EF1C227AA7E99DBC8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Aren’t two Gems enough for you?\"\nmsgstr \"¿Dos gemas no son suficientes?\"\n\n#. Key:\tBC5DEE9E4D39238451D1A2B9F8B20815\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_26.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_26.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Okey, okey! I have to admit I also do some regular ant work from time to time.\"\nmsgstr \"¡Okey, okey! Tengo que admitir que también hago trabajo típico de hormigas de vez en cuando.\"\n\n#. Key:\tBD7096344553E098E4A29787E1386B4A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Are you sure the key works?\"\nmsgstr \"¿Estás seguro de que la llave funciona?\"\n\n#. Key:\tC6A384624B53D808D62CB885A6573150\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Was nice to deal with ya!\"\nmsgstr \"¡Fue agradable comerciar contigo!\"\n\n#. Key:\tC737154043396F726CF6B2814991B38D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_35.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_35.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"I've changed my mind. I'm fine with my current name.\"\nmsgstr \"He cambiado de opinion. Estoy bien con mi nombre actual.\"\n\n#. Key:\tC94F33504E68364DE1BAA48FC0CA85E5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_7.Children(5).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_7.Children(5).Children.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Leave\"\nmsgstr \"Salir\"\n\n#. Key:\tCDA5A0164F5FDD87D0F4C0B10A5ED5DA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"I did my part. Give me the key!\"\nmsgstr \"Hice mi parte ¡Dame la llave!\"\n\n#. Key:\tD1B1D33742EAA6A9BCDC42B5EA72EB59\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_31.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_31.Children(0).Children.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Saviour\"\nmsgstr \"Salvador\"\n\n#. Key:\tD1E444764EDA1457DD7427A0EA75C65F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_7.Children(4).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_7.Children(4).Children.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Blue Gem\"\nmsgstr \"Gema Azul\"\n\n#. Key:\tD65AD8854E1A5BC2D37C208357BACDE3\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Due to my size!\"\nmsgstr \"¡Debido a mi tamaño!\"\n\n#. Key:\tDDEB5C4B4A180E85B1D711815B4D32F3\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Can I buy a name from you?\"\nmsgstr \"¿Puedo comprarte un nombre?\"\n\n#. Key:\tDE3F40384473EC97950CDDB43AFE439E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Easy man! Here ya go!\"\nmsgstr \"¡Hombre! ¡Aquí tienes!\"\n\n#. Key:\tDEED1AF94E4BC154ED98A8B951AF0673\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Hey again!\"\nmsgstr \"¡Hola de nuevo!\"\n\n#. Key:\tE2C88DA74DA8B5935E15CC9FD337C307\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_39.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_39.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Come on man! You can't just wander around!\"\nmsgstr \"¡Vamos hombre! ¡No puedes simplemente pasear!\"\n\n#. Key:\tEA08DE334C7D8631989D159FB841367D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_30.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_30.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"See ya man!\"\nmsgstr \"¡Nos vemos hombre!\"\n\n#. Key:\tEAB8C1DE4B07AD7EAF0A4B819E4522C6\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Hey there!\"\nmsgstr \"¡Hola!\"\n\n#. Key:\tF780C72E4DDD9D9189C900836D4F7DBD\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"I’m Merch Ant, I deal with microtransactions.\"\nmsgstr \"Soy Merch Ant, trato con micro transacciones.\"\n\n#. Key:\tFED676B745409B7095EBB2994E581817\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_57.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_57.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"That's cool man. Though I wonder who will you save?\"\nmsgstr \"Eso es genial hombre. ¿Aunque me pregunto a quién salvarás?\"\n\n#. Key:\t04F1EF4B4AFDE5759A25A1A4922E9EA8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"Yet they could do nothing.\"\nmsgstr \"Sin embargo, no pudieron hacer nada.\"\n\n#. Key:\t05E7A2224316FEED1A2CEB8AEFC46B41\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"We can’t let everyone die here.\"\nmsgstr \"No podemos dejar que todos mueran aquí.\"\n\n#. Key:\t078A48C347E2B23E79C495BA42BC7B6D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_25.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_25.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"We’ll have time to find a cure.\"\nmsgstr \"Tendremos tiempo para encontrar una cura.\"\n\n#. Key:\t0A857169478EC6929EFCA3B390C394DA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"Prepare for your last travel in the Ruined Realm. Head to the north from where the wind is blowing!\"\nmsgstr \"Prepárate para tu último viaje en el Reino Arruinado. ¡Dirígete hacia el norte desde donde sopla el viento!\"\n\n#. Key:\t1D8B6C81428A6D9F4C29AE9AD26206F2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_29.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_29.Children(1).Children.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"Can't leave them\"\nmsgstr \"No puedo dejarlos\"\n\n#. Key:\t217F39F14762862B6EA18484EA74E987\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_37.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_37.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"I wish you better luck this time!\"\nmsgstr \"¡Te deseo más suerte esta vez!\"\n\n#. Key:\t22E17F2F4CFDD0CEB67AB0A91D872B3F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_4.Children(2).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_4.Children(2).Children.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"Not my problem\"\nmsgstr \"No es mi problema\"\n\n#. Key:\t2685CE674BB3B11FD3CB3AA2460CE60A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"There is nothing we can do for this World.\"\nmsgstr \"No hay nada que podamos hacer por este Mundo.\"\n\n#. Key:\t26A2075F407FF43E1AF8B6B38E9C4AEE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"Farewell!\"\nmsgstr \"¡Adios!\"\n\n#. Key:\t2F7D7C46418E8E049493839A26DBB10E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"I’m ready to sacrifice myself but I feel sorrow for this world.\"\nmsgstr \"Estoy listo para sacrificarme, pero siento pena por este mundo.\"\n\n#. Key:\t39172C7641A5973A4B5D8480EBDD2589\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_34.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_34.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"Back already?\"\nmsgstr \"¿Ya estas de vuelta?\"\n\n#. Key:\t3D21436E48DA0DF9C3ACA3B11001B17C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"Yet, we need to save those we can.\"\nmsgstr \"Sin embargo, necesitamos salvar a los que podamos.\"\n\n#. Key:\t43B780AA4934FBE35679BFB3C1C92D56\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"Farewell Wanderer!\"\nmsgstr \"¡Adiós Errante!\"\n\n#. Key:\t4AD4171F4A1832148034BAA736FC587E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"Head to the north from where the wind is blowing!\"\nmsgstr \"¡Dirígete hacia el norte desde donde sopla el viento!\"\n\n#. Key:\t4E65707F497B4B35E873138DDBF7B879\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"I will go home and you will solve your problems on your own.\"\nmsgstr \"Iré a casa y resolverás tus problemas por tu propia cuenta.\"\n\n#. Key:\t4EDA1AEF471537F758DD0491A7140073\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"This is none of my business.\"\nmsgstr \"Esto no es asunto mío.\"\n\n#. Key:\t58246AA446D982E55E53EAB34FFF6A81\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_34.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_34.Children(1).Children.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"Leave\"\nmsgstr \"Salir\"\n\n#. Key:\t67CB3C99468EEA39C4C18C8B0C28AFEA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_26.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_26.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"You? You mean the Wizard Council?\"\nmsgstr \"¿Tú? ¿Te refieres al Concilio de los Magos?\"\n\n#. Key:\t743DD4C048F8CD08A49805975183B54D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"I’m sorry it ends like this, Wanderer.\"\nmsgstr \"Lamento que termine así, Errante.\"\n\n#. Key:\t7AB88DE549E213B71759699AD51CFD4C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"I’m really proud of you little spirit. This wasn’t an easy decision for me either.\"\nmsgstr \"Estoy realmente orgulloso de ti pequeño espíritu. Esta tampoco fue una decisión fácil para mí.\"\n\n#. Key:\t7DCF30E74F8C0F29DA4E668CE3435E89\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"Wizard can’t hear us here, we can talk freely.\"\nmsgstr \"Mago no puede escucharnos aquí, podemos hablar libremente.\"\n\n#. Key:\t8177A07D41AE7778BB4839AED3FEDACF\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_23.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_23.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"Do you know what you are risking?\"\nmsgstr \"¿Sabes lo que estás arriesgando?\"\n\n#. Key:\t876B4752465406828E27A88C282EA5CD\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"From here I can teleport you close to the place where the Wizard will be able to get you out.\"\nmsgstr \"Desde aquí puedo teletransportarte cerca del lugar donde el Mago podrá sacarte.\"\n\n#. Key:\t9255CAD841A0C5B4DF3F4D8C5F5516B1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"So many great things will perish. So many...\"\nmsgstr \"Tantas cosas increíbles perecerán. Tantos...\"\n\n#. Key:\t95EDE8FB4CEC490381EBD990C7277009\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_38.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_38.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"Take your time!\"\nmsgstr \"¡Tome su tiempo!\"\n\n#. Key:\t9D46888D43C665A29506BF9CBB62F81D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_35.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_35.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"Let me try again!\"\nmsgstr \"¡Déjame intentar de nuevo!\"\n\n#. Key:\tA1CF649542AAE3D8945327B9502E2E78\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_29.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_29.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"What chance do the humans have?\"\nmsgstr \"¿Qué posibilidades tienen los humanos?\"\n\n#. Key:\tA60B94F64A0D02EA0DA9419741ED84F4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_36.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_36.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"I just need some rest.\"\nmsgstr \"Solo necesito descansar un poco.\"\n\n#. Key:\tA651056C4D344D685FEB53B2C3795966\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_34.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_34.Children(0).Children.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"Retry\"\nmsgstr \"Reintentar\"\n\n#. Key:\tAAE7046349DBE5359097179A42FDA255\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_33.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_33.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"This one was enough.\"\nmsgstr \"Este fue suficiente.\"\n\n#. Key:\tB17D67194997EFAEF6B8678DB05894FD\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"Let’s get them out first and face Ruin after.\"\nmsgstr \"Vamos a sacarlos primero y enfrentarnos a Ruin después.\"\n\n#. Key:\tB4E31022471B52056F7B5AA3BB322700\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"How can I get to the Wizard’s tower?\"\nmsgstr \"¿Cómo puedo llegar a la torre del Mago?\"\n\n#. Key:\tB6C99FC54E2A347994473EBF52B57EBD\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_4.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_4.Children(1).Children.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"Raven’s plan\"\nmsgstr \"El plan de Cuervo\"\n\n#. Key:\tB985955E4FC6D81FBD38D79ADE68BF1F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_4.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_4.Children(0).Children.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"Separate Worlds\"\nmsgstr \"Mundos Separados\"\n\n#. Key:\tC4BABAED4C790EDDF6AAF7A0D4CFA79B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_27.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_27.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"When Ruin started in the Runic Realm they had hundreds of Scientists who studied the force which made Ruin.\"\nmsgstr \"Cuando Ruin comenzó en el Reino Rúnico, tenían cientos de científicos que estudiaron la fuerza que hizo a Ruin.\"\n\n#. Key:\tCB779F524992B29781C4778ED6E224A7\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_30.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_30.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"I just can’t leave them to die here...\"\nmsgstr \"No puedo dejarlos morir aquí...\"\n\n#. Key:\tCDA7A09249E96A52B2FA3CA471D6C4B3\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"This is the end of the path where we last meet.\"\nmsgstr \"Este es el final del camino donde nos encontramos por última vez.\"\n\n#. Key:\tCF238FAA4941848AF7071A866B75B6EC\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"You are right. The only way to stop Ruin is to lock the Ruined Realm forever.\"\nmsgstr \"Tienes razón. La única forma de detener a Ruin es bloquear el Reino Arruinado para siempre.\"\n\n#. Key:\tD1F3B7324351B25E8C55679BAC3BF1E0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"Have you made your decision?\"\nmsgstr \"¿Has tomado tu decisión?\"\n\n#. Key:\tE164446B4944B4CAC8E5C1BF82A722A2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_24.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_24.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"If you bring infected people into the Human Realm Ruin will consume them.\"\nmsgstr \"Si Traes a las personas infectadas al Reino Humano, Ruin las consumirán.\"\n\n#. Key:\tE39531DE4350D6D86DF469839F1906E7\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_31.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_31.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"It’s your decision, Wanderer. I understand.\"\nmsgstr \"Es tu decisión, Errante. Entiendo.\"\n\n#. Key:\tE46912D04BE67D3E2B0794BB632AEE98\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_32.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_32.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"I’ll stay here. I won’t be able to watch another World dying...\"\nmsgstr \"Me quedaré aquí. No podré ver morir a otro mundo...\"\n\n#. Key:\tF70B765F44DB17E1C6978D9D8652C911\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"Hello, little Wanderer!\"\nmsgstr \"¡Hola, pequeño Errante!\"\n\n#. Key:\tFE709EDF4482B6FA7408DE99D95E8577\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_29.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_29.Children(0).Children.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"You are right\"\nmsgstr \"Tienes razón\"\n\n#. Key:\tFE77F7964851F202F5C91396A4C7228E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"I’ll take you to the place where you can leave this Realm.\"\nmsgstr \"Te llevaré al lugar donde puedes dejar este Reino.\"\n\n#. Key:\t0B886754483D1C215FBEF5B7D19AF6A6\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"I know you have summoned a Spirit of the Unknown world. You were a fool to think you can get away with this.\"\nmsgstr \"Sé que has convocado a un espíritu del mundo desconocido. Eres un necio al pensar que puedes salirte con la tuya.\"\n\n#. Key:\t0BDF59D34A9E53B7FD5FD18F8E46F72F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"Argh! All right, here you go...\"\nmsgstr \"Argh! Muy bien, aquí tienes...\"\n\n#. Key:\t2A6837CA471604FCDD180E85BD23D676\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"Krrr... Raven gives you magic which will make you fly like a Raven.\"\nmsgstr \"Krrr... Cuervo te da magia que te hará volar como un cuervo.\"\n\n#. Key:\t2D8209F74AC3C9E042717A9FB108C051\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"Come on, go and try it!\"\nmsgstr \"¡Vamos, ve y pruébalo!\"\n\n#. Key:\t39B1763740E9BB9B495A7997920A3401\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_12.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_12.Children(0).Children.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"How?\"\nmsgstr \"¿Cómo?\"\n\n#. Key:\t3AE553D14FFB88C0518679B86691D508\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"Call your master little spirit, I have words with him.\"\nmsgstr \"Llama a tu maestro pequeño espíritu, tengo palabras con él.\"\n\n#. Key:\t3E02111D40F21C2C8C13F08729B4CDBC\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"I don’t know about any rule forbidding that...\"\nmsgstr \"No conozco ninguna regla que prohíba que...\"\n\n#. Key:\t453610F144D8CEB42138F0BB35B9692A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"Wait Scholar! Please give me a few more days!\"\nmsgstr \"Espera Erudito! ¡Por favor, dame unos días más!\"\n\n#. Key:\t4F0C40114C4DD1B345CF909E94F99D60\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"Why should I ask that?\"\nmsgstr \"¿Por qué debería preguntar eso?\"\n\n#. Key:\t56F0D93740AB7555FF9370879D774842\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"I have no doubt how the Council will react.\"\nmsgstr \"No tengo dudas de cómo reaccionará el Concilio.\"\n\n#. Key:\t60D3A9DA420ECD7DBF490BA233EA5C61\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"Because you would love to know how you can get out of here.\"\nmsgstr \"Porque te encantaría saber cómo puedes salir de aquí.\"\n\n#. Key:\t6125A956446F64BD91E1F5A282AC146D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"Don’t worry! I know your daughter is trapped in the Unknown and my research confirms there is a chance you can bring her back.\\r\\nI’ll help you bring the missing artefacts back.\"\nmsgstr \"¡No te preocupes! Sé que tu hija está atrapada en lo Desconocido y mi investigación confirma que existe la posibilidad de que puedas traerla de vuelta.\\r\\nTe ayudaré a recuperar los artefactos perdidos.\"\n\n#. Key:\t6B7478444FBC694480D442BB90F70B27\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"What do you want?\"\nmsgstr \"¿Qué quieres?\"\n\n#. Key:\t72D7F64D4051F9BF362B9B97FD30DB65\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_12.Children(2).Children.Text\n#. Key:\tF62125FB48F982D2A3D4FE9621810F64\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_12.Children(2).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"What?\"\nmsgstr \"¿Qué?\"\n\n#. Key:\t810BD4154FA6BC7F857F9CB14EDC6A1D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"Er... thanks!\"\nmsgstr \"Er... ¡gracias!\"\n\n#. Key:\t8F439E124100E004BCCD4AA04F17CB3F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"How will we get out of here?\"\nmsgstr \"¿Cómo saldremos de aquí?\"\n\n#. Key:\t9D31A0084CBBA499BA4E3BADB42E6E36\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"Rule? What rule should be needed for something which was thought to be impossible?\"\nmsgstr \"¿Regla? ¿Qué regla debería ser necesaria para algo que se creía imposible?\"\n\n#. Key:\t9F52551E46588D4F12CD7C8B63701FDE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_12.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_12.Children(1).Children.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"Why?\"\nmsgstr \"¿Por qué?\"\n\n#. Key:\tAAC96E3C4D4D303C9E692390612A7215\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"Ask how we will get out of here!\"\nmsgstr \"¡Pregunta cómo saldremos de aquí!\"\n\n#. Key:\tC0808C6545D02F43CB37A2AFB79EEC1F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"Actually it’s not that good but still better than nothing.\"\nmsgstr \"En realidad no es tan bueno, pero aún mejor que nada.\"\n\n#. Key:\tC19759F44A5A2AE21A04EBAF2A47E2D3\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"Take this!\"\nmsgstr \"¡Toma esto!\"\n\n#. Key:\tC8CEB3844A6C958FF42C74AA81D4A90F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"Finally, Raven found you!\"\nmsgstr \"¡Finalmente, Cuervo te encontró!\"\n\n#. Key:\tCF6DEF4D4F6F664CF24435AF248CE452\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"Raven and his fellow Ball on a quest again!\"\nmsgstr \"¡Cuervo y su compañero Pelota en una misión de nuevo!\"\n\n#. Key:\tE52C31F241BCD21378696EB8761C0654\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"Let the masters talk in private and discuss how we will get out of here!\"\nmsgstr \"¡Deja que los maestros hablen en privado y discutan cómo saldremos de aquí!\"\n\n#. Key:\t00ED8B314FC2DA3901823F92635D41D1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_26.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_26.Children(0).Children.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"You’ll be all dead\"\nmsgstr \"Estaréis todos muertos\"\n\n#. Key:\t23BA5AA446B44D107B9F3994ADDE1C43\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_22.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_22.Children(1).Children.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Save them!\"\nmsgstr \"¡Sálvalos!\"\n\n#. Key:\t42395E7B4B735458E30557B9544073E3\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_8.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_8.Children(1).Children.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Leave\"\nmsgstr \"Salir\"\n\n#. Key:\t43A5BAA8417D3291E502AD9500873B9E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Rumours have been spread of Ruin and the people are scared. They demand the Wizard Council to separate the Human Realm from the Ruined Realm.\"\nmsgstr \"Se han difundido rumores sobre Ruin y la gente está asustada. Exigen al Concilio de los Magos que separe el Reino Humano del Reino Arruinado.\"\n\n#. Key:\t4FAAEE6240849C416541EDA8AB8083C8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_30.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_30.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Good luck, Raven!\"\nmsgstr \"¡Buena suerte, Cuervo!\"\n\n#. Key:\t559673484F3C66AADE37E787BA35824A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_33.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_33.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Only a fool would bring Ruin to his own World.\"\nmsgstr \"Solo un necio traería Ruin a su propio Mundo.\"\n\n#. Key:\t568124F448BE3AF41123A0B7BB158A53\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Krrrr! Raven and you make a really good team.\"\nmsgstr \"Krrrr! Cuervo y tú haces un buen equipo.\"\n\n#. Key:\t5853B8654DBD91894792DE803DE87271\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_27.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_27.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"You bring back the artefacts to rescue Lillian.\"\nmsgstr \"Traes los artefactos para rescatar a Lillian.\"\n\n#. Key:\t5D71DA8F4134A1AA206F15B7587AA188\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_15.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_15.Children(0).Children.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Break in?\"\nmsgstr \"¿Irrumpir?\"\n\n#. Key:\t6234A9A34854A37E0CA56987FDE81F5A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_26.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_26.Children(1).Children.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"You are right\"\nmsgstr \"Tienes razón\"\n\n#. Key:\t6B07C6F34DF51DFA23A4278FCBECF303\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"What it will do?\"\nmsgstr \"¿Qué hará?\"\n\n#. Key:\t6E5A51A34AB81094924512B92F25F41C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_32.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_32.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"You are trying to rescue a bunch of mad people so that they can live a few more years with the cost of destroying one more Realm.\"\nmsgstr \"Estás tratando de rescatar a un grupo de locos para que puedan vivir unos años más con el precio de destruir otro Reino.\"\n\n#. Key:\t70514624400617999FA05FAFAE67D60F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"What happened in the Human Realm?\"\nmsgstr \"¿Qué pasó en el Reino Humano?\"\n\n#. Key:\t71C42D6445782897EAF303BFA2C5C260\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"What will you do? What’s your part in this?\"\nmsgstr \"¿Qué harás? ¿Cuál es tu parte en esto?\"\n\n#. Key:\t728B75824B28856156D207B71017C714\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Things are changing in the Human Realm and Raven has many things to do.\"\nmsgstr \"Las cosas están cambiando en el Reino Humano y Cuervo tiene muchas cosas que hacer.\"\n\n#. Key:\t7826765F45BE76393F3636B79BBC24C0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_24.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_24.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"You are right. We need to save them. What’s the plan?\"\nmsgstr \"Tienes razón. Necesitamos salvarlos. ¿Cuál es el plan?\"\n\n#. Key:\t866DA22D46D855A200BB7F9E71788367\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_22.Children(0).Children.Text\n#. Key:\tBA0DEBA04BF5C604A2B760B8275E2983\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_23.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_22.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_23.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Is that safe?\"\nmsgstr \"¿Eso es seguro?\"\n\n#. Key:\t86E69EA04F489DC54B48BEBE8B3762BF\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_1.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_1.Children(0).Children.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Agree\"\nmsgstr \"Estoy de acuerdo\"\n\n#. Key:\t8D543992469624098751EAA474848F8C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Soon the Ruined Realm will be over. We cannot save it.\"\nmsgstr \"Pronto el Reino Arruinado habrá terminado. No podemos salvarlo.\"\n\n#. Key:\t943679734061A00F4CC99A8BC31078EA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Wizard won’t activate the device for them but some of them are fools enough to try it anyway.\"\nmsgstr \"Mago no activará el aparato para ellos, pero algunos de ellos son lo suficientemente necios como para intentarlo de todos modos.\"\n\n#. Key:\t978AEC8B45AC7E6ED3E814AB849CF96A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"So, what now?\"\nmsgstr \"¿Y ahora qué?\"\n\n#. Key:\t99250A3F4973EBFB5A20A192DF8976AA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"With every day more and more people join their ranks.\"\nmsgstr \"Con cada día más y más personas se unen a sus filas.\"\n\n#. Key:\t9D81AC2C4900D6DDA6B17CAD7168020C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_31.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_31.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Farewell, compeer!\"\nmsgstr \"¡Adiós, compañero!\"\n\n#. Key:\tA5F24B3747918DB1E38CB98208FD6B1B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_35.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_35.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Or maybe you are wrong.\"\nmsgstr \"O tal vez te equivocas.\"\n\n#. Key:\tB0ECBFAF4E34AEDE88F1B7B7C7F7CC5B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_8.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_8.Children(0).Children.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"What happened?\"\nmsgstr \"¿Que pasó?\"\n\n#. Key:\tB1D891BF48298C5D4CF7D8957EACDD1B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Raven will gather as many survivors as Raven can.\"\nmsgstr \"Cuervo reunirá a tantos supervivientes como Cuervo pueda.\"\n\n#. Key:\tB6CF3E424BAEA6EE368D508EEFDD5FF1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_36.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_36.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Farewell compeer! Raven will be on a quest on Raven’s own!\"\nmsgstr \"¡Adiós compañero! ¡Cuervo estará en una misión por su cuenta!\"\n\n#. Key:\tB87509FF4D29C2B3D25CCEB192090963\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"What happens if they break in?\"\nmsgstr \"¿Qué pasa si entran?\"\n\n#. Key:\tB89F014644B8D3E1754B1B8C796D5858\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_1.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_1.Children(1).Children.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Disagree\"\nmsgstr \"No estoy de acuerdo\"\n\n#. Key:\tBA14AAD54C3D4F7CF18F5D8560A62637\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Nothing good...\"\nmsgstr \"Nada bueno...\"\n\n#. Key:\tC2E50DCB4E1171342DD931910E42549E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_37.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_37.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Farewell!\"\nmsgstr \"¡Adios!\"\n\n#. Key:\tC3B19DAF4C0B491D9236CD99FD7DD603\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Except when you kill me with a laser beam.\"\nmsgstr \"Excepto cuando me matas con un rayo láser.\"\n\n#. Key:\tCBDDFBD14121FE1758B360A1775F2169\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Farewell compeer until you meet Raven again!\"\nmsgstr \"¡Adiós compañero hasta que te encuentres con Cuervo otra vez!\"\n\n#. Key:\tCD19E0924BB1080025ABA19860F578CE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Somehow they know about the device the Wizard created. They surrounded the Wizard’s tower. Some even tried to break in.\"\nmsgstr \"De alguna manera saben sobre el aparato que creó el Mago. Rodearon la torre del Mago. Algunos incluso intentaron entrar.\"\n\n#. Key:\tD54470AA424038F96824FC805AE3F0EE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_25.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_25.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Krrr! For them it’s much safer than staying here when the World is over.\"\nmsgstr \"Krrr! Para ellos es mucho más seguro que quedarse aquí cuando el Mundo se acaba.\"\n\n#. Key:\tD99400D94457B6779DE59DB94FDBF9D1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"We have really short time to act.\"\nmsgstr \"Tenemos muy poco tiempo para actuar.\"\n\n#. Key:\tDAEF711B41EC4EF72FC271B5AD98A238\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_26.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_26.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"There are hundreds of survivors. Races that don’t even exist anywhere else! Who are we if we don’t even try to save them?\"\nmsgstr \"Hay cientos de sobrevivientes. ¡Razas que ni siquiera existen en ningún otro lugar! ¿Quiénes somos si ni siquiera intentamos salvarlos?\"\n\n#. Key:\tDF872D134C82DFDD3F55F4A6FFF59673\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Except...\"\nmsgstr \"Excepto...\"\n\n#. Key:\tE64B8C0048D2D3357B74CD8D7C1B5407\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_34.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_34.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"You sound like that Monk, don’t you? Maybe you are right.\"\nmsgstr \"Suenas como ese Monje, ¿no? Quizás tienes razón.\"\n\n#. Key:\tEA01FB8248A5F30CF9D95AA292D5466A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"No problem.\"\nmsgstr \"No hay problema.\"\n\n#. Key:\tF1193DA54FBB289383D56F952818E67E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Raven’s master decided we need to gather every survivor and take them into the Human Realm.\"\nmsgstr \"El maestro de Cuervo decidió que necesitamos reunir a todos los sobrevivientes y llevarlos al Reino Humano.\"\n\n#. Key:\tF19792CF477CD543AC05FCBEDA3EA88C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_15.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_15.Children(1).Children.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"To act?\"\nmsgstr \"¿Actuar?\"\n\n#. Key:\tF606FBDF4B7F3DFF9A55BE9CDB186CAC\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Farewell then!\"\nmsgstr \"¡Adiós entonces!\"\n\n#. Key:\tF8FA36BF4E3A4C028FBAF0A2AA531AA4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"You need to go on alone.\"\nmsgstr \"Tienes que seguir solo.\"\n\n#. Key:\tFA02BBA74B601254CDA90A9300AD312F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_29.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_29.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"If all goes well you will meet Raven on the other side.\"\nmsgstr \"Si todo va bien, te encontrarás con Cuervo al otro lado.\"\n\n#. Key:\tFA630952402B081C2D449DA3C091F33E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Yes, we did well. Thanks for the help!\"\nmsgstr \"Sí, lo hicimos bien. ¡Gracias por la ayuda!\"\n\n#. Key:\t63338A0644CC3AE62BCC10B56EAAD524\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3SewerCreature.C3SewerCreature:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter3/C3SewerCreature.C3SewerCreature:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_C3SewerCreature\"\nmsgid \"Fear not, everything will be alright!\"\nmsgstr \"¡No temas, todo estará bien!\"\n\n#. Key:\t2C1EC209404316CE23DC67B6E91AC661\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Statue.C3Statue:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter3/C3Statue.C3Statue:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_C3Statue\"\nmsgid \"Are you ready?\"\nmsgstr \"¿Estás listo?\"\n\n#. Key:\t33B337C9455FC32BF5C3C69F58843673\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Statue.C3Statue:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Chapter3/C3Statue.C3Statue:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_C3Statue\"\nmsgid \"Will you release me once I get into your tower?\"\nmsgstr \"¿Me liberarás una vez que entre en tu torre?\"\n\n#. Key:\t4A8AD3EC428307141BD011B66448A7E5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Statue.C3Statue:DlgNode_Speech_2.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Statue.C3Statue:DlgNode_Speech_2.Children(0).Children.Text\nmsgctxt \"Dialogue_C3Statue\"\nmsgid \"Ready\"\nmsgstr \"Listo\"\n\n#. Key:\t9C5B29DF4784913DFF166BAD07AC1219\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Statue.C3Statue:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Chapter3/C3Statue.C3Statue:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_C3Statue\"\nmsgid \"Hurry! We don’t have much time.\"\nmsgstr \"¡Deprisa! No tenemos mucho tiempo.\"\n\n#. Key:\tB640545F41315B4C142083A2DB12A132\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Statue.C3Statue:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Chapter3/C3Statue.C3Statue:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_C3Statue\"\nmsgid \"Sure, we made a deal.\"\nmsgstr \"Claro, hicimos un trato.\"\n\n#. Key:\tC4EC98FC40F0181F5AFA60B4DFEF2D16\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Statue.C3Statue:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Chapter3/C3Statue.C3Statue:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_C3Statue\"\nmsgid \"Not yet. I’ll be back...\"\nmsgstr \"Aún no. Vuelvo enseguida...\"\n\n#. Key:\tCD542C81498F713774D43AB6EF126E32\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Statue.C3Statue:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter3/C3Statue.C3Statue:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_C3Statue\"\nmsgid \"Well done! From here I can take you to my tower.\"\nmsgstr \"¡Bien hecho! Desde aquí puedo llevarte a mi torre.\"\n\n#. Key:\tF982C80748C46B117906F094608B7E2C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Statue.C3Statue:DlgNode_Speech_2.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Statue.C3Statue:DlgNode_Speech_2.Children(1).Children.Text\nmsgctxt \"Dialogue_C3Statue\"\nmsgid \"Stay\"\nmsgstr \"Permanecer\"\n\n#. Key:\tFE6723D8452B497B07504EA753F02F35\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Statue.C3Statue:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Chapter3/C3Statue.C3Statue:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_C3Statue\"\nmsgid \"Let’s go then!\"\nmsgstr \"¡Vamos entonces!\"\n\n#. Key:\t7C2DF1BE46E7672A1C7092A330030B39\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3SupperDwarf.C3SupperDwarf:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter3/C3SupperDwarf.C3SupperDwarf:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_C3SupperDwarf\"\nmsgid \"Otherwise I would rather stay here.\"\nmsgstr \"De lo contrario, preferiría quedarme aquí.\"\n\n#. Key:\tFEB0911A412AF51088EC6A84D0FC7B3C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3SupperDwarf.C3SupperDwarf:DlgNode_Speech_80.Text\n#: /Game/SO/Dialogues/Chapter3/C3SupperDwarf.C3SupperDwarf:DlgNode_Speech_80.Text\nmsgctxt \"Dialogue_C3SupperDwarf\"\nmsgid \"I hope there is some delicious food in the Human Realm.\"\nmsgstr \"Espero que haya comida deliciosa en el Reino Humano.\"\n\n#. Key:\t360852FB41FBC269468577878A0CC719\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_C3Teachy\"\nmsgid \"Don’t say it, I know. I’m genius.\"\nmsgstr \"No lo digas, lo sé. Soy un genio.\"\n\n#. Key:\t39008A1943A63D4050295B9C508DF4CE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_C3Teachy\"\nmsgid \"He asked me to prove that I am worthy.\"\nmsgstr \"Me pidió que demostrara que soy digno.\"\n\n#. Key:\t5D3A77994D763C95F5655CAC4F228452\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_C3Teachy\"\nmsgid \"Oh, the walking ball again!\"\nmsgstr \"¡Oh, la pelota andante otra vez!\"\n\n#. Key:\t74789A0946246082325FCDB2600CEAA2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_C3Teachy\"\nmsgid \"I haven’t seen you since you left me there with that Keeper.\"\nmsgstr \"No te he visto desde que me dejaste allí con ese Guardián.\"\n\n#. Key:\t81A13B9645C14341A7FA45BC7482AB58\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_C3Teachy\"\nmsgid \"I'm not sure if it still matters but here is the Weird Device I found in the hideout of the Secret Science Society.\"\nmsgstr \"No estoy seguro de si todavía importa, pero aquí está el Aparato Extraño que encontré en el escondite de la Sociedad Secreta de Ciencias.\"\n\n#. Key:\t8E2355CF4A1F7CCF4AF0FA8D95E2F503\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_C3Teachy\"\nmsgid \"After reordering the right side I got the final result:\\r\\n\\r\\nTEACHY = WORTHY\"\nmsgstr \"Después de reordenar el lado derecho obtuve el resultado final:\\r\\n\\r\\nTEACHY = WORTHY\"\n\n#. Key:\tA46C8D2749791CE910856BA8887272EB\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_C3Teachy\"\nmsgid \"That is amazing! Thank you, my globular friend! Take these coins, I am sure you will enjoy spending them... if you still can.\"\nmsgstr \"¡Esto es increíble! Gracias mi amigo globular! Tome estas monedas, estoy seguro de que disfrutará gastándolas... si aún puede.\"\n\n#. Key:\tBFA75D71419A3B5615D65980F9A2FC0E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_C3Teachy\"\nmsgid \"Well, alright, I’ll tell.\"\nmsgstr \"Bueno, de acuerdo, lo diré.\"\n\n#. Key:\tC09FB7394571D19280D0B68572C6DCBB\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_C3Teachy\"\nmsgid \"I bet you wonder how did I get out.\"\nmsgstr \"Te estarás preguntando cómo me escapé.\"\n\n#. Key:\tCC72AAE64CE58AECB367B0B2565A74CC\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_C3Teachy\"\nmsgid \"I made some cups of tea and slowly put them in a row. From that I had this formula:\\r\\n\\r\\nTIME = T\\r\\nCUP = C\\r\\nTEA * C = ROW * T\"\nmsgstr \"Hice unas tazas de té y las puse en una fila. De eso obtuve esta fórmula:\\r\\n\\r\\nTIME = T\\r\\nCUP = C\\r\\nTEA * C = ROW * T\"\n\n#. Key:\tE907906F4A46886EFBA7F09E459F2663\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_C3Teachy\"\nmsgid \"Then I multiplied by HY, so I get:\\r\\n\\r\\nTEACHY = ROWTHY\"\nmsgstr \"Luego multipliqué por HY, así que obtengo:\\r\\n\\r\\nTEACHY = ROWTHY\"\n\n#. Key:\t298F025648B369E90753DA8D882DFDDB\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/DwarvenCatacombs/DCDictionary.DCDictionary:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Wizard/DwarvenCatacombs/DCDictionary.DCDictionary:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_DCDictionary\"\nmsgid \"Finally! A dictionary!\"\nmsgstr \"¡Por fin! ¡Un diccionario!\"\n\n#. Key:\t3D4CF9424B28083560A64D8FA1232E9F\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/DwarvenCatacombs/DCDictionary.DCDictionary:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Wizard/DwarvenCatacombs/DCDictionary.DCDictionary:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_DCDictionary\"\nmsgid \"Wake me up when you are ready.\"\nmsgstr \"Despiértame cuando estés listo.\"\n\n#. Key:\t04B787DD4344DA8AD6B1E0B7925BBDCE\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/DwarvenCatacombs/DCSecretDoor.DCSecretDoor:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Wizard/DwarvenCatacombs/DCSecretDoor.DCSecretDoor:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_DCSecretDoor\"\nmsgid \"There is a hidden Dwarven Door somewhere around here.\"\nmsgstr \"Hay una puerta de Enanos oculta por aquí.\"\n\n#. Key:\t4412DD54423A17AF3BFBA89BAF42664D\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/DwarvenCatacombs/DCSecretDoor.DCSecretDoor:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Wizard/DwarvenCatacombs/DCSecretDoor.DCSecretDoor:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_DCSecretDoor\"\nmsgid \"Or if you toggle that switch.\"\nmsgstr \"O si activa ese interruptor.\"\n\n#. Key:\t5FDA3D2A49BD57C213F0E3869A366B76\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/DwarvenCatacombs/DCSecretDoor.DCSecretDoor:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Wizard/DwarvenCatacombs/DCSecretDoor.DCSecretDoor:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_DCSecretDoor\"\nmsgid \"This one can only be revealed on Christmas time if the full moon shines on it.\"\nmsgstr \"Este solo se puede revelar en Navidad si brilla la luna llena en ello.\"\n\n#. Key:\tCE7E6F5B4DB41F1055EAF1898F17E4EA\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/DwarvenCatacombs/DCSecretDoor.DCSecretDoor:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Wizard/DwarvenCatacombs/DCSecretDoor.DCSecretDoor:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_DCSecretDoor\"\nmsgid \"Dwarfs are fond of these. They can't be seen if you don't know their trick.\"\nmsgstr \"Los enanos son aficionados a estos. No se pueden ver si no conoces su truco.\"\n\n#. Key:\t03067C1041952ECAC7D529AF2CC2ABEE\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_DemonLillian\"\nmsgid \"Who you just killed...\"\nmsgstr \"A quien acabas de matar...\"\n\n#. Key:\t06C4895B4BA9C2F71F3007B00A680CFB\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_DemonLillian\"\nmsgid \"I'm free without any bounds! I'm human!\"\nmsgstr \"¡Soy libre sin límites! ¡Soy humano!\"\n\n#. Key:\t0E5418EA4828B840886434A250967CBE\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_DemonLillian\"\nmsgid \"You liar! I'm the daughter of the Wizard!\"\nmsgstr \"¡Mentiroso! ¡Yo soy la hija del mago!\"\n\n#. Key:\t15ED5E554FBF25A72BB12FA81F4076FF\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_DemonLillian\"\nmsgid \"Sister? What makes you say that?\"\nmsgstr \"¿Hermana? ¿Qué te hace decir eso?\"\n\n#. Key:\t2B375C424D4561D651214BA0F10CDB44\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_DemonLillian\"\nmsgid \"Siblings? What makes you say that?\"\nmsgstr \"¿Hermanos? ¿Qué te hace decir eso?\"\n\n#. Key:\t2F0A5F3442ACF917A0515892B0639541\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_2.Children(1).Children.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_2.Children(1).Children.Text\nmsgctxt \"Dialogue_DemonLillian\"\nmsgid \"Just passing\"\nmsgstr \"Solo pasando\"\n\n#. Key:\t36A3340F4333184F42874F88F23A710D\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_DemonLillian\"\nmsgid \"What are you doing here little toy?\"\nmsgstr \"¿Qué haces aquí pequeño juguete?\"\n\n#. Key:\t46C7EE464B94BCE5D8CE6DB96299A583\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_DemonLillian\"\nmsgid \"You are nonsense.\"\nmsgstr \"Eres un necio.\"\n\n#. Key:\t732777EC4B213BC797E24FBBC478D39F\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_DemonLillian\"\nmsgid \"You are a Spirit of the Unknown bound to this body by magic. Just like me.\"\nmsgstr \"Eres un Espíritu de lo desconocido unido a este cuerpo por arte de magia. Igual que a mi.\"\n\n#. Key:\t819738554E1DD3694F3D0699221E6932\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_DemonLillian\"\nmsgid \"I'm just err... maybe we could play seek and hide?\"\nmsgstr \"Solo estoy err... ¿tal vez podríamos jugar al escondite?\"\n\n#. Key:\tA02291F444C7907190F1D3AC78E5EAF0\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_2.Children(0).Children.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_2.Children(0).Children.Text\nmsgctxt \"Dialogue_DemonLillian\"\nmsgid \"I'll stop you!\"\nmsgstr \"Te detendré!\"\n\n#. Key:\tA94658F148628400E971CD925A6B8713\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_DemonLillian\"\nmsgid \"Shaped like a human...\"\nmsgstr \"En forma de humano...\"\n\n#. Key:\tBBBDA8B843BF5549EF4052894D9BB630\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_DemonLillian\"\nmsgid \"We are siblings right? You will surely let me pass...\"\nmsgstr \"Somos hermanos ¿verdad? Seguramente me dejarás pasar...\"\n\n#. Key:\tBF79A92B406E287D767E7799D78FCFD4\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_DemonLillian\"\nmsgid \"That sounds funny!\"\nmsgstr \"¡Eso suena gracioso!\"\n\n#. Key:\tC6609DA7417A4DBC86F9809CE994E8BA\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_DemonLillian\"\nmsgid \"I'm power, I'm god!\"\nmsgstr \"¡Soy poder, soy dios!\"\n\n#. Key:\tDD2EF1594AFD2B0C38845C9E36089B95\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_DemonLillian\"\nmsgid \"I've found you!\"\nmsgstr \"¡Te he encontrado!\"\n\n#. Key:\tDD2F3A7048614E74B3A343BA474D8E49\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_DemonLillian\"\nmsgid \"I've come to stop you sister. The World is not your playground!\"\nmsgstr \"He venido para detenerte hermana. ¡El mundo no es un juguete!\"\n\n#. Key:\tE7FA21A04757D1EF04AE41AF4A13025A\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_DemonLillian\"\nmsgid \"I'm bored! Have you come to play with me?\"\nmsgstr \"¡Estoy aburrido! ¿Has venido a jugar conmigo?\"\n\n#. Key:\tFF05E84E4027C75294BAF4A589EEF6F9\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_DemonLillian\"\nmsgid \"I can create, I can destroy!\"\nmsgstr \"¡Puedo crear, puedo destruir!\"\n\n#. Key:\t025193144996A7024A7CF791B5A25EB7\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillianDefeated.DemonLillianDefeated:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillianDefeated.DemonLillianDefeated:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_DemonLillianDefeated\"\nmsgid \"What are you doing? Keep your hands away from me!\"\nmsgstr \"¿Qué estás haciendo? ¡Mantén tus manos lejos de mí!\"\n\n#. Key:\t2E05897C454C5C33BD76A6A4371A545C\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillianDefeated.DemonLillianDefeated:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillianDefeated.DemonLillianDefeated:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_DemonLillianDefeated\"\nmsgid \"I don't want to play anymore!\"\nmsgstr \"¡Ya no quiero jugar!\"\n\n#. Key:\t77A82F8943F323744F9389BF22A80FDF\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillianDefeated.DemonLillianDefeated:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillianDefeated.DemonLillianDefeated:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_DemonLillianDefeated\"\nmsgid \"Farewell Spirit!\"\nmsgstr \"¡Adiós Espíritu!\"\n\n#. Key:\t7831CD44458112E37918DF9082278603\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillianDefeated.DemonLillianDefeated:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillianDefeated.DemonLillianDefeated:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_DemonLillianDefeated\"\nmsgid \"Leave me alone!\"\nmsgstr \"¡Déjame en paz!\"\n\n#. Key:\t79E4053F4B8A1AFE74064BA77037F13E\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillianDefeated.DemonLillianDefeated:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillianDefeated.DemonLillianDefeated:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_DemonLillianDefeated\"\nmsgid \"I am his daughter. And this body is mine.\"\nmsgstr \"Yo soy su hija Y este cuerpo es mío.\"\n\n#. Key:\t96BD08904BC50C912055C0977281D10F\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillianDefeated.DemonLillianDefeated:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillianDefeated.DemonLillianDefeated:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_DemonLillianDefeated\"\nmsgid \"I know this body...\"\nmsgstr \"Conozco este cuerpo...\"\n\n#. Key:\tA5634D7D4613C578AB85E48B2DBD422B\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillianDefeated.DemonLillianDefeated:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillianDefeated.DemonLillianDefeated:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_DemonLillianDefeated\"\nmsgid \"Away!\"\nmsgstr \"¡Lejos!\"\n\n#. Key:\tE09248B24E34823DDE71BAB68183AD2D\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillianDefeated.DemonLillianDefeated:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillianDefeated.DemonLillianDefeated:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_DemonLillianDefeated\"\nmsgid \"They were wrong all along.\"\nmsgstr \"Estuvieron equivocados desde el principio.\"\n\n#. Key:\t01C1D7AF4D8D7B3D628A089E38471479\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_74.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_74.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Thank you! Take this as reward.\"\nmsgstr \"¡Gracias! Toma esto como recompensa.\"\n\n#. Key:\t034DDD8F467E3B6E6A70CFBC1FA81D21\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_94.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_94.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Look what I have found for you!\"\nmsgstr \"¡Mira lo que he encontrado para ti!\"\n\n#. Key:\t046279EA4D7E44826F537DA0869C13DD\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_114.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_114.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"They are somewhere around.\"\nmsgstr \"Están en algún lugar cerca.\"\n\n#. Key:\t055FD02047EB0145285C8BB0B7A23F0A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_17.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_17.Children(0).Children.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"They fight Ruin\"\nmsgstr \"Pelean contra Ruin\"\n\n#. Key:\t07684DB1418378D59D3741AE19AB22C1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(9).Children.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(9).Children.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Golems destroyed\"\nmsgstr \"Golems destruidos\"\n\n#. Key:\t0D548F74416A5C1D8220869DC707A575\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_127.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_127.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Even if he couldn't be what I wanted him to be, he was my greatest creation ever.\"\nmsgstr \"Aunque no podía ser lo que yo quería que fuera, fue mi mejor creación.\"\n\n#. Key:\t0E3082704C6E4BA14C554DA5B4306C88\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Could you merge these copper pieces?\"\nmsgstr \"¿Podrías fusionar estas piezas de cobre?\"\n\n#. Key:\t103CB0C84AEA077F78347A92E6389F32\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_10.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_10.Children(0).Children.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Don't know\"\nmsgstr \"No lo se\"\n\n#. Key:\t12C814BB44D434DFC5C35C882B4BF0DB\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_116.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_116.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Be aware of the Armour Wrath.\"\nmsgstr \"Ten cuidado con Ira de Armadura.\"\n\n#. Key:\t14E2589C4CC2C6C77D37A5B50C61C266\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Could you merge these bronze pieces?\"\nmsgstr \"¿Podrías fusionar estas piezas de bronce?\"\n\n#. Key:\t1770D8FE480B8C028F9ED989E22CF315\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"You are not one of my new creations. Yet not one of the ancients.\"\nmsgstr \"No eres una de mis nuevas creaciones. y tampoco una de los antiguos.\"\n\n#. Key:\t1C02E8BB400B379858A402B9621B68D6\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_129.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_129.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Take care!\"\nmsgstr \"¡Cuídate!\"\n\n#. Key:\t1CDE0CFA4DBF3794096E099B58726BD8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_36.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_36.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Nothing else matters.\"\nmsgstr \"Nada más importa.\"\n\n#. Key:\t1FA243424440B0810651C79BD207FC2D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_33.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_33.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Too many spirits. They break loose. They couldn’t exist in our Realm. They formed Ruin.\"\nmsgstr \"Demasiados espíritus. Se escapan. No podrían existir en nuestro Reino. Formaron Ruin.\"\n\n#. Key:\t1FFE46404FBD26325B1348BF7A2935A7\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_92.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_92.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Oh, thank you! It also gives back some of my lost knowledge.\"\nmsgstr \"¡Oh gracias! También me devuelve parte de mi conocimiento perdido.\"\n\n#. Key:\t2084B3DE4CDAC5B7B9018994EE4DFAA4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_85.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_85.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"The end is close, yet knowing what I am makes my last days brighter.\"\nmsgstr \"El final está cerca, pero saber lo que soy hace que mis últimos días sean más brillantes.\"\n\n#. Key:\t21883D3E4563FD95B13E8E8E25FB1D92\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_15.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_15.Children(0).Children.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Not my business\"\nmsgstr \"No es mi problema\"\n\n#. Key:\t2362D7ED44CEEE8592C72BB41ECC0CC0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_77.Text\n#. Key:\t969AF9184296C419E484BA80FF80F15B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_76.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_76.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_77.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Do you know a girl called Lillian?\"\nmsgstr \"¿Conoces a una chica llamada Lillian?\"\n\n#. Key:\t2362FF25427C7C664ACE9297A20F3C65\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_81.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_81.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Memory Crystals? Can I touch them?\"\nmsgstr \"¿Cristales de Memoria? ¿Puedo tocarlos?\"\n\n#. Key:\t254431B64533FAD362B0AF93F8347842\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_119.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_119.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"You will find it if you reach the top of the Main Tower.\"\nmsgstr \"Lo encontrarás si llegas a la cima de la Torre Principal.\"\n\n#. Key:\t26664D3045EDCEC9C09E9CBA8515C088\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I don't know... I'm forced to do tasks for a wizard. I'm lost and confused.\"\nmsgstr \"No lo sé... Estoy obligado a hacer tareas para un mago. Estoy perdido y confundido.\"\n\n#. Key:\t280BE2914A227E7350F067BCB4CC49AD\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_86.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_86.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Hmmm...\"\nmsgstr \"Hmmm...\"\n\n#. Key:\t2B714CED45A868B1678C5E854160945E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_97.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_97.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Look, I have more crystals.\"\nmsgstr \"Mira, tengo más cristales.\"\n\n#. Key:\t2C052328496E84667F356F95F9F9C418\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"This is really not my problem. All I care about is to complete my task and go on my way.\"\nmsgstr \"Este no es mi problema. Todo lo que me importa es completar mi tarea y seguir mi camino.\"\n\n#. Key:\t2C174523477E6720A5300DBFE343C3D8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_51.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_51.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I can no longer open a gate to the Unknown Realm.\"\nmsgstr \"Ya no puedo abrir una puerta al Reino Desconocido.\"\n\n#. Key:\t2C7D234B4F377087E1D340986BD581AC\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_49.Text\n#. Key:\t417BB4E644EBC809C2489F85993A8E17\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_56.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_49.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_56.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"If you can summon Spirits you surely know a way to get me home.\"\nmsgstr \"Si puedes convocar espíritus, seguramente sabes una manera de llevarme a casa.\"\n\n#. Key:\t2DE200934F6AC1595216AA8050FF8F30\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_67.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_67.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I won’t work with anything else.\"\nmsgstr \"No trabajaré con nada más.\"\n\n#. Key:\t2FC050C145CB19BD786157988C677AF5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(1).Children.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Bronze key\"\nmsgstr \"Llave de Bronce\"\n\n#. Key:\t30AD4CBE4D6EFD170F43D9852A0CB50C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_108.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_108.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I can’t remember.\"\nmsgstr \"No me acuerdo.\"\n\n#. Key:\t310B95624A8B2179F69A68BE2B0869C2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(4).Children.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(4).Children.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Making Golems?\"\nmsgstr \"Creando Golems?\"\n\n#. Key:\t311039514F83A0ED4BE47A98BF5AE48E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_107.Text\n#. Key:\t5D08D2404686BF1E5D48AC8C63096F0D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_104.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_104.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_107.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Thank you Spirit! I will be forever in your debt.\"\nmsgstr \"¡Gracias espíritu! Estaré siempre en deuda contigo.\"\n\n#. Key:\t3140425845B595B02CA8D3B8DBC6CE37\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_38.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_38.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"It's done. They are destroyed.\"\nmsgstr \"Esta hecho. Están todos destruidos.\"\n\n#. Key:\t37835C204E4C4B17F2D55C9B23FD7D1E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_45.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_45.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"There is some kind of a connection between Ruin and the Spirits.\"\nmsgstr \"Hay algún tipo de conexión entre Ruin y los Espíritus.\"\n\n#. Key:\t384F5CB146C9B6E7EFD361964FF11735\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"A spirit of the Unknown was summoned here by a Wizard of another world.\"\nmsgstr \"Un espíritu de lo desconocido fue convocado aquí por un Mago de otro mundo.\"\n\n#. Key:\t398124A4493A7325B284CA8105354F0C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_35.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_35.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Yet now the only important thing is to finish my golems.\"\nmsgstr \"Sin embargo, ahora lo único importante es terminar mis golems.\"\n\n#. Key:\t39C014784CA9DF8247D2DDA5587BAB20\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(5).Children.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(5).Children.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Get me home!\"\nmsgstr \"¡Llévame a casa!\"\n\n#. Key:\t3CE0431346C222ED2A6729AAEF8026DC\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(6).Children.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(6).Children.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"New body for me\"\nmsgstr \"Nuevo cuerpo para mi\"\n\n#. Key:\t3DFB1F4D4BB673F983C8CDA4E9911BF2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_89.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_89.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Wait a minute! I’ll make something special for you.\"\nmsgstr \"¡Espera un minuto! Haré algo especial para ti.\"\n\n#. Key:\t3F7C1850478A14857F4FFD9D41BA39FC\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_87.Text\n#. Key:\t79079CCD4BB2C6244D6D7CB04BD4C42F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_84.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_84.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_87.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Yes, now I remember. Thank you little Spirit for giving my memories back.\"\nmsgstr \"Sí, ahora lo recuerdo. Gracias pequeño Espíritu por devolverme mis recuerdos.\"\n\n#. Key:\t3FAB7E8D4E72D1EED6E11EA54A128836\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(3).Children.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(3).Children.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Copper Key\"\nmsgstr \"Llave de Cobre\"\n\n#. Key:\t419879C24D39534867F656B704C579AC\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_110.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_110.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Even without my memories I liked to talk to her.\"\nmsgstr \"Incluso sin mis recuerdos me gustaba hablar con ella.\"\n\n#. Key:\t41B08BF1417C041EB3ACAE8C09C44872\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_17.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_17.Children(1).Children.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"They will fall\"\nmsgstr \"Caerán\"\n\n#. Key:\t41E19A0C420F2BD87AA91AB475D5BB0C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_128.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_128.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Please, leave me alone now.\"\nmsgstr \"Por favor, déjame solo.\"\n\n#. Key:\t4438EF7A4D77A3314D2B6587DAE664AE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I can fix it!\"\nmsgstr \"¡Puedo arreglar esto!\"\n\n#. Key:\t46730E7C433AE7B987C61D9DDF0161E2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_52.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_52.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"How do you make Golems then?\"\nmsgstr \"¿Cómo se hacen los Golems?\"\n\n#. Key:\t4816E7D14B256F62C2AFE0A3D5EC1987\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_113.Text\n#. Key:\tEC59F30D402E177B8C137DAA7A834F1A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_112.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_112.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_113.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I’m looking for three artefacts. Do you know something about them?\"\nmsgstr \"Estoy buscando tres artefactos. ¿Sabes algo sobre ellos?\"\n\n#. Key:\t49E3D8B84BD437A7195CB49B1C91A9B7\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_30.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_30.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"We created too many of them. Always new ones. We forgot about the old ones.\"\nmsgstr \"Creamos demasiados. Siempre nuevos. Nos olvidamos de los viejos.\"\n\n#. Key:\t4CDF7F734B65BFB6575D66A2E40B64B6\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"You wonder if Ruin will destroy their World as well...\"\nmsgstr \"Te preguntas si Ruin también destruirá su mundo...\"\n\n#. Key:\t4FD5FE974E1B8142471F8896818E875C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"What do you need?\"\nmsgstr \"¿Qué necesitas?\"\n\n#. Key:\t5000F3F44A899815A0D341A3494E42AB\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_91.Text\n#. Key:\t6D5127FD45C09B33329F0EB0DDCE67D7\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_93.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_91.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_93.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Thank you!\"\nmsgstr \"¡Gracias!\"\n\n#. Key:\t50E6C4434BAC5A7F4B2C66BD8DB5E071\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_100.Text\n#. Key:\t64A5DE6941972506C0BECBB55BBE4FE5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_78.Text\n#. Key:\tB07790474D4C124CB72F128AE0FB2CC5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_95.Text\n#. Key:\tEF125F27496303716206D182C1ED460D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_39.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_100.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_39.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_78.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_95.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I think these crystals have something to do with you.\"\nmsgstr \"Creo que estos cristales tienen algo que ver contigo.\"\n\n#. Key:\t51C200AD42FCE6888DBF8C8C24A02283\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"It shall be done.\"\nmsgstr \"Se hará.\"\n\n#. Key:\t52D4954E427C666F0F2F4A92F9BCFBC9\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_50.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_50.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I’m sorry but I can’t help you.\"\nmsgstr \"Lo siento pero no puedo ayudarte.\"\n\n#. Key:\t5B1327C64C77C05C43CD728356DA4EC4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_58.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_58.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Knowledge lost. We are lost.\"\nmsgstr \"Conocimiento perdido. Estamos perdidos.\"\n\n#. Key:\t5E7AD2034CECCF124DA4E19D94B96433\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"It's nothing. Here it is.\"\nmsgstr \"No es nada. Aquí está.\"\n\n#. Key:\t5FB1520B447246A1A8BCD3BDDB44D145\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_65.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_65.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"No.\"\nmsgstr \"No.\"\n\n#. Key:\t5FBF0F3F4419A6AD796054841902FA7C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"They can't work together even if they share the same goal.\"\nmsgstr \"No pueden trabajar juntos incluso si comparten el mismo objetivo.\"\n\n#. Key:\t60609E4049562CF11C05CB8DB96BBBB3\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"What do you mean by 'your creations'?\"\nmsgstr \"¿Qué quieres decir con \\\"tus creaciones\\\"?\"\n\n#. Key:\t635D5E904325D51DFF19A1A862A3CC0B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_124.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_124.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"The Armour Wrath is no more.\"\nmsgstr \"Ira de Armadura ya no existe.\"\n\n#. Key:\t6585CAC84326A3EEE1682789B7BB3CB6\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_10.Children(2).Children.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_10.Children(2).Children.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Your creation?\"\nmsgstr \"¿Tu creación?\"\n\n#. Key:\t65C3735740E5D7AF76376AB2B7B05CE9\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(12).Children.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(12).Children.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Leave\"\nmsgstr \"Salir\"\n\n#. Key:\t6A460D4A4751398E004298948D630BA4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_47.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_47.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I don’t think I will manage though. It’s already too late. But there is no reason to give up either.\"\nmsgstr \"No creo que lo logre. Ya es muy tarde. Pero tampoco hay razón para rendirse.\"\n\n#. Key:\t6DC280B64766B5CB2049409B2F73CDB4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_40.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_40.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Is there a way I can help you?\"\nmsgstr \"¿Hay alguna manera en que pueda ayudarte?\"\n\n#. Key:\t6DD3D7804417850FE8504286DD2B5D95\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_96.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_96.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"More Crystal? That's very kind.\"\nmsgstr \"¿Más cristales? Eso es muy amable.\"\n\n#. Key:\t6E9DB27A4207FFA8409F61AE45282D53\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_41.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_41.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I have found one more crystal.\"\nmsgstr \"He encontrado otro cristal.\"\n\n#. Key:\t717452044F194A1C30FA3C8FBB94C9BF\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_73.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_73.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I’ll see what I can do.\"\nmsgstr \"Veré lo que puedo hacer.\"\n\n#. Key:\t74670AB34D1A75913013BE8EE7C0B961\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_72.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_72.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I’ve already destroyed them.\"\nmsgstr \"Ya los he destruido.\"\n\n#. Key:\t752F67A54FA433AA588175AA7C64E367\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_43.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_43.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I try to create the perfect Golem. The one which resists Ruin.\"\nmsgstr \"Intento crear el Golem perfecto. Uno que resiste Ruin.\"\n\n#. Key:\t775C2189498804DBED7D81AB3EFEC96F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(11).Children.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(11).Children.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Lillian\"\nmsgstr \"Lillian\"\n\n#. Key:\t78C78DDD456328181EBCC78B20F9573D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_122.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_122.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Some of them are still out there.\"\nmsgstr \"Algunos de ellos están por ahí todavía.\"\n\n#. Key:\t7C7D08C340B478A9420331AD355B1FA5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_15.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_15.Children(1).Children.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Like you?\"\nmsgstr \"¿Como tú?\"\n\n#. Key:\t7DCEFFEC46523960D1453DA93F36CAA5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_111.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_111.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I don’t know why but I feel in some way you are bound to her.\"\nmsgstr \"No sé por qué, pero siento que de alguna manera estás unida a ella.\"\n\n#. Key:\t7F44BD934784D4F3AA2C85985489590A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"A Wizard? So now the Human Realm's people are messing with Golem Technology.\"\nmsgstr \"¿Un Mago? Así que ahora la gente del Reino Humano está jugando con la Tecnología Golem.\"\n\n#. Key:\t80871D9C4CF37B5F2E7101B8A2565D73\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_70.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_70.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"It’s not safe for me to walk outside.\"\nmsgstr \"No es seguro para mí caminar afuera.\"\n\n#. Key:\t83ACDDA4415211102DBE099F178B228B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_15.Children(2).Children.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_15.Children(2).Children.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"You mean Ruin\"\nmsgstr \"Te refieres a Ruin\"\n\n#. Key:\t86B4FC23463D5507B11C3F826ADF6C7C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_10.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_10.Children(1).Children.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Spirit in a ball\"\nmsgstr \"Espíritu en una pelota\"\n\n#. Key:\t88A6486843FEC6A2125F79B8AED93F74\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_99.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_99.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Now there is only a few missing.\"\nmsgstr \"Ahora solo faltan unos pocos.\"\n\n#. Key:\t8C2169FA47F83CA62B19F083EFC398F5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_26.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_26.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"That is me. And what are you creature?\"\nmsgstr \"Ese soy yo. ¿Y tú quien eres criatura?\"\n\n#. Key:\t8CC8368441F2CCDB0E7B22916F8A0622\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_88.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_88.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Getting back some of my lost knowledge also makes me feel happy.\"\nmsgstr \"Recuperar parte de mi conocimiento me hace feliz.\"\n\n#. Key:\t8E3399DA4F904AD46476418817CD78C4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_62.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_62.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Metal binds the will of the spirits. Rock is a bit less cruel but still weakens your will.\"\nmsgstr \"El metal une la voluntad de los espíritus. la roca es un poco menos cruel pero aún debilita tu voluntad.\"\n\n#. Key:\t8F4BB43A4656EAD257920492E10BC764\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_130.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_130.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Yes, they bring back some of my memories.\"\nmsgstr \"Sí, me traen algunos de mis recuerdos.\"\n\n#. Key:\t8F9DF3254A02EFF2E623DB91935A1529\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_123.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_123.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Come back when you found all of them.\"\nmsgstr \"Vuelve cuando los hayas encontrado todos.\"\n\n#. Key:\t97EE3A1B4AD2EB2E7ED2D1B1427E4A2A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_25.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_25.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"It's only me trying to recreate the perfect Golem.\"\nmsgstr \"Soy solo yo tratando de recrear el Golem perfecto.\"\n\n#. Key:\t99BCAE80415145460126B08933AE6242\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_118.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_118.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"One of the artefacts is close.\"\nmsgstr \"Uno de los artefactos está cerca.\"\n\n#. Key:\t9A05FD0845F9149CEB6EB8889EB9A686\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"That won't happen.\"\nmsgstr \"Eso no va a suceder.\"\n\n#. Key:\t9B7BB6624923813EBF68C9BCE9FF8E49\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"There is nothing else I could say. See you later!\"\nmsgstr \"No hay nada más que pueda decir. ¡Nos veremos más tarde!\"\n\n#. Key:\t9BEA36B448EC18A9280A5AAB78A46898\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_42.Text\n#. Key:\tD3AE25EC49FA7D2C78C1A382E5A01F28\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_37.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_37.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_42.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Why are you making Golems? What would you like to achieve?\"\nmsgstr \"¿Por qué estás haciendo Golems? ¿Qué te gustaría lograr?\"\n\n#. Key:\t9CC2CAF14E5C04555E7329B6EA5082E0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(0).Children.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Armour Wrath\"\nmsgstr \"Ira de Armadura\"\n\n#. Key:\t9EF4681A48ED6C909A4180BF823544BC\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(8).Children.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(8).Children.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Do you need help?\"\nmsgstr \"¿Necesita ayuda?\"\n\n#. Key:\t9F3BC08D46169E8C4BB788893FFDBCD4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_68.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_68.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Yes.\"\nmsgstr \"Sí.\"\n\n#. Key:\tA10EF7404139EE7FE638BCA272C0B2CA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_71.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_71.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Destroy them if you can.\"\nmsgstr \"Destrúyalos si puedes.\"\n\n#. Key:\tA13C1A6B4F187C1A3F682088B9CC9A6F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_23.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_23.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Didn't look too intelligent to me...\"\nmsgstr \"No me pareció muy inteligente...\"\n\n#. Key:\tA28429434B394861A6E4D084CE5C243F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_61.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_61.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I could but I don’t think you would like it.\"\nmsgstr \"Podría pero no creo que te gustaría.\"\n\n#. Key:\tA2CBB6914F66C9963AFD34A21378EAA7\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_103.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_103.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"With this last one I have all my memories back.\"\nmsgstr \"Con este último, han vuelto todos mis recuerdos.\"\n\n#. Key:\tA33780CE4B9EABF54F612DBFCEB4B890\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I wonder if they will end like us.\"\nmsgstr \"Me pregunto si terminarán como nosotros.\"\n\n#. Key:\tA47024E844A13837A8FFFBB1EFA65633\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_44.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_44.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Though I forgot the reason.\"\nmsgstr \"Aunque olvidé la razón.\"\n\n#. Key:\tA4E91A924BA53F0A000CDB9FC351DDBA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_60.Text\n#. Key:\tB4F5B2E6479E0E1ACDADD8A40E21FB98\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_59.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_59.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_60.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Could you create a stronger body for me?\"\nmsgstr \"¿Podrías crearme un cuerpo más fuerte?\"\n\n#. Key:\tA50F6A7B4A65712F990406B84E2AE072\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_98.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_98.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Thank you! I remember more and more.\"\nmsgstr \"¡Gracias! Recuerdo cada vez más.\"\n\n#. Key:\tA586F33F460BD066761AAEBD18666F78\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_82.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_82.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Bring me more so that I can remember!\"\nmsgstr \"¡Tráeme más para que pueda recordar!\"\n\n#. Key:\tA8A9ACBA47419C57AAA06098F7F91AD3\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_83.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_83.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Let me touch it! Hmmm...\"\nmsgstr \"¡Déjame tocarlo! Hmmm...\"\n\n#. Key:\tAA5F0D5541366675A1D1819FDBDFA569\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"What happened to you?\"\nmsgstr \"¿Qué te pasó a ti?\"\n\n#. Key:\tAD380C5F4F549229611DD9A79C7CD07E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_79.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_79.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"She was from the Human Realm. I liked her better than the other human.\"\nmsgstr \"Ella era del Reino Humano. Me gustaba más que el otro humano.\"\n\n#. Key:\tAE0D1C714FFCFCA51ACCD3A01D6C7FF5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_125.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_125.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Yes, I felt his presence disappearing.\"\nmsgstr \"Sí, sentí su presencia desaparecer.\"\n\n#. Key:\tAE6B02664FEE60818E0D32B7939907F8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_106.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_106.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Now I have all my memories back.\"\nmsgstr \"Ahora tengo todos mis recuerdos de vuelta.\"\n\n#. Key:\tB7638E004540ADC59420A5AA614C225D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_75.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_75.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I’ve destroyed the Golems near the Tomb.\"\nmsgstr \"He destruido los Golems cerca de la Tumba.\"\n\n#. Key:\tB86428C143F7BBBC4A7B9A91C05F3D15\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"They are doomed.\"\nmsgstr \"Están condenados.\"\n\n#. Key:\tBB7DE71F44FE995BA4AF4C9F5E19961F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_46.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_46.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I try to create an Essence which resists Ruin. If it works it could stop Ruin.\"\nmsgstr \"Intento crear una esencia que resista a Ruin. Si funciona, podría detenerlo.\"\n\n#. Key:\tBCF49E21489280A32F859B9A6C2A78D4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"What are you creature?\"\nmsgstr \"¿Que eres, criatura?\"\n\n#. Key:\tBDEEB7C2474E308C66B832B41D839FC6\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_66.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_66.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Metal is good for spirits. Even rock is dangerous.\"\nmsgstr \"El metal es bueno para los espíritus. Incluso la roca es peligroso.\"\n\n#. Key:\tC0CAE1B14D0B0E551B690FB9F178A6EE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(10).Children.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(10).Children.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Memory Crystals\"\nmsgstr \"Cristales de Memoria\"\n\n#. Key:\tC86A03B046B8F005B1C91EB0F68E4C1E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_121.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_121.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Here, take this! It might help if you need to face my creature!\"\nmsgstr \"¡Aquí, ten esto! ¡Podría ayudar si necesitas enfrentarte a mi criatura!\"\n\n#. Key:\tCA35E144421C5594346DC9954052E633\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_57.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_57.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"No way home.\"\nmsgstr \"No hay forma de llegar a casa.\"\n\n#. Key:\tCD223717428DAF54F5362BB744B6A633\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_53.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_53.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I reuse the old golems. Maybe that’s why I can’t succeed.\"\nmsgstr \"Reutilizo golems antiguos. Tal vez por eso no logro.\"\n\n#. Key:\tD06BA0C54CAA8E00ECAFBE9FAFBABE1F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Could you merge these iron pieces?\"\nmsgstr \"¿Podrías fusionar estas piezas de hierro?\"\n\n#. Key:\tD237C8514A69E0A7820941B9048B92DE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_90.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_90.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Here it is!\"\nmsgstr \"¡Aquí está!\"\n\n#. Key:\tD2CEAC3040B9EBE5A98F249F60A7DAAA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(2).Children.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(2).Children.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Iron Key\"\nmsgstr \"Llave de Hierro\"\n\n#. Key:\tD935FD314471404BAECA54BC3227D6E2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_69.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_69.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"There are too many unsuccessful golems.\"\nmsgstr \"Hay demasiados golems fracasados.\"\n\n#. Key:\tDE3287A345E1E317061B45B64AAA0836\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_34.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_34.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Your words remind me of something. Something which was important.\"\nmsgstr \"Tus palabras me recuerdan algo. Algo que era importante.\"\n\n#. Key:\tDEC8E5D548AECD6D48B449B51967301B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_115.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_115.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"One is guarded by my worst creation.\"\nmsgstr \"Uno está vigilado por mi peor creación.\"\n\n#. Key:\tDEFA219E40FE5384D8B1F0A1CFD3AAD4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_80.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_80.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"She were... She said...\"\nmsgstr \"Ella estaba... Ella dijo...\"\n\n#. Key:\tE13D5CCE41818BAC4A6E52A965B0AEF8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_101.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_101.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Look at this!\"\nmsgstr \"¡Mira esto!\"\n\n#. Key:\tE1CB9ABE410B3C818283BB9325F3A456\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_32.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_32.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I create golems. You go on with your quest. Nothing else matters.\"\nmsgstr \"Creo golems. Sigues con tu misión. Nada más importa.\"\n\n#. Key:\tE2AAAA4648BE8A7E73C761BDF72EC82D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_54.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_54.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Ruin caused too much damage.\"\nmsgstr \"Ruin causó demasiado daño.\"\n\n#. Key:\tE483CAFF4F7EF5607AA0A58F47EEF892\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_31.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_31.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"You are right. We are what we do. That keeps us alive.\"\nmsgstr \"Tienes razón. Somos lo que hacemos. Lo que nos mantiene vivos.\"\n\n#. Key:\tE9899191454A678E7C61B0A55047A725\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_126.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_126.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I'm glad you managed to defeat him and yet...\"\nmsgstr \"Me alegra que hayas logrado derrotarlo y aun asi...\"\n\n#. Key:\tEA08D7B74E94A3D91DC825945916C312\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_102.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_102.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"One more Crystal for you!\"\nmsgstr \"¡Un cristal más para ti!\"\n\n#. Key:\tEAF5836D4D35812F14EABFA43C849947\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_117.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_117.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I know what you are up to. I would like to help but I fear I can’t do much.\"\nmsgstr \"Sé lo que estás haciendo. Me gustaría ayudar, pero creo que no puedo hacer mucho.\"\n\n#. Key:\tEB0F70894E9A498111B9A9824589633B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I create Golems. I always did. I designed the most intelligent ones.\"\nmsgstr \"Yo creo Golems. Siempre lo he hecho. Diseñé los más inteligentes.\"\n\n#. Key:\tF0A1D18E463DCD0CADD67690F691481B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_27.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_27.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"There are some seeking a way to stop Ruin. They don't care about using spirits as slaves.\"\nmsgstr \"Hay quienes buscan una manera de detener a Ruin. No les importa usar espíritus como esclavos.\"\n\n#. Key:\tF10E8A9243616A85F71C01B0E57A2CC8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_105.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_105.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"And this is for you!\"\nmsgstr \"¡Y esto es para ti!\"\n\n#. Key:\tF62B033A4054241E561B519B2AFFEBDB\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Do you mean those moving rock things out there?\"\nmsgstr \"¿Te refieres a esas cosas de roca ahí fuera?\"\n\n#. Key:\tF783A4F44E12EDA97EDF08B60228ED06\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_109.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_109.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"She had heart, she cared about what’s going on here. For the others we were like some interesting study.\"\nmsgstr \"Tenía corazón, se preocupaba por lo que estaba pasando aquí. Para los demás fuimos como un estudio interesante.\"\n\n#. Key:\tF87968784C67FEEEBB78DBAD9D3C13F3\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_63.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_63.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"As for other materials I have no experience. Trust me you don’t want me to test out something on you for the first time.\"\nmsgstr \"En cuanto a otros materiales no tengo experiencia. Confía en mí, no quieres que probemos algo nuevo en ti por primera vez.\"\n\n#. Key:\tF9B8793C470BFE672214E1B82AE01B4E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_24.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_24.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Knowledge is lost. We are all lost.\"\nmsgstr \"El conocimiento esta perdido. Todos estamos perdidos.\"\n\n#. Key:\tF9DB2D444ADAC7A5C22AEC914EC7955F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(7).Children.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(7).Children.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Artefacts\"\nmsgstr \"Artefactos\"\n\n#. Key:\tFE7749AB4C91684B3438E7A1B5BF32D9\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_29.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_29.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"They can't do as they plan. Some of them don't even believe Ruin.\"\nmsgstr \"No pueden hacer lo que planean. Algunos de ellos ni siquiera creen en Ruin.\"\n\n#. Key:\tFF2914834A91E2B6E8696FA828FC9F94\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_120.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_120.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Though it is guarded by the worst Golem I ever made: the Armour Wrath...\"\nmsgstr \"Aunque está vigilado por el peor Golem que he creado: la Ira de Armadura...\"\n\n#. Key:\t303FE4BA4765B90E9239FEB43AE2264C\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/DwarvenCatacombs/DO1Altar.DO1Altar:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Wizard/DwarvenCatacombs/DO1Altar.DO1Altar:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_DO1Altar\"\nmsgid \"Under section 1 of the first Act, an action of worship can not be aimed at any entity, god or divinity other than the Law itself.\"\nmsgstr \"Bajo la sección 1 de la primera ley, una acción de culto no puede dirigirse a ninguna entidad, dios o divinidad que no sea la Ley misma.\"\n\n#. Key:\t73BA4B474C4DCF6CD31469A9FF120D58\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/DwarvenCatacombs/DO1Altar1.DO1Altar1:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Wizard/DwarvenCatacombs/DO1Altar1.DO1Altar1:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_DO1Altar1\"\nmsgid \"Under section 2 of the first Act... ??? There is section 3 of the first act, one would assume.\"\nmsgstr \"Bajo la sección 2 de la primera ley... ??? Hay una sección 3 de la primera ley, uno asumiría.\"\n\n#. Key:\t0D939EC3462DBDE895AD9F80CD4A9B99\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/DwarvenOutpost/DO1Arrive1DeadDwarves.DO1Arrive1DeadDwarves:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Wizard/DwarvenOutpost/DO1Arrive1DeadDwarves.DO1Arrive1DeadDwarves:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_DO1Arrive1DeadDwarves\"\nmsgid \"So they were the dwarfs who lived here.\"\nmsgstr \"Entonces ellos eran los enanos que vivían aquí.\"\n\n#. Key:\t6E27805A491B0E0DEAC36F9189CA33F9\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/DwarvenOutpost/DO1Arrive1DeadDwarves.DO1Arrive1DeadDwarves:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Wizard/DwarvenOutpost/DO1Arrive1DeadDwarves.DO1Arrive1DeadDwarves:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_DO1Arrive1DeadDwarves\"\nmsgid \"I'm not sure why but I feel a bit of sorrow for them.\"\nmsgstr \"No estoy seguro por qué, pero siento un poco de pena por ellos.\"\n\n#. Key:\t7AD20FC74D56D0EE48CB5F92804EDAE5\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/DwarvenOutpost/DO1Arrive1DeadDwarves.DO1Arrive1DeadDwarves:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Wizard/DwarvenOutpost/DO1Arrive1DeadDwarves.DO1Arrive1DeadDwarves:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_DO1Arrive1DeadDwarves\"\nmsgid \"I wonder how you can tell them apart.\"\nmsgstr \"Me pregunto cómo puedes distinguirlos.\"\n\n#. Key:\tA6EB230647E9F8D38877FCA10CDE4875\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/DwarvenOutpost/DO1Arrive1DeadDwarves.DO1Arrive1DeadDwarves:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Wizard/DwarvenOutpost/DO1Arrive1DeadDwarves.DO1Arrive1DeadDwarves:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_DO1Arrive1DeadDwarves\"\nmsgid \"I knew these ones. That's Gwin and Traga, there's Krug...\"\nmsgstr \"Yo conocía a estos. Son Gwin y Traga, este es Krug...\"\n\n#. Key:\t2858D4314420FB59E8BDC18DB625DC1F\n#. SourceLocation:\t/Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_6.SpeechSequence(1).SpeechSequence.Text\n#: /Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_6.SpeechSequence(1).SpeechSequence.Text\nmsgctxt \"Dialogue_DO1Gate\"\nmsgid \"I think you may mistranslated a word or two...\"\nmsgstr \"Creo que has traducido mal una o dos palabras...\"\n\n#. Key:\t2C08483A26080F0A003A02ADBE7A7D64\n#. SourceLocation:\t/Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_7.SpeechSequence(2).SpeechSequence.Text\n#: /Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_7.SpeechSequence(2).SpeechSequence.Text\nmsgctxt \"Dialogue_DO1Gate\"\nmsgid \"Dwarven letters are so similar...\"\nmsgstr \"Las letras de los Enanos son muy similares...\"\n\n#. Key:\t2C09D69026080F0A003A02ADBE7A7D4E\n#. SourceLocation:\t/Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_8.SpeechSequence(2).SpeechSequence.Text\n#: /Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_8.SpeechSequence(2).SpeechSequence.Text\nmsgctxt \"Dialogue_DO1Gate\"\nmsgid \"Dwarven language is stupid, these signs could mean anything!\"\nmsgstr \"El lenguaje de los Enanos es estúpido, ¡estos signos podrían significar cualquier cosa!\"\n\n#. Key:\t3D6EF5724190CE0AE579D69677BB8EAE\n#. SourceLocation:\t/Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_DO1Gate\"\nmsgid \"Associate!\"\nmsgstr \"¡Asocia!\"\n\n#. Key:\t4758A32043FC23B4DC3D82B35EFB0D24\n#. SourceLocation:\t/Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_DO1Gate\"\nmsgid \"The Doors of Dwar — Lord of Dwartown. Speak, associate, and enter.\"\nmsgstr \"Las puertas de Dwar — Señor de Dwartown. Habla, asocia y entra.\"\n\n#. Key:\t475CE3E94BA77F7596A7D8931D4D16C7\n#. SourceLocation:\t/Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_7.SpeechSequence(1).SpeechSequence.Text\n#: /Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_7.SpeechSequence(1).SpeechSequence.Text\nmsgctxt \"Dialogue_DO1Gate\"\nmsgid \"Are you sure that is what you just read?\"\nmsgstr \"¿Estás seguro de lo que acabas de leer esta correcto?\"\n\n#. Key:\t530C8841437C531647717B8B0BC07210\n#. SourceLocation:\t/Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_8.SpeechSequence(1).SpeechSequence.Text\n#: /Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_8.SpeechSequence(1).SpeechSequence.Text\nmsgctxt \"Dialogue_DO1Gate\"\nmsgid \"Nice try...\"\nmsgstr \"Buen intento...\"\n\n#. Key:\t543858DE49FD03BF4F94C3BA47912E5E\n#. SourceLocation:\t/Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_9.SpeechSequence(1).SpeechSequence.Text\n#: /Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_9.SpeechSequence(1).SpeechSequence.Text\nmsgctxt \"Dialogue_DO1Gate\"\nmsgid \"I have to practice my Dwarven a bit more...!\"\nmsgstr \"Tengo que practicar el lenguaje de los Enanos un poco más...!\"\n\n#. Key:\t5923FB9C4DC255ABAA6059B64B806802\n#. SourceLocation:\t/Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_6.SpeechSequence(3).SpeechSequence.Text\n#: /Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_6.SpeechSequence(3).SpeechSequence.Text\nmsgctxt \"Dialogue_DO1Gate\"\nmsgid \"I am going to open this door somehow.\"\nmsgstr \"Voy a abrir esta puerta de alguna manera.\"\n\n#. Key:\t7CF38D834DB6A7265EDE19AD158BFEBF\n#. SourceLocation:\t/Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_7.SpeechSequence(0).SpeechSequence.Text\n#: /Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_7.SpeechSequence(0).SpeechSequence.Text\nmsgctxt \"Dialogue_DO1Gate\"\nmsgid \"I want a Schnauser with my Wienerschnitzel\"\nmsgstr \"Quiero un Schnauser con mi Wienerschnitzel\"\n\n#. Key:\t86311C104780BDB8A170538987EF7226\n#. SourceLocation:\t/Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_8.SpeechSequence(0).SpeechSequence.Text\n#: /Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_8.SpeechSequence(0).SpeechSequence.Text\nmsgctxt \"Dialogue_DO1Gate\"\nmsgid \"And on the day the Ball is set free, the gate opens and happiness finds everyone...\"\nmsgstr \"Y el día que se libera la pelota, la puerta se abre y la felicidad nos encuentra a todos...\"\n\n#. Key:\tCD68B2244B57CA37D2940499F440149B\n#. SourceLocation:\t/Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_DO1Gate\"\nmsgid \"Associwhat?\"\nmsgstr \"¿Asociaque?\"\n\n#. Key:\tCE8E75E6422C068794CC91BDBA2C024A\n#. SourceLocation:\t/Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_6.SpeechSequence(2).SpeechSequence.Text\n#: /Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_6.SpeechSequence(2).SpeechSequence.Text\nmsgctxt \"Dialogue_DO1Gate\"\nmsgid \"Damn, my Dwarven is just not good enough, I have to practice a bit more...\"\nmsgstr \"Maldición, mi lenguaje de Enanos no es lo suficientemente bueno, tengo que practicar un poco más...\"\n\n#. Key:\tCED9C6ED4B792FA939C759A79E4AB028\n#. SourceLocation:\t/Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_6.SpeechSequence(0).SpeechSequence.Text\n#: /Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_6.SpeechSequence(0).SpeechSequence.Text\nmsgctxt \"Dialogue_DO1Gate\"\nmsgid \"There is sauerkraut in my Lederhosen\"\nmsgstr \"Hay sauerkraut en mi Lederhosen\"\n\n#. Key:\tEC493B624D127AB87692BC983023FF18\n#. SourceLocation:\t/Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_7.SpeechSequence(3).SpeechSequence.Text\n#: /Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_7.SpeechSequence(3).SpeechSequence.Text\nmsgctxt \"Dialogue_DO1Gate\"\nmsgid \"There must be a way to open this door...\"\nmsgstr \"Debe haber una manera de abrir esta puerta...\"\n\n#. Key:\t6F5AF3DD4E848650EE74449420A90A25\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/DwarvenCatacombs/DO1Tomb.DO1Tomb:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Wizard/DwarvenCatacombs/DO1Tomb.DO1Tomb:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_DO1Tomb\"\nmsgid \"These are the orders of the Chancellor of Dwartown, unjustly murdered by order of Duality.\"\nmsgstr \"Estas son las órdenes del Canciller de Dwartown, asesinadas injustamente por orden de la Dualidad.\"\n\n#. Key:\t949EBB7A4FCEA61BB9B3589CFCC53C2B\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/DwarvenCatacombs/DO1Tomb1.DO1Tomb1:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Wizard/DwarvenCatacombs/DO1Tomb1.DO1Tomb1:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_DO1Tomb1\"\nmsgid \"Here lies the testament of the order of Duality, justly murdered by the Chancellor of Dwartown's spirit.\"\nmsgstr \"Aquí yace el testamento del orden de la dualidad, justamente asesinado por el espíritu del canciller de Dwartown.\"\n\n#. Key:\t110A2E27493EBAD78EE6E1B16F56912A\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E3/E3_Start.E3_Start:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E3/E3_Start.E3_Start:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_E3_Start\"\nmsgid \"I survived the Unknown. I know how to use the Device, but...\"\nmsgstr \"Sobreviví lo Desconocido. Sé cómo usar el aparato, pero...\"\n\n#. Key:\t2CB853A540A2B5BFD268DEAA124CEAD0\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E3/E3_Start.E3_Start:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Ending/E3/E3_Start.E3_Start:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_E3_Start\"\nmsgid \"I need to choose one last time. Once and for all.\"\nmsgstr \"Necesito elegir por última vez. Para siempre.\"\n\n#. Key:\t416D47B6408622D8D01F61961C80ADD2\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E3/E3_Start.E3_Start:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E3/E3_Start.E3_Start:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_E3_Start\"\nmsgid \"I have already lost almost everything.\"\nmsgstr \"Ya he perdido casi todo.\"\n\n#. Key:\t75F863B843B253E3586DE991CDE546EA\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E3/E3_Start.E3_Start:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Ending/E3/E3_Start.E3_Start:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_E3_Start\"\nmsgid \"And here I am again. Is this how it will end?\"\nmsgstr \"Y aquí estoy otra vez. ¿Es así como terminará?\"\n\n#. Key:\t77BC194943A148967299F68B3522C696\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E3/E3_Start.E3_Start:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Ending/E3/E3_Start.E3_Start:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_E3_Start\"\nmsgid \"Do I really have to lose everyone I met in the Ruined Realm?\"\nmsgstr \"¿Realmente tengo que perder a todos los que conocí en el Reino Arruinado?\"\n\n#. Key:\tA50B792A4D68EC45BB9C3CBBF8836021\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E3/E3_Start.E3_Start:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Ending/E3/E3_Start.E3_Start:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_E3_Start\"\nmsgid \"Or would I only save them so that we can die together?\"\nmsgstr \"¿O solo los salvaría para que podamos morir juntos?\"\n\n#. Key:\tE43A08E14831EBDC50AFC0B4A3178817\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E3/E3_Start.E3_Start:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Ending/E3/E3_Start.E3_Start:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_E3_Start\"\nmsgid \"I can hear the people outside the tower. I don’t have much time.\"\nmsgstr \"Puedo escuchar a la gente afuera de la torre. No tengo mucho tiempo.\"\n\n#. Key:\t042B7F534C07B3EC75BA9BA8F0BA7926\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_5.Children(0).Children.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_5.Children(0).Children.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"Worthy?\"\nmsgstr \"¿Digno?\"\n\n#. Key:\t05E334DE42BAA89837B78B8F0F1CBD93\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"Get some rest and try again later.\"\nmsgstr \"Descansa un poco y vuelve a intentarlo más tarde.\"\n\n#. Key:\t0BD769F745B35A106C7C0A83F6F9F246\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"All right so you just teleported me to this... what is this place?\"\nmsgstr \"Muy bien, entonces me teletransportaste a esto... ¿qué es este lugar?\"\n\n#. Key:\t0C9ECC3745963AB1D1FB6487E97513F9\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_24.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_24.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"So right now this is the most proper place to test your Worthiness.\"\nmsgstr \"Así que en este momento este es el lugar más adecuado para evaluar su Valía.\"\n\n#. Key:\t1401CBDA425076C6AE74C9BF4558D8DD\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"You are not Worthy!\"\nmsgstr \"¡No eres digno!\"\n\n#. Key:\t21C3C1394F39821BC10FFFBE157AC5CF\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"Giving up is not an option.\"\nmsgstr \"Rendirse no es una opcion.\"\n\n#. Key:\t2E7222EA4858A0ADE9CE3C84CA27B993\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_5.Children(3).Children.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_5.Children(3).Children.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"Skip\"\nmsgstr \"Omitir\"\n\n#. Key:\t31BEA1764BA337B32B8038B31BE69C29\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"Farewell! I need to go now.\"\nmsgstr \"¡Adios! Tengo que ir ahora.\"\n\n#. Key:\t36B9EA924E623AFE9BF0B98402235EA4\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"Focus on the trial!\"\nmsgstr \"¡Céntrate en la Prueba!\"\n\n#. Key:\t4A4A86684E5C5742A70FE383461AD89C\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"Venture further down into the Sewer! You will find the answer.\"\nmsgstr \"¡Aventúrate más abajo en las Alcantarillas! Encontrarás la respuesta.\"\n\n#. Key:\t54CA97394FDC12D0370C54995094819E\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"This trial will test your limits!\"\nmsgstr \"¡Esta Prueba pondrá a prueba tus límites!\"\n\n#. Key:\t5D820AA647AE2540DE6C2D8D6F6BF88A\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_5.Children(4).Children.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_5.Children(4).Children.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"Give seat\"\nmsgstr \"Dar asiento\"\n\n#. Key:\t5F6629ED4E0857BBBA46ED9C51306215\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_5.Children(2).Children.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_5.Children(2).Children.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"Restore\"\nmsgstr \"Restaurar\"\n\n#. Key:\t618B587743F2F432D9D487AE0E909166\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"What?\"\nmsgstr \"¿Qué?\"\n\n#. Key:\t61D61006436DD6659A8846932697971A\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"Yes, you are!\"\nmsgstr \"¡Sí lo eres!\"\n\n#. Key:\t6225912A49C32068D10ADB9C31A6BA3E\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"Of course!\"\nmsgstr \"¡Por supuesto!\"\n\n#. Key:\t7DD5FF4D47DF6A461D44DDBA056A4100\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"I shall yield you to the right path!\"\nmsgstr \"¡Te llevaré al camino correcto!\"\n\n#. Key:\t8C3F3A364544B13A2C6687A99E6A792B\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"I'm fed up with your trial! Just teleport me back.\"\nmsgstr \"Estoy harto de tu Prueba! Teletransportarme de vuelta.\"\n\n#. Key:\t903D03CE41FD835E75059587288D9A1B\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_23.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_23.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"There used to be an Arena here to test the Adventurers of the Realm, but it has been flooded with water for a hundred years.\"\nmsgstr \"Solía haber una Plaza aquí para probar a los Aventureros del Reino, pero se ha inundado con agua durante cien años.\"\n\n#. Key:\t96C9A8DA496C0A8476E35AB942BE5EED\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"Am I Worthy?\"\nmsgstr \"¿Soy Digno?\"\n\n#. Key:\t9826B62E48A67772A1850CADF1A83729\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_5.Children(1).Children.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_5.Children(1).Children.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"Where are we?\"\nmsgstr \"¿Dónde estamos?\"\n\n#. Key:\t9A94E4FC46E3896BE05136A2A9EA4AF5\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_27.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_27.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"We don't have time for this now.\"\nmsgstr \"No tenemos tiempo para esto ahora.\"\n\n#. Key:\t9B9B02AF404F9B8B9D8722A9006FC907\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"These are the remnants of the Ancient Sewer.\"\nmsgstr \"Estos son los restos de la Antigua Alcantarilla.\"\n\n#. Key:\tAAB9F101475D1407B58BECB2DA5E508D\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"So how am I supposed to complete your Trial?\"\nmsgstr \"Entonces, ¿cómo se supone que debo completar tu Prueba?\"\n\n#. Key:\tAD3BADD6499C01410511E68C86F337C8\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"Your Worthiness has to be proven.\"\nmsgstr \"Tu Valía tiene que ser probada.\"\n\n#. Key:\tC0BA510B4875AD24C53663B01964B309\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"Go now, the Trial awaits you!\"\nmsgstr \"¡Ve ahora, la Prueba te espera!\"\n\n#. Key:\tC252181740C4E256EDEB29B6B552BDD2\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"I'm tired, I will need some time to recover.\"\nmsgstr \"Estoy cansado, necesitaré algo de tiempo para recuperarme.\"\n\n#. Key:\tCCD8D1DD4859B067482612A3A9F32C06\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_5.Children(5).Children.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_5.Children(5).Children.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"Leave\"\nmsgstr \"Salir\"\n\n#. Key:\tCE0C3EBD41F17E82F8CF0E8D5E5E9F17\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"The Worthiness is strong in this one...\"\nmsgstr \"La Valía esta fuerte en este...\"\n\n#. Key:\tD229B47146585D051BEFF493C53ED01B\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_26.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_26.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"Stop!\"\nmsgstr \"¡Detener!\"\n\n#. Key:\tF043B1BF47F617255071EC9DB44CB78A\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"You have proven yourself Worthy!\"\nmsgstr \"¡Te has demostrado digno!\"\n\n#. Key:\tFBBCA0E043F139F203D62DAD1599143E\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"Your Worthiness has been proven again!\"\nmsgstr \"¡Tu Valía ha sido probada otra vez!\"\n\n#. Key:\tFE4F99AC4F23760ADD203083CA1497E3\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_25.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_25.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"I have found a...\"\nmsgstr \"He encontrado un...\"\n\n#. Key:\t00AD8B3D44461E4DBF800F92DDF0C6F5\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_Gatekeeper_AfterBattle\"\nmsgid \"What?! I understand that for a new gate to open one would have to prove something, but... in this case... I accept that...\"\nmsgstr \"¡¿Qué?! Entiendo que para abrir una nueva puerta, uno tendría que probar algo, pero... en este caso... acepto que...\"\n\n#. Key:\t0EC6953C4F07CFF6B7A13A9BCF224550\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_Gatekeeper_AfterBattle\"\nmsgid \"Enough!\"\nmsgstr \"¡Suficiente!\"\n\n#. Key:\t237714F14DC3F9D33F10E6B7761E47C4\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_Gatekeeper_AfterBattle\"\nmsgid \"What a coincidence! I also happen to be heading in that direction.\"\nmsgstr \"¡Qué casualidad! También estoy yendo en esa dirección.\"\n\n#. Key:\t28054AA74F9CEA976E653ABF5A5F5695\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_Gatekeeper_AfterBattle\"\nmsgid \"You can pass.\"\nmsgstr \"Puedes pasar.\"\n\n#. Key:\t3D5BAB214968DBB31BE03EBE32B2DE6C\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_Gatekeeper_AfterBattle\"\nmsgid \"Farewell my Ball Lord! May the Great Gate open for you when the time comes!\"\nmsgstr \"¡Adiós, mi señor pelota! ¡Que la Gran Puerta se abra para ti cuando llegue el momento!\"\n\n#. Key:\t4D497F814F476FFA7F2A66A937EAFF3E\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_Gatekeeper_AfterBattle\"\nmsgid \"Noooooo...\"\nmsgstr \"Noooooo...\"\n\n#. Key:\t4FEA82084C2E2E09FE6699B2FB353E04\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_Gatekeeper_AfterBattle\"\nmsgid \"Could you just let me pass? Please?\"\nmsgstr \"¿Podrías dejarme pasar? ¿Por favor?\"\n\n#. Key:\t50005F6248946893250282B0B7D134F2\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_Gatekeeper_AfterBattle\"\nmsgid \"You have proved your Worthiness.\"\nmsgstr \"Has demostrado tu Valía.\"\n\n#. Key:\t601E1BAC4E9C7A93B7A97AA787C14027\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_Gatekeeper_AfterBattle\"\nmsgid \"Farewell, Keeper!\"\nmsgstr \"¡Adiós, Guardián!\"\n\n#. Key:\t758788864E716DB2EC9F57B3042DC129\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_Gatekeeper_AfterBattle\"\nmsgid \"Ask him to take you to Crossroad Cave.\"\nmsgstr \"Pídele que te lleve a la Cueva Cruce Caminos.\"\n\n#. Key:\t8170CF2C42A1894899BA98B33AB39A3F\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_Gatekeeper_AfterBattle\"\nmsgid \"Wait! What?\"\nmsgstr \"¡Espere! ¿Qué?\"\n\n#. Key:\t86B7E3D34F2206BB44B0F88001F9E8BA\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_Gatekeeper_AfterBattle\"\nmsgid \"Then if you accept, let the trial begin!\"\nmsgstr \"Entonces, si acepta, ¡comience la Prueba!\"\n\n#. Key:\tCC7215014B87E0910413F1AEECE0492F\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_Gatekeeper_AfterBattle\"\nmsgid \"Where do you want to go, Sir? Command me.\"\nmsgstr \"¿A dónde quiere ir, señor? Ordéname.\"\n\n#. Key:\tD5FBCE5C4C97766EF3A852A2D96D1D30\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_Gatekeeper_AfterBattle\"\nmsgid \"Crossroad Cave!\"\nmsgstr \"¡Cueva Cruce Caminos!\"\n\n#. Key:\tE0032A09440BDE56BFAF2CBDBCFA2074\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_Gatekeeper_AfterBattle\"\nmsgid \"So be it!\"\nmsgstr \"¡Que así sea!\"\n\n#. Key:\tE8148F28483300CCD24473A30C028235\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_Gatekeeper_AfterBattle\"\nmsgid \"Once you have proven Worthy.\"\nmsgstr \"Una vez que hayas demostrado que eres digno.\"\n\n#. Key:\t0BE62CA44198CAA4B4AF7D844B79EEC3\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_3.Children(2).Children.Text\n#. Key:\t17D2B5D7409FBE7F215265B5A8CBF8F8\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_21.Children(2).Children.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_21.Children(2).Children.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_3.Children(2).Children.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"Leave\"\nmsgstr \"Salir\"\n\n#. Key:\t2BFD355626080F0A003A025ABE793045\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_21.Children(0).Children.Text\n#. Key:\t2BFEA3D826080F0A003A025ABE79300B\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_3.Children(0).Children.Text\n#. Key:\t2C027C7626080F0A003A025ABE793F5F\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_18.Children(0).Children.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_18.Children(0).Children.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_21.Children(0).Children.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_3.Children(0).Children.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"Accept Challenge\"\nmsgstr \"Aceptar desafío\"\n\n#. Key:\t2EDD3BEF4707FD59FE1ACB9A105F7EFC\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_3.Children(1).Children.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_3.Children(1).Children.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"Give seat\"\nmsgstr \"Dar asiento\"\n\n#. Key:\t4E4229704C95B2C73050E1AF65A29847\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"Did you come back to prove yourself?\"\nmsgstr \"¿Has vuelto para demostrar que eres digno?\"\n\n#. Key:\t55B70B0345422648BB579C8D4E42FE86\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_18.Children(1).Children.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_18.Children(1).Children.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"Maybe later\"\nmsgstr \"Quizás más tarde\"\n\n#. Key:\t62E33EC84A508E57233A6A9AF6DCDFBC\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"Only if you prove yourself worthy one more time.\"\nmsgstr \"Solo si demuestras ser digno una vez más.\"\n\n#. Key:\t65A8C3BA420B4624960CBAB42930BB5F\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_13.Children(0).Children.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_13.Children(0).Children.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"Not fair\"\nmsgstr \"No es justo\"\n\n#. Key:\t688C407641B488D0FDC7F98D0F6CA826\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"Is that... is this really happening?\"\nmsgstr \"¿Es eso... esto realmente está sucediendo?\"\n\n#. Key:\t77A739594D7ADA997DD300A7EE270D8F\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"I have found a seat that fits your size.\"\nmsgstr \"He encontrado un asiento que se adapta a tu tamaño.\"\n\n#. Key:\t8C9BCD2044EE9C5F4826D0B5C5CE22D4\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"Now... are you ready to prove yourself?\"\nmsgstr \"Ahora... ¿estás listo para demostrar tu valía?\"\n\n#. Key:\t8E33C12A42E9EAEDC20CD3B97F3AF9B2\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"Yes, I can.\"\nmsgstr \"Sí, puedo.\"\n\n#. Key:\t91849BD64325E5B9D8A366921D4D1AA9\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"The best challenges were set aside just for you!\"\nmsgstr \"¡Los mejores desafíos se guardaron solo para ti!\"\n\n#. Key:\t97D5940549A753A94A9F5AB46CCE14AF\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"I myself shall test your worthiness.\"\nmsgstr \"Yo mismo pondré a prueba tu valía.\"\n\n#. Key:\t9A158FA74FF1D9F99F5477856927AC90\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"I will make no exceptions! Your generous act gave me back my spirit. From now on I pledge to perform my task even better.\"\nmsgstr \"¡No haré excepciones! Tu generoso acto me devolvió mi espíritu. De ahora en adelante, me comprometo a realizar mi tarea aún mejor.\"\n\n#. Key:\tA3863AD64404451005ECE392B123FFAE\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"Errr... maybe a bit later.\"\nmsgstr \"Errr... tal vez un poco más tarde.\"\n\n#. Key:\tAB2F0FFA45E0AF42B6035FA3D1F2D8DB\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"I am truly impressed. I will never forget about your kindness.\"\nmsgstr \"Estoy realmente impresionado Nunca me olvidaré de tu amabilidad.\"\n\n#. Key:\tB284259646C0236570CF489DDCD88A29\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"Are you ready to prove yourself?\"\nmsgstr \"¿Estás listo para demostrar tu valía?\"\n\n#. Key:\tB57F0D0442C167DADE576A9CBD2B3E96\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"Thank you! You can have this RuneStone as a compensation.\"\nmsgstr \"¡Gracias! Puede tener este PiedraRunica como compensación.\"\n\n#. Key:\tB5F8117A4514A4207059EF8CD1C59420\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"All right, let's do it!\"\nmsgstr \"¡Muy bien, hagámoslo!\"\n\n#. Key:\tC7DFED0F43E17F90C02E3D94D6F24200\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"What? Can't you just open that gate?\"\nmsgstr \"¿Qué? ¿No puedes simplemente abrir esa puerta?\"\n\n#. Key:\tCC1CBB8E4F710B337B3BCC8CB01DB8CE\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"Well that's very... kind of you, I guess.\"\nmsgstr \"Bueno, eso es muy... amable de su parte, creo.\"\n\n#. Key:\tDE0225744DA0777DC12392ABB187D653\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"Keeper! Can you open a Portal?\"\nmsgstr \"¡Guardián! ¿Puedes abrir un portal?\"\n\n#. Key:\tDF53D02F4A6CD307A559E5BADBEF22FA\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_13.Children(1).Children.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_13.Children(1).Children.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"You are welcome\"\nmsgstr \"De nada\"\n\n#. Key:\tF0A6481A46B5FC65944D35ABFE94FA7E\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_21.Children(1).Children.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_21.Children(1).Children.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"Give Seat\"\nmsgstr \"Dar asiento\"\n\n#. Key:\tFF3C850143B6609D7B1B878B8DEB8A13\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"This is your final trial.\"\nmsgstr \"Esta es la ultima prueba.\"\n\n#. Key:\t018CF7BC4272B09AF7B646B0F9B2EB11\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_55.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_55.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"How did it happen? How was everything destroyed?\"\nmsgstr \"¿Como paso? ¿Cómo se destruyó todo?\"\n\n#. Key:\t0BF674C94942E4E32FCB09BD7E7059B0\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_23.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_23.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"Those who stayed died.\"\nmsgstr \"Los que se quedaron murieron.\"\n\n#. Key:\t1BFE1DBE471281F60970F8BEBFDD6E40\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"It’s nice of the Mirror that he still remembers me. Could you give this flower to him to express my thankfulness?\"\nmsgstr \"Es bonito que el Espejo todavía me recuerde. ¿Podrías darle esta flor para expresarle mi agradecimiento?\"\n\n#. Key:\t2158D7A1470944D529FF138AB883DC10\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"Who lived in this Realm? Where are they now?\"\nmsgstr \"¿Quién vivió en este reino? ¿Dónde están ahora?\"\n\n#. Key:\t2CCCBA97402EEFD5248D929680B0FF01\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_26.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_26.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"What was the Realm like before?\"\nmsgstr \"¿Cómo era el Reino antes?\"\n\n#. Key:\t32DA4503499D5A01CB1E7DA7B51B4EB5\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_29.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_29.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"Majestic castles and towers up until the sky. The air fresh, the sun shining.\"\nmsgstr \"Majestuosos castillos y torres hasta el cielo. El aire fresco, el sol brillando.\"\n\n#. Key:\t35903E9F471EECEC779D879565E189B6\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_12.Children(1).Children.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_12.Children(1).Children.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"Who lived here?\"\nmsgstr \"Quien vivió aquí?\"\n\n#. Key:\t3AD2CA8148AA6397B3D8818063269D67\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_14.Children(1).Children.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_14.Children(1).Children.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"No way\"\nmsgstr \"No es posible\"\n\n#. Key:\t3D4AF37842FD602384F0C79F2949BD07\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_14.Children(0).Children.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_14.Children(0).Children.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"Of course\"\nmsgstr \"Claro\"\n\n#. Key:\t41B0D00048A85B7122834B8F731AA8B4\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_25.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_25.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"Ruin preserves them. They can’t get old and die. Some of them are still visiting these parts of the Realm, but they no longer know what they are looking for.\"\nmsgstr \"Ruin los conserva. No pueden envejecer y morir. Algunos de ellos todavía están visitando estas partes del Reino, pero ya no saben lo que están buscando.\"\n\n#. Key:\t47D0395F4DD63A6E2F68018719DC2CCD\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"Thank you!\"\nmsgstr \"¡Gracias!\"\n\n#. Key:\t57614F674FD8F9A5CF8CC0AFA4D57F37\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_12.Children(0).Children.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_12.Children(0).Children.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"Magic Mirror\"\nmsgstr \"Espejo Mágico\"\n\n#. Key:\t5B00385B409CA39C5F2AFDA0E75EC4A0\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"I'm not a postman. Find someone else!\"\nmsgstr \"No soy un cartero. ¡Busca a otro!\"\n\n#. Key:\t5C83B0604CB1616D07BE209C08AE57B6\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_27.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_27.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"It was a wonderful world, full of life and joy.\"\nmsgstr \"Era un mundo maravilloso, lleno de vida y alegría.\"\n\n#. Key:\t66409DBC4D55F6190D6F429F81CE7C0F\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_12.Children(2).Children.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_12.Children(2).Children.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"Realm's past\"\nmsgstr \"Reinos pasados\"\n\n#. Key:\t6728BD15433EBCF47B42DA8D84F3777C\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"I'll remember you!\"\nmsgstr \"¡Te recordaré!\"\n\n#. Key:\t764C9E864C4C345638C2A2B4019CE5FA\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"Sure, I will deliver the flower!\"\nmsgstr \"¡Claro, entregaré la flor!\"\n\n#. Key:\t7F42828D4976A3366581BE9E067F3982\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_24.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_24.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"Those who escaped changed in body and mind.\"\nmsgstr \"Los que escaparon cambiaron de cuerpo y mente.\"\n\n#. Key:\t858E8AD741D48CFB58B94ABA5A6FCE9A\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"No problem. It doesn’t matter anyway.\"\nmsgstr \"No hay problema. No importa de todos modos.\"\n\n#. Key:\t86DBF2164E3B1C4057320E8FC526AE5F\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_12.Children(3).Children.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_12.Children(3).Children.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"Cataclysm\"\nmsgstr \"Cataclismo\"\n\n#. Key:\t8C0E746A4C00A7B4792706A042588AA3\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_58.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_58.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"Until one day many of the imprisoned spirits broke loose from the golem bodies.\"\nmsgstr \"Hasta que un día muchos de los espíritus encarcelados se liberaron de los cuerpos de los golems.\"\n\n#. Key:\t8DCB54DC429D8E328B791FA18261EBE4\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_30.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_30.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"Until it was all gone.\"\nmsgstr \"Hasta que no quedaban mas.\"\n\n#. Key:\t933737274ACAC51A980A6985E9B985D2\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"I am here so that the past is not forgotten until the very end. Have some rest and remember!\"\nmsgstr \"Estoy aquí para que no se olvide el pasado hasta el final. ¡Descansa un poco y recuerda!\"\n\n#. Key:\t9A6C35C143F4B6845772D4AF6C4C6213\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_56.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_56.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"The Golem Makers went too far. They made thousands and thousands of golems.\"\nmsgstr \"Los Creadores de Golems fueron demasiado lejos. Hicieron miles y miles de golems.\"\n\n#. Key:\t9E254E4D4CA6D256A7EC8CA8ADC6EF19\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"Would you like to hear some other tales?\"\nmsgstr \"¿Te gustaría escuchar otros cuentos?\"\n\n#. Key:\tAC50E6794072B525FD9144AB9B722F74\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_57.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_57.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"They always cared about the new ones and forgot about the obsolete ones.\"\nmsgstr \"Siempre se preocuparon por los nuevos y se olvidaron de los obsoletos.\"\n\n#. Key:\tC03F20E6477984A6691145A40535FBBD\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_60.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_60.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"Is there anything else you want me to remember?\"\nmsgstr \"¿Hay algo más que quieras que recuerde?\"\n\n#. Key:\tC9E74A374ED9F47999AA56BD16466899\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"The streets were clear and bright, trees and flowers everywhere.\"\nmsgstr \"Las calles eran claras y brillantes, árboles y flores por todas partes.\"\n\n#. Key:\tCF0209FF4BC57A750F52F2B3CC710A6E\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"I think it likes you.\"\nmsgstr \"Creo que le gustas.\"\n\n#. Key:\tD11D82FA4AE733D55DCBA692A2A3C0C7\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"Now they are all gone.\"\nmsgstr \"Ahora se han ido todos.\"\n\n#. Key:\tD88C72AE460756D4B619D7B8F924C7BB\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"Oh, there were many: proud, wise, brave, clever and majestic.\"\nmsgstr \"Oh, había muchos: orgullosos, sabios, valientes, inteligentes y majestuosos.\"\n\n#. Key:\tDEA408E54892798F0112B0A92EE34D3A\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_12.Children(4).Children.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_12.Children(4).Children.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"Leave\"\nmsgstr \"Salir\"\n\n#. Key:\tEA384D06419AAB835765CF8D6ECE6495\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_59.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_59.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"They are what is now called Ruin. The power which is destroying the Realm.\"\nmsgstr \"Son lo que ahora se llama Ruin. El poder que está destruyendo el Reino.\"\n\n#. Key:\tED8571C94BCCF0F083CAD2A7439C10AA\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"I’ve met with a Magic Mirror who showed a picture of you.\"\nmsgstr \"Me encontré con un Espejo Mágico que me mostró una imagen de tí.\"\n\n#. Key:\tF5C7F8254D29767753AEA3AB446B9B6E\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"I've got to go now.\"\nmsgstr \"Tengo que irme ahora.\"\n\n#. Key:\tF9E140154471CC466095ADBFF652E94D\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"Ask if you need to know more. I'll remember.\"\nmsgstr \"Pregunte si necesita saber más. Lo recordare.\"\n\n#. Key:\t04527B3745611117185CC09C4CD9018E\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"That’s more like it!\"\nmsgstr \"¡Así me gusta!\"\n\n#. Key:\t11C31D4D4DFD60259D68FCB3CD8E641E\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_13.Children(2).Children.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_13.Children(2).Children.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"Retreat\"\nmsgstr \"Retirar\"\n\n#. Key:\t29C3FE594DDD364CEED5EA9304BFAC43\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"How can I prove that I'm worthy?\"\nmsgstr \"¿Cómo puedo demostrar que soy digno?\"\n\n#. Key:\t2BC9EBB6451DB66B7767F1A0B663A06D\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"That’s awful, let’s try it in a different tone.\"\nmsgstr \"Eso es horrible, probémoslo en un tono diferente.\"\n\n#. Key:\t2BD75DF026080F0A003A0178BE75C345\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"Behold traveler!\"\nmsgstr \"¡Espera viajero!\"\n\n#. Key:\t302884BD4A306FB9614C51AF4790FAE4\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_13.Children(0).Children.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_13.Children(0).Children.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"How to prove?\"\nmsgstr \"¿Cómo probarlo?\"\n\n#. Key:\t370AC3D04CB9F6E443CAC2A8E270F289\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"No problem I don't really want to pass that gate anyway.\"\nmsgstr \"No hay problema, realmente no quiero pasar por esa puerta de todos modos.\"\n\n#. Key:\t4E231ED94F0794AE6342A8A2C7644D51\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"I am the Gatekeeper. I will only open this door if you prove to be worthy.\"\nmsgstr \"Soy el guardián de la puerta. Solo abriré esta puerta si demuestras ser digno.\"\n\n#. Key:\t4F30265A4D22C52371CC8E9E188B2718\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"Open, now!\"\nmsgstr \"¡Abre ahora!\"\n\n#. Key:\t56B5D73646C6823598232BB3D2577305\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"Ask him to open the door.\"\nmsgstr \"Pídele que abra la puerta.\"\n\n#. Key:\t7A52E2E14341A8CDBD77A4A30DDA22E3\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_13.Children(1).Children.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_13.Children(1).Children.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"Please let me in\"\nmsgstr \"Por favor déjame entrar\"\n\n#. Key:\t835098BD4F5D14FAACF1209850607E04\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_15.Children(0).Children.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_15.Children(0).Children.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"Accept Challenge.\"\nmsgstr \"Aceptar Desafío.\"\n\n#. Key:\t83E15A3C46A1D2D4CE4FDDBE81130106\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"No way! Nobody can skip the Trial!\"\nmsgstr \"¡De ninguna manera! ¡Nadie puede saltar la Prueba!\"\n\n#. Key:\t86D9667C43253BBFFA43E4ABED24369B\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"Still not...\"\nmsgstr \"Todavía no...\"\n\n#. Key:\t94A0124A401BA0CD029255B7D01E087E\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"There is no turning back now. The Trial awaits you!\"\nmsgstr \"No hay vuelta atrás ahora. ¡La Prueba te espera!\"\n\n#. Key:\t964E5DC7491720F8C3EA53936CBC1DEA\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"The Trial will test you!\"\nmsgstr \"¡Tte pondrá a prueba!\"\n\n#. Key:\tA38AC02A4C258F538AC26686207D505F\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"...\"\nmsgstr \"...\"\n\n#. Key:\tABA8061E4F631608D712A0BDBC6D90D1\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"Ah, you can't speak! Hmm... Try now!\"\nmsgstr \"Ah, no puedes hablar! Hmm... ¡Pruébalo ahora!\"\n\n#. Key:\tDA4C66AB4F7798DAD95EC5B83D422A03\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"Could you just let me pass this time?\"\nmsgstr \"¿Podrías dejarme pasar solamente esta vez?\"\n\n#. Key:\tF09A0C3F4BEA6AFBC9EE52AEB6A740AB\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"Open that gate, Keeper!\"\nmsgstr \"¡Abre esa puerta, Guardián!\"\n\n#. Key:\tF32B1FEC4BB33670D336D28832F04312\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"I can only open this door for those who prove worthy.\"\nmsgstr \"Solo puedo abrir esta puerta para aquellos que demuestran ser dignos.\"\n\n#. Key:\tFB74F24C4B8C2E6B4368B19D77F71606\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"Please, open the...\"\nmsgstr \"Por favor, abra la...\"\n\n#. Key:\t0BAD4DEA4009823275249FB31070D002\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_7.Children(1).Children.Text\n#. Key:\t2F2169444BBDC9843E1B7DAEDE7F5104\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_4.Children(1).Children.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_4.Children(1).Children.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_7.Children(1).Children.Text\nmsgctxt \"Dialogue_GGGateKeeper2\"\nmsgid \"Leave\"\nmsgstr \"Salir\"\n\n#. Key:\t36FDC8384686644248F76B9EF8A22038\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_GGGateKeeper2\"\nmsgid \"Here we go again...\"\nmsgstr \"Ya empezamos otra vez...\"\n\n#. Key:\t3D7557464E3E19A1CF3447B555D4977D\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_GGGateKeeper2\"\nmsgid \"Well, of course.\"\nmsgstr \"Pues claro.\"\n\n#. Key:\t5463C10D4C56C2CD40338A9E5C33D995\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_GGGateKeeper2\"\nmsgid \"You know the rules.\"\nmsgstr \"Ya sabes las reglas.\"\n\n#. Key:\t6E1915BC4A79E949C10BDCAADDA1E481\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_7.Children(0).Children.Text\n#. Key:\tACC5EBF441036AE06D207281CBE054D9\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_4.Children(0).Children.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_4.Children(0).Children.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_7.Children(0).Children.Text\nmsgctxt \"Dialogue_GGGateKeeper2\"\nmsgid \"Accept Challenge\"\nmsgstr \"Aceptar desafío\"\n\n#. Key:\tA5CD165646DA7D531D23F7AAE5B0D701\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_GGGateKeeper2\"\nmsgid \"I mean: You shall not pass unless you prove yourself worthy!\"\nmsgstr \"Quiero decir: ¡No pasarás a menos que demuestres que eres digno!\"\n\n#. Key:\tBABC111D4B5743B296E6AD84659E1910\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_GGGateKeeper2\"\nmsgid \"You shall not pass!!\"\nmsgstr \"¡¡No pasarás!!\"\n\n#. Key:\tCAF6CA2C4159145B5FE684995956F155\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_GGGateKeeper2\"\nmsgid \"What?? I thought I will need to prove myself worthy.\"\nmsgstr \"¿¿Qué?? Pensé que tendré que demostrar que soy digno.\"\n\n#. Key:\t31B0B4214FE4324029BAB2A75CF7D1EA\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/GGSurviverNote.GGSurviverNote:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/GGSurviverNote.GGSurviverNote:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_GGSurviverNote\"\nmsgid \"'I made this statue to give me shelter from the Cataclysm. Only magic can keep it away.'\"\nmsgstr \"\\\"Hice esta estatua para protegerme del Cataclismo. Solo la magia puede mantenerlo alejado.\\\"\"\n\n#. Key:\t852F18354CA9C8D46192CBBD14A325F7\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/GGSurviverNote.GGSurviverNote:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/GGSurviverNote.GGSurviverNote:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_GGSurviverNote\"\nmsgid \"'Cerulean is still safe. I managed to steal the Gem to open the Gate but I can’t use it.'\"\nmsgstr \"\\\"Cerulean está a salvo. Logré robar la Gema para abrir la Puerta, pero no puedo usarla.\\\"\"\n\n#. Key:\tDF72F90C478E18CFE9211C85CEF9ECBF\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/GGSurviverNote.GGSurviverNote:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/GGSurviverNote.GGSurviverNote:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_GGSurviverNote\"\nmsgid \"'I am doomed.'\"\nmsgstr \"\\\"Estoy Condenado.\\\"\"\n\n#. Key:\t04737EC246700D406DAB46BE8091D09C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_1.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_1.Children(0).Children.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Sure\"\nmsgstr \"Seguro\"\n\n#. Key:\t09BB4D9F428A5390E5F2ABA019B3ACDC\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_34.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_34.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Help you?! This is a courthouse not some charity club!\"\nmsgstr \"¡¿Ayudarte?! ¡Este es un palacio de justicia, no un club de caridad!\"\n\n#. Key:\t0C7D87814BD76EAFE2DCB19B973F0D82\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_52.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_52.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"You know I heavily rely on my abacus. But being a ghost and all I can’t really use it.\"\nmsgstr \"Sabes, confío mucho en mi ábaco. Pero siendo un fantasma y todo me cuesta utilizarlo.\"\n\n#. Key:\t0E3535844D16D540C576AC9889D237C8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"I’m looking for three artefacts. Do you know anything about them?\"\nmsgstr \"Estoy buscando tres artefactos. ¿Sabes algo de ellos?\"\n\n#. Key:\t0EB00CBB41338DE6294D6EAC2DE999B4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Actually it’s kinda awesome!\"\nmsgstr \"¡En realidad es algo increíble!\"\n\n#. Key:\t158F86F04D0040AA3D2814A674252E45\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Returning again and again is not a crime but maybe we should reconsider the Law regarding this statement.\"\nmsgstr \"Volver una y otra vez no es un delito, pero tal vez deberíamos reconsiderar la Ley con respecto a esta declaración.\"\n\n#. Key:\t15D395F84D3DBC3CCBC74988369A74DA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_27.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_27.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"The Law says many things about being dad but nothing about being dead...\"\nmsgstr \"La Ley dice muchas cosas sobre ser papá, pero nada sobre estar muerto...\"\n\n#. Key:\t2487D3CC4FCE404BEC866287E2057B3F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"I can’t rest until the Case is solved.\"\nmsgstr \"No puedo descansar hasta que se resuelva el caso.\"\n\n#. Key:\t2D976CD148FB41389A53ED8E499822B4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_54.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_54.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Could you get me a ghost abacus?\"\nmsgstr \"¿Me podrías conseguir un ábaco fantasma?\"\n\n#. Key:\t2F25CC2042D67E3AFB6F3FB5E1DF624D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_38.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_38.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Sure whatever...\"\nmsgstr \"Si, lo que tu digas...\"\n\n#. Key:\t344253F4469C163E87496A97C193F0A8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_31.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_31.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"If you found her please escort her to the Room of the Law so that her vicious acts can be judged.\"\nmsgstr \"Si la encontraste, escóltala a la Sala de la Ley para que puedan juzgar sus actos viciosos.\"\n\n#. Key:\t34D243A343CDFEA68F2FAB88A4190464\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_5.Children(2).Children.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_5.Children(2).Children.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"You are dead\"\nmsgstr \"Estás muerto\"\n\n#. Key:\t367BD6CD40B7364D09A19A9F5F833937\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Could you help me? I'm forced into this Realm by a Wizard.\"\nmsgstr \"¿Usted me podría ayudar? Un Mago me obliga a entrar en este reino.\"\n\n#. Key:\t3BD4BD5742532C2DB9536F9540EA3D75\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_32.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_32.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Ah, even the World will be over sooner than all our cases.\"\nmsgstr \"Ah, incluso el mundo terminará antes que todos nuestros casos.\"\n\n#. Key:\t45882C3C4470919D71E321BF5E1183B9\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_56.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_56.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"I've made you a Ghost Abacus.\"\nmsgstr \"Te he hecho un ábaco fantasma.\"\n\n#. Key:\t482C838F4E946005A3E4CAAB80DFE37F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_35.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_35.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"And being a Wizard is strictly forbidden! If I manage to prove you have some connection with that criminal Wizard I will judge you as well!\"\nmsgstr \"¡Y ser un Mago está estrictamente prohibido! Si logro demostrar que tienes alguna conexión con ese Mago criminal, ¡también te juzgaré!\"\n\n#. Key:\t489CE6C840D8C3430F07FCBC8BAF3F6B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_23.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_23.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"The Law never writes it would be forbidden to be a walking ball. Therefore it is not a problem.\"\nmsgstr \"La Ley nunca ha escrito que estaría prohibido ser una pelota andante. Por lo tanto, no es un problema.\"\n\n#. Key:\t512723AF4B51C5A843BEACBEA5427877\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Staring like that is strictly forbidden!\"\nmsgstr \"¡Mirar así está estrictamente prohibido!\"\n\n#. Key:\t5215675A4B0974C8993858B9F5D6A404\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"The Case of the Gnome traveller. A really complicated one.\"\nmsgstr \"El caso del viajero gnomo. Uno muy complicado.\"\n\n#. Key:\t6922D9F143A5295C7C2D22A71EA4125B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_29.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_29.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Makes sense...\"\nmsgstr \"Tiene sentido...\"\n\n#. Key:\t74955E464A85ED006FF47894FD09BD28\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_4.Text\n#. Key:\tE7F9297B4FF3956A965042AA9D870A07\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_37.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_37.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"The Law says that.\"\nmsgstr \"La Ley dice eso.\"\n\n#. Key:\t74BCB9E04AB452BA2A11088F25DD2FED\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"I guess they forgot to tell you but work time is long over...\"\nmsgstr \"Supongo que se olvidaron de decírtelo, pero la hora del trabajo ha terminado hace tiempo...\"\n\n#. Key:\t74F34750433EF722E89F8F85A871CE1B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_59.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_59.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Take this as a reward!\"\nmsgstr \"¡Toma esto como recompensa!\"\n\n#. Key:\t766B27FA455983F70AE1F4BA56F4C1B3\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_57.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_57.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"How wondrous! I’m sure this will reduce my research time with years!\"\nmsgstr \"¡Qué maravilloso! ¡Estoy seguro de que esto reducirá años de tiempo de investigación!\"\n\n#. Key:\t784D8662443EA775B9554EAEB4C6CB8F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"You are guilty for bouncing too loudly! Just like my uncle...\"\nmsgstr \"¡Eres culpable de rebotar demasiado fuerte! Justo como mi tío...\"\n\n#. Key:\t791A095948CFB22CCAF59EAFC60D74EA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_0.SpeechSequence(1).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_0.SpeechSequence(1).SpeechSequence.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"We had to reread all the rules to find out if there is anything about this.\"\nmsgstr \"Tuvimos que releer todas las reglas para averiguar si hay algo al respecto.\"\n\n#. Key:\t7CBAE1084FC39423BBD706A9F939BB14\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"So what is this case you are working on?\"\nmsgstr \"Entonces, ¿en qué caso estás trabajando?\"\n\n#. Key:\t7DBA70D14A4EDDE22DABBBB75800865A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_5.Children(3).Children.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_5.Children(3).Children.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Help\"\nmsgstr \"Ayuda\"\n\n#. Key:\t7DDD963C45C30134FA79CEAA1834C270\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_1.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_1.Children(1).Children.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"No way\"\nmsgstr \"No es posible\"\n\n#. Key:\t7E1EAB78482CF915AF8A96BA8E0A47F1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Just give me some more time and I will prove that you are guilty.\"\nmsgstr \"Dame un poco más de tiempo y demostraré que eres culpable.\"\n\n#. Key:\t7E2FD8D443438BEFF933D1BA0F691A41\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_1.SpeechSequence(2).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_1.SpeechSequence(2).SpeechSequence.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Such a tragic death! Now I need to start everything from the beginning!\"\nmsgstr \"¡Qué muerte tan trágica! ¡Ahora necesito comenzar todo desde el principio!\"\n\n#. Key:\t7EA289C94C6CF1E43AE0B291AD0A1133\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_30.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_30.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Yes, she is a criminal for inhabiting the body of a cat. That is strictly forbidden!\"\nmsgstr \"Sí, ella es una criminal por habitar el cuerpo de un gato. Eso está estrictamente prohibido!\"\n\n#. Key:\t80596D1B4384F83D73655AB76B2FA2D0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Incorrect. It is not.\"\nmsgstr \"Incorrecto. No lo es.\"\n\n#. Key:\t81C42F5340469CBB4AD780B01E7F02F8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_5.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_5.Children(1).Children.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Case\"\nmsgstr \"Caso\"\n\n#. Key:\t830C84A74369239E2839638F8918E086\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_5.Children(4).Children.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_5.Children(4).Children.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Artefacts\"\nmsgstr \"Artefactos\"\n\n#. Key:\t9090EFE44CB8D7F54F996B970D9A97D2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Don’t disturb me!\"\nmsgstr \"¡No me molestes!\"\n\n#. Key:\t90F79FAC440FB22F0A6BFCABE0963454\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_33.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_33.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"That’s very likely.\"\nmsgstr \"Eso es muy probable.\"\n\n#. Key:\t9600587D4E3C5B6F2C120BBFB9D40D6A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"What?\"\nmsgstr \"¿Qué?\"\n\n#. Key:\t96945AA143EF1F1B7CE4C0B8EEE4096F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_51.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_51.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"All right I was just asking. It’s not forbidden. At least in this case.\"\nmsgstr \"Muy bien, solo preguntaba. No está prohibido Al menos en este caso.\"\n\n#. Key:\t970DBE99476C7799B4B803B2EECE7E95\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"You are dead. Isn’t that a problem?\"\nmsgstr \"Estás muerto. ¿No es eso un problema?\"\n\n#. Key:\t9B06B22F44D389959A3C99924145EAE7\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Do you know a girl called Lillian?\"\nmsgstr \"¿Conoces a una chica llamada Lillian?\"\n\n#. Key:\t9C1B37574F81FDF4D3F03890504E3490\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Well, to be honest it is.\"\nmsgstr \"Bueno, para ser honesto lo es.\"\n\n#. Key:\t9EE15BCA450900DEFFB839856BA78E09\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_55.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_55.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"I’ll see what I can do...\"\nmsgstr \"Veré lo que puedo hacer.\"\n\n#. Key:\t9F3FBDE041EA6FDB7B30ECA1547E49A0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_0.SpeechSequence(3).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_0.SpeechSequence(3).SpeechSequence.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"We almost finished the process when the Gnome Traveller died of waiting.\"\nmsgstr \"Casi terminamos el proceso cuando el Viajero Gnomo murió de tanto esperar.\"\n\n#. Key:\tA22CEEE34864BC25EECFF2BAED83789F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_18.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_18.Children(0).Children.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"It is\"\nmsgstr \"Lo es\"\n\n#. Key:\tA69BCEA14AD8A07AC8CC35871548973A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_5.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_5.Children(0).Children.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Give Abacus\"\nmsgstr \"Dar ábaco\"\n\n#. Key:\tA7B9690142A3832182C004A99797AB21\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_26.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_26.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"And how about being dead?\"\nmsgstr \"¿Y qué hay de estar muerto?\"\n\n#. Key:\tA7EDDDCF423FF086BC0D0A891D232C87\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_0.SpeechSequence(0).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_0.SpeechSequence(0).SpeechSequence.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"He asked for permission to use the Railway. Which is really unusual. Before him only dwarves used the Railways.\"\nmsgstr \"Pidió permiso para usar el ferrocarril. Lo cual es realmente inusual. Antes de él, solo los enanos usaban los Ferrocarriles.\"\n\n#. Key:\tA9FCBAD04E16A880C3E52AAA35864E35\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Respect the Law!\"\nmsgstr \"¡Respeta la Ley!\"\n\n#. Key:\tAA3210BC4B1C0875817CCDB5F4922AFA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_1.SpeechSequence(0).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_1.SpeechSequence(0).SpeechSequence.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"It’s not that simple. In his testament he asked us to bring his corpse home, on the railway.\"\nmsgstr \"No es tan sencillo. En su testamento nos pidió que trajéramos su cadáver a casa, en el ferrocarril.\"\n\n#. Key:\tAA9613C041229946AD0033806D77D398\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_49.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_49.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"What can I do for you?\"\nmsgstr \"¿Qué puedo hacer por ti?\"\n\n#. Key:\tB2D504404A8475C7EFB445AFDA8597A9\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_5.Children(6).Children.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_5.Children(6).Children.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Leave\"\nmsgstr \"Salir\"\n\n#. Key:\tB3A305B84320145E4C0437B7ED50C5B9\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_25.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_25.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"The Law doesn’t forbid walking for balls. I guess you are right then.\"\nmsgstr \"La Ley no prohíbe caminar por las pelotas. Supongo que tienes razón entonces.\"\n\n#. Key:\tB3E56D56494153D0C17355A59EC3F0E6\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Rest... err... work in peace!\"\nmsgstr \"Descansa... err... ¡trabaja en paz!\"\n\n#. Key:\tB69AD6FC4D8373491561CFBCF26C2397\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_1.SpeechSequence(3).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_1.SpeechSequence(3).SpeechSequence.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Could you help me?\"\nmsgstr \"¿Me podría ayudar?\"\n\n#. Key:\tBCFFF4F345E59362764C9AA6582C683C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_0.SpeechSequence(2).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_0.SpeechSequence(2).SpeechSequence.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"When we found out there are none, so we needed to create new rules. But for that we had to reread all the existing rules again.\"\nmsgstr \"Cuando descubrimos que no hay ninguno, necesitamos crear nuevas reglas. Pero para eso tuvimos que releer todas las reglas que ya existen otra vez.\"\n\n#. Key:\tC5FDD0A14882D8F74A97B1BD53AFD4FE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_36.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_36.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"I don’t. But keep in mind if they were stolen and you find them you have to give them to the Dwarven King.\"\nmsgstr \"Yo no. Pero ten en cuenta que si fueron robados y los encuentras, tienes que dárselos al Rey de los Enanos.\"\n\n#. Key:\tC81E287C4B4EF5B5E77E25A480FC2AEE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_18.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_18.Children(1).Children.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Not at all\"\nmsgstr \"Para nada\"\n\n#. Key:\tCCF4D5D04B8D4C57AAA75ABC5F9A1384\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_50.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_50.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"No, no, no! I have other things to do.\"\nmsgstr \"¡No no no! Tengo otras cosas que hacer.\"\n\n#. Key:\tCD5EF4DE4D29CC774EB5A69A8A65CD95\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_5.Children(5).Children.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_5.Children(5).Children.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Lillian\"\nmsgstr \"Lillian\"\n\n#. Key:\tCFC9A6294B4D0653CA9B3384CBD2BC29\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_58.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_58.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Thank you! Thank you!\"\nmsgstr \"¡Gracias! ¡Gracias!\"\n\n#. Key:\tCFEFA4DD4AFEF91C834684A49DFB5890\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_39.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_39.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"What crime did the Gnome commit?\"\nmsgstr \"¿Qué crimen cometió el Gnomo?\"\n\n#. Key:\tD83C186746373C67E8877594AA3523B8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_53.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_53.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"When I touch it my fingers slip past the abacus, I can’t move it.\"\nmsgstr \"Cuando lo toco, mis dedos traspasa el ábaco, no puedo moverlo.\"\n\n#. Key:\tE00518FA4279FE57E9640F9007E4BC35\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_44.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_44.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"I would call that case solved...\"\nmsgstr \"Yo llamaría a ese caso resuelto...\"\n\n#. Key:\tE8F4BE4848BE2E257972D09391B0F296\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_1.SpeechSequence(1).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_1.SpeechSequence(1).SpeechSequence.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"We decided that Gnomes can use the Railway, but how about Gnome Corpses? That’s a totally different issue.\"\nmsgstr \"Decidimos que los gnomos pueden usar el ferrocarril, pero ¿qué hay de los cadáveres de los gnomos? Esa es una cuestión totalmente diferente.\"\n\n#. Key:\tEB5B1E474DCFFCF9A38190B8FFAB7C50\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"I guess the same rules apply.\"\nmsgstr \"Supongo que se aplican las mismas reglas.\"\n\n#. Key:\tEB5BFBDC40E1D6A1D5C054AD8B6424FD\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_24.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_24.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Hmmm... Let me see...\"\nmsgstr \"Hmmm... déjame ver...\"\n\n#. Key:\tEF50A43049824F390D61A3A58D44185A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"And you are a walking ball. Isn’t that a problem?\"\nmsgstr \"Y tú eres una pelota que camina. ¿No es eso un problema?\"\n\n#. Key:\t01E5D5DE4524C5AECBE8DAA5A5C3047D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_111.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_111.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Fishy warns you! This path is dangerous! Turn back! Explore other places!\"\nmsgstr \"Fishy te advierte! ¡Este camino es peligroso! ¡Volver! ¡Explora otros lugares!\"\n\n#. Key:\t036B0B0E41C74704A5ED648091D58AB0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_65.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_65.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Long story short I almost reached the Outpost when my cargo went into a pothole and my wheel was broken.\"\nmsgstr \"En pocas palabras, casi llegué al Puesto Avanzado cuando mi cargamento entró en un bache y mi rueda se rompió.\"\n\n#. Key:\t03B6BE674D69EF12EB862EB77CDC7F57\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_97.Text\n#. Key:\t4475043D4A9CFD057ED34FBB9695EC86\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_113.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_113.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_97.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Then I will give it for 10 Gold Coins.\"\nmsgstr \"Pues te lo daré por 10 Monedas de Oro.\"\n\n#. Key:\t0405D11C4961CFB7941F0F9727F80EAD\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_108.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_108.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"9 Gold I won't go any lower!\"\nmsgstr \"9 Monedas de Oro ¡No bajaré más!\"\n\n#. Key:\t069FA4C94559002699885EACD6422FC7\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_115.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_115.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Such an insult! How dare you?\"\nmsgstr \"¡Qué insulto! ¿Cómo te atreves?\"\n\n#. Key:\t114F9B9345D0965FE6EFC592E29477FE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_54.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_54.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Wohoo! I have some really epic names just for you! Each name costs a Single Gold coin!\"\nmsgstr \"¡Wohoo! ¡Tengo algunos nombres realmente épicos solo para ti! ¡Cada nombre cuesta una sola moneda de oro!\"\n\n#. Key:\t1164C89641A9E4970985919C8E86936E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(5).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(5).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Help me?\"\nmsgstr \"¿Ayúdame?\"\n\n#. Key:\t11E01CA843185266C441ACBC460A5B06\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_39.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_39.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Do you really want to help me?\"\nmsgstr \"¿De verdad quieres ayudarme?\"\n\n#. Key:\t12F669184834CDC0466BA4A72BE38420\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Oh, you come to visit old Gnory again.\"\nmsgstr \"Oh, vienes a visitar al viejo Gnory de nuevo.\"\n\n#. Key:\t148C738E422B1C7889EF8CAEF1E6D115\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(7).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(7).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Lory\"\nmsgstr \"Lory\"\n\n#. Key:\t14A787EF447C5AD6579ADDB271BD9B7E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_54.Children(2).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_54.Children(2).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Warlorb\"\nmsgstr \"Warlorb\"\n\n#. Key:\t14F4A36B4D34364D1BBB2DAAFA745C41\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_SpeechSequence_0.SpeechSequence(1).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_SpeechSequence_0.SpeechSequence(1).SpeechSequence.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"I so hated them...\"\nmsgstr \"Los odiaba tanto...\"\n\n#. Key:\t162A7A25421FFB9B368D60A9BC76FD38\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Oh, the three artefacts! That sounds a bit too ambitious but after all, they can be quite a unique gift for a young ball lady.\"\nmsgstr \"¡Oh, los tres artefactos! Eso suena un poco ambicioso, pero después de todo, pueden ser un regalo único para una joven pelota.\"\n\n#. Key:\t166AAF5241332C7954631F9D568B227B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_46.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_46.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"For everything as well.\"\nmsgstr \"Para todo también.\"\n\n#. Key:\t19190B2142877E8CBB6F6D8FBB8D2DB1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_42.Text\n#. Key:\t39E546F34A9886487CD938A70468AEC6\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_59.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_42.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_59.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"What?\"\nmsgstr \"¿Qué?\"\n\n#. Key:\t1AF2DDE74542524EEF19CA9567CFBDAF\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_58.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_58.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"{name}? It still sounds a bit weird, but I think I might like it.\"\nmsgstr \"¿{nombre}?  Todavía suena un poco raro, pero creo que me gustará.\"\n\n#. Key:\t22D86B8644CA5BFD8D4CA593C5E3A271\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_54.Children(4).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_54.Children(4).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Dr. Ball\"\nmsgstr \"Dr. Pelota\"\n\n#. Key:\t2301BDF7421BB3665BED5F92074BB5A2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_84.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_84.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"I’ve found a wheel for you!\"\nmsgstr \"¡He encontrado una rueda para ti!\"\n\n#. Key:\t25502F154A957ECD33B65E879E65B48B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_56.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_56.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"That's sad. Come back when you have some!\"\nmsgstr \"Eso es triste. Vuelve cuando tengas unos cuantos!\"\n\n#. Key:\t27BF125B4C46E41F58FD45947F1F5CF8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_49.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_49.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Fishy is Fishy!\"\nmsgstr \"Fishy es Fishy!\"\n\n#. Key:\t294C4DCC4E8A3A07F15BC8B8C1934BB0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_36.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_36.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"I've got to go now!\"\nmsgstr \"¡Tengo que irme ahora!\"\n\n#. Key:\t29EEF2B44C1FAE2BBA7518A685FC99B0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"An elixir that makes you attractive to the lady... err... balls?\"\nmsgstr \"Un elixir que te hace atractivo para la dama... err... ¿pelotas?\"\n\n#. Key:\t2A8B24AE4D7C120048DEF2A76FD6D787\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(9).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(9).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Leave\"\nmsgstr \"Salir\"\n\n#. Key:\t2AC10A9B434CEADBA53C1F8C1DB0A26D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_41.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_41.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"I have some at my shop for sale!\"\nmsgstr \"¡Tengo algunos en mi tienda en venta!\"\n\n#. Key:\t2FCB0CE9458F40E2B6738B93937283D2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_107.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_107.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"See? And I have to listen to him all day!\"\nmsgstr \"¿Has visto? ¡Y tengo que escucharle todo el día!\"\n\n#. Key:\t303548794492148A0C7CE9961AB48C77\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_92.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_92.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"It's yours for 12 Gold Coins.\"\nmsgstr \"Es tuyo por solo 12 Monedas de Oro.\"\n\n#. Key:\t303B74844F6BC0691F880B970403BE91\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_106.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_106.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Then I will give it for 8 Gold Coins.\"\nmsgstr \"Pues te lo daré por 8 Monedas de Oro.\"\n\n#. Key:\t31FAEB004D0A1ED819BEF4BC369D9FD5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_51.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_51.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"I see one of your wagon wheels is broken.\"\nmsgstr \"Veo que una de sus ruedas de carreta está rota.\"\n\n#. Key:\t336F7E9E46DDE33326081E937EC0024A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Don’t care about Fishy. He can’t really speak and I’m not sure if he even understands himself.\"\nmsgstr \"No te preocupes por Fishy. Realmente no puede hablar y no estoy seguro de si se entiende a sí mismo.\"\n\n#. Key:\t339A52E04EF86F99DE9BCEAA78F29025\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_66.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_66.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"See you later!\"\nmsgstr \"¡Nos vemos más tarde!\"\n\n#. Key:\t34076BD4489E7C92D8DCB9BC1668B775\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_6.Text\n#. Key:\t5FC68B30456EA7BB5A381780426E2279\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_73.Text\n#. Key:\t89C71F00406C5A31D196B4994CEBBA22\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_50.Text\n#. Key:\t93A76F294E3B6B5AB77DD5A04E76F681\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_83.Text\n#. Key:\t9C69D11144FA077481C6C9865E6ED34A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_80.Text\n#. Key:\tA28EA457442D0820F3633A8ECACEDC75\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_76.Text\n#. Key:\tCC8A6DB3424E6813002643A97EFE6644\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_50.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_73.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_76.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_80.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_83.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Shut up Fishy!\"\nmsgstr \"Cállate Fishy!\"\n\n#. Key:\t365CB4EB4F04825B34F4ADB42F238552\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_85.Children(2).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_85.Children(2).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"12 Gold\"\nmsgstr \"12 Monedas de Oro\"\n\n#. Key:\t3E650BC4417E6A004AF4549F412B1AF4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_26.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_26.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Ehm, ehm...\"\nmsgstr \"Ehm, ehm...\"\n\n#. Key:\t3E904B7D4D5694B715AC268086A4DB2F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_78.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_78.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"I’ve met another merchant called Lory. Is she your sister you talked about?\"\nmsgstr \"Conocí a otro comerciante llamado Lory. ¿Es ella tu hermana de la que hablaste?\"\n\n#. Key:\t3EB6AD0C4D8896D36393BE878D3D641E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_100.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_100.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"What the holy Coins?! Now I'm getting angry!\"\nmsgstr \"¡¿Qué las monedas santas?! ¡Ahora me estoy enfadando!\"\n\n#. Key:\t43099059444ABE91D004D5992065A06F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_7.Text\n#. Key:\t5A2D69454EA8354F3DE4E6BB9D7BD912\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"And Fishy!\"\nmsgstr \"¡Y Fishy!\"\n\n#. Key:\t43602C93451F3A59EB067ABF7A525D41\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Fishy know about them!\"\nmsgstr \"Fishy sabe de ellos!\"\n\n#. Key:\t43C2553447FC63D25E26E79ACE5D7316\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_74.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_74.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"He was a good merchant, so he understood. Business is hard. I always say that for a fair price I would even sell myself.\"\nmsgstr \"Era un buen comerciante, así que lo entendió. El negocio es difícil. Siempre digo que por un precio justo me vendería a mi mismo.\"\n\n#. Key:\t477984834246057BF894629ABEA2F0CB\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_116.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_116.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"You know what? 9 Gold Coins! Take it or leave it that's my final offer!\"\nmsgstr \"¿Sabes que? ¡9 Monedas de Oro! ¡Llévatelo o déjalo, esa es mi ultima oferta!\"\n\n#. Key:\t477CBB8C451F6255A8A4FAAE8272F700\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_54.Children(5).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_54.Children(5).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Don't buy\"\nmsgstr \"No comprar\"\n\n#. Key:\t494F3D164E51E73CC76FD689BF2A4435\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_110.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_110.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Then I will give it for 9 Gold Coins.\"\nmsgstr \"Pues te lo daré por 9 Monedas de Oro.\"\n\n#. Key:\t4CBFFCE24BDAFBA592E846A4C6827F21\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_102.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_102.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"All right, you won. I will give it for 11 Gold Coins.\"\nmsgstr \"De acuerdo, has ganado. Te lo daré por 11 Monedas de Oro.\"\n\n#. Key:\t4D29AE254413D052D6FAA7AA259E2618\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_45.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_45.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"I see you do have a solution for everything.\"\nmsgstr \"Veo que tienes una solución para todo.\"\n\n#. Key:\t4EACFFA1414DBB56AA162789D34C76F2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_61.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_61.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Wow, that's magnificent!\"\nmsgstr \"Wow, ¡eso es magnífico!\"\n\n#. Key:\t4F5CF94B464ED01AB43521A56D7C3B13\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_53.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_53.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"I want to buy a new name!\"\nmsgstr \"¡Quiero comprar un nuevo nombre!\"\n\n#. Key:\t51F2252D44A1B1B8B407938C06378303\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Fishy know a poem.\"\nmsgstr \"Fishy sabe un poema.\"\n\n#. Key:\t540DEA6540589E8E9BD5789F708F1D95\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_85.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_85.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"How much do you charge for it?\"\nmsgstr \"¿Cuánto cobras por ello?\"\n\n#. Key:\t551FA87F4EC33961257CFBA46B24E39C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_25.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_25.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Oh, holy golden coins please no...\"\nmsgstr \"Oh, santas monedas de oro por favor no...\"\n\n#. Key:\t55C0627D41EBB98609EDA49E36CE00F3\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_87.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_87.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Tummm-dummm I would sell the whole World but who could possibly buy it?\\r\\nUhhh... Yes?\"\nmsgstr \"Tummm-dummm Vendería todo el mundo, pero ¿quién podría comprarlo?\\r\\nUhhh ... ¿si?\"\n\n#. Key:\t5977C80F49FF140CD397C1A3079F8A4C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_54.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_54.Children(1).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Ultimate Frisbee\"\nmsgstr \"Ultimate Frisbee\"\n\n#. Key:\t5D529690413CAE4F496DF4B7A3627528\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(6).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(6).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Broken wheel?\"\nmsgstr \"¿Rueda rota?\"\n\n#. Key:\t5D632016493E1D06116399A364FD3835\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_67.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_67.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Take care and don't spend Gold anywhere else!\"\nmsgstr \"¡Ten cuidado y no gastes Oro en ningún otro lugar!\"\n\n#. Key:\t5F1DF4B44C4E82D6A5FDB6BDF5172AEA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_96.Text\n#. Key:\t9592C2144A7237D49EC42E898AB73642\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_105.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_105.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_96.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"How about 10?\"\nmsgstr \"¿Qué tal 10?\"\n\n#. Key:\t6179A2AF43798114CFEE12900CDAF8CA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_60.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_60.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Good choice!\"\nmsgstr \"¡Buena decisión!\"\n\n#. Key:\t6185906046DAF51843A52FA2FE2CF5AC\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_101.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_101.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"11 Gold Coins! Take it or leave it that's my final offer!\"\nmsgstr \"¡11 Monedas de Oro! ¡Llévatelo o déjalo, esa es mi ultima oferta!\"\n\n#. Key:\t655C05DA44E2BCB7DCF0D38DFAD6182C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Let him tell the poem!\"\nmsgstr \"¡Déjale contar su poema!\"\n\n#. Key:\t68761B744A892F85CEDB19B8DD6D9649\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_SpeechSequence_0.SpeechSequence(2).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_SpeechSequence_0.SpeechSequence(2).SpeechSequence.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Then I found out there is a Dwarven Outpost here which is still populated.\"\nmsgstr \"Entonces descubrí que hay un puesto avanzado de los Enanos aquí que todavía está poblado.\"\n\n#. Key:\t6D8190E2491C99D14C4E37AA8F01E0BC\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"In Crossroad Cave the three are close.\\r\\nThough where exactly? This poem shows:\\r\\nFor the first one you need to be restless\\r\\nTo avoid the Catacomb death traps.\\r\\nFor the second you need to go down\\r\\nDeep until you reach the ancient fisher town.\\r\\nFor the third one go high and even higher,\\r\\nKeep on til you reach the never sleeping fire.\\r\\n\"\nmsgstr \"En Cueva Cruce Caminos los tres están cerca.\\r\\n¿Aunque dónde exactamente? Este poema muestra:\\r\\nPara el primero necesitas estar inquieto\\r\\nPara evitar las trampas de muerte Catacumba.\\r\\nPor el segundo necesitas bajar\\r\\nProfundo hasta llegar a la antigua ciudad de pescadores.\\r\\nPara el tercero ir más alto e incluso más alto,\\r\\nSigue hasta llegar al fuego que nunca duerme.\\n\"\n\n#. Key:\t6F09C2F74E536AB6E4E7D8941571FBDF\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Sure. Shut up Fishy!\"\nmsgstr \"Seguro. ¡Cállate Fishy!\"\n\n#. Key:\t720870EC444670FB23244D964497F883\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_SpeechSequence_1.SpeechSequence(1).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_SpeechSequence_1.SpeechSequence(1).SpeechSequence.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"However business is business. She is bad for business! Trading with my customers before they could get to me!\"\nmsgstr \"Sin embargo, los negocios son los negocios. Ella es mala para los negocios! ¡Negociar con mis clientes antes de que pudieran llegar a mí!\"\n\n#. Key:\t757069804B91FF89516ACDA0C1F59C6A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_103.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_103.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Arrrgh! Fishy please no more poems! My head aches.\"\nmsgstr \"¡Arrrgh! ¡Fishy por favor no cuentes más poemas! Me duele la cabeza.\"\n\n#. Key:\t75A193EA4F6A7EE92BA73D809247B1A1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_62.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_62.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Dr. who? Oh, see, Dr. Ball.\"\nmsgstr \"¿Dr. quien? Oh, ya veo, Dr. Pelota.\"\n\n#. Key:\t75EADAAB4ACE4E6ECE45BFA6611ED77A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_85.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_85.Children(0).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"8 Gold\"\nmsgstr \"8 Monedas de Oro\"\n\n#. Key:\t7657DDE7438385D8BCC4B08B2BB5881A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_SpeechSequence_0.SpeechSequence(0).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_SpeechSequence_0.SpeechSequence(0).SpeechSequence.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"It all started when I was back with my family. Oh, those peaceful moments!\"\nmsgstr \"Todo comenzó cuando volví con mi familia. ¡Oh, esos momentos de paz!\"\n\n#. Key:\t778E6A484D8669761018F38DF326C125\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_90.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_90.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"It's yours for 8 Gold Coins.\"\nmsgstr \"Es tuyo por 8 Monedas de Oro.\"\n\n#. Key:\t7A09AFFF435CC002F0B75989307D7791\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Well met dear err... traveler! How can a humble gnome merchant like me be at your service?\"\nmsgstr \"¡Bienvenido querido err... viajero! ¿Cómo puede un humilde gnomo comerciante como yo estar a su servicio?\"\n\n#. Key:\t7E964EEC4406A06910B333A0F282360A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_70.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_70.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Sure! She is the lovely lady ball for whom you would like to buy a precious present, right?\"\nmsgstr \"¡Seguro! Ella es la encantadora pelota para quien le gustaría comprar un regalo precioso, ¿verdad?\"\n\n#. Key:\t85D756624371CC3B3A37FC84C111DBB0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_54.Children(3).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_54.Children(3).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Sorbcerer\"\nmsgstr \"Hechicero\"\n\n#. Key:\t86C8F9B74B869FF4D34CF586AB5AC25E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_20.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_20.Children(1).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Shut up!\"\nmsgstr \"¡Cállate!\"\n\n#. Key:\t8701305446A6E0F5E5EA5F86B823273D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Shut up both of you!\"\nmsgstr \"¡Cállate a los dos!\"\n\n#. Key:\t878BA65D462254D8A0FD36BA541E8C70\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_27.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_27.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"The three artefacts - by Fishy:\"\nmsgstr \"Los tres artefactos - por Fishy:\"\n\n#. Key:\t8A136EF74C7DE15BFBC664B8447366F1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(2).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(2).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"I need a name\"\nmsgstr \"Necesito un nombre\"\n\n#. Key:\t8C25603A4AE5F2D6294551AD2BA6322D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_40.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_40.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Of course! Are you lost in this hollow realm? Disappointed in all creature kind? Searching for a helpful hand? Not anymore!\"\nmsgstr \"¡Por supuesto! ¿Estás perdido en este reino vacío? ¿Decepcionado en todo tipo de criaturas? ¿Buscando una mano útil? ¡Ya no!\"\n\n#. Key:\t90F345C4482C46F4B1CD43B20F01B2B6\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_54.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_54.Children(0).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Epic Sphero\"\nmsgstr \"Sphero Épico\"\n\n#. Key:\t92F1D4A84B3609FDE38C82AD5A314554\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_72.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_72.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"And Fishy is the primitive monster.\"\nmsgstr \"Y Fishy es el monstruo primitivo.\"\n\n#. Key:\t9574E444465834A7D15565A14C7E0F1D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_SpeechSequence_0.SpeechSequence(5).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_SpeechSequence_0.SpeechSequence(5).SpeechSequence.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"My sister sold my brother, so I had enough money to set out.\"\nmsgstr \"Mi hermana vendió a mi hermano, así que tuve suficiente dinero para salir.\"\n\n#. Key:\t976FD7AB4B31747EF35E3EBE9C82471F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_69.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_69.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Do you know a girl called Lillian?\"\nmsgstr \"¿Conoces a una chica llamada Lillian?\"\n\n#. Key:\t9851A2064648DE26EF4501961D721109\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_68.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_68.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Wake up! He is back!\"\nmsgstr \"¡Despierta! ¡ha vuelto!\"\n\n#. Key:\t99CDA18D43B5FC74E152888E674B743C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_30.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_30.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Let’s talk about something else.\"\nmsgstr \"Hablemos de otra cosa.\"\n\n#. Key:\t9A5056F7472381107ACF5F849A322947\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_64.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_64.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Bye!\"\nmsgstr \"¡Adiós!\"\n\n#. Key:\t9B4816554539F6616741FC8A6651FEDD\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_SpeechSequence_1.SpeechSequence(2).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_SpeechSequence_1.SpeechSequence(2).SpeechSequence.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"I will tell her what I think about this that’s for sure!\"\nmsgstr \"¡Le diré lo que pienso sobre esto te lo aseguro!\"\n\n#. Key:\t9FD161AC488FFD8D9C6BCAB518A6DFCA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_86.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_86.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Hello again!\"\nmsgstr \"¡Hola de nuevo!\"\n\n#. Key:\t9FFADAA44EE730442CFD76BBD942F478\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_38.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_38.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Fare thee well!\"\nmsgstr \"¡Que te vaya bien!\"\n\n#. Key:\tA0E3F7B44422A97F22E1FCB315DC498A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_48.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_48.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Who are you by the way?\"\nmsgstr \"¿Quién eres por cierto?\"\n\n#. Key:\tA3EE773446B69B8D37851BAFAD607A9F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_24.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_24.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Forget your artefacts I have plenty of other valuable items instead!\"\nmsgstr \"Olvida tus artefactos. ¡Tengo otros artículos valiosos!\"\n\n#. Key:\tA557A981439B7A1B4AA803941A8D6794\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_23.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_23.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"I guess you don’t know where they are...\"\nmsgstr \"Supongo que no sabes dónde están...\"\n\n#. Key:\tA571474F44F33104D2F93386A5C4009C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_75.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_75.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Yet no one ever wanted to buy him for a single copper coin.\"\nmsgstr \"Sin embargo, nadie quería comprarle por una sola moneda de cobre.\"\n\n#. Key:\tA67ADB3143798188EF7C1F8D4E59690C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_88.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_88.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Uhhh... Yes?\"\nmsgstr \"Uhhh... ¿si?\"\n\n#. Key:\tA69D35084A31B957410EF889ED0EC4A4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_57.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_57.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Yes, yes that's it!\"\nmsgstr \"Si, si eso es!\"\n\n#. Key:\tAD70372E4A5B0594635FBBBE30CA53F1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_91.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_91.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"It's yours for 10 Gold Coins.\"\nmsgstr \"Es tuyo por 10 Monedas de Oro.\"\n\n#. Key:\tAE2E742F4A087974019D8F810FF97A2E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_104.Children(0).Children.Text\n#. Key:\tB59E143642BBE2D677AA6F97B46C3C06\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_105.Children(0).Children.Text\n#. Key:\tF0726C6B4F8F780C341F319D08E20CF9\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_96.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_104.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_105.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_96.Children(0).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Ok\"\nmsgstr \"Ok\"\n\n#. Key:\tAF7B14B241CED9B8BE3F23BC8C857A9A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_82.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_82.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Now you can imagine those peaceful moments when they were all together.\"\nmsgstr \"Ahora puedes imaginar esos momentos pacíficos cuando estaban todos juntos.\"\n\n#. Key:\tB2F8DA594F1A58E8B2FCC7B16C368E21\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"What... uhhh... me?\"\nmsgstr \"¿Qué... uhhh... yo?\"\n\n#. Key:\tBA5B75CD4087B53BB682CD97021FF821\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(3).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(3).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Artefacts\"\nmsgstr \"Artefactos\"\n\n#. Key:\tBBB67671475F19135DCD57AF771F0D85\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_43.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_43.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Helpful hands of course and all kind of stuffs. Equip yourself. Once you get rid of all your gold, you won’t be alone anymore...\"\nmsgstr \"Manos útiles, por supuesto, y todo tipo de cosas. Equípate a ti mismo. Una vez que te deshagas de todo su oro, no estarás solo más...\"\n\n#. Key:\tBD1AF6114DA5840A340F8DA65B7F59D2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_SpeechSequence_1.SpeechSequence(0).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_SpeechSequence_1.SpeechSequence(0).SpeechSequence.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Yes, she is my beloved sister!\"\nmsgstr \"¡Sí, ella es mi querida hermana!\"\n\n#. Key:\tBE8F496743A57B5F1AF81B8D48F128FE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Hello there!\"\nmsgstr \"¡Hola!\"\n\n#. Key:\tBFA7C31A4443A6C89DB61D8556D62FCD\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(0).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Trade\"\nmsgstr \"Comerciar\"\n\n#. Key:\tC29FF9914C8C1F479E9F7BAB338B067A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_77.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_77.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"If you could bring me a new wheel I would pay for it with shiny Gold coins!\"\nmsgstr \"¡Si pudieras traerme una rueda nueva, Te lo pagaría con brillantes Monedas de Oro!\"\n\n#. Key:\tC5077FC14569C44087272C9E9DE07992\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_34.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_34.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Ok, I’ve got it.\"\nmsgstr \"Ok, lo tengo.\"\n\n#. Key:\tC6F3C52D4719CE471B6EEB90FCE94E3B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_55.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_55.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Unfortunately I don't have enough gold.\"\nmsgstr \"Lamentablemente no tengo suficiente oro.\"\n\n#. Key:\tCA1E8A5D4C07A81975C4B4B00572A0C8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_94.Text\n#. Key:\tDB9C0DB146BBE1DFC28F929A37C4408A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_93.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_93.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_94.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Ha-ha-ha! You must be kidding that's ridiculously high!\"\nmsgstr \"¡Jajaja! ¡Debes estar bromeando, eso es ridículamente alto!\"\n\n#. Key:\tCB792FAD45F78755935423A5219271FC\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_98.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_98.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"9 Gold I won't go any higher!\"\nmsgstr \"9 Monedas de Oro ¡No subiré más!\"\n\n#. Key:\tCE99919C42EC2315EC5B33900FBC09C4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_95.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_95.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"That’s not fair. It would be a shame on me if I just robbed you like that!\"\nmsgstr \"No es justo. ¡Sería una pena para mí si te robara así!\"\n\n#. Key:\tD090388E4529CEC2D70899B520973064\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(4).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(4).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Who are you?\"\nmsgstr \"¿Quién eres?\"\n\n#. Key:\tD0AA81A247BE4979A774F3B6095BB820\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_33.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_33.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"I am Gnory, traveler merchant. I wander the world, seeking rare items, secrets beneath dark doors, revealing truth of forg...\"\nmsgstr \"Soy Gnory, comerciante viajero. Vago por el mundo, buscando objetos raros, secretos debajo de puertas oscuras, revelando verdades en cuentos olvi...\"\n\n#. Key:\tD23C65EB4F39580A06045FADE2BCD713\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_81.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_81.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"She saw our Realm through cat eyes,\\r\\nThe living fire, the dead ice.\\r\\nShe cared, she took care of us all.\\r\\nWhat was ruined she made it whole.\\r\\nThen she left us, this is how it ended.\\r\\nHer own Realm also needed to be mended.\\r\\n\"\nmsgstr \"Ella vio nuestro Reino a través de ojos de gato,\\r\\nEl fuego vivo, el hielo muerto.\\r\\nElla se preocupaba, nos cuidaba a todos.\\r\\nLo arruinado lo hizo entero.\\r\\nLuego nos dejó, así es como terminó.\\r\\nSu propio Reino también necesitaba ser reparado.\\n\"\n\n#. Key:\tD30843A14519A490FEE89E82E3CB6735\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"I’m looking for three artefacts.\"\nmsgstr \"Estoy buscando tres artefactos.\"\n\n#. Key:\tD9B70A6A453A11FD2115FFB25CCFF195\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_54.Children(6).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_54.Children(6).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Not enough gold\"\nmsgstr \"Insuficiente oro\"\n\n#. Key:\tDB8982994F2BFF510A6A2EA1D40C68C6\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_37.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_37.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Good bye!\"\nmsgstr \"¡Adiós!\"\n\n#. Key:\tDC20CC924E5F898E715B668416678CA1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_104.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_104.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"How about 8?\"\nmsgstr \"¿Qué tal 8?\"\n\n#. Key:\tDC989DED42077EBA3313C69150BB33F0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_63.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_63.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"That's a weird name I have to admit.\"\nmsgstr \"Es un nombre extraño debo admitir.\"\n\n#. Key:\tDEC95D494680878D544FF49DACBDEE4F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_114.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_114.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"11 Gold I won't go any lower!\"\nmsgstr \"11 Monedas de Oro ¡No bajaré más!\"\n\n#. Key:\tDF7B371841495C5FB98800BCF44B7C5B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_52.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_52.Children(1).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Skip yack-yack\"\nmsgstr \"Omitir balh-blah\"\n\n#. Key:\tE1322541414052606F718FBF9B68D4B0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_79.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_79.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Fishy know her.\"\nmsgstr \"Fishy la conoce.\"\n\n#. Key:\tE3D668304EE4C7C2E77F3E9AF47CB84E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_SpeechSequence_0.SpeechSequence(4).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_SpeechSequence_0.SpeechSequence(4).SpeechSequence.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Fortunately I had a loving family I could always count on. Since they are all merchants, they could easily help me out.\"\nmsgstr \"Afortunadamente tenía una familia sana con la que siempre podía contar. Son todos comerciantes, me podrían ayudarme fácilmente.\"\n\n#. Key:\tE5031E774F81A45ECB4731BC114AD2E2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_109.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_109.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"All right, no need to get angry! I can give you 9 Gold for it.\"\nmsgstr \"Muy bien, no hay necesidad de enfadarse! Puedo darte 9 de Oro por ello.\"\n\n#. Key:\tEBE094644F9C8DCEE025FDBF8346AD47\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_44.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_44.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"...with your problem.\"\nmsgstr \"... con tu problema.\"\n\n#. Key:\tEC93512B48219F6BA6DDF5A3F100C19A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Show me what you have for sale!\"\nmsgstr \"¡Muéstrame lo que tienes en venta!\"\n\n#. Key:\tECF244164CDD4A29C96BBD8E13688FE7\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(1).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Sell Wheel\"\nmsgstr \"Vender Rueda\"\n\n#. Key:\tED410B224B09EFF36ED2AC9752AD59DA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_71.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_71.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"No, she is...\"\nmsgstr \"No, ella es...\"\n\n#. Key:\tEDE4BF2D448CAFEF217C5E86885A7E81\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_117.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_117.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"All right, you won. I will give it for 9 Gold Coins.\"\nmsgstr \"De acuerdo, has ganado. Te lo daré por 9 Monedas de Oro.\"\n\n#. Key:\tEEA209E84766D4AF2BD804A7BA11F111\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_85.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_85.Children(1).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"10 Gold\"\nmsgstr \"10 Monedas de Oro\"\n\n#. Key:\tEEE19423423A24146446EEBEB04FAEE9\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"I’m on a quest to find...\"\nmsgstr \"Estoy en una misión para encontrar...\"\n\n#. Key:\tF53E6D3443D37DA82663D2976AA90A85\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_20.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_20.Children(0).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Poem?\"\nmsgstr \"¿Poema?\"\n\n#. Key:\tF61EDE3940F24B15BE57D8B5A5AC5570\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_99.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_99.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Deal! Here you go!\"\nmsgstr \"¡De acuerdo! ¡Aquí tienes!\"\n\n#. Key:\tF6A527234B894C18C0778C918EB1BA4E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_89.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_89.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Welcome back!\"\nmsgstr \"¡Bienvenido de nuevo!\"\n\n#. Key:\tF93CBC6640AF6143C7D1C5AA6F8C4ADF\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_52.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_52.Children(0).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Go on\"\nmsgstr \"Sigue\"\n\n#. Key:\tF9EA93DE4B341581745785A7371F797A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(8).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(8).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Lillian\"\nmsgstr \"Lillian\"\n\n#. Key:\tFE3C4C72489A909B4D9F76A483D293AE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_SpeechSequence_0.SpeechSequence(3).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_SpeechSequence_0.SpeechSequence(3).SpeechSequence.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"This was my chance to make a hit as a merchant but I didn’t have the resources for a journey this long.\"\nmsgstr \"Esta fue mi oportunidad de ser éxitoso como comerciante, pero no tuve los recursos para un viaje tan largo.\"\n\n#. Key:\tFEF58E5B4FB18D128640689499752F75\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_29.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_29.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Do you call this a poem? Pathetic! Hardly any info and what a miserable structure! Shame on you Fishy!\"\nmsgstr \"¿Llamas a esto un poema? ¡Patético! ¡Casi ninguna información y qué estructura tan miserable! ¡Qué vergüenza Fishy!\"\n\n#. Key:\tFF66071643E10E94DEFF70B8E20876EE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_52.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_52.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"That's a long and sad story...\"\nmsgstr \"Esa es una historia larga y triste...\"\n\n#. Key:\t1EA717114DFEF4490F58829C2F96566A\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/HW_Candlestick.HW_Candlestick:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E2/HW_Candlestick.HW_Candlestick:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_HW_Candlestick\"\nmsgid \"Even after mom passed the servants kept lighting the candles.\"\nmsgstr \"Incluso después de que mamá murió, los sirvientes seguían encendiendo las velas.\"\n\n#. Key:\t94195B6E4157A1A8BD74BE9224AEED42\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/HW_Candlestick.HW_Candlestick:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E2/HW_Candlestick.HW_Candlestick:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_HW_Candlestick\"\nmsgid \"After Mom got sick she really feared darkness.\"\nmsgstr \"Después de que mamá se enfermó, empezó a temer la oscuridad.\"\n\n#. Key:\tEF9668BF44D4A52E46ACEA8B82011137\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/HW_Candlestick.HW_Candlestick:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Ending/E2/HW_Candlestick.HW_Candlestick:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_HW_Candlestick\"\nmsgid \"We always needed to light the hallway.\"\nmsgstr \"Siempre necesitábamos iluminar el pasillo.\"\n\n#. Key:\t2EECB3024693C7F0EA176BB100D6779A\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/HW_Exit.HW_Exit:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E2/HW_Exit.HW_Exit:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_HW_Exit\"\nmsgid \"This door was really rusty.\"\nmsgstr \"Esta puerta estaba muy oxidada.\"\n\n#. Key:\t3C6E4A1C41A7EACE15C101A65BBE997A\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/HW_Exit.HW_Exit:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Ending/E2/HW_Exit.HW_Exit:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_HW_Exit\"\nmsgid \"I had to do something with it otherwise Father would have heard me.\"\nmsgstr \"Tenía que hacer algo con eso, de lo contrario, Papa me hubiera escuchado.\"\n\n#. Key:\t8F63CC8C44D8F8432A66E6B65EC10AF5\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/HW_Exit.HW_Exit:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E2/HW_Exit.HW_Exit:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_HW_Exit\"\nmsgid \"I used oil on this rusty door. I didn’t want to be heard.\"\nmsgstr \"Usé aceite en esta puerta oxidada. No quería que me escucharan.\"\n\n#. Key:\t55E7DD2B4C3D8852EC4A64AF44443BDA\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/HW_Explosion.HW_Explosion:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Ending/E1/HW_Explosion.HW_Explosion:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_HW_Explosion\"\nmsgid \"What was this? I have to go back to check what happened!\"\nmsgstr \"¿Que era esto? ¡Tengo que volver para ver qué pasó!\"\n\n#. Key:\t8060689940824917F595BF84B4E95A46\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/HW_FRDoor.HW_FRDoor:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E2/HW_FRDoor.HW_FRDoor:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_HW_FRDoor\"\nmsgid \"I always wondered why.\"\nmsgstr \"Siempre me pregunté por qué.\"\n\n#. Key:\t816B603341386CF6BB3ADCAAD21D68A3\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/HW_FRDoor.HW_FRDoor:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E2/HW_FRDoor.HW_FRDoor:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_HW_FRDoor\"\nmsgid \"Father moved to his workroom and sealed this door.\"\nmsgstr \"Padre se mudó a su taller y selló esta puerta.\"\n\n#. Key:\t125DACD243EA6EBCE76D8CB9F681C727\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/HW_MRDoor.HW_MRDoor:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E2/HW_MRDoor.HW_MRDoor:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_HW_MRDoor\"\nmsgid \"I felt I should have a last look before I go.\"\nmsgstr \"Sentí que debería echar un último vistazo antes de irme.\"\n\n#. Key:\tE8250D43437C1B1D45637F9499D20936\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/HW_MRDoor.HW_MRDoor:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E2/HW_MRDoor.HW_MRDoor:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_HW_MRDoor\"\nmsgid \"Mom’s room looked just like it was when she was still alive.\"\nmsgstr \"La habitación de mamá se ve igual que cuando aún estaba viva.\"\n\n#. Key:\tE0BB63A74E94DA1B327B11BB781EB4DB\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/HW_Painting.HW_Painting:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E2/HW_Painting.HW_Painting:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_HW_Painting\"\nmsgid \"Mom made this painting before she met Father.\"\nmsgstr \"Mamá hizo este cuadro antes de conocer a Papa.\"\n\n#. Key:\tEAD0C13D4BF1D35BDAEC14A3F25901F5\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/HW_Stairs.HW_Stairs:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E2/HW_Stairs.HW_Stairs:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_HW_Stairs\"\nmsgid \"I had to go really softly otherwise Father would have heard me.\"\nmsgstr \"Tenía que ir muy suavemente, sino Papa me hubiera escuchado.\"\n\n#. Key:\t0494D36047DDCE114A43C9901618D32B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_44.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_44.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Unfortunately I don't know where you can find them.\"\nmsgstr \"Lamentablemente no sé dónde puedes encontrarlos.\"\n\n#. Key:\t0C3E31854B0EB053EABAD4B9DC3D8E60\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_57.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_57.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"That’s a serious threat, I have to admit.\"\nmsgstr \"Es una amenaza seria, debo admitirlo.\"\n\n#. Key:\t0C7C89EB4E610752FBE119AA32B99F8B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_34.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_34.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Yes I know her. She couldn’t come here so she sent her cat.\"\nmsgstr \"Sí la conozco. No podía venir, así que envió a su gato.\"\n\n#. Key:\t0EDE363848C05F39DE478DA7A559CF54\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Could you bring them to me?\"\nmsgstr \"¿Me los puedes traer?\"\n\n#. Key:\t1A914576488DA1393ED641B9F315ABC6\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_53.Text\n#. Key:\t20DA5C2F49DCFADF17F1C983103C0D98\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_29.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_29.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_53.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Thanks!\"\nmsgstr \"¡Gracias!\"\n\n#. Key:\t1E7EE16F451CAB1193F0B8B3939273AA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_62.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_62.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"I managed to defeat one group of the monsters.\"\nmsgstr \"Logré derrotar a un grupo de monstruos.\"\n\n#. Key:\t1F5BE4154412819180B1CA92E5B69377\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(6).Children.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(6).Children.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Artefacts\"\nmsgstr \"Artefactos\"\n\n#. Key:\t1FE89B7045E586E988BEC18B06BEEBDB\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(1).Children.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Purple Mushroom\"\nmsgstr \"Seta morada\"\n\n#. Key:\t208B21DE484E3FE42C9978927BC91E78\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_51.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_51.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Uh... this was impressive!\"\nmsgstr \"Uh... esto fue impresionante!\"\n\n#. Key:\t27DF1ABB483B5073D8C87DB48EF2613F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_70.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_70.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Well done!\"\nmsgstr \"¡Bien hecho!\"\n\n#. Key:\t2892242A4E74642813A30CBAE853B674\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_27.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_27.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Anyway, if you give my Coin back I will apologize.\"\nmsgstr \"Bueno, si me devuelves mi Moneda, me disculparé.\"\n\n#. Key:\t290F9EE34FA4EA41FE963CA61358D23B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_49.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_49.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"In theory if I add this to the soup...\"\nmsgstr \"En teoría, si añado esto a la sopa...\"\n\n#. Key:\t3015DA144833F0401BADE8B5E5F93BA8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_26.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_26.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Huh! Do you think chests are only there so that you can loot them?\"\nmsgstr \"Huh ¿Crees que los cofres solo están allí para que puedas saquearlos?\"\n\n#. Key:\t331D8B314DAF15CD7E343BB7459927DD\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Give back my Coin!\"\nmsgstr \"¡Devuelve mi Moneda!\"\n\n#. Key:\t345BD57D40E09C73044BB981798E2449\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_43.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_43.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Purple Mushrooms. That’s the only mushroom which is purple. You can’t miss it.\"\nmsgstr \"Setas moradas. Ese la única seta que es morada. No te lo puedes perder.\"\n\n#. Key:\t34B1483D4F1C580BB8DB61BEEBC5BC0F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"I saw that you opened my chest!\"\nmsgstr \"¡Vi que abriste mi cofre!\"\n\n#. Key:\t35DBF2874748AFCC34A3FAAC083EF9A0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_1.SpeechSequence(3).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_1.SpeechSequence(3).SpeechSequence.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"We had the key of the Ancient Temple. According to our prophecies that will fall to Ruin last.\"\nmsgstr \"Teníamos la llave del Templo Antiguo. De acuerdo con nuestras profecías que caerán a Ruin ultimo.\"\n\n#. Key:\t35FB567B4B09545830D61F84869FC7E7\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Here you go!\"\nmsgstr \"¡Aquí tienes!\"\n\n#. Key:\t3AAE79234A4BD2F8BCA5F790D5E5D84B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_45.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_45.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"No problem. If I ever find one I will bring it to you.\"\nmsgstr \"No hay problema. Si encuentro uno, te lo traeré.\"\n\n#. Key:\t3AE46C894A0CD8F1AA049CB9970D65F3\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"I’m the chef and I’m making a soup.\"\nmsgstr \"Soy el cocinero y estoy haciendo una sopa.\"\n\n#. Key:\t3BB405034447D1C80B99A5A23AFC98FC\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"I know you are already hungry but the soup is not yet ready.\"\nmsgstr \"Sé que ya tienes hambre, pero la sopa aún no está lista.\"\n\n#. Key:\t406361704988AD9ABD5DA4AF946451F2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_37.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_37.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"In return Lillian drew pictures for my tales.\"\nmsgstr \"A cambio, Lillian pintó cuadros para mis cuentos.\"\n\n#. Key:\t4152700A419F5AE41362D09E21835D98\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_46.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_46.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"I already have some...\"\nmsgstr \"Ya tengo algunos...\"\n\n#. Key:\t4355EB74402DDFD5FF8697B1911593E8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_56.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_56.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"I won’t. And I won’t talk to you either.\"\nmsgstr \"No lo haré Y tampoco voy a hablar contigo.\"\n\n#. Key:\t43C4F54B4ABBBB13E129148D9AF04976\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(4).Children.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(4).Children.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Village\"\nmsgstr \"Pueblo\"\n\n#. Key:\t4614DBA24F54CB29C92BA9894849CC39\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_1.SpeechSequence(1).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_1.SpeechSequence(1).SpeechSequence.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Long ago we lived in peace and respected the ancestors. Even though they caused the Cataclysm.\"\nmsgstr \"Hace mucho tiempo vivimos en paz y respetamos a los antepasados. A pesar de que causaron el Cataclismo.\"\n\n#. Key:\t4687EF7A45E5FC200C806AB829C64D78\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Is this a village? Where are the others?\"\nmsgstr \"¿Esto es un pueblo? ¿Dónde están los otros?\"\n\n#. Key:\t586F6370480889F551923A97FFF5E89C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_0.SpeechSequence(3).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_0.SpeechSequence(3).SpeechSequence.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"They enslaved all the other tribes and forbid us to do our rituals.\"\nmsgstr \"Esclavizaron a todas las otras tribus y nos prohibieron hacer nuestros rituales.\"\n\n#. Key:\t5BCF2C5D4CE9AD6AB4A09DB510BA2039\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"You again? Take a seat until the soup is ready!\"\nmsgstr \"¿Tú otra vez? ¡Toma asiento hasta que la sopa esté lista!\"\n\n#. Key:\t63B9B304450B276F0EC714B43A25F09D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"I’m looking for three artefacts. Do you know something about them?\"\nmsgstr \"Estoy buscando tres artefactos. ¿Sabes algo sobre ellos?\"\n\n#. Key:\t63C0EC124C1B42B5C5FD1F95B23B9155\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_65.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_65.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Take this! You deserve it.\"\nmsgstr \"¡Toma esto! Te lo mereces.\"\n\n#. Key:\t69E0738B489315662A55DA98EAC542E6\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_0.SpeechSequence(4).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_0.SpeechSequence(4).SpeechSequence.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"They used this village to produce Fishy slaves.\"\nmsgstr \"Usaron este pueblo para producir esclavos Fishys.\"\n\n#. Key:\t6CBCFFEB48FF8E0D97AAE4B1CB19CB52\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_22.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_22.Children(0).Children.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Give back\"\nmsgstr \"Devolver\"\n\n#. Key:\t6EACCB4D4D91AF29F6452E81E4C01B57\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_32.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_32.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"I see you have a lot of things here. Do you have something for sale?\"\nmsgstr \"Veo que tienes muchas cosas aquí. ¿Tienes algo en venta?\"\n\n#. Key:\t7164FF5D440BCEF18CAC7E9104A324CF\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"I've got to go now!\"\nmsgstr \"¡Tengo que irme ahora!\"\n\n#. Key:\t75A92D46421FC2601A13B4BBE9BA4D11\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_54.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_54.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Er... I don’t have it. But I will get it back I promise!\"\nmsgstr \"Er... no lo tengo. ¡Pero lo recuperaré, te lo prometo!\"\n\n#. Key:\t761F5734479CFA197266F382FD0A6452\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_23.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_23.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"I’m sorry, I didn’t know it was yours. There are chests like yours everywhere.\"\nmsgstr \"Lo siento, no sabía que era tuyo. Hay cofres como el tuyo por todas partes.\"\n\n#. Key:\t7D87C5064D739F1EFF23AF8264E83235\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Well, this morning. But there are some very special ingredients which make the cook time way shorter.\"\nmsgstr \"Pues esta mañana. Pero hay algunos ingredientes muy especiales que hacen que el tiempo de cocción sea mucho más corto.\"\n\n#. Key:\t806AEB764A6118D4CBE9CCA71E98EF10\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_72.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_72.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Have no fear, I'll do it.\"\nmsgstr \"No tengas miedo, lo haré.\"\n\n#. Key:\t80B60CA848D3C71B72514AAC976C3910\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Yes, the soup! A very special recipe. It takes years to finish.\"\nmsgstr \"¡Si, la sopa! Una receta muy especial. Tarda años en terminar.\"\n\n#. Key:\t8437D72C44494DE499E528A67B36A123\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_58.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_58.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Ah, it's you again.\"\nmsgstr \"Ah, eres tú otra vez.\"\n\n#. Key:\t885F9FDB498EC13B81E22580D33309F3\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(5).Children.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(5).Children.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Kobolds\"\nmsgstr \"Kobolds\"\n\n#. Key:\t8A6043D64FB7B61AF4D553A62D27229C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_36.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_36.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Every time the cat came I told him a tale about the ancestors.\"\nmsgstr \"Cada vez que venía el gato le contaba una historia sobre los antepasados.\"\n\n#. Key:\t8B29FD7342676763EF53ACBB0677A1A4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"The soup still needs time.\"\nmsgstr \"La sopa necesita tiempo.\"\n\n#. Key:\t8E0F057044AE753D63AA23847B146662\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_67.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_67.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"This is yours.\"\nmsgstr \"Esto es tuyo.\"\n\n#. Key:\t8E4C4FB846539DD46577B490846383F1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_1.SpeechSequence(2).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_1.SpeechSequence(2).SpeechSequence.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"We decided to keep their knowledge in our rituals.\"\nmsgstr \"Decidimos mantener su conocimiento en nuestros rituales.\"\n\n#. Key:\t9132C2D24A241722115FD5ADB46B3145\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"And when did you start?\"\nmsgstr \"¿Y cuándo empezaste?\"\n\n#. Key:\t958CE12E48F89AE79E5ED9A4FC4AF6E7\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_48.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_48.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"That's wonderful!\"\nmsgstr \"¡Eso es maravilloso!\"\n\n#. Key:\t96E5FBCB4795EC1ADACEC7B6D814BD79\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(8).Children.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(8).Children.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Lillian\"\nmsgstr \"Lillian\"\n\n#. Key:\t9845BDB549EF25B9F5C11981123A5CCE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_33.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_33.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"You know I’m not really a trader but I might sell you some of them.\"\nmsgstr \"Sabes que no soy realmente un comerciante, pero podría venderte algunos de ellos.\"\n\n#. Key:\t9A420B814A1C1762130310AE90157BFD\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_31.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_31.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"No, I’m sorry.\"\nmsgstr \"No, lo siento.\"\n\n#. Key:\t9D8511F94E19183355A5CC8CE5B562E8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_61.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_61.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"That would be great. I appreciate your kindness.\"\nmsgstr \"Eso seria genial. Aprecio tu amabilidad.\"\n\n#. Key:\t9F2DE60B405A15F2BFB8409D162B42FD\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(3).Children.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(3).Children.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Soup\"\nmsgstr \"Sopa\"\n\n#. Key:\tA53CDF2A4D9A582DD163C7B6D3DCE334\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_55.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_55.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Come back when you have my Coin.\"\nmsgstr \"Vuelve cuando tengas mi Moneda.\"\n\n#. Key:\tA734229B44743F88ED135FB692B9C956\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Do you know a girl called Lillian?\"\nmsgstr \"¿Conoces a una chica llamada Lillian?\"\n\n#. Key:\tA88F63334DD550FE9955A3A65B87ACDA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_63.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_63.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"I banished some of the monsters.\"\nmsgstr \"Desterré a algunos de los monstruos.\"\n\n#. Key:\tA8B5BE484641EBB61B1168AE798DABF5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"So you are making soup...\"\nmsgstr \"Entonces estás haciendo sopa...\"\n\n#. Key:\tAAE2E35045B8E0DF8A11BF8BC84A11EF\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_0.SpeechSequence(1).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_0.SpeechSequence(1).SpeechSequence.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Every year we made a pilgrimage to the Ancient Temple to express our respect to the ancestors.\"\nmsgstr \"Todos los años hicimos una peregrinación al Templo Antiguo para expresar nuestro respeto a los antepasados.\"\n\n#. Key:\tAC26EB6F49B026C3E768398FA0A445CB\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_50.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_50.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"then...\"\nmsgstr \"y ahora...\"\n\n#. Key:\tADE8569E4FC2DCB097FF3FA4B9A0A970\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_40.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_40.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Why not? What do you need?\"\nmsgstr \"¿Por qué no? ¿Que necesitas?\"\n\n#. Key:\tAE35D91D450D0414FA5F54B71E359511\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(2).Children.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(2).Children.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Who are you?\"\nmsgstr \"¿Quién eres?\"\n\n#. Key:\tAE387E9846A9C5A56569179359AD941C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_42.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_42.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"All right! I was just asking...\"\nmsgstr \"¡Vale! Solo preguntaba...\"\n\n#. Key:\tAF3D9214401FEEE552256A8BAE5F8E77\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_1.SpeechSequence(4).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_1.SpeechSequence(4).SpeechSequence.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"But now Kobolds are wrathful. They make wars. They don’t respect anyone.\"\nmsgstr \"Pero ahora los Kobolds están furiosos. Hacen guerras. No respetan a nadie.\"\n\n#. Key:\tB06407B04855D558D1DB6B9A9A4E0B84\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_1.SpeechSequence(0).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_1.SpeechSequence(0).SpeechSequence.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Kobolds are no longer good.\"\nmsgstr \"Los kóbolds ya no son buenos.\"\n\n#. Key:\tB082CC4B405800544484B4B0C8A25762\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_41.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_41.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"No way!\"\nmsgstr \"¡De ninguna manera!\"\n\n#. Key:\tB35F443641A7626AE4552F8D1045A95F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_38.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_38.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"I liked them very much.\"\nmsgstr \"Me gustaron mucho.\"\n\n#. Key:\tB40C1B9948722A549DBC45A1D9C277C0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_24.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_24.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"I don’t want to leave my kitchen.\"\nmsgstr \"No quiero salir de mi cocina.\"\n\n#. Key:\tB71FB3424C74B68E4B9CF9AF3828F867\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_64.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_64.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"I think I banished all the monsters.\"\nmsgstr \"Creo que desterré a todos los monstruos.\"\n\n#. Key:\tB79F2026493F53FE90BABB987370695D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"What do you think honestly? You can just rob me and then come to have a chat?!\"\nmsgstr \"¡¿Qué piensas honestamente? ¿Puedes robarme y luego venir a charlar?!\"\n\n#. Key:\tB7B8A9294FA8D3754BB4CDA897B696BA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_69.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_69.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Great. The lake is already more peaceful.\"\nmsgstr \"Excelente. El lago ya está más tranquilo.\"\n\n#. Key:\tB9C3EC7342B52C04A491FF9AE87ABB42\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_0.SpeechSequence(0).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_0.SpeechSequence(0).SpeechSequence.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"This was the Village of my tribe. We lived here in peace.\"\nmsgstr \"Este era el pueblo de mi tribu. Vivimos aquí en paz.\"\n\n#. Key:\tBB45D70A4F2AF94BA7FCC9B3141FB98F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_17.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_17.Children(0).Children.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Accept\"\nmsgstr \"Aceptar\"\n\n#. Key:\tC297D79246A0792DCA2CA9AD693C3A55\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"That’s all.\"\nmsgstr \"Eso es todo.\"\n\n#. Key:\tC375726140A40243E29115B58048025E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_52.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_52.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Hmm... it’s delicious. Here take some!\"\nmsgstr \"Hmm... está delicioso. Toma un poco!\"\n\n#. Key:\tC8BC1F254B61D749D62D4B9210DA1891\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"If you came for soup you will need to wait a bit more!\"\nmsgstr \"Si viniste por sopa, ¡tendrás que esperar un poco más!\"\n\n#. Key:\tCB607C4842DF3781F8B6C9AB1A7D31F1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Where is my Coin?\"\nmsgstr \"¿Dónde está mi Moneda?\"\n\n#. Key:\tCE80654A43078EA1E53C5E9C5114DE54\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_60.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_60.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"I can help you banish the monsters around the lake.\"\nmsgstr \"Puedo ayudarte a desterrar a los monstruos alrededor del lago.\"\n\n#. Key:\tD1412BF6490EA9357CE9F7A873B1FCAC\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_35.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_35.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"She was really curious about our rituals.\"\nmsgstr \"Tenía mucha curiosidad por nuestros rituales.\"\n\n#. Key:\tD76CDC9F410E2BCC21BCFB8D0D8A9E97\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_47.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_47.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"I’ve found some Purple Mushroom!\"\nmsgstr \"¡He encontrado unas Setas Moradas!\"\n\n#. Key:\tD87335EA45EAC6F84022FEBE57F5CADF\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_25.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_25.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Or what? Will you cook me?\"\nmsgstr \"¿O que? ¿Me cocinarás?\"\n\n#. Key:\tD9B7F3E240430AA5EF537A8F81814751\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_71.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_71.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"I'm glad that the lake is peaceful again. Thank you!\"\nmsgstr \"Me alegra que el lago vuelva a estar tranquilo. ¡Gracias!\"\n\n#. Key:\tE15F80EA40F193E47F372FA7EE9A949E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_0.SpeechSequence(5).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_0.SpeechSequence(5).SpeechSequence.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Now they are gone and I'm alone with the monsters they left here.\"\nmsgstr \"Ahora se han ido y estoy solo con los monstruos que dejaron aquí.\"\n\n#. Key:\tE3947B064E58A1FD7B96A3956C54415D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_0.SpeechSequence(2).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_0.SpeechSequence(2).SpeechSequence.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"But then other Kobolds came. They called themselves the Great Kobols.\"\nmsgstr \"Pero luego vinieron otros Kobolds. Se hacían llamar los Grandes Kobols.\"\n\n#. Key:\tE48A1DFB458275188357F5811E98CFD4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_59.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_59.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"And also take this! I could have not done the soup in time without your help.\"\nmsgstr \"¡Y también llevate esto! No podría haber hecho la sopa a tiempo sin tu ayuda.\"\n\n#. Key:\tE58EEE904A6CBF1A0E2E768583EB03DC\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(7).Children.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(7).Children.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Trade\"\nmsgstr \"Comerciar\"\n\n#. Key:\tE60B94C04C63F0E074A5B8ABFED7AE62\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_66.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_66.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"I have something for you.\"\nmsgstr \"Tengo algo para ti.\"\n\n#. Key:\tEA71F6A6412E69C31302A2B57BFD266F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_39.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_39.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Now they are both gone.\"\nmsgstr \"Ahora ambos se han ido.\"\n\n#. Key:\tECA4BB2D4EB774315D57FD9A5D66CF25\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_22.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_22.Children(1).Children.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Don't give\"\nmsgstr \"No dar\"\n\n#. Key:\tED97FDEB46CAC89F65734D990569618C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_17.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_17.Children(1).Children.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Decline\"\nmsgstr \"Rechazar\"\n\n#. Key:\tEFD0511840178E579287BAB7FA3FDADE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(0).Children.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Banish Monsters\"\nmsgstr \"Desterrar monstruos\"\n\n#. Key:\tF5A08C63415DF9FE007B97931B7A7C31\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(9).Children.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(9).Children.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Leave\"\nmsgstr \"Salir\"\n\n#. Key:\tF7EA437842BBD099521D81B87211F49E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_30.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_30.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"I’m the last of my tribe.\"\nmsgstr \"Soy el último de mi tribu.\"\n\n#. Key:\tFC8F235840D6AF4A86170791A617BCA9\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Who are you? What are you doing here?\"\nmsgstr \"¿Quién eres tú? ¿Qué estás haciendo aquí?\"\n\n#. Key:\tFF27D3BF4D181753D73AD79D384CD3ED\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"What are you Kobolds like? What are you doing?\"\nmsgstr \"¿Cómo soiso? ¿Qué estás haciendo?\"\n\n#. Key:\t587277824A24A49F9319D0B452A709AD\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/LB_Device.LB_Device:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Ending/E1/LB_Device.LB_Device:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_LB_Device\"\nmsgid \"Monk wanted me to use this device to separate the Worlds.\"\nmsgstr \"Monje quería que usara este aparato para separar los mundos.\"\n\n#. Key:\t83B9F1E146084039E4BAD185B455209C\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LB_Device.LB_Device:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E2/LB_Device.LB_Device:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_LB_Device\"\nmsgid \"With Father we did all we could to make the device perfect. I won’t let us lose so close to the end!\"\nmsgstr \"Con Papa hicimos todo lo posible para que el aparato fuera perfecto. ¡No nos dejaré perder tan cerca del final!\"\n\n#. Key:\t90E0E1E44BE9D84FC514248D73A31935\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LB_Device.LB_Device:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Ending/E2/LB_Device.LB_Device:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_LB_Device\"\nmsgid \"Three years of hard work.\"\nmsgstr \"Tres años de trabajo duro.\"\n\n#. Key:\tFB8EC2184310BA168B9C6E9DB51C4492\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LB_Device.LB_Device:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E2/LB_Device.LB_Device:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_LB_Device\"\nmsgid \"I need to pull the left lever first.\"\nmsgstr \"Necesito tirar de la palanca izquierda primero.\"\n\n#. Key:\tDAC636D74C51C30F4B790B9F87203957\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/LB_DeviceUse.LB_DeviceUse:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Ending/E1/LB_DeviceUse.LB_DeviceUse:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_LB_DeviceUse\"\nmsgid \"Er... so far pulling the levers worked but this machine looks fairly complicated.\"\nmsgstr \"Er... hasta ahora, tirar de las palancas funcionó, pero esta máquina parece bastante complicada.\"\n\n#. Key:\tE0D3606C4F357F03FBC916AA3573A81D\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/LB_DeviceUse.LB_DeviceUse:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E1/LB_DeviceUse.LB_DeviceUse:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_LB_DeviceUse\"\nmsgid \"I should look around to find some instructions on how it works.\"\nmsgstr \"Debería mirar alrededor para encontrar algunas instrucciones sobre cómo funciona.\"\n\n#. Key:\t2DB770DF48D3199FFDEA3F8AB99126D5\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LB_LeftLever.LB_LeftLever:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Ending/E2/LB_LeftLever.LB_LeftLever:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_LB_LeftLever\"\nmsgid \"I heard them knocking on the door. They surely heard the alarm when I entered.\"\nmsgstr \"Los escuché tocar a la puerta. Seguramente escucharon la alarma cuando entré.\"\n\n#. Key:\tB5D008804CCD51DF8CA8F5B99CA0C0FB\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LB_LeftLever.LB_LeftLever:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E2/LB_LeftLever.LB_LeftLever:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_LB_LeftLever\"\nmsgid \"I need to hurry. The middle lever is the next one.\"\nmsgstr \"Necesito apurarme. La palanca del medio es la siguiente.\"\n\n#. Key:\tC7B08D314C68A7E4D21E20B128670516\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LB_MiddleLever.LB_MiddleLever:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Ending/E2/LB_MiddleLever.LB_MiddleLever:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_LB_MiddleLever\"\nmsgid \"We both made our decision three years ago.\"\nmsgstr \"Ambos tomamos nuestra decisión hace tres años.\"\n\n#. Key:\tFBC301B94D990F1F3FD30383FF916327\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LB_MiddleLever.LB_MiddleLever:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Ending/E2/LB_MiddleLever.LB_MiddleLever:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_LB_MiddleLever\"\nmsgid \"I’ve made my choice.\"\nmsgstr \"He hecho mi decisión.\"\n\n#. Key:\tFD2036CF4FC103724FB18F83754367A0\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LB_MiddleLever.LB_MiddleLever:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E2/LB_MiddleLever.LB_MiddleLever:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_LB_MiddleLever\"\nmsgid \"I heard the door exploding. Father must be really mad but It doesn’t matter now.\"\nmsgstr \"Escuché la puerta explotar. Papá debe estar muy enfadado, pero ya no importa.\"\n\n#. Key:\t98F843004F338E4480C942A9B9646BDE\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LB_RightLever.LB_RightLever:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E2/LB_RightLever.LB_RightLever:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_LB_RightLever\"\nmsgid \"I pulled the last lever.\"\nmsgstr \"Tiré de la última palanca.\"\n\n#. Key:\t9F6EBBE74FA6289497401C8E7400B01E\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LR_Bed.LR_Bed:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E2/LR_Bed.LR_Bed:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_LR_Bed\"\nmsgid \"Sleeping wasn’t easy since Mom was gone.\"\nmsgstr \"Dormir no fue fácil desde que no está Mamá.\"\n\n#. Key:\tAE56EE704265B61C84123F9775EB424C\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LR_Bed.LR_Bed:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E2/LR_Bed.LR_Bed:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_LR_Bed\"\nmsgid \"I really couldn’t sleep that night.\"\nmsgstr \"Realmente no pude dormir esa noche.\"\n\n#. Key:\t344E65304BB63905D487CCAF191DFE95\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LR_Chest.LR_Chest:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Ending/E2/LR_Chest.LR_Chest:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_LR_Chest\"\nmsgid \"It was half past eleven.\"\nmsgstr \"Eran las once y media.\"\n\n#. Key:\t5DD659BE428981065F3A989D284C3542\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LR_Chest.LR_Chest:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E2/LR_Chest.LR_Chest:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_LR_Chest\"\nmsgid \"I took the key.\"\nmsgstr \"Me llevé la llave.\"\n\n#. Key:\tF21CEE6143FD904B2285F9BEE01174A0\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LR_Chest.LR_Chest:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E2/LR_Chest.LR_Chest:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_LR_Chest\"\nmsgid \"Daddy didn’t like if I went out in the night but I felt something calling for me.\"\nmsgstr \"A Papá no le gustaba si salía por la noche, pero sentía que algo me llamaba.\"\n\n#. Key:\t8B18714145E8614E70F531BDB1A2AAAB\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LR_Door.LR_Door:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E2/LR_Door.LR_Door:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_LR_Door\"\nmsgid \"I always locked the door just to make sure I won’t sleep walk out.\"\nmsgstr \"Siempre cerraba la puerta para asegurarme de que no caminaba dormido fuera de la habitación.\"\n\n#. Key:\tE5B14EEE4719891E2D2493A4E793A2C4\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LR_Door.LR_Door:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Ending/E2/LR_Door.LR_Door:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_LR_Door\"\nmsgid \"I opened the door.\"\nmsgstr \"Abrí la puerta.\"\n\n#. Key:\tF8090D7B4DCD959D7893338BDA2B6256\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LR_Door.LR_Door:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E2/LR_Door.LR_Door:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_LR_Door\"\nmsgid \"I hid the key under the clock.\"\nmsgstr \"Escondí la llave debajo del reloj.\"\n\n#. Key:\t8363A3C9426FA1F007A5E783B1D72171\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LR_Notebook.LR_Notebook:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E2/LR_Notebook.LR_Notebook:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_LR_Notebook\"\nmsgid \"Here I collected all my less scientific notes on the Ruined Realm.\"\nmsgstr \"Aquí recolecté todas mis notas menos científicas sobre el Reino Arruinado.\"\n\n#. Key:\tA0B131B34A29BEADA3E3CDB74C7EDBCA\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LR_Notebook.LR_Notebook:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Ending/E2/LR_Notebook.LR_Notebook:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_LR_Notebook\"\nmsgid \"They deserve to be remembered. I will miss them.\"\nmsgstr \"Merecen ser recordados. Les echaré de menos.\"\n\n#. Key:\tB66C98C34782719B5CF6F19F608C00F0\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LR_Notebook.LR_Notebook:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E2/LR_Notebook.LR_Notebook:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_LR_Notebook\"\nmsgid \"So many lovely people! Despite their madness.\"\nmsgstr \"¡Tanta gente encantadora! A pesar de su locura.\"\n\n#. Key:\t0DAF7BA0480BDF56BC47A7826A5186C2\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LR_TabbyBed.LR_TabbyBed:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E2/LR_TabbyBed.LR_TabbyBed:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_LR_TabbyBed\"\nmsgid \"Sometimes I wished there could be a place like that for me as well.\"\nmsgstr \"A veces deseaba que hubiera un lugar así para mí también.\"\n\n#. Key:\t6084018D4E86CF2ACA89219824C8F776\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LR_TabbyBed.LR_TabbyBed:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Ending/E2/LR_TabbyBed.LR_TabbyBed:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_LR_TabbyBed\"\nmsgid \"As usually Tabby was out there maybe hunting or just hanging out with other cats.\"\nmsgstr \"Como de costumbre, Tabby estaba afuera, tal vez cazando o simplemente paseando con otros gatos.\"\n\n#. Key:\t9702175346DD6BD2CBDB9C8D23460866\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LR_TabbyBed.LR_TabbyBed:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E2/LR_TabbyBed.LR_TabbyBed:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_LR_TabbyBed\"\nmsgid \"In this World, he was normal.\"\nmsgstr \"En este Mundo, él era normal.\"\n\n#. Key:\t018B13FB403C2E979380C68B92CC1E46\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LR_Window.LR_Window:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Ending/E2/LR_Window.LR_Window:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_LR_Window\"\nmsgid \"Yet sometimes I liked to watch other kids playing in the castle garden.\"\nmsgstr \"Sin embargo, a veces me gustaba ver a otros niños jugando en el jardín del castillo.\"\n\n#. Key:\t15454EFF40C99A479173E294B612C66C\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LR_Window.LR_Window:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E2/LR_Window.LR_Window:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_LR_Window\"\nmsgid \"They didn’t understand how important my task was.\"\nmsgstr \"No entendieron lo importante que era mi tarea.\"\n\n#. Key:\t4460452B4A8B40C59075779751D3D760\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LR_Window.LR_Window:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Ending/E2/LR_Window.LR_Window:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_LR_Window\"\nmsgid \"I didn’t leave the castle since Mom died.\"\nmsgstr \"No salí del castillo desde que murió Mamá.\"\n\n#. Key:\t795D92CB49E6F50CE37897A793C6A711\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LR_Window.LR_Window:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Ending/E2/LR_Window.LR_Window:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_LR_Window\"\nmsgid \"Two years passed and they still didn’t give up throwing balls on the window to get my attention.\"\nmsgstr \"Pasaron dos años y todavía no dejaron de lanzar pelotas en la ventana para llamar mi atención.\"\n\n#. Key:\tB1A689B24F5D77A715114AB718126A75\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LR_Window.LR_Window:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E2/LR_Window.LR_Window:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_LR_Window\"\nmsgid \"They will never understand.\"\nmsgstr \"Nunca lo entenderán.\"\n\n#. Key:\t06B2BD844B477A747E086F9F0C3BCAFE\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"Well, that fountain is definitely not your cup of tea but you can accept that it might be the fairest for the Magic Mirror...\"\nmsgstr \"Bueno, esa fuente definitivamente no es tu taza de té, pero puedes aceptar que podría ser la más justa para el Espejo Mágico...\"\n\n#. Key:\t264C2C1040339F9680CA129F4E6E7764\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_65.Children(0).Children.Text\n#. Key:\t608D4BF341FEE76F239D6BA3B34F65E7\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_1.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_1.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_65.Children(0).Children.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"Who is the fairest?\"\nmsgstr \"¿Quién es el más justo?\"\n\n#. Key:\t2C246C1326080F0A003A03BBBE7E9F40\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_39.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_39.Children(1).Children.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"Wish something\"\nmsgstr \"Desear algo\"\n\n#. Key:\t2C6C88C54439E3C689E86DB30560B807\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_66.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_66.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"No matter how hard you try to receive a sign, the Mirror remains silent. It doesn't show you anything this time.\"\nmsgstr \"No importa cuánto intente recibir una señal, el Espejo permanece en silencio. Esta vez no te muestra nada.\"\n\n#. Key:\t317248C14F0904B6E6B04080841C75D1\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_39.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_39.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"The water seems to be boiling and the bubbles pop when they hit the surface; it is indeed mesmerizing. Suddenly, something breaks the silence - you can hear whispers.\"\nmsgstr \"El agua parece estar hirviendo y las burbujas explotan cuando llegan a la superficie; es realmente fascinante. De repente, algo rompe el silencio - puedes escuchar susurros.\"\n\n#. Key:\t372D97104DC7D67AF4B2409B7CBC602D\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_66.Children(0).Children.Text\n#. Key:\t432E8D794C2FB271D9B39283EBD9E33B\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_1.Children(2).Children.Text\n#. Key:\tF212015B402EF862C9869394531175DC\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_65.Children(2).Children.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_1.Children(2).Children.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_65.Children(2).Children.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_66.Children(0).Children.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"Leave\"\nmsgstr \"Salir\"\n\n#. Key:\t3FBF959348F2AFFA8016AA9371DD0800\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"You politely explain that you want to see your past instead of your body, but the Mirror is stubbornly stuck on this image.\"\nmsgstr \"Le explicas cortésmente que quiere ver su pasado en lugar de su cuerpo, pero el Espejo está obstinado en esta imagen.\"\n\n#. Key:\t4620F3E84D5DC9847AB8A8891CF66F20\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_67.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_67.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"You place the flower and wait to see what happens.\"\nmsgstr \"Colocas la flor y esperas a ver qué pasa.\"\n\n#. Key:\t5C2363C64023EB8E1705D3BFC3310A8A\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_65.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_65.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"The vision fades away.\"\nmsgstr \"La visión se desvanece.\"\n\n#. Key:\t648780E44EF4F6587D31E7AE2BE4CCE4\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_68.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_68.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"The Mirror seems to be unavailable at the moment. It doesn't want to be bothered. Maybe you should return later.\"\nmsgstr \"El espejo parece no estar disponible en este momento. No quiere ser molestado. Quizás deberías volver más tarde.\"\n\n#. Key:\t74CAAA1D4671A258A6D188BCED32CCBD\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_69.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_69.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"The water turns still. Deep under the surface you notice a glimmering light.\"\nmsgstr \"El agua se vuelve quieta. En lo profundo de la superficie notas una luz brillante.\"\n\n#. Key:\t7CD8BEEA40A36A22057920807BBEEC07\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"The Magic Mirror shows things that were, things that are, and things that yet may be. \\r\\nYou fill the basin with water and start contemplating. You meditate about...\"\nmsgstr \"El espejo mágico muestra cosas que fueron, cosas que son y cosas que aún pueden ser.\\r\\nLlenas la cuenca con agua y comienzas a contemplar. Meditas sobre...\"\n\n#. Key:\t8226F9B3495DE20F137F95A7F3583FE0\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"Ruin left this place almost untouched. The street lamps spread light on a couple of metal benches and flower pots.\"\nmsgstr \"Ruin dejó este lugar casi intacto. Las farolas iluminan un par de bancos de metal y macetas de flores.\"\n\n#. Key:\t82C33F1E49C5DC76BF19648A414F7209\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"You are watching the ball and start to get frustrated. You don't want to look at this body replacement... this raggy shell... You want answers!\"\nmsgstr \"Estás mirando a la pelota y empiezas a frustrarte. No quieres ver este reemplazo del cuerpo... este caparazón irregular... ¡Quieres respuestas!\"\n\n#. Key:\t8F94D5E34488ECDCE9E051BB1ABE66B9\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_1.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_1.Children(1).Children.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"Who you were in the past\"\nmsgstr \"Quien eras en el pasado\"\n\n#. Key:\t9BA86AAD4282A943E8A57390E2C4E3CF\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_39.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_39.Children(0).Children.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"Floating Flower\"\nmsgstr \"Flor Flotante\"\n\n#. Key:\tA8A6D8D44F9344A162FAA080C839B28A\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"There are glass shards all over the place. There's a ball on the floor next to the girl.\"\nmsgstr \"Hay fragmentos de vidrio por todo el lugar. Hay una pelota en el suelo al lado de la niña.\"\n\n#. Key:\tAF212CEC43A56245A848DABD21ECBAFC\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_70.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_70.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"You reach for the light and your fingers grab onto something smooth and cold.\"\nmsgstr \"Alcanzas la luz y tus dedos se aferran a algo suave y frío.\"\n\n#. Key:\tB8E2A52B442F3B45A1D993A8548DE124\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"You are seeing the wizard's room once more. There is a weakened little girl lying on the floor in the middle of the room. She is surrounded by stone runes, candles and magical potions.\"\nmsgstr \"Estás viendo la habitación del mago una vez más. Hay una niña debilitada tirada en el suelo en medio de la habitación. Está rodeada de runas de piedra, velas y pociones mágicas.\"\n\n#. Key:\tB9217F85404B488DB6F4DDACFF2B824C\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_65.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_65.Children(1).Children.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"What you were before\"\nmsgstr \"Lo que eras antes\"\n\n#. Key:\tCD33272B416D2FDE283D44BA6F50475C\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"The image zooms in and you have a clearer view of the fountain. You are waiting for more, but nothing happens.\"\nmsgstr \"La imagen se acerca y tiene una vista más clara de la fuente. Estás esperando más, pero no pasa nada.\"\n\n#. Key:\tD64B38F1470B27D21AE539AE80AE666A\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"You are seeing the Ruined Realm from afar. The view gets closer until you find yourself looking at the top of a tower.\"\nmsgstr \"Estás viendo el Reino Arruinado desde lejos. La vista se acerca hasta que te encuentras mirando la cima de una torre.\"\n\n#. Key:\tF3C496794CC4A68DDC764895FF2DFC77\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_72.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_72.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"You found a precious rune stone! Hmmm...Is this the gift offered by the Mirror in exchange for your enchanting flower?\"\nmsgstr \"¡Encontraste una preciosa piedra rúnica! Hmmm... ¿Es este el regalo ofrecido por el Espejo a cambio de tu encantadora flor?\"\n\n#. Key:\t10A6FAE44F71FBB21522B1AAE5E20DAE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_29.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_29.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"I don’t care what happens here after I’m back home.\"\nmsgstr \"No me importa lo que pase aquí después de volver a casa.\"\n\n#. Key:\t12C6550D4143AFE12C6986B427D2927A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"He can’t release his daughter. He can’t accept that she is gone. He wants to get her back even if it means they all die after a few months...\"\nmsgstr \"No puede liberar a su hija. No puede aceptar que ella se haya ido. Él quiere recuperarla, incluso si eso significa que todos mueren después de unos meses...\"\n\n#. Key:\t1C714E474408001FB67CEABF92FAB019\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Wait! You can’t just dis...\"\nmsgstr \"¡Espere! No puedes simplemente desa...\"\n\n#. Key:\t209B77394D419812DD1BD7A3D7A92B94\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_39.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_39.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"All right and what can we do against it?\"\nmsgstr \"Está bien. ¿Y qué podemos hacer contra eso?\"\n\n#. Key:\t209BF95E4275418CE020E3AB028AFC10\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Now it’s better.\"\nmsgstr \"Ahora es mejor.\"\n\n#. Key:\t230C6ED4416FDD6C5E00FAB8B30FBB17\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"To be honest I don’t have the faintest idea. I just want to be free again.\"\nmsgstr \"Para ser sincero, no tengo la menor idea. Solo quiero volver a ser libre.\"\n\n#. Key:\t25227AB342F4A0E76082539072C1143D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_37.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_37.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Do you think Ruin will stop after swallowing the Human Realm?\"\nmsgstr \"¿Crees que Ruin se detendrá después de tragar el Reino Humano?\"\n\n#. Key:\t266261C240DB77D1306C5F8EEE3D0189\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"He says he wants his daughter back but I think he is still trying to close the Realm to stop Ruin.\"\nmsgstr \"Dice que quiere recuperar a su hija, pero creo que todavía está tratando de cerrar el Reino para detener a Ruin.\"\n\n#. Key:\t283810E04DE48471FBE6BD9BE9DD337D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Yet he doesn’t care about the World. He wants to get her back even if it means they all die after a few months...\"\nmsgstr \"Sin embargo, no le importa el Mundo. Él quiere recuperarla, incluso si eso significa que todos mueren después de unos meses...\"\n\n#. Key:\t2CE94F19412379ECE927A3AEEEAC3756\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_1.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_1.Children(1).Children.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Thanks for the Soulcaster\"\nmsgstr \"Gracias por el Lanzador de Almas\"\n\n#. Key:\t2DB5F39F45BB9EC8ABBFEA9020DF94E7\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Why should it concern me if Ruin destroys your Realm? You deserve it for summoning us to do the hard work.\"\nmsgstr \"¿Por qué debería preocuparme si Ruin destruye tu Reino? Te lo mereces por convocarnos para hacer el trabajo duro.\"\n\n#. Key:\t30E5A67B4135A5402AE021832F89D4D1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"You again? I told you if you want something from the Wizard go and find him yourself...\"\nmsgstr \"¿Tú otra vez? Te dije que si querías algo del Mago, ve a buscarlo tú mismo...\"\n\n#. Key:\t34BCB98247406A77FB5A5C8942543588\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_38.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_38.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"It might take time but it will reach the Unknown Realm and all the spirits will become part of Ruin just like those who were summoned here.\"\nmsgstr \"Puede llevar tiempo, pero llegará al Reino Desconocido y todos los espíritus se convertirán en parte de Ruin al igual que los que fueron convocados aquí.\"\n\n#. Key:\t379B50904FB774AD057BBB810BDD445C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_41.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_41.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"I’m not sure. I will think about it.\"\nmsgstr \"No estoy seguro. Voy a pensar en ello.\"\n\n#. Key:\t38BEECF94D2EB7B2C6596593E576A360\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_30.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_30.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"The Wizard created a device which can separate the Realms. This is the only way to stop Ruin from spreading.\"\nmsgstr \"El Mago creó un aparato que puede separar los Reinos. Esta es la única forma de evitar que Ruin se propague.\"\n\n#. Key:\t3D7B856A4D97FCCC2A2B89BCB6295471\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"This time I would like to talk to you...\"\nmsgstr \"Esta vez me gustaría hablar contigo...\"\n\n#. Key:\t40A329C7465166A11C73B694D6A79A00\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_12.Children(2).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_12.Children(2).Children.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Don’t know\"\nmsgstr \"No lo se\"\n\n#. Key:\t4D356117496E625B6B4C64A611496A9F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_24.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_24.Children(1).Children.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Not my problem\"\nmsgstr \"No es mi problema\"\n\n#. Key:\t4FE5ADF04D1079CCD1E16697E82B39B5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_35.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_35.Children(0).Children.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Accept plan\"\nmsgstr \"Aceptar el plan\"\n\n#. Key:\t53D6055344A880433B1093B029DA8CA5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_12.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_12.Children(0).Children.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Bring back daughter\"\nmsgstr \"Traer de vuelta la hija\"\n\n#. Key:\t599FF022411F5BA2EB0F32A1F947C661\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_35.Children(2).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_35.Children(2).Children.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Not sure\"\nmsgstr \"No estoy seguro\"\n\n#. Key:\t5FD6018040C38B8A3F40C78C913AC251\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_40.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_40.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Have no fear, I will have this done!\"\nmsgstr \"¡No tengas miedo, haré esto!\"\n\n#. Key:\t6B3585BA4AFE614FF428FCAE698872A8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_33.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_33.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"For you this would be completely different. For you this is not a sacrifice but a way of going home!\"\nmsgstr \"Para ti esto sería completamente diferente. ¡Para ti esto no es un sacrificio sino una forma de volver a casa!\"\n\n#. Key:\t6E1C94F24F493D7075A7509F8181AD27\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"You are wrong. The World is falling apart yet he doesn’t care about it even when he is the only one who could stop Ruin.\"\nmsgstr \"Estás equivocado. El mundo se está desmoronando, pero a él no le importa, incluso cuando es el único que podría detener a Ruin.\"\n\n#. Key:\t71A64B804C0CCE26571E9E8237AA5000\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"I’m also glad. It was bloody damn difficult.\"\nmsgstr \"También me alegro. Fue jodidamente difícil.\"\n\n#. Key:\t78305AE64B56098D32806EB509133BBC\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_35.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_35.Children(1).Children.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Decline plan\"\nmsgstr \"Rechazar el plan\"\n\n#. Key:\t7C92B8BF4CEA3093BB817682B501DC67\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"The World is falling apart and only the Wizard has a chance to stop this.\"\nmsgstr \"El mundo se está desmoronando y solo el Mago tiene la oportunidad de detener esto.\"\n\n#. Key:\t8B2CE8144EB2A7C89AFA1BACC3EE1B88\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Hello, little Wanderer! I’m glad you made it this far.\"\nmsgstr \"¡Hola, pequeño Errante! Me alegra que hayas llegado hasta aquí.\"\n\n#. Key:\t8CC98B374125E6E6A6A20C97F4A3B067\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_24.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_24.Children(0).Children.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"I'm a demon\"\nmsgstr \"Soy un demonio\"\n\n#. Key:\t8D4701A1469997CBC879788351B37B0A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_31.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_31.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"My plan is simple.\"\nmsgstr \"Mi plan es sencillo.\"\n\n#. Key:\t8E4693F04E60AFF4757A5887973894BE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_27.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_27.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"I saw Ruin and I don’t want the same to happen to any other Realm. What can I do?\"\nmsgstr \"Vi a Ruin y no quiero que le pase lo mismo a ningún otro Reino. ¿Que puedo hacer?\"\n\n#. Key:\t9193CB2747033644F006809E0E4A812A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_45.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_45.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"For the sake of all Realms I hope you will make the right decision.\"\nmsgstr \"Por el bien de todos los Reinos, espero que tomes la decisión correcta.\"\n\n#. Key:\t95D6FBCC42CC4F4041D0B5B64996FD5C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_35.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_35.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Once you are there find the Laboratory and activate the device! It will take you home and will separate the Worlds which means no spirit will be ever summoned again!\"\nmsgstr \"Una vez que esté allí, busque el Laboratorio y active el aparato. ¡Te llevará a casa y separará los Mundos, lo que significa que ningún espíritu volverá a ser convocado!\"\n\n#. Key:\t9ADEF37F49EA90EF320B5E8BB2D8D769\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"...and I don’t want our conversation to be overheard, so if you don’t mind...\"\nmsgstr \"... y no quiero que se escuche nuestra conversación, así que si no te importa...\"\n\n#. Key:\t9F01EFC54F3FC5B709F697860BE0572D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_24.Children(2).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_24.Children(2).Children.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"How to save the World?\"\nmsgstr \"¿Cómo salvar al Mundo?\"\n\n#. Key:\tA71226674132E2666925AEB28D2FC024\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_46.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_46.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Farewell Wanderer!\"\nmsgstr \"¡Adiós Errante!\"\n\n#. Key:\tB1E3A9DB4A75C08067DCA19113A6A8A2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Calm down little spirit.\"\nmsgstr \"Cálmate pequeño espíritu.\"\n\n#. Key:\tB355BD604F9EC22514DA14B64B0F5E5E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_43.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_43.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Thank you Spirit! For the sake of all Realms I hope you won’t fail on your way!\"\nmsgstr \"¡Gracias espíritu! ¡Por el bien de todos los Reinos, espero que no falles en tu camino!\"\n\n#. Key:\tB6D3E23045C4BC5B3E5F3D83E2DFBADB\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_19.Text\n#. Key:\tDC3219914721210BD169D2989F03D18D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"But we won’t let this happen, will we?\"\nmsgstr \"Pero no dejaremos que esto suceda, ¿verdad?\"\n\n#. Key:\tBAC828A540E6C81EE43EBF8036A8146A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_42.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_42.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"You deserve Ruin. I won’t save the Human Realm!\"\nmsgstr \"Te mereces Ruin. ¡No salvaré el Reino Humano!\"\n\n#. Key:\tC837CED4495F79594133F4B2C0FCE5F8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Where shall I start? Do you know what the Wizard is up to? Did he tell you?\"\nmsgstr \"¿Por dónde empezar? ¿Sabes lo que está haciendo el Mago? ¿Te lo dijo?\"\n\n#. Key:\tD060173B4D5502FC06A69E865DAFD5E6\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_26.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_26.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"This is not my Realm and not my problem. All I want is to get out of here.\"\nmsgstr \"Este no es mi Reino y no es mi problema. Lo que quiero es salir de aquí.\"\n\n#. Key:\tD520C3AC46F62B77554443A4589845C1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"He would like to bring his daughter back to life. For that he needs three artefacts which are somewhere here.\"\nmsgstr \"Le gustaría devolverle la vida a su hija. Para eso necesita tres artefactos que están en algún lugar aquí.\"\n\n#. Key:\tD7F841B14E18D77AB5FBD2A34D59BC92\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_44.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_44.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"I understand your fury. Yet I hope you will change your mind.\"\nmsgstr \"Entiendo tu furia. Sin embargo, espero que cambies de opinión.\"\n\n#. Key:\tD80B81914A550F305934F9852C1DD6B0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_23.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_23.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"He lost his daughter and he can’t release her. He can’t accept that she is gone.\"\nmsgstr \"Perdió a su hija y no puede liberarla. No puede aceptar que ella se haya ido.\"\n\n#. Key:\tD816A79E4160BC4426CD22A63C7987A0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Before you go on I have something to discuss with you...\"\nmsgstr \"Antes de que continues, tengo algo que discutir contigo...\"\n\n#. Key:\tDD870754471358DEFE9CB5BFA554AB7C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_1.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_1.Children(0).Children.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Me too\"\nmsgstr \"Yo también\"\n\n#. Key:\tE0CCA2604AA40FED355A859A1FA02DDA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_1.Children(2).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_1.Children(2).Children.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"I won’t deliver any message\"\nmsgstr \"No entregaré ningún mensaje\"\n\n#. Key:\tE1C3F2E34680BA8B67521C905AD42ADA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"That’s correct. He can’t release his daughter. He can’t accept that she is gone.\"\nmsgstr \"Eso es correcto. No puede liberar a su hija. No puede aceptar que ella se haya ido.\"\n\n#. Key:\tE93136104181FAA899F2CE801497DCBA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_25.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_25.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"I know right now it doesn’t look that way, but I’m a mighty demon of the Unknown Realm.\"\nmsgstr \"Sé que en este momento no se ve de esa manera, pero soy un poderoso demonio del Reino Desconocido.\"\n\n#. Key:\tEC116A8848A471EB2C5DC8BA1D187C9A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_12.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_12.Children(1).Children.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Close Ruined Realm\"\nmsgstr \"Cierra el Reino Arruinado\"\n\n#. Key:\tEC6221CE4B85E7D1887DBCA6D85D8238\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"It wasn’t easy but I made good use of the Spellcaster you gave me.\"\nmsgstr \"No fue fácil, pero hice un buen uso del Lanzador de Hechizos que me diste.\"\n\n#. Key:\tED5356DE42F2ED2203F7AFB30231643E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_34.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_34.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"When you deliver the artefacts he will let you into his tower.\"\nmsgstr \"Cuando entregues los artefactos, te dejará entrar a su torre.\"\n\n#. Key:\tEE78AD4147800BD0E160A8B6A3F51FBD\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_32.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_32.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"When the Wizard’s daughter activated the device it transported her soul into the Unknown Realm. At that point the Wizard stopped the device so that he can summon his daughter back.\"\nmsgstr \"Cuando la hija del Mago activó el aparato, transportó su alma al Reino Desconocido. En ese momento, el Mago detuvo el aparato para poder convocar de vuelta a su hija.\"\n\n#. Key:\tEFACA50447BAC08293281BB11A5E11B3\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_36.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_36.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"This is just as much your problem as it is mine.\"\nmsgstr \"Este es tanto tu problema como el mío.\"\n\n#. Key:\tFB0E702746132A3C688D9EA492A01B50\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"You made it and that is what matters.\"\nmsgstr \"Lo lograste y eso es lo que importa.\"\n\n#. Key:\t4BE3EE734EFED241B7FA2192EEB146A5\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/MR_Bed.MR_Bed:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Ending/E2/MR_Bed.MR_Bed:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_MR_Bed\"\nmsgid \"We always wore colourful clothes because that made her happy.\"\nmsgstr \"Siempre ponía ropa de colores porque eso la hacía feliz.\"\n\n#. Key:\t7F5F069D4E9C7F15ED2B8CA45154FCFE\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/MR_Bed.MR_Bed:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E2/MR_Bed.MR_Bed:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_MR_Bed\"\nmsgid \"Most of her time she just lied here and stared at nothing.\"\nmsgstr \"La mayor parte de su tiempo se tumbaba aquí y miraba a la nada.\"\n\n#. Key:\tEA25DBC34832960AB03A32A5B08AC404\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/MR_Bed.MR_Bed:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E2/MR_Bed.MR_Bed:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_MR_Bed\"\nmsgid \"Sometimes she talked about grey lands.\"\nmsgstr \"A veces hablaba de tierras grises.\"\n\n#. Key:\t58E06C3A45DD46A34F155BAA62933039\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/MR_Chair.MR_Chair:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Ending/E2/MR_Chair.MR_Chair:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_MR_Chair\"\nmsgid \"I hope they will never find out how wrong they were. I hope there is still time for our World.\"\nmsgstr \"Espero que nunca descubran lo equivocados que estaban. Espero que todavía haya tiempo para nuestro Mundo.\"\n\n#. Key:\t9EA75B664E62ABF38E44BE8DC3050AC9\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/MR_Chair.MR_Chair:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E2/MR_Chair.MR_Chair:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_MR_Chair\"\nmsgid \"This is where the doctor used to sit. He never believed that Mom was infected by the Ruin.\"\nmsgstr \"Aquí es donde solía sentarse el médico. Nunca creyó que Mamá fuera infectada por Ruin.\"\n\n#. Key:\tA408630F44A3B2345A2D0AA8395D97F2\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/MR_Chair.MR_Chair:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E2/MR_Chair.MR_Chair:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_MR_Chair\"\nmsgid \"No one ever believed in Ruin.\"\nmsgstr \"Nadie creyó en Ruin.\"\n\n#. Key:\t1AFEF7EB49BB3BEA5BB76793A60ED7C9\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/MR_Lamps.MR_Lamps:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E2/MR_Lamps.MR_Lamps:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_MR_Lamps\"\nmsgid \"This room was the brightest in the castle.\"\nmsgstr \"Esta habitación era la más brillante del castillo.\"\n\n#. Key:\tC132BEA446B4441615D7029E8AA5BBB5\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/MR_Lamps.MR_Lamps:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E2/MR_Lamps.MR_Lamps:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_MR_Lamps\"\nmsgid \"I took some oil.\"\nmsgstr \"Me llevé un poco de aceite.\"\n\n#. Key:\tFE826997431A2665AC2788A62558B88E\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/MR_Lamps.MR_Lamps:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Ending/E2/MR_Lamps.MR_Lamps:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_MR_Lamps\"\nmsgid \"Father bought some exotic lamp oil so that we had coloured lights.\"\nmsgstr \"Papá compró un poco de aceite exótica para la lámpara para que tuviéramos luces de colores.\"\n\n#. Key:\t430A10B04FAC9288EC2794A31DF6699E\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/MR_Paintings.MR_Paintings:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E2/MR_Paintings.MR_Paintings:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_MR_Paintings\"\nmsgid \"Mom was always fond of art.\"\nmsgstr \"Mamá siempre fue aficionada al arte.\"\n\n#. Key:\t53AA7E134FA0E30F37FC8CB50425520F\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/MR_Paintings.MR_Paintings:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E2/MR_Paintings.MR_Paintings:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_MR_Paintings\"\nmsgid \"After she got sick she couldn’t paint the way she did before yet she still liked it.\"\nmsgstr \"Después de enfermarse, ya no podía pintar como antes, pero aún así le gustaba.\"\n\n#. Key:\t8484045A4107378E9CC8FFAA02C94A87\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/MR_Paintings.MR_Paintings:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Ending/E2/MR_Paintings.MR_Paintings:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_MR_Paintings\"\nmsgid \"It could engage her for hours.\"\nmsgstr \"Podría involucrarla por horas.\"\n\n#. Key:\t009BF08145DBE86FFB07BA9A6BD77A8E\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_5.Children(2).Children.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_5.Children(2).Children.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"Not my business\"\nmsgstr \"No es mi problema\"\n\n#. Key:\t00DE9BE1446C5D5C0D62469B41A1B693\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_5.Children(0).Children.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_5.Children(0).Children.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"Lillian?\"\nmsgstr \"¿Lillian?\"\n\n#. Key:\t0C3B729C4618E8A817F019B8E916425B\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"Maybe we failed the ritual again and summoned another of your kind.\"\nmsgstr \"Tal vez fallamos el ritual otra vez y convocamos a otro de tu clase.\"\n\n#. Key:\t0CAC15144B37144A99A9EB9D13CCC9DE\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_32.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_32.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"What do you expect me to do, Spirit?\"\nmsgstr \"¿Qué esperas que haga, Espíritu?\"\n\n#. Key:\t1493C597483503024A3C5CA8F0FA1327\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"I’ve already done way too much for you.\"\nmsgstr \"Ya he hecho demasiado por ti.\"\n\n#. Key:\t15BAD73D49BF7C62469D8E9CD0B2AAF4\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"Now, take me home!\"\nmsgstr \"¡Ahora llévame a casa!\"\n\n#. Key:\t1962A69C42E8FDD365AFC9AB626605F7\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"We made the spell... and it worked!\"\nmsgstr \"Hicimos el hechizo... ¡y funcionó!\"\n\n#. Key:\t1AC8DD104163078CA72065A0B43B5C57\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"And then what?\"\nmsgstr \"¿Y entonces que?\"\n\n#. Key:\t2034A3164695766F8C17B69CD0937C02\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_25.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_25.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"And he...\"\nmsgstr \"Y el...\"\n\n#. Key:\t22668011432DEF65ACF29793FF234E07\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_37.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_37.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"Someone like me...\"\nmsgstr \"Alguien como yo...\"\n\n#. Key:\t2386A8D24BD256982D486AAF71B57ABD\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_23.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_23.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"She destroyed half of the room before we could even cast a spell.\"\nmsgstr \"Ella destruyó la mitad de la habitación antes de que incluso pudiéramos lanzar un hechizo.\"\n\n#. Key:\t250E11A440445CAFB5252A92C5100735\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"That’s how you handle situations like these...\"\nmsgstr \"Así es como manejas situaciones como esta...\"\n\n#. Key:\t298BEA5646602444742C3BAD65866EF9\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"I’m not sure... Everything happened so fast.\"\nmsgstr \"No estoy seguro... Todo sucedió muy rápido.\"\n\n#. Key:\t2FAFABFC43A75D29B671739D16759E43\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"What happened?\"\nmsgstr \"¿Que pasó?\"\n\n#. Key:\t303D9BF54AB3034565A45594AB5636DF\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"I can’t... I’m sorry!\"\nmsgstr \"No puedo... ¡lo siento!\"\n\n#. Key:\t378D7F984C821E23AF0CBEA7D24EFCC1\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"What happened to Lillian? Has she returned?\"\nmsgstr \"¿Qué le pasó a Lillian? ¿Ha vuelto?\"\n\n#. Key:\t38EF0908448C7E5298C4F496DACAD5AD\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"Something... arrgh... something went wrong...\"\nmsgstr \"Algo... arrgh... algo salió mal...\"\n\n#. Key:\t3A328FA74AA2FBC2AFE84CA195DAE236\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"You are Raven’s master...\"\nmsgstr \"Eres el maestro de Cuervo...\"\n\n#. Key:\t462226704638D0C32B1DEBA3DFE138A1\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"She was taken over by a wicked force and she unleashed boundless spells.\"\nmsgstr \"Fue tomada por una fuerza perversa y desató hechizos ilimitados.\"\n\n#. Key:\t49B5501A4917D23E6B3B99B430076ABA\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"It was like the devil itself.\"\nmsgstr \"Era como el diablo mismo.\"\n\n#. Key:\t4B173FBD4D4F48A468016BB055CC573C\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"Where is Wizard? Something happened to him?\"\nmsgstr \"¿Dónde está el Mago? ¿Le ha pasado algo?\"\n\n#. Key:\t5341F61045AA32F212173EA9CAB67695\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_39.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_39.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"Wizard was right when he decided to trust you.\"\nmsgstr \"Mago tenía razón cuando decidió confiar en ti.\"\n\n#. Key:\t551AEBA64D1E99B2CCFA3DB13E168A02\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_27.Children(1).Children.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_27.Children(1).Children.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"I won’t fight\"\nmsgstr \"No pelearé\"\n\n#. Key:\t592A8CF045DF1BD875B05F9493FE2BB4\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_38.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_38.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"I will face her!\"\nmsgstr \"¡La enfrentaré!\"\n\n#. Key:\t5B65F12D43B12FA943D7469FEE2CE2E0\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"We made everything right...\"\nmsgstr \"Hicimos todo bien...\"\n\n#. Key:\t65A974C344D2B4DD644901994086A31D\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_30.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_30.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"Why is it that every time you refuse to face the consequences of your actions, it is me who needs to clean up your mess?\"\nmsgstr \"¿Por qué cada vez que te niegas a enfrentar las consecuencias de tus acciones, soy yo quien necesita arreglar las cosas?\"\n\n#. Key:\t66D0FDF04AF5351330E83080759ED974\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_40.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_40.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"I'm sorry that I can't help...\"\nmsgstr \"Lo siento pero no puedo ayudarte...\"\n\n#. Key:\t7FFE18B74C54BB92334399983F82DBCA\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_34.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_34.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"You are free to do whatever you want!\"\nmsgstr \"¡Eres libre de hacer lo que quieras!\"\n\n#. Key:\t8739EB3D48E4F2A997E604A60F7F32B3\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"Was it trapped inside a teddy bear?\"\nmsgstr \"¿Estaba atrapado dentro de un oso de peluche?\"\n\n#. Key:\t8E2F09164340534A484A46AD45E4E105\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_27.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_27.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"The demon-Lillian left. There is no one who could stop her now...\"\nmsgstr \"La demonio-Lillian se fue. No hay nadie que pueda detenerla ahora...\"\n\n#. Key:\t900D084E4F673FEBEACE3E916103B93E\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"She had fire in her eyes...\"\nmsgstr \"Tenía fuego en los ojos...\"\n\n#. Key:\t91C26C314425AB8C973F1FB54061F639\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"Lillian woke up and then...\"\nmsgstr \"Lillian se despertó y luego...\"\n\n#. Key:\t95CE9C6C4901E613AD5DB38E51AC0DB3\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_35.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_35.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"Leave and let me rest in peace...\"\nmsgstr \"Vete y déjame descansar en paz...\"\n\n#. Key:\t9AF3E069409F31E4F50A5990A416A39C\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_19.Children(1).Children.Text\n#. Key:\tF5A670D640D73DF452C02A948CB68F75\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_5.Children(1).Children.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_19.Children(1).Children.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_5.Children(1).Children.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"Wizard?\"\nmsgstr \"¿Mago?\"\n\n#. Key:\t9B1B8322442B6D7D76F2119E0A0574FA\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"Is the Wizard safe? What happened afterwards?\"\nmsgstr \"¿Está el Mago a salvo? ¿Qué pasó después?\"\n\n#. Key:\tA82789354D984476223432A2BE199293\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_24.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_24.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"I was hit by the table.\"\nmsgstr \"Fui golpeado por la mesa.\"\n\n#. Key:\tAA6EFD044C1D21008EEA189DE75740E7\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_41.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_41.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"Good luck with... everything!\"\nmsgstr \"¡Buena suerte con... todo!\"\n\n#. Key:\tACAF3D904A149C0E9F91E5AC852D8309\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_31.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_31.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"Let me go!\"\nmsgstr \"¡Déjame ir!\"\n\n#. Key:\tB223647F4C35858A62A5509C7B22C23B\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_27.Children(0).Children.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_27.Children(0).Children.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"I'll stop her\"\nmsgstr \"La detendré\"\n\n#. Key:\tD0E16FEF4D5415EC6D2C299252E5675D\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_26.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_26.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"He was burnt to ashes.\"\nmsgstr \"Fue quemado hasta las cenizas.\"\n\n#. Key:\tD23076F4475E6CE385ECB2B3B2749CA9\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_36.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_36.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"I have always wanted to meet someone of my own kind anyway.\"\nmsgstr \"Siempre he querido conocer a alguien de mi clase de todos modos.\"\n\n#. Key:\tD290445E4EB74446478970934785BA10\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"I can’t open a Gate without Wizard...\"\nmsgstr \"No puedo abrir una puerta sin asistente...\"\n\n#. Key:\tD6EB1BE248E9C483E6D94B8E8A7815F6\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"I don't understand... It is...\"\nmsgstr \"No entiendo... es...\"\n\n#. Key:\tEC42D62E46269139E9E69B876EDED5B1\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_33.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_33.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"It wasn't me who brought you here.\"\nmsgstr \"No fui yo quien te trajo aquí.\"\n\n#. Key:\tF0711D5F4698DAA99E484E94FDB3EF9C\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_19.Children(0).Children.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_19.Children(0).Children.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"Was it trapped?\"\nmsgstr \"¿Estaba atrapado?\"\n\n#. Key:\tFDE62A034456071EFE9639B73108BB1E\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"I can't let her destroy everything!\"\nmsgstr \"¡No puedo dejar que destruya todo!\"\n\n#. Key:\tFDFD2B2B4352B564118519874199B48C\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_29.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_29.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"No-no-no!\"\nmsgstr \"¡No no no!\"\n\n#. Key:\t2E3C904D458640A4F06DD793B416366A\n#. SourceLocation:\t/Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_SewerCreatures\"\nmsgid \"All right, I will return when I'm done.\"\nmsgstr \"Muy bien, volveré cuando termine.\"\n\n#. Key:\t41F6B75041803A654088469BCB887165\n#. SourceLocation:\t/Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_1.Children(0).Children.Text\n#: /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_1.Children(0).Children.Text\nmsgctxt \"Dialogue_SewerCreatures\"\nmsgid \"Really?\"\nmsgstr \"¿De Verdad?\"\n\n#. Key:\t43EE0E60407CA7CB7431BDB2767C6E19\n#. SourceLocation:\t/Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_SewerCreatures\"\nmsgid \"That's sad. What happened exactly?\"\nmsgstr \"Eso es triste. ¿Qué pasó exactamente?\"\n\n#. Key:\t53AC225B4F21B68CAC6F8997F324124E\n#. SourceLocation:\t/Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_29.Text\n#: /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_29.Text\nmsgctxt \"Dialogue_SewerCreatures\"\nmsgid \"Farewell until we meet again!\"\nmsgstr \"¡Adiós hasta que nos volvamos a ver!\"\n\n#. Key:\t5ED0CE6143EC50E6B5A1289D1A9A88E2\n#. SourceLocation:\t/Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_SewerCreatures\"\nmsgid \"I'm glad I could help.\"\nmsgstr \"Me alegro de poder ayudar.\"\n\n#. Key:\t65042BC342E9717229E74A9DD272DC5F\n#. SourceLocation:\t/Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_SewerCreatures\"\nmsgid \"It was nice to see you again.\"\nmsgstr \"Fue bueno verte otra vez.\"\n\n#. Key:\t77959A144131C47488B221ADD9B1E13B\n#. SourceLocation:\t/Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_SewerCreatures\"\nmsgid \"Don't worry! I'm still looking for it.\"\nmsgstr \"No te preocupes Todavía lo estoy buscando.\"\n\n#. Key:\t7914F3CA40844C2A13A760BB0DAE1BFA\n#. SourceLocation:\t/Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_SewerCreatures\"\nmsgid \"I don't have time for you creature! Stay out of my way!\"\nmsgstr \"¡No tengo tiempo para ti criatura! ¡Fuera de mi camino!\"\n\n#. Key:\t79A62658414FE0202F2E9AA0E0238BD4\n#. SourceLocation:\t/Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_9.Children(0).Children.Text\n#: /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_9.Children(0).Children.Text\nmsgctxt \"Dialogue_SewerCreatures\"\nmsgid \"Accept Quest\"\nmsgstr \"Aceptar Misión\"\n\n#. Key:\t7EF6CBFA4A9C0B85B26AA6830C6121A2\n#. SourceLocation:\t/Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_1.Children(2).Children.Text\n#: /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_1.Children(2).Children.Text\nmsgctxt \"Dialogue_SewerCreatures\"\nmsgid \"Leave\"\nmsgstr \"Salir\"\n\n#. Key:\t85A2E48A4B27C5EB7DA4CFAA23555629\n#. SourceLocation:\t/Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_26.Text\n#: /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_26.Text\nmsgctxt \"Dialogue_SewerCreatures\"\nmsgid \"Farewell and good luck to you as well!\"\nmsgstr \"¡Adiós y buena suerte!\"\n\n#. Key:\t9AEDA0E84BABEBCD8F18E8BC2D0B75D0\n#. SourceLocation:\t/Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_SewerCreatures\"\nmsgid \"Calm down creature! I mean you no harm.\"\nmsgstr \"¡Cálmate criatura! No quiero hacerte daño.\"\n\n#. Key:\tB89304534B24114D19DF7AB07635FFDE\n#. SourceLocation:\t/Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_SewerCreatures\"\nmsgid \"All right I will see what I can do.\"\nmsgstr \"Muy bien, veré qué puedo hacer.\"\n\n#. Key:\tB8BD374E4738BFFDAFAC4EAA19E7A9D2\n#. SourceLocation:\t/Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_23.Text\n#: /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_23.Text\nmsgctxt \"Dialogue_SewerCreatures\"\nmsgid \"Oh, thank you!\"\nmsgstr \"¡Oh gracias!\"\n\n#. Key:\tCAFA874D4ECD3CBFC0ADFD93048A9AA5\n#. SourceLocation:\t/Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_SewerCreatures\"\nmsgid \"Just tell me what do you want...\"\nmsgstr \"Solo dime que quieres...\"\n\n#. Key:\tCF62984840B7508E82BAC0AB9D53EC0A\n#. SourceLocation:\t/Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_9.Children(1).Children.Text\n#: /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_9.Children(1).Children.Text\nmsgctxt \"Dialogue_SewerCreatures\"\nmsgid \"Decline\"\nmsgstr \"Rechazar\"\n\n#. Key:\tDA1FD0DC49E9B2999DCD489699C04106\n#. SourceLocation:\t/Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_1.Children(1).Children.Text\n#: /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_1.Children(1).Children.Text\nmsgctxt \"Dialogue_SewerCreatures\"\nmsgid \"Let it talk\"\nmsgstr \"Déjalo hablar\"\n\n#. Key:\tEAD329F04773358B0CA339A4F155D990\n#. SourceLocation:\t/Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_SewerCreatures\"\nmsgid \"I'm sorry but I can't help you.\"\nmsgstr \"Lo siento pero no puedo ayudarte.\"\n\n#. Key:\tDA8649E54E3753ECDF9C4EAAB90D42B6\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/sewertut1.sewertut1:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/sewertut1.sewertut1:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_sewertut1\"\nmsgid \"I don't like the idea of this additional challenge, but without the help of the Keeper you won't be able to get out.\"\nmsgstr \"No me gusta la idea de este desafío adicional, pero sin la ayuda del Guardián no podrás salir.\"\n\n#. Key:\t462EF40B4BF77FA77FD98DB4656692A2\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/sewertut2_magicbox.sewertut2_magicbox:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/sewertut2_magicbox.sewertut2_magicbox:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_sewertut2_magicbox\"\nmsgid \"It's a magic box! That's what it's supposed to do, demon.\"\nmsgstr \"¡Es una caja mágica! Eso es lo que se supone que debe hacer, demonio.\"\n\n#. Key:\tC34B7D8D499A8E8B767A58A19537A1EA\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/sewertut2_magicbox.sewertut2_magicbox:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/sewertut2_magicbox.sewertut2_magicbox:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_sewertut2_magicbox\"\nmsgid \"Is that box just floating in the air?\"\nmsgstr \"¿Esa caja está flotando en el aire?\"\n\n#. Key:\t348CCFC54F7E952295416496617F7615\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/sewertut3_silverkey.sewertut3_silverkey:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/sewertut3_silverkey.sewertut3_silverkey:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_sewertut3_silverkey\"\nmsgid \"What is that crystal?\"\nmsgstr \"¿Qué es ese cristal?\"\n\n#. Key:\t554B6C924D0234A869BDFF9412FC4F49\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/sewertut3_silverkey.sewertut3_silverkey:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/sewertut3_silverkey.sewertut3_silverkey:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_sewertut3_silverkey\"\nmsgid \"Don't care about that. Focus on finding a way out.\"\nmsgstr \"No me importa eso. Concéntrese en encontrar una salida.\"\n\n#. Key:\t015A0B11422A6F2AE027FF8D9DF70664\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"We need his help.\"\nmsgstr \"Necesitamos su ayuda.\"\n\n#. Key:\t03C73AA849BF05421AB97BA696A8C9C4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_79.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_79.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"They always wanted to invade the Outpost. They are many and we are few.\"\nmsgstr \"Siempre quisieron invadir el Puesto Avanzado. Son muchos y nosotros somos pocos.\"\n\n#. Key:\t0849CCCF4491D52B38AE7F827841E479\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Why should I set you free?\"\nmsgstr \"¿Por qué debería liberarte?\"\n\n#. Key:\t090C7BBF4222952E1C3FD38F7CF9927E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_76.Text\n#. Key:\t0AC46EF744AA55EDDA83EDB6899BB2D1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_65.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_65.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_76.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Some say Tabby's spirit returned and took the artefacts to Lillian. Maybe that is what happened.\"\nmsgstr \"Algunos dicen que el espíritu de Tabby regresó y llevó los artefactos a Lillian. Tal vez eso es lo que pasó.\"\n\n#. Key:\t094943BF4D9202CE7B1CFCBF151886D5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Back to the question: will you get me out?\"\nmsgstr \"Volviendo a la pregunta: ¿me vas a sacar de aqui?\"\n\n#. Key:\t0DBF728A4C052550BE5EEDBC9DEFB2E0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_29.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_29.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"I would invite you for dinner but unfortunately the door is closed.\"\nmsgstr \"Te invitaría a cenar pero desafortunadamente la puerta está cerrada.\"\n\n#. Key:\t112A48C54853F7689E1676A11FA8C352\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_48.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_48.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"No time to talk!\"\nmsgstr \"No hay tiempo para hablar!\"\n\n#. Key:\t116C39AA495E99500962E8B3AF10DD4A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_83.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_83.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"I mean I'm sorry about the others... not that you survived.\"\nmsgstr \"Quiero decir que lamento lo de los demás... no es que hayas sobrevivido.\"\n\n#. Key:\t134299214C22044B012C27B62337C08E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_69.Text\n#. Key:\tFD1574E845CB284B7A85F09CA1580DD4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_58.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_58.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_69.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"But she is gone for months and no one knows where she might be.\"\nmsgstr \"Pero ella se fue hace meses y nadie sabe dónde podría estar.\"\n\n#. Key:\t14BD2A7C45E85692430B34820042C96F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_73.Text\n#. Key:\tEA5320F3406E2BFA9BD954899BFA19DA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_62.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_62.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_73.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"He had so many friends. We all gathered and buried him near the Ancient Temple.\"\nmsgstr \"Tenía tantos amigos. Nos reunimos y lo enterramos cerca del Templo Antiguo.\"\n\n#. Key:\t16E175D0437B4A671F4753A56E840278\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_33.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_33.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"I’m looking for three artefacts. Do you know something about them?\"\nmsgstr \"Estoy buscando tres artefactos. ¿Sabes algo sobre ellos?\"\n\n#. Key:\t174BA1E34131FB1BD5A543A3CB86C724\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_35.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_35.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"I will return to the Main Station at Crossroad Cave and see what I can do with the trains.\"\nmsgstr \"Volveré a la estación principal de la Cueva Cruce Caminos y veré qué puedo hacer con los trenes.\"\n\n#. Key:\t1769115D4B72AB6CF8641487126A4A18\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"It has a key. The end of it is shaped like a dwarven helmet. You can easily recognise it.\"\nmsgstr \"Tiene una llave. La punta tiene forma de un casco de los Enanos. Puedes reconocerlo fácilmente.\"\n\n#. Key:\t17CBB2E24B331E4C5682919AAD2E7F2E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_60.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_60.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"What happened to Tabby?\"\nmsgstr \"¿Qué le pasó a Tabby?\"\n\n#. Key:\t1AA8B2E541B2B2E7CA1E86B1E08C1E5A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"They are all dead...\"\nmsgstr \"Estarán todos muertos...\"\n\n#. Key:\t1FCCD37546681195736D2290A8DAE121\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Oh, it’s you again.\"\nmsgstr \"Oh, eres tú otra vez.\"\n\n#. Key:\t2581B27E486A1C71835E5BB44B0AE05E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_37.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_37.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"But first I finish my supper. See you there!\"\nmsgstr \"Pero primero terminaré mi cena. ¡Te veo allí!\"\n\n#. Key:\t2589E4AA4E5A406F6A98CB87D7382DC0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Just ask one of the other dwarfs to open the door.\"\nmsgstr \"Solo pídale a uno de los otros enanos que abra la puerta.\"\n\n#. Key:\t26162C784D2E65A2F8F491A80838F754\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_24.Children(4).Children.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_24.Children(4).Children.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Everyone dead?\"\nmsgstr \"¿Todos muertos?\"\n\n#. Key:\t2FEAED2844737D1B20BA64AE2414D8C6\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_72.Text\n#. Key:\tA119C2164FDE16E8F84B4E89578A1015\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_61.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_61.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_72.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"By the time I found him he was dead.\"\nmsgstr \"Cuando lo encontré estaba muerto.\"\n\n#. Key:\t3203A6044456CD8213037A9B1B668763\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Please help me out!\"\nmsgstr \"¡Por favor, ayúdame!\"\n\n#. Key:\t32C0BE7F49563BC2846691B4F163AEF7\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Well that explains why they didn’t come for me over the last four months.\"\nmsgstr \"Bueno, eso explica por qué no vinieron por mí en los últimos cuatro meses.\"\n\n#. Key:\t35F849134220FAE43E07268C439CE3A1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_31.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_31.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"What were you Dwarves doing here?\"\nmsgstr \"¿Qué estabais haciendo vosotros aquí, Enanos?\"\n\n#. Key:\t39D36DCA4CD40A7E19D4F5AE69954DC3\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_71.Text\n#. Key:\tEFD384D542A5869726CAB7945F4C0EC4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_54.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_54.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_71.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Tabby found the three artefacts but on his way home he got injured.\"\nmsgstr \"Tabby encontró los tres artefactos, pero de camino a casa resultó herido.\"\n\n#. Key:\t39DEF30C4C3CCAB79867339AABD92BA0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_24.Children(3).Children.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_24.Children(3).Children.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Artefacts\"\nmsgstr \"Artefactos\"\n\n#. Key:\t3AF0406744C4656C5604EF931A688715\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_23.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_23.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"I've found the key!\"\nmsgstr \"¡He encontrado la llave!\"\n\n#. Key:\t3E074E784D66BE166553EB9F85D9854A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"How can I set you free?\"\nmsgstr \"¿Cómo puedo liberarte?\"\n\n#. Key:\t4100ECBE40C53051121F4C8A588FBDCB\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_24.Children(2).Children.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_24.Children(2).Children.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Train\"\nmsgstr \"Tren\"\n\n#. Key:\t41085B174230937FAF97CDBC868F852A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_24.Children(5).Children.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_24.Children(5).Children.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Leave\"\nmsgstr \"Salir\"\n\n#. Key:\t4204AAFB49C665B3CC32D78301307582\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_45.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_45.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Do you mean those traps out there?\"\nmsgstr \"¿Te refieres a esas trampas ahí fuera?\"\n\n#. Key:\t44AF6FF04B8A23F656F485AB9F1AFE60\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_36.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_36.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Catch me there if you need to go somewhere!\"\nmsgstr \"¡Encuentrame allí si necesitas ir a algún lado!\"\n\n#. Key:\t48FC728C4467C7CF9692AEB8CC71352D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_49.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_49.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"I will catch you at Crossroad Cave after I finished my supper.\"\nmsgstr \"Te veré en Cueva Cruce Caminos después de que termine mi cena.\"\n\n#. Key:\t4A74231B43F74B39906C85904332EE87\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"What happened? How did you end up here?\"\nmsgstr \"¿Que pasó? ¿Cómo terminaste aquí?\"\n\n#. Key:\t4FE354D247D257B181993087E5ADC74C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Errr... I don’t know... out of pure righteousness perhaps?\"\nmsgstr \"Errr... no lo sé... ¿por pura justicia tal vez?\"\n\n#. Key:\t529895FF4D6B505A0EDB5081215845AE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_53.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_53.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"He wasn't just an ordinary cat. He was somehow connected to a charming young girl called Lillian.\"\nmsgstr \"No era un gato ordinario. Estaba de alguna manera conectado con una encantadora joven llamada Lillian.\"\n\n#. Key:\t5C005582439FD5753AA90BB72F3284C8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_44.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_44.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"We build walls. We create machines out of golem spirits with simple rules which can't go wrong.\"\nmsgstr \"Construimos muros. Creamos máquinas con espíritus golem con reglas sencillas que no pueden salir mal.\"\n\n#. Key:\t5C48292B4E4F1FAF4D7BB487713EA0B1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_59.Text\n#. Key:\t7F06827C4756423AE024F99922B00FDE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_70.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_59.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_70.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"I hope she will return.\"\nmsgstr \"Espero que ella regrese.\"\n\n#. Key:\t624EDA19418303508EA7F58C5BD0DB4E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"All right!\"\nmsgstr \"¡Todo bien!\"\n\n#. Key:\t64E994E34D543F58D0F9DAA386AD7438\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Or do you like trains? I can help you redirect them to stations you couldn’t go otherwise.\"\nmsgstr \"¿O te gustan los trenes? Puedo ayudarte a redirigirlos a estaciones a las que no podría ir de otra manera.\"\n\n#. Key:\t674A3DC8404EF8FC317D72A70877A0FF\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Errr... You know, sometimes in the evening I come here and have some late dinner. And there are others who think it would be funny to close the door when I'm inside.\"\nmsgstr \"Errr... Sabes, a veces por la noche vengo aquí y para una cena tarde. Y hay otros que piensan que sería divertido cerrar la puerta cuando aun estoy adentro.\"\n\n#. Key:\t6B07A15F4E86ECA507DE1DA9B0634774\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_74.Text\n#. Key:\t8F415D40481AA448025D79AB123B2DEB\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_63.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_63.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_74.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"He was a good friend. We all miss him.\"\nmsgstr \"Él era un buen amigo. Todos lo extrañamos.\"\n\n#. Key:\t6B47D3994D188506700B48BE85E0C740\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Once you collected all the artefacts you will need to take them back to a point where I can transport you to the Human Realm.\"\nmsgstr \"Una vez que hayas recogido todos los artefactos, deberás llevarlos de vuelta a un punto donde pueda transportarte al Reino Humano.\"\n\n#. Key:\t6B72634A488C0A9471F52AA154E56709\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_82.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_82.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"I’m sorry about that.\"\nmsgstr \"Lamento eso.\"\n\n#. Key:\t6C7C51F44B3881DDF4AE41B10F4D29E1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_52.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_52.Children(0).Children.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Tabby?\"\nmsgstr \"¿Tabby?\"\n\n#. Key:\t6EC585D64AFBB18576EE17B9DFC08AD7\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_2.Children(2).Children.Text\n#. Key:\tFB66CFE943F6EF32D1A40987B969DCDF\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_52.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_2.Children(2).Children.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_52.Children(1).Children.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"What happened?\"\nmsgstr \"¿Que pasó?\"\n\n#. Key:\t766A9A50425FA0D0A0374390B2AF5980\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"I like jokes and it would have been funny for I don’t know a few hours maybe...\"\nmsgstr \"Me gustan los chistes y hubiera sido divertido durante no sé unas horas tal vez...\"\n\n#. Key:\t81ABC3E441BE2D3A19257BBC9DDD42D0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_41.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_41.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"You can go down there by using the elevator.\"\nmsgstr \"Puedes bajar usando el ascensor.\"\n\n#. Key:\t85B4C0DB47A2A3C3D504C29965DB6390\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_75.Text\n#. Key:\tE6F106AA404B92C9C6E8889876002813\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_64.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_64.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_75.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"We left the artefacts at his tomb, but one day later they disappeared.\"\nmsgstr \"Dejamos los artefactos en su tumba, pero un día después desaparecieron.\"\n\n#. Key:\t88F0611349D22BB5B8411FA1232B8724\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_38.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_38.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Bye!\"\nmsgstr \"¡Adiós!\"\n\n#. Key:\t8A2BA24948D65C3EC801B6AA589C206F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_30.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_30.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Welcome back!\"\nmsgstr \"¡Bienvenido de nuevo!\"\n\n#. Key:\t8A3CCFA44EAB376D6CB4C3B7DD8CEE8D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_53.Children(0).Children.Text\n#. Key:\tEEEF64F84F3FE0A37D029EB1A8BBE8A9\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_55.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_53.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_55.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Lillian?\"\nmsgstr \"¿Lillian?\"\n\n#. Key:\t8B9C46EA4C46385E6B3770BBD4648280\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_67.Text\n#. Key:\t999245954FBA1853A5E67A88353F152E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_56.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_56.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_67.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Lillian was really kind to us Dwarves. We couldn't ever meet her in person but she could talk to us via the cat Tabby.\"\nmsgstr \"Lillian fue muy amable con nosotros Enanos. Nunca pudimos conocerla en persona, pero podía hablar con nosotros a través del gato Tabby.\"\n\n#. Key:\t90C6625D4ED5F6EA08B07A87450A1BC9\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_32.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_32.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"You said something about trains...\"\nmsgstr \"Dijiste algo sobre los trenes...\"\n\n#. Key:\t92793D7F4D0351BF74BB6A8C3EE6A182\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"How can I open the door?\"\nmsgstr \"¿Cómo puedo abrir la puerta?\"\n\n#. Key:\t941CF27C40D3D82D6B41F5B3DD6501BB\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_52.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_52.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"My friend Tabby was also looking for artefacts.\"\nmsgstr \"Mi amigo Tabby también estaba buscando artefactos.\"\n\n#. Key:\t991D611A4F8BE2F8EAC77C9D746BAF95\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_78.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_78.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"I think the Kobolds attacked us by surprise.\"\nmsgstr \"Creo que los Kobolds nos atacaron por sorpresa.\"\n\n#. Key:\t9A7FA46C4687C80EBE3B4580631E9B8E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_43.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_43.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"After the Cataclysm we realized the only way to fight madness is to create rules to follow.\"\nmsgstr \"Después del Cataclismo, nos dimos cuenta de que la única forma de luchar contra la locura es crear reglas a seguir.\"\n\n#. Key:\t9E9CE4714145ED45CA301AACA6CEBBAF\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_40.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_40.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"But there is a spare key in the Catacombs.\"\nmsgstr \"Pero hay una llave de repuesto en las Catacumbas.\"\n\n#. Key:\t9ED5DDC74852A2007D25CDB418A3EDDA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_46.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_46.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"They surely have nothing to do with madness...\"\nmsgstr \"Seguramente no tienen nada que ver con la locura...\"\n\n#. Key:\tA0117BB74AB541DE10847FBC5E5CCB32\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"What we were doing? Well we Dwarves are not like other creatures you might have met.\"\nmsgstr \"¿Que estábamos haciendo? Bueno, los enanos no somos como otras criaturas que podrías haber conocido.\"\n\n#. Key:\tA258ABB740D6727685853E88F32936E2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"That sounds useful.\"\nmsgstr \"Eso suena útil.\"\n\n#. Key:\tA3F231E34FB4B95DD27A84B9326E0BFE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_24.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_24.Children(0).Children.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Key\"\nmsgstr \"Llave\"\n\n#. Key:\tB0B806C147D2EB9F312987B49DEBFC8F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_47.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_47.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"See? They are simple, effective and logical. Ruin can't harm us as long as we follow all the rules.\"\nmsgstr \"¿Has visto? Son sencillos, efectivos y lógicos. Ruin no puede hacernos daño mientras sigamos todas las reglas.\"\n\n#. Key:\tB464CECC4F774535530FC685E0F62787\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_77.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_77.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Do you have any idea how the others died?\"\nmsgstr \"¿Tienes idea de cómo murieron los demás?\"\n\n#. Key:\tBE69B91C466965EEF56A6F920AF9E5A8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"I thought they were just kidding.\"\nmsgstr \"Pensé que solo estaban bromeando.\"\n\n#. Key:\tBFEAB99A4FE8C61CC35BCC9E926EFA97\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_51.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_51.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Just help me out.\"\nmsgstr \"Ayúdame.\"\n\n#. Key:\tC06E3A27466B5D6C7FC4A39E55739800\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"But being here for four months seems a bit too much for me.\"\nmsgstr \"Pero estar aquí durante cuatro meses me parecia demasiado.\"\n\n#. Key:\tC31327F8430D2259C27BAE91F44F0119\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_2.Children(0).Children.Text\n#. Key:\tCCD4C84941546627E158A4915B41CDB7\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_19.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_19.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_2.Children(0).Children.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"How?\"\nmsgstr \"¿Cómo?\"\n\n#. Key:\tC3BFAD59497E357A8180ADB86C75F14B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_68.Text\n#. Key:\tFF1A18C04F33FF434A2821A725CBFB5C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_57.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_57.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_68.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"She cared about us. She knew all our Strongholds and Outposts. She always warned us before the Kobolds attacked.\"\nmsgstr \"Ella se preocupaba por nosotros. Ella conocía todas nuestras Fortalezas y Puestos Avanzados. Siempre nos advirtió antes de que los Kobolds atacaran.\"\n\n#. Key:\tC5A94EDD47BC3D5F422A29982308E78D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_19.Children(1).Children.Text\n#. Key:\tF811970946DF32346DAE66AFE2F64664\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_2.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_19.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_2.Children(1).Children.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Why?\"\nmsgstr \"¿Por qué?\"\n\n#. Key:\tC8E54B6E448A194DEB141C84323308F6\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_80.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_80.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"It was only a matter of time.\"\nmsgstr \"Era sólo cuestión de tiempo.\"\n\n#. Key:\tCA02594643A55D1128F06FB2E8FDE676\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_50.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_50.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Yes, trains. I can help you reach destinations you couldn't reach on your own.\"\nmsgstr \"Si, trenes. Puedo ayudarte a llegar a destinos que no podrías alcanzar por tu propia cuenta.\"\n\n#. Key:\tCC191532450BFB2679AFD88AD95B72B2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Finally someone!\"\nmsgstr \"Por fin alguien!\"\n\n#. Key:\tCF4351D047E267981EF869BE88BB0753\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_24.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_24.Children(1).Children.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Dwarves\"\nmsgstr \"Enanos\"\n\n#. Key:\tD2377C864A2A80F17AD81581D7A7807F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_81.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_81.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Odd that I survived.\"\nmsgstr \"Extraño que haya sobrevivido.\"\n\n#. Key:\tDF12303E4C7A4DFB00054EA7CE07FF88\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_39.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_39.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Errr... I don't know.\"\nmsgstr \"Errr... no lo sé.\"\n\n#. Key:\tE8270F474353ECB77560C4A1173638A2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_27.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_27.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Any idea where that key might be?\"\nmsgstr \"¿Alguna idea de dónde podría estar esa llave?\"\n\n#. Key:\tEF1EFC6E4119CC9B41AF21ACE008D3B5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_26.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_26.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Have you found the key?\"\nmsgstr \"¿Has encontrado la llave?\"\n\n#. Key:\tF47418854FDFB9AD0E10468BEC8F1F58\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_42.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_42.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"I need to go now.\"\nmsgstr \"Necesito ir ahora.\"\n\n#. Key:\tF553C35F43DFC6CA04DA48A738597696\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_25.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_25.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Back already?\"\nmsgstr \"¿Ya estas de vuelta?\"\n\n#. Key:\tFF942F904300D874A8C59AB8A954EF86\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_34.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_34.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Well done! Thank you! Thank you!\"\nmsgstr \"¡Bien hecho! ¡Gracias! ¡Gracias!\"\n\n#. Key:\t0499C9ED4395C4DD8AD1E48E854CD983\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"It was nice to see you too!\"\nmsgstr \"¡Fue bueno verte también!\"\n\n#. Key:\t07153D014D72AF193040BA91A18BDC0A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_24.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_24.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"Great!\"\nmsgstr \"¡Genial!\"\n\n#. Key:\t106E51E34033895E5C7F348AF8994564\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"Er... Thanks! We'll talk about this later.\"\nmsgstr \"Er... ¡Gracias! Hablaremos de esto más tarde.\"\n\n#. Key:\t18E140B74385C5E48F23E0B7E862E569\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"Hello! It's nice to see you again.\"\nmsgstr \"¡Hola! Es bueno verte otra vez.\"\n\n#. Key:\t25F72BCA416C39658A0879A27417EA6B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"Don’t worry, I’ll make ready a train for you heading that way.\"\nmsgstr \"No te preocupes, prepararé un tren para ti en esa dirección.\"\n\n#. Key:\t26CBB1CD40F2080DE2183BA6AB3D2014\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"Ask him how you can travel to World’s End.\"\nmsgstr \"Pregúntale cómo puedes viajar al Fin del Mundo.\"\n\n#. Key:\t26D1F4534C708623FB300DBE4EECADD2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"But I can't go back, because it's not safe.\"\nmsgstr \"Pero no puedo regresar, porque no es seguro.\"\n\n#. Key:\t2B14E76B4B16316D7525FFA6D37E4CBB\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"You know I'm a bit worried about what will happen to the Outpost.\"\nmsgstr \"Sabes que estoy un poco preocupado por lo que sucederá con el Puesto Avanzado.\"\n\n#. Key:\t2BB0F16046A4CD8DF05DE6A95D2CF9B3\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"I’m really glad you found that key for me. Now I can finish my supper outside in fresh air!\"\nmsgstr \"Estoy muy contento de que hayas encontrado esa llave para mí. ¡Ahora puedo terminar mi cena al aire libre!\"\n\n#. Key:\t36EF13F042D5B5ADB870BEB97F688D08\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_29.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_29.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"Take this! You deserve it!\"\nmsgstr \"¡Toma esto! ¡Te lo mereces!\"\n\n#. Key:\t3E09B8F746E999130D26A0BEA945E6D6\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"Is everything all right?\"\nmsgstr \"¿Todo está bien?\"\n\n#. Key:\t4D5A326948713FE977D0DBB68CF4A475\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_27.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_27.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"Except those crazy traps...\"\nmsgstr \"Excepto esas trampas locas...\"\n\n#. Key:\t5BE2C4324B64B35BD181B49E2D63E87F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"By the way, in case you need to go somewhere with the train just let me know.\"\nmsgstr \"Por cierto, en caso de que necesites ir a algún lugar con el tren, avísame.\"\n\n#. Key:\t66EDC37F4F3B3813F1B92D91A4107ADE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"I have banished some of the monsters lurking in the Outpost.\"\nmsgstr \"He desterrado a algunos de los monstruos que acechan en el Puesto Avanzado.\"\n\n#. Key:\t67EED0C742F3B4ED0A9B929C4B517A4A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"The Outpost is safe again.\"\nmsgstr \"El Puesto Avanzado está a salvo otra vez.\"\n\n#. Key:\t6F1AF94E4DE4A338EFF79C85D99B944A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_19.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_19.Children(1).Children.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"Outpost\"\nmsgstr \"Puesto Avanzado\"\n\n#. Key:\t84D15B994BADC0AAED61848E817E49E1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"Thanks!\"\nmsgstr \"¡Gracias!\"\n\n#. Key:\t8C7D69324C544DAC53C5CCA724B4B461\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_23.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_23.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"Could you somehow make the enemies move to somewhere else maybe?\"\nmsgstr \"¿Podría de alguna manera hacer que los enemigos se muden a otro lugar tal vez?\"\n\n#. Key:\t8F66738A44B7D19EABAD40873B3FCAA3\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_19.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_19.Children(0).Children.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"Do you need help?\"\nmsgstr \"¿Necesita ayuda?\"\n\n#. Key:\t9249DFC34CFB46E1738C97A3283268D2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"Well done! Well done!\"\nmsgstr \"¡Bien hecho! ¡Bien hecho!\"\n\n#. Key:\tA027C29849372B1C452083A84609B1F5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_19.Children(2).Children.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_19.Children(2).Children.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"Leave\"\nmsgstr \"Salir\"\n\n#. Key:\tA037C9E543AC131DAF4B6281A27BD56C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"Hello again my friend!\"\nmsgstr \"¡Hola de nuevo amigo!\"\n\n#. Key:\tA4F1343D4D537FC1907096B564D3842E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"Oh, it must be a charming place!\"\nmsgstr \"¡Oh, debe ser un lugar encantador!\"\n\n#. Key:\tACF022EF4C55A6553F29DB969827379D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_26.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_26.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"Anyway, take this for your effort!\"\nmsgstr \"De todos modos, ¡toma esto por tu esfuerzo!\"\n\n#. Key:\tB680A1D54923C59C081E46A65A2754D1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"As the last Defender, it would be my duty to keep that place safe.\"\nmsgstr \"Como último Defensor, sería mi deber mantener ese lugar seguro.\"\n\n#. Key:\tB9E0526D41FDB742FCB51991A0220B17\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"That’s where I can take you out of the Ruined Realm.\"\nmsgstr \"Ahí es donde puedo sacarte del Reino Arruinado.\"\n\n#. Key:\tBF1AD65A407133C13B811CB14A997A2A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"We can talk some more once I've finished my supper...\"\nmsgstr \"Podemos hablar un poco más una vez que haya terminado mi cena...\"\n\n#. Key:\tE211EA4D4D69D09144B914850B17A8AE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_25.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_25.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"Well, I can't do my duty until you banish all of them.\"\nmsgstr \"Bueno, no puedo cumplir con mi deber hasta que los elimines a todos.\"\n\n#. Key:\tEFD408FF4DAFD18E10ED3282D959914E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"You don't need to go anywhere before you find the three artefacts.\"\nmsgstr \"No necesita ir a ningún lado antes de encontrar los tres artefactos.\"\n\n#. Key:\tF500AA3C494B40302E298CA54FF3344B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"I would like to go to World’s End.\"\nmsgstr \"Me gustaría ir al Fin del Mundo.\"\n\n#. Key:\tFDC63C35472E1752E2D092BC77DAD28B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"I'll see what I can do.\"\nmsgstr \"Veré lo que puedo hacer.\"\n\n#. Key:\t00A5A8684B1EF5FF2319428685540844\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_13.Children(0).Children.Text\n#. Key:\t471B46884399845B6D9442A8EADC2A48\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_9.Children(0).Children.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_13.Children(0).Children.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_9.Children(0).Children.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"Portal\"\nmsgstr \"Portal\"\n\n#. Key:\t03EA3D4249797B593981C1B699A2CF5A\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"Oh! The Walking Ball returned! Just in time!\"\nmsgstr \"Oh! ¡La Pelota andante regresó! ¡Justo a tiempo!\"\n\n#. Key:\t04DC604342615AD3DCFCE99EB9AAF157\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_19.Children(1).Children.Text\n#. Key:\t1070909F4434D9B0D03DD3BD62692CE0\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_16.Children(0).Children.Text\n#. Key:\t76A679CE45B5A9A47CA620A396E02F48\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_13.Children(2).Children.Text\n#. Key:\t8FC1E822454A2FDA1847119C5004F161\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_21.Children(0).Children.Text\n#. Key:\t9036093D446B2F8C34705BBCFC73F4A0\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_9.Children(2).Children.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_13.Children(2).Children.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_16.Children(0).Children.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_19.Children(1).Children.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_21.Children(0).Children.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_9.Children(2).Children.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"Leave\"\nmsgstr \"Salir\"\n\n#. Key:\t142E85484BA4E9CF475F0780D951BAE5\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"But they were so tasty.\"\nmsgstr \"Pero eran muy sabrosos.\"\n\n#. Key:\t1E763B4D4D535AA83B50D4B87DB5A15D\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"You again?\"\nmsgstr \"¿Tú otra vez?\"\n\n#. Key:\t2430044E46A3456249D6A99D0FC31D30\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_9.Children(1).Children.Text\n#. Key:\tB3695A284A15574F3874BDAB1B8C14EB\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_19.Children(0).Children.Text\n#. Key:\tDC8D78774D326DA9A70EFC81A857A417\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_13.Children(1).Children.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_13.Children(1).Children.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_19.Children(0).Children.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_9.Children(1).Children.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"Give Weird Device\"\nmsgstr \"Dar Aparato Extraño\"\n\n#. Key:\t29AD586B41502E4FAFF79E94FDADA50D\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"Unfortunately I don't have any.\"\nmsgstr \"Lamentablemente no tengo ninguno.\"\n\n#. Key:\t3418CA5A44B4531926317CB100CEC2F4\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"Just let me know when you're done! Meanwhile, I'll be reading a few more pages.\"\nmsgstr \"¡Avísame cuando hayas terminado! Mientras tanto, leeré algunas páginas más.\"\n\n#. Key:\t37CD676C4C4F585C3CC048B56EEF6B92\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"I was supposed to find a portal here.\"\nmsgstr \"Se suponía que debía encontrar un portal aquí.\"\n\n#. Key:\t3C2778B12A09151A002F016B1E3F6212\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"Also, if I hadn't drank the last two bottles... that would have helped...\"\nmsgstr \"Además, si no hubiera bebido las dos últimas botellas... eso habría ayudado...\"\n\n#. Key:\t42E3EE32491F578E618913B4AF958187\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"Really? That sounds like my students! They were always complaining about unannounced examinations or even worse, \\\"Why are there no lessons tomorrow?\\\".\"\nmsgstr \"De Verdad? Eso suena como mis alumnos! Siempre se quejaban de exámenes no anunciados o incluso peor, \\\"¿Por qué no hay clases mañana?\\\".\"\n\n#. Key:\t44626CCD498CA592B8FAD1B01EDF33AB\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_2.Children(0).Children.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_2.Children(0).Children.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"Don't have\"\nmsgstr \"No tengo\"\n\n#. Key:\t55EAD2524D0BCF52B25A1B9EAB1754B2\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"That's it my ball! I wish I had more students like you.\"\nmsgstr \"¡Eso es mi pelota! Desearía tener más estudiantes como tú.\"\n\n#. Key:\t6682474947E016803A188FA968FD76BE\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"Oh my...\"\nmsgstr \"Oh mi...\"\n\n#. Key:\t786849EF4E531580865712BBEDD25B32\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"That is amazing! Thank you, my globular friend! Take these coins, I am sure that you will enjoy spending them on... on whatever Balls like you like to get.\"\nmsgstr \"¡Esto es increíble! ¡Gracias mi amigo globular! Toma estas monedas, estoy seguro de que disfrutarás gastándolas en... en lo que sea que las pelotas como tu le gusta.\"\n\n#. Key:\t7FFC816545AA219D43FCA3A2ABF33E9E\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"Nevermind, I will just read a bit more... at least until a solution is found for the whole problem.\"\nmsgstr \"No importa, solo leeré un poco más... al menos hasta que se encuentre una solución para todo el problema.\"\n\n#. Key:\t818E4C1245F622C192178CB1F21694A3\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_2.Children(1).Children.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_2.Children(1).Children.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"What's the matter?\"\nmsgstr \"¿Qué pasa?\"\n\n#. Key:\t84A119EB4FFB518BA7AA6394768F1DD3\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"Did the Gatekeeper open the gate for you?\"\nmsgstr \"¿El Guardián te abrió la puerta?\"\n\n#. Key:\t88FD93954B70482DAC5F2AA5332F23D5\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"One must always be eager to solve a problem. No matter how challenging that is.\"\nmsgstr \"Uno siempre debe estar ansioso por resolver un problema. No importa cuán desafiante sea eso.\"\n\n#. Key:\t9CEE1942434DACB2DB3C1AA2005A1E94\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"But we might find another way to solve the problem.\"\nmsgstr \"Pero podríamos encontrar otra forma de resolver el problema.\"\n\n#. Key:\tC070EF8E47744D116D4E39AC8F7C1941\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"I hope that you still have at least one bottle of that potion of mine. I could really use some...\"\nmsgstr \"Espero que todavía tengas al menos una botella de esa poción mía. Podría usar un poco...\"\n\n#. Key:\tC39CD0F34CDFDCB0B2CF08917834F1A8\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"Here is a Weird Device that I found in the hideout of the Secret Science Society.\"\nmsgstr \"Aquí hay un Aparato Extraño que encontré en el escondite de la Sociedad Secreta de Ciencias.\"\n\n#. Key:\tCBB0BCAF4E19F942AC57F988104A9A65\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"I've used all of them to get back from the Sewer. You should have told me that there is another way out!\"\nmsgstr \"Los he usado todos para regresar de la Alcantarilla. ¡Deberías haberme dicho que hay otra salida!\"\n\n#. Key:\tE866A83647B163E53260C2B541AA0D7B\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"Well, the portal is definitely here, but as you might have already noticed, the place is a bit worn.\"\nmsgstr \"Bueno, el portal está aquí, pero como ya habrás notado, el lugar está un poco desgastado.\"\n\n#. Key:\tF0A4AD1448267D94CAB7F79AD6CEFD59\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"Not Yet.\"\nmsgstr \"Aún no.\"\n\n#. Key:\tF83C2C894C2EA511DCDCE6B824CC0591\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"Only the Gatekeeper can reopen the portal.\"\nmsgstr \"Solo el Guardián puede volver a abrir el portal.\"\n\n#. Key:\t76653DEC40EE0ED098B5EE8810B1A097\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/TL_GetSoulkeeper.TL_GetSoulkeeper:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/TL_GetSoulkeeper.TL_GetSoulkeeper:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_TL_GetSoulkeeper\"\nmsgid \"A Spellcaster. It makes you able to use the Ruined Realm's magic, at least, up to a certain level.\"\nmsgstr \"Un Lanzador de Hechizos. Te permite usar la magia del Reino Arruinado, al menos, hasta cierto nivel.\"\n\n#. Key:\tBD48F7804F49751510AB2E909906C52F\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/TL_GetSoulkeeper.TL_GetSoulkeeper:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/TL_GetSoulkeeper.TL_GetSoulkeeper:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_TL_GetSoulkeeper\"\nmsgid \"What is it?\"\nmsgstr \"¿Qué es?\"\n\n#. Key:\tDFF1C93D4005A778F0B696A2DC949DC6\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/TL_GetSoulkeeper.TL_GetSoulkeeper:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/TL_GetSoulkeeper.TL_GetSoulkeeper:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_TL_GetSoulkeeper\"\nmsgid \"That amulet is useful.\"\nmsgstr \"Ese amuleto es útil.\"\n\n#. Key:\t09CDAFF84CF3F066B25A228640D45277\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_TL_Monk\"\nmsgid \"Please tell your Wizard that Monk would like to have a word with him.\"\nmsgstr \"Por favor, dile a tu Mago que Monje le gustaría hablar con él.\"\n\n#. Key:\t0E97585C46B73E4AF939169CF45067A3\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_TL_Monk\"\nmsgid \"I can only guess that right now, he's complaining about me.\"\nmsgstr \"Solo puedo imaginar que ahora mismo se está quejando de mí.\"\n\n#. Key:\t2E82A2B6449D8BA37ADBE7AEE1486791\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_TL_Monk\"\nmsgid \"Just get rid of him.\"\nmsgstr \"Deshazte de él.\"\n\n#. Key:\t430D927D40EF24EED23E55A83F48FDD7\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_TL_Monk\"\nmsgid \"I'm sorry but he doesn't want to talk to you.\"\nmsgstr \"Lo siento, pero no quiere hablar contigo.\"\n\n#. Key:\t59E21DC1476038EAD4EC91BC00DA4D8B\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_3.Children(2).Children.Text\n#: /Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_3.Children(2).Children.Text\nmsgctxt \"Dialogue_TL_Monk\"\nmsgid \"Ask Wizard\"\nmsgstr \"Preguntar el Mago\"\n\n#. Key:\t5AFB166C49DEB2D9017AED887A1E424D\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_TL_Monk\"\nmsgid \"Farewell, my friend, until we meet again!\"\nmsgstr \"¡Adiós, amigo, hasta que nos volvamos a ver!\"\n\n#. Key:\t5D80CBEB46203E3A759B498B95571F4F\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_3.Children(1).Children.Text\n#: /Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_3.Children(1).Children.Text\nmsgctxt \"Dialogue_TL_Monk\"\nmsgid \"I won't transfer!\"\nmsgstr \"¡No voy a transferir!\"\n\n#. Key:\t66D9E1874A9749A8881372807C0B9D54\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_TL_Monk\"\nmsgid \"Ha-ha-ha... I know he heard everything.\"\nmsgstr \"Ja, ja, ja... Sé que lo escuchó todo.\"\n\n#. Key:\t8BD7C20C4084000925D1489BE3F6EE15\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_TL_Monk\"\nmsgid \"I don't talk to him!\"\nmsgstr \"¡No hablo con él!\"\n\n#. Key:\tA227CE5A47002A80D3988ABA1364CF3E\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_3.Children(0).Children.Text\n#: /Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_3.Children(0).Children.Text\nmsgctxt \"Dialogue_TL_Monk\"\nmsgid \"Wizard don't want\"\nmsgstr \"Mago no quiere\"\n\n#. Key:\tA8E469374586A1D8A734D696AF662F9A\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_TL_Monk\"\nmsgid \"I also have something for you, Wanderer!\"\nmsgstr \"¡También tengo algo para ti, Errante!\"\n\n#. Key:\tCE0E3B1B424BEDDF4A830B8DD0BB3272\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_TL_Monk\"\nmsgid \"This might help you along the way.\"\nmsgstr \"Esto podría ayudarte en el camino.\"\n\n#. Key:\tD6B184754B86F236C93454A95BF92B31\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_TL_Monk\"\nmsgid \"I won't deliver your messages anymore! If the two of you want something, then go get it yourselves!\"\nmsgstr \"¡Ya no entregaré tus mensajes! Si los dos quieren algo, ¡ve a buscarlo!\"\n\n#. Key:\tDB3AEAF24056B19A7D80E29E7D011D80\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_TL_Monk\"\nmsgid \"That's right. I will give him more time.\"\nmsgstr \"Así es. Le daré más tiempo.\"\n\n#. Key:\tE2F9F07A4A2B8D1A578BCC9716AB4D44\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_TL_Monk\"\nmsgid \"Wizard! A fellow named Monk wants to talk to you!\"\nmsgstr \"¡Mago! ¡Un tipo llamado Monje quiere hablar contigo!\"\n\n#. Key:\tE8987AC84528E4071DC27E9854C3C4DE\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_TL_Monk\"\nmsgid \"Hello, little Wanderer!\"\nmsgstr \"¡Hola, pequeño Errante!\"\n\n#. Key:\tFF355D9347D0068FBB40879E3EAEA8FB\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_TL_Monk\"\nmsgid \"But please...\"\nmsgstr \"Pero por favor...\"\n\n#. Key:\tAC0DE5F1402FBAAFE6587B827D463C3C\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/TL_SoulkeeperHint.TL_SoulkeeperHint:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/TL_SoulkeeperHint.TL_SoulkeeperHint:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_TL_SoulkeeperHint\"\nmsgid \"Use the Soulstone to summon the Keeper.\"\nmsgstr \"Usa la Piedra de Alma para invocar al Guardián.\"\n\n#. Key:\t031849B3493F1528A0146DA55BD7F00F\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/TL_TakeSoulkeeperHint.TL_TakeSoulkeeperHint:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/TL_TakeSoulkeeperHint.TL_TakeSoulkeeperHint:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_TL_TakeSoulkeeperHint\"\nmsgid \"It would be easier if I could just simply summon her back to me...\"\nmsgstr \"Sería más fácil si pudiera convocarla de vuelta a mí...\"\n\n#. Key:\t259EE9E14B86B2597D5F4EA60831D269\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/TL_TakeSoulkeeperHint.TL_TakeSoulkeeperHint:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/TL_TakeSoulkeeperHint.TL_TakeSoulkeeperHint:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_TL_TakeSoulkeeperHint\"\nmsgid \"Be more careful the next time...\"\nmsgstr \"Ten más cuidado la próxima vez...\"\n\n#. Key:\t86266BC54CC02BE988EA24B18BF76359\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/TL_TakeSoulkeeperHint.TL_TakeSoulkeeperHint:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/TL_TakeSoulkeeperHint.TL_TakeSoulkeeperHint:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_TL_TakeSoulkeeperHint\"\nmsgid \"Now go back to the Soulkeeper.\"\nmsgstr \"Ahora vuelve al Guardián de Almas.\"\n\n#. Key:\tDCA8CF9A4CFF4644FBD42EADBFC6E773\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/TL_TakeSoulkeeperHint.TL_TakeSoulkeeperHint:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/TL_TakeSoulkeeperHint.TL_TakeSoulkeeperHint:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_TL_TakeSoulkeeperHint\"\nmsgid \"Er... It's still with me.\"\nmsgstr \"Er... Todavía está conmigo.\"\n\n#. Key:\t012DDB8E4423EB98285155B3E1EFBF9A\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_65.Children(2).Children.Text\n#. Key:\t3485AE344D04D0944341F3A7391703EF\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.Children(3).Children.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_65.Children(2).Children.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.Children(3).Children.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"Set me free\"\nmsgstr \"Libérame\"\n\n#. Key:\t04E44BE94ABFE8614689AC890D01001D\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_65.Children(1).Children.Text\n#. Key:\t275944AA468D9CA8613B9586EC3D9C62\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.Children(2).Children.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_65.Children(1).Children.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.Children(2).Children.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"How to open gate\"\nmsgstr \"Cómo abrir la puerta\"\n\n#. Key:\t10EB6BE941C633380422F7953F0171DA\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"I think... I am...\"\nmsgstr \"Creo que estoy...\"\n\n#. Key:\t22618C8F490BC5932411FFB41F38C383\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.SpeechSequence(0).SpeechSequence.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.SpeechSequence(0).SpeechSequence.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"Oh! A walking ball!\"\nmsgstr \"Oh! ¡Una pelota que camina!\"\n\n#. Key:\t28ED4B8B4023E9A859B8A4BFF7DFEE8A\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"I am crazy, therefore I think!\"\nmsgstr \"Estoy loco, por eso pienso!\"\n\n#. Key:\t389F7FA440377CA4EBA31DA4EE2FEEAE\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_65.Children(3).Children.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_65.Children(3).Children.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"Leave\"\nmsgstr \"Salir\"\n\n#. Key:\t408E74BC4DBA10DA41853B9421DBA07B\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_65.Children(0).Children.Text\n#. Key:\t55BC9258400712FE4D5CED8BFA0AD22C\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.Children(1).Children.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_65.Children(0).Children.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.Children(1).Children.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"How to prove Worthy\"\nmsgstr \"Cómo demostrar que soy digno\"\n\n#. Key:\t5D0DBB0344815D41A50D9FA178339BCA\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_24.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_24.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"Here, take one!\"\nmsgstr \"¡Toma, toma uno!\"\n\n#. Key:\t5E8C88684BE93A26C26BFBAF23D69FD9\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.SpeechSequence(5).SpeechSequence.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.SpeechSequence(5).SpeechSequence.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"And I am not wise. In fact, I am totally crazy. But look on the bright side! At least I am aware of it.\"\nmsgstr \"Y no soy sabio. De hecho, estoy totalmente loco. ¡Pero mira el lado bueno! Al menos soy consciente de ello.\"\n\n#. Key:\t5F9588AA4FFA9FEB2C7101B32CB98950\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_55.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_55.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"Come back if you change your mind!\"\nmsgstr \"¡Regresa si cambias de opinión!\"\n\n#. Key:\t69BF5D3C44D3BE2468ADDF97E99920E9\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"I think something's happening with the door's mechanism... but who knows? I can definitely hear some creaking! It's hard to guess which one of those is the real one...\"\nmsgstr \"Creo que algo está pasando con el mecanismo de la puerta... ¿quién sabe? ¡Puedo escuchar algunos crujidos! Es difícil adivinar cuál de ellos es el verdadero...\"\n\n#. Key:\t6B46CC3F44284076B1F460BEE2D93116\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.SpeechSequence(1).SpeechSequence.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.SpeechSequence(1).SpeechSequence.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"How unique, how original, how... sporty!\"\nmsgstr \"¡Qué único, qué original, qué... deportivo!\"\n\n#. Key:\t6DFC995B4364B6358A8F00BEDD007C80\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"I am, therefore I think!\"\nmsgstr \"¡Lo estoy, por lo tanto, creo!\"\n\n#. Key:\t72FA8AF8413CF23907BB9EA6587F512E\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_63.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_63.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"I was pretty sure I had to face him too... that's why I prepared! Potion of Worthiness! I have a few bottles...\"\nmsgstr \"Estaba bastante seguro de que tenía que enfrentarle... ¡por eso me preparé! Poción de Valía! Tengo un par botellas...\"\n\n#. Key:\t7BB736394144C8B2173886993EE33ADA\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"Look, I'm forced to stay in this realm so that I could do all these silly tasks for a wizard. Any chance you could help me with that? Please?\"\nmsgstr \"Mira, me veo obligado a permanecer en este reino para hacer todas estas tontas tareas para un mago. ¿Alguna posibilidad de que puedas ayudarme con ello? ¿Por favor?\"\n\n#. Key:\t7E8985A441145AE9365C64810036EBE0\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.SpeechSequence(3).SpeechSequence.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.SpeechSequence(3).SpeechSequence.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"Actually yes, I...\"\nmsgstr \"En realidad sí, yo...\"\n\n#. Key:\t85CB0B164556D460A07F948F942D7AC4\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_61.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_61.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"That's how these rusty monsters work like: you pull a few levers here and there, and... whoops, the door is open! It's called science!\"\nmsgstr \"Así es como funcionan estos monstruos oxidados: tiras de algunas palancas aquí y allá, y... ¡Vaya, la puerta está abierta! ¡Se llama ciencia!\"\n\n#. Key:\t878921884D0FDCFC78971E828C7D7FBB\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_66.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_66.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"I've got to go...\"\nmsgstr \"Tengo que ir...\"\n\n#. Key:\t8FF0B1A64B29AAB8DABAC49F5EBCE625\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_60.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_60.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"That's easy! Just pull every single lever you can find.\"\nmsgstr \"¡Eso es fácil! Simplemente tire de cada palanca que pueda encontrar.\"\n\n#. Key:\t9163F7AB40673D9EB5C936A37CC7B0C7\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_62.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_62.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"Sounds like you met the GateKeeper!\"\nmsgstr \"¡Parece que conociste al Guardián de la Puerta!\"\n\n#. Key:\t96EED9B34D798E48F9B47283A5290A5B\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.SpeechSequence(4).SpeechSequence.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.SpeechSequence(4).SpeechSequence.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"It was a rhetorical question. I am not old!\"\nmsgstr \"Era una pregunta retórica. ¡No soy viejo!\"\n\n#. Key:\tB3141D2247D5DF307B63A4BF330F8070\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_67.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_67.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"Not really, I don't feel like helping you out. And to be honest, I prefer to stay away from wizards. Sorry!\"\nmsgstr \"En realidad no, no tengo ganas de ayudarte. Y para ser honesto, prefiero alejarme de los magos. ¡Lo siento!\"\n\n#. Key:\tB7A8F5A6474D18116F76BC929DB28D40\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"It's been nice meeting you.\"\nmsgstr \"Ha sido un placer conocerte.\"\n\n#. Key:\tBE16F7204818B7231748D1B9C55DB4F6\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"Here, take this! I hope it's worth the trouble... hahaha... Thanks to you I can continue with my journey... after I read a few more pages, of course.\"\nmsgstr \"¡Aquí, ten esto! Espero que valga la pena... jajaja... Gracias a ti puedo continuar con mi viaje... después de leer algunas páginas más, por supuesto.\"\n\n#. Key:\tBF9983D645C558E1AB5D559E70FEFDA0\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.SpeechSequence(6).SpeechSequence.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.SpeechSequence(6).SpeechSequence.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"Is there anything a middle-aged crazy gnome scientist can do for you? Now, this one is not a rhetorical question!\"\nmsgstr \"¿Hay algo que un gnomo científico loco de mediana edad pueda hacer por ti? ¡Esta si que no es una pregunta retórica!\"\n\n#. Key:\tC29E98A84971D7F0585C0F9522C30209\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_64.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_64.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"I will give you one if you are kind enough to open this door for me! I am stuck on the other side, you see...\"\nmsgstr \"¡Te daré uno si eres tan amable de abrir esta puerta para mi! Estoy atrapado en el otro lado, ves...\"\n\n#. Key:\tC8BEE9304FE466C0EB9F76A0B8A770D6\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.Children(0).Children.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.Children(0).Children.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"No way!\"\nmsgstr \"¡De ninguna manera!\"\n\n#. Key:\tCB197A5E46F44960333A02B7691B0EA6\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"Thanks and good luck!\"\nmsgstr \"¡Gracias y buena suerte!\"\n\n#. Key:\tCD2D130744EE2EDC8C96B1A286FCCD28\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"Getting help from a mad scientist? Thanks, but I would rather skip that!\"\nmsgstr \"¿Obteniendo ayuda de un científico loco? Gracias, pero prefiero saltar eso!\"\n\n#. Key:\tD0A8B5EA452D49F6400A18A2CDAC9A0E\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_29.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_29.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"I am crazy, therefore I am!\"\nmsgstr \"¡Estoy loco, por lo tanto lo estoy!\"\n\n#. Key:\tDA95542D4776F0EF7909078DED258AF8\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_27.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_27.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"You managed to open the gate! Well done!\"\nmsgstr \"¡Te las arreglaste para abrir la puerta! ¡Bien hecho!\"\n\n#. Key:\tDEC93709471D0B331684CFAF42A65B49\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_37.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_37.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"How unfortunate! And I thought that I was the idiot here. You will totally need my help... you'll see.\"\nmsgstr \"¡Que desafortunado! Y pensé que era el idiota aquí. Vas a necesitar mi ayuda... ya verás.\"\n\n#. Key:\tDF18B66D4109CAA0BCC1FDBED74521CD\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"Some kind of golem sent me here to prove my worthiness... any idea how I could do that?\"\nmsgstr \"Un tipo de golem me envió aquí para demostrar mi valía... ¿alguna idea de cómo podría hacer eso?\"\n\n#. Key:\tE546AE1443A4262B05869CB758E42CF2\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.SpeechSequence(2).SpeechSequence.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.SpeechSequence(2).SpeechSequence.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"Is there anything an old wise gnome scientist could do for you, I wonder?\"\nmsgstr \"¿Hay algo que un viejo y sabio científico gnomo pueda hacer por ti, me pregunto?\"\n\n#. Key:\tEEA782044BAA1D5C3B77D49DAE004512\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_58.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_58.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"Any idea how I could open this gate for you?\"\nmsgstr \"¿Alguna idea de cómo podría abrir esta puerta para ti?\"\n\n#. Key:\t04BFEE6A43E303DB376ACFA5F270F846\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"I've managed to get this obelisk thing. Do you know what it is?\"\nmsgstr \"He conseguido este obelisco. ¿Sabes lo que es?\"\n\n#. Key:\t0A6FE902444DF9B2F18A95B495FB7A90\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"I... I don't know. They are kinda predictable though...\"\nmsgstr \"Yo... no lo se. Sin embargo, son un poco predecibles...\"\n\n#. Key:\t0AB07AB7403AECECD38D479D8F4A32D2\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"Don't care about it and you'll live longer.\"\nmsgstr \"No te preocupes y vivirás más.\"\n\n#. Key:\t1026E61D4F2798A2E0FEE0B9ACA2135B\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"There is a floating magical thing right there...\"\nmsgstr \"Hay una cosa mágica flotante allí mismo...\"\n\n#. Key:\t174506D944E38D478377CDA1DEF299B4\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"Isn't it weird that doors are always closed around these places?\"\nmsgstr \"¿No es extraño que las puertas siempre estén cerradas en estos lugares?\"\n\n#. Key:\t240F98824200E33959D455AF1A3219B8\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_37.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_37.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"This is my research project! Looks totally garbage, but sometimes even I cannot understand my brilliance.\"\nmsgstr \"¡Este es mi proyecto de investigación! Parece totalmente basura, pero a veces ni siquiera yo puedo entender mi brillantez.\"\n\n#. Key:\t24286C6A494F848CE13B5C98E38D4718\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_6.Children(0).Children.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_6.Children(0).Children.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"Let him answer\"\nmsgstr \"Deja que responda\"\n\n#. Key:\t26727CAB403FA6DED50EC38ED01E4241\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"I found the secret hideout of the Secret Science Society. Is there anything you could tell me about them?\"\nmsgstr \"Encontré el escondite secreto de la Sociedad Secreta de Ciencias. ¿Hay algo que puedas decirme sobre ellos?\"\n\n#. Key:\t2BF9EF0C41CB352340F460AE4BC0FE02\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"I guess he will be happy if you return this to him, but otherwise it's garbage.\"\nmsgstr \"Supongo que estará feliz si le devuelves esto, pero realmente es basura.\"\n\n#. Key:\t315BB85E475FAA4C715E7F850B0E5EE2\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_24.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_24.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"Really? Then maybe I should give you this: another bottle of Potion of Worthiness!\"\nmsgstr \"¿De Verdad? Entonces tal vez debería darte esto: ¡otro Poción de Valía!\"\n\n#. Key:\t316CF9AD4CF36FAFFAC45CA0A488FE53\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_57.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_57.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"I've got to go...\"\nmsgstr \"Tengo que ir...\"\n\n#. Key:\t3A9767C34F0BB6E9E131D8BC7A8D9A25\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_26.Children(1).Children.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_26.Children(1).Children.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"Secret Science Society\"\nmsgstr \"Sociedad Secreta de Ciencias\"\n\n#. Key:\t3E857073418A17EC48A1EA9D2B28A43E\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_30.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_30.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"I pulled a few levers here and there...\"\nmsgstr \"He tirado de algunas palancas aquí y allá...\"\n\n#. Key:\t4671C3394EAF0988255C8090B409415D\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"Yes, things like that happen here all the time. You'll get used to it.\"\nmsgstr \"Sí, cosas así suceden aquí todo el tiempo. Te acostumbrarás.\"\n\n#. Key:\t4709B6384B48D479672BC69EBC640C7E\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_31.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_31.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"Oh, really? That was nice, even if it was absolutely unnecessary! Never mind, here is your reward!\"\nmsgstr \"¿Oh enserio? ¡Eso fue muy agradable, incluso si era absolutamente innecesario! No importa, ¡aquí está tu recompensa!\"\n\n#. Key:\t5AE5A1A6408BC2EB0F9F96BA0826ACB0\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"Hmm... One of the creaks was a bit odd. I think the door will open soon!\"\nmsgstr \"Hmm... Uno de los crujidos era un poco extraño. ¡Creo que la puerta se abrirá pronto!\"\n\n#. Key:\t5C81129F4B064C44F44335A3AB1CC178\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_29.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_29.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"The mind is furnished with ideas by a drunk upholsterer...\"\nmsgstr \"La mente está lleno de ideas por un tapicero borracho...\"\n\n#. Key:\t5E441CF6434D7CA180853BBCBD6DFE44\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"Also, reading something represents such a nice way of killing time when I encounter a closed door!\"\nmsgstr \"Además, ¡leer algo representa una forma tan agradable de matar tiempo cuando me encuentro con una puerta cerrada!\"\n\n#. Key:\t6B46D1EC463D3B9A4BFBBDB7725C0C22\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"How about a deal? Open this door and I will give you another bottle from my collection of Potions of Worthiness.\"\nmsgstr \"¿Qué tal un trato? Abre esta puerta y te daré otra botella de mi colección de Pociones de Valía.\"\n\n#. Key:\t745CA5274A281AAA12CF798A53D54ACE\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_26.Children(3).Children.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_26.Children(3).Children.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"Ask about the book\"\nmsgstr \"Pregunta sobre el libro\"\n\n#. Key:\t84DCE2A448C57E7FAD93CB9029BBD605\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_26.Children(0).Children.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_26.Children(0).Children.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"Floating obelisk\"\nmsgstr \"Obelisco flotante\"\n\n#. Key:\t922B00804A843BD8EC9DB984D794F145\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"We met before, right? Of course we did.\"\nmsgstr \"Nos conocimos antes, ¿verdad? Por supuesto que lo hicimos.\"\n\n#. Key:\t9837238E42F28684DEBA2DAF9B332415\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"It might actually be total nonsense. That's what I am trying to find out at the moment, so I am reading it again and again and again...\"\nmsgstr \"En realidad, podría ser una tontería por completo. Eso es lo que estoy tratando de descubrir en este momento, así que lo estoy leyendo una y otra vez...\"\n\n#. Key:\t995EAB564791A7F8BF34D3A26026F383\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_26.Children(4).Children.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_26.Children(4).Children.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"Leave\"\nmsgstr \"Salir\"\n\n#. Key:\t9AD95267429D21EE59DC83937AD6811A\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"This is a Memory Crystal made by a really old looking man I've met long ago.\"\nmsgstr \"Este es un Cristal de Memoria hecho por un hombre muy viejo que conocí hace mucho tiempo.\"\n\n#. Key:\tA9DF44F54971A33775FF939FB292E26E\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"No man's knowledge here can go beyond my experience!\"\nmsgstr \"¡El conocimiento de nadie puede ir más allá de mi experiencia!\"\n\n#. Key:\tAC59E35B420DF0F9B771B9938AC23891\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"I sure can! They used to invent cool stuff back in the days, before... you know, everyone's mind decided to go a bit insane.\"\nmsgstr \"¡Claro que puedo! Solían inventar cosas interesantes en el pasado, antes... ya sabes, la mente de todos decidió volverse un poco loca.\"\n\n#. Key:\tB1E177F0430A3887A76CFAA46CE650AD\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"I don’t know why we are here... maybe to enjoy ourselves?\"\nmsgstr \"No sé por qué estamos aquí... ¿quizás para divertirnos?\"\n\n#. Key:\tB5E57C3A4B0D51020B4F3C872164E8F2\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_26.Children(2).Children.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_26.Children(2).Children.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"Another door\"\nmsgstr \"Otra puerta\"\n\n#. Key:\tBA0C0F42482F357506A9C7ABADB6E49A\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_33.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_33.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"On the other hand, everyone is crazy these days... so we don't need doors anymore!\"\nmsgstr \"Por otro lado, todos están locos últimamente... ¡así que ya no necesitamos puertas!\"\n\n#. Key:\tBAC86050470A5EC67C30349C6B13DFE0\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"To be perceived is to be!\"\nmsgstr \"¡Ser percibido es existir!\"\n\n#. Key:\tBAD7934444B3EB256141BFB689BB83A0\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"I will let you know when I come up with something.\"\nmsgstr \"Te avisaré cuando se me ocurra algo.\"\n\n#. Key:\tBE5570C5477044DD0B1EEE928EAD8FA8\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_32.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_32.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"Nah. The world is full of crazy people. If I were sane, I would have liked to have as many closed doors as possible between me and those weirdos.\"\nmsgstr \"Nah. El mundo está lleno de locos. Si estuviera cuerdo, me hubiera gustado tener tantas puertas cerradas como sea posible entre esos bichos raros y yo.\"\n\n#. Key:\tBE8120CC4E6A028BB45F10843F98135D\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"The door asks for a password that members use to enter the hideout... any idea what that could be?\"\nmsgstr \"La puerta pide una contraseña que los miembros usan para entrar al escondite... ¿alguna idea de qué podría ser?\"\n\n#. Key:\tC7BE32BF43F7BA6D88A666956FAC35F3\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"I am here because I actually have to prove my worth again...\"\nmsgstr \"Estoy aquí porque tengo que demostrar mi valía de nuevo...\"\n\n#. Key:\tC7ECC6D9457A4C49B39E98AEB14474E5\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_25.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_25.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"And I would actually feel much happier if I were on the other side of the door! You know,... I tried to ask it nicely to open and it just ignored me!\"\nmsgstr \"¡Y en realidad me sentiría mucho más feliz si estuviera al otro lado de la puerta! Ya sabes... ¡Traté de pedirle con educación que se abriera y simplemente me ignoró!\"\n\n#. Key:\tD2F4B8E44239904A7BD4DD90336C871A\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_45.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_45.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"What kind of book is that?\"\nmsgstr \"¿Qué tipo de libro es ese?\"\n\n#. Key:\tED75E2104CCC3912A77DF18F7C916690\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"It was nice seeing you...\"\nmsgstr \"Fue un placer conocerte.\"\n\n#. Key:\tF87975A94604B526DE1B638250BD85A9\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_27.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_27.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"The gate is open! Maybe this creature has a heart after all... and probably started feeling sorry for me as well.\"\nmsgstr \"¡La puerta está abierta! Tal vez esta criatura tiene un corazón después de todo... y probablemente comenzó a sentir pena por mí también.\"\n\n#. Key:\tFE470DB5464E438A122FAFAF593AF92B\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"Let me see! Yes... Oh...\"\nmsgstr \"¡Déjame ver! Si... oh...\"\n\n#. Key:\t066896454B62A9809060EBB3E0222D9A\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_SpeechSequence_1.SpeechSequence(3).SpeechSequence.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_SpeechSequence_1.SpeechSequence(3).SpeechSequence.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"Also, after skipping a couple of lectures, I got fired from university.\"\nmsgstr \"Además, después de saltar un par de clases, me despidieron de la universidad.\"\n\n#. Key:\t17D1F3394E12F6C85A11C2B3D3BD1ACE\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_SpeechSequence_1.SpeechSequence(0).SpeechSequence.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_SpeechSequence_1.SpeechSequence(0).SpeechSequence.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"I am a scientist! I managed to prove it! I discovered this when I was conducting my research on gnome behavior...\"\nmsgstr \"Soy un científico! Me las arreglé para demostrarlo! Descubrí esto cuando estaba realizando mi investigación sobre el comportamiento de los gnomos...\"\n\n#. Key:\t17D8D3C2484BA654BEAE8CACA3AD7501\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"Help me out with the door for the last time, and I will give you my last potion!\"\nmsgstr \"¡Ayúdame con la puerta por última vez, y te daré mi última poción!\"\n\n#. Key:\t22439DB6407947A700A6E9AFB4D29261\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"Hello again! You remember me, right? I'm the gnome who was crazy before it was cool!\"\nmsgstr \"¡Hola de nuevo! Te acuerdas de mí, ¿verdad? ¡Soy el gnomo que estaba loco antes de que fuera guay!\"\n\n#. Key:\t2546F34E402CB4B25911238CC1E7A70F\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_29.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_29.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"Be as you with to seem.\\r\\n... or was it seem as you wish to be?\"\nmsgstr \"Sé como quieras para parecer.\\r\\n... o fue como quisieras ser?\"\n\n#. Key:\t2A78FDD9465789DC4FF5EB970C63F618\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"That is amazing! Thank you, my globular friend! Take these coins, I am sure you will enjoy spending them on... on whatever Balls like you like to spend.\"\nmsgstr \"¡Esto es increíble! ¡Gracias mi amigo globular! Tome estas monedas, estoy seguro de que disfrutará de gastarlas en... en lo que sea que las pelotas como tu le gusta.\"\n\n#. Key:\t2EB726F641E4EF882228F6B49DA2B313\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_26.Children(1).Children.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_26.Children(1).Children.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"Password\"\nmsgstr \"Contraseña\"\n\n#. Key:\t339840D54BD71CF86F9DE4A801B1414F\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"I sure can! They used to invent cool stuff back in the days, before... you know, everyone's mind decided to go a bit insane.\"\nmsgstr \"¡Claro que puedo! Solían inventar cosas interesantes en el pasado, antes... ya sabes, la mente de todos decidió volverse un poco loca.\"\n\n#. Key:\t3E639AB84A0D241D73AB8A991A483090\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_26.Children(4).Children.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_26.Children(4).Children.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"Leave\"\nmsgstr \"Salir\"\n\n#. Key:\t464D32224CC04AD1F97602803245A37C\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"Take this! You deserve it...\"\nmsgstr \"¡Toma esto! Te lo mereces...\"\n\n#. Key:\t4BB0354D4398A4115F3A78B8EFCC7D16\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_27.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_27.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"I can't believe my eyes! It is open!\"\nmsgstr \"¡No puedo creer lo que veo! ¡Está abierto!\"\n\n#. Key:\t6488288A45256CE464004F9BFF776850\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_24.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_24.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"It's your lucky day! Take this... it's my last bottle, but I guess your needs are greater than mine!\"\nmsgstr \"¡Es tu día de suerte! Toma esto... es mi última botella, ¡pero creo que tus necesidades son mayores que las mías!\"\n\n#. Key:\t696219734B2E6966C53BE8B43A0C2212\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"The unexamined life is not worth living!\"\nmsgstr \"¡La vida no examinada no vale la pena vivir!\"\n\n#. Key:\t6FD516D14E42F5EC1D05CEA0F476BDEC\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"If you manage to find a strangely unique device in the hideout, I would be more than happy to buy that from you...\"\nmsgstr \"Si logras encontrar un aparato extrañamente único en el escondite, estaría más que feliz de comprarte lo...\"\n\n#. Key:\t75BBEA604E9A3BAEF7599AA937E1AB2A\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"And you have the habit of needing my potions..\"\nmsgstr \"Y tienes la costumbre de necesitar mis pociones...\"\n\n#. Key:\t7978DCFE4044A6A3EC9F6BA54BAAD8BF\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"Yes, I am pretty sure this week is \\\"The only true wisdom is in knowing you know everything.\\\".\"\nmsgstr \"Sí, estoy bastante seguro de que esta semana es \\\"La única sabiduría verdadera es saber que lo sabes todo\\\".\"\n\n#. Key:\t88881A3742ABFEAB95CA938C1AA81B60\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_25.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_25.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"I guess we are in the same boat - well, more or less... figuratively speaking, of course, because I can't really stand boats!\"\nmsgstr \"Supongo que estamos en el mismo barco, bueno, más o menos... hablando en sentido figurado, por supuesto, ¡porque no puedo aguantar los barcos!\"\n\n#. Key:\t8A80B7554F39A818E4E66294BAFC9A76\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_26.Children(0).Children.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_26.Children(0).Children.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"Secret Science Society\"\nmsgstr \"Sociedad Secreta de Ciencias\"\n\n#. Key:\t91E6FD4A44AB2E17C88767B0F17D6D1E\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_30.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_30.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"Why do you think that you're crazy?\"\nmsgstr \"¿Por qué crees que estás loco?\"\n\n#. Key:\t98E36F354D811F5DE5F98A942250997E\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"It is always wrong to believe everything!\"\nmsgstr \"¡Siempre está mal creerlo todo!\"\n\n#. Key:\t9B6EADBA4946B100D566988907A9675D\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"Any luck with the password for the Secret Science Society door?\"\nmsgstr \"¿Tuviste suerte con la contraseña de la puerta de la Sociedad Secreta de Ciencias?\"\n\n#. Key:\tA0F52B7148A942673A3489857B8C6EA9\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_26.Children(2).Children.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_26.Children(2).Children.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"Give Weird Device\"\nmsgstr \"Dar Aparato Extraño\"\n\n#. Key:\tABE60F4D4709CCE1AF2A5197C03C8193\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"See you later...\"\nmsgstr \"Nos vemos más tarde...\"\n\n#. Key:\tB07C5C9A48839C3E81F6FA8B7550BBA4\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"I also have the bad habit of being obstructed by closed doors!\"\nmsgstr \"¡También tengo la mala costumbre de ser obstruido por puertas cerradas!\"\n\n#. Key:\tB7C7314840274942F6D606B35398F039\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"The door asks for a password that members need to provide in order to enter the hideout... any idea what that could be?\"\nmsgstr \"La puerta solicita una contraseña que los miembros deben proporcionar para entrar al escondite... ¿alguna idea de qué podría ser?\"\n\n#. Key:\tBB1AEBA44695D09192D7CA98AF9166B0\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_SpeechSequence_1.SpeechSequence(2).SpeechSequence.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_SpeechSequence_1.SpeechSequence(2).SpeechSequence.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"No wonder everyone started to consider me an idiot.\"\nmsgstr \"No es de extrañar que todos comenzaran a considerarme un idiota.\"\n\n#. Key:\tC0B9CA5E4273E95306AD0C824ADFD84B\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_SpeechSequence_1.SpeechSequence(1).SpeechSequence.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_SpeechSequence_1.SpeechSequence(1).SpeechSequence.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"Long story short, I used to do all these crazy things, like talking about the weather or taking naps in the afternoon. At first, they seemed okay to me but in reality what I was doing was totally ridiculous!\"\nmsgstr \"En pocas palabras, solía hacer todas estas locuras, como hablar sobre el tiempo o tomar una siesta. Al principio, me parecieron bien, ¡pero en realidad lo que estaba haciendo era totalmente ridículo!\"\n\n#. Key:\tC4193800427609972A2DECAB99D8CE6C\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"Hmm... One of the creaks was a bit odd. I think the door will open soon!\"\nmsgstr \"Hmm... Uno de los crujidos era un poco extraño. ¡Creo que la puerta se abrirá pronto!\"\n\n#. Key:\tD1254F624213EAE67D6DD780182AA2DA\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"It was nice seeing you!\"\nmsgstr \"¡Fue un placer conocerte!\"\n\n#. Key:\tD19327714CD0B2833BC7EBBD1E89CC83\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_26.Children(3).Children.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_26.Children(3).Children.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"You Crazy?\"\nmsgstr \"¿Estas loco?\"\n\n#. Key:\tE5C93E794F71C393568D0B855117C738\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"I found the secret hideout of the Secret Science Society. Do you know anything about them?\"\nmsgstr \"Encontré el escondite secreto de la Sociedad Secreta de Ciencias. ¿Sabes algo de ellos?\"\n\n#. Key:\tEF216A2549E20C15A2C28184B62D45E6\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_36.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_36.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"Turns out that you cannot skip lectures if you're the teacher.\"\nmsgstr \"Resulta que no puedes saltarte las clases si eres el maestro.\"\n\n#. Key:\tEF650E874498865FA9FE6F9B9C37AB71\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"Here is the Weird Device I found in the hideout of the Secret Science Society.\"\nmsgstr \"Aquí está el Aparato Extraño que encontré en el escondite de la Sociedad Secreta de Ciencias.\"\n\n#. Key:\t17A0CE394E01E1FFB31AA9A485E033AC\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_2.Children(4).Children.Text\n#: /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_2.Children(4).Children.Text\nmsgctxt \"Dialogue_TLSecretSocietyGate\"\nmsgid \"Mellon\"\nmsgstr \"Mellon\"\n\n#. Key:\t3293778C41F588EAC2DECDA76DA86A8E\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_2.Children(0).Children.Text\n#: /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_2.Children(0).Children.Text\nmsgctxt \"Dialogue_TLSecretSocietyGate\"\nmsgid \"The only...\"\nmsgstr \"Lo único...\"\n\n#. Key:\t359996CC441CAB0497303A9C666F0CCD\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_TLSecretSocietyGate\"\nmsgid \"*******? No, that is not correct.\"\nmsgstr \"¿*******? No, eso no es correcto.\"\n\n#. Key:\t3C864B7F434DA42CAB07BCA70FB2E6A6\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_1.Children(0).Children.Text\n#: /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_1.Children(0).Children.Text\nmsgctxt \"Dialogue_TLSecretSocietyGate\"\nmsgid \"Okay, whatever\"\nmsgstr \"Bueno, como sea\"\n\n#. Key:\t40C27B354470AB53239424BCC2B8D259\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_TLSecretSocietyGate\"\nmsgid \"Do you really think secret scientists would use an elven word as a password? I don't even know what that means.\"\nmsgstr \"¿De verdad crees que los científicos secretos usarían una palabra élfica como contraseña? Ni siquiera sé lo que significa.\"\n\n#. Key:\t4E89070F413EF5CD964EEF90234BEBC5\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_TLSecretSocietyGate\"\nmsgid \"I am pretty sure that it is better to avoid the Secret Science Society anyways...\"\nmsgstr \"Estoy bastante seguro de que es mejor evitar la Sociedad Secreta de Ciencias de todos modos...\"\n\n#. Key:\t515B5424465F983D14F3E09B7686899D\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_TLSecretSocietyGate\"\nmsgid \"STOP! Do not move! This gate is only for the members of the Secret Science Society!\"\nmsgstr \"¡DETENER! ¡No te muevas! ¡Esta puerta es solo para los miembros de la Sociedad Secreta de Ciencias!\"\n\n#. Key:\t51706AD44D697A14E6392B97A9E30AFC\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_TLSecretSocietyGate\"\nmsgid \"That is the silliest combination I have ever heard about in my whole life! That's the kind of thing an idiot would carry in his luggage!\"\nmsgstr \"¡Esa es la combinación más tonta que he escuchado en toda mi vida! ¡Ese es el tipo de cosas que un idiota llevaría en su maleta!\"\n\n#. Key:\t60B0B4E04E74C474AC2F4F8422DCE753\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_3.Children(0).Children.Text\n#: /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_3.Children(0).Children.Text\nmsgctxt \"Dialogue_TLSecretSocietyGate\"\nmsgid \"Leave the gate\"\nmsgstr \"Dejar la puerta\"\n\n#. Key:\t6EB7FD9546B2B89557D9708942CE54BD\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_2.Children(2).Children.Text\n#: /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_2.Children(2).Children.Text\nmsgctxt \"Dialogue_TLSecretSocietyGate\"\nmsgid \"12345\"\nmsgstr \"12345\"\n\n#. Key:\t749AB9CD48924031317291A953254917\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_TLSecretSocietyGate\"\nmsgid \"That password is for witch and wizard kids, not for old, wise, world renowned secret scientists!\"\nmsgstr \"¡Esa contraseña es para brujas y magos jóvenes, no para científicos secretos viejos, sabios y de renombre mundial!\"\n\n#. Key:\t7BB8FA8B4D051983390D3D8D4287DFEC\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_2.Children(1).Children.Text\n#: /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_2.Children(1).Children.Text\nmsgctxt \"Dialogue_TLSecretSocietyGate\"\nmsgid \"hunter2\"\nmsgstr \"hunter2\"\n\n#. Key:\t8CD051C44D9FBBD6D60694AFD2156D24\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_2.Children(5).Children.Text\n#: /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_2.Children(5).Children.Text\nmsgctxt \"Dialogue_TLSecretSocietyGate\"\nmsgid \"Try to gain some time\"\nmsgstr \"Intenta ganar algo de tiempo\"\n\n#. Key:\t8F2244144056B8C389345F87D8C8B171\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_TLSecretSocietyGate\"\nmsgid \"I... I think I forgot... I have to remember it. I'll be back...\"\nmsgstr \"Yo... creo que lo olvidé... Tengo que recordarlo. Vuelvo enseguida...\"\n\n#. Key:\t8FC96FE94C115E3EDB214CAA3B380072\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_TLSecretSocietyGate\"\nmsgid \"Let us go on with the standard protocol then. Tell me the password of the week.\"\nmsgstr \"Sigamos con el protocolo estándar entonces. Dime la contraseña de la semana.\"\n\n#. Key:\tAA10FF02426D2C5DB9F7CF90596631C4\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_1.Children(1).Children.Text\n#: /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_1.Children(1).Children.Text\nmsgctxt \"Dialogue_TLSecretSocietyGate\"\nmsgid \"I am a member\"\nmsgstr \"Soy un miembro\"\n\n#. Key:\tB5237D1B4EFB02B1ED5017B68EC5A7EC\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_TLSecretSocietyGate\"\nmsgid \"Are you a member? Prove it! What is the password of the week?\"\nmsgstr \"¿Es usted un miembro? ¡Demuéstralo! ¿Cuál es la contraseña de la semana?\"\n\n#. Key:\tC8A1985C416AEA563142D7BF3B6DD77D\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_2.Children(3).Children.Text\n#: /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_2.Children(3).Children.Text\nmsgctxt \"Dialogue_TLSecretSocietyGate\"\nmsgid \"Caput Draconis\"\nmsgstr \"Caput Draconis\"\n\n#. Key:\tDC8F07EA44A20BEF70DFCDA4A62A421E\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_TLSecretSocietyGate\"\nmsgid \"Correct. Welcome to the secret hideout 12345, scientist!\"\nmsgstr \"Correcto. ¡Bienvenido al escondite secreto 12345, científico!\"\n\n#. Key:\tE0C10509474191587635B48ED0AA6913\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_TLSecretSocietyGate\"\nmsgid \"The only true wisdom is in knowing you know everything!\"\nmsgstr \"¡La única sabiduría verdadera es saber que lo sabes todo!\"\n\n#. Key:\t0707F21D4313073F47F3C69B64D61DB7\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_TombOfTabby\"\nmsgid \"Take this. It's all I can give now.\"\nmsgstr \"Toma esto. Es todo lo que puedo dar ahora.\"\n\n#. Key:\t0918993B4F680528806DE680B471F795\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_TombOfTabby\"\nmsgid \"It was too much. I couldn’t keep on. I failed.\"\nmsgstr \"Fue demasiado. No pude seguir. Fallé.\"\n\n#. Key:\t1598C2DE44A0BF92DC0E53BFAC47DEF5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_3.Children(3).Children.Text\n#: /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_3.Children(3).Children.Text\nmsgctxt \"Dialogue_TombOfTabby\"\nmsgid \"Leave\"\nmsgstr \"Salir\"\n\n#. Key:\t1EF84FFD484E968FBDFE1386018485DB\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_3.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_3.Children(1).Children.Text\nmsgctxt \"Dialogue_TombOfTabby\"\nmsgid \"Raven\"\nmsgstr \"Cuervo\"\n\n#. Key:\t3343471F42742EEE0678D49E466448F1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_TombOfTabby\"\nmsgid \"Tell me the name!\"\nmsgstr \"¡Dime el nombre!\"\n\n#. Key:\t3DC816F147ACB79D6339D5AD31E0C5A5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_TombOfTabby\"\nmsgid \"Lillian!\"\nmsgstr \"¡Lillian!\"\n\n#. Key:\t3DE5FFEB4A5BEC150306999FDEF058BC\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_TombOfTabby\"\nmsgid \"Here lies Tabby, wanderer of the Ruined Realm. We will never forget what you did for us. May your spirit find peace in the afterlife.\"\nmsgstr \"Aquí yace Tabby, errante del Reino Arruinado. Nunca olvidaremos lo que hiciste por nosotros. Que tu espíritu encuentre paz en el más allá.\"\n\n#. Key:\t43F7C0AE4CB91D3957AB4CA54C1D4426\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_TombOfTabby\"\nmsgid \"He took the artefacts. His master never knew it.\"\nmsgstr \"Se llevo los artefactos. Su maestro nunca lo supo.\"\n\n#. Key:\t57A0634946BB9FD9603572ABD9368E52\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_3.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_3.Children(0).Children.Text\nmsgctxt \"Dialogue_TombOfTabby\"\nmsgid \"Wizard\"\nmsgstr \"Mago\"\n\n#. Key:\t5A6E99154FB027A82922FA91A9448E14\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_TombOfTabby\"\nmsgid \"I’m leaving... I didn’t want to bother you. May you find peace at last.\"\nmsgstr \"Me voy... No quería molestarte. Que por fin encuentres la paz.\"\n\n#. Key:\t6A716E164BAACFAFB2EBDBBA8C04438F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_TombOfTabby\"\nmsgid \"He liked Lillian. He finished what I started.\"\nmsgstr \"Le gustaba Lillian. Terminó lo que empecé.\"\n\n#. Key:\t7CDFB36B41931AADE01C10A465D09EAF\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_TombOfTabby\"\nmsgid \"Rest in peace!\"\nmsgstr \"¡Descansa en paz!\"\n\n#. Key:\t831693034CD9AC88A07F1297BBB10056\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_TombOfTabby\"\nmsgid \"I will be there on her side again when the time comes.\"\nmsgstr \"Estaré allí a su lado otra vez cuando llegue el momento.\"\n\n#. Key:\tA78C16A943587C5EC876BFB0AA319421\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_TombOfTabby\"\nmsgid \"She is my only true master. I can’t leave her. Not yet.\"\nmsgstr \"Ella es mi única verdadera maestra. No puedo dejarla. Aún no.\"\n\n#. Key:\tC86836A149E8580E4608259C8482314F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_TombOfTabby\"\nmsgid \"Raven!\"\nmsgstr \"¡Cuervo!\"\n\n#. Key:\tD05E5AEF498C383F88D1AFBBDF371CDA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_TombOfTabby\"\nmsgid \"He forced me. Though I understood. I wanted the same.\"\nmsgstr \"El me forzó. Aunque lo entendí. Yo quería lo mismo.\"\n\n#. Key:\tE41ADE774AF3AF3FE637CE81531F3D29\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_3.Children(2).Children.Text\n#: /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_3.Children(2).Children.Text\nmsgctxt \"Dialogue_TombOfTabby\"\nmsgid \"Lillian\"\nmsgstr \"Lillian\"\n\n#. Key:\tED18C66D47BF594818C5DA8100AC2A36\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_TombOfTabby\"\nmsgid \"You are familiar... I almost remember...\"\nmsgstr \"Eres familiar... Casi recuerdo...\"\n\n#. Key:\tF6D8BC4F489D87A90E852CA3F97B479F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_TombOfTabby\"\nmsgid \"Wizard!\"\nmsgstr \"¡Mago!\"\n\n#. Key:\t2A0E02C94A04642C5096038C615E0D5B\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/tut2.tut2:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/tut2.tut2:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_tut2\"\nmsgid \"I see you managed to shape that ball body of yours… that’s interesting.\"\nmsgstr \"Veo que lograste darle forma a ese cuerpo tuyo... eso es interesante.\"\n\n#. Key:\t4D59C307403F27C91A9168AB58CDB1B3\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/tut2.tut2:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/tut2.tut2:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_tut2\"\nmsgid \"I didn’t want to summon you. I wanted to get my daughter back.\"\nmsgstr \"No quería convocarte. Quería recuperar a mi hija.\"\n\n#. Key:\t8336FD024F34227E1AB7B1BFCCF7FFBF\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/tut2.tut2:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/tut2.tut2:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_tut2\"\nmsgid \"Your presence is not welcome here, demon!\"\nmsgstr \"¡Tu presencia no es bienvenida aquí, demonio!\"\n\n#. Key:\t16A6E7D24DFE49D6844E92B8E476BA66\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/tut5.tut5:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/tut5.tut5:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_tut5\"\nmsgid \"Once you are done I will set you free.\"\nmsgstr \"Una vez que hayas terminado, te liberaré.\"\n\n#. Key:\t48FA56EF4293C577CB1977BE694034CC\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/tut5.tut5:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/tut5.tut5:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_tut5\"\nmsgid \"This is the deal demon...\"\nmsgstr \"Este es el trato demonio...\"\n\n#. Key:\tA27765824FDD88A579AB6180DDEA06B1\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/tut5.tut5:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/tut5.tut5:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_tut5\"\nmsgid \"Get into the Heart of the Realm and find the three Artefacts! I need those to correct the summoning.\"\nmsgstr \"¡Entra en el corazón del Reino y encuentra los tres Artefactos! Los necesito para corregir la convocatoria.\"\n\n#. Key:\t5E1F54384BC258A91FF1DD9ECBC0DF39\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/tut8.tut8:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/tut8.tut8:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_tut8\"\nmsgid \"A cat that used to help my daughter to explore these realms.\"\nmsgstr \"Un gato que solía ayudar a mi hija a explorar estos reinos.\"\n\n#. Key:\t859621E24125177084F4EAA39CF77902\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/tut8.tut8:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/tut8.tut8:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_tut8\"\nmsgid \"Who is Tabby?\"\nmsgstr \"¿Quien es Tabby?\"\n\n#. Key:\tD0BFF857414714D7C5FCB9B526539215\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/tut8.tut8:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/tut8.tut8:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_tut8\"\nmsgid \"Tabby was formidable with her claws, but you will need that sword.\"\nmsgstr \"Tabby era formidable con sus garras, pero necesitarás esa espada.\"\n\n#. Key:\tDFCB1A1E48763642E71FD7A040F72F1B\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/tut8.tut8:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/tut8.tut8:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_tut8\"\nmsgid \"So he did the hard job before me...\"\nmsgstr \"Entonces hizo el trabajo duro antes que yo...\"\n\n#. Key:\t2DD05A7E485B5C23DA0DCD84400D3F23\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/tut9.tut9:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/tut9.tut9:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_tut9\"\nmsgid \"What could be possibly weird for a walking ball?\"\nmsgstr \"¿Qué podría ser extraño para una pelota que camina?\"\n\n#. Key:\t62A1ECFC47B762221EA0B1B5B0E0BEF6\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/tut9.tut9:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/tut9.tut9:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_tut9\"\nmsgid \"This place is in a better shape...\"\nmsgstr \"Este lugar está en mejor forma...\"\n\n#. Key:\tA9BCFBB541A9A2CEA8FB90884B8557C5\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/tut9.tut9:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/tut9.tut9:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_tut9\"\nmsgid \"The Ancient Magic is still strong within these walls. It keeps the Ruin at bay.\"\nmsgstr \"La Magia Antigua sigue siendo fuerte dentro de estos muros. Mantiene Ruin a raya.\"\n\n#. Key:\tF9551D7849226F88A4FD15AAFB4789E6\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/tut9.tut9:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/tut9.tut9:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_tut9\"\nmsgid \"Be careful though... it can have the weirdest side effects.\"\nmsgstr \"Pero ten cuidado... puede tener los efectos secundarios más extraños.\"\n\n#. Key:\t302976FD411E850B3CD7CEA7E0BF6924\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Wizard.Wizard:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/Ending/E1/Wizard.Wizard:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_Wizard\"\nmsgid \"Please wait outside until I repeat the spell. Once Lillian is back, I’ll take you home.\"\nmsgstr \"Por favor espera afuera hasta que repita el hechizo. Una vez que Lillian regrese, te llevaré a casa.\"\n\n#. Key:\t3851C21F419E9F1D29A06DA3B2A0F553\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Wizard.Wizard:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Ending/E1/Wizard.Wizard:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_Wizard\"\nmsgid \"Er... your room is still as untidy as last time, but no problem.\"\nmsgstr \"Er... tu habitación todavía está tan desordenada como la última vez, pero no hay problema.\"\n\n#. Key:\t6CCE5BBC4135176C1FBD8E866FD4B098\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Wizard.Wizard:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Ending/E1/Wizard.Wizard:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_Wizard\"\nmsgid \"I’m sorry we met like this.\"\nmsgstr \"Lamento que nos hayamos conocido así.\"\n\n#. Key:\t7511912D4F72D1D45CFFB9AA9815CCB2\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Wizard.Wizard:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E1/Wizard.Wizard:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_Wizard\"\nmsgid \"Yes... and thank you!\"\nmsgstr \"Si... y gracias!\"\n\n#. Key:\tAC1641244DF694B660EAFDA1FC4A177B\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Wizard.Wizard:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E1/Wizard.Wizard:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_Wizard\"\nmsgid \"Here are your artefacts! I made my part of the deal.\"\nmsgstr \"¡Aquí están tus artefactos! Hice mi parte del trato.\"\n\n#. Key:\tB567059148744E3F7A4D3B929F26CBB6\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Wizard.Wizard:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Ending/E1/Wizard.Wizard:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_Wizard\"\nmsgid \"Yes, we made a deal!\"\nmsgstr \"Sí, hicimos un trato!\"\n\n#. Key:\tC2ED3A564A55A644D33F9E9E38D1676A\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Wizard.Wizard:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Ending/E1/Wizard.Wizard:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_Wizard\"\nmsgid \"Give me a few more minutes to finish what we started!\"\nmsgstr \"¡Dame unos minutos más para terminar lo que empezamos!\"\n\n#. Key:\tE1521B0B46F26BFA464C6C81EC2D4900\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Wizard.Wizard:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Ending/E1/Wizard.Wizard:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_Wizard\"\nmsgid \"Will you release me?\"\nmsgstr \"¿Me liberarás?\"\n\n#. Key:\tFE3EE6014784FCE7EB8001BC1E77D833\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Wizard.Wizard:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Ending/E1/Wizard.Wizard:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_Wizard\"\nmsgid \"Er... excuse me for being rude with you. I might have misjudged you. And, anyway...\"\nmsgstr \"Er... discúlpame por ser grosero contigo. Podría haberte juzgado mal. Y de todas formas...\"\n\n#. Key:\t0D3B0F654B4B3FC1AE9B46809DA7FD74\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter2/Wizard_AfterMonk.Wizard_AfterMonk:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Wizard/Chapter2/Wizard_AfterMonk.Wizard_AfterMonk:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_Wizard_AfterMonk\"\nmsgid \"What did he say?\"\nmsgstr \"¿Que dijo?\"\n\n#. Key:\tDE149D01484DA8CD03D1C0848D01BEA6\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter2/Wizard_AfterMonk.Wizard_AfterMonk:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Wizard/Chapter2/Wizard_AfterMonk.Wizard_AfterMonk:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_Wizard_AfterMonk\"\nmsgid \"Nothing...\"\nmsgstr \"Nada...\"\n\n#. Key:\t1E43B5674AB45A7BDBEED1BE2AE25FE8\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter2/Wizard_Artefact1.Wizard_Artefact1:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Wizard/Chapter2/Wizard_Artefact1.Wizard_Artefact1:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_Wizard_Artefact1\"\nmsgid \"Well done. Now we have the first artefact. There are only two left...\"\nmsgstr \"Bien hecho. Ahora tenemos el primer artefacto. Solo quedan dos mas...\"\n\n#. Key:\t45AB81D94B2C6C9B13A49C944AD80389\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter2/Wizard_Artefact1.Wizard_Artefact1:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Wizard/Chapter2/Wizard_Artefact1.Wizard_Artefact1:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_Wizard_Artefact1\"\nmsgid \"Don’t tell me I will need to kill another two of these!\"\nmsgstr \"¡No me digas que necesitaré matar a otros dos mas de estos!\"\n\n#. Key:\t3CBF720A438F217805FD5F85990FF515\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter2/Wizard_Artefact2.Wizard_Artefact2:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Wizard/Chapter2/Wizard_Artefact2.Wizard_Artefact2:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_Wizard_Artefact2\"\nmsgid \"We are close! Only one artefact is missing.\"\nmsgstr \"¡Estamos cerca! Solo falta un artefacto.\"\n\n#. Key:\tFD6163CC43BF00E4DB95CBB11CA7D389\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter2/Wizard_Artefact2.Wizard_Artefact2:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Wizard/Chapter2/Wizard_Artefact2.Wizard_Artefact2:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_Wizard_Artefact2\"\nmsgid \"What I miss is a comfortable apartment somewhere safe...\"\nmsgstr \"Lo que extraño es un apartamento cómodo en un lugar seguro...\"\n\n#. Key:\t0D37E1DE44FDF7C5BF8DD28C038FA49D\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter2/Wizard_Artefact3.Wizard_Artefact3:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Wizard/Chapter2/Wizard_Artefact3.Wizard_Artefact3:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_Wizard_Artefact3\"\nmsgid \"What? Can’t you just... oh, forget it!\"\nmsgstr \"¿Qué? ¿No puedes... oh, olvídalo!\"\n\n#. Key:\t2BDFD83247C8B644DED9CAA6486A064F\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter2/Wizard_Artefact3.Wizard_Artefact3:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Wizard/Chapter2/Wizard_Artefact3.Wizard_Artefact3:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_Wizard_Artefact3\"\nmsgid \"Yes, I’ve done what you asked. Now it’s your turn. Set me free!\"\nmsgstr \"Sí, hice lo que me pediste. Ahora es tu turno. ¡Libérame!\"\n\n#. Key:\t8CCAFBA148F1834EABE12CAC93669A79\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter2/Wizard_Artefact3.Wizard_Artefact3:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Wizard/Chapter2/Wizard_Artefact3.Wizard_Artefact3:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_Wizard_Artefact3\"\nmsgid \"I have to admit I’m impressed. You found all the three artefacts.\"\nmsgstr \"Tengo que admitir que estoy impresionado. Encontraste los tres artefactos.\"\n\n#. Key:\tA54C612946D6A5EB76D38B8622F4F76C\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter2/Wizard_Artefact3.Wizard_Artefact3:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Wizard/Chapter2/Wizard_Artefact3.Wizard_Artefact3:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_Wizard_Artefact3\"\nmsgid \"All right demon. Use the railways to travel to World’s End. That’s where I can bring you back.\"\nmsgstr \"Muy bien demonio. Usa los ferrocarriles para viajar al Fin del Mundo. Ahí es donde puedo traerte de vuelta.\"\n\n#. Key:\t05FE50EE4B18F4FE9C1559979669E616\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"Still nothing, but nobody said anything about any visible change at this point, right?\"\nmsgstr \"Todavía nada, pero nadie dijo nada sobre ningún cambio visible en este momento, ¿verdad?\"\n\n#. Key:\t0DDE5A0E47BADFCA9E6E98A10F0AF114\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_1.Children(0).Children.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_1.Children(0).Children.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"Craft Ghost Abacus\"\nmsgstr \"Crea Ábaco Fantasma\"\n\n#. Key:\t0F4008294D6FA43C3D9C17BA600FB024\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"You have a glowing hammer. What's next?\"\nmsgstr \"Tienes un martillo brillante. ¿Ahora qué?\"\n\n#. Key:\t26089F6044B0FD1134C9C99AF17E9E0C\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_7.Children(4).Children.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_7.Children(4).Children.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"Say a different color\"\nmsgstr \"Di un color diferente\"\n\n#. Key:\t29FFB2FF49C6C231583FF1B549DA218C\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"Gnome magic at its best. Did you do everything the way it was supposed to be done? You should find out soon... maybe.\"\nmsgstr \"Magia de gnomos funcionando a la perfección. ¿Hiciste todo como se suponía que debía hacerse? Lo averiguarás pronto... tal vez.\"\n\n#. Key:\t2BF7D8D726080F0A003A0229BE7871C7\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"With the proper instructions and materials you could definitely create something valuable here.\"\nmsgstr \"Con las instrucciones y materiales adecuados, podrás crear algo valioso aquí.\"\n\n#. Key:\t3231FF0D4A2BBEE3E3AD7598E5105E0E\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"The object is coagulated into a single Surrected object!\"\nmsgstr \"¡El objeto se coagula en un solo objeto Resucitado!\"\n\n#. Key:\t41335322411CF278B19849AC696E6F93\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_2.Children(4).Children.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_2.Children(4).Children.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"Break the abacus into pieces\"\nmsgstr \"Rompe el ábaco en pedazos\"\n\n#. Key:\t4C74F3C342690A8246916B85FF4685C9\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"The abacus does not show any emotion.\"\nmsgstr \"El ábaco no muestra ninguna emoción.\"\n\n#. Key:\t4F8E51DA4C0B33020E34AF9AB47BCCD5\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_7.Children(0).Children.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_7.Children(0).Children.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"Croon \\\"La La LaLaLa LaLaLa\\\"\"\nmsgstr \"Croon \\\"La La LaLaLa LaLaLa\\\"\"\n\n#. Key:\t5404D10943BB5F53229FDC845E60B000\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_7.Children(5).Children.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_7.Children(5).Children.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"Give up for now\"\nmsgstr \"Renunciar por ahora\"\n\n#. Key:\t5548D94E415483F129CCA7A3102B9DB3\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"Poor Abacus. It is broken into pieces now.\"\nmsgstr \"Pobre ábaco. Está roto en pedazos.\"\n\n#. Key:\t6F3DE41D43326079A2BD72A29059FBA9\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"You have the Abacus and the Ghost Flower Petals in front of you. The workshop has all the tools you need. How do you proceed?\"\nmsgstr \"Tienes el ábaco y los Pétalos de la Flor Fantasma delante de ti. El taller tiene todas las herramientas que necesitas. ¿Cómo procedes?\"\n\n#. Key:\t7EE3EE474090DCA65BB3199E69E83B43\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_1.Children(1).Children.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_1.Children(1).Children.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"Leave\"\nmsgstr \"Salir\"\n\n#. Key:\t87B760894A587B34EB825487D907D2E4\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_7.Children(1).Children.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_7.Children(1).Children.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"Croon \\\"La LaLa LaLaLa LaLaLa\\\"\"\nmsgstr \"Croon \\\"La LaLa LaLaLa LaLaLa\\\"\"\n\n#. Key:\t947E69AA4EEE6DB329FAD48214D4C416\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_2.Children(0).Children.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_2.Children(0).Children.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"Say \\\"Sorry my <object name>!\\\"\"\nmsgstr \"Di \\\"¡lo siento mi <object name>!\\\"\"\n\n#. Key:\t95D5418F4145388680D7C99F720CE191\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_7.Children(3).Children.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_7.Children(3).Children.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"Say \\\"Brown\\\"\"\nmsgstr \"Di \\\"Marrón\\\"\"\n\n#. Key:\tC184ED314482D706C3426CB5034C3AFD\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_7.Children(2).Children.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_7.Children(2).Children.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"Say \\\"Blue\\\"\"\nmsgstr \"Di \\\"azul\\\"\"\n\n#. Key:\tC7EB7FC648E0005DC35550A3D71DF221\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_2.Children(3).Children.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_2.Children(3).Children.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"Cover the Abacus with Petals\"\nmsgstr \"Cubra el ábaco con pétalos\"\n\n#. Key:\tCA7A7E0A4F16FBE20EE16395D6565D7E\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"Maybe the abacus is a bit more ghosty now... or is it just you getting tired of trying?\"\nmsgstr \"Tal vez el ábaco es un poco más fantasmal ahora... ¿o solo te estás cansando de intentarlo?\"\n\n#. Key:\tE0507C5E44553E824F998D8D4CB044A4\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"Your last action did not lead to any visible change. What is your next move?\"\nmsgstr \"Su última acción no condujo a ningún cambio visible. ¿Cuál es tu próximo movimiento?\"\n\n#. Key:\tE8550D874C73F12B76345D9AAB2FEB80\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_2.Children(2).Children.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_2.Children(2).Children.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"Heat a hammer\"\nmsgstr \"Calentar un martillo\"\n\n#. Key:\tE894C6624CC7A0F92CECBBB364C77CD1\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_2.Children(1).Children.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_2.Children(1).Children.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"Say \\\"Sorry my Abacus!\\\"\"\nmsgstr \"Di \\\"Lo siento mi ábaco!\\\"\"\n\n#. Key:\tEFC4E9AB4A1B8DF491B4FBABBC7FA560\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"The Abacus is covered with the Petals of the Ghost Flower.\"\nmsgstr \"El ábaco está cubierto con los pétalos de la flor Fantasma.\"\n\n#. Key:\t100A735A460E0DE2B0D130B802762D8B\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter2/WW_Scroll_Inspect.WW_Scroll_Inspect:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Wizard/Chapter2/WW_Scroll_Inspect.WW_Scroll_Inspect:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_WW_Scroll_Inspect\"\nmsgid \"It says: \\\"Be careful: I think there are Fishies in the water!\\\"\"\nmsgstr \"Dice: \\\"Ten cuidado: ¡creo que hay Fishys en el agua!\\\"\"\n\n#. Key:\t1D280F60496F7EF5DBDADB90674E8225\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter2/WW_Scroll_Inspect.WW_Scroll_Inspect:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Wizard/Chapter2/WW_Scroll_Inspect.WW_Scroll_Inspect:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_WW_Scroll_Inspect\"\nmsgid \"He was.\"\nmsgstr \"Él era.\"\n\n#. Key:\t37D4983B49B8986752A095B03ADCD700\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter2/WW_Scroll_Inspect.WW_Scroll_Inspect:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Wizard/Chapter2/WW_Scroll_Inspect.WW_Scroll_Inspect:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_WW_Scroll_Inspect\"\nmsgid \"He was right.\"\nmsgstr \"Él tenia razón.\"\n\n#. Key:\t26432B92474630595CF8B6B44B02657B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_26.Text\n#: /Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_26.Text\nmsgctxt \"Dialogue_WWSewerCreatures\"\nmsgid \"Farewell and good luck to you as well!\"\nmsgstr \"¡Adiós y buena suerte a ti también!\"\n\n#. Key:\t2E3C904D458640A4F06DD793B416366A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_WWSewerCreatures\"\nmsgid \"All right, I will return when I'm done.\"\nmsgstr \"Muy bien, volveré cuando termine.\"\n\n#. Key:\t382595684668BDA97AAB95BF129246E4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_WWSewerCreatures\"\nmsgid \"No problem. I always help when I can.\"\nmsgstr \"No hay problema. Siempre ayudo cuando puedo.\"\n\n#. Key:\t4BF10AD741739BE69EF797A32410C281\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_WWSewerCreatures\"\nmsgid \"One of your brothers is trapped? What happened?\"\nmsgstr \"¿Uno de tus hermanos está atrapado? ¿Que pasó?\"\n\n#. Key:\t52403E3341ECEA5801B0E58D2F472FD5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_1.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_1.Children(1).Children.Text\nmsgctxt \"Dialogue_WWSewerCreatures\"\nmsgid \"Leave\"\nmsgstr \"Salir\"\n\n#. Key:\t53AC225B4F21B68CAC6F8997F324124E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_29.Text\n#: /Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_29.Text\nmsgctxt \"Dialogue_WWSewerCreatures\"\nmsgid \"Farewell until we meet again!\"\nmsgstr \"¡Adiós hasta que nos volvamos a ver!\"\n\n#. Key:\t65042BC342E9717229E74A9DD272DC5F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_WWSewerCreatures\"\nmsgid \"It was nice to see you again.\"\nmsgstr \"Fue bueno verte otra vez.\"\n\n#. Key:\t77959A144131C47488B221ADD9B1E13B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_WWSewerCreatures\"\nmsgid \"Don't worry! I'm still looking for it.\"\nmsgstr \"No te preocupes Todavía lo estoy buscando.\"\n\n#. Key:\t7914F3CA40844C2A13A760BB0DAE1BFA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_WWSewerCreatures\"\nmsgid \"I don't have time for you creature! Stay out of my way!\"\nmsgstr \"¡No tengo tiempo para ti criatura! ¡Fuera de mi camino!\"\n\n#. Key:\t79A62658414FE0202F2E9AA0E0238BD4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_9.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_9.Children(0).Children.Text\nmsgctxt \"Dialogue_WWSewerCreatures\"\nmsgid \"Accept Quest\"\nmsgstr \"Aceptar Misión\"\n\n#. Key:\t9AEDA0E84BABEBCD8F18E8BC2D0B75D0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_WWSewerCreatures\"\nmsgid \"Calm down creature! I mean you no harm.\"\nmsgstr \"¡Cálmate criatura! No quiero hacerte daño.\"\n\n#. Key:\tB89304534B24114D19DF7AB07635FFDE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_WWSewerCreatures\"\nmsgid \"All right I will see what I can do.\"\nmsgstr \"Muy bien, veré qué puedo hacer.\"\n\n#. Key:\tB8BD374E4738BFFDAFAC4EAA19E7A9D2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_23.Text\n#: /Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_23.Text\nmsgctxt \"Dialogue_WWSewerCreatures\"\nmsgid \"Oh, thank you!\"\nmsgstr \"¡Oh gracias!\"\n\n#. Key:\tCF62984840B7508E82BAC0AB9D53EC0A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_9.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_9.Children(1).Children.Text\nmsgctxt \"Dialogue_WWSewerCreatures\"\nmsgid \"Decline\"\nmsgstr \"Rechazar\"\n\n#. Key:\tEAD329F04773358B0CA339A4F155D990\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_WWSewerCreatures\"\nmsgid \"I'm sorry but I can't help you.\"\nmsgstr \"Lo siento pero no puedo ayudarte.\"\n\n#. Key:\tF281396D4110E61ACFEFDBB7AD8E44A8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_1.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_1.Children(0).Children.Text\nmsgctxt \"Dialogue_WWSewerCreatures\"\nmsgid \"Help\"\nmsgstr \"Ayuda\"\n\n#. Key:\tedge_next\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_1.InnerEdges(0).InnerEdges.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_1.InnerEdges(0).InnerEdges.Text\nmsgctxt \"DlgSystemSettings\"\nmsgid \"Next\"\nmsgstr \"Siguiente\"\n\n"
  },
  {
    "path": "Content/Localization/WarriorbDialogues/fr/WarriorbDialogues.po",
    "content": "﻿# WarriorbDialogues French translation.\n# Copyright 1998-2019 Epic Games, Inc. All Rights Reserved.\n# \nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: WarriorbDialogues\\n\"\n\"POT-Creation-Date: 2020-10-07 08:09\\n\"\n\"PO-Revision-Date: 2020-10-07 08:09\\n\"\n\"Language-Team: \\n\"\n\"Language: fr\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Plural-Forms: nplurals=2; plural=(n > 1);\\n\"\n\n#. Key:\t064BBCD1476819100C8D39881B7A7C56\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/2HW_LRDoor.2HW_LRDoor:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E2/2HW_LRDoor.2HW_LRDoor:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_2HW_LRDoor\"\nmsgid \"They still didn’t notice I locked them into the workroom.\"\nmsgstr \"Ils n'ont toujours pas remarqué que je les avais enfermés dans la salle de travail.\"\n\n#. Key:\t21412F0A4E45FA97703599BACD9C5D0E\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/2HW_LRDoor.2HW_LRDoor:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Ending/E2/2HW_LRDoor.2HW_LRDoor:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_2HW_LRDoor\"\nmsgid \"I entered into the Laboratory.\"\nmsgstr \"Je suis entré dans le laboratoire.\"\n\n#. Key:\t5A580A014B6E9907C819808423E10C30\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/2HW_LRDoor.2HW_LRDoor:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E2/2HW_LRDoor.2HW_LRDoor:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_2HW_LRDoor\"\nmsgid \"The Laboratory has strong secure spells. I can’t enter here without being noticed.\"\nmsgstr \"Le Laboratoire dispose de sorts de sécurité puissants. Je ne peux pas entrer ici sans être remarqué.\"\n\n#. Key:\t0530863744A9844E7F64009D82A189E4\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_2HW_WRDoor\"\nmsgid \"Ruin is close and we are all at risk. It’s not about you. It's about everyone.\"\nmsgstr \"La Ruine est proche et nous sommes tous en danger. Il ne s'agit pas seulement de vous. Il s'agit de tout le monde.\"\n\n#. Key:\t1AF2A89F4DCD86096D4343ABBE91BE51\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_2HW_WRDoor\"\nmsgid \"Something which doesn’t take my daughter’s soul...\"\nmsgstr \"Quelque chose qui ne prenne pas l'âme de ma fille...\"\n\n#. Key:\t2C5B294847F0E41F2CA189904EE66059\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_2HW_WRDoor\"\nmsgid \"I heard father arguing with someone.\"\nmsgstr \"J'ai entendu mon père se disputer avec quelqu'un.\"\n\n#. Key:\t2C8DFF1042FB0480709877A366BE2F1D\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_2HW_WRDoor\"\nmsgid \"The device must be destroyed.. We’ll find something else to stop Ruin.\"\nmsgstr \"L'appareil doit être détruit.. Nous trouverons quelque chose d'autre pour arrêter la Ruine.\"\n\n#. Key:\t3F9D7D9C42A8550A6B282680BFAE2CCC\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_2HW_WRDoor\"\nmsgid \"I had to do this. At least for mom. So that she didn’t die in vain.\"\nmsgstr \"Il fallait que je le fasse. Au moins pour maman. Pour qu'elle ne soit pas morte en vain.\"\n\n#. Key:\t7F6FC84C4D799841C6F42EB45A9D648F\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_2HW_WRDoor\"\nmsgid \"No, I won't risk losing her! She is bound to the device.\"\nmsgstr \"Non, je ne veux pas risquer de la perdre ! Elle est liée à ce dispositif.\"\n\n#. Key:\tA03D724A4606AFFC00E417A5C3AB3BFF\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_2HW_WRDoor\"\nmsgid \"Lillian knew what she applied for. She must decide.\"\nmsgstr \"Lillian savait ce qu'elle faisait. Elle doit se décider.\"\n\n#. Key:\tABA214914981F3E844F49483B43B5414\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_2HW_WRDoor\"\nmsgid \"I used the key to close the door.\"\nmsgstr \"J'ai utilisé la clé pour fermer la porte.\"\n\n#. Key:\tB1ADF0404F97735215FCB9A47DD01640\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_2HW_WRDoor\"\nmsgid \"No, I’ve made my decision.\"\nmsgstr \"Non, j'ai pris ma décision.\"\n\n#. Key:\tB26FAB564CA430617502FA85116629D0\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_2HW_WRDoor\"\nmsgid \"Even if our entire World needs to pay the price.\"\nmsgstr \"Même si notre Monde entier doit en payer le prix.\"\n\n#. Key:\tD6D2D64446B6D921576A20ACD653AF7E\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_2HW_WRDoor\"\nmsgid \"I knew he wouldn’t let me finish what we started.\"\nmsgstr \"Je savais qu'il ne me laisserait pas finir ce que nous avions commencé.\"\n\n#. Key:\t178EBCA541F7FEC3CA46B1B2818691D4\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/AABook.AABook:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/AABook.AABook:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_AABook\"\nmsgid \"'...the Wisest of the Arcade gathered here to discuss if the magical phenomena means any more threat...'\"\nmsgstr \"'...les Sages de l'Arcade se sont réunis ici pour se mettre d'accord sur la question de savoir si les phénomènes magiques représentent une menace supplémentaire...'\"\n\n#. Key:\t8F2CCFF54FBAF7902DB6FEB0358ECFEF\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/AABook.AABook:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/AABook.AABook:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_AABook\"\nmsgid \"They were just like us. The next one hundred pages explain why Ruin will never reach the Arcade or how the Ancient Magic can stop it.\"\nmsgstr \"Ils étaient comme nous. Les cent pages suivantes expliquent pourquoi la Ruine n'atteindra jamais l'Arcade ou comment la Magie Ancienne peut l'arrêter.\"\n\n#. Key:\tAC20B864497FB0D476C501AEF3B87508\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/AABook.AABook:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/AABook.AABook:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_AABook\"\nmsgid \"I hope you don’t want to read all that nonsense.\"\nmsgstr \"J'espère que vous ne voulez pas lire toutes ces absurdités.\"\n\n#. Key:\tB112F657498F660766AA45974CB44137\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/AABook.AABook:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/AABook.AABook:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_AABook\"\nmsgid \"'Ten years after the Cataclysm (or recently named as Ruin)...'\"\nmsgstr \"'Dix ans après le Cataclysme (ou récemment nommé \\\"Ruine\\\")...'\"\n\n#. Key:\t0F53B19F4EB2F7727B4907864AD3FF46\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_29.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_29.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"What if you just take a break from this and let me pass? Make an exception.\"\nmsgstr \"Et si vous preniez une pause et me laissiez passer ? Faites une exception.\"\n\n#. Key:\t1707E0F34CFDC054DBEAD9AFB368A0A4\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"No rest, no sleep allowed.\"\nmsgstr \"Pas de repos, pas de sieste autorisé.\"\n\n#. Key:\t2524B3EC4DE1E2921C710CBE4511045F\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"...sometimes I could really appreciate a chair.\"\nmsgstr \"...parfois je pouvais vraiment apprécier avoir une chaise.\"\n\n#. Key:\t29FE2AEF42639848EF3914B36BA2B633\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"I do ask you for apologies, young one.\"\nmsgstr \"Je vous demande de m'excuser, jeune être.\"\n\n#. Key:\t2C1E7EA026080F0A003A0396BE7E0E7E\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"Take this rune stone as compensation.\"\nmsgstr \"Prenez cette pierre runique en guise de compensation.\"\n\n#. Key:\t2C879B684B4B07B57D051797219E751E\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"You might have proven worthy for the Arcade Gate, yet there are some other doors, and they have different rules.\"\nmsgstr \"Vous vous êtes peut-être montré digne de la porte de l'Arcade, mais il y a d'autres portes, et elles ont des règles différentes.\"\n\n#. Key:\t3532C8254924CF13EA664CA11E256F07\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"Will you??? That's so kind of you... err... I mean...\"\nmsgstr \"Le ferez-vous ? C'est tellement gentil de votre part... euh... Je veux dire...\"\n\n#. Key:\t353D6C8B4B5719B1EFD2A59BA0281DED\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_2.Children(2).Children.Text\n#. Key:\t8EED48724A0A860CAD791FAF95554F26\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_3.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_2.Children(2).Children.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_3.Children(1).Children.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"Skip?\"\nmsgstr \"Passer ?\"\n\n#. Key:\t3FF1411844C23DB2FDFA47939169B5C3\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_14.Children(0).Children.Text\n#. Key:\t59EC5E56475DE41CFC723793CEEAFA82\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_3.Children(0).Children.Text\n#. Key:\t65DD6A464F04F8B0762D568046344C16\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_6.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_14.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_3.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_6.Children(0).Children.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"Accept challenge\"\nmsgstr \"Accepter le défi\"\n\n#. Key:\t414D5CC44FFD640215B97BB6090627D6\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"That must be tough...\"\nmsgstr \"Ça doit être dur...\"\n\n#. Key:\t4CAA2D0C4FB585A0EB5B4F87FE8A3A97\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"I accept my fate yet sometimes...\"\nmsgstr \"J'accepte mon destin, mais parfois...\"\n\n#. Key:\t4F7460F540408D07FECEEB88DC0D7D25\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"Not so fast young lord!\"\nmsgstr \"Pas si vite jeune seigneur !\"\n\n#. Key:\t52C3909F40026C52ADA498A5B60B3490\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_6.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_6.Children(1).Children.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"Poor Keeper\"\nmsgstr \"Pauvre Gardien\"\n\n#. Key:\t59141BA444003F36E1671CB4E91FFF0E\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"Farewell!\"\nmsgstr \"Adieu !\"\n\n#. Key:\t59AC0995469571DBE1B7B6BDF68FA37D\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"I am really sorry about that.\"\nmsgstr \"Je suis vraiment désolé pour ça.\"\n\n#. Key:\t5C8404D34863129B221EF2BB1D0962CC\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_9.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_9.Children(0).Children.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"Yes?\"\nmsgstr \"Oui ?\"\n\n#. Key:\t5FF922B94D3FCA5FD095FFB788F43D02\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"For there was a mistake.\"\nmsgstr \"Car il y a eu une erreur.\"\n\n#. Key:\t650DA55944F225C45BABE8B00D815A39\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_27.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_27.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"I guess you want me to go through some crazy traps again...\"\nmsgstr \"Je suppose que vous voulez que je traverse encore des situations délirantes...\"\n\n#. Key:\t700A25DB401C6EDD1E9D1694DA1C1DA1\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"Keepers never fail their duty.\"\nmsgstr \"Les Gardiens ne manquent jamais à leur devoir.\"\n\n#. Key:\t72D703F84C84CD07F7DA569D9B86AECB\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"There are times when you have to stand in front of a door for a really long time.\"\nmsgstr \"Il y a des moments où vous devez rester devant une porte pendant très longtemps.\"\n\n#. Key:\t8276A9AC4E3BAB81C41E6EAB12E4FED1\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_31.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_31.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"If I ever see a chair that's your size I will let you know.\"\nmsgstr \"Si jamais je vois une chaise de votre taille, je vous le ferai savoir.\"\n\n#. Key:\t89421ED443CA8DD5A15DF289C5DC6C37\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_28.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_28.Children(0).Children.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"Accept Challenge\"\nmsgstr \"Accepter le Défi\"\n\n#. Key:\t910F61A841D9E86D1B349E85A8A47FCF\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"Prove yourself worthy and I shall yield the path!\"\nmsgstr \"Prouvez que vous en êtes digne et je vous céderai le chemin !\"\n\n#. Key:\t9DAC66B94E5A37C628522B90029E8FCC\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_2.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_2.Children(0).Children.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"Not again\"\nmsgstr \"Pas encore\"\n\n#. Key:\t9F3FE24943FB7CE59B8453A2849E874A\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"This door is open and free of charge for everyone...\"\nmsgstr \"Cette porte est ouverte et gratuite pour tous...\"\n\n#. Key:\tA96E78A0410C87446F59ABAC1524A3F4\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_2.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_2.Children(1).Children.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"Let's do it!\"\nmsgstr \"Allons-y !\"\n\n#. Key:\tA9998DDC43D15F1EDE404B8A3E04E3B2\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"Keepers' lives are never easy.\"\nmsgstr \"La vie des Gardiens n'est jamais facile.\"\n\n#. Key:\tBCAE1C1D4890E79F187EF0940C6F7E84\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_12.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_12.Children(0).Children.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"Just get over\"\nmsgstr \"Remettez vous-en\"\n\n#. Key:\tC2F8F4E1457AC142E58D1EA3AF24AB56\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"I am all right with a few hundred years, but after a millennium my knees hurt like hell.\"\nmsgstr \"Quelques centaines d'années passent encore, mais après un millénaire, mes genoux me font un mal de chien.\"\n\n#. Key:\tC955446E4CA17593CCC57B9A73AAE824\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"What?? Do you mean that all those challenges that I had to pass were in vain?\"\nmsgstr \"Quoi ?? Voulez-vous dire que tous ces défis que j'ai dû relever ont été vains ?\"\n\n#. Key:\tC97F61DA4A49287F5242EEB43152D409\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"All right, you win. I'll go and do some jumping. Must be better than waiting here for an eternity.\"\nmsgstr \"Très bien, vous avez gagné. Je vais aller faire un peu de saut. Ça doit être mieux que d'attendre ici une éternité.\"\n\n#. Key:\tD318418D4CBBFA2AB381E6B287A8636F\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_30.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_30.Children(0).Children.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"Accept Challenge.\"\nmsgstr \"Accepter le Défi.\"\n\n#. Key:\tD6BE170047C1A00770403087A7EBDF99\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_30.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_30.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"Hopefully, we will finish this soon.\"\nmsgstr \"J'espère que nous aurons bientôt terminé.\"\n\n#. Key:\tD72FF4F943571BE3DC8DB1877581D4CD\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"You shall prove yourself one more time.\"\nmsgstr \"Vous devez faire vos preuves une fois de plus.\"\n\n#. Key:\tDFD8B1E0414F989D46ED9BB24610CDA8\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_12.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_12.Children(1).Children.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"I will help\"\nmsgstr \"Je vais aider\"\n\n#. Key:\tFDDD27C544787C63B03CCE89B69A44E5\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"Well, thanks!\"\nmsgstr \"Eh bien, merci !\"\n\n#. Key:\t06D52FD74B0013A5A22FEBA7A6E82032\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Did you came back to check out my wares?\"\nmsgstr \"Êtes-vous revenu pour vérifier mes marchandises ?\"\n\n#. Key:\t07508A9F4A979D530AD8A9861F0C7D79\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Though maybe you will find relief by looking through my wares. Haha!\"\nmsgstr \"Mais peut-être serez-vous soulagé en regardant mes marchandises. Haha !\"\n\n#. Key:\t0C1B7239419B00927360E1B9578540EA\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_27.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_27.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"That's a sad name indeed. If the old saying 'nomen est omen' is true, then it might not be the best choice.\"\nmsgstr \"C'est un triste nom, en effet. Si le vieux dicton 'nomen est omen' est vrai, alors ce n'est peut-être pas le meilleur choix.\"\n\n#. Key:\t0D8F81E140A7AF5369415FB1C081250E\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_10.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_10.Children(0).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Trade\"\nmsgstr \"Commercer\"\n\n#. Key:\t1089DA0443D9B23C84B8B799EEEBCCC9\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_SpeechSequence_0.SpeechSequence(0).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_SpeechSequence_0.SpeechSequence(0).SpeechSequence.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Oh, that's sad my little one.\"\nmsgstr \"Oh, c'est triste mon petit.\"\n\n#. Key:\t16F6844C40498EC1B5CDAA87612D3982\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_42.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_42.Children(1).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"No way\"\nmsgstr \"Pas moyen\"\n\n#. Key:\t182D4124450BFA52EF26FBACE1706333\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_45.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_45.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"How noble of you!\"\nmsgstr \"Comme c'est noble de votre part !\"\n\n#. Key:\t1922E4FD49ABC50B04A33CBA07B440D1\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_34.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_34.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"But I hope this doesn't mean that you want to join the Maintainers. Haha!\"\nmsgstr \"Mais j'espère que cela ne signifie pas que vous voulez rejoindre les Responsables. Haha !\"\n\n#. Key:\t195B9BED4921EE6D732CA4BE6391A402\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_31.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_31.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"No, thanks!\"\nmsgstr \"Non, merci !\"\n\n#. Key:\t198A3D8D426F5202C280CE96202EB415\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_50.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_50.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"This is a sad name indeed. And if the old saying 'nomen est omen' is true, then this might not be the best choice.\"\nmsgstr \"C'est un triste nom, en effet. Et si le vieux dicton 'nomen est omen' est vrai, alors ce n'est peut-être pas le meilleur choix.\"\n\n#. Key:\t1AF2DDE74542524EEF19CA9567CFBDAF\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"{name}? It still sounds a bit weird, but I think I might like it.\"\nmsgstr \"{name}? Cela semble encore un peu bizarre, mais je pense que cela pourrait me plaire.\"\n\n#. Key:\t1FC5AD3B488DB484169D0085D63ECC45\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"This sounds pretty epic but I wonder what nickname it might have?\"\nmsgstr \"Cela semble assez épique mais je me demande quel surnom on pourrait lui donner ?\"\n\n#. Key:\t21FEE27B41116ADFBFD2B69333D6EB3F\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"By using some sort of ritual or spell...\"\nmsgstr \"En utilisant une sorte de rituel ou de sort...\"\n\n#. Key:\t25DCE964400342D4188412ADF43277E6\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_61.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_61.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"I am rewarding you with these shiny coins!\"\nmsgstr \"Je vous récompense avec ces pièces brillantes !\"\n\n#. Key:\t2717F0E0414D4828B67D9C9F9B7E5F84\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_62.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_62.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"See? I'm a gnome of my word!\"\nmsgstr \"Vous voyez ? Je suis un gnome de parole !\"\n\n#. Key:\t2747A45248055455F9FA3B977A019EE0\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_44.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_44.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Well, you know where to find me... once you have some coins to spend!\"\nmsgstr \"Eh bien, vous savez où me trouver... une fois que vous aurez quelques pièces à dépenser !\"\n\n#. Key:\t27CE4D1444C219D35B79F4A3B07CB67D\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"If you bring them to me, I will reward you with shiny golden coins!\"\nmsgstr \"Si vous me les apportez, je vous récompenserai avec des pièces d'or brillantes !\"\n\n#. Key:\t3040F4DC4C763062C8EFED9BCA5028C0\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_59.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_59.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"I would love to give you that name, but if you don't have the money to pay for it, we can't make the deal, it wouldn't be fair\"\nmsgstr \"J'adorerais vous donner ce nom, mais si vous n'avez pas l'argent pour le payer, nous ne pouvons pas conclure un accord, ce ne serait pas juste\"\n\n#. Key:\t3124230541027A0022F54C8648E688C9\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Oh, a customer!\"\nmsgstr \"Oh, un client !\"\n\n#. Key:\t31C147E1430106CD29C7D7B2F7E84975\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_23.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_23.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Oh, how sad.\"\nmsgstr \"Comme c'est triste.\"\n\n#. Key:\t37CC1248471C360F8BB605A404ED1408\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_10.Children(4).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_10.Children(4).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Give books\"\nmsgstr \"Donner les livres\"\n\n#. Key:\t3E0A0E06487AD4E75C3AF28786DE9CC7\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_16.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_16.Children(0).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Don't know\"\nmsgstr \"Je ne sais pas\"\n\n#. Key:\t40221BB0432119A5B1C285B748AEFB81\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_51.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_51.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"It sounds pretty epic, however I wonder what nickname it might have?\"\nmsgstr \"Cela semble assez épique mais je me demande quel surnom on pourrait lui donner ?\"\n\n#. Key:\t422B5CC14CA23A6563EDBDBBEA09C44B\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_73.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_73.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Farewell! Ha-ha...\"\nmsgstr \"Adieu ! Ha-ha...\"\n\n#. Key:\t4574EE8E4B1EAB6C9310C4A19F77B170\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_10.Children(6).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_10.Children(6).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Leave\"\nmsgstr \"Partir\"\n\n#. Key:\t47F99BBF439F713C52279F86BDC4FDD5\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_72.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_72.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"No thanks, I'm leaving.\"\nmsgstr \"Non merci, je m'en vais.\"\n\n#. Key:\t4F31CEE0411BB60324FB58938857F162\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_16.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_16.Children(1).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"A mighty spirit\"\nmsgstr \"Un esprit puissant\"\n\n#. Key:\t4FA29908450786B433C0FCA2E313D989\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_36.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_36.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Hi, I'm Lory.\"\nmsgstr \"Salut, je m'appelle Lory.\"\n\n#. Key:\t4FCB34514D82104E732407A1CD985F6B\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_70.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_70.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Sure, show me what you've got!\"\nmsgstr \"Bien sûr, montrez-moi ce que vous avez !\"\n\n#. Key:\t53A46E1948B7CC1A9F8E02A3147FBF2D\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_67.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_67.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Sure, what can I do?\"\nmsgstr \"Bien sûr, que puis-je faire ?\"\n\n#. Key:\t53E7A272465DE8D6E34AE7BE7435B1AC\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_25.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_25.Children(1).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Spirit of the Unknown\"\nmsgstr \"Esprit de l'Inconnu\"\n\n#. Key:\t54F8FB604F0409ED474FBFBAD8BFD3B3\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"And you are...\"\nmsgstr \"Et vous êtes...\"\n\n#. Key:\t58447CCB4EE84827DB8328A664C54198\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_24.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_24.Children(0).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Buy name\"\nmsgstr \"Acheter le nom\"\n\n#. Key:\t589162A649D330D791082EB8FE3F6459\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_41.Children(4).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_41.Children(4).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Don't buy.\"\nmsgstr \"Ne pas acheter.\"\n\n#. Key:\t58CC98724AFCD3826D69D482682AF352\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"\\\"The true value of your family\\\" and \\\"How much does a brother cost?\\\" can be two examples in this case.\"\nmsgstr \"\\\"La vraie valeur de votre famille\\\" et \\\"Combien coûte un frère ?\\\" peuvent être deux exemples dans ce cas.\"\n\n#. Key:\t5A249B2E47F62C59F66AD5848E6DEBFE\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_49.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_49.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"I'll see what I can do.\"\nmsgstr \"Je vais voir ce que je peux faire.\"\n\n#. Key:\t5A31E5D34729F7EAB69AC08238C1D32D\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_25.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_25.Children(0).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Failed One\"\nmsgstr \"L'Échec\"\n\n#. Key:\t5BA1062346DF8BC47F97BA97653E6DDA\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_46.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_46.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Farewell then, and good luck with your quest! Ha-ha...\"\nmsgstr \"Adieu donc, et bonne chance dans votre quête ! Ha-ha...\"\n\n#. Key:\t6047D5334E0247BFB75EBAA7380C6800\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_68.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_68.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"I have some other important things to do right now.\"\nmsgstr \"J'ai d'autres choses importantes à faire en ce moment.\"\n\n#. Key:\t60B184AF4F25AFB60380029BD2C17AAB\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_66.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_66.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"I'm a mighty spirit of the Unknown!\"\nmsgstr \"Je suis un puissant esprit de l'Inconnu !\"\n\n#. Key:\t60CE0D4342B6E4971449D7BDDD62B13F\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_10.Children(3).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_10.Children(3).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Help\"\nmsgstr \"Aider\"\n\n#. Key:\t62C5459E46C969412EAD70BAD466D808\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_SpeechSequence_0.SpeechSequence(1).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_SpeechSequence_0.SpeechSequence(1).SpeechSequence.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Life is relentless. Innocent people are trapped, enslaved or abused!\"\nmsgstr \"La vie est implacable. Des innocents sont piégés, réduits en esclavage ou maltraités !\"\n\n#. Key:\t6DDEF0AB45B60A99946E8F9FC647DCDE\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_71.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_71.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"I need a proper name.\"\nmsgstr \"J'ai besoin d'un nom approprié.\"\n\n#. Key:\t6F1C50A44DE698DF5BF089B1C9B29F06\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_69.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_69.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Right now I don't really have much money...\"\nmsgstr \"En ce moment, je n'ai pas vraiment beaucoup d'argent...\"\n\n#. Key:\t72272161488706E5E87697A755F11129\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Even though there are some other precious books that I could add to my collection...\"\nmsgstr \"Même s'il y a d'autres livres précieux que je pourrais ajouter à ma collection...\"\n\n#. Key:\t764502A14C3C18B14F8A579A58CE5938\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"I know that some of those books must be in the Sewer's Library, but I couldn't find them.\"\nmsgstr \"Je sais que certains de ces livres doivent se trouver dans la Bibliothèque des Égouts, mais je n'ai pas pu les trouver.\"\n\n#. Key:\t7A1853C7454D74FD1F371A92CEE47B4E\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"That's fine but I wonder, what is your name?\"\nmsgstr \"C'est bien, mais je me demande quel est votre nom ?\"\n\n#. Key:\t7BACFCA748AF641E051E2D8B8D8488FC\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"I don't know if I have one.\"\nmsgstr \"Je ne sais pas si j'en ai un.\"\n\n#. Key:\t821021954082EA7E4B392FA89EE4DE91\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_41.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_41.Children(1).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Spirit of the Unknown (1 Gold)\"\nmsgstr \"Esprit de l'Inconnu (1 Or)\"\n\n#. Key:\t83AECB5A4FCAB05CC81BCC9B810245B7\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_41.Children(2).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_41.Children(2).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"BALL-E (1 Gold)\"\nmsgstr \"BALL-E (1 Or)\"\n\n#. Key:\t84ACF5E1449849CB79CF8AB10BE2FF2E\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"As you can observe, I have a pretty nice collection of books.\"\nmsgstr \"Comme vous pouvez le constater, j'ai une assez belle collection de livres.\"\n\n#. Key:\t899D1E18420FDAD236BF3486B2A5A010\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Ring the bell if you need something.\"\nmsgstr \"Sonnez la cloche si vous avez besoin de quelque chose.\"\n\n#. Key:\t8B33450F405DF08E72CE47B5FC66CDD5\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_55.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_55.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Spiry? Knowny?\"\nmsgstr \"Curieux ? Connaisseur ?\"\n\n#. Key:\t8CEC3E1943C3AB72CF3B71B160B9ADB9\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_10.Children(5).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_10.Children(5).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Need gold\"\nmsgstr \"Besoin d'or\"\n\n#. Key:\t8D0FBCA540F73842DD3AC38A76A5B623\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_56.Text\n#. Key:\tF045657A439D69E3615B80A066E9CE86\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_33.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_33.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_56.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Nevermind! You chose well.\"\nmsgstr \"Peu importe ! Vous avez bien choisi.\"\n\n#. Key:\t8F32BD4544F8C439D7344CBE1F9B4D8A\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_24.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_24.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Would you like to buy one? The first one is for free!\"\nmsgstr \"Vous souhaitez en acheter un ? Le premier est gratuit !\"\n\n#. Key:\t94C0F9B34F439CDFBDFAD696E81983E5\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"I don't have much gold. Is there any way you could help me out?\"\nmsgstr \"Je n'ai pas beaucoup d'or. Pourriez-vous m'aider ?\"\n\n#. Key:\t9BA6BAA24E6C2B7F01964D892246E8F6\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"No, no, I meant the other bell.\"\nmsgstr \"Non, non, je voulais dire l'autre cloche.\"\n\n#. Key:\tA9D4DF4C41BAD682571763BDA8DA6A62\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_10.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_10.Children(1).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Can't afford\"\nmsgstr \"Je ne peux pas me permettre\"\n\n#. Key:\tAA6B105442F5099CE0F4E2AE0DFF7080\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_35.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_35.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Now that we're done with this, will you have a look at my wares?\"\nmsgstr \"Maintenant que nous en avons fini avec cela, voulez-vous jeter un coup d'œil à mes marchandises ?\"\n\n#. Key:\tAADE21D24A42CE7BD318478306BAFFF7\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_10.Children(2).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_10.Children(2).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"I need a name\"\nmsgstr \"J'ai besoin d'un nom\"\n\n#. Key:\tAB00899C4A94AA6458737BB28339A3EE\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Hush, hush, little one!\"\nmsgstr \"Chut, chut, mon petit !\"\n\n#. Key:\tAB431F244E4E18230CE5EAB99FB41A96\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_41.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_41.Children(0).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Failed One (1 Gold)\"\nmsgstr \"L'Échec (1 or)\"\n\n#. Key:\tAB92E44E46B40EF16989FF850DE0F843\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_42.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_42.Children(0).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Interested\"\nmsgstr \"Interessé\"\n\n#. Key:\tB0540325412D9839B33FB38C4FE73172\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Well, I guess that's a classic.\"\nmsgstr \"Eh bien, je suppose que c'est un classique.\"\n\n#. Key:\tB0EFD31840839CDA6F3D929514412D00\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Ok, I'll try not to be annoying this time.\"\nmsgstr \"Ok, je vais essayer de ne pas être ennuyeux cette fois-ci.\"\n\n#. Key:\tB1F217944F6B9A29BD13FA926D8230E8\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_44.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_44.Children(0).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Farewell!\"\nmsgstr \"Adieu !\"\n\n#. Key:\tBA2B2F444FC2320349C4A0BABDA78B40\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_25.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_25.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"All right...\"\nmsgstr \"Très bien...\"\n\n#. Key:\tCADB3E394C94CDE32D9969B6C1A41F5C\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_47.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_47.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Take this Elevator Crystal as it might prove useful in your journey.\"\nmsgstr \"Prenez ce Cristal de l'Ascenseur car il pourrait vous être utile dans votre voyage.\"\n\n#. Key:\tCB3F061042B8340154B4CD8AEED41348\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_42.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_42.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"However, there is a way, I can help you out. Of course, if you are interested.\"\nmsgstr \"Cependant, il y a un moyen, je peux vous aider. Bien sûr, si vous êtes intéressé.\"\n\n#. Key:\tCF24AD454E123F6D7D61029155390914\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_41.Children(3).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_41.Children(3).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Warriorb (1 Gold)\"\nmsgstr \"Warriorb (1 Or)\"\n\n#. Key:\tD01937C848C69809890885BAB13042BE\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_65.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_65.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"I'm not quite sure.\"\nmsgstr \"Je n'en suis pas certain.\"\n\n#. Key:\tD53097EB4EFC08C0C3261A9EEBD96B72\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_39.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_39.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"That's sad. Nothing is worse than a customer without any gold to spend!\"\nmsgstr \"C'est triste. Rien n'est pire qu'un client qui n'a pas d'or à dépenser !\"\n\n#. Key:\tD63C08294AC09BF5B8E5D29EEC1C7D39\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"I'm forced to stay in this realm because I agreed to do some silly tasks for a wizard. I could really use some help.\"\nmsgstr \"Je suis obligé de rester dans ce royaume parce que j'ai accepté de faire des tâches idiotes pour un magicien. J'aurais vraiment besoin d'aide.\"\n\n#. Key:\tDB0CCA7746068ACFBE6F71963C398753\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_63.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_63.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"And now that you have some coins to spend it's time to talk about business!\"\nmsgstr \"Et maintenant que vous avez quelques pièces à dépenser, il est temps de parler affaires !\"\n\n#. Key:\tDC0F8EC0407F1C7B4FFED6A91CB961C5\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_57.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_57.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"I hope this doesn't mean that you want to join the Maintainers. Haha!\"\nmsgstr \"J'espère que cela ne signifie pas que vous voulez rejoindre les Responsables. Haha !\"\n\n#. Key:\tDC475A6740B71354D90D53B6AD1C4740\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_60.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_60.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"How wondrous! You found my books!\"\nmsgstr \"C'est merveilleux ! Vous avez trouvé mes livres !\"\n\n#. Key:\tE3B8F89B4D4AC0ABD2E35994ABFA9916\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"I understand if you have identity problems, but there must be a way... how do others call you?\"\nmsgstr \"Je comprends si vous avez des problèmes d'identité, mais il doit y avoir un moyen... comment les autres vous appellent-ils ?\"\n\n#. Key:\tE6BD711C4E23B71F944EEFB1C8D09AB4\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_41.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_41.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"You've come to the right place! Haha!\"\nmsgstr \"Vous êtes au bon endroit ! Haha !\"\n\n#. Key:\tEDEB662C4A5024CC618A668699BFAC2C\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_SpeechSequence_0.SpeechSequence(2).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_SpeechSequence_0.SpeechSequence(2).SpeechSequence.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"There is no justice in this Realm.\"\nmsgstr \"Il n'y a pas de justice dans ce Royaume.\"\n\n#. Key:\tF8814FA0497129A211F3F9BE01EAF378\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_29.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_29.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"That's a very cute name for a little one like you.\"\nmsgstr \"C'est un nom très mignon pour un petit comme vous.\"\n\n#. Key:\tF8BEB8C147C81D8B13E52AA9934891AB\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_58.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_58.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Nevermind, you can always come back.\"\nmsgstr \"Peu importe, vous pouvez toujours revenir.\"\n\n#. Key:\tF97BE7FD49F465A97F7C8D9F308EAD3C\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_52.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_52.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"That's such a cute name for a little one.\"\nmsgstr \"C'est un nom si mignon pour une petit chose.\"\n\n#. Key:\tFAAAE5944AA8CCAEFC931CAA814C8621\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_54.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_54.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Which means you chose well.\"\nmsgstr \"Ce qui signifie que vous avez bien choisi.\"\n\n#. Key:\tFAD10B404CF744B61DF5D093829CD1E9\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Of course! You need some gold, otherwise how would you buy my stuff?\"\nmsgstr \"Bien sûr ! Vous avez besoin d'un peu d'or, sinon comment achèteriez-vous mes affaires ?\"\n\n#. Key:\tFE40092A444E97C59E8C6E94061D1134\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_30.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_30.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"However, I'd rather prefer: 'Nomen quantivis iam est pret!'\"\nmsgstr \"Cependant, je préfère : 'Nomen quantivis iam est pret!'\"\n\n#. Key:\tFEE11C0F4A65DDFFDBF0BD8BB30CD438\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_25.Children(2).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_25.Children(2).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"BALL-E\"\nmsgstr \"BALL-E\"\n\n#. Key:\tFF0AFE8544814AE524115A853547D727\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_24.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_24.Children(1).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Refuse\"\nmsgstr \"Refuser\"\n\n#. Key:\t0648624E4922B098541A7EA738DABC92\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/AARagdoll.AARagdoll:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/AARagdoll.AARagdoll:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_AARagdoll\"\nmsgid \"Well that happens sometimes. Maybe that someone forgot to monopolize this ragdoll design.\"\nmsgstr \"Eh bien, cela arrive parfois. Peut-être que quelqu'un a oublié de monopoliser ce design de mannequin.\"\n\n#. Key:\t2058DE654B2B75531C04628635169938\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/AARagdoll.AARagdoll:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/AARagdoll.AARagdoll:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_AARagdoll\"\nmsgid \"Just leave that doll.\"\nmsgstr \"Laissez cette poupée.\"\n\n#. Key:\t5A456D084D452C82038A04942002FAE6\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/AARagdoll.AARagdoll:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/AARagdoll.AARagdoll:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_AARagdoll\"\nmsgid \"It’s like the doll which was made by...\"\nmsgstr \"Cela ressemble à la poupée qui a été faite par...\"\n\n#. Key:\t7813ED164DF5CA7DE48A978F9A3DC959\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/AARagdoll.AARagdoll:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/AARagdoll.AARagdoll:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_AARagdoll\"\nmsgid \"How on earth did this get here?\"\nmsgstr \"Comment diable cela est-il arrivé ici ?\"\n\n#. Key:\tC4403E4C4FD7D72CA3252FB31FF98FDF\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/AARagdoll.AARagdoll:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/AARagdoll.AARagdoll:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_AARagdoll\"\nmsgid \"...by someone I knew.\"\nmsgstr \"...par quelqu'un que je connaissais.\"\n\n#. Key:\tE4CD5DBC4E4BB1E783B55D80F4296B97\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/AARagdoll.AARagdoll:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/AARagdoll.AARagdoll:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_AARagdoll\"\nmsgid \"There are many weird things all over this place. What makes this stand out?\"\nmsgstr \"Il y a beaucoup de choses bizarres dans cet endroit. Qu'est-ce qui fait la différence ?\"\n\n#. Key:\tEDD72B38407D0C33C5F7859D09BC132B\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/AARagdoll.AARagdoll:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/AARagdoll.AARagdoll:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_AARagdoll\"\nmsgid \"You are not funny.\"\nmsgstr \"Vous n'êtes pas drôle.\"\n\n#. Key:\t02767246403F00F0C866B2A7F3E22A47\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_72.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_72.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"You can hardly find anyone that has more information about the Realms.\"\nmsgstr \"Il est difficile de trouver quelqu'un qui ait plus d'informations sur les Royaumes.\"\n\n#. Key:\t04843D4A4D2DD4BC7CE50989C8F66FBA\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_2.SpeechSequence(2).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_2.SpeechSequence(2).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"How can I do something if I do not know what I have to do?\"\nmsgstr \"Comment puis-je faire quelque chose si je ne sais pas ce que je dois faire ?\"\n\n#. Key:\t071A801E44759E2681218497B9AE9A2B\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_53.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_53.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Your logic is incoherent.\"\nmsgstr \"Cette logique est incohérente.\"\n\n#. Key:\t07488F9A4CC6F87DBC44F0A11700B370\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_70.Children(0).Children.Text\n#. Key:\tA67B3D3B4A3D17B37D585EBBBD9BBE92\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_75.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_70.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_75.Children(0).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"All right, I'm on it.\"\nmsgstr \"Très bien, je m'en occupe.\"\n\n#. Key:\t0757D23846F6BC96198472B7E9848D3F\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_52.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_52.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Maybe I should accept what I need to do now.\"\nmsgstr \"Je devrais peut-être accepter ce que je dois faire maintenant.\"\n\n#. Key:\t07D63011406134B07FB90B903825151C\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_8.SpeechSequence(2).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_8.SpeechSequence(2).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Make your wizard turn you back to normal.\"\nmsgstr \"Faites en sorte que votre magicien vous ramène à la normale.\"\n\n#. Key:\t091DFEFA4B2DD8F9922A1B93534C66A8\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_70.Text\n#. Key:\t0F92571643C12F65C669F7812572B014\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_82.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_70.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_82.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven gives you one of his keys so that you can move around freely.\"\nmsgstr \"Corbeau vous donne une de ses clés pour que vous puissiez vous déplacer librement.\"\n\n#. Key:\t0922ED5741BB89553CCB548D33566972\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_8.SpeechSequence(4).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_8.SpeechSequence(4).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven is something which won't make wizards turn Raven back.\"\nmsgstr \"L'existence du Corbeau ne fera pas revenir les magiciens.\"\n\n#. Key:\t0AAFADBB493DCFBA6C649EAC11133DC2\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_2.SpeechSequence(0).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_2.SpeechSequence(0).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"You don't have to know.\"\nmsgstr \"Vous n'avez pas besoin de savoir.\"\n\n#. Key:\t0E59A33E44BF6B212BF0EF8E8EFB3E39\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_6.SpeechSequence(2).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_6.SpeechSequence(2).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"A rich kingdom ruling all the other lands, powered by spirits of another world; these spirits were bound to metal.\"\nmsgstr \"Un riche royaume gouvernant toutes les autres terres, animé par des esprits d'un autre monde ; ces esprits étaient liés au métal.\"\n\n#. Key:\t0EACC01B4A4C4F8C5622B9BD291E0DB9\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_91.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_91.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"I'm not quite sure about this...\"\nmsgstr \"Je ne suis pas tout à fait sûr de cela...\"\n\n#. Key:\t10142FA943B5E5D89F9E5AADC86EF413\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_113.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_113.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Yes.\"\nmsgstr \"Oui.\"\n\n#. Key:\t12375FB0475147E23E1C21A867CFF219\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_68.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_68.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Is there anything else on your mind?\"\nmsgstr \"Y a-t-il autre chose qui vous préoccupe ?\"\n\n#. Key:\t12A0B58B446843DD24045394E8586D7D\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Krrr...\"\nmsgstr \"Krrr...\"\n\n#. Key:\t12B921E04D135919C7DA37ADDBD2A7DB\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_100.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_100.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"We still have some time left before this happens.\"\nmsgstr \"Il nous reste encore un peu de temps avant que cela n'arrive.\"\n\n#. Key:\t133F676B4DBA8B41F6B94387D51457D5\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_59.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_59.Children(1).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"No more Raven\"\nmsgstr \"Corps pas si beau\"\n\n#. Key:\t13EF39EE4249FDD62208CFB7A41821D7\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_65.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_65.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Though Raven knows how you feel.\"\nmsgstr \"Bien que Corbeau sache ce que vous ressentez.\"\n\n#. Key:\t15D06ACE4E8B5E4DA49297BBE436039D\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_80.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_80.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Now you only need to find a place where you can infuse it.\"\nmsgstr \"Il vous suffit maintenant de trouver un endroit où vous pouvez l'infuser.\"\n\n#. Key:\t16D5522340AE76E69A4808A3C2D1C039\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_51.Children(1).Children.Text\n#. Key:\t2AD4608440348AC7C3E363A430B9848C\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_83.Children(0).Children.Text\n#. Key:\t57DDAE184F31D9761E3939B16E6B2E67\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_20.Children(1).Children.Text\n#. Key:\t59F157C64A5415C8B4E322B0FF5F2ACE\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_49.Children(1).Children.Text\n#. Key:\t73ACC7124190746F6D3EBF96C8202C25\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_77.Children(1).Children.Text\n#. Key:\t9900274346DCB374A4B222A6BFD67365\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_10.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_10.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_20.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_49.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_51.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_77.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_83.Children(0).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Chat\"\nmsgstr \"Discuter\"\n\n#. Key:\t19FD8B0541A533338EA11B9CDA3719B2\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_74.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_74.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Now you only need to find a place where you can infuse it. Meanwhile, Raven must figure it out how to open the Gate with it.\"\nmsgstr \"Il vous suffit maintenant de trouver un endroit où vous pouvez l'infuser. En attendant, Corbeau doit trouver comment ouvrir la Porte avec.\"\n\n#. Key:\t1BD7592A4F11AEC585ECA6A74A0E0D4E\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_9.SpeechSequence(4).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_9.SpeechSequence(4).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"In what way?\"\nmsgstr \"De quelle manière ?\"\n\n#. Key:\t1C30FADA4BB2B3CCE2140A8E192D9F14\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_34.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_34.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven is not like those dummy Living Armors, yet he does what he was made for.\"\nmsgstr \"Corbeau n'est pas comme ces fausses Armures vivantes, et pourtant il fait ce pour quoi il a été fait.\"\n\n#. Key:\t1C57460444A7E044DD96148495C4C217\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_6.SpeechSequence(4).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_6.SpeechSequence(4).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"They lost purpose and became reckless.\"\nmsgstr \"Ils ont perdu leur but et sont devenus imprudents.\"\n\n#. Key:\t1E3AF1D8483287CE52633EA41B89DF11\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_116.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_116.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"After he had some rest.\"\nmsgstr \"Après avoir pris un peu de repos.\"\n\n#. Key:\t1ED675F344909355D41212988B736F70\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_1.SpeechSequence(3).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_1.SpeechSequence(3).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven's master would like to understand before doing anything.\"\nmsgstr \"Le maître de Corbeau voudrait comprendre avant de faire quoi que ce soit.\"\n\n#. Key:\t22E51DC245ABAE53146A71AAE8D5AB55\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"You will realize that 'sense' has no meaning in this realm anymore.\"\nmsgstr \"Vous vous rendrez compte que le 'sens' ne signifie plus rien dans ce royaume.\"\n\n#. Key:\t236E0B58451C947C0DB93E9E3408456D\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_45.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_45.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"They are humans.\"\nmsgstr \"Ce sont des humains.\"\n\n#. Key:\t254FBEE547ADDFCF33B350B04AE1EE16\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_95.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_95.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"I think I know all about the meaning of life and all, ok? Can we just go on?\"\nmsgstr \"Je pense que je sais tout sur le sens de la vie et tout, d'accord ? On peut continuer ?\"\n\n#. Key:\t2671F10D4257D8A3482009A9C042026D\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Hand it over to Raven so he could open the Gate!\"\nmsgstr \"Remettez-le à Corbeau pour qu'il puisse ouvrir la Porte !\"\n\n#. Key:\t2845CBE64B1624C7EC4B81BC314B4F1B\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_27.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_27.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"The master gave Raven the ability to think and talk.\"\nmsgstr \"Le maître a donné à Corbeau la capacité de penser et de parler.\"\n\n#. Key:\t29F405BF4233B5A8331B419747954425\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_77.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_77.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Why are you here?\"\nmsgstr \"Pourquoi êtes-vous ici ?\"\n\n#. Key:\t2B5FB92D4F98359F68AD58AB776FD9BA\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_9.SpeechSequence(1).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_9.SpeechSequence(1).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Seeking for knowledge, as always. And you? Never thought we’ll meet again. Still trying to take down these Realms forever?\"\nmsgstr \"A la recherche de la connaissance, comme toujours. Et vous ? Je ne pensais pas qu'on se reverrait. Vous essayez toujours de faire tomber ces royaumes pour toujours ?\"\n\n#. Key:\t2B8CF34046D5486EB935CE919A1BD469\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_97.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_97.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"I'm new with all this wizard business thing. What was their conversation about?\"\nmsgstr \"Je suis nouveau dans cette histoire de magicien. Quel était le sujet de leur conversation ?\"\n\n#. Key:\t2C15668C26080F0A003A02E7BE7B5A65\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_8.SpeechSequence(1).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_8.SpeechSequence(1).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"It can happen again.\"\nmsgstr \"Cela peut se reproduire.\"\n\n#. Key:\t2F226AC246B52387854AF5AFA09CEDD6\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_43.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_43.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"So we let those keys behind and set ourselves free from wizards?\"\nmsgstr \"Nous avons donc laissé ces clés derrière nous et nous nous sommes libérés des magiciens ?\"\n\n#. Key:\t2FF7B3E84C009ECFDDE9F495092BEAA8\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_9.SpeechSequence(7).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_9.SpeechSequence(7).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"A pleasure to hear that. Talk to Raven about the details. Please excuse me for leaving so early, I have something important to do.\"\nmsgstr \"C'est un plaisir d'entendre cela. Voyez avec Corbeau pour les détails. Veuillez m'excuser de partir si tôt, j'ai quelque chose d'important à faire.\"\n\n#. Key:\t305333F348E677D8C3553999F412C8B6\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_36.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_36.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven knows he has different tasks now, compared to what he used to do before.\"\nmsgstr \"Corbeau sait qu'il a maintenant des tâches différentes de celles qu'il avait l'habitude de faire auparavant.\"\n\n#. Key:\t311A1E3745667AC6B4114D999B0E7C7F\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_83.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_83.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Go now! Raven still needs some more time to think about this.\"\nmsgstr \"Partez maintenant ! Corbeau a encore besoin de temps pour y réfléchir.\"\n\n#. Key:\t32F0018141E94BDE0921E9A54C1E4F20\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_1.SpeechSequence(0).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_1.SpeechSequence(0).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"They were always like this.\"\nmsgstr \"Ils ont toujours été comme ça.\"\n\n#. Key:\t34903F43484A4D6CE5735890AEEA294D\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_9.SpeechSequence(5).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_9.SpeechSequence(5).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"The Cerulean Gates are closed again. What if we share the work?\"\nmsgstr \"Les Portes Céruléennes sont à nouveau fermées. Et si nous partagions le travail ?\"\n\n#. Key:\t350270814B961A20E48267A4B1AE0538\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Yes! The Gem is fully charged!\"\nmsgstr \"Oui ! La Gemme est entièrement chargée !\"\n\n#. Key:\t361D80AB46AC47E5A233ECA2323222A2\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_86.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_86.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Why are you obeying that wizard of yours?\"\nmsgstr \"Pourquoi obéissez-vous à votre magicien ?\"\n\n#. Key:\t365EDA2849D42A47D0D26DAC50DA6E94\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven is not that happy with those two, but Raven can accept that he is what he is.\"\nmsgstr \"Corbeau n'est pas très heureux avec ces deux-là, mais il peut accepter d'être ce qu'il est.\"\n\n#. Key:\t37C560AB4CCFAF4F8D26FAB1DE22453C\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_63.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_63.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Don't worry. You'll find some purpose.\"\nmsgstr \"Ne vous inquiétez pas. Vous trouverez un but.\"\n\n#. Key:\t39DAB8B641C31878F7312FA7807D9DA0\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_6.SpeechSequence(3).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_6.SpeechSequence(3).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"The residents of the Realm did not have to work. Their spirit slaves did everything for them, they accomplished all their desires.\"\nmsgstr \"Les habitants du Royaume n'étaient pas obligés de travailler. Leurs esclaves spirituels faisaient tout pour eux, ils accomplissaient tous leurs désirs.\"\n\n#. Key:\t3B63606F48193748243DE6AB18D7A68C\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_40.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_40.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven thinks you might want to be something else. Something that you used to be, but you are not anymore.\"\nmsgstr \"Corbeau pense que vous pourriez vouloir être autre chose. Quelque chose que vous étiez, mais que vous n'êtes plus.\"\n\n#. Key:\t3C332B1C4ADB3C16C005E8AAF76A09B1\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_109.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_109.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Except...\"\nmsgstr \"Excepté...\"\n\n#. Key:\t3C9750814FC56947BDA7DFAF8A71DCC2\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_25.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_25.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"It is a long story and Raven doesn't really like to talk about it.\"\nmsgstr \"C'est une longue histoire et Corbeau n'aime pas vraiment en parler.\"\n\n#. Key:\t3D10982D4A6FA88941F13F82413D17AC\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_20.Children(0).Children.Text\n#. Key:\t3E117EBB48C1CF091F456CA0FB78EDD7\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_77.Children(0).Children.Text\n#. Key:\t59F0F04941BB918E08743E8A7C3734B2\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_32.Children(6).Children.Text\n#. Key:\t6556945844ED44678075CE8796F00800\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_51.Children(0).Children.Text\n#. Key:\t7EC3944940792EC71B6A2F8674250649\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_49.Children(0).Children.Text\n#. Key:\tC6963EAE43B4D0FD3C8FBAA80A38E2A2\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_83.Children(1).Children.Text\n#. Key:\tE048FA684AA7B8DE0F7273992DA4600E\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_3.Children(4).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_20.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_3.Children(4).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_32.Children(6).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_49.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_51.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_77.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_83.Children(1).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Leave\"\nmsgstr \"Partir\"\n\n#. Key:\t4417EE084F947AAF5D3285B086F741AC\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven is fine with talking. Ask me whatever you have on your mind!\"\nmsgstr \"Corbeau est d'accord pour parler. Demandez-moi ce que vous avez en tête !\"\n\n#. Key:\t4485635A4832D9DC57240F8EF3323042\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Very nice! Raven likes that you are making progress.\"\nmsgstr \"Très bien ! Corbeau aime que vous fassiez des progrès.\"\n\n#. Key:\t480718E34822FD682466E7B217249ED0\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_47.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_47.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Which is technically the same.\"\nmsgstr \"Ce qui est techniquement la même chose.\"\n\n#. Key:\t48B67F42417A2930A4D200B958FDFB58\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_38.Children(3).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_38.Children(3).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"I'm confused\"\nmsgstr \"Je suis confus\"\n\n#. Key:\t49F0AC6A46EBF6C3148BC590CE56C297\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_10.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_10.Children(0).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Help\"\nmsgstr \"Aider\"\n\n#. Key:\t4CB1CE8A4AEC18FA175BA98F831D3C3C\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_59.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_59.Children(0).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Farewell\"\nmsgstr \"Adieu\"\n\n#. Key:\t4D514A7D4CC96E3E79F464A6C0BF0C6E\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_2.SpeechSequence(4).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_2.SpeechSequence(4).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"What??\"\nmsgstr \"Quoi ??\"\n\n#. Key:\t4F8198D64A210B3A41EED8AA6AE64401\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_50.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_50.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven will just sit here for a short time before venturing into the Ruin.\"\nmsgstr \"Corbeau restera assis ici pendant un court moment avant de s'aventurer dans la Ruine.\"\n\n#. Key:\t503CD5334EE86CFBEC2E7EA67F45ACD9\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"So you're meant to open this dusty little door with Raven, aren't you?\"\nmsgstr \"Vous êtes donc censé ouvrir cette petite porte poussiéreuse avec Corbeau, n'est-ce pas ?\"\n\n#. Key:\t512AEC2642B36D9DDF407EB447DF5A28\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_15.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_15.Children(1).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Let's have fun!\"\nmsgstr \"Amusons-nous !\"\n\n#. Key:\t5142E71B48C2E993CC8026919A3FDBD6\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_87.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_87.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Er... okey, I was just asking.\"\nmsgstr \"Euh... ok, je demandais juste.\"\n\n#. Key:\t518038644F25D09C9DA7FF984C272B77\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_40.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_40.Children(1).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"That's stupid\"\nmsgstr \"C'est stupide\"\n\n#. Key:\t53B5A1AC40CCF1CFBC106BA2BD8000E0\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_60.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_60.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Farewell, Raven!\"\nmsgstr \"Adieu, Corbeau !\"\n\n#. Key:\t54C0F3A6493E6D0671D38DB16BD4BF51\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"I would like to know...\"\nmsgstr \"Je voudrais savoir...\"\n\n#. Key:\t55665725414633C111356D94939362FF\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_67.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_67.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Let's open that gate. Quick!\"\nmsgstr \"Ouvrons cette porte. Vite !\"\n\n#. Key:\t565D7DA644ADF0E536C2FC8F99B735A3\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_3.Children(2).Children.Text\n#. Key:\t934A23AD44787C735FCDE79A34657C90\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_32.Children(3).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_3.Children(2).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_32.Children(3).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Why is he here?\"\nmsgstr \"Pourquoi est-il ici ?\"\n\n#. Key:\t57BE04074884DB4CC54AC691E156F0FC\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_38.Children(2).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_38.Children(2).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Freedom\"\nmsgstr \"Liberté\"\n\n#. Key:\t5919EDBF4799413180AF569CB920E436\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_90.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_90.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"You can't live your life like in the old days any longer and that's why you're staying with your master, right?\"\nmsgstr \"Tu ne peux plus vivre ta vie comme autrefois et c'est pourquoi tu restes chez ton maître, n'est-ce pas ?\"\n\n#. Key:\t592D458F40571927D0BB549F3614420E\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_32.Children(5).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_32.Children(5).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"End of the World\"\nmsgstr \"Fin du Monde\"\n\n#. Key:\t596065A34760461993AC339C51D9E402\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_73.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_73.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"First you will need to find the Gem. Meanwhile, Raven must figure it out how to open the Gate with it.\"\nmsgstr \"Vous devez d'abord trouver la gemme. En attendant, Corbeau doit trouver comment s'en servir pour ouvrir la Porte.\"\n\n#. Key:\t599A90394B8AC7A26D20FEB355A873FB\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_98.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_98.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"What are you doing here?\"\nmsgstr \"Que faites-vous ici ?\"\n\n#. Key:\t5A5D2F08427C4747F3EF529D6B73A21B\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Go on your search then! Unless you'd like to chat some more with Raven.\"\nmsgstr \"Alors, continuez vos recherches ! A moins que vous ne souhaitiez discuter davantage avec Corbeau.\"\n\n#. Key:\t5A63E364458C849C9B6FDD8491427051\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_8.SpeechSequence(5).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_8.SpeechSequence(5).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"But you could.\"\nmsgstr \"Mais vous pourriez.\"\n\n#. Key:\t5B07757F4CAAD674E09EBB835CEE230B\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_75.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_75.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"It must be somewhere close to the Arcade.\"\nmsgstr \"Cela doit se trouver quelque part près de l'Arcade.\"\n\n#. Key:\t5B9CDB4340B5E65E59D3A18283A84CA5\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_64.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_64.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven knows some people that'd be glad with that.\"\nmsgstr \"Corbeau connaît des gens qui en seraient ravis.\"\n\n#. Key:\t5BA0645E49A62C0945FB64BDF689721F\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_112.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_112.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Is that where I will find your artefacts?\"\nmsgstr \"C'est là que je trouverai vos artefacts ?\"\n\n#. Key:\t5E70951F4E50B061FF2DA196F0207612\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_15.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_15.Children(0).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Save the world!\"\nmsgstr \"Sauvez le monde !\"\n\n#. Key:\t5F810A7D417E5B02025F30B21FEA5F03\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_79.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_79.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Niiice!\"\nmsgstr \"Biieeen !\"\n\n#. Key:\t6441F8C2484FAA5219841C9D374F36C4\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_6.SpeechSequence(6).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_6.SpeechSequence(6).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"And now, even while we speak, their curse continues to spread.\"\nmsgstr \"Et maintenant, alors même que nous parlons, leur malédiction continue de se propager.\"\n\n#. Key:\t66A08695458FF9D46383F6A0AF609EFA\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_41.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_41.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"You are so hopeless...\"\nmsgstr \"Vous êtes tellement désespérés...\"\n\n#. Key:\t67EEF3DB42BA2C954AD566B4F95EBDB6\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_6.SpeechSequence(5).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_6.SpeechSequence(5).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Until one day the spirits broke loose and formed Ruin.\"\nmsgstr \"Jusqu'au jour où les esprits se sont libérés et ont formé la Ruine.\"\n\n#. Key:\t68442CA14CECA9FB8A215EBEBC724F63\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Ask more from Raven if you like!\"\nmsgstr \"Demandez davantage de choses à Corbeau si vous le souhaitez !\"\n\n#. Key:\t694D416244358BD7DBED04A82390A146\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_51.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_51.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"One more,... and the Gem will be completed!\"\nmsgstr \"Encore un,... et la gemme sera achevée !\"\n\n#. Key:\t6A463E0444754B73FE11988F07D5A58F\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_2.SpeechSequence(1).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_2.SpeechSequence(1).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"You just have to do it.\"\nmsgstr \"Il suffit de le faire.\"\n\n#. Key:\t6A92F010409301669F7B83AD7901A469\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"A strange creature, yet a familiar aura! Tell me, my dear Wizard, what happened to Tabby?\"\nmsgstr \"Une créature étrange, mais une aura familière ! Dis-moi, mon cher Magicien, qu'est-il arrivé à Tabby ?\"\n\n#. Key:\t6CC1259244D5FC82CA1C2EA314836741\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_1.SpeechSequence(1).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_1.SpeechSequence(1).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"They both accepted that there is a great threat in this realm.\"\nmsgstr \"Ils ont tous deux reconnu qu'il existe une grande menace dans ce domaine.\"\n\n#. Key:\t6FB7AF774662247E2001F9AAF34FF134\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_111.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_111.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Somewhere beyond that Gate there's a Portal. It will take you into the heart of the Realm.\"\nmsgstr \"Quelque part au-delà de cette Porte, il y a un portail. Il vous emmènera au cœur du Royaume.\"\n\n#. Key:\t70A0BA47476A909013EFC0A574815B61\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_23.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_23.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"The Master and Raven are seeking knowledge about the Ruined Realm.\"\nmsgstr \"Le Maître et Corbeau sont à la recherche de connaissances sur le Royaume en Ruines.\"\n\n#. Key:\t70ECE1B74BA0B02F2F0850937BF4FB02\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_3.Children(3).Children.Text\n#. Key:\tE9F5916345156A4E5F29AC886B49B8AD\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_32.Children(4).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_3.Children(3).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_32.Children(4).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"About Ruin\"\nmsgstr \"À propos de la Ruine\"\n\n#. Key:\t7311CA4B4D6B19C6C5C362AF522A9803\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_1.SpeechSequence(4).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_1.SpeechSequence(4).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Your master said he is done with that.\"\nmsgstr \"Votre maître a dit qu'il en avait fini avec cela.\"\n\n#. Key:\t74B8E0B44D4590E9970F4B9D09D3C4F9\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_6.SpeechSequence(1).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_6.SpeechSequence(1).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Long ago it was called the Runic Realm.\"\nmsgstr \"Il y a longtemps, on l'appelait le Royaume Runique.\"\n\n#. Key:\t76756B1C48E93E907CE32D83A2C56C3E\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_7.SpeechSequence(0).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_7.SpeechSequence(0).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven is really sorry but he can't help you anymore.\"\nmsgstr \"Corbeau est vraiment désolé, mais il ne peut plus vous aider.\"\n\n#. Key:\t78C7CE5948D176704CA69289BEEBFBA7\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_44.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_44.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"And what about the Realm of the wizards? They did not go mad yet, did they?\"\nmsgstr \"Et qu'en est-il du Royaume des Magiciens ? Ils ne sont pas encore devenus fous, n'est-ce pas ?\"\n\n#. Key:\t7DFA4D494BD0536F925A94BBF7C71F36\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_66.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_66.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Focus on what you have to do and you will find the real you.\"\nmsgstr \"Concentrez-vous sur ce que vous avez à faire et vous trouverez le vrai vous.\"\n\n#. Key:\t81F437694DEE3D32A0FC29B90688E8B9\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_38.Children(4).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_38.Children(4).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"This is stupid\"\nmsgstr \"C'est stupide\"\n\n#. Key:\t82F473A04D250E98AD186185EBE95C04\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_5.SpeechSequence(0).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_5.SpeechSequence(0).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven thinks freedom is such an empty word.\"\nmsgstr \"Corbeau pense que la liberté est un mot si vide de sens.\"\n\n#. Key:\t8688802A4303C53640C7BFAAA40226EC\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Almost there!\"\nmsgstr \"On y est presque !\"\n\n#. Key:\t8728C02E46E7B681D0A792ACAFC3237D\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_28.Children(2).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_28.Children(2).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"He accepted his fate\"\nmsgstr \"Il a accepté son sort\"\n\n#. Key:\t8854653141FA36E731780F9111B82FAD\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_30.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_30.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"You are not listening to Raven's words!\"\nmsgstr \"Vous n'écoutez pas les paroles de Corbeau !\"\n\n#. Key:\t88FDA06B4A44ED1BF559D996E6AF7097\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_6.SpeechSequence(0).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_6.SpeechSequence(0).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Even so, Raven will tell you a bit.\"\nmsgstr \"Malgré cela, Corbeau vous en dira un peu plus.\"\n\n#. Key:\t8BA584404F2713EE39D74284F829C50A\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"You know what? Raven totally agrees with that!\"\nmsgstr \"Vous savez quoi ? Corbeau est tout à fait d'accord avec ça !\"\n\n#. Key:\t8C272FBE47796CF8101D07AAD033C24B\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_62.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_62.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"The later we met the more time the World survived, didn't it?\"\nmsgstr \"Plus tard notre rencontre a eu lieu, plus longtemps le Monde a survécu, n'est-ce pas ?\"\n\n#. Key:\t8DD39A3D497411B348B883972CE6B442\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_6.SpeechSequence(7).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_6.SpeechSequence(7).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"At first, lands lose their colours, people go mad... and then, everything breaks into shards until solely hollowness remains...\"\nmsgstr \"Au début, les terres perdent leurs couleurs, les gens deviennent fous... et puis, tout se brise en éclats jusqu'à ce qu'il ne reste plus que le vide...\"\n\n#. Key:\t8E02961D428949EE8176639F6AE84DD9\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_107.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_107.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"If the end is near, there is no point in making long term plans.\"\nmsgstr \"Si la fin est proche, il ne sert à rien de faire des plans à long terme.\"\n\n#. Key:\t8EB8F2654B9C18135CBEB49D10485417\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_37.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_37.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"We all have a purpose in life.\"\nmsgstr \"Nous avons tous un but dans la vie.\"\n\n#. Key:\t9131DE4C434AD9B22C7B1BAA588AF694\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_9.SpeechSequence(3).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_9.SpeechSequence(3).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Private business? All right! We might have different motivations, however working together could be fruitful.\"\nmsgstr \"Les entreprises privées ? Très bien ! Nous pouvons avoir des motivations différentes, mais travailler ensemble peut être fructueux.\"\n\n#. Key:\t91947E4046F96E9330EA5A94C367E2C5\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Forget it, I'm on my way now.\"\nmsgstr \"Oubliez ça, je suis en route maintenant.\"\n\n#. Key:\t91BE2C7248B2BEBE1C376B989935E353\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"What else should Raven tell you?\"\nmsgstr \"Que devrait encore vous dire Corbeau ?\"\n\n#. Key:\t929558D0465B0884C4E373A602CCE9E5\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_59.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_59.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Farewell compeer until you meet Raven again!\"\nmsgstr \"Adieu compétiteur jusqu'à ce que vous rencontriez à nouveau Corbeau !\"\n\n#. Key:\t930942934A83107D86DB69A2C2EF11E0\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_117.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_117.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"The task is of high complexity.\"\nmsgstr \"La tâche est d'une grande complexité.\"\n\n#. Key:\t93AFC24842A793D2BF7B43A64B6972AF\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_32.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_32.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Is there anything else for Raven?\"\nmsgstr \"Y a-t-il autre chose pour Corbeau ?\"\n\n#. Key:\t9A9D5DA346251040AF73B7B100E1EBC9\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_35.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_35.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven used to like being a bird, but now he has no other choice. He must embrace what he became.\"\nmsgstr \"Avant, Corbeau aimait être un oiseau, mais maintenant il n'a plus le choix. Il doit embrasser ce qu'il est devenu.\"\n\n#. Key:\t9B558C3045D4501AEAF3DD8694E2198F\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_105.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_105.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"We'd rather have some fun before it's all over.\"\nmsgstr \"Nous préférons nous amuser avant que tout ne soit terminé.\"\n\n#. Key:\t9E598A384E301BCD345ABFB0C1312C12\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_78.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_78.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Krrr... Raven notices that you've found the Gem!\"\nmsgstr \"Krrr... Corbeau remarque que vous avez trouvé la gemme !\"\n\n#. Key:\t9FAD3A1A4E3EFE33C1CAB8BAAC8190D1\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_26.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_26.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Let Raven tell you something:\"\nmsgstr \"Laissez Corbeau vous dire quelque chose :\"\n\n#. Key:\tA10F960549BD21AFAD4819BD5C74E651\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_2.SpeechSequence(5).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_2.SpeechSequence(5).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Nevermind. Raven is kidding.\"\nmsgstr \"Peu importe. Corbeau plaisante.\"\n\n#. Key:\tA4294A174F9EA54E0149839A84CE2B94\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_15.Children(2).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_15.Children(2).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Hopeless...\"\nmsgstr \"Sans espoir...\"\n\n#. Key:\tA59406E8411939F96004EAA9D5707E08\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_28.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_28.Children(1).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"What?\"\nmsgstr \"Quoi ?\"\n\n#. Key:\tA5993D8047CDD35BA31D318832EB9C66\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_32.Children(2).Children.Text\n#. Key:\tB7AE6BEC4CA905BDED5990BFF4D0C93D\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_3.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_3.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_32.Children(2).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"About wizards\"\nmsgstr \"A propos des magiciens\"\n\n#. Key:\tA59A76814D8EAF5907CBC68AA63FE33F\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_2.SpeechSequence(3).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_2.SpeechSequence(3).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"How can I know that if you don't do it?\"\nmsgstr \"Comment puis-je le savoir si vous ne le faites pas ?\"\n\n#. Key:\tA7C7D1EC45A072755BAAB099DB359290\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_55.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_55.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"They don't believe that Ruin can affect their World. They say that it has no effect.\"\nmsgstr \"Ils ne croient pas que la Ruine puisse affecter leur Monde. Ils disent qu'elle n'a aucun effet.\"\n\n#. Key:\tA7D99136490D40CB08BA66A72192D6C0\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_7.SpeechSequence(2).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_7.SpeechSequence(2).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Go now! Raven needs to think.\"\nmsgstr \"Partez maintenant ! Corbeau a besoin de réfléchir.\"\n\n#. Key:\tA80B626C41713C6E42E4DF8696FF842D\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_8.SpeechSequence(0).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_8.SpeechSequence(0).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"You were a bird once. Then you became something else.\"\nmsgstr \"Vous étiez un oiseau autrefois. Puis vous êtes devenu autre chose.\"\n\n#. Key:\tA8D429384EFE74E30720149A1C53ADE9\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_38.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_38.Children(0).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Don't know\"\nmsgstr \"Je ne sait pas\"\n\n#. Key:\tA9A73720489C122A81B84CBA262C329E\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_38.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_38.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven knows what his task is. Do you know yours?\"\nmsgstr \"Corbeau sait quelle est sa tâche à accomplir. Connaissez-vous la vôtre ?\"\n\n#. Key:\tAB41A75C432BEBDC81D63282FCC15F98\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_5.SpeechSequence(2).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_5.SpeechSequence(2).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Got it? Free like a bird! Ha-ha-ha!\"\nmsgstr \"Compris ? Libre comme l'oiseau ! Ha-ha-ha !\"\n\n#. Key:\tAC52327249DB335CBAB9EDA6A3F4769E\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_31.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_31.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven is doing this because this is what he is.\"\nmsgstr \"Corbeau fait cela parce que c'est ce qu'il est.\"\n\n#. Key:\tB2003CEE44335B30B9F85487521B7679\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_54.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_54.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Maybe.\"\nmsgstr \"Peut-être.\"\n\n#. Key:\tB31EEC6247CDEF73BB4E5B84E2B66575\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_9.SpeechSequence(2).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_9.SpeechSequence(2).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"That’s over now. This time it's for private business.\"\nmsgstr \"C'est terminé maintenant. Cette fois, c'est une affaire privée.\"\n\n#. Key:\tB3DD59C44422BA99C839FCAE63F05B9A\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_93.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_93.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"I want to be free again!\"\nmsgstr \"Je veux être libre à nouveau !\"\n\n#. Key:\tB789219A48C2A835F2DA4CA24064E1D3\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_92.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_92.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"I would like to go home.\"\nmsgstr \"Je voudrais rentrer chez moi.\"\n\n#. Key:\tB7D4201F41E5F018EFD49EAF52E443A8\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_76.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_76.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"You still haven't found the Gem.\"\nmsgstr \"Vous n'avez toujours pas trouvé la Gemme.\"\n\n#. Key:\tB7EC6E4F4EDC448FD264999938414F3C\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Let's talk about something else!\"\nmsgstr \"Parlons d'autre chose !\"\n\n#. Key:\tB8BF08674C9E2FD0515998B95A1EA7CF\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_7.SpeechSequence(1).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_7.SpeechSequence(1).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"If you can't fulfill your task, then maybe your master should look for a better servant.\"\nmsgstr \"Si vous ne pouvez pas remplir votre tâche, alors peut-être que votre maître devrait chercher un meilleur serviteur.\"\n\n#. Key:\tBD775EF74E334A4DEFA67BBF9034500E\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_84.Text\n#. Key:\tFA3FEF444FD2A3500FCCE98FAEAE923E\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_42.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_42.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_84.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Yes?\"\nmsgstr \"Oui ?\"\n\n#. Key:\tBE2B9D7A45C2D43FF4C0BAAA284CBB97\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"No thanks! I'm on my way now.\"\nmsgstr \"Non merci ! Je suis ma route maintenant.\"\n\n#. Key:\tC04CC9334FC3C2522793C2B97CC165D8\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_108.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_108.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"The gate is open!\"\nmsgstr \"La porte est ouverte !\"\n\n#. Key:\tC0F2E4744D724A3D6A0DEF914C294CE1\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_38.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_38.Children(1).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Go home\"\nmsgstr \"Rentre chez toi\"\n\n#. Key:\tC10018654B64193BBFF439B54EF02FB1\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"So why not open the gate?\"\nmsgstr \"Alors pourquoi ne pas ouvrir la porte ?\"\n\n#. Key:\tC18E2FB345BE76B6F51C71A2B6453316\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_99.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_99.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"What can you tell me about the Ruined Realm?\"\nmsgstr \"Que pouvez-vous me dire sur le Royaume en Ruines ?\"\n\n#. Key:\tC19082D247C23A21B632968FE6A644D1\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_8.SpeechSequence(3).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_8.SpeechSequence(3).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"You failed to see the meaning behind Raven's thoughts.\"\nmsgstr \"Vous n'avez pas compris le sens des pensées de Corbeau.\"\n\n#. Key:\tC2DC44084098DD604B757A8A47AAC4FE\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_58.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_58.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"We'll see.\"\nmsgstr \"Nous verrons bien.\"\n\n#. Key:\tC53F5E0F46BBE7A1FD00EABD6E14848D\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_33.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_33.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Maybe you are wiser than Raven, but that's just a thought, little spirit.\"\nmsgstr \"Vous êtes peut-être plus sage que Corbeau, mais ce n'est qu'une pensée, petit esprit.\"\n\n#. Key:\tC78588B64D12FFBE97C47AB7C046C14E\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_1.SpeechSequence(5).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_1.SpeechSequence(5).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven doesn't believe it's true.\"\nmsgstr \"Corbeau ne croit pas que ce soit vrai.\"\n\n#. Key:\tC7F7F71F4FE0D19BDF86188BEFDDEEB1\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_5.SpeechSequence(1).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_5.SpeechSequence(1).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Just look at Raven! He's free like a bird.\"\nmsgstr \"Regardez Raven ! Il est libre comme l'oiseau.\"\n\n#. Key:\tC82BE6E448D7C98D361CA1890FEE3B2C\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_9.SpeechSequence(6).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_9.SpeechSequence(6).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"I’m in.\"\nmsgstr \"J'en suis.\"\n\n#. Key:\tCD1A68EF460B0C63C95340AC2076EBAF\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven notices that the gem is just as dull as before. Why did you return then?\"\nmsgstr \"Corbeau remarque que la gemme est tout aussi terne qu'avant. Pourquoi êtes-vous revenu alors ?\"\n\n#. Key:\tD3C84C884903F7FB53695AAE253C7982\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_40.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_40.Children(0).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Agree\"\nmsgstr \"D'accord\"\n\n#. Key:\tD438ABB348A399ACB18DFD8F320CC7BB\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_57.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_57.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"And what's the truth?\"\nmsgstr \"Et quelle est la vérité ?\"\n\n#. Key:\tD5DF32814FA17D7ED28BF0A91027A6E8\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_110.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_110.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Finally! From now on you won't need Raven anymore.\"\nmsgstr \"Enfin ! A partir de maintenant, vous n'aurez plus besoin de Corbeau.\"\n\n#. Key:\tD6A649B2453BCBAD95A16FA481664133\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_49.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_49.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Find the other Chargers and return to Raven when you are done.\"\nmsgstr \"Trouvez les autres Chargeurs et retournez voir Corbeau quand vous aurez terminé.\"\n\n#. Key:\tD9959CF1439812F5615A38B9369F6E16\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_71.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_71.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven notices that you already have the Gem.\"\nmsgstr \"Corbeau remarque que vous avez déjà la Gemme.\"\n\n#. Key:\tD9A4F3D54EF460C09B2A6C9B8EB87D7C\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_32.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_32.Children(1).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"About my purpose...\"\nmsgstr \"A propos de mon but...\"\n\n#. Key:\tD9C6F8C14BC9C0BD83715E96DE5B7161\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_28.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_28.Children(0).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"He is a volunteer\"\nmsgstr \"Il est volontaire\"\n\n#. Key:\tDC7CA6DF4D684A7C2DBA739F404ABC36\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_94.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_94.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"I don't know what to do. I can't remember anything from my previous life.\"\nmsgstr \"Je ne sais pas quoi faire. Je ne me souviens de rien de ma vie antérieure.\"\n\n#. Key:\tDD8E05E541C32F05357D888FB6963FF0\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_114.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_114.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"All right, I go then.\"\nmsgstr \"Très bien, j'y vais alors.\"\n\n#. Key:\tDE3A0B8047C9980B6DED0BA39C777539\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_28.Children(3).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_28.Children(3).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Not interested\"\nmsgstr \"Pas intéressé\"\n\n#. Key:\tDF86F9C84CF207616E931098F3C833D3\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"To activate the locking mechanism we need an infused Lock Gem.\"\nmsgstr \"Pour activer le mécanisme de verrouillage, nous avons besoin d'une Gemme de Verrouillage infusée.\"\n\n#. Key:\tE0105C1845AF9211960E869AB234ED9A\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_89.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_89.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"So you are obeying because... that's the only thing that you can do?\"\nmsgstr \"Donc vous obéissez parce que... c'est la seule chose que vous pouvez faire ?\"\n\n#. Key:\tE17598BB49D7E4083AD4AEA2DDFE293D\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_106.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_106.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"It would make sense to try to save the world, wouldn't it?\"\nmsgstr \"Il serait logique d'essayer de sauver le monde, n'est-ce pas ?\"\n\n#. Key:\tE1CFA5A44F4EF59527528DB6018ACF33\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_8.SpeechSequence(6).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_8.SpeechSequence(6).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven doesn't care about what he could do. Raven cares about what he does.\"\nmsgstr \"Corbeau ne se soucie pas de ce qu'il pourrait faire. Corbeau se soucie de ce qu'il fait.\"\n\n#. Key:\tE6FA584E454BC3943C927EADAEBA88C4\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_6.SpeechSequence(8).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_6.SpeechSequence(8).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"That's not too reassuring...\"\nmsgstr \"Ce n'est pas très rassurant...\"\n\n#. Key:\tE9D9EC1F450276CF11B259978062AB7E\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_96.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_96.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"We shouldn't waste any more time on this.\"\nmsgstr \"Nous ne devrions pas perdre plus de temps sur ce sujet.\"\n\n#. Key:\tEC19AF0E4F2F4B488373FFBEDC272321\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_56.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_56.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Except for a few paranoid ones, like your master.\"\nmsgstr \"Sauf pour quelques paranoïaques, comme votre maître.\"\n\n#. Key:\tEFC8B9984D9F4A9ACC9AE580E271E810\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_39.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_39.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Searching for a way to open this gate with the help of a talking Ball is so much fun!\"\nmsgstr \"Chercher un moyen d'ouvrir cette porte à l'aide d'une Balle qui parle est tellement amusant !\"\n\n#. Key:\tEFCE20A646FA62188BE7EB85D6708843\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_115.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_115.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven will venture deeper into the Ruined Realm!\"\nmsgstr \"Corbeau s'aventurera plus loin dans le Royaume en Ruines !\"\n\n#. Key:\tF0B00A30413914D09CA4488578B2FD7C\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_24.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_24.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven agrees.\"\nmsgstr \"Corbeau est d'accord.\"\n\n#. Key:\tF40AD31D4177DCB7BB138C9C139FB1A1\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_61.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_61.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"I hope that won't be too soon...\"\nmsgstr \"J'espère que ce ne sera pas trop tôt...\"\n\n#. Key:\tF4F8CBCD421083EDBF626AA47DEF4B50\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_88.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_88.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Do you mean that you are serving your wizard by your own will?\"\nmsgstr \"Voulez-vous dire que vous servez votre magicien par votre propre volonté ?\"\n\n#. Key:\tF5A7836549DF56B89620A386E7CCF708\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_48.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_48.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"But there is still so much left to do...\"\nmsgstr \"Mais il reste encore tant à faire...\"\n\n#. Key:\tF8361ECC401E740DEBF87FAE2A419EC8\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_32.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_32.Children(0).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven Servant?\"\nmsgstr \"Serviteur de Corbeau ?\"\n\n#. Key:\tFA5F957341772B0C4AFA33B1311CF7B4\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_69.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_69.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Except if we meet in the Afterworld.\"\nmsgstr \"Sauf si nous nous rencontrons dans l'Au-delà.\"\n\n#. Key:\tFA94A8EF4F8BF5EA422D27A9A205D866\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_3.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_3.Children(0).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven servant?\"\nmsgstr \"Serviteur de Corbeau ?\"\n\n#. Key:\tFC0798A648BFC0E9BA70D6B20A46F447\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_1.SpeechSequence(2).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_1.SpeechSequence(2).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Your master seeks to stop it no matter the price he has to pay.\"\nmsgstr \"Votre maître cherche à l'arrêter quel que soit le prix qu'il doit payer.\"\n\n#. Key:\tFCE7049641D2A70FC6B9E5B174919A64\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_9.SpeechSequence(0).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_9.SpeechSequence(0).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Tabby has retired. What did you come for?\"\nmsgstr \"Tabby s'est retiré. Pourquoi êtes-vous venu ?\"\n\n#. Key:\tFD68B18A435050A137D8F0948F24E2DC\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Why are we messing with this door if the World is about to end?\"\nmsgstr \"Pourquoi s'en prendre à cette porte alors que le Monde est sur le point de s'écrouler ?\"\n\n#. Key:\tFF3D9FCF4A840A8155A8D7AD9CC22F2D\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Obey? Raven doesn't obey.\"\nmsgstr \"Obéir ? Corbeau n'obéit pas.\"\n\n#. Key:\tFFB203D94B0A5C22BA29B68A1A8A740F\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_9.SpeechSequence(8).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_9.SpeechSequence(8).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Farewell then.\"\nmsgstr \"Adieu donc.\"\n\n#. Key:\t0C459FB64505D02011822A9EDFA8FCA4\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/AGStatue.AGStatue:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/AGStatue.AGStatue:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_AGStatue\"\nmsgid \"'We are the elite of the Runic Realm. Our wisdom is great, our magic is strong.'\"\nmsgstr \"'Nous sommes l'élite du Royaume Runique. Notre sagesse est grande, notre magie est forte.'\"\n\n#. Key:\t7DB580C64E9B33FD525DDF986BD5E4A4\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/AGStatue.AGStatue:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/AGStatue.AGStatue:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_AGStatue\"\nmsgid \"Looks like he was wrong...\"\nmsgstr \"On dirait qu'il avait tort...\"\n\n#. Key:\tAFBD86084D8E6EBDF240998FA98D184D\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/AGStatue.AGStatue:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/AGStatue.AGStatue:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_AGStatue\"\nmsgid \"'We are Ceruleans! We do not escape!'\"\nmsgstr \"'Nous sommes des Céruléens ! Nous ne nous échappons pas !'\"\n\n#. Key:\tC2CC8EE94954A8DC42222FBB28A7656E\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/AGStatue.AGStatue:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/AGStatue.AGStatue:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_AGStatue\"\nmsgid \"'Citizens of Cerulean! Do not join the poor of Grey Gate!'\"\nmsgstr \"'Citoyens Céruléens ! Ne vous joignez pas aux pauvres de la Porte Grise !'\"\n\n#. Key:\tD909E4A34387B448378464BDE8292B4D\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/AGStatue.AGStatue:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/AGStatue.AGStatue:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_AGStatue\"\nmsgid \"'Ruin can’t harm us!'\"\nmsgstr \"'La Ruine ne peut pas nous nuire !'\"\n\n#. Key:\t3CE243AA4AFB12B37239608C66537764\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/BeforeBoss.BeforeBoss:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/BeforeBoss.BeforeBoss:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_BeforeBoss\"\nmsgid \"Maybe you should talk to the gnome or the Keeper.\"\nmsgstr \"Vous devriez peut-être parler au gnome ou au Gardien.\"\n\n#. Key:\t4F35F4834FBCC04C218A879123EF8706\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/BeforeBoss.BeforeBoss:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/BeforeBoss.BeforeBoss:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_BeforeBoss\"\nmsgid \"Using the portals here one could get into any part of the World in no time.\"\nmsgstr \"En utilisant les portails ici, on peut accéder à n'importe quelle partie du Monde en un rien de temps.\"\n\n#. Key:\t62EDCB724DAC5317C72B99AEB9904F4E\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/BeforeBoss.BeforeBoss:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/BeforeBoss.BeforeBoss:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_BeforeBoss\"\nmsgid \"This place was the base of the formal Ruined Realm.\"\nmsgstr \"Cet endroit était la base du Royaume en Ruines traditionnel.\"\n\n#. Key:\tCB8B47F74583A48529A353B97C4909B9\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/BeforeBoss.BeforeBoss:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/BeforeBoss.BeforeBoss:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_BeforeBoss\"\nmsgid \"I hope at least some of the portals still work.\"\nmsgstr \"J'espère qu'au moins certains des portails fonctionnent encore.\"\n\n#. Key:\t2A9CE8714E7E1ABC9365E5A1E2CE2EC8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/BossArmourWrath.BossArmourWrath:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Chapter2/BossArmourWrath.BossArmourWrath:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_BossArmourWrath\"\nmsgid \"Keep away from my artefact little thief or I will crush you!\"\nmsgstr \"Ne t'approche pas de mon artefact, petit voleur, ou je t'écrase !\"\n\n#. Key:\t3F79029C410F4CC3B41548A26A7D69EB\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/BossArmourWrath.BossArmourWrath:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Chapter2/BossArmourWrath.BossArmourWrath:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_BossArmourWrath\"\nmsgid \"Listen, I really need that. What if I give you something instead?\"\nmsgstr \"J'ai vraiment besoin de ça. Et si je vous donnais quelque chose à la place ?\"\n\n#. Key:\t451F1E844E29E674899BD3BEFBC17380\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/BossArmourWrath.BossArmourWrath:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter2/BossArmourWrath.BossArmourWrath:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_BossArmourWrath\"\nmsgid \"I’m here for the artefact... could you give it to me?\"\nmsgstr \"Je suis ici pour l'artefact... pouvez-vous me le donner ?\"\n\n#. Key:\tAC11C22040909F7F4DD1518AD5C14AFA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/BossArmourWrath.BossArmourWrath:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Chapter2/BossArmourWrath.BossArmourWrath:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_BossArmourWrath\"\nmsgid \"That is mine!\"\nmsgstr \"C'est le mien !\"\n\n#. Key:\tD30E184A406B5B1EFB87F3845CE82664\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/BossArmourWrath.BossArmourWrath:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter2/BossArmourWrath.BossArmourWrath:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_BossArmourWrath\"\nmsgid \"Have you come to worship my perfection?\"\nmsgstr \"Êtes-vous venus vénérer ma perfection ?\"\n\n#. Key:\tF626219F434EECD05727BC9FAB5CEB76\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/BossArmourWrath.BossArmourWrath:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Chapter2/BossArmourWrath.BossArmourWrath:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_BossArmourWrath\"\nmsgid \"Damn you and your perfection!\"\nmsgstr \"Soyez maudits, vous et votre perfection !\"\n\n#. Key:\t2892C4AB4DACCAF48565619948DCA122\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/BossDwarvenStatue.BossDwarvenStatue:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter2/BossDwarvenStatue.BossDwarvenStatue:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_BossDwarvenStatue\"\nmsgid \"I am all right! I am still keeping it back!\"\nmsgstr \"Je vais bien ! Je le retiens toujours !\"\n\n#. Key:\t378D26B144B4B17F23F788B56F714118\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/BossDwarvenStatue.BossDwarvenStatue:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Chapter2/BossDwarvenStatue.BossDwarvenStatue:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_BossDwarvenStatue\"\nmsgid \"I am looking for an artefact...\"\nmsgstr \"Je suis à la recherche d'un artefact...\"\n\n#. Key:\t3956257F405EC80CE4547FBE57C53A11\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/BossDwarvenStatue.BossDwarvenStatue:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Chapter2/BossDwarvenStatue.BossDwarvenStatue:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_BossDwarvenStatue\"\nmsgid \"Do you...\"\nmsgstr \"Est-ce que vous...\"\n\n#. Key:\t946CFCCE4CA505C7C4039A9FF196A35C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/BossDwarvenStatue.BossDwarvenStatue:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter2/BossDwarvenStatue.BossDwarvenStatue:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_BossDwarvenStatue\"\nmsgid \"Have the sculptors sent you?\"\nmsgstr \"Les sculpteurs vous envoient ?\"\n\n#. Key:\tA30FB80548251020E4AD859A928AB6B5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/BossDwarvenStatue.BossDwarvenStatue:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Chapter2/BossDwarvenStatue.BossDwarvenStatue:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_BossDwarvenStatue\"\nmsgid \"Go away! I hold it back!\"\nmsgstr \"Partez ! Je le retiens !\"\n\n#. Key:\tAC5220964331387202C55584104246C2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/BossDwarvenStatue.BossDwarvenStatue:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Chapter2/BossDwarvenStatue.BossDwarvenStatue:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_BossDwarvenStatue\"\nmsgid \"I have a bad feeling about this...\"\nmsgstr \"J'ai un mauvais pressentiment à ce sujet...\"\n\n#. Key:\tE05C384043C6F8407BDA2D97A1D64F96\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/BossDwarvenStatue.BossDwarvenStatue:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Chapter2/BossDwarvenStatue.BossDwarvenStatue:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_BossDwarvenStatue\"\nmsgid \"He has one of the artefacts. You need to get it somehow.\"\nmsgstr \"Il possède l'un des objets. Vous devez l'obtenir d'une manière ou d'une autre.\"\n\n#. Key:\tF9B8F4E9413785B5F59DD88CBF8D56CC\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/BossDwarvenStatue.BossDwarvenStatue:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Chapter2/BossDwarvenStatue.BossDwarvenStatue:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_BossDwarvenStatue\"\nmsgid \"Don’t come any closer! I’m still fine!\"\nmsgstr \"N'approchez pas ! Je vais toujours bien !\"\n\n#. Key:\t49D7B5DA484C712573AE84B3A2609541\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/BossFallenDruid.BossFallenDruid:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Chapter2/BossFallenDruid.BossFallenDruid:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_BossFallenDruid\"\nmsgid \"You will never lay your hand on anything in this place!\"\nmsgstr \"Vous ne mettrez jamais la main sur quoi que ce soit dans cet endroit !\"\n\n#. Key:\t9642DD9241E67544571A5EABA9EBC42B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/BossFallenDruid.BossFallenDruid:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter2/BossFallenDruid.BossFallenDruid:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_BossFallenDruid\"\nmsgid \"Actually I’m about to leave but I need the artefact first.\"\nmsgstr \"En fait, je suis sur le point de partir mais j'ai besoin de l'artefact d'abord.\"\n\n#. Key:\t9A2BE08D4010C4D2425F96BA17A60936\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/BossFallenDruid.BossFallenDruid:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Chapter2/BossFallenDruid.BossFallenDruid:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_BossFallenDruid\"\nmsgid \"I shall purge my forest from your kind! To hell with you creature!\"\nmsgstr \"Je vais purger ma forêt de votre espèce ! Allez au diable, créature !\"\n\n#. Key:\tFC4A1C9748C31BD2AA2E4F93E5D56AF8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/BossFallenDruid.BossFallenDruid:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter2/BossFallenDruid.BossFallenDruid:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_BossFallenDruid\"\nmsgid \"Stay away from my sacred forests creature of Ruin!\"\nmsgstr \"Restez loin de mes forêts sacrées, créature de la Ruine !\"\n\n#. Key:\t3F4302BF46D1F9EA241446A796CE6AA5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Fishy.C3Fishy:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter3/C3Fishy.C3Fishy:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_C3Fishy\"\nmsgid \"Fishy will miss home.\"\nmsgstr \"La maison manquera à Poiscaille.\"\n\n#. Key:\t52063C724F858E16B1E9B482E064B3FC\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Fishy.C3Fishy:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/Chapter3/C3Fishy.C3Fishy:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_C3Fishy\"\nmsgid \"Raven will try to take us into the Human Realm.\"\nmsgstr \"Corbeau va essayer de nous faire entrer dans le monde des humains.\"\n\n#. Key:\tBC79FC4E44CCD0BE44BAAAA5ED304C9D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3GateKeeper.C3GateKeeper:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Chapter3/C3GateKeeper.C3GateKeeper:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_C3GateKeeper\"\nmsgid \"I hope you will find us Worthy.\"\nmsgstr \"J'espère que vous nous trouverez Dignes.\"\n\n#. Key:\tDD8DEA6B4E1D6AABEB6B0483614A41BB\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3GateKeeper.C3GateKeeper:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter3/C3GateKeeper.C3GateKeeper:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_C3GateKeeper\"\nmsgid \"Welcome, my young Lord!\"\nmsgstr \"Bienvenue, mon jeune Seigneur !\"\n\n#. Key:\tFCC28D1C4A19B1964301B388625A722F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3GateKeeper.C3GateKeeper:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter3/C3GateKeeper.C3GateKeeper:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_C3GateKeeper\"\nmsgid \"I heard this time you shall open a Gate for us.\"\nmsgstr \"J'ai entendu dire que cette fois, vous nous ouvrirez une Porte.\"\n\n#. Key:\t1F96C2364594513AB8DF00A8C11ADB2C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Gnory.C3Gnory:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Chapter3/C3Gnory.C3Gnory:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_C3Gnory\"\nmsgid \"I don’t want anything bad for business in the new Realm.\"\nmsgstr \"Je ne souhaite rien de mauvais pour les affaires dans le nouveau Royaume.\"\n\n#. Key:\t24FA4B6840C3EEF0A9D418AED7C900A5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Gnory.C3Gnory:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/Chapter3/C3Gnory.C3Gnory:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_C3Gnory\"\nmsgid \"Eh, you again?\"\nmsgstr \"Eh, encore vous ?\"\n\n#. Key:\t5CA8478D46ED1ADF6F0B5E82F1035ADE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Gnory.C3Gnory:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter3/C3Gnory.C3Gnory:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_C3Gnory\"\nmsgid \"A whole new World awaits for me and my shop.\"\nmsgstr \"Un tout nouveau Monde nous attend, moi et ma boutique.\"\n\n#. Key:\tA406AFAD47000D9338C978B2EB16A86F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Gnory.C3Gnory:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Chapter3/C3Gnory.C3Gnory:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_C3Gnory\"\nmsgid \"If you can arrange it I would be more happy if we could leave Lory here.\"\nmsgstr \"Si vous pouvez arranger cela, je serais plus heureux si nous pouvions laisser Lory ici.\"\n\n#. Key:\tBA4D0C244931E6431FA17CA2257BDDE1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Gnory.C3Gnory:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter3/C3Gnory.C3Gnory:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_C3Gnory\"\nmsgid \"What a new opportunity! I don’t care about dwarves anymore.\"\nmsgstr \"Quelle nouvelle opportunité ! Je ne me soucie plus des nains.\"\n\n#. Key:\t071AC5EE4AC65F5BE3CB61B64DE9E7FE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3GolemMaker.C3GolemMaker:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter3/C3GolemMaker.C3GolemMaker:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_C3GolemMaker\"\nmsgid \"I have to admit Ruin will win in the end.\"\nmsgstr \"Je dois admettre que la Ruine finira par gagner.\"\n\n#. Key:\t18398E3A4C6E72AAE25F24A14596ECD8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3GolemMaker.C3GolemMaker:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter3/C3GolemMaker.C3GolemMaker:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_C3GolemMaker\"\nmsgid \"I fought Ruin for hundreds of years.\"\nmsgstr \"J'ai combattu la Ruine pendant des centaines d'années.\"\n\n#. Key:\t7800D3B64054BCE4A89E8E8E6265776B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3GolemMaker.C3GolemMaker:DlgNode_Speech_117.Text\n#: /Game/SO/Dialogues/Chapter3/C3GolemMaker.C3GolemMaker:DlgNode_Speech_117.Text\nmsgctxt \"Dialogue_C3GolemMaker\"\nmsgid \"I have a bad feeling about this all...\"\nmsgstr \"J'ai un mauvais pressentiment à propos de tout cela...\"\n\n#. Key:\t334B64FA460A74FD99B4F3B9E4BE9E5A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3KoboldChef.C3KoboldChef:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter3/C3KoboldChef.C3KoboldChef:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_C3KoboldChef\"\nmsgid \"So it will be ready anytime now.\"\nmsgstr \"Il sera donc prêt à tout moment maintenant.\"\n\n#. Key:\t5B8874F14160F55182A93EBCF5680173\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3KoboldChef.C3KoboldChef:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter3/C3KoboldChef.C3KoboldChef:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_C3KoboldChef\"\nmsgid \"According to the recipe I need to swirl the ingredients until the end of the World.\"\nmsgstr \"Selon la recette, je dois remuer les ingrédients jusqu'à la fin du Monde.\"\n\n#. Key:\t7DB6ED344E211B7A028C27BFB72750B1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3KoboldChef.C3KoboldChef:DlgNode_Speech_33.Text\n#: /Game/SO/Dialogues/Chapter3/C3KoboldChef.C3KoboldChef:DlgNode_Speech_33.Text\nmsgctxt \"Dialogue_C3KoboldChef\"\nmsgid \"This is a special soup.\"\nmsgstr \"C'est une soupe spéciale.\"\n\n#. Key:\t7D583DB14783DCF7EEE294920F9A1D61\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Lory.C3Lory:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Chapter3/C3Lory.C3Lory:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_C3Lory\"\nmsgid \"Without paying a single gold coin. How sad.\"\nmsgstr \"Sans avoir à payer une seule pièce d'or. Comme c'est triste.\"\n\n#. Key:\t8A26C9B24B810A94FED159B0D69D70D6\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Lory.C3Lory:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter3/C3Lory.C3Lory:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_C3Lory\"\nmsgid \"Hi, my dear Ball!\"\nmsgstr \"Salut, ma chère Balle !\"\n\n#. Key:\t8CF637DC4D66B9BFBE098DA3EA434F27\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Lory.C3Lory:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/Chapter3/C3Lory.C3Lory:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_C3Lory\"\nmsgid \"Unfortunately I can't give you anything in return.\"\nmsgstr \"Malheureusement, je ne peux rien vous donner en retour.\"\n\n#. Key:\t90A13FAC4AA90E98DBEFFA9BB8DEDE80\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Lory.C3Lory:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Chapter3/C3Lory.C3Lory:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_C3Lory\"\nmsgid \"Oh, thank you! Books always matter.\"\nmsgstr \"Oh, merci ! Les livres ont toujours de l'importance.\"\n\n#. Key:\t9C6E843645F86F1E39E6458952C7F283\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Lory.C3Lory:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Chapter3/C3Lory.C3Lory:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_C3Lory\"\nmsgid \"I hope I can open a new shop in the Human Realm.\"\nmsgstr \"J'espère pouvoir ouvrir un nouveau magasin dans le Royaume des Hommes.\"\n\n#. Key:\tAE354F2C458C144C2825028174F91CCE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Lory.C3Lory:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Chapter3/C3Lory.C3Lory:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_C3Lory\"\nmsgid \"I don't know if it still matters but I have these books for you.\"\nmsgstr \"Je ne sais pas si c'est encore important, mais j'ai ces livres pour vous.\"\n\n#. Key:\tB5BCB95E43DB3854273F6AAA4067FC55\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Lory.C3Lory:DlgNode_Speech_42.Text\n#: /Game/SO/Dialogues/Chapter3/C3Lory.C3Lory:DlgNode_Speech_42.Text\nmsgctxt \"Dialogue_C3Lory\"\nmsgid \"Unfortunately I have nothing at the store right now. Ha-ha...\"\nmsgstr \"Malheureusement, je n'ai rien en stock en ce moment. Ha-ha...\"\n\n#. Key:\tC0E84ACD40CB002E0C30A289E0554EE9\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Lory.C3Lory:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/Chapter3/C3Lory.C3Lory:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_C3Lory\"\nmsgid \"No problem.\"\nmsgstr \"Pas de problème.\"\n\n#. Key:\tFEFF93C84CC75D277EC221AD22338A75\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Lory.C3Lory:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter3/C3Lory.C3Lory:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_C3Lory\"\nmsgid \"Ruin took all my wares.\"\nmsgstr \"La Ruine a pris toutes mes marchandises.\"\n\n#. Key:\t090F12534A0096B8D4D7D9A5CDC9B3B5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_25.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_25.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Well I guess you don’t have many customer.\"\nmsgstr \"Eh bien, je suppose que vous n'avez pas beaucoup de clients.\"\n\n#. Key:\t10A1CF314EC02954FF38F1989C61DEE9\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"That’s only one man! I need three!\"\nmsgstr \"Ce n'est qu'un seul homme ! Il m'en faut trois !\"\n\n#. Key:\t127DE2E049C91112F814C69348954F99\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_7.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_7.Children(1).Children.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Buy name\"\nmsgstr \"Acheter un nom\"\n\n#. Key:\t1AF2DDE74542524EEF19CA9567CFBDAF\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_58.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_58.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"{name}? It still sounds a bit weird, but I think I might like it.\"\nmsgstr \"{name}? Cela semble encore un peu bizarre, mais je pense que cela pourrait me plaire.\"\n\n#. Key:\t1C411E31405F157B2465229ECE66F4E0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_31.Children(2).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_31.Children(2).Children.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Wanderer\"\nmsgstr \"Vagabond\"\n\n#. Key:\t1ED747BD43E40D4096809696951517EE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"A special offer for ya! Give me three Blue Gems and I’ll give ya the key!\"\nmsgstr \"Une offre spéciale pour vous ! Donnez-moi trois Gemmes Bleues et je vous donnerai la clé !\"\n\n#. Key:\t20B146B94D2E2FCE5E0C48BC64F7A1D6\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_19.Text\n#. Key:\t41E21D044B53E16C1BA8D7B720D84B50\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_36.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_36.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Sure man!\"\nmsgstr \"Bien sûr !\"\n\n#. Key:\t2BDF52EF43CA5FBB145EC1BA0014FC27\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_7.Children(3).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_7.Children(3).Children.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Who are you?\"\nmsgstr \"Qui êtes-vous ?\"\n\n#. Key:\t2DF772F14AAA9780F4D9E397DE723665\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_32.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_32.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Fearsome! At least for what you will destroy.\"\nmsgstr \"C'est effrayant ! Au moins pour ce que vous allez détruire.\"\n\n#. Key:\t312F26294ECE4F618D88BE84DE7A2F9A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_31.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_31.Children(1).Children.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Destroyer\"\nmsgstr \"Destructeur\"\n\n#. Key:\t328C9911427AA19B40B297ACC9D16447\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_31.Children(3).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_31.Children(3).Children.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Don't buy\"\nmsgstr \"Ne pas acheter\"\n\n#. Key:\t32D3F53746DD2801BC1B04AF1C1753DD\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Don’t turn around I’m talking to ya big guy! Down here on the wood!\"\nmsgstr \"Ne te retourne pas, je te parle, mon grand ! Ici, sur le bois !\"\n\n#. Key:\t576A3CE049331518C8D1F196E6CC382C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Back on topic: will ya buy something?\"\nmsgstr \"Revenons au sujet : achèterez-vous quelque chose ?\"\n\n#. Key:\t5C1E07DF4B2D135102D6B09D3A04A726\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"C’mon man! Don’t just stand there tell me what ya want!\"\nmsgstr \"Allez, mec ! Ne reste pas planté là, dis-moi ce que tu veux !\"\n\n#. Key:\t62AA5DD54A8447F7A277B194B05FB74D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_23.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_23.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"What’s wrong with ya man?\"\nmsgstr \"Qu'est-ce qui ne va pas chez toi ?\"\n\n#. Key:\t6E13F5544C66EDB0CFE764A0F52269E1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_27.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_27.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"You know transporting breadcrumbs, marching onto various directions, the usual things.\"\nmsgstr \"Vous savez, transporter des miettes de pain, marcher dans différentes directions, les choses habituelles.\"\n\n#. Key:\t6F3C17894E694FC6215871B167087908\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_24.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_24.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"I’m Merch Ant doin’ Microtransactions. I’ve just told ya.\"\nmsgstr \"Je suis la Fourmi Marchande et je fais des microtransactions. Je viens de vous le dire.\"\n\n#. Key:\t7169B2FA40F5F5F328D2A6B9D53D58C8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_7.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_7.Children(0).Children.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Trade\"\nmsgstr \"Commercer\"\n\n#. Key:\t7B41C105431C54F2FDDEA6AA9A0E1C1A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Er... so who are you and what are you doing here?\"\nmsgstr \"Euh... alors qui êtes-vous et que faites-vous ici ?\"\n\n#. Key:\t8718A8F54D5722F666D83F8067476622\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"There is an iron door which blocks the path to the tower. Do you have something which opens it?\"\nmsgstr \"Il y a une porte en fer qui bloque le chemin vers la tour. Avez-vous quelque chose qui l'ouvre ?\"\n\n#. Key:\t889B39EC4BC170A2BF493380947116A7\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Sure man! Microtransactions always work!\"\nmsgstr \"Bien sûr ! Les microtransactions fonctionnent toujours !\"\n\n#. Key:\t9157AE9644A4A3B2C97F7482932160D2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"No man, we agreed on three!\"\nmsgstr \"Non, on s'était mis d'accord sur trois !\"\n\n#. Key:\t9283F6B1447C6992FE355289F3337472\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_7.Children(2).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_7.Children(2).Children.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Gate\"\nmsgstr \"Porte\"\n\n#. Key:\t99C44AA849A384C7941D3DAE1D6A3EFF\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Here is your Gem!\"\nmsgstr \"Voici votre Gemme !\"\n\n#. Key:\t9CA7941F42ABFAE5660895AF886CD62C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_31.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_31.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Sure man! I have some really cool ones for sale!\"\nmsgstr \"Bien sûr ! J'en ai des vraiment cool à vendre !\"\n\n#. Key:\tA3C6B03E404B1C039EF1C98C8E28AE22\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Show me what you've got for sale!\"\nmsgstr \"Montrez-moi ce que vous avez à vendre !\"\n\n#. Key:\tABE279924E0641DA18E9708F35F4500A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_29.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_29.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"I’ve got to go.\"\nmsgstr \"Je dois y aller.\"\n\n#. Key:\tAF1FECDB402777D850B819B934DF851D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_34.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_34.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Ah, never mind, here you go!\"\nmsgstr \"Ah, peu importe, voilà !\"\n\n#. Key:\tB19FA067432CE0273A3652AA9A32F2DF\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Don’t be surprised!\"\nmsgstr \"Ne soyez pas surpris !\"\n\n#. Key:\tB5F8E17E4712A37EF1C227AA7E99DBC8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Aren’t two Gems enough for you?\"\nmsgstr \"Deux Gemmes ne vous suffisent-elles pas ?\"\n\n#. Key:\tBC5DEE9E4D39238451D1A2B9F8B20815\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_26.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_26.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Okey, okey! I have to admit I also do some regular ant work from time to time.\"\nmsgstr \"D'accord, d'accord ! Je dois admettre que je fais aussi un travail de fourmi de temps en temps.\"\n\n#. Key:\tBD7096344553E098E4A29787E1386B4A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Are you sure the key works?\"\nmsgstr \"Êtes-vous sûr que la clé fonctionne ?\"\n\n#. Key:\tC6A384624B53D808D62CB885A6573150\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Was nice to deal with ya!\"\nmsgstr \"C'était sympa de traiter avec vous !\"\n\n#. Key:\tC737154043396F726CF6B2814991B38D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_35.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_35.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"I've changed my mind. I'm fine with my current name.\"\nmsgstr \"J'ai changé d'avis. Mon nom actuel me convient.\"\n\n#. Key:\tC94F33504E68364DE1BAA48FC0CA85E5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_7.Children(5).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_7.Children(5).Children.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Leave\"\nmsgstr \"Partir\"\n\n#. Key:\tCDA5A0164F5FDD87D0F4C0B10A5ED5DA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"I did my part. Give me the key!\"\nmsgstr \"J'ai fait ma part. Donnez-moi la clé !\"\n\n#. Key:\tD1B1D33742EAA6A9BCDC42B5EA72EB59\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_31.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_31.Children(0).Children.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Saviour\"\nmsgstr \"Sauveur\"\n\n#. Key:\tD1E444764EDA1457DD7427A0EA75C65F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_7.Children(4).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_7.Children(4).Children.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Blue Gem\"\nmsgstr \"Gemme Bleue\"\n\n#. Key:\tD65AD8854E1A5BC2D37C208357BACDE3\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Due to my size!\"\nmsgstr \"En raison de ma taille !\"\n\n#. Key:\tDDEB5C4B4A180E85B1D711815B4D32F3\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Can I buy a name from you?\"\nmsgstr \"Puis-je vous acheter un nom ?\"\n\n#. Key:\tDE3F40384473EC97950CDDB43AFE439E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Easy man! Here ya go!\"\nmsgstr \"Doucement, mec ! Et voilà !\"\n\n#. Key:\tDEED1AF94E4BC154ED98A8B951AF0673\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Hey again!\"\nmsgstr \"Rebonjour !\"\n\n#. Key:\tE2C88DA74DA8B5935E15CC9FD337C307\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_39.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_39.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Come on man! You can't just wander around!\"\nmsgstr \"Allez, mec ! Vous ne pouvez pas vous balader comme ça !\"\n\n#. Key:\tEA08DE334C7D8631989D159FB841367D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_30.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_30.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"See ya man!\"\nmsgstr \"A plus tard !\"\n\n#. Key:\tEAB8C1DE4B07AD7EAF0A4B819E4522C6\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Hey there!\"\nmsgstr \"Hé là !\"\n\n#. Key:\tF780C72E4DDD9D9189C900836D4F7DBD\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"I’m Merch Ant, I deal with microtransactions.\"\nmsgstr \"Je suis la Fourmi Marchande, je m'occupe des microtransactions.\"\n\n#. Key:\tFED676B745409B7095EBB2994E581817\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_57.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_57.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"That's cool man. Though I wonder who will you save?\"\nmsgstr \"C'est cool, mec. Bien que je me demande qui vous allez sauver ?\"\n\n#. Key:\t04F1EF4B4AFDE5759A25A1A4922E9EA8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"Yet they could do nothing.\"\nmsgstr \"Pourtant, ils ne pouvaient rien faire.\"\n\n#. Key:\t05E7A2224316FEED1A2CEB8AEFC46B41\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"We can’t let everyone die here.\"\nmsgstr \"On ne peut pas laisser tout le monde mourir ici.\"\n\n#. Key:\t078A48C347E2B23E79C495BA42BC7B6D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_25.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_25.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"We’ll have time to find a cure.\"\nmsgstr \"Nous aurons le temps de trouver un remède.\"\n\n#. Key:\t0A857169478EC6929EFCA3B390C394DA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"Prepare for your last travel in the Ruined Realm. Head to the north from where the wind is blowing!\"\nmsgstr \"Préparez-vous pour votre dernier voyage dans le Royaume en ruines. Dirigez-vous vers le nord d'où souffle le vent !\"\n\n#. Key:\t1D8B6C81428A6D9F4C29AE9AD26206F2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_29.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_29.Children(1).Children.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"Can't leave them\"\nmsgstr \"On ne peut pas les laisser\"\n\n#. Key:\t217F39F14762862B6EA18484EA74E987\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_37.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_37.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"I wish you better luck this time!\"\nmsgstr \"Je vous souhaite bonne chance cette fois-ci !\"\n\n#. Key:\t22E17F2F4CFDD0CEB67AB0A91D872B3F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_4.Children(2).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_4.Children(2).Children.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"Not my problem\"\nmsgstr \"Ce n'est pas mon problème\"\n\n#. Key:\t2685CE674BB3B11FD3CB3AA2460CE60A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"There is nothing we can do for this World.\"\nmsgstr \"Il n'y a rien que nous puissions faire pour ce Monde.\"\n\n#. Key:\t26A2075F407FF43E1AF8B6B38E9C4AEE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"Farewell!\"\nmsgstr \"Adieu !\"\n\n#. Key:\t2F7D7C46418E8E049493839A26DBB10E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"I’m ready to sacrifice myself but I feel sorrow for this world.\"\nmsgstr \"Je suis prêt à me sacrifier, mais j'éprouve de la peine pour ce monde.\"\n\n#. Key:\t39172C7641A5973A4B5D8480EBDD2589\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_34.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_34.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"Back already?\"\nmsgstr \"Déjà de retour ?\"\n\n#. Key:\t3D21436E48DA0DF9C3ACA3B11001B17C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"Yet, we need to save those we can.\"\nmsgstr \"Pourtant, nous devons sauver ceux que nous pouvons.\"\n\n#. Key:\t43B780AA4934FBE35679BFB3C1C92D56\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"Farewell Wanderer!\"\nmsgstr \"Adieu Vagabond !\"\n\n#. Key:\t4AD4171F4A1832148034BAA736FC587E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"Head to the north from where the wind is blowing!\"\nmsgstr \"Dirigez-vous vers le nord d'où souffle le vent !\"\n\n#. Key:\t4E65707F497B4B35E873138DDBF7B879\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"I will go home and you will solve your problems on your own.\"\nmsgstr \"Je vais rentrer chez moi et vous allez résoudre vos problèmes tout seul.\"\n\n#. Key:\t4EDA1AEF471537F758DD0491A7140073\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"This is none of my business.\"\nmsgstr \"Ce ne sont pas mes affaires.\"\n\n#. Key:\t58246AA446D982E55E53EAB34FFF6A81\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_34.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_34.Children(1).Children.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"Leave\"\nmsgstr \"Partir\"\n\n#. Key:\t67CB3C99468EEA39C4C18C8B0C28AFEA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_26.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_26.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"You? You mean the Wizard Council?\"\nmsgstr \"Vous ? Vous voulez dire le Conseil des Magiciens ?\"\n\n#. Key:\t743DD4C048F8CD08A49805975183B54D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"I’m sorry it ends like this, Wanderer.\"\nmsgstr \"Je suis désolé que ça se termine ainsi, Vagabond.\"\n\n#. Key:\t7AB88DE549E213B71759699AD51CFD4C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"I’m really proud of you little spirit. This wasn’t an easy decision for me either.\"\nmsgstr \"Je suis vraiment fier de ton petit esprit. Ce n'était pas une décision facile pour moi non plus.\"\n\n#. Key:\t7DCF30E74F8C0F29DA4E668CE3435E89\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"Wizard can’t hear us here, we can talk freely.\"\nmsgstr \"Le Magicien ne peut pas nous entendre ici, nous pouvons parler librement.\"\n\n#. Key:\t8177A07D41AE7778BB4839AED3FEDACF\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_23.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_23.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"Do you know what you are risking?\"\nmsgstr \"Savez-vous ce que vous risquez ?\"\n\n#. Key:\t876B4752465406828E27A88C282EA5CD\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"From here I can teleport you close to the place where the Wizard will be able to get you out.\"\nmsgstr \"De là, je peux vous téléporter près de l'endroit où le Magicien pourra vous faire sortir.\"\n\n#. Key:\t9255CAD841A0C5B4DF3F4D8C5F5516B1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"So many great things will perish. So many...\"\nmsgstr \"Tant de grandes choses vont périr. Tant de...\"\n\n#. Key:\t95EDE8FB4CEC490381EBD990C7277009\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_38.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_38.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"Take your time!\"\nmsgstr \"Prenez votre temps !\"\n\n#. Key:\t9D46888D43C665A29506BF9CBB62F81D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_35.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_35.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"Let me try again!\"\nmsgstr \"Laissez-moi essayer à nouveau !\"\n\n#. Key:\tA1CF649542AAE3D8945327B9502E2E78\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_29.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_29.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"What chance do the humans have?\"\nmsgstr \"Quelles sont les chances des humains ?\"\n\n#. Key:\tA60B94F64A0D02EA0DA9419741ED84F4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_36.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_36.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"I just need some rest.\"\nmsgstr \"J'ai juste besoin de repos.\"\n\n#. Key:\tA651056C4D344D685FEB53B2C3795966\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_34.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_34.Children(0).Children.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"Retry\"\nmsgstr \"Recommencer\"\n\n#. Key:\tAAE7046349DBE5359097179A42FDA255\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_33.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_33.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"This one was enough.\"\nmsgstr \"Celui-ci était suffisant.\"\n\n#. Key:\tB17D67194997EFAEF6B8678DB05894FD\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"Let’s get them out first and face Ruin after.\"\nmsgstr \"Faisons les sortir d'abord et faisons face à la Ruine ensuite.\"\n\n#. Key:\tB4E31022471B52056F7B5AA3BB322700\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"How can I get to the Wizard’s tower?\"\nmsgstr \"Comment puis-je me rendre à la tour du Magicien ?\"\n\n#. Key:\tB6C99FC54E2A347994473EBF52B57EBD\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_4.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_4.Children(1).Children.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"Raven’s plan\"\nmsgstr \"Le plan de Corbeau\"\n\n#. Key:\tB985955E4FC6D81FBD38D79ADE68BF1F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_4.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_4.Children(0).Children.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"Separate Worlds\"\nmsgstr \"Mondes Distincts\"\n\n#. Key:\tC4BABAED4C790EDDF6AAF7A0D4CFA79B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_27.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_27.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"When Ruin started in the Runic Realm they had hundreds of Scientists who studied the force which made Ruin.\"\nmsgstr \"Lorsque la Ruine a démarré dans le Royaume Runique, des centaines de scientifiques ont étudié la force ayant provoqué la Ruine.\"\n\n#. Key:\tCB779F524992B29781C4778ED6E224A7\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_30.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_30.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"I just can’t leave them to die here...\"\nmsgstr \"Je ne peux pas les laisser mourir ici...\"\n\n#. Key:\tCDA7A09249E96A52B2FA3CA471D6C4B3\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"This is the end of the path where we last meet.\"\nmsgstr \"C'est la fin du chemin où nous nous sommes rencontrés pour la dernière fois.\"\n\n#. Key:\tCF238FAA4941848AF7071A866B75B6EC\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"You are right. The only way to stop Ruin is to lock the Ruined Realm forever.\"\nmsgstr \"Vous avez raison. La seule façon d'arrêter la Ruine est de verrouiller le Royaume en Ruines pour toujours.\"\n\n#. Key:\tD1F3B7324351B25E8C55679BAC3BF1E0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"Have you made your decision?\"\nmsgstr \"Avez-vous pris votre décision ?\"\n\n#. Key:\tE164446B4944B4CAC8E5C1BF82A722A2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_24.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_24.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"If you bring infected people into the Human Realm Ruin will consume them.\"\nmsgstr \"Si vous amenez des personnes infectées dans le Royaume des Hommes, la Ruine les consumera.\"\n\n#. Key:\tE39531DE4350D6D86DF469839F1906E7\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_31.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_31.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"It’s your decision, Wanderer. I understand.\"\nmsgstr \"C'est votre décision, Vagabond. Je comprends.\"\n\n#. Key:\tE46912D04BE67D3E2B0794BB632AEE98\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_32.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_32.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"I’ll stay here. I won’t be able to watch another World dying...\"\nmsgstr \"Je vais rester ici. Je ne pourrai pas regarder un autre Monde mourir...\"\n\n#. Key:\tF70B765F44DB17E1C6978D9D8652C911\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"Hello, little Wanderer!\"\nmsgstr \"Bonjour, petit Vagabond !\"\n\n#. Key:\tFE709EDF4482B6FA7408DE99D95E8577\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_29.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_29.Children(0).Children.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"You are right\"\nmsgstr \"Vous avez raison\"\n\n#. Key:\tFE77F7964851F202F5C91396A4C7228E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"I’ll take you to the place where you can leave this Realm.\"\nmsgstr \"Je vous emmènerai à l'endroit où vous pourrez quitter ce Royaume.\"\n\n#. Key:\t0B886754483D1C215FBEF5B7D19AF6A6\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"I know you have summoned a Spirit of the Unknown world. You were a fool to think you can get away with this.\"\nmsgstr \"Je sais que vous avez invoqué un Esprit du Monde Inconnu. Vous avez été idiot de penser que vous pouviez vous en tirer comme ça.\"\n\n#. Key:\t0BDF59D34A9E53B7FD5FD18F8E46F72F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"Argh! All right, here you go...\"\nmsgstr \"Argh ! Très bien, voilà...\"\n\n#. Key:\t2A6837CA471604FCDD180E85BD23D676\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"Krrr... Raven gives you magic which will make you fly like a Raven.\"\nmsgstr \"Krrr... Corbeau vous donne de la magie qui vous fera voler comme un Corbeau.\"\n\n#. Key:\t2D8209F74AC3C9E042717A9FB108C051\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"Come on, go and try it!\"\nmsgstr \"Allez-y, essayez-le !\"\n\n#. Key:\t39B1763740E9BB9B495A7997920A3401\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_12.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_12.Children(0).Children.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"How?\"\nmsgstr \"Comment ?\"\n\n#. Key:\t3AE553D14FFB88C0518679B86691D508\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"Call your master little spirit, I have words with him.\"\nmsgstr \"Appelle ton petit esprit de maître, j'ai des choses à lui dire.\"\n\n#. Key:\t3E02111D40F21C2C8C13F08729B4CDBC\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"I don’t know about any rule forbidding that...\"\nmsgstr \"Je ne connais aucune règle interdisant cela...\"\n\n#. Key:\t453610F144D8CEB42138F0BB35B9692A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"Wait Scholar! Please give me a few more days!\"\nmsgstr \"Attendez Étudiant ! Donnez-moi quelques jours de plus, s'il vous plaît !\"\n\n#. Key:\t4F0C40114C4DD1B345CF909E94F99D60\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"Why should I ask that?\"\nmsgstr \"Pourquoi devrais-je poser cette question ?\"\n\n#. Key:\t56F0D93740AB7555FF9370879D774842\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"I have no doubt how the Council will react.\"\nmsgstr \"Je ne doute pas de la réaction du Conseil.\"\n\n#. Key:\t60D3A9DA420ECD7DBF490BA233EA5C61\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"Because you would love to know how you can get out of here.\"\nmsgstr \"Parce que vous aimeriez savoir comment vous pouvez sortir d'ici.\"\n\n#. Key:\t6125A956446F64BD91E1F5A282AC146D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"Don’t worry! I know your daughter is trapped in the Unknown and my research confirms there is a chance you can bring her back.\\r\\nI’ll help you bring the missing artefacts back.\"\nmsgstr \"Ne vous inquiétez pas ! Je sais que votre fille est piégée dans l'inconnu et mes recherches confirment qu'il y a une chance que vous puissiez la ramener.\\nJe vous aiderai à ramener les artefacts manquants.\"\n\n#. Key:\t6B7478444FBC694480D442BB90F70B27\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"What do you want?\"\nmsgstr \"Que voulez-vous ?\"\n\n#. Key:\t72D7F64D4051F9BF362B9B97FD30DB65\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_12.Children(2).Children.Text\n#. Key:\tF62125FB48F982D2A3D4FE9621810F64\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_12.Children(2).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"What?\"\nmsgstr \"Quoi ?\"\n\n#. Key:\t810BD4154FA6BC7F857F9CB14EDC6A1D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"Er... thanks!\"\nmsgstr \"Er... merci !\"\n\n#. Key:\t8F439E124100E004BCCD4AA04F17CB3F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"How will we get out of here?\"\nmsgstr \"Comment allons-nous sortir d'ici ?\"\n\n#. Key:\t9D31A0084CBBA499BA4E3BADB42E6E36\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"Rule? What rule should be needed for something which was thought to be impossible?\"\nmsgstr \"Règle ? Quelle règle devrait être nécessaire pour quelque chose que l'on croyait impossible ?\"\n\n#. Key:\t9F52551E46588D4F12CD7C8B63701FDE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_12.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_12.Children(1).Children.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"Why?\"\nmsgstr \"Pourquoi ?\"\n\n#. Key:\tAAC96E3C4D4D303C9E692390612A7215\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"Ask how we will get out of here!\"\nmsgstr \"Demandez comment nous allons sortir d'ici !\"\n\n#. Key:\tC0808C6545D02F43CB37A2AFB79EEC1F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"Actually it’s not that good but still better than nothing.\"\nmsgstr \"En fait, ce n'est pas si bon, mais c'est quand même mieux que rien.\"\n\n#. Key:\tC19759F44A5A2AE21A04EBAF2A47E2D3\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"Take this!\"\nmsgstr \"Prenez ça !\"\n\n#. Key:\tC8CEB3844A6C958FF42C74AA81D4A90F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"Finally, Raven found you!\"\nmsgstr \"Enfin, Corbeau vous a trouvé !\"\n\n#. Key:\tCF6DEF4D4F6F664CF24435AF248CE452\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"Raven and his fellow Ball on a quest again!\"\nmsgstr \"Corbeau et son compagnon la Balle sont à nouveau en mission !\"\n\n#. Key:\tE52C31F241BCD21378696EB8761C0654\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"Let the masters talk in private and discuss how we will get out of here!\"\nmsgstr \"Laissez les maîtres parler en privé et discuter de la façon dont nous allons sortir d'ici !\"\n\n#. Key:\t00ED8B314FC2DA3901823F92635D41D1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_26.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_26.Children(0).Children.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"You’ll be all dead\"\nmsgstr \"Vous serez tous morts\"\n\n#. Key:\t23BA5AA446B44D107B9F3994ADDE1C43\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_22.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_22.Children(1).Children.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Save them!\"\nmsgstr \"Sauvez-les !\"\n\n#. Key:\t42395E7B4B735458E30557B9544073E3\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_8.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_8.Children(1).Children.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Leave\"\nmsgstr \"Partir\"\n\n#. Key:\t43A5BAA8417D3291E502AD9500873B9E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Rumours have been spread of Ruin and the people are scared. They demand the Wizard Council to separate the Human Realm from the Ruined Realm.\"\nmsgstr \"Des rumeurs ont circulé sur la Ruine et les gens ont peur. Ils demandent au Conseil des Magiciens de séparer le Royaume des Hommes du Royaume en Ruines.\"\n\n#. Key:\t4FAAEE6240849C416541EDA8AB8083C8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_30.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_30.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Good luck, Raven!\"\nmsgstr \"Bonne chance, Corbeau !\"\n\n#. Key:\t559673484F3C66AADE37E787BA35824A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_33.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_33.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Only a fool would bring Ruin to his own World.\"\nmsgstr \"Seul un fou amènerait la Ruine dans son propre Monde.\"\n\n#. Key:\t568124F448BE3AF41123A0B7BB158A53\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Krrrr! Raven and you make a really good team.\"\nmsgstr \"Krrrr ! Corbeau et vous formez une très bonne équipe.\"\n\n#. Key:\t5853B8654DBD91894792DE803DE87271\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_27.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_27.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"You bring back the artefacts to rescue Lillian.\"\nmsgstr \"Vous ramenez les artefacts pour sauver Lillian.\"\n\n#. Key:\t5D71DA8F4134A1AA206F15B7587AA188\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_15.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_15.Children(0).Children.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Break in?\"\nmsgstr \"User de la force ?\"\n\n#. Key:\t6234A9A34854A37E0CA56987FDE81F5A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_26.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_26.Children(1).Children.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"You are right\"\nmsgstr \"Vous avez raison\"\n\n#. Key:\t6B07C6F34DF51DFA23A4278FCBECF303\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"What it will do?\"\nmsgstr \"Que va-t-il faire ?\"\n\n#. Key:\t6E5A51A34AB81094924512B92F25F41C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_32.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_32.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"You are trying to rescue a bunch of mad people so that they can live a few more years with the cost of destroying one more Realm.\"\nmsgstr \"Vous essayez de sauver une bande de fous afin qu'ils puissent vivre quelques années de plus en échange de la destruction d'un Royaume supplémentaire.\"\n\n#. Key:\t70514624400617999FA05FAFAE67D60F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"What happened in the Human Realm?\"\nmsgstr \"Que s'est-il passé dans le Royaume des Hommes ?\"\n\n#. Key:\t71C42D6445782897EAF303BFA2C5C260\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"What will you do? What’s your part in this?\"\nmsgstr \"Que ferez-vous ? Quel est votre rôle dans tout cela ?\"\n\n#. Key:\t728B75824B28856156D207B71017C714\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Things are changing in the Human Realm and Raven has many things to do.\"\nmsgstr \"Les choses changent dans le Royaume des Hommes et Corbeau a beaucoup de choses à faire.\"\n\n#. Key:\t7826765F45BE76393F3636B79BBC24C0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_24.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_24.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"You are right. We need to save them. What’s the plan?\"\nmsgstr \"Vous avez raison. Nous devons les sauver. Quel est le plan ?\"\n\n#. Key:\t866DA22D46D855A200BB7F9E71788367\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_22.Children(0).Children.Text\n#. Key:\tBA0DEBA04BF5C604A2B760B8275E2983\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_23.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_22.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_23.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Is that safe?\"\nmsgstr \"Est-ce sûr ?\"\n\n#. Key:\t86E69EA04F489DC54B48BEBE8B3762BF\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_1.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_1.Children(0).Children.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Agree\"\nmsgstr \"D'accord\"\n\n#. Key:\t8D543992469624098751EAA474848F8C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Soon the Ruined Realm will be over. We cannot save it.\"\nmsgstr \"Bientôt, le Royaume en Ruines sera révolu. Nous ne pouvons pas le sauver.\"\n\n#. Key:\t943679734061A00F4CC99A8BC31078EA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Wizard won’t activate the device for them but some of them are fools enough to try it anyway.\"\nmsgstr \"Le magicien n'activera pas l'appareil pour eux, mais certains sont assez idiots pour l'essayer quand même.\"\n\n#. Key:\t978AEC8B45AC7E6ED3E814AB849CF96A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"So, what now?\"\nmsgstr \"Alors, et maintenant ?\"\n\n#. Key:\t99250A3F4973EBFB5A20A192DF8976AA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"With every day more and more people join their ranks.\"\nmsgstr \"Chaque jour, de plus en plus de personnes rejoignent leurs rangs.\"\n\n#. Key:\t9D81AC2C4900D6DDA6B17CAD7168020C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_31.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_31.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Farewell, compeer!\"\nmsgstr \"Adieu, champion !\"\n\n#. Key:\tA5F24B3747918DB1E38CB98208FD6B1B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_35.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_35.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Or maybe you are wrong.\"\nmsgstr \"Ou peut-être avez-vous tort.\"\n\n#. Key:\tB0ECBFAF4E34AEDE88F1B7B7C7F7CC5B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_8.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_8.Children(0).Children.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"What happened?\"\nmsgstr \"Que s'est-il passé ?\"\n\n#. Key:\tB1D891BF48298C5D4CF7D8957EACDD1B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Raven will gather as many survivors as Raven can.\"\nmsgstr \"Corbeau rassemblera autant de survivants que possible.\"\n\n#. Key:\tB6CF3E424BAEA6EE368D508EEFDD5FF1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_36.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_36.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Farewell compeer! Raven will be on a quest on Raven’s own!\"\nmsgstr \"Adieu champion ! Corbeau sera en quête de son propre destin !\"\n\n#. Key:\tB87509FF4D29C2B3D25CCEB192090963\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"What happens if they break in?\"\nmsgstr \"Que se passe-t-il s'ils entrent par effraction ?\"\n\n#. Key:\tB89F014644B8D3E1754B1B8C796D5858\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_1.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_1.Children(1).Children.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Disagree\"\nmsgstr \"En désaccord\"\n\n#. Key:\tBA14AAD54C3D4F7CF18F5D8560A62637\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Nothing good...\"\nmsgstr \"Rien de bon...\"\n\n#. Key:\tC2E50DCB4E1171342DD931910E42549E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_37.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_37.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Farewell!\"\nmsgstr \"Adieu !\"\n\n#. Key:\tC3B19DAF4C0B491D9236CD99FD7DD603\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Except when you kill me with a laser beam.\"\nmsgstr \"Sauf quand vous me tuez avec un rayon laser.\"\n\n#. Key:\tCBDDFBD14121FE1758B360A1775F2169\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Farewell compeer until you meet Raven again!\"\nmsgstr \"Adieu champion jusqu'à ce que vous rencontriez à nouveau Corbeau !\"\n\n#. Key:\tCD19E0924BB1080025ABA19860F578CE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Somehow they know about the device the Wizard created. They surrounded the Wizard’s tower. Some even tried to break in.\"\nmsgstr \"D'une manière ou d'une autre, ils connaissent le dispositif créé par l'assistant. Ils ont entouré la tour du Magicien. Certains ont même essayé d'y pénétrer.\"\n\n#. Key:\tD54470AA424038F96824FC805AE3F0EE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_25.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_25.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Krrr! For them it’s much safer than staying here when the World is over.\"\nmsgstr \"Krrr ! Pour eux, c'est beaucoup plus sûr que de rester ici quand le monde est fini.\"\n\n#. Key:\tD99400D94457B6779DE59DB94FDBF9D1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"We have really short time to act.\"\nmsgstr \"Nous avons très peu de temps pour agir.\"\n\n#. Key:\tDAEF711B41EC4EF72FC271B5AD98A238\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_26.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_26.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"There are hundreds of survivors. Races that don’t even exist anywhere else! Who are we if we don’t even try to save them?\"\nmsgstr \"Il y a des centaines de survivants. Des races qui n'existent même pas ailleurs ! Qui sommes-nous si nous n'essayons même pas de les sauver ?\"\n\n#. Key:\tDF872D134C82DFDD3F55F4A6FFF59673\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Except...\"\nmsgstr \"Excepté...\"\n\n#. Key:\tE64B8C0048D2D3357B74CD8D7C1B5407\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_34.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_34.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"You sound like that Monk, don’t you? Maybe you are right.\"\nmsgstr \"Vous parlez comme ce Moine, n'est-ce pas ? Vous avez peut-être raison.\"\n\n#. Key:\tEA01FB8248A5F30CF9D95AA292D5466A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"No problem.\"\nmsgstr \"Pas de problème.\"\n\n#. Key:\tF1193DA54FBB289383D56F952818E67E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Raven’s master decided we need to gather every survivor and take them into the Human Realm.\"\nmsgstr \"Le maître de Corbeau a décidé qu'il fallait rassembler tous les survivants et les emmener dans le Royaume des Hommes.\"\n\n#. Key:\tF19792CF477CD543AC05FCBEDA3EA88C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_15.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_15.Children(1).Children.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"To act?\"\nmsgstr \"Pour agir ?\"\n\n#. Key:\tF606FBDF4B7F3DFF9A55BE9CDB186CAC\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Farewell then!\"\nmsgstr \"Adieu donc !\"\n\n#. Key:\tF8FA36BF4E3A4C028FBAF0A2AA531AA4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"You need to go on alone.\"\nmsgstr \"Vous devez continuer seul.\"\n\n#. Key:\tFA02BBA74B601254CDA90A9300AD312F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_29.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_29.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"If all goes well you will meet Raven on the other side.\"\nmsgstr \"Si tout va bien, vous rencontrerez Corbeau de l'autre côté.\"\n\n#. Key:\tFA630952402B081C2D449DA3C091F33E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Yes, we did well. Thanks for the help!\"\nmsgstr \"Oui, nous avons bien fait. Merci pour l'aide !\"\n\n#. Key:\t63338A0644CC3AE62BCC10B56EAAD524\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3SewerCreature.C3SewerCreature:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter3/C3SewerCreature.C3SewerCreature:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_C3SewerCreature\"\nmsgid \"Fear not, everything will be alright!\"\nmsgstr \"N'ayez pas peur, tout ira bien !\"\n\n#. Key:\t2C1EC209404316CE23DC67B6E91AC661\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Statue.C3Statue:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter3/C3Statue.C3Statue:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_C3Statue\"\nmsgid \"Are you ready?\"\nmsgstr \"Êtes-vous prêt ?\"\n\n#. Key:\t33B337C9455FC32BF5C3C69F58843673\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Statue.C3Statue:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Chapter3/C3Statue.C3Statue:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_C3Statue\"\nmsgid \"Will you release me once I get into your tower?\"\nmsgstr \"Me libérerez-vous une fois que j'aurai pénétré dans votre tour ?\"\n\n#. Key:\t4A8AD3EC428307141BD011B66448A7E5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Statue.C3Statue:DlgNode_Speech_2.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Statue.C3Statue:DlgNode_Speech_2.Children(0).Children.Text\nmsgctxt \"Dialogue_C3Statue\"\nmsgid \"Ready\"\nmsgstr \"Prêt\"\n\n#. Key:\t9C5B29DF4784913DFF166BAD07AC1219\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Statue.C3Statue:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Chapter3/C3Statue.C3Statue:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_C3Statue\"\nmsgid \"Hurry! We don’t have much time.\"\nmsgstr \"Dépêchez-vous ! Nous n'avons pas beaucoup de temps.\"\n\n#. Key:\tB640545F41315B4C142083A2DB12A132\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Statue.C3Statue:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Chapter3/C3Statue.C3Statue:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_C3Statue\"\nmsgid \"Sure, we made a deal.\"\nmsgstr \"Bien sûr, nous avons passé un accord.\"\n\n#. Key:\tC4EC98FC40F0181F5AFA60B4DFEF2D16\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Statue.C3Statue:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Chapter3/C3Statue.C3Statue:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_C3Statue\"\nmsgid \"Not yet. I’ll be back...\"\nmsgstr \"Pas encore. Je reviendrai...\"\n\n#. Key:\tCD542C81498F713774D43AB6EF126E32\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Statue.C3Statue:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter3/C3Statue.C3Statue:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_C3Statue\"\nmsgid \"Well done! From here I can take you to my tower.\"\nmsgstr \"Bravo ! D'ici, je peux vous conduire à ma tour.\"\n\n#. Key:\tF982C80748C46B117906F094608B7E2C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Statue.C3Statue:DlgNode_Speech_2.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Statue.C3Statue:DlgNode_Speech_2.Children(1).Children.Text\nmsgctxt \"Dialogue_C3Statue\"\nmsgid \"Stay\"\nmsgstr \"Rester\"\n\n#. Key:\tFE6723D8452B497B07504EA753F02F35\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Statue.C3Statue:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Chapter3/C3Statue.C3Statue:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_C3Statue\"\nmsgid \"Let’s go then!\"\nmsgstr \"Alors, allons-y !\"\n\n#. Key:\t7C2DF1BE46E7672A1C7092A330030B39\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3SupperDwarf.C3SupperDwarf:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter3/C3SupperDwarf.C3SupperDwarf:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_C3SupperDwarf\"\nmsgid \"Otherwise I would rather stay here.\"\nmsgstr \"Sinon, je préfère rester ici.\"\n\n#. Key:\tFEB0911A412AF51088EC6A84D0FC7B3C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3SupperDwarf.C3SupperDwarf:DlgNode_Speech_80.Text\n#: /Game/SO/Dialogues/Chapter3/C3SupperDwarf.C3SupperDwarf:DlgNode_Speech_80.Text\nmsgctxt \"Dialogue_C3SupperDwarf\"\nmsgid \"I hope there is some delicious food in the Human Realm.\"\nmsgstr \"J'espère qu'il y a de la nourriture délicieuse dans le Royaume des Hommes.\"\n\n#. Key:\t360852FB41FBC269468577878A0CC719\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_C3Teachy\"\nmsgid \"Don’t say it, I know. I’m genius.\"\nmsgstr \"Ne le dites pas, je sais. Je suis un génie.\"\n\n#. Key:\t39008A1943A63D4050295B9C508DF4CE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_C3Teachy\"\nmsgid \"He asked me to prove that I am worthy.\"\nmsgstr \"Il m'a demandé de prouver que j'en suis digne.\"\n\n#. Key:\t5D3A77994D763C95F5655CAC4F228452\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_C3Teachy\"\nmsgid \"Oh, the walking ball again!\"\nmsgstr \"Oh, encore la balle qui marche !\"\n\n#. Key:\t74789A0946246082325FCDB2600CEAA2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_C3Teachy\"\nmsgid \"I haven’t seen you since you left me there with that Keeper.\"\nmsgstr \"Je ne t'ai pas vu depuis que tu m'as laissé là-bas avec ce Gardien.\"\n\n#. Key:\t81A13B9645C14341A7FA45BC7482AB58\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_C3Teachy\"\nmsgid \"I'm not sure if it still matters but here is the Weird Device I found in the hideout of the Secret Science Society.\"\nmsgstr \"Je ne sais pas si cela a encore de l'importance, mais voici le Dispositif Étrange que j'ai trouvé dans la cachette de la Société des Sciences Secrètes.\"\n\n#. Key:\t8E2355CF4A1F7CCF4AF0FA8D95E2F503\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_C3Teachy\"\nmsgid \"After reordering the right side I got the final result:\\r\\n\\r\\nTEACHY = WORTHY\"\nmsgstr \"Après avoir réorganisé le côté droit, j'ai obtenu le résultat final :\\n\\nENSEIGNER = MÉRITER\"\n\n#. Key:\tA46C8D2749791CE910856BA8887272EB\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_C3Teachy\"\nmsgid \"That is amazing! Thank you, my globular friend! Take these coins, I am sure you will enjoy spending them... if you still can.\"\nmsgstr \"C'est incroyable ! Merci, mon ami globulaire ! Prenez ces pièces, je suis sûr que vous aurez plaisir à les dépenser... si vous le pouvez encore.\"\n\n#. Key:\tBFA75D71419A3B5615D65980F9A2FC0E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_C3Teachy\"\nmsgid \"Well, alright, I’ll tell.\"\nmsgstr \"Bon, d'accord, je vais le dire.\"\n\n#. Key:\tC09FB7394571D19280D0B68572C6DCBB\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_C3Teachy\"\nmsgid \"I bet you wonder how did I get out.\"\nmsgstr \"Je parie que vous vous demandez comment je m'en suis sorti.\"\n\n#. Key:\tCC72AAE64CE58AECB367B0B2565A74CC\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_C3Teachy\"\nmsgid \"I made some cups of tea and slowly put them in a row. From that I had this formula:\\r\\n\\r\\nTIME = T\\r\\nCUP = C\\r\\nTEA * C = ROW * T\"\nmsgstr \"J'ai fait quelques tasses de thé et je les ai posément mises en rang. J'en ai tiré cette formule :\\n\\nTEMPS = T\\nCOUPE = C\\nTHÉ * C = RANG * T\"\n\n#. Key:\tE907906F4A46886EFBA7F09E459F2663\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_C3Teachy\"\nmsgid \"Then I multiplied by HY, so I get:\\r\\n\\r\\nTEACHY = ROWTHY\"\nmsgstr \"Ensuite, j'ai multiplié par ER, donc j'obtiens :\\n\\nENSEIGNER = CHAHUTER\"\n\n#. Key:\t298F025648B369E90753DA8D882DFDDB\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/DwarvenCatacombs/DCDictionary.DCDictionary:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Wizard/DwarvenCatacombs/DCDictionary.DCDictionary:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_DCDictionary\"\nmsgid \"Finally! A dictionary!\"\nmsgstr \"Enfin ! Un dictionnaire !\"\n\n#. Key:\t3D4CF9424B28083560A64D8FA1232E9F\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/DwarvenCatacombs/DCDictionary.DCDictionary:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Wizard/DwarvenCatacombs/DCDictionary.DCDictionary:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_DCDictionary\"\nmsgid \"Wake me up when you are ready.\"\nmsgstr \"Réveillez-moi quand vous êtes prêt.\"\n\n#. Key:\t04B787DD4344DA8AD6B1E0B7925BBDCE\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/DwarvenCatacombs/DCSecretDoor.DCSecretDoor:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Wizard/DwarvenCatacombs/DCSecretDoor.DCSecretDoor:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_DCSecretDoor\"\nmsgid \"There is a hidden Dwarven Door somewhere around here.\"\nmsgstr \"Il y a une Porte Naine cachée quelque part par ici.\"\n\n#. Key:\t4412DD54423A17AF3BFBA89BAF42664D\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/DwarvenCatacombs/DCSecretDoor.DCSecretDoor:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Wizard/DwarvenCatacombs/DCSecretDoor.DCSecretDoor:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_DCSecretDoor\"\nmsgid \"Or if you toggle that switch.\"\nmsgstr \"Ou si vous basculez ce commutateur.\"\n\n#. Key:\t5FDA3D2A49BD57C213F0E3869A366B76\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/DwarvenCatacombs/DCSecretDoor.DCSecretDoor:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Wizard/DwarvenCatacombs/DCSecretDoor.DCSecretDoor:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_DCSecretDoor\"\nmsgid \"This one can only be revealed on Christmas time if the full moon shines on it.\"\nmsgstr \"Celle-ci ne peut être révélée au moment de Noël que si la pleine lune y brille.\"\n\n#. Key:\tCE7E6F5B4DB41F1055EAF1898F17E4EA\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/DwarvenCatacombs/DCSecretDoor.DCSecretDoor:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Wizard/DwarvenCatacombs/DCSecretDoor.DCSecretDoor:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_DCSecretDoor\"\nmsgid \"Dwarfs are fond of these. They can't be seen if you don't know their trick.\"\nmsgstr \"Les nains en sont friands. On ne peut pas les voir si on ne connaît pas leur truc.\"\n\n#. Key:\t03067C1041952ECAC7D529AF2CC2ABEE\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_DemonLillian\"\nmsgid \"Who you just killed...\"\nmsgstr \"Qui vous venez de tuer...\"\n\n#. Key:\t06C4895B4BA9C2F71F3007B00A680CFB\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_DemonLillian\"\nmsgid \"I'm free without any bounds! I'm human!\"\nmsgstr \"Je suis libre sans aucune limite ! Je suis humain !\"\n\n#. Key:\t0E5418EA4828B840886434A250967CBE\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_DemonLillian\"\nmsgid \"You liar! I'm the daughter of the Wizard!\"\nmsgstr \"Mensonge ! Je suis la fille du Magicien !\"\n\n#. Key:\t15ED5E554FBF25A72BB12FA81F4076FF\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_DemonLillian\"\nmsgid \"Sister? What makes you say that?\"\nmsgstr \"Ma sœur ? Qu'est-ce qui vous fait dire cela ?\"\n\n#. Key:\t2B375C424D4561D651214BA0F10CDB44\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_DemonLillian\"\nmsgid \"Siblings? What makes you say that?\"\nmsgstr \"Frères et sœurs ? Qu'est-ce qui vous fait dire cela ?\"\n\n#. Key:\t2F0A5F3442ACF917A0515892B0639541\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_2.Children(1).Children.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_2.Children(1).Children.Text\nmsgctxt \"Dialogue_DemonLillian\"\nmsgid \"Just passing\"\nmsgstr \"Juste en passant\"\n\n#. Key:\t36A3340F4333184F42874F88F23A710D\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_DemonLillian\"\nmsgid \"What are you doing here little toy?\"\nmsgstr \"Que fais-tu ici petit jouet ?\"\n\n#. Key:\t46C7EE464B94BCE5D8CE6DB96299A583\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_DemonLillian\"\nmsgid \"You are nonsense.\"\nmsgstr \"Vous êtes un non-sens.\"\n\n#. Key:\t732777EC4B213BC797E24FBBC478D39F\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_DemonLillian\"\nmsgid \"You are a Spirit of the Unknown bound to this body by magic. Just like me.\"\nmsgstr \"Vous êtes un Esprit de l'Inconnu lié à ce corps par la magie. Tout comme moi.\"\n\n#. Key:\t819738554E1DD3694F3D0699221E6932\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_DemonLillian\"\nmsgid \"I'm just err... maybe we could play seek and hide?\"\nmsgstr \"Je me... peut-être qu'on pourrait jouer à cache-cache ?\"\n\n#. Key:\tA02291F444C7907190F1D3AC78E5EAF0\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_2.Children(0).Children.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_2.Children(0).Children.Text\nmsgctxt \"Dialogue_DemonLillian\"\nmsgid \"I'll stop you!\"\nmsgstr \"Je vais vous arrêter !\"\n\n#. Key:\tA94658F148628400E971CD925A6B8713\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_DemonLillian\"\nmsgid \"Shaped like a human...\"\nmsgstr \"Façonné comme un humain...\"\n\n#. Key:\tBBBDA8B843BF5549EF4052894D9BB630\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_DemonLillian\"\nmsgid \"We are siblings right? You will surely let me pass...\"\nmsgstr \"Nous sommes frères et sœurs, n'est-ce pas ? Vous me laisserez sûrement passer...\"\n\n#. Key:\tBF79A92B406E287D767E7799D78FCFD4\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_DemonLillian\"\nmsgid \"That sounds funny!\"\nmsgstr \"Ça a l'air drôle !\"\n\n#. Key:\tC6609DA7417A4DBC86F9809CE994E8BA\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_DemonLillian\"\nmsgid \"I'm power, I'm god!\"\nmsgstr \"Je suis le pouvoir, je suis Dieu !\"\n\n#. Key:\tDD2EF1594AFD2B0C38845C9E36089B95\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_DemonLillian\"\nmsgid \"I've found you!\"\nmsgstr \"Je vous ai trouvé !\"\n\n#. Key:\tDD2F3A7048614E74B3A343BA474D8E49\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_DemonLillian\"\nmsgid \"I've come to stop you sister. The World is not your playground!\"\nmsgstr \"Je suis venu pour vous arrêter, ma soeur. Le monde n'est pas votre terrain de jeu !\"\n\n#. Key:\tE7FA21A04757D1EF04AE41AF4A13025A\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_DemonLillian\"\nmsgid \"I'm bored! Have you come to play with me?\"\nmsgstr \"Je m'ennuie ! Es-tu venu jouer avec moi ?\"\n\n#. Key:\tFF05E84E4027C75294BAF4A589EEF6F9\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_DemonLillian\"\nmsgid \"I can create, I can destroy!\"\nmsgstr \"Je peux créer, je peux détruire !\"\n\n#. Key:\t025193144996A7024A7CF791B5A25EB7\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillianDefeated.DemonLillianDefeated:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillianDefeated.DemonLillianDefeated:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_DemonLillianDefeated\"\nmsgid \"What are you doing? Keep your hands away from me!\"\nmsgstr \"Que faites-vous ? Ne me touchez pas !\"\n\n#. Key:\t2E05897C454C5C33BD76A6A4371A545C\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillianDefeated.DemonLillianDefeated:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillianDefeated.DemonLillianDefeated:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_DemonLillianDefeated\"\nmsgid \"I don't want to play anymore!\"\nmsgstr \"Je n'ai plus envie de jouer !\"\n\n#. Key:\t77A82F8943F323744F9389BF22A80FDF\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillianDefeated.DemonLillianDefeated:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillianDefeated.DemonLillianDefeated:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_DemonLillianDefeated\"\nmsgid \"Farewell Spirit!\"\nmsgstr \"Adieu l'esprit !\"\n\n#. Key:\t7831CD44458112E37918DF9082278603\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillianDefeated.DemonLillianDefeated:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillianDefeated.DemonLillianDefeated:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_DemonLillianDefeated\"\nmsgid \"Leave me alone!\"\nmsgstr \"Laissez-moi tranquille !\"\n\n#. Key:\t79E4053F4B8A1AFE74064BA77037F13E\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillianDefeated.DemonLillianDefeated:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillianDefeated.DemonLillianDefeated:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_DemonLillianDefeated\"\nmsgid \"I am his daughter. And this body is mine.\"\nmsgstr \"Je suis sa fille. Et ce corps est le mien.\"\n\n#. Key:\t96BD08904BC50C912055C0977281D10F\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillianDefeated.DemonLillianDefeated:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillianDefeated.DemonLillianDefeated:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_DemonLillianDefeated\"\nmsgid \"I know this body...\"\nmsgstr \"Je connais ce corps...\"\n\n#. Key:\tA5634D7D4613C578AB85E48B2DBD422B\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillianDefeated.DemonLillianDefeated:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillianDefeated.DemonLillianDefeated:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_DemonLillianDefeated\"\nmsgid \"Away!\"\nmsgstr \"Va-t'en !\"\n\n#. Key:\tE09248B24E34823DDE71BAB68183AD2D\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillianDefeated.DemonLillianDefeated:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillianDefeated.DemonLillianDefeated:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_DemonLillianDefeated\"\nmsgid \"They were wrong all along.\"\nmsgstr \"Ils avaient tort depuis le début.\"\n\n#. Key:\t01C1D7AF4D8D7B3D628A089E38471479\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_74.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_74.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Thank you! Take this as reward.\"\nmsgstr \"Merci ! Prenez ceci comme récompense.\"\n\n#. Key:\t034DDD8F467E3B6E6A70CFBC1FA81D21\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_94.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_94.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Look what I have found for you!\"\nmsgstr \"Regardez ce que j'ai trouvé pour vous !\"\n\n#. Key:\t046279EA4D7E44826F537DA0869C13DD\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_114.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_114.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"They are somewhere around.\"\nmsgstr \"Ils sont quelque part dans les environs.\"\n\n#. Key:\t055FD02047EB0145285C8BB0B7A23F0A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_17.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_17.Children(0).Children.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"They fight Ruin\"\nmsgstr \"Ils se battent contre la Ruine\"\n\n#. Key:\t07684DB1418378D59D3741AE19AB22C1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(9).Children.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(9).Children.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Golems destroyed\"\nmsgstr \"Golems détruits\"\n\n#. Key:\t0D548F74416A5C1D8220869DC707A575\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_127.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_127.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Even if he couldn't be what I wanted him to be, he was my greatest creation ever.\"\nmsgstr \"Même s'il ne pouvait pas être ce que je voulais qu'il soit, il a été ma plus grande création.\"\n\n#. Key:\t0E3082704C6E4BA14C554DA5B4306C88\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Could you merge these copper pieces?\"\nmsgstr \"Pourriez-vous fusionner ces pièces de cuivre ?\"\n\n#. Key:\t103CB0C84AEA077F78347A92E6389F32\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_10.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_10.Children(0).Children.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Don't know\"\nmsgstr \"Ne sait pas\"\n\n#. Key:\t12C814BB44D434DFC5C35C882B4BF0DB\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_116.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_116.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Be aware of the Armour Wrath.\"\nmsgstr \"Soyez prudent avec L'Armure de Colère.\"\n\n#. Key:\t14E2589C4CC2C6C77D37A5B50C61C266\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Could you merge these bronze pieces?\"\nmsgstr \"Pourriez-vous fusionner ces pièces de bronze ?\"\n\n#. Key:\t1770D8FE480B8C028F9ED989E22CF315\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"You are not one of my new creations. Yet not one of the ancients.\"\nmsgstr \"Vous n'êtes pas une de mes nouvelles créations. Mais pas un des anciens.\"\n\n#. Key:\t1C02E8BB400B379858A402B9621B68D6\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_129.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_129.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Take care!\"\nmsgstr \"Prenez soin de vous !\"\n\n#. Key:\t1CDE0CFA4DBF3794096E099B58726BD8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_36.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_36.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Nothing else matters.\"\nmsgstr \"Rien d'autre ne compte.\"\n\n#. Key:\t1FA243424440B0810651C79BD207FC2D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_33.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_33.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Too many spirits. They break loose. They couldn’t exist in our Realm. They formed Ruin.\"\nmsgstr \"Trop d'esprits. Ils se détachent. Ils ne peuvent pas exister dans notre royaume. Ils ont formé la Ruine.\"\n\n#. Key:\t1FFE46404FBD26325B1348BF7A2935A7\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_92.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_92.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Oh, thank you! It also gives back some of my lost knowledge.\"\nmsgstr \"Oh, merci ! Cela me rend aussi une partie de mes connaissances perdues.\"\n\n#. Key:\t2084B3DE4CDAC5B7B9018994EE4DFAA4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_85.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_85.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"The end is close, yet knowing what I am makes my last days brighter.\"\nmsgstr \"La fin est proche, mais savoir ce que je suis rend mes derniers jours plus lumineux.\"\n\n#. Key:\t21883D3E4563FD95B13E8E8E25FB1D92\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_15.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_15.Children(0).Children.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Not my business\"\nmsgstr \"Ce n'est pas mon affaire\"\n\n#. Key:\t2362D7ED44CEEE8592C72BB41ECC0CC0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_77.Text\n#. Key:\t969AF9184296C419E484BA80FF80F15B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_76.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_76.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_77.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Do you know a girl called Lillian?\"\nmsgstr \"Connaissez-vous une fille qui s'appelle Lillian ?\"\n\n#. Key:\t2362FF25427C7C664ACE9297A20F3C65\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_81.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_81.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Memory Crystals? Can I touch them?\"\nmsgstr \"Des Cristaux de Mémoire ? Puis-je les toucher ?\"\n\n#. Key:\t254431B64533FAD362B0AF93F8347842\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_119.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_119.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"You will find it if you reach the top of the Main Tower.\"\nmsgstr \"Vous le trouverez si vous arrivez au sommet de la Tour principale.\"\n\n#. Key:\t26664D3045EDCEC9C09E9CBA8515C088\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I don't know... I'm forced to do tasks for a wizard. I'm lost and confused.\"\nmsgstr \"Je ne sais pas... Je suis obligé de faire des tâches pour un magicien. Je suis perdu et confus.\"\n\n#. Key:\t280BE2914A227E7350F067BCB4CC49AD\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_86.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_86.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Hmmm...\"\nmsgstr \"Hmmm...\"\n\n#. Key:\t2B714CED45A868B1678C5E854160945E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_97.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_97.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Look, I have more crystals.\"\nmsgstr \"Regardez, j'ai d'autres cristaux.\"\n\n#. Key:\t2C052328496E84667F356F95F9F9C418\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"This is really not my problem. All I care about is to complete my task and go on my way.\"\nmsgstr \"Ce n'est vraiment pas mon problème. Tout ce qui m'importe, c'est d'achever ma tâche et de poursuivre mon chemin.\"\n\n#. Key:\t2C174523477E6720A5300DBFE343C3D8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_51.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_51.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I can no longer open a gate to the Unknown Realm.\"\nmsgstr \"Je ne peux plus ouvrir une porte vers le Royaume Inconnu.\"\n\n#. Key:\t2C7D234B4F377087E1D340986BD581AC\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_49.Text\n#. Key:\t417BB4E644EBC809C2489F85993A8E17\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_56.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_49.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_56.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"If you can summon Spirits you surely know a way to get me home.\"\nmsgstr \"Si vous pouvez invoquer des Esprits, vous connaissez sûrement un moyen de me ramener chez moi.\"\n\n#. Key:\t2DE200934F6AC1595216AA8050FF8F30\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_67.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_67.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I won’t work with anything else.\"\nmsgstr \"Je ne travaillerai pas avec autre chose.\"\n\n#. Key:\t2FC050C145CB19BD786157988C677AF5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(1).Children.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Bronze key\"\nmsgstr \"Clé de Bronze\"\n\n#. Key:\t30AD4CBE4D6EFD170F43D9852A0CB50C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_108.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_108.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I can’t remember.\"\nmsgstr \"Je ne m'en souviens pas.\"\n\n#. Key:\t310B95624A8B2179F69A68BE2B0869C2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(4).Children.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(4).Children.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Making Golems?\"\nmsgstr \"Faire des Golems ?\"\n\n#. Key:\t311039514F83A0ED4BE47A98BF5AE48E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_107.Text\n#. Key:\t5D08D2404686BF1E5D48AC8C63096F0D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_104.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_104.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_107.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Thank you Spirit! I will be forever in your debt.\"\nmsgstr \"Merci Esprit ! Je vous serai à jamais redevable.\"\n\n#. Key:\t3140425845B595B02CA8D3B8DBC6CE37\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_38.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_38.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"It's done. They are destroyed.\"\nmsgstr \"C'est fait. Ils sont détruits.\"\n\n#. Key:\t37835C204E4C4B17F2D55C9B23FD7D1E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_45.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_45.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"There is some kind of a connection between Ruin and the Spirits.\"\nmsgstr \"Il existe une sorte de lien entre la Ruine et les Esprits.\"\n\n#. Key:\t384F5CB146C9B6E7EFD361964FF11735\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"A spirit of the Unknown was summoned here by a Wizard of another world.\"\nmsgstr \"Un esprit de l'Inconnu a été convoqué ici par un Magicien d'un autre monde.\"\n\n#. Key:\t398124A4493A7325B284CA8105354F0C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_35.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_35.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Yet now the only important thing is to finish my golems.\"\nmsgstr \"Mais maintenant, la seule chose importante est de finir mes golems.\"\n\n#. Key:\t39C014784CA9DF8247D2DDA5587BAB20\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(5).Children.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(5).Children.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Get me home!\"\nmsgstr \"Ramenez-moi à la maison !\"\n\n#. Key:\t3CE0431346C222ED2A6729AAEF8026DC\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(6).Children.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(6).Children.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"New body for me\"\nmsgstr \"Un nouveau corps pour moi\"\n\n#. Key:\t3DFB1F4D4BB673F983C8CDA4E9911BF2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_89.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_89.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Wait a minute! I’ll make something special for you.\"\nmsgstr \"Attendez un peu ! Je vais vous faire quelque chose de spécial.\"\n\n#. Key:\t3F7C1850478A14857F4FFD9D41BA39FC\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_87.Text\n#. Key:\t79079CCD4BB2C6244D6D7CB04BD4C42F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_84.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_84.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_87.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Yes, now I remember. Thank you little Spirit for giving my memories back.\"\nmsgstr \"Oui, maintenant je me souviens. Merci, petit Esprit, de me rendre mes souvenirs.\"\n\n#. Key:\t3FAB7E8D4E72D1EED6E11EA54A128836\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(3).Children.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(3).Children.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Copper Key\"\nmsgstr \"Clé de Cuivre\"\n\n#. Key:\t419879C24D39534867F656B704C579AC\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_110.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_110.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Even without my memories I liked to talk to her.\"\nmsgstr \"Même sans mes souvenirs, j'aimais lui parler.\"\n\n#. Key:\t41B08BF1417C041EB3ACAE8C09C44872\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_17.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_17.Children(1).Children.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"They will fall\"\nmsgstr \"Ils tomberont\"\n\n#. Key:\t41E19A0C420F2BD87AA91AB475D5BB0C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_128.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_128.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Please, leave me alone now.\"\nmsgstr \"S'il vous plaît, laissez-moi tranquille maintenant.\"\n\n#. Key:\t4438EF7A4D77A3314D2B6587DAE664AE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I can fix it!\"\nmsgstr \"Je peux le réparer !\"\n\n#. Key:\t46730E7C433AE7B987C61D9DDF0161E2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_52.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_52.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"How do you make Golems then?\"\nmsgstr \"Comment fabriquer des Golems alors ?\"\n\n#. Key:\t4816E7D14B256F62C2AFE0A3D5EC1987\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_113.Text\n#. Key:\tEC59F30D402E177B8C137DAA7A834F1A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_112.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_112.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_113.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I’m looking for three artefacts. Do you know something about them?\"\nmsgstr \"Je cherche trois artefacts. Savez-vous quelque chose à leur sujet ?\"\n\n#. Key:\t49E3D8B84BD437A7195CB49B1C91A9B7\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_30.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_30.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"We created too many of them. Always new ones. We forgot about the old ones.\"\nmsgstr \"Nous en avons créé un trop grand nombre. Toujours de nouveaux. Nous avons oublié les anciens.\"\n\n#. Key:\t4CDF7F734B65BFB6575D66A2E40B64B6\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"You wonder if Ruin will destroy their World as well...\"\nmsgstr \"Vous vous demandez si la Ruine va aussi détruire leur Monde...\"\n\n#. Key:\t4FD5FE974E1B8142471F8896818E875C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"What do you need?\"\nmsgstr \"De quoi avez-vous besoin ?\"\n\n#. Key:\t5000F3F44A899815A0D341A3494E42AB\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_91.Text\n#. Key:\t6D5127FD45C09B33329F0EB0DDCE67D7\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_93.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_91.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_93.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Thank you!\"\nmsgstr \"Merci !\"\n\n#. Key:\t50E6C4434BAC5A7F4B2C66BD8DB5E071\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_100.Text\n#. Key:\t64A5DE6941972506C0BECBB55BBE4FE5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_78.Text\n#. Key:\tB07790474D4C124CB72F128AE0FB2CC5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_95.Text\n#. Key:\tEF125F27496303716206D182C1ED460D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_39.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_100.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_39.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_78.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_95.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I think these crystals have something to do with you.\"\nmsgstr \"Je pense que ces cristaux ont quelque chose à voir avec vous.\"\n\n#. Key:\t51C200AD42FCE6888DBF8C8C24A02283\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"It shall be done.\"\nmsgstr \"Cela doit être fait.\"\n\n#. Key:\t52D4954E427C666F0F2F4A92F9BCFBC9\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_50.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_50.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I’m sorry but I can’t help you.\"\nmsgstr \"Je suis désolé, mais je ne peux pas vous aider.\"\n\n#. Key:\t5B1327C64C77C05C43CD728356DA4EC4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_58.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_58.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Knowledge lost. We are lost.\"\nmsgstr \"Connaissance perdue. Nous sommes perdus.\"\n\n#. Key:\t5E7AD2034CECCF124DA4E19D94B96433\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"It's nothing. Here it is.\"\nmsgstr \"Ce n'est rien. Le voici.\"\n\n#. Key:\t5FB1520B447246A1A8BCD3BDDB44D145\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_65.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_65.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"No.\"\nmsgstr \"Non.\"\n\n#. Key:\t5FBF0F3F4419A6AD796054841902FA7C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"They can't work together even if they share the same goal.\"\nmsgstr \"Ils ne peuvent pas travailler ensemble, même s'ils partagent le même objectif.\"\n\n#. Key:\t60609E4049562CF11C05CB8DB96BBBB3\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"What do you mean by 'your creations'?\"\nmsgstr \"Qu'entendez-vous par \\\"vos créations\\\" ?\"\n\n#. Key:\t635D5E904325D51DFF19A1A862A3CC0B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_124.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_124.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"The Armour Wrath is no more.\"\nmsgstr \"L'Armure de Colère n'est plus.\"\n\n#. Key:\t6585CAC84326A3EEE1682789B7BB3CB6\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_10.Children(2).Children.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_10.Children(2).Children.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Your creation?\"\nmsgstr \"Votre création ?\"\n\n#. Key:\t65C3735740E5D7AF76376AB2B7B05CE9\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(12).Children.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(12).Children.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Leave\"\nmsgstr \"Partir\"\n\n#. Key:\t6A460D4A4751398E004298948D630BA4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_47.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_47.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I don’t think I will manage though. It’s already too late. But there is no reason to give up either.\"\nmsgstr \"Mais je ne pense pas que je vais y arriver. Il est déjà trop tard. Mais il n'y a pas de raison d'abandonner non plus.\"\n\n#. Key:\t6DC280B64766B5CB2049409B2F73CDB4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_40.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_40.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Is there a way I can help you?\"\nmsgstr \"Y a-t-il un moyen de vous aider ?\"\n\n#. Key:\t6DD3D7804417850FE8504286DD2B5D95\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_96.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_96.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"More Crystal? That's very kind.\"\nmsgstr \"Encore du Cristal ? C'est très gentil.\"\n\n#. Key:\t6E9DB27A4207FFA8409F61AE45282D53\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_41.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_41.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I have found one more crystal.\"\nmsgstr \"J'ai trouvé un autre Cristal.\"\n\n#. Key:\t717452044F194A1C30FA3C8FBB94C9BF\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_73.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_73.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I’ll see what I can do.\"\nmsgstr \"Je vais voir ce que je peux faire.\"\n\n#. Key:\t74670AB34D1A75913013BE8EE7C0B961\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_72.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_72.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I’ve already destroyed them.\"\nmsgstr \"Je les ai déjà détruits.\"\n\n#. Key:\t752F67A54FA433AA588175AA7C64E367\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_43.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_43.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I try to create the perfect Golem. The one which resists Ruin.\"\nmsgstr \"J'essaie de créer le Golem parfait. Celui qui résistera à la Ruine.\"\n\n#. Key:\t775C2189498804DBED7D81AB3EFEC96F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(11).Children.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(11).Children.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Lillian\"\nmsgstr \"Lillian\"\n\n#. Key:\t78C78DDD456328181EBCC78B20F9573D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_122.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_122.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Some of them are still out there.\"\nmsgstr \"Certains d'entre eux sont toujours là.\"\n\n#. Key:\t7C7D08C340B478A9420331AD355B1FA5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_15.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_15.Children(1).Children.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Like you?\"\nmsgstr \"Comme vous ?\"\n\n#. Key:\t7DCEFFEC46523960D1453DA93F36CAA5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_111.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_111.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I don’t know why but I feel in some way you are bound to her.\"\nmsgstr \"Je ne sais pas pourquoi, mais je sens que vous êtes en quelque sorte lié à elle.\"\n\n#. Key:\t7F44BD934784D4F3AA2C85985489590A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"A Wizard? So now the Human Realm's people are messing with Golem Technology.\"\nmsgstr \"Un Magicien ? Alors maintenant, les gens du Royaume des Hommes s'amusent avec la technologie du Golem.\"\n\n#. Key:\t80871D9C4CF37B5F2E7101B8A2565D73\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_70.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_70.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"It’s not safe for me to walk outside.\"\nmsgstr \"Ce n'est pas sûr pour moi de marcher dehors.\"\n\n#. Key:\t83ACDDA4415211102DBE099F178B228B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_15.Children(2).Children.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_15.Children(2).Children.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"You mean Ruin\"\nmsgstr \"Vous voulez dire la Ruine\"\n\n#. Key:\t86B4FC23463D5507B11C3F826ADF6C7C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_10.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_10.Children(1).Children.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Spirit in a ball\"\nmsgstr \"Un esprit dans une balle\"\n\n#. Key:\t88A6486843FEC6A2125F79B8AED93F74\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_99.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_99.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Now there is only a few missing.\"\nmsgstr \"Aujourd'hui, il n'en manque plus que quelques-uns.\"\n\n#. Key:\t8C2169FA47F83CA62B19F083EFC398F5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_26.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_26.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"That is me. And what are you creature?\"\nmsgstr \"C'est moi. Et qu'est-ce que vous êtes ?\"\n\n#. Key:\t8CC8368441F2CCDB0E7B22916F8A0622\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_88.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_88.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Getting back some of my lost knowledge also makes me feel happy.\"\nmsgstr \"Retrouver une partie de mes connaissances perdues me rend également heureux.\"\n\n#. Key:\t8E3399DA4F904AD46476418817CD78C4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_62.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_62.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Metal binds the will of the spirits. Rock is a bit less cruel but still weakens your will.\"\nmsgstr \"Le Métal lie la volonté des esprits. Le Rock est un peu moins cruel, mais il affaiblit quand même votre volonté.\"\n\n#. Key:\t8F4BB43A4656EAD257920492E10BC764\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_130.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_130.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Yes, they bring back some of my memories.\"\nmsgstr \"Oui, ils me rappellent certains de mes souvenirs.\"\n\n#. Key:\t8F9DF3254A02EFF2E623DB91935A1529\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_123.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_123.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Come back when you found all of them.\"\nmsgstr \"Revenez quand vous les aurez tous trouvés.\"\n\n#. Key:\t97EE3A1B4AD2EB2E7ED2D1B1427E4A2A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_25.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_25.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"It's only me trying to recreate the perfect Golem.\"\nmsgstr \"C'est seulement moi qui essaie de recréer le Golem parfait.\"\n\n#. Key:\t99BCAE80415145460126B08933AE6242\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_118.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_118.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"One of the artefacts is close.\"\nmsgstr \"L'un des artefacts est proche.\"\n\n#. Key:\t9A05FD0845F9149CEB6EB8889EB9A686\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"That won't happen.\"\nmsgstr \"Cela n'arrivera pas.\"\n\n#. Key:\t9B7BB6624923813EBF68C9BCE9FF8E49\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"There is nothing else I could say. See you later!\"\nmsgstr \"Je ne pourrais rien dire d'autre. À plus tard !\"\n\n#. Key:\t9BEA36B448EC18A9280A5AAB78A46898\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_42.Text\n#. Key:\tD3AE25EC49FA7D2C78C1A382E5A01F28\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_37.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_37.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_42.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Why are you making Golems? What would you like to achieve?\"\nmsgstr \"Pourquoi fabriquer des Golems ? Que souhaitez-vous réaliser ?\"\n\n#. Key:\t9CC2CAF14E5C04555E7329B6EA5082E0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(0).Children.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Armour Wrath\"\nmsgstr \"Armure de Colère\"\n\n#. Key:\t9EF4681A48ED6C909A4180BF823544BC\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(8).Children.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(8).Children.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Do you need help?\"\nmsgstr \"Vous avez besoin d'aide ?\"\n\n#. Key:\t9F3BC08D46169E8C4BB788893FFDBCD4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_68.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_68.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Yes.\"\nmsgstr \"Oui.\"\n\n#. Key:\tA10EF7404139EE7FE638BCA272C0B2CA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_71.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_71.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Destroy them if you can.\"\nmsgstr \"Détruisez-les si vous le pouvez.\"\n\n#. Key:\tA13C1A6B4F187C1A3F682088B9CC9A6F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_23.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_23.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Didn't look too intelligent to me...\"\nmsgstr \"Ça ne m'a pas semblé très intelligent...\"\n\n#. Key:\tA28429434B394861A6E4D084CE5C243F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_61.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_61.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I could but I don’t think you would like it.\"\nmsgstr \"Je pourrais, mais je ne pense pas que cela vous plairait.\"\n\n#. Key:\tA2CBB6914F66C9963AFD34A21378EAA7\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_103.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_103.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"With this last one I have all my memories back.\"\nmsgstr \"Avec ce dernier, j'ai retrouvé tous mes souvenirs.\"\n\n#. Key:\tA33780CE4B9EABF54F612DBFCEB4B890\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I wonder if they will end like us.\"\nmsgstr \"Je me demande s'ils finiront comme nous.\"\n\n#. Key:\tA47024E844A13837A8FFFBB1EFA65633\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_44.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_44.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Though I forgot the reason.\"\nmsgstr \"Bien que j'aie oublié la raison.\"\n\n#. Key:\tA4E91A924BA53F0A000CDB9FC351DDBA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_60.Text\n#. Key:\tB4F5B2E6479E0E1ACDADD8A40E21FB98\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_59.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_59.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_60.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Could you create a stronger body for me?\"\nmsgstr \"Pourriez-vous me créer un corps plus fort ?\"\n\n#. Key:\tA50F6A7B4A65712F990406B84E2AE072\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_98.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_98.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Thank you! I remember more and more.\"\nmsgstr \"Merci ! Je me souviens de plus en plus.\"\n\n#. Key:\tA586F33F460BD066761AAEBD18666F78\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_82.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_82.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Bring me more so that I can remember!\"\nmsgstr \"Apportez-m'en plus pour que je puisse me souvenir !\"\n\n#. Key:\tA8A9ACBA47419C57AAA06098F7F91AD3\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_83.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_83.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Let me touch it! Hmmm...\"\nmsgstr \"Laissez-moi le toucher ! Hmmm...\"\n\n#. Key:\tAA5F0D5541366675A1D1819FDBDFA569\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"What happened to you?\"\nmsgstr \"Que vous est-il arrivé ?\"\n\n#. Key:\tAD380C5F4F549229611DD9A79C7CD07E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_79.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_79.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"She was from the Human Realm. I liked her better than the other human.\"\nmsgstr \"Elle était du Royaume des Hommes. Je la préférais à l'autre humain.\"\n\n#. Key:\tAE0D1C714FFCFCA51ACCD3A01D6C7FF5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_125.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_125.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Yes, I felt his presence disappearing.\"\nmsgstr \"Oui, j'ai senti sa présence disparaître.\"\n\n#. Key:\tAE6B02664FEE60818E0D32B7939907F8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_106.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_106.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Now I have all my memories back.\"\nmsgstr \"Maintenant, j'ai retrouvé tous mes souvenirs.\"\n\n#. Key:\tB7638E004540ADC59420A5AA614C225D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_75.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_75.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I’ve destroyed the Golems near the Tomb.\"\nmsgstr \"J'ai détruit les Golems près de la Tombe.\"\n\n#. Key:\tB86428C143F7BBBC4A7B9A91C05F3D15\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"They are doomed.\"\nmsgstr \"Ils sont condamnés.\"\n\n#. Key:\tBB7DE71F44FE995BA4AF4C9F5E19961F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_46.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_46.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I try to create an Essence which resists Ruin. If it works it could stop Ruin.\"\nmsgstr \"J'essaie de créer une Essence qui résiste à la Ruine. Si elle fonctionne, elle pourrait arrêter la Ruine.\"\n\n#. Key:\tBCF49E21489280A32F859B9A6C2A78D4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"What are you creature?\"\nmsgstr \"Qu'est-ce que vous êtes ?\"\n\n#. Key:\tBDEEB7C2474E308C66B832B41D839FC6\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_66.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_66.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Metal is good for spirits. Even rock is dangerous.\"\nmsgstr \"Le Métal est bon pour les esprits. Même si le Rock est dangereux.\"\n\n#. Key:\tC0CAE1B14D0B0E551B690FB9F178A6EE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(10).Children.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(10).Children.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Memory Crystals\"\nmsgstr \"Cristaux de Mémoire\"\n\n#. Key:\tC86A03B046B8F005B1C91EB0F68E4C1E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_121.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_121.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Here, take this! It might help if you need to face my creature!\"\nmsgstr \"Tenez, prenez ça ! Cela pourrait vous aider si vous devez faire face à ma créature !\"\n\n#. Key:\tCA35E144421C5594346DC9954052E633\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_57.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_57.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"No way home.\"\nmsgstr \"Pas moyen de rentrer chez soi.\"\n\n#. Key:\tCD223717428DAF54F5362BB744B6A633\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_53.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_53.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I reuse the old golems. Maybe that’s why I can’t succeed.\"\nmsgstr \"Je réutilise les vieux golems. C'est peut-être pour cela que je ne peux pas réussir.\"\n\n#. Key:\tD06BA0C54CAA8E00ECAFBE9FAFBABE1F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Could you merge these iron pieces?\"\nmsgstr \"Pourriez-vous fusionner ces pièces de fer ?\"\n\n#. Key:\tD237C8514A69E0A7820941B9048B92DE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_90.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_90.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Here it is!\"\nmsgstr \"Le voici !\"\n\n#. Key:\tD2CEAC3040B9EBE5A98F249F60A7DAAA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(2).Children.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(2).Children.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Iron Key\"\nmsgstr \"Clé de Fer\"\n\n#. Key:\tD935FD314471404BAECA54BC3227D6E2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_69.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_69.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"There are too many unsuccessful golems.\"\nmsgstr \"Il y a trop de golems qui ne fonctionnent pas.\"\n\n#. Key:\tDE3287A345E1E317061B45B64AAA0836\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_34.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_34.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Your words remind me of something. Something which was important.\"\nmsgstr \"Vos paroles me rappellent quelque chose. Quelque chose qui était important.\"\n\n#. Key:\tDEC8E5D548AECD6D48B449B51967301B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_115.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_115.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"One is guarded by my worst creation.\"\nmsgstr \"L'un est gardé par ma pire création.\"\n\n#. Key:\tDEFA219E40FE5384D8B1F0A1CFD3AAD4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_80.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_80.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"She were... She said...\"\nmsgstr \"Elle était... Elle a dit...\"\n\n#. Key:\tE13D5CCE41818BAC4A6E52A965B0AEF8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_101.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_101.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Look at this!\"\nmsgstr \"Regardez ça !\"\n\n#. Key:\tE1CB9ABE410B3C818283BB9325F3A456\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_32.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_32.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I create golems. You go on with your quest. Nothing else matters.\"\nmsgstr \"Je crée des golems. Vous continuez votre quête. Rien d'autre ne compte.\"\n\n#. Key:\tE2AAAA4648BE8A7E73C761BDF72EC82D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_54.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_54.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Ruin caused too much damage.\"\nmsgstr \"La Ruine a causé trop de dégâts.\"\n\n#. Key:\tE483CAFF4F7EF5607AA0A58F47EEF892\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_31.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_31.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"You are right. We are what we do. That keeps us alive.\"\nmsgstr \"Vous avez raison. Nous sommes ce que nous faisons. C'est ce qui nous maintient en vie.\"\n\n#. Key:\tE9899191454A678E7C61B0A55047A725\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_126.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_126.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I'm glad you managed to defeat him and yet...\"\nmsgstr \"Je suis heureux que vous ayez réussi à le vaincre et pourtant...\"\n\n#. Key:\tEA08D7B74E94A3D91DC825945916C312\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_102.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_102.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"One more Crystal for you!\"\nmsgstr \"Un Cristal de plus pour vous !\"\n\n#. Key:\tEAF5836D4D35812F14EABFA43C849947\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_117.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_117.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I know what you are up to. I would like to help but I fear I can’t do much.\"\nmsgstr \"Je sais ce que vous faites. J'aimerais vous aider, mais je crains de ne pas pouvoir faire grand-chose.\"\n\n#. Key:\tEB0F70894E9A498111B9A9824589633B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I create Golems. I always did. I designed the most intelligent ones.\"\nmsgstr \"Je crée des Golems. Je l'ai toujours fait. J'ai conçu les plus intelligents.\"\n\n#. Key:\tF0A1D18E463DCD0CADD67690F691481B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_27.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_27.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"There are some seeking a way to stop Ruin. They don't care about using spirits as slaves.\"\nmsgstr \"Certains cherchent un moyen d'arrêter la Ruine. Ils ne se soucient pas d'utiliser les esprits comme esclaves.\"\n\n#. Key:\tF10E8A9243616A85F71C01B0E57A2CC8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_105.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_105.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"And this is for you!\"\nmsgstr \"Et ceci est pour vous !\"\n\n#. Key:\tF62B033A4054241E561B519B2AFFEBDB\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Do you mean those moving rock things out there?\"\nmsgstr \"Vous voulez parler de ces rochers en mouvement ?\"\n\n#. Key:\tF783A4F44E12EDA97EDF08B60228ED06\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_109.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_109.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"She had heart, she cared about what’s going on here. For the others we were like some interesting study.\"\nmsgstr \"Elle avait du cœur, elle se souciait de ce qui se passait ici. Pour les autres, nous étions comme une étude intéressante.\"\n\n#. Key:\tF87968784C67FEEEBB78DBAD9D3C13F3\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_63.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_63.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"As for other materials I have no experience. Trust me you don’t want me to test out something on you for the first time.\"\nmsgstr \"Quant aux autres matériaux, je n'ai aucune expérience. Croyez-moi, vous ne voulez pas que je teste quelque chose sur vous pour la première fois.\"\n\n#. Key:\tF9B8793C470BFE672214E1B82AE01B4E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_24.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_24.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Knowledge is lost. We are all lost.\"\nmsgstr \"La connaissance est perdue. Nous sommes tous perdus.\"\n\n#. Key:\tF9DB2D444ADAC7A5C22AEC914EC7955F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(7).Children.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(7).Children.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Artefacts\"\nmsgstr \"Artéfacts\"\n\n#. Key:\tFE7749AB4C91684B3438E7A1B5BF32D9\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_29.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_29.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"They can't do as they plan. Some of them don't even believe Ruin.\"\nmsgstr \"Ils ne peuvent pas faire ce qu'ils ont prévu. Certains d'entre eux ne croient même pas à la Ruine.\"\n\n#. Key:\tFF2914834A91E2B6E8696FA828FC9F94\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_120.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_120.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Though it is guarded by the worst Golem I ever made: the Armour Wrath...\"\nmsgstr \"Bien qu'il soit gardé par le pire Golem que j'ai jamais fait : l'Armure de Colère...\"\n\n#. Key:\t303FE4BA4765B90E9239FEB43AE2264C\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/DwarvenCatacombs/DO1Altar.DO1Altar:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Wizard/DwarvenCatacombs/DO1Altar.DO1Altar:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_DO1Altar\"\nmsgid \"Under section 1 of the first Act, an action of worship can not be aimed at any entity, god or divinity other than the Law itself.\"\nmsgstr \"Selon l'article 1 de la 1ère Loi, une action de culte ne peut être dirigée contre une entité, un dieu ou une divinité autre que la Loi elle-même.\"\n\n#. Key:\t73BA4B474C4DCF6CD31469A9FF120D58\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/DwarvenCatacombs/DO1Altar1.DO1Altar1:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Wizard/DwarvenCatacombs/DO1Altar1.DO1Altar1:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_DO1Altar1\"\nmsgid \"Under section 2 of the first Act... ??? There is section 3 of the first act, one would assume.\"\nmsgstr \"En dessous de l'article 2 de la 1ère Loi... ? ?? Il y a l'article 3 de la 1ère Loi, semble-t-il.\"\n\n#. Key:\t0D939EC3462DBDE895AD9F80CD4A9B99\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/DwarvenOutpost/DO1Arrive1DeadDwarves.DO1Arrive1DeadDwarves:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Wizard/DwarvenOutpost/DO1Arrive1DeadDwarves.DO1Arrive1DeadDwarves:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_DO1Arrive1DeadDwarves\"\nmsgid \"So they were the dwarfs who lived here.\"\nmsgstr \"Ce sont donc les nains qui vivaient ici.\"\n\n#. Key:\t6E27805A491B0E0DEAC36F9189CA33F9\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/DwarvenOutpost/DO1Arrive1DeadDwarves.DO1Arrive1DeadDwarves:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Wizard/DwarvenOutpost/DO1Arrive1DeadDwarves.DO1Arrive1DeadDwarves:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_DO1Arrive1DeadDwarves\"\nmsgid \"I'm not sure why but I feel a bit of sorrow for them.\"\nmsgstr \"Je ne sais pas pourquoi, mais je ressens un peu de tristesse pour eux.\"\n\n#. Key:\t7AD20FC74D56D0EE48CB5F92804EDAE5\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/DwarvenOutpost/DO1Arrive1DeadDwarves.DO1Arrive1DeadDwarves:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Wizard/DwarvenOutpost/DO1Arrive1DeadDwarves.DO1Arrive1DeadDwarves:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_DO1Arrive1DeadDwarves\"\nmsgid \"I wonder how you can tell them apart.\"\nmsgstr \"Je me demande comment vous pouvez les distinguer.\"\n\n#. Key:\tA6EB230647E9F8D38877FCA10CDE4875\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/DwarvenOutpost/DO1Arrive1DeadDwarves.DO1Arrive1DeadDwarves:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Wizard/DwarvenOutpost/DO1Arrive1DeadDwarves.DO1Arrive1DeadDwarves:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_DO1Arrive1DeadDwarves\"\nmsgid \"I knew these ones. That's Gwin and Traga, there's Krug...\"\nmsgstr \"Je les connaissais. C'est Gwin et Traga, c'est Krug...\"\n\n#. Key:\t2858D4314420FB59E8BDC18DB625DC1F\n#. SourceLocation:\t/Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_6.SpeechSequence(1).SpeechSequence.Text\n#: /Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_6.SpeechSequence(1).SpeechSequence.Text\nmsgctxt \"Dialogue_DO1Gate\"\nmsgid \"I think you may mistranslated a word or two...\"\nmsgstr \"Je pense que vous avez peut-être mal traduit un mot ou deux...\"\n\n#. Key:\t2C08483A26080F0A003A02ADBE7A7D64\n#. SourceLocation:\t/Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_7.SpeechSequence(2).SpeechSequence.Text\n#: /Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_7.SpeechSequence(2).SpeechSequence.Text\nmsgctxt \"Dialogue_DO1Gate\"\nmsgid \"Dwarven letters are so similar...\"\nmsgstr \"Les lettres naines se ressemblent tellement...\"\n\n#. Key:\t2C09D69026080F0A003A02ADBE7A7D4E\n#. SourceLocation:\t/Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_8.SpeechSequence(2).SpeechSequence.Text\n#: /Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_8.SpeechSequence(2).SpeechSequence.Text\nmsgctxt \"Dialogue_DO1Gate\"\nmsgid \"Dwarven language is stupid, these signs could mean anything!\"\nmsgstr \"Le langage nain est stupide, ces signes peuvent signifier n'importe quoi !\"\n\n#. Key:\t3D6EF5724190CE0AE579D69677BB8EAE\n#. SourceLocation:\t/Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_DO1Gate\"\nmsgid \"Associate!\"\nmsgstr \"Collaborez !\"\n\n#. Key:\t4758A32043FC23B4DC3D82B35EFB0D24\n#. SourceLocation:\t/Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_DO1Gate\"\nmsgid \"The Doors of Dwar — Lord of Dwartown. Speak, associate, and enter.\"\nmsgstr \"Les Portes du Nain - Seigneur de Ville-Naine. Parlez, collaborez et entrez.\"\n\n#. Key:\t475CE3E94BA77F7596A7D8931D4D16C7\n#. SourceLocation:\t/Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_7.SpeechSequence(1).SpeechSequence.Text\n#: /Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_7.SpeechSequence(1).SpeechSequence.Text\nmsgctxt \"Dialogue_DO1Gate\"\nmsgid \"Are you sure that is what you just read?\"\nmsgstr \"Êtes-vous sûr que c'est ce que vous venez de lire ?\"\n\n#. Key:\t530C8841437C531647717B8B0BC07210\n#. SourceLocation:\t/Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_8.SpeechSequence(1).SpeechSequence.Text\n#: /Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_8.SpeechSequence(1).SpeechSequence.Text\nmsgctxt \"Dialogue_DO1Gate\"\nmsgid \"Nice try...\"\nmsgstr \"Bien essayé...\"\n\n#. Key:\t543858DE49FD03BF4F94C3BA47912E5E\n#. SourceLocation:\t/Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_9.SpeechSequence(1).SpeechSequence.Text\n#: /Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_9.SpeechSequence(1).SpeechSequence.Text\nmsgctxt \"Dialogue_DO1Gate\"\nmsgid \"I have to practice my Dwarven a bit more...!\"\nmsgstr \"Il faut que je m'entraîne un peu plus en langue naine... !\"\n\n#. Key:\t5923FB9C4DC255ABAA6059B64B806802\n#. SourceLocation:\t/Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_6.SpeechSequence(3).SpeechSequence.Text\n#: /Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_6.SpeechSequence(3).SpeechSequence.Text\nmsgctxt \"Dialogue_DO1Gate\"\nmsgid \"I am going to open this door somehow.\"\nmsgstr \"Je vais ouvrir cette porte d'une manière ou d'une autre.\"\n\n#. Key:\t7CF38D834DB6A7265EDE19AD158BFEBF\n#. SourceLocation:\t/Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_7.SpeechSequence(0).SpeechSequence.Text\n#: /Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_7.SpeechSequence(0).SpeechSequence.Text\nmsgctxt \"Dialogue_DO1Gate\"\nmsgid \"I want a Schnauser with my Wienerschnitzel\"\nmsgstr \"Je veux un Schnauser avec ma Wienerschnitzel\"\n\n#. Key:\t86311C104780BDB8A170538987EF7226\n#. SourceLocation:\t/Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_8.SpeechSequence(0).SpeechSequence.Text\n#: /Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_8.SpeechSequence(0).SpeechSequence.Text\nmsgctxt \"Dialogue_DO1Gate\"\nmsgid \"And on the day the Ball is set free, the gate opens and happiness finds everyone...\"\nmsgstr \"Et le jour où la Balle est libérée, la porte s'ouvre et le bonheur réunit tout le monde...\"\n\n#. Key:\tCD68B2244B57CA37D2940499F440149B\n#. SourceLocation:\t/Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_DO1Gate\"\nmsgid \"Associwhat?\"\nmsgstr \"Collaboquoi ?\"\n\n#. Key:\tCE8E75E6422C068794CC91BDBA2C024A\n#. SourceLocation:\t/Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_6.SpeechSequence(2).SpeechSequence.Text\n#: /Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_6.SpeechSequence(2).SpeechSequence.Text\nmsgctxt \"Dialogue_DO1Gate\"\nmsgid \"Damn, my Dwarven is just not good enough, I have to practice a bit more...\"\nmsgstr \"Mince, mon nain n'est pas assez bon, je dois m'entraîner un peu plus...\"\n\n#. Key:\tCED9C6ED4B792FA939C759A79E4AB028\n#. SourceLocation:\t/Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_6.SpeechSequence(0).SpeechSequence.Text\n#: /Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_6.SpeechSequence(0).SpeechSequence.Text\nmsgctxt \"Dialogue_DO1Gate\"\nmsgid \"There is sauerkraut in my Lederhosen\"\nmsgstr \"Il y a de la sauerkraut dans mon Lederhosen\"\n\n#. Key:\tEC493B624D127AB87692BC983023FF18\n#. SourceLocation:\t/Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_7.SpeechSequence(3).SpeechSequence.Text\n#: /Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_7.SpeechSequence(3).SpeechSequence.Text\nmsgctxt \"Dialogue_DO1Gate\"\nmsgid \"There must be a way to open this door...\"\nmsgstr \"Il doit y avoir un moyen d'ouvrir cette porte...\"\n\n#. Key:\t6F5AF3DD4E848650EE74449420A90A25\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/DwarvenCatacombs/DO1Tomb.DO1Tomb:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Wizard/DwarvenCatacombs/DO1Tomb.DO1Tomb:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_DO1Tomb\"\nmsgid \"These are the orders of the Chancellor of Dwartown, unjustly murdered by order of Duality.\"\nmsgstr \"Ce sont les ordres du Chancelier de Ville-Naine, injustement assassiné par ordre de Dualité.\"\n\n#. Key:\t949EBB7A4FCEA61BB9B3589CFCC53C2B\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/DwarvenCatacombs/DO1Tomb1.DO1Tomb1:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Wizard/DwarvenCatacombs/DO1Tomb1.DO1Tomb1:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_DO1Tomb1\"\nmsgid \"Here lies the testament of the order of Duality, justly murdered by the Chancellor of Dwartown's spirit.\"\nmsgstr \"C'est là que se trouve le testament de l'ordre de Dualité, justement assassiné par l'esprit du Chancelier de Ville-Naine.\"\n\n#. Key:\t110A2E27493EBAD78EE6E1B16F56912A\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E3/E3_Start.E3_Start:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E3/E3_Start.E3_Start:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_E3_Start\"\nmsgid \"I survived the Unknown. I know how to use the Device, but...\"\nmsgstr \"J'ai survécu à l'Inconnu. Je sais comment utiliser le Dispositif, mais...\"\n\n#. Key:\t2CB853A540A2B5BFD268DEAA124CEAD0\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E3/E3_Start.E3_Start:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Ending/E3/E3_Start.E3_Start:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_E3_Start\"\nmsgid \"I need to choose one last time. Once and for all.\"\nmsgstr \"Je dois choisir une dernière fois. Une fois pour toutes.\"\n\n#. Key:\t416D47B6408622D8D01F61961C80ADD2\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E3/E3_Start.E3_Start:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E3/E3_Start.E3_Start:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_E3_Start\"\nmsgid \"I have already lost almost everything.\"\nmsgstr \"J'ai déjà presque tout perdu.\"\n\n#. Key:\t75F863B843B253E3586DE991CDE546EA\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E3/E3_Start.E3_Start:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Ending/E3/E3_Start.E3_Start:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_E3_Start\"\nmsgid \"And here I am again. Is this how it will end?\"\nmsgstr \"Et me voici de nouveau. Est-ce ainsi que cela va se terminer ?\"\n\n#. Key:\t77BC194943A148967299F68B3522C696\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E3/E3_Start.E3_Start:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Ending/E3/E3_Start.E3_Start:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_E3_Start\"\nmsgid \"Do I really have to lose everyone I met in the Ruined Realm?\"\nmsgstr \"Dois-je vraiment perdre tous ceux que j'ai rencontrés dans le Royaume en Ruines ?\"\n\n#. Key:\tA50B792A4D68EC45BB9C3CBBF8836021\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E3/E3_Start.E3_Start:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Ending/E3/E3_Start.E3_Start:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_E3_Start\"\nmsgid \"Or would I only save them so that we can die together?\"\nmsgstr \"Ou est-ce que je les sauverais seulement pour que nous puissions mourir ensemble ?\"\n\n#. Key:\tE43A08E14831EBDC50AFC0B4A3178817\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E3/E3_Start.E3_Start:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Ending/E3/E3_Start.E3_Start:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_E3_Start\"\nmsgid \"I can hear the people outside the tower. I don’t have much time.\"\nmsgstr \"Je peux entendre les gens à l'extérieur de la tour. Je n'ai pas beaucoup de temps.\"\n\n#. Key:\t042B7F534C07B3EC75BA9BA8F0BA7926\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_5.Children(0).Children.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_5.Children(0).Children.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"Worthy?\"\nmsgstr \"Digne ?\"\n\n#. Key:\t05E334DE42BAA89837B78B8F0F1CBD93\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"Get some rest and try again later.\"\nmsgstr \"Reposez-vous et réessayez plus tard.\"\n\n#. Key:\t0BD769F745B35A106C7C0A83F6F9F246\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"All right so you just teleported me to this... what is this place?\"\nmsgstr \"Très bien, donc vous venez de me téléporter à cet... quel est cet endroit ?\"\n\n#. Key:\t0C9ECC3745963AB1D1FB6487E97513F9\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_24.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_24.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"So right now this is the most proper place to test your Worthiness.\"\nmsgstr \"C'est donc l'endroit le plus approprié pour tester votre valeur.\"\n\n#. Key:\t1401CBDA425076C6AE74C9BF4558D8DD\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"You are not Worthy!\"\nmsgstr \"Vous n'en êtes pas digne !\"\n\n#. Key:\t21C3C1394F39821BC10FFFBE157AC5CF\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"Giving up is not an option.\"\nmsgstr \"Abandonner n'est pas une option.\"\n\n#. Key:\t2E7222EA4858A0ADE9CE3C84CA27B993\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_5.Children(3).Children.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_5.Children(3).Children.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"Skip\"\nmsgstr \"Passer\"\n\n#. Key:\t31BEA1764BA337B32B8038B31BE69C29\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"Farewell! I need to go now.\"\nmsgstr \"Adieu ! Je dois partir maintenant.\"\n\n#. Key:\t36B9EA924E623AFE9BF0B98402235EA4\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"Focus on the trial!\"\nmsgstr \"Concentrez-vous sur l'épreuve !\"\n\n#. Key:\t4A4A86684E5C5742A70FE383461AD89C\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"Venture further down into the Sewer! You will find the answer.\"\nmsgstr \"Aventurez-vous plus loin dans les égouts ! Vous trouverez la réponse.\"\n\n#. Key:\t54CA97394FDC12D0370C54995094819E\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"This trial will test your limits!\"\nmsgstr \"Cette épreuve va tester vos limites !\"\n\n#. Key:\t5D820AA647AE2540DE6C2D8D6F6BF88A\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_5.Children(4).Children.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_5.Children(4).Children.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"Give seat\"\nmsgstr \"Laisser sa place\"\n\n#. Key:\t5F6629ED4E0857BBBA46ED9C51306215\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_5.Children(2).Children.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_5.Children(2).Children.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"Restore\"\nmsgstr \"Restaurer\"\n\n#. Key:\t618B587743F2F432D9D487AE0E909166\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"What?\"\nmsgstr \"Quoi ?\"\n\n#. Key:\t61D61006436DD6659A8846932697971A\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"Yes, you are!\"\nmsgstr \"Oui, vous l'êtes !\"\n\n#. Key:\t6225912A49C32068D10ADB9C31A6BA3E\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"Of course!\"\nmsgstr \"Bien sûr !\"\n\n#. Key:\t7DD5FF4D47DF6A461D44DDBA056A4100\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"I shall yield you to the right path!\"\nmsgstr \"Je vous mettrai sur le bon chemin !\"\n\n#. Key:\t8C3F3A364544B13A2C6687A99E6A792B\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"I'm fed up with your trial! Just teleport me back.\"\nmsgstr \"J'en ai assez de votre épreuve ! Téléportez-moi.\"\n\n#. Key:\t903D03CE41FD835E75059587288D9A1B\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_23.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_23.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"There used to be an Arena here to test the Adventurers of the Realm, but it has been flooded with water for a hundred years.\"\nmsgstr \"Il y avait autrefois une Arène ici pour tester les Aventuriers du Royaume, mais elle a été inondée d'eau pendant une centaine d'années.\"\n\n#. Key:\t96C9A8DA496C0A8476E35AB942BE5EED\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"Am I Worthy?\"\nmsgstr \"Suis-je Digne ?\"\n\n#. Key:\t9826B62E48A67772A1850CADF1A83729\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_5.Children(1).Children.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_5.Children(1).Children.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"Where are we?\"\nmsgstr \"Où en sommes-nous ?\"\n\n#. Key:\t9A94E4FC46E3896BE05136A2A9EA4AF5\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_27.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_27.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"We don't have time for this now.\"\nmsgstr \"Nous n'avons pas le temps pour cela maintenant.\"\n\n#. Key:\t9B9B02AF404F9B8B9D8722A9006FC907\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"These are the remnants of the Ancient Sewer.\"\nmsgstr \"Ce sont les vestiges de l'Ancien Égout.\"\n\n#. Key:\tAAB9F101475D1407B58BECB2DA5E508D\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"So how am I supposed to complete your Trial?\"\nmsgstr \"Alors, comment suis-je censé mener à bien votre Épreuve ?\"\n\n#. Key:\tAD3BADD6499C01410511E68C86F337C8\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"Your Worthiness has to be proven.\"\nmsgstr \"Votre mérite doit être prouvé.\"\n\n#. Key:\tC0BA510B4875AD24C53663B01964B309\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"Go now, the Trial awaits you!\"\nmsgstr \"Partez maintenant, l'Épreuve vous attend !\"\n\n#. Key:\tC252181740C4E256EDEB29B6B552BDD2\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"I'm tired, I will need some time to recover.\"\nmsgstr \"Je suis fatigué, j'aurai besoin d'un peu de temps pour récupérer.\"\n\n#. Key:\tCCD8D1DD4859B067482612A3A9F32C06\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_5.Children(5).Children.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_5.Children(5).Children.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"Leave\"\nmsgstr \"Partir\"\n\n#. Key:\tCE0C3EBD41F17E82F8CF0E8D5E5E9F17\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"The Worthiness is strong in this one...\"\nmsgstr \"La Valeur est puissante en celui-ci...\"\n\n#. Key:\tD229B47146585D051BEFF493C53ED01B\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_26.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_26.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"Stop!\"\nmsgstr \"Stop !\"\n\n#. Key:\tF043B1BF47F617255071EC9DB44CB78A\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"You have proven yourself Worthy!\"\nmsgstr \"Vous avez prouvé que vous en étiez Digne !\"\n\n#. Key:\tFBBCA0E043F139F203D62DAD1599143E\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"Your Worthiness has been proven again!\"\nmsgstr \"Votre Valeur a encore été prouvée !\"\n\n#. Key:\tFE4F99AC4F23760ADD203083CA1497E3\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_25.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_25.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"I have found a...\"\nmsgstr \"J'ai trouvé un(e)...\"\n\n#. Key:\t00AD8B3D44461E4DBF800F92DDF0C6F5\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_Gatekeeper_AfterBattle\"\nmsgid \"What?! I understand that for a new gate to open one would have to prove something, but... in this case... I accept that...\"\nmsgstr \"Quoi ?! Je comprends que pour qu'une nouvelle porte s'ouvre, il faudrait prouver quelque chose, mais... dans ce cas... j'accepte que...\"\n\n#. Key:\t0EC6953C4F07CFF6B7A13A9BCF224550\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_Gatekeeper_AfterBattle\"\nmsgid \"Enough!\"\nmsgstr \"Assez !\"\n\n#. Key:\t237714F14DC3F9D33F10E6B7761E47C4\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_Gatekeeper_AfterBattle\"\nmsgid \"What a coincidence! I also happen to be heading in that direction.\"\nmsgstr \"Quelle coïncidence ! Il se trouve que je vais aussi dans cette direction.\"\n\n#. Key:\t28054AA74F9CEA976E653ABF5A5F5695\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_Gatekeeper_AfterBattle\"\nmsgid \"You can pass.\"\nmsgstr \"Vous pouvez passer.\"\n\n#. Key:\t3D5BAB214968DBB31BE03EBE32B2DE6C\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_Gatekeeper_AfterBattle\"\nmsgid \"Farewell my Ball Lord! May the Great Gate open for you when the time comes!\"\nmsgstr \"Adieu mon Seigneur de la Balle ! Que la Grande Porte s'ouvre pour vous le moment venu !\"\n\n#. Key:\t4D497F814F476FFA7F2A66A937EAFF3E\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_Gatekeeper_AfterBattle\"\nmsgid \"Noooooo...\"\nmsgstr \"Nooooon...\"\n\n#. Key:\t4FEA82084C2E2E09FE6699B2FB353E04\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_Gatekeeper_AfterBattle\"\nmsgid \"Could you just let me pass? Please?\"\nmsgstr \"Pourriez-vous me laisser passer ? S'il vous plaît ?\"\n\n#. Key:\t50005F6248946893250282B0B7D134F2\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_Gatekeeper_AfterBattle\"\nmsgid \"You have proved your Worthiness.\"\nmsgstr \"Vous avez prouvé votre Valeur.\"\n\n#. Key:\t601E1BAC4E9C7A93B7A97AA787C14027\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_Gatekeeper_AfterBattle\"\nmsgid \"Farewell, Keeper!\"\nmsgstr \"Adieu, Gardien !\"\n\n#. Key:\t758788864E716DB2EC9F57B3042DC129\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_Gatekeeper_AfterBattle\"\nmsgid \"Ask him to take you to Crossroad Cave.\"\nmsgstr \"Demandez-lui de vous emmener à la Grotte de la Croisée des Chemins.\"\n\n#. Key:\t8170CF2C42A1894899BA98B33AB39A3F\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_Gatekeeper_AfterBattle\"\nmsgid \"Wait! What?\"\nmsgstr \"Attendez ! Quoi ?\"\n\n#. Key:\t86B7E3D34F2206BB44B0F88001F9E8BA\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_Gatekeeper_AfterBattle\"\nmsgid \"Then if you accept, let the trial begin!\"\nmsgstr \"Alors, si vous acceptez, que l'épreuve commence !\"\n\n#. Key:\tCC7215014B87E0910413F1AEECE0492F\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_Gatekeeper_AfterBattle\"\nmsgid \"Where do you want to go, Sir? Command me.\"\nmsgstr \"Où voulez-vous aller, Monsieur ? Dites-moi.\"\n\n#. Key:\tD5FBCE5C4C97766EF3A852A2D96D1D30\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_Gatekeeper_AfterBattle\"\nmsgid \"Crossroad Cave!\"\nmsgstr \"La Grotte de la Croisée des Chemins !\"\n\n#. Key:\tE0032A09440BDE56BFAF2CBDBCFA2074\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_Gatekeeper_AfterBattle\"\nmsgid \"So be it!\"\nmsgstr \"Qu'il en soit ainsi !\"\n\n#. Key:\tE8148F28483300CCD24473A30C028235\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_Gatekeeper_AfterBattle\"\nmsgid \"Once you have proven Worthy.\"\nmsgstr \"Une fois que vous avez prouvé que vous en êtes Digne.\"\n\n#. Key:\t0BE62CA44198CAA4B4AF7D844B79EEC3\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_3.Children(2).Children.Text\n#. Key:\t17D2B5D7409FBE7F215265B5A8CBF8F8\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_21.Children(2).Children.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_21.Children(2).Children.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_3.Children(2).Children.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"Leave\"\nmsgstr \"Partir\"\n\n#. Key:\t2BFD355626080F0A003A025ABE793045\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_21.Children(0).Children.Text\n#. Key:\t2BFEA3D826080F0A003A025ABE79300B\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_3.Children(0).Children.Text\n#. Key:\t2C027C7626080F0A003A025ABE793F5F\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_18.Children(0).Children.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_18.Children(0).Children.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_21.Children(0).Children.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_3.Children(0).Children.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"Accept Challenge\"\nmsgstr \"Accepter le Défi\"\n\n#. Key:\t2EDD3BEF4707FD59FE1ACB9A105F7EFC\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_3.Children(1).Children.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_3.Children(1).Children.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"Give seat\"\nmsgstr \"Laisser sa place\"\n\n#. Key:\t4E4229704C95B2C73050E1AF65A29847\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"Did you come back to prove yourself?\"\nmsgstr \"Vous êtes revenu pour faire vos preuves ?\"\n\n#. Key:\t55B70B0345422648BB579C8D4E42FE86\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_18.Children(1).Children.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_18.Children(1).Children.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"Maybe later\"\nmsgstr \"Peut-être plus tard\"\n\n#. Key:\t62E33EC84A508E57233A6A9AF6DCDFBC\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"Only if you prove yourself worthy one more time.\"\nmsgstr \"Seulement si vous vous montrez digne une fois de plus.\"\n\n#. Key:\t65A8C3BA420B4624960CBAB42930BB5F\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_13.Children(0).Children.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_13.Children(0).Children.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"Not fair\"\nmsgstr \"Pas juste\"\n\n#. Key:\t688C407641B488D0FDC7F98D0F6CA826\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"Is that... is this really happening?\"\nmsgstr \"Est-ce que... est-ce que cela se passe vraiment ?\"\n\n#. Key:\t77A739594D7ADA997DD300A7EE270D8F\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"I have found a seat that fits your size.\"\nmsgstr \"J'ai trouvé un siège qui correspond à votre taille.\"\n\n#. Key:\t8C9BCD2044EE9C5F4826D0B5C5CE22D4\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"Now... are you ready to prove yourself?\"\nmsgstr \"Maintenant... êtes-vous prêt à faire vos preuves ?\"\n\n#. Key:\t8E33C12A42E9EAEDC20CD3B97F3AF9B2\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"Yes, I can.\"\nmsgstr \"Oui, je le peux.\"\n\n#. Key:\t91849BD64325E5B9D8A366921D4D1AA9\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"The best challenges were set aside just for you!\"\nmsgstr \"Les meilleurs défis ont été mis de côté juste pour vous !\"\n\n#. Key:\t97D5940549A753A94A9F5AB46CCE14AF\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"I myself shall test your worthiness.\"\nmsgstr \"Je vais moi-même tester votre valeur.\"\n\n#. Key:\t9A158FA74FF1D9F99F5477856927AC90\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"I will make no exceptions! Your generous act gave me back my spirit. From now on I pledge to perform my task even better.\"\nmsgstr \"Je ne ferai aucune exception ! Votre acte généreux m'a rendu mon esprit. Désormais, je m'engage à m'acquitter encore mieux de ma tâche.\"\n\n#. Key:\tA3863AD64404451005ECE392B123FFAE\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"Errr... maybe a bit later.\"\nmsgstr \"Errr... peut-être un peu plus tard.\"\n\n#. Key:\tAB2F0FFA45E0AF42B6035FA3D1F2D8DB\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"I am truly impressed. I will never forget about your kindness.\"\nmsgstr \"Je suis vraiment impressionné. Je n'oublierai jamais votre gentillesse.\"\n\n#. Key:\tB284259646C0236570CF489DDCD88A29\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"Are you ready to prove yourself?\"\nmsgstr \"Êtes-vous prêt à faire vos preuves ?\"\n\n#. Key:\tB57F0D0442C167DADE576A9CBD2B3E96\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"Thank you! You can have this RuneStone as a compensation.\"\nmsgstr \"Merci ! Vous pouvez avoir cette Pierre Runique comme compensation.\"\n\n#. Key:\tB5F8117A4514A4207059EF8CD1C59420\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"All right, let's do it!\"\nmsgstr \"Très bien, allons-y !\"\n\n#. Key:\tC7DFED0F43E17F90C02E3D94D6F24200\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"What? Can't you just open that gate?\"\nmsgstr \"Quoi ? Tu ne peux pas juste ouvrir cette porte ?\"\n\n#. Key:\tCC1CBB8E4F710B337B3BCC8CB01DB8CE\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"Well that's very... kind of you, I guess.\"\nmsgstr \"Eh bien, c'est très... gentil de votre part, je suppose.\"\n\n#. Key:\tDE0225744DA0777DC12392ABB187D653\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"Keeper! Can you open a Portal?\"\nmsgstr \"Gardien ! Pouvez-vous ouvrir un Portail ?\"\n\n#. Key:\tDF53D02F4A6CD307A559E5BADBEF22FA\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_13.Children(1).Children.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_13.Children(1).Children.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"You are welcome\"\nmsgstr \"Vous êtes les bienvenus\"\n\n#. Key:\tF0A6481A46B5FC65944D35ABFE94FA7E\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_21.Children(1).Children.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_21.Children(1).Children.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"Give Seat\"\nmsgstr \"Laisser sa Place\"\n\n#. Key:\tFF3C850143B6609D7B1B878B8DEB8A13\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"This is your final trial.\"\nmsgstr \"C'est votre dernier procès.\"\n\n#. Key:\t018CF7BC4272B09AF7B646B0F9B2EB11\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_55.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_55.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"How did it happen? How was everything destroyed?\"\nmsgstr \"Comment cela s'est-il produit ? Comment tout a été détruit ?\"\n\n#. Key:\t0BF674C94942E4E32FCB09BD7E7059B0\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_23.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_23.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"Those who stayed died.\"\nmsgstr \"Ceux qui sont restés sont morts.\"\n\n#. Key:\t1BFE1DBE471281F60970F8BEBFDD6E40\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"It’s nice of the Mirror that he still remembers me. Could you give this flower to him to express my thankfulness?\"\nmsgstr \"C'est gentil de la part du Miroir qu'il se souvienne encore de moi. Pourriez-vous lui donner cette fleur pour lui exprimer ma gratitude ?\"\n\n#. Key:\t2158D7A1470944D529FF138AB883DC10\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"Who lived in this Realm? Where are they now?\"\nmsgstr \"Qui a vécu dans ce Royaume ? Où sont-ils maintenant ?\"\n\n#. Key:\t2CCCBA97402EEFD5248D929680B0FF01\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_26.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_26.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"What was the Realm like before?\"\nmsgstr \"Comment était le Royaume avant ?\"\n\n#. Key:\t32DA4503499D5A01CB1E7DA7B51B4EB5\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_29.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_29.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"Majestic castles and towers up until the sky. The air fresh, the sun shining.\"\nmsgstr \"Des châteaux et des tours majestueuses jusqu'au ciel. L'air frais, le soleil qui brille.\"\n\n#. Key:\t35903E9F471EECEC779D879565E189B6\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_12.Children(1).Children.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_12.Children(1).Children.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"Who lived here?\"\nmsgstr \"Qui a vécu ici ?\"\n\n#. Key:\t3AD2CA8148AA6397B3D8818063269D67\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_14.Children(1).Children.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_14.Children(1).Children.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"No way\"\nmsgstr \"Pas question\"\n\n#. Key:\t3D4AF37842FD602384F0C79F2949BD07\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_14.Children(0).Children.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_14.Children(0).Children.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"Of course\"\nmsgstr \"Bien entendu\"\n\n#. Key:\t41B0D00048A85B7122834B8F731AA8B4\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_25.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_25.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"Ruin preserves them. They can’t get old and die. Some of them are still visiting these parts of the Realm, but they no longer know what they are looking for.\"\nmsgstr \"La Ruine les préserve. Ils ne peuvent pas vieillir et mourir. Certains d'entre eux visitent encore ces parties du Royaume, mais ils ne savent plus ce qu'ils cherchent.\"\n\n#. Key:\t47D0395F4DD63A6E2F68018719DC2CCD\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"Thank you!\"\nmsgstr \"Merci !\"\n\n#. Key:\t57614F674FD8F9A5CF8CC0AFA4D57F37\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_12.Children(0).Children.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_12.Children(0).Children.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"Magic Mirror\"\nmsgstr \"Miroir Magique\"\n\n#. Key:\t5B00385B409CA39C5F2AFDA0E75EC4A0\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"I'm not a postman. Find someone else!\"\nmsgstr \"Je ne suis pas un facteur. Trouvez quelqu'un d'autre !\"\n\n#. Key:\t5C83B0604CB1616D07BE209C08AE57B6\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_27.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_27.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"It was a wonderful world, full of life and joy.\"\nmsgstr \"C'était un monde merveilleux, plein de vie et de joie.\"\n\n#. Key:\t66409DBC4D55F6190D6F429F81CE7C0F\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_12.Children(2).Children.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_12.Children(2).Children.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"Realm's past\"\nmsgstr \"Le Passé du Royaume\"\n\n#. Key:\t6728BD15433EBCF47B42DA8D84F3777C\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"I'll remember you!\"\nmsgstr \"Je me souviendrai de vous !\"\n\n#. Key:\t764C9E864C4C345638C2A2B4019CE5FA\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"Sure, I will deliver the flower!\"\nmsgstr \"Bien sûr, je vais livrer la fleur !\"\n\n#. Key:\t7F42828D4976A3366581BE9E067F3982\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_24.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_24.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"Those who escaped changed in body and mind.\"\nmsgstr \"Ceux qui se sont échappés ont changé de corps et d'esprit.\"\n\n#. Key:\t858E8AD741D48CFB58B94ABA5A6FCE9A\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"No problem. It doesn’t matter anyway.\"\nmsgstr \"Pas de problème. Ce n'est pas grave de toute façon.\"\n\n#. Key:\t86DBF2164E3B1C4057320E8FC526AE5F\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_12.Children(3).Children.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_12.Children(3).Children.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"Cataclysm\"\nmsgstr \"Cataclysme\"\n\n#. Key:\t8C0E746A4C00A7B4792706A042588AA3\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_58.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_58.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"Until one day many of the imprisoned spirits broke loose from the golem bodies.\"\nmsgstr \"Jusqu'au jour où de nombreux esprits emprisonnés se sont libérés des corps de golem.\"\n\n#. Key:\t8DCB54DC429D8E328B791FA18261EBE4\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_30.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_30.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"Until it was all gone.\"\nmsgstr \"Jusqu'à ce que tout cela disparaisse.\"\n\n#. Key:\t933737274ACAC51A980A6985E9B985D2\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"I am here so that the past is not forgotten until the very end. Have some rest and remember!\"\nmsgstr \"Je suis ici pour que le passé ne soit pas oublié jusqu'à la fin. Reposez-vous et souvenez-vous !\"\n\n#. Key:\t9A6C35C143F4B6845772D4AF6C4C6213\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_56.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_56.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"The Golem Makers went too far. They made thousands and thousands of golems.\"\nmsgstr \"Les Créateurs de Golems sont allés trop loin. Ils ont fabriqué des milliers et des milliers de golems.\"\n\n#. Key:\t9E254E4D4CA6D256A7EC8CA8ADC6EF19\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"Would you like to hear some other tales?\"\nmsgstr \"Vous voulez entendre d'autres histoires ?\"\n\n#. Key:\tAC50E6794072B525FD9144AB9B722F74\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_57.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_57.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"They always cared about the new ones and forgot about the obsolete ones.\"\nmsgstr \"Ils se souciaient toujours des nouveaux et oubliaient les anciens.\"\n\n#. Key:\tC03F20E6477984A6691145A40535FBBD\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_60.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_60.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"Is there anything else you want me to remember?\"\nmsgstr \"Y a-t-il autre chose dont vous voulez que je me souvienne ?\"\n\n#. Key:\tC9E74A374ED9F47999AA56BD16466899\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"The streets were clear and bright, trees and flowers everywhere.\"\nmsgstr \"Les rues étaient claires et lumineuses, des arbres et des fleurs partout.\"\n\n#. Key:\tCF0209FF4BC57A750F52F2B3CC710A6E\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"I think it likes you.\"\nmsgstr \"Je pense qu'il vous aime bien.\"\n\n#. Key:\tD11D82FA4AE733D55DCBA692A2A3C0C7\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"Now they are all gone.\"\nmsgstr \"Maintenant, ils sont tous partis.\"\n\n#. Key:\tD88C72AE460756D4B619D7B8F924C7BB\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"Oh, there were many: proud, wise, brave, clever and majestic.\"\nmsgstr \"Oh, ils étaient nombreux : fiers, sages, courageux, intelligents et majestueux.\"\n\n#. Key:\tDEA408E54892798F0112B0A92EE34D3A\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_12.Children(4).Children.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_12.Children(4).Children.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"Leave\"\nmsgstr \"Partir\"\n\n#. Key:\tEA384D06419AAB835765CF8D6ECE6495\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_59.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_59.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"They are what is now called Ruin. The power which is destroying the Realm.\"\nmsgstr \"Ils sont ce qu'on appelle aujourd'hui la Ruine. La puissance qui détruit le Royaume.\"\n\n#. Key:\tED8571C94BCCF0F083CAD2A7439C10AA\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"I’ve met with a Magic Mirror who showed a picture of you.\"\nmsgstr \"J'ai rencontré un Miroir Magique qui m'a montré une photo de vous.\"\n\n#. Key:\tF5C7F8254D29767753AEA3AB446B9B6E\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"I've got to go now.\"\nmsgstr \"Je dois y aller maintenant.\"\n\n#. Key:\tF9E140154471CC466095ADBFF652E94D\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"Ask if you need to know more. I'll remember.\"\nmsgstr \"Demandez si vous avez besoin d'en savoir plus. Je m'en souviendrai.\"\n\n#. Key:\t04527B3745611117185CC09C4CD9018E\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"That’s more like it!\"\nmsgstr \"C'est mieux comme ça !\"\n\n#. Key:\t11C31D4D4DFD60259D68FCB3CD8E641E\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_13.Children(2).Children.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_13.Children(2).Children.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"Retreat\"\nmsgstr \"Partir\"\n\n#. Key:\t29C3FE594DDD364CEED5EA9304BFAC43\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"How can I prove that I'm worthy?\"\nmsgstr \"Comment puis-je prouver que j'en suis digne ?\"\n\n#. Key:\t2BC9EBB6451DB66B7767F1A0B663A06D\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"That’s awful, let’s try it in a different tone.\"\nmsgstr \"C'est affreux, essayons de le faire sur un autre ton.\"\n\n#. Key:\t2BD75DF026080F0A003A0178BE75C345\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"Behold traveler!\"\nmsgstr \"Voici le voyageur !\"\n\n#. Key:\t302884BD4A306FB9614C51AF4790FAE4\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_13.Children(0).Children.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_13.Children(0).Children.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"How to prove?\"\nmsgstr \"Comment le prouver ?\"\n\n#. Key:\t370AC3D04CB9F6E443CAC2A8E270F289\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"No problem I don't really want to pass that gate anyway.\"\nmsgstr \"Pas de problème, je n'ai pas vraiment envie de passer cette porte de toute façon.\"\n\n#. Key:\t4E231ED94F0794AE6342A8A2C7644D51\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"I am the Gatekeeper. I will only open this door if you prove to be worthy.\"\nmsgstr \"Je suis le Gardien du Portail. Je n'ouvrirai cette porte que si vous en êtes digne.\"\n\n#. Key:\t4F30265A4D22C52371CC8E9E188B2718\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"Open, now!\"\nmsgstr \"Ouvrez, maintenant !\"\n\n#. Key:\t56B5D73646C6823598232BB3D2577305\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"Ask him to open the door.\"\nmsgstr \"Demandez-lui d'ouvrir la porte.\"\n\n#. Key:\t7A52E2E14341A8CDBD77A4A30DDA22E3\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_13.Children(1).Children.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_13.Children(1).Children.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"Please let me in\"\nmsgstr \"Veuillez me laisser entrer\"\n\n#. Key:\t835098BD4F5D14FAACF1209850607E04\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_15.Children(0).Children.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_15.Children(0).Children.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"Accept Challenge.\"\nmsgstr \"Accepter le Défi.\"\n\n#. Key:\t83E15A3C46A1D2D4CE4FDDBE81130106\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"No way! Nobody can skip the Trial!\"\nmsgstr \"Pas question ! Personne ne peut échapper à l'Épreuve !\"\n\n#. Key:\t86D9667C43253BBFFA43E4ABED24369B\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"Still not...\"\nmsgstr \"Toujours pas...\"\n\n#. Key:\t94A0124A401BA0CD029255B7D01E087E\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"There is no turning back now. The Trial awaits you!\"\nmsgstr \"Il n'y a plus de retour en arrière possible. L'Épreuve vous attend !\"\n\n#. Key:\t964E5DC7491720F8C3EA53936CBC1DEA\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"The Trial will test you!\"\nmsgstr \"L'Épreuve vous donnera du fil à retordre !\"\n\n#. Key:\tA38AC02A4C258F538AC26686207D505F\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"...\"\nmsgstr \"...\"\n\n#. Key:\tABA8061E4F631608D712A0BDBC6D90D1\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"Ah, you can't speak! Hmm... Try now!\"\nmsgstr \"Ah, vous ne pouvez pas parler ! Hmm... Essayez maintenant !\"\n\n#. Key:\tDA4C66AB4F7798DAD95EC5B83D422A03\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"Could you just let me pass this time?\"\nmsgstr \"Pourriez-vous me laisser passer cette fois-ci ?\"\n\n#. Key:\tF09A0C3F4BEA6AFBC9EE52AEB6A740AB\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"Open that gate, Keeper!\"\nmsgstr \"Ouvrez cette porte, Gardien !\"\n\n#. Key:\tF32B1FEC4BB33670D336D28832F04312\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"I can only open this door for those who prove worthy.\"\nmsgstr \"Je ne peux ouvrir cette porte qu'à ceux qui en sont dignes.\"\n\n#. Key:\tFB74F24C4B8C2E6B4368B19D77F71606\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"Please, open the...\"\nmsgstr \"S'il vous plaît, ouvrez...\"\n\n#. Key:\t0BAD4DEA4009823275249FB31070D002\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_7.Children(1).Children.Text\n#. Key:\t2F2169444BBDC9843E1B7DAEDE7F5104\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_4.Children(1).Children.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_4.Children(1).Children.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_7.Children(1).Children.Text\nmsgctxt \"Dialogue_GGGateKeeper2\"\nmsgid \"Leave\"\nmsgstr \"Partir\"\n\n#. Key:\t36FDC8384686644248F76B9EF8A22038\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_GGGateKeeper2\"\nmsgid \"Here we go again...\"\nmsgstr \"Nous y revoilà...\"\n\n#. Key:\t3D7557464E3E19A1CF3447B555D4977D\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_GGGateKeeper2\"\nmsgid \"Well, of course.\"\nmsgstr \"Eh bien, bien sûr.\"\n\n#. Key:\t5463C10D4C56C2CD40338A9E5C33D995\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_GGGateKeeper2\"\nmsgid \"You know the rules.\"\nmsgstr \"Vous connaissez les règles.\"\n\n#. Key:\t6E1915BC4A79E949C10BDCAADDA1E481\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_7.Children(0).Children.Text\n#. Key:\tACC5EBF441036AE06D207281CBE054D9\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_4.Children(0).Children.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_4.Children(0).Children.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_7.Children(0).Children.Text\nmsgctxt \"Dialogue_GGGateKeeper2\"\nmsgid \"Accept Challenge\"\nmsgstr \"Accepter le Défi\"\n\n#. Key:\tA5CD165646DA7D531D23F7AAE5B0D701\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_GGGateKeeper2\"\nmsgid \"I mean: You shall not pass unless you prove yourself worthy!\"\nmsgstr \"Je veux dire : Vous ne passerez pas si vous ne vous en montrez pas digne !\"\n\n#. Key:\tBABC111D4B5743B296E6AD84659E1910\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_GGGateKeeper2\"\nmsgid \"You shall not pass!!\"\nmsgstr \"Vous ne passerez pas !\"\n\n#. Key:\tCAF6CA2C4159145B5FE684995956F155\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_GGGateKeeper2\"\nmsgid \"What?? I thought I will need to prove myself worthy.\"\nmsgstr \"Quoi ? J'ai pensé que je devrai me montrer digne.\"\n\n#. Key:\t31B0B4214FE4324029BAB2A75CF7D1EA\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/GGSurviverNote.GGSurviverNote:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/GGSurviverNote.GGSurviverNote:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_GGSurviverNote\"\nmsgid \"'I made this statue to give me shelter from the Cataclysm. Only magic can keep it away.'\"\nmsgstr \"'J'ai fait cette statue pour me mettre à l'abri du Cataclysme. Seule la magie peut l'éloigner.'\"\n\n#. Key:\t852F18354CA9C8D46192CBBD14A325F7\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/GGSurviverNote.GGSurviverNote:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/GGSurviverNote.GGSurviverNote:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_GGSurviverNote\"\nmsgid \"'Cerulean is still safe. I managed to steal the Gem to open the Gate but I can’t use it.'\"\nmsgstr \"'Céruléen est toujours en sécurité. J'ai réussi à voler la gemme pour ouvrir la Porte mais je ne peux pas l'utiliser.'\"\n\n#. Key:\tDF72F90C478E18CFE9211C85CEF9ECBF\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/GGSurviverNote.GGSurviverNote:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/GGSurviverNote.GGSurviverNote:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_GGSurviverNote\"\nmsgid \"'I am doomed.'\"\nmsgstr \"'Je suis condamné.'\"\n\n#. Key:\t04737EC246700D406DAB46BE8091D09C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_1.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_1.Children(0).Children.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Sure\"\nmsgstr \"Bien sûr\"\n\n#. Key:\t09BB4D9F428A5390E5F2ABA019B3ACDC\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_34.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_34.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Help you?! This is a courthouse not some charity club!\"\nmsgstr \"A l'aide ! C'est un tribunal, pas un club de charité !\"\n\n#. Key:\t0C7D87814BD76EAFE2DCB19B973F0D82\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_52.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_52.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"You know I heavily rely on my abacus. But being a ghost and all I can’t really use it.\"\nmsgstr \"Vous savez que je compte beaucoup sur mon boulier. Mais être un fantôme fait que je ne peux pas vraiment l'utiliser.\"\n\n#. Key:\t0E3535844D16D540C576AC9889D237C8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"I’m looking for three artefacts. Do you know anything about them?\"\nmsgstr \"Je cherche trois artefacts. Savez-vous quelque chose à leur sujet ?\"\n\n#. Key:\t0EB00CBB41338DE6294D6EAC2DE999B4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Actually it’s kinda awesome!\"\nmsgstr \"En fait, c'est plutôt génial !\"\n\n#. Key:\t158F86F04D0040AA3D2814A674252E45\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Returning again and again is not a crime but maybe we should reconsider the Law regarding this statement.\"\nmsgstr \"Revenir encore et encore n'est pas un crime mais peut-être devrions-nous reconsidérer la Loi concernant cette déclaration.\"\n\n#. Key:\t15D395F84D3DBC3CCBC74988369A74DA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_27.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_27.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"The Law says many things about being dad but nothing about being dead...\"\nmsgstr \"La Loi dit beaucoup de choses sur le fait d'être père, mais rien sur le fait d'être mort...\"\n\n#. Key:\t2487D3CC4FCE404BEC866287E2057B3F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"I can’t rest until the Case is solved.\"\nmsgstr \"Je ne peux pas me reposer tant que l'Affaire n'est pas résolue.\"\n\n#. Key:\t2D976CD148FB41389A53ED8E499822B4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_54.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_54.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Could you get me a ghost abacus?\"\nmsgstr \"Pourriez-vous me trouver un boulier fantôme ?\"\n\n#. Key:\t2F25CC2042D67E3AFB6F3FB5E1DF624D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_38.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_38.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Sure whatever...\"\nmsgstr \"Bien sûr, peu importe...\"\n\n#. Key:\t344253F4469C163E87496A97C193F0A8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_31.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_31.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"If you found her please escort her to the Room of the Law so that her vicious acts can be judged.\"\nmsgstr \"Si vous l'avez trouvée, veuillez l'escorter jusqu'à la Salle de la Loi afin que ses actes vicieux puissent être jugés.\"\n\n#. Key:\t34D243A343CDFEA68F2FAB88A4190464\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_5.Children(2).Children.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_5.Children(2).Children.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"You are dead\"\nmsgstr \"Vous êtes mort\"\n\n#. Key:\t367BD6CD40B7364D09A19A9F5F833937\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Could you help me? I'm forced into this Realm by a Wizard.\"\nmsgstr \"Pourriez-vous m'aider ? Je suis forcé d'entrer dans ce Royaume parce qu'un Magicien m'y a forcé.\"\n\n#. Key:\t3BD4BD5742532C2DB9536F9540EA3D75\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_32.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_32.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Ah, even the World will be over sooner than all our cases.\"\nmsgstr \"Ah, même le Monde sera fini plus tôt que toutes nos affaires.\"\n\n#. Key:\t45882C3C4470919D71E321BF5E1183B9\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_56.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_56.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"I've made you a Ghost Abacus.\"\nmsgstr \"Je vous ai fait un Boulier Fantôme.\"\n\n#. Key:\t482C838F4E946005A3E4CAAB80DFE37F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_35.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_35.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"And being a Wizard is strictly forbidden! If I manage to prove you have some connection with that criminal Wizard I will judge you as well!\"\nmsgstr \"Et être un Magicien est strictement interdit ! Si je parviens à prouver que vous avez un lien avec ce magicien criminel, je vous jugerai également !\"\n\n#. Key:\t489CE6C840D8C3430F07FCBC8BAF3F6B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_23.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_23.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"The Law never writes it would be forbidden to be a walking ball. Therefore it is not a problem.\"\nmsgstr \"La Loi n'écrit jamais qu'il serait interdit d'être une balle qui marche. Ce n'est donc pas un problème.\"\n\n#. Key:\t512723AF4B51C5A843BEACBEA5427877\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Staring like that is strictly forbidden!\"\nmsgstr \"Il est strictement interdit de regarder comme ça !\"\n\n#. Key:\t5215675A4B0974C8993858B9F5D6A404\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"The Case of the Gnome traveller. A really complicated one.\"\nmsgstr \"Le Cas du voyageur Gnome. Un cas très compliqué.\"\n\n#. Key:\t6922D9F143A5295C7C2D22A71EA4125B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_29.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_29.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Makes sense...\"\nmsgstr \"C'est logique...\"\n\n#. Key:\t74955E464A85ED006FF47894FD09BD28\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_4.Text\n#. Key:\tE7F9297B4FF3956A965042AA9D870A07\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_37.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_37.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"The Law says that.\"\nmsgstr \"C'est ce que dit la Loi.\"\n\n#. Key:\t74BCB9E04AB452BA2A11088F25DD2FED\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"I guess they forgot to tell you but work time is long over...\"\nmsgstr \"Je suppose qu'ils ont oublié de vous le dire mais le temps de travail est terminé depuis longtemps...\"\n\n#. Key:\t74F34750433EF722E89F8F85A871CE1B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_59.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_59.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Take this as a reward!\"\nmsgstr \"Prenez cela comme une récompense !\"\n\n#. Key:\t766B27FA455983F70AE1F4BA56F4C1B3\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_57.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_57.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"How wondrous! I’m sure this will reduce my research time with years!\"\nmsgstr \"C'est merveilleux ! Je suis sûr que cela réduira mon temps de recherche avec les années !\"\n\n#. Key:\t784D8662443EA775B9554EAEB4C6CB8F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"You are guilty for bouncing too loudly! Just like my uncle...\"\nmsgstr \"Vous êtes coupable de rebondir très fort ! Tout comme mon oncle...\"\n\n#. Key:\t791A095948CFB22CCAF59EAFC60D74EA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_0.SpeechSequence(1).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_0.SpeechSequence(1).SpeechSequence.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"We had to reread all the rules to find out if there is anything about this.\"\nmsgstr \"Nous avons dû relire toutes les règles pour savoir s'il y avait quelque chose à ce sujet.\"\n\n#. Key:\t7CBAE1084FC39423BBD706A9F939BB14\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"So what is this case you are working on?\"\nmsgstr \"Quelle est donc cette affaire sur laquelle vous travaillez ?\"\n\n#. Key:\t7DBA70D14A4EDDE22DABBBB75800865A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_5.Children(3).Children.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_5.Children(3).Children.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Help\"\nmsgstr \"Aider\"\n\n#. Key:\t7DDD963C45C30134FA79CEAA1834C270\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_1.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_1.Children(1).Children.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"No way\"\nmsgstr \"Pas question\"\n\n#. Key:\t7E1EAB78482CF915AF8A96BA8E0A47F1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Just give me some more time and I will prove that you are guilty.\"\nmsgstr \"Donnez-moi juste un peu plus de temps et je prouverai que vous êtes coupable.\"\n\n#. Key:\t7E2FD8D443438BEFF933D1BA0F691A41\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_1.SpeechSequence(2).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_1.SpeechSequence(2).SpeechSequence.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Such a tragic death! Now I need to start everything from the beginning!\"\nmsgstr \"Une mort si tragique ! Maintenant, je dois tout recommencer depuis le début !\"\n\n#. Key:\t7EA289C94C6CF1E43AE0B291AD0A1133\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_30.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_30.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Yes, she is a criminal for inhabiting the body of a cat. That is strictly forbidden!\"\nmsgstr \"Oui, elle est criminelle pour avoir habité le corps d'un chat. C'est strictement interdit !\"\n\n#. Key:\t80596D1B4384F83D73655AB76B2FA2D0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Incorrect. It is not.\"\nmsgstr \"Mauvaise réponse. Ce n'est pas le cas.\"\n\n#. Key:\t81C42F5340469CBB4AD780B01E7F02F8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_5.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_5.Children(1).Children.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Case\"\nmsgstr \"Cas\"\n\n#. Key:\t830C84A74369239E2839638F8918E086\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_5.Children(4).Children.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_5.Children(4).Children.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Artefacts\"\nmsgstr \"Artéfacts\"\n\n#. Key:\t9090EFE44CB8D7F54F996B970D9A97D2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Don’t disturb me!\"\nmsgstr \"Ne me dérangez pas !\"\n\n#. Key:\t90F79FAC440FB22F0A6BFCABE0963454\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_33.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_33.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"That’s very likely.\"\nmsgstr \"C'est très probable.\"\n\n#. Key:\t9600587D4E3C5B6F2C120BBFB9D40D6A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"What?\"\nmsgstr \"Quoi ?\"\n\n#. Key:\t96945AA143EF1F1B7CE4C0B8EEE4096F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_51.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_51.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"All right I was just asking. It’s not forbidden. At least in this case.\"\nmsgstr \"D'accord, je demandais juste. Ce n'est pas interdit. Au moins dans ce cas.\"\n\n#. Key:\t970DBE99476C7799B4B803B2EECE7E95\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"You are dead. Isn’t that a problem?\"\nmsgstr \"Vous êtes mort. N'est-ce pas un problème ?\"\n\n#. Key:\t9B06B22F44D389959A3C99924145EAE7\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Do you know a girl called Lillian?\"\nmsgstr \"Connaissez-vous une fille qui s'appelle Lillian ?\"\n\n#. Key:\t9C1B37574F81FDF4D3F03890504E3490\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Well, to be honest it is.\"\nmsgstr \"Eh bien, pour être honnête, c'est le cas.\"\n\n#. Key:\t9EE15BCA450900DEFFB839856BA78E09\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_55.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_55.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"I’ll see what I can do...\"\nmsgstr \"Je vais voir ce que je peux faire...\"\n\n#. Key:\t9F3FBDE041EA6FDB7B30ECA1547E49A0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_0.SpeechSequence(3).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_0.SpeechSequence(3).SpeechSequence.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"We almost finished the process when the Gnome Traveller died of waiting.\"\nmsgstr \"Nous avons presque terminé le processus lorsque le Voyageur Gnome est mort en attendant.\"\n\n#. Key:\tA22CEEE34864BC25EECFF2BAED83789F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_18.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_18.Children(0).Children.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"It is\"\nmsgstr \"Il s'agit de\"\n\n#. Key:\tA69BCEA14AD8A07AC8CC35871548973A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_5.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_5.Children(0).Children.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Give Abacus\"\nmsgstr \"Donner le Boulier\"\n\n#. Key:\tA7B9690142A3832182C004A99797AB21\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_26.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_26.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"And how about being dead?\"\nmsgstr \"Et pourquoi pas être mort ?\"\n\n#. Key:\tA7EDDDCF423FF086BC0D0A891D232C87\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_0.SpeechSequence(0).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_0.SpeechSequence(0).SpeechSequence.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"He asked for permission to use the Railway. Which is really unusual. Before him only dwarves used the Railways.\"\nmsgstr \"Il a demandé la permission d'utiliser le Chemin de Fer. Ce qui est vraiment inhabituel. Avant lui, seuls les nains utilisaient le Chemin de fer.\"\n\n#. Key:\tA9FCBAD04E16A880C3E52AAA35864E35\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Respect the Law!\"\nmsgstr \"Respectez la Loi !\"\n\n#. Key:\tAA3210BC4B1C0875817CCDB5F4922AFA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_1.SpeechSequence(0).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_1.SpeechSequence(0).SpeechSequence.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"It’s not that simple. In his testament he asked us to bring his corpse home, on the railway.\"\nmsgstr \"Ce n'est pas si simple. Dans son testament, il nous a demandé de ramener son cadavre à la maison, sur la voie ferrée.\"\n\n#. Key:\tAA9613C041229946AD0033806D77D398\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_49.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_49.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"What can I do for you?\"\nmsgstr \"Que puis-je faire pour vous ?\"\n\n#. Key:\tB2D504404A8475C7EFB445AFDA8597A9\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_5.Children(6).Children.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_5.Children(6).Children.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Leave\"\nmsgstr \"Partir\"\n\n#. Key:\tB3A305B84320145E4C0437B7ED50C5B9\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_25.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_25.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"The Law doesn’t forbid walking for balls. I guess you are right then.\"\nmsgstr \"La Loi n'interdit pas de marcher pour les balles. Je suppose que vous avez raison alors.\"\n\n#. Key:\tB3E56D56494153D0C17355A59EC3F0E6\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Rest... err... work in peace!\"\nmsgstr \"Reposez-vous... euh... travaillez en paix !\"\n\n#. Key:\tB69AD6FC4D8373491561CFBCF26C2397\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_1.SpeechSequence(3).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_1.SpeechSequence(3).SpeechSequence.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Could you help me?\"\nmsgstr \"Pourriez-vous m'aider ?\"\n\n#. Key:\tBCFFF4F345E59362764C9AA6582C683C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_0.SpeechSequence(2).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_0.SpeechSequence(2).SpeechSequence.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"When we found out there are none, so we needed to create new rules. But for that we had to reread all the existing rules again.\"\nmsgstr \"Lorsque nous avons découvert qu'il n'y en avait pas, nous avons dû créer de nouvelles règles. Mais pour cela, nous avons dû relire toutes les règles existantes.\"\n\n#. Key:\tC5FDD0A14882D8F74A97B1BD53AFD4FE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_36.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_36.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"I don’t. But keep in mind if they were stolen and you find them you have to give them to the Dwarven King.\"\nmsgstr \"Je n'en ai pas. Mais n'oubliez pas que s'ils ont été volés et que vous les trouvez, vous devez les donner au Roi Nain.\"\n\n#. Key:\tC81E287C4B4EF5B5E77E25A480FC2AEE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_18.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_18.Children(1).Children.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Not at all\"\nmsgstr \"Pas du tout\"\n\n#. Key:\tCCF4D5D04B8D4C57AAA75ABC5F9A1384\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_50.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_50.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"No, no, no! I have other things to do.\"\nmsgstr \"Non, non, non ! J'ai d'autres choses à faire.\"\n\n#. Key:\tCD5EF4DE4D29CC774EB5A69A8A65CD95\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_5.Children(5).Children.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_5.Children(5).Children.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Lillian\"\nmsgstr \"Lillian\"\n\n#. Key:\tCFC9A6294B4D0653CA9B3384CBD2BC29\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_58.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_58.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Thank you! Thank you!\"\nmsgstr \"Merci ! Merci !\"\n\n#. Key:\tCFEFA4DD4AFEF91C834684A49DFB5890\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_39.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_39.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"What crime did the Gnome commit?\"\nmsgstr \"Quel crime le Gnome a-t-il commis ?\"\n\n#. Key:\tD83C186746373C67E8877594AA3523B8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_53.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_53.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"When I touch it my fingers slip past the abacus, I can’t move it.\"\nmsgstr \"Quand je le touche, mes doigts glissent sur le boulier, je ne peux pas le déplacer.\"\n\n#. Key:\tE00518FA4279FE57E9640F9007E4BC35\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_44.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_44.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"I would call that case solved...\"\nmsgstr \"Je dirais que cette affaire est résolue...\"\n\n#. Key:\tE8F4BE4848BE2E257972D09391B0F296\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_1.SpeechSequence(1).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_1.SpeechSequence(1).SpeechSequence.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"We decided that Gnomes can use the Railway, but how about Gnome Corpses? That’s a totally different issue.\"\nmsgstr \"Nous avons décidé que les Gnomes peuvent utiliser le Chemin de fer, mais qu'en est-il des Corps de Gnomes ? C'est une toute autre question.\"\n\n#. Key:\tEB5B1E474DCFFCF9A38190B8FFAB7C50\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"I guess the same rules apply.\"\nmsgstr \"Je suppose que les mêmes règles s'appliquent.\"\n\n#. Key:\tEB5BFBDC40E1D6A1D5C054AD8B6424FD\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_24.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_24.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Hmmm... Let me see...\"\nmsgstr \"Hmmm... Laisse-moi voir...\"\n\n#. Key:\tEF50A43049824F390D61A3A58D44185A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"And you are a walking ball. Isn’t that a problem?\"\nmsgstr \"Et vous êtes une balle qui marche. N'est-ce pas un problème ?\"\n\n#. Key:\t01E5D5DE4524C5AECBE8DAA5A5C3047D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_111.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_111.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Fishy warns you! This path is dangerous! Turn back! Explore other places!\"\nmsgstr \"Poiscaille vous met en garde ! Ce chemin est dangereux ! Faites demi-tour ! Explorez d'autres endroits !\"\n\n#. Key:\t036B0B0E41C74704A5ED648091D58AB0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_65.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_65.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Long story short I almost reached the Outpost when my cargo went into a pothole and my wheel was broken.\"\nmsgstr \"Pour faire court, j'ai failli atteindre l'Avant-Poste lorsque ma cargaison est tombée dans un nid-de-poule et que ma roue s'est cassée.\"\n\n#. Key:\t03B6BE674D69EF12EB862EB77CDC7F57\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_97.Text\n#. Key:\t4475043D4A9CFD057ED34FBB9695EC86\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_113.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_113.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_97.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Then I will give it for 10 Gold Coins.\"\nmsgstr \"Ensuite, je le donnerai pour 10 Pièces d'Or.\"\n\n#. Key:\t0405D11C4961CFB7941F0F9727F80EAD\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_108.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_108.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"9 Gold I won't go any lower!\"\nmsgstr \"9 Pièces d'Or, je n'irai pas plus bas !\"\n\n#. Key:\t069FA4C94559002699885EACD6422FC7\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_115.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_115.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Such an insult! How dare you?\"\nmsgstr \"Quelle insulte ! Comment osez-vous ?\"\n\n#. Key:\t114F9B9345D0965FE6EFC592E29477FE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_54.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_54.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Wohoo! I have some really epic names just for you! Each name costs a Single Gold coin!\"\nmsgstr \"Wohoo ! J'ai des noms vraiment épiques juste pour vous ! Chaque nom coûte une seule Pièce d'Or !\"\n\n#. Key:\t1164C89641A9E4970985919C8E86936E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(5).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(5).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Help me?\"\nmsgstr \"M'aider ?\"\n\n#. Key:\t11E01CA843185266C441ACBC460A5B06\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_39.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_39.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Do you really want to help me?\"\nmsgstr \"Voulez-vous vraiment m'aider ?\"\n\n#. Key:\t12F669184834CDC0466BA4A72BE38420\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Oh, you come to visit old Gnory again.\"\nmsgstr \"Oh, vous venez encore rendre visite au vieux Gnory.\"\n\n#. Key:\t148C738E422B1C7889EF8CAEF1E6D115\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(7).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(7).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Lory\"\nmsgstr \"Lory\"\n\n#. Key:\t14A787EF447C5AD6579ADDB271BD9B7E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_54.Children(2).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_54.Children(2).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Warlorb\"\nmsgstr \"Warlorb\"\n\n#. Key:\t14F4A36B4D34364D1BBB2DAAFA745C41\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_SpeechSequence_0.SpeechSequence(1).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_SpeechSequence_0.SpeechSequence(1).SpeechSequence.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"I so hated them...\"\nmsgstr \"Je les détestais tellement...\"\n\n#. Key:\t162A7A25421FFB9B368D60A9BC76FD38\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Oh, the three artefacts! That sounds a bit too ambitious but after all, they can be quite a unique gift for a young ball lady.\"\nmsgstr \"Oh, les trois artefacts ! Cela semble un peu trop ambitieux, mais après tout, ils peuvent être un cadeau unique pour une jeune femme de bal.\"\n\n#. Key:\t166AAF5241332C7954631F9D568B227B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_46.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_46.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"For everything as well.\"\nmsgstr \"Pour tout également.\"\n\n#. Key:\t19190B2142877E8CBB6F6D8FBB8D2DB1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_42.Text\n#. Key:\t39E546F34A9886487CD938A70468AEC6\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_59.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_42.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_59.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"What?\"\nmsgstr \"Quoi ?\"\n\n#. Key:\t1AF2DDE74542524EEF19CA9567CFBDAF\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_58.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_58.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"{name}? It still sounds a bit weird, but I think I might like it.\"\nmsgstr \"{name}? Cela semble encore un peu bizarre, mais je pense que cela pourrait me plaire.\"\n\n#. Key:\t22D86B8644CA5BFD8D4CA593C5E3A271\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_54.Children(4).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_54.Children(4).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Dr. Ball\"\nmsgstr \"Dr. Balle\"\n\n#. Key:\t2301BDF7421BB3665BED5F92074BB5A2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_84.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_84.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"I’ve found a wheel for you!\"\nmsgstr \"J'ai trouvé une roue pour vous !\"\n\n#. Key:\t25502F154A957ECD33B65E879E65B48B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_56.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_56.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"That's sad. Come back when you have some!\"\nmsgstr \"C'est triste. Revenez quand vous en aurez !\"\n\n#. Key:\t27BF125B4C46E41F58FD45947F1F5CF8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_49.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_49.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Fishy is Fishy!\"\nmsgstr \"Poiscaille est Poiscaille !\"\n\n#. Key:\t294C4DCC4E8A3A07F15BC8B8C1934BB0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_36.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_36.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"I've got to go now!\"\nmsgstr \"Je dois y aller maintenant !\"\n\n#. Key:\t29EEF2B44C1FAE2BBA7518A685FC99B0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"An elixir that makes you attractive to the lady... err... balls?\"\nmsgstr \"Un élixir qui vous rend attirant pour votre dame... euh... balle ?\"\n\n#. Key:\t2A8B24AE4D7C120048DEF2A76FD6D787\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(9).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(9).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Leave\"\nmsgstr \"Partir\"\n\n#. Key:\t2AC10A9B434CEADBA53C1F8C1DB0A26D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_41.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_41.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"I have some at my shop for sale!\"\nmsgstr \"J'en ai à vendre dans mon magasin !\"\n\n#. Key:\t2FCB0CE9458F40E2B6738B93937283D2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_107.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_107.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"See? And I have to listen to him all day!\"\nmsgstr \"Vous voyez ? Et je dois l'écouter toute la journée !\"\n\n#. Key:\t303548794492148A0C7CE9961AB48C77\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_92.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_92.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"It's yours for 12 Gold Coins.\"\nmsgstr \"Il est à vous pour 12 Pièces d'Or.\"\n\n#. Key:\t303B74844F6BC0691F880B970403BE91\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_106.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_106.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Then I will give it for 8 Gold Coins.\"\nmsgstr \"Ensuite, je le donnerai pour 8 Pïèces d'Or.\"\n\n#. Key:\t31FAEB004D0A1ED819BEF4BC369D9FD5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_51.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_51.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"I see one of your wagon wheels is broken.\"\nmsgstr \"Je vois qu'une des roues de votre chariot est cassée.\"\n\n#. Key:\t336F7E9E46DDE33326081E937EC0024A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Don’t care about Fishy. He can’t really speak and I’m not sure if he even understands himself.\"\nmsgstr \"Ne vous souciez pas de Poiscaille. Il ne peut pas vraiment parler et je ne suis pas sûr qu'il se comprenne lui-même.\"\n\n#. Key:\t339A52E04EF86F99DE9BCEAA78F29025\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_66.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_66.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"See you later!\"\nmsgstr \"A plus tard !\"\n\n#. Key:\t34076BD4489E7C92D8DCB9BC1668B775\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_6.Text\n#. Key:\t5FC68B30456EA7BB5A381780426E2279\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_73.Text\n#. Key:\t89C71F00406C5A31D196B4994CEBBA22\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_50.Text\n#. Key:\t93A76F294E3B6B5AB77DD5A04E76F681\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_83.Text\n#. Key:\t9C69D11144FA077481C6C9865E6ED34A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_80.Text\n#. Key:\tA28EA457442D0820F3633A8ECACEDC75\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_76.Text\n#. Key:\tCC8A6DB3424E6813002643A97EFE6644\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_50.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_73.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_76.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_80.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_83.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Shut up Fishy!\"\nmsgstr \"La ferme Poiscaille !\"\n\n#. Key:\t365CB4EB4F04825B34F4ADB42F238552\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_85.Children(2).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_85.Children(2).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"12 Gold\"\nmsgstr \"12 Pièces d'Or\"\n\n#. Key:\t3E650BC4417E6A004AF4549F412B1AF4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_26.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_26.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Ehm, ehm...\"\nmsgstr \"Ehm, ehm...\"\n\n#. Key:\t3E904B7D4D5694B715AC268086A4DB2F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_78.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_78.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"I’ve met another merchant called Lory. Is she your sister you talked about?\"\nmsgstr \"J'ai rencontré un autre marchand qui s'appelle Lory. C'est votre soeur dont vous avez parlé ?\"\n\n#. Key:\t3EB6AD0C4D8896D36393BE878D3D641E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_100.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_100.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"What the holy Coins?! Now I'm getting angry!\"\nmsgstr \"Qu'est-ce que c'est que ces saintes Pièces ?! Maintenant, je me mets en colère !\"\n\n#. Key:\t43099059444ABE91D004D5992065A06F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_7.Text\n#. Key:\t5A2D69454EA8354F3DE4E6BB9D7BD912\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"And Fishy!\"\nmsgstr \"Et Poiscaille !\"\n\n#. Key:\t43602C93451F3A59EB067ABF7A525D41\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Fishy know about them!\"\nmsgstr \"Poiscaille les connaît !\"\n\n#. Key:\t43C2553447FC63D25E26E79ACE5D7316\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_74.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_74.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"He was a good merchant, so he understood. Business is hard. I always say that for a fair price I would even sell myself.\"\nmsgstr \"C'était un bon commerçant, alors il a compris. Les affaires sont difficiles. Je dis toujours que pour un prix juste, je me vendrais moi-même.\"\n\n#. Key:\t477984834246057BF894629ABEA2F0CB\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_116.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_116.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"You know what? 9 Gold Coins! Take it or leave it that's my final offer!\"\nmsgstr \"Vous savez quoi ? 9 Pièces d'Or ! À prendre ou à laisser, c'est ma dernière offre !\"\n\n#. Key:\t477CBB8C451F6255A8A4FAAE8272F700\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_54.Children(5).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_54.Children(5).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Don't buy\"\nmsgstr \"Ne pas acheter\"\n\n#. Key:\t494F3D164E51E73CC76FD689BF2A4435\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_110.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_110.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Then I will give it for 9 Gold Coins.\"\nmsgstr \"Ensuite, je le donnerai pour 9 Pièces d'Or.\"\n\n#. Key:\t4CBFFCE24BDAFBA592E846A4C6827F21\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_102.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_102.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"All right, you won. I will give it for 11 Gold Coins.\"\nmsgstr \"Très bien, vous avez gagné. Je vous le donne pour 11 Pièces d'Or.\"\n\n#. Key:\t4D29AE254413D052D6FAA7AA259E2618\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_45.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_45.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"I see you do have a solution for everything.\"\nmsgstr \"Je vois que vous avez une solution pour tout.\"\n\n#. Key:\t4EACFFA1414DBB56AA162789D34C76F2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_61.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_61.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Wow, that's magnificent!\"\nmsgstr \"Wow, c'est magnifique !\"\n\n#. Key:\t4F5CF94B464ED01AB43521A56D7C3B13\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_53.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_53.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"I want to buy a new name!\"\nmsgstr \"Je veux acheter un nouveau nom !\"\n\n#. Key:\t51F2252D44A1B1B8B407938C06378303\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Fishy know a poem.\"\nmsgstr \"Poiscaille connaît un poème.\"\n\n#. Key:\t540DEA6540589E8E9BD5789F708F1D95\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_85.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_85.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"How much do you charge for it?\"\nmsgstr \"Combien demandez-vous pour cela ?\"\n\n#. Key:\t551FA87F4EC33961257CFBA46B24E39C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_25.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_25.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Oh, holy golden coins please no...\"\nmsgstr \"Oh, saintes pièces d'or s'il vous plaît non...\"\n\n#. Key:\t55C0627D41EBB98609EDA49E36CE00F3\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_87.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_87.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Tummm-dummm I would sell the whole World but who could possibly buy it?\\r\\nUhhh... Yes?\"\nmsgstr \"Tummm-dummm je vendrais le monde entier mais qui pourrait l'acheter ?\\nEuhhh... Oui ?\"\n\n#. Key:\t5977C80F49FF140CD397C1A3079F8A4C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_54.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_54.Children(1).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Ultimate Frisbee\"\nmsgstr \"Frisbee Ultime\"\n\n#. Key:\t5D529690413CAE4F496DF4B7A3627528\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(6).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(6).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Broken wheel?\"\nmsgstr \"Une roue cassée ?\"\n\n#. Key:\t5D632016493E1D06116399A364FD3835\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_67.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_67.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Take care and don't spend Gold anywhere else!\"\nmsgstr \"Faites attention et ne dépensez pas l'or ailleurs !\"\n\n#. Key:\t5F1DF4B44C4E82D6A5FDB6BDF5172AEA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_96.Text\n#. Key:\t9592C2144A7237D49EC42E898AB73642\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_105.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_105.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_96.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"How about 10?\"\nmsgstr \"Que diriez-vous de 10 ?\"\n\n#. Key:\t6179A2AF43798114CFEE12900CDAF8CA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_60.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_60.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Good choice!\"\nmsgstr \"Bon choix !\"\n\n#. Key:\t6185906046DAF51843A52FA2FE2CF5AC\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_101.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_101.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"11 Gold Coins! Take it or leave it that's my final offer!\"\nmsgstr \"11 Pièces d'Or ! À prendre ou à laisser, c'est ma dernière offre !\"\n\n#. Key:\t655C05DA44E2BCB7DCF0D38DFAD6182C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Let him tell the poem!\"\nmsgstr \"Qu'il raconte le poème !\"\n\n#. Key:\t68761B744A892F85CEDB19B8DD6D9649\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_SpeechSequence_0.SpeechSequence(2).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_SpeechSequence_0.SpeechSequence(2).SpeechSequence.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Then I found out there is a Dwarven Outpost here which is still populated.\"\nmsgstr \"Puis j'ai découvert qu'il y a ici un Avant-poste Nain qui est toujours peuplé.\"\n\n#. Key:\t6D8190E2491C99D14C4E37AA8F01E0BC\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"In Crossroad Cave the three are close.\\r\\nThough where exactly? This poem shows:\\r\\nFor the first one you need to be restless\\r\\nTo avoid the Catacomb death traps.\\r\\nFor the second you need to go down\\r\\nDeep until you reach the ancient fisher town.\\r\\nFor the third one go high and even higher,\\r\\nKeep on til you reach the never sleeping fire.\\r\\n\"\nmsgstr \"À la Croisée des Chemins, les trois sont rapprochés.\\nMais où exactement ? Ce poème va le démontrer :\\nPour le premier, il faut être en trombe\\nPour éviter les pièges mortels des Catacombes.\\nPour le second, vous devez descendre en profondeur\\nJusqu'à l'ancienne ville de pêcheurs.\\nPour le troisième, allez plus haut encore et encore,\\nContinuez jusqu'à ce que vous atteigniez le feu qui jamais ne dort.\\n\"\n\n#. Key:\t6F09C2F74E536AB6E4E7D8941571FBDF\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Sure. Shut up Fishy!\"\nmsgstr \"Oui. La ferme Poiscaille !\"\n\n#. Key:\t720870EC444670FB23244D964497F883\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_SpeechSequence_1.SpeechSequence(1).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_SpeechSequence_1.SpeechSequence(1).SpeechSequence.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"However business is business. She is bad for business! Trading with my customers before they could get to me!\"\nmsgstr \"Cependant, les affaires sont les affaires. Elle est mauvaise pour les affaires ! Je fais du commerce avec mes clients avant qu'ils ne m'atteignent !\"\n\n#. Key:\t757069804B91FF89516ACDA0C1F59C6A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_103.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_103.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Arrrgh! Fishy please no more poems! My head aches.\"\nmsgstr \"Arrrgh ! Poiscaille, s'il te plaît, plus de poèmes ! J'ai mal à la tête.\"\n\n#. Key:\t75A193EA4F6A7EE92BA73D809247B1A1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_62.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_62.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Dr. who? Oh, see, Dr. Ball.\"\nmsgstr \"Dr. qui ? Oh, oui, Dr. Balle.\"\n\n#. Key:\t75EADAAB4ACE4E6ECE45BFA6611ED77A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_85.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_85.Children(0).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"8 Gold\"\nmsgstr \"8 Pièces d'Or\"\n\n#. Key:\t7657DDE7438385D8BCC4B08B2BB5881A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_SpeechSequence_0.SpeechSequence(0).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_SpeechSequence_0.SpeechSequence(0).SpeechSequence.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"It all started when I was back with my family. Oh, those peaceful moments!\"\nmsgstr \"Tout a commencé quand je suis revenu dans ma famille. Oh, ces moments de paix !\"\n\n#. Key:\t778E6A484D8669761018F38DF326C125\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_90.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_90.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"It's yours for 8 Gold Coins.\"\nmsgstr \"C'est à vous pour 8 Pièces d'Or.\"\n\n#. Key:\t7A09AFFF435CC002F0B75989307D7791\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Well met dear err... traveler! How can a humble gnome merchant like me be at your service?\"\nmsgstr \"Bien rencontré cher err... voyageur ! Comment un humble gnome marchand comme moi peut-il être à votre service ?\"\n\n#. Key:\t7E964EEC4406A06910B333A0F282360A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_70.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_70.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Sure! She is the lovely lady ball for whom you would like to buy a precious present, right?\"\nmsgstr \"Bien sûr ! C'est la charmante dame de bal pour laquelle vous souhaitez acheter un précieux cadeau, n'est-ce pas ?\"\n\n#. Key:\t85D756624371CC3B3A37FC84C111DBB0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_54.Children(3).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_54.Children(3).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Sorbcerer\"\nmsgstr \"Sorbcier\"\n\n#. Key:\t86C8F9B74B869FF4D34CF586AB5AC25E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_20.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_20.Children(1).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Shut up!\"\nmsgstr \"La ferme !\"\n\n#. Key:\t8701305446A6E0F5E5EA5F86B823273D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Shut up both of you!\"\nmsgstr \"La ferme vous deux !\"\n\n#. Key:\t878BA65D462254D8A0FD36BA541E8C70\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_27.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_27.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"The three artefacts - by Fishy:\"\nmsgstr \"Les trois artéfacts - par Poiscaille :\"\n\n#. Key:\t8A136EF74C7DE15BFBC664B8447366F1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(2).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(2).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"I need a name\"\nmsgstr \"J'ai besoin d'un nom\"\n\n#. Key:\t8C25603A4AE5F2D6294551AD2BA6322D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_40.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_40.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Of course! Are you lost in this hollow realm? Disappointed in all creature kind? Searching for a helpful hand? Not anymore!\"\nmsgstr \"Bien sûr ! Êtes-vous perdu dans ce royaume perdu ? Déçu par toute sorte de créatures ? Vous cherchez une main charitable ? Plus maintenant !\"\n\n#. Key:\t90F345C4482C46F4B1CD43B20F01B2B6\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_54.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_54.Children(0).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Epic Sphero\"\nmsgstr \"Sphère Épique\"\n\n#. Key:\t92F1D4A84B3609FDE38C82AD5A314554\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_72.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_72.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"And Fishy is the primitive monster.\"\nmsgstr \"Et Poiscaille est le monstre primitif.\"\n\n#. Key:\t9574E444465834A7D15565A14C7E0F1D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_SpeechSequence_0.SpeechSequence(5).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_SpeechSequence_0.SpeechSequence(5).SpeechSequence.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"My sister sold my brother, so I had enough money to set out.\"\nmsgstr \"Ma sœur a vendu mon frère, j'avais donc assez d'argent pour partir.\"\n\n#. Key:\t976FD7AB4B31747EF35E3EBE9C82471F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_69.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_69.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Do you know a girl called Lillian?\"\nmsgstr \"Connaissez-vous une fille qui s'appelle Lillian ?\"\n\n#. Key:\t9851A2064648DE26EF4501961D721109\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_68.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_68.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Wake up! He is back!\"\nmsgstr \"Réveillez-vous ! Il est de retour !\"\n\n#. Key:\t99CDA18D43B5FC74E152888E674B743C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_30.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_30.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Let’s talk about something else.\"\nmsgstr \"Parlons d'autre chose.\"\n\n#. Key:\t9A5056F7472381107ACF5F849A322947\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_64.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_64.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Bye!\"\nmsgstr \"Au revoir !\"\n\n#. Key:\t9B4816554539F6616741FC8A6651FEDD\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_SpeechSequence_1.SpeechSequence(2).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_SpeechSequence_1.SpeechSequence(2).SpeechSequence.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"I will tell her what I think about this that’s for sure!\"\nmsgstr \"Je vais lui dire ce que j'en pense, c'est sûr !\"\n\n#. Key:\t9FD161AC488FFD8D9C6BCAB518A6DFCA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_86.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_86.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Hello again!\"\nmsgstr \"Bonjour à nouveau !\"\n\n#. Key:\t9FFADAA44EE730442CFD76BBD942F478\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_38.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_38.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Fare thee well!\"\nmsgstr \"Adieu à vous !\"\n\n#. Key:\tA0E3F7B44422A97F22E1FCB315DC498A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_48.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_48.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Who are you by the way?\"\nmsgstr \"Au fait, qui êtes-vous ?\"\n\n#. Key:\tA3EE773446B69B8D37851BAFAD607A9F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_24.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_24.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Forget your artefacts I have plenty of other valuable items instead!\"\nmsgstr \"Oubliez vos artefacts, j'ai plein d'autres objets de valeur à la place !\"\n\n#. Key:\tA557A981439B7A1B4AA803941A8D6794\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_23.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_23.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"I guess you don’t know where they are...\"\nmsgstr \"Je suppose que vous ne savez pas où ils sont...\"\n\n#. Key:\tA571474F44F33104D2F93386A5C4009C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_75.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_75.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Yet no one ever wanted to buy him for a single copper coin.\"\nmsgstr \"Pourtant, personne n'a jamais voulu l'acheter pour une seule pièce de cuivre.\"\n\n#. Key:\tA67ADB3143798188EF7C1F8D4E59690C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_88.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_88.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Uhhh... Yes?\"\nmsgstr \"Euhh... Yes?\"\n\n#. Key:\tA69D35084A31B957410EF889ED0EC4A4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_57.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_57.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Yes, yes that's it!\"\nmsgstr \"Oui, oui, c'est ça !\"\n\n#. Key:\tAD70372E4A5B0594635FBBBE30CA53F1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_91.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_91.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"It's yours for 10 Gold Coins.\"\nmsgstr \"Il est à vous pour 10 Pièces d'Or.\"\n\n#. Key:\tAE2E742F4A087974019D8F810FF97A2E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_104.Children(0).Children.Text\n#. Key:\tB59E143642BBE2D677AA6F97B46C3C06\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_105.Children(0).Children.Text\n#. Key:\tF0726C6B4F8F780C341F319D08E20CF9\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_96.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_104.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_105.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_96.Children(0).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Ok\"\nmsgstr \"D'accord\"\n\n#. Key:\tAF7B14B241CED9B8BE3F23BC8C857A9A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_82.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_82.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Now you can imagine those peaceful moments when they were all together.\"\nmsgstr \"Vous pouvez maintenant imaginer ces moments paisibles où ils étaient tous ensemble.\"\n\n#. Key:\tB2F8DA594F1A58E8B2FCC7B16C368E21\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"What... uhhh... me?\"\nmsgstr \"Quoi... euh... moi ?\"\n\n#. Key:\tBA5B75CD4087B53BB682CD97021FF821\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(3).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(3).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Artefacts\"\nmsgstr \"Artéfacts\"\n\n#. Key:\tBBB67671475F19135DCD57AF771F0D85\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_43.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_43.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Helpful hands of course and all kind of stuffs. Equip yourself. Once you get rid of all your gold, you won’t be alone anymore...\"\nmsgstr \"Des mains serviables, bien sûr, et toutes sortes de choses. Équipez-vous. Une fois que vous vous serez débarrassé de tout votre or, vous ne serez plus seul...\"\n\n#. Key:\tBD1AF6114DA5840A340F8DA65B7F59D2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_SpeechSequence_1.SpeechSequence(0).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_SpeechSequence_1.SpeechSequence(0).SpeechSequence.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Yes, she is my beloved sister!\"\nmsgstr \"Oui, c'est ma sœur bien-aimée !\"\n\n#. Key:\tBE8F496743A57B5F1AF81B8D48F128FE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Hello there!\"\nmsgstr \"Bonjour à tous !\"\n\n#. Key:\tBFA7C31A4443A6C89DB61D8556D62FCD\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(0).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Trade\"\nmsgstr \"Échanger\"\n\n#. Key:\tC29FF9914C8C1F479E9F7BAB338B067A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_77.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_77.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"If you could bring me a new wheel I would pay for it with shiny Gold coins!\"\nmsgstr \"Si vous pouviez m'apporter une nouvelle roue, je la paierais avec des pièces d'Or brillantes !\"\n\n#. Key:\tC5077FC14569C44087272C9E9DE07992\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_34.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_34.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Ok, I’ve got it.\"\nmsgstr \"Ok, je l'ai.\"\n\n#. Key:\tC6F3C52D4719CE471B6EEB90FCE94E3B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_55.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_55.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Unfortunately I don't have enough gold.\"\nmsgstr \"Malheureusement, je n'ai pas assez d'or.\"\n\n#. Key:\tCA1E8A5D4C07A81975C4B4B00572A0C8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_94.Text\n#. Key:\tDB9C0DB146BBE1DFC28F929A37C4408A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_93.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_93.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_94.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Ha-ha-ha! You must be kidding that's ridiculously high!\"\nmsgstr \"Ha-ha-ha ! Vous devez plaisanter, c'est ridiculement haut !\"\n\n#. Key:\tCB792FAD45F78755935423A5219271FC\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_98.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_98.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"9 Gold I won't go any higher!\"\nmsgstr \"9 Pièces d'Or, je n'irai pas plus haut !\"\n\n#. Key:\tCE99919C42EC2315EC5B33900FBC09C4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_95.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_95.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"That’s not fair. It would be a shame on me if I just robbed you like that!\"\nmsgstr \"Ce n'est pas juste. Ce serait une honte pour moi si je vous volais comme ça !\"\n\n#. Key:\tD090388E4529CEC2D70899B520973064\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(4).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(4).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Who are you?\"\nmsgstr \"Qui êtes-vous ?\"\n\n#. Key:\tD0AA81A247BE4979A774F3B6095BB820\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_33.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_33.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"I am Gnory, traveler merchant. I wander the world, seeking rare items, secrets beneath dark doors, revealing truth of forg...\"\nmsgstr \"Je suis Gnory, marchand voyageur. J'erre dans le monde, à la recherche d'objets rares, de secrets sous des portes sombres, révélant la vérité de l'oubli...\"\n\n#. Key:\tD23C65EB4F39580A06045FADE2BCD713\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_81.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_81.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"She saw our Realm through cat eyes,\\r\\nThe living fire, the dead ice.\\r\\nShe cared, she took care of us all.\\r\\nWhat was ruined she made it whole.\\r\\nThen she left us, this is how it ended.\\r\\nHer own Realm also needed to be mended.\\r\\n\"\nmsgstr \"Elle a vu notre Royaume à travers des yeux de chat,\\nLa glace figée, le feu en éclat.\\nElle s'en est souciée, elle a pris soin de nous.\\nCe qui était en ruines, elle l'a remis debout.\\nPuis elle nous a quittés, c'est ainsi que ça s'est terminé.\\nSon propre Royaume avait aussi besoin d'être réparé.\\n\"\n\n#. Key:\tD30843A14519A490FEE89E82E3CB6735\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"I’m looking for three artefacts.\"\nmsgstr \"Je suis à la recherche de trois artefacts.\"\n\n#. Key:\tD9B70A6A453A11FD2115FFB25CCFF195\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_54.Children(6).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_54.Children(6).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Not enough gold\"\nmsgstr \"Pas assez d'or\"\n\n#. Key:\tDB8982994F2BFF510A6A2EA1D40C68C6\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_37.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_37.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Good bye!\"\nmsgstr \"Au revoir !\"\n\n#. Key:\tDC20CC924E5F898E715B668416678CA1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_104.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_104.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"How about 8?\"\nmsgstr \"Pourquoi pas 8 ?\"\n\n#. Key:\tDC989DED42077EBA3313C69150BB33F0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_63.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_63.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"That's a weird name I have to admit.\"\nmsgstr \"C'est un nom bizarre, je dois l'admettre.\"\n\n#. Key:\tDEC95D494680878D544FF49DACBDEE4F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_114.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_114.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"11 Gold I won't go any lower!\"\nmsgstr \"11 Pièces d'Or, je n'irai pas plus bas !\"\n\n#. Key:\tDF7B371841495C5FB98800BCF44B7C5B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_52.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_52.Children(1).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Skip yack-yack\"\nmsgstr \"Passer le yack-yack\"\n\n#. Key:\tE1322541414052606F718FBF9B68D4B0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_79.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_79.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Fishy know her.\"\nmsgstr \"Poiscaille la connaît.\"\n\n#. Key:\tE3D668304EE4C7C2E77F3E9AF47CB84E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_SpeechSequence_0.SpeechSequence(4).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_SpeechSequence_0.SpeechSequence(4).SpeechSequence.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Fortunately I had a loving family I could always count on. Since they are all merchants, they could easily help me out.\"\nmsgstr \"Heureusement, j'avais une famille aimante sur laquelle je pouvais toujours compter. Comme ils sont tous commerçants, ils pouvaient facilement m'aider.\"\n\n#. Key:\tE5031E774F81A45ECB4731BC114AD2E2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_109.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_109.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"All right, no need to get angry! I can give you 9 Gold for it.\"\nmsgstr \"Bon, pas besoin de se mettre en colère ! Je peux vous donner 9 Pièces d'Or pour ça.\"\n\n#. Key:\tEBE094644F9C8DCEE025FDBF8346AD47\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_44.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_44.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"...with your problem.\"\nmsgstr \"...avec votre problème.\"\n\n#. Key:\tEC93512B48219F6BA6DDF5A3F100C19A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Show me what you have for sale!\"\nmsgstr \"Montrez-moi ce que vous avez à vendre !\"\n\n#. Key:\tECF244164CDD4A29C96BBD8E13688FE7\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(1).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Sell Wheel\"\nmsgstr \"Vendre la Roue\"\n\n#. Key:\tED410B224B09EFF36ED2AC9752AD59DA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_71.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_71.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"No, she is...\"\nmsgstr \"Non, elle est...\"\n\n#. Key:\tEDE4BF2D448CAFEF217C5E86885A7E81\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_117.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_117.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"All right, you won. I will give it for 9 Gold Coins.\"\nmsgstr \"Très bien, vous avez gagné. Je vous le donne pour 9 Pièces d'Or.\"\n\n#. Key:\tEEA209E84766D4AF2BD804A7BA11F111\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_85.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_85.Children(1).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"10 Gold\"\nmsgstr \"10 Pièces d'Or\"\n\n#. Key:\tEEE19423423A24146446EEBEB04FAEE9\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"I’m on a quest to find...\"\nmsgstr \"Je suis en quête de...\"\n\n#. Key:\tF53E6D3443D37DA82663D2976AA90A85\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_20.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_20.Children(0).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Poem?\"\nmsgstr \"Un poème ?\"\n\n#. Key:\tF61EDE3940F24B15BE57D8B5A5AC5570\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_99.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_99.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Deal! Here you go!\"\nmsgstr \"Marché conclu ! Et voilà !\"\n\n#. Key:\tF6A527234B894C18C0778C918EB1BA4E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_89.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_89.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Welcome back!\"\nmsgstr \"Bon retour !\"\n\n#. Key:\tF93CBC6640AF6143C7D1C5AA6F8C4ADF\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_52.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_52.Children(0).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Go on\"\nmsgstr \"Continuer\"\n\n#. Key:\tF9EA93DE4B341581745785A7371F797A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(8).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(8).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Lillian\"\nmsgstr \"Lillian\"\n\n#. Key:\tFE3C4C72489A909B4D9F76A483D293AE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_SpeechSequence_0.SpeechSequence(3).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_SpeechSequence_0.SpeechSequence(3).SpeechSequence.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"This was my chance to make a hit as a merchant but I didn’t have the resources for a journey this long.\"\nmsgstr \"C'était ma chance de faire un tabac en tant que commerçant, mais je n'avais pas les ressources pour un voyage aussi long.\"\n\n#. Key:\tFEF58E5B4FB18D128640689499752F75\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_29.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_29.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Do you call this a poem? Pathetic! Hardly any info and what a miserable structure! Shame on you Fishy!\"\nmsgstr \"Vous appelez ça un poème ? Pathétique ! Pratiquement aucune idée et quelle structure misérable ! Honte à vous Poiscaille !\"\n\n#. Key:\tFF66071643E10E94DEFF70B8E20876EE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_52.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_52.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"That's a long and sad story...\"\nmsgstr \"C'est une longue et triste histoire...\"\n\n#. Key:\t1EA717114DFEF4490F58829C2F96566A\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/HW_Candlestick.HW_Candlestick:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E2/HW_Candlestick.HW_Candlestick:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_HW_Candlestick\"\nmsgid \"Even after mom passed the servants kept lighting the candles.\"\nmsgstr \"Même après le décès de maman, les domestiques ont continué à allumer les bougies.\"\n\n#. Key:\t94195B6E4157A1A8BD74BE9224AEED42\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/HW_Candlestick.HW_Candlestick:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E2/HW_Candlestick.HW_Candlestick:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_HW_Candlestick\"\nmsgid \"After Mom got sick she really feared darkness.\"\nmsgstr \"Après que Maman soit tombée malade, elle craignait vraiment l'obscurité.\"\n\n#. Key:\tEF9668BF44D4A52E46ACEA8B82011137\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/HW_Candlestick.HW_Candlestick:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Ending/E2/HW_Candlestick.HW_Candlestick:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_HW_Candlestick\"\nmsgid \"We always needed to light the hallway.\"\nmsgstr \"Nous avions toujours besoin d'éclairer le couloir.\"\n\n#. Key:\t2EECB3024693C7F0EA176BB100D6779A\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/HW_Exit.HW_Exit:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E2/HW_Exit.HW_Exit:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_HW_Exit\"\nmsgid \"This door was really rusty.\"\nmsgstr \"Cette porte était vraiment rouillée.\"\n\n#. Key:\t3C6E4A1C41A7EACE15C101A65BBE997A\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/HW_Exit.HW_Exit:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Ending/E2/HW_Exit.HW_Exit:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_HW_Exit\"\nmsgid \"I had to do something with it otherwise Father would have heard me.\"\nmsgstr \"Il fallait que j'en fasse quelque chose sinon Père m'aurait entendu.\"\n\n#. Key:\t8F63CC8C44D8F8432A66E6B65EC10AF5\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/HW_Exit.HW_Exit:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E2/HW_Exit.HW_Exit:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_HW_Exit\"\nmsgid \"I used oil on this rusty door. I didn’t want to be heard.\"\nmsgstr \"J'ai utilisé de l'huile sur cette porte rouillée. Je ne voulais pas être entendu.\"\n\n#. Key:\t55E7DD2B4C3D8852EC4A64AF44443BDA\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/HW_Explosion.HW_Explosion:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Ending/E1/HW_Explosion.HW_Explosion:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_HW_Explosion\"\nmsgid \"What was this? I have to go back to check what happened!\"\nmsgstr \"Qu'est-ce que c'était ? Je dois y retourner pour vérifier ce qui s'est passé !\"\n\n#. Key:\t8060689940824917F595BF84B4E95A46\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/HW_FRDoor.HW_FRDoor:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E2/HW_FRDoor.HW_FRDoor:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_HW_FRDoor\"\nmsgid \"I always wondered why.\"\nmsgstr \"Je me suis toujours demandé pourquoi.\"\n\n#. Key:\t816B603341386CF6BB3ADCAAD21D68A3\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/HW_FRDoor.HW_FRDoor:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E2/HW_FRDoor.HW_FRDoor:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_HW_FRDoor\"\nmsgid \"Father moved to his workroom and sealed this door.\"\nmsgstr \"Le père s'est installé dans son atelier et a scellé cette porte.\"\n\n#. Key:\t125DACD243EA6EBCE76D8CB9F681C727\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/HW_MRDoor.HW_MRDoor:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E2/HW_MRDoor.HW_MRDoor:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_HW_MRDoor\"\nmsgid \"I felt I should have a last look before I go.\"\nmsgstr \"J'ai pensé que je devais y jeter un dernier coup d'œil avant de partir.\"\n\n#. Key:\tE8250D43437C1B1D45637F9499D20936\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/HW_MRDoor.HW_MRDoor:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E2/HW_MRDoor.HW_MRDoor:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_HW_MRDoor\"\nmsgid \"Mom’s room looked just like it was when she was still alive.\"\nmsgstr \"La chambre de maman ressemblait à ce qu'elle était quand elle était encore en vie.\"\n\n#. Key:\tE0BB63A74E94DA1B327B11BB781EB4DB\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/HW_Painting.HW_Painting:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E2/HW_Painting.HW_Painting:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_HW_Painting\"\nmsgid \"Mom made this painting before she met Father.\"\nmsgstr \"Maman a fait ce tableau avant de rencontrer son Père.\"\n\n#. Key:\tEAD0C13D4BF1D35BDAEC14A3F25901F5\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/HW_Stairs.HW_Stairs:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E2/HW_Stairs.HW_Stairs:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_HW_Stairs\"\nmsgid \"I had to go really softly otherwise Father would have heard me.\"\nmsgstr \"J'ai dû y aller très doucement, sinon Père m'aurait entendu.\"\n\n#. Key:\t0494D36047DDCE114A43C9901618D32B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_44.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_44.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Unfortunately I don't know where you can find them.\"\nmsgstr \"Malheureusement, je ne sais pas où vous pouvez les trouver.\"\n\n#. Key:\t0C3E31854B0EB053EABAD4B9DC3D8E60\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_57.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_57.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"That’s a serious threat, I have to admit.\"\nmsgstr \"C'est une menace sérieuse, je dois l'admettre.\"\n\n#. Key:\t0C7C89EB4E610752FBE119AA32B99F8B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_34.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_34.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Yes I know her. She couldn’t come here so she sent her cat.\"\nmsgstr \"Oui, je la connais. Elle ne pouvait pas venir ici, alors elle a envoyé son chat.\"\n\n#. Key:\t0EDE363848C05F39DE478DA7A559CF54\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Could you bring them to me?\"\nmsgstr \"Pourriez-vous me les apporter ?\"\n\n#. Key:\t1A914576488DA1393ED641B9F315ABC6\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_53.Text\n#. Key:\t20DA5C2F49DCFADF17F1C983103C0D98\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_29.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_29.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_53.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Thanks!\"\nmsgstr \"Merci !\"\n\n#. Key:\t1E7EE16F451CAB1193F0B8B3939273AA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_62.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_62.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"I managed to defeat one group of the monsters.\"\nmsgstr \"J'ai réussi à vaincre un groupe de monstres.\"\n\n#. Key:\t1F5BE4154412819180B1CA92E5B69377\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(6).Children.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(6).Children.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Artefacts\"\nmsgstr \"Artéfacts\"\n\n#. Key:\t1FE89B7045E586E988BEC18B06BEEBDB\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(1).Children.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Purple Mushroom\"\nmsgstr \"Champignon Violet\"\n\n#. Key:\t208B21DE484E3FE42C9978927BC91E78\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_51.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_51.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Uh... this was impressive!\"\nmsgstr \"Euh... c'était impressionnant !\"\n\n#. Key:\t27DF1ABB483B5073D8C87DB48EF2613F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_70.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_70.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Well done!\"\nmsgstr \"Bravo !\"\n\n#. Key:\t2892242A4E74642813A30CBAE853B674\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_27.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_27.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Anyway, if you give my Coin back I will apologize.\"\nmsgstr \"Quoi qu'il en soit, si vous me rendez ma Pièce, je vous présenterai mes excuses.\"\n\n#. Key:\t290F9EE34FA4EA41FE963CA61358D23B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_49.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_49.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"In theory if I add this to the soup...\"\nmsgstr \"En théorie, si j'ajoute ça à la soupe...\"\n\n#. Key:\t3015DA144833F0401BADE8B5E5F93BA8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_26.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_26.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Huh! Do you think chests are only there so that you can loot them?\"\nmsgstr \"Huh ! Pensez-vous que les coffres sont là uniquement pour que vous puissiez les piller ?\"\n\n#. Key:\t331D8B314DAF15CD7E343BB7459927DD\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Give back my Coin!\"\nmsgstr \"Rendez-moi ma Pièce !\"\n\n#. Key:\t345BD57D40E09C73044BB981798E2449\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_43.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_43.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Purple Mushrooms. That’s the only mushroom which is purple. You can’t miss it.\"\nmsgstr \"Champignons Violets. C'est le seul champignon qui est violet. Vous ne pouvez pas le manquer.\"\n\n#. Key:\t34B1483D4F1C580BB8DB61BEEBC5BC0F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"I saw that you opened my chest!\"\nmsgstr \"J'ai vu que vous avez ouvert mon coffre !\"\n\n#. Key:\t35DBF2874748AFCC34A3FAAC083EF9A0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_1.SpeechSequence(3).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_1.SpeechSequence(3).SpeechSequence.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"We had the key of the Ancient Temple. According to our prophecies that will fall to Ruin last.\"\nmsgstr \"Nous avions la clé du Temple Ancien. Selon nos prophéties, il succombera à la Ruine en dernier.\"\n\n#. Key:\t35FB567B4B09545830D61F84869FC7E7\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Here you go!\"\nmsgstr \"Et voilà !\"\n\n#. Key:\t3AAE79234A4BD2F8BCA5F790D5E5D84B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_45.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_45.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"No problem. If I ever find one I will bring it to you.\"\nmsgstr \"Pas de problème. Si jamais j'en trouve un, je vous l'apporterai.\"\n\n#. Key:\t3AE46C894A0CD8F1AA049CB9970D65F3\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"I’m the chef and I’m making a soup.\"\nmsgstr \"Je suis le chef et je fais une soupe.\"\n\n#. Key:\t3BB405034447D1C80B99A5A23AFC98FC\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"I know you are already hungry but the soup is not yet ready.\"\nmsgstr \"Je sais que vous avez déjà faim, mais la soupe n'est pas encore prête.\"\n\n#. Key:\t406361704988AD9ABD5DA4AF946451F2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_37.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_37.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"In return Lillian drew pictures for my tales.\"\nmsgstr \"En retour, Lillian a fait des dessins pour mes contes.\"\n\n#. Key:\t4152700A419F5AE41362D09E21835D98\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_46.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_46.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"I already have some...\"\nmsgstr \"J'en ai déjà...\"\n\n#. Key:\t4355EB74402DDFD5FF8697B1911593E8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_56.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_56.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"I won’t. And I won’t talk to you either.\"\nmsgstr \"Je ne le ferai pas. Et je ne vous parlerai pas non plus.\"\n\n#. Key:\t43C4F54B4ABBBB13E129148D9AF04976\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(4).Children.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(4).Children.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Village\"\nmsgstr \"Village\"\n\n#. Key:\t4614DBA24F54CB29C92BA9894849CC39\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_1.SpeechSequence(1).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_1.SpeechSequence(1).SpeechSequence.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Long ago we lived in peace and respected the ancestors. Even though they caused the Cataclysm.\"\nmsgstr \"Il y a longtemps, nous vivions en paix et nous respections les ancêtres. Même s'ils ont causé le Cataclysme.\"\n\n#. Key:\t4687EF7A45E5FC200C806AB829C64D78\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Is this a village? Where are the others?\"\nmsgstr \"Est-ce un village ? Où sont les autres ?\"\n\n#. Key:\t586F6370480889F551923A97FFF5E89C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_0.SpeechSequence(3).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_0.SpeechSequence(3).SpeechSequence.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"They enslaved all the other tribes and forbid us to do our rituals.\"\nmsgstr \"Ils ont réduit en esclavage toutes les autres tribus et nous interdisent de faire nos rituels.\"\n\n#. Key:\t5BCF2C5D4CE9AD6AB4A09DB510BA2039\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"You again? Take a seat until the soup is ready!\"\nmsgstr \"Encore vous ? Asseyez-vous jusqu'à ce que la soupe soit prête !\"\n\n#. Key:\t63B9B304450B276F0EC714B43A25F09D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"I’m looking for three artefacts. Do you know something about them?\"\nmsgstr \"Je cherche trois artefacts. Savez-vous quelque chose à leur sujet ?\"\n\n#. Key:\t63C0EC124C1B42B5C5FD1F95B23B9155\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_65.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_65.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Take this! You deserve it.\"\nmsgstr \"Prenez ça ! Vous le méritez.\"\n\n#. Key:\t69E0738B489315662A55DA98EAC542E6\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_0.SpeechSequence(4).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_0.SpeechSequence(4).SpeechSequence.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"They used this village to produce Fishy slaves.\"\nmsgstr \"Ils utilisaient ce village pour produire des esclaves de Poiscaille.\"\n\n#. Key:\t6CBCFFEB48FF8E0D97AAE4B1CB19CB52\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_22.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_22.Children(0).Children.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Give back\"\nmsgstr \"Rendre\"\n\n#. Key:\t6EACCB4D4D91AF29F6452E81E4C01B57\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_32.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_32.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"I see you have a lot of things here. Do you have something for sale?\"\nmsgstr \"Je vois que vous avez beaucoup de choses ici. Avez-vous quelque chose à vendre ?\"\n\n#. Key:\t7164FF5D440BCEF18CAC7E9104A324CF\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"I've got to go now!\"\nmsgstr \"Je dois y aller maintenant !\"\n\n#. Key:\t75A92D46421FC2601A13B4BBE9BA4D11\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_54.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_54.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Er... I don’t have it. But I will get it back I promise!\"\nmsgstr \"Euh... je ne l'ai pas. Mais je vais le récupérer, je vous le promets !\"\n\n#. Key:\t761F5734479CFA197266F382FD0A6452\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_23.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_23.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"I’m sorry, I didn’t know it was yours. There are chests like yours everywhere.\"\nmsgstr \"Je suis désolé, je ne savais pas que c'était le vôtre. Il y a des coffres comme le vôtre partout.\"\n\n#. Key:\t7D87C5064D739F1EFF23AF8264E83235\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Well, this morning. But there are some very special ingredients which make the cook time way shorter.\"\nmsgstr \"Eh bien, ce matin. Mais il y a des ingrédients très spéciaux qui raccourcissent considérablement le temps de cuisson.\"\n\n#. Key:\t806AEB764A6118D4CBE9CCA71E98EF10\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_72.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_72.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Have no fear, I'll do it.\"\nmsgstr \"N'ayez pas peur, je vais le faire.\"\n\n#. Key:\t80B60CA848D3C71B72514AAC976C3910\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Yes, the soup! A very special recipe. It takes years to finish.\"\nmsgstr \"Oui, la soupe ! Une recette très spéciale. Il faut des années pour la terminer.\"\n\n#. Key:\t8437D72C44494DE499E528A67B36A123\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_58.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_58.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Ah, it's you again.\"\nmsgstr \"Ah, c'est encore vous.\"\n\n#. Key:\t885F9FDB498EC13B81E22580D33309F3\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(5).Children.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(5).Children.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Kobolds\"\nmsgstr \"Kobolds\"\n\n#. Key:\t8A6043D64FB7B61AF4D553A62D27229C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_36.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_36.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Every time the cat came I told him a tale about the ancestors.\"\nmsgstr \"Chaque fois que le chat venait, je lui racontais une histoire sur les ancêtres.\"\n\n#. Key:\t8B29FD7342676763EF53ACBB0677A1A4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"The soup still needs time.\"\nmsgstr \"La soupe a encore besoin de temps.\"\n\n#. Key:\t8E0F057044AE753D63AA23847B146662\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_67.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_67.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"This is yours.\"\nmsgstr \"Ceci est à vous.\"\n\n#. Key:\t8E4C4FB846539DD46577B490846383F1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_1.SpeechSequence(2).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_1.SpeechSequence(2).SpeechSequence.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"We decided to keep their knowledge in our rituals.\"\nmsgstr \"Nous avons décidé de conserver leur savoir dans nos rituels.\"\n\n#. Key:\t9132C2D24A241722115FD5ADB46B3145\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"And when did you start?\"\nmsgstr \"Et quand avez-vous commencé ?\"\n\n#. Key:\t958CE12E48F89AE79E5ED9A4FC4AF6E7\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_48.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_48.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"That's wonderful!\"\nmsgstr \"C'est merveilleux !\"\n\n#. Key:\t96E5FBCB4795EC1ADACEC7B6D814BD79\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(8).Children.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(8).Children.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Lillian\"\nmsgstr \"Lillian\"\n\n#. Key:\t9845BDB549EF25B9F5C11981123A5CCE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_33.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_33.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"You know I’m not really a trader but I might sell you some of them.\"\nmsgstr \"Vous savez que je ne suis pas vraiment un commerçant, mais je pourrais vous en vendre certains.\"\n\n#. Key:\t9A420B814A1C1762130310AE90157BFD\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_31.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_31.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"No, I’m sorry.\"\nmsgstr \"Non, je suis désolé.\"\n\n#. Key:\t9D8511F94E19183355A5CC8CE5B562E8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_61.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_61.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"That would be great. I appreciate your kindness.\"\nmsgstr \"Ce serait formidable. J'apprécie votre gentillesse.\"\n\n#. Key:\t9F2DE60B405A15F2BFB8409D162B42FD\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(3).Children.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(3).Children.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Soup\"\nmsgstr \"Soupe\"\n\n#. Key:\tA53CDF2A4D9A582DD163C7B6D3DCE334\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_55.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_55.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Come back when you have my Coin.\"\nmsgstr \"Revenez quand vous aurez ma pièce.\"\n\n#. Key:\tA734229B44743F88ED135FB692B9C956\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Do you know a girl called Lillian?\"\nmsgstr \"Connaissez-vous une fille qui s'appelle Lillian ?\"\n\n#. Key:\tA88F63334DD550FE9955A3A65B87ACDA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_63.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_63.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"I banished some of the monsters.\"\nmsgstr \"J'ai banni certains de ces monstres.\"\n\n#. Key:\tA8B5BE484641EBB61B1168AE798DABF5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"So you are making soup...\"\nmsgstr \"Vous faites donc de la soupe...\"\n\n#. Key:\tAAE2E35045B8E0DF8A11BF8BC84A11EF\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_0.SpeechSequence(1).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_0.SpeechSequence(1).SpeechSequence.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Every year we made a pilgrimage to the Ancient Temple to express our respect to the ancestors.\"\nmsgstr \"Chaque année, nous faisions un pèlerinage au Temple Ancien pour exprimer notre respect aux ancêtres.\"\n\n#. Key:\tAC26EB6F49B026C3E768398FA0A445CB\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_50.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_50.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"then...\"\nmsgstr \"puis...\"\n\n#. Key:\tADE8569E4FC2DCB097FF3FA4B9A0A970\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_40.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_40.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Why not? What do you need?\"\nmsgstr \"Pourquoi pas ? De quoi avez-vous besoin ?\"\n\n#. Key:\tAE35D91D450D0414FA5F54B71E359511\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(2).Children.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(2).Children.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Who are you?\"\nmsgstr \"Qui êtes-vous ?\"\n\n#. Key:\tAE387E9846A9C5A56569179359AD941C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_42.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_42.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"All right! I was just asking...\"\nmsgstr \"Très bien ! Je demandais juste...\"\n\n#. Key:\tAF3D9214401FEEE552256A8BAE5F8E77\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_1.SpeechSequence(4).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_1.SpeechSequence(4).SpeechSequence.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"But now Kobolds are wrathful. They make wars. They don’t respect anyone.\"\nmsgstr \"Mais maintenant, les Kobolds sont en colère. Ils mènent des guerres. Ils ne respectent personne.\"\n\n#. Key:\tB06407B04855D558D1DB6B9A9A4E0B84\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_1.SpeechSequence(0).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_1.SpeechSequence(0).SpeechSequence.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Kobolds are no longer good.\"\nmsgstr \"Les Kobolds ne sont plus bons.\"\n\n#. Key:\tB082CC4B405800544484B4B0C8A25762\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_41.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_41.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"No way!\"\nmsgstr \"Pas question !\"\n\n#. Key:\tB35F443641A7626AE4552F8D1045A95F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_38.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_38.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"I liked them very much.\"\nmsgstr \"Je les aimais beaucoup.\"\n\n#. Key:\tB40C1B9948722A549DBC45A1D9C277C0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_24.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_24.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"I don’t want to leave my kitchen.\"\nmsgstr \"Je ne veux pas quitter ma cuisine.\"\n\n#. Key:\tB71FB3424C74B68E4B9CF9AF3828F867\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_64.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_64.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"I think I banished all the monsters.\"\nmsgstr \"Je crois que j'ai banni tous les monstres.\"\n\n#. Key:\tB79F2026493F53FE90BABB987370695D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"What do you think honestly? You can just rob me and then come to have a chat?!\"\nmsgstr \"Qu'en pensez-vous honnêtement ? Vous pouvez juste me voler et ensuite venir discuter !\"\n\n#. Key:\tB7B8A9294FA8D3754BB4CDA897B696BA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_69.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_69.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Great. The lake is already more peaceful.\"\nmsgstr \"Super. Le lac est déjà plus paisible.\"\n\n#. Key:\tB9C3EC7342B52C04A491FF9AE87ABB42\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_0.SpeechSequence(0).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_0.SpeechSequence(0).SpeechSequence.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"This was the Village of my tribe. We lived here in peace.\"\nmsgstr \"C'était le Village de ma tribu. Nous vivions ici en paix.\"\n\n#. Key:\tBB45D70A4F2AF94BA7FCC9B3141FB98F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_17.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_17.Children(0).Children.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Accept\"\nmsgstr \"Accepter\"\n\n#. Key:\tC297D79246A0792DCA2CA9AD693C3A55\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"That’s all.\"\nmsgstr \"C'est tout.\"\n\n#. Key:\tC375726140A40243E29115B58048025E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_52.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_52.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Hmm... it’s delicious. Here take some!\"\nmsgstr \"Hmm... c'est délicieux. Tiens, prends-en un peu !\"\n\n#. Key:\tC8BC1F254B61D749D62D4B9210DA1891\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"If you came for soup you will need to wait a bit more!\"\nmsgstr \"Si vous êtes venu pour de la soupe, vous devrez attendre un peu plus longtemps !\"\n\n#. Key:\tCB607C4842DF3781F8B6C9AB1A7D31F1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Where is my Coin?\"\nmsgstr \"Où est ma Pièce ?\"\n\n#. Key:\tCE80654A43078EA1E53C5E9C5114DE54\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_60.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_60.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"I can help you banish the monsters around the lake.\"\nmsgstr \"Je peux vous aider à bannir les monstres autour du lac.\"\n\n#. Key:\tD1412BF6490EA9357CE9F7A873B1FCAC\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_35.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_35.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"She was really curious about our rituals.\"\nmsgstr \"Elle était très curieuse de nos rituels.\"\n\n#. Key:\tD76CDC9F410E2BCC21BCFB8D0D8A9E97\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_47.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_47.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"I’ve found some Purple Mushroom!\"\nmsgstr \"J'ai trouvé des Champignons Violets !\"\n\n#. Key:\tD87335EA45EAC6F84022FEBE57F5CADF\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_25.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_25.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Or what? Will you cook me?\"\nmsgstr \"Ou alors quoi ? Vous me cuisinerez ?\"\n\n#. Key:\tD9B7F3E240430AA5EF537A8F81814751\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_71.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_71.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"I'm glad that the lake is peaceful again. Thank you!\"\nmsgstr \"Je suis heureux que le lac soit à nouveau paisible. Je vous en remercie !\"\n\n#. Key:\tE15F80EA40F193E47F372FA7EE9A949E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_0.SpeechSequence(5).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_0.SpeechSequence(5).SpeechSequence.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Now they are gone and I'm alone with the monsters they left here.\"\nmsgstr \"Maintenant, ils sont partis et je suis seul avec les monstres qu'ils ont laissés ici.\"\n\n#. Key:\tE3947B064E58A1FD7B96A3956C54415D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_0.SpeechSequence(2).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_0.SpeechSequence(2).SpeechSequence.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"But then other Kobolds came. They called themselves the Great Kobols.\"\nmsgstr \"Mais d'autres Kobolds sont arrivés. Ils se sont appelés les Grands Kobols.\"\n\n#. Key:\tE48A1DFB458275188357F5811E98CFD4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_59.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_59.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"And also take this! I could have not done the soup in time without your help.\"\nmsgstr \"Et prenez aussi ceci ! Je n'aurais pas pu faire la soupe à temps sans votre aide.\"\n\n#. Key:\tE58EEE904A6CBF1A0E2E768583EB03DC\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(7).Children.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(7).Children.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Trade\"\nmsgstr \"Échanger\"\n\n#. Key:\tE60B94C04C63F0E074A5B8ABFED7AE62\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_66.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_66.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"I have something for you.\"\nmsgstr \"J'ai quelque chose pour vous.\"\n\n#. Key:\tEA71F6A6412E69C31302A2B57BFD266F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_39.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_39.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Now they are both gone.\"\nmsgstr \"Maintenant, ils sont tous les deux partis.\"\n\n#. Key:\tECA4BB2D4EB774315D57FD9A5D66CF25\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_22.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_22.Children(1).Children.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Don't give\"\nmsgstr \"Ne pas donner\"\n\n#. Key:\tED97FDEB46CAC89F65734D990569618C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_17.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_17.Children(1).Children.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Decline\"\nmsgstr \"Refuser\"\n\n#. Key:\tEFD0511840178E579287BAB7FA3FDADE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(0).Children.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Banish Monsters\"\nmsgstr \"Bannir les Monstres\"\n\n#. Key:\tF5A08C63415DF9FE007B97931B7A7C31\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(9).Children.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(9).Children.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Leave\"\nmsgstr \"Partir\"\n\n#. Key:\tF7EA437842BBD099521D81B87211F49E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_30.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_30.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"I’m the last of my tribe.\"\nmsgstr \"Je suis le dernier de ma tribu.\"\n\n#. Key:\tFC8F235840D6AF4A86170791A617BCA9\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Who are you? What are you doing here?\"\nmsgstr \"Qui êtes-vous ? Que faites-vous ici ?\"\n\n#. Key:\tFF27D3BF4D181753D73AD79D384CD3ED\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"What are you Kobolds like? What are you doing?\"\nmsgstr \"A quoi ressemblez-vous, Kobolds ? Que faites-vous ?\"\n\n#. Key:\t587277824A24A49F9319D0B452A709AD\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/LB_Device.LB_Device:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Ending/E1/LB_Device.LB_Device:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_LB_Device\"\nmsgid \"Monk wanted me to use this device to separate the Worlds.\"\nmsgstr \"Le Moine voulait que j'utilise cet appareil pour séparer les mondes.\"\n\n#. Key:\t83B9F1E146084039E4BAD185B455209C\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LB_Device.LB_Device:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E2/LB_Device.LB_Device:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_LB_Device\"\nmsgid \"With Father we did all we could to make the device perfect. I won’t let us lose so close to the end!\"\nmsgstr \"Avec Père, nous avons fait tout ce que nous pouvions pour que le dispositif soit parfait. Je ne nous laisserai pas échouer si près du but !\"\n\n#. Key:\t90E0E1E44BE9D84FC514248D73A31935\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LB_Device.LB_Device:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Ending/E2/LB_Device.LB_Device:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_LB_Device\"\nmsgid \"Three years of hard work.\"\nmsgstr \"Trois ans de travail acharné.\"\n\n#. Key:\tFB8EC2184310BA168B9C6E9DB51C4492\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LB_Device.LB_Device:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E2/LB_Device.LB_Device:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_LB_Device\"\nmsgid \"I need to pull the left lever first.\"\nmsgstr \"Je dois d'abord tirer le levier gauche.\"\n\n#. Key:\tDAC636D74C51C30F4B790B9F87203957\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/LB_DeviceUse.LB_DeviceUse:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Ending/E1/LB_DeviceUse.LB_DeviceUse:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_LB_DeviceUse\"\nmsgid \"Er... so far pulling the levers worked but this machine looks fairly complicated.\"\nmsgstr \"Euh... jusqu'à présent, tirer les leviers a fonctionné mais cette machine a l'air assez compliquée.\"\n\n#. Key:\tE0D3606C4F357F03FBC916AA3573A81D\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/LB_DeviceUse.LB_DeviceUse:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E1/LB_DeviceUse.LB_DeviceUse:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_LB_DeviceUse\"\nmsgid \"I should look around to find some instructions on how it works.\"\nmsgstr \"Je devrais regarder autour de moi pour trouver quelques instructions sur son fonctionnement.\"\n\n#. Key:\t2DB770DF48D3199FFDEA3F8AB99126D5\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LB_LeftLever.LB_LeftLever:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Ending/E2/LB_LeftLever.LB_LeftLever:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_LB_LeftLever\"\nmsgid \"I heard them knocking on the door. They surely heard the alarm when I entered.\"\nmsgstr \"Je les ai entendus frapper à la porte. Ils ont sûrement entendu l'alarme quand je suis entré.\"\n\n#. Key:\tB5D008804CCD51DF8CA8F5B99CA0C0FB\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LB_LeftLever.LB_LeftLever:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E2/LB_LeftLever.LB_LeftLever:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_LB_LeftLever\"\nmsgid \"I need to hurry. The middle lever is the next one.\"\nmsgstr \"Je dois me dépêcher. Le levier du milieu est le suivant.\"\n\n#. Key:\tC7B08D314C68A7E4D21E20B128670516\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LB_MiddleLever.LB_MiddleLever:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Ending/E2/LB_MiddleLever.LB_MiddleLever:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_LB_MiddleLever\"\nmsgid \"We both made our decision three years ago.\"\nmsgstr \"Nous avons tous deux pris notre décision il y a trois ans.\"\n\n#. Key:\tFBC301B94D990F1F3FD30383FF916327\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LB_MiddleLever.LB_MiddleLever:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Ending/E2/LB_MiddleLever.LB_MiddleLever:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_LB_MiddleLever\"\nmsgid \"I’ve made my choice.\"\nmsgstr \"J'ai fait mon choix.\"\n\n#. Key:\tFD2036CF4FC103724FB18F83754367A0\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LB_MiddleLever.LB_MiddleLever:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E2/LB_MiddleLever.LB_MiddleLever:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_LB_MiddleLever\"\nmsgid \"I heard the door exploding. Father must be really mad but It doesn’t matter now.\"\nmsgstr \"J'ai entendu la porte exploser. Père doit être vraiment fou, mais ça n'a plus d'importance maintenant.\"\n\n#. Key:\t98F843004F338E4480C942A9B9646BDE\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LB_RightLever.LB_RightLever:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E2/LB_RightLever.LB_RightLever:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_LB_RightLever\"\nmsgid \"I pulled the last lever.\"\nmsgstr \"J'ai tiré le dernier levier.\"\n\n#. Key:\t9F6EBBE74FA6289497401C8E7400B01E\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LR_Bed.LR_Bed:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E2/LR_Bed.LR_Bed:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_LR_Bed\"\nmsgid \"Sleeping wasn’t easy since Mom was gone.\"\nmsgstr \"Dormir n'a pas été facile depuis que Maman est partie.\"\n\n#. Key:\tAE56EE704265B61C84123F9775EB424C\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LR_Bed.LR_Bed:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E2/LR_Bed.LR_Bed:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_LR_Bed\"\nmsgid \"I really couldn’t sleep that night.\"\nmsgstr \"Je n'ai vraiment pas pu dormir cette nuit-là.\"\n\n#. Key:\t344E65304BB63905D487CCAF191DFE95\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LR_Chest.LR_Chest:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Ending/E2/LR_Chest.LR_Chest:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_LR_Chest\"\nmsgid \"It was half past eleven.\"\nmsgstr \"Il était onze heures et demie.\"\n\n#. Key:\t5DD659BE428981065F3A989D284C3542\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LR_Chest.LR_Chest:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E2/LR_Chest.LR_Chest:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_LR_Chest\"\nmsgid \"I took the key.\"\nmsgstr \"J'ai pris la clé.\"\n\n#. Key:\tF21CEE6143FD904B2285F9BEE01174A0\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LR_Chest.LR_Chest:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E2/LR_Chest.LR_Chest:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_LR_Chest\"\nmsgid \"Daddy didn’t like if I went out in the night but I felt something calling for me.\"\nmsgstr \"Papa n'aimait pas que je sorte le soir, mais je sentais que quelque chose m'appelait.\"\n\n#. Key:\t8B18714145E8614E70F531BDB1A2AAAB\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LR_Door.LR_Door:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E2/LR_Door.LR_Door:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_LR_Door\"\nmsgid \"I always locked the door just to make sure I won’t sleep walk out.\"\nmsgstr \"Je fermais toujours la porte à clé pour m'assurer que je ne ferait pas le somnambule.\"\n\n#. Key:\tE5B14EEE4719891E2D2493A4E793A2C4\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LR_Door.LR_Door:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Ending/E2/LR_Door.LR_Door:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_LR_Door\"\nmsgid \"I opened the door.\"\nmsgstr \"J'ai ouvert la porte.\"\n\n#. Key:\tF8090D7B4DCD959D7893338BDA2B6256\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LR_Door.LR_Door:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E2/LR_Door.LR_Door:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_LR_Door\"\nmsgid \"I hid the key under the clock.\"\nmsgstr \"J'ai caché la clé sous l'horloge.\"\n\n#. Key:\t8363A3C9426FA1F007A5E783B1D72171\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LR_Notebook.LR_Notebook:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E2/LR_Notebook.LR_Notebook:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_LR_Notebook\"\nmsgid \"Here I collected all my less scientific notes on the Ruined Realm.\"\nmsgstr \"Ici, j'ai rassemblé toutes mes notes les moins scientifiques sur le Royaume en Ruines.\"\n\n#. Key:\tA0B131B34A29BEADA3E3CDB74C7EDBCA\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LR_Notebook.LR_Notebook:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Ending/E2/LR_Notebook.LR_Notebook:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_LR_Notebook\"\nmsgid \"They deserve to be remembered. I will miss them.\"\nmsgstr \"Ils méritent qu'on se souvienne d'eux. Ils me manqueront.\"\n\n#. Key:\tB66C98C34782719B5CF6F19F608C00F0\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LR_Notebook.LR_Notebook:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E2/LR_Notebook.LR_Notebook:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_LR_Notebook\"\nmsgid \"So many lovely people! Despite their madness.\"\nmsgstr \"Tant de gens charmants ! Malgré leur folie.\"\n\n#. Key:\t0DAF7BA0480BDF56BC47A7826A5186C2\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LR_TabbyBed.LR_TabbyBed:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E2/LR_TabbyBed.LR_TabbyBed:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_LR_TabbyBed\"\nmsgid \"Sometimes I wished there could be a place like that for me as well.\"\nmsgstr \"Parfois, je souhaitais qu'il y ait un endroit comme ça pour moi aussi.\"\n\n#. Key:\t6084018D4E86CF2ACA89219824C8F776\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LR_TabbyBed.LR_TabbyBed:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Ending/E2/LR_TabbyBed.LR_TabbyBed:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_LR_TabbyBed\"\nmsgid \"As usually Tabby was out there maybe hunting or just hanging out with other cats.\"\nmsgstr \"Comme d'habitude, Tabby était là, peut-être pour chasser ou simplement pour traîner avec d'autres chats.\"\n\n#. Key:\t9702175346DD6BD2CBDB9C8D23460866\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LR_TabbyBed.LR_TabbyBed:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E2/LR_TabbyBed.LR_TabbyBed:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_LR_TabbyBed\"\nmsgid \"In this World, he was normal.\"\nmsgstr \"Dans ce Monde, il était normal.\"\n\n#. Key:\t018B13FB403C2E979380C68B92CC1E46\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LR_Window.LR_Window:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Ending/E2/LR_Window.LR_Window:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_LR_Window\"\nmsgid \"Yet sometimes I liked to watch other kids playing in the castle garden.\"\nmsgstr \"Pourtant, j'aimais parfois regarder les autres enfants jouer dans le jardin du château.\"\n\n#. Key:\t15454EFF40C99A479173E294B612C66C\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LR_Window.LR_Window:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E2/LR_Window.LR_Window:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_LR_Window\"\nmsgid \"They didn’t understand how important my task was.\"\nmsgstr \"Ils n'ont pas compris à quel point ma tâche était importante.\"\n\n#. Key:\t4460452B4A8B40C59075779751D3D760\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LR_Window.LR_Window:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Ending/E2/LR_Window.LR_Window:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_LR_Window\"\nmsgid \"I didn’t leave the castle since Mom died.\"\nmsgstr \"Je n'ai pas quitté le château depuis la mort de Maman.\"\n\n#. Key:\t795D92CB49E6F50CE37897A793C6A711\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LR_Window.LR_Window:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Ending/E2/LR_Window.LR_Window:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_LR_Window\"\nmsgid \"Two years passed and they still didn’t give up throwing balls on the window to get my attention.\"\nmsgstr \"Deux ans ont passé et ils n'ont toujours pas renoncé à lancer des balles sur la fenêtre pour attirer mon attention.\"\n\n#. Key:\tB1A689B24F5D77A715114AB718126A75\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LR_Window.LR_Window:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E2/LR_Window.LR_Window:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_LR_Window\"\nmsgid \"They will never understand.\"\nmsgstr \"Ils ne comprendront jamais.\"\n\n#. Key:\t06B2BD844B477A747E086F9F0C3BCAFE\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"Well, that fountain is definitely not your cup of tea but you can accept that it might be the fairest for the Magic Mirror...\"\nmsgstr \"Eh bien, cette fontaine n'est certainement pas votre tasse de thé mais vous pouvez accepter que ce soit la plus belle pour le Miroir Magique...\"\n\n#. Key:\t264C2C1040339F9680CA129F4E6E7764\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_65.Children(0).Children.Text\n#. Key:\t608D4BF341FEE76F239D6BA3B34F65E7\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_1.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_1.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_65.Children(0).Children.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"Who is the fairest?\"\nmsgstr \"Qui est le plus juste ?\"\n\n#. Key:\t2C246C1326080F0A003A03BBBE7E9F40\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_39.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_39.Children(1).Children.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"Wish something\"\nmsgstr \"Faites un vœu\"\n\n#. Key:\t2C6C88C54439E3C689E86DB30560B807\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_66.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_66.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"No matter how hard you try to receive a sign, the Mirror remains silent. It doesn't show you anything this time.\"\nmsgstr \"Peu importe les efforts que vous faites pour recevoir un signe, le Miroir reste silencieux. Il ne vous montre rien cette fois-ci.\"\n\n#. Key:\t317248C14F0904B6E6B04080841C75D1\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_39.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_39.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"The water seems to be boiling and the bubbles pop when they hit the surface; it is indeed mesmerizing. Suddenly, something breaks the silence - you can hear whispers.\"\nmsgstr \"L'eau semble bouillir et les bulles éclatent lorsqu'elles touchent la surface ; c'est en effet hypnotisant. Soudain, quelque chose brise le silence - on entend des chuchotements.\"\n\n#. Key:\t372D97104DC7D67AF4B2409B7CBC602D\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_66.Children(0).Children.Text\n#. Key:\t432E8D794C2FB271D9B39283EBD9E33B\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_1.Children(2).Children.Text\n#. Key:\tF212015B402EF862C9869394531175DC\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_65.Children(2).Children.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_1.Children(2).Children.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_65.Children(2).Children.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_66.Children(0).Children.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"Leave\"\nmsgstr \"Partir\"\n\n#. Key:\t3FBF959348F2AFFA8016AA9371DD0800\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"You politely explain that you want to see your past instead of your body, but the Mirror is stubbornly stuck on this image.\"\nmsgstr \"Vous expliquez poliment que vous voulez voir votre passé plutôt que votre corps, mais le Miroir est obstinément collé sur cette image.\"\n\n#. Key:\t4620F3E84D5DC9847AB8A8891CF66F20\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_67.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_67.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"You place the flower and wait to see what happens.\"\nmsgstr \"Vous placez la fleur et vous attendez de voir ce qui se passe.\"\n\n#. Key:\t5C2363C64023EB8E1705D3BFC3310A8A\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_65.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_65.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"The vision fades away.\"\nmsgstr \"La vision s'évanouit.\"\n\n#. Key:\t648780E44EF4F6587D31E7AE2BE4CCE4\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_68.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_68.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"The Mirror seems to be unavailable at the moment. It doesn't want to be bothered. Maybe you should return later.\"\nmsgstr \"Le Miroir semble être indisponible pour le moment. Il ne veut pas être dérangé. Vous devriez peut-être revenir plus tard.\"\n\n#. Key:\t74CAAA1D4671A258A6D188BCED32CCBD\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_69.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_69.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"The water turns still. Deep under the surface you notice a glimmering light.\"\nmsgstr \"L'eau tourne encore. Sous la surface, on remarque une lumière étincelante.\"\n\n#. Key:\t7CD8BEEA40A36A22057920807BBEEC07\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"The Magic Mirror shows things that were, things that are, and things that yet may be. \\r\\nYou fill the basin with water and start contemplating. You meditate about...\"\nmsgstr \"Le miroir magique montre les choses qui étaient, les choses qui sont et les choses qui peuvent encore être. \\nVous remplissez le bassin d'eau et commencez à contempler. Vous méditez sur...\"\n\n#. Key:\t8226F9B3495DE20F137F95A7F3583FE0\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"Ruin left this place almost untouched. The street lamps spread light on a couple of metal benches and flower pots.\"\nmsgstr \"La Ruine a laissé cet endroit presque intact. Les lampadaires diffusent la lumière sur quelques bancs en métal et des pots de fleurs.\"\n\n#. Key:\t82C33F1E49C5DC76BF19648A414F7209\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"You are watching the ball and start to get frustrated. You don't want to look at this body replacement... this raggy shell... You want answers!\"\nmsgstr \"Vous regardez la balle et commencez à être frustré. Vous ne voulez pas regarder ce remplacement de corps... cette coquille de chiffon... Vous voulez des réponses !\"\n\n#. Key:\t8F94D5E34488ECDCE9E051BB1ABE66B9\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_1.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_1.Children(1).Children.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"Who you were in the past\"\nmsgstr \"Qui vous étiez dans le passé\"\n\n#. Key:\t9BA86AAD4282A943E8A57390E2C4E3CF\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_39.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_39.Children(0).Children.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"Floating Flower\"\nmsgstr \"Fleur Flottante\"\n\n#. Key:\tA8A6D8D44F9344A162FAA080C839B28A\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"There are glass shards all over the place. There's a ball on the floor next to the girl.\"\nmsgstr \"Il y a des tessons de verre partout. Il y a un ballon par terre à côté de la fille.\"\n\n#. Key:\tAF212CEC43A56245A848DABD21ECBAFC\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_70.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_70.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"You reach for the light and your fingers grab onto something smooth and cold.\"\nmsgstr \"Vous saisissez la lumière et vos doigts s'accrochent à quelque chose de lisse et de froid.\"\n\n#. Key:\tB8E2A52B442F3B45A1D993A8548DE124\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"You are seeing the wizard's room once more. There is a weakened little girl lying on the floor in the middle of the room. She is surrounded by stone runes, candles and magical potions.\"\nmsgstr \"Vous voyez à nouveau la chambre du magicien. Il y a une petite fille affaiblie couchée sur le sol au milieu de la pièce. Elle est entourée de runes de pierre, de bougies et de potions magiques.\"\n\n#. Key:\tB9217F85404B488DB6F4DDACFF2B824C\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_65.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_65.Children(1).Children.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"What you were before\"\nmsgstr \"Ce que vous étiez avant\"\n\n#. Key:\tCD33272B416D2FDE283D44BA6F50475C\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"The image zooms in and you have a clearer view of the fountain. You are waiting for more, but nothing happens.\"\nmsgstr \"L'image zoome et vous avez une vue plus claire de la fontaine. Vous attendez davantage, mais rien ne se passe.\"\n\n#. Key:\tD64B38F1470B27D21AE539AE80AE666A\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"You are seeing the Ruined Realm from afar. The view gets closer until you find yourself looking at the top of a tower.\"\nmsgstr \"Vous voyez le Royaume en Ruines de loin. La vue se rapproche jusqu'à ce que vous vous retrouviez au sommet d'une tour.\"\n\n#. Key:\tF3C496794CC4A68DDC764895FF2DFC77\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_72.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_72.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"You found a precious rune stone! Hmmm...Is this the gift offered by the Mirror in exchange for your enchanting flower?\"\nmsgstr \"Vous avez trouvé une pierre runique précieuse ! Hmmm...Est-ce le cadeau offert par le Miroir en échange de votre fleur enchanteresse ?\"\n\n#. Key:\t10A6FAE44F71FBB21522B1AAE5E20DAE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_29.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_29.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"I don’t care what happens here after I’m back home.\"\nmsgstr \"Je me fiche de ce qui se passe ici une fois que je suis rentré chez moi.\"\n\n#. Key:\t12C6550D4143AFE12C6986B427D2927A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"He can’t release his daughter. He can’t accept that she is gone. He wants to get her back even if it means they all die after a few months...\"\nmsgstr \"Il ne peut pas libérer sa fille. Il ne peut pas accepter qu'elle soit partie. Il veut la récupérer même si cela signifie qu'ils vont tous mourir après quelques mois...\"\n\n#. Key:\t1C714E474408001FB67CEABF92FAB019\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Wait! You can’t just dis...\"\nmsgstr \"Attendez ! Vous ne pouvez pas...\"\n\n#. Key:\t209B77394D419812DD1BD7A3D7A92B94\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_39.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_39.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"All right and what can we do against it?\"\nmsgstr \"Très bien et que pouvons-nous faire contre cela ?\"\n\n#. Key:\t209BF95E4275418CE020E3AB028AFC10\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Now it’s better.\"\nmsgstr \"Maintenant, c'est mieux.\"\n\n#. Key:\t230C6ED4416FDD6C5E00FAB8B30FBB17\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"To be honest I don’t have the faintest idea. I just want to be free again.\"\nmsgstr \"Pour être honnête, je n'en ai pas la moindre idée. Je veux juste être libre à nouveau.\"\n\n#. Key:\t25227AB342F4A0E76082539072C1143D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_37.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_37.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Do you think Ruin will stop after swallowing the Human Realm?\"\nmsgstr \"Pensez-vous que la Ruine s'arrêtera après avoir avalé le Royaume des Hommes ?\"\n\n#. Key:\t266261C240DB77D1306C5F8EEE3D0189\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"He says he wants his daughter back but I think he is still trying to close the Realm to stop Ruin.\"\nmsgstr \"Il dit qu'il veut récupérer sa fille mais je pense qu'il essaie toujours de fermer le Royaume pour arrêter la Ruine.\"\n\n#. Key:\t283810E04DE48471FBE6BD9BE9DD337D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Yet he doesn’t care about the World. He wants to get her back even if it means they all die after a few months...\"\nmsgstr \"Pourtant, il ne se soucie pas du monde. Il veut la récupérer même si cela signifie qu'ils meurent tous après quelques mois...\"\n\n#. Key:\t2CE94F19412379ECE927A3AEEEAC3756\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_1.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_1.Children(1).Children.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Thanks for the Soulcaster\"\nmsgstr \"Merci pour le Lanceur de Sort\"\n\n#. Key:\t2DB5F39F45BB9EC8ABBFEA9020DF94E7\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Why should it concern me if Ruin destroys your Realm? You deserve it for summoning us to do the hard work.\"\nmsgstr \"Pourquoi cela devrait-il me préoccuper si la Ruine détruit votre Royaume ? Vous le méritez pour nous avoir demandé de faire le travail difficile.\"\n\n#. Key:\t30E5A67B4135A5402AE021832F89D4D1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"You again? I told you if you want something from the Wizard go and find him yourself...\"\nmsgstr \"Encore vous ? Je vous ai dit que si vous voulez quelque chose de la part du Magicien, allez le trouver vous-même...\"\n\n#. Key:\t34BCB98247406A77FB5A5C8942543588\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_38.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_38.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"It might take time but it will reach the Unknown Realm and all the spirits will become part of Ruin just like those who were summoned here.\"\nmsgstr \"Cela peut prendre du temps mais il atteindra le Royaume Inconnu et tous les esprits feront partie de la Ruine tout comme ceux qui ont été convoqués ici.\"\n\n#. Key:\t379B50904FB774AD057BBB810BDD445C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_41.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_41.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"I’m not sure. I will think about it.\"\nmsgstr \"Je n'en suis pas sûr. Je vais y réfléchir.\"\n\n#. Key:\t38BEECF94D2EB7B2C6596593E576A360\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_30.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_30.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"The Wizard created a device which can separate the Realms. This is the only way to stop Ruin from spreading.\"\nmsgstr \"Le Magicien a créé un dispositif qui peut séparer les royaumes. C'est le seul moyen d'empêcher la propagation de la Ruine.\"\n\n#. Key:\t3D7B856A4D97FCCC2A2B89BCB6295471\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"This time I would like to talk to you...\"\nmsgstr \"Cette fois, je voudrais vous parler...\"\n\n#. Key:\t40A329C7465166A11C73B694D6A79A00\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_12.Children(2).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_12.Children(2).Children.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Don’t know\"\nmsgstr \"Ne sait pas\"\n\n#. Key:\t4D356117496E625B6B4C64A611496A9F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_24.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_24.Children(1).Children.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Not my problem\"\nmsgstr \"Pas mon problème\"\n\n#. Key:\t4FE5ADF04D1079CCD1E16697E82B39B5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_35.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_35.Children(0).Children.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Accept plan\"\nmsgstr \"Accepter le Plan\"\n\n#. Key:\t53D6055344A880433B1093B029DA8CA5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_12.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_12.Children(0).Children.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Bring back daughter\"\nmsgstr \"Ramener sa fille\"\n\n#. Key:\t599FF022411F5BA2EB0F32A1F947C661\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_35.Children(2).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_35.Children(2).Children.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Not sure\"\nmsgstr \"Pas sûr\"\n\n#. Key:\t5FD6018040C38B8A3F40C78C913AC251\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_40.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_40.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Have no fear, I will have this done!\"\nmsgstr \"N'ayez pas peur, je vais faire en sorte que ce soit fait !\"\n\n#. Key:\t6B3585BA4AFE614FF428FCAE698872A8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_33.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_33.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"For you this would be completely different. For you this is not a sacrifice but a way of going home!\"\nmsgstr \"Pour vous, ce serait complètement différent. Pour vous, ce n'est pas un sacrifice, mais une façon de rentrer chez vous !\"\n\n#. Key:\t6E1C94F24F493D7075A7509F8181AD27\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"You are wrong. The World is falling apart yet he doesn’t care about it even when he is the only one who could stop Ruin.\"\nmsgstr \"Vous avez tort. Le Monde s'effondre et pourtant il s'en moque, même s'il est le seul à pouvoir arrêter la Ruine.\"\n\n#. Key:\t71A64B804C0CCE26571E9E8237AA5000\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"I’m also glad. It was bloody damn difficult.\"\nmsgstr \"Je suis également heureux. C'était sacrément difficile.\"\n\n#. Key:\t78305AE64B56098D32806EB509133BBC\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_35.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_35.Children(1).Children.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Decline plan\"\nmsgstr \"Refuser le Plan\"\n\n#. Key:\t7C92B8BF4CEA3093BB817682B501DC67\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"The World is falling apart and only the Wizard has a chance to stop this.\"\nmsgstr \"Le Monde s'effondre et seul le Magicien a une chance d'arrêter cela.\"\n\n#. Key:\t8B2CE8144EB2A7C89AFA1BACC3EE1B88\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Hello, little Wanderer! I’m glad you made it this far.\"\nmsgstr \"Bonjour, petit Vagabond ! Je suis content que vous soyez arrivé jusqu'ici.\"\n\n#. Key:\t8CC98B374125E6E6A6A20C97F4A3B067\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_24.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_24.Children(0).Children.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"I'm a demon\"\nmsgstr \"Je suis un démon\"\n\n#. Key:\t8D4701A1469997CBC879788351B37B0A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_31.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_31.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"My plan is simple.\"\nmsgstr \"Mon plan est simple.\"\n\n#. Key:\t8E4693F04E60AFF4757A5887973894BE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_27.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_27.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"I saw Ruin and I don’t want the same to happen to any other Realm. What can I do?\"\nmsgstr \"J'ai vu la Ruine et je ne veux pas que la même chose arrive à un autre Royaume. Que puis-je faire ?\"\n\n#. Key:\t9193CB2747033644F006809E0E4A812A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_45.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_45.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"For the sake of all Realms I hope you will make the right decision.\"\nmsgstr \"Dans l'intérêt de tous les Royaumes, j'espère que vous prendrez la bonne décision.\"\n\n#. Key:\t95D6FBCC42CC4F4041D0B5B64996FD5C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_35.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_35.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Once you are there find the Laboratory and activate the device! It will take you home and will separate the Worlds which means no spirit will be ever summoned again!\"\nmsgstr \"Une fois sur place, trouvez le Laboratoire et activez l'appareil ! Il vous ramènera chez vous et séparera les Mondes, ce qui signifie qu'aucun esprit ne sera plus jamais invoqué !\"\n\n#. Key:\t9ADEF37F49EA90EF320B5E8BB2D8D769\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"...and I don’t want our conversation to be overheard, so if you don’t mind...\"\nmsgstr \"...et je ne veux pas que notre conversation soit entendue, alors si ça ne vous dérange pas...\"\n\n#. Key:\t9F01EFC54F3FC5B709F697860BE0572D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_24.Children(2).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_24.Children(2).Children.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"How to save the World?\"\nmsgstr \"Comment sauver le Monde ?\"\n\n#. Key:\tA71226674132E2666925AEB28D2FC024\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_46.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_46.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Farewell Wanderer!\"\nmsgstr \"Adieu Vagabond !\"\n\n#. Key:\tB1E3A9DB4A75C08067DCA19113A6A8A2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Calm down little spirit.\"\nmsgstr \"Calme-toi petit esprit.\"\n\n#. Key:\tB355BD604F9EC22514DA14B64B0F5E5E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_43.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_43.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Thank you Spirit! For the sake of all Realms I hope you won’t fail on your way!\"\nmsgstr \"Merci Esprit ! Pour le bien de tous les Royaumes, j'espère que vous n'échouerez pas en chemin !\"\n\n#. Key:\tB6D3E23045C4BC5B3E5F3D83E2DFBADB\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_19.Text\n#. Key:\tDC3219914721210BD169D2989F03D18D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"But we won’t let this happen, will we?\"\nmsgstr \"Mais nous ne laisserons pas cela se produire, n'est-ce pas ?\"\n\n#. Key:\tBAC828A540E6C81EE43EBF8036A8146A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_42.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_42.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"You deserve Ruin. I won’t save the Human Realm!\"\nmsgstr \"Vous méritez la Ruine. Je ne sauverai pas le Royaume des Hommes !\"\n\n#. Key:\tC837CED4495F79594133F4B2C0FCE5F8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Where shall I start? Do you know what the Wizard is up to? Did he tell you?\"\nmsgstr \"Par où dois-je commencer ? Savez-vous ce que le Magicien prépare ? Vous l'a-t-il dit ?\"\n\n#. Key:\tD060173B4D5502FC06A69E865DAFD5E6\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_26.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_26.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"This is not my Realm and not my problem. All I want is to get out of here.\"\nmsgstr \"Ce n'est pas mon Royaume et ce n'est pas mon problème. Tout ce que je veux, c'est sortir d'ici.\"\n\n#. Key:\tD520C3AC46F62B77554443A4589845C1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"He would like to bring his daughter back to life. For that he needs three artefacts which are somewhere here.\"\nmsgstr \"Il aimerait ramener sa fille à la vie. Pour cela, il a besoin de trois artefacts qui se trouvent quelque part ici.\"\n\n#. Key:\tD7F841B14E18D77AB5FBD2A34D59BC92\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_44.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_44.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"I understand your fury. Yet I hope you will change your mind.\"\nmsgstr \"Je comprends votre fureur. Mais j'espère que vous changerez d'avis.\"\n\n#. Key:\tD80B81914A550F305934F9852C1DD6B0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_23.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_23.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"He lost his daughter and he can’t release her. He can’t accept that she is gone.\"\nmsgstr \"Il a perdu sa fille et il ne peut pas la libérer. Il ne peut pas accepter qu'elle soit partie.\"\n\n#. Key:\tD816A79E4160BC4426CD22A63C7987A0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Before you go on I have something to discuss with you...\"\nmsgstr \"Avant que vous ne continuiez, j'ai quelque chose à vous dire...\"\n\n#. Key:\tDD870754471358DEFE9CB5BFA554AB7C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_1.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_1.Children(0).Children.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Me too\"\nmsgstr \"Moi aussi\"\n\n#. Key:\tE0CCA2604AA40FED355A859A1FA02DDA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_1.Children(2).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_1.Children(2).Children.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"I won’t deliver any message\"\nmsgstr \"Je ne délivrerai aucun message\"\n\n#. Key:\tE1C3F2E34680BA8B67521C905AD42ADA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"That’s correct. He can’t release his daughter. He can’t accept that she is gone.\"\nmsgstr \"C'est exact. Il ne peut pas libérer sa fille. Il ne peut pas accepter qu'elle soit partie.\"\n\n#. Key:\tE93136104181FAA899F2CE801497DCBA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_25.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_25.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"I know right now it doesn’t look that way, but I’m a mighty demon of the Unknown Realm.\"\nmsgstr \"Je sais qu'à l'heure actuelle, on ne dirait pas, mais je suis un puissant démon du Royaume Inconnu.\"\n\n#. Key:\tEC116A8848A471EB2C5DC8BA1D187C9A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_12.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_12.Children(1).Children.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Close Ruined Realm\"\nmsgstr \"Fermer le Royaume en Ruines\"\n\n#. Key:\tEC6221CE4B85E7D1887DBCA6D85D8238\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"It wasn’t easy but I made good use of the Spellcaster you gave me.\"\nmsgstr \"Ce n'était pas facile, mais j'ai fait bon usage du Lanceur de Sorts que vous m'avez donné.\"\n\n#. Key:\tED5356DE42F2ED2203F7AFB30231643E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_34.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_34.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"When you deliver the artefacts he will let you into his tower.\"\nmsgstr \"Lorsque vous lui remettrez les artefacts, il vous laissera entrer dans sa tour.\"\n\n#. Key:\tEE78AD4147800BD0E160A8B6A3F51FBD\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_32.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_32.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"When the Wizard’s daughter activated the device it transported her soul into the Unknown Realm. At that point the Wizard stopped the device so that he can summon his daughter back.\"\nmsgstr \"Lorsque la fille du Magicien a activé l'appareil, celui-ci a transporté son âme dans le Royaume Inconnu. Le Magicien a alors arrêté l'appareil pour pouvoir rappeler sa fille.\"\n\n#. Key:\tEFACA50447BAC08293281BB11A5E11B3\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_36.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_36.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"This is just as much your problem as it is mine.\"\nmsgstr \"C'est autant votre problème que le mien.\"\n\n#. Key:\tFB0E702746132A3C688D9EA492A01B50\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"You made it and that is what matters.\"\nmsgstr \"Vous l'avez fait et c'est ce qui compte.\"\n\n#. Key:\t4BE3EE734EFED241B7FA2192EEB146A5\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/MR_Bed.MR_Bed:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Ending/E2/MR_Bed.MR_Bed:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_MR_Bed\"\nmsgid \"We always wore colourful clothes because that made her happy.\"\nmsgstr \"Nous avons toujours porté des vêtements colorés parce que cela la rendait heureuse.\"\n\n#. Key:\t7F5F069D4E9C7F15ED2B8CA45154FCFE\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/MR_Bed.MR_Bed:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E2/MR_Bed.MR_Bed:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_MR_Bed\"\nmsgid \"Most of her time she just lied here and stared at nothing.\"\nmsgstr \"La plupart du temps, elle s'est contentée de flâner ici et de ne rien regarder.\"\n\n#. Key:\tEA25DBC34832960AB03A32A5B08AC404\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/MR_Bed.MR_Bed:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E2/MR_Bed.MR_Bed:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_MR_Bed\"\nmsgid \"Sometimes she talked about grey lands.\"\nmsgstr \"Parfois, elle parlait des terres grises.\"\n\n#. Key:\t58E06C3A45DD46A34F155BAA62933039\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/MR_Chair.MR_Chair:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Ending/E2/MR_Chair.MR_Chair:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_MR_Chair\"\nmsgid \"I hope they will never find out how wrong they were. I hope there is still time for our World.\"\nmsgstr \"J'espère qu'ils ne découvriront jamais à quel point ils se sont trompés. J'espère qu'il est encore temps pour notre monde.\"\n\n#. Key:\t9EA75B664E62ABF38E44BE8DC3050AC9\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/MR_Chair.MR_Chair:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E2/MR_Chair.MR_Chair:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_MR_Chair\"\nmsgid \"This is where the doctor used to sit. He never believed that Mom was infected by the Ruin.\"\nmsgstr \"C'est là que le médecin s'asseyait. Il n'a jamais cru que maman ait été infectée par la Ruine.\"\n\n#. Key:\tA408630F44A3B2345A2D0AA8395D97F2\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/MR_Chair.MR_Chair:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E2/MR_Chair.MR_Chair:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_MR_Chair\"\nmsgid \"No one ever believed in Ruin.\"\nmsgstr \"Personne n'a jamais cru à la Ruine.\"\n\n#. Key:\t1AFEF7EB49BB3BEA5BB76793A60ED7C9\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/MR_Lamps.MR_Lamps:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E2/MR_Lamps.MR_Lamps:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_MR_Lamps\"\nmsgid \"This room was the brightest in the castle.\"\nmsgstr \"Cette pièce était la plus lumineuse du château.\"\n\n#. Key:\tC132BEA446B4441615D7029E8AA5BBB5\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/MR_Lamps.MR_Lamps:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E2/MR_Lamps.MR_Lamps:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_MR_Lamps\"\nmsgid \"I took some oil.\"\nmsgstr \"J'ai pris un peu d'huile.\"\n\n#. Key:\tFE826997431A2665AC2788A62558B88E\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/MR_Lamps.MR_Lamps:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Ending/E2/MR_Lamps.MR_Lamps:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_MR_Lamps\"\nmsgid \"Father bought some exotic lamp oil so that we had coloured lights.\"\nmsgstr \"Père a acheté de l'huile de lampe exotique pour que nous ayons des lumières colorées.\"\n\n#. Key:\t430A10B04FAC9288EC2794A31DF6699E\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/MR_Paintings.MR_Paintings:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E2/MR_Paintings.MR_Paintings:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_MR_Paintings\"\nmsgid \"Mom was always fond of art.\"\nmsgstr \"Maman a toujours été passionnée par l'art.\"\n\n#. Key:\t53AA7E134FA0E30F37FC8CB50425520F\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/MR_Paintings.MR_Paintings:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E2/MR_Paintings.MR_Paintings:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_MR_Paintings\"\nmsgid \"After she got sick she couldn’t paint the way she did before yet she still liked it.\"\nmsgstr \"Après sa maladie, elle ne pouvait plus peindre comme avant, mais elle aimait toujours ça.\"\n\n#. Key:\t8484045A4107378E9CC8FFAA02C94A87\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/MR_Paintings.MR_Paintings:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Ending/E2/MR_Paintings.MR_Paintings:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_MR_Paintings\"\nmsgid \"It could engage her for hours.\"\nmsgstr \"Il pourrait la mobiliser pendant des heures.\"\n\n#. Key:\t009BF08145DBE86FFB07BA9A6BD77A8E\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_5.Children(2).Children.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_5.Children(2).Children.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"Not my business\"\nmsgstr \"Pas mes affaires\"\n\n#. Key:\t00DE9BE1446C5D5C0D62469B41A1B693\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_5.Children(0).Children.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_5.Children(0).Children.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"Lillian?\"\nmsgstr \"Lillian ?\"\n\n#. Key:\t0C3B729C4618E8A817F019B8E916425B\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"Maybe we failed the ritual again and summoned another of your kind.\"\nmsgstr \"Peut-être avons-nous encore échoué au rituel et avons-nous fait appel à un autre de votre espèce.\"\n\n#. Key:\t0CAC15144B37144A99A9EB9D13CCC9DE\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_32.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_32.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"What do you expect me to do, Spirit?\"\nmsgstr \"Qu'attends-tu de moi, Esprit ?\"\n\n#. Key:\t1493C597483503024A3C5CA8F0FA1327\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"I’ve already done way too much for you.\"\nmsgstr \"J'en ai déjà fait beaucoup trop pour vous.\"\n\n#. Key:\t15BAD73D49BF7C62469D8E9CD0B2AAF4\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"Now, take me home!\"\nmsgstr \"Maintenant, ramenez-moi à la maison !\"\n\n#. Key:\t1962A69C42E8FDD365AFC9AB626605F7\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"We made the spell... and it worked!\"\nmsgstr \"On a fait le sort... et ça a marché !\"\n\n#. Key:\t1AC8DD104163078CA72065A0B43B5C57\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"And then what?\"\nmsgstr \"Et puis quoi ?\"\n\n#. Key:\t2034A3164695766F8C17B69CD0937C02\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_25.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_25.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"And he...\"\nmsgstr \"Et il...\"\n\n#. Key:\t22668011432DEF65ACF29793FF234E07\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_37.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_37.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"Someone like me...\"\nmsgstr \"Quelqu'un comme moi...\"\n\n#. Key:\t2386A8D24BD256982D486AAF71B57ABD\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_23.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_23.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"She destroyed half of the room before we could even cast a spell.\"\nmsgstr \"Elle a détruit la moitié de la pièce avant même que nous ayons pu jeter un sort.\"\n\n#. Key:\t250E11A440445CAFB5252A92C5100735\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"That’s how you handle situations like these...\"\nmsgstr \"C'est comme ça qu'on gère des situations comme celles-ci...\"\n\n#. Key:\t298BEA5646602444742C3BAD65866EF9\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"I’m not sure... Everything happened so fast.\"\nmsgstr \"Je ne suis pas sûr... Tout est arrivé si vite.\"\n\n#. Key:\t2FAFABFC43A75D29B671739D16759E43\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"What happened?\"\nmsgstr \"Que s'est-il passé ?\"\n\n#. Key:\t303D9BF54AB3034565A45594AB5636DF\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"I can’t... I’m sorry!\"\nmsgstr \"Je ne peux pas... Je suis désolé !\"\n\n#. Key:\t378D7F984C821E23AF0CBEA7D24EFCC1\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"What happened to Lillian? Has she returned?\"\nmsgstr \"Qu'est-il arrivé à Lillian ? Est-elle revenue ?\"\n\n#. Key:\t38EF0908448C7E5298C4F496DACAD5AD\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"Something... arrgh... something went wrong...\"\nmsgstr \"Quelque chose... arrgh... quelque chose a mal tourné...\"\n\n#. Key:\t3A328FA74AA2FBC2AFE84CA195DAE236\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"You are Raven’s master...\"\nmsgstr \"Vous êtes le maître de Corbeau...\"\n\n#. Key:\t462226704638D0C32B1DEBA3DFE138A1\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"She was taken over by a wicked force and she unleashed boundless spells.\"\nmsgstr \"Elle a été prise par une force malfaisante et elle a déclenché des sorts sans limites.\"\n\n#. Key:\t49B5501A4917D23E6B3B99B430076ABA\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"It was like the devil itself.\"\nmsgstr \"C'est comme l'enfer sur terre.\"\n\n#. Key:\t4B173FBD4D4F48A468016BB055CC573C\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"Where is Wizard? Something happened to him?\"\nmsgstr \"Où se trouve le Magicien ? Il lui est arrivé quelque chose ?\"\n\n#. Key:\t5341F61045AA32F212173EA9CAB67695\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_39.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_39.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"Wizard was right when he decided to trust you.\"\nmsgstr \"Le Magicien avait raison quand il a décidé de vous faire confiance.\"\n\n#. Key:\t551AEBA64D1E99B2CCFA3DB13E168A02\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_27.Children(1).Children.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_27.Children(1).Children.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"I won’t fight\"\nmsgstr \"Je ne me battrai pas\"\n\n#. Key:\t592A8CF045DF1BD875B05F9493FE2BB4\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_38.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_38.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"I will face her!\"\nmsgstr \"Je vais l'affronter !\"\n\n#. Key:\t5B65F12D43B12FA943D7469FEE2CE2E0\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"We made everything right...\"\nmsgstr \"Nous avons tout arrangé...\"\n\n#. Key:\t65A974C344D2B4DD644901994086A31D\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_30.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_30.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"Why is it that every time you refuse to face the consequences of your actions, it is me who needs to clean up your mess?\"\nmsgstr \"Comment se fait-il qu'à chaque fois que vous refusez de faire face aux conséquences de vos actes, c'est moi qui dois nettoyer votre bazar ?\"\n\n#. Key:\t66D0FDF04AF5351330E83080759ED974\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_40.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_40.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"I'm sorry that I can't help...\"\nmsgstr \"Je suis désolé de ne pas pouvoir vous aider...\"\n\n#. Key:\t7FFE18B74C54BB92334399983F82DBCA\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_34.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_34.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"You are free to do whatever you want!\"\nmsgstr \"Vous êtes libre de faire ce que vous voulez !\"\n\n#. Key:\t8739EB3D48E4F2A997E604A60F7F32B3\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"Was it trapped inside a teddy bear?\"\nmsgstr \"Était-il emprisonné dans un ours en peluche ?\"\n\n#. Key:\t8E2F09164340534A484A46AD45E4E105\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_27.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_27.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"The demon-Lillian left. There is no one who could stop her now...\"\nmsgstr \"Le démon-Lillian est parti. Il n'y a plus personne qui puisse l'arrêter maintenant...\"\n\n#. Key:\t900D084E4F673FEBEACE3E916103B93E\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"She had fire in her eyes...\"\nmsgstr \"Elle avait de la rage dans les yeux...\"\n\n#. Key:\t91C26C314425AB8C973F1FB54061F639\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"Lillian woke up and then...\"\nmsgstr \"Lillian s'est réveillée et puis...\"\n\n#. Key:\t95CE9C6C4901E613AD5DB38E51AC0DB3\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_35.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_35.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"Leave and let me rest in peace...\"\nmsgstr \"Partez et laissez-moi reposer en paix...\"\n\n#. Key:\t9AF3E069409F31E4F50A5990A416A39C\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_19.Children(1).Children.Text\n#. Key:\tF5A670D640D73DF452C02A948CB68F75\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_5.Children(1).Children.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_19.Children(1).Children.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_5.Children(1).Children.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"Wizard?\"\nmsgstr \"Magicien ?\"\n\n#. Key:\t9B1B8322442B6D7D76F2119E0A0574FA\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"Is the Wizard safe? What happened afterwards?\"\nmsgstr \"Le Magicien est-il en sécurité ? Que s'est-il passé ensuite ?\"\n\n#. Key:\tA82789354D984476223432A2BE199293\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_24.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_24.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"I was hit by the table.\"\nmsgstr \"J'ai été frappé par la table.\"\n\n#. Key:\tAA6EFD044C1D21008EEA189DE75740E7\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_41.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_41.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"Good luck with... everything!\"\nmsgstr \"Bonne chance avec... tout !\"\n\n#. Key:\tACAF3D904A149C0E9F91E5AC852D8309\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_31.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_31.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"Let me go!\"\nmsgstr \"Laissez-moi partir !\"\n\n#. Key:\tB223647F4C35858A62A5509C7B22C23B\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_27.Children(0).Children.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_27.Children(0).Children.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"I'll stop her\"\nmsgstr \"Je vais l'arrêter\"\n\n#. Key:\tD0E16FEF4D5415EC6D2C299252E5675D\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_26.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_26.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"He was burnt to ashes.\"\nmsgstr \"Il a été réduit en cendres.\"\n\n#. Key:\tD23076F4475E6CE385ECB2B3B2749CA9\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_36.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_36.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"I have always wanted to meet someone of my own kind anyway.\"\nmsgstr \"De toute façon, j'ai toujours voulu rencontrer quelqu'un de mon espèce.\"\n\n#. Key:\tD290445E4EB74446478970934785BA10\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"I can’t open a Gate without Wizard...\"\nmsgstr \"Je ne peux pas ouvrir une Porte sans Magicien...\"\n\n#. Key:\tD6EB1BE248E9C483E6D94B8E8A7815F6\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"I don't understand... It is...\"\nmsgstr \"Je ne comprends pas... C'est...\"\n\n#. Key:\tEC42D62E46269139E9E69B876EDED5B1\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_33.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_33.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"It wasn't me who brought you here.\"\nmsgstr \"Ce n'est pas moi qui vous ai amené ici.\"\n\n#. Key:\tF0711D5F4698DAA99E484E94FDB3EF9C\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_19.Children(0).Children.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_19.Children(0).Children.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"Was it trapped?\"\nmsgstr \"A-t-elle été piégée ?\"\n\n#. Key:\tFDE62A034456071EFE9639B73108BB1E\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"I can't let her destroy everything!\"\nmsgstr \"Je ne peux pas la laisser tout détruire !\"\n\n#. Key:\tFDFD2B2B4352B564118519874199B48C\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_29.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_29.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"No-no-no!\"\nmsgstr \"Non, non, non !\"\n\n#. Key:\t2E3C904D458640A4F06DD793B416366A\n#. SourceLocation:\t/Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_SewerCreatures\"\nmsgid \"All right, I will return when I'm done.\"\nmsgstr \"Très bien, je reviendrai quand j'aurai fini.\"\n\n#. Key:\t41F6B75041803A654088469BCB887165\n#. SourceLocation:\t/Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_1.Children(0).Children.Text\n#: /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_1.Children(0).Children.Text\nmsgctxt \"Dialogue_SewerCreatures\"\nmsgid \"Really?\"\nmsgstr \"Vraiment ?\"\n\n#. Key:\t43EE0E60407CA7CB7431BDB2767C6E19\n#. SourceLocation:\t/Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_SewerCreatures\"\nmsgid \"That's sad. What happened exactly?\"\nmsgstr \"C'est triste. Que s'est-il passé exactement ?\"\n\n#. Key:\t53AC225B4F21B68CAC6F8997F324124E\n#. SourceLocation:\t/Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_29.Text\n#: /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_29.Text\nmsgctxt \"Dialogue_SewerCreatures\"\nmsgid \"Farewell until we meet again!\"\nmsgstr \"Adieu jusqu'à notre prochaine rencontre !\"\n\n#. Key:\t5ED0CE6143EC50E6B5A1289D1A9A88E2\n#. SourceLocation:\t/Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_SewerCreatures\"\nmsgid \"I'm glad I could help.\"\nmsgstr \"Je suis heureux d'avoir pu aider.\"\n\n#. Key:\t65042BC342E9717229E74A9DD272DC5F\n#. SourceLocation:\t/Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_SewerCreatures\"\nmsgid \"It was nice to see you again.\"\nmsgstr \"C'était un plaisir de vous revoir.\"\n\n#. Key:\t77959A144131C47488B221ADD9B1E13B\n#. SourceLocation:\t/Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_SewerCreatures\"\nmsgid \"Don't worry! I'm still looking for it.\"\nmsgstr \"Ne vous inquiétez pas ! Je cherche toujours.\"\n\n#. Key:\t7914F3CA40844C2A13A760BB0DAE1BFA\n#. SourceLocation:\t/Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_SewerCreatures\"\nmsgid \"I don't have time for you creature! Stay out of my way!\"\nmsgstr \"Je n'ai pas de temps pour toi, créature ! Reste en dehors de mon chemin !\"\n\n#. Key:\t79A62658414FE0202F2E9AA0E0238BD4\n#. SourceLocation:\t/Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_9.Children(0).Children.Text\n#: /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_9.Children(0).Children.Text\nmsgctxt \"Dialogue_SewerCreatures\"\nmsgid \"Accept Quest\"\nmsgstr \"Accepter la Quête\"\n\n#. Key:\t7EF6CBFA4A9C0B85B26AA6830C6121A2\n#. SourceLocation:\t/Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_1.Children(2).Children.Text\n#: /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_1.Children(2).Children.Text\nmsgctxt \"Dialogue_SewerCreatures\"\nmsgid \"Leave\"\nmsgstr \"Partir\"\n\n#. Key:\t85A2E48A4B27C5EB7DA4CFAA23555629\n#. SourceLocation:\t/Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_26.Text\n#: /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_26.Text\nmsgctxt \"Dialogue_SewerCreatures\"\nmsgid \"Farewell and good luck to you as well!\"\nmsgstr \"Adieu et bonne chance à vous aussi !\"\n\n#. Key:\t9AEDA0E84BABEBCD8F18E8BC2D0B75D0\n#. SourceLocation:\t/Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_SewerCreatures\"\nmsgid \"Calm down creature! I mean you no harm.\"\nmsgstr \"Calmez-vous, créature ! Je ne vous veux aucun mal.\"\n\n#. Key:\tB89304534B24114D19DF7AB07635FFDE\n#. SourceLocation:\t/Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_SewerCreatures\"\nmsgid \"All right I will see what I can do.\"\nmsgstr \"Très bien, je vais voir ce que je peux faire.\"\n\n#. Key:\tB8BD374E4738BFFDAFAC4EAA19E7A9D2\n#. SourceLocation:\t/Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_23.Text\n#: /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_23.Text\nmsgctxt \"Dialogue_SewerCreatures\"\nmsgid \"Oh, thank you!\"\nmsgstr \"Oh, merci !\"\n\n#. Key:\tCAFA874D4ECD3CBFC0ADFD93048A9AA5\n#. SourceLocation:\t/Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_SewerCreatures\"\nmsgid \"Just tell me what do you want...\"\nmsgstr \"Dites-moi juste ce que vous voulez...\"\n\n#. Key:\tCF62984840B7508E82BAC0AB9D53EC0A\n#. SourceLocation:\t/Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_9.Children(1).Children.Text\n#: /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_9.Children(1).Children.Text\nmsgctxt \"Dialogue_SewerCreatures\"\nmsgid \"Decline\"\nmsgstr \"Refuser\"\n\n#. Key:\tDA1FD0DC49E9B2999DCD489699C04106\n#. SourceLocation:\t/Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_1.Children(1).Children.Text\n#: /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_1.Children(1).Children.Text\nmsgctxt \"Dialogue_SewerCreatures\"\nmsgid \"Let it talk\"\nmsgstr \"Le laisser parler\"\n\n#. Key:\tEAD329F04773358B0CA339A4F155D990\n#. SourceLocation:\t/Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_SewerCreatures\"\nmsgid \"I'm sorry but I can't help you.\"\nmsgstr \"Je suis désolé, mais je ne peux pas vous aider.\"\n\n#. Key:\tDA8649E54E3753ECDF9C4EAAB90D42B6\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/sewertut1.sewertut1:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/sewertut1.sewertut1:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_sewertut1\"\nmsgid \"I don't like the idea of this additional challenge, but without the help of the Keeper you won't be able to get out.\"\nmsgstr \"Je n'aime pas l'idée de ce défi supplémentaire, mais sans l'aide du Gardien, vous ne pourrez pas en sortir.\"\n\n#. Key:\t462EF40B4BF77FA77FD98DB4656692A2\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/sewertut2_magicbox.sewertut2_magicbox:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/sewertut2_magicbox.sewertut2_magicbox:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_sewertut2_magicbox\"\nmsgid \"It's a magic box! That's what it's supposed to do, demon.\"\nmsgstr \"C'est une boîte magique ! C'est ce qu'elle est censée faire, démon.\"\n\n#. Key:\tC34B7D8D499A8E8B767A58A19537A1EA\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/sewertut2_magicbox.sewertut2_magicbox:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/sewertut2_magicbox.sewertut2_magicbox:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_sewertut2_magicbox\"\nmsgid \"Is that box just floating in the air?\"\nmsgstr \"Cette boîte flotte-t-elle simplement dans l'air ?\"\n\n#. Key:\t348CCFC54F7E952295416496617F7615\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/sewertut3_silverkey.sewertut3_silverkey:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/sewertut3_silverkey.sewertut3_silverkey:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_sewertut3_silverkey\"\nmsgid \"What is that crystal?\"\nmsgstr \"Qu'est-ce que ce cristal ?\"\n\n#. Key:\t554B6C924D0234A869BDFF9412FC4F49\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/sewertut3_silverkey.sewertut3_silverkey:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/sewertut3_silverkey.sewertut3_silverkey:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_sewertut3_silverkey\"\nmsgid \"Don't care about that. Focus on finding a way out.\"\nmsgstr \"Ne vous en faites pas. Concentrez-vous sur la recherche d'une issue.\"\n\n#. Key:\t015A0B11422A6F2AE027FF8D9DF70664\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"We need his help.\"\nmsgstr \"Nous avons besoin de son aide.\"\n\n#. Key:\t03C73AA849BF05421AB97BA696A8C9C4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_79.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_79.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"They always wanted to invade the Outpost. They are many and we are few.\"\nmsgstr \"Ils ont toujours voulu envahir l'Avant-Poste. Ils sont nombreux et nous sommes peu.\"\n\n#. Key:\t0849CCCF4491D52B38AE7F827841E479\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Why should I set you free?\"\nmsgstr \"Pourquoi devrais-je vous libérer ?\"\n\n#. Key:\t090C7BBF4222952E1C3FD38F7CF9927E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_76.Text\n#. Key:\t0AC46EF744AA55EDDA83EDB6899BB2D1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_65.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_65.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_76.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Some say Tabby's spirit returned and took the artefacts to Lillian. Maybe that is what happened.\"\nmsgstr \"Certains disent que l'esprit de Tabby est revenu et a apporté les artefacts à Lillian. C'est peut-être ce qui s'est passé.\"\n\n#. Key:\t094943BF4D9202CE7B1CFCBF151886D5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Back to the question: will you get me out?\"\nmsgstr \"Revenons à la question : allez-vous me faire sortir ?\"\n\n#. Key:\t0DBF728A4C052550BE5EEDBC9DEFB2E0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_29.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_29.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"I would invite you for dinner but unfortunately the door is closed.\"\nmsgstr \"Je vous inviterais bien à dîner, mais malheureusement la porte est fermée.\"\n\n#. Key:\t112A48C54853F7689E1676A11FA8C352\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_48.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_48.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"No time to talk!\"\nmsgstr \"Pas le temps de parler !\"\n\n#. Key:\t116C39AA495E99500962E8B3AF10DD4A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_83.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_83.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"I mean I'm sorry about the others... not that you survived.\"\nmsgstr \"Je veux dire que je suis désolé pour les autres... pas que tu aies survécu.\"\n\n#. Key:\t134299214C22044B012C27B62337C08E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_69.Text\n#. Key:\tFD1574E845CB284B7A85F09CA1580DD4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_58.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_58.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_69.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"But she is gone for months and no one knows where she might be.\"\nmsgstr \"Mais elle est partie pendant des mois et personne ne sait où elle pourrait être.\"\n\n#. Key:\t14BD2A7C45E85692430B34820042C96F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_73.Text\n#. Key:\tEA5320F3406E2BFA9BD954899BFA19DA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_62.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_62.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_73.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"He had so many friends. We all gathered and buried him near the Ancient Temple.\"\nmsgstr \"Il avait tant d'amis. Nous l'avons tous rassemblé et enterré près du Temple Ancien.\"\n\n#. Key:\t16E175D0437B4A671F4753A56E840278\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_33.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_33.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"I’m looking for three artefacts. Do you know something about them?\"\nmsgstr \"Je cherche trois artefacts. Savez-vous quelque chose à leur sujet ?\"\n\n#. Key:\t174BA1E34131FB1BD5A543A3CB86C724\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_35.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_35.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"I will return to the Main Station at Crossroad Cave and see what I can do with the trains.\"\nmsgstr \"Je vais retourner à la Gare Centrale de la Grotte du Croisée des Chemins et voir ce que je peux faire avec les trains.\"\n\n#. Key:\t1769115D4B72AB6CF8641487126A4A18\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"It has a key. The end of it is shaped like a dwarven helmet. You can easily recognise it.\"\nmsgstr \"Il a une clé. Son extrémité a la forme d'un casque de nain. Vous pouvez facilement la reconnaître.\"\n\n#. Key:\t17CBB2E24B331E4C5682919AAD2E7F2E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_60.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_60.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"What happened to Tabby?\"\nmsgstr \"Qu'est-il arrivé à Tabby ?\"\n\n#. Key:\t1AA8B2E541B2B2E7CA1E86B1E08C1E5A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"They are all dead...\"\nmsgstr \"Ils sont tous morts...\"\n\n#. Key:\t1FCCD37546681195736D2290A8DAE121\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Oh, it’s you again.\"\nmsgstr \"Oh, c'est encore vous.\"\n\n#. Key:\t2581B27E486A1C71835E5BB44B0AE05E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_37.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_37.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"But first I finish my supper. See you there!\"\nmsgstr \"Mais d'abord, je termine mon dîner. On se voit là-bas !\"\n\n#. Key:\t2589E4AA4E5A406F6A98CB87D7382DC0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Just ask one of the other dwarfs to open the door.\"\nmsgstr \"Il suffit de demander à l'un des autres nains d'ouvrir la porte.\"\n\n#. Key:\t26162C784D2E65A2F8F491A80838F754\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_24.Children(4).Children.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_24.Children(4).Children.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Everyone dead?\"\nmsgstr \"Tout le monde est mort ?\"\n\n#. Key:\t2FEAED2844737D1B20BA64AE2414D8C6\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_72.Text\n#. Key:\tA119C2164FDE16E8F84B4E89578A1015\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_61.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_61.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_72.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"By the time I found him he was dead.\"\nmsgstr \"Le temps que je le trouve, il était mort.\"\n\n#. Key:\t3203A6044456CD8213037A9B1B668763\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Please help me out!\"\nmsgstr \"Aidez-moi, s'il vous plaît !\"\n\n#. Key:\t32C0BE7F49563BC2846691B4F163AEF7\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Well that explains why they didn’t come for me over the last four months.\"\nmsgstr \"Cela explique pourquoi ils ne sont pas venus me chercher au cours des quatre derniers mois.\"\n\n#. Key:\t35F849134220FAE43E07268C439CE3A1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_31.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_31.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"What were you Dwarves doing here?\"\nmsgstr \"Que faisiez-vous ici, vous les Nains ?\"\n\n#. Key:\t39D36DCA4CD40A7E19D4F5AE69954DC3\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_71.Text\n#. Key:\tEFD384D542A5869726CAB7945F4C0EC4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_54.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_54.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_71.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Tabby found the three artefacts but on his way home he got injured.\"\nmsgstr \"Tabby a trouvé les trois artefacts, mais en rentrant chez lui, il a été blessé.\"\n\n#. Key:\t39DEF30C4C3CCAB79867339AABD92BA0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_24.Children(3).Children.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_24.Children(3).Children.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Artefacts\"\nmsgstr \"Artéfacts\"\n\n#. Key:\t3AF0406744C4656C5604EF931A688715\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_23.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_23.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"I've found the key!\"\nmsgstr \"J'ai trouvé la clé !\"\n\n#. Key:\t3E074E784D66BE166553EB9F85D9854A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"How can I set you free?\"\nmsgstr \"Comment puis-je vous libérer ?\"\n\n#. Key:\t4100ECBE40C53051121F4C8A588FBDCB\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_24.Children(2).Children.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_24.Children(2).Children.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Train\"\nmsgstr \"Entraîner\"\n\n#. Key:\t41085B174230937FAF97CDBC868F852A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_24.Children(5).Children.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_24.Children(5).Children.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Leave\"\nmsgstr \"Partir\"\n\n#. Key:\t4204AAFB49C665B3CC32D78301307582\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_45.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_45.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Do you mean those traps out there?\"\nmsgstr \"Vous voulez parler de ces pièges ?\"\n\n#. Key:\t44AF6FF04B8A23F656F485AB9F1AFE60\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_36.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_36.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Catch me there if you need to go somewhere!\"\nmsgstr \"Venez me voir si vous avez besoin d'aller quelque part !\"\n\n#. Key:\t48FC728C4467C7CF9692AEB8CC71352D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_49.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_49.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"I will catch you at Crossroad Cave after I finished my supper.\"\nmsgstr \"Je vous rejoindrai à la Grotte de la Croisée des Chemins après avoir terminé mon dîner.\"\n\n#. Key:\t4A74231B43F74B39906C85904332EE87\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"What happened? How did you end up here?\"\nmsgstr \"Que s'est-il passé ? Comment avez-vous atterri ici ?\"\n\n#. Key:\t4FE354D247D257B181993087E5ADC74C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Errr... I don’t know... out of pure righteousness perhaps?\"\nmsgstr \"Errr... Je ne sais pas... par pure droiture peut-être ?\"\n\n#. Key:\t529895FF4D6B505A0EDB5081215845AE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_53.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_53.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"He wasn't just an ordinary cat. He was somehow connected to a charming young girl called Lillian.\"\nmsgstr \"Ce n'était pas un chat ordinaire. Il était en quelque sorte lié à une charmante jeune fille appelée Lillian.\"\n\n#. Key:\t5C005582439FD5753AA90BB72F3284C8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_44.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_44.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"We build walls. We create machines out of golem spirits with simple rules which can't go wrong.\"\nmsgstr \"Nous construisons des murs. Nous créons des machines à partir d'esprits du golem avec des règles simples qui ne peuvent pas déraper.\"\n\n#. Key:\t5C48292B4E4F1FAF4D7BB487713EA0B1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_59.Text\n#. Key:\t7F06827C4756423AE024F99922B00FDE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_70.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_59.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_70.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"I hope she will return.\"\nmsgstr \"J'espère qu'elle reviendra.\"\n\n#. Key:\t624EDA19418303508EA7F58C5BD0DB4E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"All right!\"\nmsgstr \"Très bien !\"\n\n#. Key:\t64E994E34D543F58D0F9DAA386AD7438\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Or do you like trains? I can help you redirect them to stations you couldn’t go otherwise.\"\nmsgstr \"Ou bien vous aimez les trains ? Je peux vous aider à les rediriger vers des gares où vous ne pourriez pas aller autrement.\"\n\n#. Key:\t674A3DC8404EF8FC317D72A70877A0FF\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Errr... You know, sometimes in the evening I come here and have some late dinner. And there are others who think it would be funny to close the door when I'm inside.\"\nmsgstr \"Errr... Vous savez, parfois le soir, je viens ici et je dîne tard. Et il y en a d'autres qui pensent que ce serait drôle de fermer la porte quand je suis à l'intérieur.\"\n\n#. Key:\t6B07A15F4E86ECA507DE1DA9B0634774\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_74.Text\n#. Key:\t8F415D40481AA448025D79AB123B2DEB\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_63.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_63.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_74.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"He was a good friend. We all miss him.\"\nmsgstr \"C'était un bon ami. Il nous manque à tous.\"\n\n#. Key:\t6B47D3994D188506700B48BE85E0C740\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Once you collected all the artefacts you will need to take them back to a point where I can transport you to the Human Realm.\"\nmsgstr \"Une fois que vous aurez rassemblé tous les artefacts, vous devrez les ramener à un endroit où je pourrai vous transporter vers le Royaume des Hommes.\"\n\n#. Key:\t6B72634A488C0A9471F52AA154E56709\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_82.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_82.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"I’m sorry about that.\"\nmsgstr \"Je suis désolé.\"\n\n#. Key:\t6C7C51F44B3881DDF4AE41B10F4D29E1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_52.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_52.Children(0).Children.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Tabby?\"\nmsgstr \"Tabby ?\"\n\n#. Key:\t6EC585D64AFBB18576EE17B9DFC08AD7\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_2.Children(2).Children.Text\n#. Key:\tFB66CFE943F6EF32D1A40987B969DCDF\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_52.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_2.Children(2).Children.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_52.Children(1).Children.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"What happened?\"\nmsgstr \"Que s'est-il passé ?\"\n\n#. Key:\t766A9A50425FA0D0A0374390B2AF5980\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"I like jokes and it would have been funny for I don’t know a few hours maybe...\"\nmsgstr \"J'aime les blagues et ça aurait été drôle pendant, je ne sais pas, quelques heures peut-être...\"\n\n#. Key:\t81ABC3E441BE2D3A19257BBC9DDD42D0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_41.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_41.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"You can go down there by using the elevator.\"\nmsgstr \"Vous pouvez y descendre en utilisant l'ascenseur.\"\n\n#. Key:\t85B4C0DB47A2A3C3D504C29965DB6390\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_75.Text\n#. Key:\tE6F106AA404B92C9C6E8889876002813\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_64.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_64.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_75.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"We left the artefacts at his tomb, but one day later they disappeared.\"\nmsgstr \"Nous avons laissé les artefacts sur sa tombe, mais un jour plus tard, ils ont disparu.\"\n\n#. Key:\t88F0611349D22BB5B8411FA1232B8724\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_38.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_38.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Bye!\"\nmsgstr \"Au revoir !\"\n\n#. Key:\t8A2BA24948D65C3EC801B6AA589C206F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_30.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_30.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Welcome back!\"\nmsgstr \"Bon retour !\"\n\n#. Key:\t8A3CCFA44EAB376D6CB4C3B7DD8CEE8D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_53.Children(0).Children.Text\n#. Key:\tEEEF64F84F3FE0A37D029EB1A8BBE8A9\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_55.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_53.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_55.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Lillian?\"\nmsgstr \"Lillian ?\"\n\n#. Key:\t8B9C46EA4C46385E6B3770BBD4648280\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_67.Text\n#. Key:\t999245954FBA1853A5E67A88353F152E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_56.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_56.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_67.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Lillian was really kind to us Dwarves. We couldn't ever meet her in person but she could talk to us via the cat Tabby.\"\nmsgstr \"Lillian était vraiment gentille avec nous, les Nains. Nous ne pouvions pas la rencontrer en personne, mais elle pouvait nous parler par l'intermédiaire du chat Tabby.\"\n\n#. Key:\t90C6625D4ED5F6EA08B07A87450A1BC9\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_32.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_32.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"You said something about trains...\"\nmsgstr \"Vous avez dit quelque chose à propos des trains...\"\n\n#. Key:\t92793D7F4D0351BF74BB6A8C3EE6A182\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"How can I open the door?\"\nmsgstr \"Comment puis-je ouvrir la porte ?\"\n\n#. Key:\t941CF27C40D3D82D6B41F5B3DD6501BB\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_52.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_52.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"My friend Tabby was also looking for artefacts.\"\nmsgstr \"Mon ami Tabby était également à la recherche d'artefacts.\"\n\n#. Key:\t991D611A4F8BE2F8EAC77C9D746BAF95\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_78.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_78.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"I think the Kobolds attacked us by surprise.\"\nmsgstr \"Je pense que les Kobolds nous ont attaqués par surprise.\"\n\n#. Key:\t9A7FA46C4687C80EBE3B4580631E9B8E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_43.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_43.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"After the Cataclysm we realized the only way to fight madness is to create rules to follow.\"\nmsgstr \"Après le Cataclysme, nous avons réalisé que la seule façon de combattre la folie est de créer des règles à suivre.\"\n\n#. Key:\t9E9CE4714145ED45CA301AACA6CEBBAF\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_40.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_40.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"But there is a spare key in the Catacombs.\"\nmsgstr \"Mais il y a un double de la clé dans les Catacombes.\"\n\n#. Key:\t9ED5DDC74852A2007D25CDB418A3EDDA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_46.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_46.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"They surely have nothing to do with madness...\"\nmsgstr \"Ils n'ont sûrement rien à voir avec la folie...\"\n\n#. Key:\tA0117BB74AB541DE10847FBC5E5CCB32\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"What we were doing? Well we Dwarves are not like other creatures you might have met.\"\nmsgstr \"Que faisions-nous ? Eh bien, nous, les Nains, ne sommes pas comme les autres créatures que vous avez pu rencontrer.\"\n\n#. Key:\tA258ABB740D6727685853E88F32936E2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"That sounds useful.\"\nmsgstr \"Cela semble utile.\"\n\n#. Key:\tA3F231E34FB4B95DD27A84B9326E0BFE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_24.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_24.Children(0).Children.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Key\"\nmsgstr \"Clé\"\n\n#. Key:\tB0B806C147D2EB9F312987B49DEBFC8F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_47.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_47.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"See? They are simple, effective and logical. Ruin can't harm us as long as we follow all the rules.\"\nmsgstr \"Vous voyez ? Elles sont simples, efficaces et logiques. La Ruine ne peut pas nous nuire tant que nous suivons toutes les règles.\"\n\n#. Key:\tB464CECC4F774535530FC685E0F62787\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_77.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_77.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Do you have any idea how the others died?\"\nmsgstr \"Avez-vous une idée de la façon dont les autres sont morts ?\"\n\n#. Key:\tBE69B91C466965EEF56A6F920AF9E5A8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"I thought they were just kidding.\"\nmsgstr \"Je croyais qu'ils ne faisaient que plaisanter.\"\n\n#. Key:\tBFEAB99A4FE8C61CC35BCC9E926EFA97\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_51.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_51.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Just help me out.\"\nmsgstr \"Aidez-moi.\"\n\n#. Key:\tC06E3A27466B5D6C7FC4A39E55739800\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"But being here for four months seems a bit too much for me.\"\nmsgstr \"Mais être ici pendant quatre mois me semble un peu trop pour moi.\"\n\n#. Key:\tC31327F8430D2259C27BAE91F44F0119\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_2.Children(0).Children.Text\n#. Key:\tCCD4C84941546627E158A4915B41CDB7\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_19.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_19.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_2.Children(0).Children.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"How?\"\nmsgstr \"Comment ?\"\n\n#. Key:\tC3BFAD59497E357A8180ADB86C75F14B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_68.Text\n#. Key:\tFF1A18C04F33FF434A2821A725CBFB5C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_57.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_57.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_68.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"She cared about us. She knew all our Strongholds and Outposts. She always warned us before the Kobolds attacked.\"\nmsgstr \"Elle se souciait de nous. Elle connaissait tous nos Bastions et nos Avant-Postes. Elle nous prévenait toujours avant que les Kobolds n'attaquent.\"\n\n#. Key:\tC5A94EDD47BC3D5F422A29982308E78D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_19.Children(1).Children.Text\n#. Key:\tF811970946DF32346DAE66AFE2F64664\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_2.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_19.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_2.Children(1).Children.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Why?\"\nmsgstr \"Pourquoi ?\"\n\n#. Key:\tC8E54B6E448A194DEB141C84323308F6\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_80.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_80.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"It was only a matter of time.\"\nmsgstr \"Ce n'était qu'une question de temps.\"\n\n#. Key:\tCA02594643A55D1128F06FB2E8FDE676\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_50.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_50.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Yes, trains. I can help you reach destinations you couldn't reach on your own.\"\nmsgstr \"Oui, les trains. Je peux vous aider à atteindre des destinations que vous ne pourriez pas atteindre par vos propres moyens.\"\n\n#. Key:\tCC191532450BFB2679AFD88AD95B72B2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Finally someone!\"\nmsgstr \"Enfin quelqu'un !\"\n\n#. Key:\tCF4351D047E267981EF869BE88BB0753\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_24.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_24.Children(1).Children.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Dwarves\"\nmsgstr \"Nains\"\n\n#. Key:\tD2377C864A2A80F17AD81581D7A7807F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_81.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_81.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Odd that I survived.\"\nmsgstr \"Il est étrange que j'aie survécu.\"\n\n#. Key:\tDF12303E4C7A4DFB00054EA7CE07FF88\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_39.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_39.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Errr... I don't know.\"\nmsgstr \"Errr... Je ne sais pas.\"\n\n#. Key:\tE8270F474353ECB77560C4A1173638A2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_27.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_27.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Any idea where that key might be?\"\nmsgstr \"Une idée de l'endroit où cette clé pourrait se trouver ?\"\n\n#. Key:\tEF1EFC6E4119CC9B41AF21ACE008D3B5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_26.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_26.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Have you found the key?\"\nmsgstr \"Avez-vous trouvé la clé ?\"\n\n#. Key:\tF47418854FDFB9AD0E10468BEC8F1F58\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_42.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_42.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"I need to go now.\"\nmsgstr \"Je dois y aller maintenant.\"\n\n#. Key:\tF553C35F43DFC6CA04DA48A738597696\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_25.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_25.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Back already?\"\nmsgstr \"Déjà de retour ?\"\n\n#. Key:\tFF942F904300D874A8C59AB8A954EF86\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_34.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_34.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Well done! Thank you! Thank you!\"\nmsgstr \"Bravo ! Merci ! Merci !\"\n\n#. Key:\t0499C9ED4395C4DD8AD1E48E854CD983\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"It was nice to see you too!\"\nmsgstr \"C'était un plaisir de vous voir aussi !\"\n\n#. Key:\t07153D014D72AF193040BA91A18BDC0A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_24.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_24.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"Great!\"\nmsgstr \"Parfait !\"\n\n#. Key:\t106E51E34033895E5C7F348AF8994564\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"Er... Thanks! We'll talk about this later.\"\nmsgstr \"Euh... Merci ! On en reparlera plus tard.\"\n\n#. Key:\t18E140B74385C5E48F23E0B7E862E569\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"Hello! It's nice to see you again.\"\nmsgstr \"Bonjour ! C'est un plaisir de vous revoir.\"\n\n#. Key:\t25F72BCA416C39658A0879A27417EA6B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"Don’t worry, I’ll make ready a train for you heading that way.\"\nmsgstr \"Ne vous inquiétez pas, je vais préparer un train pour vous qui ira dans cette direction.\"\n\n#. Key:\t26CBB1CD40F2080DE2183BA6AB3D2014\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"Ask him how you can travel to World’s End.\"\nmsgstr \"Demandez-lui comment vous pouvez voyager à la Fin du Monde.\"\n\n#. Key:\t26D1F4534C708623FB300DBE4EECADD2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"But I can't go back, because it's not safe.\"\nmsgstr \"Mais je ne peux pas y retourner, parce que ce n'est pas sûr.\"\n\n#. Key:\t2B14E76B4B16316D7525FFA6D37E4CBB\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"You know I'm a bit worried about what will happen to the Outpost.\"\nmsgstr \"Vous savez, je suis un peu inquiet de ce qui va arriver à l'Avant-Poste.\"\n\n#. Key:\t2BB0F16046A4CD8DF05DE6A95D2CF9B3\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"I’m really glad you found that key for me. Now I can finish my supper outside in fresh air!\"\nmsgstr \"Je suis vraiment content que vous ayez trouvé cette clé pour moi. Maintenant, je peux finir mon dîner dehors, à l'air frais !\"\n\n#. Key:\t36EF13F042D5B5ADB870BEB97F688D08\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_29.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_29.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"Take this! You deserve it!\"\nmsgstr \"Prenez ça ! Vous le méritez !\"\n\n#. Key:\t3E09B8F746E999130D26A0BEA945E6D6\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"Is everything all right?\"\nmsgstr \"Est-ce que tout va bien ?\"\n\n#. Key:\t4D5A326948713FE977D0DBB68CF4A475\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_27.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_27.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"Except those crazy traps...\"\nmsgstr \"Sauf ces pièges diaboliques...\"\n\n#. Key:\t5BE2C4324B64B35BD181B49E2D63E87F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"By the way, in case you need to go somewhere with the train just let me know.\"\nmsgstr \"Au fait, au cas où vous auriez besoin d'aller quelque part avec le train, faites-le moi savoir.\"\n\n#. Key:\t66EDC37F4F3B3813F1B92D91A4107ADE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"I have banished some of the monsters lurking in the Outpost.\"\nmsgstr \"J'ai banni certains des monstres qui se cachent dans l'avant-poste.\"\n\n#. Key:\t67EED0C742F3B4ED0A9B929C4B517A4A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"The Outpost is safe again.\"\nmsgstr \"L'Avant-Poste est à nouveau en sécurité.\"\n\n#. Key:\t6F1AF94E4DE4A338EFF79C85D99B944A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_19.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_19.Children(1).Children.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"Outpost\"\nmsgstr \"Avant-Poste\"\n\n#. Key:\t84D15B994BADC0AAED61848E817E49E1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"Thanks!\"\nmsgstr \"Merci !\"\n\n#. Key:\t8C7D69324C544DAC53C5CCA724B4B461\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_23.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_23.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"Could you somehow make the enemies move to somewhere else maybe?\"\nmsgstr \"Pourriez-vous, d'une manière ou d'une autre, faire déménager les ennemis ailleurs ?\"\n\n#. Key:\t8F66738A44B7D19EABAD40873B3FCAA3\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_19.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_19.Children(0).Children.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"Do you need help?\"\nmsgstr \"Vous avez besoin d'aide ?\"\n\n#. Key:\t9249DFC34CFB46E1738C97A3283268D2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"Well done! Well done!\"\nmsgstr \"Bravo ! Bravo !\"\n\n#. Key:\tA027C29849372B1C452083A84609B1F5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_19.Children(2).Children.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_19.Children(2).Children.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"Leave\"\nmsgstr \"Partir\"\n\n#. Key:\tA037C9E543AC131DAF4B6281A27BD56C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"Hello again my friend!\"\nmsgstr \"Bonjour à nouveau mon ami !\"\n\n#. Key:\tA4F1343D4D537FC1907096B564D3842E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"Oh, it must be a charming place!\"\nmsgstr \"Oh, ça doit être un endroit charmant !\"\n\n#. Key:\tACF022EF4C55A6553F29DB969827379D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_26.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_26.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"Anyway, take this for your effort!\"\nmsgstr \"Quoi qu'il en soit, prenez ceci pour vous récompenser de votre effort !\"\n\n#. Key:\tB680A1D54923C59C081E46A65A2754D1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"As the last Defender, it would be my duty to keep that place safe.\"\nmsgstr \"En tant que dernier Défenseur, il serait de mon devoir de garder cet endroit en sécurité.\"\n\n#. Key:\tB9E0526D41FDB742FCB51991A0220B17\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"That’s where I can take you out of the Ruined Realm.\"\nmsgstr \"C'est là que je peux vous faire sortir du Royaume en Ruines.\"\n\n#. Key:\tBF1AD65A407133C13B811CB14A997A2A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"We can talk some more once I've finished my supper...\"\nmsgstr \"On pourra en reparler quand j'aurai fini mon dîner...\"\n\n#. Key:\tE211EA4D4D69D09144B914850B17A8AE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_25.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_25.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"Well, I can't do my duty until you banish all of them.\"\nmsgstr \"Eh bien, je ne peux pas faire mon devoir tant que vous ne les avez pas tous bannis.\"\n\n#. Key:\tEFD408FF4DAFD18E10ED3282D959914E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"You don't need to go anywhere before you find the three artefacts.\"\nmsgstr \"Vous n'avez pas besoin d'aller quelque part avant de trouver les trois artefacts.\"\n\n#. Key:\tF500AA3C494B40302E298CA54FF3344B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"I would like to go to World’s End.\"\nmsgstr \"Je voudrais aller à la Fin du Monde.\"\n\n#. Key:\tFDC63C35472E1752E2D092BC77DAD28B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"I'll see what I can do.\"\nmsgstr \"Je vais voir ce que je peux faire.\"\n\n#. Key:\t00A5A8684B1EF5FF2319428685540844\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_13.Children(0).Children.Text\n#. Key:\t471B46884399845B6D9442A8EADC2A48\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_9.Children(0).Children.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_13.Children(0).Children.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_9.Children(0).Children.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"Portal\"\nmsgstr \"Portail\"\n\n#. Key:\t03EA3D4249797B593981C1B699A2CF5A\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"Oh! The Walking Ball returned! Just in time!\"\nmsgstr \"Oh ! La Balle qui Marche est de retour ! Juste à temps !\"\n\n#. Key:\t04DC604342615AD3DCFCE99EB9AAF157\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_19.Children(1).Children.Text\n#. Key:\t1070909F4434D9B0D03DD3BD62692CE0\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_16.Children(0).Children.Text\n#. Key:\t76A679CE45B5A9A47CA620A396E02F48\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_13.Children(2).Children.Text\n#. Key:\t8FC1E822454A2FDA1847119C5004F161\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_21.Children(0).Children.Text\n#. Key:\t9036093D446B2F8C34705BBCFC73F4A0\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_9.Children(2).Children.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_13.Children(2).Children.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_16.Children(0).Children.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_19.Children(1).Children.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_21.Children(0).Children.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_9.Children(2).Children.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"Leave\"\nmsgstr \"Partir\"\n\n#. Key:\t142E85484BA4E9CF475F0780D951BAE5\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"But they were so tasty.\"\nmsgstr \"Mais c'était si savoureux.\"\n\n#. Key:\t1E763B4D4D535AA83B50D4B87DB5A15D\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"You again?\"\nmsgstr \"Vous encore ?\"\n\n#. Key:\t2430044E46A3456249D6A99D0FC31D30\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_9.Children(1).Children.Text\n#. Key:\tB3695A284A15574F3874BDAB1B8C14EB\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_19.Children(0).Children.Text\n#. Key:\tDC8D78774D326DA9A70EFC81A857A417\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_13.Children(1).Children.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_13.Children(1).Children.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_19.Children(0).Children.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_9.Children(1).Children.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"Give Weird Device\"\nmsgstr \"Donner l'Étrange Dispositif\"\n\n#. Key:\t29AD586B41502E4FAFF79E94FDADA50D\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"Unfortunately I don't have any.\"\nmsgstr \"Malheureusement, je n'en ai pas.\"\n\n#. Key:\t3418CA5A44B4531926317CB100CEC2F4\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"Just let me know when you're done! Meanwhile, I'll be reading a few more pages.\"\nmsgstr \"Faites-moi savoir quand vous avez terminé ! En attendant, je vais lire quelques pages supplémentaires.\"\n\n#. Key:\t37CD676C4C4F585C3CC048B56EEF6B92\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"I was supposed to find a portal here.\"\nmsgstr \"J'étais censé trouver un portail ici.\"\n\n#. Key:\t3C2778B12A09151A002F016B1E3F6212\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"Also, if I hadn't drank the last two bottles... that would have helped...\"\nmsgstr \"De plus, si je n'avais pas bu les deux dernières bouteilles... cela aurait aidé...\"\n\n#. Key:\t42E3EE32491F578E618913B4AF958187\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"Really? That sounds like my students! They were always complaining about unannounced examinations or even worse, \\\"Why are there no lessons tomorrow?\\\".\"\nmsgstr \"Vraiment ? Cela ressemble à mes étudiants ! Ils se plaignaient toujours des examens inopinés ou pire encore, \\\"Pourquoi n'y a-t-il pas de cours demain ?\\\".\"\n\n#. Key:\t44626CCD498CA592B8FAD1B01EDF33AB\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_2.Children(0).Children.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_2.Children(0).Children.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"Don't have\"\nmsgstr \"Je n'ai pas\"\n\n#. Key:\t55EAD2524D0BCF52B25A1B9EAB1754B2\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"That's it my ball! I wish I had more students like you.\"\nmsgstr \"Ça c'est ma balle ! J'aimerais avoir plus d'étudiants comme vous.\"\n\n#. Key:\t6682474947E016803A188FA968FD76BE\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"Oh my...\"\nmsgstr \"Oh mon...\"\n\n#. Key:\t786849EF4E531580865712BBEDD25B32\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"That is amazing! Thank you, my globular friend! Take these coins, I am sure that you will enjoy spending them on... on whatever Balls like you like to get.\"\nmsgstr \"C'est incroyable ! Merci, mon ami globulaire ! Prends ces pièces, je suis sûr que tu aimeras les dépenser pour... pour n'importe quelle Boule que tu aimes avoir.\"\n\n#. Key:\t7FFC816545AA219D43FCA3A2ABF33E9E\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"Nevermind, I will just read a bit more... at least until a solution is found for the whole problem.\"\nmsgstr \"Peu importe, je vais juste lire un peu plus... au moins jusqu'à ce qu'une solution soit trouvée pour l'ensemble du problème.\"\n\n#. Key:\t818E4C1245F622C192178CB1F21694A3\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_2.Children(1).Children.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_2.Children(1).Children.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"What's the matter?\"\nmsgstr \"Qu'est-ce qu'il y a ?\"\n\n#. Key:\t84A119EB4FFB518BA7AA6394768F1DD3\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"Did the Gatekeeper open the gate for you?\"\nmsgstr \"Le Gardien vous a-t-il ouvert la porte ?\"\n\n#. Key:\t88FD93954B70482DAC5F2AA5332F23D5\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"One must always be eager to solve a problem. No matter how challenging that is.\"\nmsgstr \"Il faut toujours être désireux de résoudre un problème. Peu importe le défi que cela représente.\"\n\n#. Key:\t9CEE1942434DACB2DB3C1AA2005A1E94\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"But we might find another way to solve the problem.\"\nmsgstr \"Mais nous pourrions trouver un autre moyen de résoudre le problème.\"\n\n#. Key:\tC070EF8E47744D116D4E39AC8F7C1941\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"I hope that you still have at least one bottle of that potion of mine. I could really use some...\"\nmsgstr \"J'espère que vous avez encore au moins une bouteille de ma potion. J'aurais vraiment besoin de...\"\n\n#. Key:\tC39CD0F34CDFDCB0B2CF08917834F1A8\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"Here is a Weird Device that I found in the hideout of the Secret Science Society.\"\nmsgstr \"Voici un Dispositif Étrange que j'ai trouvé dans la cachette de la Société des Sciences Secrètes.\"\n\n#. Key:\tCBB0BCAF4E19F942AC57F988104A9A65\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"I've used all of them to get back from the Sewer. You should have told me that there is another way out!\"\nmsgstr \"Je les ai tous utilisés pour revenir des Égouts. Vous auriez dû me dire qu'il y avait une autre sortie !\"\n\n#. Key:\tE866A83647B163E53260C2B541AA0D7B\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"Well, the portal is definitely here, but as you might have already noticed, the place is a bit worn.\"\nmsgstr \"Eh bien, le portail est bien là, mais comme vous l'avez peut-être déjà remarqué, l'endroit est un peu usé.\"\n\n#. Key:\tF0A4AD1448267D94CAB7F79AD6CEFD59\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"Not Yet.\"\nmsgstr \"Pas encore.\"\n\n#. Key:\tF83C2C894C2EA511DCDCE6B824CC0591\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"Only the Gatekeeper can reopen the portal.\"\nmsgstr \"Seul le Gardien peut rouvrir le portail.\"\n\n#. Key:\t76653DEC40EE0ED098B5EE8810B1A097\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/TL_GetSoulkeeper.TL_GetSoulkeeper:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/TL_GetSoulkeeper.TL_GetSoulkeeper:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_TL_GetSoulkeeper\"\nmsgid \"A Spellcaster. It makes you able to use the Ruined Realm's magic, at least, up to a certain level.\"\nmsgstr \"Un Lanceur de Sorts. Il vous permet d'utiliser la magie du Royaume en Ruines, du moins jusqu'à un certain niveau.\"\n\n#. Key:\tBD48F7804F49751510AB2E909906C52F\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/TL_GetSoulkeeper.TL_GetSoulkeeper:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/TL_GetSoulkeeper.TL_GetSoulkeeper:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_TL_GetSoulkeeper\"\nmsgid \"What is it?\"\nmsgstr \"Qu'est-ce que c'est ?\"\n\n#. Key:\tDFF1C93D4005A778F0B696A2DC949DC6\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/TL_GetSoulkeeper.TL_GetSoulkeeper:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/TL_GetSoulkeeper.TL_GetSoulkeeper:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_TL_GetSoulkeeper\"\nmsgid \"That amulet is useful.\"\nmsgstr \"Cette amulette est utile.\"\n\n#. Key:\t09CDAFF84CF3F066B25A228640D45277\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_TL_Monk\"\nmsgid \"Please tell your Wizard that Monk would like to have a word with him.\"\nmsgstr \"Veuillez dire à votre Magicien que le Moine aimerait lui parler.\"\n\n#. Key:\t0E97585C46B73E4AF939169CF45067A3\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_TL_Monk\"\nmsgid \"I can only guess that right now, he's complaining about me.\"\nmsgstr \"Je ne peux que deviner qu'en ce moment, il se plaint de moi.\"\n\n#. Key:\t2E82A2B6449D8BA37ADBE7AEE1486791\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_TL_Monk\"\nmsgid \"Just get rid of him.\"\nmsgstr \"Débarrassez-vous de lui.\"\n\n#. Key:\t430D927D40EF24EED23E55A83F48FDD7\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_TL_Monk\"\nmsgid \"I'm sorry but he doesn't want to talk to you.\"\nmsgstr \"Je suis désolé, mais il ne veut pas vous parler.\"\n\n#. Key:\t59E21DC1476038EAD4EC91BC00DA4D8B\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_3.Children(2).Children.Text\n#: /Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_3.Children(2).Children.Text\nmsgctxt \"Dialogue_TL_Monk\"\nmsgid \"Ask Wizard\"\nmsgstr \"Questionner le Magicien\"\n\n#. Key:\t5AFB166C49DEB2D9017AED887A1E424D\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_TL_Monk\"\nmsgid \"Farewell, my friend, until we meet again!\"\nmsgstr \"Adieu, mon ami, jusqu'à ce que nous nous rencontrions à nouveau !\"\n\n#. Key:\t5D80CBEB46203E3A759B498B95571F4F\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_3.Children(1).Children.Text\n#: /Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_3.Children(1).Children.Text\nmsgctxt \"Dialogue_TL_Monk\"\nmsgid \"I won't transfer!\"\nmsgstr \"Je ne veux pas de ce transfert !\"\n\n#. Key:\t66D9E1874A9749A8881372807C0B9D54\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_TL_Monk\"\nmsgid \"Ha-ha-ha... I know he heard everything.\"\nmsgstr \"Ha-ha-ha... Je sais qu'il a tout entendu.\"\n\n#. Key:\t8BD7C20C4084000925D1489BE3F6EE15\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_TL_Monk\"\nmsgid \"I don't talk to him!\"\nmsgstr \"Je ne lui parle pas !\"\n\n#. Key:\tA227CE5A47002A80D3988ABA1364CF3E\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_3.Children(0).Children.Text\n#: /Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_3.Children(0).Children.Text\nmsgctxt \"Dialogue_TL_Monk\"\nmsgid \"Wizard don't want\"\nmsgstr \"Le Magicien ne veut pas\"\n\n#. Key:\tA8E469374586A1D8A734D696AF662F9A\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_TL_Monk\"\nmsgid \"I also have something for you, Wanderer!\"\nmsgstr \"J'ai aussi quelque chose pour toi, Vagabond !\"\n\n#. Key:\tCE0E3B1B424BEDDF4A830B8DD0BB3272\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_TL_Monk\"\nmsgid \"This might help you along the way.\"\nmsgstr \"Cela pourrait vous aider en cours de route.\"\n\n#. Key:\tD6B184754B86F236C93454A95BF92B31\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_TL_Monk\"\nmsgid \"I won't deliver your messages anymore! If the two of you want something, then go get it yourselves!\"\nmsgstr \"Je ne délivrerai plus vos messages ! Si vous voulez quelque chose, allez le chercher vous-mêmes !\"\n\n#. Key:\tDB3AEAF24056B19A7D80E29E7D011D80\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_TL_Monk\"\nmsgid \"That's right. I will give him more time.\"\nmsgstr \"C'est exact. Je vais lui donner plus de temps.\"\n\n#. Key:\tE2F9F07A4A2B8D1A578BCC9716AB4D44\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_TL_Monk\"\nmsgid \"Wizard! A fellow named Monk wants to talk to you!\"\nmsgstr \"Magicien ! Un certain Moine veut vous parler !\"\n\n#. Key:\tE8987AC84528E4071DC27E9854C3C4DE\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_TL_Monk\"\nmsgid \"Hello, little Wanderer!\"\nmsgstr \"Bonjour, petit Vagabond !\"\n\n#. Key:\tFF355D9347D0068FBB40879E3EAEA8FB\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_TL_Monk\"\nmsgid \"But please...\"\nmsgstr \"Mais je vous en prie...\"\n\n#. Key:\tAC0DE5F1402FBAAFE6587B827D463C3C\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/TL_SoulkeeperHint.TL_SoulkeeperHint:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/TL_SoulkeeperHint.TL_SoulkeeperHint:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_TL_SoulkeeperHint\"\nmsgid \"Use the Soulstone to summon the Keeper.\"\nmsgstr \"Utilisez la Pierre d'Âme pour invoquer le Gardien.\"\n\n#. Key:\t031849B3493F1528A0146DA55BD7F00F\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/TL_TakeSoulkeeperHint.TL_TakeSoulkeeperHint:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/TL_TakeSoulkeeperHint.TL_TakeSoulkeeperHint:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_TL_TakeSoulkeeperHint\"\nmsgid \"It would be easier if I could just simply summon her back to me...\"\nmsgstr \"Ce serait plus facile si je pouvais simplement la rappeler à moi...\"\n\n#. Key:\t259EE9E14B86B2597D5F4EA60831D269\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/TL_TakeSoulkeeperHint.TL_TakeSoulkeeperHint:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/TL_TakeSoulkeeperHint.TL_TakeSoulkeeperHint:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_TL_TakeSoulkeeperHint\"\nmsgid \"Be more careful the next time...\"\nmsgstr \"Soyez plus prudent la prochaine fois...\"\n\n#. Key:\t86266BC54CC02BE988EA24B18BF76359\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/TL_TakeSoulkeeperHint.TL_TakeSoulkeeperHint:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/TL_TakeSoulkeeperHint.TL_TakeSoulkeeperHint:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_TL_TakeSoulkeeperHint\"\nmsgid \"Now go back to the Soulkeeper.\"\nmsgstr \"Maintenant, retournez voir le Gardien de l'Âme.\"\n\n#. Key:\tDCA8CF9A4CFF4644FBD42EADBFC6E773\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/TL_TakeSoulkeeperHint.TL_TakeSoulkeeperHint:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/TL_TakeSoulkeeperHint.TL_TakeSoulkeeperHint:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_TL_TakeSoulkeeperHint\"\nmsgid \"Er... It's still with me.\"\nmsgstr \"Euh... Il est toujours avec moi.\"\n\n#. Key:\t012DDB8E4423EB98285155B3E1EFBF9A\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_65.Children(2).Children.Text\n#. Key:\t3485AE344D04D0944341F3A7391703EF\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.Children(3).Children.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_65.Children(2).Children.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.Children(3).Children.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"Set me free\"\nmsgstr \"Me libérer\"\n\n#. Key:\t04E44BE94ABFE8614689AC890D01001D\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_65.Children(1).Children.Text\n#. Key:\t275944AA468D9CA8613B9586EC3D9C62\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.Children(2).Children.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_65.Children(1).Children.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.Children(2).Children.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"How to open gate\"\nmsgstr \"Comment ouvrir la porte\"\n\n#. Key:\t10EB6BE941C633380422F7953F0171DA\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"I think... I am...\"\nmsgstr \"Je pense... que je suis...\"\n\n#. Key:\t22618C8F490BC5932411FFB41F38C383\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.SpeechSequence(0).SpeechSequence.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.SpeechSequence(0).SpeechSequence.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"Oh! A walking ball!\"\nmsgstr \"Oh ! Une balle qui marche !\"\n\n#. Key:\t28ED4B8B4023E9A859B8A4BFF7DFEE8A\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"I am crazy, therefore I think!\"\nmsgstr \"Je suis fou, donc je pense !\"\n\n#. Key:\t389F7FA440377CA4EBA31DA4EE2FEEAE\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_65.Children(3).Children.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_65.Children(3).Children.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"Leave\"\nmsgstr \"Partir\"\n\n#. Key:\t408E74BC4DBA10DA41853B9421DBA07B\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_65.Children(0).Children.Text\n#. Key:\t55BC9258400712FE4D5CED8BFA0AD22C\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.Children(1).Children.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_65.Children(0).Children.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.Children(1).Children.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"How to prove Worthy\"\nmsgstr \"Comment Prouver sa Valeur\"\n\n#. Key:\t5D0DBB0344815D41A50D9FA178339BCA\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_24.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_24.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"Here, take one!\"\nmsgstr \"Tenez, prenez-en un !\"\n\n#. Key:\t5E8C88684BE93A26C26BFBAF23D69FD9\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.SpeechSequence(5).SpeechSequence.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.SpeechSequence(5).SpeechSequence.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"And I am not wise. In fact, I am totally crazy. But look on the bright side! At least I am aware of it.\"\nmsgstr \"Et je ne suis pas sage. En fait, je suis totalement fou. Mais regardez le bon côté des choses ! Au moins, j'en suis conscient.\"\n\n#. Key:\t5F9588AA4FFA9FEB2C7101B32CB98950\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_55.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_55.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"Come back if you change your mind!\"\nmsgstr \"Revenez si vous changez d'avis !\"\n\n#. Key:\t69BF5D3C44D3BE2468ADDF97E99920E9\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"I think something's happening with the door's mechanism... but who knows? I can definitely hear some creaking! It's hard to guess which one of those is the real one...\"\nmsgstr \"Je pense qu'il se passe quelque chose avec le mécanisme de la porte... mais qui sait ? Je peux certainement entendre des grincements ! Il est difficile de deviner lequel est le vrai...\"\n\n#. Key:\t6B46CC3F44284076B1F460BEE2D93116\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.SpeechSequence(1).SpeechSequence.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.SpeechSequence(1).SpeechSequence.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"How unique, how original, how... sporty!\"\nmsgstr \"Comme c'est unique, comme c'est original, comme c'est... sportif !\"\n\n#. Key:\t6DFC995B4364B6358A8F00BEDD007C80\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"I am, therefore I think!\"\nmsgstr \"Je suis, donc je pense !\"\n\n#. Key:\t72FA8AF8413CF23907BB9EA6587F512E\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_63.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_63.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"I was pretty sure I had to face him too... that's why I prepared! Potion of Worthiness! I have a few bottles...\"\nmsgstr \"J'étais presque sûr de devoir l'affronter aussi... c'est pourquoi je me suis préparé ! La Potion de Valeur ! J'en ai quelques bouteilles...\"\n\n#. Key:\t7BB736394144C8B2173886993EE33ADA\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"Look, I'm forced to stay in this realm so that I could do all these silly tasks for a wizard. Any chance you could help me with that? Please?\"\nmsgstr \"Ecoutez, je suis obligé de rester dans ce royaume pour pouvoir faire toutes ces tâches idiotes pour un sorcier. Une chance que vous puissiez m'aider à faire ça ? S'il vous plaît ?\"\n\n#. Key:\t7E8985A441145AE9365C64810036EBE0\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.SpeechSequence(3).SpeechSequence.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.SpeechSequence(3).SpeechSequence.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"Actually yes, I...\"\nmsgstr \"En fait, oui, je...\"\n\n#. Key:\t85CB0B164556D460A07F948F942D7AC4\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_61.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_61.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"That's how these rusty monsters work like: you pull a few levers here and there, and... whoops, the door is open! It's called science!\"\nmsgstr \"Voilà comment fonctionnent ces monstres rouillés : vous tirez quelques leviers ici et là, et... oups, la porte est ouverte ! Ça s'appelle la science !\"\n\n#. Key:\t878921884D0FDCFC78971E828C7D7FBB\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_66.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_66.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"I've got to go...\"\nmsgstr \"Je dois y aller...\"\n\n#. Key:\t8FF0B1A64B29AAB8DABAC49F5EBCE625\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_60.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_60.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"That's easy! Just pull every single lever you can find.\"\nmsgstr \"C'est facile ! Il suffit de tirer sur tous les leviers que vous pouvez trouver.\"\n\n#. Key:\t9163F7AB40673D9EB5C936A37CC7B0C7\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_62.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_62.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"Sounds like you met the GateKeeper!\"\nmsgstr \"On dirait que vous avez rencontré le Gardien du Portail !\"\n\n#. Key:\t96EED9B34D798E48F9B47283A5290A5B\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.SpeechSequence(4).SpeechSequence.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.SpeechSequence(4).SpeechSequence.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"It was a rhetorical question. I am not old!\"\nmsgstr \"C'était une question rhétorique. Je ne suis pas vieux !\"\n\n#. Key:\tB3141D2247D5DF307B63A4BF330F8070\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_67.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_67.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"Not really, I don't feel like helping you out. And to be honest, I prefer to stay away from wizards. Sorry!\"\nmsgstr \"Pas vraiment, je n'ai pas envie de vous aider. Et pour être honnête, je préfère rester loin des magiciens. Désolé !\"\n\n#. Key:\tB7A8F5A6474D18116F76BC929DB28D40\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"It's been nice meeting you.\"\nmsgstr \"Ce fut un plaisir de vous rencontrer.\"\n\n#. Key:\tBE16F7204818B7231748D1B9C55DB4F6\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"Here, take this! I hope it's worth the trouble... hahaha... Thanks to you I can continue with my journey... after I read a few more pages, of course.\"\nmsgstr \"Tenez, prenez ça ! J'espère que ça en vaut la peine... hahaha... Grâce à vous, je peux continuer mon voyage... après avoir lu quelques pages de plus, bien sûr.\"\n\n#. Key:\tBF9983D645C558E1AB5D559E70FEFDA0\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.SpeechSequence(6).SpeechSequence.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.SpeechSequence(6).SpeechSequence.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"Is there anything a middle-aged crazy gnome scientist can do for you? Now, this one is not a rhetorical question!\"\nmsgstr \"Un gnome fou d'âge moyen peut-il faire quelque chose pour vous ? Cette question n'est pas rhétorique !\"\n\n#. Key:\tC29E98A84971D7F0585C0F9522C30209\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_64.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_64.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"I will give you one if you are kind enough to open this door for me! I am stuck on the other side, you see...\"\nmsgstr \"Je vous en donnerai un si vous avez la gentillesse de m'ouvrir cette porte ! Je suis coincé de l'autre côté, vous voyez...\"\n\n#. Key:\tC8BEE9304FE466C0EB9F76A0B8A770D6\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.Children(0).Children.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.Children(0).Children.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"No way!\"\nmsgstr \"Impossible !\"\n\n#. Key:\tCB197A5E46F44960333A02B7691B0EA6\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"Thanks and good luck!\"\nmsgstr \"Merci et bonne chance !\"\n\n#. Key:\tCD2D130744EE2EDC8C96B1A286FCCD28\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"Getting help from a mad scientist? Thanks, but I would rather skip that!\"\nmsgstr \"Un scientifique fou qui vous aide ? Merci, mais je préfère ne pas y penser !\"\n\n#. Key:\tD0A8B5EA452D49F6400A18A2CDAC9A0E\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_29.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_29.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"I am crazy, therefore I am!\"\nmsgstr \"Je suis fou, donc je suis !\"\n\n#. Key:\tDA95542D4776F0EF7909078DED258AF8\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_27.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_27.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"You managed to open the gate! Well done!\"\nmsgstr \"Vous avez réussi à ouvrir la porte ! Bravo !\"\n\n#. Key:\tDEC93709471D0B331684CFAF42A65B49\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_37.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_37.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"How unfortunate! And I thought that I was the idiot here. You will totally need my help... you'll see.\"\nmsgstr \"Quel dommage ! Et moi qui pensais que j'étais l'idiot ici. Vous aurez totalement besoin de mon aide... vous verrez.\"\n\n#. Key:\tDF18B66D4109CAA0BCC1FDBED74521CD\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"Some kind of golem sent me here to prove my worthiness... any idea how I could do that?\"\nmsgstr \"Une sorte de golem m'a envoyé ici pour prouver ma valeur... une idée de comment je pourrais faire ça ?\"\n\n#. Key:\tE546AE1443A4262B05869CB758E42CF2\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.SpeechSequence(2).SpeechSequence.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.SpeechSequence(2).SpeechSequence.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"Is there anything an old wise gnome scientist could do for you, I wonder?\"\nmsgstr \"Un vieux sage gnome scientifique pourrait-il faire quelque chose pour vous, je me le demande ?\"\n\n#. Key:\tEEA782044BAA1D5C3B77D49DAE004512\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_58.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_58.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"Any idea how I could open this gate for you?\"\nmsgstr \"Une idée de comment je pourrais vous ouvrir cette porte ?\"\n\n#. Key:\t04BFEE6A43E303DB376ACFA5F270F846\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"I've managed to get this obelisk thing. Do you know what it is?\"\nmsgstr \"J'ai réussi à obtenir ce truc de l'obélisque. Vous savez ce que c'est ?\"\n\n#. Key:\t0A6FE902444DF9B2F18A95B495FB7A90\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"I... I don't know. They are kinda predictable though...\"\nmsgstr \"I... Je ne sais pas. Ils sont un peu prévisibles, cependant...\"\n\n#. Key:\t0AB07AB7403AECECD38D479D8F4A32D2\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"Don't care about it and you'll live longer.\"\nmsgstr \"Ne vous en souciez pas et vous vivrez plus longtemps.\"\n\n#. Key:\t1026E61D4F2798A2E0FEE0B9ACA2135B\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"There is a floating magical thing right there...\"\nmsgstr \"Il y a une chose magique flottante juste là...\"\n\n#. Key:\t174506D944E38D478377CDA1DEF299B4\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"Isn't it weird that doors are always closed around these places?\"\nmsgstr \"N'est-ce pas étrange que les portes soient toujours fermées autour de ces lieux ?\"\n\n#. Key:\t240F98824200E33959D455AF1A3219B8\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_37.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_37.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"This is my research project! Looks totally garbage, but sometimes even I cannot understand my brilliance.\"\nmsgstr \"C'est mon projet de recherche ! Ça a l'air complètement nul, mais parfois, même moi, je ne peux pas saisir l'ampleur de ma propre intelligence.\"\n\n#. Key:\t24286C6A494F848CE13B5C98E38D4718\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_6.Children(0).Children.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_6.Children(0).Children.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"Let him answer\"\nmsgstr \"Laissez-le répondre\"\n\n#. Key:\t26727CAB403FA6DED50EC38ED01E4241\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"I found the secret hideout of the Secret Science Society. Is there anything you could tell me about them?\"\nmsgstr \"J'ai trouvé la cachette secrète de la Société des Sciences Secrètes. Pourriez-vous me dire quelque chose à leur sujet ?\"\n\n#. Key:\t2BF9EF0C41CB352340F460AE4BC0FE02\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"I guess he will be happy if you return this to him, but otherwise it's garbage.\"\nmsgstr \"Je suppose qu'il sera content si vous lui rendez ça, mais sinon, ça ne sert à rien.\"\n\n#. Key:\t315BB85E475FAA4C715E7F850B0E5EE2\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_24.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_24.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"Really? Then maybe I should give you this: another bottle of Potion of Worthiness!\"\nmsgstr \"Vraiment ? Alors je devrais peut-être vous donner ceci : une autre bouteille de Potion de Valeur !\"\n\n#. Key:\t316CF9AD4CF36FAFFAC45CA0A488FE53\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_57.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_57.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"I've got to go...\"\nmsgstr \"Je dois y aller...\"\n\n#. Key:\t3A9767C34F0BB6E9E131D8BC7A8D9A25\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_26.Children(1).Children.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_26.Children(1).Children.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"Secret Science Society\"\nmsgstr \"Société des Sciences Secrètes\"\n\n#. Key:\t3E857073418A17EC48A1EA9D2B28A43E\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_30.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_30.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"I pulled a few levers here and there...\"\nmsgstr \"J'ai tiré quelques leviers ici et là...\"\n\n#. Key:\t4671C3394EAF0988255C8090B409415D\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"Yes, things like that happen here all the time. You'll get used to it.\"\nmsgstr \"Oui, ce genre de choses arrive tout le temps ici. Vous vous y habituerez.\"\n\n#. Key:\t4709B6384B48D479672BC69EBC640C7E\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_31.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_31.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"Oh, really? That was nice, even if it was absolutely unnecessary! Never mind, here is your reward!\"\nmsgstr \"Oh, vraiment ? C'était bien, même si c'était absolument inutile ! Peu importe, voici votre récompense !\"\n\n#. Key:\t5AE5A1A6408BC2EB0F9F96BA0826ACB0\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"Hmm... One of the creaks was a bit odd. I think the door will open soon!\"\nmsgstr \"Hmm... Un des grincements était un peu bizarre. Je pense que la porte va bientôt s'ouvrir !\"\n\n#. Key:\t5C81129F4B064C44F44335A3AB1CC178\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_29.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_29.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"The mind is furnished with ideas by a drunk upholsterer...\"\nmsgstr \"L'esprit est meublé d'idées d'un tapissier ivre...\"\n\n#. Key:\t5E441CF6434D7CA180853BBCBD6DFE44\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"Also, reading something represents such a nice way of killing time when I encounter a closed door!\"\nmsgstr \"Aussi, lire quelque chose représente une si belle façon de tuer le temps quand je fait face à une porte fermée !\"\n\n#. Key:\t6B46D1EC463D3B9A4BFBBDB7725C0C22\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"How about a deal? Open this door and I will give you another bottle from my collection of Potions of Worthiness.\"\nmsgstr \"Que diriez-vous d'un accord ? Ouvrez cette porte et je vous donnerai une autre bouteille de ma collection de Potions de la Valeur.\"\n\n#. Key:\t745CA5274A281AAA12CF798A53D54ACE\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_26.Children(3).Children.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_26.Children(3).Children.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"Ask about the book\"\nmsgstr \"Informations sur le livre\"\n\n#. Key:\t84DCE2A448C57E7FAD93CB9029BBD605\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_26.Children(0).Children.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_26.Children(0).Children.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"Floating obelisk\"\nmsgstr \"Obélisque flottant\"\n\n#. Key:\t922B00804A843BD8EC9DB984D794F145\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"We met before, right? Of course we did.\"\nmsgstr \"On s'est déjà rencontrés, non ? Bien sûr que nous nous sommes rencontrés.\"\n\n#. Key:\t9837238E42F28684DEBA2DAF9B332415\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"It might actually be total nonsense. That's what I am trying to find out at the moment, so I am reading it again and again and again...\"\nmsgstr \"Il se peut que ce soit en fait une absurdité totale. C'est ce que j'essaie de découvrir en ce moment, alors je le lis encore et encore et encore...\"\n\n#. Key:\t995EAB564791A7F8BF34D3A26026F383\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_26.Children(4).Children.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_26.Children(4).Children.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"Leave\"\nmsgstr \"Partir\"\n\n#. Key:\t9AD95267429D21EE59DC83937AD6811A\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"This is a Memory Crystal made by a really old looking man I've met long ago.\"\nmsgstr \"C'est un Cristal de Mémoire fait par un homme très vieux que j'ai rencontré il y a longtemps.\"\n\n#. Key:\tA9DF44F54971A33775FF939FB292E26E\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"No man's knowledge here can go beyond my experience!\"\nmsgstr \"Les connaissances d'aucun homme ici ne peuvent aller au-delà de mon expérience !\"\n\n#. Key:\tAC59E35B420DF0F9B771B9938AC23891\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"I sure can! They used to invent cool stuff back in the days, before... you know, everyone's mind decided to go a bit insane.\"\nmsgstr \"C'est sûr ! Ils inventaient des trucs cool à l'époque, avant que... vous savez, l'esprit de tout le monde décide de devenir un peu fou.\"\n\n#. Key:\tB1E177F0430A3887A76CFAA46CE650AD\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"I don’t know why we are here... maybe to enjoy ourselves?\"\nmsgstr \"Je ne sais pas pourquoi nous sommes ici... peut-être pour nous amuser ?\"\n\n#. Key:\tB5E57C3A4B0D51020B4F3C872164E8F2\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_26.Children(2).Children.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_26.Children(2).Children.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"Another door\"\nmsgstr \"Une autre porte\"\n\n#. Key:\tBA0C0F42482F357506A9C7ABADB6E49A\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_33.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_33.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"On the other hand, everyone is crazy these days... so we don't need doors anymore!\"\nmsgstr \"D'un autre côté, tout le monde est fou de nos jours... alors on n'a plus besoin de portes !\"\n\n#. Key:\tBAC86050470A5EC67C30349C6B13DFE0\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"To be perceived is to be!\"\nmsgstr \"Etre perçu, c'est être !\"\n\n#. Key:\tBAD7934444B3EB256141BFB689BB83A0\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"I will let you know when I come up with something.\"\nmsgstr \"Je vous ferai savoir quand je trouverai quelque chose.\"\n\n#. Key:\tBE5570C5477044DD0B1EEE928EAD8FA8\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_32.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_32.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"Nah. The world is full of crazy people. If I were sane, I would have liked to have as many closed doors as possible between me and those weirdos.\"\nmsgstr \"Non. Le monde est plein de fous. Si j'étais sain d'esprit, j'aurais aimé avoir autant de portes fermées que possible entre moi et ces fous.\"\n\n#. Key:\tBE8120CC4E6A028BB45F10843F98135D\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"The door asks for a password that members use to enter the hideout... any idea what that could be?\"\nmsgstr \"La porte demande un mot de passe que les membres utilisent pour entrer dans la cachette... une idée de ce que cela pourrait être ?\"\n\n#. Key:\tC7BE32BF43F7BA6D88A666956FAC35F3\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"I am here because I actually have to prove my worth again...\"\nmsgstr \"Je suis ici parce que je dois encore prouver ma valeur...\"\n\n#. Key:\tC7ECC6D9457A4C49B39E98AEB14474E5\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_25.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_25.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"And I would actually feel much happier if I were on the other side of the door! You know,... I tried to ask it nicely to open and it just ignored me!\"\nmsgstr \"Et je serais en fait beaucoup plus heureux si j'étais de l'autre côté de la porte ! Vous savez... J'ai essayé de lui demander gentiment de s'ouvrir et il m'a ignoré !\"\n\n#. Key:\tD2F4B8E44239904A7BD4DD90336C871A\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_45.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_45.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"What kind of book is that?\"\nmsgstr \"Quel genre de livre est-ce ?\"\n\n#. Key:\tED75E2104CCC3912A77DF18F7C916690\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"It was nice seeing you...\"\nmsgstr \"C'était agréable de vous voir...\"\n\n#. Key:\tF87975A94604B526DE1B638250BD85A9\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_27.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_27.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"The gate is open! Maybe this creature has a heart after all... and probably started feeling sorry for me as well.\"\nmsgstr \"La porte est ouverte ! Peut-être que cette créature a un coeur après tout... et a probablement commencé à avoir pitié de moi aussi.\"\n\n#. Key:\tFE470DB5464E438A122FAFAF593AF92B\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"Let me see! Yes... Oh...\"\nmsgstr \"Laissez-moi voir ! Oui... Oh...\"\n\n#. Key:\t066896454B62A9809060EBB3E0222D9A\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_SpeechSequence_1.SpeechSequence(3).SpeechSequence.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_SpeechSequence_1.SpeechSequence(3).SpeechSequence.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"Also, after skipping a couple of lectures, I got fired from university.\"\nmsgstr \"De plus, après avoir sauté quelques cours, je me suis fait virer de l'université.\"\n\n#. Key:\t17D1F3394E12F6C85A11C2B3D3BD1ACE\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_SpeechSequence_1.SpeechSequence(0).SpeechSequence.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_SpeechSequence_1.SpeechSequence(0).SpeechSequence.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"I am a scientist! I managed to prove it! I discovered this when I was conducting my research on gnome behavior...\"\nmsgstr \"Je suis un scientifique ! J'ai réussi à le prouver ! Je l'ai découvert lors de mes recherches sur le comportement des gnomes...\"\n\n#. Key:\t17D8D3C2484BA654BEAE8CACA3AD7501\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"Help me out with the door for the last time, and I will give you my last potion!\"\nmsgstr \"Aidez-moi à franchir la porte pour la dernière fois, et je vous donnerai ma dernière potion !\"\n\n#. Key:\t22439DB6407947A700A6E9AFB4D29261\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"Hello again! You remember me, right? I'm the gnome who was crazy before it was cool!\"\nmsgstr \"Bonjour à nouveau ! Vous vous souvenez de moi, n'est-ce pas ? Je suis le gnome qui était fou avant que ce soit à la mode !\"\n\n#. Key:\t2546F34E402CB4B25911238CC1E7A70F\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_29.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_29.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"Be as you with to seem.\\r\\n... or was it seem as you wish to be?\"\nmsgstr \"Soyez comme vous êtes.\\n... ou était-ce comme vous souhaitez l'être ?\"\n\n#. Key:\t2A78FDD9465789DC4FF5EB970C63F618\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"That is amazing! Thank you, my globular friend! Take these coins, I am sure you will enjoy spending them on... on whatever Balls like you like to spend.\"\nmsgstr \"C'est incroyable ! Merci, mon ami globulaire ! Prenez ces pièces, je suis sûr que vous aimerez les dépenser pour... pour n'importe quoi qu'une Boule comme vous se plaît à dépenser.\"\n\n#. Key:\t2EB726F641E4EF882228F6B49DA2B313\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_26.Children(1).Children.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_26.Children(1).Children.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"Password\"\nmsgstr \"Mot de Passe\"\n\n#. Key:\t339840D54BD71CF86F9DE4A801B1414F\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"I sure can! They used to invent cool stuff back in the days, before... you know, everyone's mind decided to go a bit insane.\"\nmsgstr \"C'est sûr ! Ils inventaient des trucs cool à l'époque, avant que... vous savez, l'esprit de tout le monde décide de devenir un peu fou.\"\n\n#. Key:\t3E639AB84A0D241D73AB8A991A483090\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_26.Children(4).Children.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_26.Children(4).Children.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"Leave\"\nmsgstr \"Partir\"\n\n#. Key:\t464D32224CC04AD1F97602803245A37C\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"Take this! You deserve it...\"\nmsgstr \"Prenez ça ! Vous le méritez...\"\n\n#. Key:\t4BB0354D4398A4115F3A78B8EFCC7D16\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_27.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_27.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"I can't believe my eyes! It is open!\"\nmsgstr \"Je n'en crois pas mes yeux ! C'est ouvert !\"\n\n#. Key:\t6488288A45256CE464004F9BFF776850\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_24.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_24.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"It's your lucky day! Take this... it's my last bottle, but I guess your needs are greater than mine!\"\nmsgstr \"C'est votre jour de chance ! Prenez ceci... c'est ma dernière bouteille, mais je suppose que vos besoins sont plus grands que les miens !\"\n\n#. Key:\t696219734B2E6966C53BE8B43A0C2212\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"The unexamined life is not worth living!\"\nmsgstr \"La vie sans examen ne vaut pas la peine d'être vécue !\"\n\n#. Key:\t6FD516D14E42F5EC1D05CEA0F476BDEC\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"If you manage to find a strangely unique device in the hideout, I would be more than happy to buy that from you...\"\nmsgstr \"Si vous parvenez à trouver un appareil étrangement unique dans la cachette, je serais plus qu'heureux de vous l'acheter...\"\n\n#. Key:\t75BBEA604E9A3BAEF7599AA937E1AB2A\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"And you have the habit of needing my potions..\"\nmsgstr \"Et vous avez l'habitude d'avoir besoin de mes potions..\"\n\n#. Key:\t7978DCFE4044A6A3EC9F6BA54BAAD8BF\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"Yes, I am pretty sure this week is \\\"The only true wisdom is in knowing you know everything.\\\".\"\nmsgstr \"Oui, je suis presque sûr que cette semaine c'est \\\"La seule vraie sagesse est de savoir que vous savez tout\\\".\"\n\n#. Key:\t88881A3742ABFEAB95CA938C1AA81B60\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_25.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_25.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"I guess we are in the same boat - well, more or less... figuratively speaking, of course, because I can't really stand boats!\"\nmsgstr \"Je suppose que nous sommes dans le même bateau - enfin, plus ou moins... au sens figuré, bien sûr, car je ne supporte pas vraiment les bateaux !\"\n\n#. Key:\t8A80B7554F39A818E4E66294BAFC9A76\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_26.Children(0).Children.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_26.Children(0).Children.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"Secret Science Society\"\nmsgstr \"Société des Sciences Secrètes\"\n\n#. Key:\t91E6FD4A44AB2E17C88767B0F17D6D1E\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_30.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_30.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"Why do you think that you're crazy?\"\nmsgstr \"Pourquoi pensez-vous que vous êtes fou ?\"\n\n#. Key:\t98E36F354D811F5DE5F98A942250997E\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"It is always wrong to believe everything!\"\nmsgstr \"Il est toujours faux de tout croire !\"\n\n#. Key:\t9B6EADBA4946B100D566988907A9675D\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"Any luck with the password for the Secret Science Society door?\"\nmsgstr \"Avez-vous trouvé le mot de passe de la porte de la Société des Sciences Secrètes ?\"\n\n#. Key:\tA0F52B7148A942673A3489857B8C6EA9\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_26.Children(2).Children.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_26.Children(2).Children.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"Give Weird Device\"\nmsgstr \"Donner l'Étrange Dispositif\"\n\n#. Key:\tABE60F4D4709CCE1AF2A5197C03C8193\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"See you later...\"\nmsgstr \"A plus tard...\"\n\n#. Key:\tB07C5C9A48839C3E81F6FA8B7550BBA4\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"I also have the bad habit of being obstructed by closed doors!\"\nmsgstr \"J'ai aussi la mauvaise habitude d'être bloqué par des portes fermées !\"\n\n#. Key:\tB7C7314840274942F6D606B35398F039\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"The door asks for a password that members need to provide in order to enter the hideout... any idea what that could be?\"\nmsgstr \"La porte demande un mot de passe que les membres doivent fournir pour entrer dans la cachette... une idée de ce que cela peut être ?\"\n\n#. Key:\tBB1AEBA44695D09192D7CA98AF9166B0\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_SpeechSequence_1.SpeechSequence(2).SpeechSequence.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_SpeechSequence_1.SpeechSequence(2).SpeechSequence.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"No wonder everyone started to consider me an idiot.\"\nmsgstr \"Pas étonnant que tout le monde ait commencé à me considérer comme un idiot.\"\n\n#. Key:\tC0B9CA5E4273E95306AD0C824ADFD84B\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_SpeechSequence_1.SpeechSequence(1).SpeechSequence.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_SpeechSequence_1.SpeechSequence(1).SpeechSequence.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"Long story short, I used to do all these crazy things, like talking about the weather or taking naps in the afternoon. At first, they seemed okay to me but in reality what I was doing was totally ridiculous!\"\nmsgstr \"Pour faire court, je faisais toutes ces choses folles, comme parler du temps ou faire des siestes l'après-midi. Au début, elles me semblaient correctes, mais en réalité, ce que je faisais était totalement ridicule !\"\n\n#. Key:\tC4193800427609972A2DECAB99D8CE6C\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"Hmm... One of the creaks was a bit odd. I think the door will open soon!\"\nmsgstr \"Hmm... Un des grincements était un peu bizarre. Je pense que la porte va bientôt s'ouvrir !\"\n\n#. Key:\tD1254F624213EAE67D6DD780182AA2DA\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"It was nice seeing you!\"\nmsgstr \"C'était un plaisir de vous voir !\"\n\n#. Key:\tD19327714CD0B2833BC7EBBD1E89CC83\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_26.Children(3).Children.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_26.Children(3).Children.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"You Crazy?\"\nmsgstr \"Vous êtes Fou ?\"\n\n#. Key:\tE5C93E794F71C393568D0B855117C738\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"I found the secret hideout of the Secret Science Society. Do you know anything about them?\"\nmsgstr \"J'ai trouvé la cachette secrète de la Société des Sciences Secrètes. Savez-vous quelque chose à leur sujet ?\"\n\n#. Key:\tEF216A2549E20C15A2C28184B62D45E6\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_36.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_36.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"Turns out that you cannot skip lectures if you're the teacher.\"\nmsgstr \"Il s'avère que vous ne pouvez pas sauter les cours si vous êtes le professeur.\"\n\n#. Key:\tEF650E874498865FA9FE6F9B9C37AB71\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"Here is the Weird Device I found in the hideout of the Secret Science Society.\"\nmsgstr \"Voici le Dispositif Étrange que j'ai trouvé dans la cachette de la Société des Sciences Secrètes.\"\n\n#. Key:\t17A0CE394E01E1FFB31AA9A485E033AC\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_2.Children(4).Children.Text\n#: /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_2.Children(4).Children.Text\nmsgctxt \"Dialogue_TLSecretSocietyGate\"\nmsgid \"Mellon\"\nmsgstr \"Mellon\"\n\n#. Key:\t3293778C41F588EAC2DECDA76DA86A8E\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_2.Children(0).Children.Text\n#: /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_2.Children(0).Children.Text\nmsgctxt \"Dialogue_TLSecretSocietyGate\"\nmsgid \"The only...\"\nmsgstr \"Le seul...\"\n\n#. Key:\t359996CC441CAB0497303A9C666F0CCD\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_TLSecretSocietyGate\"\nmsgid \"*******? No, that is not correct.\"\nmsgstr \"******* ? Non, ce n'est pas correct.\"\n\n#. Key:\t3C864B7F434DA42CAB07BCA70FB2E6A6\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_1.Children(0).Children.Text\n#: /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_1.Children(0).Children.Text\nmsgctxt \"Dialogue_TLSecretSocietyGate\"\nmsgid \"Okay, whatever\"\nmsgstr \"Ok, peu importe\"\n\n#. Key:\t40C27B354470AB53239424BCC2B8D259\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_TLSecretSocietyGate\"\nmsgid \"Do you really think secret scientists would use an elven word as a password? I don't even know what that means.\"\nmsgstr \"Pensez-vous vraiment que des scientifiques secrets utiliseraient un mot elfique comme mot de passe ? Je ne sais même pas ce que cela signifie.\"\n\n#. Key:\t4E89070F413EF5CD964EEF90234BEBC5\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_TLSecretSocietyGate\"\nmsgid \"I am pretty sure that it is better to avoid the Secret Science Society anyways...\"\nmsgstr \"Je suis presque sûr qu'il vaut mieux éviter la Société des Sciences Secrètes de toute façon...\"\n\n#. Key:\t515B5424465F983D14F3E09B7686899D\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_TLSecretSocietyGate\"\nmsgid \"STOP! Do not move! This gate is only for the members of the Secret Science Society!\"\nmsgstr \"STOP ! Ne bougez pas ! Cette porte est réservée aux membres de la Société des Sciences Secrètes !\"\n\n#. Key:\t51706AD44D697A14E6392B97A9E30AFC\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_TLSecretSocietyGate\"\nmsgid \"That is the silliest combination I have ever heard about in my whole life! That's the kind of thing an idiot would carry in his luggage!\"\nmsgstr \"C'est la combinaison la plus stupide dont j'ai jamais entendu parler de toute ma vie ! C'est le genre de chose qu'un idiot porterait dans ses bagages !\"\n\n#. Key:\t60B0B4E04E74C474AC2F4F8422DCE753\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_3.Children(0).Children.Text\n#: /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_3.Children(0).Children.Text\nmsgctxt \"Dialogue_TLSecretSocietyGate\"\nmsgid \"Leave the gate\"\nmsgstr \"Quitter le portail\"\n\n#. Key:\t6EB7FD9546B2B89557D9708942CE54BD\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_2.Children(2).Children.Text\n#: /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_2.Children(2).Children.Text\nmsgctxt \"Dialogue_TLSecretSocietyGate\"\nmsgid \"12345\"\nmsgstr \"12345\"\n\n#. Key:\t749AB9CD48924031317291A953254917\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_TLSecretSocietyGate\"\nmsgid \"That password is for witch and wizard kids, not for old, wise, world renowned secret scientists!\"\nmsgstr \"Ce mot de passe est destiné aux enfants magiciens et magiciennes, pas aux vieux sages et secrets scientifiques, et de renommée mondiale !\"\n\n#. Key:\t7BB8FA8B4D051983390D3D8D4287DFEC\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_2.Children(1).Children.Text\n#: /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_2.Children(1).Children.Text\nmsgctxt \"Dialogue_TLSecretSocietyGate\"\nmsgid \"hunter2\"\nmsgstr \"hunter2\"\n\n#. Key:\t8CD051C44D9FBBD6D60694AFD2156D24\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_2.Children(5).Children.Text\n#: /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_2.Children(5).Children.Text\nmsgctxt \"Dialogue_TLSecretSocietyGate\"\nmsgid \"Try to gain some time\"\nmsgstr \"Essayons de gagner du temps\"\n\n#. Key:\t8F2244144056B8C389345F87D8C8B171\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_TLSecretSocietyGate\"\nmsgid \"I... I think I forgot... I have to remember it. I'll be back...\"\nmsgstr \"I... Je crois que j'ai oublié... Je dois m'en souvenir. Je reviendrai...\"\n\n#. Key:\t8FC96FE94C115E3EDB214CAA3B380072\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_TLSecretSocietyGate\"\nmsgid \"Let us go on with the standard protocol then. Tell me the password of the week.\"\nmsgstr \"Poursuivons donc avec le protocole standard. Dites-moi le mot de passe de la semaine.\"\n\n#. Key:\tAA10FF02426D2C5DB9F7CF90596631C4\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_1.Children(1).Children.Text\n#: /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_1.Children(1).Children.Text\nmsgctxt \"Dialogue_TLSecretSocietyGate\"\nmsgid \"I am a member\"\nmsgstr \"Je suis membre\"\n\n#. Key:\tB5237D1B4EFB02B1ED5017B68EC5A7EC\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_TLSecretSocietyGate\"\nmsgid \"Are you a member? Prove it! What is the password of the week?\"\nmsgstr \"Êtes-vous membre ? Prouvez-le ! Quel est le mot de passe de la semaine ?\"\n\n#. Key:\tC8A1985C416AEA563142D7BF3B6DD77D\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_2.Children(3).Children.Text\n#: /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_2.Children(3).Children.Text\nmsgctxt \"Dialogue_TLSecretSocietyGate\"\nmsgid \"Caput Draconis\"\nmsgstr \"Caput Draconis\"\n\n#. Key:\tDC8F07EA44A20BEF70DFCDA4A62A421E\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_TLSecretSocietyGate\"\nmsgid \"Correct. Welcome to the secret hideout 12345, scientist!\"\nmsgstr \"C'est exact. Bienvenue dans la cachette secrète 12345, scientifique !\"\n\n#. Key:\tE0C10509474191587635B48ED0AA6913\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_TLSecretSocietyGate\"\nmsgid \"The only true wisdom is in knowing you know everything!\"\nmsgstr \"La seule vraie sagesse est de savoir que vous savez tout !\"\n\n#. Key:\t0707F21D4313073F47F3C69B64D61DB7\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_TombOfTabby\"\nmsgid \"Take this. It's all I can give now.\"\nmsgstr \"Prenez ceci. C'est tout ce que je peux vous donner maintenant.\"\n\n#. Key:\t0918993B4F680528806DE680B471F795\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_TombOfTabby\"\nmsgid \"It was too much. I couldn’t keep on. I failed.\"\nmsgstr \"C'était trop. Je ne pouvais pas continuer. J'ai échoué.\"\n\n#. Key:\t1598C2DE44A0BF92DC0E53BFAC47DEF5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_3.Children(3).Children.Text\n#: /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_3.Children(3).Children.Text\nmsgctxt \"Dialogue_TombOfTabby\"\nmsgid \"Leave\"\nmsgstr \"Partir\"\n\n#. Key:\t1EF84FFD484E968FBDFE1386018485DB\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_3.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_3.Children(1).Children.Text\nmsgctxt \"Dialogue_TombOfTabby\"\nmsgid \"Raven\"\nmsgstr \"Corbeau\"\n\n#. Key:\t3343471F42742EEE0678D49E466448F1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_TombOfTabby\"\nmsgid \"Tell me the name!\"\nmsgstr \"Donnez-moi le nom !\"\n\n#. Key:\t3DC816F147ACB79D6339D5AD31E0C5A5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_TombOfTabby\"\nmsgid \"Lillian!\"\nmsgstr \"Lillian !\"\n\n#. Key:\t3DE5FFEB4A5BEC150306999FDEF058BC\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_TombOfTabby\"\nmsgid \"Here lies Tabby, wanderer of the Ruined Realm. We will never forget what you did for us. May your spirit find peace in the afterlife.\"\nmsgstr \"Ici repose Tabby, errant du Royaume en Ruines. Nous n'oublierons jamais ce que vous avez fait pour nous. Que ton esprit trouve la paix dans l'au-delà.\"\n\n#. Key:\t43F7C0AE4CB91D3957AB4CA54C1D4426\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_TombOfTabby\"\nmsgid \"He took the artefacts. His master never knew it.\"\nmsgstr \"Il a pris les artefacts. Son maître ne l'a jamais su.\"\n\n#. Key:\t57A0634946BB9FD9603572ABD9368E52\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_3.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_3.Children(0).Children.Text\nmsgctxt \"Dialogue_TombOfTabby\"\nmsgid \"Wizard\"\nmsgstr \"Magicien\"\n\n#. Key:\t5A6E99154FB027A82922FA91A9448E14\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_TombOfTabby\"\nmsgid \"I’m leaving... I didn’t want to bother you. May you find peace at last.\"\nmsgstr \"Je m'en vais... Je ne voulais pas vous déranger. Puissiez-vous enfin trouver la paix.\"\n\n#. Key:\t6A716E164BAACFAFB2EBDBBA8C04438F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_TombOfTabby\"\nmsgid \"He liked Lillian. He finished what I started.\"\nmsgstr \"Il aimait bien Lillian. Il a fini ce que j'avais commencé.\"\n\n#. Key:\t7CDFB36B41931AADE01C10A465D09EAF\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_TombOfTabby\"\nmsgid \"Rest in peace!\"\nmsgstr \"Reposez en paix !\"\n\n#. Key:\t831693034CD9AC88A07F1297BBB10056\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_TombOfTabby\"\nmsgid \"I will be there on her side again when the time comes.\"\nmsgstr \"Je serai de nouveau à ses côtés le moment venu.\"\n\n#. Key:\tA78C16A943587C5EC876BFB0AA319421\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_TombOfTabby\"\nmsgid \"She is my only true master. I can’t leave her. Not yet.\"\nmsgstr \"Elle est mon seul vrai maître. Je ne peux pas la quitter. Pas encore.\"\n\n#. Key:\tC86836A149E8580E4608259C8482314F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_TombOfTabby\"\nmsgid \"Raven!\"\nmsgstr \"Corbeau !\"\n\n#. Key:\tD05E5AEF498C383F88D1AFBBDF371CDA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_TombOfTabby\"\nmsgid \"He forced me. Though I understood. I wanted the same.\"\nmsgstr \"Il m'a forcé. Bien que je comprenne. Je voulais la même chose.\"\n\n#. Key:\tE41ADE774AF3AF3FE637CE81531F3D29\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_3.Children(2).Children.Text\n#: /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_3.Children(2).Children.Text\nmsgctxt \"Dialogue_TombOfTabby\"\nmsgid \"Lillian\"\nmsgstr \"Lillian\"\n\n#. Key:\tED18C66D47BF594818C5DA8100AC2A36\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_TombOfTabby\"\nmsgid \"You are familiar... I almost remember...\"\nmsgstr \"Vous m'êtes familier... Je me souviens presque...\"\n\n#. Key:\tF6D8BC4F489D87A90E852CA3F97B479F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_TombOfTabby\"\nmsgid \"Wizard!\"\nmsgstr \"Magicien !\"\n\n#. Key:\t2A0E02C94A04642C5096038C615E0D5B\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/tut2.tut2:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/tut2.tut2:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_tut2\"\nmsgid \"I see you managed to shape that ball body of yours… that’s interesting.\"\nmsgstr \"Je vois que vous avez réussi à façonner votre corps de boule... c'est intéressant.\"\n\n#. Key:\t4D59C307403F27C91A9168AB58CDB1B3\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/tut2.tut2:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/tut2.tut2:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_tut2\"\nmsgid \"I didn’t want to summon you. I wanted to get my daughter back.\"\nmsgstr \"Je n'ai pas voulu vous invoquer. Je voulais récupérer ma fille.\"\n\n#. Key:\t8336FD024F34227E1AB7B1BFCCF7FFBF\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/tut2.tut2:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/tut2.tut2:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_tut2\"\nmsgid \"Your presence is not welcome here, demon!\"\nmsgstr \"Ta présence n'est pas la bienvenue ici, démon !\"\n\n#. Key:\t16A6E7D24DFE49D6844E92B8E476BA66\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/tut5.tut5:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/tut5.tut5:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_tut5\"\nmsgid \"Once you are done I will set you free.\"\nmsgstr \"Une fois que vous aurez terminé, je vous libérerai.\"\n\n#. Key:\t48FA56EF4293C577CB1977BE694034CC\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/tut5.tut5:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/tut5.tut5:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_tut5\"\nmsgid \"This is the deal demon...\"\nmsgstr \"Nous avons un accord, démon...\"\n\n#. Key:\tA27765824FDD88A579AB6180DDEA06B1\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/tut5.tut5:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/tut5.tut5:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_tut5\"\nmsgid \"Get into the Heart of the Realm and find the three Artefacts! I need those to correct the summoning.\"\nmsgstr \"Entrez au Coeur du Royaume et trouvez les trois Artefacts ! J'en ai besoin pour corriger l'invocation.\"\n\n#. Key:\t5E1F54384BC258A91FF1DD9ECBC0DF39\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/tut8.tut8:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/tut8.tut8:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_tut8\"\nmsgid \"A cat that used to help my daughter to explore these realms.\"\nmsgstr \"Un chat qui aidait ma fille à explorer ces royaumes.\"\n\n#. Key:\t859621E24125177084F4EAA39CF77902\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/tut8.tut8:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/tut8.tut8:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_tut8\"\nmsgid \"Who is Tabby?\"\nmsgstr \"Qui est Tabby ?\"\n\n#. Key:\tD0BFF857414714D7C5FCB9B526539215\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/tut8.tut8:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/tut8.tut8:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_tut8\"\nmsgid \"Tabby was formidable with her claws, but you will need that sword.\"\nmsgstr \"Tabby était redoutable avec ses griffes, mais vous aurez besoin de cette épée.\"\n\n#. Key:\tDFCB1A1E48763642E71FD7A040F72F1B\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/tut8.tut8:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/tut8.tut8:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_tut8\"\nmsgid \"So he did the hard job before me...\"\nmsgstr \"Il a donc fait le sale boulot avant moi...\"\n\n#. Key:\t2DD05A7E485B5C23DA0DCD84400D3F23\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/tut9.tut9:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/tut9.tut9:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_tut9\"\nmsgid \"What could be possibly weird for a walking ball?\"\nmsgstr \"Qu'est-ce qui pourrait être bizarre pour une balle qui marche ?\"\n\n#. Key:\t62A1ECFC47B762221EA0B1B5B0E0BEF6\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/tut9.tut9:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/tut9.tut9:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_tut9\"\nmsgid \"This place is in a better shape...\"\nmsgstr \"Cet endroit est en meilleur état...\"\n\n#. Key:\tA9BCFBB541A9A2CEA8FB90884B8557C5\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/tut9.tut9:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/tut9.tut9:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_tut9\"\nmsgid \"The Ancient Magic is still strong within these walls. It keeps the Ruin at bay.\"\nmsgstr \"La Magie Ancienne est encore forte en ces murs. Elle tient la Ruine à distance.\"\n\n#. Key:\tF9551D7849226F88A4FD15AAFB4789E6\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/tut9.tut9:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/tut9.tut9:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_tut9\"\nmsgid \"Be careful though... it can have the weirdest side effects.\"\nmsgstr \"Mais attention... elle peut avoir des effets secondaires très bizarres.\"\n\n#. Key:\t302976FD411E850B3CD7CEA7E0BF6924\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Wizard.Wizard:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/Ending/E1/Wizard.Wizard:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_Wizard\"\nmsgid \"Please wait outside until I repeat the spell. Once Lillian is back, I’ll take you home.\"\nmsgstr \"Merci d'attendre dehors que je répète le sort. Une fois que Lillian sera de retour, je vous ramènerai chez vous.\"\n\n#. Key:\t3851C21F419E9F1D29A06DA3B2A0F553\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Wizard.Wizard:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Ending/E1/Wizard.Wizard:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_Wizard\"\nmsgid \"Er... your room is still as untidy as last time, but no problem.\"\nmsgstr \"Euh… cet endroit est toujours aussi désordonné que la dernière fois, mais pas de problème.\"\n\n#. Key:\t6CCE5BBC4135176C1FBD8E866FD4B098\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Wizard.Wizard:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Ending/E1/Wizard.Wizard:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_Wizard\"\nmsgid \"I’m sorry we met like this.\"\nmsgstr \"Je suis désolé que nous nous rencontrions de la sorte.\"\n\n#. Key:\t7511912D4F72D1D45CFFB9AA9815CCB2\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Wizard.Wizard:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E1/Wizard.Wizard:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_Wizard\"\nmsgid \"Yes... and thank you!\"\nmsgstr \"Oui... et merci !\"\n\n#. Key:\tAC1641244DF694B660EAFDA1FC4A177B\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Wizard.Wizard:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E1/Wizard.Wizard:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_Wizard\"\nmsgid \"Here are your artefacts! I made my part of the deal.\"\nmsgstr \"Voici vos artefacts ! J'ai fait ma part du marché.\"\n\n#. Key:\tB567059148744E3F7A4D3B929F26CBB6\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Wizard.Wizard:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Ending/E1/Wizard.Wizard:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_Wizard\"\nmsgid \"Yes, we made a deal!\"\nmsgstr \"Oui, nous avons conclu un accord !\"\n\n#. Key:\tC2ED3A564A55A644D33F9E9E38D1676A\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Wizard.Wizard:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Ending/E1/Wizard.Wizard:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_Wizard\"\nmsgid \"Give me a few more minutes to finish what we started!\"\nmsgstr \"Donnez-moi quelques minutes de plus pour finir ce que nous avons commencé !\"\n\n#. Key:\tE1521B0B46F26BFA464C6C81EC2D4900\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Wizard.Wizard:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Ending/E1/Wizard.Wizard:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_Wizard\"\nmsgid \"Will you release me?\"\nmsgstr \"Allez-vous me libérer ?\"\n\n#. Key:\tFE3EE6014784FCE7EB8001BC1E77D833\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Wizard.Wizard:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Ending/E1/Wizard.Wizard:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_Wizard\"\nmsgid \"Er... excuse me for being rude with you. I might have misjudged you. And, anyway...\"\nmsgstr \"Euh... excusez-moi d'être impoli avec vous. Je vous ait peut-être mal jugé. Et, de toute façon...\"\n\n#. Key:\t0D3B0F654B4B3FC1AE9B46809DA7FD74\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter2/Wizard_AfterMonk.Wizard_AfterMonk:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Wizard/Chapter2/Wizard_AfterMonk.Wizard_AfterMonk:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_Wizard_AfterMonk\"\nmsgid \"What did he say?\"\nmsgstr \"Qu'est-ce qu'il a dit ?\"\n\n#. Key:\tDE149D01484DA8CD03D1C0848D01BEA6\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter2/Wizard_AfterMonk.Wizard_AfterMonk:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Wizard/Chapter2/Wizard_AfterMonk.Wizard_AfterMonk:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_Wizard_AfterMonk\"\nmsgid \"Nothing...\"\nmsgstr \"Rien...\"\n\n#. Key:\t1E43B5674AB45A7BDBEED1BE2AE25FE8\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter2/Wizard_Artefact1.Wizard_Artefact1:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Wizard/Chapter2/Wizard_Artefact1.Wizard_Artefact1:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_Wizard_Artefact1\"\nmsgid \"Well done. Now we have the first artefact. There are only two left...\"\nmsgstr \"Bien joué. Nous avons maintenant le premier artefact. Il n'en reste que deux...\"\n\n#. Key:\t45AB81D94B2C6C9B13A49C944AD80389\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter2/Wizard_Artefact1.Wizard_Artefact1:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Wizard/Chapter2/Wizard_Artefact1.Wizard_Artefact1:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_Wizard_Artefact1\"\nmsgid \"Don’t tell me I will need to kill another two of these!\"\nmsgstr \"Ne me dites pas que je vais devoir en tuer deux autres !\"\n\n#. Key:\t3CBF720A438F217805FD5F85990FF515\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter2/Wizard_Artefact2.Wizard_Artefact2:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Wizard/Chapter2/Wizard_Artefact2.Wizard_Artefact2:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_Wizard_Artefact2\"\nmsgid \"We are close! Only one artefact is missing.\"\nmsgstr \"Nous sommes proches ! Il ne manque qu'un seul artefact.\"\n\n#. Key:\tFD6163CC43BF00E4DB95CBB11CA7D389\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter2/Wizard_Artefact2.Wizard_Artefact2:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Wizard/Chapter2/Wizard_Artefact2.Wizard_Artefact2:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_Wizard_Artefact2\"\nmsgid \"What I miss is a comfortable apartment somewhere safe...\"\nmsgstr \"Ce qui me manque, c'est un appartement confortable dans un endroit sûr...\"\n\n#. Key:\t0D37E1DE44FDF7C5BF8DD28C038FA49D\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter2/Wizard_Artefact3.Wizard_Artefact3:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Wizard/Chapter2/Wizard_Artefact3.Wizard_Artefact3:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_Wizard_Artefact3\"\nmsgid \"What? Can’t you just... oh, forget it!\"\nmsgstr \"Quoi ? Vous ne pouvez pas juste... oh, oubliez ça !\"\n\n#. Key:\t2BDFD83247C8B644DED9CAA6486A064F\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter2/Wizard_Artefact3.Wizard_Artefact3:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Wizard/Chapter2/Wizard_Artefact3.Wizard_Artefact3:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_Wizard_Artefact3\"\nmsgid \"Yes, I’ve done what you asked. Now it’s your turn. Set me free!\"\nmsgstr \"Oui, j'ai fait ce que vous avez demandé. Maintenant, c'est votre tour. Libérez-moi !\"\n\n#. Key:\t8CCAFBA148F1834EABE12CAC93669A79\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter2/Wizard_Artefact3.Wizard_Artefact3:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Wizard/Chapter2/Wizard_Artefact3.Wizard_Artefact3:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_Wizard_Artefact3\"\nmsgid \"I have to admit I’m impressed. You found all the three artefacts.\"\nmsgstr \"Je dois admettre que je suis impressionné. Vous avez trouvé les trois artefacts.\"\n\n#. Key:\tA54C612946D6A5EB76D38B8622F4F76C\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter2/Wizard_Artefact3.Wizard_Artefact3:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Wizard/Chapter2/Wizard_Artefact3.Wizard_Artefact3:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_Wizard_Artefact3\"\nmsgid \"All right demon. Use the railways to travel to World’s End. That’s where I can bring you back.\"\nmsgstr \"Très bien, démon. Utilisez les chemins de fer pour voyager jusqu'au bout du monde. C'est là que je peux vous ramener.\"\n\n#. Key:\t05FE50EE4B18F4FE9C1559979669E616\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"Still nothing, but nobody said anything about any visible change at this point, right?\"\nmsgstr \"Toujours rien, mais personne n'a parlé d'un quelconque changement visible à ce stade, n'est-ce pas ?\"\n\n#. Key:\t0DDE5A0E47BADFCA9E6E98A10F0AF114\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_1.Children(0).Children.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_1.Children(0).Children.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"Craft Ghost Abacus\"\nmsgstr \"Créer un Boulier Fantôme\"\n\n#. Key:\t0F4008294D6FA43C3D9C17BA600FB024\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"You have a glowing hammer. What's next?\"\nmsgstr \"Vous avez un marteau qui brille. Et ensuite ?\"\n\n#. Key:\t26089F6044B0FD1134C9C99AF17E9E0C\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_7.Children(4).Children.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_7.Children(4).Children.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"Say a different color\"\nmsgstr \"Dites une couleur différente\"\n\n#. Key:\t29FFB2FF49C6C231583FF1B549DA218C\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"Gnome magic at its best. Did you do everything the way it was supposed to be done? You should find out soon... maybe.\"\nmsgstr \"La magie des gnomes à son meilleur. Avez-vous fait tout ce qu'il fallait faire ? Vous devriez le découvrir bientôt... peut-être.\"\n\n#. Key:\t2BF7D8D726080F0A003A0229BE7871C7\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"With the proper instructions and materials you could definitely create something valuable here.\"\nmsgstr \"Avec les instructions et le matériel appropriés, vous pourriez certainement créer quelque chose de précieux ici.\"\n\n#. Key:\t3231FF0D4A2BBEE3E3AD7598E5105E0E\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"The object is coagulated into a single Surrected object!\"\nmsgstr \"L'objet est coagulé en un seul objet Surrecté !\"\n\n#. Key:\t41335322411CF278B19849AC696E6F93\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_2.Children(4).Children.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_2.Children(4).Children.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"Break the abacus into pieces\"\nmsgstr \"Casser le boulier en morceaux\"\n\n#. Key:\t4C74F3C342690A8246916B85FF4685C9\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"The abacus does not show any emotion.\"\nmsgstr \"Le Boulier ne montre aucune émotion.\"\n\n#. Key:\t4F8E51DA4C0B33020E34AF9AB47BCCD5\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_7.Children(0).Children.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_7.Children(0).Children.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"Croon \\\"La La LaLaLa LaLaLa\\\"\"\nmsgstr \"Chantez \\\"La La LaLaLa LaLaLa\\\"\"\n\n#. Key:\t5404D10943BB5F53229FDC845E60B000\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_7.Children(5).Children.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_7.Children(5).Children.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"Give up for now\"\nmsgstr \"Abandonner pour l'instant\"\n\n#. Key:\t5548D94E415483F129CCA7A3102B9DB3\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"Poor Abacus. It is broken into pieces now.\"\nmsgstr \"Pauvre Boulier. Il est maintenant brisé en morceaux.\"\n\n#. Key:\t6F3DE41D43326079A2BD72A29059FBA9\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"You have the Abacus and the Ghost Flower Petals in front of you. The workshop has all the tools you need. How do you proceed?\"\nmsgstr \"Vous avez devant vous le Boulier et les Pétales de Fleur Fantôme. L'atelier dispose de tous les outils dont vous avez besoin. Comment procéder ?\"\n\n#. Key:\t7EE3EE474090DCA65BB3199E69E83B43\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_1.Children(1).Children.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_1.Children(1).Children.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"Leave\"\nmsgstr \"Partir\"\n\n#. Key:\t87B760894A587B34EB825487D907D2E4\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_7.Children(1).Children.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_7.Children(1).Children.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"Croon \\\"La LaLa LaLaLa LaLaLa\\\"\"\nmsgstr \"Chantez \\\"La LaLa LaLaLa LaLaLa\\\"\"\n\n#. Key:\t947E69AA4EEE6DB329FAD48214D4C416\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_2.Children(0).Children.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_2.Children(0).Children.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"Say \\\"Sorry my <object name>!\\\"\"\nmsgstr \"Dites \\\"Désolé mon <object name>!\\\"\"\n\n#. Key:\t95D5418F4145388680D7C99F720CE191\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_7.Children(3).Children.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_7.Children(3).Children.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"Say \\\"Brown\\\"\"\nmsgstr \"Dites \\\"Marron\\\".\"\n\n#. Key:\tC184ED314482D706C3426CB5034C3AFD\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_7.Children(2).Children.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_7.Children(2).Children.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"Say \\\"Blue\\\"\"\nmsgstr \"Dites \\\"Bleu\\\".\"\n\n#. Key:\tC7EB7FC648E0005DC35550A3D71DF221\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_2.Children(3).Children.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_2.Children(3).Children.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"Cover the Abacus with Petals\"\nmsgstr \"Couvrir le Boulier avec des Pétales\"\n\n#. Key:\tCA7A7E0A4F16FBE20EE16395D6565D7E\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"Maybe the abacus is a bit more ghosty now... or is it just you getting tired of trying?\"\nmsgstr \"Peut-être que le boulier est un peu plus fantomatique maintenant... ou est-ce juste que vous en avez marre d'essayer ?\"\n\n#. Key:\tE0507C5E44553E824F998D8D4CB044A4\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"Your last action did not lead to any visible change. What is your next move?\"\nmsgstr \"Votre dernière action n'a entraîné aucun changement visible. Quelle est votre prochaine action ?\"\n\n#. Key:\tE8550D874C73F12B76345D9AAB2FEB80\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_2.Children(2).Children.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_2.Children(2).Children.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"Heat a hammer\"\nmsgstr \"Faire chauffer un marteau\"\n\n#. Key:\tE894C6624CC7A0F92CECBBB364C77CD1\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_2.Children(1).Children.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_2.Children(1).Children.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"Say \\\"Sorry my Abacus!\\\"\"\nmsgstr \"Dites \\\"Désolé mon Boulier !\\\"\"\n\n#. Key:\tEFC4E9AB4A1B8DF491B4FBABBC7FA560\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"The Abacus is covered with the Petals of the Ghost Flower.\"\nmsgstr \"Le Boulier est recouvert des Pétales de Fleur Fantôme.\"\n\n#. Key:\t100A735A460E0DE2B0D130B802762D8B\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter2/WW_Scroll_Inspect.WW_Scroll_Inspect:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Wizard/Chapter2/WW_Scroll_Inspect.WW_Scroll_Inspect:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_WW_Scroll_Inspect\"\nmsgid \"It says: \\\"Be careful: I think there are Fishies in the water!\\\"\"\nmsgstr \"Il indique : \\\"Soyez prudent : Je crois qu'il y a de la Poiscaille dans l'eau !\\\"\"\n\n#. Key:\t1D280F60496F7EF5DBDADB90674E8225\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter2/WW_Scroll_Inspect.WW_Scroll_Inspect:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Wizard/Chapter2/WW_Scroll_Inspect.WW_Scroll_Inspect:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_WW_Scroll_Inspect\"\nmsgid \"He was.\"\nmsgstr \"Il avait.\"\n\n#. Key:\t37D4983B49B8986752A095B03ADCD700\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter2/WW_Scroll_Inspect.WW_Scroll_Inspect:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Wizard/Chapter2/WW_Scroll_Inspect.WW_Scroll_Inspect:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_WW_Scroll_Inspect\"\nmsgid \"He was right.\"\nmsgstr \"Il avait raison.\"\n\n#. Key:\t26432B92474630595CF8B6B44B02657B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_26.Text\n#: /Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_26.Text\nmsgctxt \"Dialogue_WWSewerCreatures\"\nmsgid \"Farewell and good luck to you as well!\"\nmsgstr \"Adieu et bonne chance à vous aussi !\"\n\n#. Key:\t2E3C904D458640A4F06DD793B416366A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_WWSewerCreatures\"\nmsgid \"All right, I will return when I'm done.\"\nmsgstr \"Très bien, je reviendrai quand j'aurai fini.\"\n\n#. Key:\t382595684668BDA97AAB95BF129246E4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_WWSewerCreatures\"\nmsgid \"No problem. I always help when I can.\"\nmsgstr \"Pas de problème. J'aide toujours quand je peux.\"\n\n#. Key:\t4BF10AD741739BE69EF797A32410C281\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_WWSewerCreatures\"\nmsgid \"One of your brothers is trapped? What happened?\"\nmsgstr \"Un de vos frères est piégé ? Que s'est-il passé ?\"\n\n#. Key:\t52403E3341ECEA5801B0E58D2F472FD5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_1.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_1.Children(1).Children.Text\nmsgctxt \"Dialogue_WWSewerCreatures\"\nmsgid \"Leave\"\nmsgstr \"Partir\"\n\n#. Key:\t53AC225B4F21B68CAC6F8997F324124E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_29.Text\n#: /Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_29.Text\nmsgctxt \"Dialogue_WWSewerCreatures\"\nmsgid \"Farewell until we meet again!\"\nmsgstr \"Adieu jusqu'à notre prochaine rencontre !\"\n\n#. Key:\t65042BC342E9717229E74A9DD272DC5F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_WWSewerCreatures\"\nmsgid \"It was nice to see you again.\"\nmsgstr \"C'était un plaisir de vous revoir.\"\n\n#. Key:\t77959A144131C47488B221ADD9B1E13B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_WWSewerCreatures\"\nmsgid \"Don't worry! I'm still looking for it.\"\nmsgstr \"Ne vous inquiétez pas ! Je suis toujours à sa recherche.\"\n\n#. Key:\t7914F3CA40844C2A13A760BB0DAE1BFA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_WWSewerCreatures\"\nmsgid \"I don't have time for you creature! Stay out of my way!\"\nmsgstr \"Je n'ai pas de temps pour toi, créature ! Reste en dehors de mon chemin !\"\n\n#. Key:\t79A62658414FE0202F2E9AA0E0238BD4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_9.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_9.Children(0).Children.Text\nmsgctxt \"Dialogue_WWSewerCreatures\"\nmsgid \"Accept Quest\"\nmsgstr \"Accepter la Quète\"\n\n#. Key:\t9AEDA0E84BABEBCD8F18E8BC2D0B75D0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_WWSewerCreatures\"\nmsgid \"Calm down creature! I mean you no harm.\"\nmsgstr \"Calmez-vous, créature ! Je ne vous veux aucun mal.\"\n\n#. Key:\tB89304534B24114D19DF7AB07635FFDE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_WWSewerCreatures\"\nmsgid \"All right I will see what I can do.\"\nmsgstr \"Très bien, je vais voir ce que je peux faire.\"\n\n#. Key:\tB8BD374E4738BFFDAFAC4EAA19E7A9D2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_23.Text\n#: /Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_23.Text\nmsgctxt \"Dialogue_WWSewerCreatures\"\nmsgid \"Oh, thank you!\"\nmsgstr \"Oh, merci !\"\n\n#. Key:\tCF62984840B7508E82BAC0AB9D53EC0A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_9.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_9.Children(1).Children.Text\nmsgctxt \"Dialogue_WWSewerCreatures\"\nmsgid \"Decline\"\nmsgstr \"Refuser\"\n\n#. Key:\tEAD329F04773358B0CA339A4F155D990\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_WWSewerCreatures\"\nmsgid \"I'm sorry but I can't help you.\"\nmsgstr \"Je suis désolé, mais je ne peux pas vous aider.\"\n\n#. Key:\tF281396D4110E61ACFEFDBB7AD8E44A8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_1.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_1.Children(0).Children.Text\nmsgctxt \"Dialogue_WWSewerCreatures\"\nmsgid \"Help\"\nmsgstr \"Aider\"\n\n#. Key:\tedge_next\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_1.InnerEdges(0).InnerEdges.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_1.InnerEdges(0).InnerEdges.Text\nmsgctxt \"DlgSystemSettings\"\nmsgid \"Next\"\nmsgstr \"Suivant\"\n\n"
  },
  {
    "path": "Content/Localization/WarriorbDialogues/hu/WarriorbDialogues.po",
    "content": "﻿# WarriorbDialogues Hungarian translation.\n# Copyright 1998-2019 Epic Games, Inc. All Rights Reserved.\n# \nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: WarriorbDialogues\\n\"\n\"POT-Creation-Date: 2020-10-07 08:09\\n\"\n\"PO-Revision-Date: 2020-10-07 08:09\\n\"\n\"Language-Team: \\n\"\n\"Language: hu\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Plural-Forms: nplurals=2; plural=(n != 1);\\n\"\n\n#. Key:\t064BBCD1476819100C8D39881B7A7C56\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/2HW_LRDoor.2HW_LRDoor:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E2/2HW_LRDoor.2HW_LRDoor:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_2HW_LRDoor\"\nmsgid \"They still didn’t notice I locked them into the workroom.\"\nmsgstr \"Még nem vették észre, hogy bezártam őket.\"\n\n#. Key:\t21412F0A4E45FA97703599BACD9C5D0E\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/2HW_LRDoor.2HW_LRDoor:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Ending/E2/2HW_LRDoor.2HW_LRDoor:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_2HW_LRDoor\"\nmsgid \"I entered into the Laboratory.\"\nmsgstr \"Beléptem a Laboratóriumba.\"\n\n#. Key:\t5A580A014B6E9907C819808423E10C30\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/2HW_LRDoor.2HW_LRDoor:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E2/2HW_LRDoor.2HW_LRDoor:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_2HW_LRDoor\"\nmsgid \"The Laboratory has strong secure spells. I can’t enter here without being noticed.\"\nmsgstr \"A Laboratóriumot biztonsági varázslatok védik. Nem tudok észrevétlen bemenni.\"\n\n#. Key:\t0530863744A9844E7F64009D82A189E4\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_2HW_WRDoor\"\nmsgid \"Ruin is close and we are all at risk. It’s not about you. It's about everyone.\"\nmsgstr \"A Fertőzés közel, túl nagy a veszély. Ez már nem csak rólad szól, hanem mindnyájunkról. \"\n\n#. Key:\t1AF2A89F4DCD86096D4343ABBE91BE51\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_2HW_WRDoor\"\nmsgid \"Something which doesn’t take my daughter’s soul...\"\nmsgstr \"Valamit, ami nem veszi el a lányomat...\"\n\n#. Key:\t2C5B294847F0E41F2CA189904EE66059\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_2HW_WRDoor\"\nmsgid \"I heard father arguing with someone.\"\nmsgstr \"Hallottam, hogy apa veszekszik valakivel.\"\n\n#. Key:\t2C8DFF1042FB0480709877A366BE2F1D\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_2HW_WRDoor\"\nmsgid \"The device must be destroyed.. We’ll find something else to stop Ruin.\"\nmsgstr \"El kell pusztítanom a Szerkezetet. Találunk mást, amivel megállítjuk a Fertőzést.\"\n\n#. Key:\t3F9D7D9C42A8550A6B282680BFAE2CCC\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_2HW_WRDoor\"\nmsgid \"I had to do this. At least for mom. So that she didn’t die in vain.\"\nmsgstr \"Meg kellett tennem, már csak anyu miatt is. Nem fogom hagyni, hogy a halála hiábavaló legyen.\"\n\n#. Key:\t7F6FC84C4D799841C6F42EB45A9D648F\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_2HW_WRDoor\"\nmsgid \"No, I won't risk losing her! She is bound to the device.\"\nmsgstr \"Nem, nem fogom elveszíteni! Valahogyan összekötődött a Szerkezettel.\"\n\n#. Key:\tA03D724A4606AFFC00E417A5C3AB3BFF\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_2HW_WRDoor\"\nmsgid \"Lillian knew what she applied for. She must decide.\"\nmsgstr \"Lillian elég érett már, és pontosan tudta, mire vállalkozott. Neki magának kell döntenie.\"\n\n#. Key:\tABA214914981F3E844F49483B43B5414\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_2HW_WRDoor\"\nmsgid \"I used the key to close the door.\"\nmsgstr \"Kulcsra zártam az ajtót.\"\n\n#. Key:\tB1ADF0404F97735215FCB9A47DD01640\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_2HW_WRDoor\"\nmsgid \"No, I’ve made my decision.\"\nmsgstr \"Nem, már döntöttem.\"\n\n#. Key:\tB26FAB564CA430617502FA85116629D0\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_2HW_WRDoor\"\nmsgid \"Even if our entire World needs to pay the price.\"\nmsgstr \"Még ha az egész Világnak is kell megfizetnie az árát.\"\n\n#. Key:\tD6D2D64446B6D921576A20ACD653AF7E\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_2HW_WRDoor\"\nmsgid \"I knew he wouldn’t let me finish what we started.\"\nmsgstr \"Tudtam, hogy nem engedi végig csinálnom.\"\n\n#. Key:\t178EBCA541F7FEC3CA46B1B2818691D4\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/AABook.AABook:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/AABook.AABook:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_AABook\"\nmsgid \"'...the Wisest of the Arcade gathered here to discuss if the magical phenomena means any more threat...'\"\nmsgstr \"\\\"...az Árkád Bölcsei tanácsot hívtak össze, hogy megvitassák, vajon a természetfeletti jelenség veszélyt jelent-e...\\\"\"\n\n#. Key:\t8F2CCFF54FBAF7902DB6FEB0358ECFEF\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/AABook.AABook:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/AABook.AABook:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_AABook\"\nmsgid \"They were just like us. The next one hundred pages explain why Ruin will never reach the Arcade or how the Ancient Magic can stop it.\"\nmsgstr \"Pont olyanok voltak, mint mi. A következő száz oldal kifejti, miért nem éri el a Fertőzés az Árkádot, és hogyan állítja majd meg az Ősi Mágia.\"\n\n#. Key:\tAC20B864497FB0D476C501AEF3B87508\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/AABook.AABook:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/AABook.AABook:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_AABook\"\nmsgid \"I hope you don’t want to read all that nonsense.\"\nmsgstr \"Remélem nem akarod végigolvasni ezt a baromságot.\"\n\n#. Key:\tB112F657498F660766AA45974CB44137\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/AABook.AABook:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/AABook.AABook:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_AABook\"\nmsgid \"'Ten years after the Cataclysm (or recently named as Ruin)...'\"\nmsgstr \"\\\"Tíz évvel a Kataklizma Után (K.U.)...\\\"\"\n\n#. Key:\t0F53B19F4EB2F7727B4907864AD3FF46\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_29.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_29.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"What if you just take a break from this and let me pass? Make an exception.\"\nmsgstr \"Mi lenne, ha kicsit fújnál egyet, és átengednél? Csak most az egyszer.\"\n\n#. Key:\t1707E0F34CFDC054DBEAD9AFB368A0A4\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"No rest, no sleep allowed.\"\nmsgstr \"Nincs pihenés, nincs alvás.\"\n\n#. Key:\t2524B3EC4DE1E2921C710CBE4511045F\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"...sometimes I could really appreciate a chair.\"\nmsgstr \"...néha olyan jó lenne egy szék.\"\n\n#. Key:\t29FE2AEF42639848EF3914B36BA2B633\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"I do ask you for apologies, young one.\"\nmsgstr \"Elnézését kérem, fiatal úr.\"\n\n#. Key:\t2C1E7EA026080F0A003A0396BE7E0E7E\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"Take this rune stone as compensation.\"\nmsgstr \"Fogadja el ezt a Rúna Követ kárpótlás gyanánt.\"\n\n#. Key:\t2C879B684B4B07B57D051797219E751E\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"You might have proven worthy for the Arcade Gate, yet there are some other doors, and they have different rules.\"\nmsgstr \"Az Árkád Kapu előtt Méltónak találtatott, de mindig vannak új ajtók, új szabályokkal.\"\n\n#. Key:\t3532C8254924CF13EA664CA11E256F07\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"Will you??? That's so kind of you... err... I mean...\"\nmsgstr \"Tényleg??? Nagyon kedves... ö... úgy értem...\"\n\n#. Key:\t353D6C8B4B5719B1EFD2A59BA0281DED\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_2.Children(2).Children.Text\n#. Key:\t8EED48724A0A860CAD791FAF95554F26\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_3.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_2.Children(2).Children.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_3.Children(1).Children.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"Skip?\"\nmsgstr \"Átengedsz?\"\n\n#. Key:\t3FF1411844C23DB2FDFA47939169B5C3\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_14.Children(0).Children.Text\n#. Key:\t59EC5E56475DE41CFC723793CEEAFA82\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_3.Children(0).Children.Text\n#. Key:\t65DD6A464F04F8B0762D568046344C16\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_6.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_14.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_3.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_6.Children(0).Children.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"Accept challenge\"\nmsgstr \"Vállalom a Kihívást\"\n\n#. Key:\t414D5CC44FFD640215B97BB6090627D6\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"That must be tough...\"\nmsgstr \"Jó nehéz lehet...\"\n\n#. Key:\t4CAA2D0C4FB585A0EB5B4F87FE8A3A97\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"I accept my fate yet sometimes...\"\nmsgstr \"Elfogadom a sorsomat, de néha...\"\n\n#. Key:\t4F7460F540408D07FECEEB88DC0D7D25\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"Not so fast young lord!\"\nmsgstr \"Ne olyan sebesen, fiatal úr!\"\n\n#. Key:\t52C3909F40026C52ADA498A5B60B3490\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_6.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_6.Children(1).Children.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"Poor Keeper\"\nmsgstr \"Szegény Kapuőr\"\n\n#. Key:\t59141BA444003F36E1671CB4E91FFF0E\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"Farewell!\"\nmsgstr \"Viszlát!\"\n\n#. Key:\t59AC0995469571DBE1B7B6BDF68FA37D\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"I am really sorry about that.\"\nmsgstr \"Őszintén sajnálom.\"\n\n#. Key:\t5C8404D34863129B221EF2BB1D0962CC\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_9.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_9.Children(0).Children.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"Yes?\"\nmsgstr \"Igen?\"\n\n#. Key:\t5FF922B94D3FCA5FD095FFB788F43D02\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"For there was a mistake.\"\nmsgstr \"Volt egy kis... hiba.\"\n\n#. Key:\t650DA55944F225C45BABE8B00D815A39\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_27.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_27.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"I guess you want me to go through some crazy traps again...\"\nmsgstr \"Gondolom megint át akarsz küldeni egy rakat őrült csapdán...\"\n\n#. Key:\t700A25DB401C6EDD1E9D1694DA1C1DA1\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"Keepers never fail their duty.\"\nmsgstr \"A Kapuőrök soha nem szegik meg esküjüket.\"\n\n#. Key:\t72D703F84C84CD07F7DA569D9B86AECB\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"There are times when you have to stand in front of a door for a really long time.\"\nmsgstr \"Van, hogy tényleg nagyon hosszú időn át kell egy ajtó előtt állni.\"\n\n#. Key:\t8276A9AC4E3BAB81C41E6EAB12E4FED1\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_31.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_31.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"If I ever see a chair that's your size I will let you know.\"\nmsgstr \"Ha bármikor észreveszek egy széket a méretedben, azonnal szólni fogok.\"\n\n#. Key:\t89421ED443CA8DD5A15DF289C5DC6C37\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_28.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_28.Children(0).Children.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"Accept Challenge\"\nmsgstr \"Elfogadom a Kihívást\"\n\n#. Key:\t910F61A841D9E86D1B349E85A8A47FCF\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"Prove yourself worthy and I shall yield the path!\"\nmsgstr \"Bizonyítsd, hogy Méltó vagy, és megnyitom előtted a Kaput!\"\n\n#. Key:\t9DAC66B94E5A37C628522B90029E8FCC\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_2.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_2.Children(0).Children.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"Not again\"\nmsgstr \"Ne már megint\"\n\n#. Key:\t9F3FE24943FB7CE59B8453A2849E874A\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"This door is open and free of charge for everyone...\"\nmsgstr \"Ez a Kapu mindenki előtt nyitva áll...\"\n\n#. Key:\tA96E78A0410C87446F59ABAC1524A3F4\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_2.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_2.Children(1).Children.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"Let's do it!\"\nmsgstr \"Csináljuk!\"\n\n#. Key:\tA9998DDC43D15F1EDE404B8A3E04E3B2\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"Keepers' lives are never easy.\"\nmsgstr \"A Kapuőrök élete sosem könnyű.\"\n\n#. Key:\tBCAE1C1D4890E79F187EF0940C6F7E84\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_12.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_12.Children(0).Children.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"Just get over\"\nmsgstr \"Térj a tárgyra\"\n\n#. Key:\tC2F8F4E1457AC142E58D1EA3AF24AB56\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"I am all right with a few hundred years, but after a millennium my knees hurt like hell.\"\nmsgstr \"Néhány évszázad teljesen rendben van, de egy évezred után már borzasztóan berozsdál a térdem.\"\n\n#. Key:\tC955446E4CA17593CCC57B9A73AAE824\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"What?? Do you mean that all those challenges that I had to pass were in vain?\"\nmsgstr \"Mi?? Akkor teljesen feleslegesen teljesítettem a kihívást?\"\n\n#. Key:\tC97F61DA4A49287F5242EEB43152D409\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"All right, you win. I'll go and do some jumping. Must be better than waiting here for an eternity.\"\nmsgstr \"Rendben, te nyertél. Megyek, és ugrálok még egy kicsit a halálos lövedékek közt. Az is jobb, mint itt várni az örökkévalóságig.\"\n\n#. Key:\tD318418D4CBBFA2AB381E6B287A8636F\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_30.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_30.Children(0).Children.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"Accept Challenge.\"\nmsgstr \"Elfogadom a Kihívást\"\n\n#. Key:\tD6BE170047C1A00770403087A7EBDF99\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_30.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_30.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"Hopefully, we will finish this soon.\"\nmsgstr \"Remélem gyorsan túlleszünk ezen.\"\n\n#. Key:\tD72FF4F943571BE3DC8DB1877581D4CD\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"You shall prove yourself one more time.\"\nmsgstr \"Még egyszer bizonyítania kell.\"\n\n#. Key:\tDFD8B1E0414F989D46ED9BB24610CDA8\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_12.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_12.Children(1).Children.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"I will help\"\nmsgstr \"Segítek\"\n\n#. Key:\tFDDD27C544787C63B03CCE89B69A44E5\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"Well, thanks!\"\nmsgstr \"Hát, kösz!\"\n\n#. Key:\t06D52FD74B0013A5A22FEBA7A6E82032\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Did you came back to check out my wares?\"\nmsgstr \"Vásárolni jöttél, igaz?\"\n\n#. Key:\t07508A9F4A979D530AD8A9861F0C7D79\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Though maybe you will find relief by looking through my wares. Haha!\"\nmsgstr \"De hátha könnyít a pénztá... lelkeden, ha átnézed az áruimat! Haha!\"\n\n#. Key:\t0C1B7239419B00927360E1B9578540EA\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_27.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_27.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"That's a sad name indeed. If the old saying 'nomen est omen' is true, then it might not be the best choice.\"\nmsgstr \"Milyen szomorú név. Ha igaz a régi mondás, hogy \\\"nomen est omen\\\", akkor talán nem is a legszerencsésebb választás.\"\n\n#. Key:\t0D8F81E140A7AF5369415FB1C081250E\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_10.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_10.Children(0).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Trade\"\nmsgstr \"Vásárlás\"\n\n#. Key:\t1089DA0443D9B23C84B8B799EEEBCCC9\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_SpeechSequence_0.SpeechSequence(0).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_SpeechSequence_0.SpeechSequence(0).SpeechSequence.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Oh, that's sad my little one.\"\nmsgstr \"Óh, milyen szomorú kicsikém.\"\n\n#. Key:\t16F6844C40498EC1B5CDAA87612D3982\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_42.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_42.Children(1).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"No way\"\nmsgstr \"Kizárt\"\n\n#. Key:\t182D4124450BFA52EF26FBACE1706333\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_45.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_45.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"How noble of you!\"\nmsgstr \"Mily kegyes tőled!\"\n\n#. Key:\t1922E4FD49ABC50B04A33CBA07B440D1\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_34.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_34.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"But I hope this doesn't mean that you want to join the Maintainers. Haha!\"\nmsgstr \"Remélem azért még nem állsz be a Takarítók közé. Haha!\"\n\n#. Key:\t195B9BED4921EE6D732CA4BE6391A402\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_31.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_31.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"No, thanks!\"\nmsgstr \"Kösz, nem!\"\n\n#. Key:\t198A3D8D426F5202C280CE96202EB415\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_50.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_50.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"This is a sad name indeed. And if the old saying 'nomen est omen' is true, then this might not be the best choice.\"\nmsgstr \"Milyen szomorú név. Ha igaz a régi mondás, hogy \\\"nomen est omen\\\", akkor talán nem is a legszerencsésebb választás.\"\n\n#. Key:\t1AF2DDE74542524EEF19CA9567CFBDAF\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"{name}? It still sounds a bit weird, but I think I might like it.\"\nmsgstr \"{name}? Szokatlanul hangzik, de biztos megszeretem majd.\"\n\n#. Key:\t1FC5AD3B488DB484169D0085D63ECC45\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"This sounds pretty epic but I wonder what nickname it might have?\"\nmsgstr \"Nagyon menőn hangzik, de vajon hogyan becézik?\"\n\n#. Key:\t21FEE27B41116ADFBFD2B69333D6EB3F\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"By using some sort of ritual or spell...\"\nmsgstr \"Valamiféle rituáléval amiben gyertyák meg ilyesmik...\"\n\n#. Key:\t25DCE964400342D4188412ADF43277E6\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_61.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_61.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"I am rewarding you with these shiny coins!\"\nmsgstr \"Jutalmul adok neked néhányat ezekből a drága kis érmékből!\"\n\n#. Key:\t2717F0E0414D4828B67D9C9F9B7E5F84\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_62.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_62.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"See? I'm a gnome of my word!\"\nmsgstr \"Látod? A gnómok mindig állják a szavukat!\"\n\n#. Key:\t2747A45248055455F9FA3B977A019EE0\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_44.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_44.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Well, you know where to find me... once you have some coins to spend!\"\nmsgstr \"Hát, tudod hol találsz meg... ha van pénzed vásárolni!\"\n\n#. Key:\t27CE4D1444C219D35B79F4A3B07CB67D\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"If you bring them to me, I will reward you with shiny golden coins!\"\nmsgstr \"Ha elhozod őket, cserébe csengő aranyérmékkel fizetek!\"\n\n#. Key:\t3040F4DC4C763062C8EFED9BCA5028C0\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_59.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_59.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"I would love to give you that name, but if you don't have the money to pay for it, we can't make the deal, it wouldn't be fair\"\nmsgstr \"Annyira szeretném neked adni ezt a nevet, de ha nincs pénzed, sajnos nem tehetek semmit. Nem lenne fair.\"\n\n#. Key:\t3124230541027A0022F54C8648E688C9\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Oh, a customer!\"\nmsgstr \"Óh, vásárló!\"\n\n#. Key:\t31C147E1430106CD29C7D7B2F7E84975\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_23.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_23.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Oh, how sad.\"\nmsgstr \"Óh, milyen szomorú.\"\n\n#. Key:\t37CC1248471C360F8BB605A404ED1408\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_10.Children(4).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_10.Children(4).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Give books\"\nmsgstr \"Könyvek\"\n\n#. Key:\t3E0A0E06487AD4E75C3AF28786DE9CC7\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_16.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_16.Children(0).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Don't know\"\nmsgstr \"Nem tudom\"\n\n#. Key:\t40221BB0432119A5B1C285B748AEFB81\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_51.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_51.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"It sounds pretty epic, however I wonder what nickname it might have?\"\nmsgstr \"Nagyon menőn hangzik, de vajon hogyan becézik?\"\n\n#. Key:\t422B5CC14CA23A6563EDBDBBEA09C44B\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_73.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_73.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Farewell! Ha-ha...\"\nmsgstr \"Viszlát! Ha-ha...\"\n\n#. Key:\t4574EE8E4B1EAB6C9310C4A19F77B170\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_10.Children(6).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_10.Children(6).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Leave\"\nmsgstr \"Elmegyek\"\n\n#. Key:\t47F99BBF439F713C52279F86BDC4FDD5\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_72.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_72.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"No thanks, I'm leaving.\"\nmsgstr \"Nem kösz, lépek.\"\n\n#. Key:\t4F31CEE0411BB60324FB58938857F162\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_16.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_16.Children(1).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"A mighty spirit\"\nmsgstr \"Nagyhatalmú Szellem\"\n\n#. Key:\t4FA29908450786B433C0FCA2E313D989\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_36.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_36.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Hi, I'm Lory.\"\nmsgstr \"Szia, Lory vagyok.\"\n\n#. Key:\t4FCB34514D82104E732407A1CD985F6B\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_70.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_70.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Sure, show me what you've got!\"\nmsgstr \"Naná, mutasd, mid van!\"\n\n#. Key:\t53A46E1948B7CC1A9F8E02A3147FBF2D\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_67.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_67.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Sure, what can I do?\"\nmsgstr \"Persze! Mit tehetek?\"\n\n#. Key:\t53E7A272465DE8D6E34AE7BE7435B1AC\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_25.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_25.Children(1).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Spirit of the Unknown\"\nmsgstr \"Lélek az Ismeretlenből\"\n\n#. Key:\t54F8FB604F0409ED474FBFBAD8BFD3B3\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"And you are...\"\nmsgstr \"Te pedig...\"\n\n#. Key:\t58447CCB4EE84827DB8328A664C54198\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_24.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_24.Children(0).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Buy name\"\nmsgstr \"Név vásárlás\"\n\n#. Key:\t589162A649D330D791082EB8FE3F6459\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_41.Children(4).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_41.Children(4).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Don't buy.\"\nmsgstr \"Nem veszek.\"\n\n#. Key:\t58CC98724AFCD3826D69D482682AF352\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"\\\"The true value of your family\\\" and \\\"How much does a brother cost?\\\" can be two examples in this case.\"\nmsgstr \"A \\\"Miért a Család a legfontosabb?\\\" és a \\\"Mennyit ér egy testvér?\\\" példának okáért.\"\n\n#. Key:\t5A249B2E47F62C59F66AD5848E6DEBFE\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_49.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_49.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"I'll see what I can do.\"\nmsgstr \"Meglátom, mit tehetek.\"\n\n#. Key:\t5A31E5D34729F7EAB69AC08238C1D32D\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_25.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_25.Children(0).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Failed One\"\nmsgstr \"Bukott\"\n\n#. Key:\t5BA1062346DF8BC47F97BA97653E6DDA\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_46.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_46.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Farewell then, and good luck with your quest! Ha-ha...\"\nmsgstr \"Viszlát, és sok szerencsét utadon! Ha-ha...\"\n\n#. Key:\t6047D5334E0247BFB75EBAA7380C6800\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_68.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_68.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"I have some other important things to do right now.\"\nmsgstr \"Sajnos most más fontos teendőim vannak.\"\n\n#. Key:\t60B184AF4F25AFB60380029BD2C17AAB\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_66.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_66.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"I'm a mighty spirit of the Unknown!\"\nmsgstr \"Az Ismeretlen Világ nagyhatalmú szelleme vagyok!\"\n\n#. Key:\t60CE0D4342B6E4971449D7BDDD62B13F\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_10.Children(3).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_10.Children(3).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Help\"\nmsgstr \"Segíts!\"\n\n#. Key:\t62C5459E46C969412EAD70BAD466D808\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_SpeechSequence_0.SpeechSequence(1).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_SpeechSequence_0.SpeechSequence(1).SpeechSequence.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Life is relentless. Innocent people are trapped, enslaved or abused!\"\nmsgstr \"Az élet rideg és kegyetlen. Ártatlanok kerülnek fogságba! Kihasználnak, eladnak!\"\n\n#. Key:\t6DDEF0AB45B60A99946E8F9FC647DCDE\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_71.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_71.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"I need a proper name.\"\nmsgstr \"Kell egy jó név.\"\n\n#. Key:\t6F1C50A44DE698DF5BF089B1C9B29F06\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_69.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_69.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Right now I don't really have much money...\"\nmsgstr \"Épp nem állok túl jól anyagilag...\"\n\n#. Key:\t72272161488706E5E87697A755F11129\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Even though there are some other precious books that I could add to my collection...\"\nmsgstr \"Ennek ellenére van még pár könyv, amit szívesen a gyűjteményemben tudnék...\"\n\n#. Key:\t764502A14C3C18B14F8A579A58CE5938\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"I know that some of those books must be in the Sewer's Library, but I couldn't find them.\"\nmsgstr \"Ezek a könyvek biztosan megvannak a Csatorna Könyvtárában, de én nem találtam őket.\"\n\n#. Key:\t7A1853C7454D74FD1F371A92CEE47B4E\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"That's fine but I wonder, what is your name?\"\nmsgstr \"Nagyon jó, de mi a neved?\"\n\n#. Key:\t7BACFCA748AF641E051E2D8B8D8488FC\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"I don't know if I have one.\"\nmsgstr \"Nem tudok róla, hogy van-e olyanom.\"\n\n#. Key:\t821021954082EA7E4B392FA89EE4DE91\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_41.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_41.Children(1).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Spirit of the Unknown (1 Gold)\"\nmsgstr \"Lélek az Ismeretlenből (1 Arany)\"\n\n#. Key:\t83AECB5A4FCAB05CC81BCC9B810245B7\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_41.Children(2).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_41.Children(2).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"BALL-E (1 Gold)\"\nmsgstr \"BALL-E (1 Arany)\"\n\n#. Key:\t84ACF5E1449849CB79CF8AB10BE2FF2E\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"As you can observe, I have a pretty nice collection of books.\"\nmsgstr \"Amint látod, egész szép könyvtáram van.\"\n\n#. Key:\t899D1E18420FDAD236BF3486B2A5A010\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Ring the bell if you need something.\"\nmsgstr \"Csengess, ha szeretnél valamit!\"\n\n#. Key:\t8B33450F405DF08E72CE47B5FC66CDD5\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_55.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_55.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Spiry? Knowny?\"\nmsgstr \"Léli? Ismi?\"\n\n#. Key:\t8CEC3E1943C3AB72CF3B71B160B9ADB9\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_10.Children(5).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_10.Children(5).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Need gold\"\nmsgstr \"Kellene arany\"\n\n#. Key:\t8D0FBCA540F73842DD3AC38A76A5B623\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_56.Text\n#. Key:\tF045657A439D69E3615B80A066E9CE86\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_33.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_33.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_56.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Nevermind! You chose well.\"\nmsgstr \"Rá se ránts! Jól választottál.\"\n\n#. Key:\t8F32BD4544F8C439D7344CBE1F9B4D8A\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_24.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_24.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Would you like to buy one? The first one is for free!\"\nmsgstr \"Szeretnél venni egyet? Az első ingyen van!\"\n\n#. Key:\t94C0F9B34F439CDFBDFAD696E81983E5\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"I don't have much gold. Is there any way you could help me out?\"\nmsgstr \"Nem állok túl jól anyagilag. Nem tudnál kisegíteni valahogy?\"\n\n#. Key:\t9BA6BAA24E6C2B7F01964D892246E8F6\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"No, no, I meant the other bell.\"\nmsgstr \"Nem, nem, a másik csengőre gondoltam.\"\n\n#. Key:\tA9D4DF4C41BAD682571763BDA8DA6A62\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_10.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_10.Children(1).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Can't afford\"\nmsgstr \"Nincs aranyam\"\n\n#. Key:\tAA6B105442F5099CE0F4E2AE0DFF7080\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_35.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_35.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Now that we're done with this, will you have a look at my wares?\"\nmsgstr \"Most, hogy ezzel is megvagyunk, megnézed az áruimat?\"\n\n#. Key:\tAADE21D24A42CE7BD318478306BAFFF7\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_10.Children(2).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_10.Children(2).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"I need a name\"\nmsgstr \"Kell egy jó név\"\n\n#. Key:\tAB00899C4A94AA6458737BB28339A3EE\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Hush, hush, little one!\"\nmsgstr \"Csitt, csitt, kicsikém!\"\n\n#. Key:\tAB431F244E4E18230CE5EAB99FB41A96\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_41.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_41.Children(0).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Failed One (1 Gold)\"\nmsgstr \"Bukott (1 Arany)\"\n\n#. Key:\tAB92E44E46B40EF16989FF850DE0F843\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_42.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_42.Children(0).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Interested\"\nmsgstr \"Érdekel\"\n\n#. Key:\tB0540325412D9839B33FB38C4FE73172\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Well, I guess that's a classic.\"\nmsgstr \"Klasszikus, igaz?\"\n\n#. Key:\tB0EFD31840839CDA6F3D929514412D00\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Ok, I'll try not to be annoying this time.\"\nmsgstr \"Oké, most megpróbálok kevésbé bosszantó lenni.\"\n\n#. Key:\tB1F217944F6B9A29BD13FA926D8230E8\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_44.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_44.Children(0).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Farewell!\"\nmsgstr \"Viszlát!\"\n\n#. Key:\tBA2B2F444FC2320349C4A0BABDA78B40\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_25.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_25.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"All right...\"\nmsgstr \"Rendben...\"\n\n#. Key:\tCADB3E394C94CDE32D9969B6C1A41F5C\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_47.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_47.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Take this Elevator Crystal as it might prove useful in your journey.\"\nmsgstr \"Fogd ezt a Felvonó Kristályt! Még jól jöhet.\"\n\n#. Key:\tCB3F061042B8340154B4CD8AEED41348\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_42.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_42.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"However, there is a way, I can help you out. Of course, if you are interested.\"\nmsgstr \"Ugyanakkor, van egy ötletem, hogy tudnék segíteni. Persze csak ha érdekel.\"\n\n#. Key:\tCF24AD454E123F6D7D61029155390914\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_41.Children(3).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_41.Children(3).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Warriorb (1 Gold)\"\nmsgstr \"Gömbörző (1 Arany)\"\n\n#. Key:\tD01937C848C69809890885BAB13042BE\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_65.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_65.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"I'm not quite sure.\"\nmsgstr \"Nem vagyok benne biztos.\"\n\n#. Key:\tD53097EB4EFC08C0C3261A9EEBD96B72\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_39.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_39.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"That's sad. Nothing is worse than a customer without any gold to spend!\"\nmsgstr \"Milyen szomorú. Nincs is szánnivalóbb teremtés az üres erszényű vásárlónál!\"\n\n#. Key:\tD63C08294AC09BF5B8E5D29EEC1C7D39\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"I'm forced to stay in this realm because I agreed to do some silly tasks for a wizard. I could really use some help.\"\nmsgstr \"Erőszakkal tartanak ebben a világban, hogy megcsináljak valami küldetést egy varázslónak. Jól jönne egy kis segítség.\"\n\n#. Key:\tDB0CCA7746068ACFBE6F71963C398753\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_63.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_63.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"And now that you have some coins to spend it's time to talk about business!\"\nmsgstr \"És most, hogy végre van pénzed, térjünk rá az üzletre!\"\n\n#. Key:\tDC0F8EC0407F1C7B4FFED6A91CB961C5\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_57.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_57.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"I hope this doesn't mean that you want to join the Maintainers. Haha!\"\nmsgstr \"Remélem azért még nem állsz be a Takarítók közé. Haha!\"\n\n#. Key:\tDC475A6740B71354D90D53B6AD1C4740\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_60.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_60.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"How wondrous! You found my books!\"\nmsgstr \"Milyen csodálatos! Megtaláltad a könyveimet!\"\n\n#. Key:\tE3B8F89B4D4AC0ABD2E35994ABFA9916\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"I understand if you have identity problems, but there must be a way... how do others call you?\"\nmsgstr \"Megértem, ha önismereti problémáid vannak, de csak van valami, amit tudsz... mások hogy szólítanak?\"\n\n#. Key:\tE6BD711C4E23B71F944EEFB1C8D09AB4\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_41.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_41.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"You've come to the right place! Haha!\"\nmsgstr \"A legjobb helyre jöttél! Haha!\"\n\n#. Key:\tEDEB662C4A5024CC618A668699BFAC2C\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_SpeechSequence_0.SpeechSequence(2).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_SpeechSequence_0.SpeechSequence(2).SpeechSequence.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"There is no justice in this Realm.\"\nmsgstr \"Nincs igazság ezen a földön.\"\n\n#. Key:\tF8814FA0497129A211F3F9BE01EAF378\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_29.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_29.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"That's a very cute name for a little one like you.\"\nmsgstr \"Milyen aranyos név!\"\n\n#. Key:\tF8BEB8C147C81D8B13E52AA9934891AB\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_58.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_58.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Nevermind, you can always come back.\"\nmsgstr \"Semmi gond, bármikor visszajöhetsz.\"\n\n#. Key:\tF97BE7FD49F465A97F7C8D9F308EAD3C\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_52.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_52.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"That's such a cute name for a little one.\"\nmsgstr \"Milyen aranyos név!\"\n\n#. Key:\tFAAAE5944AA8CCAEFC931CAA814C8621\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_54.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_54.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Which means you chose well.\"\nmsgstr \"Ami azt jelenti, jól választottál.\"\n\n#. Key:\tFAD10B404CF744B61DF5D093829CD1E9\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Of course! You need some gold, otherwise how would you buy my stuff?\"\nmsgstr \"Hát persze! Szükséged van aranyra, másként hogyan vásárolnál?\"\n\n#. Key:\tFE40092A444E97C59E8C6E94061D1134\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_30.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_30.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"However, I'd rather prefer: 'Nomen quantivis iam est pret!'\"\nmsgstr \"Én viszont jobban szeretem azt, hogy \\\"Nomen quantivis iam est pret!\\\".\"\n\n#. Key:\tFEE11C0F4A65DDFFDBF0BD8BB30CD438\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_25.Children(2).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_25.Children(2).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"BALL-E\"\nmsgstr \"BALL-E\"\n\n#. Key:\tFF0AFE8544814AE524115A853547D727\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_24.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_24.Children(1).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Refuse\"\nmsgstr \"Elutasítom\"\n\n#. Key:\t0648624E4922B098541A7EA738DABC92\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/AARagdoll.AARagdoll:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/AARagdoll.AARagdoll:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_AARagdoll\"\nmsgid \"Well that happens sometimes. Maybe that someone forgot to monopolize this ragdoll design.\"\nmsgstr \"Előfordul az ilyesmi. Valószínűleg az a valaki elfelejtette levédetni ezt a rongybaba típust.\"\n\n#. Key:\t2058DE654B2B75531C04628635169938\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/AARagdoll.AARagdoll:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/AARagdoll.AARagdoll:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_AARagdoll\"\nmsgid \"Just leave that doll.\"\nmsgstr \"Csak hagyjuk a babát.\"\n\n#. Key:\t5A456D084D452C82038A04942002FAE6\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/AARagdoll.AARagdoll:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/AARagdoll.AARagdoll:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_AARagdoll\"\nmsgid \"It’s like the doll which was made by...\"\nmsgstr \"Pont úgy néz ki, mint azok a rongybabák, amiket...\"\n\n#. Key:\t7813ED164DF5CA7DE48A978F9A3DC959\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/AARagdoll.AARagdoll:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/AARagdoll.AARagdoll:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_AARagdoll\"\nmsgid \"How on earth did this get here?\"\nmsgstr \"Hogy kerül ez ide?\"\n\n#. Key:\tC4403E4C4FD7D72CA3252FB31FF98FDF\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/AARagdoll.AARagdoll:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/AARagdoll.AARagdoll:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_AARagdoll\"\nmsgid \"...by someone I knew.\"\nmsgstr \"...valaki, akit régebben ismertem, készített.\"\n\n#. Key:\tE4CD5DBC4E4BB1E783B55D80F4296B97\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/AARagdoll.AARagdoll:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/AARagdoll.AARagdoll:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_AARagdoll\"\nmsgid \"There are many weird things all over this place. What makes this stand out?\"\nmsgstr \"Annyi fura dolog van itt. Miért lenne ez különböző?\"\n\n#. Key:\tEDD72B38407D0C33C5F7859D09BC132B\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/AARagdoll.AARagdoll:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/AARagdoll.AARagdoll:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_AARagdoll\"\nmsgid \"You are not funny.\"\nmsgstr \"Egyáltalán nem vagy vicces.\"\n\n#. Key:\t02767246403F00F0C866B2A7F3E22A47\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_72.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_72.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"You can hardly find anyone that has more information about the Realms.\"\nmsgstr \"Aligha találsz bárkit is, aki többet tudna a Világokról.\"\n\n#. Key:\t04843D4A4D2DD4BC7CE50989C8F66FBA\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_2.SpeechSequence(2).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_2.SpeechSequence(2).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"How can I do something if I do not know what I have to do?\"\nmsgstr \"Hogy csinálnék valamit, amiről nem is tudom, hogy csinálnom kell?\"\n\n#. Key:\t071A801E44759E2681218497B9AE9A2B\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_53.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_53.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Your logic is incoherent.\"\nmsgstr \"A logikád hibás.\"\n\n#. Key:\t07488F9A4CC6F87DBC44F0A11700B370\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_70.Children(0).Children.Text\n#. Key:\tA67B3D3B4A3D17B37D585EBBBD9BBE92\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_75.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_70.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_75.Children(0).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"All right, I'm on it.\"\nmsgstr \"Rendben, rajta vagyok.\"\n\n#. Key:\t0757D23846F6BC96198472B7E9848D3F\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_52.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_52.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Maybe I should accept what I need to do now.\"\nmsgstr \"Talán el kellene fogadnom, hogy most ezt kell csinálnom.\"\n\n#. Key:\t07D63011406134B07FB90B903825151C\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_8.SpeechSequence(2).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_8.SpeechSequence(2).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Make your wizard turn you back to normal.\"\nmsgstr \"Vedd rá a varázslódat, hogy csinálja vissza, amit veled tett.\"\n\n#. Key:\t091DFEFA4B2DD8F9922A1B93534C66A8\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_70.Text\n#. Key:\t0F92571643C12F65C669F7812572B014\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_82.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_70.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_82.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven gives you one of his keys so that you can move around freely.\"\nmsgstr \"Holló neked adja az egyik Kulcsát, hogy szabadabban mozoghass.\"\n\n#. Key:\t0922ED5741BB89553CCB548D33566972\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_8.SpeechSequence(4).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_8.SpeechSequence(4).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven is something which won't make wizards turn Raven back.\"\nmsgstr \"Holló nem valami, ami varázslókat vesz rá, hogy visszacsináljanak dolgokat.\"\n\n#. Key:\t0AAFADBB493DCFBA6C649EAC11133DC2\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_2.SpeechSequence(0).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_2.SpeechSequence(0).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"You don't have to know.\"\nmsgstr \"Nem kell, hogy tudd.\"\n\n#. Key:\t0E59A33E44BF6B212BF0EF8E8EFB3E39\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_6.SpeechSequence(2).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_6.SpeechSequence(2).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"A rich kingdom ruling all the other lands, powered by spirits of another world; these spirits were bound to metal.\"\nmsgstr \"Pompás királyság, minden föld ura. Szolgálói egy másik világ szellemei, vasba zárva.\"\n\n#. Key:\t0EACC01B4A4C4F8C5622B9BD291E0DB9\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_91.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_91.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"I'm not quite sure about this...\"\nmsgstr \"Nem vagyok teljesen biztos benne...\"\n\n#. Key:\t10142FA943B5E5D89F9E5AADC86EF413\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_113.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_113.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Yes.\"\nmsgstr \"Igen.\"\n\n#. Key:\t12375FB0475147E23E1C21A867CFF219\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_68.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_68.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Is there anything else on your mind?\"\nmsgstr \"Van még valami?\"\n\n#. Key:\t12A0B58B446843DD24045394E8586D7D\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Krrr...\"\nmsgstr \"Krrr...\"\n\n#. Key:\t12B921E04D135919C7DA37ADDBD2A7DB\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_100.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_100.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"We still have some time left before this happens.\"\nmsgstr \"Előtte még van egy kis időnk.\"\n\n#. Key:\t133F676B4DBA8B41F6B94387D51457D5\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_59.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_59.Children(1).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"No more Raven\"\nmsgstr \"Elegem van Hollóból\"\n\n#. Key:\t13EF39EE4249FDD62208CFB7A41821D7\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_65.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_65.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Though Raven knows how you feel.\"\nmsgstr \"Holló jól tudja, mit érzel.\"\n\n#. Key:\t15D06ACE4E8B5E4DA49297BBE436039D\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_80.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_80.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Now you only need to find a place where you can infuse it.\"\nmsgstr \"Most már csak fel kell töltenéd.\"\n\n#. Key:\t16D5522340AE76E69A4808A3C2D1C039\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_51.Children(1).Children.Text\n#. Key:\t2AD4608440348AC7C3E363A430B9848C\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_83.Children(0).Children.Text\n#. Key:\t57DDAE184F31D9761E3939B16E6B2E67\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_20.Children(1).Children.Text\n#. Key:\t59F157C64A5415C8B4E322B0FF5F2ACE\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_49.Children(1).Children.Text\n#. Key:\t73ACC7124190746F6D3EBF96C8202C25\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_77.Children(1).Children.Text\n#. Key:\t9900274346DCB374A4B222A6BFD67365\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_10.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_10.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_20.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_49.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_51.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_77.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_83.Children(0).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Chat\"\nmsgstr \"Beszélgetek\"\n\n#. Key:\t19FD8B0541A533338EA11B9CDA3719B2\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_74.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_74.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Now you only need to find a place where you can infuse it. Meanwhile, Raven must figure it out how to open the Gate with it.\"\nmsgstr \"Most már csak fel kell töltenéd.\"\n\n#. Key:\t1BD7592A4F11AEC585ECA6A74A0E0D4E\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_9.SpeechSequence(4).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_9.SpeechSequence(4).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"In what way?\"\nmsgstr \"Hogyan?\"\n\n#. Key:\t1C30FADA4BB2B3CCE2140A8E192D9F14\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_34.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_34.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven is not like those dummy Living Armors, yet he does what he was made for.\"\nmsgstr \"Holló nem olyan, mint azok a bamba Mozgó Páncélok, de azért még megteszi, ami a dolga.\"\n\n#. Key:\t1C57460444A7E044DD96148495C4C217\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_6.SpeechSequence(4).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_6.SpeechSequence(4).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"They lost purpose and became reckless.\"\nmsgstr \"Céltalanná váltak és elsatnyultak.\"\n\n#. Key:\t1E3AF1D8483287CE52633EA41B89DF11\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_116.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_116.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"After he had some rest.\"\nmsgstr \"Csak még pihen egy kicsit.\"\n\n#. Key:\t1ED675F344909355D41212988B736F70\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_1.SpeechSequence(3).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_1.SpeechSequence(3).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven's master would like to understand before doing anything.\"\nmsgstr \"Holló gazdája szeretné megérteni a dolgokat, mielőtt cselekszik.\"\n\n#. Key:\t22E51DC245ABAE53146A71AAE8D5AB55\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"You will realize that 'sense' has no meaning in this realm anymore.\"\nmsgstr \"Rá fogsz jönni, hogy az \\\"értelmes\\\" szónak ebben a világban már nincs nagy értelme.\"\n\n#. Key:\t236E0B58451C947C0DB93E9E3408456D\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_45.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_45.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"They are humans.\"\nmsgstr \"Ők emberek.\"\n\n#. Key:\t254FBEE547ADDFCF33B350B04AE1EE16\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_95.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_95.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"I think I know all about the meaning of life and all, ok? Can we just go on?\"\nmsgstr \"Jó-jó, tudom, az élet értelme, meg minden. Tovább léphetünk?\"\n\n#. Key:\t2671F10D4257D8A3482009A9C042026D\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Hand it over to Raven so he could open the Gate!\"\nmsgstr \"Add csak Hollónak, hadd nyissa ki vele a Kaput!\"\n\n#. Key:\t2845CBE64B1624C7EC4B81BC314B4F1B\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_27.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_27.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"The master gave Raven the ability to think and talk.\"\nmsgstr \"A gazda megadta Hollónak a gondolkodás és a beszéd képességét.\"\n\n#. Key:\t29F405BF4233B5A8331B419747954425\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_77.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_77.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Why are you here?\"\nmsgstr \"Miért vagy itt?\"\n\n#. Key:\t2B5FB92D4F98359F68AD58AB776FD9BA\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_9.SpeechSequence(1).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_9.SpeechSequence(1).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Seeking for knowledge, as always. And you? Never thought we’ll meet again. Still trying to take down these Realms forever?\"\nmsgstr \"Válaszokat keresek, mint mindig. És te? Nem hittem, hogy újra itt találkozunk. Még mindig szét akarod választani a Világokat?\"\n\n#. Key:\t2B8CF34046D5486EB935CE919A1BD469\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_97.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_97.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"I'm new with all this wizard business thing. What was their conversation about?\"\nmsgstr \"Még új vagyok ebben a varázsló témában. Miről beszéltek?\"\n\n#. Key:\t2C15668C26080F0A003A02E7BE7B5A65\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_8.SpeechSequence(1).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_8.SpeechSequence(1).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"It can happen again.\"\nmsgstr \"Újra megtörténhet.\"\n\n#. Key:\t2F226AC246B52387854AF5AFA09CEDD6\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_43.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_43.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"So we let those keys behind and set ourselves free from wizards?\"\nmsgstr \"Akkor hagyjuk az ajtót, és megszökünk a varázslóktól?\"\n\n#. Key:\t2FF7B3E84C009ECFDDE9F495092BEAA8\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_9.SpeechSequence(7).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_9.SpeechSequence(7).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"A pleasure to hear that. Talk to Raven about the details. Please excuse me for leaving so early, I have something important to do.\"\nmsgstr \"Örömmel hallom. Beszélj Hollóval a részleteket illetően. Most pedig, ha meg nem haragszol, sürgős elintéznivalóim vannak, ezért távozom.\"\n\n#. Key:\t305333F348E677D8C3553999F412C8B6\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_36.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_36.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven knows he has different tasks now, compared to what he used to do before.\"\nmsgstr \"Holló tudja, hogy most már más feladatai vannak, mint amikhez régebben szokott.\"\n\n#. Key:\t311A1E3745667AC6B4114D999B0E7C7F\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_83.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_83.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Go now! Raven still needs some more time to think about this.\"\nmsgstr \"Indulj! Hollónak még át kell gondolnia pár dolgot.\"\n\n#. Key:\t32F0018141E94BDE0921E9A54C1E4F20\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_1.SpeechSequence(0).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_1.SpeechSequence(0).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"They were always like this.\"\nmsgstr \"Mindig ilyenek voltak.\"\n\n#. Key:\t34903F43484A4D6CE5735890AEEA294D\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_9.SpeechSequence(5).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_9.SpeechSequence(5).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"The Cerulean Gates are closed again. What if we share the work?\"\nmsgstr \"A Mélykék Kapu ismét zárva van. Mi lenne, ha megosztanánk a munkát?\"\n\n#. Key:\t350270814B961A20E48267A4B1AE0538\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Yes! The Gem is fully charged!\"\nmsgstr \"Igen! A Kő teljesen feltöltődött!\"\n\n#. Key:\t361D80AB46AC47E5A233ECA2323222A2\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_86.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_86.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Why are you obeying that wizard of yours?\"\nmsgstr \"Miért engedelmeskedsz a varázslódnak?\"\n\n#. Key:\t365EDA2849D42A47D0D26DAC50DA6E94\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven is not that happy with those two, but Raven can accept that he is what he is.\"\nmsgstr \"Hollónak nem hiányzott ez a két dolog, de elfogadja, hogy most már a részét képezik.\"\n\n#. Key:\t37C560AB4CCFAF4F8D26FAB1DE22453C\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_63.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_63.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Don't worry. You'll find some purpose.\"\nmsgstr \"Ne aggódj! Megtalálod még a célodat.\"\n\n#. Key:\t39DAB8B641C31878F7312FA7807D9DA0\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_6.SpeechSequence(3).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_6.SpeechSequence(3).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"The residents of the Realm did not have to work. Their spirit slaves did everything for them, they accomplished all their desires.\"\nmsgstr \"A Birodalom lakóinak nem kellett dolgozniuk. A szellem szolgák mindent elvégeztek helyettük.\"\n\n#. Key:\t3B63606F48193748243DE6AB18D7A68C\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_40.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_40.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven thinks you might want to be something else. Something that you used to be, but you are not anymore.\"\nmsgstr \"Holló úgy véli, valami más akarsz lenni, mint ami vagy. Valami, ami régebben voltál.\"\n\n#. Key:\t3C332B1C4ADB3C16C005E8AAF76A09B1\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_109.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_109.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Except...\"\nmsgstr \"Kivéve...\"\n\n#. Key:\t3C9750814FC56947BDA7DFAF8A71DCC2\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_25.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_25.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"It is a long story and Raven doesn't really like to talk about it.\"\nmsgstr \"Hosszú történet, és Holló nem szívesen beszél róla.\"\n\n#. Key:\t3D10982D4A6FA88941F13F82413D17AC\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_20.Children(0).Children.Text\n#. Key:\t3E117EBB48C1CF091F456CA0FB78EDD7\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_77.Children(0).Children.Text\n#. Key:\t59F0F04941BB918E08743E8A7C3734B2\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_32.Children(6).Children.Text\n#. Key:\t6556945844ED44678075CE8796F00800\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_51.Children(0).Children.Text\n#. Key:\t7EC3944940792EC71B6A2F8674250649\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_49.Children(0).Children.Text\n#. Key:\tC6963EAE43B4D0FD3C8FBAA80A38E2A2\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_83.Children(1).Children.Text\n#. Key:\tE048FA684AA7B8DE0F7273992DA4600E\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_3.Children(4).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_20.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_3.Children(4).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_32.Children(6).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_49.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_51.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_77.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_83.Children(1).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Leave\"\nmsgstr \"Távozok\"\n\n#. Key:\t4417EE084F947AAF5D3285B086F741AC\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven is fine with talking. Ask me whatever you have on your mind!\"\nmsgstr \"Holló szívesen társalog. Kérdezz bármit!\"\n\n#. Key:\t4485635A4832D9DC57240F8EF3323042\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Very nice! Raven likes that you are making progress.\"\nmsgstr \"Szép! Holló látja, hogy nem csak lopod az időt.\"\n\n#. Key:\t480718E34822FD682466E7B217249ED0\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_47.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_47.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Which is technically the same.\"\nmsgstr \"Ami lényegében ugyanaz.\"\n\n#. Key:\t48B67F42417A2930A4D200B958FDFB58\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_38.Children(3).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_38.Children(3).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"I'm confused\"\nmsgstr \"Összezavarodtam\"\n\n#. Key:\t49F0AC6A46EBF6C3148BC590CE56C297\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_10.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_10.Children(0).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Help\"\nmsgstr \"Segíts!\"\n\n#. Key:\t4CB1CE8A4AEC18FA175BA98F831D3C3C\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_59.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_59.Children(0).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Farewell\"\nmsgstr \"Viszlát\"\n\n#. Key:\t4D514A7D4CC96E3E79F464A6C0BF0C6E\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_2.SpeechSequence(4).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_2.SpeechSequence(4).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"What??\"\nmsgstr \"Mi??\"\n\n#. Key:\t4F8198D64A210B3A41EED8AA6AE64401\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_50.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_50.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven will just sit here for a short time before venturing into the Ruin.\"\nmsgstr \"Holló pihen még egy kicsit, mielőtt tovább merészkedik a Fertőzött Világban.\"\n\n#. Key:\t503CD5334EE86CFBEC2E7EA67F45ACD9\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"So you're meant to open this dusty little door with Raven, aren't you?\"\nmsgstr \"Szóval ki kéne nyitnod Hollóval ezt a jó öreg rozsdás kaput, igaz-e?\"\n\n#. Key:\t512AEC2642B36D9DDF407EB447DF5A28\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_15.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_15.Children(1).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Let's have fun!\"\nmsgstr \"Mulassunk!\"\n\n#. Key:\t5142E71B48C2E993CC8026919A3FDBD6\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_87.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_87.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Er... okey, I was just asking.\"\nmsgstr \"Ööö... oké, csak kérdeztem.\"\n\n#. Key:\t518038644F25D09C9DA7FF984C272B77\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_40.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_40.Children(1).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"That's stupid\"\nmsgstr \"Hülyeség\"\n\n#. Key:\t53B5A1AC40CCF1CFBC106BA2BD8000E0\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_60.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_60.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Farewell, Raven!\"\nmsgstr \"Viszlát, Holló!\"\n\n#. Key:\t54C0F3A6493E6D0671D38DB16BD4BF51\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"I would like to know...\"\nmsgstr \"Szeretném megkérdezni...\"\n\n#. Key:\t55665725414633C111356D94939362FF\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_67.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_67.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Let's open that gate. Quick!\"\nmsgstr \"Akkor nyissuk ki a kaput gyorsan!\"\n\n#. Key:\t565D7DA644ADF0E536C2FC8F99B735A3\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_3.Children(2).Children.Text\n#. Key:\t934A23AD44787C735FCDE79A34657C90\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_32.Children(3).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_3.Children(2).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_32.Children(3).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Why is he here?\"\nmsgstr \"Miért vagy itt?\"\n\n#. Key:\t57BE04074884DB4CC54AC691E156F0FC\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_38.Children(2).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_38.Children(2).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Freedom\"\nmsgstr \"Szabadság\"\n\n#. Key:\t5919EDBF4799413180AF569CB920E436\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_90.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_90.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"You can't live your life like in the old days any longer and that's why you're staying with your master, right?\"\nmsgstr \"Képtelen lennél a régi életedet élni, ezért nem hagyod el a gazdádat, igaz?\"\n\n#. Key:\t592D458F40571927D0BB549F3614420E\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_32.Children(5).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_32.Children(5).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"End of the World\"\nmsgstr \"Világ Vége\"\n\n#. Key:\t596065A34760461993AC339C51D9E402\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_73.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_73.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"First you will need to find the Gem. Meanwhile, Raven must figure it out how to open the Gate with it.\"\nmsgstr \"Először is, meg kell találnod a Követ. Közben Holló majd kitalálja, hogy nyissuk ki vele a Kaput.\"\n\n#. Key:\t599A90394B8AC7A26D20FEB355A873FB\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_98.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_98.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"What are you doing here?\"\nmsgstr \"Mit keresel itt?\"\n\n#. Key:\t5A5D2F08427C4747F3EF529D6B73A21B\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Go on your search then! Unless you'd like to chat some more with Raven.\"\nmsgstr \"Indulj akkor! Kivéve, ha szeretnél beszélgetni Hollóval.\"\n\n#. Key:\t5A63E364458C849C9B6FDD8491427051\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_8.SpeechSequence(5).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_8.SpeechSequence(5).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"But you could.\"\nmsgstr \"De megtehetnéd.\"\n\n#. Key:\t5B07757F4CAAD674E09EBB835CEE230B\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_75.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_75.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"It must be somewhere close to the Arcade.\"\nmsgstr \"Valahol az Árkád közelében kell lennie.\"\n\n#. Key:\t5B9CDB4340B5E65E59D3A18283A84CA5\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_64.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_64.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven knows some people that'd be glad with that.\"\nmsgstr \"Holló ismer pár embert, aki ennek örülne.\"\n\n#. Key:\t5BA0645E49A62C0945FB64BDF689721F\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_112.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_112.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Is that where I will find your artefacts?\"\nmsgstr \"Ott vannak a Varázstárgyak?\"\n\n#. Key:\t5E70951F4E50B061FF2DA196F0207612\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_15.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_15.Children(0).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Save the world!\"\nmsgstr \"Mentsük meg a Világot!\"\n\n#. Key:\t5F810A7D417E5B02025F30B21FEA5F03\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_79.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_79.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Niiice!\"\nmsgstr \"Széééép!\"\n\n#. Key:\t6441F8C2484FAA5219841C9D374F36C4\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_6.SpeechSequence(6).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_6.SpeechSequence(6).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"And now, even while we speak, their curse continues to spread.\"\nmsgstr \"És most, miközben békésen társalogsz Hollóval, a Fertőzés egyre csak terjed.\"\n\n#. Key:\t66A08695458FF9D46383F6A0AF609EFA\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_41.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_41.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"You are so hopeless...\"\nmsgstr \"Reménytelen vagy...\"\n\n#. Key:\t67EEF3DB42BA2C954AD566B4F95EBDB6\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_6.SpeechSequence(5).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_6.SpeechSequence(5).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Until one day the spirits broke loose and formed Ruin.\"\nmsgstr \"Aztán egy nap a szellemek elszabadultak, és megalkották a Fertőzést.\"\n\n#. Key:\t68442CA14CECA9FB8A215EBEBC724F63\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Ask more from Raven if you like!\"\nmsgstr \"Csak kérdezz még Hollótól, ha szeretnél.\"\n\n#. Key:\t694D416244358BD7DBED04A82390A146\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_51.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_51.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"One more,... and the Gem will be completed!\"\nmsgstr \"Már csak egy kell, és a Kő teljesen feltöltődik!\"\n\n#. Key:\t6A463E0444754B73FE11988F07D5A58F\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_2.SpeechSequence(1).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_2.SpeechSequence(1).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"You just have to do it.\"\nmsgstr \"Elég, ha teszed.\"\n\n#. Key:\t6A92F010409301669F7B83AD7901A469\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"A strange creature, yet a familiar aura! Tell me, my dear Wizard, what happened to Tabby?\"\nmsgstr \"Furcsa teremtmény ismerős aurával. Mond csak, kedves Varázsló, mi történt Cirmossal?\"\n\n#. Key:\t6CC1259244D5FC82CA1C2EA314836741\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_1.SpeechSequence(1).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_1.SpeechSequence(1).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"They both accepted that there is a great threat in this realm.\"\nmsgstr \"Mindketten rájöttek, hogy a Világ veszélyben van.\"\n\n#. Key:\t6FB7AF774662247E2001F9AAF34FF134\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_111.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_111.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Somewhere beyond that Gate there's a Portal. It will take you into the heart of the Realm.\"\nmsgstr \"A Kapun túl lesz egy Átjáró, ami ennek a Világnak a mélyére vezet.\"\n\n#. Key:\t70A0BA47476A909013EFC0A574815B61\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_23.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_23.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"The Master and Raven are seeking knowledge about the Ruined Realm.\"\nmsgstr \"A Gazda és Holló a Fertőzést kutatja.\"\n\n#. Key:\t70ECE1B74BA0B02F2F0850937BF4FB02\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_3.Children(3).Children.Text\n#. Key:\tE9F5916345156A4E5F29AC886B49B8AD\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_32.Children(4).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_3.Children(3).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_32.Children(4).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"About Ruin\"\nmsgstr \"Fertőzés\"\n\n#. Key:\t7311CA4B4D6B19C6C5C362AF522A9803\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_1.SpeechSequence(4).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_1.SpeechSequence(4).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Your master said he is done with that.\"\nmsgstr \"A Mestered azt mondta, már nem foglalkozik ezzel.\"\n\n#. Key:\t74B8E0B44D4590E9970F4B9D09D3C4F9\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_6.SpeechSequence(1).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_6.SpeechSequence(1).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Long ago it was called the Runic Realm.\"\nmsgstr \"Réges régen Rúna Rendnek hívták.\"\n\n#. Key:\t76756B1C48E93E907CE32D83A2C56C3E\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_7.SpeechSequence(0).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_7.SpeechSequence(0).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven is really sorry but he can't help you anymore.\"\nmsgstr \"Holló igazán sajnálja, de nem tud többet segíteni.\"\n\n#. Key:\t78C7CE5948D176704CA69289BEEBFBA7\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_44.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_44.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"And what about the Realm of the wizards? They did not go mad yet, did they?\"\nmsgstr \"És mi a helyzet a Varázsló Világával? Az ottaniak nem őrültek meg, nem?\"\n\n#. Key:\t7DFA4D494BD0536F925A94BBF7C71F36\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_66.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_66.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Focus on what you have to do and you will find the real you.\"\nmsgstr \"Foglalkozz azzal, amit tenned kell, és meg fogod találni önmagadat benne.\"\n\n#. Key:\t81F437694DEE3D32A0FC29B90688E8B9\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_38.Children(4).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_38.Children(4).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"This is stupid\"\nmsgstr \"Hülyeség\"\n\n#. Key:\t82F473A04D250E98AD186185EBE95C04\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_5.SpeechSequence(0).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_5.SpeechSequence(0).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven thinks freedom is such an empty word.\"\nmsgstr \"Holló szerint a szabadság csak egy üres szó.\"\n\n#. Key:\t8688802A4303C53640C7BFAAA40226EC\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Almost there!\"\nmsgstr \"Mindjárt megvan!\"\n\n#. Key:\t8728C02E46E7B681D0A792ACAFC3237D\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_28.Children(2).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_28.Children(2).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"He accepted his fate\"\nmsgstr \"Elfogadta a sorsát\"\n\n#. Key:\t8854653141FA36E731780F9111B82FAD\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_30.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_30.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"You are not listening to Raven's words!\"\nmsgstr \"Nem figyelsz arra, amit Holló mond!\"\n\n#. Key:\t88FDA06B4A44ED1BF559D996E6AF7097\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_6.SpeechSequence(0).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_6.SpeechSequence(0).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Even so, Raven will tell you a bit.\"\nmsgstr \"Ettől függetlenül pár dolgot elmond Holló.\"\n\n#. Key:\t8BA584404F2713EE39D74284F829C50A\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"You know what? Raven totally agrees with that!\"\nmsgstr \"Tudod mit? Holló egyetért!\"\n\n#. Key:\t8C272FBE47796CF8101D07AAD033C24B\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_62.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_62.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"The later we met the more time the World survived, didn't it?\"\nmsgstr \"Minél később találkozunk, annál tovább húzta a Világ, nemde?\"\n\n#. Key:\t8DD39A3D497411B348B883972CE6B442\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_6.SpeechSequence(7).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_6.SpeechSequence(7).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"At first, lands lose their colours, people go mad... and then, everything breaks into shards until solely hollowness remains...\"\nmsgstr \"Először elfakulnak a színek, az emberek pedig megőrülnek... aztán minden darabokra törik, míg csak a nagy üresség marad...\"\n\n#. Key:\t8E02961D428949EE8176639F6AE84DD9\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_107.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_107.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"If the end is near, there is no point in making long term plans.\"\nmsgstr \"Ha közel a vég, nincs nagy értelme hosszú távra tervezni.\"\n\n#. Key:\t8EB8F2654B9C18135CBEB49D10485417\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_37.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_37.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"We all have a purpose in life.\"\nmsgstr \"Mindenkinek van valami rendeltetése.\"\n\n#. Key:\t9131DE4C434AD9B22C7B1BAA588AF694\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_9.SpeechSequence(3).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_9.SpeechSequence(3).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Private business? All right! We might have different motivations, however working together could be fruitful.\"\nmsgstr \"Személyes ügy? Rendben, nem firtatom. Talán céljaink eltérnek, de attól még segíthetjük egymást.\"\n\n#. Key:\t91947E4046F96E9330EA5A94C367E2C5\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Forget it, I'm on my way now.\"\nmsgstr \"Mindegy, indulok.\"\n\n#. Key:\t91BE2C7248B2BEBE1C376B989935E353\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"What else should Raven tell you?\"\nmsgstr \"Mit mondjon még Holló?\"\n\n#. Key:\t929558D0465B0884C4E373A602CCE9E5\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_59.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_59.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Farewell compeer until you meet Raven again!\"\nmsgstr \"Viszlát kolléga, még újra össze nem futsz Hollóval!\"\n\n#. Key:\t930942934A83107D86DB69A2C2EF11E0\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_117.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_117.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"The task is of high complexity.\"\nmsgstr \"Nem lesz könnyű.\"\n\n#. Key:\t93AFC24842A793D2BF7B43A64B6972AF\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_32.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_32.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Is there anything else for Raven?\"\nmsgstr \"Van még valami mondandód Hollónak?\"\n\n#. Key:\t9A9D5DA346251040AF73B7B100E1EBC9\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_35.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_35.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven used to like being a bird, but now he has no other choice. He must embrace what he became.\"\nmsgstr \"Holló szeretett egyszerű madár lenni, de már nincs választása. Fel kell nőnie ahhoz, amivé vált.\"\n\n#. Key:\t9B558C3045D4501AEAF3DD8694E2198F\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_105.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_105.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"We'd rather have some fun before it's all over.\"\nmsgstr \"Legalább addig érezzük jól magunkat, amíg az egésznek annyi.\"\n\n#. Key:\t9E598A384E301BCD345ABFB0C1312C12\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_78.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_78.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Krrr... Raven notices that you've found the Gem!\"\nmsgstr \"Krrr... Holló látja, hogy már megtaláltad a Követ!\"\n\n#. Key:\t9FAD3A1A4E3EFE33C1CAB8BAAC8190D1\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_26.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_26.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Let Raven tell you something:\"\nmsgstr \"Hadd mondjon valamit Holló:\"\n\n#. Key:\tA10F960549BD21AFAD4819BD5C74E651\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_2.SpeechSequence(5).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_2.SpeechSequence(5).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Nevermind. Raven is kidding.\"\nmsgstr \"Semmi gond, Holló csak viccel.\"\n\n#. Key:\tA4294A174F9EA54E0149839A84CE2B94\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_15.Children(2).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_15.Children(2).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Hopeless...\"\nmsgstr \"Reménytelen...\"\n\n#. Key:\tA59406E8411939F96004EAA9D5707E08\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_28.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_28.Children(1).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"What?\"\nmsgstr \"Mi?\"\n\n#. Key:\tA5993D8047CDD35BA31D318832EB9C66\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_32.Children(2).Children.Text\n#. Key:\tB7AE6BEC4CA905BDED5990BFF4D0C93D\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_3.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_3.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_32.Children(2).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"About wizards\"\nmsgstr \"Varázslók\"\n\n#. Key:\tA59A76814D8EAF5907CBC68AA63FE33F\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_2.SpeechSequence(3).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_2.SpeechSequence(3).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"How can I know that if you don't do it?\"\nmsgstr \"Honnan tudjam, ha nem csinálod?\"\n\n#. Key:\tA7C7D1EC45A072755BAAB099DB359290\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_55.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_55.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"They don't believe that Ruin can affect their World. They say that it has no effect.\"\nmsgstr \"Nem hiszik el, hogy a Fertőzés őket is elérheti.\"\n\n#. Key:\tA7D99136490D40CB08BA66A72192D6C0\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_7.SpeechSequence(2).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_7.SpeechSequence(2).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Go now! Raven needs to think.\"\nmsgstr \"Indulj! Hollónak még gondolkodnia kell.\"\n\n#. Key:\tA80B626C41713C6E42E4DF8696FF842D\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_8.SpeechSequence(0).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_8.SpeechSequence(0).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"You were a bird once. Then you became something else.\"\nmsgstr \"Valamikor madár voltál, aztán valami más lett belőled.\"\n\n#. Key:\tA8D429384EFE74E30720149A1C53ADE9\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_38.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_38.Children(0).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Don't know\"\nmsgstr \"Nem tudom\"\n\n#. Key:\tA9A73720489C122A81B84CBA262C329E\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_38.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_38.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven knows what his task is. Do you know yours?\"\nmsgstr \"Holló tudja, mi a feladata. Te tudod a sajátodat?\"\n\n#. Key:\tAB41A75C432BEBDC81D63282FCC15F98\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_5.SpeechSequence(2).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_5.SpeechSequence(2).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Got it? Free like a bird! Ha-ha-ha!\"\nmsgstr \"Érted? Szabad mint a madár! Ha-ha-ha!\"\n\n#. Key:\tAC52327249DB335CBAB9EDA6A3F4769E\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_31.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_31.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven is doing this because this is what he is.\"\nmsgstr \"Holló azért teszi ezt, mert most már ő maga is ez.\"\n\n#. Key:\tB2003CEE44335B30B9F85487521B7679\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_54.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_54.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Maybe.\"\nmsgstr \"Lehet.\"\n\n#. Key:\tB31EEC6247CDEF73BB4E5B84E2B66575\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_9.SpeechSequence(2).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_9.SpeechSequence(2).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"That’s over now. This time it's for private business.\"\nmsgstr \"Annak már vége. Ezúttal személyes ügyben vagyok itt.\"\n\n#. Key:\tB3DD59C44422BA99C839FCAE63F05B9A\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_93.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_93.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"I want to be free again!\"\nmsgstr \"Újra szabad akarok lenni!\"\n\n#. Key:\tB789219A48C2A835F2DA4CA24064E1D3\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_92.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_92.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"I would like to go home.\"\nmsgstr \"Haza akarok menni.\"\n\n#. Key:\tB7D4201F41E5F018EFD49EAF52E443A8\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_76.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_76.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"You still haven't found the Gem.\"\nmsgstr \"Még mindig nincs nálad a Kő.\"\n\n#. Key:\tB7EC6E4F4EDC448FD264999938414F3C\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Let's talk about something else!\"\nmsgstr \"Beszélj Hollóval valami másról!\"\n\n#. Key:\tB8BF08674C9E2FD0515998B95A1EA7CF\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_7.SpeechSequence(1).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_7.SpeechSequence(1).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"If you can't fulfill your task, then maybe your master should look for a better servant.\"\nmsgstr \"Ha nem tudod teljesíteni a feladatodat, akkor a Mesterednek talán más szolgálót kellene keresnie.\"\n\n#. Key:\tBD775EF74E334A4DEFA67BBF9034500E\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_84.Text\n#. Key:\tFA3FEF444FD2A3500FCCE98FAEAE923E\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_42.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_42.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_84.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Yes?\"\nmsgstr \"Igen?\"\n\n#. Key:\tBE2B9D7A45C2D43FF4C0BAAA284CBB97\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"No thanks! I'm on my way now.\"\nmsgstr \"Kösz, nem! Indulok.\"\n\n#. Key:\tC04CC9334FC3C2522793C2B97CC165D8\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_108.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_108.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"The gate is open!\"\nmsgstr \"A Kapu kinyílt!\"\n\n#. Key:\tC0F2E4744D724A3D6A0DEF914C294CE1\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_38.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_38.Children(1).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Go home\"\nmsgstr \"Hazajutni\"\n\n#. Key:\tC10018654B64193BBFF439B54EF02FB1\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"So why not open the gate?\"\nmsgstr \"Miért ne nyitnánk ki a Kaput?\"\n\n#. Key:\tC18E2FB345BE76B6F51C71A2B6453316\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_99.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_99.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"What can you tell me about the Ruined Realm?\"\nmsgstr \"Mit tudsz a Fertőzött Földről?\"\n\n#. Key:\tC19082D247C23A21B632968FE6A644D1\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_8.SpeechSequence(3).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_8.SpeechSequence(3).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"You failed to see the meaning behind Raven's thoughts.\"\nmsgstr \"Nem értetted meg Holló szavainak értelmét.\"\n\n#. Key:\tC2DC44084098DD604B757A8A47AAC4FE\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_58.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_58.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"We'll see.\"\nmsgstr \"Meglátjuk.\"\n\n#. Key:\tC53F5E0F46BBE7A1FD00EABD6E14848D\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_33.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_33.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Maybe you are wiser than Raven, but that's just a thought, little spirit.\"\nmsgstr \"Talán mégis bölcsebb vagy, mint ahogy azt Holló feltételezte, kicsi szellem.\"\n\n#. Key:\tC78588B64D12FFBE97C47AB7C046C14E\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_1.SpeechSequence(5).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_1.SpeechSequence(5).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven doesn't believe it's true.\"\nmsgstr \"Holló nem hiszi, hogy ez igaz lenne.\"\n\n#. Key:\tC7F7F71F4FE0D19BDF86188BEFDDEEB1\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_5.SpeechSequence(1).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_5.SpeechSequence(1).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Just look at Raven! He's free like a bird.\"\nmsgstr \"Csak nézz Hollóra! Szabad, mint a madár.\"\n\n#. Key:\tC82BE6E448D7C98D361CA1890FEE3B2C\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_9.SpeechSequence(6).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_9.SpeechSequence(6).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"I’m in.\"\nmsgstr \"Benne vagyok.\"\n\n#. Key:\tCD1A68EF460B0C63C95340AC2076EBAF\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven notices that the gem is just as dull as before. Why did you return then?\"\nmsgstr \"Holló látja, hogy a Kő még mindig ugyanolyan, mint ezelőtt. Miért jöttél vissza?\"\n\n#. Key:\tD3C84C884903F7FB53695AAE253C7982\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_40.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_40.Children(0).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Agree\"\nmsgstr \"Egyetértek\"\n\n#. Key:\tD438ABB348A399ACB18DFD8F320CC7BB\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_57.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_57.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"And what's the truth?\"\nmsgstr \"És mi az igazság?\"\n\n#. Key:\tD5DF32814FA17D7ED28BF0A91027A6E8\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_110.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_110.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Finally! From now on you won't need Raven anymore.\"\nmsgstr \"Végre! Mostantól nem lesz szükséged Hollóra.\"\n\n#. Key:\tD6A649B2453BCBAD95A16FA481664133\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_49.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_49.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Find the other Chargers and return to Raven when you are done.\"\nmsgstr \"Találd meg a többi Töltőt, és csak akkor gyere vissza, ha kész vagy.\"\n\n#. Key:\tD9959CF1439812F5615A38B9369F6E16\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_71.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_71.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven notices that you already have the Gem.\"\nmsgstr \"Holló látja, hogy már nálad van a Kő.\"\n\n#. Key:\tD9A4F3D54EF460C09B2A6C9B8EB87D7C\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_32.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_32.Children(1).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"About my purpose...\"\nmsgstr \"A célomat illetően...\"\n\n#. Key:\tD9C6F8C14BC9C0BD83715E96DE5B7161\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_28.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_28.Children(0).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"He is a volunteer\"\nmsgstr \"Önkéntes\"\n\n#. Key:\tDC7CA6DF4D684A7C2DBA739F404ABC36\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_94.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_94.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"I don't know what to do. I can't remember anything from my previous life.\"\nmsgstr \"Nem tudom, mit tegyek. Semmire sem emlékszem a korábbi életemből.\"\n\n#. Key:\tDD8E05E541C32F05357D888FB6963FF0\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_114.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_114.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"All right, I go then.\"\nmsgstr \"Rendben, indulok.\"\n\n#. Key:\tDE3A0B8047C9980B6DED0BA39C777539\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_28.Children(3).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_28.Children(3).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Not interested\"\nmsgstr \"Nem érdekel\"\n\n#. Key:\tDF86F9C84CF207616E931098F3C833D3\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"To activate the locking mechanism we need an infused Lock Gem.\"\nmsgstr \"Ha aktiválni akarod a nyitó szerkezetet, szükséged van egy feltöltött Zár Kőre.\"\n\n#. Key:\tE0105C1845AF9211960E869AB234ED9A\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_89.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_89.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"So you are obeying because... that's the only thing that you can do?\"\nmsgstr \"Szóval azért engedelmeskedsz, mert... nem tudsz semmi jobbat?\"\n\n#. Key:\tE17598BB49D7E4083AD4AEA2DDFE293D\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_106.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_106.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"It would make sense to try to save the world, wouldn't it?\"\nmsgstr \"Lehet az sem lenne hülyeség, ha próbálnánk megmenteni a Világot, nem?\"\n\n#. Key:\tE1CFA5A44F4EF59527528DB6018ACF33\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_8.SpeechSequence(6).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_8.SpeechSequence(6).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven doesn't care about what he could do. Raven cares about what he does.\"\nmsgstr \"Hollót nem érdekli, mit tudna vagy nem tudna csinálni. Hollót az érdekli, mit csinál.\"\n\n#. Key:\tE6FA584E454BC3943C927EADAEBA88C4\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_6.SpeechSequence(8).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_6.SpeechSequence(8).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"That's not too reassuring...\"\nmsgstr \"Nem túl biztató...\"\n\n#. Key:\tE9D9EC1F450276CF11B259978062AB7E\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_96.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_96.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"We shouldn't waste any more time on this.\"\nmsgstr \"Kár erre pazarolni az időt.\"\n\n#. Key:\tEC19AF0E4F2F4B488373FFBEDC272321\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_56.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_56.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Except for a few paranoid ones, like your master.\"\nmsgstr \"Kivéve néhány paranoiást, mint például a Mestered.\"\n\n#. Key:\tEFC8B9984D9F4A9ACC9AE580E271E810\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_39.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_39.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Searching for a way to open this gate with the help of a talking Ball is so much fun!\"\nmsgstr \"Hollónak a kalandos kapunyitás egy beszélő labdával elég szórakoztatónak hangzik.\"\n\n#. Key:\tEFCE20A646FA62188BE7EB85D6708843\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_115.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_115.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven will venture deeper into the Ruined Realm!\"\nmsgstr \"Holló folytatja útját a Fertőzött Földön!\"\n\n#. Key:\tF0B00A30413914D09CA4488578B2FD7C\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_24.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_24.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven agrees.\"\nmsgstr \"Holló egyetért.\"\n\n#. Key:\tF40AD31D4177DCB7BB138C9C139FB1A1\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_61.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_61.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"I hope that won't be too soon...\"\nmsgstr \"Remélem az nem történik meg egyhamar...\"\n\n#. Key:\tF4F8CBCD421083EDBF626AA47DEF4B50\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_88.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_88.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Do you mean that you are serving your wizard by your own will?\"\nmsgstr \"Úgy érted saját szabad akaratodból szolgálod a varázslódat?\"\n\n#. Key:\tF5A7836549DF56B89620A386E7CCF708\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_48.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_48.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"But there is still so much left to do...\"\nmsgstr \"De még mindig annyi tennivaló maradt...\"\n\n#. Key:\tF8361ECC401E740DEBF87FAE2A419EC8\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_32.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_32.Children(0).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven Servant?\"\nmsgstr \"Holló szolga?\"\n\n#. Key:\tFA5F957341772B0C4AFA33B1311CF7B4\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_69.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_69.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Except if we meet in the Afterworld.\"\nmsgstr \"Kivéve, ha a Túlvilágon találkozunk.\"\n\n#. Key:\tFA94A8EF4F8BF5EA422D27A9A205D866\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_3.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_3.Children(0).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven servant?\"\nmsgstr \"Holló szolga?\"\n\n#. Key:\tFC0798A648BFC0E9BA70D6B20A46F447\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_1.SpeechSequence(2).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_1.SpeechSequence(2).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Your master seeks to stop it no matter the price he has to pay.\"\nmsgstr \"A te Mestered le akar számolni a veszéllyel, bármilyen nagy is legyen az ár.\"\n\n#. Key:\tFCE7049641D2A70FC6B9E5B174919A64\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_9.SpeechSequence(0).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_9.SpeechSequence(0).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Tabby has retired. What did you come for?\"\nmsgstr \"Cirmos már visszavonult. Mit keresel itt?\"\n\n#. Key:\tFD68B18A435050A137D8F0948F24E2DC\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Why are we messing with this door if the World is about to end?\"\nmsgstr \"Miért vacakolunk ezzel a Kapuval, ha úgyis mindjárt itt a Világ Vége?\"\n\n#. Key:\tFF3D9FCF4A840A8155A8D7AD9CC22F2D\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Obey? Raven doesn't obey.\"\nmsgstr \"Engedelmeskedni? Holló nem engedelmeskedik.\"\n\n#. Key:\tFFB203D94B0A5C22BA29B68A1A8A740F\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_9.SpeechSequence(8).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_9.SpeechSequence(8).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Farewell then.\"\nmsgstr \"Akkor viszlát.\"\n\n#. Key:\t0C459FB64505D02011822A9EDFA8FCA4\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/AGStatue.AGStatue:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/AGStatue.AGStatue:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_AGStatue\"\nmsgid \"'We are the elite of the Runic Realm. Our wisdom is great, our magic is strong.'\"\nmsgstr \"\\\"Mi vagyunk a Rúna Rend legkiválóbbjai. Bölcsességünk határtalan, varázserőnk hatalmas.\\\"\"\n\n#. Key:\t7DB580C64E9B33FD525DDF986BD5E4A4\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/AGStatue.AGStatue:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/AGStatue.AGStatue:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_AGStatue\"\nmsgid \"Looks like he was wrong...\"\nmsgstr \"Aha, persze...\"\n\n#. Key:\tAFBD86084D8E6EBDF240998FA98D184D\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/AGStatue.AGStatue:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/AGStatue.AGStatue:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_AGStatue\"\nmsgid \"'We are Ceruleans! We do not escape!'\"\nmsgstr \"\\\"Mélykékiek vagyunk! Mi nem menekülünk!\\\"\"\n\n#. Key:\tC2CC8EE94954A8DC42222FBB28A7656E\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/AGStatue.AGStatue:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/AGStatue.AGStatue:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_AGStatue\"\nmsgid \"'Citizens of Cerulean! Do not join the poor of Grey Gate!'\"\nmsgstr \"\\\"Mélykék lakói! Ne csatlakozzatok a Kék Kapu csőcselékéhez!\\\"\"\n\n#. Key:\tD909E4A34387B448378464BDE8292B4D\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/AGStatue.AGStatue:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/AGStatue.AGStatue:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_AGStatue\"\nmsgid \"'Ruin can’t harm us!'\"\nmsgstr \"\\\"A Fertőzésnek nincs ereje felettünk.\\\"\"\n\n#. Key:\t3CE243AA4AFB12B37239608C66537764\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/BeforeBoss.BeforeBoss:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/BeforeBoss.BeforeBoss:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_BeforeBoss\"\nmsgid \"Maybe you should talk to the gnome or the Keeper.\"\nmsgstr \"Beszélned kéne a Gnómmal vagy a Kapuőrrel.\"\n\n#. Key:\t4F35F4834FBCC04C218A879123EF8706\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/BeforeBoss.BeforeBoss:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/BeforeBoss.BeforeBoss:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_BeforeBoss\"\nmsgid \"Using the portals here one could get into any part of the World in no time.\"\nmsgstr \"Ezek az Átjárók a Világ bármely pontjára elvitték az embert semmi perc alatt.\"\n\n#. Key:\t62EDCB724DAC5317C72B99AEB9904F4E\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/BeforeBoss.BeforeBoss:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/BeforeBoss.BeforeBoss:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_BeforeBoss\"\nmsgid \"This place was the base of the formal Ruined Realm.\"\nmsgstr \"Ez volt az egykori Rúna Rend központja.\"\n\n#. Key:\tCB8B47F74583A48529A353B97C4909B9\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/BeforeBoss.BeforeBoss:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/BeforeBoss.BeforeBoss:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_BeforeBoss\"\nmsgid \"I hope at least some of the portals still work.\"\nmsgstr \"Remélem legalább néhány Átjáró működik még.\"\n\n#. Key:\t2A9CE8714E7E1ABC9365E5A1E2CE2EC8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/BossArmourWrath.BossArmourWrath:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Chapter2/BossArmourWrath.BossArmourWrath:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_BossArmourWrath\"\nmsgid \"Keep away from my artefact little thief or I will crush you!\"\nmsgstr \"Tartsd távol az enyves kezeid a dolgaimtól vagy porrá zúzlak!\"\n\n#. Key:\t3F79029C410F4CC3B41548A26A7D69EB\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/BossArmourWrath.BossArmourWrath:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Chapter2/BossArmourWrath.BossArmourWrath:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_BossArmourWrath\"\nmsgid \"Listen, I really need that. What if I give you something instead?\"\nmsgstr \"Figyelj, nagy szükségem lenne rá. Nem cserélhetnénk el valamire?\"\n\n#. Key:\t451F1E844E29E674899BD3BEFBC17380\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/BossArmourWrath.BossArmourWrath:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter2/BossArmourWrath.BossArmourWrath:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_BossArmourWrath\"\nmsgid \"I’m here for the artefact... could you give it to me?\"\nmsgstr \"A Varázstárgyért jöttem... van bármi esélye, hogy nekem adod?\"\n\n#. Key:\tAC11C22040909F7F4DD1518AD5C14AFA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/BossArmourWrath.BossArmourWrath:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Chapter2/BossArmourWrath.BossArmourWrath:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_BossArmourWrath\"\nmsgid \"That is mine!\"\nmsgstr \"Az az enyém!\"\n\n#. Key:\tD30E184A406B5B1EFB87F3845CE82664\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/BossArmourWrath.BossArmourWrath:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter2/BossArmourWrath.BossArmourWrath:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_BossArmourWrath\"\nmsgid \"Have you come to worship my perfection?\"\nmsgstr \"Azért jöttél, hogy megcsodált Tökéletességemet?\"\n\n#. Key:\tF626219F434EECD05727BC9FAB5CEB76\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/BossArmourWrath.BossArmourWrath:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Chapter2/BossArmourWrath.BossArmourWrath:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_BossArmourWrath\"\nmsgid \"Damn you and your perfection!\"\nmsgstr \"Pokolba veled és a Tökéletességeddel!\"\n\n#. Key:\t2892C4AB4DACCAF48565619948DCA122\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/BossDwarvenStatue.BossDwarvenStatue:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter2/BossDwarvenStatue.BossDwarvenStatue:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_BossDwarvenStatue\"\nmsgid \"I am all right! I am still keeping it back!\"\nmsgstr \"Minden rendben! Visszatartom!\"\n\n#. Key:\t378D26B144B4B17F23F788B56F714118\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/BossDwarvenStatue.BossDwarvenStatue:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Chapter2/BossDwarvenStatue.BossDwarvenStatue:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_BossDwarvenStatue\"\nmsgid \"I am looking for an artefact...\"\nmsgstr \"Egy Varázstárgyat keresek...\"\n\n#. Key:\t3956257F405EC80CE4547FBE57C53A11\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/BossDwarvenStatue.BossDwarvenStatue:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Chapter2/BossDwarvenStatue.BossDwarvenStatue:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_BossDwarvenStatue\"\nmsgid \"Do you...\"\nmsgstr \"Nálad...\"\n\n#. Key:\t946CFCCE4CA505C7C4039A9FF196A35C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/BossDwarvenStatue.BossDwarvenStatue:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter2/BossDwarvenStatue.BossDwarvenStatue:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_BossDwarvenStatue\"\nmsgid \"Have the sculptors sent you?\"\nmsgstr \"A Szobrászok küldtek?\"\n\n#. Key:\tA30FB80548251020E4AD859A928AB6B5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/BossDwarvenStatue.BossDwarvenStatue:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Chapter2/BossDwarvenStatue.BossDwarvenStatue:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_BossDwarvenStatue\"\nmsgid \"Go away! I hold it back!\"\nmsgstr \"El innen! Még visszatartom!\"\n\n#. Key:\tAC5220964331387202C55584104246C2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/BossDwarvenStatue.BossDwarvenStatue:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Chapter2/BossDwarvenStatue.BossDwarvenStatue:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_BossDwarvenStatue\"\nmsgid \"I have a bad feeling about this...\"\nmsgstr \"Rossz előérzetem van...\"\n\n#. Key:\tE05C384043C6F8407BDA2D97A1D64F96\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/BossDwarvenStatue.BossDwarvenStatue:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Chapter2/BossDwarvenStatue.BossDwarvenStatue:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_BossDwarvenStatue\"\nmsgid \"He has one of the artefacts. You need to get it somehow.\"\nmsgstr \"Nála van az egyik Varázstárgy. Valahogy meg kell szerezned.\"\n\n#. Key:\tF9B8F4E9413785B5F59DD88CBF8D56CC\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/BossDwarvenStatue.BossDwarvenStatue:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Chapter2/BossDwarvenStatue.BossDwarvenStatue:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_BossDwarvenStatue\"\nmsgid \"Don’t come any closer! I’m still fine!\"\nmsgstr \"Ne közelíts! Még rendben vagyok!\"\n\n#. Key:\t49D7B5DA484C712573AE84B3A2609541\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/BossFallenDruid.BossFallenDruid:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Chapter2/BossFallenDruid.BossFallenDruid:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_BossFallenDruid\"\nmsgid \"You will never lay your hand on anything in this place!\"\nmsgstr \"Innen semmi nem lesz a tiéd!\"\n\n#. Key:\t9642DD9241E67544571A5EABA9EBC42B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/BossFallenDruid.BossFallenDruid:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter2/BossFallenDruid.BossFallenDruid:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_BossFallenDruid\"\nmsgid \"Actually I’m about to leave but I need the artefact first.\"\nmsgstr \"Nem akarok itt maradni, de szükségem van a Varázstárgyra.\"\n\n#. Key:\t9A2BE08D4010C4D2425F96BA17A60936\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/BossFallenDruid.BossFallenDruid:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Chapter2/BossFallenDruid.BossFallenDruid:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_BossFallenDruid\"\nmsgid \"I shall purge my forest from your kind! To hell with you creature!\"\nmsgstr \"Megtisztítom az erdeimet a fajtádtól! A Pokolba veled, démonfajzat!\"\n\n#. Key:\tFC4A1C9748C31BD2AA2E4F93E5D56AF8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/BossFallenDruid.BossFallenDruid:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter2/BossFallenDruid.BossFallenDruid:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_BossFallenDruid\"\nmsgid \"Stay away from my sacred forests creature of Ruin!\"\nmsgstr \"Tartsd távol magad az erdeimtől, Fertőzés teremtménye!\"\n\n#. Key:\t3F4302BF46D1F9EA241446A796CE6AA5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Fishy.C3Fishy:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter3/C3Fishy.C3Fishy:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_C3Fishy\"\nmsgid \"Fishy will miss home.\"\nmsgstr \"Halinak honvágya lesz.\"\n\n#. Key:\t52063C724F858E16B1E9B482E064B3FC\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Fishy.C3Fishy:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/Chapter3/C3Fishy.C3Fishy:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_C3Fishy\"\nmsgid \"Raven will try to take us into the Human Realm.\"\nmsgstr \"Holló át akar vinni minket az Ember Világba.\"\n\n#. Key:\tBC79FC4E44CCD0BE44BAAAA5ED304C9D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3GateKeeper.C3GateKeeper:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Chapter3/C3GateKeeper.C3GateKeeper:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_C3GateKeeper\"\nmsgid \"I hope you will find us Worthy.\"\nmsgstr \"Remélem Méltónak találtatunk.\"\n\n#. Key:\tDD8DEA6B4E1D6AABEB6B0483614A41BB\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3GateKeeper.C3GateKeeper:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter3/C3GateKeeper.C3GateKeeper:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_C3GateKeeper\"\nmsgid \"Welcome, my young Lord!\"\nmsgstr \"Üdvözletem, fiatal úr!\"\n\n#. Key:\tFCC28D1C4A19B1964301B388625A722F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3GateKeeper.C3GateKeeper:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter3/C3GateKeeper.C3GateKeeper:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_C3GateKeeper\"\nmsgid \"I heard this time you shall open a Gate for us.\"\nmsgstr \"Úgy hallom, ez alkalommal ön nyit Kaput a mi részünkre.\"\n\n#. Key:\t1F96C2364594513AB8DF00A8C11ADB2C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Gnory.C3Gnory:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Chapter3/C3Gnory.C3Gnory:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_C3Gnory\"\nmsgid \"I don’t want anything bad for business in the new Realm.\"\nmsgstr \"Nem akarnék tisztességtelen, uzsorás kereskedőket az új Világban.\"\n\n#. Key:\t24FA4B6840C3EEF0A9D418AED7C900A5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Gnory.C3Gnory:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/Chapter3/C3Gnory.C3Gnory:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_C3Gnory\"\nmsgid \"Eh, you again?\"\nmsgstr \"He, megint te?\"\n\n#. Key:\t5CA8478D46ED1ADF6F0B5E82F1035ADE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Gnory.C3Gnory:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter3/C3Gnory.C3Gnory:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_C3Gnory\"\nmsgid \"A whole new World awaits for me and my shop.\"\nmsgstr \"Egy egész új Világ vár rám és a boltomra.\"\n\n#. Key:\tA406AFAD47000D9338C978B2EB16A86F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Gnory.C3Gnory:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Chapter3/C3Gnory.C3Gnory:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_C3Gnory\"\nmsgid \"If you can arrange it I would be more happy if we could leave Lory here.\"\nmsgstr \"Egy apróság: ha esetleg el tudnád intézni, hogy Lory itt maradjon...\"\n\n#. Key:\tBA4D0C244931E6431FA17CA2257BDDE1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Gnory.C3Gnory:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter3/C3Gnory.C3Gnory:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_C3Gnory\"\nmsgid \"What a new opportunity! I don’t care about dwarves anymore.\"\nmsgstr \"Micsoda lehetőség! Kit érdekelnek már a Törpök?\"\n\n#. Key:\t071AC5EE4AC65F5BE3CB61B64DE9E7FE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3GolemMaker.C3GolemMaker:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter3/C3GolemMaker.C3GolemMaker:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_C3GolemMaker\"\nmsgid \"I have to admit Ruin will win in the end.\"\nmsgstr \"Be kell látnom, végül a Fertőzés nyert.\"\n\n#. Key:\t18398E3A4C6E72AAE25F24A14596ECD8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3GolemMaker.C3GolemMaker:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter3/C3GolemMaker.C3GolemMaker:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_C3GolemMaker\"\nmsgid \"I fought Ruin for hundreds of years.\"\nmsgstr \"Évszázadokon át a Fertőzés ellen küzdöttem.\"\n\n#. Key:\t7800D3B64054BCE4A89E8E8E6265776B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3GolemMaker.C3GolemMaker:DlgNode_Speech_117.Text\n#: /Game/SO/Dialogues/Chapter3/C3GolemMaker.C3GolemMaker:DlgNode_Speech_117.Text\nmsgctxt \"Dialogue_C3GolemMaker\"\nmsgid \"I have a bad feeling about this all...\"\nmsgstr \"Rossz érzésem van az egésszel kapcsolatban...\"\n\n#. Key:\t334B64FA460A74FD99B4F3B9E4BE9E5A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3KoboldChef.C3KoboldChef:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter3/C3KoboldChef.C3KoboldChef:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_C3KoboldChef\"\nmsgid \"So it will be ready anytime now.\"\nmsgstr \"Szóval lassan készen kell lennie.\"\n\n#. Key:\t5B8874F14160F55182A93EBCF5680173\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3KoboldChef.C3KoboldChef:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter3/C3KoboldChef.C3KoboldChef:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_C3KoboldChef\"\nmsgid \"According to the recipe I need to swirl the ingredients until the end of the World.\"\nmsgstr \"A recept szerint a világ végezetéig kell kavargatni az összetevőket.\"\n\n#. Key:\t7DB6ED344E211B7A028C27BFB72750B1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3KoboldChef.C3KoboldChef:DlgNode_Speech_33.Text\n#: /Game/SO/Dialogues/Chapter3/C3KoboldChef.C3KoboldChef:DlgNode_Speech_33.Text\nmsgctxt \"Dialogue_C3KoboldChef\"\nmsgid \"This is a special soup.\"\nmsgstr \"Ez egy különleges leves.\"\n\n#. Key:\t7D583DB14783DCF7EEE294920F9A1D61\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Lory.C3Lory:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Chapter3/C3Lory.C3Lory:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_C3Lory\"\nmsgid \"Without paying a single gold coin. How sad.\"\nmsgstr \"Anélkül, hogy egy árva garast fizetett volna érte. Milyen szomorú.\"\n\n#. Key:\t8A26C9B24B810A94FED159B0D69D70D6\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Lory.C3Lory:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter3/C3Lory.C3Lory:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_C3Lory\"\nmsgid \"Hi, my dear Ball!\"\nmsgstr \"Szia, kicsikém!\"\n\n#. Key:\t8CF637DC4D66B9BFBE098DA3EA434F27\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Lory.C3Lory:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/Chapter3/C3Lory.C3Lory:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_C3Lory\"\nmsgid \"Unfortunately I can't give you anything in return.\"\nmsgstr \"Sajnos semmit nem tudok adni cserébe.\"\n\n#. Key:\t90A13FAC4AA90E98DBEFFA9BB8DEDE80\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Lory.C3Lory:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Chapter3/C3Lory.C3Lory:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_C3Lory\"\nmsgid \"Oh, thank you! Books always matter.\"\nmsgstr \"Óh, köszönöm! A könyvek mindig jól jönnek.\"\n\n#. Key:\t9C6E843645F86F1E39E6458952C7F283\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Lory.C3Lory:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Chapter3/C3Lory.C3Lory:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_C3Lory\"\nmsgid \"I hope I can open a new shop in the Human Realm.\"\nmsgstr \"Remélem tudok majd új üzletet nyitni az Ember Világban.\"\n\n#. Key:\tAE354F2C458C144C2825028174F91CCE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Lory.C3Lory:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Chapter3/C3Lory.C3Lory:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_C3Lory\"\nmsgid \"I don't know if it still matters but I have these books for you.\"\nmsgstr \"Lehet már nincs nagy jelentősége, de van pár könyvem a számodra.\"\n\n#. Key:\tB5BCB95E43DB3854273F6AAA4067FC55\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Lory.C3Lory:DlgNode_Speech_42.Text\n#: /Game/SO/Dialogues/Chapter3/C3Lory.C3Lory:DlgNode_Speech_42.Text\nmsgctxt \"Dialogue_C3Lory\"\nmsgid \"Unfortunately I have nothing at the store right now. Ha-ha...\"\nmsgstr \"Sajnos teljesen kifogytam az áruimból. Ha-ha...\"\n\n#. Key:\tC0E84ACD40CB002E0C30A289E0554EE9\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Lory.C3Lory:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/Chapter3/C3Lory.C3Lory:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_C3Lory\"\nmsgid \"No problem.\"\nmsgstr \"Semmi gond.\"\n\n#. Key:\tFEFF93C84CC75D277EC221AD22338A75\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Lory.C3Lory:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter3/C3Lory.C3Lory:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_C3Lory\"\nmsgid \"Ruin took all my wares.\"\nmsgstr \"A Fertőzés mindenemet elvitte.\"\n\n#. Key:\t090F12534A0096B8D4D7D9A5CDC9B3B5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_25.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_25.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Well I guess you don’t have many customer.\"\nmsgstr \"Gondolom nincs túl sok vásárlód.\"\n\n#. Key:\t10A1CF314EC02954FF38F1989C61DEE9\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"That’s only one man! I need three!\"\nmsgstr \"Ez csak egy haver! Három kéne!\"\n\n#. Key:\t127DE2E049C91112F814C69348954F99\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_7.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_7.Children(1).Children.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Buy name\"\nmsgstr \"Nevet veszek\"\n\n#. Key:\t1AF2DDE74542524EEF19CA9567CFBDAF\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_58.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_58.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"{name}? It still sounds a bit weird, but I think I might like it.\"\nmsgstr \"{name}? Furcsán hangzik, de idővel biztos megszeretem majd.\"\n\n#. Key:\t1C411E31405F157B2465229ECE66F4E0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_31.Children(2).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_31.Children(2).Children.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Wanderer\"\nmsgstr \"Vándorló\"\n\n#. Key:\t1ED747BD43E40D4096809696951517EE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"A special offer for ya! Give me three Blue Gems and I’ll give ya the key!\"\nmsgstr \"Speckó ajánlat csak neked, haver! Három Kék Kő, és tied a kulcs!\"\n\n#. Key:\t20B146B94D2E2FCE5E0C48BC64F7A1D6\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_19.Text\n#. Key:\t41E21D044B53E16C1BA8D7B720D84B50\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_36.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_36.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Sure man!\"\nmsgstr \"Naná, haver!\"\n\n#. Key:\t2BDF52EF43CA5FBB145EC1BA0014FC27\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_7.Children(3).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_7.Children(3).Children.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Who are you?\"\nmsgstr \"Ki vagy te?\"\n\n#. Key:\t2DF772F14AAA9780F4D9E397DE723665\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_32.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_32.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Fearsome! At least for what you will destroy.\"\nmsgstr \"Félelmetes! Legalábbis annak, amit le akarsz pusztítani.\"\n\n#. Key:\t312F26294ECE4F618D88BE84DE7A2F9A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_31.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_31.Children(1).Children.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Destroyer\"\nmsgstr \"Pusztító\"\n\n#. Key:\t328C9911427AA19B40B297ACC9D16447\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_31.Children(3).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_31.Children(3).Children.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Don't buy\"\nmsgstr \"Nem veszek\"\n\n#. Key:\t32D3F53746DD2801BC1B04AF1C1753DD\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Don’t turn around I’m talking to ya big guy! Down here on the wood!\"\nmsgstr \"Ne hátra pillantgass, itt vagyok előtted, nagyfiú! Lent a fatuskón!\"\n\n#. Key:\t576A3CE049331518C8D1F196E6CC382C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Back on topic: will ya buy something?\"\nmsgstr \"Kérdésre visszatérve: veszel valamit?\"\n\n#. Key:\t5C1E07DF4B2D135102D6B09D3A04A726\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"C’mon man! Don’t just stand there tell me what ya want!\"\nmsgstr \"Gyerünk, haver! Ne ácsorogj némán, mond már, mit akarsz!\"\n\n#. Key:\t62AA5DD54A8447F7A277B194B05FB74D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_23.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_23.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"What’s wrong with ya man?\"\nmsgstr \"Mi bajod, haver?\"\n\n#. Key:\t6E13F5544C66EDB0CFE764A0F52269E1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_27.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_27.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"You know transporting breadcrumbs, marching onto various directions, the usual things.\"\nmsgstr \"Hát tudod, a szokásos. Kiflicsücskök hurcolása, menetelés mindenfelé, ilyenek.\"\n\n#. Key:\t6F3C17894E694FC6215871B167087908\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_24.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_24.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"I’m Merch Ant doin’ Microtransactions. I’ve just told ya.\"\nmsgstr \"Han, Gyakori Termékek Árusa vagyok. Már mondtam, haver.\"\n\n#. Key:\t7169B2FA40F5F5F328D2A6B9D53D58C8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_7.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_7.Children(0).Children.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Trade\"\nmsgstr \"Kereskedek\"\n\n#. Key:\t7B41C105431C54F2FDDEA6AA9A0E1C1A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Er... so who are you and what are you doing here?\"\nmsgstr \"Öö... ki vagy tulajdonképpen, és mit csinálsz itt?\"\n\n#. Key:\t8718A8F54D5722F666D83F8067476622\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"There is an iron door which blocks the path to the tower. Do you have something which opens it?\"\nmsgstr \"A toronyba vezető utat egy vaskapu zárja. Van nálad valami, amivel ki lehet nyitni?\"\n\n#. Key:\t889B39EC4BC170A2BF493380947116A7\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Sure man! Microtransactions always work!\"\nmsgstr \"Naná, haver! A Mikrotranzakció mindig működik.\"\n\n#. Key:\t9157AE9644A4A3B2C97F7482932160D2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"No man, we agreed on three!\"\nmsgstr \"Ne már haver! Háromról volt szó!\"\n\n#. Key:\t9283F6B1447C6992FE355289F3337472\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_7.Children(2).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_7.Children(2).Children.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Gate\"\nmsgstr \"Kapu\"\n\n#. Key:\t99C44AA849A384C7941D3DAE1D6A3EFF\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Here is your Gem!\"\nmsgstr \"Itt van a Drágaköved!\"\n\n#. Key:\t9CA7941F42ABFAE5660895AF886CD62C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_31.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_31.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Sure man! I have some really cool ones for sale!\"\nmsgstr \"Naná, haver! Van pár igazán menő eladó nevem!\"\n\n#. Key:\tA3C6B03E404B1C039EF1C98C8E28AE22\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Show me what you've got for sale!\"\nmsgstr \"Mutasd, mit árulsz!\"\n\n#. Key:\tABE279924E0641DA18E9708F35F4500A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_29.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_29.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"I’ve got to go.\"\nmsgstr \"Mennem kell.\"\n\n#. Key:\tAF1FECDB402777D850B819B934DF851D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_34.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_34.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Ah, never mind, here you go!\"\nmsgstr \"Mindegy, legyen ahogy akarod!\"\n\n#. Key:\tB19FA067432CE0273A3652AA9A32F2DF\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Don’t be surprised!\"\nmsgstr \"Ez most meg fog lepni!\"\n\n#. Key:\tB5F8E17E4712A37EF1C227AA7E99DBC8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Aren’t two Gems enough for you?\"\nmsgstr \"Két Drágakő nem elég?\"\n\n#. Key:\tBC5DEE9E4D39238451D1A2B9F8B20815\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_26.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_26.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Okey, okey! I have to admit I also do some regular ant work from time to time.\"\nmsgstr \"Oké, oké! Bevallom, részidőben melózok rendes hangya munkákban is.\"\n\n#. Key:\tBD7096344553E098E4A29787E1386B4A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Are you sure the key works?\"\nmsgstr \"Biztos, hogy jó lesz a kulcs?\"\n\n#. Key:\tC6A384624B53D808D62CB885A6573150\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Was nice to deal with ya!\"\nmsgstr \"Mindig öröm veled üzletelni, haver!\"\n\n#. Key:\tC737154043396F726CF6B2814991B38D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_35.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_35.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"I've changed my mind. I'm fine with my current name.\"\nmsgstr \"Meggondoltam magam. Jó lesz a mostani nevem.\"\n\n#. Key:\tC94F33504E68364DE1BAA48FC0CA85E5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_7.Children(5).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_7.Children(5).Children.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Leave\"\nmsgstr \"Távozok\"\n\n#. Key:\tCDA5A0164F5FDD87D0F4C0B10A5ED5DA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"I did my part. Give me the key!\"\nmsgstr \"Megkaptad, amit akartál. Add ide a kulcsot!\"\n\n#. Key:\tD1B1D33742EAA6A9BCDC42B5EA72EB59\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_31.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_31.Children(0).Children.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Saviour\"\nmsgstr \"Megmentő\"\n\n#. Key:\tD1E444764EDA1457DD7427A0EA75C65F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_7.Children(4).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_7.Children(4).Children.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Blue Gem\"\nmsgstr \"Kék Drágakő\"\n\n#. Key:\tD65AD8854E1A5BC2D37C208357BACDE3\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Due to my size!\"\nmsgstr \"Méretemből adódóan!\"\n\n#. Key:\tDDEB5C4B4A180E85B1D711815B4D32F3\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Can I buy a name from you?\"\nmsgstr \"Vehetek nevet tőled?\"\n\n#. Key:\tDE3F40384473EC97950CDDB43AFE439E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Easy man! Here ya go!\"\nmsgstr \"Nyugi, haver! Tessék!\"\n\n#. Key:\tDEED1AF94E4BC154ED98A8B951AF0673\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Hey again!\"\nmsgstr \"Szeva, haver!\"\n\n#. Key:\tE2C88DA74DA8B5935E15CC9FD337C307\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_39.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_39.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Come on man! You can't just wander around!\"\nmsgstr \"Eredj már, haver! Minek vándorolnál csak úgy?\"\n\n#. Key:\tEA08DE334C7D8631989D159FB841367D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_30.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_30.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"See ya man!\"\nmsgstr \"Cső, haver!\"\n\n#. Key:\tEAB8C1DE4B07AD7EAF0A4B819E4522C6\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Hey there!\"\nmsgstr \"Hé, haver!\"\n\n#. Key:\tF780C72E4DDD9D9189C900836D4F7DBD\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"I’m Merch Ant, I deal with microtransactions.\"\nmsgstr \"Han, Gyakori Termékek Árusa vagyok, Mikrotranzakciókkal foglalkozom.\"\n\n#. Key:\tFED676B745409B7095EBB2994E581817\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_57.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_57.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"That's cool man. Though I wonder who will you save?\"\nmsgstr \"Királyság, haver! Kit akarsz megmenteni?\"\n\n#. Key:\t04F1EF4B4AFDE5759A25A1A4922E9EA8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"Yet they could do nothing.\"\nmsgstr \"Mégsem jutottak semmire.\"\n\n#. Key:\t05E7A2224316FEED1A2CEB8AEFC46B41\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"We can’t let everyone die here.\"\nmsgstr \"Nem hagyhatunk mindenkit itt pusztulni.\"\n\n#. Key:\t078A48C347E2B23E79C495BA42BC7B6D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_25.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_25.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"We’ll have time to find a cure.\"\nmsgstr \"Lesz idő megoldást találni.\"\n\n#. Key:\t0A857169478EC6929EFCA3B390C394DA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"Prepare for your last travel in the Ruined Realm. Head to the north from where the wind is blowing!\"\nmsgstr \"Készen állsz utolsó utadra a Fertőzött Földön? Tarts mindig északnak, amerről a szél fúj!\"\n\n#. Key:\t1D8B6C81428A6D9F4C29AE9AD26206F2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_29.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_29.Children(1).Children.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"Can't leave them\"\nmsgstr \"Nem hagyhatom itt őket\"\n\n#. Key:\t217F39F14762862B6EA18484EA74E987\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_37.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_37.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"I wish you better luck this time!\"\nmsgstr \"Remélem ezúttal több szerencséd lesz!\"\n\n#. Key:\t22E17F2F4CFDD0CEB67AB0A91D872B3F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_4.Children(2).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_4.Children(2).Children.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"Not my problem\"\nmsgstr \"Nem az én gondom\"\n\n#. Key:\t2685CE674BB3B11FD3CB3AA2460CE60A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"There is nothing we can do for this World.\"\nmsgstr \"Ezért a Világért már semmit sem tehetünk.\"\n\n#. Key:\t26A2075F407FF43E1AF8B6B38E9C4AEE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"Farewell!\"\nmsgstr \"Ég veled!\"\n\n#. Key:\t2F7D7C46418E8E049493839A26DBB10E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"I’m ready to sacrifice myself but I feel sorrow for this world.\"\nmsgstr \"Én kész vagyok feláldozni magam, de sajnálom, hogy egy egész világnak vesznie kell.\"\n\n#. Key:\t39172C7641A5973A4B5D8480EBDD2589\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_34.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_34.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"Back already?\"\nmsgstr \"Máris itt?\"\n\n#. Key:\t3D21436E48DA0DF9C3ACA3B11001B17C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"Yet, we need to save those we can.\"\nmsgstr \"Mégis, azokkal kell foglalkoznunk, akiket meg tudunk menteni.\"\n\n#. Key:\t43B780AA4934FBE35679BFB3C1C92D56\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"Farewell Wanderer!\"\nmsgstr \"Ég veled, Vándor!\"\n\n#. Key:\t4AD4171F4A1832148034BAA736FC587E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"Head to the north from where the wind is blowing!\"\nmsgstr \"Tarts északnak, amerről a szél fúj!\"\n\n#. Key:\t4E65707F497B4B35E873138DDBF7B879\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"I will go home and you will solve your problems on your own.\"\nmsgstr \"Én hazamegyek, te pedig megoldod magadnak a problémáidat.\"\n\n#. Key:\t4EDA1AEF471537F758DD0491A7140073\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"This is none of my business.\"\nmsgstr \"Ez nem az én dolgom.\"\n\n#. Key:\t58246AA446D982E55E53EAB34FFF6A81\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_34.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_34.Children(1).Children.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"Leave\"\nmsgstr \"Távozok\"\n\n#. Key:\t67CB3C99468EEA39C4C18C8B0C28AFEA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_26.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_26.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"You? You mean the Wizard Council?\"\nmsgstr \"Komolyan úgy gondolod, hogy a Varázsló Tanács bármikor is fog megoldást találni?\"\n\n#. Key:\t743DD4C048F8CD08A49805975183B54D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"I’m sorry it ends like this, Wanderer.\"\nmsgstr \"Sajnálom, hogy így kell végződnie.\"\n\n#. Key:\t7AB88DE549E213B71759699AD51CFD4C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"I’m really proud of you little spirit. This wasn’t an easy decision for me either.\"\nmsgstr \"Büszke vagyok rád, kicsi szellem. Ez nekem sem volt könnyű döntés.\"\n\n#. Key:\t7DCF30E74F8C0F29DA4E668CE3435E89\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"Wizard can’t hear us here, we can talk freely.\"\nmsgstr \"Varázsló itt nem hallhat minket, beszélhetünk.\"\n\n#. Key:\t8177A07D41AE7778BB4839AED3FEDACF\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_23.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_23.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"Do you know what you are risking?\"\nmsgstr \"Tisztában vagy vele, mit teszel kockára?\"\n\n#. Key:\t876B4752465406828E27A88C282EA5CD\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"From here I can teleport you close to the place where the Wizard will be able to get you out.\"\nmsgstr \"Innen át tudlak küldeni arra a helyre, ahonnan Varázsló már vissza tud vinni.\"\n\n#. Key:\t9255CAD841A0C5B4DF3F4D8C5F5516B1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"So many great things will perish. So many...\"\nmsgstr \"Oly sok nagyszerű dolog lesz oda, oly sok...\"\n\n#. Key:\t95EDE8FB4CEC490381EBD990C7277009\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_38.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_38.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"Take your time!\"\nmsgstr \"Csak nyugodtan!\"\n\n#. Key:\t9D46888D43C665A29506BF9CBB62F81D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_35.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_35.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"Let me try again!\"\nmsgstr \"Hadd próbáljam meg újra!\"\n\n#. Key:\tA1CF649542AAE3D8945327B9502E2E78\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_29.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_29.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"What chance do the humans have?\"\nmsgstr \"Mennyi esélyük van az embereknek?\"\n\n#. Key:\tA60B94F64A0D02EA0DA9419741ED84F4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_36.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_36.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"I just need some rest.\"\nmsgstr \"Picit pihennem kell.\"\n\n#. Key:\tA651056C4D344D685FEB53B2C3795966\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_34.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_34.Children(0).Children.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"Retry\"\nmsgstr \"Újra\"\n\n#. Key:\tAAE7046349DBE5359097179A42FDA255\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_33.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_33.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"This one was enough.\"\nmsgstr \"Ez az egy pont elég volt.\"\n\n#. Key:\tB17D67194997EFAEF6B8678DB05894FD\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"Let’s get them out first and face Ruin after.\"\nmsgstr \"Vigyük ki őket, és nézzünk szembe a Fertőzéssel utána.\"\n\n#. Key:\tB4E31022471B52056F7B5AA3BB322700\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"How can I get to the Wizard’s tower?\"\nmsgstr \"Hogy jutok el Varázsló Tornyába?\"\n\n#. Key:\tB6C99FC54E2A347994473EBF52B57EBD\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_4.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_4.Children(1).Children.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"Raven’s plan\"\nmsgstr \"Holló terve\"\n\n#. Key:\tB985955E4FC6D81FBD38D79ADE68BF1F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_4.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_4.Children(0).Children.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"Separate Worlds\"\nmsgstr \"Világok szétválasztása\"\n\n#. Key:\tC4BABAED4C790EDDF6AAF7A0D4CFA79B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_27.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_27.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"When Ruin started in the Runic Realm they had hundreds of Scientists who studied the force which made Ruin.\"\nmsgstr \"Amikor a Fertőzés kezdődött, a Rúna Rendnek több száz jól képzett tudósa kereste a Fertőzés ellenszerét.\"\n\n#. Key:\tCB779F524992B29781C4778ED6E224A7\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_30.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_30.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"I just can’t leave them to die here...\"\nmsgstr \"Nem hagyhatom, hogy mind itt pusztuljanak...\"\n\n#. Key:\tCDA7A09249E96A52B2FA3CA471D6C4B3\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"This is the end of the path where we last meet.\"\nmsgstr \"Ez az út vége, ahol utoljára találkozunk.\"\n\n#. Key:\tCF238FAA4941848AF7071A866B75B6EC\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"You are right. The only way to stop Ruin is to lock the Ruined Realm forever.\"\nmsgstr \"Igazad van. Csak úgy állíthatjuk meg a Fertőzést, ha szétválasztjuk a Világokat.\"\n\n#. Key:\tD1F3B7324351B25E8C55679BAC3BF1E0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"Have you made your decision?\"\nmsgstr \"Sikerült döntenéd?\"\n\n#. Key:\tE164446B4944B4CAC8E5C1BF82A722A2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_24.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_24.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"If you bring infected people into the Human Realm Ruin will consume them.\"\nmsgstr \"Ha fertőzött embereket hozol az Ember Világba, a Fertőzés azt is elemészti.\"\n\n#. Key:\tE39531DE4350D6D86DF469839F1906E7\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_31.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_31.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"It’s your decision, Wanderer. I understand.\"\nmsgstr \"Ez a te döntésed, Vándor. Megértem.\"\n\n#. Key:\tE46912D04BE67D3E2B0794BB632AEE98\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_32.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_32.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"I’ll stay here. I won’t be able to watch another World dying...\"\nmsgstr \"Én itt maradok. Nem fogom még egyszer végig nézni, hogy pusztul el egy egész világ...\"\n\n#. Key:\tF70B765F44DB17E1C6978D9D8652C911\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"Hello, little Wanderer!\"\nmsgstr \"Szervusz, kicsi Vándor!\"\n\n#. Key:\tFE709EDF4482B6FA7408DE99D95E8577\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_29.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_29.Children(0).Children.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"You are right\"\nmsgstr \"Igazad van\"\n\n#. Key:\tFE77F7964851F202F5C91396A4C7228E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"I’ll take you to the place where you can leave this Realm.\"\nmsgstr \"Elviszlek a helyre, ahol elhagyhatod ezt a Világot.\"\n\n#. Key:\t0B886754483D1C215FBEF5B7D19AF6A6\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"I know you have summoned a Spirit of the Unknown world. You were a fool to think you can get away with this.\"\nmsgstr \"Tudom, hogy megidéztél egy szellemet az Ismeretlen Világból. Ostobaság volt azt hinned, hogy észrevétlen megúszod.\"\n\n#. Key:\t0BDF59D34A9E53B7FD5FD18F8E46F72F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"Argh! All right, here you go...\"\nmsgstr \"Argh! Rendben, tessék...\"\n\n#. Key:\t2A6837CA471604FCDD180E85BD23D676\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"Krrr... Raven gives you magic which will make you fly like a Raven.\"\nmsgstr \"Krrr... Holló ad neked egy varázslatot, amitől úgy repülsz majd, mint egy Holló.\"\n\n#. Key:\t2D8209F74AC3C9E042717A9FB108C051\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"Come on, go and try it!\"\nmsgstr \"Gyerünk, menj! Próbáld ki!\"\n\n#. Key:\t39B1763740E9BB9B495A7997920A3401\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_12.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_12.Children(0).Children.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"How?\"\nmsgstr \"Hogyan?\"\n\n#. Key:\t3AE553D14FFB88C0518679B86691D508\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"Call your master little spirit, I have words with him.\"\nmsgstr \"Szólj a Mesterednek kicsi szellem, beszédem van vele.\"\n\n#. Key:\t3E02111D40F21C2C8C13F08729B4CDBC\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"I don’t know about any rule forbidding that...\"\nmsgstr \"Nem tudok semmilyen szabályról, ami megtiltaná, hogy...\"\n\n#. Key:\t453610F144D8CEB42138F0BB35B9692A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"Wait Scholar! Please give me a few more days!\"\nmsgstr \"Várj Tudós! Csak néhány napot kérek!\"\n\n#. Key:\t4F0C40114C4DD1B345CF909E94F99D60\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"Why should I ask that?\"\nmsgstr \"Miért kérdezném?\"\n\n#. Key:\t56F0D93740AB7555FF9370879D774842\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"I have no doubt how the Council will react.\"\nmsgstr \"Semmi kétségem afelől, mit fog gondolni erről a Tanács.\"\n\n#. Key:\t60D3A9DA420ECD7DBF490BA233EA5C61\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"Because you would love to know how you can get out of here.\"\nmsgstr \"Mert annyira szeretnéd tudni, hogy jutunk ki innen.\"\n\n#. Key:\t6125A956446F64BD91E1F5A282AC146D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"Don’t worry! I know your daughter is trapped in the Unknown and my research confirms there is a chance you can bring her back.\\r\\nI’ll help you bring the missing artefacts back.\"\nmsgstr \"Nyugalom! Tudom, hogy a lányod csapdába esett az Ismeretlen Világban. Számításaim szerint jó esély van rá, hogy visszahozzuk épségben.\\nSegítek elhozni a Varázstárgyakat.\"\n\n#. Key:\t6B7478444FBC694480D442BB90F70B27\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"What do you want?\"\nmsgstr \"Mit akarsz?\"\n\n#. Key:\t72D7F64D4051F9BF362B9B97FD30DB65\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_12.Children(2).Children.Text\n#. Key:\tF62125FB48F982D2A3D4FE9621810F64\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_12.Children(2).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"What?\"\nmsgstr \"Mi?\"\n\n#. Key:\t810BD4154FA6BC7F857F9CB14EDC6A1D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"Er... thanks!\"\nmsgstr \"Öö... kösz!\"\n\n#. Key:\t8F439E124100E004BCCD4AA04F17CB3F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"How will we get out of here?\"\nmsgstr \"Hogy jutunk ki innen?\"\n\n#. Key:\t9D31A0084CBBA499BA4E3BADB42E6E36\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"Rule? What rule should be needed for something which was thought to be impossible?\"\nmsgstr \"Szabály? Minek kellene szabály valamire, amit mindenki lehetetlennek tart? \"\n\n#. Key:\t9F52551E46588D4F12CD7C8B63701FDE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_12.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_12.Children(1).Children.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"Why?\"\nmsgstr \"Miért?\"\n\n#. Key:\tAAC96E3C4D4D303C9E692390612A7215\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"Ask how we will get out of here!\"\nmsgstr \"Kérdezd meg, hogy jutunk ki innen!\"\n\n#. Key:\tC0808C6545D02F43CB37A2AFB79EEC1F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"Actually it’s not that good but still better than nothing.\"\nmsgstr \"Na jó, annyira nem jó, de azért jobb a semminél.\"\n\n#. Key:\tC19759F44A5A2AE21A04EBAF2A47E2D3\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"Take this!\"\nmsgstr \"Tessék!\"\n\n#. Key:\tC8CEB3844A6C958FF42C74AA81D4A90F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"Finally, Raven found you!\"\nmsgstr \"Végre, Holló megtalált!\"\n\n#. Key:\tCF6DEF4D4F6F664CF24435AF248CE452\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"Raven and his fellow Ball on a quest again!\"\nmsgstr \"Hollo és Labda kollégája újra közös bevetésen!\"\n\n#. Key:\tE52C31F241BCD21378696EB8761C0654\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"Let the masters talk in private and discuss how we will get out of here!\"\nmsgstr \"Hadd beszéljenek a gazdáink kettesben! Te meg addig megbeszéled Hollóval, hogy jutunk ki innen.\"\n\n#. Key:\t00ED8B314FC2DA3901823F92635D41D1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_26.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_26.Children(0).Children.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"You’ll be all dead\"\nmsgstr \"Mind odavesztek\"\n\n#. Key:\t23BA5AA446B44D107B9F3994ADDE1C43\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_22.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_22.Children(1).Children.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Save them!\"\nmsgstr \"Mentsük meg őket!\"\n\n#. Key:\t42395E7B4B735458E30557B9544073E3\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_8.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_8.Children(1).Children.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Leave\"\nmsgstr \"Távozok\"\n\n#. Key:\t43A5BAA8417D3291E502AD9500873B9E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Rumours have been spread of Ruin and the people are scared. They demand the Wizard Council to separate the Human Realm from the Ruined Realm.\"\nmsgstr \"Mindenféle pletykák keringenek a Fertőzésről, és az emberek félnek. Követelik, hogy a Varázsló Tanács válassza szét a Világokat.\"\n\n#. Key:\t4FAAEE6240849C416541EDA8AB8083C8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_30.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_30.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Good luck, Raven!\"\nmsgstr \"Sok szerencsét, Holló!\"\n\n#. Key:\t559673484F3C66AADE37E787BA35824A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_33.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_33.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Only a fool would bring Ruin to his own World.\"\nmsgstr \"Csak egy bolond vinné be önkezűleg a Fertőzést a saját otthonába.\"\n\n#. Key:\t568124F448BE3AF41123A0B7BB158A53\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Krrrr! Raven and you make a really good team.\"\nmsgstr \"Krrrr! Holló és te nagyszerű csapatot alkottok.\"\n\n#. Key:\t5853B8654DBD91894792DE803DE87271\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_27.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_27.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"You bring back the artefacts to rescue Lillian.\"\nmsgstr \"Te elviszed a Varázstárgyakat, hogy kimenthessétek Lilliant.\"\n\n#. Key:\t5D71DA8F4134A1AA206F15B7587AA188\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_15.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_15.Children(0).Children.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Break in?\"\nmsgstr \"Betörni?\"\n\n#. Key:\t6234A9A34854A37E0CA56987FDE81F5A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_26.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_26.Children(1).Children.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"You are right\"\nmsgstr \"Igazad van\"\n\n#. Key:\t6B07C6F34DF51DFA23A4278FCBECF303\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"What it will do?\"\nmsgstr \"Akkor mi lesz?\"\n\n#. Key:\t6E5A51A34AB81094924512B92F25F41C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_32.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_32.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"You are trying to rescue a bunch of mad people so that they can live a few more years with the cost of destroying one more Realm.\"\nmsgstr \"Ki akarsz menteni egy rakat elmebeteget, hogy néhány évvel tovább élhessenek, és nem foglalkozol vele, hogy ezzel egy egész Világot elpusztítasz.\"\n\n#. Key:\t70514624400617999FA05FAFAE67D60F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"What happened in the Human Realm?\"\nmsgstr \"Mi történt az Ember Világban?\"\n\n#. Key:\t71C42D6445782897EAF303BFA2C5C260\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"What will you do? What’s your part in this?\"\nmsgstr \"Te mit fogsz csinálni?\"\n\n#. Key:\t728B75824B28856156D207B71017C714\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Things are changing in the Human Realm and Raven has many things to do.\"\nmsgstr \"Az Ember Világban zűrzavar van, és Hollónak sok dolgot el kell intéznie.\"\n\n#. Key:\t7826765F45BE76393F3636B79BBC24C0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_24.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_24.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"You are right. We need to save them. What’s the plan?\"\nmsgstr \"Igazad van. Meg kell mentenünk mindenkit. Mi a terv?\"\n\n#. Key:\t866DA22D46D855A200BB7F9E71788367\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_22.Children(0).Children.Text\n#. Key:\tBA0DEBA04BF5C604A2B760B8275E2983\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_23.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_22.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_23.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Is that safe?\"\nmsgstr \"Nem túl kockázatos?\"\n\n#. Key:\t86E69EA04F489DC54B48BEBE8B3762BF\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_1.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_1.Children(0).Children.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Agree\"\nmsgstr \"Egyetértek\"\n\n#. Key:\t8D543992469624098751EAA474848F8C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Soon the Ruined Realm will be over. We cannot save it.\"\nmsgstr \"A Fertőzött Földnek rövidesen vége. Nem tudjuk megmenteni.\"\n\n#. Key:\t943679734061A00F4CC99A8BC31078EA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Wizard won’t activate the device for them but some of them are fools enough to try it anyway.\"\nmsgstr \"Varázsló nem fogja használni a Szerkezetet a kedvükért, de néhányan elég ostobák lesznek ahhoz, hogy maguk próbálkozzanak.\"\n\n#. Key:\t978AEC8B45AC7E6ED3E814AB849CF96A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"So, what now?\"\nmsgstr \"Akkor, mi lesz most?\"\n\n#. Key:\t99250A3F4973EBFB5A20A192DF8976AA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"With every day more and more people join their ranks.\"\nmsgstr \"Minden nap újabb emberek csatlakoznak hozzájuk.\"\n\n#. Key:\t9D81AC2C4900D6DDA6B17CAD7168020C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_31.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_31.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Farewell, compeer!\"\nmsgstr \"Viszlát, kolléga!\"\n\n#. Key:\tA5F24B3747918DB1E38CB98208FD6B1B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_35.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_35.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Or maybe you are wrong.\"\nmsgstr \"De az is lehet, hogy tévedsz.\"\n\n#. Key:\tB0ECBFAF4E34AEDE88F1B7B7C7F7CC5B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_8.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_8.Children(0).Children.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"What happened?\"\nmsgstr \"Mi történt?\"\n\n#. Key:\tB1D891BF48298C5D4CF7D8957EACDD1B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Raven will gather as many survivors as Raven can.\"\nmsgstr \"Holló összegyűjt minden túlélőt, akit csak tud.\"\n\n#. Key:\tB6CF3E424BAEA6EE368D508EEFDD5FF1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_36.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_36.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Farewell compeer! Raven will be on a quest on Raven’s own!\"\nmsgstr \"Viszlát, kolléga! Holló most egyedül indul küldetésre!\"\n\n#. Key:\tB87509FF4D29C2B3D25CCEB192090963\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"What happens if they break in?\"\nmsgstr \"Mi történik, ha betörnek?\"\n\n#. Key:\tB89F014644B8D3E1754B1B8C796D5858\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_1.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_1.Children(1).Children.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Disagree\"\nmsgstr \"Nem értek egyet\"\n\n#. Key:\tBA14AAD54C3D4F7CF18F5D8560A62637\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Nothing good...\"\nmsgstr \"Semmi jó...\"\n\n#. Key:\tC2E50DCB4E1171342DD931910E42549E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_37.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_37.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Farewell!\"\nmsgstr \"Viszlát!\"\n\n#. Key:\tC3B19DAF4C0B491D9236CD99FD7DD603\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Except when you kill me with a laser beam.\"\nmsgstr \"Kivéve, amikor kinyírsz egy lézersugárral.\"\n\n#. Key:\tCBDDFBD14121FE1758B360A1775F2169\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Farewell compeer until you meet Raven again!\"\nmsgstr \"Viszlát, kolléga, amíg újra nem találkozol Hollóval!\"\n\n#. Key:\tCD19E0924BB1080025ABA19860F578CE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Somehow they know about the device the Wizard created. They surrounded the Wizard’s tower. Some even tried to break in.\"\nmsgstr \"Valahonnan tudomást szereztek a Szerkezetről, amit Varázsló készített. Körbevették a kastélyát, páran már betörni is megpróbáltak.\"\n\n#. Key:\tD54470AA424038F96824FC805AE3F0EE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_25.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_25.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Krrr! For them it’s much safer than staying here when the World is over.\"\nmsgstr \"Krrr! Az itt élőknek sokkal kockázatosabb megvárni a Világ Végét.\"\n\n#. Key:\tD99400D94457B6779DE59DB94FDBF9D1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"We have really short time to act.\"\nmsgstr \"Szorít minket az idő, cselekednünk kell.\"\n\n#. Key:\tDAEF711B41EC4EF72FC271B5AD98A238\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_26.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_26.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"There are hundreds of survivors. Races that don’t even exist anywhere else! Who are we if we don’t even try to save them?\"\nmsgstr \"Több száz túlélőről beszélünk. Olyan fajokról, amelyek sehol máshol nem léteznek! Mik vagyunk, ha meg sem próbáljuk menteni őket?\"\n\n#. Key:\tDF872D134C82DFDD3F55F4A6FFF59673\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Except...\"\nmsgstr \"Kivéve...\"\n\n#. Key:\tE64B8C0048D2D3357B74CD8D7C1B5407\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_34.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_34.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"You sound like that Monk, don’t you? Maybe you are right.\"\nmsgstr \"Úgy beszélsz, mint az a Szerzetes, nemde? Talán igazad van.\"\n\n#. Key:\tEA01FB8248A5F30CF9D95AA292D5466A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"No problem.\"\nmsgstr \"Semmi gond.\"\n\n#. Key:\tF1193DA54FBB289383D56F952818E67E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Raven’s master decided we need to gather every survivor and take them into the Human Realm.\"\nmsgstr \"Holló Gazdája úgy döntött, össze kell gyűjtenünk a túlélőket, és át kell menekítenünk őket az Ember Világba.\"\n\n#. Key:\tF19792CF477CD543AC05FCBEDA3EA88C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_15.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_15.Children(1).Children.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"To act?\"\nmsgstr \"Cselekednünk?\"\n\n#. Key:\tF606FBDF4B7F3DFF9A55BE9CDB186CAC\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Farewell then!\"\nmsgstr \"Akkor viszlát!\"\n\n#. Key:\tF8FA36BF4E3A4C028FBAF0A2AA531AA4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"You need to go on alone.\"\nmsgstr \"Egyedül kell tovább menned.\"\n\n#. Key:\tFA02BBA74B601254CDA90A9300AD312F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_29.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_29.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"If all goes well you will meet Raven on the other side.\"\nmsgstr \"Ha minden jól megy, a túloldalon találkozol még Hollóval.\"\n\n#. Key:\tFA630952402B081C2D449DA3C091F33E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Yes, we did well. Thanks for the help!\"\nmsgstr \"Igen, jó csapat vagyunk. Kösz a segítséget!\"\n\n#. Key:\t63338A0644CC3AE62BCC10B56EAAD524\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3SewerCreature.C3SewerCreature:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter3/C3SewerCreature.C3SewerCreature:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_C3SewerCreature\"\nmsgid \"Fear not, everything will be alright!\"\nmsgstr \"Ne aggódj! Minden rendben lesz!\"\n\n#. Key:\t2C1EC209404316CE23DC67B6E91AC661\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Statue.C3Statue:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter3/C3Statue.C3Statue:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_C3Statue\"\nmsgid \"Are you ready?\"\nmsgstr \"Kész vagy?\"\n\n#. Key:\t33B337C9455FC32BF5C3C69F58843673\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Statue.C3Statue:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Chapter3/C3Statue.C3Statue:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_C3Statue\"\nmsgid \"Will you release me once I get into your tower?\"\nmsgstr \"Hazajuttatsz, ha odaérek hozzád?\"\n\n#. Key:\t4A8AD3EC428307141BD011B66448A7E5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Statue.C3Statue:DlgNode_Speech_2.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Statue.C3Statue:DlgNode_Speech_2.Children(0).Children.Text\nmsgctxt \"Dialogue_C3Statue\"\nmsgid \"Ready\"\nmsgstr \"Készen állok\"\n\n#. Key:\t9C5B29DF4784913DFF166BAD07AC1219\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Statue.C3Statue:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Chapter3/C3Statue.C3Statue:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_C3Statue\"\nmsgid \"Hurry! We don’t have much time.\"\nmsgstr \"Siess! Nincs sok időnk.\"\n\n#. Key:\tB640545F41315B4C142083A2DB12A132\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Statue.C3Statue:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Chapter3/C3Statue.C3Statue:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_C3Statue\"\nmsgid \"Sure, we made a deal.\"\nmsgstr \"Persze, megegyeztünk.\"\n\n#. Key:\tC4EC98FC40F0181F5AFA60B4DFEF2D16\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Statue.C3Statue:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Chapter3/C3Statue.C3Statue:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_C3Statue\"\nmsgid \"Not yet. I’ll be back...\"\nmsgstr \"Még nem. Mindjárt jövök...\"\n\n#. Key:\tCD542C81498F713774D43AB6EF126E32\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Statue.C3Statue:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter3/C3Statue.C3Statue:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_C3Statue\"\nmsgid \"Well done! From here I can take you to my tower.\"\nmsgstr \"Nagyszerű! Innen már el tudlak hozni.\"\n\n#. Key:\tF982C80748C46B117906F094608B7E2C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Statue.C3Statue:DlgNode_Speech_2.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Statue.C3Statue:DlgNode_Speech_2.Children(1).Children.Text\nmsgctxt \"Dialogue_C3Statue\"\nmsgid \"Stay\"\nmsgstr \"Maradok\"\n\n#. Key:\tFE6723D8452B497B07504EA753F02F35\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Statue.C3Statue:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Chapter3/C3Statue.C3Statue:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_C3Statue\"\nmsgid \"Let’s go then!\"\nmsgstr \"Akkor gyerünk!\"\n\n#. Key:\t7C2DF1BE46E7672A1C7092A330030B39\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3SupperDwarf.C3SupperDwarf:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter3/C3SupperDwarf.C3SupperDwarf:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_C3SupperDwarf\"\nmsgid \"Otherwise I would rather stay here.\"\nmsgstr \"Ha nem, akkor inkább itt maradnék.\"\n\n#. Key:\tFEB0911A412AF51088EC6A84D0FC7B3C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3SupperDwarf.C3SupperDwarf:DlgNode_Speech_80.Text\n#: /Game/SO/Dialogues/Chapter3/C3SupperDwarf.C3SupperDwarf:DlgNode_Speech_80.Text\nmsgctxt \"Dialogue_C3SupperDwarf\"\nmsgid \"I hope there is some delicious food in the Human Realm.\"\nmsgstr \"Remélem odaát jól főznek...\"\n\n#. Key:\t360852FB41FBC269468577878A0CC719\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_C3Teachy\"\nmsgid \"Don’t say it, I know. I’m genius.\"\nmsgstr \"Ne mond ki, tudom. Zseni vagyok.\"\n\n#. Key:\t39008A1943A63D4050295B9C508DF4CE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_C3Teachy\"\nmsgid \"He asked me to prove that I am worthy.\"\nmsgstr \"Be kellett bizonyítanom a Méltóságomat.\"\n\n#. Key:\t5D3A77994D763C95F5655CAC4F228452\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_C3Teachy\"\nmsgid \"Oh, the walking ball again!\"\nmsgstr \"Ó, a sétáló labda visszatért!\"\n\n#. Key:\t74789A0946246082325FCDB2600CEAA2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_C3Teachy\"\nmsgid \"I haven’t seen you since you left me there with that Keeper.\"\nmsgstr \"Azóta nem láttalak, mióta otthagytál a csávában a Kapuőrrel.\"\n\n#. Key:\t81A13B9645C14341A7FA45BC7482AB58\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_C3Teachy\"\nmsgid \"I'm not sure if it still matters but here is the Weird Device I found in the hideout of the Secret Science Society.\"\nmsgstr \"Lehet már nincs nagy jelentősége, de itt van a Fura Eszköz a Titkos Tudós Társaság rejtekhelyéről.\"\n\n#. Key:\t8E2355CF4A1F7CCF4AF0FA8D95E2F503\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_C3Teachy\"\nmsgid \"After reordering the right side I got the final result:\\r\\n\\r\\nTEACHY = WORTHY\"\nmsgstr \"Aztán megszoroztam T-vel:\\nINAT = MELÓT\\nAmi nem más, mint TANI = MELTÓ, ami ugyanaz, mint a MÉLTÓ.\"\n\n#. Key:\tA46C8D2749791CE910856BA8887272EB\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_C3Teachy\"\nmsgid \"That is amazing! Thank you, my globular friend! Take these coins, I am sure you will enjoy spending them... if you still can.\"\nmsgstr \"Lenyűgöző! Köszönöm, gömbölyű barátom! Fogadd el ezt a szerény összeget cserébe. Biztosan okosan költöd majd el... már ha még lesz rá lehetőséged.\"\n\n#. Key:\tBFA75D71419A3B5615D65980F9A2FC0E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_C3Teachy\"\nmsgid \"Well, alright, I’ll tell.\"\nmsgstr \"Ám legyen, elmondom.\"\n\n#. Key:\tC09FB7394571D19280D0B68572C6DCBB\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_C3Teachy\"\nmsgid \"I bet you wonder how did I get out.\"\nmsgstr \"Le merem fogadni, majd szétvet a kíváncsiság, hogy jutottam ki szorult helyzetemből.\"\n\n#. Key:\tCC72AAE64CE58AECB367B0B2565A74CC\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_C3Teachy\"\nmsgid \"I made some cups of tea and slowly put them in a row. From that I had this formula:\\r\\n\\r\\nTIME = T\\r\\nCUP = C\\r\\nTEA * C = ROW * T\"\nmsgstr \"Abból indultam ki, hogy ehhez nekem többet kellett volna tanulnom, de az inas élet meg olyan melós.\\nTehát:\\nINAS = MELÓS és E = É\"\n\n#. Key:\tE907906F4A46886EFBA7F09E459F2663\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_C3Teachy\"\nmsgid \"Then I multiplied by HY, so I get:\\r\\n\\r\\nTEACHY = ROWTHY\"\nmsgstr \"Mindkét oldalt elosztottam S-sel, ez jött ki:\\nINA = MELÓ\"\n\n#. Key:\t298F025648B369E90753DA8D882DFDDB\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/DwarvenCatacombs/DCDictionary.DCDictionary:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Wizard/DwarvenCatacombs/DCDictionary.DCDictionary:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_DCDictionary\"\nmsgid \"Finally! A dictionary!\"\nmsgstr \"Végre! Szótár!\"\n\n#. Key:\t3D4CF9424B28083560A64D8FA1232E9F\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/DwarvenCatacombs/DCDictionary.DCDictionary:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Wizard/DwarvenCatacombs/DCDictionary.DCDictionary:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_DCDictionary\"\nmsgid \"Wake me up when you are ready.\"\nmsgstr \"Ébressz fel, ha végigolvastad.\"\n\n#. Key:\t04B787DD4344DA8AD6B1E0B7925BBDCE\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/DwarvenCatacombs/DCSecretDoor.DCSecretDoor:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Wizard/DwarvenCatacombs/DCSecretDoor.DCSecretDoor:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_DCSecretDoor\"\nmsgid \"There is a hidden Dwarven Door somewhere around here.\"\nmsgstr \"Itt valahol van egy rejtett Törp Kapu.\"\n\n#. Key:\t4412DD54423A17AF3BFBA89BAF42664D\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/DwarvenCatacombs/DCSecretDoor.DCSecretDoor:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Wizard/DwarvenCatacombs/DCSecretDoor.DCSecretDoor:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_DCSecretDoor\"\nmsgid \"Or if you toggle that switch.\"\nmsgstr \"Vagy ha felkapcsolod azt a kapcsolót.\"\n\n#. Key:\t5FDA3D2A49BD57C213F0E3869A366B76\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/DwarvenCatacombs/DCSecretDoor.DCSecretDoor:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Wizard/DwarvenCatacombs/DCSecretDoor.DCSecretDoor:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_DCSecretDoor\"\nmsgid \"This one can only be revealed on Christmas time if the full moon shines on it.\"\nmsgstr \"Amelyik itt van, az például csak Karácsonykor látható, ha a telihold fénye világítja meg.\"\n\n#. Key:\tCE7E6F5B4DB41F1055EAF1898F17E4EA\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/DwarvenCatacombs/DCSecretDoor.DCSecretDoor:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Wizard/DwarvenCatacombs/DCSecretDoor.DCSecretDoor:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_DCSecretDoor\"\nmsgid \"Dwarfs are fond of these. They can't be seen if you don't know their trick.\"\nmsgstr \"A Törpék imádják az ilyesmit. Csak akkor találod meg őket, ha tudod a titkukat.\"\n\n#. Key:\t03067C1041952ECAC7D529AF2CC2ABEE\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_DemonLillian\"\nmsgid \"Who you just killed...\"\nmsgstr \"Akit épp most öltél meg...\"\n\n#. Key:\t06C4895B4BA9C2F71F3007B00A680CFB\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_DemonLillian\"\nmsgid \"I'm free without any bounds! I'm human!\"\nmsgstr \"Szabad vagyok, korlátok nélkül! Ember vagyok!\"\n\n#. Key:\t0E5418EA4828B840886434A250967CBE\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_DemonLillian\"\nmsgid \"You liar! I'm the daughter of the Wizard!\"\nmsgstr \"Hazudós! Én vagyok a Varázsló lánya!\"\n\n#. Key:\t15ED5E554FBF25A72BB12FA81F4076FF\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_DemonLillian\"\nmsgid \"Sister? What makes you say that?\"\nmsgstr \"Testvér? Miért mondod ezt?\"\n\n#. Key:\t2B375C424D4561D651214BA0F10CDB44\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_DemonLillian\"\nmsgid \"Siblings? What makes you say that?\"\nmsgstr \"Testvér? Miért mondod ezt?\"\n\n#. Key:\t2F0A5F3442ACF917A0515892B0639541\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_2.Children(1).Children.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_2.Children(1).Children.Text\nmsgctxt \"Dialogue_DemonLillian\"\nmsgid \"Just passing\"\nmsgstr \"Csak átmegyek\"\n\n#. Key:\t36A3340F4333184F42874F88F23A710D\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_DemonLillian\"\nmsgid \"What are you doing here little toy?\"\nmsgstr \"Mit csinálsz itt, kicsi játék?\"\n\n#. Key:\t46C7EE464B94BCE5D8CE6DB96299A583\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_DemonLillian\"\nmsgid \"You are nonsense.\"\nmsgstr \"Bolond vagy.\"\n\n#. Key:\t732777EC4B213BC797E24FBBC478D39F\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_DemonLillian\"\nmsgid \"You are a Spirit of the Unknown bound to this body by magic. Just like me.\"\nmsgstr \"Az Ismeretlen Világból jött szellem vagy, varázslattal evilági testbe zárba. Úgy, mint én.\"\n\n#. Key:\t819738554E1DD3694F3D0699221E6932\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_DemonLillian\"\nmsgid \"I'm just err... maybe we could play seek and hide?\"\nmsgstr \"Én csak, ööö... mi lenne, ha bújócskát játszanánk?\"\n\n#. Key:\tA02291F444C7907190F1D3AC78E5EAF0\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_2.Children(0).Children.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_2.Children(0).Children.Text\nmsgctxt \"Dialogue_DemonLillian\"\nmsgid \"I'll stop you!\"\nmsgstr \"Megállítalak!\"\n\n#. Key:\tA94658F148628400E971CD925A6B8713\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_DemonLillian\"\nmsgid \"Shaped like a human...\"\nmsgstr \"Csak alakra vagy ember...\"\n\n#. Key:\tBBBDA8B843BF5549EF4052894D9BB630\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_DemonLillian\"\nmsgid \"We are siblings right? You will surely let me pass...\"\nmsgstr \"Mi testvérek vagyunk, nem? Biztos átengedsz...\"\n\n#. Key:\tBF79A92B406E287D767E7799D78FCFD4\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_DemonLillian\"\nmsgid \"That sounds funny!\"\nmsgstr \"Jól hangzik!\"\n\n#. Key:\tC6609DA7417A4DBC86F9809CE994E8BA\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_DemonLillian\"\nmsgid \"I'm power, I'm god!\"\nmsgstr \"Erő vagyok! Isten vagyok!\"\n\n#. Key:\tDD2EF1594AFD2B0C38845C9E36089B95\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_DemonLillian\"\nmsgid \"I've found you!\"\nmsgstr \"Megvagy!\"\n\n#. Key:\tDD2F3A7048614E74B3A343BA474D8E49\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_DemonLillian\"\nmsgid \"I've come to stop you sister. The World is not your playground!\"\nmsgstr \"Azért jöttem, hogy megállítsalak, testvér. A Világ nem a játszótered.\"\n\n#. Key:\tE7FA21A04757D1EF04AE41AF4A13025A\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_DemonLillian\"\nmsgid \"I'm bored! Have you come to play with me?\"\nmsgstr \"Unatkozom! Azért jöttél, hogy játssz velem?\"\n\n#. Key:\tFF05E84E4027C75294BAF4A589EEF6F9\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_DemonLillian\"\nmsgid \"I can create, I can destroy!\"\nmsgstr \"Teremtek! Pusztítok!\"\n\n#. Key:\t025193144996A7024A7CF791B5A25EB7\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillianDefeated.DemonLillianDefeated:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillianDefeated.DemonLillianDefeated:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_DemonLillianDefeated\"\nmsgid \"What are you doing? Keep your hands away from me!\"\nmsgstr \"Mit csinálsz? Ne nyúlj hozzám!\"\n\n#. Key:\t2E05897C454C5C33BD76A6A4371A545C\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillianDefeated.DemonLillianDefeated:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillianDefeated.DemonLillianDefeated:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_DemonLillianDefeated\"\nmsgid \"I don't want to play anymore!\"\nmsgstr \"Már nincs kedvem játszani!\"\n\n#. Key:\t77A82F8943F323744F9389BF22A80FDF\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillianDefeated.DemonLillianDefeated:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillianDefeated.DemonLillianDefeated:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_DemonLillianDefeated\"\nmsgid \"Farewell Spirit!\"\nmsgstr \"Ég veled, Szellem!\"\n\n#. Key:\t7831CD44458112E37918DF9082278603\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillianDefeated.DemonLillianDefeated:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillianDefeated.DemonLillianDefeated:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_DemonLillianDefeated\"\nmsgid \"Leave me alone!\"\nmsgstr \"Hagyj békén!\"\n\n#. Key:\t79E4053F4B8A1AFE74064BA77037F13E\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillianDefeated.DemonLillianDefeated:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillianDefeated.DemonLillianDefeated:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_DemonLillianDefeated\"\nmsgid \"I am his daughter. And this body is mine.\"\nmsgstr \"Én vagyok a Varázsló lánya. Ez az én testem.\"\n\n#. Key:\t96BD08904BC50C912055C0977281D10F\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillianDefeated.DemonLillianDefeated:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillianDefeated.DemonLillianDefeated:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_DemonLillianDefeated\"\nmsgid \"I know this body...\"\nmsgstr \"Emlékszem erre a testre...\"\n\n#. Key:\tA5634D7D4613C578AB85E48B2DBD422B\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillianDefeated.DemonLillianDefeated:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillianDefeated.DemonLillianDefeated:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_DemonLillianDefeated\"\nmsgid \"Away!\"\nmsgstr \"El innen!\"\n\n#. Key:\tE09248B24E34823DDE71BAB68183AD2D\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillianDefeated.DemonLillianDefeated:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillianDefeated.DemonLillianDefeated:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_DemonLillianDefeated\"\nmsgid \"They were wrong all along.\"\nmsgstr \"Tévedtek, végig tévedtek.\"\n\n#. Key:\t01C1D7AF4D8D7B3D628A089E38471479\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_74.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_74.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Thank you! Take this as reward.\"\nmsgstr \"Köszönöm! Fogadd el ezt jutalmul.\"\n\n#. Key:\t034DDD8F467E3B6E6A70CFBC1FA81D21\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_94.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_94.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Look what I have found for you!\"\nmsgstr \"Nézd, mit találtam!\"\n\n#. Key:\t046279EA4D7E44826F537DA0869C13DD\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_114.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_114.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"They are somewhere around.\"\nmsgstr \"Valahol a környéken vannak.\"\n\n#. Key:\t055FD02047EB0145285C8BB0B7A23F0A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_17.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_17.Children(0).Children.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"They fight Ruin\"\nmsgstr \"Szembeszállnak a Fertőzéssel\"\n\n#. Key:\t07684DB1418378D59D3741AE19AB22C1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(9).Children.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(9).Children.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Golems destroyed\"\nmsgstr \"Legyőztem a Gólemeket\"\n\n#. Key:\t0D548F74416A5C1D8220869DC707A575\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_127.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_127.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Even if he couldn't be what I wanted him to be, he was my greatest creation ever.\"\nmsgstr \"Még ha nem is az lett belőle, amire terveztem, akkor is ő a legtökéletesebb alkotásom.\"\n\n#. Key:\t0E3082704C6E4BA14C554DA5B4306C88\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Could you merge these copper pieces?\"\nmsgstr \"Össze tudnád forrasztani ezeket a réz darabokat?\"\n\n#. Key:\t103CB0C84AEA077F78347A92E6389F32\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_10.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_10.Children(0).Children.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Don't know\"\nmsgstr \"Nem tudom\"\n\n#. Key:\t12C814BB44D434DFC5C35C882B4BF0DB\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_116.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_116.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Be aware of the Armour Wrath.\"\nmsgstr \"Óvakodj a Harag Vérttől.\"\n\n#. Key:\t14E2589C4CC2C6C77D37A5B50C61C266\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Could you merge these bronze pieces?\"\nmsgstr \"Össze tudnád forrasztani ezeket a bronz darabokat?\"\n\n#. Key:\t1770D8FE480B8C028F9ED989E22CF315\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"You are not one of my new creations. Yet not one of the ancients.\"\nmsgstr \"Te nem az új alkotásaim közül való vagy, de nem is egy ősi példány.\"\n\n#. Key:\t1C02E8BB400B379858A402B9621B68D6\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_129.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_129.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Take care!\"\nmsgstr \"Vigyázz magadra!\"\n\n#. Key:\t1CDE0CFA4DBF3794096E099B58726BD8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_36.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_36.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Nothing else matters.\"\nmsgstr \"Másnak nincs jelentősége.\"\n\n#. Key:\t1FA243424440B0810651C79BD207FC2D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_33.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_33.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Too many spirits. They break loose. They couldn’t exist in our Realm. They formed Ruin.\"\nmsgstr \"Túl sok szellem. Elszabadultak. Nem tudtak a mi világunkban formát ölteni. Belőlük lett a Fertőzés.\"\n\n#. Key:\t1FFE46404FBD26325B1348BF7A2935A7\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_92.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_92.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Oh, thank you! It also gives back some of my lost knowledge.\"\nmsgstr \"Örök hálám! Emlékszem dolgokra, amiket réges-rég tanultam.\"\n\n#. Key:\t2084B3DE4CDAC5B7B9018994EE4DFAA4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_85.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_85.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"The end is close, yet knowing what I am makes my last days brighter.\"\nmsgstr \"Közel a vég, mégis erőt ad, hogy tudom, ki vagyok.\"\n\n#. Key:\t21883D3E4563FD95B13E8E8E25FB1D92\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_15.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_15.Children(0).Children.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Not my business\"\nmsgstr \"Nem az én dolgom\"\n\n#. Key:\t2362D7ED44CEEE8592C72BB41ECC0CC0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_77.Text\n#. Key:\t969AF9184296C419E484BA80FF80F15B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_76.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_76.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_77.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Do you know a girl called Lillian?\"\nmsgstr \"Ismersz egy Lillian nevű lányt?\"\n\n#. Key:\t2362FF25427C7C664ACE9297A20F3C65\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_81.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_81.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Memory Crystals? Can I touch them?\"\nmsgstr \"Emlék Kristály? Megnézhetem?\"\n\n#. Key:\t254431B64533FAD362B0AF93F8347842\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_119.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_119.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"You will find it if you reach the top of the Main Tower.\"\nmsgstr \"Megtalálod, ha feljutsz a központi torony tetejére.\"\n\n#. Key:\t26664D3045EDCEC9C09E9CBA8515C088\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I don't know... I'm forced to do tasks for a wizard. I'm lost and confused.\"\nmsgstr \"Nem tudom... kényszerítenek, hogy feladatokat hajtsak végre egy varázslónak.\"\n\n#. Key:\t280BE2914A227E7350F067BCB4CC49AD\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_86.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_86.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Hmmm...\"\nmsgstr \"Hmmm...\"\n\n#. Key:\t2B714CED45A868B1678C5E854160945E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_97.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_97.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Look, I have more crystals.\"\nmsgstr \"Nézd, van még kristályom.\"\n\n#. Key:\t2C052328496E84667F356F95F9F9C418\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"This is really not my problem. All I care about is to complete my task and go on my way.\"\nmsgstr \"Ez igazán nem az én problémám. Engem csak az érdekel, hogy teljesítsem a feladatomat, és mehessek dolgomra.\"\n\n#. Key:\t2C174523477E6720A5300DBFE343C3D8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_51.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_51.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I can no longer open a gate to the Unknown Realm.\"\nmsgstr \"Már nem tudok kaput nyitni az Ismeretlen Világra.\"\n\n#. Key:\t2C7D234B4F377087E1D340986BD581AC\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_49.Text\n#. Key:\t417BB4E644EBC809C2489F85993A8E17\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_56.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_49.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_56.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"If you can summon Spirits you surely know a way to get me home.\"\nmsgstr \"Ha meg tudsz idézni szellemeket, akkor engem is biztos haza  tudsz juttatni.\"\n\n#. Key:\t2DE200934F6AC1595216AA8050FF8F30\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_67.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_67.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I won’t work with anything else.\"\nmsgstr \"Nem fogok más anyaggal dolgozni.\"\n\n#. Key:\t2FC050C145CB19BD786157988C677AF5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(1).Children.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Bronze key\"\nmsgstr \"Bronz kulcs\"\n\n#. Key:\t30AD4CBE4D6EFD170F43D9852A0CB50C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_108.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_108.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I can’t remember.\"\nmsgstr \"Nem emlékszem.\"\n\n#. Key:\t310B95624A8B2179F69A68BE2B0869C2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(4).Children.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(4).Children.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Making Golems?\"\nmsgstr \"Gólemeket készítesz?\"\n\n#. Key:\t311039514F83A0ED4BE47A98BF5AE48E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_107.Text\n#. Key:\t5D08D2404686BF1E5D48AC8C63096F0D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_104.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_104.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_107.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Thank you Spirit! I will be forever in your debt.\"\nmsgstr \"Köszönöm, Szellem! Örökké adósod leszek.\"\n\n#. Key:\t3140425845B595B02CA8D3B8DBC6CE37\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_38.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_38.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"It's done. They are destroyed.\"\nmsgstr \"Kész. Elpusztultak.\"\n\n#. Key:\t37835C204E4C4B17F2D55C9B23FD7D1E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_45.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_45.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"There is some kind of a connection between Ruin and the Spirits.\"\nmsgstr \"Van valamiféle kapcsolat a Szellemek és a Fertőzés között.\"\n\n#. Key:\t384F5CB146C9B6E7EFD361964FF11735\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"A spirit of the Unknown was summoned here by a Wizard of another world.\"\nmsgstr \"Lélek az Ismeretlenből. Egy másik világ varázslója idézett ide.\"\n\n#. Key:\t398124A4493A7325B284CA8105354F0C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_35.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_35.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Yet now the only important thing is to finish my golems.\"\nmsgstr \"Mégis, az egyetlen, ami fontos maradt, hogy befejezzem a gólemeimet.\"\n\n#. Key:\t39C014784CA9DF8247D2DDA5587BAB20\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(5).Children.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(5).Children.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Get me home!\"\nmsgstr \"Juttass haza!\"\n\n#. Key:\t3CE0431346C222ED2A6729AAEF8026DC\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(6).Children.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(6).Children.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"New body for me\"\nmsgstr \"Új test\"\n\n#. Key:\t3DFB1F4D4BB673F983C8CDA4E9911BF2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_89.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_89.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Wait a minute! I’ll make something special for you.\"\nmsgstr \"Várj egy kicsit! Készítek valami különlegeset a számodra.\"\n\n#. Key:\t3F7C1850478A14857F4FFD9D41BA39FC\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_87.Text\n#. Key:\t79079CCD4BB2C6244D6D7CB04BD4C42F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_84.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_84.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_87.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Yes, now I remember. Thank you little Spirit for giving my memories back.\"\nmsgstr \"Igen, már emlékszem. Köszönöm kicsi Szellem, hogy visszaadtad az emlékeimet.\"\n\n#. Key:\t3FAB7E8D4E72D1EED6E11EA54A128836\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(3).Children.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(3).Children.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Copper Key\"\nmsgstr \"Réz Kulcs\"\n\n#. Key:\t419879C24D39534867F656B704C579AC\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_110.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_110.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Even without my memories I liked to talk to her.\"\nmsgstr \"Még az emlékeim nélkül is szerettem beszélgetni vele.\"\n\n#. Key:\t41B08BF1417C041EB3ACAE8C09C44872\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_17.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_17.Children(1).Children.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"They will fall\"\nmsgstr \"Elbuknak\"\n\n#. Key:\t41E19A0C420F2BD87AA91AB475D5BB0C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_128.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_128.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Please, leave me alone now.\"\nmsgstr \"Kérlek, hagyj magamra!\"\n\n#. Key:\t4438EF7A4D77A3314D2B6587DAE664AE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I can fix it!\"\nmsgstr \"Megjavítom!\"\n\n#. Key:\t46730E7C433AE7B987C61D9DDF0161E2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_52.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_52.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"How do you make Golems then?\"\nmsgstr \"Akkor hogy tudsz Gólemeket készíteni?\"\n\n#. Key:\t4816E7D14B256F62C2AFE0A3D5EC1987\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_113.Text\n#. Key:\tEC59F30D402E177B8C137DAA7A834F1A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_112.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_112.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_113.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I’m looking for three artefacts. Do you know something about them?\"\nmsgstr \"Varázstárgyakat keresek. Tudsz valamit róluk?\"\n\n#. Key:\t49E3D8B84BD437A7195CB49B1C91A9B7\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_30.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_30.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"We created too many of them. Always new ones. We forgot about the old ones.\"\nmsgstr \"Túl sokat készítettünk. Mindig újakat. Elfeledtük a régieket.\"\n\n#. Key:\t4CDF7F734B65BFB6575D66A2E40B64B6\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"You wonder if Ruin will destroy their World as well...\"\nmsgstr \"Arra gondolsz, a Fertőzés az ő világukat is elpusztíthatja...\"\n\n#. Key:\t4FD5FE974E1B8142471F8896818E875C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"What do you need?\"\nmsgstr \"Mire van szükséged?\"\n\n#. Key:\t5000F3F44A899815A0D341A3494E42AB\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_91.Text\n#. Key:\t6D5127FD45C09B33329F0EB0DDCE67D7\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_93.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_91.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_93.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Thank you!\"\nmsgstr \"Köszönöm!\"\n\n#. Key:\t50E6C4434BAC5A7F4B2C66BD8DB5E071\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_100.Text\n#. Key:\t64A5DE6941972506C0BECBB55BBE4FE5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_78.Text\n#. Key:\tB07790474D4C124CB72F128AE0FB2CC5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_95.Text\n#. Key:\tEF125F27496303716206D182C1ED460D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_39.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_100.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_39.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_78.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_95.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I think these crystals have something to do with you.\"\nmsgstr \"Azt hiszem, ezek a kristályok hozzád tartoznak.\"\n\n#. Key:\t51C200AD42FCE6888DBF8C8C24A02283\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"It shall be done.\"\nmsgstr \"Megcsinálom.\"\n\n#. Key:\t52D4954E427C666F0F2F4A92F9BCFBC9\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_50.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_50.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I’m sorry but I can’t help you.\"\nmsgstr \"Sajnálom, de nem segíthetek.\"\n\n#. Key:\t5B1327C64C77C05C43CD728356DA4EC4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_58.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_58.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Knowledge lost. We are lost.\"\nmsgstr \"A tudás elveszett. Minden elveszett.\"\n\n#. Key:\t5E7AD2034CECCF124DA4E19D94B96433\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"It's nothing. Here it is.\"\nmsgstr \"Semmiség. Tessék.\"\n\n#. Key:\t5FB1520B447246A1A8BCD3BDDB44D145\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_65.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_65.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"No.\"\nmsgstr \"Nem.\"\n\n#. Key:\t5FBF0F3F4419A6AD796054841902FA7C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"They can't work together even if they share the same goal.\"\nmsgstr \"Képtelenek együttműködni, még ha céljaik közösek is.\"\n\n#. Key:\t60609E4049562CF11C05CB8DB96BBBB3\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"What do you mean by 'your creations'?\"\nmsgstr \"Mit értesz \\\"alkotásod\\\" alatt?\"\n\n#. Key:\t635D5E904325D51DFF19A1A862A3CC0B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_124.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_124.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"The Armour Wrath is no more.\"\nmsgstr \"Harag Vért nincs többé.\"\n\n#. Key:\t6585CAC84326A3EEE1682789B7BB3CB6\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_10.Children(2).Children.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_10.Children(2).Children.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Your creation?\"\nmsgstr \"Alkotásod?\"\n\n#. Key:\t65C3735740E5D7AF76376AB2B7B05CE9\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(12).Children.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(12).Children.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Leave\"\nmsgstr \"Távozok\"\n\n#. Key:\t6A460D4A4751398E004298948D630BA4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_47.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_47.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I don’t think I will manage though. It’s already too late. But there is no reason to give up either.\"\nmsgstr \"Kizárt, hogy sikerüljön. Már túl késő. De feladni sincs értelme.\"\n\n#. Key:\t6DC280B64766B5CB2049409B2F73CDB4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_40.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_40.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Is there a way I can help you?\"\nmsgstr \"Segíthetek?\"\n\n#. Key:\t6DD3D7804417850FE8504286DD2B5D95\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_96.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_96.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"More Crystal? That's very kind.\"\nmsgstr \"Még kristály? Kedves tőled.\"\n\n#. Key:\t6E9DB27A4207FFA8409F61AE45282D53\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_41.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_41.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I have found one more crystal.\"\nmsgstr \"Találtam még egy kristályt.\"\n\n#. Key:\t717452044F194A1C30FA3C8FBB94C9BF\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_73.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_73.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I’ll see what I can do.\"\nmsgstr \"Meglátom, mit tehetek.\"\n\n#. Key:\t74670AB34D1A75913013BE8EE7C0B961\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_72.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_72.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I’ve already destroyed them.\"\nmsgstr \"Már végeztem velük.\"\n\n#. Key:\t752F67A54FA433AA588175AA7C64E367\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_43.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_43.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I try to create the perfect Golem. The one which resists Ruin.\"\nmsgstr \"Próbálom megalkotni a tökéletes Gólemet. Amelyik ellenáll a Fertőzésnek.\"\n\n#. Key:\t775C2189498804DBED7D81AB3EFEC96F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(11).Children.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(11).Children.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Lillian\"\nmsgstr \"Lillian\"\n\n#. Key:\t78C78DDD456328181EBCC78B20F9573D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_122.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_122.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Some of them are still out there.\"\nmsgstr \"Valamennyi még mindig a környéken van.\"\n\n#. Key:\t7C7D08C340B478A9420331AD355B1FA5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_15.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_15.Children(1).Children.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Like you?\"\nmsgstr \"Mint ti?\"\n\n#. Key:\t7DCEFFEC46523960D1453DA93F36CAA5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_111.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_111.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I don’t know why but I feel in some way you are bound to her.\"\nmsgstr \"Nem tudom, miért, de úgy érzem, valami hozzá köt.\"\n\n#. Key:\t7F44BD934784D4F3AA2C85985489590A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"A Wizard? So now the Human Realm's people are messing with Golem Technology.\"\nmsgstr \"Varázsló? Ezek szerint az Ember Világ lakói belekontárkodnak a Gólem Technológiába?\"\n\n#. Key:\t80871D9C4CF37B5F2E7101B8A2565D73\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_70.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_70.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"It’s not safe for me to walk outside.\"\nmsgstr \"Nem biztonságos kimennem.\"\n\n#. Key:\t83ACDDA4415211102DBE099F178B228B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_15.Children(2).Children.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_15.Children(2).Children.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"You mean Ruin\"\nmsgstr \"A Fertőzésre gondolsz\"\n\n#. Key:\t86B4FC23463D5507B11C3F826ADF6C7C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_10.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_10.Children(1).Children.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Spirit in a ball\"\nmsgstr \"Labdába zárt szellem\"\n\n#. Key:\t88A6486843FEC6A2125F79B8AED93F74\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_99.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_99.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Now there is only a few missing.\"\nmsgstr \"Már csak néhány hiányzik.\"\n\n#. Key:\t8C2169FA47F83CA62B19F083EFC398F5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_26.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_26.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"That is me. And what are you creature?\"\nmsgstr \"Ez vagyok én. És mi vagy te?\"\n\n#. Key:\t8CC8368441F2CCDB0E7B22916F8A0622\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_88.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_88.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Getting back some of my lost knowledge also makes me feel happy.\"\nmsgstr \"A régi emlékek felvidítanak.\"\n\n#. Key:\t8E3399DA4F904AD46476418817CD78C4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_62.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_62.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Metal binds the will of the spirits. Rock is a bit less cruel but still weakens your will.\"\nmsgstr \"A vas gúzsba köti a szellem akaratát. A kő nem annyira erős, de még mindig határokat szab.\"\n\n#. Key:\t8F4BB43A4656EAD257920492E10BC764\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_130.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_130.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Yes, they bring back some of my memories.\"\nmsgstr \"Igen, visszaadnak valamennyit az elvesztett emlékeimből.\"\n\n#. Key:\t8F9DF3254A02EFF2E623DB91935A1529\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_123.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_123.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Come back when you found all of them.\"\nmsgstr \"Gyere vissza, ha mindet megtaláltad.\"\n\n#. Key:\t97EE3A1B4AD2EB2E7ED2D1B1427E4A2A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_25.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_25.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"It's only me trying to recreate the perfect Golem.\"\nmsgstr \"Csak én vagyok, valaki, aki próbálja elkészíteni a tökéletes Gólemet.\"\n\n#. Key:\t99BCAE80415145460126B08933AE6242\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_118.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_118.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"One of the artefacts is close.\"\nmsgstr \"Az egyik Varázstárgy közel van.\"\n\n#. Key:\t9A05FD0845F9149CEB6EB8889EB9A686\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"That won't happen.\"\nmsgstr \"Nem fog bekövetkezni.\"\n\n#. Key:\t9B7BB6624923813EBF68C9BCE9FF8E49\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"There is nothing else I could say. See you later!\"\nmsgstr \"Nincs több mondanivalóm. Viszlát később!\"\n\n#. Key:\t9BEA36B448EC18A9280A5AAB78A46898\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_42.Text\n#. Key:\tD3AE25EC49FA7D2C78C1A382E5A01F28\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_37.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_37.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_42.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Why are you making Golems? What would you like to achieve?\"\nmsgstr \"Miért készítesz Gólemeket? Mit akarsz elérni ezzel?\"\n\n#. Key:\t9CC2CAF14E5C04555E7329B6EA5082E0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(0).Children.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Armour Wrath\"\nmsgstr \"Harag Vért\"\n\n#. Key:\t9EF4681A48ED6C909A4180BF823544BC\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(8).Children.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(8).Children.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Do you need help?\"\nmsgstr \"Szükséged van segítségre?\"\n\n#. Key:\t9F3BC08D46169E8C4BB788893FFDBCD4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_68.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_68.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Yes.\"\nmsgstr \"Igen.\"\n\n#. Key:\tA10EF7404139EE7FE638BCA272C0B2CA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_71.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_71.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Destroy them if you can.\"\nmsgstr \"Pusztítsd el őket, ha tudod.\"\n\n#. Key:\tA13C1A6B4F187C1A3F682088B9CC9A6F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_23.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_23.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Didn't look too intelligent to me...\"\nmsgstr \"Nekem nem tűntek túl intelligensnek.\"\n\n#. Key:\tA28429434B394861A6E4D084CE5C243F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_61.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_61.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I could but I don’t think you would like it.\"\nmsgstr \"Tudnék, de nem olyan lenne, aminek örülnél.\"\n\n#. Key:\tA2CBB6914F66C9963AFD34A21378EAA7\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_103.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_103.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"With this last one I have all my memories back.\"\nmsgstr \"Most már minden emlékem megvan.\"\n\n#. Key:\tA33780CE4B9EABF54F612DBFCEB4B890\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I wonder if they will end like us.\"\nmsgstr \"Vajon ők is úgy végzik, mint mi?\"\n\n#. Key:\tA47024E844A13837A8FFFBB1EFA65633\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_44.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_44.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Though I forgot the reason.\"\nmsgstr \"De már nem emlékszem rá, miért fontos ez.\"\n\n#. Key:\tA4E91A924BA53F0A000CDB9FC351DDBA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_60.Text\n#. Key:\tB4F5B2E6479E0E1ACDADD8A40E21FB98\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_59.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_59.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_60.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Could you create a stronger body for me?\"\nmsgstr \"Tudnál készíteni nekem egy erősebb testet?\"\n\n#. Key:\tA50F6A7B4A65712F990406B84E2AE072\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_98.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_98.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Thank you! I remember more and more.\"\nmsgstr \"Köszönöm! Egyre több dologra emlékszem.\"\n\n#. Key:\tA586F33F460BD066761AAEBD18666F78\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_82.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_82.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Bring me more so that I can remember!\"\nmsgstr \"Hozz még kristályt, hogy többre emlékezzek!\"\n\n#. Key:\tA8A9ACBA47419C57AAA06098F7F91AD3\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_83.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_83.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Let me touch it! Hmmm...\"\nmsgstr \"Hadd nézzem! Hmmm...\"\n\n#. Key:\tAA5F0D5541366675A1D1819FDBDFA569\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"What happened to you?\"\nmsgstr \"Mi lett veletek?\"\n\n#. Key:\tAD380C5F4F549229611DD9A79C7CD07E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_79.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_79.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"She was from the Human Realm. I liked her better than the other human.\"\nmsgstr \"Az Emberek Világából való volt. Őt kedveltem, nem olyan volt, mint a többi ember.\"\n\n#. Key:\tAE0D1C714FFCFCA51ACCD3A01D6C7FF5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_125.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_125.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Yes, I felt his presence disappearing.\"\nmsgstr \"Igen, éreztem a jelenlétét megszűnni.\"\n\n#. Key:\tAE6B02664FEE60818E0D32B7939907F8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_106.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_106.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Now I have all my memories back.\"\nmsgstr \"Minden emlékem megvan most már.\"\n\n#. Key:\tB7638E004540ADC59420A5AA614C225D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_75.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_75.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I’ve destroyed the Golems near the Tomb.\"\nmsgstr \"Elpusztítottam a Gólemeket a Sír környékén.\"\n\n#. Key:\tB86428C143F7BBBC4A7B9A91C05F3D15\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"They are doomed.\"\nmsgstr \"Kudarcra vannak ítélve.\"\n\n#. Key:\tBB7DE71F44FE995BA4AF4C9F5E19961F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_46.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_46.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I try to create an Essence which resists Ruin. If it works it could stop Ruin.\"\nmsgstr \"Próbálok létrehozni valamit, ami ellenáll a Fertőzésnek. Ha sikerülne, megállíthatnám a Fertőzést.\"\n\n#. Key:\tBCF49E21489280A32F859B9A6C2A78D4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"What are you creature?\"\nmsgstr \"Mi vagy te?\"\n\n#. Key:\tBDEEB7C2474E308C66B832B41D839FC6\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_66.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_66.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Metal is good for spirits. Even rock is dangerous.\"\nmsgstr \"A vas jó a szellemhez. Már a kő is túl veszélyes.\"\n\n#. Key:\tC0CAE1B14D0B0E551B690FB9F178A6EE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(10).Children.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(10).Children.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Memory Crystals\"\nmsgstr \"Emlék Kristály\"\n\n#. Key:\tC86A03B046B8F005B1C91EB0F68E4C1E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_121.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_121.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Here, take this! It might help if you need to face my creature!\"\nmsgstr \"Tessék! Ez jól jöhet, ha szembe akarsz szállni az alkotásommal.\"\n\n#. Key:\tCA35E144421C5594346DC9954052E633\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_57.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_57.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"No way home.\"\nmsgstr \"Nincs hazaút.\"\n\n#. Key:\tCD223717428DAF54F5362BB744B6A633\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_53.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_53.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I reuse the old golems. Maybe that’s why I can’t succeed.\"\nmsgstr \"A régi gólemeket használom újra. Talán ezért nem jutok eredményre.\"\n\n#. Key:\tD06BA0C54CAA8E00ECAFBE9FAFBABE1F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Could you merge these iron pieces?\"\nmsgstr \"Össze tudnád forrasztani ezeket a vas darabokat.\"\n\n#. Key:\tD237C8514A69E0A7820941B9048B92DE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_90.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_90.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Here it is!\"\nmsgstr \"Tessék!\"\n\n#. Key:\tD2CEAC3040B9EBE5A98F249F60A7DAAA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(2).Children.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(2).Children.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Iron Key\"\nmsgstr \"Vas Kulcs\"\n\n#. Key:\tD935FD314471404BAECA54BC3227D6E2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_69.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_69.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"There are too many unsuccessful golems.\"\nmsgstr \"Túl sok a sikertelen Gólem.\"\n\n#. Key:\tDE3287A345E1E317061B45B64AAA0836\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_34.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_34.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Your words remind me of something. Something which was important.\"\nmsgstr \"A szavaid emlékeztetnek valamire. Valamire, ami régen fontos volt.\"\n\n#. Key:\tDEC8E5D548AECD6D48B449B51967301B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_115.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_115.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"One is guarded by my worst creation.\"\nmsgstr \"Az egyiket a legrosszabb alkotásom őrzi.\"\n\n#. Key:\tDEFA219E40FE5384D8B1F0A1CFD3AAD4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_80.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_80.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"She were... She said...\"\nmsgstr \"Ő itt... ő azt...\"\n\n#. Key:\tE13D5CCE41818BAC4A6E52A965B0AEF8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_101.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_101.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Look at this!\"\nmsgstr \"Nézd csak!\"\n\n#. Key:\tE1CB9ABE410B3C818283BB9325F3A456\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_32.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_32.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I create golems. You go on with your quest. Nothing else matters.\"\nmsgstr \"Én Gólemeket készítek. Te folytatod a küldetésed. Semmi más nem számít.\"\n\n#. Key:\tE2AAAA4648BE8A7E73C761BDF72EC82D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_54.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_54.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Ruin caused too much damage.\"\nmsgstr \"A Fertőzés túl nagy károkat okozott.\"\n\n#. Key:\tE483CAFF4F7EF5607AA0A58F47EEF892\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_31.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_31.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"You are right. We are what we do. That keeps us alive.\"\nmsgstr \"Igazad van. A tetteink határoznak meg minket. Azok tartanak életben.\"\n\n#. Key:\tE9899191454A678E7C61B0A55047A725\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_126.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_126.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I'm glad you managed to defeat him and yet...\"\nmsgstr \"Örülök, hogy sikerült legyőznöd, és mégis...\"\n\n#. Key:\tEA08D7B74E94A3D91DC825945916C312\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_102.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_102.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"One more Crystal for you!\"\nmsgstr \"Még egy Kristály!\"\n\n#. Key:\tEAF5836D4D35812F14EABFA43C849947\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_117.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_117.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I know what you are up to. I would like to help but I fear I can’t do much.\"\nmsgstr \"Tudom, mire készülsz. Szeretnék segíteni, de attól tartok, sokat nem tudok tenni.\"\n\n#. Key:\tEB0F70894E9A498111B9A9824589633B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I create Golems. I always did. I designed the most intelligent ones.\"\nmsgstr \"Gólemeket készítek. Mindig is ezt tettem. Én készítettem a legintelligensebbeket.\"\n\n#. Key:\tF0A1D18E463DCD0CADD67690F691481B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_27.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_27.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"There are some seeking a way to stop Ruin. They don't care about using spirits as slaves.\"\nmsgstr \"A Fertőzés ellenszerét keresik. Nem rabszolgának akarják a szellemeket.\"\n\n#. Key:\tF10E8A9243616A85F71C01B0E57A2CC8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_105.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_105.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"And this is for you!\"\nmsgstr \"Ez a tiéd.\"\n\n#. Key:\tF62B033A4054241E561B519B2AFFEBDB\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Do you mean those moving rock things out there?\"\nmsgstr \"Azokra a mozgó kő micsodákra gondolsz?\"\n\n#. Key:\tF783A4F44E12EDA97EDF08B60228ED06\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_109.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_109.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"She had heart, she cared about what’s going on here. For the others we were like some interesting study.\"\nmsgstr \"Neki volt szíve, őt tényleg érdekelte, mi történik velünk. A többieknek csak kísérleti alanyok voltunk.\"\n\n#. Key:\tF87968784C67FEEEBB78DBAD9D3C13F3\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_63.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_63.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"As for other materials I have no experience. Trust me you don’t want me to test out something on you for the first time.\"\nmsgstr \"A többi anyaggal nincs tapasztalatom. Hidd el, nem akarod, hogy rajtad próbáljak ki valamit, amit még nem csináltam.\"\n\n#. Key:\tF9B8793C470BFE672214E1B82AE01B4E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_24.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_24.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Knowledge is lost. We are all lost.\"\nmsgstr \"A tudás elveszett. Minden elveszett.\"\n\n#. Key:\tF9DB2D444ADAC7A5C22AEC914EC7955F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(7).Children.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(7).Children.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Artefacts\"\nmsgstr \"Varázstárgyak\"\n\n#. Key:\tFE7749AB4C91684B3438E7A1B5BF32D9\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_29.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_29.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"They can't do as they plan. Some of them don't even believe Ruin.\"\nmsgstr \"Nem következetesek. Sokuk nem is hisz a Fertőzésben.\"\n\n#. Key:\tFF2914834A91E2B6E8696FA828FC9F94\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_120.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_120.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Though it is guarded by the worst Golem I ever made: the Armour Wrath...\"\nmsgstr \"A gond, hogy a legrosszabb alkotásam őrzi. Harag Vért...\"\n\n#. Key:\t303FE4BA4765B90E9239FEB43AE2264C\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/DwarvenCatacombs/DO1Altar.DO1Altar:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Wizard/DwarvenCatacombs/DO1Altar.DO1Altar:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_DO1Altar\"\nmsgid \"Under section 1 of the first Act, an action of worship can not be aimed at any entity, god or divinity other than the Law itself.\"\nmsgstr \"Az első rész első paragrafusa alatt hit tárgya nem lehet jelenség, isten, létező, kivéve a Törvényt magát.\"\n\n#. Key:\t73BA4B474C4DCF6CD31469A9FF120D58\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/DwarvenCatacombs/DO1Altar1.DO1Altar1:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Wizard/DwarvenCatacombs/DO1Altar1.DO1Altar1:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_DO1Altar1\"\nmsgid \"Under section 2 of the first Act... ??? There is section 3 of the first act, one would assume.\"\nmsgstr \"A második rész második paragrafusa alatt... ??? Ott valószínűleg a második rész harmadik paragrafusa lesz.\"\n\n#. Key:\t0D939EC3462DBDE895AD9F80CD4A9B99\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/DwarvenOutpost/DO1Arrive1DeadDwarves.DO1Arrive1DeadDwarves:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Wizard/DwarvenOutpost/DO1Arrive1DeadDwarves.DO1Arrive1DeadDwarves:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_DO1Arrive1DeadDwarves\"\nmsgid \"So they were the dwarfs who lived here.\"\nmsgstr \"Szóval ezek a törpök laktak itt.\"\n\n#. Key:\t6E27805A491B0E0DEAC36F9189CA33F9\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/DwarvenOutpost/DO1Arrive1DeadDwarves.DO1Arrive1DeadDwarves:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Wizard/DwarvenOutpost/DO1Arrive1DeadDwarves.DO1Arrive1DeadDwarves:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_DO1Arrive1DeadDwarves\"\nmsgid \"I'm not sure why but I feel a bit of sorrow for them.\"\nmsgstr \"Nem tudom miért, de sajnálom őket.\"\n\n#. Key:\t7AD20FC74D56D0EE48CB5F92804EDAE5\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/DwarvenOutpost/DO1Arrive1DeadDwarves.DO1Arrive1DeadDwarves:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Wizard/DwarvenOutpost/DO1Arrive1DeadDwarves.DO1Arrive1DeadDwarves:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_DO1Arrive1DeadDwarves\"\nmsgid \"I wonder how you can tell them apart.\"\nmsgstr \"Érdekelne, hogy tudod megkülönböztetni őket.\"\n\n#. Key:\tA6EB230647E9F8D38877FCA10CDE4875\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/DwarvenOutpost/DO1Arrive1DeadDwarves.DO1Arrive1DeadDwarves:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Wizard/DwarvenOutpost/DO1Arrive1DeadDwarves.DO1Arrive1DeadDwarves:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_DO1Arrive1DeadDwarves\"\nmsgid \"I knew these ones. That's Gwin and Traga, there's Krug...\"\nmsgstr \"Ismerem őket. Az ott Gwin és Traga, az meg Krug...\"\n\n#. Key:\t2858D4314420FB59E8BDC18DB625DC1F\n#. SourceLocation:\t/Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_6.SpeechSequence(1).SpeechSequence.Text\n#: /Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_6.SpeechSequence(1).SpeechSequence.Text\nmsgctxt \"Dialogue_DO1Gate\"\nmsgid \"I think you may mistranslated a word or two...\"\nmsgstr \"Szerintem néhány szót félrefordítottál.\"\n\n#. Key:\t2C08483A26080F0A003A02ADBE7A7D64\n#. SourceLocation:\t/Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_7.SpeechSequence(2).SpeechSequence.Text\n#: /Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_7.SpeechSequence(2).SpeechSequence.Text\nmsgctxt \"Dialogue_DO1Gate\"\nmsgid \"Dwarven letters are so similar...\"\nmsgstr \"A Törp betűk annyira hasonlóak...\"\n\n#. Key:\t2C09D69026080F0A003A02ADBE7A7D4E\n#. SourceLocation:\t/Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_8.SpeechSequence(2).SpeechSequence.Text\n#: /Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_8.SpeechSequence(2).SpeechSequence.Text\nmsgctxt \"Dialogue_DO1Gate\"\nmsgid \"Dwarven language is stupid, these signs could mean anything!\"\nmsgstr \"A Törp nyelv annyira eszement! Ezek a jelek bármit is jelenthetnek!\"\n\n#. Key:\t3D6EF5724190CE0AE579D69677BB8EAE\n#. SourceLocation:\t/Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_DO1Gate\"\nmsgid \"Associate!\"\nmsgstr \"Munkatárs!\"\n\n#. Key:\t4758A32043FC23B4DC3D82B35EFB0D24\n#. SourceLocation:\t/Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_DO1Gate\"\nmsgid \"The Doors of Dwar — Lord of Dwartown. Speak, associate, and enter.\"\nmsgstr \"Tpör Kapuja — Tpörváros Ura. Mond, munkatárs, és lépj be.\"\n\n#. Key:\t475CE3E94BA77F7596A7D8931D4D16C7\n#. SourceLocation:\t/Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_7.SpeechSequence(1).SpeechSequence.Text\n#: /Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_7.SpeechSequence(1).SpeechSequence.Text\nmsgctxt \"Dialogue_DO1Gate\"\nmsgid \"Are you sure that is what you just read?\"\nmsgstr \"Biztos vagy benne, hogy ezt jelenti?\"\n\n#. Key:\t530C8841437C531647717B8B0BC07210\n#. SourceLocation:\t/Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_8.SpeechSequence(1).SpeechSequence.Text\n#: /Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_8.SpeechSequence(1).SpeechSequence.Text\nmsgctxt \"Dialogue_DO1Gate\"\nmsgid \"Nice try...\"\nmsgstr \"Ügyes próbálkozás...\"\n\n#. Key:\t543858DE49FD03BF4F94C3BA47912E5E\n#. SourceLocation:\t/Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_9.SpeechSequence(1).SpeechSequence.Text\n#: /Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_9.SpeechSequence(1).SpeechSequence.Text\nmsgctxt \"Dialogue_DO1Gate\"\nmsgid \"I have to practice my Dwarven a bit more...!\"\nmsgstr \"Még egy kicsit csiszolnom kell a törpömön.\"\n\n#. Key:\t5923FB9C4DC255ABAA6059B64B806802\n#. SourceLocation:\t/Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_6.SpeechSequence(3).SpeechSequence.Text\n#: /Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_6.SpeechSequence(3).SpeechSequence.Text\nmsgctxt \"Dialogue_DO1Gate\"\nmsgid \"I am going to open this door somehow.\"\nmsgstr \"Valahogy kinyitom ezt az ajtót.\"\n\n#. Key:\t7CF38D834DB6A7265EDE19AD158BFEBF\n#. SourceLocation:\t/Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_7.SpeechSequence(0).SpeechSequence.Text\n#: /Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_7.SpeechSequence(0).SpeechSequence.Text\nmsgctxt \"Dialogue_DO1Gate\"\nmsgid \"I want a Schnauser with my Wienerschnitzel\"\nmsgstr \"Akarok egy Schnausert a Wienerschnitzelemmel.\"\n\n#. Key:\t86311C104780BDB8A170538987EF7226\n#. SourceLocation:\t/Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_8.SpeechSequence(0).SpeechSequence.Text\n#: /Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_8.SpeechSequence(0).SpeechSequence.Text\nmsgctxt \"Dialogue_DO1Gate\"\nmsgid \"And on the day the Ball is set free, the gate opens and happiness finds everyone...\"\nmsgstr \"És azon a napon, amelyen a Labda elnyeri szabadságát, az ajtó kinyílék, és mindenki boldogságban úszik vala...\"\n\n#. Key:\tCD68B2244B57CA37D2940499F440149B\n#. SourceLocation:\t/Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_DO1Gate\"\nmsgid \"Associwhat?\"\nmsgstr \"Munkami?\"\n\n#. Key:\tCE8E75E6422C068794CC91BDBA2C024A\n#. SourceLocation:\t/Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_6.SpeechSequence(2).SpeechSequence.Text\n#: /Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_6.SpeechSequence(2).SpeechSequence.Text\nmsgctxt \"Dialogue_DO1Gate\"\nmsgid \"Damn, my Dwarven is just not good enough, I have to practice a bit more...\"\nmsgstr \"Francba, a törpöm nem elég jó. Többet kell gyakorolnom.\"\n\n#. Key:\tCED9C6ED4B792FA939C759A79E4AB028\n#. SourceLocation:\t/Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_6.SpeechSequence(0).SpeechSequence.Text\n#: /Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_6.SpeechSequence(0).SpeechSequence.Text\nmsgctxt \"Dialogue_DO1Gate\"\nmsgid \"There is sauerkraut in my Lederhosen\"\nmsgstr \"Van egy sauerkraut a Lederhosenemben.\"\n\n#. Key:\tEC493B624D127AB87692BC983023FF18\n#. SourceLocation:\t/Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_7.SpeechSequence(3).SpeechSequence.Text\n#: /Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_7.SpeechSequence(3).SpeechSequence.Text\nmsgctxt \"Dialogue_DO1Gate\"\nmsgid \"There must be a way to open this door...\"\nmsgstr \"Valahogy biztosan ki lehet nyitni...\"\n\n#. Key:\t6F5AF3DD4E848650EE74449420A90A25\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/DwarvenCatacombs/DO1Tomb.DO1Tomb:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Wizard/DwarvenCatacombs/DO1Tomb.DO1Tomb:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_DO1Tomb\"\nmsgid \"These are the orders of the Chancellor of Dwartown, unjustly murdered by order of Duality.\"\nmsgstr \"Ezek a Tpörváros Kancellárjának rendeletei, akit a Kettősség rendje igazságtalanul meggyilkoltatott.\"\n\n#. Key:\t949EBB7A4FCEA61BB9B3589CFCC53C2B\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/DwarvenCatacombs/DO1Tomb1.DO1Tomb1:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Wizard/DwarvenCatacombs/DO1Tomb1.DO1Tomb1:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_DO1Tomb1\"\nmsgid \"Here lies the testament of the order of Duality, justly murdered by the Chancellor of Dwartown's spirit.\"\nmsgstr \"Ez a Kettősség Rendfőnökének testamentuma, akit igazságosan gyilkoltatott meg a Tpörváros Kancellárjának kísértete.\"\n\n#. Key:\t110A2E27493EBAD78EE6E1B16F56912A\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E3/E3_Start.E3_Start:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E3/E3_Start.E3_Start:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_E3_Start\"\nmsgid \"I survived the Unknown. I know how to use the Device, but...\"\nmsgstr \"Megjártam az Ismeretlen Világot. Tudom, hogyan használhatom a Szerkezetet. És mégis...\"\n\n#. Key:\t2CB853A540A2B5BFD268DEAA124CEAD0\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E3/E3_Start.E3_Start:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Ending/E3/E3_Start.E3_Start:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_E3_Start\"\nmsgid \"I need to choose one last time. Once and for all.\"\nmsgstr \"Választanom kell. Egyszer, s mindenkorra.\"\n\n#. Key:\t416D47B6408622D8D01F61961C80ADD2\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E3/E3_Start.E3_Start:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E3/E3_Start.E3_Start:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_E3_Start\"\nmsgid \"I have already lost almost everything.\"\nmsgstr \"Annyi mindent elvesztettem már.\"\n\n#. Key:\t75F863B843B253E3586DE991CDE546EA\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E3/E3_Start.E3_Start:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Ending/E3/E3_Start.E3_Start:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_E3_Start\"\nmsgid \"And here I am again. Is this how it will end?\"\nmsgstr \"És újra itt vagyok. Így kell, hogy véget érjen?\"\n\n#. Key:\t77BC194943A148967299F68B3522C696\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E3/E3_Start.E3_Start:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Ending/E3/E3_Start.E3_Start:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_E3_Start\"\nmsgid \"Do I really have to lose everyone I met in the Ruined Realm?\"\nmsgstr \"Azokat is el kell veszítenem, akiket a Fertőzött Földön ismertem meg?\"\n\n#. Key:\tA50B792A4D68EC45BB9C3CBBF8836021\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E3/E3_Start.E3_Start:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Ending/E3/E3_Start.E3_Start:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_E3_Start\"\nmsgid \"Or would I only save them so that we can die together?\"\nmsgstr \"Vagy ha át is hozom őket, csak együtt halunk meg?\"\n\n#. Key:\tE43A08E14831EBDC50AFC0B4A3178817\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E3/E3_Start.E3_Start:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Ending/E3/E3_Start.E3_Start:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_E3_Start\"\nmsgid \"I can hear the people outside the tower. I don’t have much time.\"\nmsgstr \"Hallom az embereket a kastély falain túl. Nincs sok időm.\"\n\n#. Key:\t042B7F534C07B3EC75BA9BA8F0BA7926\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_5.Children(0).Children.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_5.Children(0).Children.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"Worthy?\"\nmsgstr \"Méltó?\"\n\n#. Key:\t05E334DE42BAA89837B78B8F0F1CBD93\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"Get some rest and try again later.\"\nmsgstr \"Pihenjen egy kicsit, majd később újra próbálkozhat.\"\n\n#. Key:\t0BD769F745B35A106C7C0A83F6F9F246\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"All right so you just teleported me to this... what is this place?\"\nmsgstr \"Jól van, szóval áthoztál ebbe a... mi ez a hely?\"\n\n#. Key:\t0C9ECC3745963AB1D1FB6487E97513F9\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_24.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_24.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"So right now this is the most proper place to test your Worthiness.\"\nmsgstr \"Jelenleg ez a legalkalmasabb hely a Méltóság tesztelésére.\"\n\n#. Key:\t1401CBDA425076C6AE74C9BF4558D8DD\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"You are not Worthy!\"\nmsgstr \"Nem Méltó!\"\n\n#. Key:\t21C3C1394F39821BC10FFFBE157AC5CF\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"Giving up is not an option.\"\nmsgstr \"Nem adhatja fel.\"\n\n#. Key:\t2E7222EA4858A0ADE9CE3C84CA27B993\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_5.Children(3).Children.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_5.Children(3).Children.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"Skip\"\nmsgstr \"Kihagyom\"\n\n#. Key:\t31BEA1764BA337B32B8038B31BE69C29\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"Farewell! I need to go now.\"\nmsgstr \"Viszlát, mennem kell.\"\n\n#. Key:\t36B9EA924E623AFE9BF0B98402235EA4\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"Focus on the trial!\"\nmsgstr \"Koncentráljon a Próbára!\"\n\n#. Key:\t4A4A86684E5C5742A70FE383461AD89C\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"Venture further down into the Sewer! You will find the answer.\"\nmsgstr \"Haladjon mélyebbre a Csatornában. Megtalálja a válaszokat.\"\n\n#. Key:\t54CA97394FDC12D0370C54995094819E\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"This trial will test your limits!\"\nmsgstr \"A Próba felméri, mire képes.\"\n\n#. Key:\t5D820AA647AE2540DE6C2D8D6F6BF88A\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_5.Children(4).Children.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_5.Children(4).Children.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"Give seat\"\nmsgstr \"Szék\"\n\n#. Key:\t5F6629ED4E0857BBBA46ED9C51306215\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_5.Children(2).Children.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_5.Children(2).Children.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"Restore\"\nmsgstr \"Gyógyítás\"\n\n#. Key:\t618B587743F2F432D9D487AE0E909166\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"What?\"\nmsgstr \"Mi?\"\n\n#. Key:\t61D61006436DD6659A8846932697971A\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"Yes, you are!\"\nmsgstr \"Igen!\"\n\n#. Key:\t6225912A49C32068D10ADB9C31A6BA3E\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"Of course!\"\nmsgstr \"Természetesen!\"\n\n#. Key:\t7DD5FF4D47DF6A461D44DDBA056A4100\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"I shall yield you to the right path!\"\nmsgstr \"Utat kell nyitnom Ön előtt!\"\n\n#. Key:\t8C3F3A364544B13A2C6687A99E6A792B\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"I'm fed up with your trial! Just teleport me back.\"\nmsgstr \"Elegem van a próbádból! Csak vigyél vissza.\"\n\n#. Key:\t903D03CE41FD835E75059587288D9A1B\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_23.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_23.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"There used to be an Arena here to test the Adventurers of the Realm, but it has been flooded with water for a hundred years.\"\nmsgstr \"Egykor állt itt egy Aréna, melyben a Rúna Rend Kalandozóinak képességeit mértük fel. Sajnos pár évszázada elöntötte a víz.\"\n\n#. Key:\t96C9A8DA496C0A8476E35AB942BE5EED\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"Am I Worthy?\"\nmsgstr \"Méltó vagyok?\"\n\n#. Key:\t9826B62E48A67772A1850CADF1A83729\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_5.Children(1).Children.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_5.Children(1).Children.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"Where are we?\"\nmsgstr \"Hol vagyunk?\"\n\n#. Key:\t9A94E4FC46E3896BE05136A2A9EA4AF5\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_27.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_27.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"We don't have time for this now.\"\nmsgstr \"Erre most nincs idő.\"\n\n#. Key:\t9B9B02AF404F9B8B9D8722A9006FC907\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"These are the remnants of the Ancient Sewer.\"\nmsgstr \"Ez itt, ami megmaradt az Ősi Csőrendszerből.\"\n\n#. Key:\tAAB9F101475D1407B58BECB2DA5E508D\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"So how am I supposed to complete your Trial?\"\nmsgstr \"Na jó, hogy kéne teljesítenem a Próbát?\"\n\n#. Key:\tAD3BADD6499C01410511E68C86F337C8\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"Your Worthiness has to be proven.\"\nmsgstr \"Bizonyítania kell a Méltőságát.\"\n\n#. Key:\tC0BA510B4875AD24C53663B01964B309\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"Go now, the Trial awaits you!\"\nmsgstr \"Induljon! Várja a Próba!\"\n\n#. Key:\tC252181740C4E256EDEB29B6B552BDD2\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"I'm tired, I will need some time to recover.\"\nmsgstr \"Fáradt vagyok, kell egy kis idő, még összeszedem magam.\"\n\n#. Key:\tCCD8D1DD4859B067482612A3A9F32C06\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_5.Children(5).Children.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_5.Children(5).Children.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"Leave\"\nmsgstr \"Távozok\"\n\n#. Key:\tCE0C3EBD41F17E82F8CF0E8D5E5E9F17\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"The Worthiness is strong in this one...\"\nmsgstr \"A Méltóság erős Önben.\"\n\n#. Key:\tD229B47146585D051BEFF493C53ED01B\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_26.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_26.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"Stop!\"\nmsgstr \"Állj!\"\n\n#. Key:\tF043B1BF47F617255071EC9DB44CB78A\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"You have proven yourself Worthy!\"\nmsgstr \"Bizonyította Méltóságát!\"\n\n#. Key:\tFBBCA0E043F139F203D62DAD1599143E\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"Your Worthiness has been proven again!\"\nmsgstr \"Ismételten bizonyította Méltóságát!\"\n\n#. Key:\tFE4F99AC4F23760ADD203083CA1497E3\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_25.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_25.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"I have found a...\"\nmsgstr \"Találtam egy...\"\n\n#. Key:\t00AD8B3D44461E4DBF800F92DDF0C6F5\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_Gatekeeper_AfterBattle\"\nmsgid \"What?! I understand that for a new gate to open one would have to prove something, but... in this case... I accept that...\"\nmsgstr \"Mi? Értem, hogy egy új Kapunyitáshoz megint bizonyítani kell, de jelen esetben... mármint most... azt elfogadom...\"\n\n#. Key:\t0EC6953C4F07CFF6B7A13A9BCF224550\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_Gatekeeper_AfterBattle\"\nmsgid \"Enough!\"\nmsgstr \"Elég!\"\n\n#. Key:\t237714F14DC3F9D33F10E6B7761E47C4\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_Gatekeeper_AfterBattle\"\nmsgid \"What a coincidence! I also happen to be heading in that direction.\"\nmsgstr \"Micsoda véletlen! Én is pont arra megyek.\"\n\n#. Key:\t28054AA74F9CEA976E653ABF5A5F5695\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_Gatekeeper_AfterBattle\"\nmsgid \"You can pass.\"\nmsgstr \"Átmehet.\"\n\n#. Key:\t3D5BAB214968DBB31BE03EBE32B2DE6C\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_Gatekeeper_AfterBattle\"\nmsgid \"Farewell my Ball Lord! May the Great Gate open for you when the time comes!\"\nmsgstr \"Viszlát, Labda Uram! A Nagy Kapu legyen kegyes, és nyíljon meg Ön előtt, ha eljő az idő!\"\n\n#. Key:\t4D497F814F476FFA7F2A66A937EAFF3E\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_Gatekeeper_AfterBattle\"\nmsgid \"Noooooo...\"\nmsgstr \"Neeeeee...\"\n\n#. Key:\t4FEA82084C2E2E09FE6699B2FB353E04\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_Gatekeeper_AfterBattle\"\nmsgid \"Could you just let me pass? Please?\"\nmsgstr \"Nem engednél át? Kérlek?\"\n\n#. Key:\t50005F6248946893250282B0B7D134F2\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_Gatekeeper_AfterBattle\"\nmsgid \"You have proved your Worthiness.\"\nmsgstr \"Bizonyította Méltóságát.\"\n\n#. Key:\t601E1BAC4E9C7A93B7A97AA787C14027\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_Gatekeeper_AfterBattle\"\nmsgid \"Farewell, Keeper!\"\nmsgstr \"Viszlát, Kapuőr!\"\n\n#. Key:\t758788864E716DB2EC9F57B3042DC129\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_Gatekeeper_AfterBattle\"\nmsgid \"Ask him to take you to Crossroad Cave.\"\nmsgstr \"Kérd meg, hogy vigyen Keresztút Kőhöz.\"\n\n#. Key:\t8170CF2C42A1894899BA98B33AB39A3F\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_Gatekeeper_AfterBattle\"\nmsgid \"Wait! What?\"\nmsgstr \"Várj! Mi?\"\n\n#. Key:\t86B7E3D34F2206BB44B0F88001F9E8BA\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_Gatekeeper_AfterBattle\"\nmsgid \"Then if you accept, let the trial begin!\"\nmsgstr \"Ha elfogadja, akkor kezdődjön a Próba!\"\n\n#. Key:\tCC7215014B87E0910413F1AEECE0492F\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_Gatekeeper_AfterBattle\"\nmsgid \"Where do you want to go, Sir? Command me.\"\nmsgstr \"Hová parancsol utazni, Uram? \"\n\n#. Key:\tD5FBCE5C4C97766EF3A852A2D96D1D30\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_Gatekeeper_AfterBattle\"\nmsgid \"Crossroad Cave!\"\nmsgstr \"Keresztút Kő!\"\n\n#. Key:\tE0032A09440BDE56BFAF2CBDBCFA2074\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_Gatekeeper_AfterBattle\"\nmsgid \"So be it!\"\nmsgstr \"Legyen!\"\n\n#. Key:\tE8148F28483300CCD24473A30C028235\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_Gatekeeper_AfterBattle\"\nmsgid \"Once you have proven Worthy.\"\nmsgstr \"Mihelyst bizonyította Méltóságát.\"\n\n#. Key:\t0BE62CA44198CAA4B4AF7D844B79EEC3\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_3.Children(2).Children.Text\n#. Key:\t17D2B5D7409FBE7F215265B5A8CBF8F8\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_21.Children(2).Children.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_21.Children(2).Children.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_3.Children(2).Children.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"Leave\"\nmsgstr \"Távozok\"\n\n#. Key:\t2BFD355626080F0A003A025ABE793045\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_21.Children(0).Children.Text\n#. Key:\t2BFEA3D826080F0A003A025ABE79300B\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_3.Children(0).Children.Text\n#. Key:\t2C027C7626080F0A003A025ABE793F5F\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_18.Children(0).Children.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_18.Children(0).Children.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_21.Children(0).Children.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_3.Children(0).Children.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"Accept Challenge\"\nmsgstr \"Elfogadom a kihívást\"\n\n#. Key:\t2EDD3BEF4707FD59FE1ACB9A105F7EFC\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_3.Children(1).Children.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_3.Children(1).Children.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"Give seat\"\nmsgstr \"Szék\"\n\n#. Key:\t4E4229704C95B2C73050E1AF65A29847\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"Did you come back to prove yourself?\"\nmsgstr \"Visszajött, hogy bizonyítson?\"\n\n#. Key:\t55B70B0345422648BB579C8D4E42FE86\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_18.Children(1).Children.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_18.Children(1).Children.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"Maybe later\"\nmsgstr \"Majd később\"\n\n#. Key:\t62E33EC84A508E57233A6A9AF6DCDFBC\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"Only if you prove yourself worthy one more time.\"\nmsgstr \"Ha még egyszer Méltónak bizonyul.\"\n\n#. Key:\t65A8C3BA420B4624960CBAB42930BB5F\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_13.Children(0).Children.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_13.Children(0).Children.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"Not fair\"\nmsgstr \"Ez nem igazságos.\"\n\n#. Key:\t688C407641B488D0FDC7F98D0F6CA826\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"Is that... is this really happening?\"\nmsgstr \"Ez most... tényleg ez történik?\"\n\n#. Key:\t77A739594D7ADA997DD300A7EE270D8F\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"I have found a seat that fits your size.\"\nmsgstr \"Találtam egy széket, ami méretben passzol hozzád.\"\n\n#. Key:\t8C9BCD2044EE9C5F4826D0B5C5CE22D4\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"Now... are you ready to prove yourself?\"\nmsgstr \"Akkor... készen áll, hogy bizonyítson?\"\n\n#. Key:\t8E33C12A42E9EAEDC20CD3B97F3AF9B2\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"Yes, I can.\"\nmsgstr \"Igen, tudok.\"\n\n#. Key:\t91849BD64325E5B9D8A366921D4D1AA9\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"The best challenges were set aside just for you!\"\nmsgstr \"A legmerészebb kihívásokat félre fogom tenni az Őn számára.\"\n\n#. Key:\t97D5940549A753A94A9F5AB46CCE14AF\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"I myself shall test your worthiness.\"\nmsgstr \"Magam tesztelem a Méltóságát.\"\n\n#. Key:\t9A158FA74FF1D9F99F5477856927AC90\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"I will make no exceptions! Your generous act gave me back my spirit. From now on I pledge to perform my task even better.\"\nmsgstr \"Nem ingok meg! Nemes cselekedete példaértékű a számomra. Mostantól még tökéletesebben végzem majd a munkámat.\"\n\n#. Key:\tA3863AD64404451005ECE392B123FFAE\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"Errr... maybe a bit later.\"\nmsgstr \"Ööö... talán később.\"\n\n#. Key:\tAB2F0FFA45E0AF42B6035FA3D1F2D8DB\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"I am truly impressed. I will never forget about your kindness.\"\nmsgstr \"Igazán meghatódtam. Soha nem feledem kedvességét.\"\n\n#. Key:\tB284259646C0236570CF489DDCD88A29\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"Are you ready to prove yourself?\"\nmsgstr \"Készen áll, hogy bizonyítson?\"\n\n#. Key:\tB57F0D0442C167DADE576A9CBD2B3E96\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"Thank you! You can have this RuneStone as a compensation.\"\nmsgstr \"Köszönöm! Fogadja el ezt a Rúna Követ, csak hogy én is adhassak valamit.\"\n\n#. Key:\tB5F8117A4514A4207059EF8CD1C59420\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"All right, let's do it!\"\nmsgstr \"Rendben, csináljuk!\"\n\n#. Key:\tC7DFED0F43E17F90C02E3D94D6F24200\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"What? Can't you just open that gate?\"\nmsgstr \"Mi? Nem tudnád csak simán nyitni egy átjárót?\"\n\n#. Key:\tCC1CBB8E4F710B337B3BCC8CB01DB8CE\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"Well that's very... kind of you, I guess.\"\nmsgstr \"Hát, ez... nagyon kedves, gondolom.\"\n\n#. Key:\tDE0225744DA0777DC12392ABB187D653\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"Keeper! Can you open a Portal?\"\nmsgstr \"Kapuőr! Meg tudsz nyitni egy Átjárót?\"\n\n#. Key:\tDF53D02F4A6CD307A559E5BADBEF22FA\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_13.Children(1).Children.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_13.Children(1).Children.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"You are welcome\"\nmsgstr \"Szívesen\"\n\n#. Key:\tF0A6481A46B5FC65944D35ABFE94FA7E\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_21.Children(1).Children.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_21.Children(1).Children.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"Give Seat\"\nmsgstr \"Szék\"\n\n#. Key:\tFF3C850143B6609D7B1B878B8DEB8A13\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"This is your final trial.\"\nmsgstr \"Ez a végső próba.\"\n\n#. Key:\t018CF7BC4272B09AF7B646B0F9B2EB11\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_55.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_55.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"How did it happen? How was everything destroyed?\"\nmsgstr \"Hogy történt? Hogy pusztult el minden?\"\n\n#. Key:\t0BF674C94942E4E32FCB09BD7E7059B0\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_23.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_23.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"Those who stayed died.\"\nmsgstr \"Akik maradtak, meghaltak.\"\n\n#. Key:\t1BFE1DBE471281F60970F8BEBFDD6E40\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"It’s nice of the Mirror that he still remembers me. Could you give this flower to him to express my thankfulness?\"\nmsgstr \"Kedves a Tükörtől, hogy még mindig emlékszik rám. Elvinnéd neki ezt a virágot, hálám jeléül?\"\n\n#. Key:\t2158D7A1470944D529FF138AB883DC10\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"Who lived in this Realm? Where are they now?\"\nmsgstr \"Kik éltek itt? Hol vannak most?\"\n\n#. Key:\t2CCCBA97402EEFD5248D929680B0FF01\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_26.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_26.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"What was the Realm like before?\"\nmsgstr \"Milyen volt a város régebben?\"\n\n#. Key:\t32DA4503499D5A01CB1E7DA7B51B4EB5\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_29.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_29.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"Majestic castles and towers up until the sky. The air fresh, the sun shining.\"\nmsgstr \"Pompás kastélyok, kecses tornyok, csúcsaik a kék eget hasították. A levegő tiszta, ragyogó napsütés.\"\n\n#. Key:\t35903E9F471EECEC779D879565E189B6\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_12.Children(1).Children.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_12.Children(1).Children.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"Who lived here?\"\nmsgstr \"Kik éltek itt?\"\n\n#. Key:\t3AD2CA8148AA6397B3D8818063269D67\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_14.Children(1).Children.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_14.Children(1).Children.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"No way\"\nmsgstr \"Kizárt\"\n\n#. Key:\t3D4AF37842FD602384F0C79F2949BD07\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_14.Children(0).Children.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_14.Children(0).Children.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"Of course\"\nmsgstr \"Persze\"\n\n#. Key:\t41B0D00048A85B7122834B8F731AA8B4\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_25.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_25.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"Ruin preserves them. They can’t get old and die. Some of them are still visiting these parts of the Realm, but they no longer know what they are looking for.\"\nmsgstr \"A Fertőzés konzerválja őket. Nem öregednek, és nem halnak meg. Néhányuk időről-időre ide téved, de már maguk sem tudják, mit keresnek itt.\"\n\n#. Key:\t47D0395F4DD63A6E2F68018719DC2CCD\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"Thank you!\"\nmsgstr \"Köszönöm!\"\n\n#. Key:\t57614F674FD8F9A5CF8CC0AFA4D57F37\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_12.Children(0).Children.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_12.Children(0).Children.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"Magic Mirror\"\nmsgstr \"Varázstükör\"\n\n#. Key:\t5B00385B409CA39C5F2AFDA0E75EC4A0\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"I'm not a postman. Find someone else!\"\nmsgstr \"Nem postás vagyok. Kérj meg valaki mást!\"\n\n#. Key:\t5C83B0604CB1616D07BE209C08AE57B6\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_27.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_27.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"It was a wonderful world, full of life and joy.\"\nmsgstr \"Csodálatos hely volt, tele élettel és nevetéssel.\"\n\n#. Key:\t66409DBC4D55F6190D6F429F81CE7C0F\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_12.Children(2).Children.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_12.Children(2).Children.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"Realm's past\"\nmsgstr \"Város múltja\"\n\n#. Key:\t6728BD15433EBCF47B42DA8D84F3777C\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"I'll remember you!\"\nmsgstr \"Nem feledlek!\"\n\n#. Key:\t764C9E864C4C345638C2A2B4019CE5FA\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"Sure, I will deliver the flower!\"\nmsgstr \"Persze, átadom a virágot!\"\n\n#. Key:\t7F42828D4976A3366581BE9E067F3982\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_24.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_24.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"Those who escaped changed in body and mind.\"\nmsgstr \"Akik kijutottak, megváltoztak, testben és szellemben egyaránt.\"\n\n#. Key:\t858E8AD741D48CFB58B94ABA5A6FCE9A\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"No problem. It doesn’t matter anyway.\"\nmsgstr \"Semmi gond. Egyébként sem olyan fontos.\"\n\n#. Key:\t86DBF2164E3B1C4057320E8FC526AE5F\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_12.Children(3).Children.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_12.Children(3).Children.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"Cataclysm\"\nmsgstr \"Kataklizma\"\n\n#. Key:\t8C0E746A4C00A7B4792706A042588AA3\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_58.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_58.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"Until one day many of the imprisoned spirits broke loose from the golem bodies.\"\nmsgstr \"Aztán egy nap a bebörtönzött szellemek egy része kiszabadult a Gólem testből.\"\n\n#. Key:\t8DCB54DC429D8E328B791FA18261EBE4\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_30.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_30.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"Until it was all gone.\"\nmsgstr \"Amíg mind oda nem lett.\"\n\n#. Key:\t933737274ACAC51A980A6985E9B985D2\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"I am here so that the past is not forgotten until the very end. Have some rest and remember!\"\nmsgstr \"Azért vagyok, hogy a múlt ne merüljön feledésbe, mielőtt a jelen és a jövő elenyészik. Pihenj meg, és emlékezz!\"\n\n#. Key:\t9A6C35C143F4B6845772D4AF6C4C6213\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_56.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_56.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"The Golem Makers went too far. They made thousands and thousands of golems.\"\nmsgstr \"A Gólem Készítők túl messzire mentek. Sok ezer, sok tízezer Gólemet készítettek.\"\n\n#. Key:\t9E254E4D4CA6D256A7EC8CA8ADC6EF19\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"Would you like to hear some other tales?\"\nmsgstr \"Szeretnéd, ha másról is mesélnék?\"\n\n#. Key:\tAC50E6794072B525FD9144AB9B722F74\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_57.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_57.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"They always cared about the new ones and forgot about the obsolete ones.\"\nmsgstr \"Mindig csak az újakkal foglalkoztak, a régiekről megfeledkeztek.\"\n\n#. Key:\tC03F20E6477984A6691145A40535FBBD\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_60.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_60.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"Is there anything else you want me to remember?\"\nmsgstr \"Van még valami, amit felidézhetek a számodra?\"\n\n#. Key:\tC9E74A374ED9F47999AA56BD16466899\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"The streets were clear and bright, trees and flowers everywhere.\"\nmsgstr \"Az utak tiszták és rendezettek, fák, virágok mindenütt.\"\n\n#. Key:\tCF0209FF4BC57A750F52F2B3CC710A6E\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"I think it likes you.\"\nmsgstr \"Azt hiszem, kedvel téged.\"\n\n#. Key:\tD11D82FA4AE733D55DCBA692A2A3C0C7\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"Now they are all gone.\"\nmsgstr \"De már mind odalettek.\"\n\n#. Key:\tD88C72AE460756D4B619D7B8F924C7BB\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"Oh, there were many: proud, wise, brave, clever and majestic.\"\nmsgstr \"Oh, sokan voltak: büszkék, bátrak, okosak és előkelők.\"\n\n#. Key:\tDEA408E54892798F0112B0A92EE34D3A\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_12.Children(4).Children.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_12.Children(4).Children.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"Leave\"\nmsgstr \"Távozok\"\n\n#. Key:\tEA384D06419AAB835765CF8D6ECE6495\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_59.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_59.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"They are what is now called Ruin. The power which is destroying the Realm.\"\nmsgstr \"Most úgy hívják őket, Fertőzés. Az erő, ami elpusztítja a Világot.\"\n\n#. Key:\tED8571C94BCCF0F083CAD2A7439C10AA\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"I’ve met with a Magic Mirror who showed a picture of you.\"\nmsgstr \"Találkoztam egy Varázstükörrel. Mutatott rólad egy képet.\"\n\n#. Key:\tF5C7F8254D29767753AEA3AB446B9B6E\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"I've got to go now.\"\nmsgstr \"Mennem kell.\"\n\n#. Key:\tF9E140154471CC466095ADBFF652E94D\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"Ask if you need to know more. I'll remember.\"\nmsgstr \"Kérdezz, ha többet szeretnél tudni. Emlékezni fogok.\"\n\n#. Key:\t04527B3745611117185CC09C4CD9018E\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"That’s more like it!\"\nmsgstr \"Ez már jobb!\"\n\n#. Key:\t11C31D4D4DFD60259D68FCB3CD8E641E\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_13.Children(2).Children.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_13.Children(2).Children.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"Retreat\"\nmsgstr \"Visszavonulok\"\n\n#. Key:\t29C3FE594DDD364CEED5EA9304BFAC43\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"How can I prove that I'm worthy?\"\nmsgstr \"Hogy bizonyítsam, hogy Méltó vagyok?\"\n\n#. Key:\t2BC9EBB6451DB66B7767F1A0B663A06D\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"That’s awful, let’s try it in a different tone.\"\nmsgstr \"Ez borzasztó, nézzünk másik hangot.\"\n\n#. Key:\t2BD75DF026080F0A003A0178BE75C345\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"Behold traveler!\"\nmsgstr \"Állj, utazó!\"\n\n#. Key:\t302884BD4A306FB9614C51AF4790FAE4\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_13.Children(0).Children.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_13.Children(0).Children.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"How to prove?\"\nmsgstr \"Hogy bizonyítsak?\"\n\n#. Key:\t370AC3D04CB9F6E443CAC2A8E270F289\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"No problem I don't really want to pass that gate anyway.\"\nmsgstr \"Semmi gond, annyira nem akarok átmenni azon a kapun.\"\n\n#. Key:\t4E231ED94F0794AE6342A8A2C7644D51\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"I am the Gatekeeper. I will only open this door if you prove to be worthy.\"\nmsgstr \"Én a Kapuőr vagyok. Csak akkor nyithatom ki Önnek a kaput, ha Méltónak bizonyul.\"\n\n#. Key:\t4F30265A4D22C52371CC8E9E188B2718\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"Open, now!\"\nmsgstr \"Nyisd ki!\"\n\n#. Key:\t56B5D73646C6823598232BB3D2577305\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"Ask him to open the door.\"\nmsgstr \"Kérd meg, hogy nyissa ki a kaput.\"\n\n#. Key:\t7A52E2E14341A8CDBD77A4A30DDA22E3\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_13.Children(1).Children.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_13.Children(1).Children.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"Please let me in\"\nmsgstr \"Megkérem\"\n\n#. Key:\t835098BD4F5D14FAACF1209850607E04\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_15.Children(0).Children.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_15.Children(0).Children.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"Accept Challenge.\"\nmsgstr \"Elfogadom a kihívást\"\n\n#. Key:\t83E15A3C46A1D2D4CE4FDDBE81130106\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"No way! Nobody can skip the Trial!\"\nmsgstr \"Nem tehetem! Senki sem hagyhatja ki a Próbát!\"\n\n#. Key:\t86D9667C43253BBFFA43E4ABED24369B\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"Still not...\"\nmsgstr \"Még mindig nem...\"\n\n#. Key:\t94A0124A401BA0CD029255B7D01E087E\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"There is no turning back now. The Trial awaits you!\"\nmsgstr \"Már nincs visszaút. A Próba Önre vár!\"\n\n#. Key:\t964E5DC7491720F8C3EA53936CBC1DEA\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"The Trial will test you!\"\nmsgstr \"A Próba majd felméri képességeit!\"\n\n#. Key:\tA38AC02A4C258F538AC26686207D505F\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"...\"\nmsgstr \"...\"\n\n#. Key:\tABA8061E4F631608D712A0BDBC6D90D1\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"Ah, you can't speak! Hmm... Try now!\"\nmsgstr \"Ah, nem tudsz beszélni! Hmm... Próbáld most!\"\n\n#. Key:\tDA4C66AB4F7798DAD95EC5B83D422A03\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"Could you just let me pass this time?\"\nmsgstr \"Nem lehet, hogy most még csak úgy átengedsz?\"\n\n#. Key:\tF09A0C3F4BEA6AFBC9EE52AEB6A740AB\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"Open that gate, Keeper!\"\nmsgstr \"Nyisd ki, Kapuőr!\"\n\n#. Key:\tF32B1FEC4BB33670D336D28832F04312\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"I can only open this door for those who prove worthy.\"\nmsgstr \"Csak annak nyithatom ki, aki Méltónak bizonyul.\"\n\n#. Key:\tFB74F24C4B8C2E6B4368B19D77F71606\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"Please, open the...\"\nmsgstr \"Kérlek, nyisd ki...\"\n\n#. Key:\t0BAD4DEA4009823275249FB31070D002\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_7.Children(1).Children.Text\n#. Key:\t2F2169444BBDC9843E1B7DAEDE7F5104\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_4.Children(1).Children.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_4.Children(1).Children.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_7.Children(1).Children.Text\nmsgctxt \"Dialogue_GGGateKeeper2\"\nmsgid \"Leave\"\nmsgstr \"Távozok\"\n\n#. Key:\t36FDC8384686644248F76B9EF8A22038\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_GGGateKeeper2\"\nmsgid \"Here we go again...\"\nmsgstr \"Újra itt...\"\n\n#. Key:\t3D7557464E3E19A1CF3447B555D4977D\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_GGGateKeeper2\"\nmsgid \"Well, of course.\"\nmsgstr \"Persze, természetesen.\"\n\n#. Key:\t5463C10D4C56C2CD40338A9E5C33D995\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_GGGateKeeper2\"\nmsgid \"You know the rules.\"\nmsgstr \"A szabályokat már ismeri.\"\n\n#. Key:\t6E1915BC4A79E949C10BDCAADDA1E481\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_7.Children(0).Children.Text\n#. Key:\tACC5EBF441036AE06D207281CBE054D9\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_4.Children(0).Children.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_4.Children(0).Children.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_7.Children(0).Children.Text\nmsgctxt \"Dialogue_GGGateKeeper2\"\nmsgid \"Accept Challenge\"\nmsgstr \"Elfogadom a kihívást\"\n\n#. Key:\tA5CD165646DA7D531D23F7AAE5B0D701\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_GGGateKeeper2\"\nmsgid \"I mean: You shall not pass unless you prove yourself worthy!\"\nmsgstr \"Úgy értem: Itt úgyse jut át, kivéve, ha méltónak bizonyul!\"\n\n#. Key:\tBABC111D4B5743B296E6AD84659E1910\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_GGGateKeeper2\"\nmsgid \"You shall not pass!!\"\nmsgstr \"Itt úgyse jut át!!\"\n\n#. Key:\tCAF6CA2C4159145B5FE684995956F155\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_GGGateKeeper2\"\nmsgid \"What?? I thought I will need to prove myself worthy.\"\nmsgstr \"Mi? Azt hittem, Méltónak kell bizonyulnom.\"\n\n#. Key:\t31B0B4214FE4324029BAB2A75CF7D1EA\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/GGSurviverNote.GGSurviverNote:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/GGSurviverNote.GGSurviverNote:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_GGSurviverNote\"\nmsgid \"'I made this statue to give me shelter from the Cataclysm. Only magic can keep it away.'\"\nmsgstr \"\\\"Ezt a szobrot azért készítettem, hogy megvédjen a Fertőzéstől. Csak a mágia tudja távol tartani.\\\"\"\n\n#. Key:\t852F18354CA9C8D46192CBBD14A325F7\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/GGSurviverNote.GGSurviverNote:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/GGSurviverNote.GGSurviverNote:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_GGSurviverNote\"\nmsgid \"'Cerulean is still safe. I managed to steal the Gem to open the Gate but I can’t use it.'\"\nmsgstr \"\\\"Mélykék Metropolisz még mindig biztonságos. Sikerült ellopnom a Zárat nyitó Követ, de nem tudom használni.\\\"\"\n\n#. Key:\tDF72F90C478E18CFE9211C85CEF9ECBF\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/GGSurviverNote.GGSurviverNote:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/GGSurviverNote.GGSurviverNote:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_GGSurviverNote\"\nmsgid \"'I am doomed.'\"\nmsgstr \"\\\"Végem.\\\"\"\n\n#. Key:\t04737EC246700D406DAB46BE8091D09C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_1.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_1.Children(0).Children.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Sure\"\nmsgstr \"Persze\"\n\n#. Key:\t09BB4D9F428A5390E5F2ABA019B3ACDC\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_34.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_34.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Help you?! This is a courthouse not some charity club!\"\nmsgstr \"Segítsek? Ez egy bíróság, nem valami jótékonysági klubb!\"\n\n#. Key:\t0C7D87814BD76EAFE2DCB19B973F0D82\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_52.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_52.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"You know I heavily rely on my abacus. But being a ghost and all I can’t really use it.\"\nmsgstr \"Nos, nagy hasznát vettem az abakuszomnak, de szellemként nem igazán tudok vele mit kezdeni.\"\n\n#. Key:\t0E3535844D16D540C576AC9889D237C8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"I’m looking for three artefacts. Do you know anything about them?\"\nmsgstr \"A Varázstárgyakat keresem. Tudsz róluk valamit?\"\n\n#. Key:\t0EB00CBB41338DE6294D6EAC2DE999B4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Actually it’s kinda awesome!\"\nmsgstr \"Valójában elég jó!\"\n\n#. Key:\t158F86F04D0040AA3D2814A674252E45\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Returning again and again is not a crime but maybe we should reconsider the Law regarding this statement.\"\nmsgstr \"Újra és újra visszajönni nem bűn, de lehet hogy ezzel kapcsolatban módosítani kellene a törvényeket.\"\n\n#. Key:\t15D395F84D3DBC3CCBC74988369A74DA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_27.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_27.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"The Law says many things about being dad but nothing about being dead...\"\nmsgstr \"A Törvény nem igazán tér ki arra, hogy milyen jogaid vannak halottként...\"\n\n#. Key:\t2487D3CC4FCE404BEC866287E2057B3F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"I can’t rest until the Case is solved.\"\nmsgstr \"Nem nyugodhatok, amíg az Ügy le nem zárult.\"\n\n#. Key:\t2D976CD148FB41389A53ED8E499822B4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_54.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_54.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Could you get me a ghost abacus?\"\nmsgstr \"Nem tudnál szerezni nekem egy szellem abakuszt?\"\n\n#. Key:\t2F25CC2042D67E3AFB6F3FB5E1DF624D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_38.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_38.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Sure whatever...\"\nmsgstr \"Aha, persze...\"\n\n#. Key:\t344253F4469C163E87496A97C193F0A8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_31.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_31.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"If you found her please escort her to the Room of the Law so that her vicious acts can be judged.\"\nmsgstr \"Ha látod, kérlek kísérd be a Bíróságra, hogy ítéletet mondhassunk gonosz tettei felett.\"\n\n#. Key:\t34D243A343CDFEA68F2FAB88A4190464\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_5.Children(2).Children.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_5.Children(2).Children.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"You are dead\"\nmsgstr \"Halott vagy\"\n\n#. Key:\t367BD6CD40B7364D09A19A9F5F833937\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Could you help me? I'm forced into this Realm by a Wizard.\"\nmsgstr \"Tudnál segíteni? Egy varázsló erőszakkal kényszerít ebbe a Világba.\"\n\n#. Key:\t3BD4BD5742532C2DB9536F9540EA3D75\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_32.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_32.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Ah, even the World will be over sooner than all our cases.\"\nmsgstr \"Áh, még a Világnak is hamarabb lesz vége, mint ennek az Ügynek.\"\n\n#. Key:\t45882C3C4470919D71E321BF5E1183B9\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_56.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_56.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"I've made you a Ghost Abacus.\"\nmsgstr \"Készítettem neked egy szellem abakuszt.\"\n\n#. Key:\t482C838F4E946005A3E4CAAB80DFE37F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_35.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_35.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"And being a Wizard is strictly forbidden! If I manage to prove you have some connection with that criminal Wizard I will judge you as well!\"\nmsgstr \"És varázslónak lenni szigorúan tilos. Ha kiderül, hogy bármilyen kapcsolatba állsz egy bűnöző varázslóval, téged is elítélünk!\"\n\n#. Key:\t489CE6C840D8C3430F07FCBC8BAF3F6B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_23.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_23.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"The Law never writes it would be forbidden to be a walking ball. Therefore it is not a problem.\"\nmsgstr \"A Törvény sehol sem említi, hogy tilos lenne sétáló labdának lenni. Úgyhogy gondolom ez nem probléma.\"\n\n#. Key:\t512723AF4B51C5A843BEACBEA5427877\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Staring like that is strictly forbidden!\"\nmsgstr \"Így bámulni szigorúan tilos!\"\n\n#. Key:\t5215675A4B0974C8993858B9F5D6A404\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"The Case of the Gnome traveller. A really complicated one.\"\nmsgstr \"A Gnóm Utazó esete. Borzasztóan komplikált.\"\n\n#. Key:\t6922D9F143A5295C7C2D22A71EA4125B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_29.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_29.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Makes sense...\"\nmsgstr \"Világos, mint a nap...\"\n\n#. Key:\t74955E464A85ED006FF47894FD09BD28\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_4.Text\n#. Key:\tE7F9297B4FF3956A965042AA9D870A07\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_37.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_37.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"The Law says that.\"\nmsgstr \"A Törvény így mondja.\"\n\n#. Key:\t74BCB9E04AB452BA2A11088F25DD2FED\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"I guess they forgot to tell you but work time is long over...\"\nmsgstr \"Úgy látom, elfelejtettek szólni, de már rég lejárt a munkaidő...\"\n\n#. Key:\t74F34750433EF722E89F8F85A871CE1B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_59.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_59.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Take this as a reward!\"\nmsgstr \"Fogadd el ezt fizetségként!\"\n\n#. Key:\t766B27FA455983F70AE1F4BA56F4C1B3\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_57.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_57.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"How wondrous! I’m sure this will reduce my research time with years!\"\nmsgstr \"Remek! Biztos vagyok benne, hogy ez évekkel csökkenti a kutatóidőt!\"\n\n#. Key:\t784D8662443EA775B9554EAEB4C6CB8F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"You are guilty for bouncing too loudly! Just like my uncle...\"\nmsgstr \"Bűnösnek találtattál túl hangos pattogás okán. Pont mint a bácsikám...\"\n\n#. Key:\t791A095948CFB22CCAF59EAFC60D74EA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_0.SpeechSequence(1).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_0.SpeechSequence(1).SpeechSequence.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"We had to reread all the rules to find out if there is anything about this.\"\nmsgstr \"Újra kellett olvasnunk az összes törvényt, hogy kiderüljön, van-e valami ezzel kapcsolatban.\"\n\n#. Key:\t7CBAE1084FC39423BBD706A9F939BB14\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"So what is this case you are working on?\"\nmsgstr \"Szóval, mi ez az úgy, amin dolgozol?\"\n\n#. Key:\t7DBA70D14A4EDDE22DABBBB75800865A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_5.Children(3).Children.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_5.Children(3).Children.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Help\"\nmsgstr \"Segíts\"\n\n#. Key:\t7DDD963C45C30134FA79CEAA1834C270\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_1.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_1.Children(1).Children.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"No way\"\nmsgstr \"Kizárt\"\n\n#. Key:\t7E1EAB78482CF915AF8A96BA8E0A47F1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Just give me some more time and I will prove that you are guilty.\"\nmsgstr \"Adj még egy kis időt, és bebizonyítom, hogy bűnös vagy.\"\n\n#. Key:\t7E2FD8D443438BEFF933D1BA0F691A41\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_1.SpeechSequence(2).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_1.SpeechSequence(2).SpeechSequence.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Such a tragic death! Now I need to start everything from the beginning!\"\nmsgstr \"Mily tragikus halál! Most mindent kezdhetünk elölről!\"\n\n#. Key:\t7EA289C94C6CF1E43AE0B291AD0A1133\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_30.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_30.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Yes, she is a criminal for inhabiting the body of a cat. That is strictly forbidden!\"\nmsgstr \"Igen, őt bűnösnek találtuk több ízbeni macsakatest birtoklásért. Az szigorúan tilos!\"\n\n#. Key:\t80596D1B4384F83D73655AB76B2FA2D0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Incorrect. It is not.\"\nmsgstr \"Téves. Nem az.\"\n\n#. Key:\t81C42F5340469CBB4AD780B01E7F02F8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_5.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_5.Children(1).Children.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Case\"\nmsgstr \"Ügy\"\n\n#. Key:\t830C84A74369239E2839638F8918E086\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_5.Children(4).Children.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_5.Children(4).Children.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Artefacts\"\nmsgstr \"Varázstárgyak\"\n\n#. Key:\t9090EFE44CB8D7F54F996B970D9A97D2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Don’t disturb me!\"\nmsgstr \"Ne zavarj!\"\n\n#. Key:\t90F79FAC440FB22F0A6BFCABE0963454\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_33.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_33.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"That’s very likely.\"\nmsgstr \"Ez elég valószínű.\"\n\n#. Key:\t9600587D4E3C5B6F2C120BBFB9D40D6A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"What?\"\nmsgstr \"Mi?\"\n\n#. Key:\t96945AA143EF1F1B7CE4C0B8EEE4096F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_51.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_51.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"All right I was just asking. It’s not forbidden. At least in this case.\"\nmsgstr \"Na jó, csak kérdeztem. Az nem tilos. Legalábbis ebben az esetben.\"\n\n#. Key:\t970DBE99476C7799B4B803B2EECE7E95\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"You are dead. Isn’t that a problem?\"\nmsgstr \"Nem gond, hogy halott vagy?\"\n\n#. Key:\t9B06B22F44D389959A3C99924145EAE7\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Do you know a girl called Lillian?\"\nmsgstr \"Ismersz egy Lillian nevű lányt?\"\n\n#. Key:\t9C1B37574F81FDF4D3F03890504E3490\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Well, to be honest it is.\"\nmsgstr \"Őszintén szólva, de, gond.\"\n\n#. Key:\t9EE15BCA450900DEFFB839856BA78E09\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_55.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_55.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"I’ll see what I can do...\"\nmsgstr \"Meglátom, mit tehetek...\"\n\n#. Key:\t9F3FBDE041EA6FDB7B30ECA1547E49A0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_0.SpeechSequence(3).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_0.SpeechSequence(3).SpeechSequence.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"We almost finished the process when the Gnome Traveller died of waiting.\"\nmsgstr \"Már majdnem az Ügy végére értünk, amikor a Gnóm meghalt végelgyengülésben.\"\n\n#. Key:\tA22CEEE34864BC25EECFF2BAED83789F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_18.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_18.Children(0).Children.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"It is\"\nmsgstr \"De, az\"\n\n#. Key:\tA69BCEA14AD8A07AC8CC35871548973A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_5.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_5.Children(0).Children.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Give Abacus\"\nmsgstr \"Abacus\"\n\n#. Key:\tA7B9690142A3832182C004A99797AB21\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_26.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_26.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"And how about being dead?\"\nmsgstr \"És milyen halottnak lenni?\"\n\n#. Key:\tA7EDDDCF423FF086BC0D0A891D232C87\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_0.SpeechSequence(0).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_0.SpeechSequence(0).SpeechSequence.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"He asked for permission to use the Railway. Which is really unusual. Before him only dwarves used the Railways.\"\nmsgstr \"Engedélyt kért a Vasút használatára. Ami eléggé szokatlan. Előtte csak Törpök használták a Vasutat.\"\n\n#. Key:\tA9FCBAD04E16A880C3E52AAA35864E35\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Respect the Law!\"\nmsgstr \"Tiszteld a Törvényt!\"\n\n#. Key:\tAA3210BC4B1C0875817CCDB5F4922AFA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_1.SpeechSequence(0).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_1.SpeechSequence(0).SpeechSequence.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"It’s not that simple. In his testament he asked us to bring his corpse home, on the railway.\"\nmsgstr \"Nem ilyen egyszerű. A végrendeletében azt kérte, a holttestét vonattal szállítsák haza.\"\n\n#. Key:\tAA9613C041229946AD0033806D77D398\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_49.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_49.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"What can I do for you?\"\nmsgstr \"Mit tehetek érted?\"\n\n#. Key:\tB2D504404A8475C7EFB445AFDA8597A9\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_5.Children(6).Children.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_5.Children(6).Children.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Leave\"\nmsgstr \"Távozok\"\n\n#. Key:\tB3A305B84320145E4C0437B7ED50C5B9\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_25.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_25.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"The Law doesn’t forbid walking for balls. I guess you are right then.\"\nmsgstr \"A törvény nem tiltja a sétát a labdák számára. Valószínűleg neked van igazad.\"\n\n#. Key:\tB3E56D56494153D0C17355A59EC3F0E6\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Rest... err... work in peace!\"\nmsgstr \"Nyugodj... izé... dolgozz békében!\"\n\n#. Key:\tB69AD6FC4D8373491561CFBCF26C2397\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_1.SpeechSequence(3).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_1.SpeechSequence(3).SpeechSequence.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Could you help me?\"\nmsgstr \"Tudnál segíteni?\"\n\n#. Key:\tBCFFF4F345E59362764C9AA6582C683C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_0.SpeechSequence(2).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_0.SpeechSequence(2).SpeechSequence.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"When we found out there are none, so we needed to create new rules. But for that we had to reread all the existing rules again.\"\nmsgstr \"Amikor rájöttünk, hogy nincs egy se, új szabályokat kellett készítenünk. De ehhez át kellett tanulmányoznunk alaposabban a meglévőket.\"\n\n#. Key:\tC5FDD0A14882D8F74A97B1BD53AFD4FE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_36.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_36.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"I don’t. But keep in mind if they were stolen and you find them you have to give them to the Dwarven King.\"\nmsgstr \"Nem tudok róluk semmit. De tartsd észben, hogy ha lopottak, és a birtokodba kerülnek, akkor át kell adnod őket a Törp Királynak.\"\n\n#. Key:\tC81E287C4B4EF5B5E77E25A480FC2AEE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_18.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_18.Children(1).Children.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Not at all\"\nmsgstr \"Egyáltalán nem\"\n\n#. Key:\tCCF4D5D04B8D4C57AAA75ABC5F9A1384\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_50.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_50.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"No, no, no! I have other things to do.\"\nmsgstr \"Nem, nem, nem! Van dolgom épp elég.\"\n\n#. Key:\tCD5EF4DE4D29CC774EB5A69A8A65CD95\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_5.Children(5).Children.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_5.Children(5).Children.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Lillian\"\nmsgstr \"Lillian\"\n\n#. Key:\tCFC9A6294B4D0653CA9B3384CBD2BC29\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_58.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_58.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Thank you! Thank you!\"\nmsgstr \"Köszönöm! Köszönöm!\"\n\n#. Key:\tCFEFA4DD4AFEF91C834684A49DFB5890\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_39.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_39.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"What crime did the Gnome commit?\"\nmsgstr \"Mit követett el a Gnóm?\"\n\n#. Key:\tD83C186746373C67E8877594AA3523B8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_53.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_53.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"When I touch it my fingers slip past the abacus, I can’t move it.\"\nmsgstr \"Ha el akarok tolni egy golyót, az ujjam egyszerűen átsiklik rajta.\"\n\n#. Key:\tE00518FA4279FE57E9640F9007E4BC35\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_44.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_44.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"I would call that case solved...\"\nmsgstr \"Erre mondanám, hogy Ügy megoldva...\"\n\n#. Key:\tE8F4BE4848BE2E257972D09391B0F296\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_1.SpeechSequence(1).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_1.SpeechSequence(1).SpeechSequence.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"We decided that Gnomes can use the Railway, but how about Gnome Corpses? That’s a totally different issue.\"\nmsgstr \"Arra a döntésre jutottunk, hogy a Gnómok használhatják a Vasutat, na de mi a helyzet a Halott Gnómokkal? Az egy teljesen eltérő eset.\"\n\n#. Key:\tEB5B1E474DCFFCF9A38190B8FFAB7C50\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"I guess the same rules apply.\"\nmsgstr \"Vajon halottként is tudsz élni a jogaiddal? Fogós kérdés.\"\n\n#. Key:\tEB5BFBDC40E1D6A1D5C054AD8B6424FD\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_24.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_24.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Hmmm... Let me see...\"\nmsgstr \"Hmmm, hadd nézzem...\"\n\n#. Key:\tEF50A43049824F390D61A3A58D44185A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"And you are a walking ball. Isn’t that a problem?\"\nmsgstr \"Te meg egy sétáló labda vagy. Az nem gond?\"\n\n#. Key:\t01E5D5DE4524C5AECBE8DAA5A5C3047D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_111.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_111.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Fishy warns you! This path is dangerous! Turn back! Explore other places!\"\nmsgstr \"Hali óva int! Ez az út veszélyes! Fordulj vissza! Fedezz fel másik utakat!\"\n\n#. Key:\t036B0B0E41C74704A5ED648091D58AB0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_65.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_65.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Long story short I almost reached the Outpost when my cargo went into a pothole and my wheel was broken.\"\nmsgstr \"Egy szó, mint száz, már majdnem elértem a Helyőrséget, amikor a szekerem belement egy gödörbe, és kitört az egyik kerék.\"\n\n#. Key:\t03B6BE674D69EF12EB862EB77CDC7F57\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_97.Text\n#. Key:\t4475043D4A9CFD057ED34FBB9695EC86\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_113.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_113.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_97.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Then I will give it for 10 Gold Coins.\"\nmsgstr \"Akkor odaadom 10 Aranyért.\"\n\n#. Key:\t0405D11C4961CFB7941F0F9727F80EAD\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_108.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_108.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"9 Gold I won't go any lower!\"\nmsgstr \"9 Arany, ennél lejjebb nem megyek!\"\n\n#. Key:\t069FA4C94559002699885EACD6422FC7\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_115.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_115.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Such an insult! How dare you?\"\nmsgstr \"Sértés! Hogy merészeled?\"\n\n#. Key:\t114F9B9345D0965FE6EFC592E29477FE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_54.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_54.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Wohoo! I have some really epic names just for you! Each name costs a Single Gold coin!\"\nmsgstr \"Húúú, van pár fenomenális nevem csak neked! Mindegyik egyetlen Aranytallérba kerül!\"\n\n#. Key:\t1164C89641A9E4970985919C8E86936E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(5).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(5).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Help me?\"\nmsgstr \"Segítesz nekem?\"\n\n#. Key:\t11E01CA843185266C441ACBC460A5B06\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_39.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_39.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Do you really want to help me?\"\nmsgstr \"Tényleg segíteni akarsz nekem?\"\n\n#. Key:\t12F669184834CDC0466BA4A72BE38420\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Oh, you come to visit old Gnory again.\"\nmsgstr \"Hát visszajöttél, hogy újra meglátogasd a jó öreg Gnoryt.\"\n\n#. Key:\t148C738E422B1C7889EF8CAEF1E6D115\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(7).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(7).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Lory\"\nmsgstr \"Lory\"\n\n#. Key:\t14A787EF447C5AD6579ADDB271BD9B7E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_54.Children(2).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_54.Children(2).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Warlorb\"\nmsgstr \"Labdnagy\"\n\n#. Key:\t14F4A36B4D34364D1BBB2DAAFA745C41\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_SpeechSequence_0.SpeechSequence(1).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_SpeechSequence_0.SpeechSequence(1).SpeechSequence.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"I so hated them...\"\nmsgstr \"Úgy utáltam...\"\n\n#. Key:\t162A7A25421FFB9B368D60A9BC76FD38\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Oh, the three artefacts! That sounds a bit too ambitious but after all, they can be quite a unique gift for a young ball lady.\"\nmsgstr \"Óh, a varázstárgyak! Egy picit talán túlzásnak tűnhet, de tény, hogy nagyon egyedi ajándék egy ifjú labda lány számára.\"\n\n#. Key:\t166AAF5241332C7954631F9D568B227B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_46.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_46.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"For everything as well.\"\nmsgstr \"Mindenre is.\"\n\n#. Key:\t19190B2142877E8CBB6F6D8FBB8D2DB1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_42.Text\n#. Key:\t39E546F34A9886487CD938A70468AEC6\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_59.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_42.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_59.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"What?\"\nmsgstr \"Mi?\"\n\n#. Key:\t1AF2DDE74542524EEF19CA9567CFBDAF\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_58.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_58.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"{name}? It still sounds a bit weird, but I think I might like it.\"\nmsgstr \"{name}? Kicsit furán hangzik, de idővel biztos megkedvelem.\"\n\n#. Key:\t22D86B8644CA5BFD8D4CA593C5E3A271\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_54.Children(4).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_54.Children(4).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Dr. Ball\"\nmsgstr \"Dr. Labda\"\n\n#. Key:\t2301BDF7421BB3665BED5F92074BB5A2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_84.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_84.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"I’ve found a wheel for you!\"\nmsgstr \"Találtam neked egy kereket!\"\n\n#. Key:\t25502F154A957ECD33B65E879E65B48B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_56.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_56.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"That's sad. Come back when you have some!\"\nmsgstr \"Szomorú. Gyere vissza, ha már van!\"\n\n#. Key:\t27BF125B4C46E41F58FD45947F1F5CF8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_49.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_49.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Fishy is Fishy!\"\nmsgstr \"Hali Hali!\"\n\n#. Key:\t294C4DCC4E8A3A07F15BC8B8C1934BB0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_36.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_36.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"I've got to go now!\"\nmsgstr \"Mennem kell!\"\n\n#. Key:\t29EEF2B44C1FAE2BBA7518A685FC99B0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"An elixir that makes you attractive to the lady... err... balls?\"\nmsgstr \"Egy elixírt, ami vonzóvá tesz a lány... ööö labdák számára?\"\n\n#. Key:\t2A8B24AE4D7C120048DEF2A76FD6D787\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(9).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(9).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Leave\"\nmsgstr \"Távozok\"\n\n#. Key:\t2AC10A9B434CEADBA53C1F8C1DB0A26D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_41.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_41.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"I have some at my shop for sale!\"\nmsgstr \"Van pár eladó a boltomban.\"\n\n#. Key:\t2FCB0CE9458F40E2B6738B93937283D2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_107.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_107.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"See? And I have to listen to him all day!\"\nmsgstr \"Látod? És nekem egész nap ezt kell hallgatnom.\"\n\n#. Key:\t303548794492148A0C7CE9961AB48C77\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_92.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_92.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"It's yours for 12 Gold Coins.\"\nmsgstr \"A tiéd lehet 12 Aranyért.\"\n\n#. Key:\t303B74844F6BC0691F880B970403BE91\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_106.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_106.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Then I will give it for 8 Gold Coins.\"\nmsgstr \"Akkor odaadom 8-ért.\"\n\n#. Key:\t31FAEB004D0A1ED819BEF4BC369D9FD5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_51.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_51.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"I see one of your wagon wheels is broken.\"\nmsgstr \"Úgy látom, az egyik kerék kitört.\"\n\n#. Key:\t336F7E9E46DDE33326081E937EC0024A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Don’t care about Fishy. He can’t really speak and I’m not sure if he even understands himself.\"\nmsgstr \"Ne is törődj Halival! Beszélni se tud nagyon, szerintem még ő sem érti, amit mond.\"\n\n#. Key:\t339A52E04EF86F99DE9BCEAA78F29025\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_66.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_66.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"See you later!\"\nmsgstr \"Viszlát később!\"\n\n#. Key:\t34076BD4489E7C92D8DCB9BC1668B775\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_6.Text\n#. Key:\t5FC68B30456EA7BB5A381780426E2279\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_73.Text\n#. Key:\t89C71F00406C5A31D196B4994CEBBA22\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_50.Text\n#. Key:\t93A76F294E3B6B5AB77DD5A04E76F681\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_83.Text\n#. Key:\t9C69D11144FA077481C6C9865E6ED34A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_80.Text\n#. Key:\tA28EA457442D0820F3633A8ECACEDC75\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_76.Text\n#. Key:\tCC8A6DB3424E6813002643A97EFE6644\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_50.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_73.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_76.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_80.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_83.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Shut up Fishy!\"\nmsgstr \"Pofa be, Hali!\"\n\n#. Key:\t365CB4EB4F04825B34F4ADB42F238552\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_85.Children(2).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_85.Children(2).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"12 Gold\"\nmsgstr \"12 Arany\"\n\n#. Key:\t3E650BC4417E6A004AF4549F412B1AF4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_26.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_26.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Ehm, ehm...\"\nmsgstr \"Ehemm, ehemm...\"\n\n#. Key:\t3E904B7D4D5694B715AC268086A4DB2F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_78.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_78.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"I’ve met another merchant called Lory. Is she your sister you talked about?\"\nmsgstr \"Nemrég összefutottam egy másik kereskedővel, Loryval. Ő lenne a nővéred?\"\n\n#. Key:\t3EB6AD0C4D8896D36393BE878D3D641E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_100.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_100.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"What the holy Coins?! Now I'm getting angry!\"\nmsgstr \"Szent Aranytallérok! Most már tényleg dühös vagyok!\"\n\n#. Key:\t43099059444ABE91D004D5992065A06F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_7.Text\n#. Key:\t5A2D69454EA8354F3DE4E6BB9D7BD912\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"And Fishy!\"\nmsgstr \"És Hali!\"\n\n#. Key:\t43602C93451F3A59EB067ABF7A525D41\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Fishy know about them!\"\nmsgstr \"Hali tud róluk!\"\n\n#. Key:\t43C2553447FC63D25E26E79ACE5D7316\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_74.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_74.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"He was a good merchant, so he understood. Business is hard. I always say that for a fair price I would even sell myself.\"\nmsgstr \"Ő is kereskedő, megérti. Az üzlet kemény. Mindig azt mondom, ha eleget fizetnek, saját magamat is eladnám.\"\n\n#. Key:\t477984834246057BF894629ABEA2F0CB\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_116.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_116.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"You know what? 9 Gold Coins! Take it or leave it that's my final offer!\"\nmsgstr \"Tudod mit? 9 Arany! És ez az utolsó ár!\"\n\n#. Key:\t477CBB8C451F6255A8A4FAAE8272F700\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_54.Children(5).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_54.Children(5).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Don't buy\"\nmsgstr \"Nem veszek\"\n\n#. Key:\t494F3D164E51E73CC76FD689BF2A4435\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_110.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_110.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Then I will give it for 9 Gold Coins.\"\nmsgstr \"Akkor legyen 9 Arany.\"\n\n#. Key:\t4CBFFCE24BDAFBA592E846A4C6827F21\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_102.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_102.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"All right, you won. I will give it for 11 Gold Coins.\"\nmsgstr \"Rendben, te nyertél. Akkor odaadom 11-ért.\"\n\n#. Key:\t4D29AE254413D052D6FAA7AA259E2618\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_45.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_45.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"I see you do have a solution for everything.\"\nmsgstr \"Látom mindenre tudsz megoldást.\"\n\n#. Key:\t4EACFFA1414DBB56AA162789D34C76F2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_61.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_61.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Wow, that's magnificent!\"\nmsgstr \"Húú, fennséges!\"\n\n#. Key:\t4F5CF94B464ED01AB43521A56D7C3B13\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_53.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_53.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"I want to buy a new name!\"\nmsgstr \"Kell egy jó név!\"\n\n#. Key:\t51F2252D44A1B1B8B407938C06378303\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Fishy know a poem.\"\nmsgstr \"Hali tud egy verset.\"\n\n#. Key:\t540DEA6540589E8E9BD5789F708F1D95\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_85.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_85.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"How much do you charge for it?\"\nmsgstr \"Mennyit kérsz érte?\"\n\n#. Key:\t551FA87F4EC33961257CFBA46B24E39C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_25.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_25.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Oh, holy golden coins please no...\"\nmsgstr \"Óh, szentéges arany érmék, kérlek ne...\"\n\n#. Key:\t55C0627D41EBB98609EDA49E36CE00F3\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_87.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_87.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Tummm-dummm I would sell the whole World but who could possibly buy it?\\r\\nUhhh... Yes?\"\nmsgstr \"Tummm-dummm eladnám én biza, az egész világot, na de ki venné meg, s miből?\\nUhhh... Igen?\"\n\n#. Key:\t5977C80F49FF140CD397C1A3079F8A4C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_54.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_54.Children(1).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Ultimate Frisbee\"\nmsgstr \"Kis Gömböc\"\n\n#. Key:\t5D529690413CAE4F496DF4B7A3627528\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(6).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(6).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Broken wheel?\"\nmsgstr \"Törött kerék?\"\n\n#. Key:\t5D632016493E1D06116399A364FD3835\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_67.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_67.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Take care and don't spend Gold anywhere else!\"\nmsgstr \"Vigyázz magadra, és ne állj szóba idegen kereskedőkkel!\"\n\n#. Key:\t5F1DF4B44C4E82D6A5FDB6BDF5172AEA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_96.Text\n#. Key:\t9592C2144A7237D49EC42E898AB73642\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_105.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_105.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_96.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"How about 10?\"\nmsgstr \"Mit szólsz 10-hez?\"\n\n#. Key:\t6179A2AF43798114CFEE12900CDAF8CA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_60.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_60.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Good choice!\"\nmsgstr \"Jó választás!\"\n\n#. Key:\t6185906046DAF51843A52FA2FE2CF5AC\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_101.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_101.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"11 Gold Coins! Take it or leave it that's my final offer!\"\nmsgstr \"11 Arany! És ez az utolsó ár!\"\n\n#. Key:\t655C05DA44E2BCB7DCF0D38DFAD6182C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Let him tell the poem!\"\nmsgstr \"Hadd mondja el a verset!\"\n\n#. Key:\t68761B744A892F85CEDB19B8DD6D9649\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_SpeechSequence_0.SpeechSequence(2).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_SpeechSequence_0.SpeechSequence(2).SpeechSequence.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Then I found out there is a Dwarven Outpost here which is still populated.\"\nmsgstr \"Aztán rájöttem, hogy van itt egy Törp Helyőrség, ami még mindig lakott.\"\n\n#. Key:\t6D8190E2491C99D14C4E37AA8F01E0BC\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"In Crossroad Cave the three are close.\\r\\nThough where exactly? This poem shows:\\r\\nFor the first one you need to be restless\\r\\nTo avoid the Catacomb death traps.\\r\\nFor the second you need to go down\\r\\nDeep until you reach the ancient fisher town.\\r\\nFor the third one go high and even higher,\\r\\nKeep on til you reach the never sleeping fire.\\r\\n\"\nmsgstr \"Indulásod helye Keresztút Kő legyen,\\nFigyelj azért oda, Gnory meg ne vegyen.\\nAz első Varázstárgyat északon hagyták,\\nHol Törpök raktak le, pár százezer csapdát.\\nA második tárgyhoz le, a föld alá haladj,\\nTudod, jó helyen jársz, ha látsz egy csomó halat.\\nHarmadiknak helye meglepően tüzes,\\nHa oda is eljutsz, azt mondom, az ügyes.\\n\"\n\n#. Key:\t6F09C2F74E536AB6E4E7D8941571FBDF\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Sure. Shut up Fishy!\"\nmsgstr \"Naná. Pofa be, Hali!\"\n\n#. Key:\t720870EC444670FB23244D964497F883\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_SpeechSequence_1.SpeechSequence(1).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_SpeechSequence_1.SpeechSequence(1).SpeechSequence.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"However business is business. She is bad for business! Trading with my customers before they could get to me!\"\nmsgstr \"Ugyanakkor, az üzlet az üzlet. Micsoda egy kufár! Lenyúlja az ügyfeleimet, mielőtt eljuthatnának hozzám!\"\n\n#. Key:\t757069804B91FF89516ACDA0C1F59C6A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_103.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_103.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Arrrgh! Fishy please no more poems! My head aches.\"\nmsgstr \"Áááá! Hali, elég a versekből! Már ettől is fáj a fejem.\"\n\n#. Key:\t75A193EA4F6A7EE92BA73D809247B1A1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_62.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_62.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Dr. who? Oh, see, Dr. Ball.\"\nmsgstr \"Dr. ki? Jah, értem, Dr. Labda.\"\n\n#. Key:\t75EADAAB4ACE4E6ECE45BFA6611ED77A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_85.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_85.Children(0).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"8 Gold\"\nmsgstr \"8 Arany\"\n\n#. Key:\t7657DDE7438385D8BCC4B08B2BB5881A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_SpeechSequence_0.SpeechSequence(0).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_SpeechSequence_0.SpeechSequence(0).SpeechSequence.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"It all started when I was back with my family. Oh, those peaceful moments!\"\nmsgstr \"Kezdetben együtt volt az egész családom. Óh, azok a békés idők!\"\n\n#. Key:\t778E6A484D8669761018F38DF326C125\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_90.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_90.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"It's yours for 8 Gold Coins.\"\nmsgstr \"A tiéd 8 Aranyért.\"\n\n#. Key:\t7A09AFFF435CC002F0B75989307D7791\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Well met dear err... traveler! How can a humble gnome merchant like me be at your service?\"\nmsgstr \"Üdvöz légy kedves... ööö, utazó! Mit tehet érted egy magamfajta szerény gnóm kereskedő?\"\n\n#. Key:\t7E964EEC4406A06910B333A0F282360A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_70.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_70.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Sure! She is the lovely lady ball for whom you would like to buy a precious present, right?\"\nmsgstr \"Persze! Ő lesz az imádnivaló labda lány, akinek az ajándékot veszed, igaz?\"\n\n#. Key:\t85D756624371CC3B3A37FC84C111DBB0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_54.Children(3).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_54.Children(3).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Sorbcerer\"\nmsgstr \"Varázsgömb\"\n\n#. Key:\t86C8F9B74B869FF4D34CF586AB5AC25E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_20.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_20.Children(1).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Shut up!\"\nmsgstr \"Pofa be!\"\n\n#. Key:\t8701305446A6E0F5E5EA5F86B823273D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Shut up both of you!\"\nmsgstr \"Mindketten fogjátok be!\"\n\n#. Key:\t878BA65D462254D8A0FD36BA541E8C70\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_27.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_27.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"The three artefacts - by Fishy:\"\nmsgstr \"A Három Varázstárgy - költötte Hali:\"\n\n#. Key:\t8A136EF74C7DE15BFBC664B8447366F1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(2).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(2).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"I need a name\"\nmsgstr \"Kell egy név\"\n\n#. Key:\t8C25603A4AE5F2D6294551AD2BA6322D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_40.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_40.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Of course! Are you lost in this hollow realm? Disappointed in all creature kind? Searching for a helpful hand? Not anymore!\"\nmsgstr \"Természetesen! Elveszettnek érzed magad ebben a kietlen világban? Csalódtál az egész lénységben? Jól jönne egy segítő kéz? Nálam megtalálod!\"\n\n#. Key:\t90F345C4482C46F4B1CD43B20F01B2B6\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_54.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_54.Children(0).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Epic Sphero\"\nmsgstr \"Gömbóc Artúr\"\n\n#. Key:\t92F1D4A84B3609FDE38C82AD5A314554\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_72.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_72.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"And Fishy is the primitive monster.\"\nmsgstr \"És Hali a primitív szörnyeteg.\"\n\n#. Key:\t9574E444465834A7D15565A14C7E0F1D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_SpeechSequence_0.SpeechSequence(5).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_SpeechSequence_0.SpeechSequence(5).SpeechSequence.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"My sister sold my brother, so I had enough money to set out.\"\nmsgstr \"A nővérem eladta az öcsémet, és ebből lett elég induló tőke.\"\n\n#. Key:\t976FD7AB4B31747EF35E3EBE9C82471F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_69.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_69.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Do you know a girl called Lillian?\"\nmsgstr \"Ismersz egy Lillian nevű lányt?\"\n\n#. Key:\t9851A2064648DE26EF4501961D721109\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_68.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_68.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Wake up! He is back!\"\nmsgstr \"Ébredj! Megint itt van!\"\n\n#. Key:\t99CDA18D43B5FC74E152888E674B743C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_30.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_30.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Let’s talk about something else.\"\nmsgstr \"Beszéljünk valami másról.\"\n\n#. Key:\t9A5056F7472381107ACF5F849A322947\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_64.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_64.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Bye!\"\nmsgstr \"Viszlát!\"\n\n#. Key:\t9B4816554539F6616741FC8A6651FEDD\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_SpeechSequence_1.SpeechSequence(2).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_SpeechSequence_1.SpeechSequence(2).SpeechSequence.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"I will tell her what I think about this that’s for sure!\"\nmsgstr \"Biztos is, hogy megmondom neki, mi a véleményem erről!\"\n\n#. Key:\t9FD161AC488FFD8D9C6BCAB518A6DFCA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_86.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_86.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Hello again!\"\nmsgstr \"Üdv újra!\"\n\n#. Key:\t9FFADAA44EE730442CFD76BBD942F478\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_38.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_38.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Fare thee well!\"\nmsgstr \"Viszlát!\"\n\n#. Key:\tA0E3F7B44422A97F22E1FCB315DC498A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_48.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_48.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Who are you by the way?\"\nmsgstr \"Ki vagy te tulajdonképpen?\"\n\n#. Key:\tA3EE773446B69B8D37851BAFAD607A9F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_24.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_24.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Forget your artefacts I have plenty of other valuable items instead!\"\nmsgstr \"Hagyjuk az ócska Varázstárgyakat! Van egy rakat tényleg értékes árum helyettük!\"\n\n#. Key:\tA557A981439B7A1B4AA803941A8D6794\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_23.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_23.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"I guess you don’t know where they are...\"\nmsgstr \"Gondolom nem tudod, merre vannak...\"\n\n#. Key:\tA571474F44F33104D2F93386A5C4009C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_75.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_75.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Yet no one ever wanted to buy him for a single copper coin.\"\nmsgstr \"De mégsem kellett senkinek még egy lyukas garasért sem.\"\n\n#. Key:\tA67ADB3143798188EF7C1F8D4E59690C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_88.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_88.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Uhhh... Yes?\"\nmsgstr \"Uhhh... Igen?\"\n\n#. Key:\tA69D35084A31B957410EF889ED0EC4A4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_57.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_57.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Yes, yes that's it!\"\nmsgstr \"Igen!\"\n\n#. Key:\tAD70372E4A5B0594635FBBBE30CA53F1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_91.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_91.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"It's yours for 10 Gold Coins.\"\nmsgstr \"A tiéd 10 Aranyért.\"\n\n#. Key:\tAE2E742F4A087974019D8F810FF97A2E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_104.Children(0).Children.Text\n#. Key:\tB59E143642BBE2D677AA6F97B46C3C06\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_105.Children(0).Children.Text\n#. Key:\tF0726C6B4F8F780C341F319D08E20CF9\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_96.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_104.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_105.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_96.Children(0).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Ok\"\nmsgstr \"Oké\"\n\n#. Key:\tAF7B14B241CED9B8BE3F23BC8C857A9A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_82.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_82.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Now you can imagine those peaceful moments when they were all together.\"\nmsgstr \"Képzelheted, milyenek voltak azok a békés idők.\"\n\n#. Key:\tB2F8DA594F1A58E8B2FCC7B16C368E21\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"What... uhhh... me?\"\nmsgstr \"Mi... uhhh... én?\"\n\n#. Key:\tBA5B75CD4087B53BB682CD97021FF821\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(3).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(3).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Artefacts\"\nmsgstr \"Varázstárgyak\"\n\n#. Key:\tBBB67671475F19135DCD57AF771F0D85\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_43.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_43.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Helpful hands of course and all kind of stuffs. Equip yourself. Once you get rid of all your gold, you won’t be alone anymore...\"\nmsgstr \"Segítők kezek természetesen, és mindenféle egyéb áru. Vásárolj! Meglátod, ha elköltöd minden pénzed, már nem is leszel annyira egyedül...\"\n\n#. Key:\tBD1AF6114DA5840A340F8DA65B7F59D2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_SpeechSequence_1.SpeechSequence(0).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_SpeechSequence_1.SpeechSequence(0).SpeechSequence.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Yes, she is my beloved sister!\"\nmsgstr \"Igen, ő az én hőn szeretett nővérem!\"\n\n#. Key:\tBE8F496743A57B5F1AF81B8D48F128FE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Hello there!\"\nmsgstr \"Hahó!\"\n\n#. Key:\tBFA7C31A4443A6C89DB61D8556D62FCD\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(0).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Trade\"\nmsgstr \"Kereskedek\"\n\n#. Key:\tC29FF9914C8C1F479E9F7BAB338B067A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_77.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_77.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"If you could bring me a new wheel I would pay for it with shiny Gold coins!\"\nmsgstr \"Ha tudnál szerezni nekem egy új kereket, tisztességesen megfizetném az árát!\"\n\n#. Key:\tC5077FC14569C44087272C9E9DE07992\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_34.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_34.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Ok, I’ve got it.\"\nmsgstr \"Rendben, értem.\"\n\n#. Key:\tC6F3C52D4719CE471B6EEB90FCE94E3B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_55.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_55.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Unfortunately I don't have enough gold.\"\nmsgstr \"Sajnos nincs elég aranyam.\"\n\n#. Key:\tCA1E8A5D4C07A81975C4B4B00572A0C8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_94.Text\n#. Key:\tDB9C0DB146BBE1DFC28F929A37C4408A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_93.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_93.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_94.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Ha-ha-ha! You must be kidding that's ridiculously high!\"\nmsgstr \"Ha-ha-ha! Viccelsz, igaz? Az nevetségesen sok lenne.\"\n\n#. Key:\tCB792FAD45F78755935423A5219271FC\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_98.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_98.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"9 Gold I won't go any higher!\"\nmsgstr \"9 Aranynál magasabbra nem megyünk!\"\n\n#. Key:\tCE99919C42EC2315EC5B33900FBC09C4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_95.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_95.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"That’s not fair. It would be a shame on me if I just robbed you like that!\"\nmsgstr \"Nem tisztességes. Szégyent hozna a nevemre, ha ilyen potom összeggel vágnálak át.\"\n\n#. Key:\tD090388E4529CEC2D70899B520973064\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(4).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(4).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Who are you?\"\nmsgstr \"Ki vagy te?\"\n\n#. Key:\tD0AA81A247BE4979A774F3B6095BB820\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_33.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_33.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"I am Gnory, traveler merchant. I wander the world, seeking rare items, secrets beneath dark doors, revealing truth of forg...\"\nmsgstr \"Nevem Gnory, vándor kereskedő volnék, ki a világ minden szegletét bejárja, kalandos útjaim során ritka, és különleges...\"\n\n#. Key:\tD23C65EB4F39580A06045FADE2BCD713\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_81.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_81.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"She saw our Realm through cat eyes,\\r\\nThe living fire, the dead ice.\\r\\nShe cared, she took care of us all.\\r\\nWhat was ruined she made it whole.\\r\\nThen she left us, this is how it ended.\\r\\nHer own Realm also needed to be mended.\\r\\n\"\nmsgstr \"Jól ismertük, köztünk járt, kismacska képében,\\nBejárta világunkat hosszában, széltében.\\nGondos volt és figyelmes, segített, hol tudott,\\nKedves szép szavaiból mindenkinek jutott.\\nVáratlan elment, így ér a történet véget,\\nMert saját világa kért tőle segítséget.\\n\"\n\n#. Key:\tD30843A14519A490FEE89E82E3CB6735\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"I’m looking for three artefacts.\"\nmsgstr \"Varázstárgyakat keresek.\"\n\n#. Key:\tD9B70A6A453A11FD2115FFB25CCFF195\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_54.Children(6).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_54.Children(6).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Not enough gold\"\nmsgstr \"Nincs elég arany\"\n\n#. Key:\tDB8982994F2BFF510A6A2EA1D40C68C6\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_37.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_37.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Good bye!\"\nmsgstr \"Viszlát!\"\n\n#. Key:\tDC20CC924E5F898E715B668416678CA1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_104.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_104.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"How about 8?\"\nmsgstr \"Mit szólsz 8-hoz?\"\n\n#. Key:\tDC989DED42077EBA3313C69150BB33F0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_63.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_63.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"That's a weird name I have to admit.\"\nmsgstr \"Fura név, megmondom őszintén.\"\n\n#. Key:\tDEC95D494680878D544FF49DACBDEE4F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_114.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_114.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"11 Gold I won't go any lower!\"\nmsgstr \"11 Arany, ennél lejjebb nem megyek!\"\n\n#. Key:\tDF7B371841495C5FB98800BCF44B7C5B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_52.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_52.Children(1).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Skip yack-yack\"\nmsgstr \"Nem kell a duma\"\n\n#. Key:\tE1322541414052606F718FBF9B68D4B0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_79.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_79.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Fishy know her.\"\nmsgstr \"Hali ismeri őt.\"\n\n#. Key:\tE3D668304EE4C7C2E77F3E9AF47CB84E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_SpeechSequence_0.SpeechSequence(4).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_SpeechSequence_0.SpeechSequence(4).SpeechSequence.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Fortunately I had a loving family I could always count on. Since they are all merchants, they could easily help me out.\"\nmsgstr \"Szerencsére számíthattam a családom támogatására. Lévén, hogy mindnyájan kereskedők\"\n\n#. Key:\tE5031E774F81A45ECB4731BC114AD2E2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_109.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_109.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"All right, no need to get angry! I can give you 9 Gold for it.\"\nmsgstr \"Nyugi, nem kell felkapni a vizet! Adhatok 9 Aranyat is akár.\"\n\n#. Key:\tEBE094644F9C8DCEE025FDBF8346AD47\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_44.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_44.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"...with your problem.\"\nmsgstr \"...a problémáddal.\"\n\n#. Key:\tEC93512B48219F6BA6DDF5A3F100C19A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Show me what you have for sale!\"\nmsgstr \"Mutasd, mid van eladó!\"\n\n#. Key:\tECF244164CDD4A29C96BBD8E13688FE7\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(1).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Sell Wheel\"\nmsgstr \"Új Kerék\"\n\n#. Key:\tED410B224B09EFF36ED2AC9752AD59DA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_71.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_71.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"No, she is...\"\nmsgstr \"Nem, ő a...\"\n\n#. Key:\tEDE4BF2D448CAFEF217C5E86885A7E81\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_117.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_117.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"All right, you won. I will give it for 9 Gold Coins.\"\nmsgstr \"Oké, te nyertél. Neked adom 9 Aranyért.\"\n\n#. Key:\tEEA209E84766D4AF2BD804A7BA11F111\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_85.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_85.Children(1).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"10 Gold\"\nmsgstr \"10 Arany\"\n\n#. Key:\tEEE19423423A24146446EEBEB04FAEE9\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"I’m on a quest to find...\"\nmsgstr \"Meg kell találnom...\"\n\n#. Key:\tF53E6D3443D37DA82663D2976AA90A85\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_20.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_20.Children(0).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Poem?\"\nmsgstr \"Verset?\"\n\n#. Key:\tF61EDE3940F24B15BE57D8B5A5AC5570\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_99.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_99.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Deal! Here you go!\"\nmsgstr \"Megegyeztünk!\"\n\n#. Key:\tF6A527234B894C18C0778C918EB1BA4E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_89.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_89.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Welcome back!\"\nmsgstr \"Üdv újra!\"\n\n#. Key:\tF93CBC6640AF6143C7D1C5AA6F8C4ADF\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_52.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_52.Children(0).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Go on\"\nmsgstr \"Folytasd\"\n\n#. Key:\tF9EA93DE4B341581745785A7371F797A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(8).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(8).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Lillian\"\nmsgstr \"Lillian\"\n\n#. Key:\tFE3C4C72489A909B4D9F76A483D293AE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_SpeechSequence_0.SpeechSequence(3).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_SpeechSequence_0.SpeechSequence(3).SpeechSequence.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"This was my chance to make a hit as a merchant but I didn’t have the resources for a journey this long.\"\nmsgstr \"Ez volt kereskedői pályafutásom nagy lehetősége, de sajna nem volt elég pénzem az útra.\"\n\n#. Key:\tFEF58E5B4FB18D128640689499752F75\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_29.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_29.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Do you call this a poem? Pathetic! Hardly any info and what a miserable structure! Shame on you Fishy!\"\nmsgstr \"Ezt nevezed versnek? Szánalmas! Semmi tartalom, pocsék rímek. Szégyelld magad, Hali!\"\n\n#. Key:\tFF66071643E10E94DEFF70B8E20876EE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_52.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_52.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"That's a long and sad story...\"\nmsgstr \"Ez egy hosszú, szomorú történet...\"\n\n#. Key:\t1EA717114DFEF4490F58829C2F96566A\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/HW_Candlestick.HW_Candlestick:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E2/HW_Candlestick.HW_Candlestick:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_HW_Candlestick\"\nmsgid \"Even after mom passed the servants kept lighting the candles.\"\nmsgstr \"A cselédek anyu halála után is mindig cserélték a gyertyákat.\"\n\n#. Key:\t94195B6E4157A1A8BD74BE9224AEED42\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/HW_Candlestick.HW_Candlestick:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E2/HW_Candlestick.HW_Candlestick:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_HW_Candlestick\"\nmsgid \"After Mom got sick she really feared darkness.\"\nmsgstr \"A betegsége óta anyu rettegett a sötéttől.\"\n\n#. Key:\tEF9668BF44D4A52E46ACEA8B82011137\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/HW_Candlestick.HW_Candlestick:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Ending/E2/HW_Candlestick.HW_Candlestick:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_HW_Candlestick\"\nmsgid \"We always needed to light the hallway.\"\nmsgstr \"Mindig ki kellett világítanunk a folyosót.\"\n\n#. Key:\t2EECB3024693C7F0EA176BB100D6779A\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/HW_Exit.HW_Exit:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E2/HW_Exit.HW_Exit:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_HW_Exit\"\nmsgid \"This door was really rusty.\"\nmsgstr \"Ezen az ajtón már rég cserélni kellett volna a rozsdás zsanérokat.\"\n\n#. Key:\t3C6E4A1C41A7EACE15C101A65BBE997A\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/HW_Exit.HW_Exit:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Ending/E2/HW_Exit.HW_Exit:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_HW_Exit\"\nmsgid \"I had to do something with it otherwise Father would have heard me.\"\nmsgstr \"Valamit csinálnom kellett vele, különben az egész kastélyban hallani fogják, hogy kimentem.\"\n\n#. Key:\t8F63CC8C44D8F8432A66E6B65EC10AF5\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/HW_Exit.HW_Exit:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E2/HW_Exit.HW_Exit:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_HW_Exit\"\nmsgid \"I used oil on this rusty door. I didn’t want to be heard.\"\nmsgstr \"Megolajoztam a zsanérokat. Remélem nem fog nyikorogni.\"\n\n#. Key:\t55E7DD2B4C3D8852EC4A64AF44443BDA\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/HW_Explosion.HW_Explosion:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Ending/E1/HW_Explosion.HW_Explosion:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_HW_Explosion\"\nmsgid \"What was this? I have to go back to check what happened!\"\nmsgstr \"Ez meg mi volt? Vissza kell mennem!\"\n\n#. Key:\t8060689940824917F595BF84B4E95A46\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/HW_FRDoor.HW_FRDoor:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E2/HW_FRDoor.HW_FRDoor:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_HW_FRDoor\"\nmsgid \"I always wondered why.\"\nmsgstr \"Sosem értettem, miért.\"\n\n#. Key:\t816B603341386CF6BB3ADCAAD21D68A3\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/HW_FRDoor.HW_FRDoor:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E2/HW_FRDoor.HW_FRDoor:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_HW_FRDoor\"\nmsgid \"Father moved to his workroom and sealed this door.\"\nmsgstr \"Apa átköltözött a dolgozószobájába, ezt az ajtót pedig beszögelte.\"\n\n#. Key:\t125DACD243EA6EBCE76D8CB9F681C727\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/HW_MRDoor.HW_MRDoor:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E2/HW_MRDoor.HW_MRDoor:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_HW_MRDoor\"\nmsgid \"I felt I should have a last look before I go.\"\nmsgstr \"Úgy éreztem, legalább egyszer be kell néznem anyu szobájába, mielőtt elmegyek.\"\n\n#. Key:\tE8250D43437C1B1D45637F9499D20936\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/HW_MRDoor.HW_MRDoor:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E2/HW_MRDoor.HW_MRDoor:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_HW_MRDoor\"\nmsgid \"Mom’s room looked just like it was when she was still alive.\"\nmsgstr \"Anyu szobája most is úgy nézett ki, mint amikor anyu lakott benne.\"\n\n#. Key:\tE0BB63A74E94DA1B327B11BB781EB4DB\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/HW_Painting.HW_Painting:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E2/HW_Painting.HW_Painting:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_HW_Painting\"\nmsgid \"Mom made this painting before she met Father.\"\nmsgstr \"Ezeket a képeket még azelőtt festette anyu, hogy apát megismerte.\"\n\n#. Key:\tEAD0C13D4BF1D35BDAEC14A3F25901F5\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/HW_Stairs.HW_Stairs:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E2/HW_Stairs.HW_Stairs:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_HW_Stairs\"\nmsgid \"I had to go really softly otherwise Father would have heard me.\"\nmsgstr \"Lábujjhegyen kellett járnom, nehogy apa meghalljon.\"\n\n#. Key:\t0494D36047DDCE114A43C9901618D32B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_44.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_44.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Unfortunately I don't know where you can find them.\"\nmsgstr \"Sajnos nem tudom, hol vannak.\"\n\n#. Key:\t0C3E31854B0EB053EABAD4B9DC3D8E60\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_57.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_57.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"That’s a serious threat, I have to admit.\"\nmsgstr \"Hú, most megijedtem. Azt biztos nem élném túl.\"\n\n#. Key:\t0C7C89EB4E610752FBE119AA32B99F8B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_34.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_34.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Yes I know her. She couldn’t come here so she sent her cat.\"\nmsgstr \"Ismerem Lilliant. Személyesen nem tudott idejönni, ezért a macskáját küldte.\"\n\n#. Key:\t0EDE363848C05F39DE478DA7A559CF54\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Could you bring them to me?\"\nmsgstr \"Tudnál hozni belőlük?\"\n\n#. Key:\t1A914576488DA1393ED641B9F315ABC6\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_53.Text\n#. Key:\t20DA5C2F49DCFADF17F1C983103C0D98\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_29.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_29.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_53.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Thanks!\"\nmsgstr \"Kösz!\"\n\n#. Key:\t1E7EE16F451CAB1193F0B8B3939273AA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_62.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_62.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"I managed to defeat one group of the monsters.\"\nmsgstr \"Legyőztem egy adag szörnyet.\"\n\n#. Key:\t1F5BE4154412819180B1CA92E5B69377\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(6).Children.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(6).Children.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Artefacts\"\nmsgstr \"Varázstárgyak\"\n\n#. Key:\t1FE89B7045E586E988BEC18B06BEEBDB\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(1).Children.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Purple Mushroom\"\nmsgstr \"Rózsaszín Gomba\"\n\n#. Key:\t208B21DE484E3FE42C9978927BC91E78\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_51.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_51.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Uh... this was impressive!\"\nmsgstr \"Huh... ez egész komoly volt!\"\n\n#. Key:\t27DF1ABB483B5073D8C87DB48EF2613F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_70.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_70.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Well done!\"\nmsgstr \"Nagyszerű!\"\n\n#. Key:\t2892242A4E74642813A30CBAE853B674\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_27.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_27.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Anyway, if you give my Coin back I will apologize.\"\nmsgstr \"Mindegy, add vissza az Érmeimet, és megbocsájtok.\"\n\n#. Key:\t290F9EE34FA4EA41FE963CA61358D23B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_49.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_49.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"In theory if I add this to the soup...\"\nmsgstr \"Elméletileg, ha ezt beleteszem a levesbe...\"\n\n#. Key:\t3015DA144833F0401BADE8B5E5F93BA8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_26.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_26.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Huh! Do you think chests are only there so that you can loot them?\"\nmsgstr \"Heh! Azt hiszed talán, hogy a ládák csak azért vannak, hogy kifoszthasd őket?\"\n\n#. Key:\t331D8B314DAF15CD7E343BB7459927DD\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Give back my Coin!\"\nmsgstr \"Add vissza a Érméimet!\"\n\n#. Key:\t345BD57D40E09C73044BB981798E2449\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_43.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_43.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Purple Mushrooms. That’s the only mushroom which is purple. You can’t miss it.\"\nmsgstr \"Rózsaszín Gomba. Az az egyetlen gombafajta, ami rózsaszín. El se lehet téveszteni.\"\n\n#. Key:\t34B1483D4F1C580BB8DB61BEEBC5BC0F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"I saw that you opened my chest!\"\nmsgstr \"Láttam, hogy a ládámban turkáltál!\"\n\n#. Key:\t35DBF2874748AFCC34A3FAAC083EF9A0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_1.SpeechSequence(3).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_1.SpeechSequence(3).SpeechSequence.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"We had the key of the Ancient Temple. According to our prophecies that will fall to Ruin last.\"\nmsgstr \"Mi őriztük a Tűz Templom kulcsát. Hitünk szerint az a hely fog utoljára a Fertőzés áldozatául esni.\"\n\n#. Key:\t35FB567B4B09545830D61F84869FC7E7\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Here you go!\"\nmsgstr \"Tessék!\"\n\n#. Key:\t3AAE79234A4BD2F8BCA5F790D5E5D84B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_45.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_45.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"No problem. If I ever find one I will bring it to you.\"\nmsgstr \"Semmi gond, ha találok, elhozom.\"\n\n#. Key:\t3AE46C894A0CD8F1AA049CB9970D65F3\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"I’m the chef and I’m making a soup.\"\nmsgstr \"Szakács vagyok, és levest főzök.\"\n\n#. Key:\t3BB405034447D1C80B99A5A23AFC98FC\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"I know you are already hungry but the soup is not yet ready.\"\nmsgstr \"Látom, hogy éhes vagy, de még nincs kész a leves.\"\n\n#. Key:\t406361704988AD9ABD5DA4AF946451F2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_37.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_37.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"In return Lillian drew pictures for my tales.\"\nmsgstr \"Cserébe Lillian képeket rajzolt a meséimhez.\"\n\n#. Key:\t4152700A419F5AE41362D09E21835D98\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_46.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_46.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"I already have some...\"\nmsgstr \"Van nálam pár...\"\n\n#. Key:\t4355EB74402DDFD5FF8697B1911593E8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_56.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_56.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"I won’t. And I won’t talk to you either.\"\nmsgstr \"Nem. De beszélni se fogok veled.\"\n\n#. Key:\t43C4F54B4ABBBB13E129148D9AF04976\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(4).Children.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(4).Children.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Village\"\nmsgstr \"Falu\"\n\n#. Key:\t4614DBA24F54CB29C92BA9894849CC39\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_1.SpeechSequence(1).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_1.SpeechSequence(1).SpeechSequence.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Long ago we lived in peace and respected the ancestors. Even though they caused the Cataclysm.\"\nmsgstr \"Valamikor békében éltünk itt, és őriztük az Ősök emlékét. Tiszteltük őket, még úgy is, hogy ők okozták a Kataklizmát.\"\n\n#. Key:\t4687EF7A45E5FC200C806AB829C64D78\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Is this a village? Where are the others?\"\nmsgstr \"Ez valami falu? Lakik még itt valaki?\"\n\n#. Key:\t586F6370480889F551923A97FFF5E89C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_0.SpeechSequence(3).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_0.SpeechSequence(3).SpeechSequence.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"They enslaved all the other tribes and forbid us to do our rituals.\"\nmsgstr \"Leigázták a kis törzseket, és megtiltották, hogy megemlékezzünk az Ősökről.\"\n\n#. Key:\t5BCF2C5D4CE9AD6AB4A09DB510BA2039\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"You again? Take a seat until the soup is ready!\"\nmsgstr \"Megint te? Foglalj helyet, amíg a leves fő!\"\n\n#. Key:\t63B9B304450B276F0EC714B43A25F09D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"I’m looking for three artefacts. Do you know something about them?\"\nmsgstr \"Varázstárgyakat keresek. Tudsz róluk valamit?\"\n\n#. Key:\t63C0EC124C1B42B5C5FD1F95B23B9155\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_65.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_65.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Take this! You deserve it.\"\nmsgstr \"Tessék! Kiérdemelted.\"\n\n#. Key:\t69E0738B489315662A55DA98EAC542E6\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_0.SpeechSequence(4).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_0.SpeechSequence(4).SpeechSequence.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"They used this village to produce Fishy slaves.\"\nmsgstr \"Ebben a faluban tenyésztették a Hali rabszolgákat.\"\n\n#. Key:\t6CBCFFEB48FF8E0D97AAE4B1CB19CB52\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_22.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_22.Children(0).Children.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Give back\"\nmsgstr \"Visszaadom\"\n\n#. Key:\t6EACCB4D4D91AF29F6452E81E4C01B57\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_32.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_32.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"I see you have a lot of things here. Do you have something for sale?\"\nmsgstr \"Úgy látom, akad itt pár érdekes dolog. Van eladó is köztük?\"\n\n#. Key:\t7164FF5D440BCEF18CAC7E9104A324CF\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"I've got to go now!\"\nmsgstr \"Mennem kell!\"\n\n#. Key:\t75A92D46421FC2601A13B4BBE9BA4D11\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_54.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_54.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Er... I don’t have it. But I will get it back I promise!\"\nmsgstr \"Ö... már nincs nálam, de visszaszerzem, ígérem!\"\n\n#. Key:\t761F5734479CFA197266F382FD0A6452\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_23.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_23.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"I’m sorry, I didn’t know it was yours. There are chests like yours everywhere.\"\nmsgstr \"Elnézést, nem tudtam, hogy a tiéd. Az egész környék tele van ilyen ládával.\"\n\n#. Key:\t7D87C5064D739F1EFF23AF8264E83235\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Well, this morning. But there are some very special ingredients which make the cook time way shorter.\"\nmsgstr \"Igazából ma reggel. De van pár különleges hozzávaló, ami lényegesen lerövidíti a főzőidőt.\"\n\n#. Key:\t806AEB764A6118D4CBE9CCA71E98EF10\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_72.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_72.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Have no fear, I'll do it.\"\nmsgstr \"Egyet se félj, megoldom.\"\n\n#. Key:\t80B60CA848D3C71B72514AAC976C3910\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Yes, the soup! A very special recipe. It takes years to finish.\"\nmsgstr \"Igen, levest! Nagyon különleges recept alapján. Évekbe tart elkészíteni.\"\n\n#. Key:\t8437D72C44494DE499E528A67B36A123\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_58.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_58.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Ah, it's you again.\"\nmsgstr \"Ah, megint te.\"\n\n#. Key:\t885F9FDB498EC13B81E22580D33309F3\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(5).Children.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(5).Children.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Kobolds\"\nmsgstr \"Koboldok\"\n\n#. Key:\t8A6043D64FB7B61AF4D553A62D27229C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_36.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_36.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Every time the cat came I told him a tale about the ancestors.\"\nmsgstr \"Sokszor vendégül láttam a macskát. Mindig elmondtam egy mesét az Ősökről.\"\n\n#. Key:\t8B29FD7342676763EF53ACBB0677A1A4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"The soup still needs time.\"\nmsgstr \"A levesnek még idő kell.\"\n\n#. Key:\t8E0F057044AE753D63AA23847B146662\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_67.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_67.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"This is yours.\"\nmsgstr \"Ez a tiéd.\"\n\n#. Key:\t8E4C4FB846539DD46577B490846383F1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_1.SpeechSequence(2).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_1.SpeechSequence(2).SpeechSequence.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"We decided to keep their knowledge in our rituals.\"\nmsgstr \"Úgy döntöttünk, megőrizzük a tudásukat.\"\n\n#. Key:\t9132C2D24A241722115FD5ADB46B3145\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"And when did you start?\"\nmsgstr \"És mikor kezdted?\"\n\n#. Key:\t958CE12E48F89AE79E5ED9A4FC4AF6E7\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_48.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_48.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"That's wonderful!\"\nmsgstr \"Nagyszerű!\"\n\n#. Key:\t96E5FBCB4795EC1ADACEC7B6D814BD79\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(8).Children.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(8).Children.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Lillian\"\nmsgstr \"Lillian\"\n\n#. Key:\t9845BDB549EF25B9F5C11981123A5CCE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_33.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_33.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"You know I’m not really a trader but I might sell you some of them.\"\nmsgstr \"Nem vagyok kifejezetten az az üzletember típus, de azért lehet róla szó.\"\n\n#. Key:\t9A420B814A1C1762130310AE90157BFD\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_31.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_31.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"No, I’m sorry.\"\nmsgstr \"Nem, sajnálom.\"\n\n#. Key:\t9D8511F94E19183355A5CC8CE5B562E8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_61.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_61.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"That would be great. I appreciate your kindness.\"\nmsgstr \"Az jó lenne. Köszönöm a felajánlást.\"\n\n#. Key:\t9F2DE60B405A15F2BFB8409D162B42FD\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(3).Children.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(3).Children.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Soup\"\nmsgstr \"Leves\"\n\n#. Key:\tA53CDF2A4D9A582DD163C7B6D3DCE334\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_55.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_55.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Come back when you have my Coin.\"\nmsgstr \"Ne is lássalak, amíg vissza nem szerezted őket.\"\n\n#. Key:\tA734229B44743F88ED135FB692B9C956\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Do you know a girl called Lillian?\"\nmsgstr \"Ismersz egy Lillian nevű lányt?\"\n\n#. Key:\tA88F63334DD550FE9955A3A65B87ACDA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_63.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_63.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"I banished some of the monsters.\"\nmsgstr \"Kiűztem néhány szörnyet.\"\n\n#. Key:\tA8B5BE484641EBB61B1168AE798DABF5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"So you are making soup...\"\nmsgstr \"Szóval levest készítesz...\"\n\n#. Key:\tAAE2E35045B8E0DF8A11BF8BC84A11EF\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_0.SpeechSequence(1).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_0.SpeechSequence(1).SpeechSequence.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Every year we made a pilgrimage to the Ancient Temple to express our respect to the ancestors.\"\nmsgstr \"Minden évben elzarándokolunk a Tűz Templomába, hogy lerójuk tiszteletünket az Ősök előtt.\"\n\n#. Key:\tAC26EB6F49B026C3E768398FA0A445CB\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_50.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_50.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"then...\"\nmsgstr \"akkor...\"\n\n#. Key:\tADE8569E4FC2DCB097FF3FA4B9A0A970\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_40.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_40.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Why not? What do you need?\"\nmsgstr \"Mért ne? Mi kéne?\"\n\n#. Key:\tAE35D91D450D0414FA5F54B71E359511\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(2).Children.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(2).Children.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Who are you?\"\nmsgstr \"Ki vagy te?\"\n\n#. Key:\tAE387E9846A9C5A56569179359AD941C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_42.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_42.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"All right! I was just asking...\"\nmsgstr \"Jól van, csak kérdeztem...\"\n\n#. Key:\tAF3D9214401FEEE552256A8BAE5F8E77\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_1.SpeechSequence(4).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_1.SpeechSequence(4).SpeechSequence.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"But now Kobolds are wrathful. They make wars. They don’t respect anyone.\"\nmsgstr \"De a mostani Koboldok dühösek. Háborút szítanak. Nem tisztelnek senkit.\"\n\n#. Key:\tB06407B04855D558D1DB6B9A9A4E0B84\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_1.SpeechSequence(0).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_1.SpeechSequence(0).SpeechSequence.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Kobolds are no longer good.\"\nmsgstr \"A Koboldok már nem jók.\"\n\n#. Key:\tB082CC4B405800544484B4B0C8A25762\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_41.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_41.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"No way!\"\nmsgstr \"Kizárt!\"\n\n#. Key:\tB35F443641A7626AE4552F8D1045A95F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_38.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_38.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"I liked them very much.\"\nmsgstr \"Nagyon tetszettek a képei.\"\n\n#. Key:\tB40C1B9948722A549DBC45A1D9C277C0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_24.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_24.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"I don’t want to leave my kitchen.\"\nmsgstr \"Nem akarom itt hagyni a konyhámat.\"\n\n#. Key:\tB71FB3424C74B68E4B9CF9AF3828F867\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_64.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_64.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"I think I banished all the monsters.\"\nmsgstr \"Szerintem mindegyik szörnyet kiűztem.\"\n\n#. Key:\tB79F2026493F53FE90BABB987370695D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"What do you think honestly? You can just rob me and then come to have a chat?!\"\nmsgstr \"Mégis mit gondolsz? Csak úgy kirabolsz, aztán meg leállsz velem tereferélni?\"\n\n#. Key:\tB7B8A9294FA8D3754BB4CDA897B696BA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_69.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_69.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Great. The lake is already more peaceful.\"\nmsgstr \"Nagyszerű. Érzem én is, hogy a Tó nyugodtabb.\"\n\n#. Key:\tB9C3EC7342B52C04A491FF9AE87ABB42\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_0.SpeechSequence(0).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_0.SpeechSequence(0).SpeechSequence.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"This was the Village of my tribe. We lived here in peace.\"\nmsgstr \"Ez volt a törzsem faluja. Hosszú időn át békében éltünk itt.\"\n\n#. Key:\tBB45D70A4F2AF94BA7FCC9B3141FB98F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_17.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_17.Children(0).Children.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Accept\"\nmsgstr \"Elfogadom\"\n\n#. Key:\tC297D79246A0792DCA2CA9AD693C3A55\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"That’s all.\"\nmsgstr \"Ez minden.\"\n\n#. Key:\tC375726140A40243E29115B58048025E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_52.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_52.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Hmm... it’s delicious. Here take some!\"\nmsgstr \"Hmmm... nagyon finom! Tessék, kóstold meg!\"\n\n#. Key:\tC8BC1F254B61D749D62D4B9210DA1891\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"If you came for soup you will need to wait a bit more!\"\nmsgstr \"Ha a leves miatt jöttél, még várnod kell!\"\n\n#. Key:\tCB607C4842DF3781F8B6C9AB1A7D31F1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Where is my Coin?\"\nmsgstr \"Hol vannak az Érméim?\"\n\n#. Key:\tCE80654A43078EA1E53C5E9C5114DE54\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_60.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_60.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"I can help you banish the monsters around the lake.\"\nmsgstr \"Segíthetek elűzni a szörnyeket a Tó körül.\"\n\n#. Key:\tD1412BF6490EA9357CE9F7A873B1FCAC\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_35.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_35.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"She was really curious about our rituals.\"\nmsgstr \"Nagyon érdeklődő természete volt. Szívesen hallgatta, ha a szertartásainkról meséltem.\"\n\n#. Key:\tD76CDC9F410E2BCC21BCFB8D0D8A9E97\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_47.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_47.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"I’ve found some Purple Mushroom!\"\nmsgstr \"Találtam Rózsaszín Gombát!\"\n\n#. Key:\tD87335EA45EAC6F84022FEBE57F5CADF\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_25.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_25.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Or what? Will you cook me?\"\nmsgstr \"Vagy mit csinálsz? Megfőzöl?\"\n\n#. Key:\tD9B7F3E240430AA5EF537A8F81814751\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_71.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_71.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"I'm glad that the lake is peaceful again. Thank you!\"\nmsgstr \"Örülök, hogy újra békés a Tó. Köszönöm!\"\n\n#. Key:\tE15F80EA40F193E47F372FA7EE9A949E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_0.SpeechSequence(5).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_0.SpeechSequence(5).SpeechSequence.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Now they are gone and I'm alone with the monsters they left here.\"\nmsgstr \"Aztán elmentek, és csak a szörnyetegek maradtak utánuk, meg én.\"\n\n#. Key:\tE3947B064E58A1FD7B96A3956C54415D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_0.SpeechSequence(2).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_0.SpeechSequence(2).SpeechSequence.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"But then other Kobolds came. They called themselves the Great Kobols.\"\nmsgstr \"Aztán másféle Koboldok jöttek. Nagy Koboldoknak hívták magukat.\"\n\n#. Key:\tE48A1DFB458275188357F5811E98CFD4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_59.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_59.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"And also take this! I could have not done the soup in time without your help.\"\nmsgstr \"Fogadd el ezt! A segítséged nélkül nem lettem volna kész időben.\"\n\n#. Key:\tE58EEE904A6CBF1A0E2E768583EB03DC\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(7).Children.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(7).Children.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Trade\"\nmsgstr \"Kereskedek\"\n\n#. Key:\tE60B94C04C63F0E074A5B8ABFED7AE62\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_66.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_66.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"I have something for you.\"\nmsgstr \"Van valamim a számodra.\"\n\n#. Key:\tEA71F6A6412E69C31302A2B57BFD266F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_39.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_39.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Now they are both gone.\"\nmsgstr \"De már nincs se Lillian, se macska.\"\n\n#. Key:\tECA4BB2D4EB774315D57FD9A5D66CF25\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_22.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_22.Children(1).Children.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Don't give\"\nmsgstr \"Nem adom\"\n\n#. Key:\tED97FDEB46CAC89F65734D990569618C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_17.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_17.Children(1).Children.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Decline\"\nmsgstr \"Inkább nem\"\n\n#. Key:\tEFD0511840178E579287BAB7FA3FDADE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(0).Children.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Banish Monsters\"\nmsgstr \"Szörnyek\"\n\n#. Key:\tF5A08C63415DF9FE007B97931B7A7C31\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(9).Children.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(9).Children.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Leave\"\nmsgstr \"Távozok\"\n\n#. Key:\tF7EA437842BBD099521D81B87211F49E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_30.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_30.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"I’m the last of my tribe.\"\nmsgstr \"Én vagyok az utolsó a törzsemből.\"\n\n#. Key:\tFC8F235840D6AF4A86170791A617BCA9\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Who are you? What are you doing here?\"\nmsgstr \"Ki vagy te? Mit csinálsz itt?\"\n\n#. Key:\tFF27D3BF4D181753D73AD79D384CD3ED\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"What are you Kobolds like? What are you doing?\"\nmsgstr \"Milyenek a Koboldok? Mivel foglalkoznak?\"\n\n#. Key:\t587277824A24A49F9319D0B452A709AD\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/LB_Device.LB_Device:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Ending/E1/LB_Device.LB_Device:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_LB_Device\"\nmsgid \"Monk wanted me to use this device to separate the Worlds.\"\nmsgstr \"Szerzetes azt kérte, használjam a Szerkezetet, hogy szétválasszam a Világokat.\"\n\n#. Key:\t83B9F1E146084039E4BAD185B455209C\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LB_Device.LB_Device:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E2/LB_Device.LB_Device:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_LB_Device\"\nmsgid \"With Father we did all we could to make the device perfect. I won’t let us lose so close to the end!\"\nmsgstr \"Apával mindent megtettünk, hogy a Szerkezetet működésre bírjuk. Nem hagyom, hogy ennyire a végén bukjunk el!\"\n\n#. Key:\t90E0E1E44BE9D84FC514248D73A31935\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LB_Device.LB_Device:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Ending/E2/LB_Device.LB_Device:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_LB_Device\"\nmsgid \"Three years of hard work.\"\nmsgstr \"Három év kemény munkája.\"\n\n#. Key:\tFB8EC2184310BA168B9C6E9DB51C4492\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LB_Device.LB_Device:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E2/LB_Device.LB_Device:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_LB_Device\"\nmsgid \"I need to pull the left lever first.\"\nmsgstr \"A bal oldali kart kell először lehúznom.\"\n\n#. Key:\tDAC636D74C51C30F4B790B9F87203957\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/LB_DeviceUse.LB_DeviceUse:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Ending/E1/LB_DeviceUse.LB_DeviceUse:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_LB_DeviceUse\"\nmsgid \"Er... so far pulling the levers worked but this machine looks fairly complicated.\"\nmsgstr \"Ööö... eddig működött, hogy minden kart lehúztam, de lehet itt jobb nem kockáztatni.\"\n\n#. Key:\tE0D3606C4F357F03FBC916AA3573A81D\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/LB_DeviceUse.LB_DeviceUse:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E1/LB_DeviceUse.LB_DeviceUse:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_LB_DeviceUse\"\nmsgid \"I should look around to find some instructions on how it works.\"\nmsgstr \"Biztos van valami leírás, hogy működik ez a masina.\"\n\n#. Key:\t2DB770DF48D3199FFDEA3F8AB99126D5\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LB_LeftLever.LB_LeftLever:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Ending/E2/LB_LeftLever.LB_LeftLever:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_LB_LeftLever\"\nmsgid \"I heard them knocking on the door. They surely heard the alarm when I entered.\"\nmsgstr \"Hallottam, hogy dörömbölnek az ajtón. Biztosan hallották a riasztót, amikor beléptem.\"\n\n#. Key:\tB5D008804CCD51DF8CA8F5B99CA0C0FB\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LB_LeftLever.LB_LeftLever:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E2/LB_LeftLever.LB_LeftLever:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_LB_LeftLever\"\nmsgid \"I need to hurry. The middle lever is the next one.\"\nmsgstr \"Sietnem kell. A középső kar következik.\"\n\n#. Key:\tC7B08D314C68A7E4D21E20B128670516\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LB_MiddleLever.LB_MiddleLever:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Ending/E2/LB_MiddleLever.LB_MiddleLever:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_LB_MiddleLever\"\nmsgid \"We both made our decision three years ago.\"\nmsgstr \"Mindketten döntöttünk, három évvel ezelőtt.\"\n\n#. Key:\tFBC301B94D990F1F3FD30383FF916327\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LB_MiddleLever.LB_MiddleLever:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Ending/E2/LB_MiddleLever.LB_MiddleLever:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_LB_MiddleLever\"\nmsgid \"I’ve made my choice.\"\nmsgstr \"Már döntöttem.\"\n\n#. Key:\tFD2036CF4FC103724FB18F83754367A0\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LB_MiddleLever.LB_MiddleLever:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E2/LB_MiddleLever.LB_MiddleLever:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_LB_MiddleLever\"\nmsgid \"I heard the door exploding. Father must be really mad but It doesn’t matter now.\"\nmsgstr \"Felrobbant az ajtó. Apa nagyon mérges lehet, de most már úgyis mindegy.\"\n\n#. Key:\t98F843004F338E4480C942A9B9646BDE\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LB_RightLever.LB_RightLever:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E2/LB_RightLever.LB_RightLever:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_LB_RightLever\"\nmsgid \"I pulled the last lever.\"\nmsgstr \"Lehúztam az utolsó kart is.\"\n\n#. Key:\t9F6EBBE74FA6289497401C8E7400B01E\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LR_Bed.LR_Bed:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E2/LR_Bed.LR_Bed:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_LR_Bed\"\nmsgid \"Sleeping wasn’t easy since Mom was gone.\"\nmsgstr \"Anyu halála óta nem nagyon tudtam aludni.\"\n\n#. Key:\tAE56EE704265B61C84123F9775EB424C\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LR_Bed.LR_Bed:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E2/LR_Bed.LR_Bed:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_LR_Bed\"\nmsgid \"I really couldn’t sleep that night.\"\nmsgstr \"Aznap sehogyan sem jött álom a szememre.\"\n\n#. Key:\t344E65304BB63905D487CCAF191DFE95\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LR_Chest.LR_Chest:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Ending/E2/LR_Chest.LR_Chest:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_LR_Chest\"\nmsgid \"It was half past eleven.\"\nmsgstr \"Este tizenegy óra harminc perc volt.\"\n\n#. Key:\t5DD659BE428981065F3A989D284C3542\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LR_Chest.LR_Chest:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E2/LR_Chest.LR_Chest:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_LR_Chest\"\nmsgid \"I took the key.\"\nmsgstr \"Elővettem a kulcsot.\"\n\n#. Key:\tF21CEE6143FD904B2285F9BEE01174A0\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LR_Chest.LR_Chest:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E2/LR_Chest.LR_Chest:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_LR_Chest\"\nmsgid \"Daddy didn’t like if I went out in the night but I felt something calling for me.\"\nmsgstr \"Apa nem szerette, ha elmászkáltam éjszaka, de úgy éreztem, mennem kell.\"\n\n#. Key:\t8B18714145E8614E70F531BDB1A2AAAB\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LR_Door.LR_Door:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E2/LR_Door.LR_Door:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_LR_Door\"\nmsgid \"I always locked the door just to make sure I won’t sleep walk out.\"\nmsgstr \"Mindig kulcsra zártam az ajtót, hogy ha alvajárok, ne menjek ki véletlenül.\"\n\n#. Key:\tE5B14EEE4719891E2D2493A4E793A2C4\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LR_Door.LR_Door:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Ending/E2/LR_Door.LR_Door:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_LR_Door\"\nmsgid \"I opened the door.\"\nmsgstr \"Kinyitottam az ajtót.\"\n\n#. Key:\tF8090D7B4DCD959D7893338BDA2B6256\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LR_Door.LR_Door:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E2/LR_Door.LR_Door:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_LR_Door\"\nmsgid \"I hid the key under the clock.\"\nmsgstr \"Az óra alá szoktam rakni a kulcsot.\"\n\n#. Key:\t8363A3C9426FA1F007A5E783B1D72171\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LR_Notebook.LR_Notebook:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E2/LR_Notebook.LR_Notebook:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_LR_Notebook\"\nmsgid \"Here I collected all my less scientific notes on the Ruined Realm.\"\nmsgstr \"Ebbe a füzetbe gyűjtöttem a tudomány számára érdektelen feljegyzéseket a Fertőzött Földről.\"\n\n#. Key:\tA0B131B34A29BEADA3E3CDB74C7EDBCA\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LR_Notebook.LR_Notebook:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Ending/E2/LR_Notebook.LR_Notebook:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_LR_Notebook\"\nmsgid \"They deserve to be remembered. I will miss them.\"\nmsgstr \"Megérdemlik, hogy emlékezzünk rájuk. Hiányozni fognak.\"\n\n#. Key:\tB66C98C34782719B5CF6F19F608C00F0\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LR_Notebook.LR_Notebook:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E2/LR_Notebook.LR_Notebook:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_LR_Notebook\"\nmsgid \"So many lovely people! Despite their madness.\"\nmsgstr \"Annyi nagyszerű ember! Még az őrültség ellenére is.\"\n\n#. Key:\t0DAF7BA0480BDF56BC47A7826A5186C2\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LR_TabbyBed.LR_TabbyBed:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E2/LR_TabbyBed.LR_TabbyBed:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_LR_TabbyBed\"\nmsgid \"Sometimes I wished there could be a place like that for me as well.\"\nmsgstr \"Néha annyira vágytam rá, hogy számomra is legyen egy ilyen hely.\"\n\n#. Key:\t6084018D4E86CF2ACA89219824C8F776\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LR_TabbyBed.LR_TabbyBed:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Ending/E2/LR_TabbyBed.LR_TabbyBed:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_LR_TabbyBed\"\nmsgid \"As usually Tabby was out there maybe hunting or just hanging out with other cats.\"\nmsgstr \"Cirmos ilyenkor odakint szokott lenni. Biztos vadászik, vagy más macskákkal bandázik.\"\n\n#. Key:\t9702175346DD6BD2CBDB9C8D23460866\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LR_TabbyBed.LR_TabbyBed:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E2/LR_TabbyBed.LR_TabbyBed:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_LR_TabbyBed\"\nmsgid \"In this World, he was normal.\"\nmsgstr \"Ebben a világban normálisnak számított.\"\n\n#. Key:\t018B13FB403C2E979380C68B92CC1E46\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LR_Window.LR_Window:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Ending/E2/LR_Window.LR_Window:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_LR_Window\"\nmsgid \"Yet sometimes I liked to watch other kids playing in the castle garden.\"\nmsgstr \"Időnként szerettem nézni, ahogy a többi gyerek odalent játszik.\"\n\n#. Key:\t15454EFF40C99A479173E294B612C66C\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LR_Window.LR_Window:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E2/LR_Window.LR_Window:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_LR_Window\"\nmsgid \"They didn’t understand how important my task was.\"\nmsgstr \"Nem érthették, mennyire fontos feladatom van.\"\n\n#. Key:\t4460452B4A8B40C59075779751D3D760\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LR_Window.LR_Window:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Ending/E2/LR_Window.LR_Window:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_LR_Window\"\nmsgid \"I didn’t leave the castle since Mom died.\"\nmsgstr \"Nem mentem ki a kastélyból, mióta anyu meghalt.\"\n\n#. Key:\t795D92CB49E6F50CE37897A793C6A711\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LR_Window.LR_Window:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Ending/E2/LR_Window.LR_Window:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_LR_Window\"\nmsgid \"Two years passed and they still didn’t give up throwing balls on the window to get my attention.\"\nmsgstr \"Két év telt el, és még mindig volt, hogy az ablakomat dobálták labdával. Hátha ki tudnak csalogatni.\"\n\n#. Key:\tB1A689B24F5D77A715114AB718126A75\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LR_Window.LR_Window:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E2/LR_Window.LR_Window:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_LR_Window\"\nmsgid \"They will never understand.\"\nmsgstr \"Soha nem fognak megérteni.\"\n\n#. Key:\t06B2BD844B477A747E086F9F0C3BCAFE\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"Well, that fountain is definitely not your cup of tea but you can accept that it might be the fairest for the Magic Mirror...\"\nmsgstr \"Ami azt illeti, a szökőkút biztosan nem az eseted, de el tudod fogadni, hogy a Varázstükör számára az a legszebb...\"\n\n#. Key:\t264C2C1040339F9680CA129F4E6E7764\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_65.Children(0).Children.Text\n#. Key:\t608D4BF341FEE76F239D6BA3B34F65E7\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_1.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_1.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_65.Children(0).Children.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"Who is the fairest?\"\nmsgstr \"Ki a legszebb?\"\n\n#. Key:\t2C246C1326080F0A003A03BBBE7E9F40\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_39.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_39.Children(1).Children.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"Wish something\"\nmsgstr \"Kívánok valamit\"\n\n#. Key:\t2C6C88C54439E3C689E86DB30560B807\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_66.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_66.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"No matter how hard you try to receive a sign, the Mirror remains silent. It doesn't show you anything this time.\"\nmsgstr \"Akármeddig is bámulod, a Víztükör felszínén semmilyen változást nem tudsz kivenni.\"\n\n#. Key:\t317248C14F0904B6E6B04080841C75D1\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_39.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_39.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"The water seems to be boiling and the bubbles pop when they hit the surface; it is indeed mesmerizing. Suddenly, something breaks the silence - you can hear whispers.\"\nmsgstr \"A víz izgatottan bugyog, és mintha halk suttogást hallanál.\"\n\n#. Key:\t372D97104DC7D67AF4B2409B7CBC602D\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_66.Children(0).Children.Text\n#. Key:\t432E8D794C2FB271D9B39283EBD9E33B\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_1.Children(2).Children.Text\n#. Key:\tF212015B402EF862C9869394531175DC\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_65.Children(2).Children.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_1.Children(2).Children.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_65.Children(2).Children.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_66.Children(0).Children.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"Leave\"\nmsgstr \"Távozok\"\n\n#. Key:\t3FBF959348F2AFFA8016AA9371DD0800\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"You politely explain that you want to see your past instead of your body, but the Mirror is stubbornly stuck on this image.\"\nmsgstr \"Udvariasan elmagyarázod, hogy a saját múltadat szeretnéd látni, és nem a test múltját, de a Tükör makacsul kitart ennél a képnél.\"\n\n#. Key:\t4620F3E84D5DC9847AB8A8891CF66F20\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_67.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_67.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"You place the flower and wait to see what happens.\"\nmsgstr \"Elhelyezed a virágot, és vársz, hátha történik valami.\"\n\n#. Key:\t5C2363C64023EB8E1705D3BFC3310A8A\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_65.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_65.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"The vision fades away.\"\nmsgstr \"A látomás elenyészik.\"\n\n#. Key:\t648780E44EF4F6587D31E7AE2BE4CCE4\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_68.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_68.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"The Mirror seems to be unavailable at the moment. It doesn't want to be bothered. Maybe you should return later.\"\nmsgstr \"Úgy tűnik, a Tükör nem akar most veled foglalkozni. Talán majd később.\"\n\n#. Key:\t74CAAA1D4671A258A6D188BCED32CCBD\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_69.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_69.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"The water turns still. Deep under the surface you notice a glimmering light.\"\nmsgstr \"A víz lecsendesedik, mélyén valami fényes tárgy felszínén csillan meg a fény.\"\n\n#. Key:\t7CD8BEEA40A36A22057920807BBEEC07\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"The Magic Mirror shows things that were, things that are, and things that yet may be. \\r\\nYou fill the basin with water and start contemplating. You meditate about...\"\nmsgstr \"A Varázstükör olyasmit is mutathat, ami volt, olyasmit is, ami még csak lesz. De még a legbölcsebb személy se tudja mindig, hogy mi az, amit lát.\\nA vízből színültig töltöd a tálat. Arra gondolsz...\"\n\n#. Key:\t8226F9B3495DE20F137F95A7F3583FE0\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"Ruin left this place almost untouched. The street lamps spread light on a couple of metal benches and flower pots.\"\nmsgstr \"A Fertőzés itt kíméletes volt. Az utcalámpák színes fényében néhány kovácsoltvas padot és virágos vázát pillantasz meg, középen egy szökőkút áll.\"\n\n#. Key:\t82C33F1E49C5DC76BF19648A414F7209\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"You are watching the ball and start to get frustrated. You don't want to look at this body replacement... this raggy shell... You want answers!\"\nmsgstr \"Egyre csak a labdát bámulod, és egyre dühösebb leszel. Nem erre a vacak pót-testre vagy kíváncsi! Azt szeretnéd tudni, ki vagy!\"\n\n#. Key:\t8F94D5E34488ECDCE9E051BB1ABE66B9\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_1.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_1.Children(1).Children.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"Who you were in the past\"\nmsgstr \"Ki voltam ezelőtt?\"\n\n#. Key:\t9BA86AAD4282A943E8A57390E2C4E3CF\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_39.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_39.Children(0).Children.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"Floating Flower\"\nmsgstr \"Vízi Virág\"\n\n#. Key:\tA8A6D8D44F9344A162FAA080C839B28A\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"There are glass shards all over the place. There's a ball on the floor next to the girl.\"\nmsgstr \"Mindent üvegszilánkok borítanak. A kislány mellett a padlón egy labda hever.\"\n\n#. Key:\tAF212CEC43A56245A848DABD21ECBAFC\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_70.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_70.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"You reach for the light and your fingers grab onto something smooth and cold.\"\nmsgstr \"Benyúlsz a víz alá, még ujjaid valami simát és hideget érintenek.\"\n\n#. Key:\tB8E2A52B442F3B45A1D993A8548DE124\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"You are seeing the wizard's room once more. There is a weakened little girl lying on the floor in the middle of the room. She is surrounded by stone runes, candles and magical potions.\"\nmsgstr \"Újra a Varázsló szobáját látod. Sápadt arcú kislány fekszik a terem közepén, körülötte gyertyák, és varázskellékek.\"\n\n#. Key:\tB9217F85404B488DB6F4DDACFF2B824C\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_65.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_65.Children(1).Children.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"What you were before\"\nmsgstr \"Ki voltam ezelőtt?\"\n\n#. Key:\tCD33272B416D2FDE283D44BA6F50475C\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"The image zooms in and you have a clearer view of the fountain. You are waiting for more, but nothing happens.\"\nmsgstr \"A kép közelebbire vált, most már tisztán látod a szökőkutat.\"\n\n#. Key:\tD64B38F1470B27D21AE539AE80AE666A\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"You are seeing the Ruined Realm from afar. The view gets closer until you find yourself looking at the top of a tower.\"\nmsgstr \"A Fertőzött Földet látod a távolból. A kép egyre közelít, nemsokára megpillantod egy torony tetejét.\"\n\n#. Key:\tF3C496794CC4A68DDC764895FF2DFC77\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_72.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_72.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"You found a precious rune stone! Hmmm...Is this the gift offered by the Mirror in exchange for your enchanting flower?\"\nmsgstr \"Egy Rúna Követ találtál! Ezzel jutalmazna a Tükör a virágért cserébe?\"\n\n#. Key:\t10A6FAE44F71FBB21522B1AAE5E20DAE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_29.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_29.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"I don’t care what happens here after I’m back home.\"\nmsgstr \"Nem érdekel, mi fog itt történni, csak jussak haza.\"\n\n#. Key:\t12C6550D4143AFE12C6986B427D2927A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"He can’t release his daughter. He can’t accept that she is gone. He wants to get her back even if it means they all die after a few months...\"\nmsgstr \"Nem tudja elengedni a lányát. Nem tudja elfogadni, hogy már nincs többé. Úgy is vissza akarja kapni, ha utána csak néhány hónapja marad a világnak.\"\n\n#. Key:\t1C714E474408001FB67CEABF92FAB019\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Wait! You can’t just dis...\"\nmsgstr \"Várj, nem választh...\"\n\n#. Key:\t209B77394D419812DD1BD7A3D7A92B94\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_39.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_39.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"All right and what can we do against it?\"\nmsgstr \"Értem, és mit tehetünk ellene?\"\n\n#. Key:\t209BF95E4275418CE020E3AB028AFC10\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Now it’s better.\"\nmsgstr \"Máris sokkal jobb.\"\n\n#. Key:\t230C6ED4416FDD6C5E00FAB8B30FBB17\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"To be honest I don’t have the faintest idea. I just want to be free again.\"\nmsgstr \"Őszintén szólva fogalmam sincs. Csak újra szabad akarok lenni.\"\n\n#. Key:\t25227AB342F4A0E76082539072C1143D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_37.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_37.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Do you think Ruin will stop after swallowing the Human Realm?\"\nmsgstr \"Azt hiszed, a Fertőzés meg fog állni az Ember Világ után?\"\n\n#. Key:\t266261C240DB77D1306C5F8EEE3D0189\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"He says he wants his daughter back but I think he is still trying to close the Realm to stop Ruin.\"\nmsgstr \"Azt mondja, a lányát szeretné visszakapni, de szerintem még mindig szét akarja választani a Világokat.\"\n\n#. Key:\t283810E04DE48471FBE6BD9BE9DD337D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Yet he doesn’t care about the World. He wants to get her back even if it means they all die after a few months...\"\nmsgstr \"De őt nem érdekli már a Világ sorsa. Akkor is vissza akarja kapni a lányát, ha csak néhány hónapjuk lesz utána, mielőtt minden véget ér...\"\n\n#. Key:\t2CE94F19412379ECE927A3AEEEAC3756\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_1.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_1.Children(1).Children.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Thanks for the Soulcaster\"\nmsgstr \"Kösz a Lélekőrt\"\n\n#. Key:\t2DB5F39F45BB9EC8ABBFEA9020DF94E7\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Why should it concern me if Ruin destroys your Realm? You deserve it for summoning us to do the hard work.\"\nmsgstr \"Miért kéne hogy izgasson, elpusztítja-e a Fertőzés a ti Világotokat? Megérdemlitek, amiért rabszolgát csináltatok belőlünk.\"\n\n#. Key:\t30E5A67B4135A5402AE021832F89D4D1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"You again? I told you if you want something from the Wizard go and find him yourself...\"\nmsgstr \"Megint te? Mondtam, ha akarsz valamit a Varázslótól, keresd fel személyesen...\"\n\n#. Key:\t34BCB98247406A77FB5A5C8942543588\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_38.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_38.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"It might take time but it will reach the Unknown Realm and all the spirits will become part of Ruin just like those who were summoned here.\"\nmsgstr \"Időbe fog telni, de végül a Fertőzés eléri az Ismeretlen Világot, és magába olvasztja az ott élő szellemeket. Úgy jártok majd, mint azok, akiket ide idéztek.\"\n\n#. Key:\t379B50904FB774AD057BBB810BDD445C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_41.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_41.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"I’m not sure. I will think about it.\"\nmsgstr \"Nem tudom még. Át kell gondolnom.\"\n\n#. Key:\t38BEECF94D2EB7B2C6596593E576A360\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_30.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_30.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"The Wizard created a device which can separate the Realms. This is the only way to stop Ruin from spreading.\"\nmsgstr \"Varázsló készített egy Szerkezetet, ami képes szétválasztani a Világokat. Egyedül így tudjuk megakadályozni, hogy a Fertőzés átterjedjen.\"\n\n#. Key:\t3D7B856A4D97FCCC2A2B89BCB6295471\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"This time I would like to talk to you...\"\nmsgstr \"Ezúttal veled szeretnék beszélni...\"\n\n#. Key:\t40A329C7465166A11C73B694D6A79A00\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_12.Children(2).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_12.Children(2).Children.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Don’t know\"\nmsgstr \"Nem tudom\"\n\n#. Key:\t4D356117496E625B6B4C64A611496A9F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_24.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_24.Children(1).Children.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Not my problem\"\nmsgstr \"Nem az én gondom\"\n\n#. Key:\t4FE5ADF04D1079CCD1E16697E82B39B5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_35.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_35.Children(0).Children.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Accept plan\"\nmsgstr \"Benne vagyok\"\n\n#. Key:\t53D6055344A880433B1093B029DA8CA5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_12.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_12.Children(0).Children.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Bring back daughter\"\nmsgstr \"A lányát visszakapni\"\n\n#. Key:\t599FF022411F5BA2EB0F32A1F947C661\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_35.Children(2).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_35.Children(2).Children.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Not sure\"\nmsgstr \"Nem vagyok biztos\"\n\n#. Key:\t5FD6018040C38B8A3F40C78C913AC251\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_40.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_40.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Have no fear, I will have this done!\"\nmsgstr \"Ne aggódj, számíthatsz rám!\"\n\n#. Key:\t6B3585BA4AFE614FF428FCAE698872A8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_33.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_33.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"For you this would be completely different. For you this is not a sacrifice but a way of going home!\"\nmsgstr \"Neked ugyanez teljesen más lenne. Számodra átkerülni az Ismeretlen Világba nem áldozat, hanem hazaút.\"\n\n#. Key:\t6E1C94F24F493D7075A7509F8181AD27\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"You are wrong. The World is falling apart yet he doesn’t care about it even when he is the only one who could stop Ruin.\"\nmsgstr \"Tévedés. A Világ darabokra hullik, őt pedig ez már a legkevésbé sem érdekli. Még úgy sem, hogy ő az egyetlen, aki tehetne ellene.\"\n\n#. Key:\t71A64B804C0CCE26571E9E8237AA5000\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"I’m also glad. It was bloody damn difficult.\"\nmsgstr \"Én is örülök. Hülye nehéz volt.\"\n\n#. Key:\t78305AE64B56098D32806EB509133BBC\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_35.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_35.Children(1).Children.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Decline plan\"\nmsgstr \"Inkább nem\"\n\n#. Key:\t7C92B8BF4CEA3093BB817682B501DC67\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"The World is falling apart and only the Wizard has a chance to stop this.\"\nmsgstr \"A Világ darabjaira hullik, és egyedül Varázslónak van esélye tenni ellene.\"\n\n#. Key:\t8B2CE8144EB2A7C89AFA1BACC3EE1B88\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Hello, little Wanderer! I’m glad you made it this far.\"\nmsgstr \"Helló, kicsi Vándor! Örülök, hogy ilyen messzire jutottál.\"\n\n#. Key:\t8CC98B374125E6E6A6A20C97F4A3B067\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_24.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_24.Children(0).Children.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"I'm a demon\"\nmsgstr \"Démon vagyok\"\n\n#. Key:\t8D4701A1469997CBC879788351B37B0A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_31.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_31.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"My plan is simple.\"\nmsgstr \"A tervem egyszerű.\"\n\n#. Key:\t8E4693F04E60AFF4757A5887973894BE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_27.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_27.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"I saw Ruin and I don’t want the same to happen to any other Realm. What can I do?\"\nmsgstr \"Láttam a Fertőzést, nem hagyhatom, hogy a többi Világot is elérje. Mit tehetek?\"\n\n#. Key:\t9193CB2747033644F006809E0E4A812A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_45.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_45.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"For the sake of all Realms I hope you will make the right decision.\"\nmsgstr \"Minden Világ érdekében, remélem a helyes utat választod.\"\n\n#. Key:\t95D6FBCC42CC4F4041D0B5B64996FD5C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_35.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_35.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Once you are there find the Laboratory and activate the device! It will take you home and will separate the Worlds which means no spirit will be ever summoned again!\"\nmsgstr \"Ha sikerül bejutnod a Laboratóriumba, aktiváld a Szerkezetet! Át fog vinni az Ismeretlen Világba, és szét fogja választani a Világokat. Ez azt is jelenti, hogy soha többé nem idézhetnek szellemeket rabszolgának.\"\n\n#. Key:\t9ADEF37F49EA90EF320B5E8BB2D8D769\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"...and I don’t want our conversation to be overheard, so if you don’t mind...\"\nmsgstr \"...és nem szeretném, hogy bárki is kihallgasson minket. Szóval, ha nem bánod...\"\n\n#. Key:\t9F01EFC54F3FC5B709F697860BE0572D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_24.Children(2).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_24.Children(2).Children.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"How to save the World?\"\nmsgstr \"Hogy mentsük a Világot?\"\n\n#. Key:\tA71226674132E2666925AEB28D2FC024\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_46.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_46.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Farewell Wanderer!\"\nmsgstr \"Ég veled, Vándor!\"\n\n#. Key:\tB1E3A9DB4A75C08067DCA19113A6A8A2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Calm down little spirit.\"\nmsgstr \"Nyugalom, kicsi Szellem.\"\n\n#. Key:\tB355BD604F9EC22514DA14B64B0F5E5E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_43.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_43.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Thank you Spirit! For the sake of all Realms I hope you won’t fail on your way!\"\nmsgstr \"Örök hála, Szellem! Minden Világ érdekében remélem, sikerrel jársz utadon!\"\n\n#. Key:\tB6D3E23045C4BC5B3E5F3D83E2DFBADB\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_19.Text\n#. Key:\tDC3219914721210BD169D2989F03D18D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"But we won’t let this happen, will we?\"\nmsgstr \"De nem hagyjuk, hogy ez történjen, igaz?\"\n\n#. Key:\tBAC828A540E6C81EE43EBF8036A8146A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_42.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_42.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"You deserve Ruin. I won’t save the Human Realm!\"\nmsgstr \"Megérdemlitek a Fertőzést. Semmi kedvem megmenteni az Ember Világot!\"\n\n#. Key:\tC837CED4495F79594133F4B2C0FCE5F8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Where shall I start? Do you know what the Wizard is up to? Did he tell you?\"\nmsgstr \"Hol is kezdjem? Tudod, mire készül Varázsló? Elmondta, mit akar?\"\n\n#. Key:\tD060173B4D5502FC06A69E865DAFD5E6\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_26.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_26.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"This is not my Realm and not my problem. All I want is to get out of here.\"\nmsgstr \"Ez nem az én Világom, és nem az én problémám. Én csak haza akarok jutni.\"\n\n#. Key:\tD520C3AC46F62B77554443A4589845C1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"He would like to bring his daughter back to life. For that he needs three artefacts which are somewhere here.\"\nmsgstr \"Vissza akarja hozni a lányát. Ehhez kell neki három Varázstárgy, ami valahol itt van a környéken.\"\n\n#. Key:\tD7F841B14E18D77AB5FBD2A34D59BC92\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_44.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_44.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"I understand your fury. Yet I hope you will change your mind.\"\nmsgstr \"Megértem a haragodat. Mégis, bízok benne, hogy meggondolod magad.\"\n\n#. Key:\tD80B81914A550F305934F9852C1DD6B0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_23.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_23.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"He lost his daughter and he can’t release her. He can’t accept that she is gone.\"\nmsgstr \"Elvesztette a lányát, de nem tudja elengedni. Nem tud együtt élni a tudattal, hogy már nincs többé.\"\n\n#. Key:\tD816A79E4160BC4426CD22A63C7987A0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Before you go on I have something to discuss with you...\"\nmsgstr \"Mielőtt elmész, van valami, amit meg akarok beszélni veled...\"\n\n#. Key:\tDD870754471358DEFE9CB5BFA554AB7C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_1.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_1.Children(0).Children.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Me too\"\nmsgstr \"Én is\"\n\n#. Key:\tE0CCA2604AA40FED355A859A1FA02DDA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_1.Children(2).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_1.Children(2).Children.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"I won’t deliver any message\"\nmsgstr \"Nem adok át üzenetet\"\n\n#. Key:\tE1C3F2E34680BA8B67521C905AD42ADA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"That’s correct. He can’t release his daughter. He can’t accept that she is gone.\"\nmsgstr \"Így van. Elvesztette a lányát, és nem tudja elengedni.\"\n\n#. Key:\tE93136104181FAA899F2CE801497DCBA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_25.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_25.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"I know right now it doesn’t look that way, but I’m a mighty demon of the Unknown Realm.\"\nmsgstr \"Tudom, hogy jelenleg ez annyira nem látszik, de valójában egy nagyhatalmú démon vagyok az Ismeretlen Világból.\"\n\n#. Key:\tEC116A8848A471EB2C5DC8BA1D187C9A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_12.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_12.Children(1).Children.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Close Ruined Realm\"\nmsgstr \"Válasszuk szét a Világokat\"\n\n#. Key:\tEC6221CE4B85E7D1887DBCA6D85D8238\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"It wasn’t easy but I made good use of the Spellcaster you gave me.\"\nmsgstr \"Nem volt könnyű, de nagy hasznát vettem a Lélekőrnek, amit kaptam tőled.\"\n\n#. Key:\tED5356DE42F2ED2203F7AFB30231643E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_34.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_34.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"When you deliver the artefacts he will let you into his tower.\"\nmsgstr \"Ha megszerezted a Varázstárgyakat, be fog engedni a kastélyába.\"\n\n#. Key:\tEE78AD4147800BD0E160A8B6A3F51FBD\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_32.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_32.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"When the Wizard’s daughter activated the device it transported her soul into the Unknown Realm. At that point the Wizard stopped the device so that he can summon his daughter back.\"\nmsgstr \"Amikor Varázsló lánya aktiválta a Szerkezetet, az átvitte a lelkét az Ismeretlen Világba. Ezen a ponton Varázsló leállította a Szerkezetet, mert ha az szétválasztja a Világokat, akkor a lánya az Ismeretlen Világban ragad örökre.\"\n\n#. Key:\tEFACA50447BAC08293281BB11A5E11B3\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_36.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_36.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"This is just as much your problem as it is mine.\"\nmsgstr \"Pont annyira a te problémád, mint amennyire az enyém.\"\n\n#. Key:\tFB0E702746132A3C688D9EA492A01B50\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"You made it and that is what matters.\"\nmsgstr \"Sikerült, és ez az, ami számít.\"\n\n#. Key:\t4BE3EE734EFED241B7FA2192EEB146A5\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/MR_Bed.MR_Bed:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Ending/E2/MR_Bed.MR_Bed:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_MR_Bed\"\nmsgid \"We always wore colourful clothes because that made her happy.\"\nmsgstr \"Mindig színes ruhákba öltöztünk, az jobb kedvre derítette.\"\n\n#. Key:\t7F5F069D4E9C7F15ED2B8CA45154FCFE\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/MR_Bed.MR_Bed:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E2/MR_Bed.MR_Bed:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_MR_Bed\"\nmsgid \"Most of her time she just lied here and stared at nothing.\"\nmsgstr \"Az ideje nagy részében csak itt feküdt, és a semmibe bámult.\"\n\n#. Key:\tEA25DBC34832960AB03A32A5B08AC404\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/MR_Bed.MR_Bed:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E2/MR_Bed.MR_Bed:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_MR_Bed\"\nmsgid \"Sometimes she talked about grey lands.\"\nmsgstr \"Néha fakó földekről beszélt.\"\n\n#. Key:\t58E06C3A45DD46A34F155BAA62933039\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/MR_Chair.MR_Chair:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Ending/E2/MR_Chair.MR_Chair:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_MR_Chair\"\nmsgid \"I hope they will never find out how wrong they were. I hope there is still time for our World.\"\nmsgstr \"Remélem, soha nem jönnek rá, mekkorát tévedtek.\"\n\n#. Key:\t9EA75B664E62ABF38E44BE8DC3050AC9\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/MR_Chair.MR_Chair:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E2/MR_Chair.MR_Chair:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_MR_Chair\"\nmsgid \"This is where the doctor used to sit. He never believed that Mom was infected by the Ruin.\"\nmsgstr \"Itt szokott ülni az orvos. Soha nem hitte el, hogy anyut a Fertőzés tette beteggé.\"\n\n#. Key:\tA408630F44A3B2345A2D0AA8395D97F2\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/MR_Chair.MR_Chair:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E2/MR_Chair.MR_Chair:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_MR_Chair\"\nmsgid \"No one ever believed in Ruin.\"\nmsgstr \"Senki nem hitt a Fertőzésben.\"\n\n#. Key:\t1AFEF7EB49BB3BEA5BB76793A60ED7C9\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/MR_Lamps.MR_Lamps:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E2/MR_Lamps.MR_Lamps:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_MR_Lamps\"\nmsgid \"This room was the brightest in the castle.\"\nmsgstr \"Ez volt a kastély legfényesebb szobája.\"\n\n#. Key:\tC132BEA446B4441615D7029E8AA5BBB5\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/MR_Lamps.MR_Lamps:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E2/MR_Lamps.MR_Lamps:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_MR_Lamps\"\nmsgid \"I took some oil.\"\nmsgstr \"Elvettem az olajat.\"\n\n#. Key:\tFE826997431A2665AC2788A62558B88E\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/MR_Lamps.MR_Lamps:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Ending/E2/MR_Lamps.MR_Lamps:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_MR_Lamps\"\nmsgid \"Father bought some exotic lamp oil so that we had coloured lights.\"\nmsgstr \"Apa messzi földről hozatott különleges lámpaolajokat, amelyek színes lánggal égtek.\"\n\n#. Key:\t430A10B04FAC9288EC2794A31DF6699E\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/MR_Paintings.MR_Paintings:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E2/MR_Paintings.MR_Paintings:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_MR_Paintings\"\nmsgid \"Mom was always fond of art.\"\nmsgstr \"Anyu mindig is rajongott a művészetekért.\"\n\n#. Key:\t53AA7E134FA0E30F37FC8CB50425520F\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/MR_Paintings.MR_Paintings:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E2/MR_Paintings.MR_Paintings:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_MR_Paintings\"\nmsgid \"After she got sick she couldn’t paint the way she did before yet she still liked it.\"\nmsgstr \"A betegsége után már nem tudott úgy festeni, mint azelőtt, de attól még szeretett próbálkozni.\"\n\n#. Key:\t8484045A4107378E9CC8FFAA02C94A87\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/MR_Paintings.MR_Paintings:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Ending/E2/MR_Paintings.MR_Paintings:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_MR_Paintings\"\nmsgid \"It could engage her for hours.\"\nmsgstr \"A festés órákra is le tudta kötni.\"\n\n#. Key:\t009BF08145DBE86FFB07BA9A6BD77A8E\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_5.Children(2).Children.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_5.Children(2).Children.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"Not my business\"\nmsgstr \"Nem az én dolgom\"\n\n#. Key:\t00DE9BE1446C5D5C0D62469B41A1B693\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_5.Children(0).Children.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_5.Children(0).Children.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"Lillian?\"\nmsgstr \"Lillian?\"\n\n#. Key:\t0C3B729C4618E8A817F019B8E916425B\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"Maybe we failed the ritual again and summoned another of your kind.\"\nmsgstr \"Talán mégis elrontottunk valamit, és ismét megidéztünk valakit a te népedből.\"\n\n#. Key:\t0CAC15144B37144A99A9EB9D13CCC9DE\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_32.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_32.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"What do you expect me to do, Spirit?\"\nmsgstr \"Mégis mit vársz, mit tegyek?\"\n\n#. Key:\t1493C597483503024A3C5CA8F0FA1327\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"I’ve already done way too much for you.\"\nmsgstr \"Már eddig is túl sokat tettem értetek.\"\n\n#. Key:\t15BAD73D49BF7C62469D8E9CD0B2AAF4\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"Now, take me home!\"\nmsgstr \"Juttass haza!\"\n\n#. Key:\t1962A69C42E8FDD365AFC9AB626605F7\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"We made the spell... and it worked!\"\nmsgstr \"Végigcsináltuk a varázslatot, és... működött!\"\n\n#. Key:\t1AC8DD104163078CA72065A0B43B5C57\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"And then what?\"\nmsgstr \"És aztán mi?\"\n\n#. Key:\t2034A3164695766F8C17B69CD0937C02\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_25.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_25.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"And he...\"\nmsgstr \"És ő...\"\n\n#. Key:\t22668011432DEF65ACF29793FF234E07\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_37.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_37.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"Someone like me...\"\nmsgstr \"Valakivel, aki olyan, mint én...\"\n\n#. Key:\t2386A8D24BD256982D486AAF71B57ABD\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_23.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_23.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"She destroyed half of the room before we could even cast a spell.\"\nmsgstr \"A démon-kislány a szoba felét darabokra zúzta, még mielőtt egyetlen varázslatot is elmondhattunk volna.\"\n\n#. Key:\t250E11A440445CAFB5252A92C5100735\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"That’s how you handle situations like these...\"\nmsgstr \"Így szoktátok kezelni az ilyen helyzetet...\"\n\n#. Key:\t298BEA5646602444742C3BAD65866EF9\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"I’m not sure... Everything happened so fast.\"\nmsgstr \"Nem tudom... Minden olyan gyorsan történt.\"\n\n#. Key:\t2FAFABFC43A75D29B671739D16759E43\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"What happened?\"\nmsgstr \"Mi történt?\"\n\n#. Key:\t303D9BF54AB3034565A45594AB5636DF\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"I can’t... I’m sorry!\"\nmsgstr \"Nem megy... Sajnálom!\"\n\n#. Key:\t378D7F984C821E23AF0CBEA7D24EFCC1\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"What happened to Lillian? Has she returned?\"\nmsgstr \"Mi lett Lilliannal? Visszatért?\"\n\n#. Key:\t38EF0908448C7E5298C4F496DACAD5AD\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"Something... arrgh... something went wrong...\"\nmsgstr \"Valami... ááárgh... valami félresikerült...\"\n\n#. Key:\t3A328FA74AA2FBC2AFE84CA195DAE236\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"You are Raven’s master...\"\nmsgstr \"Te Raven gazdája vagy...\"\n\n#. Key:\t462226704638D0C32B1DEBA3DFE138A1\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"She was taken over by a wicked force and she unleashed boundless spells.\"\nmsgstr \"Gonosz erő szállta meg. Olyan varázslatokat használt, amiket azelőtt elképzelni sem tudtam volna.\"\n\n#. Key:\t49B5501A4917D23E6B3B99B430076ABA\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"It was like the devil itself.\"\nmsgstr \"Mintha maga lett volna a megtestesült gonosz.\"\n\n#. Key:\t4B173FBD4D4F48A468016BB055CC573C\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"Where is Wizard? Something happened to him?\"\nmsgstr \"Hol van Varázsló? Valami történt vele?\"\n\n#. Key:\t5341F61045AA32F212173EA9CAB67695\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_39.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_39.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"Wizard was right when he decided to trust you.\"\nmsgstr \"Már értem, miért bízott meg benned Varázsló.\"\n\n#. Key:\t551AEBA64D1E99B2CCFA3DB13E168A02\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_27.Children(1).Children.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_27.Children(1).Children.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"I won’t fight\"\nmsgstr \"Nem harcolok\"\n\n#. Key:\t592A8CF045DF1BD875B05F9493FE2BB4\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_38.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_38.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"I will face her!\"\nmsgstr \"Szembeszállok vele!\"\n\n#. Key:\t5B65F12D43B12FA943D7469FEE2CE2E0\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"We made everything right...\"\nmsgstr \"Mindent jól csináltunk...\"\n\n#. Key:\t65A974C344D2B4DD644901994086A31D\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_30.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_30.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"Why is it that every time you refuse to face the consequences of your actions, it is me who needs to clean up your mess?\"\nmsgstr \"Miért van az, hogy minden esetben, amikor ti nem vállaljátok a felelősséget valamiért, akkor nekem kell rendbe tennem a dolgokat helyettetek?\"\n\n#. Key:\t66D0FDF04AF5351330E83080759ED974\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_40.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_40.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"I'm sorry that I can't help...\"\nmsgstr \"Sajnálom, hogy nem tudok segíteni...\"\n\n#. Key:\t7FFE18B74C54BB92334399983F82DBCA\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_34.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_34.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"You are free to do whatever you want!\"\nmsgstr \"Szabad vagy! Azt teszel, amit jónak látsz!\"\n\n#. Key:\t8739EB3D48E4F2A997E604A60F7F32B3\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"Was it trapped inside a teddy bear?\"\nmsgstr \"És, őt meg bezártátok egy plüssmaci testbe?\"\n\n#. Key:\t8E2F09164340534A484A46AD45E4E105\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_27.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_27.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"The demon-Lillian left. There is no one who could stop her now...\"\nmsgstr \"A démon-Lillian elment. Már nincs senki, aki meg tudná állítani...\"\n\n#. Key:\t900D084E4F673FEBEACE3E916103B93E\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"She had fire in her eyes...\"\nmsgstr \"Tűz égett a szemeiben...\"\n\n#. Key:\t91C26C314425AB8C973F1FB54061F639\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"Lillian woke up and then...\"\nmsgstr \"Lillian felkelt, és...\"\n\n#. Key:\t95CE9C6C4901E613AD5DB38E51AC0DB3\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_35.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_35.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"Leave and let me rest in peace...\"\nmsgstr \"Menj, hagyj békében pihenni...\"\n\n#. Key:\t9AF3E069409F31E4F50A5990A416A39C\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_19.Children(1).Children.Text\n#. Key:\tF5A670D640D73DF452C02A948CB68F75\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_5.Children(1).Children.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_19.Children(1).Children.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_5.Children(1).Children.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"Wizard?\"\nmsgstr \"Varázsló?\"\n\n#. Key:\t9B1B8322442B6D7D76F2119E0A0574FA\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"Is the Wizard safe? What happened afterwards?\"\nmsgstr \"Varázsló épségben van? Mi történt ezután?\"\n\n#. Key:\tA82789354D984476223432A2BE199293\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_24.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_24.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"I was hit by the table.\"\nmsgstr \"Engem feldöntött az asztal.\"\n\n#. Key:\tAA6EFD044C1D21008EEA189DE75740E7\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_41.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_41.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"Good luck with... everything!\"\nmsgstr \"Sok szerencsét... mindennel!\"\n\n#. Key:\tACAF3D904A149C0E9F91E5AC852D8309\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_31.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_31.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"Let me go!\"\nmsgstr \"Engedj szabadon!\"\n\n#. Key:\tB223647F4C35858A62A5509C7B22C23B\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_27.Children(0).Children.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_27.Children(0).Children.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"I'll stop her\"\nmsgstr \"Megállítom\"\n\n#. Key:\tD0E16FEF4D5415EC6D2C299252E5675D\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_26.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_26.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"He was burnt to ashes.\"\nmsgstr \"Ő pedig hamuvá égett.\"\n\n#. Key:\tD23076F4475E6CE385ECB2B3B2749CA9\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_36.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_36.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"I have always wanted to meet someone of my own kind anyway.\"\nmsgstr \"Mindig is találkozni akartam valakivel a fajtámból.\"\n\n#. Key:\tD290445E4EB74446478970934785BA10\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"I can’t open a Gate without Wizard...\"\nmsgstr \"Nem tudok Varázsló nélkül Kaput nyitni...\"\n\n#. Key:\tD6EB1BE248E9C483E6D94B8E8A7815F6\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"I don't understand... It is...\"\nmsgstr \"Nem értem... ez nem...\"\n\n#. Key:\tEC42D62E46269139E9E69B876EDED5B1\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_33.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_33.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"It wasn't me who brought you here.\"\nmsgstr \"Nem én hoztalak ide.\"\n\n#. Key:\tF0711D5F4698DAA99E484E94FDB3EF9C\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_19.Children(0).Children.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_19.Children(0).Children.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"Was it trapped?\"\nmsgstr \"Bezártátok?\"\n\n#. Key:\tFDE62A034456071EFE9639B73108BB1E\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"I can't let her destroy everything!\"\nmsgstr \"Nem hagyom, hogy mindent elpusztítson!\"\n\n#. Key:\tFDFD2B2B4352B564118519874199B48C\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_29.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_29.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"No-no-no!\"\nmsgstr \"Nem, nem, nem!\"\n\n#. Key:\t2E3C904D458640A4F06DD793B416366A\n#. SourceLocation:\t/Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_SewerCreatures\"\nmsgid \"All right, I will return when I'm done.\"\nmsgstr \"Rendben, visszajövök, ha végeztem.\"\n\n#. Key:\t41F6B75041803A654088469BCB887165\n#. SourceLocation:\t/Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_1.Children(0).Children.Text\n#: /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_1.Children(0).Children.Text\nmsgctxt \"Dialogue_SewerCreatures\"\nmsgid \"Really?\"\nmsgstr \"Igazán?\"\n\n#. Key:\t43EE0E60407CA7CB7431BDB2767C6E19\n#. SourceLocation:\t/Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_SewerCreatures\"\nmsgid \"That's sad. What happened exactly?\"\nmsgstr \"Sajnálom. Hogy történt?\"\n\n#. Key:\t53AC225B4F21B68CAC6F8997F324124E\n#. SourceLocation:\t/Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_29.Text\n#: /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_29.Text\nmsgctxt \"Dialogue_SewerCreatures\"\nmsgid \"Farewell until we meet again!\"\nmsgstr \"Szia!\"\n\n#. Key:\t5ED0CE6143EC50E6B5A1289D1A9A88E2\n#. SourceLocation:\t/Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_SewerCreatures\"\nmsgid \"I'm glad I could help.\"\nmsgstr \"Örülök, hogy segíthettem.\"\n\n#. Key:\t65042BC342E9717229E74A9DD272DC5F\n#. SourceLocation:\t/Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_SewerCreatures\"\nmsgid \"It was nice to see you again.\"\nmsgstr \"Jó volt újra látni.\"\n\n#. Key:\t77959A144131C47488B221ADD9B1E13B\n#. SourceLocation:\t/Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_SewerCreatures\"\nmsgid \"Don't worry! I'm still looking for it.\"\nmsgstr \"Ne aggódj, még nem adtam fel a keresést.\"\n\n#. Key:\t7914F3CA40844C2A13A760BB0DAE1BFA\n#. SourceLocation:\t/Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_SewerCreatures\"\nmsgid \"I don't have time for you creature! Stay out of my way!\"\nmsgstr \"Nincs időm rád, kicsi lény! Vigyázz az utamból!\"\n\n#. Key:\t79A62658414FE0202F2E9AA0E0238BD4\n#. SourceLocation:\t/Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_9.Children(0).Children.Text\n#: /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_9.Children(0).Children.Text\nmsgctxt \"Dialogue_SewerCreatures\"\nmsgid \"Accept Quest\"\nmsgstr \"Vállalom\"\n\n#. Key:\t7EF6CBFA4A9C0B85B26AA6830C6121A2\n#. SourceLocation:\t/Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_1.Children(2).Children.Text\n#: /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_1.Children(2).Children.Text\nmsgctxt \"Dialogue_SewerCreatures\"\nmsgid \"Leave\"\nmsgstr \"Távozok\"\n\n#. Key:\t85A2E48A4B27C5EB7DA4CFAA23555629\n#. SourceLocation:\t/Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_26.Text\n#: /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_26.Text\nmsgctxt \"Dialogue_SewerCreatures\"\nmsgid \"Farewell and good luck to you as well!\"\nmsgstr \"Viszlát, és sok szerencsét neked is!\"\n\n#. Key:\t9AEDA0E84BABEBCD8F18E8BC2D0B75D0\n#. SourceLocation:\t/Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_SewerCreatures\"\nmsgid \"Calm down creature! I mean you no harm.\"\nmsgstr \"Nyugalom kicsi lény! Nem bántalak.\"\n\n#. Key:\tB89304534B24114D19DF7AB07635FFDE\n#. SourceLocation:\t/Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_SewerCreatures\"\nmsgid \"All right I will see what I can do.\"\nmsgstr \"Rendben, meglátom, mit tehetek.\"\n\n#. Key:\tB8BD374E4738BFFDAFAC4EAA19E7A9D2\n#. SourceLocation:\t/Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_23.Text\n#: /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_23.Text\nmsgctxt \"Dialogue_SewerCreatures\"\nmsgid \"Oh, thank you!\"\nmsgstr \"Oh, köszönöm!\"\n\n#. Key:\tCAFA874D4ECD3CBFC0ADFD93048A9AA5\n#. SourceLocation:\t/Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_SewerCreatures\"\nmsgid \"Just tell me what do you want...\"\nmsgstr \"Csak mond, mit akarsz...\"\n\n#. Key:\tCF62984840B7508E82BAC0AB9D53EC0A\n#. SourceLocation:\t/Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_9.Children(1).Children.Text\n#: /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_9.Children(1).Children.Text\nmsgctxt \"Dialogue_SewerCreatures\"\nmsgid \"Decline\"\nmsgstr \"Inkább nem\"\n\n#. Key:\tDA1FD0DC49E9B2999DCD489699C04106\n#. SourceLocation:\t/Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_1.Children(1).Children.Text\n#: /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_1.Children(1).Children.Text\nmsgctxt \"Dialogue_SewerCreatures\"\nmsgid \"Let it talk\"\nmsgstr \"Hadd mondja\"\n\n#. Key:\tEAD329F04773358B0CA339A4F155D990\n#. SourceLocation:\t/Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_SewerCreatures\"\nmsgid \"I'm sorry but I can't help you.\"\nmsgstr \"Sajnálom, nem tudok segíteni.\"\n\n#. Key:\tDA8649E54E3753ECDF9C4EAAB90D42B6\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/sewertut1.sewertut1:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/sewertut1.sewertut1:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_sewertut1\"\nmsgid \"I don't like the idea of this additional challenge, but without the help of the Keeper you won't be able to get out.\"\nmsgstr \"Nem tetszik ez a kitérő, de a Kapuőr segítsége nélkül nem fogsz kijutni innen.\"\n\n#. Key:\t462EF40B4BF77FA77FD98DB4656692A2\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/sewertut2_magicbox.sewertut2_magicbox:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/sewertut2_magicbox.sewertut2_magicbox:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_sewertut2_magicbox\"\nmsgid \"It's a magic box! That's what it's supposed to do, demon.\"\nmsgstr \"Ez egy varázsdoboz. Ez így működik, démon.\"\n\n#. Key:\tC34B7D8D499A8E8B767A58A19537A1EA\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/sewertut2_magicbox.sewertut2_magicbox:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/sewertut2_magicbox.sewertut2_magicbox:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_sewertut2_magicbox\"\nmsgid \"Is that box just floating in the air?\"\nmsgstr \"Az a doboz csak ott lebeg a levegőben?\"\n\n#. Key:\t348CCFC54F7E952295416496617F7615\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/sewertut3_silverkey.sewertut3_silverkey:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/sewertut3_silverkey.sewertut3_silverkey:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_sewertut3_silverkey\"\nmsgid \"What is that crystal?\"\nmsgstr \"Mi az a kristály?\"\n\n#. Key:\t554B6C924D0234A869BDFF9412FC4F49\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/sewertut3_silverkey.sewertut3_silverkey:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/sewertut3_silverkey.sewertut3_silverkey:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_sewertut3_silverkey\"\nmsgid \"Don't care about that. Focus on finding a way out.\"\nmsgstr \"Ne foglalkozz vele. Nem fontos, a kiutat keresd inkább.\"\n\n#. Key:\t015A0B11422A6F2AE027FF8D9DF70664\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"We need his help.\"\nmsgstr \"Szükségünk van a segítségére.\"\n\n#. Key:\t03C73AA849BF05421AB97BA696A8C9C4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_79.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_79.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"They always wanted to invade the Outpost. They are many and we are few.\"\nmsgstr \"Már régóta le akarták rohanni a Helyőrséget. Ők sokan voltak, mi meg kevesen.\"\n\n#. Key:\t0849CCCF4491D52B38AE7F827841E479\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Why should I set you free?\"\nmsgstr \"Mi okom lenne kiszabadítani téged?\"\n\n#. Key:\t090C7BBF4222952E1C3FD38F7CF9927E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_76.Text\n#. Key:\t0AC46EF744AA55EDDA83EDB6899BB2D1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_65.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_65.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_76.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Some say Tabby's spirit returned and took the artefacts to Lillian. Maybe that is what happened.\"\nmsgstr \"Néhányan azt mondják, Cirmos szelleme visszatért, és elvitte a Varázstárgyakat Lilliannak. Talán így történt.\"\n\n#. Key:\t094943BF4D9202CE7B1CFCBF151886D5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Back to the question: will you get me out?\"\nmsgstr \"A kérdésre visszatérve: kiszabadítasz?\"\n\n#. Key:\t0DBF728A4C052550BE5EEDBC9DEFB2E0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_29.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_29.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"I would invite you for dinner but unfortunately the door is closed.\"\nmsgstr \"Meghívnálak ebédre, de ahhoz ki kéne nyitni az ajtót.\"\n\n#. Key:\t112A48C54853F7689E1676A11FA8C352\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_48.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_48.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"No time to talk!\"\nmsgstr \"Nincs idő beszédre!\"\n\n#. Key:\t116C39AA495E99500962E8B3AF10DD4A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_83.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_83.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"I mean I'm sorry about the others... not that you survived.\"\nmsgstr \"Úgy értem, sajnálom, hogy mindenki meghalt... nem pedig azt, hogy te túlélted.\"\n\n#. Key:\t134299214C22044B012C27B62337C08E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_69.Text\n#. Key:\tFD1574E845CB284B7A85F09CA1580DD4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_58.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_58.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_69.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"But she is gone for months and no one knows where she might be.\"\nmsgstr \"De már hónapok óta senki sem látta.\"\n\n#. Key:\t14BD2A7C45E85692430B34820042C96F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_73.Text\n#. Key:\tEA5320F3406E2BFA9BD954899BFA19DA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_62.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_62.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_73.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"He had so many friends. We all gathered and buried him near the Ancient Temple.\"\nmsgstr \"Nagyon sok barátja volt. Mind összegyűltünk a Tűz Templomától nem messze, és eltemettük.\"\n\n#. Key:\t16E175D0437B4A671F4753A56E840278\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_33.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_33.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"I’m looking for three artefacts. Do you know something about them?\"\nmsgstr \"Varázstárgyakat keresek. Tudsz róluk valamit?\"\n\n#. Key:\t174BA1E34131FB1BD5A543A3CB86C724\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_35.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_35.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"I will return to the Main Station at Crossroad Cave and see what I can do with the trains.\"\nmsgstr \"Visszatérek a Keresztút Kő állomásra, és meglátom, mit tehetek a vonatokkal.\"\n\n#. Key:\t1769115D4B72AB6CF8641487126A4A18\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"It has a key. The end of it is shaped like a dwarven helmet. You can easily recognise it.\"\nmsgstr \"Van neki kulcsa. A kulcs markolata törp sisakot formáz. Könnyű felismerni.\"\n\n#. Key:\t17CBB2E24B331E4C5682919AAD2E7F2E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_60.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_60.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"What happened to Tabby?\"\nmsgstr \"Mi történt Cirmossal?\"\n\n#. Key:\t1AA8B2E541B2B2E7CA1E86B1E08C1E5A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"They are all dead...\"\nmsgstr \"Mind halottak...\"\n\n#. Key:\t1FCCD37546681195736D2290A8DAE121\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Oh, it’s you again.\"\nmsgstr \"Oh, te vagy az.\"\n\n#. Key:\t2581B27E486A1C71835E5BB44B0AE05E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_37.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_37.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"But first I finish my supper. See you there!\"\nmsgstr \"De előtte még befejezem az ebédet. Ott találkozunk!\"\n\n#. Key:\t2589E4AA4E5A406F6A98CB87D7382DC0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Just ask one of the other dwarfs to open the door.\"\nmsgstr \"Csak kérd meg az egyik Törpöt, hogy nyissa ki az ajtót.\"\n\n#. Key:\t26162C784D2E65A2F8F491A80838F754\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_24.Children(4).Children.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_24.Children(4).Children.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Everyone dead?\"\nmsgstr \"Mindenki halott?\"\n\n#. Key:\t2FEAED2844737D1B20BA64AE2414D8C6\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_72.Text\n#. Key:\tA119C2164FDE16E8F84B4E89578A1015\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_61.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_61.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_72.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"By the time I found him he was dead.\"\nmsgstr \"Mire rátaláltam, már halott volt.\"\n\n#. Key:\t3203A6044456CD8213037A9B1B668763\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Please help me out!\"\nmsgstr \"Kérlek, segíts kijutni!\"\n\n#. Key:\t32C0BE7F49563BC2846691B4F163AEF7\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Well that explains why they didn’t come for me over the last four months.\"\nmsgstr \"Hát, ez megmagyarázza, miért nem jöttek erre az elmúlt négy hónapban.\"\n\n#. Key:\t35F849134220FAE43E07268C439CE3A1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_31.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_31.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"What were you Dwarves doing here?\"\nmsgstr \"Mivel foglalkoztak az itt élő Törpök?\"\n\n#. Key:\t39D36DCA4CD40A7E19D4F5AE69954DC3\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_71.Text\n#. Key:\tEFD384D542A5869726CAB7945F4C0EC4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_54.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_54.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_71.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Tabby found the three artefacts but on his way home he got injured.\"\nmsgstr \"Cirmosnak sikerült megszereznie a Varázstárgyakat, de a hazaúton súlyosan megsérült.\"\n\n#. Key:\t39DEF30C4C3CCAB79867339AABD92BA0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_24.Children(3).Children.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_24.Children(3).Children.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Artefacts\"\nmsgstr \"Varázstárgyak\"\n\n#. Key:\t3AF0406744C4656C5604EF931A688715\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_23.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_23.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"I've found the key!\"\nmsgstr \"Megtaláltam a kulcsot!\"\n\n#. Key:\t3E074E784D66BE166553EB9F85D9854A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"How can I set you free?\"\nmsgstr \"Hogy tudlak kiszabadítani?\"\n\n#. Key:\t4100ECBE40C53051121F4C8A588FBDCB\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_24.Children(2).Children.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_24.Children(2).Children.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Train\"\nmsgstr \"Vonat\"\n\n#. Key:\t41085B174230937FAF97CDBC868F852A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_24.Children(5).Children.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_24.Children(5).Children.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Leave\"\nmsgstr \"Távozok\"\n\n#. Key:\t4204AAFB49C665B3CC32D78301307582\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_45.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_45.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Do you mean those traps out there?\"\nmsgstr \"A csapdákra gondolsz?\"\n\n#. Key:\t44AF6FF04B8A23F656F485AB9F1AFE60\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_36.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_36.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Catch me there if you need to go somewhere!\"\nmsgstr \"Keress meg ott, ha vonattal szeretnél menni valahova!\"\n\n#. Key:\t48FC728C4467C7CF9692AEB8CC71352D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_49.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_49.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"I will catch you at Crossroad Cave after I finished my supper.\"\nmsgstr \"Majd átmegyek a Keresztút Kő Állomásra, ha befejeztem az ebédet.\"\n\n#. Key:\t4A74231B43F74B39906C85904332EE87\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"What happened? How did you end up here?\"\nmsgstr \"Mi történt? Hogy kerültél a zárt ajtó mögé?\"\n\n#. Key:\t4FE354D247D257B181993087E5ADC74C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Errr... I don’t know... out of pure righteousness perhaps?\"\nmsgstr \"Ööö... nem is tudom... pusztán jószívűségből?\"\n\n#. Key:\t529895FF4D6B505A0EDB5081215845AE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_53.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_53.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"He wasn't just an ordinary cat. He was somehow connected to a charming young girl called Lillian.\"\nmsgstr \"Nem közönséges macska volt. Valahogy összeköttetésben állt egy kedves lánnyal, akit Lilliannak hívtak.\"\n\n#. Key:\t5C005582439FD5753AA90BB72F3284C8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_44.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_44.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"We build walls. We create machines out of golem spirits with simple rules which can't go wrong.\"\nmsgstr \"Falakat építünk. A gólem szellemeket mechanikus szerkezetekbe zárjuk, amik egyszerű szabályok szerint működnek, és ezért nem mehetnek tönkre.\"\n\n#. Key:\t5C48292B4E4F1FAF4D7BB487713EA0B1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_59.Text\n#. Key:\t7F06827C4756423AE024F99922B00FDE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_70.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_59.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_70.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"I hope she will return.\"\nmsgstr \"Remélem egyszer visszajön.\"\n\n#. Key:\t624EDA19418303508EA7F58C5BD0DB4E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"All right!\"\nmsgstr \"Rendben!\"\n\n#. Key:\t64E994E34D543F58D0F9DAA386AD7438\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Or do you like trains? I can help you redirect them to stations you couldn’t go otherwise.\"\nmsgstr \"Vagy mit szólsz a vonatokhoz? Segíthetek elérni olyan állomásokat, amiket egyébként nem tudnál.\"\n\n#. Key:\t674A3DC8404EF8FC317D72A70877A0FF\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Errr... You know, sometimes in the evening I come here and have some late dinner. And there are others who think it would be funny to close the door when I'm inside.\"\nmsgstr \"Ööö... az úgy van, hogy néha éjszaka lejövök ide, egy második vacsorára. És vannak, akik úgy gondolják, milyen vicces lenne bezárni az ajtót, amíg bent vagyok.\"\n\n#. Key:\t6B07A15F4E86ECA507DE1DA9B0634774\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_74.Text\n#. Key:\t8F415D40481AA448025D79AB123B2DEB\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_63.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_63.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_74.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"He was a good friend. We all miss him.\"\nmsgstr \"Nagyon jó barát volt. Mindnyájan hiányoljuk.\"\n\n#. Key:\t6B47D3994D188506700B48BE85E0C740\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Once you collected all the artefacts you will need to take them back to a point where I can transport you to the Human Realm.\"\nmsgstr \"Ha sikerül összeszedned a Varázstárgyakat, el kell jutnod velük egy olyan helyre, ahonnan már vissza tudlak hozni az Ember Világba.\"\n\n#. Key:\t6B72634A488C0A9471F52AA154E56709\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_82.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_82.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"I’m sorry about that.\"\nmsgstr \"Őszintén sajnálom.\"\n\n#. Key:\t6C7C51F44B3881DDF4AE41B10F4D29E1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_52.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_52.Children(0).Children.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Tabby?\"\nmsgstr \"Cirmos?\"\n\n#. Key:\t6EC585D64AFBB18576EE17B9DFC08AD7\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_2.Children(2).Children.Text\n#. Key:\tFB66CFE943F6EF32D1A40987B969DCDF\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_52.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_2.Children(2).Children.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_52.Children(1).Children.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"What happened?\"\nmsgstr \"Mi történt?\"\n\n#. Key:\t766A9A50425FA0D0A0374390B2AF5980\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"I like jokes and it would have been funny for I don’t know a few hours maybe...\"\nmsgstr \"Semmi bajom a tréfával, és ha csak egy-két óráról van szó, akkor szerintem is vicces lett volna...\"\n\n#. Key:\t81ABC3E441BE2D3A19257BBC9DDD42D0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_41.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_41.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"You can go down there by using the elevator.\"\nmsgstr \"A felvonóval tudsz lemenni.\"\n\n#. Key:\t85B4C0DB47A2A3C3D504C29965DB6390\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_75.Text\n#. Key:\tE6F106AA404B92C9C6E8889876002813\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_64.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_64.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_75.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"We left the artefacts at his tomb, but one day later they disappeared.\"\nmsgstr \"A sírnál hagytuk a Varázstárgyakat, de egy napra rá nyomuk veszett.\"\n\n#. Key:\t88F0611349D22BB5B8411FA1232B8724\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_38.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_38.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Bye!\"\nmsgstr \"Viszlát!\"\n\n#. Key:\t8A2BA24948D65C3EC801B6AA589C206F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_30.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_30.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Welcome back!\"\nmsgstr \"Üdv!\"\n\n#. Key:\t8A3CCFA44EAB376D6CB4C3B7DD8CEE8D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_53.Children(0).Children.Text\n#. Key:\tEEEF64F84F3FE0A37D029EB1A8BBE8A9\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_55.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_53.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_55.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Lillian?\"\nmsgstr \"Lillian?\"\n\n#. Key:\t8B9C46EA4C46385E6B3770BBD4648280\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_67.Text\n#. Key:\t999245954FBA1853A5E67A88353F152E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_56.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_56.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_67.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Lillian was really kind to us Dwarves. We couldn't ever meet her in person but she could talk to us via the cat Tabby.\"\nmsgstr \"Lillian nagyon kedves volt hozzánk. Személyesen nem találkozhattunk vele, de a macskáján, Cirmoson keresztül tudtunk beszélni vele.\"\n\n#. Key:\t90C6625D4ED5F6EA08B07A87450A1BC9\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_32.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_32.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"You said something about trains...\"\nmsgstr \"Említettél valamit a vonatokkal kapcsolatban...\"\n\n#. Key:\t92793D7F4D0351BF74BB6A8C3EE6A182\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"How can I open the door?\"\nmsgstr \"Hogy tudom kinyitni az ajtót?\"\n\n#. Key:\t941CF27C40D3D82D6B41F5B3DD6501BB\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_52.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_52.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"My friend Tabby was also looking for artefacts.\"\nmsgstr \"Az egyik barátom, Cirmos szintén Varázstárgyakat keresett.\"\n\n#. Key:\t991D611A4F8BE2F8EAC77C9D746BAF95\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_78.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_78.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"I think the Kobolds attacked us by surprise.\"\nmsgstr \"Úgy vélem, a Koboldok meglepetésszerűen támadtak.\"\n\n#. Key:\t9A7FA46C4687C80EBE3B4580631E9B8E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_43.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_43.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"After the Cataclysm we realized the only way to fight madness is to create rules to follow.\"\nmsgstr \"A Kataklizma után rájöttünk, a Fertőzés keltette őrültséget csak úgy tudjuk legyőzni, ha mindenben szigorú szabályokat követünk.\"\n\n#. Key:\t9E9CE4714145ED45CA301AACA6CEBBAF\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_40.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_40.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"But there is a spare key in the Catacombs.\"\nmsgstr \"De van egy pótkulcs a Tárnákban.\"\n\n#. Key:\t9ED5DDC74852A2007D25CDB418A3EDDA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_46.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_46.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"They surely have nothing to do with madness...\"\nmsgstr \"Biztos semmi közük bármiféle őrültséghez...\"\n\n#. Key:\tA0117BB74AB541DE10847FBC5E5CCB32\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"What we were doing? Well we Dwarves are not like other creatures you might have met.\"\nmsgstr \"Mivel foglalkoztunk? Nos, mi Törpök nem olyanok vagyunk, mint bárki más, akivel eddig találkozhattál.\"\n\n#. Key:\tA258ABB740D6727685853E88F32936E2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"That sounds useful.\"\nmsgstr \"Hasznosnak tűnik.\"\n\n#. Key:\tA3F231E34FB4B95DD27A84B9326E0BFE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_24.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_24.Children(0).Children.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Key\"\nmsgstr \"Kulcs\"\n\n#. Key:\tB0B806C147D2EB9F312987B49DEBFC8F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_47.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_47.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"See? They are simple, effective and logical. Ruin can't harm us as long as we follow all the rules.\"\nmsgstr \"Ugye? Egyszerűek, hatékonyak és logikusak. A Fertőzésnek nincs hatalma felettünk, amíg minden szabályt betartunk.\"\n\n#. Key:\tB464CECC4F774535530FC685E0F62787\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_77.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_77.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Do you have any idea how the others died?\"\nmsgstr \"Van elképzelésed arról, hogy haltak meg a többiek?\"\n\n#. Key:\tBE69B91C466965EEF56A6F920AF9E5A8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"I thought they were just kidding.\"\nmsgstr \"Azt hittem, csak viccelnek.\"\n\n#. Key:\tBFEAB99A4FE8C61CC35BCC9E926EFA97\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_51.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_51.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Just help me out.\"\nmsgstr \"Csak segíts kijutnom.\"\n\n#. Key:\tC06E3A27466B5D6C7FC4A39E55739800\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"But being here for four months seems a bit too much for me.\"\nmsgstr \"De négy hónapig bezárva lenni már egy kicsit túlzásnak tűnik.\"\n\n#. Key:\tC31327F8430D2259C27BAE91F44F0119\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_2.Children(0).Children.Text\n#. Key:\tCCD4C84941546627E158A4915B41CDB7\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_19.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_19.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_2.Children(0).Children.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"How?\"\nmsgstr \"Hogyan?\"\n\n#. Key:\tC3BFAD59497E357A8180ADB86C75F14B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_68.Text\n#. Key:\tFF1A18C04F33FF434A2821A725CBFB5C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_57.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_57.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_68.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"She cared about us. She knew all our Strongholds and Outposts. She always warned us before the Kobolds attacked.\"\nmsgstr \"Lillian törődött velünk. Ismerte az összes Erődöt és Helyőrséget. Mindig szólt, ha a Koboldok támadni készültek.\"\n\n#. Key:\tC5A94EDD47BC3D5F422A29982308E78D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_19.Children(1).Children.Text\n#. Key:\tF811970946DF32346DAE66AFE2F64664\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_2.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_19.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_2.Children(1).Children.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Why?\"\nmsgstr \"Miért?\"\n\n#. Key:\tC8E54B6E448A194DEB141C84323308F6\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_80.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_80.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"It was only a matter of time.\"\nmsgstr \"Csak idő kérdése volt.\"\n\n#. Key:\tCA02594643A55D1128F06FB2E8FDE676\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_50.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_50.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Yes, trains. I can help you reach destinations you couldn't reach on your own.\"\nmsgstr \"Igen, vonatok. Segíthetek elérni velük olyan állomásokat, amiket magadtól nem tudnál.\"\n\n#. Key:\tCC191532450BFB2679AFD88AD95B72B2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Finally someone!\"\nmsgstr \"Végre, valaki!\"\n\n#. Key:\tCF4351D047E267981EF869BE88BB0753\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_24.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_24.Children(1).Children.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Dwarves\"\nmsgstr \"Törpök\"\n\n#. Key:\tD2377C864A2A80F17AD81581D7A7807F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_81.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_81.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Odd that I survived.\"\nmsgstr \"Fura, hogy én meg túléltem.\"\n\n#. Key:\tDF12303E4C7A4DFB00054EA7CE07FF88\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_39.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_39.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Errr... I don't know.\"\nmsgstr \"Ööö... nem tudom.\"\n\n#. Key:\tE8270F474353ECB77560C4A1173638A2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_27.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_27.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Any idea where that key might be?\"\nmsgstr \"Bármi ötlet, hol lehet a kulcs?\"\n\n#. Key:\tEF1EFC6E4119CC9B41AF21ACE008D3B5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_26.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_26.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Have you found the key?\"\nmsgstr \"Megtaláltad a kulcsot?\"\n\n#. Key:\tF47418854FDFB9AD0E10468BEC8F1F58\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_42.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_42.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"I need to go now.\"\nmsgstr \"Mennem kell.\"\n\n#. Key:\tF553C35F43DFC6CA04DA48A738597696\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_25.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_25.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Back already?\"\nmsgstr \"Máris itt?\"\n\n#. Key:\tFF942F904300D874A8C59AB8A954EF86\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_34.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_34.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Well done! Thank you! Thank you!\"\nmsgstr \"Ez az! Köszönöm! Köszönöm!\"\n\n#. Key:\t0499C9ED4395C4DD8AD1E48E854CD983\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"It was nice to see you too!\"\nmsgstr \"Jó volt újra látni.\"\n\n#. Key:\t07153D014D72AF193040BA91A18BDC0A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_24.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_24.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"Great!\"\nmsgstr \"Nagyszerű!\"\n\n#. Key:\t106E51E34033895E5C7F348AF8994564\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"Er... Thanks! We'll talk about this later.\"\nmsgstr \"Ööö... Kösz! Majd még beszélünk erről.\"\n\n#. Key:\t18E140B74385C5E48F23E0B7E862E569\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"Hello! It's nice to see you again.\"\nmsgstr \"Szia! Jó újra látni.\"\n\n#. Key:\t25F72BCA416C39658A0879A27417EA6B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"Don’t worry, I’ll make ready a train for you heading that way.\"\nmsgstr \"Ne aggódj. Előkészítek egy vonatot, ami elvisz oda.\"\n\n#. Key:\t26CBB1CD40F2080DE2183BA6AB3D2014\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"Ask him how you can travel to World’s End.\"\nmsgstr \"Kérdezd meg, hogy jutsz el a Világ Végére.\"\n\n#. Key:\t26D1F4534C708623FB300DBE4EECADD2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"But I can't go back, because it's not safe.\"\nmsgstr \"De nem mehetek vissza, mert nem biztonságos.\"\n\n#. Key:\t2B14E76B4B16316D7525FFA6D37E4CBB\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"You know I'm a bit worried about what will happen to the Outpost.\"\nmsgstr \"Tudod, egy kicsit aggódom, mi lesz a Helyőrséggel.\"\n\n#. Key:\t2BB0F16046A4CD8DF05DE6A95D2CF9B3\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"I’m really glad you found that key for me. Now I can finish my supper outside in fresh air!\"\nmsgstr \"Igazán hálás vagyok, hogy megtaláltad azt a kulcsot. Így a szabad ég alatt tudom befejezni az ebédemet!\"\n\n#. Key:\t36EF13F042D5B5ADB870BEB97F688D08\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_29.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_29.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"Take this! You deserve it!\"\nmsgstr \"Ez a tiéd! Megérdemled!\"\n\n#. Key:\t3E09B8F746E999130D26A0BEA945E6D6\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"Is everything all right?\"\nmsgstr \"Minden rendben van?\"\n\n#. Key:\t4D5A326948713FE977D0DBB68CF4A475\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_27.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_27.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"Except those crazy traps...\"\nmsgstr \"Kivéve azokat a hülye csapdákat...\"\n\n#. Key:\t5BE2C4324B64B35BD181B49E2D63E87F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"By the way, in case you need to go somewhere with the train just let me know.\"\nmsgstr \"Apropó, ha vonattal kell valahova menned, csak szólj.\"\n\n#. Key:\t66EDC37F4F3B3813F1B92D91A4107ADE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"I have banished some of the monsters lurking in the Outpost.\"\nmsgstr \"Elpusztítottam a szörnyek egy részét a Helyőrségben.\"\n\n#. Key:\t67EED0C742F3B4ED0A9B929C4B517A4A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"The Outpost is safe again.\"\nmsgstr \"A Helyőrség újra biztonságos.\"\n\n#. Key:\t6F1AF94E4DE4A338EFF79C85D99B944A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_19.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_19.Children(1).Children.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"Outpost\"\nmsgstr \"Helyőrség\"\n\n#. Key:\t84D15B994BADC0AAED61848E817E49E1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"Thanks!\"\nmsgstr \"Kösz!\"\n\n#. Key:\t8C7D69324C544DAC53C5CCA724B4B461\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_23.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_23.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"Could you somehow make the enemies move to somewhere else maybe?\"\nmsgstr \"Nem tudnád valahogy rávenni az ellenséget, hogy valahol máshol garázdálkodjanak?\"\n\n#. Key:\t8F66738A44B7D19EABAD40873B3FCAA3\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_19.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_19.Children(0).Children.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"Do you need help?\"\nmsgstr \"Szükséged van segítségre?\"\n\n#. Key:\t9249DFC34CFB46E1738C97A3283268D2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"Well done! Well done!\"\nmsgstr \"Szép munka! Szép munka!\"\n\n#. Key:\tA027C29849372B1C452083A84609B1F5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_19.Children(2).Children.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_19.Children(2).Children.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"Leave\"\nmsgstr \"Távozok\"\n\n#. Key:\tA037C9E543AC131DAF4B6281A27BD56C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"Hello again my friend!\"\nmsgstr \"Üdv újra, barátom!\"\n\n#. Key:\tA4F1343D4D537FC1907096B564D3842E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"Oh, it must be a charming place!\"\nmsgstr \"Az biztos nagyon szép hely lehet!\"\n\n#. Key:\tACF022EF4C55A6553F29DB969827379D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_26.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_26.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"Anyway, take this for your effort!\"\nmsgstr \"Mindegy, fogadd el ezt erőfeszítéseidért cserébe!\"\n\n#. Key:\tB680A1D54923C59C081E46A65A2754D1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"As the last Defender, it would be my duty to keep that place safe.\"\nmsgstr \"Az utolsó Törp Védelmezőként az én feladatom lenne, hogy vigyázzak a Helyőrségre.\"\n\n#. Key:\tB9E0526D41FDB742FCB51991A0220B17\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"That’s where I can take you out of the Ruined Realm.\"\nmsgstr \"Onnan tudlak kihozni.\"\n\n#. Key:\tBF1AD65A407133C13B811CB14A997A2A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"We can talk some more once I've finished my supper...\"\nmsgstr \"Majd beszélhetünk még, ha befejeztem az ebédet...\"\n\n#. Key:\tE211EA4D4D69D09144B914850B17A8AE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_25.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_25.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"Well, I can't do my duty until you banish all of them.\"\nmsgstr \"Addig nem tudom végezni a kötelességemet, amíg nem űzöd el mindet.\"\n\n#. Key:\tEFD408FF4DAFD18E10ED3282D959914E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"You don't need to go anywhere before you find the three artefacts.\"\nmsgstr \"Sehova sem kell menned, amíg nem találtad meg a három Varázstárgyat.\"\n\n#. Key:\tF500AA3C494B40302E298CA54FF3344B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"I would like to go to World’s End.\"\nmsgstr \"A Világ Végére szeretnék menni.\"\n\n#. Key:\tFDC63C35472E1752E2D092BC77DAD28B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"I'll see what I can do.\"\nmsgstr \"Meglátom, mit tehetek.\"\n\n#. Key:\t00A5A8684B1EF5FF2319428685540844\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_13.Children(0).Children.Text\n#. Key:\t471B46884399845B6D9442A8EADC2A48\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_9.Children(0).Children.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_13.Children(0).Children.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_9.Children(0).Children.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"Portal\"\nmsgstr \"Átjáró\"\n\n#. Key:\t03EA3D4249797B593981C1B699A2CF5A\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"Oh! The Walking Ball returned! Just in time!\"\nmsgstr \"Óh! A Sétáló Labda visszatért! Épp időben!\"\n\n#. Key:\t04DC604342615AD3DCFCE99EB9AAF157\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_19.Children(1).Children.Text\n#. Key:\t1070909F4434D9B0D03DD3BD62692CE0\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_16.Children(0).Children.Text\n#. Key:\t76A679CE45B5A9A47CA620A396E02F48\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_13.Children(2).Children.Text\n#. Key:\t8FC1E822454A2FDA1847119C5004F161\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_21.Children(0).Children.Text\n#. Key:\t9036093D446B2F8C34705BBCFC73F4A0\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_9.Children(2).Children.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_13.Children(2).Children.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_16.Children(0).Children.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_19.Children(1).Children.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_21.Children(0).Children.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_9.Children(2).Children.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"Leave\"\nmsgstr \"Távozok\"\n\n#. Key:\t142E85484BA4E9CF475F0780D951BAE5\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"But they were so tasty.\"\nmsgstr \"De olyan finomak.\"\n\n#. Key:\t1E763B4D4D535AA83B50D4B87DB5A15D\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"You again?\"\nmsgstr \"Megint te?\"\n\n#. Key:\t2430044E46A3456249D6A99D0FC31D30\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_9.Children(1).Children.Text\n#. Key:\tB3695A284A15574F3874BDAB1B8C14EB\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_19.Children(0).Children.Text\n#. Key:\tDC8D78774D326DA9A70EFC81A857A417\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_13.Children(1).Children.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_13.Children(1).Children.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_19.Children(0).Children.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_9.Children(1).Children.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"Give Weird Device\"\nmsgstr \"Fura Eszköz\"\n\n#. Key:\t29AD586B41502E4FAFF79E94FDADA50D\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"Unfortunately I don't have any.\"\nmsgstr \"Sajnos nincs nálam egy se.\"\n\n#. Key:\t3418CA5A44B4531926317CB100CEC2F4\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"Just let me know when you're done! Meanwhile, I'll be reading a few more pages.\"\nmsgstr \"Csak szólj, ha kész vagy. Addig még egy kicsit olvasok.\"\n\n#. Key:\t37CD676C4C4F585C3CC048B56EEF6B92\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"I was supposed to find a portal here.\"\nmsgstr \"Elvileg itt kellene lennie egy Átjárónak.\"\n\n#. Key:\t3C2778B12A09151A002F016B1E3F6212\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"Also, if I hadn't drank the last two bottles... that would have helped...\"\nmsgstr \"És hát, ha nem ittam volna meg az utolsó két üveggel... lehet az is segített volna...\"\n\n#. Key:\t42E3EE32491F578E618913B4AF958187\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"Really? That sounds like my students! They were always complaining about unannounced examinations or even worse, \\\"Why are there no lessons tomorrow?\\\".\"\nmsgstr \"Igen? Pont olyan vagy, mint a diákjaim! Mindig csak panaszkodnak! \\\"Miért nem szóltál, hogy vizsga van? Miért nem jöttél órát tartani?\\\" Szánalmas.\"\n\n#. Key:\t44626CCD498CA592B8FAD1B01EDF33AB\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_2.Children(0).Children.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_2.Children(0).Children.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"Don't have\"\nmsgstr \"Nincs\"\n\n#. Key:\t55EAD2524D0BCF52B25A1B9EAB1754B2\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"That's it my ball! I wish I had more students like you.\"\nmsgstr \"Ez az, te vagy az én... Labdám! Bár több hozzád hasonló diákom lett volna.\"\n\n#. Key:\t6682474947E016803A188FA968FD76BE\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"Oh my...\"\nmsgstr \"Te jó ég...\"\n\n#. Key:\t786849EF4E531580865712BBEDD25B32\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"That is amazing! Thank you, my globular friend! Take these coins, I am sure that you will enjoy spending them on... on whatever Balls like you like to get.\"\nmsgstr \"Lenyűgöző! Köszönöm, gömbölyű barátom! Fogadd el ezt a szerény összeget cserébe. Ebből jó pár... olyan dolgot vehetsz, amit a labdák venni szoktak.\"\n\n#. Key:\t7FFC816545AA219D43FCA3A2ABF33E9E\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"Nevermind, I will just read a bit more... at least until a solution is found for the whole problem.\"\nmsgstr \"Mindegy, akkor még olvasok egy kicsit... hátha valahogy megoldódik a probléma.\"\n\n#. Key:\t818E4C1245F622C192178CB1F21694A3\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_2.Children(1).Children.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_2.Children(1).Children.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"What's the matter?\"\nmsgstr \"Mi a gond?\"\n\n#. Key:\t84A119EB4FFB518BA7AA6394768F1DD3\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"Did the Gatekeeper open the gate for you?\"\nmsgstr \"Neked nyitott Átjárót a Kapuőr?\"\n\n#. Key:\t88FD93954B70482DAC5F2AA5332F23D5\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"One must always be eager to solve a problem. No matter how challenging that is.\"\nmsgstr \"Mindig lelkesen kell fogadni a problémákat, bármilyen nehéznek tűnnek is elsőre.\"\n\n#. Key:\t9CEE1942434DACB2DB3C1AA2005A1E94\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"But we might find another way to solve the problem.\"\nmsgstr \"De talán találunk más megoldást.\"\n\n#. Key:\tC070EF8E47744D116D4E39AC8F7C1941\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"I hope that you still have at least one bottle of that potion of mine. I could really use some...\"\nmsgstr \"Remélem még van pár palackod abból az italból. Most jól jönne egy...\"\n\n#. Key:\tC39CD0F34CDFDCB0B2CF08917834F1A8\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"Here is a Weird Device that I found in the hideout of the Secret Science Society.\"\nmsgstr \"Itt van a Fura Eszköz a Titkos Tudós Társaság rejtekhelyéről.\"\n\n#. Key:\tCBB0BCAF4E19F942AC57F988104A9A65\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"I've used all of them to get back from the Sewer. You should have told me that there is another way out!\"\nmsgstr \"Elhasználtam őket, hogy ki tudjak jutni a Csatornából. Miért nem mondtad, hogy van másik kiút is?\"\n\n#. Key:\tE866A83647B163E53260C2B541AA0D7B\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"Well, the portal is definitely here, but as you might have already noticed, the place is a bit worn.\"\nmsgstr \"Nos, az Átjáró tényleg itt van, de, mint ahogy azt bizonyára te is látod, a hely egy kicsit leharcolt.\"\n\n#. Key:\tF0A4AD1448267D94CAB7F79AD6CEFD59\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"Not Yet.\"\nmsgstr \"Még nem.\"\n\n#. Key:\tF83C2C894C2EA511DCDCE6B824CC0591\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"Only the Gatekeeper can reopen the portal.\"\nmsgstr \"Egyedül a Kapuőr tudja újra megnyitni az Átjárót.\"\n\n#. Key:\t76653DEC40EE0ED098B5EE8810B1A097\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/TL_GetSoulkeeper.TL_GetSoulkeeper:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/TL_GetSoulkeeper.TL_GetSoulkeeper:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_TL_GetSoulkeeper\"\nmsgid \"A Spellcaster. It makes you able to use the Ruined Realm's magic, at least, up to a certain level.\"\nmsgstr \"Ez egy Bűvölő. Képessé tesz a Fertőzött Föld mágiájának használatára, legalábbis egy bizonyos szinten.\"\n\n#. Key:\tBD48F7804F49751510AB2E909906C52F\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/TL_GetSoulkeeper.TL_GetSoulkeeper:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/TL_GetSoulkeeper.TL_GetSoulkeeper:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_TL_GetSoulkeeper\"\nmsgid \"What is it?\"\nmsgstr \"Mert, mi ez?\"\n\n#. Key:\tDFF1C93D4005A778F0B696A2DC949DC6\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/TL_GetSoulkeeper.TL_GetSoulkeeper:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/TL_GetSoulkeeper.TL_GetSoulkeeper:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_TL_GetSoulkeeper\"\nmsgid \"That amulet is useful.\"\nmsgstr \"Ez az amulett nagyon hasznos.\"\n\n#. Key:\t09CDAFF84CF3F066B25A228640D45277\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_TL_Monk\"\nmsgid \"Please tell your Wizard that Monk would like to have a word with him.\"\nmsgstr \"Kérlek szólj Varázslónak, hogy Szerzetes beszélni szeretne vele.\"\n\n#. Key:\t0E97585C46B73E4AF939169CF45067A3\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_TL_Monk\"\nmsgid \"I can only guess that right now, he's complaining about me.\"\nmsgstr \"Lefogadom, hogy épp engem szid.\"\n\n#. Key:\t2E82A2B6449D8BA37ADBE7AEE1486791\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_TL_Monk\"\nmsgid \"Just get rid of him.\"\nmsgstr \"Csak rázd le.\"\n\n#. Key:\t430D927D40EF24EED23E55A83F48FDD7\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_TL_Monk\"\nmsgid \"I'm sorry but he doesn't want to talk to you.\"\nmsgstr \"Sajnálom, nem akar beszélni veled.\"\n\n#. Key:\t59E21DC1476038EAD4EC91BC00DA4D8B\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_3.Children(2).Children.Text\n#: /Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_3.Children(2).Children.Text\nmsgctxt \"Dialogue_TL_Monk\"\nmsgid \"Ask Wizard\"\nmsgstr \"Szólok neki\"\n\n#. Key:\t5AFB166C49DEB2D9017AED887A1E424D\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_TL_Monk\"\nmsgid \"Farewell, my friend, until we meet again!\"\nmsgstr \"Ég veled, barátom, még útjaink újra összefutnak!\"\n\n#. Key:\t5D80CBEB46203E3A759B498B95571F4F\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_3.Children(1).Children.Text\n#: /Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_3.Children(1).Children.Text\nmsgctxt \"Dialogue_TL_Monk\"\nmsgid \"I won't transfer!\"\nmsgstr \"Nem közvetítek!\"\n\n#. Key:\t66D9E1874A9749A8881372807C0B9D54\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_TL_Monk\"\nmsgid \"Ha-ha-ha... I know he heard everything.\"\nmsgstr \"Ha-ha-ha... Tudom, hogy minden szavamat hallotta.\"\n\n#. Key:\t8BD7C20C4084000925D1489BE3F6EE15\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_TL_Monk\"\nmsgid \"I don't talk to him!\"\nmsgstr \"Nem beszélek vele!\"\n\n#. Key:\tA227CE5A47002A80D3988ABA1364CF3E\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_3.Children(0).Children.Text\n#: /Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_3.Children(0).Children.Text\nmsgctxt \"Dialogue_TL_Monk\"\nmsgid \"Wizard don't want\"\nmsgstr \"Nem akar\"\n\n#. Key:\tA8E469374586A1D8A734D696AF662F9A\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_TL_Monk\"\nmsgid \"I also have something for you, Wanderer!\"\nmsgstr \"Van valamim a számodra, Vándor!\"\n\n#. Key:\tCE0E3B1B424BEDDF4A830B8DD0BB3272\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_TL_Monk\"\nmsgid \"This might help you along the way.\"\nmsgstr \"Ez talán segíthet az utadon.\"\n\n#. Key:\tD6B184754B86F236C93454A95BF92B31\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_TL_Monk\"\nmsgid \"I won't deliver your messages anymore! If the two of you want something, then go get it yourselves!\"\nmsgstr \"Nem közvetítek köztetek. Ha akartok valamit egymástól, beszéljétek meg egymással!\"\n\n#. Key:\tDB3AEAF24056B19A7D80E29E7D011D80\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_TL_Monk\"\nmsgid \"That's right. I will give him more time.\"\nmsgstr \"Jól van. Adok még egy kis időt neki.\"\n\n#. Key:\tE2F9F07A4A2B8D1A578BCC9716AB4D44\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_TL_Monk\"\nmsgid \"Wizard! A fellow named Monk wants to talk to you!\"\nmsgstr \"Varázsló! Egy Szerzetes nevű alak beszélni akar veled!\"\n\n#. Key:\tE8987AC84528E4071DC27E9854C3C4DE\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_TL_Monk\"\nmsgid \"Hello, little Wanderer!\"\nmsgstr \"Helló, kicsi Vándor!\"\n\n#. Key:\tFF355D9347D0068FBB40879E3EAEA8FB\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_TL_Monk\"\nmsgid \"But please...\"\nmsgstr \"De kérlek...\"\n\n#. Key:\tAC0DE5F1402FBAAFE6587B827D463C3C\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/TL_SoulkeeperHint.TL_SoulkeeperHint:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/TL_SoulkeeperHint.TL_SoulkeeperHint:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_TL_SoulkeeperHint\"\nmsgid \"Use the Soulstone to summon the Keeper.\"\nmsgstr \"Idézd meg az Őrzőt a Bűvölővel.\"\n\n#. Key:\t031849B3493F1528A0146DA55BD7F00F\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/TL_TakeSoulkeeperHint.TL_TakeSoulkeeperHint:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/TL_TakeSoulkeeperHint.TL_TakeSoulkeeperHint:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_TL_TakeSoulkeeperHint\"\nmsgid \"It would be easier if I could just simply summon her back to me...\"\nmsgstr \"Egyszerűbb lenne, ha bárhonnan visszahívhatnám...\"\n\n#. Key:\t259EE9E14B86B2597D5F4EA60831D269\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/TL_TakeSoulkeeperHint.TL_TakeSoulkeeperHint:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/TL_TakeSoulkeeperHint.TL_TakeSoulkeeperHint:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_TL_TakeSoulkeeperHint\"\nmsgid \"Be more careful the next time...\"\nmsgstr \"Legközelebb legyél óvatosabb...\"\n\n#. Key:\t86266BC54CC02BE988EA24B18BF76359\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/TL_TakeSoulkeeperHint.TL_TakeSoulkeeperHint:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/TL_TakeSoulkeeperHint.TL_TakeSoulkeeperHint:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_TL_TakeSoulkeeperHint\"\nmsgid \"Now go back to the Soulkeeper.\"\nmsgstr \"Most menj vissza a Lélekőrhöz.\"\n\n#. Key:\tDCA8CF9A4CFF4644FBD42EADBFC6E773\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/TL_TakeSoulkeeperHint.TL_TakeSoulkeeperHint:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/TL_TakeSoulkeeperHint.TL_TakeSoulkeeperHint:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_TL_TakeSoulkeeperHint\"\nmsgid \"Er... It's still with me.\"\nmsgstr \"Ööö... még mindig nálam van.\"\n\n#. Key:\t012DDB8E4423EB98285155B3E1EFBF9A\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_65.Children(2).Children.Text\n#. Key:\t3485AE344D04D0944341F3A7391703EF\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.Children(3).Children.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_65.Children(2).Children.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.Children(3).Children.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"Set me free\"\nmsgstr \"Szabadíts ki\"\n\n#. Key:\t04E44BE94ABFE8614689AC890D01001D\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_65.Children(1).Children.Text\n#. Key:\t275944AA468D9CA8613B9586EC3D9C62\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.Children(2).Children.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_65.Children(1).Children.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.Children(2).Children.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"How to open gate\"\nmsgstr \"Hogy nyílik az ajtó?\"\n\n#. Key:\t10EB6BE941C633380422F7953F0171DA\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"I think... I am...\"\nmsgstr \"Gondolkodom... Asszem...\"\n\n#. Key:\t22618C8F490BC5932411FFB41F38C383\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.SpeechSequence(0).SpeechSequence.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.SpeechSequence(0).SpeechSequence.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"Oh! A walking ball!\"\nmsgstr \"Óh! Egy sétáló labda!\"\n\n#. Key:\t28ED4B8B4023E9A859B8A4BFF7DFEE8A\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"I am crazy, therefore I think!\"\nmsgstr \"Örült vagyok, tehát gondolkodom!\"\n\n#. Key:\t389F7FA440377CA4EBA31DA4EE2FEEAE\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_65.Children(3).Children.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_65.Children(3).Children.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"Leave\"\nmsgstr \"Távozok\"\n\n#. Key:\t408E74BC4DBA10DA41853B9421DBA07B\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_65.Children(0).Children.Text\n#. Key:\t55BC9258400712FE4D5CED8BFA0AD22C\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.Children(1).Children.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_65.Children(0).Children.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.Children(1).Children.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"How to prove Worthy\"\nmsgstr \"Hogy bizonyítsak?\"\n\n#. Key:\t5D0DBB0344815D41A50D9FA178339BCA\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_24.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_24.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"Here, take one!\"\nmsgstr \"Tessék, vegyél egyet!\"\n\n#. Key:\t5E8C88684BE93A26C26BFBAF23D69FD9\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.SpeechSequence(5).SpeechSequence.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.SpeechSequence(5).SpeechSequence.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"And I am not wise. In fact, I am totally crazy. But look on the bright side! At least I am aware of it.\"\nmsgstr \"És nem vagyok bölcs. Sőt, valójában teljesen őrült vagyok. De nézd a jó oldalát! Legalább tisztában vagyok vele.\"\n\n#. Key:\t5F9588AA4FFA9FEB2C7101B32CB98950\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_55.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_55.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"Come back if you change your mind!\"\nmsgstr \"Gyere vissza, ha meggondoltad magad!\"\n\n#. Key:\t69BF5D3C44D3BE2468ADDF97E99920E9\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"I think something's happening with the door's mechanism... but who knows? I can definitely hear some creaking! It's hard to guess which one of those is the real one...\"\nmsgstr \"Azt hiszem, valami megváltozott a zárszerkezetben... de ki tudja? Az biztos, hogy mindenféle kattogást hallok, de a fene tudja, melyik igazi.\"\n\n#. Key:\t6B46CC3F44284076B1F460BEE2D93116\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.SpeechSequence(1).SpeechSequence.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.SpeechSequence(1).SpeechSequence.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"How unique, how original, how... sporty!\"\nmsgstr \"Milyen egyedi, milyen eredeti, milyen... sportos!\"\n\n#. Key:\t6DFC995B4364B6358A8F00BEDD007C80\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"I am, therefore I think!\"\nmsgstr \"Vagyok, tehát gondolkodom!\"\n\n#. Key:\t72FA8AF8413CF23907BB9EA6587F512E\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_63.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_63.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"I was pretty sure I had to face him too... that's why I prepared! Potion of Worthiness! I have a few bottles...\"\nmsgstr \"Előre tudtam, hogy szembe kell majd néznem vele... ezért felkészültem! A Méltóság Itala! Van nálam pár üveggel...\"\n\n#. Key:\t7BB736394144C8B2173886993EE33ADA\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"Look, I'm forced to stay in this realm so that I could do all these silly tasks for a wizard. Any chance you could help me with that? Please?\"\nmsgstr \"Nézd, erőszakkal kényszerítenek ebbe a világba, hogy valami hülye feladatot csináljak egy varázslónak. Nem tudnál segíteni valahogy? Légyszi?\"\n\n#. Key:\t7E8985A441145AE9365C64810036EBE0\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.SpeechSequence(3).SpeechSequence.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.SpeechSequence(3).SpeechSequence.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"Actually yes, I...\"\nmsgstr \"Ami azt illeti, igen, elke...\"\n\n#. Key:\t85CB0B164556D460A07F948F942D7AC4\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_61.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_61.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"That's how these rusty monsters work like: you pull a few levers here and there, and... whoops, the door is open! It's called science!\"\nmsgstr \"Így működnek ezek a jó öreg rozsdás gépek: lehúzol egy-két kart, és... voalá, az ajtó kinyílik. Úgy hívják, tudomány!\"\n\n#. Key:\t878921884D0FDCFC78971E828C7D7FBB\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_66.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_66.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"I've got to go...\"\nmsgstr \"Mennem kell.\"\n\n#. Key:\t8FF0B1A64B29AAB8DABAC49F5EBCE625\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_60.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_60.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"That's easy! Just pull every single lever you can find.\"\nmsgstr \"Egyszerű. Csak lehúzod az összes kart, amit találsz.\"\n\n#. Key:\t9163F7AB40673D9EB5C936A37CC7B0C7\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_62.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_62.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"Sounds like you met the GateKeeper!\"\nmsgstr \"Úgy tűnik, összefutottál a Kapuőrrel!\"\n\n#. Key:\t96EED9B34D798E48F9B47283A5290A5B\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.SpeechSequence(4).SpeechSequence.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.SpeechSequence(4).SpeechSequence.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"It was a rhetorical question. I am not old!\"\nmsgstr \"Költői kérdés volt. Nem vagyok öreg!\"\n\n#. Key:\tB3141D2247D5DF307B63A4BF330F8070\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_67.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_67.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"Not really, I don't feel like helping you out. And to be honest, I prefer to stay away from wizards. Sorry!\"\nmsgstr \"Nem igazán, nincs nagy kedvem hozzá. Őszintén szólva, jobb szeretek távol maradni a varázslóktól. Bocs!\"\n\n#. Key:\tB7A8F5A6474D18116F76BC929DB28D40\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"It's been nice meeting you.\"\nmsgstr \"Örülök a találkozásnak.\"\n\n#. Key:\tBE16F7204818B7231748D1B9C55DB4F6\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"Here, take this! I hope it's worth the trouble... hahaha... Thanks to you I can continue with my journey... after I read a few more pages, of course.\"\nmsgstr \"Tessék, ez a tiéd! Remélem megérte... hahaha... Hála neked, folytathatom utamat... miután olvastam még egy kicsit, persze.\"\n\n#. Key:\tBF9983D645C558E1AB5D559E70FEFDA0\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.SpeechSequence(6).SpeechSequence.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.SpeechSequence(6).SpeechSequence.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"Is there anything a middle-aged crazy gnome scientist can do for you? Now, this one is not a rhetorical question!\"\nmsgstr \"Van bármi, amit egy középkorú, őrült gnóm tudós tehet érted? Nah, ez a kérdés már nem költői!\"\n\n#. Key:\tC29E98A84971D7F0585C0F9522C30209\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_64.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_64.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"I will give you one if you are kind enough to open this door for me! I am stuck on the other side, you see...\"\nmsgstr \"Adok egyet, ha leszel olyan kedves, és kinyitod nekem ezt az ajtót. Be vagyok ragadva, ha nem tűnt volna fel...\"\n\n#. Key:\tC8BEE9304FE466C0EB9F76A0B8A770D6\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.Children(0).Children.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.Children(0).Children.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"No way!\"\nmsgstr \"Kizárt!\"\n\n#. Key:\tCB197A5E46F44960333A02B7691B0EA6\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"Thanks and good luck!\"\nmsgstr \"Kösz, és sok szerencsét!\"\n\n#. Key:\tCD2D130744EE2EDC8C96B1A286FCCD28\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"Getting help from a mad scientist? Thanks, but I would rather skip that!\"\nmsgstr \"Segítség egy őrült tudóstól? Kösz, de inkább kihagynám!\"\n\n#. Key:\tD0A8B5EA452D49F6400A18A2CDAC9A0E\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_29.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_29.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"I am crazy, therefore I am!\"\nmsgstr \"Megőrültem, tehát vagyok!\"\n\n#. Key:\tDA95542D4776F0EF7909078DED258AF8\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_27.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_27.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"You managed to open the gate! Well done!\"\nmsgstr \"Sikerült kinyitnod az ajtót! Szép munka!\"\n\n#. Key:\tDEC93709471D0B331684CFAF42A65B49\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_37.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_37.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"How unfortunate! And I thought that I was the idiot here. You will totally need my help... you'll see.\"\nmsgstr \"Szánalmas! És még azt hittem, én vagyok a bolond. Meglátod, nem boldogulsz a segítségem nélkül.\"\n\n#. Key:\tDF18B66D4109CAA0BCC1FDBED74521CD\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"Some kind of golem sent me here to prove my worthiness... any idea how I could do that?\"\nmsgstr \"Valami Gólem küldött ide, hogy bizonyítsam a méltóságomat... bármi ötlet, hogy mit csináljak?\"\n\n#. Key:\tE546AE1443A4262B05869CB758E42CF2\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.SpeechSequence(2).SpeechSequence.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.SpeechSequence(2).SpeechSequence.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"Is there anything an old wise gnome scientist could do for you, I wonder?\"\nmsgstr \"Van bármi, amit egy öreg, bölcs gnóm tudós tehet érted?\"\n\n#. Key:\tEEA782044BAA1D5C3B77D49DAE004512\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_58.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_58.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"Any idea how I could open this gate for you?\"\nmsgstr \"Bármi ötlet, hogy tudom kinyitni az ajtót?\"\n\n#. Key:\t04BFEE6A43E303DB376ACFA5F270F846\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"I've managed to get this obelisk thing. Do you know what it is?\"\nmsgstr \"Sikerült megszereznem a lebegő obeliszket. Tudod, mire jó?\"\n\n#. Key:\t0A6FE902444DF9B2F18A95B495FB7A90\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"I... I don't know. They are kinda predictable though...\"\nmsgstr \"Nem tudom... Pedig elég kiszámíthatóak...\"\n\n#. Key:\t0AB07AB7403AECECD38D479D8F4A32D2\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"Don't care about it and you'll live longer.\"\nmsgstr \"Ne foglalkozz vele, és tovább életben maradsz.\"\n\n#. Key:\t1026E61D4F2798A2E0FEE0B9ACA2135B\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"There is a floating magical thing right there...\"\nmsgstr \"Van ott valami lebegő mágikus izé...\"\n\n#. Key:\t174506D944E38D478377CDA1DEF299B4\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"Isn't it weird that doors are always closed around these places?\"\nmsgstr \"Nem tartod furcsának, hogy az ajtók mindig kulcsra vannak zárva errefelé?\"\n\n#. Key:\t240F98824200E33959D455AF1A3219B8\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_37.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_37.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"This is my research project! Looks totally garbage, but sometimes even I cannot understand my brilliance.\"\nmsgstr \"Ez a kutatómunkám! Most teljesen agyatlanságnak tűnik, de vannak pillanatok, amikor még én sem értem a zsenialitásomat.\"\n\n#. Key:\t24286C6A494F848CE13B5C98E38D4718\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_6.Children(0).Children.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_6.Children(0).Children.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"Let him answer\"\nmsgstr \"Hadd válaszoljon\"\n\n#. Key:\t26727CAB403FA6DED50EC38ED01E4241\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"I found the secret hideout of the Secret Science Society. Is there anything you could tell me about them?\"\nmsgstr \"Megtaláltam a Titkos Tudós Társaság rejtekhelyét. Tudsz róla valamit?\"\n\n#. Key:\t2BF9EF0C41CB352340F460AE4BC0FE02\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"I guess he will be happy if you return this to him, but otherwise it's garbage.\"\nmsgstr \"Gondolom örülne, ha visszavinnéd neki, de ezt leszámítva nem jó semmire.\"\n\n#. Key:\t315BB85E475FAA4C715E7F850B0E5EE2\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_24.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_24.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"Really? Then maybe I should give you this: another bottle of Potion of Worthiness!\"\nmsgstr \"Tényleg? Akkor ez téged illet! Még egy üveg Méltóság Itala!\"\n\n#. Key:\t316CF9AD4CF36FAFFAC45CA0A488FE53\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_57.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_57.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"I've got to go...\"\nmsgstr \"Mennem kell...\"\n\n#. Key:\t3A9767C34F0BB6E9E131D8BC7A8D9A25\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_26.Children(1).Children.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_26.Children(1).Children.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"Secret Science Society\"\nmsgstr \"Titkos Tudós Társaság\"\n\n#. Key:\t3E857073418A17EC48A1EA9D2B28A43E\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_30.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_30.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"I pulled a few levers here and there...\"\nmsgstr \"Lehúztam egy-két kart...\"\n\n#. Key:\t4671C3394EAF0988255C8090B409415D\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"Yes, things like that happen here all the time. You'll get used to it.\"\nmsgstr \"Jah, ilyesmik állandóan történnek errefelé. Majd hozzászoksz.\"\n\n#. Key:\t4709B6384B48D479672BC69EBC640C7E\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_31.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_31.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"Oh, really? That was nice, even if it was absolutely unnecessary! Never mind, here is your reward!\"\nmsgstr \"Tényleg? Nagyon kedves, bár semmi szükség nem volt rá. Na mindegy, azért itt a jutalmad!\"\n\n#. Key:\t5AE5A1A6408BC2EB0F9F96BA0826ACB0\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"Hmm... One of the creaks was a bit odd. I think the door will open soon!\"\nmsgstr \"Hmmm... Az egyik kattanás fura volt. Szerintem mindjárt kinyílik az ajtó!\"\n\n#. Key:\t5C81129F4B064C44F44335A3AB1CC178\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_29.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_29.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"The mind is furnished with ideas by a drunk upholsterer...\"\nmsgstr \"Az elmében a gondolatok olyanok, mint a bútorok a házban. Amiket egy részeg kárpitos gyártott és helyezett el...\"\n\n#. Key:\t5E441CF6434D7CA180853BBCBD6DFE44\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"Also, reading something represents such a nice way of killing time when I encounter a closed door!\"\nmsgstr \"Továbbá az olvasás kiváló módja az idő elütésének, ha egy zárt ajtó előtt kell várnom!\"\n\n#. Key:\t6B46D1EC463D3B9A4BFBBDB7725C0C22\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"How about a deal? Open this door and I will give you another bottle from my collection of Potions of Worthiness.\"\nmsgstr \"Mit szólsz ahhoz, hogy ha kinyitod az ajtót, akkor kapsz még egy üveg Méltóság Italát?\"\n\n#. Key:\t745CA5274A281AAA12CF798A53D54ACE\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_26.Children(3).Children.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_26.Children(3).Children.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"Ask about the book\"\nmsgstr \"Könyv\"\n\n#. Key:\t84DCE2A448C57E7FAD93CB9029BBD605\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_26.Children(0).Children.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_26.Children(0).Children.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"Floating obelisk\"\nmsgstr \"Lebegő Obeliszk\"\n\n#. Key:\t922B00804A843BD8EC9DB984D794F145\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"We met before, right? Of course we did.\"\nmsgstr \"Már találkoztunk, igaz? Hát persze, hogy igen.\"\n\n#. Key:\t9837238E42F28684DEBA2DAF9B332415\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"It might actually be total nonsense. That's what I am trying to find out at the moment, so I am reading it again and again and again...\"\nmsgstr \"Lehet hülyeség az egész. Erre próbálok rájönni, ezért olvasom újra, és újra, és újra...\"\n\n#. Key:\t995EAB564791A7F8BF34D3A26026F383\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_26.Children(4).Children.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_26.Children(4).Children.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"Leave\"\nmsgstr \"Távozok\"\n\n#. Key:\t9AD95267429D21EE59DC83937AD6811A\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"This is a Memory Crystal made by a really old looking man I've met long ago.\"\nmsgstr \"Ez egy Memória Kristály. Egy öreg fickó készítette ezeket, valamikor találkoztam vele.\"\n\n#. Key:\tA9DF44F54971A33775FF939FB292E26E\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"No man's knowledge here can go beyond my experience!\"\nmsgstr \"Nincs tudás, ami többet érne, mint a tapasztalataim!\"\n\n#. Key:\tAC59E35B420DF0F9B771B9938AC23891\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"I sure can! They used to invent cool stuff back in the days, before... you know, everyone's mind decided to go a bit insane.\"\nmsgstr \"Naná! Mindenféle vagány cuccokat találtak fel, abban az időben, amikor... tudod, amikor még nem kezdett el mindenki megőrülni.\"\n\n#. Key:\tB1E177F0430A3887A76CFAA46CE650AD\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"I don’t know why we are here... maybe to enjoy ourselves?\"\nmsgstr \"Mi célunk-e világon? Csak szórakozni vagyunk itt?\"\n\n#. Key:\tB5E57C3A4B0D51020B4F3C872164E8F2\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_26.Children(2).Children.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_26.Children(2).Children.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"Another door\"\nmsgstr \"Még egy ajtó\"\n\n#. Key:\tBA0C0F42482F357506A9C7ABADB6E49A\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_33.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_33.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"On the other hand, everyone is crazy these days... so we don't need doors anymore!\"\nmsgstr \"Másrészt manapság már mindenki megőrült... szóval nincs is nagyon szükség ajtókra!\"\n\n#. Key:\tBAC86050470A5EC67C30349C6B13DFE0\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"To be perceived is to be!\"\nmsgstr \"Vajon káromkodik-e az erdőben kidőlő fa, amikor senki sem hallja?\"\n\n#. Key:\tBAD7934444B3EB256141BFB689BB83A0\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"I will let you know when I come up with something.\"\nmsgstr \"Majd szólok, ha kitaláltam valamit.\"\n\n#. Key:\tBE5570C5477044DD0B1EEE928EAD8FA8\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_32.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_32.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"Nah. The world is full of crazy people. If I were sane, I would have liked to have as many closed doors as possible between me and those weirdos.\"\nmsgstr \"Áh, a világ tele van őrültekkel. Ha én lennék épelméjű, persze hogy azt szeretném, hogy minél több zárt ajtó legyen köztünk.\"\n\n#. Key:\tBE8120CC4E6A028BB45F10843F98135D\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"The door asks for a password that members use to enter the hideout... any idea what that could be?\"\nmsgstr \"Az ajtó jelszót kér... van ötleted, mi lehet az?\"\n\n#. Key:\tC7BE32BF43F7BA6D88A666956FAC35F3\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"I am here because I actually have to prove my worth again...\"\nmsgstr \"Azért vagyok itt, mert megint bizonyítanom kell, hogy Méltó vagyok...\"\n\n#. Key:\tC7ECC6D9457A4C49B39E98AEB14474E5\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_25.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_25.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"And I would actually feel much happier if I were on the other side of the door! You know,... I tried to ask it nicely to open and it just ignored me!\"\nmsgstr \"Én pedig sokkal jobban érezném magam, ha az ajtó másik oldalán lehetnék. Megkértem, nagyon kedvesen, hogy nyíljon ki, de válaszra sem méltatott!\"\n\n#. Key:\tD2F4B8E44239904A7BD4DD90336C871A\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_45.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_45.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"What kind of book is that?\"\nmsgstr \"Milyen könyvet olvasol?\"\n\n#. Key:\tED75E2104CCC3912A77DF18F7C916690\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"It was nice seeing you...\"\nmsgstr \"Örültem a találkozásnak...\"\n\n#. Key:\tF87975A94604B526DE1B638250BD85A9\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_27.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_27.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"The gate is open! Maybe this creature has a heart after all... and probably started feeling sorry for me as well.\"\nmsgstr \"Kinyílt az ajtó! Hát mégiscsak van szíve ennek a rusnya gépezetnek. Nyilván megsajnált...\"\n\n#. Key:\tFE470DB5464E438A122FAFAF593AF92B\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"Let me see! Yes... Oh...\"\nmsgstr \"Hadd gondoljam át! Igen...\"\n\n#. Key:\t066896454B62A9809060EBB3E0222D9A\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_SpeechSequence_1.SpeechSequence(3).SpeechSequence.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_SpeechSequence_1.SpeechSequence(3).SpeechSequence.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"Also, after skipping a couple of lectures, I got fired from university.\"\nmsgstr \"Meg hát, amiért kihagytam pár órát, kirúgtak az egyetemről.\"\n\n#. Key:\t17D1F3394E12F6C85A11C2B3D3BD1ACE\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_SpeechSequence_1.SpeechSequence(0).SpeechSequence.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_SpeechSequence_1.SpeechSequence(0).SpeechSequence.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"I am a scientist! I managed to prove it! I discovered this when I was conducting my research on gnome behavior...\"\nmsgstr \"Tudós vagyok! Tudományosan bebizonyítottam! Akkor jöttem rá, amikor a gnóm viselkedésről írtam a disszertációmat...\"\n\n#. Key:\t17D8D3C2484BA654BEAE8CACA3AD7501\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"Help me out with the door for the last time, and I will give you my last potion!\"\nmsgstr \"Segíts még egyszer ezzel az ajtóval, és neked adom az utolsó üveg italomat is!\"\n\n#. Key:\t22439DB6407947A700A6E9AFB4D29261\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"Hello again! You remember me, right? I'm the gnome who was crazy before it was cool!\"\nmsgstr \"Szasz! Emlékszel rám, igaz? Én vagyok a gnóm, aki már azelőtt megőrült, hogy az trendi lett volna!\"\n\n#. Key:\t2546F34E402CB4B25911238CC1E7A70F\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_29.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_29.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"Be as you with to seem.\\r\\n... or was it seem as you wish to be?\"\nmsgstr \"Légy olyan, amilyennek játszani szeretnél.\\n...vagy látszódj olyannak, mint egy légy?\"\n\n#. Key:\t2A78FDD9465789DC4FF5EB970C63F618\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"That is amazing! Thank you, my globular friend! Take these coins, I am sure you will enjoy spending them on... on whatever Balls like you like to spend.\"\nmsgstr \"Lenyűgöző! Köszönöm, gömbölyű barátom! Fogadd el ezt a szerény összeget cserébe. Ebből jó pár... olyan dolgot vehetsz, amit a labdák venni szoktak.\"\n\n#. Key:\t2EB726F641E4EF882228F6B49DA2B313\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_26.Children(1).Children.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_26.Children(1).Children.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"Password\"\nmsgstr \"Jelszó\"\n\n#. Key:\t339840D54BD71CF86F9DE4A801B1414F\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"I sure can! They used to invent cool stuff back in the days, before... you know, everyone's mind decided to go a bit insane.\"\nmsgstr \"Naná! Mindenféle vagány cuccokat találtak fel, abban az időben, amikor... tudod, amikor még nem kezdett el mindenki megőrülni.\"\n\n#. Key:\t3E639AB84A0D241D73AB8A991A483090\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_26.Children(4).Children.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_26.Children(4).Children.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"Leave\"\nmsgstr \"Távozok\"\n\n#. Key:\t464D32224CC04AD1F97602803245A37C\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"Take this! You deserve it...\"\nmsgstr \"Ez a tiéd! Megszolgáltál érte...\"\n\n#. Key:\t4BB0354D4398A4115F3A78B8EFCC7D16\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_27.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_27.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"I can't believe my eyes! It is open!\"\nmsgstr \"Nem hiszek a szememnek! Kinyílt!\"\n\n#. Key:\t6488288A45256CE464004F9BFF776850\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_24.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_24.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"It's your lucky day! Take this... it's my last bottle, but I guess your needs are greater than mine!\"\nmsgstr \"Ez a szerencsenapod! Tessék! Ez az utolsó üveg, de neked úgyis nagyobb szükséged van rá, mint nekem!\"\n\n#. Key:\t696219734B2E6966C53BE8B43A0C2212\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"The unexamined life is not worth living!\"\nmsgstr \"Az élet olyan, mint egy doboz Bumm-Bumm!\"\n\n#. Key:\t6FD516D14E42F5EC1D05CEA0F476BDEC\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"If you manage to find a strangely unique device in the hideout, I would be more than happy to buy that from you...\"\nmsgstr \"Ha véletlen látsz egy egészen egyedi, és meglehetősen fura eszközt, örülnék, ha elhoznád...\"\n\n#. Key:\t75BBEA604E9A3BAEF7599AA937E1AB2A\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"And you have the habit of needing my potions..\"\nmsgstr \"Neked pedig általában szükséged van az italaimra...\"\n\n#. Key:\t7978DCFE4044A6A3EC9F6BA54BAAD8BF\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"Yes, I am pretty sure this week is \\\"The only true wisdom is in knowing you know everything.\\\".\"\nmsgstr \"Igen, erre a hétre a jelszó az, hogy \\\"Az egyetlen igaz bölcsesség tudni, hogy mindent tudsz.\\\"\"\n\n#. Key:\t88881A3742ABFEAB95CA938C1AA81B60\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_25.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_25.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"I guess we are in the same boat - well, more or less... figuratively speaking, of course, because I can't really stand boats!\"\nmsgstr \"Ezek szerint egy hajóban evezünk - persze csak átvitt értelemben, amúgy ki nem állhatom a hajókat!\"\n\n#. Key:\t8A80B7554F39A818E4E66294BAFC9A76\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_26.Children(0).Children.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_26.Children(0).Children.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"Secret Science Society\"\nmsgstr \"Titkos Tudós Társaság\"\n\n#. Key:\t91E6FD4A44AB2E17C88767B0F17D6D1E\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_30.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_30.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"Why do you think that you're crazy?\"\nmsgstr \"Miből gondolod, hogy őrült vagy?\"\n\n#. Key:\t98E36F354D811F5DE5F98A942250997E\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"It is always wrong to believe everything!\"\nmsgstr \"Nem szabad mindent elhinni!\"\n\n#. Key:\t9B6EADBA4946B100D566988907A9675D\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"Any luck with the password for the Secret Science Society door?\"\nmsgstr \"Sikerült kitalálni a Titkos Tudós Társaság jelszavát?\"\n\n#. Key:\tA0F52B7148A942673A3489857B8C6EA9\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_26.Children(2).Children.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_26.Children(2).Children.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"Give Weird Device\"\nmsgstr \"Fura Eszköz\"\n\n#. Key:\tABE60F4D4709CCE1AF2A5197C03C8193\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"See you later...\"\nmsgstr \"Viszlát később!\"\n\n#. Key:\tB07C5C9A48839C3E81F6FA8B7550BBA4\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"I also have the bad habit of being obstructed by closed doors!\"\nmsgstr \"És megvan az a rossz szokásom, hogy zárt ajtók előtt vesztegelek!\"\n\n#. Key:\tB7C7314840274942F6D606B35398F039\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"The door asks for a password that members need to provide in order to enter the hideout... any idea what that could be?\"\nmsgstr \"Az ajtó jelszót kér... bármi ötlet, mi lehet az?\"\n\n#. Key:\tBB1AEBA44695D09192D7CA98AF9166B0\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_SpeechSequence_1.SpeechSequence(2).SpeechSequence.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_SpeechSequence_1.SpeechSequence(2).SpeechSequence.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"No wonder everyone started to consider me an idiot.\"\nmsgstr \"Nem csoda, hogy mindenki idiótának tartott.\"\n\n#. Key:\tC0B9CA5E4273E95306AD0C824ADFD84B\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_SpeechSequence_1.SpeechSequence(1).SpeechSequence.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_SpeechSequence_1.SpeechSequence(1).SpeechSequence.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"Long story short, I used to do all these crazy things, like talking about the weather or taking naps in the afternoon. At first, they seemed okay to me but in reality what I was doing was totally ridiculous!\"\nmsgstr \"Egy szó, mint száz, egyszer csak mindenféle őrültséget csináltam. Folyton csak az időjárásról beszéltem, és délutánonként is aludtam. Először teljesen normálisnak tűnt, de aztán rájöttem, hogy egyszerűen röhejes, amit csinálok!\"\n\n#. Key:\tC4193800427609972A2DECAB99D8CE6C\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"Hmm... One of the creaks was a bit odd. I think the door will open soon!\"\nmsgstr \"Hmmm... Az egyik kattanás fura volt. Szerintem mindjárt kinyílik az ajtó!\"\n\n#. Key:\tD1254F624213EAE67D6DD780182AA2DA\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"It was nice seeing you!\"\nmsgstr \"Örültem a találkozásnak!\"\n\n#. Key:\tD19327714CD0B2833BC7EBBD1E89CC83\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_26.Children(3).Children.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_26.Children(3).Children.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"You Crazy?\"\nmsgstr \"Őrült vagy?\"\n\n#. Key:\tE5C93E794F71C393568D0B855117C738\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"I found the secret hideout of the Secret Science Society. Do you know anything about them?\"\nmsgstr \"Megtaláltam a Titkos Tudós Társaság rejtekhelyét. Tudsz róla valamit?\"\n\n#. Key:\tEF216A2549E20C15A2C28184B62D45E6\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_36.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_36.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"Turns out that you cannot skip lectures if you're the teacher.\"\nmsgstr \"Kiderült, hogy egyáltalán nem hagyhatsz ki órát, ha te vagy a tanár.\"\n\n#. Key:\tEF650E874498865FA9FE6F9B9C37AB71\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"Here is the Weird Device I found in the hideout of the Secret Science Society.\"\nmsgstr \"Itt van a Fura Eszköz a Titkos Tudós Társaság rejtekhelyéről.\"\n\n#. Key:\t17A0CE394E01E1FFB31AA9A485E033AC\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_2.Children(4).Children.Text\n#: /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_2.Children(4).Children.Text\nmsgctxt \"Dialogue_TLSecretSocietyGate\"\nmsgid \"Mellon\"\nmsgstr \"Mellon\"\n\n#. Key:\t3293778C41F588EAC2DECDA76DA86A8E\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_2.Children(0).Children.Text\n#: /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_2.Children(0).Children.Text\nmsgctxt \"Dialogue_TLSecretSocietyGate\"\nmsgid \"The only...\"\nmsgstr \"Az egyetlen...\"\n\n#. Key:\t359996CC441CAB0497303A9C666F0CCD\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_TLSecretSocietyGate\"\nmsgid \"*******? No, that is not correct.\"\nmsgstr \"******? Nem, helytelen.\"\n\n#. Key:\t3C864B7F434DA42CAB07BCA70FB2E6A6\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_1.Children(0).Children.Text\n#: /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_1.Children(0).Children.Text\nmsgctxt \"Dialogue_TLSecretSocietyGate\"\nmsgid \"Okay, whatever\"\nmsgstr \"Jó, persze\"\n\n#. Key:\t40C27B354470AB53239424BCC2B8D259\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_TLSecretSocietyGate\"\nmsgid \"Do you really think secret scientists would use an elven word as a password? I don't even know what that means.\"\nmsgstr \"Tényleg azt hiszed, hogy a titkos tudósok egy törp szót használnának jelszónak? Különben is! Azt se' tudom, mit jelent.\"\n\n#. Key:\t4E89070F413EF5CD964EEF90234BEBC5\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_TLSecretSocietyGate\"\nmsgid \"I am pretty sure that it is better to avoid the Secret Science Society anyways...\"\nmsgstr \"Amúgy is jobbnak tűnik elkerülni a Titkos Tudós Társaságot...\"\n\n#. Key:\t515B5424465F983D14F3E09B7686899D\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_TLSecretSocietyGate\"\nmsgid \"STOP! Do not move! This gate is only for the members of the Secret Science Society!\"\nmsgstr \"Állj! Egy lépést se tovább! Ezen a kapun csak a Titkos Tudós Társaság tagjai léphetnek be!\"\n\n#. Key:\t51706AD44D697A14E6392B97A9E30AFC\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_TLSecretSocietyGate\"\nmsgid \"That is the silliest combination I have ever heard about in my whole life! That's the kind of thing an idiot would carry in his luggage!\"\nmsgstr \"Ez a leghülyébb kombináció, amit valaha hallottam. Ilyet maximum egy idióta használna a bőröndjéhez!\"\n\n#. Key:\t60B0B4E04E74C474AC2F4F8422DCE753\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_3.Children(0).Children.Text\n#: /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_3.Children(0).Children.Text\nmsgctxt \"Dialogue_TLSecretSocietyGate\"\nmsgid \"Leave the gate\"\nmsgstr \"Elmegyek\"\n\n#. Key:\t6EB7FD9546B2B89557D9708942CE54BD\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_2.Children(2).Children.Text\n#: /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_2.Children(2).Children.Text\nmsgctxt \"Dialogue_TLSecretSocietyGate\"\nmsgid \"12345\"\nmsgstr \"12345\"\n\n#. Key:\t749AB9CD48924031317291A953254917\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_TLSecretSocietyGate\"\nmsgid \"That password is for witch and wizard kids, not for old, wise, world renowned secret scientists!\"\nmsgstr \"Ugyan már, az varázsló és boszorkány kölyköknek való jelszó, nem pedig tapasztalt, bölcs, világhírű titkos tudósoknak!\"\n\n#. Key:\t7BB8FA8B4D051983390D3D8D4287DFEC\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_2.Children(1).Children.Text\n#: /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_2.Children(1).Children.Text\nmsgctxt \"Dialogue_TLSecretSocietyGate\"\nmsgid \"hunter2\"\nmsgstr \"hunter2\"\n\n#. Key:\t8CD051C44D9FBBD6D60694AFD2156D24\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_2.Children(5).Children.Text\n#: /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_2.Children(5).Children.Text\nmsgctxt \"Dialogue_TLSecretSocietyGate\"\nmsgid \"Try to gain some time\"\nmsgstr \"Próbálok időt nyerni\"\n\n#. Key:\t8F2244144056B8C389345F87D8C8B171\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_TLSecretSocietyGate\"\nmsgid \"I... I think I forgot... I have to remember it. I'll be back...\"\nmsgstr \"Ööö... izé, elfelejtettem, mindjárt eszembe jut. Pillanat, és itt vagyok...\"\n\n#. Key:\t8FC96FE94C115E3EDB214CAA3B380072\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_TLSecretSocietyGate\"\nmsgid \"Let us go on with the standard protocol then. Tell me the password of the week.\"\nmsgstr \"Akkor következzen a sztandard belépési protokol. Mi az e heti jelszó?\"\n\n#. Key:\tAA10FF02426D2C5DB9F7CF90596631C4\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_1.Children(1).Children.Text\n#: /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_1.Children(1).Children.Text\nmsgctxt \"Dialogue_TLSecretSocietyGate\"\nmsgid \"I am a member\"\nmsgstr \"Tag vagyok\"\n\n#. Key:\tB5237D1B4EFB02B1ED5017B68EC5A7EC\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_TLSecretSocietyGate\"\nmsgid \"Are you a member? Prove it! What is the password of the week?\"\nmsgstr \"Tag vagy? Bizonyítsd! Mi az e heti jelszó?\"\n\n#. Key:\tC8A1985C416AEA563142D7BF3B6DD77D\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_2.Children(3).Children.Text\n#: /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_2.Children(3).Children.Text\nmsgctxt \"Dialogue_TLSecretSocietyGate\"\nmsgid \"Caput Draconis\"\nmsgstr \"Caput Draconis\"\n\n#. Key:\tDC8F07EA44A20BEF70DFCDA4A62A421E\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_TLSecretSocietyGate\"\nmsgid \"Correct. Welcome to the secret hideout 12345, scientist!\"\nmsgstr \"Helyes. Üdvözöllek az 12345 számú titkos rejtekhelyen, tudós!\"\n\n#. Key:\tE0C10509474191587635B48ED0AA6913\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_TLSecretSocietyGate\"\nmsgid \"The only true wisdom is in knowing you know everything!\"\nmsgstr \"Az egyetlen igaz bölcsesség tudni, hogy mindent tudsz.\"\n\n#. Key:\t0707F21D4313073F47F3C69B64D61DB7\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_TombOfTabby\"\nmsgid \"Take this. It's all I can give now.\"\nmsgstr \"Tessék! Ez minden, amit most adhatok.\"\n\n#. Key:\t0918993B4F680528806DE680B471F795\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_TombOfTabby\"\nmsgid \"It was too much. I couldn’t keep on. I failed.\"\nmsgstr \"Túl sok volt nekem. Nem tudtam tovább menni. Elbuktam.\"\n\n#. Key:\t1598C2DE44A0BF92DC0E53BFAC47DEF5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_3.Children(3).Children.Text\n#: /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_3.Children(3).Children.Text\nmsgctxt \"Dialogue_TombOfTabby\"\nmsgid \"Leave\"\nmsgstr \"Távozok\"\n\n#. Key:\t1EF84FFD484E968FBDFE1386018485DB\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_3.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_3.Children(1).Children.Text\nmsgctxt \"Dialogue_TombOfTabby\"\nmsgid \"Raven\"\nmsgstr \"Holló\"\n\n#. Key:\t3343471F42742EEE0678D49E466448F1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_TombOfTabby\"\nmsgid \"Tell me the name!\"\nmsgstr \"Mond ki a nevet!\"\n\n#. Key:\t3DC816F147ACB79D6339D5AD31E0C5A5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_TombOfTabby\"\nmsgid \"Lillian!\"\nmsgstr \"Lillian!\"\n\n#. Key:\t3DE5FFEB4A5BEC150306999FDEF058BC\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_TombOfTabby\"\nmsgid \"Here lies Tabby, wanderer of the Ruined Realm. We will never forget what you did for us. May your spirit find peace in the afterlife.\"\nmsgstr \"Itt nyugszik Cirmos, a Fertőzött Föld vándora. Emléked örökké őrizni fogjuk. Lelked találjon nyugalomra a túlvilágon.\"\n\n#. Key:\t43F7C0AE4CB91D3957AB4CA54C1D4426\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_TombOfTabby\"\nmsgid \"He took the artefacts. His master never knew it.\"\nmsgstr \"Elvitte a Varázstárgyakat. A gazdája sosem tudta meg.\"\n\n#. Key:\t57A0634946BB9FD9603572ABD9368E52\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_3.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_3.Children(0).Children.Text\nmsgctxt \"Dialogue_TombOfTabby\"\nmsgid \"Wizard\"\nmsgstr \"Varázsló\"\n\n#. Key:\t5A6E99154FB027A82922FA91A9448E14\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_TombOfTabby\"\nmsgid \"I’m leaving... I didn’t want to bother you. May you find peace at last.\"\nmsgstr \"Én most elmegyek... Nem akartalak zavarni, nyugodj békében.\"\n\n#. Key:\t6A716E164BAACFAFB2EBDBBA8C04438F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_TombOfTabby\"\nmsgid \"He liked Lillian. He finished what I started.\"\nmsgstr \"Szerette Lilliant. Befejezte, amit elkezdtem.\"\n\n#. Key:\t7CDFB36B41931AADE01C10A465D09EAF\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_TombOfTabby\"\nmsgid \"Rest in peace!\"\nmsgstr \"Nyugodj békében!\"\n\n#. Key:\t831693034CD9AC88A07F1297BBB10056\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_TombOfTabby\"\nmsgid \"I will be there on her side again when the time comes.\"\nmsgstr \"Újra vele leszek, ha eljön az idő.\"\n\n#. Key:\tA78C16A943587C5EC876BFB0AA319421\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_TombOfTabby\"\nmsgid \"She is my only true master. I can’t leave her. Not yet.\"\nmsgstr \"Ő az egyetlen igaz gazdám. Nem hagyhatom el. Még nem.\"\n\n#. Key:\tC86836A149E8580E4608259C8482314F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_TombOfTabby\"\nmsgid \"Raven!\"\nmsgstr \"Holló!\"\n\n#. Key:\tD05E5AEF498C383F88D1AFBBDF371CDA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_TombOfTabby\"\nmsgid \"He forced me. Though I understood. I wanted the same.\"\nmsgstr \"Kényszerített. Megértettem. Én is így akartam.\"\n\n#. Key:\tE41ADE774AF3AF3FE637CE81531F3D29\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_3.Children(2).Children.Text\n#: /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_3.Children(2).Children.Text\nmsgctxt \"Dialogue_TombOfTabby\"\nmsgid \"Lillian\"\nmsgstr \"Lillian\"\n\n#. Key:\tED18C66D47BF594818C5DA8100AC2A36\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_TombOfTabby\"\nmsgid \"You are familiar... I almost remember...\"\nmsgstr \"Ismerős vagy... Emlékeznem kellene...\"\n\n#. Key:\tF6D8BC4F489D87A90E852CA3F97B479F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_TombOfTabby\"\nmsgid \"Wizard!\"\nmsgstr \"Varázsló!\"\n\n#. Key:\t2A0E02C94A04642C5096038C615E0D5B\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/tut2.tut2:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/tut2.tut2:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_tut2\"\nmsgid \"I see you managed to shape that ball body of yours… that’s interesting.\"\nmsgstr \"Látom sikerült kicsit alakítanod az új... testeden. Érdekes.\"\n\n#. Key:\t4D59C307403F27C91A9168AB58CDB1B3\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/tut2.tut2:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/tut2.tut2:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_tut2\"\nmsgid \"I didn’t want to summon you. I wanted to get my daughter back.\"\nmsgstr \"Nem akartalak megidézni, a lányomat akartam visszahozni.\"\n\n#. Key:\t8336FD024F34227E1AB7B1BFCCF7FFBF\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/tut2.tut2:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/tut2.tut2:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_tut2\"\nmsgid \"Your presence is not welcome here, demon!\"\nmsgstr \"Egyáltalán nem örülök neki, hogy átjöttél, démon!\"\n\n#. Key:\t16A6E7D24DFE49D6844E92B8E476BA66\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/tut5.tut5:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/tut5.tut5:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_tut5\"\nmsgid \"Once you are done I will set you free.\"\nmsgstr \"Ha sikerrel jársz, szabadon engedlek.\"\n\n#. Key:\t48FA56EF4293C577CB1977BE694034CC\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/tut5.tut5:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/tut5.tut5:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_tut5\"\nmsgid \"This is the deal demon...\"\nmsgstr \"Ez az ajánlatom, démon...\"\n\n#. Key:\tA27765824FDD88A579AB6180DDEA06B1\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/tut5.tut5:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/tut5.tut5:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_tut5\"\nmsgid \"Get into the Heart of the Realm and find the three Artefacts! I need those to correct the summoning.\"\nmsgstr \"Keress utat a Világ Közepébe, és találd meg a Három Varázstárgyat! Azokra lesz szükségem, hogy helyrehozzam az idézést.\"\n\n#. Key:\t5E1F54384BC258A91FF1DD9ECBC0DF39\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/tut8.tut8:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/tut8.tut8:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_tut8\"\nmsgid \"A cat that used to help my daughter to explore these realms.\"\nmsgstr \"Egy macska, aki a lányomnak segített felderíteni ezt a Világot.\"\n\n#. Key:\t859621E24125177084F4EAA39CF77902\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/tut8.tut8:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/tut8.tut8:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_tut8\"\nmsgid \"Who is Tabby?\"\nmsgstr \"Ki az a Cirmos?\"\n\n#. Key:\tD0BFF857414714D7C5FCB9B526539215\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/tut8.tut8:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/tut8.tut8:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_tut8\"\nmsgid \"Tabby was formidable with her claws, but you will need that sword.\"\nmsgstr \"Cirmos meg tudta védeni magát a karmaival, de neked jól jöhet az a kard.\"\n\n#. Key:\tDFCB1A1E48763642E71FD7A040F72F1B\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/tut8.tut8:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/tut8.tut8:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_tut8\"\nmsgid \"So he did the hard job before me...\"\nmsgstr \"Szóval övé volt a piszkos meló előttem...\"\n\n#. Key:\t2DD05A7E485B5C23DA0DCD84400D3F23\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/tut9.tut9:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/tut9.tut9:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_tut9\"\nmsgid \"What could be possibly weird for a walking ball?\"\nmsgstr \"Mégis mi lehetne fura egy sétáló labdának?\"\n\n#. Key:\t62A1ECFC47B762221EA0B1B5B0E0BEF6\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/tut9.tut9:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/tut9.tut9:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_tut9\"\nmsgid \"This place is in a better shape...\"\nmsgstr \"Ez a hely egy kicsit jobb állapotban van...\"\n\n#. Key:\tA9BCFBB541A9A2CEA8FB90884B8557C5\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/tut9.tut9:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/tut9.tut9:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_tut9\"\nmsgid \"The Ancient Magic is still strong within these walls. It keeps the Ruin at bay.\"\nmsgstr \"Az Ősi Mágia átjárja a falakat. Az tartja vissza a Fertőzést.\"\n\n#. Key:\tF9551D7849226F88A4FD15AAFB4789E6\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/tut9.tut9:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/tut9.tut9:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_tut9\"\nmsgid \"Be careful though... it can have the weirdest side effects.\"\nmsgstr \"Azért légy óvatos... ahol sok a mágia, ott fura dolgok történhetnek.\"\n\n#. Key:\t302976FD411E850B3CD7CEA7E0BF6924\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Wizard.Wizard:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/Ending/E1/Wizard.Wizard:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_Wizard\"\nmsgid \"Please wait outside until I repeat the spell. Once Lillian is back, I’ll take you home.\"\nmsgstr \"Kérlek várj odakint, amíg megismétlem a varázslatot. Ha Lillian visszatért, hazajuttatlak.\"\n\n#. Key:\t3851C21F419E9F1D29A06DA3B2A0F553\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Wizard.Wizard:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Ending/E1/Wizard.Wizard:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_Wizard\"\nmsgid \"Er... your room is still as untidy as last time, but no problem.\"\nmsgstr \"Hát, a szobád pont olyan rendetlen, mint a múltkor...\"\n\n#. Key:\t6CCE5BBC4135176C1FBD8E866FD4B098\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Wizard.Wizard:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Ending/E1/Wizard.Wizard:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_Wizard\"\nmsgid \"I’m sorry we met like this.\"\nmsgstr \"Sajnálom, hogy így kellett találkoznunk.\"\n\n#. Key:\t7511912D4F72D1D45CFFB9AA9815CCB2\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Wizard.Wizard:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E1/Wizard.Wizard:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_Wizard\"\nmsgid \"Yes... and thank you!\"\nmsgstr \"Így van... és köszönöm!\"\n\n#. Key:\tAC1641244DF694B660EAFDA1FC4A177B\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Wizard.Wizard:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E1/Wizard.Wizard:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_Wizard\"\nmsgid \"Here are your artefacts! I made my part of the deal.\"\nmsgstr \"Itt vannak a Varázstárgyaid! Én teljesítettem a részemet.\"\n\n#. Key:\tB567059148744E3F7A4D3B929F26CBB6\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Wizard.Wizard:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Ending/E1/Wizard.Wizard:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_Wizard\"\nmsgid \"Yes, we made a deal!\"\nmsgstr \"Persze, megegyeztünk!\"\n\n#. Key:\tC2ED3A564A55A644D33F9E9E38D1676A\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Wizard.Wizard:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Ending/E1/Wizard.Wizard:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_Wizard\"\nmsgid \"Give me a few more minutes to finish what we started!\"\nmsgstr \"Adj még egy kis időt, hogy befejezzem, amit elkezdtünk!\"\n\n#. Key:\tE1521B0B46F26BFA464C6C81EC2D4900\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Wizard.Wizard:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Ending/E1/Wizard.Wizard:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_Wizard\"\nmsgid \"Will you release me?\"\nmsgstr \"Hazajuttatsz?\"\n\n#. Key:\tFE3EE6014784FCE7EB8001BC1E77D833\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Wizard.Wizard:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Ending/E1/Wizard.Wizard:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_Wizard\"\nmsgid \"Er... excuse me for being rude with you. I might have misjudged you. And, anyway...\"\nmsgstr \"Ööö... ne haragudj, amiért udvariatlan voltam veled. Nem jól ítéltelek meg, azt hiszem. És... mindegy.\"\n\n#. Key:\t0D3B0F654B4B3FC1AE9B46809DA7FD74\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter2/Wizard_AfterMonk.Wizard_AfterMonk:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Wizard/Chapter2/Wizard_AfterMonk.Wizard_AfterMonk:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_Wizard_AfterMonk\"\nmsgid \"What did he say?\"\nmsgstr \"Mit mondott?\"\n\n#. Key:\tDE149D01484DA8CD03D1C0848D01BEA6\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter2/Wizard_AfterMonk.Wizard_AfterMonk:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Wizard/Chapter2/Wizard_AfterMonk.Wizard_AfterMonk:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_Wizard_AfterMonk\"\nmsgid \"Nothing...\"\nmsgstr \"Semmit...\"\n\n#. Key:\t1E43B5674AB45A7BDBEED1BE2AE25FE8\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter2/Wizard_Artefact1.Wizard_Artefact1:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Wizard/Chapter2/Wizard_Artefact1.Wizard_Artefact1:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_Wizard_Artefact1\"\nmsgid \"Well done. Now we have the first artefact. There are only two left...\"\nmsgstr \"Remek! Megvan az első Varázstárgy. Még kettő van hátra...\"\n\n#. Key:\t45AB81D94B2C6C9B13A49C944AD80389\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter2/Wizard_Artefact1.Wizard_Artefact1:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Wizard/Chapter2/Wizard_Artefact1.Wizard_Artefact1:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_Wizard_Artefact1\"\nmsgid \"Don’t tell me I will need to kill another two of these!\"\nmsgstr \"Ne mond, hogy még két ilyet le kell győznöm!\"\n\n#. Key:\t3CBF720A438F217805FD5F85990FF515\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter2/Wizard_Artefact2.Wizard_Artefact2:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Wizard/Chapter2/Wizard_Artefact2.Wizard_Artefact2:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_Wizard_Artefact2\"\nmsgid \"We are close! Only one artefact is missing.\"\nmsgstr \"Már csak egy hiányzik.\"\n\n#. Key:\tFD6163CC43BF00E4DB95CBB11CA7D389\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter2/Wizard_Artefact2.Wizard_Artefact2:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Wizard/Chapter2/Wizard_Artefact2.Wizard_Artefact2:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_Wizard_Artefact2\"\nmsgid \"What I miss is a comfortable apartment somewhere safe...\"\nmsgstr \"Ami hiányzik, az egy kényelmes lakás valahol biztonságos helyen...\"\n\n#. Key:\t0D37E1DE44FDF7C5BF8DD28C038FA49D\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter2/Wizard_Artefact3.Wizard_Artefact3:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Wizard/Chapter2/Wizard_Artefact3.Wizard_Artefact3:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_Wizard_Artefact3\"\nmsgid \"What? Can’t you just... oh, forget it!\"\nmsgstr \"Mi? Nem tudsz csak simán... áh, mindegy, felejtsd el!\"\n\n#. Key:\t2BDFD83247C8B644DED9CAA6486A064F\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter2/Wizard_Artefact3.Wizard_Artefact3:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Wizard/Chapter2/Wizard_Artefact3.Wizard_Artefact3:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_Wizard_Artefact3\"\nmsgid \"Yes, I’ve done what you asked. Now it’s your turn. Set me free!\"\nmsgstr \"Megtettem, amit kértél, most te jössz. Engedj szabadon!\"\n\n#. Key:\t8CCAFBA148F1834EABE12CAC93669A79\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter2/Wizard_Artefact3.Wizard_Artefact3:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Wizard/Chapter2/Wizard_Artefact3.Wizard_Artefact3:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_Wizard_Artefact3\"\nmsgid \"I have to admit I’m impressed. You found all the three artefacts.\"\nmsgstr \"Bevallom, sikerült lenyűgöznöd. Nem gondoltam, hogy mindet meg tudod szerezni.\"\n\n#. Key:\tA54C612946D6A5EB76D38B8622F4F76C\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter2/Wizard_Artefact3.Wizard_Artefact3:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Wizard/Chapter2/Wizard_Artefact3.Wizard_Artefact3:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_Wizard_Artefact3\"\nmsgid \"All right demon. Use the railways to travel to World’s End. That’s where I can bring you back.\"\nmsgstr \"Rendben, démon. A vasúttal el tudsz utazni a Világ Végére. Onnan tudlak visszahozni.\"\n\n#. Key:\t05FE50EE4B18F4FE9C1559979669E616\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"Still nothing, but nobody said anything about any visible change at this point, right?\"\nmsgstr \"Még mindig semmi, de hát nem is mondta senki, hogy lennie kellene valaminek ezen a ponton.\"\n\n#. Key:\t0DDE5A0E47BADFCA9E6E98A10F0AF114\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_1.Children(0).Children.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_1.Children(0).Children.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"Craft Ghost Abacus\"\nmsgstr \"Szellem Abakusz\"\n\n#. Key:\t0F4008294D6FA43C3D9C17BA600FB024\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"You have a glowing hammer. What's next?\"\nmsgstr \"Felizzítottad a kalapácsot. Hogyan tovább?\"\n\n#. Key:\t26089F6044B0FD1134C9C99AF17E9E0C\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_7.Children(4).Children.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_7.Children(4).Children.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"Say a different color\"\nmsgstr \"Mondok egy másik színt\"\n\n#. Key:\t29FFB2FF49C6C231583FF1B549DA218C\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"Gnome magic at its best. Did you do everything the way it was supposed to be done? You should find out soon... maybe.\"\nmsgstr \"Ez lenne a Gnóm mágia csúcsa? Biztos mindent úgy csináltál, ahogy meg van írva? Hamarosan kiderül... talán.\"\n\n#. Key:\t2BF7D8D726080F0A003A0229BE7871C7\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"With the proper instructions and materials you could definitely create something valuable here.\"\nmsgstr \"A megfelelő instrukciókkal és alapanyagokkal biztosan értékes dolgokat lehet itt készíteni.\"\n\n#. Key:\t3231FF0D4A2BBEE3E3AD7598E5105E0E\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"The object is coagulated into a single Surrected object!\"\nmsgstr \"A tárgy egyetlen Támasztott objektummá egyesült!\"\n\n#. Key:\t41335322411CF278B19849AC696E6F93\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_2.Children(4).Children.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_2.Children(4).Children.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"Break the abacus into pieces\"\nmsgstr \"Széttöröm az abakuszt\"\n\n#. Key:\t4C74F3C342690A8246916B85FF4685C9\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"The abacus does not show any emotion.\"\nmsgstr \"Az abakusz nem adja jelét érzelemnek.\"\n\n#. Key:\t4F8E51DA4C0B33020E34AF9AB47BCCD5\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_7.Children(0).Children.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_7.Children(0).Children.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"Croon \\\"La La LaLaLa LaLaLa\\\"\"\nmsgstr \"\\\"La La LaLaLa LaLaLa\\\"\"\n\n#. Key:\t5404D10943BB5F53229FDC845E60B000\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_7.Children(5).Children.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_7.Children(5).Children.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"Give up for now\"\nmsgstr \"Egyelőre feladom\"\n\n#. Key:\t5548D94E415483F129CCA7A3102B9DB3\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"Poor Abacus. It is broken into pieces now.\"\nmsgstr \"Szegény abakusz. Apró darabokra tört.\"\n\n#. Key:\t6F3DE41D43326079A2BD72A29059FBA9\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"You have the Abacus and the Ghost Flower Petals in front of you. The workshop has all the tools you need. How do you proceed?\"\nmsgstr \"Előtted hevernek a Szellem Virágszirmok és az Abakusz. A műhelyben megtalálsz minden szerszámot, ami csak kellhet. Mit teszel?\"\n\n#. Key:\t7EE3EE474090DCA65BB3199E69E83B43\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_1.Children(1).Children.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_1.Children(1).Children.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"Leave\"\nmsgstr \"Távozok\"\n\n#. Key:\t87B760894A587B34EB825487D907D2E4\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_7.Children(1).Children.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_7.Children(1).Children.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"Croon \\\"La LaLa LaLaLa LaLaLa\\\"\"\nmsgstr \"\\\"La LaLa LaLaLa LaLaLa\\\"\"\n\n#. Key:\t947E69AA4EEE6DB329FAD48214D4C416\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_2.Children(0).Children.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_2.Children(0).Children.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"Say \\\"Sorry my <object name>!\\\"\"\nmsgstr \"\\\"Sajnálom, <tárgy neve>!\\\"\"\n\n#. Key:\t95D5418F4145388680D7C99F720CE191\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_7.Children(3).Children.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_7.Children(3).Children.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"Say \\\"Brown\\\"\"\nmsgstr \"\\\"Barna\\\"\"\n\n#. Key:\tC184ED314482D706C3426CB5034C3AFD\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_7.Children(2).Children.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_7.Children(2).Children.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"Say \\\"Blue\\\"\"\nmsgstr \"\\\"Kék\\\"\"\n\n#. Key:\tC7EB7FC648E0005DC35550A3D71DF221\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_2.Children(3).Children.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_2.Children(3).Children.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"Cover the Abacus with Petals\"\nmsgstr \"Szirmokkal borítom az Abakuszt\"\n\n#. Key:\tCA7A7E0A4F16FBE20EE16395D6565D7E\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"Maybe the abacus is a bit more ghosty now... or is it just you getting tired of trying?\"\nmsgstr \"Mintha kezdene kicsit szellemszerűbb lenni az abakusz... vagy csak te lettél fáradtabb?\"\n\n#. Key:\tE0507C5E44553E824F998D8D4CB044A4\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"Your last action did not lead to any visible change. What is your next move?\"\nmsgstr \"Az utolsó művelet nem eredményezett látható változást. Hogyan tovább?\"\n\n#. Key:\tE8550D874C73F12B76345D9AAB2FEB80\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_2.Children(2).Children.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_2.Children(2).Children.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"Heat a hammer\"\nmsgstr \"Felizzítok egy kalapácsot\"\n\n#. Key:\tE894C6624CC7A0F92CECBBB364C77CD1\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_2.Children(1).Children.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_2.Children(1).Children.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"Say \\\"Sorry my Abacus!\\\"\"\nmsgstr \"\\\"Sajnálom, Abakusz!\\\"\"\n\n#. Key:\tEFC4E9AB4A1B8DF491B4FBABBC7FA560\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"The Abacus is covered with the Petals of the Ghost Flower.\"\nmsgstr \"Az Abakuszt beborítják a Szellemvirág Szirmai.\"\n\n#. Key:\t100A735A460E0DE2B0D130B802762D8B\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter2/WW_Scroll_Inspect.WW_Scroll_Inspect:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Wizard/Chapter2/WW_Scroll_Inspect.WW_Scroll_Inspect:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_WW_Scroll_Inspect\"\nmsgid \"It says: \\\"Be careful: I think there are Fishies in the water!\\\"\"\nmsgstr \"Azt írja: \\\"Légy résen: azt hiszem, Halik vannak a vízben!\\\"\"\n\n#. Key:\t1D280F60496F7EF5DBDADB90674E8225\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter2/WW_Scroll_Inspect.WW_Scroll_Inspect:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Wizard/Chapter2/WW_Scroll_Inspect.WW_Scroll_Inspect:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_WW_Scroll_Inspect\"\nmsgid \"He was.\"\nmsgstr \"Igaza.\"\n\n#. Key:\t37D4983B49B8986752A095B03ADCD700\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter2/WW_Scroll_Inspect.WW_Scroll_Inspect:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Wizard/Chapter2/WW_Scroll_Inspect.WW_Scroll_Inspect:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_WW_Scroll_Inspect\"\nmsgid \"He was right.\"\nmsgstr \"Igaza volt.\"\n\n#. Key:\t26432B92474630595CF8B6B44B02657B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_26.Text\n#: /Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_26.Text\nmsgctxt \"Dialogue_WWSewerCreatures\"\nmsgid \"Farewell and good luck to you as well!\"\nmsgstr \"Viszlát, és sok szerencsét neked is!\"\n\n#. Key:\t2E3C904D458640A4F06DD793B416366A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_WWSewerCreatures\"\nmsgid \"All right, I will return when I'm done.\"\nmsgstr \"Rendben, visszajövök, ha végeztem.\"\n\n#. Key:\t382595684668BDA97AAB95BF129246E4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_WWSewerCreatures\"\nmsgid \"No problem. I always help when I can.\"\nmsgstr \"Semmiség, mindig segítek, ha tudok.\"\n\n#. Key:\t4BF10AD741739BE69EF797A32410C281\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_WWSewerCreatures\"\nmsgid \"One of your brothers is trapped? What happened?\"\nmsgstr \"Az egyik testvéred fogságba esett? Mi történt?\"\n\n#. Key:\t52403E3341ECEA5801B0E58D2F472FD5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_1.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_1.Children(1).Children.Text\nmsgctxt \"Dialogue_WWSewerCreatures\"\nmsgid \"Leave\"\nmsgstr \"Távozok\"\n\n#. Key:\t53AC225B4F21B68CAC6F8997F324124E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_29.Text\n#: /Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_29.Text\nmsgctxt \"Dialogue_WWSewerCreatures\"\nmsgid \"Farewell until we meet again!\"\nmsgstr \"Ég veled!\"\n\n#. Key:\t65042BC342E9717229E74A9DD272DC5F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_WWSewerCreatures\"\nmsgid \"It was nice to see you again.\"\nmsgstr \"Jó volt újra látni.\"\n\n#. Key:\t77959A144131C47488B221ADD9B1E13B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_WWSewerCreatures\"\nmsgid \"Don't worry! I'm still looking for it.\"\nmsgstr \"Ne aggódj, még nem adtam fel a keresést.\"\n\n#. Key:\t7914F3CA40844C2A13A760BB0DAE1BFA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_WWSewerCreatures\"\nmsgid \"I don't have time for you creature! Stay out of my way!\"\nmsgstr \"Nincs időm rád, kicsi lény! Vigyázz az utamból!\"\n\n#. Key:\t79A62658414FE0202F2E9AA0E0238BD4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_9.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_9.Children(0).Children.Text\nmsgctxt \"Dialogue_WWSewerCreatures\"\nmsgid \"Accept Quest\"\nmsgstr \"Vállalom\"\n\n#. Key:\t9AEDA0E84BABEBCD8F18E8BC2D0B75D0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_WWSewerCreatures\"\nmsgid \"Calm down creature! I mean you no harm.\"\nmsgstr \"Nyugalom kicsi lény! Nem bántalak.\"\n\n#. Key:\tB89304534B24114D19DF7AB07635FFDE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_WWSewerCreatures\"\nmsgid \"All right I will see what I can do.\"\nmsgstr \"Rendben, meglátom, mit tehetek.\"\n\n#. Key:\tB8BD374E4738BFFDAFAC4EAA19E7A9D2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_23.Text\n#: /Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_23.Text\nmsgctxt \"Dialogue_WWSewerCreatures\"\nmsgid \"Oh, thank you!\"\nmsgstr \"Oh, köszönöm!\"\n\n#. Key:\tCF62984840B7508E82BAC0AB9D53EC0A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_9.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_9.Children(1).Children.Text\nmsgctxt \"Dialogue_WWSewerCreatures\"\nmsgid \"Decline\"\nmsgstr \"Inkább nem\"\n\n#. Key:\tEAD329F04773358B0CA339A4F155D990\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_WWSewerCreatures\"\nmsgid \"I'm sorry but I can't help you.\"\nmsgstr \"Sajnálom, nem tudok segíteni.\"\n\n#. Key:\tF281396D4110E61ACFEFDBB7AD8E44A8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_1.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_1.Children(0).Children.Text\nmsgctxt \"Dialogue_WWSewerCreatures\"\nmsgid \"Help\"\nmsgstr \"Segítek\"\n\n#. Key:\tedge_next\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_1.InnerEdges(0).InnerEdges.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_1.InnerEdges(0).InnerEdges.Text\nmsgctxt \"DlgSystemSettings\"\nmsgid \"Next\"\nmsgstr \"Tovább\"\n\n"
  },
  {
    "path": "Content/Localization/WarriorbDialogues/ro/WarriorbDialogues.po",
    "content": "﻿# WarriorbDialogues Romanian translation.\n# Copyright 1998-2019 Epic Games, Inc. All Rights Reserved.\n# \nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: WarriorbDialogues\\n\"\n\"POT-Creation-Date: 2020-10-07 08:09\\n\"\n\"PO-Revision-Date: 2020-10-07 08:09\\n\"\n\"Language-Team: \\n\"\n\"Language: ro\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Plural-Forms: nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?2:1));\\n\"\n\n#. Key:\t064BBCD1476819100C8D39881B7A7C56\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/2HW_LRDoor.2HW_LRDoor:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E2/2HW_LRDoor.2HW_LRDoor:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_2HW_LRDoor\"\nmsgid \"They still didn’t notice I locked them into the workroom.\"\nmsgstr \"Încă nu au observat că i-am închis în sala de lucru.\"\n\n#. Key:\t21412F0A4E45FA97703599BACD9C5D0E\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/2HW_LRDoor.2HW_LRDoor:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Ending/E2/2HW_LRDoor.2HW_LRDoor:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_2HW_LRDoor\"\nmsgid \"I entered into the Laboratory.\"\nmsgstr \"Am intrat în Laborator.\"\n\n#. Key:\t5A580A014B6E9907C819808423E10C30\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/2HW_LRDoor.2HW_LRDoor:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E2/2HW_LRDoor.2HW_LRDoor:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_2HW_LRDoor\"\nmsgid \"The Laboratory has strong secure spells. I can’t enter here without being noticed.\"\nmsgstr \"Laboratorul are vrăji puternice și sigure. Nu pot intra aici fără să fiu observat.\"\n\n#. Key:\t0530863744A9844E7F64009D82A189E4\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_2HW_WRDoor\"\nmsgid \"Ruin is close and we are all at risk. It’s not about you. It's about everyone.\"\nmsgstr \"Ruina este aproape și suntem cu toții în pericol. Nu este vorba despre tine. Este vorba despre toată lumea.\"\n\n#. Key:\t1AF2A89F4DCD86096D4343ABBE91BE51\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_2HW_WRDoor\"\nmsgid \"Something which doesn’t take my daughter’s soul...\"\nmsgstr \"Something which doesn’t take my daughter’s soul...\"\n\n#. Key:\t2C5B294847F0E41F2CA189904EE66059\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_2HW_WRDoor\"\nmsgid \"I heard father arguing with someone.\"\nmsgstr \"L-am auzit pe tată care se ceartă cu cineva.\"\n\n#. Key:\t2C8DFF1042FB0480709877A366BE2F1D\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_2HW_WRDoor\"\nmsgid \"The device must be destroyed.. We’ll find something else to stop Ruin.\"\nmsgstr \"Dispozitivul trebuie distrus. Vom găsi altceva pentru a-l opri pe Ruin.\"\n\n#. Key:\t3F9D7D9C42A8550A6B282680BFAE2CCC\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_2HW_WRDoor\"\nmsgid \"I had to do this. At least for mom. So that she didn’t die in vain.\"\nmsgstr \"A trebuit să fac asta. Cel puțin pentru mama. Așa că nu a murit în zadar.\"\n\n#. Key:\t7F6FC84C4D799841C6F42EB45A9D648F\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_2HW_WRDoor\"\nmsgid \"No, I won't risk losing her! She is bound to the device.\"\nmsgstr \"Nu, nu voi risca să o pierd! Ea este legată de dispozitiv.\"\n\n#. Key:\tA03D724A4606AFFC00E417A5C3AB3BFF\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_2HW_WRDoor\"\nmsgid \"Lillian knew what she applied for. She must decide.\"\nmsgstr \"Lillian știa la ce a aplicat. Ea trebuie să decidă.\"\n\n#. Key:\tABA214914981F3E844F49483B43B5414\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_2HW_WRDoor\"\nmsgid \"I used the key to close the door.\"\nmsgstr \"Am folosit cheia pentru a închide ușa.\"\n\n#. Key:\tB1ADF0404F97735215FCB9A47DD01640\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_2HW_WRDoor\"\nmsgid \"No, I’ve made my decision.\"\nmsgstr \"Nu, am luat decizia mea.\"\n\n#. Key:\tB26FAB564CA430617502FA85116629D0\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_2HW_WRDoor\"\nmsgid \"Even if our entire World needs to pay the price.\"\nmsgstr \"Chiar dacă întreaga noastră lume trebuie să plătească prețul.\"\n\n#. Key:\tD6D2D64446B6D921576A20ACD653AF7E\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_2HW_WRDoor\"\nmsgid \"I knew he wouldn’t let me finish what we started.\"\nmsgstr \"Știam că nu mă va lăsa să termin ceea ce am început.\"\n\n#. Key:\t178EBCA541F7FEC3CA46B1B2818691D4\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/AABook.AABook:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/AABook.AABook:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_AABook\"\nmsgid \"'...the Wisest of the Arcade gathered here to discuss if the magical phenomena means any more threat...'\"\nmsgstr \"'... Cel mai Înțelepți al Arcadei s-a adunat aici pentru a discuta dacă fenomenele magice înseamnă o amenințare mai mare ...'\"\n\n#. Key:\t8F2CCFF54FBAF7902DB6FEB0358ECFEF\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/AABook.AABook:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/AABook.AABook:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_AABook\"\nmsgid \"They were just like us. The next one hundred pages explain why Ruin will never reach the Arcade or how the Ancient Magic can stop it.\"\nmsgstr \"Erau la fel ca noi. Următoarele o sută de pagini explică de ce Ruina nu va ajunge niciodată pe Arcadă sau cum Magia Antică o poate opri.\"\n\n#. Key:\tAC20B864497FB0D476C501AEF3B87508\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/AABook.AABook:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/AABook.AABook:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_AABook\"\nmsgid \"I hope you don’t want to read all that nonsense.\"\nmsgstr \"Sper că nu vrei dori să citești toate prostiile astea.\"\n\n#. Key:\tB112F657498F660766AA45974CB44137\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/AABook.AABook:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/AABook.AABook:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_AABook\"\nmsgid \"'Ten years after the Cataclysm (or recently named as Ruin)...'\"\nmsgstr \"\\\"Zece ani după cataclism (sau recent numit ruină) ...\\\"\"\n\n#. Key:\t0F53B19F4EB2F7727B4907864AD3FF46\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_29.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_29.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"What if you just take a break from this and let me pass? Make an exception.\"\nmsgstr \"Ce se întâmplă dacă faci doar o pauză de la asta și mă lași să trec? Fă o excepție.\"\n\n#. Key:\t1707E0F34CFDC054DBEAD9AFB368A0A4\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"No rest, no sleep allowed.\"\nmsgstr \"Fără odihnă, fără somn permis.\"\n\n#. Key:\t2524B3EC4DE1E2921C710CBE4511045F\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"...sometimes I could really appreciate a chair.\"\nmsgstr \"... uneori aș puteam aprecia cu adevărat un scaun.\"\n\n#. Key:\t29FE2AEF42639848EF3914B36BA2B633\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"I do ask you for apologies, young one.\"\nmsgstr \"Îmi cer scuze, tinere.\"\n\n#. Key:\t2C1E7EA026080F0A003A0396BE7E0E7E\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"Take this rune stone as compensation.\"\nmsgstr \"Luați această piatră runică ca o compensare.\"\n\n#. Key:\t2C879B684B4B07B57D051797219E751E\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"You might have proven worthy for the Arcade Gate, yet there are some other doors, and they have different rules.\"\nmsgstr \"S-ar fi putut să te dovedești demn pentru poarta Arcadei, dar există alte uși și au reguli diferite.\"\n\n#. Key:\t3532C8254924CF13EA664CA11E256F07\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"Will you??? That's so kind of you... err... I mean...\"\nmsgstr \"Veți??? E atât de amabil de tine ... Adică ...\"\n\n#. Key:\t353D6C8B4B5719B1EFD2A59BA0281DED\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_2.Children(2).Children.Text\n#. Key:\t8EED48724A0A860CAD791FAF95554F26\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_3.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_2.Children(2).Children.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_3.Children(1).Children.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"Skip?\"\nmsgstr \"Ocolește?\"\n\n#. Key:\t3FF1411844C23DB2FDFA47939169B5C3\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_14.Children(0).Children.Text\n#. Key:\t59EC5E56475DE41CFC723793CEEAFA82\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_3.Children(0).Children.Text\n#. Key:\t65DD6A464F04F8B0762D568046344C16\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_6.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_14.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_3.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_6.Children(0).Children.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"Accept challenge\"\nmsgstr \"Acceptă Provocare\"\n\n#. Key:\t414D5CC44FFD640215B97BB6090627D6\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"That must be tough...\"\nmsgstr \"That must be tough...\"\n\n#. Key:\t4CAA2D0C4FB585A0EB5B4F87FE8A3A97\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"I accept my fate yet sometimes...\"\nmsgstr \"Îmi accept soarta deși uneori ...\"\n\n#. Key:\t4F7460F540408D07FECEEB88DC0D7D25\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"Not so fast young lord!\"\nmsgstr \"Nu prea repede tânăr domn!\"\n\n#. Key:\t52C3909F40026C52ADA498A5B60B3490\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_6.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_6.Children(1).Children.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"Poor Keeper\"\nmsgstr \"Săracul Portar\"\n\n#. Key:\t59141BA444003F36E1671CB4E91FFF0E\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"Farewell!\"\nmsgstr \"Rămas bun!\"\n\n#. Key:\t59AC0995469571DBE1B7B6BDF68FA37D\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"I am really sorry about that.\"\nmsgstr \"Îmi pare foarte rău pentru asta.\"\n\n#. Key:\t5C8404D34863129B221EF2BB1D0962CC\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_9.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_9.Children(0).Children.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"Yes?\"\nmsgstr \"Yes?\"\n\n#. Key:\t5FF922B94D3FCA5FD095FFB788F43D02\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"For there was a mistake.\"\nmsgstr \"Căci a fost o greșeală.\"\n\n#. Key:\t650DA55944F225C45BABE8B00D815A39\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_27.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_27.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"I guess you want me to go through some crazy traps again...\"\nmsgstr \"Cred că vrei să trec din nou prin niște capcane nebune ...\"\n\n#. Key:\t700A25DB401C6EDD1E9D1694DA1C1DA1\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"Keepers never fail their duty.\"\nmsgstr \"Portarii niciodată nu își neglijează datoria.\"\n\n#. Key:\t72D703F84C84CD07F7DA569D9B86AECB\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"There are times when you have to stand in front of a door for a really long time.\"\nmsgstr \"Există momente în care trebuie să stai în fața unei uși pentru o perioadă foarte lungă de timp.\"\n\n#. Key:\t8276A9AC4E3BAB81C41E6EAB12E4FED1\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_31.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_31.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"If I ever see a chair that's your size I will let you know.\"\nmsgstr \"Dacă voi vedea vreodată un scaun de dimensiunea ta, te voi anunța.\"\n\n#. Key:\t89421ED443CA8DD5A15DF289C5DC6C37\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_28.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_28.Children(0).Children.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"Accept Challenge\"\nmsgstr \"Acceptă Provocarea\"\n\n#. Key:\t910F61A841D9E86D1B349E85A8A47FCF\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"Prove yourself worthy and I shall yield the path!\"\nmsgstr \"Dovedește-te demn și voi da drumul!\"\n\n#. Key:\t9DAC66B94E5A37C628522B90029E8FCC\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_2.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_2.Children(0).Children.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"Not again\"\nmsgstr \"Not again\"\n\n#. Key:\t9F3FE24943FB7CE59B8453A2849E874A\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"This door is open and free of charge for everyone...\"\nmsgstr \"Aceasta ușă este deschisă și gratuită pentru toată lumea ...\"\n\n#. Key:\tA96E78A0410C87446F59ABAC1524A3F4\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_2.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_2.Children(1).Children.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"Let's do it!\"\nmsgstr \"Let's do it!\"\n\n#. Key:\tA9998DDC43D15F1EDE404B8A3E04E3B2\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"Keepers' lives are never easy.\"\nmsgstr \"Viața Portarilor nu este niciodată ușoară.\"\n\n#. Key:\tBCAE1C1D4890E79F187EF0940C6F7E84\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_12.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_12.Children(0).Children.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"Just get over\"\nmsgstr \"Doar treci peste\"\n\n#. Key:\tC2F8F4E1457AC142E58D1EA3AF24AB56\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"I am all right with a few hundred years, but after a millennium my knees hurt like hell.\"\nmsgstr \"Sunt în regulă cu câteva sute de ani, dar după un mileniu, genunchii mă dor ca naiba.\"\n\n#. Key:\tC955446E4CA17593CCC57B9A73AAE824\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"What?? Do you mean that all those challenges that I had to pass were in vain?\"\nmsgstr \"Ce?? Vrei să spui că toate acele provocări pe care trebuia să le trec au fost în zadar?\"\n\n#. Key:\tC97F61DA4A49287F5242EEB43152D409\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"All right, you win. I'll go and do some jumping. Must be better than waiting here for an eternity.\"\nmsgstr \"În regulă, ai câștigat. Mă duc să fac câteva sărituri. Trebuie să fie mai bine decât să aștepți o eternitate.\"\n\n#. Key:\tD318418D4CBBFA2AB381E6B287A8636F\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_30.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_30.Children(0).Children.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"Accept Challenge.\"\nmsgstr \"Acceptă provocarea.\"\n\n#. Key:\tD6BE170047C1A00770403087A7EBDF99\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_30.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_30.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"Hopefully, we will finish this soon.\"\nmsgstr \"Sperăm că vom termina asta în curând.\"\n\n#. Key:\tD72FF4F943571BE3DC8DB1877581D4CD\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"You shall prove yourself one more time.\"\nmsgstr \"Te vei dovedi încă o dată.\"\n\n#. Key:\tDFD8B1E0414F989D46ED9BB24610CDA8\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_12.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_12.Children(1).Children.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"I will help\"\nmsgstr \"Voi ajuta\"\n\n#. Key:\tFDDD27C544787C63B03CCE89B69A44E5\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"Well, thanks!\"\nmsgstr \"Ei bine, mulțumesc!\"\n\n#. Key:\t06D52FD74B0013A5A22FEBA7A6E82032\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Did you came back to check out my wares?\"\nmsgstr \"Te-ai întors să-mi verifici produsele?\"\n\n#. Key:\t07508A9F4A979D530AD8A9861F0C7D79\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Though maybe you will find relief by looking through my wares. Haha!\"\nmsgstr \"Deși poate veți găsi alinare uitându-te prin produsele mele. Haha!\"\n\n#. Key:\t0C1B7239419B00927360E1B9578540EA\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_27.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_27.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"That's a sad name indeed. If the old saying 'nomen est omen' is true, then it might not be the best choice.\"\nmsgstr \"Acesta este un nume trist într-adevăr. Dacă vechea zicală „nomen est omen” este adevărată, atunci este posibil să nu fie cea mai bună alegere.\"\n\n#. Key:\t0D8F81E140A7AF5369415FB1C081250E\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_10.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_10.Children(0).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Trade\"\nmsgstr \"Târguiește\"\n\n#. Key:\t1089DA0443D9B23C84B8B799EEEBCCC9\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_SpeechSequence_0.SpeechSequence(0).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_SpeechSequence_0.SpeechSequence(0).SpeechSequence.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Oh, that's sad my little one.\"\nmsgstr \"Oh, este trist micuțul meu.\"\n\n#. Key:\t16F6844C40498EC1B5CDAA87612D3982\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_42.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_42.Children(1).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"No way\"\nmsgstr \"No way\"\n\n#. Key:\t182D4124450BFA52EF26FBACE1706333\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_45.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_45.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"How noble of you!\"\nmsgstr \"Cât de nobil pentru tine!\"\n\n#. Key:\t1922E4FD49ABC50B04A33CBA07B440D1\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_34.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_34.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"But I hope this doesn't mean that you want to join the Maintainers. Haha!\"\nmsgstr \"Dar sper că acest lucru nu înseamnă că dorești să te alături Întreținătorilor. Haha!\"\n\n#. Key:\t195B9BED4921EE6D732CA4BE6391A402\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_31.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_31.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"No, thanks!\"\nmsgstr \"Nu mulțumesc!\"\n\n#. Key:\t198A3D8D426F5202C280CE96202EB415\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_50.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_50.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"This is a sad name indeed. And if the old saying 'nomen est omen' is true, then this might not be the best choice.\"\nmsgstr \"Acesta este într-adevăr un nume trist. Și dacă vechea zicală „nomen est omen” este adevărată, atunci aceasta ar putea să nu fie cea mai bună alegere.\"\n\n#. Key:\t1AF2DDE74542524EEF19CA9567CFBDAF\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"{name}? It still sounds a bit weird, but I think I might like it.\"\nmsgstr \"{name}? Sună încă un pic ciudat, dar cred că mi-ar plăcea.\"\n\n#. Key:\t1FC5AD3B488DB484169D0085D63ECC45\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"This sounds pretty epic but I wonder what nickname it might have?\"\nmsgstr \"Suna destul de epic, dar mă întreb ce poreclă ar putea avea?\"\n\n#. Key:\t21FEE27B41116ADFBFD2B69333D6EB3F\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"By using some sort of ritual or spell...\"\nmsgstr \"Folosind un fel de ritual sau vrajă ...\"\n\n#. Key:\t25DCE964400342D4188412ADF43277E6\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_61.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_61.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"I am rewarding you with these shiny coins!\"\nmsgstr \"Te răsplătesc cu aceste monede strălucitoare!\"\n\n#. Key:\t2717F0E0414D4828B67D9C9F9B7E5F84\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_62.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_62.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"See? I'm a gnome of my word!\"\nmsgstr \"Vedea? Sunt un pitic al cuvântului meu!\"\n\n#. Key:\t2747A45248055455F9FA3B977A019EE0\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_44.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_44.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Well, you know where to find me... once you have some coins to spend!\"\nmsgstr \"Ei bine, știi unde să mă găsești ... odată ce ai niște monede de cheltuit!\"\n\n#. Key:\t27CE4D1444C219D35B79F4A3B07CB67D\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"If you bring them to me, I will reward you with shiny golden coins!\"\nmsgstr \"Dacă mi le aduci, te voi răsplăti cu monede aurii strălucitoare!\"\n\n#. Key:\t3040F4DC4C763062C8EFED9BCA5028C0\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_59.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_59.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"I would love to give you that name, but if you don't have the money to pay for it, we can't make the deal, it wouldn't be fair\"\nmsgstr \"Mi-ar plăcea să îți dau acest nume, dar dacă nu ai banii pentru a plăti pentru asta, nu putem face tranzacția, nu ar fi corect\"\n\n#. Key:\t3124230541027A0022F54C8648E688C9\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Oh, a customer!\"\nmsgstr \"Oh, a customer!\"\n\n#. Key:\t31C147E1430106CD29C7D7B2F7E84975\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_23.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_23.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Oh, how sad.\"\nmsgstr \"Oh, ce trist.\"\n\n#. Key:\t37CC1248471C360F8BB605A404ED1408\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_10.Children(4).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_10.Children(4).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Give books\"\nmsgstr \"Give books\"\n\n#. Key:\t3E0A0E06487AD4E75C3AF28786DE9CC7\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_16.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_16.Children(0).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Don't know\"\nmsgstr \"Nu știu\"\n\n#. Key:\t40221BB0432119A5B1C285B748AEFB81\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_51.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_51.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"It sounds pretty epic, however I wonder what nickname it might have?\"\nmsgstr \"Pare destul de epic, totuși mă întreb ce poreclă ar putea avea?\"\n\n#. Key:\t422B5CC14CA23A6563EDBDBBEA09C44B\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_73.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_73.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Farewell! Ha-ha...\"\nmsgstr \"Rămas bun! Ha-ha ...\"\n\n#. Key:\t4574EE8E4B1EAB6C9310C4A19F77B170\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_10.Children(6).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_10.Children(6).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Leave\"\nmsgstr \"Pleacă\"\n\n#. Key:\t47F99BBF439F713C52279F86BDC4FDD5\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_72.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_72.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"No thanks, I'm leaving.\"\nmsgstr \"No thanks, I'm leaving.\"\n\n#. Key:\t4F31CEE0411BB60324FB58938857F162\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_16.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_16.Children(1).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"A mighty spirit\"\nmsgstr \"Un spirit puternic\"\n\n#. Key:\t4FA29908450786B433C0FCA2E313D989\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_36.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_36.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Hi, I'm Lory.\"\nmsgstr \"Hi, I'm Lory.\"\n\n#. Key:\t4FCB34514D82104E732407A1CD985F6B\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_70.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_70.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Sure, show me what you've got!\"\nmsgstr \"Sigur, arată-mi ce poți!\"\n\n#. Key:\t53A46E1948B7CC1A9F8E02A3147FBF2D\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_67.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_67.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Sure, what can I do?\"\nmsgstr \"Sure, what can I do?\"\n\n#. Key:\t53E7A272465DE8D6E34AE7BE7435B1AC\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_25.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_25.Children(1).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Spirit of the Unknown\"\nmsgstr \"Spiritul Necunoscutului\"\n\n#. Key:\t54F8FB604F0409ED474FBFBAD8BFD3B3\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"And you are...\"\nmsgstr \"Și tu ești...\"\n\n#. Key:\t58447CCB4EE84827DB8328A664C54198\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_24.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_24.Children(0).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Buy name\"\nmsgstr \"Cumpără nume\"\n\n#. Key:\t589162A649D330D791082EB8FE3F6459\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_41.Children(4).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_41.Children(4).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Don't buy.\"\nmsgstr \"Nu Cumpăra.\"\n\n#. Key:\t58CC98724AFCD3826D69D482682AF352\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"\\\"The true value of your family\\\" and \\\"How much does a brother cost?\\\" can be two examples in this case.\"\nmsgstr \"„Adevărata valoare a familiei tale” și „Cât costă un frate?” pot fi două exemple în acest caz.\"\n\n#. Key:\t5A249B2E47F62C59F66AD5848E6DEBFE\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_49.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_49.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"I'll see what I can do.\"\nmsgstr \"I'll see what I can do.\"\n\n#. Key:\t5A31E5D34729F7EAB69AC08238C1D32D\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_25.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_25.Children(0).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Failed One\"\nmsgstr \"Cel Eșuat\"\n\n#. Key:\t5BA1062346DF8BC47F97BA97653E6DDA\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_46.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_46.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Farewell then, and good luck with your quest! Ha-ha...\"\nmsgstr \"Adio, și mult noroc cu căutarea ta! Ha-ha ...\"\n\n#. Key:\t6047D5334E0247BFB75EBAA7380C6800\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_68.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_68.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"I have some other important things to do right now.\"\nmsgstr \"Am alte lucruri importante de făcut acum.\"\n\n#. Key:\t60B184AF4F25AFB60380029BD2C17AAB\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_66.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_66.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"I'm a mighty spirit of the Unknown!\"\nmsgstr \"Sunt un spirit puternic al Necunoscutului!\"\n\n#. Key:\t60CE0D4342B6E4971449D7BDDD62B13F\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_10.Children(3).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_10.Children(3).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Help\"\nmsgstr \"Ajutor\"\n\n#. Key:\t62C5459E46C969412EAD70BAD466D808\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_SpeechSequence_0.SpeechSequence(1).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_SpeechSequence_0.SpeechSequence(1).SpeechSequence.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Life is relentless. Innocent people are trapped, enslaved or abused!\"\nmsgstr \"Viața este neobosită. Oamenii nevinovați sunt prinși, înrobiți sau abuzați!\"\n\n#. Key:\t6DDEF0AB45B60A99946E8F9FC647DCDE\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_71.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_71.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"I need a proper name.\"\nmsgstr \"Am nevoie de un nume potrivit.\"\n\n#. Key:\t6F1C50A44DE698DF5BF089B1C9B29F06\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_69.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_69.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Right now I don't really have much money...\"\nmsgstr \"Chiar acum nu prea am bani ...\"\n\n#. Key:\t72272161488706E5E87697A755F11129\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Even though there are some other precious books that I could add to my collection...\"\nmsgstr \"Chiar dacă există câteva alte cărți prețioase pe care le-aș putea adăuga în colecția mea ...\"\n\n#. Key:\t764502A14C3C18B14F8A579A58CE5938\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"I know that some of those books must be in the Sewer's Library, but I couldn't find them.\"\nmsgstr \"Știu că unele dintre acele cărți trebuie să fie în Biblioteca Canalizării, dar nu le-am găsit.\"\n\n#. Key:\t7A1853C7454D74FD1F371A92CEE47B4E\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"That's fine but I wonder, what is your name?\"\nmsgstr \"E în regulă, dar mă întreb, cum te cheamă?\"\n\n#. Key:\t7BACFCA748AF641E051E2D8B8D8488FC\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"I don't know if I have one.\"\nmsgstr \"Nu știu dacă am una.\"\n\n#. Key:\t821021954082EA7E4B392FA89EE4DE91\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_41.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_41.Children(1).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Spirit of the Unknown (1 Gold)\"\nmsgstr \"Spiritul Necunoscutului (1 Aur)\"\n\n#. Key:\t83AECB5A4FCAB05CC81BCC9B810245B7\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_41.Children(2).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_41.Children(2).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"BALL-E (1 Gold)\"\nmsgstr \"MINGE-E (1 Aur)\"\n\n#. Key:\t84ACF5E1449849CB79CF8AB10BE2FF2E\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"As you can observe, I have a pretty nice collection of books.\"\nmsgstr \"După cum puteți observa, am o colecție destul de drăguță de cărți.\"\n\n#. Key:\t899D1E18420FDAD236BF3486B2A5A010\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Ring the bell if you need something.\"\nmsgstr \"Sună clopoțelul dacă ai nevoie de ceva.\"\n\n#. Key:\t8B33450F405DF08E72CE47B5FC66CDD5\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_55.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_55.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Spiry? Knowny?\"\nmsgstr \"Spiry? Știutorul?\"\n\n#. Key:\t8CEC3E1943C3AB72CF3B71B160B9ADB9\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_10.Children(5).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_10.Children(5).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Need gold\"\nmsgstr \"Am nevoie de aur\"\n\n#. Key:\t8D0FBCA540F73842DD3AC38A76A5B623\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_56.Text\n#. Key:\tF045657A439D69E3615B80A066E9CE86\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_33.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_33.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_56.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Nevermind! You chose well.\"\nmsgstr \"Nu contează! Ai ales bine.\"\n\n#. Key:\t8F32BD4544F8C439D7344CBE1F9B4D8A\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_24.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_24.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Would you like to buy one? The first one is for free!\"\nmsgstr \"Ai dori să cumperi unul? Primul este gratuit!\"\n\n#. Key:\t94C0F9B34F439CDFBDFAD696E81983E5\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"I don't have much gold. Is there any way you could help me out?\"\nmsgstr \"Nu am prea mult aur. Există vreun fel în care să mă poți ajuta?\"\n\n#. Key:\t9BA6BAA24E6C2B7F01964D892246E8F6\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"No, no, I meant the other bell.\"\nmsgstr \"Nu, nu, mă refer la celălalt clopot.\"\n\n#. Key:\tA9D4DF4C41BAD682571763BDA8DA6A62\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_10.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_10.Children(1).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Can't afford\"\nmsgstr \"Nu-mi permit\"\n\n#. Key:\tAA6B105442F5099CE0F4E2AE0DFF7080\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_35.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_35.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Now that we're done with this, will you have a look at my wares?\"\nmsgstr \"Acum că am terminat cu asta, vei arunca o privire asupra produselor mele?\"\n\n#. Key:\tAADE21D24A42CE7BD318478306BAFFF7\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_10.Children(2).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_10.Children(2).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"I need a name\"\nmsgstr \"I need a name\"\n\n#. Key:\tAB00899C4A94AA6458737BB28339A3EE\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Hush, hush, little one!\"\nmsgstr \"Hush, hush, micuțule!\"\n\n#. Key:\tAB431F244E4E18230CE5EAB99FB41A96\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_41.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_41.Children(0).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Failed One (1 Gold)\"\nmsgstr \"Cel eșuat (1 aur)\"\n\n#. Key:\tAB92E44E46B40EF16989FF850DE0F843\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_42.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_42.Children(0).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Interested\"\nmsgstr \"Interested\"\n\n#. Key:\tB0540325412D9839B33FB38C4FE73172\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Well, I guess that's a classic.\"\nmsgstr \"Ei bine, cred că este un clasic.\"\n\n#. Key:\tB0EFD31840839CDA6F3D929514412D00\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Ok, I'll try not to be annoying this time.\"\nmsgstr \"Ok, voi încerca să nu fiu enervant de data asta.\"\n\n#. Key:\tB1F217944F6B9A29BD13FA926D8230E8\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_44.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_44.Children(0).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Farewell!\"\nmsgstr \"Rămas bun!\"\n\n#. Key:\tBA2B2F444FC2320349C4A0BABDA78B40\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_25.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_25.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"All right...\"\nmsgstr \"În regula...\"\n\n#. Key:\tCADB3E394C94CDE32D9969B6C1A41F5C\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_47.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_47.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Take this Elevator Crystal as it might prove useful in your journey.\"\nmsgstr \"Ia acest Cristal pentru Lift, deoarece s-ar putea dovedi util în călătoria ta.\"\n\n#. Key:\tCB3F061042B8340154B4CD8AEED41348\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_42.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_42.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"However, there is a way, I can help you out. Of course, if you are interested.\"\nmsgstr \"Cu toate acestea, există o cale, te pot ajuta. Desigur, dacă ești interesat.\"\n\n#. Key:\tCF24AD454E123F6D7D61029155390914\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_41.Children(3).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_41.Children(3).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Warriorb (1 Gold)\"\nmsgstr \"Warriorb (1 Gold)\"\n\n#. Key:\tD01937C848C69809890885BAB13042BE\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_65.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_65.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"I'm not quite sure.\"\nmsgstr \"Nu sunt chiar sigur.\"\n\n#. Key:\tD53097EB4EFC08C0C3261A9EEBD96B72\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_39.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_39.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"That's sad. Nothing is worse than a customer without any gold to spend!\"\nmsgstr \"Asta e trist. Nimic nu este mai rău decât un client fără niciun aur de cheltuit!\"\n\n#. Key:\tD63C08294AC09BF5B8E5D29EEC1C7D39\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"I'm forced to stay in this realm because I agreed to do some silly tasks for a wizard. I could really use some help.\"\nmsgstr \"Sunt obligat să rămân pe acest tărâm pentru că am acceptat să fac niște sarcini stupide pentru un vrăjitor. Aș putea folosi cu adevărat ajutor.\"\n\n#. Key:\tDB0CCA7746068ACFBE6F71963C398753\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_63.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_63.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"And now that you have some coins to spend it's time to talk about business!\"\nmsgstr \"Și acum că ai niște monede de cheltuieală, este timpul să vorbim despre afaceri!\"\n\n#. Key:\tDC0F8EC0407F1C7B4FFED6A91CB961C5\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_57.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_57.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"I hope this doesn't mean that you want to join the Maintainers. Haha!\"\nmsgstr \"Sper că acest lucru nu înseamnă că dorești să te alături întreținătorilor. Haha!\"\n\n#. Key:\tDC475A6740B71354D90D53B6AD1C4740\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_60.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_60.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"How wondrous! You found my books!\"\nmsgstr \"Ce minune! Mi-ai găsit cărțile!\"\n\n#. Key:\tE3B8F89B4D4AC0ABD2E35994ABFA9916\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"I understand if you have identity problems, but there must be a way... how do others call you?\"\nmsgstr \"Înțeleg dacă ai probleme de identitate, dar trebuie să existe un mod ... cum îți spun alții?\"\n\n#. Key:\tE6BD711C4E23B71F944EEFB1C8D09AB4\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_41.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_41.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"You've come to the right place! Haha!\"\nmsgstr \"Ai ajuns la locul potrivit! Haha!\"\n\n#. Key:\tEDEB662C4A5024CC618A668699BFAC2C\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_SpeechSequence_0.SpeechSequence(2).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_SpeechSequence_0.SpeechSequence(2).SpeechSequence.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"There is no justice in this Realm.\"\nmsgstr \"Nu există dreptate în acest Tărâm.\"\n\n#. Key:\tF8814FA0497129A211F3F9BE01EAF378\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_29.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_29.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"That's a very cute name for a little one like you.\"\nmsgstr \"Acesta este un nume foarte drăguț pentru ceva mic ca tine.\"\n\n#. Key:\tF8BEB8C147C81D8B13E52AA9934891AB\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_58.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_58.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Nevermind, you can always come back.\"\nmsgstr \"Nu contează, poți să te întorci mereu.\"\n\n#. Key:\tF97BE7FD49F465A97F7C8D9F308EAD3C\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_52.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_52.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"That's such a cute name for a little one.\"\nmsgstr \"Acesta este un nume atât de drăguț pentru unul mic.\"\n\n#. Key:\tFAAAE5944AA8CCAEFC931CAA814C8621\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_54.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_54.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Which means you chose well.\"\nmsgstr \"Ceea ce înseamnă că ai ales bine.\"\n\n#. Key:\tFAD10B404CF744B61DF5D093829CD1E9\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Of course! You need some gold, otherwise how would you buy my stuff?\"\nmsgstr \"Desigur! Ai nevoie de aur, altfel cum ai cumpăra lucrurile mele?\"\n\n#. Key:\tFE40092A444E97C59E8C6E94061D1134\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_30.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_30.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"However, I'd rather prefer: 'Nomen quantivis iam est pret!'\"\nmsgstr \"Cu toate acestea, mai degrabă aș prefera: 'Nomen quantivis iam est pret!'\"\n\n#. Key:\tFEE11C0F4A65DDFFDBF0BD8BB30CD438\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_25.Children(2).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_25.Children(2).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"BALL-E\"\nmsgstr \"MINGE-E\"\n\n#. Key:\tFF0AFE8544814AE524115A853547D727\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_24.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_24.Children(1).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Refuse\"\nmsgstr \"Refuză\"\n\n#. Key:\t0648624E4922B098541A7EA738DABC92\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/AARagdoll.AARagdoll:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/AARagdoll.AARagdoll:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_AARagdoll\"\nmsgid \"Well that happens sometimes. Maybe that someone forgot to monopolize this ragdoll design.\"\nmsgstr \"Ei bine, asta se întâmplă uneori. Poate că cineva a uitat să monopolizeze acest design de păpușă de cârpă.\"\n\n#. Key:\t2058DE654B2B75531C04628635169938\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/AARagdoll.AARagdoll:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/AARagdoll.AARagdoll:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_AARagdoll\"\nmsgid \"Just leave that doll.\"\nmsgstr \"Just leave that doll.\"\n\n#. Key:\t5A456D084D452C82038A04942002FAE6\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/AARagdoll.AARagdoll:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/AARagdoll.AARagdoll:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_AARagdoll\"\nmsgid \"It’s like the doll which was made by...\"\nmsgstr \"Este ca păpușa care a fost făcută de ...\"\n\n#. Key:\t7813ED164DF5CA7DE48A978F9A3DC959\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/AARagdoll.AARagdoll:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/AARagdoll.AARagdoll:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_AARagdoll\"\nmsgid \"How on earth did this get here?\"\nmsgstr \"Cum a ajuns aici?\"\n\n#. Key:\tC4403E4C4FD7D72CA3252FB31FF98FDF\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/AARagdoll.AARagdoll:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/AARagdoll.AARagdoll:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_AARagdoll\"\nmsgid \"...by someone I knew.\"\nmsgstr \"... de cineva pe care îl cunosc.\"\n\n#. Key:\tE4CD5DBC4E4BB1E783B55D80F4296B97\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/AARagdoll.AARagdoll:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/AARagdoll.AARagdoll:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_AARagdoll\"\nmsgid \"There are many weird things all over this place. What makes this stand out?\"\nmsgstr \"Există multe lucruri ciudate peste tot în acest loc. Ce face să iasă în evidență?\"\n\n#. Key:\tEDD72B38407D0C33C5F7859D09BC132B\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/AARagdoll.AARagdoll:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/AARagdoll.AARagdoll:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_AARagdoll\"\nmsgid \"You are not funny.\"\nmsgstr \"Nu ești amuzant.\"\n\n#. Key:\t02767246403F00F0C866B2A7F3E22A47\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_72.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_72.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"You can hardly find anyone that has more information about the Realms.\"\nmsgstr \"Cu greu găsești pe cineva care să aibă mai multe informații despre Tărâmuri.\"\n\n#. Key:\t04843D4A4D2DD4BC7CE50989C8F66FBA\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_2.SpeechSequence(2).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_2.SpeechSequence(2).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"How can I do something if I do not know what I have to do?\"\nmsgstr \"Cum pot face ceva dacă nu știu ce am de făcut?\"\n\n#. Key:\t071A801E44759E2681218497B9AE9A2B\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_53.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_53.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Your logic is incoherent.\"\nmsgstr \"Logica ta este incoerentă.\"\n\n#. Key:\t07488F9A4CC6F87DBC44F0A11700B370\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_70.Children(0).Children.Text\n#. Key:\tA67B3D3B4A3D17B37D585EBBBD9BBE92\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_75.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_70.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_75.Children(0).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"All right, I'm on it.\"\nmsgstr \"Sunt bine.\"\n\n#. Key:\t0757D23846F6BC96198472B7E9848D3F\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_52.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_52.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Maybe I should accept what I need to do now.\"\nmsgstr \"Poate că ar trebui să accept ceea ce trebuie să fac acum.\"\n\n#. Key:\t07D63011406134B07FB90B903825151C\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_8.SpeechSequence(2).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_8.SpeechSequence(2).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Make your wizard turn you back to normal.\"\nmsgstr \"Fă ca vrăjitorul să te transforme înapoi la normal.\"\n\n#. Key:\t091DFEFA4B2DD8F9922A1B93534C66A8\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_70.Text\n#. Key:\t0F92571643C12F65C669F7812572B014\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_82.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_70.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_82.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven gives you one of his keys so that you can move around freely.\"\nmsgstr \"Corbul îți oferă una dintre cheile sale, astfel încât să te poți deplasa liber.\"\n\n#. Key:\t0922ED5741BB89553CCB548D33566972\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_8.SpeechSequence(4).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_8.SpeechSequence(4).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven is something which won't make wizards turn Raven back.\"\nmsgstr \"Corbul este ceva care nu-i va face pe vrăjitori să întoarcă pe Corb înapoi.\"\n\n#. Key:\t0AAFADBB493DCFBA6C649EAC11133DC2\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_2.SpeechSequence(0).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_2.SpeechSequence(0).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"You don't have to know.\"\nmsgstr \"Nu trebuie să știi.\"\n\n#. Key:\t0E59A33E44BF6B212BF0EF8E8EFB3E39\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_6.SpeechSequence(2).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_6.SpeechSequence(2).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"A rich kingdom ruling all the other lands, powered by spirits of another world; these spirits were bound to metal.\"\nmsgstr \"Un regat bogat care stăpânește toate celelalte regiuni, alimentat de spirite ale altei lumi; aceste spirite erau legate de metal.\"\n\n#. Key:\t0EACC01B4A4C4F8C5622B9BD291E0DB9\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_91.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_91.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"I'm not quite sure about this...\"\nmsgstr \"Nu sunt deloc sigur de asta ...\"\n\n#. Key:\t10142FA943B5E5D89F9E5AADC86EF413\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_113.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_113.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Yes.\"\nmsgstr \"Da.\"\n\n#. Key:\t12375FB0475147E23E1C21A867CFF219\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_68.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_68.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Is there anything else on your mind?\"\nmsgstr \"Există alceva în mintea ta?\"\n\n#. Key:\t12A0B58B446843DD24045394E8586D7D\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Krrr...\"\nmsgstr \"Krrr...\"\n\n#. Key:\t12B921E04D135919C7DA37ADDBD2A7DB\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_100.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_100.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"We still have some time left before this happens.\"\nmsgstr \"Mai avem ceva timp înainte să se întâmple acest lucru.\"\n\n#. Key:\t133F676B4DBA8B41F6B94387D51457D5\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_59.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_59.Children(1).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"No more Raven\"\nmsgstr \"Nu mai este Corbul\"\n\n#. Key:\t13EF39EE4249FDD62208CFB7A41821D7\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_65.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_65.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Though Raven knows how you feel.\"\nmsgstr \"Deși Corbul știe cum te simți.\"\n\n#. Key:\t15D06ACE4E8B5E4DA49297BBE436039D\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_80.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_80.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Now you only need to find a place where you can infuse it.\"\nmsgstr \"Acum trebuie doar să găsești un loc în care să-l poți infuza.\"\n\n#. Key:\t16D5522340AE76E69A4808A3C2D1C039\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_51.Children(1).Children.Text\n#. Key:\t2AD4608440348AC7C3E363A430B9848C\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_83.Children(0).Children.Text\n#. Key:\t57DDAE184F31D9761E3939B16E6B2E67\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_20.Children(1).Children.Text\n#. Key:\t59F157C64A5415C8B4E322B0FF5F2ACE\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_49.Children(1).Children.Text\n#. Key:\t73ACC7124190746F6D3EBF96C8202C25\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_77.Children(1).Children.Text\n#. Key:\t9900274346DCB374A4B222A6BFD67365\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_10.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_10.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_20.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_49.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_51.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_77.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_83.Children(0).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Chat\"\nmsgstr \"Conversează\"\n\n#. Key:\t19FD8B0541A533338EA11B9CDA3719B2\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_74.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_74.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Now you only need to find a place where you can infuse it. Meanwhile, Raven must figure it out how to open the Gate with it.\"\nmsgstr \"Acum trebuie doar să găsești un loc în care să-l poți infuza. Între timp, Corbul trebuie să-și dea seama cum să deschidă Poarta cu ea.\"\n\n#. Key:\t1BD7592A4F11AEC585ECA6A74A0E0D4E\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_9.SpeechSequence(4).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_9.SpeechSequence(4).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"In what way?\"\nmsgstr \"In what way?\"\n\n#. Key:\t1C30FADA4BB2B3CCE2140A8E192D9F14\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_34.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_34.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven is not like those dummy Living Armors, yet he does what he was made for.\"\nmsgstr \"Corbul nu este ca acele Armuri Vii manechine, totuși face ceea ce a fost făcut.\"\n\n#. Key:\t1C57460444A7E044DD96148495C4C217\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_6.SpeechSequence(4).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_6.SpeechSequence(4).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"They lost purpose and became reckless.\"\nmsgstr \"Și-au pierdut scopul și au devenit imprudenți.\"\n\n#. Key:\t1E3AF1D8483287CE52633EA41B89DF11\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_116.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_116.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"After he had some rest.\"\nmsgstr \"După ce s-a odihnit.\"\n\n#. Key:\t1ED675F344909355D41212988B736F70\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_1.SpeechSequence(3).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_1.SpeechSequence(3).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven's master would like to understand before doing anything.\"\nmsgstr \"Stăpânul Corbului ar dori să înțeleagă înainte de a face orice.\"\n\n#. Key:\t22E51DC245ABAE53146A71AAE8D5AB55\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"You will realize that 'sense' has no meaning in this realm anymore.\"\nmsgstr \"Îți vei da seama că „sensul” nu mai are niciun sens în acest tărâm.\"\n\n#. Key:\t236E0B58451C947C0DB93E9E3408456D\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_45.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_45.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"They are humans.\"\nmsgstr \"Sunt oameni.\"\n\n#. Key:\t254FBEE547ADDFCF33B350B04AE1EE16\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_95.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_95.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"I think I know all about the meaning of life and all, ok? Can we just go on?\"\nmsgstr \"Cred că știu totul despre sensul vieții și toate, ok? Putem merge mai departe?\"\n\n#. Key:\t2671F10D4257D8A3482009A9C042026D\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Hand it over to Raven so he could open the Gate!\"\nmsgstr \"Înmânează-l Corbului ca să poată deschide Poarta!\"\n\n#. Key:\t2845CBE64B1624C7EC4B81BC314B4F1B\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_27.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_27.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"The master gave Raven the ability to think and talk.\"\nmsgstr \"Stăpânul i-a oferit Corbului capacitatea de a gândi și de a vorbi.\"\n\n#. Key:\t29F405BF4233B5A8331B419747954425\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_77.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_77.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Why are you here?\"\nmsgstr \"De ce ești aici?\"\n\n#. Key:\t2B5FB92D4F98359F68AD58AB776FD9BA\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_9.SpeechSequence(1).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_9.SpeechSequence(1).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Seeking for knowledge, as always. And you? Never thought we’ll meet again. Still trying to take down these Realms forever?\"\nmsgstr \"Caută cunoaștere, ca întotdeauna. Și tu? Nu am crezut niciodată că ne vom întâlni din nou. Încearcă să elimini aceste tărâmuri pentru totdeauna?\"\n\n#. Key:\t2B8CF34046D5486EB935CE919A1BD469\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_97.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_97.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"I'm new with all this wizard business thing. What was their conversation about?\"\nmsgstr \"Sunt nou cu toate lucrurile care au de a face cu vrăjitorul. Despre ce vorbea?\"\n\n#. Key:\t2C15668C26080F0A003A02E7BE7B5A65\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_8.SpeechSequence(1).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_8.SpeechSequence(1).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"It can happen again.\"\nmsgstr \"It can happen again.\"\n\n#. Key:\t2F226AC246B52387854AF5AFA09CEDD6\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_43.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_43.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"So we let those keys behind and set ourselves free from wizards?\"\nmsgstr \"Așadar, lăsăm acele chei în urmă și ne eliberăm de vrăjitori?\"\n\n#. Key:\t2FF7B3E84C009ECFDDE9F495092BEAA8\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_9.SpeechSequence(7).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_9.SpeechSequence(7).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"A pleasure to hear that. Talk to Raven about the details. Please excuse me for leaving so early, I have something important to do.\"\nmsgstr \"O plăcere să aud asta. Vorbește cu Corbul despre detalii. Te rog să mă scuzi că plec atât de devreme, am ceva important de făcut.\"\n\n#. Key:\t305333F348E677D8C3553999F412C8B6\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_36.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_36.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven knows he has different tasks now, compared to what he used to do before.\"\nmsgstr \"Corbul știe că are sarcini diferite acum, în comparație cu ce făcea înainte.\"\n\n#. Key:\t311A1E3745667AC6B4114D999B0E7C7F\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_83.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_83.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Go now! Raven still needs some more time to think about this.\"\nmsgstr \"Mergi acum! Corbul mai are nevoie de mai mult timp pentru a se gândi la acest lucru.\"\n\n#. Key:\t32F0018141E94BDE0921E9A54C1E4F20\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_1.SpeechSequence(0).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_1.SpeechSequence(0).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"They were always like this.\"\nmsgstr \"Au fost mereu așa.\"\n\n#. Key:\t34903F43484A4D6CE5735890AEEA294D\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_9.SpeechSequence(5).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_9.SpeechSequence(5).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"The Cerulean Gates are closed again. What if we share the work?\"\nmsgstr \"Porțile Cerulean sunt închise din nou. Ce se întâmplă dacă împărtășim munca?\"\n\n#. Key:\t350270814B961A20E48267A4B1AE0538\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Yes! The Gem is fully charged!\"\nmsgstr \"Da! Bijuteria este încărcată complet!\"\n\n#. Key:\t361D80AB46AC47E5A233ECA2323222A2\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_86.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_86.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Why are you obeying that wizard of yours?\"\nmsgstr \"De ce te supui Vrăjitorului tău?\"\n\n#. Key:\t365EDA2849D42A47D0D26DAC50DA6E94\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven is not that happy with those two, but Raven can accept that he is what he is.\"\nmsgstr \"Raven nu este atât de fericit cu cei doi, dar Raven poate accepta că el este ceea ce este.\"\n\n#. Key:\t37C560AB4CCFAF4F8D26FAB1DE22453C\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_63.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_63.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Don't worry. You'll find some purpose.\"\nmsgstr \"Nu-ți face griji. Vei găsi un scop.\"\n\n#. Key:\t39DAB8B641C31878F7312FA7807D9DA0\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_6.SpeechSequence(3).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_6.SpeechSequence(3).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"The residents of the Realm did not have to work. Their spirit slaves did everything for them, they accomplished all their desires.\"\nmsgstr \"Locuitorii de pe tărâm nu trebuiau să muncească. Sclavii lor spirituali au făcut totul pentru ei, și-au îndeplinit toate dorințele.\"\n\n#. Key:\t3B63606F48193748243DE6AB18D7A68C\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_40.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_40.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven thinks you might want to be something else. Something that you used to be, but you are not anymore.\"\nmsgstr \"Corbul crede că poate vrei să fii altceva. Ceva ce ai fost, dar nu mai ești.\"\n\n#. Key:\t3C332B1C4ADB3C16C005E8AAF76A09B1\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_109.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_109.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Except...\"\nmsgstr \"Cu excepția..\"\n\n#. Key:\t3C9750814FC56947BDA7DFAF8A71DCC2\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_25.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_25.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"It is a long story and Raven doesn't really like to talk about it.\"\nmsgstr \"Este o poveste lungă și Corbului nu-i place foarte mult să vorbească despre asta.\"\n\n#. Key:\t3D10982D4A6FA88941F13F82413D17AC\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_20.Children(0).Children.Text\n#. Key:\t3E117EBB48C1CF091F456CA0FB78EDD7\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_77.Children(0).Children.Text\n#. Key:\t59F0F04941BB918E08743E8A7C3734B2\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_32.Children(6).Children.Text\n#. Key:\t6556945844ED44678075CE8796F00800\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_51.Children(0).Children.Text\n#. Key:\t7EC3944940792EC71B6A2F8674250649\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_49.Children(0).Children.Text\n#. Key:\tC6963EAE43B4D0FD3C8FBAA80A38E2A2\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_83.Children(1).Children.Text\n#. Key:\tE048FA684AA7B8DE0F7273992DA4600E\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_3.Children(4).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_20.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_3.Children(4).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_32.Children(6).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_49.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_51.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_77.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_83.Children(1).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Leave\"\nmsgstr \"Pleacă\"\n\n#. Key:\t4417EE084F947AAF5D3285B086F741AC\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven is fine with talking. Ask me whatever you have on your mind!\"\nmsgstr \"Corbului este în regulă cu vorbele. Întreabă-mă orice ai în minte!\"\n\n#. Key:\t4485635A4832D9DC57240F8EF3323042\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Very nice! Raven likes that you are making progress.\"\nmsgstr \"Foarte frumos! Corbului îi place că progresezi.\"\n\n#. Key:\t480718E34822FD682466E7B217249ED0\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_47.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_47.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Which is technically the same.\"\nmsgstr \"Ceea ce este tehnic la fel.\"\n\n#. Key:\t48B67F42417A2930A4D200B958FDFB58\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_38.Children(3).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_38.Children(3).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"I'm confused\"\nmsgstr \"Sunt derutat\"\n\n#. Key:\t49F0AC6A46EBF6C3148BC590CE56C297\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_10.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_10.Children(0).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Help\"\nmsgstr \"Ajutor\"\n\n#. Key:\t4CB1CE8A4AEC18FA175BA98F831D3C3C\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_59.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_59.Children(0).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Farewell\"\nmsgstr \"Rămas bun\"\n\n#. Key:\t4D514A7D4CC96E3E79F464A6C0BF0C6E\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_2.SpeechSequence(4).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_2.SpeechSequence(4).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"What??\"\nmsgstr \"Ce??\"\n\n#. Key:\t4F8198D64A210B3A41EED8AA6AE64401\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_50.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_50.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven will just sit here for a short time before venturing into the Ruin.\"\nmsgstr \"Corbul va sta doar aici pentru o scurtă perioadă de timp înainte de a se aventura în Ruină.\"\n\n#. Key:\t503CD5334EE86CFBEC2E7EA67F45ACD9\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"So you're meant to open this dusty little door with Raven, aren't you?\"\nmsgstr \"Deci trebuie să deschizi această ușă mică și prăfuită cu Corbul, nu-i așa?\"\n\n#. Key:\t512AEC2642B36D9DDF407EB447DF5A28\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_15.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_15.Children(1).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Let's have fun!\"\nmsgstr \"Să ne distrăm!\"\n\n#. Key:\t5142E71B48C2E993CC8026919A3FDBD6\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_87.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_87.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Er... okey, I was just asking.\"\nmsgstr \"Er... okey, I was just asking.\"\n\n#. Key:\t518038644F25D09C9DA7FF984C272B77\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_40.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_40.Children(1).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"That's stupid\"\nmsgstr \"Asta e o prostie\"\n\n#. Key:\t53B5A1AC40CCF1CFBC106BA2BD8000E0\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_60.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_60.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Farewell, Raven!\"\nmsgstr \"Adio, Corbule!\"\n\n#. Key:\t54C0F3A6493E6D0671D38DB16BD4BF51\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"I would like to know...\"\nmsgstr \"Aș vrea să știu...\"\n\n#. Key:\t55665725414633C111356D94939362FF\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_67.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_67.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Let's open that gate. Quick!\"\nmsgstr \"Să deschidem poarta respectivă. Rapid!\"\n\n#. Key:\t565D7DA644ADF0E536C2FC8F99B735A3\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_3.Children(2).Children.Text\n#. Key:\t934A23AD44787C735FCDE79A34657C90\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_32.Children(3).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_3.Children(2).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_32.Children(3).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Why is he here?\"\nmsgstr \"De ce este aici?\"\n\n#. Key:\t57BE04074884DB4CC54AC691E156F0FC\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_38.Children(2).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_38.Children(2).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Freedom\"\nmsgstr \"Libertate\"\n\n#. Key:\t5919EDBF4799413180AF569CB920E436\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_90.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_90.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"You can't live your life like in the old days any longer and that's why you're staying with your master, right?\"\nmsgstr \"Nu mai poți trăi viața ca pe vremuri și de aceea rămâi cu stăpânul tău, nu?\"\n\n#. Key:\t592D458F40571927D0BB549F3614420E\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_32.Children(5).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_32.Children(5).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"End of the World\"\nmsgstr \"Sfârșește lumea\"\n\n#. Key:\t596065A34760461993AC339C51D9E402\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_73.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_73.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"First you will need to find the Gem. Meanwhile, Raven must figure it out how to open the Gate with it.\"\nmsgstr \"Mai întâi va trebui să găsești Bijuteria. Între timp, Corbul trebuie să-și dea seama cum să deschidă Poarta cu ea.\"\n\n#. Key:\t599A90394B8AC7A26D20FEB355A873FB\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_98.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_98.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"What are you doing here?\"\nmsgstr \"Ce faci aici?\"\n\n#. Key:\t5A5D2F08427C4747F3EF529D6B73A21B\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Go on your search then! Unless you'd like to chat some more with Raven.\"\nmsgstr \"Continuă-ți căutarea atuncea! Dacă nu doriți să discuți cu Corbul.\"\n\n#. Key:\t5A63E364458C849C9B6FDD8491427051\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_8.SpeechSequence(5).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_8.SpeechSequence(5).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"But you could.\"\nmsgstr \"But you could.\"\n\n#. Key:\t5B07757F4CAAD674E09EBB835CEE230B\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_75.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_75.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"It must be somewhere close to the Arcade.\"\nmsgstr \"Trebuie să fie undeva aproape de Arcadă.\"\n\n#. Key:\t5B9CDB4340B5E65E59D3A18283A84CA5\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_64.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_64.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven knows some people that'd be glad with that.\"\nmsgstr \"Corbul cunoaște unii oameni care s-ar bucura cu asta.\"\n\n#. Key:\t5BA0645E49A62C0945FB64BDF689721F\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_112.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_112.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Is that where I will find your artefacts?\"\nmsgstr \"Acolo îți voi găsi artefactele?\"\n\n#. Key:\t5E70951F4E50B061FF2DA196F0207612\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_15.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_15.Children(0).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Save the world!\"\nmsgstr \"Salvează lumea!\"\n\n#. Key:\t5F810A7D417E5B02025F30B21FEA5F03\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_79.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_79.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Niiice!\"\nmsgstr \"Grooozav!\"\n\n#. Key:\t6441F8C2484FAA5219841C9D374F36C4\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_6.SpeechSequence(6).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_6.SpeechSequence(6).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"And now, even while we speak, their curse continues to spread.\"\nmsgstr \"Și acum, chiar în timp ce vorbim, blestemul lor continuă să se răspândească.\"\n\n#. Key:\t66A08695458FF9D46383F6A0AF609EFA\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_41.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_41.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"You are so hopeless...\"\nmsgstr \"Ești atât de fără speranță ...\"\n\n#. Key:\t67EEF3DB42BA2C954AD566B4F95EBDB6\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_6.SpeechSequence(5).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_6.SpeechSequence(5).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Until one day the spirits broke loose and formed Ruin.\"\nmsgstr \"Până într-o zi spiritele s-au dezlănțuit și au format Ruina.\"\n\n#. Key:\t68442CA14CECA9FB8A215EBEBC724F63\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Ask more from Raven if you like!\"\nmsgstr \"Cere mai multe de la Corb dacă dorești!\"\n\n#. Key:\t694D416244358BD7DBED04A82390A146\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_51.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_51.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"One more,... and the Gem will be completed!\"\nmsgstr \"Încă unul, ... și Bijuteria va fi finalizată!\"\n\n#. Key:\t6A463E0444754B73FE11988F07D5A58F\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_2.SpeechSequence(1).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_2.SpeechSequence(1).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"You just have to do it.\"\nmsgstr \"You just have to do it.\"\n\n#. Key:\t6A92F010409301669F7B83AD7901A469\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"A strange creature, yet a familiar aura! Tell me, my dear Wizard, what happened to Tabby?\"\nmsgstr \"O creatură ciudată, dar totuși o aură familiară! Spune-mi, scumpul meu Vrăjitor, ce s-a întâmplat cu Tabby?\"\n\n#. Key:\t6CC1259244D5FC82CA1C2EA314836741\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_1.SpeechSequence(1).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_1.SpeechSequence(1).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"They both accepted that there is a great threat in this realm.\"\nmsgstr \"Amândoi au acceptat că există o mare amenințare pe acest Tărâm.\"\n\n#. Key:\t6FB7AF774662247E2001F9AAF34FF134\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_111.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_111.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Somewhere beyond that Gate there's a Portal. It will take you into the heart of the Realm.\"\nmsgstr \"Undeva dincolo de poarta respectivă există un portal. Te va duce în inima Tărâmului.\"\n\n#. Key:\t70A0BA47476A909013EFC0A574815B61\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_23.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_23.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"The Master and Raven are seeking knowledge about the Ruined Realm.\"\nmsgstr \"Maestrul și Corbul caută cunoștințe despre Tărâmul Ruinat.\"\n\n#. Key:\t70ECE1B74BA0B02F2F0850937BF4FB02\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_3.Children(3).Children.Text\n#. Key:\tE9F5916345156A4E5F29AC886B49B8AD\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_32.Children(4).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_3.Children(3).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_32.Children(4).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"About Ruin\"\nmsgstr \"Despre Ruină\"\n\n#. Key:\t7311CA4B4D6B19C6C5C362AF522A9803\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_1.SpeechSequence(4).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_1.SpeechSequence(4).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Your master said he is done with that.\"\nmsgstr \"Stăpânul tău a spus că a terminat cu asta.\"\n\n#. Key:\t74B8E0B44D4590E9970F4B9D09D3C4F9\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_6.SpeechSequence(1).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_6.SpeechSequence(1).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Long ago it was called the Runic Realm.\"\nmsgstr \"Cu mult timp în urmă, se numea Tărâmul Runic.\"\n\n#. Key:\t76756B1C48E93E907CE32D83A2C56C3E\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_7.SpeechSequence(0).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_7.SpeechSequence(0).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven is really sorry but he can't help you anymore.\"\nmsgstr \"Corbului îi pare cu adevărat rău, dar nu te mai poate ajuta.\"\n\n#. Key:\t78C7CE5948D176704CA69289BEEBFBA7\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_44.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_44.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"And what about the Realm of the wizards? They did not go mad yet, did they?\"\nmsgstr \"Și cum rămâne cu tărâmul vrăjitorilor? Nu au înnebunit încă, nu?\"\n\n#. Key:\t7DFA4D494BD0536F925A94BBF7C71F36\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_66.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_66.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Focus on what you have to do and you will find the real you.\"\nmsgstr \"Concentrează-te pe ceea ce trebuie să faci și vei găsi adevăratul.\"\n\n#. Key:\t81F437694DEE3D32A0FC29B90688E8B9\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_38.Children(4).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_38.Children(4).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"This is stupid\"\nmsgstr \"Este o prostie\"\n\n#. Key:\t82F473A04D250E98AD186185EBE95C04\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_5.SpeechSequence(0).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_5.SpeechSequence(0).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven thinks freedom is such an empty word.\"\nmsgstr \"Corbul crede că libertatea este un cuvânt atât de gol.\"\n\n#. Key:\t8688802A4303C53640C7BFAAA40226EC\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Almost there!\"\nmsgstr \"Aproape acolo!\"\n\n#. Key:\t8728C02E46E7B681D0A792ACAFC3237D\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_28.Children(2).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_28.Children(2).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"He accepted his fate\"\nmsgstr \"He accepted his fate\"\n\n#. Key:\t8854653141FA36E731780F9111B82FAD\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_30.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_30.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"You are not listening to Raven's words!\"\nmsgstr \"Nu asculți cuvintele Corbului!\"\n\n#. Key:\t88FDA06B4A44ED1BF559D996E6AF7097\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_6.SpeechSequence(0).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_6.SpeechSequence(0).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Even so, Raven will tell you a bit.\"\nmsgstr \"Chiar și așa, Corbul vă va spune un pic.\"\n\n#. Key:\t8BA584404F2713EE39D74284F829C50A\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"You know what? Raven totally agrees with that!\"\nmsgstr \"Știi ce? Corbul este total de acord cu asta!\"\n\n#. Key:\t8C272FBE47796CF8101D07AAD033C24B\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_62.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_62.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"The later we met the more time the World survived, didn't it?\"\nmsgstr \"Cu cât ne-am întâlnit mai târziu, cu cât lumea a supraviețuit, nu?\"\n\n#. Key:\t8DD39A3D497411B348B883972CE6B442\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_6.SpeechSequence(7).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_6.SpeechSequence(7).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"At first, lands lose their colours, people go mad... and then, everything breaks into shards until solely hollowness remains...\"\nmsgstr \"La început, pământurile își pierd culorile, oamenii înnebunesc ... și apoi, totul se rupe în cioburi până când rămâne exclusiv lipsa de spațiu...\"\n\n#. Key:\t8E02961D428949EE8176639F6AE84DD9\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_107.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_107.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"If the end is near, there is no point in making long term plans.\"\nmsgstr \"Dacă sfârșitul este aproape, nu are rost să faceți planuri pe termen lung.\"\n\n#. Key:\t8EB8F2654B9C18135CBEB49D10485417\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_37.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_37.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"We all have a purpose in life.\"\nmsgstr \"Cu toții avem un scop în viață.\"\n\n#. Key:\t9131DE4C434AD9B22C7B1BAA588AF694\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_9.SpeechSequence(3).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_9.SpeechSequence(3).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Private business? All right! We might have different motivations, however working together could be fruitful.\"\nmsgstr \"Afaceri private? In regula! S-ar putea să avem motivații diferite, cu toate acestea colaborarea poate fi roditoare.\"\n\n#. Key:\t91947E4046F96E9330EA5A94C367E2C5\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Forget it, I'm on my way now.\"\nmsgstr \"Uită-l, acum sunt pe drum.\"\n\n#. Key:\t91BE2C7248B2BEBE1C376B989935E353\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"What else should Raven tell you?\"\nmsgstr \"Ce altceva ar trebui să vă spună Corbul?\"\n\n#. Key:\t929558D0465B0884C4E373A602CCE9E5\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_59.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_59.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Farewell compeer until you meet Raven again!\"\nmsgstr \"Adio tovarășe până când veți întâlni din nou pe Corb!\"\n\n#. Key:\t930942934A83107D86DB69A2C2EF11E0\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_117.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_117.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"The task is of high complexity.\"\nmsgstr \"Sarcina are o complexitate ridicată.\"\n\n#. Key:\t93AFC24842A793D2BF7B43A64B6972AF\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_32.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_32.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Is there anything else for Raven?\"\nmsgstr \"Mai este ceva pentru Corb?\"\n\n#. Key:\t9A9D5DA346251040AF73B7B100E1EBC9\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_35.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_35.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven used to like being a bird, but now he has no other choice. He must embrace what he became.\"\nmsgstr \"Corbului îi plăcea să fie o pasăre, dar acum nu mai are de ales. El trebuie să îmbrățișeze ceea ce a devenit.\"\n\n#. Key:\t9B558C3045D4501AEAF3DD8694E2198F\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_105.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_105.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"We'd rather have some fun before it's all over.\"\nmsgstr \"Mai bine am prefera să ne distrăm înainte să se termine.\"\n\n#. Key:\t9E598A384E301BCD345ABFB0C1312C12\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_78.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_78.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Krrr... Raven notices that you've found the Gem!\"\nmsgstr \"Krrr ... Corbul observă că ai găsit Bijuteria!\"\n\n#. Key:\t9FAD3A1A4E3EFE33C1CAB8BAAC8190D1\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_26.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_26.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Let Raven tell you something:\"\nmsgstr \"Lasă Corbul să-ți spună ceva:\"\n\n#. Key:\tA10F960549BD21AFAD4819BD5C74E651\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_2.SpeechSequence(5).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_2.SpeechSequence(5).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Nevermind. Raven is kidding.\"\nmsgstr \"Nu contează. Corbul glumește.\"\n\n#. Key:\tA4294A174F9EA54E0149839A84CE2B94\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_15.Children(2).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_15.Children(2).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Hopeless...\"\nmsgstr \"Fără speranță...\"\n\n#. Key:\tA59406E8411939F96004EAA9D5707E08\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_28.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_28.Children(1).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"What?\"\nmsgstr \"Ce?\"\n\n#. Key:\tA5993D8047CDD35BA31D318832EB9C66\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_32.Children(2).Children.Text\n#. Key:\tB7AE6BEC4CA905BDED5990BFF4D0C93D\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_3.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_3.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_32.Children(2).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"About wizards\"\nmsgstr \"Despre vrăjitori\"\n\n#. Key:\tA59A76814D8EAF5907CBC68AA63FE33F\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_2.SpeechSequence(3).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_2.SpeechSequence(3).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"How can I know that if you don't do it?\"\nmsgstr \"Cum pot ști asta dacă nu o faci?\"\n\n#. Key:\tA7C7D1EC45A072755BAAB099DB359290\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_55.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_55.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"They don't believe that Ruin can affect their World. They say that it has no effect.\"\nmsgstr \"Ei nu cred că Ruina le poate afecta Lumea. Ei spun că nu are niciun efect.\"\n\n#. Key:\tA7D99136490D40CB08BA66A72192D6C0\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_7.SpeechSequence(2).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_7.SpeechSequence(2).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Go now! Raven needs to think.\"\nmsgstr \"Mergi acum! Corbul trebuie să se gândească.\"\n\n#. Key:\tA80B626C41713C6E42E4DF8696FF842D\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_8.SpeechSequence(0).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_8.SpeechSequence(0).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"You were a bird once. Then you became something else.\"\nmsgstr \"Ai fost o pasăre odată. Atunci ai devenit altceva.\"\n\n#. Key:\tA8D429384EFE74E30720149A1C53ADE9\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_38.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_38.Children(0).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Don't know\"\nmsgstr \"Nu stiu\"\n\n#. Key:\tA9A73720489C122A81B84CBA262C329E\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_38.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_38.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven knows what his task is. Do you know yours?\"\nmsgstr \"Corbul știe care este sarcina lui. Îl cunoști pe al tău?\"\n\n#. Key:\tAB41A75C432BEBDC81D63282FCC15F98\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_5.SpeechSequence(2).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_5.SpeechSequence(2).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Got it? Free like a bird! Ha-ha-ha!\"\nmsgstr \"Ai înțeles? Liber ca o pasăre! Ha-ha-ha!\"\n\n#. Key:\tAC52327249DB335CBAB9EDA6A3F4769E\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_31.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_31.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven is doing this because this is what he is.\"\nmsgstr \"Corbul face asta pentru că acesta este ceea ce este el.\"\n\n#. Key:\tB2003CEE44335B30B9F85487521B7679\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_54.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_54.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Maybe.\"\nmsgstr \"Poate.\"\n\n#. Key:\tB31EEC6247CDEF73BB4E5B84E2B66575\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_9.SpeechSequence(2).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_9.SpeechSequence(2).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"That’s over now. This time it's for private business.\"\nmsgstr \"Asta s-a terminat acum. Acest timp este pentru afaceri private.\"\n\n#. Key:\tB3DD59C44422BA99C839FCAE63F05B9A\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_93.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_93.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"I want to be free again!\"\nmsgstr \"Vreau să fiu liber din nou!\"\n\n#. Key:\tB789219A48C2A835F2DA4CA24064E1D3\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_92.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_92.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"I would like to go home.\"\nmsgstr \"Aș dori să mă întorc acasă.\"\n\n#. Key:\tB7D4201F41E5F018EFD49EAF52E443A8\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_76.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_76.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"You still haven't found the Gem.\"\nmsgstr \"Încă nu ai găsit Bijuteria.\"\n\n#. Key:\tB7EC6E4F4EDC448FD264999938414F3C\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Let's talk about something else!\"\nmsgstr \"Hai sa vorbim despre altceva!\"\n\n#. Key:\tB8BF08674C9E2FD0515998B95A1EA7CF\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_7.SpeechSequence(1).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_7.SpeechSequence(1).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"If you can't fulfill your task, then maybe your master should look for a better servant.\"\nmsgstr \"Dacă nu îți poți îndeplini sarcina, atunci poate că stăpânul tău ar trebui să caute un servitor mai bun.\"\n\n#. Key:\tBD775EF74E334A4DEFA67BBF9034500E\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_84.Text\n#. Key:\tFA3FEF444FD2A3500FCCE98FAEAE923E\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_42.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_42.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_84.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Yes?\"\nmsgstr \"Da?\"\n\n#. Key:\tBE2B9D7A45C2D43FF4C0BAAA284CBB97\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"No thanks! I'm on my way now.\"\nmsgstr \"Nu mulțumesc! Acum sunt pe drum.\"\n\n#. Key:\tC04CC9334FC3C2522793C2B97CC165D8\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_108.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_108.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"The gate is open!\"\nmsgstr \"Poarta este deschisă!\"\n\n#. Key:\tC0F2E4744D724A3D6A0DEF914C294CE1\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_38.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_38.Children(1).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Go home\"\nmsgstr \"Du-te acasă\"\n\n#. Key:\tC10018654B64193BBFF439B54EF02FB1\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"So why not open the gate?\"\nmsgstr \"Atunci de ce să nu deschidem poarta?\"\n\n#. Key:\tC18E2FB345BE76B6F51C71A2B6453316\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_99.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_99.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"What can you tell me about the Ruined Realm?\"\nmsgstr \"Ce îmi puteți spune despre tărâmul ruinat?\"\n\n#. Key:\tC19082D247C23A21B632968FE6A644D1\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_8.SpeechSequence(3).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_8.SpeechSequence(3).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"You failed to see the meaning behind Raven's thoughts.\"\nmsgstr \"Nu ai reușit să vezi sensul din spatele gândurilor la Corb.\"\n\n#. Key:\tC2DC44084098DD604B757A8A47AAC4FE\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_58.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_58.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"We'll see.\"\nmsgstr \"Vom vedea.\"\n\n#. Key:\tC53F5E0F46BBE7A1FD00EABD6E14848D\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_33.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_33.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Maybe you are wiser than Raven, but that's just a thought, little spirit.\"\nmsgstr \"Poate că ești mai înțelept decât Corbul, dar acesta este doar un gând, un spirit mic.\"\n\n#. Key:\tC78588B64D12FFBE97C47AB7C046C14E\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_1.SpeechSequence(5).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_1.SpeechSequence(5).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven doesn't believe it's true.\"\nmsgstr \"Corbul nu crede că este adevărat.\"\n\n#. Key:\tC7F7F71F4FE0D19BDF86188BEFDDEEB1\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_5.SpeechSequence(1).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_5.SpeechSequence(1).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Just look at Raven! He's free like a bird.\"\nmsgstr \"Uită-te la Corb! E liber ca o pasăre.\"\n\n#. Key:\tC82BE6E448D7C98D361CA1890FEE3B2C\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_9.SpeechSequence(6).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_9.SpeechSequence(6).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"I’m in.\"\nmsgstr \"Mă bag.\"\n\n#. Key:\tCD1A68EF460B0C63C95340AC2076EBAF\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven notices that the gem is just as dull as before. Why did you return then?\"\nmsgstr \"Corbul observă că bijuteria este la fel de plictisitoare ca înainte. De ce te-ai întors atunci?\"\n\n#. Key:\tD3C84C884903F7FB53695AAE253C7982\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_40.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_40.Children(0).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Agree\"\nmsgstr \"De Acord\"\n\n#. Key:\tD438ABB348A399ACB18DFD8F320CC7BB\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_57.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_57.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"And what's the truth?\"\nmsgstr \"Și care este adevărul?\"\n\n#. Key:\tD5DF32814FA17D7ED28BF0A91027A6E8\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_110.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_110.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Finally! From now on you won't need Raven anymore.\"\nmsgstr \"Într-un final! De acum nu va mai avea nevoie de Corb.\"\n\n#. Key:\tD6A649B2453BCBAD95A16FA481664133\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_49.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_49.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Find the other Chargers and return to Raven when you are done.\"\nmsgstr \"Găsește celelalte încărcătoare și revin-o la Corb când ai terminat.\"\n\n#. Key:\tD9959CF1439812F5615A38B9369F6E16\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_71.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_71.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven notices that you already have the Gem.\"\nmsgstr \"Corbul observă că ai deja Bijuteria.\"\n\n#. Key:\tD9A4F3D54EF460C09B2A6C9B8EB87D7C\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_32.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_32.Children(1).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"About my purpose...\"\nmsgstr \"Despre scopul meu ...\"\n\n#. Key:\tD9C6F8C14BC9C0BD83715E96DE5B7161\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_28.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_28.Children(0).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"He is a volunteer\"\nmsgstr \"El este un voluntar\"\n\n#. Key:\tDC7CA6DF4D684A7C2DBA739F404ABC36\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_94.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_94.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"I don't know what to do. I can't remember anything from my previous life.\"\nmsgstr \"Nu știu ce să fac. Nu-mi amintesc nimic din viața mea anterioară.\"\n\n#. Key:\tDD8E05E541C32F05357D888FB6963FF0\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_114.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_114.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"All right, I go then.\"\nmsgstr \"Bine, merg apoi.\"\n\n#. Key:\tDE3A0B8047C9980B6DED0BA39C777539\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_28.Children(3).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_28.Children(3).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Not interested\"\nmsgstr \"Nu sunt interesat\"\n\n#. Key:\tDF86F9C84CF207616E931098F3C833D3\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"To activate the locking mechanism we need an infused Lock Gem.\"\nmsgstr \"Pentru a activa mecanismul de blocare avem nevoie de o Bijutier de Lacăt înfuzată.\"\n\n#. Key:\tE0105C1845AF9211960E869AB234ED9A\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_89.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_89.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"So you are obeying because... that's the only thing that you can do?\"\nmsgstr \"Deci te supui pentru că ... acesta este singurul lucru pe care îl poți face?\"\n\n#. Key:\tE17598BB49D7E4083AD4AEA2DDFE293D\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_106.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_106.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"It would make sense to try to save the world, wouldn't it?\"\nmsgstr \"Ar avea sens să încerci să salvezi lumea, nu-i așa?\"\n\n#. Key:\tE1CFA5A44F4EF59527528DB6018ACF33\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_8.SpeechSequence(6).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_8.SpeechSequence(6).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven doesn't care about what he could do. Raven cares about what he does.\"\nmsgstr \"Corbului nu-i pasă de ce ar putea face. Corbului îi pasă de ceea ce face.\"\n\n#. Key:\tE6FA584E454BC3943C927EADAEBA88C4\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_6.SpeechSequence(8).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_6.SpeechSequence(8).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"That's not too reassuring...\"\nmsgstr \"Nu este prea liniștitor ...\"\n\n#. Key:\tE9D9EC1F450276CF11B259978062AB7E\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_96.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_96.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"We shouldn't waste any more time on this.\"\nmsgstr \"Nu trebuie să pierdem mai mult timp în acest sens.\"\n\n#. Key:\tEC19AF0E4F2F4B488373FFBEDC272321\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_56.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_56.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Except for a few paranoid ones, like your master.\"\nmsgstr \"Cu excepția câtorva paranoici, cum ar fi stăpânul tău.\"\n\n#. Key:\tEFC8B9984D9F4A9ACC9AE580E271E810\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_39.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_39.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Searching for a way to open this gate with the help of a talking Ball is so much fun!\"\nmsgstr \"Căutarea unui mod de a deschide această poartă cu ajutorul unei mingi vorbitoare este atât de distractiv!\"\n\n#. Key:\tEFCE20A646FA62188BE7EB85D6708843\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_115.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_115.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven will venture deeper into the Ruined Realm!\"\nmsgstr \"Corbul se va aventura mai adânc pe Tărâmul Ruinat!\"\n\n#. Key:\tF0B00A30413914D09CA4488578B2FD7C\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_24.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_24.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven agrees.\"\nmsgstr \"Corbul este de acord.\"\n\n#. Key:\tF40AD31D4177DCB7BB138C9C139FB1A1\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_61.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_61.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"I hope that won't be too soon...\"\nmsgstr \"Sper că nu va fi prea curând ...\"\n\n#. Key:\tF4F8CBCD421083EDBF626AA47DEF4B50\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_88.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_88.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Do you mean that you are serving your wizard by your own will?\"\nmsgstr \"Vrei să spui că îți slujești vrăjitorul după propria voință?\"\n\n#. Key:\tF5A7836549DF56B89620A386E7CCF708\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_48.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_48.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"But there is still so much left to do...\"\nmsgstr \"Dar mai rămân atât de multe de făcut ...\"\n\n#. Key:\tF8361ECC401E740DEBF87FAE2A419EC8\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_32.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_32.Children(0).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven Servant?\"\nmsgstr \"Servitorul corbului?\"\n\n#. Key:\tFA5F957341772B0C4AFA33B1311CF7B4\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_69.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_69.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Except if we meet in the Afterworld.\"\nmsgstr \"Cu excepția cazului în care ne întâlnim în lumea de Apoi.\"\n\n#. Key:\tFA94A8EF4F8BF5EA422D27A9A205D866\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_3.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_3.Children(0).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven servant?\"\nmsgstr \"Servitorul corbului?\"\n\n#. Key:\tFC0798A648BFC0E9BA70D6B20A46F447\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_1.SpeechSequence(2).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_1.SpeechSequence(2).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Your master seeks to stop it no matter the price he has to pay.\"\nmsgstr \"Stăpânul tău încearcă să îl oprească indiferent de prețul pe care trebuie să îl plătească.\"\n\n#. Key:\tFCE7049641D2A70FC6B9E5B174919A64\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_9.SpeechSequence(0).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_9.SpeechSequence(0).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Tabby has retired. What did you come for?\"\nmsgstr \"Tabby s-a retras. Pentru ce ai venit?\"\n\n#. Key:\tFD68B18A435050A137D8F0948F24E2DC\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Why are we messing with this door if the World is about to end?\"\nmsgstr \"De ce ne facem de lucru cu această ușă dacă Lumea urmează să se termine?\"\n\n#. Key:\tFF3D9FCF4A840A8155A8D7AD9CC22F2D\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Obey? Raven doesn't obey.\"\nmsgstr \"Supunere? Corbul nu se supune.\"\n\n#. Key:\tFFB203D94B0A5C22BA29B68A1A8A740F\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_9.SpeechSequence(8).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_9.SpeechSequence(8).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Farewell then.\"\nmsgstr \"Adio atunci.\"\n\n#. Key:\t0C459FB64505D02011822A9EDFA8FCA4\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/AGStatue.AGStatue:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/AGStatue.AGStatue:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_AGStatue\"\nmsgid \"'We are the elite of the Runic Realm. Our wisdom is great, our magic is strong.'\"\nmsgstr \"„Suntem elita Tărâmului Runic. Înțelepciunea noastră este mare, magia noastră este puternică. '\"\n\n#. Key:\t7DB580C64E9B33FD525DDF986BD5E4A4\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/AGStatue.AGStatue:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/AGStatue.AGStatue:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_AGStatue\"\nmsgid \"Looks like he was wrong...\"\nmsgstr \"Se pare că a greșit ...\"\n\n#. Key:\tAFBD86084D8E6EBDF240998FA98D184D\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/AGStatue.AGStatue:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/AGStatue.AGStatue:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_AGStatue\"\nmsgid \"'We are Ceruleans! We do not escape!'\"\nmsgstr \"„Suntem Ceruleans! Nu scăpăm! '\"\n\n#. Key:\tC2CC8EE94954A8DC42222FBB28A7656E\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/AGStatue.AGStatue:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/AGStatue.AGStatue:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_AGStatue\"\nmsgid \"'Citizens of Cerulean! Do not join the poor of Grey Gate!'\"\nmsgstr \"„Cetățeni din Cerulean! Nu vă alăturați săracilor de la Poarta Gri! '\"\n\n#. Key:\tD909E4A34387B448378464BDE8292B4D\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/AGStatue.AGStatue:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/AGStatue.AGStatue:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_AGStatue\"\nmsgid \"'Ruin can’t harm us!'\"\nmsgstr \"„Ruina nu ne poate face rău!”\"\n\n#. Key:\t3CE243AA4AFB12B37239608C66537764\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/BeforeBoss.BeforeBoss:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/BeforeBoss.BeforeBoss:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_BeforeBoss\"\nmsgid \"Maybe you should talk to the gnome or the Keeper.\"\nmsgstr \"Poate ar trebui să vorbești cu Piticul sau cu Portarul.\"\n\n#. Key:\t4F35F4834FBCC04C218A879123EF8706\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/BeforeBoss.BeforeBoss:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/BeforeBoss.BeforeBoss:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_BeforeBoss\"\nmsgid \"Using the portals here one could get into any part of the World in no time.\"\nmsgstr \"Folosind portalurile de aici, poți ajunge în orice parte a lumii în cel mai scurt timp.\"\n\n#. Key:\t62EDCB724DAC5317C72B99AEB9904F4E\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/BeforeBoss.BeforeBoss:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/BeforeBoss.BeforeBoss:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_BeforeBoss\"\nmsgid \"This place was the base of the formal Ruined Realm.\"\nmsgstr \"Acest loc a fost baza vechiului Tărâm Ruinat.\"\n\n#. Key:\tCB8B47F74583A48529A353B97C4909B9\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/BeforeBoss.BeforeBoss:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/BeforeBoss.BeforeBoss:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_BeforeBoss\"\nmsgid \"I hope at least some of the portals still work.\"\nmsgstr \"Sper că cel puțin unele dintre portaluri funcționează în continuare.\"\n\n#. Key:\t2A9CE8714E7E1ABC9365E5A1E2CE2EC8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/BossArmourWrath.BossArmourWrath:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Chapter2/BossArmourWrath.BossArmourWrath:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_BossArmourWrath\"\nmsgid \"Keep away from my artefact little thief or I will crush you!\"\nmsgstr \"Ține-te departe de artefactul meu micule hoț sau te voi zdrobi!\"\n\n#. Key:\t3F79029C410F4CC3B41548A26A7D69EB\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/BossArmourWrath.BossArmourWrath:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Chapter2/BossArmourWrath.BossArmourWrath:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_BossArmourWrath\"\nmsgid \"Listen, I really need that. What if I give you something instead?\"\nmsgstr \"Ascultă, chiar am nevoie de asta. Ce se întâmplă dacă îți dau ceva în schimb?\"\n\n#. Key:\t451F1E844E29E674899BD3BEFBC17380\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/BossArmourWrath.BossArmourWrath:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter2/BossArmourWrath.BossArmourWrath:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_BossArmourWrath\"\nmsgid \"I’m here for the artefact... could you give it to me?\"\nmsgstr \"Sunt aici pentru artefactul ... mi-l puteți da?\"\n\n#. Key:\tAC11C22040909F7F4DD1518AD5C14AFA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/BossArmourWrath.BossArmourWrath:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Chapter2/BossArmourWrath.BossArmourWrath:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_BossArmourWrath\"\nmsgid \"That is mine!\"\nmsgstr \"Asta e a mea!\"\n\n#. Key:\tD30E184A406B5B1EFB87F3845CE82664\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/BossArmourWrath.BossArmourWrath:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter2/BossArmourWrath.BossArmourWrath:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_BossArmourWrath\"\nmsgid \"Have you come to worship my perfection?\"\nmsgstr \"Ai venit să te închini desăvârșirii mele?\"\n\n#. Key:\tF626219F434EECD05727BC9FAB5CEB76\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/BossArmourWrath.BossArmourWrath:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Chapter2/BossArmourWrath.BossArmourWrath:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_BossArmourWrath\"\nmsgid \"Damn you and your perfection!\"\nmsgstr \"La naiba cu tine și perfecțiunea ta!\"\n\n#. Key:\t2892C4AB4DACCAF48565619948DCA122\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/BossDwarvenStatue.BossDwarvenStatue:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter2/BossDwarvenStatue.BossDwarvenStatue:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_BossDwarvenStatue\"\nmsgid \"I am all right! I am still keeping it back!\"\nmsgstr \"Sunt in regulă! Încă o țin înapoi!\"\n\n#. Key:\t378D26B144B4B17F23F788B56F714118\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/BossDwarvenStatue.BossDwarvenStatue:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Chapter2/BossDwarvenStatue.BossDwarvenStatue:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_BossDwarvenStatue\"\nmsgid \"I am looking for an artefact...\"\nmsgstr \"Caut un artefact ...\"\n\n#. Key:\t3956257F405EC80CE4547FBE57C53A11\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/BossDwarvenStatue.BossDwarvenStatue:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Chapter2/BossDwarvenStatue.BossDwarvenStatue:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_BossDwarvenStatue\"\nmsgid \"Do you...\"\nmsgstr \"Tu...\"\n\n#. Key:\t946CFCCE4CA505C7C4039A9FF196A35C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/BossDwarvenStatue.BossDwarvenStatue:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter2/BossDwarvenStatue.BossDwarvenStatue:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_BossDwarvenStatue\"\nmsgid \"Have the sculptors sent you?\"\nmsgstr \"Te-a trimis sculptorii?\"\n\n#. Key:\tA30FB80548251020E4AD859A928AB6B5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/BossDwarvenStatue.BossDwarvenStatue:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Chapter2/BossDwarvenStatue.BossDwarvenStatue:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_BossDwarvenStatue\"\nmsgid \"Go away! I hold it back!\"\nmsgstr \"Pleacă de aici! O s-o rețin!\"\n\n#. Key:\tAC5220964331387202C55584104246C2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/BossDwarvenStatue.BossDwarvenStatue:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Chapter2/BossDwarvenStatue.BossDwarvenStatue:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_BossDwarvenStatue\"\nmsgid \"I have a bad feeling about this...\"\nmsgstr \"Am o senzație proastă despre asta ...\"\n\n#. Key:\tE05C384043C6F8407BDA2D97A1D64F96\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/BossDwarvenStatue.BossDwarvenStatue:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Chapter2/BossDwarvenStatue.BossDwarvenStatue:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_BossDwarvenStatue\"\nmsgid \"He has one of the artefacts. You need to get it somehow.\"\nmsgstr \"Are unul dintre artefacte. Trebuie să-l obți cumva.\"\n\n#. Key:\tF9B8F4E9413785B5F59DD88CBF8D56CC\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/BossDwarvenStatue.BossDwarvenStatue:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Chapter2/BossDwarvenStatue.BossDwarvenStatue:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_BossDwarvenStatue\"\nmsgid \"Don’t come any closer! I’m still fine!\"\nmsgstr \"Nu te apropia! Încă sunt bine!\"\n\n#. Key:\t49D7B5DA484C712573AE84B3A2609541\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/BossFallenDruid.BossFallenDruid:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Chapter2/BossFallenDruid.BossFallenDruid:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_BossFallenDruid\"\nmsgid \"You will never lay your hand on anything in this place!\"\nmsgstr \"Nu vei pune niciodată mâna pe nimica din acest loc!\"\n\n#. Key:\t9642DD9241E67544571A5EABA9EBC42B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/BossFallenDruid.BossFallenDruid:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter2/BossFallenDruid.BossFallenDruid:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_BossFallenDruid\"\nmsgid \"Actually I’m about to leave but I need the artefact first.\"\nmsgstr \"De fapt, sunt pe cale să plec, dar mai întâi am nevoie de artefact.\"\n\n#. Key:\t9A2BE08D4010C4D2425F96BA17A60936\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/BossFallenDruid.BossFallenDruid:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Chapter2/BossFallenDruid.BossFallenDruid:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_BossFallenDruid\"\nmsgid \"I shall purge my forest from your kind! To hell with you creature!\"\nmsgstr \"Îmi voi curățată pădurea de neamul tău! La dracu cu tine creatură!\"\n\n#. Key:\tFC4A1C9748C31BD2AA2E4F93E5D56AF8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/BossFallenDruid.BossFallenDruid:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter2/BossFallenDruid.BossFallenDruid:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_BossFallenDruid\"\nmsgid \"Stay away from my sacred forests creature of Ruin!\"\nmsgstr \"Stai departe de pădurile mele sacre creatură de Ruină!\"\n\n#. Key:\t3F4302BF46D1F9EA241446A796CE6AA5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Fishy.C3Fishy:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter3/C3Fishy.C3Fishy:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_C3Fishy\"\nmsgid \"Fishy will miss home.\"\nmsgstr \"Peștelui îi va lipsa casa.\"\n\n#. Key:\t52063C724F858E16B1E9B482E064B3FC\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Fishy.C3Fishy:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/Chapter3/C3Fishy.C3Fishy:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_C3Fishy\"\nmsgid \"Raven will try to take us into the Human Realm.\"\nmsgstr \"Corbul va încerca să ne ducă pe Tărâmul Uman.\"\n\n#. Key:\tBC79FC4E44CCD0BE44BAAAA5ED304C9D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3GateKeeper.C3GateKeeper:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Chapter3/C3GateKeeper.C3GateKeeper:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_C3GateKeeper\"\nmsgid \"I hope you will find us Worthy.\"\nmsgstr \"Sper că ne veți găsi demni.\"\n\n#. Key:\tDD8DEA6B4E1D6AABEB6B0483614A41BB\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3GateKeeper.C3GateKeeper:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter3/C3GateKeeper.C3GateKeeper:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_C3GateKeeper\"\nmsgid \"Welcome, my young Lord!\"\nmsgstr \"Bine ați venit, tânărul meu Domn!\"\n\n#. Key:\tFCC28D1C4A19B1964301B388625A722F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3GateKeeper.C3GateKeeper:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter3/C3GateKeeper.C3GateKeeper:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_C3GateKeeper\"\nmsgid \"I heard this time you shall open a Gate for us.\"\nmsgstr \"Am auzit că de data asta vei deschide o Poartă pentru noi.\"\n\n#. Key:\t1F96C2364594513AB8DF00A8C11ADB2C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Gnory.C3Gnory:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Chapter3/C3Gnory.C3Gnory:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_C3Gnory\"\nmsgid \"I don’t want anything bad for business in the new Realm.\"\nmsgstr \"Nu vreau nimic rău pentru afaceri în noul Tărâm.\"\n\n#. Key:\t24FA4B6840C3EEF0A9D418AED7C900A5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Gnory.C3Gnory:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/Chapter3/C3Gnory.C3Gnory:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_C3Gnory\"\nmsgid \"Eh, you again?\"\nmsgstr \"Eh, tu din nou?\"\n\n#. Key:\t5CA8478D46ED1ADF6F0B5E82F1035ADE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Gnory.C3Gnory:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter3/C3Gnory.C3Gnory:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_C3Gnory\"\nmsgid \"A whole new World awaits for me and my shop.\"\nmsgstr \"O lume cu totul nouă mă așteaptă pentru mine și magazinul meu.\"\n\n#. Key:\tA406AFAD47000D9338C978B2EB16A86F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Gnory.C3Gnory:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Chapter3/C3Gnory.C3Gnory:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_C3Gnory\"\nmsgid \"If you can arrange it I would be more happy if we could leave Lory here.\"\nmsgstr \"Dacă poți aranja, aș fi mult mai fericit dacă l-am putea lăsa aici pe Lory.\"\n\n#. Key:\tBA4D0C244931E6431FA17CA2257BDDE1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Gnory.C3Gnory:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter3/C3Gnory.C3Gnory:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_C3Gnory\"\nmsgid \"What a new opportunity! I don’t care about dwarves anymore.\"\nmsgstr \"Ce oportunitate nouă! Nu-mi mai pasă de pitici.\"\n\n#. Key:\t071AC5EE4AC65F5BE3CB61B64DE9E7FE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3GolemMaker.C3GolemMaker:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter3/C3GolemMaker.C3GolemMaker:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_C3GolemMaker\"\nmsgid \"I have to admit Ruin will win in the end.\"\nmsgstr \"Trebuie să recunosc că Ruina va câștiga până la urmă.\"\n\n#. Key:\t18398E3A4C6E72AAE25F24A14596ECD8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3GolemMaker.C3GolemMaker:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter3/C3GolemMaker.C3GolemMaker:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_C3GolemMaker\"\nmsgid \"I fought Ruin for hundreds of years.\"\nmsgstr \"Am luptat cu Ruina timp de sute de ani.\"\n\n#. Key:\t7800D3B64054BCE4A89E8E8E6265776B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3GolemMaker.C3GolemMaker:DlgNode_Speech_117.Text\n#: /Game/SO/Dialogues/Chapter3/C3GolemMaker.C3GolemMaker:DlgNode_Speech_117.Text\nmsgctxt \"Dialogue_C3GolemMaker\"\nmsgid \"I have a bad feeling about this all...\"\nmsgstr \"Am o senzație proastă despre toate astea ...\"\n\n#. Key:\t334B64FA460A74FD99B4F3B9E4BE9E5A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3KoboldChef.C3KoboldChef:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter3/C3KoboldChef.C3KoboldChef:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_C3KoboldChef\"\nmsgid \"So it will be ready anytime now.\"\nmsgstr \"Deci va fi gata oricând.\"\n\n#. Key:\t5B8874F14160F55182A93EBCF5680173\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3KoboldChef.C3KoboldChef:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter3/C3KoboldChef.C3KoboldChef:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_C3KoboldChef\"\nmsgid \"According to the recipe I need to swirl the ingredients until the end of the World.\"\nmsgstr \"Conform rețetei trebuie să învârt ingredientele până la sfârșitul Lumii.\"\n\n#. Key:\t7DB6ED344E211B7A028C27BFB72750B1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3KoboldChef.C3KoboldChef:DlgNode_Speech_33.Text\n#: /Game/SO/Dialogues/Chapter3/C3KoboldChef.C3KoboldChef:DlgNode_Speech_33.Text\nmsgctxt \"Dialogue_C3KoboldChef\"\nmsgid \"This is a special soup.\"\nmsgstr \"Aceasta este o supă specială.\"\n\n#. Key:\t7D583DB14783DCF7EEE294920F9A1D61\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Lory.C3Lory:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Chapter3/C3Lory.C3Lory:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_C3Lory\"\nmsgid \"Without paying a single gold coin. How sad.\"\nmsgstr \"Fără să plătească o singură monedă de aur. Ce trist.\"\n\n#. Key:\t8A26C9B24B810A94FED159B0D69D70D6\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Lory.C3Lory:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter3/C3Lory.C3Lory:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_C3Lory\"\nmsgid \"Hi, my dear Ball!\"\nmsgstr \"Bună, draga mea Minge!\"\n\n#. Key:\t8CF637DC4D66B9BFBE098DA3EA434F27\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Lory.C3Lory:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/Chapter3/C3Lory.C3Lory:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_C3Lory\"\nmsgid \"Unfortunately I can't give you anything in return.\"\nmsgstr \"Din păcate nu îți pot oferi nimica în schimb.\"\n\n#. Key:\t90A13FAC4AA90E98DBEFFA9BB8DEDE80\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Lory.C3Lory:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Chapter3/C3Lory.C3Lory:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_C3Lory\"\nmsgid \"Oh, thank you! Books always matter.\"\nmsgstr \"Oh, mulțumesc! Cărțile contează întotdeauna.\"\n\n#. Key:\t9C6E843645F86F1E39E6458952C7F283\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Lory.C3Lory:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Chapter3/C3Lory.C3Lory:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_C3Lory\"\nmsgid \"I hope I can open a new shop in the Human Realm.\"\nmsgstr \"Sper să pot deschide un magazin nou pe Tărâmul Uman.\"\n\n#. Key:\tAE354F2C458C144C2825028174F91CCE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Lory.C3Lory:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Chapter3/C3Lory.C3Lory:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_C3Lory\"\nmsgid \"I don't know if it still matters but I have these books for you.\"\nmsgstr \"Nu știu dacă mai contează, dar am aceste cărți pentru tine.\"\n\n#. Key:\tB5BCB95E43DB3854273F6AAA4067FC55\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Lory.C3Lory:DlgNode_Speech_42.Text\n#: /Game/SO/Dialogues/Chapter3/C3Lory.C3Lory:DlgNode_Speech_42.Text\nmsgctxt \"Dialogue_C3Lory\"\nmsgid \"Unfortunately I have nothing at the store right now. Ha-ha...\"\nmsgstr \"Din păcate, acum nu am nimic la magazin. Ha-ha ...\"\n\n#. Key:\tC0E84ACD40CB002E0C30A289E0554EE9\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Lory.C3Lory:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/Chapter3/C3Lory.C3Lory:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_C3Lory\"\nmsgid \"No problem.\"\nmsgstr \"Nici o problemă.\"\n\n#. Key:\tFEFF93C84CC75D277EC221AD22338A75\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Lory.C3Lory:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter3/C3Lory.C3Lory:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_C3Lory\"\nmsgid \"Ruin took all my wares.\"\nmsgstr \"Ruina mi-a luat toate lucrările.\"\n\n#. Key:\t090F12534A0096B8D4D7D9A5CDC9B3B5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_25.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_25.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Well I guess you don’t have many customer.\"\nmsgstr \"Ei bine, cred că nu ai mulți clienți.\"\n\n#. Key:\t10A1CF314EC02954FF38F1989C61DEE9\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"That’s only one man! I need three!\"\nmsgstr \"Acesta este doar unul! Am nevoie de trei!\"\n\n#. Key:\t127DE2E049C91112F814C69348954F99\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_7.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_7.Children(1).Children.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Buy name\"\nmsgstr \"Cumpără nume\"\n\n#. Key:\t1AF2DDE74542524EEF19CA9567CFBDAF\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_58.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_58.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"{name}? It still sounds a bit weird, but I think I might like it.\"\nmsgstr \"{name}? Sună încă un pic ciudat, dar cred că mi-ar plăcea.\"\n\n#. Key:\t1C411E31405F157B2465229ECE66F4E0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_31.Children(2).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_31.Children(2).Children.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Wanderer\"\nmsgstr \"Hoinar\"\n\n#. Key:\t1ED747BD43E40D4096809696951517EE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"A special offer for ya! Give me three Blue Gems and I’ll give ya the key!\"\nmsgstr \"O ofertă specială pentru tine! Dă-mi trei Gemuri Albastre și îți voi da cheia!\"\n\n#. Key:\t20B146B94D2E2FCE5E0C48BC64F7A1D6\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_19.Text\n#. Key:\t41E21D044B53E16C1BA8D7B720D84B50\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_36.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_36.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Sure man!\"\nmsgstr \"Desigur!\"\n\n#. Key:\t2BDF52EF43CA5FBB145EC1BA0014FC27\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_7.Children(3).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_7.Children(3).Children.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Who are you?\"\nmsgstr \"Cine ești tu?\"\n\n#. Key:\t2DF772F14AAA9780F4D9E397DE723665\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_32.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_32.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Fearsome! At least for what you will destroy.\"\nmsgstr \"Înfricoșător! Cel puțin pentru ceea ce vei distruge.\"\n\n#. Key:\t312F26294ECE4F618D88BE84DE7A2F9A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_31.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_31.Children(1).Children.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Destroyer\"\nmsgstr \"Distrugătorul\"\n\n#. Key:\t328C9911427AA19B40B297ACC9D16447\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_31.Children(3).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_31.Children(3).Children.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Don't buy\"\nmsgstr \"Nu cumpăra\"\n\n#. Key:\t32D3F53746DD2801BC1B04AF1C1753DD\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Don’t turn around I’m talking to ya big guy! Down here on the wood!\"\nmsgstr \"Nu mă întorc, vorbesc cu tine tipule mare! Aici, pe lemn!\"\n\n#. Key:\t576A3CE049331518C8D1F196E6CC382C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Back on topic: will ya buy something?\"\nmsgstr \"Înapoi la subiect: vei cumpăra ceva?\"\n\n#. Key:\t5C1E07DF4B2D135102D6B09D3A04A726\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"C’mon man! Don’t just stand there tell me what ya want!\"\nmsgstr \"Omule! Nu doar sta acolo, spune-mi ce vrei!\"\n\n#. Key:\t62AA5DD54A8447F7A277B194B05FB74D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_23.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_23.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"What’s wrong with ya man?\"\nmsgstr \"Ce-i cu tine, omule?\"\n\n#. Key:\t6E13F5544C66EDB0CFE764A0F52269E1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_27.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_27.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"You know transporting breadcrumbs, marching onto various directions, the usual things.\"\nmsgstr \"Știi transportul pesmetul, mersul pe diverse direcții, lucrurile obișnuite.\"\n\n#. Key:\t6F3C17894E694FC6215871B167087908\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_24.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_24.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"I’m Merch Ant doin’ Microtransactions. I’ve just told ya.\"\nmsgstr \"Sunt un Comerciant Furnică care face Microtransacții. Tocmai ți-am spus.\"\n\n#. Key:\t7169B2FA40F5F5F328D2A6B9D53D58C8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_7.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_7.Children(0).Children.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Trade\"\nmsgstr \"Târguiește\"\n\n#. Key:\t7B41C105431C54F2FDDEA6AA9A0E1C1A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Er... so who are you and what are you doing here?\"\nmsgstr \"Deci ... cine ești și ce faci aici?\"\n\n#. Key:\t8718A8F54D5722F666D83F8067476622\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"There is an iron door which blocks the path to the tower. Do you have something which opens it?\"\nmsgstr \"Există o ușă de fier care blochează calea către turn. Ai ceva care o deschide?\"\n\n#. Key:\t889B39EC4BC170A2BF493380947116A7\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Sure man! Microtransactions always work!\"\nmsgstr \"Desigur! Microtransacțiile funcționează întotdeauna!\"\n\n#. Key:\t9157AE9644A4A3B2C97F7482932160D2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"No man, we agreed on three!\"\nmsgstr \"Nu omule, am fost de acord la trei!\"\n\n#. Key:\t9283F6B1447C6992FE355289F3337472\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_7.Children(2).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_7.Children(2).Children.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Gate\"\nmsgstr \"Poartă\"\n\n#. Key:\t99C44AA849A384C7941D3DAE1D6A3EFF\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Here is your Gem!\"\nmsgstr \"Iată Bijuteria ta!\"\n\n#. Key:\t9CA7941F42ABFAE5660895AF886CD62C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_31.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_31.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Sure man! I have some really cool ones for sale!\"\nmsgstr \"Desigur! Am unele cu adevărat grozave de vânzare!\"\n\n#. Key:\tA3C6B03E404B1C039EF1C98C8E28AE22\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Show me what you've got for sale!\"\nmsgstr \"Arată-mi ce ai de vânzare!\"\n\n#. Key:\tABE279924E0641DA18E9708F35F4500A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_29.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_29.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"I’ve got to go.\"\nmsgstr \"Trebuie să plec.\"\n\n#. Key:\tAF1FECDB402777D850B819B934DF851D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_34.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_34.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Ah, never mind, here you go!\"\nmsgstr \"Ah, nu contează, iată!\"\n\n#. Key:\tB19FA067432CE0273A3652AA9A32F2DF\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Don’t be surprised!\"\nmsgstr \"Nu fi surprins!\"\n\n#. Key:\tB5F8E17E4712A37EF1C227AA7E99DBC8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Aren’t two Gems enough for you?\"\nmsgstr \"Nu sunt suficiente două bijuterii pentru tine?\"\n\n#. Key:\tBC5DEE9E4D39238451D1A2B9F8B20815\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_26.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_26.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Okey, okey! I have to admit I also do some regular ant work from time to time.\"\nmsgstr \"Okey, okey! Trebuie să recunosc că fac și o muncă regulată de furnici din când în când.\"\n\n#. Key:\tBD7096344553E098E4A29787E1386B4A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Are you sure the key works?\"\nmsgstr \"Ești sigur că funcționează cheia?\"\n\n#. Key:\tC6A384624B53D808D62CB885A6573150\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Was nice to deal with ya!\"\nmsgstr \"A fost frumos să am de a face cu tine!\"\n\n#. Key:\tC737154043396F726CF6B2814991B38D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_35.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_35.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"I've changed my mind. I'm fine with my current name.\"\nmsgstr \"M-am răzgândit. Sunt bine cu numele meu actual.\"\n\n#. Key:\tC94F33504E68364DE1BAA48FC0CA85E5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_7.Children(5).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_7.Children(5).Children.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Leave\"\nmsgstr \"Pleacă\"\n\n#. Key:\tCDA5A0164F5FDD87D0F4C0B10A5ED5DA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"I did my part. Give me the key!\"\nmsgstr \"Mi-am făcut partea. Dă-mi cheia!\"\n\n#. Key:\tD1B1D33742EAA6A9BCDC42B5EA72EB59\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_31.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_31.Children(0).Children.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Saviour\"\nmsgstr \"Salvator\"\n\n#. Key:\tD1E444764EDA1457DD7427A0EA75C65F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_7.Children(4).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_7.Children(4).Children.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Blue Gem\"\nmsgstr \"Bijuterie albastră\"\n\n#. Key:\tD65AD8854E1A5BC2D37C208357BACDE3\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Due to my size!\"\nmsgstr \"Datorită dimensiunii mele!\"\n\n#. Key:\tDDEB5C4B4A180E85B1D711815B4D32F3\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Can I buy a name from you?\"\nmsgstr \"Pot cumpăra un nume de la tine?\"\n\n#. Key:\tDE3F40384473EC97950CDDB43AFE439E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Easy man! Here ya go!\"\nmsgstr \"Ușor om! Iată-te!\"\n\n#. Key:\tDEED1AF94E4BC154ED98A8B951AF0673\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Hey again!\"\nmsgstr \"Bună din nou!\"\n\n#. Key:\tE2C88DA74DA8B5935E15CC9FD337C307\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_39.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_39.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Come on man! You can't just wander around!\"\nmsgstr \"Fii serios omule! Nu te poți doar plimba!\"\n\n#. Key:\tEA08DE334C7D8631989D159FB841367D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_30.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_30.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"See ya man!\"\nmsgstr \"Ne vedem omule!\"\n\n#. Key:\tEAB8C1DE4B07AD7EAF0A4B819E4522C6\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Hey there!\"\nmsgstr \"Bună!\"\n\n#. Key:\tF780C72E4DDD9D9189C900836D4F7DBD\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"I’m Merch Ant, I deal with microtransactions.\"\nmsgstr \"Sunt o Furnică Negustor, mă ocup de microtransacții.\"\n\n#. Key:\tFED676B745409B7095EBB2994E581817\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_57.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_57.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"That's cool man. Though I wonder who will you save?\"\nmsgstr \"Asta-i mișto omul . Deși mă întreb pe cine vei salva?\"\n\n#. Key:\t04F1EF4B4AFDE5759A25A1A4922E9EA8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"Yet they could do nothing.\"\nmsgstr \"Cu toate acestea, nu puteau face nimic.\"\n\n#. Key:\t05E7A2224316FEED1A2CEB8AEFC46B41\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"We can’t let everyone die here.\"\nmsgstr \"Nu putem lăsa pe toți să moară aici.\"\n\n#. Key:\t078A48C347E2B23E79C495BA42BC7B6D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_25.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_25.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"We’ll have time to find a cure.\"\nmsgstr \"Vom avea timp să găsim un remediu.\"\n\n#. Key:\t0A857169478EC6929EFCA3B390C394DA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"Prepare for your last travel in the Ruined Realm. Head to the north from where the wind is blowing!\"\nmsgstr \"Pregătește-te pentru ultima ta călătorie pe tărâmul Ruinat. Îndreaptă-te spre nord de unde bate vântul!\"\n\n#. Key:\t1D8B6C81428A6D9F4C29AE9AD26206F2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_29.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_29.Children(1).Children.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"Can't leave them\"\nmsgstr \"Nu îi pot părăsi\"\n\n#. Key:\t217F39F14762862B6EA18484EA74E987\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_37.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_37.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"I wish you better luck this time!\"\nmsgstr \"Îțî doresc mult mai mult noroc de data asta!\"\n\n#. Key:\t22E17F2F4CFDD0CEB67AB0A91D872B3F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_4.Children(2).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_4.Children(2).Children.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"Not my problem\"\nmsgstr \"Nu este problema mea\"\n\n#. Key:\t2685CE674BB3B11FD3CB3AA2460CE60A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"There is nothing we can do for this World.\"\nmsgstr \"Nu putem face nimic pentru această lume.\"\n\n#. Key:\t26A2075F407FF43E1AF8B6B38E9C4AEE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"Farewell!\"\nmsgstr \"Rămas bun!\"\n\n#. Key:\t2F7D7C46418E8E049493839A26DBB10E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"I’m ready to sacrifice myself but I feel sorrow for this world.\"\nmsgstr \"Sunt gata să mă sacrific, dar simt întristare pentru această lume.\"\n\n#. Key:\t39172C7641A5973A4B5D8480EBDD2589\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_34.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_34.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"Back already?\"\nmsgstr \"Înapoi deja?\"\n\n#. Key:\t3D21436E48DA0DF9C3ACA3B11001B17C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"Yet, we need to save those we can.\"\nmsgstr \"Cu toate acestea, trebuie să îi salvăm pe cei pe care îi putem.\"\n\n#. Key:\t43B780AA4934FBE35679BFB3C1C92D56\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"Farewell Wanderer!\"\nmsgstr \"Adio Hoinarule!\"\n\n#. Key:\t4AD4171F4A1832148034BAA736FC587E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"Head to the north from where the wind is blowing!\"\nmsgstr \"Îndreaptă-te spre nord de unde bate vântul!\"\n\n#. Key:\t4E65707F497B4B35E873138DDBF7B879\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"I will go home and you will solve your problems on your own.\"\nmsgstr \"Voi merge acasă și îți vei rezolva singur problemele.\"\n\n#. Key:\t4EDA1AEF471537F758DD0491A7140073\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"This is none of my business.\"\nmsgstr \"Nu este treaba mea.\"\n\n#. Key:\t58246AA446D982E55E53EAB34FFF6A81\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_34.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_34.Children(1).Children.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"Leave\"\nmsgstr \"Pleacă\"\n\n#. Key:\t67CB3C99468EEA39C4C18C8B0C28AFEA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_26.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_26.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"You? You mean the Wizard Council?\"\nmsgstr \"Tu? Vrei să spui Consiliul Vrăjitorilor?\"\n\n#. Key:\t743DD4C048F8CD08A49805975183B54D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"I’m sorry it ends like this, Wanderer.\"\nmsgstr \"Îmi pare rău că se termină așa, Rătăcitorule.\"\n\n#. Key:\t7AB88DE549E213B71759699AD51CFD4C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"I’m really proud of you little spirit. This wasn’t an easy decision for me either.\"\nmsgstr \"Chiar sunt mândru de tine micule spirit. Nici aceasta nu a fost o decizie ușoară pentru mine.\"\n\n#. Key:\t7DCF30E74F8C0F29DA4E668CE3435E89\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"Wizard can’t hear us here, we can talk freely.\"\nmsgstr \"Vrăjitorul nu ne poate auzi aici, putem vorbi liber.\"\n\n#. Key:\t8177A07D41AE7778BB4839AED3FEDACF\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_23.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_23.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"Do you know what you are risking?\"\nmsgstr \"Ști ce riști?\"\n\n#. Key:\t876B4752465406828E27A88C282EA5CD\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"From here I can teleport you close to the place where the Wizard will be able to get you out.\"\nmsgstr \"De aici te pot teleporta aproape de locul în care Vrăjitorul te va putea scoate.\"\n\n#. Key:\t9255CAD841A0C5B4DF3F4D8C5F5516B1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"So many great things will perish. So many...\"\nmsgstr \"Atâtea lucruri grozave vor pieri. Așa de mult...\"\n\n#. Key:\t95EDE8FB4CEC490381EBD990C7277009\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_38.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_38.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"Take your time!\"\nmsgstr \"Nu te grăbi!\"\n\n#. Key:\t9D46888D43C665A29506BF9CBB62F81D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_35.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_35.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"Let me try again!\"\nmsgstr \"Lasă-mă să mai încerc o dată!\"\n\n#. Key:\tA1CF649542AAE3D8945327B9502E2E78\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_29.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_29.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"What chance do the humans have?\"\nmsgstr \"Ce șanse au oamenii?\"\n\n#. Key:\tA60B94F64A0D02EA0DA9419741ED84F4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_36.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_36.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"I just need some rest.\"\nmsgstr \"Am nevoie doar de odihnă.\"\n\n#. Key:\tA651056C4D344D685FEB53B2C3795966\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_34.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_34.Children(0).Children.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"Retry\"\nmsgstr \"Reîncercă\"\n\n#. Key:\tAAE7046349DBE5359097179A42FDA255\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_33.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_33.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"This one was enough.\"\nmsgstr \"Acesta a fost suficient.\"\n\n#. Key:\tB17D67194997EFAEF6B8678DB05894FD\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"Let’s get them out first and face Ruin after.\"\nmsgstr \"Să le scoatem mai întâi și să ne confruntăm cu Ruina după.\"\n\n#. Key:\tB4E31022471B52056F7B5AA3BB322700\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"How can I get to the Wizard’s tower?\"\nmsgstr \"Cum pot ajunge la turnul Vrăjitorului?\"\n\n#. Key:\tB6C99FC54E2A347994473EBF52B57EBD\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_4.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_4.Children(1).Children.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"Raven’s plan\"\nmsgstr \"Planul Corbului\"\n\n#. Key:\tB985955E4FC6D81FBD38D79ADE68BF1F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_4.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_4.Children(0).Children.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"Separate Worlds\"\nmsgstr \"Lumile Separate\"\n\n#. Key:\tC4BABAED4C790EDDF6AAF7A0D4CFA79B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_27.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_27.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"When Ruin started in the Runic Realm they had hundreds of Scientists who studied the force which made Ruin.\"\nmsgstr \"Când Ruina a început pe Tărâmul Runic, au avut sute de oameni de știință care au studiat forța care a făcut Ruina.\"\n\n#. Key:\tCB779F524992B29781C4778ED6E224A7\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_30.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_30.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"I just can’t leave them to die here...\"\nmsgstr \"Nu pot să-i las să moară aici ...\"\n\n#. Key:\tCDA7A09249E96A52B2FA3CA471D6C4B3\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"This is the end of the path where we last meet.\"\nmsgstr \"Acesta este sfârșitul căii pe care ne-am întâlnit ultima dată.\"\n\n#. Key:\tCF238FAA4941848AF7071A866B75B6EC\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"You are right. The only way to stop Ruin is to lock the Ruined Realm forever.\"\nmsgstr \"Ai dreptate. Singura modalitate de a opri Ruina este să blochezi Tărâmul Ruinat pentru totdeauna.\"\n\n#. Key:\tD1F3B7324351B25E8C55679BAC3BF1E0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"Have you made your decision?\"\nmsgstr \"Ți-ai luat decizia?\"\n\n#. Key:\tE164446B4944B4CAC8E5C1BF82A722A2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_24.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_24.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"If you bring infected people into the Human Realm Ruin will consume them.\"\nmsgstr \"Dacă aduci oameni infectați pe Tărâmul Uman, Ruina îi va consuma.\"\n\n#. Key:\tE39531DE4350D6D86DF469839F1906E7\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_31.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_31.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"It’s your decision, Wanderer. I understand.\"\nmsgstr \"E decizia ta, Rătăcitorule. Înțeleg.\"\n\n#. Key:\tE46912D04BE67D3E2B0794BB632AEE98\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_32.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_32.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"I’ll stay here. I won’t be able to watch another World dying...\"\nmsgstr \"Voi rămâne aici. Nu voi putea viziona o altă lume murind ...\"\n\n#. Key:\tF70B765F44DB17E1C6978D9D8652C911\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"Hello, little Wanderer!\"\nmsgstr \"Bună ziua, micule Rătăcitor!\"\n\n#. Key:\tFE709EDF4482B6FA7408DE99D95E8577\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_29.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_29.Children(0).Children.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"You are right\"\nmsgstr \"Ai dreptate\"\n\n#. Key:\tFE77F7964851F202F5C91396A4C7228E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"I’ll take you to the place where you can leave this Realm.\"\nmsgstr \"Te voi duce în locul unde poți părăsi acest Tărâm.\"\n\n#. Key:\t0B886754483D1C215FBEF5B7D19AF6A6\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"I know you have summoned a Spirit of the Unknown world. You were a fool to think you can get away with this.\"\nmsgstr \"Știu că ai chemat un Duh al lumii Necunoscute. Ai fost un prost să crezi că poți scăpa de asta.\"\n\n#. Key:\t0BDF59D34A9E53B7FD5FD18F8E46F72F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"Argh! All right, here you go...\"\nmsgstr \"Argh! Bine, aici te duci ...\"\n\n#. Key:\t2A6837CA471604FCDD180E85BD23D676\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"Krrr... Raven gives you magic which will make you fly like a Raven.\"\nmsgstr \"Krrr ... Corbul îți oferă magie, care te face să zbori ca un corb.\"\n\n#. Key:\t2D8209F74AC3C9E042717A9FB108C051\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"Come on, go and try it!\"\nmsgstr \"Hai, du-te și încearcă!\"\n\n#. Key:\t39B1763740E9BB9B495A7997920A3401\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_12.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_12.Children(0).Children.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"How?\"\nmsgstr \"Cum?\"\n\n#. Key:\t3AE553D14FFB88C0518679B86691D508\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"Call your master little spirit, I have words with him.\"\nmsgstr \"Cheamă-ți stăpânul duhule cel mic, am ceva de spus lui.\"\n\n#. Key:\t3E02111D40F21C2C8C13F08729B4CDBC\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"I don’t know about any rule forbidding that...\"\nmsgstr \"Nu știu nicio regulă care să interzică asta ...\"\n\n#. Key:\t453610F144D8CEB42138F0BB35B9692A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"Wait Scholar! Please give me a few more days!\"\nmsgstr \"Așteaptă Savantule! Te rog să-mi dai încă câteva zile!\"\n\n#. Key:\t4F0C40114C4DD1B345CF909E94F99D60\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"Why should I ask that?\"\nmsgstr \"De ce ar trebui să întreb asta?\"\n\n#. Key:\t56F0D93740AB7555FF9370879D774842\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"I have no doubt how the Council will react.\"\nmsgstr \"Pentru că ți-ar plăcea să știi cum poți ieși de aici.\"\n\n#. Key:\t60D3A9DA420ECD7DBF490BA233EA5C61\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"Because you would love to know how you can get out of here.\"\nmsgstr \"Pentru că ți-ar plăcea să știi cum poți ieși de aici.\"\n\n#. Key:\t6125A956446F64BD91E1F5A282AC146D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"Don’t worry! I know your daughter is trapped in the Unknown and my research confirms there is a chance you can bring her back.\\r\\nI’ll help you bring the missing artefacts back.\"\nmsgstr \"Nu îți face griji! Știu că fiica ta este prinsă în Necunoscut și cercetările mele confirmă că există șansa că o poți aduce înapoi.\\nTe voi ajuta să readuci artefactele lipsă.\"\n\n#. Key:\t6B7478444FBC694480D442BB90F70B27\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"What do you want?\"\nmsgstr \"Ce vrei?\"\n\n#. Key:\t72D7F64D4051F9BF362B9B97FD30DB65\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_12.Children(2).Children.Text\n#. Key:\tF62125FB48F982D2A3D4FE9621810F64\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_12.Children(2).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"What?\"\nmsgstr \"Ce?\"\n\n#. Key:\t810BD4154FA6BC7F857F9CB14EDC6A1D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"Er... thanks!\"\nmsgstr \"E ... mulțumesc!\"\n\n#. Key:\t8F439E124100E004BCCD4AA04F17CB3F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"How will we get out of here?\"\nmsgstr \"Cum vom ieși de aici?\"\n\n#. Key:\t9D31A0084CBBA499BA4E3BADB42E6E36\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"Rule? What rule should be needed for something which was thought to be impossible?\"\nmsgstr \"Regulă? Ce regulă trebuie să fie necesară pentru ceva despre care se credea imposibil?\"\n\n#. Key:\t9F52551E46588D4F12CD7C8B63701FDE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_12.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_12.Children(1).Children.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"Why?\"\nmsgstr \"De ce?\"\n\n#. Key:\tAAC96E3C4D4D303C9E692390612A7215\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"Ask how we will get out of here!\"\nmsgstr \"Întrebă cum vom ieși de aici!\"\n\n#. Key:\tC0808C6545D02F43CB37A2AFB79EEC1F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"Actually it’s not that good but still better than nothing.\"\nmsgstr \"De fapt, nu este chiar atât de bun, dar mai bun decât nimic.\"\n\n#. Key:\tC19759F44A5A2AE21A04EBAF2A47E2D3\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"Take this!\"\nmsgstr \"Ia asta!\"\n\n#. Key:\tC8CEB3844A6C958FF42C74AA81D4A90F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"Finally, Raven found you!\"\nmsgstr \"În cele din urmă, Corbul te-a găsit!\"\n\n#. Key:\tCF6DEF4D4F6F664CF24435AF248CE452\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"Raven and his fellow Ball on a quest again!\"\nmsgstr \"Corbul și colegul său Minge din nou într-o Misiune!\"\n\n#. Key:\tE52C31F241BCD21378696EB8761C0654\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"Let the masters talk in private and discuss how we will get out of here!\"\nmsgstr \"Lăsați stăpânii să vorbească în privat și să discute despre cum vom ieși de aici!\"\n\n#. Key:\t00ED8B314FC2DA3901823F92635D41D1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_26.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_26.Children(0).Children.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"You’ll be all dead\"\nmsgstr \"Veți fi toți morți\"\n\n#. Key:\t23BA5AA446B44D107B9F3994ADDE1C43\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_22.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_22.Children(1).Children.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Save them!\"\nmsgstr \"Salvează-i!\"\n\n#. Key:\t42395E7B4B735458E30557B9544073E3\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_8.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_8.Children(1).Children.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Leave\"\nmsgstr \"Pleacă\"\n\n#. Key:\t43A5BAA8417D3291E502AD9500873B9E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Rumours have been spread of Ruin and the people are scared. They demand the Wizard Council to separate the Human Realm from the Ruined Realm.\"\nmsgstr \"S-au răspândit zvonuri despre ruină și oamenii sunt speriați. Aceștia solicită Consiliului Vrăjitorilor să separe Regatul Uman de Tărâmul Ruinat.\"\n\n#. Key:\t4FAAEE6240849C416541EDA8AB8083C8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_30.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_30.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Good luck, Raven!\"\nmsgstr \"Noroc, Corbule!\"\n\n#. Key:\t559673484F3C66AADE37E787BA35824A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_33.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_33.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Only a fool would bring Ruin to his own World.\"\nmsgstr \"Doar un prost ar aduce Ruina în propria sa lume.\"\n\n#. Key:\t568124F448BE3AF41123A0B7BB158A53\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Krrrr! Raven and you make a really good team.\"\nmsgstr \"Krrrr! Corbul și tu faci o echipă foarte bună.\"\n\n#. Key:\t5853B8654DBD91894792DE803DE87271\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_27.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_27.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"You bring back the artefacts to rescue Lillian.\"\nmsgstr \"Îi aduci înapoi artefactele pentru salvarea lui Lillian.\"\n\n#. Key:\t5D71DA8F4134A1AA206F15B7587AA188\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_15.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_15.Children(0).Children.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Break in?\"\nmsgstr \"Spargere?\"\n\n#. Key:\t6234A9A34854A37E0CA56987FDE81F5A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_26.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_26.Children(1).Children.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"You are right\"\nmsgstr \"Ai dreptate\"\n\n#. Key:\t6B07C6F34DF51DFA23A4278FCBECF303\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"What it will do?\"\nmsgstr \"Ce va face?\"\n\n#. Key:\t6E5A51A34AB81094924512B92F25F41C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_32.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_32.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"You are trying to rescue a bunch of mad people so that they can live a few more years with the cost of destroying one more Realm.\"\nmsgstr \"Încerci să sălvezi o mulțime de oameni nebuni, astfel încât să poată trăi câțiva ani în plus, cu costul distrugerii unui alt Tărâm.\"\n\n#. Key:\t70514624400617999FA05FAFAE67D60F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"What happened in the Human Realm?\"\nmsgstr \"Ce s-a întâmplat pe Tărâmul Uman?\"\n\n#. Key:\t71C42D6445782897EAF303BFA2C5C260\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"What will you do? What’s your part in this?\"\nmsgstr \"Ce vei face? Care este partea ta în asta?\"\n\n#. Key:\t728B75824B28856156D207B71017C714\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Things are changing in the Human Realm and Raven has many things to do.\"\nmsgstr \"Lucrurile se schimbă pe Tărâmul Uman și Corbul are multe lucruri de făcut.\"\n\n#. Key:\t7826765F45BE76393F3636B79BBC24C0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_24.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_24.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"You are right. We need to save them. What’s the plan?\"\nmsgstr \"Ai dreptate. Trebuie să-i salvăm. Care-i planul?\"\n\n#. Key:\t866DA22D46D855A200BB7F9E71788367\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_22.Children(0).Children.Text\n#. Key:\tBA0DEBA04BF5C604A2B760B8275E2983\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_23.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_22.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_23.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Is that safe?\"\nmsgstr \"Este sigur?\"\n\n#. Key:\t86E69EA04F489DC54B48BEBE8B3762BF\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_1.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_1.Children(0).Children.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Agree\"\nmsgstr \"De Acord\"\n\n#. Key:\t8D543992469624098751EAA474848F8C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Soon the Ruined Realm will be over. We cannot save it.\"\nmsgstr \"În curând, tărâmul ruinat se va termina. Nu îl putem salva.\"\n\n#. Key:\t943679734061A00F4CC99A8BC31078EA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Wizard won’t activate the device for them but some of them are fools enough to try it anyway.\"\nmsgstr \"Vrăjitorul nu vor activa dispozitivul pentru ei, dar unii dintre ei sunt suficient de proști pentru a-l încerca oricum.\"\n\n#. Key:\t978AEC8B45AC7E6ED3E814AB849CF96A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"So, what now?\"\nmsgstr \"Deci, ce acum?\"\n\n#. Key:\t99250A3F4973EBFB5A20A192DF8976AA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"With every day more and more people join their ranks.\"\nmsgstr \"Cu fiecare zi din ce în ce mai mulți oameni se alătură rândurilor lor.\"\n\n#. Key:\t9D81AC2C4900D6DDA6B17CAD7168020C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_31.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_31.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Farewell, compeer!\"\nmsgstr \"Adio, tovarășe!\"\n\n#. Key:\tA5F24B3747918DB1E38CB98208FD6B1B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_35.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_35.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Or maybe you are wrong.\"\nmsgstr \"Sau poate te înșeli.\"\n\n#. Key:\tB0ECBFAF4E34AEDE88F1B7B7C7F7CC5B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_8.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_8.Children(0).Children.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"What happened?\"\nmsgstr \"Ce s-a întâmplat?\"\n\n#. Key:\tB1D891BF48298C5D4CF7D8957EACDD1B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Raven will gather as many survivors as Raven can.\"\nmsgstr \"Corbul va aduna cât mai mulți supraviețuitori.\"\n\n#. Key:\tB6CF3E424BAEA6EE368D508EEFDD5FF1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_36.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_36.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Farewell compeer! Raven will be on a quest on Raven’s own!\"\nmsgstr \"Adio tovarășe! Corbul va participa la o căutare al Corbului!\"\n\n#. Key:\tB87509FF4D29C2B3D25CCEB192090963\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"What happens if they break in?\"\nmsgstr \"Ce se întâmplă dacă intră înăuntru?\"\n\n#. Key:\tB89F014644B8D3E1754B1B8C796D5858\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_1.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_1.Children(1).Children.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Disagree\"\nmsgstr \"Nu sunt de acord\"\n\n#. Key:\tBA14AAD54C3D4F7CF18F5D8560A62637\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Nothing good...\"\nmsgstr \"Nimic bun...\"\n\n#. Key:\tC2E50DCB4E1171342DD931910E42549E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_37.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_37.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Farewell!\"\nmsgstr \"Rămas bun!\"\n\n#. Key:\tC3B19DAF4C0B491D9236CD99FD7DD603\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Except when you kill me with a laser beam.\"\nmsgstr \"Cu excepția cazului în care mă omori cu un fascicul laser.\"\n\n#. Key:\tCBDDFBD14121FE1758B360A1775F2169\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Farewell compeer until you meet Raven again!\"\nmsgstr \"Adio tovarăș până când ne vei întâlni Corbul din nou!\"\n\n#. Key:\tCD19E0924BB1080025ABA19860F578CE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Somehow they know about the device the Wizard created. They surrounded the Wizard’s tower. Some even tried to break in.\"\nmsgstr \"Cumva știu despre dispozitivul creat de Vrăjitorul. Au înconjurat turnul Vrăjitorului. Unii chiar au încercat să intre.\"\n\n#. Key:\tD54470AA424038F96824FC805AE3F0EE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_25.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_25.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Krrr! For them it’s much safer than staying here when the World is over.\"\nmsgstr \"Krrr! Pentru ei este mult mai sigur decât să stai aici când lumea se va termina.\"\n\n#. Key:\tD99400D94457B6779DE59DB94FDBF9D1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"We have really short time to act.\"\nmsgstr \"Avem într-adevăr scurt timp pentru a acționa.\"\n\n#. Key:\tDAEF711B41EC4EF72FC271B5AD98A238\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_26.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_26.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"There are hundreds of survivors. Races that don’t even exist anywhere else! Who are we if we don’t even try to save them?\"\nmsgstr \"Există sute de supraviețuitori. Rase care nici nu există nicăieri în altă parte! Cine suntem dacă nici nu încercăm să le salvăm?\"\n\n#. Key:\tDF872D134C82DFDD3F55F4A6FFF59673\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Except...\"\nmsgstr \"Cu excepția...\"\n\n#. Key:\tE64B8C0048D2D3357B74CD8D7C1B5407\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_34.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_34.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"You sound like that Monk, don’t you? Maybe you are right.\"\nmsgstr \"Suni ca Călugărul acela, nu-i așa? Poate ai dreptate.\"\n\n#. Key:\tEA01FB8248A5F30CF9D95AA292D5466A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"No problem.\"\nmsgstr \"Nici o problemă.\"\n\n#. Key:\tF1193DA54FBB289383D56F952818E67E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Raven’s master decided we need to gather every survivor and take them into the Human Realm.\"\nmsgstr \"Stăpânul Corbului a decis că trebuie să adunăm fiecare supraviețuitor și să-i ducem pe Tărâmul Uman.\"\n\n#. Key:\tF19792CF477CD543AC05FCBEDA3EA88C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_15.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_15.Children(1).Children.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"To act?\"\nmsgstr \"A acționa?\"\n\n#. Key:\tF606FBDF4B7F3DFF9A55BE9CDB186CAC\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Farewell then!\"\nmsgstr \"Adio, atunci!\"\n\n#. Key:\tF8FA36BF4E3A4C028FBAF0A2AA531AA4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"You need to go on alone.\"\nmsgstr \"Trebuie să continui singur.\"\n\n#. Key:\tFA02BBA74B601254CDA90A9300AD312F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_29.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_29.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"If all goes well you will meet Raven on the other side.\"\nmsgstr \"Dacă totul merge bine, vei întâlni pe Corb pe partea cealaltă.\"\n\n#. Key:\tFA630952402B081C2D449DA3C091F33E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Yes, we did well. Thanks for the help!\"\nmsgstr \"Da, ne-am descurcat bine. Mulțumesc pentru ajutor!\"\n\n#. Key:\t63338A0644CC3AE62BCC10B56EAAD524\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3SewerCreature.C3SewerCreature:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter3/C3SewerCreature.C3SewerCreature:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_C3SewerCreature\"\nmsgid \"Fear not, everything will be alright!\"\nmsgstr \"Nu te teme, totul va fi în regulă!\"\n\n#. Key:\t2C1EC209404316CE23DC67B6E91AC661\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Statue.C3Statue:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter3/C3Statue.C3Statue:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_C3Statue\"\nmsgid \"Are you ready?\"\nmsgstr \"Ești liber?\"\n\n#. Key:\t33B337C9455FC32BF5C3C69F58843673\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Statue.C3Statue:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Chapter3/C3Statue.C3Statue:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_C3Statue\"\nmsgid \"Will you release me once I get into your tower?\"\nmsgstr \"Mă vei elibera odată ce voi intra în turnul tău?\"\n\n#. Key:\t4A8AD3EC428307141BD011B66448A7E5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Statue.C3Statue:DlgNode_Speech_2.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Statue.C3Statue:DlgNode_Speech_2.Children(0).Children.Text\nmsgctxt \"Dialogue_C3Statue\"\nmsgid \"Ready\"\nmsgstr \"Gata\"\n\n#. Key:\t9C5B29DF4784913DFF166BAD07AC1219\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Statue.C3Statue:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Chapter3/C3Statue.C3Statue:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_C3Statue\"\nmsgid \"Hurry! We don’t have much time.\"\nmsgstr \"Grabă! Nu avem mult timp.\"\n\n#. Key:\tB640545F41315B4C142083A2DB12A132\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Statue.C3Statue:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Chapter3/C3Statue.C3Statue:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_C3Statue\"\nmsgid \"Sure, we made a deal.\"\nmsgstr \"Sigur, am făcut o afacere.\"\n\n#. Key:\tC4EC98FC40F0181F5AFA60B4DFEF2D16\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Statue.C3Statue:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Chapter3/C3Statue.C3Statue:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_C3Statue\"\nmsgid \"Not yet. I’ll be back...\"\nmsgstr \"Nu încă. Mă voi întoarce...\"\n\n#. Key:\tCD542C81498F713774D43AB6EF126E32\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Statue.C3Statue:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter3/C3Statue.C3Statue:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_C3Statue\"\nmsgid \"Well done! From here I can take you to my tower.\"\nmsgstr \"Foarte bine! De aici te pot duce în turnul meu.\"\n\n#. Key:\tF982C80748C46B117906F094608B7E2C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Statue.C3Statue:DlgNode_Speech_2.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Statue.C3Statue:DlgNode_Speech_2.Children(1).Children.Text\nmsgctxt \"Dialogue_C3Statue\"\nmsgid \"Stay\"\nmsgstr \"Stai\"\n\n#. Key:\tFE6723D8452B497B07504EA753F02F35\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Statue.C3Statue:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Chapter3/C3Statue.C3Statue:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_C3Statue\"\nmsgid \"Let’s go then!\"\nmsgstr \"Hai sa mergem, atunci!\"\n\n#. Key:\t7C2DF1BE46E7672A1C7092A330030B39\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3SupperDwarf.C3SupperDwarf:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter3/C3SupperDwarf.C3SupperDwarf:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_C3SupperDwarf\"\nmsgid \"Otherwise I would rather stay here.\"\nmsgstr \"Altfel aș prefera să rămân aici.\"\n\n#. Key:\tFEB0911A412AF51088EC6A84D0FC7B3C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3SupperDwarf.C3SupperDwarf:DlgNode_Speech_80.Text\n#: /Game/SO/Dialogues/Chapter3/C3SupperDwarf.C3SupperDwarf:DlgNode_Speech_80.Text\nmsgctxt \"Dialogue_C3SupperDwarf\"\nmsgid \"I hope there is some delicious food in the Human Realm.\"\nmsgstr \"Sper să existe mâncare delicioasă pe Tărâmul Uman.\"\n\n#. Key:\t360852FB41FBC269468577878A0CC719\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_C3Teachy\"\nmsgid \"Don’t say it, I know. I’m genius.\"\nmsgstr \"Nu o spune, știu. Sunt un geniu.\"\n\n#. Key:\t39008A1943A63D4050295B9C508DF4CE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_C3Teachy\"\nmsgid \"He asked me to prove that I am worthy.\"\nmsgstr \"El mi-a cerut să demonstrez că sunt demn.\"\n\n#. Key:\t5D3A77994D763C95F5655CAC4F228452\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_C3Teachy\"\nmsgid \"Oh, the walking ball again!\"\nmsgstr \"Oh, mingea care merge!\"\n\n#. Key:\t74789A0946246082325FCDB2600CEAA2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_C3Teachy\"\nmsgid \"I haven’t seen you since you left me there with that Keeper.\"\nmsgstr \"Nu te-am văzut de când m-ai lăsat acolo cu acel Portar.\"\n\n#. Key:\t81A13B9645C14341A7FA45BC7482AB58\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_C3Teachy\"\nmsgid \"I'm not sure if it still matters but here is the Weird Device I found in the hideout of the Secret Science Society.\"\nmsgstr \"Nu sunt sigur dacă mai contează, dar iată dispozitivul ciudat pe care l-am găsit în ascunzătorul Societății de Științe Secrete.\"\n\n#. Key:\t8E2355CF4A1F7CCF4AF0FA8D95E2F503\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_C3Teachy\"\nmsgid \"After reordering the right side I got the final result:\\r\\n\\r\\nTEACHY = WORTHY\"\nmsgstr \"După reordonarea părții drepte am obținut rezultatul final:\\n\\nPROFESOR = DEMN\"\n\n#. Key:\tA46C8D2749791CE910856BA8887272EB\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_C3Teachy\"\nmsgid \"That is amazing! Thank you, my globular friend! Take these coins, I am sure you will enjoy spending them... if you still can.\"\nmsgstr \"Asta este incredibil! Mulțumesc, prietenul meu globular! Ia aceste monede, sunt sigur că îți va plăcea să le cheltuiești ... dacă mai poți.\"\n\n#. Key:\tBFA75D71419A3B5615D65980F9A2FC0E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_C3Teachy\"\nmsgid \"Well, alright, I’ll tell.\"\nmsgstr \"Ei bine, bine, voi spune.\"\n\n#. Key:\tC09FB7394571D19280D0B68572C6DCBB\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_C3Teachy\"\nmsgid \"I bet you wonder how did I get out.\"\nmsgstr \"I bet you wonder how did I get out.\"\n\n#. Key:\tCC72AAE64CE58AECB367B0B2565A74CC\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_C3Teachy\"\nmsgid \"I made some cups of tea and slowly put them in a row. From that I had this formula:\\r\\n\\r\\nTIME = T\\r\\nCUP = C\\r\\nTEA * C = ROW * T\"\nmsgstr \"Am făcut câteva căni de ceai și le-am pus încet pe rând. Din aceasta am avut această formulă:\\n\\nTIMP = T\\nCANĂ = C\\nCEAI * C = RÂND * T\"\n\n#. Key:\tE907906F4A46886EFBA7F09E459F2663\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_C3Teachy\"\nmsgid \"Then I multiplied by HY, so I get:\\r\\n\\r\\nTEACHY = ROWTHY\"\nmsgstr \"Apoi am înmulțit cu HY, așa că obțin:\\n\\nDIDACTIC = EDMN\"\n\n#. Key:\t298F025648B369E90753DA8D882DFDDB\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/DwarvenCatacombs/DCDictionary.DCDictionary:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Wizard/DwarvenCatacombs/DCDictionary.DCDictionary:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_DCDictionary\"\nmsgid \"Finally! A dictionary!\"\nmsgstr \"În cele din urmă! Un dicționar!\"\n\n#. Key:\t3D4CF9424B28083560A64D8FA1232E9F\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/DwarvenCatacombs/DCDictionary.DCDictionary:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Wizard/DwarvenCatacombs/DCDictionary.DCDictionary:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_DCDictionary\"\nmsgid \"Wake me up when you are ready.\"\nmsgstr \"Trezește-mă când ești gata.\"\n\n#. Key:\t04B787DD4344DA8AD6B1E0B7925BBDCE\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/DwarvenCatacombs/DCSecretDoor.DCSecretDoor:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Wizard/DwarvenCatacombs/DCSecretDoor.DCSecretDoor:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_DCSecretDoor\"\nmsgid \"There is a hidden Dwarven Door somewhere around here.\"\nmsgstr \"Ușa Piticilor undeva pe aicea.\"\n\n#. Key:\t4412DD54423A17AF3BFBA89BAF42664D\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/DwarvenCatacombs/DCSecretDoor.DCSecretDoor:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Wizard/DwarvenCatacombs/DCSecretDoor.DCSecretDoor:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_DCSecretDoor\"\nmsgid \"Or if you toggle that switch.\"\nmsgstr \"Sau dacă comutați comutatorul.\"\n\n#. Key:\t5FDA3D2A49BD57C213F0E3869A366B76\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/DwarvenCatacombs/DCSecretDoor.DCSecretDoor:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Wizard/DwarvenCatacombs/DCSecretDoor.DCSecretDoor:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_DCSecretDoor\"\nmsgid \"This one can only be revealed on Christmas time if the full moon shines on it.\"\nmsgstr \"Acesta poate fi dezvăluit doar în perioada Crăciunului, dacă luna plină strălucește pe ea.\"\n\n#. Key:\tCE7E6F5B4DB41F1055EAF1898F17E4EA\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/DwarvenCatacombs/DCSecretDoor.DCSecretDoor:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Wizard/DwarvenCatacombs/DCSecretDoor.DCSecretDoor:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_DCSecretDoor\"\nmsgid \"Dwarfs are fond of these. They can't be seen if you don't know their trick.\"\nmsgstr \"Piticii sunt pasionați de acestea. Nu pot fi văzuți dacă nu le cunoști trucul.\"\n\n#. Key:\t03067C1041952ECAC7D529AF2CC2ABEE\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_DemonLillian\"\nmsgid \"Who you just killed...\"\nmsgstr \"Pe cine tocmai l-ai ucis ...\"\n\n#. Key:\t06C4895B4BA9C2F71F3007B00A680CFB\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_DemonLillian\"\nmsgid \"I'm free without any bounds! I'm human!\"\nmsgstr \"Sunt liber, fără limite! Sunt om!\"\n\n#. Key:\t0E5418EA4828B840886434A250967CBE\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_DemonLillian\"\nmsgid \"You liar! I'm the daughter of the Wizard!\"\nmsgstr \"Mincinosule! Sunt fiica Vrăjitorului!\"\n\n#. Key:\t15ED5E554FBF25A72BB12FA81F4076FF\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_DemonLillian\"\nmsgid \"Sister? What makes you say that?\"\nmsgstr \"Sora? Ce te face să spui asta?\"\n\n#. Key:\t2B375C424D4561D651214BA0F10CDB44\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_DemonLillian\"\nmsgid \"Siblings? What makes you say that?\"\nmsgstr \"Frații? Ce te face să spui asta?\"\n\n#. Key:\t2F0A5F3442ACF917A0515892B0639541\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_2.Children(1).Children.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_2.Children(1).Children.Text\nmsgctxt \"Dialogue_DemonLillian\"\nmsgid \"Just passing\"\nmsgstr \"Doar trecând\"\n\n#. Key:\t36A3340F4333184F42874F88F23A710D\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_DemonLillian\"\nmsgid \"What are you doing here little toy?\"\nmsgstr \"Ce faci aici jucărie mică?\"\n\n#. Key:\t46C7EE464B94BCE5D8CE6DB96299A583\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_DemonLillian\"\nmsgid \"You are nonsense.\"\nmsgstr \"Ești prostie.\"\n\n#. Key:\t732777EC4B213BC797E24FBBC478D39F\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_DemonLillian\"\nmsgid \"You are a Spirit of the Unknown bound to this body by magic. Just like me.\"\nmsgstr \"Ești un Duh al Necunoscutului legat de acest corp prin magie. Ca și mine.\"\n\n#. Key:\t819738554E1DD3694F3D0699221E6932\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_DemonLillian\"\nmsgid \"I'm just err... maybe we could play seek and hide?\"\nmsgstr \"Doar greșesc ... poate ne-am putea juca ae-a v-ați ascunselea?\"\n\n#. Key:\tA02291F444C7907190F1D3AC78E5EAF0\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_2.Children(0).Children.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_2.Children(0).Children.Text\nmsgctxt \"Dialogue_DemonLillian\"\nmsgid \"I'll stop you!\"\nmsgstr \"Te voi opri!\"\n\n#. Key:\tA94658F148628400E971CD925A6B8713\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_DemonLillian\"\nmsgid \"Shaped like a human...\"\nmsgstr \"În formă de om ...\"\n\n#. Key:\tBBBDA8B843BF5549EF4052894D9BB630\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_DemonLillian\"\nmsgid \"We are siblings right? You will surely let me pass...\"\nmsgstr \"Suntem frați, nu? Cu siguranță mă vei lăsa să trec ...\"\n\n#. Key:\tBF79A92B406E287D767E7799D78FCFD4\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_DemonLillian\"\nmsgid \"That sounds funny!\"\nmsgstr \"Sună amuzant!\"\n\n#. Key:\tC6609DA7417A4DBC86F9809CE994E8BA\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_DemonLillian\"\nmsgid \"I'm power, I'm god!\"\nmsgstr \"Sunt putere, sunt dumnezeu!\"\n\n#. Key:\tDD2EF1594AFD2B0C38845C9E36089B95\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_DemonLillian\"\nmsgid \"I've found you!\"\nmsgstr \"Te-am găsit!\"\n\n#. Key:\tDD2F3A7048614E74B3A343BA474D8E49\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_DemonLillian\"\nmsgid \"I've come to stop you sister. The World is not your playground!\"\nmsgstr \"Am venit să te opresc sora. Lumea nu este locul tău de joacă!\"\n\n#. Key:\tE7FA21A04757D1EF04AE41AF4A13025A\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_DemonLillian\"\nmsgid \"I'm bored! Have you come to play with me?\"\nmsgstr \"Sunt plictisită! Ai venit să te joci cu mine?\"\n\n#. Key:\tFF05E84E4027C75294BAF4A589EEF6F9\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_DemonLillian\"\nmsgid \"I can create, I can destroy!\"\nmsgstr \"Pot crea, pot distruge!\"\n\n#. Key:\t025193144996A7024A7CF791B5A25EB7\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillianDefeated.DemonLillianDefeated:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillianDefeated.DemonLillianDefeated:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_DemonLillianDefeated\"\nmsgid \"What are you doing? Keep your hands away from me!\"\nmsgstr \"Ce faci? Ține-ți mâinile departe de mine!\"\n\n#. Key:\t2E05897C454C5C33BD76A6A4371A545C\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillianDefeated.DemonLillianDefeated:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillianDefeated.DemonLillianDefeated:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_DemonLillianDefeated\"\nmsgid \"I don't want to play anymore!\"\nmsgstr \"Nu mai vreau să mă mai joc!\"\n\n#. Key:\t77A82F8943F323744F9389BF22A80FDF\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillianDefeated.DemonLillianDefeated:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillianDefeated.DemonLillianDefeated:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_DemonLillianDefeated\"\nmsgid \"Farewell Spirit!\"\nmsgstr \"Adio Duh!\"\n\n#. Key:\t7831CD44458112E37918DF9082278603\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillianDefeated.DemonLillianDefeated:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillianDefeated.DemonLillianDefeated:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_DemonLillianDefeated\"\nmsgid \"Leave me alone!\"\nmsgstr \"Lasa-mă in pace!\"\n\n#. Key:\t79E4053F4B8A1AFE74064BA77037F13E\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillianDefeated.DemonLillianDefeated:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillianDefeated.DemonLillianDefeated:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_DemonLillianDefeated\"\nmsgid \"I am his daughter. And this body is mine.\"\nmsgstr \"Eu sunt fiica lui. Și acest corp este al meu.\"\n\n#. Key:\t96BD08904BC50C912055C0977281D10F\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillianDefeated.DemonLillianDefeated:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillianDefeated.DemonLillianDefeated:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_DemonLillianDefeated\"\nmsgid \"I know this body...\"\nmsgstr \"Cunosc acest corp ...\"\n\n#. Key:\tA5634D7D4613C578AB85E48B2DBD422B\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillianDefeated.DemonLillianDefeated:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillianDefeated.DemonLillianDefeated:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_DemonLillianDefeated\"\nmsgid \"Away!\"\nmsgstr \"Departe!\"\n\n#. Key:\tE09248B24E34823DDE71BAB68183AD2D\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillianDefeated.DemonLillianDefeated:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillianDefeated.DemonLillianDefeated:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_DemonLillianDefeated\"\nmsgid \"They were wrong all along.\"\nmsgstr \"Au greșit tot timpul.\"\n\n#. Key:\t01C1D7AF4D8D7B3D628A089E38471479\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_74.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_74.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Thank you! Take this as reward.\"\nmsgstr \"Mulțumesc! Luați acest lucru ca recompensă.\"\n\n#. Key:\t034DDD8F467E3B6E6A70CFBC1FA81D21\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_94.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_94.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Look what I have found for you!\"\nmsgstr \"Uite ce am găsit pentru tine!\"\n\n#. Key:\t046279EA4D7E44826F537DA0869C13DD\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_114.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_114.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"They are somewhere around.\"\nmsgstr \"Sunt undeva prin preajmă.\"\n\n#. Key:\t055FD02047EB0145285C8BB0B7A23F0A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_17.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_17.Children(0).Children.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"They fight Ruin\"\nmsgstr \"Ei luptă cu Ruina\"\n\n#. Key:\t07684DB1418378D59D3741AE19AB22C1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(9).Children.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(9).Children.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Golems destroyed\"\nmsgstr \"Golemi distruși\"\n\n#. Key:\t0D548F74416A5C1D8220869DC707A575\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_127.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_127.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Even if he couldn't be what I wanted him to be, he was my greatest creation ever.\"\nmsgstr \"Chiar dacă nu putea fi ceea ce voiam să fie el, el a fost cea mai mare creație a mea vreodată.\"\n\n#. Key:\t0E3082704C6E4BA14C554DA5B4306C88\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Could you merge these copper pieces?\"\nmsgstr \"Ai putea îmbina aceste bucăți de cupru?\"\n\n#. Key:\t103CB0C84AEA077F78347A92E6389F32\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_10.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_10.Children(0).Children.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Don't know\"\nmsgstr \"Nu stiu\"\n\n#. Key:\t12C814BB44D434DFC5C35C882B4BF0DB\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_116.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_116.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Be aware of the Armour Wrath.\"\nmsgstr \"Fi conștient de Mânia Armurii.\"\n\n#. Key:\t14E2589C4CC2C6C77D37A5B50C61C266\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Could you merge these bronze pieces?\"\nmsgstr \"Ai putea îmbina aceste piese de bronz?\"\n\n#. Key:\t1770D8FE480B8C028F9ED989E22CF315\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"You are not one of my new creations. Yet not one of the ancients.\"\nmsgstr \"Nu ești una dintre noile mele creații. Cu toate acestea, nici unul dintre antici.\"\n\n#. Key:\t1C02E8BB400B379858A402B9621B68D6\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_129.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_129.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Take care!\"\nmsgstr \"Ai grijă!\"\n\n#. Key:\t1CDE0CFA4DBF3794096E099B58726BD8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_36.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_36.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Nothing else matters.\"\nmsgstr \"Altceva nu contează.\"\n\n#. Key:\t1FA243424440B0810651C79BD207FC2D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_33.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_33.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Too many spirits. They break loose. They couldn’t exist in our Realm. They formed Ruin.\"\nmsgstr \"Prea multe spirite. Se desfac. Ei nu ar putea exista pe tărâmul nostru. Au format Ruina.\"\n\n#. Key:\t1FFE46404FBD26325B1348BF7A2935A7\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_92.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_92.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Oh, thank you! It also gives back some of my lost knowledge.\"\nmsgstr \"Oh, multumesc! De asemenea, îmi dă înapoi o parte din cunoștințele mele pierdute.\"\n\n#. Key:\t2084B3DE4CDAC5B7B9018994EE4DFAA4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_85.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_85.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"The end is close, yet knowing what I am makes my last days brighter.\"\nmsgstr \"Finalul este aproape, dar știind ce sunt îmi fac ultimele zile mai luminoase.\"\n\n#. Key:\t21883D3E4563FD95B13E8E8E25FB1D92\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_15.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_15.Children(0).Children.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Not my business\"\nmsgstr \"Nu e treaba mea\"\n\n#. Key:\t2362D7ED44CEEE8592C72BB41ECC0CC0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_77.Text\n#. Key:\t969AF9184296C419E484BA80FF80F15B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_76.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_76.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_77.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Do you know a girl called Lillian?\"\nmsgstr \"Cunoașteți o fată care se numește Lillian?\"\n\n#. Key:\t2362FF25427C7C664ACE9297A20F3C65\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_81.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_81.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Memory Crystals? Can I touch them?\"\nmsgstr \"Cristale de memorie? Pot să le ating?\"\n\n#. Key:\t254431B64533FAD362B0AF93F8347842\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_119.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_119.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"You will find it if you reach the top of the Main Tower.\"\nmsgstr \"O vei găsi dacă ajungi în vârful Turnului Principal.\"\n\n#. Key:\t26664D3045EDCEC9C09E9CBA8515C088\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I don't know... I'm forced to do tasks for a wizard. I'm lost and confused.\"\nmsgstr \"Nu știu ... sunt obligat să fac sarcini pentru un vrăjitor. Sunt pierdut și confuz.\"\n\n#. Key:\t280BE2914A227E7350F067BCB4CC49AD\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_86.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_86.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Hmmm...\"\nmsgstr \"Hmmm...\"\n\n#. Key:\t2B714CED45A868B1678C5E854160945E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_97.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_97.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Look, I have more crystals.\"\nmsgstr \"Uite, am mai multe cristale.\"\n\n#. Key:\t2C052328496E84667F356F95F9F9C418\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"This is really not my problem. All I care about is to complete my task and go on my way.\"\nmsgstr \"Aceasta nu este problema mea. Tot ce îmi pasă este să-mi completez sarcina și să merg pe drumul meu.\"\n\n#. Key:\t2C174523477E6720A5300DBFE343C3D8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_51.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_51.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I can no longer open a gate to the Unknown Realm.\"\nmsgstr \"Nu mai pot deschide o poartă către Tărâmul Necunoscut.\"\n\n#. Key:\t2C7D234B4F377087E1D340986BD581AC\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_49.Text\n#. Key:\t417BB4E644EBC809C2489F85993A8E17\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_56.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_49.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_56.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"If you can summon Spirits you surely know a way to get me home.\"\nmsgstr \"Dacă poți chema spirite, sigur ști o modalitate de a mă duce acasă.\"\n\n#. Key:\t2DE200934F6AC1595216AA8050FF8F30\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_67.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_67.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I won’t work with anything else.\"\nmsgstr \"Nu voi lucra cu altceva.\"\n\n#. Key:\t2FC050C145CB19BD786157988C677AF5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(1).Children.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Bronze key\"\nmsgstr \"Cheie din bronz\"\n\n#. Key:\t30AD4CBE4D6EFD170F43D9852A0CB50C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_108.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_108.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I can’t remember.\"\nmsgstr \"Nu-mi amintesc.\"\n\n#. Key:\t310B95624A8B2179F69A68BE2B0869C2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(4).Children.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(4).Children.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Making Golems?\"\nmsgstr \"Creezi Golemi?\"\n\n#. Key:\t311039514F83A0ED4BE47A98BF5AE48E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_107.Text\n#. Key:\t5D08D2404686BF1E5D48AC8C63096F0D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_104.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_104.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_107.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Thank you Spirit! I will be forever in your debt.\"\nmsgstr \"Mulțumesc Spirit! Voi fi pentru totdeauna în datoria ta.\"\n\n#. Key:\t3140425845B595B02CA8D3B8DBC6CE37\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_38.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_38.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"It's done. They are destroyed.\"\nmsgstr \"Este gata. Sunt distruse.\"\n\n#. Key:\t37835C204E4C4B17F2D55C9B23FD7D1E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_45.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_45.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"There is some kind of a connection between Ruin and the Spirits.\"\nmsgstr \"Există un fel de legătură între Ruină și Spirite.\"\n\n#. Key:\t384F5CB146C9B6E7EFD361964FF11735\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"A spirit of the Unknown was summoned here by a Wizard of another world.\"\nmsgstr \"Un spirit al Necunoscutului a fost chemat aici de către un vrăjitor al altei lumi.\"\n\n#. Key:\t398124A4493A7325B284CA8105354F0C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_35.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_35.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Yet now the only important thing is to finish my golems.\"\nmsgstr \"Acum, singurul lucru important este să-mi termin golemii.\"\n\n#. Key:\t39C014784CA9DF8247D2DDA5587BAB20\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(5).Children.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(5).Children.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Get me home!\"\nmsgstr \"Du-mă acasă!\"\n\n#. Key:\t3CE0431346C222ED2A6729AAEF8026DC\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(6).Children.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(6).Children.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"New body for me\"\nmsgstr \"Corp nou pentru mine\"\n\n#. Key:\t3DFB1F4D4BB673F983C8CDA4E9911BF2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_89.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_89.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Wait a minute! I’ll make something special for you.\"\nmsgstr \"Așteptă un minut! Voi face ceva special pentru tine.\"\n\n#. Key:\t3F7C1850478A14857F4FFD9D41BA39FC\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_87.Text\n#. Key:\t79079CCD4BB2C6244D6D7CB04BD4C42F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_84.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_84.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_87.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Yes, now I remember. Thank you little Spirit for giving my memories back.\"\nmsgstr \"Da, acum îmi amintesc. Mulțumesc spirit mic pentru că mi-am dat amintirile înapoi.\"\n\n#. Key:\t3FAB7E8D4E72D1EED6E11EA54A128836\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(3).Children.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(3).Children.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Copper Key\"\nmsgstr \"Cheie de cupru\"\n\n#. Key:\t419879C24D39534867F656B704C579AC\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_110.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_110.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Even without my memories I liked to talk to her.\"\nmsgstr \"Chiar și fără amintirile mele mi-a plăcut să vorbesc cu ea.\"\n\n#. Key:\t41B08BF1417C041EB3ACAE8C09C44872\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_17.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_17.Children(1).Children.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"They will fall\"\nmsgstr \"Vor cădea\"\n\n#. Key:\t41E19A0C420F2BD87AA91AB475D5BB0C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_128.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_128.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Please, leave me alone now.\"\nmsgstr \"Te rog, lasă-mă în pace acum.\"\n\n#. Key:\t4438EF7A4D77A3314D2B6587DAE664AE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I can fix it!\"\nmsgstr \"Pot s-o rezolv!\"\n\n#. Key:\t46730E7C433AE7B987C61D9DDF0161E2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_52.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_52.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"How do you make Golems then?\"\nmsgstr \"Cum faci Golemi atunci?\"\n\n#. Key:\t4816E7D14B256F62C2AFE0A3D5EC1987\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_113.Text\n#. Key:\tEC59F30D402E177B8C137DAA7A834F1A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_112.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_112.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_113.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I’m looking for three artefacts. Do you know something about them?\"\nmsgstr \"Caut trei artefacte. Ști ceva despre ele?\"\n\n#. Key:\t49E3D8B84BD437A7195CB49B1C91A9B7\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_30.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_30.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"We created too many of them. Always new ones. We forgot about the old ones.\"\nmsgstr \"Am creat prea mulți. Întotdeauna alții noi. Am uitat de cei vechi.\"\n\n#. Key:\t4CDF7F734B65BFB6575D66A2E40B64B6\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"You wonder if Ruin will destroy their World as well...\"\nmsgstr \"Te întrebi dacă și Ruina le va distruge Lumea ...\"\n\n#. Key:\t4FD5FE974E1B8142471F8896818E875C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"What do you need?\"\nmsgstr \"De ce ai nevoie?\"\n\n#. Key:\t5000F3F44A899815A0D341A3494E42AB\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_91.Text\n#. Key:\t6D5127FD45C09B33329F0EB0DDCE67D7\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_93.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_91.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_93.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Thank you!\"\nmsgstr \"Mulțumesc!\"\n\n#. Key:\t50E6C4434BAC5A7F4B2C66BD8DB5E071\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_100.Text\n#. Key:\t64A5DE6941972506C0BECBB55BBE4FE5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_78.Text\n#. Key:\tB07790474D4C124CB72F128AE0FB2CC5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_95.Text\n#. Key:\tEF125F27496303716206D182C1ED460D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_39.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_100.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_39.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_78.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_95.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I think these crystals have something to do with you.\"\nmsgstr \"Cred că aceste cristale au ceva de-a face cu tine.\"\n\n#. Key:\t51C200AD42FCE6888DBF8C8C24A02283\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"It shall be done.\"\nmsgstr \"Se va face.\"\n\n#. Key:\t52D4954E427C666F0F2F4A92F9BCFBC9\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_50.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_50.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I’m sorry but I can’t help you.\"\nmsgstr \"Îmi pare rău, dar nu te pot ajuta.\"\n\n#. Key:\t5B1327C64C77C05C43CD728356DA4EC4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_58.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_58.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Knowledge lost. We are lost.\"\nmsgstr \"Cunoașterea pierdută. Ne-am pierdut.\"\n\n#. Key:\t5E7AD2034CECCF124DA4E19D94B96433\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"It's nothing. Here it is.\"\nmsgstr \"Nu-i nimic. Aici este.\"\n\n#. Key:\t5FB1520B447246A1A8BCD3BDDB44D145\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_65.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_65.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"No.\"\nmsgstr \"Nu.\"\n\n#. Key:\t5FBF0F3F4419A6AD796054841902FA7C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"They can't work together even if they share the same goal.\"\nmsgstr \"Nu pot lucra împreună chiar dacă au același obiectiv.\"\n\n#. Key:\t60609E4049562CF11C05CB8DB96BBBB3\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"What do you mean by 'your creations'?\"\nmsgstr \"Ce vrei să spui prin „creațiile tale”?\"\n\n#. Key:\t635D5E904325D51DFF19A1A862A3CC0B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_124.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_124.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"The Armour Wrath is no more.\"\nmsgstr \"Armura Mâniei nu mai este.\"\n\n#. Key:\t6585CAC84326A3EEE1682789B7BB3CB6\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_10.Children(2).Children.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_10.Children(2).Children.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Your creation?\"\nmsgstr \"Creația ta?\"\n\n#. Key:\t65C3735740E5D7AF76376AB2B7B05CE9\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(12).Children.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(12).Children.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Leave\"\nmsgstr \"Pleacă\"\n\n#. Key:\t6A460D4A4751398E004298948D630BA4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_47.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_47.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I don’t think I will manage though. It’s already too late. But there is no reason to give up either.\"\nmsgstr \"Nu cred însă că voi reuși. E deja prea târziu. Dar nu există niciun motiv să renunți.\"\n\n#. Key:\t6DC280B64766B5CB2049409B2F73CDB4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_40.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_40.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Is there a way I can help you?\"\nmsgstr \"Există un mod în care te pot ajuta?\"\n\n#. Key:\t6DD3D7804417850FE8504286DD2B5D95\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_96.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_96.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"More Crystal? That's very kind.\"\nmsgstr \"Mai mult cristal? E foarte drăguț.\"\n\n#. Key:\t6E9DB27A4207FFA8409F61AE45282D53\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_41.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_41.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I have found one more crystal.\"\nmsgstr \"Am mai găsit încă un cristal.\"\n\n#. Key:\t717452044F194A1C30FA3C8FBB94C9BF\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_73.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_73.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I’ll see what I can do.\"\nmsgstr \"Voi vedea ce pot face.\"\n\n#. Key:\t74670AB34D1A75913013BE8EE7C0B961\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_72.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_72.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I’ve already destroyed them.\"\nmsgstr \"Le-am distrus deja.\"\n\n#. Key:\t752F67A54FA433AA588175AA7C64E367\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_43.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_43.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I try to create the perfect Golem. The one which resists Ruin.\"\nmsgstr \"Încerc să creez Golemul perfect. Cel care rezistă la Ruină.\"\n\n#. Key:\t775C2189498804DBED7D81AB3EFEC96F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(11).Children.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(11).Children.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Lillian\"\nmsgstr \"Lillian\"\n\n#. Key:\t78C78DDD456328181EBCC78B20F9573D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_122.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_122.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Some of them are still out there.\"\nmsgstr \"Unii dintre ei sunt încă acolo.\"\n\n#. Key:\t7C7D08C340B478A9420331AD355B1FA5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_15.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_15.Children(1).Children.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Like you?\"\nmsgstr \"Ca și tine?\"\n\n#. Key:\t7DCEFFEC46523960D1453DA93F36CAA5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_111.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_111.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I don’t know why but I feel in some way you are bound to her.\"\nmsgstr \"Nu știu de ce, dar simt într-un fel că ești legat de ea.\"\n\n#. Key:\t7F44BD934784D4F3AA2C85985489590A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"A Wizard? So now the Human Realm's people are messing with Golem Technology.\"\nmsgstr \"Un Vrăjitor? Acum, oamenii Regatului Uman se joacă cu Tehnologia Golemilor.\"\n\n#. Key:\t80871D9C4CF37B5F2E7101B8A2565D73\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_70.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_70.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"It’s not safe for me to walk outside.\"\nmsgstr \"Nu este sigur pentru mine să ies afară.\"\n\n#. Key:\t83ACDDA4415211102DBE099F178B228B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_15.Children(2).Children.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_15.Children(2).Children.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"You mean Ruin\"\nmsgstr \"Vrei să spui Ruina\"\n\n#. Key:\t86B4FC23463D5507B11C3F826ADF6C7C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_10.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_10.Children(1).Children.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Spirit in a ball\"\nmsgstr \"Spiritul într-o minge\"\n\n#. Key:\t88A6486843FEC6A2125F79B8AED93F74\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_99.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_99.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Now there is only a few missing.\"\nmsgstr \"Acum lipsesc doar câțiva.\"\n\n#. Key:\t8C2169FA47F83CA62B19F083EFC398F5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_26.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_26.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"That is me. And what are you creature?\"\nmsgstr \"Acela sunt eu. Și ce ești tu creatură?\"\n\n#. Key:\t8CC8368441F2CCDB0E7B22916F8A0622\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_88.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_88.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Getting back some of my lost knowledge also makes me feel happy.\"\nmsgstr \"Dacă îmi iau înapoi o parte din cunoștințele mele pierdute mă face să mă simt fericit.\"\n\n#. Key:\t8E3399DA4F904AD46476418817CD78C4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_62.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_62.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Metal binds the will of the spirits. Rock is a bit less cruel but still weakens your will.\"\nmsgstr \"Metalul leagă voința spiritelor. Piatra este ceva mai puțin crudă, dar îți slăbește totuși voința.\"\n\n#. Key:\t8F4BB43A4656EAD257920492E10BC764\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_130.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_130.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Yes, they bring back some of my memories.\"\nmsgstr \"Da, adu-mi înapoi unele amintiri.\"\n\n#. Key:\t8F9DF3254A02EFF2E623DB91935A1529\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_123.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_123.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Come back when you found all of them.\"\nmsgstr \"Întoarce-te când le-ai găsit pe toate.\"\n\n#. Key:\t97EE3A1B4AD2EB2E7ED2D1B1427E4A2A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_25.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_25.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"It's only me trying to recreate the perfect Golem.\"\nmsgstr \"Doar eu încerc să recreez Golemul perfect.\"\n\n#. Key:\t99BCAE80415145460126B08933AE6242\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_118.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_118.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"One of the artefacts is close.\"\nmsgstr \"Unul dintre artefacte este aproape.\"\n\n#. Key:\t9A05FD0845F9149CEB6EB8889EB9A686\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"That won't happen.\"\nmsgstr \"Nu se va întâmpla asta.\"\n\n#. Key:\t9B7BB6624923813EBF68C9BCE9FF8E49\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"There is nothing else I could say. See you later!\"\nmsgstr \"Nu puteam spune nimic altceva. Ne vedem mai târziu!\"\n\n#. Key:\t9BEA36B448EC18A9280A5AAB78A46898\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_42.Text\n#. Key:\tD3AE25EC49FA7D2C78C1A382E5A01F28\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_37.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_37.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_42.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Why are you making Golems? What would you like to achieve?\"\nmsgstr \"De ce faci Golemi? Ce ai vrea să obții?\"\n\n#. Key:\t9CC2CAF14E5C04555E7329B6EA5082E0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(0).Children.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Armour Wrath\"\nmsgstr \"Armura Mâniei\"\n\n#. Key:\t9EF4681A48ED6C909A4180BF823544BC\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(8).Children.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(8).Children.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Do you need help?\"\nmsgstr \"Ai nevoie de ajutor?\"\n\n#. Key:\t9F3BC08D46169E8C4BB788893FFDBCD4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_68.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_68.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Yes.\"\nmsgstr \"Da.\"\n\n#. Key:\tA10EF7404139EE7FE638BCA272C0B2CA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_71.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_71.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Destroy them if you can.\"\nmsgstr \"Distrugeți dacă poți.\"\n\n#. Key:\tA13C1A6B4F187C1A3F682088B9CC9A6F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_23.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_23.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Didn't look too intelligent to me...\"\nmsgstr \"Nu mi s-a părut prea inteligent ...\"\n\n#. Key:\tA28429434B394861A6E4D084CE5C243F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_61.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_61.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I could but I don’t think you would like it.\"\nmsgstr \"Aș putea, dar nu cred că ți-ar plăcea.\"\n\n#. Key:\tA2CBB6914F66C9963AFD34A21378EAA7\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_103.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_103.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"With this last one I have all my memories back.\"\nmsgstr \"Cu aceasta utimul mi-am revenit toate amintirile.\"\n\n#. Key:\tA33780CE4B9EABF54F612DBFCEB4B890\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I wonder if they will end like us.\"\nmsgstr \"Mă întreb dacă se vor termina ca noi.\"\n\n#. Key:\tA47024E844A13837A8FFFBB1EFA65633\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_44.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_44.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Though I forgot the reason.\"\nmsgstr \"Deși am uitat motivul.\"\n\n#. Key:\tA4E91A924BA53F0A000CDB9FC351DDBA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_60.Text\n#. Key:\tB4F5B2E6479E0E1ACDADD8A40E21FB98\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_59.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_59.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_60.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Could you create a stronger body for me?\"\nmsgstr \"Ai putea crea un corp mai puternic pentru mine?\"\n\n#. Key:\tA50F6A7B4A65712F990406B84E2AE072\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_98.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_98.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Thank you! I remember more and more.\"\nmsgstr \"Mulțumesc! Îmi amintesc din ce în ce mai mult.\"\n\n#. Key:\tA586F33F460BD066761AAEBD18666F78\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_82.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_82.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Bring me more so that I can remember!\"\nmsgstr \"Adu-mi mai mult, ca să-mi amintesc!\"\n\n#. Key:\tA8A9ACBA47419C57AAA06098F7F91AD3\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_83.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_83.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Let me touch it! Hmmm...\"\nmsgstr \"Lasă-mă să o ating! Hmmm ...\"\n\n#. Key:\tAA5F0D5541366675A1D1819FDBDFA569\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"What happened to you?\"\nmsgstr \"Ce ți s-a întâmplat?\"\n\n#. Key:\tAD380C5F4F549229611DD9A79C7CD07E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_79.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_79.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"She was from the Human Realm. I liked her better than the other human.\"\nmsgstr \"Era din tărâmul uman. Mi-a plăcut mai bine decât celălalt om.\"\n\n#. Key:\tAE0D1C714FFCFCA51ACCD3A01D6C7FF5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_125.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_125.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Yes, I felt his presence disappearing.\"\nmsgstr \"Da, am simțit prezența lui dispărând.\"\n\n#. Key:\tAE6B02664FEE60818E0D32B7939907F8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_106.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_106.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Now I have all my memories back.\"\nmsgstr \"Acum îmi amintesc toate amintirile.\"\n\n#. Key:\tB7638E004540ADC59420A5AA614C225D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_75.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_75.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I’ve destroyed the Golems near the Tomb.\"\nmsgstr \"Am distrus Golemii de lângă Mormânt.\"\n\n#. Key:\tB86428C143F7BBBC4A7B9A91C05F3D15\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"They are doomed.\"\nmsgstr \"Sunt sortiți.\"\n\n#. Key:\tBB7DE71F44FE995BA4AF4C9F5E19961F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_46.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_46.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I try to create an Essence which resists Ruin. If it works it could stop Ruin.\"\nmsgstr \"Încerc să creez o Esență care rezistă ruinei. Dacă funcționează, ar putea opri Ruina.\"\n\n#. Key:\tBCF49E21489280A32F859B9A6C2A78D4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"What are you creature?\"\nmsgstr \"Ce ești tu creatură?\"\n\n#. Key:\tBDEEB7C2474E308C66B832B41D839FC6\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_66.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_66.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Metal is good for spirits. Even rock is dangerous.\"\nmsgstr \"Metalul este bun pentru spirite. Chiar și piatra este periculoasă.\"\n\n#. Key:\tC0CAE1B14D0B0E551B690FB9F178A6EE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(10).Children.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(10).Children.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Memory Crystals\"\nmsgstr \"Cristale de Memorie\"\n\n#. Key:\tC86A03B046B8F005B1C91EB0F68E4C1E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_121.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_121.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Here, take this! It might help if you need to face my creature!\"\nmsgstr \"Aici, ia asta! S-ar putea să te ajute dacă ai nevoie să înfrunți creatura mea!\"\n\n#. Key:\tCA35E144421C5594346DC9954052E633\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_57.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_57.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"No way home.\"\nmsgstr \"Nici o cale spre casă.\"\n\n#. Key:\tCD223717428DAF54F5362BB744B6A633\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_53.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_53.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I reuse the old golems. Maybe that’s why I can’t succeed.\"\nmsgstr \"Reutilizez golemi vechi. Poate de aceea nu pot reuși.\"\n\n#. Key:\tD06BA0C54CAA8E00ECAFBE9FAFBABE1F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Could you merge these iron pieces?\"\nmsgstr \"Ai putea îmbina aceste bucăți de fier?\"\n\n#. Key:\tD237C8514A69E0A7820941B9048B92DE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_90.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_90.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Here it is!\"\nmsgstr \"Aici este!\"\n\n#. Key:\tD2CEAC3040B9EBE5A98F249F60A7DAAA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(2).Children.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(2).Children.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Iron Key\"\nmsgstr \"Cheia de Fier\"\n\n#. Key:\tD935FD314471404BAECA54BC3227D6E2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_69.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_69.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"There are too many unsuccessful golems.\"\nmsgstr \"Există prea mulți golemi nereușiți.\"\n\n#. Key:\tDE3287A345E1E317061B45B64AAA0836\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_34.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_34.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Your words remind me of something. Something which was important.\"\nmsgstr \"Cuvintele tale îmi amintesc de ceva. Ceva important.\"\n\n#. Key:\tDEC8E5D548AECD6D48B449B51967301B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_115.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_115.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"One is guarded by my worst creation.\"\nmsgstr \"Unul este păzit de cea mai proastă creație a mea.\"\n\n#. Key:\tDEFA219E40FE5384D8B1F0A1CFD3AAD4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_80.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_80.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"She were... She said...\"\nmsgstr \"A fost ... A spus ...\"\n\n#. Key:\tE13D5CCE41818BAC4A6E52A965B0AEF8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_101.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_101.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Look at this!\"\nmsgstr \"Uită-te la asta!\"\n\n#. Key:\tE1CB9ABE410B3C818283BB9325F3A456\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_32.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_32.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I create golems. You go on with your quest. Nothing else matters.\"\nmsgstr \"Eu Creez golemi. Continuă cu căutarea ta. Altceva nu contează.\"\n\n#. Key:\tE2AAAA4648BE8A7E73C761BDF72EC82D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_54.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_54.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Ruin caused too much damage.\"\nmsgstr \"Ruina a provocat pagube prea mari.\"\n\n#. Key:\tE483CAFF4F7EF5607AA0A58F47EEF892\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_31.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_31.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"You are right. We are what we do. That keeps us alive.\"\nmsgstr \"Ai dreptate. Suntem ceea ce facem. Asta ne ține în viață.\"\n\n#. Key:\tE9899191454A678E7C61B0A55047A725\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_126.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_126.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I'm glad you managed to defeat him and yet...\"\nmsgstr \"Mă bucur ca ai reușit sa îl învingi și totuși ...\"\n\n#. Key:\tEA08D7B74E94A3D91DC825945916C312\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_102.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_102.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"One more Crystal for you!\"\nmsgstr \"Încă un Cristal pentru tine!\"\n\n#. Key:\tEAF5836D4D35812F14EABFA43C849947\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_117.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_117.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I know what you are up to. I would like to help but I fear I can’t do much.\"\nmsgstr \"Știu ce faci. Aș dori să ajut, dar mă tem că nu pot face multe.\"\n\n#. Key:\tEB0F70894E9A498111B9A9824589633B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I create Golems. I always did. I designed the most intelligent ones.\"\nmsgstr \"Eu creez Golemi. Întotdeauna am făcut-o. Le-am proiectat pe cele mai inteligente.\"\n\n#. Key:\tF0A1D18E463DCD0CADD67690F691481B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_27.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_27.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"There are some seeking a way to stop Ruin. They don't care about using spirits as slaves.\"\nmsgstr \"Există unii care caută o modalitate de a opri Ruina. Nu le pasă să folosească spiritele ca sclavi.\"\n\n#. Key:\tF10E8A9243616A85F71C01B0E57A2CC8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_105.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_105.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"And this is for you!\"\nmsgstr \"Și asta este pentru tine!\"\n\n#. Key:\tF62B033A4054241E561B519B2AFFEBDB\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Do you mean those moving rock things out there?\"\nmsgstr \"Vrei să spui ca pietrele alea care se mișcă acolo?\"\n\n#. Key:\tF783A4F44E12EDA97EDF08B60228ED06\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_109.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_109.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"She had heart, she cared about what’s going on here. For the others we were like some interesting study.\"\nmsgstr \"Avea inimă, îi păsa de ce se întâmplă aici. Pentru ceilalți am fost ca un studiu interesant.\"\n\n#. Key:\tF87968784C67FEEEBB78DBAD9D3C13F3\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_63.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_63.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"As for other materials I have no experience. Trust me you don’t want me to test out something on you for the first time.\"\nmsgstr \"Cât despre alte materiale nu am experiență. Crede-mă că nu vrei să testez ceva pe tine pentru prima dată.\"\n\n#. Key:\tF9B8793C470BFE672214E1B82AE01B4E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_24.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_24.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Knowledge is lost. We are all lost.\"\nmsgstr \"Cunoașterea este pierdută. Cu toții suntem pierduți.\"\n\n#. Key:\tF9DB2D444ADAC7A5C22AEC914EC7955F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(7).Children.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(7).Children.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Artefacts\"\nmsgstr \"Artefacte\"\n\n#. Key:\tFE7749AB4C91684B3438E7A1B5BF32D9\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_29.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_29.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"They can't do as they plan. Some of them don't even believe Ruin.\"\nmsgstr \"Nu pot face așa cum intenționează. Unii dintre ei nici măcar nu cred în Ruină.\"\n\n#. Key:\tFF2914834A91E2B6E8696FA828FC9F94\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_120.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_120.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Though it is guarded by the worst Golem I ever made: the Armour Wrath...\"\nmsgstr \"Deși este păzit de cel mai rău Golem pe care l-am făcut vreodată: Armura Mâniei ...\"\n\n#. Key:\t303FE4BA4765B90E9239FEB43AE2264C\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/DwarvenCatacombs/DO1Altar.DO1Altar:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Wizard/DwarvenCatacombs/DO1Altar.DO1Altar:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_DO1Altar\"\nmsgid \"Under section 1 of the first Act, an action of worship can not be aimed at any entity, god or divinity other than the Law itself.\"\nmsgstr \"În conformitate cu secțiunea 1 a primului act, o acțiune de închinare nu poate fi orientată către nicio entitate, zeu sau divinitate în afară de Legea însăși.\"\n\n#. Key:\t73BA4B474C4DCF6CD31469A9FF120D58\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/DwarvenCatacombs/DO1Altar1.DO1Altar1:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Wizard/DwarvenCatacombs/DO1Altar1.DO1Altar1:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_DO1Altar1\"\nmsgid \"Under section 2 of the first Act... ??? There is section 3 of the first act, one would assume.\"\nmsgstr \"În conformitate cu secțiunea 2 din primul act ... ??? Există secțiunea 3 a primului act, cineva ar presupune.\"\n\n#. Key:\t0D939EC3462DBDE895AD9F80CD4A9B99\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/DwarvenOutpost/DO1Arrive1DeadDwarves.DO1Arrive1DeadDwarves:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Wizard/DwarvenOutpost/DO1Arrive1DeadDwarves.DO1Arrive1DeadDwarves:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_DO1Arrive1DeadDwarves\"\nmsgid \"So they were the dwarfs who lived here.\"\nmsgstr \"Deci au fost piticii care au locuit aici.\"\n\n#. Key:\t6E27805A491B0E0DEAC36F9189CA33F9\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/DwarvenOutpost/DO1Arrive1DeadDwarves.DO1Arrive1DeadDwarves:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Wizard/DwarvenOutpost/DO1Arrive1DeadDwarves.DO1Arrive1DeadDwarves:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_DO1Arrive1DeadDwarves\"\nmsgid \"I'm not sure why but I feel a bit of sorrow for them.\"\nmsgstr \"Nu sunt sigur de ce, dar simt un pic de întristare pentru ei.\"\n\n#. Key:\t7AD20FC74D56D0EE48CB5F92804EDAE5\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/DwarvenOutpost/DO1Arrive1DeadDwarves.DO1Arrive1DeadDwarves:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Wizard/DwarvenOutpost/DO1Arrive1DeadDwarves.DO1Arrive1DeadDwarves:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_DO1Arrive1DeadDwarves\"\nmsgid \"I wonder how you can tell them apart.\"\nmsgstr \"Mă întreb cum le poți diferenția.\"\n\n#. Key:\tA6EB230647E9F8D38877FCA10CDE4875\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/DwarvenOutpost/DO1Arrive1DeadDwarves.DO1Arrive1DeadDwarves:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Wizard/DwarvenOutpost/DO1Arrive1DeadDwarves.DO1Arrive1DeadDwarves:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_DO1Arrive1DeadDwarves\"\nmsgid \"I knew these ones. That's Gwin and Traga, there's Krug...\"\nmsgstr \"Îi știam pe acestea. Acesta este Gwin și Traga, acolo este Krug ...\"\n\n#. Key:\t2858D4314420FB59E8BDC18DB625DC1F\n#. SourceLocation:\t/Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_6.SpeechSequence(1).SpeechSequence.Text\n#: /Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_6.SpeechSequence(1).SpeechSequence.Text\nmsgctxt \"Dialogue_DO1Gate\"\nmsgid \"I think you may mistranslated a word or two...\"\nmsgstr \"Cred că s-ar putea să traduceți greșit un cuvânt sau două ...\"\n\n#. Key:\t2C08483A26080F0A003A02ADBE7A7D64\n#. SourceLocation:\t/Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_7.SpeechSequence(2).SpeechSequence.Text\n#: /Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_7.SpeechSequence(2).SpeechSequence.Text\nmsgctxt \"Dialogue_DO1Gate\"\nmsgid \"Dwarven letters are so similar...\"\nmsgstr \"Literele piticilor sunt atât de similare ...\"\n\n#. Key:\t2C09D69026080F0A003A02ADBE7A7D4E\n#. SourceLocation:\t/Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_8.SpeechSequence(2).SpeechSequence.Text\n#: /Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_8.SpeechSequence(2).SpeechSequence.Text\nmsgctxt \"Dialogue_DO1Gate\"\nmsgid \"Dwarven language is stupid, these signs could mean anything!\"\nmsgstr \"Limba pitică este o prostie, aceste semne ar putea însemna orice!\"\n\n#. Key:\t3D6EF5724190CE0AE579D69677BB8EAE\n#. SourceLocation:\t/Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_DO1Gate\"\nmsgid \"Associate!\"\nmsgstr \"Asociază!\"\n\n#. Key:\t4758A32043FC23B4DC3D82B35EFB0D24\n#. SourceLocation:\t/Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_DO1Gate\"\nmsgid \"The Doors of Dwar — Lord of Dwartown. Speak, associate, and enter.\"\nmsgstr \"Ușille lui Dwarf - Lord al Dwartown. Vorbiți, asociați și intrați.\"\n\n#. Key:\t475CE3E94BA77F7596A7D8931D4D16C7\n#. SourceLocation:\t/Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_7.SpeechSequence(1).SpeechSequence.Text\n#: /Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_7.SpeechSequence(1).SpeechSequence.Text\nmsgctxt \"Dialogue_DO1Gate\"\nmsgid \"Are you sure that is what you just read?\"\nmsgstr \"Ești sigur că asta ai citit?\"\n\n#. Key:\t530C8841437C531647717B8B0BC07210\n#. SourceLocation:\t/Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_8.SpeechSequence(1).SpeechSequence.Text\n#: /Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_8.SpeechSequence(1).SpeechSequence.Text\nmsgctxt \"Dialogue_DO1Gate\"\nmsgid \"Nice try...\"\nmsgstr \"Bună încercare...\"\n\n#. Key:\t543858DE49FD03BF4F94C3BA47912E5E\n#. SourceLocation:\t/Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_9.SpeechSequence(1).SpeechSequence.Text\n#: /Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_9.SpeechSequence(1).SpeechSequence.Text\nmsgctxt \"Dialogue_DO1Gate\"\nmsgid \"I have to practice my Dwarven a bit more...!\"\nmsgstr \"Trebuie să exersez ceva mai mult limba Piticilor ...!\"\n\n#. Key:\t5923FB9C4DC255ABAA6059B64B806802\n#. SourceLocation:\t/Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_6.SpeechSequence(3).SpeechSequence.Text\n#: /Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_6.SpeechSequence(3).SpeechSequence.Text\nmsgctxt \"Dialogue_DO1Gate\"\nmsgid \"I am going to open this door somehow.\"\nmsgstr \"Voi deschide cumva această ușă.\"\n\n#. Key:\t7CF38D834DB6A7265EDE19AD158BFEBF\n#. SourceLocation:\t/Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_7.SpeechSequence(0).SpeechSequence.Text\n#: /Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_7.SpeechSequence(0).SpeechSequence.Text\nmsgctxt \"Dialogue_DO1Gate\"\nmsgid \"I want a Schnauser with my Wienerschnitzel\"\nmsgstr \"Vreau un Schnauser cu Wienerschnitzel\"\n\n#. Key:\t86311C104780BDB8A170538987EF7226\n#. SourceLocation:\t/Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_8.SpeechSequence(0).SpeechSequence.Text\n#: /Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_8.SpeechSequence(0).SpeechSequence.Text\nmsgctxt \"Dialogue_DO1Gate\"\nmsgid \"And on the day the Ball is set free, the gate opens and happiness finds everyone...\"\nmsgstr \"Și în ziua în care Mingea este libera, poarta se deschide și fericirea îi găsește pe toți ...\"\n\n#. Key:\tCD68B2244B57CA37D2940499F440149B\n#. SourceLocation:\t/Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_DO1Gate\"\nmsgid \"Associwhat?\"\nmsgstr \"Asociace?\"\n\n#. Key:\tCE8E75E6422C068794CC91BDBA2C024A\n#. SourceLocation:\t/Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_6.SpeechSequence(2).SpeechSequence.Text\n#: /Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_6.SpeechSequence(2).SpeechSequence.Text\nmsgctxt \"Dialogue_DO1Gate\"\nmsgid \"Damn, my Dwarven is just not good enough, I have to practice a bit more...\"\nmsgstr \"La naiba, înțelesul Limbi Piticilor nu este suficient de bună, trebuie să exersez un pic mai mult ...\"\n\n#. Key:\tCED9C6ED4B792FA939C759A79E4AB028\n#. SourceLocation:\t/Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_6.SpeechSequence(0).SpeechSequence.Text\n#: /Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_6.SpeechSequence(0).SpeechSequence.Text\nmsgctxt \"Dialogue_DO1Gate\"\nmsgid \"There is sauerkraut in my Lederhosen\"\nmsgstr \"În sauerkraut-ul meu există varză\"\n\n#. Key:\tEC493B624D127AB87692BC983023FF18\n#. SourceLocation:\t/Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_7.SpeechSequence(3).SpeechSequence.Text\n#: /Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_7.SpeechSequence(3).SpeechSequence.Text\nmsgctxt \"Dialogue_DO1Gate\"\nmsgid \"There must be a way to open this door...\"\nmsgstr \"Trebuie să existe un mod de a deschide această ușă ...\"\n\n#. Key:\t6F5AF3DD4E848650EE74449420A90A25\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/DwarvenCatacombs/DO1Tomb.DO1Tomb:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Wizard/DwarvenCatacombs/DO1Tomb.DO1Tomb:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_DO1Tomb\"\nmsgid \"These are the orders of the Chancellor of Dwartown, unjustly murdered by order of Duality.\"\nmsgstr \"Acestea sunt ordinele Cancelarului din Dwartown, ucis pe nedrept de ordinul dualității.\"\n\n#. Key:\t949EBB7A4FCEA61BB9B3589CFCC53C2B\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/DwarvenCatacombs/DO1Tomb1.DO1Tomb1:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Wizard/DwarvenCatacombs/DO1Tomb1.DO1Tomb1:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_DO1Tomb1\"\nmsgid \"Here lies the testament of the order of Duality, justly murdered by the Chancellor of Dwartown's spirit.\"\nmsgstr \"Aici se află testamentul oridinului Dualității, doar ucis de către Cancelarul spiritului Dwartown.\"\n\n#. Key:\t110A2E27493EBAD78EE6E1B16F56912A\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E3/E3_Start.E3_Start:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E3/E3_Start.E3_Start:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_E3_Start\"\nmsgid \"I survived the Unknown. I know how to use the Device, but...\"\nmsgstr \"Am supraviețuit Necunoscutului. Știu cum să folosesc dispozitivul, dar ...\"\n\n#. Key:\t2CB853A540A2B5BFD268DEAA124CEAD0\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E3/E3_Start.E3_Start:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Ending/E3/E3_Start.E3_Start:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_E3_Start\"\nmsgid \"I need to choose one last time. Once and for all.\"\nmsgstr \"Trebuie să aleg ultima dată. Odată pentru totdeauna.\"\n\n#. Key:\t416D47B6408622D8D01F61961C80ADD2\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E3/E3_Start.E3_Start:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E3/E3_Start.E3_Start:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_E3_Start\"\nmsgid \"I have already lost almost everything.\"\nmsgstr \"Am pierdut deja aproape totul.\"\n\n#. Key:\t75F863B843B253E3586DE991CDE546EA\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E3/E3_Start.E3_Start:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Ending/E3/E3_Start.E3_Start:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_E3_Start\"\nmsgid \"And here I am again. Is this how it will end?\"\nmsgstr \"Și iată-mă din nou. Așa se va termina?\"\n\n#. Key:\t77BC194943A148967299F68B3522C696\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E3/E3_Start.E3_Start:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Ending/E3/E3_Start.E3_Start:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_E3_Start\"\nmsgid \"Do I really have to lose everyone I met in the Ruined Realm?\"\nmsgstr \"Chiar trebuie să îi pierd pe toți pe care i-am cunoscut pe tărâmul ruinat?\"\n\n#. Key:\tA50B792A4D68EC45BB9C3CBBF8836021\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E3/E3_Start.E3_Start:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Ending/E3/E3_Start.E3_Start:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_E3_Start\"\nmsgid \"Or would I only save them so that we can die together?\"\nmsgstr \"Sau i-aș salva doar pentru a putea muri împreună?\"\n\n#. Key:\tE43A08E14831EBDC50AFC0B4A3178817\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E3/E3_Start.E3_Start:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Ending/E3/E3_Start.E3_Start:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_E3_Start\"\nmsgid \"I can hear the people outside the tower. I don’t have much time.\"\nmsgstr \"Pot să aud oamenii din afara turnului. Nu am mult timp.\"\n\n#. Key:\t042B7F534C07B3EC75BA9BA8F0BA7926\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_5.Children(0).Children.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_5.Children(0).Children.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"Worthy?\"\nmsgstr \"Vrednic?\"\n\n#. Key:\t05E334DE42BAA89837B78B8F0F1CBD93\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"Get some rest and try again later.\"\nmsgstr \"Stai și odihneștete și încearcă din nou mai târziu.\"\n\n#. Key:\t0BD769F745B35A106C7C0A83F6F9F246\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"All right so you just teleported me to this... what is this place?\"\nmsgstr \"Bine, așa că m-ai teleportat până aici ... ce este acest loc?\"\n\n#. Key:\t0C9ECC3745963AB1D1FB6487E97513F9\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_24.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_24.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"So right now this is the most proper place to test your Worthiness.\"\nmsgstr \"Deci, acum este acesta cel mai potrivit loc pentru a-ți testa demnitatea.\"\n\n#. Key:\t1401CBDA425076C6AE74C9BF4558D8DD\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"You are not Worthy!\"\nmsgstr \"Nu ești demn!\"\n\n#. Key:\t21C3C1394F39821BC10FFFBE157AC5CF\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"Giving up is not an option.\"\nmsgstr \"Renunțarea nu este o opțiune.\"\n\n#. Key:\t2E7222EA4858A0ADE9CE3C84CA27B993\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_5.Children(3).Children.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_5.Children(3).Children.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"Skip\"\nmsgstr \"Treci Peste\"\n\n#. Key:\t31BEA1764BA337B32B8038B31BE69C29\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"Farewell! I need to go now.\"\nmsgstr \"Rămas bun! Trebuie sa plec acum.\"\n\n#. Key:\t36B9EA924E623AFE9BF0B98402235EA4\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"Focus on the trial!\"\nmsgstr \"Concentrează-te pe proces!\"\n\n#. Key:\t4A4A86684E5C5742A70FE383461AD89C\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"Venture further down into the Sewer! You will find the answer.\"\nmsgstr \"Aventurează-te mai jos în canalizare! Vei găsi răspunsul.\"\n\n#. Key:\t54CA97394FDC12D0370C54995094819E\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"This trial will test your limits!\"\nmsgstr \"Acest proces îți va testa limitele!\"\n\n#. Key:\t5D820AA647AE2540DE6C2D8D6F6BF88A\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_5.Children(4).Children.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_5.Children(4).Children.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"Give seat\"\nmsgstr \"Dă loc\"\n\n#. Key:\t5F6629ED4E0857BBBA46ED9C51306215\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_5.Children(2).Children.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_5.Children(2).Children.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"Restore\"\nmsgstr \"Reînoiește\"\n\n#. Key:\t618B587743F2F432D9D487AE0E909166\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"What?\"\nmsgstr \"Ce?\"\n\n#. Key:\t61D61006436DD6659A8846932697971A\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"Yes, you are!\"\nmsgstr \"Da, ești!\"\n\n#. Key:\t6225912A49C32068D10ADB9C31A6BA3E\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"Of course!\"\nmsgstr \"Desigur!\"\n\n#. Key:\t7DD5FF4D47DF6A461D44DDBA056A4100\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"I shall yield you to the right path!\"\nmsgstr \"Te voi da pe calea cea bună!\"\n\n#. Key:\t8C3F3A364544B13A2C6687A99E6A792B\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"I'm fed up with your trial! Just teleport me back.\"\nmsgstr \"Sunt sătul de proba ta! Doar teleportează-mă înapoi.\"\n\n#. Key:\t903D03CE41FD835E75059587288D9A1B\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_23.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_23.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"There used to be an Arena here to test the Adventurers of the Realm, but it has been flooded with water for a hundred years.\"\nmsgstr \"Aici exista o Arenă pentru a testa aventurierii tărâmului, dar a fost inundată cu apă timp de o sută de ani.\"\n\n#. Key:\t96C9A8DA496C0A8476E35AB942BE5EED\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"Am I Worthy?\"\nmsgstr \"Sunt demn?\"\n\n#. Key:\t9826B62E48A67772A1850CADF1A83729\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_5.Children(1).Children.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_5.Children(1).Children.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"Where are we?\"\nmsgstr \"Unde suntem?\"\n\n#. Key:\t9A94E4FC46E3896BE05136A2A9EA4AF5\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_27.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_27.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"We don't have time for this now.\"\nmsgstr \"Nu avem timp pentru asta acum.\"\n\n#. Key:\t9B9B02AF404F9B8B9D8722A9006FC907\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"These are the remnants of the Ancient Sewer.\"\nmsgstr \"Acestea sunt rămășițele Canalizării Antice.\"\n\n#. Key:\tAAB9F101475D1407B58BECB2DA5E508D\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"So how am I supposed to complete your Trial?\"\nmsgstr \"Deci, cum trebuie să termin proba ta?\"\n\n#. Key:\tAD3BADD6499C01410511E68C86F337C8\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"Your Worthiness has to be proven.\"\nmsgstr \"Demnitatea ta trebuie dovedită.\"\n\n#. Key:\tC0BA510B4875AD24C53663B01964B309\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"Go now, the Trial awaits you!\"\nmsgstr \"Du-te acum, te așteaptă provocarea!\"\n\n#. Key:\tC252181740C4E256EDEB29B6B552BDD2\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"I'm tired, I will need some time to recover.\"\nmsgstr \"Sunt obosit, voi avea nevoie de ceva timp pentru a mă recupera.\"\n\n#. Key:\tCCD8D1DD4859B067482612A3A9F32C06\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_5.Children(5).Children.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_5.Children(5).Children.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"Leave\"\nmsgstr \"Pleacă\"\n\n#. Key:\tCE0C3EBD41F17E82F8CF0E8D5E5E9F17\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"The Worthiness is strong in this one...\"\nmsgstr \"Demnitatea este puternică în acesta...\"\n\n#. Key:\tD229B47146585D051BEFF493C53ED01B\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_26.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_26.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"Stop!\"\nmsgstr \"Stop!\"\n\n#. Key:\tF043B1BF47F617255071EC9DB44CB78A\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"You have proven yourself Worthy!\"\nmsgstr \"Te-ai dovedit demn!\"\n\n#. Key:\tFBBCA0E043F139F203D62DAD1599143E\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"Your Worthiness has been proven again!\"\nmsgstr \"Demnitatea ta a fost dovedită din nou!\"\n\n#. Key:\tFE4F99AC4F23760ADD203083CA1497E3\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_25.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_25.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"I have found a...\"\nmsgstr \"Am găsit un ...\"\n\n#. Key:\t00AD8B3D44461E4DBF800F92DDF0C6F5\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_Gatekeeper_AfterBattle\"\nmsgid \"What?! I understand that for a new gate to open one would have to prove something, but... in this case... I accept that...\"\nmsgstr \"Ce?! Am înțeles că pentru ca o nouă poartă să se deschidă va trebui să demonstreze ceva, dar ... în acest caz ... accept asta ...\"\n\n#. Key:\t0EC6953C4F07CFF6B7A13A9BCF224550\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_Gatekeeper_AfterBattle\"\nmsgid \"Enough!\"\nmsgstr \"Destul!\"\n\n#. Key:\t237714F14DC3F9D33F10E6B7761E47C4\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_Gatekeeper_AfterBattle\"\nmsgid \"What a coincidence! I also happen to be heading in that direction.\"\nmsgstr \"Ce coincidență! De asemenea, se întâmplă să mă îndrept în această direcție.\"\n\n#. Key:\t28054AA74F9CEA976E653ABF5A5F5695\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_Gatekeeper_AfterBattle\"\nmsgid \"You can pass.\"\nmsgstr \"Poți trece.\"\n\n#. Key:\t3D5BAB214968DBB31BE03EBE32B2DE6C\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_Gatekeeper_AfterBattle\"\nmsgid \"Farewell my Ball Lord! May the Great Gate open for you when the time comes!\"\nmsgstr \"Adio, Domnul meu Minge! Fie ca Marea Poartă să se deschidă când va veni vremea!\"\n\n#. Key:\t4D497F814F476FFA7F2A66A937EAFF3E\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_Gatekeeper_AfterBattle\"\nmsgid \"Noooooo...\"\nmsgstr \"Nuuuuuu...\"\n\n#. Key:\t4FEA82084C2E2E09FE6699B2FB353E04\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_Gatekeeper_AfterBattle\"\nmsgid \"Could you just let me pass? Please?\"\nmsgstr \"M-ai putea lăsa să trec? Te rog?\"\n\n#. Key:\t50005F6248946893250282B0B7D134F2\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_Gatekeeper_AfterBattle\"\nmsgid \"You have proved your Worthiness.\"\nmsgstr \"Ți-ai dovedit demnitatea.\"\n\n#. Key:\t601E1BAC4E9C7A93B7A97AA787C14027\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_Gatekeeper_AfterBattle\"\nmsgid \"Farewell, Keeper!\"\nmsgstr \"Adio, Portare!\"\n\n#. Key:\t758788864E716DB2EC9F57B3042DC129\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_Gatekeeper_AfterBattle\"\nmsgid \"Ask him to take you to Crossroad Cave.\"\nmsgstr \"Roagă-l să te ducă la Peștera de la Intersecție.\"\n\n#. Key:\t8170CF2C42A1894899BA98B33AB39A3F\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_Gatekeeper_AfterBattle\"\nmsgid \"Wait! What?\"\nmsgstr \"Așteptă! Ce?\"\n\n#. Key:\t86B7E3D34F2206BB44B0F88001F9E8BA\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_Gatekeeper_AfterBattle\"\nmsgid \"Then if you accept, let the trial begin!\"\nmsgstr \"Atunci, dacă accepți, începe procesul!\"\n\n#. Key:\tCC7215014B87E0910413F1AEECE0492F\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_Gatekeeper_AfterBattle\"\nmsgid \"Where do you want to go, Sir? Command me.\"\nmsgstr \"Unde vrei să mergi, domnule? Ordonă-mi.\"\n\n#. Key:\tD5FBCE5C4C97766EF3A852A2D96D1D30\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_Gatekeeper_AfterBattle\"\nmsgid \"Crossroad Cave!\"\nmsgstr \"Peștera de la Intersecție!\"\n\n#. Key:\tE0032A09440BDE56BFAF2CBDBCFA2074\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_Gatekeeper_AfterBattle\"\nmsgid \"So be it!\"\nmsgstr \"Așa să fie!\"\n\n#. Key:\tE8148F28483300CCD24473A30C028235\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_Gatekeeper_AfterBattle\"\nmsgid \"Once you have proven Worthy.\"\nmsgstr \"Odată ce te-ai dovedit demn.\"\n\n#. Key:\t0BE62CA44198CAA4B4AF7D844B79EEC3\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_3.Children(2).Children.Text\n#. Key:\t17D2B5D7409FBE7F215265B5A8CBF8F8\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_21.Children(2).Children.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_21.Children(2).Children.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_3.Children(2).Children.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"Leave\"\nmsgstr \"Pleacă\"\n\n#. Key:\t2BFD355626080F0A003A025ABE793045\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_21.Children(0).Children.Text\n#. Key:\t2BFEA3D826080F0A003A025ABE79300B\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_3.Children(0).Children.Text\n#. Key:\t2C027C7626080F0A003A025ABE793F5F\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_18.Children(0).Children.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_18.Children(0).Children.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_21.Children(0).Children.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_3.Children(0).Children.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"Accept Challenge\"\nmsgstr \"Acceptă Provocarea\"\n\n#. Key:\t2EDD3BEF4707FD59FE1ACB9A105F7EFC\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_3.Children(1).Children.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_3.Children(1).Children.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"Give seat\"\nmsgstr \"Dă loc\"\n\n#. Key:\t4E4229704C95B2C73050E1AF65A29847\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"Did you come back to prove yourself?\"\nmsgstr \"Ai revenit să te dovedești?\"\n\n#. Key:\t55B70B0345422648BB579C8D4E42FE86\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_18.Children(1).Children.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_18.Children(1).Children.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"Maybe later\"\nmsgstr \"Poate mai târziu\"\n\n#. Key:\t62E33EC84A508E57233A6A9AF6DCDFBC\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"Only if you prove yourself worthy one more time.\"\nmsgstr \"Doar dacă te dovedești demn încă o dată.\"\n\n#. Key:\t65A8C3BA420B4624960CBAB42930BB5F\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_13.Children(0).Children.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_13.Children(0).Children.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"Not fair\"\nmsgstr \"Nu e corect\"\n\n#. Key:\t688C407641B488D0FDC7F98D0F6CA826\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"Is that... is this really happening?\"\nmsgstr \"Oare asta ... se întâmplă cu adevărat?\"\n\n#. Key:\t77A739594D7ADA997DD300A7EE270D8F\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"I have found a seat that fits your size.\"\nmsgstr \"Am găsit un scaun care să se potrivească dimensiunilor tale.\"\n\n#. Key:\t8C9BCD2044EE9C5F4826D0B5C5CE22D4\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"Now... are you ready to prove yourself?\"\nmsgstr \"Acum ... ești pregătit să te dovedești?\"\n\n#. Key:\t8E33C12A42E9EAEDC20CD3B97F3AF9B2\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"Yes, I can.\"\nmsgstr \"Da, pot.\"\n\n#. Key:\t91849BD64325E5B9D8A366921D4D1AA9\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"The best challenges were set aside just for you!\"\nmsgstr \"Cele mai bune provocări au fost puse deoparte doar pentru tine!\"\n\n#. Key:\t97D5940549A753A94A9F5AB46CCE14AF\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"I myself shall test your worthiness.\"\nmsgstr \"Eu însumi îți voi testa vrednicia.\"\n\n#. Key:\t9A158FA74FF1D9F99F5477856927AC90\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"I will make no exceptions! Your generous act gave me back my spirit. From now on I pledge to perform my task even better.\"\nmsgstr \"Nu voi face excepții! Actul tău generos mi-a dat înapoi spiritul meu. De acum înainte mă angajez să îmi îndeplinesc și mai bine sarcina.\"\n\n#. Key:\tA3863AD64404451005ECE392B123FFAE\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"Errr... maybe a bit later.\"\nmsgstr \"Errr ... poate un pic mai târziu.\"\n\n#. Key:\tAB2F0FFA45E0AF42B6035FA3D1F2D8DB\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"I am truly impressed. I will never forget about your kindness.\"\nmsgstr \"Sunt cu adevărat impresionat. Nu voi uita niciodată de bunătatea ta.\"\n\n#. Key:\tB284259646C0236570CF489DDCD88A29\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"Are you ready to prove yourself?\"\nmsgstr \"Ești pregătit să te dovedești?\"\n\n#. Key:\tB57F0D0442C167DADE576A9CBD2B3E96\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"Thank you! You can have this RuneStone as a compensation.\"\nmsgstr \"Mulțumesc! Poți salva această Piatra Runică drept compensare.\"\n\n#. Key:\tB5F8117A4514A4207059EF8CD1C59420\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"All right, let's do it!\"\nmsgstr \"Bine, hai să o facem!\"\n\n#. Key:\tC7DFED0F43E17F90C02E3D94D6F24200\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"What? Can't you just open that gate?\"\nmsgstr \"Ce? Nu poți deschide poarta aceea?\"\n\n#. Key:\tCC1CBB8E4F710B337B3BCC8CB01DB8CE\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"Well that's very... kind of you, I guess.\"\nmsgstr \"Păi, e foarte ... generos, cred.\"\n\n#. Key:\tDE0225744DA0777DC12392ABB187D653\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"Keeper! Can you open a Portal?\"\nmsgstr \"Portar! Poți să deschizi un portal?\"\n\n#. Key:\tDF53D02F4A6CD307A559E5BADBEF22FA\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_13.Children(1).Children.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_13.Children(1).Children.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"You are welcome\"\nmsgstr \"Cu plăcere\"\n\n#. Key:\tF0A6481A46B5FC65944D35ABFE94FA7E\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_21.Children(1).Children.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_21.Children(1).Children.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"Give Seat\"\nmsgstr \"Dă Loc\"\n\n#. Key:\tFF3C850143B6609D7B1B878B8DEB8A13\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"This is your final trial.\"\nmsgstr \"Acesta este proba ta finală.\"\n\n#. Key:\t018CF7BC4272B09AF7B646B0F9B2EB11\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_55.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_55.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"How did it happen? How was everything destroyed?\"\nmsgstr \"Cum s-a întâmplat? Cum a fost distrus totul?\"\n\n#. Key:\t0BF674C94942E4E32FCB09BD7E7059B0\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_23.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_23.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"Those who stayed died.\"\nmsgstr \"Cei care au rămas au murit.\"\n\n#. Key:\t1BFE1DBE471281F60970F8BEBFDD6E40\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"It’s nice of the Mirror that he still remembers me. Could you give this flower to him to express my thankfulness?\"\nmsgstr \"Este minunat că Oglinda faptul că încă își mai amintește de mine. Ai putea să dai această floare pentru a-mi exprima mulțumirea?\"\n\n#. Key:\t2158D7A1470944D529FF138AB883DC10\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"Who lived in this Realm? Where are they now?\"\nmsgstr \"Cine a trăit pe acest tărâm? Unde sunt ei acum?\"\n\n#. Key:\t2CCCBA97402EEFD5248D929680B0FF01\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_26.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_26.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"What was the Realm like before?\"\nmsgstr \"Cum era Tărâmul înainte?\"\n\n#. Key:\t32DA4503499D5A01CB1E7DA7B51B4EB5\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_29.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_29.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"Majestic castles and towers up until the sky. The air fresh, the sun shining.\"\nmsgstr \"Castele și turnurile maiestuoase până la cer. Aerul proaspăt, soarele strălucind.\"\n\n#. Key:\t35903E9F471EECEC779D879565E189B6\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_12.Children(1).Children.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_12.Children(1).Children.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"Who lived here?\"\nmsgstr \"Cine a locuit aici?\"\n\n#. Key:\t3AD2CA8148AA6397B3D8818063269D67\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_14.Children(1).Children.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_14.Children(1).Children.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"No way\"\nmsgstr \"În nici un caz\"\n\n#. Key:\t3D4AF37842FD602384F0C79F2949BD07\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_14.Children(0).Children.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_14.Children(0).Children.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"Of course\"\nmsgstr \"Desigur\"\n\n#. Key:\t41B0D00048A85B7122834B8F731AA8B4\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_25.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_25.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"Ruin preserves them. They can’t get old and die. Some of them are still visiting these parts of the Realm, but they no longer know what they are looking for.\"\nmsgstr \"Ruina îi păstrează. Ei nu pot îmbătrâni și muri. Unii dintre ei încă mai vizitează aceste părți ale tărâmului, dar nu mai știu ce caută.\"\n\n#. Key:\t47D0395F4DD63A6E2F68018719DC2CCD\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"Thank you!\"\nmsgstr \"Mulțumesc!\"\n\n#. Key:\t57614F674FD8F9A5CF8CC0AFA4D57F37\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_12.Children(0).Children.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_12.Children(0).Children.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"Magic Mirror\"\nmsgstr \"Oglinda Magică\"\n\n#. Key:\t5B00385B409CA39C5F2AFDA0E75EC4A0\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"I'm not a postman. Find someone else!\"\nmsgstr \"Nu sunt poștaș. Găsește pe altcineva!\"\n\n#. Key:\t5C83B0604CB1616D07BE209C08AE57B6\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_27.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_27.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"It was a wonderful world, full of life and joy.\"\nmsgstr \"Era o lume minunată, plină de viață și bucurie.\"\n\n#. Key:\t66409DBC4D55F6190D6F429F81CE7C0F\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_12.Children(2).Children.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_12.Children(2).Children.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"Realm's past\"\nmsgstr \"Trecutul tărâmului\"\n\n#. Key:\t6728BD15433EBCF47B42DA8D84F3777C\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"I'll remember you!\"\nmsgstr \"Îmi voi aminti de tine!\"\n\n#. Key:\t764C9E864C4C345638C2A2B4019CE5FA\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"Sure, I will deliver the flower!\"\nmsgstr \"Sigur, voi livra floarea!\"\n\n#. Key:\t7F42828D4976A3366581BE9E067F3982\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_24.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_24.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"Those who escaped changed in body and mind.\"\nmsgstr \"Cei care au scăpat s-au schimbat în trup și minte.\"\n\n#. Key:\t858E8AD741D48CFB58B94ABA5A6FCE9A\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"No problem. It doesn’t matter anyway.\"\nmsgstr \"Nici o problema. Nu contează oricum.\"\n\n#. Key:\t86DBF2164E3B1C4057320E8FC526AE5F\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_12.Children(3).Children.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_12.Children(3).Children.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"Cataclysm\"\nmsgstr \"Cataclism\"\n\n#. Key:\t8C0E746A4C00A7B4792706A042588AA3\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_58.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_58.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"Until one day many of the imprisoned spirits broke loose from the golem bodies.\"\nmsgstr \"Până într-o zi, multe dintre spiritele încarcerate s-au desprins de trupurile golemilor.\"\n\n#. Key:\t8DCB54DC429D8E328B791FA18261EBE4\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_30.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_30.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"Until it was all gone.\"\nmsgstr \"Până a dispărut totul.\"\n\n#. Key:\t933737274ACAC51A980A6985E9B985D2\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"I am here so that the past is not forgotten until the very end. Have some rest and remember!\"\nmsgstr \"Sunt aici pentru ca trecutul să nu fie uitat până la sfârșit. Odihnește-te și amintește-ți!\"\n\n#. Key:\t9A6C35C143F4B6845772D4AF6C4C6213\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_56.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_56.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"The Golem Makers went too far. They made thousands and thousands of golems.\"\nmsgstr \"Creatorii de Golemi au mers prea departe. Au făcut mii și mii de Golemi.\"\n\n#. Key:\t9E254E4D4CA6D256A7EC8CA8ADC6EF19\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"Would you like to hear some other tales?\"\nmsgstr \"Ți-ar plăcea să auzi și alte povești?\"\n\n#. Key:\tAC50E6794072B525FD9144AB9B722F74\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_57.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_57.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"They always cared about the new ones and forgot about the obsolete ones.\"\nmsgstr \"Au avut mereu grijă de cele noi și au uitat de cele învechite.\"\n\n#. Key:\tC03F20E6477984A6691145A40535FBBD\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_60.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_60.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"Is there anything else you want me to remember?\"\nmsgstr \"Mai vreți să-mi amintesc ceva?\"\n\n#. Key:\tC9E74A374ED9F47999AA56BD16466899\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"The streets were clear and bright, trees and flowers everywhere.\"\nmsgstr \"Străzile erau limpezi și luminoase, copaci și flori peste tot.\"\n\n#. Key:\tCF0209FF4BC57A750F52F2B3CC710A6E\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"I think it likes you.\"\nmsgstr \"Cred că te place.\"\n\n#. Key:\tD11D82FA4AE733D55DCBA692A2A3C0C7\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"Now they are all gone.\"\nmsgstr \"Acum toți au dispărut.\"\n\n#. Key:\tD88C72AE460756D4B619D7B8F924C7BB\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"Oh, there were many: proud, wise, brave, clever and majestic.\"\nmsgstr \"O, au fost mulți: mândri, înțelepți, curajoși, deștepți și maiestuoși.\"\n\n#. Key:\tDEA408E54892798F0112B0A92EE34D3A\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_12.Children(4).Children.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_12.Children(4).Children.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"Leave\"\nmsgstr \"Pleacă\"\n\n#. Key:\tEA384D06419AAB835765CF8D6ECE6495\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_59.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_59.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"They are what is now called Ruin. The power which is destroying the Realm.\"\nmsgstr \"Ei sunt ceea ce acum se numește Ruină. Puterea care distruge tărâmul.\"\n\n#. Key:\tED8571C94BCCF0F083CAD2A7439C10AA\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"I’ve met with a Magic Mirror who showed a picture of you.\"\nmsgstr \"M-am întâlnit cu o oglindă magică care a arătat imaginea ta.\"\n\n#. Key:\tF5C7F8254D29767753AEA3AB446B9B6E\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"I've got to go now.\"\nmsgstr \"Trebuie să plec acum.\"\n\n#. Key:\tF9E140154471CC466095ADBFF652E94D\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"Ask if you need to know more. I'll remember.\"\nmsgstr \"Întrebă dacă trebuie să ști mai multe. Îmi amintesc.\"\n\n#. Key:\t04527B3745611117185CC09C4CD9018E\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"That’s more like it!\"\nmsgstr \"Așa mai merge!\"\n\n#. Key:\t11C31D4D4DFD60259D68FCB3CD8E641E\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_13.Children(2).Children.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_13.Children(2).Children.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"Retreat\"\nmsgstr \"Retragete\"\n\n#. Key:\t29C3FE594DDD364CEED5EA9304BFAC43\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"How can I prove that I'm worthy?\"\nmsgstr \"Cum pot dovedi că sunt demn?\"\n\n#. Key:\t2BC9EBB6451DB66B7767F1A0B663A06D\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"That’s awful, let’s try it in a different tone.\"\nmsgstr \"Este groaznic, să încercăm pe un ton diferit.\"\n\n#. Key:\t2BD75DF026080F0A003A0178BE75C345\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"Behold traveler!\"\nmsgstr \"Iată călător!\"\n\n#. Key:\t302884BD4A306FB9614C51AF4790FAE4\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_13.Children(0).Children.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_13.Children(0).Children.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"How to prove?\"\nmsgstr \"Cum se dovedește?\"\n\n#. Key:\t370AC3D04CB9F6E443CAC2A8E270F289\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"No problem I don't really want to pass that gate anyway.\"\nmsgstr \"Nici o problemă oricum nu vreau să trec poarta aceea.\"\n\n#. Key:\t4E231ED94F0794AE6342A8A2C7644D51\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"I am the Gatekeeper. I will only open this door if you prove to be worthy.\"\nmsgstr \"Eu sunt Portarul. Voi deschide această ușă doar dacă te dovedești a fi demn.\"\n\n#. Key:\t4F30265A4D22C52371CC8E9E188B2718\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"Open, now!\"\nmsgstr \"Deschide acum!\"\n\n#. Key:\t56B5D73646C6823598232BB3D2577305\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"Ask him to open the door.\"\nmsgstr \"Cere-i să deschidă ușa.\"\n\n#. Key:\t7A52E2E14341A8CDBD77A4A30DDA22E3\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_13.Children(1).Children.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_13.Children(1).Children.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"Please let me in\"\nmsgstr \"Te rog, lasă-mă să intru\"\n\n#. Key:\t835098BD4F5D14FAACF1209850607E04\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_15.Children(0).Children.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_15.Children(0).Children.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"Accept Challenge.\"\nmsgstr \"Acceptă Provocarea.\"\n\n#. Key:\t83E15A3C46A1D2D4CE4FDDBE81130106\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"No way! Nobody can skip the Trial!\"\nmsgstr \"În nici un caz! Nimeni nu poate sări peste Probă!\"\n\n#. Key:\t86D9667C43253BBFFA43E4ABED24369B\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"Still not...\"\nmsgstr \"Încă nu...\"\n\n#. Key:\t94A0124A401BA0CD029255B7D01E087E\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"There is no turning back now. The Trial awaits you!\"\nmsgstr \"Nu se mai întoarce acum. Proba te așteaptă!\"\n\n#. Key:\t964E5DC7491720F8C3EA53936CBC1DEA\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"The Trial will test you!\"\nmsgstr \"Proba te va testa!\"\n\n#. Key:\tA38AC02A4C258F538AC26686207D505F\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"...\"\nmsgstr \"...\"\n\n#. Key:\tABA8061E4F631608D712A0BDBC6D90D1\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"Ah, you can't speak! Hmm... Try now!\"\nmsgstr \"Ah, nu poți vorbi! Hmm ... Încearcă acum!\"\n\n#. Key:\tDA4C66AB4F7798DAD95EC5B83D422A03\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"Could you just let me pass this time?\"\nmsgstr \"M-ai putea lăsa să trec de data asta?\"\n\n#. Key:\tF09A0C3F4BEA6AFBC9EE52AEB6A740AB\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"Open that gate, Keeper!\"\nmsgstr \"Deschide poarta, Portare!\"\n\n#. Key:\tF32B1FEC4BB33670D336D28832F04312\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"I can only open this door for those who prove worthy.\"\nmsgstr \"Pot deschide această ușă decât pentru cei care se dovedesc demni.\"\n\n#. Key:\tFB74F24C4B8C2E6B4368B19D77F71606\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"Please, open the...\"\nmsgstr \"Te rog, deschide...\"\n\n#. Key:\t0BAD4DEA4009823275249FB31070D002\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_7.Children(1).Children.Text\n#. Key:\t2F2169444BBDC9843E1B7DAEDE7F5104\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_4.Children(1).Children.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_4.Children(1).Children.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_7.Children(1).Children.Text\nmsgctxt \"Dialogue_GGGateKeeper2\"\nmsgid \"Leave\"\nmsgstr \"Pleacă\"\n\n#. Key:\t36FDC8384686644248F76B9EF8A22038\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_GGGateKeeper2\"\nmsgid \"Here we go again...\"\nmsgstr \"Iar începem...\"\n\n#. Key:\t3D7557464E3E19A1CF3447B555D4977D\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_GGGateKeeper2\"\nmsgid \"Well, of course.\"\nmsgstr \"Ei bine, desigur.\"\n\n#. Key:\t5463C10D4C56C2CD40338A9E5C33D995\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_GGGateKeeper2\"\nmsgid \"You know the rules.\"\nmsgstr \"Știi regulile.\"\n\n#. Key:\t6E1915BC4A79E949C10BDCAADDA1E481\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_7.Children(0).Children.Text\n#. Key:\tACC5EBF441036AE06D207281CBE054D9\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_4.Children(0).Children.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_4.Children(0).Children.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_7.Children(0).Children.Text\nmsgctxt \"Dialogue_GGGateKeeper2\"\nmsgid \"Accept Challenge\"\nmsgstr \"Acceptă Provocarea\"\n\n#. Key:\tA5CD165646DA7D531D23F7AAE5B0D701\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_GGGateKeeper2\"\nmsgid \"I mean: You shall not pass unless you prove yourself worthy!\"\nmsgstr \"Adică: nu vei trece decât dacă te dovedești demn!\"\n\n#. Key:\tBABC111D4B5743B296E6AD84659E1910\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_GGGateKeeper2\"\nmsgid \"You shall not pass!!\"\nmsgstr \"Tu nu vei trece!!\"\n\n#. Key:\tCAF6CA2C4159145B5FE684995956F155\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_GGGateKeeper2\"\nmsgid \"What?? I thought I will need to prove myself worthy.\"\nmsgstr \"Ce?? Am crezut că va trebui să mă dovedesc demn.\"\n\n#. Key:\t31B0B4214FE4324029BAB2A75CF7D1EA\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/GGSurviverNote.GGSurviverNote:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/GGSurviverNote.GGSurviverNote:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_GGSurviverNote\"\nmsgid \"'I made this statue to give me shelter from the Cataclysm. Only magic can keep it away.'\"\nmsgstr \"„Am făcut această statuie să-mi ofer adăpost de cataclism. Doar magia o poate ține departe. \\\"\"\n\n#. Key:\t852F18354CA9C8D46192CBBD14A325F7\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/GGSurviverNote.GGSurviverNote:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/GGSurviverNote.GGSurviverNote:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_GGSurviverNote\"\nmsgid \"'Cerulean is still safe. I managed to steal the Gem to open the Gate but I can’t use it.'\"\nmsgstr \"„Cerulean este încă în siguranță. Am reușit să fur Bijuteria pentru a deschide Poarta, dar nu o pot folosi. ”\"\n\n#. Key:\tDF72F90C478E18CFE9211C85CEF9ECBF\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/GGSurviverNote.GGSurviverNote:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/GGSurviverNote.GGSurviverNote:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_GGSurviverNote\"\nmsgid \"'I am doomed.'\"\nmsgstr \"„Sunt condamnat”.\"\n\n#. Key:\t04737EC246700D406DAB46BE8091D09C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_1.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_1.Children(0).Children.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Sure\"\nmsgstr \"Desigur\"\n\n#. Key:\t09BB4D9F428A5390E5F2ABA019B3ACDC\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_34.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_34.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Help you?! This is a courthouse not some charity club!\"\nmsgstr \"Te ajut?! Acesta este un tribunal, nu un club de caritate!\"\n\n#. Key:\t0C7D87814BD76EAFE2DCB19B973F0D82\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_52.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_52.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"You know I heavily rely on my abacus. But being a ghost and all I can’t really use it.\"\nmsgstr \"Știi că mă bazez foarte mult pe abacul meu. Dar fiind o fantomă nu pot folosi cu adevărat.\"\n\n#. Key:\t0E3535844D16D540C576AC9889D237C8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"I’m looking for three artefacts. Do you know anything about them?\"\nmsgstr \"Caut trei artefacte. Știți ceva despre ei?\"\n\n#. Key:\t0EB00CBB41338DE6294D6EAC2DE999B4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Actually it’s kinda awesome!\"\nmsgstr \"De fapt, este minunat!\"\n\n#. Key:\t158F86F04D0040AA3D2814A674252E45\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Returning again and again is not a crime but maybe we should reconsider the Law regarding this statement.\"\nmsgstr \"Întoarcerea din nou și din nou nu este o crimă, dar poate ar trebui să reconsideram Legea cu privire la această afirmație.\"\n\n#. Key:\t15D395F84D3DBC3CCBC74988369A74DA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_27.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_27.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"The Law says many things about being dad but nothing about being dead...\"\nmsgstr \"Legea spune multe lucruri despre a fi tată, dar nimic despre a fi mort ...\"\n\n#. Key:\t2487D3CC4FCE404BEC866287E2057B3F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"I can’t rest until the Case is solved.\"\nmsgstr \"Nu mă pot odihni până nu se rezolvă cazul.\"\n\n#. Key:\t2D976CD148FB41389A53ED8E499822B4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_54.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_54.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Could you get me a ghost abacus?\"\nmsgstr \"Could you get me a ghost abacus?\"\n\n#. Key:\t2F25CC2042D67E3AFB6F3FB5E1DF624D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_38.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_38.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Sure whatever...\"\nmsgstr \"Sigur orice ...\"\n\n#. Key:\t344253F4469C163E87496A97C193F0A8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_31.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_31.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"If you found her please escort her to the Room of the Law so that her vicious acts can be judged.\"\nmsgstr \"Dacă ai găsit-o, te rog să o escortezi în Camera Legii, pentru ca actele ei vicioase să poată fi judecate.\"\n\n#. Key:\t34D243A343CDFEA68F2FAB88A4190464\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_5.Children(2).Children.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_5.Children(2).Children.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"You are dead\"\nmsgstr \"Ești mort\"\n\n#. Key:\t367BD6CD40B7364D09A19A9F5F833937\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Could you help me? I'm forced into this Realm by a Wizard.\"\nmsgstr \"Ai putea să ma ajuți? Sunt forțat în acest tărâm de un vrăjitor.\"\n\n#. Key:\t3BD4BD5742532C2DB9536F9540EA3D75\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_32.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_32.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Ah, even the World will be over sooner than all our cases.\"\nmsgstr \"Ah, chiar și Lumea se va termina mai repede decât toate cazurile noastre.\"\n\n#. Key:\t45882C3C4470919D71E321BF5E1183B9\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_56.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_56.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"I've made you a Ghost Abacus.\"\nmsgstr \"Ți-am făcut un abac fantomă.\"\n\n#. Key:\t482C838F4E946005A3E4CAAB80DFE37F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_35.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_35.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"And being a Wizard is strictly forbidden! If I manage to prove you have some connection with that criminal Wizard I will judge you as well!\"\nmsgstr \"Și a fi vrăjitor este strict interzis! Dacă reușesc să dovedesc că ai vreo legătură cu acel vrăjitor criminal, te voi judeca și pe tine!\"\n\n#. Key:\t489CE6C840D8C3430F07FCBC8BAF3F6B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_23.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_23.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"The Law never writes it would be forbidden to be a walking ball. Therefore it is not a problem.\"\nmsgstr \"Legea nu scrie niciodată că ar fi interzis să fie o minge care merge. Prin urmare, nu este o problemă.\"\n\n#. Key:\t512723AF4B51C5A843BEACBEA5427877\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Staring like that is strictly forbidden!\"\nmsgstr \"Privitul așa este strict interzis!\"\n\n#. Key:\t5215675A4B0974C8993858B9F5D6A404\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"The Case of the Gnome traveller. A really complicated one.\"\nmsgstr \"Cazul călătorului Gnome. Una cu adevărat complicată.\"\n\n#. Key:\t6922D9F143A5295C7C2D22A71EA4125B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_29.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_29.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Makes sense...\"\nmsgstr \"Are sens...\"\n\n#. Key:\t74955E464A85ED006FF47894FD09BD28\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_4.Text\n#. Key:\tE7F9297B4FF3956A965042AA9D870A07\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_37.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_37.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"The Law says that.\"\nmsgstr \"Bănuiesc că au uitat să-ți spună, dar timpul de muncă a trecut mult ...\"\n\n#. Key:\t74BCB9E04AB452BA2A11088F25DD2FED\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"I guess they forgot to tell you but work time is long over...\"\nmsgstr \"Bănuiesc că au uitat să-ți spună, dar timpul de muncă a trecut de mult ...\"\n\n#. Key:\t74F34750433EF722E89F8F85A871CE1B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_59.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_59.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Take this as a reward!\"\nmsgstr \"Ia acest lucru ca o recompensă!\"\n\n#. Key:\t766B27FA455983F70AE1F4BA56F4C1B3\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_57.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_57.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"How wondrous! I’m sure this will reduce my research time with years!\"\nmsgstr \"Ce minune! Sunt sigur că acest lucru îmi va reduce timpul de cercetare cu ani!\"\n\n#. Key:\t784D8662443EA775B9554EAEB4C6CB8F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"You are guilty for bouncing too loudly! Just like my uncle...\"\nmsgstr \"Ești vinovat că ai sărit prea tare! La fel ca unchiul meu ...\"\n\n#. Key:\t791A095948CFB22CCAF59EAFC60D74EA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_0.SpeechSequence(1).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_0.SpeechSequence(1).SpeechSequence.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"We had to reread all the rules to find out if there is anything about this.\"\nmsgstr \"A trebuit să recitim toate regulile pentru a afla dacă există ceva în acest sens.\"\n\n#. Key:\t7CBAE1084FC39423BBD706A9F939BB14\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"So what is this case you are working on?\"\nmsgstr \"Deci la ce caz lucrezi?\"\n\n#. Key:\t7DBA70D14A4EDDE22DABBBB75800865A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_5.Children(3).Children.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_5.Children(3).Children.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Help\"\nmsgstr \"Ajutor\"\n\n#. Key:\t7DDD963C45C30134FA79CEAA1834C270\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_1.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_1.Children(1).Children.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"No way\"\nmsgstr \"În nici un caz\"\n\n#. Key:\t7E1EAB78482CF915AF8A96BA8E0A47F1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Just give me some more time and I will prove that you are guilty.\"\nmsgstr \"Dă-mi mai mult timp și voi demonstra că ești vinovat.\"\n\n#. Key:\t7E2FD8D443438BEFF933D1BA0F691A41\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_1.SpeechSequence(2).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_1.SpeechSequence(2).SpeechSequence.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Such a tragic death! Now I need to start everything from the beginning!\"\nmsgstr \"O moarte atât de tragică! Acum trebuie să încep totul de la început!\"\n\n#. Key:\t7EA289C94C6CF1E43AE0B291AD0A1133\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_30.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_30.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Yes, she is a criminal for inhabiting the body of a cat. That is strictly forbidden!\"\nmsgstr \"Da, este o criminală pentru locuirea trupului unei pisici. Asta este strict interzis!\"\n\n#. Key:\t80596D1B4384F83D73655AB76B2FA2D0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Incorrect. It is not.\"\nmsgstr \"Incorect. Nu este.\"\n\n#. Key:\t81C42F5340469CBB4AD780B01E7F02F8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_5.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_5.Children(1).Children.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Case\"\nmsgstr \"Case\"\n\n#. Key:\t830C84A74369239E2839638F8918E086\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_5.Children(4).Children.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_5.Children(4).Children.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Artefacts\"\nmsgstr \"Artefacte\"\n\n#. Key:\t9090EFE44CB8D7F54F996B970D9A97D2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Don’t disturb me!\"\nmsgstr \"Nu mă deranja!\"\n\n#. Key:\t90F79FAC440FB22F0A6BFCABE0963454\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_33.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_33.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"That’s very likely.\"\nmsgstr \"Este foarte probabil.\"\n\n#. Key:\t9600587D4E3C5B6F2C120BBFB9D40D6A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"What?\"\nmsgstr \"What?\"\n\n#. Key:\t96945AA143EF1F1B7CE4C0B8EEE4096F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_51.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_51.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"All right I was just asking. It’s not forbidden. At least in this case.\"\nmsgstr \"Întrebam doar. Nu este interzis. Cel puțin în acest caz.\"\n\n#. Key:\t970DBE99476C7799B4B803B2EECE7E95\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"You are dead. Isn’t that a problem?\"\nmsgstr \"Ești mort. Nu este asta o problemă?\"\n\n#. Key:\t9B06B22F44D389959A3C99924145EAE7\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Do you know a girl called Lillian?\"\nmsgstr \"Cunoașteți o fată care se numește Lillian?\"\n\n#. Key:\t9C1B37574F81FDF4D3F03890504E3490\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Well, to be honest it is.\"\nmsgstr \"Well, to be honest it is.\"\n\n#. Key:\t9EE15BCA450900DEFFB839856BA78E09\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_55.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_55.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"I’ll see what I can do...\"\nmsgstr \"Voi vedea ce pot face...\"\n\n#. Key:\t9F3FBDE041EA6FDB7B30ECA1547E49A0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_0.SpeechSequence(3).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_0.SpeechSequence(3).SpeechSequence.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"We almost finished the process when the Gnome Traveller died of waiting.\"\nmsgstr \"Aproape că am terminat procesul când Piticul Călător a murit de așteptare.\"\n\n#. Key:\tA22CEEE34864BC25EECFF2BAED83789F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_18.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_18.Children(0).Children.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"It is\"\nmsgstr \"Este\"\n\n#. Key:\tA69BCEA14AD8A07AC8CC35871548973A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_5.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_5.Children(0).Children.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Give Abacus\"\nmsgstr \"Dă-i Abacul\"\n\n#. Key:\tA7B9690142A3832182C004A99797AB21\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_26.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_26.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"And how about being dead?\"\nmsgstr \"Și cum e să fii mort?\"\n\n#. Key:\tA7EDDDCF423FF086BC0D0A891D232C87\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_0.SpeechSequence(0).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_0.SpeechSequence(0).SpeechSequence.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"He asked for permission to use the Railway. Which is really unusual. Before him only dwarves used the Railways.\"\nmsgstr \"El a cerut permisiunea de a folosi calea ferată. Ceea ce este cu adevărat neobișnuit. Înaintea lui doar piticii foloseau Căile Ferate.\"\n\n#. Key:\tA9FCBAD04E16A880C3E52AAA35864E35\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Respect the Law!\"\nmsgstr \"Respectă Legea!\"\n\n#. Key:\tAA3210BC4B1C0875817CCDB5F4922AFA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_1.SpeechSequence(0).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_1.SpeechSequence(0).SpeechSequence.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"It’s not that simple. In his testament he asked us to bring his corpse home, on the railway.\"\nmsgstr \"Nu este atât de simplu. În testamentul său ne-a cerut să-i aducem cadavrul acasă, pe calea ferată.\"\n\n#. Key:\tAA9613C041229946AD0033806D77D398\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_49.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_49.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"What can I do for you?\"\nmsgstr \"Cu ce vă pot ajuta?\"\n\n#. Key:\tB2D504404A8475C7EFB445AFDA8597A9\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_5.Children(6).Children.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_5.Children(6).Children.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Leave\"\nmsgstr \"Pleacă\"\n\n#. Key:\tB3A305B84320145E4C0437B7ED50C5B9\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_25.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_25.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"The Law doesn’t forbid walking for balls. I guess you are right then.\"\nmsgstr \"Legea nu interzice mersul pentru mingi. Bănuiesc ca ești ok atunci.\"\n\n#. Key:\tB3E56D56494153D0C17355A59EC3F0E6\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Rest... err... work in peace!\"\nmsgstr \"Odihnește-te ... greș ... muncește în pace!\"\n\n#. Key:\tB69AD6FC4D8373491561CFBCF26C2397\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_1.SpeechSequence(3).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_1.SpeechSequence(3).SpeechSequence.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Could you help me?\"\nmsgstr \"Ai putea să mă ajuți?\"\n\n#. Key:\tBCFFF4F345E59362764C9AA6582C683C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_0.SpeechSequence(2).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_0.SpeechSequence(2).SpeechSequence.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"When we found out there are none, so we needed to create new rules. But for that we had to reread all the existing rules again.\"\nmsgstr \"Când am aflat că nu există, așa că a trebuit să creăm noi reguli. Dar pentru asta a trebuit să recitim din nou toate regulile existente.\"\n\n#. Key:\tC5FDD0A14882D8F74A97B1BD53AFD4FE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_36.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_36.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"I don’t. But keep in mind if they were stolen and you find them you have to give them to the Dwarven King.\"\nmsgstr \"Nu sunt Dar ține minte dacă au fost furate și le găsești că trebuie să le dai Regelui Pitic.\"\n\n#. Key:\tC81E287C4B4EF5B5E77E25A480FC2AEE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_18.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_18.Children(1).Children.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Not at all\"\nmsgstr \"Deloc\"\n\n#. Key:\tCCF4D5D04B8D4C57AAA75ABC5F9A1384\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_50.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_50.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"No, no, no! I have other things to do.\"\nmsgstr \"Nu, nu, nu! Am alte lucruri de făcut.\"\n\n#. Key:\tCD5EF4DE4D29CC774EB5A69A8A65CD95\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_5.Children(5).Children.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_5.Children(5).Children.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Lillian\"\nmsgstr \"Lillian\"\n\n#. Key:\tCFC9A6294B4D0653CA9B3384CBD2BC29\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_58.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_58.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Thank you! Thank you!\"\nmsgstr \"Mulțumesc! Mulțumesc!\"\n\n#. Key:\tCFEFA4DD4AFEF91C834684A49DFB5890\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_39.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_39.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"What crime did the Gnome commit?\"\nmsgstr \"Ce crimă a comis acel Pitic?\"\n\n#. Key:\tD83C186746373C67E8877594AA3523B8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_53.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_53.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"When I touch it my fingers slip past the abacus, I can’t move it.\"\nmsgstr \"Când o ating, degetele alunecă pe lângă abac, nu o pot mișca.\"\n\n#. Key:\tE00518FA4279FE57E9640F9007E4BC35\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_44.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_44.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"I would call that case solved...\"\nmsgstr \"Aș numi acel caz rezolvat ...\"\n\n#. Key:\tE8F4BE4848BE2E257972D09391B0F296\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_1.SpeechSequence(1).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_1.SpeechSequence(1).SpeechSequence.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"We decided that Gnomes can use the Railway, but how about Gnome Corpses? That’s a totally different issue.\"\nmsgstr \"Am decis că Piticii pot folosi căile ferate, dar ce zici de Cadavrele la Pitici? Aceasta este o problemă total diferită.\"\n\n#. Key:\tEB5B1E474DCFFCF9A38190B8FFAB7C50\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"I guess the same rules apply.\"\nmsgstr \"Bănuiesc ca se aplica aceleași reguli.\"\n\n#. Key:\tEB5BFBDC40E1D6A1D5C054AD8B6424FD\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_24.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_24.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Hmmm... Let me see...\"\nmsgstr \"Hmmm ... Lasă-mă să văd ...\"\n\n#. Key:\tEF50A43049824F390D61A3A58D44185A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"And you are a walking ball. Isn’t that a problem?\"\nmsgstr \"Și ești o minge care vorbește. Nu este asta o problemă?\"\n\n#. Key:\t01E5D5DE4524C5AECBE8DAA5A5C3047D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_111.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_111.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Fishy warns you! This path is dangerous! Turn back! Explore other places!\"\nmsgstr \"Peșțele te avertizează! Această cale este periculoasă! Întoarce-te! Explorează alte locuri!\"\n\n#. Key:\t036B0B0E41C74704A5ED648091D58AB0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_65.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_65.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Long story short I almost reached the Outpost when my cargo went into a pothole and my wheel was broken.\"\nmsgstr \"Povestea scurtă aproape că am ajuns în avanpost, când marfa mea a intrat într-o gaură și mi s-a rupt roata.\"\n\n#. Key:\t03B6BE674D69EF12EB862EB77CDC7F57\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_97.Text\n#. Key:\t4475043D4A9CFD057ED34FBB9695EC86\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_113.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_113.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_97.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Then I will give it for 10 Gold Coins.\"\nmsgstr \"Apoi îl voi da pentru 10 monede de aur.\"\n\n#. Key:\t0405D11C4961CFB7941F0F9727F80EAD\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_108.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_108.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"9 Gold I won't go any lower!\"\nmsgstr \"9 Aur nu mă duc mai jos!\"\n\n#. Key:\t069FA4C94559002699885EACD6422FC7\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_115.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_115.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Such an insult! How dare you?\"\nmsgstr \"O astfel de insultă! Cum îndrăznești?\"\n\n#. Key:\t114F9B9345D0965FE6EFC592E29477FE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_54.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_54.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Wohoo! I have some really epic names just for you! Each name costs a Single Gold coin!\"\nmsgstr \"Wohoo! Am câteva nume cu adevărat epice doar pentru tine! Fiecare nume costă o monedă unică de aur!\"\n\n#. Key:\t1164C89641A9E4970985919C8E86936E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(5).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(5).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Help me?\"\nmsgstr \"Ajuta-mă?\"\n\n#. Key:\t11E01CA843185266C441ACBC460A5B06\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_39.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_39.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Do you really want to help me?\"\nmsgstr \"Chiar vrei să mă ajuți?\"\n\n#. Key:\t12F669184834CDC0466BA4A72BE38420\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Oh, you come to visit old Gnory again.\"\nmsgstr \"Oh, ai venit din nou să-l vizitezi pe bătrânul Gnory.\"\n\n#. Key:\t148C738E422B1C7889EF8CAEF1E6D115\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(7).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(7).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Lory\"\nmsgstr \"Lory\"\n\n#. Key:\t14A787EF447C5AD6579ADDB271BD9B7E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_54.Children(2).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_54.Children(2).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Warlorb\"\nmsgstr \"Warlorb\"\n\n#. Key:\t14F4A36B4D34364D1BBB2DAAFA745C41\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_SpeechSequence_0.SpeechSequence(1).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_SpeechSequence_0.SpeechSequence(1).SpeechSequence.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"I so hated them...\"\nmsgstr \"I-am urat atât de mult ...\"\n\n#. Key:\t162A7A25421FFB9B368D60A9BC76FD38\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Oh, the three artefacts! That sounds a bit too ambitious but after all, they can be quite a unique gift for a young ball lady.\"\nmsgstr \"O, cele trei artefacte! Acest lucru sună un pic prea ambițios, dar până la urmă, acestea pot fi un cadou unic pentru o tânără domnișoară minge.\"\n\n#. Key:\t166AAF5241332C7954631F9D568B227B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_46.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_46.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"For everything as well.\"\nmsgstr \"Pentru toate, de asemenea.\"\n\n#. Key:\t19190B2142877E8CBB6F6D8FBB8D2DB1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_42.Text\n#. Key:\t39E546F34A9886487CD938A70468AEC6\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_59.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_42.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_59.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"What?\"\nmsgstr \"Ce?\"\n\n#. Key:\t1AF2DDE74542524EEF19CA9567CFBDAF\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_58.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_58.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"{name}? It still sounds a bit weird, but I think I might like it.\"\nmsgstr \"{name}? Sună încă un pic ciudat, dar cred că mi-ar plăcea.\"\n\n#. Key:\t22D86B8644CA5BFD8D4CA593C5E3A271\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_54.Children(4).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_54.Children(4).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Dr. Ball\"\nmsgstr \"Dr. Minge\"\n\n#. Key:\t2301BDF7421BB3665BED5F92074BB5A2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_84.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_84.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"I’ve found a wheel for you!\"\nmsgstr \"Am găsit o roată pentru tine!\"\n\n#. Key:\t25502F154A957ECD33B65E879E65B48B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_56.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_56.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"That's sad. Come back when you have some!\"\nmsgstr \"Asta e trist. Întoarce-te când ai ceva!\"\n\n#. Key:\t27BF125B4C46E41F58FD45947F1F5CF8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_49.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_49.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Fishy is Fishy!\"\nmsgstr \"Peștele e Pește!\"\n\n#. Key:\t294C4DCC4E8A3A07F15BC8B8C1934BB0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_36.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_36.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"I've got to go now!\"\nmsgstr \"Trebuie să plec acum!\"\n\n#. Key:\t29EEF2B44C1FAE2BBA7518A685FC99B0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"An elixir that makes you attractive to the lady... err... balls?\"\nmsgstr \"Un elixir care te face atractiv pentru doamnă ... err ... mingi?\"\n\n#. Key:\t2A8B24AE4D7C120048DEF2A76FD6D787\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(9).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(9).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Leave\"\nmsgstr \"Pleacă\"\n\n#. Key:\t2AC10A9B434CEADBA53C1F8C1DB0A26D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_41.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_41.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"I have some at my shop for sale!\"\nmsgstr \"Am câteva la magazinul meu de vânzare!\"\n\n#. Key:\t2FCB0CE9458F40E2B6738B93937283D2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_107.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_107.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"See? And I have to listen to him all day!\"\nmsgstr \"Vezi? Și trebuie să-l ascult toată ziua!\"\n\n#. Key:\t303548794492148A0C7CE9961AB48C77\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_92.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_92.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"It's yours for 12 Gold Coins.\"\nmsgstr \"Este al tău pentru 12 monede de aur.\"\n\n#. Key:\t303B74844F6BC0691F880B970403BE91\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_106.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_106.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Then I will give it for 8 Gold Coins.\"\nmsgstr \"Apoi îl voi da pentru 8 monede de aur.\"\n\n#. Key:\t31FAEB004D0A1ED819BEF4BC369D9FD5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_51.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_51.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"I see one of your wagon wheels is broken.\"\nmsgstr \"Văd că una dintre roțile tale de căruță este spartă.\"\n\n#. Key:\t336F7E9E46DDE33326081E937EC0024A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Don’t care about Fishy. He can’t really speak and I’m not sure if he even understands himself.\"\nmsgstr \"Nu-i pasă de Fishy. El nu poate vorbi cu adevărat și nu sunt sigur dacă chiar se înțelege pe sine.\"\n\n#. Key:\t339A52E04EF86F99DE9BCEAA78F29025\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_66.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_66.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"See you later!\"\nmsgstr \"Ne vedem mai târziu!\"\n\n#. Key:\t34076BD4489E7C92D8DCB9BC1668B775\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_6.Text\n#. Key:\t5FC68B30456EA7BB5A381780426E2279\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_73.Text\n#. Key:\t89C71F00406C5A31D196B4994CEBBA22\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_50.Text\n#. Key:\t93A76F294E3B6B5AB77DD5A04E76F681\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_83.Text\n#. Key:\t9C69D11144FA077481C6C9865E6ED34A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_80.Text\n#. Key:\tA28EA457442D0820F3633A8ECACEDC75\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_76.Text\n#. Key:\tCC8A6DB3424E6813002643A97EFE6644\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_50.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_73.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_76.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_80.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_83.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Shut up Fishy!\"\nmsgstr \"Taci Pește!\"\n\n#. Key:\t365CB4EB4F04825B34F4ADB42F238552\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_85.Children(2).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_85.Children(2).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"12 Gold\"\nmsgstr \"12 Aur\"\n\n#. Key:\t3E650BC4417E6A004AF4549F412B1AF4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_26.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_26.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Ehm, ehm...\"\nmsgstr \"Ehm, ehm...\"\n\n#. Key:\t3E904B7D4D5694B715AC268086A4DB2F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_78.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_78.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"I’ve met another merchant called Lory. Is she your sister you talked about?\"\nmsgstr \"Am întâlnit un alt comerciant numit Lory. Este sora ta despre care ai vorbit?\"\n\n#. Key:\t3EB6AD0C4D8896D36393BE878D3D641E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_100.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_100.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"What the holy Coins?! Now I'm getting angry!\"\nmsgstr \"Ce monede sfinte ?! Acum mă enervez!\"\n\n#. Key:\t43099059444ABE91D004D5992065A06F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_7.Text\n#. Key:\t5A2D69454EA8354F3DE4E6BB9D7BD912\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"And Fishy!\"\nmsgstr \"Și Peștele!\"\n\n#. Key:\t43602C93451F3A59EB067ABF7A525D41\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Fishy know about them!\"\nmsgstr \"Peștele știe despre ei!\"\n\n#. Key:\t43C2553447FC63D25E26E79ACE5D7316\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_74.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_74.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"He was a good merchant, so he understood. Business is hard. I always say that for a fair price I would even sell myself.\"\nmsgstr \"Era un bun comerciant, așa că a înțeles. Afacerile sunt grele. Întotdeauna spun că pentru un preț corect chiar m-aș vinde.\"\n\n#. Key:\t477984834246057BF894629ABEA2F0CB\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_116.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_116.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"You know what? 9 Gold Coins! Take it or leave it that's my final offer!\"\nmsgstr \"Știi ce? 9 monede de aur! Luați-o sau lăsați-o, aceasta este oferta mea finală!\"\n\n#. Key:\t477CBB8C451F6255A8A4FAAE8272F700\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_54.Children(5).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_54.Children(5).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Don't buy\"\nmsgstr \"Nu cumpăra\"\n\n#. Key:\t494F3D164E51E73CC76FD689BF2A4435\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_110.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_110.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Then I will give it for 9 Gold Coins.\"\nmsgstr \"Apoi îl voi da pentru 9 monede de aur.\"\n\n#. Key:\t4CBFFCE24BDAFBA592E846A4C6827F21\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_102.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_102.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"All right, you won. I will give it for 11 Gold Coins.\"\nmsgstr \"Bine, ai câștigat. Îl voi da pentru 11 monede de aur.\"\n\n#. Key:\t4D29AE254413D052D6FAA7AA259E2618\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_45.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_45.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"I see you do have a solution for everything.\"\nmsgstr \"Văd că ai o soluție pentru tot.\"\n\n#. Key:\t4EACFFA1414DBB56AA162789D34C76F2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_61.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_61.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Wow, that's magnificent!\"\nmsgstr \"Uau, e minunat!\"\n\n#. Key:\t4F5CF94B464ED01AB43521A56D7C3B13\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_53.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_53.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"I want to buy a new name!\"\nmsgstr \"Vreau să cumpăr un nume nou!\"\n\n#. Key:\t51F2252D44A1B1B8B407938C06378303\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Fishy know a poem.\"\nmsgstr \"Peștele știe o poezie.\"\n\n#. Key:\t540DEA6540589E8E9BD5789F708F1D95\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_85.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_85.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"How much do you charge for it?\"\nmsgstr \"Cât ceri pentru asta?\"\n\n#. Key:\t551FA87F4EC33961257CFBA46B24E39C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_25.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_25.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Oh, holy golden coins please no...\"\nmsgstr \"Oh, sfinte monede de aur, te rog nu ...\"\n\n#. Key:\t55C0627D41EBB98609EDA49E36CE00F3\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_87.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_87.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Tummm-dummm I would sell the whole World but who could possibly buy it?\\r\\nUhhh... Yes?\"\nmsgstr \"Tummm-dummm Aș vinde întreaga lume, dar cine ar putea să o cumpere?\\nUhhh ... Da?\"\n\n#. Key:\t5977C80F49FF140CD397C1A3079F8A4C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_54.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_54.Children(1).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Ultimate Frisbee\"\nmsgstr \"Frisbee Final\"\n\n#. Key:\t5D529690413CAE4F496DF4B7A3627528\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(6).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(6).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Broken wheel?\"\nmsgstr \"Roată spartă?\"\n\n#. Key:\t5D632016493E1D06116399A364FD3835\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_67.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_67.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Take care and don't spend Gold anywhere else!\"\nmsgstr \"Ai grijă și nu cheltui Aurul nicăieri în altă parte!\"\n\n#. Key:\t5F1DF4B44C4E82D6A5FDB6BDF5172AEA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_96.Text\n#. Key:\t9592C2144A7237D49EC42E898AB73642\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_105.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_105.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_96.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"How about 10?\"\nmsgstr \"Ce zici de 10?\"\n\n#. Key:\t6179A2AF43798114CFEE12900CDAF8CA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_60.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_60.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Good choice!\"\nmsgstr \"Bună alegere!\"\n\n#. Key:\t6185906046DAF51843A52FA2FE2CF5AC\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_101.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_101.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"11 Gold Coins! Take it or leave it that's my final offer!\"\nmsgstr \"11 monede de aur! Luați-o sau lăsați-o, aceasta este oferta mea finală!\"\n\n#. Key:\t655C05DA44E2BCB7DCF0D38DFAD6182C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Let him tell the poem!\"\nmsgstr \"Lasă-l să spună poezia!\"\n\n#. Key:\t68761B744A892F85CEDB19B8DD6D9649\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_SpeechSequence_0.SpeechSequence(2).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_SpeechSequence_0.SpeechSequence(2).SpeechSequence.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Then I found out there is a Dwarven Outpost here which is still populated.\"\nmsgstr \"Apoi am aflat că există un Avanpost Pitic aici, care este încă populat.\"\n\n#. Key:\t6D8190E2491C99D14C4E37AA8F01E0BC\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"In Crossroad Cave the three are close.\\r\\nThough where exactly? This poem shows:\\r\\nFor the first one you need to be restless\\r\\nTo avoid the Catacomb death traps.\\r\\nFor the second you need to go down\\r\\nDeep until you reach the ancient fisher town.\\r\\nFor the third one go high and even higher,\\r\\nKeep on til you reach the never sleeping fire.\\r\\n\"\nmsgstr \"În Peștera Crossroad, cei trei sunt aproape.\\nDeși unde exact? Acest poem arată:\\nPentru primul trebuie să fiți neliniștit\\nPentru a evita capcanele de moarte ala Catcombelor.\\nPentru a doua, trebuie să cobori\\nAdânc până când ajungi în orașul pescar antic.\\nPentru cel de-al treilea merge mai sus și chiar mai sus,\\nContinuă până ajungi la focul care nu doarme niciodată.\\n\"\n\n#. Key:\t6F09C2F74E536AB6E4E7D8941571FBDF\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Sure. Shut up Fishy!\"\nmsgstr \"Sigur. Taci Pește!\"\n\n#. Key:\t720870EC444670FB23244D964497F883\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_SpeechSequence_1.SpeechSequence(1).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_SpeechSequence_1.SpeechSequence(1).SpeechSequence.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"However business is business. She is bad for business! Trading with my customers before they could get to me!\"\nmsgstr \"Cu toate acestea, afacerile sunt afaceri. Este proastă pentru afaceri! Tranzacționează cu clienții mei înainte să poată ajunge la mine!\"\n\n#. Key:\t757069804B91FF89516ACDA0C1F59C6A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_103.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_103.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Arrrgh! Fishy please no more poems! My head aches.\"\nmsgstr \"Arrrgh! Pește, te rog, nu mai recita poezii! Mă doare capul.\"\n\n#. Key:\t75A193EA4F6A7EE92BA73D809247B1A1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_62.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_62.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Dr. who? Oh, see, Dr. Ball.\"\nmsgstr \"Dr. Cine? Oh, vezi, Dr. Minge.\"\n\n#. Key:\t75EADAAB4ACE4E6ECE45BFA6611ED77A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_85.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_85.Children(0).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"8 Gold\"\nmsgstr \"8 Aur\"\n\n#. Key:\t7657DDE7438385D8BCC4B08B2BB5881A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_SpeechSequence_0.SpeechSequence(0).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_SpeechSequence_0.SpeechSequence(0).SpeechSequence.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"It all started when I was back with my family. Oh, those peaceful moments!\"\nmsgstr \"Totul a început când mă întorceam cu familia. O, acele momente pașnice!\"\n\n#. Key:\t778E6A484D8669761018F38DF326C125\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_90.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_90.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"It's yours for 8 Gold Coins.\"\nmsgstr \"Este al tău pentru 8 monede de aur.\"\n\n#. Key:\t7A09AFFF435CC002F0B75989307D7791\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Well met dear err... traveler! How can a humble gnome merchant like me be at your service?\"\nmsgstr \"Bine întâlnit dragă, călătorule! Cum poate un umil negustor pitic ca mine să vă stea la dispoziție?\"\n\n#. Key:\t7E964EEC4406A06910B333A0F282360A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_70.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_70.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Sure! She is the lovely lady ball for whom you would like to buy a precious present, right?\"\nmsgstr \"Sigur! Este minunata minge doamnă pentru care ai vrea să cumperi un cadou prețios, nu?\"\n\n#. Key:\t85D756624371CC3B3A37FC84C111DBB0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_54.Children(3).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_54.Children(3).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Sorbcerer\"\nmsgstr \"Sorbcerer\"\n\n#. Key:\t86C8F9B74B869FF4D34CF586AB5AC25E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_20.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_20.Children(1).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Shut up!\"\nmsgstr \"Taci!\"\n\n#. Key:\t8701305446A6E0F5E5EA5F86B823273D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Shut up both of you!\"\nmsgstr \"Tăceți amândoi!\"\n\n#. Key:\t878BA65D462254D8A0FD36BA541E8C70\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_27.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_27.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"The three artefacts - by Fishy:\"\nmsgstr \"Cele trei artefacte - de Pește:\"\n\n#. Key:\t8A136EF74C7DE15BFBC664B8447366F1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(2).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(2).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"I need a name\"\nmsgstr \"Am nevoie de un nume\"\n\n#. Key:\t8C25603A4AE5F2D6294551AD2BA6322D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_40.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_40.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Of course! Are you lost in this hollow realm? Disappointed in all creature kind? Searching for a helpful hand? Not anymore!\"\nmsgstr \"Desigur! Te-ai pierdut pe acest tărâm gol? Dezamăgit în toate tipurile de creaturi? Cauți o mână de ajutor? Nu mai!\"\n\n#. Key:\t90F345C4482C46F4B1CD43B20F01B2B6\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_54.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_54.Children(0).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Epic Sphero\"\nmsgstr \"Sfera Epică\"\n\n#. Key:\t92F1D4A84B3609FDE38C82AD5A314554\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_72.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_72.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"And Fishy is the primitive monster.\"\nmsgstr \"Iar Fishy este monstrul primitiv.\"\n\n#. Key:\t9574E444465834A7D15565A14C7E0F1D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_SpeechSequence_0.SpeechSequence(5).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_SpeechSequence_0.SpeechSequence(5).SpeechSequence.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"My sister sold my brother, so I had enough money to set out.\"\nmsgstr \"Sora mea mi-a vândut fratele, așa că am avut destui bani să-mi încep călătoria.\"\n\n#. Key:\t976FD7AB4B31747EF35E3EBE9C82471F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_69.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_69.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Do you know a girl called Lillian?\"\nmsgstr \"Cunoști o fată care se numește Lillian?\"\n\n#. Key:\t9851A2064648DE26EF4501961D721109\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_68.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_68.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Wake up! He is back!\"\nmsgstr \"Trezește-te! El s-a întors!\"\n\n#. Key:\t99CDA18D43B5FC74E152888E674B743C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_30.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_30.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Let’s talk about something else.\"\nmsgstr \"Hai să vorbim despre altceva.\"\n\n#. Key:\t9A5056F7472381107ACF5F849A322947\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_64.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_64.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Bye!\"\nmsgstr \"Pa!\"\n\n#. Key:\t9B4816554539F6616741FC8A6651FEDD\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_SpeechSequence_1.SpeechSequence(2).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_SpeechSequence_1.SpeechSequence(2).SpeechSequence.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"I will tell her what I think about this that’s for sure!\"\nmsgstr \"Îi voi spune ce cred despre asta, cu siguranță!\"\n\n#. Key:\t9FD161AC488FFD8D9C6BCAB518A6DFCA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_86.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_86.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Hello again!\"\nmsgstr \"Bună din nou!\"\n\n#. Key:\t9FFADAA44EE730442CFD76BBD942F478\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_38.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_38.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Fare thee well!\"\nmsgstr \"Noroc bun!\"\n\n#. Key:\tA0E3F7B44422A97F22E1FCB315DC498A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_48.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_48.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Who are you by the way?\"\nmsgstr \"Who are you by the way?\"\n\n#. Key:\tA3EE773446B69B8D37851BAFAD607A9F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_24.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_24.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Forget your artefacts I have plenty of other valuable items instead!\"\nmsgstr \"Uitați de artefacte. Am o mulțime de alte obiecte valoroase în schimb!\"\n\n#. Key:\tA557A981439B7A1B4AA803941A8D6794\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_23.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_23.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"I guess you don’t know where they are...\"\nmsgstr \"Presupun că nu știi unde sunt ...\"\n\n#. Key:\tA571474F44F33104D2F93386A5C4009C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_75.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_75.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Yet no one ever wanted to buy him for a single copper coin.\"\nmsgstr \"Totuși, nimeni nu a vrut să-l cumpere pentru o singură monedă de cupru.\"\n\n#. Key:\tA67ADB3143798188EF7C1F8D4E59690C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_88.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_88.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Uhhh... Yes?\"\nmsgstr \"Uhhh ... Da?\"\n\n#. Key:\tA69D35084A31B957410EF889ED0EC4A4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_57.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_57.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Yes, yes that's it!\"\nmsgstr \"Da, da, asta este!\"\n\n#. Key:\tAD70372E4A5B0594635FBBBE30CA53F1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_91.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_91.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"It's yours for 10 Gold Coins.\"\nmsgstr \"Este al tău pentru 10 monede de aur.\"\n\n#. Key:\tAE2E742F4A087974019D8F810FF97A2E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_104.Children(0).Children.Text\n#. Key:\tB59E143642BBE2D677AA6F97B46C3C06\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_105.Children(0).Children.Text\n#. Key:\tF0726C6B4F8F780C341F319D08E20CF9\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_96.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_104.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_105.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_96.Children(0).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Ok\"\nmsgstr \"Ok\"\n\n#. Key:\tAF7B14B241CED9B8BE3F23BC8C857A9A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_82.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_82.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Now you can imagine those peaceful moments when they were all together.\"\nmsgstr \"Acum îți poți imagina acele momente pașnice când erau împreună.\"\n\n#. Key:\tB2F8DA594F1A58E8B2FCC7B16C368E21\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"What... uhhh... me?\"\nmsgstr \"Ce ... uhhh ... eu?\"\n\n#. Key:\tBA5B75CD4087B53BB682CD97021FF821\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(3).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(3).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Artefacts\"\nmsgstr \"Artefacte\"\n\n#. Key:\tBBB67671475F19135DCD57AF771F0D85\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_43.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_43.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Helpful hands of course and all kind of stuffs. Equip yourself. Once you get rid of all your gold, you won’t be alone anymore...\"\nmsgstr \"Mâini utile bineînțeles și tot felul de lucruri. Echipează-te. După ce vei scăpa de tot aurul, nu vei mai fi singur ...\"\n\n#. Key:\tBD1AF6114DA5840A340F8DA65B7F59D2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_SpeechSequence_1.SpeechSequence(0).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_SpeechSequence_1.SpeechSequence(0).SpeechSequence.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Yes, she is my beloved sister!\"\nmsgstr \"Da, este sora mea iubită!\"\n\n#. Key:\tBE8F496743A57B5F1AF81B8D48F128FE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Hello there!\"\nmsgstr \"Salutare!\"\n\n#. Key:\tBFA7C31A4443A6C89DB61D8556D62FCD\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(0).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Trade\"\nmsgstr \"Comerț\"\n\n#. Key:\tC29FF9914C8C1F479E9F7BAB338B067A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_77.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_77.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"If you could bring me a new wheel I would pay for it with shiny Gold coins!\"\nmsgstr \"Dacă mi-ai putea aduce o roată nouă, aș plăti-o cu monede de aur strălucitoare!\"\n\n#. Key:\tC5077FC14569C44087272C9E9DE07992\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_34.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_34.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Ok, I’ve got it.\"\nmsgstr \"Bine, am înțeles.\"\n\n#. Key:\tC6F3C52D4719CE471B6EEB90FCE94E3B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_55.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_55.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Unfortunately I don't have enough gold.\"\nmsgstr \"Din păcate nu am suficient aur.\"\n\n#. Key:\tCA1E8A5D4C07A81975C4B4B00572A0C8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_94.Text\n#. Key:\tDB9C0DB146BBE1DFC28F929A37C4408A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_93.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_93.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_94.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Ha-ha-ha! You must be kidding that's ridiculously high!\"\nmsgstr \"Ha-ha-ha! Trebuie să glumești asta este ridicol de mare!\"\n\n#. Key:\tCB792FAD45F78755935423A5219271FC\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_98.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_98.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"9 Gold I won't go any higher!\"\nmsgstr \"9 Aur nu voi merge mai sus!\"\n\n#. Key:\tCE99919C42EC2315EC5B33900FBC09C4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_95.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_95.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"That’s not fair. It would be a shame on me if I just robbed you like that!\"\nmsgstr \"Nu este cinstit. Ar fi păcat pentru mine dacă te-aș jefui așa!\"\n\n#. Key:\tD090388E4529CEC2D70899B520973064\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(4).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(4).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Who are you?\"\nmsgstr \"Cine ești tu?\"\n\n#. Key:\tD0AA81A247BE4979A774F3B6095BB820\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_33.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_33.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"I am Gnory, traveler merchant. I wander the world, seeking rare items, secrets beneath dark doors, revealing truth of forg...\"\nmsgstr \"Sunt Gnory, comerciant călător. Rătăcesc prin lume, căutând obiecte rare, secrete sub uși întunecate, dezvăluind adevărul uitării ...\"\n\n#. Key:\tD23C65EB4F39580A06045FADE2BCD713\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_81.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_81.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"She saw our Realm through cat eyes,\\r\\nThe living fire, the dead ice.\\r\\nShe cared, she took care of us all.\\r\\nWhat was ruined she made it whole.\\r\\nThen she left us, this is how it ended.\\r\\nHer own Realm also needed to be mended.\\r\\n\"\nmsgstr \"Ea a văzut Tărâmul nostru prin ochii de pisică,\\nFocul viu, gheața moartă.\\nA avut grijă, a avut grijă de noi toți.\\nCe s-a stricat a făcut-o întreagă.\\nApoi ne-a părăsit, așa s-a încheiat.\\nDe asemenea, propriul ei tărâm trebuia să fie îngrijit.\\n\"\n\n#. Key:\tD30843A14519A490FEE89E82E3CB6735\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"I’m looking for three artefacts.\"\nmsgstr \"Caut trei artefacte.\"\n\n#. Key:\tD9B70A6A453A11FD2115FFB25CCFF195\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_54.Children(6).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_54.Children(6).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Not enough gold\"\nmsgstr \"Nu este suficient aur\"\n\n#. Key:\tDB8982994F2BFF510A6A2EA1D40C68C6\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_37.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_37.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Good bye!\"\nmsgstr \"La revedere!\"\n\n#. Key:\tDC20CC924E5F898E715B668416678CA1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_104.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_104.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"How about 8?\"\nmsgstr \"Ce zici de 8?\"\n\n#. Key:\tDC989DED42077EBA3313C69150BB33F0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_63.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_63.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"That's a weird name I have to admit.\"\nmsgstr \"Acesta este un nume ciudat trebuie să recunosc.\"\n\n#. Key:\tDEC95D494680878D544FF49DACBDEE4F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_114.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_114.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"11 Gold I won't go any lower!\"\nmsgstr \"11 Aur nu mă duc mai jos!\"\n\n#. Key:\tDF7B371841495C5FB98800BCF44B7C5B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_52.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_52.Children(1).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Skip yack-yack\"\nmsgstr \"Sari peste yack-yack\"\n\n#. Key:\tE1322541414052606F718FBF9B68D4B0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_79.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_79.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Fishy know her.\"\nmsgstr \"Peștele o cunoaște.\"\n\n#. Key:\tE3D668304EE4C7C2E77F3E9AF47CB84E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_SpeechSequence_0.SpeechSequence(4).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_SpeechSequence_0.SpeechSequence(4).SpeechSequence.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Fortunately I had a loving family I could always count on. Since they are all merchants, they could easily help me out.\"\nmsgstr \"Din fericire aveam o familie iubitoare pe care puteam conta întotdeauna. Deoarece sunt negustori, m-ar putea ajuta cu ușurință.\"\n\n#. Key:\tE5031E774F81A45ECB4731BC114AD2E2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_109.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_109.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"All right, no need to get angry! I can give you 9 Gold for it.\"\nmsgstr \"Bine, nu e nevoie să te enervezi! Îți pot da 9 Aur pentru asta.\"\n\n#. Key:\tEBE094644F9C8DCEE025FDBF8346AD47\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_44.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_44.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"...with your problem.\"\nmsgstr \"...with your problem.\"\n\n#. Key:\tEC93512B48219F6BA6DDF5A3F100C19A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Show me what you have for sale!\"\nmsgstr \"Arată-mi ce ai de vânzare!\"\n\n#. Key:\tECF244164CDD4A29C96BBD8E13688FE7\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(1).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Sell Wheel\"\nmsgstr \"Vinde roată\"\n\n#. Key:\tED410B224B09EFF36ED2AC9752AD59DA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_71.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_71.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"No, she is...\"\nmsgstr \"Nu, ea este..\"\n\n#. Key:\tEDE4BF2D448CAFEF217C5E86885A7E81\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_117.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_117.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"All right, you won. I will give it for 9 Gold Coins.\"\nmsgstr \"Bine, ai câștigat. O voi da pentru 9 monede de aur.\"\n\n#. Key:\tEEA209E84766D4AF2BD804A7BA11F111\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_85.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_85.Children(1).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"10 Gold\"\nmsgstr \"10 Aur\"\n\n#. Key:\tEEE19423423A24146446EEBEB04FAEE9\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"I’m on a quest to find...\"\nmsgstr \"Sunt în misiunea de a găsi ...\"\n\n#. Key:\tF53E6D3443D37DA82663D2976AA90A85\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_20.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_20.Children(0).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Poem?\"\nmsgstr \"Poem?\"\n\n#. Key:\tF61EDE3940F24B15BE57D8B5A5AC5570\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_99.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_99.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Deal! Here you go!\"\nmsgstr \"Afacere! Poftim!\"\n\n#. Key:\tF6A527234B894C18C0778C918EB1BA4E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_89.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_89.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Welcome back!\"\nmsgstr \"Welcome back!\"\n\n#. Key:\tF93CBC6640AF6143C7D1C5AA6F8C4ADF\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_52.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_52.Children(0).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Go on\"\nmsgstr \"Continuă\"\n\n#. Key:\tF9EA93DE4B341581745785A7371F797A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(8).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(8).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Lillian\"\nmsgstr \"Lillian\"\n\n#. Key:\tFE3C4C72489A909B4D9F76A483D293AE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_SpeechSequence_0.SpeechSequence(3).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_SpeechSequence_0.SpeechSequence(3).SpeechSequence.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"This was my chance to make a hit as a merchant but I didn’t have the resources for a journey this long.\"\nmsgstr \"Aceasta a fost șansa mea să fac un hit ca comerciant, dar nu am avut resursele pentru o călătorie atât de lungă.\"\n\n#. Key:\tFEF58E5B4FB18D128640689499752F75\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_29.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_29.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Do you call this a poem? Pathetic! Hardly any info and what a miserable structure! Shame on you Fishy!\"\nmsgstr \"Numești asta o poezie? Jalnic! Aproape orice informație și ce structură mizerabilă! Rușine pe tine Pește!\"\n\n#. Key:\tFF66071643E10E94DEFF70B8E20876EE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_52.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_52.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"That's a long and sad story...\"\nmsgstr \"Aceasta este o poveste lungă și tristă ...\"\n\n#. Key:\t1EA717114DFEF4490F58829C2F96566A\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/HW_Candlestick.HW_Candlestick:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E2/HW_Candlestick.HW_Candlestick:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_HW_Candlestick\"\nmsgid \"Even after mom passed the servants kept lighting the candles.\"\nmsgstr \"Chiar și după ce mama a murit, slujitorii continuau să aprindă lumânările.\"\n\n#. Key:\t94195B6E4157A1A8BD74BE9224AEED42\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/HW_Candlestick.HW_Candlestick:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E2/HW_Candlestick.HW_Candlestick:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_HW_Candlestick\"\nmsgid \"After Mom got sick she really feared darkness.\"\nmsgstr \"După ce mama s-a îmbolnăvit, s-a temut cu adevărat de întuneric.\"\n\n#. Key:\tEF9668BF44D4A52E46ACEA8B82011137\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/HW_Candlestick.HW_Candlestick:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Ending/E2/HW_Candlestick.HW_Candlestick:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_HW_Candlestick\"\nmsgid \"We always needed to light the hallway.\"\nmsgstr \"Aveam întotdeauna nevoie să aprindem holul.\"\n\n#. Key:\t2EECB3024693C7F0EA176BB100D6779A\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/HW_Exit.HW_Exit:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E2/HW_Exit.HW_Exit:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_HW_Exit\"\nmsgid \"This door was really rusty.\"\nmsgstr \"Această ușă era foarte ruginită.\"\n\n#. Key:\t3C6E4A1C41A7EACE15C101A65BBE997A\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/HW_Exit.HW_Exit:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Ending/E2/HW_Exit.HW_Exit:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_HW_Exit\"\nmsgid \"I had to do something with it otherwise Father would have heard me.\"\nmsgstr \"A trebuit să fac ceva cu asta altfel Tata m-ar fi auzit.\"\n\n#. Key:\t8F63CC8C44D8F8432A66E6B65EC10AF5\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/HW_Exit.HW_Exit:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E2/HW_Exit.HW_Exit:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_HW_Exit\"\nmsgid \"I used oil on this rusty door. I didn’t want to be heard.\"\nmsgstr \"Am folosit ulei pe această ușă ruginită. Nu voiam să fiu auzit.\"\n\n#. Key:\t55E7DD2B4C3D8852EC4A64AF44443BDA\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/HW_Explosion.HW_Explosion:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Ending/E1/HW_Explosion.HW_Explosion:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_HW_Explosion\"\nmsgid \"What was this? I have to go back to check what happened!\"\nmsgstr \"Ce a fost asta? Trebuie să mă întorc pentru a verifica ce s-a întâmplat!\"\n\n#. Key:\t8060689940824917F595BF84B4E95A46\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/HW_FRDoor.HW_FRDoor:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E2/HW_FRDoor.HW_FRDoor:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_HW_FRDoor\"\nmsgid \"I always wondered why.\"\nmsgstr \"Mereu m-am întrebat de ce.\"\n\n#. Key:\t816B603341386CF6BB3ADCAAD21D68A3\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/HW_FRDoor.HW_FRDoor:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E2/HW_FRDoor.HW_FRDoor:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_HW_FRDoor\"\nmsgid \"Father moved to his workroom and sealed this door.\"\nmsgstr \"Tatăl s-a mutat în sala de lucru și a sigilat această ușă.\"\n\n#. Key:\t125DACD243EA6EBCE76D8CB9F681C727\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/HW_MRDoor.HW_MRDoor:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E2/HW_MRDoor.HW_MRDoor:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_HW_MRDoor\"\nmsgid \"I felt I should have a last look before I go.\"\nmsgstr \"Am simțit că ar trebui să arunc o ultimă privire înainte de a pleca.\"\n\n#. Key:\tE8250D43437C1B1D45637F9499D20936\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/HW_MRDoor.HW_MRDoor:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E2/HW_MRDoor.HW_MRDoor:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_HW_MRDoor\"\nmsgid \"Mom’s room looked just like it was when she was still alive.\"\nmsgstr \"Camera mamei arăta exact ca atunci când era încă în viață.\"\n\n#. Key:\tE0BB63A74E94DA1B327B11BB781EB4DB\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/HW_Painting.HW_Painting:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E2/HW_Painting.HW_Painting:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_HW_Painting\"\nmsgid \"Mom made this painting before she met Father.\"\nmsgstr \"Mama a făcut acest tablou înainte să-l întâlnească pe Tata.\"\n\n#. Key:\tEAD0C13D4BF1D35BDAEC14A3F25901F5\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/HW_Stairs.HW_Stairs:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E2/HW_Stairs.HW_Stairs:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_HW_Stairs\"\nmsgid \"I had to go really softly otherwise Father would have heard me.\"\nmsgstr \"A trebuit să merg cu adevărat încet, altfel tatăl m-ar fi auzit.\"\n\n#. Key:\t0494D36047DDCE114A43C9901618D32B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_44.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_44.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Unfortunately I don't know where you can find them.\"\nmsgstr \"Din păcate nu știu unde le poți găsi.\"\n\n#. Key:\t0C3E31854B0EB053EABAD4B9DC3D8E60\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_57.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_57.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"That’s a serious threat, I have to admit.\"\nmsgstr \"Este o amenințare serioasă, trebuie să recunosc.\"\n\n#. Key:\t0C7C89EB4E610752FBE119AA32B99F8B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_34.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_34.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Yes I know her. She couldn’t come here so she sent her cat.\"\nmsgstr \"Da o știu. Nu a putut veni aici așa că și-a trimis pisica.\"\n\n#. Key:\t0EDE363848C05F39DE478DA7A559CF54\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Could you bring them to me?\"\nmsgstr \"Ai putea să mi-o aduci?\"\n\n#. Key:\t1A914576488DA1393ED641B9F315ABC6\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_53.Text\n#. Key:\t20DA5C2F49DCFADF17F1C983103C0D98\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_29.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_29.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_53.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Thanks!\"\nmsgstr \"Mulțumesc!\"\n\n#. Key:\t1E7EE16F451CAB1193F0B8B3939273AA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_62.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_62.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"I managed to defeat one group of the monsters.\"\nmsgstr \"Am reușit să înving un grup de monștri.\"\n\n#. Key:\t1F5BE4154412819180B1CA92E5B69377\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(6).Children.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(6).Children.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Artefacts\"\nmsgstr \"Artefacte\"\n\n#. Key:\t1FE89B7045E586E988BEC18B06BEEBDB\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(1).Children.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Purple Mushroom\"\nmsgstr \"Ciupercă Mov\"\n\n#. Key:\t208B21DE484E3FE42C9978927BC91E78\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_51.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_51.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Uh... this was impressive!\"\nmsgstr \"Uh ... asta a fost impresionant!\"\n\n#. Key:\t27DF1ABB483B5073D8C87DB48EF2613F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_70.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_70.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Well done!\"\nmsgstr \"Foarte bine!\"\n\n#. Key:\t2892242A4E74642813A30CBAE853B674\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_27.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_27.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Anyway, if you give my Coin back I will apologize.\"\nmsgstr \"Oricum, dacă îmi dai moneda înapoi, îmi voi cere scuze.\"\n\n#. Key:\t290F9EE34FA4EA41FE963CA61358D23B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_49.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_49.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"In theory if I add this to the soup...\"\nmsgstr \"În teorie, dacă adaug asta la ciorbă...\"\n\n#. Key:\t3015DA144833F0401BADE8B5E5F93BA8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_26.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_26.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Huh! Do you think chests are only there so that you can loot them?\"\nmsgstr \"Huh! Crezi că cufărele sunt acolo doar pentru a le putea jefui?\"\n\n#. Key:\t331D8B314DAF15CD7E343BB7459927DD\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Give back my Coin!\"\nmsgstr \"Dă-mi înapoi moneda mea!\"\n\n#. Key:\t345BD57D40E09C73044BB981798E2449\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_43.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_43.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Purple Mushrooms. That’s the only mushroom which is purple. You can’t miss it.\"\nmsgstr \"Ciuperci violet. Aceasta este singura ciupercă care este violet. Nu-l poți rata.\"\n\n#. Key:\t34B1483D4F1C580BB8DB61BEEBC5BC0F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"I saw that you opened my chest!\"\nmsgstr \"Am văzut că mi-ai deschis cufărul!\"\n\n#. Key:\t35DBF2874748AFCC34A3FAAC083EF9A0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_1.SpeechSequence(3).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_1.SpeechSequence(3).SpeechSequence.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"We had the key of the Ancient Temple. According to our prophecies that will fall to Ruin last.\"\nmsgstr \"Am avut cheia Templului Antic. Conform profețiilor noastre aceea va cădea la Ruină ultima.\"\n\n#. Key:\t35FB567B4B09545830D61F84869FC7E7\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Here you go!\"\nmsgstr \"Poftim!\"\n\n#. Key:\t3AAE79234A4BD2F8BCA5F790D5E5D84B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_45.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_45.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"No problem. If I ever find one I will bring it to you.\"\nmsgstr \"Nici o problema. Dacă voi găsi vreodată una, ți-l voi aduce.\"\n\n#. Key:\t3AE46C894A0CD8F1AA049CB9970D65F3\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"I’m the chef and I’m making a soup.\"\nmsgstr \"Eu sunt bucătarul și fac o ciorbă.\"\n\n#. Key:\t3BB405034447D1C80B99A5A23AFC98FC\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"I know you are already hungry but the soup is not yet ready.\"\nmsgstr \"Știu că ești deja flămând, dar ciorba nu este încă gata.\"\n\n#. Key:\t406361704988AD9ABD5DA4AF946451F2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_37.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_37.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"In return Lillian drew pictures for my tales.\"\nmsgstr \"În schimb, Lillian a desenat imagini pentru poveștile mele.\"\n\n#. Key:\t4152700A419F5AE41362D09E21835D98\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_46.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_46.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"I already have some...\"\nmsgstr \"Am deja câteva ...\"\n\n#. Key:\t4355EB74402DDFD5FF8697B1911593E8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_56.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_56.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"I won’t. And I won’t talk to you either.\"\nmsgstr \"Nu voi face Și nici nu o să vorbesc nici cu voi.\"\n\n#. Key:\t43C4F54B4ABBBB13E129148D9AF04976\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(4).Children.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(4).Children.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Village\"\nmsgstr \"Sat\"\n\n#. Key:\t4614DBA24F54CB29C92BA9894849CC39\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_1.SpeechSequence(1).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_1.SpeechSequence(1).SpeechSequence.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Long ago we lived in peace and respected the ancestors. Even though they caused the Cataclysm.\"\nmsgstr \"Cu mult timp în urmă, am trăit în pace și i-am respectat pe strămoși. Chiar dacă au provocat cataclismul.\"\n\n#. Key:\t4687EF7A45E5FC200C806AB829C64D78\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Is this a village? Where are the others?\"\nmsgstr \"Este acesta un sat? Unde sunt ceilalți?\"\n\n#. Key:\t586F6370480889F551923A97FFF5E89C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_0.SpeechSequence(3).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_0.SpeechSequence(3).SpeechSequence.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"They enslaved all the other tribes and forbid us to do our rituals.\"\nmsgstr \"Au înrobit toate celelalte triburi și ne-au interzis să ne facem ritualurile.\"\n\n#. Key:\t5BCF2C5D4CE9AD6AB4A09DB510BA2039\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"You again? Take a seat until the soup is ready!\"\nmsgstr \"Tu din nou? Ia loc până când supa este gata!\"\n\n#. Key:\t63B9B304450B276F0EC714B43A25F09D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"I’m looking for three artefacts. Do you know something about them?\"\nmsgstr \"Caut trei artefacte. Ști ceva despre ele?\"\n\n#. Key:\t63C0EC124C1B42B5C5FD1F95B23B9155\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_65.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_65.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Take this! You deserve it.\"\nmsgstr \"Ia asta! O meriți.\"\n\n#. Key:\t69E0738B489315662A55DA98EAC542E6\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_0.SpeechSequence(4).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_0.SpeechSequence(4).SpeechSequence.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"They used this village to produce Fishy slaves.\"\nmsgstr \"Au folosit acest sat pentru a produce sclavi Pești.\"\n\n#. Key:\t6CBCFFEB48FF8E0D97AAE4B1CB19CB52\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_22.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_22.Children(0).Children.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Give back\"\nmsgstr \"Dă înapoi\"\n\n#. Key:\t6EACCB4D4D91AF29F6452E81E4C01B57\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_32.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_32.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"I see you have a lot of things here. Do you have something for sale?\"\nmsgstr \"Văd că ai multe lucruri aici. Ai ceva de vânzare?\"\n\n#. Key:\t7164FF5D440BCEF18CAC7E9104A324CF\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"I've got to go now!\"\nmsgstr \"Trebuie să plec acum!\"\n\n#. Key:\t75A92D46421FC2601A13B4BBE9BA4D11\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_54.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_54.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Er... I don’t have it. But I will get it back I promise!\"\nmsgstr \"Nu ... nu am. Dar o voi recupera înapoi promit!\"\n\n#. Key:\t761F5734479CFA197266F382FD0A6452\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_23.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_23.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"I’m sorry, I didn’t know it was yours. There are chests like yours everywhere.\"\nmsgstr \"Îmi pare rău, nu știam că este a ta. Există cufere ca ale tale peste tot.\"\n\n#. Key:\t7D87C5064D739F1EFF23AF8264E83235\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Well, this morning. But there are some very special ingredients which make the cook time way shorter.\"\nmsgstr \"Ei bine, în această dimineață. Există însă câteva ingrediente foarte speciale care fac ca gătitul să fie mai scurt.\"\n\n#. Key:\t806AEB764A6118D4CBE9CCA71E98EF10\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_72.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_72.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Have no fear, I'll do it.\"\nmsgstr \"Nu ai teamă, o voi face.\"\n\n#. Key:\t80B60CA848D3C71B72514AAC976C3910\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Yes, the soup! A very special recipe. It takes years to finish.\"\nmsgstr \"Da, ciorba! O rețetă cu totul speciala. Durează ani până se pregătește.\"\n\n#. Key:\t8437D72C44494DE499E528A67B36A123\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_58.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_58.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Ah, it's you again.\"\nmsgstr \"Ah, ești tu din nou.\"\n\n#. Key:\t885F9FDB498EC13B81E22580D33309F3\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(5).Children.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(5).Children.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Kobolds\"\nmsgstr \"Kobolds\"\n\n#. Key:\t8A6043D64FB7B61AF4D553A62D27229C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_36.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_36.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Every time the cat came I told him a tale about the ancestors.\"\nmsgstr \"De fiecare dată când venea pisica îi spuneam o poveste despre strămoși.\"\n\n#. Key:\t8B29FD7342676763EF53ACBB0677A1A4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"The soup still needs time.\"\nmsgstr \"Ciorba mai are nevoie de timp.\"\n\n#. Key:\t8E0F057044AE753D63AA23847B146662\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_67.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_67.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"This is yours.\"\nmsgstr \"Asta e a noastră.\"\n\n#. Key:\t8E4C4FB846539DD46577B490846383F1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_1.SpeechSequence(2).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_1.SpeechSequence(2).SpeechSequence.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"We decided to keep their knowledge in our rituals.\"\nmsgstr \"Am decis să le păstrăm cunoștințele în ritualurile noastre.\"\n\n#. Key:\t9132C2D24A241722115FD5ADB46B3145\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"And when did you start?\"\nmsgstr \"Și când ai început?\"\n\n#. Key:\t958CE12E48F89AE79E5ED9A4FC4AF6E7\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_48.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_48.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"That's wonderful!\"\nmsgstr \"Asta e minunat!\"\n\n#. Key:\t96E5FBCB4795EC1ADACEC7B6D814BD79\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(8).Children.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(8).Children.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Lillian\"\nmsgstr \"Lillian\"\n\n#. Key:\t9845BDB549EF25B9F5C11981123A5CCE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_33.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_33.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"You know I’m not really a trader but I might sell you some of them.\"\nmsgstr \"Știi că nu sunt cu adevărat comerciant, dar aș putea să îți vând unii dintre ei.\"\n\n#. Key:\t9A420B814A1C1762130310AE90157BFD\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_31.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_31.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"No, I’m sorry.\"\nmsgstr \"Nu îmi pare rău.\"\n\n#. Key:\t9D8511F94E19183355A5CC8CE5B562E8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_61.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_61.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"That would be great. I appreciate your kindness.\"\nmsgstr \"Ar fi grozav. Eu apreciez bunătatea ta.\"\n\n#. Key:\t9F2DE60B405A15F2BFB8409D162B42FD\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(3).Children.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(3).Children.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Soup\"\nmsgstr \"Supă\"\n\n#. Key:\tA53CDF2A4D9A582DD163C7B6D3DCE334\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_55.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_55.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Come back when you have my Coin.\"\nmsgstr \"Întoarce-te când ai moneda mea.\"\n\n#. Key:\tA734229B44743F88ED135FB692B9C956\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Do you know a girl called Lillian?\"\nmsgstr \"Cunoști o fată care se numește Lillian?\"\n\n#. Key:\tA88F63334DD550FE9955A3A65B87ACDA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_63.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_63.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"I banished some of the monsters.\"\nmsgstr \"Am alungat o parte din monștri.\"\n\n#. Key:\tA8B5BE484641EBB61B1168AE798DABF5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"So you are making soup...\"\nmsgstr \"Deci faci supă ...\"\n\n#. Key:\tAAE2E35045B8E0DF8A11BF8BC84A11EF\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_0.SpeechSequence(1).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_0.SpeechSequence(1).SpeechSequence.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Every year we made a pilgrimage to the Ancient Temple to express our respect to the ancestors.\"\nmsgstr \"În fiecare an făceam un pelerinaj la Templul Antic pentru a ne exprima respectul față de strămoși.\"\n\n#. Key:\tAC26EB6F49B026C3E768398FA0A445CB\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_50.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_50.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"then...\"\nmsgstr \"apoi...\"\n\n#. Key:\tADE8569E4FC2DCB097FF3FA4B9A0A970\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_40.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_40.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Why not? What do you need?\"\nmsgstr \"De ce nu? De ce ai nevoie?\"\n\n#. Key:\tAE35D91D450D0414FA5F54B71E359511\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(2).Children.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(2).Children.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Who are you?\"\nmsgstr \"Cine ești tu?\"\n\n#. Key:\tAE387E9846A9C5A56569179359AD941C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_42.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_42.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"All right! I was just asking...\"\nmsgstr \"In regulă! Doar întrebam...\"\n\n#. Key:\tAF3D9214401FEEE552256A8BAE5F8E77\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_1.SpeechSequence(4).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_1.SpeechSequence(4).SpeechSequence.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"But now Kobolds are wrathful. They make wars. They don’t respect anyone.\"\nmsgstr \"Însă acum Kobolds sunt mânioși. Ei fac războaie. Nu respectă pe nimeni.\"\n\n#. Key:\tB06407B04855D558D1DB6B9A9A4E0B84\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_1.SpeechSequence(0).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_1.SpeechSequence(0).SpeechSequence.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Kobolds are no longer good.\"\nmsgstr \"Kobolds nu mai sunt buni.\"\n\n#. Key:\tB082CC4B405800544484B4B0C8A25762\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_41.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_41.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"No way!\"\nmsgstr \"No way!\"\n\n#. Key:\tB35F443641A7626AE4552F8D1045A95F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_38.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_38.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"I liked them very much.\"\nmsgstr \"Mi-au plăcut foarte mult.\"\n\n#. Key:\tB40C1B9948722A549DBC45A1D9C277C0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_24.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_24.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"I don’t want to leave my kitchen.\"\nmsgstr \"Nu vreau să-mi părăsesc bucătăria.\"\n\n#. Key:\tB71FB3424C74B68E4B9CF9AF3828F867\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_64.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_64.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"I think I banished all the monsters.\"\nmsgstr \"Cred că am alungat toți monștrii.\"\n\n#. Key:\tB79F2026493F53FE90BABB987370695D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"What do you think honestly? You can just rob me and then come to have a chat?!\"\nmsgstr \"Ce crezi sincer? Că poți să mă jefuiți și apoi să vii la vorbă ?!\"\n\n#. Key:\tB7B8A9294FA8D3754BB4CDA897B696BA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_69.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_69.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Great. The lake is already more peaceful.\"\nmsgstr \"Grozav. Lacul este deja mai pașnic.\"\n\n#. Key:\tB9C3EC7342B52C04A491FF9AE87ABB42\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_0.SpeechSequence(0).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_0.SpeechSequence(0).SpeechSequence.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"This was the Village of my tribe. We lived here in peace.\"\nmsgstr \"Acesta a fost Satul tribului meu. Am trăit aici în pace.\"\n\n#. Key:\tBB45D70A4F2AF94BA7FCC9B3141FB98F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_17.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_17.Children(0).Children.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Accept\"\nmsgstr \"Acceptă\"\n\n#. Key:\tC297D79246A0792DCA2CA9AD693C3A55\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"That’s all.\"\nmsgstr \"Asta e tot.\"\n\n#. Key:\tC375726140A40243E29115B58048025E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_52.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_52.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Hmm... it’s delicious. Here take some!\"\nmsgstr \"Hmm ... este delicios. Aici ia!\"\n\n#. Key:\tC8BC1F254B61D749D62D4B9210DA1891\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"If you came for soup you will need to wait a bit more!\"\nmsgstr \"Dacă ai venit la ciorbă, va trebui să mai aștepți un pic!\"\n\n#. Key:\tCB607C4842DF3781F8B6C9AB1A7D31F1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Where is my Coin?\"\nmsgstr \"Unde este moneda mea?\"\n\n#. Key:\tCE80654A43078EA1E53C5E9C5114DE54\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_60.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_60.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"I can help you banish the monsters around the lake.\"\nmsgstr \"Te pot ajuta să alungi monștrii din jurul lacului.\"\n\n#. Key:\tD1412BF6490EA9357CE9F7A873B1FCAC\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_35.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_35.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"She was really curious about our rituals.\"\nmsgstr \"Era cu adevărat curioasă despre ritualurile noastre.\"\n\n#. Key:\tD76CDC9F410E2BCC21BCFB8D0D8A9E97\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_47.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_47.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"I’ve found some Purple Mushroom!\"\nmsgstr \"Am găsit o ciupercă purpuriu!\"\n\n#. Key:\tD87335EA45EAC6F84022FEBE57F5CADF\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_25.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_25.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Or what? Will you cook me?\"\nmsgstr \"Or what? Will you cook me?\"\n\n#. Key:\tD9B7F3E240430AA5EF537A8F81814751\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_71.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_71.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"I'm glad that the lake is peaceful again. Thank you!\"\nmsgstr \"Mă bucur că lacul este din nou pașnic. Mulțumesc!\"\n\n#. Key:\tE15F80EA40F193E47F372FA7EE9A949E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_0.SpeechSequence(5).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_0.SpeechSequence(5).SpeechSequence.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Now they are gone and I'm alone with the monsters they left here.\"\nmsgstr \"Acum au dispărut și sunt singur cu monștrii pe care i-au lăsat aici.\"\n\n#. Key:\tE3947B064E58A1FD7B96A3956C54415D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_0.SpeechSequence(2).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_0.SpeechSequence(2).SpeechSequence.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"But then other Kobolds came. They called themselves the Great Kobols.\"\nmsgstr \"Dar apoi au venit și alți Kobolds. S-au numit ei Mari Koboli.\"\n\n#. Key:\tE48A1DFB458275188357F5811E98CFD4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_59.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_59.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"And also take this! I could have not done the soup in time without your help.\"\nmsgstr \"Și ia și asta! Nu aș fi putut face supa la timp fără ajutorul tău.\"\n\n#. Key:\tE58EEE904A6CBF1A0E2E768583EB03DC\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(7).Children.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(7).Children.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Trade\"\nmsgstr \"Târguiește\"\n\n#. Key:\tE60B94C04C63F0E074A5B8ABFED7AE62\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_66.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_66.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"I have something for you.\"\nmsgstr \"Am ceva pentru tine.\"\n\n#. Key:\tEA71F6A6412E69C31302A2B57BFD266F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_39.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_39.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Now they are both gone.\"\nmsgstr \"Acum sunt amândoi dispăruți.\"\n\n#. Key:\tECA4BB2D4EB774315D57FD9A5D66CF25\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_22.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_22.Children(1).Children.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Don't give\"\nmsgstr \"Nu da\"\n\n#. Key:\tED97FDEB46CAC89F65734D990569618C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_17.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_17.Children(1).Children.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Decline\"\nmsgstr \"Refuză\"\n\n#. Key:\tEFD0511840178E579287BAB7FA3FDADE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(0).Children.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Banish Monsters\"\nmsgstr \"Alungă Monștrii\"\n\n#. Key:\tF5A08C63415DF9FE007B97931B7A7C31\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(9).Children.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(9).Children.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Leave\"\nmsgstr \"Pleacă\"\n\n#. Key:\tF7EA437842BBD099521D81B87211F49E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_30.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_30.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"I’m the last of my tribe.\"\nmsgstr \"Sunt ultimul din tribul meu.\"\n\n#. Key:\tFC8F235840D6AF4A86170791A617BCA9\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Who are you? What are you doing here?\"\nmsgstr \"Cine ești tu? Ce faci aici?\"\n\n#. Key:\tFF27D3BF4D181753D73AD79D384CD3ED\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"What are you Kobolds like? What are you doing?\"\nmsgstr \"Ce le place la Kobolds? Ce faci?\"\n\n#. Key:\t587277824A24A49F9319D0B452A709AD\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/LB_Device.LB_Device:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Ending/E1/LB_Device.LB_Device:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_LB_Device\"\nmsgid \"Monk wanted me to use this device to separate the Worlds.\"\nmsgstr \"Călugărul voia să folosesc acest dispozitiv pentru a separa Lumile.\"\n\n#. Key:\t83B9F1E146084039E4BAD185B455209C\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LB_Device.LB_Device:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E2/LB_Device.LB_Device:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_LB_Device\"\nmsgid \"With Father we did all we could to make the device perfect. I won’t let us lose so close to the end!\"\nmsgstr \"Cu Tatăl am făcut tot ce am putut pentru ca dispozitivul să fie perfect. Nu ne vom lăsa să pierdem atât de aproape de sfârșit!\"\n\n#. Key:\t90E0E1E44BE9D84FC514248D73A31935\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LB_Device.LB_Device:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Ending/E2/LB_Device.LB_Device:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_LB_Device\"\nmsgid \"Three years of hard work.\"\nmsgstr \"Three years of hard work.\"\n\n#. Key:\tFB8EC2184310BA168B9C6E9DB51C4492\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LB_Device.LB_Device:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E2/LB_Device.LB_Device:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_LB_Device\"\nmsgid \"I need to pull the left lever first.\"\nmsgstr \"Mai întâi trebuie să trag maneta stângă.\"\n\n#. Key:\tDAC636D74C51C30F4B790B9F87203957\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/LB_DeviceUse.LB_DeviceUse:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Ending/E1/LB_DeviceUse.LB_DeviceUse:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_LB_DeviceUse\"\nmsgid \"Er... so far pulling the levers worked but this machine looks fairly complicated.\"\nmsgstr \"Până acum, tragerea manetelor a funcționat, dar acest aparat pare destul de complicat.\"\n\n#. Key:\tE0D3606C4F357F03FBC916AA3573A81D\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/LB_DeviceUse.LB_DeviceUse:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E1/LB_DeviceUse.LB_DeviceUse:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_LB_DeviceUse\"\nmsgid \"I should look around to find some instructions on how it works.\"\nmsgstr \"Ar trebui să mă uit în jur pentru a găsi câteva instrucțiuni despre cum funcționează.\"\n\n#. Key:\t2DB770DF48D3199FFDEA3F8AB99126D5\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LB_LeftLever.LB_LeftLever:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Ending/E2/LB_LeftLever.LB_LeftLever:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_LB_LeftLever\"\nmsgid \"I heard them knocking on the door. They surely heard the alarm when I entered.\"\nmsgstr \"I-am auzit bătând la ușă. Cu siguranță au auzit alarma când am intrat.\"\n\n#. Key:\tB5D008804CCD51DF8CA8F5B99CA0C0FB\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LB_LeftLever.LB_LeftLever:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E2/LB_LeftLever.LB_LeftLever:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_LB_LeftLever\"\nmsgid \"I need to hurry. The middle lever is the next one.\"\nmsgstr \"Trebuie să mă grăbesc. Maneta din mijloc este următoarea.\"\n\n#. Key:\tC7B08D314C68A7E4D21E20B128670516\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LB_MiddleLever.LB_MiddleLever:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Ending/E2/LB_MiddleLever.LB_MiddleLever:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_LB_MiddleLever\"\nmsgid \"We both made our decision three years ago.\"\nmsgstr \"Amândoi ne-am luat decizia acum trei ani.\"\n\n#. Key:\tFBC301B94D990F1F3FD30383FF916327\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LB_MiddleLever.LB_MiddleLever:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Ending/E2/LB_MiddleLever.LB_MiddleLever:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_LB_MiddleLever\"\nmsgid \"I’ve made my choice.\"\nmsgstr \"Am ales alegerea mea.\"\n\n#. Key:\tFD2036CF4FC103724FB18F83754367A0\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LB_MiddleLever.LB_MiddleLever:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E2/LB_MiddleLever.LB_MiddleLever:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_LB_MiddleLever\"\nmsgid \"I heard the door exploding. Father must be really mad but It doesn’t matter now.\"\nmsgstr \"Am auzit ușa explodând. Tatăl trebuie să fie într-adevăr nebun, dar acum nu mai contează.\"\n\n#. Key:\t98F843004F338E4480C942A9B9646BDE\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LB_RightLever.LB_RightLever:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E2/LB_RightLever.LB_RightLever:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_LB_RightLever\"\nmsgid \"I pulled the last lever.\"\nmsgstr \"Am tras ultima manetă.\"\n\n#. Key:\t9F6EBBE74FA6289497401C8E7400B01E\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LR_Bed.LR_Bed:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E2/LR_Bed.LR_Bed:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_LR_Bed\"\nmsgid \"Sleeping wasn’t easy since Mom was gone.\"\nmsgstr \"Dormitul nu a fost ușor de când mama a dispărut.\"\n\n#. Key:\tAE56EE704265B61C84123F9775EB424C\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LR_Bed.LR_Bed:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E2/LR_Bed.LR_Bed:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_LR_Bed\"\nmsgid \"I really couldn’t sleep that night.\"\nmsgstr \"Chiar nu am putut dormi în noaptea aceea.\"\n\n#. Key:\t344E65304BB63905D487CCAF191DFE95\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LR_Chest.LR_Chest:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Ending/E2/LR_Chest.LR_Chest:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_LR_Chest\"\nmsgid \"It was half past eleven.\"\nmsgstr \"Era ora 11 și jumătate.\"\n\n#. Key:\t5DD659BE428981065F3A989D284C3542\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LR_Chest.LR_Chest:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E2/LR_Chest.LR_Chest:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_LR_Chest\"\nmsgid \"I took the key.\"\nmsgstr \"Am luat cheia.\"\n\n#. Key:\tF21CEE6143FD904B2285F9BEE01174A0\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LR_Chest.LR_Chest:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E2/LR_Chest.LR_Chest:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_LR_Chest\"\nmsgid \"Daddy didn’t like if I went out in the night but I felt something calling for me.\"\nmsgstr \"Tatălui nu i-a plăcut dacă aș ieși noaptea, dar am simțit ceva care mă cheamă.\"\n\n#. Key:\t8B18714145E8614E70F531BDB1A2AAAB\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LR_Door.LR_Door:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E2/LR_Door.LR_Door:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_LR_Door\"\nmsgid \"I always locked the door just to make sure I won’t sleep walk out.\"\nmsgstr \"Am închis întotdeauna ușa doar pentru a mă asigura că nu voi dormi in mers afară.\"\n\n#. Key:\tE5B14EEE4719891E2D2493A4E793A2C4\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LR_Door.LR_Door:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Ending/E2/LR_Door.LR_Door:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_LR_Door\"\nmsgid \"I opened the door.\"\nmsgstr \"Am deschis ușa.\"\n\n#. Key:\tF8090D7B4DCD959D7893338BDA2B6256\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LR_Door.LR_Door:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E2/LR_Door.LR_Door:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_LR_Door\"\nmsgid \"I hid the key under the clock.\"\nmsgstr \"Am ascuns cheia sub ceas.\"\n\n#. Key:\t8363A3C9426FA1F007A5E783B1D72171\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LR_Notebook.LR_Notebook:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E2/LR_Notebook.LR_Notebook:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_LR_Notebook\"\nmsgid \"Here I collected all my less scientific notes on the Ruined Realm.\"\nmsgstr \"Aici am colectat toate notele mele mai puțin științifice despre Tărâmul Ruinat.\"\n\n#. Key:\tA0B131B34A29BEADA3E3CDB74C7EDBCA\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LR_Notebook.LR_Notebook:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Ending/E2/LR_Notebook.LR_Notebook:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_LR_Notebook\"\nmsgid \"They deserve to be remembered. I will miss them.\"\nmsgstr \"Merită să fie amintiți. Imi vor lipsi.\"\n\n#. Key:\tB66C98C34782719B5CF6F19F608C00F0\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LR_Notebook.LR_Notebook:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E2/LR_Notebook.LR_Notebook:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_LR_Notebook\"\nmsgid \"So many lovely people! Despite their madness.\"\nmsgstr \"Atâția oameni minunați! În ciuda nebuniei lor.\"\n\n#. Key:\t0DAF7BA0480BDF56BC47A7826A5186C2\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LR_TabbyBed.LR_TabbyBed:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E2/LR_TabbyBed.LR_TabbyBed:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_LR_TabbyBed\"\nmsgid \"Sometimes I wished there could be a place like that for me as well.\"\nmsgstr \"Uneori îmi doream să existe și un loc ca acela pentru mine.\"\n\n#. Key:\t6084018D4E86CF2ACA89219824C8F776\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LR_TabbyBed.LR_TabbyBed:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Ending/E2/LR_TabbyBed.LR_TabbyBed:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_LR_TabbyBed\"\nmsgid \"As usually Tabby was out there maybe hunting or just hanging out with other cats.\"\nmsgstr \"Așa cum de obicei Tabby era acolo, poate la vânătoare sau doar petrecând timpul cu alte pisici.\"\n\n#. Key:\t9702175346DD6BD2CBDB9C8D23460866\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LR_TabbyBed.LR_TabbyBed:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E2/LR_TabbyBed.LR_TabbyBed:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_LR_TabbyBed\"\nmsgid \"In this World, he was normal.\"\nmsgstr \"În această lume, el era normal.\"\n\n#. Key:\t018B13FB403C2E979380C68B92CC1E46\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LR_Window.LR_Window:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Ending/E2/LR_Window.LR_Window:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_LR_Window\"\nmsgid \"Yet sometimes I liked to watch other kids playing in the castle garden.\"\nmsgstr \"Totuși, uneori, îmi plăcea să mă uit la alți copii jucându-se în grădina castelului.\"\n\n#. Key:\t15454EFF40C99A479173E294B612C66C\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LR_Window.LR_Window:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E2/LR_Window.LR_Window:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_LR_Window\"\nmsgid \"They didn’t understand how important my task was.\"\nmsgstr \"Nu au înțeles cât de importantă era sarcina mea.\"\n\n#. Key:\t4460452B4A8B40C59075779751D3D760\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LR_Window.LR_Window:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Ending/E2/LR_Window.LR_Window:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_LR_Window\"\nmsgid \"I didn’t leave the castle since Mom died.\"\nmsgstr \"Nu am părăsit castelul de când mama a murit.\"\n\n#. Key:\t795D92CB49E6F50CE37897A793C6A711\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LR_Window.LR_Window:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Ending/E2/LR_Window.LR_Window:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_LR_Window\"\nmsgid \"Two years passed and they still didn’t give up throwing balls on the window to get my attention.\"\nmsgstr \"Au trecut doi ani și încă nu au renunțat să arunce mingi pe geam pentru a-mi atrage atenția.\"\n\n#. Key:\tB1A689B24F5D77A715114AB718126A75\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LR_Window.LR_Window:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E2/LR_Window.LR_Window:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_LR_Window\"\nmsgid \"They will never understand.\"\nmsgstr \"Nu vor înțelege niciodată.\"\n\n#. Key:\t06B2BD844B477A747E086F9F0C3BCAFE\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"Well, that fountain is definitely not your cup of tea but you can accept that it might be the fairest for the Magic Mirror...\"\nmsgstr \"Ei bine, acea fântână nu este cu siguranță ceea ce îți place ție, dar poți accepta că ar putea fi cea mai corectă pentru oglinda magică ...\"\n\n#. Key:\t264C2C1040339F9680CA129F4E6E7764\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_65.Children(0).Children.Text\n#. Key:\t608D4BF341FEE76F239D6BA3B34F65E7\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_1.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_1.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_65.Children(0).Children.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"Who is the fairest?\"\nmsgstr \"Cine este cel mai corect?\"\n\n#. Key:\t2C246C1326080F0A003A03BBBE7E9F40\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_39.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_39.Children(1).Children.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"Wish something\"\nmsgstr \"Puneți o dorință\"\n\n#. Key:\t2C6C88C54439E3C689E86DB30560B807\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_66.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_66.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"No matter how hard you try to receive a sign, the Mirror remains silent. It doesn't show you anything this time.\"\nmsgstr \"Oricât de greu încerci să primești un semn, Oglinda rămâne tăcută. Nu îți arată nimic de data asta.\"\n\n#. Key:\t317248C14F0904B6E6B04080841C75D1\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_39.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_39.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"The water seems to be boiling and the bubbles pop when they hit the surface; it is indeed mesmerizing. Suddenly, something breaks the silence - you can hear whispers.\"\nmsgstr \"Apa pare să fiarbă, iar bulele să apară atunci când lovesc suprafața; este într-adevăr fascinant. Deodată, ceva sparge tăcerea - poți auzi șoapte.\"\n\n#. Key:\t372D97104DC7D67AF4B2409B7CBC602D\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_66.Children(0).Children.Text\n#. Key:\t432E8D794C2FB271D9B39283EBD9E33B\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_1.Children(2).Children.Text\n#. Key:\tF212015B402EF862C9869394531175DC\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_65.Children(2).Children.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_1.Children(2).Children.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_65.Children(2).Children.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_66.Children(0).Children.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"Leave\"\nmsgstr \"Pleacă\"\n\n#. Key:\t3FBF959348F2AFFA8016AA9371DD0800\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"You politely explain that you want to see your past instead of your body, but the Mirror is stubbornly stuck on this image.\"\nmsgstr \"Îi explici politicos că vrei să-ți vezi trecutul în loc de corpul tău, dar Oglinda este încăpățânată să rămână cu această imagine.\"\n\n#. Key:\t4620F3E84D5DC9847AB8A8891CF66F20\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_67.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_67.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"You place the flower and wait to see what happens.\"\nmsgstr \"Pui floarea și aștepți să vezi ce se întâmplă.\"\n\n#. Key:\t5C2363C64023EB8E1705D3BFC3310A8A\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_65.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_65.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"The vision fades away.\"\nmsgstr \"Viziunea se estompează.\"\n\n#. Key:\t648780E44EF4F6587D31E7AE2BE4CCE4\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_68.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_68.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"The Mirror seems to be unavailable at the moment. It doesn't want to be bothered. Maybe you should return later.\"\nmsgstr \"Oglinda pare a fi indisponibilă în acest moment. Nu vrea să fie deranjat. Poate că ar trebui să te întorci mai târziu.\"\n\n#. Key:\t74CAAA1D4671A258A6D188BCED32CCBD\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_69.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_69.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"The water turns still. Deep under the surface you notice a glimmering light.\"\nmsgstr \"Apa se întoarce. Adânc sub suprafață observi o lumină strălucitoare.\"\n\n#. Key:\t7CD8BEEA40A36A22057920807BBEEC07\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"The Magic Mirror shows things that were, things that are, and things that yet may be. \\r\\nYou fill the basin with water and start contemplating. You meditate about...\"\nmsgstr \"Oglinda magică arată lucruri care au fost, lucruri care sunt și lucruri care pot fi încă.\\r\\nUmpli bazinul cu apă și începi să contemplezi. Meditezi despre ...\"\n\n#. Key:\t8226F9B3495DE20F137F95A7F3583FE0\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"Ruin left this place almost untouched. The street lamps spread light on a couple of metal benches and flower pots.\"\nmsgstr \"Ruina a lăsat acest loc aproape neatins. Lămpile stradale răspândesc lumină pe câteva bănci metalice și ghivece cu flori.\"\n\n#. Key:\t82C33F1E49C5DC76BF19648A414F7209\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"You are watching the ball and start to get frustrated. You don't want to look at this body replacement... this raggy shell... You want answers!\"\nmsgstr \"Urmărești mingea și începi să te frustrezi. Nu vrei să te uiți la acest înlocuitor al corpului ... la acest înveliș neobișnuit ... Vrei răspunsuri!\"\n\n#. Key:\t8F94D5E34488ECDCE9E051BB1ABE66B9\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_1.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_1.Children(1).Children.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"Who you were in the past\"\nmsgstr \"Cine ai fost în trecut\"\n\n#. Key:\t9BA86AAD4282A943E8A57390E2C4E3CF\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_39.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_39.Children(0).Children.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"Floating Flower\"\nmsgstr \"Floare Plutitoare\"\n\n#. Key:\tA8A6D8D44F9344A162FAA080C839B28A\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"There are glass shards all over the place. There's a ball on the floor next to the girl.\"\nmsgstr \"Există cioburi de sticlă peste tot. Există o minge pe podea lângă fată.\"\n\n#. Key:\tAF212CEC43A56245A848DABD21ECBAFC\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_70.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_70.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"You reach for the light and your fingers grab onto something smooth and cold.\"\nmsgstr \"Te aproprie de lumină și degetele se prind de ceva neted și rece.\"\n\n#. Key:\tB8E2A52B442F3B45A1D993A8548DE124\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"You are seeing the wizard's room once more. There is a weakened little girl lying on the floor in the middle of the room. She is surrounded by stone runes, candles and magical potions.\"\nmsgstr \"Mai vezi încă o dată camera vrăjitorului. În mijlocul camerei există o fetiță slăbită. Este înconjurată de pietre runice,, lumânări și poțiuni magice.\"\n\n#. Key:\tB9217F85404B488DB6F4DDACFF2B824C\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_65.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_65.Children(1).Children.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"What you were before\"\nmsgstr \"Ce ai fost înainte\"\n\n#. Key:\tCD33272B416D2FDE283D44BA6F50475C\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"The image zooms in and you have a clearer view of the fountain. You are waiting for more, but nothing happens.\"\nmsgstr \"Imaginea se mărește și ai o vedere mai clară asupra fântânii. Aștepți mai multe, dar nu se întâmplă nimic.\"\n\n#. Key:\tD64B38F1470B27D21AE539AE80AE666A\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"You are seeing the Ruined Realm from afar. The view gets closer until you find yourself looking at the top of a tower.\"\nmsgstr \"Vezi Tărâmul Ruinat de departe. Priveliștea se apropie până când descoperi că privești spre vârful unui turn.\"\n\n#. Key:\tF3C496794CC4A68DDC764895FF2DFC77\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_72.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_72.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"You found a precious rune stone! Hmmm...Is this the gift offered by the Mirror in exchange for your enchanting flower?\"\nmsgstr \"Ai găsit o piatră scumpă! Hmmm ... Acesta este cadoul oferit de Oglindă în schimbul florii tale fermecătoare?\"\n\n#. Key:\t10A6FAE44F71FBB21522B1AAE5E20DAE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_29.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_29.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"I don’t care what happens here after I’m back home.\"\nmsgstr \"Nu mă interesează ce se întâmplă aici după ce mă întorc acasă.\"\n\n#. Key:\t12C6550D4143AFE12C6986B427D2927A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"He can’t release his daughter. He can’t accept that she is gone. He wants to get her back even if it means they all die after a few months...\"\nmsgstr \"Nu-și poate elibera fiica. El nu poate accepta că ea a dispărut. Vrea să o recupereze, chiar dacă înseamnă că toți mor după câteva luni ...\"\n\n#. Key:\t1C714E474408001FB67CEABF92FAB019\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Wait! You can’t just dis...\"\nmsgstr \"Aștepta! Nu poți doar să dis ...\"\n\n#. Key:\t209B77394D419812DD1BD7A3D7A92B94\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_39.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_39.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"All right and what can we do against it?\"\nmsgstr \"În regulă și ce putem face împotriva ei?\"\n\n#. Key:\t209BF95E4275418CE020E3AB028AFC10\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Now it’s better.\"\nmsgstr \"Acum este mai bine.\"\n\n#. Key:\t230C6ED4416FDD6C5E00FAB8B30FBB17\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"To be honest I don’t have the faintest idea. I just want to be free again.\"\nmsgstr \"Sincer să fiu, nu am cea mai vagă idee. Vreau doar să fiu liber din nou.\"\n\n#. Key:\t25227AB342F4A0E76082539072C1143D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_37.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_37.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Do you think Ruin will stop after swallowing the Human Realm?\"\nmsgstr \"Crezi că Ruina se va opri după înghițirea Tărâmului Uman?\"\n\n#. Key:\t266261C240DB77D1306C5F8EEE3D0189\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"He says he wants his daughter back but I think he is still trying to close the Realm to stop Ruin.\"\nmsgstr \"El spune că își dorește fiica sa înapoi, dar cred că încă încearcă să închidă tărâmul pentru a opri Ruina.\"\n\n#. Key:\t283810E04DE48471FBE6BD9BE9DD337D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Yet he doesn’t care about the World. He wants to get her back even if it means they all die after a few months...\"\nmsgstr \"Totuși nu-i pasă de lume. Vrea să o recupereze, chiar dacă înseamnă că toți mor după câteva luni ...\"\n\n#. Key:\t2CE94F19412379ECE927A3AEEEAC3756\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_1.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_1.Children(1).Children.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Thanks for the Soulcaster\"\nmsgstr \"Mulțumesc pentru Făcătorul de Suflete\"\n\n#. Key:\t2DB5F39F45BB9EC8ABBFEA9020DF94E7\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Why should it concern me if Ruin destroys your Realm? You deserve it for summoning us to do the hard work.\"\nmsgstr \"De ce ar trebui să mă preocupe dacă Ruina îți distruge Tărâmul? Meriți că ne-ai chemat să facem munca grea.\"\n\n#. Key:\t30E5A67B4135A5402AE021832F89D4D1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"You again? I told you if you want something from the Wizard go and find him yourself...\"\nmsgstr \"Tu din nou? Ți-am spus dacă vrei ceva de la Vrăjitor, du-te și găsește-l tu ...\"\n\n#. Key:\t34BCB98247406A77FB5A5C8942543588\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_38.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_38.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"It might take time but it will reach the Unknown Realm and all the spirits will become part of Ruin just like those who were summoned here.\"\nmsgstr \"S-ar putea să dureze timp, dar va ajunge pe Tărâmul Necunoscut și toate spiritele vor deveni parte a Ruinei la fel ca cei care au fost chemați aici.\"\n\n#. Key:\t379B50904FB774AD057BBB810BDD445C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_41.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_41.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"I’m not sure. I will think about it.\"\nmsgstr \"Nu sunt sigur. O sa ma gândesc la asta.\"\n\n#. Key:\t38BEECF94D2EB7B2C6596593E576A360\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_30.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_30.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"The Wizard created a device which can separate the Realms. This is the only way to stop Ruin from spreading.\"\nmsgstr \"Vrăjitorul a creat un dispozitiv care poate separa tărâmurile. Acesta este singurul mod de a opri Ruina să se răspândească.\"\n\n#. Key:\t3D7B856A4D97FCCC2A2B89BCB6295471\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"This time I would like to talk to you...\"\nmsgstr \"De data asta aș dori să vorbesc cu tine ...\"\n\n#. Key:\t40A329C7465166A11C73B694D6A79A00\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_12.Children(2).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_12.Children(2).Children.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Don’t know\"\nmsgstr \"Nu știu\"\n\n#. Key:\t4D356117496E625B6B4C64A611496A9F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_24.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_24.Children(1).Children.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Not my problem\"\nmsgstr \"Nu este problema mea\"\n\n#. Key:\t4FE5ADF04D1079CCD1E16697E82B39B5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_35.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_35.Children(0).Children.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Accept plan\"\nmsgstr \"Acceptă planul\"\n\n#. Key:\t53D6055344A880433B1093B029DA8CA5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_12.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_12.Children(0).Children.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Bring back daughter\"\nmsgstr \"Adu-i fiica înapoi\"\n\n#. Key:\t599FF022411F5BA2EB0F32A1F947C661\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_35.Children(2).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_35.Children(2).Children.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Not sure\"\nmsgstr \"Nu sunt sigur\"\n\n#. Key:\t5FD6018040C38B8A3F40C78C913AC251\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_40.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_40.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Have no fear, I will have this done!\"\nmsgstr \"Nu te teme, voi face asta!\"\n\n#. Key:\t6B3585BA4AFE614FF428FCAE698872A8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_33.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_33.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"For you this would be completely different. For you this is not a sacrifice but a way of going home!\"\nmsgstr \"Pentru tine acest lucru ar fi complet diferit. Pentru tine acesta nu este un sacrificiu, ci un mod de a pleca acasă!\"\n\n#. Key:\t6E1C94F24F493D7075A7509F8181AD27\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"You are wrong. The World is falling apart yet he doesn’t care about it even when he is the only one who could stop Ruin.\"\nmsgstr \"Greșești. Lumea se destramă, totuși lui nu-i pasă nici atunci când este singurul care ar putea să-l oprească Ruina.\"\n\n#. Key:\t71A64B804C0CCE26571E9E8237AA5000\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"I’m also glad. It was bloody damn difficult.\"\nmsgstr \"Sunt, de asemenea, bucuros. Era sângeros al naibii de greu.\"\n\n#. Key:\t78305AE64B56098D32806EB509133BBC\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_35.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_35.Children(1).Children.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Decline plan\"\nmsgstr \"Refuză planul\"\n\n#. Key:\t7C92B8BF4CEA3093BB817682B501DC67\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"The World is falling apart and only the Wizard has a chance to stop this.\"\nmsgstr \"Lumea se destramă și numai Vrăjitorul are șansa de a opri acest lucru.\"\n\n#. Key:\t8B2CE8144EB2A7C89AFA1BACC3EE1B88\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Hello, little Wanderer! I’m glad you made it this far.\"\nmsgstr \"Bună ziua, micule Rătăcitor! Mă bucur că ai ajuns până aici.\"\n\n#. Key:\t8CC98B374125E6E6A6A20C97F4A3B067\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_24.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_24.Children(0).Children.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"I'm a demon\"\nmsgstr \"Sunt un demon\"\n\n#. Key:\t8D4701A1469997CBC879788351B37B0A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_31.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_31.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"My plan is simple.\"\nmsgstr \"Planul meu este simplu.\"\n\n#. Key:\t8E4693F04E60AFF4757A5887973894BE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_27.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_27.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"I saw Ruin and I don’t want the same to happen to any other Realm. What can I do?\"\nmsgstr \"Am văzut Ruin și nu vreau să se întâmple același lucru cu niciun alt tărâm. Ce pot sa fac?\"\n\n#. Key:\t9193CB2747033644F006809E0E4A812A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_45.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_45.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"For the sake of all Realms I hope you will make the right decision.\"\nmsgstr \"De dragul tuturor tărâmurilor, sper că vei lua o decizie corectă.\"\n\n#. Key:\t95D6FBCC42CC4F4041D0B5B64996FD5C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_35.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_35.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Once you are there find the Laboratory and activate the device! It will take you home and will separate the Worlds which means no spirit will be ever summoned again!\"\nmsgstr \"Odată ce ești acolo, găsește laboratorul și activează dispozitivul! Te va duce acasă și va separa Lumile, ceea ce înseamnă că niciun spirit nu va mai fi chemat din nou!\"\n\n#. Key:\t9ADEF37F49EA90EF320B5E8BB2D8D769\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"...and I don’t want our conversation to be overheard, so if you don’t mind...\"\nmsgstr \"... și nu vreau ca conversația noastră să fie auzită, deci dacă nu te deranjează ...\"\n\n#. Key:\t9F01EFC54F3FC5B709F697860BE0572D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_24.Children(2).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_24.Children(2).Children.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"How to save the World?\"\nmsgstr \"Cum să salvezi lumea?\"\n\n#. Key:\tA71226674132E2666925AEB28D2FC024\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_46.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_46.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Farewell Wanderer!\"\nmsgstr \"Adio Rătăcitorule!\"\n\n#. Key:\tB1E3A9DB4A75C08067DCA19113A6A8A2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Calm down little spirit.\"\nmsgstr \"Calmează-te spirit mic.\"\n\n#. Key:\tB355BD604F9EC22514DA14B64B0F5E5E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_43.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_43.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Thank you Spirit! For the sake of all Realms I hope you won’t fail on your way!\"\nmsgstr \"Multumesc Spirit! De dragul tuturor tărâmurilor, sper că nu vei da greș în calea ta!\"\n\n#. Key:\tB6D3E23045C4BC5B3E5F3D83E2DFBADB\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_19.Text\n#. Key:\tDC3219914721210BD169D2989F03D18D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"But we won’t let this happen, will we?\"\nmsgstr \"Dar nu vom lăsa să se întâmple asta, nu-i așa?\"\n\n#. Key:\tBAC828A540E6C81EE43EBF8036A8146A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_42.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_42.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"You deserve Ruin. I won’t save the Human Realm!\"\nmsgstr \"Meriți Ruina. Nu voi salva Tărâmul Uman!\"\n\n#. Key:\tC837CED4495F79594133F4B2C0FCE5F8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Where shall I start? Do you know what the Wizard is up to? Did he tell you?\"\nmsgstr \"De unde să încep? Ști ce face Vrăjitorul? Ți-a spus?\"\n\n#. Key:\tD060173B4D5502FC06A69E865DAFD5E6\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_26.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_26.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"This is not my Realm and not my problem. All I want is to get out of here.\"\nmsgstr \"Acesta nu este tărâmul meu și nici problema mea. Tot ce vreau este să plec de aici.\"\n\n#. Key:\tD520C3AC46F62B77554443A4589845C1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"He would like to bring his daughter back to life. For that he needs three artefacts which are somewhere here.\"\nmsgstr \"El ar dori să-și readucă fiica la viață. Pentru asta are nevoie de trei artefacte care sunt undeva aici.\"\n\n#. Key:\tD7F841B14E18D77AB5FBD2A34D59BC92\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_44.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_44.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"I understand your fury. Yet I hope you will change your mind.\"\nmsgstr \"Îți înțeleg furia ta. Totuși sper că te vei răzgândi.\"\n\n#. Key:\tD80B81914A550F305934F9852C1DD6B0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_23.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_23.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"He lost his daughter and he can’t release her. He can’t accept that she is gone.\"\nmsgstr \"Și-a pierdut fiica și nu o poate elibera. El nu poate accepta că ea a dispărut.\"\n\n#. Key:\tD816A79E4160BC4426CD22A63C7987A0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Before you go on I have something to discuss with you...\"\nmsgstr \"Înainte de a continua, am de discutat ceva cu tine ...\"\n\n#. Key:\tDD870754471358DEFE9CB5BFA554AB7C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_1.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_1.Children(0).Children.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Me too\"\nmsgstr \"Și eu\"\n\n#. Key:\tE0CCA2604AA40FED355A859A1FA02DDA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_1.Children(2).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_1.Children(2).Children.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"I won’t deliver any message\"\nmsgstr \"Nu voi transmite niciun mesaj\"\n\n#. Key:\tE1C3F2E34680BA8B67521C905AD42ADA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"That’s correct. He can’t release his daughter. He can’t accept that she is gone.\"\nmsgstr \"Este corect. Nu-și poate elibera fiica. El nu poate accepta că ea a dispărut.\"\n\n#. Key:\tE93136104181FAA899F2CE801497DCBA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_25.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_25.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"I know right now it doesn’t look that way, but I’m a mighty demon of the Unknown Realm.\"\nmsgstr \"Știu că acum nu arată așa, dar sunt un demon puternic al Tărâmului Necunoscut.\"\n\n#. Key:\tEC116A8848A471EB2C5DC8BA1D187C9A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_12.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_12.Children(1).Children.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Close Ruined Realm\"\nmsgstr \"Închide Tărâmul Ruinat\"\n\n#. Key:\tEC6221CE4B85E7D1887DBCA6D85D8238\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"It wasn’t easy but I made good use of the Spellcaster you gave me.\"\nmsgstr \"Nu a fost ușor, dar am profitat bine de Făcătorul de Vrăji pe care mi l-ai oferit.\"\n\n#. Key:\tED5356DE42F2ED2203F7AFB30231643E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_34.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_34.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"When you deliver the artefacts he will let you into his tower.\"\nmsgstr \"Când vei livra artefactele, te va lăsa în turnul său.\"\n\n#. Key:\tEE78AD4147800BD0E160A8B6A3F51FBD\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_32.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_32.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"When the Wizard’s daughter activated the device it transported her soul into the Unknown Realm. At that point the Wizard stopped the device so that he can summon his daughter back.\"\nmsgstr \"Când fiica vrăjitorului a activat dispozitivul, acesta și-a transportat sufletul pe Tărâmul Necunoscut. În acel moment, Vrăjitorul a oprit dispozitivul pentru a-și putea lua fiica înapoi.\"\n\n#. Key:\tEFACA50447BAC08293281BB11A5E11B3\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_36.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_36.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"This is just as much your problem as it is mine.\"\nmsgstr \"Aceasta este la fel de mult problema ta cât este și a mea.\"\n\n#. Key:\tFB0E702746132A3C688D9EA492A01B50\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"You made it and that is what matters.\"\nmsgstr \"Ai făcut-o și asta contează.\"\n\n#. Key:\t4BE3EE734EFED241B7FA2192EEB146A5\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/MR_Bed.MR_Bed:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Ending/E2/MR_Bed.MR_Bed:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_MR_Bed\"\nmsgid \"We always wore colourful clothes because that made her happy.\"\nmsgstr \"Am purtat întotdeauna haine colorate pentru că asta a făcut-o fericită.\"\n\n#. Key:\t7F5F069D4E9C7F15ED2B8CA45154FCFE\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/MR_Bed.MR_Bed:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E2/MR_Bed.MR_Bed:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_MR_Bed\"\nmsgid \"Most of her time she just lied here and stared at nothing.\"\nmsgstr \"Cea mai mare parte a timpului ei doar a stat acolo și nu a privit nimic.\"\n\n#. Key:\tEA25DBC34832960AB03A32A5B08AC404\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/MR_Bed.MR_Bed:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E2/MR_Bed.MR_Bed:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_MR_Bed\"\nmsgid \"Sometimes she talked about grey lands.\"\nmsgstr \"Uneori vorbea despre terenuri cenușii.\"\n\n#. Key:\t58E06C3A45DD46A34F155BAA62933039\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/MR_Chair.MR_Chair:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Ending/E2/MR_Chair.MR_Chair:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_MR_Chair\"\nmsgid \"I hope they will never find out how wrong they were. I hope there is still time for our World.\"\nmsgstr \"Sper că nu vor afla niciodată cât de greșit au fost. Sper că mai este timp pentru Lumea noastră.\"\n\n#. Key:\t9EA75B664E62ABF38E44BE8DC3050AC9\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/MR_Chair.MR_Chair:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E2/MR_Chair.MR_Chair:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_MR_Chair\"\nmsgid \"This is where the doctor used to sit. He never believed that Mom was infected by the Ruin.\"\nmsgstr \"Aici stătea medicul. Nu a crezut niciodată că mama a fost infectată de Ruină.\"\n\n#. Key:\tA408630F44A3B2345A2D0AA8395D97F2\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/MR_Chair.MR_Chair:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E2/MR_Chair.MR_Chair:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_MR_Chair\"\nmsgid \"No one ever believed in Ruin.\"\nmsgstr \"Nimeni nu a crezut vreodată în Ruină.\"\n\n#. Key:\t1AFEF7EB49BB3BEA5BB76793A60ED7C9\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/MR_Lamps.MR_Lamps:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E2/MR_Lamps.MR_Lamps:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_MR_Lamps\"\nmsgid \"This room was the brightest in the castle.\"\nmsgstr \"Această cameră era cea mai strălucitoare din castel.\"\n\n#. Key:\tC132BEA446B4441615D7029E8AA5BBB5\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/MR_Lamps.MR_Lamps:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E2/MR_Lamps.MR_Lamps:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_MR_Lamps\"\nmsgid \"I took some oil.\"\nmsgstr \"Am luat puțin ulei.\"\n\n#. Key:\tFE826997431A2665AC2788A62558B88E\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/MR_Lamps.MR_Lamps:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Ending/E2/MR_Lamps.MR_Lamps:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_MR_Lamps\"\nmsgid \"Father bought some exotic lamp oil so that we had coloured lights.\"\nmsgstr \"Tatăl a cumpărat ulei de lampă exotic, astfel încât să avem lumini colorate.\"\n\n#. Key:\t430A10B04FAC9288EC2794A31DF6699E\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/MR_Paintings.MR_Paintings:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E2/MR_Paintings.MR_Paintings:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_MR_Paintings\"\nmsgid \"Mom was always fond of art.\"\nmsgstr \"Mama era întotdeauna pasionată de artă.\"\n\n#. Key:\t53AA7E134FA0E30F37FC8CB50425520F\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/MR_Paintings.MR_Paintings:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E2/MR_Paintings.MR_Paintings:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_MR_Paintings\"\nmsgid \"After she got sick she couldn’t paint the way she did before yet she still liked it.\"\nmsgstr \"După ce s-a îmbolnăvit, nu a mai putut picta așa cum o făcea înainte, dar încă îi plăcea.\"\n\n#. Key:\t8484045A4107378E9CC8FFAA02C94A87\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/MR_Paintings.MR_Paintings:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Ending/E2/MR_Paintings.MR_Paintings:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_MR_Paintings\"\nmsgid \"It could engage her for hours.\"\nmsgstr \"Ar putea să o țină ocupată ore întregi.\"\n\n#. Key:\t009BF08145DBE86FFB07BA9A6BD77A8E\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_5.Children(2).Children.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_5.Children(2).Children.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"Not my business\"\nmsgstr \"Nu e treaba mea\"\n\n#. Key:\t00DE9BE1446C5D5C0D62469B41A1B693\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_5.Children(0).Children.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_5.Children(0).Children.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"Lillian?\"\nmsgstr \"Lillian?\"\n\n#. Key:\t0C3B729C4618E8A817F019B8E916425B\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"Maybe we failed the ritual again and summoned another of your kind.\"\nmsgstr \"Poate că am eșuat din nou ritualul și l-am chemat pe altul din același neam ca tine.\"\n\n#. Key:\t0CAC15144B37144A99A9EB9D13CCC9DE\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_32.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_32.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"What do you expect me to do, Spirit?\"\nmsgstr \"Ce te aștepți să fac, duhule?\"\n\n#. Key:\t1493C597483503024A3C5CA8F0FA1327\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"I’ve already done way too much for you.\"\nmsgstr \"Am făcut deja prea mult pentru tine.\"\n\n#. Key:\t15BAD73D49BF7C62469D8E9CD0B2AAF4\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"Now, take me home!\"\nmsgstr \"Acum, du-mă acasă!\"\n\n#. Key:\t1962A69C42E8FDD365AFC9AB626605F7\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"We made the spell... and it worked!\"\nmsgstr \"Am făcut vraja ... și a funcționat!\"\n\n#. Key:\t1AC8DD104163078CA72065A0B43B5C57\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"And then what?\"\nmsgstr \"Și apoi, ce?\"\n\n#. Key:\t2034A3164695766F8C17B69CD0937C02\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_25.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_25.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"And he...\"\nmsgstr \"Și el...\"\n\n#. Key:\t22668011432DEF65ACF29793FF234E07\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_37.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_37.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"Someone like me...\"\nmsgstr \"Cineva ca mine...\"\n\n#. Key:\t2386A8D24BD256982D486AAF71B57ABD\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_23.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_23.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"She destroyed half of the room before we could even cast a spell.\"\nmsgstr \"A distrus jumătate din cameră înainte de a putea chiar să aruncăm o vrajă.\"\n\n#. Key:\t250E11A440445CAFB5252A92C5100735\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"That’s how you handle situations like these...\"\nmsgstr \"Așa te descurci în situații ca acestea ...\"\n\n#. Key:\t298BEA5646602444742C3BAD65866EF9\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"I’m not sure... Everything happened so fast.\"\nmsgstr \"Nu sunt sigur ... Totul s-a întâmplat atât de repede.\"\n\n#. Key:\t2FAFABFC43A75D29B671739D16759E43\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"What happened?\"\nmsgstr \"Ce s-a întâmplat?\"\n\n#. Key:\t303D9BF54AB3034565A45594AB5636DF\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"I can’t... I’m sorry!\"\nmsgstr \"Nu pot ... îmi pare rău!\"\n\n#. Key:\t378D7F984C821E23AF0CBEA7D24EFCC1\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"What happened to Lillian? Has she returned?\"\nmsgstr \"Ce s-a întâmplat cu Lillian? Sa întors?\"\n\n#. Key:\t38EF0908448C7E5298C4F496DACAD5AD\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"Something... arrgh... something went wrong...\"\nmsgstr \"Ceva ... arrgh ... ceva a mers prost ...\"\n\n#. Key:\t3A328FA74AA2FBC2AFE84CA195DAE236\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"You are Raven’s master...\"\nmsgstr \"Ești stăpânul Corbului...\"\n\n#. Key:\t462226704638D0C32B1DEBA3DFE138A1\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"She was taken over by a wicked force and she unleashed boundless spells.\"\nmsgstr \"A fost preluată de o forță nelegiuită și a dezlănțuit vrăji nelimitate.\"\n\n#. Key:\t49B5501A4917D23E6B3B99B430076ABA\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"It was like the devil itself.\"\nmsgstr \"Era ca însuși diavolul.\"\n\n#. Key:\t4B173FBD4D4F48A468016BB055CC573C\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"Where is Wizard? Something happened to him?\"\nmsgstr \"Unde este Vrăjitorul? Ceva i s-a întâmplat?\"\n\n#. Key:\t5341F61045AA32F212173EA9CAB67695\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_39.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_39.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"Wizard was right when he decided to trust you.\"\nmsgstr \"Vrăjitorul avea dreptate când a decis să aibă încredere în tine.\"\n\n#. Key:\t551AEBA64D1E99B2CCFA3DB13E168A02\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_27.Children(1).Children.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_27.Children(1).Children.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"I won’t fight\"\nmsgstr \"Nu voi lupta\"\n\n#. Key:\t592A8CF045DF1BD875B05F9493FE2BB4\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_38.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_38.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"I will face her!\"\nmsgstr \"O voi înfrunta!\"\n\n#. Key:\t5B65F12D43B12FA943D7469FEE2CE2E0\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"We made everything right...\"\nmsgstr \"Am făcut totul bine ...\"\n\n#. Key:\t65A974C344D2B4DD644901994086A31D\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_30.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_30.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"Why is it that every time you refuse to face the consequences of your actions, it is me who needs to clean up your mess?\"\nmsgstr \"De ce este că de fiecare dată când refuzi să te confrunți cu consecințele acțiunilor tale, eu sunt cel care trebuie să-ți curețe mizeria?\"\n\n#. Key:\t66D0FDF04AF5351330E83080759ED974\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_40.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_40.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"I'm sorry that I can't help...\"\nmsgstr \"Îmi pare rău că nu mă pot ajuta ...\"\n\n#. Key:\t7FFE18B74C54BB92334399983F82DBCA\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_34.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_34.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"You are free to do whatever you want!\"\nmsgstr \"Ești liber să faci orice vrei!\"\n\n#. Key:\t8739EB3D48E4F2A997E604A60F7F32B3\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"Was it trapped inside a teddy bear?\"\nmsgstr \"A fost prins în interiorul unui ursuleț?\"\n\n#. Key:\t8E2F09164340534A484A46AD45E4E105\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_27.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_27.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"The demon-Lillian left. There is no one who could stop her now...\"\nmsgstr \"Demonul-Lillian a plecat. Nu există nimeni care să o poată opri acum ...\"\n\n#. Key:\t900D084E4F673FEBEACE3E916103B93E\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"She had fire in her eyes...\"\nmsgstr \"Avea foc în ochi ...\"\n\n#. Key:\t91C26C314425AB8C973F1FB54061F639\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"Lillian woke up and then...\"\nmsgstr \"Lillian s-a trezit și apoi ...\"\n\n#. Key:\t95CE9C6C4901E613AD5DB38E51AC0DB3\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_35.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_35.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"Leave and let me rest in peace...\"\nmsgstr \"Pleacă și lasă-mă să mă odihnesc în pace ...\"\n\n#. Key:\t9AF3E069409F31E4F50A5990A416A39C\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_19.Children(1).Children.Text\n#. Key:\tF5A670D640D73DF452C02A948CB68F75\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_5.Children(1).Children.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_19.Children(1).Children.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_5.Children(1).Children.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"Wizard?\"\nmsgstr \"Vrăjitorul?\"\n\n#. Key:\t9B1B8322442B6D7D76F2119E0A0574FA\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"Is the Wizard safe? What happened afterwards?\"\nmsgstr \"Vrăjitorul este în siguranță? Ce s-a întâmplat după aceea?\"\n\n#. Key:\tA82789354D984476223432A2BE199293\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_24.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_24.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"I was hit by the table.\"\nmsgstr \"Am fost lovit de masă.\"\n\n#. Key:\tAA6EFD044C1D21008EEA189DE75740E7\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_41.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_41.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"Good luck with... everything!\"\nmsgstr \"Baftă în toate!\"\n\n#. Key:\tACAF3D904A149C0E9F91E5AC852D8309\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_31.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_31.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"Let me go!\"\nmsgstr \"Lasă-mă sa plec!\"\n\n#. Key:\tB223647F4C35858A62A5509C7B22C23B\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_27.Children(0).Children.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_27.Children(0).Children.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"I'll stop her\"\nmsgstr \"O voi opri\"\n\n#. Key:\tD0E16FEF4D5415EC6D2C299252E5675D\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_26.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_26.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"He was burnt to ashes.\"\nmsgstr \"A fost ars până la cenușă.\"\n\n#. Key:\tD23076F4475E6CE385ECB2B3B2749CA9\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_36.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_36.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"I have always wanted to meet someone of my own kind anyway.\"\nmsgstr \"Întotdeauna am dorit să întâlnesc pe cineva de neamul meu.\"\n\n#. Key:\tD290445E4EB74446478970934785BA10\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"I can’t open a Gate without Wizard...\"\nmsgstr \"Nu pot deschide o Poartă fără vrăjitor ...\"\n\n#. Key:\tD6EB1BE248E9C483E6D94B8E8A7815F6\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"I don't understand... It is...\"\nmsgstr \"Nu înțeleg ... Este ...\"\n\n#. Key:\tEC42D62E46269139E9E69B876EDED5B1\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_33.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_33.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"It wasn't me who brought you here.\"\nmsgstr \"Nu eu te-am adus aici.\"\n\n#. Key:\tF0711D5F4698DAA99E484E94FDB3EF9C\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_19.Children(0).Children.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_19.Children(0).Children.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"Was it trapped?\"\nmsgstr \"A fost prins?\"\n\n#. Key:\tFDE62A034456071EFE9639B73108BB1E\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"I can't let her destroy everything!\"\nmsgstr \"Nu pot să o las să distrugă totul!\"\n\n#. Key:\tFDFD2B2B4352B564118519874199B48C\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_29.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_29.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"No-no-no!\"\nmsgstr \"Nu-nu-nu!\"\n\n#. Key:\t2E3C904D458640A4F06DD793B416366A\n#. SourceLocation:\t/Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_SewerCreatures\"\nmsgid \"All right, I will return when I'm done.\"\nmsgstr \"Bine, voi reveni când termin.\"\n\n#. Key:\t41F6B75041803A654088469BCB887165\n#. SourceLocation:\t/Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_1.Children(0).Children.Text\n#: /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_1.Children(0).Children.Text\nmsgctxt \"Dialogue_SewerCreatures\"\nmsgid \"Really?\"\nmsgstr \"Într-adevăr?\"\n\n#. Key:\t43EE0E60407CA7CB7431BDB2767C6E19\n#. SourceLocation:\t/Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_SewerCreatures\"\nmsgid \"That's sad. What happened exactly?\"\nmsgstr \"Asta e trist. Ce s-a întâmplat exact?\"\n\n#. Key:\t53AC225B4F21B68CAC6F8997F324124E\n#. SourceLocation:\t/Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_29.Text\n#: /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_29.Text\nmsgctxt \"Dialogue_SewerCreatures\"\nmsgid \"Farewell until we meet again!\"\nmsgstr \"Adio până ne întâlnim din nou!\"\n\n#. Key:\t5ED0CE6143EC50E6B5A1289D1A9A88E2\n#. SourceLocation:\t/Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_SewerCreatures\"\nmsgid \"I'm glad I could help.\"\nmsgstr \"Mă bucur că am putut ajuta.\"\n\n#. Key:\t65042BC342E9717229E74A9DD272DC5F\n#. SourceLocation:\t/Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_SewerCreatures\"\nmsgid \"It was nice to see you again.\"\nmsgstr \"A fost frumos să ne vedem din nou.\"\n\n#. Key:\t77959A144131C47488B221ADD9B1E13B\n#. SourceLocation:\t/Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_SewerCreatures\"\nmsgid \"Don't worry! I'm still looking for it.\"\nmsgstr \"Nu-ți face griji! Încă o caut.\"\n\n#. Key:\t7914F3CA40844C2A13A760BB0DAE1BFA\n#. SourceLocation:\t/Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_SewerCreatures\"\nmsgid \"I don't have time for you creature! Stay out of my way!\"\nmsgstr \"Nu am timp pentru tine creatură! Stai în afara drumului meu!\"\n\n#. Key:\t79A62658414FE0202F2E9AA0E0238BD4\n#. SourceLocation:\t/Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_9.Children(0).Children.Text\n#: /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_9.Children(0).Children.Text\nmsgctxt \"Dialogue_SewerCreatures\"\nmsgid \"Accept Quest\"\nmsgstr \"Acceptă Misiune\"\n\n#. Key:\t7EF6CBFA4A9C0B85B26AA6830C6121A2\n#. SourceLocation:\t/Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_1.Children(2).Children.Text\n#: /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_1.Children(2).Children.Text\nmsgctxt \"Dialogue_SewerCreatures\"\nmsgid \"Leave\"\nmsgstr \"Pleacă\"\n\n#. Key:\t85A2E48A4B27C5EB7DA4CFAA23555629\n#. SourceLocation:\t/Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_26.Text\n#: /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_26.Text\nmsgctxt \"Dialogue_SewerCreatures\"\nmsgid \"Farewell and good luck to you as well!\"\nmsgstr \"Adio și mult noroc și pentru tine!\"\n\n#. Key:\t9AEDA0E84BABEBCD8F18E8BC2D0B75D0\n#. SourceLocation:\t/Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_SewerCreatures\"\nmsgid \"Calm down creature! I mean you no harm.\"\nmsgstr \"Calmează-te creatură! Nu îți vreau răul.\"\n\n#. Key:\tB89304534B24114D19DF7AB07635FFDE\n#. SourceLocation:\t/Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_SewerCreatures\"\nmsgid \"All right I will see what I can do.\"\nmsgstr \"Bine, voi vedea ce pot face.\"\n\n#. Key:\tB8BD374E4738BFFDAFAC4EAA19E7A9D2\n#. SourceLocation:\t/Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_23.Text\n#: /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_23.Text\nmsgctxt \"Dialogue_SewerCreatures\"\nmsgid \"Oh, thank you!\"\nmsgstr \"Oh, multumesc!\"\n\n#. Key:\tCAFA874D4ECD3CBFC0ADFD93048A9AA5\n#. SourceLocation:\t/Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_SewerCreatures\"\nmsgid \"Just tell me what do you want...\"\nmsgstr \"Spune-mi ce vrei ...\"\n\n#. Key:\tCF62984840B7508E82BAC0AB9D53EC0A\n#. SourceLocation:\t/Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_9.Children(1).Children.Text\n#: /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_9.Children(1).Children.Text\nmsgctxt \"Dialogue_SewerCreatures\"\nmsgid \"Decline\"\nmsgstr \"Refuză\"\n\n#. Key:\tDA1FD0DC49E9B2999DCD489699C04106\n#. SourceLocation:\t/Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_1.Children(1).Children.Text\n#: /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_1.Children(1).Children.Text\nmsgctxt \"Dialogue_SewerCreatures\"\nmsgid \"Let it talk\"\nmsgstr \"Lasă-l să vorbească\"\n\n#. Key:\tEAD329F04773358B0CA339A4F155D990\n#. SourceLocation:\t/Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_SewerCreatures\"\nmsgid \"I'm sorry but I can't help you.\"\nmsgstr \"Îmi pare rău, dar nu te pot ajuta.\"\n\n#. Key:\tDA8649E54E3753ECDF9C4EAAB90D42B6\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/sewertut1.sewertut1:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/sewertut1.sewertut1:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_sewertut1\"\nmsgid \"I don't like the idea of this additional challenge, but without the help of the Keeper you won't be able to get out.\"\nmsgstr \"Nu-mi place ideea acestei provocări suplimentare, dar fără ajutorul Portarului nu vei putea ieși.\"\n\n#. Key:\t462EF40B4BF77FA77FD98DB4656692A2\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/sewertut2_magicbox.sewertut2_magicbox:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/sewertut2_magicbox.sewertut2_magicbox:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_sewertut2_magicbox\"\nmsgid \"It's a magic box! That's what it's supposed to do, demon.\"\nmsgstr \"Este o cutie magică! Asta ar trebui să facă, demon.\"\n\n#. Key:\tC34B7D8D499A8E8B767A58A19537A1EA\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/sewertut2_magicbox.sewertut2_magicbox:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/sewertut2_magicbox.sewertut2_magicbox:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_sewertut2_magicbox\"\nmsgid \"Is that box just floating in the air?\"\nmsgstr \"Această cutie plutește doar în aer?\"\n\n#. Key:\t348CCFC54F7E952295416496617F7615\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/sewertut3_silverkey.sewertut3_silverkey:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/sewertut3_silverkey.sewertut3_silverkey:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_sewertut3_silverkey\"\nmsgid \"What is that crystal?\"\nmsgstr \"Ce este acel cristal?\"\n\n#. Key:\t554B6C924D0234A869BDFF9412FC4F49\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/sewertut3_silverkey.sewertut3_silverkey:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/sewertut3_silverkey.sewertut3_silverkey:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_sewertut3_silverkey\"\nmsgid \"Don't care about that. Focus on finding a way out.\"\nmsgstr \"Nu-mi pasă de asta. Concentrează-te pe a găsi o cale de ieșire.\"\n\n#. Key:\t015A0B11422A6F2AE027FF8D9DF70664\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"We need his help.\"\nmsgstr \"Avem nevoie de ajutorul lui.\"\n\n#. Key:\t03C73AA849BF05421AB97BA696A8C9C4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_79.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_79.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"They always wanted to invade the Outpost. They are many and we are few.\"\nmsgstr \"Au dorit întotdeauna să invadeze avanpostul. Ei sunt mulți și noi suntem puțini.\"\n\n#. Key:\t0849CCCF4491D52B38AE7F827841E479\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Why should I set you free?\"\nmsgstr \"De ce să te eliberez?\"\n\n#. Key:\t090C7BBF4222952E1C3FD38F7CF9927E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_76.Text\n#. Key:\t0AC46EF744AA55EDDA83EDB6899BB2D1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_65.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_65.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_76.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Some say Tabby's spirit returned and took the artefacts to Lillian. Maybe that is what happened.\"\nmsgstr \"Unii spun că spiritul lui Tabby s-a întors și i-a dus artefactele la Lillian. Poate asta s-a întâmplat.\"\n\n#. Key:\t094943BF4D9202CE7B1CFCBF151886D5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Back to the question: will you get me out?\"\nmsgstr \"Înapoi la întrebarea: mă vei scoate afară?\"\n\n#. Key:\t0DBF728A4C052550BE5EEDBC9DEFB2E0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_29.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_29.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"I would invite you for dinner but unfortunately the door is closed.\"\nmsgstr \"Te-aș invita la cină, dar, din păcate, ușa este închisă.\"\n\n#. Key:\t112A48C54853F7689E1676A11FA8C352\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_48.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_48.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"No time to talk!\"\nmsgstr \"Nu e timp pentru a vorbi!\"\n\n#. Key:\t116C39AA495E99500962E8B3AF10DD4A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_83.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_83.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"I mean I'm sorry about the others... not that you survived.\"\nmsgstr \"Adică îmi pare rău de ceilalți ... nu că ai supraviețuit.\"\n\n#. Key:\t134299214C22044B012C27B62337C08E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_69.Text\n#. Key:\tFD1574E845CB284B7A85F09CA1580DD4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_58.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_58.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_69.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"But she is gone for months and no one knows where she might be.\"\nmsgstr \"Dar este plecată de luni întregi și nimeni nu știe unde ar putea fi.\"\n\n#. Key:\t14BD2A7C45E85692430B34820042C96F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_73.Text\n#. Key:\tEA5320F3406E2BFA9BD954899BFA19DA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_62.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_62.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_73.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"He had so many friends. We all gathered and buried him near the Ancient Temple.\"\nmsgstr \"Am avut atâția prieteni. Ne-am adunat cu toții și l-am îngropat lângă Templul Antic.\"\n\n#. Key:\t16E175D0437B4A671F4753A56E840278\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_33.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_33.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"I’m looking for three artefacts. Do you know something about them?\"\nmsgstr \"Caut trei artefacte. Ști ceva despre ele?\"\n\n#. Key:\t174BA1E34131FB1BD5A543A3CB86C724\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_35.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_35.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"I will return to the Main Station at Crossroad Cave and see what I can do with the trains.\"\nmsgstr \"Mă voi întoarce la gara principală de la Peștera Intersecției și voi vedea ce pot face cu trenurile.\"\n\n#. Key:\t1769115D4B72AB6CF8641487126A4A18\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"It has a key. The end of it is shaped like a dwarven helmet. You can easily recognise it.\"\nmsgstr \"Are o cheie. Capătul acesteia are forma unei căști de pitici. Îl poți recunoaște cu ușurință.\"\n\n#. Key:\t17CBB2E24B331E4C5682919AAD2E7F2E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_60.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_60.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"What happened to Tabby?\"\nmsgstr \"Ce s-a întâmplat cu Tabby?\"\n\n#. Key:\t1AA8B2E541B2B2E7CA1E86B1E08C1E5A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"They are all dead...\"\nmsgstr \"Toți sunt morți ...\"\n\n#. Key:\t1FCCD37546681195736D2290A8DAE121\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Oh, it’s you again.\"\nmsgstr \"Oh, ești din nou.\"\n\n#. Key:\t2581B27E486A1C71835E5BB44B0AE05E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_37.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_37.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"But first I finish my supper. See you there!\"\nmsgstr \"Dar mai întâi îmi termin cina. Ne vedem acolo!\"\n\n#. Key:\t2589E4AA4E5A406F6A98CB87D7382DC0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Just ask one of the other dwarfs to open the door.\"\nmsgstr \"Doar cere unuia dintre ceilalți pitici să deschidă ușa.\"\n\n#. Key:\t26162C784D2E65A2F8F491A80838F754\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_24.Children(4).Children.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_24.Children(4).Children.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Everyone dead?\"\nmsgstr \"Toți sunt morți?\"\n\n#. Key:\t2FEAED2844737D1B20BA64AE2414D8C6\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_72.Text\n#. Key:\tA119C2164FDE16E8F84B4E89578A1015\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_61.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_61.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_72.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"By the time I found him he was dead.\"\nmsgstr \"Când l-am găsit era mort.\"\n\n#. Key:\t3203A6044456CD8213037A9B1B668763\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Please help me out!\"\nmsgstr \"Te rog ajuta-mă!\"\n\n#. Key:\t32C0BE7F49563BC2846691B4F163AEF7\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Well that explains why they didn’t come for me over the last four months.\"\nmsgstr \"Ei bine, asta explică de ce nu au venit pentru mine în ultimele patru luni.\"\n\n#. Key:\t35F849134220FAE43E07268C439CE3A1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_31.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_31.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"What were you Dwarves doing here?\"\nmsgstr \"Ce făceați voi piticii aici?\"\n\n#. Key:\t39D36DCA4CD40A7E19D4F5AE69954DC3\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_71.Text\n#. Key:\tEFD384D542A5869726CAB7945F4C0EC4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_54.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_54.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_71.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Tabby found the three artefacts but on his way home he got injured.\"\nmsgstr \"Tabby a găsit cele trei artefacte, dar în drum spre casă a fost rănit.\"\n\n#. Key:\t39DEF30C4C3CCAB79867339AABD92BA0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_24.Children(3).Children.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_24.Children(3).Children.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Artefacts\"\nmsgstr \"Artefactele\"\n\n#. Key:\t3AF0406744C4656C5604EF931A688715\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_23.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_23.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"I've found the key!\"\nmsgstr \"Am găsit cheia!\"\n\n#. Key:\t3E074E784D66BE166553EB9F85D9854A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"How can I set you free?\"\nmsgstr \"Cum te pot elibera?\"\n\n#. Key:\t4100ECBE40C53051121F4C8A588FBDCB\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_24.Children(2).Children.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_24.Children(2).Children.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Train\"\nmsgstr \"Tren\"\n\n#. Key:\t41085B174230937FAF97CDBC868F852A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_24.Children(5).Children.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_24.Children(5).Children.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Leave\"\nmsgstr \"Pleacă\"\n\n#. Key:\t4204AAFB49C665B3CC32D78301307582\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_45.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_45.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Do you mean those traps out there?\"\nmsgstr \"Vrei să spui capcanele de acolo?\"\n\n#. Key:\t44AF6FF04B8A23F656F485AB9F1AFE60\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_36.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_36.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Catch me there if you need to go somewhere!\"\nmsgstr \"Prinde-mă acolo dacă trebuie să mergi undeva!\"\n\n#. Key:\t48FC728C4467C7CF9692AEB8CC71352D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_49.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_49.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"I will catch you at Crossroad Cave after I finished my supper.\"\nmsgstr \"Te voi prinde la Peștera Intersecției, după ce am terminat cina.\"\n\n#. Key:\t4A74231B43F74B39906C85904332EE87\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"What happened? How did you end up here?\"\nmsgstr \"Ce s-a întâmplat? Cum ai ajuns aici?\"\n\n#. Key:\t4FE354D247D257B181993087E5ADC74C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Errr... I don’t know... out of pure righteousness perhaps?\"\nmsgstr \"Errr ... nu știu ... din pură dreptate, poate?\"\n\n#. Key:\t529895FF4D6B505A0EDB5081215845AE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_53.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_53.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"He wasn't just an ordinary cat. He was somehow connected to a charming young girl called Lillian.\"\nmsgstr \"Nu era doar o pisică obișnuită. S-a legat cumva de o tânără fermecătoare, numită Lillian.\"\n\n#. Key:\t5C005582439FD5753AA90BB72F3284C8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_44.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_44.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"We build walls. We create machines out of golem spirits with simple rules which can't go wrong.\"\nmsgstr \"Construim ziduri. Creăm utilaje din spiritele golemilor cu reguli simple care nu pot merge greșit.\"\n\n#. Key:\t5C48292B4E4F1FAF4D7BB487713EA0B1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_59.Text\n#. Key:\t7F06827C4756423AE024F99922B00FDE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_70.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_59.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_70.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"I hope she will return.\"\nmsgstr \"Sper că se va întoarce.\"\n\n#. Key:\t624EDA19418303508EA7F58C5BD0DB4E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"All right!\"\nmsgstr \"În regula!\"\n\n#. Key:\t64E994E34D543F58D0F9DAA386AD7438\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Or do you like trains? I can help you redirect them to stations you couldn’t go otherwise.\"\nmsgstr \"Sau îți plac trenurile? Te pot ajuta să le redirecționați către stații la care nu poți merge altfel.\"\n\n#. Key:\t674A3DC8404EF8FC317D72A70877A0FF\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Errr... You know, sometimes in the evening I come here and have some late dinner. And there are others who think it would be funny to close the door when I'm inside.\"\nmsgstr \"Errr ... Știi, uneori seara vin aici și iau o cină târzie. Și sunt alții care cred că ar fi amuzant să închidă ușa când sunt înăuntru.\"\n\n#. Key:\t6B07A15F4E86ECA507DE1DA9B0634774\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_74.Text\n#. Key:\t8F415D40481AA448025D79AB123B2DEB\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_63.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_63.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_74.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"He was a good friend. We all miss him.\"\nmsgstr \"Era un bun prieten. Toți ne e dor de el.\"\n\n#. Key:\t6B47D3994D188506700B48BE85E0C740\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Once you collected all the artefacts you will need to take them back to a point where I can transport you to the Human Realm.\"\nmsgstr \"După ce ai colectat toate artefactele, va trebui să le duci înapoi într-un punct în care să te pot transporta pe Tărâmul Uman.\"\n\n#. Key:\t6B72634A488C0A9471F52AA154E56709\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_82.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_82.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"I’m sorry about that.\"\nmsgstr \"Îmi pare rău.\"\n\n#. Key:\t6C7C51F44B3881DDF4AE41B10F4D29E1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_52.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_52.Children(0).Children.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Tabby?\"\nmsgstr \"Tabby?\"\n\n#. Key:\t6EC585D64AFBB18576EE17B9DFC08AD7\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_2.Children(2).Children.Text\n#. Key:\tFB66CFE943F6EF32D1A40987B969DCDF\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_52.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_2.Children(2).Children.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_52.Children(1).Children.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"What happened?\"\nmsgstr \"Ce s-a întâmplat?\"\n\n#. Key:\t766A9A50425FA0D0A0374390B2AF5980\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"I like jokes and it would have been funny for I don’t know a few hours maybe...\"\nmsgstr \"Îmi plac glumele și ar fi fost amuzant pentru că nu știu câteva ore poate ...\"\n\n#. Key:\t81ABC3E441BE2D3A19257BBC9DDD42D0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_41.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_41.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"You can go down there by using the elevator.\"\nmsgstr \"Poți coborî acolo folosind liftul.\"\n\n#. Key:\t85B4C0DB47A2A3C3D504C29965DB6390\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_75.Text\n#. Key:\tE6F106AA404B92C9C6E8889876002813\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_64.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_64.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_75.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"We left the artefacts at his tomb, but one day later they disappeared.\"\nmsgstr \"Am lăsat artefactele la mormântul lui, dar o zi mai târziu au dispărut.\"\n\n#. Key:\t88F0611349D22BB5B8411FA1232B8724\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_38.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_38.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Bye!\"\nmsgstr \"Pa!\"\n\n#. Key:\t8A2BA24948D65C3EC801B6AA589C206F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_30.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_30.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Welcome back!\"\nmsgstr \"Bine ai revenit!\"\n\n#. Key:\t8A3CCFA44EAB376D6CB4C3B7DD8CEE8D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_53.Children(0).Children.Text\n#. Key:\tEEEF64F84F3FE0A37D029EB1A8BBE8A9\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_55.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_53.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_55.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Lillian?\"\nmsgstr \"Lillian?\"\n\n#. Key:\t8B9C46EA4C46385E6B3770BBD4648280\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_67.Text\n#. Key:\t999245954FBA1853A5E67A88353F152E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_56.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_56.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_67.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Lillian was really kind to us Dwarves. We couldn't ever meet her in person but she could talk to us via the cat Tabby.\"\nmsgstr \"Lillian a fost într-adevăr amabilă cu noi piticii. Nu am putut să o întâlnim niciodată în persoană, dar ea ne-a putut vorbi prin intermediul pisicii Tabby.\"\n\n#. Key:\t90C6625D4ED5F6EA08B07A87450A1BC9\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_32.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_32.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"You said something about trains...\"\nmsgstr \"Ai spus ceva despre trenuri ...\"\n\n#. Key:\t92793D7F4D0351BF74BB6A8C3EE6A182\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"How can I open the door?\"\nmsgstr \"Cum pot deschide ușa?\"\n\n#. Key:\t941CF27C40D3D82D6B41F5B3DD6501BB\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_52.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_52.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"My friend Tabby was also looking for artefacts.\"\nmsgstr \"Prietenul meu Tabby căuta, de asemenea, artefacte.\"\n\n#. Key:\t991D611A4F8BE2F8EAC77C9D746BAF95\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_78.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_78.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"I think the Kobolds attacked us by surprise.\"\nmsgstr \"Cred că Kobolds ne-a atacat prin surprindere.\"\n\n#. Key:\t9A7FA46C4687C80EBE3B4580631E9B8E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_43.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_43.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"After the Cataclysm we realized the only way to fight madness is to create rules to follow.\"\nmsgstr \"După Cataclism am realizat că singura modalitate de a lupta împotriva nebuniei este să creăm reguli de urmat.\"\n\n#. Key:\t9E9CE4714145ED45CA301AACA6CEBBAF\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_40.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_40.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"But there is a spare key in the Catacombs.\"\nmsgstr \"Dar există o cheie de rezervă în Catacombe.\"\n\n#. Key:\t9ED5DDC74852A2007D25CDB418A3EDDA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_46.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_46.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"They surely have nothing to do with madness...\"\nmsgstr \"Cu siguranță nu au nimic de-a face cu nebunia ...\"\n\n#. Key:\tA0117BB74AB541DE10847FBC5E5CCB32\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"What we were doing? Well we Dwarves are not like other creatures you might have met.\"\nmsgstr \"Ce făceam? Ei bine, piticii nu suntem ca alte creaturi pe care le-ai putea întâlni.\"\n\n#. Key:\tA258ABB740D6727685853E88F32936E2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"That sounds useful.\"\nmsgstr \"Sună util.\"\n\n#. Key:\tA3F231E34FB4B95DD27A84B9326E0BFE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_24.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_24.Children(0).Children.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Key\"\nmsgstr \"Cheie\"\n\n#. Key:\tB0B806C147D2EB9F312987B49DEBFC8F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_47.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_47.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"See? They are simple, effective and logical. Ruin can't harm us as long as we follow all the rules.\"\nmsgstr \"Vezi? Sunt simple, eficiente și logice. Ruina nu ne poate face rău atât timp cât respectăm toate regulile.\"\n\n#. Key:\tB464CECC4F774535530FC685E0F62787\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_77.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_77.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Do you have any idea how the others died?\"\nmsgstr \"Ai idee despre cum au murit ceilalți?\"\n\n#. Key:\tBE69B91C466965EEF56A6F920AF9E5A8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"I thought they were just kidding.\"\nmsgstr \"Am crezut că glumesc.\"\n\n#. Key:\tBFEAB99A4FE8C61CC35BCC9E926EFA97\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_51.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_51.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Just help me out.\"\nmsgstr \"Ajută-mă.\"\n\n#. Key:\tC06E3A27466B5D6C7FC4A39E55739800\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"But being here for four months seems a bit too much for me.\"\nmsgstr \"Dar a fi aici de patru luni mi se pare cam prea mult.\"\n\n#. Key:\tC31327F8430D2259C27BAE91F44F0119\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_2.Children(0).Children.Text\n#. Key:\tCCD4C84941546627E158A4915B41CDB7\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_19.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_19.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_2.Children(0).Children.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"How?\"\nmsgstr \"Cum?\"\n\n#. Key:\tC3BFAD59497E357A8180ADB86C75F14B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_68.Text\n#. Key:\tFF1A18C04F33FF434A2821A725CBFB5C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_57.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_57.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_68.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"She cared about us. She knew all our Strongholds and Outposts. She always warned us before the Kobolds attacked.\"\nmsgstr \"Îi păsa de noi. Știa toate fortărețele și avanposturile noastre. Ea ne-a avertizat întotdeauna înainte ca Kobolds să atace.\"\n\n#. Key:\tC5A94EDD47BC3D5F422A29982308E78D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_19.Children(1).Children.Text\n#. Key:\tF811970946DF32346DAE66AFE2F64664\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_2.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_19.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_2.Children(1).Children.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Why?\"\nmsgstr \"De ce?\"\n\n#. Key:\tC8E54B6E448A194DEB141C84323308F6\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_80.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_80.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"It was only a matter of time.\"\nmsgstr \"A fost doar o chestiune de timp.\"\n\n#. Key:\tCA02594643A55D1128F06FB2E8FDE676\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_50.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_50.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Yes, trains. I can help you reach destinations you couldn't reach on your own.\"\nmsgstr \"Da, trenuri. Te pot ajuta să ajungi la destinație la care nu puteai ajunge singur.\"\n\n#. Key:\tCC191532450BFB2679AFD88AD95B72B2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Finally someone!\"\nmsgstr \"În cele din urmă cineva!\"\n\n#. Key:\tCF4351D047E267981EF869BE88BB0753\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_24.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_24.Children(1).Children.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Dwarves\"\nmsgstr \"Piticii\"\n\n#. Key:\tD2377C864A2A80F17AD81581D7A7807F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_81.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_81.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Odd that I survived.\"\nmsgstr \"Ciudat că am supraviețuit.\"\n\n#. Key:\tDF12303E4C7A4DFB00054EA7CE07FF88\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_39.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_39.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Errr... I don't know.\"\nmsgstr \"Errr ... nu știu.\"\n\n#. Key:\tE8270F474353ECB77560C4A1173638A2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_27.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_27.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Any idea where that key might be?\"\nmsgstr \"Ai idee unde ar putea fi acea cheie?\"\n\n#. Key:\tEF1EFC6E4119CC9B41AF21ACE008D3B5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_26.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_26.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Have you found the key?\"\nmsgstr \"Ai găsit cheia?\"\n\n#. Key:\tF47418854FDFB9AD0E10468BEC8F1F58\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_42.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_42.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"I need to go now.\"\nmsgstr \"Trebuie sa plec acum.\"\n\n#. Key:\tF553C35F43DFC6CA04DA48A738597696\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_25.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_25.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Back already?\"\nmsgstr \"Înapoi deja?\"\n\n#. Key:\tFF942F904300D874A8C59AB8A954EF86\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_34.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_34.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Well done! Thank you! Thank you!\"\nmsgstr \"Foarte bine! Mulțumesc! Mulțumesc!\"\n\n#. Key:\t0499C9ED4395C4DD8AD1E48E854CD983\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"It was nice to see you too!\"\nmsgstr \"A fost plăcut să te văd și pe tine!\"\n\n#. Key:\t07153D014D72AF193040BA91A18BDC0A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_24.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_24.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"Great!\"\nmsgstr \"Grozav!\"\n\n#. Key:\t106E51E34033895E5C7F348AF8994564\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"Er... Thanks! We'll talk about this later.\"\nmsgstr \"E ... Mulțumesc! Vom vorbi despre asta mai târziu.\"\n\n#. Key:\t18E140B74385C5E48F23E0B7E862E569\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"Hello! It's nice to see you again.\"\nmsgstr \"Salut! E plăcut să te văd din nou.\"\n\n#. Key:\t25F72BCA416C39658A0879A27417EA6B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"Don’t worry, I’ll make ready a train for you heading that way.\"\nmsgstr \"Nu îți face griji, voi pregăti un tren pentru tine., care va merge în direcția aia.\"\n\n#. Key:\t26CBB1CD40F2080DE2183BA6AB3D2014\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"Ask him how you can travel to World’s End.\"\nmsgstr \"Întreabă-l cum poți călători la Sfârșitul Lumii.\"\n\n#. Key:\t26D1F4534C708623FB300DBE4EECADD2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"But I can't go back, because it's not safe.\"\nmsgstr \"Dar nu mă pot întoarce, pentru că nu este în siguranță.\"\n\n#. Key:\t2B14E76B4B16316D7525FFA6D37E4CBB\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"You know I'm a bit worried about what will happen to the Outpost.\"\nmsgstr \"Știi că sunt puțin îngrijorat de ce se va întâmpla cu avanpostul.\"\n\n#. Key:\t2BB0F16046A4CD8DF05DE6A95D2CF9B3\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"I’m really glad you found that key for me. Now I can finish my supper outside in fresh air!\"\nmsgstr \"Chiar mă bucur că ai găsit această cheie pentru mine. Acum îmi pot termina cina afară, în aer curat!\"\n\n#. Key:\t36EF13F042D5B5ADB870BEB97F688D08\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_29.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_29.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"Take this! You deserve it!\"\nmsgstr \"Ia asta! O meriți!\"\n\n#. Key:\t3E09B8F746E999130D26A0BEA945E6D6\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"Is everything all right?\"\nmsgstr \"Este totul în regulă?\"\n\n#. Key:\t4D5A326948713FE977D0DBB68CF4A475\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_27.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_27.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"Except those crazy traps...\"\nmsgstr \"Cu excepția capcanelor ălea nebune ...\"\n\n#. Key:\t5BE2C4324B64B35BD181B49E2D63E87F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"By the way, in case you need to go somewhere with the train just let me know.\"\nmsgstr \"Apropo, în caz că trebuie să mergi undeva cu trenul, anunță-mă.\"\n\n#. Key:\t66EDC37F4F3B3813F1B92D91A4107ADE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"I have banished some of the monsters lurking in the Outpost.\"\nmsgstr \"Am alungat câțiva dintre monștrii care pândesc în avanpost.\"\n\n#. Key:\t67EED0C742F3B4ED0A9B929C4B517A4A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"The Outpost is safe again.\"\nmsgstr \"Avanpostul este din nou în siguranță.\"\n\n#. Key:\t6F1AF94E4DE4A338EFF79C85D99B944A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_19.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_19.Children(1).Children.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"Outpost\"\nmsgstr \"Avanpost\"\n\n#. Key:\t84D15B994BADC0AAED61848E817E49E1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"Thanks!\"\nmsgstr \"Mulțumesc!\"\n\n#. Key:\t8C7D69324C544DAC53C5CCA724B4B461\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_23.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_23.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"Could you somehow make the enemies move to somewhere else maybe?\"\nmsgstr \"Ai putea cumva să-i faci pe dușmani să se mute în altă parte poate?\"\n\n#. Key:\t8F66738A44B7D19EABAD40873B3FCAA3\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_19.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_19.Children(0).Children.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"Do you need help?\"\nmsgstr \"Ai nevoie de ajutor?\"\n\n#. Key:\t9249DFC34CFB46E1738C97A3283268D2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"Well done! Well done!\"\nmsgstr \"Foarte bine! Foarte bine!\"\n\n#. Key:\tA027C29849372B1C452083A84609B1F5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_19.Children(2).Children.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_19.Children(2).Children.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"Leave\"\nmsgstr \"Pleacă\"\n\n#. Key:\tA037C9E543AC131DAF4B6281A27BD56C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"Hello again my friend!\"\nmsgstr \"Salut din nou prietenul meu!\"\n\n#. Key:\tA4F1343D4D537FC1907096B564D3842E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"Oh, it must be a charming place!\"\nmsgstr \"Oh, trebuie să fie un loc fermecător!\"\n\n#. Key:\tACF022EF4C55A6553F29DB969827379D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_26.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_26.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"Anyway, take this for your effort!\"\nmsgstr \"Oricum, ia asta pentru efortul tău!\"\n\n#. Key:\tB680A1D54923C59C081E46A65A2754D1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"As the last Defender, it would be my duty to keep that place safe.\"\nmsgstr \"Ca ultim apărător, ar fi datoria mea să păstrez locul în siguranță.\"\n\n#. Key:\tB9E0526D41FDB742FCB51991A0220B17\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"That’s where I can take you out of the Ruined Realm.\"\nmsgstr \"Acolo te pot scoate din Tărâmul Ruinat.\"\n\n#. Key:\tBF1AD65A407133C13B811CB14A997A2A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"We can talk some more once I've finished my supper...\"\nmsgstr \"Mai putem vorbi ceva odată ce am terminat cina ...\"\n\n#. Key:\tE211EA4D4D69D09144B914850B17A8AE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_25.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_25.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"Well, I can't do my duty until you banish all of them.\"\nmsgstr \"Ei bine, nu-mi pot face datoria până nu îi alungi pe toți.\"\n\n#. Key:\tEFD408FF4DAFD18E10ED3282D959914E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"You don't need to go anywhere before you find the three artefacts.\"\nmsgstr \"Nu trebuie să mergi nicăieri înainte de a găsi cele trei artefacte.\"\n\n#. Key:\tF500AA3C494B40302E298CA54FF3344B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"I would like to go to World’s End.\"\nmsgstr \"Aș dori să merg la finalul lumii.\"\n\n#. Key:\tFDC63C35472E1752E2D092BC77DAD28B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"I'll see what I can do.\"\nmsgstr \"Voi vedea ce pot face.\"\n\n#. Key:\t00A5A8684B1EF5FF2319428685540844\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_13.Children(0).Children.Text\n#. Key:\t471B46884399845B6D9442A8EADC2A48\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_9.Children(0).Children.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_13.Children(0).Children.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_9.Children(0).Children.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"Portal\"\nmsgstr \"Portal\"\n\n#. Key:\t03EA3D4249797B593981C1B699A2CF5A\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"Oh! The Walking Ball returned! Just in time!\"\nmsgstr \"Oh! Mingea Mergătoare s-a întors! La timp!\"\n\n#. Key:\t04DC604342615AD3DCFCE99EB9AAF157\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_19.Children(1).Children.Text\n#. Key:\t1070909F4434D9B0D03DD3BD62692CE0\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_16.Children(0).Children.Text\n#. Key:\t76A679CE45B5A9A47CA620A396E02F48\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_13.Children(2).Children.Text\n#. Key:\t8FC1E822454A2FDA1847119C5004F161\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_21.Children(0).Children.Text\n#. Key:\t9036093D446B2F8C34705BBCFC73F4A0\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_9.Children(2).Children.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_13.Children(2).Children.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_16.Children(0).Children.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_19.Children(1).Children.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_21.Children(0).Children.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_9.Children(2).Children.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"Leave\"\nmsgstr \"Pleacă\"\n\n#. Key:\t142E85484BA4E9CF475F0780D951BAE5\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"But they were so tasty.\"\nmsgstr \"Dar erau atât de gustoase.\"\n\n#. Key:\t1E763B4D4D535AA83B50D4B87DB5A15D\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"You again?\"\nmsgstr \"Tu din nou?\"\n\n#. Key:\t2430044E46A3456249D6A99D0FC31D30\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_9.Children(1).Children.Text\n#. Key:\tB3695A284A15574F3874BDAB1B8C14EB\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_19.Children(0).Children.Text\n#. Key:\tDC8D78774D326DA9A70EFC81A857A417\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_13.Children(1).Children.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_13.Children(1).Children.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_19.Children(0).Children.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_9.Children(1).Children.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"Give Weird Device\"\nmsgstr \"Dă dispozitiv ciudat\"\n\n#. Key:\t29AD586B41502E4FAFF79E94FDADA50D\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"Unfortunately I don't have any.\"\nmsgstr \"Din păcate nu am niciunul.\"\n\n#. Key:\t3418CA5A44B4531926317CB100CEC2F4\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"Just let me know when you're done! Meanwhile, I'll be reading a few more pages.\"\nmsgstr \"Lasă-mă să știu când ai terminat! Între timp, voi citi încă câteva pagini.\"\n\n#. Key:\t37CD676C4C4F585C3CC048B56EEF6B92\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"I was supposed to find a portal here.\"\nmsgstr \"Trebuia să găsesc un portal aici.\"\n\n#. Key:\t3C2778B12A09151A002F016B1E3F6212\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"Also, if I hadn't drank the last two bottles... that would have helped...\"\nmsgstr \"De asemenea, dacă nu aș fi băut ultimele două sticle ... asta m-ar fi ajutat ...\"\n\n#. Key:\t42E3EE32491F578E618913B4AF958187\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"Really? That sounds like my students! They were always complaining about unannounced examinations or even worse, \\\"Why are there no lessons tomorrow?\\\".\"\nmsgstr \"Într-adevăr? Asta sună ca studenții mei! Se plângeau întotdeauna de examene neanunțate sau chiar mai rău, „De ce nu sunt lecții mâine?”.\"\n\n#. Key:\t44626CCD498CA592B8FAD1B01EDF33AB\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_2.Children(0).Children.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_2.Children(0).Children.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"Don't have\"\nmsgstr \"Nu am\"\n\n#. Key:\t55EAD2524D0BCF52B25A1B9EAB1754B2\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"That's it my ball! I wish I had more students like you.\"\nmsgstr \"Asta e mingea mea! Mi-aș dori să am mai mulți studenți ca tine.\"\n\n#. Key:\t6682474947E016803A188FA968FD76BE\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"Oh my...\"\nmsgstr \"Vai...\"\n\n#. Key:\t786849EF4E531580865712BBEDD25B32\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"That is amazing! Thank you, my globular friend! Take these coins, I am sure that you will enjoy spending them on... on whatever Balls like you like to get.\"\nmsgstr \"Asta este incredibil! Mulțumesc, prietenul meu globular! Ia aceste monede, sunt sigur că vă va plăcea să le cheltuiți pe ... pe orice mingi ca tine doresc să cumpere.\"\n\n#. Key:\t7FFC816545AA219D43FCA3A2ABF33E9E\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"Nevermind, I will just read a bit more... at least until a solution is found for the whole problem.\"\nmsgstr \"Nu contează, voi citi doar un pic mai mult ... cel puțin până când se va găsi o soluție pentru întreaga problemă.\"\n\n#. Key:\t818E4C1245F622C192178CB1F21694A3\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_2.Children(1).Children.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_2.Children(1).Children.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"What's the matter?\"\nmsgstr \"Ce s-a întâmplat?\"\n\n#. Key:\t84A119EB4FFB518BA7AA6394768F1DD3\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"Did the Gatekeeper open the gate for you?\"\nmsgstr \"Portarul a deschis poarta pentru tine?\"\n\n#. Key:\t88FD93954B70482DAC5F2AA5332F23D5\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"One must always be eager to solve a problem. No matter how challenging that is.\"\nmsgstr \"Unul trebuie să fie întotdeauna dornic să rezolve o problemă. Oricât de provocator ar fi.\"\n\n#. Key:\t9CEE1942434DACB2DB3C1AA2005A1E94\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"But we might find another way to solve the problem.\"\nmsgstr \"Dar am putea găsi un alt mod de a rezolva problema.\"\n\n#. Key:\tC070EF8E47744D116D4E39AC8F7C1941\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"I hope that you still have at least one bottle of that potion of mine. I could really use some...\"\nmsgstr \"Sper că mai aveți cel puțin o sticlă din acea poțiune a mea. Aș putea folosi unele ...\"\n\n#. Key:\tC39CD0F34CDFDCB0B2CF08917834F1A8\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"Here is a Weird Device that I found in the hideout of the Secret Science Society.\"\nmsgstr \"Iată un dispozitiv ciudat pe care l-am găsit în ascunderea Societății de Științe Secrete.\"\n\n#. Key:\tCBB0BCAF4E19F942AC57F988104A9A65\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"I've used all of them to get back from the Sewer. You should have told me that there is another way out!\"\nmsgstr \"Le-am folosit pe toate pentru a mă întoarce din canalizare. Ar fi trebuit să-mi spui că există o altă cale de ieșire!\"\n\n#. Key:\tE866A83647B163E53260C2B541AA0D7B\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"Well, the portal is definitely here, but as you might have already noticed, the place is a bit worn.\"\nmsgstr \"Ei bine, portalul este cu siguranță aici, dar după cum ai observat deja, locul este puțin uzat.\"\n\n#. Key:\tF0A4AD1448267D94CAB7F79AD6CEFD59\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"Not Yet.\"\nmsgstr \"Nu încă.\"\n\n#. Key:\tF83C2C894C2EA511DCDCE6B824CC0591\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"Only the Gatekeeper can reopen the portal.\"\nmsgstr \"Doar Portarul poate redeschide portalul.\"\n\n#. Key:\t76653DEC40EE0ED098B5EE8810B1A097\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/TL_GetSoulkeeper.TL_GetSoulkeeper:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/TL_GetSoulkeeper.TL_GetSoulkeeper:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_TL_GetSoulkeeper\"\nmsgid \"A Spellcaster. It makes you able to use the Ruined Realm's magic, at least, up to a certain level.\"\nmsgstr \"Un făcător de vrăji. Te face să poți folosi magia Tărâmului Ruinat, cel puțin, până la un anumit nivel.\"\n\n#. Key:\tBD48F7804F49751510AB2E909906C52F\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/TL_GetSoulkeeper.TL_GetSoulkeeper:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/TL_GetSoulkeeper.TL_GetSoulkeeper:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_TL_GetSoulkeeper\"\nmsgid \"What is it?\"\nmsgstr \"Ce este?\"\n\n#. Key:\tDFF1C93D4005A778F0B696A2DC949DC6\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/TL_GetSoulkeeper.TL_GetSoulkeeper:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/TL_GetSoulkeeper.TL_GetSoulkeeper:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_TL_GetSoulkeeper\"\nmsgid \"That amulet is useful.\"\nmsgstr \"Amuleta este utilă.\"\n\n#. Key:\t09CDAFF84CF3F066B25A228640D45277\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_TL_Monk\"\nmsgid \"Please tell your Wizard that Monk would like to have a word with him.\"\nmsgstr \"Te rog să îi spui Vrăjitorului că Călugărul ar dori să vorbească cu el.\"\n\n#. Key:\t0E97585C46B73E4AF939169CF45067A3\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_TL_Monk\"\nmsgid \"I can only guess that right now, he's complaining about me.\"\nmsgstr \"Nu pot decât să ghicesc asta, acum se plânge de mine.\"\n\n#. Key:\t2E82A2B6449D8BA37ADBE7AEE1486791\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_TL_Monk\"\nmsgid \"Just get rid of him.\"\nmsgstr \"Doar scapă de el.\"\n\n#. Key:\t430D927D40EF24EED23E55A83F48FDD7\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_TL_Monk\"\nmsgid \"I'm sorry but he doesn't want to talk to you.\"\nmsgstr \"Îmi pare rău, dar nu vrea să vorbească cu tine.\"\n\n#. Key:\t59E21DC1476038EAD4EC91BC00DA4D8B\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_3.Children(2).Children.Text\n#: /Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_3.Children(2).Children.Text\nmsgctxt \"Dialogue_TL_Monk\"\nmsgid \"Ask Wizard\"\nmsgstr \"Întrebăl pe vrăjitor\"\n\n#. Key:\t5AFB166C49DEB2D9017AED887A1E424D\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_TL_Monk\"\nmsgid \"Farewell, my friend, until we meet again!\"\nmsgstr \"Adio, prietene, până ne întâlnim din nou!\"\n\n#. Key:\t5D80CBEB46203E3A759B498B95571F4F\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_3.Children(1).Children.Text\n#: /Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_3.Children(1).Children.Text\nmsgctxt \"Dialogue_TL_Monk\"\nmsgid \"I won't transfer!\"\nmsgstr \"Nu mă transfer!\"\n\n#. Key:\t66D9E1874A9749A8881372807C0B9D54\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_TL_Monk\"\nmsgid \"Ha-ha-ha... I know he heard everything.\"\nmsgstr \"Ha, ha, ha ... Știu că a auzit totul.\"\n\n#. Key:\t8BD7C20C4084000925D1489BE3F6EE15\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_TL_Monk\"\nmsgid \"I don't talk to him!\"\nmsgstr \"Nu vorbesc cu el!\"\n\n#. Key:\tA227CE5A47002A80D3988ABA1364CF3E\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_3.Children(0).Children.Text\n#: /Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_3.Children(0).Children.Text\nmsgctxt \"Dialogue_TL_Monk\"\nmsgid \"Wizard don't want\"\nmsgstr \"Vrăjitorul nu vrea\"\n\n#. Key:\tA8E469374586A1D8A734D696AF662F9A\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_TL_Monk\"\nmsgid \"I also have something for you, Wanderer!\"\nmsgstr \"Am și ceva pentru tine, Rătăcitorule!\"\n\n#. Key:\tCE0E3B1B424BEDDF4A830B8DD0BB3272\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_TL_Monk\"\nmsgid \"This might help you along the way.\"\nmsgstr \"Acest lucru vă poate ajuta pe parcurs.\"\n\n#. Key:\tD6B184754B86F236C93454A95BF92B31\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_TL_Monk\"\nmsgid \"I won't deliver your messages anymore! If the two of you want something, then go get it yourselves!\"\nmsgstr \"Nu vă mai transmit mesajele! Dacă voi doi doriți ceva, atunci mergeți și luați-l voi!\"\n\n#. Key:\tDB3AEAF24056B19A7D80E29E7D011D80\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_TL_Monk\"\nmsgid \"That's right. I will give him more time.\"\nmsgstr \"Asta e corect. Îi voi acorda mai mult timp.\"\n\n#. Key:\tE2F9F07A4A2B8D1A578BCC9716AB4D44\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_TL_Monk\"\nmsgid \"Wizard! A fellow named Monk wants to talk to you!\"\nmsgstr \"Vrăjitorule! Un coleg pe nume Calugăr vrea să vorbească cu tine!\"\n\n#. Key:\tE8987AC84528E4071DC27E9854C3C4DE\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_TL_Monk\"\nmsgid \"Hello, little Wanderer!\"\nmsgstr \"Bună ziua, micule Hoinar!\"\n\n#. Key:\tFF355D9347D0068FBB40879E3EAEA8FB\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_TL_Monk\"\nmsgid \"But please...\"\nmsgstr \"Dar te rog...\"\n\n#. Key:\tAC0DE5F1402FBAAFE6587B827D463C3C\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/TL_SoulkeeperHint.TL_SoulkeeperHint:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/TL_SoulkeeperHint.TL_SoulkeeperHint:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_TL_SoulkeeperHint\"\nmsgid \"Use the Soulstone to summon the Keeper.\"\nmsgstr \"Folosiți Piatra Sufletului pentru a-l chema pe Deținătorul Sufletului.\"\n\n#. Key:\t031849B3493F1528A0146DA55BD7F00F\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/TL_TakeSoulkeeperHint.TL_TakeSoulkeeperHint:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/TL_TakeSoulkeeperHint.TL_TakeSoulkeeperHint:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_TL_TakeSoulkeeperHint\"\nmsgid \"It would be easier if I could just simply summon her back to me...\"\nmsgstr \"Ar fi mai ușor dacă aș putea doar s-o chem înapoi la mine ...\"\n\n#. Key:\t259EE9E14B86B2597D5F4EA60831D269\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/TL_TakeSoulkeeperHint.TL_TakeSoulkeeperHint:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/TL_TakeSoulkeeperHint.TL_TakeSoulkeeperHint:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_TL_TakeSoulkeeperHint\"\nmsgid \"Be more careful the next time...\"\nmsgstr \"Fii mai atent data viitoare ...\"\n\n#. Key:\t86266BC54CC02BE988EA24B18BF76359\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/TL_TakeSoulkeeperHint.TL_TakeSoulkeeperHint:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/TL_TakeSoulkeeperHint.TL_TakeSoulkeeperHint:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_TL_TakeSoulkeeperHint\"\nmsgid \"Now go back to the Soulkeeper.\"\nmsgstr \"Acum revino la Deținătorul Sufletului.\"\n\n#. Key:\tDCA8CF9A4CFF4644FBD42EADBFC6E773\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/TL_TakeSoulkeeperHint.TL_TakeSoulkeeperHint:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/TL_TakeSoulkeeperHint.TL_TakeSoulkeeperHint:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_TL_TakeSoulkeeperHint\"\nmsgid \"Er... It's still with me.\"\nmsgstr \"E ... încă este cu mine.\"\n\n#. Key:\t012DDB8E4423EB98285155B3E1EFBF9A\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_65.Children(2).Children.Text\n#. Key:\t3485AE344D04D0944341F3A7391703EF\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.Children(3).Children.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_65.Children(2).Children.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.Children(3).Children.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"Set me free\"\nmsgstr \"Eliberează-mă\"\n\n#. Key:\t04E44BE94ABFE8614689AC890D01001D\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_65.Children(1).Children.Text\n#. Key:\t275944AA468D9CA8613B9586EC3D9C62\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.Children(2).Children.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_65.Children(1).Children.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.Children(2).Children.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"How to open gate\"\nmsgstr \"Cum se deschide poarta\"\n\n#. Key:\t10EB6BE941C633380422F7953F0171DA\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"I think... I am...\"\nmsgstr \"Eu cred... ca sunt...\"\n\n#. Key:\t22618C8F490BC5932411FFB41F38C383\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.SpeechSequence(0).SpeechSequence.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.SpeechSequence(0).SpeechSequence.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"Oh! A walking ball!\"\nmsgstr \"Oh! O minge care merge!\"\n\n#. Key:\t28ED4B8B4023E9A859B8A4BFF7DFEE8A\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"I am crazy, therefore I think!\"\nmsgstr \"Sunt nebun, de aceea cred!\"\n\n#. Key:\t389F7FA440377CA4EBA31DA4EE2FEEAE\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_65.Children(3).Children.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_65.Children(3).Children.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"Leave\"\nmsgstr \"Ieși\"\n\n#. Key:\t408E74BC4DBA10DA41853B9421DBA07B\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_65.Children(0).Children.Text\n#. Key:\t55BC9258400712FE4D5CED8BFA0AD22C\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.Children(1).Children.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_65.Children(0).Children.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.Children(1).Children.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"How to prove Worthy\"\nmsgstr \"Cum să dovedesc a fi demn\"\n\n#. Key:\t5D0DBB0344815D41A50D9FA178339BCA\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_24.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_24.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"Here, take one!\"\nmsgstr \"Aici, ia unul!\"\n\n#. Key:\t5E8C88684BE93A26C26BFBAF23D69FD9\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.SpeechSequence(5).SpeechSequence.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.SpeechSequence(5).SpeechSequence.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"And I am not wise. In fact, I am totally crazy. But look on the bright side! At least I am aware of it.\"\nmsgstr \"Și nu sunt înțelept. De fapt, sunt total nebun. Dar uită-te pe partea strălucitoare! Cel puțin eu sunt conștient de asta.\"\n\n#. Key:\t5F9588AA4FFA9FEB2C7101B32CB98950\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_55.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_55.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"Come back if you change your mind!\"\nmsgstr \"Reveniți dacă vă răzgândiți!\"\n\n#. Key:\t69BF5D3C44D3BE2468ADDF97E99920E9\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"I think something's happening with the door's mechanism... but who knows? I can definitely hear some creaking! It's hard to guess which one of those is the real one...\"\nmsgstr \"Cred că se întâmplă ceva cu mecanismul ușii ... dar cine știe? Cu siguranță pot auzi niște scârțâituri! Este greu de ghicit care dintre acestea este adevărata ...\"\n\n#. Key:\t6B46CC3F44284076B1F460BEE2D93116\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.SpeechSequence(1).SpeechSequence.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.SpeechSequence(1).SpeechSequence.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"How unique, how original, how... sporty!\"\nmsgstr \"Cât de unic, cât de original, cât de ... sportiv!\"\n\n#. Key:\t6DFC995B4364B6358A8F00BEDD007C80\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"I am, therefore I think!\"\nmsgstr \"Eu sunt, de aceea gândesc!\"\n\n#. Key:\t72FA8AF8413CF23907BB9EA6587F512E\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_63.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_63.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"I was pretty sure I had to face him too... that's why I prepared! Potion of Worthiness! I have a few bottles...\"\nmsgstr \"Eram destul de sigur că trebuie să mă înfrunt și eu ... de aceea m-am pregătit! Poțiunea demnității! Am câteva sticle ...\"\n\n#. Key:\t7BB736394144C8B2173886993EE33ADA\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"Look, I'm forced to stay in this realm so that I could do all these silly tasks for a wizard. Any chance you could help me with that? Please?\"\nmsgstr \"Uite, sunt obligat să rămân pe tărâm, ca să pot face toate aceste sarcini stupide pentru un vrăjitor. Ai vreo șansă să mă ajuți cu asta? Te rog?\"\n\n#. Key:\t7E8985A441145AE9365C64810036EBE0\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.SpeechSequence(3).SpeechSequence.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.SpeechSequence(3).SpeechSequence.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"Actually yes, I...\"\nmsgstr \"De fapt da, Eu ...\"\n\n#. Key:\t85CB0B164556D460A07F948F942D7AC4\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_61.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_61.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"That's how these rusty monsters work like: you pull a few levers here and there, and... whoops, the door is open! It's called science!\"\nmsgstr \"Așa funcționează acești monștri ruginiți: tragi câteva manete pe ici și pe colo și ... oops, ușa este deschisă! Se numește știință!\"\n\n#. Key:\t878921884D0FDCFC78971E828C7D7FBB\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_66.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_66.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"I've got to go...\"\nmsgstr \"Trebuie să plec...\"\n\n#. Key:\t8FF0B1A64B29AAB8DABAC49F5EBCE625\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_60.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_60.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"That's easy! Just pull every single lever you can find.\"\nmsgstr \"Asta e ușor! Pur și simplu trage fiecare manetă pe care o găsești.\"\n\n#. Key:\t9163F7AB40673D9EB5C936A37CC7B0C7\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_62.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_62.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"Sounds like you met the GateKeeper!\"\nmsgstr \"Se Pare că ai întâlnit Portarul!\"\n\n#. Key:\t96EED9B34D798E48F9B47283A5290A5B\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.SpeechSequence(4).SpeechSequence.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.SpeechSequence(4).SpeechSequence.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"It was a rhetorical question. I am not old!\"\nmsgstr \"A fost o întrebare retorică. Nu sunt bătrân!\"\n\n#. Key:\tB3141D2247D5DF307B63A4BF330F8070\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_67.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_67.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"Not really, I don't feel like helping you out. And to be honest, I prefer to stay away from wizards. Sorry!\"\nmsgstr \"Nu chiar, nu am chef să te ajut. Și să fiu sincer, prefer să stau departe de vrăjitori. Îmi pare rău!\"\n\n#. Key:\tB7A8F5A6474D18116F76BC929DB28D40\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"It's been nice meeting you.\"\nmsgstr \"A fost frumos să te întâlnesc.\"\n\n#. Key:\tBE16F7204818B7231748D1B9C55DB4F6\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"Here, take this! I hope it's worth the trouble... hahaha... Thanks to you I can continue with my journey... after I read a few more pages, of course.\"\nmsgstr \"Aici, ia asta! Sper să merite situația dificilă ... hahaha ... Mulțumită ție, pot continua cu călătoria mea ... după ce am citit încă câteva pagini, desigur.\"\n\n#. Key:\tBF9983D645C558E1AB5D559E70FEFDA0\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.SpeechSequence(6).SpeechSequence.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.SpeechSequence(6).SpeechSequence.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"Is there anything a middle-aged crazy gnome scientist can do for you? Now, this one is not a rhetorical question!\"\nmsgstr \"Există ceva ce un om pitic de știință nebun de vârstă mijlocie poate să facă pentru tine? Acum, aceasta nu este o întrebare retorică!\"\n\n#. Key:\tC29E98A84971D7F0585C0F9522C30209\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_64.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_64.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"I will give you one if you are kind enough to open this door for me! I am stuck on the other side, you see...\"\nmsgstr \"Îți voi da unul dacă ești suficient de amabil să deschizi această ușă pentru mine! Sunt blocat de cealaltă parte, vezi ...\"\n\n#. Key:\tC8BEE9304FE466C0EB9F76A0B8A770D6\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.Children(0).Children.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.Children(0).Children.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"No way!\"\nmsgstr \"În nici un caz!\"\n\n#. Key:\tCB197A5E46F44960333A02B7691B0EA6\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"Thanks and good luck!\"\nmsgstr \"Mulțumesc și mult noroc!\"\n\n#. Key:\tCD2D130744EE2EDC8C96B1A286FCCD28\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"Getting help from a mad scientist? Thanks, but I would rather skip that!\"\nmsgstr \"Obține ajutor de la un om de știință nebun? Mulțumesc, dar aș prefera să sar peste asta!\"\n\n#. Key:\tD0A8B5EA452D49F6400A18A2CDAC9A0E\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_29.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_29.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"I am crazy, therefore I am!\"\nmsgstr \"Sunt nebun, de aceea sunt!\"\n\n#. Key:\tDA95542D4776F0EF7909078DED258AF8\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_27.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_27.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"You managed to open the gate! Well done!\"\nmsgstr \"Ai reușit să deschizi poarta! Foarte bine!\"\n\n#. Key:\tDEC93709471D0B331684CFAF42A65B49\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_37.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_37.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"How unfortunate! And I thought that I was the idiot here. You will totally need my help... you'll see.\"\nmsgstr \"Ce nefericire! Și am crezut că sunt idiotul aici. Vei avea nevoie total de ajutorul meu ... vei vedea.\"\n\n#. Key:\tDF18B66D4109CAA0BCC1FDBED74521CD\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"Some kind of golem sent me here to prove my worthiness... any idea how I could do that?\"\nmsgstr \"Un fel de golem m-a trimis aici să îmi demonstrez demnitatea ... ai vreo idee cum aș putea face asta?\"\n\n#. Key:\tE546AE1443A4262B05869CB758E42CF2\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.SpeechSequence(2).SpeechSequence.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.SpeechSequence(2).SpeechSequence.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"Is there anything an old wise gnome scientist could do for you, I wonder?\"\nmsgstr \"Există ceva ce un om de știință înțelept bătrân ar putea face pentru tine, mă întreb?\"\n\n#. Key:\tEEA782044BAA1D5C3B77D49DAE004512\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_58.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_58.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"Any idea how I could open this gate for you?\"\nmsgstr \"Ai vreo idee despre cum aș putea deschide această poartă pentru tine?\"\n\n#. Key:\t04BFEE6A43E303DB376ACFA5F270F846\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"I've managed to get this obelisk thing. Do you know what it is?\"\nmsgstr \"Am reușit să obțin chestia asta cu obeliscul. Știi ce e asta?\"\n\n#. Key:\t0A6FE902444DF9B2F18A95B495FB7A90\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"I... I don't know. They are kinda predictable though...\"\nmsgstr \"Eu ... nu stiu. Cu toate acestea, sunt cam previzibile ...\"\n\n#. Key:\t0AB07AB7403AECECD38D479D8F4A32D2\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"Don't care about it and you'll live longer.\"\nmsgstr \"Nu-ți pasă de asta și vei trăi mai mult.\"\n\n#. Key:\t1026E61D4F2798A2E0FEE0B9ACA2135B\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"There is a floating magical thing right there...\"\nmsgstr \"Există un lucru magic plutitor chiar acolo ...\"\n\n#. Key:\t174506D944E38D478377CDA1DEF299B4\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"Isn't it weird that doors are always closed around these places?\"\nmsgstr \"Nu este ciudat că ușile sunt întotdeauna închise în jurul acestor locuri?\"\n\n#. Key:\t240F98824200E33959D455AF1A3219B8\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_37.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_37.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"This is my research project! Looks totally garbage, but sometimes even I cannot understand my brilliance.\"\nmsgstr \"Acesta este proiectul meu de cercetare! Arată complet gunoi, dar uneori nici măcar eu nu îmi pot înțelege strălucirea.\"\n\n#. Key:\t24286C6A494F848CE13B5C98E38D4718\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_6.Children(0).Children.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_6.Children(0).Children.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"Let him answer\"\nmsgstr \"Lasă-l să răspundă\"\n\n#. Key:\t26727CAB403FA6DED50EC38ED01E4241\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"I found the secret hideout of the Secret Science Society. Is there anything you could tell me about them?\"\nmsgstr \"Am găsit ascunderea secretă a Societății de Științe Secrete. Ai putea să-mi spui ceva despre ei?\"\n\n#. Key:\t2BF9EF0C41CB352340F460AE4BC0FE02\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"I guess he will be happy if you return this to him, but otherwise it's garbage.\"\nmsgstr \"Bănuiesc că va fi fericit dacă îi întorci asta, dar în caz contrar este gunoi.\"\n\n#. Key:\t315BB85E475FAA4C715E7F850B0E5EE2\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_24.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_24.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"Really? Then maybe I should give you this: another bottle of Potion of Worthiness!\"\nmsgstr \"Într-adevăr? Atunci poate că ar trebui să-ți ofer asta: încă o sticlă de poțiune demnă!\"\n\n#. Key:\t316CF9AD4CF36FAFFAC45CA0A488FE53\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_57.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_57.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"I've got to go...\"\nmsgstr \"Trebuie să plec...\"\n\n#. Key:\t3A9767C34F0BB6E9E131D8BC7A8D9A25\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_26.Children(1).Children.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_26.Children(1).Children.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"Secret Science Society\"\nmsgstr \"Societatea de Științe Secrete\"\n\n#. Key:\t3E857073418A17EC48A1EA9D2B28A43E\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_30.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_30.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"I pulled a few levers here and there...\"\nmsgstr \"Am tras câteva manete aici și acolo ...\"\n\n#. Key:\t4671C3394EAF0988255C8090B409415D\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"Yes, things like that happen here all the time. You'll get used to it.\"\nmsgstr \"Da, așa ceva se întâmplă aici tot timpul. Te vei obișnui.\"\n\n#. Key:\t4709B6384B48D479672BC69EBC640C7E\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_31.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_31.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"Oh, really? That was nice, even if it was absolutely unnecessary! Never mind, here is your reward!\"\nmsgstr \"Oh, chiar așa? Asta a fost frumos, chiar dacă a fost absolut inutil! Nu contează, iată răsplata ta!\"\n\n#. Key:\t5AE5A1A6408BC2EB0F9F96BA0826ACB0\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"Hmm... One of the creaks was a bit odd. I think the door will open soon!\"\nmsgstr \"Hmm ... Una dintre creste a fost un pic ciudată. Cred că ușa se va deschide în curând!\"\n\n#. Key:\t5C81129F4B064C44F44335A3AB1CC178\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_29.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_29.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"The mind is furnished with ideas by a drunk upholsterer...\"\nmsgstr \"Mintea este dotată cu idei de un tapițar beat ...\"\n\n#. Key:\t5E441CF6434D7CA180853BBCBD6DFE44\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"Also, reading something represents such a nice way of killing time when I encounter a closed door!\"\nmsgstr \"De asemenea, a citi ceva reprezintă un mod atât de frumos de a ucide timpul când întâlnesc o ușă închisă!\"\n\n#. Key:\t6B46D1EC463D3B9A4BFBBDB7725C0C22\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"How about a deal? Open this door and I will give you another bottle from my collection of Potions of Worthiness.\"\nmsgstr \"Ce zici de o afacere? Deschide această ușă și îți voi oferi o altă sticlă din colecția mea de Poțiuni demne.\"\n\n#. Key:\t745CA5274A281AAA12CF798A53D54ACE\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_26.Children(3).Children.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_26.Children(3).Children.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"Ask about the book\"\nmsgstr \"Întreabă despre carte\"\n\n#. Key:\t84DCE2A448C57E7FAD93CB9029BBD605\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_26.Children(0).Children.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_26.Children(0).Children.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"Floating obelisk\"\nmsgstr \"Obeliscul plutitor\"\n\n#. Key:\t922B00804A843BD8EC9DB984D794F145\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"We met before, right? Of course we did.\"\nmsgstr \"Ne-am întâlnit înainte, nu? Desigur că am făcut-o.\"\n\n#. Key:\t9837238E42F28684DEBA2DAF9B332415\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"It might actually be total nonsense. That's what I am trying to find out at the moment, so I am reading it again and again and again...\"\nmsgstr \"Ar putea fi de fapt o prostie totală. Asta încerc să aflu în acest moment, așa că o citesc din nou și din nou și din nou ...\"\n\n#. Key:\t995EAB564791A7F8BF34D3A26026F383\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_26.Children(4).Children.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_26.Children(4).Children.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"Leave\"\nmsgstr \"Pleacă\"\n\n#. Key:\t9AD95267429D21EE59DC83937AD6811A\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"This is a Memory Crystal made by a really old looking man I've met long ago.\"\nmsgstr \"Acesta este un cristal de memorie realizat de un bărbat bătrân pe care l-am cunoscut cu mult timp în urmă.\"\n\n#. Key:\tA9DF44F54971A33775FF939FB292E26E\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"No man's knowledge here can go beyond my experience!\"\nmsgstr \"Nici o cunoaștere a omului nu poate trece dincolo de experiența mea!\"\n\n#. Key:\tAC59E35B420DF0F9B771B9938AC23891\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"I sure can! They used to invent cool stuff back in the days, before... you know, everyone's mind decided to go a bit insane.\"\nmsgstr \"Sunt sigur că pot! Au inventat lucruri frumoase în zilele trecute, înainte ... știți, mintea tuturor a decis să devină puțin nebună.\"\n\n#. Key:\tB1E177F0430A3887A76CFAA46CE650AD\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"I don’t know why we are here... maybe to enjoy ourselves?\"\nmsgstr \"Nu știu de ce suntem aici ... poate să ne bucurăm?\"\n\n#. Key:\tB5E57C3A4B0D51020B4F3C872164E8F2\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_26.Children(2).Children.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_26.Children(2).Children.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"Another door\"\nmsgstr \"O altă ușă\"\n\n#. Key:\tBA0C0F42482F357506A9C7ABADB6E49A\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_33.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_33.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"On the other hand, everyone is crazy these days... so we don't need doors anymore!\"\nmsgstr \"Pe de altă parte, toată lumea este nebună în aceste zile ... așa că nu mai avem nevoie de uși!\"\n\n#. Key:\tBAC86050470A5EC67C30349C6B13DFE0\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"To be perceived is to be!\"\nmsgstr \"A fi perceput înseamnă a fi!\"\n\n#. Key:\tBAD7934444B3EB256141BFB689BB83A0\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"I will let you know when I come up with something.\"\nmsgstr \"Te voi anunța când voi veni cu ceva.\"\n\n#. Key:\tBE5570C5477044DD0B1EEE928EAD8FA8\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_32.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_32.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"Nah. The world is full of crazy people. If I were sane, I would have liked to have as many closed doors as possible between me and those weirdos.\"\nmsgstr \"Nah. Lumea este plină de nebuni. Dacă aș fi sănătos, mi-ar fi plăcut să am cât mai multe uși închise între mine și acei ciudăți.\"\n\n#. Key:\tBE8120CC4E6A028BB45F10843F98135D\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"The door asks for a password that members use to enter the hideout... any idea what that could be?\"\nmsgstr \"Ușa cere o parolă pe care membrii o folosesc pentru a intra în ascunzătoare ... ai idee despre ce ar putea fi asta?\"\n\n#. Key:\tC7BE32BF43F7BA6D88A666956FAC35F3\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"I am here because I actually have to prove my worth again...\"\nmsgstr \"Sunt aici pentru că de fapt trebuie să îmi dovedesc din nou valoarea ...\"\n\n#. Key:\tC7ECC6D9457A4C49B39E98AEB14474E5\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_25.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_25.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"And I would actually feel much happier if I were on the other side of the door! You know,... I tried to ask it nicely to open and it just ignored me!\"\nmsgstr \"Și m-aș simți de fapt mult mai fericit dacă aș fi de cealaltă parte a ușii! Știi, ... Am încercat să-l rog frumos să se deschidă și pur și simplu m-a ignorat!\"\n\n#. Key:\tD2F4B8E44239904A7BD4DD90336C871A\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_45.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_45.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"What kind of book is that?\"\nmsgstr \"Ce fel de carte este asta?\"\n\n#. Key:\tED75E2104CCC3912A77DF18F7C916690\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"It was nice seeing you...\"\nmsgstr \"A fost frumos să te văd ...\"\n\n#. Key:\tF87975A94604B526DE1B638250BD85A9\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_27.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_27.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"The gate is open! Maybe this creature has a heart after all... and probably started feeling sorry for me as well.\"\nmsgstr \"Poarta este deschisă! Poate că această creatură are o inimă până la urmă ... și probabil a început să-i pară rău și pentru mine.\"\n\n#. Key:\tFE470DB5464E438A122FAFAF593AF92B\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"Let me see! Yes... Oh...\"\nmsgstr \"Stai să văd! Da ... Oh ...\"\n\n#. Key:\t066896454B62A9809060EBB3E0222D9A\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_SpeechSequence_1.SpeechSequence(3).SpeechSequence.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_SpeechSequence_1.SpeechSequence(3).SpeechSequence.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"Also, after skipping a couple of lectures, I got fired from university.\"\nmsgstr \"De asemenea, după ce am sărit câteva cursuri, am fost concediat de la universitate.\"\n\n#. Key:\t17D1F3394E12F6C85A11C2B3D3BD1ACE\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_SpeechSequence_1.SpeechSequence(0).SpeechSequence.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_SpeechSequence_1.SpeechSequence(0).SpeechSequence.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"I am a scientist! I managed to prove it! I discovered this when I was conducting my research on gnome behavior...\"\nmsgstr \"Eu sunt un om de stiinta! Am reușit să-l dovedesc! Am descoperit acest lucru când am condus cercetările mele despre comportamentul piticilor ...\"\n\n#. Key:\t17D8D3C2484BA654BEAE8CACA3AD7501\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"Help me out with the door for the last time, and I will give you my last potion!\"\nmsgstr \"Ajută-mă cu ușa pentru ultima oară și îți voi da ultima poțiune!\"\n\n#. Key:\t22439DB6407947A700A6E9AFB4D29261\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"Hello again! You remember me, right? I'm the gnome who was crazy before it was cool!\"\nmsgstr \"Buna din nou! Îți aduci aminte de mine, nu? Sunt piticul care a fost nebun înainte de a fi mișto!\"\n\n#. Key:\t2546F34E402CB4B25911238CC1E7A70F\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_29.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_29.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"Be as you with to seem.\\r\\n... or was it seem as you wish to be?\"\nmsgstr \"Fii ca tine să pari.\\r\\n... sau o fost așa cum dorești să fii?\"\n\n#. Key:\t2A78FDD9465789DC4FF5EB970C63F618\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"That is amazing! Thank you, my globular friend! Take these coins, I am sure you will enjoy spending them on... on whatever Balls like you like to spend.\"\nmsgstr \"Asta este incredibil! Mulțumesc, prietenul meu globular! Ia aceste monede, sunt sigur că îți va plăcea să le cheltuiești pe ... pe orice Mingi ca tine le place să cheltuiască.\"\n\n#. Key:\t2EB726F641E4EF882228F6B49DA2B313\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_26.Children(1).Children.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_26.Children(1).Children.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"Password\"\nmsgstr \"Parolă\"\n\n#. Key:\t339840D54BD71CF86F9DE4A801B1414F\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"I sure can! They used to invent cool stuff back in the days, before... you know, everyone's mind decided to go a bit insane.\"\nmsgstr \"Sunt sigur că pot! Au inventat lucruri frumoase în zilele trecute, înainte ... ști, mintea tuturor a decis să meargă puțin nebun.\"\n\n#. Key:\t3E639AB84A0D241D73AB8A991A483090\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_26.Children(4).Children.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_26.Children(4).Children.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"Leave\"\nmsgstr \"Ieși\"\n\n#. Key:\t464D32224CC04AD1F97602803245A37C\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"Take this! You deserve it...\"\nmsgstr \"Ia asta! O meriți...\"\n\n#. Key:\t4BB0354D4398A4115F3A78B8EFCC7D16\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_27.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_27.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"I can't believe my eyes! It is open!\"\nmsgstr \"Nu-mi vine să cred ochii! Este deschis!\"\n\n#. Key:\t6488288A45256CE464004F9BFF776850\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_24.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_24.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"It's your lucky day! Take this... it's my last bottle, but I guess your needs are greater than mine!\"\nmsgstr \"Este ziua ta norocoasă! Ia asta ... este ultima mea sticlă, dar cred că nevoile tale sunt mai mari decât ale mele!\"\n\n#. Key:\t696219734B2E6966C53BE8B43A0C2212\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"The unexamined life is not worth living!\"\nmsgstr \"Viața neexaminată nu merită traită!\"\n\n#. Key:\t6FD516D14E42F5EC1D05CEA0F476BDEC\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"If you manage to find a strangely unique device in the hideout, I would be more than happy to buy that from you...\"\nmsgstr \"Dacă reușești să găsești un dispozitiv ciudat unic în ascunzătoare, aș fi mai mult decât fericit să cumpăr asta de la tine ...\"\n\n#. Key:\t75BBEA604E9A3BAEF7599AA937E1AB2A\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"And you have the habit of needing my potions..\"\nmsgstr \"Și ai obiceiul să ai nevoie de poțiunile mele ..\"\n\n#. Key:\t7978DCFE4044A6A3EC9F6BA54BAAD8BF\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"Yes, I am pretty sure this week is \\\"The only true wisdom is in knowing you know everything.\\\".\"\nmsgstr \"Da, sunt destul de sigur că săptămâna aceasta este „Singura înțelepciune adevărată este să știi că știi totul”.\"\n\n#. Key:\t88881A3742ABFEAB95CA938C1AA81B60\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_25.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_25.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"I guess we are in the same boat - well, more or less... figuratively speaking, of course, because I can't really stand boats!\"\nmsgstr \"Bănuiesc ca suntem in aceeași barca - bine, mai mult sau mai puțin ... la figurat vorbind, desigur, pentru ca nu prea pot suporta bărcile!\"\n\n#. Key:\t8A80B7554F39A818E4E66294BAFC9A76\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_26.Children(0).Children.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_26.Children(0).Children.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"Secret Science Society\"\nmsgstr \"Societatea de Științe Secrete\"\n\n#. Key:\t91E6FD4A44AB2E17C88767B0F17D6D1E\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_30.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_30.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"Why do you think that you're crazy?\"\nmsgstr \"De ce crezi că ești nebun?\"\n\n#. Key:\t98E36F354D811F5DE5F98A942250997E\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"It is always wrong to believe everything!\"\nmsgstr \"Este întotdeauna greșit să crezi totul!\"\n\n#. Key:\t9B6EADBA4946B100D566988907A9675D\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"Any luck with the password for the Secret Science Society door?\"\nmsgstr \"Ai vreun noroc cu parola pentru ușa Societății de Știință Secrete?\"\n\n#. Key:\tA0F52B7148A942673A3489857B8C6EA9\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_26.Children(2).Children.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_26.Children(2).Children.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"Give Weird Device\"\nmsgstr \"Dă Dispozitiv Ciudat\"\n\n#. Key:\tABE60F4D4709CCE1AF2A5197C03C8193\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"See you later...\"\nmsgstr \"Ne vedem mai târziu...\"\n\n#. Key:\tB07C5C9A48839C3E81F6FA8B7550BBA4\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"I also have the bad habit of being obstructed by closed doors!\"\nmsgstr \"Am și prostul obicei de a fi obstrucționat de ușile închise!\"\n\n#. Key:\tB7C7314840274942F6D606B35398F039\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"The door asks for a password that members need to provide in order to enter the hideout... any idea what that could be?\"\nmsgstr \"Ușa cere o parolă pe care membrii trebuie să o furnizeze pentru a intra în ascunzătoare ... ai idee despre ce ar putea fi asta?\"\n\n#. Key:\tBB1AEBA44695D09192D7CA98AF9166B0\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_SpeechSequence_1.SpeechSequence(2).SpeechSequence.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_SpeechSequence_1.SpeechSequence(2).SpeechSequence.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"No wonder everyone started to consider me an idiot.\"\nmsgstr \"Nu este de mirare că toată lumea a început să mă considere un idiot.\"\n\n#. Key:\tC0B9CA5E4273E95306AD0C824ADFD84B\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_SpeechSequence_1.SpeechSequence(1).SpeechSequence.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_SpeechSequence_1.SpeechSequence(1).SpeechSequence.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"Long story short, I used to do all these crazy things, like talking about the weather or taking naps in the afternoon. At first, they seemed okay to me but in reality what I was doing was totally ridiculous!\"\nmsgstr \"Să scurtez o poveste, obișnuiam să fac toate aceste lucruri nebunești, cum ar fi să vorbesc despre vreme sau să dorm după-amiaza. La început, mi s-au părut în regulă, dar în realitate ceea ce făceam era total ridicol!\"\n\n#. Key:\tC4193800427609972A2DECAB99D8CE6C\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"Hmm... One of the creaks was a bit odd. I think the door will open soon!\"\nmsgstr \"Hmm ... Una dintre creste a fost un pic ciudată. Cred că ușa se va deschide în curând!\"\n\n#. Key:\tD1254F624213EAE67D6DD780182AA2DA\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"It was nice seeing you!\"\nmsgstr \"A fost frumos să te văd!\"\n\n#. Key:\tD19327714CD0B2833BC7EBBD1E89CC83\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_26.Children(3).Children.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_26.Children(3).Children.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"You Crazy?\"\nmsgstr \"Ești nebun?\"\n\n#. Key:\tE5C93E794F71C393568D0B855117C738\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"I found the secret hideout of the Secret Science Society. Do you know anything about them?\"\nmsgstr \"Am găsit ascunderea secretă a Societății de Științe Secrete. Ști ceva despre ei?\"\n\n#. Key:\tEF216A2549E20C15A2C28184B62D45E6\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_36.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_36.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"Turns out that you cannot skip lectures if you're the teacher.\"\nmsgstr \"Se dovedește că nu poți sări cursurile dacă ești profesorul.\"\n\n#. Key:\tEF650E874498865FA9FE6F9B9C37AB71\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"Here is the Weird Device I found in the hideout of the Secret Science Society.\"\nmsgstr \"Iată dispozitivul ciudat pe care l-am găsit în ascunderea Societății de Științe Secrete.\"\n\n#. Key:\t17A0CE394E01E1FFB31AA9A485E033AC\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_2.Children(4).Children.Text\n#: /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_2.Children(4).Children.Text\nmsgctxt \"Dialogue_TLSecretSocietyGate\"\nmsgid \"Mellon\"\nmsgstr \"Pepene\"\n\n#. Key:\t3293778C41F588EAC2DECDA76DA86A8E\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_2.Children(0).Children.Text\n#: /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_2.Children(0).Children.Text\nmsgctxt \"Dialogue_TLSecretSocietyGate\"\nmsgid \"The only...\"\nmsgstr \"Singurul...\"\n\n#. Key:\t359996CC441CAB0497303A9C666F0CCD\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_TLSecretSocietyGate\"\nmsgid \"*******? No, that is not correct.\"\nmsgstr \"*******? Nu, nu este corect.\"\n\n#. Key:\t3C864B7F434DA42CAB07BCA70FB2E6A6\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_1.Children(0).Children.Text\n#: /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_1.Children(0).Children.Text\nmsgctxt \"Dialogue_TLSecretSocietyGate\"\nmsgid \"Okay, whatever\"\nmsgstr \"Bine, indiferent de\"\n\n#. Key:\t40C27B354470AB53239424BCC2B8D259\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_TLSecretSocietyGate\"\nmsgid \"Do you really think secret scientists would use an elven word as a password? I don't even know what that means.\"\nmsgstr \"Chiar crezi că oamenii de știință secretoși ar folosi un cuvânt al elfilor ca parolă? Nici nu știu ce înseamnă asta.\"\n\n#. Key:\t4E89070F413EF5CD964EEF90234BEBC5\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_TLSecretSocietyGate\"\nmsgid \"I am pretty sure that it is better to avoid the Secret Science Society anyways...\"\nmsgstr \"Sunt destul de sigur că este mai bine să eviți societatea secretă a științei ...\"\n\n#. Key:\t515B5424465F983D14F3E09B7686899D\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_TLSecretSocietyGate\"\nmsgid \"STOP! Do not move! This gate is only for the members of the Secret Science Society!\"\nmsgstr \"STOP! Nu mișca! Această poartă este destinată doar membrilor Societății de Științe Secrete!\"\n\n#. Key:\t51706AD44D697A14E6392B97A9E30AFC\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_TLSecretSocietyGate\"\nmsgid \"That is the silliest combination I have ever heard about in my whole life! That's the kind of thing an idiot would carry in his luggage!\"\nmsgstr \"Aceasta este cea mai neplăcută combinație despre care am auzit vreodată în toată viața mea! Acesta este genul de lucruri pe care le va purta un idiot în bagaje!\"\n\n#. Key:\t60B0B4E04E74C474AC2F4F8422DCE753\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_3.Children(0).Children.Text\n#: /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_3.Children(0).Children.Text\nmsgctxt \"Dialogue_TLSecretSocietyGate\"\nmsgid \"Leave the gate\"\nmsgstr \"Ieși prin poartă\"\n\n#. Key:\t6EB7FD9546B2B89557D9708942CE54BD\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_2.Children(2).Children.Text\n#: /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_2.Children(2).Children.Text\nmsgctxt \"Dialogue_TLSecretSocietyGate\"\nmsgid \"12345\"\nmsgstr \"12345\"\n\n#. Key:\t749AB9CD48924031317291A953254917\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_TLSecretSocietyGate\"\nmsgid \"That password is for witch and wizard kids, not for old, wise, world renowned secret scientists!\"\nmsgstr \"Acea parolă este destinată copiilor vrăjitori și vrăjitoare, nu pentru secrete vechi, și oameni de știință înțelepți de renume mondial!\"\n\n#. Key:\t7BB8FA8B4D051983390D3D8D4287DFEC\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_2.Children(1).Children.Text\n#: /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_2.Children(1).Children.Text\nmsgctxt \"Dialogue_TLSecretSocietyGate\"\nmsgid \"hunter2\"\nmsgstr \"hunter2\"\n\n#. Key:\t8CD051C44D9FBBD6D60694AFD2156D24\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_2.Children(5).Children.Text\n#: /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_2.Children(5).Children.Text\nmsgctxt \"Dialogue_TLSecretSocietyGate\"\nmsgid \"Try to gain some time\"\nmsgstr \"Încercă să câștigi ceva timp\"\n\n#. Key:\t8F2244144056B8C389345F87D8C8B171\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_TLSecretSocietyGate\"\nmsgid \"I... I think I forgot... I have to remember it. I'll be back...\"\nmsgstr \"Eu ... cred că am uitat ... trebuie să-mi amintesc. Mă voi întoarce...\"\n\n#. Key:\t8FC96FE94C115E3EDB214CAA3B380072\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_TLSecretSocietyGate\"\nmsgid \"Let us go on with the standard protocol then. Tell me the password of the week.\"\nmsgstr \"Să continuăm cu protocolul standard atunci. Spune-mi parola săptămânii.\"\n\n#. Key:\tAA10FF02426D2C5DB9F7CF90596631C4\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_1.Children(1).Children.Text\n#: /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_1.Children(1).Children.Text\nmsgctxt \"Dialogue_TLSecretSocietyGate\"\nmsgid \"I am a member\"\nmsgstr \"Sunt membru\"\n\n#. Key:\tB5237D1B4EFB02B1ED5017B68EC5A7EC\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_TLSecretSocietyGate\"\nmsgid \"Are you a member? Prove it! What is the password of the week?\"\nmsgstr \"Ești membru? Dovedește-o! Care este parola săptămânii?\"\n\n#. Key:\tC8A1985C416AEA563142D7BF3B6DD77D\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_2.Children(3).Children.Text\n#: /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_2.Children(3).Children.Text\nmsgctxt \"Dialogue_TLSecretSocietyGate\"\nmsgid \"Caput Draconis\"\nmsgstr \"Caput Draconis\"\n\n#. Key:\tDC8F07EA44A20BEF70DFCDA4A62A421E\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_TLSecretSocietyGate\"\nmsgid \"Correct. Welcome to the secret hideout 12345, scientist!\"\nmsgstr \"Corect. Bine ai venit la asunzătoarea secretă 12345, om de știință!\"\n\n#. Key:\tE0C10509474191587635B48ED0AA6913\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_TLSecretSocietyGate\"\nmsgid \"The only true wisdom is in knowing you know everything!\"\nmsgstr \"Singura înțelepciune adevărată este să știi că știi totul!\"\n\n#. Key:\t0707F21D4313073F47F3C69B64D61DB7\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_TombOfTabby\"\nmsgid \"Take this. It's all I can give now.\"\nmsgstr \"Ia asta. Este tot ce pot oferi acum.\"\n\n#. Key:\t0918993B4F680528806DE680B471F795\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_TombOfTabby\"\nmsgid \"It was too much. I couldn’t keep on. I failed.\"\nmsgstr \"Era prea mult. Nu am putut continua. Am eșuat.\"\n\n#. Key:\t1598C2DE44A0BF92DC0E53BFAC47DEF5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_3.Children(3).Children.Text\n#: /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_3.Children(3).Children.Text\nmsgctxt \"Dialogue_TombOfTabby\"\nmsgid \"Leave\"\nmsgstr \"Pleacă\"\n\n#. Key:\t1EF84FFD484E968FBDFE1386018485DB\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_3.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_3.Children(1).Children.Text\nmsgctxt \"Dialogue_TombOfTabby\"\nmsgid \"Raven\"\nmsgstr \"Corb\"\n\n#. Key:\t3343471F42742EEE0678D49E466448F1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_TombOfTabby\"\nmsgid \"Tell me the name!\"\nmsgstr \"Spune-mi numele!\"\n\n#. Key:\t3DC816F147ACB79D6339D5AD31E0C5A5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_TombOfTabby\"\nmsgid \"Lillian!\"\nmsgstr \"Lillian!\"\n\n#. Key:\t3DE5FFEB4A5BEC150306999FDEF058BC\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_TombOfTabby\"\nmsgid \"Here lies Tabby, wanderer of the Ruined Realm. We will never forget what you did for us. May your spirit find peace in the afterlife.\"\nmsgstr \"Aici se află Tabby, rătăcitor al Tărâmului Ruinat. Nu vom uita niciodată ce ai făcut pentru noi. Fie ca spiritul tău să găsească pace în viața de apoi.\"\n\n#. Key:\t43F7C0AE4CB91D3957AB4CA54C1D4426\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_TombOfTabby\"\nmsgid \"He took the artefacts. His master never knew it.\"\nmsgstr \"El a luat artefactele. Stăpânul său nu a știut-o niciodată.\"\n\n#. Key:\t57A0634946BB9FD9603572ABD9368E52\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_3.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_3.Children(0).Children.Text\nmsgctxt \"Dialogue_TombOfTabby\"\nmsgid \"Wizard\"\nmsgstr \"Vrăjitor\"\n\n#. Key:\t5A6E99154FB027A82922FA91A9448E14\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_TombOfTabby\"\nmsgid \"I’m leaving... I didn’t want to bother you. May you find peace at last.\"\nmsgstr \"Plec ... nu voiam să te deranjez. Îți doresc să găsești în sfârșit pacea.\"\n\n#. Key:\t6A716E164BAACFAFB2EBDBBA8C04438F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_TombOfTabby\"\nmsgid \"He liked Lillian. He finished what I started.\"\nmsgstr \"Îi plăcea de Lillian. A terminat ce am început.\"\n\n#. Key:\t7CDFB36B41931AADE01C10A465D09EAF\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_TombOfTabby\"\nmsgid \"Rest in peace!\"\nmsgstr \"Odihnească-se în pace!\"\n\n#. Key:\t831693034CD9AC88A07F1297BBB10056\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_TombOfTabby\"\nmsgid \"I will be there on her side again when the time comes.\"\nmsgstr \"Voi fi acolo din nou, când va veni vremea.\"\n\n#. Key:\tA78C16A943587C5EC876BFB0AA319421\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_TombOfTabby\"\nmsgid \"She is my only true master. I can’t leave her. Not yet.\"\nmsgstr \"Ea este singurul meu stăpân adevărat. Nu o pot părăsi. Nu inca.\"\n\n#. Key:\tC86836A149E8580E4608259C8482314F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_TombOfTabby\"\nmsgid \"Raven!\"\nmsgstr \"Corb!\"\n\n#. Key:\tD05E5AEF498C383F88D1AFBBDF371CDA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_TombOfTabby\"\nmsgid \"He forced me. Though I understood. I wanted the same.\"\nmsgstr \"El m-a forțat. Deși am înțeles. Voiam la fel.\"\n\n#. Key:\tE41ADE774AF3AF3FE637CE81531F3D29\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_3.Children(2).Children.Text\n#: /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_3.Children(2).Children.Text\nmsgctxt \"Dialogue_TombOfTabby\"\nmsgid \"Lillian\"\nmsgstr \"Lillian\"\n\n#. Key:\tED18C66D47BF594818C5DA8100AC2A36\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_TombOfTabby\"\nmsgid \"You are familiar... I almost remember...\"\nmsgstr \"Ești familiar ... aproape îmi amintesc ...\"\n\n#. Key:\tF6D8BC4F489D87A90E852CA3F97B479F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_TombOfTabby\"\nmsgid \"Wizard!\"\nmsgstr \"Vrăjitor!\"\n\n#. Key:\t2A0E02C94A04642C5096038C615E0D5B\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/tut2.tut2:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/tut2.tut2:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_tut2\"\nmsgid \"I see you managed to shape that ball body of yours… that’s interesting.\"\nmsgstr \"Văd că ai reușit să modelezi corpul tău de bilă ... este interesant.\"\n\n#. Key:\t4D59C307403F27C91A9168AB58CDB1B3\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/tut2.tut2:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/tut2.tut2:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_tut2\"\nmsgid \"I didn’t want to summon you. I wanted to get my daughter back.\"\nmsgstr \"Nu am vrut să te chem. Am vrut să-mi iau fiica înapoi.\"\n\n#. Key:\t8336FD024F34227E1AB7B1BFCCF7FFBF\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/tut2.tut2:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/tut2.tut2:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_tut2\"\nmsgid \"Your presence is not welcome here, demon!\"\nmsgstr \"Prezența ta nu este binevenită aici, demon!\"\n\n#. Key:\t16A6E7D24DFE49D6844E92B8E476BA66\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/tut5.tut5:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/tut5.tut5:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_tut5\"\nmsgid \"Once you are done I will set you free.\"\nmsgstr \"După ce ai terminat, te voi elibera.\"\n\n#. Key:\t48FA56EF4293C577CB1977BE694034CC\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/tut5.tut5:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/tut5.tut5:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_tut5\"\nmsgid \"This is the deal demon...\"\nmsgstr \"Acesta este înțelegerea demone...\"\n\n#. Key:\tA27765824FDD88A579AB6180DDEA06B1\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/tut5.tut5:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/tut5.tut5:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_tut5\"\nmsgid \"Get into the Heart of the Realm and find the three Artefacts! I need those to correct the summoning.\"\nmsgstr \"Intră în Inima Tărâmului și găsește cele trei Artefacte! Am nevoie de ele să corecteze convocarea.\"\n\n#. Key:\t5E1F54384BC258A91FF1DD9ECBC0DF39\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/tut8.tut8:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/tut8.tut8:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_tut8\"\nmsgid \"A cat that used to help my daughter to explore these realms.\"\nmsgstr \"O pisică a ajutat-o pe fiica mea să exploreze aceste tărâmuri.\"\n\n#. Key:\t859621E24125177084F4EAA39CF77902\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/tut8.tut8:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/tut8.tut8:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_tut8\"\nmsgid \"Who is Tabby?\"\nmsgstr \"Cine este Tabby?\"\n\n#. Key:\tD0BFF857414714D7C5FCB9B526539215\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/tut8.tut8:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/tut8.tut8:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_tut8\"\nmsgid \"Tabby was formidable with her claws, but you will need that sword.\"\nmsgstr \"Tabby era formidabilă cu ghearele ei, dar vei avea nevoie de sabie.\"\n\n#. Key:\tDFCB1A1E48763642E71FD7A040F72F1B\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/tut8.tut8:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/tut8.tut8:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_tut8\"\nmsgid \"So he did the hard job before me...\"\nmsgstr \"Așa că a făcut treaba grea înaintea mea ...\"\n\n#. Key:\t2DD05A7E485B5C23DA0DCD84400D3F23\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/tut9.tut9:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/tut9.tut9:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_tut9\"\nmsgid \"What could be possibly weird for a walking ball?\"\nmsgstr \"Ce ar putea fi ciudat pentru o minge care merge?\"\n\n#. Key:\t62A1ECFC47B762221EA0B1B5B0E0BEF6\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/tut9.tut9:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/tut9.tut9:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_tut9\"\nmsgid \"This place is in a better shape...\"\nmsgstr \"Acest loc este într-o stare mai bună ...\"\n\n#. Key:\tA9BCFBB541A9A2CEA8FB90884B8557C5\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/tut9.tut9:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/tut9.tut9:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_tut9\"\nmsgid \"The Ancient Magic is still strong within these walls. It keeps the Ruin at bay.\"\nmsgstr \"Magia Antică este încă puternică în acești ziduri. Ține ruina departe.\"\n\n#. Key:\tF9551D7849226F88A4FD15AAFB4789E6\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/tut9.tut9:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/tut9.tut9:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_tut9\"\nmsgid \"Be careful though... it can have the weirdest side effects.\"\nmsgstr \"Fii atent totuși ... poate avea cele mai ciudate reacții adverse.\"\n\n#. Key:\t302976FD411E850B3CD7CEA7E0BF6924\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Wizard.Wizard:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/Ending/E1/Wizard.Wizard:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_Wizard\"\nmsgid \"Please wait outside until I repeat the spell. Once Lillian is back, I’ll take you home.\"\nmsgstr \"Te rog să așteptați afară până repet repetarea vrăji. După ce Lillian se va întoarce, te voi duce acasă.\"\n\n#. Key:\t3851C21F419E9F1D29A06DA3B2A0F553\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Wizard.Wizard:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Ending/E1/Wizard.Wizard:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_Wizard\"\nmsgid \"Er... your room is still as untidy as last time, but no problem.\"\nmsgstr \"E ... camera ta este încă la fel de neplăcută ca data trecută, dar nici o problemă.\"\n\n#. Key:\t6CCE5BBC4135176C1FBD8E866FD4B098\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Wizard.Wizard:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Ending/E1/Wizard.Wizard:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_Wizard\"\nmsgid \"I’m sorry we met like this.\"\nmsgstr \"Îmi pare rău că ne-am întâlnit așa.\"\n\n#. Key:\t7511912D4F72D1D45CFFB9AA9815CCB2\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Wizard.Wizard:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E1/Wizard.Wizard:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_Wizard\"\nmsgid \"Yes... and thank you!\"\nmsgstr \"Da ... și mulțumesc!\"\n\n#. Key:\tAC1641244DF694B660EAFDA1FC4A177B\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Wizard.Wizard:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E1/Wizard.Wizard:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_Wizard\"\nmsgid \"Here are your artefacts! I made my part of the deal.\"\nmsgstr \"Iată artefactele tale! Mi-am făcut partea din afacere.\"\n\n#. Key:\tB567059148744E3F7A4D3B929F26CBB6\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Wizard.Wizard:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Ending/E1/Wizard.Wizard:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_Wizard\"\nmsgid \"Yes, we made a deal!\"\nmsgstr \"Da, am făcut o afacere!\"\n\n#. Key:\tC2ED3A564A55A644D33F9E9E38D1676A\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Wizard.Wizard:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Ending/E1/Wizard.Wizard:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_Wizard\"\nmsgid \"Give me a few more minutes to finish what we started!\"\nmsgstr \"Mai dă-mi câteva minute pentru a termina ceea ce am început!\"\n\n#. Key:\tE1521B0B46F26BFA464C6C81EC2D4900\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Wizard.Wizard:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Ending/E1/Wizard.Wizard:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_Wizard\"\nmsgid \"Will you release me?\"\nmsgstr \"Mă vei elibera?\"\n\n#. Key:\tFE3EE6014784FCE7EB8001BC1E77D833\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Wizard.Wizard:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Ending/E1/Wizard.Wizard:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_Wizard\"\nmsgid \"Er... excuse me for being rude with you. I might have misjudged you. And, anyway...\"\nmsgstr \"Scuză-mă că sunt nepoliticos cu tine. Poate te-am judecat greșit. Și oricum...\"\n\n#. Key:\t0D3B0F654B4B3FC1AE9B46809DA7FD74\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter2/Wizard_AfterMonk.Wizard_AfterMonk:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Wizard/Chapter2/Wizard_AfterMonk.Wizard_AfterMonk:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_Wizard_AfterMonk\"\nmsgid \"What did he say?\"\nmsgstr \"Ce a spus el?\"\n\n#. Key:\tDE149D01484DA8CD03D1C0848D01BEA6\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter2/Wizard_AfterMonk.Wizard_AfterMonk:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Wizard/Chapter2/Wizard_AfterMonk.Wizard_AfterMonk:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_Wizard_AfterMonk\"\nmsgid \"Nothing...\"\nmsgstr \"Nimic...\"\n\n#. Key:\t1E43B5674AB45A7BDBEED1BE2AE25FE8\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter2/Wizard_Artefact1.Wizard_Artefact1:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Wizard/Chapter2/Wizard_Artefact1.Wizard_Artefact1:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_Wizard_Artefact1\"\nmsgid \"Well done. Now we have the first artefact. There are only two left...\"\nmsgstr \"Foarte bine. Acum avem primul artefact. Au mai rămas doar două ...\"\n\n#. Key:\t45AB81D94B2C6C9B13A49C944AD80389\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter2/Wizard_Artefact1.Wizard_Artefact1:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Wizard/Chapter2/Wizard_Artefact1.Wizard_Artefact1:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_Wizard_Artefact1\"\nmsgid \"Don’t tell me I will need to kill another two of these!\"\nmsgstr \"Nu-mi spune că va trebui să ucid alte două dintre acestea!\"\n\n#. Key:\t3CBF720A438F217805FD5F85990FF515\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter2/Wizard_Artefact2.Wizard_Artefact2:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Wizard/Chapter2/Wizard_Artefact2.Wizard_Artefact2:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_Wizard_Artefact2\"\nmsgid \"We are close! Only one artefact is missing.\"\nmsgstr \"Suntem aproape! Doar un singur artefact lipsește.\"\n\n#. Key:\tFD6163CC43BF00E4DB95CBB11CA7D389\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter2/Wizard_Artefact2.Wizard_Artefact2:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Wizard/Chapter2/Wizard_Artefact2.Wizard_Artefact2:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_Wizard_Artefact2\"\nmsgid \"What I miss is a comfortable apartment somewhere safe...\"\nmsgstr \"Ceea ce îmi lipsește este un apartament confortabil undeva în siguranță ...\"\n\n#. Key:\t0D37E1DE44FDF7C5BF8DD28C038FA49D\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter2/Wizard_Artefact3.Wizard_Artefact3:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Wizard/Chapter2/Wizard_Artefact3.Wizard_Artefact3:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_Wizard_Artefact3\"\nmsgid \"What? Can’t you just... oh, forget it!\"\nmsgstr \"Ce? Nu poți doar ... oh, uită!\"\n\n#. Key:\t2BDFD83247C8B644DED9CAA6486A064F\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter2/Wizard_Artefact3.Wizard_Artefact3:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Wizard/Chapter2/Wizard_Artefact3.Wizard_Artefact3:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_Wizard_Artefact3\"\nmsgid \"Yes, I’ve done what you asked. Now it’s your turn. Set me free!\"\nmsgstr \"Da, am făcut ceea ce ai cerut. Acum e rândul tău. Eliberează-mă!\"\n\n#. Key:\t8CCAFBA148F1834EABE12CAC93669A79\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter2/Wizard_Artefact3.Wizard_Artefact3:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Wizard/Chapter2/Wizard_Artefact3.Wizard_Artefact3:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_Wizard_Artefact3\"\nmsgid \"I have to admit I’m impressed. You found all the three artefacts.\"\nmsgstr \"Trebuie să recunosc că sunt impresionat. Ai găsit toate cele trei artefacte.\"\n\n#. Key:\tA54C612946D6A5EB76D38B8622F4F76C\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter2/Wizard_Artefact3.Wizard_Artefact3:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Wizard/Chapter2/Wizard_Artefact3.Wizard_Artefact3:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_Wizard_Artefact3\"\nmsgid \"All right demon. Use the railways to travel to World’s End. That’s where I can bring you back.\"\nmsgstr \"Bine demon. Folosește căile ferate pentru a călători la Sfârșitul Lumii. Acolo te pot aduce înapoi.\"\n\n#. Key:\t05FE50EE4B18F4FE9C1559979669E616\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"Still nothing, but nobody said anything about any visible change at this point, right?\"\nmsgstr \"Încă nimic, dar nimeni nu a spus nimic despre vreo schimbare vizibilă în acest moment, nu?\"\n\n#. Key:\t0DDE5A0E47BADFCA9E6E98A10F0AF114\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_1.Children(0).Children.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_1.Children(0).Children.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"Craft Ghost Abacus\"\nmsgstr \"Creează Abacul Fantomă\"\n\n#. Key:\t0F4008294D6FA43C3D9C17BA600FB024\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"You have a glowing hammer. What's next?\"\nmsgstr \"Ai un ciocan strălucitor. Ce urmează?\"\n\n#. Key:\t26089F6044B0FD1134C9C99AF17E9E0C\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_7.Children(4).Children.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_7.Children(4).Children.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"Say a different color\"\nmsgstr \"Spune o altă culoare\"\n\n#. Key:\t29FFB2FF49C6C231583FF1B549DA218C\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"Gnome magic at its best. Did you do everything the way it was supposed to be done? You should find out soon... maybe.\"\nmsgstr \"Magia piticilor în acțiune. Ai făcut totul așa cum trebuia făcut? Ar trebui să afli în curând ... poate.\"\n\n#. Key:\t2BF7D8D726080F0A003A0229BE7871C7\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"With the proper instructions and materials you could definitely create something valuable here.\"\nmsgstr \"Cu instrucțiunile și materialele adecvate, poți crea cu siguranță ceva valoros aici.\"\n\n#. Key:\t3231FF0D4A2BBEE3E3AD7598E5105E0E\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"The object is coagulated into a single Surrected object!\"\nmsgstr \"Obiectul este coagulat într-un singur obiect resuscitat!\"\n\n#. Key:\t41335322411CF278B19849AC696E6F93\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_2.Children(4).Children.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_2.Children(4).Children.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"Break the abacus into pieces\"\nmsgstr \"Rupe abacul în bucăți\"\n\n#. Key:\t4C74F3C342690A8246916B85FF4685C9\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"The abacus does not show any emotion.\"\nmsgstr \"Abacul nu arată nicio emoție.\"\n\n#. Key:\t4F8E51DA4C0B33020E34AF9AB47BCCD5\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_7.Children(0).Children.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_7.Children(0).Children.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"Croon \\\"La La LaLaLa LaLaLa\\\"\"\nmsgstr \"Fredonează \\\"La LaLa LaLaLa LaLaLa\\\"\"\n\n#. Key:\t5404D10943BB5F53229FDC845E60B000\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_7.Children(5).Children.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_7.Children(5).Children.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"Give up for now\"\nmsgstr \"Renunță deocamdată\"\n\n#. Key:\t5548D94E415483F129CCA7A3102B9DB3\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"Poor Abacus. It is broken into pieces now.\"\nmsgstr \"Săracul Abacus. Acum este rupt în bucăți.\"\n\n#. Key:\t6F3DE41D43326079A2BD72A29059FBA9\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"You have the Abacus and the Ghost Flower Petals in front of you. The workshop has all the tools you need. How do you proceed?\"\nmsgstr \"Ai în față abacul și petalele de flori fantome. Atelierul are toate instrumentele de care ai nevoie. Cum procedezi?\"\n\n#. Key:\t7EE3EE474090DCA65BB3199E69E83B43\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_1.Children(1).Children.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_1.Children(1).Children.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"Leave\"\nmsgstr \"Pleacă\"\n\n#. Key:\t87B760894A587B34EB825487D907D2E4\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_7.Children(1).Children.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_7.Children(1).Children.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"Croon \\\"La LaLa LaLaLa LaLaLa\\\"\"\nmsgstr \"Fredonează \\\"La LaLa LaLaLa LaLaLa\\\"\"\n\n#. Key:\t947E69AA4EEE6DB329FAD48214D4C416\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_2.Children(0).Children.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_2.Children(0).Children.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"Say \\\"Sorry my <object name>!\\\"\"\nmsgstr \"Spune „Îmi pare rău <nume obiect>!\\\"\"\n\n#. Key:\t95D5418F4145388680D7C99F720CE191\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_7.Children(3).Children.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_7.Children(3).Children.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"Say \\\"Brown\\\"\"\nmsgstr \"Spune „Maro”\"\n\n#. Key:\tC184ED314482D706C3426CB5034C3AFD\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_7.Children(2).Children.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_7.Children(2).Children.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"Say \\\"Blue\\\"\"\nmsgstr \"Spune „Albastru”\"\n\n#. Key:\tC7EB7FC648E0005DC35550A3D71DF221\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_2.Children(3).Children.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_2.Children(3).Children.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"Cover the Abacus with Petals\"\nmsgstr \"Acoperă Abacusul cu petale\"\n\n#. Key:\tCA7A7E0A4F16FBE20EE16395D6565D7E\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"Maybe the abacus is a bit more ghosty now... or is it just you getting tired of trying?\"\nmsgstr \"Poate că abacul este ceva mai fantomatic acum ... sau doar te-ai săturat să încerci?\"\n\n#. Key:\tE0507C5E44553E824F998D8D4CB044A4\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"Your last action did not lead to any visible change. What is your next move?\"\nmsgstr \"Ultima ta acțiune nu a dus la nicio schimbare vizibilă. Care este următoarea mișcare?\"\n\n#. Key:\tE8550D874C73F12B76345D9AAB2FEB80\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_2.Children(2).Children.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_2.Children(2).Children.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"Heat a hammer\"\nmsgstr \"Încălzește un ciocan\"\n\n#. Key:\tE894C6624CC7A0F92CECBBB364C77CD1\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_2.Children(1).Children.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_2.Children(1).Children.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"Say \\\"Sorry my Abacus!\\\"\"\nmsgstr \"Spune „Îmi pare rău Abacusul meu!”\"\n\n#. Key:\tEFC4E9AB4A1B8DF491B4FBABBC7FA560\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"The Abacus is covered with the Petals of the Ghost Flower.\"\nmsgstr \"Abacul este acoperit cu petalele florii fantome.\"\n\n#. Key:\t100A735A460E0DE2B0D130B802762D8B\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter2/WW_Scroll_Inspect.WW_Scroll_Inspect:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Wizard/Chapter2/WW_Scroll_Inspect.WW_Scroll_Inspect:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_WW_Scroll_Inspect\"\nmsgid \"It says: \\\"Be careful: I think there are Fishies in the water!\\\"\"\nmsgstr \"Spune: „Fii atent: cred că există pești în apă!”\"\n\n#. Key:\t1D280F60496F7EF5DBDADB90674E8225\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter2/WW_Scroll_Inspect.WW_Scroll_Inspect:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Wizard/Chapter2/WW_Scroll_Inspect.WW_Scroll_Inspect:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_WW_Scroll_Inspect\"\nmsgid \"He was.\"\nmsgstr \"El a fost.\"\n\n#. Key:\t37D4983B49B8986752A095B03ADCD700\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter2/WW_Scroll_Inspect.WW_Scroll_Inspect:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Wizard/Chapter2/WW_Scroll_Inspect.WW_Scroll_Inspect:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_WW_Scroll_Inspect\"\nmsgid \"He was right.\"\nmsgstr \"El a avut dreptate.\"\n\n#. Key:\t26432B92474630595CF8B6B44B02657B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_26.Text\n#: /Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_26.Text\nmsgctxt \"Dialogue_WWSewerCreatures\"\nmsgid \"Farewell and good luck to you as well!\"\nmsgstr \"Adio și mult noroc și ție!\"\n\n#. Key:\t2E3C904D458640A4F06DD793B416366A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_WWSewerCreatures\"\nmsgid \"All right, I will return when I'm done.\"\nmsgstr \"Bine, voi reveni când termin.\"\n\n#. Key:\t382595684668BDA97AAB95BF129246E4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_WWSewerCreatures\"\nmsgid \"No problem. I always help when I can.\"\nmsgstr \"Nici o problema. Întotdeauna ajut când pot.\"\n\n#. Key:\t4BF10AD741739BE69EF797A32410C281\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_WWSewerCreatures\"\nmsgid \"One of your brothers is trapped? What happened?\"\nmsgstr \"Unul dintre frații tăi este prins? Ce s-a întâmplat?\"\n\n#. Key:\t52403E3341ECEA5801B0E58D2F472FD5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_1.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_1.Children(1).Children.Text\nmsgctxt \"Dialogue_WWSewerCreatures\"\nmsgid \"Leave\"\nmsgstr \"Pleacă\"\n\n#. Key:\t53AC225B4F21B68CAC6F8997F324124E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_29.Text\n#: /Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_29.Text\nmsgctxt \"Dialogue_WWSewerCreatures\"\nmsgid \"Farewell until we meet again!\"\nmsgstr \"Adio până ne întâlnim din nou!\"\n\n#. Key:\t65042BC342E9717229E74A9DD272DC5F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_WWSewerCreatures\"\nmsgid \"It was nice to see you again.\"\nmsgstr \"A fost frumos să te văd din nou.\"\n\n#. Key:\t77959A144131C47488B221ADD9B1E13B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_WWSewerCreatures\"\nmsgid \"Don't worry! I'm still looking for it.\"\nmsgstr \"Nu-ți face griji! Încă o caut.\"\n\n#. Key:\t7914F3CA40844C2A13A760BB0DAE1BFA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_WWSewerCreatures\"\nmsgid \"I don't have time for you creature! Stay out of my way!\"\nmsgstr \"Nu am timp pentru tine creatură! Stai în afara drumului meu!\"\n\n#. Key:\t79A62658414FE0202F2E9AA0E0238BD4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_9.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_9.Children(0).Children.Text\nmsgctxt \"Dialogue_WWSewerCreatures\"\nmsgid \"Accept Quest\"\nmsgstr \"Acceptă Misiune\"\n\n#. Key:\t9AEDA0E84BABEBCD8F18E8BC2D0B75D0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_WWSewerCreatures\"\nmsgid \"Calm down creature! I mean you no harm.\"\nmsgstr \"Calmează-te creatura! Nu îți vreau nici un rău.\"\n\n#. Key:\tB89304534B24114D19DF7AB07635FFDE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_WWSewerCreatures\"\nmsgid \"All right I will see what I can do.\"\nmsgstr \"Bine, voi vedea ce pot face.\"\n\n#. Key:\tB8BD374E4738BFFDAFAC4EAA19E7A9D2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_23.Text\n#: /Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_23.Text\nmsgctxt \"Dialogue_WWSewerCreatures\"\nmsgid \"Oh, thank you!\"\nmsgstr \"Oh, mulțumesc!\"\n\n#. Key:\tCF62984840B7508E82BAC0AB9D53EC0A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_9.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_9.Children(1).Children.Text\nmsgctxt \"Dialogue_WWSewerCreatures\"\nmsgid \"Decline\"\nmsgstr \"Refuză\"\n\n#. Key:\tEAD329F04773358B0CA339A4F155D990\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_WWSewerCreatures\"\nmsgid \"I'm sorry but I can't help you.\"\nmsgstr \"Îmi pare rău, dar nu te pot ajuta.\"\n\n#. Key:\tF281396D4110E61ACFEFDBB7AD8E44A8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_1.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_1.Children(0).Children.Text\nmsgctxt \"Dialogue_WWSewerCreatures\"\nmsgid \"Help\"\nmsgstr \"Ajutor\"\n\n#. Key:\tedge_next\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_1.InnerEdges(0).InnerEdges.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_1.InnerEdges(0).InnerEdges.Text\nmsgctxt \"DlgSystemSettings\"\nmsgid \"Next\"\nmsgstr \"Următor\"\n\n"
  },
  {
    "path": "Content/Localization/WarriorbDialogues/ru/WarriorbDialogues.po",
    "content": "﻿# WarriorbDialogues Russian translation.\n# Copyright 1998-2019 Epic Games, Inc. All Rights Reserved.\n# \nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: WarriorbDialogues\\n\"\n\"POT-Creation-Date: 2020-10-07 08:09\\n\"\n\"PO-Revision-Date: 2020-10-07 08:09\\n\"\n\"Language-Team: \\n\"\n\"Language: ru\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\\n\"\n\n#. Key:\t064BBCD1476819100C8D39881B7A7C56\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/2HW_LRDoor.2HW_LRDoor:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E2/2HW_LRDoor.2HW_LRDoor:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_2HW_LRDoor\"\nmsgid \"They still didn’t notice I locked them into the workroom.\"\nmsgstr \"Они до сих пор не заметили, что я запирала их в мастерской.\"\n\n#. Key:\t21412F0A4E45FA97703599BACD9C5D0E\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/2HW_LRDoor.2HW_LRDoor:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Ending/E2/2HW_LRDoor.2HW_LRDoor:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_2HW_LRDoor\"\nmsgid \"I entered into the Laboratory.\"\nmsgstr \"Я вошла в лабораторию.\"\n\n#. Key:\t5A580A014B6E9907C819808423E10C30\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/2HW_LRDoor.2HW_LRDoor:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E2/2HW_LRDoor.2HW_LRDoor:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_2HW_LRDoor\"\nmsgid \"The Laboratory has strong secure spells. I can’t enter here without being noticed.\"\nmsgstr \"В Лаборатории действуют сильные заклинания безопасности. Я не могу войти сюда, не будучи замеченной.\"\n\n#. Key:\t0530863744A9844E7F64009D82A189E4\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_2HW_WRDoor\"\nmsgid \"Ruin is close and we are all at risk. It’s not about you. It's about everyone.\"\nmsgstr \"Руин близко, и мы все в опасности. Речь не только о тебе. Это касается всех.\"\n\n#. Key:\t1AF2A89F4DCD86096D4343ABBE91BE51\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_2HW_WRDoor\"\nmsgid \"Something which doesn’t take my daughter’s soul...\"\nmsgstr \"Что-то, что не забирает душу моей дочери...\"\n\n#. Key:\t2C5B294847F0E41F2CA189904EE66059\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_2HW_WRDoor\"\nmsgid \"I heard father arguing with someone.\"\nmsgstr \"Я слышала, как отец с кем-то спорил.\"\n\n#. Key:\t2C8DFF1042FB0480709877A366BE2F1D\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_2HW_WRDoor\"\nmsgid \"The device must be destroyed.. We’ll find something else to stop Ruin.\"\nmsgstr \"Устройство должно быть уничтожено... Мы найдем что-нибудь еще, чтобы остановить Руин.\"\n\n#. Key:\t3F9D7D9C42A8550A6B282680BFAE2CCC\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_2HW_WRDoor\"\nmsgid \"I had to do this. At least for mom. So that she didn’t die in vain.\"\nmsgstr \"Я должна была это сделать. По крайней мере, для мамы. Чтобы её смерть не была напрасной.\"\n\n#. Key:\t7F6FC84C4D799841C6F42EB45A9D648F\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_2HW_WRDoor\"\nmsgid \"No, I won't risk losing her! She is bound to the device.\"\nmsgstr \"Нет, я не рискну ее потерять! Она связана с устройством.\"\n\n#. Key:\tA03D724A4606AFFC00E417A5C3AB3BFF\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_2HW_WRDoor\"\nmsgid \"Lillian knew what she applied for. She must decide.\"\nmsgstr \"Лилиан знала, на что шла. Она должна решить.\"\n\n#. Key:\tABA214914981F3E844F49483B43B5414\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_2HW_WRDoor\"\nmsgid \"I used the key to close the door.\"\nmsgstr \"Я воспользовалась ключом, чтобы закрыть дверь.\"\n\n#. Key:\tB1ADF0404F97735215FCB9A47DD01640\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_2HW_WRDoor\"\nmsgid \"No, I’ve made my decision.\"\nmsgstr \"Нет, я принял свое решение.\"\n\n#. Key:\tB26FAB564CA430617502FA85116629D0\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_2HW_WRDoor\"\nmsgid \"Even if our entire World needs to pay the price.\"\nmsgstr \"Даже если весь наш Мир должен будет заплатить за это.\"\n\n#. Key:\tD6D2D64446B6D921576A20ACD653AF7E\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_2HW_WRDoor\"\nmsgid \"I knew he wouldn’t let me finish what we started.\"\nmsgstr \"Я знала, что он не позволит мне закончить то, что мы начали.\"\n\n#. Key:\t178EBCA541F7FEC3CA46B1B2818691D4\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/AABook.AABook:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/AABook.AABook:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_AABook\"\nmsgid \"'...the Wisest of the Arcade gathered here to discuss if the magical phenomena means any more threat...'\"\nmsgstr \"“...Мудрейшие из Аркады собрались здесь, чтобы обсудить, означает ли магическое явление еще одну угрозу...”\"\n\n#. Key:\t8F2CCFF54FBAF7902DB6FEB0358ECFEF\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/AABook.AABook:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/AABook.AABook:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_AABook\"\nmsgid \"They were just like us. The next one hundred pages explain why Ruin will never reach the Arcade or how the Ancient Magic can stop it.\"\nmsgstr \"Они были такими же, как мы. Следующие сто страниц объясняют, почему Руин никогда не достигнет Аркады или как Древняя Магия может остановить его.\"\n\n#. Key:\tAC20B864497FB0D476C501AEF3B87508\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/AABook.AABook:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/AABook.AABook:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_AABook\"\nmsgid \"I hope you don’t want to read all that nonsense.\"\nmsgstr \"Надеюсь, ты не захочешь читать всю эту чушь.\"\n\n#. Key:\tB112F657498F660766AA45974CB44137\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/AABook.AABook:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/AABook.AABook:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_AABook\"\nmsgid \"'Ten years after the Cataclysm (or recently named as Ruin)...'\"\nmsgstr \"“Десять лет после Катаклизма (или недавно названного Руином)...”\"\n\n#. Key:\t0F53B19F4EB2F7727B4907864AD3FF46\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_29.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_29.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"What if you just take a break from this and let me pass? Make an exception.\"\nmsgstr \"Что если ты просто сделаешь перерыв и позволишь мне пройти? Сделай исключение.\"\n\n#. Key:\t1707E0F34CFDC054DBEAD9AFB368A0A4\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"No rest, no sleep allowed.\"\nmsgstr \"Никакого отдыха, никакого сна.\"\n\n#. Key:\t2524B3EC4DE1E2921C710CBE4511045F\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"...sometimes I could really appreciate a chair.\"\nmsgstr \"...иногда я бы очень хотел иметь стул.\"\n\n#. Key:\t29FE2AEF42639848EF3914B36BA2B633\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"I do ask you for apologies, young one.\"\nmsgstr \"Я прошу у тебя прощения, молодой человек.\"\n\n#. Key:\t2C1E7EA026080F0A003A0396BE7E0E7E\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"Take this rune stone as compensation.\"\nmsgstr \"Возьми этот рунический камень в качестве компенсации.\"\n\n#. Key:\t2C879B684B4B07B57D051797219E751E\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"You might have proven worthy for the Arcade Gate, yet there are some other doors, and they have different rules.\"\nmsgstr \"Ты возможно доказал, что достоин Врат Аркады, но есть и другие врата, и у них другие правила.\"\n\n#. Key:\t3532C8254924CF13EA664CA11E256F07\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"Will you??? That's so kind of you... err... I mean...\"\nmsgstr \"Ты серьезно? Это так мило с твоей стороны... эээ... То есть...\"\n\n#. Key:\t353D6C8B4B5719B1EFD2A59BA0281DED\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_2.Children(2).Children.Text\n#. Key:\t8EED48724A0A860CAD791FAF95554F26\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_3.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_2.Children(2).Children.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_3.Children(1).Children.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"Skip?\"\nmsgstr \"Пропустить?\"\n\n#. Key:\t3FF1411844C23DB2FDFA47939169B5C3\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_14.Children(0).Children.Text\n#. Key:\t59EC5E56475DE41CFC723793CEEAFA82\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_3.Children(0).Children.Text\n#. Key:\t65DD6A464F04F8B0762D568046344C16\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_6.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_14.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_3.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_6.Children(0).Children.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"Accept challenge\"\nmsgstr \"Принять вызов\"\n\n#. Key:\t414D5CC44FFD640215B97BB6090627D6\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"That must be tough...\"\nmsgstr \"Это наверное тяжело...\"\n\n#. Key:\t4CAA2D0C4FB585A0EB5B4F87FE8A3A97\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"I accept my fate yet sometimes...\"\nmsgstr \"Я принимаю свою судьбу, но иногда...\"\n\n#. Key:\t4F7460F540408D07FECEEB88DC0D7D25\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"Not so fast young lord!\"\nmsgstr \"Не так быстро, молодой господин!\"\n\n#. Key:\t52C3909F40026C52ADA498A5B60B3490\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_6.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_6.Children(1).Children.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"Poor Keeper\"\nmsgstr \"Бедный хранитель\"\n\n#. Key:\t59141BA444003F36E1671CB4E91FFF0E\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"Farewell!\"\nmsgstr \"Прощай!\"\n\n#. Key:\t59AC0995469571DBE1B7B6BDF68FA37D\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"I am really sorry about that.\"\nmsgstr \"Мне очень жаль.\"\n\n#. Key:\t5C8404D34863129B221EF2BB1D0962CC\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_9.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_9.Children(0).Children.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"Yes?\"\nmsgstr \"Да?\"\n\n#. Key:\t5FF922B94D3FCA5FD095FFB788F43D02\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"For there was a mistake.\"\nmsgstr \"Потому что произошла ошибка.\"\n\n#. Key:\t650DA55944F225C45BABE8B00D815A39\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_27.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_27.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"I guess you want me to go through some crazy traps again...\"\nmsgstr \"Я так понимаю, ты хочешь, чтобы я снова прошел через какие-то сумасшедшие ловушки...\"\n\n#. Key:\t700A25DB401C6EDD1E9D1694DA1C1DA1\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"Keepers never fail their duty.\"\nmsgstr \"Хранители никогда не перестают выполнять свой долг.\"\n\n#. Key:\t72D703F84C84CD07F7DA569D9B86AECB\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"There are times when you have to stand in front of a door for a really long time.\"\nmsgstr \"Бывают моменты, когда тебе приходится стоять перед вратами очень долго.\"\n\n#. Key:\t8276A9AC4E3BAB81C41E6EAB12E4FED1\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_31.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_31.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"If I ever see a chair that's your size I will let you know.\"\nmsgstr \"Если я когда-нибудь увижу стул твоего размера, я дам тебе знать.\"\n\n#. Key:\t89421ED443CA8DD5A15DF289C5DC6C37\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_28.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_28.Children(0).Children.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"Accept Challenge\"\nmsgstr \"Принять вызов\"\n\n#. Key:\t910F61A841D9E86D1B349E85A8A47FCF\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"Prove yourself worthy and I shall yield the path!\"\nmsgstr \"Докажи, что ты достоин, и я уступлю тебе путь!\"\n\n#. Key:\t9DAC66B94E5A37C628522B90029E8FCC\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_2.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_2.Children(0).Children.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"Not again\"\nmsgstr \"Только не это\"\n\n#. Key:\t9F3FE24943FB7CE59B8453A2849E874A\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"This door is open and free of charge for everyone...\"\nmsgstr \"Эта дверь открыта и бесплатна для всех...\"\n\n#. Key:\tA96E78A0410C87446F59ABAC1524A3F4\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_2.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_2.Children(1).Children.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"Let's do it!\"\nmsgstr \"Поехали!\"\n\n#. Key:\tA9998DDC43D15F1EDE404B8A3E04E3B2\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"Keepers' lives are never easy.\"\nmsgstr \"Жизнь хранителей никогда не бывает легкой.\"\n\n#. Key:\tBCAE1C1D4890E79F187EF0940C6F7E84\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_12.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_12.Children(0).Children.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"Just get over\"\nmsgstr \"Просто покончи с этим\"\n\n#. Key:\tC2F8F4E1457AC142E58D1EA3AF24AB56\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"I am all right with a few hundred years, but after a millennium my knees hurt like hell.\"\nmsgstr \"Я в норме с несколькими сотнями лет, но после тысячи лет мои колени болят, чертовски сильно.\"\n\n#. Key:\tC955446E4CA17593CCC57B9A73AAE824\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"What?? Do you mean that all those challenges that I had to pass were in vain?\"\nmsgstr \"Что? Ты имеешь в виду, что все те испытания, которые мне пришлось пройти, были напрасны?\"\n\n#. Key:\tC97F61DA4A49287F5242EEB43152D409\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"All right, you win. I'll go and do some jumping. Must be better than waiting here for an eternity.\"\nmsgstr \"Ладно, твоя взяла. Пойду попрыгаю. Это будет лучше, чем ждать здесь вечность.\"\n\n#. Key:\tD318418D4CBBFA2AB381E6B287A8636F\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_30.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_30.Children(0).Children.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"Accept Challenge.\"\nmsgstr \"Принять Вызов.\"\n\n#. Key:\tD6BE170047C1A00770403087A7EBDF99\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_30.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_30.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"Hopefully, we will finish this soon.\"\nmsgstr \"Надеюсь, мы с этим скоро закончим.\"\n\n#. Key:\tD72FF4F943571BE3DC8DB1877581D4CD\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"You shall prove yourself one more time.\"\nmsgstr \"Ты должен проявить себя еще раз.\"\n\n#. Key:\tDFD8B1E0414F989D46ED9BB24610CDA8\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_12.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_12.Children(1).Children.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"I will help\"\nmsgstr \"Я помогу\"\n\n#. Key:\tFDDD27C544787C63B03CCE89B69A44E5\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"Well, thanks!\"\nmsgstr \"Ну, спасибо!\"\n\n#. Key:\t06D52FD74B0013A5A22FEBA7A6E82032\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Did you came back to check out my wares?\"\nmsgstr \"Ты вернулся, чтобы посмотреть мои товары?\"\n\n#. Key:\t07508A9F4A979D530AD8A9861F0C7D79\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Though maybe you will find relief by looking through my wares. Haha!\"\nmsgstr \"Хотя, возможно, ты найдешь облегчение, заглянув в мои товары. Ха-ха!\"\n\n#. Key:\t0C1B7239419B00927360E1B9578540EA\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_27.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_27.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"That's a sad name indeed. If the old saying 'nomen est omen' is true, then it might not be the best choice.\"\nmsgstr \"Печальное конечно имя. Если старая поговорка “nomen est omen” верна, то, возможно, это не лучший выбор.\"\n\n#. Key:\t0D8F81E140A7AF5369415FB1C081250E\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_10.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_10.Children(0).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Trade\"\nmsgstr \"Купить\"\n\n#. Key:\t1089DA0443D9B23C84B8B799EEEBCCC9\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_SpeechSequence_0.SpeechSequence(0).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_SpeechSequence_0.SpeechSequence(0).SpeechSequence.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Oh, that's sad my little one.\"\nmsgstr \"Ох, милый мой, это так печально.\"\n\n#. Key:\t16F6844C40498EC1B5CDAA87612D3982\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_42.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_42.Children(1).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"No way\"\nmsgstr \"Ни за что\"\n\n#. Key:\t182D4124450BFA52EF26FBACE1706333\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_45.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_45.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"How noble of you!\"\nmsgstr \"Как благородно с твоей стороны!\"\n\n#. Key:\t1922E4FD49ABC50B04A33CBA07B440D1\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_34.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_34.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"But I hope this doesn't mean that you want to join the Maintainers. Haha!\"\nmsgstr \"Но я надеюсь, что это не значит, что ты хочешь присоединиться к Прислужникам. Ха-ха!\"\n\n#. Key:\t195B9BED4921EE6D732CA4BE6391A402\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_31.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_31.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"No, thanks!\"\nmsgstr \"Нет, спасибо!\"\n\n#. Key:\t198A3D8D426F5202C280CE96202EB415\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_50.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_50.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"This is a sad name indeed. And if the old saying 'nomen est omen' is true, then this might not be the best choice.\"\nmsgstr \"Это действительно грустное имя. И если старая поговорка “nomen est omen” верна, то это может быть не лучшим выбором.\"\n\n#. Key:\t1AF2DDE74542524EEF19CA9567CFBDAF\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"{name}? It still sounds a bit weird, but I think I might like it.\"\nmsgstr \"{name}? Все еще звучит немного странно, но думаю, мне понравится.\"\n\n#. Key:\t1FC5AD3B488DB484169D0085D63ECC45\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"This sounds pretty epic but I wonder what nickname it might have?\"\nmsgstr \"Звучит довольно эпично, но интересно, какое будет прозвище?\"\n\n#. Key:\t21FEE27B41116ADFBFD2B69333D6EB3F\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"By using some sort of ritual or spell...\"\nmsgstr \"Используя какой-то ритуал или заклинание...\"\n\n#. Key:\t25DCE964400342D4188412ADF43277E6\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_61.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_61.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"I am rewarding you with these shiny coins!\"\nmsgstr \"Я вознаграждаю тебя этими блестящими монетами!\"\n\n#. Key:\t2717F0E0414D4828B67D9C9F9B7E5F84\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_62.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_62.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"See? I'm a gnome of my word!\"\nmsgstr \"Видишь? Я гном слова!\"\n\n#. Key:\t2747A45248055455F9FA3B977A019EE0\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_44.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_44.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Well, you know where to find me... once you have some coins to spend!\"\nmsgstr \"Ну, ты знаешь, где меня найти... как только у тебя появятся монеты!\"\n\n#. Key:\t27CE4D1444C219D35B79F4A3B07CB67D\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"If you bring them to me, I will reward you with shiny golden coins!\"\nmsgstr \"Если ты принесешь их мне, я награжу тебя блестящими золотыми монетами!\"\n\n#. Key:\t3040F4DC4C763062C8EFED9BCA5028C0\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_59.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_59.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"I would love to give you that name, but if you don't have the money to pay for it, we can't make the deal, it wouldn't be fair\"\nmsgstr \"Я бы с радостью дала тебе это имя, но если у тебя нет денег, чтобы заплатить за него, мы не можем заключить сделку, это будет нечестно\"\n\n#. Key:\t3124230541027A0022F54C8648E688C9\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Oh, a customer!\"\nmsgstr \"О, посетитель!\"\n\n#. Key:\t31C147E1430106CD29C7D7B2F7E84975\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_23.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_23.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Oh, how sad.\"\nmsgstr \"Ох, как печально.\"\n\n#. Key:\t37CC1248471C360F8BB605A404ED1408\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_10.Children(4).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_10.Children(4).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Give books\"\nmsgstr \"Отдать книги\"\n\n#. Key:\t3E0A0E06487AD4E75C3AF28786DE9CC7\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_16.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_16.Children(0).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Don't know\"\nmsgstr \"Не знаю\"\n\n#. Key:\t40221BB0432119A5B1C285B748AEFB81\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_51.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_51.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"It sounds pretty epic, however I wonder what nickname it might have?\"\nmsgstr \"Звучит довольно эпично, но интересно, какое прозвище у него может быть?\"\n\n#. Key:\t422B5CC14CA23A6563EDBDBBEA09C44B\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_73.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_73.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Farewell! Ha-ha...\"\nmsgstr \"Пока! Ха-ха...\"\n\n#. Key:\t4574EE8E4B1EAB6C9310C4A19F77B170\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_10.Children(6).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_10.Children(6).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Leave\"\nmsgstr \"Уйти\"\n\n#. Key:\t47F99BBF439F713C52279F86BDC4FDD5\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_72.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_72.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"No thanks, I'm leaving.\"\nmsgstr \"Нет, спасибо, я ухожу.\"\n\n#. Key:\t4F31CEE0411BB60324FB58938857F162\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_16.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_16.Children(1).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"A mighty spirit\"\nmsgstr \"Могучий дух\"\n\n#. Key:\t4FA29908450786B433C0FCA2E313D989\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_36.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_36.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Hi, I'm Lory.\"\nmsgstr \"Привет, я Лори.\"\n\n#. Key:\t4FCB34514D82104E732407A1CD985F6B\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_70.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_70.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Sure, show me what you've got!\"\nmsgstr \"Конечно, покажи мне, что у тебя есть!\"\n\n#. Key:\t53A46E1948B7CC1A9F8E02A3147FBF2D\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_67.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_67.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Sure, what can I do?\"\nmsgstr \"Конечно, что мне нужно сделать?\"\n\n#. Key:\t53E7A272465DE8D6E34AE7BE7435B1AC\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_25.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_25.Children(1).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Spirit of the Unknown\"\nmsgstr \"Дух Неизвестного\"\n\n#. Key:\t54F8FB604F0409ED474FBFBAD8BFD3B3\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"And you are...\"\nmsgstr \"А ты кем будешь...\"\n\n#. Key:\t58447CCB4EE84827DB8328A664C54198\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_24.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_24.Children(0).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Buy name\"\nmsgstr \"Купить имя\"\n\n#. Key:\t589162A649D330D791082EB8FE3F6459\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_41.Children(4).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_41.Children(4).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Don't buy.\"\nmsgstr \"Не покупать.\"\n\n#. Key:\t58CC98724AFCD3826D69D482682AF352\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"\\\"The true value of your family\\\" and \\\"How much does a brother cost?\\\" can be two examples in this case.\"\nmsgstr \"“Истинная стоимость вашей семьи” и “Сколько стоит брат?” могут быть двумя примерами в этом случае.\"\n\n#. Key:\t5A249B2E47F62C59F66AD5848E6DEBFE\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_49.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_49.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"I'll see what I can do.\"\nmsgstr \"Я посмотрю, что можно сделать.\"\n\n#. Key:\t5A31E5D34729F7EAB69AC08238C1D32D\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_25.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_25.Children(0).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Failed One\"\nmsgstr \"Неудачник\"\n\n#. Key:\t5BA1062346DF8BC47F97BA97653E6DDA\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_46.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_46.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Farewell then, and good luck with your quest! Ha-ha...\"\nmsgstr \"Ну, пока-пока, и удачи тебе в твоих поисках! Ха-ха...\"\n\n#. Key:\t6047D5334E0247BFB75EBAA7380C6800\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_68.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_68.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"I have some other important things to do right now.\"\nmsgstr \"У меня сейчас есть другие важные дела.\"\n\n#. Key:\t60B184AF4F25AFB60380029BD2C17AAB\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_66.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_66.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"I'm a mighty spirit of the Unknown!\"\nmsgstr \"Я могучий дух Неизвестного!\"\n\n#. Key:\t60CE0D4342B6E4971449D7BDDD62B13F\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_10.Children(3).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_10.Children(3).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Help\"\nmsgstr \"Помощь\"\n\n#. Key:\t62C5459E46C969412EAD70BAD466D808\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_SpeechSequence_0.SpeechSequence(1).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_SpeechSequence_0.SpeechSequence(1).SpeechSequence.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Life is relentless. Innocent people are trapped, enslaved or abused!\"\nmsgstr \"Жизнь неумолима. Невинные люди попадают в ловушки, в рабство или подвергаются насилию!\"\n\n#. Key:\t6DDEF0AB45B60A99946E8F9FC647DCDE\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_71.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_71.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"I need a proper name.\"\nmsgstr \"Мне нужно подходящее имя.\"\n\n#. Key:\t6F1C50A44DE698DF5BF089B1C9B29F06\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_69.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_69.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Right now I don't really have much money...\"\nmsgstr \"Сейчас у меня не так много денег...\"\n\n#. Key:\t72272161488706E5E87697A755F11129\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Even though there are some other precious books that I could add to my collection...\"\nmsgstr \"Несмотря на это, есть и другие ценные книги, которые я могла бы добавить в свою коллекцию...\"\n\n#. Key:\t764502A14C3C18B14F8A579A58CE5938\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"I know that some of those books must be in the Sewer's Library, but I couldn't find them.\"\nmsgstr \"Я знаю, что некоторые из этих книг должны быть в Библиотеке Канализации, но я не смогла их найти.\"\n\n#. Key:\t7A1853C7454D74FD1F371A92CEE47B4E\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"That's fine but I wonder, what is your name?\"\nmsgstr \"Это миленько, но мне интересно, какое у тебя имя?\"\n\n#. Key:\t7BACFCA748AF641E051E2D8B8D8488FC\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"I don't know if I have one.\"\nmsgstr \"Не знаю, есть ли оно у меня.\"\n\n#. Key:\t821021954082EA7E4B392FA89EE4DE91\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_41.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_41.Children(1).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Spirit of the Unknown (1 Gold)\"\nmsgstr \"Дух Неизвестного (1 Золото)\"\n\n#. Key:\t83AECB5A4FCAB05CC81BCC9B810245B7\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_41.Children(2).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_41.Children(2).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"BALL-E (1 Gold)\"\nmsgstr \"БОЛЛ-И (1 Золото)\"\n\n#. Key:\t84ACF5E1449849CB79CF8AB10BE2FF2E\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"As you can observe, I have a pretty nice collection of books.\"\nmsgstr \"Как ты видишь, у меня довольно хорошая коллекция книг.\"\n\n#. Key:\t899D1E18420FDAD236BF3486B2A5A010\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Ring the bell if you need something.\"\nmsgstr \"Позвони в колокольчик, если тебе что-нибудь понадобится.\"\n\n#. Key:\t8B33450F405DF08E72CE47B5FC66CDD5\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_55.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_55.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Spiry? Knowny?\"\nmsgstr \"Дух? Известный?\"\n\n#. Key:\t8CEC3E1943C3AB72CF3B71B160B9ADB9\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_10.Children(5).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_10.Children(5).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Need gold\"\nmsgstr \"Нужно золото\"\n\n#. Key:\t8D0FBCA540F73842DD3AC38A76A5B623\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_56.Text\n#. Key:\tF045657A439D69E3615B80A066E9CE86\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_33.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_33.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_56.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Nevermind! You chose well.\"\nmsgstr \"Ой, неважно! Неплохой выбор.\"\n\n#. Key:\t8F32BD4544F8C439D7344CBE1F9B4D8A\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_24.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_24.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Would you like to buy one? The first one is for free!\"\nmsgstr \"Хочешь купить себе одно? Первое бесплатно!\"\n\n#. Key:\t94C0F9B34F439CDFBDFAD696E81983E5\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"I don't have much gold. Is there any way you could help me out?\"\nmsgstr \"У меня мало золота. Можешь мне как-нибудь помочь?\"\n\n#. Key:\t9BA6BAA24E6C2B7F01964D892246E8F6\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"No, no, I meant the other bell.\"\nmsgstr \"Нет, нет, я имела в виду другой колокольчик.\"\n\n#. Key:\tA9D4DF4C41BAD682571763BDA8DA6A62\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_10.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_10.Children(1).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Can't afford\"\nmsgstr \"Не можешь себе позволить\"\n\n#. Key:\tAA6B105442F5099CE0F4E2AE0DFF7080\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_35.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_35.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Now that we're done with this, will you have a look at my wares?\"\nmsgstr \"Теперь, когда мы с этим закончили, не посмотришь на мои товары?\"\n\n#. Key:\tAADE21D24A42CE7BD318478306BAFFF7\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_10.Children(2).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_10.Children(2).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"I need a name\"\nmsgstr \"Мне нужно имя\"\n\n#. Key:\tAB00899C4A94AA6458737BB28339A3EE\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Hush, hush, little one!\"\nmsgstr \"Тише, тише, милый мой!\"\n\n#. Key:\tAB431F244E4E18230CE5EAB99FB41A96\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_41.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_41.Children(0).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Failed One (1 Gold)\"\nmsgstr \"Неудачник (1 Золото)\"\n\n#. Key:\tAB92E44E46B40EF16989FF850DE0F843\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_42.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_42.Children(0).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Interested\"\nmsgstr \"Интересует\"\n\n#. Key:\tB0540325412D9839B33FB38C4FE73172\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Well, I guess that's a classic.\"\nmsgstr \"Ну, я думаю, это классика.\"\n\n#. Key:\tB0EFD31840839CDA6F3D929514412D00\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Ok, I'll try not to be annoying this time.\"\nmsgstr \"Хорошо, я постараюсь не раздражать в этот раз.\"\n\n#. Key:\tB1F217944F6B9A29BD13FA926D8230E8\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_44.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_44.Children(0).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Farewell!\"\nmsgstr \"Пока!\"\n\n#. Key:\tBA2B2F444FC2320349C4A0BABDA78B40\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_25.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_25.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"All right...\"\nmsgstr \"Ну давай...\"\n\n#. Key:\tCADB3E394C94CDE32D9969B6C1A41F5C\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_47.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_47.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Take this Elevator Crystal as it might prove useful in your journey.\"\nmsgstr \"Возьми этот Кристалл Лифта, он может тебе пригодиться в твоем путешествии.\"\n\n#. Key:\tCB3F061042B8340154B4CD8AEED41348\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_42.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_42.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"However, there is a way, I can help you out. Of course, if you are interested.\"\nmsgstr \"Однако, возможно, я смогу тебе помочь. Конечно, если тебе интересно.\"\n\n#. Key:\tCF24AD454E123F6D7D61029155390914\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_41.Children(3).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_41.Children(3).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Warriorb (1 Gold)\"\nmsgstr \"Warriorb (1 Gold)\"\n\n#. Key:\tD01937C848C69809890885BAB13042BE\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_65.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_65.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"I'm not quite sure.\"\nmsgstr \"Я не совсем уверен.\"\n\n#. Key:\tD53097EB4EFC08C0C3261A9EEBD96B72\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_39.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_39.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"That's sad. Nothing is worse than a customer without any gold to spend!\"\nmsgstr \"Как печально. Нет ничего хуже, чем клиент без золота, которое можно потратить!\"\n\n#. Key:\tD63C08294AC09BF5B8E5D29EEC1C7D39\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"I'm forced to stay in this realm because I agreed to do some silly tasks for a wizard. I could really use some help.\"\nmsgstr \"Я вынужден остаться в этом царстве, потому что согласился выполнять глупые задания для волшебника. Мне бы очень пригодилась помощь.\"\n\n#. Key:\tDB0CCA7746068ACFBE6F71963C398753\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_63.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_63.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"And now that you have some coins to spend it's time to talk about business!\"\nmsgstr \"И теперь, когда у тебя есть несколько монет, пришло время поговорить о бизнесе!\"\n\n#. Key:\tDC0F8EC0407F1C7B4FFED6A91CB961C5\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_57.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_57.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"I hope this doesn't mean that you want to join the Maintainers. Haha!\"\nmsgstr \"Но я надеюсь, что это не значит, что ты хочешь присоединиться к Прислужникам. Ха-ха!\"\n\n#. Key:\tDC475A6740B71354D90D53B6AD1C4740\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_60.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_60.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"How wondrous! You found my books!\"\nmsgstr \"Как чудесно! Ты нашел мои книги!\"\n\n#. Key:\tE3B8F89B4D4AC0ABD2E35994ABFA9916\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"I understand if you have identity problems, but there must be a way... how do others call you?\"\nmsgstr \"Я понимаю, если у тебя проблемы с личностью, но должно же быть что-то... как тебя называют другие?\"\n\n#. Key:\tE6BD711C4E23B71F944EEFB1C8D09AB4\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_41.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_41.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"You've come to the right place! Haha!\"\nmsgstr \"Ты пришел в нужное место! Хаха!\"\n\n#. Key:\tEDEB662C4A5024CC618A668699BFAC2C\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_SpeechSequence_0.SpeechSequence(2).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_SpeechSequence_0.SpeechSequence(2).SpeechSequence.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"There is no justice in this Realm.\"\nmsgstr \"В этом царстве нет справедливости.\"\n\n#. Key:\tF8814FA0497129A211F3F9BE01EAF378\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_29.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_29.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"That's a very cute name for a little one like you.\"\nmsgstr \"Очень милое имя для такого маленького, как ты.\"\n\n#. Key:\tF8BEB8C147C81D8B13E52AA9934891AB\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_58.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_58.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Nevermind, you can always come back.\"\nmsgstr \"Неважно, ты всегда можешь вернуться.\"\n\n#. Key:\tF97BE7FD49F465A97F7C8D9F308EAD3C\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_52.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_52.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"That's such a cute name for a little one.\"\nmsgstr \"Очень милое имя для такого маленького, как ты.\"\n\n#. Key:\tFAAAE5944AA8CCAEFC931CAA814C8621\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_54.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_54.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Which means you chose well.\"\nmsgstr \"Что значит, ты сделал правильный выбор.\"\n\n#. Key:\tFAD10B404CF744B61DF5D093829CD1E9\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Of course! You need some gold, otherwise how would you buy my stuff?\"\nmsgstr \"Конечно! Тебе нужно немного золота, иначе, как ты сможешь купить мои товары?\"\n\n#. Key:\tFE40092A444E97C59E8C6E94061D1134\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_30.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_30.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"However, I'd rather prefer: 'Nomen quantivis iam est pret!'\"\nmsgstr \"Тем не менее, я предпочитаю: “Nomen quantivis iam est pret!”\"\n\n#. Key:\tFEE11C0F4A65DDFFDBF0BD8BB30CD438\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_25.Children(2).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_25.Children(2).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"BALL-E\"\nmsgstr \"БОЛЛ-И\"\n\n#. Key:\tFF0AFE8544814AE524115A853547D727\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_24.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_24.Children(1).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Refuse\"\nmsgstr \"Отказать\"\n\n#. Key:\t0648624E4922B098541A7EA738DABC92\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/AARagdoll.AARagdoll:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/AARagdoll.AARagdoll:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_AARagdoll\"\nmsgid \"Well that happens sometimes. Maybe that someone forgot to monopolize this ragdoll design.\"\nmsgstr \"Ну, такое иногда случается. Может быть, кто-то забыл монополизировать этот дизайн тряпичной куклы.\"\n\n#. Key:\t2058DE654B2B75531C04628635169938\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/AARagdoll.AARagdoll:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/AARagdoll.AARagdoll:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_AARagdoll\"\nmsgid \"Just leave that doll.\"\nmsgstr \"Просто забудь об этой кукле.\"\n\n#. Key:\t5A456D084D452C82038A04942002FAE6\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/AARagdoll.AARagdoll:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/AARagdoll.AARagdoll:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_AARagdoll\"\nmsgid \"It’s like the doll which was made by...\"\nmsgstr \"Это как кукла, которая была сделана...\"\n\n#. Key:\t7813ED164DF5CA7DE48A978F9A3DC959\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/AARagdoll.AARagdoll:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/AARagdoll.AARagdoll:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_AARagdoll\"\nmsgid \"How on earth did this get here?\"\nmsgstr \"Как, черт возьми, это сюда попало?\"\n\n#. Key:\tC4403E4C4FD7D72CA3252FB31FF98FDF\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/AARagdoll.AARagdoll:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/AARagdoll.AARagdoll:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_AARagdoll\"\nmsgid \"...by someone I knew.\"\nmsgstr \"...кем-то, кого я знал.\"\n\n#. Key:\tE4CD5DBC4E4BB1E783B55D80F4296B97\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/AARagdoll.AARagdoll:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/AARagdoll.AARagdoll:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_AARagdoll\"\nmsgid \"There are many weird things all over this place. What makes this stand out?\"\nmsgstr \"Здесь много странных вещей. Чем эта вещь выделяется?\"\n\n#. Key:\tEDD72B38407D0C33C5F7859D09BC132B\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/AARagdoll.AARagdoll:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/AARagdoll.AARagdoll:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_AARagdoll\"\nmsgid \"You are not funny.\"\nmsgstr \"Не смешно.\"\n\n#. Key:\t02767246403F00F0C866B2A7F3E22A47\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_72.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_72.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"You can hardly find anyone that has more information about the Realms.\"\nmsgstr \"Вряд ли можно найти кого-то, у кого есть больше информации о Царствах.\"\n\n#. Key:\t04843D4A4D2DD4BC7CE50989C8F66FBA\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_2.SpeechSequence(2).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_2.SpeechSequence(2).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"How can I do something if I do not know what I have to do?\"\nmsgstr \"Как я могу что-то сделать, если я не знаю, что мне нужно сделать?\"\n\n#. Key:\t071A801E44759E2681218497B9AE9A2B\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_53.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_53.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Your logic is incoherent.\"\nmsgstr \"Твоя логика противоречива.\"\n\n#. Key:\t07488F9A4CC6F87DBC44F0A11700B370\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_70.Children(0).Children.Text\n#. Key:\tA67B3D3B4A3D17B37D585EBBBD9BBE92\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_75.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_70.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_75.Children(0).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"All right, I'm on it.\"\nmsgstr \"Хорошо, я займусь этим.\"\n\n#. Key:\t0757D23846F6BC96198472B7E9848D3F\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_52.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_52.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Maybe I should accept what I need to do now.\"\nmsgstr \"Может, мне стоит принять то, что мне нужно сделать сейчас.\"\n\n#. Key:\t07D63011406134B07FB90B903825151C\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_8.SpeechSequence(2).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_8.SpeechSequence(2).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Make your wizard turn you back to normal.\"\nmsgstr \"Заставь своего волшебника обратить тебя обратно.\"\n\n#. Key:\t091DFEFA4B2DD8F9922A1B93534C66A8\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_70.Text\n#. Key:\t0F92571643C12F65C669F7812572B014\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_82.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_70.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_82.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven gives you one of his keys so that you can move around freely.\"\nmsgstr \"Ворон дает тебе один из своих ключей, чтобы ты мог свободно передвигаться.\"\n\n#. Key:\t0922ED5741BB89553CCB548D33566972\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_8.SpeechSequence(4).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_8.SpeechSequence(4).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven is something which won't make wizards turn Raven back.\"\nmsgstr \"Ворон - это что-то, что не заставит волшебников обратить Ворона назад.\"\n\n#. Key:\t0AAFADBB493DCFBA6C649EAC11133DC2\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_2.SpeechSequence(0).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_2.SpeechSequence(0).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"You don't have to know.\"\nmsgstr \"Ты не должен знать.\"\n\n#. Key:\t0E59A33E44BF6B212BF0EF8E8EFB3E39\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_6.SpeechSequence(2).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_6.SpeechSequence(2).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"A rich kingdom ruling all the other lands, powered by spirits of another world; these spirits were bound to metal.\"\nmsgstr \"Богатое царство, управляющее всеми остальными землями, поддерживаемое духами из другого мира; эти духи были привязаны к металлу.\"\n\n#. Key:\t0EACC01B4A4C4F8C5622B9BD291E0DB9\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_91.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_91.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"I'm not quite sure about this...\"\nmsgstr \"Я не совсем в этом уверен...\"\n\n#. Key:\t10142FA943B5E5D89F9E5AADC86EF413\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_113.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_113.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Yes.\"\nmsgstr \"Да.\"\n\n#. Key:\t12375FB0475147E23E1C21A867CFF219\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_68.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_68.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Is there anything else on your mind?\"\nmsgstr \"У тебя есть что-нибудь еще на уме?\"\n\n#. Key:\t12A0B58B446843DD24045394E8586D7D\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Krrr...\"\nmsgstr \"Кррр...\"\n\n#. Key:\t12B921E04D135919C7DA37ADDBD2A7DB\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_100.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_100.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"We still have some time left before this happens.\"\nmsgstr \"У нас еще есть время, прежде чем это случится.\"\n\n#. Key:\t133F676B4DBA8B41F6B94387D51457D5\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_59.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_59.Children(1).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"No more Raven\"\nmsgstr \"Надеюсь нет Ворон\"\n\n#. Key:\t13EF39EE4249FDD62208CFB7A41821D7\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_65.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_65.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Though Raven knows how you feel.\"\nmsgstr \"Хотя Ворон знает, что ты чувствуешь.\"\n\n#. Key:\t15D06ACE4E8B5E4DA49297BBE436039D\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_80.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_80.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Now you only need to find a place where you can infuse it.\"\nmsgstr \"Теперь тебе нужно только найти место, куда ты сможешь его вставить.\"\n\n#. Key:\t16D5522340AE76E69A4808A3C2D1C039\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_51.Children(1).Children.Text\n#. Key:\t2AD4608440348AC7C3E363A430B9848C\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_83.Children(0).Children.Text\n#. Key:\t57DDAE184F31D9761E3939B16E6B2E67\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_20.Children(1).Children.Text\n#. Key:\t59F157C64A5415C8B4E322B0FF5F2ACE\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_49.Children(1).Children.Text\n#. Key:\t73ACC7124190746F6D3EBF96C8202C25\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_77.Children(1).Children.Text\n#. Key:\t9900274346DCB374A4B222A6BFD67365\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_10.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_10.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_20.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_49.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_51.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_77.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_83.Children(0).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Chat\"\nmsgstr \"Поболтать\"\n\n#. Key:\t19FD8B0541A533338EA11B9CDA3719B2\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_74.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_74.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Now you only need to find a place where you can infuse it. Meanwhile, Raven must figure it out how to open the Gate with it.\"\nmsgstr \"Теперь тебе нужно только найти место, где ты сможешь его зарядить. Тем временем, Ворон должен выяснить, как с его помощью открыть Врата.\"\n\n#. Key:\t1BD7592A4F11AEC585ECA6A74A0E0D4E\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_9.SpeechSequence(4).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_9.SpeechSequence(4).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"In what way?\"\nmsgstr \"Каким образом?\"\n\n#. Key:\t1C30FADA4BB2B3CCE2140A8E192D9F14\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_34.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_34.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven is not like those dummy Living Armors, yet he does what he was made for.\"\nmsgstr \"Ворон не такой, как эти дурацкие “Живые доспехи”, но он делает то, для чего был создан.\"\n\n#. Key:\t1C57460444A7E044DD96148495C4C217\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_6.SpeechSequence(4).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_6.SpeechSequence(4).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"They lost purpose and became reckless.\"\nmsgstr \"Они потеряли цель и стали безрассудными.\"\n\n#. Key:\t1E3AF1D8483287CE52633EA41B89DF11\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_116.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_116.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"After he had some rest.\"\nmsgstr \"После того, как он немного отдохнет.\"\n\n#. Key:\t1ED675F344909355D41212988B736F70\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_1.SpeechSequence(3).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_1.SpeechSequence(3).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven's master would like to understand before doing anything.\"\nmsgstr \"Мастер Ворона прежде чем что-то делать, хотел бы все понять.\"\n\n#. Key:\t22E51DC245ABAE53146A71AAE8D5AB55\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"You will realize that 'sense' has no meaning in this realm anymore.\"\nmsgstr \"Ты поймешь, что “разумно“ больше не имеет никакого значения в этом царстве.\"\n\n#. Key:\t236E0B58451C947C0DB93E9E3408456D\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_45.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_45.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"They are humans.\"\nmsgstr \"Они люди.\"\n\n#. Key:\t254FBEE547ADDFCF33B350B04AE1EE16\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_95.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_95.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"I think I know all about the meaning of life and all, ok? Can we just go on?\"\nmsgstr \"Я думаю, что знаю все о смысле жизни и все такое, ясно? Мы можем просто продолжить?\"\n\n#. Key:\t2671F10D4257D8A3482009A9C042026D\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Hand it over to Raven so he could open the Gate!\"\nmsgstr \"Отдай его Ворону, чтобы он смог открыть Врата!\"\n\n#. Key:\t2845CBE64B1624C7EC4B81BC314B4F1B\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_27.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_27.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"The master gave Raven the ability to think and talk.\"\nmsgstr \"Мастер дал Ворону способность думать и говорить.\"\n\n#. Key:\t29F405BF4233B5A8331B419747954425\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_77.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_77.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Why are you here?\"\nmsgstr \"Зачем ты пришел?\"\n\n#. Key:\t2B5FB92D4F98359F68AD58AB776FD9BA\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_9.SpeechSequence(1).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_9.SpeechSequence(1).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Seeking for knowledge, as always. And you? Never thought we’ll meet again. Still trying to take down these Realms forever?\"\nmsgstr \"Ищу знания, как всегда. А ты? Никогда не думал, что мы встретимся снова. Все еще пытаешься навсегда уничтожить эти Царства?\"\n\n#. Key:\t2B8CF34046D5486EB935CE919A1BD469\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_97.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_97.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"I'm new with all this wizard business thing. What was their conversation about?\"\nmsgstr \"Я новичок в этом волшебном бизнесе. О чем они говорили?\"\n\n#. Key:\t2C15668C26080F0A003A02E7BE7B5A65\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_8.SpeechSequence(1).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_8.SpeechSequence(1).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"It can happen again.\"\nmsgstr \"Это может случиться снова.\"\n\n#. Key:\t2F226AC246B52387854AF5AFA09CEDD6\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_43.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_43.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"So we let those keys behind and set ourselves free from wizards?\"\nmsgstr \"Значит, мы оставим эти ключи позади и освободимся от волшебников?\"\n\n#. Key:\t2FF7B3E84C009ECFDDE9F495092BEAA8\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_9.SpeechSequence(7).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_9.SpeechSequence(7).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"A pleasure to hear that. Talk to Raven about the details. Please excuse me for leaving so early, I have something important to do.\"\nmsgstr \"Рад это слышать. Поговори с Вороном о деталях. Прошу извинить меня что я так рано ухожу, но мне нужно сделать кое-что важное.\"\n\n#. Key:\t305333F348E677D8C3553999F412C8B6\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_36.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_36.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven knows he has different tasks now, compared to what he used to do before.\"\nmsgstr \"Ворон знает, что у него сейчас другие задачи, по сравнению с тем, что он делал раньше.\"\n\n#. Key:\t311A1E3745667AC6B4114D999B0E7C7F\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_83.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_83.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Go now! Raven still needs some more time to think about this.\"\nmsgstr \"Иди же! Ворону еще нужно время, чтобы подумать об этом.\"\n\n#. Key:\t32F0018141E94BDE0921E9A54C1E4F20\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_1.SpeechSequence(0).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_1.SpeechSequence(0).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"They were always like this.\"\nmsgstr \"Они всегда были такими.\"\n\n#. Key:\t34903F43484A4D6CE5735890AEEA294D\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_9.SpeechSequence(5).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_9.SpeechSequence(5).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"The Cerulean Gates are closed again. What if we share the work?\"\nmsgstr \"Лазурные Врата снова закрыты. Что, если мы разделим работу?\"\n\n#. Key:\t350270814B961A20E48267A4B1AE0538\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Yes! The Gem is fully charged!\"\nmsgstr \"Да! Самоцвет полностью заряжен!\"\n\n#. Key:\t361D80AB46AC47E5A233ECA2323222A2\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_86.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_86.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Why are you obeying that wizard of yours?\"\nmsgstr \"Почему ты подчиняешься своему волшебнику?\"\n\n#. Key:\t365EDA2849D42A47D0D26DAC50DA6E94\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven is not that happy with those two, but Raven can accept that he is what he is.\"\nmsgstr \"Ворон не так счастлив с этими двумя, но Ворон может смириться с тем, что он такой, какой он есть.\"\n\n#. Key:\t37C560AB4CCFAF4F8D26FAB1DE22453C\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_63.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_63.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Don't worry. You'll find some purpose.\"\nmsgstr \"Не волнуйся. Ты найдешь какую-нибудь цель.\"\n\n#. Key:\t39DAB8B641C31878F7312FA7807D9DA0\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_6.SpeechSequence(3).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_6.SpeechSequence(3).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"The residents of the Realm did not have to work. Their spirit slaves did everything for them, they accomplished all their desires.\"\nmsgstr \"Жителям Царства не пришлось работать. Их духи-рабы делали все за них, они исполняли все их желания.\"\n\n#. Key:\t3B63606F48193748243DE6AB18D7A68C\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_40.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_40.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven thinks you might want to be something else. Something that you used to be, but you are not anymore.\"\nmsgstr \"Ворон думает, что ты возможно хочешь быть кем-то другим. Кем-то, кем ты был раньше, но больше не являешься.\"\n\n#. Key:\t3C332B1C4ADB3C16C005E8AAF76A09B1\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_109.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_109.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Except...\"\nmsgstr \"Только если...\"\n\n#. Key:\t3C9750814FC56947BDA7DFAF8A71DCC2\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_25.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_25.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"It is a long story and Raven doesn't really like to talk about it.\"\nmsgstr \"Это долгая история, и Ворон не особо любит говорить об этом.\"\n\n#. Key:\t3D10982D4A6FA88941F13F82413D17AC\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_20.Children(0).Children.Text\n#. Key:\t3E117EBB48C1CF091F456CA0FB78EDD7\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_77.Children(0).Children.Text\n#. Key:\t59F0F04941BB918E08743E8A7C3734B2\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_32.Children(6).Children.Text\n#. Key:\t6556945844ED44678075CE8796F00800\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_51.Children(0).Children.Text\n#. Key:\t7EC3944940792EC71B6A2F8674250649\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_49.Children(0).Children.Text\n#. Key:\tC6963EAE43B4D0FD3C8FBAA80A38E2A2\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_83.Children(1).Children.Text\n#. Key:\tE048FA684AA7B8DE0F7273992DA4600E\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_3.Children(4).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_20.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_3.Children(4).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_32.Children(6).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_49.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_51.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_77.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_83.Children(1).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Leave\"\nmsgstr \"Выйти\"\n\n#. Key:\t4417EE084F947AAF5D3285B086F741AC\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven is fine with talking. Ask me whatever you have on your mind!\"\nmsgstr \"Ворон не против поговорить. Спрашивай все, что хочешь!\"\n\n#. Key:\t4485635A4832D9DC57240F8EF3323042\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Very nice! Raven likes that you are making progress.\"\nmsgstr \"Очень хорошо! Ворону нравится, что ты делаешь успехи.\"\n\n#. Key:\t480718E34822FD682466E7B217249ED0\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_47.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_47.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Which is technically the same.\"\nmsgstr \"Что технически одно и то же.\"\n\n#. Key:\t48B67F42417A2930A4D200B958FDFB58\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_38.Children(3).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_38.Children(3).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"I'm confused\"\nmsgstr \"Я озадачен\"\n\n#. Key:\t49F0AC6A46EBF6C3148BC590CE56C297\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_10.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_10.Children(0).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Help\"\nmsgstr \"Попросить помощи\"\n\n#. Key:\t4CB1CE8A4AEC18FA175BA98F831D3C3C\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_59.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_59.Children(0).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Farewell\"\nmsgstr \"До встречи\"\n\n#. Key:\t4D514A7D4CC96E3E79F464A6C0BF0C6E\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_2.SpeechSequence(4).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_2.SpeechSequence(4).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"What??\"\nmsgstr \"Что??\"\n\n#. Key:\t4F8198D64A210B3A41EED8AA6AE64401\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_50.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_50.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven will just sit here for a short time before venturing into the Ruin.\"\nmsgstr \"Ворон просто посидит здесь немного, прежде чем отправится в Руин.\"\n\n#. Key:\t503CD5334EE86CFBEC2E7EA67F45ACD9\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"So you're meant to open this dusty little door with Raven, aren't you?\"\nmsgstr \"Значит, тебе с Вороном суждено открыть эту маленькую пыльную дверь, не так ли?\"\n\n#. Key:\t512AEC2642B36D9DDF407EB447DF5A28\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_15.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_15.Children(1).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Let's have fun!\"\nmsgstr \"Давай повеселимся!\"\n\n#. Key:\t5142E71B48C2E993CC8026919A3FDBD6\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_87.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_87.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Er... okey, I was just asking.\"\nmsgstr \"Э... ладно, я просто спросил.\"\n\n#. Key:\t518038644F25D09C9DA7FF984C272B77\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_40.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_40.Children(1).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"That's stupid\"\nmsgstr \"Глупость какая-то\"\n\n#. Key:\t53B5A1AC40CCF1CFBC106BA2BD8000E0\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_60.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_60.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Farewell, Raven!\"\nmsgstr \"Прощай, Ворон!\"\n\n#. Key:\t54C0F3A6493E6D0671D38DB16BD4BF51\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"I would like to know...\"\nmsgstr \"Я хотел бы знать...\"\n\n#. Key:\t55665725414633C111356D94939362FF\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_67.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_67.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Let's open that gate. Quick!\"\nmsgstr \"Давай откроем эти врата. Скорее!\"\n\n#. Key:\t565D7DA644ADF0E536C2FC8F99B735A3\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_3.Children(2).Children.Text\n#. Key:\t934A23AD44787C735FCDE79A34657C90\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_32.Children(3).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_3.Children(2).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_32.Children(3).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Why is he here?\"\nmsgstr \"Почему он здесь?\"\n\n#. Key:\t57BE04074884DB4CC54AC691E156F0FC\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_38.Children(2).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_38.Children(2).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Freedom\"\nmsgstr \"Свобода\"\n\n#. Key:\t5919EDBF4799413180AF569CB920E436\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_90.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_90.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"You can't live your life like in the old days any longer and that's why you're staying with your master, right?\"\nmsgstr \"Ты не можешь больше жить, как в старые добрые времена, и поэтому ты остался со своим мастером, верно?\"\n\n#. Key:\t592D458F40571927D0BB549F3614420E\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_32.Children(5).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_32.Children(5).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"End of the World\"\nmsgstr \"Конец Света\"\n\n#. Key:\t596065A34760461993AC339C51D9E402\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_73.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_73.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"First you will need to find the Gem. Meanwhile, Raven must figure it out how to open the Gate with it.\"\nmsgstr \"Сначала тебе нужно найти Самоцвет. Тем временем, Ворон должен придумать, как с его помощью открыть Врата.\"\n\n#. Key:\t599A90394B8AC7A26D20FEB355A873FB\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_98.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_98.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"What are you doing here?\"\nmsgstr \"Что ты тут делаешь?\"\n\n#. Key:\t5A5D2F08427C4747F3EF529D6B73A21B\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Go on your search then! Unless you'd like to chat some more with Raven.\"\nmsgstr \"Тогда иди на поиски! Если только ты не хочешь поболтать еще немного с Вороном.\"\n\n#. Key:\t5A63E364458C849C9B6FDD8491427051\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_8.SpeechSequence(5).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_8.SpeechSequence(5).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"But you could.\"\nmsgstr \"Но ты бы мог.\"\n\n#. Key:\t5B07757F4CAAD674E09EBB835CEE230B\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_75.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_75.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"It must be somewhere close to the Arcade.\"\nmsgstr \"Это должно быть где-то рядом с Аркадой.\"\n\n#. Key:\t5B9CDB4340B5E65E59D3A18283A84CA5\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_64.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_64.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven knows some people that'd be glad with that.\"\nmsgstr \"Ворон знает некоторых людей, которые были бы рады этому.\"\n\n#. Key:\t5BA0645E49A62C0945FB64BDF689721F\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_112.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_112.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Is that where I will find your artefacts?\"\nmsgstr \"Там я найду твои артефакты?\"\n\n#. Key:\t5E70951F4E50B061FF2DA196F0207612\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_15.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_15.Children(0).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Save the world!\"\nmsgstr \"Спасти мир!\"\n\n#. Key:\t5F810A7D417E5B02025F30B21FEA5F03\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_79.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_79.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Niiice!\"\nmsgstr \"Отлиииично!\"\n\n#. Key:\t6441F8C2484FAA5219841C9D374F36C4\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_6.SpeechSequence(6).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_6.SpeechSequence(6).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"And now, even while we speak, their curse continues to spread.\"\nmsgstr \"И даже сейчас, пока мы говорим, их проклятие продолжает распространяться.\"\n\n#. Key:\t66A08695458FF9D46383F6A0AF609EFA\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_41.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_41.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"You are so hopeless...\"\nmsgstr \"Ты такой безнадежный...\"\n\n#. Key:\t67EEF3DB42BA2C954AD566B4F95EBDB6\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_6.SpeechSequence(5).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_6.SpeechSequence(5).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Until one day the spirits broke loose and formed Ruin.\"\nmsgstr \"Пока однажды духи не освободились и образовали Руин.\"\n\n#. Key:\t68442CA14CECA9FB8A215EBEBC724F63\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Ask more from Raven if you like!\"\nmsgstr \"Если хочешь, можешь спросить что-то еще у Ворона!\"\n\n#. Key:\t694D416244358BD7DBED04A82390A146\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_51.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_51.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"One more,... and the Gem will be completed!\"\nmsgstr \"Еще один... и “Самоцвет” будет завершен!\"\n\n#. Key:\t6A463E0444754B73FE11988F07D5A58F\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_2.SpeechSequence(1).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_2.SpeechSequence(1).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"You just have to do it.\"\nmsgstr \"Ты просто должен это сделать.\"\n\n#. Key:\t6A92F010409301669F7B83AD7901A469\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"A strange creature, yet a familiar aura! Tell me, my dear Wizard, what happened to Tabby?\"\nmsgstr \"Странное существо, но знакомая аура! Скажи мне, мой дорогой Волшебник, что случилось с Тэбби?\"\n\n#. Key:\t6CC1259244D5FC82CA1C2EA314836741\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_1.SpeechSequence(1).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_1.SpeechSequence(1).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"They both accepted that there is a great threat in this realm.\"\nmsgstr \"Они оба согласились с тем, что в этом царстве существует большая угроза.\"\n\n#. Key:\t6FB7AF774662247E2001F9AAF34FF134\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_111.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_111.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Somewhere beyond that Gate there's a Portal. It will take you into the heart of the Realm.\"\nmsgstr \"Где-то за этими Вратами есть портал. Он перенесет тебя в сердце Царства.\"\n\n#. Key:\t70A0BA47476A909013EFC0A574815B61\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_23.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_23.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"The Master and Raven are seeking knowledge about the Ruined Realm.\"\nmsgstr \"Мастер и Ворон ищут новые сведенья о Разрушенном Царстве.\"\n\n#. Key:\t70ECE1B74BA0B02F2F0850937BF4FB02\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_3.Children(3).Children.Text\n#. Key:\tE9F5916345156A4E5F29AC886B49B8AD\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_32.Children(4).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_3.Children(3).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_32.Children(4).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"About Ruin\"\nmsgstr \"О Руине\"\n\n#. Key:\t7311CA4B4D6B19C6C5C362AF522A9803\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_1.SpeechSequence(4).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_1.SpeechSequence(4).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Your master said he is done with that.\"\nmsgstr \"Твой мастер сказал, что с этим покончено.\"\n\n#. Key:\t74B8E0B44D4590E9970F4B9D09D3C4F9\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_6.SpeechSequence(1).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_6.SpeechSequence(1).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Long ago it was called the Runic Realm.\"\nmsgstr \"Давным-давно это называлось Руническим царством.\"\n\n#. Key:\t76756B1C48E93E907CE32D83A2C56C3E\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_7.SpeechSequence(0).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_7.SpeechSequence(0).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven is really sorry but he can't help you anymore.\"\nmsgstr \"Ворон очень сожалеет, но он больше не может тебе помочь.\"\n\n#. Key:\t78C7CE5948D176704CA69289BEEBFBA7\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_44.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_44.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"And what about the Realm of the wizards? They did not go mad yet, did they?\"\nmsgstr \"А как же Царство Волшебников? Они ведь еще не сошли с ума?\"\n\n#. Key:\t7DFA4D494BD0536F925A94BBF7C71F36\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_66.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_66.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Focus on what you have to do and you will find the real you.\"\nmsgstr \"Сосредоточься на том, что ты должен сделать, и ты найдешь настоящего себя.\"\n\n#. Key:\t81F437694DEE3D32A0FC29B90688E8B9\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_38.Children(4).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_38.Children(4).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"This is stupid\"\nmsgstr \"Глупость какая-то\"\n\n#. Key:\t82F473A04D250E98AD186185EBE95C04\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_5.SpeechSequence(0).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_5.SpeechSequence(0).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven thinks freedom is such an empty word.\"\nmsgstr \"Ворон думает, что свобода - это такое пустое слово.\"\n\n#. Key:\t8688802A4303C53640C7BFAAA40226EC\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Almost there!\"\nmsgstr \"Почти готово!\"\n\n#. Key:\t8728C02E46E7B681D0A792ACAFC3237D\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_28.Children(2).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_28.Children(2).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"He accepted his fate\"\nmsgstr \"Он смирился со своей судьбой\"\n\n#. Key:\t8854653141FA36E731780F9111B82FAD\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_30.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_30.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"You are not listening to Raven's words!\"\nmsgstr \"Ты не слушаешь слов Ворона!\"\n\n#. Key:\t88FDA06B4A44ED1BF559D996E6AF7097\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_6.SpeechSequence(0).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_6.SpeechSequence(0).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Even so, Raven will tell you a bit.\"\nmsgstr \"Тем не менее, Ворон расскажет тебе немного.\"\n\n#. Key:\t8BA584404F2713EE39D74284F829C50A\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"You know what? Raven totally agrees with that!\"\nmsgstr \"Знаешь что? Ворон полностью с тобой согласен!\"\n\n#. Key:\t8C272FBE47796CF8101D07AAD033C24B\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_62.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_62.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"The later we met the more time the World survived, didn't it?\"\nmsgstr \"Не будет ли означать что, чем дольше мы не увидимся, тем больше времени проживет мир?\"\n\n#. Key:\t8DD39A3D497411B348B883972CE6B442\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_6.SpeechSequence(7).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_6.SpeechSequence(7).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"At first, lands lose their colours, people go mad... and then, everything breaks into shards until solely hollowness remains...\"\nmsgstr \"Вначале земли теряют свой цвет, люди сходят с ума... а потом все разбивается на осколки, пока не останется одна лишь пустота...\"\n\n#. Key:\t8E02961D428949EE8176639F6AE84DD9\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_107.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_107.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"If the end is near, there is no point in making long term plans.\"\nmsgstr \"Если конец близок, то нет смысла строить долгосрочные планы.\"\n\n#. Key:\t8EB8F2654B9C18135CBEB49D10485417\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_37.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_37.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"We all have a purpose in life.\"\nmsgstr \"У всех нас есть цель в жизни.\"\n\n#. Key:\t9131DE4C434AD9B22C7B1BAA588AF694\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_9.SpeechSequence(3).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_9.SpeechSequence(3).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Private business? All right! We might have different motivations, however working together could be fruitful.\"\nmsgstr \"Для частного бизнеса? Ну ладно! У нас могут быть разные мотивы, но совместная работа может быть плодотворной.\"\n\n#. Key:\t91947E4046F96E9330EA5A94C367E2C5\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Forget it, I'm on my way now.\"\nmsgstr \"Забудь, я уже ухожу.\"\n\n#. Key:\t91BE2C7248B2BEBE1C376B989935E353\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"What else should Raven tell you?\"\nmsgstr \"Что еще Ворон должен тебе рассказать?\"\n\n#. Key:\t929558D0465B0884C4E373A602CCE9E5\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_59.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_59.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Farewell compeer until you meet Raven again!\"\nmsgstr \"Прощай, пока не встретишь Ворона вновь!\"\n\n#. Key:\t930942934A83107D86DB69A2C2EF11E0\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_117.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_117.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"The task is of high complexity.\"\nmsgstr \"Задача не из легких.\"\n\n#. Key:\t93AFC24842A793D2BF7B43A64B6972AF\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_32.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_32.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Is there anything else for Raven?\"\nmsgstr \"Есть какие-либо еще вопросы для Ворона?\"\n\n#. Key:\t9A9D5DA346251040AF73B7B100E1EBC9\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_35.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_35.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven used to like being a bird, but now he has no other choice. He must embrace what he became.\"\nmsgstr \"Раньше Ворону нравилось быть птицей, но теперь у него нет другого выбора. Он должен принять то, кем он стал.\"\n\n#. Key:\t9B558C3045D4501AEAF3DD8694E2198F\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_105.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_105.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"We'd rather have some fun before it's all over.\"\nmsgstr \"Нам лучше повеселиться, перед тем как все закончится.\"\n\n#. Key:\t9E598A384E301BCD345ABFB0C1312C12\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_78.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_78.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Krrr... Raven notices that you've found the Gem!\"\nmsgstr \"Каррр... Ворон видит, что ты уже нашел Самоцвет!\"\n\n#. Key:\t9FAD3A1A4E3EFE33C1CAB8BAAC8190D1\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_26.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_26.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Let Raven tell you something:\"\nmsgstr \"Позволь Ворону кое-что тебе рассказать:\"\n\n#. Key:\tA10F960549BD21AFAD4819BD5C74E651\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_2.SpeechSequence(5).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_2.SpeechSequence(5).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Nevermind. Raven is kidding.\"\nmsgstr \"Неважно. Ворон шутит.\"\n\n#. Key:\tA4294A174F9EA54E0149839A84CE2B94\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_15.Children(2).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_15.Children(2).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Hopeless...\"\nmsgstr \"Безнадежно...\"\n\n#. Key:\tA59406E8411939F96004EAA9D5707E08\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_28.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_28.Children(1).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"What?\"\nmsgstr \"Что?\"\n\n#. Key:\tA5993D8047CDD35BA31D318832EB9C66\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_32.Children(2).Children.Text\n#. Key:\tB7AE6BEC4CA905BDED5990BFF4D0C93D\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_3.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_3.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_32.Children(2).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"About wizards\"\nmsgstr \"О волшебниках\"\n\n#. Key:\tA59A76814D8EAF5907CBC68AA63FE33F\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_2.SpeechSequence(3).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_2.SpeechSequence(3).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"How can I know that if you don't do it?\"\nmsgstr \"Откуда мне это знать, если ты этого не сделаешь?\"\n\n#. Key:\tA7C7D1EC45A072755BAAB099DB359290\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_55.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_55.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"They don't believe that Ruin can affect their World. They say that it has no effect.\"\nmsgstr \"Они не верят, что Руин может повлиять на их мир. Они говорят, что он не имеет никакого эффекта.\"\n\n#. Key:\tA7D99136490D40CB08BA66A72192D6C0\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_7.SpeechSequence(2).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_7.SpeechSequence(2).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Go now! Raven needs to think.\"\nmsgstr \"Иди же! Ворону нужно подумать.\"\n\n#. Key:\tA80B626C41713C6E42E4DF8696FF842D\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_8.SpeechSequence(0).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_8.SpeechSequence(0).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"You were a bird once. Then you became something else.\"\nmsgstr \"Когда-то ты была птицей. Потом ты стал кем-то другим.\"\n\n#. Key:\tA8D429384EFE74E30720149A1C53ADE9\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_38.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_38.Children(0).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Don't know\"\nmsgstr \"Не знаю\"\n\n#. Key:\tA9A73720489C122A81B84CBA262C329E\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_38.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_38.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven knows what his task is. Do you know yours?\"\nmsgstr \"Ворон знает, какова его задача. А знаешь ли ты свою?\"\n\n#. Key:\tAB41A75C432BEBDC81D63282FCC15F98\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_5.SpeechSequence(2).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_5.SpeechSequence(2).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Got it? Free like a bird! Ha-ha-ha!\"\nmsgstr \"Понял? Свободен, как птица! Ха-ха-ха!\"\n\n#. Key:\tAC52327249DB335CBAB9EDA6A3F4769E\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_31.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_31.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven is doing this because this is what he is.\"\nmsgstr \"Ворон делает это, потому что это то, что он есть.\"\n\n#. Key:\tB2003CEE44335B30B9F85487521B7679\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_54.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_54.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Maybe.\"\nmsgstr \"Возможно.\"\n\n#. Key:\tB31EEC6247CDEF73BB4E5B84E2B66575\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_9.SpeechSequence(2).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_9.SpeechSequence(2).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"That’s over now. This time it's for private business.\"\nmsgstr \"Это уже позади. На этот раз это для частного бизнеса.\"\n\n#. Key:\tB3DD59C44422BA99C839FCAE63F05B9A\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_93.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_93.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"I want to be free again!\"\nmsgstr \"Я хочу снова быть свободным!\"\n\n#. Key:\tB789219A48C2A835F2DA4CA24064E1D3\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_92.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_92.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"I would like to go home.\"\nmsgstr \"Я хотел бы пойти домой.\"\n\n#. Key:\tB7D4201F41E5F018EFD49EAF52E443A8\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_76.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_76.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"You still haven't found the Gem.\"\nmsgstr \"Ты все еще не нашел Самоцвет.\"\n\n#. Key:\tB7EC6E4F4EDC448FD264999938414F3C\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Let's talk about something else!\"\nmsgstr \"Давай поговорим о чем-нибудь другом!\"\n\n#. Key:\tB8BF08674C9E2FD0515998B95A1EA7CF\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_7.SpeechSequence(1).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_7.SpeechSequence(1).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"If you can't fulfill your task, then maybe your master should look for a better servant.\"\nmsgstr \"Если ты не можешь выполнить свою задачу, то, возможно, твоему мастеру стоит поискать кого-нибудь получше.\"\n\n#. Key:\tBD775EF74E334A4DEFA67BBF9034500E\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_84.Text\n#. Key:\tFA3FEF444FD2A3500FCCE98FAEAE923E\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_42.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_42.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_84.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Yes?\"\nmsgstr \"Да?\"\n\n#. Key:\tBE2B9D7A45C2D43FF4C0BAAA284CBB97\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"No thanks! I'm on my way now.\"\nmsgstr \"Нет, спасибо! Я уже ухожу.\"\n\n#. Key:\tC04CC9334FC3C2522793C2B97CC165D8\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_108.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_108.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"The gate is open!\"\nmsgstr \"Врата открыты!\"\n\n#. Key:\tC0F2E4744D724A3D6A0DEF914C294CE1\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_38.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_38.Children(1).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Go home\"\nmsgstr \"Вернуться домой\"\n\n#. Key:\tC10018654B64193BBFF439B54EF02FB1\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"So why not open the gate?\"\nmsgstr \"Так почему бы не открыть врата?\"\n\n#. Key:\tC18E2FB345BE76B6F51C71A2B6453316\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_99.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_99.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"What can you tell me about the Ruined Realm?\"\nmsgstr \"Что ты можешь рассказать о Разрушенном Царстве?\"\n\n#. Key:\tC19082D247C23A21B632968FE6A644D1\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_8.SpeechSequence(3).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_8.SpeechSequence(3).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"You failed to see the meaning behind Raven's thoughts.\"\nmsgstr \"Ты не смог понять суть мыслей Ворона.\"\n\n#. Key:\tC2DC44084098DD604B757A8A47AAC4FE\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_58.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_58.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"We'll see.\"\nmsgstr \"Посмотрим.\"\n\n#. Key:\tC53F5E0F46BBE7A1FD00EABD6E14848D\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_33.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_33.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Maybe you are wiser than Raven, but that's just a thought, little spirit.\"\nmsgstr \"Может, ты и мудрее Ворона, но это всего лишь мысль, маленький дух.\"\n\n#. Key:\tC78588B64D12FFBE97C47AB7C046C14E\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_1.SpeechSequence(5).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_1.SpeechSequence(5).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven doesn't believe it's true.\"\nmsgstr \"Ворон не верит в это.\"\n\n#. Key:\tC7F7F71F4FE0D19BDF86188BEFDDEEB1\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_5.SpeechSequence(1).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_5.SpeechSequence(1).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Just look at Raven! He's free like a bird.\"\nmsgstr \"Только взгляни на Ворона! Он свободен, как птица.\"\n\n#. Key:\tC82BE6E448D7C98D361CA1890FEE3B2C\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_9.SpeechSequence(6).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_9.SpeechSequence(6).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"I’m in.\"\nmsgstr \"Я согласен.\"\n\n#. Key:\tCD1A68EF460B0C63C95340AC2076EBAF\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven notices that the gem is just as dull as before. Why did you return then?\"\nmsgstr \"Ворон видит, что самоцвет такой же тусклый, как и раньше. Тогда зачем ты вернулся?\"\n\n#. Key:\tD3C84C884903F7FB53695AAE253C7982\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_40.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_40.Children(0).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Agree\"\nmsgstr \"Согласиться\"\n\n#. Key:\tD438ABB348A399ACB18DFD8F320CC7BB\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_57.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_57.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"And what's the truth?\"\nmsgstr \"И в чем же правда?\"\n\n#. Key:\tD5DF32814FA17D7ED28BF0A91027A6E8\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_110.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_110.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Finally! From now on you won't need Raven anymore.\"\nmsgstr \"Наконец-то! Отныне тебе больше не понадобится Ворон.\"\n\n#. Key:\tD6A649B2453BCBAD95A16FA481664133\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_49.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_49.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Find the other Chargers and return to Raven when you are done.\"\nmsgstr \"Найди другие Зарядные Устройства и вернись к Ворону, когда закончишь.\"\n\n#. Key:\tD9959CF1439812F5615A38B9369F6E16\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_71.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_71.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven notices that you already have the Gem.\"\nmsgstr \"Ворон видит, что Самоцвет у тебя уже есть.\"\n\n#. Key:\tD9A4F3D54EF460C09B2A6C9B8EB87D7C\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_32.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_32.Children(1).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"About my purpose...\"\nmsgstr \"О моей цели...\"\n\n#. Key:\tD9C6F8C14BC9C0BD83715E96DE5B7161\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_28.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_28.Children(0).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"He is a volunteer\"\nmsgstr \"Он волонтёр\"\n\n#. Key:\tDC7CA6DF4D684A7C2DBA739F404ABC36\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_94.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_94.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"I don't know what to do. I can't remember anything from my previous life.\"\nmsgstr \"Я не знаю, что мне делать. Я ничего не помню из своей прошлой жизни.\"\n\n#. Key:\tDD8E05E541C32F05357D888FB6963FF0\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_114.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_114.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"All right, I go then.\"\nmsgstr \"Ладно, тогда я пойду.\"\n\n#. Key:\tDE3A0B8047C9980B6DED0BA39C777539\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_28.Children(3).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_28.Children(3).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Not interested\"\nmsgstr \"Не интересует\"\n\n#. Key:\tDF86F9C84CF207616E931098F3C833D3\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"To activate the locking mechanism we need an infused Lock Gem.\"\nmsgstr \"Чтобы активировать механизм блокировки, нам нужен заряженный Блокирующий Камень.\"\n\n#. Key:\tE0105C1845AF9211960E869AB234ED9A\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_89.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_89.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"So you are obeying because... that's the only thing that you can do?\"\nmsgstr \"Так ты подчиняешься, потому что... это единственное, что ты можешь делать?\"\n\n#. Key:\tE17598BB49D7E4083AD4AEA2DDFE293D\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_106.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_106.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"It would make sense to try to save the world, wouldn't it?\"\nmsgstr \"Было бы разумно попытаться спасти мир, не так ли?\"\n\n#. Key:\tE1CFA5A44F4EF59527528DB6018ACF33\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_8.SpeechSequence(6).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_8.SpeechSequence(6).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven doesn't care about what he could do. Raven cares about what he does.\"\nmsgstr \"Ворона не волнует, что он может сделать. Ворона волнует то, что он делает.\"\n\n#. Key:\tE6FA584E454BC3943C927EADAEBA88C4\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_6.SpeechSequence(8).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_6.SpeechSequence(8).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"That's not too reassuring...\"\nmsgstr \"Это не очень-то обнадёживает...\"\n\n#. Key:\tE9D9EC1F450276CF11B259978062AB7E\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_96.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_96.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"We shouldn't waste any more time on this.\"\nmsgstr \"Мы не должны больше тратить на это время.\"\n\n#. Key:\tEC19AF0E4F2F4B488373FFBEDC272321\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_56.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_56.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Except for a few paranoid ones, like your master.\"\nmsgstr \"За исключением нескольких параноиков, вроде твоего мастера.\"\n\n#. Key:\tEFC8B9984D9F4A9ACC9AE580E271E810\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_39.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_39.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Searching for a way to open this gate with the help of a talking Ball is so much fun!\"\nmsgstr \"Искать способ открыть эти врата с помощью говорящего Шара - это так весело!\"\n\n#. Key:\tEFCE20A646FA62188BE7EB85D6708843\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_115.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_115.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven will venture deeper into the Ruined Realm!\"\nmsgstr \"Ворон отправится в глубь Разрушенного Царства!\"\n\n#. Key:\tF0B00A30413914D09CA4488578B2FD7C\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_24.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_24.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven agrees.\"\nmsgstr \"Ворон согласен.\"\n\n#. Key:\tF40AD31D4177DCB7BB138C9C139FB1A1\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_61.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_61.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"I hope that won't be too soon...\"\nmsgstr \"Надеюсь, это будет не очень скоро...\"\n\n#. Key:\tF4F8CBCD421083EDBF626AA47DEF4B50\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_88.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_88.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Do you mean that you are serving your wizard by your own will?\"\nmsgstr \"Ты хочешь сказать, что служишь своему волшебнику по доброй воле?\"\n\n#. Key:\tF5A7836549DF56B89620A386E7CCF708\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_48.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_48.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"But there is still so much left to do...\"\nmsgstr \"Но еще столько всего осталось сделать...\"\n\n#. Key:\tF8361ECC401E740DEBF87FAE2A419EC8\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_32.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_32.Children(0).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven Servant?\"\nmsgstr \"Ворон Слуга?\"\n\n#. Key:\tFA5F957341772B0C4AFA33B1311CF7B4\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_69.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_69.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Except if we meet in the Afterworld.\"\nmsgstr \"Только если мы не встретимся в загробном мире.\"\n\n#. Key:\tFA94A8EF4F8BF5EA422D27A9A205D866\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_3.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_3.Children(0).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven servant?\"\nmsgstr \"Ворон слуга?\"\n\n#. Key:\tFC0798A648BFC0E9BA70D6B20A46F447\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_1.SpeechSequence(2).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_1.SpeechSequence(2).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Your master seeks to stop it no matter the price he has to pay.\"\nmsgstr \"Твой мастер стремится остановить ее, независимо от того, какую цену он должен будет заплатить.\"\n\n#. Key:\tFCE7049641D2A70FC6B9E5B174919A64\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_9.SpeechSequence(0).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_9.SpeechSequence(0).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Tabby has retired. What did you come for?\"\nmsgstr \"Тэбби ушел в отставку. Зачем ты пришел?\"\n\n#. Key:\tFD68B18A435050A137D8F0948F24E2DC\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Why are we messing with this door if the World is about to end?\"\nmsgstr \"Почему мы возимся с этой дверью, если миру вот-вот придет конец?\"\n\n#. Key:\tFF3D9FCF4A840A8155A8D7AD9CC22F2D\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Obey? Raven doesn't obey.\"\nmsgstr \"Подчиняться? Ворон не подчиняется.\"\n\n#. Key:\tFFB203D94B0A5C22BA29B68A1A8A740F\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_9.SpeechSequence(8).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_9.SpeechSequence(8).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Farewell then.\"\nmsgstr \"Тогда, до встречи.\"\n\n#. Key:\t0C459FB64505D02011822A9EDFA8FCA4\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/AGStatue.AGStatue:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/AGStatue.AGStatue:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_AGStatue\"\nmsgid \"'We are the elite of the Runic Realm. Our wisdom is great, our magic is strong.'\"\nmsgstr \"“Мы - элита Рунического царства. Наша мудрость велика, наша магия сильна”.\"\n\n#. Key:\t7DB580C64E9B33FD525DDF986BD5E4A4\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/AGStatue.AGStatue:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/AGStatue.AGStatue:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_AGStatue\"\nmsgid \"Looks like he was wrong...\"\nmsgstr \"Похоже, он ошибся...\"\n\n#. Key:\tAFBD86084D8E6EBDF240998FA98D184D\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/AGStatue.AGStatue:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/AGStatue.AGStatue:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_AGStatue\"\nmsgid \"'We are Ceruleans! We do not escape!'\"\nmsgstr \"“Мы - Лазурчане! Мы не сбежим!”\"\n\n#. Key:\tC2CC8EE94954A8DC42222FBB28A7656E\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/AGStatue.AGStatue:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/AGStatue.AGStatue:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_AGStatue\"\nmsgid \"'Citizens of Cerulean! Do not join the poor of Grey Gate!'\"\nmsgstr \"“Граждане Лазурного города”! Не присоединяйтесь к беднякам Серых Ворот!\"\n\n#. Key:\tD909E4A34387B448378464BDE8292B4D\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/AGStatue.AGStatue:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/AGStatue.AGStatue:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_AGStatue\"\nmsgid \"'Ruin can’t harm us!'\"\nmsgstr \"“Руин не может нам навредить!”\"\n\n#. Key:\t3CE243AA4AFB12B37239608C66537764\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/BeforeBoss.BeforeBoss:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/BeforeBoss.BeforeBoss:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_BeforeBoss\"\nmsgid \"Maybe you should talk to the gnome or the Keeper.\"\nmsgstr \"Может, тебе стоит поговорить с гномом или Хранителем.\"\n\n#. Key:\t4F35F4834FBCC04C218A879123EF8706\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/BeforeBoss.BeforeBoss:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/BeforeBoss.BeforeBoss:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_BeforeBoss\"\nmsgid \"Using the portals here one could get into any part of the World in no time.\"\nmsgstr \"С помощью этих порталов можно быстро попасть в любую точку мира.\"\n\n#. Key:\t62EDCB724DAC5317C72B99AEB9904F4E\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/BeforeBoss.BeforeBoss:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/BeforeBoss.BeforeBoss:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_BeforeBoss\"\nmsgid \"This place was the base of the formal Ruined Realm.\"\nmsgstr \"Это место было основой Разрушенного Царства.\"\n\n#. Key:\tCB8B47F74583A48529A353B97C4909B9\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/BeforeBoss.BeforeBoss:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/BeforeBoss.BeforeBoss:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_BeforeBoss\"\nmsgid \"I hope at least some of the portals still work.\"\nmsgstr \"Надеюсь, хотя бы некоторые порталы все еще работают.\"\n\n#. Key:\t2A9CE8714E7E1ABC9365E5A1E2CE2EC8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/BossArmourWrath.BossArmourWrath:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Chapter2/BossArmourWrath.BossArmourWrath:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_BossArmourWrath\"\nmsgid \"Keep away from my artefact little thief or I will crush you!\"\nmsgstr \"Держись подальше от моего артефакта, маленький воришка, или я раздавлю тебя!\"\n\n#. Key:\t3F79029C410F4CC3B41548A26A7D69EB\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/BossArmourWrath.BossArmourWrath:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Chapter2/BossArmourWrath.BossArmourWrath:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_BossArmourWrath\"\nmsgid \"Listen, I really need that. What if I give you something instead?\"\nmsgstr \"Слушай, мне он очень нужен. Что если я дам тебе что-нибудь взамен?\"\n\n#. Key:\t451F1E844E29E674899BD3BEFBC17380\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/BossArmourWrath.BossArmourWrath:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter2/BossArmourWrath.BossArmourWrath:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_BossArmourWrath\"\nmsgid \"I’m here for the artefact... could you give it to me?\"\nmsgstr \"Я пришёл за артефактом... не мог бы ты отдать его мне?\"\n\n#. Key:\tAC11C22040909F7F4DD1518AD5C14AFA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/BossArmourWrath.BossArmourWrath:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Chapter2/BossArmourWrath.BossArmourWrath:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_BossArmourWrath\"\nmsgid \"That is mine!\"\nmsgstr \"Он мой!\"\n\n#. Key:\tD30E184A406B5B1EFB87F3845CE82664\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/BossArmourWrath.BossArmourWrath:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter2/BossArmourWrath.BossArmourWrath:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_BossArmourWrath\"\nmsgid \"Have you come to worship my perfection?\"\nmsgstr \"Ты пришел поклониться моему совершенству?\"\n\n#. Key:\tF626219F434EECD05727BC9FAB5CEB76\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/BossArmourWrath.BossArmourWrath:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Chapter2/BossArmourWrath.BossArmourWrath:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_BossArmourWrath\"\nmsgid \"Damn you and your perfection!\"\nmsgstr \"Чёрт бы тебя побрал и твоё совершенство тоже!\"\n\n#. Key:\t2892C4AB4DACCAF48565619948DCA122\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/BossDwarvenStatue.BossDwarvenStatue:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter2/BossDwarvenStatue.BossDwarvenStatue:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_BossDwarvenStatue\"\nmsgid \"I am all right! I am still keeping it back!\"\nmsgstr \"Я в порядке! Я все еще держу его!\"\n\n#. Key:\t378D26B144B4B17F23F788B56F714118\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/BossDwarvenStatue.BossDwarvenStatue:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Chapter2/BossDwarvenStatue.BossDwarvenStatue:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_BossDwarvenStatue\"\nmsgid \"I am looking for an artefact...\"\nmsgstr \"Я ищу артефакт...\"\n\n#. Key:\t3956257F405EC80CE4547FBE57C53A11\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/BossDwarvenStatue.BossDwarvenStatue:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Chapter2/BossDwarvenStatue.BossDwarvenStatue:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_BossDwarvenStatue\"\nmsgid \"Do you...\"\nmsgstr \"Ты зна...\"\n\n#. Key:\t946CFCCE4CA505C7C4039A9FF196A35C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/BossDwarvenStatue.BossDwarvenStatue:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter2/BossDwarvenStatue.BossDwarvenStatue:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_BossDwarvenStatue\"\nmsgid \"Have the sculptors sent you?\"\nmsgstr \"Тебя прислали скульпторы?\"\n\n#. Key:\tA30FB80548251020E4AD859A928AB6B5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/BossDwarvenStatue.BossDwarvenStatue:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Chapter2/BossDwarvenStatue.BossDwarvenStatue:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_BossDwarvenStatue\"\nmsgid \"Go away! I hold it back!\"\nmsgstr \"Уходи! Я держу его!\"\n\n#. Key:\tAC5220964331387202C55584104246C2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/BossDwarvenStatue.BossDwarvenStatue:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Chapter2/BossDwarvenStatue.BossDwarvenStatue:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_BossDwarvenStatue\"\nmsgid \"I have a bad feeling about this...\"\nmsgstr \"Что-то у меня плохое предчувствие...\"\n\n#. Key:\tE05C384043C6F8407BDA2D97A1D64F96\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/BossDwarvenStatue.BossDwarvenStatue:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Chapter2/BossDwarvenStatue.BossDwarvenStatue:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_BossDwarvenStatue\"\nmsgid \"He has one of the artefacts. You need to get it somehow.\"\nmsgstr \"У него есть один из артефактов. Тебе нужно как-то его взять.\"\n\n#. Key:\tF9B8F4E9413785B5F59DD88CBF8D56CC\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/BossDwarvenStatue.BossDwarvenStatue:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Chapter2/BossDwarvenStatue.BossDwarvenStatue:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_BossDwarvenStatue\"\nmsgid \"Don’t come any closer! I’m still fine!\"\nmsgstr \"Не приближайся! Я все еще в порядке!\"\n\n#. Key:\t49D7B5DA484C712573AE84B3A2609541\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/BossFallenDruid.BossFallenDruid:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Chapter2/BossFallenDruid.BossFallenDruid:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_BossFallenDruid\"\nmsgid \"You will never lay your hand on anything in this place!\"\nmsgstr \"Ты никогда ни к чему не прикоснешься в этом месте!\"\n\n#. Key:\t9642DD9241E67544571A5EABA9EBC42B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/BossFallenDruid.BossFallenDruid:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter2/BossFallenDruid.BossFallenDruid:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_BossFallenDruid\"\nmsgid \"Actually I’m about to leave but I need the artefact first.\"\nmsgstr \"Вообще-то, я собираюсь уходить, но сначала мне нужен артефакт.\"\n\n#. Key:\t9A2BE08D4010C4D2425F96BA17A60936\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/BossFallenDruid.BossFallenDruid:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Chapter2/BossFallenDruid.BossFallenDruid:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_BossFallenDruid\"\nmsgid \"I shall purge my forest from your kind! To hell with you creature!\"\nmsgstr \"Я очищу свой лес от таких, как ты! К чёрту тебя, чудище!\"\n\n#. Key:\tFC4A1C9748C31BD2AA2E4F93E5D56AF8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/BossFallenDruid.BossFallenDruid:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter2/BossFallenDruid.BossFallenDruid:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_BossFallenDruid\"\nmsgid \"Stay away from my sacred forests creature of Ruin!\"\nmsgstr \"Создание Руина, держись подальше от моих священных лесов!\"\n\n#. Key:\t3F4302BF46D1F9EA241446A796CE6AA5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Fishy.C3Fishy:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter3/C3Fishy.C3Fishy:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_C3Fishy\"\nmsgid \"Fishy will miss home.\"\nmsgstr \"Фиши будет скучать по дому.\"\n\n#. Key:\t52063C724F858E16B1E9B482E064B3FC\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Fishy.C3Fishy:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/Chapter3/C3Fishy.C3Fishy:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_C3Fishy\"\nmsgid \"Raven will try to take us into the Human Realm.\"\nmsgstr \"Ворон попытается отвести нас в Человеческое Царство.\"\n\n#. Key:\tBC79FC4E44CCD0BE44BAAAA5ED304C9D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3GateKeeper.C3GateKeeper:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Chapter3/C3GateKeeper.C3GateKeeper:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_C3GateKeeper\"\nmsgid \"I hope you will find us Worthy.\"\nmsgstr \"Надеюсь, ты найдешь нас Достойными.\"\n\n#. Key:\tDD8DEA6B4E1D6AABEB6B0483614A41BB\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3GateKeeper.C3GateKeeper:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter3/C3GateKeeper.C3GateKeeper:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_C3GateKeeper\"\nmsgid \"Welcome, my young Lord!\"\nmsgstr \"Добро пожаловать, юный лорд!\"\n\n#. Key:\tFCC28D1C4A19B1964301B388625A722F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3GateKeeper.C3GateKeeper:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter3/C3GateKeeper.C3GateKeeper:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_C3GateKeeper\"\nmsgid \"I heard this time you shall open a Gate for us.\"\nmsgstr \"Я слышал, на этот раз ты откроешь нам Врата.\"\n\n#. Key:\t1F96C2364594513AB8DF00A8C11ADB2C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Gnory.C3Gnory:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Chapter3/C3Gnory.C3Gnory:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_C3Gnory\"\nmsgid \"I don’t want anything bad for business in the new Realm.\"\nmsgstr \"Я же не хочу ничего плохого для своего бизнеса в новом Царстве.\"\n\n#. Key:\t24FA4B6840C3EEF0A9D418AED7C900A5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Gnory.C3Gnory:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/Chapter3/C3Gnory.C3Gnory:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_C3Gnory\"\nmsgid \"Eh, you again?\"\nmsgstr \"А, опять ты?\"\n\n#. Key:\t5CA8478D46ED1ADF6F0B5E82F1035ADE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Gnory.C3Gnory:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter3/C3Gnory.C3Gnory:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_C3Gnory\"\nmsgid \"A whole new World awaits for me and my shop.\"\nmsgstr \"Совершенно новый мир ждет меня и мой магазин.\"\n\n#. Key:\tA406AFAD47000D9338C978B2EB16A86F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Gnory.C3Gnory:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Chapter3/C3Gnory.C3Gnory:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_C3Gnory\"\nmsgid \"If you can arrange it I would be more happy if we could leave Lory here.\"\nmsgstr \"Если ты сможешь это устроить, я буду еще счастливее, если мы оставим Лори здесь.\"\n\n#. Key:\tBA4D0C244931E6431FA17CA2257BDDE1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Gnory.C3Gnory:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter3/C3Gnory.C3Gnory:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_C3Gnory\"\nmsgid \"What a new opportunity! I don’t care about dwarves anymore.\"\nmsgstr \"Какая прекрасная возможность! Меня больше не волнуют гномы.\"\n\n#. Key:\t071AC5EE4AC65F5BE3CB61B64DE9E7FE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3GolemMaker.C3GolemMaker:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter3/C3GolemMaker.C3GolemMaker:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_C3GolemMaker\"\nmsgid \"I have to admit Ruin will win in the end.\"\nmsgstr \"Я должен признать, Руин в итоге выиграет.\"\n\n#. Key:\t18398E3A4C6E72AAE25F24A14596ECD8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3GolemMaker.C3GolemMaker:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter3/C3GolemMaker.C3GolemMaker:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_C3GolemMaker\"\nmsgid \"I fought Ruin for hundreds of years.\"\nmsgstr \"Я боролся с Руином сотни лет.\"\n\n#. Key:\t7800D3B64054BCE4A89E8E8E6265776B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3GolemMaker.C3GolemMaker:DlgNode_Speech_117.Text\n#: /Game/SO/Dialogues/Chapter3/C3GolemMaker.C3GolemMaker:DlgNode_Speech_117.Text\nmsgctxt \"Dialogue_C3GolemMaker\"\nmsgid \"I have a bad feeling about this all...\"\nmsgstr \"У меня плохое предчувствие по поводу всего этого...\"\n\n#. Key:\t334B64FA460A74FD99B4F3B9E4BE9E5A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3KoboldChef.C3KoboldChef:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter3/C3KoboldChef.C3KoboldChef:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_C3KoboldChef\"\nmsgid \"So it will be ready anytime now.\"\nmsgstr \"Так что он будет готов в любое время.\"\n\n#. Key:\t5B8874F14160F55182A93EBCF5680173\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3KoboldChef.C3KoboldChef:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter3/C3KoboldChef.C3KoboldChef:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_C3KoboldChef\"\nmsgid \"According to the recipe I need to swirl the ingredients until the end of the World.\"\nmsgstr \"Согласно рецепту, мне нужно размешивать ингредиенты до самого конца света.\"\n\n#. Key:\t7DB6ED344E211B7A028C27BFB72750B1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3KoboldChef.C3KoboldChef:DlgNode_Speech_33.Text\n#: /Game/SO/Dialogues/Chapter3/C3KoboldChef.C3KoboldChef:DlgNode_Speech_33.Text\nmsgctxt \"Dialogue_C3KoboldChef\"\nmsgid \"This is a special soup.\"\nmsgstr \"Это особый суп.\"\n\n#. Key:\t7D583DB14783DCF7EEE294920F9A1D61\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Lory.C3Lory:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Chapter3/C3Lory.C3Lory:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_C3Lory\"\nmsgid \"Without paying a single gold coin. How sad.\"\nmsgstr \"Не заплатив ни одной золотой монеты. Как печально.\"\n\n#. Key:\t8A26C9B24B810A94FED159B0D69D70D6\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Lory.C3Lory:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter3/C3Lory.C3Lory:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_C3Lory\"\nmsgid \"Hi, my dear Ball!\"\nmsgstr \"Привет, мой милый Шар!\"\n\n#. Key:\t8CF637DC4D66B9BFBE098DA3EA434F27\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Lory.C3Lory:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/Chapter3/C3Lory.C3Lory:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_C3Lory\"\nmsgid \"Unfortunately I can't give you anything in return.\"\nmsgstr \"К сожалению, я не могу дать тебе ничего взамен.\"\n\n#. Key:\t90A13FAC4AA90E98DBEFFA9BB8DEDE80\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Lory.C3Lory:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Chapter3/C3Lory.C3Lory:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_C3Lory\"\nmsgid \"Oh, thank you! Books always matter.\"\nmsgstr \"О, спасибо! Книги всегда важны.\"\n\n#. Key:\t9C6E843645F86F1E39E6458952C7F283\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Lory.C3Lory:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Chapter3/C3Lory.C3Lory:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_C3Lory\"\nmsgid \"I hope I can open a new shop in the Human Realm.\"\nmsgstr \"Надеюсь, я смогу открыть новый магазин в Человеческом Царстве.\"\n\n#. Key:\tAE354F2C458C144C2825028174F91CCE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Lory.C3Lory:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Chapter3/C3Lory.C3Lory:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_C3Lory\"\nmsgid \"I don't know if it still matters but I have these books for you.\"\nmsgstr \"Не знаю, если это еще важно, но у меня есть эти книги для тебя.\"\n\n#. Key:\tB5BCB95E43DB3854273F6AAA4067FC55\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Lory.C3Lory:DlgNode_Speech_42.Text\n#: /Game/SO/Dialogues/Chapter3/C3Lory.C3Lory:DlgNode_Speech_42.Text\nmsgctxt \"Dialogue_C3Lory\"\nmsgid \"Unfortunately I have nothing at the store right now. Ha-ha...\"\nmsgstr \"К сожалению, сейчас у меня в магазине ничего нет. Ха-ха...\"\n\n#. Key:\tC0E84ACD40CB002E0C30A289E0554EE9\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Lory.C3Lory:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/Chapter3/C3Lory.C3Lory:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_C3Lory\"\nmsgid \"No problem.\"\nmsgstr \"Без проблем.\"\n\n#. Key:\tFEFF93C84CC75D277EC221AD22338A75\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Lory.C3Lory:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter3/C3Lory.C3Lory:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_C3Lory\"\nmsgid \"Ruin took all my wares.\"\nmsgstr \"Руин забрал все мои товары.\"\n\n#. Key:\t090F12534A0096B8D4D7D9A5CDC9B3B5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_25.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_25.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Well I guess you don’t have many customer.\"\nmsgstr \"Ну, я полагаю, у тебя не так уж и много клиентов.\"\n\n#. Key:\t10A1CF314EC02954FF38F1989C61DEE9\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"That’s only one man! I need three!\"\nmsgstr \"Это всего лишь один, чувак! Я просил три!\"\n\n#. Key:\t127DE2E049C91112F814C69348954F99\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_7.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_7.Children(1).Children.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Buy name\"\nmsgstr \"Купить имя\"\n\n#. Key:\t1AF2DDE74542524EEF19CA9567CFBDAF\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_58.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_58.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"{name}? It still sounds a bit weird, but I think I might like it.\"\nmsgstr \"{name}? Все еще звучит немного странно, но я думаю, мне может понравиться.\"\n\n#. Key:\t1C411E31405F157B2465229ECE66F4E0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_31.Children(2).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_31.Children(2).Children.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Wanderer\"\nmsgstr \"Странник\"\n\n#. Key:\t1ED747BD43E40D4096809696951517EE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"A special offer for ya! Give me three Blue Gems and I’ll give ya the key!\"\nmsgstr \"Спец предложение, только для тебя! Ты мне три Голубых Самоцвета и я тебе ключ!\"\n\n#. Key:\t20B146B94D2E2FCE5E0C48BC64F7A1D6\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_19.Text\n#. Key:\t41E21D044B53E16C1BA8D7B720D84B50\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_36.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_36.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Sure man!\"\nmsgstr \"Конечно, чувак!\"\n\n#. Key:\t2BDF52EF43CA5FBB145EC1BA0014FC27\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_7.Children(3).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_7.Children(3).Children.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Who are you?\"\nmsgstr \"А ты кто?\"\n\n#. Key:\t2DF772F14AAA9780F4D9E397DE723665\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_32.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_32.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Fearsome! At least for what you will destroy.\"\nmsgstr \"Угражающий! По крайней мере, для того, что ты уничтожишь.\"\n\n#. Key:\t312F26294ECE4F618D88BE84DE7A2F9A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_31.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_31.Children(1).Children.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Destroyer\"\nmsgstr \"Разрушитель\"\n\n#. Key:\t328C9911427AA19B40B297ACC9D16447\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_31.Children(3).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_31.Children(3).Children.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Don't buy\"\nmsgstr \"Не покупать\"\n\n#. Key:\t32D3F53746DD2801BC1B04AF1C1753DD\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Don’t turn around I’m talking to ya big guy! Down here on the wood!\"\nmsgstr \"Да не вертись ты так, я с тобой разговариваю, здоровяк! Внизу, на дровах!\"\n\n#. Key:\t576A3CE049331518C8D1F196E6CC382C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Back on topic: will ya buy something?\"\nmsgstr \"Вернемся к главной теме: покупать че-нибудь будешь?\"\n\n#. Key:\t5C1E07DF4B2D135102D6B09D3A04A726\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"C’mon man! Don’t just stand there tell me what ya want!\"\nmsgstr \"Ну, чувак! Не стой просто так, давай говори, че ты хочешь!\"\n\n#. Key:\t62AA5DD54A8447F7A277B194B05FB74D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_23.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_23.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"What’s wrong with ya man?\"\nmsgstr \"Да че с тобой, чувак?\"\n\n#. Key:\t6E13F5544C66EDB0CFE764A0F52269E1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_27.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_27.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"You know transporting breadcrumbs, marching onto various directions, the usual things.\"\nmsgstr \"Ну, ты знаешь, перевозить хлебные крошки, маршировать в разные стороны, обычные дела.\"\n\n#. Key:\t6F3C17894E694FC6215871B167087908\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_24.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_24.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"I’m Merch Ant doin’ Microtransactions. I’ve just told ya.\"\nmsgstr \"Я Торгаш, занимаюсь микротранзакциями. Я же только что сказал.\"\n\n#. Key:\t7169B2FA40F5F5F328D2A6B9D53D58C8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_7.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_7.Children(0).Children.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Trade\"\nmsgstr \"Купить\"\n\n#. Key:\t7B41C105431C54F2FDDEA6AA9A0E1C1A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Er... so who are you and what are you doing here?\"\nmsgstr \"Э... так кто ты и что ты здесь делаешь?\"\n\n#. Key:\t8718A8F54D5722F666D83F8067476622\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"There is an iron door which blocks the path to the tower. Do you have something which opens it?\"\nmsgstr \"Там есть железная дверь, которая перекрывает путь к башне. У тебя есть что-нибудь, чем можно ее открыть?\"\n\n#. Key:\t889B39EC4BC170A2BF493380947116A7\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Sure man! Microtransactions always work!\"\nmsgstr \"Конечно, чувак! Микротранзакции всегда работают!\"\n\n#. Key:\t9157AE9644A4A3B2C97F7482932160D2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"No man, we agreed on three!\"\nmsgstr \"Нет, чувак, мы же договорились на три!\"\n\n#. Key:\t9283F6B1447C6992FE355289F3337472\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_7.Children(2).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_7.Children(2).Children.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Gate\"\nmsgstr \"Врата\"\n\n#. Key:\t99C44AA849A384C7941D3DAE1D6A3EFF\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Here is your Gem!\"\nmsgstr \"Вот твой Самоцвет!\"\n\n#. Key:\t9CA7941F42ABFAE5660895AF886CD62C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_31.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_31.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Sure man! I have some really cool ones for sale!\"\nmsgstr \"Конечно, чувак! У меня есть несколько действительно крутых на продажу!\"\n\n#. Key:\tA3C6B03E404B1C039EF1C98C8E28AE22\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Show me what you've got for sale!\"\nmsgstr \"Покажи мне, что у тебя есть!\"\n\n#. Key:\tABE279924E0641DA18E9708F35F4500A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_29.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_29.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"I’ve got to go.\"\nmsgstr \"Мне пора идти.\"\n\n#. Key:\tAF1FECDB402777D850B819B934DF851D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_34.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_34.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Ah, never mind, here you go!\"\nmsgstr \"Ах, проехали, вот, держи!\"\n\n#. Key:\tB19FA067432CE0273A3652AA9A32F2DF\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Don’t be surprised!\"\nmsgstr \"Не удивляйся!\"\n\n#. Key:\tB5F8E17E4712A37EF1C227AA7E99DBC8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Aren’t two Gems enough for you?\"\nmsgstr \"Разве двух Самоцветов недостаточно для тебя?\"\n\n#. Key:\tBC5DEE9E4D39238451D1A2B9F8B20815\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_26.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_26.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Okey, okey! I have to admit I also do some regular ant work from time to time.\"\nmsgstr \"Ладно, ладно! Должен признать, я также время от времени делаю обычную муравьиную работу.\"\n\n#. Key:\tBD7096344553E098E4A29787E1386B4A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Are you sure the key works?\"\nmsgstr \"Ты уверен, что ключ сработает?\"\n\n#. Key:\tC6A384624B53D808D62CB885A6573150\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Was nice to deal with ya!\"\nmsgstr \"Было классно с тобой работать!\"\n\n#. Key:\tC737154043396F726CF6B2814991B38D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_35.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_35.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"I've changed my mind. I'm fine with my current name.\"\nmsgstr \"Я передумал. Меня устраивает мое прежнее имя.\"\n\n#. Key:\tC94F33504E68364DE1BAA48FC0CA85E5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_7.Children(5).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_7.Children(5).Children.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Leave\"\nmsgstr \"Выйти\"\n\n#. Key:\tCDA5A0164F5FDD87D0F4C0B10A5ED5DA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"I did my part. Give me the key!\"\nmsgstr \"Я выполнил свою часть сделки. Дай мне ключ!\"\n\n#. Key:\tD1B1D33742EAA6A9BCDC42B5EA72EB59\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_31.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_31.Children(0).Children.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Saviour\"\nmsgstr \"Спаситель\"\n\n#. Key:\tD1E444764EDA1457DD7427A0EA75C65F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_7.Children(4).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_7.Children(4).Children.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Blue Gem\"\nmsgstr \"Голубой Самоцвет\"\n\n#. Key:\tD65AD8854E1A5BC2D37C208357BACDE3\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Due to my size!\"\nmsgstr \"Из-за моего размера!\"\n\n#. Key:\tDDEB5C4B4A180E85B1D711815B4D32F3\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Can I buy a name from you?\"\nmsgstr \"Могу я купить у тебя имя?\"\n\n#. Key:\tDE3F40384473EC97950CDDB43AFE439E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Easy man! Here ya go!\"\nmsgstr \"Полегче, чувак! На, держи!\"\n\n#. Key:\tDEED1AF94E4BC154ED98A8B951AF0673\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Hey again!\"\nmsgstr \"Здарова!\"\n\n#. Key:\tE2C88DA74DA8B5935E15CC9FD337C307\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_39.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_39.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Come on man! You can't just wander around!\"\nmsgstr \"Ну же, чувак! Ты не можешь просто так странствовать!\"\n\n#. Key:\tEA08DE334C7D8631989D159FB841367D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_30.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_30.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"See ya man!\"\nmsgstr \"Увидимся, чувак!\"\n\n#. Key:\tEAB8C1DE4B07AD7EAF0A4B819E4522C6\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Hey there!\"\nmsgstr \"Эй там!\"\n\n#. Key:\tF780C72E4DDD9D9189C900836D4F7DBD\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"I’m Merch Ant, I deal with microtransactions.\"\nmsgstr \"Я Торгаш, занимаюсь микротранзакциями.\"\n\n#. Key:\tFED676B745409B7095EBB2994E581817\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_57.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_57.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"That's cool man. Though I wonder who will you save?\"\nmsgstr \"Это круто, чувак. Хотя мне интересно, кого ты спасать будешь?\"\n\n#. Key:\t04F1EF4B4AFDE5759A25A1A4922E9EA8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"Yet they could do nothing.\"\nmsgstr \"И все же они ничего не смогли изменить.\"\n\n#. Key:\t05E7A2224316FEED1A2CEB8AEFC46B41\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"We can’t let everyone die here.\"\nmsgstr \"Мы не можем позволить всем здесь умереть.\"\n\n#. Key:\t078A48C347E2B23E79C495BA42BC7B6D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_25.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_25.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"We’ll have time to find a cure.\"\nmsgstr \"У нас будет время найти лекарство.\"\n\n#. Key:\t0A857169478EC6929EFCA3B390C394DA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"Prepare for your last travel in the Ruined Realm. Head to the north from where the wind is blowing!\"\nmsgstr \"Приготовься к последнему путешествию в Разрушенное Царство. Отправляйся на север, откуда дует ветер!\"\n\n#. Key:\t1D8B6C81428A6D9F4C29AE9AD26206F2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_29.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_29.Children(1).Children.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"Can't leave them\"\nmsgstr \"Не могу их оставить\"\n\n#. Key:\t217F39F14762862B6EA18484EA74E987\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_37.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_37.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"I wish you better luck this time!\"\nmsgstr \"Пусть в этот раз тебе повезёт!\"\n\n#. Key:\t22E17F2F4CFDD0CEB67AB0A91D872B3F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_4.Children(2).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_4.Children(2).Children.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"Not my problem\"\nmsgstr \"Не моя проблема\"\n\n#. Key:\t2685CE674BB3B11FD3CB3AA2460CE60A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"There is nothing we can do for this World.\"\nmsgstr \"Мы ничего не можем сделать для этого Мира.\"\n\n#. Key:\t26A2075F407FF43E1AF8B6B38E9C4AEE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"Farewell!\"\nmsgstr \"Прощай!\"\n\n#. Key:\t2F7D7C46418E8E049493839A26DBB10E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"I’m ready to sacrifice myself but I feel sorrow for this world.\"\nmsgstr \"Я готов пожертвовать собой, но мне жаль этот мир.\"\n\n#. Key:\t39172C7641A5973A4B5D8480EBDD2589\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_34.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_34.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"Back already?\"\nmsgstr \"Уже вернулся?\"\n\n#. Key:\t3D21436E48DA0DF9C3ACA3B11001B17C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"Yet, we need to save those we can.\"\nmsgstr \"Тем не менее, мы должны спасти тех, кого можем.\"\n\n#. Key:\t43B780AA4934FBE35679BFB3C1C92D56\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"Farewell Wanderer!\"\nmsgstr \"Прощай, Странник!\"\n\n#. Key:\t4AD4171F4A1832148034BAA736FC587E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"Head to the north from where the wind is blowing!\"\nmsgstr \"Направляйся на север туда, откуда дует ветер!\"\n\n#. Key:\t4E65707F497B4B35E873138DDBF7B879\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"I will go home and you will solve your problems on your own.\"\nmsgstr \"Я пойду домой, а вы сами решите свои проблемы.\"\n\n#. Key:\t4EDA1AEF471537F758DD0491A7140073\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"This is none of my business.\"\nmsgstr \"Меня это не касается.\"\n\n#. Key:\t58246AA446D982E55E53EAB34FFF6A81\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_34.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_34.Children(1).Children.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"Leave\"\nmsgstr \"Выйти\"\n\n#. Key:\t67CB3C99468EEA39C4C18C8B0C28AFEA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_26.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_26.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"You? You mean the Wizard Council?\"\nmsgstr \"Ты? Ты имеешь в виду Совет Волшебников?\"\n\n#. Key:\t743DD4C048F8CD08A49805975183B54D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"I’m sorry it ends like this, Wanderer.\"\nmsgstr \"Мне жаль, что так всё и закончится, Странник.\"\n\n#. Key:\t7AB88DE549E213B71759699AD51CFD4C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"I’m really proud of you little spirit. This wasn’t an easy decision for me either.\"\nmsgstr \"Я очень горжусь тобой, маленький дух. Это было нелегким решением и для меня.\"\n\n#. Key:\t7DCF30E74F8C0F29DA4E668CE3435E89\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"Wizard can’t hear us here, we can talk freely.\"\nmsgstr \"Здесь Волшебник нас не услышит, мы можем свободно разговаривать.\"\n\n#. Key:\t8177A07D41AE7778BB4839AED3FEDACF\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_23.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_23.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"Do you know what you are risking?\"\nmsgstr \"Знаешь ли ты, чем рискуешь?\"\n\n#. Key:\t876B4752465406828E27A88C282EA5CD\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"From here I can teleport you close to the place where the Wizard will be able to get you out.\"\nmsgstr \"Отсюда я могу телепортировать тебя поближе к месту, откуда Волшебник сможет тебя вытащить.\"\n\n#. Key:\t9255CAD841A0C5B4DF3F4D8C5F5516B1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"So many great things will perish. So many...\"\nmsgstr \"Столько великих вещей исчезнет. Слишком много...\"\n\n#. Key:\t95EDE8FB4CEC490381EBD990C7277009\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_38.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_38.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"Take your time!\"\nmsgstr \"Не торопись!\"\n\n#. Key:\t9D46888D43C665A29506BF9CBB62F81D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_35.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_35.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"Let me try again!\"\nmsgstr \"Дай мне попробовать еще раз!\"\n\n#. Key:\tA1CF649542AAE3D8945327B9502E2E78\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_29.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_29.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"What chance do the humans have?\"\nmsgstr \"Каковы шансы у людей?\"\n\n#. Key:\tA60B94F64A0D02EA0DA9419741ED84F4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_36.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_36.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"I just need some rest.\"\nmsgstr \"Мне просто нужно передохнуть.\"\n\n#. Key:\tA651056C4D344D685FEB53B2C3795966\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_34.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_34.Children(0).Children.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"Retry\"\nmsgstr \"Повторить\"\n\n#. Key:\tAAE7046349DBE5359097179A42FDA255\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_33.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_33.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"This one was enough.\"\nmsgstr \"Смотреть на этот было достаточно.\"\n\n#. Key:\tB17D67194997EFAEF6B8678DB05894FD\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"Let’s get them out first and face Ruin after.\"\nmsgstr \"Давай сначала выведем их, а потом сразимся с Руином.\"\n\n#. Key:\tB4E31022471B52056F7B5AA3BB322700\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"How can I get to the Wizard’s tower?\"\nmsgstr \"Как мне добраться до башни Волшебника?\"\n\n#. Key:\tB6C99FC54E2A347994473EBF52B57EBD\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_4.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_4.Children(1).Children.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"Raven’s plan\"\nmsgstr \"План Ворона\"\n\n#. Key:\tB985955E4FC6D81FBD38D79ADE68BF1F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_4.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_4.Children(0).Children.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"Separate Worlds\"\nmsgstr \"Разделить Миры\"\n\n#. Key:\tC4BABAED4C790EDDF6AAF7A0D4CFA79B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_27.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_27.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"When Ruin started in the Runic Realm they had hundreds of Scientists who studied the force which made Ruin.\"\nmsgstr \"Когда Руин начался в Руническом Царстве, у них были сотни ученых, которые изучали силу, которая создала Руин.\"\n\n#. Key:\tCB779F524992B29781C4778ED6E224A7\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_30.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_30.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"I just can’t leave them to die here...\"\nmsgstr \"Я просто не могу оставить их здесь умирать…\"\n\n#. Key:\tCDA7A09249E96A52B2FA3CA471D6C4B3\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"This is the end of the path where we last meet.\"\nmsgstr \"Это конец пути, на котором мы встречаемся в последний раз.\"\n\n#. Key:\tCF238FAA4941848AF7071A866B75B6EC\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"You are right. The only way to stop Ruin is to lock the Ruined Realm forever.\"\nmsgstr \"Ты прав. Единственный способ остановить Руин - это закрыть Разрушенное Царство навсегда.\"\n\n#. Key:\tD1F3B7324351B25E8C55679BAC3BF1E0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"Have you made your decision?\"\nmsgstr \"Ты принял свое решение?\"\n\n#. Key:\tE164446B4944B4CAC8E5C1BF82A722A2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_24.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_24.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"If you bring infected people into the Human Realm Ruin will consume them.\"\nmsgstr \"Если ты приведешь зараженных людей в Человеческое Царство, Руин поглотит их.\"\n\n#. Key:\tE39531DE4350D6D86DF469839F1906E7\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_31.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_31.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"It’s your decision, Wanderer. I understand.\"\nmsgstr \"Это твое решение, Странник. Я понимаю.\"\n\n#. Key:\tE46912D04BE67D3E2B0794BB632AEE98\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_32.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_32.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"I’ll stay here. I won’t be able to watch another World dying...\"\nmsgstr \"Я останусь здесь. Я не могу смотреть, как умирает еще один Мир...\"\n\n#. Key:\tF70B765F44DB17E1C6978D9D8652C911\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"Hello, little Wanderer!\"\nmsgstr \"Здравствуй, юный Странник!\"\n\n#. Key:\tFE709EDF4482B6FA7408DE99D95E8577\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_29.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_29.Children(0).Children.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"You are right\"\nmsgstr \"Ты прав\"\n\n#. Key:\tFE77F7964851F202F5C91396A4C7228E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"I’ll take you to the place where you can leave this Realm.\"\nmsgstr \"Я отведу тебя туда, откуда ты сможешь покинуть это Царство.\"\n\n#. Key:\t0B886754483D1C215FBEF5B7D19AF6A6\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"I know you have summoned a Spirit of the Unknown world. You were a fool to think you can get away with this.\"\nmsgstr \"Я знаю, что ты вызвал Духа из Неизвестного мира. Ты дурак, если думаешь, что тебе это сойдет с рук.\"\n\n#. Key:\t0BDF59D34A9E53B7FD5FD18F8E46F72F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"Argh! All right, here you go...\"\nmsgstr \"Грррр! Ладно...\"\n\n#. Key:\t2A6837CA471604FCDD180E85BD23D676\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"Krrr... Raven gives you magic which will make you fly like a Raven.\"\nmsgstr \"Кррр... Ворон дарует тебе магию, которая позволит тебе летать, как Ворон.\"\n\n#. Key:\t2D8209F74AC3C9E042717A9FB108C051\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"Come on, go and try it!\"\nmsgstr \"Ну же, иди и попробуй!\"\n\n#. Key:\t39B1763740E9BB9B495A7997920A3401\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_12.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_12.Children(0).Children.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"How?\"\nmsgstr \"Как?\"\n\n#. Key:\t3AE553D14FFB88C0518679B86691D508\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"Call your master little spirit, I have words with him.\"\nmsgstr \"Зови своего мастера маленький дух, мне нужно с ним поговорить.\"\n\n#. Key:\t3E02111D40F21C2C8C13F08729B4CDBC\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"I don’t know about any rule forbidding that...\"\nmsgstr \"Я не знаю ни одного правила, запрещающего это...\"\n\n#. Key:\t453610F144D8CEB42138F0BB35B9692A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"Wait Scholar! Please give me a few more days!\"\nmsgstr \"Подожди, Профессор! Пожалуйста, дай мне еще несколько дней!\"\n\n#. Key:\t4F0C40114C4DD1B345CF909E94F99D60\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"Why should I ask that?\"\nmsgstr \"Почему я должен об этом спрашивать?\"\n\n#. Key:\t56F0D93740AB7555FF9370879D774842\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"I have no doubt how the Council will react.\"\nmsgstr \"Я не сомневаюсь, какой будет реакция Совета.\"\n\n#. Key:\t60D3A9DA420ECD7DBF490BA233EA5C61\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"Because you would love to know how you can get out of here.\"\nmsgstr \"Потому что тебе было бы интересно узнать, как отсюда выбраться.\"\n\n#. Key:\t6125A956446F64BD91E1F5A282AC146D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"Don’t worry! I know your daughter is trapped in the Unknown and my research confirms there is a chance you can bring her back.\\r\\nI’ll help you bring the missing artefacts back.\"\nmsgstr \"Не волнуйся! Я знаю, что твоя дочь в ловушке “Неизвестного Мира”, и мои исследования подтверждают, что у тебя есть шанс вернуть ее обратно.\\nЯ помогу тебе вернуть пропавшие артефакты.\"\n\n#. Key:\t6B7478444FBC694480D442BB90F70B27\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"What do you want?\"\nmsgstr \"Что тебе нужно?\"\n\n#. Key:\t72D7F64D4051F9BF362B9B97FD30DB65\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_12.Children(2).Children.Text\n#. Key:\tF62125FB48F982D2A3D4FE9621810F64\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_12.Children(2).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"What?\"\nmsgstr \"Что?\"\n\n#. Key:\t810BD4154FA6BC7F857F9CB14EDC6A1D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"Er... thanks!\"\nmsgstr \"Эм...спасибо!\"\n\n#. Key:\t8F439E124100E004BCCD4AA04F17CB3F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"How will we get out of here?\"\nmsgstr \"Как мы отсюда выберемся?\"\n\n#. Key:\t9D31A0084CBBA499BA4E3BADB42E6E36\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"Rule? What rule should be needed for something which was thought to be impossible?\"\nmsgstr \"Правило? Какое правило должно было быть для того, что считалось невозможным?\"\n\n#. Key:\t9F52551E46588D4F12CD7C8B63701FDE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_12.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_12.Children(1).Children.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"Why?\"\nmsgstr \"Зачем?\"\n\n#. Key:\tAAC96E3C4D4D303C9E692390612A7215\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"Ask how we will get out of here!\"\nmsgstr \"Спроси, как мы отсюда выберемся!\"\n\n#. Key:\tC0808C6545D02F43CB37A2AFB79EEC1F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"Actually it’s not that good but still better than nothing.\"\nmsgstr \"На самом деле оно не такое уж и хорошее, но все же лучше, чем ничего.\"\n\n#. Key:\tC19759F44A5A2AE21A04EBAF2A47E2D3\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"Take this!\"\nmsgstr \"Возьми!\"\n\n#. Key:\tC8CEB3844A6C958FF42C74AA81D4A90F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"Finally, Raven found you!\"\nmsgstr \"Наконец-то, Ворон нашел тебя!\"\n\n#. Key:\tCF6DEF4D4F6F664CF24435AF248CE452\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"Raven and his fellow Ball on a quest again!\"\nmsgstr \"Ворон и его приятель Шар снова на задании!\"\n\n#. Key:\tE52C31F241BCD21378696EB8761C0654\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"Let the masters talk in private and discuss how we will get out of here!\"\nmsgstr \"Пускай Мастера поговорят с глазу на глаз и обсудят, как мы отсюда выберемся!\"\n\n#. Key:\t00ED8B314FC2DA3901823F92635D41D1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_26.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_26.Children(0).Children.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"You’ll be all dead\"\nmsgstr \"Вы все будете мертвы\"\n\n#. Key:\t23BA5AA446B44D107B9F3994ADDE1C43\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_22.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_22.Children(1).Children.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Save them!\"\nmsgstr \"Спасти их!\"\n\n#. Key:\t42395E7B4B735458E30557B9544073E3\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_8.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_8.Children(1).Children.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Leave\"\nmsgstr \"Выйти\"\n\n#. Key:\t43A5BAA8417D3291E502AD9500873B9E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Rumours have been spread of Ruin and the people are scared. They demand the Wizard Council to separate the Human Realm from the Ruined Realm.\"\nmsgstr \"Слухи о Руине распространились, и люди напуганы. Они требуют, чтобы Совет Волшебников отделил Человеческое Царство от Разрушенного.\"\n\n#. Key:\t4FAAEE6240849C416541EDA8AB8083C8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_30.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_30.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Good luck, Raven!\"\nmsgstr \"Удачи, Ворон!\"\n\n#. Key:\t559673484F3C66AADE37E787BA35824A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_33.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_33.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Only a fool would bring Ruin to his own World.\"\nmsgstr \"Только дурак принесет Руин в свой собственный мир.\"\n\n#. Key:\t568124F448BE3AF41123A0B7BB158A53\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Krrrr! Raven and you make a really good team.\"\nmsgstr \"Каарр! Ты с Вороном - действительно хорошая команда.\"\n\n#. Key:\t5853B8654DBD91894792DE803DE87271\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_27.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_27.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"You bring back the artefacts to rescue Lillian.\"\nmsgstr \"Ты принеси обратно артефакты, чтобы спасти Лилиан.\"\n\n#. Key:\t5D71DA8F4134A1AA206F15B7587AA188\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_15.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_15.Children(0).Children.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Break in?\"\nmsgstr \"Проникнуть?\"\n\n#. Key:\t6234A9A34854A37E0CA56987FDE81F5A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_26.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_26.Children(1).Children.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"You are right\"\nmsgstr \"Ты прав\"\n\n#. Key:\t6B07C6F34DF51DFA23A4278FCBECF303\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"What it will do?\"\nmsgstr \"Что оно может сделать?\"\n\n#. Key:\t6E5A51A34AB81094924512B92F25F41C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_32.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_32.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"You are trying to rescue a bunch of mad people so that they can live a few more years with the cost of destroying one more Realm.\"\nmsgstr \"Вы пытаетесь спасти кучу сумасшедших людей, чтобы они могли прожить еще несколько лет ценой уничтожения еще одного Царства.\"\n\n#. Key:\t70514624400617999FA05FAFAE67D60F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"What happened in the Human Realm?\"\nmsgstr \"Что случилось в Человеческом Царстве?\"\n\n#. Key:\t71C42D6445782897EAF303BFA2C5C260\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"What will you do? What’s your part in this?\"\nmsgstr \"Что ты будешь делать? Какова твоя роль в этом?\"\n\n#. Key:\t728B75824B28856156D207B71017C714\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Things are changing in the Human Realm and Raven has many things to do.\"\nmsgstr \"В Человеческом Царстве все меняется, и у Ворона есть много дел.\"\n\n#. Key:\t7826765F45BE76393F3636B79BBC24C0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_24.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_24.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"You are right. We need to save them. What’s the plan?\"\nmsgstr \"Ты прав. Мы должны спасти их. Каков план?\"\n\n#. Key:\t866DA22D46D855A200BB7F9E71788367\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_22.Children(0).Children.Text\n#. Key:\tBA0DEBA04BF5C604A2B760B8275E2983\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_23.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_22.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_23.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Is that safe?\"\nmsgstr \"А это безопасно?\"\n\n#. Key:\t86E69EA04F489DC54B48BEBE8B3762BF\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_1.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_1.Children(0).Children.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Agree\"\nmsgstr \"Согласиться\"\n\n#. Key:\t8D543992469624098751EAA474848F8C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Soon the Ruined Realm will be over. We cannot save it.\"\nmsgstr \"Скоро Разрушенное Царство исчезнет. Мы не можем спасти его.\"\n\n#. Key:\t943679734061A00F4CC99A8BC31078EA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Wizard won’t activate the device for them but some of them are fools enough to try it anyway.\"\nmsgstr \"Волшебник не активирует устройство для них, но некоторые из них достаточно глупы, чтобы попробовать в любом случае.\"\n\n#. Key:\t978AEC8B45AC7E6ED3E814AB849CF96A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"So, what now?\"\nmsgstr \"И что теперь?\"\n\n#. Key:\t99250A3F4973EBFB5A20A192DF8976AA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"With every day more and more people join their ranks.\"\nmsgstr \"С каждым днем все больше и больше людей вступают в их ряды.\"\n\n#. Key:\t9D81AC2C4900D6DDA6B17CAD7168020C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_31.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_31.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Farewell, compeer!\"\nmsgstr \"Прощай, товарищ!\"\n\n#. Key:\tA5F24B3747918DB1E38CB98208FD6B1B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_35.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_35.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Or maybe you are wrong.\"\nmsgstr \"Или, может быть, ты ошибаешься.\"\n\n#. Key:\tB0ECBFAF4E34AEDE88F1B7B7C7F7CC5B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_8.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_8.Children(0).Children.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"What happened?\"\nmsgstr \"Что случилось?\"\n\n#. Key:\tB1D891BF48298C5D4CF7D8957EACDD1B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Raven will gather as many survivors as Raven can.\"\nmsgstr \"Ворон соберет как можно больше выживших.\"\n\n#. Key:\tB6CF3E424BAEA6EE368D508EEFDD5FF1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_36.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_36.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Farewell compeer! Raven will be on a quest on Raven’s own!\"\nmsgstr \"Прощай, товарищ! Ворон будет сам по себе!\"\n\n#. Key:\tB87509FF4D29C2B3D25CCEB192090963\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"What happens if they break in?\"\nmsgstr \"Что будет, если они проникнут?\"\n\n#. Key:\tB89F014644B8D3E1754B1B8C796D5858\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_1.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_1.Children(1).Children.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Disagree\"\nmsgstr \"Не согласен\"\n\n#. Key:\tBA14AAD54C3D4F7CF18F5D8560A62637\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Nothing good...\"\nmsgstr \"Ничего хорошего...\"\n\n#. Key:\tC2E50DCB4E1171342DD931910E42549E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_37.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_37.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Farewell!\"\nmsgstr \"Прощай!\"\n\n#. Key:\tC3B19DAF4C0B491D9236CD99FD7DD603\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Except when you kill me with a laser beam.\"\nmsgstr \"За исключением тех случаев, когда ты убиваешь меня лазерным лучом.\"\n\n#. Key:\tCBDDFBD14121FE1758B360A1775F2169\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Farewell compeer until you meet Raven again!\"\nmsgstr \"Прощай, пока не встретишь Ворона вновь!\"\n\n#. Key:\tCD19E0924BB1080025ABA19860F578CE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Somehow they know about the device the Wizard created. They surrounded the Wizard’s tower. Some even tried to break in.\"\nmsgstr \"Каким-то образом они узнали об устройстве, которое создал Волшебник. Они окружили башню Волшебника. Некоторые даже пытались проникнуть внутрь.\"\n\n#. Key:\tD54470AA424038F96824FC805AE3F0EE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_25.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_25.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Krrr! For them it’s much safer than staying here when the World is over.\"\nmsgstr \"Карр! Для них это намного безопаснее, чем остаться здесь, когда наступит конец света.\"\n\n#. Key:\tD99400D94457B6779DE59DB94FDBF9D1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"We have really short time to act.\"\nmsgstr \"У нас очень мало времени.\"\n\n#. Key:\tDAEF711B41EC4EF72FC271B5AD98A238\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_26.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_26.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"There are hundreds of survivors. Races that don’t even exist anywhere else! Who are we if we don’t even try to save them?\"\nmsgstr \"Сотни выживших. Рас, которых больше нигде нет! Кем мы будем, если даже не попытаемся их спасти?\"\n\n#. Key:\tDF872D134C82DFDD3F55F4A6FFF59673\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Except...\"\nmsgstr \"За исключением...\"\n\n#. Key:\tE64B8C0048D2D3357B74CD8D7C1B5407\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_34.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_34.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"You sound like that Monk, don’t you? Maybe you are right.\"\nmsgstr \"Ты звучишь, как тот Монах, не находишь? Может, ты и прав.\"\n\n#. Key:\tEA01FB8248A5F30CF9D95AA292D5466A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"No problem.\"\nmsgstr \"Без проблем.\"\n\n#. Key:\tF1193DA54FBB289383D56F952818E67E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Raven’s master decided we need to gather every survivor and take them into the Human Realm.\"\nmsgstr \"Мастер Ворона решил, что мы должны собрать всех выживших и забрать их в Человеческое Царство.\"\n\n#. Key:\tF19792CF477CD543AC05FCBEDA3EA88C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_15.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_15.Children(1).Children.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"To act?\"\nmsgstr \"Действовать?\"\n\n#. Key:\tF606FBDF4B7F3DFF9A55BE9CDB186CAC\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Farewell then!\"\nmsgstr \"Тогда прощай!\"\n\n#. Key:\tF8FA36BF4E3A4C028FBAF0A2AA531AA4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"You need to go on alone.\"\nmsgstr \"Ты должен идти один.\"\n\n#. Key:\tFA02BBA74B601254CDA90A9300AD312F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_29.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_29.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"If all goes well you will meet Raven on the other side.\"\nmsgstr \"Если все пройдет хорошо, ты встретишь Ворона на другой стороне.\"\n\n#. Key:\tFA630952402B081C2D449DA3C091F33E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Yes, we did well. Thanks for the help!\"\nmsgstr \"Да, мы хорошо справились. Спасибо за помощь!\"\n\n#. Key:\t63338A0644CC3AE62BCC10B56EAAD524\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3SewerCreature.C3SewerCreature:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter3/C3SewerCreature.C3SewerCreature:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_C3SewerCreature\"\nmsgid \"Fear not, everything will be alright!\"\nmsgstr \"Не бойся, все будет хорошо!\"\n\n#. Key:\t2C1EC209404316CE23DC67B6E91AC661\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Statue.C3Statue:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter3/C3Statue.C3Statue:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_C3Statue\"\nmsgid \"Are you ready?\"\nmsgstr \"Ты готов?\"\n\n#. Key:\t33B337C9455FC32BF5C3C69F58843673\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Statue.C3Statue:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Chapter3/C3Statue.C3Statue:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_C3Statue\"\nmsgid \"Will you release me once I get into your tower?\"\nmsgstr \"Отпустишь ли ты меня, как только я войду в твою башню?\"\n\n#. Key:\t4A8AD3EC428307141BD011B66448A7E5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Statue.C3Statue:DlgNode_Speech_2.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Statue.C3Statue:DlgNode_Speech_2.Children(0).Children.Text\nmsgctxt \"Dialogue_C3Statue\"\nmsgid \"Ready\"\nmsgstr \"Готов\"\n\n#. Key:\t9C5B29DF4784913DFF166BAD07AC1219\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Statue.C3Statue:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Chapter3/C3Statue.C3Statue:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_C3Statue\"\nmsgid \"Hurry! We don’t have much time.\"\nmsgstr \"Быстрее! У нас мало времени.\"\n\n#. Key:\tB640545F41315B4C142083A2DB12A132\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Statue.C3Statue:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Chapter3/C3Statue.C3Statue:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_C3Statue\"\nmsgid \"Sure, we made a deal.\"\nmsgstr \"Конечно, мы же договорились.\"\n\n#. Key:\tC4EC98FC40F0181F5AFA60B4DFEF2D16\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Statue.C3Statue:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Chapter3/C3Statue.C3Statue:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_C3Statue\"\nmsgid \"Not yet. I’ll be back...\"\nmsgstr \"Пока нет. Я скоро вернусь...\"\n\n#. Key:\tCD542C81498F713774D43AB6EF126E32\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Statue.C3Statue:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter3/C3Statue.C3Statue:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_C3Statue\"\nmsgid \"Well done! From here I can take you to my tower.\"\nmsgstr \"Отлично сработано! Отсюда я могу отвезти тебя в свою башню.\"\n\n#. Key:\tF982C80748C46B117906F094608B7E2C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Statue.C3Statue:DlgNode_Speech_2.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Statue.C3Statue:DlgNode_Speech_2.Children(1).Children.Text\nmsgctxt \"Dialogue_C3Statue\"\nmsgid \"Stay\"\nmsgstr \"Остаться\"\n\n#. Key:\tFE6723D8452B497B07504EA753F02F35\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Statue.C3Statue:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Chapter3/C3Statue.C3Statue:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_C3Statue\"\nmsgid \"Let’s go then!\"\nmsgstr \"Тогда пошли!\"\n\n#. Key:\t7C2DF1BE46E7672A1C7092A330030B39\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3SupperDwarf.C3SupperDwarf:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter3/C3SupperDwarf.C3SupperDwarf:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_C3SupperDwarf\"\nmsgid \"Otherwise I would rather stay here.\"\nmsgstr \"Иначе я лучше останусь здесь.\"\n\n#. Key:\tFEB0911A412AF51088EC6A84D0FC7B3C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3SupperDwarf.C3SupperDwarf:DlgNode_Speech_80.Text\n#: /Game/SO/Dialogues/Chapter3/C3SupperDwarf.C3SupperDwarf:DlgNode_Speech_80.Text\nmsgctxt \"Dialogue_C3SupperDwarf\"\nmsgid \"I hope there is some delicious food in the Human Realm.\"\nmsgstr \"Надеюсь, в Человеческом Царстве есть какая-нибудь вкусная еда.\"\n\n#. Key:\t360852FB41FBC269468577878A0CC719\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_C3Teachy\"\nmsgid \"Don’t say it, I know. I’m genius.\"\nmsgstr \"Не спрашивай, как у меня это получилось. Тебе не понять моей гениальности.\"\n\n#. Key:\t39008A1943A63D4050295B9C508DF4CE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_C3Teachy\"\nmsgid \"He asked me to prove that I am worthy.\"\nmsgstr \"Он попросил меня доказать, что я достоин.\"\n\n#. Key:\t5D3A77994D763C95F5655CAC4F228452\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_C3Teachy\"\nmsgid \"Oh, the walking ball again!\"\nmsgstr \"О, опять ходячий Шар!\"\n\n#. Key:\t74789A0946246082325FCDB2600CEAA2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_C3Teachy\"\nmsgid \"I haven’t seen you since you left me there with that Keeper.\"\nmsgstr \"Я не видел тебя с тех пор, как ты оставил меня там с тем Хранителем.\"\n\n#. Key:\t81A13B9645C14341A7FA45BC7482AB58\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_C3Teachy\"\nmsgid \"I'm not sure if it still matters but here is the Weird Device I found in the hideout of the Secret Science Society.\"\nmsgstr \"Я не уверен, имеет ли это значение, но вот Странное Устройство, которое я нашел в укрытии Тайного Научного Общества.\"\n\n#. Key:\t8E2355CF4A1F7CCF4AF0FA8D95E2F503\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_C3Teachy\"\nmsgid \"After reordering the right side I got the final result:\\r\\n\\r\\nTEACHY = WORTHY\"\nmsgstr \"После изменения порядка с правой стороны я получил окончательный результат:\\n\\nУЧЕНЫЙ = ДОСТОЙНЫЙ\"\n\n#. Key:\tA46C8D2749791CE910856BA8887272EB\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_C3Teachy\"\nmsgid \"That is amazing! Thank you, my globular friend! Take these coins, I am sure you will enjoy spending them... if you still can.\"\nmsgstr \"Это потрясающе! Спасибо, мой шаровидный друг! Возьми эти монеты, я уверен, тебе понравится их тратить... если ты еще сможешь.\"\n\n#. Key:\tBFA75D71419A3B5615D65980F9A2FC0E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_C3Teachy\"\nmsgid \"Well, alright, I’ll tell.\"\nmsgstr \"Ну, ладно, я расскажу.\"\n\n#. Key:\tC09FB7394571D19280D0B68572C6DCBB\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_C3Teachy\"\nmsgid \"I bet you wonder how did I get out.\"\nmsgstr \"Могу поспорить, тебе интересно, как я выбрался.\"\n\n#. Key:\tCC72AAE64CE58AECB367B0B2565A74CC\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_C3Teachy\"\nmsgid \"I made some cups of tea and slowly put them in a row. From that I had this formula:\\r\\n\\r\\nTIME = T\\r\\nCUP = C\\r\\nTEA * C = ROW * T\"\nmsgstr \"Я пообещал что покажу как был обучен долго стоять и не уставать.\\nЯ взял УЧЕН из обучен что = к СТОЙ из стоять + ДО из долго.\"\n\n#. Key:\tE907906F4A46886EFBA7F09E459F2663\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_C3Teachy\"\nmsgid \"Then I multiplied by HY, so I get:\\r\\n\\r\\nTEACHY = ROWTHY\"\nmsgstr \"Потом я умножил на НЫЙ, так что я получил:\\n\\nУЧЕНЫЙ = СТОЙДОНЫЙ\"\n\n#. Key:\t298F025648B369E90753DA8D882DFDDB\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/DwarvenCatacombs/DCDictionary.DCDictionary:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Wizard/DwarvenCatacombs/DCDictionary.DCDictionary:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_DCDictionary\"\nmsgid \"Finally! A dictionary!\"\nmsgstr \"Наконец-то! Словарь!\"\n\n#. Key:\t3D4CF9424B28083560A64D8FA1232E9F\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/DwarvenCatacombs/DCDictionary.DCDictionary:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Wizard/DwarvenCatacombs/DCDictionary.DCDictionary:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_DCDictionary\"\nmsgid \"Wake me up when you are ready.\"\nmsgstr \"Разбуди меня, когда будешь готова.\"\n\n#. Key:\t04B787DD4344DA8AD6B1E0B7925BBDCE\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/DwarvenCatacombs/DCSecretDoor.DCSecretDoor:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Wizard/DwarvenCatacombs/DCSecretDoor.DCSecretDoor:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_DCSecretDoor\"\nmsgid \"There is a hidden Dwarven Door somewhere around here.\"\nmsgstr \"Где-то здесь есть потайная Дверь Гномов.\"\n\n#. Key:\t4412DD54423A17AF3BFBA89BAF42664D\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/DwarvenCatacombs/DCSecretDoor.DCSecretDoor:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Wizard/DwarvenCatacombs/DCSecretDoor.DCSecretDoor:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_DCSecretDoor\"\nmsgid \"Or if you toggle that switch.\"\nmsgstr \"Или если ты включишь тот переключатель.\"\n\n#. Key:\t5FDA3D2A49BD57C213F0E3869A366B76\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/DwarvenCatacombs/DCSecretDoor.DCSecretDoor:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Wizard/DwarvenCatacombs/DCSecretDoor.DCSecretDoor:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_DCSecretDoor\"\nmsgid \"This one can only be revealed on Christmas time if the full moon shines on it.\"\nmsgstr \"Эту можно раскрыть только в Рождество, и только если свет полной луны упадет на ее.\"\n\n#. Key:\tCE7E6F5B4DB41F1055EAF1898F17E4EA\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/DwarvenCatacombs/DCSecretDoor.DCSecretDoor:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Wizard/DwarvenCatacombs/DCSecretDoor.DCSecretDoor:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_DCSecretDoor\"\nmsgid \"Dwarfs are fond of these. They can't be seen if you don't know their trick.\"\nmsgstr \"Гномы любят их. Их нельзя увидеть, если ты не знаешь их трюк.\"\n\n#. Key:\t03067C1041952ECAC7D529AF2CC2ABEE\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_DemonLillian\"\nmsgid \"Who you just killed...\"\nmsgstr \"Которого ты только что убила...\"\n\n#. Key:\t06C4895B4BA9C2F71F3007B00A680CFB\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_DemonLillian\"\nmsgid \"I'm free without any bounds! I'm human!\"\nmsgstr \"Я наконец свободна! Я человек!\"\n\n#. Key:\t0E5418EA4828B840886434A250967CBE\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_DemonLillian\"\nmsgid \"You liar! I'm the daughter of the Wizard!\"\nmsgstr \"Ты врешь! Я дочь Волшебника!\"\n\n#. Key:\t15ED5E554FBF25A72BB12FA81F4076FF\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_DemonLillian\"\nmsgid \"Sister? What makes you say that?\"\nmsgstr \"Сестра? О чем ты говоришь?\"\n\n#. Key:\t2B375C424D4561D651214BA0F10CDB44\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_DemonLillian\"\nmsgid \"Siblings? What makes you say that?\"\nmsgstr \"Братья? О чем ты?\"\n\n#. Key:\t2F0A5F3442ACF917A0515892B0639541\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_2.Children(1).Children.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_2.Children(1).Children.Text\nmsgctxt \"Dialogue_DemonLillian\"\nmsgid \"Just passing\"\nmsgstr \"Да мимо проходил\"\n\n#. Key:\t36A3340F4333184F42874F88F23A710D\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_DemonLillian\"\nmsgid \"What are you doing here little toy?\"\nmsgstr \"Маленькая игрушка, что ты здесь делаешь?\"\n\n#. Key:\t46C7EE464B94BCE5D8CE6DB96299A583\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_DemonLillian\"\nmsgid \"You are nonsense.\"\nmsgstr \"Ты ничто.\"\n\n#. Key:\t732777EC4B213BC797E24FBBC478D39F\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_DemonLillian\"\nmsgid \"You are a Spirit of the Unknown bound to this body by magic. Just like me.\"\nmsgstr \"Ты - Дух Неизвестного, привязанный к этому телу магией. Также как и я.\"\n\n#. Key:\t819738554E1DD3694F3D0699221E6932\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_DemonLillian\"\nmsgid \"I'm just err... maybe we could play seek and hide?\"\nmsgstr \"Я просто эээ... может, поиграем в прятки?\"\n\n#. Key:\tA02291F444C7907190F1D3AC78E5EAF0\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_2.Children(0).Children.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_2.Children(0).Children.Text\nmsgctxt \"Dialogue_DemonLillian\"\nmsgid \"I'll stop you!\"\nmsgstr \"Я остановлю тебя!\"\n\n#. Key:\tA94658F148628400E971CD925A6B8713\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_DemonLillian\"\nmsgid \"Shaped like a human...\"\nmsgstr \"В форме человека...\"\n\n#. Key:\tBBBDA8B843BF5549EF4052894D9BB630\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_DemonLillian\"\nmsgid \"We are siblings right? You will surely let me pass...\"\nmsgstr \"Мы ведь с тобой братья, верно? Ты наверняка пропустишь меня...\"\n\n#. Key:\tBF79A92B406E287D767E7799D78FCFD4\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_DemonLillian\"\nmsgid \"That sounds funny!\"\nmsgstr \"Звучит забавно!\"\n\n#. Key:\tC6609DA7417A4DBC86F9809CE994E8BA\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_DemonLillian\"\nmsgid \"I'm power, I'm god!\"\nmsgstr \"Я сила, я Бог!\"\n\n#. Key:\tDD2EF1594AFD2B0C38845C9E36089B95\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_DemonLillian\"\nmsgid \"I've found you!\"\nmsgstr \"Я нашла тебя!\"\n\n#. Key:\tDD2F3A7048614E74B3A343BA474D8E49\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_DemonLillian\"\nmsgid \"I've come to stop you sister. The World is not your playground!\"\nmsgstr \"Я пришел остановить тебя, сестра. Мир - это не твоя игровая площадка!\"\n\n#. Key:\tE7FA21A04757D1EF04AE41AF4A13025A\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_DemonLillian\"\nmsgid \"I'm bored! Have you come to play with me?\"\nmsgstr \"Мне скучно! Ты пришел поиграть со мной?\"\n\n#. Key:\tFF05E84E4027C75294BAF4A589EEF6F9\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_DemonLillian\"\nmsgid \"I can create, I can destroy!\"\nmsgstr \"Я могу создавать, я могу уничтожать!\"\n\n#. Key:\t025193144996A7024A7CF791B5A25EB7\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillianDefeated.DemonLillianDefeated:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillianDefeated.DemonLillianDefeated:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_DemonLillianDefeated\"\nmsgid \"What are you doing? Keep your hands away from me!\"\nmsgstr \"Что ты делаешь? Убери от меня свои руки!\"\n\n#. Key:\t2E05897C454C5C33BD76A6A4371A545C\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillianDefeated.DemonLillianDefeated:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillianDefeated.DemonLillianDefeated:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_DemonLillianDefeated\"\nmsgid \"I don't want to play anymore!\"\nmsgstr \"Я не хочу больше играть!\"\n\n#. Key:\t77A82F8943F323744F9389BF22A80FDF\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillianDefeated.DemonLillianDefeated:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillianDefeated.DemonLillianDefeated:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_DemonLillianDefeated\"\nmsgid \"Farewell Spirit!\"\nmsgstr \"Прощай, Дух!\"\n\n#. Key:\t7831CD44458112E37918DF9082278603\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillianDefeated.DemonLillianDefeated:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillianDefeated.DemonLillianDefeated:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_DemonLillianDefeated\"\nmsgid \"Leave me alone!\"\nmsgstr \"Оставь меня в покое!\"\n\n#. Key:\t79E4053F4B8A1AFE74064BA77037F13E\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillianDefeated.DemonLillianDefeated:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillianDefeated.DemonLillianDefeated:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_DemonLillianDefeated\"\nmsgid \"I am his daughter. And this body is mine.\"\nmsgstr \"Я его дочь. А это тело - мое.\"\n\n#. Key:\t96BD08904BC50C912055C0977281D10F\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillianDefeated.DemonLillianDefeated:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillianDefeated.DemonLillianDefeated:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_DemonLillianDefeated\"\nmsgid \"I know this body...\"\nmsgstr \"Я знаю это тело...\"\n\n#. Key:\tA5634D7D4613C578AB85E48B2DBD422B\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillianDefeated.DemonLillianDefeated:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillianDefeated.DemonLillianDefeated:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_DemonLillianDefeated\"\nmsgid \"Away!\"\nmsgstr \"Прочь!\"\n\n#. Key:\tE09248B24E34823DDE71BAB68183AD2D\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillianDefeated.DemonLillianDefeated:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillianDefeated.DemonLillianDefeated:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_DemonLillianDefeated\"\nmsgid \"They were wrong all along.\"\nmsgstr \"Все это время они ошибались.\"\n\n#. Key:\t01C1D7AF4D8D7B3D628A089E38471479\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_74.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_74.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Thank you! Take this as reward.\"\nmsgstr \"Спасибо! Возьми это в награду.\"\n\n#. Key:\t034DDD8F467E3B6E6A70CFBC1FA81D21\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_94.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_94.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Look what I have found for you!\"\nmsgstr \"Смотри, что я для тебя нашел!\"\n\n#. Key:\t046279EA4D7E44826F537DA0869C13DD\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_114.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_114.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"They are somewhere around.\"\nmsgstr \"Они где-то здесь.\"\n\n#. Key:\t055FD02047EB0145285C8BB0B7A23F0A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_17.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_17.Children(0).Children.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"They fight Ruin\"\nmsgstr \"Они сражаются с Руином\"\n\n#. Key:\t07684DB1418378D59D3741AE19AB22C1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(9).Children.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(9).Children.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Golems destroyed\"\nmsgstr \"Разрушенные Големы\"\n\n#. Key:\t0D548F74416A5C1D8220869DC707A575\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_127.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_127.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Even if he couldn't be what I wanted him to be, he was my greatest creation ever.\"\nmsgstr \"Даже если он не мог быть тем, кем я хотел, он был моим величайшим творением.\"\n\n#. Key:\t0E3082704C6E4BA14C554DA5B4306C88\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Could you merge these copper pieces?\"\nmsgstr \"Можешь соединить эти медные кусочки?\"\n\n#. Key:\t103CB0C84AEA077F78347A92E6389F32\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_10.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_10.Children(0).Children.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Don't know\"\nmsgstr \"Не знаю\"\n\n#. Key:\t12C814BB44D434DFC5C35C882B4BF0DB\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_116.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_116.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Be aware of the Armour Wrath.\"\nmsgstr \"Остерегайся Броневого Гнева.\"\n\n#. Key:\t14E2589C4CC2C6C77D37A5B50C61C266\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Could you merge these bronze pieces?\"\nmsgstr \"Можешь соединить эти бронзовые части?\"\n\n#. Key:\t1770D8FE480B8C028F9ED989E22CF315\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"You are not one of my new creations. Yet not one of the ancients.\"\nmsgstr \"Ты не одно из моих новых творений. И все же не одно из древних.\"\n\n#. Key:\t1C02E8BB400B379858A402B9621B68D6\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_129.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_129.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Take care!\"\nmsgstr \"Береги себя!\"\n\n#. Key:\t1CDE0CFA4DBF3794096E099B58726BD8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_36.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_36.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Nothing else matters.\"\nmsgstr \"Больше ничего не имеет значения.\"\n\n#. Key:\t1FA243424440B0810651C79BD207FC2D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_33.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_33.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Too many spirits. They break loose. They couldn’t exist in our Realm. They formed Ruin.\"\nmsgstr \"Слишком много духов. Они вырвались на свободу. Они не могли существовать в нашем царстве. Они сформировали Руин.\"\n\n#. Key:\t1FFE46404FBD26325B1348BF7A2935A7\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_92.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_92.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Oh, thank you! It also gives back some of my lost knowledge.\"\nmsgstr \"О, спасибо! Он также возвращает часть моих потерянных знаний.\"\n\n#. Key:\t2084B3DE4CDAC5B7B9018994EE4DFAA4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_85.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_85.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"The end is close, yet knowing what I am makes my last days brighter.\"\nmsgstr \"Конец близок, но знание того, кто я, делает мои последние дни ярче.\"\n\n#. Key:\t21883D3E4563FD95B13E8E8E25FB1D92\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_15.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_15.Children(0).Children.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Not my business\"\nmsgstr \"Меня это не касается\"\n\n#. Key:\t2362D7ED44CEEE8592C72BB41ECC0CC0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_77.Text\n#. Key:\t969AF9184296C419E484BA80FF80F15B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_76.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_76.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_77.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Do you know a girl called Lillian?\"\nmsgstr \"Знаешь ли ты девочку по имени Лилиан?\"\n\n#. Key:\t2362FF25427C7C664ACE9297A20F3C65\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_81.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_81.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Memory Crystals? Can I touch them?\"\nmsgstr \"Кристаллы Воспоминаний? Могу я их коснуться?\"\n\n#. Key:\t254431B64533FAD362B0AF93F8347842\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_119.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_119.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"You will find it if you reach the top of the Main Tower.\"\nmsgstr \"Ты найдешь его, если доберешься до вершины Главной Башни.\"\n\n#. Key:\t26664D3045EDCEC9C09E9CBA8515C088\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I don't know... I'm forced to do tasks for a wizard. I'm lost and confused.\"\nmsgstr \"Я не знаю... Я вынужден выполнять задания для волшебника. Я заблудился и запутался.\"\n\n#. Key:\t280BE2914A227E7350F067BCB4CC49AD\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_86.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_86.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Hmmm...\"\nmsgstr \"Хммм...\"\n\n#. Key:\t2B714CED45A868B1678C5E854160945E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_97.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_97.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Look, I have more crystals.\"\nmsgstr \"Смотри, у меня есть еще кристаллы.\"\n\n#. Key:\t2C052328496E84667F356F95F9F9C418\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"This is really not my problem. All I care about is to complete my task and go on my way.\"\nmsgstr \"Это на самом деле не моя проблема. Все, что меня волнует, это выполнить свою задачу и идти своим путем.\"\n\n#. Key:\t2C174523477E6720A5300DBFE343C3D8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_51.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_51.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I can no longer open a gate to the Unknown Realm.\"\nmsgstr \"Я больше не могу открывать врата в Неизвестное Царство.\"\n\n#. Key:\t2C7D234B4F377087E1D340986BD581AC\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_49.Text\n#. Key:\t417BB4E644EBC809C2489F85993A8E17\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_56.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_49.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_56.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"If you can summon Spirits you surely know a way to get me home.\"\nmsgstr \"Если ты можешь вызывать духов, ты наверняка знаешь, как вернуть меня домой.\"\n\n#. Key:\t2DE200934F6AC1595216AA8050FF8F30\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_67.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_67.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I won’t work with anything else.\"\nmsgstr \"Я больше ни с чем не буду работать.\"\n\n#. Key:\t2FC050C145CB19BD786157988C677AF5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(1).Children.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Bronze key\"\nmsgstr \"Бронзовый ключ\"\n\n#. Key:\t30AD4CBE4D6EFD170F43D9852A0CB50C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_108.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_108.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I can’t remember.\"\nmsgstr \"Я не могу вспомнить.\"\n\n#. Key:\t310B95624A8B2179F69A68BE2B0869C2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(4).Children.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(4).Children.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Making Golems?\"\nmsgstr \"Создание Големов?\"\n\n#. Key:\t311039514F83A0ED4BE47A98BF5AE48E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_107.Text\n#. Key:\t5D08D2404686BF1E5D48AC8C63096F0D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_104.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_104.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_107.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Thank you Spirit! I will be forever in your debt.\"\nmsgstr \"Спасибо, Дух! Я навсегда останусь в твоем долгу.\"\n\n#. Key:\t3140425845B595B02CA8D3B8DBC6CE37\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_38.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_38.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"It's done. They are destroyed.\"\nmsgstr \"Готово. Они уничтожены.\"\n\n#. Key:\t37835C204E4C4B17F2D55C9B23FD7D1E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_45.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_45.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"There is some kind of a connection between Ruin and the Spirits.\"\nmsgstr \"Есть какая-то связь между Руином и Духами.\"\n\n#. Key:\t384F5CB146C9B6E7EFD361964FF11735\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"A spirit of the Unknown was summoned here by a Wizard of another world.\"\nmsgstr \"Дух Неизвестного был вызван сюда Волшебником из другого мира.\"\n\n#. Key:\t398124A4493A7325B284CA8105354F0C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_35.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_35.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Yet now the only important thing is to finish my golems.\"\nmsgstr \"Но сейчас единственное, что важно - это закончить моих големов.\"\n\n#. Key:\t39C014784CA9DF8247D2DDA5587BAB20\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(5).Children.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(5).Children.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Get me home!\"\nmsgstr \"Верни меня домой!\"\n\n#. Key:\t3CE0431346C222ED2A6729AAEF8026DC\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(6).Children.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(6).Children.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"New body for me\"\nmsgstr \"Новое тело для меня\"\n\n#. Key:\t3DFB1F4D4BB673F983C8CDA4E9911BF2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_89.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_89.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Wait a minute! I’ll make something special for you.\"\nmsgstr \"Минуточку! Я сделаю что-нибудь особенное для тебя.\"\n\n#. Key:\t3F7C1850478A14857F4FFD9D41BA39FC\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_87.Text\n#. Key:\t79079CCD4BB2C6244D6D7CB04BD4C42F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_84.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_84.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_87.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Yes, now I remember. Thank you little Spirit for giving my memories back.\"\nmsgstr \"Да, теперь я вспомнил. Спасибо, маленький Дух, что вернул мне мои воспоминания.\"\n\n#. Key:\t3FAB7E8D4E72D1EED6E11EA54A128836\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(3).Children.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(3).Children.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Copper Key\"\nmsgstr \"Медный Ключ\"\n\n#. Key:\t419879C24D39534867F656B704C579AC\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_110.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_110.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Even without my memories I liked to talk to her.\"\nmsgstr \"Даже без моих воспоминаний мне нравилось с ней разговаривать.\"\n\n#. Key:\t41B08BF1417C041EB3ACAE8C09C44872\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_17.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_17.Children(1).Children.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"They will fall\"\nmsgstr \"Они падут\"\n\n#. Key:\t41E19A0C420F2BD87AA91AB475D5BB0C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_128.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_128.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Please, leave me alone now.\"\nmsgstr \"Пожалуйста, оставьте меня одного.\"\n\n#. Key:\t4438EF7A4D77A3314D2B6587DAE664AE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I can fix it!\"\nmsgstr \"Я могу это исправить!\"\n\n#. Key:\t46730E7C433AE7B987C61D9DDF0161E2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_52.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_52.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"How do you make Golems then?\"\nmsgstr \"Как же тогда ты создаешь Големов?\"\n\n#. Key:\t4816E7D14B256F62C2AFE0A3D5EC1987\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_113.Text\n#. Key:\tEC59F30D402E177B8C137DAA7A834F1A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_112.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_112.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_113.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I’m looking for three artefacts. Do you know something about them?\"\nmsgstr \"Я ищу три артефакта. Ты что-то знаешь о них?\"\n\n#. Key:\t49E3D8B84BD437A7195CB49B1C91A9B7\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_30.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_30.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"We created too many of them. Always new ones. We forgot about the old ones.\"\nmsgstr \"Мы создали чересчур много големов. Всегда новые. Забыв о старых.\"\n\n#. Key:\t4CDF7F734B65BFB6575D66A2E40B64B6\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"You wonder if Ruin will destroy their World as well...\"\nmsgstr \"Ты думаешь, что Руин уничтожит и их мир...\"\n\n#. Key:\t4FD5FE974E1B8142471F8896818E875C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"What do you need?\"\nmsgstr \"Что тебе нужно?\"\n\n#. Key:\t5000F3F44A899815A0D341A3494E42AB\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_91.Text\n#. Key:\t6D5127FD45C09B33329F0EB0DDCE67D7\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_93.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_91.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_93.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Thank you!\"\nmsgstr \"Спасибо!\"\n\n#. Key:\t50E6C4434BAC5A7F4B2C66BD8DB5E071\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_100.Text\n#. Key:\t64A5DE6941972506C0BECBB55BBE4FE5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_78.Text\n#. Key:\tB07790474D4C124CB72F128AE0FB2CC5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_95.Text\n#. Key:\tEF125F27496303716206D182C1ED460D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_39.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_100.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_39.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_78.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_95.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I think these crystals have something to do with you.\"\nmsgstr \"Я думаю, эти кристаллы как-то связаны с тобой.\"\n\n#. Key:\t51C200AD42FCE6888DBF8C8C24A02283\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"It shall be done.\"\nmsgstr \"Будет сделано.\"\n\n#. Key:\t52D4954E427C666F0F2F4A92F9BCFBC9\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_50.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_50.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I’m sorry but I can’t help you.\"\nmsgstr \"Прости, но я не могу тебе помочь.\"\n\n#. Key:\t5B1327C64C77C05C43CD728356DA4EC4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_58.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_58.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Knowledge lost. We are lost.\"\nmsgstr \"Знания потеряны. Мы потеряны.\"\n\n#. Key:\t5E7AD2034CECCF124DA4E19D94B96433\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"It's nothing. Here it is.\"\nmsgstr \"Это пустяки. Держи.\"\n\n#. Key:\t5FB1520B447246A1A8BCD3BDDB44D145\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_65.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_65.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"No.\"\nmsgstr \"Нет.\"\n\n#. Key:\t5FBF0F3F4419A6AD796054841902FA7C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"They can't work together even if they share the same goal.\"\nmsgstr \"Они не могут работать вместе, даже если у них одна цель.\"\n\n#. Key:\t60609E4049562CF11C05CB8DB96BBBB3\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"What do you mean by 'your creations'?\"\nmsgstr \"Что ты имеешь в виду под “твоими творениями”?\"\n\n#. Key:\t635D5E904325D51DFF19A1A862A3CC0B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_124.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_124.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"The Armour Wrath is no more.\"\nmsgstr \"Броневого Гнева больше нет.\"\n\n#. Key:\t6585CAC84326A3EEE1682789B7BB3CB6\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_10.Children(2).Children.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_10.Children(2).Children.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Your creation?\"\nmsgstr \"Твоё творение?\"\n\n#. Key:\t65C3735740E5D7AF76376AB2B7B05CE9\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(12).Children.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(12).Children.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Leave\"\nmsgstr \"Выйти\"\n\n#. Key:\t6A460D4A4751398E004298948D630BA4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_47.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_47.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I don’t think I will manage though. It’s already too late. But there is no reason to give up either.\"\nmsgstr \"Не думаю, что я справлюсь. Уже слишком поздно. Но и нет причин сдаваться.\"\n\n#. Key:\t6DC280B64766B5CB2049409B2F73CDB4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_40.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_40.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Is there a way I can help you?\"\nmsgstr \"Могу я чем-то помочь?\"\n\n#. Key:\t6DD3D7804417850FE8504286DD2B5D95\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_96.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_96.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"More Crystal? That's very kind.\"\nmsgstr \"Еще Кристалл? Очень любезно с твоей стороны.\"\n\n#. Key:\t6E9DB27A4207FFA8409F61AE45282D53\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_41.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_41.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I have found one more crystal.\"\nmsgstr \"Я нашел еще один кристалл.\"\n\n#. Key:\t717452044F194A1C30FA3C8FBB94C9BF\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_73.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_73.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I’ll see what I can do.\"\nmsgstr \"Я посмотрю, что можно сделать.\"\n\n#. Key:\t74670AB34D1A75913013BE8EE7C0B961\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_72.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_72.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I’ve already destroyed them.\"\nmsgstr \"Я их уже уничтожил.\"\n\n#. Key:\t752F67A54FA433AA588175AA7C64E367\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_43.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_43.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I try to create the perfect Golem. The one which resists Ruin.\"\nmsgstr \"Я пытаюсь создать идеального Голема. Того, который противостоит Руину.\"\n\n#. Key:\t775C2189498804DBED7D81AB3EFEC96F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(11).Children.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(11).Children.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Lillian\"\nmsgstr \"Лиллиан\"\n\n#. Key:\t78C78DDD456328181EBCC78B20F9573D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_122.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_122.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Some of them are still out there.\"\nmsgstr \"Некоторые из них все еще там.\"\n\n#. Key:\t7C7D08C340B478A9420331AD355B1FA5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_15.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_15.Children(1).Children.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Like you?\"\nmsgstr \"Как вы?\"\n\n#. Key:\t7DCEFFEC46523960D1453DA93F36CAA5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_111.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_111.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I don’t know why but I feel in some way you are bound to her.\"\nmsgstr \"Не знаю почему, но я чувствую, что ты в каком-то связан с ней.\"\n\n#. Key:\t7F44BD934784D4F3AA2C85985489590A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"A Wizard? So now the Human Realm's people are messing with Golem Technology.\"\nmsgstr \"Волшебник? Значит, теперь люди Человеческого Царства возятся с Големской Технологией.\"\n\n#. Key:\t80871D9C4CF37B5F2E7101B8A2565D73\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_70.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_70.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"It’s not safe for me to walk outside.\"\nmsgstr \"Мне небезопасно выходить на улицу.\"\n\n#. Key:\t83ACDDA4415211102DBE099F178B228B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_15.Children(2).Children.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_15.Children(2).Children.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"You mean Ruin\"\nmsgstr \"Ты имеешь в виду Руин\"\n\n#. Key:\t86B4FC23463D5507B11C3F826ADF6C7C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_10.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_10.Children(1).Children.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Spirit in a ball\"\nmsgstr \"Дух в шаре\"\n\n#. Key:\t88A6486843FEC6A2125F79B8AED93F74\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_99.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_99.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Now there is only a few missing.\"\nmsgstr \"Теперь не хватает только нескольких.\"\n\n#. Key:\t8C2169FA47F83CA62B19F083EFC398F5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_26.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_26.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"That is me. And what are you creature?\"\nmsgstr \"Это я. А ты что за существо?\"\n\n#. Key:\t8CC8368441F2CCDB0E7B22916F8A0622\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_88.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_88.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Getting back some of my lost knowledge also makes me feel happy.\"\nmsgstr \"И то что я получил обратно часть моих потерянных знаний также делает меня счастливым.\"\n\n#. Key:\t8E3399DA4F904AD46476418817CD78C4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_62.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_62.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Metal binds the will of the spirits. Rock is a bit less cruel but still weakens your will.\"\nmsgstr \"Металл связывает волю духов. Камень менее жесток, но все же ослабляет твою волю.\"\n\n#. Key:\t8F4BB43A4656EAD257920492E10BC764\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_130.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_130.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Yes, they bring back some of my memories.\"\nmsgstr \"Да, они возвращают некоторые из моих воспоминаний.\"\n\n#. Key:\t8F9DF3254A02EFF2E623DB91935A1529\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_123.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_123.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Come back when you found all of them.\"\nmsgstr \"Возвращайся, когда найдешь их всех.\"\n\n#. Key:\t97EE3A1B4AD2EB2E7ED2D1B1427E4A2A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_25.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_25.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"It's only me trying to recreate the perfect Golem.\"\nmsgstr \"Только я пытаюсь воссоздать идеального Голема.\"\n\n#. Key:\t99BCAE80415145460126B08933AE6242\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_118.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_118.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"One of the artefacts is close.\"\nmsgstr \"Один из артефактов близко.\"\n\n#. Key:\t9A05FD0845F9149CEB6EB8889EB9A686\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"That won't happen.\"\nmsgstr \"Этого не случится.\"\n\n#. Key:\t9B7BB6624923813EBF68C9BCE9FF8E49\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"There is nothing else I could say. See you later!\"\nmsgstr \"Мне больше нечего сказать. Увидимся!\"\n\n#. Key:\t9BEA36B448EC18A9280A5AAB78A46898\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_42.Text\n#. Key:\tD3AE25EC49FA7D2C78C1A382E5A01F28\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_37.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_37.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_42.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Why are you making Golems? What would you like to achieve?\"\nmsgstr \"Зачем ты создаешь Големов? Чего ты хочешь достичь?\"\n\n#. Key:\t9CC2CAF14E5C04555E7329B6EA5082E0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(0).Children.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Armour Wrath\"\nmsgstr \"Броневой Гнев\"\n\n#. Key:\t9EF4681A48ED6C909A4180BF823544BC\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(8).Children.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(8).Children.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Do you need help?\"\nmsgstr \"Тебе нужна помощь?\"\n\n#. Key:\t9F3BC08D46169E8C4BB788893FFDBCD4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_68.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_68.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Yes.\"\nmsgstr \"Да.\"\n\n#. Key:\tA10EF7404139EE7FE638BCA272C0B2CA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_71.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_71.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Destroy them if you can.\"\nmsgstr \"Уничтожь их, если можешь.\"\n\n#. Key:\tA13C1A6B4F187C1A3F682088B9CC9A6F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_23.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_23.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Didn't look too intelligent to me...\"\nmsgstr \"Не показались мне слишком умными...\"\n\n#. Key:\tA28429434B394861A6E4D084CE5C243F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_61.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_61.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I could but I don’t think you would like it.\"\nmsgstr \"Я мог бы, но не думаю, что тебе понравится.\"\n\n#. Key:\tA2CBB6914F66C9963AFD34A21378EAA7\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_103.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_103.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"With this last one I have all my memories back.\"\nmsgstr \"С этим, последним, все мои воспоминания вернулись.\"\n\n#. Key:\tA33780CE4B9EABF54F612DBFCEB4B890\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I wonder if they will end like us.\"\nmsgstr \"Интересно, кончат ли они так же, как мы.\"\n\n#. Key:\tA47024E844A13837A8FFFBB1EFA65633\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_44.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_44.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Though I forgot the reason.\"\nmsgstr \"Хотя я забыл причину.\"\n\n#. Key:\tA4E91A924BA53F0A000CDB9FC351DDBA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_60.Text\n#. Key:\tB4F5B2E6479E0E1ACDADD8A40E21FB98\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_59.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_59.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_60.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Could you create a stronger body for me?\"\nmsgstr \"Не мог бы ты создать более сильное тело для меня?\"\n\n#. Key:\tA50F6A7B4A65712F990406B84E2AE072\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_98.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_98.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Thank you! I remember more and more.\"\nmsgstr \"Спасибо! Я вспоминаю всё больше и больше.\"\n\n#. Key:\tA586F33F460BD066761AAEBD18666F78\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_82.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_82.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Bring me more so that I can remember!\"\nmsgstr \"Принеси мне еще, чтобы я мог вспомнить!\"\n\n#. Key:\tA8A9ACBA47419C57AAA06098F7F91AD3\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_83.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_83.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Let me touch it! Hmmm...\"\nmsgstr \"Дай мне прикоснуться! Хммм...\"\n\n#. Key:\tAA5F0D5541366675A1D1819FDBDFA569\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"What happened to you?\"\nmsgstr \"Что с вами случилось?\"\n\n#. Key:\tAD380C5F4F549229611DD9A79C7CD07E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_79.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_79.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"She was from the Human Realm. I liked her better than the other human.\"\nmsgstr \"Она была из Человеческого Царства. Она нравилась мне больше, чем другие люди.\"\n\n#. Key:\tAE0D1C714FFCFCA51ACCD3A01D6C7FF5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_125.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_125.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Yes, I felt his presence disappearing.\"\nmsgstr \"Да, я почувствовал, что его присутствие исчезает.\"\n\n#. Key:\tAE6B02664FEE60818E0D32B7939907F8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_106.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_106.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Now I have all my memories back.\"\nmsgstr \"Теперь все мои воспоминания вернулись.\"\n\n#. Key:\tB7638E004540ADC59420A5AA614C225D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_75.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_75.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I’ve destroyed the Golems near the Tomb.\"\nmsgstr \"Я уничтожил Големов возле Гробницы.\"\n\n#. Key:\tB86428C143F7BBBC4A7B9A91C05F3D15\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"They are doomed.\"\nmsgstr \"Они обречены.\"\n\n#. Key:\tBB7DE71F44FE995BA4AF4C9F5E19961F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_46.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_46.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I try to create an Essence which resists Ruin. If it works it could stop Ruin.\"\nmsgstr \"Я пытаюсь создать Сущность, которая противостоит Руину. Если это сработает, это может остановить Руин.\"\n\n#. Key:\tBCF49E21489280A32F859B9A6C2A78D4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"What are you creature?\"\nmsgstr \"Что ты за существо?\"\n\n#. Key:\tBDEEB7C2474E308C66B832B41D839FC6\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_66.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_66.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Metal is good for spirits. Even rock is dangerous.\"\nmsgstr \"Металл не так хорош для духов. Даже камень опасен.\"\n\n#. Key:\tC0CAE1B14D0B0E551B690FB9F178A6EE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(10).Children.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(10).Children.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Memory Crystals\"\nmsgstr \"Кристаллы Воспоминаний\"\n\n#. Key:\tC86A03B046B8F005B1C91EB0F68E4C1E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_121.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_121.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Here, take this! It might help if you need to face my creature!\"\nmsgstr \"Вот, возьми это! Это может помочь, если ты встретишься с моим творением!\"\n\n#. Key:\tCA35E144421C5594346DC9954052E633\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_57.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_57.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"No way home.\"\nmsgstr \"Домой дороги нет.\"\n\n#. Key:\tCD223717428DAF54F5362BB744B6A633\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_53.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_53.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I reuse the old golems. Maybe that’s why I can’t succeed.\"\nmsgstr \"Я повторно использую старые големы. Может быть, поэтому я не могу преуспеть.\"\n\n#. Key:\tD06BA0C54CAA8E00ECAFBE9FAFBABE1F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Could you merge these iron pieces?\"\nmsgstr \"Можешь соединить эти железные части?\"\n\n#. Key:\tD237C8514A69E0A7820941B9048B92DE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_90.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_90.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Here it is!\"\nmsgstr \"Вот!\"\n\n#. Key:\tD2CEAC3040B9EBE5A98F249F60A7DAAA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(2).Children.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(2).Children.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Iron Key\"\nmsgstr \"Железный Ключ\"\n\n#. Key:\tD935FD314471404BAECA54BC3227D6E2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_69.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_69.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"There are too many unsuccessful golems.\"\nmsgstr \"Существует слишком много неудавшихся големов.\"\n\n#. Key:\tDE3287A345E1E317061B45B64AAA0836\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_34.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_34.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Your words remind me of something. Something which was important.\"\nmsgstr \"Твои слова напоминают мне кое-что. Что-то, что было очень важно.\"\n\n#. Key:\tDEC8E5D548AECD6D48B449B51967301B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_115.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_115.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"One is guarded by my worst creation.\"\nmsgstr \"Один из них охраняется моим худшим творением.\"\n\n#. Key:\tDEFA219E40FE5384D8B1F0A1CFD3AAD4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_80.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_80.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"She were... She said...\"\nmsgstr \"Она была... Она сказала...\"\n\n#. Key:\tE13D5CCE41818BAC4A6E52A965B0AEF8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_101.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_101.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Look at this!\"\nmsgstr \"Ты только посмотри!\"\n\n#. Key:\tE1CB9ABE410B3C818283BB9325F3A456\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_32.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_32.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I create golems. You go on with your quest. Nothing else matters.\"\nmsgstr \"Я создаю големов. Ты продолжаешь свои поиски. Больше ничего не имеет значения.\"\n\n#. Key:\tE2AAAA4648BE8A7E73C761BDF72EC82D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_54.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_54.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Ruin caused too much damage.\"\nmsgstr \"Руин нанес слишком большой ущерб.\"\n\n#. Key:\tE483CAFF4F7EF5607AA0A58F47EEF892\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_31.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_31.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"You are right. We are what we do. That keeps us alive.\"\nmsgstr \"Ты прав. Мы - это то, что мы делаем. Это сохраняет нам жизнь.\"\n\n#. Key:\tE9899191454A678E7C61B0A55047A725\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_126.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_126.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I'm glad you managed to defeat him and yet...\"\nmsgstr \"Я рад, что тебе удалось победить его, и все же...\"\n\n#. Key:\tEA08D7B74E94A3D91DC825945916C312\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_102.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_102.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"One more Crystal for you!\"\nmsgstr \"Еще один Кристалл для тебя!\"\n\n#. Key:\tEAF5836D4D35812F14EABFA43C849947\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_117.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_117.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I know what you are up to. I would like to help but I fear I can’t do much.\"\nmsgstr \"Я знаю, что ты задумал. Я бы хотел помочь, но боюсь, что не смогу многого сделать.\"\n\n#. Key:\tEB0F70894E9A498111B9A9824589633B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I create Golems. I always did. I designed the most intelligent ones.\"\nmsgstr \"Я создаю Големов. Я всегда это делал. Я создал самых умных.\"\n\n#. Key:\tF0A1D18E463DCD0CADD67690F691481B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_27.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_27.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"There are some seeking a way to stop Ruin. They don't care about using spirits as slaves.\"\nmsgstr \"Есть те, кто ищет способ остановить Руин. Их не волнует использование духов в качестве рабов.\"\n\n#. Key:\tF10E8A9243616A85F71C01B0E57A2CC8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_105.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_105.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"And this is for you!\"\nmsgstr \"А это тебе!\"\n\n#. Key:\tF62B033A4054241E561B519B2AFFEBDB\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Do you mean those moving rock things out there?\"\nmsgstr \"Ты имеешь в виду те подвижные каменные штуки?\"\n\n#. Key:\tF783A4F44E12EDA97EDF08B60228ED06\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_109.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_109.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"She had heart, she cared about what’s going on here. For the others we were like some interesting study.\"\nmsgstr \"У нее было сердце, ее волновало, что здесь происходит. Для других мы были чем-то вроде интересного исследования.\"\n\n#. Key:\tF87968784C67FEEEBB78DBAD9D3C13F3\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_63.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_63.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"As for other materials I have no experience. Trust me you don’t want me to test out something on you for the first time.\"\nmsgstr \"Что касается других материалов, у меня нет опыта. Поверь мне, ты не хочешь, чтобы я испытал что-то на тебе в первый раз.\"\n\n#. Key:\tF9B8793C470BFE672214E1B82AE01B4E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_24.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_24.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Knowledge is lost. We are all lost.\"\nmsgstr \"Знания потеряны. Мы потеряны.\"\n\n#. Key:\tF9DB2D444ADAC7A5C22AEC914EC7955F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(7).Children.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(7).Children.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Artefacts\"\nmsgstr \"Артефакты\"\n\n#. Key:\tFE7749AB4C91684B3438E7A1B5BF32D9\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_29.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_29.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"They can't do as they plan. Some of them don't even believe Ruin.\"\nmsgstr \"Они не могут делать то, что планируют. Некоторые из них даже не верят в Руин.\"\n\n#. Key:\tFF2914834A91E2B6E8696FA828FC9F94\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_120.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_120.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Though it is guarded by the worst Golem I ever made: the Armour Wrath...\"\nmsgstr \"Хотя его охраняет худший Голем из всех, что я когда-либо создавал: Броневой Гнев...\"\n\n#. Key:\t303FE4BA4765B90E9239FEB43AE2264C\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/DwarvenCatacombs/DO1Altar.DO1Altar:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Wizard/DwarvenCatacombs/DO1Altar.DO1Altar:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_DO1Altar\"\nmsgid \"Under section 1 of the first Act, an action of worship can not be aimed at any entity, god or divinity other than the Law itself.\"\nmsgstr \"В соответствии с разделом 1 первого Закона, богослужение не может быть направлено против какого-либо образования, бога или божества, кроме самого Закона.\"\n\n#. Key:\t73BA4B474C4DCF6CD31469A9FF120D58\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/DwarvenCatacombs/DO1Altar1.DO1Altar1:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Wizard/DwarvenCatacombs/DO1Altar1.DO1Altar1:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_DO1Altar1\"\nmsgid \"Under section 2 of the first Act... ??? There is section 3 of the first act, one would assume.\"\nmsgstr \"В соответствии с разделом 2 первого акта... ???? Существует раздел 3 первого акта, можно предположить.\"\n\n#. Key:\t0D939EC3462DBDE895AD9F80CD4A9B99\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/DwarvenOutpost/DO1Arrive1DeadDwarves.DO1Arrive1DeadDwarves:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Wizard/DwarvenOutpost/DO1Arrive1DeadDwarves.DO1Arrive1DeadDwarves:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_DO1Arrive1DeadDwarves\"\nmsgid \"So they were the dwarfs who lived here.\"\nmsgstr \"Значит, это были гномы, которые здесь жили.\"\n\n#. Key:\t6E27805A491B0E0DEAC36F9189CA33F9\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/DwarvenOutpost/DO1Arrive1DeadDwarves.DO1Arrive1DeadDwarves:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Wizard/DwarvenOutpost/DO1Arrive1DeadDwarves.DO1Arrive1DeadDwarves:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_DO1Arrive1DeadDwarves\"\nmsgid \"I'm not sure why but I feel a bit of sorrow for them.\"\nmsgstr \"Не знаю, почему, но мне их немного жаль.\"\n\n#. Key:\t7AD20FC74D56D0EE48CB5F92804EDAE5\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/DwarvenOutpost/DO1Arrive1DeadDwarves.DO1Arrive1DeadDwarves:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Wizard/DwarvenOutpost/DO1Arrive1DeadDwarves.DO1Arrive1DeadDwarves:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_DO1Arrive1DeadDwarves\"\nmsgid \"I wonder how you can tell them apart.\"\nmsgstr \"Интересно, как ты можешь отличить их друг от друга.\"\n\n#. Key:\tA6EB230647E9F8D38877FCA10CDE4875\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/DwarvenOutpost/DO1Arrive1DeadDwarves.DO1Arrive1DeadDwarves:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Wizard/DwarvenOutpost/DO1Arrive1DeadDwarves.DO1Arrive1DeadDwarves:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_DO1Arrive1DeadDwarves\"\nmsgid \"I knew these ones. That's Gwin and Traga, there's Krug...\"\nmsgstr \"Я знал этих. Это Гвин и Трага, это Круг...\"\n\n#. Key:\t2858D4314420FB59E8BDC18DB625DC1F\n#. SourceLocation:\t/Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_6.SpeechSequence(1).SpeechSequence.Text\n#: /Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_6.SpeechSequence(1).SpeechSequence.Text\nmsgctxt \"Dialogue_DO1Gate\"\nmsgid \"I think you may mistranslated a word or two...\"\nmsgstr \"Я думаю, ты можешь неправильно перевести пару слов...\"\n\n#. Key:\t2C08483A26080F0A003A02ADBE7A7D64\n#. SourceLocation:\t/Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_7.SpeechSequence(2).SpeechSequence.Text\n#: /Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_7.SpeechSequence(2).SpeechSequence.Text\nmsgctxt \"Dialogue_DO1Gate\"\nmsgid \"Dwarven letters are so similar...\"\nmsgstr \"Буквы гномов так похожи между собой...\"\n\n#. Key:\t2C09D69026080F0A003A02ADBE7A7D4E\n#. SourceLocation:\t/Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_8.SpeechSequence(2).SpeechSequence.Text\n#: /Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_8.SpeechSequence(2).SpeechSequence.Text\nmsgctxt \"Dialogue_DO1Gate\"\nmsgid \"Dwarven language is stupid, these signs could mean anything!\"\nmsgstr \"Язык гномов дурацкий, эти знаки могут означать что угодно!\"\n\n#. Key:\t3D6EF5724190CE0AE579D69677BB8EAE\n#. SourceLocation:\t/Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_DO1Gate\"\nmsgid \"Associate!\"\nmsgstr \"Ассоциируй!\"\n\n#. Key:\t4758A32043FC23B4DC3D82B35EFB0D24\n#. SourceLocation:\t/Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_DO1Gate\"\nmsgid \"The Doors of Dwar — Lord of Dwartown. Speak, associate, and enter.\"\nmsgstr \"Двери Дуар - Лорд Дуартауна. Говори, ассоциируй и входи.\"\n\n#. Key:\t475CE3E94BA77F7596A7D8931D4D16C7\n#. SourceLocation:\t/Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_7.SpeechSequence(1).SpeechSequence.Text\n#: /Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_7.SpeechSequence(1).SpeechSequence.Text\nmsgctxt \"Dialogue_DO1Gate\"\nmsgid \"Are you sure that is what you just read?\"\nmsgstr \"Ты уверен, что это действительно то, что ты только что прочитал?\"\n\n#. Key:\t530C8841437C531647717B8B0BC07210\n#. SourceLocation:\t/Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_8.SpeechSequence(1).SpeechSequence.Text\n#: /Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_8.SpeechSequence(1).SpeechSequence.Text\nmsgctxt \"Dialogue_DO1Gate\"\nmsgid \"Nice try...\"\nmsgstr \"Неплохая попытка...\"\n\n#. Key:\t543858DE49FD03BF4F94C3BA47912E5E\n#. SourceLocation:\t/Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_9.SpeechSequence(1).SpeechSequence.Text\n#: /Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_9.SpeechSequence(1).SpeechSequence.Text\nmsgctxt \"Dialogue_DO1Gate\"\nmsgid \"I have to practice my Dwarven a bit more...!\"\nmsgstr \"Я должен чуть больше попрактиковаться в гномском языке...!\"\n\n#. Key:\t5923FB9C4DC255ABAA6059B64B806802\n#. SourceLocation:\t/Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_6.SpeechSequence(3).SpeechSequence.Text\n#: /Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_6.SpeechSequence(3).SpeechSequence.Text\nmsgctxt \"Dialogue_DO1Gate\"\nmsgid \"I am going to open this door somehow.\"\nmsgstr \"Я как-нибудь открою эту дверь.\"\n\n#. Key:\t7CF38D834DB6A7265EDE19AD158BFEBF\n#. SourceLocation:\t/Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_7.SpeechSequence(0).SpeechSequence.Text\n#: /Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_7.SpeechSequence(0).SpeechSequence.Text\nmsgctxt \"Dialogue_DO1Gate\"\nmsgid \"I want a Schnauser with my Wienerschnitzel\"\nmsgstr \"Я хочу Шнауцер с моим Шницелем\"\n\n#. Key:\t86311C104780BDB8A170538987EF7226\n#. SourceLocation:\t/Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_8.SpeechSequence(0).SpeechSequence.Text\n#: /Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_8.SpeechSequence(0).SpeechSequence.Text\nmsgctxt \"Dialogue_DO1Gate\"\nmsgid \"And on the day the Ball is set free, the gate opens and happiness finds everyone...\"\nmsgstr \"И в день, когда Шар освободится, врата откроются, и счастье найдет каждого...\"\n\n#. Key:\tCD68B2244B57CA37D2940499F440149B\n#. SourceLocation:\t/Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_DO1Gate\"\nmsgid \"Associwhat?\"\nmsgstr \"Ассоцичего?\"\n\n#. Key:\tCE8E75E6422C068794CC91BDBA2C024A\n#. SourceLocation:\t/Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_6.SpeechSequence(2).SpeechSequence.Text\n#: /Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_6.SpeechSequence(2).SpeechSequence.Text\nmsgctxt \"Dialogue_DO1Gate\"\nmsgid \"Damn, my Dwarven is just not good enough, I have to practice a bit more...\"\nmsgstr \"Черт, мой Гномский просто недостаточно хорош, мне нужно еще немного попрактиковаться...\"\n\n#. Key:\tCED9C6ED4B792FA939C759A79E4AB028\n#. SourceLocation:\t/Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_6.SpeechSequence(0).SpeechSequence.Text\n#: /Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_6.SpeechSequence(0).SpeechSequence.Text\nmsgctxt \"Dialogue_DO1Gate\"\nmsgid \"There is sauerkraut in my Lederhosen\"\nmsgstr \"В моих Ледерхозенах есть квашеная капуста\"\n\n#. Key:\tEC493B624D127AB87692BC983023FF18\n#. SourceLocation:\t/Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_7.SpeechSequence(3).SpeechSequence.Text\n#: /Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_7.SpeechSequence(3).SpeechSequence.Text\nmsgctxt \"Dialogue_DO1Gate\"\nmsgid \"There must be a way to open this door...\"\nmsgstr \"Должен же быть способ открыть эту дверь...\"\n\n#. Key:\t6F5AF3DD4E848650EE74449420A90A25\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/DwarvenCatacombs/DO1Tomb.DO1Tomb:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Wizard/DwarvenCatacombs/DO1Tomb.DO1Tomb:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_DO1Tomb\"\nmsgid \"These are the orders of the Chancellor of Dwartown, unjustly murdered by order of Duality.\"\nmsgstr \"Это приказы канцлера Дуартауна, несправедливо убитого по приказу Двойственности.\"\n\n#. Key:\t949EBB7A4FCEA61BB9B3589CFCC53C2B\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/DwarvenCatacombs/DO1Tomb1.DO1Tomb1:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Wizard/DwarvenCatacombs/DO1Tomb1.DO1Tomb1:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_DO1Tomb1\"\nmsgid \"Here lies the testament of the order of Duality, justly murdered by the Chancellor of Dwartown's spirit.\"\nmsgstr \"Здесь лежит завет ордена Двойственности, справедливо убитого духом канцлера Дуартауна.\"\n\n#. Key:\t110A2E27493EBAD78EE6E1B16F56912A\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E3/E3_Start.E3_Start:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E3/E3_Start.E3_Start:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_E3_Start\"\nmsgid \"I survived the Unknown. I know how to use the Device, but...\"\nmsgstr \"Я пережил Неизвестного. Я знаю, как пользоваться Устройством, но...\"\n\n#. Key:\t2CB853A540A2B5BFD268DEAA124CEAD0\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E3/E3_Start.E3_Start:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Ending/E3/E3_Start.E3_Start:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_E3_Start\"\nmsgid \"I need to choose one last time. Once and for all.\"\nmsgstr \"Мне нужно выбрать в последний раз. Раз и навсегда.\"\n\n#. Key:\t416D47B6408622D8D01F61961C80ADD2\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E3/E3_Start.E3_Start:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E3/E3_Start.E3_Start:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_E3_Start\"\nmsgid \"I have already lost almost everything.\"\nmsgstr \"Я уже почти все потерял.\"\n\n#. Key:\t75F863B843B253E3586DE991CDE546EA\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E3/E3_Start.E3_Start:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Ending/E3/E3_Start.E3_Start:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_E3_Start\"\nmsgid \"And here I am again. Is this how it will end?\"\nmsgstr \"И вот я снова здесь. Так все и закончится?\"\n\n#. Key:\t77BC194943A148967299F68B3522C696\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E3/E3_Start.E3_Start:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Ending/E3/E3_Start.E3_Start:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_E3_Start\"\nmsgid \"Do I really have to lose everyone I met in the Ruined Realm?\"\nmsgstr \"Неужели я должен потерять всех, кого встретил в Разрушенном Царстве?\"\n\n#. Key:\tA50B792A4D68EC45BB9C3CBBF8836021\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E3/E3_Start.E3_Start:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Ending/E3/E3_Start.E3_Start:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_E3_Start\"\nmsgid \"Or would I only save them so that we can die together?\"\nmsgstr \"Или я спасу их только для того, чтобы мы могли умереть вместе?\"\n\n#. Key:\tE43A08E14831EBDC50AFC0B4A3178817\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E3/E3_Start.E3_Start:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Ending/E3/E3_Start.E3_Start:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_E3_Start\"\nmsgid \"I can hear the people outside the tower. I don’t have much time.\"\nmsgstr \"Я слышу людей возле башни. У меня мало времени.\"\n\n#. Key:\t042B7F534C07B3EC75BA9BA8F0BA7926\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_5.Children(0).Children.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_5.Children(0).Children.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"Worthy?\"\nmsgstr \"Достойный?\"\n\n#. Key:\t05E334DE42BAA89837B78B8F0F1CBD93\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"Get some rest and try again later.\"\nmsgstr \"Отдохни немного и попробуй позже.\"\n\n#. Key:\t0BD769F745B35A106C7C0A83F6F9F246\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"All right so you just teleported me to this... what is this place?\"\nmsgstr \"Ладно, ты только что телепортировал меня в это... что это за место?\"\n\n#. Key:\t0C9ECC3745963AB1D1FB6487E97513F9\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_24.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_24.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"So right now this is the most proper place to test your Worthiness.\"\nmsgstr \"Сейчас это самое подходящее место для проверки твоей Достойности.\"\n\n#. Key:\t1401CBDA425076C6AE74C9BF4558D8DD\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"You are not Worthy!\"\nmsgstr \"Ты Недостоин!\"\n\n#. Key:\t21C3C1394F39821BC10FFFBE157AC5CF\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"Giving up is not an option.\"\nmsgstr \"Сдаться - это не выход.\"\n\n#. Key:\t2E7222EA4858A0ADE9CE3C84CA27B993\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_5.Children(3).Children.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_5.Children(3).Children.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"Skip\"\nmsgstr \"Пропустить\"\n\n#. Key:\t31BEA1764BA337B32B8038B31BE69C29\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"Farewell! I need to go now.\"\nmsgstr \"Пока! Мне пора идти.\"\n\n#. Key:\t36B9EA924E623AFE9BF0B98402235EA4\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"Focus on the trial!\"\nmsgstr \"Сосредоточься на испытании!\"\n\n#. Key:\t4A4A86684E5C5742A70FE383461AD89C\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"Venture further down into the Sewer! You will find the answer.\"\nmsgstr \"Спустись глубже в канализацию! Ты найдешь ответ.\"\n\n#. Key:\t54CA97394FDC12D0370C54995094819E\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"This trial will test your limits!\"\nmsgstr \"Это испытание проверит твои пределы!\"\n\n#. Key:\t5D820AA647AE2540DE6C2D8D6F6BF88A\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_5.Children(4).Children.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_5.Children(4).Children.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"Give seat\"\nmsgstr \"Дать стул\"\n\n#. Key:\t5F6629ED4E0857BBBA46ED9C51306215\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_5.Children(2).Children.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_5.Children(2).Children.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"Restore\"\nmsgstr \"Восстановить\"\n\n#. Key:\t618B587743F2F432D9D487AE0E909166\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"What?\"\nmsgstr \"Что?\"\n\n#. Key:\t61D61006436DD6659A8846932697971A\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"Yes, you are!\"\nmsgstr \"Да!\"\n\n#. Key:\t6225912A49C32068D10ADB9C31A6BA3E\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"Of course!\"\nmsgstr \"Конечно!\"\n\n#. Key:\t7DD5FF4D47DF6A461D44DDBA056A4100\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"I shall yield you to the right path!\"\nmsgstr \"Я наставлю тебя на правильный путь!\"\n\n#. Key:\t8C3F3A364544B13A2C6687A99E6A792B\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"I'm fed up with your trial! Just teleport me back.\"\nmsgstr \"Меня достало твое испытание! Просто телепортируй меня обратно.\"\n\n#. Key:\t903D03CE41FD835E75059587288D9A1B\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_23.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_23.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"There used to be an Arena here to test the Adventurers of the Realm, but it has been flooded with water for a hundred years.\"\nmsgstr \"Раньше здесь была Арена для испытаний “Приключенцев Царства“, но она под водой уже целый век.\"\n\n#. Key:\t96C9A8DA496C0A8476E35AB942BE5EED\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"Am I Worthy?\"\nmsgstr \"Достоин ли я?\"\n\n#. Key:\t9826B62E48A67772A1850CADF1A83729\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_5.Children(1).Children.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_5.Children(1).Children.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"Where are we?\"\nmsgstr \"Где мы?\"\n\n#. Key:\t9A94E4FC46E3896BE05136A2A9EA4AF5\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_27.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_27.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"We don't have time for this now.\"\nmsgstr \"У нас сейчас нет на это времени.\"\n\n#. Key:\t9B9B02AF404F9B8B9D8722A9006FC907\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"These are the remnants of the Ancient Sewer.\"\nmsgstr \"Это остатки Древней Канализации.\"\n\n#. Key:\tAAB9F101475D1407B58BECB2DA5E508D\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"So how am I supposed to complete your Trial?\"\nmsgstr \"И как же мне завершить твое испытание?\"\n\n#. Key:\tAD3BADD6499C01410511E68C86F337C8\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"Your Worthiness has to be proven.\"\nmsgstr \"Твое Достоинство должно быть доказано.\"\n\n#. Key:\tC0BA510B4875AD24C53663B01964B309\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"Go now, the Trial awaits you!\"\nmsgstr \"А теперь иди, Испытание ждет!\"\n\n#. Key:\tC252181740C4E256EDEB29B6B552BDD2\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"I'm tired, I will need some time to recover.\"\nmsgstr \"Я устал, мне нужно время, чтобы восстановиться.\"\n\n#. Key:\tCCD8D1DD4859B067482612A3A9F32C06\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_5.Children(5).Children.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_5.Children(5).Children.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"Leave\"\nmsgstr \"Выйти\"\n\n#. Key:\tCE0C3EBD41F17E82F8CF0E8D5E5E9F17\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"The Worthiness is strong in this one...\"\nmsgstr \"Достоинство сильно в нем...\"\n\n#. Key:\tD229B47146585D051BEFF493C53ED01B\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_26.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_26.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"Stop!\"\nmsgstr \"Стоп!\"\n\n#. Key:\tF043B1BF47F617255071EC9DB44CB78A\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"You have proven yourself Worthy!\"\nmsgstr \"Ты доказал, что Достоин!\"\n\n#. Key:\tFBBCA0E043F139F203D62DAD1599143E\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"Your Worthiness has been proven again!\"\nmsgstr \"Твое Достоинство было вновь доказано!\"\n\n#. Key:\tFE4F99AC4F23760ADD203083CA1497E3\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_25.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_25.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"I have found a...\"\nmsgstr \"Я нашел...\"\n\n#. Key:\t00AD8B3D44461E4DBF800F92DDF0C6F5\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_Gatekeeper_AfterBattle\"\nmsgid \"What?! I understand that for a new gate to open one would have to prove something, but... in this case... I accept that...\"\nmsgstr \"Что?! Я понимаю, что для открытия новых врат нужно что-то доказать, но... в данном случае...эх, ну ладно...\"\n\n#. Key:\t0EC6953C4F07CFF6B7A13A9BCF224550\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_Gatekeeper_AfterBattle\"\nmsgid \"Enough!\"\nmsgstr \"Довольно!\"\n\n#. Key:\t237714F14DC3F9D33F10E6B7761E47C4\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_Gatekeeper_AfterBattle\"\nmsgid \"What a coincidence! I also happen to be heading in that direction.\"\nmsgstr \"Какое совпадение! Я также направляюсь в этом направлении.\"\n\n#. Key:\t28054AA74F9CEA976E653ABF5A5F5695\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_Gatekeeper_AfterBattle\"\nmsgid \"You can pass.\"\nmsgstr \"Ты можешь пройти.\"\n\n#. Key:\t3D5BAB214968DBB31BE03EBE32B2DE6C\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_Gatekeeper_AfterBattle\"\nmsgid \"Farewell my Ball Lord! May the Great Gate open for you when the time comes!\"\nmsgstr \"Прощай, мой Боллорд! Пусть Великие Врата откроются перед тобой, когда наступит время!\"\n\n#. Key:\t4D497F814F476FFA7F2A66A937EAFF3E\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_Gatekeeper_AfterBattle\"\nmsgid \"Noooooo...\"\nmsgstr \"Нееееееет...\"\n\n#. Key:\t4FEA82084C2E2E09FE6699B2FB353E04\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_Gatekeeper_AfterBattle\"\nmsgid \"Could you just let me pass? Please?\"\nmsgstr \"Ты не мог бы просто дать мне пройти? Пожалуйста?\"\n\n#. Key:\t50005F6248946893250282B0B7D134F2\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_Gatekeeper_AfterBattle\"\nmsgid \"You have proved your Worthiness.\"\nmsgstr \"Ты доказал свое Достоинство.\"\n\n#. Key:\t601E1BAC4E9C7A93B7A97AA787C14027\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_Gatekeeper_AfterBattle\"\nmsgid \"Farewell, Keeper!\"\nmsgstr \"Прощай, Хранитель!\"\n\n#. Key:\t758788864E716DB2EC9F57B3042DC129\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_Gatekeeper_AfterBattle\"\nmsgid \"Ask him to take you to Crossroad Cave.\"\nmsgstr \"Попроси его перенести тебя в Пещеру Кроссроуд.\"\n\n#. Key:\t8170CF2C42A1894899BA98B33AB39A3F\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_Gatekeeper_AfterBattle\"\nmsgid \"Wait! What?\"\nmsgstr \"Постой! Что?\"\n\n#. Key:\t86B7E3D34F2206BB44B0F88001F9E8BA\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_Gatekeeper_AfterBattle\"\nmsgid \"Then if you accept, let the trial begin!\"\nmsgstr \"Тогда, если ты согласен, пусть начнется испытание!\"\n\n#. Key:\tCC7215014B87E0910413F1AEECE0492F\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_Gatekeeper_AfterBattle\"\nmsgid \"Where do you want to go, Sir? Command me.\"\nmsgstr \"Куда Вы хотите пойти, сэр? Приказывайте.\"\n\n#. Key:\tD5FBCE5C4C97766EF3A852A2D96D1D30\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_Gatekeeper_AfterBattle\"\nmsgid \"Crossroad Cave!\"\nmsgstr \"Пещера Кроссроуд\"\n\n#. Key:\tE0032A09440BDE56BFAF2CBDBCFA2074\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_Gatekeeper_AfterBattle\"\nmsgid \"So be it!\"\nmsgstr \"Да будет так!\"\n\n#. Key:\tE8148F28483300CCD24473A30C028235\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_Gatekeeper_AfterBattle\"\nmsgid \"Once you have proven Worthy.\"\nmsgstr \"Как только ты докажешь, что достоин.\"\n\n#. Key:\t0BE62CA44198CAA4B4AF7D844B79EEC3\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_3.Children(2).Children.Text\n#. Key:\t17D2B5D7409FBE7F215265B5A8CBF8F8\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_21.Children(2).Children.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_21.Children(2).Children.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_3.Children(2).Children.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"Leave\"\nmsgstr \"Выйти\"\n\n#. Key:\t2BFD355626080F0A003A025ABE793045\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_21.Children(0).Children.Text\n#. Key:\t2BFEA3D826080F0A003A025ABE79300B\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_3.Children(0).Children.Text\n#. Key:\t2C027C7626080F0A003A025ABE793F5F\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_18.Children(0).Children.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_18.Children(0).Children.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_21.Children(0).Children.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_3.Children(0).Children.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"Accept Challenge\"\nmsgstr \"Принять Вызов\"\n\n#. Key:\t2EDD3BEF4707FD59FE1ACB9A105F7EFC\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_3.Children(1).Children.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_3.Children(1).Children.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"Give seat\"\nmsgstr \"Дать стул\"\n\n#. Key:\t4E4229704C95B2C73050E1AF65A29847\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"Did you come back to prove yourself?\"\nmsgstr \"Ты вернулся, чтобы проявить себя?\"\n\n#. Key:\t55B70B0345422648BB579C8D4E42FE86\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_18.Children(1).Children.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_18.Children(1).Children.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"Maybe later\"\nmsgstr \"Может, позже\"\n\n#. Key:\t62E33EC84A508E57233A6A9AF6DCDFBC\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"Only if you prove yourself worthy one more time.\"\nmsgstr \"Только если ты еще раз докажешь, что достоин.\"\n\n#. Key:\t65A8C3BA420B4624960CBAB42930BB5F\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_13.Children(0).Children.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_13.Children(0).Children.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"Not fair\"\nmsgstr \"Нечестно\"\n\n#. Key:\t688C407641B488D0FDC7F98D0F6CA826\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"Is that... is this really happening?\"\nmsgstr \"Это... это на самом деле происходит?\"\n\n#. Key:\t77A739594D7ADA997DD300A7EE270D8F\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"I have found a seat that fits your size.\"\nmsgstr \"Я нашел стул, который подойдет тебе по размеру.\"\n\n#. Key:\t8C9BCD2044EE9C5F4826D0B5C5CE22D4\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"Now... are you ready to prove yourself?\"\nmsgstr \"Теперь... готов ли ты проявить себя?\"\n\n#. Key:\t8E33C12A42E9EAEDC20CD3B97F3AF9B2\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"Yes, I can.\"\nmsgstr \"Да, я могу.\"\n\n#. Key:\t91849BD64325E5B9D8A366921D4D1AA9\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"The best challenges were set aside just for you!\"\nmsgstr \"Только для тебя были созданы лучшие испытания!\"\n\n#. Key:\t97D5940549A753A94A9F5AB46CCE14AF\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"I myself shall test your worthiness.\"\nmsgstr \"Я сам проверю твое достоинство.\"\n\n#. Key:\t9A158FA74FF1D9F99F5477856927AC90\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"I will make no exceptions! Your generous act gave me back my spirit. From now on I pledge to perform my task even better.\"\nmsgstr \"Я не буду делать никаких исключений! Твой щедрый поступок вернул мне мой настрой. Отныне я обязуюсь выполнять свою задачу еще лучше.\"\n\n#. Key:\tA3863AD64404451005ECE392B123FFAE\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"Errr... maybe a bit later.\"\nmsgstr \"Эээ... может, чуть позже.\"\n\n#. Key:\tAB2F0FFA45E0AF42B6035FA3D1F2D8DB\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"I am truly impressed. I will never forget about your kindness.\"\nmsgstr \"Я поистине впечатлен. Я никогда не забуду о твоей доброте.\"\n\n#. Key:\tB284259646C0236570CF489DDCD88A29\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"Are you ready to prove yourself?\"\nmsgstr \"Готов ли ты проявить себя?\"\n\n#. Key:\tB57F0D0442C167DADE576A9CBD2B3E96\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"Thank you! You can have this RuneStone as a compensation.\"\nmsgstr \"Спасибо! В качестве компенсации можешь взять этот Рунический камень.\"\n\n#. Key:\tB5F8117A4514A4207059EF8CD1C59420\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"All right, let's do it!\"\nmsgstr \"Хорошо, давай сделаем это!\"\n\n#. Key:\tC7DFED0F43E17F90C02E3D94D6F24200\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"What? Can't you just open that gate?\"\nmsgstr \"Что? Нельзя ли просто открыть эти врата?\"\n\n#. Key:\tCC1CBB8E4F710B337B3BCC8CB01DB8CE\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"Well that's very... kind of you, I guess.\"\nmsgstr \"Ну, это очень... любезно с твоей стороны, наверное.\"\n\n#. Key:\tDE0225744DA0777DC12392ABB187D653\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"Keeper! Can you open a Portal?\"\nmsgstr \"Хранитель! Можешь ли ты открыть портал?\"\n\n#. Key:\tDF53D02F4A6CD307A559E5BADBEF22FA\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_13.Children(1).Children.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_13.Children(1).Children.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"You are welcome\"\nmsgstr \"Пожалуйста\"\n\n#. Key:\tF0A6481A46B5FC65944D35ABFE94FA7E\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_21.Children(1).Children.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_21.Children(1).Children.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"Give Seat\"\nmsgstr \"Дать стул\"\n\n#. Key:\tFF3C850143B6609D7B1B878B8DEB8A13\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"This is your final trial.\"\nmsgstr \"Это твое последнее испытание.\"\n\n#. Key:\t018CF7BC4272B09AF7B646B0F9B2EB11\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_55.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_55.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"How did it happen? How was everything destroyed?\"\nmsgstr \"Как это случилось? Как все было уничтожено?\"\n\n#. Key:\t0BF674C94942E4E32FCB09BD7E7059B0\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_23.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_23.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"Those who stayed died.\"\nmsgstr \"Те, кто остались, умерли.\"\n\n#. Key:\t1BFE1DBE471281F60970F8BEBFDD6E40\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"It’s nice of the Mirror that he still remembers me. Could you give this flower to him to express my thankfulness?\"\nmsgstr \"Очень мило, что Зеркало все еще помнит меня. Можешь подарить ему этот цветок, в знак моей благодарности?\"\n\n#. Key:\t2158D7A1470944D529FF138AB883DC10\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"Who lived in this Realm? Where are they now?\"\nmsgstr \"Кто жил в этом Царстве? Где они все сейчас?\"\n\n#. Key:\t2CCCBA97402EEFD5248D929680B0FF01\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_26.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_26.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"What was the Realm like before?\"\nmsgstr \"Каким было это Царство до этого?\"\n\n#. Key:\t32DA4503499D5A01CB1E7DA7B51B4EB5\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_29.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_29.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"Majestic castles and towers up until the sky. The air fresh, the sun shining.\"\nmsgstr \"Величественные замки и башни до неба. Воздух свежий, солнце светило.\"\n\n#. Key:\t35903E9F471EECEC779D879565E189B6\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_12.Children(1).Children.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_12.Children(1).Children.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"Who lived here?\"\nmsgstr \"Кто жил здесь?\"\n\n#. Key:\t3AD2CA8148AA6397B3D8818063269D67\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_14.Children(1).Children.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_14.Children(1).Children.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"No way\"\nmsgstr \"Ни за что\"\n\n#. Key:\t3D4AF37842FD602384F0C79F2949BD07\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_14.Children(0).Children.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_14.Children(0).Children.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"Of course\"\nmsgstr \"Конечно\"\n\n#. Key:\t41B0D00048A85B7122834B8F731AA8B4\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_25.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_25.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"Ruin preserves them. They can’t get old and die. Some of them are still visiting these parts of the Realm, but they no longer know what they are looking for.\"\nmsgstr \"Руин хранит их. Они не могут состариться и умереть. Некоторые из них все еще посещают эти части Царства, но они больше не знают, что они ищут.\"\n\n#. Key:\t47D0395F4DD63A6E2F68018719DC2CCD\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"Thank you!\"\nmsgstr \"Спасибо!\"\n\n#. Key:\t57614F674FD8F9A5CF8CC0AFA4D57F37\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_12.Children(0).Children.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_12.Children(0).Children.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"Magic Mirror\"\nmsgstr \"Волшебное Зеркало\"\n\n#. Key:\t5B00385B409CA39C5F2AFDA0E75EC4A0\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"I'm not a postman. Find someone else!\"\nmsgstr \"Я не почтальон. Найди кого-нибудь другого!\"\n\n#. Key:\t5C83B0604CB1616D07BE209C08AE57B6\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_27.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_27.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"It was a wonderful world, full of life and joy.\"\nmsgstr \"Это был прекрасный мир, полный жизни и радости.\"\n\n#. Key:\t66409DBC4D55F6190D6F429F81CE7C0F\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_12.Children(2).Children.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_12.Children(2).Children.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"Realm's past\"\nmsgstr \"Прошлое Царства\"\n\n#. Key:\t6728BD15433EBCF47B42DA8D84F3777C\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"I'll remember you!\"\nmsgstr \"Я запомню тебя!\"\n\n#. Key:\t764C9E864C4C345638C2A2B4019CE5FA\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"Sure, I will deliver the flower!\"\nmsgstr \"Конечно, я передам цветок!\"\n\n#. Key:\t7F42828D4976A3366581BE9E067F3982\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_24.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_24.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"Those who escaped changed in body and mind.\"\nmsgstr \"Те, кто сбежал, изменились телом и разумом.\"\n\n#. Key:\t858E8AD741D48CFB58B94ABA5A6FCE9A\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"No problem. It doesn’t matter anyway.\"\nmsgstr \"Нет проблем. Это все равно не имеет значения.\"\n\n#. Key:\t86DBF2164E3B1C4057320E8FC526AE5F\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_12.Children(3).Children.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_12.Children(3).Children.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"Cataclysm\"\nmsgstr \"Катаклизм\"\n\n#. Key:\t8C0E746A4C00A7B4792706A042588AA3\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_58.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_58.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"Until one day many of the imprisoned spirits broke loose from the golem bodies.\"\nmsgstr \"Пока однажды многие из заключенных духов не вырвались из тел големов.\"\n\n#. Key:\t8DCB54DC429D8E328B791FA18261EBE4\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_30.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_30.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"Until it was all gone.\"\nmsgstr \"Пока все не исчезло.\"\n\n#. Key:\t933737274ACAC51A980A6985E9B985D2\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"I am here so that the past is not forgotten until the very end. Have some rest and remember!\"\nmsgstr \"Я здесь, чтобы прошлое не было забыто. Отдохни и вспомни!\"\n\n#. Key:\t9A6C35C143F4B6845772D4AF6C4C6213\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_56.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_56.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"The Golem Makers went too far. They made thousands and thousands of golems.\"\nmsgstr \"Големские Создатели зашли слишком далеко. Они сделали тысячи и тысячи големов.\"\n\n#. Key:\t9E254E4D4CA6D256A7EC8CA8ADC6EF19\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"Would you like to hear some other tales?\"\nmsgstr \"Хочешь услышать другие истории?\"\n\n#. Key:\tAC50E6794072B525FD9144AB9B722F74\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_57.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_57.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"They always cared about the new ones and forgot about the obsolete ones.\"\nmsgstr \"Они всегда заботились о новых и позабыли об уже существующих.\"\n\n#. Key:\tC03F20E6477984A6691145A40535FBBD\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_60.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_60.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"Is there anything else you want me to remember?\"\nmsgstr \"Хочешь, чтобы я еще что-нибудь вспомнила?\"\n\n#. Key:\tC9E74A374ED9F47999AA56BD16466899\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"The streets were clear and bright, trees and flowers everywhere.\"\nmsgstr \"Улицы были чистыми и светлыми, деревья и цветы повсюду.\"\n\n#. Key:\tCF0209FF4BC57A750F52F2B3CC710A6E\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"I think it likes you.\"\nmsgstr \"Я думаю, ты ему нравишься.\"\n\n#. Key:\tD11D82FA4AE733D55DCBA692A2A3C0C7\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"Now they are all gone.\"\nmsgstr \"Теперь они все исчезли.\"\n\n#. Key:\tD88C72AE460756D4B619D7B8F924C7BB\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"Oh, there were many: proud, wise, brave, clever and majestic.\"\nmsgstr \"О, их было много: гордые, мудрые, храбрые, умные и величественные.\"\n\n#. Key:\tDEA408E54892798F0112B0A92EE34D3A\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_12.Children(4).Children.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_12.Children(4).Children.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"Leave\"\nmsgstr \"Выйти\"\n\n#. Key:\tEA384D06419AAB835765CF8D6ECE6495\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_59.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_59.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"They are what is now called Ruin. The power which is destroying the Realm.\"\nmsgstr \"Они то, что сейчас называется “Руин”. Сила, которая разрушает Царство.\"\n\n#. Key:\tED8571C94BCCF0F083CAD2A7439C10AA\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"I’ve met with a Magic Mirror who showed a picture of you.\"\nmsgstr \"Я встретился с Волшебным Зеркалом, которое показало твою фотографию.\"\n\n#. Key:\tF5C7F8254D29767753AEA3AB446B9B6E\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"I've got to go now.\"\nmsgstr \"Мне пора идти.\"\n\n#. Key:\tF9E140154471CC466095ADBFF652E94D\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"Ask if you need to know more. I'll remember.\"\nmsgstr \"Спрашивай, если тебе нужно знать что-то еще. Я вспомню.\"\n\n#. Key:\t04527B3745611117185CC09C4CD9018E\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"That’s more like it!\"\nmsgstr \"Так-то лучше!\"\n\n#. Key:\t11C31D4D4DFD60259D68FCB3CD8E641E\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_13.Children(2).Children.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_13.Children(2).Children.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"Retreat\"\nmsgstr \"Отступить\"\n\n#. Key:\t29C3FE594DDD364CEED5EA9304BFAC43\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"How can I prove that I'm worthy?\"\nmsgstr \"Как я могу доказать, что я достоин?\"\n\n#. Key:\t2BC9EBB6451DB66B7767F1A0B663A06D\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"That’s awful, let’s try it in a different tone.\"\nmsgstr \"Это ужасно, давай попробуем в другом тоне.\"\n\n#. Key:\t2BD75DF026080F0A003A0178BE75C345\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"Behold traveler!\"\nmsgstr \"Остановись странник!\"\n\n#. Key:\t302884BD4A306FB9614C51AF4790FAE4\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_13.Children(0).Children.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_13.Children(0).Children.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"How to prove?\"\nmsgstr \"Как доказать?\"\n\n#. Key:\t370AC3D04CB9F6E443CAC2A8E270F289\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"No problem I don't really want to pass that gate anyway.\"\nmsgstr \"Нет проблем, я все равно не хочу туда идти.\"\n\n#. Key:\t4E231ED94F0794AE6342A8A2C7644D51\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"I am the Gatekeeper. I will only open this door if you prove to be worthy.\"\nmsgstr \"Я Хранитель Врат. Я открою эти врата только если ты докажешь, что ты достоин.\"\n\n#. Key:\t4F30265A4D22C52371CC8E9E188B2718\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"Open, now!\"\nmsgstr \"Открывай, сейчас же!\"\n\n#. Key:\t56B5D73646C6823598232BB3D2577305\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"Ask him to open the door.\"\nmsgstr \"Попроси его открыть врата.\"\n\n#. Key:\t7A52E2E14341A8CDBD77A4A30DDA22E3\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_13.Children(1).Children.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_13.Children(1).Children.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"Please let me in\"\nmsgstr \"Пожалуйста, впустите меня\"\n\n#. Key:\t835098BD4F5D14FAACF1209850607E04\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_15.Children(0).Children.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_15.Children(0).Children.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"Accept Challenge.\"\nmsgstr \"Принять Вызов.\"\n\n#. Key:\t83E15A3C46A1D2D4CE4FDDBE81130106\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"No way! Nobody can skip the Trial!\"\nmsgstr \"Ни за что! Никто не может пропустить испытание!\"\n\n#. Key:\t86D9667C43253BBFFA43E4ABED24369B\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"Still not...\"\nmsgstr \"Все еще нет...\"\n\n#. Key:\t94A0124A401BA0CD029255B7D01E087E\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"There is no turning back now. The Trial awaits you!\"\nmsgstr \"Обратного пути нет. Испытание ждет тебя!\"\n\n#. Key:\t964E5DC7491720F8C3EA53936CBC1DEA\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"The Trial will test you!\"\nmsgstr \"Испытание покажет это!\"\n\n#. Key:\tA38AC02A4C258F538AC26686207D505F\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"...\"\nmsgstr \"...\"\n\n#. Key:\tABA8061E4F631608D712A0BDBC6D90D1\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"Ah, you can't speak! Hmm... Try now!\"\nmsgstr \"Ах, ты не можешь говорить! Хмм... Попробуй сейчас!\"\n\n#. Key:\tDA4C66AB4F7798DAD95EC5B83D422A03\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"Could you just let me pass this time?\"\nmsgstr \"Не можешь ли ты просто дать мне пройти на этот раз?\"\n\n#. Key:\tF09A0C3F4BEA6AFBC9EE52AEB6A740AB\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"Open that gate, Keeper!\"\nmsgstr \"Открой врата, Хранитель!\"\n\n#. Key:\tF32B1FEC4BB33670D336D28832F04312\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"I can only open this door for those who prove worthy.\"\nmsgstr \"Я могу открыть эти врота только тем, кто докажет, что достоин.\"\n\n#. Key:\tFB74F24C4B8C2E6B4368B19D77F71606\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"Please, open the...\"\nmsgstr \"Пожалуйста, открой...\"\n\n#. Key:\t0BAD4DEA4009823275249FB31070D002\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_7.Children(1).Children.Text\n#. Key:\t2F2169444BBDC9843E1B7DAEDE7F5104\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_4.Children(1).Children.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_4.Children(1).Children.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_7.Children(1).Children.Text\nmsgctxt \"Dialogue_GGGateKeeper2\"\nmsgid \"Leave\"\nmsgstr \"Выйти\"\n\n#. Key:\t36FDC8384686644248F76B9EF8A22038\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_GGGateKeeper2\"\nmsgid \"Here we go again...\"\nmsgstr \"Ну вот, опять...\"\n\n#. Key:\t3D7557464E3E19A1CF3447B555D4977D\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_GGGateKeeper2\"\nmsgid \"Well, of course.\"\nmsgstr \"Ну, конечно.\"\n\n#. Key:\t5463C10D4C56C2CD40338A9E5C33D995\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_GGGateKeeper2\"\nmsgid \"You know the rules.\"\nmsgstr \"Ты знаешь правила.\"\n\n#. Key:\t6E1915BC4A79E949C10BDCAADDA1E481\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_7.Children(0).Children.Text\n#. Key:\tACC5EBF441036AE06D207281CBE054D9\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_4.Children(0).Children.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_4.Children(0).Children.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_7.Children(0).Children.Text\nmsgctxt \"Dialogue_GGGateKeeper2\"\nmsgid \"Accept Challenge\"\nmsgstr \"Принять Вызов\"\n\n#. Key:\tA5CD165646DA7D531D23F7AAE5B0D701\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_GGGateKeeper2\"\nmsgid \"I mean: You shall not pass unless you prove yourself worthy!\"\nmsgstr \"В смысле..: Ты не пройдешь, пока не докажешь, что достоин!\"\n\n#. Key:\tBABC111D4B5743B296E6AD84659E1910\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_GGGateKeeper2\"\nmsgid \"You shall not pass!!\"\nmsgstr \"Тебе не пройти!\"\n\n#. Key:\tCAF6CA2C4159145B5FE684995956F155\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_GGGateKeeper2\"\nmsgid \"What?? I thought I will need to prove myself worthy.\"\nmsgstr \"Что? Я думал, что мне нужно будет доказать, что я достоин.\"\n\n#. Key:\t31B0B4214FE4324029BAB2A75CF7D1EA\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/GGSurviverNote.GGSurviverNote:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/GGSurviverNote.GGSurviverNote:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_GGSurviverNote\"\nmsgid \"'I made this statue to give me shelter from the Cataclysm. Only magic can keep it away.'\"\nmsgstr \"“Я построил эту статую, чтобы укрыться от катаклизма. Только магия может удержать его подальше”.\"\n\n#. Key:\t852F18354CA9C8D46192CBBD14A325F7\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/GGSurviverNote.GGSurviverNote:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/GGSurviverNote.GGSurviverNote:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_GGSurviverNote\"\nmsgid \"'Cerulean is still safe. I managed to steal the Gem to open the Gate but I can’t use it.'\"\nmsgstr \"“Лазурный город все еще в безопасности. Мне удалось украсть Самоцвет, чтобы открыть Врата, но я не могу им воспользоваться.”\"\n\n#. Key:\tDF72F90C478E18CFE9211C85CEF9ECBF\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/GGSurviverNote.GGSurviverNote:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/GGSurviverNote.GGSurviverNote:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_GGSurviverNote\"\nmsgid \"'I am doomed.'\"\nmsgstr \"“Я обречен”.\"\n\n#. Key:\t04737EC246700D406DAB46BE8091D09C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_1.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_1.Children(0).Children.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Sure\"\nmsgstr \"Конечно\"\n\n#. Key:\t09BB4D9F428A5390E5F2ABA019B3ACDC\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_34.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_34.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Help you?! This is a courthouse not some charity club!\"\nmsgstr \"Помочь тебе?! Это здание суда, а не какой-то благотворительный клуб!\"\n\n#. Key:\t0C7D87814BD76EAFE2DCB19B973F0D82\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_52.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_52.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"You know I heavily rely on my abacus. But being a ghost and all I can’t really use it.\"\nmsgstr \"Знаешь, я очень сильно полагаюсь на свой абакус. Но будучи призраком, я не могу его использовать.\"\n\n#. Key:\t0E3535844D16D540C576AC9889D237C8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"I’m looking for three artefacts. Do you know anything about them?\"\nmsgstr \"Я ищу три артефакта. Ты что-нибудь о них знаешь?\"\n\n#. Key:\t0EB00CBB41338DE6294D6EAC2DE999B4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Actually it’s kinda awesome!\"\nmsgstr \"Вообще-то, это здорово!\"\n\n#. Key:\t158F86F04D0040AA3D2814A674252E45\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Returning again and again is not a crime but maybe we should reconsider the Law regarding this statement.\"\nmsgstr \"Возвращаться снова и снова не является преступлением, но, возможно, нам следует пересмотреть Закон относительно этого заявления.\"\n\n#. Key:\t15D395F84D3DBC3CCBC74988369A74DA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_27.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_27.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"The Law says many things about being dad but nothing about being dead...\"\nmsgstr \"Закон говорит многое о отцах, но ничего о мертвых...\"\n\n#. Key:\t2487D3CC4FCE404BEC866287E2057B3F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"I can’t rest until the Case is solved.\"\nmsgstr \"Я не могу отдыхать, пока Дело не будет закрыто.\"\n\n#. Key:\t2D976CD148FB41389A53ED8E499822B4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_54.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_54.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Could you get me a ghost abacus?\"\nmsgstr \"Можешь принести мне призрачный абакус?\"\n\n#. Key:\t2F25CC2042D67E3AFB6F3FB5E1DF624D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_38.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_38.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Sure whatever...\"\nmsgstr \"Ладно, неважно...\"\n\n#. Key:\t344253F4469C163E87496A97C193F0A8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_31.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_31.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"If you found her please escort her to the Room of the Law so that her vicious acts can be judged.\"\nmsgstr \"Если ты нашел ее, пожалуйста, проводите ее в Зал Законов, чтобы ее злодеяния были осуждены.\"\n\n#. Key:\t34D243A343CDFEA68F2FAB88A4190464\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_5.Children(2).Children.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_5.Children(2).Children.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"You are dead\"\nmsgstr \"Ты мертв\"\n\n#. Key:\t367BD6CD40B7364D09A19A9F5F833937\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Could you help me? I'm forced into this Realm by a Wizard.\"\nmsgstr \"Ты можешь мне помочь? Волшебник заставил меня отправиться в это царство.\"\n\n#. Key:\t3BD4BD5742532C2DB9536F9540EA3D75\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_32.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_32.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Ah, even the World will be over sooner than all our cases.\"\nmsgstr \"Даже Конец Мира наступит раньше, чем все наши судебные процессы будут закрыты.\"\n\n#. Key:\t45882C3C4470919D71E321BF5E1183B9\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_56.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_56.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"I've made you a Ghost Abacus.\"\nmsgstr \"Я сделал тебе Призрачный Абакус.\"\n\n#. Key:\t482C838F4E946005A3E4CAAB80DFE37F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_35.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_35.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"And being a Wizard is strictly forbidden! If I manage to prove you have some connection with that criminal Wizard I will judge you as well!\"\nmsgstr \"И быть Волшебником строго запрещено! Если мне удастся доказать, что у тебя есть какая-то связь с этим преступным Волшебником, я тебя тоже засужу!\"\n\n#. Key:\t489CE6C840D8C3430F07FCBC8BAF3F6B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_23.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_23.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"The Law never writes it would be forbidden to be a walking ball. Therefore it is not a problem.\"\nmsgstr \"В законе ничего не сказано о том, что нельзя быть ходячим шаром. Поэтому это не проблема.\"\n\n#. Key:\t512723AF4B51C5A843BEACBEA5427877\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Staring like that is strictly forbidden!\"\nmsgstr \"Так смотреть строго запрещено!\"\n\n#. Key:\t5215675A4B0974C8993858B9F5D6A404\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"The Case of the Gnome traveller. A really complicated one.\"\nmsgstr \"Дело о Карлике-Путешественнике. Очень запутанное.\"\n\n#. Key:\t6922D9F143A5295C7C2D22A71EA4125B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_29.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_29.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Makes sense...\"\nmsgstr \"Логично...\"\n\n#. Key:\t74955E464A85ED006FF47894FD09BD28\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_4.Text\n#. Key:\tE7F9297B4FF3956A965042AA9D870A07\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_37.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_37.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"The Law says that.\"\nmsgstr \"Закон гласит об этом.\"\n\n#. Key:\t74BCB9E04AB452BA2A11088F25DD2FED\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"I guess they forgot to tell you but work time is long over...\"\nmsgstr \"Думаю, они забыли сказать тебе, но рабочее время давно закончилось...\"\n\n#. Key:\t74F34750433EF722E89F8F85A871CE1B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_59.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_59.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Take this as a reward!\"\nmsgstr \"Прими это как награду!\"\n\n#. Key:\t766B27FA455983F70AE1F4BA56F4C1B3\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_57.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_57.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"How wondrous! I’m sure this will reduce my research time with years!\"\nmsgstr \"Как восхитительно! Я уверен, что это сократит время моих исследований на целые годы!\"\n\n#. Key:\t784D8662443EA775B9554EAEB4C6CB8F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"You are guilty for bouncing too loudly! Just like my uncle...\"\nmsgstr \"Ты виновен в том, что слишком громко прыгаешь! Как и мой дядя...\"\n\n#. Key:\t791A095948CFB22CCAF59EAFC60D74EA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_0.SpeechSequence(1).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_0.SpeechSequence(1).SpeechSequence.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"We had to reread all the rules to find out if there is anything about this.\"\nmsgstr \"Нам пришлось перечитать все правила, чтобы узнать, есть ли что-нибудь об этом.\"\n\n#. Key:\t7CBAE1084FC39423BBD706A9F939BB14\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"So what is this case you are working on?\"\nmsgstr \"Так над каким делом ты работаешь?\"\n\n#. Key:\t7DBA70D14A4EDDE22DABBBB75800865A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_5.Children(3).Children.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_5.Children(3).Children.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Help\"\nmsgstr \"Помощь\"\n\n#. Key:\t7DDD963C45C30134FA79CEAA1834C270\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_1.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_1.Children(1).Children.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"No way\"\nmsgstr \"Ни за что\"\n\n#. Key:\t7E1EAB78482CF915AF8A96BA8E0A47F1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Just give me some more time and I will prove that you are guilty.\"\nmsgstr \"Просто дай мне еще немного времени и я докажу, что ты виновен.\"\n\n#. Key:\t7E2FD8D443438BEFF933D1BA0F691A41\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_1.SpeechSequence(2).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_1.SpeechSequence(2).SpeechSequence.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Such a tragic death! Now I need to start everything from the beginning!\"\nmsgstr \"Такая трагическая смерть! Теперь мне нужно всё начать с самого начала!\"\n\n#. Key:\t7EA289C94C6CF1E43AE0B291AD0A1133\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_30.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_30.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Yes, she is a criminal for inhabiting the body of a cat. That is strictly forbidden!\"\nmsgstr \"Да, она виновна в проживании в теле кошки. Это строго запрещено!\"\n\n#. Key:\t80596D1B4384F83D73655AB76B2FA2D0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Incorrect. It is not.\"\nmsgstr \"Неправильно. Это не так.\"\n\n#. Key:\t81C42F5340469CBB4AD780B01E7F02F8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_5.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_5.Children(1).Children.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Case\"\nmsgstr \"Дело\"\n\n#. Key:\t830C84A74369239E2839638F8918E086\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_5.Children(4).Children.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_5.Children(4).Children.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Artefacts\"\nmsgstr \"Артефакты\"\n\n#. Key:\t9090EFE44CB8D7F54F996B970D9A97D2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Don’t disturb me!\"\nmsgstr \"Не беспокойте меня!\"\n\n#. Key:\t90F79FAC440FB22F0A6BFCABE0963454\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_33.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_33.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"That’s very likely.\"\nmsgstr \"Это очень вероятно.\"\n\n#. Key:\t9600587D4E3C5B6F2C120BBFB9D40D6A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"What?\"\nmsgstr \"Что?\"\n\n#. Key:\t96945AA143EF1F1B7CE4C0B8EEE4096F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_51.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_51.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"All right I was just asking. It’s not forbidden. At least in this case.\"\nmsgstr \"Ладно, я просто спросил. Это не запрещено. По крайней мере, в этом случае.\"\n\n#. Key:\t970DBE99476C7799B4B803B2EECE7E95\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"You are dead. Isn’t that a problem?\"\nmsgstr \"Ты мертв. Разве это не проблема?\"\n\n#. Key:\t9B06B22F44D389959A3C99924145EAE7\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Do you know a girl called Lillian?\"\nmsgstr \"Знаешь ли ты девочку по имени Лилиан?\"\n\n#. Key:\t9C1B37574F81FDF4D3F03890504E3490\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Well, to be honest it is.\"\nmsgstr \"Ну, если честно, это проблема.\"\n\n#. Key:\t9EE15BCA450900DEFFB839856BA78E09\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_55.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_55.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"I’ll see what I can do...\"\nmsgstr \"Я посмотрю, что можно сделать...\"\n\n#. Key:\t9F3FBDE041EA6FDB7B30ECA1547E49A0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_0.SpeechSequence(3).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_0.SpeechSequence(3).SpeechSequence.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"We almost finished the process when the Gnome Traveller died of waiting.\"\nmsgstr \"Мы почти закончили процесс, когда Карлик Путешественник умер от ожидания.\"\n\n#. Key:\tA22CEEE34864BC25EECFF2BAED83789F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_18.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_18.Children(0).Children.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"It is\"\nmsgstr \"Проблема\"\n\n#. Key:\tA69BCEA14AD8A07AC8CC35871548973A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_5.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_5.Children(0).Children.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Give Abacus\"\nmsgstr \"Дать Абакус\"\n\n#. Key:\tA7B9690142A3832182C004A99797AB21\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_26.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_26.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"And how about being dead?\"\nmsgstr \"А как насчет быть мертвым?\"\n\n#. Key:\tA7EDDDCF423FF086BC0D0A891D232C87\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_0.SpeechSequence(0).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_0.SpeechSequence(0).SpeechSequence.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"He asked for permission to use the Railway. Which is really unusual. Before him only dwarves used the Railways.\"\nmsgstr \"Он попросил разрешения на использование Железной дороги. Что действительно необычно. До него Железной Дорогой пользовались только гномы.\"\n\n#. Key:\tA9FCBAD04E16A880C3E52AAA35864E35\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Respect the Law!\"\nmsgstr \"Соблюдай закон!\"\n\n#. Key:\tAA3210BC4B1C0875817CCDB5F4922AFA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_1.SpeechSequence(0).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_1.SpeechSequence(0).SpeechSequence.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"It’s not that simple. In his testament he asked us to bring his corpse home, on the railway.\"\nmsgstr \"Все не так просто. В своем завещании он попросил нас привезти его тело домой, на железной дороге.\"\n\n#. Key:\tAA9613C041229946AD0033806D77D398\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_49.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_49.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"What can I do for you?\"\nmsgstr \"Чем я могу помочь?\"\n\n#. Key:\tB2D504404A8475C7EFB445AFDA8597A9\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_5.Children(6).Children.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_5.Children(6).Children.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Leave\"\nmsgstr \"Выйти\"\n\n#. Key:\tB3A305B84320145E4C0437B7ED50C5B9\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_25.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_25.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"The Law doesn’t forbid walking for balls. I guess you are right then.\"\nmsgstr \"Закон не запрещает шарам ходить. Думаю, тогда ты прав.\"\n\n#. Key:\tB3E56D56494153D0C17355A59EC3F0E6\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Rest... err... work in peace!\"\nmsgstr \"Покойся... эээ... работай в тишине!\"\n\n#. Key:\tB69AD6FC4D8373491561CFBCF26C2397\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_1.SpeechSequence(3).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_1.SpeechSequence(3).SpeechSequence.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Could you help me?\"\nmsgstr \"Ты можешь мне помочь?\"\n\n#. Key:\tBCFFF4F345E59362764C9AA6582C683C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_0.SpeechSequence(2).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_0.SpeechSequence(2).SpeechSequence.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"When we found out there are none, so we needed to create new rules. But for that we had to reread all the existing rules again.\"\nmsgstr \"Когда мы узнали, что нет ни одного, нам нужно было создать новые правила. Но для этого нам пришлось перечитать все существующие правила заново.\"\n\n#. Key:\tC5FDD0A14882D8F74A97B1BD53AFD4FE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_36.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_36.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"I don’t. But keep in mind if they were stolen and you find them you have to give them to the Dwarven King.\"\nmsgstr \"А я нет. Но имей в виду, если их украли, и ты найдешь их, ты должен отдать их Королю Гномов.\"\n\n#. Key:\tC81E287C4B4EF5B5E77E25A480FC2AEE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_18.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_18.Children(1).Children.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Not at all\"\nmsgstr \"Вовсе нет\"\n\n#. Key:\tCCF4D5D04B8D4C57AAA75ABC5F9A1384\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_50.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_50.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"No, no, no! I have other things to do.\"\nmsgstr \"Нет, нет, нет! У меня есть другие дела.\"\n\n#. Key:\tCD5EF4DE4D29CC774EB5A69A8A65CD95\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_5.Children(5).Children.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_5.Children(5).Children.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Lillian\"\nmsgstr \"Лиллиан\"\n\n#. Key:\tCFC9A6294B4D0653CA9B3384CBD2BC29\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_58.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_58.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Thank you! Thank you!\"\nmsgstr \"Спасибо! Спасибо!\"\n\n#. Key:\tCFEFA4DD4AFEF91C834684A49DFB5890\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_39.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_39.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"What crime did the Gnome commit?\"\nmsgstr \"Какое преступление совершил Гном?\"\n\n#. Key:\tD83C186746373C67E8877594AA3523B8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_53.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_53.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"When I touch it my fingers slip past the abacus, I can’t move it.\"\nmsgstr \"Когда я прикасаюсь к нему, мои пальцы проходят сквозь него и я не могу им пошевелить.\"\n\n#. Key:\tE00518FA4279FE57E9640F9007E4BC35\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_44.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_44.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"I would call that case solved...\"\nmsgstr \"Я бы назвал это дело закрытым...\"\n\n#. Key:\tE8F4BE4848BE2E257972D09391B0F296\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_1.SpeechSequence(1).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_1.SpeechSequence(1).SpeechSequence.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"We decided that Gnomes can use the Railway, but how about Gnome Corpses? That’s a totally different issue.\"\nmsgstr \"Мы решили, что Карлики могут пользоваться железной дорогой, но как насчет их Трупов? Это совершенно другой вопрос.\"\n\n#. Key:\tEB5B1E474DCFFCF9A38190B8FFAB7C50\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"I guess the same rules apply.\"\nmsgstr \"Думаю, действуют те же правила.\"\n\n#. Key:\tEB5BFBDC40E1D6A1D5C054AD8B6424FD\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_24.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_24.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Hmmm... Let me see...\"\nmsgstr \"Хммм... Дай подумать...\"\n\n#. Key:\tEF50A43049824F390D61A3A58D44185A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"And you are a walking ball. Isn’t that a problem?\"\nmsgstr \"А ты - ходячий мяч. Разве это не проблема?\"\n\n#. Key:\t01E5D5DE4524C5AECBE8DAA5A5C3047D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_111.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_111.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Fishy warns you! This path is dangerous! Turn back! Explore other places!\"\nmsgstr \"Фиши предупреждать тебя! Этот путь опасен! Поворачивай назад! Исследуй другие места!\"\n\n#. Key:\t036B0B0E41C74704A5ED648091D58AB0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_65.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_65.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Long story short I almost reached the Outpost when my cargo went into a pothole and my wheel was broken.\"\nmsgstr \"Короче говоря, я почти добрался до Заставы, когда мой груз попал в яму, и у меня сломалось колесо.\"\n\n#. Key:\t03B6BE674D69EF12EB862EB77CDC7F57\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_97.Text\n#. Key:\t4475043D4A9CFD057ED34FBB9695EC86\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_113.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_113.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_97.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Then I will give it for 10 Gold Coins.\"\nmsgstr \"Тогда я отдам его за 10 Золотых Монет.\"\n\n#. Key:\t0405D11C4961CFB7941F0F9727F80EAD\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_108.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_108.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"9 Gold I won't go any lower!\"\nmsgstr \"9 Золотых я не уступлю больше!\"\n\n#. Key:\t069FA4C94559002699885EACD6422FC7\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_115.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_115.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Such an insult! How dare you?\"\nmsgstr \"Как оскорбительно! Как ты смеешь?\"\n\n#. Key:\t114F9B9345D0965FE6EFC592E29477FE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_54.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_54.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Wohoo! I have some really epic names just for you! Each name costs a Single Gold coin!\"\nmsgstr \"Юхууу! У меня есть несколько по-настоящему эпических имен только для тебя! Каждое имя стоит всего одну Золотую монету!\"\n\n#. Key:\t1164C89641A9E4970985919C8E86936E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(5).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(5).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Help me?\"\nmsgstr \"Помоги мне?\"\n\n#. Key:\t11E01CA843185266C441ACBC460A5B06\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_39.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_39.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Do you really want to help me?\"\nmsgstr \"Ты правда хочешь мне помочь?\"\n\n#. Key:\t12F669184834CDC0466BA4A72BE38420\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Oh, you come to visit old Gnory again.\"\nmsgstr \"О, ты опять пришел навестить старого Гнори.\"\n\n#. Key:\t148C738E422B1C7889EF8CAEF1E6D115\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(7).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(7).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Lory\"\nmsgstr \"Лори\"\n\n#. Key:\t14A787EF447C5AD6579ADDB271BD9B7E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_54.Children(2).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_54.Children(2).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Warlorb\"\nmsgstr \"Уорлорб\"\n\n#. Key:\t14F4A36B4D34364D1BBB2DAAFA745C41\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_SpeechSequence_0.SpeechSequence(1).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_SpeechSequence_0.SpeechSequence(1).SpeechSequence.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"I so hated them...\"\nmsgstr \"Я так их ненавидел...\"\n\n#. Key:\t162A7A25421FFB9B368D60A9BC76FD38\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Oh, the three artefacts! That sounds a bit too ambitious but after all, they can be quite a unique gift for a young ball lady.\"\nmsgstr \"А, три артефакта! Звучит довольно амбициозно, но в конце концов, они могут стать неповторимым подарком для молодой Шар-леди.\"\n\n#. Key:\t166AAF5241332C7954631F9D568B227B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_46.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_46.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"For everything as well.\"\nmsgstr \"И для всего тоже.\"\n\n#. Key:\t19190B2142877E8CBB6F6D8FBB8D2DB1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_42.Text\n#. Key:\t39E546F34A9886487CD938A70468AEC6\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_59.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_42.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_59.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"What?\"\nmsgstr \"Что?\"\n\n#. Key:\t1AF2DDE74542524EEF19CA9567CFBDAF\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_58.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_58.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"{name}? It still sounds a bit weird, but I think I might like it.\"\nmsgstr \"{name}? Все еще звучит немного странно, но думаю, мне понравится.\"\n\n#. Key:\t22D86B8644CA5BFD8D4CA593C5E3A271\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_54.Children(4).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_54.Children(4).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Dr. Ball\"\nmsgstr \"Доктор Болл\"\n\n#. Key:\t2301BDF7421BB3665BED5F92074BB5A2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_84.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_84.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"I’ve found a wheel for you!\"\nmsgstr \"Я нашел тебе колесо!\"\n\n#. Key:\t25502F154A957ECD33B65E879E65B48B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_56.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_56.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"That's sad. Come back when you have some!\"\nmsgstr \"Это печально. Возвращайся, когда у тебя будут!\"\n\n#. Key:\t27BF125B4C46E41F58FD45947F1F5CF8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_49.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_49.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Fishy is Fishy!\"\nmsgstr \"Фиши - это Фиши!\"\n\n#. Key:\t294C4DCC4E8A3A07F15BC8B8C1934BB0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_36.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_36.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"I've got to go now!\"\nmsgstr \"Мне нужно идти!\"\n\n#. Key:\t29EEF2B44C1FAE2BBA7518A685FC99B0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"An elixir that makes you attractive to the lady... err... balls?\"\nmsgstr \"Эликсир, который делает тебя привлекательным для леди... э... шара?\"\n\n#. Key:\t2A8B24AE4D7C120048DEF2A76FD6D787\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(9).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(9).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Leave\"\nmsgstr \"Выйти\"\n\n#. Key:\t2AC10A9B434CEADBA53C1F8C1DB0A26D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_41.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_41.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"I have some at my shop for sale!\"\nmsgstr \"У меня в магазине есть кое-что на продажу!\"\n\n#. Key:\t2FCB0CE9458F40E2B6738B93937283D2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_107.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_107.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"See? And I have to listen to him all day!\"\nmsgstr \"Видишь? И я должен выслушивать его весь день!\"\n\n#. Key:\t303548794492148A0C7CE9961AB48C77\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_92.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_92.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"It's yours for 12 Gold Coins.\"\nmsgstr \"Оно твое за 12 Золотых Монет.\"\n\n#. Key:\t303B74844F6BC0691F880B970403BE91\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_106.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_106.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Then I will give it for 8 Gold Coins.\"\nmsgstr \"Тогда я отдам его за 8 золотых монет.\"\n\n#. Key:\t31FAEB004D0A1ED819BEF4BC369D9FD5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_51.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_51.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"I see one of your wagon wheels is broken.\"\nmsgstr \"Я вижу, одно из колес твоего телеги сломано.\"\n\n#. Key:\t336F7E9E46DDE33326081E937EC0024A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Don’t care about Fishy. He can’t really speak and I’m not sure if he even understands himself.\"\nmsgstr \"Не слушай Фиши. Он не умеет говорить, и я не уверен, что даже он понимает себя.\"\n\n#. Key:\t339A52E04EF86F99DE9BCEAA78F29025\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_66.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_66.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"See you later!\"\nmsgstr \"До встречи!\"\n\n#. Key:\t34076BD4489E7C92D8DCB9BC1668B775\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_6.Text\n#. Key:\t5FC68B30456EA7BB5A381780426E2279\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_73.Text\n#. Key:\t89C71F00406C5A31D196B4994CEBBA22\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_50.Text\n#. Key:\t93A76F294E3B6B5AB77DD5A04E76F681\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_83.Text\n#. Key:\t9C69D11144FA077481C6C9865E6ED34A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_80.Text\n#. Key:\tA28EA457442D0820F3633A8ECACEDC75\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_76.Text\n#. Key:\tCC8A6DB3424E6813002643A97EFE6644\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_50.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_73.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_76.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_80.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_83.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Shut up Fishy!\"\nmsgstr \"Заткнись, Фиши!\"\n\n#. Key:\t365CB4EB4F04825B34F4ADB42F238552\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_85.Children(2).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_85.Children(2).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"12 Gold\"\nmsgstr \"12 Золотых\"\n\n#. Key:\t3E650BC4417E6A004AF4549F412B1AF4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_26.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_26.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Ehm, ehm...\"\nmsgstr \"Эм, эм...\"\n\n#. Key:\t3E904B7D4D5694B715AC268086A4DB2F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_78.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_78.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"I’ve met another merchant called Lory. Is she your sister you talked about?\"\nmsgstr \"Я встретил другого торговца по имени Лори. Она твоя сестра, о которой ты говорил?\"\n\n#. Key:\t3EB6AD0C4D8896D36393BE878D3D641E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_100.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_100.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"What the holy Coins?! Now I'm getting angry!\"\nmsgstr \"Что за святые монеты?! Теперь я злюсь!\"\n\n#. Key:\t43099059444ABE91D004D5992065A06F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_7.Text\n#. Key:\t5A2D69454EA8354F3DE4E6BB9D7BD912\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"And Fishy!\"\nmsgstr \"И Фиши!\"\n\n#. Key:\t43602C93451F3A59EB067ABF7A525D41\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Fishy know about them!\"\nmsgstr \"Фиши знать о них!\"\n\n#. Key:\t43C2553447FC63D25E26E79ACE5D7316\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_74.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_74.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"He was a good merchant, so he understood. Business is hard. I always say that for a fair price I would even sell myself.\"\nmsgstr \"Он был хорошим торговцем, так что он понимал. Бизнес - это сложно. Я всегда говорю, что за справедливую цену я бы продал даже себя.\"\n\n#. Key:\t477984834246057BF894629ABEA2F0CB\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_116.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_116.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"You know what? 9 Gold Coins! Take it or leave it that's my final offer!\"\nmsgstr \"Знаешь что? 9 золотых монет! Бери или уходи, это мое последнее предложение!\"\n\n#. Key:\t477CBB8C451F6255A8A4FAAE8272F700\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_54.Children(5).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_54.Children(5).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Don't buy\"\nmsgstr \"Не покупать\"\n\n#. Key:\t494F3D164E51E73CC76FD689BF2A4435\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_110.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_110.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Then I will give it for 9 Gold Coins.\"\nmsgstr \"Тогда я отдам его за 9 Золотых Монет.\"\n\n#. Key:\t4CBFFCE24BDAFBA592E846A4C6827F21\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_102.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_102.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"All right, you won. I will give it for 11 Gold Coins.\"\nmsgstr \"Ладно, твоя взяла. Я отдам его за 11 Золотых Монет.\"\n\n#. Key:\t4D29AE254413D052D6FAA7AA259E2618\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_45.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_45.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"I see you do have a solution for everything.\"\nmsgstr \"Вижу, у тебя есть решение для всего.\"\n\n#. Key:\t4EACFFA1414DBB56AA162789D34C76F2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_61.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_61.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Wow, that's magnificent!\"\nmsgstr \"Ух ты, это великолепно!\"\n\n#. Key:\t4F5CF94B464ED01AB43521A56D7C3B13\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_53.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_53.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"I want to buy a new name!\"\nmsgstr \"Я хочу купить новое имя!\"\n\n#. Key:\t51F2252D44A1B1B8B407938C06378303\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Fishy know a poem.\"\nmsgstr \"Фиши знать стих.\"\n\n#. Key:\t540DEA6540589E8E9BD5789F708F1D95\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_85.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_85.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"How much do you charge for it?\"\nmsgstr \"Сколько ты за него хочешь?\"\n\n#. Key:\t551FA87F4EC33961257CFBA46B24E39C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_25.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_25.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Oh, holy golden coins please no...\"\nmsgstr \"О, святые золотые монеты, пожалуйста, только не это...\"\n\n#. Key:\t55C0627D41EBB98609EDA49E36CE00F3\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_87.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_87.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Tummm-dummm I would sell the whole World but who could possibly buy it?\\r\\nUhhh... Yes?\"\nmsgstr \"Таааа-дааам Я бы продал весь мир, но кто бы мог его купить?\\nЭээ... Да?\"\n\n#. Key:\t5977C80F49FF140CD397C1A3079F8A4C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_54.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_54.Children(1).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Ultimate Frisbee\"\nmsgstr \"Абсолютный Фрисби\"\n\n#. Key:\t5D529690413CAE4F496DF4B7A3627528\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(6).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(6).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Broken wheel?\"\nmsgstr \"Колесо сломано?\"\n\n#. Key:\t5D632016493E1D06116399A364FD3835\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_67.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_67.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Take care and don't spend Gold anywhere else!\"\nmsgstr \"Береги себя и не трать золото нигде больше!\"\n\n#. Key:\t5F1DF4B44C4E82D6A5FDB6BDF5172AEA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_96.Text\n#. Key:\t9592C2144A7237D49EC42E898AB73642\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_105.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_105.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_96.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"How about 10?\"\nmsgstr \"Как насчет 10?\"\n\n#. Key:\t6179A2AF43798114CFEE12900CDAF8CA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_60.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_60.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Good choice!\"\nmsgstr \"Хороший выбор!\"\n\n#. Key:\t6185906046DAF51843A52FA2FE2CF5AC\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_101.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_101.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"11 Gold Coins! Take it or leave it that's my final offer!\"\nmsgstr \"11 золотых монет! Бери или уходи, это мое последнее предложение!\"\n\n#. Key:\t655C05DA44E2BCB7DCF0D38DFAD6182C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Let him tell the poem!\"\nmsgstr \"Пусть он расскажет стих!\"\n\n#. Key:\t68761B744A892F85CEDB19B8DD6D9649\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_SpeechSequence_0.SpeechSequence(2).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_SpeechSequence_0.SpeechSequence(2).SpeechSequence.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Then I found out there is a Dwarven Outpost here which is still populated.\"\nmsgstr \"Потом я узнал, что здесь есть Застава Гномов, которая все еще заселена.\"\n\n#. Key:\t6D8190E2491C99D14C4E37AA8F01E0BC\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"In Crossroad Cave the three are close.\\r\\nThough where exactly? This poem shows:\\r\\nFor the first one you need to be restless\\r\\nTo avoid the Catacomb death traps.\\r\\nFor the second you need to go down\\r\\nDeep until you reach the ancient fisher town.\\r\\nFor the third one go high and even higher,\\r\\nKeep on til you reach the never sleeping fire.\\r\\n\"\nmsgstr \"В Пещере Кроссроуд они лежат.\\nКаковы они? Этот стих укажет:\\nДля первого неугомонным нужно быть.\\nЧтобы Катакомбные ловушки избежать.\\nДля второго, нужно вниз спуститься\\nДо самого древнего рыбацкого городка.\\nДля третьего поднимись высоко-высоко,\\nПока не дойдешь до вечного огня.\\n\"\n\n#. Key:\t6F09C2F74E536AB6E4E7D8941571FBDF\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Sure. Shut up Fishy!\"\nmsgstr \"Конечно. Заткнись, Фиши!\"\n\n#. Key:\t720870EC444670FB23244D964497F883\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_SpeechSequence_1.SpeechSequence(1).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_SpeechSequence_1.SpeechSequence(1).SpeechSequence.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"However business is business. She is bad for business! Trading with my customers before they could get to me!\"\nmsgstr \"Однако бизнес есть бизнес. Она вредит бизнесу! Отбивает у меня клиентов ещё до того, как они до меня доберутся!\"\n\n#. Key:\t757069804B91FF89516ACDA0C1F59C6A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_103.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_103.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Arrrgh! Fishy please no more poems! My head aches.\"\nmsgstr \"Арррррр! Фиши, прошу тебя, больше никаких стихов! Голова болит.\"\n\n#. Key:\t75A193EA4F6A7EE92BA73D809247B1A1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_62.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_62.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Dr. who? Oh, see, Dr. Ball.\"\nmsgstr \"Доктор кто? А ну да, доктор Болл.\"\n\n#. Key:\t75EADAAB4ACE4E6ECE45BFA6611ED77A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_85.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_85.Children(0).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"8 Gold\"\nmsgstr \"8 Золотых\"\n\n#. Key:\t7657DDE7438385D8BCC4B08B2BB5881A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_SpeechSequence_0.SpeechSequence(0).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_SpeechSequence_0.SpeechSequence(0).SpeechSequence.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"It all started when I was back with my family. Oh, those peaceful moments!\"\nmsgstr \"Все началось, когда я был с семьей. О, те мирные времена!\"\n\n#. Key:\t778E6A484D8669761018F38DF326C125\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_90.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_90.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"It's yours for 8 Gold Coins.\"\nmsgstr \"Оно твое за 8 Золотых Монет.\"\n\n#. Key:\t7A09AFFF435CC002F0B75989307D7791\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Well met dear err... traveler! How can a humble gnome merchant like me be at your service?\"\nmsgstr \"Приятная встреча дорогой ээ... путешественник! Как такой скромный торговец-гном, как я, может быть к твоим услугам?\"\n\n#. Key:\t7E964EEC4406A06910B333A0F282360A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_70.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_70.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Sure! She is the lovely lady ball for whom you would like to buy a precious present, right?\"\nmsgstr \"Конечно! Она - прекрасная леди-шар, для которой ты хотел бы купить драгоценный подарок, верно?\"\n\n#. Key:\t85D756624371CC3B3A37FC84C111DBB0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_54.Children(3).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_54.Children(3).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Sorbcerer\"\nmsgstr \"Шародей\"\n\n#. Key:\t86C8F9B74B869FF4D34CF586AB5AC25E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_20.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_20.Children(1).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Shut up!\"\nmsgstr \"Замолчи!\"\n\n#. Key:\t8701305446A6E0F5E5EA5F86B823273D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Shut up both of you!\"\nmsgstr \"Замолчите оба!\"\n\n#. Key:\t878BA65D462254D8A0FD36BA541E8C70\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_27.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_27.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"The three artefacts - by Fishy:\"\nmsgstr \"Фиши - Три артефакта:\"\n\n#. Key:\t8A136EF74C7DE15BFBC664B8447366F1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(2).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(2).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"I need a name\"\nmsgstr \"Мне нужно имя\"\n\n#. Key:\t8C25603A4AE5F2D6294551AD2BA6322D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_40.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_40.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Of course! Are you lost in this hollow realm? Disappointed in all creature kind? Searching for a helpful hand? Not anymore!\"\nmsgstr \"Конечно! Ты заблудился в этом пустом царстве? Разочарован во всех существах? Ищешь помощи? Больше не нужно искать!\"\n\n#. Key:\t90F345C4482C46F4B1CD43B20F01B2B6\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_54.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_54.Children(0).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Epic Sphero\"\nmsgstr \"Эпический Сфероид\"\n\n#. Key:\t92F1D4A84B3609FDE38C82AD5A314554\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_72.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_72.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"And Fishy is the primitive monster.\"\nmsgstr \"А Фиши - примитивное чудовище.\"\n\n#. Key:\t9574E444465834A7D15565A14C7E0F1D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_SpeechSequence_0.SpeechSequence(5).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_SpeechSequence_0.SpeechSequence(5).SpeechSequence.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"My sister sold my brother, so I had enough money to set out.\"\nmsgstr \"Моя сестра продала моего брата, так что у меня было достаточно денег, чтобы уехать.\"\n\n#. Key:\t976FD7AB4B31747EF35E3EBE9C82471F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_69.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_69.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Do you know a girl called Lillian?\"\nmsgstr \"Знаешь ли ты девочку по имени Лилиан?\"\n\n#. Key:\t9851A2064648DE26EF4501961D721109\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_68.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_68.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Wake up! He is back!\"\nmsgstr \"Проснись! Он вернулся!\"\n\n#. Key:\t99CDA18D43B5FC74E152888E674B743C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_30.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_30.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Let’s talk about something else.\"\nmsgstr \"Давай поговорим о чем-нибудь другом.\"\n\n#. Key:\t9A5056F7472381107ACF5F849A322947\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_64.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_64.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Bye!\"\nmsgstr \"Пока!\"\n\n#. Key:\t9B4816554539F6616741FC8A6651FEDD\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_SpeechSequence_1.SpeechSequence(2).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_SpeechSequence_1.SpeechSequence(2).SpeechSequence.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"I will tell her what I think about this that’s for sure!\"\nmsgstr \"Я непременно скажу ей, что я думаю об этом!\"\n\n#. Key:\t9FD161AC488FFD8D9C6BCAB518A6DFCA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_86.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_86.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Hello again!\"\nmsgstr \"Привет еще раз!\"\n\n#. Key:\t9FFADAA44EE730442CFD76BBD942F478\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_38.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_38.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Fare thee well!\"\nmsgstr \"Ну в добрый час!\"\n\n#. Key:\tA0E3F7B44422A97F22E1FCB315DC498A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_48.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_48.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Who are you by the way?\"\nmsgstr \"Кстати, а ты кто такой?\"\n\n#. Key:\tA3EE773446B69B8D37851BAFAD607A9F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_24.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_24.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Forget your artefacts I have plenty of other valuable items instead!\"\nmsgstr \"Да брось ты свои артефакты, вместо них у меня есть много других ценных вещей!\"\n\n#. Key:\tA557A981439B7A1B4AA803941A8D6794\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_23.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_23.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"I guess you don’t know where they are...\"\nmsgstr \"Я полагаю, вы не знаете, где они...\"\n\n#. Key:\tA571474F44F33104D2F93386A5C4009C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_75.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_75.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Yet no one ever wanted to buy him for a single copper coin.\"\nmsgstr \"Но никто никогда не хотел купить его даже за одну медную монету.\"\n\n#. Key:\tA67ADB3143798188EF7C1F8D4E59690C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_88.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_88.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Uhhh... Yes?\"\nmsgstr \"Эээ... Да?\"\n\n#. Key:\tA69D35084A31B957410EF889ED0EC4A4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_57.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_57.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Yes, yes that's it!\"\nmsgstr \"Да, да, вот оно!\"\n\n#. Key:\tAD70372E4A5B0594635FBBBE30CA53F1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_91.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_91.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"It's yours for 10 Gold Coins.\"\nmsgstr \"Оно твое за 10 Золотых Монет.\"\n\n#. Key:\tAE2E742F4A087974019D8F810FF97A2E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_104.Children(0).Children.Text\n#. Key:\tB59E143642BBE2D677AA6F97B46C3C06\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_105.Children(0).Children.Text\n#. Key:\tF0726C6B4F8F780C341F319D08E20CF9\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_96.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_104.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_105.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_96.Children(0).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Ok\"\nmsgstr \"Ок\"\n\n#. Key:\tAF7B14B241CED9B8BE3F23BC8C857A9A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_82.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_82.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Now you can imagine those peaceful moments when they were all together.\"\nmsgstr \"Теперь ты можешь представить те тихие времена, когда они были все вместе.\"\n\n#. Key:\tB2F8DA594F1A58E8B2FCC7B16C368E21\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"What... uhhh... me?\"\nmsgstr \"Что... эээ... ты мне?\"\n\n#. Key:\tBA5B75CD4087B53BB682CD97021FF821\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(3).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(3).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Artefacts\"\nmsgstr \"Артефакты\"\n\n#. Key:\tBBB67671475F19135DCD57AF771F0D85\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_43.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_43.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Helpful hands of course and all kind of stuffs. Equip yourself. Once you get rid of all your gold, you won’t be alone anymore...\"\nmsgstr \"Полезные руки, конечно, и все такое. Экипируйся. Как только ты избавишься от всего своего золота, ты больше не будешь наедине с ...\"\n\n#. Key:\tBD1AF6114DA5840A340F8DA65B7F59D2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_SpeechSequence_1.SpeechSequence(0).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_SpeechSequence_1.SpeechSequence(0).SpeechSequence.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Yes, she is my beloved sister!\"\nmsgstr \"Да, она моя любимая сестра!\"\n\n#. Key:\tBE8F496743A57B5F1AF81B8D48F128FE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Hello there!\"\nmsgstr \"Здравствуй!\"\n\n#. Key:\tBFA7C31A4443A6C89DB61D8556D62FCD\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(0).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Trade\"\nmsgstr \"Купить\"\n\n#. Key:\tC29FF9914C8C1F479E9F7BAB338B067A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_77.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_77.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"If you could bring me a new wheel I would pay for it with shiny Gold coins!\"\nmsgstr \"Если бы ты мог принести мне новое колесо, я бы заплатил за него блестящими золотыми монетами!\"\n\n#. Key:\tC5077FC14569C44087272C9E9DE07992\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_34.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_34.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Ok, I’ve got it.\"\nmsgstr \"Хорошо, я понял.\"\n\n#. Key:\tC6F3C52D4719CE471B6EEB90FCE94E3B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_55.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_55.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Unfortunately I don't have enough gold.\"\nmsgstr \"К сожалению, у меня недостаточно золота.\"\n\n#. Key:\tCA1E8A5D4C07A81975C4B4B00572A0C8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_94.Text\n#. Key:\tDB9C0DB146BBE1DFC28F929A37C4408A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_93.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_93.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_94.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Ha-ha-ha! You must be kidding that's ridiculously high!\"\nmsgstr \"Ха-ха-ха! Ты должно быть шутишь, это слишком дорого!\"\n\n#. Key:\tCB792FAD45F78755935423A5219271FC\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_98.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_98.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"9 Gold I won't go any higher!\"\nmsgstr \"9 Золотых, я не дам больше!\"\n\n#. Key:\tCE99919C42EC2315EC5B33900FBC09C4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_95.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_95.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"That’s not fair. It would be a shame on me if I just robbed you like that!\"\nmsgstr \"Это нечестно. Мне было бы стыдно, если бы я так тебя ограбил!\"\n\n#. Key:\tD090388E4529CEC2D70899B520973064\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(4).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(4).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Who are you?\"\nmsgstr \"Кто ты?\"\n\n#. Key:\tD0AA81A247BE4979A774F3B6095BB820\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_33.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_33.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"I am Gnory, traveler merchant. I wander the world, seeking rare items, secrets beneath dark doors, revealing truth of forg...\"\nmsgstr \"Я Гнори, торговец путешественник. Я блуждаю по миру в поисках редких вещей, тайн под темными дверями, раскрывая истину забытого...\"\n\n#. Key:\tD23C65EB4F39580A06045FADE2BCD713\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_81.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_81.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"She saw our Realm through cat eyes,\\r\\nThe living fire, the dead ice.\\r\\nShe cared, she took care of us all.\\r\\nWhat was ruined she made it whole.\\r\\nThen she left us, this is how it ended.\\r\\nHer own Realm also needed to be mended.\\r\\n\"\nmsgstr \"Кошачьими глазами она видела наше царство,\\nМертвый лед, живой огонь, .\\nО нас она заботилась, волновалась.\\n. \\nЕе рукой, разрушенное - исправлялось.\\nА потом она ушла от нас, вот как все закончилось.\\nЕё собственное царство тоже в исправлении нуждалось.\\n\"\n\n#. Key:\tD30843A14519A490FEE89E82E3CB6735\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"I’m looking for three artefacts.\"\nmsgstr \"Я ищу три артефакта.\"\n\n#. Key:\tD9B70A6A453A11FD2115FFB25CCFF195\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_54.Children(6).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_54.Children(6).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Not enough gold\"\nmsgstr \"Недостаточно золота\"\n\n#. Key:\tDB8982994F2BFF510A6A2EA1D40C68C6\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_37.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_37.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Good bye!\"\nmsgstr \"Пока!\"\n\n#. Key:\tDC20CC924E5F898E715B668416678CA1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_104.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_104.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"How about 8?\"\nmsgstr \"Как насчет 8?\"\n\n#. Key:\tDC989DED42077EBA3313C69150BB33F0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_63.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_63.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"That's a weird name I have to admit.\"\nmsgstr \"Странное имя, должен признать.\"\n\n#. Key:\tDEC95D494680878D544FF49DACBDEE4F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_114.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_114.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"11 Gold I won't go any lower!\"\nmsgstr \"11 Золотых я не уступлю больше!\"\n\n#. Key:\tDF7B371841495C5FB98800BCF44B7C5B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_52.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_52.Children(1).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Skip yack-yack\"\nmsgstr \"Пропустить болтовню\"\n\n#. Key:\tE1322541414052606F718FBF9B68D4B0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_79.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_79.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Fishy know her.\"\nmsgstr \"Фиши знать ее.\"\n\n#. Key:\tE3D668304EE4C7C2E77F3E9AF47CB84E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_SpeechSequence_0.SpeechSequence(4).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_SpeechSequence_0.SpeechSequence(4).SpeechSequence.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Fortunately I had a loving family I could always count on. Since they are all merchants, they could easily help me out.\"\nmsgstr \"К счастью, у меня была любящая семья, на которую я всегда мог положиться. Так как все они торговцы, они могли легко мне помочь.\"\n\n#. Key:\tE5031E774F81A45ECB4731BC114AD2E2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_109.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_109.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"All right, no need to get angry! I can give you 9 Gold for it.\"\nmsgstr \"Ладно, не надо злиться! Я могу дать тебе 9 Золотых за него.\"\n\n#. Key:\tEBE094644F9C8DCEE025FDBF8346AD47\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_44.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_44.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"...with your problem.\"\nmsgstr \"...с твоей проблемой.\"\n\n#. Key:\tEC93512B48219F6BA6DDF5A3F100C19A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Show me what you have for sale!\"\nmsgstr \"Покажи мне, что у тебя есть!\"\n\n#. Key:\tECF244164CDD4A29C96BBD8E13688FE7\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(1).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Sell Wheel\"\nmsgstr \"Продать Колесо\"\n\n#. Key:\tED410B224B09EFF36ED2AC9752AD59DA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_71.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_71.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"No, she is...\"\nmsgstr \"Нет, она...\"\n\n#. Key:\tEDE4BF2D448CAFEF217C5E86885A7E81\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_117.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_117.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"All right, you won. I will give it for 9 Gold Coins.\"\nmsgstr \"Ладно, твоя взяла. Я отдам его за 9 Золотых Монет.\"\n\n#. Key:\tEEA209E84766D4AF2BD804A7BA11F111\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_85.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_85.Children(1).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"10 Gold\"\nmsgstr \"10 Золотых\"\n\n#. Key:\tEEE19423423A24146446EEBEB04FAEE9\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"I’m on a quest to find...\"\nmsgstr \"Я должен найти...\"\n\n#. Key:\tF53E6D3443D37DA82663D2976AA90A85\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_20.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_20.Children(0).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Poem?\"\nmsgstr \"Стих?\"\n\n#. Key:\tF61EDE3940F24B15BE57D8B5A5AC5570\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_99.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_99.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Deal! Here you go!\"\nmsgstr \"По рукам! Держи!\"\n\n#. Key:\tF6A527234B894C18C0778C918EB1BA4E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_89.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_89.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Welcome back!\"\nmsgstr \"С возвращением!\"\n\n#. Key:\tF93CBC6640AF6143C7D1C5AA6F8C4ADF\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_52.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_52.Children(0).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Go on\"\nmsgstr \"Расскажи\"\n\n#. Key:\tF9EA93DE4B341581745785A7371F797A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(8).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(8).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Lillian\"\nmsgstr \"Лиллиан\"\n\n#. Key:\tFE3C4C72489A909B4D9F76A483D293AE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_SpeechSequence_0.SpeechSequence(3).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_SpeechSequence_0.SpeechSequence(3).SpeechSequence.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"This was my chance to make a hit as a merchant but I didn’t have the resources for a journey this long.\"\nmsgstr \"Это был мой шанс стать торговцем, но у меня не было ресурсов для такого длинного путешествия.\"\n\n#. Key:\tFEF58E5B4FB18D128640689499752F75\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_29.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_29.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Do you call this a poem? Pathetic! Hardly any info and what a miserable structure! Shame on you Fishy!\"\nmsgstr \"Ты называешь это стихом? Жалкое зрелище! Никакой информации и какая жалкая структура! Стыдись, Фиши!\"\n\n#. Key:\tFF66071643E10E94DEFF70B8E20876EE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_52.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_52.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"That's a long and sad story...\"\nmsgstr \"Это долгая и грустная история...\"\n\n#. Key:\t1EA717114DFEF4490F58829C2F96566A\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/HW_Candlestick.HW_Candlestick:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E2/HW_Candlestick.HW_Candlestick:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_HW_Candlestick\"\nmsgid \"Even after mom passed the servants kept lighting the candles.\"\nmsgstr \"Даже после того, как мама умерла, слуги продолжали зажигать свечи.\"\n\n#. Key:\t94195B6E4157A1A8BD74BE9224AEED42\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/HW_Candlestick.HW_Candlestick:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E2/HW_Candlestick.HW_Candlestick:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_HW_Candlestick\"\nmsgid \"After Mom got sick she really feared darkness.\"\nmsgstr \"После того, как мама заболела, она очень боялась темноты.\"\n\n#. Key:\tEF9668BF44D4A52E46ACEA8B82011137\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/HW_Candlestick.HW_Candlestick:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Ending/E2/HW_Candlestick.HW_Candlestick:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_HW_Candlestick\"\nmsgid \"We always needed to light the hallway.\"\nmsgstr \"Нам всегда нужно было освещать коридор.\"\n\n#. Key:\t2EECB3024693C7F0EA176BB100D6779A\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/HW_Exit.HW_Exit:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E2/HW_Exit.HW_Exit:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_HW_Exit\"\nmsgid \"This door was really rusty.\"\nmsgstr \"Эта дверь была очень ржавой.\"\n\n#. Key:\t3C6E4A1C41A7EACE15C101A65BBE997A\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/HW_Exit.HW_Exit:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Ending/E2/HW_Exit.HW_Exit:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_HW_Exit\"\nmsgid \"I had to do something with it otherwise Father would have heard me.\"\nmsgstr \"Я должен был что-то с этим сделать, иначе отец услышал бы меня.\"\n\n#. Key:\t8F63CC8C44D8F8432A66E6B65EC10AF5\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/HW_Exit.HW_Exit:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E2/HW_Exit.HW_Exit:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_HW_Exit\"\nmsgid \"I used oil on this rusty door. I didn’t want to be heard.\"\nmsgstr \"Я использовал масло для этой ржавой двери. Я не хотел, чтобы меня услышали.\"\n\n#. Key:\t55E7DD2B4C3D8852EC4A64AF44443BDA\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/HW_Explosion.HW_Explosion:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Ending/E1/HW_Explosion.HW_Explosion:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_HW_Explosion\"\nmsgid \"What was this? I have to go back to check what happened!\"\nmsgstr \"Что это было? Я должен вернуться, проверить, что случилось!\"\n\n#. Key:\t8060689940824917F595BF84B4E95A46\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/HW_FRDoor.HW_FRDoor:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E2/HW_FRDoor.HW_FRDoor:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_HW_FRDoor\"\nmsgid \"I always wondered why.\"\nmsgstr \"Мне всегда было интересно, почему.\"\n\n#. Key:\t816B603341386CF6BB3ADCAAD21D68A3\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/HW_FRDoor.HW_FRDoor:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E2/HW_FRDoor.HW_FRDoor:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_HW_FRDoor\"\nmsgid \"Father moved to his workroom and sealed this door.\"\nmsgstr \"Отец перебрался в свою мастерскую и опечатал эту дверь.\"\n\n#. Key:\t125DACD243EA6EBCE76D8CB9F681C727\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/HW_MRDoor.HW_MRDoor:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E2/HW_MRDoor.HW_MRDoor:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_HW_MRDoor\"\nmsgid \"I felt I should have a last look before I go.\"\nmsgstr \"Я решил, что мне нужно взглянуть в последний раз перед уходом.\"\n\n#. Key:\tE8250D43437C1B1D45637F9499D20936\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/HW_MRDoor.HW_MRDoor:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E2/HW_MRDoor.HW_MRDoor:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_HW_MRDoor\"\nmsgid \"Mom’s room looked just like it was when she was still alive.\"\nmsgstr \"Мамина комната выглядела так же, как когда она была еще жива.\"\n\n#. Key:\tE0BB63A74E94DA1B327B11BB781EB4DB\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/HW_Painting.HW_Painting:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E2/HW_Painting.HW_Painting:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_HW_Painting\"\nmsgid \"Mom made this painting before she met Father.\"\nmsgstr \"Мама написала эту картину до того, как встретила отца.\"\n\n#. Key:\tEAD0C13D4BF1D35BDAEC14A3F25901F5\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/HW_Stairs.HW_Stairs:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E2/HW_Stairs.HW_Stairs:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_HW_Stairs\"\nmsgid \"I had to go really softly otherwise Father would have heard me.\"\nmsgstr \"Мне пришлось уйти очень тихо, иначе отец услышал бы меня.\"\n\n#. Key:\t0494D36047DDCE114A43C9901618D32B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_44.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_44.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Unfortunately I don't know where you can find them.\"\nmsgstr \"К сожалению, я не знаю, где ты можешь их найти.\"\n\n#. Key:\t0C3E31854B0EB053EABAD4B9DC3D8E60\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_57.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_57.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"That’s a serious threat, I have to admit.\"\nmsgstr \"Это серьезная угроза, должен признать.\"\n\n#. Key:\t0C7C89EB4E610752FBE119AA32B99F8B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_34.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_34.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Yes I know her. She couldn’t come here so she sent her cat.\"\nmsgstr \"Да, я знаю ее. Она не могла прийти сюда, поэтому послала своего кота.\"\n\n#. Key:\t0EDE363848C05F39DE478DA7A559CF54\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Could you bring them to me?\"\nmsgstr \"Можешь мне их принести?\"\n\n#. Key:\t1A914576488DA1393ED641B9F315ABC6\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_53.Text\n#. Key:\t20DA5C2F49DCFADF17F1C983103C0D98\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_29.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_29.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_53.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Thanks!\"\nmsgstr \"Спасибо!\"\n\n#. Key:\t1E7EE16F451CAB1193F0B8B3939273AA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_62.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_62.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"I managed to defeat one group of the monsters.\"\nmsgstr \"Мне удалось победить группу чудовищ.\"\n\n#. Key:\t1F5BE4154412819180B1CA92E5B69377\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(6).Children.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(6).Children.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Artefacts\"\nmsgstr \"Артефакты\"\n\n#. Key:\t1FE89B7045E586E988BEC18B06BEEBDB\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(1).Children.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Purple Mushroom\"\nmsgstr \"Пурпурный гриб\"\n\n#. Key:\t208B21DE484E3FE42C9978927BC91E78\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_51.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_51.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Uh... this was impressive!\"\nmsgstr \"Ух... это было впечатляюще!\"\n\n#. Key:\t27DF1ABB483B5073D8C87DB48EF2613F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_70.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_70.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Well done!\"\nmsgstr \"Отличная работа!\"\n\n#. Key:\t2892242A4E74642813A30CBAE853B674\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_27.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_27.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Anyway, if you give my Coin back I will apologize.\"\nmsgstr \"В любом случае, если ты вернешь мою Монету, я извинюсь.\"\n\n#. Key:\t290F9EE34FA4EA41FE963CA61358D23B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_49.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_49.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"In theory if I add this to the soup...\"\nmsgstr \"Теоретически, если я добавлю это в суп...\"\n\n#. Key:\t3015DA144833F0401BADE8B5E5F93BA8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_26.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_26.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Huh! Do you think chests are only there so that you can loot them?\"\nmsgstr \"Ха! Ты думаешь, сундуки только для того, чтобы их можно было разграбить?\"\n\n#. Key:\t331D8B314DAF15CD7E343BB7459927DD\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Give back my Coin!\"\nmsgstr \"Верни мою Монету!\"\n\n#. Key:\t345BD57D40E09C73044BB981798E2449\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_43.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_43.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Purple Mushrooms. That’s the only mushroom which is purple. You can’t miss it.\"\nmsgstr \"Пурпурные Грибы. Это единственный гриб такого цвета. Ты не можешь его не заметить.\"\n\n#. Key:\t34B1483D4F1C580BB8DB61BEEBC5BC0F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"I saw that you opened my chest!\"\nmsgstr \"Я заметил что ты вскрыл мой сундук!\"\n\n#. Key:\t35DBF2874748AFCC34A3FAAC083EF9A0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_1.SpeechSequence(3).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_1.SpeechSequence(3).SpeechSequence.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"We had the key of the Ancient Temple. According to our prophecies that will fall to Ruin last.\"\nmsgstr \"У нас был ключ от Древнего Храма. Согласно нашим пророчествам, этот храм рухнет последним.\"\n\n#. Key:\t35FB567B4B09545830D61F84869FC7E7\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Here you go!\"\nmsgstr \"Вот, держи!\"\n\n#. Key:\t3AAE79234A4BD2F8BCA5F790D5E5D84B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_45.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_45.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"No problem. If I ever find one I will bring it to you.\"\nmsgstr \"Нет проблем. Если я когда-нибудь найду один, я принесу его тебе.\"\n\n#. Key:\t3AE46C894A0CD8F1AA049CB9970D65F3\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"I’m the chef and I’m making a soup.\"\nmsgstr \"Я повар и готовлю суп.\"\n\n#. Key:\t3BB405034447D1C80B99A5A23AFC98FC\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"I know you are already hungry but the soup is not yet ready.\"\nmsgstr \"Я знаю, что ты уже проголодался, но суп еще не готов.\"\n\n#. Key:\t406361704988AD9ABD5DA4AF946451F2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_37.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_37.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"In return Lillian drew pictures for my tales.\"\nmsgstr \"Взамен Лилиан рисовала картины для моих историй.\"\n\n#. Key:\t4152700A419F5AE41362D09E21835D98\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_46.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_46.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"I already have some...\"\nmsgstr \"У меня уже есть немного...\"\n\n#. Key:\t4355EB74402DDFD5FF8697B1911593E8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_56.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_56.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"I won’t. And I won’t talk to you either.\"\nmsgstr \"Нет. Но и разговаривать с тобой я тоже не буду.\"\n\n#. Key:\t43C4F54B4ABBBB13E129148D9AF04976\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(4).Children.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(4).Children.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Village\"\nmsgstr \"Деревня\"\n\n#. Key:\t4614DBA24F54CB29C92BA9894849CC39\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_1.SpeechSequence(1).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_1.SpeechSequence(1).SpeechSequence.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Long ago we lived in peace and respected the ancestors. Even though they caused the Cataclysm.\"\nmsgstr \"Давным-давно мы жили в мире и уважали предков. Несмотря на то, что они причина катаклизма.\"\n\n#. Key:\t4687EF7A45E5FC200C806AB829C64D78\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Is this a village? Where are the others?\"\nmsgstr \"Это деревня? Где все остальные?\"\n\n#. Key:\t586F6370480889F551923A97FFF5E89C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_0.SpeechSequence(3).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_0.SpeechSequence(3).SpeechSequence.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"They enslaved all the other tribes and forbid us to do our rituals.\"\nmsgstr \"Они поработили все остальные племена и запретили нам совершать наши обряды.\"\n\n#. Key:\t5BCF2C5D4CE9AD6AB4A09DB510BA2039\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"You again? Take a seat until the soup is ready!\"\nmsgstr \"Опять ты? Присядь, пока суп не будет готов!\"\n\n#. Key:\t63B9B304450B276F0EC714B43A25F09D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"I’m looking for three artefacts. Do you know something about them?\"\nmsgstr \"Я ищу три артефакта. Ты что-то знаешь о них?\"\n\n#. Key:\t63C0EC124C1B42B5C5FD1F95B23B9155\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_65.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_65.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Take this! You deserve it.\"\nmsgstr \"Держи! Ты заслужил это.\"\n\n#. Key:\t69E0738B489315662A55DA98EAC542E6\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_0.SpeechSequence(4).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_0.SpeechSequence(4).SpeechSequence.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"They used this village to produce Fishy slaves.\"\nmsgstr \"Они использовали эту деревню для создания Фиши рабов.\"\n\n#. Key:\t6CBCFFEB48FF8E0D97AAE4B1CB19CB52\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_22.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_22.Children(0).Children.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Give back\"\nmsgstr \"Вернуть\"\n\n#. Key:\t6EACCB4D4D91AF29F6452E81E4C01B57\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_32.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_32.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"I see you have a lot of things here. Do you have something for sale?\"\nmsgstr \"Я вижу, у тебя тут много всего. У тебя есть что-то на продажу?\"\n\n#. Key:\t7164FF5D440BCEF18CAC7E9104A324CF\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"I've got to go now!\"\nmsgstr \"Мне нужно идти!\"\n\n#. Key:\t75A92D46421FC2601A13B4BBE9BA4D11\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_54.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_54.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Er... I don’t have it. But I will get it back I promise!\"\nmsgstr \"Эээ... У меня ее нет. Но я верну ее, обещаю!\"\n\n#. Key:\t761F5734479CFA197266F382FD0A6452\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_23.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_23.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"I’m sorry, I didn’t know it was yours. There are chests like yours everywhere.\"\nmsgstr \"Извини, я не знал, что это твой. Повсюду такие же сундуки, как у тебя.\"\n\n#. Key:\t7D87C5064D739F1EFF23AF8264E83235\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Well, this morning. But there are some very special ingredients which make the cook time way shorter.\"\nmsgstr \"Ну, сегодня утром. Но есть некоторые особые ингредиенты, которые делают время приготовления намного короче.\"\n\n#. Key:\t806AEB764A6118D4CBE9CCA71E98EF10\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_72.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_72.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Have no fear, I'll do it.\"\nmsgstr \"Не бойся, я сделаю это.\"\n\n#. Key:\t80B60CA848D3C71B72514AAC976C3910\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Yes, the soup! A very special recipe. It takes years to finish.\"\nmsgstr \"Да, суп! Очень особенный рецепт. На него уходят годы.\"\n\n#. Key:\t8437D72C44494DE499E528A67B36A123\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_58.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_58.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Ah, it's you again.\"\nmsgstr \"А, это снова ты.\"\n\n#. Key:\t885F9FDB498EC13B81E22580D33309F3\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(5).Children.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(5).Children.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Kobolds\"\nmsgstr \"Коболды\"\n\n#. Key:\t8A6043D64FB7B61AF4D553A62D27229C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_36.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_36.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Every time the cat came I told him a tale about the ancestors.\"\nmsgstr \"Каждый раз, когда приходил кот, я рассказывал ему истории о предках.\"\n\n#. Key:\t8B29FD7342676763EF53ACBB0677A1A4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"The soup still needs time.\"\nmsgstr \"Супу все еще нужно время.\"\n\n#. Key:\t8E0F057044AE753D63AA23847B146662\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_67.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_67.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"This is yours.\"\nmsgstr \"Это твое.\"\n\n#. Key:\t8E4C4FB846539DD46577B490846383F1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_1.SpeechSequence(2).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_1.SpeechSequence(2).SpeechSequence.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"We decided to keep their knowledge in our rituals.\"\nmsgstr \"Мы решили сохранить их знания в наших ритуалах.\"\n\n#. Key:\t9132C2D24A241722115FD5ADB46B3145\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"And when did you start?\"\nmsgstr \"И когда ты начал?\"\n\n#. Key:\t958CE12E48F89AE79E5ED9A4FC4AF6E7\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_48.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_48.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"That's wonderful!\"\nmsgstr \"Потрясающе!\"\n\n#. Key:\t96E5FBCB4795EC1ADACEC7B6D814BD79\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(8).Children.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(8).Children.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Lillian\"\nmsgstr \"Лиллиан\"\n\n#. Key:\t9845BDB549EF25B9F5C11981123A5CCE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_33.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_33.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"You know I’m not really a trader but I might sell you some of them.\"\nmsgstr \"Ты знаешь, что я не совсем трейдер, но я могу продать тебе некоторые из них.\"\n\n#. Key:\t9A420B814A1C1762130310AE90157BFD\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_31.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_31.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"No, I’m sorry.\"\nmsgstr \"Нет, извини.\"\n\n#. Key:\t9D8511F94E19183355A5CC8CE5B562E8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_61.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_61.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"That would be great. I appreciate your kindness.\"\nmsgstr \"Это было бы здорово. Я ценю твою доброту.\"\n\n#. Key:\t9F2DE60B405A15F2BFB8409D162B42FD\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(3).Children.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(3).Children.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Soup\"\nmsgstr \"Суп\"\n\n#. Key:\tA53CDF2A4D9A582DD163C7B6D3DCE334\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_55.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_55.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Come back when you have my Coin.\"\nmsgstr \"Возвращайся, когда у тебя будет моя Монета.\"\n\n#. Key:\tA734229B44743F88ED135FB692B9C956\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Do you know a girl called Lillian?\"\nmsgstr \"Знаешь ли ты девочку по имени Лилиан?\"\n\n#. Key:\tA88F63334DD550FE9955A3A65B87ACDA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_63.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_63.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"I banished some of the monsters.\"\nmsgstr \"Я изгнал несколько чудовищ.\"\n\n#. Key:\tA8B5BE484641EBB61B1168AE798DABF5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"So you are making soup...\"\nmsgstr \"Так ты готовишь суп...\"\n\n#. Key:\tAAE2E35045B8E0DF8A11BF8BC84A11EF\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_0.SpeechSequence(1).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_0.SpeechSequence(1).SpeechSequence.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Every year we made a pilgrimage to the Ancient Temple to express our respect to the ancestors.\"\nmsgstr \"Каждый год мы совершали паломничество к Древнему Храму, чтобы выразить свое уважение к предкам.\"\n\n#. Key:\tAC26EB6F49B026C3E768398FA0A445CB\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_50.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_50.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"then...\"\nmsgstr \"тогда...\"\n\n#. Key:\tADE8569E4FC2DCB097FF3FA4B9A0A970\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_40.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_40.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Why not? What do you need?\"\nmsgstr \"Почему бы и нет? Что тебе нужно?\"\n\n#. Key:\tAE35D91D450D0414FA5F54B71E359511\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(2).Children.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(2).Children.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Who are you?\"\nmsgstr \"Кто ты?\"\n\n#. Key:\tAE387E9846A9C5A56569179359AD941C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_42.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_42.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"All right! I was just asking...\"\nmsgstr \"Ладно! Я просто спросил...\"\n\n#. Key:\tAF3D9214401FEEE552256A8BAE5F8E77\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_1.SpeechSequence(4).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_1.SpeechSequence(4).SpeechSequence.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"But now Kobolds are wrathful. They make wars. They don’t respect anyone.\"\nmsgstr \"Но теперь Коболды в гневе. Они развязывают войны. Они никого не уважают.\"\n\n#. Key:\tB06407B04855D558D1DB6B9A9A4E0B84\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_1.SpeechSequence(0).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_1.SpeechSequence(0).SpeechSequence.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Kobolds are no longer good.\"\nmsgstr \"Коболды больше не хорошие.\"\n\n#. Key:\tB082CC4B405800544484B4B0C8A25762\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_41.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_41.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"No way!\"\nmsgstr \"Ни за что!\"\n\n#. Key:\tB35F443641A7626AE4552F8D1045A95F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_38.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_38.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"I liked them very much.\"\nmsgstr \"Они мне очень понравились.\"\n\n#. Key:\tB40C1B9948722A549DBC45A1D9C277C0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_24.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_24.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"I don’t want to leave my kitchen.\"\nmsgstr \"Я не хочу уходить с кухни.\"\n\n#. Key:\tB71FB3424C74B68E4B9CF9AF3828F867\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_64.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_64.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"I think I banished all the monsters.\"\nmsgstr \"Думаю, я изгнал всех чудовищ.\"\n\n#. Key:\tB79F2026493F53FE90BABB987370695D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"What do you think honestly? You can just rob me and then come to have a chat?!\"\nmsgstr \"Вот честно, как ты себе это все представил? Ты просто ограбишь меня, а потом придешь поболтать?!\"\n\n#. Key:\tB7B8A9294FA8D3754BB4CDA897B696BA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_69.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_69.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Great. The lake is already more peaceful.\"\nmsgstr \"Отлично. Озеро уже более спокойное.\"\n\n#. Key:\tB9C3EC7342B52C04A491FF9AE87ABB42\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_0.SpeechSequence(0).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_0.SpeechSequence(0).SpeechSequence.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"This was the Village of my tribe. We lived here in peace.\"\nmsgstr \"Это была деревня моего племени. Мы жили здесь в мире.\"\n\n#. Key:\tBB45D70A4F2AF94BA7FCC9B3141FB98F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_17.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_17.Children(0).Children.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Accept\"\nmsgstr \"Принять\"\n\n#. Key:\tC297D79246A0792DCA2CA9AD693C3A55\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"That’s all.\"\nmsgstr \"И всё.\"\n\n#. Key:\tC375726140A40243E29115B58048025E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_52.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_52.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Hmm... it’s delicious. Here take some!\"\nmsgstr \"Хм... это вкуснятина. Попробуй!\"\n\n#. Key:\tC8BC1F254B61D749D62D4B9210DA1891\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"If you came for soup you will need to wait a bit more!\"\nmsgstr \"Если ты пришёл за супом, тебе придётся подождать ещё немного!\"\n\n#. Key:\tCB607C4842DF3781F8B6C9AB1A7D31F1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Where is my Coin?\"\nmsgstr \"Где моя монета?\"\n\n#. Key:\tCE80654A43078EA1E53C5E9C5114DE54\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_60.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_60.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"I can help you banish the monsters around the lake.\"\nmsgstr \"Я могу помочь тебе изгнать чудовищ вокруг озера.\"\n\n#. Key:\tD1412BF6490EA9357CE9F7A873B1FCAC\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_35.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_35.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"She was really curious about our rituals.\"\nmsgstr \"Ей было очень интересно узнать о наших ритуалах.\"\n\n#. Key:\tD76CDC9F410E2BCC21BCFB8D0D8A9E97\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_47.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_47.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"I’ve found some Purple Mushroom!\"\nmsgstr \"Я нашел Пурпурный Гриб!\"\n\n#. Key:\tD87335EA45EAC6F84022FEBE57F5CADF\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_25.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_25.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Or what? Will you cook me?\"\nmsgstr \"Или что? Ты сваришь меня?\"\n\n#. Key:\tD9B7F3E240430AA5EF537A8F81814751\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_71.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_71.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"I'm glad that the lake is peaceful again. Thank you!\"\nmsgstr \"Я рад, что озеро снова стало спокойным. Спасибо!\"\n\n#. Key:\tE15F80EA40F193E47F372FA7EE9A949E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_0.SpeechSequence(5).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_0.SpeechSequence(5).SpeechSequence.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Now they are gone and I'm alone with the monsters they left here.\"\nmsgstr \"Теперь они ушли, а я наедине с чудовищами, которых они оставили здесь.\"\n\n#. Key:\tE3947B064E58A1FD7B96A3956C54415D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_0.SpeechSequence(2).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_0.SpeechSequence(2).SpeechSequence.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"But then other Kobolds came. They called themselves the Great Kobols.\"\nmsgstr \"Но потом пришли другие Коболды. Они называли себя Великими Коболдами.\"\n\n#. Key:\tE48A1DFB458275188357F5811E98CFD4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_59.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_59.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"And also take this! I could have not done the soup in time without your help.\"\nmsgstr \"И ещё вот возьми! Я бы не смог вовремя приготовить суп без твоей помощи.\"\n\n#. Key:\tE58EEE904A6CBF1A0E2E768583EB03DC\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(7).Children.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(7).Children.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Trade\"\nmsgstr \"Купить\"\n\n#. Key:\tE60B94C04C63F0E074A5B8ABFED7AE62\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_66.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_66.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"I have something for you.\"\nmsgstr \"У меня есть кое-что для тебя.\"\n\n#. Key:\tEA71F6A6412E69C31302A2B57BFD266F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_39.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_39.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Now they are both gone.\"\nmsgstr \"Теперь их больше нет.\"\n\n#. Key:\tECA4BB2D4EB774315D57FD9A5D66CF25\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_22.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_22.Children(1).Children.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Don't give\"\nmsgstr \"Не отдавать\"\n\n#. Key:\tED97FDEB46CAC89F65734D990569618C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_17.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_17.Children(1).Children.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Decline\"\nmsgstr \"Отклонить\"\n\n#. Key:\tEFD0511840178E579287BAB7FA3FDADE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(0).Children.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Banish Monsters\"\nmsgstr \"Изгнание Чудовищ\"\n\n#. Key:\tF5A08C63415DF9FE007B97931B7A7C31\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(9).Children.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(9).Children.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Leave\"\nmsgstr \"Выйти\"\n\n#. Key:\tF7EA437842BBD099521D81B87211F49E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_30.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_30.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"I’m the last of my tribe.\"\nmsgstr \"Я последний из моего племени.\"\n\n#. Key:\tFC8F235840D6AF4A86170791A617BCA9\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Who are you? What are you doing here?\"\nmsgstr \"Кто ты? Что ты здесь делаешь?\"\n\n#. Key:\tFF27D3BF4D181753D73AD79D384CD3ED\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"What are you Kobolds like? What are you doing?\"\nmsgstr \"Какие вы Коболды? Что вы делаете?\"\n\n#. Key:\t587277824A24A49F9319D0B452A709AD\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/LB_Device.LB_Device:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Ending/E1/LB_Device.LB_Device:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_LB_Device\"\nmsgid \"Monk wanted me to use this device to separate the Worlds.\"\nmsgstr \"Монах хотел, чтобы я использовал это устройство, чтобы разделить Миры.\"\n\n#. Key:\t83B9F1E146084039E4BAD185B455209C\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LB_Device.LB_Device:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E2/LB_Device.LB_Device:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_LB_Device\"\nmsgid \"With Father we did all we could to make the device perfect. I won’t let us lose so close to the end!\"\nmsgstr \"Мы с отцом сделали все возможное, чтобы устройство было совершенным. Я не позволю нам проиграть когда мы так близки к концу!\"\n\n#. Key:\t90E0E1E44BE9D84FC514248D73A31935\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LB_Device.LB_Device:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Ending/E2/LB_Device.LB_Device:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_LB_Device\"\nmsgid \"Three years of hard work.\"\nmsgstr \"Три года упорного труда.\"\n\n#. Key:\tFB8EC2184310BA168B9C6E9DB51C4492\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LB_Device.LB_Device:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E2/LB_Device.LB_Device:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_LB_Device\"\nmsgid \"I need to pull the left lever first.\"\nmsgstr \"Сначала мне нужно потянуть за левый рычаг.\"\n\n#. Key:\tDAC636D74C51C30F4B790B9F87203957\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/LB_DeviceUse.LB_DeviceUse:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Ending/E1/LB_DeviceUse.LB_DeviceUse:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_LB_DeviceUse\"\nmsgid \"Er... so far pulling the levers worked but this machine looks fairly complicated.\"\nmsgstr \"Эээ... пока тянуть за рычаги работало, но эта машина выглядит довольно сложной.\"\n\n#. Key:\tE0D3606C4F357F03FBC916AA3573A81D\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/LB_DeviceUse.LB_DeviceUse:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E1/LB_DeviceUse.LB_DeviceUse:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_LB_DeviceUse\"\nmsgid \"I should look around to find some instructions on how it works.\"\nmsgstr \"Я должен осмотреться, найти какие-нибудь инструкции о том, как это работает.\"\n\n#. Key:\t2DB770DF48D3199FFDEA3F8AB99126D5\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LB_LeftLever.LB_LeftLever:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Ending/E2/LB_LeftLever.LB_LeftLever:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_LB_LeftLever\"\nmsgid \"I heard them knocking on the door. They surely heard the alarm when I entered.\"\nmsgstr \"Я слышу, как они стучат в дверь. Они точно услышали сигнализацию, когда я вошел.\"\n\n#. Key:\tB5D008804CCD51DF8CA8F5B99CA0C0FB\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LB_LeftLever.LB_LeftLever:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E2/LB_LeftLever.LB_LeftLever:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_LB_LeftLever\"\nmsgid \"I need to hurry. The middle lever is the next one.\"\nmsgstr \"Мне нужно поторопиться. Средний рычаг - следующий.\"\n\n#. Key:\tC7B08D314C68A7E4D21E20B128670516\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LB_MiddleLever.LB_MiddleLever:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Ending/E2/LB_MiddleLever.LB_MiddleLever:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_LB_MiddleLever\"\nmsgid \"We both made our decision three years ago.\"\nmsgstr \"Мы оба приняли решение три года назад.\"\n\n#. Key:\tFBC301B94D990F1F3FD30383FF916327\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LB_MiddleLever.LB_MiddleLever:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Ending/E2/LB_MiddleLever.LB_MiddleLever:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_LB_MiddleLever\"\nmsgid \"I’ve made my choice.\"\nmsgstr \"Я сделал свой выбор.\"\n\n#. Key:\tFD2036CF4FC103724FB18F83754367A0\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LB_MiddleLever.LB_MiddleLever:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E2/LB_MiddleLever.LB_MiddleLever:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_LB_MiddleLever\"\nmsgid \"I heard the door exploding. Father must be really mad but It doesn’t matter now.\"\nmsgstr \"Я услышал, как взорвалась дверь. Отец, должно быть, очень зол, но сейчас это не имеет значения.\"\n\n#. Key:\t98F843004F338E4480C942A9B9646BDE\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LB_RightLever.LB_RightLever:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E2/LB_RightLever.LB_RightLever:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_LB_RightLever\"\nmsgid \"I pulled the last lever.\"\nmsgstr \"Я потянул за последний рычаг.\"\n\n#. Key:\t9F6EBBE74FA6289497401C8E7400B01E\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LR_Bed.LR_Bed:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E2/LR_Bed.LR_Bed:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_LR_Bed\"\nmsgid \"Sleeping wasn’t easy since Mom was gone.\"\nmsgstr \"Спать было нелегко с тех пор, как мамы не стало.\"\n\n#. Key:\tAE56EE704265B61C84123F9775EB424C\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LR_Bed.LR_Bed:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E2/LR_Bed.LR_Bed:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_LR_Bed\"\nmsgid \"I really couldn’t sleep that night.\"\nmsgstr \"Я действительно не мог заснуть той ночью.\"\n\n#. Key:\t344E65304BB63905D487CCAF191DFE95\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LR_Chest.LR_Chest:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Ending/E2/LR_Chest.LR_Chest:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_LR_Chest\"\nmsgid \"It was half past eleven.\"\nmsgstr \"Было полдвенадцатого.\"\n\n#. Key:\t5DD659BE428981065F3A989D284C3542\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LR_Chest.LR_Chest:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E2/LR_Chest.LR_Chest:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_LR_Chest\"\nmsgid \"I took the key.\"\nmsgstr \"Я взял ключ.\"\n\n#. Key:\tF21CEE6143FD904B2285F9BEE01174A0\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LR_Chest.LR_Chest:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E2/LR_Chest.LR_Chest:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_LR_Chest\"\nmsgid \"Daddy didn’t like if I went out in the night but I felt something calling for me.\"\nmsgstr \"Папе не нравилось, что я выхожу погулять ночью, но я чувствовала, что что-то зовет меня.\"\n\n#. Key:\t8B18714145E8614E70F531BDB1A2AAAB\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LR_Door.LR_Door:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E2/LR_Door.LR_Door:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_LR_Door\"\nmsgid \"I always locked the door just to make sure I won’t sleep walk out.\"\nmsgstr \"Я всегда запирал дверь, чтобы быть уверенным, что не выйду из дома во сне.\"\n\n#. Key:\tE5B14EEE4719891E2D2493A4E793A2C4\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LR_Door.LR_Door:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Ending/E2/LR_Door.LR_Door:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_LR_Door\"\nmsgid \"I opened the door.\"\nmsgstr \"Я открыл дверь.\"\n\n#. Key:\tF8090D7B4DCD959D7893338BDA2B6256\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LR_Door.LR_Door:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E2/LR_Door.LR_Door:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_LR_Door\"\nmsgid \"I hid the key under the clock.\"\nmsgstr \"Я спрятал ключ под часами.\"\n\n#. Key:\t8363A3C9426FA1F007A5E783B1D72171\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LR_Notebook.LR_Notebook:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E2/LR_Notebook.LR_Notebook:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_LR_Notebook\"\nmsgid \"Here I collected all my less scientific notes on the Ruined Realm.\"\nmsgstr \"Здесь я собрал все мои менее научные заметки о Разрушенном Царстве.\"\n\n#. Key:\tA0B131B34A29BEADA3E3CDB74C7EDBCA\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LR_Notebook.LR_Notebook:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Ending/E2/LR_Notebook.LR_Notebook:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_LR_Notebook\"\nmsgid \"They deserve to be remembered. I will miss them.\"\nmsgstr \"Они заслуживают того, чтобы их запомнили. Я буду скучать по ним.\"\n\n#. Key:\tB66C98C34782719B5CF6F19F608C00F0\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LR_Notebook.LR_Notebook:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E2/LR_Notebook.LR_Notebook:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_LR_Notebook\"\nmsgid \"So many lovely people! Despite their madness.\"\nmsgstr \"Так много милых людей! Несмотря на их безумие.\"\n\n#. Key:\t0DAF7BA0480BDF56BC47A7826A5186C2\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LR_TabbyBed.LR_TabbyBed:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E2/LR_TabbyBed.LR_TabbyBed:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_LR_TabbyBed\"\nmsgid \"Sometimes I wished there could be a place like that for me as well.\"\nmsgstr \"Иногда мне хотелось бы, чтобы такое место было и для меня.\"\n\n#. Key:\t6084018D4E86CF2ACA89219824C8F776\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LR_TabbyBed.LR_TabbyBed:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Ending/E2/LR_TabbyBed.LR_TabbyBed:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_LR_TabbyBed\"\nmsgid \"As usually Tabby was out there maybe hunting or just hanging out with other cats.\"\nmsgstr \"Как обычно, Тэбби был там, может быть, охотился или просто гулял с другими кошками.\"\n\n#. Key:\t9702175346DD6BD2CBDB9C8D23460866\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LR_TabbyBed.LR_TabbyBed:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E2/LR_TabbyBed.LR_TabbyBed:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_LR_TabbyBed\"\nmsgid \"In this World, he was normal.\"\nmsgstr \"В этом мире он был нормальным.\"\n\n#. Key:\t018B13FB403C2E979380C68B92CC1E46\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LR_Window.LR_Window:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Ending/E2/LR_Window.LR_Window:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_LR_Window\"\nmsgid \"Yet sometimes I liked to watch other kids playing in the castle garden.\"\nmsgstr \"Но иногда мне нравилось смотреть, как другие дети играют в саду замка.\"\n\n#. Key:\t15454EFF40C99A479173E294B612C66C\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LR_Window.LR_Window:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E2/LR_Window.LR_Window:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_LR_Window\"\nmsgid \"They didn’t understand how important my task was.\"\nmsgstr \"Они не понимали, насколько важна моя задача.\"\n\n#. Key:\t4460452B4A8B40C59075779751D3D760\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LR_Window.LR_Window:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Ending/E2/LR_Window.LR_Window:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_LR_Window\"\nmsgid \"I didn’t leave the castle since Mom died.\"\nmsgstr \"Я не покидала замок с тех пор, как умерла мама.\"\n\n#. Key:\t795D92CB49E6F50CE37897A793C6A711\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LR_Window.LR_Window:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Ending/E2/LR_Window.LR_Window:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_LR_Window\"\nmsgid \"Two years passed and they still didn’t give up throwing balls on the window to get my attention.\"\nmsgstr \"Прошло два года, и они все еще не перестали бросать яйца в окно, чтобы привлечь мое внимание.\"\n\n#. Key:\tB1A689B24F5D77A715114AB718126A75\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LR_Window.LR_Window:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E2/LR_Window.LR_Window:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_LR_Window\"\nmsgid \"They will never understand.\"\nmsgstr \"Они никогда не поймут.\"\n\n#. Key:\t06B2BD844B477A747E086F9F0C3BCAFE\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"Well, that fountain is definitely not your cup of tea but you can accept that it might be the fairest for the Magic Mirror...\"\nmsgstr \"Ну, тот фонтан определенно не по твоему вкусу, но ты можешь согласиться с тем, что он может быть самым прекрасным для Волшебного Зеркала...\"\n\n#. Key:\t264C2C1040339F9680CA129F4E6E7764\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_65.Children(0).Children.Text\n#. Key:\t608D4BF341FEE76F239D6BA3B34F65E7\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_1.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_1.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_65.Children(0).Children.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"Who is the fairest?\"\nmsgstr \"Кто самый прекрасный?\"\n\n#. Key:\t2C246C1326080F0A003A03BBBE7E9F40\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_39.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_39.Children(1).Children.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"Wish something\"\nmsgstr \"Загадай желание\"\n\n#. Key:\t2C6C88C54439E3C689E86DB30560B807\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_66.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_66.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"No matter how hard you try to receive a sign, the Mirror remains silent. It doesn't show you anything this time.\"\nmsgstr \"Неважно, как сильно ты пытаешься получить хоть какой-то знак, Зеркало молчит. И в это раз оно ничего тебе не показывает.\"\n\n#. Key:\t317248C14F0904B6E6B04080841C75D1\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_39.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_39.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"The water seems to be boiling and the bubbles pop when they hit the surface; it is indeed mesmerizing. Suddenly, something breaks the silence - you can hear whispers.\"\nmsgstr \"Вода, кажется, бурлит, и пузырьки когда выходят на поверхность, лопаются; это действительно завораживает. Но внезапно что-то нарушает эту тишину - ты слышишь шепот.\"\n\n#. Key:\t372D97104DC7D67AF4B2409B7CBC602D\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_66.Children(0).Children.Text\n#. Key:\t432E8D794C2FB271D9B39283EBD9E33B\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_1.Children(2).Children.Text\n#. Key:\tF212015B402EF862C9869394531175DC\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_65.Children(2).Children.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_1.Children(2).Children.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_65.Children(2).Children.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_66.Children(0).Children.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"Leave\"\nmsgstr \"Выйти\"\n\n#. Key:\t3FBF959348F2AFFA8016AA9371DD0800\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"You politely explain that you want to see your past instead of your body, but the Mirror is stubbornly stuck on this image.\"\nmsgstr \"Ты вежливо объясняешь, что хочешь увидеть свое прошлое, а не тело, но Зеркало упрямо застряло на этом изображении.\"\n\n#. Key:\t4620F3E84D5DC9847AB8A8891CF66F20\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_67.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_67.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"You place the flower and wait to see what happens.\"\nmsgstr \"Ты ставишь цветок и ждешь, чтобы увидеть, что произойдет.\"\n\n#. Key:\t5C2363C64023EB8E1705D3BFC3310A8A\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_65.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_65.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"The vision fades away.\"\nmsgstr \"И видение исчезает.\"\n\n#. Key:\t648780E44EF4F6587D31E7AE2BE4CCE4\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_68.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_68.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"The Mirror seems to be unavailable at the moment. It doesn't want to be bothered. Maybe you should return later.\"\nmsgstr \"Зеркало, кажется, сейчас недоступно. Оно не хочет, чтобы его беспокоили. Может, тебе стоит вернуться позже.\"\n\n#. Key:\t74CAAA1D4671A258A6D188BCED32CCBD\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_69.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_69.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"The water turns still. Deep under the surface you notice a glimmering light.\"\nmsgstr \"Вода перестает бурлить. И в глубине под гладью ты замечаешь мерцающий свет.\"\n\n#. Key:\t7CD8BEEA40A36A22057920807BBEEC07\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"The Magic Mirror shows things that were, things that are, and things that yet may be. \\r\\nYou fill the basin with water and start contemplating. You meditate about...\"\nmsgstr \"Волшебное Зеркало показывает вещи, которые были, вещи, которые есть, и вещи, которые могут быть. \\nТы наполняешь раковину водой и начинаешь размышлять. Ты размышляешь о...\"\n\n#. Key:\t8226F9B3495DE20F137F95A7F3583FE0\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"Ruin left this place almost untouched. The street lamps spread light on a couple of metal benches and flower pots.\"\nmsgstr \"Руин оставил это место почти нетронутым. Уличные фонари освещают пару металлических лавок и цветочных горшков.\"\n\n#. Key:\t82C33F1E49C5DC76BF19648A414F7209\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"You are watching the ball and start to get frustrated. You don't want to look at this body replacement... this raggy shell... You want answers!\"\nmsgstr \"Ты смотришь на шар и начинаешь злиться. Ты не хочешь смотреть на эту замену тела... эту тряпичную оболочку... Тебе нужны ответы!\"\n\n#. Key:\t8F94D5E34488ECDCE9E051BB1ABE66B9\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_1.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_1.Children(1).Children.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"Who you were in the past\"\nmsgstr \"Кем ты была в прошлом\"\n\n#. Key:\t9BA86AAD4282A943E8A57390E2C4E3CF\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_39.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_39.Children(0).Children.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"Floating Flower\"\nmsgstr \"Парящий Цветок\"\n\n#. Key:\tA8A6D8D44F9344A162FAA080C839B28A\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"There are glass shards all over the place. There's a ball on the floor next to the girl.\"\nmsgstr \"Повсюду осколки стекла. И шар на полу рядом с девочкой.\"\n\n#. Key:\tAF212CEC43A56245A848DABD21ECBAFC\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_70.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_70.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"You reach for the light and your fingers grab onto something smooth and cold.\"\nmsgstr \"Ты тянешься к свету, и пальцами хватаешься за что-то гладкое и холодное.\"\n\n#. Key:\tB8E2A52B442F3B45A1D993A8548DE124\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"You are seeing the wizard's room once more. There is a weakened little girl lying on the floor in the middle of the room. She is surrounded by stone runes, candles and magical potions.\"\nmsgstr \"Ты снова видишь комнату волшебника. В середине комнаты на полу лежит ослабленная маленькая девочка. Она окружена каменными рунами, свечами и волшебными зельями.\"\n\n#. Key:\tB9217F85404B488DB6F4DDACFF2B824C\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_65.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_65.Children(1).Children.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"What you were before\"\nmsgstr \"Кем ты был до этого\"\n\n#. Key:\tCD33272B416D2FDE283D44BA6F50475C\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"The image zooms in and you have a clearer view of the fountain. You are waiting for more, but nothing happens.\"\nmsgstr \"Изображение увеличивается, и ты видишь фонтан более четко. Ты ждешь еще, но ничего не происходит.\"\n\n#. Key:\tD64B38F1470B27D21AE539AE80AE666A\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"You are seeing the Ruined Realm from afar. The view gets closer until you find yourself looking at the top of a tower.\"\nmsgstr \"Ты видишь Разрушенное Царство издалека. Вид все ближе и ближе, и ты смотришь на вершину башни.\"\n\n#. Key:\tF3C496794CC4A68DDC764895FF2DFC77\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_72.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_72.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"You found a precious rune stone! Hmmm...Is this the gift offered by the Mirror in exchange for your enchanting flower?\"\nmsgstr \"Ты нашел драгоценный рунический камень! Хм... Это подарок, от Зеркала в обмен на твой очаровательный цветок?\"\n\n#. Key:\t10A6FAE44F71FBB21522B1AAE5E20DAE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_29.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_29.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"I don’t care what happens here after I’m back home.\"\nmsgstr \"Мне плевать, что будет с этим местом после того, как я вернусь домой.\"\n\n#. Key:\t12C6550D4143AFE12C6986B427D2927A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"He can’t release his daughter. He can’t accept that she is gone. He wants to get her back even if it means they all die after a few months...\"\nmsgstr \"Он не может отпустить свою дочь. Он не может смириться с тем, что она мертва. Он хочет вернуть ее, даже если это значит, что они все умрут через несколько месяцев...\"\n\n#. Key:\t1C714E474408001FB67CEABF92FAB019\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Wait! You can’t just dis...\"\nmsgstr \"Подожди! Ты не можешь просто...\"\n\n#. Key:\t209B77394D419812DD1BD7A3D7A92B94\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_39.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_39.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"All right and what can we do against it?\"\nmsgstr \"Хорошо, и как мы можем противостоять этому?\"\n\n#. Key:\t209BF95E4275418CE020E3AB028AFC10\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Now it’s better.\"\nmsgstr \"Вот так-то лучше.\"\n\n#. Key:\t230C6ED4416FDD6C5E00FAB8B30FBB17\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"To be honest I don’t have the faintest idea. I just want to be free again.\"\nmsgstr \"Честно говоря, у меня нет ни малейшего представления. Я просто хочу снова быть свободным.\"\n\n#. Key:\t25227AB342F4A0E76082539072C1143D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_37.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_37.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Do you think Ruin will stop after swallowing the Human Realm?\"\nmsgstr \"Думаешь, Руин остановится после того, как проглотит Человеческое царство?\"\n\n#. Key:\t266261C240DB77D1306C5F8EEE3D0189\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"He says he wants his daughter back but I think he is still trying to close the Realm to stop Ruin.\"\nmsgstr \"Он говорит, что хочет вернуть свою дочь, но я думаю, что он все еще пытается закрыть Царство, чтобы остановить Руин.\"\n\n#. Key:\t283810E04DE48471FBE6BD9BE9DD337D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Yet he doesn’t care about the World. He wants to get her back even if it means they all die after a few months...\"\nmsgstr \"Но ему плевать на мир. Он хочет вернуть ее, даже если это значит, что они все умрут через несколько месяцев...\"\n\n#. Key:\t2CE94F19412379ECE927A3AEEEAC3756\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_1.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_1.Children(1).Children.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Thanks for the Soulcaster\"\nmsgstr \"Спасибо за Заклинателя\"\n\n#. Key:\t2DB5F39F45BB9EC8ABBFEA9020DF94E7\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Why should it concern me if Ruin destroys your Realm? You deserve it for summoning us to do the hard work.\"\nmsgstr \"Почему меня должно волновать, что Руин уничтожит твое царство? В конце концов ты заслужил это, за то, что вызвал нас проделать всю тяжелую работу.\"\n\n#. Key:\t30E5A67B4135A5402AE021832F89D4D1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"You again? I told you if you want something from the Wizard go and find him yourself...\"\nmsgstr \"Опять ты? Я же сказал, если тебе что-то нужно от Волшебника, иди и найди его сам...\"\n\n#. Key:\t34BCB98247406A77FB5A5C8942543588\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_38.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_38.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"It might take time but it will reach the Unknown Realm and all the spirits will become part of Ruin just like those who were summoned here.\"\nmsgstr \"Это может займет время, но оно достигнет Неизвестного Царства, и все духи станут частью Руина, как и те, кто был вызван сюда.\"\n\n#. Key:\t379B50904FB774AD057BBB810BDD445C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_41.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_41.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"I’m not sure. I will think about it.\"\nmsgstr \"Я не уверен. Я подумаю об этом.\"\n\n#. Key:\t38BEECF94D2EB7B2C6596593E576A360\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_30.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_30.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"The Wizard created a device which can separate the Realms. This is the only way to stop Ruin from spreading.\"\nmsgstr \"Волшебник создал устройство, которое может разделять Царства. Это единственный способ остановить распространение Руина.\"\n\n#. Key:\t3D7B856A4D97FCCC2A2B89BCB6295471\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"This time I would like to talk to you...\"\nmsgstr \"На этот раз я хотел бы поговорить с тобой...\"\n\n#. Key:\t40A329C7465166A11C73B694D6A79A00\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_12.Children(2).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_12.Children(2).Children.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Don’t know\"\nmsgstr \"Не знаю\"\n\n#. Key:\t4D356117496E625B6B4C64A611496A9F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_24.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_24.Children(1).Children.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Not my problem\"\nmsgstr \"Не моя проблема\"\n\n#. Key:\t4FE5ADF04D1079CCD1E16697E82B39B5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_35.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_35.Children(0).Children.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Accept plan\"\nmsgstr \"Принять план\"\n\n#. Key:\t53D6055344A880433B1093B029DA8CA5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_12.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_12.Children(0).Children.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Bring back daughter\"\nmsgstr \"Вернуть дочь\"\n\n#. Key:\t599FF022411F5BA2EB0F32A1F947C661\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_35.Children(2).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_35.Children(2).Children.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Not sure\"\nmsgstr \"Не уверен\"\n\n#. Key:\t5FD6018040C38B8A3F40C78C913AC251\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_40.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_40.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Have no fear, I will have this done!\"\nmsgstr \"Не бойся, я сделаю это!\"\n\n#. Key:\t6B3585BA4AFE614FF428FCAE698872A8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_33.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_33.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"For you this would be completely different. For you this is not a sacrifice but a way of going home!\"\nmsgstr \"Для тебя это будет совсем по-другому. Для тебя это не жертва, а способ вернуться домой!\"\n\n#. Key:\t6E1C94F24F493D7075A7509F8181AD27\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"You are wrong. The World is falling apart yet he doesn’t care about it even when he is the only one who could stop Ruin.\"\nmsgstr \"Ты ошибаешься. Мир разваливается на части, но его это не волнует, даже если он единственный, кто может остановить Руин.\"\n\n#. Key:\t71A64B804C0CCE26571E9E8237AA5000\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"I’m also glad. It was bloody damn difficult.\"\nmsgstr \"Я тоже рад. Это было чертовски трудно.\"\n\n#. Key:\t78305AE64B56098D32806EB509133BBC\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_35.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_35.Children(1).Children.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Decline plan\"\nmsgstr \"Отклонить план\"\n\n#. Key:\t7C92B8BF4CEA3093BB817682B501DC67\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"The World is falling apart and only the Wizard has a chance to stop this.\"\nmsgstr \"Мир разваливается на части, и только у Волшебника есть шанс остановить это.\"\n\n#. Key:\t8B2CE8144EB2A7C89AFA1BACC3EE1B88\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Hello, little Wanderer! I’m glad you made it this far.\"\nmsgstr \"Привет, маленький Странник! Я рад, что ты смог зайти так далеко.\"\n\n#. Key:\t8CC98B374125E6E6A6A20C97F4A3B067\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_24.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_24.Children(0).Children.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"I'm a demon\"\nmsgstr \"Я демон\"\n\n#. Key:\t8D4701A1469997CBC879788351B37B0A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_31.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_31.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"My plan is simple.\"\nmsgstr \"Мой план довольно прост.\"\n\n#. Key:\t8E4693F04E60AFF4757A5887973894BE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_27.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_27.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"I saw Ruin and I don’t want the same to happen to any other Realm. What can I do?\"\nmsgstr \"Я видел Руин и не хочу, чтобы то же самое случилось с любим другим Царством. Чем я могу помочь?\"\n\n#. Key:\t9193CB2747033644F006809E0E4A812A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_45.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_45.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"For the sake of all Realms I hope you will make the right decision.\"\nmsgstr \"Ради всех Царств я надеюсь, что ты примешь правильное решение.\"\n\n#. Key:\t95D6FBCC42CC4F4041D0B5B64996FD5C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_35.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_35.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Once you are there find the Laboratory and activate the device! It will take you home and will separate the Worlds which means no spirit will be ever summoned again!\"\nmsgstr \"Как только ты окажешься там, найди Лабораторию и активируй устройство! Оно доставит тебя домой и разделит Миры, а это значит, что ни один дух больше никогда не будет вызван!\"\n\n#. Key:\t9ADEF37F49EA90EF320B5E8BB2D8D769\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"...and I don’t want our conversation to be overheard, so if you don’t mind...\"\nmsgstr \"...и я бы не хотел, чтобы наш разговор был подслушан, так что, если ты не возражаешь...\"\n\n#. Key:\t9F01EFC54F3FC5B709F697860BE0572D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_24.Children(2).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_24.Children(2).Children.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"How to save the World?\"\nmsgstr \"Как спасти мир?\"\n\n#. Key:\tA71226674132E2666925AEB28D2FC024\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_46.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_46.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Farewell Wanderer!\"\nmsgstr \"Прощай, Странник!\"\n\n#. Key:\tB1E3A9DB4A75C08067DCA19113A6A8A2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Calm down little spirit.\"\nmsgstr \"Успокойся, маленький дух.\"\n\n#. Key:\tB355BD604F9EC22514DA14B64B0F5E5E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_43.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_43.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Thank you Spirit! For the sake of all Realms I hope you won’t fail on your way!\"\nmsgstr \"Спасибо, Дух! Ради всех царств, надеюсь, ты не потерпишь неудачу на своем пути!\"\n\n#. Key:\tB6D3E23045C4BC5B3E5F3D83E2DFBADB\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_19.Text\n#. Key:\tDC3219914721210BD169D2989F03D18D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"But we won’t let this happen, will we?\"\nmsgstr \"Но мы же этого не допустим, правда?\"\n\n#. Key:\tBAC828A540E6C81EE43EBF8036A8146A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_42.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_42.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"You deserve Ruin. I won’t save the Human Realm!\"\nmsgstr \"Ты заслуживаешь Руина. Я не собираюсь спасать Человеческое царство!\"\n\n#. Key:\tC837CED4495F79594133F4B2C0FCE5F8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Where shall I start? Do you know what the Wizard is up to? Did he tell you?\"\nmsgstr \"С чего мне начать? Ты знаешь, что задумал Волшебник? Он сказал тебе что-нибудь?\"\n\n#. Key:\tD060173B4D5502FC06A69E865DAFD5E6\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_26.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_26.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"This is not my Realm and not my problem. All I want is to get out of here.\"\nmsgstr \"Это не мое Царство и уж точно не моя проблема. Все, чего я хочу - это выбраться отсюда.\"\n\n#. Key:\tD520C3AC46F62B77554443A4589845C1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"He would like to bring his daughter back to life. For that he needs three artefacts which are somewhere here.\"\nmsgstr \"Он хотел бы вернуть свою дочь к жизни. Для этого ему нужны три артефакта, которые где-то здесь.\"\n\n#. Key:\tD7F841B14E18D77AB5FBD2A34D59BC92\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_44.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_44.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"I understand your fury. Yet I hope you will change your mind.\"\nmsgstr \"Я понимаю твою ярость. Тем не менее, я надеюсь, что ты передумаешь.\"\n\n#. Key:\tD80B81914A550F305934F9852C1DD6B0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_23.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_23.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"He lost his daughter and he can’t release her. He can’t accept that she is gone.\"\nmsgstr \"Он потерял свою дочь и не может ее отпустить. Он не может смириться с тем, что она мертва.\"\n\n#. Key:\tD816A79E4160BC4426CD22A63C7987A0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Before you go on I have something to discuss with you...\"\nmsgstr \"Прежде чем ты уйдешь, мне нужно кое-что обсудить с тобой...\"\n\n#. Key:\tDD870754471358DEFE9CB5BFA554AB7C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_1.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_1.Children(0).Children.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Me too\"\nmsgstr \"Я тоже\"\n\n#. Key:\tE0CCA2604AA40FED355A859A1FA02DDA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_1.Children(2).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_1.Children(2).Children.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"I won’t deliver any message\"\nmsgstr \"Я не буду доставлять никаких сообщений\"\n\n#. Key:\tE1C3F2E34680BA8B67521C905AD42ADA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"That’s correct. He can’t release his daughter. He can’t accept that she is gone.\"\nmsgstr \"Верно. Он не может отпустить свою дочь. Он не может смириться с тем, что она мертва.\"\n\n#. Key:\tE93136104181FAA899F2CE801497DCBA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_25.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_25.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"I know right now it doesn’t look that way, but I’m a mighty demon of the Unknown Realm.\"\nmsgstr \"Я знаю, что сейчас это так не выглядит, но я могущественный демон из Неизвестного Царства.\"\n\n#. Key:\tEC116A8848A471EB2C5DC8BA1D187C9A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_12.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_12.Children(1).Children.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Close Ruined Realm\"\nmsgstr \"Закрыть Разрушенное Царство\"\n\n#. Key:\tEC6221CE4B85E7D1887DBCA6D85D8238\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"It wasn’t easy but I made good use of the Spellcaster you gave me.\"\nmsgstr \"Это было нелегко, но мне очень пригодился заклинатель, который ты мне дал.\"\n\n#. Key:\tED5356DE42F2ED2203F7AFB30231643E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_34.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_34.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"When you deliver the artefacts he will let you into his tower.\"\nmsgstr \"Когда ты доставишь артефакты, он впустит тебя в свою башню.\"\n\n#. Key:\tEE78AD4147800BD0E160A8B6A3F51FBD\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_32.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_32.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"When the Wizard’s daughter activated the device it transported her soul into the Unknown Realm. At that point the Wizard stopped the device so that he can summon his daughter back.\"\nmsgstr \"Когда дочь Волшебника активировала устройство, она перенесла свою душу в Неизвестное царство. В этот момент Волшебник остановил устройство, чтобы вернуть свою дочь обратно.\"\n\n#. Key:\tEFACA50447BAC08293281BB11A5E11B3\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_36.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_36.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"This is just as much your problem as it is mine.\"\nmsgstr \"Это так же твоя проблема, как и моя.\"\n\n#. Key:\tFB0E702746132A3C688D9EA492A01B50\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"You made it and that is what matters.\"\nmsgstr \"Ты справился, и это главное.\"\n\n#. Key:\t4BE3EE734EFED241B7FA2192EEB146A5\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/MR_Bed.MR_Bed:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Ending/E2/MR_Bed.MR_Bed:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_MR_Bed\"\nmsgid \"We always wore colourful clothes because that made her happy.\"\nmsgstr \"Мы всегда носили красочную одежду, потому что это делало ее счастливой.\"\n\n#. Key:\t7F5F069D4E9C7F15ED2B8CA45154FCFE\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/MR_Bed.MR_Bed:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E2/MR_Bed.MR_Bed:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_MR_Bed\"\nmsgid \"Most of her time she just lied here and stared at nothing.\"\nmsgstr \"Большую часть времени она просто лежала здесь и смотрела в никуда.\"\n\n#. Key:\tEA25DBC34832960AB03A32A5B08AC404\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/MR_Bed.MR_Bed:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E2/MR_Bed.MR_Bed:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_MR_Bed\"\nmsgid \"Sometimes she talked about grey lands.\"\nmsgstr \"Иногда она говорила о серых землях.\"\n\n#. Key:\t58E06C3A45DD46A34F155BAA62933039\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/MR_Chair.MR_Chair:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Ending/E2/MR_Chair.MR_Chair:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_MR_Chair\"\nmsgid \"I hope they will never find out how wrong they were. I hope there is still time for our World.\"\nmsgstr \"Надеюсь, они никогда не узнают, насколько они были неправы. Я надеюсь, что еще есть время для нашего мира.\"\n\n#. Key:\t9EA75B664E62ABF38E44BE8DC3050AC9\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/MR_Chair.MR_Chair:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E2/MR_Chair.MR_Chair:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_MR_Chair\"\nmsgid \"This is where the doctor used to sit. He never believed that Mom was infected by the Ruin.\"\nmsgstr \"Здесь раньше сидел доктор. Он никогда не верил, что мама заражена Руином.\"\n\n#. Key:\tA408630F44A3B2345A2D0AA8395D97F2\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/MR_Chair.MR_Chair:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E2/MR_Chair.MR_Chair:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_MR_Chair\"\nmsgid \"No one ever believed in Ruin.\"\nmsgstr \"Никто никогда не верил в Руин.\"\n\n#. Key:\t1AFEF7EB49BB3BEA5BB76793A60ED7C9\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/MR_Lamps.MR_Lamps:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E2/MR_Lamps.MR_Lamps:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_MR_Lamps\"\nmsgid \"This room was the brightest in the castle.\"\nmsgstr \"Эта комната была самой светлой в замке.\"\n\n#. Key:\tC132BEA446B4441615D7029E8AA5BBB5\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/MR_Lamps.MR_Lamps:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E2/MR_Lamps.MR_Lamps:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_MR_Lamps\"\nmsgid \"I took some oil.\"\nmsgstr \"Я взял немного масла.\"\n\n#. Key:\tFE826997431A2665AC2788A62558B88E\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/MR_Lamps.MR_Lamps:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Ending/E2/MR_Lamps.MR_Lamps:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_MR_Lamps\"\nmsgid \"Father bought some exotic lamp oil so that we had coloured lights.\"\nmsgstr \"Отец купил пару экзотических масляных ламп, чтобы у нас были цветные лампочки.\"\n\n#. Key:\t430A10B04FAC9288EC2794A31DF6699E\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/MR_Paintings.MR_Paintings:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E2/MR_Paintings.MR_Paintings:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_MR_Paintings\"\nmsgid \"Mom was always fond of art.\"\nmsgstr \"Мама всегда любила искусство.\"\n\n#. Key:\t53AA7E134FA0E30F37FC8CB50425520F\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/MR_Paintings.MR_Paintings:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E2/MR_Paintings.MR_Paintings:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_MR_Paintings\"\nmsgid \"After she got sick she couldn’t paint the way she did before yet she still liked it.\"\nmsgstr \"После того, как она заболела, она не могла рисовать так, как раньше, но ей все равно это нравилось.\"\n\n#. Key:\t8484045A4107378E9CC8FFAA02C94A87\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/MR_Paintings.MR_Paintings:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Ending/E2/MR_Paintings.MR_Paintings:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_MR_Paintings\"\nmsgid \"It could engage her for hours.\"\nmsgstr \"Это могло занять ее на несколько часов.\"\n\n#. Key:\t009BF08145DBE86FFB07BA9A6BD77A8E\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_5.Children(2).Children.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_5.Children(2).Children.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"Not my business\"\nmsgstr \"Меня это не касается\"\n\n#. Key:\t00DE9BE1446C5D5C0D62469B41A1B693\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_5.Children(0).Children.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_5.Children(0).Children.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"Lillian?\"\nmsgstr \"Лиллиан?\"\n\n#. Key:\t0C3B729C4618E8A817F019B8E916425B\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"Maybe we failed the ritual again and summoned another of your kind.\"\nmsgstr \"Может быть, мы опять ошиблись с ритуалом и вызвали другого такого же, как ты.\"\n\n#. Key:\t0CAC15144B37144A99A9EB9D13CCC9DE\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_32.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_32.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"What do you expect me to do, Spirit?\"\nmsgstr \"Чего ты ожидаешь от меня, Дух?\"\n\n#. Key:\t1493C597483503024A3C5CA8F0FA1327\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"I’ve already done way too much for you.\"\nmsgstr \"Я уже слишком много для тебя сделал.\"\n\n#. Key:\t15BAD73D49BF7C62469D8E9CD0B2AAF4\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"Now, take me home!\"\nmsgstr \"А теперь отвези меня домой!\"\n\n#. Key:\t1962A69C42E8FDD365AFC9AB626605F7\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"We made the spell... and it worked!\"\nmsgstr \"Мы произнесли заклинание... и оно сработало!\"\n\n#. Key:\t1AC8DD104163078CA72065A0B43B5C57\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"And then what?\"\nmsgstr \"И что потом?\"\n\n#. Key:\t2034A3164695766F8C17B69CD0937C02\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_25.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_25.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"And he...\"\nmsgstr \"А он...\"\n\n#. Key:\t22668011432DEF65ACF29793FF234E07\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_37.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_37.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"Someone like me...\"\nmsgstr \"Похожего на меня...\"\n\n#. Key:\t2386A8D24BD256982D486AAF71B57ABD\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_23.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_23.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"She destroyed half of the room before we could even cast a spell.\"\nmsgstr \"Она разнесла половину комнаты еще до того, как мы смогли наложить заклинание.\"\n\n#. Key:\t250E11A440445CAFB5252A92C5100735\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"That’s how you handle situations like these...\"\nmsgstr \"Вот как ты справляешься с такими ситуациями…\"\n\n#. Key:\t298BEA5646602444742C3BAD65866EF9\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"I’m not sure... Everything happened so fast.\"\nmsgstr \"Я не уверен... Все произошло так быстро.\"\n\n#. Key:\t2FAFABFC43A75D29B671739D16759E43\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"What happened?\"\nmsgstr \"Что произошло?\"\n\n#. Key:\t303D9BF54AB3034565A45594AB5636DF\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"I can’t... I’m sorry!\"\nmsgstr \"Я не могу... Извини!\"\n\n#. Key:\t378D7F984C821E23AF0CBEA7D24EFCC1\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"What happened to Lillian? Has she returned?\"\nmsgstr \"Что случилось с Лилиан? Она вернулась?\"\n\n#. Key:\t38EF0908448C7E5298C4F496DACAD5AD\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"Something... arrgh... something went wrong...\"\nmsgstr \"Что-то... что-то... что-то пошло не так...\"\n\n#. Key:\t3A328FA74AA2FBC2AFE84CA195DAE236\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"You are Raven’s master...\"\nmsgstr \"Ты хозяин Ворона...\"\n\n#. Key:\t462226704638D0C32B1DEBA3DFE138A1\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"She was taken over by a wicked force and she unleashed boundless spells.\"\nmsgstr \"Злые силы поглотили ее, дав безграничные заклинания.\"\n\n#. Key:\t49B5501A4917D23E6B3B99B430076ABA\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"It was like the devil itself.\"\nmsgstr \"Это как-будто был сам Дьявол.\"\n\n#. Key:\t4B173FBD4D4F48A468016BB055CC573C\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"Where is Wizard? Something happened to him?\"\nmsgstr \"Где Волшебник? С ним что-то случилось?\"\n\n#. Key:\t5341F61045AA32F212173EA9CAB67695\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_39.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_39.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"Wizard was right when he decided to trust you.\"\nmsgstr \"Волшебник был прав, когда решил довериться тебе.\"\n\n#. Key:\t551AEBA64D1E99B2CCFA3DB13E168A02\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_27.Children(1).Children.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_27.Children(1).Children.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"I won’t fight\"\nmsgstr \"Я не буду сражаться\"\n\n#. Key:\t592A8CF045DF1BD875B05F9493FE2BB4\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_38.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_38.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"I will face her!\"\nmsgstr \"Я сражусь с ней лицом к лицу!\"\n\n#. Key:\t5B65F12D43B12FA943D7469FEE2CE2E0\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"We made everything right...\"\nmsgstr \"Мы все сделали правильно...\"\n\n#. Key:\t65A974C344D2B4DD644901994086A31D\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_30.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_30.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"Why is it that every time you refuse to face the consequences of your actions, it is me who needs to clean up your mess?\"\nmsgstr \"Почему каждый раз, когда ты уходишь от ответственности за свои действия, именно я должен убирать твой беспорядок?\"\n\n#. Key:\t66D0FDF04AF5351330E83080759ED974\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_40.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_40.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"I'm sorry that I can't help...\"\nmsgstr \"Мне жаль, что я не могу помочь...\"\n\n#. Key:\t7FFE18B74C54BB92334399983F82DBCA\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_34.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_34.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"You are free to do whatever you want!\"\nmsgstr \"Ты можешь делать все, что захочешь!\"\n\n#. Key:\t8739EB3D48E4F2A997E604A60F7F32B3\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"Was it trapped inside a teddy bear?\"\nmsgstr \"Он был заперт внутри плюшевого медведя?\"\n\n#. Key:\t8E2F09164340534A484A46AD45E4E105\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_27.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_27.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"The demon-Lillian left. There is no one who could stop her now...\"\nmsgstr \"Демон-Лилиан сбежала. И нет никого, кто мог бы остановить ее сейчас...\"\n\n#. Key:\t900D084E4F673FEBEACE3E916103B93E\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"She had fire in her eyes...\"\nmsgstr \"В ее глазах огонь пылал...\"\n\n#. Key:\t91C26C314425AB8C973F1FB54061F639\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"Lillian woke up and then...\"\nmsgstr \"Лилиан проснулась, а потом...\"\n\n#. Key:\t95CE9C6C4901E613AD5DB38E51AC0DB3\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_35.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_35.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"Leave and let me rest in peace...\"\nmsgstr \"Уходите и дайте мне спокойно отдохнуть...\"\n\n#. Key:\t9AF3E069409F31E4F50A5990A416A39C\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_19.Children(1).Children.Text\n#. Key:\tF5A670D640D73DF452C02A948CB68F75\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_5.Children(1).Children.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_19.Children(1).Children.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_5.Children(1).Children.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"Wizard?\"\nmsgstr \"Волшебник?\"\n\n#. Key:\t9B1B8322442B6D7D76F2119E0A0574FA\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"Is the Wizard safe? What happened afterwards?\"\nmsgstr \"А Волшебник в безопасности? Что случилось потом?\"\n\n#. Key:\tA82789354D984476223432A2BE199293\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_24.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_24.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"I was hit by the table.\"\nmsgstr \"Меня ударили столом.\"\n\n#. Key:\tAA6EFD044C1D21008EEA189DE75740E7\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_41.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_41.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"Good luck with... everything!\"\nmsgstr \"Удачи с... всем!\"\n\n#. Key:\tACAF3D904A149C0E9F91E5AC852D8309\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_31.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_31.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"Let me go!\"\nmsgstr \"Отпусти меня!\"\n\n#. Key:\tB223647F4C35858A62A5509C7B22C23B\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_27.Children(0).Children.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_27.Children(0).Children.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"I'll stop her\"\nmsgstr \"Я остановлю ее\"\n\n#. Key:\tD0E16FEF4D5415EC6D2C299252E5675D\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_26.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_26.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"He was burnt to ashes.\"\nmsgstr \"Он сгорел дотла.\"\n\n#. Key:\tD23076F4475E6CE385ECB2B3B2749CA9\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_36.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_36.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"I have always wanted to meet someone of my own kind anyway.\"\nmsgstr \"Плюс я всегда хотел встретиться с кем-нибудь подобному мне.\"\n\n#. Key:\tD290445E4EB74446478970934785BA10\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"I can’t open a Gate without Wizard...\"\nmsgstr \"Я не могу открыть Врата без Волшебника...\"\n\n#. Key:\tD6EB1BE248E9C483E6D94B8E8A7815F6\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"I don't understand... It is...\"\nmsgstr \"Я не понимаю... Это...\"\n\n#. Key:\tEC42D62E46269139E9E69B876EDED5B1\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_33.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_33.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"It wasn't me who brought you here.\"\nmsgstr \"Не я был тем кто привел тебя сюда.\"\n\n#. Key:\tF0711D5F4698DAA99E484E94FDB3EF9C\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_19.Children(0).Children.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_19.Children(0).Children.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"Was it trapped?\"\nmsgstr \"Он был в ловушке?\"\n\n#. Key:\tFDE62A034456071EFE9639B73108BB1E\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"I can't let her destroy everything!\"\nmsgstr \"Я не могу позволить ей все разрушить!\"\n\n#. Key:\tFDFD2B2B4352B564118519874199B48C\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_29.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_29.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"No-no-no!\"\nmsgstr \"Не-не-не!\"\n\n#. Key:\t2E3C904D458640A4F06DD793B416366A\n#. SourceLocation:\t/Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_SewerCreatures\"\nmsgid \"All right, I will return when I'm done.\"\nmsgstr \"Ладно, вернусь, когда закончу.\"\n\n#. Key:\t41F6B75041803A654088469BCB887165\n#. SourceLocation:\t/Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_1.Children(0).Children.Text\n#: /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_1.Children(0).Children.Text\nmsgctxt \"Dialogue_SewerCreatures\"\nmsgid \"Really?\"\nmsgstr \"Правда?\"\n\n#. Key:\t43EE0E60407CA7CB7431BDB2767C6E19\n#. SourceLocation:\t/Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_SewerCreatures\"\nmsgid \"That's sad. What happened exactly?\"\nmsgstr \"Это печально. А что именно случилось?\"\n\n#. Key:\t53AC225B4F21B68CAC6F8997F324124E\n#. SourceLocation:\t/Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_29.Text\n#: /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_29.Text\nmsgctxt \"Dialogue_SewerCreatures\"\nmsgid \"Farewell until we meet again!\"\nmsgstr \"Прощай, может встретимся вновь!\"\n\n#. Key:\t5ED0CE6143EC50E6B5A1289D1A9A88E2\n#. SourceLocation:\t/Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_SewerCreatures\"\nmsgid \"I'm glad I could help.\"\nmsgstr \"Я рад, что смог помочь.\"\n\n#. Key:\t65042BC342E9717229E74A9DD272DC5F\n#. SourceLocation:\t/Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_SewerCreatures\"\nmsgid \"It was nice to see you again.\"\nmsgstr \"Было приятно снова тебя увидеть.\"\n\n#. Key:\t77959A144131C47488B221ADD9B1E13B\n#. SourceLocation:\t/Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_SewerCreatures\"\nmsgid \"Don't worry! I'm still looking for it.\"\nmsgstr \"Не волнуйся! Я все еще ищу его.\"\n\n#. Key:\t7914F3CA40844C2A13A760BB0DAE1BFA\n#. SourceLocation:\t/Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_SewerCreatures\"\nmsgid \"I don't have time for you creature! Stay out of my way!\"\nmsgstr \"У меня нет времени на тебя, создание! Не мешай мне!\"\n\n#. Key:\t79A62658414FE0202F2E9AA0E0238BD4\n#. SourceLocation:\t/Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_9.Children(0).Children.Text\n#: /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_9.Children(0).Children.Text\nmsgctxt \"Dialogue_SewerCreatures\"\nmsgid \"Accept Quest\"\nmsgstr \"Принять Квест\"\n\n#. Key:\t7EF6CBFA4A9C0B85B26AA6830C6121A2\n#. SourceLocation:\t/Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_1.Children(2).Children.Text\n#: /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_1.Children(2).Children.Text\nmsgctxt \"Dialogue_SewerCreatures\"\nmsgid \"Leave\"\nmsgstr \"Выйти\"\n\n#. Key:\t85A2E48A4B27C5EB7DA4CFAA23555629\n#. SourceLocation:\t/Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_26.Text\n#: /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_26.Text\nmsgctxt \"Dialogue_SewerCreatures\"\nmsgid \"Farewell and good luck to you as well!\"\nmsgstr \"Прощай и удачи тебе!\"\n\n#. Key:\t9AEDA0E84BABEBCD8F18E8BC2D0B75D0\n#. SourceLocation:\t/Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_SewerCreatures\"\nmsgid \"Calm down creature! I mean you no harm.\"\nmsgstr \"Успокойся, создание! Я не причиню тебе вреда.\"\n\n#. Key:\tB89304534B24114D19DF7AB07635FFDE\n#. SourceLocation:\t/Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_SewerCreatures\"\nmsgid \"All right I will see what I can do.\"\nmsgstr \"Хорошо, я посмотрю, что можно сделать.\"\n\n#. Key:\tB8BD374E4738BFFDAFAC4EAA19E7A9D2\n#. SourceLocation:\t/Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_23.Text\n#: /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_23.Text\nmsgctxt \"Dialogue_SewerCreatures\"\nmsgid \"Oh, thank you!\"\nmsgstr \"О, спасибо!\"\n\n#. Key:\tCAFA874D4ECD3CBFC0ADFD93048A9AA5\n#. SourceLocation:\t/Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_SewerCreatures\"\nmsgid \"Just tell me what do you want...\"\nmsgstr \"Просто скажи мне, чего ты хочешь...\"\n\n#. Key:\tCF62984840B7508E82BAC0AB9D53EC0A\n#. SourceLocation:\t/Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_9.Children(1).Children.Text\n#: /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_9.Children(1).Children.Text\nmsgctxt \"Dialogue_SewerCreatures\"\nmsgid \"Decline\"\nmsgstr \"Отклонить\"\n\n#. Key:\tDA1FD0DC49E9B2999DCD489699C04106\n#. SourceLocation:\t/Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_1.Children(1).Children.Text\n#: /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_1.Children(1).Children.Text\nmsgctxt \"Dialogue_SewerCreatures\"\nmsgid \"Let it talk\"\nmsgstr \"Пусть говорит\"\n\n#. Key:\tEAD329F04773358B0CA339A4F155D990\n#. SourceLocation:\t/Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_SewerCreatures\"\nmsgid \"I'm sorry but I can't help you.\"\nmsgstr \"Прости, но я не могу тебе помочь.\"\n\n#. Key:\tDA8649E54E3753ECDF9C4EAAB90D42B6\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/sewertut1.sewertut1:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/sewertut1.sewertut1:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_sewertut1\"\nmsgid \"I don't like the idea of this additional challenge, but without the help of the Keeper you won't be able to get out.\"\nmsgstr \"Мне не нравится идея дополнительного испытания, но без помощи Хранителя тебе не удастся выбраться.\"\n\n#. Key:\t462EF40B4BF77FA77FD98DB4656692A2\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/sewertut2_magicbox.sewertut2_magicbox:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/sewertut2_magicbox.sewertut2_magicbox:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_sewertut2_magicbox\"\nmsgid \"It's a magic box! That's what it's supposed to do, demon.\"\nmsgstr \"Это волшебный ящик! Это то, что оно должно делать, демон.\"\n\n#. Key:\tC34B7D8D499A8E8B767A58A19537A1EA\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/sewertut2_magicbox.sewertut2_magicbox:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/sewertut2_magicbox.sewertut2_magicbox:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_sewertut2_magicbox\"\nmsgid \"Is that box just floating in the air?\"\nmsgstr \"Этот ящик просто парит в воздухе?\"\n\n#. Key:\t348CCFC54F7E952295416496617F7615\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/sewertut3_silverkey.sewertut3_silverkey:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/sewertut3_silverkey.sewertut3_silverkey:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_sewertut3_silverkey\"\nmsgid \"What is that crystal?\"\nmsgstr \"Что это за кристалл?\"\n\n#. Key:\t554B6C924D0234A869BDFF9412FC4F49\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/sewertut3_silverkey.sewertut3_silverkey:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/sewertut3_silverkey.sewertut3_silverkey:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_sewertut3_silverkey\"\nmsgid \"Don't care about that. Focus on finding a way out.\"\nmsgstr \"Не волнуйся об этом. Сосредоточься на том, чтобы найти выход.\"\n\n#. Key:\t015A0B11422A6F2AE027FF8D9DF70664\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"We need his help.\"\nmsgstr \"Нам нужна его помощь.\"\n\n#. Key:\t03C73AA849BF05421AB97BA696A8C9C4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_79.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_79.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"They always wanted to invade the Outpost. They are many and we are few.\"\nmsgstr \"Они всегда хотели захватить Заставу. Их много, а нас мало.\"\n\n#. Key:\t0849CCCF4491D52B38AE7F827841E479\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Why should I set you free?\"\nmsgstr \"Почему я должен освободить тебя?\"\n\n#. Key:\t090C7BBF4222952E1C3FD38F7CF9927E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_76.Text\n#. Key:\t0AC46EF744AA55EDDA83EDB6899BB2D1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_65.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_65.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_76.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Some say Tabby's spirit returned and took the artefacts to Lillian. Maybe that is what happened.\"\nmsgstr \"Некоторые говорят, что дух Тэбби вернулся и забрал артефакты для Лилиан. Может быть, так и было.\"\n\n#. Key:\t094943BF4D9202CE7B1CFCBF151886D5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Back to the question: will you get me out?\"\nmsgstr \"Вернемся к вопросу: ты выпустишь меня?\"\n\n#. Key:\t0DBF728A4C052550BE5EEDBC9DEFB2E0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_29.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_29.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"I would invite you for dinner but unfortunately the door is closed.\"\nmsgstr \"Я бы пригласил тебя на ужин, но, к сожалению, дверь заперта.\"\n\n#. Key:\t112A48C54853F7689E1676A11FA8C352\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_48.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_48.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"No time to talk!\"\nmsgstr \"Нет времени на разговоры!\"\n\n#. Key:\t116C39AA495E99500962E8B3AF10DD4A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_83.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_83.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"I mean I'm sorry about the others... not that you survived.\"\nmsgstr \"Я имею в виду, что мне жаль остальных... не о том, что ты выжил.\"\n\n#. Key:\t134299214C22044B012C27B62337C08E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_69.Text\n#. Key:\tFD1574E845CB284B7A85F09CA1580DD4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_58.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_58.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_69.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"But she is gone for months and no one knows where she might be.\"\nmsgstr \"Но ее не было уже несколько месяцев, и никто не знает, где она может быть.\"\n\n#. Key:\t14BD2A7C45E85692430B34820042C96F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_73.Text\n#. Key:\tEA5320F3406E2BFA9BD954899BFA19DA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_62.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_62.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_73.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"He had so many friends. We all gathered and buried him near the Ancient Temple.\"\nmsgstr \"У него было так много друзей. Мы все собрались и похоронили его возле Древнего Храма.\"\n\n#. Key:\t16E175D0437B4A671F4753A56E840278\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_33.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_33.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"I’m looking for three artefacts. Do you know something about them?\"\nmsgstr \"Я ищу три артефакта. Ты что-то знаешь о них?\"\n\n#. Key:\t174BA1E34131FB1BD5A543A3CB86C724\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_35.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_35.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"I will return to the Main Station at Crossroad Cave and see what I can do with the trains.\"\nmsgstr \"Я вернусь на Центральный Вокзал в Пещеру Кроссроуд и посмотрю, что можно сделать с поездами.\"\n\n#. Key:\t1769115D4B72AB6CF8641487126A4A18\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"It has a key. The end of it is shaped like a dwarven helmet. You can easily recognise it.\"\nmsgstr \"От нее есть ключ. Конец его в форме шлема гнома. Его легко узнать.\"\n\n#. Key:\t17CBB2E24B331E4C5682919AAD2E7F2E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_60.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_60.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"What happened to Tabby?\"\nmsgstr \"Что случилось с Тэбби?\"\n\n#. Key:\t1AA8B2E541B2B2E7CA1E86B1E08C1E5A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"They are all dead...\"\nmsgstr \"Они все мертвы...\"\n\n#. Key:\t1FCCD37546681195736D2290A8DAE121\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Oh, it’s you again.\"\nmsgstr \"О, это снова ты.\"\n\n#. Key:\t2581B27E486A1C71835E5BB44B0AE05E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_37.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_37.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"But first I finish my supper. See you there!\"\nmsgstr \"Но сначала я доем свой ужин. Увидимся там!\"\n\n#. Key:\t2589E4AA4E5A406F6A98CB87D7382DC0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Just ask one of the other dwarfs to open the door.\"\nmsgstr \"Просто попроси другого гнома открыть дверь.\"\n\n#. Key:\t26162C784D2E65A2F8F491A80838F754\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_24.Children(4).Children.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_24.Children(4).Children.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Everyone dead?\"\nmsgstr \"Все мертвы?\"\n\n#. Key:\t2FEAED2844737D1B20BA64AE2414D8C6\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_72.Text\n#. Key:\tA119C2164FDE16E8F84B4E89578A1015\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_61.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_61.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_72.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"By the time I found him he was dead.\"\nmsgstr \"К тому времени, как я нашел его, он уже был мертв.\"\n\n#. Key:\t3203A6044456CD8213037A9B1B668763\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Please help me out!\"\nmsgstr \"Пожалуйста, помоги мне!\"\n\n#. Key:\t32C0BE7F49563BC2846691B4F163AEF7\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Well that explains why they didn’t come for me over the last four months.\"\nmsgstr \"Ну, это объясняет, почему они не пришли за мной в течение последних четырех месяцев.\"\n\n#. Key:\t35F849134220FAE43E07268C439CE3A1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_31.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_31.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"What were you Dwarves doing here?\"\nmsgstr \"Что вы, гномы, здесь делали?\"\n\n#. Key:\t39D36DCA4CD40A7E19D4F5AE69954DC3\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_71.Text\n#. Key:\tEFD384D542A5869726CAB7945F4C0EC4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_54.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_54.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_71.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Tabby found the three artefacts but on his way home he got injured.\"\nmsgstr \"Тэбби нашел три артефакта, но по дороге домой он был ранен.\"\n\n#. Key:\t39DEF30C4C3CCAB79867339AABD92BA0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_24.Children(3).Children.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_24.Children(3).Children.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Artefacts\"\nmsgstr \"Артефакты\"\n\n#. Key:\t3AF0406744C4656C5604EF931A688715\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_23.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_23.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"I've found the key!\"\nmsgstr \"Я нашел ключ!\"\n\n#. Key:\t3E074E784D66BE166553EB9F85D9854A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"How can I set you free?\"\nmsgstr \"Как я могу освободить тебя?\"\n\n#. Key:\t4100ECBE40C53051121F4C8A588FBDCB\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_24.Children(2).Children.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_24.Children(2).Children.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Train\"\nmsgstr \"Поезд\"\n\n#. Key:\t41085B174230937FAF97CDBC868F852A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_24.Children(5).Children.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_24.Children(5).Children.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Leave\"\nmsgstr \"Выйти\"\n\n#. Key:\t4204AAFB49C665B3CC32D78301307582\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_45.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_45.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Do you mean those traps out there?\"\nmsgstr \"Ты имеешь в виду те ловушки?\"\n\n#. Key:\t44AF6FF04B8A23F656F485AB9F1AFE60\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_36.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_36.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Catch me there if you need to go somewhere!\"\nmsgstr \"Найди меня там, если тебе нужно будет куда-нибудь пойти!\"\n\n#. Key:\t48FC728C4467C7CF9692AEB8CC71352D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_49.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_49.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"I will catch you at Crossroad Cave after I finished my supper.\"\nmsgstr \"Я найду тебя в Пещере Кроссроуд после того, как доем мой ужин.\"\n\n#. Key:\t4A74231B43F74B39906C85904332EE87\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"What happened? How did you end up here?\"\nmsgstr \"Что случилось? Как ты здесь оказался?\"\n\n#. Key:\t4FE354D247D257B181993087E5ADC74C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Errr... I don’t know... out of pure righteousness perhaps?\"\nmsgstr \"Ээээ... Я не знаю... может, по доброте душевной?\"\n\n#. Key:\t529895FF4D6B505A0EDB5081215845AE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_53.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_53.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"He wasn't just an ordinary cat. He was somehow connected to a charming young girl called Lillian.\"\nmsgstr \"Он не был обычным котом. Он был каким-то образом связан с очаровательной девочкой по имени Лилиан.\"\n\n#. Key:\t5C005582439FD5753AA90BB72F3284C8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_44.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_44.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"We build walls. We create machines out of golem spirits with simple rules which can't go wrong.\"\nmsgstr \"Мы строили стены. Мы создавали машины из духов големов с простыми правилами, которые не могут работать неправильно.\"\n\n#. Key:\t5C48292B4E4F1FAF4D7BB487713EA0B1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_59.Text\n#. Key:\t7F06827C4756423AE024F99922B00FDE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_70.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_59.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_70.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"I hope she will return.\"\nmsgstr \"Я надеюсь, она вернется.\"\n\n#. Key:\t624EDA19418303508EA7F58C5BD0DB4E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"All right!\"\nmsgstr \"Хорошо!\"\n\n#. Key:\t64E994E34D543F58D0F9DAA386AD7438\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Or do you like trains? I can help you redirect them to stations you couldn’t go otherwise.\"\nmsgstr \"Или ты любишь поезда? Я могу помочь тебе перенаправить их на станции, на которые ты иначе не сможешь поехать.\"\n\n#. Key:\t674A3DC8404EF8FC317D72A70877A0FF\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Errr... You know, sometimes in the evening I come here and have some late dinner. And there are others who think it would be funny to close the door when I'm inside.\"\nmsgstr \"Ээээ... Знаешь, иногда вечером я прихожу сюда и ужинаю допоздна. И есть другие, которые думают, что было бы забавно запереть дверь, когда я внутри.\"\n\n#. Key:\t6B07A15F4E86ECA507DE1DA9B0634774\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_74.Text\n#. Key:\t8F415D40481AA448025D79AB123B2DEB\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_63.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_63.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_74.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"He was a good friend. We all miss him.\"\nmsgstr \"Он был хорошим другом. Нам всем его не хватает.\"\n\n#. Key:\t6B47D3994D188506700B48BE85E0C740\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Once you collected all the artefacts you will need to take them back to a point where I can transport you to the Human Realm.\"\nmsgstr \"После того, как ты соберешь все артефакты, тебе нужно будет вернуть их обратно в то место, откуда я смогу перенести тебя в Человеческое Царство.\"\n\n#. Key:\t6B72634A488C0A9471F52AA154E56709\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_82.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_82.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"I’m sorry about that.\"\nmsgstr \"Мне жаль.\"\n\n#. Key:\t6C7C51F44B3881DDF4AE41B10F4D29E1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_52.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_52.Children(0).Children.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Tabby?\"\nmsgstr \"Тэбби?\"\n\n#. Key:\t6EC585D64AFBB18576EE17B9DFC08AD7\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_2.Children(2).Children.Text\n#. Key:\tFB66CFE943F6EF32D1A40987B969DCDF\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_52.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_2.Children(2).Children.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_52.Children(1).Children.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"What happened?\"\nmsgstr \"Что случилось?\"\n\n#. Key:\t766A9A50425FA0D0A0374390B2AF5980\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"I like jokes and it would have been funny for I don’t know a few hours maybe...\"\nmsgstr \"Мне нравятся шутки, и это было бы забавно на, не знаю, пару часов, может быть...\"\n\n#. Key:\t81ABC3E441BE2D3A19257BBC9DDD42D0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_41.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_41.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"You can go down there by using the elevator.\"\nmsgstr \"Ты можешь спуститься туда на лифте.\"\n\n#. Key:\t85B4C0DB47A2A3C3D504C29965DB6390\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_75.Text\n#. Key:\tE6F106AA404B92C9C6E8889876002813\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_64.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_64.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_75.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"We left the artefacts at his tomb, but one day later they disappeared.\"\nmsgstr \"Мы оставили артефакты у его могилы, но через день они исчезли.\"\n\n#. Key:\t88F0611349D22BB5B8411FA1232B8724\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_38.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_38.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Bye!\"\nmsgstr \"Пока!\"\n\n#. Key:\t8A2BA24948D65C3EC801B6AA589C206F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_30.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_30.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Welcome back!\"\nmsgstr \"С возвращением!\"\n\n#. Key:\t8A3CCFA44EAB376D6CB4C3B7DD8CEE8D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_53.Children(0).Children.Text\n#. Key:\tEEEF64F84F3FE0A37D029EB1A8BBE8A9\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_55.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_53.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_55.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Lillian?\"\nmsgstr \"Лиллиан?\"\n\n#. Key:\t8B9C46EA4C46385E6B3770BBD4648280\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_67.Text\n#. Key:\t999245954FBA1853A5E67A88353F152E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_56.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_56.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_67.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Lillian was really kind to us Dwarves. We couldn't ever meet her in person but she could talk to us via the cat Tabby.\"\nmsgstr \"Лилиан была очень добра к нам, гномам. Мы не могли встретиться с ней лично, но она могла разговаривать с нами через кота Тэбби.\"\n\n#. Key:\t90C6625D4ED5F6EA08B07A87450A1BC9\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_32.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_32.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"You said something about trains...\"\nmsgstr \"Ты сказал что-то о поездах...\"\n\n#. Key:\t92793D7F4D0351BF74BB6A8C3EE6A182\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"How can I open the door?\"\nmsgstr \"Как мне открыть дверь?\"\n\n#. Key:\t941CF27C40D3D82D6B41F5B3DD6501BB\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_52.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_52.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"My friend Tabby was also looking for artefacts.\"\nmsgstr \"Мой друг Тэбби тоже искал артефакты.\"\n\n#. Key:\t991D611A4F8BE2F8EAC77C9D746BAF95\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_78.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_78.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"I think the Kobolds attacked us by surprise.\"\nmsgstr \"Я думаю, что Коболды, неожиданно на нас напали.\"\n\n#. Key:\t9A7FA46C4687C80EBE3B4580631E9B8E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_43.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_43.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"After the Cataclysm we realized the only way to fight madness is to create rules to follow.\"\nmsgstr \"После Катаклизма мы поняли, что единственный способ борьбы с безумием - это создание правил, которым нужно следовать.\"\n\n#. Key:\t9E9CE4714145ED45CA301AACA6CEBBAF\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_40.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_40.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"But there is a spare key in the Catacombs.\"\nmsgstr \"Но в Катакомбах есть запасной ключ.\"\n\n#. Key:\t9ED5DDC74852A2007D25CDB418A3EDDA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_46.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_46.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"They surely have nothing to do with madness...\"\nmsgstr \"Они наверняка не имеют никакого отношения к безумию...\"\n\n#. Key:\tA0117BB74AB541DE10847FBC5E5CCB32\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"What we were doing? Well we Dwarves are not like other creatures you might have met.\"\nmsgstr \"Что мы делали? Ну, мы, гномы, не такие, как другие существа, которых ты мог бы встретить.\"\n\n#. Key:\tA258ABB740D6727685853E88F32936E2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"That sounds useful.\"\nmsgstr \"Звучит полезно.\"\n\n#. Key:\tA3F231E34FB4B95DD27A84B9326E0BFE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_24.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_24.Children(0).Children.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Key\"\nmsgstr \"Ключ\"\n\n#. Key:\tB0B806C147D2EB9F312987B49DEBFC8F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_47.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_47.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"See? They are simple, effective and logical. Ruin can't harm us as long as we follow all the rules.\"\nmsgstr \"Видишь? Они просты, эффективны и логичны. Руин не может навредить нам, пока мы следуем всем правилам.\"\n\n#. Key:\tB464CECC4F774535530FC685E0F62787\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_77.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_77.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Do you have any idea how the others died?\"\nmsgstr \"Ты знаешь, как погибли остальные?\"\n\n#. Key:\tBE69B91C466965EEF56A6F920AF9E5A8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"I thought they were just kidding.\"\nmsgstr \"Я думал, они просто шутят.\"\n\n#. Key:\tBFEAB99A4FE8C61CC35BCC9E926EFA97\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_51.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_51.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Just help me out.\"\nmsgstr \"Просто помоги мне.\"\n\n#. Key:\tC06E3A27466B5D6C7FC4A39E55739800\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"But being here for four months seems a bit too much for me.\"\nmsgstr \"Но пребывание здесь в течение четырех месяцев кажется мне слишком долгим.\"\n\n#. Key:\tC31327F8430D2259C27BAE91F44F0119\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_2.Children(0).Children.Text\n#. Key:\tCCD4C84941546627E158A4915B41CDB7\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_19.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_19.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_2.Children(0).Children.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"How?\"\nmsgstr \"Как?\"\n\n#. Key:\tC3BFAD59497E357A8180ADB86C75F14B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_68.Text\n#. Key:\tFF1A18C04F33FF434A2821A725CBFB5C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_57.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_57.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_68.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"She cared about us. She knew all our Strongholds and Outposts. She always warned us before the Kobolds attacked.\"\nmsgstr \"Она заботилась о нас. Она знала все наши Крепости и Заставы. Она всегда предупреждала нас перед нападением Коболдов.\"\n\n#. Key:\tC5A94EDD47BC3D5F422A29982308E78D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_19.Children(1).Children.Text\n#. Key:\tF811970946DF32346DAE66AFE2F64664\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_2.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_19.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_2.Children(1).Children.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Why?\"\nmsgstr \"Зачем?\"\n\n#. Key:\tC8E54B6E448A194DEB141C84323308F6\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_80.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_80.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"It was only a matter of time.\"\nmsgstr \"Это был всего лишь вопрос времени.\"\n\n#. Key:\tCA02594643A55D1128F06FB2E8FDE676\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_50.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_50.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Yes, trains. I can help you reach destinations you couldn't reach on your own.\"\nmsgstr \"Да, поезда. Я могу помочь тебе добраться до мест, до которых ты не мог бы добраться в одиночку.\"\n\n#. Key:\tCC191532450BFB2679AFD88AD95B72B2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Finally someone!\"\nmsgstr \"Наконец-то кто-то!\"\n\n#. Key:\tCF4351D047E267981EF869BE88BB0753\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_24.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_24.Children(1).Children.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Dwarves\"\nmsgstr \"Гномы\"\n\n#. Key:\tD2377C864A2A80F17AD81581D7A7807F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_81.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_81.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Odd that I survived.\"\nmsgstr \"Странно, что я выжил.\"\n\n#. Key:\tDF12303E4C7A4DFB00054EA7CE07FF88\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_39.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_39.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Errr... I don't know.\"\nmsgstr \"Ээээ... Я не знаю.\"\n\n#. Key:\tE8270F474353ECB77560C4A1173638A2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_27.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_27.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Any idea where that key might be?\"\nmsgstr \"Есть идеи, где этот ключ может быть?\"\n\n#. Key:\tEF1EFC6E4119CC9B41AF21ACE008D3B5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_26.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_26.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Have you found the key?\"\nmsgstr \"Ты нашел ключ?\"\n\n#. Key:\tF47418854FDFB9AD0E10468BEC8F1F58\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_42.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_42.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"I need to go now.\"\nmsgstr \"Мне пора идти.\"\n\n#. Key:\tF553C35F43DFC6CA04DA48A738597696\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_25.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_25.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Back already?\"\nmsgstr \"Уже вернулся?\"\n\n#. Key:\tFF942F904300D874A8C59AB8A954EF86\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_34.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_34.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Well done! Thank you! Thank you!\"\nmsgstr \"Молодец! Спасибо! Спасибо!\"\n\n#. Key:\t0499C9ED4395C4DD8AD1E48E854CD983\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"It was nice to see you too!\"\nmsgstr \"Я тоже был рад тебя видеть!\"\n\n#. Key:\t07153D014D72AF193040BA91A18BDC0A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_24.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_24.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"Great!\"\nmsgstr \"Супер!\"\n\n#. Key:\t106E51E34033895E5C7F348AF8994564\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"Er... Thanks! We'll talk about this later.\"\nmsgstr \"Э... Спасибо! Поговорим об этом позже.\"\n\n#. Key:\t18E140B74385C5E48F23E0B7E862E569\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"Hello! It's nice to see you again.\"\nmsgstr \"Привет! Приятно снова тебя видеть.\"\n\n#. Key:\t25F72BCA416C39658A0879A27417EA6B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"Don’t worry, I’ll make ready a train for you heading that way.\"\nmsgstr \"Не волнуйся, я приготовлю для тебя поезд в ту сторону.\"\n\n#. Key:\t26CBB1CD40F2080DE2183BA6AB3D2014\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"Ask him how you can travel to World’s End.\"\nmsgstr \"Спроси его, как ты можешь путешествовать к Концу Света.\"\n\n#. Key:\t26D1F4534C708623FB300DBE4EECADD2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"But I can't go back, because it's not safe.\"\nmsgstr \"Но я не могу вернуться, это небезопасно.\"\n\n#. Key:\t2B14E76B4B16316D7525FFA6D37E4CBB\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"You know I'm a bit worried about what will happen to the Outpost.\"\nmsgstr \"Ты знаешь, я немного беспокоюсь о том, что случится с Заставой.\"\n\n#. Key:\t2BB0F16046A4CD8DF05DE6A95D2CF9B3\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"I’m really glad you found that key for me. Now I can finish my supper outside in fresh air!\"\nmsgstr \"Я очень рад, что ты нашел этот ключ для меня. Теперь я могу доесть ужин на свежем воздухе!\"\n\n#. Key:\t36EF13F042D5B5ADB870BEB97F688D08\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_29.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_29.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"Take this! You deserve it!\"\nmsgstr \"Возьми это! Ты заслужил это!\"\n\n#. Key:\t3E09B8F746E999130D26A0BEA945E6D6\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"Is everything all right?\"\nmsgstr \"Все в порядке?\"\n\n#. Key:\t4D5A326948713FE977D0DBB68CF4A475\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_27.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_27.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"Except those crazy traps...\"\nmsgstr \"Кроме этих безумных ловушек...\"\n\n#. Key:\t5BE2C4324B64B35BD181B49E2D63E87F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"By the way, in case you need to go somewhere with the train just let me know.\"\nmsgstr \"Кстати, на случай, если тебе понадобится уехать куда-нибудь на поезде, просто дай мне знать.\"\n\n#. Key:\t66EDC37F4F3B3813F1B92D91A4107ADE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"I have banished some of the monsters lurking in the Outpost.\"\nmsgstr \"Я изгнал некоторых монстров, скрывающихся на Заставе.\"\n\n#. Key:\t67EED0C742F3B4ED0A9B929C4B517A4A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"The Outpost is safe again.\"\nmsgstr \"Теперь Застава безопасна.\"\n\n#. Key:\t6F1AF94E4DE4A338EFF79C85D99B944A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_19.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_19.Children(1).Children.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"Outpost\"\nmsgstr \"Застава\"\n\n#. Key:\t84D15B994BADC0AAED61848E817E49E1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"Thanks!\"\nmsgstr \"Спасибо!\"\n\n#. Key:\t8C7D69324C544DAC53C5CCA724B4B461\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_23.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_23.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"Could you somehow make the enemies move to somewhere else maybe?\"\nmsgstr \"Может, ты как-нибудь заставишь врагов уйти куда-нибудь еще?\"\n\n#. Key:\t8F66738A44B7D19EABAD40873B3FCAA3\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_19.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_19.Children(0).Children.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"Do you need help?\"\nmsgstr \"Тебе нужна помощь?\"\n\n#. Key:\t9249DFC34CFB46E1738C97A3283268D2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"Well done! Well done!\"\nmsgstr \"Отлично сработано! Молодец!\"\n\n#. Key:\tA027C29849372B1C452083A84609B1F5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_19.Children(2).Children.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_19.Children(2).Children.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"Leave\"\nmsgstr \"Выйти\"\n\n#. Key:\tA037C9E543AC131DAF4B6281A27BD56C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"Hello again my friend!\"\nmsgstr \"Ещё раз здравствуй, мой друг!\"\n\n#. Key:\tA4F1343D4D537FC1907096B564D3842E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"Oh, it must be a charming place!\"\nmsgstr \"О, это должно быть очаровательное место!\"\n\n#. Key:\tACF022EF4C55A6553F29DB969827379D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_26.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_26.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"Anyway, take this for your effort!\"\nmsgstr \"В любом случае, прими это за твои усилия!\"\n\n#. Key:\tB680A1D54923C59C081E46A65A2754D1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"As the last Defender, it would be my duty to keep that place safe.\"\nmsgstr \"Как последний Защитник, я обязан хранить это место в безопасности.\"\n\n#. Key:\tB9E0526D41FDB742FCB51991A0220B17\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"That’s where I can take you out of the Ruined Realm.\"\nmsgstr \"Вот откуда я могу вытащить тебя из Разрушенного Царства.\"\n\n#. Key:\tBF1AD65A407133C13B811CB14A997A2A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"We can talk some more once I've finished my supper...\"\nmsgstr \"Мы можем поговорить, как только я доем мой ужин...\"\n\n#. Key:\tE211EA4D4D69D09144B914850B17A8AE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_25.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_25.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"Well, I can't do my duty until you banish all of them.\"\nmsgstr \"Ну, я не смогу выполнить свой долг, пока ты не уничтожишь их всех.\"\n\n#. Key:\tEFD408FF4DAFD18E10ED3282D959914E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"You don't need to go anywhere before you find the three artefacts.\"\nmsgstr \"Тебе не нужно никуда идти, пока не найдешь три артефакта.\"\n\n#. Key:\tF500AA3C494B40302E298CA54FF3344B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"I would like to go to World’s End.\"\nmsgstr \"Я хотел бы поехать к Концу Света.\"\n\n#. Key:\tFDC63C35472E1752E2D092BC77DAD28B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"I'll see what I can do.\"\nmsgstr \"Я посмотрю, что можно сделать.\"\n\n#. Key:\t00A5A8684B1EF5FF2319428685540844\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_13.Children(0).Children.Text\n#. Key:\t471B46884399845B6D9442A8EADC2A48\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_9.Children(0).Children.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_13.Children(0).Children.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_9.Children(0).Children.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"Portal\"\nmsgstr \"Портал\"\n\n#. Key:\t03EA3D4249797B593981C1B699A2CF5A\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"Oh! The Walking Ball returned! Just in time!\"\nmsgstr \"О! Ходячий Шар вернулся! Как раз вовремя!\"\n\n#. Key:\t04DC604342615AD3DCFCE99EB9AAF157\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_19.Children(1).Children.Text\n#. Key:\t1070909F4434D9B0D03DD3BD62692CE0\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_16.Children(0).Children.Text\n#. Key:\t76A679CE45B5A9A47CA620A396E02F48\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_13.Children(2).Children.Text\n#. Key:\t8FC1E822454A2FDA1847119C5004F161\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_21.Children(0).Children.Text\n#. Key:\t9036093D446B2F8C34705BBCFC73F4A0\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_9.Children(2).Children.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_13.Children(2).Children.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_16.Children(0).Children.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_19.Children(1).Children.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_21.Children(0).Children.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_9.Children(2).Children.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"Leave\"\nmsgstr \"Выйти\"\n\n#. Key:\t142E85484BA4E9CF475F0780D951BAE5\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"But they were so tasty.\"\nmsgstr \"Но они были такими вкусными.\"\n\n#. Key:\t1E763B4D4D535AA83B50D4B87DB5A15D\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"You again?\"\nmsgstr \"А, опять ты?\"\n\n#. Key:\t2430044E46A3456249D6A99D0FC31D30\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_9.Children(1).Children.Text\n#. Key:\tB3695A284A15574F3874BDAB1B8C14EB\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_19.Children(0).Children.Text\n#. Key:\tDC8D78774D326DA9A70EFC81A857A417\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_13.Children(1).Children.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_13.Children(1).Children.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_19.Children(0).Children.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_9.Children(1).Children.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"Give Weird Device\"\nmsgstr \"Дать Странное Устройство\"\n\n#. Key:\t29AD586B41502E4FAFF79E94FDADA50D\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"Unfortunately I don't have any.\"\nmsgstr \"К сожалению, у меня нет ни одной.\"\n\n#. Key:\t3418CA5A44B4531926317CB100CEC2F4\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"Just let me know when you're done! Meanwhile, I'll be reading a few more pages.\"\nmsgstr \"Просто дай мне знать, когда закончишь! Тем временем, я прочту еще несколько страниц.\"\n\n#. Key:\t37CD676C4C4F585C3CC048B56EEF6B92\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"I was supposed to find a portal here.\"\nmsgstr \"Я должен был найти здесь портал.\"\n\n#. Key:\t3C2778B12A09151A002F016B1E3F6212\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"Also, if I hadn't drank the last two bottles... that would have helped...\"\nmsgstr \"И если бы я не выпил последние две бутылки... это наверное помогло бы...\"\n\n#. Key:\t42E3EE32491F578E618913B4AF958187\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"Really? That sounds like my students! They were always complaining about unannounced examinations or even worse, \\\"Why are there no lessons tomorrow?\\\".\"\nmsgstr \"Правда? Звучит как мои ученики! Они всегда жаловались на необъявленные экзамены или, что еще хуже, “Почему завтра нет уроков?”.\"\n\n#. Key:\t44626CCD498CA592B8FAD1B01EDF33AB\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_2.Children(0).Children.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_2.Children(0).Children.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"Don't have\"\nmsgstr \"Не имею\"\n\n#. Key:\t55EAD2524D0BCF52B25A1B9EAB1754B2\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"That's it my ball! I wish I had more students like you.\"\nmsgstr \"Вот именно мой шар! Хотел бы я, чтобы у меня было больше таких студентов, как ты.\"\n\n#. Key:\t6682474947E016803A188FA968FD76BE\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"Oh my...\"\nmsgstr \"О, Боже...\"\n\n#. Key:\t786849EF4E531580865712BBEDD25B32\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"That is amazing! Thank you, my globular friend! Take these coins, I am sure that you will enjoy spending them on... on whatever Balls like you like to get.\"\nmsgstr \"Это потрясающе! Спасибо, мой шаровидный друг! Возьми эти монеты, я уверен, что тебе понравится их потратить... на любые вещи, Шары вроде тебя любят покупать.\"\n\n#. Key:\t7FFC816545AA219D43FCA3A2ABF33E9E\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"Nevermind, I will just read a bit more... at least until a solution is found for the whole problem.\"\nmsgstr \"Неважно, я почитаю еще немного... по крайней мере, пока не будет найдено решение проблемы в целом.\"\n\n#. Key:\t818E4C1245F622C192178CB1F21694A3\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_2.Children(1).Children.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_2.Children(1).Children.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"What's the matter?\"\nmsgstr \"В чем дело?\"\n\n#. Key:\t84A119EB4FFB518BA7AA6394768F1DD3\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"Did the Gatekeeper open the gate for you?\"\nmsgstr \"Хранитель Врат открыл для тебя врата?\"\n\n#. Key:\t88FD93954B70482DAC5F2AA5332F23D5\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"One must always be eager to solve a problem. No matter how challenging that is.\"\nmsgstr \"Всегда нужно быть готовым решить проблему. Неважно, насколько это сложно.\"\n\n#. Key:\t9CEE1942434DACB2DB3C1AA2005A1E94\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"But we might find another way to solve the problem.\"\nmsgstr \"Но нам, наверное, стоит найти другой способ решить эту проблему.\"\n\n#. Key:\tC070EF8E47744D116D4E39AC8F7C1941\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"I hope that you still have at least one bottle of that potion of mine. I could really use some...\"\nmsgstr \"Надеюсь, у тебя еще есть хотя бы одна бутылка моего зелья. Мне бы не помешало...\"\n\n#. Key:\tC39CD0F34CDFDCB0B2CF08917834F1A8\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"Here is a Weird Device that I found in the hideout of the Secret Science Society.\"\nmsgstr \"Вот Странное Устройство, которое я нашел в укрытии Тайного Научного Общества.\"\n\n#. Key:\tCBB0BCAF4E19F942AC57F988104A9A65\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"I've used all of them to get back from the Sewer. You should have told me that there is another way out!\"\nmsgstr \"Я использовал их все, чтобы вернуться из Канализации. Ты должен был сказать мне, что есть другой выход!\"\n\n#. Key:\tE866A83647B163E53260C2B541AA0D7B\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"Well, the portal is definitely here, but as you might have already noticed, the place is a bit worn.\"\nmsgstr \"Ну, портал определенно здесь, но, как ты, наверное, уже заметил, место немного изношено.\"\n\n#. Key:\tF0A4AD1448267D94CAB7F79AD6CEFD59\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"Not Yet.\"\nmsgstr \"Еще нет.\"\n\n#. Key:\tF83C2C894C2EA511DCDCE6B824CC0591\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"Only the Gatekeeper can reopen the portal.\"\nmsgstr \"Только Хранитель Врат может открыть портал заново.\"\n\n#. Key:\t76653DEC40EE0ED098B5EE8810B1A097\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/TL_GetSoulkeeper.TL_GetSoulkeeper:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/TL_GetSoulkeeper.TL_GetSoulkeeper:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_TL_GetSoulkeeper\"\nmsgid \"A Spellcaster. It makes you able to use the Ruined Realm's magic, at least, up to a certain level.\"\nmsgstr \"Заклинатель. Он позволяет использовать магию Разрушенного Царства, по крайней мере, до определенного уровня.\"\n\n#. Key:\tBD48F7804F49751510AB2E909906C52F\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/TL_GetSoulkeeper.TL_GetSoulkeeper:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/TL_GetSoulkeeper.TL_GetSoulkeeper:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_TL_GetSoulkeeper\"\nmsgid \"What is it?\"\nmsgstr \"Что это?\"\n\n#. Key:\tDFF1C93D4005A778F0B696A2DC949DC6\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/TL_GetSoulkeeper.TL_GetSoulkeeper:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/TL_GetSoulkeeper.TL_GetSoulkeeper:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_TL_GetSoulkeeper\"\nmsgid \"That amulet is useful.\"\nmsgstr \"Этот амулет полезен.\"\n\n#. Key:\t09CDAFF84CF3F066B25A228640D45277\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_TL_Monk\"\nmsgid \"Please tell your Wizard that Monk would like to have a word with him.\"\nmsgstr \"Пожалуйста, скажи своему Волшебнику, что Монах хочет поговорить с ним.\"\n\n#. Key:\t0E97585C46B73E4AF939169CF45067A3\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_TL_Monk\"\nmsgid \"I can only guess that right now, he's complaining about me.\"\nmsgstr \"Сейчас, я предполагаю, что он жалуется на меня.\"\n\n#. Key:\t2E82A2B6449D8BA37ADBE7AEE1486791\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_TL_Monk\"\nmsgid \"Just get rid of him.\"\nmsgstr \"Просто избавься от него.\"\n\n#. Key:\t430D927D40EF24EED23E55A83F48FDD7\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_TL_Monk\"\nmsgid \"I'm sorry but he doesn't want to talk to you.\"\nmsgstr \"Прости, но он не хочет с тобой разговаривать.\"\n\n#. Key:\t59E21DC1476038EAD4EC91BC00DA4D8B\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_3.Children(2).Children.Text\n#: /Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_3.Children(2).Children.Text\nmsgctxt \"Dialogue_TL_Monk\"\nmsgid \"Ask Wizard\"\nmsgstr \"Спросить Волшебника\"\n\n#. Key:\t5AFB166C49DEB2D9017AED887A1E424D\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_TL_Monk\"\nmsgid \"Farewell, my friend, until we meet again!\"\nmsgstr \"Прощай, мой друг, может встретимся вновь!\"\n\n#. Key:\t5D80CBEB46203E3A759B498B95571F4F\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_3.Children(1).Children.Text\n#: /Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_3.Children(1).Children.Text\nmsgctxt \"Dialogue_TL_Monk\"\nmsgid \"I won't transfer!\"\nmsgstr \"Я не передам!\"\n\n#. Key:\t66D9E1874A9749A8881372807C0B9D54\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_TL_Monk\"\nmsgid \"Ha-ha-ha... I know he heard everything.\"\nmsgstr \"Ха-ха-ха ... Я знаю, что он все слышал.\"\n\n#. Key:\t8BD7C20C4084000925D1489BE3F6EE15\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_TL_Monk\"\nmsgid \"I don't talk to him!\"\nmsgstr \"Я не разговариваю с ним!\"\n\n#. Key:\tA227CE5A47002A80D3988ABA1364CF3E\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_3.Children(0).Children.Text\n#: /Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_3.Children(0).Children.Text\nmsgctxt \"Dialogue_TL_Monk\"\nmsgid \"Wizard don't want\"\nmsgstr \"Волшебник не хочет\"\n\n#. Key:\tA8E469374586A1D8A734D696AF662F9A\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_TL_Monk\"\nmsgid \"I also have something for you, Wanderer!\"\nmsgstr \"У меня также есть кое-что для тебя, Странник!\"\n\n#. Key:\tCE0E3B1B424BEDDF4A830B8DD0BB3272\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_TL_Monk\"\nmsgid \"This might help you along the way.\"\nmsgstr \"Это может помочь тебе в пути.\"\n\n#. Key:\tD6B184754B86F236C93454A95BF92B31\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_TL_Monk\"\nmsgid \"I won't deliver your messages anymore! If the two of you want something, then go get it yourselves!\"\nmsgstr \"Я больше не буду передавать твои сообщения! Если вы двое чего-то хотите, тогда идите и возьмите сами!\"\n\n#. Key:\tDB3AEAF24056B19A7D80E29E7D011D80\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_TL_Monk\"\nmsgid \"That's right. I will give him more time.\"\nmsgstr \"Точно. Я дам ему больше времени.\"\n\n#. Key:\tE2F9F07A4A2B8D1A578BCC9716AB4D44\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_TL_Monk\"\nmsgid \"Wizard! A fellow named Monk wants to talk to you!\"\nmsgstr \"Волшебник! С тобой хочет поговорить какой-то человек по имени Монах!\"\n\n#. Key:\tE8987AC84528E4071DC27E9854C3C4DE\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_TL_Monk\"\nmsgid \"Hello, little Wanderer!\"\nmsgstr \"Здравствуй, юный Странник!\"\n\n#. Key:\tFF355D9347D0068FBB40879E3EAEA8FB\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_TL_Monk\"\nmsgid \"But please...\"\nmsgstr \"Но, пожалуйста...\"\n\n#. Key:\tAC0DE5F1402FBAAFE6587B827D463C3C\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/TL_SoulkeeperHint.TL_SoulkeeperHint:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/TL_SoulkeeperHint.TL_SoulkeeperHint:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_TL_SoulkeeperHint\"\nmsgid \"Use the Soulstone to summon the Keeper.\"\nmsgstr \"Используй Камень Души, чтобы вызвать Хранителя.\"\n\n#. Key:\t031849B3493F1528A0146DA55BD7F00F\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/TL_TakeSoulkeeperHint.TL_TakeSoulkeeperHint:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/TL_TakeSoulkeeperHint.TL_TakeSoulkeeperHint:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_TL_TakeSoulkeeperHint\"\nmsgid \"It would be easier if I could just simply summon her back to me...\"\nmsgstr \"Было бы проще, если бы я просто вызвал ее обратно ко мне...\"\n\n#. Key:\t259EE9E14B86B2597D5F4EA60831D269\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/TL_TakeSoulkeeperHint.TL_TakeSoulkeeperHint:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/TL_TakeSoulkeeperHint.TL_TakeSoulkeeperHint:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_TL_TakeSoulkeeperHint\"\nmsgid \"Be more careful the next time...\"\nmsgstr \"Будь осторожнее в следующий раз...\"\n\n#. Key:\t86266BC54CC02BE988EA24B18BF76359\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/TL_TakeSoulkeeperHint.TL_TakeSoulkeeperHint:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/TL_TakeSoulkeeperHint.TL_TakeSoulkeeperHint:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_TL_TakeSoulkeeperHint\"\nmsgid \"Now go back to the Soulkeeper.\"\nmsgstr \"А теперь возвращайся к Хранителю Душ.\"\n\n#. Key:\tDCA8CF9A4CFF4644FBD42EADBFC6E773\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/TL_TakeSoulkeeperHint.TL_TakeSoulkeeperHint:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/TL_TakeSoulkeeperHint.TL_TakeSoulkeeperHint:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_TL_TakeSoulkeeperHint\"\nmsgid \"Er... It's still with me.\"\nmsgstr \"Эээ... Он все еще со мной.\"\n\n#. Key:\t012DDB8E4423EB98285155B3E1EFBF9A\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_65.Children(2).Children.Text\n#. Key:\t3485AE344D04D0944341F3A7391703EF\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.Children(3).Children.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_65.Children(2).Children.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.Children(3).Children.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"Set me free\"\nmsgstr \"Освободи меня\"\n\n#. Key:\t04E44BE94ABFE8614689AC890D01001D\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_65.Children(1).Children.Text\n#. Key:\t275944AA468D9CA8613B9586EC3D9C62\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.Children(2).Children.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_65.Children(1).Children.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.Children(2).Children.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"How to open gate\"\nmsgstr \"Как открыть врата\"\n\n#. Key:\t10EB6BE941C633380422F7953F0171DA\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"I think... I am...\"\nmsgstr \"Я думаю... Я есть...\"\n\n#. Key:\t22618C8F490BC5932411FFB41F38C383\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.SpeechSequence(0).SpeechSequence.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.SpeechSequence(0).SpeechSequence.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"Oh! A walking ball!\"\nmsgstr \"О! Ходячий шар!\"\n\n#. Key:\t28ED4B8B4023E9A859B8A4BFF7DFEE8A\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"I am crazy, therefore I think!\"\nmsgstr \"Я сумасшедший, поэтому я думаю!\"\n\n#. Key:\t389F7FA440377CA4EBA31DA4EE2FEEAE\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_65.Children(3).Children.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_65.Children(3).Children.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"Leave\"\nmsgstr \"Выйти\"\n\n#. Key:\t408E74BC4DBA10DA41853B9421DBA07B\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_65.Children(0).Children.Text\n#. Key:\t55BC9258400712FE4D5CED8BFA0AD22C\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.Children(1).Children.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_65.Children(0).Children.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.Children(1).Children.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"How to prove Worthy\"\nmsgstr \"Как доказать, что достоин\"\n\n#. Key:\t5D0DBB0344815D41A50D9FA178339BCA\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_24.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_24.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"Here, take one!\"\nmsgstr \"Вот, возьми один!\"\n\n#. Key:\t5E8C88684BE93A26C26BFBAF23D69FD9\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.SpeechSequence(5).SpeechSequence.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.SpeechSequence(5).SpeechSequence.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"And I am not wise. In fact, I am totally crazy. But look on the bright side! At least I am aware of it.\"\nmsgstr \"И я не мудрый. На самом деле, я совершенно сумасшедший. Но посмотри на это с другой стороны! По крайней мере, я знаю об этом.\"\n\n#. Key:\t5F9588AA4FFA9FEB2C7101B32CB98950\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_55.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_55.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"Come back if you change your mind!\"\nmsgstr \"Возвращайся, если передумаешь!\"\n\n#. Key:\t69BF5D3C44D3BE2468ADDF97E99920E9\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"I think something's happening with the door's mechanism... but who knows? I can definitely hear some creaking! It's hard to guess which one of those is the real one...\"\nmsgstr \"Я думаю, что-то происходит с механизмом двери... но кто знает? Я определенно слышу какой-то скрип! Трудно догадаться, какой из них настоящий...\"\n\n#. Key:\t6B46CC3F44284076B1F460BEE2D93116\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.SpeechSequence(1).SpeechSequence.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.SpeechSequence(1).SpeechSequence.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"How unique, how original, how... sporty!\"\nmsgstr \"Как уникально, как оригинально, как... спортивно!\"\n\n#. Key:\t6DFC995B4364B6358A8F00BEDD007C80\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"I am, therefore I think!\"\nmsgstr \"Я есть, значит, я думаю!\"\n\n#. Key:\t72FA8AF8413CF23907BB9EA6587F512E\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_63.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_63.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"I was pretty sure I had to face him too... that's why I prepared! Potion of Worthiness! I have a few bottles...\"\nmsgstr \"Я был уверен, что мне тоже придется встретиться с ним лицом к лицу... вот почему я подготовился! Зелье Достойного! У меня есть несколько бутылок...\"\n\n#. Key:\t7BB736394144C8B2173886993EE33ADA\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"Look, I'm forced to stay in this realm so that I could do all these silly tasks for a wizard. Any chance you could help me with that? Please?\"\nmsgstr \"Слушай, я вынужден оставаться в этом царстве, чтобы выполнять все эти глупые задания для волшебника. Есть шанс, что ты сможешь помочь мне с этим? Пожалуйста?\"\n\n#. Key:\t7E8985A441145AE9365C64810036EBE0\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.SpeechSequence(3).SpeechSequence.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.SpeechSequence(3).SpeechSequence.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"Actually yes, I...\"\nmsgstr \"Вообще-то да, я...\"\n\n#. Key:\t85CB0B164556D460A07F948F942D7AC4\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_61.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_61.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"That's how these rusty monsters work like: you pull a few levers here and there, and... whoops, the door is open! It's called science!\"\nmsgstr \"Вот как работают эти ржавые чудовища: ты дергаешь за несколько рычагов то тут, то там, и... Упс, дверь открыта! Это называется наукой!\"\n\n#. Key:\t878921884D0FDCFC78971E828C7D7FBB\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_66.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_66.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"I've got to go...\"\nmsgstr \"Мне нужно идти...\"\n\n#. Key:\t8FF0B1A64B29AAB8DABAC49F5EBCE625\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_60.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_60.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"That's easy! Just pull every single lever you can find.\"\nmsgstr \"Просто! Просто потяни за каждый рычаг, который сможешь найти.\"\n\n#. Key:\t9163F7AB40673D9EB5C936A37CC7B0C7\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_62.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_62.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"Sounds like you met the GateKeeper!\"\nmsgstr \"Похоже, ты познакомился с Хранителем Врат!\"\n\n#. Key:\t96EED9B34D798E48F9B47283A5290A5B\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.SpeechSequence(4).SpeechSequence.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.SpeechSequence(4).SpeechSequence.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"It was a rhetorical question. I am not old!\"\nmsgstr \"Это был риторический вопрос. Я не старый!\"\n\n#. Key:\tB3141D2247D5DF307B63A4BF330F8070\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_67.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_67.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"Not really, I don't feel like helping you out. And to be honest, I prefer to stay away from wizards. Sorry!\"\nmsgstr \"Не совсем, мне не хочется тебе помогать. И если честно, я предпочитаю держаться подальше от волшебников. Простите!\"\n\n#. Key:\tB7A8F5A6474D18116F76BC929DB28D40\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"It's been nice meeting you.\"\nmsgstr \"Приятно было познакомиться.\"\n\n#. Key:\tBE16F7204818B7231748D1B9C55DB4F6\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"Here, take this! I hope it's worth the trouble... hahaha... Thanks to you I can continue with my journey... after I read a few more pages, of course.\"\nmsgstr \"Вот, возьми это! Надеюсь, это стоит того... хахаха... Благодаря тебе я смогу продолжить свое путешествие... после того, как прочитаю еще несколько страниц, конечно.\"\n\n#. Key:\tBF9983D645C558E1AB5D559E70FEFDA0\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.SpeechSequence(6).SpeechSequence.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.SpeechSequence(6).SpeechSequence.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"Is there anything a middle-aged crazy gnome scientist can do for you? Now, this one is not a rhetorical question!\"\nmsgstr \"Есть ли что-нибудь, что сумасшедший среднего возраста ученый-гуном может сделать для тебя? На этот раз это не риторический вопрос!\"\n\n#. Key:\tC29E98A84971D7F0585C0F9522C30209\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_64.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_64.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"I will give you one if you are kind enough to open this door for me! I am stuck on the other side, you see...\"\nmsgstr \"Я дам тебе одну, если ты будешь так любезен, и откроешь для меня эту дверь! Я застрял на другой стороне, как видишь...\"\n\n#. Key:\tC8BEE9304FE466C0EB9F76A0B8A770D6\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.Children(0).Children.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.Children(0).Children.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"No way!\"\nmsgstr \"Ни за что!\"\n\n#. Key:\tCB197A5E46F44960333A02B7691B0EA6\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"Thanks and good luck!\"\nmsgstr \"Спасибо и удачи!\"\n\n#. Key:\tCD2D130744EE2EDC8C96B1A286FCCD28\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"Getting help from a mad scientist? Thanks, but I would rather skip that!\"\nmsgstr \"Получить помощь от сумасшедшего ученого? Спасибо, но я лучше пропущу!\"\n\n#. Key:\tD0A8B5EA452D49F6400A18A2CDAC9A0E\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_29.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_29.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"I am crazy, therefore I am!\"\nmsgstr \"Я сумасшедший, значит я есть!\"\n\n#. Key:\tDA95542D4776F0EF7909078DED258AF8\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_27.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_27.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"You managed to open the gate! Well done!\"\nmsgstr \"Тебе удалось открыть врата! Молодец!\"\n\n#. Key:\tDEC93709471D0B331684CFAF42A65B49\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_37.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_37.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"How unfortunate! And I thought that I was the idiot here. You will totally need my help... you'll see.\"\nmsgstr \"Как жаль! А я-то думал, что это я идиот. Тебе точно понадобится моя помощь... вот увидишь.\"\n\n#. Key:\tDF18B66D4109CAA0BCC1FDBED74521CD\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"Some kind of golem sent me here to prove my worthiness... any idea how I could do that?\"\nmsgstr \"Один голем послал меня сюда, чтобы доказать мое достоинство... Есть идеи, как я могу это сделать?\"\n\n#. Key:\tE546AE1443A4262B05869CB758E42CF2\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.SpeechSequence(2).SpeechSequence.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.SpeechSequence(2).SpeechSequence.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"Is there anything an old wise gnome scientist could do for you, I wonder?\"\nmsgstr \"Интересно, есть ли что-нибудь, что старый мудрый ученый-гном мог бы сделать для тебя?\"\n\n#. Key:\tEEA782044BAA1D5C3B77D49DAE004512\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_58.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_58.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"Any idea how I could open this gate for you?\"\nmsgstr \"Есть идеи, как я могу открыть эти врата для тебя?\"\n\n#. Key:\t04BFEE6A43E303DB376ACFA5F270F846\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"I've managed to get this obelisk thing. Do you know what it is?\"\nmsgstr \"Мне удалось достать эту штуку с обелиском. Ты знаешь, что это?\"\n\n#. Key:\t0A6FE902444DF9B2F18A95B495FB7A90\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"I... I don't know. They are kinda predictable though...\"\nmsgstr \"Я... Я не знаю. Но они вроде как предсказуемы...\"\n\n#. Key:\t0AB07AB7403AECECD38D479D8F4A32D2\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"Don't care about it and you'll live longer.\"\nmsgstr \"Не волнуйся об этом и будешь жить дольше.\"\n\n#. Key:\t1026E61D4F2798A2E0FEE0B9ACA2135B\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"There is a floating magical thing right there...\"\nmsgstr \"Там есть парящая волшебная штука...\"\n\n#. Key:\t174506D944E38D478377CDA1DEF299B4\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"Isn't it weird that doors are always closed around these places?\"\nmsgstr \"Разве не странно, что в этих местах двери всегда закрыты?\"\n\n#. Key:\t240F98824200E33959D455AF1A3219B8\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_37.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_37.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"This is my research project! Looks totally garbage, but sometimes even I cannot understand my brilliance.\"\nmsgstr \"Это мой исследовательский проект! Выглядит совершенно ужасно, но иногда даже я не могу понять свою гениальность.\"\n\n#. Key:\t24286C6A494F848CE13B5C98E38D4718\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_6.Children(0).Children.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_6.Children(0).Children.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"Let him answer\"\nmsgstr \"Пусть ответит\"\n\n#. Key:\t26727CAB403FA6DED50EC38ED01E4241\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"I found the secret hideout of the Secret Science Society. Is there anything you could tell me about them?\"\nmsgstr \"Я нашел тайное укрытие Тайного Научного Общества. Ты можешь мне что-нибудь о них рассказать?\"\n\n#. Key:\t2BF9EF0C41CB352340F460AE4BC0FE02\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"I guess he will be happy if you return this to him, but otherwise it's garbage.\"\nmsgstr \"Думаю, он будет счастлив, если ты вернешь ему это, иначе это просто мусор.\"\n\n#. Key:\t315BB85E475FAA4C715E7F850B0E5EE2\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_24.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_24.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"Really? Then maybe I should give you this: another bottle of Potion of Worthiness!\"\nmsgstr \"Правда? Тогда, может быть, мне стоит дать тебе вот это: еще одну бутылку Зелья Достойности!\"\n\n#. Key:\t316CF9AD4CF36FAFFAC45CA0A488FE53\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_57.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_57.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"I've got to go...\"\nmsgstr \"Мне пора...\"\n\n#. Key:\t3A9767C34F0BB6E9E131D8BC7A8D9A25\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_26.Children(1).Children.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_26.Children(1).Children.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"Secret Science Society\"\nmsgstr \"Тайное Научное Общество\"\n\n#. Key:\t3E857073418A17EC48A1EA9D2B28A43E\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_30.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_30.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"I pulled a few levers here and there...\"\nmsgstr \"Я потянул несколько рычагов тут и там...\"\n\n#. Key:\t4671C3394EAF0988255C8090B409415D\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"Yes, things like that happen here all the time. You'll get used to it.\"\nmsgstr \"Да, такие вещи здесь происходят постоянно. Ты привыкнешь.\"\n\n#. Key:\t4709B6384B48D479672BC69EBC640C7E\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_31.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_31.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"Oh, really? That was nice, even if it was absolutely unnecessary! Never mind, here is your reward!\"\nmsgstr \"Неужели? Это мило, даже если это было абсолютно ненужно! Неважно, вот твоя награда!\"\n\n#. Key:\t5AE5A1A6408BC2EB0F9F96BA0826ACB0\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"Hmm... One of the creaks was a bit odd. I think the door will open soon!\"\nmsgstr \"Хмм... Один из скрипов был немного странным. Думаю, дверь скоро откроется!\"\n\n#. Key:\t5C81129F4B064C44F44335A3AB1CC178\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_29.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_29.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"The mind is furnished with ideas by a drunk upholsterer...\"\nmsgstr \"Разум наполнен идеями пьяного обивщика...\"\n\n#. Key:\t5E441CF6434D7CA180853BBCBD6DFE44\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"Also, reading something represents such a nice way of killing time when I encounter a closed door!\"\nmsgstr \"Кроме того, чтение чего-то представляет собой такой приятный способ убить время, особенно когда перед тобой закрытая дверь!\"\n\n#. Key:\t6B46D1EC463D3B9A4BFBBDB7725C0C22\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"How about a deal? Open this door and I will give you another bottle from my collection of Potions of Worthiness.\"\nmsgstr \"Как насчет сделки? Открой эту дверь и я дам тебе еще одну бутылку из моей коллекции Зелья Достойности.\"\n\n#. Key:\t745CA5274A281AAA12CF798A53D54ACE\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_26.Children(3).Children.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_26.Children(3).Children.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"Ask about the book\"\nmsgstr \"Спроси о книге\"\n\n#. Key:\t84DCE2A448C57E7FAD93CB9029BBD605\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_26.Children(0).Children.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_26.Children(0).Children.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"Floating obelisk\"\nmsgstr \"Парящий обелиск\"\n\n#. Key:\t922B00804A843BD8EC9DB984D794F145\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"We met before, right? Of course we did.\"\nmsgstr \"Мы ведь уже встречались, да? Конечно, встречались.\"\n\n#. Key:\t9837238E42F28684DEBA2DAF9B332415\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"It might actually be total nonsense. That's what I am trying to find out at the moment, so I am reading it again and again and again...\"\nmsgstr \"Это может быть полной ерундой. Это то, что я пытаюсь выяснить в данный момент, так что я читаю это снова и снова, и снова, и снова, и снова...\"\n\n#. Key:\t995EAB564791A7F8BF34D3A26026F383\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_26.Children(4).Children.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_26.Children(4).Children.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"Leave\"\nmsgstr \"Выйти\"\n\n#. Key:\t9AD95267429D21EE59DC83937AD6811A\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"This is a Memory Crystal made by a really old looking man I've met long ago.\"\nmsgstr \"Это Кристалл Воспоминаний, сделанный очень старым человеком, которого я повстречал когда-то давно.\"\n\n#. Key:\tA9DF44F54971A33775FF939FB292E26E\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"No man's knowledge here can go beyond my experience!\"\nmsgstr \"Ни одно человеческое знание здесь не может превзойти мой опыт!\"\n\n#. Key:\tAC59E35B420DF0F9B771B9938AC23891\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"I sure can! They used to invent cool stuff back in the days, before... you know, everyone's mind decided to go a bit insane.\"\nmsgstr \"Конечно, смогу! Раньше они изобретали классные вещи, прежде чем... ну...знаешь, все решили немного сойти с ума.\"\n\n#. Key:\tB1E177F0430A3887A76CFAA46CE650AD\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"I don’t know why we are here... maybe to enjoy ourselves?\"\nmsgstr \"Я не знаю, зачем мы здесь... может быть, чтобы развлечься?\"\n\n#. Key:\tB5E57C3A4B0D51020B4F3C872164E8F2\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_26.Children(2).Children.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_26.Children(2).Children.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"Another door\"\nmsgstr \"Другая дверь\"\n\n#. Key:\tBA0C0F42482F357506A9C7ABADB6E49A\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_33.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_33.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"On the other hand, everyone is crazy these days... so we don't need doors anymore!\"\nmsgstr \"С другой стороны, в наши дни все сумасшедшие... так что нам больше не нужны двери!\"\n\n#. Key:\tBAC86050470A5EC67C30349C6B13DFE0\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"To be perceived is to be!\"\nmsgstr \"Быть воспринятым - значит существовать!\"\n\n#. Key:\tBAD7934444B3EB256141BFB689BB83A0\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"I will let you know when I come up with something.\"\nmsgstr \"Я дам тебе знать, когда что-нибудь придумаю.\"\n\n#. Key:\tBE5570C5477044DD0B1EEE928EAD8FA8\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_32.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_32.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"Nah. The world is full of crazy people. If I were sane, I would have liked to have as many closed doors as possible between me and those weirdos.\"\nmsgstr \"Неа. Мир полон сумасшедших. Если бы я был в здравом уме, я бы хотел иметь как можно больше закрытых дверей между мной и этими чудиками.\"\n\n#. Key:\tBE8120CC4E6A028BB45F10843F98135D\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"The door asks for a password that members use to enter the hideout... any idea what that could be?\"\nmsgstr \"Дверь запрашивает пароль, который члены используют для входа в укрытие... есть идеи, что это может быть?\"\n\n#. Key:\tC7BE32BF43F7BA6D88A666956FAC35F3\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"I am here because I actually have to prove my worth again...\"\nmsgstr \"Я здесь, потому что я должен снова доказать свое достоенство...\"\n\n#. Key:\tC7ECC6D9457A4C49B39E98AEB14474E5\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_25.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_25.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"And I would actually feel much happier if I were on the other side of the door! You know,... I tried to ask it nicely to open and it just ignored me!\"\nmsgstr \"И я бы чувствовала себя намного счастливее, если бы находился по ту сторону двери! Знаешь... Я пытался вежливо попросить его открыть, но он просто проигнорировал меня!\"\n\n#. Key:\tD2F4B8E44239904A7BD4DD90336C871A\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_45.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_45.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"What kind of book is that?\"\nmsgstr \"Что это за книга?\"\n\n#. Key:\tED75E2104CCC3912A77DF18F7C916690\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"It was nice seeing you...\"\nmsgstr \"Было приятно повидаться...\"\n\n#. Key:\tF87975A94604B526DE1B638250BD85A9\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_27.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_27.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"The gate is open! Maybe this creature has a heart after all... and probably started feeling sorry for me as well.\"\nmsgstr \"Врата открыты! Может, у этого существа все-таки есть сердце... и, наверное, оно тоже начало меня жалеть.\"\n\n#. Key:\tFE470DB5464E438A122FAFAF593AF92B\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"Let me see! Yes... Oh...\"\nmsgstr \"Дай посмотреть! Да... Ох...\"\n\n#. Key:\t066896454B62A9809060EBB3E0222D9A\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_SpeechSequence_1.SpeechSequence(3).SpeechSequence.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_SpeechSequence_1.SpeechSequence(3).SpeechSequence.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"Also, after skipping a couple of lectures, I got fired from university.\"\nmsgstr \"Также, пропустив пару лекций, меня уволили из университета.\"\n\n#. Key:\t17D1F3394E12F6C85A11C2B3D3BD1ACE\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_SpeechSequence_1.SpeechSequence(0).SpeechSequence.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_SpeechSequence_1.SpeechSequence(0).SpeechSequence.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"I am a scientist! I managed to prove it! I discovered this when I was conducting my research on gnome behavior...\"\nmsgstr \"Я ученый! Мне удалось это доказать! Я обнаружил это, когда проводил исследования поведения гномов...\"\n\n#. Key:\t17D8D3C2484BA654BEAE8CACA3AD7501\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"Help me out with the door for the last time, and I will give you my last potion!\"\nmsgstr \"Помогите мне с дверью в последний раз, и я дам тебе мое последнее зелье!\"\n\n#. Key:\t22439DB6407947A700A6E9AFB4D29261\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"Hello again! You remember me, right? I'm the gnome who was crazy before it was cool!\"\nmsgstr \"Ещё раз привет! Ты ведь помнишь меня? Я гном, который был сумасшедшим до того, как это было круто!\"\n\n#. Key:\t2546F34E402CB4B25911238CC1E7A70F\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_29.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_29.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"Be as you with to seem.\\r\\n... or was it seem as you wish to be?\"\nmsgstr \"Таким будь, каким казаться.\\n...или это было кажись таким, каким ты хочешь быть?\"\n\n#. Key:\t2A78FDD9465789DC4FF5EB970C63F618\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"That is amazing! Thank you, my globular friend! Take these coins, I am sure you will enjoy spending them on... on whatever Balls like you like to spend.\"\nmsgstr \"Это потрясающе! Спасибо, мой шаровидный друг! Возьми эти монеты, я уверен, что тебе понравится их потратить... на любые вещи, Шарики вроде тебя любят покупать.\"\n\n#. Key:\t2EB726F641E4EF882228F6B49DA2B313\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_26.Children(1).Children.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_26.Children(1).Children.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"Password\"\nmsgstr \"Пароль\"\n\n#. Key:\t339840D54BD71CF86F9DE4A801B1414F\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"I sure can! They used to invent cool stuff back in the days, before... you know, everyone's mind decided to go a bit insane.\"\nmsgstr \"Конечно, смогу! Раньше они изобретали классные вещи, прежде чем... знаешь, все решили немного сойти с ума.\"\n\n#. Key:\t3E639AB84A0D241D73AB8A991A483090\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_26.Children(4).Children.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_26.Children(4).Children.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"Leave\"\nmsgstr \"Выйти\"\n\n#. Key:\t464D32224CC04AD1F97602803245A37C\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"Take this! You deserve it...\"\nmsgstr \"Держи! Ты это заслужил.\"\n\n#. Key:\t4BB0354D4398A4115F3A78B8EFCC7D16\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_27.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_27.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"I can't believe my eyes! It is open!\"\nmsgstr \"Не могу поверить своим глазам! Открыто!\"\n\n#. Key:\t6488288A45256CE464004F9BFF776850\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_24.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_24.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"It's your lucky day! Take this... it's my last bottle, but I guess your needs are greater than mine!\"\nmsgstr \"Это твой счастливый день! Возьми это... это моя последняя бутылка, но, думаю, твои потребности превыше моих!\"\n\n#. Key:\t696219734B2E6966C53BE8B43A0C2212\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"The unexamined life is not worth living!\"\nmsgstr \"Неисследованная жизнь не стоит того, чтобы жить!\"\n\n#. Key:\t6FD516D14E42F5EC1D05CEA0F476BDEC\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"If you manage to find a strangely unique device in the hideout, I would be more than happy to buy that from you...\"\nmsgstr \"Если тебе удастся найти странное уникальное устройство в укрытии, я буду более чем счастлив купить его у тебя...\"\n\n#. Key:\t75BBEA604E9A3BAEF7599AA937E1AB2A\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"And you have the habit of needing my potions..\"\nmsgstr \"И у тебя есть привычка нуждаться в моих зельях...\"\n\n#. Key:\t7978DCFE4044A6A3EC9F6BA54BAAD8BF\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"Yes, I am pretty sure this week is \\\"The only true wisdom is in knowing you know everything.\\\".\"\nmsgstr \"Да, я уверен, что на этой неделе “Единственная истинная мудрость - это знать, что ты все знаешь”.\"\n\n#. Key:\t88881A3742ABFEAB95CA938C1AA81B60\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_25.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_25.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"I guess we are in the same boat - well, more or less... figuratively speaking, of course, because I can't really stand boats!\"\nmsgstr \"Наверное, мы в одной лодке - ну, более или менее... образно говоря, конечно, потому что я не выношу лодки!\"\n\n#. Key:\t8A80B7554F39A818E4E66294BAFC9A76\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_26.Children(0).Children.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_26.Children(0).Children.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"Secret Science Society\"\nmsgstr \"Тайное Научное Общество\"\n\n#. Key:\t91E6FD4A44AB2E17C88767B0F17D6D1E\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_30.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_30.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"Why do you think that you're crazy?\"\nmsgstr \"Почему ты думаешь, что ты сумасшедший?\"\n\n#. Key:\t98E36F354D811F5DE5F98A942250997E\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"It is always wrong to believe everything!\"\nmsgstr \"Верить во все - это неправильно!\"\n\n#. Key:\t9B6EADBA4946B100D566988907A9675D\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"Any luck with the password for the Secret Science Society door?\"\nmsgstr \"Есть успехи с паролем к двери Тайного Научного Общества?\"\n\n#. Key:\tA0F52B7148A942673A3489857B8C6EA9\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_26.Children(2).Children.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_26.Children(2).Children.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"Give Weird Device\"\nmsgstr \"Дать Странное Устройство\"\n\n#. Key:\tABE60F4D4709CCE1AF2A5197C03C8193\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"See you later...\"\nmsgstr \"Еще увидимся...\"\n\n#. Key:\tB07C5C9A48839C3E81F6FA8B7550BBA4\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"I also have the bad habit of being obstructed by closed doors!\"\nmsgstr \"У меня также есть плохая привычка, когда мне мешают закрытые двери!\"\n\n#. Key:\tB7C7314840274942F6D606B35398F039\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"The door asks for a password that members need to provide in order to enter the hideout... any idea what that could be?\"\nmsgstr \"Дверь запрашивает пароль, который члены должны предоставить, чтобы войти в укрытие... есть идеи, что это может быть?\"\n\n#. Key:\tBB1AEBA44695D09192D7CA98AF9166B0\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_SpeechSequence_1.SpeechSequence(2).SpeechSequence.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_SpeechSequence_1.SpeechSequence(2).SpeechSequence.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"No wonder everyone started to consider me an idiot.\"\nmsgstr \"Неудивительно, что все стали считать меня идиотом.\"\n\n#. Key:\tC0B9CA5E4273E95306AD0C824ADFD84B\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_SpeechSequence_1.SpeechSequence(1).SpeechSequence.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_SpeechSequence_1.SpeechSequence(1).SpeechSequence.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"Long story short, I used to do all these crazy things, like talking about the weather or taking naps in the afternoon. At first, they seemed okay to me but in reality what I was doing was totally ridiculous!\"\nmsgstr \"Короче говоря, я делал все эти сумасшедшие вещи, например, говорил о погоде или днем дремал. Сначала они казались мне нормальными, но на самом деле то, что я делал, было совершенно нелепо!\"\n\n#. Key:\tC4193800427609972A2DECAB99D8CE6C\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"Hmm... One of the creaks was a bit odd. I think the door will open soon!\"\nmsgstr \"Хмм... Один из скрипов был немного странным. Думаю, дверь скоро откроется!\"\n\n#. Key:\tD1254F624213EAE67D6DD780182AA2DA\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"It was nice seeing you!\"\nmsgstr \"Приятно было повидаться!\"\n\n#. Key:\tD19327714CD0B2833BC7EBBD1E89CC83\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_26.Children(3).Children.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_26.Children(3).Children.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"You Crazy?\"\nmsgstr \"Ты Спятил?\"\n\n#. Key:\tE5C93E794F71C393568D0B855117C738\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"I found the secret hideout of the Secret Science Society. Do you know anything about them?\"\nmsgstr \"Я нашел тайное укрытие Тайного Научного Общества. Ты что-нибудь о них знаешь?\"\n\n#. Key:\tEF216A2549E20C15A2C28184B62D45E6\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_36.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_36.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"Turns out that you cannot skip lectures if you're the teacher.\"\nmsgstr \"Оказалось, что ты не можешь пропустить лекции, если ты учитель.\"\n\n#. Key:\tEF650E874498865FA9FE6F9B9C37AB71\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"Here is the Weird Device I found in the hideout of the Secret Science Society.\"\nmsgstr \"Вот странное устройство, которое я нашел в укрытии Тайного Научного Общества.\"\n\n#. Key:\t17A0CE394E01E1FFB31AA9A485E033AC\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_2.Children(4).Children.Text\n#: /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_2.Children(4).Children.Text\nmsgctxt \"Dialogue_TLSecretSocietyGate\"\nmsgid \"Mellon\"\nmsgstr \"Меллон\"\n\n#. Key:\t3293778C41F588EAC2DECDA76DA86A8E\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_2.Children(0).Children.Text\n#: /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_2.Children(0).Children.Text\nmsgctxt \"Dialogue_TLSecretSocietyGate\"\nmsgid \"The only...\"\nmsgstr \"Единственная...\"\n\n#. Key:\t359996CC441CAB0497303A9C666F0CCD\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_TLSecretSocietyGate\"\nmsgid \"*******? No, that is not correct.\"\nmsgstr \"*******? Нет, это неверно.\"\n\n#. Key:\t3C864B7F434DA42CAB07BCA70FB2E6A6\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_1.Children(0).Children.Text\n#: /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_1.Children(0).Children.Text\nmsgctxt \"Dialogue_TLSecretSocietyGate\"\nmsgid \"Okay, whatever\"\nmsgstr \"Ладно, неважно\"\n\n#. Key:\t40C27B354470AB53239424BCC2B8D259\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_TLSecretSocietyGate\"\nmsgid \"Do you really think secret scientists would use an elven word as a password? I don't even know what that means.\"\nmsgstr \"Ты действительно думаешь, что тайные ученые используют эльфийское слово в качестве пароля? Я даже не знаю, что это значит.\"\n\n#. Key:\t4E89070F413EF5CD964EEF90234BEBC5\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_TLSecretSocietyGate\"\nmsgid \"I am pretty sure that it is better to avoid the Secret Science Society anyways...\"\nmsgstr \"Я уверен, что в любом случае лучше избегать Тайного Научного Общества...\"\n\n#. Key:\t515B5424465F983D14F3E09B7686899D\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_TLSecretSocietyGate\"\nmsgid \"STOP! Do not move! This gate is only for the members of the Secret Science Society!\"\nmsgstr \"СТОП! Не двигайся! Эти врата только для членов Тайного Научного Общества!\"\n\n#. Key:\t51706AD44D697A14E6392B97A9E30AFC\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_TLSecretSocietyGate\"\nmsgid \"That is the silliest combination I have ever heard about in my whole life! That's the kind of thing an idiot would carry in his luggage!\"\nmsgstr \"Это самая глупая комбинация, о которой я когда-либо слышал за всю свою жизнь! Это то, что идиот мог бы носить в багаже!\"\n\n#. Key:\t60B0B4E04E74C474AC2F4F8422DCE753\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_3.Children(0).Children.Text\n#: /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_3.Children(0).Children.Text\nmsgctxt \"Dialogue_TLSecretSocietyGate\"\nmsgid \"Leave the gate\"\nmsgstr \"Покинуть врата\"\n\n#. Key:\t6EB7FD9546B2B89557D9708942CE54BD\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_2.Children(2).Children.Text\n#: /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_2.Children(2).Children.Text\nmsgctxt \"Dialogue_TLSecretSocietyGate\"\nmsgid \"12345\"\nmsgstr \"12345\"\n\n#. Key:\t749AB9CD48924031317291A953254917\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_TLSecretSocietyGate\"\nmsgid \"That password is for witch and wizard kids, not for old, wise, world renowned secret scientists!\"\nmsgstr \"Этот пароль - для колдунов и волшебников, а не для старых, мудрых, всемирно известных тайных ученых!\"\n\n#. Key:\t7BB8FA8B4D051983390D3D8D4287DFEC\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_2.Children(1).Children.Text\n#: /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_2.Children(1).Children.Text\nmsgctxt \"Dialogue_TLSecretSocietyGate\"\nmsgid \"hunter2\"\nmsgstr \"hunter2\"\n\n#. Key:\t8CD051C44D9FBBD6D60694AFD2156D24\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_2.Children(5).Children.Text\n#: /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_2.Children(5).Children.Text\nmsgctxt \"Dialogue_TLSecretSocietyGate\"\nmsgid \"Try to gain some time\"\nmsgstr \"Постарайтесь выиграть немного времени\"\n\n#. Key:\t8F2244144056B8C389345F87D8C8B171\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_TLSecretSocietyGate\"\nmsgid \"I... I think I forgot... I have to remember it. I'll be back...\"\nmsgstr \"Я... Кажется, я забыл... Я должен это запомнить. Я сейчас вернусь...\"\n\n#. Key:\t8FC96FE94C115E3EDB214CAA3B380072\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_TLSecretSocietyGate\"\nmsgid \"Let us go on with the standard protocol then. Tell me the password of the week.\"\nmsgstr \"Тогда продолжим стандартный протокол. Скажи мне пароль недели.\"\n\n#. Key:\tAA10FF02426D2C5DB9F7CF90596631C4\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_1.Children(1).Children.Text\n#: /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_1.Children(1).Children.Text\nmsgctxt \"Dialogue_TLSecretSocietyGate\"\nmsgid \"I am a member\"\nmsgstr \"Я член\"\n\n#. Key:\tB5237D1B4EFB02B1ED5017B68EC5A7EC\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_TLSecretSocietyGate\"\nmsgid \"Are you a member? Prove it! What is the password of the week?\"\nmsgstr \"Ты член клуба? Докажи! Какой пароль недели?\"\n\n#. Key:\tC8A1985C416AEA563142D7BF3B6DD77D\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_2.Children(3).Children.Text\n#: /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_2.Children(3).Children.Text\nmsgctxt \"Dialogue_TLSecretSocietyGate\"\nmsgid \"Caput Draconis\"\nmsgstr \"Капут Драконис\"\n\n#. Key:\tDC8F07EA44A20BEF70DFCDA4A62A421E\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_TLSecretSocietyGate\"\nmsgid \"Correct. Welcome to the secret hideout 12345, scientist!\"\nmsgstr \"Верно. Добро пожаловать в тайное убежище 12345, ученый!\"\n\n#. Key:\tE0C10509474191587635B48ED0AA6913\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_TLSecretSocietyGate\"\nmsgid \"The only true wisdom is in knowing you know everything!\"\nmsgstr \"Единственная истинная мудрость - это знание того, что ты все знаешь!\"\n\n#. Key:\t0707F21D4313073F47F3C69B64D61DB7\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_TombOfTabby\"\nmsgid \"Take this. It's all I can give now.\"\nmsgstr \"Вот, возьми. Это все, что я могу дать сейчас.\"\n\n#. Key:\t0918993B4F680528806DE680B471F795\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_TombOfTabby\"\nmsgid \"It was too much. I couldn’t keep on. I failed.\"\nmsgstr \"Это было слишком тяжело. Я не мог продолжать. Я потерпел неудачу.\"\n\n#. Key:\t1598C2DE44A0BF92DC0E53BFAC47DEF5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_3.Children(3).Children.Text\n#: /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_3.Children(3).Children.Text\nmsgctxt \"Dialogue_TombOfTabby\"\nmsgid \"Leave\"\nmsgstr \"Выйти\"\n\n#. Key:\t1EF84FFD484E968FBDFE1386018485DB\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_3.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_3.Children(1).Children.Text\nmsgctxt \"Dialogue_TombOfTabby\"\nmsgid \"Raven\"\nmsgstr \"Ворон\"\n\n#. Key:\t3343471F42742EEE0678D49E466448F1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_TombOfTabby\"\nmsgid \"Tell me the name!\"\nmsgstr \"Назови мне имя!\"\n\n#. Key:\t3DC816F147ACB79D6339D5AD31E0C5A5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_TombOfTabby\"\nmsgid \"Lillian!\"\nmsgstr \"Лиллиан!\"\n\n#. Key:\t3DE5FFEB4A5BEC150306999FDEF058BC\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_TombOfTabby\"\nmsgid \"Here lies Tabby, wanderer of the Ruined Realm. We will never forget what you did for us. May your spirit find peace in the afterlife.\"\nmsgstr \"Здесь лежит Тэбби, странник Разрушенного Царства. Мы никогда не забудем, что ты сделал для нас. Пусть твой дух обретет покой в загробном мире.\"\n\n#. Key:\t43F7C0AE4CB91D3957AB4CA54C1D4426\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_TombOfTabby\"\nmsgid \"He took the artefacts. His master never knew it.\"\nmsgstr \"Он забрал артефакты. Его мастер никогда об этом не знал.\"\n\n#. Key:\t57A0634946BB9FD9603572ABD9368E52\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_3.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_3.Children(0).Children.Text\nmsgctxt \"Dialogue_TombOfTabby\"\nmsgid \"Wizard\"\nmsgstr \"Волшебник\"\n\n#. Key:\t5A6E99154FB027A82922FA91A9448E14\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_TombOfTabby\"\nmsgid \"I’m leaving... I didn’t want to bother you. May you find peace at last.\"\nmsgstr \"Я ухожу... Я не хотел тебя беспокоить. Пусть ты наконец обретешь покой.\"\n\n#. Key:\t6A716E164BAACFAFB2EBDBBA8C04438F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_TombOfTabby\"\nmsgid \"He liked Lillian. He finished what I started.\"\nmsgstr \"Ему нравилась Лиллиан. Он закончил то, что я начал.\"\n\n#. Key:\t7CDFB36B41931AADE01C10A465D09EAF\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_TombOfTabby\"\nmsgid \"Rest in peace!\"\nmsgstr \"Покойся с миром!\"\n\n#. Key:\t831693034CD9AC88A07F1297BBB10056\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_TombOfTabby\"\nmsgid \"I will be there on her side again when the time comes.\"\nmsgstr \"Когда придет время, я снова буду на ее стороне.\"\n\n#. Key:\tA78C16A943587C5EC876BFB0AA319421\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_TombOfTabby\"\nmsgid \"She is my only true master. I can’t leave her. Not yet.\"\nmsgstr \"Она мой единственный истинный мастер. Я не могу ее бросить. Пока не могу.\"\n\n#. Key:\tC86836A149E8580E4608259C8482314F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_TombOfTabby\"\nmsgid \"Raven!\"\nmsgstr \"Ворон!\"\n\n#. Key:\tD05E5AEF498C383F88D1AFBBDF371CDA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_TombOfTabby\"\nmsgid \"He forced me. Though I understood. I wanted the same.\"\nmsgstr \"Он заставил меня. Хоть я и понял. Я желал того же самого.\"\n\n#. Key:\tE41ADE774AF3AF3FE637CE81531F3D29\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_3.Children(2).Children.Text\n#: /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_3.Children(2).Children.Text\nmsgctxt \"Dialogue_TombOfTabby\"\nmsgid \"Lillian\"\nmsgstr \"Лиллиан\"\n\n#. Key:\tED18C66D47BF594818C5DA8100AC2A36\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_TombOfTabby\"\nmsgid \"You are familiar... I almost remember...\"\nmsgstr \"Ты мне кого-то напоминаешь... Я почти вспомнил...\"\n\n#. Key:\tF6D8BC4F489D87A90E852CA3F97B479F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_TombOfTabby\"\nmsgid \"Wizard!\"\nmsgstr \"Волшебник!\"\n\n#. Key:\t2A0E02C94A04642C5096038C615E0D5B\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/tut2.tut2:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/tut2.tut2:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_tut2\"\nmsgid \"I see you managed to shape that ball body of yours… that’s interesting.\"\nmsgstr \"Я вижу, тебе удалось привести в форму это твое шаровидное тело… это интересно.\"\n\n#. Key:\t4D59C307403F27C91A9168AB58CDB1B3\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/tut2.tut2:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/tut2.tut2:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_tut2\"\nmsgid \"I didn’t want to summon you. I wanted to get my daughter back.\"\nmsgstr \"Я не хотел призывать тебя. Я хотел вернуть свою дочь.\"\n\n#. Key:\t8336FD024F34227E1AB7B1BFCCF7FFBF\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/tut2.tut2:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/tut2.tut2:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_tut2\"\nmsgid \"Your presence is not welcome here, demon!\"\nmsgstr \"Тебе здесь не рады, демон!\"\n\n#. Key:\t16A6E7D24DFE49D6844E92B8E476BA66\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/tut5.tut5:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/tut5.tut5:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_tut5\"\nmsgid \"Once you are done I will set you free.\"\nmsgstr \"Как только ты закончишь, я освобожу тебя.\"\n\n#. Key:\t48FA56EF4293C577CB1977BE694034CC\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/tut5.tut5:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/tut5.tut5:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_tut5\"\nmsgid \"This is the deal demon...\"\nmsgstr \"Это и есть сделка, демон...\"\n\n#. Key:\tA27765824FDD88A579AB6180DDEA06B1\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/tut5.tut5:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/tut5.tut5:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_tut5\"\nmsgid \"Get into the Heart of the Realm and find the three Artefacts! I need those to correct the summoning.\"\nmsgstr \"Проникни в Сердце Царства и найди три Артефакта! Они нужны мне, чтобы исправить заклинание.\"\n\n#. Key:\t5E1F54384BC258A91FF1DD9ECBC0DF39\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/tut8.tut8:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/tut8.tut8:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_tut8\"\nmsgid \"A cat that used to help my daughter to explore these realms.\"\nmsgstr \"Кот, который помогал моей дочери исследовать эти царства.\"\n\n#. Key:\t859621E24125177084F4EAA39CF77902\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/tut8.tut8:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/tut8.tut8:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_tut8\"\nmsgid \"Who is Tabby?\"\nmsgstr \"Кто такой Тэбби?\"\n\n#. Key:\tD0BFF857414714D7C5FCB9B526539215\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/tut8.tut8:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/tut8.tut8:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_tut8\"\nmsgid \"Tabby was formidable with her claws, but you will need that sword.\"\nmsgstr \"Тэбби был пугающим с его когтями, но тебе понадобится этот меч.\"\n\n#. Key:\tDFCB1A1E48763642E71FD7A040F72F1B\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/tut8.tut8:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/tut8.tut8:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_tut8\"\nmsgid \"So he did the hard job before me...\"\nmsgstr \"Значит, он проделал тяжелую работу до меня...\"\n\n#. Key:\t2DD05A7E485B5C23DA0DCD84400D3F23\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/tut9.tut9:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/tut9.tut9:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_tut9\"\nmsgid \"What could be possibly weird for a walking ball?\"\nmsgstr \"Что может быть странным для ходячего шара?\"\n\n#. Key:\t62A1ECFC47B762221EA0B1B5B0E0BEF6\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/tut9.tut9:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/tut9.tut9:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_tut9\"\nmsgid \"This place is in a better shape...\"\nmsgstr \"Это место в более хорошей форме...\"\n\n#. Key:\tA9BCFBB541A9A2CEA8FB90884B8557C5\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/tut9.tut9:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/tut9.tut9:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_tut9\"\nmsgid \"The Ancient Magic is still strong within these walls. It keeps the Ruin at bay.\"\nmsgstr \"Древняя магия все еще сильна в этих стенах. Она держит Руина на расстоянии.\"\n\n#. Key:\tF9551D7849226F88A4FD15AAFB4789E6\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/tut9.tut9:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/tut9.tut9:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_tut9\"\nmsgid \"Be careful though... it can have the weirdest side effects.\"\nmsgstr \"Будь осторожен... у него могут быть самые странные побочные эффекты.\"\n\n#. Key:\t302976FD411E850B3CD7CEA7E0BF6924\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Wizard.Wizard:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/Ending/E1/Wizard.Wizard:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_Wizard\"\nmsgid \"Please wait outside until I repeat the spell. Once Lillian is back, I’ll take you home.\"\nmsgstr \"Пожалуйста, подожди снаружи, пока я не повторю заклинание. Как только Лиллиан вернется, я верну тебя домой.\"\n\n#. Key:\t3851C21F419E9F1D29A06DA3B2A0F553\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Wizard.Wizard:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Ending/E1/Wizard.Wizard:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_Wizard\"\nmsgid \"Er... your room is still as untidy as last time, but no problem.\"\nmsgstr \"Эм... твоя комната все так же неаккуратна, как и в прошлый раз, ну не важно.\"\n\n#. Key:\t6CCE5BBC4135176C1FBD8E866FD4B098\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Wizard.Wizard:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Ending/E1/Wizard.Wizard:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_Wizard\"\nmsgid \"I’m sorry we met like this.\"\nmsgstr \"Мне жаль, что мы так встретились.\"\n\n#. Key:\t7511912D4F72D1D45CFFB9AA9815CCB2\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Wizard.Wizard:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E1/Wizard.Wizard:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_Wizard\"\nmsgid \"Yes... and thank you!\"\nmsgstr \"Да... и спасибо!\"\n\n#. Key:\tAC1641244DF694B660EAFDA1FC4A177B\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Wizard.Wizard:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E1/Wizard.Wizard:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_Wizard\"\nmsgid \"Here are your artefacts! I made my part of the deal.\"\nmsgstr \"Вот твои артефакты! Я выполнил свою часть сделки.\"\n\n#. Key:\tB567059148744E3F7A4D3B929F26CBB6\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Wizard.Wizard:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Ending/E1/Wizard.Wizard:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_Wizard\"\nmsgid \"Yes, we made a deal!\"\nmsgstr \"Да, мы заключили сделку!\"\n\n#. Key:\tC2ED3A564A55A644D33F9E9E38D1676A\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Wizard.Wizard:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Ending/E1/Wizard.Wizard:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_Wizard\"\nmsgid \"Give me a few more minutes to finish what we started!\"\nmsgstr \"Дай мне еще несколько минут, чтобы закончить то, что мы начали!\"\n\n#. Key:\tE1521B0B46F26BFA464C6C81EC2D4900\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Wizard.Wizard:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Ending/E1/Wizard.Wizard:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_Wizard\"\nmsgid \"Will you release me?\"\nmsgstr \"Ты меня освободишь?\"\n\n#. Key:\tFE3EE6014784FCE7EB8001BC1E77D833\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Wizard.Wizard:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Ending/E1/Wizard.Wizard:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_Wizard\"\nmsgid \"Er... excuse me for being rude with you. I might have misjudged you. And, anyway...\"\nmsgstr \"Эм... извини меня за то, что я был груб с тобой. Я возможно недооценил тебя. И, в любом случае...\"\n\n#. Key:\t0D3B0F654B4B3FC1AE9B46809DA7FD74\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter2/Wizard_AfterMonk.Wizard_AfterMonk:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Wizard/Chapter2/Wizard_AfterMonk.Wizard_AfterMonk:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_Wizard_AfterMonk\"\nmsgid \"What did he say?\"\nmsgstr \"Что он сказал?\"\n\n#. Key:\tDE149D01484DA8CD03D1C0848D01BEA6\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter2/Wizard_AfterMonk.Wizard_AfterMonk:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Wizard/Chapter2/Wizard_AfterMonk.Wizard_AfterMonk:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_Wizard_AfterMonk\"\nmsgid \"Nothing...\"\nmsgstr \"Ничего...\"\n\n#. Key:\t1E43B5674AB45A7BDBEED1BE2AE25FE8\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter2/Wizard_Artefact1.Wizard_Artefact1:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Wizard/Chapter2/Wizard_Artefact1.Wizard_Artefact1:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_Wizard_Artefact1\"\nmsgid \"Well done. Now we have the first artefact. There are only two left...\"\nmsgstr \"Молодец. Теперь у нас есть первый артефакт. Осталось только два...\"\n\n#. Key:\t45AB81D94B2C6C9B13A49C944AD80389\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter2/Wizard_Artefact1.Wizard_Artefact1:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Wizard/Chapter2/Wizard_Artefact1.Wizard_Artefact1:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_Wizard_Artefact1\"\nmsgid \"Don’t tell me I will need to kill another two of these!\"\nmsgstr \"Не говорите мне, что мне придется убить еще двух таких!\"\n\n#. Key:\t3CBF720A438F217805FD5F85990FF515\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter2/Wizard_Artefact2.Wizard_Artefact2:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Wizard/Chapter2/Wizard_Artefact2.Wizard_Artefact2:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_Wizard_Artefact2\"\nmsgid \"We are close! Only one artefact is missing.\"\nmsgstr \"Мы близко! Не хватает только одного артефакта.\"\n\n#. Key:\tFD6163CC43BF00E4DB95CBB11CA7D389\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter2/Wizard_Artefact2.Wizard_Artefact2:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Wizard/Chapter2/Wizard_Artefact2.Wizard_Artefact2:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_Wizard_Artefact2\"\nmsgid \"What I miss is a comfortable apartment somewhere safe...\"\nmsgstr \"Чего мне не хватает, так это уютной квартиры в безопасном месте...\"\n\n#. Key:\t0D37E1DE44FDF7C5BF8DD28C038FA49D\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter2/Wizard_Artefact3.Wizard_Artefact3:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Wizard/Chapter2/Wizard_Artefact3.Wizard_Artefact3:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_Wizard_Artefact3\"\nmsgid \"What? Can’t you just... oh, forget it!\"\nmsgstr \"Что? Ты не можешь просто... ой, забудь об этом!\"\n\n#. Key:\t2BDFD83247C8B644DED9CAA6486A064F\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter2/Wizard_Artefact3.Wizard_Artefact3:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Wizard/Chapter2/Wizard_Artefact3.Wizard_Artefact3:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_Wizard_Artefact3\"\nmsgid \"Yes, I’ve done what you asked. Now it’s your turn. Set me free!\"\nmsgstr \"Да, я сделал то, что ты просил. Теперь твоя очередь. Освободите меня!\"\n\n#. Key:\t8CCAFBA148F1834EABE12CAC93669A79\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter2/Wizard_Artefact3.Wizard_Artefact3:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Wizard/Chapter2/Wizard_Artefact3.Wizard_Artefact3:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_Wizard_Artefact3\"\nmsgid \"I have to admit I’m impressed. You found all the three artefacts.\"\nmsgstr \"Должен признать, я впечатлен. Ты нашел все три артефакта.\"\n\n#. Key:\tA54C612946D6A5EB76D38B8622F4F76C\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter2/Wizard_Artefact3.Wizard_Artefact3:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Wizard/Chapter2/Wizard_Artefact3.Wizard_Artefact3:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_Wizard_Artefact3\"\nmsgid \"All right demon. Use the railways to travel to World’s End. That’s where I can bring you back.\"\nmsgstr \"Ладно, демон. Используй железные дороги, чтобы добраться до Конец света. Там я смогу вернуть тебя обратно.\"\n\n#. Key:\t05FE50EE4B18F4FE9C1559979669E616\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"Still nothing, but nobody said anything about any visible change at this point, right?\"\nmsgstr \"По-прежнему ничего, но никто ничего не говорил о каких-либо видимых изменениях на этом этапе, верно?\"\n\n#. Key:\t0DDE5A0E47BADFCA9E6E98A10F0AF114\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_1.Children(0).Children.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_1.Children(0).Children.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"Craft Ghost Abacus\"\nmsgstr \"Сделать Призрачного Абакуса\"\n\n#. Key:\t0F4008294D6FA43C3D9C17BA600FB024\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"You have a glowing hammer. What's next?\"\nmsgstr \"У тебя есть светящийся молот. Что дальше?\"\n\n#. Key:\t26089F6044B0FD1134C9C99AF17E9E0C\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_7.Children(4).Children.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_7.Children(4).Children.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"Say a different color\"\nmsgstr \"Скажи другой цвет\"\n\n#. Key:\t29FFB2FF49C6C231583FF1B549DA218C\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"Gnome magic at its best. Did you do everything the way it was supposed to be done? You should find out soon... maybe.\"\nmsgstr \"Волшебство гномов в лучшем виде. Ты сделал все так, как должно было быть? Скоро узнаешь... может быть.\"\n\n#. Key:\t2BF7D8D726080F0A003A0229BE7871C7\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"With the proper instructions and materials you could definitely create something valuable here.\"\nmsgstr \"При правильных инструкциях и материалах ты, несомненно, сможешь создать здесь что-то ценное.\"\n\n#. Key:\t3231FF0D4A2BBEE3E3AD7598E5105E0E\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"The object is coagulated into a single Surrected object!\"\nmsgstr \"Объект коагулируется в единый Воскрешенный объект!\"\n\n#. Key:\t41335322411CF278B19849AC696E6F93\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_2.Children(4).Children.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_2.Children(4).Children.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"Break the abacus into pieces\"\nmsgstr \"Разбить абакус на части\"\n\n#. Key:\t4C74F3C342690A8246916B85FF4685C9\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"The abacus does not show any emotion.\"\nmsgstr \"Абакус не показывает никаких эмоций.\"\n\n#. Key:\t4F8E51DA4C0B33020E34AF9AB47BCCD5\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_7.Children(0).Children.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_7.Children(0).Children.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"Croon \\\"La La LaLaLa LaLaLa\\\"\"\nmsgstr \"Напевай “Лa Ла ЛаЛаЛа ЛаЛаЛа”\"\n\n#. Key:\t5404D10943BB5F53229FDC845E60B000\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_7.Children(5).Children.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_7.Children(5).Children.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"Give up for now\"\nmsgstr \"Сдайся на время\"\n\n#. Key:\t5548D94E415483F129CCA7A3102B9DB3\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"Poor Abacus. It is broken into pieces now.\"\nmsgstr \"Бедный Абакус. Теперь он разбит на части.\"\n\n#. Key:\t6F3DE41D43326079A2BD72A29059FBA9\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"You have the Abacus and the Ghost Flower Petals in front of you. The workshop has all the tools you need. How do you proceed?\"\nmsgstr \"У тебя перед глазами Абакус и Лепестки Призрачного Цветка. В мастерской есть все необходимые инструменты. Что ты будешь делать дальше?\"\n\n#. Key:\t7EE3EE474090DCA65BB3199E69E83B43\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_1.Children(1).Children.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_1.Children(1).Children.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"Leave\"\nmsgstr \"Выйти\"\n\n#. Key:\t87B760894A587B34EB825487D907D2E4\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_7.Children(1).Children.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_7.Children(1).Children.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"Croon \\\"La LaLa LaLaLa LaLaLa\\\"\"\nmsgstr \"Напевай “Лa Ла ЛаЛаЛа ЛаЛаЛа”\"\n\n#. Key:\t947E69AA4EEE6DB329FAD48214D4C416\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_2.Children(0).Children.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_2.Children(0).Children.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"Say \\\"Sorry my <object name>!\\\"\"\nmsgstr \"Скажи “Извините мое <object name>!”\"\n\n#. Key:\t95D5418F4145388680D7C99F720CE191\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_7.Children(3).Children.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_7.Children(3).Children.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"Say \\\"Brown\\\"\"\nmsgstr \"Скажи “Коричневый”\"\n\n#. Key:\tC184ED314482D706C3426CB5034C3AFD\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_7.Children(2).Children.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_7.Children(2).Children.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"Say \\\"Blue\\\"\"\nmsgstr \"Скажи “ Синий”\"\n\n#. Key:\tC7EB7FC648E0005DC35550A3D71DF221\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_2.Children(3).Children.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_2.Children(3).Children.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"Cover the Abacus with Petals\"\nmsgstr \"Накрой Абакус лепестками\"\n\n#. Key:\tCA7A7E0A4F16FBE20EE16395D6565D7E\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"Maybe the abacus is a bit more ghosty now... or is it just you getting tired of trying?\"\nmsgstr \"Может быть, абакус сейчас немного более призрачный... или тебе просто надоело пытаться?\"\n\n#. Key:\tE0507C5E44553E824F998D8D4CB044A4\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"Your last action did not lead to any visible change. What is your next move?\"\nmsgstr \"Твое последнее действие не привело к заметным изменениям. Какой твой следующий шаг?\"\n\n#. Key:\tE8550D874C73F12B76345D9AAB2FEB80\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_2.Children(2).Children.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_2.Children(2).Children.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"Heat a hammer\"\nmsgstr \"Разогреть молот\"\n\n#. Key:\tE894C6624CC7A0F92CECBBB364C77CD1\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_2.Children(1).Children.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_2.Children(1).Children.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"Say \\\"Sorry my Abacus!\\\"\"\nmsgstr \"Скажи “Извини мой Абакус!”\"\n\n#. Key:\tEFC4E9AB4A1B8DF491B4FBABBC7FA560\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"The Abacus is covered with the Petals of the Ghost Flower.\"\nmsgstr \"Абакус покрыт Лепестками Цветка Призрака.\"\n\n#. Key:\t100A735A460E0DE2B0D130B802762D8B\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter2/WW_Scroll_Inspect.WW_Scroll_Inspect:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Wizard/Chapter2/WW_Scroll_Inspect.WW_Scroll_Inspect:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_WW_Scroll_Inspect\"\nmsgid \"It says: \\\"Be careful: I think there are Fishies in the water!\\\"\"\nmsgstr \"Здесь сказано: “Будь осторожен: Я думаю, что в воде есть Фиши!”\"\n\n#. Key:\t1D280F60496F7EF5DBDADB90674E8225\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter2/WW_Scroll_Inspect.WW_Scroll_Inspect:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Wizard/Chapter2/WW_Scroll_Inspect.WW_Scroll_Inspect:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_WW_Scroll_Inspect\"\nmsgid \"He was.\"\nmsgstr \"Он был.\"\n\n#. Key:\t37D4983B49B8986752A095B03ADCD700\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter2/WW_Scroll_Inspect.WW_Scroll_Inspect:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Wizard/Chapter2/WW_Scroll_Inspect.WW_Scroll_Inspect:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_WW_Scroll_Inspect\"\nmsgid \"He was right.\"\nmsgstr \"Он был прав.\"\n\n#. Key:\t26432B92474630595CF8B6B44B02657B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_26.Text\n#: /Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_26.Text\nmsgctxt \"Dialogue_WWSewerCreatures\"\nmsgid \"Farewell and good luck to you as well!\"\nmsgstr \"Прощай и удачи тебе!\"\n\n#. Key:\t2E3C904D458640A4F06DD793B416366A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_WWSewerCreatures\"\nmsgid \"All right, I will return when I'm done.\"\nmsgstr \"Ладно, вернусь, когда закончу.\"\n\n#. Key:\t382595684668BDA97AAB95BF129246E4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_WWSewerCreatures\"\nmsgid \"No problem. I always help when I can.\"\nmsgstr \"Нет проблем. Я всегда помогаю, когда могу.\"\n\n#. Key:\t4BF10AD741739BE69EF797A32410C281\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_WWSewerCreatures\"\nmsgid \"One of your brothers is trapped? What happened?\"\nmsgstr \"Один из твоих братьев в ловушке? Что случилось?\"\n\n#. Key:\t52403E3341ECEA5801B0E58D2F472FD5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_1.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_1.Children(1).Children.Text\nmsgctxt \"Dialogue_WWSewerCreatures\"\nmsgid \"Leave\"\nmsgstr \"Выйти\"\n\n#. Key:\t53AC225B4F21B68CAC6F8997F324124E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_29.Text\n#: /Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_29.Text\nmsgctxt \"Dialogue_WWSewerCreatures\"\nmsgid \"Farewell until we meet again!\"\nmsgstr \"Прощай, может встретимся вновь!\"\n\n#. Key:\t65042BC342E9717229E74A9DD272DC5F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_WWSewerCreatures\"\nmsgid \"It was nice to see you again.\"\nmsgstr \"Было приятно снова тебя увидеть.\"\n\n#. Key:\t77959A144131C47488B221ADD9B1E13B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_WWSewerCreatures\"\nmsgid \"Don't worry! I'm still looking for it.\"\nmsgstr \"Не волнуйся! Я все еще ищу его.\"\n\n#. Key:\t7914F3CA40844C2A13A760BB0DAE1BFA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_WWSewerCreatures\"\nmsgid \"I don't have time for you creature! Stay out of my way!\"\nmsgstr \"У меня нет времени на тебя, создание! Не мешай мне!\"\n\n#. Key:\t79A62658414FE0202F2E9AA0E0238BD4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_9.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_9.Children(0).Children.Text\nmsgctxt \"Dialogue_WWSewerCreatures\"\nmsgid \"Accept Quest\"\nmsgstr \"Принять Квест\"\n\n#. Key:\t9AEDA0E84BABEBCD8F18E8BC2D0B75D0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_WWSewerCreatures\"\nmsgid \"Calm down creature! I mean you no harm.\"\nmsgstr \"Успокойся, создание! Я не причиню тебе вреда.\"\n\n#. Key:\tB89304534B24114D19DF7AB07635FFDE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_WWSewerCreatures\"\nmsgid \"All right I will see what I can do.\"\nmsgstr \"Хорошо, я посмотрю, что можно сделать.\"\n\n#. Key:\tB8BD374E4738BFFDAFAC4EAA19E7A9D2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_23.Text\n#: /Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_23.Text\nmsgctxt \"Dialogue_WWSewerCreatures\"\nmsgid \"Oh, thank you!\"\nmsgstr \"О, спасибо!\"\n\n#. Key:\tCF62984840B7508E82BAC0AB9D53EC0A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_9.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_9.Children(1).Children.Text\nmsgctxt \"Dialogue_WWSewerCreatures\"\nmsgid \"Decline\"\nmsgstr \"Отклонить\"\n\n#. Key:\tEAD329F04773358B0CA339A4F155D990\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_WWSewerCreatures\"\nmsgid \"I'm sorry but I can't help you.\"\nmsgstr \"Прости, но я не могу тебе помочь.\"\n\n#. Key:\tF281396D4110E61ACFEFDBB7AD8E44A8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_1.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_1.Children(0).Children.Text\nmsgctxt \"Dialogue_WWSewerCreatures\"\nmsgid \"Help\"\nmsgstr \"Помощь\"\n\n#. Key:\tedge_next\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_1.InnerEdges(0).InnerEdges.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_1.InnerEdges(0).InnerEdges.Text\nmsgctxt \"DlgSystemSettings\"\nmsgid \"Next\"\nmsgstr \"Далее\"\n\n"
  },
  {
    "path": "Content/Localization/WarriorbDialogues/uk/WarriorbDialogues.po",
    "content": "﻿# WarriorbDialogues Ukrainian translation.\n# Copyright 1998-2019 Epic Games, Inc. All Rights Reserved.\n# \nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: WarriorbDialogues\\n\"\n\"POT-Creation-Date: 2020-10-07 08:09\\n\"\n\"PO-Revision-Date: 2020-10-07 08:09\\n\"\n\"Language-Team: \\n\"\n\"Language: uk\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\\n\"\n\n#. Key:\t064BBCD1476819100C8D39881B7A7C56\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/2HW_LRDoor.2HW_LRDoor:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E2/2HW_LRDoor.2HW_LRDoor:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_2HW_LRDoor\"\nmsgid \"They still didn’t notice I locked them into the workroom.\"\nmsgstr \"\"\n\n#. Key:\t21412F0A4E45FA97703599BACD9C5D0E\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/2HW_LRDoor.2HW_LRDoor:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Ending/E2/2HW_LRDoor.2HW_LRDoor:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_2HW_LRDoor\"\nmsgid \"I entered into the Laboratory.\"\nmsgstr \"\"\n\n#. Key:\t5A580A014B6E9907C819808423E10C30\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/2HW_LRDoor.2HW_LRDoor:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E2/2HW_LRDoor.2HW_LRDoor:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_2HW_LRDoor\"\nmsgid \"The Laboratory has strong secure spells. I can’t enter here without being noticed.\"\nmsgstr \"\"\n\n#. Key:\t0530863744A9844E7F64009D82A189E4\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_2HW_WRDoor\"\nmsgid \"Ruin is close and we are all at risk. It’s not about you. It's about everyone.\"\nmsgstr \"\"\n\n#. Key:\t1AF2A89F4DCD86096D4343ABBE91BE51\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_2HW_WRDoor\"\nmsgid \"Something which doesn’t take my daughter’s soul...\"\nmsgstr \"\"\n\n#. Key:\t2C5B294847F0E41F2CA189904EE66059\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_2HW_WRDoor\"\nmsgid \"I heard father arguing with someone.\"\nmsgstr \"\"\n\n#. Key:\t2C8DFF1042FB0480709877A366BE2F1D\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_2HW_WRDoor\"\nmsgid \"The device must be destroyed.. We’ll find something else to stop Ruin.\"\nmsgstr \"\"\n\n#. Key:\t3F9D7D9C42A8550A6B282680BFAE2CCC\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_2HW_WRDoor\"\nmsgid \"I had to do this. At least for mom. So that she didn’t die in vain.\"\nmsgstr \"\"\n\n#. Key:\t7F6FC84C4D799841C6F42EB45A9D648F\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_2HW_WRDoor\"\nmsgid \"No, I won't risk losing her! She is bound to the device.\"\nmsgstr \"\"\n\n#. Key:\tA03D724A4606AFFC00E417A5C3AB3BFF\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_2HW_WRDoor\"\nmsgid \"Lillian knew what she applied for. She must decide.\"\nmsgstr \"\"\n\n#. Key:\tABA214914981F3E844F49483B43B5414\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_2HW_WRDoor\"\nmsgid \"I used the key to close the door.\"\nmsgstr \"\"\n\n#. Key:\tB1ADF0404F97735215FCB9A47DD01640\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_2HW_WRDoor\"\nmsgid \"No, I’ve made my decision.\"\nmsgstr \"\"\n\n#. Key:\tB26FAB564CA430617502FA85116629D0\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_2HW_WRDoor\"\nmsgid \"Even if our entire World needs to pay the price.\"\nmsgstr \"\"\n\n#. Key:\tD6D2D64446B6D921576A20ACD653AF7E\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_2HW_WRDoor\"\nmsgid \"I knew he wouldn’t let me finish what we started.\"\nmsgstr \"\"\n\n#. Key:\t178EBCA541F7FEC3CA46B1B2818691D4\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/AABook.AABook:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/AABook.AABook:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_AABook\"\nmsgid \"'...the Wisest of the Arcade gathered here to discuss if the magical phenomena means any more threat...'\"\nmsgstr \"\"\n\n#. Key:\t8F2CCFF54FBAF7902DB6FEB0358ECFEF\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/AABook.AABook:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/AABook.AABook:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_AABook\"\nmsgid \"They were just like us. The next one hundred pages explain why Ruin will never reach the Arcade or how the Ancient Magic can stop it.\"\nmsgstr \"\"\n\n#. Key:\tAC20B864497FB0D476C501AEF3B87508\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/AABook.AABook:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/AABook.AABook:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_AABook\"\nmsgid \"I hope you don’t want to read all that nonsense.\"\nmsgstr \"\"\n\n#. Key:\tB112F657498F660766AA45974CB44137\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/AABook.AABook:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/AABook.AABook:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_AABook\"\nmsgid \"'Ten years after the Cataclysm (or recently named as Ruin)...'\"\nmsgstr \"\"\n\n#. Key:\t0F53B19F4EB2F7727B4907864AD3FF46\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_29.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_29.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"What if you just take a break from this and let me pass? Make an exception.\"\nmsgstr \"\"\n\n#. Key:\t1707E0F34CFDC054DBEAD9AFB368A0A4\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"No rest, no sleep allowed.\"\nmsgstr \"\"\n\n#. Key:\t2524B3EC4DE1E2921C710CBE4511045F\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"...sometimes I could really appreciate a chair.\"\nmsgstr \"\"\n\n#. Key:\t29FE2AEF42639848EF3914B36BA2B633\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"I do ask you for apologies, young one.\"\nmsgstr \"\"\n\n#. Key:\t2C1E7EA026080F0A003A0396BE7E0E7E\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"Take this rune stone as compensation.\"\nmsgstr \"\"\n\n#. Key:\t2C879B684B4B07B57D051797219E751E\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"You might have proven worthy for the Arcade Gate, yet there are some other doors, and they have different rules.\"\nmsgstr \"\"\n\n#. Key:\t3532C8254924CF13EA664CA11E256F07\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"Will you??? That's so kind of you... err... I mean...\"\nmsgstr \"\"\n\n#. Key:\t353D6C8B4B5719B1EFD2A59BA0281DED\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_2.Children(2).Children.Text\n#. Key:\t8EED48724A0A860CAD791FAF95554F26\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_3.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_2.Children(2).Children.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_3.Children(1).Children.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"Skip?\"\nmsgstr \"\"\n\n#. Key:\t3FF1411844C23DB2FDFA47939169B5C3\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_14.Children(0).Children.Text\n#. Key:\t59EC5E56475DE41CFC723793CEEAFA82\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_3.Children(0).Children.Text\n#. Key:\t65DD6A464F04F8B0762D568046344C16\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_6.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_14.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_3.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_6.Children(0).Children.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"Accept challenge\"\nmsgstr \"\"\n\n#. Key:\t414D5CC44FFD640215B97BB6090627D6\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"That must be tough...\"\nmsgstr \"\"\n\n#. Key:\t4CAA2D0C4FB585A0EB5B4F87FE8A3A97\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"I accept my fate yet sometimes...\"\nmsgstr \"\"\n\n#. Key:\t4F7460F540408D07FECEEB88DC0D7D25\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"Not so fast young lord!\"\nmsgstr \"\"\n\n#. Key:\t52C3909F40026C52ADA498A5B60B3490\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_6.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_6.Children(1).Children.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"Poor Keeper\"\nmsgstr \"\"\n\n#. Key:\t59141BA444003F36E1671CB4E91FFF0E\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"Farewell!\"\nmsgstr \"\"\n\n#. Key:\t59AC0995469571DBE1B7B6BDF68FA37D\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"I am really sorry about that.\"\nmsgstr \"\"\n\n#. Key:\t5C8404D34863129B221EF2BB1D0962CC\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_9.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_9.Children(0).Children.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"Yes?\"\nmsgstr \"\"\n\n#. Key:\t5FF922B94D3FCA5FD095FFB788F43D02\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"For there was a mistake.\"\nmsgstr \"\"\n\n#. Key:\t650DA55944F225C45BABE8B00D815A39\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_27.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_27.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"I guess you want me to go through some crazy traps again...\"\nmsgstr \"\"\n\n#. Key:\t700A25DB401C6EDD1E9D1694DA1C1DA1\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"Keepers never fail their duty.\"\nmsgstr \"\"\n\n#. Key:\t72D703F84C84CD07F7DA569D9B86AECB\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"There are times when you have to stand in front of a door for a really long time.\"\nmsgstr \"\"\n\n#. Key:\t8276A9AC4E3BAB81C41E6EAB12E4FED1\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_31.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_31.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"If I ever see a chair that's your size I will let you know.\"\nmsgstr \"\"\n\n#. Key:\t89421ED443CA8DD5A15DF289C5DC6C37\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_28.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_28.Children(0).Children.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"Accept Challenge\"\nmsgstr \"\"\n\n#. Key:\t910F61A841D9E86D1B349E85A8A47FCF\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"Prove yourself worthy and I shall yield the path!\"\nmsgstr \"\"\n\n#. Key:\t9DAC66B94E5A37C628522B90029E8FCC\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_2.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_2.Children(0).Children.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"Not again\"\nmsgstr \"\"\n\n#. Key:\t9F3FE24943FB7CE59B8453A2849E874A\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"This door is open and free of charge for everyone...\"\nmsgstr \"\"\n\n#. Key:\tA96E78A0410C87446F59ABAC1524A3F4\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_2.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_2.Children(1).Children.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"Let's do it!\"\nmsgstr \"\"\n\n#. Key:\tA9998DDC43D15F1EDE404B8A3E04E3B2\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"Keepers' lives are never easy.\"\nmsgstr \"\"\n\n#. Key:\tBCAE1C1D4890E79F187EF0940C6F7E84\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_12.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_12.Children(0).Children.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"Just get over\"\nmsgstr \"\"\n\n#. Key:\tC2F8F4E1457AC142E58D1EA3AF24AB56\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"I am all right with a few hundred years, but after a millennium my knees hurt like hell.\"\nmsgstr \"\"\n\n#. Key:\tC955446E4CA17593CCC57B9A73AAE824\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"What?? Do you mean that all those challenges that I had to pass were in vain?\"\nmsgstr \"\"\n\n#. Key:\tC97F61DA4A49287F5242EEB43152D409\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"All right, you win. I'll go and do some jumping. Must be better than waiting here for an eternity.\"\nmsgstr \"\"\n\n#. Key:\tD318418D4CBBFA2AB381E6B287A8636F\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_30.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_30.Children(0).Children.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"Accept Challenge.\"\nmsgstr \"\"\n\n#. Key:\tD6BE170047C1A00770403087A7EBDF99\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_30.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_30.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"Hopefully, we will finish this soon.\"\nmsgstr \"\"\n\n#. Key:\tD72FF4F943571BE3DC8DB1877581D4CD\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"You shall prove yourself one more time.\"\nmsgstr \"\"\n\n#. Key:\tDFD8B1E0414F989D46ED9BB24610CDA8\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_12.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_12.Children(1).Children.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"I will help\"\nmsgstr \"\"\n\n#. Key:\tFDDD27C544787C63B03CCE89B69A44E5\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"Well, thanks!\"\nmsgstr \"\"\n\n#. Key:\t06D52FD74B0013A5A22FEBA7A6E82032\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Did you came back to check out my wares?\"\nmsgstr \"\"\n\n#. Key:\t07508A9F4A979D530AD8A9861F0C7D79\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Though maybe you will find relief by looking through my wares. Haha!\"\nmsgstr \"\"\n\n#. Key:\t0C1B7239419B00927360E1B9578540EA\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_27.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_27.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"That's a sad name indeed. If the old saying 'nomen est omen' is true, then it might not be the best choice.\"\nmsgstr \"\"\n\n#. Key:\t0D8F81E140A7AF5369415FB1C081250E\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_10.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_10.Children(0).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Trade\"\nmsgstr \"\"\n\n#. Key:\t1089DA0443D9B23C84B8B799EEEBCCC9\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_SpeechSequence_0.SpeechSequence(0).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_SpeechSequence_0.SpeechSequence(0).SpeechSequence.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Oh, that's sad my little one.\"\nmsgstr \"\"\n\n#. Key:\t16F6844C40498EC1B5CDAA87612D3982\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_42.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_42.Children(1).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"No way\"\nmsgstr \"\"\n\n#. Key:\t182D4124450BFA52EF26FBACE1706333\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_45.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_45.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"How noble of you!\"\nmsgstr \"\"\n\n#. Key:\t1922E4FD49ABC50B04A33CBA07B440D1\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_34.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_34.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"But I hope this doesn't mean that you want to join the Maintainers. Haha!\"\nmsgstr \"\"\n\n#. Key:\t195B9BED4921EE6D732CA4BE6391A402\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_31.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_31.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"No, thanks!\"\nmsgstr \"\"\n\n#. Key:\t198A3D8D426F5202C280CE96202EB415\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_50.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_50.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"This is a sad name indeed. And if the old saying 'nomen est omen' is true, then this might not be the best choice.\"\nmsgstr \"\"\n\n#. Key:\t1AF2DDE74542524EEF19CA9567CFBDAF\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"{name}? It still sounds a bit weird, but I think I might like it.\"\nmsgstr \"\"\n\n#. Key:\t1FC5AD3B488DB484169D0085D63ECC45\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"This sounds pretty epic but I wonder what nickname it might have?\"\nmsgstr \"\"\n\n#. Key:\t21FEE27B41116ADFBFD2B69333D6EB3F\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"By using some sort of ritual or spell...\"\nmsgstr \"\"\n\n#. Key:\t25DCE964400342D4188412ADF43277E6\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_61.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_61.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"I am rewarding you with these shiny coins!\"\nmsgstr \"\"\n\n#. Key:\t2717F0E0414D4828B67D9C9F9B7E5F84\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_62.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_62.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"See? I'm a gnome of my word!\"\nmsgstr \"\"\n\n#. Key:\t2747A45248055455F9FA3B977A019EE0\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_44.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_44.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Well, you know where to find me... once you have some coins to spend!\"\nmsgstr \"\"\n\n#. Key:\t27CE4D1444C219D35B79F4A3B07CB67D\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"If you bring them to me, I will reward you with shiny golden coins!\"\nmsgstr \"\"\n\n#. Key:\t3040F4DC4C763062C8EFED9BCA5028C0\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_59.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_59.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"I would love to give you that name, but if you don't have the money to pay for it, we can't make the deal, it wouldn't be fair\"\nmsgstr \"\"\n\n#. Key:\t3124230541027A0022F54C8648E688C9\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Oh, a customer!\"\nmsgstr \"\"\n\n#. Key:\t31C147E1430106CD29C7D7B2F7E84975\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_23.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_23.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Oh, how sad.\"\nmsgstr \"\"\n\n#. Key:\t37CC1248471C360F8BB605A404ED1408\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_10.Children(4).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_10.Children(4).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Give books\"\nmsgstr \"\"\n\n#. Key:\t3E0A0E06487AD4E75C3AF28786DE9CC7\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_16.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_16.Children(0).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Don't know\"\nmsgstr \"\"\n\n#. Key:\t40221BB0432119A5B1C285B748AEFB81\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_51.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_51.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"It sounds pretty epic, however I wonder what nickname it might have?\"\nmsgstr \"\"\n\n#. Key:\t422B5CC14CA23A6563EDBDBBEA09C44B\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_73.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_73.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Farewell! Ha-ha...\"\nmsgstr \"\"\n\n#. Key:\t4574EE8E4B1EAB6C9310C4A19F77B170\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_10.Children(6).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_10.Children(6).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Leave\"\nmsgstr \"\"\n\n#. Key:\t47F99BBF439F713C52279F86BDC4FDD5\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_72.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_72.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"No thanks, I'm leaving.\"\nmsgstr \"\"\n\n#. Key:\t4F31CEE0411BB60324FB58938857F162\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_16.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_16.Children(1).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"A mighty spirit\"\nmsgstr \"\"\n\n#. Key:\t4FA29908450786B433C0FCA2E313D989\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_36.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_36.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Hi, I'm Lory.\"\nmsgstr \"\"\n\n#. Key:\t4FCB34514D82104E732407A1CD985F6B\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_70.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_70.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Sure, show me what you've got!\"\nmsgstr \"\"\n\n#. Key:\t53A46E1948B7CC1A9F8E02A3147FBF2D\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_67.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_67.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Sure, what can I do?\"\nmsgstr \"\"\n\n#. Key:\t53E7A272465DE8D6E34AE7BE7435B1AC\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_25.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_25.Children(1).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Spirit of the Unknown\"\nmsgstr \"\"\n\n#. Key:\t54F8FB604F0409ED474FBFBAD8BFD3B3\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"And you are...\"\nmsgstr \"\"\n\n#. Key:\t58447CCB4EE84827DB8328A664C54198\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_24.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_24.Children(0).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Buy name\"\nmsgstr \"\"\n\n#. Key:\t589162A649D330D791082EB8FE3F6459\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_41.Children(4).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_41.Children(4).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Don't buy.\"\nmsgstr \"\"\n\n#. Key:\t58CC98724AFCD3826D69D482682AF352\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"\\\"The true value of your family\\\" and \\\"How much does a brother cost?\\\" can be two examples in this case.\"\nmsgstr \"\"\n\n#. Key:\t5A249B2E47F62C59F66AD5848E6DEBFE\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_49.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_49.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"I'll see what I can do.\"\nmsgstr \"\"\n\n#. Key:\t5A31E5D34729F7EAB69AC08238C1D32D\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_25.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_25.Children(0).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Failed One\"\nmsgstr \"\"\n\n#. Key:\t5BA1062346DF8BC47F97BA97653E6DDA\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_46.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_46.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Farewell then, and good luck with your quest! Ha-ha...\"\nmsgstr \"\"\n\n#. Key:\t6047D5334E0247BFB75EBAA7380C6800\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_68.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_68.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"I have some other important things to do right now.\"\nmsgstr \"\"\n\n#. Key:\t60B184AF4F25AFB60380029BD2C17AAB\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_66.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_66.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"I'm a mighty spirit of the Unknown!\"\nmsgstr \"\"\n\n#. Key:\t60CE0D4342B6E4971449D7BDDD62B13F\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_10.Children(3).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_10.Children(3).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Help\"\nmsgstr \"\"\n\n#. Key:\t62C5459E46C969412EAD70BAD466D808\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_SpeechSequence_0.SpeechSequence(1).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_SpeechSequence_0.SpeechSequence(1).SpeechSequence.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Life is relentless. Innocent people are trapped, enslaved or abused!\"\nmsgstr \"\"\n\n#. Key:\t6DDEF0AB45B60A99946E8F9FC647DCDE\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_71.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_71.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"I need a proper name.\"\nmsgstr \"\"\n\n#. Key:\t6F1C50A44DE698DF5BF089B1C9B29F06\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_69.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_69.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Right now I don't really have much money...\"\nmsgstr \"\"\n\n#. Key:\t72272161488706E5E87697A755F11129\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Even though there are some other precious books that I could add to my collection...\"\nmsgstr \"\"\n\n#. Key:\t764502A14C3C18B14F8A579A58CE5938\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"I know that some of those books must be in the Sewer's Library, but I couldn't find them.\"\nmsgstr \"\"\n\n#. Key:\t7A1853C7454D74FD1F371A92CEE47B4E\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"That's fine but I wonder, what is your name?\"\nmsgstr \"\"\n\n#. Key:\t7BACFCA748AF641E051E2D8B8D8488FC\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"I don't know if I have one.\"\nmsgstr \"\"\n\n#. Key:\t821021954082EA7E4B392FA89EE4DE91\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_41.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_41.Children(1).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Spirit of the Unknown (1 Gold)\"\nmsgstr \"\"\n\n#. Key:\t83AECB5A4FCAB05CC81BCC9B810245B7\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_41.Children(2).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_41.Children(2).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"BALL-E (1 Gold)\"\nmsgstr \"\"\n\n#. Key:\t84ACF5E1449849CB79CF8AB10BE2FF2E\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"As you can observe, I have a pretty nice collection of books.\"\nmsgstr \"\"\n\n#. Key:\t899D1E18420FDAD236BF3486B2A5A010\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Ring the bell if you need something.\"\nmsgstr \"\"\n\n#. Key:\t8B33450F405DF08E72CE47B5FC66CDD5\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_55.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_55.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Spiry? Knowny?\"\nmsgstr \"\"\n\n#. Key:\t8CEC3E1943C3AB72CF3B71B160B9ADB9\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_10.Children(5).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_10.Children(5).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Need gold\"\nmsgstr \"\"\n\n#. Key:\t8D0FBCA540F73842DD3AC38A76A5B623\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_56.Text\n#. Key:\tF045657A439D69E3615B80A066E9CE86\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_33.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_33.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_56.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Nevermind! You chose well.\"\nmsgstr \"\"\n\n#. Key:\t8F32BD4544F8C439D7344CBE1F9B4D8A\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_24.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_24.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Would you like to buy one? The first one is for free!\"\nmsgstr \"\"\n\n#. Key:\t94C0F9B34F439CDFBDFAD696E81983E5\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"I don't have much gold. Is there any way you could help me out?\"\nmsgstr \"\"\n\n#. Key:\t9BA6BAA24E6C2B7F01964D892246E8F6\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"No, no, I meant the other bell.\"\nmsgstr \"\"\n\n#. Key:\tA9D4DF4C41BAD682571763BDA8DA6A62\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_10.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_10.Children(1).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Can't afford\"\nmsgstr \"\"\n\n#. Key:\tAA6B105442F5099CE0F4E2AE0DFF7080\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_35.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_35.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Now that we're done with this, will you have a look at my wares?\"\nmsgstr \"\"\n\n#. Key:\tAADE21D24A42CE7BD318478306BAFFF7\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_10.Children(2).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_10.Children(2).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"I need a name\"\nmsgstr \"\"\n\n#. Key:\tAB00899C4A94AA6458737BB28339A3EE\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Hush, hush, little one!\"\nmsgstr \"\"\n\n#. Key:\tAB431F244E4E18230CE5EAB99FB41A96\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_41.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_41.Children(0).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Failed One (1 Gold)\"\nmsgstr \"\"\n\n#. Key:\tAB92E44E46B40EF16989FF850DE0F843\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_42.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_42.Children(0).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Interested\"\nmsgstr \"\"\n\n#. Key:\tB0540325412D9839B33FB38C4FE73172\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Well, I guess that's a classic.\"\nmsgstr \"\"\n\n#. Key:\tB0EFD31840839CDA6F3D929514412D00\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Ok, I'll try not to be annoying this time.\"\nmsgstr \"\"\n\n#. Key:\tB1F217944F6B9A29BD13FA926D8230E8\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_44.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_44.Children(0).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Farewell!\"\nmsgstr \"\"\n\n#. Key:\tBA2B2F444FC2320349C4A0BABDA78B40\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_25.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_25.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"All right...\"\nmsgstr \"\"\n\n#. Key:\tCADB3E394C94CDE32D9969B6C1A41F5C\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_47.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_47.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Take this Elevator Crystal as it might prove useful in your journey.\"\nmsgstr \"\"\n\n#. Key:\tCB3F061042B8340154B4CD8AEED41348\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_42.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_42.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"However, there is a way, I can help you out. Of course, if you are interested.\"\nmsgstr \"\"\n\n#. Key:\tCF24AD454E123F6D7D61029155390914\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_41.Children(3).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_41.Children(3).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Warriorb (1 Gold)\"\nmsgstr \"\"\n\n#. Key:\tD01937C848C69809890885BAB13042BE\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_65.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_65.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"I'm not quite sure.\"\nmsgstr \"\"\n\n#. Key:\tD53097EB4EFC08C0C3261A9EEBD96B72\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_39.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_39.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"That's sad. Nothing is worse than a customer without any gold to spend!\"\nmsgstr \"\"\n\n#. Key:\tD63C08294AC09BF5B8E5D29EEC1C7D39\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"I'm forced to stay in this realm because I agreed to do some silly tasks for a wizard. I could really use some help.\"\nmsgstr \"\"\n\n#. Key:\tDB0CCA7746068ACFBE6F71963C398753\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_63.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_63.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"And now that you have some coins to spend it's time to talk about business!\"\nmsgstr \"\"\n\n#. Key:\tDC0F8EC0407F1C7B4FFED6A91CB961C5\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_57.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_57.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"I hope this doesn't mean that you want to join the Maintainers. Haha!\"\nmsgstr \"\"\n\n#. Key:\tDC475A6740B71354D90D53B6AD1C4740\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_60.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_60.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"How wondrous! You found my books!\"\nmsgstr \"\"\n\n#. Key:\tE3B8F89B4D4AC0ABD2E35994ABFA9916\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"I understand if you have identity problems, but there must be a way... how do others call you?\"\nmsgstr \"\"\n\n#. Key:\tE6BD711C4E23B71F944EEFB1C8D09AB4\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_41.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_41.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"You've come to the right place! Haha!\"\nmsgstr \"\"\n\n#. Key:\tEDEB662C4A5024CC618A668699BFAC2C\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_SpeechSequence_0.SpeechSequence(2).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_SpeechSequence_0.SpeechSequence(2).SpeechSequence.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"There is no justice in this Realm.\"\nmsgstr \"\"\n\n#. Key:\tF8814FA0497129A211F3F9BE01EAF378\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_29.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_29.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"That's a very cute name for a little one like you.\"\nmsgstr \"\"\n\n#. Key:\tF8BEB8C147C81D8B13E52AA9934891AB\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_58.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_58.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Nevermind, you can always come back.\"\nmsgstr \"\"\n\n#. Key:\tF97BE7FD49F465A97F7C8D9F308EAD3C\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_52.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_52.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"That's such a cute name for a little one.\"\nmsgstr \"\"\n\n#. Key:\tFAAAE5944AA8CCAEFC931CAA814C8621\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_54.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_54.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Which means you chose well.\"\nmsgstr \"\"\n\n#. Key:\tFAD10B404CF744B61DF5D093829CD1E9\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Of course! You need some gold, otherwise how would you buy my stuff?\"\nmsgstr \"\"\n\n#. Key:\tFE40092A444E97C59E8C6E94061D1134\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_30.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_30.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"However, I'd rather prefer: 'Nomen quantivis iam est pret!'\"\nmsgstr \"\"\n\n#. Key:\tFEE11C0F4A65DDFFDBF0BD8BB30CD438\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_25.Children(2).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_25.Children(2).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"BALL-E\"\nmsgstr \"\"\n\n#. Key:\tFF0AFE8544814AE524115A853547D727\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_24.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_24.Children(1).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Refuse\"\nmsgstr \"\"\n\n#. Key:\t0648624E4922B098541A7EA738DABC92\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/AARagdoll.AARagdoll:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/AARagdoll.AARagdoll:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_AARagdoll\"\nmsgid \"Well that happens sometimes. Maybe that someone forgot to monopolize this ragdoll design.\"\nmsgstr \"\"\n\n#. Key:\t2058DE654B2B75531C04628635169938\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/AARagdoll.AARagdoll:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/AARagdoll.AARagdoll:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_AARagdoll\"\nmsgid \"Just leave that doll.\"\nmsgstr \"\"\n\n#. Key:\t5A456D084D452C82038A04942002FAE6\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/AARagdoll.AARagdoll:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/AARagdoll.AARagdoll:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_AARagdoll\"\nmsgid \"It’s like the doll which was made by...\"\nmsgstr \"\"\n\n#. Key:\t7813ED164DF5CA7DE48A978F9A3DC959\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/AARagdoll.AARagdoll:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/AARagdoll.AARagdoll:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_AARagdoll\"\nmsgid \"How on earth did this get here?\"\nmsgstr \"\"\n\n#. Key:\tC4403E4C4FD7D72CA3252FB31FF98FDF\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/AARagdoll.AARagdoll:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/AARagdoll.AARagdoll:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_AARagdoll\"\nmsgid \"...by someone I knew.\"\nmsgstr \"\"\n\n#. Key:\tE4CD5DBC4E4BB1E783B55D80F4296B97\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/AARagdoll.AARagdoll:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/AARagdoll.AARagdoll:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_AARagdoll\"\nmsgid \"There are many weird things all over this place. What makes this stand out?\"\nmsgstr \"\"\n\n#. Key:\tEDD72B38407D0C33C5F7859D09BC132B\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/AARagdoll.AARagdoll:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/AARagdoll.AARagdoll:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_AARagdoll\"\nmsgid \"You are not funny.\"\nmsgstr \"\"\n\n#. Key:\t02767246403F00F0C866B2A7F3E22A47\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_72.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_72.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"You can hardly find anyone that has more information about the Realms.\"\nmsgstr \"\"\n\n#. Key:\t04843D4A4D2DD4BC7CE50989C8F66FBA\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_2.SpeechSequence(2).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_2.SpeechSequence(2).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"How can I do something if I do not know what I have to do?\"\nmsgstr \"\"\n\n#. Key:\t071A801E44759E2681218497B9AE9A2B\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_53.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_53.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Your logic is incoherent.\"\nmsgstr \"\"\n\n#. Key:\t07488F9A4CC6F87DBC44F0A11700B370\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_70.Children(0).Children.Text\n#. Key:\tA67B3D3B4A3D17B37D585EBBBD9BBE92\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_75.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_70.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_75.Children(0).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"All right, I'm on it.\"\nmsgstr \"\"\n\n#. Key:\t0757D23846F6BC96198472B7E9848D3F\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_52.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_52.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Maybe I should accept what I need to do now.\"\nmsgstr \"\"\n\n#. Key:\t07D63011406134B07FB90B903825151C\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_8.SpeechSequence(2).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_8.SpeechSequence(2).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Make your wizard turn you back to normal.\"\nmsgstr \"\"\n\n#. Key:\t091DFEFA4B2DD8F9922A1B93534C66A8\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_70.Text\n#. Key:\t0F92571643C12F65C669F7812572B014\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_82.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_70.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_82.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven gives you one of his keys so that you can move around freely.\"\nmsgstr \"\"\n\n#. Key:\t0922ED5741BB89553CCB548D33566972\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_8.SpeechSequence(4).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_8.SpeechSequence(4).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven is something which won't make wizards turn Raven back.\"\nmsgstr \"\"\n\n#. Key:\t0AAFADBB493DCFBA6C649EAC11133DC2\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_2.SpeechSequence(0).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_2.SpeechSequence(0).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"You don't have to know.\"\nmsgstr \"\"\n\n#. Key:\t0E59A33E44BF6B212BF0EF8E8EFB3E39\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_6.SpeechSequence(2).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_6.SpeechSequence(2).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"A rich kingdom ruling all the other lands, powered by spirits of another world; these spirits were bound to metal.\"\nmsgstr \"\"\n\n#. Key:\t0EACC01B4A4C4F8C5622B9BD291E0DB9\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_91.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_91.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"I'm not quite sure about this...\"\nmsgstr \"\"\n\n#. Key:\t10142FA943B5E5D89F9E5AADC86EF413\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_113.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_113.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Yes.\"\nmsgstr \"\"\n\n#. Key:\t12375FB0475147E23E1C21A867CFF219\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_68.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_68.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Is there anything else on your mind?\"\nmsgstr \"\"\n\n#. Key:\t12A0B58B446843DD24045394E8586D7D\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Krrr...\"\nmsgstr \"\"\n\n#. Key:\t12B921E04D135919C7DA37ADDBD2A7DB\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_100.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_100.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"We still have some time left before this happens.\"\nmsgstr \"\"\n\n#. Key:\t133F676B4DBA8B41F6B94387D51457D5\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_59.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_59.Children(1).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"No more Raven\"\nmsgstr \"\"\n\n#. Key:\t13EF39EE4249FDD62208CFB7A41821D7\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_65.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_65.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Though Raven knows how you feel.\"\nmsgstr \"\"\n\n#. Key:\t15D06ACE4E8B5E4DA49297BBE436039D\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_80.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_80.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Now you only need to find a place where you can infuse it.\"\nmsgstr \"\"\n\n#. Key:\t16D5522340AE76E69A4808A3C2D1C039\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_51.Children(1).Children.Text\n#. Key:\t2AD4608440348AC7C3E363A430B9848C\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_83.Children(0).Children.Text\n#. Key:\t57DDAE184F31D9761E3939B16E6B2E67\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_20.Children(1).Children.Text\n#. Key:\t59F157C64A5415C8B4E322B0FF5F2ACE\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_49.Children(1).Children.Text\n#. Key:\t73ACC7124190746F6D3EBF96C8202C25\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_77.Children(1).Children.Text\n#. Key:\t9900274346DCB374A4B222A6BFD67365\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_10.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_10.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_20.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_49.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_51.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_77.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_83.Children(0).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Chat\"\nmsgstr \"\"\n\n#. Key:\t19FD8B0541A533338EA11B9CDA3719B2\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_74.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_74.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Now you only need to find a place where you can infuse it. Meanwhile, Raven must figure it out how to open the Gate with it.\"\nmsgstr \"\"\n\n#. Key:\t1BD7592A4F11AEC585ECA6A74A0E0D4E\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_9.SpeechSequence(4).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_9.SpeechSequence(4).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"In what way?\"\nmsgstr \"\"\n\n#. Key:\t1C30FADA4BB2B3CCE2140A8E192D9F14\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_34.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_34.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven is not like those dummy Living Armors, yet he does what he was made for.\"\nmsgstr \"\"\n\n#. Key:\t1C57460444A7E044DD96148495C4C217\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_6.SpeechSequence(4).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_6.SpeechSequence(4).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"They lost purpose and became reckless.\"\nmsgstr \"\"\n\n#. Key:\t1E3AF1D8483287CE52633EA41B89DF11\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_116.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_116.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"After he had some rest.\"\nmsgstr \"\"\n\n#. Key:\t1ED675F344909355D41212988B736F70\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_1.SpeechSequence(3).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_1.SpeechSequence(3).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven's master would like to understand before doing anything.\"\nmsgstr \"\"\n\n#. Key:\t22E51DC245ABAE53146A71AAE8D5AB55\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"You will realize that 'sense' has no meaning in this realm anymore.\"\nmsgstr \"\"\n\n#. Key:\t236E0B58451C947C0DB93E9E3408456D\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_45.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_45.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"They are humans.\"\nmsgstr \"\"\n\n#. Key:\t254FBEE547ADDFCF33B350B04AE1EE16\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_95.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_95.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"I think I know all about the meaning of life and all, ok? Can we just go on?\"\nmsgstr \"\"\n\n#. Key:\t2671F10D4257D8A3482009A9C042026D\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Hand it over to Raven so he could open the Gate!\"\nmsgstr \"\"\n\n#. Key:\t2845CBE64B1624C7EC4B81BC314B4F1B\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_27.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_27.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"The master gave Raven the ability to think and talk.\"\nmsgstr \"\"\n\n#. Key:\t29F405BF4233B5A8331B419747954425\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_77.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_77.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Why are you here?\"\nmsgstr \"\"\n\n#. Key:\t2B5FB92D4F98359F68AD58AB776FD9BA\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_9.SpeechSequence(1).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_9.SpeechSequence(1).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Seeking for knowledge, as always. And you? Never thought we’ll meet again. Still trying to take down these Realms forever?\"\nmsgstr \"\"\n\n#. Key:\t2B8CF34046D5486EB935CE919A1BD469\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_97.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_97.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"I'm new with all this wizard business thing. What was their conversation about?\"\nmsgstr \"\"\n\n#. Key:\t2C15668C26080F0A003A02E7BE7B5A65\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_8.SpeechSequence(1).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_8.SpeechSequence(1).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"It can happen again.\"\nmsgstr \"\"\n\n#. Key:\t2F226AC246B52387854AF5AFA09CEDD6\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_43.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_43.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"So we let those keys behind and set ourselves free from wizards?\"\nmsgstr \"\"\n\n#. Key:\t2FF7B3E84C009ECFDDE9F495092BEAA8\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_9.SpeechSequence(7).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_9.SpeechSequence(7).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"A pleasure to hear that. Talk to Raven about the details. Please excuse me for leaving so early, I have something important to do.\"\nmsgstr \"\"\n\n#. Key:\t305333F348E677D8C3553999F412C8B6\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_36.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_36.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven knows he has different tasks now, compared to what he used to do before.\"\nmsgstr \"\"\n\n#. Key:\t311A1E3745667AC6B4114D999B0E7C7F\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_83.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_83.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Go now! Raven still needs some more time to think about this.\"\nmsgstr \"\"\n\n#. Key:\t32F0018141E94BDE0921E9A54C1E4F20\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_1.SpeechSequence(0).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_1.SpeechSequence(0).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"They were always like this.\"\nmsgstr \"\"\n\n#. Key:\t34903F43484A4D6CE5735890AEEA294D\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_9.SpeechSequence(5).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_9.SpeechSequence(5).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"The Cerulean Gates are closed again. What if we share the work?\"\nmsgstr \"\"\n\n#. Key:\t350270814B961A20E48267A4B1AE0538\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Yes! The Gem is fully charged!\"\nmsgstr \"\"\n\n#. Key:\t361D80AB46AC47E5A233ECA2323222A2\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_86.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_86.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Why are you obeying that wizard of yours?\"\nmsgstr \"\"\n\n#. Key:\t365EDA2849D42A47D0D26DAC50DA6E94\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven is not that happy with those two, but Raven can accept that he is what he is.\"\nmsgstr \"\"\n\n#. Key:\t37C560AB4CCFAF4F8D26FAB1DE22453C\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_63.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_63.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Don't worry. You'll find some purpose.\"\nmsgstr \"\"\n\n#. Key:\t39DAB8B641C31878F7312FA7807D9DA0\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_6.SpeechSequence(3).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_6.SpeechSequence(3).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"The residents of the Realm did not have to work. Their spirit slaves did everything for them, they accomplished all their desires.\"\nmsgstr \"\"\n\n#. Key:\t3B63606F48193748243DE6AB18D7A68C\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_40.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_40.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven thinks you might want to be something else. Something that you used to be, but you are not anymore.\"\nmsgstr \"\"\n\n#. Key:\t3C332B1C4ADB3C16C005E8AAF76A09B1\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_109.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_109.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Except...\"\nmsgstr \"\"\n\n#. Key:\t3C9750814FC56947BDA7DFAF8A71DCC2\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_25.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_25.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"It is a long story and Raven doesn't really like to talk about it.\"\nmsgstr \"\"\n\n#. Key:\t3D10982D4A6FA88941F13F82413D17AC\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_20.Children(0).Children.Text\n#. Key:\t3E117EBB48C1CF091F456CA0FB78EDD7\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_77.Children(0).Children.Text\n#. Key:\t59F0F04941BB918E08743E8A7C3734B2\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_32.Children(6).Children.Text\n#. Key:\t6556945844ED44678075CE8796F00800\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_51.Children(0).Children.Text\n#. Key:\t7EC3944940792EC71B6A2F8674250649\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_49.Children(0).Children.Text\n#. Key:\tC6963EAE43B4D0FD3C8FBAA80A38E2A2\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_83.Children(1).Children.Text\n#. Key:\tE048FA684AA7B8DE0F7273992DA4600E\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_3.Children(4).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_20.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_3.Children(4).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_32.Children(6).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_49.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_51.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_77.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_83.Children(1).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Leave\"\nmsgstr \"\"\n\n#. Key:\t4417EE084F947AAF5D3285B086F741AC\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven is fine with talking. Ask me whatever you have on your mind!\"\nmsgstr \"\"\n\n#. Key:\t4485635A4832D9DC57240F8EF3323042\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Very nice! Raven likes that you are making progress.\"\nmsgstr \"\"\n\n#. Key:\t480718E34822FD682466E7B217249ED0\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_47.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_47.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Which is technically the same.\"\nmsgstr \"\"\n\n#. Key:\t48B67F42417A2930A4D200B958FDFB58\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_38.Children(3).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_38.Children(3).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"I'm confused\"\nmsgstr \"\"\n\n#. Key:\t49F0AC6A46EBF6C3148BC590CE56C297\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_10.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_10.Children(0).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Help\"\nmsgstr \"\"\n\n#. Key:\t4CB1CE8A4AEC18FA175BA98F831D3C3C\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_59.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_59.Children(0).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Farewell\"\nmsgstr \"\"\n\n#. Key:\t4D514A7D4CC96E3E79F464A6C0BF0C6E\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_2.SpeechSequence(4).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_2.SpeechSequence(4).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"What??\"\nmsgstr \"\"\n\n#. Key:\t4F8198D64A210B3A41EED8AA6AE64401\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_50.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_50.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven will just sit here for a short time before venturing into the Ruin.\"\nmsgstr \"\"\n\n#. Key:\t503CD5334EE86CFBEC2E7EA67F45ACD9\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"So you're meant to open this dusty little door with Raven, aren't you?\"\nmsgstr \"\"\n\n#. Key:\t512AEC2642B36D9DDF407EB447DF5A28\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_15.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_15.Children(1).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Let's have fun!\"\nmsgstr \"\"\n\n#. Key:\t5142E71B48C2E993CC8026919A3FDBD6\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_87.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_87.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Er... okey, I was just asking.\"\nmsgstr \"\"\n\n#. Key:\t518038644F25D09C9DA7FF984C272B77\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_40.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_40.Children(1).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"That's stupid\"\nmsgstr \"\"\n\n#. Key:\t53B5A1AC40CCF1CFBC106BA2BD8000E0\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_60.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_60.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Farewell, Raven!\"\nmsgstr \"\"\n\n#. Key:\t54C0F3A6493E6D0671D38DB16BD4BF51\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"I would like to know...\"\nmsgstr \"\"\n\n#. Key:\t55665725414633C111356D94939362FF\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_67.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_67.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Let's open that gate. Quick!\"\nmsgstr \"\"\n\n#. Key:\t565D7DA644ADF0E536C2FC8F99B735A3\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_3.Children(2).Children.Text\n#. Key:\t934A23AD44787C735FCDE79A34657C90\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_32.Children(3).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_3.Children(2).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_32.Children(3).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Why is he here?\"\nmsgstr \"\"\n\n#. Key:\t57BE04074884DB4CC54AC691E156F0FC\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_38.Children(2).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_38.Children(2).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Freedom\"\nmsgstr \"\"\n\n#. Key:\t5919EDBF4799413180AF569CB920E436\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_90.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_90.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"You can't live your life like in the old days any longer and that's why you're staying with your master, right?\"\nmsgstr \"\"\n\n#. Key:\t592D458F40571927D0BB549F3614420E\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_32.Children(5).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_32.Children(5).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"End of the World\"\nmsgstr \"\"\n\n#. Key:\t596065A34760461993AC339C51D9E402\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_73.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_73.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"First you will need to find the Gem. Meanwhile, Raven must figure it out how to open the Gate with it.\"\nmsgstr \"\"\n\n#. Key:\t599A90394B8AC7A26D20FEB355A873FB\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_98.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_98.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"What are you doing here?\"\nmsgstr \"\"\n\n#. Key:\t5A5D2F08427C4747F3EF529D6B73A21B\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Go on your search then! Unless you'd like to chat some more with Raven.\"\nmsgstr \"\"\n\n#. Key:\t5A63E364458C849C9B6FDD8491427051\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_8.SpeechSequence(5).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_8.SpeechSequence(5).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"But you could.\"\nmsgstr \"\"\n\n#. Key:\t5B07757F4CAAD674E09EBB835CEE230B\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_75.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_75.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"It must be somewhere close to the Arcade.\"\nmsgstr \"\"\n\n#. Key:\t5B9CDB4340B5E65E59D3A18283A84CA5\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_64.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_64.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven knows some people that'd be glad with that.\"\nmsgstr \"\"\n\n#. Key:\t5BA0645E49A62C0945FB64BDF689721F\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_112.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_112.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Is that where I will find your artefacts?\"\nmsgstr \"\"\n\n#. Key:\t5E70951F4E50B061FF2DA196F0207612\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_15.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_15.Children(0).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Save the world!\"\nmsgstr \"\"\n\n#. Key:\t5F810A7D417E5B02025F30B21FEA5F03\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_79.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_79.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Niiice!\"\nmsgstr \"\"\n\n#. Key:\t6441F8C2484FAA5219841C9D374F36C4\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_6.SpeechSequence(6).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_6.SpeechSequence(6).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"And now, even while we speak, their curse continues to spread.\"\nmsgstr \"\"\n\n#. Key:\t66A08695458FF9D46383F6A0AF609EFA\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_41.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_41.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"You are so hopeless...\"\nmsgstr \"\"\n\n#. Key:\t67EEF3DB42BA2C954AD566B4F95EBDB6\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_6.SpeechSequence(5).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_6.SpeechSequence(5).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Until one day the spirits broke loose and formed Ruin.\"\nmsgstr \"\"\n\n#. Key:\t68442CA14CECA9FB8A215EBEBC724F63\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Ask more from Raven if you like!\"\nmsgstr \"\"\n\n#. Key:\t694D416244358BD7DBED04A82390A146\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_51.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_51.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"One more,... and the Gem will be completed!\"\nmsgstr \"\"\n\n#. Key:\t6A463E0444754B73FE11988F07D5A58F\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_2.SpeechSequence(1).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_2.SpeechSequence(1).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"You just have to do it.\"\nmsgstr \"\"\n\n#. Key:\t6A92F010409301669F7B83AD7901A469\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"A strange creature, yet a familiar aura! Tell me, my dear Wizard, what happened to Tabby?\"\nmsgstr \"\"\n\n#. Key:\t6CC1259244D5FC82CA1C2EA314836741\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_1.SpeechSequence(1).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_1.SpeechSequence(1).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"They both accepted that there is a great threat in this realm.\"\nmsgstr \"\"\n\n#. Key:\t6FB7AF774662247E2001F9AAF34FF134\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_111.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_111.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Somewhere beyond that Gate there's a Portal. It will take you into the heart of the Realm.\"\nmsgstr \"\"\n\n#. Key:\t70A0BA47476A909013EFC0A574815B61\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_23.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_23.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"The Master and Raven are seeking knowledge about the Ruined Realm.\"\nmsgstr \"\"\n\n#. Key:\t70ECE1B74BA0B02F2F0850937BF4FB02\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_3.Children(3).Children.Text\n#. Key:\tE9F5916345156A4E5F29AC886B49B8AD\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_32.Children(4).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_3.Children(3).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_32.Children(4).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"About Ruin\"\nmsgstr \"\"\n\n#. Key:\t7311CA4B4D6B19C6C5C362AF522A9803\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_1.SpeechSequence(4).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_1.SpeechSequence(4).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Your master said he is done with that.\"\nmsgstr \"\"\n\n#. Key:\t74B8E0B44D4590E9970F4B9D09D3C4F9\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_6.SpeechSequence(1).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_6.SpeechSequence(1).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Long ago it was called the Runic Realm.\"\nmsgstr \"\"\n\n#. Key:\t76756B1C48E93E907CE32D83A2C56C3E\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_7.SpeechSequence(0).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_7.SpeechSequence(0).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven is really sorry but he can't help you anymore.\"\nmsgstr \"\"\n\n#. Key:\t78C7CE5948D176704CA69289BEEBFBA7\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_44.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_44.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"And what about the Realm of the wizards? They did not go mad yet, did they?\"\nmsgstr \"\"\n\n#. Key:\t7DFA4D494BD0536F925A94BBF7C71F36\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_66.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_66.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Focus on what you have to do and you will find the real you.\"\nmsgstr \"\"\n\n#. Key:\t81F437694DEE3D32A0FC29B90688E8B9\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_38.Children(4).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_38.Children(4).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"This is stupid\"\nmsgstr \"\"\n\n#. Key:\t82F473A04D250E98AD186185EBE95C04\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_5.SpeechSequence(0).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_5.SpeechSequence(0).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven thinks freedom is such an empty word.\"\nmsgstr \"\"\n\n#. Key:\t8688802A4303C53640C7BFAAA40226EC\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Almost there!\"\nmsgstr \"\"\n\n#. Key:\t8728C02E46E7B681D0A792ACAFC3237D\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_28.Children(2).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_28.Children(2).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"He accepted his fate\"\nmsgstr \"\"\n\n#. Key:\t8854653141FA36E731780F9111B82FAD\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_30.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_30.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"You are not listening to Raven's words!\"\nmsgstr \"\"\n\n#. Key:\t88FDA06B4A44ED1BF559D996E6AF7097\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_6.SpeechSequence(0).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_6.SpeechSequence(0).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Even so, Raven will tell you a bit.\"\nmsgstr \"\"\n\n#. Key:\t8BA584404F2713EE39D74284F829C50A\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"You know what? Raven totally agrees with that!\"\nmsgstr \"\"\n\n#. Key:\t8C272FBE47796CF8101D07AAD033C24B\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_62.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_62.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"The later we met the more time the World survived, didn't it?\"\nmsgstr \"\"\n\n#. Key:\t8DD39A3D497411B348B883972CE6B442\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_6.SpeechSequence(7).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_6.SpeechSequence(7).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"At first, lands lose their colours, people go mad... and then, everything breaks into shards until solely hollowness remains...\"\nmsgstr \"\"\n\n#. Key:\t8E02961D428949EE8176639F6AE84DD9\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_107.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_107.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"If the end is near, there is no point in making long term plans.\"\nmsgstr \"\"\n\n#. Key:\t8EB8F2654B9C18135CBEB49D10485417\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_37.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_37.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"We all have a purpose in life.\"\nmsgstr \"\"\n\n#. Key:\t9131DE4C434AD9B22C7B1BAA588AF694\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_9.SpeechSequence(3).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_9.SpeechSequence(3).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Private business? All right! We might have different motivations, however working together could be fruitful.\"\nmsgstr \"\"\n\n#. Key:\t91947E4046F96E9330EA5A94C367E2C5\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Forget it, I'm on my way now.\"\nmsgstr \"\"\n\n#. Key:\t91BE2C7248B2BEBE1C376B989935E353\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"What else should Raven tell you?\"\nmsgstr \"\"\n\n#. Key:\t929558D0465B0884C4E373A602CCE9E5\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_59.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_59.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Farewell compeer until you meet Raven again!\"\nmsgstr \"\"\n\n#. Key:\t930942934A83107D86DB69A2C2EF11E0\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_117.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_117.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"The task is of high complexity.\"\nmsgstr \"\"\n\n#. Key:\t93AFC24842A793D2BF7B43A64B6972AF\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_32.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_32.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Is there anything else for Raven?\"\nmsgstr \"\"\n\n#. Key:\t9A9D5DA346251040AF73B7B100E1EBC9\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_35.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_35.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven used to like being a bird, but now he has no other choice. He must embrace what he became.\"\nmsgstr \"\"\n\n#. Key:\t9B558C3045D4501AEAF3DD8694E2198F\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_105.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_105.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"We'd rather have some fun before it's all over.\"\nmsgstr \"\"\n\n#. Key:\t9E598A384E301BCD345ABFB0C1312C12\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_78.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_78.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Krrr... Raven notices that you've found the Gem!\"\nmsgstr \"\"\n\n#. Key:\t9FAD3A1A4E3EFE33C1CAB8BAAC8190D1\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_26.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_26.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Let Raven tell you something:\"\nmsgstr \"\"\n\n#. Key:\tA10F960549BD21AFAD4819BD5C74E651\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_2.SpeechSequence(5).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_2.SpeechSequence(5).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Nevermind. Raven is kidding.\"\nmsgstr \"\"\n\n#. Key:\tA4294A174F9EA54E0149839A84CE2B94\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_15.Children(2).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_15.Children(2).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Hopeless...\"\nmsgstr \"\"\n\n#. Key:\tA59406E8411939F96004EAA9D5707E08\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_28.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_28.Children(1).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"What?\"\nmsgstr \"\"\n\n#. Key:\tA5993D8047CDD35BA31D318832EB9C66\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_32.Children(2).Children.Text\n#. Key:\tB7AE6BEC4CA905BDED5990BFF4D0C93D\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_3.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_3.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_32.Children(2).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"About wizards\"\nmsgstr \"\"\n\n#. Key:\tA59A76814D8EAF5907CBC68AA63FE33F\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_2.SpeechSequence(3).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_2.SpeechSequence(3).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"How can I know that if you don't do it?\"\nmsgstr \"\"\n\n#. Key:\tA7C7D1EC45A072755BAAB099DB359290\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_55.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_55.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"They don't believe that Ruin can affect their World. They say that it has no effect.\"\nmsgstr \"\"\n\n#. Key:\tA7D99136490D40CB08BA66A72192D6C0\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_7.SpeechSequence(2).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_7.SpeechSequence(2).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Go now! Raven needs to think.\"\nmsgstr \"\"\n\n#. Key:\tA80B626C41713C6E42E4DF8696FF842D\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_8.SpeechSequence(0).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_8.SpeechSequence(0).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"You were a bird once. Then you became something else.\"\nmsgstr \"\"\n\n#. Key:\tA8D429384EFE74E30720149A1C53ADE9\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_38.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_38.Children(0).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Don't know\"\nmsgstr \"\"\n\n#. Key:\tA9A73720489C122A81B84CBA262C329E\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_38.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_38.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven knows what his task is. Do you know yours?\"\nmsgstr \"\"\n\n#. Key:\tAB41A75C432BEBDC81D63282FCC15F98\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_5.SpeechSequence(2).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_5.SpeechSequence(2).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Got it? Free like a bird! Ha-ha-ha!\"\nmsgstr \"\"\n\n#. Key:\tAC52327249DB335CBAB9EDA6A3F4769E\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_31.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_31.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven is doing this because this is what he is.\"\nmsgstr \"\"\n\n#. Key:\tB2003CEE44335B30B9F85487521B7679\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_54.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_54.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Maybe.\"\nmsgstr \"\"\n\n#. Key:\tB31EEC6247CDEF73BB4E5B84E2B66575\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_9.SpeechSequence(2).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_9.SpeechSequence(2).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"That’s over now. This time it's for private business.\"\nmsgstr \"\"\n\n#. Key:\tB3DD59C44422BA99C839FCAE63F05B9A\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_93.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_93.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"I want to be free again!\"\nmsgstr \"\"\n\n#. Key:\tB789219A48C2A835F2DA4CA24064E1D3\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_92.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_92.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"I would like to go home.\"\nmsgstr \"\"\n\n#. Key:\tB7D4201F41E5F018EFD49EAF52E443A8\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_76.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_76.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"You still haven't found the Gem.\"\nmsgstr \"\"\n\n#. Key:\tB7EC6E4F4EDC448FD264999938414F3C\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Let's talk about something else!\"\nmsgstr \"\"\n\n#. Key:\tB8BF08674C9E2FD0515998B95A1EA7CF\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_7.SpeechSequence(1).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_7.SpeechSequence(1).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"If you can't fulfill your task, then maybe your master should look for a better servant.\"\nmsgstr \"\"\n\n#. Key:\tBD775EF74E334A4DEFA67BBF9034500E\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_84.Text\n#. Key:\tFA3FEF444FD2A3500FCCE98FAEAE923E\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_42.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_42.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_84.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Yes?\"\nmsgstr \"\"\n\n#. Key:\tBE2B9D7A45C2D43FF4C0BAAA284CBB97\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"No thanks! I'm on my way now.\"\nmsgstr \"\"\n\n#. Key:\tC04CC9334FC3C2522793C2B97CC165D8\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_108.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_108.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"The gate is open!\"\nmsgstr \"\"\n\n#. Key:\tC0F2E4744D724A3D6A0DEF914C294CE1\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_38.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_38.Children(1).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Go home\"\nmsgstr \"\"\n\n#. Key:\tC10018654B64193BBFF439B54EF02FB1\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"So why not open the gate?\"\nmsgstr \"\"\n\n#. Key:\tC18E2FB345BE76B6F51C71A2B6453316\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_99.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_99.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"What can you tell me about the Ruined Realm?\"\nmsgstr \"\"\n\n#. Key:\tC19082D247C23A21B632968FE6A644D1\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_8.SpeechSequence(3).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_8.SpeechSequence(3).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"You failed to see the meaning behind Raven's thoughts.\"\nmsgstr \"\"\n\n#. Key:\tC2DC44084098DD604B757A8A47AAC4FE\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_58.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_58.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"We'll see.\"\nmsgstr \"\"\n\n#. Key:\tC53F5E0F46BBE7A1FD00EABD6E14848D\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_33.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_33.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Maybe you are wiser than Raven, but that's just a thought, little spirit.\"\nmsgstr \"\"\n\n#. Key:\tC78588B64D12FFBE97C47AB7C046C14E\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_1.SpeechSequence(5).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_1.SpeechSequence(5).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven doesn't believe it's true.\"\nmsgstr \"\"\n\n#. Key:\tC7F7F71F4FE0D19BDF86188BEFDDEEB1\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_5.SpeechSequence(1).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_5.SpeechSequence(1).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Just look at Raven! He's free like a bird.\"\nmsgstr \"\"\n\n#. Key:\tC82BE6E448D7C98D361CA1890FEE3B2C\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_9.SpeechSequence(6).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_9.SpeechSequence(6).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"I’m in.\"\nmsgstr \"\"\n\n#. Key:\tCD1A68EF460B0C63C95340AC2076EBAF\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven notices that the gem is just as dull as before. Why did you return then?\"\nmsgstr \"\"\n\n#. Key:\tD3C84C884903F7FB53695AAE253C7982\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_40.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_40.Children(0).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Agree\"\nmsgstr \"\"\n\n#. Key:\tD438ABB348A399ACB18DFD8F320CC7BB\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_57.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_57.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"And what's the truth?\"\nmsgstr \"\"\n\n#. Key:\tD5DF32814FA17D7ED28BF0A91027A6E8\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_110.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_110.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Finally! From now on you won't need Raven anymore.\"\nmsgstr \"\"\n\n#. Key:\tD6A649B2453BCBAD95A16FA481664133\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_49.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_49.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Find the other Chargers and return to Raven when you are done.\"\nmsgstr \"\"\n\n#. Key:\tD9959CF1439812F5615A38B9369F6E16\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_71.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_71.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven notices that you already have the Gem.\"\nmsgstr \"\"\n\n#. Key:\tD9A4F3D54EF460C09B2A6C9B8EB87D7C\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_32.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_32.Children(1).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"About my purpose...\"\nmsgstr \"\"\n\n#. Key:\tD9C6F8C14BC9C0BD83715E96DE5B7161\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_28.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_28.Children(0).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"He is a volunteer\"\nmsgstr \"\"\n\n#. Key:\tDC7CA6DF4D684A7C2DBA739F404ABC36\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_94.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_94.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"I don't know what to do. I can't remember anything from my previous life.\"\nmsgstr \"\"\n\n#. Key:\tDD8E05E541C32F05357D888FB6963FF0\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_114.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_114.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"All right, I go then.\"\nmsgstr \"\"\n\n#. Key:\tDE3A0B8047C9980B6DED0BA39C777539\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_28.Children(3).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_28.Children(3).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Not interested\"\nmsgstr \"\"\n\n#. Key:\tDF86F9C84CF207616E931098F3C833D3\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"To activate the locking mechanism we need an infused Lock Gem.\"\nmsgstr \"\"\n\n#. Key:\tE0105C1845AF9211960E869AB234ED9A\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_89.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_89.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"So you are obeying because... that's the only thing that you can do?\"\nmsgstr \"\"\n\n#. Key:\tE17598BB49D7E4083AD4AEA2DDFE293D\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_106.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_106.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"It would make sense to try to save the world, wouldn't it?\"\nmsgstr \"\"\n\n#. Key:\tE1CFA5A44F4EF59527528DB6018ACF33\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_8.SpeechSequence(6).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_8.SpeechSequence(6).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven doesn't care about what he could do. Raven cares about what he does.\"\nmsgstr \"\"\n\n#. Key:\tE6FA584E454BC3943C927EADAEBA88C4\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_6.SpeechSequence(8).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_6.SpeechSequence(8).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"That's not too reassuring...\"\nmsgstr \"\"\n\n#. Key:\tE9D9EC1F450276CF11B259978062AB7E\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_96.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_96.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"We shouldn't waste any more time on this.\"\nmsgstr \"\"\n\n#. Key:\tEC19AF0E4F2F4B488373FFBEDC272321\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_56.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_56.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Except for a few paranoid ones, like your master.\"\nmsgstr \"\"\n\n#. Key:\tEFC8B9984D9F4A9ACC9AE580E271E810\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_39.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_39.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Searching for a way to open this gate with the help of a talking Ball is so much fun!\"\nmsgstr \"\"\n\n#. Key:\tEFCE20A646FA62188BE7EB85D6708843\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_115.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_115.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven will venture deeper into the Ruined Realm!\"\nmsgstr \"\"\n\n#. Key:\tF0B00A30413914D09CA4488578B2FD7C\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_24.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_24.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven agrees.\"\nmsgstr \"\"\n\n#. Key:\tF40AD31D4177DCB7BB138C9C139FB1A1\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_61.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_61.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"I hope that won't be too soon...\"\nmsgstr \"\"\n\n#. Key:\tF4F8CBCD421083EDBF626AA47DEF4B50\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_88.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_88.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Do you mean that you are serving your wizard by your own will?\"\nmsgstr \"\"\n\n#. Key:\tF5A7836549DF56B89620A386E7CCF708\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_48.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_48.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"But there is still so much left to do...\"\nmsgstr \"\"\n\n#. Key:\tF8361ECC401E740DEBF87FAE2A419EC8\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_32.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_32.Children(0).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven Servant?\"\nmsgstr \"\"\n\n#. Key:\tFA5F957341772B0C4AFA33B1311CF7B4\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_69.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_69.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Except if we meet in the Afterworld.\"\nmsgstr \"\"\n\n#. Key:\tFA94A8EF4F8BF5EA422D27A9A205D866\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_3.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_3.Children(0).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven servant?\"\nmsgstr \"\"\n\n#. Key:\tFC0798A648BFC0E9BA70D6B20A46F447\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_1.SpeechSequence(2).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_1.SpeechSequence(2).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Your master seeks to stop it no matter the price he has to pay.\"\nmsgstr \"\"\n\n#. Key:\tFCE7049641D2A70FC6B9E5B174919A64\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_9.SpeechSequence(0).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_9.SpeechSequence(0).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Tabby has retired. What did you come for?\"\nmsgstr \"\"\n\n#. Key:\tFD68B18A435050A137D8F0948F24E2DC\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Why are we messing with this door if the World is about to end?\"\nmsgstr \"\"\n\n#. Key:\tFF3D9FCF4A840A8155A8D7AD9CC22F2D\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Obey? Raven doesn't obey.\"\nmsgstr \"\"\n\n#. Key:\tFFB203D94B0A5C22BA29B68A1A8A740F\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_9.SpeechSequence(8).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_9.SpeechSequence(8).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Farewell then.\"\nmsgstr \"\"\n\n#. Key:\t0C459FB64505D02011822A9EDFA8FCA4\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/AGStatue.AGStatue:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/AGStatue.AGStatue:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_AGStatue\"\nmsgid \"'We are the elite of the Runic Realm. Our wisdom is great, our magic is strong.'\"\nmsgstr \"\"\n\n#. Key:\t7DB580C64E9B33FD525DDF986BD5E4A4\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/AGStatue.AGStatue:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/AGStatue.AGStatue:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_AGStatue\"\nmsgid \"Looks like he was wrong...\"\nmsgstr \"\"\n\n#. Key:\tAFBD86084D8E6EBDF240998FA98D184D\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/AGStatue.AGStatue:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/AGStatue.AGStatue:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_AGStatue\"\nmsgid \"'We are Ceruleans! We do not escape!'\"\nmsgstr \"\"\n\n#. Key:\tC2CC8EE94954A8DC42222FBB28A7656E\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/AGStatue.AGStatue:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/AGStatue.AGStatue:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_AGStatue\"\nmsgid \"'Citizens of Cerulean! Do not join the poor of Grey Gate!'\"\nmsgstr \"\"\n\n#. Key:\tD909E4A34387B448378464BDE8292B4D\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/AGStatue.AGStatue:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/AGStatue.AGStatue:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_AGStatue\"\nmsgid \"'Ruin can’t harm us!'\"\nmsgstr \"\"\n\n#. Key:\t3CE243AA4AFB12B37239608C66537764\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/BeforeBoss.BeforeBoss:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/BeforeBoss.BeforeBoss:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_BeforeBoss\"\nmsgid \"Maybe you should talk to the gnome or the Keeper.\"\nmsgstr \"\"\n\n#. Key:\t4F35F4834FBCC04C218A879123EF8706\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/BeforeBoss.BeforeBoss:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/BeforeBoss.BeforeBoss:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_BeforeBoss\"\nmsgid \"Using the portals here one could get into any part of the World in no time.\"\nmsgstr \"\"\n\n#. Key:\t62EDCB724DAC5317C72B99AEB9904F4E\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/BeforeBoss.BeforeBoss:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/BeforeBoss.BeforeBoss:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_BeforeBoss\"\nmsgid \"This place was the base of the formal Ruined Realm.\"\nmsgstr \"\"\n\n#. Key:\tCB8B47F74583A48529A353B97C4909B9\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/BeforeBoss.BeforeBoss:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/BeforeBoss.BeforeBoss:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_BeforeBoss\"\nmsgid \"I hope at least some of the portals still work.\"\nmsgstr \"\"\n\n#. Key:\t2A9CE8714E7E1ABC9365E5A1E2CE2EC8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/BossArmourWrath.BossArmourWrath:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Chapter2/BossArmourWrath.BossArmourWrath:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_BossArmourWrath\"\nmsgid \"Keep away from my artefact little thief or I will crush you!\"\nmsgstr \"\"\n\n#. Key:\t3F79029C410F4CC3B41548A26A7D69EB\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/BossArmourWrath.BossArmourWrath:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Chapter2/BossArmourWrath.BossArmourWrath:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_BossArmourWrath\"\nmsgid \"Listen, I really need that. What if I give you something instead?\"\nmsgstr \"\"\n\n#. Key:\t451F1E844E29E674899BD3BEFBC17380\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/BossArmourWrath.BossArmourWrath:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter2/BossArmourWrath.BossArmourWrath:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_BossArmourWrath\"\nmsgid \"I’m here for the artefact... could you give it to me?\"\nmsgstr \"\"\n\n#. Key:\tAC11C22040909F7F4DD1518AD5C14AFA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/BossArmourWrath.BossArmourWrath:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Chapter2/BossArmourWrath.BossArmourWrath:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_BossArmourWrath\"\nmsgid \"That is mine!\"\nmsgstr \"\"\n\n#. Key:\tD30E184A406B5B1EFB87F3845CE82664\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/BossArmourWrath.BossArmourWrath:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter2/BossArmourWrath.BossArmourWrath:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_BossArmourWrath\"\nmsgid \"Have you come to worship my perfection?\"\nmsgstr \"\"\n\n#. Key:\tF626219F434EECD05727BC9FAB5CEB76\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/BossArmourWrath.BossArmourWrath:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Chapter2/BossArmourWrath.BossArmourWrath:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_BossArmourWrath\"\nmsgid \"Damn you and your perfection!\"\nmsgstr \"\"\n\n#. Key:\t2892C4AB4DACCAF48565619948DCA122\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/BossDwarvenStatue.BossDwarvenStatue:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter2/BossDwarvenStatue.BossDwarvenStatue:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_BossDwarvenStatue\"\nmsgid \"I am all right! I am still keeping it back!\"\nmsgstr \"\"\n\n#. Key:\t378D26B144B4B17F23F788B56F714118\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/BossDwarvenStatue.BossDwarvenStatue:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Chapter2/BossDwarvenStatue.BossDwarvenStatue:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_BossDwarvenStatue\"\nmsgid \"I am looking for an artefact...\"\nmsgstr \"\"\n\n#. Key:\t3956257F405EC80CE4547FBE57C53A11\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/BossDwarvenStatue.BossDwarvenStatue:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Chapter2/BossDwarvenStatue.BossDwarvenStatue:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_BossDwarvenStatue\"\nmsgid \"Do you...\"\nmsgstr \"\"\n\n#. Key:\t946CFCCE4CA505C7C4039A9FF196A35C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/BossDwarvenStatue.BossDwarvenStatue:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter2/BossDwarvenStatue.BossDwarvenStatue:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_BossDwarvenStatue\"\nmsgid \"Have the sculptors sent you?\"\nmsgstr \"\"\n\n#. Key:\tA30FB80548251020E4AD859A928AB6B5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/BossDwarvenStatue.BossDwarvenStatue:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Chapter2/BossDwarvenStatue.BossDwarvenStatue:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_BossDwarvenStatue\"\nmsgid \"Go away! I hold it back!\"\nmsgstr \"\"\n\n#. Key:\tAC5220964331387202C55584104246C2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/BossDwarvenStatue.BossDwarvenStatue:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Chapter2/BossDwarvenStatue.BossDwarvenStatue:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_BossDwarvenStatue\"\nmsgid \"I have a bad feeling about this...\"\nmsgstr \"\"\n\n#. Key:\tE05C384043C6F8407BDA2D97A1D64F96\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/BossDwarvenStatue.BossDwarvenStatue:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Chapter2/BossDwarvenStatue.BossDwarvenStatue:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_BossDwarvenStatue\"\nmsgid \"He has one of the artefacts. You need to get it somehow.\"\nmsgstr \"\"\n\n#. Key:\tF9B8F4E9413785B5F59DD88CBF8D56CC\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/BossDwarvenStatue.BossDwarvenStatue:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Chapter2/BossDwarvenStatue.BossDwarvenStatue:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_BossDwarvenStatue\"\nmsgid \"Don’t come any closer! I’m still fine!\"\nmsgstr \"\"\n\n#. Key:\t49D7B5DA484C712573AE84B3A2609541\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/BossFallenDruid.BossFallenDruid:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Chapter2/BossFallenDruid.BossFallenDruid:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_BossFallenDruid\"\nmsgid \"You will never lay your hand on anything in this place!\"\nmsgstr \"\"\n\n#. Key:\t9642DD9241E67544571A5EABA9EBC42B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/BossFallenDruid.BossFallenDruid:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter2/BossFallenDruid.BossFallenDruid:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_BossFallenDruid\"\nmsgid \"Actually I’m about to leave but I need the artefact first.\"\nmsgstr \"\"\n\n#. Key:\t9A2BE08D4010C4D2425F96BA17A60936\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/BossFallenDruid.BossFallenDruid:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Chapter2/BossFallenDruid.BossFallenDruid:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_BossFallenDruid\"\nmsgid \"I shall purge my forest from your kind! To hell with you creature!\"\nmsgstr \"\"\n\n#. Key:\tFC4A1C9748C31BD2AA2E4F93E5D56AF8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/BossFallenDruid.BossFallenDruid:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter2/BossFallenDruid.BossFallenDruid:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_BossFallenDruid\"\nmsgid \"Stay away from my sacred forests creature of Ruin!\"\nmsgstr \"\"\n\n#. Key:\t3F4302BF46D1F9EA241446A796CE6AA5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Fishy.C3Fishy:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter3/C3Fishy.C3Fishy:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_C3Fishy\"\nmsgid \"Fishy will miss home.\"\nmsgstr \"\"\n\n#. Key:\t52063C724F858E16B1E9B482E064B3FC\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Fishy.C3Fishy:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/Chapter3/C3Fishy.C3Fishy:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_C3Fishy\"\nmsgid \"Raven will try to take us into the Human Realm.\"\nmsgstr \"\"\n\n#. Key:\tBC79FC4E44CCD0BE44BAAAA5ED304C9D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3GateKeeper.C3GateKeeper:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Chapter3/C3GateKeeper.C3GateKeeper:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_C3GateKeeper\"\nmsgid \"I hope you will find us Worthy.\"\nmsgstr \"\"\n\n#. Key:\tDD8DEA6B4E1D6AABEB6B0483614A41BB\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3GateKeeper.C3GateKeeper:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter3/C3GateKeeper.C3GateKeeper:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_C3GateKeeper\"\nmsgid \"Welcome, my young Lord!\"\nmsgstr \"\"\n\n#. Key:\tFCC28D1C4A19B1964301B388625A722F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3GateKeeper.C3GateKeeper:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter3/C3GateKeeper.C3GateKeeper:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_C3GateKeeper\"\nmsgid \"I heard this time you shall open a Gate for us.\"\nmsgstr \"\"\n\n#. Key:\t1F96C2364594513AB8DF00A8C11ADB2C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Gnory.C3Gnory:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Chapter3/C3Gnory.C3Gnory:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_C3Gnory\"\nmsgid \"I don’t want anything bad for business in the new Realm.\"\nmsgstr \"\"\n\n#. Key:\t24FA4B6840C3EEF0A9D418AED7C900A5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Gnory.C3Gnory:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/Chapter3/C3Gnory.C3Gnory:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_C3Gnory\"\nmsgid \"Eh, you again?\"\nmsgstr \"\"\n\n#. Key:\t5CA8478D46ED1ADF6F0B5E82F1035ADE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Gnory.C3Gnory:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter3/C3Gnory.C3Gnory:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_C3Gnory\"\nmsgid \"A whole new World awaits for me and my shop.\"\nmsgstr \"\"\n\n#. Key:\tA406AFAD47000D9338C978B2EB16A86F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Gnory.C3Gnory:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Chapter3/C3Gnory.C3Gnory:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_C3Gnory\"\nmsgid \"If you can arrange it I would be more happy if we could leave Lory here.\"\nmsgstr \"\"\n\n#. Key:\tBA4D0C244931E6431FA17CA2257BDDE1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Gnory.C3Gnory:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter3/C3Gnory.C3Gnory:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_C3Gnory\"\nmsgid \"What a new opportunity! I don’t care about dwarves anymore.\"\nmsgstr \"\"\n\n#. Key:\t071AC5EE4AC65F5BE3CB61B64DE9E7FE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3GolemMaker.C3GolemMaker:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter3/C3GolemMaker.C3GolemMaker:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_C3GolemMaker\"\nmsgid \"I have to admit Ruin will win in the end.\"\nmsgstr \"\"\n\n#. Key:\t18398E3A4C6E72AAE25F24A14596ECD8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3GolemMaker.C3GolemMaker:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter3/C3GolemMaker.C3GolemMaker:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_C3GolemMaker\"\nmsgid \"I fought Ruin for hundreds of years.\"\nmsgstr \"\"\n\n#. Key:\t7800D3B64054BCE4A89E8E8E6265776B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3GolemMaker.C3GolemMaker:DlgNode_Speech_117.Text\n#: /Game/SO/Dialogues/Chapter3/C3GolemMaker.C3GolemMaker:DlgNode_Speech_117.Text\nmsgctxt \"Dialogue_C3GolemMaker\"\nmsgid \"I have a bad feeling about this all...\"\nmsgstr \"\"\n\n#. Key:\t334B64FA460A74FD99B4F3B9E4BE9E5A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3KoboldChef.C3KoboldChef:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter3/C3KoboldChef.C3KoboldChef:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_C3KoboldChef\"\nmsgid \"So it will be ready anytime now.\"\nmsgstr \"\"\n\n#. Key:\t5B8874F14160F55182A93EBCF5680173\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3KoboldChef.C3KoboldChef:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter3/C3KoboldChef.C3KoboldChef:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_C3KoboldChef\"\nmsgid \"According to the recipe I need to swirl the ingredients until the end of the World.\"\nmsgstr \"\"\n\n#. Key:\t7DB6ED344E211B7A028C27BFB72750B1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3KoboldChef.C3KoboldChef:DlgNode_Speech_33.Text\n#: /Game/SO/Dialogues/Chapter3/C3KoboldChef.C3KoboldChef:DlgNode_Speech_33.Text\nmsgctxt \"Dialogue_C3KoboldChef\"\nmsgid \"This is a special soup.\"\nmsgstr \"\"\n\n#. Key:\t7D583DB14783DCF7EEE294920F9A1D61\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Lory.C3Lory:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Chapter3/C3Lory.C3Lory:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_C3Lory\"\nmsgid \"Without paying a single gold coin. How sad.\"\nmsgstr \"\"\n\n#. Key:\t8A26C9B24B810A94FED159B0D69D70D6\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Lory.C3Lory:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter3/C3Lory.C3Lory:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_C3Lory\"\nmsgid \"Hi, my dear Ball!\"\nmsgstr \"\"\n\n#. Key:\t8CF637DC4D66B9BFBE098DA3EA434F27\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Lory.C3Lory:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/Chapter3/C3Lory.C3Lory:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_C3Lory\"\nmsgid \"Unfortunately I can't give you anything in return.\"\nmsgstr \"\"\n\n#. Key:\t90A13FAC4AA90E98DBEFFA9BB8DEDE80\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Lory.C3Lory:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Chapter3/C3Lory.C3Lory:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_C3Lory\"\nmsgid \"Oh, thank you! Books always matter.\"\nmsgstr \"\"\n\n#. Key:\t9C6E843645F86F1E39E6458952C7F283\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Lory.C3Lory:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Chapter3/C3Lory.C3Lory:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_C3Lory\"\nmsgid \"I hope I can open a new shop in the Human Realm.\"\nmsgstr \"\"\n\n#. Key:\tAE354F2C458C144C2825028174F91CCE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Lory.C3Lory:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Chapter3/C3Lory.C3Lory:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_C3Lory\"\nmsgid \"I don't know if it still matters but I have these books for you.\"\nmsgstr \"\"\n\n#. Key:\tB5BCB95E43DB3854273F6AAA4067FC55\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Lory.C3Lory:DlgNode_Speech_42.Text\n#: /Game/SO/Dialogues/Chapter3/C3Lory.C3Lory:DlgNode_Speech_42.Text\nmsgctxt \"Dialogue_C3Lory\"\nmsgid \"Unfortunately I have nothing at the store right now. Ha-ha...\"\nmsgstr \"\"\n\n#. Key:\tC0E84ACD40CB002E0C30A289E0554EE9\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Lory.C3Lory:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/Chapter3/C3Lory.C3Lory:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_C3Lory\"\nmsgid \"No problem.\"\nmsgstr \"\"\n\n#. Key:\tFEFF93C84CC75D277EC221AD22338A75\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Lory.C3Lory:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter3/C3Lory.C3Lory:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_C3Lory\"\nmsgid \"Ruin took all my wares.\"\nmsgstr \"\"\n\n#. Key:\t090F12534A0096B8D4D7D9A5CDC9B3B5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_25.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_25.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Well I guess you don’t have many customer.\"\nmsgstr \"\"\n\n#. Key:\t10A1CF314EC02954FF38F1989C61DEE9\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"That’s only one man! I need three!\"\nmsgstr \"\"\n\n#. Key:\t127DE2E049C91112F814C69348954F99\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_7.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_7.Children(1).Children.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Buy name\"\nmsgstr \"\"\n\n#. Key:\t1AF2DDE74542524EEF19CA9567CFBDAF\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_58.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_58.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"{name}? It still sounds a bit weird, but I think I might like it.\"\nmsgstr \"\"\n\n#. Key:\t1C411E31405F157B2465229ECE66F4E0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_31.Children(2).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_31.Children(2).Children.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Wanderer\"\nmsgstr \"\"\n\n#. Key:\t1ED747BD43E40D4096809696951517EE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"A special offer for ya! Give me three Blue Gems and I’ll give ya the key!\"\nmsgstr \"\"\n\n#. Key:\t20B146B94D2E2FCE5E0C48BC64F7A1D6\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_19.Text\n#. Key:\t41E21D044B53E16C1BA8D7B720D84B50\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_36.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_36.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Sure man!\"\nmsgstr \"\"\n\n#. Key:\t2BDF52EF43CA5FBB145EC1BA0014FC27\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_7.Children(3).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_7.Children(3).Children.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Who are you?\"\nmsgstr \"\"\n\n#. Key:\t2DF772F14AAA9780F4D9E397DE723665\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_32.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_32.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Fearsome! At least for what you will destroy.\"\nmsgstr \"\"\n\n#. Key:\t312F26294ECE4F618D88BE84DE7A2F9A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_31.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_31.Children(1).Children.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Destroyer\"\nmsgstr \"\"\n\n#. Key:\t328C9911427AA19B40B297ACC9D16447\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_31.Children(3).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_31.Children(3).Children.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Don't buy\"\nmsgstr \"\"\n\n#. Key:\t32D3F53746DD2801BC1B04AF1C1753DD\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Don’t turn around I’m talking to ya big guy! Down here on the wood!\"\nmsgstr \"\"\n\n#. Key:\t576A3CE049331518C8D1F196E6CC382C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Back on topic: will ya buy something?\"\nmsgstr \"\"\n\n#. Key:\t5C1E07DF4B2D135102D6B09D3A04A726\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"C’mon man! Don’t just stand there tell me what ya want!\"\nmsgstr \"\"\n\n#. Key:\t62AA5DD54A8447F7A277B194B05FB74D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_23.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_23.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"What’s wrong with ya man?\"\nmsgstr \"\"\n\n#. Key:\t6E13F5544C66EDB0CFE764A0F52269E1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_27.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_27.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"You know transporting breadcrumbs, marching onto various directions, the usual things.\"\nmsgstr \"\"\n\n#. Key:\t6F3C17894E694FC6215871B167087908\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_24.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_24.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"I’m Merch Ant doin’ Microtransactions. I’ve just told ya.\"\nmsgstr \"\"\n\n#. Key:\t7169B2FA40F5F5F328D2A6B9D53D58C8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_7.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_7.Children(0).Children.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Trade\"\nmsgstr \"\"\n\n#. Key:\t7B41C105431C54F2FDDEA6AA9A0E1C1A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Er... so who are you and what are you doing here?\"\nmsgstr \"\"\n\n#. Key:\t8718A8F54D5722F666D83F8067476622\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"There is an iron door which blocks the path to the tower. Do you have something which opens it?\"\nmsgstr \"\"\n\n#. Key:\t889B39EC4BC170A2BF493380947116A7\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Sure man! Microtransactions always work!\"\nmsgstr \"\"\n\n#. Key:\t9157AE9644A4A3B2C97F7482932160D2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"No man, we agreed on three!\"\nmsgstr \"\"\n\n#. Key:\t9283F6B1447C6992FE355289F3337472\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_7.Children(2).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_7.Children(2).Children.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Gate\"\nmsgstr \"\"\n\n#. Key:\t99C44AA849A384C7941D3DAE1D6A3EFF\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Here is your Gem!\"\nmsgstr \"\"\n\n#. Key:\t9CA7941F42ABFAE5660895AF886CD62C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_31.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_31.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Sure man! I have some really cool ones for sale!\"\nmsgstr \"\"\n\n#. Key:\tA3C6B03E404B1C039EF1C98C8E28AE22\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Show me what you've got for sale!\"\nmsgstr \"\"\n\n#. Key:\tABE279924E0641DA18E9708F35F4500A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_29.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_29.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"I’ve got to go.\"\nmsgstr \"\"\n\n#. Key:\tAF1FECDB402777D850B819B934DF851D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_34.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_34.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Ah, never mind, here you go!\"\nmsgstr \"\"\n\n#. Key:\tB19FA067432CE0273A3652AA9A32F2DF\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Don’t be surprised!\"\nmsgstr \"\"\n\n#. Key:\tB5F8E17E4712A37EF1C227AA7E99DBC8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Aren’t two Gems enough for you?\"\nmsgstr \"\"\n\n#. Key:\tBC5DEE9E4D39238451D1A2B9F8B20815\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_26.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_26.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Okey, okey! I have to admit I also do some regular ant work from time to time.\"\nmsgstr \"\"\n\n#. Key:\tBD7096344553E098E4A29787E1386B4A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Are you sure the key works?\"\nmsgstr \"\"\n\n#. Key:\tC6A384624B53D808D62CB885A6573150\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Was nice to deal with ya!\"\nmsgstr \"\"\n\n#. Key:\tC737154043396F726CF6B2814991B38D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_35.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_35.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"I've changed my mind. I'm fine with my current name.\"\nmsgstr \"\"\n\n#. Key:\tC94F33504E68364DE1BAA48FC0CA85E5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_7.Children(5).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_7.Children(5).Children.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Leave\"\nmsgstr \"\"\n\n#. Key:\tCDA5A0164F5FDD87D0F4C0B10A5ED5DA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"I did my part. Give me the key!\"\nmsgstr \"\"\n\n#. Key:\tD1B1D33742EAA6A9BCDC42B5EA72EB59\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_31.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_31.Children(0).Children.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Saviour\"\nmsgstr \"\"\n\n#. Key:\tD1E444764EDA1457DD7427A0EA75C65F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_7.Children(4).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_7.Children(4).Children.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Blue Gem\"\nmsgstr \"\"\n\n#. Key:\tD65AD8854E1A5BC2D37C208357BACDE3\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Due to my size!\"\nmsgstr \"\"\n\n#. Key:\tDDEB5C4B4A180E85B1D711815B4D32F3\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Can I buy a name from you?\"\nmsgstr \"\"\n\n#. Key:\tDE3F40384473EC97950CDDB43AFE439E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Easy man! Here ya go!\"\nmsgstr \"\"\n\n#. Key:\tDEED1AF94E4BC154ED98A8B951AF0673\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Hey again!\"\nmsgstr \"\"\n\n#. Key:\tE2C88DA74DA8B5935E15CC9FD337C307\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_39.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_39.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Come on man! You can't just wander around!\"\nmsgstr \"\"\n\n#. Key:\tEA08DE334C7D8631989D159FB841367D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_30.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_30.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"See ya man!\"\nmsgstr \"\"\n\n#. Key:\tEAB8C1DE4B07AD7EAF0A4B819E4522C6\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Hey there!\"\nmsgstr \"\"\n\n#. Key:\tF780C72E4DDD9D9189C900836D4F7DBD\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"I’m Merch Ant, I deal with microtransactions.\"\nmsgstr \"\"\n\n#. Key:\tFED676B745409B7095EBB2994E581817\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_57.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_57.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"That's cool man. Though I wonder who will you save?\"\nmsgstr \"\"\n\n#. Key:\t04F1EF4B4AFDE5759A25A1A4922E9EA8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"Yet they could do nothing.\"\nmsgstr \"\"\n\n#. Key:\t05E7A2224316FEED1A2CEB8AEFC46B41\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"We can’t let everyone die here.\"\nmsgstr \"\"\n\n#. Key:\t078A48C347E2B23E79C495BA42BC7B6D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_25.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_25.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"We’ll have time to find a cure.\"\nmsgstr \"\"\n\n#. Key:\t0A857169478EC6929EFCA3B390C394DA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"Prepare for your last travel in the Ruined Realm. Head to the north from where the wind is blowing!\"\nmsgstr \"\"\n\n#. Key:\t1D8B6C81428A6D9F4C29AE9AD26206F2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_29.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_29.Children(1).Children.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"Can't leave them\"\nmsgstr \"\"\n\n#. Key:\t217F39F14762862B6EA18484EA74E987\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_37.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_37.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"I wish you better luck this time!\"\nmsgstr \"\"\n\n#. Key:\t22E17F2F4CFDD0CEB67AB0A91D872B3F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_4.Children(2).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_4.Children(2).Children.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"Not my problem\"\nmsgstr \"\"\n\n#. Key:\t2685CE674BB3B11FD3CB3AA2460CE60A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"There is nothing we can do for this World.\"\nmsgstr \"\"\n\n#. Key:\t26A2075F407FF43E1AF8B6B38E9C4AEE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"Farewell!\"\nmsgstr \"\"\n\n#. Key:\t2F7D7C46418E8E049493839A26DBB10E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"I’m ready to sacrifice myself but I feel sorrow for this world.\"\nmsgstr \"\"\n\n#. Key:\t39172C7641A5973A4B5D8480EBDD2589\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_34.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_34.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"Back already?\"\nmsgstr \"\"\n\n#. Key:\t3D21436E48DA0DF9C3ACA3B11001B17C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"Yet, we need to save those we can.\"\nmsgstr \"\"\n\n#. Key:\t43B780AA4934FBE35679BFB3C1C92D56\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"Farewell Wanderer!\"\nmsgstr \"\"\n\n#. Key:\t4AD4171F4A1832148034BAA736FC587E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"Head to the north from where the wind is blowing!\"\nmsgstr \"\"\n\n#. Key:\t4E65707F497B4B35E873138DDBF7B879\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"I will go home and you will solve your problems on your own.\"\nmsgstr \"\"\n\n#. Key:\t4EDA1AEF471537F758DD0491A7140073\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"This is none of my business.\"\nmsgstr \"\"\n\n#. Key:\t58246AA446D982E55E53EAB34FFF6A81\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_34.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_34.Children(1).Children.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"Leave\"\nmsgstr \"\"\n\n#. Key:\t67CB3C99468EEA39C4C18C8B0C28AFEA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_26.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_26.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"You? You mean the Wizard Council?\"\nmsgstr \"\"\n\n#. Key:\t743DD4C048F8CD08A49805975183B54D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"I’m sorry it ends like this, Wanderer.\"\nmsgstr \"\"\n\n#. Key:\t7AB88DE549E213B71759699AD51CFD4C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"I’m really proud of you little spirit. This wasn’t an easy decision for me either.\"\nmsgstr \"\"\n\n#. Key:\t7DCF30E74F8C0F29DA4E668CE3435E89\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"Wizard can’t hear us here, we can talk freely.\"\nmsgstr \"\"\n\n#. Key:\t8177A07D41AE7778BB4839AED3FEDACF\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_23.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_23.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"Do you know what you are risking?\"\nmsgstr \"\"\n\n#. Key:\t876B4752465406828E27A88C282EA5CD\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"From here I can teleport you close to the place where the Wizard will be able to get you out.\"\nmsgstr \"\"\n\n#. Key:\t9255CAD841A0C5B4DF3F4D8C5F5516B1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"So many great things will perish. So many...\"\nmsgstr \"\"\n\n#. Key:\t95EDE8FB4CEC490381EBD990C7277009\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_38.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_38.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"Take your time!\"\nmsgstr \"\"\n\n#. Key:\t9D46888D43C665A29506BF9CBB62F81D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_35.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_35.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"Let me try again!\"\nmsgstr \"\"\n\n#. Key:\tA1CF649542AAE3D8945327B9502E2E78\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_29.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_29.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"What chance do the humans have?\"\nmsgstr \"\"\n\n#. Key:\tA60B94F64A0D02EA0DA9419741ED84F4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_36.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_36.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"I just need some rest.\"\nmsgstr \"\"\n\n#. Key:\tA651056C4D344D685FEB53B2C3795966\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_34.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_34.Children(0).Children.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"Retry\"\nmsgstr \"\"\n\n#. Key:\tAAE7046349DBE5359097179A42FDA255\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_33.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_33.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"This one was enough.\"\nmsgstr \"\"\n\n#. Key:\tB17D67194997EFAEF6B8678DB05894FD\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"Let’s get them out first and face Ruin after.\"\nmsgstr \"\"\n\n#. Key:\tB4E31022471B52056F7B5AA3BB322700\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"How can I get to the Wizard’s tower?\"\nmsgstr \"\"\n\n#. Key:\tB6C99FC54E2A347994473EBF52B57EBD\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_4.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_4.Children(1).Children.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"Raven’s plan\"\nmsgstr \"\"\n\n#. Key:\tB985955E4FC6D81FBD38D79ADE68BF1F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_4.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_4.Children(0).Children.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"Separate Worlds\"\nmsgstr \"\"\n\n#. Key:\tC4BABAED4C790EDDF6AAF7A0D4CFA79B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_27.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_27.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"When Ruin started in the Runic Realm they had hundreds of Scientists who studied the force which made Ruin.\"\nmsgstr \"\"\n\n#. Key:\tCB779F524992B29781C4778ED6E224A7\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_30.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_30.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"I just can’t leave them to die here...\"\nmsgstr \"\"\n\n#. Key:\tCDA7A09249E96A52B2FA3CA471D6C4B3\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"This is the end of the path where we last meet.\"\nmsgstr \"\"\n\n#. Key:\tCF238FAA4941848AF7071A866B75B6EC\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"You are right. The only way to stop Ruin is to lock the Ruined Realm forever.\"\nmsgstr \"\"\n\n#. Key:\tD1F3B7324351B25E8C55679BAC3BF1E0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"Have you made your decision?\"\nmsgstr \"\"\n\n#. Key:\tE164446B4944B4CAC8E5C1BF82A722A2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_24.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_24.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"If you bring infected people into the Human Realm Ruin will consume them.\"\nmsgstr \"\"\n\n#. Key:\tE39531DE4350D6D86DF469839F1906E7\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_31.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_31.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"It’s your decision, Wanderer. I understand.\"\nmsgstr \"\"\n\n#. Key:\tE46912D04BE67D3E2B0794BB632AEE98\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_32.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_32.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"I’ll stay here. I won’t be able to watch another World dying...\"\nmsgstr \"\"\n\n#. Key:\tF70B765F44DB17E1C6978D9D8652C911\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"Hello, little Wanderer!\"\nmsgstr \"\"\n\n#. Key:\tFE709EDF4482B6FA7408DE99D95E8577\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_29.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_29.Children(0).Children.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"You are right\"\nmsgstr \"\"\n\n#. Key:\tFE77F7964851F202F5C91396A4C7228E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"I’ll take you to the place where you can leave this Realm.\"\nmsgstr \"\"\n\n#. Key:\t0B886754483D1C215FBEF5B7D19AF6A6\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"I know you have summoned a Spirit of the Unknown world. You were a fool to think you can get away with this.\"\nmsgstr \"\"\n\n#. Key:\t0BDF59D34A9E53B7FD5FD18F8E46F72F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"Argh! All right, here you go...\"\nmsgstr \"\"\n\n#. Key:\t2A6837CA471604FCDD180E85BD23D676\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"Krrr... Raven gives you magic which will make you fly like a Raven.\"\nmsgstr \"\"\n\n#. Key:\t2D8209F74AC3C9E042717A9FB108C051\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"Come on, go and try it!\"\nmsgstr \"\"\n\n#. Key:\t39B1763740E9BB9B495A7997920A3401\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_12.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_12.Children(0).Children.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"How?\"\nmsgstr \"\"\n\n#. Key:\t3AE553D14FFB88C0518679B86691D508\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"Call your master little spirit, I have words with him.\"\nmsgstr \"\"\n\n#. Key:\t3E02111D40F21C2C8C13F08729B4CDBC\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"I don’t know about any rule forbidding that...\"\nmsgstr \"\"\n\n#. Key:\t453610F144D8CEB42138F0BB35B9692A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"Wait Scholar! Please give me a few more days!\"\nmsgstr \"\"\n\n#. Key:\t4F0C40114C4DD1B345CF909E94F99D60\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"Why should I ask that?\"\nmsgstr \"\"\n\n#. Key:\t56F0D93740AB7555FF9370879D774842\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"I have no doubt how the Council will react.\"\nmsgstr \"\"\n\n#. Key:\t60D3A9DA420ECD7DBF490BA233EA5C61\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"Because you would love to know how you can get out of here.\"\nmsgstr \"\"\n\n#. Key:\t6125A956446F64BD91E1F5A282AC146D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"Don’t worry! I know your daughter is trapped in the Unknown and my research confirms there is a chance you can bring her back.\\r\\nI’ll help you bring the missing artefacts back.\"\nmsgstr \"\"\n\n#. Key:\t6B7478444FBC694480D442BB90F70B27\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"What do you want?\"\nmsgstr \"\"\n\n#. Key:\t72D7F64D4051F9BF362B9B97FD30DB65\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_12.Children(2).Children.Text\n#. Key:\tF62125FB48F982D2A3D4FE9621810F64\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_12.Children(2).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"What?\"\nmsgstr \"\"\n\n#. Key:\t810BD4154FA6BC7F857F9CB14EDC6A1D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"Er... thanks!\"\nmsgstr \"\"\n\n#. Key:\t8F439E124100E004BCCD4AA04F17CB3F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"How will we get out of here?\"\nmsgstr \"\"\n\n#. Key:\t9D31A0084CBBA499BA4E3BADB42E6E36\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"Rule? What rule should be needed for something which was thought to be impossible?\"\nmsgstr \"\"\n\n#. Key:\t9F52551E46588D4F12CD7C8B63701FDE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_12.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_12.Children(1).Children.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"Why?\"\nmsgstr \"\"\n\n#. Key:\tAAC96E3C4D4D303C9E692390612A7215\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"Ask how we will get out of here!\"\nmsgstr \"\"\n\n#. Key:\tC0808C6545D02F43CB37A2AFB79EEC1F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"Actually it’s not that good but still better than nothing.\"\nmsgstr \"\"\n\n#. Key:\tC19759F44A5A2AE21A04EBAF2A47E2D3\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"Take this!\"\nmsgstr \"\"\n\n#. Key:\tC8CEB3844A6C958FF42C74AA81D4A90F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"Finally, Raven found you!\"\nmsgstr \"\"\n\n#. Key:\tCF6DEF4D4F6F664CF24435AF248CE452\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"Raven and his fellow Ball on a quest again!\"\nmsgstr \"\"\n\n#. Key:\tE52C31F241BCD21378696EB8761C0654\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"Let the masters talk in private and discuss how we will get out of here!\"\nmsgstr \"\"\n\n#. Key:\t00ED8B314FC2DA3901823F92635D41D1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_26.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_26.Children(0).Children.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"You’ll be all dead\"\nmsgstr \"\"\n\n#. Key:\t23BA5AA446B44D107B9F3994ADDE1C43\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_22.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_22.Children(1).Children.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Save them!\"\nmsgstr \"\"\n\n#. Key:\t42395E7B4B735458E30557B9544073E3\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_8.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_8.Children(1).Children.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Leave\"\nmsgstr \"\"\n\n#. Key:\t43A5BAA8417D3291E502AD9500873B9E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Rumours have been spread of Ruin and the people are scared. They demand the Wizard Council to separate the Human Realm from the Ruined Realm.\"\nmsgstr \"\"\n\n#. Key:\t4FAAEE6240849C416541EDA8AB8083C8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_30.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_30.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Good luck, Raven!\"\nmsgstr \"\"\n\n#. Key:\t559673484F3C66AADE37E787BA35824A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_33.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_33.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Only a fool would bring Ruin to his own World.\"\nmsgstr \"\"\n\n#. Key:\t568124F448BE3AF41123A0B7BB158A53\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Krrrr! Raven and you make a really good team.\"\nmsgstr \"\"\n\n#. Key:\t5853B8654DBD91894792DE803DE87271\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_27.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_27.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"You bring back the artefacts to rescue Lillian.\"\nmsgstr \"\"\n\n#. Key:\t5D71DA8F4134A1AA206F15B7587AA188\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_15.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_15.Children(0).Children.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Break in?\"\nmsgstr \"\"\n\n#. Key:\t6234A9A34854A37E0CA56987FDE81F5A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_26.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_26.Children(1).Children.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"You are right\"\nmsgstr \"\"\n\n#. Key:\t6B07C6F34DF51DFA23A4278FCBECF303\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"What it will do?\"\nmsgstr \"\"\n\n#. Key:\t6E5A51A34AB81094924512B92F25F41C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_32.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_32.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"You are trying to rescue a bunch of mad people so that they can live a few more years with the cost of destroying one more Realm.\"\nmsgstr \"\"\n\n#. Key:\t70514624400617999FA05FAFAE67D60F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"What happened in the Human Realm?\"\nmsgstr \"\"\n\n#. Key:\t71C42D6445782897EAF303BFA2C5C260\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"What will you do? What’s your part in this?\"\nmsgstr \"\"\n\n#. Key:\t728B75824B28856156D207B71017C714\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Things are changing in the Human Realm and Raven has many things to do.\"\nmsgstr \"\"\n\n#. Key:\t7826765F45BE76393F3636B79BBC24C0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_24.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_24.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"You are right. We need to save them. What’s the plan?\"\nmsgstr \"\"\n\n#. Key:\t866DA22D46D855A200BB7F9E71788367\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_22.Children(0).Children.Text\n#. Key:\tBA0DEBA04BF5C604A2B760B8275E2983\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_23.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_22.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_23.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Is that safe?\"\nmsgstr \"\"\n\n#. Key:\t86E69EA04F489DC54B48BEBE8B3762BF\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_1.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_1.Children(0).Children.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Agree\"\nmsgstr \"\"\n\n#. Key:\t8D543992469624098751EAA474848F8C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Soon the Ruined Realm will be over. We cannot save it.\"\nmsgstr \"\"\n\n#. Key:\t943679734061A00F4CC99A8BC31078EA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Wizard won’t activate the device for them but some of them are fools enough to try it anyway.\"\nmsgstr \"\"\n\n#. Key:\t978AEC8B45AC7E6ED3E814AB849CF96A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"So, what now?\"\nmsgstr \"\"\n\n#. Key:\t99250A3F4973EBFB5A20A192DF8976AA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"With every day more and more people join their ranks.\"\nmsgstr \"\"\n\n#. Key:\t9D81AC2C4900D6DDA6B17CAD7168020C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_31.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_31.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Farewell, compeer!\"\nmsgstr \"\"\n\n#. Key:\tA5F24B3747918DB1E38CB98208FD6B1B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_35.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_35.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Or maybe you are wrong.\"\nmsgstr \"\"\n\n#. Key:\tB0ECBFAF4E34AEDE88F1B7B7C7F7CC5B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_8.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_8.Children(0).Children.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"What happened?\"\nmsgstr \"\"\n\n#. Key:\tB1D891BF48298C5D4CF7D8957EACDD1B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Raven will gather as many survivors as Raven can.\"\nmsgstr \"\"\n\n#. Key:\tB6CF3E424BAEA6EE368D508EEFDD5FF1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_36.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_36.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Farewell compeer! Raven will be on a quest on Raven’s own!\"\nmsgstr \"\"\n\n#. Key:\tB87509FF4D29C2B3D25CCEB192090963\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"What happens if they break in?\"\nmsgstr \"\"\n\n#. Key:\tB89F014644B8D3E1754B1B8C796D5858\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_1.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_1.Children(1).Children.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Disagree\"\nmsgstr \"\"\n\n#. Key:\tBA14AAD54C3D4F7CF18F5D8560A62637\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Nothing good...\"\nmsgstr \"\"\n\n#. Key:\tC2E50DCB4E1171342DD931910E42549E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_37.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_37.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Farewell!\"\nmsgstr \"\"\n\n#. Key:\tC3B19DAF4C0B491D9236CD99FD7DD603\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Except when you kill me with a laser beam.\"\nmsgstr \"\"\n\n#. Key:\tCBDDFBD14121FE1758B360A1775F2169\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Farewell compeer until you meet Raven again!\"\nmsgstr \"\"\n\n#. Key:\tCD19E0924BB1080025ABA19860F578CE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Somehow they know about the device the Wizard created. They surrounded the Wizard’s tower. Some even tried to break in.\"\nmsgstr \"\"\n\n#. Key:\tD54470AA424038F96824FC805AE3F0EE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_25.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_25.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Krrr! For them it’s much safer than staying here when the World is over.\"\nmsgstr \"\"\n\n#. Key:\tD99400D94457B6779DE59DB94FDBF9D1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"We have really short time to act.\"\nmsgstr \"\"\n\n#. Key:\tDAEF711B41EC4EF72FC271B5AD98A238\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_26.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_26.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"There are hundreds of survivors. Races that don’t even exist anywhere else! Who are we if we don’t even try to save them?\"\nmsgstr \"\"\n\n#. Key:\tDF872D134C82DFDD3F55F4A6FFF59673\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Except...\"\nmsgstr \"\"\n\n#. Key:\tE64B8C0048D2D3357B74CD8D7C1B5407\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_34.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_34.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"You sound like that Monk, don’t you? Maybe you are right.\"\nmsgstr \"\"\n\n#. Key:\tEA01FB8248A5F30CF9D95AA292D5466A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"No problem.\"\nmsgstr \"\"\n\n#. Key:\tF1193DA54FBB289383D56F952818E67E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Raven’s master decided we need to gather every survivor and take them into the Human Realm.\"\nmsgstr \"\"\n\n#. Key:\tF19792CF477CD543AC05FCBEDA3EA88C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_15.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_15.Children(1).Children.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"To act?\"\nmsgstr \"\"\n\n#. Key:\tF606FBDF4B7F3DFF9A55BE9CDB186CAC\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Farewell then!\"\nmsgstr \"\"\n\n#. Key:\tF8FA36BF4E3A4C028FBAF0A2AA531AA4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"You need to go on alone.\"\nmsgstr \"\"\n\n#. Key:\tFA02BBA74B601254CDA90A9300AD312F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_29.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_29.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"If all goes well you will meet Raven on the other side.\"\nmsgstr \"\"\n\n#. Key:\tFA630952402B081C2D449DA3C091F33E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Yes, we did well. Thanks for the help!\"\nmsgstr \"\"\n\n#. Key:\t63338A0644CC3AE62BCC10B56EAAD524\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3SewerCreature.C3SewerCreature:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter3/C3SewerCreature.C3SewerCreature:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_C3SewerCreature\"\nmsgid \"Fear not, everything will be alright!\"\nmsgstr \"\"\n\n#. Key:\t2C1EC209404316CE23DC67B6E91AC661\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Statue.C3Statue:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter3/C3Statue.C3Statue:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_C3Statue\"\nmsgid \"Are you ready?\"\nmsgstr \"\"\n\n#. Key:\t33B337C9455FC32BF5C3C69F58843673\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Statue.C3Statue:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Chapter3/C3Statue.C3Statue:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_C3Statue\"\nmsgid \"Will you release me once I get into your tower?\"\nmsgstr \"\"\n\n#. Key:\t4A8AD3EC428307141BD011B66448A7E5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Statue.C3Statue:DlgNode_Speech_2.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Statue.C3Statue:DlgNode_Speech_2.Children(0).Children.Text\nmsgctxt \"Dialogue_C3Statue\"\nmsgid \"Ready\"\nmsgstr \"\"\n\n#. Key:\t9C5B29DF4784913DFF166BAD07AC1219\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Statue.C3Statue:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Chapter3/C3Statue.C3Statue:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_C3Statue\"\nmsgid \"Hurry! We don’t have much time.\"\nmsgstr \"\"\n\n#. Key:\tB640545F41315B4C142083A2DB12A132\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Statue.C3Statue:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Chapter3/C3Statue.C3Statue:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_C3Statue\"\nmsgid \"Sure, we made a deal.\"\nmsgstr \"\"\n\n#. Key:\tC4EC98FC40F0181F5AFA60B4DFEF2D16\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Statue.C3Statue:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Chapter3/C3Statue.C3Statue:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_C3Statue\"\nmsgid \"Not yet. I’ll be back...\"\nmsgstr \"\"\n\n#. Key:\tCD542C81498F713774D43AB6EF126E32\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Statue.C3Statue:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter3/C3Statue.C3Statue:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_C3Statue\"\nmsgid \"Well done! From here I can take you to my tower.\"\nmsgstr \"\"\n\n#. Key:\tF982C80748C46B117906F094608B7E2C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Statue.C3Statue:DlgNode_Speech_2.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Statue.C3Statue:DlgNode_Speech_2.Children(1).Children.Text\nmsgctxt \"Dialogue_C3Statue\"\nmsgid \"Stay\"\nmsgstr \"\"\n\n#. Key:\tFE6723D8452B497B07504EA753F02F35\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Statue.C3Statue:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Chapter3/C3Statue.C3Statue:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_C3Statue\"\nmsgid \"Let’s go then!\"\nmsgstr \"\"\n\n#. Key:\t7C2DF1BE46E7672A1C7092A330030B39\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3SupperDwarf.C3SupperDwarf:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter3/C3SupperDwarf.C3SupperDwarf:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_C3SupperDwarf\"\nmsgid \"Otherwise I would rather stay here.\"\nmsgstr \"\"\n\n#. Key:\tFEB0911A412AF51088EC6A84D0FC7B3C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3SupperDwarf.C3SupperDwarf:DlgNode_Speech_80.Text\n#: /Game/SO/Dialogues/Chapter3/C3SupperDwarf.C3SupperDwarf:DlgNode_Speech_80.Text\nmsgctxt \"Dialogue_C3SupperDwarf\"\nmsgid \"I hope there is some delicious food in the Human Realm.\"\nmsgstr \"\"\n\n#. Key:\t360852FB41FBC269468577878A0CC719\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_C3Teachy\"\nmsgid \"Don’t say it, I know. I’m genius.\"\nmsgstr \"\"\n\n#. Key:\t39008A1943A63D4050295B9C508DF4CE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_C3Teachy\"\nmsgid \"He asked me to prove that I am worthy.\"\nmsgstr \"\"\n\n#. Key:\t5D3A77994D763C95F5655CAC4F228452\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_C3Teachy\"\nmsgid \"Oh, the walking ball again!\"\nmsgstr \"\"\n\n#. Key:\t74789A0946246082325FCDB2600CEAA2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_C3Teachy\"\nmsgid \"I haven’t seen you since you left me there with that Keeper.\"\nmsgstr \"\"\n\n#. Key:\t81A13B9645C14341A7FA45BC7482AB58\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_C3Teachy\"\nmsgid \"I'm not sure if it still matters but here is the Weird Device I found in the hideout of the Secret Science Society.\"\nmsgstr \"\"\n\n#. Key:\t8E2355CF4A1F7CCF4AF0FA8D95E2F503\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_C3Teachy\"\nmsgid \"After reordering the right side I got the final result:\\r\\n\\r\\nTEACHY = WORTHY\"\nmsgstr \"\"\n\n#. Key:\tA46C8D2749791CE910856BA8887272EB\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_C3Teachy\"\nmsgid \"That is amazing! Thank you, my globular friend! Take these coins, I am sure you will enjoy spending them... if you still can.\"\nmsgstr \"\"\n\n#. Key:\tBFA75D71419A3B5615D65980F9A2FC0E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_C3Teachy\"\nmsgid \"Well, alright, I’ll tell.\"\nmsgstr \"\"\n\n#. Key:\tC09FB7394571D19280D0B68572C6DCBB\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_C3Teachy\"\nmsgid \"I bet you wonder how did I get out.\"\nmsgstr \"\"\n\n#. Key:\tCC72AAE64CE58AECB367B0B2565A74CC\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_C3Teachy\"\nmsgid \"I made some cups of tea and slowly put them in a row. From that I had this formula:\\r\\n\\r\\nTIME = T\\r\\nCUP = C\\r\\nTEA * C = ROW * T\"\nmsgstr \"\"\n\n#. Key:\tE907906F4A46886EFBA7F09E459F2663\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_C3Teachy\"\nmsgid \"Then I multiplied by HY, so I get:\\r\\n\\r\\nTEACHY = ROWTHY\"\nmsgstr \"\"\n\n#. Key:\t298F025648B369E90753DA8D882DFDDB\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/DwarvenCatacombs/DCDictionary.DCDictionary:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Wizard/DwarvenCatacombs/DCDictionary.DCDictionary:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_DCDictionary\"\nmsgid \"Finally! A dictionary!\"\nmsgstr \"\"\n\n#. Key:\t3D4CF9424B28083560A64D8FA1232E9F\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/DwarvenCatacombs/DCDictionary.DCDictionary:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Wizard/DwarvenCatacombs/DCDictionary.DCDictionary:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_DCDictionary\"\nmsgid \"Wake me up when you are ready.\"\nmsgstr \"\"\n\n#. Key:\t04B787DD4344DA8AD6B1E0B7925BBDCE\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/DwarvenCatacombs/DCSecretDoor.DCSecretDoor:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Wizard/DwarvenCatacombs/DCSecretDoor.DCSecretDoor:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_DCSecretDoor\"\nmsgid \"There is a hidden Dwarven Door somewhere around here.\"\nmsgstr \"\"\n\n#. Key:\t4412DD54423A17AF3BFBA89BAF42664D\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/DwarvenCatacombs/DCSecretDoor.DCSecretDoor:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Wizard/DwarvenCatacombs/DCSecretDoor.DCSecretDoor:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_DCSecretDoor\"\nmsgid \"Or if you toggle that switch.\"\nmsgstr \"\"\n\n#. Key:\t5FDA3D2A49BD57C213F0E3869A366B76\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/DwarvenCatacombs/DCSecretDoor.DCSecretDoor:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Wizard/DwarvenCatacombs/DCSecretDoor.DCSecretDoor:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_DCSecretDoor\"\nmsgid \"This one can only be revealed on Christmas time if the full moon shines on it.\"\nmsgstr \"\"\n\n#. Key:\tCE7E6F5B4DB41F1055EAF1898F17E4EA\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/DwarvenCatacombs/DCSecretDoor.DCSecretDoor:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Wizard/DwarvenCatacombs/DCSecretDoor.DCSecretDoor:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_DCSecretDoor\"\nmsgid \"Dwarfs are fond of these. They can't be seen if you don't know their trick.\"\nmsgstr \"\"\n\n#. Key:\t03067C1041952ECAC7D529AF2CC2ABEE\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_DemonLillian\"\nmsgid \"Who you just killed...\"\nmsgstr \"\"\n\n#. Key:\t06C4895B4BA9C2F71F3007B00A680CFB\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_DemonLillian\"\nmsgid \"I'm free without any bounds! I'm human!\"\nmsgstr \"\"\n\n#. Key:\t0E5418EA4828B840886434A250967CBE\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_DemonLillian\"\nmsgid \"You liar! I'm the daughter of the Wizard!\"\nmsgstr \"\"\n\n#. Key:\t15ED5E554FBF25A72BB12FA81F4076FF\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_DemonLillian\"\nmsgid \"Sister? What makes you say that?\"\nmsgstr \"\"\n\n#. Key:\t2B375C424D4561D651214BA0F10CDB44\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_DemonLillian\"\nmsgid \"Siblings? What makes you say that?\"\nmsgstr \"\"\n\n#. Key:\t2F0A5F3442ACF917A0515892B0639541\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_2.Children(1).Children.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_2.Children(1).Children.Text\nmsgctxt \"Dialogue_DemonLillian\"\nmsgid \"Just passing\"\nmsgstr \"\"\n\n#. Key:\t36A3340F4333184F42874F88F23A710D\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_DemonLillian\"\nmsgid \"What are you doing here little toy?\"\nmsgstr \"\"\n\n#. Key:\t46C7EE464B94BCE5D8CE6DB96299A583\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_DemonLillian\"\nmsgid \"You are nonsense.\"\nmsgstr \"\"\n\n#. Key:\t732777EC4B213BC797E24FBBC478D39F\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_DemonLillian\"\nmsgid \"You are a Spirit of the Unknown bound to this body by magic. Just like me.\"\nmsgstr \"\"\n\n#. Key:\t819738554E1DD3694F3D0699221E6932\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_DemonLillian\"\nmsgid \"I'm just err... maybe we could play seek and hide?\"\nmsgstr \"\"\n\n#. Key:\tA02291F444C7907190F1D3AC78E5EAF0\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_2.Children(0).Children.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_2.Children(0).Children.Text\nmsgctxt \"Dialogue_DemonLillian\"\nmsgid \"I'll stop you!\"\nmsgstr \"\"\n\n#. Key:\tA94658F148628400E971CD925A6B8713\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_DemonLillian\"\nmsgid \"Shaped like a human...\"\nmsgstr \"\"\n\n#. Key:\tBBBDA8B843BF5549EF4052894D9BB630\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_DemonLillian\"\nmsgid \"We are siblings right? You will surely let me pass...\"\nmsgstr \"\"\n\n#. Key:\tBF79A92B406E287D767E7799D78FCFD4\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_DemonLillian\"\nmsgid \"That sounds funny!\"\nmsgstr \"\"\n\n#. Key:\tC6609DA7417A4DBC86F9809CE994E8BA\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_DemonLillian\"\nmsgid \"I'm power, I'm god!\"\nmsgstr \"\"\n\n#. Key:\tDD2EF1594AFD2B0C38845C9E36089B95\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_DemonLillian\"\nmsgid \"I've found you!\"\nmsgstr \"\"\n\n#. Key:\tDD2F3A7048614E74B3A343BA474D8E49\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_DemonLillian\"\nmsgid \"I've come to stop you sister. The World is not your playground!\"\nmsgstr \"\"\n\n#. Key:\tE7FA21A04757D1EF04AE41AF4A13025A\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_DemonLillian\"\nmsgid \"I'm bored! Have you come to play with me?\"\nmsgstr \"\"\n\n#. Key:\tFF05E84E4027C75294BAF4A589EEF6F9\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_DemonLillian\"\nmsgid \"I can create, I can destroy!\"\nmsgstr \"\"\n\n#. Key:\t025193144996A7024A7CF791B5A25EB7\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillianDefeated.DemonLillianDefeated:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillianDefeated.DemonLillianDefeated:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_DemonLillianDefeated\"\nmsgid \"What are you doing? Keep your hands away from me!\"\nmsgstr \"\"\n\n#. Key:\t2E05897C454C5C33BD76A6A4371A545C\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillianDefeated.DemonLillianDefeated:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillianDefeated.DemonLillianDefeated:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_DemonLillianDefeated\"\nmsgid \"I don't want to play anymore!\"\nmsgstr \"\"\n\n#. Key:\t77A82F8943F323744F9389BF22A80FDF\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillianDefeated.DemonLillianDefeated:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillianDefeated.DemonLillianDefeated:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_DemonLillianDefeated\"\nmsgid \"Farewell Spirit!\"\nmsgstr \"\"\n\n#. Key:\t7831CD44458112E37918DF9082278603\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillianDefeated.DemonLillianDefeated:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillianDefeated.DemonLillianDefeated:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_DemonLillianDefeated\"\nmsgid \"Leave me alone!\"\nmsgstr \"\"\n\n#. Key:\t79E4053F4B8A1AFE74064BA77037F13E\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillianDefeated.DemonLillianDefeated:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillianDefeated.DemonLillianDefeated:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_DemonLillianDefeated\"\nmsgid \"I am his daughter. And this body is mine.\"\nmsgstr \"\"\n\n#. Key:\t96BD08904BC50C912055C0977281D10F\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillianDefeated.DemonLillianDefeated:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillianDefeated.DemonLillianDefeated:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_DemonLillianDefeated\"\nmsgid \"I know this body...\"\nmsgstr \"\"\n\n#. Key:\tA5634D7D4613C578AB85E48B2DBD422B\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillianDefeated.DemonLillianDefeated:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillianDefeated.DemonLillianDefeated:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_DemonLillianDefeated\"\nmsgid \"Away!\"\nmsgstr \"\"\n\n#. Key:\tE09248B24E34823DDE71BAB68183AD2D\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillianDefeated.DemonLillianDefeated:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillianDefeated.DemonLillianDefeated:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_DemonLillianDefeated\"\nmsgid \"They were wrong all along.\"\nmsgstr \"\"\n\n#. Key:\t01C1D7AF4D8D7B3D628A089E38471479\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_74.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_74.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Thank you! Take this as reward.\"\nmsgstr \"\"\n\n#. Key:\t034DDD8F467E3B6E6A70CFBC1FA81D21\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_94.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_94.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Look what I have found for you!\"\nmsgstr \"\"\n\n#. Key:\t046279EA4D7E44826F537DA0869C13DD\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_114.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_114.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"They are somewhere around.\"\nmsgstr \"\"\n\n#. Key:\t055FD02047EB0145285C8BB0B7A23F0A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_17.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_17.Children(0).Children.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"They fight Ruin\"\nmsgstr \"\"\n\n#. Key:\t07684DB1418378D59D3741AE19AB22C1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(9).Children.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(9).Children.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Golems destroyed\"\nmsgstr \"\"\n\n#. Key:\t0D548F74416A5C1D8220869DC707A575\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_127.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_127.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Even if he couldn't be what I wanted him to be, he was my greatest creation ever.\"\nmsgstr \"\"\n\n#. Key:\t0E3082704C6E4BA14C554DA5B4306C88\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Could you merge these copper pieces?\"\nmsgstr \"\"\n\n#. Key:\t103CB0C84AEA077F78347A92E6389F32\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_10.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_10.Children(0).Children.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Don't know\"\nmsgstr \"\"\n\n#. Key:\t12C814BB44D434DFC5C35C882B4BF0DB\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_116.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_116.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Be aware of the Armour Wrath.\"\nmsgstr \"\"\n\n#. Key:\t14E2589C4CC2C6C77D37A5B50C61C266\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Could you merge these bronze pieces?\"\nmsgstr \"\"\n\n#. Key:\t1770D8FE480B8C028F9ED989E22CF315\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"You are not one of my new creations. Yet not one of the ancients.\"\nmsgstr \"\"\n\n#. Key:\t1C02E8BB400B379858A402B9621B68D6\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_129.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_129.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Take care!\"\nmsgstr \"\"\n\n#. Key:\t1CDE0CFA4DBF3794096E099B58726BD8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_36.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_36.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Nothing else matters.\"\nmsgstr \"\"\n\n#. Key:\t1FA243424440B0810651C79BD207FC2D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_33.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_33.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Too many spirits. They break loose. They couldn’t exist in our Realm. They formed Ruin.\"\nmsgstr \"\"\n\n#. Key:\t1FFE46404FBD26325B1348BF7A2935A7\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_92.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_92.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Oh, thank you! It also gives back some of my lost knowledge.\"\nmsgstr \"\"\n\n#. Key:\t2084B3DE4CDAC5B7B9018994EE4DFAA4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_85.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_85.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"The end is close, yet knowing what I am makes my last days brighter.\"\nmsgstr \"\"\n\n#. Key:\t21883D3E4563FD95B13E8E8E25FB1D92\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_15.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_15.Children(0).Children.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Not my business\"\nmsgstr \"\"\n\n#. Key:\t2362D7ED44CEEE8592C72BB41ECC0CC0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_77.Text\n#. Key:\t969AF9184296C419E484BA80FF80F15B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_76.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_76.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_77.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Do you know a girl called Lillian?\"\nmsgstr \"\"\n\n#. Key:\t2362FF25427C7C664ACE9297A20F3C65\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_81.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_81.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Memory Crystals? Can I touch them?\"\nmsgstr \"\"\n\n#. Key:\t254431B64533FAD362B0AF93F8347842\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_119.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_119.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"You will find it if you reach the top of the Main Tower.\"\nmsgstr \"\"\n\n#. Key:\t26664D3045EDCEC9C09E9CBA8515C088\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I don't know... I'm forced to do tasks for a wizard. I'm lost and confused.\"\nmsgstr \"\"\n\n#. Key:\t280BE2914A227E7350F067BCB4CC49AD\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_86.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_86.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Hmmm...\"\nmsgstr \"\"\n\n#. Key:\t2B714CED45A868B1678C5E854160945E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_97.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_97.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Look, I have more crystals.\"\nmsgstr \"\"\n\n#. Key:\t2C052328496E84667F356F95F9F9C418\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"This is really not my problem. All I care about is to complete my task and go on my way.\"\nmsgstr \"\"\n\n#. Key:\t2C174523477E6720A5300DBFE343C3D8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_51.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_51.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I can no longer open a gate to the Unknown Realm.\"\nmsgstr \"\"\n\n#. Key:\t2C7D234B4F377087E1D340986BD581AC\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_49.Text\n#. Key:\t417BB4E644EBC809C2489F85993A8E17\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_56.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_49.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_56.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"If you can summon Spirits you surely know a way to get me home.\"\nmsgstr \"\"\n\n#. Key:\t2DE200934F6AC1595216AA8050FF8F30\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_67.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_67.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I won’t work with anything else.\"\nmsgstr \"\"\n\n#. Key:\t2FC050C145CB19BD786157988C677AF5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(1).Children.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Bronze key\"\nmsgstr \"\"\n\n#. Key:\t30AD4CBE4D6EFD170F43D9852A0CB50C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_108.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_108.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I can’t remember.\"\nmsgstr \"\"\n\n#. Key:\t310B95624A8B2179F69A68BE2B0869C2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(4).Children.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(4).Children.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Making Golems?\"\nmsgstr \"\"\n\n#. Key:\t311039514F83A0ED4BE47A98BF5AE48E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_107.Text\n#. Key:\t5D08D2404686BF1E5D48AC8C63096F0D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_104.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_104.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_107.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Thank you Spirit! I will be forever in your debt.\"\nmsgstr \"\"\n\n#. Key:\t3140425845B595B02CA8D3B8DBC6CE37\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_38.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_38.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"It's done. They are destroyed.\"\nmsgstr \"\"\n\n#. Key:\t37835C204E4C4B17F2D55C9B23FD7D1E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_45.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_45.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"There is some kind of a connection between Ruin and the Spirits.\"\nmsgstr \"\"\n\n#. Key:\t384F5CB146C9B6E7EFD361964FF11735\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"A spirit of the Unknown was summoned here by a Wizard of another world.\"\nmsgstr \"\"\n\n#. Key:\t398124A4493A7325B284CA8105354F0C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_35.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_35.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Yet now the only important thing is to finish my golems.\"\nmsgstr \"\"\n\n#. Key:\t39C014784CA9DF8247D2DDA5587BAB20\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(5).Children.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(5).Children.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Get me home!\"\nmsgstr \"\"\n\n#. Key:\t3CE0431346C222ED2A6729AAEF8026DC\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(6).Children.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(6).Children.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"New body for me\"\nmsgstr \"\"\n\n#. Key:\t3DFB1F4D4BB673F983C8CDA4E9911BF2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_89.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_89.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Wait a minute! I’ll make something special for you.\"\nmsgstr \"\"\n\n#. Key:\t3F7C1850478A14857F4FFD9D41BA39FC\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_87.Text\n#. Key:\t79079CCD4BB2C6244D6D7CB04BD4C42F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_84.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_84.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_87.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Yes, now I remember. Thank you little Spirit for giving my memories back.\"\nmsgstr \"\"\n\n#. Key:\t3FAB7E8D4E72D1EED6E11EA54A128836\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(3).Children.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(3).Children.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Copper Key\"\nmsgstr \"\"\n\n#. Key:\t419879C24D39534867F656B704C579AC\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_110.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_110.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Even without my memories I liked to talk to her.\"\nmsgstr \"\"\n\n#. Key:\t41B08BF1417C041EB3ACAE8C09C44872\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_17.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_17.Children(1).Children.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"They will fall\"\nmsgstr \"\"\n\n#. Key:\t41E19A0C420F2BD87AA91AB475D5BB0C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_128.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_128.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Please, leave me alone now.\"\nmsgstr \"\"\n\n#. Key:\t4438EF7A4D77A3314D2B6587DAE664AE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I can fix it!\"\nmsgstr \"\"\n\n#. Key:\t46730E7C433AE7B987C61D9DDF0161E2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_52.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_52.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"How do you make Golems then?\"\nmsgstr \"\"\n\n#. Key:\t4816E7D14B256F62C2AFE0A3D5EC1987\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_113.Text\n#. Key:\tEC59F30D402E177B8C137DAA7A834F1A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_112.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_112.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_113.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I’m looking for three artefacts. Do you know something about them?\"\nmsgstr \"\"\n\n#. Key:\t49E3D8B84BD437A7195CB49B1C91A9B7\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_30.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_30.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"We created too many of them. Always new ones. We forgot about the old ones.\"\nmsgstr \"\"\n\n#. Key:\t4CDF7F734B65BFB6575D66A2E40B64B6\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"You wonder if Ruin will destroy their World as well...\"\nmsgstr \"\"\n\n#. Key:\t4FD5FE974E1B8142471F8896818E875C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"What do you need?\"\nmsgstr \"\"\n\n#. Key:\t5000F3F44A899815A0D341A3494E42AB\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_91.Text\n#. Key:\t6D5127FD45C09B33329F0EB0DDCE67D7\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_93.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_91.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_93.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Thank you!\"\nmsgstr \"\"\n\n#. Key:\t50E6C4434BAC5A7F4B2C66BD8DB5E071\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_100.Text\n#. Key:\t64A5DE6941972506C0BECBB55BBE4FE5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_78.Text\n#. Key:\tB07790474D4C124CB72F128AE0FB2CC5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_95.Text\n#. Key:\tEF125F27496303716206D182C1ED460D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_39.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_100.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_39.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_78.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_95.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I think these crystals have something to do with you.\"\nmsgstr \"\"\n\n#. Key:\t51C200AD42FCE6888DBF8C8C24A02283\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"It shall be done.\"\nmsgstr \"\"\n\n#. Key:\t52D4954E427C666F0F2F4A92F9BCFBC9\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_50.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_50.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I’m sorry but I can’t help you.\"\nmsgstr \"\"\n\n#. Key:\t5B1327C64C77C05C43CD728356DA4EC4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_58.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_58.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Knowledge lost. We are lost.\"\nmsgstr \"\"\n\n#. Key:\t5E7AD2034CECCF124DA4E19D94B96433\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"It's nothing. Here it is.\"\nmsgstr \"\"\n\n#. Key:\t5FB1520B447246A1A8BCD3BDDB44D145\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_65.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_65.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"No.\"\nmsgstr \"\"\n\n#. Key:\t5FBF0F3F4419A6AD796054841902FA7C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"They can't work together even if they share the same goal.\"\nmsgstr \"\"\n\n#. Key:\t60609E4049562CF11C05CB8DB96BBBB3\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"What do you mean by 'your creations'?\"\nmsgstr \"\"\n\n#. Key:\t635D5E904325D51DFF19A1A862A3CC0B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_124.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_124.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"The Armour Wrath is no more.\"\nmsgstr \"\"\n\n#. Key:\t6585CAC84326A3EEE1682789B7BB3CB6\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_10.Children(2).Children.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_10.Children(2).Children.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Your creation?\"\nmsgstr \"\"\n\n#. Key:\t65C3735740E5D7AF76376AB2B7B05CE9\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(12).Children.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(12).Children.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Leave\"\nmsgstr \"\"\n\n#. Key:\t6A460D4A4751398E004298948D630BA4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_47.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_47.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I don’t think I will manage though. It’s already too late. But there is no reason to give up either.\"\nmsgstr \"\"\n\n#. Key:\t6DC280B64766B5CB2049409B2F73CDB4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_40.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_40.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Is there a way I can help you?\"\nmsgstr \"\"\n\n#. Key:\t6DD3D7804417850FE8504286DD2B5D95\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_96.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_96.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"More Crystal? That's very kind.\"\nmsgstr \"\"\n\n#. Key:\t6E9DB27A4207FFA8409F61AE45282D53\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_41.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_41.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I have found one more crystal.\"\nmsgstr \"\"\n\n#. Key:\t717452044F194A1C30FA3C8FBB94C9BF\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_73.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_73.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I’ll see what I can do.\"\nmsgstr \"\"\n\n#. Key:\t74670AB34D1A75913013BE8EE7C0B961\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_72.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_72.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I’ve already destroyed them.\"\nmsgstr \"\"\n\n#. Key:\t752F67A54FA433AA588175AA7C64E367\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_43.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_43.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I try to create the perfect Golem. The one which resists Ruin.\"\nmsgstr \"\"\n\n#. Key:\t775C2189498804DBED7D81AB3EFEC96F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(11).Children.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(11).Children.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Lillian\"\nmsgstr \"\"\n\n#. Key:\t78C78DDD456328181EBCC78B20F9573D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_122.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_122.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Some of them are still out there.\"\nmsgstr \"\"\n\n#. Key:\t7C7D08C340B478A9420331AD355B1FA5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_15.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_15.Children(1).Children.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Like you?\"\nmsgstr \"\"\n\n#. Key:\t7DCEFFEC46523960D1453DA93F36CAA5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_111.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_111.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I don’t know why but I feel in some way you are bound to her.\"\nmsgstr \"\"\n\n#. Key:\t7F44BD934784D4F3AA2C85985489590A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"A Wizard? So now the Human Realm's people are messing with Golem Technology.\"\nmsgstr \"\"\n\n#. Key:\t80871D9C4CF37B5F2E7101B8A2565D73\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_70.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_70.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"It’s not safe for me to walk outside.\"\nmsgstr \"\"\n\n#. Key:\t83ACDDA4415211102DBE099F178B228B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_15.Children(2).Children.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_15.Children(2).Children.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"You mean Ruin\"\nmsgstr \"\"\n\n#. Key:\t86B4FC23463D5507B11C3F826ADF6C7C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_10.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_10.Children(1).Children.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Spirit in a ball\"\nmsgstr \"\"\n\n#. Key:\t88A6486843FEC6A2125F79B8AED93F74\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_99.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_99.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Now there is only a few missing.\"\nmsgstr \"\"\n\n#. Key:\t8C2169FA47F83CA62B19F083EFC398F5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_26.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_26.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"That is me. And what are you creature?\"\nmsgstr \"\"\n\n#. Key:\t8CC8368441F2CCDB0E7B22916F8A0622\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_88.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_88.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Getting back some of my lost knowledge also makes me feel happy.\"\nmsgstr \"\"\n\n#. Key:\t8E3399DA4F904AD46476418817CD78C4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_62.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_62.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Metal binds the will of the spirits. Rock is a bit less cruel but still weakens your will.\"\nmsgstr \"\"\n\n#. Key:\t8F4BB43A4656EAD257920492E10BC764\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_130.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_130.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Yes, they bring back some of my memories.\"\nmsgstr \"\"\n\n#. Key:\t8F9DF3254A02EFF2E623DB91935A1529\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_123.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_123.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Come back when you found all of them.\"\nmsgstr \"\"\n\n#. Key:\t97EE3A1B4AD2EB2E7ED2D1B1427E4A2A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_25.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_25.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"It's only me trying to recreate the perfect Golem.\"\nmsgstr \"\"\n\n#. Key:\t99BCAE80415145460126B08933AE6242\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_118.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_118.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"One of the artefacts is close.\"\nmsgstr \"\"\n\n#. Key:\t9A05FD0845F9149CEB6EB8889EB9A686\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"That won't happen.\"\nmsgstr \"\"\n\n#. Key:\t9B7BB6624923813EBF68C9BCE9FF8E49\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"There is nothing else I could say. See you later!\"\nmsgstr \"\"\n\n#. Key:\t9BEA36B448EC18A9280A5AAB78A46898\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_42.Text\n#. Key:\tD3AE25EC49FA7D2C78C1A382E5A01F28\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_37.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_37.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_42.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Why are you making Golems? What would you like to achieve?\"\nmsgstr \"\"\n\n#. Key:\t9CC2CAF14E5C04555E7329B6EA5082E0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(0).Children.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Armour Wrath\"\nmsgstr \"\"\n\n#. Key:\t9EF4681A48ED6C909A4180BF823544BC\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(8).Children.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(8).Children.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Do you need help?\"\nmsgstr \"\"\n\n#. Key:\t9F3BC08D46169E8C4BB788893FFDBCD4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_68.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_68.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Yes.\"\nmsgstr \"\"\n\n#. Key:\tA10EF7404139EE7FE638BCA272C0B2CA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_71.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_71.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Destroy them if you can.\"\nmsgstr \"\"\n\n#. Key:\tA13C1A6B4F187C1A3F682088B9CC9A6F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_23.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_23.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Didn't look too intelligent to me...\"\nmsgstr \"\"\n\n#. Key:\tA28429434B394861A6E4D084CE5C243F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_61.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_61.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I could but I don’t think you would like it.\"\nmsgstr \"\"\n\n#. Key:\tA2CBB6914F66C9963AFD34A21378EAA7\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_103.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_103.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"With this last one I have all my memories back.\"\nmsgstr \"\"\n\n#. Key:\tA33780CE4B9EABF54F612DBFCEB4B890\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I wonder if they will end like us.\"\nmsgstr \"\"\n\n#. Key:\tA47024E844A13837A8FFFBB1EFA65633\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_44.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_44.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Though I forgot the reason.\"\nmsgstr \"\"\n\n#. Key:\tA4E91A924BA53F0A000CDB9FC351DDBA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_60.Text\n#. Key:\tB4F5B2E6479E0E1ACDADD8A40E21FB98\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_59.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_59.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_60.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Could you create a stronger body for me?\"\nmsgstr \"\"\n\n#. Key:\tA50F6A7B4A65712F990406B84E2AE072\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_98.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_98.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Thank you! I remember more and more.\"\nmsgstr \"\"\n\n#. Key:\tA586F33F460BD066761AAEBD18666F78\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_82.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_82.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Bring me more so that I can remember!\"\nmsgstr \"\"\n\n#. Key:\tA8A9ACBA47419C57AAA06098F7F91AD3\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_83.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_83.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Let me touch it! Hmmm...\"\nmsgstr \"\"\n\n#. Key:\tAA5F0D5541366675A1D1819FDBDFA569\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"What happened to you?\"\nmsgstr \"\"\n\n#. Key:\tAD380C5F4F549229611DD9A79C7CD07E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_79.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_79.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"She was from the Human Realm. I liked her better than the other human.\"\nmsgstr \"\"\n\n#. Key:\tAE0D1C714FFCFCA51ACCD3A01D6C7FF5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_125.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_125.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Yes, I felt his presence disappearing.\"\nmsgstr \"\"\n\n#. Key:\tAE6B02664FEE60818E0D32B7939907F8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_106.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_106.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Now I have all my memories back.\"\nmsgstr \"\"\n\n#. Key:\tB7638E004540ADC59420A5AA614C225D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_75.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_75.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I’ve destroyed the Golems near the Tomb.\"\nmsgstr \"\"\n\n#. Key:\tB86428C143F7BBBC4A7B9A91C05F3D15\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"They are doomed.\"\nmsgstr \"\"\n\n#. Key:\tBB7DE71F44FE995BA4AF4C9F5E19961F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_46.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_46.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I try to create an Essence which resists Ruin. If it works it could stop Ruin.\"\nmsgstr \"\"\n\n#. Key:\tBCF49E21489280A32F859B9A6C2A78D4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"What are you creature?\"\nmsgstr \"\"\n\n#. Key:\tBDEEB7C2474E308C66B832B41D839FC6\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_66.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_66.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Metal is good for spirits. Even rock is dangerous.\"\nmsgstr \"\"\n\n#. Key:\tC0CAE1B14D0B0E551B690FB9F178A6EE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(10).Children.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(10).Children.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Memory Crystals\"\nmsgstr \"\"\n\n#. Key:\tC86A03B046B8F005B1C91EB0F68E4C1E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_121.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_121.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Here, take this! It might help if you need to face my creature!\"\nmsgstr \"\"\n\n#. Key:\tCA35E144421C5594346DC9954052E633\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_57.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_57.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"No way home.\"\nmsgstr \"\"\n\n#. Key:\tCD223717428DAF54F5362BB744B6A633\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_53.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_53.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I reuse the old golems. Maybe that’s why I can’t succeed.\"\nmsgstr \"\"\n\n#. Key:\tD06BA0C54CAA8E00ECAFBE9FAFBABE1F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Could you merge these iron pieces?\"\nmsgstr \"\"\n\n#. Key:\tD237C8514A69E0A7820941B9048B92DE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_90.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_90.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Here it is!\"\nmsgstr \"\"\n\n#. Key:\tD2CEAC3040B9EBE5A98F249F60A7DAAA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(2).Children.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(2).Children.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Iron Key\"\nmsgstr \"\"\n\n#. Key:\tD935FD314471404BAECA54BC3227D6E2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_69.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_69.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"There are too many unsuccessful golems.\"\nmsgstr \"\"\n\n#. Key:\tDE3287A345E1E317061B45B64AAA0836\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_34.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_34.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Your words remind me of something. Something which was important.\"\nmsgstr \"\"\n\n#. Key:\tDEC8E5D548AECD6D48B449B51967301B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_115.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_115.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"One is guarded by my worst creation.\"\nmsgstr \"\"\n\n#. Key:\tDEFA219E40FE5384D8B1F0A1CFD3AAD4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_80.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_80.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"She were... She said...\"\nmsgstr \"\"\n\n#. Key:\tE13D5CCE41818BAC4A6E52A965B0AEF8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_101.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_101.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Look at this!\"\nmsgstr \"\"\n\n#. Key:\tE1CB9ABE410B3C818283BB9325F3A456\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_32.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_32.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I create golems. You go on with your quest. Nothing else matters.\"\nmsgstr \"\"\n\n#. Key:\tE2AAAA4648BE8A7E73C761BDF72EC82D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_54.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_54.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Ruin caused too much damage.\"\nmsgstr \"\"\n\n#. Key:\tE483CAFF4F7EF5607AA0A58F47EEF892\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_31.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_31.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"You are right. We are what we do. That keeps us alive.\"\nmsgstr \"\"\n\n#. Key:\tE9899191454A678E7C61B0A55047A725\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_126.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_126.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I'm glad you managed to defeat him and yet...\"\nmsgstr \"\"\n\n#. Key:\tEA08D7B74E94A3D91DC825945916C312\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_102.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_102.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"One more Crystal for you!\"\nmsgstr \"\"\n\n#. Key:\tEAF5836D4D35812F14EABFA43C849947\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_117.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_117.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I know what you are up to. I would like to help but I fear I can’t do much.\"\nmsgstr \"\"\n\n#. Key:\tEB0F70894E9A498111B9A9824589633B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I create Golems. I always did. I designed the most intelligent ones.\"\nmsgstr \"\"\n\n#. Key:\tF0A1D18E463DCD0CADD67690F691481B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_27.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_27.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"There are some seeking a way to stop Ruin. They don't care about using spirits as slaves.\"\nmsgstr \"\"\n\n#. Key:\tF10E8A9243616A85F71C01B0E57A2CC8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_105.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_105.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"And this is for you!\"\nmsgstr \"\"\n\n#. Key:\tF62B033A4054241E561B519B2AFFEBDB\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Do you mean those moving rock things out there?\"\nmsgstr \"\"\n\n#. Key:\tF783A4F44E12EDA97EDF08B60228ED06\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_109.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_109.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"She had heart, she cared about what’s going on here. For the others we were like some interesting study.\"\nmsgstr \"\"\n\n#. Key:\tF87968784C67FEEEBB78DBAD9D3C13F3\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_63.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_63.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"As for other materials I have no experience. Trust me you don’t want me to test out something on you for the first time.\"\nmsgstr \"\"\n\n#. Key:\tF9B8793C470BFE672214E1B82AE01B4E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_24.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_24.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Knowledge is lost. We are all lost.\"\nmsgstr \"\"\n\n#. Key:\tF9DB2D444ADAC7A5C22AEC914EC7955F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(7).Children.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(7).Children.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Artefacts\"\nmsgstr \"\"\n\n#. Key:\tFE7749AB4C91684B3438E7A1B5BF32D9\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_29.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_29.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"They can't do as they plan. Some of them don't even believe Ruin.\"\nmsgstr \"\"\n\n#. Key:\tFF2914834A91E2B6E8696FA828FC9F94\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_120.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_120.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Though it is guarded by the worst Golem I ever made: the Armour Wrath...\"\nmsgstr \"\"\n\n#. Key:\t303FE4BA4765B90E9239FEB43AE2264C\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/DwarvenCatacombs/DO1Altar.DO1Altar:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Wizard/DwarvenCatacombs/DO1Altar.DO1Altar:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_DO1Altar\"\nmsgid \"Under section 1 of the first Act, an action of worship can not be aimed at any entity, god or divinity other than the Law itself.\"\nmsgstr \"\"\n\n#. Key:\t73BA4B474C4DCF6CD31469A9FF120D58\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/DwarvenCatacombs/DO1Altar1.DO1Altar1:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Wizard/DwarvenCatacombs/DO1Altar1.DO1Altar1:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_DO1Altar1\"\nmsgid \"Under section 2 of the first Act... ??? There is section 3 of the first act, one would assume.\"\nmsgstr \"\"\n\n#. Key:\t0D939EC3462DBDE895AD9F80CD4A9B99\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/DwarvenOutpost/DO1Arrive1DeadDwarves.DO1Arrive1DeadDwarves:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Wizard/DwarvenOutpost/DO1Arrive1DeadDwarves.DO1Arrive1DeadDwarves:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_DO1Arrive1DeadDwarves\"\nmsgid \"So they were the dwarfs who lived here.\"\nmsgstr \"\"\n\n#. Key:\t6E27805A491B0E0DEAC36F9189CA33F9\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/DwarvenOutpost/DO1Arrive1DeadDwarves.DO1Arrive1DeadDwarves:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Wizard/DwarvenOutpost/DO1Arrive1DeadDwarves.DO1Arrive1DeadDwarves:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_DO1Arrive1DeadDwarves\"\nmsgid \"I'm not sure why but I feel a bit of sorrow for them.\"\nmsgstr \"\"\n\n#. Key:\t7AD20FC74D56D0EE48CB5F92804EDAE5\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/DwarvenOutpost/DO1Arrive1DeadDwarves.DO1Arrive1DeadDwarves:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Wizard/DwarvenOutpost/DO1Arrive1DeadDwarves.DO1Arrive1DeadDwarves:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_DO1Arrive1DeadDwarves\"\nmsgid \"I wonder how you can tell them apart.\"\nmsgstr \"\"\n\n#. Key:\tA6EB230647E9F8D38877FCA10CDE4875\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/DwarvenOutpost/DO1Arrive1DeadDwarves.DO1Arrive1DeadDwarves:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Wizard/DwarvenOutpost/DO1Arrive1DeadDwarves.DO1Arrive1DeadDwarves:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_DO1Arrive1DeadDwarves\"\nmsgid \"I knew these ones. That's Gwin and Traga, there's Krug...\"\nmsgstr \"\"\n\n#. Key:\t2858D4314420FB59E8BDC18DB625DC1F\n#. SourceLocation:\t/Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_6.SpeechSequence(1).SpeechSequence.Text\n#: /Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_6.SpeechSequence(1).SpeechSequence.Text\nmsgctxt \"Dialogue_DO1Gate\"\nmsgid \"I think you may mistranslated a word or two...\"\nmsgstr \"\"\n\n#. Key:\t2C08483A26080F0A003A02ADBE7A7D64\n#. SourceLocation:\t/Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_7.SpeechSequence(2).SpeechSequence.Text\n#: /Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_7.SpeechSequence(2).SpeechSequence.Text\nmsgctxt \"Dialogue_DO1Gate\"\nmsgid \"Dwarven letters are so similar...\"\nmsgstr \"\"\n\n#. Key:\t2C09D69026080F0A003A02ADBE7A7D4E\n#. SourceLocation:\t/Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_8.SpeechSequence(2).SpeechSequence.Text\n#: /Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_8.SpeechSequence(2).SpeechSequence.Text\nmsgctxt \"Dialogue_DO1Gate\"\nmsgid \"Dwarven language is stupid, these signs could mean anything!\"\nmsgstr \"\"\n\n#. Key:\t3D6EF5724190CE0AE579D69677BB8EAE\n#. SourceLocation:\t/Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_DO1Gate\"\nmsgid \"Associate!\"\nmsgstr \"\"\n\n#. Key:\t4758A32043FC23B4DC3D82B35EFB0D24\n#. SourceLocation:\t/Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_DO1Gate\"\nmsgid \"The Doors of Dwar — Lord of Dwartown. Speak, associate, and enter.\"\nmsgstr \"\"\n\n#. Key:\t475CE3E94BA77F7596A7D8931D4D16C7\n#. SourceLocation:\t/Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_7.SpeechSequence(1).SpeechSequence.Text\n#: /Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_7.SpeechSequence(1).SpeechSequence.Text\nmsgctxt \"Dialogue_DO1Gate\"\nmsgid \"Are you sure that is what you just read?\"\nmsgstr \"\"\n\n#. Key:\t530C8841437C531647717B8B0BC07210\n#. SourceLocation:\t/Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_8.SpeechSequence(1).SpeechSequence.Text\n#: /Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_8.SpeechSequence(1).SpeechSequence.Text\nmsgctxt \"Dialogue_DO1Gate\"\nmsgid \"Nice try...\"\nmsgstr \"\"\n\n#. Key:\t543858DE49FD03BF4F94C3BA47912E5E\n#. SourceLocation:\t/Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_9.SpeechSequence(1).SpeechSequence.Text\n#: /Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_9.SpeechSequence(1).SpeechSequence.Text\nmsgctxt \"Dialogue_DO1Gate\"\nmsgid \"I have to practice my Dwarven a bit more...!\"\nmsgstr \"\"\n\n#. Key:\t5923FB9C4DC255ABAA6059B64B806802\n#. SourceLocation:\t/Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_6.SpeechSequence(3).SpeechSequence.Text\n#: /Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_6.SpeechSequence(3).SpeechSequence.Text\nmsgctxt \"Dialogue_DO1Gate\"\nmsgid \"I am going to open this door somehow.\"\nmsgstr \"\"\n\n#. Key:\t7CF38D834DB6A7265EDE19AD158BFEBF\n#. SourceLocation:\t/Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_7.SpeechSequence(0).SpeechSequence.Text\n#: /Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_7.SpeechSequence(0).SpeechSequence.Text\nmsgctxt \"Dialogue_DO1Gate\"\nmsgid \"I want a Schnauser with my Wienerschnitzel\"\nmsgstr \"\"\n\n#. Key:\t86311C104780BDB8A170538987EF7226\n#. SourceLocation:\t/Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_8.SpeechSequence(0).SpeechSequence.Text\n#: /Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_8.SpeechSequence(0).SpeechSequence.Text\nmsgctxt \"Dialogue_DO1Gate\"\nmsgid \"And on the day the Ball is set free, the gate opens and happiness finds everyone...\"\nmsgstr \"\"\n\n#. Key:\tCD68B2244B57CA37D2940499F440149B\n#. SourceLocation:\t/Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_DO1Gate\"\nmsgid \"Associwhat?\"\nmsgstr \"\"\n\n#. Key:\tCE8E75E6422C068794CC91BDBA2C024A\n#. SourceLocation:\t/Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_6.SpeechSequence(2).SpeechSequence.Text\n#: /Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_6.SpeechSequence(2).SpeechSequence.Text\nmsgctxt \"Dialogue_DO1Gate\"\nmsgid \"Damn, my Dwarven is just not good enough, I have to practice a bit more...\"\nmsgstr \"\"\n\n#. Key:\tCED9C6ED4B792FA939C759A79E4AB028\n#. SourceLocation:\t/Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_6.SpeechSequence(0).SpeechSequence.Text\n#: /Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_6.SpeechSequence(0).SpeechSequence.Text\nmsgctxt \"Dialogue_DO1Gate\"\nmsgid \"There is sauerkraut in my Lederhosen\"\nmsgstr \"\"\n\n#. Key:\tEC493B624D127AB87692BC983023FF18\n#. SourceLocation:\t/Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_7.SpeechSequence(3).SpeechSequence.Text\n#: /Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_7.SpeechSequence(3).SpeechSequence.Text\nmsgctxt \"Dialogue_DO1Gate\"\nmsgid \"There must be a way to open this door...\"\nmsgstr \"\"\n\n#. Key:\t6F5AF3DD4E848650EE74449420A90A25\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/DwarvenCatacombs/DO1Tomb.DO1Tomb:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Wizard/DwarvenCatacombs/DO1Tomb.DO1Tomb:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_DO1Tomb\"\nmsgid \"These are the orders of the Chancellor of Dwartown, unjustly murdered by order of Duality.\"\nmsgstr \"\"\n\n#. Key:\t949EBB7A4FCEA61BB9B3589CFCC53C2B\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/DwarvenCatacombs/DO1Tomb1.DO1Tomb1:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Wizard/DwarvenCatacombs/DO1Tomb1.DO1Tomb1:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_DO1Tomb1\"\nmsgid \"Here lies the testament of the order of Duality, justly murdered by the Chancellor of Dwartown's spirit.\"\nmsgstr \"\"\n\n#. Key:\t110A2E27493EBAD78EE6E1B16F56912A\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E3/E3_Start.E3_Start:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E3/E3_Start.E3_Start:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_E3_Start\"\nmsgid \"I survived the Unknown. I know how to use the Device, but...\"\nmsgstr \"\"\n\n#. Key:\t2CB853A540A2B5BFD268DEAA124CEAD0\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E3/E3_Start.E3_Start:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Ending/E3/E3_Start.E3_Start:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_E3_Start\"\nmsgid \"I need to choose one last time. Once and for all.\"\nmsgstr \"\"\n\n#. Key:\t416D47B6408622D8D01F61961C80ADD2\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E3/E3_Start.E3_Start:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E3/E3_Start.E3_Start:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_E3_Start\"\nmsgid \"I have already lost almost everything.\"\nmsgstr \"\"\n\n#. Key:\t75F863B843B253E3586DE991CDE546EA\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E3/E3_Start.E3_Start:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Ending/E3/E3_Start.E3_Start:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_E3_Start\"\nmsgid \"And here I am again. Is this how it will end?\"\nmsgstr \"\"\n\n#. Key:\t77BC194943A148967299F68B3522C696\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E3/E3_Start.E3_Start:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Ending/E3/E3_Start.E3_Start:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_E3_Start\"\nmsgid \"Do I really have to lose everyone I met in the Ruined Realm?\"\nmsgstr \"\"\n\n#. Key:\tA50B792A4D68EC45BB9C3CBBF8836021\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E3/E3_Start.E3_Start:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Ending/E3/E3_Start.E3_Start:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_E3_Start\"\nmsgid \"Or would I only save them so that we can die together?\"\nmsgstr \"\"\n\n#. Key:\tE43A08E14831EBDC50AFC0B4A3178817\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E3/E3_Start.E3_Start:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Ending/E3/E3_Start.E3_Start:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_E3_Start\"\nmsgid \"I can hear the people outside the tower. I don’t have much time.\"\nmsgstr \"\"\n\n#. Key:\t042B7F534C07B3EC75BA9BA8F0BA7926\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_5.Children(0).Children.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_5.Children(0).Children.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"Worthy?\"\nmsgstr \"\"\n\n#. Key:\t05E334DE42BAA89837B78B8F0F1CBD93\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"Get some rest and try again later.\"\nmsgstr \"\"\n\n#. Key:\t0BD769F745B35A106C7C0A83F6F9F246\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"All right so you just teleported me to this... what is this place?\"\nmsgstr \"\"\n\n#. Key:\t0C9ECC3745963AB1D1FB6487E97513F9\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_24.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_24.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"So right now this is the most proper place to test your Worthiness.\"\nmsgstr \"\"\n\n#. Key:\t1401CBDA425076C6AE74C9BF4558D8DD\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"You are not Worthy!\"\nmsgstr \"\"\n\n#. Key:\t21C3C1394F39821BC10FFFBE157AC5CF\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"Giving up is not an option.\"\nmsgstr \"\"\n\n#. Key:\t2E7222EA4858A0ADE9CE3C84CA27B993\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_5.Children(3).Children.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_5.Children(3).Children.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"Skip\"\nmsgstr \"\"\n\n#. Key:\t31BEA1764BA337B32B8038B31BE69C29\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"Farewell! I need to go now.\"\nmsgstr \"\"\n\n#. Key:\t36B9EA924E623AFE9BF0B98402235EA4\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"Focus on the trial!\"\nmsgstr \"\"\n\n#. Key:\t4A4A86684E5C5742A70FE383461AD89C\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"Venture further down into the Sewer! You will find the answer.\"\nmsgstr \"\"\n\n#. Key:\t54CA97394FDC12D0370C54995094819E\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"This trial will test your limits!\"\nmsgstr \"\"\n\n#. Key:\t5D820AA647AE2540DE6C2D8D6F6BF88A\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_5.Children(4).Children.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_5.Children(4).Children.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"Give seat\"\nmsgstr \"\"\n\n#. Key:\t5F6629ED4E0857BBBA46ED9C51306215\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_5.Children(2).Children.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_5.Children(2).Children.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"Restore\"\nmsgstr \"\"\n\n#. Key:\t618B587743F2F432D9D487AE0E909166\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"What?\"\nmsgstr \"\"\n\n#. Key:\t61D61006436DD6659A8846932697971A\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"Yes, you are!\"\nmsgstr \"\"\n\n#. Key:\t6225912A49C32068D10ADB9C31A6BA3E\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"Of course!\"\nmsgstr \"\"\n\n#. Key:\t7DD5FF4D47DF6A461D44DDBA056A4100\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"I shall yield you to the right path!\"\nmsgstr \"\"\n\n#. Key:\t8C3F3A364544B13A2C6687A99E6A792B\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"I'm fed up with your trial! Just teleport me back.\"\nmsgstr \"\"\n\n#. Key:\t903D03CE41FD835E75059587288D9A1B\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_23.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_23.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"There used to be an Arena here to test the Adventurers of the Realm, but it has been flooded with water for a hundred years.\"\nmsgstr \"\"\n\n#. Key:\t96C9A8DA496C0A8476E35AB942BE5EED\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"Am I Worthy?\"\nmsgstr \"\"\n\n#. Key:\t9826B62E48A67772A1850CADF1A83729\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_5.Children(1).Children.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_5.Children(1).Children.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"Where are we?\"\nmsgstr \"\"\n\n#. Key:\t9A94E4FC46E3896BE05136A2A9EA4AF5\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_27.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_27.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"We don't have time for this now.\"\nmsgstr \"\"\n\n#. Key:\t9B9B02AF404F9B8B9D8722A9006FC907\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"These are the remnants of the Ancient Sewer.\"\nmsgstr \"\"\n\n#. Key:\tAAB9F101475D1407B58BECB2DA5E508D\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"So how am I supposed to complete your Trial?\"\nmsgstr \"\"\n\n#. Key:\tAD3BADD6499C01410511E68C86F337C8\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"Your Worthiness has to be proven.\"\nmsgstr \"\"\n\n#. Key:\tC0BA510B4875AD24C53663B01964B309\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"Go now, the Trial awaits you!\"\nmsgstr \"\"\n\n#. Key:\tC252181740C4E256EDEB29B6B552BDD2\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"I'm tired, I will need some time to recover.\"\nmsgstr \"\"\n\n#. Key:\tCCD8D1DD4859B067482612A3A9F32C06\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_5.Children(5).Children.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_5.Children(5).Children.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"Leave\"\nmsgstr \"\"\n\n#. Key:\tCE0C3EBD41F17E82F8CF0E8D5E5E9F17\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"The Worthiness is strong in this one...\"\nmsgstr \"\"\n\n#. Key:\tD229B47146585D051BEFF493C53ED01B\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_26.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_26.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"Stop!\"\nmsgstr \"\"\n\n#. Key:\tF043B1BF47F617255071EC9DB44CB78A\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"You have proven yourself Worthy!\"\nmsgstr \"\"\n\n#. Key:\tFBBCA0E043F139F203D62DAD1599143E\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"Your Worthiness has been proven again!\"\nmsgstr \"\"\n\n#. Key:\tFE4F99AC4F23760ADD203083CA1497E3\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_25.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_25.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"I have found a...\"\nmsgstr \"\"\n\n#. Key:\t00AD8B3D44461E4DBF800F92DDF0C6F5\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_Gatekeeper_AfterBattle\"\nmsgid \"What?! I understand that for a new gate to open one would have to prove something, but... in this case... I accept that...\"\nmsgstr \"\"\n\n#. Key:\t0EC6953C4F07CFF6B7A13A9BCF224550\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_Gatekeeper_AfterBattle\"\nmsgid \"Enough!\"\nmsgstr \"\"\n\n#. Key:\t237714F14DC3F9D33F10E6B7761E47C4\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_Gatekeeper_AfterBattle\"\nmsgid \"What a coincidence! I also happen to be heading in that direction.\"\nmsgstr \"\"\n\n#. Key:\t28054AA74F9CEA976E653ABF5A5F5695\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_Gatekeeper_AfterBattle\"\nmsgid \"You can pass.\"\nmsgstr \"\"\n\n#. Key:\t3D5BAB214968DBB31BE03EBE32B2DE6C\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_Gatekeeper_AfterBattle\"\nmsgid \"Farewell my Ball Lord! May the Great Gate open for you when the time comes!\"\nmsgstr \"\"\n\n#. Key:\t4D497F814F476FFA7F2A66A937EAFF3E\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_Gatekeeper_AfterBattle\"\nmsgid \"Noooooo...\"\nmsgstr \"\"\n\n#. Key:\t4FEA82084C2E2E09FE6699B2FB353E04\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_Gatekeeper_AfterBattle\"\nmsgid \"Could you just let me pass? Please?\"\nmsgstr \"\"\n\n#. Key:\t50005F6248946893250282B0B7D134F2\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_Gatekeeper_AfterBattle\"\nmsgid \"You have proved your Worthiness.\"\nmsgstr \"\"\n\n#. Key:\t601E1BAC4E9C7A93B7A97AA787C14027\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_Gatekeeper_AfterBattle\"\nmsgid \"Farewell, Keeper!\"\nmsgstr \"\"\n\n#. Key:\t758788864E716DB2EC9F57B3042DC129\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_Gatekeeper_AfterBattle\"\nmsgid \"Ask him to take you to Crossroad Cave.\"\nmsgstr \"\"\n\n#. Key:\t8170CF2C42A1894899BA98B33AB39A3F\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_Gatekeeper_AfterBattle\"\nmsgid \"Wait! What?\"\nmsgstr \"\"\n\n#. Key:\t86B7E3D34F2206BB44B0F88001F9E8BA\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_Gatekeeper_AfterBattle\"\nmsgid \"Then if you accept, let the trial begin!\"\nmsgstr \"\"\n\n#. Key:\tCC7215014B87E0910413F1AEECE0492F\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_Gatekeeper_AfterBattle\"\nmsgid \"Where do you want to go, Sir? Command me.\"\nmsgstr \"\"\n\n#. Key:\tD5FBCE5C4C97766EF3A852A2D96D1D30\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_Gatekeeper_AfterBattle\"\nmsgid \"Crossroad Cave!\"\nmsgstr \"\"\n\n#. Key:\tE0032A09440BDE56BFAF2CBDBCFA2074\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_Gatekeeper_AfterBattle\"\nmsgid \"So be it!\"\nmsgstr \"\"\n\n#. Key:\tE8148F28483300CCD24473A30C028235\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_Gatekeeper_AfterBattle\"\nmsgid \"Once you have proven Worthy.\"\nmsgstr \"\"\n\n#. Key:\t0BE62CA44198CAA4B4AF7D844B79EEC3\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_3.Children(2).Children.Text\n#. Key:\t17D2B5D7409FBE7F215265B5A8CBF8F8\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_21.Children(2).Children.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_21.Children(2).Children.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_3.Children(2).Children.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"Leave\"\nmsgstr \"\"\n\n#. Key:\t2BFD355626080F0A003A025ABE793045\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_21.Children(0).Children.Text\n#. Key:\t2BFEA3D826080F0A003A025ABE79300B\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_3.Children(0).Children.Text\n#. Key:\t2C027C7626080F0A003A025ABE793F5F\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_18.Children(0).Children.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_18.Children(0).Children.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_21.Children(0).Children.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_3.Children(0).Children.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"Accept Challenge\"\nmsgstr \"\"\n\n#. Key:\t2EDD3BEF4707FD59FE1ACB9A105F7EFC\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_3.Children(1).Children.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_3.Children(1).Children.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"Give seat\"\nmsgstr \"\"\n\n#. Key:\t4E4229704C95B2C73050E1AF65A29847\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"Did you come back to prove yourself?\"\nmsgstr \"\"\n\n#. Key:\t55B70B0345422648BB579C8D4E42FE86\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_18.Children(1).Children.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_18.Children(1).Children.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"Maybe later\"\nmsgstr \"\"\n\n#. Key:\t62E33EC84A508E57233A6A9AF6DCDFBC\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"Only if you prove yourself worthy one more time.\"\nmsgstr \"\"\n\n#. Key:\t65A8C3BA420B4624960CBAB42930BB5F\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_13.Children(0).Children.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_13.Children(0).Children.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"Not fair\"\nmsgstr \"\"\n\n#. Key:\t688C407641B488D0FDC7F98D0F6CA826\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"Is that... is this really happening?\"\nmsgstr \"\"\n\n#. Key:\t77A739594D7ADA997DD300A7EE270D8F\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"I have found a seat that fits your size.\"\nmsgstr \"\"\n\n#. Key:\t8C9BCD2044EE9C5F4826D0B5C5CE22D4\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"Now... are you ready to prove yourself?\"\nmsgstr \"\"\n\n#. Key:\t8E33C12A42E9EAEDC20CD3B97F3AF9B2\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"Yes, I can.\"\nmsgstr \"\"\n\n#. Key:\t91849BD64325E5B9D8A366921D4D1AA9\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"The best challenges were set aside just for you!\"\nmsgstr \"\"\n\n#. Key:\t97D5940549A753A94A9F5AB46CCE14AF\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"I myself shall test your worthiness.\"\nmsgstr \"\"\n\n#. Key:\t9A158FA74FF1D9F99F5477856927AC90\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"I will make no exceptions! Your generous act gave me back my spirit. From now on I pledge to perform my task even better.\"\nmsgstr \"\"\n\n#. Key:\tA3863AD64404451005ECE392B123FFAE\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"Errr... maybe a bit later.\"\nmsgstr \"\"\n\n#. Key:\tAB2F0FFA45E0AF42B6035FA3D1F2D8DB\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"I am truly impressed. I will never forget about your kindness.\"\nmsgstr \"\"\n\n#. Key:\tB284259646C0236570CF489DDCD88A29\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"Are you ready to prove yourself?\"\nmsgstr \"\"\n\n#. Key:\tB57F0D0442C167DADE576A9CBD2B3E96\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"Thank you! You can have this RuneStone as a compensation.\"\nmsgstr \"\"\n\n#. Key:\tB5F8117A4514A4207059EF8CD1C59420\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"All right, let's do it!\"\nmsgstr \"\"\n\n#. Key:\tC7DFED0F43E17F90C02E3D94D6F24200\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"What? Can't you just open that gate?\"\nmsgstr \"\"\n\n#. Key:\tCC1CBB8E4F710B337B3BCC8CB01DB8CE\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"Well that's very... kind of you, I guess.\"\nmsgstr \"\"\n\n#. Key:\tDE0225744DA0777DC12392ABB187D653\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"Keeper! Can you open a Portal?\"\nmsgstr \"\"\n\n#. Key:\tDF53D02F4A6CD307A559E5BADBEF22FA\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_13.Children(1).Children.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_13.Children(1).Children.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"You are welcome\"\nmsgstr \"\"\n\n#. Key:\tF0A6481A46B5FC65944D35ABFE94FA7E\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_21.Children(1).Children.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_21.Children(1).Children.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"Give Seat\"\nmsgstr \"\"\n\n#. Key:\tFF3C850143B6609D7B1B878B8DEB8A13\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"This is your final trial.\"\nmsgstr \"\"\n\n#. Key:\t018CF7BC4272B09AF7B646B0F9B2EB11\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_55.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_55.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"How did it happen? How was everything destroyed?\"\nmsgstr \"\"\n\n#. Key:\t0BF674C94942E4E32FCB09BD7E7059B0\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_23.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_23.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"Those who stayed died.\"\nmsgstr \"\"\n\n#. Key:\t1BFE1DBE471281F60970F8BEBFDD6E40\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"It’s nice of the Mirror that he still remembers me. Could you give this flower to him to express my thankfulness?\"\nmsgstr \"\"\n\n#. Key:\t2158D7A1470944D529FF138AB883DC10\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"Who lived in this Realm? Where are they now?\"\nmsgstr \"\"\n\n#. Key:\t2CCCBA97402EEFD5248D929680B0FF01\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_26.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_26.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"What was the Realm like before?\"\nmsgstr \"\"\n\n#. Key:\t32DA4503499D5A01CB1E7DA7B51B4EB5\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_29.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_29.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"Majestic castles and towers up until the sky. The air fresh, the sun shining.\"\nmsgstr \"\"\n\n#. Key:\t35903E9F471EECEC779D879565E189B6\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_12.Children(1).Children.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_12.Children(1).Children.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"Who lived here?\"\nmsgstr \"\"\n\n#. Key:\t3AD2CA8148AA6397B3D8818063269D67\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_14.Children(1).Children.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_14.Children(1).Children.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"No way\"\nmsgstr \"\"\n\n#. Key:\t3D4AF37842FD602384F0C79F2949BD07\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_14.Children(0).Children.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_14.Children(0).Children.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"Of course\"\nmsgstr \"\"\n\n#. Key:\t41B0D00048A85B7122834B8F731AA8B4\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_25.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_25.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"Ruin preserves them. They can’t get old and die. Some of them are still visiting these parts of the Realm, but they no longer know what they are looking for.\"\nmsgstr \"\"\n\n#. Key:\t47D0395F4DD63A6E2F68018719DC2CCD\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"Thank you!\"\nmsgstr \"\"\n\n#. Key:\t57614F674FD8F9A5CF8CC0AFA4D57F37\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_12.Children(0).Children.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_12.Children(0).Children.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"Magic Mirror\"\nmsgstr \"\"\n\n#. Key:\t5B00385B409CA39C5F2AFDA0E75EC4A0\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"I'm not a postman. Find someone else!\"\nmsgstr \"\"\n\n#. Key:\t5C83B0604CB1616D07BE209C08AE57B6\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_27.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_27.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"It was a wonderful world, full of life and joy.\"\nmsgstr \"\"\n\n#. Key:\t66409DBC4D55F6190D6F429F81CE7C0F\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_12.Children(2).Children.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_12.Children(2).Children.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"Realm's past\"\nmsgstr \"\"\n\n#. Key:\t6728BD15433EBCF47B42DA8D84F3777C\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"I'll remember you!\"\nmsgstr \"\"\n\n#. Key:\t764C9E864C4C345638C2A2B4019CE5FA\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"Sure, I will deliver the flower!\"\nmsgstr \"\"\n\n#. Key:\t7F42828D4976A3366581BE9E067F3982\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_24.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_24.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"Those who escaped changed in body and mind.\"\nmsgstr \"\"\n\n#. Key:\t858E8AD741D48CFB58B94ABA5A6FCE9A\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"No problem. It doesn’t matter anyway.\"\nmsgstr \"\"\n\n#. Key:\t86DBF2164E3B1C4057320E8FC526AE5F\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_12.Children(3).Children.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_12.Children(3).Children.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"Cataclysm\"\nmsgstr \"\"\n\n#. Key:\t8C0E746A4C00A7B4792706A042588AA3\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_58.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_58.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"Until one day many of the imprisoned spirits broke loose from the golem bodies.\"\nmsgstr \"\"\n\n#. Key:\t8DCB54DC429D8E328B791FA18261EBE4\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_30.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_30.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"Until it was all gone.\"\nmsgstr \"\"\n\n#. Key:\t933737274ACAC51A980A6985E9B985D2\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"I am here so that the past is not forgotten until the very end. Have some rest and remember!\"\nmsgstr \"\"\n\n#. Key:\t9A6C35C143F4B6845772D4AF6C4C6213\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_56.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_56.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"The Golem Makers went too far. They made thousands and thousands of golems.\"\nmsgstr \"\"\n\n#. Key:\t9E254E4D4CA6D256A7EC8CA8ADC6EF19\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"Would you like to hear some other tales?\"\nmsgstr \"\"\n\n#. Key:\tAC50E6794072B525FD9144AB9B722F74\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_57.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_57.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"They always cared about the new ones and forgot about the obsolete ones.\"\nmsgstr \"\"\n\n#. Key:\tC03F20E6477984A6691145A40535FBBD\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_60.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_60.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"Is there anything else you want me to remember?\"\nmsgstr \"\"\n\n#. Key:\tC9E74A374ED9F47999AA56BD16466899\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"The streets were clear and bright, trees and flowers everywhere.\"\nmsgstr \"\"\n\n#. Key:\tCF0209FF4BC57A750F52F2B3CC710A6E\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"I think it likes you.\"\nmsgstr \"\"\n\n#. Key:\tD11D82FA4AE733D55DCBA692A2A3C0C7\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"Now they are all gone.\"\nmsgstr \"\"\n\n#. Key:\tD88C72AE460756D4B619D7B8F924C7BB\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"Oh, there were many: proud, wise, brave, clever and majestic.\"\nmsgstr \"\"\n\n#. Key:\tDEA408E54892798F0112B0A92EE34D3A\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_12.Children(4).Children.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_12.Children(4).Children.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"Leave\"\nmsgstr \"\"\n\n#. Key:\tEA384D06419AAB835765CF8D6ECE6495\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_59.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_59.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"They are what is now called Ruin. The power which is destroying the Realm.\"\nmsgstr \"\"\n\n#. Key:\tED8571C94BCCF0F083CAD2A7439C10AA\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"I’ve met with a Magic Mirror who showed a picture of you.\"\nmsgstr \"\"\n\n#. Key:\tF5C7F8254D29767753AEA3AB446B9B6E\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"I've got to go now.\"\nmsgstr \"\"\n\n#. Key:\tF9E140154471CC466095ADBFF652E94D\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"Ask if you need to know more. I'll remember.\"\nmsgstr \"\"\n\n#. Key:\t04527B3745611117185CC09C4CD9018E\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"That’s more like it!\"\nmsgstr \"\"\n\n#. Key:\t11C31D4D4DFD60259D68FCB3CD8E641E\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_13.Children(2).Children.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_13.Children(2).Children.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"Retreat\"\nmsgstr \"\"\n\n#. Key:\t29C3FE594DDD364CEED5EA9304BFAC43\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"How can I prove that I'm worthy?\"\nmsgstr \"\"\n\n#. Key:\t2BC9EBB6451DB66B7767F1A0B663A06D\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"That’s awful, let’s try it in a different tone.\"\nmsgstr \"\"\n\n#. Key:\t2BD75DF026080F0A003A0178BE75C345\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"Behold traveler!\"\nmsgstr \"\"\n\n#. Key:\t302884BD4A306FB9614C51AF4790FAE4\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_13.Children(0).Children.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_13.Children(0).Children.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"How to prove?\"\nmsgstr \"\"\n\n#. Key:\t370AC3D04CB9F6E443CAC2A8E270F289\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"No problem I don't really want to pass that gate anyway.\"\nmsgstr \"\"\n\n#. Key:\t4E231ED94F0794AE6342A8A2C7644D51\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"I am the Gatekeeper. I will only open this door if you prove to be worthy.\"\nmsgstr \"\"\n\n#. Key:\t4F30265A4D22C52371CC8E9E188B2718\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"Open, now!\"\nmsgstr \"\"\n\n#. Key:\t56B5D73646C6823598232BB3D2577305\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"Ask him to open the door.\"\nmsgstr \"\"\n\n#. Key:\t7A52E2E14341A8CDBD77A4A30DDA22E3\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_13.Children(1).Children.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_13.Children(1).Children.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"Please let me in\"\nmsgstr \"\"\n\n#. Key:\t835098BD4F5D14FAACF1209850607E04\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_15.Children(0).Children.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_15.Children(0).Children.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"Accept Challenge.\"\nmsgstr \"\"\n\n#. Key:\t83E15A3C46A1D2D4CE4FDDBE81130106\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"No way! Nobody can skip the Trial!\"\nmsgstr \"\"\n\n#. Key:\t86D9667C43253BBFFA43E4ABED24369B\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"Still not...\"\nmsgstr \"\"\n\n#. Key:\t94A0124A401BA0CD029255B7D01E087E\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"There is no turning back now. The Trial awaits you!\"\nmsgstr \"\"\n\n#. Key:\t964E5DC7491720F8C3EA53936CBC1DEA\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"The Trial will test you!\"\nmsgstr \"\"\n\n#. Key:\tA38AC02A4C258F538AC26686207D505F\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"...\"\nmsgstr \"\"\n\n#. Key:\tABA8061E4F631608D712A0BDBC6D90D1\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"Ah, you can't speak! Hmm... Try now!\"\nmsgstr \"\"\n\n#. Key:\tDA4C66AB4F7798DAD95EC5B83D422A03\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"Could you just let me pass this time?\"\nmsgstr \"\"\n\n#. Key:\tF09A0C3F4BEA6AFBC9EE52AEB6A740AB\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"Open that gate, Keeper!\"\nmsgstr \"\"\n\n#. Key:\tF32B1FEC4BB33670D336D28832F04312\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"I can only open this door for those who prove worthy.\"\nmsgstr \"\"\n\n#. Key:\tFB74F24C4B8C2E6B4368B19D77F71606\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"Please, open the...\"\nmsgstr \"\"\n\n#. Key:\t0BAD4DEA4009823275249FB31070D002\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_7.Children(1).Children.Text\n#. Key:\t2F2169444BBDC9843E1B7DAEDE7F5104\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_4.Children(1).Children.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_4.Children(1).Children.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_7.Children(1).Children.Text\nmsgctxt \"Dialogue_GGGateKeeper2\"\nmsgid \"Leave\"\nmsgstr \"\"\n\n#. Key:\t36FDC8384686644248F76B9EF8A22038\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_GGGateKeeper2\"\nmsgid \"Here we go again...\"\nmsgstr \"\"\n\n#. Key:\t3D7557464E3E19A1CF3447B555D4977D\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_GGGateKeeper2\"\nmsgid \"Well, of course.\"\nmsgstr \"\"\n\n#. Key:\t5463C10D4C56C2CD40338A9E5C33D995\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_GGGateKeeper2\"\nmsgid \"You know the rules.\"\nmsgstr \"\"\n\n#. Key:\t6E1915BC4A79E949C10BDCAADDA1E481\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_7.Children(0).Children.Text\n#. Key:\tACC5EBF441036AE06D207281CBE054D9\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_4.Children(0).Children.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_4.Children(0).Children.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_7.Children(0).Children.Text\nmsgctxt \"Dialogue_GGGateKeeper2\"\nmsgid \"Accept Challenge\"\nmsgstr \"\"\n\n#. Key:\tA5CD165646DA7D531D23F7AAE5B0D701\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_GGGateKeeper2\"\nmsgid \"I mean: You shall not pass unless you prove yourself worthy!\"\nmsgstr \"\"\n\n#. Key:\tBABC111D4B5743B296E6AD84659E1910\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_GGGateKeeper2\"\nmsgid \"You shall not pass!!\"\nmsgstr \"\"\n\n#. Key:\tCAF6CA2C4159145B5FE684995956F155\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_GGGateKeeper2\"\nmsgid \"What?? I thought I will need to prove myself worthy.\"\nmsgstr \"\"\n\n#. Key:\t31B0B4214FE4324029BAB2A75CF7D1EA\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/GGSurviverNote.GGSurviverNote:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/GGSurviverNote.GGSurviverNote:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_GGSurviverNote\"\nmsgid \"'I made this statue to give me shelter from the Cataclysm. Only magic can keep it away.'\"\nmsgstr \"\"\n\n#. Key:\t852F18354CA9C8D46192CBBD14A325F7\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/GGSurviverNote.GGSurviverNote:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/GGSurviverNote.GGSurviverNote:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_GGSurviverNote\"\nmsgid \"'Cerulean is still safe. I managed to steal the Gem to open the Gate but I can’t use it.'\"\nmsgstr \"\"\n\n#. Key:\tDF72F90C478E18CFE9211C85CEF9ECBF\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/GGSurviverNote.GGSurviverNote:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/GGSurviverNote.GGSurviverNote:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_GGSurviverNote\"\nmsgid \"'I am doomed.'\"\nmsgstr \"\"\n\n#. Key:\t04737EC246700D406DAB46BE8091D09C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_1.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_1.Children(0).Children.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Sure\"\nmsgstr \"\"\n\n#. Key:\t09BB4D9F428A5390E5F2ABA019B3ACDC\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_34.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_34.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Help you?! This is a courthouse not some charity club!\"\nmsgstr \"\"\n\n#. Key:\t0C7D87814BD76EAFE2DCB19B973F0D82\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_52.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_52.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"You know I heavily rely on my abacus. But being a ghost and all I can’t really use it.\"\nmsgstr \"\"\n\n#. Key:\t0E3535844D16D540C576AC9889D237C8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"I’m looking for three artefacts. Do you know anything about them?\"\nmsgstr \"\"\n\n#. Key:\t0EB00CBB41338DE6294D6EAC2DE999B4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Actually it’s kinda awesome!\"\nmsgstr \"\"\n\n#. Key:\t158F86F04D0040AA3D2814A674252E45\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Returning again and again is not a crime but maybe we should reconsider the Law regarding this statement.\"\nmsgstr \"\"\n\n#. Key:\t15D395F84D3DBC3CCBC74988369A74DA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_27.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_27.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"The Law says many things about being dad but nothing about being dead...\"\nmsgstr \"\"\n\n#. Key:\t2487D3CC4FCE404BEC866287E2057B3F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"I can’t rest until the Case is solved.\"\nmsgstr \"\"\n\n#. Key:\t2D976CD148FB41389A53ED8E499822B4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_54.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_54.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Could you get me a ghost abacus?\"\nmsgstr \"\"\n\n#. Key:\t2F25CC2042D67E3AFB6F3FB5E1DF624D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_38.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_38.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Sure whatever...\"\nmsgstr \"\"\n\n#. Key:\t344253F4469C163E87496A97C193F0A8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_31.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_31.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"If you found her please escort her to the Room of the Law so that her vicious acts can be judged.\"\nmsgstr \"\"\n\n#. Key:\t34D243A343CDFEA68F2FAB88A4190464\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_5.Children(2).Children.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_5.Children(2).Children.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"You are dead\"\nmsgstr \"\"\n\n#. Key:\t367BD6CD40B7364D09A19A9F5F833937\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Could you help me? I'm forced into this Realm by a Wizard.\"\nmsgstr \"\"\n\n#. Key:\t3BD4BD5742532C2DB9536F9540EA3D75\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_32.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_32.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Ah, even the World will be over sooner than all our cases.\"\nmsgstr \"\"\n\n#. Key:\t45882C3C4470919D71E321BF5E1183B9\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_56.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_56.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"I've made you a Ghost Abacus.\"\nmsgstr \"\"\n\n#. Key:\t482C838F4E946005A3E4CAAB80DFE37F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_35.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_35.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"And being a Wizard is strictly forbidden! If I manage to prove you have some connection with that criminal Wizard I will judge you as well!\"\nmsgstr \"\"\n\n#. Key:\t489CE6C840D8C3430F07FCBC8BAF3F6B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_23.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_23.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"The Law never writes it would be forbidden to be a walking ball. Therefore it is not a problem.\"\nmsgstr \"\"\n\n#. Key:\t512723AF4B51C5A843BEACBEA5427877\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Staring like that is strictly forbidden!\"\nmsgstr \"\"\n\n#. Key:\t5215675A4B0974C8993858B9F5D6A404\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"The Case of the Gnome traveller. A really complicated one.\"\nmsgstr \"\"\n\n#. Key:\t6922D9F143A5295C7C2D22A71EA4125B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_29.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_29.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Makes sense...\"\nmsgstr \"\"\n\n#. Key:\t74955E464A85ED006FF47894FD09BD28\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_4.Text\n#. Key:\tE7F9297B4FF3956A965042AA9D870A07\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_37.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_37.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"The Law says that.\"\nmsgstr \"\"\n\n#. Key:\t74BCB9E04AB452BA2A11088F25DD2FED\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"I guess they forgot to tell you but work time is long over...\"\nmsgstr \"\"\n\n#. Key:\t74F34750433EF722E89F8F85A871CE1B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_59.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_59.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Take this as a reward!\"\nmsgstr \"\"\n\n#. Key:\t766B27FA455983F70AE1F4BA56F4C1B3\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_57.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_57.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"How wondrous! I’m sure this will reduce my research time with years!\"\nmsgstr \"\"\n\n#. Key:\t784D8662443EA775B9554EAEB4C6CB8F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"You are guilty for bouncing too loudly! Just like my uncle...\"\nmsgstr \"\"\n\n#. Key:\t791A095948CFB22CCAF59EAFC60D74EA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_0.SpeechSequence(1).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_0.SpeechSequence(1).SpeechSequence.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"We had to reread all the rules to find out if there is anything about this.\"\nmsgstr \"\"\n\n#. Key:\t7CBAE1084FC39423BBD706A9F939BB14\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"So what is this case you are working on?\"\nmsgstr \"\"\n\n#. Key:\t7DBA70D14A4EDDE22DABBBB75800865A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_5.Children(3).Children.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_5.Children(3).Children.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Help\"\nmsgstr \"\"\n\n#. Key:\t7DDD963C45C30134FA79CEAA1834C270\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_1.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_1.Children(1).Children.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"No way\"\nmsgstr \"\"\n\n#. Key:\t7E1EAB78482CF915AF8A96BA8E0A47F1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Just give me some more time and I will prove that you are guilty.\"\nmsgstr \"\"\n\n#. Key:\t7E2FD8D443438BEFF933D1BA0F691A41\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_1.SpeechSequence(2).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_1.SpeechSequence(2).SpeechSequence.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Such a tragic death! Now I need to start everything from the beginning!\"\nmsgstr \"\"\n\n#. Key:\t7EA289C94C6CF1E43AE0B291AD0A1133\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_30.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_30.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Yes, she is a criminal for inhabiting the body of a cat. That is strictly forbidden!\"\nmsgstr \"\"\n\n#. Key:\t80596D1B4384F83D73655AB76B2FA2D0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Incorrect. It is not.\"\nmsgstr \"\"\n\n#. Key:\t81C42F5340469CBB4AD780B01E7F02F8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_5.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_5.Children(1).Children.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Case\"\nmsgstr \"\"\n\n#. Key:\t830C84A74369239E2839638F8918E086\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_5.Children(4).Children.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_5.Children(4).Children.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Artefacts\"\nmsgstr \"\"\n\n#. Key:\t9090EFE44CB8D7F54F996B970D9A97D2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Don’t disturb me!\"\nmsgstr \"\"\n\n#. Key:\t90F79FAC440FB22F0A6BFCABE0963454\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_33.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_33.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"That’s very likely.\"\nmsgstr \"\"\n\n#. Key:\t9600587D4E3C5B6F2C120BBFB9D40D6A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"What?\"\nmsgstr \"\"\n\n#. Key:\t96945AA143EF1F1B7CE4C0B8EEE4096F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_51.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_51.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"All right I was just asking. It’s not forbidden. At least in this case.\"\nmsgstr \"\"\n\n#. Key:\t970DBE99476C7799B4B803B2EECE7E95\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"You are dead. Isn’t that a problem?\"\nmsgstr \"\"\n\n#. Key:\t9B06B22F44D389959A3C99924145EAE7\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Do you know a girl called Lillian?\"\nmsgstr \"\"\n\n#. Key:\t9C1B37574F81FDF4D3F03890504E3490\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Well, to be honest it is.\"\nmsgstr \"\"\n\n#. Key:\t9EE15BCA450900DEFFB839856BA78E09\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_55.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_55.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"I’ll see what I can do...\"\nmsgstr \"\"\n\n#. Key:\t9F3FBDE041EA6FDB7B30ECA1547E49A0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_0.SpeechSequence(3).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_0.SpeechSequence(3).SpeechSequence.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"We almost finished the process when the Gnome Traveller died of waiting.\"\nmsgstr \"\"\n\n#. Key:\tA22CEEE34864BC25EECFF2BAED83789F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_18.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_18.Children(0).Children.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"It is\"\nmsgstr \"\"\n\n#. Key:\tA69BCEA14AD8A07AC8CC35871548973A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_5.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_5.Children(0).Children.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Give Abacus\"\nmsgstr \"\"\n\n#. Key:\tA7B9690142A3832182C004A99797AB21\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_26.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_26.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"And how about being dead?\"\nmsgstr \"\"\n\n#. Key:\tA7EDDDCF423FF086BC0D0A891D232C87\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_0.SpeechSequence(0).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_0.SpeechSequence(0).SpeechSequence.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"He asked for permission to use the Railway. Which is really unusual. Before him only dwarves used the Railways.\"\nmsgstr \"\"\n\n#. Key:\tA9FCBAD04E16A880C3E52AAA35864E35\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Respect the Law!\"\nmsgstr \"\"\n\n#. Key:\tAA3210BC4B1C0875817CCDB5F4922AFA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_1.SpeechSequence(0).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_1.SpeechSequence(0).SpeechSequence.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"It’s not that simple. In his testament he asked us to bring his corpse home, on the railway.\"\nmsgstr \"\"\n\n#. Key:\tAA9613C041229946AD0033806D77D398\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_49.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_49.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"What can I do for you?\"\nmsgstr \"\"\n\n#. Key:\tB2D504404A8475C7EFB445AFDA8597A9\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_5.Children(6).Children.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_5.Children(6).Children.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Leave\"\nmsgstr \"\"\n\n#. Key:\tB3A305B84320145E4C0437B7ED50C5B9\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_25.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_25.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"The Law doesn’t forbid walking for balls. I guess you are right then.\"\nmsgstr \"\"\n\n#. Key:\tB3E56D56494153D0C17355A59EC3F0E6\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Rest... err... work in peace!\"\nmsgstr \"\"\n\n#. Key:\tB69AD6FC4D8373491561CFBCF26C2397\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_1.SpeechSequence(3).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_1.SpeechSequence(3).SpeechSequence.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Could you help me?\"\nmsgstr \"\"\n\n#. Key:\tBCFFF4F345E59362764C9AA6582C683C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_0.SpeechSequence(2).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_0.SpeechSequence(2).SpeechSequence.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"When we found out there are none, so we needed to create new rules. But for that we had to reread all the existing rules again.\"\nmsgstr \"\"\n\n#. Key:\tC5FDD0A14882D8F74A97B1BD53AFD4FE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_36.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_36.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"I don’t. But keep in mind if they were stolen and you find them you have to give them to the Dwarven King.\"\nmsgstr \"\"\n\n#. Key:\tC81E287C4B4EF5B5E77E25A480FC2AEE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_18.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_18.Children(1).Children.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Not at all\"\nmsgstr \"\"\n\n#. Key:\tCCF4D5D04B8D4C57AAA75ABC5F9A1384\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_50.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_50.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"No, no, no! I have other things to do.\"\nmsgstr \"\"\n\n#. Key:\tCD5EF4DE4D29CC774EB5A69A8A65CD95\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_5.Children(5).Children.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_5.Children(5).Children.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Lillian\"\nmsgstr \"\"\n\n#. Key:\tCFC9A6294B4D0653CA9B3384CBD2BC29\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_58.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_58.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Thank you! Thank you!\"\nmsgstr \"\"\n\n#. Key:\tCFEFA4DD4AFEF91C834684A49DFB5890\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_39.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_39.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"What crime did the Gnome commit?\"\nmsgstr \"\"\n\n#. Key:\tD83C186746373C67E8877594AA3523B8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_53.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_53.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"When I touch it my fingers slip past the abacus, I can’t move it.\"\nmsgstr \"\"\n\n#. Key:\tE00518FA4279FE57E9640F9007E4BC35\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_44.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_44.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"I would call that case solved...\"\nmsgstr \"\"\n\n#. Key:\tE8F4BE4848BE2E257972D09391B0F296\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_1.SpeechSequence(1).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_1.SpeechSequence(1).SpeechSequence.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"We decided that Gnomes can use the Railway, but how about Gnome Corpses? That’s a totally different issue.\"\nmsgstr \"\"\n\n#. Key:\tEB5B1E474DCFFCF9A38190B8FFAB7C50\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"I guess the same rules apply.\"\nmsgstr \"\"\n\n#. Key:\tEB5BFBDC40E1D6A1D5C054AD8B6424FD\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_24.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_24.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Hmmm... Let me see...\"\nmsgstr \"\"\n\n#. Key:\tEF50A43049824F390D61A3A58D44185A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"And you are a walking ball. Isn’t that a problem?\"\nmsgstr \"\"\n\n#. Key:\t01E5D5DE4524C5AECBE8DAA5A5C3047D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_111.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_111.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Fishy warns you! This path is dangerous! Turn back! Explore other places!\"\nmsgstr \"\"\n\n#. Key:\t036B0B0E41C74704A5ED648091D58AB0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_65.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_65.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Long story short I almost reached the Outpost when my cargo went into a pothole and my wheel was broken.\"\nmsgstr \"\"\n\n#. Key:\t03B6BE674D69EF12EB862EB77CDC7F57\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_97.Text\n#. Key:\t4475043D4A9CFD057ED34FBB9695EC86\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_113.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_113.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_97.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Then I will give it for 10 Gold Coins.\"\nmsgstr \"\"\n\n#. Key:\t0405D11C4961CFB7941F0F9727F80EAD\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_108.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_108.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"9 Gold I won't go any lower!\"\nmsgstr \"\"\n\n#. Key:\t069FA4C94559002699885EACD6422FC7\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_115.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_115.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Such an insult! How dare you?\"\nmsgstr \"\"\n\n#. Key:\t114F9B9345D0965FE6EFC592E29477FE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_54.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_54.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Wohoo! I have some really epic names just for you! Each name costs a Single Gold coin!\"\nmsgstr \"\"\n\n#. Key:\t1164C89641A9E4970985919C8E86936E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(5).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(5).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Help me?\"\nmsgstr \"\"\n\n#. Key:\t11E01CA843185266C441ACBC460A5B06\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_39.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_39.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Do you really want to help me?\"\nmsgstr \"\"\n\n#. Key:\t12F669184834CDC0466BA4A72BE38420\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Oh, you come to visit old Gnory again.\"\nmsgstr \"\"\n\n#. Key:\t148C738E422B1C7889EF8CAEF1E6D115\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(7).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(7).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Lory\"\nmsgstr \"\"\n\n#. Key:\t14A787EF447C5AD6579ADDB271BD9B7E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_54.Children(2).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_54.Children(2).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Warlorb\"\nmsgstr \"\"\n\n#. Key:\t14F4A36B4D34364D1BBB2DAAFA745C41\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_SpeechSequence_0.SpeechSequence(1).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_SpeechSequence_0.SpeechSequence(1).SpeechSequence.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"I so hated them...\"\nmsgstr \"\"\n\n#. Key:\t162A7A25421FFB9B368D60A9BC76FD38\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Oh, the three artefacts! That sounds a bit too ambitious but after all, they can be quite a unique gift for a young ball lady.\"\nmsgstr \"\"\n\n#. Key:\t166AAF5241332C7954631F9D568B227B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_46.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_46.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"For everything as well.\"\nmsgstr \"\"\n\n#. Key:\t19190B2142877E8CBB6F6D8FBB8D2DB1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_42.Text\n#. Key:\t39E546F34A9886487CD938A70468AEC6\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_59.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_42.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_59.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"What?\"\nmsgstr \"\"\n\n#. Key:\t1AF2DDE74542524EEF19CA9567CFBDAF\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_58.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_58.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"{name}? It still sounds a bit weird, but I think I might like it.\"\nmsgstr \"\"\n\n#. Key:\t22D86B8644CA5BFD8D4CA593C5E3A271\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_54.Children(4).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_54.Children(4).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Dr. Ball\"\nmsgstr \"\"\n\n#. Key:\t2301BDF7421BB3665BED5F92074BB5A2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_84.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_84.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"I’ve found a wheel for you!\"\nmsgstr \"\"\n\n#. Key:\t25502F154A957ECD33B65E879E65B48B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_56.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_56.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"That's sad. Come back when you have some!\"\nmsgstr \"\"\n\n#. Key:\t27BF125B4C46E41F58FD45947F1F5CF8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_49.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_49.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Fishy is Fishy!\"\nmsgstr \"\"\n\n#. Key:\t294C4DCC4E8A3A07F15BC8B8C1934BB0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_36.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_36.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"I've got to go now!\"\nmsgstr \"\"\n\n#. Key:\t29EEF2B44C1FAE2BBA7518A685FC99B0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"An elixir that makes you attractive to the lady... err... balls?\"\nmsgstr \"\"\n\n#. Key:\t2A8B24AE4D7C120048DEF2A76FD6D787\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(9).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(9).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Leave\"\nmsgstr \"\"\n\n#. Key:\t2AC10A9B434CEADBA53C1F8C1DB0A26D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_41.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_41.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"I have some at my shop for sale!\"\nmsgstr \"\"\n\n#. Key:\t2FCB0CE9458F40E2B6738B93937283D2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_107.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_107.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"See? And I have to listen to him all day!\"\nmsgstr \"\"\n\n#. Key:\t303548794492148A0C7CE9961AB48C77\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_92.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_92.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"It's yours for 12 Gold Coins.\"\nmsgstr \"\"\n\n#. Key:\t303B74844F6BC0691F880B970403BE91\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_106.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_106.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Then I will give it for 8 Gold Coins.\"\nmsgstr \"\"\n\n#. Key:\t31FAEB004D0A1ED819BEF4BC369D9FD5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_51.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_51.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"I see one of your wagon wheels is broken.\"\nmsgstr \"\"\n\n#. Key:\t336F7E9E46DDE33326081E937EC0024A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Don’t care about Fishy. He can’t really speak and I’m not sure if he even understands himself.\"\nmsgstr \"\"\n\n#. Key:\t339A52E04EF86F99DE9BCEAA78F29025\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_66.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_66.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"See you later!\"\nmsgstr \"\"\n\n#. Key:\t34076BD4489E7C92D8DCB9BC1668B775\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_6.Text\n#. Key:\t5FC68B30456EA7BB5A381780426E2279\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_73.Text\n#. Key:\t89C71F00406C5A31D196B4994CEBBA22\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_50.Text\n#. Key:\t93A76F294E3B6B5AB77DD5A04E76F681\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_83.Text\n#. Key:\t9C69D11144FA077481C6C9865E6ED34A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_80.Text\n#. Key:\tA28EA457442D0820F3633A8ECACEDC75\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_76.Text\n#. Key:\tCC8A6DB3424E6813002643A97EFE6644\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_50.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_73.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_76.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_80.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_83.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Shut up Fishy!\"\nmsgstr \"\"\n\n#. Key:\t365CB4EB4F04825B34F4ADB42F238552\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_85.Children(2).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_85.Children(2).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"12 Gold\"\nmsgstr \"\"\n\n#. Key:\t3E650BC4417E6A004AF4549F412B1AF4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_26.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_26.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Ehm, ehm...\"\nmsgstr \"\"\n\n#. Key:\t3E904B7D4D5694B715AC268086A4DB2F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_78.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_78.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"I’ve met another merchant called Lory. Is she your sister you talked about?\"\nmsgstr \"\"\n\n#. Key:\t3EB6AD0C4D8896D36393BE878D3D641E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_100.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_100.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"What the holy Coins?! Now I'm getting angry!\"\nmsgstr \"\"\n\n#. Key:\t43099059444ABE91D004D5992065A06F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_7.Text\n#. Key:\t5A2D69454EA8354F3DE4E6BB9D7BD912\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"And Fishy!\"\nmsgstr \"\"\n\n#. Key:\t43602C93451F3A59EB067ABF7A525D41\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Fishy know about them!\"\nmsgstr \"\"\n\n#. Key:\t43C2553447FC63D25E26E79ACE5D7316\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_74.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_74.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"He was a good merchant, so he understood. Business is hard. I always say that for a fair price I would even sell myself.\"\nmsgstr \"\"\n\n#. Key:\t477984834246057BF894629ABEA2F0CB\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_116.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_116.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"You know what? 9 Gold Coins! Take it or leave it that's my final offer!\"\nmsgstr \"\"\n\n#. Key:\t477CBB8C451F6255A8A4FAAE8272F700\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_54.Children(5).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_54.Children(5).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Don't buy\"\nmsgstr \"\"\n\n#. Key:\t494F3D164E51E73CC76FD689BF2A4435\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_110.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_110.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Then I will give it for 9 Gold Coins.\"\nmsgstr \"\"\n\n#. Key:\t4CBFFCE24BDAFBA592E846A4C6827F21\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_102.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_102.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"All right, you won. I will give it for 11 Gold Coins.\"\nmsgstr \"\"\n\n#. Key:\t4D29AE254413D052D6FAA7AA259E2618\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_45.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_45.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"I see you do have a solution for everything.\"\nmsgstr \"\"\n\n#. Key:\t4EACFFA1414DBB56AA162789D34C76F2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_61.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_61.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Wow, that's magnificent!\"\nmsgstr \"\"\n\n#. Key:\t4F5CF94B464ED01AB43521A56D7C3B13\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_53.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_53.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"I want to buy a new name!\"\nmsgstr \"\"\n\n#. Key:\t51F2252D44A1B1B8B407938C06378303\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Fishy know a poem.\"\nmsgstr \"\"\n\n#. Key:\t540DEA6540589E8E9BD5789F708F1D95\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_85.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_85.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"How much do you charge for it?\"\nmsgstr \"\"\n\n#. Key:\t551FA87F4EC33961257CFBA46B24E39C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_25.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_25.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Oh, holy golden coins please no...\"\nmsgstr \"\"\n\n#. Key:\t55C0627D41EBB98609EDA49E36CE00F3\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_87.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_87.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Tummm-dummm I would sell the whole World but who could possibly buy it?\\r\\nUhhh... Yes?\"\nmsgstr \"\"\n\n#. Key:\t5977C80F49FF140CD397C1A3079F8A4C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_54.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_54.Children(1).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Ultimate Frisbee\"\nmsgstr \"\"\n\n#. Key:\t5D529690413CAE4F496DF4B7A3627528\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(6).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(6).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Broken wheel?\"\nmsgstr \"\"\n\n#. Key:\t5D632016493E1D06116399A364FD3835\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_67.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_67.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Take care and don't spend Gold anywhere else!\"\nmsgstr \"\"\n\n#. Key:\t5F1DF4B44C4E82D6A5FDB6BDF5172AEA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_96.Text\n#. Key:\t9592C2144A7237D49EC42E898AB73642\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_105.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_105.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_96.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"How about 10?\"\nmsgstr \"\"\n\n#. Key:\t6179A2AF43798114CFEE12900CDAF8CA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_60.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_60.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Good choice!\"\nmsgstr \"\"\n\n#. Key:\t6185906046DAF51843A52FA2FE2CF5AC\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_101.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_101.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"11 Gold Coins! Take it or leave it that's my final offer!\"\nmsgstr \"\"\n\n#. Key:\t655C05DA44E2BCB7DCF0D38DFAD6182C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Let him tell the poem!\"\nmsgstr \"\"\n\n#. Key:\t68761B744A892F85CEDB19B8DD6D9649\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_SpeechSequence_0.SpeechSequence(2).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_SpeechSequence_0.SpeechSequence(2).SpeechSequence.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Then I found out there is a Dwarven Outpost here which is still populated.\"\nmsgstr \"\"\n\n#. Key:\t6D8190E2491C99D14C4E37AA8F01E0BC\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"In Crossroad Cave the three are close.\\r\\nThough where exactly? This poem shows:\\r\\nFor the first one you need to be restless\\r\\nTo avoid the Catacomb death traps.\\r\\nFor the second you need to go down\\r\\nDeep until you reach the ancient fisher town.\\r\\nFor the third one go high and even higher,\\r\\nKeep on til you reach the never sleeping fire.\\r\\n\"\nmsgstr \"\"\n\n#. Key:\t6F09C2F74E536AB6E4E7D8941571FBDF\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Sure. Shut up Fishy!\"\nmsgstr \"\"\n\n#. Key:\t720870EC444670FB23244D964497F883\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_SpeechSequence_1.SpeechSequence(1).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_SpeechSequence_1.SpeechSequence(1).SpeechSequence.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"However business is business. She is bad for business! Trading with my customers before they could get to me!\"\nmsgstr \"\"\n\n#. Key:\t757069804B91FF89516ACDA0C1F59C6A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_103.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_103.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Arrrgh! Fishy please no more poems! My head aches.\"\nmsgstr \"\"\n\n#. Key:\t75A193EA4F6A7EE92BA73D809247B1A1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_62.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_62.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Dr. who? Oh, see, Dr. Ball.\"\nmsgstr \"\"\n\n#. Key:\t75EADAAB4ACE4E6ECE45BFA6611ED77A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_85.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_85.Children(0).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"8 Gold\"\nmsgstr \"\"\n\n#. Key:\t7657DDE7438385D8BCC4B08B2BB5881A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_SpeechSequence_0.SpeechSequence(0).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_SpeechSequence_0.SpeechSequence(0).SpeechSequence.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"It all started when I was back with my family. Oh, those peaceful moments!\"\nmsgstr \"\"\n\n#. Key:\t778E6A484D8669761018F38DF326C125\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_90.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_90.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"It's yours for 8 Gold Coins.\"\nmsgstr \"\"\n\n#. Key:\t7A09AFFF435CC002F0B75989307D7791\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Well met dear err... traveler! How can a humble gnome merchant like me be at your service?\"\nmsgstr \"\"\n\n#. Key:\t7E964EEC4406A06910B333A0F282360A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_70.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_70.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Sure! She is the lovely lady ball for whom you would like to buy a precious present, right?\"\nmsgstr \"\"\n\n#. Key:\t85D756624371CC3B3A37FC84C111DBB0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_54.Children(3).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_54.Children(3).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Sorbcerer\"\nmsgstr \"\"\n\n#. Key:\t86C8F9B74B869FF4D34CF586AB5AC25E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_20.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_20.Children(1).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Shut up!\"\nmsgstr \"\"\n\n#. Key:\t8701305446A6E0F5E5EA5F86B823273D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Shut up both of you!\"\nmsgstr \"\"\n\n#. Key:\t878BA65D462254D8A0FD36BA541E8C70\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_27.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_27.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"The three artefacts - by Fishy:\"\nmsgstr \"\"\n\n#. Key:\t8A136EF74C7DE15BFBC664B8447366F1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(2).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(2).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"I need a name\"\nmsgstr \"\"\n\n#. Key:\t8C25603A4AE5F2D6294551AD2BA6322D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_40.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_40.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Of course! Are you lost in this hollow realm? Disappointed in all creature kind? Searching for a helpful hand? Not anymore!\"\nmsgstr \"\"\n\n#. Key:\t90F345C4482C46F4B1CD43B20F01B2B6\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_54.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_54.Children(0).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Epic Sphero\"\nmsgstr \"\"\n\n#. Key:\t92F1D4A84B3609FDE38C82AD5A314554\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_72.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_72.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"And Fishy is the primitive monster.\"\nmsgstr \"\"\n\n#. Key:\t9574E444465834A7D15565A14C7E0F1D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_SpeechSequence_0.SpeechSequence(5).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_SpeechSequence_0.SpeechSequence(5).SpeechSequence.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"My sister sold my brother, so I had enough money to set out.\"\nmsgstr \"\"\n\n#. Key:\t976FD7AB4B31747EF35E3EBE9C82471F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_69.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_69.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Do you know a girl called Lillian?\"\nmsgstr \"\"\n\n#. Key:\t9851A2064648DE26EF4501961D721109\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_68.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_68.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Wake up! He is back!\"\nmsgstr \"\"\n\n#. Key:\t99CDA18D43B5FC74E152888E674B743C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_30.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_30.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Let’s talk about something else.\"\nmsgstr \"\"\n\n#. Key:\t9A5056F7472381107ACF5F849A322947\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_64.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_64.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Bye!\"\nmsgstr \"\"\n\n#. Key:\t9B4816554539F6616741FC8A6651FEDD\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_SpeechSequence_1.SpeechSequence(2).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_SpeechSequence_1.SpeechSequence(2).SpeechSequence.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"I will tell her what I think about this that’s for sure!\"\nmsgstr \"\"\n\n#. Key:\t9FD161AC488FFD8D9C6BCAB518A6DFCA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_86.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_86.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Hello again!\"\nmsgstr \"\"\n\n#. Key:\t9FFADAA44EE730442CFD76BBD942F478\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_38.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_38.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Fare thee well!\"\nmsgstr \"\"\n\n#. Key:\tA0E3F7B44422A97F22E1FCB315DC498A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_48.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_48.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Who are you by the way?\"\nmsgstr \"\"\n\n#. Key:\tA3EE773446B69B8D37851BAFAD607A9F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_24.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_24.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Forget your artefacts I have plenty of other valuable items instead!\"\nmsgstr \"\"\n\n#. Key:\tA557A981439B7A1B4AA803941A8D6794\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_23.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_23.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"I guess you don’t know where they are...\"\nmsgstr \"\"\n\n#. Key:\tA571474F44F33104D2F93386A5C4009C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_75.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_75.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Yet no one ever wanted to buy him for a single copper coin.\"\nmsgstr \"\"\n\n#. Key:\tA67ADB3143798188EF7C1F8D4E59690C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_88.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_88.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Uhhh... Yes?\"\nmsgstr \"\"\n\n#. Key:\tA69D35084A31B957410EF889ED0EC4A4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_57.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_57.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Yes, yes that's it!\"\nmsgstr \"\"\n\n#. Key:\tAD70372E4A5B0594635FBBBE30CA53F1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_91.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_91.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"It's yours for 10 Gold Coins.\"\nmsgstr \"\"\n\n#. Key:\tAE2E742F4A087974019D8F810FF97A2E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_104.Children(0).Children.Text\n#. Key:\tB59E143642BBE2D677AA6F97B46C3C06\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_105.Children(0).Children.Text\n#. Key:\tF0726C6B4F8F780C341F319D08E20CF9\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_96.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_104.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_105.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_96.Children(0).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Ok\"\nmsgstr \"\"\n\n#. Key:\tAF7B14B241CED9B8BE3F23BC8C857A9A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_82.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_82.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Now you can imagine those peaceful moments when they were all together.\"\nmsgstr \"\"\n\n#. Key:\tB2F8DA594F1A58E8B2FCC7B16C368E21\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"What... uhhh... me?\"\nmsgstr \"\"\n\n#. Key:\tBA5B75CD4087B53BB682CD97021FF821\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(3).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(3).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Artefacts\"\nmsgstr \"\"\n\n#. Key:\tBBB67671475F19135DCD57AF771F0D85\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_43.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_43.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Helpful hands of course and all kind of stuffs. Equip yourself. Once you get rid of all your gold, you won’t be alone anymore...\"\nmsgstr \"\"\n\n#. Key:\tBD1AF6114DA5840A340F8DA65B7F59D2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_SpeechSequence_1.SpeechSequence(0).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_SpeechSequence_1.SpeechSequence(0).SpeechSequence.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Yes, she is my beloved sister!\"\nmsgstr \"\"\n\n#. Key:\tBE8F496743A57B5F1AF81B8D48F128FE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Hello there!\"\nmsgstr \"\"\n\n#. Key:\tBFA7C31A4443A6C89DB61D8556D62FCD\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(0).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Trade\"\nmsgstr \"\"\n\n#. Key:\tC29FF9914C8C1F479E9F7BAB338B067A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_77.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_77.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"If you could bring me a new wheel I would pay for it with shiny Gold coins!\"\nmsgstr \"\"\n\n#. Key:\tC5077FC14569C44087272C9E9DE07992\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_34.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_34.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Ok, I’ve got it.\"\nmsgstr \"\"\n\n#. Key:\tC6F3C52D4719CE471B6EEB90FCE94E3B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_55.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_55.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Unfortunately I don't have enough gold.\"\nmsgstr \"\"\n\n#. Key:\tCA1E8A5D4C07A81975C4B4B00572A0C8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_94.Text\n#. Key:\tDB9C0DB146BBE1DFC28F929A37C4408A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_93.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_93.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_94.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Ha-ha-ha! You must be kidding that's ridiculously high!\"\nmsgstr \"\"\n\n#. Key:\tCB792FAD45F78755935423A5219271FC\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_98.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_98.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"9 Gold I won't go any higher!\"\nmsgstr \"\"\n\n#. Key:\tCE99919C42EC2315EC5B33900FBC09C4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_95.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_95.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"That’s not fair. It would be a shame on me if I just robbed you like that!\"\nmsgstr \"\"\n\n#. Key:\tD090388E4529CEC2D70899B520973064\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(4).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(4).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Who are you?\"\nmsgstr \"\"\n\n#. Key:\tD0AA81A247BE4979A774F3B6095BB820\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_33.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_33.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"I am Gnory, traveler merchant. I wander the world, seeking rare items, secrets beneath dark doors, revealing truth of forg...\"\nmsgstr \"\"\n\n#. Key:\tD23C65EB4F39580A06045FADE2BCD713\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_81.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_81.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"She saw our Realm through cat eyes,\\r\\nThe living fire, the dead ice.\\r\\nShe cared, she took care of us all.\\r\\nWhat was ruined she made it whole.\\r\\nThen she left us, this is how it ended.\\r\\nHer own Realm also needed to be mended.\\r\\n\"\nmsgstr \"\"\n\n#. Key:\tD30843A14519A490FEE89E82E3CB6735\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"I’m looking for three artefacts.\"\nmsgstr \"\"\n\n#. Key:\tD9B70A6A453A11FD2115FFB25CCFF195\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_54.Children(6).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_54.Children(6).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Not enough gold\"\nmsgstr \"\"\n\n#. Key:\tDB8982994F2BFF510A6A2EA1D40C68C6\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_37.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_37.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Good bye!\"\nmsgstr \"\"\n\n#. Key:\tDC20CC924E5F898E715B668416678CA1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_104.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_104.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"How about 8?\"\nmsgstr \"\"\n\n#. Key:\tDC989DED42077EBA3313C69150BB33F0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_63.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_63.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"That's a weird name I have to admit.\"\nmsgstr \"\"\n\n#. Key:\tDEC95D494680878D544FF49DACBDEE4F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_114.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_114.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"11 Gold I won't go any lower!\"\nmsgstr \"\"\n\n#. Key:\tDF7B371841495C5FB98800BCF44B7C5B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_52.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_52.Children(1).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Skip yack-yack\"\nmsgstr \"\"\n\n#. Key:\tE1322541414052606F718FBF9B68D4B0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_79.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_79.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Fishy know her.\"\nmsgstr \"\"\n\n#. Key:\tE3D668304EE4C7C2E77F3E9AF47CB84E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_SpeechSequence_0.SpeechSequence(4).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_SpeechSequence_0.SpeechSequence(4).SpeechSequence.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Fortunately I had a loving family I could always count on. Since they are all merchants, they could easily help me out.\"\nmsgstr \"\"\n\n#. Key:\tE5031E774F81A45ECB4731BC114AD2E2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_109.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_109.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"All right, no need to get angry! I can give you 9 Gold for it.\"\nmsgstr \"\"\n\n#. Key:\tEBE094644F9C8DCEE025FDBF8346AD47\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_44.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_44.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"...with your problem.\"\nmsgstr \"\"\n\n#. Key:\tEC93512B48219F6BA6DDF5A3F100C19A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Show me what you have for sale!\"\nmsgstr \"\"\n\n#. Key:\tECF244164CDD4A29C96BBD8E13688FE7\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(1).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Sell Wheel\"\nmsgstr \"\"\n\n#. Key:\tED410B224B09EFF36ED2AC9752AD59DA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_71.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_71.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"No, she is...\"\nmsgstr \"\"\n\n#. Key:\tEDE4BF2D448CAFEF217C5E86885A7E81\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_117.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_117.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"All right, you won. I will give it for 9 Gold Coins.\"\nmsgstr \"\"\n\n#. Key:\tEEA209E84766D4AF2BD804A7BA11F111\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_85.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_85.Children(1).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"10 Gold\"\nmsgstr \"\"\n\n#. Key:\tEEE19423423A24146446EEBEB04FAEE9\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"I’m on a quest to find...\"\nmsgstr \"\"\n\n#. Key:\tF53E6D3443D37DA82663D2976AA90A85\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_20.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_20.Children(0).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Poem?\"\nmsgstr \"\"\n\n#. Key:\tF61EDE3940F24B15BE57D8B5A5AC5570\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_99.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_99.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Deal! Here you go!\"\nmsgstr \"\"\n\n#. Key:\tF6A527234B894C18C0778C918EB1BA4E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_89.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_89.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Welcome back!\"\nmsgstr \"\"\n\n#. Key:\tF93CBC6640AF6143C7D1C5AA6F8C4ADF\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_52.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_52.Children(0).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Go on\"\nmsgstr \"\"\n\n#. Key:\tF9EA93DE4B341581745785A7371F797A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(8).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(8).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Lillian\"\nmsgstr \"\"\n\n#. Key:\tFE3C4C72489A909B4D9F76A483D293AE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_SpeechSequence_0.SpeechSequence(3).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_SpeechSequence_0.SpeechSequence(3).SpeechSequence.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"This was my chance to make a hit as a merchant but I didn’t have the resources for a journey this long.\"\nmsgstr \"\"\n\n#. Key:\tFEF58E5B4FB18D128640689499752F75\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_29.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_29.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Do you call this a poem? Pathetic! Hardly any info and what a miserable structure! Shame on you Fishy!\"\nmsgstr \"\"\n\n#. Key:\tFF66071643E10E94DEFF70B8E20876EE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_52.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_52.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"That's a long and sad story...\"\nmsgstr \"\"\n\n#. Key:\t1EA717114DFEF4490F58829C2F96566A\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/HW_Candlestick.HW_Candlestick:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E2/HW_Candlestick.HW_Candlestick:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_HW_Candlestick\"\nmsgid \"Even after mom passed the servants kept lighting the candles.\"\nmsgstr \"\"\n\n#. Key:\t94195B6E4157A1A8BD74BE9224AEED42\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/HW_Candlestick.HW_Candlestick:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E2/HW_Candlestick.HW_Candlestick:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_HW_Candlestick\"\nmsgid \"After Mom got sick she really feared darkness.\"\nmsgstr \"\"\n\n#. Key:\tEF9668BF44D4A52E46ACEA8B82011137\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/HW_Candlestick.HW_Candlestick:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Ending/E2/HW_Candlestick.HW_Candlestick:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_HW_Candlestick\"\nmsgid \"We always needed to light the hallway.\"\nmsgstr \"\"\n\n#. Key:\t2EECB3024693C7F0EA176BB100D6779A\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/HW_Exit.HW_Exit:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E2/HW_Exit.HW_Exit:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_HW_Exit\"\nmsgid \"This door was really rusty.\"\nmsgstr \"\"\n\n#. Key:\t3C6E4A1C41A7EACE15C101A65BBE997A\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/HW_Exit.HW_Exit:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Ending/E2/HW_Exit.HW_Exit:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_HW_Exit\"\nmsgid \"I had to do something with it otherwise Father would have heard me.\"\nmsgstr \"\"\n\n#. Key:\t8F63CC8C44D8F8432A66E6B65EC10AF5\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/HW_Exit.HW_Exit:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E2/HW_Exit.HW_Exit:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_HW_Exit\"\nmsgid \"I used oil on this rusty door. I didn’t want to be heard.\"\nmsgstr \"\"\n\n#. Key:\t55E7DD2B4C3D8852EC4A64AF44443BDA\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/HW_Explosion.HW_Explosion:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Ending/E1/HW_Explosion.HW_Explosion:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_HW_Explosion\"\nmsgid \"What was this? I have to go back to check what happened!\"\nmsgstr \"\"\n\n#. Key:\t8060689940824917F595BF84B4E95A46\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/HW_FRDoor.HW_FRDoor:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E2/HW_FRDoor.HW_FRDoor:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_HW_FRDoor\"\nmsgid \"I always wondered why.\"\nmsgstr \"\"\n\n#. Key:\t816B603341386CF6BB3ADCAAD21D68A3\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/HW_FRDoor.HW_FRDoor:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E2/HW_FRDoor.HW_FRDoor:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_HW_FRDoor\"\nmsgid \"Father moved to his workroom and sealed this door.\"\nmsgstr \"\"\n\n#. Key:\t125DACD243EA6EBCE76D8CB9F681C727\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/HW_MRDoor.HW_MRDoor:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E2/HW_MRDoor.HW_MRDoor:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_HW_MRDoor\"\nmsgid \"I felt I should have a last look before I go.\"\nmsgstr \"\"\n\n#. Key:\tE8250D43437C1B1D45637F9499D20936\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/HW_MRDoor.HW_MRDoor:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E2/HW_MRDoor.HW_MRDoor:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_HW_MRDoor\"\nmsgid \"Mom’s room looked just like it was when she was still alive.\"\nmsgstr \"\"\n\n#. Key:\tE0BB63A74E94DA1B327B11BB781EB4DB\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/HW_Painting.HW_Painting:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E2/HW_Painting.HW_Painting:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_HW_Painting\"\nmsgid \"Mom made this painting before she met Father.\"\nmsgstr \"\"\n\n#. Key:\tEAD0C13D4BF1D35BDAEC14A3F25901F5\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/HW_Stairs.HW_Stairs:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E2/HW_Stairs.HW_Stairs:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_HW_Stairs\"\nmsgid \"I had to go really softly otherwise Father would have heard me.\"\nmsgstr \"\"\n\n#. Key:\t0494D36047DDCE114A43C9901618D32B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_44.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_44.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Unfortunately I don't know where you can find them.\"\nmsgstr \"\"\n\n#. Key:\t0C3E31854B0EB053EABAD4B9DC3D8E60\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_57.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_57.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"That’s a serious threat, I have to admit.\"\nmsgstr \"\"\n\n#. Key:\t0C7C89EB4E610752FBE119AA32B99F8B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_34.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_34.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Yes I know her. She couldn’t come here so she sent her cat.\"\nmsgstr \"\"\n\n#. Key:\t0EDE363848C05F39DE478DA7A559CF54\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Could you bring them to me?\"\nmsgstr \"\"\n\n#. Key:\t1A914576488DA1393ED641B9F315ABC6\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_53.Text\n#. Key:\t20DA5C2F49DCFADF17F1C983103C0D98\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_29.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_29.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_53.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Thanks!\"\nmsgstr \"\"\n\n#. Key:\t1E7EE16F451CAB1193F0B8B3939273AA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_62.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_62.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"I managed to defeat one group of the monsters.\"\nmsgstr \"\"\n\n#. Key:\t1F5BE4154412819180B1CA92E5B69377\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(6).Children.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(6).Children.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Artefacts\"\nmsgstr \"\"\n\n#. Key:\t1FE89B7045E586E988BEC18B06BEEBDB\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(1).Children.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Purple Mushroom\"\nmsgstr \"\"\n\n#. Key:\t208B21DE484E3FE42C9978927BC91E78\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_51.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_51.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Uh... this was impressive!\"\nmsgstr \"\"\n\n#. Key:\t27DF1ABB483B5073D8C87DB48EF2613F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_70.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_70.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Well done!\"\nmsgstr \"\"\n\n#. Key:\t2892242A4E74642813A30CBAE853B674\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_27.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_27.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Anyway, if you give my Coin back I will apologize.\"\nmsgstr \"\"\n\n#. Key:\t290F9EE34FA4EA41FE963CA61358D23B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_49.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_49.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"In theory if I add this to the soup...\"\nmsgstr \"\"\n\n#. Key:\t3015DA144833F0401BADE8B5E5F93BA8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_26.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_26.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Huh! Do you think chests are only there so that you can loot them?\"\nmsgstr \"\"\n\n#. Key:\t331D8B314DAF15CD7E343BB7459927DD\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Give back my Coin!\"\nmsgstr \"\"\n\n#. Key:\t345BD57D40E09C73044BB981798E2449\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_43.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_43.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Purple Mushrooms. That’s the only mushroom which is purple. You can’t miss it.\"\nmsgstr \"\"\n\n#. Key:\t34B1483D4F1C580BB8DB61BEEBC5BC0F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"I saw that you opened my chest!\"\nmsgstr \"\"\n\n#. Key:\t35DBF2874748AFCC34A3FAAC083EF9A0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_1.SpeechSequence(3).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_1.SpeechSequence(3).SpeechSequence.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"We had the key of the Ancient Temple. According to our prophecies that will fall to Ruin last.\"\nmsgstr \"\"\n\n#. Key:\t35FB567B4B09545830D61F84869FC7E7\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Here you go!\"\nmsgstr \"\"\n\n#. Key:\t3AAE79234A4BD2F8BCA5F790D5E5D84B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_45.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_45.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"No problem. If I ever find one I will bring it to you.\"\nmsgstr \"\"\n\n#. Key:\t3AE46C894A0CD8F1AA049CB9970D65F3\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"I’m the chef and I’m making a soup.\"\nmsgstr \"\"\n\n#. Key:\t3BB405034447D1C80B99A5A23AFC98FC\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"I know you are already hungry but the soup is not yet ready.\"\nmsgstr \"\"\n\n#. Key:\t406361704988AD9ABD5DA4AF946451F2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_37.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_37.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"In return Lillian drew pictures for my tales.\"\nmsgstr \"\"\n\n#. Key:\t4152700A419F5AE41362D09E21835D98\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_46.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_46.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"I already have some...\"\nmsgstr \"\"\n\n#. Key:\t4355EB74402DDFD5FF8697B1911593E8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_56.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_56.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"I won’t. And I won’t talk to you either.\"\nmsgstr \"\"\n\n#. Key:\t43C4F54B4ABBBB13E129148D9AF04976\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(4).Children.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(4).Children.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Village\"\nmsgstr \"\"\n\n#. Key:\t4614DBA24F54CB29C92BA9894849CC39\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_1.SpeechSequence(1).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_1.SpeechSequence(1).SpeechSequence.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Long ago we lived in peace and respected the ancestors. Even though they caused the Cataclysm.\"\nmsgstr \"\"\n\n#. Key:\t4687EF7A45E5FC200C806AB829C64D78\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Is this a village? Where are the others?\"\nmsgstr \"\"\n\n#. Key:\t586F6370480889F551923A97FFF5E89C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_0.SpeechSequence(3).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_0.SpeechSequence(3).SpeechSequence.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"They enslaved all the other tribes and forbid us to do our rituals.\"\nmsgstr \"\"\n\n#. Key:\t5BCF2C5D4CE9AD6AB4A09DB510BA2039\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"You again? Take a seat until the soup is ready!\"\nmsgstr \"\"\n\n#. Key:\t63B9B304450B276F0EC714B43A25F09D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"I’m looking for three artefacts. Do you know something about them?\"\nmsgstr \"\"\n\n#. Key:\t63C0EC124C1B42B5C5FD1F95B23B9155\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_65.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_65.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Take this! You deserve it.\"\nmsgstr \"\"\n\n#. Key:\t69E0738B489315662A55DA98EAC542E6\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_0.SpeechSequence(4).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_0.SpeechSequence(4).SpeechSequence.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"They used this village to produce Fishy slaves.\"\nmsgstr \"\"\n\n#. Key:\t6CBCFFEB48FF8E0D97AAE4B1CB19CB52\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_22.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_22.Children(0).Children.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Give back\"\nmsgstr \"\"\n\n#. Key:\t6EACCB4D4D91AF29F6452E81E4C01B57\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_32.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_32.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"I see you have a lot of things here. Do you have something for sale?\"\nmsgstr \"\"\n\n#. Key:\t7164FF5D440BCEF18CAC7E9104A324CF\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"I've got to go now!\"\nmsgstr \"\"\n\n#. Key:\t75A92D46421FC2601A13B4BBE9BA4D11\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_54.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_54.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Er... I don’t have it. But I will get it back I promise!\"\nmsgstr \"\"\n\n#. Key:\t761F5734479CFA197266F382FD0A6452\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_23.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_23.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"I’m sorry, I didn’t know it was yours. There are chests like yours everywhere.\"\nmsgstr \"\"\n\n#. Key:\t7D87C5064D739F1EFF23AF8264E83235\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Well, this morning. But there are some very special ingredients which make the cook time way shorter.\"\nmsgstr \"\"\n\n#. Key:\t806AEB764A6118D4CBE9CCA71E98EF10\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_72.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_72.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Have no fear, I'll do it.\"\nmsgstr \"\"\n\n#. Key:\t80B60CA848D3C71B72514AAC976C3910\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Yes, the soup! A very special recipe. It takes years to finish.\"\nmsgstr \"\"\n\n#. Key:\t8437D72C44494DE499E528A67B36A123\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_58.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_58.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Ah, it's you again.\"\nmsgstr \"\"\n\n#. Key:\t885F9FDB498EC13B81E22580D33309F3\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(5).Children.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(5).Children.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Kobolds\"\nmsgstr \"\"\n\n#. Key:\t8A6043D64FB7B61AF4D553A62D27229C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_36.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_36.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Every time the cat came I told him a tale about the ancestors.\"\nmsgstr \"\"\n\n#. Key:\t8B29FD7342676763EF53ACBB0677A1A4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"The soup still needs time.\"\nmsgstr \"\"\n\n#. Key:\t8E0F057044AE753D63AA23847B146662\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_67.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_67.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"This is yours.\"\nmsgstr \"\"\n\n#. Key:\t8E4C4FB846539DD46577B490846383F1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_1.SpeechSequence(2).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_1.SpeechSequence(2).SpeechSequence.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"We decided to keep their knowledge in our rituals.\"\nmsgstr \"\"\n\n#. Key:\t9132C2D24A241722115FD5ADB46B3145\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"And when did you start?\"\nmsgstr \"\"\n\n#. Key:\t958CE12E48F89AE79E5ED9A4FC4AF6E7\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_48.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_48.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"That's wonderful!\"\nmsgstr \"\"\n\n#. Key:\t96E5FBCB4795EC1ADACEC7B6D814BD79\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(8).Children.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(8).Children.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Lillian\"\nmsgstr \"\"\n\n#. Key:\t9845BDB549EF25B9F5C11981123A5CCE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_33.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_33.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"You know I’m not really a trader but I might sell you some of them.\"\nmsgstr \"\"\n\n#. Key:\t9A420B814A1C1762130310AE90157BFD\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_31.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_31.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"No, I’m sorry.\"\nmsgstr \"\"\n\n#. Key:\t9D8511F94E19183355A5CC8CE5B562E8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_61.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_61.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"That would be great. I appreciate your kindness.\"\nmsgstr \"\"\n\n#. Key:\t9F2DE60B405A15F2BFB8409D162B42FD\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(3).Children.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(3).Children.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Soup\"\nmsgstr \"\"\n\n#. Key:\tA53CDF2A4D9A582DD163C7B6D3DCE334\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_55.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_55.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Come back when you have my Coin.\"\nmsgstr \"\"\n\n#. Key:\tA734229B44743F88ED135FB692B9C956\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Do you know a girl called Lillian?\"\nmsgstr \"\"\n\n#. Key:\tA88F63334DD550FE9955A3A65B87ACDA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_63.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_63.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"I banished some of the monsters.\"\nmsgstr \"\"\n\n#. Key:\tA8B5BE484641EBB61B1168AE798DABF5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"So you are making soup...\"\nmsgstr \"\"\n\n#. Key:\tAAE2E35045B8E0DF8A11BF8BC84A11EF\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_0.SpeechSequence(1).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_0.SpeechSequence(1).SpeechSequence.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Every year we made a pilgrimage to the Ancient Temple to express our respect to the ancestors.\"\nmsgstr \"\"\n\n#. Key:\tAC26EB6F49B026C3E768398FA0A445CB\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_50.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_50.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"then...\"\nmsgstr \"\"\n\n#. Key:\tADE8569E4FC2DCB097FF3FA4B9A0A970\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_40.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_40.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Why not? What do you need?\"\nmsgstr \"\"\n\n#. Key:\tAE35D91D450D0414FA5F54B71E359511\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(2).Children.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(2).Children.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Who are you?\"\nmsgstr \"\"\n\n#. Key:\tAE387E9846A9C5A56569179359AD941C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_42.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_42.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"All right! I was just asking...\"\nmsgstr \"\"\n\n#. Key:\tAF3D9214401FEEE552256A8BAE5F8E77\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_1.SpeechSequence(4).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_1.SpeechSequence(4).SpeechSequence.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"But now Kobolds are wrathful. They make wars. They don’t respect anyone.\"\nmsgstr \"\"\n\n#. Key:\tB06407B04855D558D1DB6B9A9A4E0B84\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_1.SpeechSequence(0).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_1.SpeechSequence(0).SpeechSequence.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Kobolds are no longer good.\"\nmsgstr \"\"\n\n#. Key:\tB082CC4B405800544484B4B0C8A25762\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_41.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_41.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"No way!\"\nmsgstr \"\"\n\n#. Key:\tB35F443641A7626AE4552F8D1045A95F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_38.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_38.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"I liked them very much.\"\nmsgstr \"\"\n\n#. Key:\tB40C1B9948722A549DBC45A1D9C277C0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_24.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_24.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"I don’t want to leave my kitchen.\"\nmsgstr \"\"\n\n#. Key:\tB71FB3424C74B68E4B9CF9AF3828F867\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_64.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_64.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"I think I banished all the monsters.\"\nmsgstr \"\"\n\n#. Key:\tB79F2026493F53FE90BABB987370695D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"What do you think honestly? You can just rob me and then come to have a chat?!\"\nmsgstr \"\"\n\n#. Key:\tB7B8A9294FA8D3754BB4CDA897B696BA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_69.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_69.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Great. The lake is already more peaceful.\"\nmsgstr \"\"\n\n#. Key:\tB9C3EC7342B52C04A491FF9AE87ABB42\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_0.SpeechSequence(0).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_0.SpeechSequence(0).SpeechSequence.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"This was the Village of my tribe. We lived here in peace.\"\nmsgstr \"\"\n\n#. Key:\tBB45D70A4F2AF94BA7FCC9B3141FB98F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_17.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_17.Children(0).Children.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Accept\"\nmsgstr \"\"\n\n#. Key:\tC297D79246A0792DCA2CA9AD693C3A55\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"That’s all.\"\nmsgstr \"\"\n\n#. Key:\tC375726140A40243E29115B58048025E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_52.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_52.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Hmm... it’s delicious. Here take some!\"\nmsgstr \"\"\n\n#. Key:\tC8BC1F254B61D749D62D4B9210DA1891\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"If you came for soup you will need to wait a bit more!\"\nmsgstr \"\"\n\n#. Key:\tCB607C4842DF3781F8B6C9AB1A7D31F1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Where is my Coin?\"\nmsgstr \"\"\n\n#. Key:\tCE80654A43078EA1E53C5E9C5114DE54\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_60.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_60.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"I can help you banish the monsters around the lake.\"\nmsgstr \"\"\n\n#. Key:\tD1412BF6490EA9357CE9F7A873B1FCAC\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_35.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_35.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"She was really curious about our rituals.\"\nmsgstr \"\"\n\n#. Key:\tD76CDC9F410E2BCC21BCFB8D0D8A9E97\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_47.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_47.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"I’ve found some Purple Mushroom!\"\nmsgstr \"\"\n\n#. Key:\tD87335EA45EAC6F84022FEBE57F5CADF\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_25.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_25.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Or what? Will you cook me?\"\nmsgstr \"\"\n\n#. Key:\tD9B7F3E240430AA5EF537A8F81814751\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_71.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_71.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"I'm glad that the lake is peaceful again. Thank you!\"\nmsgstr \"\"\n\n#. Key:\tE15F80EA40F193E47F372FA7EE9A949E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_0.SpeechSequence(5).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_0.SpeechSequence(5).SpeechSequence.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Now they are gone and I'm alone with the monsters they left here.\"\nmsgstr \"\"\n\n#. Key:\tE3947B064E58A1FD7B96A3956C54415D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_0.SpeechSequence(2).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_0.SpeechSequence(2).SpeechSequence.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"But then other Kobolds came. They called themselves the Great Kobols.\"\nmsgstr \"\"\n\n#. Key:\tE48A1DFB458275188357F5811E98CFD4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_59.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_59.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"And also take this! I could have not done the soup in time without your help.\"\nmsgstr \"\"\n\n#. Key:\tE58EEE904A6CBF1A0E2E768583EB03DC\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(7).Children.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(7).Children.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Trade\"\nmsgstr \"\"\n\n#. Key:\tE60B94C04C63F0E074A5B8ABFED7AE62\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_66.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_66.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"I have something for you.\"\nmsgstr \"\"\n\n#. Key:\tEA71F6A6412E69C31302A2B57BFD266F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_39.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_39.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Now they are both gone.\"\nmsgstr \"\"\n\n#. Key:\tECA4BB2D4EB774315D57FD9A5D66CF25\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_22.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_22.Children(1).Children.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Don't give\"\nmsgstr \"\"\n\n#. Key:\tED97FDEB46CAC89F65734D990569618C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_17.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_17.Children(1).Children.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Decline\"\nmsgstr \"\"\n\n#. Key:\tEFD0511840178E579287BAB7FA3FDADE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(0).Children.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Banish Monsters\"\nmsgstr \"\"\n\n#. Key:\tF5A08C63415DF9FE007B97931B7A7C31\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(9).Children.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(9).Children.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Leave\"\nmsgstr \"\"\n\n#. Key:\tF7EA437842BBD099521D81B87211F49E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_30.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_30.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"I’m the last of my tribe.\"\nmsgstr \"\"\n\n#. Key:\tFC8F235840D6AF4A86170791A617BCA9\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Who are you? What are you doing here?\"\nmsgstr \"\"\n\n#. Key:\tFF27D3BF4D181753D73AD79D384CD3ED\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"What are you Kobolds like? What are you doing?\"\nmsgstr \"\"\n\n#. Key:\t587277824A24A49F9319D0B452A709AD\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/LB_Device.LB_Device:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Ending/E1/LB_Device.LB_Device:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_LB_Device\"\nmsgid \"Monk wanted me to use this device to separate the Worlds.\"\nmsgstr \"\"\n\n#. Key:\t83B9F1E146084039E4BAD185B455209C\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LB_Device.LB_Device:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E2/LB_Device.LB_Device:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_LB_Device\"\nmsgid \"With Father we did all we could to make the device perfect. I won’t let us lose so close to the end!\"\nmsgstr \"\"\n\n#. Key:\t90E0E1E44BE9D84FC514248D73A31935\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LB_Device.LB_Device:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Ending/E2/LB_Device.LB_Device:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_LB_Device\"\nmsgid \"Three years of hard work.\"\nmsgstr \"\"\n\n#. Key:\tFB8EC2184310BA168B9C6E9DB51C4492\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LB_Device.LB_Device:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E2/LB_Device.LB_Device:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_LB_Device\"\nmsgid \"I need to pull the left lever first.\"\nmsgstr \"\"\n\n#. Key:\tDAC636D74C51C30F4B790B9F87203957\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/LB_DeviceUse.LB_DeviceUse:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Ending/E1/LB_DeviceUse.LB_DeviceUse:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_LB_DeviceUse\"\nmsgid \"Er... so far pulling the levers worked but this machine looks fairly complicated.\"\nmsgstr \"\"\n\n#. Key:\tE0D3606C4F357F03FBC916AA3573A81D\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/LB_DeviceUse.LB_DeviceUse:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E1/LB_DeviceUse.LB_DeviceUse:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_LB_DeviceUse\"\nmsgid \"I should look around to find some instructions on how it works.\"\nmsgstr \"\"\n\n#. Key:\t2DB770DF48D3199FFDEA3F8AB99126D5\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LB_LeftLever.LB_LeftLever:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Ending/E2/LB_LeftLever.LB_LeftLever:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_LB_LeftLever\"\nmsgid \"I heard them knocking on the door. They surely heard the alarm when I entered.\"\nmsgstr \"\"\n\n#. Key:\tB5D008804CCD51DF8CA8F5B99CA0C0FB\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LB_LeftLever.LB_LeftLever:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E2/LB_LeftLever.LB_LeftLever:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_LB_LeftLever\"\nmsgid \"I need to hurry. The middle lever is the next one.\"\nmsgstr \"\"\n\n#. Key:\tC7B08D314C68A7E4D21E20B128670516\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LB_MiddleLever.LB_MiddleLever:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Ending/E2/LB_MiddleLever.LB_MiddleLever:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_LB_MiddleLever\"\nmsgid \"We both made our decision three years ago.\"\nmsgstr \"\"\n\n#. Key:\tFBC301B94D990F1F3FD30383FF916327\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LB_MiddleLever.LB_MiddleLever:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Ending/E2/LB_MiddleLever.LB_MiddleLever:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_LB_MiddleLever\"\nmsgid \"I’ve made my choice.\"\nmsgstr \"\"\n\n#. Key:\tFD2036CF4FC103724FB18F83754367A0\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LB_MiddleLever.LB_MiddleLever:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E2/LB_MiddleLever.LB_MiddleLever:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_LB_MiddleLever\"\nmsgid \"I heard the door exploding. Father must be really mad but It doesn’t matter now.\"\nmsgstr \"\"\n\n#. Key:\t98F843004F338E4480C942A9B9646BDE\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LB_RightLever.LB_RightLever:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E2/LB_RightLever.LB_RightLever:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_LB_RightLever\"\nmsgid \"I pulled the last lever.\"\nmsgstr \"\"\n\n#. Key:\t9F6EBBE74FA6289497401C8E7400B01E\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LR_Bed.LR_Bed:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E2/LR_Bed.LR_Bed:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_LR_Bed\"\nmsgid \"Sleeping wasn’t easy since Mom was gone.\"\nmsgstr \"\"\n\n#. Key:\tAE56EE704265B61C84123F9775EB424C\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LR_Bed.LR_Bed:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E2/LR_Bed.LR_Bed:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_LR_Bed\"\nmsgid \"I really couldn’t sleep that night.\"\nmsgstr \"\"\n\n#. Key:\t344E65304BB63905D487CCAF191DFE95\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LR_Chest.LR_Chest:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Ending/E2/LR_Chest.LR_Chest:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_LR_Chest\"\nmsgid \"It was half past eleven.\"\nmsgstr \"\"\n\n#. Key:\t5DD659BE428981065F3A989D284C3542\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LR_Chest.LR_Chest:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E2/LR_Chest.LR_Chest:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_LR_Chest\"\nmsgid \"I took the key.\"\nmsgstr \"\"\n\n#. Key:\tF21CEE6143FD904B2285F9BEE01174A0\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LR_Chest.LR_Chest:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E2/LR_Chest.LR_Chest:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_LR_Chest\"\nmsgid \"Daddy didn’t like if I went out in the night but I felt something calling for me.\"\nmsgstr \"\"\n\n#. Key:\t8B18714145E8614E70F531BDB1A2AAAB\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LR_Door.LR_Door:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E2/LR_Door.LR_Door:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_LR_Door\"\nmsgid \"I always locked the door just to make sure I won’t sleep walk out.\"\nmsgstr \"\"\n\n#. Key:\tE5B14EEE4719891E2D2493A4E793A2C4\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LR_Door.LR_Door:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Ending/E2/LR_Door.LR_Door:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_LR_Door\"\nmsgid \"I opened the door.\"\nmsgstr \"\"\n\n#. Key:\tF8090D7B4DCD959D7893338BDA2B6256\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LR_Door.LR_Door:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E2/LR_Door.LR_Door:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_LR_Door\"\nmsgid \"I hid the key under the clock.\"\nmsgstr \"\"\n\n#. Key:\t8363A3C9426FA1F007A5E783B1D72171\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LR_Notebook.LR_Notebook:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E2/LR_Notebook.LR_Notebook:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_LR_Notebook\"\nmsgid \"Here I collected all my less scientific notes on the Ruined Realm.\"\nmsgstr \"\"\n\n#. Key:\tA0B131B34A29BEADA3E3CDB74C7EDBCA\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LR_Notebook.LR_Notebook:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Ending/E2/LR_Notebook.LR_Notebook:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_LR_Notebook\"\nmsgid \"They deserve to be remembered. I will miss them.\"\nmsgstr \"\"\n\n#. Key:\tB66C98C34782719B5CF6F19F608C00F0\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LR_Notebook.LR_Notebook:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E2/LR_Notebook.LR_Notebook:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_LR_Notebook\"\nmsgid \"So many lovely people! Despite their madness.\"\nmsgstr \"\"\n\n#. Key:\t0DAF7BA0480BDF56BC47A7826A5186C2\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LR_TabbyBed.LR_TabbyBed:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E2/LR_TabbyBed.LR_TabbyBed:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_LR_TabbyBed\"\nmsgid \"Sometimes I wished there could be a place like that for me as well.\"\nmsgstr \"\"\n\n#. Key:\t6084018D4E86CF2ACA89219824C8F776\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LR_TabbyBed.LR_TabbyBed:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Ending/E2/LR_TabbyBed.LR_TabbyBed:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_LR_TabbyBed\"\nmsgid \"As usually Tabby was out there maybe hunting or just hanging out with other cats.\"\nmsgstr \"\"\n\n#. Key:\t9702175346DD6BD2CBDB9C8D23460866\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LR_TabbyBed.LR_TabbyBed:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E2/LR_TabbyBed.LR_TabbyBed:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_LR_TabbyBed\"\nmsgid \"In this World, he was normal.\"\nmsgstr \"\"\n\n#. Key:\t018B13FB403C2E979380C68B92CC1E46\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LR_Window.LR_Window:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Ending/E2/LR_Window.LR_Window:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_LR_Window\"\nmsgid \"Yet sometimes I liked to watch other kids playing in the castle garden.\"\nmsgstr \"\"\n\n#. Key:\t15454EFF40C99A479173E294B612C66C\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LR_Window.LR_Window:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E2/LR_Window.LR_Window:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_LR_Window\"\nmsgid \"They didn’t understand how important my task was.\"\nmsgstr \"\"\n\n#. Key:\t4460452B4A8B40C59075779751D3D760\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LR_Window.LR_Window:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Ending/E2/LR_Window.LR_Window:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_LR_Window\"\nmsgid \"I didn’t leave the castle since Mom died.\"\nmsgstr \"\"\n\n#. Key:\t795D92CB49E6F50CE37897A793C6A711\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LR_Window.LR_Window:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Ending/E2/LR_Window.LR_Window:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_LR_Window\"\nmsgid \"Two years passed and they still didn’t give up throwing balls on the window to get my attention.\"\nmsgstr \"\"\n\n#. Key:\tB1A689B24F5D77A715114AB718126A75\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LR_Window.LR_Window:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E2/LR_Window.LR_Window:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_LR_Window\"\nmsgid \"They will never understand.\"\nmsgstr \"\"\n\n#. Key:\t06B2BD844B477A747E086F9F0C3BCAFE\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"Well, that fountain is definitely not your cup of tea but you can accept that it might be the fairest for the Magic Mirror...\"\nmsgstr \"\"\n\n#. Key:\t264C2C1040339F9680CA129F4E6E7764\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_65.Children(0).Children.Text\n#. Key:\t608D4BF341FEE76F239D6BA3B34F65E7\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_1.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_1.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_65.Children(0).Children.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"Who is the fairest?\"\nmsgstr \"\"\n\n#. Key:\t2C246C1326080F0A003A03BBBE7E9F40\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_39.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_39.Children(1).Children.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"Wish something\"\nmsgstr \"\"\n\n#. Key:\t2C6C88C54439E3C689E86DB30560B807\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_66.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_66.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"No matter how hard you try to receive a sign, the Mirror remains silent. It doesn't show you anything this time.\"\nmsgstr \"\"\n\n#. Key:\t317248C14F0904B6E6B04080841C75D1\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_39.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_39.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"The water seems to be boiling and the bubbles pop when they hit the surface; it is indeed mesmerizing. Suddenly, something breaks the silence - you can hear whispers.\"\nmsgstr \"\"\n\n#. Key:\t372D97104DC7D67AF4B2409B7CBC602D\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_66.Children(0).Children.Text\n#. Key:\t432E8D794C2FB271D9B39283EBD9E33B\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_1.Children(2).Children.Text\n#. Key:\tF212015B402EF862C9869394531175DC\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_65.Children(2).Children.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_1.Children(2).Children.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_65.Children(2).Children.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_66.Children(0).Children.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"Leave\"\nmsgstr \"\"\n\n#. Key:\t3FBF959348F2AFFA8016AA9371DD0800\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"You politely explain that you want to see your past instead of your body, but the Mirror is stubbornly stuck on this image.\"\nmsgstr \"\"\n\n#. Key:\t4620F3E84D5DC9847AB8A8891CF66F20\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_67.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_67.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"You place the flower and wait to see what happens.\"\nmsgstr \"\"\n\n#. Key:\t5C2363C64023EB8E1705D3BFC3310A8A\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_65.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_65.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"The vision fades away.\"\nmsgstr \"\"\n\n#. Key:\t648780E44EF4F6587D31E7AE2BE4CCE4\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_68.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_68.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"The Mirror seems to be unavailable at the moment. It doesn't want to be bothered. Maybe you should return later.\"\nmsgstr \"\"\n\n#. Key:\t74CAAA1D4671A258A6D188BCED32CCBD\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_69.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_69.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"The water turns still. Deep under the surface you notice a glimmering light.\"\nmsgstr \"\"\n\n#. Key:\t7CD8BEEA40A36A22057920807BBEEC07\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"The Magic Mirror shows things that were, things that are, and things that yet may be. \\r\\nYou fill the basin with water and start contemplating. You meditate about...\"\nmsgstr \"\"\n\n#. Key:\t8226F9B3495DE20F137F95A7F3583FE0\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"Ruin left this place almost untouched. The street lamps spread light on a couple of metal benches and flower pots.\"\nmsgstr \"\"\n\n#. Key:\t82C33F1E49C5DC76BF19648A414F7209\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"You are watching the ball and start to get frustrated. You don't want to look at this body replacement... this raggy shell... You want answers!\"\nmsgstr \"\"\n\n#. Key:\t8F94D5E34488ECDCE9E051BB1ABE66B9\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_1.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_1.Children(1).Children.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"Who you were in the past\"\nmsgstr \"\"\n\n#. Key:\t9BA86AAD4282A943E8A57390E2C4E3CF\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_39.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_39.Children(0).Children.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"Floating Flower\"\nmsgstr \"\"\n\n#. Key:\tA8A6D8D44F9344A162FAA080C839B28A\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"There are glass shards all over the place. There's a ball on the floor next to the girl.\"\nmsgstr \"\"\n\n#. Key:\tAF212CEC43A56245A848DABD21ECBAFC\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_70.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_70.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"You reach for the light and your fingers grab onto something smooth and cold.\"\nmsgstr \"\"\n\n#. Key:\tB8E2A52B442F3B45A1D993A8548DE124\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"You are seeing the wizard's room once more. There is a weakened little girl lying on the floor in the middle of the room. She is surrounded by stone runes, candles and magical potions.\"\nmsgstr \"\"\n\n#. Key:\tB9217F85404B488DB6F4DDACFF2B824C\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_65.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_65.Children(1).Children.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"What you were before\"\nmsgstr \"\"\n\n#. Key:\tCD33272B416D2FDE283D44BA6F50475C\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"The image zooms in and you have a clearer view of the fountain. You are waiting for more, but nothing happens.\"\nmsgstr \"\"\n\n#. Key:\tD64B38F1470B27D21AE539AE80AE666A\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"You are seeing the Ruined Realm from afar. The view gets closer until you find yourself looking at the top of a tower.\"\nmsgstr \"\"\n\n#. Key:\tF3C496794CC4A68DDC764895FF2DFC77\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_72.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_72.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"You found a precious rune stone! Hmmm...Is this the gift offered by the Mirror in exchange for your enchanting flower?\"\nmsgstr \"\"\n\n#. Key:\t10A6FAE44F71FBB21522B1AAE5E20DAE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_29.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_29.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"I don’t care what happens here after I’m back home.\"\nmsgstr \"\"\n\n#. Key:\t12C6550D4143AFE12C6986B427D2927A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"He can’t release his daughter. He can’t accept that she is gone. He wants to get her back even if it means they all die after a few months...\"\nmsgstr \"\"\n\n#. Key:\t1C714E474408001FB67CEABF92FAB019\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Wait! You can’t just dis...\"\nmsgstr \"\"\n\n#. Key:\t209B77394D419812DD1BD7A3D7A92B94\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_39.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_39.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"All right and what can we do against it?\"\nmsgstr \"\"\n\n#. Key:\t209BF95E4275418CE020E3AB028AFC10\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Now it’s better.\"\nmsgstr \"\"\n\n#. Key:\t230C6ED4416FDD6C5E00FAB8B30FBB17\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"To be honest I don’t have the faintest idea. I just want to be free again.\"\nmsgstr \"\"\n\n#. Key:\t25227AB342F4A0E76082539072C1143D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_37.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_37.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Do you think Ruin will stop after swallowing the Human Realm?\"\nmsgstr \"\"\n\n#. Key:\t266261C240DB77D1306C5F8EEE3D0189\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"He says he wants his daughter back but I think he is still trying to close the Realm to stop Ruin.\"\nmsgstr \"\"\n\n#. Key:\t283810E04DE48471FBE6BD9BE9DD337D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Yet he doesn’t care about the World. He wants to get her back even if it means they all die after a few months...\"\nmsgstr \"\"\n\n#. Key:\t2CE94F19412379ECE927A3AEEEAC3756\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_1.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_1.Children(1).Children.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Thanks for the Soulcaster\"\nmsgstr \"\"\n\n#. Key:\t2DB5F39F45BB9EC8ABBFEA9020DF94E7\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Why should it concern me if Ruin destroys your Realm? You deserve it for summoning us to do the hard work.\"\nmsgstr \"\"\n\n#. Key:\t30E5A67B4135A5402AE021832F89D4D1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"You again? I told you if you want something from the Wizard go and find him yourself...\"\nmsgstr \"\"\n\n#. Key:\t34BCB98247406A77FB5A5C8942543588\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_38.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_38.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"It might take time but it will reach the Unknown Realm and all the spirits will become part of Ruin just like those who were summoned here.\"\nmsgstr \"\"\n\n#. Key:\t379B50904FB774AD057BBB810BDD445C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_41.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_41.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"I’m not sure. I will think about it.\"\nmsgstr \"\"\n\n#. Key:\t38BEECF94D2EB7B2C6596593E576A360\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_30.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_30.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"The Wizard created a device which can separate the Realms. This is the only way to stop Ruin from spreading.\"\nmsgstr \"\"\n\n#. Key:\t3D7B856A4D97FCCC2A2B89BCB6295471\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"This time I would like to talk to you...\"\nmsgstr \"\"\n\n#. Key:\t40A329C7465166A11C73B694D6A79A00\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_12.Children(2).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_12.Children(2).Children.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Don’t know\"\nmsgstr \"\"\n\n#. Key:\t4D356117496E625B6B4C64A611496A9F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_24.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_24.Children(1).Children.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Not my problem\"\nmsgstr \"\"\n\n#. Key:\t4FE5ADF04D1079CCD1E16697E82B39B5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_35.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_35.Children(0).Children.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Accept plan\"\nmsgstr \"\"\n\n#. Key:\t53D6055344A880433B1093B029DA8CA5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_12.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_12.Children(0).Children.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Bring back daughter\"\nmsgstr \"\"\n\n#. Key:\t599FF022411F5BA2EB0F32A1F947C661\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_35.Children(2).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_35.Children(2).Children.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Not sure\"\nmsgstr \"\"\n\n#. Key:\t5FD6018040C38B8A3F40C78C913AC251\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_40.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_40.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Have no fear, I will have this done!\"\nmsgstr \"\"\n\n#. Key:\t6B3585BA4AFE614FF428FCAE698872A8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_33.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_33.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"For you this would be completely different. For you this is not a sacrifice but a way of going home!\"\nmsgstr \"\"\n\n#. Key:\t6E1C94F24F493D7075A7509F8181AD27\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"You are wrong. The World is falling apart yet he doesn’t care about it even when he is the only one who could stop Ruin.\"\nmsgstr \"\"\n\n#. Key:\t71A64B804C0CCE26571E9E8237AA5000\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"I’m also glad. It was bloody damn difficult.\"\nmsgstr \"\"\n\n#. Key:\t78305AE64B56098D32806EB509133BBC\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_35.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_35.Children(1).Children.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Decline plan\"\nmsgstr \"\"\n\n#. Key:\t7C92B8BF4CEA3093BB817682B501DC67\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"The World is falling apart and only the Wizard has a chance to stop this.\"\nmsgstr \"\"\n\n#. Key:\t8B2CE8144EB2A7C89AFA1BACC3EE1B88\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Hello, little Wanderer! I’m glad you made it this far.\"\nmsgstr \"\"\n\n#. Key:\t8CC98B374125E6E6A6A20C97F4A3B067\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_24.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_24.Children(0).Children.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"I'm a demon\"\nmsgstr \"\"\n\n#. Key:\t8D4701A1469997CBC879788351B37B0A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_31.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_31.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"My plan is simple.\"\nmsgstr \"\"\n\n#. Key:\t8E4693F04E60AFF4757A5887973894BE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_27.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_27.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"I saw Ruin and I don’t want the same to happen to any other Realm. What can I do?\"\nmsgstr \"\"\n\n#. Key:\t9193CB2747033644F006809E0E4A812A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_45.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_45.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"For the sake of all Realms I hope you will make the right decision.\"\nmsgstr \"\"\n\n#. Key:\t95D6FBCC42CC4F4041D0B5B64996FD5C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_35.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_35.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Once you are there find the Laboratory and activate the device! It will take you home and will separate the Worlds which means no spirit will be ever summoned again!\"\nmsgstr \"\"\n\n#. Key:\t9ADEF37F49EA90EF320B5E8BB2D8D769\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"...and I don’t want our conversation to be overheard, so if you don’t mind...\"\nmsgstr \"\"\n\n#. Key:\t9F01EFC54F3FC5B709F697860BE0572D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_24.Children(2).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_24.Children(2).Children.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"How to save the World?\"\nmsgstr \"\"\n\n#. Key:\tA71226674132E2666925AEB28D2FC024\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_46.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_46.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Farewell Wanderer!\"\nmsgstr \"\"\n\n#. Key:\tB1E3A9DB4A75C08067DCA19113A6A8A2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Calm down little spirit.\"\nmsgstr \"\"\n\n#. Key:\tB355BD604F9EC22514DA14B64B0F5E5E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_43.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_43.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Thank you Spirit! For the sake of all Realms I hope you won’t fail on your way!\"\nmsgstr \"\"\n\n#. Key:\tB6D3E23045C4BC5B3E5F3D83E2DFBADB\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_19.Text\n#. Key:\tDC3219914721210BD169D2989F03D18D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"But we won’t let this happen, will we?\"\nmsgstr \"\"\n\n#. Key:\tBAC828A540E6C81EE43EBF8036A8146A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_42.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_42.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"You deserve Ruin. I won’t save the Human Realm!\"\nmsgstr \"\"\n\n#. Key:\tC837CED4495F79594133F4B2C0FCE5F8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Where shall I start? Do you know what the Wizard is up to? Did he tell you?\"\nmsgstr \"\"\n\n#. Key:\tD060173B4D5502FC06A69E865DAFD5E6\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_26.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_26.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"This is not my Realm and not my problem. All I want is to get out of here.\"\nmsgstr \"\"\n\n#. Key:\tD520C3AC46F62B77554443A4589845C1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"He would like to bring his daughter back to life. For that he needs three artefacts which are somewhere here.\"\nmsgstr \"\"\n\n#. Key:\tD7F841B14E18D77AB5FBD2A34D59BC92\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_44.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_44.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"I understand your fury. Yet I hope you will change your mind.\"\nmsgstr \"\"\n\n#. Key:\tD80B81914A550F305934F9852C1DD6B0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_23.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_23.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"He lost his daughter and he can’t release her. He can’t accept that she is gone.\"\nmsgstr \"\"\n\n#. Key:\tD816A79E4160BC4426CD22A63C7987A0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Before you go on I have something to discuss with you...\"\nmsgstr \"\"\n\n#. Key:\tDD870754471358DEFE9CB5BFA554AB7C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_1.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_1.Children(0).Children.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Me too\"\nmsgstr \"\"\n\n#. Key:\tE0CCA2604AA40FED355A859A1FA02DDA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_1.Children(2).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_1.Children(2).Children.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"I won’t deliver any message\"\nmsgstr \"\"\n\n#. Key:\tE1C3F2E34680BA8B67521C905AD42ADA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"That’s correct. He can’t release his daughter. He can’t accept that she is gone.\"\nmsgstr \"\"\n\n#. Key:\tE93136104181FAA899F2CE801497DCBA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_25.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_25.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"I know right now it doesn’t look that way, but I’m a mighty demon of the Unknown Realm.\"\nmsgstr \"\"\n\n#. Key:\tEC116A8848A471EB2C5DC8BA1D187C9A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_12.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_12.Children(1).Children.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Close Ruined Realm\"\nmsgstr \"\"\n\n#. Key:\tEC6221CE4B85E7D1887DBCA6D85D8238\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"It wasn’t easy but I made good use of the Spellcaster you gave me.\"\nmsgstr \"\"\n\n#. Key:\tED5356DE42F2ED2203F7AFB30231643E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_34.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_34.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"When you deliver the artefacts he will let you into his tower.\"\nmsgstr \"\"\n\n#. Key:\tEE78AD4147800BD0E160A8B6A3F51FBD\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_32.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_32.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"When the Wizard’s daughter activated the device it transported her soul into the Unknown Realm. At that point the Wizard stopped the device so that he can summon his daughter back.\"\nmsgstr \"\"\n\n#. Key:\tEFACA50447BAC08293281BB11A5E11B3\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_36.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_36.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"This is just as much your problem as it is mine.\"\nmsgstr \"\"\n\n#. Key:\tFB0E702746132A3C688D9EA492A01B50\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"You made it and that is what matters.\"\nmsgstr \"\"\n\n#. Key:\t4BE3EE734EFED241B7FA2192EEB146A5\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/MR_Bed.MR_Bed:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Ending/E2/MR_Bed.MR_Bed:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_MR_Bed\"\nmsgid \"We always wore colourful clothes because that made her happy.\"\nmsgstr \"\"\n\n#. Key:\t7F5F069D4E9C7F15ED2B8CA45154FCFE\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/MR_Bed.MR_Bed:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E2/MR_Bed.MR_Bed:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_MR_Bed\"\nmsgid \"Most of her time she just lied here and stared at nothing.\"\nmsgstr \"\"\n\n#. Key:\tEA25DBC34832960AB03A32A5B08AC404\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/MR_Bed.MR_Bed:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E2/MR_Bed.MR_Bed:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_MR_Bed\"\nmsgid \"Sometimes she talked about grey lands.\"\nmsgstr \"\"\n\n#. Key:\t58E06C3A45DD46A34F155BAA62933039\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/MR_Chair.MR_Chair:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Ending/E2/MR_Chair.MR_Chair:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_MR_Chair\"\nmsgid \"I hope they will never find out how wrong they were. I hope there is still time for our World.\"\nmsgstr \"\"\n\n#. Key:\t9EA75B664E62ABF38E44BE8DC3050AC9\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/MR_Chair.MR_Chair:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E2/MR_Chair.MR_Chair:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_MR_Chair\"\nmsgid \"This is where the doctor used to sit. He never believed that Mom was infected by the Ruin.\"\nmsgstr \"\"\n\n#. Key:\tA408630F44A3B2345A2D0AA8395D97F2\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/MR_Chair.MR_Chair:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E2/MR_Chair.MR_Chair:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_MR_Chair\"\nmsgid \"No one ever believed in Ruin.\"\nmsgstr \"\"\n\n#. Key:\t1AFEF7EB49BB3BEA5BB76793A60ED7C9\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/MR_Lamps.MR_Lamps:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E2/MR_Lamps.MR_Lamps:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_MR_Lamps\"\nmsgid \"This room was the brightest in the castle.\"\nmsgstr \"\"\n\n#. Key:\tC132BEA446B4441615D7029E8AA5BBB5\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/MR_Lamps.MR_Lamps:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E2/MR_Lamps.MR_Lamps:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_MR_Lamps\"\nmsgid \"I took some oil.\"\nmsgstr \"\"\n\n#. Key:\tFE826997431A2665AC2788A62558B88E\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/MR_Lamps.MR_Lamps:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Ending/E2/MR_Lamps.MR_Lamps:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_MR_Lamps\"\nmsgid \"Father bought some exotic lamp oil so that we had coloured lights.\"\nmsgstr \"\"\n\n#. Key:\t430A10B04FAC9288EC2794A31DF6699E\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/MR_Paintings.MR_Paintings:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E2/MR_Paintings.MR_Paintings:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_MR_Paintings\"\nmsgid \"Mom was always fond of art.\"\nmsgstr \"\"\n\n#. Key:\t53AA7E134FA0E30F37FC8CB50425520F\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/MR_Paintings.MR_Paintings:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E2/MR_Paintings.MR_Paintings:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_MR_Paintings\"\nmsgid \"After she got sick she couldn’t paint the way she did before yet she still liked it.\"\nmsgstr \"\"\n\n#. Key:\t8484045A4107378E9CC8FFAA02C94A87\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/MR_Paintings.MR_Paintings:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Ending/E2/MR_Paintings.MR_Paintings:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_MR_Paintings\"\nmsgid \"It could engage her for hours.\"\nmsgstr \"\"\n\n#. Key:\t009BF08145DBE86FFB07BA9A6BD77A8E\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_5.Children(2).Children.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_5.Children(2).Children.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"Not my business\"\nmsgstr \"\"\n\n#. Key:\t00DE9BE1446C5D5C0D62469B41A1B693\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_5.Children(0).Children.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_5.Children(0).Children.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"Lillian?\"\nmsgstr \"\"\n\n#. Key:\t0C3B729C4618E8A817F019B8E916425B\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"Maybe we failed the ritual again and summoned another of your kind.\"\nmsgstr \"\"\n\n#. Key:\t0CAC15144B37144A99A9EB9D13CCC9DE\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_32.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_32.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"What do you expect me to do, Spirit?\"\nmsgstr \"\"\n\n#. Key:\t1493C597483503024A3C5CA8F0FA1327\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"I’ve already done way too much for you.\"\nmsgstr \"\"\n\n#. Key:\t15BAD73D49BF7C62469D8E9CD0B2AAF4\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"Now, take me home!\"\nmsgstr \"\"\n\n#. Key:\t1962A69C42E8FDD365AFC9AB626605F7\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"We made the spell... and it worked!\"\nmsgstr \"\"\n\n#. Key:\t1AC8DD104163078CA72065A0B43B5C57\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"And then what?\"\nmsgstr \"\"\n\n#. Key:\t2034A3164695766F8C17B69CD0937C02\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_25.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_25.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"And he...\"\nmsgstr \"\"\n\n#. Key:\t22668011432DEF65ACF29793FF234E07\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_37.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_37.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"Someone like me...\"\nmsgstr \"\"\n\n#. Key:\t2386A8D24BD256982D486AAF71B57ABD\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_23.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_23.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"She destroyed half of the room before we could even cast a spell.\"\nmsgstr \"\"\n\n#. Key:\t250E11A440445CAFB5252A92C5100735\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"That’s how you handle situations like these...\"\nmsgstr \"\"\n\n#. Key:\t298BEA5646602444742C3BAD65866EF9\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"I’m not sure... Everything happened so fast.\"\nmsgstr \"\"\n\n#. Key:\t2FAFABFC43A75D29B671739D16759E43\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"What happened?\"\nmsgstr \"\"\n\n#. Key:\t303D9BF54AB3034565A45594AB5636DF\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"I can’t... I’m sorry!\"\nmsgstr \"\"\n\n#. Key:\t378D7F984C821E23AF0CBEA7D24EFCC1\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"What happened to Lillian? Has she returned?\"\nmsgstr \"\"\n\n#. Key:\t38EF0908448C7E5298C4F496DACAD5AD\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"Something... arrgh... something went wrong...\"\nmsgstr \"\"\n\n#. Key:\t3A328FA74AA2FBC2AFE84CA195DAE236\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"You are Raven’s master...\"\nmsgstr \"\"\n\n#. Key:\t462226704638D0C32B1DEBA3DFE138A1\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"She was taken over by a wicked force and she unleashed boundless spells.\"\nmsgstr \"\"\n\n#. Key:\t49B5501A4917D23E6B3B99B430076ABA\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"It was like the devil itself.\"\nmsgstr \"\"\n\n#. Key:\t4B173FBD4D4F48A468016BB055CC573C\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"Where is Wizard? Something happened to him?\"\nmsgstr \"\"\n\n#. Key:\t5341F61045AA32F212173EA9CAB67695\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_39.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_39.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"Wizard was right when he decided to trust you.\"\nmsgstr \"\"\n\n#. Key:\t551AEBA64D1E99B2CCFA3DB13E168A02\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_27.Children(1).Children.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_27.Children(1).Children.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"I won’t fight\"\nmsgstr \"\"\n\n#. Key:\t592A8CF045DF1BD875B05F9493FE2BB4\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_38.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_38.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"I will face her!\"\nmsgstr \"\"\n\n#. Key:\t5B65F12D43B12FA943D7469FEE2CE2E0\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"We made everything right...\"\nmsgstr \"\"\n\n#. Key:\t65A974C344D2B4DD644901994086A31D\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_30.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_30.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"Why is it that every time you refuse to face the consequences of your actions, it is me who needs to clean up your mess?\"\nmsgstr \"\"\n\n#. Key:\t66D0FDF04AF5351330E83080759ED974\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_40.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_40.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"I'm sorry that I can't help...\"\nmsgstr \"\"\n\n#. Key:\t7FFE18B74C54BB92334399983F82DBCA\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_34.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_34.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"You are free to do whatever you want!\"\nmsgstr \"\"\n\n#. Key:\t8739EB3D48E4F2A997E604A60F7F32B3\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"Was it trapped inside a teddy bear?\"\nmsgstr \"\"\n\n#. Key:\t8E2F09164340534A484A46AD45E4E105\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_27.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_27.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"The demon-Lillian left. There is no one who could stop her now...\"\nmsgstr \"\"\n\n#. Key:\t900D084E4F673FEBEACE3E916103B93E\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"She had fire in her eyes...\"\nmsgstr \"\"\n\n#. Key:\t91C26C314425AB8C973F1FB54061F639\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"Lillian woke up and then...\"\nmsgstr \"\"\n\n#. Key:\t95CE9C6C4901E613AD5DB38E51AC0DB3\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_35.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_35.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"Leave and let me rest in peace...\"\nmsgstr \"\"\n\n#. Key:\t9AF3E069409F31E4F50A5990A416A39C\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_19.Children(1).Children.Text\n#. Key:\tF5A670D640D73DF452C02A948CB68F75\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_5.Children(1).Children.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_19.Children(1).Children.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_5.Children(1).Children.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"Wizard?\"\nmsgstr \"\"\n\n#. Key:\t9B1B8322442B6D7D76F2119E0A0574FA\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"Is the Wizard safe? What happened afterwards?\"\nmsgstr \"\"\n\n#. Key:\tA82789354D984476223432A2BE199293\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_24.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_24.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"I was hit by the table.\"\nmsgstr \"\"\n\n#. Key:\tAA6EFD044C1D21008EEA189DE75740E7\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_41.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_41.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"Good luck with... everything!\"\nmsgstr \"\"\n\n#. Key:\tACAF3D904A149C0E9F91E5AC852D8309\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_31.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_31.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"Let me go!\"\nmsgstr \"\"\n\n#. Key:\tB223647F4C35858A62A5509C7B22C23B\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_27.Children(0).Children.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_27.Children(0).Children.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"I'll stop her\"\nmsgstr \"\"\n\n#. Key:\tD0E16FEF4D5415EC6D2C299252E5675D\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_26.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_26.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"He was burnt to ashes.\"\nmsgstr \"\"\n\n#. Key:\tD23076F4475E6CE385ECB2B3B2749CA9\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_36.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_36.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"I have always wanted to meet someone of my own kind anyway.\"\nmsgstr \"\"\n\n#. Key:\tD290445E4EB74446478970934785BA10\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"I can’t open a Gate without Wizard...\"\nmsgstr \"\"\n\n#. Key:\tD6EB1BE248E9C483E6D94B8E8A7815F6\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"I don't understand... It is...\"\nmsgstr \"\"\n\n#. Key:\tEC42D62E46269139E9E69B876EDED5B1\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_33.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_33.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"It wasn't me who brought you here.\"\nmsgstr \"\"\n\n#. Key:\tF0711D5F4698DAA99E484E94FDB3EF9C\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_19.Children(0).Children.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_19.Children(0).Children.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"Was it trapped?\"\nmsgstr \"\"\n\n#. Key:\tFDE62A034456071EFE9639B73108BB1E\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"I can't let her destroy everything!\"\nmsgstr \"\"\n\n#. Key:\tFDFD2B2B4352B564118519874199B48C\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_29.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_29.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"No-no-no!\"\nmsgstr \"\"\n\n#. Key:\t2E3C904D458640A4F06DD793B416366A\n#. SourceLocation:\t/Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_SewerCreatures\"\nmsgid \"All right, I will return when I'm done.\"\nmsgstr \"\"\n\n#. Key:\t41F6B75041803A654088469BCB887165\n#. SourceLocation:\t/Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_1.Children(0).Children.Text\n#: /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_1.Children(0).Children.Text\nmsgctxt \"Dialogue_SewerCreatures\"\nmsgid \"Really?\"\nmsgstr \"\"\n\n#. Key:\t43EE0E60407CA7CB7431BDB2767C6E19\n#. SourceLocation:\t/Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_SewerCreatures\"\nmsgid \"That's sad. What happened exactly?\"\nmsgstr \"\"\n\n#. Key:\t53AC225B4F21B68CAC6F8997F324124E\n#. SourceLocation:\t/Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_29.Text\n#: /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_29.Text\nmsgctxt \"Dialogue_SewerCreatures\"\nmsgid \"Farewell until we meet again!\"\nmsgstr \"\"\n\n#. Key:\t5ED0CE6143EC50E6B5A1289D1A9A88E2\n#. SourceLocation:\t/Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_SewerCreatures\"\nmsgid \"I'm glad I could help.\"\nmsgstr \"\"\n\n#. Key:\t65042BC342E9717229E74A9DD272DC5F\n#. SourceLocation:\t/Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_SewerCreatures\"\nmsgid \"It was nice to see you again.\"\nmsgstr \"\"\n\n#. Key:\t77959A144131C47488B221ADD9B1E13B\n#. SourceLocation:\t/Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_SewerCreatures\"\nmsgid \"Don't worry! I'm still looking for it.\"\nmsgstr \"\"\n\n#. Key:\t7914F3CA40844C2A13A760BB0DAE1BFA\n#. SourceLocation:\t/Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_SewerCreatures\"\nmsgid \"I don't have time for you creature! Stay out of my way!\"\nmsgstr \"\"\n\n#. Key:\t79A62658414FE0202F2E9AA0E0238BD4\n#. SourceLocation:\t/Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_9.Children(0).Children.Text\n#: /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_9.Children(0).Children.Text\nmsgctxt \"Dialogue_SewerCreatures\"\nmsgid \"Accept Quest\"\nmsgstr \"\"\n\n#. Key:\t7EF6CBFA4A9C0B85B26AA6830C6121A2\n#. SourceLocation:\t/Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_1.Children(2).Children.Text\n#: /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_1.Children(2).Children.Text\nmsgctxt \"Dialogue_SewerCreatures\"\nmsgid \"Leave\"\nmsgstr \"\"\n\n#. Key:\t85A2E48A4B27C5EB7DA4CFAA23555629\n#. SourceLocation:\t/Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_26.Text\n#: /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_26.Text\nmsgctxt \"Dialogue_SewerCreatures\"\nmsgid \"Farewell and good luck to you as well!\"\nmsgstr \"\"\n\n#. Key:\t9AEDA0E84BABEBCD8F18E8BC2D0B75D0\n#. SourceLocation:\t/Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_SewerCreatures\"\nmsgid \"Calm down creature! I mean you no harm.\"\nmsgstr \"\"\n\n#. Key:\tB89304534B24114D19DF7AB07635FFDE\n#. SourceLocation:\t/Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_SewerCreatures\"\nmsgid \"All right I will see what I can do.\"\nmsgstr \"\"\n\n#. Key:\tB8BD374E4738BFFDAFAC4EAA19E7A9D2\n#. SourceLocation:\t/Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_23.Text\n#: /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_23.Text\nmsgctxt \"Dialogue_SewerCreatures\"\nmsgid \"Oh, thank you!\"\nmsgstr \"\"\n\n#. Key:\tCAFA874D4ECD3CBFC0ADFD93048A9AA5\n#. SourceLocation:\t/Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_SewerCreatures\"\nmsgid \"Just tell me what do you want...\"\nmsgstr \"\"\n\n#. Key:\tCF62984840B7508E82BAC0AB9D53EC0A\n#. SourceLocation:\t/Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_9.Children(1).Children.Text\n#: /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_9.Children(1).Children.Text\nmsgctxt \"Dialogue_SewerCreatures\"\nmsgid \"Decline\"\nmsgstr \"\"\n\n#. Key:\tDA1FD0DC49E9B2999DCD489699C04106\n#. SourceLocation:\t/Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_1.Children(1).Children.Text\n#: /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_1.Children(1).Children.Text\nmsgctxt \"Dialogue_SewerCreatures\"\nmsgid \"Let it talk\"\nmsgstr \"\"\n\n#. Key:\tEAD329F04773358B0CA339A4F155D990\n#. SourceLocation:\t/Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_SewerCreatures\"\nmsgid \"I'm sorry but I can't help you.\"\nmsgstr \"\"\n\n#. Key:\tDA8649E54E3753ECDF9C4EAAB90D42B6\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/sewertut1.sewertut1:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/sewertut1.sewertut1:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_sewertut1\"\nmsgid \"I don't like the idea of this additional challenge, but without the help of the Keeper you won't be able to get out.\"\nmsgstr \"\"\n\n#. Key:\t462EF40B4BF77FA77FD98DB4656692A2\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/sewertut2_magicbox.sewertut2_magicbox:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/sewertut2_magicbox.sewertut2_magicbox:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_sewertut2_magicbox\"\nmsgid \"It's a magic box! That's what it's supposed to do, demon.\"\nmsgstr \"\"\n\n#. Key:\tC34B7D8D499A8E8B767A58A19537A1EA\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/sewertut2_magicbox.sewertut2_magicbox:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/sewertut2_magicbox.sewertut2_magicbox:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_sewertut2_magicbox\"\nmsgid \"Is that box just floating in the air?\"\nmsgstr \"\"\n\n#. Key:\t348CCFC54F7E952295416496617F7615\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/sewertut3_silverkey.sewertut3_silverkey:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/sewertut3_silverkey.sewertut3_silverkey:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_sewertut3_silverkey\"\nmsgid \"What is that crystal?\"\nmsgstr \"\"\n\n#. Key:\t554B6C924D0234A869BDFF9412FC4F49\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/sewertut3_silverkey.sewertut3_silverkey:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/sewertut3_silverkey.sewertut3_silverkey:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_sewertut3_silverkey\"\nmsgid \"Don't care about that. Focus on finding a way out.\"\nmsgstr \"\"\n\n#. Key:\t015A0B11422A6F2AE027FF8D9DF70664\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"We need his help.\"\nmsgstr \"\"\n\n#. Key:\t03C73AA849BF05421AB97BA696A8C9C4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_79.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_79.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"They always wanted to invade the Outpost. They are many and we are few.\"\nmsgstr \"\"\n\n#. Key:\t0849CCCF4491D52B38AE7F827841E479\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Why should I set you free?\"\nmsgstr \"\"\n\n#. Key:\t090C7BBF4222952E1C3FD38F7CF9927E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_76.Text\n#. Key:\t0AC46EF744AA55EDDA83EDB6899BB2D1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_65.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_65.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_76.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Some say Tabby's spirit returned and took the artefacts to Lillian. Maybe that is what happened.\"\nmsgstr \"\"\n\n#. Key:\t094943BF4D9202CE7B1CFCBF151886D5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Back to the question: will you get me out?\"\nmsgstr \"\"\n\n#. Key:\t0DBF728A4C052550BE5EEDBC9DEFB2E0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_29.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_29.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"I would invite you for dinner but unfortunately the door is closed.\"\nmsgstr \"\"\n\n#. Key:\t112A48C54853F7689E1676A11FA8C352\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_48.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_48.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"No time to talk!\"\nmsgstr \"\"\n\n#. Key:\t116C39AA495E99500962E8B3AF10DD4A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_83.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_83.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"I mean I'm sorry about the others... not that you survived.\"\nmsgstr \"\"\n\n#. Key:\t134299214C22044B012C27B62337C08E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_69.Text\n#. Key:\tFD1574E845CB284B7A85F09CA1580DD4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_58.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_58.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_69.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"But she is gone for months and no one knows where she might be.\"\nmsgstr \"\"\n\n#. Key:\t14BD2A7C45E85692430B34820042C96F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_73.Text\n#. Key:\tEA5320F3406E2BFA9BD954899BFA19DA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_62.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_62.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_73.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"He had so many friends. We all gathered and buried him near the Ancient Temple.\"\nmsgstr \"\"\n\n#. Key:\t16E175D0437B4A671F4753A56E840278\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_33.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_33.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"I’m looking for three artefacts. Do you know something about them?\"\nmsgstr \"\"\n\n#. Key:\t174BA1E34131FB1BD5A543A3CB86C724\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_35.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_35.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"I will return to the Main Station at Crossroad Cave and see what I can do with the trains.\"\nmsgstr \"\"\n\n#. Key:\t1769115D4B72AB6CF8641487126A4A18\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"It has a key. The end of it is shaped like a dwarven helmet. You can easily recognise it.\"\nmsgstr \"\"\n\n#. Key:\t17CBB2E24B331E4C5682919AAD2E7F2E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_60.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_60.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"What happened to Tabby?\"\nmsgstr \"\"\n\n#. Key:\t1AA8B2E541B2B2E7CA1E86B1E08C1E5A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"They are all dead...\"\nmsgstr \"\"\n\n#. Key:\t1FCCD37546681195736D2290A8DAE121\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Oh, it’s you again.\"\nmsgstr \"\"\n\n#. Key:\t2581B27E486A1C71835E5BB44B0AE05E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_37.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_37.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"But first I finish my supper. See you there!\"\nmsgstr \"\"\n\n#. Key:\t2589E4AA4E5A406F6A98CB87D7382DC0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Just ask one of the other dwarfs to open the door.\"\nmsgstr \"\"\n\n#. Key:\t26162C784D2E65A2F8F491A80838F754\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_24.Children(4).Children.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_24.Children(4).Children.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Everyone dead?\"\nmsgstr \"\"\n\n#. Key:\t2FEAED2844737D1B20BA64AE2414D8C6\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_72.Text\n#. Key:\tA119C2164FDE16E8F84B4E89578A1015\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_61.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_61.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_72.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"By the time I found him he was dead.\"\nmsgstr \"\"\n\n#. Key:\t3203A6044456CD8213037A9B1B668763\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Please help me out!\"\nmsgstr \"\"\n\n#. Key:\t32C0BE7F49563BC2846691B4F163AEF7\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Well that explains why they didn’t come for me over the last four months.\"\nmsgstr \"\"\n\n#. Key:\t35F849134220FAE43E07268C439CE3A1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_31.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_31.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"What were you Dwarves doing here?\"\nmsgstr \"\"\n\n#. Key:\t39D36DCA4CD40A7E19D4F5AE69954DC3\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_71.Text\n#. Key:\tEFD384D542A5869726CAB7945F4C0EC4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_54.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_54.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_71.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Tabby found the three artefacts but on his way home he got injured.\"\nmsgstr \"\"\n\n#. Key:\t39DEF30C4C3CCAB79867339AABD92BA0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_24.Children(3).Children.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_24.Children(3).Children.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Artefacts\"\nmsgstr \"\"\n\n#. Key:\t3AF0406744C4656C5604EF931A688715\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_23.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_23.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"I've found the key!\"\nmsgstr \"\"\n\n#. Key:\t3E074E784D66BE166553EB9F85D9854A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"How can I set you free?\"\nmsgstr \"\"\n\n#. Key:\t4100ECBE40C53051121F4C8A588FBDCB\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_24.Children(2).Children.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_24.Children(2).Children.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Train\"\nmsgstr \"\"\n\n#. Key:\t41085B174230937FAF97CDBC868F852A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_24.Children(5).Children.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_24.Children(5).Children.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Leave\"\nmsgstr \"\"\n\n#. Key:\t4204AAFB49C665B3CC32D78301307582\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_45.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_45.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Do you mean those traps out there?\"\nmsgstr \"\"\n\n#. Key:\t44AF6FF04B8A23F656F485AB9F1AFE60\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_36.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_36.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Catch me there if you need to go somewhere!\"\nmsgstr \"\"\n\n#. Key:\t48FC728C4467C7CF9692AEB8CC71352D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_49.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_49.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"I will catch you at Crossroad Cave after I finished my supper.\"\nmsgstr \"\"\n\n#. Key:\t4A74231B43F74B39906C85904332EE87\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"What happened? How did you end up here?\"\nmsgstr \"\"\n\n#. Key:\t4FE354D247D257B181993087E5ADC74C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Errr... I don’t know... out of pure righteousness perhaps?\"\nmsgstr \"\"\n\n#. Key:\t529895FF4D6B505A0EDB5081215845AE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_53.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_53.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"He wasn't just an ordinary cat. He was somehow connected to a charming young girl called Lillian.\"\nmsgstr \"\"\n\n#. Key:\t5C005582439FD5753AA90BB72F3284C8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_44.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_44.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"We build walls. We create machines out of golem spirits with simple rules which can't go wrong.\"\nmsgstr \"\"\n\n#. Key:\t5C48292B4E4F1FAF4D7BB487713EA0B1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_59.Text\n#. Key:\t7F06827C4756423AE024F99922B00FDE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_70.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_59.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_70.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"I hope she will return.\"\nmsgstr \"\"\n\n#. Key:\t624EDA19418303508EA7F58C5BD0DB4E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"All right!\"\nmsgstr \"\"\n\n#. Key:\t64E994E34D543F58D0F9DAA386AD7438\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Or do you like trains? I can help you redirect them to stations you couldn’t go otherwise.\"\nmsgstr \"\"\n\n#. Key:\t674A3DC8404EF8FC317D72A70877A0FF\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Errr... You know, sometimes in the evening I come here and have some late dinner. And there are others who think it would be funny to close the door when I'm inside.\"\nmsgstr \"\"\n\n#. Key:\t6B07A15F4E86ECA507DE1DA9B0634774\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_74.Text\n#. Key:\t8F415D40481AA448025D79AB123B2DEB\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_63.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_63.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_74.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"He was a good friend. We all miss him.\"\nmsgstr \"\"\n\n#. Key:\t6B47D3994D188506700B48BE85E0C740\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Once you collected all the artefacts you will need to take them back to a point where I can transport you to the Human Realm.\"\nmsgstr \"\"\n\n#. Key:\t6B72634A488C0A9471F52AA154E56709\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_82.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_82.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"I’m sorry about that.\"\nmsgstr \"\"\n\n#. Key:\t6C7C51F44B3881DDF4AE41B10F4D29E1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_52.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_52.Children(0).Children.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Tabby?\"\nmsgstr \"\"\n\n#. Key:\t6EC585D64AFBB18576EE17B9DFC08AD7\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_2.Children(2).Children.Text\n#. Key:\tFB66CFE943F6EF32D1A40987B969DCDF\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_52.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_2.Children(2).Children.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_52.Children(1).Children.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"What happened?\"\nmsgstr \"\"\n\n#. Key:\t766A9A50425FA0D0A0374390B2AF5980\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"I like jokes and it would have been funny for I don’t know a few hours maybe...\"\nmsgstr \"\"\n\n#. Key:\t81ABC3E441BE2D3A19257BBC9DDD42D0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_41.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_41.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"You can go down there by using the elevator.\"\nmsgstr \"\"\n\n#. Key:\t85B4C0DB47A2A3C3D504C29965DB6390\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_75.Text\n#. Key:\tE6F106AA404B92C9C6E8889876002813\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_64.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_64.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_75.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"We left the artefacts at his tomb, but one day later they disappeared.\"\nmsgstr \"\"\n\n#. Key:\t88F0611349D22BB5B8411FA1232B8724\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_38.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_38.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Bye!\"\nmsgstr \"\"\n\n#. Key:\t8A2BA24948D65C3EC801B6AA589C206F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_30.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_30.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Welcome back!\"\nmsgstr \"\"\n\n#. Key:\t8A3CCFA44EAB376D6CB4C3B7DD8CEE8D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_53.Children(0).Children.Text\n#. Key:\tEEEF64F84F3FE0A37D029EB1A8BBE8A9\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_55.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_53.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_55.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Lillian?\"\nmsgstr \"\"\n\n#. Key:\t8B9C46EA4C46385E6B3770BBD4648280\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_67.Text\n#. Key:\t999245954FBA1853A5E67A88353F152E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_56.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_56.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_67.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Lillian was really kind to us Dwarves. We couldn't ever meet her in person but she could talk to us via the cat Tabby.\"\nmsgstr \"\"\n\n#. Key:\t90C6625D4ED5F6EA08B07A87450A1BC9\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_32.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_32.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"You said something about trains...\"\nmsgstr \"\"\n\n#. Key:\t92793D7F4D0351BF74BB6A8C3EE6A182\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"How can I open the door?\"\nmsgstr \"\"\n\n#. Key:\t941CF27C40D3D82D6B41F5B3DD6501BB\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_52.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_52.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"My friend Tabby was also looking for artefacts.\"\nmsgstr \"\"\n\n#. Key:\t991D611A4F8BE2F8EAC77C9D746BAF95\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_78.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_78.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"I think the Kobolds attacked us by surprise.\"\nmsgstr \"\"\n\n#. Key:\t9A7FA46C4687C80EBE3B4580631E9B8E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_43.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_43.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"After the Cataclysm we realized the only way to fight madness is to create rules to follow.\"\nmsgstr \"\"\n\n#. Key:\t9E9CE4714145ED45CA301AACA6CEBBAF\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_40.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_40.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"But there is a spare key in the Catacombs.\"\nmsgstr \"\"\n\n#. Key:\t9ED5DDC74852A2007D25CDB418A3EDDA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_46.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_46.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"They surely have nothing to do with madness...\"\nmsgstr \"\"\n\n#. Key:\tA0117BB74AB541DE10847FBC5E5CCB32\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"What we were doing? Well we Dwarves are not like other creatures you might have met.\"\nmsgstr \"\"\n\n#. Key:\tA258ABB740D6727685853E88F32936E2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"That sounds useful.\"\nmsgstr \"\"\n\n#. Key:\tA3F231E34FB4B95DD27A84B9326E0BFE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_24.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_24.Children(0).Children.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Key\"\nmsgstr \"\"\n\n#. Key:\tB0B806C147D2EB9F312987B49DEBFC8F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_47.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_47.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"See? They are simple, effective and logical. Ruin can't harm us as long as we follow all the rules.\"\nmsgstr \"\"\n\n#. Key:\tB464CECC4F774535530FC685E0F62787\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_77.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_77.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Do you have any idea how the others died?\"\nmsgstr \"\"\n\n#. Key:\tBE69B91C466965EEF56A6F920AF9E5A8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"I thought they were just kidding.\"\nmsgstr \"\"\n\n#. Key:\tBFEAB99A4FE8C61CC35BCC9E926EFA97\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_51.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_51.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Just help me out.\"\nmsgstr \"\"\n\n#. Key:\tC06E3A27466B5D6C7FC4A39E55739800\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"But being here for four months seems a bit too much for me.\"\nmsgstr \"\"\n\n#. Key:\tC31327F8430D2259C27BAE91F44F0119\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_2.Children(0).Children.Text\n#. Key:\tCCD4C84941546627E158A4915B41CDB7\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_19.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_19.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_2.Children(0).Children.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"How?\"\nmsgstr \"\"\n\n#. Key:\tC3BFAD59497E357A8180ADB86C75F14B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_68.Text\n#. Key:\tFF1A18C04F33FF434A2821A725CBFB5C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_57.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_57.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_68.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"She cared about us. She knew all our Strongholds and Outposts. She always warned us before the Kobolds attacked.\"\nmsgstr \"\"\n\n#. Key:\tC5A94EDD47BC3D5F422A29982308E78D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_19.Children(1).Children.Text\n#. Key:\tF811970946DF32346DAE66AFE2F64664\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_2.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_19.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_2.Children(1).Children.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Why?\"\nmsgstr \"\"\n\n#. Key:\tC8E54B6E448A194DEB141C84323308F6\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_80.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_80.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"It was only a matter of time.\"\nmsgstr \"\"\n\n#. Key:\tCA02594643A55D1128F06FB2E8FDE676\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_50.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_50.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Yes, trains. I can help you reach destinations you couldn't reach on your own.\"\nmsgstr \"\"\n\n#. Key:\tCC191532450BFB2679AFD88AD95B72B2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Finally someone!\"\nmsgstr \"\"\n\n#. Key:\tCF4351D047E267981EF869BE88BB0753\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_24.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_24.Children(1).Children.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Dwarves\"\nmsgstr \"\"\n\n#. Key:\tD2377C864A2A80F17AD81581D7A7807F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_81.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_81.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Odd that I survived.\"\nmsgstr \"\"\n\n#. Key:\tDF12303E4C7A4DFB00054EA7CE07FF88\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_39.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_39.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Errr... I don't know.\"\nmsgstr \"\"\n\n#. Key:\tE8270F474353ECB77560C4A1173638A2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_27.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_27.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Any idea where that key might be?\"\nmsgstr \"\"\n\n#. Key:\tEF1EFC6E4119CC9B41AF21ACE008D3B5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_26.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_26.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Have you found the key?\"\nmsgstr \"\"\n\n#. Key:\tF47418854FDFB9AD0E10468BEC8F1F58\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_42.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_42.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"I need to go now.\"\nmsgstr \"\"\n\n#. Key:\tF553C35F43DFC6CA04DA48A738597696\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_25.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_25.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Back already?\"\nmsgstr \"\"\n\n#. Key:\tFF942F904300D874A8C59AB8A954EF86\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_34.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_34.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Well done! Thank you! Thank you!\"\nmsgstr \"\"\n\n#. Key:\t0499C9ED4395C4DD8AD1E48E854CD983\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"It was nice to see you too!\"\nmsgstr \"\"\n\n#. Key:\t07153D014D72AF193040BA91A18BDC0A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_24.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_24.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"Great!\"\nmsgstr \"\"\n\n#. Key:\t106E51E34033895E5C7F348AF8994564\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"Er... Thanks! We'll talk about this later.\"\nmsgstr \"\"\n\n#. Key:\t18E140B74385C5E48F23E0B7E862E569\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"Hello! It's nice to see you again.\"\nmsgstr \"\"\n\n#. Key:\t25F72BCA416C39658A0879A27417EA6B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"Don’t worry, I’ll make ready a train for you heading that way.\"\nmsgstr \"\"\n\n#. Key:\t26CBB1CD40F2080DE2183BA6AB3D2014\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"Ask him how you can travel to World’s End.\"\nmsgstr \"\"\n\n#. Key:\t26D1F4534C708623FB300DBE4EECADD2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"But I can't go back, because it's not safe.\"\nmsgstr \"\"\n\n#. Key:\t2B14E76B4B16316D7525FFA6D37E4CBB\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"You know I'm a bit worried about what will happen to the Outpost.\"\nmsgstr \"\"\n\n#. Key:\t2BB0F16046A4CD8DF05DE6A95D2CF9B3\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"I’m really glad you found that key for me. Now I can finish my supper outside in fresh air!\"\nmsgstr \"\"\n\n#. Key:\t36EF13F042D5B5ADB870BEB97F688D08\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_29.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_29.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"Take this! You deserve it!\"\nmsgstr \"\"\n\n#. Key:\t3E09B8F746E999130D26A0BEA945E6D6\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"Is everything all right?\"\nmsgstr \"\"\n\n#. Key:\t4D5A326948713FE977D0DBB68CF4A475\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_27.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_27.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"Except those crazy traps...\"\nmsgstr \"\"\n\n#. Key:\t5BE2C4324B64B35BD181B49E2D63E87F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"By the way, in case you need to go somewhere with the train just let me know.\"\nmsgstr \"\"\n\n#. Key:\t66EDC37F4F3B3813F1B92D91A4107ADE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"I have banished some of the monsters lurking in the Outpost.\"\nmsgstr \"\"\n\n#. Key:\t67EED0C742F3B4ED0A9B929C4B517A4A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"The Outpost is safe again.\"\nmsgstr \"\"\n\n#. Key:\t6F1AF94E4DE4A338EFF79C85D99B944A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_19.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_19.Children(1).Children.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"Outpost\"\nmsgstr \"\"\n\n#. Key:\t84D15B994BADC0AAED61848E817E49E1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"Thanks!\"\nmsgstr \"\"\n\n#. Key:\t8C7D69324C544DAC53C5CCA724B4B461\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_23.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_23.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"Could you somehow make the enemies move to somewhere else maybe?\"\nmsgstr \"\"\n\n#. Key:\t8F66738A44B7D19EABAD40873B3FCAA3\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_19.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_19.Children(0).Children.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"Do you need help?\"\nmsgstr \"\"\n\n#. Key:\t9249DFC34CFB46E1738C97A3283268D2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"Well done! Well done!\"\nmsgstr \"\"\n\n#. Key:\tA027C29849372B1C452083A84609B1F5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_19.Children(2).Children.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_19.Children(2).Children.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"Leave\"\nmsgstr \"\"\n\n#. Key:\tA037C9E543AC131DAF4B6281A27BD56C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"Hello again my friend!\"\nmsgstr \"\"\n\n#. Key:\tA4F1343D4D537FC1907096B564D3842E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"Oh, it must be a charming place!\"\nmsgstr \"\"\n\n#. Key:\tACF022EF4C55A6553F29DB969827379D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_26.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_26.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"Anyway, take this for your effort!\"\nmsgstr \"\"\n\n#. Key:\tB680A1D54923C59C081E46A65A2754D1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"As the last Defender, it would be my duty to keep that place safe.\"\nmsgstr \"\"\n\n#. Key:\tB9E0526D41FDB742FCB51991A0220B17\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"That’s where I can take you out of the Ruined Realm.\"\nmsgstr \"\"\n\n#. Key:\tBF1AD65A407133C13B811CB14A997A2A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"We can talk some more once I've finished my supper...\"\nmsgstr \"\"\n\n#. Key:\tE211EA4D4D69D09144B914850B17A8AE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_25.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_25.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"Well, I can't do my duty until you banish all of them.\"\nmsgstr \"\"\n\n#. Key:\tEFD408FF4DAFD18E10ED3282D959914E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"You don't need to go anywhere before you find the three artefacts.\"\nmsgstr \"\"\n\n#. Key:\tF500AA3C494B40302E298CA54FF3344B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"I would like to go to World’s End.\"\nmsgstr \"\"\n\n#. Key:\tFDC63C35472E1752E2D092BC77DAD28B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"I'll see what I can do.\"\nmsgstr \"\"\n\n#. Key:\t00A5A8684B1EF5FF2319428685540844\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_13.Children(0).Children.Text\n#. Key:\t471B46884399845B6D9442A8EADC2A48\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_9.Children(0).Children.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_13.Children(0).Children.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_9.Children(0).Children.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"Portal\"\nmsgstr \"\"\n\n#. Key:\t03EA3D4249797B593981C1B699A2CF5A\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"Oh! The Walking Ball returned! Just in time!\"\nmsgstr \"\"\n\n#. Key:\t04DC604342615AD3DCFCE99EB9AAF157\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_19.Children(1).Children.Text\n#. Key:\t1070909F4434D9B0D03DD3BD62692CE0\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_16.Children(0).Children.Text\n#. Key:\t76A679CE45B5A9A47CA620A396E02F48\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_13.Children(2).Children.Text\n#. Key:\t8FC1E822454A2FDA1847119C5004F161\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_21.Children(0).Children.Text\n#. Key:\t9036093D446B2F8C34705BBCFC73F4A0\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_9.Children(2).Children.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_13.Children(2).Children.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_16.Children(0).Children.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_19.Children(1).Children.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_21.Children(0).Children.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_9.Children(2).Children.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"Leave\"\nmsgstr \"\"\n\n#. Key:\t142E85484BA4E9CF475F0780D951BAE5\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"But they were so tasty.\"\nmsgstr \"\"\n\n#. Key:\t1E763B4D4D535AA83B50D4B87DB5A15D\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"You again?\"\nmsgstr \"\"\n\n#. Key:\t2430044E46A3456249D6A99D0FC31D30\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_9.Children(1).Children.Text\n#. Key:\tB3695A284A15574F3874BDAB1B8C14EB\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_19.Children(0).Children.Text\n#. Key:\tDC8D78774D326DA9A70EFC81A857A417\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_13.Children(1).Children.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_13.Children(1).Children.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_19.Children(0).Children.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_9.Children(1).Children.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"Give Weird Device\"\nmsgstr \"\"\n\n#. Key:\t29AD586B41502E4FAFF79E94FDADA50D\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"Unfortunately I don't have any.\"\nmsgstr \"\"\n\n#. Key:\t3418CA5A44B4531926317CB100CEC2F4\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"Just let me know when you're done! Meanwhile, I'll be reading a few more pages.\"\nmsgstr \"\"\n\n#. Key:\t37CD676C4C4F585C3CC048B56EEF6B92\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"I was supposed to find a portal here.\"\nmsgstr \"\"\n\n#. Key:\t3C2778B12A09151A002F016B1E3F6212\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"Also, if I hadn't drank the last two bottles... that would have helped...\"\nmsgstr \"\"\n\n#. Key:\t42E3EE32491F578E618913B4AF958187\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"Really? That sounds like my students! They were always complaining about unannounced examinations or even worse, \\\"Why are there no lessons tomorrow?\\\".\"\nmsgstr \"\"\n\n#. Key:\t44626CCD498CA592B8FAD1B01EDF33AB\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_2.Children(0).Children.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_2.Children(0).Children.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"Don't have\"\nmsgstr \"\"\n\n#. Key:\t55EAD2524D0BCF52B25A1B9EAB1754B2\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"That's it my ball! I wish I had more students like you.\"\nmsgstr \"\"\n\n#. Key:\t6682474947E016803A188FA968FD76BE\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"Oh my...\"\nmsgstr \"\"\n\n#. Key:\t786849EF4E531580865712BBEDD25B32\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"That is amazing! Thank you, my globular friend! Take these coins, I am sure that you will enjoy spending them on... on whatever Balls like you like to get.\"\nmsgstr \"\"\n\n#. Key:\t7FFC816545AA219D43FCA3A2ABF33E9E\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"Nevermind, I will just read a bit more... at least until a solution is found for the whole problem.\"\nmsgstr \"\"\n\n#. Key:\t818E4C1245F622C192178CB1F21694A3\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_2.Children(1).Children.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_2.Children(1).Children.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"What's the matter?\"\nmsgstr \"\"\n\n#. Key:\t84A119EB4FFB518BA7AA6394768F1DD3\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"Did the Gatekeeper open the gate for you?\"\nmsgstr \"\"\n\n#. Key:\t88FD93954B70482DAC5F2AA5332F23D5\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"One must always be eager to solve a problem. No matter how challenging that is.\"\nmsgstr \"\"\n\n#. Key:\t9CEE1942434DACB2DB3C1AA2005A1E94\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"But we might find another way to solve the problem.\"\nmsgstr \"\"\n\n#. Key:\tC070EF8E47744D116D4E39AC8F7C1941\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"I hope that you still have at least one bottle of that potion of mine. I could really use some...\"\nmsgstr \"\"\n\n#. Key:\tC39CD0F34CDFDCB0B2CF08917834F1A8\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"Here is a Weird Device that I found in the hideout of the Secret Science Society.\"\nmsgstr \"\"\n\n#. Key:\tCBB0BCAF4E19F942AC57F988104A9A65\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"I've used all of them to get back from the Sewer. You should have told me that there is another way out!\"\nmsgstr \"\"\n\n#. Key:\tE866A83647B163E53260C2B541AA0D7B\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"Well, the portal is definitely here, but as you might have already noticed, the place is a bit worn.\"\nmsgstr \"\"\n\n#. Key:\tF0A4AD1448267D94CAB7F79AD6CEFD59\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"Not Yet.\"\nmsgstr \"\"\n\n#. Key:\tF83C2C894C2EA511DCDCE6B824CC0591\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"Only the Gatekeeper can reopen the portal.\"\nmsgstr \"\"\n\n#. Key:\t76653DEC40EE0ED098B5EE8810B1A097\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/TL_GetSoulkeeper.TL_GetSoulkeeper:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/TL_GetSoulkeeper.TL_GetSoulkeeper:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_TL_GetSoulkeeper\"\nmsgid \"A Spellcaster. It makes you able to use the Ruined Realm's magic, at least, up to a certain level.\"\nmsgstr \"\"\n\n#. Key:\tBD48F7804F49751510AB2E909906C52F\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/TL_GetSoulkeeper.TL_GetSoulkeeper:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/TL_GetSoulkeeper.TL_GetSoulkeeper:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_TL_GetSoulkeeper\"\nmsgid \"What is it?\"\nmsgstr \"\"\n\n#. Key:\tDFF1C93D4005A778F0B696A2DC949DC6\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/TL_GetSoulkeeper.TL_GetSoulkeeper:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/TL_GetSoulkeeper.TL_GetSoulkeeper:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_TL_GetSoulkeeper\"\nmsgid \"That amulet is useful.\"\nmsgstr \"\"\n\n#. Key:\t09CDAFF84CF3F066B25A228640D45277\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_TL_Monk\"\nmsgid \"Please tell your Wizard that Monk would like to have a word with him.\"\nmsgstr \"\"\n\n#. Key:\t0E97585C46B73E4AF939169CF45067A3\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_TL_Monk\"\nmsgid \"I can only guess that right now, he's complaining about me.\"\nmsgstr \"\"\n\n#. Key:\t2E82A2B6449D8BA37ADBE7AEE1486791\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_TL_Monk\"\nmsgid \"Just get rid of him.\"\nmsgstr \"\"\n\n#. Key:\t430D927D40EF24EED23E55A83F48FDD7\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_TL_Monk\"\nmsgid \"I'm sorry but he doesn't want to talk to you.\"\nmsgstr \"\"\n\n#. Key:\t59E21DC1476038EAD4EC91BC00DA4D8B\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_3.Children(2).Children.Text\n#: /Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_3.Children(2).Children.Text\nmsgctxt \"Dialogue_TL_Monk\"\nmsgid \"Ask Wizard\"\nmsgstr \"\"\n\n#. Key:\t5AFB166C49DEB2D9017AED887A1E424D\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_TL_Monk\"\nmsgid \"Farewell, my friend, until we meet again!\"\nmsgstr \"\"\n\n#. Key:\t5D80CBEB46203E3A759B498B95571F4F\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_3.Children(1).Children.Text\n#: /Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_3.Children(1).Children.Text\nmsgctxt \"Dialogue_TL_Monk\"\nmsgid \"I won't transfer!\"\nmsgstr \"\"\n\n#. Key:\t66D9E1874A9749A8881372807C0B9D54\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_TL_Monk\"\nmsgid \"Ha-ha-ha... I know he heard everything.\"\nmsgstr \"\"\n\n#. Key:\t8BD7C20C4084000925D1489BE3F6EE15\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_TL_Monk\"\nmsgid \"I don't talk to him!\"\nmsgstr \"\"\n\n#. Key:\tA227CE5A47002A80D3988ABA1364CF3E\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_3.Children(0).Children.Text\n#: /Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_3.Children(0).Children.Text\nmsgctxt \"Dialogue_TL_Monk\"\nmsgid \"Wizard don't want\"\nmsgstr \"\"\n\n#. Key:\tA8E469374586A1D8A734D696AF662F9A\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_TL_Monk\"\nmsgid \"I also have something for you, Wanderer!\"\nmsgstr \"\"\n\n#. Key:\tCE0E3B1B424BEDDF4A830B8DD0BB3272\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_TL_Monk\"\nmsgid \"This might help you along the way.\"\nmsgstr \"\"\n\n#. Key:\tD6B184754B86F236C93454A95BF92B31\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_TL_Monk\"\nmsgid \"I won't deliver your messages anymore! If the two of you want something, then go get it yourselves!\"\nmsgstr \"\"\n\n#. Key:\tDB3AEAF24056B19A7D80E29E7D011D80\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_TL_Monk\"\nmsgid \"That's right. I will give him more time.\"\nmsgstr \"\"\n\n#. Key:\tE2F9F07A4A2B8D1A578BCC9716AB4D44\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_TL_Monk\"\nmsgid \"Wizard! A fellow named Monk wants to talk to you!\"\nmsgstr \"\"\n\n#. Key:\tE8987AC84528E4071DC27E9854C3C4DE\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_TL_Monk\"\nmsgid \"Hello, little Wanderer!\"\nmsgstr \"\"\n\n#. Key:\tFF355D9347D0068FBB40879E3EAEA8FB\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_TL_Monk\"\nmsgid \"But please...\"\nmsgstr \"\"\n\n#. Key:\tAC0DE5F1402FBAAFE6587B827D463C3C\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/TL_SoulkeeperHint.TL_SoulkeeperHint:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/TL_SoulkeeperHint.TL_SoulkeeperHint:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_TL_SoulkeeperHint\"\nmsgid \"Use the Soulstone to summon the Keeper.\"\nmsgstr \"\"\n\n#. Key:\t031849B3493F1528A0146DA55BD7F00F\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/TL_TakeSoulkeeperHint.TL_TakeSoulkeeperHint:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/TL_TakeSoulkeeperHint.TL_TakeSoulkeeperHint:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_TL_TakeSoulkeeperHint\"\nmsgid \"It would be easier if I could just simply summon her back to me...\"\nmsgstr \"\"\n\n#. Key:\t259EE9E14B86B2597D5F4EA60831D269\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/TL_TakeSoulkeeperHint.TL_TakeSoulkeeperHint:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/TL_TakeSoulkeeperHint.TL_TakeSoulkeeperHint:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_TL_TakeSoulkeeperHint\"\nmsgid \"Be more careful the next time...\"\nmsgstr \"\"\n\n#. Key:\t86266BC54CC02BE988EA24B18BF76359\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/TL_TakeSoulkeeperHint.TL_TakeSoulkeeperHint:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/TL_TakeSoulkeeperHint.TL_TakeSoulkeeperHint:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_TL_TakeSoulkeeperHint\"\nmsgid \"Now go back to the Soulkeeper.\"\nmsgstr \"\"\n\n#. Key:\tDCA8CF9A4CFF4644FBD42EADBFC6E773\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/TL_TakeSoulkeeperHint.TL_TakeSoulkeeperHint:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/TL_TakeSoulkeeperHint.TL_TakeSoulkeeperHint:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_TL_TakeSoulkeeperHint\"\nmsgid \"Er... It's still with me.\"\nmsgstr \"\"\n\n#. Key:\t012DDB8E4423EB98285155B3E1EFBF9A\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_65.Children(2).Children.Text\n#. Key:\t3485AE344D04D0944341F3A7391703EF\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.Children(3).Children.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_65.Children(2).Children.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.Children(3).Children.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"Set me free\"\nmsgstr \"\"\n\n#. Key:\t04E44BE94ABFE8614689AC890D01001D\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_65.Children(1).Children.Text\n#. Key:\t275944AA468D9CA8613B9586EC3D9C62\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.Children(2).Children.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_65.Children(1).Children.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.Children(2).Children.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"How to open gate\"\nmsgstr \"\"\n\n#. Key:\t10EB6BE941C633380422F7953F0171DA\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"I think... I am...\"\nmsgstr \"\"\n\n#. Key:\t22618C8F490BC5932411FFB41F38C383\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.SpeechSequence(0).SpeechSequence.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.SpeechSequence(0).SpeechSequence.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"Oh! A walking ball!\"\nmsgstr \"\"\n\n#. Key:\t28ED4B8B4023E9A859B8A4BFF7DFEE8A\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"I am crazy, therefore I think!\"\nmsgstr \"\"\n\n#. Key:\t389F7FA440377CA4EBA31DA4EE2FEEAE\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_65.Children(3).Children.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_65.Children(3).Children.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"Leave\"\nmsgstr \"\"\n\n#. Key:\t408E74BC4DBA10DA41853B9421DBA07B\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_65.Children(0).Children.Text\n#. Key:\t55BC9258400712FE4D5CED8BFA0AD22C\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.Children(1).Children.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_65.Children(0).Children.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.Children(1).Children.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"How to prove Worthy\"\nmsgstr \"\"\n\n#. Key:\t5D0DBB0344815D41A50D9FA178339BCA\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_24.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_24.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"Here, take one!\"\nmsgstr \"\"\n\n#. Key:\t5E8C88684BE93A26C26BFBAF23D69FD9\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.SpeechSequence(5).SpeechSequence.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.SpeechSequence(5).SpeechSequence.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"And I am not wise. In fact, I am totally crazy. But look on the bright side! At least I am aware of it.\"\nmsgstr \"\"\n\n#. Key:\t5F9588AA4FFA9FEB2C7101B32CB98950\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_55.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_55.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"Come back if you change your mind!\"\nmsgstr \"\"\n\n#. Key:\t69BF5D3C44D3BE2468ADDF97E99920E9\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"I think something's happening with the door's mechanism... but who knows? I can definitely hear some creaking! It's hard to guess which one of those is the real one...\"\nmsgstr \"\"\n\n#. Key:\t6B46CC3F44284076B1F460BEE2D93116\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.SpeechSequence(1).SpeechSequence.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.SpeechSequence(1).SpeechSequence.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"How unique, how original, how... sporty!\"\nmsgstr \"\"\n\n#. Key:\t6DFC995B4364B6358A8F00BEDD007C80\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"I am, therefore I think!\"\nmsgstr \"\"\n\n#. Key:\t72FA8AF8413CF23907BB9EA6587F512E\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_63.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_63.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"I was pretty sure I had to face him too... that's why I prepared! Potion of Worthiness! I have a few bottles...\"\nmsgstr \"\"\n\n#. Key:\t7BB736394144C8B2173886993EE33ADA\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"Look, I'm forced to stay in this realm so that I could do all these silly tasks for a wizard. Any chance you could help me with that? Please?\"\nmsgstr \"\"\n\n#. Key:\t7E8985A441145AE9365C64810036EBE0\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.SpeechSequence(3).SpeechSequence.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.SpeechSequence(3).SpeechSequence.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"Actually yes, I...\"\nmsgstr \"\"\n\n#. Key:\t85CB0B164556D460A07F948F942D7AC4\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_61.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_61.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"That's how these rusty monsters work like: you pull a few levers here and there, and... whoops, the door is open! It's called science!\"\nmsgstr \"\"\n\n#. Key:\t878921884D0FDCFC78971E828C7D7FBB\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_66.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_66.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"I've got to go...\"\nmsgstr \"\"\n\n#. Key:\t8FF0B1A64B29AAB8DABAC49F5EBCE625\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_60.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_60.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"That's easy! Just pull every single lever you can find.\"\nmsgstr \"\"\n\n#. Key:\t9163F7AB40673D9EB5C936A37CC7B0C7\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_62.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_62.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"Sounds like you met the GateKeeper!\"\nmsgstr \"\"\n\n#. Key:\t96EED9B34D798E48F9B47283A5290A5B\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.SpeechSequence(4).SpeechSequence.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.SpeechSequence(4).SpeechSequence.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"It was a rhetorical question. I am not old!\"\nmsgstr \"\"\n\n#. Key:\tB3141D2247D5DF307B63A4BF330F8070\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_67.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_67.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"Not really, I don't feel like helping you out. And to be honest, I prefer to stay away from wizards. Sorry!\"\nmsgstr \"\"\n\n#. Key:\tB7A8F5A6474D18116F76BC929DB28D40\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"It's been nice meeting you.\"\nmsgstr \"\"\n\n#. Key:\tBE16F7204818B7231748D1B9C55DB4F6\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"Here, take this! I hope it's worth the trouble... hahaha... Thanks to you I can continue with my journey... after I read a few more pages, of course.\"\nmsgstr \"\"\n\n#. Key:\tBF9983D645C558E1AB5D559E70FEFDA0\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.SpeechSequence(6).SpeechSequence.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.SpeechSequence(6).SpeechSequence.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"Is there anything a middle-aged crazy gnome scientist can do for you? Now, this one is not a rhetorical question!\"\nmsgstr \"\"\n\n#. Key:\tC29E98A84971D7F0585C0F9522C30209\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_64.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_64.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"I will give you one if you are kind enough to open this door for me! I am stuck on the other side, you see...\"\nmsgstr \"\"\n\n#. Key:\tC8BEE9304FE466C0EB9F76A0B8A770D6\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.Children(0).Children.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.Children(0).Children.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"No way!\"\nmsgstr \"\"\n\n#. Key:\tCB197A5E46F44960333A02B7691B0EA6\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"Thanks and good luck!\"\nmsgstr \"\"\n\n#. Key:\tCD2D130744EE2EDC8C96B1A286FCCD28\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"Getting help from a mad scientist? Thanks, but I would rather skip that!\"\nmsgstr \"\"\n\n#. Key:\tD0A8B5EA452D49F6400A18A2CDAC9A0E\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_29.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_29.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"I am crazy, therefore I am!\"\nmsgstr \"\"\n\n#. Key:\tDA95542D4776F0EF7909078DED258AF8\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_27.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_27.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"You managed to open the gate! Well done!\"\nmsgstr \"\"\n\n#. Key:\tDEC93709471D0B331684CFAF42A65B49\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_37.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_37.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"How unfortunate! And I thought that I was the idiot here. You will totally need my help... you'll see.\"\nmsgstr \"\"\n\n#. Key:\tDF18B66D4109CAA0BCC1FDBED74521CD\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"Some kind of golem sent me here to prove my worthiness... any idea how I could do that?\"\nmsgstr \"\"\n\n#. Key:\tE546AE1443A4262B05869CB758E42CF2\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.SpeechSequence(2).SpeechSequence.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.SpeechSequence(2).SpeechSequence.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"Is there anything an old wise gnome scientist could do for you, I wonder?\"\nmsgstr \"\"\n\n#. Key:\tEEA782044BAA1D5C3B77D49DAE004512\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_58.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_58.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"Any idea how I could open this gate for you?\"\nmsgstr \"\"\n\n#. Key:\t04BFEE6A43E303DB376ACFA5F270F846\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"I've managed to get this obelisk thing. Do you know what it is?\"\nmsgstr \"\"\n\n#. Key:\t0A6FE902444DF9B2F18A95B495FB7A90\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"I... I don't know. They are kinda predictable though...\"\nmsgstr \"\"\n\n#. Key:\t0AB07AB7403AECECD38D479D8F4A32D2\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"Don't care about it and you'll live longer.\"\nmsgstr \"\"\n\n#. Key:\t1026E61D4F2798A2E0FEE0B9ACA2135B\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"There is a floating magical thing right there...\"\nmsgstr \"\"\n\n#. Key:\t174506D944E38D478377CDA1DEF299B4\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"Isn't it weird that doors are always closed around these places?\"\nmsgstr \"\"\n\n#. Key:\t240F98824200E33959D455AF1A3219B8\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_37.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_37.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"This is my research project! Looks totally garbage, but sometimes even I cannot understand my brilliance.\"\nmsgstr \"\"\n\n#. Key:\t24286C6A494F848CE13B5C98E38D4718\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_6.Children(0).Children.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_6.Children(0).Children.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"Let him answer\"\nmsgstr \"\"\n\n#. Key:\t26727CAB403FA6DED50EC38ED01E4241\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"I found the secret hideout of the Secret Science Society. Is there anything you could tell me about them?\"\nmsgstr \"\"\n\n#. Key:\t2BF9EF0C41CB352340F460AE4BC0FE02\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"I guess he will be happy if you return this to him, but otherwise it's garbage.\"\nmsgstr \"\"\n\n#. Key:\t315BB85E475FAA4C715E7F850B0E5EE2\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_24.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_24.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"Really? Then maybe I should give you this: another bottle of Potion of Worthiness!\"\nmsgstr \"\"\n\n#. Key:\t316CF9AD4CF36FAFFAC45CA0A488FE53\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_57.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_57.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"I've got to go...\"\nmsgstr \"\"\n\n#. Key:\t3A9767C34F0BB6E9E131D8BC7A8D9A25\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_26.Children(1).Children.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_26.Children(1).Children.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"Secret Science Society\"\nmsgstr \"\"\n\n#. Key:\t3E857073418A17EC48A1EA9D2B28A43E\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_30.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_30.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"I pulled a few levers here and there...\"\nmsgstr \"\"\n\n#. Key:\t4671C3394EAF0988255C8090B409415D\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"Yes, things like that happen here all the time. You'll get used to it.\"\nmsgstr \"\"\n\n#. Key:\t4709B6384B48D479672BC69EBC640C7E\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_31.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_31.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"Oh, really? That was nice, even if it was absolutely unnecessary! Never mind, here is your reward!\"\nmsgstr \"\"\n\n#. Key:\t5AE5A1A6408BC2EB0F9F96BA0826ACB0\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"Hmm... One of the creaks was a bit odd. I think the door will open soon!\"\nmsgstr \"\"\n\n#. Key:\t5C81129F4B064C44F44335A3AB1CC178\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_29.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_29.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"The mind is furnished with ideas by a drunk upholsterer...\"\nmsgstr \"\"\n\n#. Key:\t5E441CF6434D7CA180853BBCBD6DFE44\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"Also, reading something represents such a nice way of killing time when I encounter a closed door!\"\nmsgstr \"\"\n\n#. Key:\t6B46D1EC463D3B9A4BFBBDB7725C0C22\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"How about a deal? Open this door and I will give you another bottle from my collection of Potions of Worthiness.\"\nmsgstr \"\"\n\n#. Key:\t745CA5274A281AAA12CF798A53D54ACE\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_26.Children(3).Children.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_26.Children(3).Children.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"Ask about the book\"\nmsgstr \"\"\n\n#. Key:\t84DCE2A448C57E7FAD93CB9029BBD605\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_26.Children(0).Children.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_26.Children(0).Children.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"Floating obelisk\"\nmsgstr \"\"\n\n#. Key:\t922B00804A843BD8EC9DB984D794F145\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"We met before, right? Of course we did.\"\nmsgstr \"\"\n\n#. Key:\t9837238E42F28684DEBA2DAF9B332415\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"It might actually be total nonsense. That's what I am trying to find out at the moment, so I am reading it again and again and again...\"\nmsgstr \"\"\n\n#. Key:\t995EAB564791A7F8BF34D3A26026F383\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_26.Children(4).Children.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_26.Children(4).Children.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"Leave\"\nmsgstr \"\"\n\n#. Key:\t9AD95267429D21EE59DC83937AD6811A\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"This is a Memory Crystal made by a really old looking man I've met long ago.\"\nmsgstr \"\"\n\n#. Key:\tA9DF44F54971A33775FF939FB292E26E\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"No man's knowledge here can go beyond my experience!\"\nmsgstr \"\"\n\n#. Key:\tAC59E35B420DF0F9B771B9938AC23891\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"I sure can! They used to invent cool stuff back in the days, before... you know, everyone's mind decided to go a bit insane.\"\nmsgstr \"\"\n\n#. Key:\tB1E177F0430A3887A76CFAA46CE650AD\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"I don’t know why we are here... maybe to enjoy ourselves?\"\nmsgstr \"\"\n\n#. Key:\tB5E57C3A4B0D51020B4F3C872164E8F2\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_26.Children(2).Children.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_26.Children(2).Children.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"Another door\"\nmsgstr \"\"\n\n#. Key:\tBA0C0F42482F357506A9C7ABADB6E49A\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_33.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_33.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"On the other hand, everyone is crazy these days... so we don't need doors anymore!\"\nmsgstr \"\"\n\n#. Key:\tBAC86050470A5EC67C30349C6B13DFE0\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"To be perceived is to be!\"\nmsgstr \"\"\n\n#. Key:\tBAD7934444B3EB256141BFB689BB83A0\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"I will let you know when I come up with something.\"\nmsgstr \"\"\n\n#. Key:\tBE5570C5477044DD0B1EEE928EAD8FA8\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_32.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_32.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"Nah. The world is full of crazy people. If I were sane, I would have liked to have as many closed doors as possible between me and those weirdos.\"\nmsgstr \"\"\n\n#. Key:\tBE8120CC4E6A028BB45F10843F98135D\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"The door asks for a password that members use to enter the hideout... any idea what that could be?\"\nmsgstr \"\"\n\n#. Key:\tC7BE32BF43F7BA6D88A666956FAC35F3\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"I am here because I actually have to prove my worth again...\"\nmsgstr \"\"\n\n#. Key:\tC7ECC6D9457A4C49B39E98AEB14474E5\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_25.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_25.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"And I would actually feel much happier if I were on the other side of the door! You know,... I tried to ask it nicely to open and it just ignored me!\"\nmsgstr \"\"\n\n#. Key:\tD2F4B8E44239904A7BD4DD90336C871A\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_45.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_45.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"What kind of book is that?\"\nmsgstr \"\"\n\n#. Key:\tED75E2104CCC3912A77DF18F7C916690\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"It was nice seeing you...\"\nmsgstr \"\"\n\n#. Key:\tF87975A94604B526DE1B638250BD85A9\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_27.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_27.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"The gate is open! Maybe this creature has a heart after all... and probably started feeling sorry for me as well.\"\nmsgstr \"\"\n\n#. Key:\tFE470DB5464E438A122FAFAF593AF92B\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"Let me see! Yes... Oh...\"\nmsgstr \"\"\n\n#. Key:\t066896454B62A9809060EBB3E0222D9A\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_SpeechSequence_1.SpeechSequence(3).SpeechSequence.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_SpeechSequence_1.SpeechSequence(3).SpeechSequence.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"Also, after skipping a couple of lectures, I got fired from university.\"\nmsgstr \"\"\n\n#. Key:\t17D1F3394E12F6C85A11C2B3D3BD1ACE\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_SpeechSequence_1.SpeechSequence(0).SpeechSequence.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_SpeechSequence_1.SpeechSequence(0).SpeechSequence.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"I am a scientist! I managed to prove it! I discovered this when I was conducting my research on gnome behavior...\"\nmsgstr \"\"\n\n#. Key:\t17D8D3C2484BA654BEAE8CACA3AD7501\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"Help me out with the door for the last time, and I will give you my last potion!\"\nmsgstr \"\"\n\n#. Key:\t22439DB6407947A700A6E9AFB4D29261\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"Hello again! You remember me, right? I'm the gnome who was crazy before it was cool!\"\nmsgstr \"\"\n\n#. Key:\t2546F34E402CB4B25911238CC1E7A70F\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_29.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_29.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"Be as you with to seem.\\r\\n... or was it seem as you wish to be?\"\nmsgstr \"\"\n\n#. Key:\t2A78FDD9465789DC4FF5EB970C63F618\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"That is amazing! Thank you, my globular friend! Take these coins, I am sure you will enjoy spending them on... on whatever Balls like you like to spend.\"\nmsgstr \"\"\n\n#. Key:\t2EB726F641E4EF882228F6B49DA2B313\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_26.Children(1).Children.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_26.Children(1).Children.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"Password\"\nmsgstr \"\"\n\n#. Key:\t339840D54BD71CF86F9DE4A801B1414F\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"I sure can! They used to invent cool stuff back in the days, before... you know, everyone's mind decided to go a bit insane.\"\nmsgstr \"\"\n\n#. Key:\t3E639AB84A0D241D73AB8A991A483090\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_26.Children(4).Children.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_26.Children(4).Children.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"Leave\"\nmsgstr \"\"\n\n#. Key:\t464D32224CC04AD1F97602803245A37C\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"Take this! You deserve it...\"\nmsgstr \"\"\n\n#. Key:\t4BB0354D4398A4115F3A78B8EFCC7D16\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_27.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_27.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"I can't believe my eyes! It is open!\"\nmsgstr \"\"\n\n#. Key:\t6488288A45256CE464004F9BFF776850\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_24.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_24.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"It's your lucky day! Take this... it's my last bottle, but I guess your needs are greater than mine!\"\nmsgstr \"\"\n\n#. Key:\t696219734B2E6966C53BE8B43A0C2212\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"The unexamined life is not worth living!\"\nmsgstr \"\"\n\n#. Key:\t6FD516D14E42F5EC1D05CEA0F476BDEC\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"If you manage to find a strangely unique device in the hideout, I would be more than happy to buy that from you...\"\nmsgstr \"\"\n\n#. Key:\t75BBEA604E9A3BAEF7599AA937E1AB2A\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"And you have the habit of needing my potions..\"\nmsgstr \"\"\n\n#. Key:\t7978DCFE4044A6A3EC9F6BA54BAAD8BF\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"Yes, I am pretty sure this week is \\\"The only true wisdom is in knowing you know everything.\\\".\"\nmsgstr \"\"\n\n#. Key:\t88881A3742ABFEAB95CA938C1AA81B60\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_25.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_25.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"I guess we are in the same boat - well, more or less... figuratively speaking, of course, because I can't really stand boats!\"\nmsgstr \"\"\n\n#. Key:\t8A80B7554F39A818E4E66294BAFC9A76\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_26.Children(0).Children.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_26.Children(0).Children.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"Secret Science Society\"\nmsgstr \"\"\n\n#. Key:\t91E6FD4A44AB2E17C88767B0F17D6D1E\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_30.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_30.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"Why do you think that you're crazy?\"\nmsgstr \"\"\n\n#. Key:\t98E36F354D811F5DE5F98A942250997E\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"It is always wrong to believe everything!\"\nmsgstr \"\"\n\n#. Key:\t9B6EADBA4946B100D566988907A9675D\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"Any luck with the password for the Secret Science Society door?\"\nmsgstr \"\"\n\n#. Key:\tA0F52B7148A942673A3489857B8C6EA9\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_26.Children(2).Children.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_26.Children(2).Children.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"Give Weird Device\"\nmsgstr \"\"\n\n#. Key:\tABE60F4D4709CCE1AF2A5197C03C8193\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"See you later...\"\nmsgstr \"\"\n\n#. Key:\tB07C5C9A48839C3E81F6FA8B7550BBA4\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"I also have the bad habit of being obstructed by closed doors!\"\nmsgstr \"\"\n\n#. Key:\tB7C7314840274942F6D606B35398F039\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"The door asks for a password that members need to provide in order to enter the hideout... any idea what that could be?\"\nmsgstr \"\"\n\n#. Key:\tBB1AEBA44695D09192D7CA98AF9166B0\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_SpeechSequence_1.SpeechSequence(2).SpeechSequence.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_SpeechSequence_1.SpeechSequence(2).SpeechSequence.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"No wonder everyone started to consider me an idiot.\"\nmsgstr \"\"\n\n#. Key:\tC0B9CA5E4273E95306AD0C824ADFD84B\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_SpeechSequence_1.SpeechSequence(1).SpeechSequence.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_SpeechSequence_1.SpeechSequence(1).SpeechSequence.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"Long story short, I used to do all these crazy things, like talking about the weather or taking naps in the afternoon. At first, they seemed okay to me but in reality what I was doing was totally ridiculous!\"\nmsgstr \"\"\n\n#. Key:\tC4193800427609972A2DECAB99D8CE6C\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"Hmm... One of the creaks was a bit odd. I think the door will open soon!\"\nmsgstr \"\"\n\n#. Key:\tD1254F624213EAE67D6DD780182AA2DA\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"It was nice seeing you!\"\nmsgstr \"\"\n\n#. Key:\tD19327714CD0B2833BC7EBBD1E89CC83\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_26.Children(3).Children.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_26.Children(3).Children.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"You Crazy?\"\nmsgstr \"\"\n\n#. Key:\tE5C93E794F71C393568D0B855117C738\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"I found the secret hideout of the Secret Science Society. Do you know anything about them?\"\nmsgstr \"\"\n\n#. Key:\tEF216A2549E20C15A2C28184B62D45E6\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_36.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_36.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"Turns out that you cannot skip lectures if you're the teacher.\"\nmsgstr \"\"\n\n#. Key:\tEF650E874498865FA9FE6F9B9C37AB71\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"Here is the Weird Device I found in the hideout of the Secret Science Society.\"\nmsgstr \"\"\n\n#. Key:\t17A0CE394E01E1FFB31AA9A485E033AC\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_2.Children(4).Children.Text\n#: /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_2.Children(4).Children.Text\nmsgctxt \"Dialogue_TLSecretSocietyGate\"\nmsgid \"Mellon\"\nmsgstr \"\"\n\n#. Key:\t3293778C41F588EAC2DECDA76DA86A8E\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_2.Children(0).Children.Text\n#: /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_2.Children(0).Children.Text\nmsgctxt \"Dialogue_TLSecretSocietyGate\"\nmsgid \"The only...\"\nmsgstr \"\"\n\n#. Key:\t359996CC441CAB0497303A9C666F0CCD\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_TLSecretSocietyGate\"\nmsgid \"*******? No, that is not correct.\"\nmsgstr \"\"\n\n#. Key:\t3C864B7F434DA42CAB07BCA70FB2E6A6\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_1.Children(0).Children.Text\n#: /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_1.Children(0).Children.Text\nmsgctxt \"Dialogue_TLSecretSocietyGate\"\nmsgid \"Okay, whatever\"\nmsgstr \"\"\n\n#. Key:\t40C27B354470AB53239424BCC2B8D259\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_TLSecretSocietyGate\"\nmsgid \"Do you really think secret scientists would use an elven word as a password? I don't even know what that means.\"\nmsgstr \"\"\n\n#. Key:\t4E89070F413EF5CD964EEF90234BEBC5\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_TLSecretSocietyGate\"\nmsgid \"I am pretty sure that it is better to avoid the Secret Science Society anyways...\"\nmsgstr \"\"\n\n#. Key:\t515B5424465F983D14F3E09B7686899D\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_TLSecretSocietyGate\"\nmsgid \"STOP! Do not move! This gate is only for the members of the Secret Science Society!\"\nmsgstr \"\"\n\n#. Key:\t51706AD44D697A14E6392B97A9E30AFC\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_TLSecretSocietyGate\"\nmsgid \"That is the silliest combination I have ever heard about in my whole life! That's the kind of thing an idiot would carry in his luggage!\"\nmsgstr \"\"\n\n#. Key:\t60B0B4E04E74C474AC2F4F8422DCE753\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_3.Children(0).Children.Text\n#: /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_3.Children(0).Children.Text\nmsgctxt \"Dialogue_TLSecretSocietyGate\"\nmsgid \"Leave the gate\"\nmsgstr \"\"\n\n#. Key:\t6EB7FD9546B2B89557D9708942CE54BD\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_2.Children(2).Children.Text\n#: /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_2.Children(2).Children.Text\nmsgctxt \"Dialogue_TLSecretSocietyGate\"\nmsgid \"12345\"\nmsgstr \"\"\n\n#. Key:\t749AB9CD48924031317291A953254917\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_TLSecretSocietyGate\"\nmsgid \"That password is for witch and wizard kids, not for old, wise, world renowned secret scientists!\"\nmsgstr \"\"\n\n#. Key:\t7BB8FA8B4D051983390D3D8D4287DFEC\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_2.Children(1).Children.Text\n#: /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_2.Children(1).Children.Text\nmsgctxt \"Dialogue_TLSecretSocietyGate\"\nmsgid \"hunter2\"\nmsgstr \"\"\n\n#. Key:\t8CD051C44D9FBBD6D60694AFD2156D24\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_2.Children(5).Children.Text\n#: /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_2.Children(5).Children.Text\nmsgctxt \"Dialogue_TLSecretSocietyGate\"\nmsgid \"Try to gain some time\"\nmsgstr \"\"\n\n#. Key:\t8F2244144056B8C389345F87D8C8B171\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_TLSecretSocietyGate\"\nmsgid \"I... I think I forgot... I have to remember it. I'll be back...\"\nmsgstr \"\"\n\n#. Key:\t8FC96FE94C115E3EDB214CAA3B380072\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_TLSecretSocietyGate\"\nmsgid \"Let us go on with the standard protocol then. Tell me the password of the week.\"\nmsgstr \"\"\n\n#. Key:\tAA10FF02426D2C5DB9F7CF90596631C4\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_1.Children(1).Children.Text\n#: /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_1.Children(1).Children.Text\nmsgctxt \"Dialogue_TLSecretSocietyGate\"\nmsgid \"I am a member\"\nmsgstr \"\"\n\n#. Key:\tB5237D1B4EFB02B1ED5017B68EC5A7EC\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_TLSecretSocietyGate\"\nmsgid \"Are you a member? Prove it! What is the password of the week?\"\nmsgstr \"\"\n\n#. Key:\tC8A1985C416AEA563142D7BF3B6DD77D\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_2.Children(3).Children.Text\n#: /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_2.Children(3).Children.Text\nmsgctxt \"Dialogue_TLSecretSocietyGate\"\nmsgid \"Caput Draconis\"\nmsgstr \"\"\n\n#. Key:\tDC8F07EA44A20BEF70DFCDA4A62A421E\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_TLSecretSocietyGate\"\nmsgid \"Correct. Welcome to the secret hideout 12345, scientist!\"\nmsgstr \"\"\n\n#. Key:\tE0C10509474191587635B48ED0AA6913\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_TLSecretSocietyGate\"\nmsgid \"The only true wisdom is in knowing you know everything!\"\nmsgstr \"\"\n\n#. Key:\t0707F21D4313073F47F3C69B64D61DB7\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_TombOfTabby\"\nmsgid \"Take this. It's all I can give now.\"\nmsgstr \"\"\n\n#. Key:\t0918993B4F680528806DE680B471F795\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_TombOfTabby\"\nmsgid \"It was too much. I couldn’t keep on. I failed.\"\nmsgstr \"\"\n\n#. Key:\t1598C2DE44A0BF92DC0E53BFAC47DEF5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_3.Children(3).Children.Text\n#: /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_3.Children(3).Children.Text\nmsgctxt \"Dialogue_TombOfTabby\"\nmsgid \"Leave\"\nmsgstr \"\"\n\n#. Key:\t1EF84FFD484E968FBDFE1386018485DB\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_3.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_3.Children(1).Children.Text\nmsgctxt \"Dialogue_TombOfTabby\"\nmsgid \"Raven\"\nmsgstr \"\"\n\n#. Key:\t3343471F42742EEE0678D49E466448F1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_TombOfTabby\"\nmsgid \"Tell me the name!\"\nmsgstr \"\"\n\n#. Key:\t3DC816F147ACB79D6339D5AD31E0C5A5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_TombOfTabby\"\nmsgid \"Lillian!\"\nmsgstr \"\"\n\n#. Key:\t3DE5FFEB4A5BEC150306999FDEF058BC\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_TombOfTabby\"\nmsgid \"Here lies Tabby, wanderer of the Ruined Realm. We will never forget what you did for us. May your spirit find peace in the afterlife.\"\nmsgstr \"\"\n\n#. Key:\t43F7C0AE4CB91D3957AB4CA54C1D4426\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_TombOfTabby\"\nmsgid \"He took the artefacts. His master never knew it.\"\nmsgstr \"\"\n\n#. Key:\t57A0634946BB9FD9603572ABD9368E52\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_3.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_3.Children(0).Children.Text\nmsgctxt \"Dialogue_TombOfTabby\"\nmsgid \"Wizard\"\nmsgstr \"\"\n\n#. Key:\t5A6E99154FB027A82922FA91A9448E14\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_TombOfTabby\"\nmsgid \"I’m leaving... I didn’t want to bother you. May you find peace at last.\"\nmsgstr \"\"\n\n#. Key:\t6A716E164BAACFAFB2EBDBBA8C04438F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_TombOfTabby\"\nmsgid \"He liked Lillian. He finished what I started.\"\nmsgstr \"\"\n\n#. Key:\t7CDFB36B41931AADE01C10A465D09EAF\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_TombOfTabby\"\nmsgid \"Rest in peace!\"\nmsgstr \"\"\n\n#. Key:\t831693034CD9AC88A07F1297BBB10056\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_TombOfTabby\"\nmsgid \"I will be there on her side again when the time comes.\"\nmsgstr \"\"\n\n#. Key:\tA78C16A943587C5EC876BFB0AA319421\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_TombOfTabby\"\nmsgid \"She is my only true master. I can’t leave her. Not yet.\"\nmsgstr \"\"\n\n#. Key:\tC86836A149E8580E4608259C8482314F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_TombOfTabby\"\nmsgid \"Raven!\"\nmsgstr \"\"\n\n#. Key:\tD05E5AEF498C383F88D1AFBBDF371CDA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_TombOfTabby\"\nmsgid \"He forced me. Though I understood. I wanted the same.\"\nmsgstr \"\"\n\n#. Key:\tE41ADE774AF3AF3FE637CE81531F3D29\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_3.Children(2).Children.Text\n#: /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_3.Children(2).Children.Text\nmsgctxt \"Dialogue_TombOfTabby\"\nmsgid \"Lillian\"\nmsgstr \"\"\n\n#. Key:\tED18C66D47BF594818C5DA8100AC2A36\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_TombOfTabby\"\nmsgid \"You are familiar... I almost remember...\"\nmsgstr \"\"\n\n#. Key:\tF6D8BC4F489D87A90E852CA3F97B479F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_TombOfTabby\"\nmsgid \"Wizard!\"\nmsgstr \"\"\n\n#. Key:\t2A0E02C94A04642C5096038C615E0D5B\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/tut2.tut2:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/tut2.tut2:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_tut2\"\nmsgid \"I see you managed to shape that ball body of yours… that’s interesting.\"\nmsgstr \"\"\n\n#. Key:\t4D59C307403F27C91A9168AB58CDB1B3\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/tut2.tut2:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/tut2.tut2:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_tut2\"\nmsgid \"I didn’t want to summon you. I wanted to get my daughter back.\"\nmsgstr \"\"\n\n#. Key:\t8336FD024F34227E1AB7B1BFCCF7FFBF\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/tut2.tut2:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/tut2.tut2:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_tut2\"\nmsgid \"Your presence is not welcome here, demon!\"\nmsgstr \"\"\n\n#. Key:\t16A6E7D24DFE49D6844E92B8E476BA66\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/tut5.tut5:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/tut5.tut5:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_tut5\"\nmsgid \"Once you are done I will set you free.\"\nmsgstr \"\"\n\n#. Key:\t48FA56EF4293C577CB1977BE694034CC\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/tut5.tut5:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/tut5.tut5:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_tut5\"\nmsgid \"This is the deal demon...\"\nmsgstr \"\"\n\n#. Key:\tA27765824FDD88A579AB6180DDEA06B1\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/tut5.tut5:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/tut5.tut5:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_tut5\"\nmsgid \"Get into the Heart of the Realm and find the three Artefacts! I need those to correct the summoning.\"\nmsgstr \"\"\n\n#. Key:\t5E1F54384BC258A91FF1DD9ECBC0DF39\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/tut8.tut8:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/tut8.tut8:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_tut8\"\nmsgid \"A cat that used to help my daughter to explore these realms.\"\nmsgstr \"\"\n\n#. Key:\t859621E24125177084F4EAA39CF77902\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/tut8.tut8:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/tut8.tut8:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_tut8\"\nmsgid \"Who is Tabby?\"\nmsgstr \"\"\n\n#. Key:\tD0BFF857414714D7C5FCB9B526539215\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/tut8.tut8:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/tut8.tut8:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_tut8\"\nmsgid \"Tabby was formidable with her claws, but you will need that sword.\"\nmsgstr \"\"\n\n#. Key:\tDFCB1A1E48763642E71FD7A040F72F1B\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/tut8.tut8:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/tut8.tut8:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_tut8\"\nmsgid \"So he did the hard job before me...\"\nmsgstr \"\"\n\n#. Key:\t2DD05A7E485B5C23DA0DCD84400D3F23\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/tut9.tut9:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/tut9.tut9:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_tut9\"\nmsgid \"What could be possibly weird for a walking ball?\"\nmsgstr \"\"\n\n#. Key:\t62A1ECFC47B762221EA0B1B5B0E0BEF6\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/tut9.tut9:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/tut9.tut9:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_tut9\"\nmsgid \"This place is in a better shape...\"\nmsgstr \"\"\n\n#. Key:\tA9BCFBB541A9A2CEA8FB90884B8557C5\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/tut9.tut9:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/tut9.tut9:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_tut9\"\nmsgid \"The Ancient Magic is still strong within these walls. It keeps the Ruin at bay.\"\nmsgstr \"\"\n\n#. Key:\tF9551D7849226F88A4FD15AAFB4789E6\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/tut9.tut9:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/tut9.tut9:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_tut9\"\nmsgid \"Be careful though... it can have the weirdest side effects.\"\nmsgstr \"\"\n\n#. Key:\t302976FD411E850B3CD7CEA7E0BF6924\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Wizard.Wizard:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/Ending/E1/Wizard.Wizard:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_Wizard\"\nmsgid \"Please wait outside until I repeat the spell. Once Lillian is back, I’ll take you home.\"\nmsgstr \"\"\n\n#. Key:\t3851C21F419E9F1D29A06DA3B2A0F553\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Wizard.Wizard:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Ending/E1/Wizard.Wizard:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_Wizard\"\nmsgid \"Er... your room is still as untidy as last time, but no problem.\"\nmsgstr \"\"\n\n#. Key:\t6CCE5BBC4135176C1FBD8E866FD4B098\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Wizard.Wizard:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Ending/E1/Wizard.Wizard:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_Wizard\"\nmsgid \"I’m sorry we met like this.\"\nmsgstr \"\"\n\n#. Key:\t7511912D4F72D1D45CFFB9AA9815CCB2\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Wizard.Wizard:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E1/Wizard.Wizard:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_Wizard\"\nmsgid \"Yes... and thank you!\"\nmsgstr \"\"\n\n#. Key:\tAC1641244DF694B660EAFDA1FC4A177B\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Wizard.Wizard:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E1/Wizard.Wizard:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_Wizard\"\nmsgid \"Here are your artefacts! I made my part of the deal.\"\nmsgstr \"\"\n\n#. Key:\tB567059148744E3F7A4D3B929F26CBB6\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Wizard.Wizard:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Ending/E1/Wizard.Wizard:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_Wizard\"\nmsgid \"Yes, we made a deal!\"\nmsgstr \"\"\n\n#. Key:\tC2ED3A564A55A644D33F9E9E38D1676A\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Wizard.Wizard:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Ending/E1/Wizard.Wizard:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_Wizard\"\nmsgid \"Give me a few more minutes to finish what we started!\"\nmsgstr \"\"\n\n#. Key:\tE1521B0B46F26BFA464C6C81EC2D4900\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Wizard.Wizard:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Ending/E1/Wizard.Wizard:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_Wizard\"\nmsgid \"Will you release me?\"\nmsgstr \"\"\n\n#. Key:\tFE3EE6014784FCE7EB8001BC1E77D833\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Wizard.Wizard:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Ending/E1/Wizard.Wizard:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_Wizard\"\nmsgid \"Er... excuse me for being rude with you. I might have misjudged you. And, anyway...\"\nmsgstr \"\"\n\n#. Key:\t0D3B0F654B4B3FC1AE9B46809DA7FD74\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter2/Wizard_AfterMonk.Wizard_AfterMonk:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Wizard/Chapter2/Wizard_AfterMonk.Wizard_AfterMonk:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_Wizard_AfterMonk\"\nmsgid \"What did he say?\"\nmsgstr \"\"\n\n#. Key:\tDE149D01484DA8CD03D1C0848D01BEA6\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter2/Wizard_AfterMonk.Wizard_AfterMonk:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Wizard/Chapter2/Wizard_AfterMonk.Wizard_AfterMonk:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_Wizard_AfterMonk\"\nmsgid \"Nothing...\"\nmsgstr \"\"\n\n#. Key:\t1E43B5674AB45A7BDBEED1BE2AE25FE8\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter2/Wizard_Artefact1.Wizard_Artefact1:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Wizard/Chapter2/Wizard_Artefact1.Wizard_Artefact1:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_Wizard_Artefact1\"\nmsgid \"Well done. Now we have the first artefact. There are only two left...\"\nmsgstr \"\"\n\n#. Key:\t45AB81D94B2C6C9B13A49C944AD80389\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter2/Wizard_Artefact1.Wizard_Artefact1:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Wizard/Chapter2/Wizard_Artefact1.Wizard_Artefact1:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_Wizard_Artefact1\"\nmsgid \"Don’t tell me I will need to kill another two of these!\"\nmsgstr \"\"\n\n#. Key:\t3CBF720A438F217805FD5F85990FF515\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter2/Wizard_Artefact2.Wizard_Artefact2:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Wizard/Chapter2/Wizard_Artefact2.Wizard_Artefact2:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_Wizard_Artefact2\"\nmsgid \"We are close! Only one artefact is missing.\"\nmsgstr \"\"\n\n#. Key:\tFD6163CC43BF00E4DB95CBB11CA7D389\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter2/Wizard_Artefact2.Wizard_Artefact2:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Wizard/Chapter2/Wizard_Artefact2.Wizard_Artefact2:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_Wizard_Artefact2\"\nmsgid \"What I miss is a comfortable apartment somewhere safe...\"\nmsgstr \"\"\n\n#. Key:\t0D37E1DE44FDF7C5BF8DD28C038FA49D\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter2/Wizard_Artefact3.Wizard_Artefact3:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Wizard/Chapter2/Wizard_Artefact3.Wizard_Artefact3:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_Wizard_Artefact3\"\nmsgid \"What? Can’t you just... oh, forget it!\"\nmsgstr \"\"\n\n#. Key:\t2BDFD83247C8B644DED9CAA6486A064F\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter2/Wizard_Artefact3.Wizard_Artefact3:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Wizard/Chapter2/Wizard_Artefact3.Wizard_Artefact3:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_Wizard_Artefact3\"\nmsgid \"Yes, I’ve done what you asked. Now it’s your turn. Set me free!\"\nmsgstr \"\"\n\n#. Key:\t8CCAFBA148F1834EABE12CAC93669A79\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter2/Wizard_Artefact3.Wizard_Artefact3:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Wizard/Chapter2/Wizard_Artefact3.Wizard_Artefact3:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_Wizard_Artefact3\"\nmsgid \"I have to admit I’m impressed. You found all the three artefacts.\"\nmsgstr \"\"\n\n#. Key:\tA54C612946D6A5EB76D38B8622F4F76C\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter2/Wizard_Artefact3.Wizard_Artefact3:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Wizard/Chapter2/Wizard_Artefact3.Wizard_Artefact3:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_Wizard_Artefact3\"\nmsgid \"All right demon. Use the railways to travel to World’s End. That’s where I can bring you back.\"\nmsgstr \"\"\n\n#. Key:\t05FE50EE4B18F4FE9C1559979669E616\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"Still nothing, but nobody said anything about any visible change at this point, right?\"\nmsgstr \"\"\n\n#. Key:\t0DDE5A0E47BADFCA9E6E98A10F0AF114\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_1.Children(0).Children.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_1.Children(0).Children.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"Craft Ghost Abacus\"\nmsgstr \"\"\n\n#. Key:\t0F4008294D6FA43C3D9C17BA600FB024\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"You have a glowing hammer. What's next?\"\nmsgstr \"\"\n\n#. Key:\t26089F6044B0FD1134C9C99AF17E9E0C\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_7.Children(4).Children.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_7.Children(4).Children.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"Say a different color\"\nmsgstr \"\"\n\n#. Key:\t29FFB2FF49C6C231583FF1B549DA218C\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"Gnome magic at its best. Did you do everything the way it was supposed to be done? You should find out soon... maybe.\"\nmsgstr \"\"\n\n#. Key:\t2BF7D8D726080F0A003A0229BE7871C7\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"With the proper instructions and materials you could definitely create something valuable here.\"\nmsgstr \"\"\n\n#. Key:\t3231FF0D4A2BBEE3E3AD7598E5105E0E\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"The object is coagulated into a single Surrected object!\"\nmsgstr \"\"\n\n#. Key:\t41335322411CF278B19849AC696E6F93\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_2.Children(4).Children.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_2.Children(4).Children.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"Break the abacus into pieces\"\nmsgstr \"\"\n\n#. Key:\t4C74F3C342690A8246916B85FF4685C9\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"The abacus does not show any emotion.\"\nmsgstr \"\"\n\n#. Key:\t4F8E51DA4C0B33020E34AF9AB47BCCD5\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_7.Children(0).Children.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_7.Children(0).Children.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"Croon \\\"La La LaLaLa LaLaLa\\\"\"\nmsgstr \"\"\n\n#. Key:\t5404D10943BB5F53229FDC845E60B000\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_7.Children(5).Children.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_7.Children(5).Children.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"Give up for now\"\nmsgstr \"\"\n\n#. Key:\t5548D94E415483F129CCA7A3102B9DB3\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"Poor Abacus. It is broken into pieces now.\"\nmsgstr \"\"\n\n#. Key:\t6F3DE41D43326079A2BD72A29059FBA9\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"You have the Abacus and the Ghost Flower Petals in front of you. The workshop has all the tools you need. How do you proceed?\"\nmsgstr \"\"\n\n#. Key:\t7EE3EE474090DCA65BB3199E69E83B43\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_1.Children(1).Children.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_1.Children(1).Children.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"Leave\"\nmsgstr \"\"\n\n#. Key:\t87B760894A587B34EB825487D907D2E4\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_7.Children(1).Children.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_7.Children(1).Children.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"Croon \\\"La LaLa LaLaLa LaLaLa\\\"\"\nmsgstr \"\"\n\n#. Key:\t947E69AA4EEE6DB329FAD48214D4C416\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_2.Children(0).Children.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_2.Children(0).Children.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"Say \\\"Sorry my <object name>!\\\"\"\nmsgstr \"\"\n\n#. Key:\t95D5418F4145388680D7C99F720CE191\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_7.Children(3).Children.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_7.Children(3).Children.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"Say \\\"Brown\\\"\"\nmsgstr \"\"\n\n#. Key:\tC184ED314482D706C3426CB5034C3AFD\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_7.Children(2).Children.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_7.Children(2).Children.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"Say \\\"Blue\\\"\"\nmsgstr \"\"\n\n#. Key:\tC7EB7FC648E0005DC35550A3D71DF221\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_2.Children(3).Children.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_2.Children(3).Children.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"Cover the Abacus with Petals\"\nmsgstr \"\"\n\n#. Key:\tCA7A7E0A4F16FBE20EE16395D6565D7E\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"Maybe the abacus is a bit more ghosty now... or is it just you getting tired of trying?\"\nmsgstr \"\"\n\n#. Key:\tE0507C5E44553E824F998D8D4CB044A4\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"Your last action did not lead to any visible change. What is your next move?\"\nmsgstr \"\"\n\n#. Key:\tE8550D874C73F12B76345D9AAB2FEB80\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_2.Children(2).Children.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_2.Children(2).Children.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"Heat a hammer\"\nmsgstr \"\"\n\n#. Key:\tE894C6624CC7A0F92CECBBB364C77CD1\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_2.Children(1).Children.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_2.Children(1).Children.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"Say \\\"Sorry my Abacus!\\\"\"\nmsgstr \"\"\n\n#. Key:\tEFC4E9AB4A1B8DF491B4FBABBC7FA560\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"The Abacus is covered with the Petals of the Ghost Flower.\"\nmsgstr \"\"\n\n#. Key:\t100A735A460E0DE2B0D130B802762D8B\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter2/WW_Scroll_Inspect.WW_Scroll_Inspect:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Wizard/Chapter2/WW_Scroll_Inspect.WW_Scroll_Inspect:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_WW_Scroll_Inspect\"\nmsgid \"It says: \\\"Be careful: I think there are Fishies in the water!\\\"\"\nmsgstr \"\"\n\n#. Key:\t1D280F60496F7EF5DBDADB90674E8225\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter2/WW_Scroll_Inspect.WW_Scroll_Inspect:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Wizard/Chapter2/WW_Scroll_Inspect.WW_Scroll_Inspect:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_WW_Scroll_Inspect\"\nmsgid \"He was.\"\nmsgstr \"\"\n\n#. Key:\t37D4983B49B8986752A095B03ADCD700\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter2/WW_Scroll_Inspect.WW_Scroll_Inspect:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Wizard/Chapter2/WW_Scroll_Inspect.WW_Scroll_Inspect:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_WW_Scroll_Inspect\"\nmsgid \"He was right.\"\nmsgstr \"\"\n\n#. Key:\t26432B92474630595CF8B6B44B02657B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_26.Text\n#: /Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_26.Text\nmsgctxt \"Dialogue_WWSewerCreatures\"\nmsgid \"Farewell and good luck to you as well!\"\nmsgstr \"\"\n\n#. Key:\t2E3C904D458640A4F06DD793B416366A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_WWSewerCreatures\"\nmsgid \"All right, I will return when I'm done.\"\nmsgstr \"\"\n\n#. Key:\t382595684668BDA97AAB95BF129246E4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_WWSewerCreatures\"\nmsgid \"No problem. I always help when I can.\"\nmsgstr \"\"\n\n#. Key:\t4BF10AD741739BE69EF797A32410C281\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_WWSewerCreatures\"\nmsgid \"One of your brothers is trapped? What happened?\"\nmsgstr \"\"\n\n#. Key:\t52403E3341ECEA5801B0E58D2F472FD5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_1.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_1.Children(1).Children.Text\nmsgctxt \"Dialogue_WWSewerCreatures\"\nmsgid \"Leave\"\nmsgstr \"\"\n\n#. Key:\t53AC225B4F21B68CAC6F8997F324124E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_29.Text\n#: /Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_29.Text\nmsgctxt \"Dialogue_WWSewerCreatures\"\nmsgid \"Farewell until we meet again!\"\nmsgstr \"\"\n\n#. Key:\t65042BC342E9717229E74A9DD272DC5F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_WWSewerCreatures\"\nmsgid \"It was nice to see you again.\"\nmsgstr \"\"\n\n#. Key:\t77959A144131C47488B221ADD9B1E13B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_WWSewerCreatures\"\nmsgid \"Don't worry! I'm still looking for it.\"\nmsgstr \"\"\n\n#. Key:\t7914F3CA40844C2A13A760BB0DAE1BFA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_WWSewerCreatures\"\nmsgid \"I don't have time for you creature! Stay out of my way!\"\nmsgstr \"\"\n\n#. Key:\t79A62658414FE0202F2E9AA0E0238BD4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_9.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_9.Children(0).Children.Text\nmsgctxt \"Dialogue_WWSewerCreatures\"\nmsgid \"Accept Quest\"\nmsgstr \"\"\n\n#. Key:\t9AEDA0E84BABEBCD8F18E8BC2D0B75D0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_WWSewerCreatures\"\nmsgid \"Calm down creature! I mean you no harm.\"\nmsgstr \"\"\n\n#. Key:\tB89304534B24114D19DF7AB07635FFDE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_WWSewerCreatures\"\nmsgid \"All right I will see what I can do.\"\nmsgstr \"\"\n\n#. Key:\tB8BD374E4738BFFDAFAC4EAA19E7A9D2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_23.Text\n#: /Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_23.Text\nmsgctxt \"Dialogue_WWSewerCreatures\"\nmsgid \"Oh, thank you!\"\nmsgstr \"\"\n\n#. Key:\tCF62984840B7508E82BAC0AB9D53EC0A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_9.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_9.Children(1).Children.Text\nmsgctxt \"Dialogue_WWSewerCreatures\"\nmsgid \"Decline\"\nmsgstr \"\"\n\n#. Key:\tEAD329F04773358B0CA339A4F155D990\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_WWSewerCreatures\"\nmsgid \"I'm sorry but I can't help you.\"\nmsgstr \"\"\n\n#. Key:\tF281396D4110E61ACFEFDBB7AD8E44A8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_1.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_1.Children(0).Children.Text\nmsgctxt \"Dialogue_WWSewerCreatures\"\nmsgid \"Help\"\nmsgstr \"\"\n\n#. Key:\tedge_next\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_1.InnerEdges(0).InnerEdges.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_1.InnerEdges(0).InnerEdges.Text\nmsgctxt \"DlgSystemSettings\"\nmsgid \"Next\"\nmsgstr \"\"\n\n"
  },
  {
    "path": "Content/Localization/WarriorbDialogues/zh-Hans/WarriorbDialogues.po",
    "content": "﻿# WarriorbDialogues Chinese (Simplified) translation.\n# Copyright 1998-2019 Epic Games, Inc. All Rights Reserved.\n# \nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: WarriorbDialogues\\n\"\n\"POT-Creation-Date: 2020-10-07 08:09\\n\"\n\"PO-Revision-Date: 2020-10-07 08:09\\n\"\n\"Language-Team: \\n\"\n\"Language: zh-Hans\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Plural-Forms: nplurals=1; plural=0;\\n\"\n\n#. Key:\t064BBCD1476819100C8D39881B7A7C56\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/2HW_LRDoor.2HW_LRDoor:DlgNode_Speech_2.Text\n#. /Game/SO/Dialogues/Ending/E2/2HW_LRDoor.2HW_LRDoor:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E2/2HW_LRDoor.2HW_LRDoor:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_2HW_LRDoor\"\nmsgid \"They still didn’t notice I locked them into the workroom.\"\nmsgstr \"他们仍然没有注意到我把他们锁在了工作室里。\"\n\n#. Key:\t21412F0A4E45FA97703599BACD9C5D0E\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/2HW_LRDoor.2HW_LRDoor:DlgNode_Speech_4.Text\n#. /Game/SO/Dialogues/Ending/E2/2HW_LRDoor.2HW_LRDoor:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Ending/E2/2HW_LRDoor.2HW_LRDoor:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_2HW_LRDoor\"\nmsgid \"I entered into the Laboratory.\"\nmsgstr \"我走进了实验室。\"\n\n#. Key:\t5A580A014B6E9907C819808423E10C30\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/2HW_LRDoor.2HW_LRDoor:DlgNode_Speech_3.Text\n#. /Game/SO/Dialogues/Ending/E2/2HW_LRDoor.2HW_LRDoor:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E2/2HW_LRDoor.2HW_LRDoor:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_2HW_LRDoor\"\nmsgid \"The Laboratory has strong secure spells. I can’t enter here without being noticed.\"\nmsgstr \"这个实验室有很强的安保法术。我无法敲敲潜入。\"\n\n#. Key:\t0530863744A9844E7F64009D82A189E4\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_3.Text\n#. /Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_2HW_WRDoor\"\nmsgid \"Ruin is close and we are all at risk. It’s not about you. It's about everyone.\"\nmsgstr \"毁灭即将来临，我们都处于危险之中。不只是你。这关系到每个人。\"\n\n#. Key:\t1AF2A89F4DCD86096D4343ABBE91BE51\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_7.Text\n#. /Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_2HW_WRDoor\"\nmsgid \"Something which doesn’t take my daughter’s soul...\"\nmsgstr \"不会将我女儿灵魂带走的东西……\"\n\n#. Key:\t2C5B294847F0E41F2CA189904EE66059\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_1.Text\n#. /Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_2HW_WRDoor\"\nmsgid \"I heard father arguing with someone.\"\nmsgstr \"我听见父亲在和人争论。\"\n\n#. Key:\t2C8DFF1042FB0480709877A366BE2F1D\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_6.Text\n#. /Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_2HW_WRDoor\"\nmsgid \"The device must be destroyed.. We’ll find something else to stop Ruin.\"\nmsgstr \"这个装置必须拆除。我们会找到别的办法来阻止毁灭。\"\n\n#. Key:\t3F9D7D9C42A8550A6B282680BFAE2CCC\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_10.Text\n#. /Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_2HW_WRDoor\"\nmsgid \"I had to do this. At least for mom. So that she didn’t die in vain.\"\nmsgstr \"我必须这么做。至少对母亲来说是这样。这样她就不会白死。\"\n\n#. Key:\t7F6FC84C4D799841C6F42EB45A9D648F\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_2.Text\n#. /Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_2HW_WRDoor\"\nmsgid \"No, I won't risk losing her! She is bound to the device.\"\nmsgstr \"不，我不会冒失去她的危险!她被束缚住了。\"\n\n#. Key:\tA03D724A4606AFFC00E417A5C3AB3BFF\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_4.Text\n#. /Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_2HW_WRDoor\"\nmsgid \"Lillian knew what she applied for. She must decide.\"\nmsgstr \"莉莉安知道她要的是什么，她必须作出决定。\"\n\n#. Key:\tABA214914981F3E844F49483B43B5414\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_11.Text\n#. /Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_2HW_WRDoor\"\nmsgid \"I used the key to close the door.\"\nmsgstr \"我用钥匙把门关上了。\"\n\n#. Key:\tB1ADF0404F97735215FCB9A47DD01640\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_5.Text\n#. /Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_2HW_WRDoor\"\nmsgid \"No, I’ve made my decision.\"\nmsgstr \"不，我已经决定了。\"\n\n#. Key:\tB26FAB564CA430617502FA85116629D0\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_9.Text\n#. /Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_2HW_WRDoor\"\nmsgid \"Even if our entire World needs to pay the price.\"\nmsgstr \"即使我们整个世界都需要为此付出代价。\"\n\n#. Key:\tD6D2D64446B6D921576A20ACD653AF7E\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_8.Text\n#. /Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_2HW_WRDoor\"\nmsgid \"I knew he wouldn’t let me finish what we started.\"\nmsgstr \"我知道他不会让我完成我们开始的工作。\"\n\n#. Key:\t178EBCA541F7FEC3CA46B1B2818691D4\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/AABook.AABook:DlgNode_Speech_4.Text\n#. /Game/SO/Dialogues/Wizard/Chapter1/AABook.AABook:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/AABook.AABook:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_AABook\"\nmsgid \"'...the Wisest of the Arcade gathered here to discuss if the magical phenomena means any more threat...'\"\nmsgstr \"...回廊里最聪明的人聚集在这里讨论这个神奇的现象是否代表会出现更多的威胁...'\"\n\n#. Key:\t8F2CCFF54FBAF7902DB6FEB0358ECFEF\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/AABook.AABook:DlgNode_Speech_3.Text\n#. /Game/SO/Dialogues/Wizard/Chapter1/AABook.AABook:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/AABook.AABook:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_AABook\"\nmsgid \"They were just like us. The next one hundred pages explain why Ruin will never reach the Arcade or how the Ancient Magic can stop it.\"\nmsgstr \"他们和我们一样。接下来的一百页解释了为什么毁灭永远不会到达回廊，或者古代魔法是如何阻止它的。\"\n\n#. Key:\tAC20B864497FB0D476C501AEF3B87508\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/AABook.AABook:DlgNode_Speech_2.Text\n#. /Game/SO/Dialogues/Wizard/Chapter1/AABook.AABook:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/AABook.AABook:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_AABook\"\nmsgid \"I hope you don’t want to read all that nonsense.\"\nmsgstr \"我希望你不要读那些废话。\"\n\n#. Key:\tB112F657498F660766AA45974CB44137\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/AABook.AABook:DlgNode_Speech_1.Text\n#. /Game/SO/Dialogues/Wizard/Chapter1/AABook.AABook:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/AABook.AABook:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_AABook\"\nmsgid \"'Ten years after the Cataclysm (or recently named as Ruin)...'\"\nmsgstr \"“大灾难(最近亦被称为毁灭)已经过去十年了……”\"\n\n#. Key:\t0F53B19F4EB2F7727B4907864AD3FF46\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_29.Text\n#. /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_29.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_29.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"What if you just take a break from this and let me pass? Make an exception.\"\nmsgstr \"你能否破例休息一下，让我继续？\"\n\n#. Key:\t1707E0F34CFDC054DBEAD9AFB368A0A4\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_6.Text\n#. /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"No rest, no sleep allowed.\"\nmsgstr \"不准休息，不准睡觉。\"\n\n#. Key:\t2524B3EC4DE1E2921C710CBE4511045F\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_10.Text\n#. /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"...sometimes I could really appreciate a chair.\"\nmsgstr \"…有时候我真渴望能有一把椅子。\"\n\n#. Key:\t29FE2AEF42639848EF3914B36BA2B633\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_5.Text\n#. /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"I do ask you for apologies, young one.\"\nmsgstr \"我确实需要你道个歉，年轻人。\"\n\n#. Key:\t2C1E7EA026080F0A003A0396BE7E0E7E\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_19.Text\n#. /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"Take this rune stone as compensation.\"\nmsgstr \"就拿这个符石作为补偿。\"\n\n#. Key:\t2C879B684B4B07B57D051797219E751E\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_2.Text\n#. /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"You might have proven worthy for the Arcade Gate, yet there are some other doors, and they have different rules.\"\nmsgstr \"你可能已经通过回廊之门证明了某些价值，但还有其他的门，而且它们的规则不尽相同。\"\n\n#. Key:\t3532C8254924CF13EA664CA11E256F07\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_13.Text\n#. /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"Will you??? That's so kind of you... err... I mean...\"\nmsgstr \"你真的会？？那太好了.... 呃... 我是说...\"\n\n#. Key:\t353D6C8B4B5719B1EFD2A59BA0281DED\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_2.Children(2).Children.Text\n#. Key:\t8EED48724A0A860CAD791FAF95554F26\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_3.Children(1).Children.Text\n#. /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_2.Children(2).Children.Text\n#. /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_3.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_2.Children(2).Children.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_3.Children(1).Children.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"Skip?\"\nmsgstr \"跳过？\"\n\n#. Key:\t3FF1411844C23DB2FDFA47939169B5C3\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_14.Children(0).Children.Text\n#. Key:\t59EC5E56475DE41CFC723793CEEAFA82\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_3.Children(0).Children.Text\n#. Key:\t65DD6A464F04F8B0762D568046344C16\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_6.Children(0).Children.Text\n#. /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_14.Children(0).Children.Text\n#. /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_3.Children(0).Children.Text\n#. /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_6.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_14.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_3.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_6.Children(0).Children.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"Accept challenge\"\nmsgstr \"接受挑战\"\n\n#. Key:\t414D5CC44FFD640215B97BB6090627D6\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_21.Text\n#. /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"That must be tough...\"\nmsgstr \"那一定很难……\"\n\n#. Key:\t4CAA2D0C4FB585A0EB5B4F87FE8A3A97\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_9.Text\n#. /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"I accept my fate yet sometimes...\"\nmsgstr \"有时我会接受命运...\"\n\n#. Key:\t4F7460F540408D07FECEEB88DC0D7D25\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_1.Text\n#. /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"Not so fast young lord!\"\nmsgstr \"别这么快，少爷!\"\n\n#. Key:\t52C3909F40026C52ADA498A5B60B3490\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_6.Children(1).Children.Text\n#. /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_6.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_6.Children(1).Children.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"Poor Keeper\"\nmsgstr \"可怜的守护者\"\n\n#. Key:\t59141BA444003F36E1671CB4E91FFF0E\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_7.Text\n#. /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"Farewell!\"\nmsgstr \"告辞！\"\n\n#. Key:\t59AC0995469571DBE1B7B6BDF68FA37D\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_18.Text\n#. /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"I am really sorry about that.\"\nmsgstr \"我真的很抱歉。\"\n\n#. Key:\t5C8404D34863129B221EF2BB1D0962CC\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_9.Children(0).Children.Text\n#. /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_9.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_9.Children(0).Children.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"Yes?\"\nmsgstr \"嗯？\"\n\n#. Key:\t5FF922B94D3FCA5FD095FFB788F43D02\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_15.Text\n#. /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"For there was a mistake.\"\nmsgstr \"发生了一个错误。\"\n\n#. Key:\t650DA55944F225C45BABE8B00D815A39\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_27.Text\n#. /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_27.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_27.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"I guess you want me to go through some crazy traps again...\"\nmsgstr \"我打赌你想让我再次经历一些疯狂的陷阱……\"\n\n#. Key:\t700A25DB401C6EDD1E9D1694DA1C1DA1\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_4.Text\n#. /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"Keepers never fail their duty.\"\nmsgstr \"守护者们从不失职。\"\n\n#. Key:\t72D703F84C84CD07F7DA569D9B86AECB\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_11.Text\n#. /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"There are times when you have to stand in front of a door for a really long time.\"\nmsgstr \"有时候你不得不在门前站很长时间。\"\n\n#. Key:\t8276A9AC4E3BAB81C41E6EAB12E4FED1\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_31.Text\n#. /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_31.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_31.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"If I ever see a chair that's your size I will let you know.\"\nmsgstr \"如果我看到有适合你身形的椅子，我会告诉你的。\"\n\n#. Key:\t89421ED443CA8DD5A15DF289C5DC6C37\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_28.Children(0).Children.Text\n#. /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_28.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_28.Children(0).Children.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"Accept Challenge\"\nmsgstr \"接受挑战\"\n\n#. Key:\t910F61A841D9E86D1B349E85A8A47FCF\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_14.Text\n#. /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"Prove yourself worthy and I shall yield the path!\"\nmsgstr \"如果你能证明你的价值，我就不挡道！\"\n\n#. Key:\t9DAC66B94E5A37C628522B90029E8FCC\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_2.Children(0).Children.Text\n#. /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_2.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_2.Children(0).Children.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"Not again\"\nmsgstr \"下不为例\"\n\n#. Key:\t9F3FE24943FB7CE59B8453A2849E874A\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_16.Text\n#. /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"This door is open and free of charge for everyone...\"\nmsgstr \"这扇门是开着的，而且不收门票。\"\n\n#. Key:\tA96E78A0410C87446F59ABAC1524A3F4\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_2.Children(1).Children.Text\n#. /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_2.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_2.Children(1).Children.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"Let's do it!\"\nmsgstr \"干起来！\"\n\n#. Key:\tA9998DDC43D15F1EDE404B8A3E04E3B2\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_8.Text\n#. /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"Keepers' lives are never easy.\"\nmsgstr \"守护者的生活从来都不容易。\"\n\n#. Key:\tBCAE1C1D4890E79F187EF0940C6F7E84\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_12.Children(0).Children.Text\n#. /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_12.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_12.Children(0).Children.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"Just get over\"\nmsgstr \"慢慢熬吧\"\n\n#. Key:\tC2F8F4E1457AC142E58D1EA3AF24AB56\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_12.Text\n#. /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"I am all right with a few hundred years, but after a millennium my knees hurt like hell.\"\nmsgstr \"刚开始的几百年，我感觉还好，但一千年过后，我的膝盖已经疼得要命。\"\n\n#. Key:\tC955446E4CA17593CCC57B9A73AAE824\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_17.Text\n#. /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"What?? Do you mean that all those challenges that I had to pass were in vain?\"\nmsgstr \"什么? ? 你是说那些我必须克服的挑战其实都是徒劳吗?\"\n\n#. Key:\tC97F61DA4A49287F5242EEB43152D409\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_28.Text\n#. /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"All right, you win. I'll go and do some jumping. Must be better than waiting here for an eternity.\"\nmsgstr \"好吧，你赢了。我要去进行一些跳跃运动了。总比在这里等上一辈子要好。\"\n\n#. Key:\tD318418D4CBBFA2AB381E6B287A8636F\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_30.Children(0).Children.Text\n#. /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_30.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_30.Children(0).Children.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"Accept Challenge.\"\nmsgstr \"接受挑战\"\n\n#. Key:\tD6BE170047C1A00770403087A7EBDF99\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_30.Text\n#. /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_30.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_30.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"Hopefully, we will finish this soon.\"\nmsgstr \"希望我们能尽快搞定。\"\n\n#. Key:\tD72FF4F943571BE3DC8DB1877581D4CD\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_3.Text\n#. /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"You shall prove yourself one more time.\"\nmsgstr \"你将再一次证明你自己。\"\n\n#. Key:\tDFD8B1E0414F989D46ED9BB24610CDA8\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_12.Children(1).Children.Text\n#. /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_12.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_12.Children(1).Children.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"I will help\"\nmsgstr \"我会帮忙的\"\n\n#. Key:\tFDDD27C544787C63B03CCE89B69A44E5\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_20.Text\n#. /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"Well, thanks!\"\nmsgstr \"嗯，谢谢！\"\n\n#. Key:\t06D52FD74B0013A5A22FEBA7A6E82032\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Did you came back to check out my wares?\"\nmsgstr \"你是来查看我的货吗？\"\n\n#. Key:\t07508A9F4A979D530AD8A9861F0C7D79\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Though maybe you will find relief by looking through my wares. Haha!\"\nmsgstr \"不过，也许你看看我的货就能获得些安慰。哈哈!\"\n\n#. Key:\t0C1B7239419B00927360E1B9578540EA\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_27.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_27.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"That's a sad name indeed. If the old saying 'nomen est omen' is true, then it might not be the best choice.\"\nmsgstr \"这真是个悲哀的名字。如果那句老话”人如其名“是真的，那么它可能不是最好的选择。\"\n\n#. Key:\t0D8F81E140A7AF5369415FB1C081250E\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_10.Children(0).Children.Text\n#. /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_10.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_10.Children(0).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Trade\"\nmsgstr \"交易\"\n\n#. Key:\t1089DA0443D9B23C84B8B799EEEBCCC9\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_SpeechSequence_0.SpeechSequence(0).SpeechSequence.Text\n#. /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_SpeechSequence_0.SpeechSequence(0).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_SpeechSequence_0.SpeechSequence(0).SpeechSequence.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Oh, that's sad my little one.\"\nmsgstr \"哦，那真是令人伤心，我的小宝贝儿。\"\n\n#. Key:\t16F6844C40498EC1B5CDAA87612D3982\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_42.Children(1).Children.Text\n#. /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_42.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_42.Children(1).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"No way\"\nmsgstr \"没门\"\n\n#. Key:\t182D4124450BFA52EF26FBACE1706333\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_45.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_45.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"How noble of you!\"\nmsgstr \"你真高尚！\"\n\n#. Key:\t1922E4FD49ABC50B04A33CBA07B440D1\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_34.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_34.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"But I hope this doesn't mean that you want to join the Maintainers. Haha!\"\nmsgstr \"但我希望这不意味着你想要加入维护人员的队伍中去。哈哈!\"\n\n#. Key:\t195B9BED4921EE6D732CA4BE6391A402\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_31.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_31.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"No, thanks!\"\nmsgstr \"不了，谢谢！\"\n\n#. Key:\t198A3D8D426F5202C280CE96202EB415\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_50.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_50.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"This is a sad name indeed. And if the old saying 'nomen est omen' is true, then this might not be the best choice.\"\nmsgstr \"这真是个悲哀的名字。如果那句老话”人如其名“是真的，那么它可能不是最好的选择。\"\n\n#. Key:\t1AF2DDE74542524EEF19CA9567CFBDAF\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"{name}? It still sounds a bit weird, but I think I might like it.\"\nmsgstr \"{name}？听起来还是有点怪，但我想我可能会喜欢。\"\n\n#. Key:\t1FC5AD3B488DB484169D0085D63ECC45\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"This sounds pretty epic but I wonder what nickname it might have?\"\nmsgstr \"这听起来很有史诗感，但我想知道它也许有什么绰号?\"\n\n#. Key:\t21FEE27B41116ADFBFD2B69333D6EB3F\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"By using some sort of ritual or spell...\"\nmsgstr \"通过某种仪式或咒语……\"\n\n#. Key:\t25DCE964400342D4188412ADF43277E6\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_61.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_61.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"I am rewarding you with these shiny coins!\"\nmsgstr \"这些闪亮的硬币是给你的奖励！\"\n\n#. Key:\t2717F0E0414D4828B67D9C9F9B7E5F84\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_62.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_62.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"See? I'm a gnome of my word!\"\nmsgstr \"瞧见没？我是个守信用的矮人！\"\n\n#. Key:\t2747A45248055455F9FA3B977A019EE0\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_44.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_44.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Well, you know where to find me... once you have some coins to spend!\"\nmsgstr \"总之，当你想花硬币了，你知道上哪儿可以找到我！\"\n\n#. Key:\t27CE4D1444C219D35B79F4A3B07CB67D\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"If you bring them to me, I will reward you with shiny golden coins!\"\nmsgstr \"如果你能把它们带给我，我就奖励你闪亮亮的硬币！\"\n\n#. Key:\t3040F4DC4C763062C8EFED9BCA5028C0\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_59.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_59.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"I would love to give you that name, but if you don't have the money to pay for it, we can't make the deal, it wouldn't be fair\"\nmsgstr \"我很乐意给你这个名字，但如果你没钱购买，我们就无法达成交易，否则是不公平的\"\n\n#. Key:\t3124230541027A0022F54C8648E688C9\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Oh, a customer!\"\nmsgstr \"噢，来了个顾客！\"\n\n#. Key:\t31C147E1430106CD29C7D7B2F7E84975\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_23.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_23.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Oh, how sad.\"\nmsgstr \"噢，真难过。\"\n\n#. Key:\t37CC1248471C360F8BB605A404ED1408\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_10.Children(4).Children.Text\n#. /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_10.Children(4).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_10.Children(4).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Give books\"\nmsgstr \"给予书本\"\n\n#. Key:\t3E0A0E06487AD4E75C3AF28786DE9CC7\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_16.Children(0).Children.Text\n#. /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_16.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_16.Children(0).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Don't know\"\nmsgstr \"不知道\"\n\n#. Key:\t40221BB0432119A5B1C285B748AEFB81\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_51.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_51.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"It sounds pretty epic, however I wonder what nickname it might have?\"\nmsgstr \"这听起来很有史诗感，但我想知道它是否有什么绰号?\"\n\n#. Key:\t422B5CC14CA23A6563EDBDBBEA09C44B\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_73.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_73.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Farewell! Ha-ha...\"\nmsgstr \"告辞！！哈哈...\"\n\n#. Key:\t4574EE8E4B1EAB6C9310C4A19F77B170\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_10.Children(6).Children.Text\n#. /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_10.Children(6).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_10.Children(6).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Leave\"\nmsgstr \"离开\"\n\n#. Key:\t47F99BBF439F713C52279F86BDC4FDD5\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_72.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_72.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"No thanks, I'm leaving.\"\nmsgstr \"不了，谢谢。我走了。\"\n\n#. Key:\t4F31CEE0411BB60324FB58938857F162\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_16.Children(1).Children.Text\n#. /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_16.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_16.Children(1).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"A mighty spirit\"\nmsgstr \"一个强大的幽灵\"\n\n#. Key:\t4FA29908450786B433C0FCA2E313D989\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_36.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_36.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Hi, I'm Lory.\"\nmsgstr \"嗨，我是劳里。\"\n\n#. Key:\t4FCB34514D82104E732407A1CD985F6B\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_70.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_70.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Sure, show me what you've got!\"\nmsgstr \"当然，让我看看你有什么本事！\"\n\n#. Key:\t53A46E1948B7CC1A9F8E02A3147FBF2D\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_67.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_67.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Sure, what can I do?\"\nmsgstr \"当然，我能做什么?\"\n\n#. Key:\t53E7A272465DE8D6E34AE7BE7435B1AC\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_25.Children(1).Children.Text\n#. /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_25.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_25.Children(1).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Spirit of the Unknown\"\nmsgstr \"无名幽魂\"\n\n#. Key:\t54F8FB604F0409ED474FBFBAD8BFD3B3\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"And you are...\"\nmsgstr \"你是...\"\n\n#. Key:\t58447CCB4EE84827DB8328A664C54198\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_24.Children(0).Children.Text\n#. /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_24.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_24.Children(0).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Buy name\"\nmsgstr \"购买名字\"\n\n#. Key:\t589162A649D330D791082EB8FE3F6459\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_41.Children(4).Children.Text\n#. /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_41.Children(4).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_41.Children(4).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Don't buy.\"\nmsgstr \"不购买。\"\n\n#. Key:\t58CC98724AFCD3826D69D482682AF352\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"\\\"The true value of your family\\\" and \\\"How much does a brother cost?\\\" can be two examples in this case.\"\nmsgstr \"在这种情况下，《家庭的真正价值》以及《一个兄弟值多少钱》就是两个活生生的例子。\"\n\n#. Key:\t5A249B2E47F62C59F66AD5848E6DEBFE\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_49.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_49.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"I'll see what I can do.\"\nmsgstr \"我看看我能做什么。\"\n\n#. Key:\t5A31E5D34729F7EAB69AC08238C1D32D\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_25.Children(0).Children.Text\n#. /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_25.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_25.Children(0).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Failed One\"\nmsgstr \"堕落者\"\n\n#. Key:\t5BA1062346DF8BC47F97BA97653E6DDA\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_46.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_46.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Farewell then, and good luck with your quest! Ha-ha...\"\nmsgstr \"那么再见了，祝你好运！哈哈…\"\n\n#. Key:\t6047D5334E0247BFB75EBAA7380C6800\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_68.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_68.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"I have some other important things to do right now.\"\nmsgstr \"我现在还有其他重要的事情要做。\"\n\n#. Key:\t60B184AF4F25AFB60380029BD2C17AAB\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_66.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_66.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"I'm a mighty spirit of the Unknown!\"\nmsgstr \"我是一个强大的无名幽魂\"\n\n#. Key:\t60CE0D4342B6E4971449D7BDDD62B13F\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_10.Children(3).Children.Text\n#. /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_10.Children(3).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_10.Children(3).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Help\"\nmsgstr \"帮助\"\n\n#. Key:\t62C5459E46C969412EAD70BAD466D808\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_SpeechSequence_0.SpeechSequence(1).SpeechSequence.Text\n#. /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_SpeechSequence_0.SpeechSequence(1).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_SpeechSequence_0.SpeechSequence(1).SpeechSequence.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Life is relentless. Innocent people are trapped, enslaved or abused!\"\nmsgstr \"生活是残酷的。无辜的人被困，被奴役，被虐待！\"\n\n#. Key:\t6DDEF0AB45B60A99946E8F9FC647DCDE\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_71.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_71.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"I need a proper name.\"\nmsgstr \"我需要一个合适的名字。\"\n\n#. Key:\t6F1C50A44DE698DF5BF089B1C9B29F06\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_69.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_69.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Right now I don't really have much money...\"\nmsgstr \"现在我真的没什么钱…\"\n\n#. Key:\t72272161488706E5E87697A755F11129\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Even though there are some other precious books that I could add to my collection...\"\nmsgstr \"尽管我还有其他一些珍贵的书可以拿来收藏……\"\n\n#. Key:\t764502A14C3C18B14F8A579A58CE5938\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"I know that some of those books must be in the Sewer's Library, but I couldn't find them.\"\nmsgstr \"我知道有些书肯定在下水道图书馆里，但我找不到。\"\n\n#. Key:\t7A1853C7454D74FD1F371A92CEE47B4E\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"That's fine but I wonder, what is your name?\"\nmsgstr \"没关系，但是我想知道，你叫什么名字?\"\n\n#. Key:\t7BACFCA748AF641E051E2D8B8D8488FC\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"I don't know if I have one.\"\nmsgstr \"我不确定我有没有名字。\"\n\n#. Key:\t821021954082EA7E4B392FA89EE4DE91\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_41.Children(1).Children.Text\n#. /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_41.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_41.Children(1).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Spirit of the Unknown (1 Gold)\"\nmsgstr \"无名幽魂 （1 金币）\"\n\n#. Key:\t83AECB5A4FCAB05CC81BCC9B810245B7\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_41.Children(2).Children.Text\n#. /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_41.Children(2).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_41.Children(2).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"BALL-E (1 Gold)\"\nmsgstr \"E球 （1 金币）\"\n\n#. Key:\t84ACF5E1449849CB79CF8AB10BE2FF2E\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"As you can observe, I have a pretty nice collection of books.\"\nmsgstr \"如你所见，我有一套很好的藏书。\"\n\n#. Key:\t899D1E18420FDAD236BF3486B2A5A010\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Ring the bell if you need something.\"\nmsgstr \"如果你需要什么就按铃。\"\n\n#. Key:\t8B33450F405DF08E72CE47B5FC66CDD5\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_55.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_55.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Spiry? Knowny?\"\nmsgstr \"螺旋状的?知道吗?\"\n\n#. Key:\t8CEC3E1943C3AB72CF3B71B160B9ADB9\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_10.Children(5).Children.Text\n#. /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_10.Children(5).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_10.Children(5).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Need gold\"\nmsgstr \"需要金币\"\n\n#. Key:\t8D0FBCA540F73842DD3AC38A76A5B623\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_56.Text\n#. Key:\tF045657A439D69E3615B80A066E9CE86\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_33.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_33.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_56.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Nevermind! You chose well.\"\nmsgstr \"没关系！你好好选。\"\n\n#. Key:\t8F32BD4544F8C439D7344CBE1F9B4D8A\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_24.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_24.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Would you like to buy one? The first one is for free!\"\nmsgstr \"你想买一个吗？第一个是免费的!\"\n\n#. Key:\t94C0F9B34F439CDFBDFAD696E81983E5\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"I don't have much gold. Is there any way you could help me out?\"\nmsgstr \"我没什么金币。你能帮助我吗？\"\n\n#. Key:\t9BA6BAA24E6C2B7F01964D892246E8F6\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"No, no, I meant the other bell.\"\nmsgstr \"不，不，我说的是另一个铃。\"\n\n#. Key:\tA9D4DF4C41BAD682571763BDA8DA6A62\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_10.Children(1).Children.Text\n#. /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_10.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_10.Children(1).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Can't afford\"\nmsgstr \"买不起\"\n\n#. Key:\tAA6B105442F5099CE0F4E2AE0DFF7080\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_35.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_35.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Now that we're done with this, will you have a look at my wares?\"\nmsgstr \"既然这件事已经搞完了，现在你能看看我的商品吗?\"\n\n#. Key:\tAADE21D24A42CE7BD318478306BAFFF7\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_10.Children(2).Children.Text\n#. /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_10.Children(2).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_10.Children(2).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"I need a name\"\nmsgstr \"我需要一个名字\"\n\n#. Key:\tAB00899C4A94AA6458737BB28339A3EE\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Hush, hush, little one!\"\nmsgstr \"嘘，嘘，小家伙！\"\n\n#. Key:\tAB431F244E4E18230CE5EAB99FB41A96\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_41.Children(0).Children.Text\n#. /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_41.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_41.Children(0).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Failed One (1 Gold)\"\nmsgstr \"堕落者 （1 金币）\"\n\n#. Key:\tAB92E44E46B40EF16989FF850DE0F843\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_42.Children(0).Children.Text\n#. /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_42.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_42.Children(0).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Interested\"\nmsgstr \"感兴趣\"\n\n#. Key:\tB0540325412D9839B33FB38C4FE73172\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Well, I guess that's a classic.\"\nmsgstr \"嗯，我想这是一个经典。\"\n\n#. Key:\tB0EFD31840839CDA6F3D929514412D00\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Ok, I'll try not to be annoying this time.\"\nmsgstr \"好吧，这次我尽量不惹人厌。\"\n\n#. Key:\tB1F217944F6B9A29BD13FA926D8230E8\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_44.Children(0).Children.Text\n#. /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_44.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_44.Children(0).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Farewell!\"\nmsgstr \"拜拜！\"\n\n#. Key:\tBA2B2F444FC2320349C4A0BABDA78B40\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_25.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_25.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"All right...\"\nmsgstr \"好吧...\"\n\n#. Key:\tCADB3E394C94CDE32D9969B6C1A41F5C\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_47.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_47.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Take this Elevator Crystal as it might prove useful in your journey.\"\nmsgstr \"带着这个水晶电梯，你在旅途中会需要它的。\"\n\n#. Key:\tCB3F061042B8340154B4CD8AEED41348\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_42.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_42.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"However, there is a way, I can help you out. Of course, if you are interested.\"\nmsgstr \"不过，有一个办法，我可以帮你。当然，如果你感兴趣的话。\"\n\n#. Key:\tCF24AD454E123F6D7D61029155390914\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_41.Children(3).Children.Text\n#. /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_41.Children(3).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_41.Children(3).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Warriorb (1 Gold)\"\nmsgstr \"球魂 （1 金币）\"\n\n#. Key:\tD01937C848C69809890885BAB13042BE\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_65.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_65.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"I'm not quite sure.\"\nmsgstr \"我不太确定。\"\n\n#. Key:\tD53097EB4EFC08C0C3261A9EEBD96B72\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_39.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_39.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"That's sad. Nothing is worse than a customer without any gold to spend!\"\nmsgstr \"真不爽。没有什么比遇到一个穷得叮当响的顾客更郁闷的了！\"\n\n#. Key:\tD63C08294AC09BF5B8E5D29EEC1C7D39\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"I'm forced to stay in this realm because I agreed to do some silly tasks for a wizard. I could really use some help.\"\nmsgstr \"我被迫留在这个王国，因为我同意帮一个巫师完成一些愚蠢的任务。另外，我需要一些帮助。\"\n\n#. Key:\tDB0CCA7746068ACFBE6F71963C398753\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_63.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_63.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"And now that you have some coins to spend it's time to talk about business!\"\nmsgstr \"现在你有一些金币了，是时候聊一笔买卖了！\"\n\n#. Key:\tDC0F8EC0407F1C7B4FFED6A91CB961C5\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_57.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_57.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"I hope this doesn't mean that you want to join the Maintainers. Haha!\"\nmsgstr \"但我希望这不意味着你想要加入维护人员的队伍中去。哈哈!\"\n\n#. Key:\tDC475A6740B71354D90D53B6AD1C4740\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_60.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_60.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"How wondrous! You found my books!\"\nmsgstr \"太奇妙了！你找到我的书了！\"\n\n#. Key:\tE3B8F89B4D4AC0ABD2E35994ABFA9916\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"I understand if you have identity problems, but there must be a way... how do others call you?\"\nmsgstr \"你的身份有问题我能理解，不过肯定有办法...  别人是怎么称呼你的？\"\n\n#. Key:\tE6BD711C4E23B71F944EEFB1C8D09AB4\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_41.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_41.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"You've come to the right place! Haha!\"\nmsgstr \"你来对地方了！哈哈！\"\n\n#. Key:\tEDEB662C4A5024CC618A668699BFAC2C\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_SpeechSequence_0.SpeechSequence(2).SpeechSequence.Text\n#. /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_SpeechSequence_0.SpeechSequence(2).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_SpeechSequence_0.SpeechSequence(2).SpeechSequence.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"There is no justice in this Realm.\"\nmsgstr \"在这片王国不存在正义。\"\n\n#. Key:\tF8814FA0497129A211F3F9BE01EAF378\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_29.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_29.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"That's a very cute name for a little one like you.\"\nmsgstr \"对于像你这样的小家伙来说，这个名字很可爱。\"\n\n#. Key:\tF8BEB8C147C81D8B13E52AA9934891AB\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_58.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_58.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Nevermind, you can always come back.\"\nmsgstr \"没关系，你随时可以回来。\"\n\n#. Key:\tF97BE7FD49F465A97F7C8D9F308EAD3C\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_52.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_52.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"That's such a cute name for a little one.\"\nmsgstr \"适合小不点的小可爱名字。\"\n\n#. Key:\tFAAAE5944AA8CCAEFC931CAA814C8621\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_54.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_54.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Which means you chose well.\"\nmsgstr \"也就是说你选对了。\"\n\n#. Key:\tFAD10B404CF744B61DF5D093829CD1E9\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Of course! You need some gold, otherwise how would you buy my stuff?\"\nmsgstr \"当然！你需要一些金子，否则你怎么买我的东西?\"\n\n#. Key:\tFE40092A444E97C59E8C6E94061D1134\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_30.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_30.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"However, I'd rather prefer: 'Nomen quantivis iam est pret!'\"\nmsgstr \"然而，我更喜欢说:“我是最棒的!”\"\n\n#. Key:\tFEE11C0F4A65DDFFDBF0BD8BB30CD438\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_25.Children(2).Children.Text\n#. /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_25.Children(2).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_25.Children(2).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"BALL-E\"\nmsgstr \"E球\"\n\n#. Key:\tFF0AFE8544814AE524115A853547D727\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_24.Children(1).Children.Text\n#. /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_24.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_24.Children(1).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Refuse\"\nmsgstr \"拒绝\"\n\n#. Key:\t0648624E4922B098541A7EA738DABC92\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/AARagdoll.AARagdoll:DlgNode_Speech_5.Text\n#. /Game/SO/Dialogues/Wizard/Chapter1/AARagdoll.AARagdoll:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/AARagdoll.AARagdoll:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_AARagdoll\"\nmsgid \"Well that happens sometimes. Maybe that someone forgot to monopolize this ragdoll design.\"\nmsgstr \"这种情况时有发生。也许有人忘了垄断这个布偶猫的设计。\"\n\n#. Key:\t2058DE654B2B75531C04628635169938\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/AARagdoll.AARagdoll:DlgNode_Speech_7.Text\n#. /Game/SO/Dialogues/Wizard/Chapter1/AARagdoll.AARagdoll:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/AARagdoll.AARagdoll:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_AARagdoll\"\nmsgid \"Just leave that doll.\"\nmsgstr \"把这个娃娃留下。\"\n\n#. Key:\t5A456D084D452C82038A04942002FAE6\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/AARagdoll.AARagdoll:DlgNode_Speech_3.Text\n#. /Game/SO/Dialogues/Wizard/Chapter1/AARagdoll.AARagdoll:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/AARagdoll.AARagdoll:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_AARagdoll\"\nmsgid \"It’s like the doll which was made by...\"\nmsgstr \"看上去制作这个娃娃的是...\"\n\n#. Key:\t7813ED164DF5CA7DE48A978F9A3DC959\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/AARagdoll.AARagdoll:DlgNode_Speech_1.Text\n#. /Game/SO/Dialogues/Wizard/Chapter1/AARagdoll.AARagdoll:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/AARagdoll.AARagdoll:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_AARagdoll\"\nmsgid \"How on earth did this get here?\"\nmsgstr \"它怎么会在这儿?\"\n\n#. Key:\tC4403E4C4FD7D72CA3252FB31FF98FDF\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/AARagdoll.AARagdoll:DlgNode_Speech_4.Text\n#. /Game/SO/Dialogues/Wizard/Chapter1/AARagdoll.AARagdoll:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/AARagdoll.AARagdoll:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_AARagdoll\"\nmsgid \"...by someone I knew.\"\nmsgstr \"...应该是某个我认识的家伙。\"\n\n#. Key:\tE4CD5DBC4E4BB1E783B55D80F4296B97\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/AARagdoll.AARagdoll:DlgNode_Speech_2.Text\n#. /Game/SO/Dialogues/Wizard/Chapter1/AARagdoll.AARagdoll:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/AARagdoll.AARagdoll:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_AARagdoll\"\nmsgid \"There are many weird things all over this place. What makes this stand out?\"\nmsgstr \"这个地方有很多奇怪的东西。是什么让它如此引人注目?\"\n\n#. Key:\tEDD72B38407D0C33C5F7859D09BC132B\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/AARagdoll.AARagdoll:DlgNode_Speech_6.Text\n#. /Game/SO/Dialogues/Wizard/Chapter1/AARagdoll.AARagdoll:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/AARagdoll.AARagdoll:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_AARagdoll\"\nmsgid \"You are not funny.\"\nmsgstr \"你很没趣。\"\n\n#. Key:\t02767246403F00F0C866B2A7F3E22A47\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_72.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_72.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_72.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"You can hardly find anyone that has more information about the Realms.\"\nmsgstr \"你很难找到比他更了解这个王国的人了。\"\n\n#. Key:\t04843D4A4D2DD4BC7CE50989C8F66FBA\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_2.SpeechSequence(2).SpeechSequence.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_2.SpeechSequence(2).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_2.SpeechSequence(2).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"How can I do something if I do not know what I have to do?\"\nmsgstr \"如果我不知道我必须做什么，我该怎么做呢?\"\n\n#. Key:\t071A801E44759E2681218497B9AE9A2B\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_53.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_53.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_53.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Your logic is incoherent.\"\nmsgstr \"你的逻辑不太连贯。\"\n\n#. Key:\t07488F9A4CC6F87DBC44F0A11700B370\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_70.Children(0).Children.Text\n#. Key:\tA67B3D3B4A3D17B37D585EBBBD9BBE92\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_75.Children(0).Children.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_70.Children(0).Children.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_75.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_70.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_75.Children(0).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"All right, I'm on it.\"\nmsgstr \"好吧，我上。\"\n\n#. Key:\t0757D23846F6BC96198472B7E9848D3F\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_52.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_52.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_52.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Maybe I should accept what I need to do now.\"\nmsgstr \"也许我应该接受我现在需要做的事。\"\n\n#. Key:\t07D63011406134B07FB90B903825151C\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_8.SpeechSequence(2).SpeechSequence.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_8.SpeechSequence(2).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_8.SpeechSequence(2).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Make your wizard turn you back to normal.\"\nmsgstr \"让你的巫师把你变回正常。\"\n\n#. Key:\t091DFEFA4B2DD8F9922A1B93534C66A8\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_70.Text\n#. Key:\t0F92571643C12F65C669F7812572B014\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_82.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_70.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_82.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_70.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_82.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven gives you one of his keys so that you can move around freely.\"\nmsgstr \"乌鸦给了你一把钥匙，这样你就可以自由移动了。\"\n\n#. Key:\t0922ED5741BB89553CCB548D33566972\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_8.SpeechSequence(4).SpeechSequence.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_8.SpeechSequence(4).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_8.SpeechSequence(4).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven is something which won't make wizards turn Raven back.\"\nmsgstr \"乌鸦是一种不会让巫师把自己变回去的东西。\"\n\n#. Key:\t0AAFADBB493DCFBA6C649EAC11133DC2\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_2.SpeechSequence(0).SpeechSequence.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_2.SpeechSequence(0).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_2.SpeechSequence(0).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"You don't have to know.\"\nmsgstr \"你不必知道。\"\n\n#. Key:\t0E59A33E44BF6B212BF0EF8E8EFB3E39\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_6.SpeechSequence(2).SpeechSequence.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_6.SpeechSequence(2).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_6.SpeechSequence(2).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"A rich kingdom ruling all the other lands, powered by spirits of another world; these spirits were bound to metal.\"\nmsgstr \"一个富裕的王国统治着所有其它的土地，由另一个世界的幽魂策力; 这些幽魂被束缚在金属上。\"\n\n#. Key:\t0EACC01B4A4C4F8C5622B9BD291E0DB9\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_91.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_91.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_91.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"I'm not quite sure about this...\"\nmsgstr \"我不太确定……\"\n\n#. Key:\t10142FA943B5E5D89F9E5AADC86EF413\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_113.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_113.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_113.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Yes.\"\nmsgstr \"是的。\"\n\n#. Key:\t12375FB0475147E23E1C21A867CFF219\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_68.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_68.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_68.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Is there anything else on your mind?\"\nmsgstr \"你还有什么事吗?\"\n\n#. Key:\t12A0B58B446843DD24045394E8586D7D\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_13.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Krrr...\"\nmsgstr \"呃...\"\n\n#. Key:\t12B921E04D135919C7DA37ADDBD2A7DB\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_100.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_100.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_100.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"We still have some time left before this happens.\"\nmsgstr \"在这之前我们还有一些时间。\"\n\n#. Key:\t133F676B4DBA8B41F6B94387D51457D5\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_59.Children(1).Children.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_59.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_59.Children(1).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"No more Raven\"\nmsgstr \"没有更多的乌鸦\"\n\n#. Key:\t13EF39EE4249FDD62208CFB7A41821D7\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_65.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_65.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_65.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Though Raven knows how you feel.\"\nmsgstr \"虽然乌鸦知道你的感受。\"\n\n#. Key:\t15D06ACE4E8B5E4DA49297BBE436039D\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_80.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_80.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_80.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Now you only need to find a place where you can infuse it.\"\nmsgstr \"现在你只需要找到一个可以将它注入的地方。\"\n\n#. Key:\t16D5522340AE76E69A4808A3C2D1C039\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_51.Children(1).Children.Text\n#. Key:\t2AD4608440348AC7C3E363A430B9848C\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_83.Children(0).Children.Text\n#. Key:\t57DDAE184F31D9761E3939B16E6B2E67\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_20.Children(1).Children.Text\n#. Key:\t59F157C64A5415C8B4E322B0FF5F2ACE\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_49.Children(1).Children.Text\n#. Key:\t73ACC7124190746F6D3EBF96C8202C25\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_77.Children(1).Children.Text\n#. Key:\t9900274346DCB374A4B222A6BFD67365\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_10.Children(1).Children.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_51.Children(1).Children.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_83.Children(0).Children.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_20.Children(1).Children.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_49.Children(1).Children.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_77.Children(1).Children.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_10.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_10.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_20.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_49.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_51.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_77.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_83.Children(0).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Chat\"\nmsgstr \"交谈\"\n\n#. Key:\t19FD8B0541A533338EA11B9CDA3719B2\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_74.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_74.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_74.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Now you only need to find a place where you can infuse it. Meanwhile, Raven must figure it out how to open the Gate with it.\"\nmsgstr \"现在你只需要找到一个可以将它注入的地方。同时，乌鸦必须弄清楚如何用它打开大门。\"\n\n#. Key:\t1BD7592A4F11AEC585ECA6A74A0E0D4E\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_9.SpeechSequence(4).SpeechSequence.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_9.SpeechSequence(4).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_9.SpeechSequence(4).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"In what way?\"\nmsgstr \"用什么方式？\"\n\n#. Key:\t1C30FADA4BB2B3CCE2140A8E192D9F14\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_34.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_34.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_34.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven is not like those dummy Living Armors, yet he does what he was made for.\"\nmsgstr \"乌鸦不像那些虚拟的活体铠甲，但他达到了他的目的。\"\n\n#. Key:\t1C57460444A7E044DD96148495C4C217\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_6.SpeechSequence(4).SpeechSequence.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_6.SpeechSequence(4).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_6.SpeechSequence(4).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"They lost purpose and became reckless.\"\nmsgstr \"他们失去了目标，变得鲁莽。\"\n\n#. Key:\t1E3AF1D8483287CE52633EA41B89DF11\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_116.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_116.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_116.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"After he had some rest.\"\nmsgstr \"他休息了一会儿。\"\n\n#. Key:\t1ED675F344909355D41212988B736F70\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_1.SpeechSequence(3).SpeechSequence.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_1.SpeechSequence(3).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_1.SpeechSequence(3).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven's master would like to understand before doing anything.\"\nmsgstr \"乌鸦的主人在做任何事情之前都要先弄明白。\"\n\n#. Key:\t22E51DC245ABAE53146A71AAE8D5AB55\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_16.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"You will realize that 'sense' has no meaning in this realm anymore.\"\nmsgstr \"你会意识到“感觉”在这个王国已经没有意义了。\"\n\n#. Key:\t236E0B58451C947C0DB93E9E3408456D\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_45.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_45.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_45.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"They are humans.\"\nmsgstr \"他们是人类。\"\n\n#. Key:\t254FBEE547ADDFCF33B350B04AE1EE16\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_95.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_95.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_95.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"I think I know all about the meaning of life and all, ok? Can we just go on?\"\nmsgstr \"我想我知道生命的全部意义，好吗? 我们能继续吗?\"\n\n#. Key:\t2671F10D4257D8A3482009A9C042026D\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_11.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Hand it over to Raven so he could open the Gate!\"\nmsgstr \"把它交给乌鸦，这样它就可以打开那扇门了！\"\n\n#. Key:\t2845CBE64B1624C7EC4B81BC314B4F1B\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_27.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_27.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_27.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"The master gave Raven the ability to think and talk.\"\nmsgstr \"主人给了乌鸦思考和说话的能力。\"\n\n#. Key:\t29F405BF4233B5A8331B419747954425\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_77.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_77.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_77.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Why are you here?\"\nmsgstr \"你怎么会在这里？\"\n\n#. Key:\t2B5FB92D4F98359F68AD58AB776FD9BA\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_9.SpeechSequence(1).SpeechSequence.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_9.SpeechSequence(1).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_9.SpeechSequence(1).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Seeking for knowledge, as always. And you? Never thought we’ll meet again. Still trying to take down these Realms forever?\"\nmsgstr \"我一如既往地寻求知识。你呢? 没想到我们还会再见面。还想永远占领这些王国吗?\"\n\n#. Key:\t2B8CF34046D5486EB935CE919A1BD469\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_97.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_97.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_97.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"I'm new with all this wizard business thing. What was their conversation about?\"\nmsgstr \"我对巫师这行不太了解。他们的谈话内容是什么?\"\n\n#. Key:\t2C15668C26080F0A003A02E7BE7B5A65\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_8.SpeechSequence(1).SpeechSequence.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_8.SpeechSequence(1).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_8.SpeechSequence(1).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"It can happen again.\"\nmsgstr \"这种情况可能会再次发生。\"\n\n#. Key:\t2F226AC246B52387854AF5AFA09CEDD6\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_43.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_43.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_43.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"So we let those keys behind and set ourselves free from wizards?\"\nmsgstr \"所以我们把那些钥匙留在身后，自己从巫师手中解脱出来?\"\n\n#. Key:\t2FF7B3E84C009ECFDDE9F495092BEAA8\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_9.SpeechSequence(7).SpeechSequence.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_9.SpeechSequence(7).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_9.SpeechSequence(7).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"A pleasure to hear that. Talk to Raven about the details. Please excuse me for leaving so early, I have something important to do.\"\nmsgstr \"很高兴听你这么说。去和乌鸦谈谈细节。请原谅我走得这么早，我有重要的事情要做。\"\n\n#. Key:\t305333F348E677D8C3553999F412C8B6\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_36.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_36.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_36.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven knows he has different tasks now, compared to what he used to do before.\"\nmsgstr \"乌鸦知道他现在的任务和以前不一样了。\"\n\n#. Key:\t311A1E3745667AC6B4114D999B0E7C7F\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_83.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_83.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_83.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Go now! Raven still needs some more time to think about this.\"\nmsgstr \"现在就去吧！乌鸦还需要一些时间来考虑这个问题。\"\n\n#. Key:\t32F0018141E94BDE0921E9A54C1E4F20\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_1.SpeechSequence(0).SpeechSequence.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_1.SpeechSequence(0).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_1.SpeechSequence(0).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"They were always like this.\"\nmsgstr \"他们总是这样。\"\n\n#. Key:\t34903F43484A4D6CE5735890AEEA294D\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_9.SpeechSequence(5).SpeechSequence.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_9.SpeechSequence(5).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_9.SpeechSequence(5).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"The Cerulean Gates are closed again. What if we share the work?\"\nmsgstr \"蔚蓝之城大门又关闭了。如果我们分担工作呢？\"\n\n#. Key:\t350270814B961A20E48267A4B1AE0538\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_6.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Yes! The Gem is fully charged!\"\nmsgstr \"是的！宝石全部充能完毕！\"\n\n#. Key:\t361D80AB46AC47E5A233ECA2323222A2\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_86.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_86.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_86.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Why are you obeying that wizard of yours?\"\nmsgstr \"你为什么服从你的那个巫师？\"\n\n#. Key:\t365EDA2849D42A47D0D26DAC50DA6E94\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_28.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven is not that happy with those two, but Raven can accept that he is what he is.\"\nmsgstr \"乌鸦对这两个都不满意，但是乌鸦可以接受他现在的身份。\"\n\n#. Key:\t37C560AB4CCFAF4F8D26FAB1DE22453C\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_63.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_63.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_63.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Don't worry. You'll find some purpose.\"\nmsgstr \"别担心。你会找到目标的。\"\n\n#. Key:\t39DAB8B641C31878F7312FA7807D9DA0\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_6.SpeechSequence(3).SpeechSequence.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_6.SpeechSequence(3).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_6.SpeechSequence(3).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"The residents of the Realm did not have to work. Their spirit slaves did everything for them, they accomplished all their desires.\"\nmsgstr \"王国的居民不必工作。他们的精神奴隶为他们做了一切，他们实现了所有的愿望。\"\n\n#. Key:\t3B63606F48193748243DE6AB18D7A68C\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_40.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_40.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_40.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven thinks you might want to be something else. Something that you used to be, but you are not anymore.\"\nmsgstr \"乌鸦认为你可能想成为别的什么人。比如你曾经成为过的某个什么。\"\n\n#. Key:\t3C332B1C4ADB3C16C005E8AAF76A09B1\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_109.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_109.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_109.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Except...\"\nmsgstr \"除了...\"\n\n#. Key:\t3C9750814FC56947BDA7DFAF8A71DCC2\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_25.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_25.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_25.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"It is a long story and Raven doesn't really like to talk about it.\"\nmsgstr \"这是一个很长的故事，乌鸦并不喜欢谈论它。\"\n\n#. Key:\t3D10982D4A6FA88941F13F82413D17AC\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_20.Children(0).Children.Text\n#. Key:\t3E117EBB48C1CF091F456CA0FB78EDD7\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_77.Children(0).Children.Text\n#. Key:\t59F0F04941BB918E08743E8A7C3734B2\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_32.Children(6).Children.Text\n#. Key:\t6556945844ED44678075CE8796F00800\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_51.Children(0).Children.Text\n#. Key:\t7EC3944940792EC71B6A2F8674250649\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_49.Children(0).Children.Text\n#. Key:\tC6963EAE43B4D0FD3C8FBAA80A38E2A2\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_83.Children(1).Children.Text\n#. Key:\tE048FA684AA7B8DE0F7273992DA4600E\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_3.Children(4).Children.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_20.Children(0).Children.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_77.Children(0).Children.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_32.Children(6).Children.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_51.Children(0).Children.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_49.Children(0).Children.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_83.Children(1).Children.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_3.Children(4).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_20.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_3.Children(4).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_32.Children(6).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_49.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_51.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_77.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_83.Children(1).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Leave\"\nmsgstr \"离开\"\n\n#. Key:\t4417EE084F947AAF5D3285B086F741AC\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_14.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven is fine with talking. Ask me whatever you have on your mind!\"\nmsgstr \"乌鸦很会说话。你有什么事就问我！\"\n\n#. Key:\t4485635A4832D9DC57240F8EF3323042\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_9.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Very nice! Raven likes that you are making progress.\"\nmsgstr \"非常好！乌鸦喜欢你的进步。\"\n\n#. Key:\t480718E34822FD682466E7B217249ED0\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_47.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_47.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_47.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Which is technically the same.\"\nmsgstr \"技术上是一样的。\"\n\n#. Key:\t48B67F42417A2930A4D200B958FDFB58\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_38.Children(3).Children.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_38.Children(3).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_38.Children(3).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"I'm confused\"\nmsgstr \"我很困惑\"\n\n#. Key:\t49F0AC6A46EBF6C3148BC590CE56C297\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_10.Children(0).Children.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_10.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_10.Children(0).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Help\"\nmsgstr \"帮助\"\n\n#. Key:\t4CB1CE8A4AEC18FA175BA98F831D3C3C\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_59.Children(0).Children.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_59.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_59.Children(0).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Farewell\"\nmsgstr \"再见\"\n\n#. Key:\t4D514A7D4CC96E3E79F464A6C0BF0C6E\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_2.SpeechSequence(4).SpeechSequence.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_2.SpeechSequence(4).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_2.SpeechSequence(4).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"What??\"\nmsgstr \"什么？？\"\n\n#. Key:\t4F8198D64A210B3A41EED8AA6AE64401\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_50.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_50.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_50.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven will just sit here for a short time before venturing into the Ruin.\"\nmsgstr \"乌鸦只会在这里坐一会儿，然后冒险面对毁灭。\"\n\n#. Key:\t503CD5334EE86CFBEC2E7EA67F45ACD9\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_22.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"So you're meant to open this dusty little door with Raven, aren't you?\"\nmsgstr \"所以你要和乌鸦一起打开这扇满是灰尘的小门，对吗?\"\n\n#. Key:\t512AEC2642B36D9DDF407EB447DF5A28\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_15.Children(1).Children.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_15.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_15.Children(1).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Let's have fun!\"\nmsgstr \"嗨起来！\"\n\n#. Key:\t5142E71B48C2E993CC8026919A3FDBD6\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_87.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_87.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_87.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Er... okey, I was just asking.\"\nmsgstr \"呃… 好吧，我只是问问。\"\n\n#. Key:\t518038644F25D09C9DA7FF984C272B77\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_40.Children(1).Children.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_40.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_40.Children(1).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"That's stupid\"\nmsgstr \"这很愚蠢\"\n\n#. Key:\t53B5A1AC40CCF1CFBC106BA2BD8000E0\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_60.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_60.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_60.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Farewell, Raven!\"\nmsgstr \"拜拜，乌鸦！\"\n\n#. Key:\t54C0F3A6493E6D0671D38DB16BD4BF51\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_3.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"I would like to know...\"\nmsgstr \"我想知道……\"\n\n#. Key:\t55665725414633C111356D94939362FF\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_67.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_67.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_67.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Let's open that gate. Quick!\"\nmsgstr \"让我们打开那扇门。快！\"\n\n#. Key:\t565D7DA644ADF0E536C2FC8F99B735A3\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_3.Children(2).Children.Text\n#. Key:\t934A23AD44787C735FCDE79A34657C90\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_32.Children(3).Children.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_3.Children(2).Children.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_32.Children(3).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_3.Children(2).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_32.Children(3).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Why is he here?\"\nmsgstr \"他为什么在这里？\"\n\n#. Key:\t57BE04074884DB4CC54AC691E156F0FC\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_38.Children(2).Children.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_38.Children(2).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_38.Children(2).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Freedom\"\nmsgstr \"自由\"\n\n#. Key:\t5919EDBF4799413180AF569CB920E436\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_90.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_90.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_90.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"You can't live your life like in the old days any longer and that's why you're staying with your master, right?\"\nmsgstr \"你不能再过以前那样的生活了，这就是为什么你要和你的主人呆在一起，对吧?\"\n\n#. Key:\t592D458F40571927D0BB549F3614420E\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_32.Children(5).Children.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_32.Children(5).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_32.Children(5).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"End of the World\"\nmsgstr \"世界之末\"\n\n#. Key:\t596065A34760461993AC339C51D9E402\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_73.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_73.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_73.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"First you will need to find the Gem. Meanwhile, Raven must figure it out how to open the Gate with it.\"\nmsgstr \"首先你需要找到宝石。同时，乌鸦必须弄清楚如何用它打开大门。\"\n\n#. Key:\t599A90394B8AC7A26D20FEB355A873FB\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_98.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_98.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_98.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"What are you doing here?\"\nmsgstr \"你在这儿干什么?\"\n\n#. Key:\t5A5D2F08427C4747F3EF529D6B73A21B\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_20.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Go on your search then! Unless you'd like to chat some more with Raven.\"\nmsgstr \"那就继续找吧！除非你想和乌鸦多聊聊。\"\n\n#. Key:\t5A63E364458C849C9B6FDD8491427051\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_8.SpeechSequence(5).SpeechSequence.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_8.SpeechSequence(5).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_8.SpeechSequence(5).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"But you could.\"\nmsgstr \"但是你可以。\"\n\n#. Key:\t5B07757F4CAAD674E09EBB835CEE230B\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_75.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_75.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_75.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"It must be somewhere close to the Arcade.\"\nmsgstr \"一定是在回廊附近。\"\n\n#. Key:\t5B9CDB4340B5E65E59D3A18283A84CA5\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_64.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_64.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_64.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven knows some people that'd be glad with that.\"\nmsgstr \"乌鸦知道有些人会为此感到高兴。\"\n\n#. Key:\t5BA0645E49A62C0945FB64BDF689721F\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_112.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_112.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_112.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Is that where I will find your artefacts?\"\nmsgstr \"我能在那里找到你的工艺品吗?\"\n\n#. Key:\t5E70951F4E50B061FF2DA196F0207612\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_15.Children(0).Children.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_15.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_15.Children(0).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Save the world!\"\nmsgstr \"拯救世界！\"\n\n#. Key:\t5F810A7D417E5B02025F30B21FEA5F03\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_79.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_79.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_79.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Niiice!\"\nmsgstr \"棒棒的！\"\n\n#. Key:\t6441F8C2484FAA5219841C9D374F36C4\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_6.SpeechSequence(6).SpeechSequence.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_6.SpeechSequence(6).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_6.SpeechSequence(6).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"And now, even while we speak, their curse continues to spread.\"\nmsgstr \"现在，就在我们说话的时候，他们的咒诅还在扩散。\"\n\n#. Key:\t66A08695458FF9D46383F6A0AF609EFA\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_41.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_41.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_41.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"You are so hopeless...\"\nmsgstr \"你真是没救了……\"\n\n#. Key:\t67EEF3DB42BA2C954AD566B4F95EBDB6\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_6.SpeechSequence(5).SpeechSequence.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_6.SpeechSequence(5).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_6.SpeechSequence(5).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Until one day the spirits broke loose and formed Ruin.\"\nmsgstr \"直到有一天，幽魂挣脱了束缚，变成了毁灭。\"\n\n#. Key:\t68442CA14CECA9FB8A215EBEBC724F63\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_19.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Ask more from Raven if you like!\"\nmsgstr \"如果你愿意，可以再问问乌鸦！\"\n\n#. Key:\t694D416244358BD7DBED04A82390A146\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_51.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_51.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_51.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"One more,... and the Gem will be completed!\"\nmsgstr \"再来一个... 宝石就完成了！\"\n\n#. Key:\t6A463E0444754B73FE11988F07D5A58F\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_2.SpeechSequence(1).SpeechSequence.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_2.SpeechSequence(1).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_2.SpeechSequence(1).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"You just have to do it.\"\nmsgstr \"你必须去做。\"\n\n#. Key:\t6A92F010409301669F7B83AD7901A469\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_1.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"A strange creature, yet a familiar aura! Tell me, my dear Wizard, what happened to Tabby?\"\nmsgstr \"一个奇怪的生物，一个熟悉的光环! 告诉我，我亲爱的巫师，泰比怎么了?\"\n\n#. Key:\t6CC1259244D5FC82CA1C2EA314836741\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_1.SpeechSequence(1).SpeechSequence.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_1.SpeechSequence(1).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_1.SpeechSequence(1).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"They both accepted that there is a great threat in this realm.\"\nmsgstr \"他们都承认在这个王国存在着巨大的威胁。\"\n\n#. Key:\t6FB7AF774662247E2001F9AAF34FF134\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_111.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_111.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_111.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Somewhere beyond that Gate there's a Portal. It will take you into the heart of the Realm.\"\nmsgstr \"在那扇门的后面有一个入口。它将带你进入王国的中心。\"\n\n#. Key:\t70A0BA47476A909013EFC0A574815B61\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_23.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_23.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_23.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"The Master and Raven are seeking knowledge about the Ruined Realm.\"\nmsgstr \"主人和乌鸦正在寻找有关这片毁灭王国的知识。\"\n\n#. Key:\t70ECE1B74BA0B02F2F0850937BF4FB02\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_3.Children(3).Children.Text\n#. Key:\tE9F5916345156A4E5F29AC886B49B8AD\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_32.Children(4).Children.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_3.Children(3).Children.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_32.Children(4).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_3.Children(3).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_32.Children(4).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"About Ruin\"\nmsgstr \"关于毁灭\"\n\n#. Key:\t7311CA4B4D6B19C6C5C362AF522A9803\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_1.SpeechSequence(4).SpeechSequence.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_1.SpeechSequence(4).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_1.SpeechSequence(4).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Your master said he is done with that.\"\nmsgstr \"你的主人说他已经受够了。\"\n\n#. Key:\t74B8E0B44D4590E9970F4B9D09D3C4F9\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_6.SpeechSequence(1).SpeechSequence.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_6.SpeechSequence(1).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_6.SpeechSequence(1).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Long ago it was called the Runic Realm.\"\nmsgstr \"很久以前，它被称为符文王国。\"\n\n#. Key:\t76756B1C48E93E907CE32D83A2C56C3E\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_7.SpeechSequence(0).SpeechSequence.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_7.SpeechSequence(0).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_7.SpeechSequence(0).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven is really sorry but he can't help you anymore.\"\nmsgstr \"乌鸦真的很抱歉，但他不能再帮你了。\"\n\n#. Key:\t78C7CE5948D176704CA69289BEEBFBA7\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_44.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_44.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_44.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"And what about the Realm of the wizards? They did not go mad yet, did they?\"\nmsgstr \"那巫师王国呢? 他们还没有发疯，是吗?\"\n\n#. Key:\t7DFA4D494BD0536F925A94BBF7C71F36\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_66.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_66.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_66.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Focus on what you have to do and you will find the real you.\"\nmsgstr \"专注于你必须做的事情，你就会找到真正的你。\"\n\n#. Key:\t81F437694DEE3D32A0FC29B90688E8B9\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_38.Children(4).Children.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_38.Children(4).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_38.Children(4).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"This is stupid\"\nmsgstr \"这很愚蠢\"\n\n#. Key:\t82F473A04D250E98AD186185EBE95C04\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_5.SpeechSequence(0).SpeechSequence.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_5.SpeechSequence(0).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_5.SpeechSequence(0).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven thinks freedom is such an empty word.\"\nmsgstr \"乌鸦认为自由是个空洞的词。\"\n\n#. Key:\t8688802A4303C53640C7BFAAA40226EC\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_8.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Almost there!\"\nmsgstr \"快了！\"\n\n#. Key:\t8728C02E46E7B681D0A792ACAFC3237D\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_28.Children(2).Children.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_28.Children(2).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_28.Children(2).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"He accepted his fate\"\nmsgstr \"他接受了自己的命运\"\n\n#. Key:\t8854653141FA36E731780F9111B82FAD\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_30.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_30.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_30.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"You are not listening to Raven's words!\"\nmsgstr \"你没有在听乌鸦说话！\"\n\n#. Key:\t88FDA06B4A44ED1BF559D996E6AF7097\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_6.SpeechSequence(0).SpeechSequence.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_6.SpeechSequence(0).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_6.SpeechSequence(0).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Even so, Raven will tell you a bit.\"\nmsgstr \"即便如此，乌鸦还是会告诉你一些的。\"\n\n#. Key:\t8BA584404F2713EE39D74284F829C50A\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_17.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"You know what? Raven totally agrees with that!\"\nmsgstr \"你知道吗？乌鸦完全同意！\"\n\n#. Key:\t8C272FBE47796CF8101D07AAD033C24B\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_62.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_62.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_62.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"The later we met the more time the World survived, didn't it?\"\nmsgstr \"我们相遇的越晚，这个世界存在的时间就越长，不是吗?\"\n\n#. Key:\t8DD39A3D497411B348B883972CE6B442\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_6.SpeechSequence(7).SpeechSequence.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_6.SpeechSequence(7).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_6.SpeechSequence(7).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"At first, lands lose their colours, people go mad... and then, everything breaks into shards until solely hollowness remains...\"\nmsgstr \"起初，土地失去了颜色，人们开始发疯……然后，一切都破碎成碎片，直到只剩下空虚……\"\n\n#. Key:\t8E02961D428949EE8176639F6AE84DD9\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_107.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_107.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_107.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"If the end is near, there is no point in making long term plans.\"\nmsgstr \"如果末日即将来临，那就没有必要制定长期计划。\"\n\n#. Key:\t8EB8F2654B9C18135CBEB49D10485417\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_37.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_37.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_37.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"We all have a purpose in life.\"\nmsgstr \"我们都有一个人生目标。\"\n\n#. Key:\t9131DE4C434AD9B22C7B1BAA588AF694\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_9.SpeechSequence(3).SpeechSequence.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_9.SpeechSequence(3).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_9.SpeechSequence(3).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Private business? All right! We might have different motivations, however working together could be fruitful.\"\nmsgstr \"私人事务？好吧！我们可能动机不同，但是团结起来一定会有收获！\"\n\n#. Key:\t91947E4046F96E9330EA5A94C367E2C5\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_4.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Forget it, I'm on my way now.\"\nmsgstr \"算了吧，我马上就来。\"\n\n#. Key:\t91BE2C7248B2BEBE1C376B989935E353\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_7.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"What else should Raven tell you?\"\nmsgstr \"乌鸦还应该告诉你什么？\"\n\n#. Key:\t929558D0465B0884C4E373A602CCE9E5\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_59.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_59.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_59.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Farewell compeer until you meet Raven again!\"\nmsgstr \"再见了，小伙伴！\"\n\n#. Key:\t930942934A83107D86DB69A2C2EF11E0\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_117.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_117.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_117.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"The task is of high complexity.\"\nmsgstr \"这项任务很复杂。\"\n\n#. Key:\t93AFC24842A793D2BF7B43A64B6972AF\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_32.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_32.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_32.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Is there anything else for Raven?\"\nmsgstr \"还有其它事找乌鸦吗？\"\n\n#. Key:\t9A9D5DA346251040AF73B7B100E1EBC9\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_35.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_35.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_35.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven used to like being a bird, but now he has no other choice. He must embrace what he became.\"\nmsgstr \"乌鸦过去喜欢当鸟，但现在他没有别的选择。他必须接受他所变成的样子。\"\n\n#. Key:\t9B558C3045D4501AEAF3DD8694E2198F\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_105.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_105.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_105.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"We'd rather have some fun before it's all over.\"\nmsgstr \"我们想在一切结束之前找点乐子。\"\n\n#. Key:\t9E598A384E301BCD345ABFB0C1312C12\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_78.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_78.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_78.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Krrr... Raven notices that you've found the Gem!\"\nmsgstr \"呃…… 乌鸦发现你找到了宝石!\"\n\n#. Key:\t9FAD3A1A4E3EFE33C1CAB8BAAC8190D1\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_26.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_26.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_26.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Let Raven tell you something:\"\nmsgstr \"让乌鸦告诉你吧：\"\n\n#. Key:\tA10F960549BD21AFAD4819BD5C74E651\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_2.SpeechSequence(5).SpeechSequence.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_2.SpeechSequence(5).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_2.SpeechSequence(5).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Nevermind. Raven is kidding.\"\nmsgstr \"别介意。乌鸦是在开玩笑。\"\n\n#. Key:\tA4294A174F9EA54E0149839A84CE2B94\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_15.Children(2).Children.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_15.Children(2).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_15.Children(2).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Hopeless...\"\nmsgstr \"毫无希望...\"\n\n#. Key:\tA59406E8411939F96004EAA9D5707E08\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_28.Children(1).Children.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_28.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_28.Children(1).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"What?\"\nmsgstr \"什么？？\"\n\n#. Key:\tA5993D8047CDD35BA31D318832EB9C66\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_32.Children(2).Children.Text\n#. Key:\tB7AE6BEC4CA905BDED5990BFF4D0C93D\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_3.Children(1).Children.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_32.Children(2).Children.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_3.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_3.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_32.Children(2).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"About wizards\"\nmsgstr \"关于巫师。\"\n\n#. Key:\tA59A76814D8EAF5907CBC68AA63FE33F\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_2.SpeechSequence(3).SpeechSequence.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_2.SpeechSequence(3).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_2.SpeechSequence(3).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"How can I know that if you don't do it?\"\nmsgstr \"如果你不做，我怎么知道?\"\n\n#. Key:\tA7C7D1EC45A072755BAAB099DB359290\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_55.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_55.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_55.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"They don't believe that Ruin can affect their World. They say that it has no effect.\"\nmsgstr \"他们不相信毁灭会影响他们的世界。他们说没有效果。\"\n\n#. Key:\tA7D99136490D40CB08BA66A72192D6C0\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_7.SpeechSequence(2).SpeechSequence.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_7.SpeechSequence(2).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_7.SpeechSequence(2).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Go now! Raven needs to think.\"\nmsgstr \"现在就去吧！乌鸦需要思考。\"\n\n#. Key:\tA80B626C41713C6E42E4DF8696FF842D\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_8.SpeechSequence(0).SpeechSequence.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_8.SpeechSequence(0).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_8.SpeechSequence(0).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"You were a bird once. Then you became something else.\"\nmsgstr \"你曾经是一只鸟。然后你就变了。\"\n\n#. Key:\tA8D429384EFE74E30720149A1C53ADE9\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_38.Children(0).Children.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_38.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_38.Children(0).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Don't know\"\nmsgstr \"不知道\"\n\n#. Key:\tA9A73720489C122A81B84CBA262C329E\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_38.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_38.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_38.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven knows what his task is. Do you know yours?\"\nmsgstr \"乌鸦知道他的任务是什么。你了解你的任务吗?\"\n\n#. Key:\tAB41A75C432BEBDC81D63282FCC15F98\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_5.SpeechSequence(2).SpeechSequence.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_5.SpeechSequence(2).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_5.SpeechSequence(2).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Got it? Free like a bird! Ha-ha-ha!\"\nmsgstr \"明白了吗? 像鸟一样自由！哈哈哈！\"\n\n#. Key:\tAC52327249DB335CBAB9EDA6A3F4769E\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_31.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_31.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_31.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven is doing this because this is what he is.\"\nmsgstr \"乌鸦这么做是因为他就是这样的家伙。\"\n\n#. Key:\tB2003CEE44335B30B9F85487521B7679\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_54.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_54.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_54.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Maybe.\"\nmsgstr \"也许。\"\n\n#. Key:\tB31EEC6247CDEF73BB4E5B84E2B66575\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_9.SpeechSequence(2).SpeechSequence.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_9.SpeechSequence(2).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_9.SpeechSequence(2).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"That’s over now. This time it's for private business.\"\nmsgstr \"结束了。这一次是为了私人事务。\"\n\n#. Key:\tB3DD59C44422BA99C839FCAE63F05B9A\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_93.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_93.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_93.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"I want to be free again!\"\nmsgstr \"我想重获自由！\"\n\n#. Key:\tB789219A48C2A835F2DA4CA24064E1D3\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_92.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_92.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_92.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"I would like to go home.\"\nmsgstr \"我想回家。\"\n\n#. Key:\tB7D4201F41E5F018EFD49EAF52E443A8\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_76.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_76.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_76.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"You still haven't found the Gem.\"\nmsgstr \"你还没找到宝石。\"\n\n#. Key:\tB7EC6E4F4EDC448FD264999938414F3C\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_21.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Let's talk about something else!\"\nmsgstr \"我们谈点别的吧！\"\n\n#. Key:\tB8BF08674C9E2FD0515998B95A1EA7CF\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_7.SpeechSequence(1).SpeechSequence.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_7.SpeechSequence(1).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_7.SpeechSequence(1).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"If you can't fulfill your task, then maybe your master should look for a better servant.\"\nmsgstr \"如果你不能完成你的任务，那么也许你的主人应该找一个更好的仆人。\"\n\n#. Key:\tBD775EF74E334A4DEFA67BBF9034500E\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_84.Text\n#. Key:\tFA3FEF444FD2A3500FCCE98FAEAE923E\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_42.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_84.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_42.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_42.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_84.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Yes?\"\nmsgstr \"嗯？\"\n\n#. Key:\tBE2B9D7A45C2D43FF4C0BAAA284CBB97\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_2.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"No thanks! I'm on my way now.\"\nmsgstr \"不必了,谢谢！我现在就去。\"\n\n#. Key:\tC04CC9334FC3C2522793C2B97CC165D8\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_108.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_108.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_108.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"The gate is open!\"\nmsgstr \"大门是开着的！\"\n\n#. Key:\tC0F2E4744D724A3D6A0DEF914C294CE1\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_38.Children(1).Children.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_38.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_38.Children(1).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Go home\"\nmsgstr \"回家\"\n\n#. Key:\tC10018654B64193BBFF439B54EF02FB1\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_15.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"So why not open the gate?\"\nmsgstr \"那么，为什么不打开这扇门呢?\"\n\n#. Key:\tC18E2FB345BE76B6F51C71A2B6453316\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_99.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_99.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_99.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"What can you tell me about the Ruined Realm?\"\nmsgstr \"乌鸦将冒险深入毁灭王国！\"\n\n#. Key:\tC19082D247C23A21B632968FE6A644D1\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_8.SpeechSequence(3).SpeechSequence.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_8.SpeechSequence(3).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_8.SpeechSequence(3).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"You failed to see the meaning behind Raven's thoughts.\"\nmsgstr \"你没有体会到乌鸦思想背后的意义。\"\n\n#. Key:\tC2DC44084098DD604B757A8A47AAC4FE\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_58.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_58.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_58.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"We'll see.\"\nmsgstr \"再说吧。\"\n\n#. Key:\tC53F5E0F46BBE7A1FD00EABD6E14848D\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_33.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_33.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_33.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Maybe you are wiser than Raven, but that's just a thought, little spirit.\"\nmsgstr \"也许你比乌鸦聪明，但那只是一种想法，小精灵。\"\n\n#. Key:\tC78588B64D12FFBE97C47AB7C046C14E\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_1.SpeechSequence(5).SpeechSequence.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_1.SpeechSequence(5).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_1.SpeechSequence(5).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven doesn't believe it's true.\"\nmsgstr \"乌鸦不相信这是真的。\"\n\n#. Key:\tC7F7F71F4FE0D19BDF86188BEFDDEEB1\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_5.SpeechSequence(1).SpeechSequence.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_5.SpeechSequence(1).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_5.SpeechSequence(1).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Just look at Raven! He's free like a bird.\"\nmsgstr \"看看乌鸦！他像鸟一样自由。\"\n\n#. Key:\tC82BE6E448D7C98D361CA1890FEE3B2C\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_9.SpeechSequence(6).SpeechSequence.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_9.SpeechSequence(6).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_9.SpeechSequence(6).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"I’m in.\"\nmsgstr \"我来了。\"\n\n#. Key:\tCD1A68EF460B0C63C95340AC2076EBAF\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_10.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven notices that the gem is just as dull as before. Why did you return then?\"\nmsgstr \"乌鸦注意到宝石和以前一样阴暗。你为什么回来?\"\n\n#. Key:\tD3C84C884903F7FB53695AAE253C7982\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_40.Children(0).Children.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_40.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_40.Children(0).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Agree\"\nmsgstr \"同意\"\n\n#. Key:\tD438ABB348A399ACB18DFD8F320CC7BB\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_57.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_57.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_57.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"And what's the truth?\"\nmsgstr \"真相是什么？\"\n\n#. Key:\tD5DF32814FA17D7ED28BF0A91027A6E8\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_110.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_110.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_110.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Finally! From now on you won't need Raven anymore.\"\nmsgstr \"终于! 从现在开始你不再需要乌鸦了。\"\n\n#. Key:\tD6A649B2453BCBAD95A16FA481664133\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_49.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_49.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_49.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Find the other Chargers and return to Raven when you are done.\"\nmsgstr \"找到其它的充能，当你完成的时候回到乌鸦那里。\"\n\n#. Key:\tD9959CF1439812F5615A38B9369F6E16\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_71.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_71.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_71.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven notices that you already have the Gem.\"\nmsgstr \"乌鸦注意到你已经拥有了宝石。\"\n\n#. Key:\tD9A4F3D54EF460C09B2A6C9B8EB87D7C\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_32.Children(1).Children.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_32.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_32.Children(1).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"About my purpose...\"\nmsgstr \"关于我的目的…\"\n\n#. Key:\tD9C6F8C14BC9C0BD83715E96DE5B7161\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_28.Children(0).Children.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_28.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_28.Children(0).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"He is a volunteer\"\nmsgstr \"他是一名志愿者\"\n\n#. Key:\tDC7CA6DF4D684A7C2DBA739F404ABC36\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_94.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_94.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_94.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"I don't know what to do. I can't remember anything from my previous life.\"\nmsgstr \"我不知道该怎么办。我什么都不记得了。\"\n\n#. Key:\tDD8E05E541C32F05357D888FB6963FF0\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_114.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_114.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_114.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"All right, I go then.\"\nmsgstr \"好吧，我走了。\"\n\n#. Key:\tDE3A0B8047C9980B6DED0BA39C777539\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_28.Children(3).Children.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_28.Children(3).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_28.Children(3).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Not interested\"\nmsgstr \"不感兴趣\"\n\n#. Key:\tDF86F9C84CF207616E931098F3C833D3\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_18.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"To activate the locking mechanism we need an infused Lock Gem.\"\nmsgstr \"为了激活锁定机制，我们需要一个可注入的锁宝石。\"\n\n#. Key:\tE0105C1845AF9211960E869AB234ED9A\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_89.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_89.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_89.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"So you are obeying because... that's the only thing that you can do?\"\nmsgstr \"所以你服从是因为…那是你唯一能做的事?\"\n\n#. Key:\tE17598BB49D7E4083AD4AEA2DDFE293D\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_106.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_106.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_106.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"It would make sense to try to save the world, wouldn't it?\"\nmsgstr \"试图拯救世界是有意义的，不是吗?\"\n\n#. Key:\tE1CFA5A44F4EF59527528DB6018ACF33\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_8.SpeechSequence(6).SpeechSequence.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_8.SpeechSequence(6).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_8.SpeechSequence(6).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven doesn't care about what he could do. Raven cares about what he does.\"\nmsgstr \"乌鸦不在乎他能做什么。乌鸦关心他做了什么。\"\n\n#. Key:\tE6FA584E454BC3943C927EADAEBA88C4\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_6.SpeechSequence(8).SpeechSequence.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_6.SpeechSequence(8).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_6.SpeechSequence(8).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"That's not too reassuring...\"\nmsgstr \"这不是很让人安心…\"\n\n#. Key:\tE9D9EC1F450276CF11B259978062AB7E\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_96.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_96.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_96.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"We shouldn't waste any more time on this.\"\nmsgstr \"我们不应该再在这上面浪费时间了。\"\n\n#. Key:\tEC19AF0E4F2F4B488373FFBEDC272321\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_56.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_56.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_56.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Except for a few paranoid ones, like your master.\"\nmsgstr \"除了少数偏执的人，比如你的主人。\"\n\n#. Key:\tEFC8B9984D9F4A9ACC9AE580E271E810\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_39.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_39.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_39.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Searching for a way to open this gate with the help of a talking Ball is so much fun!\"\nmsgstr \"在一只会说话的球的帮助下寻找打开这扇门的方法简直太有意思了！\"\n\n#. Key:\tEFCE20A646FA62188BE7EB85D6708843\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_115.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_115.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_115.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven will venture deeper into the Ruined Realm!\"\nmsgstr \"乌鸦将冒险深入毁灭王国！\"\n\n#. Key:\tF0B00A30413914D09CA4488578B2FD7C\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_24.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_24.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_24.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven agrees.\"\nmsgstr \"乌鸦表示同意。\"\n\n#. Key:\tF40AD31D4177DCB7BB138C9C139FB1A1\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_61.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_61.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_61.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"I hope that won't be too soon...\"\nmsgstr \"我希望那不会太快……\"\n\n#. Key:\tF4F8CBCD421083EDBF626AA47DEF4B50\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_88.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_88.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_88.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Do you mean that you are serving your wizard by your own will?\"\nmsgstr \"你是说你是按照自己的意愿为你的巫师服务的吗?\"\n\n#. Key:\tF5A7836549DF56B89620A386E7CCF708\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_48.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_48.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_48.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"But there is still so much left to do...\"\nmsgstr \"但还有很多事情要做……\"\n\n#. Key:\tF8361ECC401E740DEBF87FAE2A419EC8\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_32.Children(0).Children.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_32.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_32.Children(0).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven Servant?\"\nmsgstr \"乌鸦仆人？\"\n\n#. Key:\tFA5F957341772B0C4AFA33B1311CF7B4\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_69.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_69.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_69.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Except if we meet in the Afterworld.\"\nmsgstr \"除非我们在来世相遇。\"\n\n#. Key:\tFA94A8EF4F8BF5EA422D27A9A205D866\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_3.Children(0).Children.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_3.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_3.Children(0).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven servant?\"\nmsgstr \"乌鸦仆人？\"\n\n#. Key:\tFC0798A648BFC0E9BA70D6B20A46F447\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_1.SpeechSequence(2).SpeechSequence.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_1.SpeechSequence(2).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_1.SpeechSequence(2).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Your master seeks to stop it no matter the price he has to pay.\"\nmsgstr \"你的主人不管付出多大的代价都要阻止它。\"\n\n#. Key:\tFCE7049641D2A70FC6B9E5B174919A64\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_9.SpeechSequence(0).SpeechSequence.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_9.SpeechSequence(0).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_9.SpeechSequence(0).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Tabby has retired. What did you come for?\"\nmsgstr \"泰比已经退休了。你来干什么?\"\n\n#. Key:\tFD68B18A435050A137D8F0948F24E2DC\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_12.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Why are we messing with this door if the World is about to end?\"\nmsgstr \"如果世界末日就要来了，我们为什么还要去摆弄这扇门呢？\"\n\n#. Key:\tFF3D9FCF4A840A8155A8D7AD9CC22F2D\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_5.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Obey? Raven doesn't obey.\"\nmsgstr \"服从？乌鸦不会服从。\"\n\n#. Key:\tFFB203D94B0A5C22BA29B68A1A8A740F\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_9.SpeechSequence(8).SpeechSequence.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_9.SpeechSequence(8).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_9.SpeechSequence(8).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Farewell then.\"\nmsgstr \"拜拜。\"\n\n#. Key:\t0C459FB64505D02011822A9EDFA8FCA4\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/AGStatue.AGStatue:DlgNode_Speech_4.Text\n#. /Game/SO/Dialogues/Wizard/Chapter1/AGStatue.AGStatue:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/AGStatue.AGStatue:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_AGStatue\"\nmsgid \"'We are the elite of the Runic Realm. Our wisdom is great, our magic is strong.'\"\nmsgstr \"“我们是符文王国的精英。我们的智慧是伟大的，我们的魔法是强大的。”\"\n\n#. Key:\t7DB580C64E9B33FD525DDF986BD5E4A4\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/AGStatue.AGStatue:DlgNode_Speech_6.Text\n#. /Game/SO/Dialogues/Wizard/Chapter1/AGStatue.AGStatue:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/AGStatue.AGStatue:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_AGStatue\"\nmsgid \"Looks like he was wrong...\"\nmsgstr \"看来他错了…\"\n\n#. Key:\tAFBD86084D8E6EBDF240998FA98D184D\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/AGStatue.AGStatue:DlgNode_Speech_3.Text\n#. /Game/SO/Dialogues/Wizard/Chapter1/AGStatue.AGStatue:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/AGStatue.AGStatue:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_AGStatue\"\nmsgid \"'We are Ceruleans! We do not escape!'\"\nmsgstr \"“我们是蔚蓝之城的人！我们不会逃跑！”\"\n\n#. Key:\tC2CC8EE94954A8DC42222FBB28A7656E\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/AGStatue.AGStatue:DlgNode_Speech_2.Text\n#. /Game/SO/Dialogues/Wizard/Chapter1/AGStatue.AGStatue:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/AGStatue.AGStatue:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_AGStatue\"\nmsgid \"'Citizens of Cerulean! Do not join the poor of Grey Gate!'\"\nmsgstr \"“蔚蓝城市的居民！不要加入贫穷的灰暗之门！”\"\n\n#. Key:\tD909E4A34387B448378464BDE8292B4D\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/AGStatue.AGStatue:DlgNode_Speech_5.Text\n#. /Game/SO/Dialogues/Wizard/Chapter1/AGStatue.AGStatue:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/AGStatue.AGStatue:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_AGStatue\"\nmsgid \"'Ruin can’t harm us!'\"\nmsgstr \"“毁灭无法伤害我们！”\"\n\n#. Key:\t3CE243AA4AFB12B37239608C66537764\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/BeforeBoss.BeforeBoss:DlgNode_Speech_4.Text\n#. /Game/SO/Dialogues/Wizard/Chapter1/BeforeBoss.BeforeBoss:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/BeforeBoss.BeforeBoss:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_BeforeBoss\"\nmsgid \"Maybe you should talk to the gnome or the Keeper.\"\nmsgstr \"也许你应该和矮人或守护者聊聊。\"\n\n#. Key:\t4F35F4834FBCC04C218A879123EF8706\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/BeforeBoss.BeforeBoss:DlgNode_Speech_2.Text\n#. /Game/SO/Dialogues/Wizard/Chapter1/BeforeBoss.BeforeBoss:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/BeforeBoss.BeforeBoss:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_BeforeBoss\"\nmsgid \"Using the portals here one could get into any part of the World in no time.\"\nmsgstr \"使用这里的入口，一个人可以在任何时间进入世界的任何地方。\"\n\n#. Key:\t62EDCB724DAC5317C72B99AEB9904F4E\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/BeforeBoss.BeforeBoss:DlgNode_Speech_1.Text\n#. /Game/SO/Dialogues/Wizard/Chapter1/BeforeBoss.BeforeBoss:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/BeforeBoss.BeforeBoss:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_BeforeBoss\"\nmsgid \"This place was the base of the formal Ruined Realm.\"\nmsgstr \"这个地方是正式的毁灭王国的基地。\"\n\n#. Key:\tCB8B47F74583A48529A353B97C4909B9\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/BeforeBoss.BeforeBoss:DlgNode_Speech_3.Text\n#. /Game/SO/Dialogues/Wizard/Chapter1/BeforeBoss.BeforeBoss:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/BeforeBoss.BeforeBoss:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_BeforeBoss\"\nmsgid \"I hope at least some of the portals still work.\"\nmsgstr \"我希望至少有一些入口还能正常运作。\"\n\n#. Key:\t2A9CE8714E7E1ABC9365E5A1E2CE2EC8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/BossArmourWrath.BossArmourWrath:DlgNode_Speech_5.Text\n#. /Game/SO/Dialogues/Chapter2/BossArmourWrath.BossArmourWrath:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Chapter2/BossArmourWrath.BossArmourWrath:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_BossArmourWrath\"\nmsgid \"Keep away from my artefact little thief or I will crush you!\"\nmsgstr \"小毛贼，离我的工艺品远点，不然我就揍扁你！\"\n\n#. Key:\t3F79029C410F4CC3B41548A26A7D69EB\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/BossArmourWrath.BossArmourWrath:DlgNode_Speech_4.Text\n#. /Game/SO/Dialogues/Chapter2/BossArmourWrath.BossArmourWrath:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Chapter2/BossArmourWrath.BossArmourWrath:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_BossArmourWrath\"\nmsgid \"Listen, I really need that. What if I give you something instead?\"\nmsgstr \"听着，我真的很需要那个。如果我给你点什么呢?\"\n\n#. Key:\t451F1E844E29E674899BD3BEFBC17380\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/BossArmourWrath.BossArmourWrath:DlgNode_Speech_2.Text\n#. /Game/SO/Dialogues/Chapter2/BossArmourWrath.BossArmourWrath:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter2/BossArmourWrath.BossArmourWrath:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_BossArmourWrath\"\nmsgid \"I’m here for the artefact... could you give it to me?\"\nmsgstr \"我是来拿工艺品的… 你能把它给我吗?\"\n\n#. Key:\tAC11C22040909F7F4DD1518AD5C14AFA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/BossArmourWrath.BossArmourWrath:DlgNode_Speech_3.Text\n#. /Game/SO/Dialogues/Chapter2/BossArmourWrath.BossArmourWrath:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Chapter2/BossArmourWrath.BossArmourWrath:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_BossArmourWrath\"\nmsgid \"That is mine!\"\nmsgstr \"这是我的！\"\n\n#. Key:\tD30E184A406B5B1EFB87F3845CE82664\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/BossArmourWrath.BossArmourWrath:DlgNode_Speech_1.Text\n#. /Game/SO/Dialogues/Chapter2/BossArmourWrath.BossArmourWrath:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter2/BossArmourWrath.BossArmourWrath:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_BossArmourWrath\"\nmsgid \"Have you come to worship my perfection?\"\nmsgstr \"你是来瞻仰我的完美杰作的吗？\"\n\n#. Key:\tF626219F434EECD05727BC9FAB5CEB76\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/BossArmourWrath.BossArmourWrath:DlgNode_Speech_6.Text\n#. /Game/SO/Dialogues/Chapter2/BossArmourWrath.BossArmourWrath:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Chapter2/BossArmourWrath.BossArmourWrath:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_BossArmourWrath\"\nmsgid \"Damn you and your perfection!\"\nmsgstr \"该死的你和你的完美！\"\n\n#. Key:\t2892C4AB4DACCAF48565619948DCA122\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/BossDwarvenStatue.BossDwarvenStatue:DlgNode_Speech_2.Text\n#. /Game/SO/Dialogues/Chapter2/BossDwarvenStatue.BossDwarvenStatue:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter2/BossDwarvenStatue.BossDwarvenStatue:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_BossDwarvenStatue\"\nmsgid \"I am all right! I am still keeping it back!\"\nmsgstr \"我没事！我还在进行阻止！\"\n\n#. Key:\t378D26B144B4B17F23F788B56F714118\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/BossDwarvenStatue.BossDwarvenStatue:DlgNode_Speech_3.Text\n#. /Game/SO/Dialogues/Chapter2/BossDwarvenStatue.BossDwarvenStatue:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Chapter2/BossDwarvenStatue.BossDwarvenStatue:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_BossDwarvenStatue\"\nmsgid \"I am looking for an artefact...\"\nmsgstr \"我在找一件工艺品……\"\n\n#. Key:\t3956257F405EC80CE4547FBE57C53A11\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/BossDwarvenStatue.BossDwarvenStatue:DlgNode_Speech_5.Text\n#. /Game/SO/Dialogues/Chapter2/BossDwarvenStatue.BossDwarvenStatue:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Chapter2/BossDwarvenStatue.BossDwarvenStatue:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_BossDwarvenStatue\"\nmsgid \"Do you...\"\nmsgstr \"你……\"\n\n#. Key:\t946CFCCE4CA505C7C4039A9FF196A35C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/BossDwarvenStatue.BossDwarvenStatue:DlgNode_Speech_1.Text\n#. /Game/SO/Dialogues/Chapter2/BossDwarvenStatue.BossDwarvenStatue:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter2/BossDwarvenStatue.BossDwarvenStatue:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_BossDwarvenStatue\"\nmsgid \"Have the sculptors sent you?\"\nmsgstr \"雕刻家派你来的吗?\"\n\n#. Key:\tA30FB80548251020E4AD859A928AB6B5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/BossDwarvenStatue.BossDwarvenStatue:DlgNode_Speech_6.Text\n#. /Game/SO/Dialogues/Chapter2/BossDwarvenStatue.BossDwarvenStatue:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Chapter2/BossDwarvenStatue.BossDwarvenStatue:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_BossDwarvenStatue\"\nmsgid \"Go away! I hold it back!\"\nmsgstr \"走开! 我挡住了！\"\n\n#. Key:\tAC5220964331387202C55584104246C2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/BossDwarvenStatue.BossDwarvenStatue:DlgNode_Speech_8.Text\n#. /Game/SO/Dialogues/Chapter2/BossDwarvenStatue.BossDwarvenStatue:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Chapter2/BossDwarvenStatue.BossDwarvenStatue:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_BossDwarvenStatue\"\nmsgid \"I have a bad feeling about this...\"\nmsgstr \"我有一种不好的感觉……\"\n\n#. Key:\tE05C384043C6F8407BDA2D97A1D64F96\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/BossDwarvenStatue.BossDwarvenStatue:DlgNode_Speech_7.Text\n#. /Game/SO/Dialogues/Chapter2/BossDwarvenStatue.BossDwarvenStatue:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Chapter2/BossDwarvenStatue.BossDwarvenStatue:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_BossDwarvenStatue\"\nmsgid \"He has one of the artefacts. You need to get it somehow.\"\nmsgstr \"他有一件工艺品。你需要以某种方式得到它。\"\n\n#. Key:\tF9B8F4E9413785B5F59DD88CBF8D56CC\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/BossDwarvenStatue.BossDwarvenStatue:DlgNode_Speech_4.Text\n#. /Game/SO/Dialogues/Chapter2/BossDwarvenStatue.BossDwarvenStatue:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Chapter2/BossDwarvenStatue.BossDwarvenStatue:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_BossDwarvenStatue\"\nmsgid \"Don’t come any closer! I’m still fine!\"\nmsgstr \"别再靠近了! 我还好！\"\n\n#. Key:\t49D7B5DA484C712573AE84B3A2609541\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/BossFallenDruid.BossFallenDruid:DlgNode_Speech_3.Text\n#. /Game/SO/Dialogues/Chapter2/BossFallenDruid.BossFallenDruid:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Chapter2/BossFallenDruid.BossFallenDruid:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_BossFallenDruid\"\nmsgid \"You will never lay your hand on anything in this place!\"\nmsgstr \"在这个地方，你休想染指任何东西！\"\n\n#. Key:\t9642DD9241E67544571A5EABA9EBC42B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/BossFallenDruid.BossFallenDruid:DlgNode_Speech_2.Text\n#. /Game/SO/Dialogues/Chapter2/BossFallenDruid.BossFallenDruid:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter2/BossFallenDruid.BossFallenDruid:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_BossFallenDruid\"\nmsgid \"Actually I’m about to leave but I need the artefact first.\"\nmsgstr \"事实上，我正要离开，但我首先需要的是工艺品。\"\n\n#. Key:\t9A2BE08D4010C4D2425F96BA17A60936\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/BossFallenDruid.BossFallenDruid:DlgNode_Speech_4.Text\n#. /Game/SO/Dialogues/Chapter2/BossFallenDruid.BossFallenDruid:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Chapter2/BossFallenDruid.BossFallenDruid:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_BossFallenDruid\"\nmsgid \"I shall purge my forest from your kind! To hell with you creature!\"\nmsgstr \"我要把我的森林从你的族类中清除！去你的吧！\"\n\n#. Key:\tFC4A1C9748C31BD2AA2E4F93E5D56AF8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/BossFallenDruid.BossFallenDruid:DlgNode_Speech_1.Text\n#. /Game/SO/Dialogues/Chapter2/BossFallenDruid.BossFallenDruid:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter2/BossFallenDruid.BossFallenDruid:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_BossFallenDruid\"\nmsgid \"Stay away from my sacred forests creature of Ruin!\"\nmsgstr \"离我神圣的森林远点，毁灭生物！\"\n\n#. Key:\t3F4302BF46D1F9EA241446A796CE6AA5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Fishy.C3Fishy:DlgNode_Speech_1.Text\n#. /Game/SO/Dialogues/Chapter3/C3Fishy.C3Fishy:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter3/C3Fishy.C3Fishy:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_C3Fishy\"\nmsgid \"Fishy will miss home.\"\nmsgstr \"呆鱼会想家的。\"\n\n#. Key:\t52063C724F858E16B1E9B482E064B3FC\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Fishy.C3Fishy:DlgNode_Speech_16.Text\n#. /Game/SO/Dialogues/Chapter3/C3Fishy.C3Fishy:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/Chapter3/C3Fishy.C3Fishy:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_C3Fishy\"\nmsgid \"Raven will try to take us into the Human Realm.\"\nmsgstr \"乌鸦会带我们进入人类王国。\"\n\n#. Key:\tBC79FC4E44CCD0BE44BAAAA5ED304C9D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3GateKeeper.C3GateKeeper:DlgNode_Speech_3.Text\n#. /Game/SO/Dialogues/Chapter3/C3GateKeeper.C3GateKeeper:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Chapter3/C3GateKeeper.C3GateKeeper:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_C3GateKeeper\"\nmsgid \"I hope you will find us Worthy.\"\nmsgstr \"我希望你会觉得我们是值得的。\"\n\n#. Key:\tDD8DEA6B4E1D6AABEB6B0483614A41BB\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3GateKeeper.C3GateKeeper:DlgNode_Speech_1.Text\n#. /Game/SO/Dialogues/Chapter3/C3GateKeeper.C3GateKeeper:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter3/C3GateKeeper.C3GateKeeper:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_C3GateKeeper\"\nmsgid \"Welcome, my young Lord!\"\nmsgstr \"欢迎，我的小主人!\"\n\n#. Key:\tFCC28D1C4A19B1964301B388625A722F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3GateKeeper.C3GateKeeper:DlgNode_Speech_2.Text\n#. /Game/SO/Dialogues/Chapter3/C3GateKeeper.C3GateKeeper:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter3/C3GateKeeper.C3GateKeeper:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_C3GateKeeper\"\nmsgid \"I heard this time you shall open a Gate for us.\"\nmsgstr \"我听说这次你要为我们打开一扇门。\"\n\n#. Key:\t1F96C2364594513AB8DF00A8C11ADB2C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Gnory.C3Gnory:DlgNode_Speech_4.Text\n#. /Game/SO/Dialogues/Chapter3/C3Gnory.C3Gnory:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Chapter3/C3Gnory.C3Gnory:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_C3Gnory\"\nmsgid \"I don’t want anything bad for business in the new Realm.\"\nmsgstr \"我不想让新王国的生意遇到任何糟糕的情况。\"\n\n#. Key:\t24FA4B6840C3EEF0A9D418AED7C900A5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Gnory.C3Gnory:DlgNode_Speech_13.Text\n#. /Game/SO/Dialogues/Chapter3/C3Gnory.C3Gnory:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/Chapter3/C3Gnory.C3Gnory:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_C3Gnory\"\nmsgid \"Eh, you again?\"\nmsgstr \"呃，又是你？\"\n\n#. Key:\t5CA8478D46ED1ADF6F0B5E82F1035ADE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Gnory.C3Gnory:DlgNode_Speech_2.Text\n#. /Game/SO/Dialogues/Chapter3/C3Gnory.C3Gnory:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter3/C3Gnory.C3Gnory:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_C3Gnory\"\nmsgid \"A whole new World awaits for me and my shop.\"\nmsgstr \"一个全新的世界正等着我和我的商店。\"\n\n#. Key:\tA406AFAD47000D9338C978B2EB16A86F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Gnory.C3Gnory:DlgNode_Speech_3.Text\n#. /Game/SO/Dialogues/Chapter3/C3Gnory.C3Gnory:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Chapter3/C3Gnory.C3Gnory:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_C3Gnory\"\nmsgid \"If you can arrange it I would be more happy if we could leave Lory here.\"\nmsgstr \"如果你能安排一下，我们把劳里留在这里我会更高兴。\"\n\n#. Key:\tBA4D0C244931E6431FA17CA2257BDDE1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Gnory.C3Gnory:DlgNode_Speech_1.Text\n#. /Game/SO/Dialogues/Chapter3/C3Gnory.C3Gnory:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter3/C3Gnory.C3Gnory:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_C3Gnory\"\nmsgid \"What a new opportunity! I don’t care about dwarves anymore.\"\nmsgstr \"一个全新的机会！我不再在乎矮人了。\"\n\n#. Key:\t071AC5EE4AC65F5BE3CB61B64DE9E7FE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3GolemMaker.C3GolemMaker:DlgNode_Speech_2.Text\n#. /Game/SO/Dialogues/Chapter3/C3GolemMaker.C3GolemMaker:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter3/C3GolemMaker.C3GolemMaker:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_C3GolemMaker\"\nmsgid \"I have to admit Ruin will win in the end.\"\nmsgstr \"我不得不承认毁灭最终会取得胜利。\"\n\n#. Key:\t18398E3A4C6E72AAE25F24A14596ECD8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3GolemMaker.C3GolemMaker:DlgNode_Speech_1.Text\n#. /Game/SO/Dialogues/Chapter3/C3GolemMaker.C3GolemMaker:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter3/C3GolemMaker.C3GolemMaker:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_C3GolemMaker\"\nmsgid \"I fought Ruin for hundreds of years.\"\nmsgstr \"我与毁灭战斗了几百年。\"\n\n#. Key:\t7800D3B64054BCE4A89E8E8E6265776B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3GolemMaker.C3GolemMaker:DlgNode_Speech_117.Text\n#. /Game/SO/Dialogues/Chapter3/C3GolemMaker.C3GolemMaker:DlgNode_Speech_117.Text\n#: /Game/SO/Dialogues/Chapter3/C3GolemMaker.C3GolemMaker:DlgNode_Speech_117.Text\nmsgctxt \"Dialogue_C3GolemMaker\"\nmsgid \"I have a bad feeling about this all...\"\nmsgstr \"我对这一切有一种不好的感觉……\"\n\n#. Key:\t334B64FA460A74FD99B4F3B9E4BE9E5A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3KoboldChef.C3KoboldChef:DlgNode_Speech_2.Text\n#. /Game/SO/Dialogues/Chapter3/C3KoboldChef.C3KoboldChef:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter3/C3KoboldChef.C3KoboldChef:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_C3KoboldChef\"\nmsgid \"So it will be ready anytime now.\"\nmsgstr \"所以现在随时都可以。\"\n\n#. Key:\t5B8874F14160F55182A93EBCF5680173\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3KoboldChef.C3KoboldChef:DlgNode_Speech_1.Text\n#. /Game/SO/Dialogues/Chapter3/C3KoboldChef.C3KoboldChef:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter3/C3KoboldChef.C3KoboldChef:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_C3KoboldChef\"\nmsgid \"According to the recipe I need to swirl the ingredients until the end of the World.\"\nmsgstr \"根据食谱，我需要摆弄配料直到世界末日。\"\n\n#. Key:\t7DB6ED344E211B7A028C27BFB72750B1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3KoboldChef.C3KoboldChef:DlgNode_Speech_33.Text\n#. /Game/SO/Dialogues/Chapter3/C3KoboldChef.C3KoboldChef:DlgNode_Speech_33.Text\n#: /Game/SO/Dialogues/Chapter3/C3KoboldChef.C3KoboldChef:DlgNode_Speech_33.Text\nmsgctxt \"Dialogue_C3KoboldChef\"\nmsgid \"This is a special soup.\"\nmsgstr \"这是一道特别的汤。\"\n\n#. Key:\t7D583DB14783DCF7EEE294920F9A1D61\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Lory.C3Lory:DlgNode_Speech_3.Text\n#. /Game/SO/Dialogues/Chapter3/C3Lory.C3Lory:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Chapter3/C3Lory.C3Lory:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_C3Lory\"\nmsgid \"Without paying a single gold coin. How sad.\"\nmsgstr \"一枚金币都付不出来。简直悲剧。\"\n\n#. Key:\t8A26C9B24B810A94FED159B0D69D70D6\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Lory.C3Lory:DlgNode_Speech_1.Text\n#. /Game/SO/Dialogues/Chapter3/C3Lory.C3Lory:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter3/C3Lory.C3Lory:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_C3Lory\"\nmsgid \"Hi, my dear Ball!\"\nmsgstr \"嗨，我亲爱的球！\"\n\n#. Key:\t8CF637DC4D66B9BFBE098DA3EA434F27\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Lory.C3Lory:DlgNode_Speech_9.Text\n#. /Game/SO/Dialogues/Chapter3/C3Lory.C3Lory:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/Chapter3/C3Lory.C3Lory:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_C3Lory\"\nmsgid \"Unfortunately I can't give you anything in return.\"\nmsgstr \"很遗憾，我无法给你任何回报。\"\n\n#. Key:\t90A13FAC4AA90E98DBEFFA9BB8DEDE80\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Lory.C3Lory:DlgNode_Speech_7.Text\n#. /Game/SO/Dialogues/Chapter3/C3Lory.C3Lory:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Chapter3/C3Lory.C3Lory:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_C3Lory\"\nmsgid \"Oh, thank you! Books always matter.\"\nmsgstr \"噢, 谢谢你！书一直至关重要。\"\n\n#. Key:\t9C6E843645F86F1E39E6458952C7F283\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Lory.C3Lory:DlgNode_Speech_4.Text\n#. /Game/SO/Dialogues/Chapter3/C3Lory.C3Lory:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Chapter3/C3Lory.C3Lory:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_C3Lory\"\nmsgid \"I hope I can open a new shop in the Human Realm.\"\nmsgstr \"我希望我能在人类王国开一家新商店。\"\n\n#. Key:\tAE354F2C458C144C2825028174F91CCE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Lory.C3Lory:DlgNode_Speech_5.Text\n#. /Game/SO/Dialogues/Chapter3/C3Lory.C3Lory:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Chapter3/C3Lory.C3Lory:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_C3Lory\"\nmsgid \"I don't know if it still matters but I have these books for you.\"\nmsgstr \"我不知道这是否重要，但我有一些书给你。\"\n\n#. Key:\tB5BCB95E43DB3854273F6AAA4067FC55\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Lory.C3Lory:DlgNode_Speech_42.Text\n#. /Game/SO/Dialogues/Chapter3/C3Lory.C3Lory:DlgNode_Speech_42.Text\n#: /Game/SO/Dialogues/Chapter3/C3Lory.C3Lory:DlgNode_Speech_42.Text\nmsgctxt \"Dialogue_C3Lory\"\nmsgid \"Unfortunately I have nothing at the store right now. Ha-ha...\"\nmsgstr \"不幸的是，我现在店里没有东西。哈哈…\"\n\n#. Key:\tC0E84ACD40CB002E0C30A289E0554EE9\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Lory.C3Lory:DlgNode_Speech_10.Text\n#. /Game/SO/Dialogues/Chapter3/C3Lory.C3Lory:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/Chapter3/C3Lory.C3Lory:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_C3Lory\"\nmsgid \"No problem.\"\nmsgstr \"没问题。\"\n\n#. Key:\tFEFF93C84CC75D277EC221AD22338A75\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Lory.C3Lory:DlgNode_Speech_2.Text\n#. /Game/SO/Dialogues/Chapter3/C3Lory.C3Lory:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter3/C3Lory.C3Lory:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_C3Lory\"\nmsgid \"Ruin took all my wares.\"\nmsgstr \"毁灭拿走了我全部的商品。\"\n\n#. Key:\t090F12534A0096B8D4D7D9A5CDC9B3B5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_25.Text\n#. /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_25.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_25.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Well I guess you don’t have many customer.\"\nmsgstr \"我想你的顾客不多吧。\"\n\n#. Key:\t10A1CF314EC02954FF38F1989C61DEE9\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_14.Text\n#. /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"That’s only one man! I need three!\"\nmsgstr \"那只是一个人！我需要三个！\"\n\n#. Key:\t127DE2E049C91112F814C69348954F99\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_7.Children(1).Children.Text\n#. /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_7.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_7.Children(1).Children.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Buy name\"\nmsgstr \"购买名字\"\n\n#. Key:\t1AF2DDE74542524EEF19CA9567CFBDAF\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_58.Text\n#. /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_58.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_58.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"{name}? It still sounds a bit weird, but I think I might like it.\"\nmsgstr \"{name}? 听起来还是有点怪，但我想我可能会喜欢。\"\n\n#. Key:\t1C411E31405F157B2465229ECE66F4E0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_31.Children(2).Children.Text\n#. /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_31.Children(2).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_31.Children(2).Children.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Wanderer\"\nmsgstr \"流浪者\"\n\n#. Key:\t1ED747BD43E40D4096809696951517EE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_20.Text\n#. /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"A special offer for ya! Give me three Blue Gems and I’ll give ya the key!\"\nmsgstr \"给你一份特别优惠！给我三颗蓝宝石，我就给你一把钥匙！\"\n\n#. Key:\t20B146B94D2E2FCE5E0C48BC64F7A1D6\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_19.Text\n#. Key:\t41E21D044B53E16C1BA8D7B720D84B50\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_36.Text\n#. /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_19.Text\n#. /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_36.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_36.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Sure man!\"\nmsgstr \"一言为定！\"\n\n#. Key:\t2BDF52EF43CA5FBB145EC1BA0014FC27\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_7.Children(3).Children.Text\n#. /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_7.Children(3).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_7.Children(3).Children.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Who are you?\"\nmsgstr \"你是哪位？\"\n\n#. Key:\t2DF772F14AAA9780F4D9E397DE723665\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_32.Text\n#. /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_32.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_32.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Fearsome! At least for what you will destroy.\"\nmsgstr \"可怕！至少是为了你要摧毁的东西。\"\n\n#. Key:\t312F26294ECE4F618D88BE84DE7A2F9A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_31.Children(1).Children.Text\n#. /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_31.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_31.Children(1).Children.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Destroyer\"\nmsgstr \"毁灭者\"\n\n#. Key:\t328C9911427AA19B40B297ACC9D16447\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_31.Children(3).Children.Text\n#. /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_31.Children(3).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_31.Children(3).Children.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Don't buy\"\nmsgstr \"不购买\"\n\n#. Key:\t32D3F53746DD2801BC1B04AF1C1753DD\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_2.Text\n#. /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Don’t turn around I’m talking to ya big guy! Down here on the wood!\"\nmsgstr \"别回头，我在跟你说话，大个子！到下面的树林里来!\"\n\n#. Key:\t576A3CE049331518C8D1F196E6CC382C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_28.Text\n#. /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Back on topic: will ya buy something?\"\nmsgstr \"回到话题: 你会买东西吗?\"\n\n#. Key:\t5C1E07DF4B2D135102D6B09D3A04A726\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_5.Text\n#. /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"C’mon man! Don’t just stand there tell me what ya want!\"\nmsgstr \"来吧人类！不要只是站在那里，告诉我你想要什么!\"\n\n#. Key:\t62AA5DD54A8447F7A277B194B05FB74D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_23.Text\n#. /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_23.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_23.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"What’s wrong with ya man?\"\nmsgstr \"你怎么了，伙计?\"\n\n#. Key:\t6E13F5544C66EDB0CFE764A0F52269E1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_27.Text\n#. /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_27.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_27.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"You know transporting breadcrumbs, marching onto various directions, the usual things.\"\nmsgstr \"你知道，运送面包屑，向各个方向行进，这些日常的事情。\"\n\n#. Key:\t6F3C17894E694FC6215871B167087908\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_24.Text\n#. /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_24.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_24.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"I’m Merch Ant doin’ Microtransactions. I’ve just told ya.\"\nmsgstr \"我蚂蚁商人，我在做微交易。我已经告诉过你了。\"\n\n#. Key:\t7169B2FA40F5F5F328D2A6B9D53D58C8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_7.Children(0).Children.Text\n#. /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_7.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_7.Children(0).Children.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Trade\"\nmsgstr \"交易\"\n\n#. Key:\t7B41C105431C54F2FDDEA6AA9A0E1C1A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_10.Text\n#. /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Er... so who are you and what are you doing here?\"\nmsgstr \"呃…  你是谁，你在这里做什么?\"\n\n#. Key:\t8718A8F54D5722F666D83F8067476622\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_9.Text\n#. /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"There is an iron door which blocks the path to the tower. Do you have something which opens it?\"\nmsgstr \"有一扇铁门挡住了通往塔的路。你有什么东西可以打开它吗?\"\n\n#. Key:\t889B39EC4BC170A2BF493380947116A7\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_22.Text\n#. /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Sure man! Microtransactions always work!\"\nmsgstr \"当然！微交易总是可行的!\"\n\n#. Key:\t9157AE9644A4A3B2C97F7482932160D2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_15.Text\n#. /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"No man, we agreed on three!\"\nmsgstr \"不，我们说好了三个!\"\n\n#. Key:\t9283F6B1447C6992FE355289F3337472\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_7.Children(2).Children.Text\n#. /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_7.Children(2).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_7.Children(2).Children.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Gate\"\nmsgstr \"门\"\n\n#. Key:\t99C44AA849A384C7941D3DAE1D6A3EFF\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_13.Text\n#. /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Here is your Gem!\"\nmsgstr \"这是你的宝石！\"\n\n#. Key:\t9CA7941F42ABFAE5660895AF886CD62C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_31.Text\n#. /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_31.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_31.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Sure man! I have some really cool ones for sale!\"\nmsgstr \"当然！我有一些很酷的东西要卖！\"\n\n#. Key:\tA3C6B03E404B1C039EF1C98C8E28AE22\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_8.Text\n#. /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Show me what you've got for sale!\"\nmsgstr \"让我看看你有什么好卖的!\"\n\n#. Key:\tABE279924E0641DA18E9708F35F4500A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_29.Text\n#. /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_29.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_29.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"I’ve got to go.\"\nmsgstr \"我得走了。\"\n\n#. Key:\tAF1FECDB402777D850B819B934DF851D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_34.Text\n#. /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_34.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_34.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Ah, never mind, here you go!\"\nmsgstr \"啊，没关系，给你！\"\n\n#. Key:\tB19FA067432CE0273A3652AA9A32F2DF\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_18.Text\n#. /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Don’t be surprised!\"\nmsgstr \"不要惊讶！\"\n\n#. Key:\tB5F8E17E4712A37EF1C227AA7E99DBC8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_12.Text\n#. /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Aren’t two Gems enough for you?\"\nmsgstr \"对你来说两个宝石还不够吗?\"\n\n#. Key:\tBC5DEE9E4D39238451D1A2B9F8B20815\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_26.Text\n#. /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_26.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_26.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Okey, okey! I have to admit I also do some regular ant work from time to time.\"\nmsgstr \"好，好！我不得不承认我有时也做一些寻常工作。\"\n\n#. Key:\tBD7096344553E098E4A29787E1386B4A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_21.Text\n#. /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Are you sure the key works?\"\nmsgstr \"你确定钥匙能用吗？\"\n\n#. Key:\tC6A384624B53D808D62CB885A6573150\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_17.Text\n#. /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Was nice to deal with ya!\"\nmsgstr \"很高兴和你打交道！\"\n\n#. Key:\tC737154043396F726CF6B2814991B38D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_35.Text\n#. /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_35.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_35.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"I've changed my mind. I'm fine with my current name.\"\nmsgstr \"我改变主意了。我对我现在的名字很满意。\"\n\n#. Key:\tC94F33504E68364DE1BAA48FC0CA85E5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_7.Children(5).Children.Text\n#. /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_7.Children(5).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_7.Children(5).Children.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Leave\"\nmsgstr \"离开\"\n\n#. Key:\tCDA5A0164F5FDD87D0F4C0B10A5ED5DA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_11.Text\n#. /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"I did my part. Give me the key!\"\nmsgstr \"我尽了我的本分，把钥匙给我！\"\n\n#. Key:\tD1B1D33742EAA6A9BCDC42B5EA72EB59\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_31.Children(0).Children.Text\n#. /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_31.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_31.Children(0).Children.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Saviour\"\nmsgstr \"救世主\"\n\n#. Key:\tD1E444764EDA1457DD7427A0EA75C65F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_7.Children(4).Children.Text\n#. /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_7.Children(4).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_7.Children(4).Children.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Blue Gem\"\nmsgstr \"蓝宝石\"\n\n#. Key:\tD65AD8854E1A5BC2D37C208357BACDE3\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_4.Text\n#. /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Due to my size!\"\nmsgstr \"因为我的码子太大！\"\n\n#. Key:\tDDEB5C4B4A180E85B1D711815B4D32F3\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_6.Text\n#. /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Can I buy a name from you?\"\nmsgstr \"我能从你这里买个名字吗?\"\n\n#. Key:\tDE3F40384473EC97950CDDB43AFE439E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_16.Text\n#. /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Easy man! Here ya go!\"\nmsgstr \"放轻松！干得好！\"\n\n#. Key:\tDEED1AF94E4BC154ED98A8B951AF0673\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_7.Text\n#. /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Hey again!\"\nmsgstr \"嘿！\"\n\n#. Key:\tE2C88DA74DA8B5935E15CC9FD337C307\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_39.Text\n#. /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_39.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_39.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Come on man! You can't just wander around!\"\nmsgstr \"来吧！你不能只是到处闲逛！\"\n\n#. Key:\tEA08DE334C7D8631989D159FB841367D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_30.Text\n#. /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_30.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_30.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"See ya man!\"\nmsgstr \"回头见！\"\n\n#. Key:\tEAB8C1DE4B07AD7EAF0A4B819E4522C6\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_1.Text\n#. /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Hey there!\"\nmsgstr \"嘿!\"\n\n#. Key:\tF780C72E4DDD9D9189C900836D4F7DBD\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_3.Text\n#. /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"I’m Merch Ant, I deal with microtransactions.\"\nmsgstr \"我是蚂蚁商人，我进行微交易。\"\n\n#. Key:\tFED676B745409B7095EBB2994E581817\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_57.Text\n#. /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_57.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_57.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"That's cool man. Though I wonder who will you save?\"\nmsgstr \"那很酷，我想知道你会拯救谁？\"\n\n#. Key:\t04F1EF4B4AFDE5759A25A1A4922E9EA8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_28.Text\n#. /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"Yet they could do nothing.\"\nmsgstr \"然而他们什么也不能做。\"\n\n#. Key:\t05E7A2224316FEED1A2CEB8AEFC46B41\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_6.Text\n#. /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"We can’t let everyone die here.\"\nmsgstr \"我们不能让所有人都死在这里。\"\n\n#. Key:\t078A48C347E2B23E79C495BA42BC7B6D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_25.Text\n#. /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_25.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_25.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"We’ll have time to find a cure.\"\nmsgstr \"我们有时间找到治愈方法。\"\n\n#. Key:\t0A857169478EC6929EFCA3B390C394DA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_20.Text\n#. /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"Prepare for your last travel in the Ruined Realm. Head to the north from where the wind is blowing!\"\nmsgstr \"准备好你最后一次在毁灭王国的旅行。从有风的地方朝北走!\"\n\n#. Key:\t1D8B6C81428A6D9F4C29AE9AD26206F2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_29.Children(1).Children.Text\n#. /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_29.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_29.Children(1).Children.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"Can't leave them\"\nmsgstr \"不能把它们留下\"\n\n#. Key:\t217F39F14762862B6EA18484EA74E987\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_37.Text\n#. /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_37.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_37.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"I wish you better luck this time!\"\nmsgstr \"祝你这次好运！\"\n\n#. Key:\t22E17F2F4CFDD0CEB67AB0A91D872B3F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_4.Children(2).Children.Text\n#. /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_4.Children(2).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_4.Children(2).Children.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"Not my problem\"\nmsgstr \"不是我的问题\"\n\n#. Key:\t2685CE674BB3B11FD3CB3AA2460CE60A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_8.Text\n#. /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"There is nothing we can do for this World.\"\nmsgstr \"我们对这个世界无能为力。\"\n\n#. Key:\t26A2075F407FF43E1AF8B6B38E9C4AEE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_13.Text\n#. /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"Farewell!\"\nmsgstr \"告辞！\"\n\n#. Key:\t2F7D7C46418E8E049493839A26DBB10E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_15.Text\n#. /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"I’m ready to sacrifice myself but I feel sorrow for this world.\"\nmsgstr \"我准备牺牲自己，但我为这个世界感到悲伤。\"\n\n#. Key:\t39172C7641A5973A4B5D8480EBDD2589\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_34.Text\n#. /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_34.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_34.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"Back already?\"\nmsgstr \"已经回来了？\"\n\n#. Key:\t3D21436E48DA0DF9C3ACA3B11001B17C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_17.Text\n#. /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"Yet, we need to save those we can.\"\nmsgstr \"然而，我们需要拯救那些我们可以拯救的人。\"\n\n#. Key:\t43B780AA4934FBE35679BFB3C1C92D56\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_21.Text\n#. /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"Farewell Wanderer!\"\nmsgstr \"再见流浪者！\"\n\n#. Key:\t4AD4171F4A1832148034BAA736FC587E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_12.Text\n#. /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"Head to the north from where the wind is blowing!\"\nmsgstr \"从有风的地方朝北走！\"\n\n#. Key:\t4E65707F497B4B35E873138DDBF7B879\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_9.Text\n#. /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"I will go home and you will solve your problems on your own.\"\nmsgstr \"我要回家了，你需要靠自己解决问题。\"\n\n#. Key:\t4EDA1AEF471537F758DD0491A7140073\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_7.Text\n#. /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"This is none of my business.\"\nmsgstr \"这不关我的事。\"\n\n#. Key:\t58246AA446D982E55E53EAB34FFF6A81\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_34.Children(1).Children.Text\n#. /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_34.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_34.Children(1).Children.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"Leave\"\nmsgstr \"离开\"\n\n#. Key:\t67CB3C99468EEA39C4C18C8B0C28AFEA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_26.Text\n#. /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_26.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_26.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"You? You mean the Wizard Council?\"\nmsgstr \"你？你是说巫师协会？\"\n\n#. Key:\t743DD4C048F8CD08A49805975183B54D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_10.Text\n#. /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"I’m sorry it ends like this, Wanderer.\"\nmsgstr \"很抱歉就这样结束了，流浪者。\"\n\n#. Key:\t7AB88DE549E213B71759699AD51CFD4C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_14.Text\n#. /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"I’m really proud of you little spirit. This wasn’t an easy decision for me either.\"\nmsgstr \"我真为你骄傲。这对我来说也不是一个容易的决定。\"\n\n#. Key:\t7DCF30E74F8C0F29DA4E668CE3435E89\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_3.Text\n#. /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"Wizard can’t hear us here, we can talk freely.\"\nmsgstr \"巫师在这里听不到我们说话，我们可以自由交谈。\"\n\n#. Key:\t8177A07D41AE7778BB4839AED3FEDACF\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_23.Text\n#. /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_23.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_23.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"Do you know what you are risking?\"\nmsgstr \"你知道你在冒什么险吗?\"\n\n#. Key:\t876B4752465406828E27A88C282EA5CD\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_19.Text\n#. /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"From here I can teleport you close to the place where the Wizard will be able to get you out.\"\nmsgstr \"从这里，我可以传送你到附近的地方，那里的巫师将能够把你救出来。\"\n\n#. Key:\t9255CAD841A0C5B4DF3F4D8C5F5516B1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_16.Text\n#. /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"So many great things will perish. So many...\"\nmsgstr \"这么多伟大的东西都将毁付之一炬。这么多……\"\n\n#. Key:\t95EDE8FB4CEC490381EBD990C7277009\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_38.Text\n#. /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_38.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_38.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"Take your time!\"\nmsgstr \"慢慢来！\"\n\n#. Key:\t9D46888D43C665A29506BF9CBB62F81D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_35.Text\n#. /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_35.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_35.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"Let me try again!\"\nmsgstr \"让我试一次！\"\n\n#. Key:\tA1CF649542AAE3D8945327B9502E2E78\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_29.Text\n#. /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_29.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_29.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"What chance do the humans have?\"\nmsgstr \"人类有什么机会?\"\n\n#. Key:\tA60B94F64A0D02EA0DA9419741ED84F4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_36.Text\n#. /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_36.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_36.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"I just need some rest.\"\nmsgstr \"我只是需要休息。\"\n\n#. Key:\tA651056C4D344D685FEB53B2C3795966\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_34.Children(0).Children.Text\n#. /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_34.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_34.Children(0).Children.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"Retry\"\nmsgstr \"重试\"\n\n#. Key:\tAAE7046349DBE5359097179A42FDA255\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_33.Text\n#. /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_33.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_33.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"This one was enough.\"\nmsgstr \"这一个就够了。\"\n\n#. Key:\tB17D67194997EFAEF6B8678DB05894FD\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_22.Text\n#. /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"Let’s get them out first and face Ruin after.\"\nmsgstr \"让我们先把他们救出来，然后再面对毁灭。\"\n\n#. Key:\tB4E31022471B52056F7B5AA3BB322700\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_18.Text\n#. /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"How can I get to the Wizard’s tower?\"\nmsgstr \"我怎么去巫师塔?\"\n\n#. Key:\tB6C99FC54E2A347994473EBF52B57EBD\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_4.Children(1).Children.Text\n#. /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_4.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_4.Children(1).Children.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"Raven’s plan\"\nmsgstr \"乌鸦的计划\"\n\n#. Key:\tB985955E4FC6D81FBD38D79ADE68BF1F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_4.Children(0).Children.Text\n#. /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_4.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_4.Children(0).Children.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"Separate Worlds\"\nmsgstr \"分离的世界\"\n\n#. Key:\tC4BABAED4C790EDDF6AAF7A0D4CFA79B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_27.Text\n#. /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_27.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_27.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"When Ruin started in the Runic Realm they had hundreds of Scientists who studied the force which made Ruin.\"\nmsgstr \"当毁灭在符文王国开始行动时，他们有数百名科学家在研究毁灭的力量。\"\n\n#. Key:\tCB779F524992B29781C4778ED6E224A7\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_30.Text\n#. /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_30.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_30.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"I just can’t leave them to die here...\"\nmsgstr \"我不能让他们死在这里……\"\n\n#. Key:\tCDA7A09249E96A52B2FA3CA471D6C4B3\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_2.Text\n#. /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"This is the end of the path where we last meet.\"\nmsgstr \"这是我们最后一次见面的地方。\"\n\n#. Key:\tCF238FAA4941848AF7071A866B75B6EC\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_5.Text\n#. /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"You are right. The only way to stop Ruin is to lock the Ruined Realm forever.\"\nmsgstr \"你说得对。阻止毁灭的唯一方法就是永远锁住毁灭王国。\"\n\n#. Key:\tD1F3B7324351B25E8C55679BAC3BF1E0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_4.Text\n#. /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"Have you made your decision?\"\nmsgstr \"你决定了吗?\"\n\n#. Key:\tE164446B4944B4CAC8E5C1BF82A722A2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_24.Text\n#. /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_24.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_24.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"If you bring infected people into the Human Realm Ruin will consume them.\"\nmsgstr \"如果你把受感染的人带入人类世界，毁灭就会吞噬他们。\"\n\n#. Key:\tE39531DE4350D6D86DF469839F1906E7\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_31.Text\n#. /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_31.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_31.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"It’s your decision, Wanderer. I understand.\"\nmsgstr \"这是你的决定，流浪者。我明白了。\"\n\n#. Key:\tE46912D04BE67D3E2B0794BB632AEE98\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_32.Text\n#. /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_32.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_32.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"I’ll stay here. I won’t be able to watch another World dying...\"\nmsgstr \"我将留在这里。我不能再眼睁睁看着另一个世界灭亡……\"\n\n#. Key:\tF70B765F44DB17E1C6978D9D8652C911\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_1.Text\n#. /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"Hello, little Wanderer!\"\nmsgstr \"你好, 小流浪者！\"\n\n#. Key:\tFE709EDF4482B6FA7408DE99D95E8577\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_29.Children(0).Children.Text\n#. /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_29.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_29.Children(0).Children.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"You are right\"\nmsgstr \"你是对的\"\n\n#. Key:\tFE77F7964851F202F5C91396A4C7228E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_11.Text\n#. /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"I’ll take you to the place where you can leave this Realm.\"\nmsgstr \"我带你去可以离开这个王国的地方。\"\n\n#. Key:\t0B886754483D1C215FBEF5B7D19AF6A6\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_4.Text\n#. /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"I know you have summoned a Spirit of the Unknown world. You were a fool to think you can get away with this.\"\nmsgstr \"我知道你召唤了一个无名幽魂。你以为你能侥幸逃脱，真是太傻了。\"\n\n#. Key:\t0BDF59D34A9E53B7FD5FD18F8E46F72F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_22.Text\n#. /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"Argh! All right, here you go...\"\nmsgstr \"啊！好的，给你……\"\n\n#. Key:\t2A6837CA471604FCDD180E85BD23D676\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_16.Text\n#. /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"Krrr... Raven gives you magic which will make you fly like a Raven.\"\nmsgstr \"呃……乌鸦给你魔法，让你像乌鸦一样飞翔。\"\n\n#. Key:\t2D8209F74AC3C9E042717A9FB108C051\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_20.Text\n#. /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"Come on, go and try it!\"\nmsgstr \"来吧，去试试!\"\n\n#. Key:\t39B1763740E9BB9B495A7997920A3401\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_12.Children(0).Children.Text\n#. /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_12.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_12.Children(0).Children.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"How?\"\nmsgstr \"怎么做？\"\n\n#. Key:\t3AE553D14FFB88C0518679B86691D508\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_2.Text\n#. /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"Call your master little spirit, I have words with him.\"\nmsgstr \"小精灵，呼叫你的主人，我有话和他说。\"\n\n#. Key:\t3E02111D40F21C2C8C13F08729B4CDBC\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_5.Text\n#. /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"I don’t know about any rule forbidding that...\"\nmsgstr \"我不知道有什么规定禁止……\"\n\n#. Key:\t453610F144D8CEB42138F0BB35B9692A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_8.Text\n#. /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"Wait Scholar! Please give me a few more days!\"\nmsgstr \"等等，斯考拉! 请再给我几天时间!\"\n\n#. Key:\t4F0C40114C4DD1B345CF909E94F99D60\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_14.Text\n#. /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"Why should I ask that?\"\nmsgstr \"我为什么要问这个?\"\n\n#. Key:\t56F0D93740AB7555FF9370879D774842\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_7.Text\n#. /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"I have no doubt how the Council will react.\"\nmsgstr \"我毫不怀疑协会将如何作出反应。\"\n\n#. Key:\t60D3A9DA420ECD7DBF490BA233EA5C61\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_21.Text\n#. /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"Because you would love to know how you can get out of here.\"\nmsgstr \"因为你很想知道怎样才能离开这里。\"\n\n#. Key:\t6125A956446F64BD91E1F5A282AC146D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_9.Text\n#. /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"Don’t worry! I know your daughter is trapped in the Unknown and my research confirms there is a chance you can bring her back.\\r\\nI’ll help you bring the missing artefacts back.\"\nmsgstr \"别担心! 我知道你的女儿被困在未知之中，我的研究证实你有机会把她带回来。\\r\\n我会帮你把丢失的工艺品找回来。\"\n\n#. Key:\t6B7478444FBC694480D442BB90F70B27\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_3.Text\n#. /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"What do you want?\"\nmsgstr \"你想怎么样\"\n\n#. Key:\t72D7F64D4051F9BF362B9B97FD30DB65\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_12.Children(2).Children.Text\n#. Key:\tF62125FB48F982D2A3D4FE9621810F64\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_15.Text\n#. /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_12.Children(2).Children.Text\n#. /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_12.Children(2).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"What?\"\nmsgstr \"什么？\"\n\n#. Key:\t810BD4154FA6BC7F857F9CB14EDC6A1D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_19.Text\n#. /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"Er... thanks!\"\nmsgstr \"呃... 谢谢！\"\n\n#. Key:\t8F439E124100E004BCCD4AA04F17CB3F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_13.Text\n#. /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"How will we get out of here?\"\nmsgstr \"我们怎么出去?\"\n\n#. Key:\t9D31A0084CBBA499BA4E3BADB42E6E36\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_6.Text\n#. /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"Rule? What rule should be needed for something which was thought to be impossible?\"\nmsgstr \"规则? 对于被认为是不可能的事情，应该用什么规则呢?\"\n\n#. Key:\t9F52551E46588D4F12CD7C8B63701FDE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_12.Children(1).Children.Text\n#. /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_12.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_12.Children(1).Children.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"Why?\"\nmsgstr \"为什么?\"\n\n#. Key:\tAAC96E3C4D4D303C9E692390612A7215\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_12.Text\n#. /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"Ask how we will get out of here!\"\nmsgstr \"问问我们怎么出去!\"\n\n#. Key:\tC0808C6545D02F43CB37A2AFB79EEC1F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_17.Text\n#. /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"Actually it’s not that good but still better than nothing.\"\nmsgstr \"其实没有那么好，但有胜于无。\"\n\n#. Key:\tC19759F44A5A2AE21A04EBAF2A47E2D3\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_18.Text\n#. /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"Take this!\"\nmsgstr \"拿着这个！\"\n\n#. Key:\tC8CEB3844A6C958FF42C74AA81D4A90F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_1.Text\n#. /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"Finally, Raven found you!\"\nmsgstr \"乌鸦，终于找到你了!\"\n\n#. Key:\tCF6DEF4D4F6F664CF24435AF248CE452\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_10.Text\n#. /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"Raven and his fellow Ball on a quest again!\"\nmsgstr \"乌鸦和他的球球小伙伴再一次开始探索！\"\n\n#. Key:\tE52C31F241BCD21378696EB8761C0654\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_11.Text\n#. /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"Let the masters talk in private and discuss how we will get out of here!\"\nmsgstr \"让主人们私下谈谈，讨论一下我们怎么出去！\"\n\n#. Key:\t00ED8B314FC2DA3901823F92635D41D1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_26.Children(0).Children.Text\n#. /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_26.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_26.Children(0).Children.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"You’ll be all dead\"\nmsgstr \"你们都会死的\"\n\n#. Key:\t23BA5AA446B44D107B9F3994ADDE1C43\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_22.Children(1).Children.Text\n#. /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_22.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_22.Children(1).Children.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Save them!\"\nmsgstr \"救救他们！\"\n\n#. Key:\t42395E7B4B735458E30557B9544073E3\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_8.Children(1).Children.Text\n#. /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_8.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_8.Children(1).Children.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Leave\"\nmsgstr \"离开\"\n\n#. Key:\t43A5BAA8417D3291E502AD9500873B9E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_12.Text\n#. /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Rumours have been spread of Ruin and the people are scared. They demand the Wizard Council to separate the Human Realm from the Ruined Realm.\"\nmsgstr \"谣言四起，人们都害怕了。他们要求巫师协会将人类王国与毁灭王国分开。\"\n\n#. Key:\t4FAAEE6240849C416541EDA8AB8083C8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_30.Text\n#. /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_30.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_30.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Good luck, Raven!\"\nmsgstr \"祝好运，乌鸦！\"\n\n#. Key:\t559673484F3C66AADE37E787BA35824A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_33.Text\n#. /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_33.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_33.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Only a fool would bring Ruin to his own World.\"\nmsgstr \"只有傻瓜才会给自己的世界带来毁灭。\"\n\n#. Key:\t568124F448BE3AF41123A0B7BB158A53\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_1.Text\n#. /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Krrrr! Raven and you make a really good team.\"\nmsgstr \"你和乌鸦搭配默契。\"\n\n#. Key:\t5853B8654DBD91894792DE803DE87271\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_27.Text\n#. /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_27.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_27.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"You bring back the artefacts to rescue Lillian.\"\nmsgstr \"你带着这些工艺品去救莉莉安。\"\n\n#. Key:\t5D71DA8F4134A1AA206F15B7587AA188\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_15.Children(0).Children.Text\n#. /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_15.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_15.Children(0).Children.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Break in?\"\nmsgstr \"硬闯？\"\n\n#. Key:\t6234A9A34854A37E0CA56987FDE81F5A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_26.Children(1).Children.Text\n#. /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_26.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_26.Children(1).Children.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"You are right\"\nmsgstr \"你是对的\"\n\n#. Key:\t6B07C6F34DF51DFA23A4278FCBECF303\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_19.Text\n#. /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"What it will do?\"\nmsgstr \"它会做什么?\"\n\n#. Key:\t6E5A51A34AB81094924512B92F25F41C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_32.Text\n#. /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_32.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_32.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"You are trying to rescue a bunch of mad people so that they can live a few more years with the cost of destroying one more Realm.\"\nmsgstr \"你试图拯救一群疯狂的人，这样他们就可以多活几年，付出摧毁另一个王国的代价。\"\n\n#. Key:\t70514624400617999FA05FAFAE67D60F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_9.Text\n#. /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"What happened in the Human Realm?\"\nmsgstr \"人类王国发生了什么?\"\n\n#. Key:\t71C42D6445782897EAF303BFA2C5C260\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_17.Text\n#. /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"What will you do? What’s your part in this?\"\nmsgstr \"你会怎么做?  你干了什么?\"\n\n#. Key:\t728B75824B28856156D207B71017C714\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_8.Text\n#. /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Things are changing in the Human Realm and Raven has many things to do.\"\nmsgstr \"人类王国正在经历变化，乌鸦有很多事情要做。\"\n\n#. Key:\t7826765F45BE76393F3636B79BBC24C0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_24.Text\n#. /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_24.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_24.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"You are right. We need to save them. What’s the plan?\"\nmsgstr \"你是对的。我们需要拯救他们。有什么计划吗?\"\n\n#. Key:\t866DA22D46D855A200BB7F9E71788367\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_22.Children(0).Children.Text\n#. Key:\tBA0DEBA04BF5C604A2B760B8275E2983\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_23.Text\n#. /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_22.Children(0).Children.Text\n#. /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_23.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_22.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_23.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Is that safe?\"\nmsgstr \"是安全的吗?\"\n\n#. Key:\t86E69EA04F489DC54B48BEBE8B3762BF\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_1.Children(0).Children.Text\n#. /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_1.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_1.Children(0).Children.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Agree\"\nmsgstr \"同意\"\n\n#. Key:\t8D543992469624098751EAA474848F8C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_21.Text\n#. /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Soon the Ruined Realm will be over. We cannot save it.\"\nmsgstr \"很快，这个毁灭王国就要结束了。我们无法拯救它。\"\n\n#. Key:\t943679734061A00F4CC99A8BC31078EA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_18.Text\n#. /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Wizard won’t activate the device for them but some of them are fools enough to try it anyway.\"\nmsgstr \"巫师不会为他们激活设备，但他们中的一些人足够愚蠢去尝试它。\"\n\n#. Key:\t978AEC8B45AC7E6ED3E814AB849CF96A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_6.Text\n#. /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"So, what now?\"\nmsgstr \"所以, 现在该做什么?\"\n\n#. Key:\t99250A3F4973EBFB5A20A192DF8976AA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_13.Text\n#. /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"With every day more and more people join their ranks.\"\nmsgstr \"每天都有越来越多的人加入他们的行列。\"\n\n#. Key:\t9D81AC2C4900D6DDA6B17CAD7168020C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_31.Text\n#. /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_31.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_31.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Farewell, compeer!\"\nmsgstr \"再见，小伙伴！\"\n\n#. Key:\tA5F24B3747918DB1E38CB98208FD6B1B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_35.Text\n#. /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_35.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_35.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Or maybe you are wrong.\"\nmsgstr \"也许你错了。\"\n\n#. Key:\tB0ECBFAF4E34AEDE88F1B7B7C7F7CC5B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_8.Children(0).Children.Text\n#. /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_8.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_8.Children(0).Children.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"What happened?\"\nmsgstr \"自私了？\"\n\n#. Key:\tB1D891BF48298C5D4CF7D8957EACDD1B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_28.Text\n#. /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Raven will gather as many survivors as Raven can.\"\nmsgstr \"乌鸦会尽可能多地聚集幸存者。\"\n\n#. Key:\tB6CF3E424BAEA6EE368D508EEFDD5FF1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_36.Text\n#. /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_36.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_36.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Farewell compeer! Raven will be on a quest on Raven’s own!\"\nmsgstr \"告别小伙伴！乌鸦将独自完成一个任务！\"\n\n#. Key:\tB87509FF4D29C2B3D25CCEB192090963\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_16.Text\n#. /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"What happens if they break in?\"\nmsgstr \"如果他们闯入会发生什么?\"\n\n#. Key:\tB89F014644B8D3E1754B1B8C796D5858\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_1.Children(1).Children.Text\n#. /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_1.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_1.Children(1).Children.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Disagree\"\nmsgstr \"不同意\"\n\n#. Key:\tBA14AAD54C3D4F7CF18F5D8560A62637\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_20.Text\n#. /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Nothing good...\"\nmsgstr \"没有什么好…\"\n\n#. Key:\tC2E50DCB4E1171342DD931910E42549E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_37.Text\n#. /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_37.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_37.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Farewell!\"\nmsgstr \"告辞！\"\n\n#. Key:\tC3B19DAF4C0B491D9236CD99FD7DD603\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_3.Text\n#. /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Except when you kill me with a laser beam.\"\nmsgstr \"除非你用激光束杀了我。\"\n\n#. Key:\tCBDDFBD14121FE1758B360A1775F2169\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_11.Text\n#. /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Farewell compeer until you meet Raven again!\"\nmsgstr \"再见，小伙伴!\"\n\n#. Key:\tCD19E0924BB1080025ABA19860F578CE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_14.Text\n#. /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Somehow they know about the device the Wizard created. They surrounded the Wizard’s tower. Some even tried to break in.\"\nmsgstr \"不知何故，他们获悉了巫师创建的装置。然后他们包围了巫师塔。有些人甚至试图闯入。\"\n\n#. Key:\tD54470AA424038F96824FC805AE3F0EE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_25.Text\n#. /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_25.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_25.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Krrr! For them it’s much safer than staying here when the World is over.\"\nmsgstr \"呃！对他们来说，这比世界末日时呆在这里安全多了。\"\n\n#. Key:\tD99400D94457B6779DE59DB94FDBF9D1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_15.Text\n#. /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"We have really short time to act.\"\nmsgstr \"我们的行动时间真的很短。\"\n\n#. Key:\tDAEF711B41EC4EF72FC271B5AD98A238\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_26.Text\n#. /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_26.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_26.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"There are hundreds of survivors. Races that don’t even exist anywhere else! Who are we if we don’t even try to save them?\"\nmsgstr \"其他地方根本不存在的种族留下了数百名幸存者！如果我们都不试图去救他们，那我们算什么人了？\"\n\n#. Key:\tDF872D134C82DFDD3F55F4A6FFF59673\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_5.Text\n#. /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Except...\"\nmsgstr \"除非...\"\n\n#. Key:\tE64B8C0048D2D3357B74CD8D7C1B5407\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_34.Text\n#. /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_34.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_34.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"You sound like that Monk, don’t you? Maybe you are right.\"\nmsgstr \"你听起来就像那个修道士。 也许你是对的。\"\n\n#. Key:\tEA01FB8248A5F30CF9D95AA292D5466A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_4.Text\n#. /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"No problem.\"\nmsgstr \"没问题。\"\n\n#. Key:\tF1193DA54FBB289383D56F952818E67E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_22.Text\n#. /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Raven’s master decided we need to gather every survivor and take them into the Human Realm.\"\nmsgstr \"乌鸦的主人决定我们要把所有的幸存者都集中起来，把他们带到人类王国。\"\n\n#. Key:\tF19792CF477CD543AC05FCBEDA3EA88C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_15.Children(1).Children.Text\n#. /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_15.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_15.Children(1).Children.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"To act?\"\nmsgstr \"采取行动？\"\n\n#. Key:\tF606FBDF4B7F3DFF9A55BE9CDB186CAC\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_10.Text\n#. /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Farewell then!\"\nmsgstr \"告辞！\"\n\n#. Key:\tF8FA36BF4E3A4C028FBAF0A2AA531AA4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_7.Text\n#. /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"You need to go on alone.\"\nmsgstr \"你得一个人去。\"\n\n#. Key:\tFA02BBA74B601254CDA90A9300AD312F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_29.Text\n#. /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_29.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_29.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"If all goes well you will meet Raven on the other side.\"\nmsgstr \"如果一切顺利，你会在另一边遇到乌鸦。\"\n\n#. Key:\tFA630952402B081C2D449DA3C091F33E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_2.Text\n#. /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Yes, we did well. Thanks for the help!\"\nmsgstr \"是的，我们做得很好。谢谢你的帮助！\"\n\n#. Key:\t63338A0644CC3AE62BCC10B56EAAD524\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3SewerCreature.C3SewerCreature:DlgNode_Speech_1.Text\n#. /Game/SO/Dialogues/Chapter3/C3SewerCreature.C3SewerCreature:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter3/C3SewerCreature.C3SewerCreature:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_C3SewerCreature\"\nmsgid \"Fear not, everything will be alright!\"\nmsgstr \"不要害怕，一切都会好起来的！\"\n\n#. Key:\t2C1EC209404316CE23DC67B6E91AC661\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Statue.C3Statue:DlgNode_Speech_2.Text\n#. /Game/SO/Dialogues/Chapter3/C3Statue.C3Statue:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter3/C3Statue.C3Statue:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_C3Statue\"\nmsgid \"Are you ready?\"\nmsgstr \"你准备好了吗？\"\n\n#. Key:\t33B337C9455FC32BF5C3C69F58843673\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Statue.C3Statue:DlgNode_Speech_3.Text\n#. /Game/SO/Dialogues/Chapter3/C3Statue.C3Statue:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Chapter3/C3Statue.C3Statue:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_C3Statue\"\nmsgid \"Will you release me once I get into your tower?\"\nmsgstr \"我一进入你的塔你就放了我吗?\"\n\n#. Key:\t4A8AD3EC428307141BD011B66448A7E5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Statue.C3Statue:DlgNode_Speech_2.Children(0).Children.Text\n#. /Game/SO/Dialogues/Chapter3/C3Statue.C3Statue:DlgNode_Speech_2.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Statue.C3Statue:DlgNode_Speech_2.Children(0).Children.Text\nmsgctxt \"Dialogue_C3Statue\"\nmsgid \"Ready\"\nmsgstr \"准备\"\n\n#. Key:\t9C5B29DF4784913DFF166BAD07AC1219\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Statue.C3Statue:DlgNode_Speech_7.Text\n#. /Game/SO/Dialogues/Chapter3/C3Statue.C3Statue:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Chapter3/C3Statue.C3Statue:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_C3Statue\"\nmsgid \"Hurry! We don’t have much time.\"\nmsgstr \"快点! 我们没有多少时间。\"\n\n#. Key:\tB640545F41315B4C142083A2DB12A132\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Statue.C3Statue:DlgNode_Speech_4.Text\n#. /Game/SO/Dialogues/Chapter3/C3Statue.C3Statue:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Chapter3/C3Statue.C3Statue:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_C3Statue\"\nmsgid \"Sure, we made a deal.\"\nmsgstr \"当然，我们做了个交易。\"\n\n#. Key:\tC4EC98FC40F0181F5AFA60B4DFEF2D16\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Statue.C3Statue:DlgNode_Speech_6.Text\n#. /Game/SO/Dialogues/Chapter3/C3Statue.C3Statue:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Chapter3/C3Statue.C3Statue:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_C3Statue\"\nmsgid \"Not yet. I’ll be back...\"\nmsgstr \"还没有。我会回来的……\"\n\n#. Key:\tCD542C81498F713774D43AB6EF126E32\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Statue.C3Statue:DlgNode_Speech_1.Text\n#. /Game/SO/Dialogues/Chapter3/C3Statue.C3Statue:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter3/C3Statue.C3Statue:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_C3Statue\"\nmsgid \"Well done! From here I can take you to my tower.\"\nmsgstr \"做得好! 从这里我可以带你去我的塔。\"\n\n#. Key:\tF982C80748C46B117906F094608B7E2C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Statue.C3Statue:DlgNode_Speech_2.Children(1).Children.Text\n#. /Game/SO/Dialogues/Chapter3/C3Statue.C3Statue:DlgNode_Speech_2.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Statue.C3Statue:DlgNode_Speech_2.Children(1).Children.Text\nmsgctxt \"Dialogue_C3Statue\"\nmsgid \"Stay\"\nmsgstr \"停留\"\n\n#. Key:\tFE6723D8452B497B07504EA753F02F35\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Statue.C3Statue:DlgNode_Speech_5.Text\n#. /Game/SO/Dialogues/Chapter3/C3Statue.C3Statue:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Chapter3/C3Statue.C3Statue:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_C3Statue\"\nmsgid \"Let’s go then!\"\nmsgstr \"走吧！\"\n\n#. Key:\t7C2DF1BE46E7672A1C7092A330030B39\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3SupperDwarf.C3SupperDwarf:DlgNode_Speech_1.Text\n#. /Game/SO/Dialogues/Chapter3/C3SupperDwarf.C3SupperDwarf:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter3/C3SupperDwarf.C3SupperDwarf:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_C3SupperDwarf\"\nmsgid \"Otherwise I would rather stay here.\"\nmsgstr \"否则我宁愿呆在这里。\"\n\n#. Key:\tFEB0911A412AF51088EC6A84D0FC7B3C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3SupperDwarf.C3SupperDwarf:DlgNode_Speech_80.Text\n#. /Game/SO/Dialogues/Chapter3/C3SupperDwarf.C3SupperDwarf:DlgNode_Speech_80.Text\n#: /Game/SO/Dialogues/Chapter3/C3SupperDwarf.C3SupperDwarf:DlgNode_Speech_80.Text\nmsgctxt \"Dialogue_C3SupperDwarf\"\nmsgid \"I hope there is some delicious food in the Human Realm.\"\nmsgstr \"我希望人类王国不缺美味的食物。\"\n\n#. Key:\t360852FB41FBC269468577878A0CC719\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_9.Text\n#. /Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_C3Teachy\"\nmsgid \"Don’t say it, I know. I’m genius.\"\nmsgstr \"不用说，我知道。我是天才。\"\n\n#. Key:\t39008A1943A63D4050295B9C508DF4CE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_5.Text\n#. /Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_C3Teachy\"\nmsgid \"He asked me to prove that I am worthy.\"\nmsgstr \"他要我证明我的价值。\"\n\n#. Key:\t5D3A77994D763C95F5655CAC4F228452\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_19.Text\n#. /Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_C3Teachy\"\nmsgid \"Oh, the walking ball again!\"\nmsgstr \"哦，又是个会走路的球！\"\n\n#. Key:\t74789A0946246082325FCDB2600CEAA2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_2.Text\n#. /Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_C3Teachy\"\nmsgid \"I haven’t seen you since you left me there with that Keeper.\"\nmsgstr \"自从你把我和那个守护者留在那里后，我就没见过你。\"\n\n#. Key:\t81A13B9645C14341A7FA45BC7482AB58\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_1.Text\n#. /Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_C3Teachy\"\nmsgid \"I'm not sure if it still matters but here is the Weird Device I found in the hideout of the Secret Science Society.\"\nmsgstr \"我不确定它是否仍然重要，但这是我在秘密科学协会的藏身之处发现的奇怪装置。\"\n\n#. Key:\t8E2355CF4A1F7CCF4AF0FA8D95E2F503\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_8.Text\n#. /Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_C3Teachy\"\nmsgid \"After reordering the right side I got the final result:\\r\\n\\r\\nTEACHY = WORTHY\"\nmsgstr \"在右边重新排序后，我得到了最终的结果:\\r\\n\\r\\n老师 = 价值\"\n\n#. Key:\tA46C8D2749791CE910856BA8887272EB\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_14.Text\n#. /Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_C3Teachy\"\nmsgid \"That is amazing! Thank you, my globular friend! Take these coins, I am sure you will enjoy spending them... if you still can.\"\nmsgstr \"太棒了！谢谢你，我的球形朋友! 把这些硬币拿去，我相信你会乐意把它们花出去的…… 如果你还能够这么做的话。\"\n\n#. Key:\tBFA75D71419A3B5615D65980F9A2FC0E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_4.Text\n#. /Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_C3Teachy\"\nmsgid \"Well, alright, I’ll tell.\"\nmsgstr \"好吧，我告诉你。\"\n\n#. Key:\tC09FB7394571D19280D0B68572C6DCBB\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_3.Text\n#. /Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_C3Teachy\"\nmsgid \"I bet you wonder how did I get out.\"\nmsgstr \"我打赌你想知道我是怎么得出这个结论的。\"\n\n#. Key:\tCC72AAE64CE58AECB367B0B2565A74CC\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_6.Text\n#. /Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_C3Teachy\"\nmsgid \"I made some cups of tea and slowly put them in a row. From that I had this formula:\\r\\n\\r\\nTIME = T\\r\\nCUP = C\\r\\nTEA * C = ROW * T\"\nmsgstr \"我泡了几杯茶，一边品茶一边思索。然后得出这个结论:\\r\\n\\r\\n老师 = 知识\\r\\n知识 = 金钱\\r\\n金钱 = 价值\\r\\n\"\n\n#. Key:\tE907906F4A46886EFBA7F09E459F2663\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_7.Text\n#. /Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_C3Teachy\"\nmsgid \"Then I multiplied by HY, so I get:\\r\\n\\r\\nTEACHY = ROWTHY\"\nmsgstr \"\\r\\n所以，老师 = 价值\"\n\n#. Key:\t298F025648B369E90753DA8D882DFDDB\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/DwarvenCatacombs/DCDictionary.DCDictionary:DlgNode_Speech_6.Text\n#. /Game/SO/Dialogues/Wizard/DwarvenCatacombs/DCDictionary.DCDictionary:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Wizard/DwarvenCatacombs/DCDictionary.DCDictionary:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_DCDictionary\"\nmsgid \"Finally! A dictionary!\"\nmsgstr \"无懈可击！\"\n\n#. Key:\t3D4CF9424B28083560A64D8FA1232E9F\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/DwarvenCatacombs/DCDictionary.DCDictionary:DlgNode_Speech_5.Text\n#. /Game/SO/Dialogues/Wizard/DwarvenCatacombs/DCDictionary.DCDictionary:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Wizard/DwarvenCatacombs/DCDictionary.DCDictionary:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_DCDictionary\"\nmsgid \"Wake me up when you are ready.\"\nmsgstr \"你准备好了就叫醒我。\"\n\n#. Key:\t04B787DD4344DA8AD6B1E0B7925BBDCE\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/DwarvenCatacombs/DCSecretDoor.DCSecretDoor:DlgNode_Speech_2.Text\n#. /Game/SO/Dialogues/Wizard/DwarvenCatacombs/DCSecretDoor.DCSecretDoor:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Wizard/DwarvenCatacombs/DCSecretDoor.DCSecretDoor:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_DCSecretDoor\"\nmsgid \"There is a hidden Dwarven Door somewhere around here.\"\nmsgstr \"这附近有个隐藏的地精之门。\"\n\n#. Key:\t4412DD54423A17AF3BFBA89BAF42664D\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/DwarvenCatacombs/DCSecretDoor.DCSecretDoor:DlgNode_Speech_5.Text\n#. /Game/SO/Dialogues/Wizard/DwarvenCatacombs/DCSecretDoor.DCSecretDoor:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Wizard/DwarvenCatacombs/DCSecretDoor.DCSecretDoor:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_DCSecretDoor\"\nmsgid \"Or if you toggle that switch.\"\nmsgstr \"或者你去拨动那个开关。\"\n\n#. Key:\t5FDA3D2A49BD57C213F0E3869A366B76\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/DwarvenCatacombs/DCSecretDoor.DCSecretDoor:DlgNode_Speech_4.Text\n#. /Game/SO/Dialogues/Wizard/DwarvenCatacombs/DCSecretDoor.DCSecretDoor:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Wizard/DwarvenCatacombs/DCSecretDoor.DCSecretDoor:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_DCSecretDoor\"\nmsgid \"This one can only be revealed on Christmas time if the full moon shines on it.\"\nmsgstr \"这个只有在满月的时候才能被发现。\"\n\n#. Key:\tCE7E6F5B4DB41F1055EAF1898F17E4EA\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/DwarvenCatacombs/DCSecretDoor.DCSecretDoor:DlgNode_Speech_3.Text\n#. /Game/SO/Dialogues/Wizard/DwarvenCatacombs/DCSecretDoor.DCSecretDoor:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Wizard/DwarvenCatacombs/DCSecretDoor.DCSecretDoor:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_DCSecretDoor\"\nmsgid \"Dwarfs are fond of these. They can't be seen if you don't know their trick.\"\nmsgstr \"矮人喜欢这些。如果你不知道他们的把戏，你就看不见他们。\"\n\n#. Key:\t03067C1041952ECAC7D529AF2CC2ABEE\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_12.Text\n#. /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_DemonLillian\"\nmsgid \"Who you just killed...\"\nmsgstr \"就你刚刚杀死的…\"\n\n#. Key:\t06C4895B4BA9C2F71F3007B00A680CFB\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_13.Text\n#. /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_DemonLillian\"\nmsgid \"I'm free without any bounds! I'm human!\"\nmsgstr \"我是自由的，没有任何束缚! 我是人类!\"\n\n#. Key:\t0E5418EA4828B840886434A250967CBE\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_11.Text\n#. /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_DemonLillian\"\nmsgid \"You liar! I'm the daughter of the Wizard!\"\nmsgstr \"你说谎! 我是巫师的女儿!\"\n\n#. Key:\t15ED5E554FBF25A72BB12FA81F4076FF\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_5.Text\n#. /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_DemonLillian\"\nmsgid \"Sister? What makes you say that?\"\nmsgstr \"姐姐? 你为什么这么说?\"\n\n#. Key:\t2B375C424D4561D651214BA0F10CDB44\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_9.Text\n#. /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_DemonLillian\"\nmsgid \"Siblings? What makes you say that?\"\nmsgstr \"姐妹? 你为什么这么说?\"\n\n#. Key:\t2F0A5F3442ACF917A0515892B0639541\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_2.Children(1).Children.Text\n#. /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_2.Children(1).Children.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_2.Children(1).Children.Text\nmsgctxt \"Dialogue_DemonLillian\"\nmsgid \"Just passing\"\nmsgstr \"只是路过\"\n\n#. Key:\t36A3340F4333184F42874F88F23A710D\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_1.Text\n#. /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_DemonLillian\"\nmsgid \"What are you doing here little toy?\"\nmsgstr \"你在这里做什么，小不点玩具?\"\n\n#. Key:\t46C7EE464B94BCE5D8CE6DB96299A583\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_17.Text\n#. /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_DemonLillian\"\nmsgid \"You are nonsense.\"\nmsgstr \"你是废物。\"\n\n#. Key:\t732777EC4B213BC797E24FBBC478D39F\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_10.Text\n#. /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_DemonLillian\"\nmsgid \"You are a Spirit of the Unknown bound to this body by magic. Just like me.\"\nmsgstr \"你是一个无名幽魂，被魔法束缚在这个身体上。就像我一样。\"\n\n#. Key:\t819738554E1DD3694F3D0699221E6932\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_4.Text\n#. /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_DemonLillian\"\nmsgid \"I'm just err... maybe we could play seek and hide?\"\nmsgstr \"我只是…… 呃，也许我们可以玩捉迷藏?\"\n\n#. Key:\tA02291F444C7907190F1D3AC78E5EAF0\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_2.Children(0).Children.Text\n#. /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_2.Children(0).Children.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_2.Children(0).Children.Text\nmsgctxt \"Dialogue_DemonLillian\"\nmsgid \"I'll stop you!\"\nmsgstr \"我要阻止你!\"\n\n#. Key:\tA94658F148628400E971CD925A6B8713\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_14.Text\n#. /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_DemonLillian\"\nmsgid \"Shaped like a human...\"\nmsgstr \"像一个人形...\"\n\n#. Key:\tBBBDA8B843BF5549EF4052894D9BB630\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_8.Text\n#. /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_DemonLillian\"\nmsgid \"We are siblings right? You will surely let me pass...\"\nmsgstr \"我们是兄弟姐妹，对吧? 你一定会让我通过……\"\n\n#. Key:\tBF79A92B406E287D767E7799D78FCFD4\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_6.Text\n#. /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_DemonLillian\"\nmsgid \"That sounds funny!\"\nmsgstr \"听起来很有趣！\"\n\n#. Key:\tC6609DA7417A4DBC86F9809CE994E8BA\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_16.Text\n#. /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_DemonLillian\"\nmsgid \"I'm power, I'm god!\"\nmsgstr \"我是无上的力量，我是神！\"\n\n#. Key:\tDD2EF1594AFD2B0C38845C9E36089B95\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_7.Text\n#. /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_DemonLillian\"\nmsgid \"I've found you!\"\nmsgstr \"我找到你了！\"\n\n#. Key:\tDD2F3A7048614E74B3A343BA474D8E49\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_3.Text\n#. /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_DemonLillian\"\nmsgid \"I've come to stop you sister. The World is not your playground!\"\nmsgstr \"我是来阻止你的，小姐妹。世界不是你的游乐场!\"\n\n#. Key:\tE7FA21A04757D1EF04AE41AF4A13025A\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_2.Text\n#. /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_DemonLillian\"\nmsgid \"I'm bored! Have you come to play with me?\"\nmsgstr \"我很无聊！你是来和我玩的吗?\"\n\n#. Key:\tFF05E84E4027C75294BAF4A589EEF6F9\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_15.Text\n#. /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_DemonLillian\"\nmsgid \"I can create, I can destroy!\"\nmsgstr \"我可以创造，也可以毁灭！\"\n\n#. Key:\t025193144996A7024A7CF791B5A25EB7\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillianDefeated.DemonLillianDefeated:DlgNode_Speech_4.Text\n#. /Game/SO/Dialogues/Ending/E1/DemonLillianDefeated.DemonLillianDefeated:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillianDefeated.DemonLillianDefeated:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_DemonLillianDefeated\"\nmsgid \"What are you doing? Keep your hands away from me!\"\nmsgstr \"你在干什么? 把你的手拿开！\"\n\n#. Key:\t2E05897C454C5C33BD76A6A4371A545C\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillianDefeated.DemonLillianDefeated:DlgNode_Speech_1.Text\n#. /Game/SO/Dialogues/Ending/E1/DemonLillianDefeated.DemonLillianDefeated:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillianDefeated.DemonLillianDefeated:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_DemonLillianDefeated\"\nmsgid \"I don't want to play anymore!\"\nmsgstr \"我不想再玩了！\"\n\n#. Key:\t77A82F8943F323744F9389BF22A80FDF\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillianDefeated.DemonLillianDefeated:DlgNode_Speech_8.Text\n#. /Game/SO/Dialogues/Ending/E1/DemonLillianDefeated.DemonLillianDefeated:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillianDefeated.DemonLillianDefeated:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_DemonLillianDefeated\"\nmsgid \"Farewell Spirit!\"\nmsgstr \"再见了，小精灵！\"\n\n#. Key:\t7831CD44458112E37918DF9082278603\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillianDefeated.DemonLillianDefeated:DlgNode_Speech_2.Text\n#. /Game/SO/Dialogues/Ending/E1/DemonLillianDefeated.DemonLillianDefeated:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillianDefeated.DemonLillianDefeated:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_DemonLillianDefeated\"\nmsgid \"Leave me alone!\"\nmsgstr \"让我静静！\"\n\n#. Key:\t79E4053F4B8A1AFE74064BA77037F13E\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillianDefeated.DemonLillianDefeated:DlgNode_Speech_6.Text\n#. /Game/SO/Dialogues/Ending/E1/DemonLillianDefeated.DemonLillianDefeated:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillianDefeated.DemonLillianDefeated:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_DemonLillianDefeated\"\nmsgid \"I am his daughter. And this body is mine.\"\nmsgstr \"我是他的女儿。这个身体是我的。\"\n\n#. Key:\t96BD08904BC50C912055C0977281D10F\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillianDefeated.DemonLillianDefeated:DlgNode_Speech_3.Text\n#. /Game/SO/Dialogues/Ending/E1/DemonLillianDefeated.DemonLillianDefeated:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillianDefeated.DemonLillianDefeated:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_DemonLillianDefeated\"\nmsgid \"I know this body...\"\nmsgstr \"我知道这个身体...\"\n\n#. Key:\tA5634D7D4613C578AB85E48B2DBD422B\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillianDefeated.DemonLillianDefeated:DlgNode_Speech_7.Text\n#. /Game/SO/Dialogues/Ending/E1/DemonLillianDefeated.DemonLillianDefeated:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillianDefeated.DemonLillianDefeated:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_DemonLillianDefeated\"\nmsgid \"Away!\"\nmsgstr \"闪开！\"\n\n#. Key:\tE09248B24E34823DDE71BAB68183AD2D\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillianDefeated.DemonLillianDefeated:DlgNode_Speech_5.Text\n#. /Game/SO/Dialogues/Ending/E1/DemonLillianDefeated.DemonLillianDefeated:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillianDefeated.DemonLillianDefeated:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_DemonLillianDefeated\"\nmsgid \"They were wrong all along.\"\nmsgstr \"他们一直都错了。\"\n\n#. Key:\t01C1D7AF4D8D7B3D628A089E38471479\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_74.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_74.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_74.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Thank you! Take this as reward.\"\nmsgstr \"谢谢你！这是奖励。\"\n\n#. Key:\t034DDD8F467E3B6E6A70CFBC1FA81D21\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_94.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_94.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_94.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Look what I have found for you!\"\nmsgstr \"看看我为你找到了什么!\"\n\n#. Key:\t046279EA4D7E44826F537DA0869C13DD\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_114.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_114.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_114.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"They are somewhere around.\"\nmsgstr \"他们就在附近。\"\n\n#. Key:\t055FD02047EB0145285C8BB0B7A23F0A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_17.Children(0).Children.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_17.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_17.Children(0).Children.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"They fight Ruin\"\nmsgstr \"他们与毁灭战斗\"\n\n#. Key:\t07684DB1418378D59D3741AE19AB22C1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(9).Children.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(9).Children.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(9).Children.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Golems destroyed\"\nmsgstr \"机器人被摧毁\"\n\n#. Key:\t0D548F74416A5C1D8220869DC707A575\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_127.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_127.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_127.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Even if he couldn't be what I wanted him to be, he was my greatest creation ever.\"\nmsgstr \"即使他不能成为我希望他成为的人，他也是我最伟大的创造。\"\n\n#. Key:\t0E3082704C6E4BA14C554DA5B4306C88\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_8.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Could you merge these copper pieces?\"\nmsgstr \"你能把这些铜片合并起来吗?\"\n\n#. Key:\t103CB0C84AEA077F78347A92E6389F32\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_10.Children(0).Children.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_10.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_10.Children(0).Children.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Don't know\"\nmsgstr \"不知道\"\n\n#. Key:\t12C814BB44D434DFC5C35C882B4BF0DB\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_116.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_116.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_116.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Be aware of the Armour Wrath.\"\nmsgstr \"小心铠甲之怒\"\n\n#. Key:\t14E2589C4CC2C6C77D37A5B50C61C266\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_2.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Could you merge these bronze pieces?\"\nmsgstr \"你能把这些青铜碎片合并起来吗?\"\n\n#. Key:\t1770D8FE480B8C028F9ED989E22CF315\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_3.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"You are not one of my new creations. Yet not one of the ancients.\"\nmsgstr \"你不是我的新创造物，也不属于古老的那批。\"\n\n#. Key:\t1C02E8BB400B379858A402B9621B68D6\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_129.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_129.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_129.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Take care!\"\nmsgstr \"小心！\"\n\n#. Key:\t1CDE0CFA4DBF3794096E099B58726BD8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_36.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_36.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_36.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Nothing else matters.\"\nmsgstr \"其它都无所谓\"\n\n#. Key:\t1FA243424440B0810651C79BD207FC2D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_33.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_33.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_33.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Too many spirits. They break loose. They couldn’t exist in our Realm. They formed Ruin.\"\nmsgstr \"太多的精灵，他们挣脱。他们不可能存在于我们的王国。他们生成了毁灭。\"\n\n#. Key:\t1FFE46404FBD26325B1348BF7A2935A7\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_92.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_92.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_92.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Oh, thank you! It also gives back some of my lost knowledge.\"\nmsgstr \"噢, 谢谢你！它也让我找回一些失去的知识。\"\n\n#. Key:\t2084B3DE4CDAC5B7B9018994EE4DFAA4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_85.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_85.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_85.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"The end is close, yet knowing what I am makes my last days brighter.\"\nmsgstr \"终点已近，但知道自己是什么，会让我最后的日子更加光明。\"\n\n#. Key:\t21883D3E4563FD95B13E8E8E25FB1D92\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_15.Children(0).Children.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_15.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_15.Children(0).Children.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Not my business\"\nmsgstr \"不关我事\"\n\n#. Key:\t2362D7ED44CEEE8592C72BB41ECC0CC0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_77.Text\n#. Key:\t969AF9184296C419E484BA80FF80F15B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_76.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_77.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_76.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_76.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_77.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Do you know a girl called Lillian?\"\nmsgstr \"你认识一个叫莉莉安的女孩吗？\"\n\n#. Key:\t2362FF25427C7C664ACE9297A20F3C65\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_81.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_81.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_81.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Memory Crystals? Can I touch them?\"\nmsgstr \"记忆水晶? 我能摸一下吗?\"\n\n#. Key:\t254431B64533FAD362B0AF93F8347842\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_119.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_119.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_119.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"You will find it if you reach the top of the Main Tower.\"\nmsgstr \"如果你到达主塔的顶端，你就会找到它。\"\n\n#. Key:\t26664D3045EDCEC9C09E9CBA8515C088\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_11.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I don't know... I'm forced to do tasks for a wizard. I'm lost and confused.\"\nmsgstr \"我不知道…  我被迫为一个巫师做任务。我迷茫了。\"\n\n#. Key:\t280BE2914A227E7350F067BCB4CC49AD\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_86.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_86.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_86.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Hmmm...\"\nmsgstr \"嗯...\"\n\n#. Key:\t2B714CED45A868B1678C5E854160945E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_97.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_97.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_97.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Look, I have more crystals.\"\nmsgstr \"看，我有更多的水晶。\"\n\n#. Key:\t2C052328496E84667F356F95F9F9C418\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_18.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"This is really not my problem. All I care about is to complete my task and go on my way.\"\nmsgstr \"这不是我的问题。我所关心的只是完成我的任务，继续我的路。\"\n\n#. Key:\t2C174523477E6720A5300DBFE343C3D8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_51.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_51.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_51.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I can no longer open a gate to the Unknown Realm.\"\nmsgstr \"我再也无法打开通往未知王国的大门。\"\n\n#. Key:\t2C7D234B4F377087E1D340986BD581AC\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_49.Text\n#. Key:\t417BB4E644EBC809C2489F85993A8E17\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_56.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_49.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_56.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_49.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_56.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"If you can summon Spirits you surely know a way to get me home.\"\nmsgstr \"如果你能召唤灵魂，你一定知道带我回家的路。\"\n\n#. Key:\t2DE200934F6AC1595216AA8050FF8F30\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_67.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_67.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_67.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I won’t work with anything else.\"\nmsgstr \"我不会用其他的东西。\"\n\n#. Key:\t2FC050C145CB19BD786157988C677AF5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(1).Children.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(1).Children.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Bronze key\"\nmsgstr \"青铜钥匙\"\n\n#. Key:\t30AD4CBE4D6EFD170F43D9852A0CB50C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_108.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_108.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_108.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I can’t remember.\"\nmsgstr \"我记不起来了。\"\n\n#. Key:\t310B95624A8B2179F69A68BE2B0869C2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(4).Children.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(4).Children.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(4).Children.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Making Golems?\"\nmsgstr \"制造机器人？\"\n\n#. Key:\t311039514F83A0ED4BE47A98BF5AE48E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_107.Text\n#. Key:\t5D08D2404686BF1E5D48AC8C63096F0D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_104.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_107.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_104.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_104.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_107.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Thank you Spirit! I will be forever in your debt.\"\nmsgstr \"谢谢你，小精灵！感激不尽。\"\n\n#. Key:\t3140425845B595B02CA8D3B8DBC6CE37\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_38.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_38.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_38.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"It's done. They are destroyed.\"\nmsgstr \"搞定了。他们被摧毁了。\"\n\n#. Key:\t37835C204E4C4B17F2D55C9B23FD7D1E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_45.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_45.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_45.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"There is some kind of a connection between Ruin and the Spirits.\"\nmsgstr \"在毁灭和灵魂之间有某种联系。\"\n\n#. Key:\t384F5CB146C9B6E7EFD361964FF11735\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_12.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"A spirit of the Unknown was summoned here by a Wizard of another world.\"\nmsgstr \"一个来自另一个世界的巫师在这里召唤了一种无名幽魂。\"\n\n#. Key:\t398124A4493A7325B284CA8105354F0C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_35.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_35.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_35.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Yet now the only important thing is to finish my golems.\"\nmsgstr \"现在唯一重要的事情就是完成我的机器人。\"\n\n#. Key:\t39C014784CA9DF8247D2DDA5587BAB20\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(5).Children.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(5).Children.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(5).Children.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Get me home!\"\nmsgstr \"让我回家！\"\n\n#. Key:\t3CE0431346C222ED2A6729AAEF8026DC\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(6).Children.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(6).Children.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(6).Children.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"New body for me\"\nmsgstr \"给我的新躯体\"\n\n#. Key:\t3DFB1F4D4BB673F983C8CDA4E9911BF2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_89.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_89.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_89.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Wait a minute! I’ll make something special for you.\"\nmsgstr \"等一下！我给你做点特别的。\"\n\n#. Key:\t3F7C1850478A14857F4FFD9D41BA39FC\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_87.Text\n#. Key:\t79079CCD4BB2C6244D6D7CB04BD4C42F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_84.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_87.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_84.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_84.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_87.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Yes, now I remember. Thank you little Spirit for giving my memories back.\"\nmsgstr \"是的，现在我想起来了。谢谢小精灵把我的回忆还给我。\"\n\n#. Key:\t3FAB7E8D4E72D1EED6E11EA54A128836\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(3).Children.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(3).Children.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(3).Children.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Copper Key\"\nmsgstr \"铜钥匙\"\n\n#. Key:\t419879C24D39534867F656B704C579AC\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_110.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_110.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_110.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Even without my memories I liked to talk to her.\"\nmsgstr \"即使没有记忆，我也喜欢和她说话。\"\n\n#. Key:\t41B08BF1417C041EB3ACAE8C09C44872\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_17.Children(1).Children.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_17.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_17.Children(1).Children.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"They will fall\"\nmsgstr \"他们会下坠\"\n\n#. Key:\t41E19A0C420F2BD87AA91AB475D5BB0C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_128.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_128.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_128.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Please, leave me alone now.\"\nmsgstr \"求你了，离我远点。\"\n\n#. Key:\t4438EF7A4D77A3314D2B6587DAE664AE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_7.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I can fix it!\"\nmsgstr \"我能修好它！\"\n\n#. Key:\t46730E7C433AE7B987C61D9DDF0161E2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_52.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_52.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_52.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"How do you make Golems then?\"\nmsgstr \"那你怎么制造机器人呢？\"\n\n#. Key:\t4816E7D14B256F62C2AFE0A3D5EC1987\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_113.Text\n#. Key:\tEC59F30D402E177B8C137DAA7A834F1A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_112.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_113.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_112.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_112.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_113.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I’m looking for three artefacts. Do you know something about them?\"\nmsgstr \"我在找三件工艺品。你对它们有什么了解吗?\"\n\n#. Key:\t49E3D8B84BD437A7195CB49B1C91A9B7\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_30.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_30.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_30.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"We created too many of them. Always new ones. We forgot about the old ones.\"\nmsgstr \"我们创造了太多太多。新的接踵而来，旧的渐渐淡忘。\"\n\n#. Key:\t4CDF7F734B65BFB6575D66A2E40B64B6\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_17.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"You wonder if Ruin will destroy their World as well...\"\nmsgstr \"你想知道毁灭是否也会摧毁他们的世界…\"\n\n#. Key:\t4FD5FE974E1B8142471F8896818E875C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"What do you need?\"\nmsgstr \"你需要什么？\"\n\n#. Key:\t5000F3F44A899815A0D341A3494E42AB\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_91.Text\n#. Key:\t6D5127FD45C09B33329F0EB0DDCE67D7\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_93.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_91.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_93.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_91.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_93.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Thank you!\"\nmsgstr \"谢谢！\"\n\n#. Key:\t50E6C4434BAC5A7F4B2C66BD8DB5E071\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_100.Text\n#. Key:\t64A5DE6941972506C0BECBB55BBE4FE5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_78.Text\n#. Key:\tB07790474D4C124CB72F128AE0FB2CC5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_95.Text\n#. Key:\tEF125F27496303716206D182C1ED460D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_39.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_100.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_78.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_95.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_39.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_100.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_39.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_78.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_95.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I think these crystals have something to do with you.\"\nmsgstr \"我觉得这些水晶跟你有点关系。\"\n\n#. Key:\t51C200AD42FCE6888DBF8C8C24A02283\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_9.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"It shall be done.\"\nmsgstr \"必须这样做。\"\n\n#. Key:\t52D4954E427C666F0F2F4A92F9BCFBC9\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_50.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_50.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_50.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I’m sorry but I can’t help you.\"\nmsgstr \"对不起，我帮不了你。\"\n\n#. Key:\t5B1327C64C77C05C43CD728356DA4EC4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_58.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_58.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_58.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Knowledge lost. We are lost.\"\nmsgstr \"不仅失去了知识，我们还失去了方向。\"\n\n#. Key:\t5E7AD2034CECCF124DA4E19D94B96433\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_4.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"It's nothing. Here it is.\"\nmsgstr \"没什么。在这儿。\"\n\n#. Key:\t5FB1520B447246A1A8BCD3BDDB44D145\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_65.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_65.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_65.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"No.\"\nmsgstr \"不。\"\n\n#. Key:\t5FBF0F3F4419A6AD796054841902FA7C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_28.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"They can't work together even if they share the same goal.\"\nmsgstr \"即使他们有共同的目标，他们也不能一起工作。\"\n\n#. Key:\t60609E4049562CF11C05CB8DB96BBBB3\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_13.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"What do you mean by 'your creations'?\"\nmsgstr \"你说的“你的创造”是什么意思?\"\n\n#. Key:\t635D5E904325D51DFF19A1A862A3CC0B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_124.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_124.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_124.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"The Armour Wrath is no more.\"\nmsgstr \"铠甲之怒不复存在。\"\n\n#. Key:\t6585CAC84326A3EEE1682789B7BB3CB6\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_10.Children(2).Children.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_10.Children(2).Children.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_10.Children(2).Children.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Your creation?\"\nmsgstr \"你的创造？\"\n\n#. Key:\t65C3735740E5D7AF76376AB2B7B05CE9\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(12).Children.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(12).Children.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(12).Children.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Leave\"\nmsgstr \"离开\"\n\n#. Key:\t6A460D4A4751398E004298948D630BA4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_47.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_47.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_47.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I don’t think I will manage though. It’s already too late. But there is no reason to give up either.\"\nmsgstr \"不过我想我应付不了。已经太迟了。但也没有理由放弃。\"\n\n#. Key:\t6DC280B64766B5CB2049409B2F73CDB4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_40.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_40.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_40.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Is there a way I can help you?\"\nmsgstr \"我能帮你什么忙吗?\"\n\n#. Key:\t6DD3D7804417850FE8504286DD2B5D95\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_96.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_96.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_96.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"More Crystal? That's very kind.\"\nmsgstr \"更多的水晶?  那太好了。\"\n\n#. Key:\t6E9DB27A4207FFA8409F61AE45282D53\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_41.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_41.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_41.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I have found one more crystal.\"\nmsgstr \"我又找到了一块水晶。\"\n\n#. Key:\t717452044F194A1C30FA3C8FBB94C9BF\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_73.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_73.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_73.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I’ll see what I can do.\"\nmsgstr \"我看看我能做什么。\"\n\n#. Key:\t74670AB34D1A75913013BE8EE7C0B961\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_72.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_72.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_72.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I’ve already destroyed them.\"\nmsgstr \"我已经毁了他们。\"\n\n#. Key:\t752F67A54FA433AA588175AA7C64E367\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_43.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_43.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_43.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I try to create the perfect Golem. The one which resists Ruin.\"\nmsgstr \"我试着创造一个完美的机器人。谁能抵抗毁灭。\"\n\n#. Key:\t775C2189498804DBED7D81AB3EFEC96F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(11).Children.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(11).Children.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(11).Children.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Lillian\"\nmsgstr \"莉莉安\"\n\n#. Key:\t78C78DDD456328181EBCC78B20F9573D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_122.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_122.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_122.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Some of them are still out there.\"\nmsgstr \"他们中的一些人还在那里。\"\n\n#. Key:\t7C7D08C340B478A9420331AD355B1FA5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_15.Children(1).Children.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_15.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_15.Children(1).Children.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Like you?\"\nmsgstr \"比如你？\"\n\n#. Key:\t7DCEFFEC46523960D1453DA93F36CAA5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_111.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_111.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_111.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I don’t know why but I feel in some way you are bound to her.\"\nmsgstr \"我不知道为什么，但我觉得在某种程度上你和她是有联系的。\"\n\n#. Key:\t7F44BD934784D4F3AA2C85985489590A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_14.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"A Wizard? So now the Human Realm's people are messing with Golem Technology.\"\nmsgstr \"一个巫师？所以现在人类王国的人都在摆弄机器人技术。\"\n\n#. Key:\t80871D9C4CF37B5F2E7101B8A2565D73\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_70.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_70.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_70.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"It’s not safe for me to walk outside.\"\nmsgstr \"我在外面走路不安全。\"\n\n#. Key:\t83ACDDA4415211102DBE099F178B228B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_15.Children(2).Children.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_15.Children(2).Children.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_15.Children(2).Children.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"You mean Ruin\"\nmsgstr \"你指的是毁灭\"\n\n#. Key:\t86B4FC23463D5507B11C3F826ADF6C7C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_10.Children(1).Children.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_10.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_10.Children(1).Children.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Spirit in a ball\"\nmsgstr \"球中精灵\"\n\n#. Key:\t88A6486843FEC6A2125F79B8AED93F74\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_99.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_99.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_99.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Now there is only a few missing.\"\nmsgstr \"现在只缺几个了。\"\n\n#. Key:\t8C2169FA47F83CA62B19F083EFC398F5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_26.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_26.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_26.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"That is me. And what are you creature?\"\nmsgstr \"那是我。你是什么生物?\"\n\n#. Key:\t8CC8368441F2CCDB0E7B22916F8A0622\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_88.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_88.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_88.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Getting back some of my lost knowledge also makes me feel happy.\"\nmsgstr \"找回一些失去的知识也让我感到快乐。\"\n\n#. Key:\t8E3399DA4F904AD46476418817CD78C4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_62.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_62.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_62.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Metal binds the will of the spirits. Rock is a bit less cruel but still weakens your will.\"\nmsgstr \"金属束缚着灵魂的意志。岩石没有那么残酷，但仍然会削弱你的意志。\"\n\n#. Key:\t8F4BB43A4656EAD257920492E10BC764\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_130.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_130.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_130.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Yes, they bring back some of my memories.\"\nmsgstr \"是的，它们勾起了我的一些回忆。\"\n\n#. Key:\t8F9DF3254A02EFF2E623DB91935A1529\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_123.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_123.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_123.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Come back when you found all of them.\"\nmsgstr \"找到全部的就回来。\"\n\n#. Key:\t97EE3A1B4AD2EB2E7ED2D1B1427E4A2A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_25.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_25.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_25.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"It's only me trying to recreate the perfect Golem.\"\nmsgstr \"只有我在努力重现完美的机器人。\"\n\n#. Key:\t99BCAE80415145460126B08933AE6242\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_118.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_118.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_118.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"One of the artefacts is close.\"\nmsgstr \"其中一件工艺品就在附近。\"\n\n#. Key:\t9A05FD0845F9149CEB6EB8889EB9A686\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_19.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"That won't happen.\"\nmsgstr \"不会发生。\"\n\n#. Key:\t9B7BB6624923813EBF68C9BCE9FF8E49\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_5.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"There is nothing else I could say. See you later!\"\nmsgstr \"我已经无话可说了。再见!\"\n\n#. Key:\t9BEA36B448EC18A9280A5AAB78A46898\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_42.Text\n#. Key:\tD3AE25EC49FA7D2C78C1A382E5A01F28\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_37.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_42.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_37.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_37.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_42.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Why are you making Golems? What would you like to achieve?\"\nmsgstr \"你为什么要做机器人? 你想实现什么目标?\"\n\n#. Key:\t9CC2CAF14E5C04555E7329B6EA5082E0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(0).Children.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(0).Children.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Armour Wrath\"\nmsgstr \"铠甲之怒\"\n\n#. Key:\t9EF4681A48ED6C909A4180BF823544BC\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(8).Children.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(8).Children.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(8).Children.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Do you need help?\"\nmsgstr \"你需要帮忙吗？\"\n\n#. Key:\t9F3BC08D46169E8C4BB788893FFDBCD4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_68.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_68.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_68.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Yes.\"\nmsgstr \"是的。\"\n\n#. Key:\tA10EF7404139EE7FE638BCA272C0B2CA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_71.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_71.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_71.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Destroy them if you can.\"\nmsgstr \"尽你所能摧毁他们。\"\n\n#. Key:\tA13C1A6B4F187C1A3F682088B9CC9A6F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_23.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_23.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_23.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Didn't look too intelligent to me...\"\nmsgstr \"在我看来不太聪明…\"\n\n#. Key:\tA28429434B394861A6E4D084CE5C243F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_61.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_61.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_61.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I could but I don’t think you would like it.\"\nmsgstr \"我可以，但我想你不会喜欢的。\"\n\n#. Key:\tA2CBB6914F66C9963AFD34A21378EAA7\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_103.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_103.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_103.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"With this last one I have all my memories back.\"\nmsgstr \"有了这最后一个，我所有的记忆都回来了。\"\n\n#. Key:\tA33780CE4B9EABF54F612DBFCEB4B890\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_15.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I wonder if they will end like us.\"\nmsgstr \"我不知道他们是否会像我们一样结束。\"\n\n#. Key:\tA47024E844A13837A8FFFBB1EFA65633\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_44.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_44.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_44.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Though I forgot the reason.\"\nmsgstr \"虽然我忘记了原因。\"\n\n#. Key:\tA4E91A924BA53F0A000CDB9FC351DDBA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_60.Text\n#. Key:\tB4F5B2E6479E0E1ACDADD8A40E21FB98\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_59.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_60.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_59.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_59.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_60.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Could you create a stronger body for me?\"\nmsgstr \"你能为我创造一个更强壮的身体吗?\"\n\n#. Key:\tA50F6A7B4A65712F990406B84E2AE072\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_98.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_98.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_98.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Thank you! I remember more and more.\"\nmsgstr \"谢谢你！我能想起来越来越多的事情了。\"\n\n#. Key:\tA586F33F460BD066761AAEBD18666F78\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_82.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_82.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_82.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Bring me more so that I can remember!\"\nmsgstr \"给我多拿点来，这样我就能记住！\"\n\n#. Key:\tA8A9ACBA47419C57AAA06098F7F91AD3\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_83.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_83.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_83.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Let me touch it! Hmmm...\"\nmsgstr \"让我摸一下！嗯…\"\n\n#. Key:\tAA5F0D5541366675A1D1819FDBDFA569\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_16.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"What happened to you?\"\nmsgstr \"你怎么了？\"\n\n#. Key:\tAD380C5F4F549229611DD9A79C7CD07E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_79.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_79.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_79.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"She was from the Human Realm. I liked her better than the other human.\"\nmsgstr \"她来自人类王国。我喜欢她胜过喜欢另一个人。\"\n\n#. Key:\tAE0D1C714FFCFCA51ACCD3A01D6C7FF5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_125.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_125.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_125.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Yes, I felt his presence disappearing.\"\nmsgstr \"是的，我感觉他不存在了。\"\n\n#. Key:\tAE6B02664FEE60818E0D32B7939907F8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_106.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_106.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_106.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Now I have all my memories back.\"\nmsgstr \"现在我所有的记忆都回来了。\"\n\n#. Key:\tB7638E004540ADC59420A5AA614C225D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_75.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_75.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_75.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I’ve destroyed the Golems near the Tomb.\"\nmsgstr \"我已经摧毁了坟墓附近的机器人。\"\n\n#. Key:\tB86428C143F7BBBC4A7B9A91C05F3D15\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_20.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"They are doomed.\"\nmsgstr \"他们是注定要失败的。\"\n\n#. Key:\tBB7DE71F44FE995BA4AF4C9F5E19961F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_46.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_46.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_46.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I try to create an Essence which resists Ruin. If it works it could stop Ruin.\"\nmsgstr \"我试图创造一种抵抗毁灭的精华。如果成功了，它就能阻止破产。\"\n\n#. Key:\tBCF49E21489280A32F859B9A6C2A78D4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_10.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"What are you creature?\"\nmsgstr \"你是什么生物？\"\n\n#. Key:\tBDEEB7C2474E308C66B832B41D839FC6\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_66.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_66.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_66.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Metal is good for spirits. Even rock is dangerous.\"\nmsgstr \"金属对灵魂有好处。甚至岩石都是危险的。\"\n\n#. Key:\tC0CAE1B14D0B0E551B690FB9F178A6EE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(10).Children.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(10).Children.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(10).Children.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Memory Crystals\"\nmsgstr \"记忆水晶\"\n\n#. Key:\tC86A03B046B8F005B1C91EB0F68E4C1E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_121.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_121.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_121.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Here, take this! It might help if you need to face my creature!\"\nmsgstr \"来，拿好！如果你需要面对我的生物，也许会有帮助！\"\n\n#. Key:\tCA35E144421C5594346DC9954052E633\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_57.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_57.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_57.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"No way home.\"\nmsgstr \"回家，没门。\"\n\n#. Key:\tCD223717428DAF54F5362BB744B6A633\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_53.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_53.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_53.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I reuse the old golems. Maybe that’s why I can’t succeed.\"\nmsgstr \"我重复使用旧的机器人。也许这就是我不能成功的原因。\"\n\n#. Key:\tD06BA0C54CAA8E00ECAFBE9FAFBABE1F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_6.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Could you merge these iron pieces?\"\nmsgstr \"你能把这些铁块合并起来吗?\"\n\n#. Key:\tD237C8514A69E0A7820941B9048B92DE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_90.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_90.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_90.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Here it is!\"\nmsgstr \"给你！\"\n\n#. Key:\tD2CEAC3040B9EBE5A98F249F60A7DAAA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(2).Children.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(2).Children.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(2).Children.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Iron Key\"\nmsgstr \"铁钥匙\"\n\n#. Key:\tD935FD314471404BAECA54BC3227D6E2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_69.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_69.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_69.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"There are too many unsuccessful golems.\"\nmsgstr \"失败的机器人太多了。\"\n\n#. Key:\tDE3287A345E1E317061B45B64AAA0836\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_34.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_34.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_34.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Your words remind me of something. Something which was important.\"\nmsgstr \"你的话让我想起了一些非常重要的事。\"\n\n#. Key:\tDEC8E5D548AECD6D48B449B51967301B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_115.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_115.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_115.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"One is guarded by my worst creation.\"\nmsgstr \"一个出自我手的最劣质的机器人守卫着。\"\n\n#. Key:\tDEFA219E40FE5384D8B1F0A1CFD3AAD4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_80.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_80.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_80.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"She were... She said...\"\nmsgstr \"她曾经...  她说...\"\n\n#. Key:\tE13D5CCE41818BAC4A6E52A965B0AEF8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_101.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_101.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_101.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Look at this!\"\nmsgstr \"看看这个！\"\n\n#. Key:\tE1CB9ABE410B3C818283BB9325F3A456\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_32.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_32.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_32.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I create golems. You go on with your quest. Nothing else matters.\"\nmsgstr \"我创建机器人。你继续你的追求。其它都无所谓。\"\n\n#. Key:\tE2AAAA4648BE8A7E73C761BDF72EC82D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_54.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_54.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_54.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Ruin caused too much damage.\"\nmsgstr \"毁灭造成了太多的损害。\"\n\n#. Key:\tE483CAFF4F7EF5607AA0A58F47EEF892\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_31.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_31.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_31.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"You are right. We are what we do. That keeps us alive.\"\nmsgstr \"你说的对。我们人名其名，并以此为生。\"\n\n#. Key:\tE9899191454A678E7C61B0A55047A725\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_126.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_126.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_126.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I'm glad you managed to defeat him and yet...\"\nmsgstr \"我很高兴你能打败他，但…\"\n\n#. Key:\tEA08D7B74E94A3D91DC825945916C312\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_102.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_102.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_102.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"One more Crystal for you!\"\nmsgstr \"再给你一颗水晶！\"\n\n#. Key:\tEAF5836D4D35812F14EABFA43C849947\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_117.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_117.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_117.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I know what you are up to. I would like to help but I fear I can’t do much.\"\nmsgstr \"我知道你在做什么。我很想帮忙，但恐怕帮不上什么忙。\"\n\n#. Key:\tEB0F70894E9A498111B9A9824589633B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_21.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I create Golems. I always did. I designed the most intelligent ones.\"\nmsgstr \"我创建机器人。这是我的日常。最智能的那批就是我设计的。\"\n\n#. Key:\tF0A1D18E463DCD0CADD67690F691481B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_27.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_27.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_27.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"There are some seeking a way to stop Ruin. They don't care about using spirits as slaves.\"\nmsgstr \"有些人在寻找阻止毁灭的方法。他们不在乎用幽魂做奴隶。\"\n\n#. Key:\tF10E8A9243616A85F71C01B0E57A2CC8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_105.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_105.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_105.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"And this is for you!\"\nmsgstr \"这是给你的！\"\n\n#. Key:\tF62B033A4054241E561B519B2AFFEBDB\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_22.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Do you mean those moving rock things out there?\"\nmsgstr \"你是说那些移动的石头吗?\"\n\n#. Key:\tF783A4F44E12EDA97EDF08B60228ED06\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_109.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_109.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_109.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"She had heart, she cared about what’s going on here. For the others we were like some interesting study.\"\nmsgstr \"她有一颗善良的心，她关心这里发生的一切。对其他人来说，我们就是一些有趣的研究内容。\"\n\n#. Key:\tF87968784C67FEEEBB78DBAD9D3C13F3\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_63.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_63.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_63.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"As for other materials I have no experience. Trust me you don’t want me to test out something on you for the first time.\"\nmsgstr \"至于其他材料，我没有经验。相信我，你不会希望我在你身上进行什么首次试验。\"\n\n#. Key:\tF9B8793C470BFE672214E1B82AE01B4E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_24.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_24.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_24.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Knowledge is lost. We are all lost.\"\nmsgstr \"失去了知识，我们还失去了方向。\"\n\n#. Key:\tF9DB2D444ADAC7A5C22AEC914EC7955F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(7).Children.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(7).Children.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(7).Children.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Artefacts\"\nmsgstr \"工艺品\"\n\n#. Key:\tFE7749AB4C91684B3438E7A1B5BF32D9\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_29.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_29.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_29.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"They can't do as they plan. Some of them don't even believe Ruin.\"\nmsgstr \"他们不能按计划行事。有些人甚至不相信毁灭。\"\n\n#. Key:\tFF2914834A91E2B6E8696FA828FC9F94\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_120.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_120.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_120.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Though it is guarded by the worst Golem I ever made: the Armour Wrath...\"\nmsgstr \"尽管它被我所造过的最糟糕的机器人守护着: 铠甲之怒……\"\n\n#. Key:\t303FE4BA4765B90E9239FEB43AE2264C\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/DwarvenCatacombs/DO1Altar.DO1Altar:DlgNode_Speech_1.Text\n#. /Game/SO/Dialogues/Wizard/DwarvenCatacombs/DO1Altar.DO1Altar:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Wizard/DwarvenCatacombs/DO1Altar.DO1Altar:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_DO1Altar\"\nmsgid \"Under section 1 of the first Act, an action of worship can not be aimed at any entity, god or divinity other than the Law itself.\"\nmsgstr \"根据第1法案第1节，崇拜行为不能针对任何实体、上帝或神性，而只能针对法律本身。\"\n\n#. Key:\t73BA4B474C4DCF6CD31469A9FF120D58\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/DwarvenCatacombs/DO1Altar1.DO1Altar1:DlgNode_Speech_1.Text\n#. /Game/SO/Dialogues/Wizard/DwarvenCatacombs/DO1Altar1.DO1Altar1:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Wizard/DwarvenCatacombs/DO1Altar1.DO1Altar1:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_DO1Altar1\"\nmsgid \"Under section 2 of the first Act... ??? There is section 3 of the first act, one would assume.\"\nmsgstr \"根据第1法案第2条…??? 人们一般会认为，是第1法案的第3条。\"\n\n#. Key:\t0D939EC3462DBDE895AD9F80CD4A9B99\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/DwarvenOutpost/DO1Arrive1DeadDwarves.DO1Arrive1DeadDwarves:DlgNode_Speech_6.Text\n#. /Game/SO/Dialogues/Wizard/DwarvenOutpost/DO1Arrive1DeadDwarves.DO1Arrive1DeadDwarves:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Wizard/DwarvenOutpost/DO1Arrive1DeadDwarves.DO1Arrive1DeadDwarves:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_DO1Arrive1DeadDwarves\"\nmsgid \"So they were the dwarfs who lived here.\"\nmsgstr \"他们就是住在这里的小矮人。\"\n\n#. Key:\t6E27805A491B0E0DEAC36F9189CA33F9\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/DwarvenOutpost/DO1Arrive1DeadDwarves.DO1Arrive1DeadDwarves:DlgNode_Speech_7.Text\n#. /Game/SO/Dialogues/Wizard/DwarvenOutpost/DO1Arrive1DeadDwarves.DO1Arrive1DeadDwarves:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Wizard/DwarvenOutpost/DO1Arrive1DeadDwarves.DO1Arrive1DeadDwarves:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_DO1Arrive1DeadDwarves\"\nmsgid \"I'm not sure why but I feel a bit of sorrow for them.\"\nmsgstr \"我不知道为什么，但我为他们感到有点难过。\"\n\n#. Key:\t7AD20FC74D56D0EE48CB5F92804EDAE5\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/DwarvenOutpost/DO1Arrive1DeadDwarves.DO1Arrive1DeadDwarves:DlgNode_Speech_4.Text\n#. /Game/SO/Dialogues/Wizard/DwarvenOutpost/DO1Arrive1DeadDwarves.DO1Arrive1DeadDwarves:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Wizard/DwarvenOutpost/DO1Arrive1DeadDwarves.DO1Arrive1DeadDwarves:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_DO1Arrive1DeadDwarves\"\nmsgid \"I wonder how you can tell them apart.\"\nmsgstr \"我不知道你怎么能把它们区分开来。\"\n\n#. Key:\tA6EB230647E9F8D38877FCA10CDE4875\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/DwarvenOutpost/DO1Arrive1DeadDwarves.DO1Arrive1DeadDwarves:DlgNode_Speech_8.Text\n#. /Game/SO/Dialogues/Wizard/DwarvenOutpost/DO1Arrive1DeadDwarves.DO1Arrive1DeadDwarves:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Wizard/DwarvenOutpost/DO1Arrive1DeadDwarves.DO1Arrive1DeadDwarves:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_DO1Arrive1DeadDwarves\"\nmsgid \"I knew these ones. That's Gwin and Traga, there's Krug...\"\nmsgstr \"这些我认识。那是格文和图拉格，还有库拉古...\"\n\n#. Key:\t2858D4314420FB59E8BDC18DB625DC1F\n#. SourceLocation:\t/Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_6.SpeechSequence(1).SpeechSequence.Text\n#. /Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_6.SpeechSequence(1).SpeechSequence.Text\n#: /Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_6.SpeechSequence(1).SpeechSequence.Text\nmsgctxt \"Dialogue_DO1Gate\"\nmsgid \"I think you may mistranslated a word or two...\"\nmsgstr \"我想你可能错译了一两个词……\"\n\n#. Key:\t2C08483A26080F0A003A02ADBE7A7D64\n#. SourceLocation:\t/Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_7.SpeechSequence(2).SpeechSequence.Text\n#. /Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_7.SpeechSequence(2).SpeechSequence.Text\n#: /Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_7.SpeechSequence(2).SpeechSequence.Text\nmsgctxt \"Dialogue_DO1Gate\"\nmsgid \"Dwarven letters are so similar...\"\nmsgstr \"矮人的语言字母如此相似……\"\n\n#. Key:\t2C09D69026080F0A003A02ADBE7A7D4E\n#. SourceLocation:\t/Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_8.SpeechSequence(2).SpeechSequence.Text\n#. /Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_8.SpeechSequence(2).SpeechSequence.Text\n#: /Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_8.SpeechSequence(2).SpeechSequence.Text\nmsgctxt \"Dialogue_DO1Gate\"\nmsgid \"Dwarven language is stupid, these signs could mean anything!\"\nmsgstr \"矮人的语言是愚蠢的，这些符号可能代表任何东西！\"\n\n#. Key:\t3D6EF5724190CE0AE579D69677BB8EAE\n#. SourceLocation:\t/Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_Speech_11.Text\n#. /Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_DO1Gate\"\nmsgid \"Associate!\"\nmsgstr \"结交！\"\n\n#. Key:\t4758A32043FC23B4DC3D82B35EFB0D24\n#. SourceLocation:\t/Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_Speech_9.Text\n#. /Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_DO1Gate\"\nmsgid \"The Doors of Dwar — Lord of Dwartown. Speak, associate, and enter.\"\nmsgstr \"矮人之门 - 矮人城之主。对话，结交，进入。\"\n\n#. Key:\t475CE3E94BA77F7596A7D8931D4D16C7\n#. SourceLocation:\t/Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_7.SpeechSequence(1).SpeechSequence.Text\n#. /Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_7.SpeechSequence(1).SpeechSequence.Text\n#: /Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_7.SpeechSequence(1).SpeechSequence.Text\nmsgctxt \"Dialogue_DO1Gate\"\nmsgid \"Are you sure that is what you just read?\"\nmsgstr \"你确定这是你刚读到的吗？\"\n\n#. Key:\t530C8841437C531647717B8B0BC07210\n#. SourceLocation:\t/Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_8.SpeechSequence(1).SpeechSequence.Text\n#. /Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_8.SpeechSequence(1).SpeechSequence.Text\n#: /Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_8.SpeechSequence(1).SpeechSequence.Text\nmsgctxt \"Dialogue_DO1Gate\"\nmsgid \"Nice try...\"\nmsgstr \"干得不错...\"\n\n#. Key:\t543858DE49FD03BF4F94C3BA47912E5E\n#. SourceLocation:\t/Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_9.SpeechSequence(1).SpeechSequence.Text\n#. /Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_9.SpeechSequence(1).SpeechSequence.Text\n#: /Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_9.SpeechSequence(1).SpeechSequence.Text\nmsgctxt \"Dialogue_DO1Gate\"\nmsgid \"I have to practice my Dwarven a bit more...!\"\nmsgstr \"我得多练习一下我的小矮人……!\"\n\n#. Key:\t5923FB9C4DC255ABAA6059B64B806802\n#. SourceLocation:\t/Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_6.SpeechSequence(3).SpeechSequence.Text\n#. /Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_6.SpeechSequence(3).SpeechSequence.Text\n#: /Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_6.SpeechSequence(3).SpeechSequence.Text\nmsgctxt \"Dialogue_DO1Gate\"\nmsgid \"I am going to open this door somehow.\"\nmsgstr \"我要设法打开这扇门。\"\n\n#. Key:\t7CF38D834DB6A7265EDE19AD158BFEBF\n#. SourceLocation:\t/Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_7.SpeechSequence(0).SpeechSequence.Text\n#. /Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_7.SpeechSequence(0).SpeechSequence.Text\n#: /Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_7.SpeechSequence(0).SpeechSequence.Text\nmsgctxt \"Dialogue_DO1Gate\"\nmsgid \"I want a Schnauser with my Wienerschnitzel\"\nmsgstr \"我要一份带香肠的瑞士香肠\"\n\n#. Key:\t86311C104780BDB8A170538987EF7226\n#. SourceLocation:\t/Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_8.SpeechSequence(0).SpeechSequence.Text\n#. /Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_8.SpeechSequence(0).SpeechSequence.Text\n#: /Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_8.SpeechSequence(0).SpeechSequence.Text\nmsgctxt \"Dialogue_DO1Gate\"\nmsgid \"And on the day the Ball is set free, the gate opens and happiness finds everyone...\"\nmsgstr \"在球被释放的那一天，大门将打开，幸福洒向每一个人……\"\n\n#. Key:\tCD68B2244B57CA37D2940499F440149B\n#. SourceLocation:\t/Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_Speech_10.Text\n#. /Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_DO1Gate\"\nmsgid \"Associwhat?\"\nmsgstr \"结交什么？\"\n\n#. Key:\tCE8E75E6422C068794CC91BDBA2C024A\n#. SourceLocation:\t/Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_6.SpeechSequence(2).SpeechSequence.Text\n#. /Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_6.SpeechSequence(2).SpeechSequence.Text\n#: /Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_6.SpeechSequence(2).SpeechSequence.Text\nmsgctxt \"Dialogue_DO1Gate\"\nmsgid \"Damn, my Dwarven is just not good enough, I have to practice a bit more...\"\nmsgstr \"该死，我的小矮人还不够好，我得多练习一下……\"\n\n#. Key:\tCED9C6ED4B792FA939C759A79E4AB028\n#. SourceLocation:\t/Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_6.SpeechSequence(0).SpeechSequence.Text\n#. /Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_6.SpeechSequence(0).SpeechSequence.Text\n#: /Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_6.SpeechSequence(0).SpeechSequence.Text\nmsgctxt \"Dialogue_DO1Gate\"\nmsgid \"There is sauerkraut in my Lederhosen\"\nmsgstr \"我的皮短裤里有泡菜\"\n\n#. Key:\tEC493B624D127AB87692BC983023FF18\n#. SourceLocation:\t/Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_7.SpeechSequence(3).SpeechSequence.Text\n#. /Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_7.SpeechSequence(3).SpeechSequence.Text\n#: /Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_7.SpeechSequence(3).SpeechSequence.Text\nmsgctxt \"Dialogue_DO1Gate\"\nmsgid \"There must be a way to open this door...\"\nmsgstr \"一定有办法打开这扇门……\"\n\n#. Key:\t6F5AF3DD4E848650EE74449420A90A25\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/DwarvenCatacombs/DO1Tomb.DO1Tomb:DlgNode_Speech_1.Text\n#. /Game/SO/Dialogues/Wizard/DwarvenCatacombs/DO1Tomb.DO1Tomb:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Wizard/DwarvenCatacombs/DO1Tomb.DO1Tomb:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_DO1Tomb\"\nmsgid \"These are the orders of the Chancellor of Dwartown, unjustly murdered by order of Duality.\"\nmsgstr \"这是矮人镇议长的命令，他被二元性不公平地杀害了。\"\n\n#. Key:\t949EBB7A4FCEA61BB9B3589CFCC53C2B\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/DwarvenCatacombs/DO1Tomb1.DO1Tomb1:DlgNode_Speech_1.Text\n#. /Game/SO/Dialogues/Wizard/DwarvenCatacombs/DO1Tomb1.DO1Tomb1:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Wizard/DwarvenCatacombs/DO1Tomb1.DO1Tomb1:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_DO1Tomb1\"\nmsgid \"Here lies the testament of the order of Duality, justly murdered by the Chancellor of Dwartown's spirit.\"\nmsgstr \"这里有着二元秩序的证明，被矮人镇的灵魂议长公正地谋杀了。\"\n\n#. Key:\t110A2E27493EBAD78EE6E1B16F56912A\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E3/E3_Start.E3_Start:DlgNode_Speech_2.Text\n#. /Game/SO/Dialogues/Ending/E3/E3_Start.E3_Start:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E3/E3_Start.E3_Start:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_E3_Start\"\nmsgid \"I survived the Unknown. I know how to use the Device, but...\"\nmsgstr \"我从未知中幸存了下来。我知道怎么用这个设备，但是…\"\n\n#. Key:\t2CB853A540A2B5BFD268DEAA124CEAD0\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E3/E3_Start.E3_Start:DlgNode_Speech_7.Text\n#. /Game/SO/Dialogues/Ending/E3/E3_Start.E3_Start:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Ending/E3/E3_Start.E3_Start:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_E3_Start\"\nmsgid \"I need to choose one last time. Once and for all.\"\nmsgstr \"我需要最后选一次。一劳永逸。\"\n\n#. Key:\t416D47B6408622D8D01F61961C80ADD2\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E3/E3_Start.E3_Start:DlgNode_Speech_3.Text\n#. /Game/SO/Dialogues/Ending/E3/E3_Start.E3_Start:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E3/E3_Start.E3_Start:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_E3_Start\"\nmsgid \"I have already lost almost everything.\"\nmsgstr \"我几乎已经失去了一切。\"\n\n#. Key:\t75F863B843B253E3586DE991CDE546EA\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E3/E3_Start.E3_Start:DlgNode_Speech_1.Text\n#. /Game/SO/Dialogues/Ending/E3/E3_Start.E3_Start:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Ending/E3/E3_Start.E3_Start:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_E3_Start\"\nmsgid \"And here I am again. Is this how it will end?\"\nmsgstr \"我又来了。这就是结局吗?\"\n\n#. Key:\t77BC194943A148967299F68B3522C696\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E3/E3_Start.E3_Start:DlgNode_Speech_4.Text\n#. /Game/SO/Dialogues/Ending/E3/E3_Start.E3_Start:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Ending/E3/E3_Start.E3_Start:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_E3_Start\"\nmsgid \"Do I really have to lose everyone I met in the Ruined Realm?\"\nmsgstr \"我真的要失去我在毁灭王国中遇到的每一个人吗?\"\n\n#. Key:\tA50B792A4D68EC45BB9C3CBBF8836021\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E3/E3_Start.E3_Start:DlgNode_Speech_5.Text\n#. /Game/SO/Dialogues/Ending/E3/E3_Start.E3_Start:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Ending/E3/E3_Start.E3_Start:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_E3_Start\"\nmsgid \"Or would I only save them so that we can die together?\"\nmsgstr \"或者我只拯救他们，让我们一起死去?\"\n\n#. Key:\tE43A08E14831EBDC50AFC0B4A3178817\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E3/E3_Start.E3_Start:DlgNode_Speech_6.Text\n#. /Game/SO/Dialogues/Ending/E3/E3_Start.E3_Start:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Ending/E3/E3_Start.E3_Start:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_E3_Start\"\nmsgid \"I can hear the people outside the tower. I don’t have much time.\"\nmsgstr \"我能听到塔外的人们的声音。我没有太多的时间。\"\n\n#. Key:\t042B7F534C07B3EC75BA9BA8F0BA7926\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_5.Children(0).Children.Text\n#. /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_5.Children(0).Children.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_5.Children(0).Children.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"Worthy?\"\nmsgstr \"值得的？\"\n\n#. Key:\t05E334DE42BAA89837B78B8F0F1CBD93\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_13.Text\n#. /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"Get some rest and try again later.\"\nmsgstr \"休息一下，稍后再试。\"\n\n#. Key:\t0BD769F745B35A106C7C0A83F6F9F246\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_14.Text\n#. /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"All right so you just teleported me to this... what is this place?\"\nmsgstr \"好吧，你刚才把我传送到这个…  这是什么鬼地方?\"\n\n#. Key:\t0C9ECC3745963AB1D1FB6487E97513F9\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_24.Text\n#. /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_24.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_24.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"So right now this is the most proper place to test your Worthiness.\"\nmsgstr \"所以现在这是最适合测试你价值的地方。\"\n\n#. Key:\t1401CBDA425076C6AE74C9BF4558D8DD\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_15.Text\n#. /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"You are not Worthy!\"\nmsgstr \"你没什么价值！\"\n\n#. Key:\t21C3C1394F39821BC10FFFBE157AC5CF\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_10.Text\n#. /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"Giving up is not an option.\"\nmsgstr \"放弃是不可能的。\"\n\n#. Key:\t2E7222EA4858A0ADE9CE3C84CA27B993\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_5.Children(3).Children.Text\n#. /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_5.Children(3).Children.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_5.Children(3).Children.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"Skip\"\nmsgstr \"跳过\"\n\n#. Key:\t31BEA1764BA337B32B8038B31BE69C29\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_9.Text\n#. /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"Farewell! I need to go now.\"\nmsgstr \"再见！我得走了。\"\n\n#. Key:\t36B9EA924E623AFE9BF0B98402235EA4\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_28.Text\n#. /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"Focus on the trial!\"\nmsgstr \"专注于审判！\"\n\n#. Key:\t4A4A86684E5C5742A70FE383461AD89C\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_21.Text\n#. /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"Venture further down into the Sewer! You will find the answer.\"\nmsgstr \"再往下水道里冒险! 你会找到答案的。\"\n\n#. Key:\t54CA97394FDC12D0370C54995094819E\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_3.Text\n#. /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"This trial will test your limits!\"\nmsgstr \"这次审判将考验你的极限！\"\n\n#. Key:\t5D820AA647AE2540DE6C2D8D6F6BF88A\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_5.Children(4).Children.Text\n#. /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_5.Children(4).Children.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_5.Children(4).Children.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"Give seat\"\nmsgstr \"给予座位\"\n\n#. Key:\t5F6629ED4E0857BBBA46ED9C51306215\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_5.Children(2).Children.Text\n#. /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_5.Children(2).Children.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_5.Children(2).Children.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"Restore\"\nmsgstr \"恢复\"\n\n#. Key:\t618B587743F2F432D9D487AE0E909166\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_4.Text\n#. /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"What?\"\nmsgstr \"什么？\"\n\n#. Key:\t61D61006436DD6659A8846932697971A\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_19.Text\n#. /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"Yes, you are!\"\nmsgstr \"是的，你是！\"\n\n#. Key:\t6225912A49C32068D10ADB9C31A6BA3E\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_12.Text\n#. /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"Of course!\"\nmsgstr \"当然！\"\n\n#. Key:\t7DD5FF4D47DF6A461D44DDBA056A4100\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_16.Text\n#. /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"I shall yield you to the right path!\"\nmsgstr \"我要让你走上正确的道路！\"\n\n#. Key:\t8C3F3A364544B13A2C6687A99E6A792B\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_8.Text\n#. /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"I'm fed up with your trial! Just teleport me back.\"\nmsgstr \"我受够了你的审判! 把我传送回去。\"\n\n#. Key:\t903D03CE41FD835E75059587288D9A1B\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_23.Text\n#. /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_23.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_23.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"There used to be an Arena here to test the Adventurers of the Realm, but it has been flooded with water for a hundred years.\"\nmsgstr \"这里曾经有一个竞技场用来测试王国的冒险者，但它已经被水淹了100年。\"\n\n#. Key:\t96C9A8DA496C0A8476E35AB942BE5EED\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_6.Text\n#. /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"Am I Worthy?\"\nmsgstr \"我有价值吗？\"\n\n#. Key:\t9826B62E48A67772A1850CADF1A83729\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_5.Children(1).Children.Text\n#. /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_5.Children(1).Children.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_5.Children(1).Children.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"Where are we?\"\nmsgstr \"我们在哪儿？\"\n\n#. Key:\t9A94E4FC46E3896BE05136A2A9EA4AF5\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_27.Text\n#. /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_27.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_27.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"We don't have time for this now.\"\nmsgstr \"我们现在没有时间。\"\n\n#. Key:\t9B9B02AF404F9B8B9D8722A9006FC907\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_22.Text\n#. /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"These are the remnants of the Ancient Sewer.\"\nmsgstr \"这些是古代下水道的遗迹。\"\n\n#. Key:\tAAB9F101475D1407B58BECB2DA5E508D\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_20.Text\n#. /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"So how am I supposed to complete your Trial?\"\nmsgstr \"那我怎么才能完成你的试验呢?\"\n\n#. Key:\tAD3BADD6499C01410511E68C86F337C8\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_2.Text\n#. /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"Your Worthiness has to be proven.\"\nmsgstr \"你的价值需要被证明。\"\n\n#. Key:\tC0BA510B4875AD24C53663B01964B309\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_11.Text\n#. /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"Go now, the Trial awaits you!\"\nmsgstr \"去吧，审判在等着你！\"\n\n#. Key:\tC252181740C4E256EDEB29B6B552BDD2\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_7.Text\n#. /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"I'm tired, I will need some time to recover.\"\nmsgstr \"我累了，我需要一些时间来恢复。\"\n\n#. Key:\tCCD8D1DD4859B067482612A3A9F32C06\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_5.Children(5).Children.Text\n#. /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_5.Children(5).Children.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_5.Children(5).Children.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"Leave\"\nmsgstr \"离开\"\n\n#. Key:\tCE0C3EBD41F17E82F8CF0E8D5E5E9F17\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_1.Text\n#. /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"The Worthiness is strong in this one...\"\nmsgstr \"这个价值是很强的…\"\n\n#. Key:\tD229B47146585D051BEFF493C53ED01B\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_26.Text\n#. /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_26.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_26.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"Stop!\"\nmsgstr \"停！\"\n\n#. Key:\tF043B1BF47F617255071EC9DB44CB78A\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_17.Text\n#. /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"You have proven yourself Worthy!\"\nmsgstr \"你已经证明了自己的价值！\"\n\n#. Key:\tFBBCA0E043F139F203D62DAD1599143E\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_18.Text\n#. /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"Your Worthiness has been proven again!\"\nmsgstr \"你的价值再次被证明了！\"\n\n#. Key:\tFE4F99AC4F23760ADD203083CA1497E3\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_25.Text\n#. /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_25.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_25.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"I have found a...\"\nmsgstr \"我找到一个...\"\n\n#. Key:\t00AD8B3D44461E4DBF800F92DDF0C6F5\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_13.Text\n#. /Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_Gatekeeper_AfterBattle\"\nmsgid \"What?! I understand that for a new gate to open one would have to prove something, but... in this case... I accept that...\"\nmsgstr \"什么? ! 我知道要打开一扇新的大门，必须要证明什么，但是……在这种情况下……我承认……\"\n\n#. Key:\t0EC6953C4F07CFF6B7A13A9BCF224550\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_1.Text\n#. /Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_Gatekeeper_AfterBattle\"\nmsgid \"Enough!\"\nmsgstr \"够了！\"\n\n#. Key:\t237714F14DC3F9D33F10E6B7761E47C4\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_9.Text\n#. /Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_Gatekeeper_AfterBattle\"\nmsgid \"What a coincidence! I also happen to be heading in that direction.\"\nmsgstr \"太巧了！我也正朝着那个方向前进。\"\n\n#. Key:\t28054AA74F9CEA976E653ABF5A5F5695\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_11.Text\n#. /Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_Gatekeeper_AfterBattle\"\nmsgid \"You can pass.\"\nmsgstr \"你能通过。\"\n\n#. Key:\t3D5BAB214968DBB31BE03EBE32B2DE6C\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_7.Text\n#. /Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_Gatekeeper_AfterBattle\"\nmsgid \"Farewell my Ball Lord! May the Great Gate open for you when the time comes!\"\nmsgstr \"再见了，我的球主！愿伟大的大门在那一刻为你敞开！\"\n\n#. Key:\t4D497F814F476FFA7F2A66A937EAFF3E\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_16.Text\n#. /Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_Gatekeeper_AfterBattle\"\nmsgid \"Noooooo...\"\nmsgstr \"不.........\"\n\n#. Key:\t4FEA82084C2E2E09FE6699B2FB353E04\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_10.Text\n#. /Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_Gatekeeper_AfterBattle\"\nmsgid \"Could you just let me pass? Please?\"\nmsgstr \"你能让我过去吗? 拜托了好吗?\"\n\n#. Key:\t50005F6248946893250282B0B7D134F2\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_2.Text\n#. /Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_Gatekeeper_AfterBattle\"\nmsgid \"You have proved your Worthiness.\"\nmsgstr \"你证明了你的价值。\"\n\n#. Key:\t601E1BAC4E9C7A93B7A97AA787C14027\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_8.Text\n#. /Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_Gatekeeper_AfterBattle\"\nmsgid \"Farewell, Keeper!\"\nmsgstr \"再见了，守护者！\"\n\n#. Key:\t758788864E716DB2EC9F57B3042DC129\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_4.Text\n#. /Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_Gatekeeper_AfterBattle\"\nmsgid \"Ask him to take you to Crossroad Cave.\"\nmsgstr \"让他带你去十字路口的洞穴。\"\n\n#. Key:\t8170CF2C42A1894899BA98B33AB39A3F\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_15.Text\n#. /Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_Gatekeeper_AfterBattle\"\nmsgid \"Wait! What?\"\nmsgstr \"等等！什么？\"\n\n#. Key:\t86B7E3D34F2206BB44B0F88001F9E8BA\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_14.Text\n#. /Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_Gatekeeper_AfterBattle\"\nmsgid \"Then if you accept, let the trial begin!\"\nmsgstr \"如果你接受，就开始审判吧！\"\n\n#. Key:\tCC7215014B87E0910413F1AEECE0492F\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_3.Text\n#. /Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_Gatekeeper_AfterBattle\"\nmsgid \"Where do you want to go, Sir? Command me.\"\nmsgstr \"先生，您想去哪儿? 给我指令。\"\n\n#. Key:\tD5FBCE5C4C97766EF3A852A2D96D1D30\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_5.Text\n#. /Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_Gatekeeper_AfterBattle\"\nmsgid \"Crossroad Cave!\"\nmsgstr \"十字路口的洞穴\"\n\n#. Key:\tE0032A09440BDE56BFAF2CBDBCFA2074\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_6.Text\n#. /Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_Gatekeeper_AfterBattle\"\nmsgid \"So be it!\"\nmsgstr \"诚心所愿\"\n\n#. Key:\tE8148F28483300CCD24473A30C028235\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_12.Text\n#. /Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_Gatekeeper_AfterBattle\"\nmsgid \"Once you have proven Worthy.\"\nmsgstr \"一旦你被证明是有价值的。\"\n\n#. Key:\t0BE62CA44198CAA4B4AF7D844B79EEC3\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_3.Children(2).Children.Text\n#. Key:\t17D2B5D7409FBE7F215265B5A8CBF8F8\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_21.Children(2).Children.Text\n#. /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_3.Children(2).Children.Text\n#. /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_21.Children(2).Children.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_21.Children(2).Children.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_3.Children(2).Children.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"Leave\"\nmsgstr \"离开\"\n\n#. Key:\t2BFD355626080F0A003A025ABE793045\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_21.Children(0).Children.Text\n#. Key:\t2BFEA3D826080F0A003A025ABE79300B\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_3.Children(0).Children.Text\n#. Key:\t2C027C7626080F0A003A025ABE793F5F\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_18.Children(0).Children.Text\n#. /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_21.Children(0).Children.Text\n#. /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_3.Children(0).Children.Text\n#. /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_18.Children(0).Children.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_18.Children(0).Children.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_21.Children(0).Children.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_3.Children(0).Children.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"Accept Challenge\"\nmsgstr \"接受挑战\"\n\n#. Key:\t2EDD3BEF4707FD59FE1ACB9A105F7EFC\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_3.Children(1).Children.Text\n#. /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_3.Children(1).Children.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_3.Children(1).Children.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"Give seat\"\nmsgstr \"给予座位\"\n\n#. Key:\t4E4229704C95B2C73050E1AF65A29847\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_21.Text\n#. /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"Did you come back to prove yourself?\"\nmsgstr \"你回来是为了证明你自己吗?\"\n\n#. Key:\t55B70B0345422648BB579C8D4E42FE86\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_18.Children(1).Children.Text\n#. /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_18.Children(1).Children.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_18.Children(1).Children.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"Maybe later\"\nmsgstr \"也许再过会儿\"\n\n#. Key:\t62E33EC84A508E57233A6A9AF6DCDFBC\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_3.Text\n#. /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"Only if you prove yourself worthy one more time.\"\nmsgstr \"除非你能再次证明自己的价值。\"\n\n#. Key:\t65A8C3BA420B4624960CBAB42930BB5F\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_13.Children(0).Children.Text\n#. /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_13.Children(0).Children.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_13.Children(0).Children.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"Not fair\"\nmsgstr \"不公平\"\n\n#. Key:\t688C407641B488D0FDC7F98D0F6CA826\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_11.Text\n#. /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"Is that... is this really happening?\"\nmsgstr \"是……这是真的吗?\"\n\n#. Key:\t77A739594D7ADA997DD300A7EE270D8F\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_5.Text\n#. /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"I have found a seat that fits your size.\"\nmsgstr \"我找到了一个适合你尺码的座位。\"\n\n#. Key:\t8C9BCD2044EE9C5F4826D0B5C5CE22D4\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_20.Text\n#. /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"Now... are you ready to prove yourself?\"\nmsgstr \"现在… 你准备好证明你自己了吗?\"\n\n#. Key:\t8E33C12A42E9EAEDC20CD3B97F3AF9B2\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_2.Text\n#. /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"Yes, I can.\"\nmsgstr \"是的，我能。\"\n\n#. Key:\t91849BD64325E5B9D8A366921D4D1AA9\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_13.Text\n#. /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"The best challenges were set aside just for you!\"\nmsgstr \"最好的挑战都留给了你！\"\n\n#. Key:\t97D5940549A753A94A9F5AB46CCE14AF\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_9.Text\n#. /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"I myself shall test your worthiness.\"\nmsgstr \"我要亲自考验你的价值。\"\n\n#. Key:\t9A158FA74FF1D9F99F5477856927AC90\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_17.Text\n#. /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"I will make no exceptions! Your generous act gave me back my spirit. From now on I pledge to perform my task even better.\"\nmsgstr \"我不会有任何例外! 你慷慨地把我的精灵还给了我。从现在起，我保证要更好地完成我的任务。\"\n\n#. Key:\tA3863AD64404451005ECE392B123FFAE\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_22.Text\n#. /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"Errr... maybe a bit later.\"\nmsgstr \"哦…… 也许过一会儿吧。\"\n\n#. Key:\tAB2F0FFA45E0AF42B6035FA3D1F2D8DB\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_12.Text\n#. /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"I am truly impressed. I will never forget about your kindness.\"\nmsgstr \"我真的很感动。我永远不会忘记你的好意。\"\n\n#. Key:\tB284259646C0236570CF489DDCD88A29\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_18.Text\n#. /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"Are you ready to prove yourself?\"\nmsgstr \"你准备好证明你自己了吗?\"\n\n#. Key:\tB57F0D0442C167DADE576A9CBD2B3E96\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_19.Text\n#. /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"Thank you! You can have this RuneStone as a compensation.\"\nmsgstr \"谢谢你！你可以用这个符石作为补偿。\"\n\n#. Key:\tB5F8117A4514A4207059EF8CD1C59420\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_4.Text\n#. /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"All right, let's do it!\"\nmsgstr \"好吧，我们开始吧！\"\n\n#. Key:\tC7DFED0F43E17F90C02E3D94D6F24200\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_15.Text\n#. /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"What? Can't you just open that gate?\"\nmsgstr \"什么? 你不能打开那扇门吗?\"\n\n#. Key:\tCC1CBB8E4F710B337B3BCC8CB01DB8CE\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_16.Text\n#. /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"Well that's very... kind of you, I guess.\"\nmsgstr \"你... 真是太好了。\"\n\n#. Key:\tDE0225744DA0777DC12392ABB187D653\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_1.Text\n#. /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"Keeper! Can you open a Portal?\"\nmsgstr \"守护者！你能打开一个入口吗？\"\n\n#. Key:\tDF53D02F4A6CD307A559E5BADBEF22FA\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_13.Children(1).Children.Text\n#. /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_13.Children(1).Children.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_13.Children(1).Children.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"You are welcome\"\nmsgstr \"不客气\"\n\n#. Key:\tF0A6481A46B5FC65944D35ABFE94FA7E\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_21.Children(1).Children.Text\n#. /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_21.Children(1).Children.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_21.Children(1).Children.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"Give Seat\"\nmsgstr \"给予座位\"\n\n#. Key:\tFF3C850143B6609D7B1B878B8DEB8A13\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_8.Text\n#. /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"This is your final trial.\"\nmsgstr \"这是对你的最后审判。\"\n\n#. Key:\t018CF7BC4272B09AF7B646B0F9B2EB11\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_55.Text\n#. /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_55.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_55.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"How did it happen? How was everything destroyed?\"\nmsgstr \"这是怎么发生的? 一切是如何毁灭的?\"\n\n#. Key:\t0BF674C94942E4E32FCB09BD7E7059B0\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_23.Text\n#. /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_23.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_23.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"Those who stayed died.\"\nmsgstr \"那些留下来的人都死了。\"\n\n#. Key:\t1BFE1DBE471281F60970F8BEBFDD6E40\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_14.Text\n#. /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"It’s nice of the Mirror that he still remembers me. Could you give this flower to him to express my thankfulness?\"\nmsgstr \"他还记得我，真是太好了。你能把这朵花送给他以表达我的谢意吗?\"\n\n#. Key:\t2158D7A1470944D529FF138AB883DC10\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_20.Text\n#. /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"Who lived in this Realm? Where are they now?\"\nmsgstr \"谁住在这个王国里? 他们现在在哪里?\"\n\n#. Key:\t2CCCBA97402EEFD5248D929680B0FF01\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_26.Text\n#. /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_26.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_26.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"What was the Realm like before?\"\nmsgstr \"以前的王国是什么样的?\"\n\n#. Key:\t32DA4503499D5A01CB1E7DA7B51B4EB5\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_29.Text\n#. /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_29.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_29.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"Majestic castles and towers up until the sky. The air fresh, the sun shining.\"\nmsgstr \"宏伟的城堡和塔直耸天空。空气清新，阳光明媚。\"\n\n#. Key:\t35903E9F471EECEC779D879565E189B6\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_12.Children(1).Children.Text\n#. /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_12.Children(1).Children.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_12.Children(1).Children.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"Who lived here?\"\nmsgstr \"谁住在这里?\"\n\n#. Key:\t3AD2CA8148AA6397B3D8818063269D67\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_14.Children(1).Children.Text\n#. /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_14.Children(1).Children.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_14.Children(1).Children.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"No way\"\nmsgstr \"没门\"\n\n#. Key:\t3D4AF37842FD602384F0C79F2949BD07\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_14.Children(0).Children.Text\n#. /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_14.Children(0).Children.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_14.Children(0).Children.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"Of course\"\nmsgstr \"当然\"\n\n#. Key:\t41B0D00048A85B7122834B8F731AA8B4\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_25.Text\n#. /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_25.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_25.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"Ruin preserves them. They can’t get old and die. Some of them are still visiting these parts of the Realm, but they no longer know what they are looking for.\"\nmsgstr \"毁灭会保存他们。他们不会变老或死亡。他们中的一些人仍然会来到这些地区，但他们不再知道他们在寻找什么。\"\n\n#. Key:\t47D0395F4DD63A6E2F68018719DC2CCD\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_6.Text\n#. /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"Thank you!\"\nmsgstr \"多谢！\"\n\n#. Key:\t57614F674FD8F9A5CF8CC0AFA4D57F37\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_12.Children(0).Children.Text\n#. /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_12.Children(0).Children.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_12.Children(0).Children.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"Magic Mirror\"\nmsgstr \"魔镜\"\n\n#. Key:\t5B00385B409CA39C5F2AFDA0E75EC4A0\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_16.Text\n#. /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"I'm not a postman. Find someone else!\"\nmsgstr \"我不是邮递员。找别人！\"\n\n#. Key:\t5C83B0604CB1616D07BE209C08AE57B6\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_27.Text\n#. /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_27.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_27.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"It was a wonderful world, full of life and joy.\"\nmsgstr \"这是一个奇妙的世界，充满了生命和欢乐。\"\n\n#. Key:\t66409DBC4D55F6190D6F429F81CE7C0F\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_12.Children(2).Children.Text\n#. /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_12.Children(2).Children.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_12.Children(2).Children.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"Realm's past\"\nmsgstr \"王国的过去\"\n\n#. Key:\t6728BD15433EBCF47B42DA8D84F3777C\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_9.Text\n#. /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"I'll remember you!\"\nmsgstr \"我会记得你的！\"\n\n#. Key:\t764C9E864C4C345638C2A2B4019CE5FA\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_17.Text\n#. /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"Sure, I will deliver the flower!\"\nmsgstr \"当然，我会送花的！\"\n\n#. Key:\t7F42828D4976A3366581BE9E067F3982\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_24.Text\n#. /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_24.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_24.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"Those who escaped changed in body and mind.\"\nmsgstr \"逃跑的人身心都变了。\"\n\n#. Key:\t858E8AD741D48CFB58B94ABA5A6FCE9A\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_18.Text\n#. /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"No problem. It doesn’t matter anyway.\"\nmsgstr \"没有问题。反正也没关系。\"\n\n#. Key:\t86DBF2164E3B1C4057320E8FC526AE5F\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_12.Children(3).Children.Text\n#. /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_12.Children(3).Children.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_12.Children(3).Children.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"Cataclysm\"\nmsgstr \"大灾难\"\n\n#. Key:\t8C0E746A4C00A7B4792706A042588AA3\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_58.Text\n#. /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_58.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_58.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"Until one day many of the imprisoned spirits broke loose from the golem bodies.\"\nmsgstr \"直到有一天，许多被囚禁的灵魂从机器人的身体中挣脱出来。\"\n\n#. Key:\t8DCB54DC429D8E328B791FA18261EBE4\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_30.Text\n#. /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_30.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_30.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"Until it was all gone.\"\nmsgstr \"直到它全部消失。\"\n\n#. Key:\t933737274ACAC51A980A6985E9B985D2\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_12.Text\n#. /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"I am here so that the past is not forgotten until the very end. Have some rest and remember!\"\nmsgstr \"我在这里，是为了不到最后时刻就不会忘记过去。记住吧，休息一下!\"\n\n#. Key:\t9A6C35C143F4B6845772D4AF6C4C6213\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_56.Text\n#. /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_56.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_56.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"The Golem Makers went too far. They made thousands and thousands of golems.\"\nmsgstr \"机器人制作者太过分了，他们制作了成千上万的机器人。\"\n\n#. Key:\t9E254E4D4CA6D256A7EC8CA8ADC6EF19\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_10.Text\n#. /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"Would you like to hear some other tales?\"\nmsgstr \"你想听其他故事吗?\"\n\n#. Key:\tAC50E6794072B525FD9144AB9B722F74\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_57.Text\n#. /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_57.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_57.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"They always cared about the new ones and forgot about the obsolete ones.\"\nmsgstr \"他们总是关注新的机器人，而遗忘了旧的那批。\"\n\n#. Key:\tC03F20E6477984A6691145A40535FBBD\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_60.Text\n#. /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_60.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_60.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"Is there anything else you want me to remember?\"\nmsgstr \"你还想让我记住什么?\"\n\n#. Key:\tC9E74A374ED9F47999AA56BD16466899\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_28.Text\n#. /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"The streets were clear and bright, trees and flowers everywhere.\"\nmsgstr \"街道干净明亮，花草树木随处可见。\"\n\n#. Key:\tCF0209FF4BC57A750F52F2B3CC710A6E\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_13.Text\n#. /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"I think it likes you.\"\nmsgstr \"我想它喜欢你。\"\n\n#. Key:\tD11D82FA4AE733D55DCBA692A2A3C0C7\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_22.Text\n#. /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"Now they are all gone.\"\nmsgstr \"现在他们都走了。\"\n\n#. Key:\tD88C72AE460756D4B619D7B8F924C7BB\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_21.Text\n#. /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"Oh, there were many: proud, wise, brave, clever and majestic.\"\nmsgstr \"哦，有很多: 骄傲的，聪明的，勇敢的，聪明的以及庄严的。\"\n\n#. Key:\tDEA408E54892798F0112B0A92EE34D3A\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_12.Children(4).Children.Text\n#. /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_12.Children(4).Children.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_12.Children(4).Children.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"Leave\"\nmsgstr \"离开\"\n\n#. Key:\tEA384D06419AAB835765CF8D6ECE6495\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_59.Text\n#. /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_59.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_59.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"They are what is now called Ruin. The power which is destroying the Realm.\"\nmsgstr \"他们就是现在所说的毁灭。摧毁王国的一种力量。\"\n\n#. Key:\tED8571C94BCCF0F083CAD2A7439C10AA\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_1.Text\n#. /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"I’ve met with a Magic Mirror who showed a picture of you.\"\nmsgstr \"我见过一面魔镜，里面有你的照片。\"\n\n#. Key:\tF5C7F8254D29767753AEA3AB446B9B6E\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_8.Text\n#. /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"I've got to go now.\"\nmsgstr \"我得走了。\"\n\n#. Key:\tF9E140154471CC466095ADBFF652E94D\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_11.Text\n#. /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"Ask if you need to know more. I'll remember.\"\nmsgstr \"如果你想知道更多就提问。我会记得。\"\n\n#. Key:\t04527B3745611117185CC09C4CD9018E\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_12.Text\n#. /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"That’s more like it!\"\nmsgstr \"这才像话！\"\n\n#. Key:\t11C31D4D4DFD60259D68FCB3CD8E641E\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_13.Children(2).Children.Text\n#. /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_13.Children(2).Children.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_13.Children(2).Children.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"Retreat\"\nmsgstr \"撤退\"\n\n#. Key:\t29C3FE594DDD364CEED5EA9304BFAC43\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_16.Text\n#. /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"How can I prove that I'm worthy?\"\nmsgstr \"我怎样才能证明我的价值?\"\n\n#. Key:\t2BC9EBB6451DB66B7767F1A0B663A06D\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_8.Text\n#. /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"That’s awful, let’s try it in a different tone.\"\nmsgstr \"太糟糕了，我们换一种语气试试。\"\n\n#. Key:\t2BD75DF026080F0A003A0178BE75C345\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_1.Text\n#. /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"Behold traveler!\"\nmsgstr \"瞧好了，旅行者！\"\n\n#. Key:\t302884BD4A306FB9614C51AF4790FAE4\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_13.Children(0).Children.Text\n#. /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_13.Children(0).Children.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_13.Children(0).Children.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"How to prove?\"\nmsgstr \"如何证明?\"\n\n#. Key:\t370AC3D04CB9F6E443CAC2A8E270F289\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_18.Text\n#. /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"No problem I don't really want to pass that gate anyway.\"\nmsgstr \"没问题，反正我也不想通过那扇门。\"\n\n#. Key:\t4E231ED94F0794AE6342A8A2C7644D51\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_2.Text\n#. /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"I am the Gatekeeper. I will only open this door if you prove to be worthy.\"\nmsgstr \"我是守护者。我只会在你证明自己有价值的时候才会打开这扇门。\"\n\n#. Key:\t4F30265A4D22C52371CC8E9E188B2718\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_9.Text\n#. /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"Open, now!\"\nmsgstr \"开门，现在！\"\n\n#. Key:\t56B5D73646C6823598232BB3D2577305\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_3.Text\n#. /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"Ask him to open the door.\"\nmsgstr \"请他开门。\"\n\n#. Key:\t7A52E2E14341A8CDBD77A4A30DDA22E3\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_13.Children(1).Children.Text\n#. /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_13.Children(1).Children.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_13.Children(1).Children.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"Please let me in\"\nmsgstr \"请让我进去\"\n\n#. Key:\t835098BD4F5D14FAACF1209850607E04\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_15.Children(0).Children.Text\n#. /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_15.Children(0).Children.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_15.Children(0).Children.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"Accept Challenge.\"\nmsgstr \"接受挑战\"\n\n#. Key:\t83E15A3C46A1D2D4CE4FDDBE81130106\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_17.Text\n#. /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"No way! Nobody can skip the Trial!\"\nmsgstr \"休想！没有人可以跳过审判！\"\n\n#. Key:\t86D9667C43253BBFFA43E4ABED24369B\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_10.Text\n#. /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"Still not...\"\nmsgstr \"目前还没有...\"\n\n#. Key:\t94A0124A401BA0CD029255B7D01E087E\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_19.Text\n#. /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"There is no turning back now. The Trial awaits you!\"\nmsgstr \"现在没有回头路了。审判在等着你！\"\n\n#. Key:\t964E5DC7491720F8C3EA53936CBC1DEA\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_15.Text\n#. /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"The Trial will test you!\"\nmsgstr \"审判将考验你！\"\n\n#. Key:\tA38AC02A4C258F538AC26686207D505F\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_4.Text\n#. /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"...\"\nmsgstr \"...\"\n\n#. Key:\tABA8061E4F631608D712A0BDBC6D90D1\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_5.Text\n#. /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"Ah, you can't speak! Hmm... Try now!\"\nmsgstr \"啊，你不会说话！嗯… 现在试一试！\"\n\n#. Key:\tDA4C66AB4F7798DAD95EC5B83D422A03\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_14.Text\n#. /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"Could you just let me pass this time?\"\nmsgstr \"这次你能让我通过吗?\"\n\n#. Key:\tF09A0C3F4BEA6AFBC9EE52AEB6A740AB\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_11.Text\n#. /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"Open that gate, Keeper!\"\nmsgstr \"把门打开，守护者！\"\n\n#. Key:\tF32B1FEC4BB33670D336D28832F04312\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_13.Text\n#. /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"I can only open this door for those who prove worthy.\"\nmsgstr \"我只能为那些证明了自身价值的人打开这扇门。\"\n\n#. Key:\tFB74F24C4B8C2E6B4368B19D77F71606\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_7.Text\n#. /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"Please, open the...\"\nmsgstr \"请，打开...\"\n\n#. Key:\t0BAD4DEA4009823275249FB31070D002\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_7.Children(1).Children.Text\n#. Key:\t2F2169444BBDC9843E1B7DAEDE7F5104\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_4.Children(1).Children.Text\n#. /Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_7.Children(1).Children.Text\n#. /Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_4.Children(1).Children.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_4.Children(1).Children.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_7.Children(1).Children.Text\nmsgctxt \"Dialogue_GGGateKeeper2\"\nmsgid \"Leave\"\nmsgstr \"离开\"\n\n#. Key:\t36FDC8384686644248F76B9EF8A22038\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_6.Text\n#. /Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_GGGateKeeper2\"\nmsgid \"Here we go again...\"\nmsgstr \"又来了…\"\n\n#. Key:\t3D7557464E3E19A1CF3447B555D4977D\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_3.Text\n#. /Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_GGGateKeeper2\"\nmsgid \"Well, of course.\"\nmsgstr \"嗯，当然。\"\n\n#. Key:\t5463C10D4C56C2CD40338A9E5C33D995\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_7.Text\n#. /Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_GGGateKeeper2\"\nmsgid \"You know the rules.\"\nmsgstr \"你知道规矩。\"\n\n#. Key:\t6E1915BC4A79E949C10BDCAADDA1E481\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_7.Children(0).Children.Text\n#. Key:\tACC5EBF441036AE06D207281CBE054D9\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_4.Children(0).Children.Text\n#. /Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_7.Children(0).Children.Text\n#. /Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_4.Children(0).Children.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_4.Children(0).Children.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_7.Children(0).Children.Text\nmsgctxt \"Dialogue_GGGateKeeper2\"\nmsgid \"Accept Challenge\"\nmsgstr \"接受挑战\"\n\n#. Key:\tA5CD165646DA7D531D23F7AAE5B0D701\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_4.Text\n#. /Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_GGGateKeeper2\"\nmsgid \"I mean: You shall not pass unless you prove yourself worthy!\"\nmsgstr \"我的意思是: 你想通过，就必须先证明你的价值！\"\n\n#. Key:\tBABC111D4B5743B296E6AD84659E1910\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_1.Text\n#. /Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_GGGateKeeper2\"\nmsgid \"You shall not pass!!\"\nmsgstr \"你不能通过！\"\n\n#. Key:\tCAF6CA2C4159145B5FE684995956F155\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_2.Text\n#. /Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_GGGateKeeper2\"\nmsgid \"What?? I thought I will need to prove myself worthy.\"\nmsgstr \"什么? ? 我想我需要证明自己的价值。\"\n\n#. Key:\t31B0B4214FE4324029BAB2A75CF7D1EA\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/GGSurviverNote.GGSurviverNote:DlgNode_Speech_2.Text\n#. /Game/SO/Dialogues/Wizard/Chapter1/GGSurviverNote.GGSurviverNote:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/GGSurviverNote.GGSurviverNote:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_GGSurviverNote\"\nmsgid \"'I made this statue to give me shelter from the Cataclysm. Only magic can keep it away.'\"\nmsgstr \"“我做这个雕像是为了躲避大灾难。只有魔法才能把它赶走。”\"\n\n#. Key:\t852F18354CA9C8D46192CBBD14A325F7\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/GGSurviverNote.GGSurviverNote:DlgNode_Speech_3.Text\n#. /Game/SO/Dialogues/Wizard/Chapter1/GGSurviverNote.GGSurviverNote:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/GGSurviverNote.GGSurviverNote:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_GGSurviverNote\"\nmsgid \"'Cerulean is still safe. I managed to steal the Gem to open the Gate but I can’t use it.'\"\nmsgstr \"“蔚蓝之城还是安全的。我设法偷了那块宝石来打开大门，但我不能用它。”\"\n\n#. Key:\tDF72F90C478E18CFE9211C85CEF9ECBF\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/GGSurviverNote.GGSurviverNote:DlgNode_Speech_4.Text\n#. /Game/SO/Dialogues/Wizard/Chapter1/GGSurviverNote.GGSurviverNote:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/GGSurviverNote.GGSurviverNote:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_GGSurviverNote\"\nmsgid \"'I am doomed.'\"\nmsgstr \"“我是命中注定的。”\"\n\n#. Key:\t04737EC246700D406DAB46BE8091D09C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_1.Children(0).Children.Text\n#. /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_1.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_1.Children(0).Children.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Sure\"\nmsgstr \"当然\"\n\n#. Key:\t09BB4D9F428A5390E5F2ABA019B3ACDC\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_34.Text\n#. /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_34.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_34.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Help you?! This is a courthouse not some charity club!\"\nmsgstr \"帮你? ! 这是法院不是什么慈善俱乐部！\"\n\n#. Key:\t0C7D87814BD76EAFE2DCB19B973F0D82\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_52.Text\n#. /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_52.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_52.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"You know I heavily rely on my abacus. But being a ghost and all I can’t really use it.\"\nmsgstr \"你知道我非常依赖算盘。但作为一个幽灵，我不能真正地使用它。\"\n\n#. Key:\t0E3535844D16D540C576AC9889D237C8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_9.Text\n#. /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"I’m looking for three artefacts. Do you know anything about them?\"\nmsgstr \"我在找三件工艺品。你对它们有什么了解吗？\"\n\n#. Key:\t0EB00CBB41338DE6294D6EAC2DE999B4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_20.Text\n#. /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Actually it’s kinda awesome!\"\nmsgstr \"其实还挺棒的！\"\n\n#. Key:\t158F86F04D0040AA3D2814A674252E45\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_13.Text\n#. /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Returning again and again is not a crime but maybe we should reconsider the Law regarding this statement.\"\nmsgstr \"一次又一次的返回并不是犯罪，但是也许我们应该重新考虑关于这份声明的法律。\"\n\n#. Key:\t15D395F84D3DBC3CCBC74988369A74DA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_27.Text\n#. /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_27.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_27.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"The Law says many things about being dad but nothing about being dead...\"\nmsgstr \"法律说了很多关于成为父亲的内容，却没有提到死亡……\"\n\n#. Key:\t2487D3CC4FCE404BEC866287E2057B3F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_3.Text\n#. /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"I can’t rest until the Case is solved.\"\nmsgstr \"这个案子不解决我不能休息。\"\n\n#. Key:\t2D976CD148FB41389A53ED8E499822B4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_54.Text\n#. /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_54.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_54.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Could you get me a ghost abacus?\"\nmsgstr \"你能给我拿个幽灵算盘吗?\"\n\n#. Key:\t2F25CC2042D67E3AFB6F3FB5E1DF624D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_38.Text\n#. /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_38.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_38.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Sure whatever...\"\nmsgstr \"无所谓啦...\"\n\n#. Key:\t344253F4469C163E87496A97C193F0A8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_31.Text\n#. /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_31.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_31.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"If you found her please escort her to the Room of the Law so that her vicious acts can be judged.\"\nmsgstr \"如果你找到了她，请把她带到法务室去，这样就可以对她的恶行进行审判。\"\n\n#. Key:\t34D243A343CDFEA68F2FAB88A4190464\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_5.Children(2).Children.Text\n#. /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_5.Children(2).Children.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_5.Children(2).Children.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"You are dead\"\nmsgstr \"你已经死亡\"\n\n#. Key:\t367BD6CD40B7364D09A19A9F5F833937\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_8.Text\n#. /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Could you help me? I'm forced into this Realm by a Wizard.\"\nmsgstr \"你能帮我吗? 我是受一个巫师所迫进入这个王国的。\"\n\n#. Key:\t3BD4BD5742532C2DB9536F9540EA3D75\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_32.Text\n#. /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_32.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_32.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Ah, even the World will be over sooner than all our cases.\"\nmsgstr \"啊，就连世界末日也会比我们所有的病例来得快。\"\n\n#. Key:\t45882C3C4470919D71E321BF5E1183B9\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_56.Text\n#. /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_56.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_56.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"I've made you a Ghost Abacus.\"\nmsgstr \"我给你做了个幽灵算盘。\"\n\n#. Key:\t482C838F4E946005A3E4CAAB80DFE37F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_35.Text\n#. /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_35.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_35.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"And being a Wizard is strictly forbidden! If I manage to prove you have some connection with that criminal Wizard I will judge you as well!\"\nmsgstr \"而且做巫师是被严格禁止的！如果我能证明你和那个邪恶的巫师扯上什么关系，我也会审判你的!\"\n\n#. Key:\t489CE6C840D8C3430F07FCBC8BAF3F6B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_23.Text\n#. /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_23.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_23.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"The Law never writes it would be forbidden to be a walking ball. Therefore it is not a problem.\"\nmsgstr \"法律从来没有明确表示禁止会走路的球体。因此，这不是一个问题。\"\n\n#. Key:\t512723AF4B51C5A843BEACBEA5427877\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_17.Text\n#. /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Staring like that is strictly forbidden!\"\nmsgstr \"那样的凝视是被严格禁止的!\"\n\n#. Key:\t5215675A4B0974C8993858B9F5D6A404\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_1.Text\n#. /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"The Case of the Gnome traveller. A really complicated one.\"\nmsgstr \"地精旅行者的例子。非常复杂。\"\n\n#. Key:\t6922D9F143A5295C7C2D22A71EA4125B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_29.Text\n#. /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_29.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_29.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Makes sense...\"\nmsgstr \"言之有理。\"\n\n#. Key:\t74955E464A85ED006FF47894FD09BD28\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_4.Text\n#. Key:\tE7F9297B4FF3956A965042AA9D870A07\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_37.Text\n#. /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_4.Text\n#. /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_37.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_37.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"The Law says that.\"\nmsgstr \"法律是这么说的。\"\n\n#. Key:\t74BCB9E04AB452BA2A11088F25DD2FED\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_2.Text\n#. /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"I guess they forgot to tell you but work time is long over...\"\nmsgstr \"我想他们忘记告诉你了，但是工作时间已经结束了……\"\n\n#. Key:\t74F34750433EF722E89F8F85A871CE1B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_59.Text\n#. /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_59.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_59.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Take this as a reward!\"\nmsgstr \"把这个当作奖励吧!\"\n\n#. Key:\t766B27FA455983F70AE1F4BA56F4C1B3\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_57.Text\n#. /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_57.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_57.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"How wondrous! I’m sure this will reduce my research time with years!\"\nmsgstr \"多么奇妙！我相信这将减少我几年的研究时间！\"\n\n#. Key:\t784D8662443EA775B9554EAEB4C6CB8F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_16.Text\n#. /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"You are guilty for bouncing too loudly! Just like my uncle...\"\nmsgstr \"你因跳得太大声而感到内疚！就像我叔叔……\"\n\n#. Key:\t791A095948CFB22CCAF59EAFC60D74EA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_0.SpeechSequence(1).SpeechSequence.Text\n#. /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_0.SpeechSequence(1).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_0.SpeechSequence(1).SpeechSequence.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"We had to reread all the rules to find out if there is anything about this.\"\nmsgstr \"我们得把所有的规定再读一遍，看看是否有什么问题。\"\n\n#. Key:\t7CBAE1084FC39423BBD706A9F939BB14\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_6.Text\n#. /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"So what is this case you are working on?\"\nmsgstr \"你在处理什么案子?\"\n\n#. Key:\t7DBA70D14A4EDDE22DABBBB75800865A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_5.Children(3).Children.Text\n#. /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_5.Children(3).Children.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_5.Children(3).Children.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Help\"\nmsgstr \"帮助\"\n\n#. Key:\t7DDD963C45C30134FA79CEAA1834C270\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_1.Children(1).Children.Text\n#. /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_1.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_1.Children(1).Children.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"No way\"\nmsgstr \"没门\"\n\n#. Key:\t7E1EAB78482CF915AF8A96BA8E0A47F1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_15.Text\n#. /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Just give me some more time and I will prove that you are guilty.\"\nmsgstr \"再给我一些时间，我会证明你是有罪的。\"\n\n#. Key:\t7E2FD8D443438BEFF933D1BA0F691A41\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_1.SpeechSequence(2).SpeechSequence.Text\n#. /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_1.SpeechSequence(2).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_1.SpeechSequence(2).SpeechSequence.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Such a tragic death! Now I need to start everything from the beginning!\"\nmsgstr \"多么悲惨的死亡！现在我需要一切从头开始！\"\n\n#. Key:\t7EA289C94C6CF1E43AE0B291AD0A1133\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_30.Text\n#. /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_30.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_30.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Yes, she is a criminal for inhabiting the body of a cat. That is strictly forbidden!\"\nmsgstr \"是的，她是一个居住在猫身上的罪犯。这是严格禁止的!\"\n\n#. Key:\t80596D1B4384F83D73655AB76B2FA2D0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_21.Text\n#. /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Incorrect. It is not.\"\nmsgstr \"错，它不是。\"\n\n#. Key:\t81C42F5340469CBB4AD780B01E7F02F8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_5.Children(1).Children.Text\n#. /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_5.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_5.Children(1).Children.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Case\"\nmsgstr \"案件\"\n\n#. Key:\t830C84A74369239E2839638F8918E086\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_5.Children(4).Children.Text\n#. /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_5.Children(4).Children.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_5.Children(4).Children.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Artefacts\"\nmsgstr \"工艺品\"\n\n#. Key:\t9090EFE44CB8D7F54F996B970D9A97D2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_14.Text\n#. /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Don’t disturb me!\"\nmsgstr \"别打扰我！\"\n\n#. Key:\t90F79FAC440FB22F0A6BFCABE0963454\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_33.Text\n#. /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_33.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_33.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"That’s very likely.\"\nmsgstr \"这是很有可能的。\"\n\n#. Key:\t9600587D4E3C5B6F2C120BBFB9D40D6A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_22.Text\n#. /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"What?\"\nmsgstr \"什么？\"\n\n#. Key:\t96945AA143EF1F1B7CE4C0B8EEE4096F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_51.Text\n#. /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_51.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_51.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"All right I was just asking. It’s not forbidden. At least in this case.\"\nmsgstr \"好吧，我只是问问。这并非禁止。至少在这种情况下是这样。\"\n\n#. Key:\t970DBE99476C7799B4B803B2EECE7E95\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_7.Text\n#. /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"You are dead. Isn’t that a problem?\"\nmsgstr \"你已经死了。这不是一个问题吗?\"\n\n#. Key:\t9B06B22F44D389959A3C99924145EAE7\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_10.Text\n#. /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Do you know a girl called Lillian?\"\nmsgstr \"你认识一个叫莉莉安的女孩吗?\"\n\n#. Key:\t9C1B37574F81FDF4D3F03890504E3490\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_19.Text\n#. /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Well, to be honest it is.\"\nmsgstr \"嗯，说实话是这样。\"\n\n#. Key:\t9EE15BCA450900DEFFB839856BA78E09\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_55.Text\n#. /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_55.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_55.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"I’ll see what I can do...\"\nmsgstr \"我看看我能做什么……\"\n\n#. Key:\t9F3FBDE041EA6FDB7B30ECA1547E49A0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_0.SpeechSequence(3).SpeechSequence.Text\n#. /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_0.SpeechSequence(3).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_0.SpeechSequence(3).SpeechSequence.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"We almost finished the process when the Gnome Traveller died of waiting.\"\nmsgstr \"我们几乎完成了这个过程，这时地精旅行者死于等待。\"\n\n#. Key:\tA22CEEE34864BC25EECFF2BAED83789F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_18.Children(0).Children.Text\n#. /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_18.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_18.Children(0).Children.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"It is\"\nmsgstr \"是的\"\n\n#. Key:\tA69BCEA14AD8A07AC8CC35871548973A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_5.Children(0).Children.Text\n#. /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_5.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_5.Children(0).Children.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Give Abacus\"\nmsgstr \"给予算盘\"\n\n#. Key:\tA7B9690142A3832182C004A99797AB21\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_26.Text\n#. /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_26.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_26.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"And how about being dead?\"\nmsgstr \"那么死亡呢？\"\n\n#. Key:\tA7EDDDCF423FF086BC0D0A891D232C87\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_0.SpeechSequence(0).SpeechSequence.Text\n#. /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_0.SpeechSequence(0).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_0.SpeechSequence(0).SpeechSequence.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"He asked for permission to use the Railway. Which is really unusual. Before him only dwarves used the Railways.\"\nmsgstr \"他请求允许使用这条铁路。这很不寻常。在他之前，只有地精使用铁路。\"\n\n#. Key:\tA9FCBAD04E16A880C3E52AAA35864E35\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_11.Text\n#. /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Respect the Law!\"\nmsgstr \"尊重法律！\"\n\n#. Key:\tAA3210BC4B1C0875817CCDB5F4922AFA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_1.SpeechSequence(0).SpeechSequence.Text\n#. /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_1.SpeechSequence(0).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_1.SpeechSequence(0).SpeechSequence.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"It’s not that simple. In his testament he asked us to bring his corpse home, on the railway.\"\nmsgstr \"事情没那么简单。在他的遗嘱中，他要求我们把他的尸体坐铁路带回家。\"\n\n#. Key:\tAA9613C041229946AD0033806D77D398\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_49.Text\n#. /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_49.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_49.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"What can I do for you?\"\nmsgstr \"我能帮你做什么吗？\"\n\n#. Key:\tB2D504404A8475C7EFB445AFDA8597A9\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_5.Children(6).Children.Text\n#. /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_5.Children(6).Children.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_5.Children(6).Children.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Leave\"\nmsgstr \"离开\"\n\n#. Key:\tB3A305B84320145E4C0437B7ED50C5B9\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_25.Text\n#. /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_25.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_25.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"The Law doesn’t forbid walking for balls. I guess you are right then.\"\nmsgstr \"法律并没有禁止带球行走。我想你是对的。\"\n\n#. Key:\tB3E56D56494153D0C17355A59EC3F0E6\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_12.Text\n#. /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Rest... err... work in peace!\"\nmsgstr \"休息... 呃... 和平工作！\"\n\n#. Key:\tB69AD6FC4D8373491561CFBCF26C2397\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_1.SpeechSequence(3).SpeechSequence.Text\n#. /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_1.SpeechSequence(3).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_1.SpeechSequence(3).SpeechSequence.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Could you help me?\"\nmsgstr \"你能帮帮我吗？\"\n\n#. Key:\tBCFFF4F345E59362764C9AA6582C683C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_0.SpeechSequence(2).SpeechSequence.Text\n#. /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_0.SpeechSequence(2).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_0.SpeechSequence(2).SpeechSequence.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"When we found out there are none, so we needed to create new rules. But for that we had to reread all the existing rules again.\"\nmsgstr \"当我们发现没有规则时，我们需要创建新的规则。但为此，我们必须重新阅读现有的全部规则。\"\n\n#. Key:\tC5FDD0A14882D8F74A97B1BD53AFD4FE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_36.Text\n#. /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_36.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_36.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"I don’t. But keep in mind if they were stolen and you find them you have to give them to the Dwarven King.\"\nmsgstr \"我不喜欢。但要记住，如果他们被偷了，你找到他们，你必须把他们交给地精国王。\"\n\n#. Key:\tC81E287C4B4EF5B5E77E25A480FC2AEE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_18.Children(1).Children.Text\n#. /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_18.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_18.Children(1).Children.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Not at all\"\nmsgstr \"完全不是。\"\n\n#. Key:\tCCF4D5D04B8D4C57AAA75ABC5F9A1384\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_50.Text\n#. /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_50.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_50.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"No, no, no! I have other things to do.\"\nmsgstr \"不,不,不! 我还有别的事要做。\"\n\n#. Key:\tCD5EF4DE4D29CC774EB5A69A8A65CD95\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_5.Children(5).Children.Text\n#. /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_5.Children(5).Children.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_5.Children(5).Children.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Lillian\"\nmsgstr \"莉莉安\"\n\n#. Key:\tCFC9A6294B4D0653CA9B3384CBD2BC29\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_58.Text\n#. /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_58.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_58.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Thank you! Thank you!\"\nmsgstr \"谢谢！谢谢！\"\n\n#. Key:\tCFEFA4DD4AFEF91C834684A49DFB5890\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_39.Text\n#. /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_39.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_39.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"What crime did the Gnome commit?\"\nmsgstr \"地精犯了什么罪？\"\n\n#. Key:\tD83C186746373C67E8877594AA3523B8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_53.Text\n#. /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_53.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_53.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"When I touch it my fingers slip past the abacus, I can’t move it.\"\nmsgstr \"当我触摸它时，手指滑过算盘，我无法移动它。\"\n\n#. Key:\tE00518FA4279FE57E9640F9007E4BC35\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_44.Text\n#. /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_44.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_44.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"I would call that case solved...\"\nmsgstr \"我认为那个案子已经解决了…\"\n\n#. Key:\tE8F4BE4848BE2E257972D09391B0F296\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_1.SpeechSequence(1).SpeechSequence.Text\n#. /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_1.SpeechSequence(1).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_1.SpeechSequence(1).SpeechSequence.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"We decided that Gnomes can use the Railway, but how about Gnome Corpses? That’s a totally different issue.\"\nmsgstr \"我们的决定是地精可以使用铁路，但是地精尸体怎么办呢? 那完全是两个问题。\"\n\n#. Key:\tEB5B1E474DCFFCF9A38190B8FFAB7C50\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_28.Text\n#. /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"I guess the same rules apply.\"\nmsgstr \"我想同样的规则也适用。\"\n\n#. Key:\tEB5BFBDC40E1D6A1D5C054AD8B6424FD\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_24.Text\n#. /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_24.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_24.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Hmmm... Let me see...\"\nmsgstr \"嗯…让我看看…\"\n\n#. Key:\tEF50A43049824F390D61A3A58D44185A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_18.Text\n#. /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"And you are a walking ball. Isn’t that a problem?\"\nmsgstr \"你是一个行走的球。这不是一个问题吗?\"\n\n#. Key:\t01E5D5DE4524C5AECBE8DAA5A5C3047D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_111.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_111.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_111.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Fishy warns you! This path is dangerous! Turn back! Explore other places!\"\nmsgstr \"呆鱼警告你! 这条路很危险! 回头! 探索其他地方!\"\n\n#. Key:\t036B0B0E41C74704A5ED648091D58AB0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_65.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_65.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_65.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Long story short I almost reached the Outpost when my cargo went into a pothole and my wheel was broken.\"\nmsgstr \"长话短说，当我几乎到达前哨站的时候，我的货物进入一个洞穴，我的轮子也坏了。\"\n\n#. Key:\t03B6BE674D69EF12EB862EB77CDC7F57\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_97.Text\n#. Key:\t4475043D4A9CFD057ED34FBB9695EC86\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_113.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_97.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_113.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_113.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_97.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Then I will give it for 10 Gold Coins.\"\nmsgstr \"那我就出10枚金币吧。\"\n\n#. Key:\t0405D11C4961CFB7941F0F9727F80EAD\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_108.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_108.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_108.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"9 Gold I won't go any lower!\"\nmsgstr \"9枚金币，不能再低了！\"\n\n#. Key:\t069FA4C94559002699885EACD6422FC7\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_115.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_115.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_115.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Such an insult! How dare you?\"\nmsgstr \"这简直就是侮辱！你怎么敢这样？\"\n\n#. Key:\t114F9B9345D0965FE6EFC592E29477FE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_54.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_54.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_54.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Wohoo! I have some really epic names just for you! Each name costs a Single Gold coin!\"\nmsgstr \"哇噢！我有一些非常棒的名字给你! 每个名字价值一枚金币!\"\n\n#. Key:\t1164C89641A9E4970985919C8E86936E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(5).Children.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(5).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(5).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Help me?\"\nmsgstr \"帮助我？\"\n\n#. Key:\t11E01CA843185266C441ACBC460A5B06\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_39.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_39.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_39.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Do you really want to help me?\"\nmsgstr \"你真的想帮我吗?\"\n\n#. Key:\t12F669184834CDC0466BA4A72BE38420\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_4.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Oh, you come to visit old Gnory again.\"\nmsgstr \"哦，你又来拜访老格诺里了。\"\n\n#. Key:\t148C738E422B1C7889EF8CAEF1E6D115\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(7).Children.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(7).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(7).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Lory\"\nmsgstr \"劳里\"\n\n#. Key:\t14A787EF447C5AD6579ADDB271BD9B7E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_54.Children(2).Children.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_54.Children(2).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_54.Children(2).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Warlorb\"\nmsgstr \"军阀\"\n\n#. Key:\t14F4A36B4D34364D1BBB2DAAFA745C41\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_SpeechSequence_0.SpeechSequence(1).SpeechSequence.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_SpeechSequence_0.SpeechSequence(1).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_SpeechSequence_0.SpeechSequence(1).SpeechSequence.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"I so hated them...\"\nmsgstr \"我非常讨厌他们……\"\n\n#. Key:\t162A7A25421FFB9B368D60A9BC76FD38\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_15.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Oh, the three artefacts! That sounds a bit too ambitious but after all, they can be quite a unique gift for a young ball lady.\"\nmsgstr \"噢，三件工艺品! 这听起来野心有点大了，但毕竟，对于一个年轻的球球女士来说，这是一份相当独特的礼物。\"\n\n#. Key:\t166AAF5241332C7954631F9D568B227B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_46.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_46.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_46.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"For everything as well.\"\nmsgstr \"一切都是如此。\"\n\n#. Key:\t19190B2142877E8CBB6F6D8FBB8D2DB1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_42.Text\n#. Key:\t39E546F34A9886487CD938A70468AEC6\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_59.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_42.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_59.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_42.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_59.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"What?\"\nmsgstr \"什么？\"\n\n#. Key:\t1AF2DDE74542524EEF19CA9567CFBDAF\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_58.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_58.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_58.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"{name}? It still sounds a bit weird, but I think I might like it.\"\nmsgstr \"{name}? 听起来还是有点怪，但我想我可能会喜欢的。\"\n\n#. Key:\t22D86B8644CA5BFD8D4CA593C5E3A271\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_54.Children(4).Children.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_54.Children(4).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_54.Children(4).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Dr. Ball\"\nmsgstr \"球博士\"\n\n#. Key:\t2301BDF7421BB3665BED5F92074BB5A2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_84.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_84.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_84.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"I’ve found a wheel for you!\"\nmsgstr \"我给你找了个轮子！\"\n\n#. Key:\t25502F154A957ECD33B65E879E65B48B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_56.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_56.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_56.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"That's sad. Come back when you have some!\"\nmsgstr \"真是悲剧。当你搞到一些了记得再来！\"\n\n#. Key:\t27BF125B4C46E41F58FD45947F1F5CF8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_49.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_49.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_49.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Fishy is Fishy!\"\nmsgstr \"呆鱼就是呆鱼！\"\n\n#. Key:\t294C4DCC4E8A3A07F15BC8B8C1934BB0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_36.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_36.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_36.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"I've got to go now!\"\nmsgstr \"我得走了!\"\n\n#. Key:\t29EEF2B44C1FAE2BBA7518A685FC99B0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_13.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"An elixir that makes you attractive to the lady... err... balls?\"\nmsgstr \"让你能被那位女士...呃...球球吸引的灵丹妙药。\"\n\n#. Key:\t2A8B24AE4D7C120048DEF2A76FD6D787\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(9).Children.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(9).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(9).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Leave\"\nmsgstr \"离开\"\n\n#. Key:\t2AC10A9B434CEADBA53C1F8C1DB0A26D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_41.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_41.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_41.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"I have some at my shop for sale!\"\nmsgstr \"我店里有一些在出售！\"\n\n#. Key:\t2FCB0CE9458F40E2B6738B93937283D2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_107.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_107.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_107.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"See? And I have to listen to him all day!\"\nmsgstr \"看到了吗? 我整天都得听他说话!\"\n\n#. Key:\t303548794492148A0C7CE9961AB48C77\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_92.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_92.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_92.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"It's yours for 12 Gold Coins.\"\nmsgstr \"这是你的12枚金币。\"\n\n#. Key:\t303B74844F6BC0691F880B970403BE91\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_106.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_106.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_106.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Then I will give it for 8 Gold Coins.\"\nmsgstr \"那么我就用它换8枚金币。\"\n\n#. Key:\t31FAEB004D0A1ED819BEF4BC369D9FD5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_51.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_51.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_51.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"I see one of your wagon wheels is broken.\"\nmsgstr \"我看到你的一个车轮坏了。\"\n\n#. Key:\t336F7E9E46DDE33326081E937EC0024A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_18.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Don’t care about Fishy. He can’t really speak and I’m not sure if he even understands himself.\"\nmsgstr \"不要在意呆鱼。他不会说话，我都不确定他甚至是否能理解他自己。\"\n\n#. Key:\t339A52E04EF86F99DE9BCEAA78F29025\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_66.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_66.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_66.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"See you later!\"\nmsgstr \"回见！\"\n\n#. Key:\t34076BD4489E7C92D8DCB9BC1668B775\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_6.Text\n#. Key:\t5FC68B30456EA7BB5A381780426E2279\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_73.Text\n#. Key:\t89C71F00406C5A31D196B4994CEBBA22\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_50.Text\n#. Key:\t93A76F294E3B6B5AB77DD5A04E76F681\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_83.Text\n#. Key:\t9C69D11144FA077481C6C9865E6ED34A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_80.Text\n#. Key:\tA28EA457442D0820F3633A8ECACEDC75\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_76.Text\n#. Key:\tCC8A6DB3424E6813002643A97EFE6644\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_8.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_6.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_73.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_50.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_83.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_80.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_76.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_50.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_73.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_76.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_80.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_83.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Shut up Fishy!\"\nmsgstr \"闭嘴，呆鱼！\"\n\n#. Key:\t365CB4EB4F04825B34F4ADB42F238552\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_85.Children(2).Children.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_85.Children(2).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_85.Children(2).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"12 Gold\"\nmsgstr \"12金币 \"\n\n#. Key:\t3E650BC4417E6A004AF4549F412B1AF4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_26.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_26.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_26.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Ehm, ehm...\"\nmsgstr \"嗯，嗯...\"\n\n#. Key:\t3E904B7D4D5694B715AC268086A4DB2F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_78.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_78.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_78.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"I’ve met another merchant called Lory. Is she your sister you talked about?\"\nmsgstr \"我见过另一个叫劳里的商人。她就是你之前说起过的妹妹吗？\"\n\n#. Key:\t3EB6AD0C4D8896D36393BE878D3D641E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_100.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_100.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_100.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"What the holy Coins?! Now I'm getting angry!\"\nmsgstr \"什么神圣的硬币?!  现在我要生气了!\"\n\n#. Key:\t43099059444ABE91D004D5992065A06F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_7.Text\n#. Key:\t5A2D69454EA8354F3DE4E6BB9D7BD912\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_5.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_7.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"And Fishy!\"\nmsgstr \"还有呆鱼！\"\n\n#. Key:\t43602C93451F3A59EB067ABF7A525D41\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_16.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Fishy know about them!\"\nmsgstr \"呆鱼知道他们！\"\n\n#. Key:\t43C2553447FC63D25E26E79ACE5D7316\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_74.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_74.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_74.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"He was a good merchant, so he understood. Business is hard. I always say that for a fair price I would even sell myself.\"\nmsgstr \"他是个不错的商人，所以他明白。生意不好做。为了一个公平的价格，我甚至愿意出售自己。\"\n\n#. Key:\t477984834246057BF894629ABEA2F0CB\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_116.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_116.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_116.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"You know what? 9 Gold Coins! Take it or leave it that's my final offer!\"\nmsgstr \"废话少说，9金币! 要不要随你，不要拉倒！\"\n\n#. Key:\t477CBB8C451F6255A8A4FAAE8272F700\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_54.Children(5).Children.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_54.Children(5).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_54.Children(5).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Don't buy\"\nmsgstr \"不购买\"\n\n#. Key:\t494F3D164E51E73CC76FD689BF2A4435\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_110.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_110.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_110.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Then I will give it for 9 Gold Coins.\"\nmsgstr \"那我就出9枚金币。\"\n\n#. Key:\t4CBFFCE24BDAFBA592E846A4C6827F21\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_102.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_102.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_102.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"All right, you won. I will give it for 11 Gold Coins.\"\nmsgstr \"好吧，你赢了。我愿意用它换11枚金币。\"\n\n#. Key:\t4D29AE254413D052D6FAA7AA259E2618\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_45.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_45.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_45.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"I see you do have a solution for everything.\"\nmsgstr \"我看你对每件事都有解决的办法。\"\n\n#. Key:\t4EACFFA1414DBB56AA162789D34C76F2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_61.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_61.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_61.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Wow, that's magnificent!\"\nmsgstr \"哇，那太棒了！\"\n\n#. Key:\t4F5CF94B464ED01AB43521A56D7C3B13\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_53.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_53.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_53.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"I want to buy a new name!\"\nmsgstr \"我想买个新名字！\"\n\n#. Key:\t51F2252D44A1B1B8B407938C06378303\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_19.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Fishy know a poem.\"\nmsgstr \"呆鱼知道一首诗！\"\n\n#. Key:\t540DEA6540589E8E9BD5789F708F1D95\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_85.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_85.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_85.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"How much do you charge for it?\"\nmsgstr \"你开价多少?\"\n\n#. Key:\t551FA87F4EC33961257CFBA46B24E39C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_25.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_25.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_25.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Oh, holy golden coins please no...\"\nmsgstr \"哦，神圣的金币，请不要……\"\n\n#. Key:\t55C0627D41EBB98609EDA49E36CE00F3\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_87.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_87.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_87.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Tummm-dummm I would sell the whole World but who could possibly buy it?\\r\\nUhhh... Yes?\"\nmsgstr \"我愿意卖掉全世界，但谁会买呢?\\r\\n呃… ?\"\n\n#. Key:\t5977C80F49FF140CD397C1A3079F8A4C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_54.Children(1).Children.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_54.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_54.Children(1).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Ultimate Frisbee\"\nmsgstr \"极限飞盘\"\n\n#. Key:\t5D529690413CAE4F496DF4B7A3627528\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(6).Children.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(6).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(6).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Broken wheel?\"\nmsgstr \"破损的轮子\"\n\n#. Key:\t5D632016493E1D06116399A364FD3835\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_67.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_67.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_67.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Take care and don't spend Gold anywhere else!\"\nmsgstr \"保重，别把钱花在别的地方！\"\n\n#. Key:\t5F1DF4B44C4E82D6A5FDB6BDF5172AEA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_96.Text\n#. Key:\t9592C2144A7237D49EC42E898AB73642\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_105.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_96.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_105.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_105.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_96.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"How about 10?\"\nmsgstr \"10个如何？\"\n\n#. Key:\t6179A2AF43798114CFEE12900CDAF8CA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_60.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_60.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_60.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Good choice!\"\nmsgstr \"明智的选择\"\n\n#. Key:\t6185906046DAF51843A52FA2FE2CF5AC\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_101.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_101.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_101.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"11 Gold Coins! Take it or leave it that's my final offer!\"\nmsgstr \"11个金币！要不要随你，这是我最后的出价!\"\n\n#. Key:\t655C05DA44E2BCB7DCF0D38DFAD6182C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_21.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Let him tell the poem!\"\nmsgstr \"让我来念这首诗吧！\"\n\n#. Key:\t68761B744A892F85CEDB19B8DD6D9649\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_SpeechSequence_0.SpeechSequence(2).SpeechSequence.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_SpeechSequence_0.SpeechSequence(2).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_SpeechSequence_0.SpeechSequence(2).SpeechSequence.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Then I found out there is a Dwarven Outpost here which is still populated.\"\nmsgstr \"然后我发现这里有一个地精前哨站，那里仍然有人居住。\"\n\n#. Key:\t6D8190E2491C99D14C4E37AA8F01E0BC\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_28.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"In Crossroad Cave the three are close.\\r\\nThough where exactly? This poem shows:\\r\\nFor the first one you need to be restless\\r\\nTo avoid the Catacomb death traps.\\r\\nFor the second you need to go down\\r\\nDeep until you reach the ancient fisher town.\\r\\nFor the third one go high and even higher,\\r\\nKeep on til you reach the never sleeping fire.\\r\\n\"\nmsgstr \"在十字路口洞穴，三个人走得很近。\\r\\n那么确切位置在哪里? 这首诗表明:\\r\\n对于第一个，你需要不安\\r\\n为了避开地下墓穴的死亡陷阱。\\r\\n第二个，你需要往下走\\r\\n直到你到达古老的渔村。\\r\\n第三个更高，甚至更高，\\r\\n坚持下去，直到你到达永不熄灭的火焰。\"\n\n#. Key:\t6F09C2F74E536AB6E4E7D8941571FBDF\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_20.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Sure. Shut up Fishy!\"\nmsgstr \"当然，闭嘴，呆鱼！\"\n\n#. Key:\t720870EC444670FB23244D964497F883\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_SpeechSequence_1.SpeechSequence(1).SpeechSequence.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_SpeechSequence_1.SpeechSequence(1).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_SpeechSequence_1.SpeechSequence(1).SpeechSequence.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"However business is business. She is bad for business! Trading with my customers before they could get to me!\"\nmsgstr \"然而，生意就是生意。她坏了生意！她在顾客找到我之前就和他们交易！\"\n\n#. Key:\t757069804B91FF89516ACDA0C1F59C6A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_103.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_103.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_103.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Arrrgh! Fishy please no more poems! My head aches.\"\nmsgstr \"啊！呆鱼啊！请不要再写诗了！我的脑袋好痛。\"\n\n#. Key:\t75A193EA4F6A7EE92BA73D809247B1A1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_62.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_62.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_62.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Dr. who? Oh, see, Dr. Ball.\"\nmsgstr \"博士？谁？噢，我知道了，球博士。\"\n\n#. Key:\t75EADAAB4ACE4E6ECE45BFA6611ED77A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_85.Children(0).Children.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_85.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_85.Children(0).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"8 Gold\"\nmsgstr \"8金币 \"\n\n#. Key:\t7657DDE7438385D8BCC4B08B2BB5881A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_SpeechSequence_0.SpeechSequence(0).SpeechSequence.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_SpeechSequence_0.SpeechSequence(0).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_SpeechSequence_0.SpeechSequence(0).SpeechSequence.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"It all started when I was back with my family. Oh, those peaceful moments!\"\nmsgstr \"这一切都是从我和家人在一起的时候开始的。哦，那些平静的时刻！\"\n\n#. Key:\t778E6A484D8669761018F38DF326C125\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_90.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_90.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_90.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"It's yours for 8 Gold Coins.\"\nmsgstr \"这是你的8枚金币换来的。\"\n\n#. Key:\t7A09AFFF435CC002F0B75989307D7791\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_9.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Well met dear err... traveler! How can a humble gnome merchant like me be at your service?\"\nmsgstr \"很好，亲爱的……旅行者！像我这样一个卑微的地精商人怎么能为你效劳呢?\"\n\n#. Key:\t7E964EEC4406A06910B333A0F282360A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_70.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_70.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_70.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Sure! She is the lovely lady ball for whom you would like to buy a precious present, right?\"\nmsgstr \"当然！她就是那个你想送贵重礼物的可爱球球女士，对吗?\"\n\n#. Key:\t85D756624371CC3B3A37FC84C111DBB0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_54.Children(3).Children.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_54.Children(3).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_54.Children(3).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Sorbcerer\"\nmsgstr \"巫士\"\n\n#. Key:\t86C8F9B74B869FF4D34CF586AB5AC25E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_20.Children(1).Children.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_20.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_20.Children(1).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Shut up!\"\nmsgstr \"闭嘴！\"\n\n#. Key:\t8701305446A6E0F5E5EA5F86B823273D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_22.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Shut up both of you!\"\nmsgstr \"你们两个都闭嘴！\"\n\n#. Key:\t878BA65D462254D8A0FD36BA541E8C70\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_27.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_27.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_27.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"The three artefacts - by Fishy:\"\nmsgstr \"三件工艺品 - 呆鱼制作：\"\n\n#. Key:\t8A136EF74C7DE15BFBC664B8447366F1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(2).Children.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(2).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(2).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"I need a name\"\nmsgstr \"我需要一个名字\"\n\n#. Key:\t8C25603A4AE5F2D6294551AD2BA6322D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_40.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_40.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_40.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Of course! Are you lost in this hollow realm? Disappointed in all creature kind? Searching for a helpful hand? Not anymore!\"\nmsgstr \"当然! 你是否迷失在这空洞和王国? 对所有生物都感到失望? 在找帮手吗? 不了!\"\n\n#. Key:\t90F345C4482C46F4B1CD43B20F01B2B6\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_54.Children(0).Children.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_54.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_54.Children(0).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Epic Sphero\"\nmsgstr \"史诗球状体\"\n\n#. Key:\t92F1D4A84B3609FDE38C82AD5A314554\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_72.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_72.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_72.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"And Fishy is the primitive monster.\"\nmsgstr \"呆鱼是原始的怪物。\"\n\n#. Key:\t9574E444465834A7D15565A14C7E0F1D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_SpeechSequence_0.SpeechSequence(5).SpeechSequence.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_SpeechSequence_0.SpeechSequence(5).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_SpeechSequence_0.SpeechSequence(5).SpeechSequence.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"My sister sold my brother, so I had enough money to set out.\"\nmsgstr \"我姐姐把我哥哥卖了，所以我有足够的钱出发了。\"\n\n#. Key:\t976FD7AB4B31747EF35E3EBE9C82471F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_69.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_69.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_69.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Do you know a girl called Lillian?\"\nmsgstr \"你认识一个叫莉莉安的女孩吗?\"\n\n#. Key:\t9851A2064648DE26EF4501961D721109\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_68.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_68.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_68.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Wake up! He is back!\"\nmsgstr \"醒醒！他回来了！\"\n\n#. Key:\t99CDA18D43B5FC74E152888E674B743C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_30.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_30.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_30.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Let’s talk about something else.\"\nmsgstr \"我们谈点别的吧。\"\n\n#. Key:\t9A5056F7472381107ACF5F849A322947\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_64.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_64.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_64.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Bye!\"\nmsgstr \"拜拜！\"\n\n#. Key:\t9B4816554539F6616741FC8A6651FEDD\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_SpeechSequence_1.SpeechSequence(2).SpeechSequence.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_SpeechSequence_1.SpeechSequence(2).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_SpeechSequence_1.SpeechSequence(2).SpeechSequence.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"I will tell her what I think about this that’s for sure!\"\nmsgstr \"我会告诉她我的想法，这是肯定的！\"\n\n#. Key:\t9FD161AC488FFD8D9C6BCAB518A6DFCA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_86.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_86.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_86.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Hello again!\"\nmsgstr \"哈喽！\"\n\n#. Key:\t9FFADAA44EE730442CFD76BBD942F478\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_38.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_38.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_38.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Fare thee well!\"\nmsgstr \"珍重！\"\n\n#. Key:\tA0E3F7B44422A97F22E1FCB315DC498A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_48.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_48.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_48.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Who are you by the way?\"\nmsgstr \"顺便问一下，你是谁?\"\n\n#. Key:\tA3EE773446B69B8D37851BAFAD607A9F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_24.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_24.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_24.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Forget your artefacts I have plenty of other valuable items instead!\"\nmsgstr \"忘了你的工艺品吧，我还有很多其他值钱的东西呢！\"\n\n#. Key:\tA557A981439B7A1B4AA803941A8D6794\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_23.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_23.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_23.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"I guess you don’t know where they are...\"\nmsgstr \"我猜你不知道他们在哪儿……\"\n\n#. Key:\tA571474F44F33104D2F93386A5C4009C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_75.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_75.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_75.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Yet no one ever wanted to buy him for a single copper coin.\"\nmsgstr \"然而，从来没有人想用一枚铜币买他。\"\n\n#. Key:\tA67ADB3143798188EF7C1F8D4E59690C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_88.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_88.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_88.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Uhhh... Yes?\"\nmsgstr \"呃… 是吗?\"\n\n#. Key:\tA69D35084A31B957410EF889ED0EC4A4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_57.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_57.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_57.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Yes, yes that's it!\"\nmsgstr \"是的，是的，就是这样!\"\n\n#. Key:\tAD70372E4A5B0594635FBBBE30CA53F1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_91.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_91.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_91.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"It's yours for 10 Gold Coins.\"\nmsgstr \"这是你用10枚金币换来的。\"\n\n#. Key:\tAE2E742F4A087974019D8F810FF97A2E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_104.Children(0).Children.Text\n#. Key:\tB59E143642BBE2D677AA6F97B46C3C06\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_105.Children(0).Children.Text\n#. Key:\tF0726C6B4F8F780C341F319D08E20CF9\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_96.Children(0).Children.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_104.Children(0).Children.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_105.Children(0).Children.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_96.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_104.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_105.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_96.Children(0).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Ok\"\nmsgstr \"好的\"\n\n#. Key:\tAF7B14B241CED9B8BE3F23BC8C857A9A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_82.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_82.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_82.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Now you can imagine those peaceful moments when they were all together.\"\nmsgstr \"现在你可以想象他们在一起的那些平静的时刻了。\"\n\n#. Key:\tB2F8DA594F1A58E8B2FCC7B16C368E21\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_2.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"What... uhhh... me?\"\nmsgstr \"什么……呃… 我吗?\"\n\n#. Key:\tBA5B75CD4087B53BB682CD97021FF821\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(3).Children.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(3).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(3).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Artefacts\"\nmsgstr \"工艺品\"\n\n#. Key:\tBBB67671475F19135DCD57AF771F0D85\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_43.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_43.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_43.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Helpful hands of course and all kind of stuffs. Equip yourself. Once you get rid of all your gold, you won’t be alone anymore...\"\nmsgstr \"依靠勤劳的双手和各种各样的东西。武装你自己。一旦你处理掉所有的金子，你将不再孤单……\"\n\n#. Key:\tBD1AF6114DA5840A340F8DA65B7F59D2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_SpeechSequence_1.SpeechSequence(0).SpeechSequence.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_SpeechSequence_1.SpeechSequence(0).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_SpeechSequence_1.SpeechSequence(0).SpeechSequence.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Yes, she is my beloved sister!\"\nmsgstr \"是的，她是我亲爱的姐姐！\"\n\n#. Key:\tBE8F496743A57B5F1AF81B8D48F128FE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_1.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Hello there!\"\nmsgstr \"哈喽！\"\n\n#. Key:\tBFA7C31A4443A6C89DB61D8556D62FCD\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(0).Children.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(0).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Trade\"\nmsgstr \"交易\"\n\n#. Key:\tC29FF9914C8C1F479E9F7BAB338B067A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_77.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_77.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_77.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"If you could bring me a new wheel I would pay for it with shiny Gold coins!\"\nmsgstr \"如果你能给我一个新轮子，我愿意用闪闪发光的金币来买！\"\n\n#. Key:\tC5077FC14569C44087272C9E9DE07992\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_34.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_34.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_34.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Ok, I’ve got it.\"\nmsgstr \"好的，我知道了。\"\n\n#. Key:\tC6F3C52D4719CE471B6EEB90FCE94E3B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_55.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_55.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_55.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Unfortunately I don't have enough gold.\"\nmsgstr \"不幸的是我没有足够的金子。\"\n\n#. Key:\tCA1E8A5D4C07A81975C4B4B00572A0C8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_94.Text\n#. Key:\tDB9C0DB146BBE1DFC28F929A37C4408A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_93.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_94.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_93.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_93.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_94.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Ha-ha-ha! You must be kidding that's ridiculously high!\"\nmsgstr \"哈哈哈! 你一定是在开玩笑吧!\"\n\n#. Key:\tCB792FAD45F78755935423A5219271FC\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_98.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_98.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_98.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"9 Gold I won't go any higher!\"\nmsgstr \"9金币 不能再高了！\"\n\n#. Key:\tCE99919C42EC2315EC5B33900FBC09C4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_95.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_95.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_95.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"That’s not fair. It would be a shame on me if I just robbed you like that!\"\nmsgstr \"这不公平。如果我那样打劫你，那将是我的耻辱！\"\n\n#. Key:\tD090388E4529CEC2D70899B520973064\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(4).Children.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(4).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(4).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Who are you?\"\nmsgstr \"你是哪位？\"\n\n#. Key:\tD0AA81A247BE4979A774F3B6095BB820\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_33.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_33.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_33.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"I am Gnory, traveler merchant. I wander the world, seeking rare items, secrets beneath dark doors, revealing truth of forg...\"\nmsgstr \"我是格诺里，旅行商人。我漫游世界，寻找稀世珍宝，各种暗门下的秘密，并揭示真相……\"\n\n#. Key:\tD23C65EB4F39580A06045FADE2BCD713\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_81.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_81.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_81.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"She saw our Realm through cat eyes,\\r\\nThe living fire, the dead ice.\\r\\nShe cared, she took care of us all.\\r\\nWhat was ruined she made it whole.\\r\\nThen she left us, this is how it ended.\\r\\nHer own Realm also needed to be mended.\\r\\n\"\nmsgstr \"她通过猫眼看到了我们的王国，\\r\\n富有生命的火，冷冷的死冰。\\r\\n她关心我们，照顾我们所有人。\\r\\n她把一切都毁了。\\r\\n然后她离开了我们，事情就这样结束了。\\r\\n她自己的王国也需要修补。\"\n\n#. Key:\tD30843A14519A490FEE89E82E3CB6735\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_14.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"I’m looking for three artefacts.\"\nmsgstr \"我在找三件工艺品。\"\n\n#. Key:\tD9B70A6A453A11FD2115FFB25CCFF195\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_54.Children(6).Children.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_54.Children(6).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_54.Children(6).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Not enough gold\"\nmsgstr \"没有足够的金子\"\n\n#. Key:\tDB8982994F2BFF510A6A2EA1D40C68C6\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_37.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_37.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_37.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Good bye!\"\nmsgstr \"拜拜！\"\n\n#. Key:\tDC20CC924E5F898E715B668416678CA1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_104.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_104.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_104.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"How about 8?\"\nmsgstr \"8枚如何？\"\n\n#. Key:\tDC989DED42077EBA3313C69150BB33F0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_63.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_63.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_63.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"That's a weird name I have to admit.\"\nmsgstr \"我得承认这个名字很奇怪。\"\n\n#. Key:\tDEC95D494680878D544FF49DACBDEE4F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_114.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_114.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_114.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"11 Gold I won't go any lower!\"\nmsgstr \"11枚金币，我不会再降价了！\"\n\n#. Key:\tDF7B371841495C5FB98800BCF44B7C5B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_52.Children(1).Children.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_52.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_52.Children(1).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Skip yack-yack\"\nmsgstr \"跳过\"\n\n#. Key:\tE1322541414052606F718FBF9B68D4B0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_79.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_79.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_79.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Fishy know her.\"\nmsgstr \"呆鱼认识她。\"\n\n#. Key:\tE3D668304EE4C7C2E77F3E9AF47CB84E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_SpeechSequence_0.SpeechSequence(4).SpeechSequence.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_SpeechSequence_0.SpeechSequence(4).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_SpeechSequence_0.SpeechSequence(4).SpeechSequence.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Fortunately I had a loving family I could always count on. Since they are all merchants, they could easily help me out.\"\nmsgstr \"幸运的是，我有一个可以依靠的充满爱的家庭。既然他们都是商人，他们很容易就能帮到我。\"\n\n#. Key:\tE5031E774F81A45ECB4731BC114AD2E2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_109.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_109.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_109.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"All right, no need to get angry! I can give you 9 Gold for it.\"\nmsgstr \"好吧，没必要生气! 我可以给你9个金币。\"\n\n#. Key:\tEBE094644F9C8DCEE025FDBF8346AD47\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_44.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_44.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_44.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"...with your problem.\"\nmsgstr \"...你的问题\"\n\n#. Key:\tEC93512B48219F6BA6DDF5A3F100C19A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_11.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Show me what you have for sale!\"\nmsgstr \"给我看看你有什么好卖的！\"\n\n#. Key:\tECF244164CDD4A29C96BBD8E13688FE7\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(1).Children.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(1).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Sell Wheel\"\nmsgstr \"售卖轮子\"\n\n#. Key:\tED410B224B09EFF36ED2AC9752AD59DA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_71.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_71.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_71.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"No, she is...\"\nmsgstr \"不，她是...\"\n\n#. Key:\tEDE4BF2D448CAFEF217C5E86885A7E81\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_117.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_117.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_117.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"All right, you won. I will give it for 9 Gold Coins.\"\nmsgstr \"好吧，你赢了。我愿意用它换9枚金币。\"\n\n#. Key:\tEEA209E84766D4AF2BD804A7BA11F111\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_85.Children(1).Children.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_85.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_85.Children(1).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"10 Gold\"\nmsgstr \"10金币\"\n\n#. Key:\tEEE19423423A24146446EEBEB04FAEE9\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_12.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"I’m on a quest to find...\"\nmsgstr \"我在寻找……\"\n\n#. Key:\tF53E6D3443D37DA82663D2976AA90A85\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_20.Children(0).Children.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_20.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_20.Children(0).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Poem?\"\nmsgstr \"诗？\"\n\n#. Key:\tF61EDE3940F24B15BE57D8B5A5AC5570\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_99.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_99.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_99.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Deal! Here you go!\"\nmsgstr \"成交！干得好！\"\n\n#. Key:\tF6A527234B894C18C0778C918EB1BA4E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_89.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_89.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_89.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Welcome back!\"\nmsgstr \"欢迎归来\"\n\n#. Key:\tF93CBC6640AF6143C7D1C5AA6F8C4ADF\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_52.Children(0).Children.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_52.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_52.Children(0).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Go on\"\nmsgstr \"继续\"\n\n#. Key:\tF9EA93DE4B341581745785A7371F797A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(8).Children.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(8).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(8).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Lillian\"\nmsgstr \"莉莉安\"\n\n#. Key:\tFE3C4C72489A909B4D9F76A483D293AE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_SpeechSequence_0.SpeechSequence(3).SpeechSequence.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_SpeechSequence_0.SpeechSequence(3).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_SpeechSequence_0.SpeechSequence(3).SpeechSequence.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"This was my chance to make a hit as a merchant but I didn’t have the resources for a journey this long.\"\nmsgstr \"这是我成为一个成功商人的机会，但我没有足够的资源来维持这么长的路。\"\n\n#. Key:\tFEF58E5B4FB18D128640689499752F75\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_29.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_29.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_29.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Do you call this a poem? Pathetic! Hardly any info and what a miserable structure! Shame on you Fishy!\"\nmsgstr \"你把这叫做诗吗? 简直可悲! 几乎没有任何信息，多么糟糕的结构! 太可耻了!\"\n\n#. Key:\tFF66071643E10E94DEFF70B8E20876EE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_52.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_52.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_52.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"That's a long and sad story...\"\nmsgstr \"这是一个漫长而悲伤的故事……\"\n\n#. Key:\t1EA717114DFEF4490F58829C2F96566A\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/HW_Candlestick.HW_Candlestick:DlgNode_Speech_3.Text\n#. /Game/SO/Dialogues/Ending/E2/HW_Candlestick.HW_Candlestick:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E2/HW_Candlestick.HW_Candlestick:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_HW_Candlestick\"\nmsgid \"Even after mom passed the servants kept lighting the candles.\"\nmsgstr \"甚至在母亲离开之后，仆人们还不停地点蜡烛。\"\n\n#. Key:\t94195B6E4157A1A8BD74BE9224AEED42\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/HW_Candlestick.HW_Candlestick:DlgNode_Speech_2.Text\n#. /Game/SO/Dialogues/Ending/E2/HW_Candlestick.HW_Candlestick:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E2/HW_Candlestick.HW_Candlestick:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_HW_Candlestick\"\nmsgid \"After Mom got sick she really feared darkness.\"\nmsgstr \"母亲生病后真的很怕黑。\"\n\n#. Key:\tEF9668BF44D4A52E46ACEA8B82011137\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/HW_Candlestick.HW_Candlestick:DlgNode_Speech_1.Text\n#. /Game/SO/Dialogues/Ending/E2/HW_Candlestick.HW_Candlestick:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Ending/E2/HW_Candlestick.HW_Candlestick:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_HW_Candlestick\"\nmsgid \"We always needed to light the hallway.\"\nmsgstr \"我们总是需要照亮长廊。\"\n\n#. Key:\t2EECB3024693C7F0EA176BB100D6779A\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/HW_Exit.HW_Exit:DlgNode_Speech_3.Text\n#. /Game/SO/Dialogues/Ending/E2/HW_Exit.HW_Exit:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E2/HW_Exit.HW_Exit:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_HW_Exit\"\nmsgid \"This door was really rusty.\"\nmsgstr \"这扇门真的生锈了。\"\n\n#. Key:\t3C6E4A1C41A7EACE15C101A65BBE997A\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/HW_Exit.HW_Exit:DlgNode_Speech_4.Text\n#. /Game/SO/Dialogues/Ending/E2/HW_Exit.HW_Exit:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Ending/E2/HW_Exit.HW_Exit:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_HW_Exit\"\nmsgid \"I had to do something with it otherwise Father would have heard me.\"\nmsgstr \"我必须做点什么，否则父亲会听到的。\"\n\n#. Key:\t8F63CC8C44D8F8432A66E6B65EC10AF5\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/HW_Exit.HW_Exit:DlgNode_Speech_2.Text\n#. /Game/SO/Dialogues/Ending/E2/HW_Exit.HW_Exit:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E2/HW_Exit.HW_Exit:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_HW_Exit\"\nmsgid \"I used oil on this rusty door. I didn’t want to be heard.\"\nmsgstr \"我在这扇生锈的门上涂了油。我不想被人听到声音。\"\n\n#. Key:\t55E7DD2B4C3D8852EC4A64AF44443BDA\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/HW_Explosion.HW_Explosion:DlgNode_Speech_1.Text\n#. /Game/SO/Dialogues/Ending/E1/HW_Explosion.HW_Explosion:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Ending/E1/HW_Explosion.HW_Explosion:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_HW_Explosion\"\nmsgid \"What was this? I have to go back to check what happened!\"\nmsgstr \"这是什么? 我得回去看看发生了什么事!\"\n\n#. Key:\t8060689940824917F595BF84B4E95A46\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/HW_FRDoor.HW_FRDoor:DlgNode_Speech_3.Text\n#. /Game/SO/Dialogues/Ending/E2/HW_FRDoor.HW_FRDoor:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E2/HW_FRDoor.HW_FRDoor:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_HW_FRDoor\"\nmsgid \"I always wondered why.\"\nmsgstr \"我一直想知道为什么。\"\n\n#. Key:\t816B603341386CF6BB3ADCAAD21D68A3\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/HW_FRDoor.HW_FRDoor:DlgNode_Speech_2.Text\n#. /Game/SO/Dialogues/Ending/E2/HW_FRDoor.HW_FRDoor:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E2/HW_FRDoor.HW_FRDoor:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_HW_FRDoor\"\nmsgid \"Father moved to his workroom and sealed this door.\"\nmsgstr \"父亲搬到他的工作室，把这扇门封上。\"\n\n#. Key:\t125DACD243EA6EBCE76D8CB9F681C727\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/HW_MRDoor.HW_MRDoor:DlgNode_Speech_3.Text\n#. /Game/SO/Dialogues/Ending/E2/HW_MRDoor.HW_MRDoor:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E2/HW_MRDoor.HW_MRDoor:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_HW_MRDoor\"\nmsgid \"I felt I should have a last look before I go.\"\nmsgstr \"我觉得我应该在走之前再看一眼。\"\n\n#. Key:\tE8250D43437C1B1D45637F9499D20936\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/HW_MRDoor.HW_MRDoor:DlgNode_Speech_2.Text\n#. /Game/SO/Dialogues/Ending/E2/HW_MRDoor.HW_MRDoor:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E2/HW_MRDoor.HW_MRDoor:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_HW_MRDoor\"\nmsgid \"Mom’s room looked just like it was when she was still alive.\"\nmsgstr \"母亲的房间看起来就像她还活着的时候一样。\"\n\n#. Key:\tE0BB63A74E94DA1B327B11BB781EB4DB\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/HW_Painting.HW_Painting:DlgNode_Speech_2.Text\n#. /Game/SO/Dialogues/Ending/E2/HW_Painting.HW_Painting:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E2/HW_Painting.HW_Painting:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_HW_Painting\"\nmsgid \"Mom made this painting before she met Father.\"\nmsgstr \"母亲在遇到父亲之前就画了这幅画。\"\n\n#. Key:\tEAD0C13D4BF1D35BDAEC14A3F25901F5\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/HW_Stairs.HW_Stairs:DlgNode_Speech_2.Text\n#. /Game/SO/Dialogues/Ending/E2/HW_Stairs.HW_Stairs:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E2/HW_Stairs.HW_Stairs:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_HW_Stairs\"\nmsgid \"I had to go really softly otherwise Father would have heard me.\"\nmsgstr \"我必须轻轻地走，否则父亲会听见的。\"\n\n#. Key:\t0494D36047DDCE114A43C9901618D32B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_44.Text\n#. /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_44.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_44.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Unfortunately I don't know where you can find them.\"\nmsgstr \"不幸的是，我不知道你在哪里可以找到他们。\"\n\n#. Key:\t0C3E31854B0EB053EABAD4B9DC3D8E60\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_57.Text\n#. /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_57.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_57.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"That’s a serious threat, I have to admit.\"\nmsgstr \"我不得不承认，这是一个严重的威胁。\"\n\n#. Key:\t0C7C89EB4E610752FBE119AA32B99F8B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_34.Text\n#. /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_34.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_34.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Yes I know her. She couldn’t come here so she sent her cat.\"\nmsgstr \"是的，我认识她。她不能来这里，所以她派了她的猫来。\"\n\n#. Key:\t0EDE363848C05F39DE478DA7A559CF54\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_17.Text\n#. /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Could you bring them to me?\"\nmsgstr \"你能给我拿过来吗?\"\n\n#. Key:\t1A914576488DA1393ED641B9F315ABC6\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_53.Text\n#. Key:\t20DA5C2F49DCFADF17F1C983103C0D98\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_29.Text\n#. /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_53.Text\n#. /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_29.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_29.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_53.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Thanks!\"\nmsgstr \"多谢！\"\n\n#. Key:\t1E7EE16F451CAB1193F0B8B3939273AA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_62.Text\n#. /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_62.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_62.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"I managed to defeat one group of the monsters.\"\nmsgstr \"我设法打败了一群怪物。\"\n\n#. Key:\t1F5BE4154412819180B1CA92E5B69377\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(6).Children.Text\n#. /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(6).Children.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(6).Children.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Artefacts\"\nmsgstr \"工艺品\"\n\n#. Key:\t1FE89B7045E586E988BEC18B06BEEBDB\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(1).Children.Text\n#. /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(1).Children.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Purple Mushroom\"\nmsgstr \"紫色蘑菇\"\n\n#. Key:\t208B21DE484E3FE42C9978927BC91E78\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_51.Text\n#. /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_51.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_51.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Uh... this was impressive!\"\nmsgstr \"嗯... 真让人印象深刻！\"\n\n#. Key:\t27DF1ABB483B5073D8C87DB48EF2613F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_70.Text\n#. /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_70.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_70.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Well done!\"\nmsgstr \"干得好！\"\n\n#. Key:\t2892242A4E74642813A30CBAE853B674\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_27.Text\n#. /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_27.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_27.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Anyway, if you give my Coin back I will apologize.\"\nmsgstr \"不管怎样，如果你把我的硬币还给我，我就道歉。\"\n\n#. Key:\t290F9EE34FA4EA41FE963CA61358D23B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_49.Text\n#. /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_49.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_49.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"In theory if I add this to the soup...\"\nmsgstr \"理论上，如果我把这个加到汤里…\"\n\n#. Key:\t3015DA144833F0401BADE8B5E5F93BA8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_26.Text\n#. /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_26.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_26.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Huh! Do you think chests are only there so that you can loot them?\"\nmsgstr \"哈! 你认为箱子在那里只是为了让你可以抢劫吗?\"\n\n#. Key:\t331D8B314DAF15CD7E343BB7459927DD\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_22.Text\n#. /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Give back my Coin!\"\nmsgstr \"把硬币还给我！\"\n\n#. Key:\t345BD57D40E09C73044BB981798E2449\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_43.Text\n#. /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_43.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_43.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Purple Mushrooms. That’s the only mushroom which is purple. You can’t miss it.\"\nmsgstr \"紫色蘑菇。这是唯一的紫色蘑菇。你不会错过的。\"\n\n#. Key:\t34B1483D4F1C580BB8DB61BEEBC5BC0F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_20.Text\n#. /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"I saw that you opened my chest!\"\nmsgstr \"我看到你打开了我的箱子！\"\n\n#. Key:\t35DBF2874748AFCC34A3FAAC083EF9A0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_1.SpeechSequence(3).SpeechSequence.Text\n#. /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_1.SpeechSequence(3).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_1.SpeechSequence(3).SpeechSequence.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"We had the key of the Ancient Temple. According to our prophecies that will fall to Ruin last.\"\nmsgstr \"我们有那座古庙的钥匙。根据我们的预言，这将会是最后的毁灭。\"\n\n#. Key:\t35FB567B4B09545830D61F84869FC7E7\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_28.Text\n#. /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Here you go!\"\nmsgstr \"干得好！\"\n\n#. Key:\t3AAE79234A4BD2F8BCA5F790D5E5D84B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_45.Text\n#. /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_45.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_45.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"No problem. If I ever find one I will bring it to you.\"\nmsgstr \"没有问题。如果我找到了，我会给你带来的。\"\n\n#. Key:\t3AE46C894A0CD8F1AA049CB9970D65F3\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_12.Text\n#. /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"I’m the chef and I’m making a soup.\"\nmsgstr \"我是厨师，我正在做汤。\"\n\n#. Key:\t3BB405034447D1C80B99A5A23AFC98FC\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_5.Text\n#. /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"I know you are already hungry but the soup is not yet ready.\"\nmsgstr \"我知道你已经饿了，但汤还没做好。\"\n\n#. Key:\t406361704988AD9ABD5DA4AF946451F2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_37.Text\n#. /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_37.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_37.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"In return Lillian drew pictures for my tales.\"\nmsgstr \"作为回报，莉莉安把我的故事画了下来。\"\n\n#. Key:\t4152700A419F5AE41362D09E21835D98\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_46.Text\n#. /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_46.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_46.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"I already have some...\"\nmsgstr \"我已经有一些……\"\n\n#. Key:\t4355EB74402DDFD5FF8697B1911593E8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_56.Text\n#. /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_56.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_56.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"I won’t. And I won’t talk to you either.\"\nmsgstr \"我不会的。我也不跟你说话。\"\n\n#. Key:\t43C4F54B4ABBBB13E129148D9AF04976\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(4).Children.Text\n#. /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(4).Children.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(4).Children.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Village\"\nmsgstr \"村庄\"\n\n#. Key:\t4614DBA24F54CB29C92BA9894849CC39\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_1.SpeechSequence(1).SpeechSequence.Text\n#. /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_1.SpeechSequence(1).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_1.SpeechSequence(1).SpeechSequence.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Long ago we lived in peace and respected the ancestors. Even though they caused the Cataclysm.\"\nmsgstr \"很久以前，我们生活在和平之中，并尊重祖先。即使他们造成了大灾难。\"\n\n#. Key:\t4687EF7A45E5FC200C806AB829C64D78\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_8.Text\n#. /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Is this a village? Where are the others?\"\nmsgstr \"这是一个村庄吗? 其他人在哪儿?\"\n\n#. Key:\t586F6370480889F551923A97FFF5E89C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_0.SpeechSequence(3).SpeechSequence.Text\n#. /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_0.SpeechSequence(3).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_0.SpeechSequence(3).SpeechSequence.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"They enslaved all the other tribes and forbid us to do our rituals.\"\nmsgstr \"他们奴役了所有其他部落，并禁止我们举行仪式。\"\n\n#. Key:\t5BCF2C5D4CE9AD6AB4A09DB510BA2039\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_6.Text\n#. /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"You again? Take a seat until the soup is ready!\"\nmsgstr \"又是你？拿把椅子坐好，等着汤完成吧！\"\n\n#. Key:\t63B9B304450B276F0EC714B43A25F09D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_10.Text\n#. /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"I’m looking for three artefacts. Do you know something about them?\"\nmsgstr \"我在找三件工艺品。你对它们有什么了解吗？\"\n\n#. Key:\t63C0EC124C1B42B5C5FD1F95B23B9155\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_65.Text\n#. /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_65.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_65.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Take this! You deserve it.\"\nmsgstr \"拿着这个！这是你应得的。\"\n\n#. Key:\t69E0738B489315662A55DA98EAC542E6\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_0.SpeechSequence(4).SpeechSequence.Text\n#. /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_0.SpeechSequence(4).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_0.SpeechSequence(4).SpeechSequence.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"They used this village to produce Fishy slaves.\"\nmsgstr \"他们用这个村子来生产呆鱼奴隶。\"\n\n#. Key:\t6CBCFFEB48FF8E0D97AAE4B1CB19CB52\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_22.Children(0).Children.Text\n#. /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_22.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_22.Children(0).Children.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Give back\"\nmsgstr \"归还\"\n\n#. Key:\t6EACCB4D4D91AF29F6452E81E4C01B57\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_32.Text\n#. /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_32.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_32.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"I see you have a lot of things here. Do you have something for sale?\"\nmsgstr \"我看到你这里有很多东西。你有什么东西要卖吗?\"\n\n#. Key:\t7164FF5D440BCEF18CAC7E9104A324CF\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_18.Text\n#. /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"I've got to go now!\"\nmsgstr \"我得走了!\"\n\n#. Key:\t75A92D46421FC2601A13B4BBE9BA4D11\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_54.Text\n#. /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_54.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_54.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Er... I don’t have it. But I will get it back I promise!\"\nmsgstr \"呃… 我没有。但我会把它拿回来的，我保证!\"\n\n#. Key:\t761F5734479CFA197266F382FD0A6452\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_23.Text\n#. /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_23.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_23.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"I’m sorry, I didn’t know it was yours. There are chests like yours everywhere.\"\nmsgstr \"对不起，我不知道是你的。像这样的箱子到处都有。\"\n\n#. Key:\t7D87C5064D739F1EFF23AF8264E83235\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_16.Text\n#. /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Well, this morning. But there are some very special ingredients which make the cook time way shorter.\"\nmsgstr \"嗯, 今天早上。但是有一些非常特殊的食材可以缩短烹饪时间。\"\n\n#. Key:\t806AEB764A6118D4CBE9CCA71E98EF10\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_72.Text\n#. /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_72.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_72.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Have no fear, I'll do it.\"\nmsgstr \"别怕，我来做。\"\n\n#. Key:\t80B60CA848D3C71B72514AAC976C3910\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_14.Text\n#. /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Yes, the soup! A very special recipe. It takes years to finish.\"\nmsgstr \"是的, 就是汤！非常特别的食谱。需要数年才能完成。\"\n\n#. Key:\t8437D72C44494DE499E528A67B36A123\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_58.Text\n#. /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_58.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_58.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Ah, it's you again.\"\nmsgstr \"啊，又是你。\"\n\n#. Key:\t885F9FDB498EC13B81E22580D33309F3\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(5).Children.Text\n#. /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(5).Children.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(5).Children.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Kobolds\"\nmsgstr \"地精\"\n\n#. Key:\t8A6043D64FB7B61AF4D553A62D27229C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_36.Text\n#. /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_36.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_36.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Every time the cat came I told him a tale about the ancestors.\"\nmsgstr \"每次猫来的时候，我就给它讲一个关于祖先的故事。\"\n\n#. Key:\t8B29FD7342676763EF53ACBB0677A1A4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_4.Text\n#. /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"The soup still needs time.\"\nmsgstr \"汤还需要时间。\"\n\n#. Key:\t8E0F057044AE753D63AA23847B146662\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_67.Text\n#. /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_67.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_67.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"This is yours.\"\nmsgstr \"这是你的。\"\n\n#. Key:\t8E4C4FB846539DD46577B490846383F1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_1.SpeechSequence(2).SpeechSequence.Text\n#. /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_1.SpeechSequence(2).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_1.SpeechSequence(2).SpeechSequence.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"We decided to keep their knowledge in our rituals.\"\nmsgstr \"我们决定在我们的仪式中保留他们的知识。\"\n\n#. Key:\t9132C2D24A241722115FD5ADB46B3145\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_15.Text\n#. /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"And when did you start?\"\nmsgstr \"你什么时候开始的?\"\n\n#. Key:\t958CE12E48F89AE79E5ED9A4FC4AF6E7\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_48.Text\n#. /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_48.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_48.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"That's wonderful!\"\nmsgstr \"太棒了！\"\n\n#. Key:\t96E5FBCB4795EC1ADACEC7B6D814BD79\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(8).Children.Text\n#. /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(8).Children.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(8).Children.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Lillian\"\nmsgstr \"莉莉安\"\n\n#. Key:\t9845BDB549EF25B9F5C11981123A5CCE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_33.Text\n#. /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_33.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_33.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"You know I’m not really a trader but I might sell you some of them.\"\nmsgstr \"你知道我不是一个真正的交易者，但我可能会卖给你一些。\"\n\n#. Key:\t9A420B814A1C1762130310AE90157BFD\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_31.Text\n#. /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_31.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_31.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"No, I’m sorry.\"\nmsgstr \"不，我很抱歉。\"\n\n#. Key:\t9D8511F94E19183355A5CC8CE5B562E8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_61.Text\n#. /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_61.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_61.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"That would be great. I appreciate your kindness.\"\nmsgstr \"那太好了。谢谢你的好意。\"\n\n#. Key:\t9F2DE60B405A15F2BFB8409D162B42FD\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(3).Children.Text\n#. /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(3).Children.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(3).Children.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Soup\"\nmsgstr \"汤\"\n\n#. Key:\tA53CDF2A4D9A582DD163C7B6D3DCE334\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_55.Text\n#. /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_55.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_55.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Come back when you have my Coin.\"\nmsgstr \"你拿了我的硬币就回来。\"\n\n#. Key:\tA734229B44743F88ED135FB692B9C956\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_11.Text\n#. /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Do you know a girl called Lillian?\"\nmsgstr \"你认识一个叫莉莉安的女孩吗?\"\n\n#. Key:\tA88F63334DD550FE9955A3A65B87ACDA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_63.Text\n#. /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_63.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_63.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"I banished some of the monsters.\"\nmsgstr \"我驱逐了一些怪物。\"\n\n#. Key:\tA8B5BE484641EBB61B1168AE798DABF5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_7.Text\n#. /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"So you are making soup...\"\nmsgstr \"你在做汤……\"\n\n#. Key:\tAAE2E35045B8E0DF8A11BF8BC84A11EF\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_0.SpeechSequence(1).SpeechSequence.Text\n#. /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_0.SpeechSequence(1).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_0.SpeechSequence(1).SpeechSequence.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Every year we made a pilgrimage to the Ancient Temple to express our respect to the ancestors.\"\nmsgstr \"每年我们都去古庙朝拜，以表达我们对祖先的尊敬。\"\n\n#. Key:\tAC26EB6F49B026C3E768398FA0A445CB\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_50.Text\n#. /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_50.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_50.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"then...\"\nmsgstr \"然后...\"\n\n#. Key:\tADE8569E4FC2DCB097FF3FA4B9A0A970\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_40.Text\n#. /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_40.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_40.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Why not? What do you need?\"\nmsgstr \"为什么不呢? 你需要什么?\"\n\n#. Key:\tAE35D91D450D0414FA5F54B71E359511\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(2).Children.Text\n#. /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(2).Children.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(2).Children.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Who are you?\"\nmsgstr \"你是哪位？\"\n\n#. Key:\tAE387E9846A9C5A56569179359AD941C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_42.Text\n#. /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_42.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_42.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"All right! I was just asking...\"\nmsgstr \"好吧！我就是问问...\"\n\n#. Key:\tAF3D9214401FEEE552256A8BAE5F8E77\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_1.SpeechSequence(4).SpeechSequence.Text\n#. /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_1.SpeechSequence(4).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_1.SpeechSequence(4).SpeechSequence.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"But now Kobolds are wrathful. They make wars. They don’t respect anyone.\"\nmsgstr \"但现在地精是愤怒的。他们制造了战争。他们不尊重任何人。\"\n\n#. Key:\tB06407B04855D558D1DB6B9A9A4E0B84\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_1.SpeechSequence(0).SpeechSequence.Text\n#. /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_1.SpeechSequence(0).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_1.SpeechSequence(0).SpeechSequence.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Kobolds are no longer good.\"\nmsgstr \"地精的人设崩塌了！\"\n\n#. Key:\tB082CC4B405800544484B4B0C8A25762\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_41.Text\n#. /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_41.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_41.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"No way!\"\nmsgstr \"没门！\"\n\n#. Key:\tB35F443641A7626AE4552F8D1045A95F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_38.Text\n#. /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_38.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_38.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"I liked them very much.\"\nmsgstr \"我非常喜欢他们。\"\n\n#. Key:\tB40C1B9948722A549DBC45A1D9C277C0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_24.Text\n#. /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_24.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_24.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"I don’t want to leave my kitchen.\"\nmsgstr \"我不想离开我的厨房。\"\n\n#. Key:\tB71FB3424C74B68E4B9CF9AF3828F867\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_64.Text\n#. /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_64.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_64.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"I think I banished all the monsters.\"\nmsgstr \"我想我驱逐了所有的怪物。\"\n\n#. Key:\tB79F2026493F53FE90BABB987370695D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_21.Text\n#. /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"What do you think honestly? You can just rob me and then come to have a chat?!\"\nmsgstr \"你是怎么想的? 你可以在抢劫了我之后再来找我聊天?!\"\n\n#. Key:\tB7B8A9294FA8D3754BB4CDA897B696BA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_69.Text\n#. /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_69.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_69.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Great. The lake is already more peaceful.\"\nmsgstr \"太好了。湖面基本恢复了平静。\"\n\n#. Key:\tB9C3EC7342B52C04A491FF9AE87ABB42\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_0.SpeechSequence(0).SpeechSequence.Text\n#. /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_0.SpeechSequence(0).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_0.SpeechSequence(0).SpeechSequence.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"This was the Village of my tribe. We lived here in peace.\"\nmsgstr \"这是我们部落的村庄。我们在这里的生活很平静。\"\n\n#. Key:\tBB45D70A4F2AF94BA7FCC9B3141FB98F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_17.Children(0).Children.Text\n#. /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_17.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_17.Children(0).Children.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Accept\"\nmsgstr \"接受\"\n\n#. Key:\tC297D79246A0792DCA2CA9AD693C3A55\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_13.Text\n#. /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"That’s all.\"\nmsgstr \"就这些。\"\n\n#. Key:\tC375726140A40243E29115B58048025E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_52.Text\n#. /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_52.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_52.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Hmm... it’s delicious. Here take some!\"\nmsgstr \"嗯... 太美味了。这儿也来一些！\"\n\n#. Key:\tC8BC1F254B61D749D62D4B9210DA1891\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_1.Text\n#. /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"If you came for soup you will need to wait a bit more!\"\nmsgstr \"如果你是来喝汤的，你需要多等一会儿!\"\n\n#. Key:\tCB607C4842DF3781F8B6C9AB1A7D31F1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_19.Text\n#. /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Where is my Coin?\"\nmsgstr \"我的硬币在哪儿？\"\n\n#. Key:\tCE80654A43078EA1E53C5E9C5114DE54\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_60.Text\n#. /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_60.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_60.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"I can help you banish the monsters around the lake.\"\nmsgstr \"我可以帮你赶走湖边的怪物。\"\n\n#. Key:\tD1412BF6490EA9357CE9F7A873B1FCAC\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_35.Text\n#. /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_35.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_35.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"She was really curious about our rituals.\"\nmsgstr \"她对我们的仪式很好奇。\"\n\n#. Key:\tD76CDC9F410E2BCC21BCFB8D0D8A9E97\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_47.Text\n#. /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_47.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_47.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"I’ve found some Purple Mushroom!\"\nmsgstr \"我找到一些紫色蘑菇！\"\n\n#. Key:\tD87335EA45EAC6F84022FEBE57F5CADF\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_25.Text\n#. /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_25.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_25.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Or what? Will you cook me?\"\nmsgstr \"什么？你会把我炖了？\"\n\n#. Key:\tD9B7F3E240430AA5EF537A8F81814751\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_71.Text\n#. /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_71.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_71.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"I'm glad that the lake is peaceful again. Thank you!\"\nmsgstr \"我很高兴湖水又恢复了平静。谢谢你！\"\n\n#. Key:\tE15F80EA40F193E47F372FA7EE9A949E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_0.SpeechSequence(5).SpeechSequence.Text\n#. /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_0.SpeechSequence(5).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_0.SpeechSequence(5).SpeechSequence.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Now they are gone and I'm alone with the monsters they left here.\"\nmsgstr \"现在他们走了，把我和他们的怪物留在一起。\"\n\n#. Key:\tE3947B064E58A1FD7B96A3956C54415D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_0.SpeechSequence(2).SpeechSequence.Text\n#. /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_0.SpeechSequence(2).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_0.SpeechSequence(2).SpeechSequence.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"But then other Kobolds came. They called themselves the Great Kobols.\"\nmsgstr \"但后来其他地精来了。他们称自己为伟大地精。\"\n\n#. Key:\tE48A1DFB458275188357F5811E98CFD4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_59.Text\n#. /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_59.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_59.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"And also take this! I could have not done the soup in time without your help.\"\nmsgstr \"还有这个! 如果没有你的帮助，我不可能及时把汤做好。\"\n\n#. Key:\tE58EEE904A6CBF1A0E2E768583EB03DC\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(7).Children.Text\n#. /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(7).Children.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(7).Children.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Trade\"\nmsgstr \"交易\"\n\n#. Key:\tE60B94C04C63F0E074A5B8ABFED7AE62\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_66.Text\n#. /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_66.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_66.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"I have something for you.\"\nmsgstr \"我有一些东西给你。\"\n\n#. Key:\tEA71F6A6412E69C31302A2B57BFD266F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_39.Text\n#. /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_39.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_39.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Now they are both gone.\"\nmsgstr \"现在他们都走了。\"\n\n#. Key:\tECA4BB2D4EB774315D57FD9A5D66CF25\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_22.Children(1).Children.Text\n#. /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_22.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_22.Children(1).Children.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Don't give\"\nmsgstr \"不给\"\n\n#. Key:\tED97FDEB46CAC89F65734D990569618C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_17.Children(1).Children.Text\n#. /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_17.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_17.Children(1).Children.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Decline\"\nmsgstr \"拒绝\"\n\n#. Key:\tEFD0511840178E579287BAB7FA3FDADE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(0).Children.Text\n#. /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(0).Children.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Banish Monsters\"\nmsgstr \"驱逐怪物\"\n\n#. Key:\tF5A08C63415DF9FE007B97931B7A7C31\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(9).Children.Text\n#. /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(9).Children.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(9).Children.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Leave\"\nmsgstr \"离开\"\n\n#. Key:\tF7EA437842BBD099521D81B87211F49E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_30.Text\n#. /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_30.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_30.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"I’m the last of my tribe.\"\nmsgstr \"我是我们部落仅存的一个了。\"\n\n#. Key:\tFC8F235840D6AF4A86170791A617BCA9\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_3.Text\n#. /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Who are you? What are you doing here?\"\nmsgstr \"你是谁? 你在这儿干什么?\"\n\n#. Key:\tFF27D3BF4D181753D73AD79D384CD3ED\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_9.Text\n#. /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"What are you Kobolds like? What are you doing?\"\nmsgstr \"你们地精是什么样的? 你在干什么?\"\n\n#. Key:\t587277824A24A49F9319D0B452A709AD\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/LB_Device.LB_Device:DlgNode_Speech_1.Text\n#. /Game/SO/Dialogues/Ending/E1/LB_Device.LB_Device:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Ending/E1/LB_Device.LB_Device:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_LB_Device\"\nmsgid \"Monk wanted me to use this device to separate the Worlds.\"\nmsgstr \"修道士希望我使用这个装置来分离世界。\"\n\n#. Key:\t83B9F1E146084039E4BAD185B455209C\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LB_Device.LB_Device:DlgNode_Speech_2.Text\n#. /Game/SO/Dialogues/Ending/E2/LB_Device.LB_Device:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E2/LB_Device.LB_Device:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_LB_Device\"\nmsgid \"With Father we did all we could to make the device perfect. I won’t let us lose so close to the end!\"\nmsgstr \"有了父亲的帮助，我们能做得更好！我不会让我们在接近尾声的时候失败的!\"\n\n#. Key:\t90E0E1E44BE9D84FC514248D73A31935\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LB_Device.LB_Device:DlgNode_Speech_1.Text\n#. /Game/SO/Dialogues/Ending/E2/LB_Device.LB_Device:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Ending/E2/LB_Device.LB_Device:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_LB_Device\"\nmsgid \"Three years of hard work.\"\nmsgstr \"三年的努力工作\"\n\n#. Key:\tFB8EC2184310BA168B9C6E9DB51C4492\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LB_Device.LB_Device:DlgNode_Speech_3.Text\n#. /Game/SO/Dialogues/Ending/E2/LB_Device.LB_Device:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E2/LB_Device.LB_Device:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_LB_Device\"\nmsgid \"I need to pull the left lever first.\"\nmsgstr \"我得先拉动左边的控制杆。\"\n\n#. Key:\tDAC636D74C51C30F4B790B9F87203957\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/LB_DeviceUse.LB_DeviceUse:DlgNode_Speech_1.Text\n#. /Game/SO/Dialogues/Ending/E1/LB_DeviceUse.LB_DeviceUse:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Ending/E1/LB_DeviceUse.LB_DeviceUse:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_LB_DeviceUse\"\nmsgid \"Er... so far pulling the levers worked but this machine looks fairly complicated.\"\nmsgstr \"呃… 到目前为止，拉动杆是起作用的，但这台机器看起来相当复杂。\"\n\n#. Key:\tE0D3606C4F357F03FBC916AA3573A81D\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/LB_DeviceUse.LB_DeviceUse:DlgNode_Speech_2.Text\n#. /Game/SO/Dialogues/Ending/E1/LB_DeviceUse.LB_DeviceUse:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E1/LB_DeviceUse.LB_DeviceUse:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_LB_DeviceUse\"\nmsgid \"I should look around to find some instructions on how it works.\"\nmsgstr \"我应该四处看看，看看它是如何运作的。\"\n\n#. Key:\t2DB770DF48D3199FFDEA3F8AB99126D5\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LB_LeftLever.LB_LeftLever:DlgNode_Speech_1.Text\n#. /Game/SO/Dialogues/Ending/E2/LB_LeftLever.LB_LeftLever:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Ending/E2/LB_LeftLever.LB_LeftLever:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_LB_LeftLever\"\nmsgid \"I heard them knocking on the door. They surely heard the alarm when I entered.\"\nmsgstr \"我听见他们在敲门。我进去的时候，他们肯定听到了警报。\"\n\n#. Key:\tB5D008804CCD51DF8CA8F5B99CA0C0FB\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LB_LeftLever.LB_LeftLever:DlgNode_Speech_2.Text\n#. /Game/SO/Dialogues/Ending/E2/LB_LeftLever.LB_LeftLever:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E2/LB_LeftLever.LB_LeftLever:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_LB_LeftLever\"\nmsgid \"I need to hurry. The middle lever is the next one.\"\nmsgstr \"我得抓紧了。下一个是中间的拉杆。\"\n\n#. Key:\tC7B08D314C68A7E4D21E20B128670516\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LB_MiddleLever.LB_MiddleLever:DlgNode_Speech_5.Text\n#. /Game/SO/Dialogues/Ending/E2/LB_MiddleLever.LB_MiddleLever:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Ending/E2/LB_MiddleLever.LB_MiddleLever:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_LB_MiddleLever\"\nmsgid \"We both made our decision three years ago.\"\nmsgstr \"我们都是三年前做出这个决定的。\"\n\n#. Key:\tFBC301B94D990F1F3FD30383FF916327\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LB_MiddleLever.LB_MiddleLever:DlgNode_Speech_4.Text\n#. /Game/SO/Dialogues/Ending/E2/LB_MiddleLever.LB_MiddleLever:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Ending/E2/LB_MiddleLever.LB_MiddleLever:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_LB_MiddleLever\"\nmsgid \"I’ve made my choice.\"\nmsgstr \"我已经作出了选择。\"\n\n#. Key:\tFD2036CF4FC103724FB18F83754367A0\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LB_MiddleLever.LB_MiddleLever:DlgNode_Speech_3.Text\n#. /Game/SO/Dialogues/Ending/E2/LB_MiddleLever.LB_MiddleLever:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E2/LB_MiddleLever.LB_MiddleLever:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_LB_MiddleLever\"\nmsgid \"I heard the door exploding. Father must be really mad but It doesn’t matter now.\"\nmsgstr \"我听到门爆炸的声音。父亲一定非常生气 ，但现在没关系了。\"\n\n#. Key:\t98F843004F338E4480C942A9B9646BDE\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LB_RightLever.LB_RightLever:DlgNode_Speech_3.Text\n#. /Game/SO/Dialogues/Ending/E2/LB_RightLever.LB_RightLever:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E2/LB_RightLever.LB_RightLever:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_LB_RightLever\"\nmsgid \"I pulled the last lever.\"\nmsgstr \"我拉动了最后一根拉杆。\"\n\n#. Key:\t9F6EBBE74FA6289497401C8E7400B01E\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LR_Bed.LR_Bed:DlgNode_Speech_3.Text\n#. /Game/SO/Dialogues/Ending/E2/LR_Bed.LR_Bed:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E2/LR_Bed.LR_Bed:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_LR_Bed\"\nmsgid \"Sleeping wasn’t easy since Mom was gone.\"\nmsgstr \"母亲离开了，我难以入睡。\"\n\n#. Key:\tAE56EE704265B61C84123F9775EB424C\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LR_Bed.LR_Bed:DlgNode_Speech_2.Text\n#. /Game/SO/Dialogues/Ending/E2/LR_Bed.LR_Bed:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E2/LR_Bed.LR_Bed:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_LR_Bed\"\nmsgid \"I really couldn’t sleep that night.\"\nmsgstr \"当晚我实在睡不着。\"\n\n#. Key:\t344E65304BB63905D487CCAF191DFE95\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LR_Chest.LR_Chest:DlgNode_Speech_1.Text\n#. /Game/SO/Dialogues/Ending/E2/LR_Chest.LR_Chest:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Ending/E2/LR_Chest.LR_Chest:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_LR_Chest\"\nmsgid \"It was half past eleven.\"\nmsgstr \"当时是十一点半。\"\n\n#. Key:\t5DD659BE428981065F3A989D284C3542\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LR_Chest.LR_Chest:DlgNode_Speech_3.Text\n#. /Game/SO/Dialogues/Ending/E2/LR_Chest.LR_Chest:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E2/LR_Chest.LR_Chest:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_LR_Chest\"\nmsgid \"I took the key.\"\nmsgstr \"我拿了钥匙。\"\n\n#. Key:\tF21CEE6143FD904B2285F9BEE01174A0\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LR_Chest.LR_Chest:DlgNode_Speech_2.Text\n#. /Game/SO/Dialogues/Ending/E2/LR_Chest.LR_Chest:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E2/LR_Chest.LR_Chest:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_LR_Chest\"\nmsgid \"Daddy didn’t like if I went out in the night but I felt something calling for me.\"\nmsgstr \"父亲不喜欢我晚上出去，但我觉得有什么东西在召唤我。\"\n\n#. Key:\t8B18714145E8614E70F531BDB1A2AAAB\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LR_Door.LR_Door:DlgNode_Speech_2.Text\n#. /Game/SO/Dialogues/Ending/E2/LR_Door.LR_Door:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E2/LR_Door.LR_Door:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_LR_Door\"\nmsgid \"I always locked the door just to make sure I won’t sleep walk out.\"\nmsgstr \"我总是把门锁上，只是为了确保我不会梦游出走。\"\n\n#. Key:\tE5B14EEE4719891E2D2493A4E793A2C4\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LR_Door.LR_Door:DlgNode_Speech_4.Text\n#. /Game/SO/Dialogues/Ending/E2/LR_Door.LR_Door:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Ending/E2/LR_Door.LR_Door:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_LR_Door\"\nmsgid \"I opened the door.\"\nmsgstr \"我打开了门。\"\n\n#. Key:\tF8090D7B4DCD959D7893338BDA2B6256\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LR_Door.LR_Door:DlgNode_Speech_3.Text\n#. /Game/SO/Dialogues/Ending/E2/LR_Door.LR_Door:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E2/LR_Door.LR_Door:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_LR_Door\"\nmsgid \"I hid the key under the clock.\"\nmsgstr \"我把钥匙藏在钟底下。\"\n\n#. Key:\t8363A3C9426FA1F007A5E783B1D72171\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LR_Notebook.LR_Notebook:DlgNode_Speech_2.Text\n#. /Game/SO/Dialogues/Ending/E2/LR_Notebook.LR_Notebook:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E2/LR_Notebook.LR_Notebook:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_LR_Notebook\"\nmsgid \"Here I collected all my less scientific notes on the Ruined Realm.\"\nmsgstr \"在这里，我收集了所有关于这片毁灭王国的不太科学的笔记。\"\n\n#. Key:\tA0B131B34A29BEADA3E3CDB74C7EDBCA\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LR_Notebook.LR_Notebook:DlgNode_Speech_4.Text\n#. /Game/SO/Dialogues/Ending/E2/LR_Notebook.LR_Notebook:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Ending/E2/LR_Notebook.LR_Notebook:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_LR_Notebook\"\nmsgid \"They deserve to be remembered. I will miss them.\"\nmsgstr \"他们值得被铭记。我会想念他们的。\"\n\n#. Key:\tB66C98C34782719B5CF6F19F608C00F0\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LR_Notebook.LR_Notebook:DlgNode_Speech_3.Text\n#. /Game/SO/Dialogues/Ending/E2/LR_Notebook.LR_Notebook:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E2/LR_Notebook.LR_Notebook:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_LR_Notebook\"\nmsgid \"So many lovely people! Despite their madness.\"\nmsgstr \"这么多可爱的人! 尽管他们很疯狂。\"\n\n#. Key:\t0DAF7BA0480BDF56BC47A7826A5186C2\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LR_TabbyBed.LR_TabbyBed:DlgNode_Speech_3.Text\n#. /Game/SO/Dialogues/Ending/E2/LR_TabbyBed.LR_TabbyBed:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E2/LR_TabbyBed.LR_TabbyBed:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_LR_TabbyBed\"\nmsgid \"Sometimes I wished there could be a place like that for me as well.\"\nmsgstr \"有时我也希望能有一个像那样的地方。\"\n\n#. Key:\t6084018D4E86CF2ACA89219824C8F776\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LR_TabbyBed.LR_TabbyBed:DlgNode_Speech_1.Text\n#. /Game/SO/Dialogues/Ending/E2/LR_TabbyBed.LR_TabbyBed:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Ending/E2/LR_TabbyBed.LR_TabbyBed:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_LR_TabbyBed\"\nmsgid \"As usually Tabby was out there maybe hunting or just hanging out with other cats.\"\nmsgstr \"像往常一样，泰比会出去抓捕猎物，或者只是和其他的猫呆在一起。\"\n\n#. Key:\t9702175346DD6BD2CBDB9C8D23460866\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LR_TabbyBed.LR_TabbyBed:DlgNode_Speech_2.Text\n#. /Game/SO/Dialogues/Ending/E2/LR_TabbyBed.LR_TabbyBed:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E2/LR_TabbyBed.LR_TabbyBed:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_LR_TabbyBed\"\nmsgid \"In this World, he was normal.\"\nmsgstr \"在这个世界上，他是正常的。\"\n\n#. Key:\t018B13FB403C2E979380C68B92CC1E46\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LR_Window.LR_Window:DlgNode_Speech_5.Text\n#. /Game/SO/Dialogues/Ending/E2/LR_Window.LR_Window:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Ending/E2/LR_Window.LR_Window:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_LR_Window\"\nmsgid \"Yet sometimes I liked to watch other kids playing in the castle garden.\"\nmsgstr \"但有时我喜欢看其他孩子在城堡的花园里玩耍。\"\n\n#. Key:\t15454EFF40C99A479173E294B612C66C\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LR_Window.LR_Window:DlgNode_Speech_2.Text\n#. /Game/SO/Dialogues/Ending/E2/LR_Window.LR_Window:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E2/LR_Window.LR_Window:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_LR_Window\"\nmsgid \"They didn’t understand how important my task was.\"\nmsgstr \"他们不知道我的任务有多重要。\"\n\n#. Key:\t4460452B4A8B40C59075779751D3D760\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LR_Window.LR_Window:DlgNode_Speech_1.Text\n#. /Game/SO/Dialogues/Ending/E2/LR_Window.LR_Window:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Ending/E2/LR_Window.LR_Window:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_LR_Window\"\nmsgid \"I didn’t leave the castle since Mom died.\"\nmsgstr \"自从母亲去世后，我就没离开过城堡。\"\n\n#. Key:\t795D92CB49E6F50CE37897A793C6A711\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LR_Window.LR_Window:DlgNode_Speech_4.Text\n#. /Game/SO/Dialogues/Ending/E2/LR_Window.LR_Window:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Ending/E2/LR_Window.LR_Window:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_LR_Window\"\nmsgid \"Two years passed and they still didn’t give up throwing balls on the window to get my attention.\"\nmsgstr \"两年过去了，他们仍然没有停止向窗户扔球来引起我的注意。\"\n\n#. Key:\tB1A689B24F5D77A715114AB718126A75\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LR_Window.LR_Window:DlgNode_Speech_3.Text\n#. /Game/SO/Dialogues/Ending/E2/LR_Window.LR_Window:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E2/LR_Window.LR_Window:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_LR_Window\"\nmsgid \"They will never understand.\"\nmsgstr \"他们永远不会明白。\"\n\n#. Key:\t06B2BD844B477A747E086F9F0C3BCAFE\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_13.Text\n#. /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"Well, that fountain is definitely not your cup of tea but you can accept that it might be the fairest for the Magic Mirror...\"\nmsgstr \"嗯，那座喷泉肯定不入你的眼，但你得理解它对魔镜来说或许是最美丽的……\"\n\n#. Key:\t264C2C1040339F9680CA129F4E6E7764\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_65.Children(0).Children.Text\n#. Key:\t608D4BF341FEE76F239D6BA3B34F65E7\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_1.Children(0).Children.Text\n#. /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_65.Children(0).Children.Text\n#. /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_1.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_1.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_65.Children(0).Children.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"Who is the fairest?\"\nmsgstr \"谁是最美的?\"\n\n#. Key:\t2C246C1326080F0A003A03BBBE7E9F40\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_39.Children(1).Children.Text\n#. /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_39.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_39.Children(1).Children.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"Wish something\"\nmsgstr \"许愿某事\"\n\n#. Key:\t2C6C88C54439E3C689E86DB30560B807\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_66.Text\n#. /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_66.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_66.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"No matter how hard you try to receive a sign, the Mirror remains silent. It doesn't show you anything this time.\"\nmsgstr \"无论你多么努力地想要得到一个信号，镜子都保持沉默。这次什么也看不出来。\"\n\n#. Key:\t317248C14F0904B6E6B04080841C75D1\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_39.Text\n#. /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_39.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_39.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"The water seems to be boiling and the bubbles pop when they hit the surface; it is indeed mesmerizing. Suddenly, something breaks the silence - you can hear whispers.\"\nmsgstr \"水似乎在沸腾，气泡碰到水面时爆裂; 这确实令人着迷。突然，某种东西打破了寂静——你能听到低语。\"\n\n#. Key:\t372D97104DC7D67AF4B2409B7CBC602D\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_66.Children(0).Children.Text\n#. Key:\t432E8D794C2FB271D9B39283EBD9E33B\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_1.Children(2).Children.Text\n#. Key:\tF212015B402EF862C9869394531175DC\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_65.Children(2).Children.Text\n#. /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_66.Children(0).Children.Text\n#. /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_1.Children(2).Children.Text\n#. /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_65.Children(2).Children.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_1.Children(2).Children.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_65.Children(2).Children.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_66.Children(0).Children.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"Leave\"\nmsgstr \"离开\"\n\n#. Key:\t3FBF959348F2AFFA8016AA9371DD0800\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_16.Text\n#. /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"You politely explain that you want to see your past instead of your body, but the Mirror is stubbornly stuck on this image.\"\nmsgstr \"你礼貌地解释说，你想看看你的过去，而不是你的身体，但镜子却固执地展现这个形象。\"\n\n#. Key:\t4620F3E84D5DC9847AB8A8891CF66F20\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_67.Text\n#. /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_67.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_67.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"You place the flower and wait to see what happens.\"\nmsgstr \"你把花放在那里，等着看会发生什么。\"\n\n#. Key:\t5C2363C64023EB8E1705D3BFC3310A8A\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_65.Text\n#. /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_65.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_65.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"The vision fades away.\"\nmsgstr \"幻象消失了。\"\n\n#. Key:\t648780E44EF4F6587D31E7AE2BE4CCE4\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_68.Text\n#. /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_68.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_68.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"The Mirror seems to be unavailable at the moment. It doesn't want to be bothered. Maybe you should return later.\"\nmsgstr \"这面镜子现在似乎用不上。它不想被打扰。也许你应该晚点再来。\"\n\n#. Key:\t74CAAA1D4671A258A6D188BCED32CCBD\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_69.Text\n#. /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_69.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_69.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"The water turns still. Deep under the surface you notice a glimmering light.\"\nmsgstr \"水静止不动。在地下深处，你会注意到一缕微光。\"\n\n#. Key:\t7CD8BEEA40A36A22057920807BBEEC07\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_1.Text\n#. /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"The Magic Mirror shows things that were, things that are, and things that yet may be. \\r\\nYou fill the basin with water and start contemplating. You meditate about...\"\nmsgstr \"魔镜告诉我们过去的事，现在的事，将来的事。\\r\\n你把盆子装满水，开始沉思。你沉思着……\"\n\n#. Key:\t8226F9B3495DE20F137F95A7F3583FE0\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_11.Text\n#. /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"Ruin left this place almost untouched. The street lamps spread light on a couple of metal benches and flower pots.\"\nmsgstr \"毁灭留下了这个几乎没有被触碰的地方。路灯把光洒在几条金属长凳和花盆上。\"\n\n#. Key:\t82C33F1E49C5DC76BF19648A414F7209\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_15.Text\n#. /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"You are watching the ball and start to get frustrated. You don't want to look at this body replacement... this raggy shell... You want answers!\"\nmsgstr \"你盯着球，开始感到沮丧。你不想看到这个身体的替代品…那个破烂的躯壳… 你想要答案!\"\n\n#. Key:\t8F94D5E34488ECDCE9E051BB1ABE66B9\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_1.Children(1).Children.Text\n#. /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_1.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_1.Children(1).Children.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"Who you were in the past\"\nmsgstr \"你过去是谁\"\n\n#. Key:\t9BA86AAD4282A943E8A57390E2C4E3CF\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_39.Children(0).Children.Text\n#. /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_39.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_39.Children(0).Children.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"Floating Flower\"\nmsgstr \"漂浮的花\"\n\n#. Key:\tA8A6D8D44F9344A162FAA080C839B28A\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_14.Text\n#. /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"There are glass shards all over the place. There's a ball on the floor next to the girl.\"\nmsgstr \"到处都是玻璃碎片。在那个女孩旁边的地板上有一个球。\"\n\n#. Key:\tAF212CEC43A56245A848DABD21ECBAFC\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_70.Text\n#. /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_70.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_70.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"You reach for the light and your fingers grab onto something smooth and cold.\"\nmsgstr \"你伸手去够光，你的手指抓住了光滑冰冷的东西。\"\n\n#. Key:\tB8E2A52B442F3B45A1D993A8548DE124\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_4.Text\n#. /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"You are seeing the wizard's room once more. There is a weakened little girl lying on the floor in the middle of the room. She is surrounded by stone runes, candles and magical potions.\"\nmsgstr \"你又一次看到了巫师的房间。房间中央的地板上躺着一个虚弱的小女孩。她被石符文、蜡烛和魔法药水包围着。\"\n\n#. Key:\tB9217F85404B488DB6F4DDACFF2B824C\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_65.Children(1).Children.Text\n#. /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_65.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_65.Children(1).Children.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"What you were before\"\nmsgstr \"你以前是什么\"\n\n#. Key:\tCD33272B416D2FDE283D44BA6F50475C\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_12.Text\n#. /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"The image zooms in and you have a clearer view of the fountain. You are waiting for more, but nothing happens.\"\nmsgstr \"图像放大了，你可以更清楚地看到喷泉。你在等待更多内容的出现，但什么也没有发生。\"\n\n#. Key:\tD64B38F1470B27D21AE539AE80AE666A\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_3.Text\n#. /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"You are seeing the Ruined Realm from afar. The view gets closer until you find yourself looking at the top of a tower.\"\nmsgstr \"你从远处看到的是毁灭王国。景象越来越近，然后你发现自己看到了一座塔的顶部。\"\n\n#. Key:\tF3C496794CC4A68DDC764895FF2DFC77\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_72.Text\n#. /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_72.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_72.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"You found a precious rune stone! Hmmm...Is this the gift offered by the Mirror in exchange for your enchanting flower?\"\nmsgstr \"你找到了一块珍贵的符石! 嗯…  这是镜子送给你的礼物吗?\"\n\n#. Key:\t10A6FAE44F71FBB21522B1AAE5E20DAE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_29.Text\n#. /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_29.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_29.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"I don’t care what happens here after I’m back home.\"\nmsgstr \"我不在乎我回家后这里接着会发生什么。\"\n\n#. Key:\t12C6550D4143AFE12C6986B427D2927A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_21.Text\n#. /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"He can’t release his daughter. He can’t accept that she is gone. He wants to get her back even if it means they all die after a few months...\"\nmsgstr \"他放不下他的女儿。他无法接受她的离去。他想让她回来，即使这意味着他们几个月后都会死去……\"\n\n#. Key:\t1C714E474408001FB67CEABF92FAB019\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_10.Text\n#. /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Wait! You can’t just dis...\"\nmsgstr \"等等! 你不能就这么…\"\n\n#. Key:\t209B77394D419812DD1BD7A3D7A92B94\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_39.Text\n#. /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_39.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_39.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"All right and what can we do against it?\"\nmsgstr \"好吧，我们能做些什么呢?\"\n\n#. Key:\t209BF95E4275418CE020E3AB028AFC10\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_11.Text\n#. /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Now it’s better.\"\nmsgstr \"现在好多了。\"\n\n#. Key:\t230C6ED4416FDD6C5E00FAB8B30FBB17\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_15.Text\n#. /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"To be honest I don’t have the faintest idea. I just want to be free again.\"\nmsgstr \"老实说，我一点儿也不知道。我只想重获自由。\"\n\n#. Key:\t25227AB342F4A0E76082539072C1143D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_37.Text\n#. /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_37.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_37.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Do you think Ruin will stop after swallowing the Human Realm?\"\nmsgstr \"你认为毁灭会在吞噬人类王国后停止吗?\"\n\n#. Key:\t266261C240DB77D1306C5F8EEE3D0189\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_14.Text\n#. /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"He says he wants his daughter back but I think he is still trying to close the Realm to stop Ruin.\"\nmsgstr \"他说他想要他的女儿回来，但我认为他仍在试图关闭王国以阻止毁灭。\"\n\n#. Key:\t283810E04DE48471FBE6BD9BE9DD337D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_18.Text\n#. /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Yet he doesn’t care about the World. He wants to get her back even if it means they all die after a few months...\"\nmsgstr \"然而他并不关心这个世界。他想让她回来，即使这意味着他们几个月后都会死去……\"\n\n#. Key:\t2CE94F19412379ECE927A3AEEEAC3756\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_1.Children(1).Children.Text\n#. /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_1.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_1.Children(1).Children.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Thanks for the Soulcaster\"\nmsgstr \"感谢灵魂施放者\"\n\n#. Key:\t2DB5F39F45BB9EC8ABBFEA9020DF94E7\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_28.Text\n#. /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Why should it concern me if Ruin destroys your Realm? You deserve it for summoning us to do the hard work.\"\nmsgstr \"如果毁灭摧毁了你的王国，我又有什么好担心的呢? 你召唤我们去做艰苦的工作，这是你应得的下场。\"\n\n#. Key:\t30E5A67B4135A5402AE021832F89D4D1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"You again? I told you if you want something from the Wizard go and find him yourself...\"\nmsgstr \"又是你? 我告诉过你，如果你想从巫师那里得到什么，你自己去找他……\"\n\n#. Key:\t34BCB98247406A77FB5A5C8942543588\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_38.Text\n#. /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_38.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_38.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"It might take time but it will reach the Unknown Realm and all the spirits will become part of Ruin just like those who were summoned here.\"\nmsgstr \"这可能需要时间，但它将到达未知王国和所有的精神将成为毁灭的一部分，就像那些被召唤到这里。\"\n\n#. Key:\t379B50904FB774AD057BBB810BDD445C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_41.Text\n#. /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_41.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_41.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"I’m not sure. I will think about it.\"\nmsgstr \"我不确定。我会考虑的。\"\n\n#. Key:\t38BEECF94D2EB7B2C6596593E576A360\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_30.Text\n#. /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_30.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_30.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"The Wizard created a device which can separate the Realms. This is the only way to stop Ruin from spreading.\"\nmsgstr \"巫师创建了一个可以分隔王国的装置。这是防止毁灭蔓延的唯一办法。\"\n\n#. Key:\t3D7B856A4D97FCCC2A2B89BCB6295471\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"This time I would like to talk to you...\"\nmsgstr \"这次我想和你谈谈……\"\n\n#. Key:\t40A329C7465166A11C73B694D6A79A00\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_12.Children(2).Children.Text\n#. /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_12.Children(2).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_12.Children(2).Children.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Don’t know\"\nmsgstr \"不知道\"\n\n#. Key:\t4D356117496E625B6B4C64A611496A9F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_24.Children(1).Children.Text\n#. /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_24.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_24.Children(1).Children.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Not my problem\"\nmsgstr \"不是我的问题\"\n\n#. Key:\t4FE5ADF04D1079CCD1E16697E82B39B5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_35.Children(0).Children.Text\n#. /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_35.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_35.Children(0).Children.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Accept plan\"\nmsgstr \"接受计划\"\n\n#. Key:\t53D6055344A880433B1093B029DA8CA5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_12.Children(0).Children.Text\n#. /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_12.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_12.Children(0).Children.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Bring back daughter\"\nmsgstr \"把女儿带回来\"\n\n#. Key:\t599FF022411F5BA2EB0F32A1F947C661\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_35.Children(2).Children.Text\n#. /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_35.Children(2).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_35.Children(2).Children.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Not sure\"\nmsgstr \"不确定\"\n\n#. Key:\t5FD6018040C38B8A3F40C78C913AC251\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_40.Text\n#. /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_40.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_40.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Have no fear, I will have this done!\"\nmsgstr \"别怕，我会把这事办好的！\"\n\n#. Key:\t6B3585BA4AFE614FF428FCAE698872A8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_33.Text\n#. /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_33.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_33.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"For you this would be completely different. For you this is not a sacrifice but a way of going home!\"\nmsgstr \"对你来说，这将是完全不同的。对你来说，这不是牺牲，而是回家的路!\"\n\n#. Key:\t6E1C94F24F493D7075A7509F8181AD27\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_20.Text\n#. /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"You are wrong. The World is falling apart yet he doesn’t care about it even when he is the only one who could stop Ruin.\"\nmsgstr \"你错了。世界正在分崩离析，而他却毫不在意，即使他是唯一可以阻止毁灭的人。\"\n\n#. Key:\t71A64B804C0CCE26571E9E8237AA5000\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"I’m also glad. It was bloody damn difficult.\"\nmsgstr \"我也很高兴。这真是太难了。\"\n\n#. Key:\t78305AE64B56098D32806EB509133BBC\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_35.Children(1).Children.Text\n#. /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_35.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_35.Children(1).Children.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Decline plan\"\nmsgstr \"拒绝计划\"\n\n#. Key:\t7C92B8BF4CEA3093BB817682B501DC67\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_17.Text\n#. /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"The World is falling apart and only the Wizard has a chance to stop this.\"\nmsgstr \"世界正在分崩离析，只有巫师有机会阻止它。\"\n\n#. Key:\t8B2CE8144EB2A7C89AFA1BACC3EE1B88\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Hello, little Wanderer! I’m glad you made it this far.\"\nmsgstr \"你好, 小流浪者！我很高兴你能走到这一步。\"\n\n#. Key:\t8CC98B374125E6E6A6A20C97F4A3B067\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_24.Children(0).Children.Text\n#. /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_24.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_24.Children(0).Children.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"I'm a demon\"\nmsgstr \"我是一个恶魔\"\n\n#. Key:\t8D4701A1469997CBC879788351B37B0A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_31.Text\n#. /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_31.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_31.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"My plan is simple.\"\nmsgstr \"我的计划很简单\"\n\n#. Key:\t8E4693F04E60AFF4757A5887973894BE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_27.Text\n#. /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_27.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_27.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"I saw Ruin and I don’t want the same to happen to any other Realm. What can I do?\"\nmsgstr \"我看到了毁灭，我不希望任何其他王国会重蹈覆辙。我能做什么?\"\n\n#. Key:\t9193CB2747033644F006809E0E4A812A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_45.Text\n#. /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_45.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_45.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"For the sake of all Realms I hope you will make the right decision.\"\nmsgstr \"为了所有王国的利益，我希望你能做出正确的决定。\"\n\n#. Key:\t95D6FBCC42CC4F4041D0B5B64996FD5C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_35.Text\n#. /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_35.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_35.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Once you are there find the Laboratory and activate the device! It will take you home and will separate the Worlds which means no spirit will be ever summoned again!\"\nmsgstr \"一旦你到了那里，找到实验室，激活装置! 它会带你回家，并将世界分离，这意味着再也不会有灵魂被召唤!\"\n\n#. Key:\t9ADEF37F49EA90EF320B5E8BB2D8D769\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"...and I don’t want our conversation to be overheard, so if you don’t mind...\"\nmsgstr \"...我不想让别人听到我们的谈话，所以如果你不介意的话……\"\n\n#. Key:\t9F01EFC54F3FC5B709F697860BE0572D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_24.Children(2).Children.Text\n#. /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_24.Children(2).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_24.Children(2).Children.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"How to save the World?\"\nmsgstr \"如何拯救世界？\"\n\n#. Key:\tA71226674132E2666925AEB28D2FC024\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_46.Text\n#. /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_46.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_46.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Farewell Wanderer!\"\nmsgstr \"再见，流浪者！\"\n\n#. Key:\tB1E3A9DB4A75C08067DCA19113A6A8A2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Calm down little spirit.\"\nmsgstr \"冷静点，小精灵。\"\n\n#. Key:\tB355BD604F9EC22514DA14B64B0F5E5E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_43.Text\n#. /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_43.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_43.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Thank you Spirit! For the sake of all Realms I hope you won’t fail on your way!\"\nmsgstr \"谢谢你小精灵! 为了所有的王国，我希望你不会失败！\"\n\n#. Key:\tB6D3E23045C4BC5B3E5F3D83E2DFBADB\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_19.Text\n#. Key:\tDC3219914721210BD169D2989F03D18D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_22.Text\n#. /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_19.Text\n#. /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"But we won’t let this happen, will we?\"\nmsgstr \"但我们不会让这种事发生的，是吗?\"\n\n#. Key:\tBAC828A540E6C81EE43EBF8036A8146A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_42.Text\n#. /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_42.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_42.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"You deserve Ruin. I won’t save the Human Realm!\"\nmsgstr \"毁灭是你们咎由自取。我不会拯救人类!\"\n\n#. Key:\tC837CED4495F79594133F4B2C0FCE5F8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_12.Text\n#. /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Where shall I start? Do you know what the Wizard is up to? Did he tell you?\"\nmsgstr \"我该从哪里开始呢? 你知道巫师在做什么吗? 他告诉你了吗?\"\n\n#. Key:\tD060173B4D5502FC06A69E865DAFD5E6\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_26.Text\n#. /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_26.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_26.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"This is not my Realm and not my problem. All I want is to get out of here.\"\nmsgstr \"这不是我的王国，也不是我的问题。我只想离开这里。\"\n\n#. Key:\tD520C3AC46F62B77554443A4589845C1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_13.Text\n#. /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"He would like to bring his daughter back to life. For that he needs three artefacts which are somewhere here.\"\nmsgstr \"他想让他的女儿起死回生。他需要三件工艺品，就在这里。\"\n\n#. Key:\tD7F841B14E18D77AB5FBD2A34D59BC92\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_44.Text\n#. /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_44.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_44.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"I understand your fury. Yet I hope you will change your mind.\"\nmsgstr \"我理解你的愤怒。但我希望你能改变主意。\"\n\n#. Key:\tD80B81914A550F305934F9852C1DD6B0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_23.Text\n#. /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_23.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_23.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"He lost his daughter and he can’t release her. He can’t accept that she is gone.\"\nmsgstr \"他失去了女儿，他不能放下她。他无法接受她的离去。\"\n\n#. Key:\tD816A79E4160BC4426CD22A63C7987A0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Before you go on I have something to discuss with you...\"\nmsgstr \"在你走之前，我有件事要和你商量一下。\"\n\n#. Key:\tDD870754471358DEFE9CB5BFA554AB7C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_1.Children(0).Children.Text\n#. /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_1.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_1.Children(0).Children.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Me too\"\nmsgstr \"彼此彼此\"\n\n#. Key:\tE0CCA2604AA40FED355A859A1FA02DDA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_1.Children(2).Children.Text\n#. /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_1.Children(2).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_1.Children(2).Children.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"I won’t deliver any message\"\nmsgstr \"我不会传递任何信息\"\n\n#. Key:\tE1C3F2E34680BA8B67521C905AD42ADA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_16.Text\n#. /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"That’s correct. He can’t release his daughter. He can’t accept that she is gone.\"\nmsgstr \"没错。他不能放下他的女儿。他无法接受她的离去。\"\n\n#. Key:\tE93136104181FAA899F2CE801497DCBA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_25.Text\n#. /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_25.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_25.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"I know right now it doesn’t look that way, but I’m a mighty demon of the Unknown Realm.\"\nmsgstr \"我知道现在它看起来不像，但我是一个强大的未知王国的恶魔。\"\n\n#. Key:\tEC116A8848A471EB2C5DC8BA1D187C9A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_12.Children(1).Children.Text\n#. /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_12.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_12.Children(1).Children.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Close Ruined Realm\"\nmsgstr \"关闭毁灭王国\"\n\n#. Key:\tEC6221CE4B85E7D1887DBCA6D85D8238\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"It wasn’t easy but I made good use of the Spellcaster you gave me.\"\nmsgstr \"这并不容易，但我很好地利用了你给我的施法者。\"\n\n#. Key:\tED5356DE42F2ED2203F7AFB30231643E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_34.Text\n#. /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_34.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_34.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"When you deliver the artefacts he will let you into his tower.\"\nmsgstr \"当你把这些工艺品交给他时，他会让你进入他的塔。\"\n\n#. Key:\tEE78AD4147800BD0E160A8B6A3F51FBD\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_32.Text\n#. /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_32.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_32.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"When the Wizard’s daughter activated the device it transported her soul into the Unknown Realm. At that point the Wizard stopped the device so that he can summon his daughter back.\"\nmsgstr \"当巫师的女儿激活该装置时，它将她的灵魂传送到无名王国。就在这时，巫师停止了那个装置，这样他就可以把他的女儿召唤回来了。\"\n\n#. Key:\tEFACA50447BAC08293281BB11A5E11B3\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_36.Text\n#. /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_36.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_36.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"This is just as much your problem as it is mine.\"\nmsgstr \"这既是你的问题，也是我的问题。\"\n\n#. Key:\tFB0E702746132A3C688D9EA492A01B50\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"You made it and that is what matters.\"\nmsgstr \"你成功了，这才是最重要的。\"\n\n#. Key:\t4BE3EE734EFED241B7FA2192EEB146A5\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/MR_Bed.MR_Bed:DlgNode_Speech_1.Text\n#. /Game/SO/Dialogues/Ending/E2/MR_Bed.MR_Bed:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Ending/E2/MR_Bed.MR_Bed:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_MR_Bed\"\nmsgid \"We always wore colourful clothes because that made her happy.\"\nmsgstr \"我们总是穿着五颜六色的衣服，因为这样能使她高兴。\"\n\n#. Key:\t7F5F069D4E9C7F15ED2B8CA45154FCFE\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/MR_Bed.MR_Bed:DlgNode_Speech_2.Text\n#. /Game/SO/Dialogues/Ending/E2/MR_Bed.MR_Bed:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E2/MR_Bed.MR_Bed:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_MR_Bed\"\nmsgid \"Most of her time she just lied here and stared at nothing.\"\nmsgstr \"她大部分时间都躺在这里，眼神迷离。\"\n\n#. Key:\tEA25DBC34832960AB03A32A5B08AC404\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/MR_Bed.MR_Bed:DlgNode_Speech_3.Text\n#. /Game/SO/Dialogues/Ending/E2/MR_Bed.MR_Bed:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E2/MR_Bed.MR_Bed:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_MR_Bed\"\nmsgid \"Sometimes she talked about grey lands.\"\nmsgstr \"有时她会谈到灰色地带。\"\n\n#. Key:\t58E06C3A45DD46A34F155BAA62933039\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/MR_Chair.MR_Chair:DlgNode_Speech_4.Text\n#. /Game/SO/Dialogues/Ending/E2/MR_Chair.MR_Chair:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Ending/E2/MR_Chair.MR_Chair:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_MR_Chair\"\nmsgid \"I hope they will never find out how wrong they were. I hope there is still time for our World.\"\nmsgstr \"我希望他们永远不会发现他们错得有多离谱。我希望我们的世界还有时间。\"\n\n#. Key:\t9EA75B664E62ABF38E44BE8DC3050AC9\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/MR_Chair.MR_Chair:DlgNode_Speech_2.Text\n#. /Game/SO/Dialogues/Ending/E2/MR_Chair.MR_Chair:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E2/MR_Chair.MR_Chair:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_MR_Chair\"\nmsgid \"This is where the doctor used to sit. He never believed that Mom was infected by the Ruin.\"\nmsgstr \"这是医生过去常坐的地方。他从不相信母亲被毁灭感染了。\"\n\n#. Key:\tA408630F44A3B2345A2D0AA8395D97F2\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/MR_Chair.MR_Chair:DlgNode_Speech_3.Text\n#. /Game/SO/Dialogues/Ending/E2/MR_Chair.MR_Chair:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E2/MR_Chair.MR_Chair:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_MR_Chair\"\nmsgid \"No one ever believed in Ruin.\"\nmsgstr \"没有人相信毁灭。\"\n\n#. Key:\t1AFEF7EB49BB3BEA5BB76793A60ED7C9\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/MR_Lamps.MR_Lamps:DlgNode_Speech_2.Text\n#. /Game/SO/Dialogues/Ending/E2/MR_Lamps.MR_Lamps:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E2/MR_Lamps.MR_Lamps:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_MR_Lamps\"\nmsgid \"This room was the brightest in the castle.\"\nmsgstr \"这个房间是城堡里最明亮的。\"\n\n#. Key:\tC132BEA446B4441615D7029E8AA5BBB5\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/MR_Lamps.MR_Lamps:DlgNode_Speech_3.Text\n#. /Game/SO/Dialogues/Ending/E2/MR_Lamps.MR_Lamps:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E2/MR_Lamps.MR_Lamps:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_MR_Lamps\"\nmsgid \"I took some oil.\"\nmsgstr \"我取了一些油。\"\n\n#. Key:\tFE826997431A2665AC2788A62558B88E\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/MR_Lamps.MR_Lamps:DlgNode_Speech_1.Text\n#. /Game/SO/Dialogues/Ending/E2/MR_Lamps.MR_Lamps:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Ending/E2/MR_Lamps.MR_Lamps:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_MR_Lamps\"\nmsgid \"Father bought some exotic lamp oil so that we had coloured lights.\"\nmsgstr \"父亲买了一些灯油，这样我们就有了各色彩灯。\"\n\n#. Key:\t430A10B04FAC9288EC2794A31DF6699E\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/MR_Paintings.MR_Paintings:DlgNode_Speech_2.Text\n#. /Game/SO/Dialogues/Ending/E2/MR_Paintings.MR_Paintings:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E2/MR_Paintings.MR_Paintings:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_MR_Paintings\"\nmsgid \"Mom was always fond of art.\"\nmsgstr \"母亲一直热衷于艺术。\"\n\n#. Key:\t53AA7E134FA0E30F37FC8CB50425520F\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/MR_Paintings.MR_Paintings:DlgNode_Speech_3.Text\n#. /Game/SO/Dialogues/Ending/E2/MR_Paintings.MR_Paintings:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E2/MR_Paintings.MR_Paintings:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_MR_Paintings\"\nmsgid \"After she got sick she couldn’t paint the way she did before yet she still liked it.\"\nmsgstr \"她生病后，不能再像以前那样画画了，但她的兴趣丝毫不减。\"\n\n#. Key:\t8484045A4107378E9CC8FFAA02C94A87\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/MR_Paintings.MR_Paintings:DlgNode_Speech_1.Text\n#. /Game/SO/Dialogues/Ending/E2/MR_Paintings.MR_Paintings:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Ending/E2/MR_Paintings.MR_Paintings:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_MR_Paintings\"\nmsgid \"It could engage her for hours.\"\nmsgstr \"这可能会让她忙上几个小时。\"\n\n#. Key:\t009BF08145DBE86FFB07BA9A6BD77A8E\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_5.Children(2).Children.Text\n#. /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_5.Children(2).Children.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_5.Children(2).Children.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"Not my business\"\nmsgstr \"与我无关\"\n\n#. Key:\t00DE9BE1446C5D5C0D62469B41A1B693\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_5.Children(0).Children.Text\n#. /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_5.Children(0).Children.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_5.Children(0).Children.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"Lillian?\"\nmsgstr \"莉莉安？\"\n\n#. Key:\t0C3B729C4618E8A817F019B8E916425B\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_18.Text\n#. /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"Maybe we failed the ritual again and summoned another of your kind.\"\nmsgstr \"也许我们的仪式又一次失败了，召唤了你的同类。\"\n\n#. Key:\t0CAC15144B37144A99A9EB9D13CCC9DE\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_32.Text\n#. /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_32.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_32.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"What do you expect me to do, Spirit?\"\nmsgstr \"你想让我怎么做，精灵？\"\n\n#. Key:\t1493C597483503024A3C5CA8F0FA1327\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_8.Text\n#. /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"I’ve already done way too much for you.\"\nmsgstr \"我已经为你做得太多了。\"\n\n#. Key:\t15BAD73D49BF7C62469D8E9CD0B2AAF4\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_9.Text\n#. /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"Now, take me home!\"\nmsgstr \"现在，带我回家吧!\"\n\n#. Key:\t1962A69C42E8FDD365AFC9AB626605F7\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_13.Text\n#. /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"We made the spell... and it worked!\"\nmsgstr \"我们念了咒语… 并且它奏效了!\"\n\n#. Key:\t1AC8DD104163078CA72065A0B43B5C57\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_15.Text\n#. /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"And then what?\"\nmsgstr \"然后呢？\"\n\n#. Key:\t2034A3164695766F8C17B69CD0937C02\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_25.Text\n#. /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_25.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_25.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"And he...\"\nmsgstr \"另外他...\"\n\n#. Key:\t22668011432DEF65ACF29793FF234E07\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_37.Text\n#. /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_37.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_37.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"Someone like me...\"\nmsgstr \"像我这样的人……\"\n\n#. Key:\t2386A8D24BD256982D486AAF71B57ABD\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_23.Text\n#. /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_23.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_23.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"She destroyed half of the room before we could even cast a spell.\"\nmsgstr \"我们还没来得及施咒，她就把半个房间给毁了。\"\n\n#. Key:\t250E11A440445CAFB5252A92C5100735\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_22.Text\n#. /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"That’s how you handle situations like these...\"\nmsgstr \"这就是你处理这种情况的方式……\"\n\n#. Key:\t298BEA5646602444742C3BAD65866EF9\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_12.Text\n#. /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"I’m not sure... Everything happened so fast.\"\nmsgstr \"我不确定… 一切都发生得太快了。\"\n\n#. Key:\t2FAFABFC43A75D29B671739D16759E43\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_2.Text\n#. /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"What happened?\"\nmsgstr \"什么情况？\"\n\n#. Key:\t303D9BF54AB3034565A45594AB5636DF\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_10.Text\n#. /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"I can’t... I’m sorry!\"\nmsgstr \"我不能……  我很抱歉!\"\n\n#. Key:\t378D7F984C821E23AF0CBEA7D24EFCC1\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_6.Text\n#. /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"What happened to Lillian? Has she returned?\"\nmsgstr \"莉莉安怎么了？她回来了吗？\"\n\n#. Key:\t38EF0908448C7E5298C4F496DACAD5AD\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_3.Text\n#. /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"Something... arrgh... something went wrong...\"\nmsgstr \"有些... 呃... 有些不对劲...\"\n\n#. Key:\t3A328FA74AA2FBC2AFE84CA195DAE236\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_1.Text\n#. /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"You are Raven’s master...\"\nmsgstr \"你是乌鸦的主人……\"\n\n#. Key:\t462226704638D0C32B1DEBA3DFE138A1\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_17.Text\n#. /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"She was taken over by a wicked force and she unleashed boundless spells.\"\nmsgstr \"她被一种邪恶的力量控制了，释放了无尽的咒语。\"\n\n#. Key:\t49B5501A4917D23E6B3B99B430076ABA\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_19.Text\n#. /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"It was like the devil itself.\"\nmsgstr \"它本身就像恶魔一样。\"\n\n#. Key:\t4B173FBD4D4F48A468016BB055CC573C\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_7.Text\n#. /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"Where is Wizard? Something happened to him?\"\nmsgstr \"巫师在哪里？他怎么了？\"\n\n#. Key:\t5341F61045AA32F212173EA9CAB67695\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_39.Text\n#. /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_39.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_39.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"Wizard was right when he decided to trust you.\"\nmsgstr \"巫师决定相信你是对的。\"\n\n#. Key:\t551AEBA64D1E99B2CCFA3DB13E168A02\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_27.Children(1).Children.Text\n#. /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_27.Children(1).Children.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_27.Children(1).Children.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"I won’t fight\"\nmsgstr \"我不会干架\"\n\n#. Key:\t592A8CF045DF1BD875B05F9493FE2BB4\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_38.Text\n#. /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_38.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_38.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"I will face her!\"\nmsgstr \"我会面对她的！\"\n\n#. Key:\t5B65F12D43B12FA943D7469FEE2CE2E0\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_4.Text\n#. /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"We made everything right...\"\nmsgstr \"我们把一切都做好了……\"\n\n#. Key:\t65A974C344D2B4DD644901994086A31D\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_30.Text\n#. /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_30.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_30.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"Why is it that every time you refuse to face the consequences of your actions, it is me who needs to clean up your mess?\"\nmsgstr \"为什么每次你拒绝面对自己行为的后果时，都是我在帮你收拾烂摊子?\"\n\n#. Key:\t66D0FDF04AF5351330E83080759ED974\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_40.Text\n#. /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_40.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_40.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"I'm sorry that I can't help...\"\nmsgstr \"对不起，我帮不了你……\"\n\n#. Key:\t7FFE18B74C54BB92334399983F82DBCA\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_34.Text\n#. /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_34.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_34.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"You are free to do whatever you want!\"\nmsgstr \"你可以想做什么就做什么!\"\n\n#. Key:\t8739EB3D48E4F2A997E604A60F7F32B3\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_20.Text\n#. /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"Was it trapped inside a teddy bear?\"\nmsgstr \"它被困在泰迪熊里了吗?\"\n\n#. Key:\t8E2F09164340534A484A46AD45E4E105\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_27.Text\n#. /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_27.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_27.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"The demon-Lillian left. There is no one who could stop her now...\"\nmsgstr \"那个恶魔...  莉莉安离开了。现在没有人能阻止她了……\"\n\n#. Key:\t900D084E4F673FEBEACE3E916103B93E\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_16.Text\n#. /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"She had fire in her eyes...\"\nmsgstr \"她眼睛里有火……\"\n\n#. Key:\t91C26C314425AB8C973F1FB54061F639\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_14.Text\n#. /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"Lillian woke up and then...\"\nmsgstr \"莉莉安醒了，然后……\"\n\n#. Key:\t95CE9C6C4901E613AD5DB38E51AC0DB3\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_35.Text\n#. /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_35.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_35.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"Leave and let me rest in peace...\"\nmsgstr \"离开吧，让我安息……\"\n\n#. Key:\t9AF3E069409F31E4F50A5990A416A39C\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_19.Children(1).Children.Text\n#. Key:\tF5A670D640D73DF452C02A948CB68F75\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_5.Children(1).Children.Text\n#. /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_19.Children(1).Children.Text\n#. /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_5.Children(1).Children.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_19.Children(1).Children.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_5.Children(1).Children.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"Wizard?\"\nmsgstr \"巫师？\"\n\n#. Key:\t9B1B8322442B6D7D76F2119E0A0574FA\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_21.Text\n#. /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"Is the Wizard safe? What happened afterwards?\"\nmsgstr \"巫师安全吗? 后来发生了什么?\"\n\n#. Key:\tA82789354D984476223432A2BE199293\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_24.Text\n#. /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_24.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_24.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"I was hit by the table.\"\nmsgstr \"我被桌子撞了。\"\n\n#. Key:\tAA6EFD044C1D21008EEA189DE75740E7\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_41.Text\n#. /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_41.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_41.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"Good luck with... everything!\"\nmsgstr \"祝... 万事顺意！\"\n\n#. Key:\tACAF3D904A149C0E9F91E5AC852D8309\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_31.Text\n#. /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_31.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_31.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"Let me go!\"\nmsgstr \"放过我吧！\"\n\n#. Key:\tB223647F4C35858A62A5509C7B22C23B\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_27.Children(0).Children.Text\n#. /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_27.Children(0).Children.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_27.Children(0).Children.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"I'll stop her\"\nmsgstr \"我会阻止她\"\n\n#. Key:\tD0E16FEF4D5415EC6D2C299252E5675D\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_26.Text\n#. /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_26.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_26.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"He was burnt to ashes.\"\nmsgstr \"他被烧成灰烬。\"\n\n#. Key:\tD23076F4475E6CE385ECB2B3B2749CA9\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_36.Text\n#. /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_36.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_36.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"I have always wanted to meet someone of my own kind anyway.\"\nmsgstr \"无论如何，我一直都想遇到一个和我一样的人。\"\n\n#. Key:\tD290445E4EB74446478970934785BA10\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_11.Text\n#. /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"I can’t open a Gate without Wizard...\"\nmsgstr \"没有巫师我无法打开大门……\"\n\n#. Key:\tD6EB1BE248E9C483E6D94B8E8A7815F6\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_5.Text\n#. /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"I don't understand... It is...\"\nmsgstr \"我不明白…… 这是……\"\n\n#. Key:\tEC42D62E46269139E9E69B876EDED5B1\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_33.Text\n#. /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_33.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_33.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"It wasn't me who brought you here.\"\nmsgstr \"不是我带你来的。\"\n\n#. Key:\tF0711D5F4698DAA99E484E94FDB3EF9C\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_19.Children(0).Children.Text\n#. /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_19.Children(0).Children.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_19.Children(0).Children.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"Was it trapped?\"\nmsgstr \"它被困了？\"\n\n#. Key:\tFDE62A034456071EFE9639B73108BB1E\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_28.Text\n#. /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"I can't let her destroy everything!\"\nmsgstr \"我不能让她毁了一切!\"\n\n#. Key:\tFDFD2B2B4352B564118519874199B48C\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_29.Text\n#. /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_29.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_29.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"No-no-no!\"\nmsgstr \"不-不-不！\"\n\n#. Key:\t2E3C904D458640A4F06DD793B416366A\n#. SourceLocation:\t/Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_14.Text\n#. /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_SewerCreatures\"\nmsgid \"All right, I will return when I'm done.\"\nmsgstr \"好吧，我做完就回来。\"\n\n#. Key:\t41F6B75041803A654088469BCB887165\n#. SourceLocation:\t/Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_1.Children(0).Children.Text\n#. /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_1.Children(0).Children.Text\n#: /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_1.Children(0).Children.Text\nmsgctxt \"Dialogue_SewerCreatures\"\nmsgid \"Really?\"\nmsgstr \"真的吗？\"\n\n#. Key:\t43EE0E60407CA7CB7431BDB2767C6E19\n#. SourceLocation:\t/Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_2.Text\n#. /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_SewerCreatures\"\nmsgid \"That's sad. What happened exactly?\"\nmsgstr \"真悲剧。到底发生了什么事?\"\n\n#. Key:\t53AC225B4F21B68CAC6F8997F324124E\n#. SourceLocation:\t/Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_29.Text\n#. /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_29.Text\n#: /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_29.Text\nmsgctxt \"Dialogue_SewerCreatures\"\nmsgid \"Farewell until we meet again!\"\nmsgstr \"再见，下次见!\"\n\n#. Key:\t5ED0CE6143EC50E6B5A1289D1A9A88E2\n#. SourceLocation:\t/Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_22.Text\n#. /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_SewerCreatures\"\nmsgid \"I'm glad I could help.\"\nmsgstr \"我很高兴能帮上忙。\"\n\n#. Key:\t65042BC342E9717229E74A9DD272DC5F\n#. SourceLocation:\t/Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_28.Text\n#. /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_SewerCreatures\"\nmsgid \"It was nice to see you again.\"\nmsgstr \"很高兴再次见到你。\"\n\n#. Key:\t77959A144131C47488B221ADD9B1E13B\n#. SourceLocation:\t/Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_16.Text\n#. /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_SewerCreatures\"\nmsgid \"Don't worry! I'm still looking for it.\"\nmsgstr \"别担心! 我还在找呢。\"\n\n#. Key:\t7914F3CA40844C2A13A760BB0DAE1BFA\n#. SourceLocation:\t/Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_4.Text\n#. /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_SewerCreatures\"\nmsgid \"I don't have time for you creature! Stay out of my way!\"\nmsgstr \"我可没时间理你！别挡道！\"\n\n#. Key:\t79A62658414FE0202F2E9AA0E0238BD4\n#. SourceLocation:\t/Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_9.Children(0).Children.Text\n#. /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_9.Children(0).Children.Text\n#: /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_9.Children(0).Children.Text\nmsgctxt \"Dialogue_SewerCreatures\"\nmsgid \"Accept Quest\"\nmsgstr \"接受任务\"\n\n#. Key:\t7EF6CBFA4A9C0B85B26AA6830C6121A2\n#. SourceLocation:\t/Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_1.Children(2).Children.Text\n#. /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_1.Children(2).Children.Text\n#: /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_1.Children(2).Children.Text\nmsgctxt \"Dialogue_SewerCreatures\"\nmsgid \"Leave\"\nmsgstr \"离开\"\n\n#. Key:\t85A2E48A4B27C5EB7DA4CFAA23555629\n#. SourceLocation:\t/Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_26.Text\n#. /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_26.Text\n#: /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_26.Text\nmsgctxt \"Dialogue_SewerCreatures\"\nmsgid \"Farewell and good luck to you as well!\"\nmsgstr \"再见，祝你好运!\"\n\n#. Key:\t9AEDA0E84BABEBCD8F18E8BC2D0B75D0\n#. SourceLocation:\t/Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_20.Text\n#. /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_SewerCreatures\"\nmsgid \"Calm down creature! I mean you no harm.\"\nmsgstr \"你这个生物给我冷静一点! 我对你没有恶意。\"\n\n#. Key:\tB89304534B24114D19DF7AB07635FFDE\n#. SourceLocation:\t/Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_10.Text\n#. /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_SewerCreatures\"\nmsgid \"All right I will see what I can do.\"\nmsgstr \"好吧，我看看我能做什么。\"\n\n#. Key:\tB8BD374E4738BFFDAFAC4EAA19E7A9D2\n#. SourceLocation:\t/Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_23.Text\n#. /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_23.Text\n#: /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_23.Text\nmsgctxt \"Dialogue_SewerCreatures\"\nmsgid \"Oh, thank you!\"\nmsgstr \"噢，谢谢！\"\n\n#. Key:\tCAFA874D4ECD3CBFC0ADFD93048A9AA5\n#. SourceLocation:\t/Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_3.Text\n#. /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_SewerCreatures\"\nmsgid \"Just tell me what do you want...\"\nmsgstr \"告诉我你想要什么…\"\n\n#. Key:\tCF62984840B7508E82BAC0AB9D53EC0A\n#. SourceLocation:\t/Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_9.Children(1).Children.Text\n#. /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_9.Children(1).Children.Text\n#: /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_9.Children(1).Children.Text\nmsgctxt \"Dialogue_SewerCreatures\"\nmsgid \"Decline\"\nmsgstr \"拒绝\"\n\n#. Key:\tDA1FD0DC49E9B2999DCD489699C04106\n#. SourceLocation:\t/Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_1.Children(1).Children.Text\n#. /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_1.Children(1).Children.Text\n#: /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_1.Children(1).Children.Text\nmsgctxt \"Dialogue_SewerCreatures\"\nmsgid \"Let it talk\"\nmsgstr \"让它说话\"\n\n#. Key:\tEAD329F04773358B0CA339A4F155D990\n#. SourceLocation:\t/Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_11.Text\n#. /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_SewerCreatures\"\nmsgid \"I'm sorry but I can't help you.\"\nmsgstr \"对不起，我帮不了你。\"\n\n#. Key:\tDA8649E54E3753ECDF9C4EAAB90D42B6\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/sewertut1.sewertut1:DlgNode_Speech_1.Text\n#. /Game/SO/Dialogues/Wizard/Chapter1/sewertut1.sewertut1:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/sewertut1.sewertut1:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_sewertut1\"\nmsgid \"I don't like the idea of this additional challenge, but without the help of the Keeper you won't be able to get out.\"\nmsgstr \"我不喜欢这个额外的挑战，但是如果没有守护者的帮助，你是不可能出去的。\"\n\n#. Key:\t462EF40B4BF77FA77FD98DB4656692A2\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/sewertut2_magicbox.sewertut2_magicbox:DlgNode_Speech_1.Text\n#. /Game/SO/Dialogues/Wizard/Chapter1/sewertut2_magicbox.sewertut2_magicbox:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/sewertut2_magicbox.sewertut2_magicbox:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_sewertut2_magicbox\"\nmsgid \"It's a magic box! That's what it's supposed to do, demon.\"\nmsgstr \"这是一个神奇的盒子! 它肯定就是，恶魔。\"\n\n#. Key:\tC34B7D8D499A8E8B767A58A19537A1EA\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/sewertut2_magicbox.sewertut2_magicbox:DlgNode_Speech_2.Text\n#. /Game/SO/Dialogues/Wizard/Chapter1/sewertut2_magicbox.sewertut2_magicbox:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/sewertut2_magicbox.sewertut2_magicbox:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_sewertut2_magicbox\"\nmsgid \"Is that box just floating in the air?\"\nmsgstr \"那个盒子只是漂浮在空中吗?\"\n\n#. Key:\t348CCFC54F7E952295416496617F7615\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/sewertut3_silverkey.sewertut3_silverkey:DlgNode_Speech_2.Text\n#. /Game/SO/Dialogues/Wizard/Chapter1/sewertut3_silverkey.sewertut3_silverkey:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/sewertut3_silverkey.sewertut3_silverkey:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_sewertut3_silverkey\"\nmsgid \"What is that crystal?\"\nmsgstr \"那块水晶是什么?\"\n\n#. Key:\t554B6C924D0234A869BDFF9412FC4F49\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/sewertut3_silverkey.sewertut3_silverkey:DlgNode_Speech_1.Text\n#. /Game/SO/Dialogues/Wizard/Chapter1/sewertut3_silverkey.sewertut3_silverkey:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/sewertut3_silverkey.sewertut3_silverkey:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_sewertut3_silverkey\"\nmsgid \"Don't care about that. Focus on finding a way out.\"\nmsgstr \"别管那个。集中精力寻找出路。\"\n\n#. Key:\t015A0B11422A6F2AE027FF8D9DF70664\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_15.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"We need his help.\"\nmsgstr \"我们需要他的帮助。\"\n\n#. Key:\t03C73AA849BF05421AB97BA696A8C9C4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_79.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_79.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_79.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"They always wanted to invade the Outpost. They are many and we are few.\"\nmsgstr \"他们总是想入侵前哨。他们人数众多，而我们寥寥无几。\"\n\n#. Key:\t0849CCCF4491D52B38AE7F827841E479\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_4.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Why should I set you free?\"\nmsgstr \"我为什么要放了你？\"\n\n#. Key:\t090C7BBF4222952E1C3FD38F7CF9927E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_76.Text\n#. Key:\t0AC46EF744AA55EDDA83EDB6899BB2D1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_65.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_76.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_65.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_65.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_76.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Some say Tabby's spirit returned and took the artefacts to Lillian. Maybe that is what happened.\"\nmsgstr \"有人说泰比的灵魂回来了，带着这些工艺品去了莉莉安那里。也许事实就是如此。\"\n\n#. Key:\t094943BF4D9202CE7B1CFCBF151886D5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_19.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Back to the question: will you get me out?\"\nmsgstr \"回到这个问题: 你能把我救出来吗?\"\n\n#. Key:\t0DBF728A4C052550BE5EEDBC9DEFB2E0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_29.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_29.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_29.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"I would invite you for dinner but unfortunately the door is closed.\"\nmsgstr \"我想请你吃饭，但遗憾的是门关着。\"\n\n#. Key:\t112A48C54853F7689E1676A11FA8C352\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_48.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_48.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_48.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"No time to talk!\"\nmsgstr \"没闲功夫交谈！\"\n\n#. Key:\t116C39AA495E99500962E8B3AF10DD4A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_83.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_83.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_83.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"I mean I'm sorry about the others... not that you survived.\"\nmsgstr \"我是对其他人很遗憾，而不是因为你存活下来。\"\n\n#. Key:\t134299214C22044B012C27B62337C08E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_69.Text\n#. Key:\tFD1574E845CB284B7A85F09CA1580DD4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_58.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_69.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_58.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_58.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_69.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"But she is gone for months and no one knows where she might be.\"\nmsgstr \"但是她已经走了好几个月了，没有人知道她可能在哪里。\"\n\n#. Key:\t14BD2A7C45E85692430B34820042C96F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_73.Text\n#. Key:\tEA5320F3406E2BFA9BD954899BFA19DA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_62.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_73.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_62.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_62.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_73.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"He had so many friends. We all gathered and buried him near the Ancient Temple.\"\nmsgstr \"他有很多朋友。我们集合起来，把他埋在民古庙附近。\"\n\n#. Key:\t16E175D0437B4A671F4753A56E840278\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_33.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_33.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_33.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"I’m looking for three artefacts. Do you know something about them?\"\nmsgstr \"我在找三件工艺品。你对它们有什么了解吗？\"\n\n#. Key:\t174BA1E34131FB1BD5A543A3CB86C724\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_35.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_35.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_35.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"I will return to the Main Station at Crossroad Cave and see what I can do with the trains.\"\nmsgstr \"我将回到十字路口洞穴的主站，看看我能对火车做些什么。\"\n\n#. Key:\t1769115D4B72AB6CF8641487126A4A18\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_22.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"It has a key. The end of it is shaped like a dwarven helmet. You can easily recognise it.\"\nmsgstr \"它有一把钥匙。它的末端形状像一个地精的头盔。你很容易就能认出它。\"\n\n#. Key:\t17CBB2E24B331E4C5682919AAD2E7F2E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_60.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_60.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_60.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"What happened to Tabby?\"\nmsgstr \"泰比怎么了？\"\n\n#. Key:\t1AA8B2E541B2B2E7CA1E86B1E08C1E5A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_7.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"They are all dead...\"\nmsgstr \"他们都死了...\"\n\n#. Key:\t1FCCD37546681195736D2290A8DAE121\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_28.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Oh, it’s you again.\"\nmsgstr \"噢，又是你。\"\n\n#. Key:\t2581B27E486A1C71835E5BB44B0AE05E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_37.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_37.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_37.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"But first I finish my supper. See you there!\"\nmsgstr \"但我先吃完晚饭。看到你在那里!\"\n\n#. Key:\t2589E4AA4E5A406F6A98CB87D7382DC0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_6.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Just ask one of the other dwarfs to open the door.\"\nmsgstr \"只要叫其他地精的一个打开门。\"\n\n#. Key:\t26162C784D2E65A2F8F491A80838F754\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_24.Children(4).Children.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_24.Children(4).Children.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_24.Children(4).Children.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Everyone dead?\"\nmsgstr \"所有人都死了？\"\n\n#. Key:\t2FEAED2844737D1B20BA64AE2414D8C6\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_72.Text\n#. Key:\tA119C2164FDE16E8F84B4E89578A1015\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_61.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_72.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_61.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_61.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_72.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"By the time I found him he was dead.\"\nmsgstr \"我找到他的时候，他已经死了。\"\n\n#. Key:\t3203A6044456CD8213037A9B1B668763\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_2.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Please help me out!\"\nmsgstr \"请帮帮我！\"\n\n#. Key:\t32C0BE7F49563BC2846691B4F163AEF7\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_8.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Well that explains why they didn’t come for me over the last four months.\"\nmsgstr \"这就解释了为什么他们在过去的四个月里没有来找我。\"\n\n#. Key:\t35F849134220FAE43E07268C439CE3A1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_31.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_31.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_31.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"What were you Dwarves doing here?\"\nmsgstr \"你们地精在这儿干吗?\"\n\n#. Key:\t39D36DCA4CD40A7E19D4F5AE69954DC3\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_71.Text\n#. Key:\tEFD384D542A5869726CAB7945F4C0EC4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_54.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_71.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_54.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_54.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_71.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Tabby found the three artefacts but on his way home he got injured.\"\nmsgstr \"泰比找到了三件工艺品，但在回家的路上他受伤了。\"\n\n#. Key:\t39DEF30C4C3CCAB79867339AABD92BA0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_24.Children(3).Children.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_24.Children(3).Children.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_24.Children(3).Children.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Artefacts\"\nmsgstr \"工艺品\"\n\n#. Key:\t3AF0406744C4656C5604EF931A688715\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_23.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_23.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_23.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"I've found the key!\"\nmsgstr \"我找到钥匙了！\"\n\n#. Key:\t3E074E784D66BE166553EB9F85D9854A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_3.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"How can I set you free?\"\nmsgstr \"我怎样才能让你自由？\"\n\n#. Key:\t4100ECBE40C53051121F4C8A588FBDCB\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_24.Children(2).Children.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_24.Children(2).Children.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_24.Children(2).Children.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Train\"\nmsgstr \"火车\"\n\n#. Key:\t41085B174230937FAF97CDBC868F852A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_24.Children(5).Children.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_24.Children(5).Children.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_24.Children(5).Children.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Leave\"\nmsgstr \"离开\"\n\n#. Key:\t4204AAFB49C665B3CC32D78301307582\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_45.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_45.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_45.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Do you mean those traps out there?\"\nmsgstr \"你是说那些陷阱吗?\"\n\n#. Key:\t44AF6FF04B8A23F656F485AB9F1AFE60\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_36.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_36.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_36.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Catch me there if you need to go somewhere!\"\nmsgstr \"如果你需要去什么地方，就在那儿找我!\"\n\n#. Key:\t48FC728C4467C7CF9692AEB8CC71352D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_49.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_49.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_49.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"I will catch you at Crossroad Cave after I finished my supper.\"\nmsgstr \"我吃完晚饭就去十字路口洞穴找你。\"\n\n#. Key:\t4A74231B43F74B39906C85904332EE87\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_5.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"What happened? How did you end up here?\"\nmsgstr \"发生了什么事?  你怎么到这儿来的?\"\n\n#. Key:\t4FE354D247D257B181993087E5ADC74C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_11.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Errr... I don’t know... out of pure righteousness perhaps?\"\nmsgstr \"哦…… 我不知道… 也许是出于纯粹的正义?\"\n\n#. Key:\t529895FF4D6B505A0EDB5081215845AE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_53.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_53.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_53.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"He wasn't just an ordinary cat. He was somehow connected to a charming young girl called Lillian.\"\nmsgstr \"他不只是一只普通的猫。不知怎么的，他和一个叫莉莉安的迷人的年轻女孩扯上了关系。\"\n\n#. Key:\t5C005582439FD5753AA90BB72F3284C8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_44.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_44.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_44.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"We build walls. We create machines out of golem spirits with simple rules which can't go wrong.\"\nmsgstr \"我们筑造了墙壁。我们用简单的规则创造出不会出错的机器人灵魂。\"\n\n#. Key:\t5C48292B4E4F1FAF4D7BB487713EA0B1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_59.Text\n#. Key:\t7F06827C4756423AE024F99922B00FDE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_70.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_59.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_70.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_59.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_70.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"I hope she will return.\"\nmsgstr \"我希望她会回来。\"\n\n#. Key:\t624EDA19418303508EA7F58C5BD0DB4E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_20.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"All right!\"\nmsgstr \"好的！\"\n\n#. Key:\t64E994E34D543F58D0F9DAA386AD7438\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_12.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Or do you like trains? I can help you redirect them to stations you couldn’t go otherwise.\"\nmsgstr \"那你喜欢火车吗?  我可以帮你把它们转去你去不了的地方。\"\n\n#. Key:\t674A3DC8404EF8FC317D72A70877A0FF\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_16.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Errr... You know, sometimes in the evening I come here and have some late dinner. And there are others who think it would be funny to close the door when I'm inside.\"\nmsgstr \"哦…… 你知道，有时候晚上我来这里吃晚餐。还有一些人觉得当我在里面的时候把门关上很有趣。\"\n\n#. Key:\t6B07A15F4E86ECA507DE1DA9B0634774\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_74.Text\n#. Key:\t8F415D40481AA448025D79AB123B2DEB\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_63.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_74.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_63.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_63.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_74.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"He was a good friend. We all miss him.\"\nmsgstr \"他是个很好的朋友。我们都很想念他。\"\n\n#. Key:\t6B47D3994D188506700B48BE85E0C740\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_14.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Once you collected all the artefacts you will need to take them back to a point where I can transport you to the Human Realm.\"\nmsgstr \"一旦你收集了所有的工艺品，你需要把它们带回一个指定地点，在那里我可以把你带到人类王国。\"\n\n#. Key:\t6B72634A488C0A9471F52AA154E56709\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_82.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_82.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_82.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"I’m sorry about that.\"\nmsgstr \"我很抱歉。\"\n\n#. Key:\t6C7C51F44B3881DDF4AE41B10F4D29E1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_52.Children(0).Children.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_52.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_52.Children(0).Children.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Tabby?\"\nmsgstr \"泰比？\"\n\n#. Key:\t6EC585D64AFBB18576EE17B9DFC08AD7\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_2.Children(2).Children.Text\n#. Key:\tFB66CFE943F6EF32D1A40987B969DCDF\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_52.Children(1).Children.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_2.Children(2).Children.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_52.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_2.Children(2).Children.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_52.Children(1).Children.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"What happened?\"\nmsgstr \"怎么了？\"\n\n#. Key:\t766A9A50425FA0D0A0374390B2AF5980\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_17.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"I like jokes and it would have been funny for I don’t know a few hours maybe...\"\nmsgstr \"我喜欢笑话，这可能会很有趣，我不知道，也许几个小时……\"\n\n#. Key:\t81ABC3E441BE2D3A19257BBC9DDD42D0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_41.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_41.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_41.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"You can go down there by using the elevator.\"\nmsgstr \"你可以乘电梯下去。\"\n\n#. Key:\t85B4C0DB47A2A3C3D504C29965DB6390\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_75.Text\n#. Key:\tE6F106AA404B92C9C6E8889876002813\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_64.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_75.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_64.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_64.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_75.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"We left the artefacts at his tomb, but one day later they disappeared.\"\nmsgstr \"我们把这些工艺品留在他的墓前，但一天后它们就不见了。\"\n\n#. Key:\t88F0611349D22BB5B8411FA1232B8724\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_38.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_38.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_38.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Bye!\"\nmsgstr \"再见！\"\n\n#. Key:\t8A2BA24948D65C3EC801B6AA589C206F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_30.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_30.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_30.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Welcome back!\"\nmsgstr \"欢迎回来！\"\n\n#. Key:\t8A3CCFA44EAB376D6CB4C3B7DD8CEE8D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_53.Children(0).Children.Text\n#. Key:\tEEEF64F84F3FE0A37D029EB1A8BBE8A9\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_55.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_53.Children(0).Children.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_55.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_53.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_55.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Lillian?\"\nmsgstr \"莉莉安？\"\n\n#. Key:\t8B9C46EA4C46385E6B3770BBD4648280\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_67.Text\n#. Key:\t999245954FBA1853A5E67A88353F152E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_56.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_67.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_56.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_56.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_67.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Lillian was really kind to us Dwarves. We couldn't ever meet her in person but she could talk to us via the cat Tabby.\"\nmsgstr \"莉莉安对我们矮人真的很好。我们不能亲自见她，但她可以通过泰比和我们交谈。\"\n\n#. Key:\t90C6625D4ED5F6EA08B07A87450A1BC9\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_32.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_32.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_32.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"You said something about trains...\"\nmsgstr \"你说了关于火车的事…\"\n\n#. Key:\t92793D7F4D0351BF74BB6A8C3EE6A182\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_21.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"How can I open the door?\"\nmsgstr \"我怎么开门?\"\n\n#. Key:\t941CF27C40D3D82D6B41F5B3DD6501BB\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_52.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_52.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_52.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"My friend Tabby was also looking for artefacts.\"\nmsgstr \"我的朋友泰比也在寻找工艺品。\"\n\n#. Key:\t991D611A4F8BE2F8EAC77C9D746BAF95\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_78.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_78.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_78.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"I think the Kobolds attacked us by surprise.\"\nmsgstr \"我认为地精是突然袭击我们的。\"\n\n#. Key:\t9A7FA46C4687C80EBE3B4580631E9B8E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_43.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_43.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_43.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"After the Cataclysm we realized the only way to fight madness is to create rules to follow.\"\nmsgstr \"大灾难之后，我们意识到对抗疯狂的唯一方法就是制定规则。\"\n\n#. Key:\t9E9CE4714145ED45CA301AACA6CEBBAF\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_40.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_40.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_40.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"But there is a spare key in the Catacombs.\"\nmsgstr \"但是地下墓穴里有一把备用钥匙。\"\n\n#. Key:\t9ED5DDC74852A2007D25CDB418A3EDDA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_46.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_46.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_46.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"They surely have nothing to do with madness...\"\nmsgstr \"他们肯定与疯狂没什么关系 ……\"\n\n#. Key:\tA0117BB74AB541DE10847FBC5E5CCB32\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_10.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"What we were doing? Well we Dwarves are not like other creatures you might have met.\"\nmsgstr \"我们在做什么? 我们地精和你可能见过的其他生物不一样。\"\n\n#. Key:\tA258ABB740D6727685853E88F32936E2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_13.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"That sounds useful.\"\nmsgstr \"这听起来很有用。\"\n\n#. Key:\tA3F231E34FB4B95DD27A84B9326E0BFE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_24.Children(0).Children.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_24.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_24.Children(0).Children.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Key\"\nmsgstr \"钥匙\"\n\n#. Key:\tB0B806C147D2EB9F312987B49DEBFC8F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_47.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_47.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_47.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"See? They are simple, effective and logical. Ruin can't harm us as long as we follow all the rules.\"\nmsgstr \"看到了吗?  它们简单、有效、合乎逻辑。只要我们遵守所有的规则，毁灭就不会伤害我们。 \"\n\n#. Key:\tB464CECC4F774535530FC685E0F62787\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_77.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_77.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_77.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Do you have any idea how the others died?\"\nmsgstr \"你知道其他人是怎么死的吗?\"\n\n#. Key:\tBE69B91C466965EEF56A6F920AF9E5A8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_9.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"I thought they were just kidding.\"\nmsgstr \"我以为他们只是在开玩笑。\"\n\n#. Key:\tBFEAB99A4FE8C61CC35BCC9E926EFA97\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_51.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_51.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_51.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Just help me out.\"\nmsgstr \"帮帮我吧。\"\n\n#. Key:\tC06E3A27466B5D6C7FC4A39E55739800\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_18.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"But being here for four months seems a bit too much for me.\"\nmsgstr \"但是在这里呆四个月对我来说有点太久了。\"\n\n#. Key:\tC31327F8430D2259C27BAE91F44F0119\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_2.Children(0).Children.Text\n#. Key:\tCCD4C84941546627E158A4915B41CDB7\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_19.Children(0).Children.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_2.Children(0).Children.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_19.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_19.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_2.Children(0).Children.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"How?\"\nmsgstr \"如何？\"\n\n#. Key:\tC3BFAD59497E357A8180ADB86C75F14B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_68.Text\n#. Key:\tFF1A18C04F33FF434A2821A725CBFB5C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_57.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_68.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_57.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_57.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_68.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"She cared about us. She knew all our Strongholds and Outposts. She always warned us before the Kobolds attacked.\"\nmsgstr \"她在乎我们。她知道我们所有的据点和前哨。她总是在地精攻击之前警告我们。\"\n\n#. Key:\tC5A94EDD47BC3D5F422A29982308E78D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_19.Children(1).Children.Text\n#. Key:\tF811970946DF32346DAE66AFE2F64664\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_2.Children(1).Children.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_19.Children(1).Children.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_2.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_19.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_2.Children(1).Children.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Why?\"\nmsgstr \"为什么？\"\n\n#. Key:\tC8E54B6E448A194DEB141C84323308F6\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_80.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_80.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_80.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"It was only a matter of time.\"\nmsgstr \"这只是时间问题。\"\n\n#. Key:\tCA02594643A55D1128F06FB2E8FDE676\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_50.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_50.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_50.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Yes, trains. I can help you reach destinations you couldn't reach on your own.\"\nmsgstr \"是的, 火车。我可以帮你到达你自己无法到达的目的地。\"\n\n#. Key:\tCC191532450BFB2679AFD88AD95B72B2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_1.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Finally someone!\"\nmsgstr \"终于有人了！\"\n\n#. Key:\tCF4351D047E267981EF869BE88BB0753\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_24.Children(1).Children.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_24.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_24.Children(1).Children.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Dwarves\"\nmsgstr \"地精\"\n\n#. Key:\tD2377C864A2A80F17AD81581D7A7807F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_81.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_81.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_81.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Odd that I survived.\"\nmsgstr \"奇怪的是我活了下来。\"\n\n#. Key:\tDF12303E4C7A4DFB00054EA7CE07FF88\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_39.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_39.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_39.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Errr... I don't know.\"\nmsgstr \"呃... 我不知道。\"\n\n#. Key:\tE8270F474353ECB77560C4A1173638A2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_27.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_27.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_27.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Any idea where that key might be?\"\nmsgstr \"知道钥匙在哪里吗?\"\n\n#. Key:\tEF1EFC6E4119CC9B41AF21ACE008D3B5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_26.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_26.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_26.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Have you found the key?\"\nmsgstr \"你找到钥匙吗？\"\n\n#. Key:\tF47418854FDFB9AD0E10468BEC8F1F58\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_42.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_42.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_42.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"I need to go now.\"\nmsgstr \"我现在得走了。\"\n\n#. Key:\tF553C35F43DFC6CA04DA48A738597696\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_25.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_25.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_25.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Back already?\"\nmsgstr \"已经回来了？\"\n\n#. Key:\tFF942F904300D874A8C59AB8A954EF86\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_34.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_34.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_34.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Well done! Thank you! Thank you!\"\nmsgstr \"干得好！谢谢！谢谢！\"\n\n#. Key:\t0499C9ED4395C4DD8AD1E48E854CD983\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_20.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"It was nice to see you too!\"\nmsgstr \"见到你也很高兴！\"\n\n#. Key:\t07153D014D72AF193040BA91A18BDC0A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_24.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_24.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_24.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"Great!\"\nmsgstr \"太好了！\"\n\n#. Key:\t106E51E34033895E5C7F348AF8994564\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_13.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"Er... Thanks! We'll talk about this later.\"\nmsgstr \"呃…谢谢! 我们稍后再谈。\"\n\n#. Key:\t18E140B74385C5E48F23E0B7E862E569\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_19.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"Hello! It's nice to see you again.\"\nmsgstr \"你好! 很高兴再次见到你。\"\n\n#. Key:\t25F72BCA416C39658A0879A27417EA6B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_8.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"Don’t worry, I’ll make ready a train for you heading that way.\"\nmsgstr \"别担心，我会为你准备好开往那个方向的火车。\"\n\n#. Key:\t26CBB1CD40F2080DE2183BA6AB3D2014\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_4.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"Ask him how you can travel to World’s End.\"\nmsgstr \"问问他你怎样才能到达世界的尽头。\"\n\n#. Key:\t26D1F4534C708623FB300DBE4EECADD2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_22.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"But I can't go back, because it's not safe.\"\nmsgstr \"但我不能回去，因为不安全。\"\n\n#. Key:\t2B14E76B4B16316D7525FFA6D37E4CBB\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_14.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"You know I'm a bit worried about what will happen to the Outpost.\"\nmsgstr \"你知道我有点担心前哨的事。\"\n\n#. Key:\t2BB0F16046A4CD8DF05DE6A95D2CF9B3\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_2.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"I’m really glad you found that key for me. Now I can finish my supper outside in fresh air!\"\nmsgstr \"真高兴你帮我找到了那把钥匙。现在我可以在外面新鲜的空气中吃完我的晚餐了!\"\n\n#. Key:\t36EF13F042D5B5ADB870BEB97F688D08\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_29.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_29.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_29.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"Take this! You deserve it!\"\nmsgstr \"收下吧! 你受之无愧！\"\n\n#. Key:\t3E09B8F746E999130D26A0BEA945E6D6\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_15.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"Is everything all right?\"\nmsgstr \"一切都好吗?\"\n\n#. Key:\t4D5A326948713FE977D0DBB68CF4A475\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_27.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_27.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_27.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"Except those crazy traps...\"\nmsgstr \"除了那些疯狂的陷阱…\"\n\n#. Key:\t5BE2C4324B64B35BD181B49E2D63E87F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_3.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"By the way, in case you need to go somewhere with the train just let me know.\"\nmsgstr \"顺便说一下，如果你需要搭火车去什么地方，请告诉我。\"\n\n#. Key:\t66EDC37F4F3B3813F1B92D91A4107ADE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_17.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"I have banished some of the monsters lurking in the Outpost.\"\nmsgstr \"我已经驱逐了一些潜伏在前哨的怪物。\"\n\n#. Key:\t67EED0C742F3B4ED0A9B929C4B517A4A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_18.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"The Outpost is safe again.\"\nmsgstr \"前哨又安全了。\"\n\n#. Key:\t6F1AF94E4DE4A338EFF79C85D99B944A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_19.Children(1).Children.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_19.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_19.Children(1).Children.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"Outpost\"\nmsgstr \"前哨\"\n\n#. Key:\t84D15B994BADC0AAED61848E817E49E1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_9.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"Thanks!\"\nmsgstr \"谢谢！\"\n\n#. Key:\t8C7D69324C544DAC53C5CCA724B4B461\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_23.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_23.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_23.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"Could you somehow make the enemies move to somewhere else maybe?\"\nmsgstr \"你能让敌人转移到别的地方吗?\"\n\n#. Key:\t8F66738A44B7D19EABAD40873B3FCAA3\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_19.Children(0).Children.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_19.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_19.Children(0).Children.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"Do you need help?\"\nmsgstr \"你需要帮忙吗？\"\n\n#. Key:\t9249DFC34CFB46E1738C97A3283268D2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_28.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"Well done! Well done!\"\nmsgstr \"干得好！干得好！\"\n\n#. Key:\tA027C29849372B1C452083A84609B1F5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_19.Children(2).Children.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_19.Children(2).Children.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_19.Children(2).Children.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"Leave\"\nmsgstr \"离开\"\n\n#. Key:\tA037C9E543AC131DAF4B6281A27BD56C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_1.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"Hello again my friend!\"\nmsgstr \"又见面了，我的朋友！\"\n\n#. Key:\tA4F1343D4D537FC1907096B564D3842E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_7.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"Oh, it must be a charming place!\"\nmsgstr \"哦，那一定是个迷人的地方！\"\n\n#. Key:\tACF022EF4C55A6553F29DB969827379D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_26.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_26.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_26.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"Anyway, take this for your effort!\"\nmsgstr \"不管怎样，这是你的努力成果!\"\n\n#. Key:\tB680A1D54923C59C081E46A65A2754D1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_21.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"As the last Defender, it would be my duty to keep that place safe.\"\nmsgstr \"作为最后一名守卫者，我有责任保护好那个地方。\"\n\n#. Key:\tB9E0526D41FDB742FCB51991A0220B17\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_5.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"That’s where I can take you out of the Ruined Realm.\"\nmsgstr \"我就可以带你离开这片毁灭王国。\"\n\n#. Key:\tBF1AD65A407133C13B811CB14A997A2A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_11.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"We can talk some more once I've finished my supper...\"\nmsgstr \"等我吃完晚饭，我们可以再聊一会儿……\"\n\n#. Key:\tE211EA4D4D69D09144B914850B17A8AE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_25.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_25.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_25.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"Well, I can't do my duty until you banish all of them.\"\nmsgstr \"除非你把他们都赶走，否则我是不会履行我的职责的。\"\n\n#. Key:\tEFD408FF4DAFD18E10ED3282D959914E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_12.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"You don't need to go anywhere before you find the three artefacts.\"\nmsgstr \"你不需要去任何地方就能找到这三件文物。\"\n\n#. Key:\tF500AA3C494B40302E298CA54FF3344B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_6.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"I would like to go to World’s End.\"\nmsgstr \"我想去世界的尽头。\"\n\n#. Key:\tFDC63C35472E1752E2D092BC77DAD28B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_16.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"I'll see what I can do.\"\nmsgstr \"我看看我能做什么。\"\n\n#. Key:\t00A5A8684B1EF5FF2319428685540844\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_13.Children(0).Children.Text\n#. Key:\t471B46884399845B6D9442A8EADC2A48\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_9.Children(0).Children.Text\n#. /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_13.Children(0).Children.Text\n#. /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_9.Children(0).Children.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_13.Children(0).Children.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_9.Children(0).Children.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"Portal\"\nmsgstr \"入口\"\n\n#. Key:\t03EA3D4249797B593981C1B699A2CF5A\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_1.Text\n#. /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"Oh! The Walking Ball returned! Just in time!\"\nmsgstr \"哦! 步行球回来了! 很准时！\"\n\n#. Key:\t04DC604342615AD3DCFCE99EB9AAF157\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_19.Children(1).Children.Text\n#. Key:\t1070909F4434D9B0D03DD3BD62692CE0\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_16.Children(0).Children.Text\n#. Key:\t76A679CE45B5A9A47CA620A396E02F48\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_13.Children(2).Children.Text\n#. Key:\t8FC1E822454A2FDA1847119C5004F161\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_21.Children(0).Children.Text\n#. Key:\t9036093D446B2F8C34705BBCFC73F4A0\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_9.Children(2).Children.Text\n#. /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_19.Children(1).Children.Text\n#. /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_16.Children(0).Children.Text\n#. /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_13.Children(2).Children.Text\n#. /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_21.Children(0).Children.Text\n#. /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_9.Children(2).Children.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_13.Children(2).Children.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_16.Children(0).Children.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_19.Children(1).Children.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_21.Children(0).Children.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_9.Children(2).Children.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"Leave\"\nmsgstr \"离开\"\n\n#. Key:\t142E85484BA4E9CF475F0780D951BAE5\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_8.Text\n#. /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"But they were so tasty.\"\nmsgstr \"但是它们很好吃。\"\n\n#. Key:\t1E763B4D4D535AA83B50D4B87DB5A15D\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_17.Text\n#. /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"You again?\"\nmsgstr \"又是你？\"\n\n#. Key:\t2430044E46A3456249D6A99D0FC31D30\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_9.Children(1).Children.Text\n#. Key:\tB3695A284A15574F3874BDAB1B8C14EB\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_19.Children(0).Children.Text\n#. Key:\tDC8D78774D326DA9A70EFC81A857A417\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_13.Children(1).Children.Text\n#. /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_9.Children(1).Children.Text\n#. /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_19.Children(0).Children.Text\n#. /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_13.Children(1).Children.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_13.Children(1).Children.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_19.Children(0).Children.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_9.Children(1).Children.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"Give Weird Device\"\nmsgstr \"给奇怪的装置\"\n\n#. Key:\t29AD586B41502E4FAFF79E94FDADA50D\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_5.Text\n#. /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"Unfortunately I don't have any.\"\nmsgstr \"不幸的是我没有。\"\n\n#. Key:\t3418CA5A44B4531926317CB100CEC2F4\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_13.Text\n#. /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"Just let me know when you're done! Meanwhile, I'll be reading a few more pages.\"\nmsgstr \"做完了就告诉我! 同时，我还要再读几页。\"\n\n#. Key:\t37CD676C4C4F585C3CC048B56EEF6B92\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_3.Text\n#. /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"I was supposed to find a portal here.\"\nmsgstr \"我应该能在这里找到入口。\"\n\n#. Key:\t3C2778B12A09151A002F016B1E3F6212\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_7.Text\n#. /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"Also, if I hadn't drank the last two bottles... that would have helped...\"\nmsgstr \"还有，如果我没有喝完最后两瓶…… 也许还有帮助……\"\n\n#. Key:\t42E3EE32491F578E618913B4AF958187\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_6.Text\n#. /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"Really? That sounds like my students! They were always complaining about unannounced examinations or even worse, \\\"Why are there no lessons tomorrow?\\\".\"\nmsgstr \"真的吗? 听起来像是我的学生! 他们总是抱怨考试不提前通知，还有，“为什么明天没有课?”\"\n\n#. Key:\t44626CCD498CA592B8FAD1B01EDF33AB\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_2.Children(0).Children.Text\n#. /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_2.Children(0).Children.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_2.Children(0).Children.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"Don't have\"\nmsgstr \"没有\"\n\n#. Key:\t55EAD2524D0BCF52B25A1B9EAB1754B2\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_11.Text\n#. /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"That's it my ball! I wish I had more students like you.\"\nmsgstr \"这是我的球! 真希望我能有更多像你这样的学生。\"\n\n#. Key:\t6682474947E016803A188FA968FD76BE\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_16.Text\n#. /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"Oh my...\"\nmsgstr \"噢，我的...\"\n\n#. Key:\t786849EF4E531580865712BBEDD25B32\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_21.Text\n#. /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"That is amazing! Thank you, my globular friend! Take these coins, I am sure that you will enjoy spending them on... on whatever Balls like you like to get.\"\nmsgstr \"太厉害了! 谢谢你，我的球形朋友! 把这些硬币拿去吧，我相信你会乐意把它们用来买……你喜欢的球。\"\n\n#. Key:\t7FFC816545AA219D43FCA3A2ABF33E9E\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_9.Text\n#. /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"Nevermind, I will just read a bit more... at least until a solution is found for the whole problem.\"\nmsgstr \"算了，我再多读一点……  至少在整个问题找到解决方案之前先这样吧。\"\n\n#. Key:\t818E4C1245F622C192178CB1F21694A3\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_2.Children(1).Children.Text\n#. /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_2.Children(1).Children.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_2.Children(1).Children.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"What's the matter?\"\nmsgstr \"出什么事了？\"\n\n#. Key:\t84A119EB4FFB518BA7AA6394768F1DD3\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_18.Text\n#. /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"Did the Gatekeeper open the gate for you?\"\nmsgstr \"守护者帮你开门了吗？\"\n\n#. Key:\t88FD93954B70482DAC5F2AA5332F23D5\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_12.Text\n#. /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"One must always be eager to solve a problem. No matter how challenging that is.\"\nmsgstr \"一个人必须总是急于解决问题。无论这有多么具有挑战性。\"\n\n#. Key:\t9CEE1942434DACB2DB3C1AA2005A1E94\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_10.Text\n#. /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"But we might find another way to solve the problem.\"\nmsgstr \"但我们可能会找到另一种方法来解决这个问题。\"\n\n#. Key:\tC070EF8E47744D116D4E39AC8F7C1941\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_2.Text\n#. /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"I hope that you still have at least one bottle of that potion of mine. I could really use some...\"\nmsgstr \"我希望你至少还有一瓶我的那种药水。我真的需要一些…\"\n\n#. Key:\tC39CD0F34CDFDCB0B2CF08917834F1A8\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_20.Text\n#. /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"Here is a Weird Device that I found in the hideout of the Secret Science Society.\"\nmsgstr \"这是我在秘密科学协会的藏身处发现的一个奇怪的装置。\"\n\n#. Key:\tCBB0BCAF4E19F942AC57F988104A9A65\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_4.Text\n#. /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"I've used all of them to get back from the Sewer. You should have told me that there is another way out!\"\nmsgstr \"为了从下水道回来我把它们都花光了。你之前就应该告诉我还有另一条出路!\"\n\n#. Key:\tE866A83647B163E53260C2B541AA0D7B\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_14.Text\n#. /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"Well, the portal is definitely here, but as you might have already noticed, the place is a bit worn.\"\nmsgstr \"嗯，入口肯定在这里，但是正如您可能已经注意到的，这个地方有点破旧。\"\n\n#. Key:\tF0A4AD1448267D94CAB7F79AD6CEFD59\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_19.Text\n#. /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"Not Yet.\"\nmsgstr \"还没有。\"\n\n#. Key:\tF83C2C894C2EA511DCDCE6B824CC0591\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_15.Text\n#. /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"Only the Gatekeeper can reopen the portal.\"\nmsgstr \"只有守护者才能重新打开入口。\"\n\n#. Key:\t76653DEC40EE0ED098B5EE8810B1A097\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/TL_GetSoulkeeper.TL_GetSoulkeeper:DlgNode_Speech_3.Text\n#. /Game/SO/Dialogues/Wizard/Chapter1/TL_GetSoulkeeper.TL_GetSoulkeeper:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/TL_GetSoulkeeper.TL_GetSoulkeeper:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_TL_GetSoulkeeper\"\nmsgid \"A Spellcaster. It makes you able to use the Ruined Realm's magic, at least, up to a certain level.\"\nmsgstr \"施法者。至少在一定程度上，它能让你使用被毁灭王国的魔法。\"\n\n#. Key:\tBD48F7804F49751510AB2E909906C52F\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/TL_GetSoulkeeper.TL_GetSoulkeeper:DlgNode_Speech_2.Text\n#. /Game/SO/Dialogues/Wizard/Chapter1/TL_GetSoulkeeper.TL_GetSoulkeeper:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/TL_GetSoulkeeper.TL_GetSoulkeeper:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_TL_GetSoulkeeper\"\nmsgid \"What is it?\"\nmsgstr \"这是什么？\"\n\n#. Key:\tDFF1C93D4005A778F0B696A2DC949DC6\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/TL_GetSoulkeeper.TL_GetSoulkeeper:DlgNode_Speech_1.Text\n#. /Game/SO/Dialogues/Wizard/Chapter1/TL_GetSoulkeeper.TL_GetSoulkeeper:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/TL_GetSoulkeeper.TL_GetSoulkeeper:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_TL_GetSoulkeeper\"\nmsgid \"That amulet is useful.\"\nmsgstr \"那个护身符很有用。\"\n\n#. Key:\t09CDAFF84CF3F066B25A228640D45277\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_TL_Monk\"\nmsgid \"Please tell your Wizard that Monk would like to have a word with him.\"\nmsgstr \"请告诉你的巫师，修道士想和他谈谈。\"\n\n#. Key:\t0E97585C46B73E4AF939169CF45067A3\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_10.Text\n#. /Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_TL_Monk\"\nmsgid \"I can only guess that right now, he's complaining about me.\"\nmsgstr \"我现在只能猜测，他在抱怨我。\"\n\n#. Key:\t2E82A2B6449D8BA37ADBE7AEE1486791\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_11.Text\n#. /Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_TL_Monk\"\nmsgid \"Just get rid of him.\"\nmsgstr \"把他干掉。\"\n\n#. Key:\t430D927D40EF24EED23E55A83F48FDD7\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_TL_Monk\"\nmsgid \"I'm sorry but he doesn't want to talk to you.\"\nmsgstr \"对不起，他不想和你说话。\"\n\n#. Key:\t59E21DC1476038EAD4EC91BC00DA4D8B\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_3.Children(2).Children.Text\n#. /Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_3.Children(2).Children.Text\n#: /Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_3.Children(2).Children.Text\nmsgctxt \"Dialogue_TL_Monk\"\nmsgid \"Ask Wizard\"\nmsgstr \"询问巫师\"\n\n#. Key:\t5AFB166C49DEB2D9017AED887A1E424D\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_15.Text\n#. /Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_TL_Monk\"\nmsgid \"Farewell, my friend, until we meet again!\"\nmsgstr \"再见了，我的朋友，下次再见！\"\n\n#. Key:\t5D80CBEB46203E3A759B498B95571F4F\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_3.Children(1).Children.Text\n#. /Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_3.Children(1).Children.Text\n#: /Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_3.Children(1).Children.Text\nmsgctxt \"Dialogue_TL_Monk\"\nmsgid \"I won't transfer!\"\nmsgstr \"我不会转移！\"\n\n#. Key:\t66D9E1874A9749A8881372807C0B9D54\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_TL_Monk\"\nmsgid \"Ha-ha-ha... I know he heard everything.\"\nmsgstr \"哈哈哈…… 我知道他什么都听到了。\"\n\n#. Key:\t8BD7C20C4084000925D1489BE3F6EE15\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_TL_Monk\"\nmsgid \"I don't talk to him!\"\nmsgstr \"我不和他说话！\"\n\n#. Key:\tA227CE5A47002A80D3988ABA1364CF3E\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_3.Children(0).Children.Text\n#. /Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_3.Children(0).Children.Text\n#: /Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_3.Children(0).Children.Text\nmsgctxt \"Dialogue_TL_Monk\"\nmsgid \"Wizard don't want\"\nmsgstr \"巫师不想要\"\n\n#. Key:\tA8E469374586A1D8A734D696AF662F9A\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_13.Text\n#. /Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_TL_Monk\"\nmsgid \"I also have something for you, Wanderer!\"\nmsgstr \"我也有东西给你，流浪者!\"\n\n#. Key:\tCE0E3B1B424BEDDF4A830B8DD0BB3272\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_19.Text\n#. /Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_TL_Monk\"\nmsgid \"This might help you along the way.\"\nmsgstr \"这可能会对你有所帮助。\"\n\n#. Key:\tD6B184754B86F236C93454A95BF92B31\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_TL_Monk\"\nmsgid \"I won't deliver your messages anymore! If the two of you want something, then go get it yourselves!\"\nmsgstr \"我不会再给你送信了! 如果你们两个想要什么，那就自己去争取吧!\"\n\n#. Key:\tDB3AEAF24056B19A7D80E29E7D011D80\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_12.Text\n#. /Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_TL_Monk\"\nmsgid \"That's right. I will give him more time.\"\nmsgstr \"没错。我会给他更多的时间。\"\n\n#. Key:\tE2F9F07A4A2B8D1A578BCC9716AB4D44\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_TL_Monk\"\nmsgid \"Wizard! A fellow named Monk wants to talk to you!\"\nmsgstr \"巫师！一个叫修道士的家伙想和你聊聊！\"\n\n#. Key:\tE8987AC84528E4071DC27E9854C3C4DE\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_TL_Monk\"\nmsgid \"Hello, little Wanderer!\"\nmsgstr \"哈喽，小流浪者！\"\n\n#. Key:\tFF355D9347D0068FBB40879E3EAEA8FB\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_TL_Monk\"\nmsgid \"But please...\"\nmsgstr \"但请拜托...\"\n\n#. Key:\tAC0DE5F1402FBAAFE6587B827D463C3C\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/TL_SoulkeeperHint.TL_SoulkeeperHint:DlgNode_Speech_1.Text\n#. /Game/SO/Dialogues/Wizard/Chapter1/TL_SoulkeeperHint.TL_SoulkeeperHint:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/TL_SoulkeeperHint.TL_SoulkeeperHint:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_TL_SoulkeeperHint\"\nmsgid \"Use the Soulstone to summon the Keeper.\"\nmsgstr \"使用灵魂石召唤守护者。\"\n\n#. Key:\t031849B3493F1528A0146DA55BD7F00F\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/TL_TakeSoulkeeperHint.TL_TakeSoulkeeperHint:DlgNode_Speech_3.Text\n#. /Game/SO/Dialogues/Wizard/Chapter1/TL_TakeSoulkeeperHint.TL_TakeSoulkeeperHint:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/TL_TakeSoulkeeperHint.TL_TakeSoulkeeperHint:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_TL_TakeSoulkeeperHint\"\nmsgid \"It would be easier if I could just simply summon her back to me...\"\nmsgstr \"如果我能把她叫回来就好办多了……\"\n\n#. Key:\t259EE9E14B86B2597D5F4EA60831D269\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/TL_TakeSoulkeeperHint.TL_TakeSoulkeeperHint:DlgNode_Speech_4.Text\n#. /Game/SO/Dialogues/Wizard/Chapter1/TL_TakeSoulkeeperHint.TL_TakeSoulkeeperHint:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/TL_TakeSoulkeeperHint.TL_TakeSoulkeeperHint:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_TL_TakeSoulkeeperHint\"\nmsgid \"Be more careful the next time...\"\nmsgstr \"下次小心点……\"\n\n#. Key:\t86266BC54CC02BE988EA24B18BF76359\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/TL_TakeSoulkeeperHint.TL_TakeSoulkeeperHint:DlgNode_Speech_1.Text\n#. /Game/SO/Dialogues/Wizard/Chapter1/TL_TakeSoulkeeperHint.TL_TakeSoulkeeperHint:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/TL_TakeSoulkeeperHint.TL_TakeSoulkeeperHint:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_TL_TakeSoulkeeperHint\"\nmsgid \"Now go back to the Soulkeeper.\"\nmsgstr \"现在回到灵魂守护者那里。\"\n\n#. Key:\tDCA8CF9A4CFF4644FBD42EADBFC6E773\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/TL_TakeSoulkeeperHint.TL_TakeSoulkeeperHint:DlgNode_Speech_2.Text\n#. /Game/SO/Dialogues/Wizard/Chapter1/TL_TakeSoulkeeperHint.TL_TakeSoulkeeperHint:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/TL_TakeSoulkeeperHint.TL_TakeSoulkeeperHint:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_TL_TakeSoulkeeperHint\"\nmsgid \"Er... It's still with me.\"\nmsgstr \"呃… 它还在我身边。\"\n\n#. Key:\t012DDB8E4423EB98285155B3E1EFBF9A\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_65.Children(2).Children.Text\n#. Key:\t3485AE344D04D0944341F3A7391703EF\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.Children(3).Children.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_65.Children(2).Children.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.Children(3).Children.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_65.Children(2).Children.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.Children(3).Children.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"Set me free\"\nmsgstr \"放了我\"\n\n#. Key:\t04E44BE94ABFE8614689AC890D01001D\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_65.Children(1).Children.Text\n#. Key:\t275944AA468D9CA8613B9586EC3D9C62\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.Children(2).Children.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_65.Children(1).Children.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.Children(2).Children.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_65.Children(1).Children.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.Children(2).Children.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"How to open gate\"\nmsgstr \"如何打开大门\"\n\n#. Key:\t10EB6BE941C633380422F7953F0171DA\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_2.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"I think... I am...\"\nmsgstr \"我想... 我是...\"\n\n#. Key:\t22618C8F490BC5932411FFB41F38C383\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.SpeechSequence(0).SpeechSequence.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.SpeechSequence(0).SpeechSequence.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.SpeechSequence(0).SpeechSequence.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"Oh! A walking ball!\"\nmsgstr \"噢！一个会走的球！\"\n\n#. Key:\t28ED4B8B4023E9A859B8A4BFF7DFEE8A\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_28.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"I am crazy, therefore I think!\"\nmsgstr \"我疯了，所以我想！\"\n\n#. Key:\t389F7FA440377CA4EBA31DA4EE2FEEAE\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_65.Children(3).Children.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_65.Children(3).Children.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_65.Children(3).Children.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"Leave\"\nmsgstr \"离开\"\n\n#. Key:\t408E74BC4DBA10DA41853B9421DBA07B\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_65.Children(0).Children.Text\n#. Key:\t55BC9258400712FE4D5CED8BFA0AD22C\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.Children(1).Children.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_65.Children(0).Children.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.Children(1).Children.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_65.Children(0).Children.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.Children(1).Children.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"How to prove Worthy\"\nmsgstr \"如何证明价值\"\n\n#. Key:\t5D0DBB0344815D41A50D9FA178339BCA\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_24.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_24.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_24.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"Here, take one!\"\nmsgstr \"这儿，拿一个！\"\n\n#. Key:\t5E8C88684BE93A26C26BFBAF23D69FD9\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.SpeechSequence(5).SpeechSequence.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.SpeechSequence(5).SpeechSequence.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.SpeechSequence(5).SpeechSequence.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"And I am not wise. In fact, I am totally crazy. But look on the bright side! At least I am aware of it.\"\nmsgstr \"我不聪明。其实，我整个人都疯了。但是要看到好的一面! 至少我意识到了这点。\"\n\n#. Key:\t5F9588AA4FFA9FEB2C7101B32CB98950\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_55.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_55.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_55.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"Come back if you change your mind!\"\nmsgstr \"如果你改变了主意，就回来吧！\"\n\n#. Key:\t69BF5D3C44D3BE2468ADDF97E99920E9\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_4.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"I think something's happening with the door's mechanism... but who knows? I can definitely hear some creaking! It's hard to guess which one of those is the real one...\"\nmsgstr \"我觉得是门的机械装置出了问题…… 但谁知道呢? 我肯定听到了吱吱的声音! 很难猜出里面哪个是真的……\"\n\n#. Key:\t6B46CC3F44284076B1F460BEE2D93116\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.SpeechSequence(1).SpeechSequence.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.SpeechSequence(1).SpeechSequence.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.SpeechSequence(1).SpeechSequence.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"How unique, how original, how... sporty!\"\nmsgstr \"多么独特，多么原始，多么……运动！\"\n\n#. Key:\t6DFC995B4364B6358A8F00BEDD007C80\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_3.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"I am, therefore I think!\"\nmsgstr \"我是，所以我想！\"\n\n#. Key:\t72FA8AF8413CF23907BB9EA6587F512E\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_63.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_63.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_63.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"I was pretty sure I had to face him too... that's why I prepared! Potion of Worthiness! I have a few bottles...\"\nmsgstr \"我很确定我也得面对他…… 所以我作了准备！价值药剂！我搞了几瓶……\"\n\n#. Key:\t7BB736394144C8B2173886993EE33ADA\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_22.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"Look, I'm forced to stay in this realm so that I could do all these silly tasks for a wizard. Any chance you could help me with that? Please?\"\nmsgstr \"听着，我被迫留在这个王国里，为一个巫师完成这些愚蠢的任务。你能帮我一下吗? 好吗?\"\n\n#. Key:\t7E8985A441145AE9365C64810036EBE0\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.SpeechSequence(3).SpeechSequence.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.SpeechSequence(3).SpeechSequence.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.SpeechSequence(3).SpeechSequence.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"Actually yes, I...\"\nmsgstr \"其实，是的，我...\"\n\n#. Key:\t85CB0B164556D460A07F948F942D7AC4\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_61.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_61.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_61.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"That's how these rusty monsters work like: you pull a few levers here and there, and... whoops, the door is open! It's called science!\"\nmsgstr \"这些生锈的怪物就是这样做的: 你推拉这儿的几根拉杆，然后……哎呦，门开了！这就叫科学!\"\n\n#. Key:\t878921884D0FDCFC78971E828C7D7FBB\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_66.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_66.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_66.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"I've got to go...\"\nmsgstr \"我得走了……\"\n\n#. Key:\t8FF0B1A64B29AAB8DABAC49F5EBCE625\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_60.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_60.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_60.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"That's easy! Just pull every single lever you can find.\"\nmsgstr \"这很简单！把你能找到的每一根拉杆都拔出来。\"\n\n#. Key:\t9163F7AB40673D9EB5C936A37CC7B0C7\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_62.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_62.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_62.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"Sounds like you met the GateKeeper!\"\nmsgstr \"听起来你遇到了守护者！\"\n\n#. Key:\t96EED9B34D798E48F9B47283A5290A5B\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.SpeechSequence(4).SpeechSequence.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.SpeechSequence(4).SpeechSequence.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.SpeechSequence(4).SpeechSequence.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"It was a rhetorical question. I am not old!\"\nmsgstr \"这是个修辞性反问。其实我并不老!\"\n\n#. Key:\tB3141D2247D5DF307B63A4BF330F8070\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_67.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_67.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_67.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"Not really, I don't feel like helping you out. And to be honest, I prefer to stay away from wizards. Sorry!\"\nmsgstr \"不，我不想帮你。说实话，我更希望离巫师远一点。对不起!\"\n\n#. Key:\tB7A8F5A6474D18116F76BC929DB28D40\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_5.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"It's been nice meeting you.\"\nmsgstr \"很高兴认识你。\"\n\n#. Key:\tBE16F7204818B7231748D1B9C55DB4F6\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_1.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"Here, take this! I hope it's worth the trouble... hahaha... Thanks to you I can continue with my journey... after I read a few more pages, of course.\"\nmsgstr \"这个，拿好！希望那些麻烦是值得的... 哈哈哈... 多亏了你我才能继续我的旅程... 当然，在我又读了几页之后。\"\n\n#. Key:\tBF9983D645C558E1AB5D559E70FEFDA0\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.SpeechSequence(6).SpeechSequence.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.SpeechSequence(6).SpeechSequence.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.SpeechSequence(6).SpeechSequence.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"Is there anything a middle-aged crazy gnome scientist can do for you? Now, this one is not a rhetorical question!\"\nmsgstr \"一个中年疯狂的侏儒科学家能为你做些什么?  这，不是一个反问句!\"\n\n#. Key:\tC29E98A84971D7F0585C0F9522C30209\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_64.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_64.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_64.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"I will give you one if you are kind enough to open this door for me! I am stuck on the other side, you see...\"\nmsgstr \"如果你为我打开这扇门，我就给你一个!  我被困在另一边了，你知道……\"\n\n#. Key:\tC8BEE9304FE466C0EB9F76A0B8A770D6\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.Children(0).Children.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.Children(0).Children.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.Children(0).Children.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"No way!\"\nmsgstr \"没门！\"\n\n#. Key:\tCB197A5E46F44960333A02B7691B0EA6\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_6.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"Thanks and good luck!\"\nmsgstr \"谢谢，祝你好运！\"\n\n#. Key:\tCD2D130744EE2EDC8C96B1A286FCCD28\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_20.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"Getting help from a mad scientist? Thanks, but I would rather skip that!\"\nmsgstr \"从一个疯狂科学家那里获得帮助？谢了，我可不需要！\"\n\n#. Key:\tD0A8B5EA452D49F6400A18A2CDAC9A0E\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_29.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_29.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_29.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"I am crazy, therefore I am!\"\nmsgstr \"我疯了！\"\n\n#. Key:\tDA95542D4776F0EF7909078DED258AF8\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_27.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_27.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_27.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"You managed to open the gate! Well done!\"\nmsgstr \"你成功地打开了大门！干得漂亮！\"\n\n#. Key:\tDEC93709471D0B331684CFAF42A65B49\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_37.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_37.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_37.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"How unfortunate! And I thought that I was the idiot here. You will totally need my help... you'll see.\"\nmsgstr \"真不幸! 我觉得在这里我才是个白痴。你会需要我的帮助…… 你会明白的。\"\n\n#. Key:\tDF18B66D4109CAA0BCC1FDBED74521CD\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_21.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"Some kind of golem sent me here to prove my worthiness... any idea how I could do that?\"\nmsgstr \"某个种类的机器人把我送来这里证明我的价值…… 你知道我应该怎么做吗?\"\n\n#. Key:\tE546AE1443A4262B05869CB758E42CF2\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.SpeechSequence(2).SpeechSequence.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.SpeechSequence(2).SpeechSequence.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.SpeechSequence(2).SpeechSequence.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"Is there anything an old wise gnome scientist could do for you, I wonder?\"\nmsgstr \"我想知道一个聪明的老侏儒科学家能为你做些什么?\"\n\n#. Key:\tEEA782044BAA1D5C3B77D49DAE004512\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_58.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_58.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_58.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"Any idea how I could open this gate for you?\"\nmsgstr \"你知道如何才能帮你打开这扇门吗?\"\n\n#. Key:\t04BFEE6A43E303DB376ACFA5F270F846\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_9.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"I've managed to get this obelisk thing. Do you know what it is?\"\nmsgstr \"我设法弄到了这个方尖碑。你知道这玩意是什么吗?\"\n\n#. Key:\t0A6FE902444DF9B2F18A95B495FB7A90\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_10.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"I... I don't know. They are kinda predictable though...\"\nmsgstr \"我… 我不知道。不过它们是可以预测的……\"\n\n#. Key:\t0AB07AB7403AECECD38D479D8F4A32D2\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_13.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"Don't care about it and you'll live longer.\"\nmsgstr \"不要在意它，你会活得更长久。\"\n\n#. Key:\t1026E61D4F2798A2E0FEE0B9ACA2135B\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_11.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"There is a floating magical thing right there...\"\nmsgstr \"那里有一个神奇的东西飘浮着……\"\n\n#. Key:\t174506D944E38D478377CDA1DEF299B4\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_15.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"Isn't it weird that doors are always closed around these places?\"\nmsgstr \"这些地方的门总是关着的，这不是很奇怪吗?\"\n\n#. Key:\t240F98824200E33959D455AF1A3219B8\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_37.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_37.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_37.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"This is my research project! Looks totally garbage, but sometimes even I cannot understand my brilliance.\"\nmsgstr \"这是我的研究项目! 看起来完全是垃圾，但有时连我自己甚至不能理解我的才华。\"\n\n#. Key:\t24286C6A494F848CE13B5C98E38D4718\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_6.Children(0).Children.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_6.Children(0).Children.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_6.Children(0).Children.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"Let him answer\"\nmsgstr \"让他回答\"\n\n#. Key:\t26727CAB403FA6DED50EC38ED01E4241\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_6.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"I found the secret hideout of the Secret Science Society. Is there anything you could tell me about them?\"\nmsgstr \"我找到了秘密科学协会的秘密藏身处。你能告诉我一些关于他们的事情吗?\"\n\n#. Key:\t2BF9EF0C41CB352340F460AE4BC0FE02\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_20.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"I guess he will be happy if you return this to him, but otherwise it's garbage.\"\nmsgstr \"我想如果你把这个还给他，他会很高兴，否则就是垃圾。\"\n\n#. Key:\t315BB85E475FAA4C715E7F850B0E5EE2\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_24.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_24.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_24.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"Really? Then maybe I should give you this: another bottle of Potion of Worthiness!\"\nmsgstr \"真的吗? 那么也许我应该给你这个: 另一瓶价值药水!\"\n\n#. Key:\t316CF9AD4CF36FAFFAC45CA0A488FE53\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_57.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_57.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_57.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"I've got to go...\"\nmsgstr \"我得走了……\"\n\n#. Key:\t3A9767C34F0BB6E9E131D8BC7A8D9A25\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_26.Children(1).Children.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_26.Children(1).Children.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_26.Children(1).Children.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"Secret Science Society\"\nmsgstr \"秘密科学学会\"\n\n#. Key:\t3E857073418A17EC48A1EA9D2B28A43E\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_30.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_30.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_30.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"I pulled a few levers here and there...\"\nmsgstr \"我拉了周围的几根拉杆...\"\n\n#. Key:\t4671C3394EAF0988255C8090B409415D\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_12.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"Yes, things like that happen here all the time. You'll get used to it.\"\nmsgstr \"是的，那样的事情在这儿经常发生。你会习惯的。\"\n\n#. Key:\t4709B6384B48D479672BC69EBC640C7E\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_31.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_31.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_31.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"Oh, really? That was nice, even if it was absolutely unnecessary! Never mind, here is your reward!\"\nmsgstr \"哦, 真的吗? 很好，即使这完全没有必要!  无所谓，这是你的奖励！\"\n\n#. Key:\t5AE5A1A6408BC2EB0F9F96BA0826ACB0\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_4.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"Hmm... One of the creaks was a bit odd. I think the door will open soon!\"\nmsgstr \"嗯… 其中一声怪叫有点奇怪。我想门快开了!\"\n\n#. Key:\t5C81129F4B064C44F44335A3AB1CC178\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_29.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_29.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_29.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"The mind is furnished with ideas by a drunk upholsterer...\"\nmsgstr \"一个醉醺醺的装潢商人给头脑粉饰了各种想法……\"\n\n#. Key:\t5E441CF6434D7CA180853BBCBD6DFE44\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_2.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"Also, reading something represents such a nice way of killing time when I encounter a closed door!\"\nmsgstr \"另外，当我遇到一扇紧闭的门时，看书就意味着一种很好的消磨时间的方法!\"\n\n#. Key:\t6B46D1EC463D3B9A4BFBBDB7725C0C22\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_22.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"How about a deal? Open this door and I will give you another bottle from my collection of Potions of Worthiness.\"\nmsgstr \"作个交易如何？打开这扇门，我就把我收藏的另外一瓶价值药水给你。\"\n\n#. Key:\t745CA5274A281AAA12CF798A53D54ACE\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_26.Children(3).Children.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_26.Children(3).Children.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_26.Children(3).Children.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"Ask about the book\"\nmsgstr \"询问书籍\"\n\n#. Key:\t84DCE2A448C57E7FAD93CB9029BBD605\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_26.Children(0).Children.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_26.Children(0).Children.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_26.Children(0).Children.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"Floating obelisk\"\nmsgstr \"浮动的方尖碑\"\n\n#. Key:\t922B00804A843BD8EC9DB984D794F145\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_1.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"We met before, right? Of course we did.\"\nmsgstr \"我们以前见过，对吧? 我们当然见过。\"\n\n#. Key:\t9837238E42F28684DEBA2DAF9B332415\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_8.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"It might actually be total nonsense. That's what I am trying to find out at the moment, so I am reading it again and again and again...\"\nmsgstr \"这可能完全是无稽之谈。这就是我现在想知道的，所以我读了一遍又一遍……\"\n\n#. Key:\t995EAB564791A7F8BF34D3A26026F383\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_26.Children(4).Children.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_26.Children(4).Children.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_26.Children(4).Children.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"Leave\"\nmsgstr \"离开\"\n\n#. Key:\t9AD95267429D21EE59DC83937AD6811A\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_17.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"This is a Memory Crystal made by a really old looking man I've met long ago.\"\nmsgstr \"这是我很久以前见过的一个看起来很老的人做的记忆水晶。\"\n\n#. Key:\tA9DF44F54971A33775FF939FB292E26E\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_28.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"No man's knowledge here can go beyond my experience!\"\nmsgstr \"这里没有人的知识能超越我的经验!\"\n\n#. Key:\tAC59E35B420DF0F9B771B9938AC23891\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_7.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"I sure can! They used to invent cool stuff back in the days, before... you know, everyone's mind decided to go a bit insane.\"\nmsgstr \"我当然可以! 他们过去常常创造酷酷的东西… 你知道，每个人的心智都有一点疯狂。\"\n\n#. Key:\tB1E177F0430A3887A76CFAA46CE650AD\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_19.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"I don’t know why we are here... maybe to enjoy ourselves?\"\nmsgstr \"我不知道我们为什么在这里…  自娱自乐？\"\n\n#. Key:\tB5E57C3A4B0D51020B4F3C872164E8F2\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_26.Children(2).Children.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_26.Children(2).Children.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_26.Children(2).Children.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"Another door\"\nmsgstr \"另一道门\"\n\n#. Key:\tBA0C0F42482F357506A9C7ABADB6E49A\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_33.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_33.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_33.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"On the other hand, everyone is crazy these days... so we don't need doors anymore!\"\nmsgstr \"另一方面，最近每个人都很疯狂…… 所以我们不再需要门了!\"\n\n#. Key:\tBAC86050470A5EC67C30349C6B13DFE0\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_3.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"To be perceived is to be!\"\nmsgstr \"被感知就是存在！\"\n\n#. Key:\tBAD7934444B3EB256141BFB689BB83A0\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_18.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"I will let you know when I come up with something.\"\nmsgstr \"如果我有什么想法，会让你知道的。\"\n\n#. Key:\tBE5570C5477044DD0B1EEE928EAD8FA8\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_32.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_32.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_32.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"Nah. The world is full of crazy people. If I were sane, I would have liked to have as many closed doors as possible between me and those weirdos.\"\nmsgstr \"不。这个世界上到处都是疯子。如果我心智健全，那我希望在我和那些怪人之间有尽可能多的门。\"\n\n#. Key:\tBE8120CC4E6A028BB45F10843F98135D\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_16.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"The door asks for a password that members use to enter the hideout... any idea what that could be?\"\nmsgstr \"这道门要求输入密码，成员使用密码进入隐藏处… 你知道密码是什么吗？\"\n\n#. Key:\tC7BE32BF43F7BA6D88A666956FAC35F3\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_21.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"I am here because I actually have to prove my worth again...\"\nmsgstr \"我在这里是因为我必须再次证明我的价值...\"\n\n#. Key:\tC7ECC6D9457A4C49B39E98AEB14474E5\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_25.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_25.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_25.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"And I would actually feel much happier if I were on the other side of the door! You know,... I tried to ask it nicely to open and it just ignored me!\"\nmsgstr \"如果我在门的另一边我会感到更快乐! 你知道… 我试着友好地要求它打开，但它就是不理我!\"\n\n#. Key:\tD2F4B8E44239904A7BD4DD90336C871A\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_45.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_45.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_45.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"What kind of book is that?\"\nmsgstr \"那是什么书?\"\n\n#. Key:\tED75E2104CCC3912A77DF18F7C916690\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_5.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"It was nice seeing you...\"\nmsgstr \"很高兴见到你……\"\n\n#. Key:\tF87975A94604B526DE1B638250BD85A9\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_27.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_27.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_27.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"The gate is open! Maybe this creature has a heart after all... and probably started feeling sorry for me as well.\"\nmsgstr \"大门是开着的! 也许这个生物还是有心脏的…… 也许它开始为我感到难过。\"\n\n#. Key:\tFE470DB5464E438A122FAFAF593AF92B\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_14.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"Let me see! Yes... Oh...\"\nmsgstr \"让我看看！是的... 噢...\"\n\n#. Key:\t066896454B62A9809060EBB3E0222D9A\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_SpeechSequence_1.SpeechSequence(3).SpeechSequence.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_SpeechSequence_1.SpeechSequence(3).SpeechSequence.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_SpeechSequence_1.SpeechSequence(3).SpeechSequence.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"Also, after skipping a couple of lectures, I got fired from university.\"\nmsgstr \"另外，在我翘了几节课之后，就被大学除名了。\"\n\n#. Key:\t17D1F3394E12F6C85A11C2B3D3BD1ACE\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_SpeechSequence_1.SpeechSequence(0).SpeechSequence.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_SpeechSequence_1.SpeechSequence(0).SpeechSequence.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_SpeechSequence_1.SpeechSequence(0).SpeechSequence.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"I am a scientist! I managed to prove it! I discovered this when I was conducting my research on gnome behavior...\"\nmsgstr \"我是科学家! 我成功验证了! 我是在研究地精行为时发现这一点的……\"\n\n#. Key:\t17D8D3C2484BA654BEAE8CACA3AD7501\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_7.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"Help me out with the door for the last time, and I will give you my last potion!\"\nmsgstr \"最后一次帮我把门打开，我会给你我最后的药剂！\"\n\n#. Key:\t22439DB6407947A700A6E9AFB4D29261\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_1.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"Hello again! You remember me, right? I'm the gnome who was crazy before it was cool!\"\nmsgstr \"又见面了！你还记得我吧？我就是那个装酷之前已经变疯的地精！\"\n\n#. Key:\t2546F34E402CB4B25911238CC1E7A70F\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_29.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_29.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_29.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"Be as you with to seem.\\r\\n... or was it seem as you wish to be?\"\nmsgstr \"就像你看上去那样。\\r\\n…还是像你希望的那样?\"\n\n#. Key:\t2A78FDD9465789DC4FF5EB970C63F618\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_14.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"That is amazing! Thank you, my globular friend! Take these coins, I am sure you will enjoy spending them on... on whatever Balls like you like to spend.\"\nmsgstr \"太厉害了! 谢谢你，我的球状朋友! 把这些硬币拿去吧，我相信你会乐意把它们用来买……你喜欢的球。\"\n\n#. Key:\t2EB726F641E4EF882228F6B49DA2B313\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_26.Children(1).Children.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_26.Children(1).Children.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_26.Children(1).Children.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"Password\"\nmsgstr \"密码\"\n\n#. Key:\t339840D54BD71CF86F9DE4A801B1414F\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_20.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"I sure can! They used to invent cool stuff back in the days, before... you know, everyone's mind decided to go a bit insane.\"\nmsgstr \"我当然可以! 他们过去常常创造酷酷的东西… 你知道，每个人的心智都有一点疯狂。\"\n\n#. Key:\t3E639AB84A0D241D73AB8A991A483090\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_26.Children(4).Children.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_26.Children(4).Children.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_26.Children(4).Children.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"Leave\"\nmsgstr \"离开\"\n\n#. Key:\t464D32224CC04AD1F97602803245A37C\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_18.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"Take this! You deserve it...\"\nmsgstr \"收下吧! 你受之无愧！\"\n\n#. Key:\t4BB0354D4398A4115F3A78B8EFCC7D16\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_27.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_27.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_27.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"I can't believe my eyes! It is open!\"\nmsgstr \"我简直不敢相信我的眼睛！它竟然是开着的！\"\n\n#. Key:\t6488288A45256CE464004F9BFF776850\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_24.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_24.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_24.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"It's your lucky day! Take this... it's my last bottle, but I guess your needs are greater than mine!\"\nmsgstr \"今天是你的幸运日！收下这个… 这是最后一瓶了，但我想这远不能满足你的需求！\"\n\n#. Key:\t696219734B2E6966C53BE8B43A0C2212\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_28.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"The unexamined life is not worth living!\"\nmsgstr \"混混噩噩的生活不值得过！\"\n\n#. Key:\t6FD516D14E42F5EC1D05CEA0F476BDEC\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_12.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"If you manage to find a strangely unique device in the hideout, I would be more than happy to buy that from you...\"\nmsgstr \"如果你能在藏身处找到一个奇特独特的装置，我将非常乐意从你手里把它买下……\"\n\n#. Key:\t75BBEA604E9A3BAEF7599AA937E1AB2A\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_17.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"And you have the habit of needing my potions..\"\nmsgstr \"你一直都需要我的药水。\"\n\n#. Key:\t7978DCFE4044A6A3EC9F6BA54BAAD8BF\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_11.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"Yes, I am pretty sure this week is \\\"The only true wisdom is in knowing you know everything.\\\".\"\nmsgstr \"是的，我十分确定，本周是“ 真正的智慧是知道自己洞悉一切。”\"\n\n#. Key:\t88881A3742ABFEAB95CA938C1AA81B60\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_25.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_25.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_25.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"I guess we are in the same boat - well, more or less... figuratively speaking, of course, because I can't really stand boats!\"\nmsgstr \"我想我们，嗯或多或少是在同一条船上……当然，这就是打个比方，因为我晕船!\"\n\n#. Key:\t8A80B7554F39A818E4E66294BAFC9A76\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_26.Children(0).Children.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_26.Children(0).Children.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_26.Children(0).Children.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"Secret Science Society\"\nmsgstr \"秘密科学学会\"\n\n#. Key:\t91E6FD4A44AB2E17C88767B0F17D6D1E\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_30.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_30.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_30.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"Why do you think that you're crazy?\"\nmsgstr \"你为什么觉得自己疯了？\"\n\n#. Key:\t98E36F354D811F5DE5F98A942250997E\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_3.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"It is always wrong to believe everything!\"\nmsgstr \"相信一切是不可取的！\"\n\n#. Key:\t9B6EADBA4946B100D566988907A9675D\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_19.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"Any luck with the password for the Secret Science Society door?\"\nmsgstr \"秘密科学协会大门的密码有什么眉目了吗\"\n\n#. Key:\tA0F52B7148A942673A3489857B8C6EA9\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_26.Children(2).Children.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_26.Children(2).Children.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_26.Children(2).Children.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"Give Weird Device\"\nmsgstr \"给予奇怪装置\"\n\n#. Key:\tABE60F4D4709CCE1AF2A5197C03C8193\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_22.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"See you later...\"\nmsgstr \"回头见...\"\n\n#. Key:\tB07C5C9A48839C3E81F6FA8B7550BBA4\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_6.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"I also have the bad habit of being obstructed by closed doors!\"\nmsgstr \"被拒之门外也是我的日常！\"\n\n#. Key:\tB7C7314840274942F6D606B35398F039\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_21.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"The door asks for a password that members need to provide in order to enter the hideout... any idea what that could be?\"\nmsgstr \"这道门要求输入密码，成员使用密码进入隐藏处… 你知道密码是什么吗？\"\n\n#. Key:\tBB1AEBA44695D09192D7CA98AF9166B0\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_SpeechSequence_1.SpeechSequence(2).SpeechSequence.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_SpeechSequence_1.SpeechSequence(2).SpeechSequence.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_SpeechSequence_1.SpeechSequence(2).SpeechSequence.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"No wonder everyone started to consider me an idiot.\"\nmsgstr \"难怪大家都开始认为我是个白痴。\"\n\n#. Key:\tC0B9CA5E4273E95306AD0C824ADFD84B\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_SpeechSequence_1.SpeechSequence(1).SpeechSequence.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_SpeechSequence_1.SpeechSequence(1).SpeechSequence.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_SpeechSequence_1.SpeechSequence(1).SpeechSequence.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"Long story short, I used to do all these crazy things, like talking about the weather or taking naps in the afternoon. At first, they seemed okay to me but in reality what I was doing was totally ridiculous!\"\nmsgstr \"长话短说，我曾经做过所有这些疯狂的事情，比如谈论天气或者在下午小睡一会儿。一开始，我觉得这些事情还好，但实际上我所做的是十分荒谬的！\"\n\n#. Key:\tC4193800427609972A2DECAB99D8CE6C\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_4.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"Hmm... One of the creaks was a bit odd. I think the door will open soon!\"\nmsgstr \"嗯... 有一声嘎吱声听上去怪怪的。我想门很快就能打开了！\"\n\n#. Key:\tD1254F624213EAE67D6DD780182AA2DA\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_5.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"It was nice seeing you!\"\nmsgstr \"很高兴见到你！\"\n\n#. Key:\tD19327714CD0B2833BC7EBBD1E89CC83\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_26.Children(3).Children.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_26.Children(3).Children.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_26.Children(3).Children.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"You Crazy?\"\nmsgstr \"你疯了？\"\n\n#. Key:\tE5C93E794F71C393568D0B855117C738\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_2.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"I found the secret hideout of the Secret Science Society. Do you know anything about them?\"\nmsgstr \"我找到了秘密科学协会的秘密藏身处。你对他们有什么了解吗？\"\n\n#. Key:\tEF216A2549E20C15A2C28184B62D45E6\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_36.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_36.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_36.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"Turns out that you cannot skip lectures if you're the teacher.\"\nmsgstr \"事实证明，如果你是老师，你就不能翘课。\"\n\n#. Key:\tEF650E874498865FA9FE6F9B9C37AB71\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_9.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"Here is the Weird Device I found in the hideout of the Secret Science Society.\"\nmsgstr \"这是我在秘密科学协会的藏身处发现的奇怪装置。\"\n\n#. Key:\t17A0CE394E01E1FFB31AA9A485E033AC\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_2.Children(4).Children.Text\n#. /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_2.Children(4).Children.Text\n#: /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_2.Children(4).Children.Text\nmsgctxt \"Dialogue_TLSecretSocietyGate\"\nmsgid \"Mellon\"\nmsgstr \"梅隆\"\n\n#. Key:\t3293778C41F588EAC2DECDA76DA86A8E\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_2.Children(0).Children.Text\n#. /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_2.Children(0).Children.Text\n#: /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_2.Children(0).Children.Text\nmsgctxt \"Dialogue_TLSecretSocietyGate\"\nmsgid \"The only...\"\nmsgstr \"唯一的...\"\n\n#. Key:\t359996CC441CAB0497303A9C666F0CCD\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_5.Text\n#. /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_TLSecretSocietyGate\"\nmsgid \"*******? No, that is not correct.\"\nmsgstr \"* * * * * * *? 不，那是不对的。\"\n\n#. Key:\t3C864B7F434DA42CAB07BCA70FB2E6A6\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_1.Children(0).Children.Text\n#. /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_1.Children(0).Children.Text\n#: /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_1.Children(0).Children.Text\nmsgctxt \"Dialogue_TLSecretSocietyGate\"\nmsgid \"Okay, whatever\"\nmsgstr \"好的，随便啦\"\n\n#. Key:\t40C27B354470AB53239424BCC2B8D259\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_11.Text\n#. /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_TLSecretSocietyGate\"\nmsgid \"Do you really think secret scientists would use an elven word as a password? I don't even know what that means.\"\nmsgstr \"你真的认为秘密科学家会用精灵语作为密码吗? 我甚至不知道那是什么意思。\"\n\n#. Key:\t4E89070F413EF5CD964EEF90234BEBC5\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_3.Text\n#. /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_TLSecretSocietyGate\"\nmsgid \"I am pretty sure that it is better to avoid the Secret Science Society anyways...\"\nmsgstr \"我很确定，不管怎样，最好还是避开秘密科学协会……\"\n\n#. Key:\t515B5424465F983D14F3E09B7686899D\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_1.Text\n#. /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_TLSecretSocietyGate\"\nmsgid \"STOP! Do not move! This gate is only for the members of the Secret Science Society!\"\nmsgstr \"住手！不要动它！这扇门仅对秘密科学协会的成员开放！\"\n\n#. Key:\t51706AD44D697A14E6392B97A9E30AFC\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_6.Text\n#. /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_TLSecretSocietyGate\"\nmsgid \"That is the silliest combination I have ever heard about in my whole life! That's the kind of thing an idiot would carry in his luggage!\"\nmsgstr \"这是我闻所未闻的最傻帽组合! 只有傻瓜才会在他的行李里带这种东西！\"\n\n#. Key:\t60B0B4E04E74C474AC2F4F8422DCE753\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_3.Children(0).Children.Text\n#. /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_3.Children(0).Children.Text\n#: /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_3.Children(0).Children.Text\nmsgctxt \"Dialogue_TLSecretSocietyGate\"\nmsgid \"Leave the gate\"\nmsgstr \"离开大门\"\n\n#. Key:\t6EB7FD9546B2B89557D9708942CE54BD\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_2.Children(2).Children.Text\n#. /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_2.Children(2).Children.Text\n#: /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_2.Children(2).Children.Text\nmsgctxt \"Dialogue_TLSecretSocietyGate\"\nmsgid \"12345\"\nmsgstr \"12345\"\n\n#. Key:\t749AB9CD48924031317291A953254917\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_8.Text\n#. /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_TLSecretSocietyGate\"\nmsgid \"That password is for witch and wizard kids, not for old, wise, world renowned secret scientists!\"\nmsgstr \"那个密码是给巫婆和巫师孩子设计的，不是给世界闻名的秘密科学家的！\"\n\n#. Key:\t7BB8FA8B4D051983390D3D8D4287DFEC\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_2.Children(1).Children.Text\n#. /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_2.Children(1).Children.Text\n#: /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_2.Children(1).Children.Text\nmsgctxt \"Dialogue_TLSecretSocietyGate\"\nmsgid \"hunter2\"\nmsgstr \"狩猎者2\"\n\n#. Key:\t8CD051C44D9FBBD6D60694AFD2156D24\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_2.Children(5).Children.Text\n#. /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_2.Children(5).Children.Text\n#: /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_2.Children(5).Children.Text\nmsgctxt \"Dialogue_TLSecretSocietyGate\"\nmsgid \"Try to gain some time\"\nmsgstr \"争取一些时间\"\n\n#. Key:\t8F2244144056B8C389345F87D8C8B171\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_13.Text\n#. /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_TLSecretSocietyGate\"\nmsgid \"I... I think I forgot... I have to remember it. I'll be back...\"\nmsgstr \"我… 我想我已经忘了…… 我必须把它记住。我会回来的……\"\n\n#. Key:\t8FC96FE94C115E3EDB214CAA3B380072\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_4.Text\n#. /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_TLSecretSocietyGate\"\nmsgid \"Let us go on with the standard protocol then. Tell me the password of the week.\"\nmsgstr \"让我们接着“标准协议”的话题吧。告诉我本周的密码。\"\n\n#. Key:\tAA10FF02426D2C5DB9F7CF90596631C4\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_1.Children(1).Children.Text\n#. /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_1.Children(1).Children.Text\n#: /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_1.Children(1).Children.Text\nmsgctxt \"Dialogue_TLSecretSocietyGate\"\nmsgid \"I am a member\"\nmsgstr \"我是会员 \"\n\n#. Key:\tB5237D1B4EFB02B1ED5017B68EC5A7EC\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_2.Text\n#. /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_TLSecretSocietyGate\"\nmsgid \"Are you a member? Prove it! What is the password of the week?\"\nmsgstr \"你是会员？那就证明一下身份！本周的密码是什么？\"\n\n#. Key:\tC8A1985C416AEA563142D7BF3B6DD77D\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_2.Children(3).Children.Text\n#. /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_2.Children(3).Children.Text\n#: /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_2.Children(3).Children.Text\nmsgctxt \"Dialogue_TLSecretSocietyGate\"\nmsgid \"Caput Draconis\"\nmsgstr \"卡普特·德拉科尼斯\"\n\n#. Key:\tDC8F07EA44A20BEF70DFCDA4A62A421E\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_14.Text\n#. /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_TLSecretSocietyGate\"\nmsgid \"Correct. Welcome to the secret hideout 12345, scientist!\"\nmsgstr \"正确。欢迎来到12345的秘密藏身处，科学家!\"\n\n#. Key:\tE0C10509474191587635B48ED0AA6913\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_9.Text\n#. /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_TLSecretSocietyGate\"\nmsgid \"The only true wisdom is in knowing you know everything!\"\nmsgstr \"知道你无所不知才是唯一的大智慧！\"\n\n#. Key:\t0707F21D4313073F47F3C69B64D61DB7\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_15.Text\n#. /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_TombOfTabby\"\nmsgid \"Take this. It's all I can give now.\"\nmsgstr \"拿着这个，这是我现在全部能给予的。\"\n\n#. Key:\t0918993B4F680528806DE680B471F795\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_10.Text\n#. /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_TombOfTabby\"\nmsgid \"It was too much. I couldn’t keep on. I failed.\"\nmsgstr \"我承受不起了。我失败了。\"\n\n#. Key:\t1598C2DE44A0BF92DC0E53BFAC47DEF5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_3.Children(3).Children.Text\n#. /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_3.Children(3).Children.Text\n#: /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_3.Children(3).Children.Text\nmsgctxt \"Dialogue_TombOfTabby\"\nmsgid \"Leave\"\nmsgstr \"离开\"\n\n#. Key:\t1EF84FFD484E968FBDFE1386018485DB\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_3.Children(1).Children.Text\n#. /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_3.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_3.Children(1).Children.Text\nmsgctxt \"Dialogue_TombOfTabby\"\nmsgid \"Raven\"\nmsgstr \"乌鸦\"\n\n#. Key:\t3343471F42742EEE0678D49E466448F1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_3.Text\n#. /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_TombOfTabby\"\nmsgid \"Tell me the name!\"\nmsgstr \"告诉我名字！\"\n\n#. Key:\t3DC816F147ACB79D6339D5AD31E0C5A5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_6.Text\n#. /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_TombOfTabby\"\nmsgid \"Lillian!\"\nmsgstr \"莉莉安！\"\n\n#. Key:\t3DE5FFEB4A5BEC150306999FDEF058BC\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_1.Text\n#. /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_TombOfTabby\"\nmsgid \"Here lies Tabby, wanderer of the Ruined Realm. We will never forget what you did for us. May your spirit find peace in the afterlife.\"\nmsgstr \"泰比长眠于此，它是这片毁灭王国的流浪者。我们永远不会忘记你为我们所做的一切。愿你的灵魂在来世找到安宁。\"\n\n#. Key:\t43F7C0AE4CB91D3957AB4CA54C1D4426\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_11.Text\n#. /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_TombOfTabby\"\nmsgid \"He took the artefacts. His master never knew it.\"\nmsgstr \"他拿走了那些工艺品。他的主人从来都不知道。\"\n\n#. Key:\t57A0634946BB9FD9603572ABD9368E52\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_3.Children(0).Children.Text\n#. /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_3.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_3.Children(0).Children.Text\nmsgctxt \"Dialogue_TombOfTabby\"\nmsgid \"Wizard\"\nmsgstr \"巫师\"\n\n#. Key:\t5A6E99154FB027A82922FA91A9448E14\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_7.Text\n#. /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_TombOfTabby\"\nmsgid \"I’m leaving... I didn’t want to bother you. May you find peace at last.\"\nmsgstr \"我走了…  我不想打扰你。愿你最终能得到安息。\"\n\n#. Key:\t6A716E164BAACFAFB2EBDBBA8C04438F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_12.Text\n#. /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_TombOfTabby\"\nmsgid \"He liked Lillian. He finished what I started.\"\nmsgstr \"他喜欢莉莉安。他把我开始做的事给完成了。\"\n\n#. Key:\t7CDFB36B41931AADE01C10A465D09EAF\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_8.Text\n#. /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_TombOfTabby\"\nmsgid \"Rest in peace!\"\nmsgstr \"安息吧！\"\n\n#. Key:\t831693034CD9AC88A07F1297BBB10056\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_14.Text\n#. /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_TombOfTabby\"\nmsgid \"I will be there on her side again when the time comes.\"\nmsgstr \"到时候我会站在她这边的。\"\n\n#. Key:\tA78C16A943587C5EC876BFB0AA319421\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_13.Text\n#. /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_TombOfTabby\"\nmsgid \"She is my only true master. I can’t leave her. Not yet.\"\nmsgstr \"她是我唯一真正的主人。我不能离开她。\"\n\n#. Key:\tC86836A149E8580E4608259C8482314F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_5.Text\n#. /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_TombOfTabby\"\nmsgid \"Raven!\"\nmsgstr \"乌鸦！\"\n\n#. Key:\tD05E5AEF498C383F88D1AFBBDF371CDA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_9.Text\n#. /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_TombOfTabby\"\nmsgid \"He forced me. Though I understood. I wanted the same.\"\nmsgstr \"他强迫于我。虽然我能理解。我想要一样的。\"\n\n#. Key:\tE41ADE774AF3AF3FE637CE81531F3D29\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_3.Children(2).Children.Text\n#. /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_3.Children(2).Children.Text\n#: /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_3.Children(2).Children.Text\nmsgctxt \"Dialogue_TombOfTabby\"\nmsgid \"Lillian\"\nmsgstr \"莉莉安\"\n\n#. Key:\tED18C66D47BF594818C5DA8100AC2A36\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_2.Text\n#. /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_TombOfTabby\"\nmsgid \"You are familiar... I almost remember...\"\nmsgstr \"你很眼熟……我快想起来了……\"\n\n#. Key:\tF6D8BC4F489D87A90E852CA3F97B479F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_4.Text\n#. /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_TombOfTabby\"\nmsgid \"Wizard!\"\nmsgstr \"巫师！\"\n\n#. Key:\t2A0E02C94A04642C5096038C615E0D5B\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/tut2.tut2:DlgNode_Speech_1.Text\n#. /Game/SO/Dialogues/Wizard/Chapter1/tut2.tut2:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/tut2.tut2:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_tut2\"\nmsgid \"I see you managed to shape that ball body of yours… that’s interesting.\"\nmsgstr \"我亲眼见到你成功地塑造了你的球状身体… 真有意思、\"\n\n#. Key:\t4D59C307403F27C91A9168AB58CDB1B3\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/tut2.tut2:DlgNode_Speech_2.Text\n#. /Game/SO/Dialogues/Wizard/Chapter1/tut2.tut2:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/tut2.tut2:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_tut2\"\nmsgid \"I didn’t want to summon you. I wanted to get my daughter back.\"\nmsgstr \"我不想召唤你。我想找回我的女儿。\"\n\n#. Key:\t8336FD024F34227E1AB7B1BFCCF7FFBF\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/tut2.tut2:DlgNode_Speech_3.Text\n#. /Game/SO/Dialogues/Wizard/Chapter1/tut2.tut2:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/tut2.tut2:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_tut2\"\nmsgid \"Your presence is not welcome here, demon!\"\nmsgstr \"此地不欢迎你，恶魔！\"\n\n#. Key:\t16A6E7D24DFE49D6844E92B8E476BA66\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/tut5.tut5:DlgNode_Speech_7.Text\n#. /Game/SO/Dialogues/Wizard/Chapter1/tut5.tut5:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/tut5.tut5:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_tut5\"\nmsgid \"Once you are done I will set you free.\"\nmsgstr \"一旦你完成任务，我就给你自由。\"\n\n#. Key:\t48FA56EF4293C577CB1977BE694034CC\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/tut5.tut5:DlgNode_Speech_1.Text\n#. /Game/SO/Dialogues/Wizard/Chapter1/tut5.tut5:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/tut5.tut5:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_tut5\"\nmsgid \"This is the deal demon...\"\nmsgstr \"这是交易恶魔...\"\n\n#. Key:\tA27765824FDD88A579AB6180DDEA06B1\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/tut5.tut5:DlgNode_Speech_5.Text\n#. /Game/SO/Dialogues/Wizard/Chapter1/tut5.tut5:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/tut5.tut5:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_tut5\"\nmsgid \"Get into the Heart of the Realm and find the three Artefacts! I need those to correct the summoning.\"\nmsgstr \"进入王国的中心，找到三件工艺品！我需要用它们来进行正确的召唤。\"\n\n#. Key:\t5E1F54384BC258A91FF1DD9ECBC0DF39\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/tut8.tut8:DlgNode_Speech_3.Text\n#. /Game/SO/Dialogues/Wizard/Chapter1/tut8.tut8:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/tut8.tut8:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_tut8\"\nmsgid \"A cat that used to help my daughter to explore these realms.\"\nmsgstr \"一只曾经帮助我女儿探索这些王国的猫。\"\n\n#. Key:\t859621E24125177084F4EAA39CF77902\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/tut8.tut8:DlgNode_Speech_2.Text\n#. /Game/SO/Dialogues/Wizard/Chapter1/tut8.tut8:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/tut8.tut8:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_tut8\"\nmsgid \"Who is Tabby?\"\nmsgstr \"泰比是谁？\"\n\n#. Key:\tD0BFF857414714D7C5FCB9B526539215\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/tut8.tut8:DlgNode_Speech_1.Text\n#. /Game/SO/Dialogues/Wizard/Chapter1/tut8.tut8:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/tut8.tut8:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_tut8\"\nmsgid \"Tabby was formidable with her claws, but you will need that sword.\"\nmsgstr \"泰比的爪子很可怕，但你需要那把剑。\"\n\n#. Key:\tDFCB1A1E48763642E71FD7A040F72F1B\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/tut8.tut8:DlgNode_Speech_4.Text\n#. /Game/SO/Dialogues/Wizard/Chapter1/tut8.tut8:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/tut8.tut8:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_tut8\"\nmsgid \"So he did the hard job before me...\"\nmsgstr \"所以在我之前，他很不容易……\"\n\n#. Key:\t2DD05A7E485B5C23DA0DCD84400D3F23\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/tut9.tut9:DlgNode_Speech_4.Text\n#. /Game/SO/Dialogues/Wizard/Chapter1/tut9.tut9:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/tut9.tut9:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_tut9\"\nmsgid \"What could be possibly weird for a walking ball?\"\nmsgstr \"对于一个步行球来说，有什么可奇怪的呢?\"\n\n#. Key:\t62A1ECFC47B762221EA0B1B5B0E0BEF6\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/tut9.tut9:DlgNode_Speech_1.Text\n#. /Game/SO/Dialogues/Wizard/Chapter1/tut9.tut9:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/tut9.tut9:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_tut9\"\nmsgid \"This place is in a better shape...\"\nmsgstr \"这个地方挺好…\"\n\n#. Key:\tA9BCFBB541A9A2CEA8FB90884B8557C5\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/tut9.tut9:DlgNode_Speech_2.Text\n#. /Game/SO/Dialogues/Wizard/Chapter1/tut9.tut9:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/tut9.tut9:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_tut9\"\nmsgid \"The Ancient Magic is still strong within these walls. It keeps the Ruin at bay.\"\nmsgstr \"古老魔法在这里依然很强大。它能牵制毁灭。\"\n\n#. Key:\tF9551D7849226F88A4FD15AAFB4789E6\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/tut9.tut9:DlgNode_Speech_3.Text\n#. /Game/SO/Dialogues/Wizard/Chapter1/tut9.tut9:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/tut9.tut9:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_tut9\"\nmsgid \"Be careful though... it can have the weirdest side effects.\"\nmsgstr \"不过要注意… 它可能有很奇怪的副作用。\"\n\n#. Key:\t302976FD411E850B3CD7CEA7E0BF6924\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Wizard.Wizard:DlgNode_Speech_9.Text\n#. /Game/SO/Dialogues/Ending/E1/Wizard.Wizard:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/Ending/E1/Wizard.Wizard:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_Wizard\"\nmsgid \"Please wait outside until I repeat the spell. Once Lillian is back, I’ll take you home.\"\nmsgstr \"请在外面等我，直到我重复咒语。一旦莉莉安回来，我就带你回家。\"\n\n#. Key:\t3851C21F419E9F1D29A06DA3B2A0F553\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Wizard.Wizard:DlgNode_Speech_1.Text\n#. /Game/SO/Dialogues/Ending/E1/Wizard.Wizard:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Ending/E1/Wizard.Wizard:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_Wizard\"\nmsgid \"Er... your room is still as untidy as last time, but no problem.\"\nmsgstr \"呃… 你的房间还是和上次一样乱糟糟的，但没关系。\"\n\n#. Key:\t6CCE5BBC4135176C1FBD8E866FD4B098\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Wizard.Wizard:DlgNode_Speech_5.Text\n#. /Game/SO/Dialogues/Ending/E1/Wizard.Wizard:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Ending/E1/Wizard.Wizard:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_Wizard\"\nmsgid \"I’m sorry we met like this.\"\nmsgstr \"很遗憾，我们以这样的方式相遇。\"\n\n#. Key:\t7511912D4F72D1D45CFFB9AA9815CCB2\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Wizard.Wizard:DlgNode_Speech_3.Text\n#. /Game/SO/Dialogues/Ending/E1/Wizard.Wizard:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E1/Wizard.Wizard:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_Wizard\"\nmsgid \"Yes... and thank you!\"\nmsgstr \"是的... 谢谢！\"\n\n#. Key:\tAC1641244DF694B660EAFDA1FC4A177B\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Wizard.Wizard:DlgNode_Speech_2.Text\n#. /Game/SO/Dialogues/Ending/E1/Wizard.Wizard:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E1/Wizard.Wizard:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_Wizard\"\nmsgid \"Here are your artefacts! I made my part of the deal.\"\nmsgstr \"这是你的工艺品！我做了我该做的。\"\n\n#. Key:\tB567059148744E3F7A4D3B929F26CBB6\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Wizard.Wizard:DlgNode_Speech_7.Text\n#. /Game/SO/Dialogues/Ending/E1/Wizard.Wizard:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Ending/E1/Wizard.Wizard:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_Wizard\"\nmsgid \"Yes, we made a deal!\"\nmsgstr \"是的，成交！\"\n\n#. Key:\tC2ED3A564A55A644D33F9E9E38D1676A\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Wizard.Wizard:DlgNode_Speech_8.Text\n#. /Game/SO/Dialogues/Ending/E1/Wizard.Wizard:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Ending/E1/Wizard.Wizard:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_Wizard\"\nmsgid \"Give me a few more minutes to finish what we started!\"\nmsgstr \"再给我几分钟来完成我们的开始工作！\"\n\n#. Key:\tE1521B0B46F26BFA464C6C81EC2D4900\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Wizard.Wizard:DlgNode_Speech_6.Text\n#. /Game/SO/Dialogues/Ending/E1/Wizard.Wizard:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Ending/E1/Wizard.Wizard:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_Wizard\"\nmsgid \"Will you release me?\"\nmsgstr \"你会放了我吗？\"\n\n#. Key:\tFE3EE6014784FCE7EB8001BC1E77D833\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Wizard.Wizard:DlgNode_Speech_4.Text\n#. /Game/SO/Dialogues/Ending/E1/Wizard.Wizard:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Ending/E1/Wizard.Wizard:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_Wizard\"\nmsgid \"Er... excuse me for being rude with you. I might have misjudged you. And, anyway...\"\nmsgstr \"呃… 请原谅我对你的冒犯。我可能错怪你了。总之…\"\n\n#. Key:\t0D3B0F654B4B3FC1AE9B46809DA7FD74\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter2/Wizard_AfterMonk.Wizard_AfterMonk:DlgNode_Speech_1.Text\n#. /Game/SO/Dialogues/Wizard/Chapter2/Wizard_AfterMonk.Wizard_AfterMonk:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Wizard/Chapter2/Wizard_AfterMonk.Wizard_AfterMonk:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_Wizard_AfterMonk\"\nmsgid \"What did he say?\"\nmsgstr \"他说了什么？\"\n\n#. Key:\tDE149D01484DA8CD03D1C0848D01BEA6\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter2/Wizard_AfterMonk.Wizard_AfterMonk:DlgNode_Speech_2.Text\n#. /Game/SO/Dialogues/Wizard/Chapter2/Wizard_AfterMonk.Wizard_AfterMonk:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Wizard/Chapter2/Wizard_AfterMonk.Wizard_AfterMonk:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_Wizard_AfterMonk\"\nmsgid \"Nothing...\"\nmsgstr \"没什么...\"\n\n#. Key:\t1E43B5674AB45A7BDBEED1BE2AE25FE8\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter2/Wizard_Artefact1.Wizard_Artefact1:DlgNode_Speech_1.Text\n#. /Game/SO/Dialogues/Wizard/Chapter2/Wizard_Artefact1.Wizard_Artefact1:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Wizard/Chapter2/Wizard_Artefact1.Wizard_Artefact1:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_Wizard_Artefact1\"\nmsgid \"Well done. Now we have the first artefact. There are only two left...\"\nmsgstr \"很好。现在我们得到了第一个工艺品。只剩两个了…\"\n\n#. Key:\t45AB81D94B2C6C9B13A49C944AD80389\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter2/Wizard_Artefact1.Wizard_Artefact1:DlgNode_Speech_2.Text\n#. /Game/SO/Dialogues/Wizard/Chapter2/Wizard_Artefact1.Wizard_Artefact1:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Wizard/Chapter2/Wizard_Artefact1.Wizard_Artefact1:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_Wizard_Artefact1\"\nmsgid \"Don’t tell me I will need to kill another two of these!\"\nmsgstr \"你的意思是我还得去消灭两个那种怪物？！\"\n\n#. Key:\t3CBF720A438F217805FD5F85990FF515\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter2/Wizard_Artefact2.Wizard_Artefact2:DlgNode_Speech_1.Text\n#. /Game/SO/Dialogues/Wizard/Chapter2/Wizard_Artefact2.Wizard_Artefact2:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Wizard/Chapter2/Wizard_Artefact2.Wizard_Artefact2:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_Wizard_Artefact2\"\nmsgid \"We are close! Only one artefact is missing.\"\nmsgstr \"离目标越来越近了！只剩一件工艺品了。\"\n\n#. Key:\tFD6163CC43BF00E4DB95CBB11CA7D389\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter2/Wizard_Artefact2.Wizard_Artefact2:DlgNode_Speech_2.Text\n#. /Game/SO/Dialogues/Wizard/Chapter2/Wizard_Artefact2.Wizard_Artefact2:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Wizard/Chapter2/Wizard_Artefact2.Wizard_Artefact2:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_Wizard_Artefact2\"\nmsgid \"What I miss is a comfortable apartment somewhere safe...\"\nmsgstr \"我怀念的是一个安全舒适的公寓……\"\n\n#. Key:\t0D37E1DE44FDF7C5BF8DD28C038FA49D\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter2/Wizard_Artefact3.Wizard_Artefact3:DlgNode_Speech_4.Text\n#. /Game/SO/Dialogues/Wizard/Chapter2/Wizard_Artefact3.Wizard_Artefact3:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Wizard/Chapter2/Wizard_Artefact3.Wizard_Artefact3:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_Wizard_Artefact3\"\nmsgid \"What? Can’t you just... oh, forget it!\"\nmsgstr \"什么？你就不能... 噢，没什么！\"\n\n#. Key:\t2BDFD83247C8B644DED9CAA6486A064F\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter2/Wizard_Artefact3.Wizard_Artefact3:DlgNode_Speech_2.Text\n#. /Game/SO/Dialogues/Wizard/Chapter2/Wizard_Artefact3.Wizard_Artefact3:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Wizard/Chapter2/Wizard_Artefact3.Wizard_Artefact3:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_Wizard_Artefact3\"\nmsgid \"Yes, I’ve done what you asked. Now it’s your turn. Set me free!\"\nmsgstr \"是的，我已经照你说的做了。现在轮到你实现诺言了。快放了我！\"\n\n#. Key:\t8CCAFBA148F1834EABE12CAC93669A79\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter2/Wizard_Artefact3.Wizard_Artefact3:DlgNode_Speech_1.Text\n#. /Game/SO/Dialogues/Wizard/Chapter2/Wizard_Artefact3.Wizard_Artefact3:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Wizard/Chapter2/Wizard_Artefact3.Wizard_Artefact3:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_Wizard_Artefact3\"\nmsgid \"I have to admit I’m impressed. You found all the three artefacts.\"\nmsgstr \"我不得不承认我被你震撼了。你竟然把三件工艺品都找来了。\"\n\n#. Key:\tA54C612946D6A5EB76D38B8622F4F76C\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter2/Wizard_Artefact3.Wizard_Artefact3:DlgNode_Speech_3.Text\n#. /Game/SO/Dialogues/Wizard/Chapter2/Wizard_Artefact3.Wizard_Artefact3:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Wizard/Chapter2/Wizard_Artefact3.Wizard_Artefact3:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_Wizard_Artefact3\"\nmsgid \"All right demon. Use the railways to travel to World’s End. That’s where I can bring you back.\"\nmsgstr \"好的，恶魔。使用火车去往世界尽头。我能在那里把你带回来。\"\n\n#. Key:\t05FE50EE4B18F4FE9C1559979669E616\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"Still nothing, but nobody said anything about any visible change at this point, right?\"\nmsgstr \"仍然没有。不过也没有人说过这里会出现视觉上的某种变化，对吗？\"\n\n#. Key:\t0DDE5A0E47BADFCA9E6E98A10F0AF114\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_1.Children(0).Children.Text\n#. /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_1.Children(0).Children.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_1.Children(0).Children.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"Craft Ghost Abacus\"\nmsgstr \"制作幽灵算盘\"\n\n#. Key:\t0F4008294D6FA43C3D9C17BA600FB024\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"You have a glowing hammer. What's next?\"\nmsgstr \"你有了一个发光的锤子。下一个是什么?\"\n\n#. Key:\t26089F6044B0FD1134C9C99AF17E9E0C\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_7.Children(4).Children.Text\n#. /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_7.Children(4).Children.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_7.Children(4).Children.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"Say a different color\"\nmsgstr \"换一种颜色\"\n\n#. Key:\t29FFB2FF49C6C231583FF1B549DA218C\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"Gnome magic at its best. Did you do everything the way it was supposed to be done? You should find out soon... maybe.\"\nmsgstr \"侏儒的魔法是最棒的。你做每件事都是按部就班的吗? 也许，你很快就能找到答案...\"\n\n#. Key:\t2BF7D8D726080F0A003A0229BE7871C7\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"With the proper instructions and materials you could definitely create something valuable here.\"\nmsgstr \"有了正确的介绍和材料，你肯定能在这里创造出一些有价值的东西。\"\n\n#. Key:\t3231FF0D4A2BBEE3E3AD7598E5105E0E\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"The object is coagulated into a single Surrected object!\"\nmsgstr \"这个物体被凝结成一个独立的超越物!\"\n\n#. Key:\t41335322411CF278B19849AC696E6F93\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_2.Children(4).Children.Text\n#. /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_2.Children(4).Children.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_2.Children(4).Children.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"Break the abacus into pieces\"\nmsgstr \"把算盘弄碎\"\n\n#. Key:\t4C74F3C342690A8246916B85FF4685C9\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"The abacus does not show any emotion.\"\nmsgstr \"算盘没有任何感情。\"\n\n#. Key:\t4F8E51DA4C0B33020E34AF9AB47BCCD5\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_7.Children(0).Children.Text\n#. /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_7.Children(0).Children.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_7.Children(0).Children.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"Croon \\\"La La LaLaLa LaLaLa\\\"\"\nmsgstr \"低吟 “啦啦啦 啦啦啦 啦啦”\"\n\n#. Key:\t5404D10943BB5F53229FDC845E60B000\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_7.Children(5).Children.Text\n#. /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_7.Children(5).Children.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_7.Children(5).Children.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"Give up for now\"\nmsgstr \"暂时放弃\"\n\n#. Key:\t5548D94E415483F129CCA7A3102B9DB3\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"Poor Abacus. It is broken into pieces now.\"\nmsgstr \"可怜的算盘。现在它已经支离破碎了。\"\n\n#. Key:\t6F3DE41D43326079A2BD72A29059FBA9\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"You have the Abacus and the Ghost Flower Petals in front of you. The workshop has all the tools you need. How do you proceed?\"\nmsgstr \"你面前有算盘和幽灵花瓣。工作间里有你需要的所有工具。你会如何开展？\"\n\n#. Key:\t7EE3EE474090DCA65BB3199E69E83B43\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_1.Children(1).Children.Text\n#. /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_1.Children(1).Children.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_1.Children(1).Children.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"Leave\"\nmsgstr \"离开\"\n\n#. Key:\t87B760894A587B34EB825487D907D2E4\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_7.Children(1).Children.Text\n#. /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_7.Children(1).Children.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_7.Children(1).Children.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"Croon \\\"La LaLa LaLaLa LaLaLa\\\"\"\nmsgstr \"低吟 “啦啦啦 啦啦啦 啦啦”\"\n\n#. Key:\t947E69AA4EEE6DB329FAD48214D4C416\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_2.Children(0).Children.Text\n#. /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_2.Children(0).Children.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_2.Children(0).Children.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"Say \\\"Sorry my <object name>!\\\"\"\nmsgstr \"说 “对不起，我的<object name>！”\"\n\n#. Key:\t95D5418F4145388680D7C99F720CE191\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_7.Children(3).Children.Text\n#. /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_7.Children(3).Children.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_7.Children(3).Children.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"Say \\\"Brown\\\"\"\nmsgstr \"说 “棕色”\"\n\n#. Key:\tC184ED314482D706C3426CB5034C3AFD\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_7.Children(2).Children.Text\n#. /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_7.Children(2).Children.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_7.Children(2).Children.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"Say \\\"Blue\\\"\"\nmsgstr \"说 “蓝色”\"\n\n#. Key:\tC7EB7FC648E0005DC35550A3D71DF221\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_2.Children(3).Children.Text\n#. /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_2.Children(3).Children.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_2.Children(3).Children.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"Cover the Abacus with Petals\"\nmsgstr \"用花瓣覆盖住算盘\"\n\n#. Key:\tCA7A7E0A4F16FBE20EE16395D6565D7E\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"Maybe the abacus is a bit more ghosty now... or is it just you getting tired of trying?\"\nmsgstr \"也许这把算盘现在更诡异了... 还是你厌倦了尝试？\"\n\n#. Key:\tE0507C5E44553E824F998D8D4CB044A4\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"Your last action did not lead to any visible change. What is your next move?\"\nmsgstr \"你最后的行动并没有带来任何肉眼可见的改变。你的下一步行动是什么??\"\n\n#. Key:\tE8550D874C73F12B76345D9AAB2FEB80\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_2.Children(2).Children.Text\n#. /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_2.Children(2).Children.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_2.Children(2).Children.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"Heat a hammer\"\nmsgstr \"加热一把锤子\"\n\n#. Key:\tE894C6624CC7A0F92CECBBB364C77CD1\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_2.Children(1).Children.Text\n#. /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_2.Children(1).Children.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_2.Children(1).Children.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"Say \\\"Sorry my Abacus!\\\"\"\nmsgstr \"说 “对不起，我的算盘!”\"\n\n#. Key:\tEFC4E9AB4A1B8DF491B4FBABBC7FA560\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"The Abacus is covered with the Petals of the Ghost Flower.\"\nmsgstr \"算盘上覆盖着幽灵花瓣\"\n\n#. Key:\t100A735A460E0DE2B0D130B802762D8B\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter2/WW_Scroll_Inspect.WW_Scroll_Inspect:DlgNode_Speech_6.Text\n#. /Game/SO/Dialogues/Wizard/Chapter2/WW_Scroll_Inspect.WW_Scroll_Inspect:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Wizard/Chapter2/WW_Scroll_Inspect.WW_Scroll_Inspect:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_WW_Scroll_Inspect\"\nmsgid \"It says: \\\"Be careful: I think there are Fishies in the water!\\\"\"\nmsgstr \"上面写着:“小心：水里可能有鱼!”\"\n\n#. Key:\t1D280F60496F7EF5DBDADB90674E8225\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter2/WW_Scroll_Inspect.WW_Scroll_Inspect:DlgNode_Speech_4.Text\n#. /Game/SO/Dialogues/Wizard/Chapter2/WW_Scroll_Inspect.WW_Scroll_Inspect:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Wizard/Chapter2/WW_Scroll_Inspect.WW_Scroll_Inspect:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_WW_Scroll_Inspect\"\nmsgid \"He was.\"\nmsgstr \"他曾经如此。\"\n\n#. Key:\t37D4983B49B8986752A095B03ADCD700\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter2/WW_Scroll_Inspect.WW_Scroll_Inspect:DlgNode_Speech_7.Text\n#. /Game/SO/Dialogues/Wizard/Chapter2/WW_Scroll_Inspect.WW_Scroll_Inspect:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Wizard/Chapter2/WW_Scroll_Inspect.WW_Scroll_Inspect:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_WW_Scroll_Inspect\"\nmsgid \"He was right.\"\nmsgstr \"他是对的。\"\n\n#. Key:\t26432B92474630595CF8B6B44B02657B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_26.Text\n#. /Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_26.Text\n#: /Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_26.Text\nmsgctxt \"Dialogue_WWSewerCreatures\"\nmsgid \"Farewell and good luck to you as well!\"\nmsgstr \"再见，祝你好运！\"\n\n#. Key:\t2E3C904D458640A4F06DD793B416366A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_14.Text\n#. /Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_WWSewerCreatures\"\nmsgid \"All right, I will return when I'm done.\"\nmsgstr \"好吧，我完成后就回来。\"\n\n#. Key:\t382595684668BDA97AAB95BF129246E4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_22.Text\n#. /Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_WWSewerCreatures\"\nmsgid \"No problem. I always help when I can.\"\nmsgstr \"没问题。我总是力所能及地提供帮助。\"\n\n#. Key:\t4BF10AD741739BE69EF797A32410C281\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_2.Text\n#. /Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_WWSewerCreatures\"\nmsgid \"One of your brothers is trapped? What happened?\"\nmsgstr \"你的一个兄弟被困住了?  出什么事了？\"\n\n#. Key:\t52403E3341ECEA5801B0E58D2F472FD5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_1.Children(1).Children.Text\n#. /Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_1.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_1.Children(1).Children.Text\nmsgctxt \"Dialogue_WWSewerCreatures\"\nmsgid \"Leave\"\nmsgstr \"离开\"\n\n#. Key:\t53AC225B4F21B68CAC6F8997F324124E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_29.Text\n#. /Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_29.Text\n#: /Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_29.Text\nmsgctxt \"Dialogue_WWSewerCreatures\"\nmsgid \"Farewell until we meet again!\"\nmsgstr \"拜拜，下次再见！\"\n\n#. Key:\t65042BC342E9717229E74A9DD272DC5F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_28.Text\n#. /Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_WWSewerCreatures\"\nmsgid \"It was nice to see you again.\"\nmsgstr \"很高兴再次见到你。\"\n\n#. Key:\t77959A144131C47488B221ADD9B1E13B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_16.Text\n#. /Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_WWSewerCreatures\"\nmsgid \"Don't worry! I'm still looking for it.\"\nmsgstr \"别担心! 我还在找呢。\"\n\n#. Key:\t7914F3CA40844C2A13A760BB0DAE1BFA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_4.Text\n#. /Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_WWSewerCreatures\"\nmsgid \"I don't have time for you creature! Stay out of my way!\"\nmsgstr \"我可没闲工夫理你！别挡道！\"\n\n#. Key:\t79A62658414FE0202F2E9AA0E0238BD4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_9.Children(0).Children.Text\n#. /Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_9.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_9.Children(0).Children.Text\nmsgctxt \"Dialogue_WWSewerCreatures\"\nmsgid \"Accept Quest\"\nmsgstr \"接受任务\"\n\n#. Key:\t9AEDA0E84BABEBCD8F18E8BC2D0B75D0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_20.Text\n#. /Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_WWSewerCreatures\"\nmsgid \"Calm down creature! I mean you no harm.\"\nmsgstr \"别激动！我对你并没有恶意。\"\n\n#. Key:\tB89304534B24114D19DF7AB07635FFDE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_10.Text\n#. /Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_WWSewerCreatures\"\nmsgid \"All right I will see what I can do.\"\nmsgstr \"好吧，我看看我能做什么。\"\n\n#. Key:\tB8BD374E4738BFFDAFAC4EAA19E7A9D2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_23.Text\n#. /Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_23.Text\n#: /Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_23.Text\nmsgctxt \"Dialogue_WWSewerCreatures\"\nmsgid \"Oh, thank you!\"\nmsgstr \"噢，谢谢！\"\n\n#. Key:\tCF62984840B7508E82BAC0AB9D53EC0A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_9.Children(1).Children.Text\n#. /Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_9.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_9.Children(1).Children.Text\nmsgctxt \"Dialogue_WWSewerCreatures\"\nmsgid \"Decline\"\nmsgstr \"拒绝\"\n\n#. Key:\tEAD329F04773358B0CA339A4F155D990\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_11.Text\n#. /Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_WWSewerCreatures\"\nmsgid \"I'm sorry but I can't help you.\"\nmsgstr \"对不起，我帮不了你。\"\n\n#. Key:\tF281396D4110E61ACFEFDBB7AD8E44A8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_1.Children(0).Children.Text\n#. /Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_1.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_1.Children(0).Children.Text\nmsgctxt \"Dialogue_WWSewerCreatures\"\nmsgid \"Help\"\nmsgstr \"帮助\"\n\n#. Key:\tedge_next\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_1.InnerEdges(0).InnerEdges.Text\n#. /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_1.InnerEdges(0).InnerEdges.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_1.InnerEdges(0).InnerEdges.Text\nmsgctxt \"DlgSystemSettings\"\nmsgid \"Next\"\nmsgstr \"下一个\"\n\n"
  },
  {
    "path": "Content/Localization/WarriorbDialogues/zh-Hant/WarriorbDialogues.po",
    "content": "﻿# WarriorbDialogues Chinese (Traditional) translation.\n# Copyright 1998-2019 Epic Games, Inc. All Rights Reserved.\n# \nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: WarriorbDialogues\\n\"\n\"POT-Creation-Date: 2020-10-07 08:09\\n\"\n\"PO-Revision-Date: 2020-10-07 08:09\\n\"\n\"Language-Team: \\n\"\n\"Language: zh-Hant\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Plural-Forms: nplurals=1; plural=0;\\n\"\n\n#. Key:\t064BBCD1476819100C8D39881B7A7C56\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/2HW_LRDoor.2HW_LRDoor:DlgNode_Speech_2.Text\n#. /Game/SO/Dialogues/Ending/E2/2HW_LRDoor.2HW_LRDoor:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E2/2HW_LRDoor.2HW_LRDoor:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_2HW_LRDoor\"\nmsgid \"They still didn’t notice I locked them into the workroom.\"\nmsgstr \"他們仍然沒有註意到我把他們鎖在了工作室裏。\"\n\n#. Key:\t21412F0A4E45FA97703599BACD9C5D0E\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/2HW_LRDoor.2HW_LRDoor:DlgNode_Speech_4.Text\n#. /Game/SO/Dialogues/Ending/E2/2HW_LRDoor.2HW_LRDoor:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Ending/E2/2HW_LRDoor.2HW_LRDoor:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_2HW_LRDoor\"\nmsgid \"I entered into the Laboratory.\"\nmsgstr \"我走進了實驗室。\"\n\n#. Key:\t5A580A014B6E9907C819808423E10C30\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/2HW_LRDoor.2HW_LRDoor:DlgNode_Speech_3.Text\n#. /Game/SO/Dialogues/Ending/E2/2HW_LRDoor.2HW_LRDoor:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E2/2HW_LRDoor.2HW_LRDoor:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_2HW_LRDoor\"\nmsgid \"The Laboratory has strong secure spells. I can’t enter here without being noticed.\"\nmsgstr \"這個實驗室有很強的安保法術。我無法敲敲潛入。\"\n\n#. Key:\t0530863744A9844E7F64009D82A189E4\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_3.Text\n#. /Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_2HW_WRDoor\"\nmsgid \"Ruin is close and we are all at risk. It’s not about you. It's about everyone.\"\nmsgstr \"毀滅即將來臨，我們都處於危險之中。不只是妳。這關系到每個人。\"\n\n#. Key:\t1AF2A89F4DCD86096D4343ABBE91BE51\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_7.Text\n#. /Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_2HW_WRDoor\"\nmsgid \"Something which doesn’t take my daughter’s soul...\"\nmsgstr \"不會將我女兒靈魂帶走的東西……\"\n\n#. Key:\t2C5B294847F0E41F2CA189904EE66059\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_1.Text\n#. /Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_2HW_WRDoor\"\nmsgid \"I heard father arguing with someone.\"\nmsgstr \"我聽見父親在和人爭論。\"\n\n#. Key:\t2C8DFF1042FB0480709877A366BE2F1D\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_6.Text\n#. /Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_2HW_WRDoor\"\nmsgid \"The device must be destroyed.. We’ll find something else to stop Ruin.\"\nmsgstr \"這個裝置必須拆除。我們會找到別的辦法來阻止毀滅。\"\n\n#. Key:\t3F9D7D9C42A8550A6B282680BFAE2CCC\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_10.Text\n#. /Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_2HW_WRDoor\"\nmsgid \"I had to do this. At least for mom. So that she didn’t die in vain.\"\nmsgstr \"我必須這麽做。至少對母親來說是這樣。這樣她就不會白死。\"\n\n#. Key:\t7F6FC84C4D799841C6F42EB45A9D648F\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_2.Text\n#. /Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_2HW_WRDoor\"\nmsgid \"No, I won't risk losing her! She is bound to the device.\"\nmsgstr \"不，我不會冒失去她的危險!她被束縛住了。\"\n\n#. Key:\tA03D724A4606AFFC00E417A5C3AB3BFF\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_4.Text\n#. /Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_2HW_WRDoor\"\nmsgid \"Lillian knew what she applied for. She must decide.\"\nmsgstr \"莉莉安知道她要的是什麽，她必須作出決定。\"\n\n#. Key:\tABA214914981F3E844F49483B43B5414\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_11.Text\n#. /Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_2HW_WRDoor\"\nmsgid \"I used the key to close the door.\"\nmsgstr \"我用鑰匙把門關上了。\"\n\n#. Key:\tB1ADF0404F97735215FCB9A47DD01640\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_5.Text\n#. /Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_2HW_WRDoor\"\nmsgid \"No, I’ve made my decision.\"\nmsgstr \"不，我已經決定了。\"\n\n#. Key:\tB26FAB564CA430617502FA85116629D0\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_9.Text\n#. /Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_2HW_WRDoor\"\nmsgid \"Even if our entire World needs to pay the price.\"\nmsgstr \"即使我們整個世界都需要為此付出代價。\"\n\n#. Key:\tD6D2D64446B6D921576A20ACD653AF7E\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_8.Text\n#. /Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Ending/E2/2HW_WRDoor.2HW_WRDoor:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_2HW_WRDoor\"\nmsgid \"I knew he wouldn’t let me finish what we started.\"\nmsgstr \"我知道他不會讓我完成我們開始的工作。\"\n\n#. Key:\t178EBCA541F7FEC3CA46B1B2818691D4\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/AABook.AABook:DlgNode_Speech_4.Text\n#. /Game/SO/Dialogues/Wizard/Chapter1/AABook.AABook:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/AABook.AABook:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_AABook\"\nmsgid \"'...the Wisest of the Arcade gathered here to discuss if the magical phenomena means any more threat...'\"\nmsgstr \"...回廊裏最聰明的人聚集在這裏討論這個神奇的現象是否代表會出現更多的威脅...'\"\n\n#. Key:\t8F2CCFF54FBAF7902DB6FEB0358ECFEF\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/AABook.AABook:DlgNode_Speech_3.Text\n#. /Game/SO/Dialogues/Wizard/Chapter1/AABook.AABook:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/AABook.AABook:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_AABook\"\nmsgid \"They were just like us. The next one hundred pages explain why Ruin will never reach the Arcade or how the Ancient Magic can stop it.\"\nmsgstr \"他們和我們壹樣。接下來的壹百頁解釋了為什麽毀滅永遠不會到達回廊，或者古代魔法是如何阻止它的。\"\n\n#. Key:\tAC20B864497FB0D476C501AEF3B87508\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/AABook.AABook:DlgNode_Speech_2.Text\n#. /Game/SO/Dialogues/Wizard/Chapter1/AABook.AABook:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/AABook.AABook:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_AABook\"\nmsgid \"I hope you don’t want to read all that nonsense.\"\nmsgstr \"我希望妳不要讀那些廢話。\"\n\n#. Key:\tB112F657498F660766AA45974CB44137\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/AABook.AABook:DlgNode_Speech_1.Text\n#. /Game/SO/Dialogues/Wizard/Chapter1/AABook.AABook:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/AABook.AABook:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_AABook\"\nmsgid \"'Ten years after the Cataclysm (or recently named as Ruin)...'\"\nmsgstr \"“大災難(最近亦被稱為毀滅)已經過去十年了……”\"\n\n#. Key:\t0F53B19F4EB2F7727B4907864AD3FF46\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_29.Text\n#. /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_29.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_29.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"What if you just take a break from this and let me pass? Make an exception.\"\nmsgstr \"妳能否破例休息壹下，讓我繼續？\"\n\n#. Key:\t1707E0F34CFDC054DBEAD9AFB368A0A4\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_6.Text\n#. /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"No rest, no sleep allowed.\"\nmsgstr \"不準休息，不準睡覺。\"\n\n#. Key:\t2524B3EC4DE1E2921C710CBE4511045F\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_10.Text\n#. /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"...sometimes I could really appreciate a chair.\"\nmsgstr \"…有時候我真渴望能有壹把椅子。\"\n\n#. Key:\t29FE2AEF42639848EF3914B36BA2B633\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_5.Text\n#. /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"I do ask you for apologies, young one.\"\nmsgstr \"我確實需要妳道個歉，年輕人。\"\n\n#. Key:\t2C1E7EA026080F0A003A0396BE7E0E7E\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_19.Text\n#. /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"Take this rune stone as compensation.\"\nmsgstr \"就拿這個符石作為補償。\"\n\n#. Key:\t2C879B684B4B07B57D051797219E751E\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_2.Text\n#. /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"You might have proven worthy for the Arcade Gate, yet there are some other doors, and they have different rules.\"\nmsgstr \"妳可能已經通過回廊之門證明了某些價值，但還有其他的門，而且它們的規則不盡相同。\"\n\n#. Key:\t3532C8254924CF13EA664CA11E256F07\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_13.Text\n#. /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"Will you??? That's so kind of you... err... I mean...\"\nmsgstr \"妳真的會？？那太好了.... 呃... 我是說...\"\n\n#. Key:\t353D6C8B4B5719B1EFD2A59BA0281DED\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_2.Children(2).Children.Text\n#. Key:\t8EED48724A0A860CAD791FAF95554F26\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_3.Children(1).Children.Text\n#. /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_2.Children(2).Children.Text\n#. /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_3.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_2.Children(2).Children.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_3.Children(1).Children.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"Skip?\"\nmsgstr \"跳過？\"\n\n#. Key:\t3FF1411844C23DB2FDFA47939169B5C3\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_14.Children(0).Children.Text\n#. Key:\t59EC5E56475DE41CFC723793CEEAFA82\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_3.Children(0).Children.Text\n#. Key:\t65DD6A464F04F8B0762D568046344C16\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_6.Children(0).Children.Text\n#. /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_14.Children(0).Children.Text\n#. /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_3.Children(0).Children.Text\n#. /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_6.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_14.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_3.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_6.Children(0).Children.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"Accept challenge\"\nmsgstr \"接受挑戰\"\n\n#. Key:\t414D5CC44FFD640215B97BB6090627D6\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_21.Text\n#. /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"That must be tough...\"\nmsgstr \"那壹定很難……\"\n\n#. Key:\t4CAA2D0C4FB585A0EB5B4F87FE8A3A97\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_9.Text\n#. /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"I accept my fate yet sometimes...\"\nmsgstr \"有時我會接受命運...\"\n\n#. Key:\t4F7460F540408D07FECEEB88DC0D7D25\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_1.Text\n#. /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"Not so fast young lord!\"\nmsgstr \"別這麽快，少爺!\"\n\n#. Key:\t52C3909F40026C52ADA498A5B60B3490\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_6.Children(1).Children.Text\n#. /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_6.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_6.Children(1).Children.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"Poor Keeper\"\nmsgstr \"可憐的守護者\"\n\n#. Key:\t59141BA444003F36E1671CB4E91FFF0E\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_7.Text\n#. /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"Farewell!\"\nmsgstr \"告辭！\"\n\n#. Key:\t59AC0995469571DBE1B7B6BDF68FA37D\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_18.Text\n#. /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"I am really sorry about that.\"\nmsgstr \"我真的很抱歉。\"\n\n#. Key:\t5C8404D34863129B221EF2BB1D0962CC\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_9.Children(0).Children.Text\n#. /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_9.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_9.Children(0).Children.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"Yes?\"\nmsgstr \"嗯？\"\n\n#. Key:\t5FF922B94D3FCA5FD095FFB788F43D02\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_15.Text\n#. /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"For there was a mistake.\"\nmsgstr \"發生了壹個錯誤。\"\n\n#. Key:\t650DA55944F225C45BABE8B00D815A39\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_27.Text\n#. /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_27.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_27.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"I guess you want me to go through some crazy traps again...\"\nmsgstr \"我打賭妳想讓我再次經歷壹些瘋狂的陷阱……\"\n\n#. Key:\t700A25DB401C6EDD1E9D1694DA1C1DA1\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_4.Text\n#. /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"Keepers never fail their duty.\"\nmsgstr \"守護者們從不失職。\"\n\n#. Key:\t72D703F84C84CD07F7DA569D9B86AECB\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_11.Text\n#. /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"There are times when you have to stand in front of a door for a really long time.\"\nmsgstr \"有時候妳不得不在門前站很長時間。\"\n\n#. Key:\t8276A9AC4E3BAB81C41E6EAB12E4FED1\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_31.Text\n#. /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_31.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_31.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"If I ever see a chair that's your size I will let you know.\"\nmsgstr \"如果我看到有適合妳身形的椅子，我會告訴妳的。\"\n\n#. Key:\t89421ED443CA8DD5A15DF289C5DC6C37\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_28.Children(0).Children.Text\n#. /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_28.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_28.Children(0).Children.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"Accept Challenge\"\nmsgstr \"接受挑戰\"\n\n#. Key:\t910F61A841D9E86D1B349E85A8A47FCF\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_14.Text\n#. /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"Prove yourself worthy and I shall yield the path!\"\nmsgstr \"如果妳能證明妳的價值，我就不擋道！\"\n\n#. Key:\t9DAC66B94E5A37C628522B90029E8FCC\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_2.Children(0).Children.Text\n#. /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_2.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_2.Children(0).Children.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"Not again\"\nmsgstr \"下不為例\"\n\n#. Key:\t9F3FE24943FB7CE59B8453A2849E874A\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_16.Text\n#. /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"This door is open and free of charge for everyone...\"\nmsgstr \"這扇門是開著的，而且不收門票。\"\n\n#. Key:\tA96E78A0410C87446F59ABAC1524A3F4\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_2.Children(1).Children.Text\n#. /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_2.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_2.Children(1).Children.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"Let's do it!\"\nmsgstr \"幹起來！\"\n\n#. Key:\tA9998DDC43D15F1EDE404B8A3E04E3B2\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_8.Text\n#. /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"Keepers' lives are never easy.\"\nmsgstr \"守護者的生活從來都不容易。\"\n\n#. Key:\tBCAE1C1D4890E79F187EF0940C6F7E84\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_12.Children(0).Children.Text\n#. /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_12.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_12.Children(0).Children.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"Just get over\"\nmsgstr \"慢慢熬吧\"\n\n#. Key:\tC2F8F4E1457AC142E58D1EA3AF24AB56\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_12.Text\n#. /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"I am all right with a few hundred years, but after a millennium my knees hurt like hell.\"\nmsgstr \"剛開始的幾百年，我感覺還好，但壹千年過後，我的膝蓋已經疼得要命。\"\n\n#. Key:\tC955446E4CA17593CCC57B9A73AAE824\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_17.Text\n#. /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"What?? Do you mean that all those challenges that I had to pass were in vain?\"\nmsgstr \"什麽? ? 妳是說那些我必須克服的挑戰其實都是徒勞嗎?\"\n\n#. Key:\tC97F61DA4A49287F5242EEB43152D409\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_28.Text\n#. /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"All right, you win. I'll go and do some jumping. Must be better than waiting here for an eternity.\"\nmsgstr \"好吧，妳贏了。我要去進行壹些跳躍運動了。總比在這裏等上壹輩子要好。\"\n\n#. Key:\tD318418D4CBBFA2AB381E6B287A8636F\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_30.Children(0).Children.Text\n#. /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_30.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_30.Children(0).Children.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"Accept Challenge.\"\nmsgstr \"接受挑戰\"\n\n#. Key:\tD6BE170047C1A00770403087A7EBDF99\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_30.Text\n#. /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_30.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_30.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"Hopefully, we will finish this soon.\"\nmsgstr \"希望我們能盡快搞定。\"\n\n#. Key:\tD72FF4F943571BE3DC8DB1877581D4CD\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_3.Text\n#. /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"You shall prove yourself one more time.\"\nmsgstr \"妳將再壹次證明妳自己。\"\n\n#. Key:\tDFD8B1E0414F989D46ED9BB24610CDA8\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_12.Children(1).Children.Text\n#. /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_12.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_12.Children(1).Children.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"I will help\"\nmsgstr \"我會幫忙的\"\n\n#. Key:\tFDDD27C544787C63B03CCE89B69A44E5\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_20.Text\n#. /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/AA/AAGateKeeper1.AAGateKeeper1:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_AAGateKeeper1\"\nmsgid \"Well, thanks!\"\nmsgstr \"嗯，謝謝！\"\n\n#. Key:\t06D52FD74B0013A5A22FEBA7A6E82032\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Did you came back to check out my wares?\"\nmsgstr \"妳是來查看我的貨嗎？\"\n\n#. Key:\t07508A9F4A979D530AD8A9861F0C7D79\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Though maybe you will find relief by looking through my wares. Haha!\"\nmsgstr \"不過，也許妳看看我的貨就能獲得些安慰。哈哈!\"\n\n#. Key:\t0C1B7239419B00927360E1B9578540EA\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_27.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_27.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"That's a sad name indeed. If the old saying 'nomen est omen' is true, then it might not be the best choice.\"\nmsgstr \"這真是個悲哀的名字。如果那句老話”人如其名“是真的，那麽它可能不是最好的選擇。\"\n\n#. Key:\t0D8F81E140A7AF5369415FB1C081250E\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_10.Children(0).Children.Text\n#. /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_10.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_10.Children(0).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Trade\"\nmsgstr \"交易\"\n\n#. Key:\t1089DA0443D9B23C84B8B799EEEBCCC9\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_SpeechSequence_0.SpeechSequence(0).SpeechSequence.Text\n#. /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_SpeechSequence_0.SpeechSequence(0).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_SpeechSequence_0.SpeechSequence(0).SpeechSequence.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Oh, that's sad my little one.\"\nmsgstr \"哦，那真是令人傷心，我的小寶貝兒。\"\n\n#. Key:\t16F6844C40498EC1B5CDAA87612D3982\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_42.Children(1).Children.Text\n#. /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_42.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_42.Children(1).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"No way\"\nmsgstr \"沒門\"\n\n#. Key:\t182D4124450BFA52EF26FBACE1706333\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_45.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_45.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"How noble of you!\"\nmsgstr \"妳真高尚！\"\n\n#. Key:\t1922E4FD49ABC50B04A33CBA07B440D1\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_34.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_34.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"But I hope this doesn't mean that you want to join the Maintainers. Haha!\"\nmsgstr \"但我希望這不意味著妳想要加入維護人員的隊伍中去。哈哈!\"\n\n#. Key:\t195B9BED4921EE6D732CA4BE6391A402\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_31.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_31.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"No, thanks!\"\nmsgstr \"不了，謝謝！\"\n\n#. Key:\t198A3D8D426F5202C280CE96202EB415\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_50.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_50.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"This is a sad name indeed. And if the old saying 'nomen est omen' is true, then this might not be the best choice.\"\nmsgstr \"這真是個悲哀的名字。如果那句老話”人如其名“是真的，那麽它可能不是最好的選擇。\"\n\n#. Key:\t1AF2DDE74542524EEF19CA9567CFBDAF\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"{name}? It still sounds a bit weird, but I think I might like it.\"\nmsgstr \"{name}？聽起來還是有點怪，但我想我可能會喜歡。\"\n\n#. Key:\t1FC5AD3B488DB484169D0085D63ECC45\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"This sounds pretty epic but I wonder what nickname it might have?\"\nmsgstr \"這聽起來很有史詩感，但我想知道它也許有什麽綽號?\"\n\n#. Key:\t21FEE27B41116ADFBFD2B69333D6EB3F\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"By using some sort of ritual or spell...\"\nmsgstr \"通過某種儀式或咒語……\"\n\n#. Key:\t25DCE964400342D4188412ADF43277E6\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_61.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_61.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"I am rewarding you with these shiny coins!\"\nmsgstr \"這些閃亮的硬幣是給妳的獎勵！\"\n\n#. Key:\t2717F0E0414D4828B67D9C9F9B7E5F84\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_62.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_62.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"See? I'm a gnome of my word!\"\nmsgstr \"瞧見沒？我是個守信用的矮人！\"\n\n#. Key:\t2747A45248055455F9FA3B977A019EE0\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_44.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_44.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Well, you know where to find me... once you have some coins to spend!\"\nmsgstr \"總之，當妳想花硬幣了，妳知道上哪兒可以找到我！\"\n\n#. Key:\t27CE4D1444C219D35B79F4A3B07CB67D\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"If you bring them to me, I will reward you with shiny golden coins!\"\nmsgstr \"如果妳能把它們帶給我，我就獎勵妳閃亮亮的硬幣！\"\n\n#. Key:\t3040F4DC4C763062C8EFED9BCA5028C0\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_59.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_59.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"I would love to give you that name, but if you don't have the money to pay for it, we can't make the deal, it wouldn't be fair\"\nmsgstr \"我很樂意給妳這個名字，但如果妳沒錢購買，我們就無法達成交易，否則是不公平的\"\n\n#. Key:\t3124230541027A0022F54C8648E688C9\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Oh, a customer!\"\nmsgstr \"噢，來了個顧客！\"\n\n#. Key:\t31C147E1430106CD29C7D7B2F7E84975\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_23.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_23.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Oh, how sad.\"\nmsgstr \"噢，真難過。\"\n\n#. Key:\t37CC1248471C360F8BB605A404ED1408\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_10.Children(4).Children.Text\n#. /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_10.Children(4).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_10.Children(4).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Give books\"\nmsgstr \"給予書本\"\n\n#. Key:\t3E0A0E06487AD4E75C3AF28786DE9CC7\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_16.Children(0).Children.Text\n#. /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_16.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_16.Children(0).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Don't know\"\nmsgstr \"不知道\"\n\n#. Key:\t40221BB0432119A5B1C285B748AEFB81\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_51.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_51.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"It sounds pretty epic, however I wonder what nickname it might have?\"\nmsgstr \"這聽起來很有史詩感，但我想知道它是否有什麽綽號?\"\n\n#. Key:\t422B5CC14CA23A6563EDBDBBEA09C44B\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_73.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_73.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Farewell! Ha-ha...\"\nmsgstr \"告辭！！哈哈...\"\n\n#. Key:\t4574EE8E4B1EAB6C9310C4A19F77B170\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_10.Children(6).Children.Text\n#. /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_10.Children(6).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_10.Children(6).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Leave\"\nmsgstr \"離開\"\n\n#. Key:\t47F99BBF439F713C52279F86BDC4FDD5\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_72.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_72.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"No thanks, I'm leaving.\"\nmsgstr \"不了，謝謝。我走了。\"\n\n#. Key:\t4F31CEE0411BB60324FB58938857F162\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_16.Children(1).Children.Text\n#. /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_16.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_16.Children(1).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"A mighty spirit\"\nmsgstr \"壹個強大的幽靈\"\n\n#. Key:\t4FA29908450786B433C0FCA2E313D989\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_36.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_36.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Hi, I'm Lory.\"\nmsgstr \"嗨，我是勞裏。\"\n\n#. Key:\t4FCB34514D82104E732407A1CD985F6B\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_70.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_70.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Sure, show me what you've got!\"\nmsgstr \"當然，讓我看看妳有什麽本事！\"\n\n#. Key:\t53A46E1948B7CC1A9F8E02A3147FBF2D\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_67.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_67.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Sure, what can I do?\"\nmsgstr \"當然，我能做什麽?\"\n\n#. Key:\t53E7A272465DE8D6E34AE7BE7435B1AC\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_25.Children(1).Children.Text\n#. /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_25.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_25.Children(1).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Spirit of the Unknown\"\nmsgstr \"無名幽魂\"\n\n#. Key:\t54F8FB604F0409ED474FBFBAD8BFD3B3\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"And you are...\"\nmsgstr \"妳是...\"\n\n#. Key:\t58447CCB4EE84827DB8328A664C54198\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_24.Children(0).Children.Text\n#. /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_24.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_24.Children(0).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Buy name\"\nmsgstr \"購買名字\"\n\n#. Key:\t589162A649D330D791082EB8FE3F6459\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_41.Children(4).Children.Text\n#. /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_41.Children(4).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_41.Children(4).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Don't buy.\"\nmsgstr \"不購買。\"\n\n#. Key:\t58CC98724AFCD3826D69D482682AF352\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"\\\"The true value of your family\\\" and \\\"How much does a brother cost?\\\" can be two examples in this case.\"\nmsgstr \"在這種情況下，《家庭的真正價值》以及《壹個兄弟值多少錢》就是兩個活生生的例子。\"\n\n#. Key:\t5A249B2E47F62C59F66AD5848E6DEBFE\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_49.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_49.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"I'll see what I can do.\"\nmsgstr \"我看看我能做什麽。\"\n\n#. Key:\t5A31E5D34729F7EAB69AC08238C1D32D\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_25.Children(0).Children.Text\n#. /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_25.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_25.Children(0).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Failed One\"\nmsgstr \"墮落者\"\n\n#. Key:\t5BA1062346DF8BC47F97BA97653E6DDA\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_46.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_46.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Farewell then, and good luck with your quest! Ha-ha...\"\nmsgstr \"那麽再見了，祝妳好運！哈哈…\"\n\n#. Key:\t6047D5334E0247BFB75EBAA7380C6800\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_68.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_68.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"I have some other important things to do right now.\"\nmsgstr \"我現在還有其他重要的事情要做。\"\n\n#. Key:\t60B184AF4F25AFB60380029BD2C17AAB\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_66.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_66.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"I'm a mighty spirit of the Unknown!\"\nmsgstr \"我是壹個強大的無名幽魂\"\n\n#. Key:\t60CE0D4342B6E4971449D7BDDD62B13F\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_10.Children(3).Children.Text\n#. /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_10.Children(3).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_10.Children(3).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Help\"\nmsgstr \"幫助\"\n\n#. Key:\t62C5459E46C969412EAD70BAD466D808\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_SpeechSequence_0.SpeechSequence(1).SpeechSequence.Text\n#. /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_SpeechSequence_0.SpeechSequence(1).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_SpeechSequence_0.SpeechSequence(1).SpeechSequence.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Life is relentless. Innocent people are trapped, enslaved or abused!\"\nmsgstr \"生活是殘酷的。無辜的人被困，被奴役，被虐待！\"\n\n#. Key:\t6DDEF0AB45B60A99946E8F9FC647DCDE\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_71.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_71.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"I need a proper name.\"\nmsgstr \"我需要壹個合適的名字。\"\n\n#. Key:\t6F1C50A44DE698DF5BF089B1C9B29F06\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_69.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_69.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Right now I don't really have much money...\"\nmsgstr \"現在我真的沒什麽錢…\"\n\n#. Key:\t72272161488706E5E87697A755F11129\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Even though there are some other precious books that I could add to my collection...\"\nmsgstr \"盡管我還有其他壹些珍貴的書可以拿來收藏……\"\n\n#. Key:\t764502A14C3C18B14F8A579A58CE5938\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"I know that some of those books must be in the Sewer's Library, but I couldn't find them.\"\nmsgstr \"我知道有些書肯定在下水道圖書館裏，但我找不到。\"\n\n#. Key:\t7A1853C7454D74FD1F371A92CEE47B4E\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"That's fine but I wonder, what is your name?\"\nmsgstr \"沒關系，但是我想知道，妳叫什麽名字?\"\n\n#. Key:\t7BACFCA748AF641E051E2D8B8D8488FC\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"I don't know if I have one.\"\nmsgstr \"我不確定我有沒有名字。\"\n\n#. Key:\t821021954082EA7E4B392FA89EE4DE91\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_41.Children(1).Children.Text\n#. /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_41.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_41.Children(1).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Spirit of the Unknown (1 Gold)\"\nmsgstr \"無名幽魂 （1 金幣）\"\n\n#. Key:\t83AECB5A4FCAB05CC81BCC9B810245B7\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_41.Children(2).Children.Text\n#. /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_41.Children(2).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_41.Children(2).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"BALL-E (1 Gold)\"\nmsgstr \"E球 （1 金幣）\"\n\n#. Key:\t84ACF5E1449849CB79CF8AB10BE2FF2E\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"As you can observe, I have a pretty nice collection of books.\"\nmsgstr \"如妳所見，我有壹套很好的藏書。\"\n\n#. Key:\t899D1E18420FDAD236BF3486B2A5A010\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Ring the bell if you need something.\"\nmsgstr \"如果妳需要什麽就按鈴。\"\n\n#. Key:\t8B33450F405DF08E72CE47B5FC66CDD5\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_55.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_55.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Spiry? Knowny?\"\nmsgstr \"螺旋狀的?知道嗎?\"\n\n#. Key:\t8CEC3E1943C3AB72CF3B71B160B9ADB9\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_10.Children(5).Children.Text\n#. /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_10.Children(5).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_10.Children(5).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Need gold\"\nmsgstr \"需要金幣\"\n\n#. Key:\t8D0FBCA540F73842DD3AC38A76A5B623\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_56.Text\n#. Key:\tF045657A439D69E3615B80A066E9CE86\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_33.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_33.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_56.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Nevermind! You chose well.\"\nmsgstr \"沒關系！妳好好選。\"\n\n#. Key:\t8F32BD4544F8C439D7344CBE1F9B4D8A\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_24.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_24.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Would you like to buy one? The first one is for free!\"\nmsgstr \"妳想買壹個嗎？第壹個是免費的!\"\n\n#. Key:\t94C0F9B34F439CDFBDFAD696E81983E5\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"I don't have much gold. Is there any way you could help me out?\"\nmsgstr \"我沒什麽金幣。妳能幫助我嗎？\"\n\n#. Key:\t9BA6BAA24E6C2B7F01964D892246E8F6\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"No, no, I meant the other bell.\"\nmsgstr \"不，不，我說的是另壹個鈴。\"\n\n#. Key:\tA9D4DF4C41BAD682571763BDA8DA6A62\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_10.Children(1).Children.Text\n#. /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_10.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_10.Children(1).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Can't afford\"\nmsgstr \"買不起\"\n\n#. Key:\tAA6B105442F5099CE0F4E2AE0DFF7080\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_35.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_35.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Now that we're done with this, will you have a look at my wares?\"\nmsgstr \"既然這件事已經搞完了，現在妳能看看我的商品嗎?\"\n\n#. Key:\tAADE21D24A42CE7BD318478306BAFFF7\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_10.Children(2).Children.Text\n#. /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_10.Children(2).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_10.Children(2).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"I need a name\"\nmsgstr \"我需要壹個名字\"\n\n#. Key:\tAB00899C4A94AA6458737BB28339A3EE\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Hush, hush, little one!\"\nmsgstr \"噓，噓，小家夥！\"\n\n#. Key:\tAB431F244E4E18230CE5EAB99FB41A96\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_41.Children(0).Children.Text\n#. /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_41.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_41.Children(0).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Failed One (1 Gold)\"\nmsgstr \"墮落者 （1 金幣）\"\n\n#. Key:\tAB92E44E46B40EF16989FF850DE0F843\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_42.Children(0).Children.Text\n#. /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_42.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_42.Children(0).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Interested\"\nmsgstr \"感興趣\"\n\n#. Key:\tB0540325412D9839B33FB38C4FE73172\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Well, I guess that's a classic.\"\nmsgstr \"嗯，我想這是壹個經典。\"\n\n#. Key:\tB0EFD31840839CDA6F3D929514412D00\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Ok, I'll try not to be annoying this time.\"\nmsgstr \"好吧，這次我盡量不惹人厭。\"\n\n#. Key:\tB1F217944F6B9A29BD13FA926D8230E8\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_44.Children(0).Children.Text\n#. /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_44.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_44.Children(0).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Farewell!\"\nmsgstr \"拜拜！\"\n\n#. Key:\tBA2B2F444FC2320349C4A0BABDA78B40\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_25.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_25.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"All right...\"\nmsgstr \"好吧...\"\n\n#. Key:\tCADB3E394C94CDE32D9969B6C1A41F5C\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_47.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_47.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Take this Elevator Crystal as it might prove useful in your journey.\"\nmsgstr \"帶著這個水晶電梯，妳在旅途中會需要它的。\"\n\n#. Key:\tCB3F061042B8340154B4CD8AEED41348\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_42.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_42.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"However, there is a way, I can help you out. Of course, if you are interested.\"\nmsgstr \"不過，有壹個辦法，我可以幫妳。當然，如果妳感興趣的話。\"\n\n#. Key:\tCF24AD454E123F6D7D61029155390914\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_41.Children(3).Children.Text\n#. /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_41.Children(3).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_41.Children(3).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Warriorb (1 Gold)\"\nmsgstr \"球魂 （1 金幣）\"\n\n#. Key:\tD01937C848C69809890885BAB13042BE\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_65.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_65.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"I'm not quite sure.\"\nmsgstr \"我不太確定。\"\n\n#. Key:\tD53097EB4EFC08C0C3261A9EEBD96B72\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_39.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_39.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"That's sad. Nothing is worse than a customer without any gold to spend!\"\nmsgstr \"真不爽。沒有什麽比遇到壹個窮得叮當響的顧客更郁悶的了！\"\n\n#. Key:\tD63C08294AC09BF5B8E5D29EEC1C7D39\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"I'm forced to stay in this realm because I agreed to do some silly tasks for a wizard. I could really use some help.\"\nmsgstr \"我被迫留在這個王國，因為我同意幫壹個巫師完成壹些愚蠢的任務。另外，我需要壹些幫助。\"\n\n#. Key:\tDB0CCA7746068ACFBE6F71963C398753\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_63.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_63.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"And now that you have some coins to spend it's time to talk about business!\"\nmsgstr \"現在妳有壹些金幣了，是時候聊壹筆買賣了！\"\n\n#. Key:\tDC0F8EC0407F1C7B4FFED6A91CB961C5\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_57.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_57.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"I hope this doesn't mean that you want to join the Maintainers. Haha!\"\nmsgstr \"但我希望這不意味著妳想要加入維護人員的隊伍中去。哈哈!\"\n\n#. Key:\tDC475A6740B71354D90D53B6AD1C4740\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_60.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_60.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"How wondrous! You found my books!\"\nmsgstr \"太奇妙了！妳找到我的書了！\"\n\n#. Key:\tE3B8F89B4D4AC0ABD2E35994ABFA9916\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"I understand if you have identity problems, but there must be a way... how do others call you?\"\nmsgstr \"妳的身份有問題我能理解，不過肯定有辦法...  別人是怎麽稱呼妳的？\"\n\n#. Key:\tE6BD711C4E23B71F944EEFB1C8D09AB4\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_41.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_41.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"You've come to the right place! Haha!\"\nmsgstr \"妳來對地方了！哈哈！\"\n\n#. Key:\tEDEB662C4A5024CC618A668699BFAC2C\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_SpeechSequence_0.SpeechSequence(2).SpeechSequence.Text\n#. /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_SpeechSequence_0.SpeechSequence(2).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_SpeechSequence_0.SpeechSequence(2).SpeechSequence.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"There is no justice in this Realm.\"\nmsgstr \"在這片王國不存在正義。\"\n\n#. Key:\tF8814FA0497129A211F3F9BE01EAF378\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_29.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_29.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"That's a very cute name for a little one like you.\"\nmsgstr \"對於像妳這樣的小家夥來說，這個名字很可愛。\"\n\n#. Key:\tF8BEB8C147C81D8B13E52AA9934891AB\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_58.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_58.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Nevermind, you can always come back.\"\nmsgstr \"沒關系，妳隨時可以回來。\"\n\n#. Key:\tF97BE7FD49F465A97F7C8D9F308EAD3C\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_52.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_52.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"That's such a cute name for a little one.\"\nmsgstr \"適合小不點的小可愛名字。\"\n\n#. Key:\tFAAAE5944AA8CCAEFC931CAA814C8621\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_54.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_54.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Which means you chose well.\"\nmsgstr \"也就是說妳選對了。\"\n\n#. Key:\tFAD10B404CF744B61DF5D093829CD1E9\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Of course! You need some gold, otherwise how would you buy my stuff?\"\nmsgstr \"當然！妳需要壹些金子，否則妳怎麽買我的東西?\"\n\n#. Key:\tFE40092A444E97C59E8C6E94061D1134\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_30.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_30.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"However, I'd rather prefer: 'Nomen quantivis iam est pret!'\"\nmsgstr \"然而，我更喜歡說:“我是最棒的!”\"\n\n#. Key:\tFEE11C0F4A65DDFFDBF0BD8BB30CD438\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_25.Children(2).Children.Text\n#. /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_25.Children(2).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_25.Children(2).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"BALL-E\"\nmsgstr \"E球\"\n\n#. Key:\tFF0AFE8544814AE524115A853547D727\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_24.Children(1).Children.Text\n#. /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_24.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AALory.AALory:DlgNode_Speech_24.Children(1).Children.Text\nmsgctxt \"Dialogue_AALory\"\nmsgid \"Refuse\"\nmsgstr \"拒絕\"\n\n#. Key:\t0648624E4922B098541A7EA738DABC92\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/AARagdoll.AARagdoll:DlgNode_Speech_5.Text\n#. /Game/SO/Dialogues/Wizard/Chapter1/AARagdoll.AARagdoll:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/AARagdoll.AARagdoll:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_AARagdoll\"\nmsgid \"Well that happens sometimes. Maybe that someone forgot to monopolize this ragdoll design.\"\nmsgstr \"這種情況時有發生。也許有人忘了壟斷這個布偶貓的設計。\"\n\n#. Key:\t2058DE654B2B75531C04628635169938\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/AARagdoll.AARagdoll:DlgNode_Speech_7.Text\n#. /Game/SO/Dialogues/Wizard/Chapter1/AARagdoll.AARagdoll:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/AARagdoll.AARagdoll:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_AARagdoll\"\nmsgid \"Just leave that doll.\"\nmsgstr \"把這個娃娃留下。\"\n\n#. Key:\t5A456D084D452C82038A04942002FAE6\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/AARagdoll.AARagdoll:DlgNode_Speech_3.Text\n#. /Game/SO/Dialogues/Wizard/Chapter1/AARagdoll.AARagdoll:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/AARagdoll.AARagdoll:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_AARagdoll\"\nmsgid \"It’s like the doll which was made by...\"\nmsgstr \"看上去制作這個娃娃的是...\"\n\n#. Key:\t7813ED164DF5CA7DE48A978F9A3DC959\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/AARagdoll.AARagdoll:DlgNode_Speech_1.Text\n#. /Game/SO/Dialogues/Wizard/Chapter1/AARagdoll.AARagdoll:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/AARagdoll.AARagdoll:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_AARagdoll\"\nmsgid \"How on earth did this get here?\"\nmsgstr \"它怎麽會在這兒?\"\n\n#. Key:\tC4403E4C4FD7D72CA3252FB31FF98FDF\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/AARagdoll.AARagdoll:DlgNode_Speech_4.Text\n#. /Game/SO/Dialogues/Wizard/Chapter1/AARagdoll.AARagdoll:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/AARagdoll.AARagdoll:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_AARagdoll\"\nmsgid \"...by someone I knew.\"\nmsgstr \"...應該是某個我認識的家夥。\"\n\n#. Key:\tE4CD5DBC4E4BB1E783B55D80F4296B97\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/AARagdoll.AARagdoll:DlgNode_Speech_2.Text\n#. /Game/SO/Dialogues/Wizard/Chapter1/AARagdoll.AARagdoll:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/AARagdoll.AARagdoll:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_AARagdoll\"\nmsgid \"There are many weird things all over this place. What makes this stand out?\"\nmsgstr \"這個地方有很多奇怪的東西。是什麽讓它如此引人註目?\"\n\n#. Key:\tEDD72B38407D0C33C5F7859D09BC132B\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/AARagdoll.AARagdoll:DlgNode_Speech_6.Text\n#. /Game/SO/Dialogues/Wizard/Chapter1/AARagdoll.AARagdoll:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/AARagdoll.AARagdoll:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_AARagdoll\"\nmsgid \"You are not funny.\"\nmsgstr \"妳很沒趣。\"\n\n#. Key:\t02767246403F00F0C866B2A7F3E22A47\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_72.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_72.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_72.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"You can hardly find anyone that has more information about the Realms.\"\nmsgstr \"妳很難找到比他更了解這個王國的人了。\"\n\n#. Key:\t04843D4A4D2DD4BC7CE50989C8F66FBA\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_2.SpeechSequence(2).SpeechSequence.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_2.SpeechSequence(2).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_2.SpeechSequence(2).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"How can I do something if I do not know what I have to do?\"\nmsgstr \"如果我不知道我必須做什麽，我該怎麽做呢?\"\n\n#. Key:\t071A801E44759E2681218497B9AE9A2B\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_53.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_53.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_53.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Your logic is incoherent.\"\nmsgstr \"妳的邏輯不太連貫。\"\n\n#. Key:\t07488F9A4CC6F87DBC44F0A11700B370\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_70.Children(0).Children.Text\n#. Key:\tA67B3D3B4A3D17B37D585EBBBD9BBE92\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_75.Children(0).Children.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_70.Children(0).Children.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_75.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_70.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_75.Children(0).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"All right, I'm on it.\"\nmsgstr \"好吧，我上。\"\n\n#. Key:\t0757D23846F6BC96198472B7E9848D3F\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_52.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_52.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_52.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Maybe I should accept what I need to do now.\"\nmsgstr \"也許我應該接受我現在需要做的事。\"\n\n#. Key:\t07D63011406134B07FB90B903825151C\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_8.SpeechSequence(2).SpeechSequence.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_8.SpeechSequence(2).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_8.SpeechSequence(2).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Make your wizard turn you back to normal.\"\nmsgstr \"讓妳的巫師把妳變回正常。\"\n\n#. Key:\t091DFEFA4B2DD8F9922A1B93534C66A8\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_70.Text\n#. Key:\t0F92571643C12F65C669F7812572B014\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_82.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_70.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_82.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_70.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_82.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven gives you one of his keys so that you can move around freely.\"\nmsgstr \"烏鴉給了妳壹把鑰匙，這樣妳就可以自由移動了。\"\n\n#. Key:\t0922ED5741BB89553CCB548D33566972\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_8.SpeechSequence(4).SpeechSequence.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_8.SpeechSequence(4).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_8.SpeechSequence(4).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven is something which won't make wizards turn Raven back.\"\nmsgstr \"烏鴉是壹種不會讓巫師把自己變回去的東西。\"\n\n#. Key:\t0AAFADBB493DCFBA6C649EAC11133DC2\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_2.SpeechSequence(0).SpeechSequence.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_2.SpeechSequence(0).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_2.SpeechSequence(0).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"You don't have to know.\"\nmsgstr \"妳不必知道。\"\n\n#. Key:\t0E59A33E44BF6B212BF0EF8E8EFB3E39\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_6.SpeechSequence(2).SpeechSequence.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_6.SpeechSequence(2).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_6.SpeechSequence(2).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"A rich kingdom ruling all the other lands, powered by spirits of another world; these spirits were bound to metal.\"\nmsgstr \"壹個富裕的王國統治著所有其它的土地，由另壹個世界的幽魂策力; 這些幽魂被束縛在金屬上。\"\n\n#. Key:\t0EACC01B4A4C4F8C5622B9BD291E0DB9\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_91.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_91.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_91.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"I'm not quite sure about this...\"\nmsgstr \"我不太確定……\"\n\n#. Key:\t10142FA943B5E5D89F9E5AADC86EF413\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_113.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_113.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_113.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Yes.\"\nmsgstr \"是的。\"\n\n#. Key:\t12375FB0475147E23E1C21A867CFF219\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_68.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_68.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_68.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Is there anything else on your mind?\"\nmsgstr \"妳還有什麽事嗎?\"\n\n#. Key:\t12A0B58B446843DD24045394E8586D7D\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_13.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Krrr...\"\nmsgstr \"呃...\"\n\n#. Key:\t12B921E04D135919C7DA37ADDBD2A7DB\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_100.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_100.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_100.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"We still have some time left before this happens.\"\nmsgstr \"在這之前我們還有壹些時間。\"\n\n#. Key:\t133F676B4DBA8B41F6B94387D51457D5\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_59.Children(1).Children.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_59.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_59.Children(1).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"No more Raven\"\nmsgstr \"沒有更多的烏鴉\"\n\n#. Key:\t13EF39EE4249FDD62208CFB7A41821D7\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_65.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_65.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_65.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Though Raven knows how you feel.\"\nmsgstr \"雖然烏鴉知道妳的感受。\"\n\n#. Key:\t15D06ACE4E8B5E4DA49297BBE436039D\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_80.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_80.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_80.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Now you only need to find a place where you can infuse it.\"\nmsgstr \"現在妳只需要找到壹個可以將它註入的地方。\"\n\n#. Key:\t16D5522340AE76E69A4808A3C2D1C039\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_51.Children(1).Children.Text\n#. Key:\t2AD4608440348AC7C3E363A430B9848C\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_83.Children(0).Children.Text\n#. Key:\t57DDAE184F31D9761E3939B16E6B2E67\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_20.Children(1).Children.Text\n#. Key:\t59F157C64A5415C8B4E322B0FF5F2ACE\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_49.Children(1).Children.Text\n#. Key:\t73ACC7124190746F6D3EBF96C8202C25\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_77.Children(1).Children.Text\n#. Key:\t9900274346DCB374A4B222A6BFD67365\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_10.Children(1).Children.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_51.Children(1).Children.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_83.Children(0).Children.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_20.Children(1).Children.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_49.Children(1).Children.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_77.Children(1).Children.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_10.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_10.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_20.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_49.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_51.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_77.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_83.Children(0).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Chat\"\nmsgstr \"交談\"\n\n#. Key:\t19FD8B0541A533338EA11B9CDA3719B2\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_74.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_74.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_74.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Now you only need to find a place where you can infuse it. Meanwhile, Raven must figure it out how to open the Gate with it.\"\nmsgstr \"現在妳只需要找到壹個可以將它註入的地方。同時，烏鴉必須弄清楚如何用它打開大門。\"\n\n#. Key:\t1BD7592A4F11AEC585ECA6A74A0E0D4E\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_9.SpeechSequence(4).SpeechSequence.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_9.SpeechSequence(4).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_9.SpeechSequence(4).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"In what way?\"\nmsgstr \"用什麽方式？\"\n\n#. Key:\t1C30FADA4BB2B3CCE2140A8E192D9F14\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_34.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_34.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_34.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven is not like those dummy Living Armors, yet he does what he was made for.\"\nmsgstr \"烏鴉不像那些虛擬的活體鎧甲，但他達到了他的目的。\"\n\n#. Key:\t1C57460444A7E044DD96148495C4C217\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_6.SpeechSequence(4).SpeechSequence.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_6.SpeechSequence(4).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_6.SpeechSequence(4).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"They lost purpose and became reckless.\"\nmsgstr \"他們失去了目標，變得魯莽。\"\n\n#. Key:\t1E3AF1D8483287CE52633EA41B89DF11\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_116.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_116.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_116.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"After he had some rest.\"\nmsgstr \"他休息了壹會兒。\"\n\n#. Key:\t1ED675F344909355D41212988B736F70\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_1.SpeechSequence(3).SpeechSequence.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_1.SpeechSequence(3).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_1.SpeechSequence(3).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven's master would like to understand before doing anything.\"\nmsgstr \"烏鴉的主人在做任何事情之前都要先弄明白。\"\n\n#. Key:\t22E51DC245ABAE53146A71AAE8D5AB55\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_16.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"You will realize that 'sense' has no meaning in this realm anymore.\"\nmsgstr \"妳會意識到“感覺”在這個王國已經沒有意義了。\"\n\n#. Key:\t236E0B58451C947C0DB93E9E3408456D\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_45.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_45.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_45.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"They are humans.\"\nmsgstr \"他們是人類。\"\n\n#. Key:\t254FBEE547ADDFCF33B350B04AE1EE16\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_95.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_95.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_95.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"I think I know all about the meaning of life and all, ok? Can we just go on?\"\nmsgstr \"我想我知道生命的全部意義，好嗎? 我們能繼續嗎?\"\n\n#. Key:\t2671F10D4257D8A3482009A9C042026D\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_11.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Hand it over to Raven so he could open the Gate!\"\nmsgstr \"把它交給烏鴉，這樣它就可以打開那扇門了！\"\n\n#. Key:\t2845CBE64B1624C7EC4B81BC314B4F1B\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_27.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_27.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_27.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"The master gave Raven the ability to think and talk.\"\nmsgstr \"主人給了烏鴉思考和說話的能力。\"\n\n#. Key:\t29F405BF4233B5A8331B419747954425\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_77.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_77.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_77.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Why are you here?\"\nmsgstr \"妳怎麽會在這裏？\"\n\n#. Key:\t2B5FB92D4F98359F68AD58AB776FD9BA\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_9.SpeechSequence(1).SpeechSequence.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_9.SpeechSequence(1).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_9.SpeechSequence(1).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Seeking for knowledge, as always. And you? Never thought we’ll meet again. Still trying to take down these Realms forever?\"\nmsgstr \"我壹如既往地尋求知識。妳呢? 沒想到我們還會再見面。還想永遠占領這些王國嗎?\"\n\n#. Key:\t2B8CF34046D5486EB935CE919A1BD469\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_97.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_97.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_97.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"I'm new with all this wizard business thing. What was their conversation about?\"\nmsgstr \"我對巫師這行不太了解。他們的談話內容是什麽?\"\n\n#. Key:\t2C15668C26080F0A003A02E7BE7B5A65\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_8.SpeechSequence(1).SpeechSequence.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_8.SpeechSequence(1).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_8.SpeechSequence(1).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"It can happen again.\"\nmsgstr \"這種情況可能會再次發生。\"\n\n#. Key:\t2F226AC246B52387854AF5AFA09CEDD6\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_43.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_43.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_43.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"So we let those keys behind and set ourselves free from wizards?\"\nmsgstr \"所以我們把那些鑰匙留在身後，自己從巫師手中解脫出來?\"\n\n#. Key:\t2FF7B3E84C009ECFDDE9F495092BEAA8\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_9.SpeechSequence(7).SpeechSequence.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_9.SpeechSequence(7).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_9.SpeechSequence(7).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"A pleasure to hear that. Talk to Raven about the details. Please excuse me for leaving so early, I have something important to do.\"\nmsgstr \"很高興聽妳這麽說。去和烏鴉談談細節。請原諒我走得這麽早，我有重要的事情要做。\"\n\n#. Key:\t305333F348E677D8C3553999F412C8B6\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_36.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_36.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_36.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven knows he has different tasks now, compared to what he used to do before.\"\nmsgstr \"烏鴉知道他現在的任務和以前不壹樣了。\"\n\n#. Key:\t311A1E3745667AC6B4114D999B0E7C7F\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_83.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_83.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_83.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Go now! Raven still needs some more time to think about this.\"\nmsgstr \"現在就去吧！烏鴉還需要壹些時間來考慮這個問題。\"\n\n#. Key:\t32F0018141E94BDE0921E9A54C1E4F20\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_1.SpeechSequence(0).SpeechSequence.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_1.SpeechSequence(0).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_1.SpeechSequence(0).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"They were always like this.\"\nmsgstr \"他們總是這樣。\"\n\n#. Key:\t34903F43484A4D6CE5735890AEEA294D\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_9.SpeechSequence(5).SpeechSequence.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_9.SpeechSequence(5).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_9.SpeechSequence(5).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"The Cerulean Gates are closed again. What if we share the work?\"\nmsgstr \"蔚藍之城大門又關閉了。如果我們分擔工作呢？\"\n\n#. Key:\t350270814B961A20E48267A4B1AE0538\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_6.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Yes! The Gem is fully charged!\"\nmsgstr \"是的！寶石全部充能完畢！\"\n\n#. Key:\t361D80AB46AC47E5A233ECA2323222A2\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_86.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_86.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_86.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Why are you obeying that wizard of yours?\"\nmsgstr \"妳為什麽服從妳的那個巫師？\"\n\n#. Key:\t365EDA2849D42A47D0D26DAC50DA6E94\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_28.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven is not that happy with those two, but Raven can accept that he is what he is.\"\nmsgstr \"烏鴉對這兩個都不滿意，但是烏鴉可以接受他現在的身份。\"\n\n#. Key:\t37C560AB4CCFAF4F8D26FAB1DE22453C\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_63.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_63.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_63.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Don't worry. You'll find some purpose.\"\nmsgstr \"別擔心。妳會找到目標的。\"\n\n#. Key:\t39DAB8B641C31878F7312FA7807D9DA0\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_6.SpeechSequence(3).SpeechSequence.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_6.SpeechSequence(3).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_6.SpeechSequence(3).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"The residents of the Realm did not have to work. Their spirit slaves did everything for them, they accomplished all their desires.\"\nmsgstr \"王國的居民不必工作。他們的精神奴隸為他們做了壹切，他們實現了所有的願望。\"\n\n#. Key:\t3B63606F48193748243DE6AB18D7A68C\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_40.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_40.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_40.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven thinks you might want to be something else. Something that you used to be, but you are not anymore.\"\nmsgstr \"烏鴉認為妳可能想成為別的什麽人。比如妳曾經成為過的某個什麽。\"\n\n#. Key:\t3C332B1C4ADB3C16C005E8AAF76A09B1\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_109.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_109.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_109.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Except...\"\nmsgstr \"除了...\"\n\n#. Key:\t3C9750814FC56947BDA7DFAF8A71DCC2\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_25.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_25.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_25.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"It is a long story and Raven doesn't really like to talk about it.\"\nmsgstr \"這是壹個很長的故事，烏鴉並不喜歡談論它。\"\n\n#. Key:\t3D10982D4A6FA88941F13F82413D17AC\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_20.Children(0).Children.Text\n#. Key:\t3E117EBB48C1CF091F456CA0FB78EDD7\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_77.Children(0).Children.Text\n#. Key:\t59F0F04941BB918E08743E8A7C3734B2\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_32.Children(6).Children.Text\n#. Key:\t6556945844ED44678075CE8796F00800\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_51.Children(0).Children.Text\n#. Key:\t7EC3944940792EC71B6A2F8674250649\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_49.Children(0).Children.Text\n#. Key:\tC6963EAE43B4D0FD3C8FBAA80A38E2A2\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_83.Children(1).Children.Text\n#. Key:\tE048FA684AA7B8DE0F7273992DA4600E\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_3.Children(4).Children.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_20.Children(0).Children.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_77.Children(0).Children.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_32.Children(6).Children.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_51.Children(0).Children.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_49.Children(0).Children.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_83.Children(1).Children.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_3.Children(4).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_20.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_3.Children(4).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_32.Children(6).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_49.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_51.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_77.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_83.Children(1).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Leave\"\nmsgstr \"離開\"\n\n#. Key:\t4417EE084F947AAF5D3285B086F741AC\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_14.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven is fine with talking. Ask me whatever you have on your mind!\"\nmsgstr \"烏鴉很會說話。妳有什麽事就問我！\"\n\n#. Key:\t4485635A4832D9DC57240F8EF3323042\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_9.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Very nice! Raven likes that you are making progress.\"\nmsgstr \"非常好！烏鴉喜歡妳的進步。\"\n\n#. Key:\t480718E34822FD682466E7B217249ED0\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_47.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_47.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_47.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Which is technically the same.\"\nmsgstr \"技術上是壹樣的。\"\n\n#. Key:\t48B67F42417A2930A4D200B958FDFB58\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_38.Children(3).Children.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_38.Children(3).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_38.Children(3).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"I'm confused\"\nmsgstr \"我很困惑\"\n\n#. Key:\t49F0AC6A46EBF6C3148BC590CE56C297\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_10.Children(0).Children.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_10.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_10.Children(0).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Help\"\nmsgstr \"幫助\"\n\n#. Key:\t4CB1CE8A4AEC18FA175BA98F831D3C3C\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_59.Children(0).Children.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_59.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_59.Children(0).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Farewell\"\nmsgstr \"再見\"\n\n#. Key:\t4D514A7D4CC96E3E79F464A6C0BF0C6E\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_2.SpeechSequence(4).SpeechSequence.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_2.SpeechSequence(4).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_2.SpeechSequence(4).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"What??\"\nmsgstr \"什麽？？\"\n\n#. Key:\t4F8198D64A210B3A41EED8AA6AE64401\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_50.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_50.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_50.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven will just sit here for a short time before venturing into the Ruin.\"\nmsgstr \"烏鴉只會在這裏坐壹會兒，然後冒險面對毀滅。\"\n\n#. Key:\t503CD5334EE86CFBEC2E7EA67F45ACD9\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_22.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"So you're meant to open this dusty little door with Raven, aren't you?\"\nmsgstr \"所以妳要和烏鴉壹起打開這扇滿是灰塵的小門，對嗎?\"\n\n#. Key:\t512AEC2642B36D9DDF407EB447DF5A28\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_15.Children(1).Children.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_15.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_15.Children(1).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Let's have fun!\"\nmsgstr \"嗨起來！\"\n\n#. Key:\t5142E71B48C2E993CC8026919A3FDBD6\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_87.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_87.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_87.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Er... okey, I was just asking.\"\nmsgstr \"呃… 好吧，我只是問問。\"\n\n#. Key:\t518038644F25D09C9DA7FF984C272B77\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_40.Children(1).Children.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_40.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_40.Children(1).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"That's stupid\"\nmsgstr \"這很愚蠢\"\n\n#. Key:\t53B5A1AC40CCF1CFBC106BA2BD8000E0\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_60.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_60.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_60.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Farewell, Raven!\"\nmsgstr \"拜拜，烏鴉！\"\n\n#. Key:\t54C0F3A6493E6D0671D38DB16BD4BF51\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_3.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"I would like to know...\"\nmsgstr \"我想知道……\"\n\n#. Key:\t55665725414633C111356D94939362FF\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_67.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_67.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_67.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Let's open that gate. Quick!\"\nmsgstr \"讓我們打開那扇門。快！\"\n\n#. Key:\t565D7DA644ADF0E536C2FC8F99B735A3\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_3.Children(2).Children.Text\n#. Key:\t934A23AD44787C735FCDE79A34657C90\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_32.Children(3).Children.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_3.Children(2).Children.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_32.Children(3).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_3.Children(2).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_32.Children(3).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Why is he here?\"\nmsgstr \"他為什麽在這裏？\"\n\n#. Key:\t57BE04074884DB4CC54AC691E156F0FC\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_38.Children(2).Children.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_38.Children(2).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_38.Children(2).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Freedom\"\nmsgstr \"自由\"\n\n#. Key:\t5919EDBF4799413180AF569CB920E436\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_90.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_90.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_90.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"You can't live your life like in the old days any longer and that's why you're staying with your master, right?\"\nmsgstr \"妳不能再過以前那樣的生活了，這就是為什麽妳要和妳的主人呆在壹起，對吧?\"\n\n#. Key:\t592D458F40571927D0BB549F3614420E\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_32.Children(5).Children.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_32.Children(5).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_32.Children(5).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"End of the World\"\nmsgstr \"世界之末\"\n\n#. Key:\t596065A34760461993AC339C51D9E402\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_73.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_73.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_73.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"First you will need to find the Gem. Meanwhile, Raven must figure it out how to open the Gate with it.\"\nmsgstr \"首先妳需要找到寶石。同時，烏鴉必須弄清楚如何用它打開大門。\"\n\n#. Key:\t599A90394B8AC7A26D20FEB355A873FB\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_98.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_98.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_98.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"What are you doing here?\"\nmsgstr \"妳在這兒幹什麽?\"\n\n#. Key:\t5A5D2F08427C4747F3EF529D6B73A21B\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_20.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Go on your search then! Unless you'd like to chat some more with Raven.\"\nmsgstr \"那就繼續找吧！除非妳想和烏鴉多聊聊。\"\n\n#. Key:\t5A63E364458C849C9B6FDD8491427051\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_8.SpeechSequence(5).SpeechSequence.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_8.SpeechSequence(5).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_8.SpeechSequence(5).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"But you could.\"\nmsgstr \"但是妳可以。\"\n\n#. Key:\t5B07757F4CAAD674E09EBB835CEE230B\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_75.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_75.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_75.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"It must be somewhere close to the Arcade.\"\nmsgstr \"壹定是在回廊附近。\"\n\n#. Key:\t5B9CDB4340B5E65E59D3A18283A84CA5\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_64.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_64.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_64.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven knows some people that'd be glad with that.\"\nmsgstr \"烏鴉知道有些人會為此感到高興。\"\n\n#. Key:\t5BA0645E49A62C0945FB64BDF689721F\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_112.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_112.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_112.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Is that where I will find your artefacts?\"\nmsgstr \"我能在那裏找到妳的工藝品嗎?\"\n\n#. Key:\t5E70951F4E50B061FF2DA196F0207612\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_15.Children(0).Children.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_15.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_15.Children(0).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Save the world!\"\nmsgstr \"拯救世界！\"\n\n#. Key:\t5F810A7D417E5B02025F30B21FEA5F03\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_79.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_79.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_79.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Niiice!\"\nmsgstr \"棒棒的！\"\n\n#. Key:\t6441F8C2484FAA5219841C9D374F36C4\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_6.SpeechSequence(6).SpeechSequence.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_6.SpeechSequence(6).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_6.SpeechSequence(6).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"And now, even while we speak, their curse continues to spread.\"\nmsgstr \"現在，就在我們說話的時候，他們的咒詛還在擴散。\"\n\n#. Key:\t66A08695458FF9D46383F6A0AF609EFA\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_41.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_41.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_41.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"You are so hopeless...\"\nmsgstr \"妳真是沒救了……\"\n\n#. Key:\t67EEF3DB42BA2C954AD566B4F95EBDB6\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_6.SpeechSequence(5).SpeechSequence.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_6.SpeechSequence(5).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_6.SpeechSequence(5).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Until one day the spirits broke loose and formed Ruin.\"\nmsgstr \"直到有壹天，幽魂掙脫了束縛，變成了毀滅。\"\n\n#. Key:\t68442CA14CECA9FB8A215EBEBC724F63\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_19.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Ask more from Raven if you like!\"\nmsgstr \"如果妳願意，可以再問問烏鴉！\"\n\n#. Key:\t694D416244358BD7DBED04A82390A146\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_51.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_51.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_51.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"One more,... and the Gem will be completed!\"\nmsgstr \"再來壹個... 寶石就完成了！\"\n\n#. Key:\t6A463E0444754B73FE11988F07D5A58F\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_2.SpeechSequence(1).SpeechSequence.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_2.SpeechSequence(1).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_2.SpeechSequence(1).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"You just have to do it.\"\nmsgstr \"妳必須去做。\"\n\n#. Key:\t6A92F010409301669F7B83AD7901A469\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_1.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"A strange creature, yet a familiar aura! Tell me, my dear Wizard, what happened to Tabby?\"\nmsgstr \"壹個奇怪的生物，壹個熟悉的光環! 告訴我，我親愛的巫師，泰比怎麽了?\"\n\n#. Key:\t6CC1259244D5FC82CA1C2EA314836741\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_1.SpeechSequence(1).SpeechSequence.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_1.SpeechSequence(1).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_1.SpeechSequence(1).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"They both accepted that there is a great threat in this realm.\"\nmsgstr \"他們都承認在這個王國存在著巨大的威脅。\"\n\n#. Key:\t6FB7AF774662247E2001F9AAF34FF134\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_111.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_111.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_111.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Somewhere beyond that Gate there's a Portal. It will take you into the heart of the Realm.\"\nmsgstr \"在那扇門的後面有壹個入口。它將帶妳進入王國的中心。\"\n\n#. Key:\t70A0BA47476A909013EFC0A574815B61\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_23.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_23.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_23.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"The Master and Raven are seeking knowledge about the Ruined Realm.\"\nmsgstr \"主人和烏鴉正在尋找有關這片毀滅王國的知識。\"\n\n#. Key:\t70ECE1B74BA0B02F2F0850937BF4FB02\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_3.Children(3).Children.Text\n#. Key:\tE9F5916345156A4E5F29AC886B49B8AD\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_32.Children(4).Children.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_3.Children(3).Children.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_32.Children(4).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_3.Children(3).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_32.Children(4).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"About Ruin\"\nmsgstr \"關於毀滅\"\n\n#. Key:\t7311CA4B4D6B19C6C5C362AF522A9803\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_1.SpeechSequence(4).SpeechSequence.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_1.SpeechSequence(4).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_1.SpeechSequence(4).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Your master said he is done with that.\"\nmsgstr \"妳的主人說他已經受夠了。\"\n\n#. Key:\t74B8E0B44D4590E9970F4B9D09D3C4F9\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_6.SpeechSequence(1).SpeechSequence.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_6.SpeechSequence(1).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_6.SpeechSequence(1).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Long ago it was called the Runic Realm.\"\nmsgstr \"很久以前，它被稱為符文王國。\"\n\n#. Key:\t76756B1C48E93E907CE32D83A2C56C3E\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_7.SpeechSequence(0).SpeechSequence.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_7.SpeechSequence(0).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_7.SpeechSequence(0).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven is really sorry but he can't help you anymore.\"\nmsgstr \"烏鴉真的很抱歉，但他不能再幫妳了。\"\n\n#. Key:\t78C7CE5948D176704CA69289BEEBFBA7\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_44.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_44.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_44.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"And what about the Realm of the wizards? They did not go mad yet, did they?\"\nmsgstr \"那巫師王國呢? 他們還沒有發瘋，是嗎?\"\n\n#. Key:\t7DFA4D494BD0536F925A94BBF7C71F36\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_66.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_66.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_66.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Focus on what you have to do and you will find the real you.\"\nmsgstr \"專註於妳必須做的事情，妳就會找到真正的妳。\"\n\n#. Key:\t81F437694DEE3D32A0FC29B90688E8B9\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_38.Children(4).Children.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_38.Children(4).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_38.Children(4).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"This is stupid\"\nmsgstr \"這很愚蠢\"\n\n#. Key:\t82F473A04D250E98AD186185EBE95C04\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_5.SpeechSequence(0).SpeechSequence.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_5.SpeechSequence(0).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_5.SpeechSequence(0).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven thinks freedom is such an empty word.\"\nmsgstr \"烏鴉認為自由是個空洞的詞。\"\n\n#. Key:\t8688802A4303C53640C7BFAAA40226EC\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_8.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Almost there!\"\nmsgstr \"快了！\"\n\n#. Key:\t8728C02E46E7B681D0A792ACAFC3237D\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_28.Children(2).Children.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_28.Children(2).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_28.Children(2).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"He accepted his fate\"\nmsgstr \"他接受了自己的命運\"\n\n#. Key:\t8854653141FA36E731780F9111B82FAD\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_30.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_30.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_30.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"You are not listening to Raven's words!\"\nmsgstr \"妳沒有在聽烏鴉說話！\"\n\n#. Key:\t88FDA06B4A44ED1BF559D996E6AF7097\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_6.SpeechSequence(0).SpeechSequence.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_6.SpeechSequence(0).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_6.SpeechSequence(0).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Even so, Raven will tell you a bit.\"\nmsgstr \"即便如此，烏鴉還是會告訴妳壹些的。\"\n\n#. Key:\t8BA584404F2713EE39D74284F829C50A\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_17.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"You know what? Raven totally agrees with that!\"\nmsgstr \"妳知道嗎？烏鴉完全同意！\"\n\n#. Key:\t8C272FBE47796CF8101D07AAD033C24B\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_62.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_62.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_62.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"The later we met the more time the World survived, didn't it?\"\nmsgstr \"我們相遇的越晚，這個世界存在的時間就越長，不是嗎?\"\n\n#. Key:\t8DD39A3D497411B348B883972CE6B442\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_6.SpeechSequence(7).SpeechSequence.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_6.SpeechSequence(7).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_6.SpeechSequence(7).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"At first, lands lose their colours, people go mad... and then, everything breaks into shards until solely hollowness remains...\"\nmsgstr \"起初，土地失去了顏色，人們開始發瘋……然後，壹切都破碎成碎片，直到只剩下空虛……\"\n\n#. Key:\t8E02961D428949EE8176639F6AE84DD9\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_107.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_107.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_107.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"If the end is near, there is no point in making long term plans.\"\nmsgstr \"如果末日即將來臨，那就沒有必要制定長期計劃。\"\n\n#. Key:\t8EB8F2654B9C18135CBEB49D10485417\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_37.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_37.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_37.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"We all have a purpose in life.\"\nmsgstr \"我們都有壹個人生目標。\"\n\n#. Key:\t9131DE4C434AD9B22C7B1BAA588AF694\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_9.SpeechSequence(3).SpeechSequence.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_9.SpeechSequence(3).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_9.SpeechSequence(3).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Private business? All right! We might have different motivations, however working together could be fruitful.\"\nmsgstr \"私人事務？好吧！我們可能動機不同，但是團結起來壹定會有收獲！\"\n\n#. Key:\t91947E4046F96E9330EA5A94C367E2C5\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_4.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Forget it, I'm on my way now.\"\nmsgstr \"算了吧，我馬上就來。\"\n\n#. Key:\t91BE2C7248B2BEBE1C376B989935E353\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_7.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"What else should Raven tell you?\"\nmsgstr \"烏鴉還應該告訴妳什麽？\"\n\n#. Key:\t929558D0465B0884C4E373A602CCE9E5\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_59.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_59.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_59.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Farewell compeer until you meet Raven again!\"\nmsgstr \"再見了，小夥伴！\"\n\n#. Key:\t930942934A83107D86DB69A2C2EF11E0\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_117.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_117.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_117.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"The task is of high complexity.\"\nmsgstr \"這項任務很復雜。\"\n\n#. Key:\t93AFC24842A793D2BF7B43A64B6972AF\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_32.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_32.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_32.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Is there anything else for Raven?\"\nmsgstr \"還有其它事找烏鴉嗎？\"\n\n#. Key:\t9A9D5DA346251040AF73B7B100E1EBC9\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_35.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_35.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_35.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven used to like being a bird, but now he has no other choice. He must embrace what he became.\"\nmsgstr \"烏鴉過去喜歡當鳥，但現在他沒有別的選擇。他必須接受他所變成的樣子。\"\n\n#. Key:\t9B558C3045D4501AEAF3DD8694E2198F\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_105.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_105.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_105.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"We'd rather have some fun before it's all over.\"\nmsgstr \"我們想在壹切結束之前找點樂子。\"\n\n#. Key:\t9E598A384E301BCD345ABFB0C1312C12\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_78.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_78.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_78.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Krrr... Raven notices that you've found the Gem!\"\nmsgstr \"呃…… 烏鴉發現妳找到了寶石!\"\n\n#. Key:\t9FAD3A1A4E3EFE33C1CAB8BAAC8190D1\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_26.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_26.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_26.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Let Raven tell you something:\"\nmsgstr \"讓烏鴉告訴妳吧：\"\n\n#. Key:\tA10F960549BD21AFAD4819BD5C74E651\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_2.SpeechSequence(5).SpeechSequence.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_2.SpeechSequence(5).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_2.SpeechSequence(5).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Nevermind. Raven is kidding.\"\nmsgstr \"別介意。烏鴉是在開玩笑。\"\n\n#. Key:\tA4294A174F9EA54E0149839A84CE2B94\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_15.Children(2).Children.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_15.Children(2).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_15.Children(2).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Hopeless...\"\nmsgstr \"毫無希望...\"\n\n#. Key:\tA59406E8411939F96004EAA9D5707E08\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_28.Children(1).Children.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_28.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_28.Children(1).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"What?\"\nmsgstr \"什麽？？\"\n\n#. Key:\tA5993D8047CDD35BA31D318832EB9C66\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_32.Children(2).Children.Text\n#. Key:\tB7AE6BEC4CA905BDED5990BFF4D0C93D\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_3.Children(1).Children.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_32.Children(2).Children.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_3.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_3.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_32.Children(2).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"About wizards\"\nmsgstr \"關於巫師。\"\n\n#. Key:\tA59A76814D8EAF5907CBC68AA63FE33F\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_2.SpeechSequence(3).SpeechSequence.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_2.SpeechSequence(3).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_2.SpeechSequence(3).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"How can I know that if you don't do it?\"\nmsgstr \"如果妳不做，我怎麽知道?\"\n\n#. Key:\tA7C7D1EC45A072755BAAB099DB359290\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_55.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_55.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_55.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"They don't believe that Ruin can affect their World. They say that it has no effect.\"\nmsgstr \"他們不相信毀滅會影響他們的世界。他們說沒有效果。\"\n\n#. Key:\tA7D99136490D40CB08BA66A72192D6C0\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_7.SpeechSequence(2).SpeechSequence.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_7.SpeechSequence(2).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_7.SpeechSequence(2).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Go now! Raven needs to think.\"\nmsgstr \"現在就去吧！烏鴉需要思考。\"\n\n#. Key:\tA80B626C41713C6E42E4DF8696FF842D\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_8.SpeechSequence(0).SpeechSequence.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_8.SpeechSequence(0).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_8.SpeechSequence(0).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"You were a bird once. Then you became something else.\"\nmsgstr \"妳曾經是壹只鳥。然後妳就變了。\"\n\n#. Key:\tA8D429384EFE74E30720149A1C53ADE9\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_38.Children(0).Children.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_38.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_38.Children(0).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Don't know\"\nmsgstr \"不知道\"\n\n#. Key:\tA9A73720489C122A81B84CBA262C329E\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_38.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_38.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_38.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven knows what his task is. Do you know yours?\"\nmsgstr \"烏鴉知道他的任務是什麽。妳了解妳的任務嗎?\"\n\n#. Key:\tAB41A75C432BEBDC81D63282FCC15F98\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_5.SpeechSequence(2).SpeechSequence.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_5.SpeechSequence(2).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_5.SpeechSequence(2).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Got it? Free like a bird! Ha-ha-ha!\"\nmsgstr \"明白了嗎? 像鳥壹樣自由！哈哈哈！\"\n\n#. Key:\tAC52327249DB335CBAB9EDA6A3F4769E\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_31.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_31.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_31.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven is doing this because this is what he is.\"\nmsgstr \"烏鴉這麽做是因為他就是這樣的家夥。\"\n\n#. Key:\tB2003CEE44335B30B9F85487521B7679\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_54.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_54.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_54.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Maybe.\"\nmsgstr \"也許。\"\n\n#. Key:\tB31EEC6247CDEF73BB4E5B84E2B66575\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_9.SpeechSequence(2).SpeechSequence.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_9.SpeechSequence(2).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_9.SpeechSequence(2).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"That’s over now. This time it's for private business.\"\nmsgstr \"結束了。這壹次是為了私人事務。\"\n\n#. Key:\tB3DD59C44422BA99C839FCAE63F05B9A\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_93.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_93.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_93.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"I want to be free again!\"\nmsgstr \"我想重獲自由！\"\n\n#. Key:\tB789219A48C2A835F2DA4CA24064E1D3\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_92.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_92.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_92.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"I would like to go home.\"\nmsgstr \"我想回家。\"\n\n#. Key:\tB7D4201F41E5F018EFD49EAF52E443A8\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_76.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_76.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_76.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"You still haven't found the Gem.\"\nmsgstr \"妳還沒找到寶石。\"\n\n#. Key:\tB7EC6E4F4EDC448FD264999938414F3C\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_21.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Let's talk about something else!\"\nmsgstr \"我們談點別的吧！\"\n\n#. Key:\tB8BF08674C9E2FD0515998B95A1EA7CF\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_7.SpeechSequence(1).SpeechSequence.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_7.SpeechSequence(1).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_7.SpeechSequence(1).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"If you can't fulfill your task, then maybe your master should look for a better servant.\"\nmsgstr \"如果妳不能完成妳的任務，那麽也許妳的主人應該找壹個更好的仆人。\"\n\n#. Key:\tBD775EF74E334A4DEFA67BBF9034500E\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_84.Text\n#. Key:\tFA3FEF444FD2A3500FCCE98FAEAE923E\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_42.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_84.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_42.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_42.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_84.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Yes?\"\nmsgstr \"嗯？\"\n\n#. Key:\tBE2B9D7A45C2D43FF4C0BAAA284CBB97\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_2.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"No thanks! I'm on my way now.\"\nmsgstr \"不必了,謝謝！我現在就去。\"\n\n#. Key:\tC04CC9334FC3C2522793C2B97CC165D8\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_108.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_108.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_108.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"The gate is open!\"\nmsgstr \"大門是開著的！\"\n\n#. Key:\tC0F2E4744D724A3D6A0DEF914C294CE1\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_38.Children(1).Children.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_38.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_38.Children(1).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Go home\"\nmsgstr \"回家\"\n\n#. Key:\tC10018654B64193BBFF439B54EF02FB1\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_15.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"So why not open the gate?\"\nmsgstr \"那麽，為什麽不打開這扇門呢?\"\n\n#. Key:\tC18E2FB345BE76B6F51C71A2B6453316\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_99.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_99.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_99.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"What can you tell me about the Ruined Realm?\"\nmsgstr \"烏鴉將冒險深入毀滅王國！\"\n\n#. Key:\tC19082D247C23A21B632968FE6A644D1\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_8.SpeechSequence(3).SpeechSequence.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_8.SpeechSequence(3).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_8.SpeechSequence(3).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"You failed to see the meaning behind Raven's thoughts.\"\nmsgstr \"妳沒有體會到烏鴉思想背後的意義。\"\n\n#. Key:\tC2DC44084098DD604B757A8A47AAC4FE\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_58.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_58.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_58.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"We'll see.\"\nmsgstr \"再說吧。\"\n\n#. Key:\tC53F5E0F46BBE7A1FD00EABD6E14848D\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_33.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_33.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_33.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Maybe you are wiser than Raven, but that's just a thought, little spirit.\"\nmsgstr \"也許妳比烏鴉聰明，但那只是壹種想法，小精靈。\"\n\n#. Key:\tC78588B64D12FFBE97C47AB7C046C14E\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_1.SpeechSequence(5).SpeechSequence.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_1.SpeechSequence(5).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_1.SpeechSequence(5).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven doesn't believe it's true.\"\nmsgstr \"烏鴉不相信這是真的。\"\n\n#. Key:\tC7F7F71F4FE0D19BDF86188BEFDDEEB1\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_5.SpeechSequence(1).SpeechSequence.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_5.SpeechSequence(1).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_5.SpeechSequence(1).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Just look at Raven! He's free like a bird.\"\nmsgstr \"看看烏鴉！他像鳥壹樣自由。\"\n\n#. Key:\tC82BE6E448D7C98D361CA1890FEE3B2C\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_9.SpeechSequence(6).SpeechSequence.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_9.SpeechSequence(6).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_9.SpeechSequence(6).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"I’m in.\"\nmsgstr \"我來了。\"\n\n#. Key:\tCD1A68EF460B0C63C95340AC2076EBAF\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_10.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven notices that the gem is just as dull as before. Why did you return then?\"\nmsgstr \"烏鴉註意到寶石和以前壹樣陰暗。妳為什麽回來?\"\n\n#. Key:\tD3C84C884903F7FB53695AAE253C7982\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_40.Children(0).Children.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_40.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_40.Children(0).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Agree\"\nmsgstr \"同意\"\n\n#. Key:\tD438ABB348A399ACB18DFD8F320CC7BB\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_57.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_57.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_57.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"And what's the truth?\"\nmsgstr \"真相是什麽？\"\n\n#. Key:\tD5DF32814FA17D7ED28BF0A91027A6E8\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_110.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_110.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_110.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Finally! From now on you won't need Raven anymore.\"\nmsgstr \"終於! 從現在開始妳不再需要烏鴉了。\"\n\n#. Key:\tD6A649B2453BCBAD95A16FA481664133\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_49.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_49.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_49.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Find the other Chargers and return to Raven when you are done.\"\nmsgstr \"找到其它的充能，當妳完成的時候回到烏鴉那裏。\"\n\n#. Key:\tD9959CF1439812F5615A38B9369F6E16\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_71.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_71.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_71.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven notices that you already have the Gem.\"\nmsgstr \"烏鴉註意到妳已經擁有了寶石。\"\n\n#. Key:\tD9A4F3D54EF460C09B2A6C9B8EB87D7C\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_32.Children(1).Children.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_32.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_32.Children(1).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"About my purpose...\"\nmsgstr \"關於我的目的…\"\n\n#. Key:\tD9C6F8C14BC9C0BD83715E96DE5B7161\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_28.Children(0).Children.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_28.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_28.Children(0).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"He is a volunteer\"\nmsgstr \"他是壹名誌願者\"\n\n#. Key:\tDC7CA6DF4D684A7C2DBA739F404ABC36\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_94.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_94.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_94.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"I don't know what to do. I can't remember anything from my previous life.\"\nmsgstr \"我不知道該怎麽辦。我什麽都不記得了。\"\n\n#. Key:\tDD8E05E541C32F05357D888FB6963FF0\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_114.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_114.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_114.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"All right, I go then.\"\nmsgstr \"好吧，我走了。\"\n\n#. Key:\tDE3A0B8047C9980B6DED0BA39C777539\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_28.Children(3).Children.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_28.Children(3).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_28.Children(3).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Not interested\"\nmsgstr \"不感興趣\"\n\n#. Key:\tDF86F9C84CF207616E931098F3C833D3\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_18.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"To activate the locking mechanism we need an infused Lock Gem.\"\nmsgstr \"為了激活鎖定機制，我們需要壹個可註入的鎖寶石。\"\n\n#. Key:\tE0105C1845AF9211960E869AB234ED9A\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_89.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_89.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_89.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"So you are obeying because... that's the only thing that you can do?\"\nmsgstr \"所以妳服從是因為…那是妳唯壹能做的事?\"\n\n#. Key:\tE17598BB49D7E4083AD4AEA2DDFE293D\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_106.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_106.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_106.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"It would make sense to try to save the world, wouldn't it?\"\nmsgstr \"試圖拯救世界是有意義的，不是嗎?\"\n\n#. Key:\tE1CFA5A44F4EF59527528DB6018ACF33\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_8.SpeechSequence(6).SpeechSequence.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_8.SpeechSequence(6).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_8.SpeechSequence(6).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven doesn't care about what he could do. Raven cares about what he does.\"\nmsgstr \"烏鴉不在乎他能做什麽。烏鴉關心他做了什麽。\"\n\n#. Key:\tE6FA584E454BC3943C927EADAEBA88C4\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_6.SpeechSequence(8).SpeechSequence.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_6.SpeechSequence(8).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_6.SpeechSequence(8).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"That's not too reassuring...\"\nmsgstr \"這不是很讓人安心…\"\n\n#. Key:\tE9D9EC1F450276CF11B259978062AB7E\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_96.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_96.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_96.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"We shouldn't waste any more time on this.\"\nmsgstr \"我們不應該再在這上面浪費時間了。\"\n\n#. Key:\tEC19AF0E4F2F4B488373FFBEDC272321\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_56.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_56.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_56.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Except for a few paranoid ones, like your master.\"\nmsgstr \"除了少數偏執的人，比如妳的主人。\"\n\n#. Key:\tEFC8B9984D9F4A9ACC9AE580E271E810\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_39.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_39.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_39.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Searching for a way to open this gate with the help of a talking Ball is so much fun!\"\nmsgstr \"在壹只會說話的球的幫助下尋找打開這扇門的方法簡直太有意思了！\"\n\n#. Key:\tEFCE20A646FA62188BE7EB85D6708843\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_115.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_115.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_115.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven will venture deeper into the Ruined Realm!\"\nmsgstr \"烏鴉將冒險深入毀滅王國！\"\n\n#. Key:\tF0B00A30413914D09CA4488578B2FD7C\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_24.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_24.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_24.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven agrees.\"\nmsgstr \"烏鴉表示同意。\"\n\n#. Key:\tF40AD31D4177DCB7BB138C9C139FB1A1\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_61.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_61.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_61.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"I hope that won't be too soon...\"\nmsgstr \"我希望那不會太快……\"\n\n#. Key:\tF4F8CBCD421083EDBF626AA47DEF4B50\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_88.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_88.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_88.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Do you mean that you are serving your wizard by your own will?\"\nmsgstr \"妳是說妳是按照自己的意願為妳的巫師服務的嗎?\"\n\n#. Key:\tF5A7836549DF56B89620A386E7CCF708\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_48.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_48.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_48.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"But there is still so much left to do...\"\nmsgstr \"但還有很多事情要做……\"\n\n#. Key:\tF8361ECC401E740DEBF87FAE2A419EC8\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_32.Children(0).Children.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_32.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_32.Children(0).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven Servant?\"\nmsgstr \"烏鴉仆人？\"\n\n#. Key:\tFA5F957341772B0C4AFA33B1311CF7B4\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_69.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_69.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_69.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Except if we meet in the Afterworld.\"\nmsgstr \"除非我們在來世相遇。\"\n\n#. Key:\tFA94A8EF4F8BF5EA422D27A9A205D866\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_3.Children(0).Children.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_3.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_3.Children(0).Children.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Raven servant?\"\nmsgstr \"烏鴉仆人？\"\n\n#. Key:\tFC0798A648BFC0E9BA70D6B20A46F447\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_1.SpeechSequence(2).SpeechSequence.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_1.SpeechSequence(2).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_1.SpeechSequence(2).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Your master seeks to stop it no matter the price he has to pay.\"\nmsgstr \"妳的主人不管付出多大的代價都要阻止它。\"\n\n#. Key:\tFCE7049641D2A70FC6B9E5B174919A64\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_9.SpeechSequence(0).SpeechSequence.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_9.SpeechSequence(0).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_9.SpeechSequence(0).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Tabby has retired. What did you come for?\"\nmsgstr \"泰比已經退休了。妳來幹什麽?\"\n\n#. Key:\tFD68B18A435050A137D8F0948F24E2DC\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_12.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Why are we messing with this door if the World is about to end?\"\nmsgstr \"如果世界末日就要來了，我們為什麽還要去擺弄這扇門呢？\"\n\n#. Key:\tFF3D9FCF4A840A8155A8D7AD9CC22F2D\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_5.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Obey? Raven doesn't obey.\"\nmsgstr \"服從？烏鴉不會服從。\"\n\n#. Key:\tFFB203D94B0A5C22BA29B68A1A8A740F\n#. SourceLocation:\t/Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_9.SpeechSequence(8).SpeechSequence.Text\n#. /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_9.SpeechSequence(8).SpeechSequence.Text\n#: /Game/SO/Dialogues/AA/AARaven0.AARaven0:DlgNode_SpeechSequence_9.SpeechSequence(8).SpeechSequence.Text\nmsgctxt \"Dialogue_AARaven0\"\nmsgid \"Farewell then.\"\nmsgstr \"拜拜。\"\n\n#. Key:\t0C459FB64505D02011822A9EDFA8FCA4\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/AGStatue.AGStatue:DlgNode_Speech_4.Text\n#. /Game/SO/Dialogues/Wizard/Chapter1/AGStatue.AGStatue:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/AGStatue.AGStatue:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_AGStatue\"\nmsgid \"'We are the elite of the Runic Realm. Our wisdom is great, our magic is strong.'\"\nmsgstr \"“我們是符文王國的精英。我們的智慧是偉大的，我們的魔法是強大的。”\"\n\n#. Key:\t7DB580C64E9B33FD525DDF986BD5E4A4\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/AGStatue.AGStatue:DlgNode_Speech_6.Text\n#. /Game/SO/Dialogues/Wizard/Chapter1/AGStatue.AGStatue:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/AGStatue.AGStatue:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_AGStatue\"\nmsgid \"Looks like he was wrong...\"\nmsgstr \"看來他錯了…\"\n\n#. Key:\tAFBD86084D8E6EBDF240998FA98D184D\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/AGStatue.AGStatue:DlgNode_Speech_3.Text\n#. /Game/SO/Dialogues/Wizard/Chapter1/AGStatue.AGStatue:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/AGStatue.AGStatue:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_AGStatue\"\nmsgid \"'We are Ceruleans! We do not escape!'\"\nmsgstr \"“我們是蔚藍之城的人！我們不會逃跑！”\"\n\n#. Key:\tC2CC8EE94954A8DC42222FBB28A7656E\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/AGStatue.AGStatue:DlgNode_Speech_2.Text\n#. /Game/SO/Dialogues/Wizard/Chapter1/AGStatue.AGStatue:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/AGStatue.AGStatue:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_AGStatue\"\nmsgid \"'Citizens of Cerulean! Do not join the poor of Grey Gate!'\"\nmsgstr \"“蔚藍城市的居民！不要加入貧窮的灰暗之門！”\"\n\n#. Key:\tD909E4A34387B448378464BDE8292B4D\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/AGStatue.AGStatue:DlgNode_Speech_5.Text\n#. /Game/SO/Dialogues/Wizard/Chapter1/AGStatue.AGStatue:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/AGStatue.AGStatue:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_AGStatue\"\nmsgid \"'Ruin can’t harm us!'\"\nmsgstr \"“毀滅無法傷害我們！”\"\n\n#. Key:\t3CE243AA4AFB12B37239608C66537764\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/BeforeBoss.BeforeBoss:DlgNode_Speech_4.Text\n#. /Game/SO/Dialogues/Wizard/Chapter1/BeforeBoss.BeforeBoss:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/BeforeBoss.BeforeBoss:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_BeforeBoss\"\nmsgid \"Maybe you should talk to the gnome or the Keeper.\"\nmsgstr \"也許妳應該和矮人或守護者聊聊。\"\n\n#. Key:\t4F35F4834FBCC04C218A879123EF8706\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/BeforeBoss.BeforeBoss:DlgNode_Speech_2.Text\n#. /Game/SO/Dialogues/Wizard/Chapter1/BeforeBoss.BeforeBoss:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/BeforeBoss.BeforeBoss:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_BeforeBoss\"\nmsgid \"Using the portals here one could get into any part of the World in no time.\"\nmsgstr \"使用這裏的入口，壹個人可以在任何時間進入世界的任何地方。\"\n\n#. Key:\t62EDCB724DAC5317C72B99AEB9904F4E\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/BeforeBoss.BeforeBoss:DlgNode_Speech_1.Text\n#. /Game/SO/Dialogues/Wizard/Chapter1/BeforeBoss.BeforeBoss:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/BeforeBoss.BeforeBoss:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_BeforeBoss\"\nmsgid \"This place was the base of the formal Ruined Realm.\"\nmsgstr \"這個地方是正式的毀滅王國的基地。\"\n\n#. Key:\tCB8B47F74583A48529A353B97C4909B9\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/BeforeBoss.BeforeBoss:DlgNode_Speech_3.Text\n#. /Game/SO/Dialogues/Wizard/Chapter1/BeforeBoss.BeforeBoss:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/BeforeBoss.BeforeBoss:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_BeforeBoss\"\nmsgid \"I hope at least some of the portals still work.\"\nmsgstr \"我希望至少有壹些入口還能正常運作。\"\n\n#. Key:\t2A9CE8714E7E1ABC9365E5A1E2CE2EC8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/BossArmourWrath.BossArmourWrath:DlgNode_Speech_5.Text\n#. /Game/SO/Dialogues/Chapter2/BossArmourWrath.BossArmourWrath:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Chapter2/BossArmourWrath.BossArmourWrath:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_BossArmourWrath\"\nmsgid \"Keep away from my artefact little thief or I will crush you!\"\nmsgstr \"小毛賊，離我的工藝品遠點，不然我就揍扁妳！\"\n\n#. Key:\t3F79029C410F4CC3B41548A26A7D69EB\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/BossArmourWrath.BossArmourWrath:DlgNode_Speech_4.Text\n#. /Game/SO/Dialogues/Chapter2/BossArmourWrath.BossArmourWrath:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Chapter2/BossArmourWrath.BossArmourWrath:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_BossArmourWrath\"\nmsgid \"Listen, I really need that. What if I give you something instead?\"\nmsgstr \"聽著，我真的很需要那個。如果我給妳點什麽呢?\"\n\n#. Key:\t451F1E844E29E674899BD3BEFBC17380\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/BossArmourWrath.BossArmourWrath:DlgNode_Speech_2.Text\n#. /Game/SO/Dialogues/Chapter2/BossArmourWrath.BossArmourWrath:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter2/BossArmourWrath.BossArmourWrath:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_BossArmourWrath\"\nmsgid \"I’m here for the artefact... could you give it to me?\"\nmsgstr \"我是來拿工藝品的… 妳能把它給我嗎?\"\n\n#. Key:\tAC11C22040909F7F4DD1518AD5C14AFA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/BossArmourWrath.BossArmourWrath:DlgNode_Speech_3.Text\n#. /Game/SO/Dialogues/Chapter2/BossArmourWrath.BossArmourWrath:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Chapter2/BossArmourWrath.BossArmourWrath:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_BossArmourWrath\"\nmsgid \"That is mine!\"\nmsgstr \"這是我的！\"\n\n#. Key:\tD30E184A406B5B1EFB87F3845CE82664\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/BossArmourWrath.BossArmourWrath:DlgNode_Speech_1.Text\n#. /Game/SO/Dialogues/Chapter2/BossArmourWrath.BossArmourWrath:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter2/BossArmourWrath.BossArmourWrath:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_BossArmourWrath\"\nmsgid \"Have you come to worship my perfection?\"\nmsgstr \"妳是來瞻仰我的完美傑作的嗎？\"\n\n#. Key:\tF626219F434EECD05727BC9FAB5CEB76\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/BossArmourWrath.BossArmourWrath:DlgNode_Speech_6.Text\n#. /Game/SO/Dialogues/Chapter2/BossArmourWrath.BossArmourWrath:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Chapter2/BossArmourWrath.BossArmourWrath:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_BossArmourWrath\"\nmsgid \"Damn you and your perfection!\"\nmsgstr \"該死的妳和妳的完美！\"\n\n#. Key:\t2892C4AB4DACCAF48565619948DCA122\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/BossDwarvenStatue.BossDwarvenStatue:DlgNode_Speech_2.Text\n#. /Game/SO/Dialogues/Chapter2/BossDwarvenStatue.BossDwarvenStatue:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter2/BossDwarvenStatue.BossDwarvenStatue:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_BossDwarvenStatue\"\nmsgid \"I am all right! I am still keeping it back!\"\nmsgstr \"我沒事！我還在進行阻止！\"\n\n#. Key:\t378D26B144B4B17F23F788B56F714118\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/BossDwarvenStatue.BossDwarvenStatue:DlgNode_Speech_3.Text\n#. /Game/SO/Dialogues/Chapter2/BossDwarvenStatue.BossDwarvenStatue:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Chapter2/BossDwarvenStatue.BossDwarvenStatue:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_BossDwarvenStatue\"\nmsgid \"I am looking for an artefact...\"\nmsgstr \"我在找壹件工藝品……\"\n\n#. Key:\t3956257F405EC80CE4547FBE57C53A11\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/BossDwarvenStatue.BossDwarvenStatue:DlgNode_Speech_5.Text\n#. /Game/SO/Dialogues/Chapter2/BossDwarvenStatue.BossDwarvenStatue:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Chapter2/BossDwarvenStatue.BossDwarvenStatue:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_BossDwarvenStatue\"\nmsgid \"Do you...\"\nmsgstr \"妳……\"\n\n#. Key:\t946CFCCE4CA505C7C4039A9FF196A35C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/BossDwarvenStatue.BossDwarvenStatue:DlgNode_Speech_1.Text\n#. /Game/SO/Dialogues/Chapter2/BossDwarvenStatue.BossDwarvenStatue:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter2/BossDwarvenStatue.BossDwarvenStatue:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_BossDwarvenStatue\"\nmsgid \"Have the sculptors sent you?\"\nmsgstr \"雕刻家派妳來的嗎?\"\n\n#. Key:\tA30FB80548251020E4AD859A928AB6B5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/BossDwarvenStatue.BossDwarvenStatue:DlgNode_Speech_6.Text\n#. /Game/SO/Dialogues/Chapter2/BossDwarvenStatue.BossDwarvenStatue:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Chapter2/BossDwarvenStatue.BossDwarvenStatue:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_BossDwarvenStatue\"\nmsgid \"Go away! I hold it back!\"\nmsgstr \"走開! 我擋住了！\"\n\n#. Key:\tAC5220964331387202C55584104246C2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/BossDwarvenStatue.BossDwarvenStatue:DlgNode_Speech_8.Text\n#. /Game/SO/Dialogues/Chapter2/BossDwarvenStatue.BossDwarvenStatue:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Chapter2/BossDwarvenStatue.BossDwarvenStatue:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_BossDwarvenStatue\"\nmsgid \"I have a bad feeling about this...\"\nmsgstr \"我有壹種不好的感覺……\"\n\n#. Key:\tE05C384043C6F8407BDA2D97A1D64F96\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/BossDwarvenStatue.BossDwarvenStatue:DlgNode_Speech_7.Text\n#. /Game/SO/Dialogues/Chapter2/BossDwarvenStatue.BossDwarvenStatue:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Chapter2/BossDwarvenStatue.BossDwarvenStatue:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_BossDwarvenStatue\"\nmsgid \"He has one of the artefacts. You need to get it somehow.\"\nmsgstr \"他有壹件工藝品。妳需要以某種方式得到它。\"\n\n#. Key:\tF9B8F4E9413785B5F59DD88CBF8D56CC\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/BossDwarvenStatue.BossDwarvenStatue:DlgNode_Speech_4.Text\n#. /Game/SO/Dialogues/Chapter2/BossDwarvenStatue.BossDwarvenStatue:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Chapter2/BossDwarvenStatue.BossDwarvenStatue:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_BossDwarvenStatue\"\nmsgid \"Don’t come any closer! I’m still fine!\"\nmsgstr \"別再靠近了! 我還好！\"\n\n#. Key:\t49D7B5DA484C712573AE84B3A2609541\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/BossFallenDruid.BossFallenDruid:DlgNode_Speech_3.Text\n#. /Game/SO/Dialogues/Chapter2/BossFallenDruid.BossFallenDruid:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Chapter2/BossFallenDruid.BossFallenDruid:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_BossFallenDruid\"\nmsgid \"You will never lay your hand on anything in this place!\"\nmsgstr \"在這個地方，妳休想染指任何東西！\"\n\n#. Key:\t9642DD9241E67544571A5EABA9EBC42B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/BossFallenDruid.BossFallenDruid:DlgNode_Speech_2.Text\n#. /Game/SO/Dialogues/Chapter2/BossFallenDruid.BossFallenDruid:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter2/BossFallenDruid.BossFallenDruid:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_BossFallenDruid\"\nmsgid \"Actually I’m about to leave but I need the artefact first.\"\nmsgstr \"事實上，我正要離開，但我首先需要的是工藝品。\"\n\n#. Key:\t9A2BE08D4010C4D2425F96BA17A60936\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/BossFallenDruid.BossFallenDruid:DlgNode_Speech_4.Text\n#. /Game/SO/Dialogues/Chapter2/BossFallenDruid.BossFallenDruid:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Chapter2/BossFallenDruid.BossFallenDruid:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_BossFallenDruid\"\nmsgid \"I shall purge my forest from your kind! To hell with you creature!\"\nmsgstr \"我要把我的森林從妳的族類中清除！去妳的吧！\"\n\n#. Key:\tFC4A1C9748C31BD2AA2E4F93E5D56AF8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/BossFallenDruid.BossFallenDruid:DlgNode_Speech_1.Text\n#. /Game/SO/Dialogues/Chapter2/BossFallenDruid.BossFallenDruid:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter2/BossFallenDruid.BossFallenDruid:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_BossFallenDruid\"\nmsgid \"Stay away from my sacred forests creature of Ruin!\"\nmsgstr \"離我神聖的森林遠點，毀滅生物！\"\n\n#. Key:\t3F4302BF46D1F9EA241446A796CE6AA5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Fishy.C3Fishy:DlgNode_Speech_1.Text\n#. /Game/SO/Dialogues/Chapter3/C3Fishy.C3Fishy:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter3/C3Fishy.C3Fishy:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_C3Fishy\"\nmsgid \"Fishy will miss home.\"\nmsgstr \"呆魚會想家的。\"\n\n#. Key:\t52063C724F858E16B1E9B482E064B3FC\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Fishy.C3Fishy:DlgNode_Speech_16.Text\n#. /Game/SO/Dialogues/Chapter3/C3Fishy.C3Fishy:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/Chapter3/C3Fishy.C3Fishy:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_C3Fishy\"\nmsgid \"Raven will try to take us into the Human Realm.\"\nmsgstr \"烏鴉會帶我們進入人類王國。\"\n\n#. Key:\tBC79FC4E44CCD0BE44BAAAA5ED304C9D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3GateKeeper.C3GateKeeper:DlgNode_Speech_3.Text\n#. /Game/SO/Dialogues/Chapter3/C3GateKeeper.C3GateKeeper:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Chapter3/C3GateKeeper.C3GateKeeper:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_C3GateKeeper\"\nmsgid \"I hope you will find us Worthy.\"\nmsgstr \"我希望妳會覺得我們是值得的。\"\n\n#. Key:\tDD8DEA6B4E1D6AABEB6B0483614A41BB\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3GateKeeper.C3GateKeeper:DlgNode_Speech_1.Text\n#. /Game/SO/Dialogues/Chapter3/C3GateKeeper.C3GateKeeper:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter3/C3GateKeeper.C3GateKeeper:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_C3GateKeeper\"\nmsgid \"Welcome, my young Lord!\"\nmsgstr \"歡迎，我的小主人!\"\n\n#. Key:\tFCC28D1C4A19B1964301B388625A722F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3GateKeeper.C3GateKeeper:DlgNode_Speech_2.Text\n#. /Game/SO/Dialogues/Chapter3/C3GateKeeper.C3GateKeeper:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter3/C3GateKeeper.C3GateKeeper:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_C3GateKeeper\"\nmsgid \"I heard this time you shall open a Gate for us.\"\nmsgstr \"我聽說這次妳要為我們打開壹扇門。\"\n\n#. Key:\t1F96C2364594513AB8DF00A8C11ADB2C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Gnory.C3Gnory:DlgNode_Speech_4.Text\n#. /Game/SO/Dialogues/Chapter3/C3Gnory.C3Gnory:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Chapter3/C3Gnory.C3Gnory:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_C3Gnory\"\nmsgid \"I don’t want anything bad for business in the new Realm.\"\nmsgstr \"我不想讓新王國的生意遇到任何糟糕的情況。\"\n\n#. Key:\t24FA4B6840C3EEF0A9D418AED7C900A5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Gnory.C3Gnory:DlgNode_Speech_13.Text\n#. /Game/SO/Dialogues/Chapter3/C3Gnory.C3Gnory:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/Chapter3/C3Gnory.C3Gnory:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_C3Gnory\"\nmsgid \"Eh, you again?\"\nmsgstr \"呃，又是妳？\"\n\n#. Key:\t5CA8478D46ED1ADF6F0B5E82F1035ADE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Gnory.C3Gnory:DlgNode_Speech_2.Text\n#. /Game/SO/Dialogues/Chapter3/C3Gnory.C3Gnory:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter3/C3Gnory.C3Gnory:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_C3Gnory\"\nmsgid \"A whole new World awaits for me and my shop.\"\nmsgstr \"壹個全新的世界正等著我和我的商店。\"\n\n#. Key:\tA406AFAD47000D9338C978B2EB16A86F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Gnory.C3Gnory:DlgNode_Speech_3.Text\n#. /Game/SO/Dialogues/Chapter3/C3Gnory.C3Gnory:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Chapter3/C3Gnory.C3Gnory:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_C3Gnory\"\nmsgid \"If you can arrange it I would be more happy if we could leave Lory here.\"\nmsgstr \"如果妳能安排壹下，我們把勞裏留在這裏我會更高興。\"\n\n#. Key:\tBA4D0C244931E6431FA17CA2257BDDE1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Gnory.C3Gnory:DlgNode_Speech_1.Text\n#. /Game/SO/Dialogues/Chapter3/C3Gnory.C3Gnory:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter3/C3Gnory.C3Gnory:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_C3Gnory\"\nmsgid \"What a new opportunity! I don’t care about dwarves anymore.\"\nmsgstr \"壹個全新的機會！我不再在乎矮人了。\"\n\n#. Key:\t071AC5EE4AC65F5BE3CB61B64DE9E7FE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3GolemMaker.C3GolemMaker:DlgNode_Speech_2.Text\n#. /Game/SO/Dialogues/Chapter3/C3GolemMaker.C3GolemMaker:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter3/C3GolemMaker.C3GolemMaker:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_C3GolemMaker\"\nmsgid \"I have to admit Ruin will win in the end.\"\nmsgstr \"我不得不承認毀滅最終會取得勝利。\"\n\n#. Key:\t18398E3A4C6E72AAE25F24A14596ECD8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3GolemMaker.C3GolemMaker:DlgNode_Speech_1.Text\n#. /Game/SO/Dialogues/Chapter3/C3GolemMaker.C3GolemMaker:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter3/C3GolemMaker.C3GolemMaker:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_C3GolemMaker\"\nmsgid \"I fought Ruin for hundreds of years.\"\nmsgstr \"我與毀滅戰鬥了幾百年。\"\n\n#. Key:\t7800D3B64054BCE4A89E8E8E6265776B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3GolemMaker.C3GolemMaker:DlgNode_Speech_117.Text\n#. /Game/SO/Dialogues/Chapter3/C3GolemMaker.C3GolemMaker:DlgNode_Speech_117.Text\n#: /Game/SO/Dialogues/Chapter3/C3GolemMaker.C3GolemMaker:DlgNode_Speech_117.Text\nmsgctxt \"Dialogue_C3GolemMaker\"\nmsgid \"I have a bad feeling about this all...\"\nmsgstr \"我對這壹切有壹種不好的感覺……\"\n\n#. Key:\t334B64FA460A74FD99B4F3B9E4BE9E5A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3KoboldChef.C3KoboldChef:DlgNode_Speech_2.Text\n#. /Game/SO/Dialogues/Chapter3/C3KoboldChef.C3KoboldChef:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter3/C3KoboldChef.C3KoboldChef:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_C3KoboldChef\"\nmsgid \"So it will be ready anytime now.\"\nmsgstr \"所以現在隨時都可以。\"\n\n#. Key:\t5B8874F14160F55182A93EBCF5680173\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3KoboldChef.C3KoboldChef:DlgNode_Speech_1.Text\n#. /Game/SO/Dialogues/Chapter3/C3KoboldChef.C3KoboldChef:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter3/C3KoboldChef.C3KoboldChef:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_C3KoboldChef\"\nmsgid \"According to the recipe I need to swirl the ingredients until the end of the World.\"\nmsgstr \"根據食譜，我需要擺弄配料直到世界末日。\"\n\n#. Key:\t7DB6ED344E211B7A028C27BFB72750B1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3KoboldChef.C3KoboldChef:DlgNode_Speech_33.Text\n#. /Game/SO/Dialogues/Chapter3/C3KoboldChef.C3KoboldChef:DlgNode_Speech_33.Text\n#: /Game/SO/Dialogues/Chapter3/C3KoboldChef.C3KoboldChef:DlgNode_Speech_33.Text\nmsgctxt \"Dialogue_C3KoboldChef\"\nmsgid \"This is a special soup.\"\nmsgstr \"這是壹道特別的湯。\"\n\n#. Key:\t7D583DB14783DCF7EEE294920F9A1D61\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Lory.C3Lory:DlgNode_Speech_3.Text\n#. /Game/SO/Dialogues/Chapter3/C3Lory.C3Lory:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Chapter3/C3Lory.C3Lory:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_C3Lory\"\nmsgid \"Without paying a single gold coin. How sad.\"\nmsgstr \"壹枚金幣都付不出來。簡直悲劇。\"\n\n#. Key:\t8A26C9B24B810A94FED159B0D69D70D6\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Lory.C3Lory:DlgNode_Speech_1.Text\n#. /Game/SO/Dialogues/Chapter3/C3Lory.C3Lory:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter3/C3Lory.C3Lory:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_C3Lory\"\nmsgid \"Hi, my dear Ball!\"\nmsgstr \"嗨，我親愛的球！\"\n\n#. Key:\t8CF637DC4D66B9BFBE098DA3EA434F27\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Lory.C3Lory:DlgNode_Speech_9.Text\n#. /Game/SO/Dialogues/Chapter3/C3Lory.C3Lory:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/Chapter3/C3Lory.C3Lory:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_C3Lory\"\nmsgid \"Unfortunately I can't give you anything in return.\"\nmsgstr \"很遺憾，我無法給妳任何回報。\"\n\n#. Key:\t90A13FAC4AA90E98DBEFFA9BB8DEDE80\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Lory.C3Lory:DlgNode_Speech_7.Text\n#. /Game/SO/Dialogues/Chapter3/C3Lory.C3Lory:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Chapter3/C3Lory.C3Lory:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_C3Lory\"\nmsgid \"Oh, thank you! Books always matter.\"\nmsgstr \"噢, 謝謝妳！書壹直至關重要。\"\n\n#. Key:\t9C6E843645F86F1E39E6458952C7F283\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Lory.C3Lory:DlgNode_Speech_4.Text\n#. /Game/SO/Dialogues/Chapter3/C3Lory.C3Lory:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Chapter3/C3Lory.C3Lory:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_C3Lory\"\nmsgid \"I hope I can open a new shop in the Human Realm.\"\nmsgstr \"我希望我能在人類王國開壹家新商店。\"\n\n#. Key:\tAE354F2C458C144C2825028174F91CCE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Lory.C3Lory:DlgNode_Speech_5.Text\n#. /Game/SO/Dialogues/Chapter3/C3Lory.C3Lory:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Chapter3/C3Lory.C3Lory:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_C3Lory\"\nmsgid \"I don't know if it still matters but I have these books for you.\"\nmsgstr \"我不知道這是否重要，但我有壹些書給妳。\"\n\n#. Key:\tB5BCB95E43DB3854273F6AAA4067FC55\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Lory.C3Lory:DlgNode_Speech_42.Text\n#. /Game/SO/Dialogues/Chapter3/C3Lory.C3Lory:DlgNode_Speech_42.Text\n#: /Game/SO/Dialogues/Chapter3/C3Lory.C3Lory:DlgNode_Speech_42.Text\nmsgctxt \"Dialogue_C3Lory\"\nmsgid \"Unfortunately I have nothing at the store right now. Ha-ha...\"\nmsgstr \"不幸的是，我現在店裏沒有東西。哈哈…\"\n\n#. Key:\tC0E84ACD40CB002E0C30A289E0554EE9\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Lory.C3Lory:DlgNode_Speech_10.Text\n#. /Game/SO/Dialogues/Chapter3/C3Lory.C3Lory:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/Chapter3/C3Lory.C3Lory:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_C3Lory\"\nmsgid \"No problem.\"\nmsgstr \"沒問題。\"\n\n#. Key:\tFEFF93C84CC75D277EC221AD22338A75\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Lory.C3Lory:DlgNode_Speech_2.Text\n#. /Game/SO/Dialogues/Chapter3/C3Lory.C3Lory:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter3/C3Lory.C3Lory:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_C3Lory\"\nmsgid \"Ruin took all my wares.\"\nmsgstr \"毀滅拿走了我全部的商品。\"\n\n#. Key:\t090F12534A0096B8D4D7D9A5CDC9B3B5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_25.Text\n#. /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_25.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_25.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Well I guess you don’t have many customer.\"\nmsgstr \"我想妳的顧客不多吧。\"\n\n#. Key:\t10A1CF314EC02954FF38F1989C61DEE9\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_14.Text\n#. /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"That’s only one man! I need three!\"\nmsgstr \"那只是壹個人！我需要三個！\"\n\n#. Key:\t127DE2E049C91112F814C69348954F99\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_7.Children(1).Children.Text\n#. /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_7.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_7.Children(1).Children.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Buy name\"\nmsgstr \"購買名字\"\n\n#. Key:\t1AF2DDE74542524EEF19CA9567CFBDAF\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_58.Text\n#. /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_58.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_58.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"{name}? It still sounds a bit weird, but I think I might like it.\"\nmsgstr \"{name}? 聽起來還是有點怪，但我想我可能會喜歡。\"\n\n#. Key:\t1C411E31405F157B2465229ECE66F4E0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_31.Children(2).Children.Text\n#. /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_31.Children(2).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_31.Children(2).Children.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Wanderer\"\nmsgstr \"流浪者\"\n\n#. Key:\t1ED747BD43E40D4096809696951517EE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_20.Text\n#. /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"A special offer for ya! Give me three Blue Gems and I’ll give ya the key!\"\nmsgstr \"給妳壹份特別優惠！給我三顆藍寶石，我就給妳壹把鑰匙！\"\n\n#. Key:\t20B146B94D2E2FCE5E0C48BC64F7A1D6\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_19.Text\n#. Key:\t41E21D044B53E16C1BA8D7B720D84B50\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_36.Text\n#. /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_19.Text\n#. /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_36.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_36.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Sure man!\"\nmsgstr \"壹言為定！\"\n\n#. Key:\t2BDF52EF43CA5FBB145EC1BA0014FC27\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_7.Children(3).Children.Text\n#. /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_7.Children(3).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_7.Children(3).Children.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Who are you?\"\nmsgstr \"妳是哪位？\"\n\n#. Key:\t2DF772F14AAA9780F4D9E397DE723665\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_32.Text\n#. /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_32.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_32.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Fearsome! At least for what you will destroy.\"\nmsgstr \"可怕！至少是為了妳要摧毀的東西。\"\n\n#. Key:\t312F26294ECE4F618D88BE84DE7A2F9A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_31.Children(1).Children.Text\n#. /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_31.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_31.Children(1).Children.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Destroyer\"\nmsgstr \"毀滅者\"\n\n#. Key:\t328C9911427AA19B40B297ACC9D16447\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_31.Children(3).Children.Text\n#. /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_31.Children(3).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_31.Children(3).Children.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Don't buy\"\nmsgstr \"不購買\"\n\n#. Key:\t32D3F53746DD2801BC1B04AF1C1753DD\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_2.Text\n#. /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Don’t turn around I’m talking to ya big guy! Down here on the wood!\"\nmsgstr \"別回頭，我在跟妳說話，大個子！到下面的樹林裏來!\"\n\n#. Key:\t576A3CE049331518C8D1F196E6CC382C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_28.Text\n#. /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Back on topic: will ya buy something?\"\nmsgstr \"回到話題: 妳會買東西嗎?\"\n\n#. Key:\t5C1E07DF4B2D135102D6B09D3A04A726\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_5.Text\n#. /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"C’mon man! Don’t just stand there tell me what ya want!\"\nmsgstr \"來吧人類！不要只是站在那裏，告訴我妳想要什麽!\"\n\n#. Key:\t62AA5DD54A8447F7A277B194B05FB74D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_23.Text\n#. /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_23.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_23.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"What’s wrong with ya man?\"\nmsgstr \"妳怎麽了，夥計?\"\n\n#. Key:\t6E13F5544C66EDB0CFE764A0F52269E1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_27.Text\n#. /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_27.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_27.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"You know transporting breadcrumbs, marching onto various directions, the usual things.\"\nmsgstr \"妳知道，運送面包屑，向各個方向行進，這些日常的事情。\"\n\n#. Key:\t6F3C17894E694FC6215871B167087908\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_24.Text\n#. /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_24.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_24.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"I’m Merch Ant doin’ Microtransactions. I’ve just told ya.\"\nmsgstr \"我螞蟻商人，我在做微交易。我已經告訴過妳了。\"\n\n#. Key:\t7169B2FA40F5F5F328D2A6B9D53D58C8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_7.Children(0).Children.Text\n#. /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_7.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_7.Children(0).Children.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Trade\"\nmsgstr \"交易\"\n\n#. Key:\t7B41C105431C54F2FDDEA6AA9A0E1C1A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_10.Text\n#. /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Er... so who are you and what are you doing here?\"\nmsgstr \"呃…  妳是誰，妳在這裏做什麽?\"\n\n#. Key:\t8718A8F54D5722F666D83F8067476622\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_9.Text\n#. /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"There is an iron door which blocks the path to the tower. Do you have something which opens it?\"\nmsgstr \"有壹扇鐵門擋住了通往塔的路。妳有什麽東西可以打開它嗎?\"\n\n#. Key:\t889B39EC4BC170A2BF493380947116A7\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_22.Text\n#. /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Sure man! Microtransactions always work!\"\nmsgstr \"當然！微交易總是可行的!\"\n\n#. Key:\t9157AE9644A4A3B2C97F7482932160D2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_15.Text\n#. /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"No man, we agreed on three!\"\nmsgstr \"不，我們說好了三個!\"\n\n#. Key:\t9283F6B1447C6992FE355289F3337472\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_7.Children(2).Children.Text\n#. /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_7.Children(2).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_7.Children(2).Children.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Gate\"\nmsgstr \"門\"\n\n#. Key:\t99C44AA849A384C7941D3DAE1D6A3EFF\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_13.Text\n#. /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Here is your Gem!\"\nmsgstr \"這是妳的寶石！\"\n\n#. Key:\t9CA7941F42ABFAE5660895AF886CD62C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_31.Text\n#. /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_31.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_31.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Sure man! I have some really cool ones for sale!\"\nmsgstr \"當然！我有壹些很酷的東西要賣！\"\n\n#. Key:\tA3C6B03E404B1C039EF1C98C8E28AE22\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_8.Text\n#. /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Show me what you've got for sale!\"\nmsgstr \"讓我看看妳有什麽好賣的!\"\n\n#. Key:\tABE279924E0641DA18E9708F35F4500A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_29.Text\n#. /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_29.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_29.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"I’ve got to go.\"\nmsgstr \"我得走了。\"\n\n#. Key:\tAF1FECDB402777D850B819B934DF851D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_34.Text\n#. /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_34.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_34.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Ah, never mind, here you go!\"\nmsgstr \"啊，沒關系，給妳！\"\n\n#. Key:\tB19FA067432CE0273A3652AA9A32F2DF\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_18.Text\n#. /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Don’t be surprised!\"\nmsgstr \"不要驚訝！\"\n\n#. Key:\tB5F8E17E4712A37EF1C227AA7E99DBC8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_12.Text\n#. /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Aren’t two Gems enough for you?\"\nmsgstr \"對妳來說兩個寶石還不夠嗎?\"\n\n#. Key:\tBC5DEE9E4D39238451D1A2B9F8B20815\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_26.Text\n#. /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_26.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_26.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Okey, okey! I have to admit I also do some regular ant work from time to time.\"\nmsgstr \"好，好！我不得不承認我有時也做壹些尋常工作。\"\n\n#. Key:\tBD7096344553E098E4A29787E1386B4A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_21.Text\n#. /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Are you sure the key works?\"\nmsgstr \"妳確定鑰匙能用嗎？\"\n\n#. Key:\tC6A384624B53D808D62CB885A6573150\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_17.Text\n#. /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Was nice to deal with ya!\"\nmsgstr \"很高興和妳打交道！\"\n\n#. Key:\tC737154043396F726CF6B2814991B38D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_35.Text\n#. /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_35.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_35.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"I've changed my mind. I'm fine with my current name.\"\nmsgstr \"我改變主意了。我對我現在的名字很滿意。\"\n\n#. Key:\tC94F33504E68364DE1BAA48FC0CA85E5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_7.Children(5).Children.Text\n#. /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_7.Children(5).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_7.Children(5).Children.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Leave\"\nmsgstr \"離開\"\n\n#. Key:\tCDA5A0164F5FDD87D0F4C0B10A5ED5DA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_11.Text\n#. /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"I did my part. Give me the key!\"\nmsgstr \"我盡了我的本分，把鑰匙給我！\"\n\n#. Key:\tD1B1D33742EAA6A9BCDC42B5EA72EB59\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_31.Children(0).Children.Text\n#. /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_31.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_31.Children(0).Children.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Saviour\"\nmsgstr \"救世主\"\n\n#. Key:\tD1E444764EDA1457DD7427A0EA75C65F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_7.Children(4).Children.Text\n#. /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_7.Children(4).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_7.Children(4).Children.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Blue Gem\"\nmsgstr \"藍寶石\"\n\n#. Key:\tD65AD8854E1A5BC2D37C208357BACDE3\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_4.Text\n#. /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Due to my size!\"\nmsgstr \"因為我的碼子太大！\"\n\n#. Key:\tDDEB5C4B4A180E85B1D711815B4D32F3\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_6.Text\n#. /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Can I buy a name from you?\"\nmsgstr \"我能從妳這裏買個名字嗎?\"\n\n#. Key:\tDE3F40384473EC97950CDDB43AFE439E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_16.Text\n#. /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Easy man! Here ya go!\"\nmsgstr \"放輕松！幹得好！\"\n\n#. Key:\tDEED1AF94E4BC154ED98A8B951AF0673\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_7.Text\n#. /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Hey again!\"\nmsgstr \"嘿！\"\n\n#. Key:\tE2C88DA74DA8B5935E15CC9FD337C307\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_39.Text\n#. /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_39.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_39.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Come on man! You can't just wander around!\"\nmsgstr \"來吧！妳不能只是到處閑逛！\"\n\n#. Key:\tEA08DE334C7D8631989D159FB841367D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_30.Text\n#. /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_30.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_30.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"See ya man!\"\nmsgstr \"回頭見！\"\n\n#. Key:\tEAB8C1DE4B07AD7EAF0A4B819E4522C6\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_1.Text\n#. /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"Hey there!\"\nmsgstr \"嘿!\"\n\n#. Key:\tF780C72E4DDD9D9189C900836D4F7DBD\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_3.Text\n#. /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"I’m Merch Ant, I deal with microtransactions.\"\nmsgstr \"我是螞蟻商人，我進行微交易。\"\n\n#. Key:\tFED676B745409B7095EBB2994E581817\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_57.Text\n#. /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_57.Text\n#: /Game/SO/Dialogues/Chapter3/C3MerchAnt.C3MerchAnt:DlgNode_Speech_57.Text\nmsgctxt \"Dialogue_C3MerchAnt\"\nmsgid \"That's cool man. Though I wonder who will you save?\"\nmsgstr \"那很酷，我想知道妳會拯救誰？\"\n\n#. Key:\t04F1EF4B4AFDE5759A25A1A4922E9EA8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_28.Text\n#. /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"Yet they could do nothing.\"\nmsgstr \"然而他們什麽也不能做。\"\n\n#. Key:\t05E7A2224316FEED1A2CEB8AEFC46B41\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_6.Text\n#. /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"We can’t let everyone die here.\"\nmsgstr \"我們不能讓所有人都死在這裏。\"\n\n#. Key:\t078A48C347E2B23E79C495BA42BC7B6D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_25.Text\n#. /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_25.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_25.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"We’ll have time to find a cure.\"\nmsgstr \"我們有時間找到治愈方法。\"\n\n#. Key:\t0A857169478EC6929EFCA3B390C394DA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_20.Text\n#. /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"Prepare for your last travel in the Ruined Realm. Head to the north from where the wind is blowing!\"\nmsgstr \"準備好妳最後壹次在毀滅王國的旅行。從有風的地方朝北走!\"\n\n#. Key:\t1D8B6C81428A6D9F4C29AE9AD26206F2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_29.Children(1).Children.Text\n#. /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_29.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_29.Children(1).Children.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"Can't leave them\"\nmsgstr \"不能把它們留下\"\n\n#. Key:\t217F39F14762862B6EA18484EA74E987\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_37.Text\n#. /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_37.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_37.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"I wish you better luck this time!\"\nmsgstr \"祝妳這次好運！\"\n\n#. Key:\t22E17F2F4CFDD0CEB67AB0A91D872B3F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_4.Children(2).Children.Text\n#. /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_4.Children(2).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_4.Children(2).Children.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"Not my problem\"\nmsgstr \"不是我的問題\"\n\n#. Key:\t2685CE674BB3B11FD3CB3AA2460CE60A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_8.Text\n#. /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"There is nothing we can do for this World.\"\nmsgstr \"我們對這個世界無能為力。\"\n\n#. Key:\t26A2075F407FF43E1AF8B6B38E9C4AEE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_13.Text\n#. /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"Farewell!\"\nmsgstr \"告辭！\"\n\n#. Key:\t2F7D7C46418E8E049493839A26DBB10E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_15.Text\n#. /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"I’m ready to sacrifice myself but I feel sorrow for this world.\"\nmsgstr \"我準備犧牲自己，但我為這個世界感到悲傷。\"\n\n#. Key:\t39172C7641A5973A4B5D8480EBDD2589\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_34.Text\n#. /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_34.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_34.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"Back already?\"\nmsgstr \"已經回來了？\"\n\n#. Key:\t3D21436E48DA0DF9C3ACA3B11001B17C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_17.Text\n#. /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"Yet, we need to save those we can.\"\nmsgstr \"然而，我們需要拯救那些我們可以拯救的人。\"\n\n#. Key:\t43B780AA4934FBE35679BFB3C1C92D56\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_21.Text\n#. /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"Farewell Wanderer!\"\nmsgstr \"再見流浪者！\"\n\n#. Key:\t4AD4171F4A1832148034BAA736FC587E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_12.Text\n#. /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"Head to the north from where the wind is blowing!\"\nmsgstr \"從有風的地方朝北走！\"\n\n#. Key:\t4E65707F497B4B35E873138DDBF7B879\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_9.Text\n#. /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"I will go home and you will solve your problems on your own.\"\nmsgstr \"我要回家了，妳需要靠自己解決問題。\"\n\n#. Key:\t4EDA1AEF471537F758DD0491A7140073\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_7.Text\n#. /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"This is none of my business.\"\nmsgstr \"這不關我的事。\"\n\n#. Key:\t58246AA446D982E55E53EAB34FFF6A81\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_34.Children(1).Children.Text\n#. /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_34.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_34.Children(1).Children.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"Leave\"\nmsgstr \"離開\"\n\n#. Key:\t67CB3C99468EEA39C4C18C8B0C28AFEA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_26.Text\n#. /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_26.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_26.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"You? You mean the Wizard Council?\"\nmsgstr \"妳？妳是說巫師協會？\"\n\n#. Key:\t743DD4C048F8CD08A49805975183B54D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_10.Text\n#. /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"I’m sorry it ends like this, Wanderer.\"\nmsgstr \"很抱歉就這樣結束了，流浪者。\"\n\n#. Key:\t7AB88DE549E213B71759699AD51CFD4C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_14.Text\n#. /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"I’m really proud of you little spirit. This wasn’t an easy decision for me either.\"\nmsgstr \"我真為妳驕傲。這對我來說也不是壹個容易的決定。\"\n\n#. Key:\t7DCF30E74F8C0F29DA4E668CE3435E89\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_3.Text\n#. /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"Wizard can’t hear us here, we can talk freely.\"\nmsgstr \"巫師在這裏聽不到我們說話，我們可以自由交談。\"\n\n#. Key:\t8177A07D41AE7778BB4839AED3FEDACF\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_23.Text\n#. /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_23.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_23.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"Do you know what you are risking?\"\nmsgstr \"妳知道妳在冒什麽險嗎?\"\n\n#. Key:\t876B4752465406828E27A88C282EA5CD\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_19.Text\n#. /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"From here I can teleport you close to the place where the Wizard will be able to get you out.\"\nmsgstr \"從這裏，我可以傳送妳到附近的地方，那裏的巫師將能夠把妳救出來。\"\n\n#. Key:\t9255CAD841A0C5B4DF3F4D8C5F5516B1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_16.Text\n#. /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"So many great things will perish. So many...\"\nmsgstr \"這麽多偉大的東西都將毀付之壹炬。這麽多……\"\n\n#. Key:\t95EDE8FB4CEC490381EBD990C7277009\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_38.Text\n#. /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_38.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_38.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"Take your time!\"\nmsgstr \"慢慢來！\"\n\n#. Key:\t9D46888D43C665A29506BF9CBB62F81D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_35.Text\n#. /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_35.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_35.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"Let me try again!\"\nmsgstr \"讓我試壹次！\"\n\n#. Key:\tA1CF649542AAE3D8945327B9502E2E78\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_29.Text\n#. /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_29.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_29.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"What chance do the humans have?\"\nmsgstr \"人類有什麽機會?\"\n\n#. Key:\tA60B94F64A0D02EA0DA9419741ED84F4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_36.Text\n#. /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_36.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_36.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"I just need some rest.\"\nmsgstr \"我只是需要休息。\"\n\n#. Key:\tA651056C4D344D685FEB53B2C3795966\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_34.Children(0).Children.Text\n#. /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_34.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_34.Children(0).Children.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"Retry\"\nmsgstr \"重試\"\n\n#. Key:\tAAE7046349DBE5359097179A42FDA255\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_33.Text\n#. /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_33.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_33.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"This one was enough.\"\nmsgstr \"這壹個就夠了。\"\n\n#. Key:\tB17D67194997EFAEF6B8678DB05894FD\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_22.Text\n#. /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"Let’s get them out first and face Ruin after.\"\nmsgstr \"讓我們先把他們救出來，然後再面對毀滅。\"\n\n#. Key:\tB4E31022471B52056F7B5AA3BB322700\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_18.Text\n#. /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"How can I get to the Wizard’s tower?\"\nmsgstr \"我怎麽去巫師塔?\"\n\n#. Key:\tB6C99FC54E2A347994473EBF52B57EBD\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_4.Children(1).Children.Text\n#. /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_4.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_4.Children(1).Children.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"Raven’s plan\"\nmsgstr \"烏鴉的計劃\"\n\n#. Key:\tB985955E4FC6D81FBD38D79ADE68BF1F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_4.Children(0).Children.Text\n#. /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_4.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_4.Children(0).Children.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"Separate Worlds\"\nmsgstr \"分離的世界\"\n\n#. Key:\tC4BABAED4C790EDDF6AAF7A0D4CFA79B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_27.Text\n#. /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_27.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_27.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"When Ruin started in the Runic Realm they had hundreds of Scientists who studied the force which made Ruin.\"\nmsgstr \"當毀滅在符文王國開始行動時，他們有數百名科學家在研究毀滅的力量。\"\n\n#. Key:\tCB779F524992B29781C4778ED6E224A7\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_30.Text\n#. /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_30.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_30.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"I just can’t leave them to die here...\"\nmsgstr \"我不能讓他們死在這裏……\"\n\n#. Key:\tCDA7A09249E96A52B2FA3CA471D6C4B3\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_2.Text\n#. /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"This is the end of the path where we last meet.\"\nmsgstr \"這是我們最後壹次見面的地方。\"\n\n#. Key:\tCF238FAA4941848AF7071A866B75B6EC\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_5.Text\n#. /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"You are right. The only way to stop Ruin is to lock the Ruined Realm forever.\"\nmsgstr \"妳說得對。阻止毀滅的唯壹方法就是永遠鎖住毀滅王國。\"\n\n#. Key:\tD1F3B7324351B25E8C55679BAC3BF1E0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_4.Text\n#. /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"Have you made your decision?\"\nmsgstr \"妳決定了嗎?\"\n\n#. Key:\tE164446B4944B4CAC8E5C1BF82A722A2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_24.Text\n#. /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_24.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_24.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"If you bring infected people into the Human Realm Ruin will consume them.\"\nmsgstr \"如果妳把受感染的人帶入人類世界，毀滅就會吞噬他們。\"\n\n#. Key:\tE39531DE4350D6D86DF469839F1906E7\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_31.Text\n#. /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_31.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_31.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"It’s your decision, Wanderer. I understand.\"\nmsgstr \"這是妳的決定，流浪者。我明白了。\"\n\n#. Key:\tE46912D04BE67D3E2B0794BB632AEE98\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_32.Text\n#. /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_32.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_32.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"I’ll stay here. I won’t be able to watch another World dying...\"\nmsgstr \"我將留在這裏。我不能再眼睜睜看著另壹個世界滅亡……\"\n\n#. Key:\tF70B765F44DB17E1C6978D9D8652C911\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_1.Text\n#. /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"Hello, little Wanderer!\"\nmsgstr \"妳好, 小流浪者！\"\n\n#. Key:\tFE709EDF4482B6FA7408DE99D95E8577\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_29.Children(0).Children.Text\n#. /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_29.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_29.Children(0).Children.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"You are right\"\nmsgstr \"妳是對的\"\n\n#. Key:\tFE77F7964851F202F5C91396A4C7228E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_11.Text\n#. /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/Chapter3/C3Monk.C3Monk:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_C3Monk\"\nmsgid \"I’ll take you to the place where you can leave this Realm.\"\nmsgstr \"我帶妳去可以離開這個王國的地方。\"\n\n#. Key:\t0B886754483D1C215FBEF5B7D19AF6A6\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_4.Text\n#. /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"I know you have summoned a Spirit of the Unknown world. You were a fool to think you can get away with this.\"\nmsgstr \"我知道妳召喚了壹個無名幽魂。妳以為妳能僥幸逃脫，真是太傻了。\"\n\n#. Key:\t0BDF59D34A9E53B7FD5FD18F8E46F72F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_22.Text\n#. /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"Argh! All right, here you go...\"\nmsgstr \"啊！好的，給妳……\"\n\n#. Key:\t2A6837CA471604FCDD180E85BD23D676\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_16.Text\n#. /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"Krrr... Raven gives you magic which will make you fly like a Raven.\"\nmsgstr \"呃……烏鴉給妳魔法，讓妳像烏鴉壹樣飛翔。\"\n\n#. Key:\t2D8209F74AC3C9E042717A9FB108C051\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_20.Text\n#. /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"Come on, go and try it!\"\nmsgstr \"來吧，去試試!\"\n\n#. Key:\t39B1763740E9BB9B495A7997920A3401\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_12.Children(0).Children.Text\n#. /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_12.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_12.Children(0).Children.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"How?\"\nmsgstr \"怎麽做？\"\n\n#. Key:\t3AE553D14FFB88C0518679B86691D508\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_2.Text\n#. /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"Call your master little spirit, I have words with him.\"\nmsgstr \"小精靈，呼叫妳的主人，我有話和他說。\"\n\n#. Key:\t3E02111D40F21C2C8C13F08729B4CDBC\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_5.Text\n#. /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"I don’t know about any rule forbidding that...\"\nmsgstr \"我不知道有什麽規定禁止……\"\n\n#. Key:\t453610F144D8CEB42138F0BB35B9692A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_8.Text\n#. /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"Wait Scholar! Please give me a few more days!\"\nmsgstr \"等等，斯考拉! 請再給我幾天時間!\"\n\n#. Key:\t4F0C40114C4DD1B345CF909E94F99D60\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_14.Text\n#. /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"Why should I ask that?\"\nmsgstr \"我為什麽要問這個?\"\n\n#. Key:\t56F0D93740AB7555FF9370879D774842\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_7.Text\n#. /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"I have no doubt how the Council will react.\"\nmsgstr \"我毫不懷疑協會將如何作出反應。\"\n\n#. Key:\t60D3A9DA420ECD7DBF490BA233EA5C61\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_21.Text\n#. /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"Because you would love to know how you can get out of here.\"\nmsgstr \"因為妳很想知道怎樣才能離開這裏。\"\n\n#. Key:\t6125A956446F64BD91E1F5A282AC146D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_9.Text\n#. /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"Don’t worry! I know your daughter is trapped in the Unknown and my research confirms there is a chance you can bring her back.\\r\\nI’ll help you bring the missing artefacts back.\"\nmsgstr \"別擔心! 我知道妳的女兒被困在未知之中，我的研究證實妳有機會把她帶回來。\\r\\n我會幫妳把丟失的工藝品找回來。\"\n\n#. Key:\t6B7478444FBC694480D442BB90F70B27\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_3.Text\n#. /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"What do you want?\"\nmsgstr \"妳想怎麽樣\"\n\n#. Key:\t72D7F64D4051F9BF362B9B97FD30DB65\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_12.Children(2).Children.Text\n#. Key:\tF62125FB48F982D2A3D4FE9621810F64\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_15.Text\n#. /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_12.Children(2).Children.Text\n#. /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_12.Children(2).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"What?\"\nmsgstr \"什麽？\"\n\n#. Key:\t810BD4154FA6BC7F857F9CB14EDC6A1D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_19.Text\n#. /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"Er... thanks!\"\nmsgstr \"呃... 謝謝！\"\n\n#. Key:\t8F439E124100E004BCCD4AA04F17CB3F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_13.Text\n#. /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"How will we get out of here?\"\nmsgstr \"我們怎麽出去?\"\n\n#. Key:\t9D31A0084CBBA499BA4E3BADB42E6E36\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_6.Text\n#. /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"Rule? What rule should be needed for something which was thought to be impossible?\"\nmsgstr \"規則? 對於被認為是不可能的事情，應該用什麽規則呢?\"\n\n#. Key:\t9F52551E46588D4F12CD7C8B63701FDE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_12.Children(1).Children.Text\n#. /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_12.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_12.Children(1).Children.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"Why?\"\nmsgstr \"為什麽?\"\n\n#. Key:\tAAC96E3C4D4D303C9E692390612A7215\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_12.Text\n#. /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"Ask how we will get out of here!\"\nmsgstr \"問問我們怎麽出去!\"\n\n#. Key:\tC0808C6545D02F43CB37A2AFB79EEC1F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_17.Text\n#. /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"Actually it’s not that good but still better than nothing.\"\nmsgstr \"其實沒有那麽好，但有勝於無。\"\n\n#. Key:\tC19759F44A5A2AE21A04EBAF2A47E2D3\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_18.Text\n#. /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"Take this!\"\nmsgstr \"拿著這個！\"\n\n#. Key:\tC8CEB3844A6C958FF42C74AA81D4A90F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_1.Text\n#. /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"Finally, Raven found you!\"\nmsgstr \"烏鴉，終於找到妳了!\"\n\n#. Key:\tCF6DEF4D4F6F664CF24435AF248CE452\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_10.Text\n#. /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"Raven and his fellow Ball on a quest again!\"\nmsgstr \"烏鴉和他的球球小夥伴再壹次開始探索！\"\n\n#. Key:\tE52C31F241BCD21378696EB8761C0654\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_11.Text\n#. /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven1.C3Raven1:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_C3Raven1\"\nmsgid \"Let the masters talk in private and discuss how we will get out of here!\"\nmsgstr \"讓主人們私下談談，討論壹下我們怎麽出去！\"\n\n#. Key:\t00ED8B314FC2DA3901823F92635D41D1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_26.Children(0).Children.Text\n#. /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_26.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_26.Children(0).Children.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"You’ll be all dead\"\nmsgstr \"妳們都會死的\"\n\n#. Key:\t23BA5AA446B44D107B9F3994ADDE1C43\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_22.Children(1).Children.Text\n#. /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_22.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_22.Children(1).Children.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Save them!\"\nmsgstr \"救救他們！\"\n\n#. Key:\t42395E7B4B735458E30557B9544073E3\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_8.Children(1).Children.Text\n#. /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_8.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_8.Children(1).Children.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Leave\"\nmsgstr \"離開\"\n\n#. Key:\t43A5BAA8417D3291E502AD9500873B9E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_12.Text\n#. /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Rumours have been spread of Ruin and the people are scared. They demand the Wizard Council to separate the Human Realm from the Ruined Realm.\"\nmsgstr \"謠言四起，人們都害怕了。他們要求巫師協會將人類王國與毀滅王國分開。\"\n\n#. Key:\t4FAAEE6240849C416541EDA8AB8083C8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_30.Text\n#. /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_30.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_30.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Good luck, Raven!\"\nmsgstr \"祝好運，烏鴉！\"\n\n#. Key:\t559673484F3C66AADE37E787BA35824A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_33.Text\n#. /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_33.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_33.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Only a fool would bring Ruin to his own World.\"\nmsgstr \"只有傻瓜才會給自己的世界帶來毀滅。\"\n\n#. Key:\t568124F448BE3AF41123A0B7BB158A53\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_1.Text\n#. /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Krrrr! Raven and you make a really good team.\"\nmsgstr \"妳和烏鴉搭配默契。\"\n\n#. Key:\t5853B8654DBD91894792DE803DE87271\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_27.Text\n#. /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_27.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_27.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"You bring back the artefacts to rescue Lillian.\"\nmsgstr \"妳帶著這些工藝品去救莉莉安。\"\n\n#. Key:\t5D71DA8F4134A1AA206F15B7587AA188\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_15.Children(0).Children.Text\n#. /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_15.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_15.Children(0).Children.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Break in?\"\nmsgstr \"硬闖？\"\n\n#. Key:\t6234A9A34854A37E0CA56987FDE81F5A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_26.Children(1).Children.Text\n#. /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_26.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_26.Children(1).Children.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"You are right\"\nmsgstr \"妳是對的\"\n\n#. Key:\t6B07C6F34DF51DFA23A4278FCBECF303\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_19.Text\n#. /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"What it will do?\"\nmsgstr \"它會做什麽?\"\n\n#. Key:\t6E5A51A34AB81094924512B92F25F41C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_32.Text\n#. /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_32.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_32.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"You are trying to rescue a bunch of mad people so that they can live a few more years with the cost of destroying one more Realm.\"\nmsgstr \"妳試圖拯救壹群瘋狂的人，這樣他們就可以多活幾年，付出摧毀另壹個王國的代價。\"\n\n#. Key:\t70514624400617999FA05FAFAE67D60F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_9.Text\n#. /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"What happened in the Human Realm?\"\nmsgstr \"人類王國發生了什麽?\"\n\n#. Key:\t71C42D6445782897EAF303BFA2C5C260\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_17.Text\n#. /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"What will you do? What’s your part in this?\"\nmsgstr \"妳會怎麽做?  妳幹了什麽?\"\n\n#. Key:\t728B75824B28856156D207B71017C714\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_8.Text\n#. /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Things are changing in the Human Realm and Raven has many things to do.\"\nmsgstr \"人類王國正在經歷變化，烏鴉有很多事情要做。\"\n\n#. Key:\t7826765F45BE76393F3636B79BBC24C0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_24.Text\n#. /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_24.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_24.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"You are right. We need to save them. What’s the plan?\"\nmsgstr \"妳是對的。我們需要拯救他們。有什麽計劃嗎?\"\n\n#. Key:\t866DA22D46D855A200BB7F9E71788367\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_22.Children(0).Children.Text\n#. Key:\tBA0DEBA04BF5C604A2B760B8275E2983\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_23.Text\n#. /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_22.Children(0).Children.Text\n#. /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_23.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_22.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_23.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Is that safe?\"\nmsgstr \"是安全的嗎?\"\n\n#. Key:\t86E69EA04F489DC54B48BEBE8B3762BF\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_1.Children(0).Children.Text\n#. /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_1.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_1.Children(0).Children.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Agree\"\nmsgstr \"同意\"\n\n#. Key:\t8D543992469624098751EAA474848F8C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_21.Text\n#. /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Soon the Ruined Realm will be over. We cannot save it.\"\nmsgstr \"很快，這個毀滅王國就要結束了。我們無法拯救它。\"\n\n#. Key:\t943679734061A00F4CC99A8BC31078EA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_18.Text\n#. /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Wizard won’t activate the device for them but some of them are fools enough to try it anyway.\"\nmsgstr \"巫師不會為他們激活設備，但他們中的壹些人足夠愚蠢去嘗試它。\"\n\n#. Key:\t978AEC8B45AC7E6ED3E814AB849CF96A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_6.Text\n#. /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"So, what now?\"\nmsgstr \"所以, 現在該做什麽?\"\n\n#. Key:\t99250A3F4973EBFB5A20A192DF8976AA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_13.Text\n#. /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"With every day more and more people join their ranks.\"\nmsgstr \"每天都有越來越多的人加入他們的行列。\"\n\n#. Key:\t9D81AC2C4900D6DDA6B17CAD7168020C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_31.Text\n#. /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_31.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_31.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Farewell, compeer!\"\nmsgstr \"再見，小夥伴！\"\n\n#. Key:\tA5F24B3747918DB1E38CB98208FD6B1B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_35.Text\n#. /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_35.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_35.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Or maybe you are wrong.\"\nmsgstr \"也許妳錯了。\"\n\n#. Key:\tB0ECBFAF4E34AEDE88F1B7B7C7F7CC5B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_8.Children(0).Children.Text\n#. /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_8.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_8.Children(0).Children.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"What happened?\"\nmsgstr \"自私了？\"\n\n#. Key:\tB1D891BF48298C5D4CF7D8957EACDD1B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_28.Text\n#. /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Raven will gather as many survivors as Raven can.\"\nmsgstr \"烏鴉會盡可能多地聚集幸存者。\"\n\n#. Key:\tB6CF3E424BAEA6EE368D508EEFDD5FF1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_36.Text\n#. /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_36.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_36.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Farewell compeer! Raven will be on a quest on Raven’s own!\"\nmsgstr \"告別小夥伴！烏鴉將獨自完成壹個任務！\"\n\n#. Key:\tB87509FF4D29C2B3D25CCEB192090963\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_16.Text\n#. /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"What happens if they break in?\"\nmsgstr \"如果他們闖入會發生什麽?\"\n\n#. Key:\tB89F014644B8D3E1754B1B8C796D5858\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_1.Children(1).Children.Text\n#. /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_1.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_1.Children(1).Children.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Disagree\"\nmsgstr \"不同意\"\n\n#. Key:\tBA14AAD54C3D4F7CF18F5D8560A62637\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_20.Text\n#. /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Nothing good...\"\nmsgstr \"沒有什麽好…\"\n\n#. Key:\tC2E50DCB4E1171342DD931910E42549E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_37.Text\n#. /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_37.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_37.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Farewell!\"\nmsgstr \"告辭！\"\n\n#. Key:\tC3B19DAF4C0B491D9236CD99FD7DD603\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_3.Text\n#. /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Except when you kill me with a laser beam.\"\nmsgstr \"除非妳用激光束殺了我。\"\n\n#. Key:\tCBDDFBD14121FE1758B360A1775F2169\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_11.Text\n#. /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Farewell compeer until you meet Raven again!\"\nmsgstr \"再見，小夥伴!\"\n\n#. Key:\tCD19E0924BB1080025ABA19860F578CE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_14.Text\n#. /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Somehow they know about the device the Wizard created. They surrounded the Wizard’s tower. Some even tried to break in.\"\nmsgstr \"不知何故，他們獲悉了巫師創建的裝置。然後他們包圍了巫師塔。有些人甚至試圖闖入。\"\n\n#. Key:\tD54470AA424038F96824FC805AE3F0EE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_25.Text\n#. /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_25.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_25.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Krrr! For them it’s much safer than staying here when the World is over.\"\nmsgstr \"呃！對他們來說，這比世界末日時呆在這裏安全多了。\"\n\n#. Key:\tD99400D94457B6779DE59DB94FDBF9D1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_15.Text\n#. /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"We have really short time to act.\"\nmsgstr \"我們的行動時間真的很短。\"\n\n#. Key:\tDAEF711B41EC4EF72FC271B5AD98A238\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_26.Text\n#. /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_26.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_26.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"There are hundreds of survivors. Races that don’t even exist anywhere else! Who are we if we don’t even try to save them?\"\nmsgstr \"其他地方根本不存在的種族留下了數百名幸存者！如果我們都不試圖去救他們，那我們算什麽人了？\"\n\n#. Key:\tDF872D134C82DFDD3F55F4A6FFF59673\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_5.Text\n#. /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Except...\"\nmsgstr \"除非...\"\n\n#. Key:\tE64B8C0048D2D3357B74CD8D7C1B5407\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_34.Text\n#. /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_34.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_34.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"You sound like that Monk, don’t you? Maybe you are right.\"\nmsgstr \"妳聽起來就像那個修道士。 也許妳是對的。\"\n\n#. Key:\tEA01FB8248A5F30CF9D95AA292D5466A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_4.Text\n#. /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"No problem.\"\nmsgstr \"沒問題。\"\n\n#. Key:\tF1193DA54FBB289383D56F952818E67E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_22.Text\n#. /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Raven’s master decided we need to gather every survivor and take them into the Human Realm.\"\nmsgstr \"烏鴉的主人決定我們要把所有的幸存者都集中起來，把他們帶到人類王國。\"\n\n#. Key:\tF19792CF477CD543AC05FCBEDA3EA88C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_15.Children(1).Children.Text\n#. /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_15.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_15.Children(1).Children.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"To act?\"\nmsgstr \"采取行動？\"\n\n#. Key:\tF606FBDF4B7F3DFF9A55BE9CDB186CAC\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_10.Text\n#. /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Farewell then!\"\nmsgstr \"告辭！\"\n\n#. Key:\tF8FA36BF4E3A4C028FBAF0A2AA531AA4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_7.Text\n#. /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"You need to go on alone.\"\nmsgstr \"妳得壹個人去。\"\n\n#. Key:\tFA02BBA74B601254CDA90A9300AD312F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_29.Text\n#. /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_29.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_29.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"If all goes well you will meet Raven on the other side.\"\nmsgstr \"如果壹切順利，妳會在另壹邊遇到烏鴉。\"\n\n#. Key:\tFA630952402B081C2D449DA3C091F33E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_2.Text\n#. /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter3/C3Raven2.C3Raven2:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_C3Raven2\"\nmsgid \"Yes, we did well. Thanks for the help!\"\nmsgstr \"是的，我們做得很好。謝謝妳的幫助！\"\n\n#. Key:\t63338A0644CC3AE62BCC10B56EAAD524\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3SewerCreature.C3SewerCreature:DlgNode_Speech_1.Text\n#. /Game/SO/Dialogues/Chapter3/C3SewerCreature.C3SewerCreature:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter3/C3SewerCreature.C3SewerCreature:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_C3SewerCreature\"\nmsgid \"Fear not, everything will be alright!\"\nmsgstr \"不要害怕，壹切都會好起來的！\"\n\n#. Key:\t2C1EC209404316CE23DC67B6E91AC661\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Statue.C3Statue:DlgNode_Speech_2.Text\n#. /Game/SO/Dialogues/Chapter3/C3Statue.C3Statue:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter3/C3Statue.C3Statue:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_C3Statue\"\nmsgid \"Are you ready?\"\nmsgstr \"妳準備好了嗎？\"\n\n#. Key:\t33B337C9455FC32BF5C3C69F58843673\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Statue.C3Statue:DlgNode_Speech_3.Text\n#. /Game/SO/Dialogues/Chapter3/C3Statue.C3Statue:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Chapter3/C3Statue.C3Statue:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_C3Statue\"\nmsgid \"Will you release me once I get into your tower?\"\nmsgstr \"我壹進入妳的塔妳就放了我嗎?\"\n\n#. Key:\t4A8AD3EC428307141BD011B66448A7E5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Statue.C3Statue:DlgNode_Speech_2.Children(0).Children.Text\n#. /Game/SO/Dialogues/Chapter3/C3Statue.C3Statue:DlgNode_Speech_2.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Statue.C3Statue:DlgNode_Speech_2.Children(0).Children.Text\nmsgctxt \"Dialogue_C3Statue\"\nmsgid \"Ready\"\nmsgstr \"準備\"\n\n#. Key:\t9C5B29DF4784913DFF166BAD07AC1219\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Statue.C3Statue:DlgNode_Speech_7.Text\n#. /Game/SO/Dialogues/Chapter3/C3Statue.C3Statue:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Chapter3/C3Statue.C3Statue:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_C3Statue\"\nmsgid \"Hurry! We don’t have much time.\"\nmsgstr \"快點! 我們沒有多少時間。\"\n\n#. Key:\tB640545F41315B4C142083A2DB12A132\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Statue.C3Statue:DlgNode_Speech_4.Text\n#. /Game/SO/Dialogues/Chapter3/C3Statue.C3Statue:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Chapter3/C3Statue.C3Statue:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_C3Statue\"\nmsgid \"Sure, we made a deal.\"\nmsgstr \"當然，我們做了個交易。\"\n\n#. Key:\tC4EC98FC40F0181F5AFA60B4DFEF2D16\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Statue.C3Statue:DlgNode_Speech_6.Text\n#. /Game/SO/Dialogues/Chapter3/C3Statue.C3Statue:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Chapter3/C3Statue.C3Statue:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_C3Statue\"\nmsgid \"Not yet. I’ll be back...\"\nmsgstr \"還沒有。我會回來的……\"\n\n#. Key:\tCD542C81498F713774D43AB6EF126E32\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Statue.C3Statue:DlgNode_Speech_1.Text\n#. /Game/SO/Dialogues/Chapter3/C3Statue.C3Statue:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter3/C3Statue.C3Statue:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_C3Statue\"\nmsgid \"Well done! From here I can take you to my tower.\"\nmsgstr \"做得好! 從這裏我可以帶妳去我的塔。\"\n\n#. Key:\tF982C80748C46B117906F094608B7E2C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Statue.C3Statue:DlgNode_Speech_2.Children(1).Children.Text\n#. /Game/SO/Dialogues/Chapter3/C3Statue.C3Statue:DlgNode_Speech_2.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter3/C3Statue.C3Statue:DlgNode_Speech_2.Children(1).Children.Text\nmsgctxt \"Dialogue_C3Statue\"\nmsgid \"Stay\"\nmsgstr \"停留\"\n\n#. Key:\tFE6723D8452B497B07504EA753F02F35\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Statue.C3Statue:DlgNode_Speech_5.Text\n#. /Game/SO/Dialogues/Chapter3/C3Statue.C3Statue:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Chapter3/C3Statue.C3Statue:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_C3Statue\"\nmsgid \"Let’s go then!\"\nmsgstr \"走吧！\"\n\n#. Key:\t7C2DF1BE46E7672A1C7092A330030B39\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3SupperDwarf.C3SupperDwarf:DlgNode_Speech_1.Text\n#. /Game/SO/Dialogues/Chapter3/C3SupperDwarf.C3SupperDwarf:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter3/C3SupperDwarf.C3SupperDwarf:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_C3SupperDwarf\"\nmsgid \"Otherwise I would rather stay here.\"\nmsgstr \"否則我寧願呆在這裏。\"\n\n#. Key:\tFEB0911A412AF51088EC6A84D0FC7B3C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3SupperDwarf.C3SupperDwarf:DlgNode_Speech_80.Text\n#. /Game/SO/Dialogues/Chapter3/C3SupperDwarf.C3SupperDwarf:DlgNode_Speech_80.Text\n#: /Game/SO/Dialogues/Chapter3/C3SupperDwarf.C3SupperDwarf:DlgNode_Speech_80.Text\nmsgctxt \"Dialogue_C3SupperDwarf\"\nmsgid \"I hope there is some delicious food in the Human Realm.\"\nmsgstr \"我希望人類王國不缺美味的食物。\"\n\n#. Key:\t360852FB41FBC269468577878A0CC719\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_9.Text\n#. /Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_C3Teachy\"\nmsgid \"Don’t say it, I know. I’m genius.\"\nmsgstr \"不用說，我知道。我是天才。\"\n\n#. Key:\t39008A1943A63D4050295B9C508DF4CE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_5.Text\n#. /Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_C3Teachy\"\nmsgid \"He asked me to prove that I am worthy.\"\nmsgstr \"他要我證明我的價值。\"\n\n#. Key:\t5D3A77994D763C95F5655CAC4F228452\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_19.Text\n#. /Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_C3Teachy\"\nmsgid \"Oh, the walking ball again!\"\nmsgstr \"哦，又是個會走路的球！\"\n\n#. Key:\t74789A0946246082325FCDB2600CEAA2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_2.Text\n#. /Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_C3Teachy\"\nmsgid \"I haven’t seen you since you left me there with that Keeper.\"\nmsgstr \"自從妳把我和那個守護者留在那裏後，我就沒見過妳。\"\n\n#. Key:\t81A13B9645C14341A7FA45BC7482AB58\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_1.Text\n#. /Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_C3Teachy\"\nmsgid \"I'm not sure if it still matters but here is the Weird Device I found in the hideout of the Secret Science Society.\"\nmsgstr \"我不確定它是否仍然重要，但這是我在秘密科學協會的藏身之處發現的奇怪裝置。\"\n\n#. Key:\t8E2355CF4A1F7CCF4AF0FA8D95E2F503\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_8.Text\n#. /Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_C3Teachy\"\nmsgid \"After reordering the right side I got the final result:\\r\\n\\r\\nTEACHY = WORTHY\"\nmsgstr \"在右邊重新排序後，我得到了最終的結果:\\r\\n\\r\\n老師 = 價值\"\n\n#. Key:\tA46C8D2749791CE910856BA8887272EB\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_14.Text\n#. /Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_C3Teachy\"\nmsgid \"That is amazing! Thank you, my globular friend! Take these coins, I am sure you will enjoy spending them... if you still can.\"\nmsgstr \"太棒了！謝謝妳，我的球形朋友! 把這些硬幣拿去，我相信妳會樂意把它們花出去的…… 如果妳還能夠這麽做的話。\"\n\n#. Key:\tBFA75D71419A3B5615D65980F9A2FC0E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_4.Text\n#. /Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_C3Teachy\"\nmsgid \"Well, alright, I’ll tell.\"\nmsgstr \"好吧，我告訴妳。\"\n\n#. Key:\tC09FB7394571D19280D0B68572C6DCBB\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_3.Text\n#. /Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_C3Teachy\"\nmsgid \"I bet you wonder how did I get out.\"\nmsgstr \"我打賭妳想知道我是怎麽得出這個結論的。\"\n\n#. Key:\tCC72AAE64CE58AECB367B0B2565A74CC\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_6.Text\n#. /Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_C3Teachy\"\nmsgid \"I made some cups of tea and slowly put them in a row. From that I had this formula:\\r\\n\\r\\nTIME = T\\r\\nCUP = C\\r\\nTEA * C = ROW * T\"\nmsgstr \"我泡了幾杯茶，壹邊品茶壹邊思索。然後得出這個結論:\\r\\n\\r\\n老師 = 知識\\r\\n知識 = 金錢\\r\\n金錢 = 價值\\r\\n\"\n\n#. Key:\tE907906F4A46886EFBA7F09E459F2663\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_7.Text\n#. /Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Chapter3/C3Teachy.C3Teachy:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_C3Teachy\"\nmsgid \"Then I multiplied by HY, so I get:\\r\\n\\r\\nTEACHY = ROWTHY\"\nmsgstr \"\\r\\n所以，老師 = 價值\"\n\n#. Key:\t298F025648B369E90753DA8D882DFDDB\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/DwarvenCatacombs/DCDictionary.DCDictionary:DlgNode_Speech_6.Text\n#. /Game/SO/Dialogues/Wizard/DwarvenCatacombs/DCDictionary.DCDictionary:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Wizard/DwarvenCatacombs/DCDictionary.DCDictionary:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_DCDictionary\"\nmsgid \"Finally! A dictionary!\"\nmsgstr \"無懈可擊！\"\n\n#. Key:\t3D4CF9424B28083560A64D8FA1232E9F\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/DwarvenCatacombs/DCDictionary.DCDictionary:DlgNode_Speech_5.Text\n#. /Game/SO/Dialogues/Wizard/DwarvenCatacombs/DCDictionary.DCDictionary:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Wizard/DwarvenCatacombs/DCDictionary.DCDictionary:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_DCDictionary\"\nmsgid \"Wake me up when you are ready.\"\nmsgstr \"妳準備好了就叫醒我。\"\n\n#. Key:\t04B787DD4344DA8AD6B1E0B7925BBDCE\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/DwarvenCatacombs/DCSecretDoor.DCSecretDoor:DlgNode_Speech_2.Text\n#. /Game/SO/Dialogues/Wizard/DwarvenCatacombs/DCSecretDoor.DCSecretDoor:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Wizard/DwarvenCatacombs/DCSecretDoor.DCSecretDoor:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_DCSecretDoor\"\nmsgid \"There is a hidden Dwarven Door somewhere around here.\"\nmsgstr \"這附近有個隱藏的地精之門。\"\n\n#. Key:\t4412DD54423A17AF3BFBA89BAF42664D\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/DwarvenCatacombs/DCSecretDoor.DCSecretDoor:DlgNode_Speech_5.Text\n#. /Game/SO/Dialogues/Wizard/DwarvenCatacombs/DCSecretDoor.DCSecretDoor:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Wizard/DwarvenCatacombs/DCSecretDoor.DCSecretDoor:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_DCSecretDoor\"\nmsgid \"Or if you toggle that switch.\"\nmsgstr \"或者妳去撥動那個開關。\"\n\n#. Key:\t5FDA3D2A49BD57C213F0E3869A366B76\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/DwarvenCatacombs/DCSecretDoor.DCSecretDoor:DlgNode_Speech_4.Text\n#. /Game/SO/Dialogues/Wizard/DwarvenCatacombs/DCSecretDoor.DCSecretDoor:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Wizard/DwarvenCatacombs/DCSecretDoor.DCSecretDoor:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_DCSecretDoor\"\nmsgid \"This one can only be revealed on Christmas time if the full moon shines on it.\"\nmsgstr \"這個只有在滿月的時候才能被發現。\"\n\n#. Key:\tCE7E6F5B4DB41F1055EAF1898F17E4EA\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/DwarvenCatacombs/DCSecretDoor.DCSecretDoor:DlgNode_Speech_3.Text\n#. /Game/SO/Dialogues/Wizard/DwarvenCatacombs/DCSecretDoor.DCSecretDoor:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Wizard/DwarvenCatacombs/DCSecretDoor.DCSecretDoor:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_DCSecretDoor\"\nmsgid \"Dwarfs are fond of these. They can't be seen if you don't know their trick.\"\nmsgstr \"矮人喜歡這些。如果妳不知道他們的把戲，妳就看不見他們。\"\n\n#. Key:\t03067C1041952ECAC7D529AF2CC2ABEE\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_12.Text\n#. /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_DemonLillian\"\nmsgid \"Who you just killed...\"\nmsgstr \"就妳剛剛殺死的…\"\n\n#. Key:\t06C4895B4BA9C2F71F3007B00A680CFB\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_13.Text\n#. /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_DemonLillian\"\nmsgid \"I'm free without any bounds! I'm human!\"\nmsgstr \"我是自由的，沒有任何束縛! 我是人類!\"\n\n#. Key:\t0E5418EA4828B840886434A250967CBE\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_11.Text\n#. /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_DemonLillian\"\nmsgid \"You liar! I'm the daughter of the Wizard!\"\nmsgstr \"妳說謊! 我是巫師的女兒!\"\n\n#. Key:\t15ED5E554FBF25A72BB12FA81F4076FF\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_5.Text\n#. /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_DemonLillian\"\nmsgid \"Sister? What makes you say that?\"\nmsgstr \"姐姐? 妳為什麽這麽說?\"\n\n#. Key:\t2B375C424D4561D651214BA0F10CDB44\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_9.Text\n#. /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_DemonLillian\"\nmsgid \"Siblings? What makes you say that?\"\nmsgstr \"姐妹? 妳為什麽這麽說?\"\n\n#. Key:\t2F0A5F3442ACF917A0515892B0639541\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_2.Children(1).Children.Text\n#. /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_2.Children(1).Children.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_2.Children(1).Children.Text\nmsgctxt \"Dialogue_DemonLillian\"\nmsgid \"Just passing\"\nmsgstr \"只是路過\"\n\n#. Key:\t36A3340F4333184F42874F88F23A710D\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_1.Text\n#. /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_DemonLillian\"\nmsgid \"What are you doing here little toy?\"\nmsgstr \"妳在這裏做什麽，小不點玩具?\"\n\n#. Key:\t46C7EE464B94BCE5D8CE6DB96299A583\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_17.Text\n#. /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_DemonLillian\"\nmsgid \"You are nonsense.\"\nmsgstr \"妳是廢物。\"\n\n#. Key:\t732777EC4B213BC797E24FBBC478D39F\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_10.Text\n#. /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_DemonLillian\"\nmsgid \"You are a Spirit of the Unknown bound to this body by magic. Just like me.\"\nmsgstr \"妳是壹個無名幽魂，被魔法束縛在這個身體上。就像我壹樣。\"\n\n#. Key:\t819738554E1DD3694F3D0699221E6932\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_4.Text\n#. /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_DemonLillian\"\nmsgid \"I'm just err... maybe we could play seek and hide?\"\nmsgstr \"我只是…… 呃，也許我們可以玩捉迷藏?\"\n\n#. Key:\tA02291F444C7907190F1D3AC78E5EAF0\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_2.Children(0).Children.Text\n#. /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_2.Children(0).Children.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_2.Children(0).Children.Text\nmsgctxt \"Dialogue_DemonLillian\"\nmsgid \"I'll stop you!\"\nmsgstr \"我要阻止妳!\"\n\n#. Key:\tA94658F148628400E971CD925A6B8713\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_14.Text\n#. /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_DemonLillian\"\nmsgid \"Shaped like a human...\"\nmsgstr \"像壹個人形...\"\n\n#. Key:\tBBBDA8B843BF5549EF4052894D9BB630\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_8.Text\n#. /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_DemonLillian\"\nmsgid \"We are siblings right? You will surely let me pass...\"\nmsgstr \"我們是兄弟姐妹，對吧? 妳壹定會讓我通過……\"\n\n#. Key:\tBF79A92B406E287D767E7799D78FCFD4\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_6.Text\n#. /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_DemonLillian\"\nmsgid \"That sounds funny!\"\nmsgstr \"聽起來很有趣！\"\n\n#. Key:\tC6609DA7417A4DBC86F9809CE994E8BA\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_16.Text\n#. /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_DemonLillian\"\nmsgid \"I'm power, I'm god!\"\nmsgstr \"我是無上的力量，我是神！\"\n\n#. Key:\tDD2EF1594AFD2B0C38845C9E36089B95\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_7.Text\n#. /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_DemonLillian\"\nmsgid \"I've found you!\"\nmsgstr \"我找到妳了！\"\n\n#. Key:\tDD2F3A7048614E74B3A343BA474D8E49\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_3.Text\n#. /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_DemonLillian\"\nmsgid \"I've come to stop you sister. The World is not your playground!\"\nmsgstr \"我是來阻止妳的，小姐妹。世界不是妳的遊樂場!\"\n\n#. Key:\tE7FA21A04757D1EF04AE41AF4A13025A\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_2.Text\n#. /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_DemonLillian\"\nmsgid \"I'm bored! Have you come to play with me?\"\nmsgstr \"我很無聊！妳是來和我玩的嗎?\"\n\n#. Key:\tFF05E84E4027C75294BAF4A589EEF6F9\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_15.Text\n#. /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillian.DemonLillian:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_DemonLillian\"\nmsgid \"I can create, I can destroy!\"\nmsgstr \"我可以創造，也可以毀滅！\"\n\n#. Key:\t025193144996A7024A7CF791B5A25EB7\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillianDefeated.DemonLillianDefeated:DlgNode_Speech_4.Text\n#. /Game/SO/Dialogues/Ending/E1/DemonLillianDefeated.DemonLillianDefeated:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillianDefeated.DemonLillianDefeated:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_DemonLillianDefeated\"\nmsgid \"What are you doing? Keep your hands away from me!\"\nmsgstr \"妳在幹什麽? 把妳的手拿開！\"\n\n#. Key:\t2E05897C454C5C33BD76A6A4371A545C\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillianDefeated.DemonLillianDefeated:DlgNode_Speech_1.Text\n#. /Game/SO/Dialogues/Ending/E1/DemonLillianDefeated.DemonLillianDefeated:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillianDefeated.DemonLillianDefeated:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_DemonLillianDefeated\"\nmsgid \"I don't want to play anymore!\"\nmsgstr \"我不想再玩了！\"\n\n#. Key:\t77A82F8943F323744F9389BF22A80FDF\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillianDefeated.DemonLillianDefeated:DlgNode_Speech_8.Text\n#. /Game/SO/Dialogues/Ending/E1/DemonLillianDefeated.DemonLillianDefeated:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillianDefeated.DemonLillianDefeated:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_DemonLillianDefeated\"\nmsgid \"Farewell Spirit!\"\nmsgstr \"再見了，小精靈！\"\n\n#. Key:\t7831CD44458112E37918DF9082278603\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillianDefeated.DemonLillianDefeated:DlgNode_Speech_2.Text\n#. /Game/SO/Dialogues/Ending/E1/DemonLillianDefeated.DemonLillianDefeated:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillianDefeated.DemonLillianDefeated:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_DemonLillianDefeated\"\nmsgid \"Leave me alone!\"\nmsgstr \"讓我靜靜！\"\n\n#. Key:\t79E4053F4B8A1AFE74064BA77037F13E\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillianDefeated.DemonLillianDefeated:DlgNode_Speech_6.Text\n#. /Game/SO/Dialogues/Ending/E1/DemonLillianDefeated.DemonLillianDefeated:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillianDefeated.DemonLillianDefeated:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_DemonLillianDefeated\"\nmsgid \"I am his daughter. And this body is mine.\"\nmsgstr \"我是他的女兒。這個身體是我的。\"\n\n#. Key:\t96BD08904BC50C912055C0977281D10F\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillianDefeated.DemonLillianDefeated:DlgNode_Speech_3.Text\n#. /Game/SO/Dialogues/Ending/E1/DemonLillianDefeated.DemonLillianDefeated:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillianDefeated.DemonLillianDefeated:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_DemonLillianDefeated\"\nmsgid \"I know this body...\"\nmsgstr \"我知道這個身體...\"\n\n#. Key:\tA5634D7D4613C578AB85E48B2DBD422B\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillianDefeated.DemonLillianDefeated:DlgNode_Speech_7.Text\n#. /Game/SO/Dialogues/Ending/E1/DemonLillianDefeated.DemonLillianDefeated:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillianDefeated.DemonLillianDefeated:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_DemonLillianDefeated\"\nmsgid \"Away!\"\nmsgstr \"閃開！\"\n\n#. Key:\tE09248B24E34823DDE71BAB68183AD2D\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/DemonLillianDefeated.DemonLillianDefeated:DlgNode_Speech_5.Text\n#. /Game/SO/Dialogues/Ending/E1/DemonLillianDefeated.DemonLillianDefeated:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Ending/E1/DemonLillianDefeated.DemonLillianDefeated:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_DemonLillianDefeated\"\nmsgid \"They were wrong all along.\"\nmsgstr \"他們壹直都錯了。\"\n\n#. Key:\t01C1D7AF4D8D7B3D628A089E38471479\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_74.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_74.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_74.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Thank you! Take this as reward.\"\nmsgstr \"謝謝妳！這是獎勵。\"\n\n#. Key:\t034DDD8F467E3B6E6A70CFBC1FA81D21\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_94.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_94.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_94.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Look what I have found for you!\"\nmsgstr \"看看我為妳找到了什麽!\"\n\n#. Key:\t046279EA4D7E44826F537DA0869C13DD\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_114.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_114.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_114.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"They are somewhere around.\"\nmsgstr \"他們就在附近。\"\n\n#. Key:\t055FD02047EB0145285C8BB0B7A23F0A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_17.Children(0).Children.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_17.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_17.Children(0).Children.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"They fight Ruin\"\nmsgstr \"他們與毀滅戰鬥\"\n\n#. Key:\t07684DB1418378D59D3741AE19AB22C1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(9).Children.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(9).Children.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(9).Children.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Golems destroyed\"\nmsgstr \"機器人被摧毀\"\n\n#. Key:\t0D548F74416A5C1D8220869DC707A575\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_127.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_127.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_127.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Even if he couldn't be what I wanted him to be, he was my greatest creation ever.\"\nmsgstr \"即使他不能成為我希望他成為的人，他也是我最偉大的創造。\"\n\n#. Key:\t0E3082704C6E4BA14C554DA5B4306C88\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_8.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Could you merge these copper pieces?\"\nmsgstr \"妳能把這些銅片合並起來嗎?\"\n\n#. Key:\t103CB0C84AEA077F78347A92E6389F32\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_10.Children(0).Children.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_10.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_10.Children(0).Children.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Don't know\"\nmsgstr \"不知道\"\n\n#. Key:\t12C814BB44D434DFC5C35C882B4BF0DB\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_116.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_116.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_116.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Be aware of the Armour Wrath.\"\nmsgstr \"小心鎧甲之怒\"\n\n#. Key:\t14E2589C4CC2C6C77D37A5B50C61C266\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_2.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Could you merge these bronze pieces?\"\nmsgstr \"妳能把這些青銅碎片合並起來嗎?\"\n\n#. Key:\t1770D8FE480B8C028F9ED989E22CF315\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_3.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"You are not one of my new creations. Yet not one of the ancients.\"\nmsgstr \"妳不是我的新創造物，也不屬於古老的那批。\"\n\n#. Key:\t1C02E8BB400B379858A402B9621B68D6\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_129.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_129.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_129.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Take care!\"\nmsgstr \"小心！\"\n\n#. Key:\t1CDE0CFA4DBF3794096E099B58726BD8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_36.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_36.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_36.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Nothing else matters.\"\nmsgstr \"其它都無所謂\"\n\n#. Key:\t1FA243424440B0810651C79BD207FC2D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_33.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_33.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_33.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Too many spirits. They break loose. They couldn’t exist in our Realm. They formed Ruin.\"\nmsgstr \"太多的精靈，他們掙脫。他們不可能存在於我們的王國。他們生成了毀滅。\"\n\n#. Key:\t1FFE46404FBD26325B1348BF7A2935A7\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_92.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_92.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_92.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Oh, thank you! It also gives back some of my lost knowledge.\"\nmsgstr \"噢, 謝謝妳！它也讓我找回壹些失去的知識。\"\n\n#. Key:\t2084B3DE4CDAC5B7B9018994EE4DFAA4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_85.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_85.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_85.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"The end is close, yet knowing what I am makes my last days brighter.\"\nmsgstr \"終點已近，但知道自己是什麽，會讓我最後的日子更加光明。\"\n\n#. Key:\t21883D3E4563FD95B13E8E8E25FB1D92\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_15.Children(0).Children.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_15.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_15.Children(0).Children.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Not my business\"\nmsgstr \"不關我事\"\n\n#. Key:\t2362D7ED44CEEE8592C72BB41ECC0CC0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_77.Text\n#. Key:\t969AF9184296C419E484BA80FF80F15B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_76.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_77.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_76.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_76.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_77.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Do you know a girl called Lillian?\"\nmsgstr \"妳認識壹個叫莉莉安的女孩嗎？\"\n\n#. Key:\t2362FF25427C7C664ACE9297A20F3C65\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_81.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_81.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_81.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Memory Crystals? Can I touch them?\"\nmsgstr \"記憶水晶? 我能摸壹下嗎?\"\n\n#. Key:\t254431B64533FAD362B0AF93F8347842\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_119.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_119.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_119.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"You will find it if you reach the top of the Main Tower.\"\nmsgstr \"如果妳到達主塔的頂端，妳就會找到它。\"\n\n#. Key:\t26664D3045EDCEC9C09E9CBA8515C088\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_11.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I don't know... I'm forced to do tasks for a wizard. I'm lost and confused.\"\nmsgstr \"我不知道…  我被迫為壹個巫師做任務。我迷茫了。\"\n\n#. Key:\t280BE2914A227E7350F067BCB4CC49AD\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_86.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_86.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_86.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Hmmm...\"\nmsgstr \"嗯...\"\n\n#. Key:\t2B714CED45A868B1678C5E854160945E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_97.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_97.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_97.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Look, I have more crystals.\"\nmsgstr \"看，我有更多的水晶。\"\n\n#. Key:\t2C052328496E84667F356F95F9F9C418\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_18.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"This is really not my problem. All I care about is to complete my task and go on my way.\"\nmsgstr \"這不是我的問題。我所關心的只是完成我的任務，繼續我的路。\"\n\n#. Key:\t2C174523477E6720A5300DBFE343C3D8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_51.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_51.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_51.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I can no longer open a gate to the Unknown Realm.\"\nmsgstr \"我再也無法打開通往未知王國的大門。\"\n\n#. Key:\t2C7D234B4F377087E1D340986BD581AC\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_49.Text\n#. Key:\t417BB4E644EBC809C2489F85993A8E17\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_56.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_49.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_56.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_49.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_56.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"If you can summon Spirits you surely know a way to get me home.\"\nmsgstr \"如果妳能召喚靈魂，妳壹定知道帶我回家的路。\"\n\n#. Key:\t2DE200934F6AC1595216AA8050FF8F30\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_67.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_67.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_67.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I won’t work with anything else.\"\nmsgstr \"我不會用其他的東西。\"\n\n#. Key:\t2FC050C145CB19BD786157988C677AF5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(1).Children.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(1).Children.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Bronze key\"\nmsgstr \"青銅鑰匙\"\n\n#. Key:\t30AD4CBE4D6EFD170F43D9852A0CB50C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_108.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_108.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_108.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I can’t remember.\"\nmsgstr \"我記不起來了。\"\n\n#. Key:\t310B95624A8B2179F69A68BE2B0869C2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(4).Children.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(4).Children.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(4).Children.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Making Golems?\"\nmsgstr \"制造機器人？\"\n\n#. Key:\t311039514F83A0ED4BE47A98BF5AE48E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_107.Text\n#. Key:\t5D08D2404686BF1E5D48AC8C63096F0D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_104.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_107.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_104.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_104.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_107.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Thank you Spirit! I will be forever in your debt.\"\nmsgstr \"謝謝妳，小精靈！感激不盡。\"\n\n#. Key:\t3140425845B595B02CA8D3B8DBC6CE37\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_38.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_38.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_38.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"It's done. They are destroyed.\"\nmsgstr \"搞定了。他們被摧毀了。\"\n\n#. Key:\t37835C204E4C4B17F2D55C9B23FD7D1E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_45.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_45.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_45.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"There is some kind of a connection between Ruin and the Spirits.\"\nmsgstr \"在毀滅和靈魂之間有某種聯系。\"\n\n#. Key:\t384F5CB146C9B6E7EFD361964FF11735\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_12.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"A spirit of the Unknown was summoned here by a Wizard of another world.\"\nmsgstr \"壹個來自另壹個世界的巫師在這裏召喚了壹種無名幽魂。\"\n\n#. Key:\t398124A4493A7325B284CA8105354F0C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_35.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_35.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_35.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Yet now the only important thing is to finish my golems.\"\nmsgstr \"現在唯壹重要的事情就是完成我的機器人。\"\n\n#. Key:\t39C014784CA9DF8247D2DDA5587BAB20\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(5).Children.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(5).Children.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(5).Children.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Get me home!\"\nmsgstr \"讓我回家！\"\n\n#. Key:\t3CE0431346C222ED2A6729AAEF8026DC\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(6).Children.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(6).Children.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(6).Children.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"New body for me\"\nmsgstr \"給我的新軀體\"\n\n#. Key:\t3DFB1F4D4BB673F983C8CDA4E9911BF2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_89.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_89.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_89.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Wait a minute! I’ll make something special for you.\"\nmsgstr \"等壹下！我給妳做點特別的。\"\n\n#. Key:\t3F7C1850478A14857F4FFD9D41BA39FC\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_87.Text\n#. Key:\t79079CCD4BB2C6244D6D7CB04BD4C42F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_84.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_87.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_84.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_84.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_87.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Yes, now I remember. Thank you little Spirit for giving my memories back.\"\nmsgstr \"是的，現在我想起來了。謝謝小精靈把我的回憶還給我。\"\n\n#. Key:\t3FAB7E8D4E72D1EED6E11EA54A128836\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(3).Children.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(3).Children.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(3).Children.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Copper Key\"\nmsgstr \"銅鑰匙\"\n\n#. Key:\t419879C24D39534867F656B704C579AC\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_110.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_110.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_110.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Even without my memories I liked to talk to her.\"\nmsgstr \"即使沒有記憶，我也喜歡和她說話。\"\n\n#. Key:\t41B08BF1417C041EB3ACAE8C09C44872\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_17.Children(1).Children.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_17.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_17.Children(1).Children.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"They will fall\"\nmsgstr \"他們會下墜\"\n\n#. Key:\t41E19A0C420F2BD87AA91AB475D5BB0C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_128.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_128.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_128.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Please, leave me alone now.\"\nmsgstr \"求妳了，離我遠點。\"\n\n#. Key:\t4438EF7A4D77A3314D2B6587DAE664AE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_7.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I can fix it!\"\nmsgstr \"我能修好它！\"\n\n#. Key:\t46730E7C433AE7B987C61D9DDF0161E2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_52.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_52.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_52.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"How do you make Golems then?\"\nmsgstr \"那妳怎麽制造機器人呢？\"\n\n#. Key:\t4816E7D14B256F62C2AFE0A3D5EC1987\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_113.Text\n#. Key:\tEC59F30D402E177B8C137DAA7A834F1A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_112.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_113.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_112.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_112.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_113.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I’m looking for three artefacts. Do you know something about them?\"\nmsgstr \"我在找三件工藝品。妳對它們有什麽了解嗎?\"\n\n#. Key:\t49E3D8B84BD437A7195CB49B1C91A9B7\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_30.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_30.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_30.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"We created too many of them. Always new ones. We forgot about the old ones.\"\nmsgstr \"我們創造了太多太多。新的接踵而來，舊的漸漸淡忘。\"\n\n#. Key:\t4CDF7F734B65BFB6575D66A2E40B64B6\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_17.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"You wonder if Ruin will destroy their World as well...\"\nmsgstr \"妳想知道毀滅是否也會摧毀他們的世界…\"\n\n#. Key:\t4FD5FE974E1B8142471F8896818E875C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"What do you need?\"\nmsgstr \"妳需要什麽？\"\n\n#. Key:\t5000F3F44A899815A0D341A3494E42AB\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_91.Text\n#. Key:\t6D5127FD45C09B33329F0EB0DDCE67D7\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_93.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_91.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_93.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_91.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_93.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Thank you!\"\nmsgstr \"謝謝！\"\n\n#. Key:\t50E6C4434BAC5A7F4B2C66BD8DB5E071\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_100.Text\n#. Key:\t64A5DE6941972506C0BECBB55BBE4FE5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_78.Text\n#. Key:\tB07790474D4C124CB72F128AE0FB2CC5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_95.Text\n#. Key:\tEF125F27496303716206D182C1ED460D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_39.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_100.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_78.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_95.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_39.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_100.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_39.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_78.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_95.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I think these crystals have something to do with you.\"\nmsgstr \"我覺得這些水晶跟妳有點關系。\"\n\n#. Key:\t51C200AD42FCE6888DBF8C8C24A02283\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_9.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"It shall be done.\"\nmsgstr \"必須這樣做。\"\n\n#. Key:\t52D4954E427C666F0F2F4A92F9BCFBC9\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_50.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_50.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_50.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I’m sorry but I can’t help you.\"\nmsgstr \"對不起，我幫不了妳。\"\n\n#. Key:\t5B1327C64C77C05C43CD728356DA4EC4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_58.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_58.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_58.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Knowledge lost. We are lost.\"\nmsgstr \"不僅失去了知識，我們還失去了方向。\"\n\n#. Key:\t5E7AD2034CECCF124DA4E19D94B96433\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_4.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"It's nothing. Here it is.\"\nmsgstr \"沒什麽。在這兒。\"\n\n#. Key:\t5FB1520B447246A1A8BCD3BDDB44D145\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_65.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_65.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_65.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"No.\"\nmsgstr \"不。\"\n\n#. Key:\t5FBF0F3F4419A6AD796054841902FA7C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_28.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"They can't work together even if they share the same goal.\"\nmsgstr \"即使他們有共同的目標，他們也不能壹起工作。\"\n\n#. Key:\t60609E4049562CF11C05CB8DB96BBBB3\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_13.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"What do you mean by 'your creations'?\"\nmsgstr \"妳說的“妳的創造”是什麽意思?\"\n\n#. Key:\t635D5E904325D51DFF19A1A862A3CC0B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_124.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_124.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_124.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"The Armour Wrath is no more.\"\nmsgstr \"鎧甲之怒不復存在。\"\n\n#. Key:\t6585CAC84326A3EEE1682789B7BB3CB6\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_10.Children(2).Children.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_10.Children(2).Children.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_10.Children(2).Children.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Your creation?\"\nmsgstr \"妳的創造？\"\n\n#. Key:\t65C3735740E5D7AF76376AB2B7B05CE9\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(12).Children.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(12).Children.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(12).Children.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Leave\"\nmsgstr \"離開\"\n\n#. Key:\t6A460D4A4751398E004298948D630BA4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_47.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_47.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_47.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I don’t think I will manage though. It’s already too late. But there is no reason to give up either.\"\nmsgstr \"不過我想我應付不了。已經太遲了。但也沒有理由放棄。\"\n\n#. Key:\t6DC280B64766B5CB2049409B2F73CDB4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_40.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_40.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_40.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Is there a way I can help you?\"\nmsgstr \"我能幫妳什麽忙嗎?\"\n\n#. Key:\t6DD3D7804417850FE8504286DD2B5D95\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_96.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_96.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_96.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"More Crystal? That's very kind.\"\nmsgstr \"更多的水晶?  那太好了。\"\n\n#. Key:\t6E9DB27A4207FFA8409F61AE45282D53\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_41.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_41.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_41.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I have found one more crystal.\"\nmsgstr \"我又找到了壹塊水晶。\"\n\n#. Key:\t717452044F194A1C30FA3C8FBB94C9BF\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_73.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_73.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_73.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I’ll see what I can do.\"\nmsgstr \"我看看我能做什麽。\"\n\n#. Key:\t74670AB34D1A75913013BE8EE7C0B961\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_72.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_72.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_72.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I’ve already destroyed them.\"\nmsgstr \"我已經毀了他們。\"\n\n#. Key:\t752F67A54FA433AA588175AA7C64E367\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_43.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_43.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_43.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I try to create the perfect Golem. The one which resists Ruin.\"\nmsgstr \"我試著創造壹個完美的機器人。誰能抵抗毀滅。\"\n\n#. Key:\t775C2189498804DBED7D81AB3EFEC96F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(11).Children.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(11).Children.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(11).Children.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Lillian\"\nmsgstr \"莉莉安\"\n\n#. Key:\t78C78DDD456328181EBCC78B20F9573D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_122.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_122.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_122.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Some of them are still out there.\"\nmsgstr \"他們中的壹些人還在那裏。\"\n\n#. Key:\t7C7D08C340B478A9420331AD355B1FA5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_15.Children(1).Children.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_15.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_15.Children(1).Children.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Like you?\"\nmsgstr \"比如妳？\"\n\n#. Key:\t7DCEFFEC46523960D1453DA93F36CAA5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_111.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_111.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_111.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I don’t know why but I feel in some way you are bound to her.\"\nmsgstr \"我不知道為什麽，但我覺得在某種程度上妳和她是有聯系的。\"\n\n#. Key:\t7F44BD934784D4F3AA2C85985489590A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_14.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"A Wizard? So now the Human Realm's people are messing with Golem Technology.\"\nmsgstr \"壹個巫師？所以現在人類王國的人都在擺弄機器人技術。\"\n\n#. Key:\t80871D9C4CF37B5F2E7101B8A2565D73\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_70.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_70.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_70.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"It’s not safe for me to walk outside.\"\nmsgstr \"我在外面走路不安全。\"\n\n#. Key:\t83ACDDA4415211102DBE099F178B228B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_15.Children(2).Children.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_15.Children(2).Children.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_15.Children(2).Children.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"You mean Ruin\"\nmsgstr \"妳指的是毀滅\"\n\n#. Key:\t86B4FC23463D5507B11C3F826ADF6C7C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_10.Children(1).Children.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_10.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_10.Children(1).Children.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Spirit in a ball\"\nmsgstr \"球中精靈\"\n\n#. Key:\t88A6486843FEC6A2125F79B8AED93F74\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_99.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_99.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_99.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Now there is only a few missing.\"\nmsgstr \"現在只缺幾個了。\"\n\n#. Key:\t8C2169FA47F83CA62B19F083EFC398F5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_26.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_26.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_26.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"That is me. And what are you creature?\"\nmsgstr \"那是我。妳是什麽生物?\"\n\n#. Key:\t8CC8368441F2CCDB0E7B22916F8A0622\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_88.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_88.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_88.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Getting back some of my lost knowledge also makes me feel happy.\"\nmsgstr \"找回壹些失去的知識也讓我感到快樂。\"\n\n#. Key:\t8E3399DA4F904AD46476418817CD78C4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_62.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_62.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_62.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Metal binds the will of the spirits. Rock is a bit less cruel but still weakens your will.\"\nmsgstr \"金屬束縛著靈魂的意誌。巖石沒有那麽殘酷，但仍然會削弱妳的意誌。\"\n\n#. Key:\t8F4BB43A4656EAD257920492E10BC764\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_130.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_130.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_130.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Yes, they bring back some of my memories.\"\nmsgstr \"是的，它們勾起了我的壹些回憶。\"\n\n#. Key:\t8F9DF3254A02EFF2E623DB91935A1529\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_123.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_123.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_123.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Come back when you found all of them.\"\nmsgstr \"找到全部的就回來。\"\n\n#. Key:\t97EE3A1B4AD2EB2E7ED2D1B1427E4A2A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_25.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_25.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_25.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"It's only me trying to recreate the perfect Golem.\"\nmsgstr \"只有我在努力重現完美的機器人。\"\n\n#. Key:\t99BCAE80415145460126B08933AE6242\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_118.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_118.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_118.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"One of the artefacts is close.\"\nmsgstr \"其中壹件工藝品就在附近。\"\n\n#. Key:\t9A05FD0845F9149CEB6EB8889EB9A686\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_19.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"That won't happen.\"\nmsgstr \"不會發生。\"\n\n#. Key:\t9B7BB6624923813EBF68C9BCE9FF8E49\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_5.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"There is nothing else I could say. See you later!\"\nmsgstr \"我已經無話可說了。再見!\"\n\n#. Key:\t9BEA36B448EC18A9280A5AAB78A46898\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_42.Text\n#. Key:\tD3AE25EC49FA7D2C78C1A382E5A01F28\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_37.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_42.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_37.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_37.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_42.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Why are you making Golems? What would you like to achieve?\"\nmsgstr \"妳為什麽要做機器人? 妳想實現什麽目標?\"\n\n#. Key:\t9CC2CAF14E5C04555E7329B6EA5082E0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(0).Children.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(0).Children.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Armour Wrath\"\nmsgstr \"鎧甲之怒\"\n\n#. Key:\t9EF4681A48ED6C909A4180BF823544BC\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(8).Children.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(8).Children.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(8).Children.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Do you need help?\"\nmsgstr \"妳需要幫忙嗎？\"\n\n#. Key:\t9F3BC08D46169E8C4BB788893FFDBCD4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_68.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_68.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_68.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Yes.\"\nmsgstr \"是的。\"\n\n#. Key:\tA10EF7404139EE7FE638BCA272C0B2CA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_71.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_71.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_71.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Destroy them if you can.\"\nmsgstr \"盡妳所能摧毀他們。\"\n\n#. Key:\tA13C1A6B4F187C1A3F682088B9CC9A6F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_23.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_23.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_23.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Didn't look too intelligent to me...\"\nmsgstr \"在我看來不太聰明…\"\n\n#. Key:\tA28429434B394861A6E4D084CE5C243F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_61.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_61.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_61.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I could but I don’t think you would like it.\"\nmsgstr \"我可以，但我想妳不會喜歡的。\"\n\n#. Key:\tA2CBB6914F66C9963AFD34A21378EAA7\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_103.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_103.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_103.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"With this last one I have all my memories back.\"\nmsgstr \"有了這最後壹個，我所有的記憶都回來了。\"\n\n#. Key:\tA33780CE4B9EABF54F612DBFCEB4B890\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_15.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I wonder if they will end like us.\"\nmsgstr \"我不知道他們是否會像我們壹樣結束。\"\n\n#. Key:\tA47024E844A13837A8FFFBB1EFA65633\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_44.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_44.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_44.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Though I forgot the reason.\"\nmsgstr \"雖然我忘記了原因。\"\n\n#. Key:\tA4E91A924BA53F0A000CDB9FC351DDBA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_60.Text\n#. Key:\tB4F5B2E6479E0E1ACDADD8A40E21FB98\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_59.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_60.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_59.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_59.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_60.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Could you create a stronger body for me?\"\nmsgstr \"妳能為我創造壹個更強壯的身體嗎?\"\n\n#. Key:\tA50F6A7B4A65712F990406B84E2AE072\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_98.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_98.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_98.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Thank you! I remember more and more.\"\nmsgstr \"謝謝妳！我能想起來越來越多的事情了。\"\n\n#. Key:\tA586F33F460BD066761AAEBD18666F78\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_82.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_82.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_82.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Bring me more so that I can remember!\"\nmsgstr \"給我多拿點來，這樣我就能記住！\"\n\n#. Key:\tA8A9ACBA47419C57AAA06098F7F91AD3\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_83.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_83.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_83.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Let me touch it! Hmmm...\"\nmsgstr \"讓我摸壹下！嗯…\"\n\n#. Key:\tAA5F0D5541366675A1D1819FDBDFA569\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_16.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"What happened to you?\"\nmsgstr \"妳怎麽了？\"\n\n#. Key:\tAD380C5F4F549229611DD9A79C7CD07E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_79.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_79.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_79.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"She was from the Human Realm. I liked her better than the other human.\"\nmsgstr \"她來自人類王國。我喜歡她勝過喜歡另壹個人。\"\n\n#. Key:\tAE0D1C714FFCFCA51ACCD3A01D6C7FF5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_125.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_125.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_125.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Yes, I felt his presence disappearing.\"\nmsgstr \"是的，我感覺他不存在了。\"\n\n#. Key:\tAE6B02664FEE60818E0D32B7939907F8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_106.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_106.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_106.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Now I have all my memories back.\"\nmsgstr \"現在我所有的記憶都回來了。\"\n\n#. Key:\tB7638E004540ADC59420A5AA614C225D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_75.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_75.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_75.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I’ve destroyed the Golems near the Tomb.\"\nmsgstr \"我已經摧毀了墳墓附近的機器人。\"\n\n#. Key:\tB86428C143F7BBBC4A7B9A91C05F3D15\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_20.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"They are doomed.\"\nmsgstr \"他們是註定要失敗的。\"\n\n#. Key:\tBB7DE71F44FE995BA4AF4C9F5E19961F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_46.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_46.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_46.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I try to create an Essence which resists Ruin. If it works it could stop Ruin.\"\nmsgstr \"我試圖創造壹種抵抗毀滅的精華。如果成功了，它就能阻止破產。\"\n\n#. Key:\tBCF49E21489280A32F859B9A6C2A78D4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_10.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"What are you creature?\"\nmsgstr \"妳是什麽生物？\"\n\n#. Key:\tBDEEB7C2474E308C66B832B41D839FC6\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_66.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_66.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_66.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Metal is good for spirits. Even rock is dangerous.\"\nmsgstr \"金屬對靈魂有好處。甚至巖石都是危險的。\"\n\n#. Key:\tC0CAE1B14D0B0E551B690FB9F178A6EE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(10).Children.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(10).Children.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(10).Children.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Memory Crystals\"\nmsgstr \"記憶水晶\"\n\n#. Key:\tC86A03B046B8F005B1C91EB0F68E4C1E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_121.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_121.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_121.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Here, take this! It might help if you need to face my creature!\"\nmsgstr \"來，拿好！如果妳需要面對我的生物，也許會有幫助！\"\n\n#. Key:\tCA35E144421C5594346DC9954052E633\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_57.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_57.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_57.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"No way home.\"\nmsgstr \"回家，沒門。\"\n\n#. Key:\tCD223717428DAF54F5362BB744B6A633\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_53.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_53.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_53.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I reuse the old golems. Maybe that’s why I can’t succeed.\"\nmsgstr \"我重復使用舊的機器人。也許這就是我不能成功的原因。\"\n\n#. Key:\tD06BA0C54CAA8E00ECAFBE9FAFBABE1F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_6.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Could you merge these iron pieces?\"\nmsgstr \"妳能把這些鐵塊合並起來嗎?\"\n\n#. Key:\tD237C8514A69E0A7820941B9048B92DE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_90.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_90.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_90.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Here it is!\"\nmsgstr \"給妳！\"\n\n#. Key:\tD2CEAC3040B9EBE5A98F249F60A7DAAA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(2).Children.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(2).Children.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(2).Children.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Iron Key\"\nmsgstr \"鐵鑰匙\"\n\n#. Key:\tD935FD314471404BAECA54BC3227D6E2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_69.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_69.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_69.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"There are too many unsuccessful golems.\"\nmsgstr \"失敗的機器人太多了。\"\n\n#. Key:\tDE3287A345E1E317061B45B64AAA0836\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_34.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_34.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_34.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Your words remind me of something. Something which was important.\"\nmsgstr \"妳的話讓我想起了壹些非常重要的事。\"\n\n#. Key:\tDEC8E5D548AECD6D48B449B51967301B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_115.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_115.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_115.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"One is guarded by my worst creation.\"\nmsgstr \"壹個出自我手的最劣質的機器人守衛著。\"\n\n#. Key:\tDEFA219E40FE5384D8B1F0A1CFD3AAD4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_80.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_80.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_80.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"She were... She said...\"\nmsgstr \"她曾經...  她說...\"\n\n#. Key:\tE13D5CCE41818BAC4A6E52A965B0AEF8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_101.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_101.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_101.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Look at this!\"\nmsgstr \"看看這個！\"\n\n#. Key:\tE1CB9ABE410B3C818283BB9325F3A456\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_32.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_32.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_32.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I create golems. You go on with your quest. Nothing else matters.\"\nmsgstr \"我創建機器人。妳繼續妳的追求。其它都無所謂。\"\n\n#. Key:\tE2AAAA4648BE8A7E73C761BDF72EC82D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_54.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_54.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_54.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Ruin caused too much damage.\"\nmsgstr \"毀滅造成了太多的損害。\"\n\n#. Key:\tE483CAFF4F7EF5607AA0A58F47EEF892\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_31.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_31.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_31.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"You are right. We are what we do. That keeps us alive.\"\nmsgstr \"妳說的對。我們人名其名，並以此為生。\"\n\n#. Key:\tE9899191454A678E7C61B0A55047A725\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_126.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_126.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_126.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I'm glad you managed to defeat him and yet...\"\nmsgstr \"我很高興妳能打敗他，但…\"\n\n#. Key:\tEA08D7B74E94A3D91DC825945916C312\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_102.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_102.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_102.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"One more Crystal for you!\"\nmsgstr \"再給妳壹顆水晶！\"\n\n#. Key:\tEAF5836D4D35812F14EABFA43C849947\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_117.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_117.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_117.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I know what you are up to. I would like to help but I fear I can’t do much.\"\nmsgstr \"我知道妳在做什麽。我很想幫忙，但恐怕幫不上什麽忙。\"\n\n#. Key:\tEB0F70894E9A498111B9A9824589633B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_21.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"I create Golems. I always did. I designed the most intelligent ones.\"\nmsgstr \"我創建機器人。這是我的日常。最智能的那批就是我設計的。\"\n\n#. Key:\tF0A1D18E463DCD0CADD67690F691481B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_27.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_27.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_27.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"There are some seeking a way to stop Ruin. They don't care about using spirits as slaves.\"\nmsgstr \"有些人在尋找阻止毀滅的方法。他們不在乎用幽魂做奴隸。\"\n\n#. Key:\tF10E8A9243616A85F71C01B0E57A2CC8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_105.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_105.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_105.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"And this is for you!\"\nmsgstr \"這是給妳的！\"\n\n#. Key:\tF62B033A4054241E561B519B2AFFEBDB\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_22.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Do you mean those moving rock things out there?\"\nmsgstr \"妳是說那些移動的石頭嗎?\"\n\n#. Key:\tF783A4F44E12EDA97EDF08B60228ED06\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_109.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_109.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_109.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"She had heart, she cared about what’s going on here. For the others we were like some interesting study.\"\nmsgstr \"她有壹顆善良的心，她關心這裏發生的壹切。對其他人來說，我們就是壹些有趣的研究內容。\"\n\n#. Key:\tF87968784C67FEEEBB78DBAD9D3C13F3\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_63.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_63.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_63.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"As for other materials I have no experience. Trust me you don’t want me to test out something on you for the first time.\"\nmsgstr \"至於其他材料，我沒有經驗。相信我，妳不會希望我在妳身上進行什麽首次試驗。\"\n\n#. Key:\tF9B8793C470BFE672214E1B82AE01B4E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_24.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_24.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_24.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Knowledge is lost. We are all lost.\"\nmsgstr \"失去了知識，我們還失去了方向。\"\n\n#. Key:\tF9DB2D444ADAC7A5C22AEC914EC7955F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(7).Children.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(7).Children.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_1.Children(7).Children.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Artefacts\"\nmsgstr \"工藝品\"\n\n#. Key:\tFE7749AB4C91684B3438E7A1B5BF32D9\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_29.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_29.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_29.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"They can't do as they plan. Some of them don't even believe Ruin.\"\nmsgstr \"他們不能按計劃行事。有些人甚至不相信毀滅。\"\n\n#. Key:\tFF2914834A91E2B6E8696FA828FC9F94\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_120.Text\n#. /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_120.Text\n#: /Game/SO/Dialogues/Chapter2/DlgGolemMaker.DlgGolemMaker:DlgNode_Speech_120.Text\nmsgctxt \"Dialogue_DlgGolemMaker\"\nmsgid \"Though it is guarded by the worst Golem I ever made: the Armour Wrath...\"\nmsgstr \"盡管它被我所造過的最糟糕的機器人守護著: 鎧甲之怒……\"\n\n#. Key:\t303FE4BA4765B90E9239FEB43AE2264C\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/DwarvenCatacombs/DO1Altar.DO1Altar:DlgNode_Speech_1.Text\n#. /Game/SO/Dialogues/Wizard/DwarvenCatacombs/DO1Altar.DO1Altar:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Wizard/DwarvenCatacombs/DO1Altar.DO1Altar:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_DO1Altar\"\nmsgid \"Under section 1 of the first Act, an action of worship can not be aimed at any entity, god or divinity other than the Law itself.\"\nmsgstr \"根據第1法案第1節，崇拜行為不能針對任何實體、上帝或神性，而只能針對法律本身。\"\n\n#. Key:\t73BA4B474C4DCF6CD31469A9FF120D58\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/DwarvenCatacombs/DO1Altar1.DO1Altar1:DlgNode_Speech_1.Text\n#. /Game/SO/Dialogues/Wizard/DwarvenCatacombs/DO1Altar1.DO1Altar1:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Wizard/DwarvenCatacombs/DO1Altar1.DO1Altar1:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_DO1Altar1\"\nmsgid \"Under section 2 of the first Act... ??? There is section 3 of the first act, one would assume.\"\nmsgstr \"根據第1法案第2條…??? 人們壹般會認為，是第1法案的第3條。\"\n\n#. Key:\t0D939EC3462DBDE895AD9F80CD4A9B99\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/DwarvenOutpost/DO1Arrive1DeadDwarves.DO1Arrive1DeadDwarves:DlgNode_Speech_6.Text\n#. /Game/SO/Dialogues/Wizard/DwarvenOutpost/DO1Arrive1DeadDwarves.DO1Arrive1DeadDwarves:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Wizard/DwarvenOutpost/DO1Arrive1DeadDwarves.DO1Arrive1DeadDwarves:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_DO1Arrive1DeadDwarves\"\nmsgid \"So they were the dwarfs who lived here.\"\nmsgstr \"他們就是住在這裏的小矮人。\"\n\n#. Key:\t6E27805A491B0E0DEAC36F9189CA33F9\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/DwarvenOutpost/DO1Arrive1DeadDwarves.DO1Arrive1DeadDwarves:DlgNode_Speech_7.Text\n#. /Game/SO/Dialogues/Wizard/DwarvenOutpost/DO1Arrive1DeadDwarves.DO1Arrive1DeadDwarves:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Wizard/DwarvenOutpost/DO1Arrive1DeadDwarves.DO1Arrive1DeadDwarves:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_DO1Arrive1DeadDwarves\"\nmsgid \"I'm not sure why but I feel a bit of sorrow for them.\"\nmsgstr \"我不知道為什麽，但我為他們感到有點難過。\"\n\n#. Key:\t7AD20FC74D56D0EE48CB5F92804EDAE5\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/DwarvenOutpost/DO1Arrive1DeadDwarves.DO1Arrive1DeadDwarves:DlgNode_Speech_4.Text\n#. /Game/SO/Dialogues/Wizard/DwarvenOutpost/DO1Arrive1DeadDwarves.DO1Arrive1DeadDwarves:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Wizard/DwarvenOutpost/DO1Arrive1DeadDwarves.DO1Arrive1DeadDwarves:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_DO1Arrive1DeadDwarves\"\nmsgid \"I wonder how you can tell them apart.\"\nmsgstr \"我不知道妳怎麽能把它們區分開來。\"\n\n#. Key:\tA6EB230647E9F8D38877FCA10CDE4875\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/DwarvenOutpost/DO1Arrive1DeadDwarves.DO1Arrive1DeadDwarves:DlgNode_Speech_8.Text\n#. /Game/SO/Dialogues/Wizard/DwarvenOutpost/DO1Arrive1DeadDwarves.DO1Arrive1DeadDwarves:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Wizard/DwarvenOutpost/DO1Arrive1DeadDwarves.DO1Arrive1DeadDwarves:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_DO1Arrive1DeadDwarves\"\nmsgid \"I knew these ones. That's Gwin and Traga, there's Krug...\"\nmsgstr \"這些我認識。那是格文和圖拉格，還有庫拉古...\"\n\n#. Key:\t2858D4314420FB59E8BDC18DB625DC1F\n#. SourceLocation:\t/Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_6.SpeechSequence(1).SpeechSequence.Text\n#. /Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_6.SpeechSequence(1).SpeechSequence.Text\n#: /Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_6.SpeechSequence(1).SpeechSequence.Text\nmsgctxt \"Dialogue_DO1Gate\"\nmsgid \"I think you may mistranslated a word or two...\"\nmsgstr \"我想妳可能錯譯了壹兩個詞……\"\n\n#. Key:\t2C08483A26080F0A003A02ADBE7A7D64\n#. SourceLocation:\t/Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_7.SpeechSequence(2).SpeechSequence.Text\n#. /Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_7.SpeechSequence(2).SpeechSequence.Text\n#: /Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_7.SpeechSequence(2).SpeechSequence.Text\nmsgctxt \"Dialogue_DO1Gate\"\nmsgid \"Dwarven letters are so similar...\"\nmsgstr \"矮人的語言字母如此相似……\"\n\n#. Key:\t2C09D69026080F0A003A02ADBE7A7D4E\n#. SourceLocation:\t/Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_8.SpeechSequence(2).SpeechSequence.Text\n#. /Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_8.SpeechSequence(2).SpeechSequence.Text\n#: /Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_8.SpeechSequence(2).SpeechSequence.Text\nmsgctxt \"Dialogue_DO1Gate\"\nmsgid \"Dwarven language is stupid, these signs could mean anything!\"\nmsgstr \"矮人的語言是愚蠢的，這些符號可能代表任何東西！\"\n\n#. Key:\t3D6EF5724190CE0AE579D69677BB8EAE\n#. SourceLocation:\t/Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_Speech_11.Text\n#. /Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_DO1Gate\"\nmsgid \"Associate!\"\nmsgstr \"結交！\"\n\n#. Key:\t4758A32043FC23B4DC3D82B35EFB0D24\n#. SourceLocation:\t/Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_Speech_9.Text\n#. /Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_DO1Gate\"\nmsgid \"The Doors of Dwar — Lord of Dwartown. Speak, associate, and enter.\"\nmsgstr \"矮人之門 - 矮人城之主。對話，結交，進入。\"\n\n#. Key:\t475CE3E94BA77F7596A7D8931D4D16C7\n#. SourceLocation:\t/Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_7.SpeechSequence(1).SpeechSequence.Text\n#. /Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_7.SpeechSequence(1).SpeechSequence.Text\n#: /Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_7.SpeechSequence(1).SpeechSequence.Text\nmsgctxt \"Dialogue_DO1Gate\"\nmsgid \"Are you sure that is what you just read?\"\nmsgstr \"妳確定這是妳剛讀到的嗎？\"\n\n#. Key:\t530C8841437C531647717B8B0BC07210\n#. SourceLocation:\t/Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_8.SpeechSequence(1).SpeechSequence.Text\n#. /Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_8.SpeechSequence(1).SpeechSequence.Text\n#: /Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_8.SpeechSequence(1).SpeechSequence.Text\nmsgctxt \"Dialogue_DO1Gate\"\nmsgid \"Nice try...\"\nmsgstr \"幹得不錯...\"\n\n#. Key:\t543858DE49FD03BF4F94C3BA47912E5E\n#. SourceLocation:\t/Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_9.SpeechSequence(1).SpeechSequence.Text\n#. /Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_9.SpeechSequence(1).SpeechSequence.Text\n#: /Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_9.SpeechSequence(1).SpeechSequence.Text\nmsgctxt \"Dialogue_DO1Gate\"\nmsgid \"I have to practice my Dwarven a bit more...!\"\nmsgstr \"我得多練習壹下我的小矮人……!\"\n\n#. Key:\t5923FB9C4DC255ABAA6059B64B806802\n#. SourceLocation:\t/Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_6.SpeechSequence(3).SpeechSequence.Text\n#. /Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_6.SpeechSequence(3).SpeechSequence.Text\n#: /Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_6.SpeechSequence(3).SpeechSequence.Text\nmsgctxt \"Dialogue_DO1Gate\"\nmsgid \"I am going to open this door somehow.\"\nmsgstr \"我要設法打開這扇門。\"\n\n#. Key:\t7CF38D834DB6A7265EDE19AD158BFEBF\n#. SourceLocation:\t/Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_7.SpeechSequence(0).SpeechSequence.Text\n#. /Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_7.SpeechSequence(0).SpeechSequence.Text\n#: /Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_7.SpeechSequence(0).SpeechSequence.Text\nmsgctxt \"Dialogue_DO1Gate\"\nmsgid \"I want a Schnauser with my Wienerschnitzel\"\nmsgstr \"我要壹份帶香腸的瑞士香腸\"\n\n#. Key:\t86311C104780BDB8A170538987EF7226\n#. SourceLocation:\t/Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_8.SpeechSequence(0).SpeechSequence.Text\n#. /Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_8.SpeechSequence(0).SpeechSequence.Text\n#: /Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_8.SpeechSequence(0).SpeechSequence.Text\nmsgctxt \"Dialogue_DO1Gate\"\nmsgid \"And on the day the Ball is set free, the gate opens and happiness finds everyone...\"\nmsgstr \"在球被釋放的那壹天，大門將打開，幸福灑向每壹個人……\"\n\n#. Key:\tCD68B2244B57CA37D2940499F440149B\n#. SourceLocation:\t/Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_Speech_10.Text\n#. /Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_DO1Gate\"\nmsgid \"Associwhat?\"\nmsgstr \"結交什麽？\"\n\n#. Key:\tCE8E75E6422C068794CC91BDBA2C024A\n#. SourceLocation:\t/Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_6.SpeechSequence(2).SpeechSequence.Text\n#. /Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_6.SpeechSequence(2).SpeechSequence.Text\n#: /Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_6.SpeechSequence(2).SpeechSequence.Text\nmsgctxt \"Dialogue_DO1Gate\"\nmsgid \"Damn, my Dwarven is just not good enough, I have to practice a bit more...\"\nmsgstr \"該死，我的小矮人還不夠好，我得多練習壹下……\"\n\n#. Key:\tCED9C6ED4B792FA939C759A79E4AB028\n#. SourceLocation:\t/Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_6.SpeechSequence(0).SpeechSequence.Text\n#. /Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_6.SpeechSequence(0).SpeechSequence.Text\n#: /Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_6.SpeechSequence(0).SpeechSequence.Text\nmsgctxt \"Dialogue_DO1Gate\"\nmsgid \"There is sauerkraut in my Lederhosen\"\nmsgstr \"我的皮短褲裏有泡菜\"\n\n#. Key:\tEC493B624D127AB87692BC983023FF18\n#. SourceLocation:\t/Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_7.SpeechSequence(3).SpeechSequence.Text\n#. /Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_7.SpeechSequence(3).SpeechSequence.Text\n#: /Game/SO/Dialogues/DO1/DO1Gate.DO1Gate:DlgNode_SpeechSequence_7.SpeechSequence(3).SpeechSequence.Text\nmsgctxt \"Dialogue_DO1Gate\"\nmsgid \"There must be a way to open this door...\"\nmsgstr \"壹定有辦法打開這扇門……\"\n\n#. Key:\t6F5AF3DD4E848650EE74449420A90A25\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/DwarvenCatacombs/DO1Tomb.DO1Tomb:DlgNode_Speech_1.Text\n#. /Game/SO/Dialogues/Wizard/DwarvenCatacombs/DO1Tomb.DO1Tomb:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Wizard/DwarvenCatacombs/DO1Tomb.DO1Tomb:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_DO1Tomb\"\nmsgid \"These are the orders of the Chancellor of Dwartown, unjustly murdered by order of Duality.\"\nmsgstr \"這是矮人鎮議長的命令，他被二元性不公平地殺害了。\"\n\n#. Key:\t949EBB7A4FCEA61BB9B3589CFCC53C2B\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/DwarvenCatacombs/DO1Tomb1.DO1Tomb1:DlgNode_Speech_1.Text\n#. /Game/SO/Dialogues/Wizard/DwarvenCatacombs/DO1Tomb1.DO1Tomb1:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Wizard/DwarvenCatacombs/DO1Tomb1.DO1Tomb1:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_DO1Tomb1\"\nmsgid \"Here lies the testament of the order of Duality, justly murdered by the Chancellor of Dwartown's spirit.\"\nmsgstr \"這裏有著二元秩序的證明，被矮人鎮的靈魂議長公正地謀殺了。\"\n\n#. Key:\t110A2E27493EBAD78EE6E1B16F56912A\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E3/E3_Start.E3_Start:DlgNode_Speech_2.Text\n#. /Game/SO/Dialogues/Ending/E3/E3_Start.E3_Start:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E3/E3_Start.E3_Start:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_E3_Start\"\nmsgid \"I survived the Unknown. I know how to use the Device, but...\"\nmsgstr \"我從未知中幸存了下來。我知道怎麽用這個設備，但是…\"\n\n#. Key:\t2CB853A540A2B5BFD268DEAA124CEAD0\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E3/E3_Start.E3_Start:DlgNode_Speech_7.Text\n#. /Game/SO/Dialogues/Ending/E3/E3_Start.E3_Start:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Ending/E3/E3_Start.E3_Start:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_E3_Start\"\nmsgid \"I need to choose one last time. Once and for all.\"\nmsgstr \"我需要最後選壹次。壹勞永逸。\"\n\n#. Key:\t416D47B6408622D8D01F61961C80ADD2\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E3/E3_Start.E3_Start:DlgNode_Speech_3.Text\n#. /Game/SO/Dialogues/Ending/E3/E3_Start.E3_Start:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E3/E3_Start.E3_Start:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_E3_Start\"\nmsgid \"I have already lost almost everything.\"\nmsgstr \"我幾乎已經失去了壹切。\"\n\n#. Key:\t75F863B843B253E3586DE991CDE546EA\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E3/E3_Start.E3_Start:DlgNode_Speech_1.Text\n#. /Game/SO/Dialogues/Ending/E3/E3_Start.E3_Start:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Ending/E3/E3_Start.E3_Start:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_E3_Start\"\nmsgid \"And here I am again. Is this how it will end?\"\nmsgstr \"我又來了。這就是結局嗎?\"\n\n#. Key:\t77BC194943A148967299F68B3522C696\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E3/E3_Start.E3_Start:DlgNode_Speech_4.Text\n#. /Game/SO/Dialogues/Ending/E3/E3_Start.E3_Start:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Ending/E3/E3_Start.E3_Start:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_E3_Start\"\nmsgid \"Do I really have to lose everyone I met in the Ruined Realm?\"\nmsgstr \"我真的要失去我在毀滅王國中遇到的每壹個人嗎?\"\n\n#. Key:\tA50B792A4D68EC45BB9C3CBBF8836021\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E3/E3_Start.E3_Start:DlgNode_Speech_5.Text\n#. /Game/SO/Dialogues/Ending/E3/E3_Start.E3_Start:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Ending/E3/E3_Start.E3_Start:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_E3_Start\"\nmsgid \"Or would I only save them so that we can die together?\"\nmsgstr \"或者我只拯救他們，讓我們壹起死去?\"\n\n#. Key:\tE43A08E14831EBDC50AFC0B4A3178817\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E3/E3_Start.E3_Start:DlgNode_Speech_6.Text\n#. /Game/SO/Dialogues/Ending/E3/E3_Start.E3_Start:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Ending/E3/E3_Start.E3_Start:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_E3_Start\"\nmsgid \"I can hear the people outside the tower. I don’t have much time.\"\nmsgstr \"我能聽到塔外的人們的聲音。我沒有太多的時間。\"\n\n#. Key:\t042B7F534C07B3EC75BA9BA8F0BA7926\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_5.Children(0).Children.Text\n#. /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_5.Children(0).Children.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_5.Children(0).Children.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"Worthy?\"\nmsgstr \"值得的？\"\n\n#. Key:\t05E334DE42BAA89837B78B8F0F1CBD93\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_13.Text\n#. /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"Get some rest and try again later.\"\nmsgstr \"休息壹下，稍後再試。\"\n\n#. Key:\t0BD769F745B35A106C7C0A83F6F9F246\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_14.Text\n#. /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"All right so you just teleported me to this... what is this place?\"\nmsgstr \"好吧，妳剛才把我傳送到這個…  這是什麽鬼地方?\"\n\n#. Key:\t0C9ECC3745963AB1D1FB6487E97513F9\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_24.Text\n#. /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_24.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_24.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"So right now this is the most proper place to test your Worthiness.\"\nmsgstr \"所以現在這是最適合測試妳價值的地方。\"\n\n#. Key:\t1401CBDA425076C6AE74C9BF4558D8DD\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_15.Text\n#. /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"You are not Worthy!\"\nmsgstr \"妳沒什麽價值！\"\n\n#. Key:\t21C3C1394F39821BC10FFFBE157AC5CF\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_10.Text\n#. /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"Giving up is not an option.\"\nmsgstr \"放棄是不可能的。\"\n\n#. Key:\t2E7222EA4858A0ADE9CE3C84CA27B993\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_5.Children(3).Children.Text\n#. /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_5.Children(3).Children.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_5.Children(3).Children.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"Skip\"\nmsgstr \"跳過\"\n\n#. Key:\t31BEA1764BA337B32B8038B31BE69C29\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_9.Text\n#. /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"Farewell! I need to go now.\"\nmsgstr \"再見！我得走了。\"\n\n#. Key:\t36B9EA924E623AFE9BF0B98402235EA4\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_28.Text\n#. /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"Focus on the trial!\"\nmsgstr \"專註於審判！\"\n\n#. Key:\t4A4A86684E5C5742A70FE383461AD89C\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_21.Text\n#. /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"Venture further down into the Sewer! You will find the answer.\"\nmsgstr \"再往下水道裏冒險! 妳會找到答案的。\"\n\n#. Key:\t54CA97394FDC12D0370C54995094819E\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_3.Text\n#. /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"This trial will test your limits!\"\nmsgstr \"這次審判將考驗妳的極限！\"\n\n#. Key:\t5D820AA647AE2540DE6C2D8D6F6BF88A\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_5.Children(4).Children.Text\n#. /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_5.Children(4).Children.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_5.Children(4).Children.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"Give seat\"\nmsgstr \"給予座位\"\n\n#. Key:\t5F6629ED4E0857BBBA46ED9C51306215\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_5.Children(2).Children.Text\n#. /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_5.Children(2).Children.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_5.Children(2).Children.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"Restore\"\nmsgstr \"恢復\"\n\n#. Key:\t618B587743F2F432D9D487AE0E909166\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_4.Text\n#. /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"What?\"\nmsgstr \"什麽？\"\n\n#. Key:\t61D61006436DD6659A8846932697971A\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_19.Text\n#. /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"Yes, you are!\"\nmsgstr \"是的，妳是！\"\n\n#. Key:\t6225912A49C32068D10ADB9C31A6BA3E\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_12.Text\n#. /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"Of course!\"\nmsgstr \"當然！\"\n\n#. Key:\t7DD5FF4D47DF6A461D44DDBA056A4100\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_16.Text\n#. /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"I shall yield you to the right path!\"\nmsgstr \"我要讓妳走上正確的道路！\"\n\n#. Key:\t8C3F3A364544B13A2C6687A99E6A792B\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_8.Text\n#. /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"I'm fed up with your trial! Just teleport me back.\"\nmsgstr \"我受夠了妳的審判! 把我傳送回去。\"\n\n#. Key:\t903D03CE41FD835E75059587288D9A1B\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_23.Text\n#. /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_23.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_23.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"There used to be an Arena here to test the Adventurers of the Realm, but it has been flooded with water for a hundred years.\"\nmsgstr \"這裏曾經有壹個競技場用來測試王國的冒險者，但它已經被水淹了100年。\"\n\n#. Key:\t96C9A8DA496C0A8476E35AB942BE5EED\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_6.Text\n#. /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"Am I Worthy?\"\nmsgstr \"我有價值嗎？\"\n\n#. Key:\t9826B62E48A67772A1850CADF1A83729\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_5.Children(1).Children.Text\n#. /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_5.Children(1).Children.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_5.Children(1).Children.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"Where are we?\"\nmsgstr \"我們在哪兒？\"\n\n#. Key:\t9A94E4FC46E3896BE05136A2A9EA4AF5\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_27.Text\n#. /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_27.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_27.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"We don't have time for this now.\"\nmsgstr \"我們現在沒有時間。\"\n\n#. Key:\t9B9B02AF404F9B8B9D8722A9006FC907\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_22.Text\n#. /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"These are the remnants of the Ancient Sewer.\"\nmsgstr \"這些是古代下水道的遺跡。\"\n\n#. Key:\tAAB9F101475D1407B58BECB2DA5E508D\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_20.Text\n#. /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"So how am I supposed to complete your Trial?\"\nmsgstr \"那我怎麽才能完成妳的試驗呢?\"\n\n#. Key:\tAD3BADD6499C01410511E68C86F337C8\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_2.Text\n#. /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"Your Worthiness has to be proven.\"\nmsgstr \"妳的價值需要被證明。\"\n\n#. Key:\tC0BA510B4875AD24C53663B01964B309\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_11.Text\n#. /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"Go now, the Trial awaits you!\"\nmsgstr \"去吧，審判在等著妳！\"\n\n#. Key:\tC252181740C4E256EDEB29B6B552BDD2\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_7.Text\n#. /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"I'm tired, I will need some time to recover.\"\nmsgstr \"我累了，我需要壹些時間來恢復。\"\n\n#. Key:\tCCD8D1DD4859B067482612A3A9F32C06\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_5.Children(5).Children.Text\n#. /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_5.Children(5).Children.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_5.Children(5).Children.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"Leave\"\nmsgstr \"離開\"\n\n#. Key:\tCE0C3EBD41F17E82F8CF0E8D5E5E9F17\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_1.Text\n#. /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"The Worthiness is strong in this one...\"\nmsgstr \"這個價值是很強的…\"\n\n#. Key:\tD229B47146585D051BEFF493C53ED01B\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_26.Text\n#. /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_26.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_26.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"Stop!\"\nmsgstr \"停！\"\n\n#. Key:\tF043B1BF47F617255071EC9DB44CB78A\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_17.Text\n#. /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"You have proven yourself Worthy!\"\nmsgstr \"妳已經證明了自己的價值！\"\n\n#. Key:\tFBBCA0E043F139F203D62DAD1599143E\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_18.Text\n#. /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"Your Worthiness has been proven again!\"\nmsgstr \"妳的價值再次被證明了！\"\n\n#. Key:\tFE4F99AC4F23760ADD203083CA1497E3\n#. SourceLocation:\t/Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_25.Text\n#. /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_25.Text\n#: /Game/SO/Dialogues/TL/GateKeeper.GateKeeper:DlgNode_Speech_25.Text\nmsgctxt \"Dialogue_GateKeeper\"\nmsgid \"I have found a...\"\nmsgstr \"我找到壹個...\"\n\n#. Key:\t00AD8B3D44461E4DBF800F92DDF0C6F5\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_13.Text\n#. /Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_Gatekeeper_AfterBattle\"\nmsgid \"What?! I understand that for a new gate to open one would have to prove something, but... in this case... I accept that...\"\nmsgstr \"什麽? ! 我知道要打開壹扇新的大門，必須要證明什麽，但是……在這種情況下……我承認……\"\n\n#. Key:\t0EC6953C4F07CFF6B7A13A9BCF224550\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_1.Text\n#. /Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_Gatekeeper_AfterBattle\"\nmsgid \"Enough!\"\nmsgstr \"夠了！\"\n\n#. Key:\t237714F14DC3F9D33F10E6B7761E47C4\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_9.Text\n#. /Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_Gatekeeper_AfterBattle\"\nmsgid \"What a coincidence! I also happen to be heading in that direction.\"\nmsgstr \"太巧了！我也正朝著那個方向前進。\"\n\n#. Key:\t28054AA74F9CEA976E653ABF5A5F5695\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_11.Text\n#. /Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_Gatekeeper_AfterBattle\"\nmsgid \"You can pass.\"\nmsgstr \"妳能通過。\"\n\n#. Key:\t3D5BAB214968DBB31BE03EBE32B2DE6C\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_7.Text\n#. /Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_Gatekeeper_AfterBattle\"\nmsgid \"Farewell my Ball Lord! May the Great Gate open for you when the time comes!\"\nmsgstr \"再見了，我的球主！願偉大的大門在那壹刻為妳敞開！\"\n\n#. Key:\t4D497F814F476FFA7F2A66A937EAFF3E\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_16.Text\n#. /Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_Gatekeeper_AfterBattle\"\nmsgid \"Noooooo...\"\nmsgstr \"不.........\"\n\n#. Key:\t4FEA82084C2E2E09FE6699B2FB353E04\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_10.Text\n#. /Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_Gatekeeper_AfterBattle\"\nmsgid \"Could you just let me pass? Please?\"\nmsgstr \"妳能讓我過去嗎? 拜托了好嗎?\"\n\n#. Key:\t50005F6248946893250282B0B7D134F2\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_2.Text\n#. /Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_Gatekeeper_AfterBattle\"\nmsgid \"You have proved your Worthiness.\"\nmsgstr \"妳證明了妳的價值。\"\n\n#. Key:\t601E1BAC4E9C7A93B7A97AA787C14027\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_8.Text\n#. /Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_Gatekeeper_AfterBattle\"\nmsgid \"Farewell, Keeper!\"\nmsgstr \"再見了，守護者！\"\n\n#. Key:\t758788864E716DB2EC9F57B3042DC129\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_4.Text\n#. /Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_Gatekeeper_AfterBattle\"\nmsgid \"Ask him to take you to Crossroad Cave.\"\nmsgstr \"讓他帶妳去十字路口的洞穴。\"\n\n#. Key:\t8170CF2C42A1894899BA98B33AB39A3F\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_15.Text\n#. /Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_Gatekeeper_AfterBattle\"\nmsgid \"Wait! What?\"\nmsgstr \"等等！什麽？\"\n\n#. Key:\t86B7E3D34F2206BB44B0F88001F9E8BA\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_14.Text\n#. /Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_Gatekeeper_AfterBattle\"\nmsgid \"Then if you accept, let the trial begin!\"\nmsgstr \"如果妳接受，就開始審判吧！\"\n\n#. Key:\tCC7215014B87E0910413F1AEECE0492F\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_3.Text\n#. /Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_Gatekeeper_AfterBattle\"\nmsgid \"Where do you want to go, Sir? Command me.\"\nmsgstr \"先生，您想去哪兒? 給我指令。\"\n\n#. Key:\tD5FBCE5C4C97766EF3A852A2D96D1D30\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_5.Text\n#. /Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_Gatekeeper_AfterBattle\"\nmsgid \"Crossroad Cave!\"\nmsgstr \"十字路口的洞穴\"\n\n#. Key:\tE0032A09440BDE56BFAF2CBDBCFA2074\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_6.Text\n#. /Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_Gatekeeper_AfterBattle\"\nmsgid \"So be it!\"\nmsgstr \"誠心所願\"\n\n#. Key:\tE8148F28483300CCD24473A30C028235\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_12.Text\n#. /Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_AfterBattle.Gatekeeper_AfterBattle:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_Gatekeeper_AfterBattle\"\nmsgid \"Once you have proven Worthy.\"\nmsgstr \"壹旦妳被證明是有價值的。\"\n\n#. Key:\t0BE62CA44198CAA4B4AF7D844B79EEC3\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_3.Children(2).Children.Text\n#. Key:\t17D2B5D7409FBE7F215265B5A8CBF8F8\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_21.Children(2).Children.Text\n#. /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_3.Children(2).Children.Text\n#. /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_21.Children(2).Children.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_21.Children(2).Children.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_3.Children(2).Children.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"Leave\"\nmsgstr \"離開\"\n\n#. Key:\t2BFD355626080F0A003A025ABE793045\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_21.Children(0).Children.Text\n#. Key:\t2BFEA3D826080F0A003A025ABE79300B\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_3.Children(0).Children.Text\n#. Key:\t2C027C7626080F0A003A025ABE793F5F\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_18.Children(0).Children.Text\n#. /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_21.Children(0).Children.Text\n#. /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_3.Children(0).Children.Text\n#. /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_18.Children(0).Children.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_18.Children(0).Children.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_21.Children(0).Children.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_3.Children(0).Children.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"Accept Challenge\"\nmsgstr \"接受挑戰\"\n\n#. Key:\t2EDD3BEF4707FD59FE1ACB9A105F7EFC\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_3.Children(1).Children.Text\n#. /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_3.Children(1).Children.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_3.Children(1).Children.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"Give seat\"\nmsgstr \"給予座位\"\n\n#. Key:\t4E4229704C95B2C73050E1AF65A29847\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_21.Text\n#. /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"Did you come back to prove yourself?\"\nmsgstr \"妳回來是為了證明妳自己嗎?\"\n\n#. Key:\t55B70B0345422648BB579C8D4E42FE86\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_18.Children(1).Children.Text\n#. /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_18.Children(1).Children.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_18.Children(1).Children.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"Maybe later\"\nmsgstr \"也許再過會兒\"\n\n#. Key:\t62E33EC84A508E57233A6A9AF6DCDFBC\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_3.Text\n#. /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"Only if you prove yourself worthy one more time.\"\nmsgstr \"除非妳能再次證明自己的價值。\"\n\n#. Key:\t65A8C3BA420B4624960CBAB42930BB5F\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_13.Children(0).Children.Text\n#. /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_13.Children(0).Children.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_13.Children(0).Children.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"Not fair\"\nmsgstr \"不公平\"\n\n#. Key:\t688C407641B488D0FDC7F98D0F6CA826\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_11.Text\n#. /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"Is that... is this really happening?\"\nmsgstr \"是……這是真的嗎?\"\n\n#. Key:\t77A739594D7ADA997DD300A7EE270D8F\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_5.Text\n#. /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"I have found a seat that fits your size.\"\nmsgstr \"我找到了壹個適合妳尺碼的座位。\"\n\n#. Key:\t8C9BCD2044EE9C5F4826D0B5C5CE22D4\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_20.Text\n#. /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"Now... are you ready to prove yourself?\"\nmsgstr \"現在… 妳準備好證明妳自己了嗎?\"\n\n#. Key:\t8E33C12A42E9EAEDC20CD3B97F3AF9B2\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_2.Text\n#. /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"Yes, I can.\"\nmsgstr \"是的，我能。\"\n\n#. Key:\t91849BD64325E5B9D8A366921D4D1AA9\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_13.Text\n#. /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"The best challenges were set aside just for you!\"\nmsgstr \"最好的挑戰都留給了妳！\"\n\n#. Key:\t97D5940549A753A94A9F5AB46CCE14AF\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_9.Text\n#. /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"I myself shall test your worthiness.\"\nmsgstr \"我要親自考驗妳的價值。\"\n\n#. Key:\t9A158FA74FF1D9F99F5477856927AC90\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_17.Text\n#. /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"I will make no exceptions! Your generous act gave me back my spirit. From now on I pledge to perform my task even better.\"\nmsgstr \"我不會有任何例外! 妳慷慨地把我的精靈還給了我。從現在起，我保證要更好地完成我的任務。\"\n\n#. Key:\tA3863AD64404451005ECE392B123FFAE\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_22.Text\n#. /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"Errr... maybe a bit later.\"\nmsgstr \"哦…… 也許過壹會兒吧。\"\n\n#. Key:\tAB2F0FFA45E0AF42B6035FA3D1F2D8DB\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_12.Text\n#. /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"I am truly impressed. I will never forget about your kindness.\"\nmsgstr \"我真的很感動。我永遠不會忘記妳的好意。\"\n\n#. Key:\tB284259646C0236570CF489DDCD88A29\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_18.Text\n#. /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"Are you ready to prove yourself?\"\nmsgstr \"妳準備好證明妳自己了嗎?\"\n\n#. Key:\tB57F0D0442C167DADE576A9CBD2B3E96\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_19.Text\n#. /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"Thank you! You can have this RuneStone as a compensation.\"\nmsgstr \"謝謝妳！妳可以用這個符石作為補償。\"\n\n#. Key:\tB5F8117A4514A4207059EF8CD1C59420\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_4.Text\n#. /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"All right, let's do it!\"\nmsgstr \"好吧，我們開始吧！\"\n\n#. Key:\tC7DFED0F43E17F90C02E3D94D6F24200\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_15.Text\n#. /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"What? Can't you just open that gate?\"\nmsgstr \"什麽? 妳不能打開那扇門嗎?\"\n\n#. Key:\tCC1CBB8E4F710B337B3BCC8CB01DB8CE\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_16.Text\n#. /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"Well that's very... kind of you, I guess.\"\nmsgstr \"妳... 真是太好了。\"\n\n#. Key:\tDE0225744DA0777DC12392ABB187D653\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_1.Text\n#. /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"Keeper! Can you open a Portal?\"\nmsgstr \"守護者！妳能打開壹個入口嗎？\"\n\n#. Key:\tDF53D02F4A6CD307A559E5BADBEF22FA\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_13.Children(1).Children.Text\n#. /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_13.Children(1).Children.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_13.Children(1).Children.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"You are welcome\"\nmsgstr \"不客氣\"\n\n#. Key:\tF0A6481A46B5FC65944D35ABFE94FA7E\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_21.Children(1).Children.Text\n#. /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_21.Children(1).Children.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_21.Children(1).Children.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"Give Seat\"\nmsgstr \"給予座位\"\n\n#. Key:\tFF3C850143B6609D7B1B878B8DEB8A13\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_8.Text\n#. /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/GK/Gatekeeper_BeforeBattle.Gatekeeper_BeforeBattle:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_Gatekeeper_BeforeBattle\"\nmsgid \"This is your final trial.\"\nmsgstr \"這是對妳的最後審判。\"\n\n#. Key:\t018CF7BC4272B09AF7B646B0F9B2EB11\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_55.Text\n#. /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_55.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_55.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"How did it happen? How was everything destroyed?\"\nmsgstr \"這是怎麽發生的? 壹切是如何毀滅的?\"\n\n#. Key:\t0BF674C94942E4E32FCB09BD7E7059B0\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_23.Text\n#. /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_23.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_23.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"Those who stayed died.\"\nmsgstr \"那些留下來的人都死了。\"\n\n#. Key:\t1BFE1DBE471281F60970F8BEBFDD6E40\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_14.Text\n#. /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"It’s nice of the Mirror that he still remembers me. Could you give this flower to him to express my thankfulness?\"\nmsgstr \"他還記得我，真是太好了。妳能把這朵花送給他以表達我的謝意嗎?\"\n\n#. Key:\t2158D7A1470944D529FF138AB883DC10\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_20.Text\n#. /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"Who lived in this Realm? Where are they now?\"\nmsgstr \"誰住在這個王國裏? 他們現在在哪裏?\"\n\n#. Key:\t2CCCBA97402EEFD5248D929680B0FF01\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_26.Text\n#. /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_26.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_26.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"What was the Realm like before?\"\nmsgstr \"以前的王國是什麽樣的?\"\n\n#. Key:\t32DA4503499D5A01CB1E7DA7B51B4EB5\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_29.Text\n#. /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_29.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_29.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"Majestic castles and towers up until the sky. The air fresh, the sun shining.\"\nmsgstr \"宏偉的城堡和塔直聳天空。空氣清新，陽光明媚。\"\n\n#. Key:\t35903E9F471EECEC779D879565E189B6\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_12.Children(1).Children.Text\n#. /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_12.Children(1).Children.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_12.Children(1).Children.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"Who lived here?\"\nmsgstr \"誰住在這裏?\"\n\n#. Key:\t3AD2CA8148AA6397B3D8818063269D67\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_14.Children(1).Children.Text\n#. /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_14.Children(1).Children.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_14.Children(1).Children.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"No way\"\nmsgstr \"沒門\"\n\n#. Key:\t3D4AF37842FD602384F0C79F2949BD07\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_14.Children(0).Children.Text\n#. /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_14.Children(0).Children.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_14.Children(0).Children.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"Of course\"\nmsgstr \"當然\"\n\n#. Key:\t41B0D00048A85B7122834B8F731AA8B4\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_25.Text\n#. /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_25.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_25.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"Ruin preserves them. They can’t get old and die. Some of them are still visiting these parts of the Realm, but they no longer know what they are looking for.\"\nmsgstr \"毀滅會保存他們。他們不會變老或死亡。他們中的壹些人仍然會來到這些地區，但他們不再知道他們在尋找什麽。\"\n\n#. Key:\t47D0395F4DD63A6E2F68018719DC2CCD\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_6.Text\n#. /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"Thank you!\"\nmsgstr \"多謝！\"\n\n#. Key:\t57614F674FD8F9A5CF8CC0AFA4D57F37\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_12.Children(0).Children.Text\n#. /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_12.Children(0).Children.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_12.Children(0).Children.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"Magic Mirror\"\nmsgstr \"魔鏡\"\n\n#. Key:\t5B00385B409CA39C5F2AFDA0E75EC4A0\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_16.Text\n#. /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"I'm not a postman. Find someone else!\"\nmsgstr \"我不是郵遞員。找別人！\"\n\n#. Key:\t5C83B0604CB1616D07BE209C08AE57B6\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_27.Text\n#. /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_27.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_27.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"It was a wonderful world, full of life and joy.\"\nmsgstr \"這是壹個奇妙的世界，充滿了生命和歡樂。\"\n\n#. Key:\t66409DBC4D55F6190D6F429F81CE7C0F\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_12.Children(2).Children.Text\n#. /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_12.Children(2).Children.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_12.Children(2).Children.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"Realm's past\"\nmsgstr \"王國的過去\"\n\n#. Key:\t6728BD15433EBCF47B42DA8D84F3777C\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_9.Text\n#. /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"I'll remember you!\"\nmsgstr \"我會記得妳的！\"\n\n#. Key:\t764C9E864C4C345638C2A2B4019CE5FA\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_17.Text\n#. /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"Sure, I will deliver the flower!\"\nmsgstr \"當然，我會送花的！\"\n\n#. Key:\t7F42828D4976A3366581BE9E067F3982\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_24.Text\n#. /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_24.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_24.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"Those who escaped changed in body and mind.\"\nmsgstr \"逃跑的人身心都變了。\"\n\n#. Key:\t858E8AD741D48CFB58B94ABA5A6FCE9A\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_18.Text\n#. /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"No problem. It doesn’t matter anyway.\"\nmsgstr \"沒有問題。反正也沒關系。\"\n\n#. Key:\t86DBF2164E3B1C4057320E8FC526AE5F\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_12.Children(3).Children.Text\n#. /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_12.Children(3).Children.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_12.Children(3).Children.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"Cataclysm\"\nmsgstr \"大災難\"\n\n#. Key:\t8C0E746A4C00A7B4792706A042588AA3\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_58.Text\n#. /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_58.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_58.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"Until one day many of the imprisoned spirits broke loose from the golem bodies.\"\nmsgstr \"直到有壹天，許多被囚禁的靈魂從機器人的身體中掙脫出來。\"\n\n#. Key:\t8DCB54DC429D8E328B791FA18261EBE4\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_30.Text\n#. /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_30.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_30.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"Until it was all gone.\"\nmsgstr \"直到它全部消失。\"\n\n#. Key:\t933737274ACAC51A980A6985E9B985D2\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_12.Text\n#. /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"I am here so that the past is not forgotten until the very end. Have some rest and remember!\"\nmsgstr \"我在這裏，是為了不到最後時刻就不會忘記過去。記住吧，休息壹下!\"\n\n#. Key:\t9A6C35C143F4B6845772D4AF6C4C6213\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_56.Text\n#. /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_56.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_56.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"The Golem Makers went too far. They made thousands and thousands of golems.\"\nmsgstr \"機器人制作者太過分了，他們制作了成千上萬的機器人。\"\n\n#. Key:\t9E254E4D4CA6D256A7EC8CA8ADC6EF19\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_10.Text\n#. /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"Would you like to hear some other tales?\"\nmsgstr \"妳想聽其他故事嗎?\"\n\n#. Key:\tAC50E6794072B525FD9144AB9B722F74\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_57.Text\n#. /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_57.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_57.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"They always cared about the new ones and forgot about the obsolete ones.\"\nmsgstr \"他們總是關註新的機器人，而遺忘了舊的那批。\"\n\n#. Key:\tC03F20E6477984A6691145A40535FBBD\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_60.Text\n#. /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_60.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_60.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"Is there anything else you want me to remember?\"\nmsgstr \"妳還想讓我記住什麽?\"\n\n#. Key:\tC9E74A374ED9F47999AA56BD16466899\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_28.Text\n#. /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"The streets were clear and bright, trees and flowers everywhere.\"\nmsgstr \"街道幹凈明亮，花草樹木隨處可見。\"\n\n#. Key:\tCF0209FF4BC57A750F52F2B3CC710A6E\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_13.Text\n#. /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"I think it likes you.\"\nmsgstr \"我想它喜歡妳。\"\n\n#. Key:\tD11D82FA4AE733D55DCBA692A2A3C0C7\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_22.Text\n#. /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"Now they are all gone.\"\nmsgstr \"現在他們都走了。\"\n\n#. Key:\tD88C72AE460756D4B619D7B8F924C7BB\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_21.Text\n#. /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"Oh, there were many: proud, wise, brave, clever and majestic.\"\nmsgstr \"哦，有很多: 驕傲的，聰明的，勇敢的，聰明的以及莊嚴的。\"\n\n#. Key:\tDEA408E54892798F0112B0A92EE34D3A\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_12.Children(4).Children.Text\n#. /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_12.Children(4).Children.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_12.Children(4).Children.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"Leave\"\nmsgstr \"離開\"\n\n#. Key:\tEA384D06419AAB835765CF8D6ECE6495\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_59.Text\n#. /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_59.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_59.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"They are what is now called Ruin. The power which is destroying the Realm.\"\nmsgstr \"他們就是現在所說的毀滅。摧毀王國的壹種力量。\"\n\n#. Key:\tED8571C94BCCF0F083CAD2A7439C10AA\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_1.Text\n#. /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"I’ve met with a Magic Mirror who showed a picture of you.\"\nmsgstr \"我見過壹面魔鏡，裏面有妳的照片。\"\n\n#. Key:\tF5C7F8254D29767753AEA3AB446B9B6E\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_8.Text\n#. /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"I've got to go now.\"\nmsgstr \"我得走了。\"\n\n#. Key:\tF9E140154471CC466095ADBFF652E94D\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_11.Text\n#. /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/GG/GGFountain.GGFountain:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_GGFountain\"\nmsgid \"Ask if you need to know more. I'll remember.\"\nmsgstr \"如果妳想知道更多就提問。我會記得。\"\n\n#. Key:\t04527B3745611117185CC09C4CD9018E\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_12.Text\n#. /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"That’s more like it!\"\nmsgstr \"這才像話！\"\n\n#. Key:\t11C31D4D4DFD60259D68FCB3CD8E641E\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_13.Children(2).Children.Text\n#. /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_13.Children(2).Children.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_13.Children(2).Children.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"Retreat\"\nmsgstr \"撤退\"\n\n#. Key:\t29C3FE594DDD364CEED5EA9304BFAC43\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_16.Text\n#. /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"How can I prove that I'm worthy?\"\nmsgstr \"我怎樣才能證明我的價值?\"\n\n#. Key:\t2BC9EBB6451DB66B7767F1A0B663A06D\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_8.Text\n#. /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"That’s awful, let’s try it in a different tone.\"\nmsgstr \"太糟糕了，我們換壹種語氣試試。\"\n\n#. Key:\t2BD75DF026080F0A003A0178BE75C345\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_1.Text\n#. /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"Behold traveler!\"\nmsgstr \"瞧好了，旅行者！\"\n\n#. Key:\t302884BD4A306FB9614C51AF4790FAE4\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_13.Children(0).Children.Text\n#. /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_13.Children(0).Children.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_13.Children(0).Children.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"How to prove?\"\nmsgstr \"如何證明?\"\n\n#. Key:\t370AC3D04CB9F6E443CAC2A8E270F289\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_18.Text\n#. /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"No problem I don't really want to pass that gate anyway.\"\nmsgstr \"沒問題，反正我也不想通過那扇門。\"\n\n#. Key:\t4E231ED94F0794AE6342A8A2C7644D51\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_2.Text\n#. /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"I am the Gatekeeper. I will only open this door if you prove to be worthy.\"\nmsgstr \"我是守護者。我只會在妳證明自己有價值的時候才會打開這扇門。\"\n\n#. Key:\t4F30265A4D22C52371CC8E9E188B2718\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_9.Text\n#. /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"Open, now!\"\nmsgstr \"開門，現在！\"\n\n#. Key:\t56B5D73646C6823598232BB3D2577305\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_3.Text\n#. /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"Ask him to open the door.\"\nmsgstr \"請他開門。\"\n\n#. Key:\t7A52E2E14341A8CDBD77A4A30DDA22E3\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_13.Children(1).Children.Text\n#. /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_13.Children(1).Children.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_13.Children(1).Children.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"Please let me in\"\nmsgstr \"請讓我進去\"\n\n#. Key:\t835098BD4F5D14FAACF1209850607E04\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_15.Children(0).Children.Text\n#. /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_15.Children(0).Children.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_15.Children(0).Children.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"Accept Challenge.\"\nmsgstr \"接受挑戰\"\n\n#. Key:\t83E15A3C46A1D2D4CE4FDDBE81130106\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_17.Text\n#. /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"No way! Nobody can skip the Trial!\"\nmsgstr \"休想！沒有人可以跳過審判！\"\n\n#. Key:\t86D9667C43253BBFFA43E4ABED24369B\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_10.Text\n#. /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"Still not...\"\nmsgstr \"目前還沒有...\"\n\n#. Key:\t94A0124A401BA0CD029255B7D01E087E\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_19.Text\n#. /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"There is no turning back now. The Trial awaits you!\"\nmsgstr \"現在沒有回頭路了。審判在等著妳！\"\n\n#. Key:\t964E5DC7491720F8C3EA53936CBC1DEA\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_15.Text\n#. /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"The Trial will test you!\"\nmsgstr \"審判將考驗妳！\"\n\n#. Key:\tA38AC02A4C258F538AC26686207D505F\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_4.Text\n#. /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"...\"\nmsgstr \"...\"\n\n#. Key:\tABA8061E4F631608D712A0BDBC6D90D1\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_5.Text\n#. /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"Ah, you can't speak! Hmm... Try now!\"\nmsgstr \"啊，妳不會說話！嗯… 現在試壹試！\"\n\n#. Key:\tDA4C66AB4F7798DAD95EC5B83D422A03\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_14.Text\n#. /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"Could you just let me pass this time?\"\nmsgstr \"這次妳能讓我通過嗎?\"\n\n#. Key:\tF09A0C3F4BEA6AFBC9EE52AEB6A740AB\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_11.Text\n#. /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"Open that gate, Keeper!\"\nmsgstr \"把門打開，守護者！\"\n\n#. Key:\tF32B1FEC4BB33670D336D28832F04312\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_13.Text\n#. /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"I can only open this door for those who prove worthy.\"\nmsgstr \"我只能為那些證明了自身價值的人打開這扇門。\"\n\n#. Key:\tFB74F24C4B8C2E6B4368B19D77F71606\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_7.Text\n#. /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper0.GGGateKeeper0:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_GGGateKeeper0\"\nmsgid \"Please, open the...\"\nmsgstr \"請，打開...\"\n\n#. Key:\t0BAD4DEA4009823275249FB31070D002\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_7.Children(1).Children.Text\n#. Key:\t2F2169444BBDC9843E1B7DAEDE7F5104\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_4.Children(1).Children.Text\n#. /Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_7.Children(1).Children.Text\n#. /Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_4.Children(1).Children.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_4.Children(1).Children.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_7.Children(1).Children.Text\nmsgctxt \"Dialogue_GGGateKeeper2\"\nmsgid \"Leave\"\nmsgstr \"離開\"\n\n#. Key:\t36FDC8384686644248F76B9EF8A22038\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_6.Text\n#. /Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_GGGateKeeper2\"\nmsgid \"Here we go again...\"\nmsgstr \"又來了…\"\n\n#. Key:\t3D7557464E3E19A1CF3447B555D4977D\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_3.Text\n#. /Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_GGGateKeeper2\"\nmsgid \"Well, of course.\"\nmsgstr \"嗯，當然。\"\n\n#. Key:\t5463C10D4C56C2CD40338A9E5C33D995\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_7.Text\n#. /Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_GGGateKeeper2\"\nmsgid \"You know the rules.\"\nmsgstr \"妳知道規矩。\"\n\n#. Key:\t6E1915BC4A79E949C10BDCAADDA1E481\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_7.Children(0).Children.Text\n#. Key:\tACC5EBF441036AE06D207281CBE054D9\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_4.Children(0).Children.Text\n#. /Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_7.Children(0).Children.Text\n#. /Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_4.Children(0).Children.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_4.Children(0).Children.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_7.Children(0).Children.Text\nmsgctxt \"Dialogue_GGGateKeeper2\"\nmsgid \"Accept Challenge\"\nmsgstr \"接受挑戰\"\n\n#. Key:\tA5CD165646DA7D531D23F7AAE5B0D701\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_4.Text\n#. /Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_GGGateKeeper2\"\nmsgid \"I mean: You shall not pass unless you prove yourself worthy!\"\nmsgstr \"我的意思是: 妳想通過，就必須先證明妳的價值！\"\n\n#. Key:\tBABC111D4B5743B296E6AD84659E1910\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_1.Text\n#. /Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_GGGateKeeper2\"\nmsgid \"You shall not pass!!\"\nmsgstr \"妳不能通過！\"\n\n#. Key:\tCAF6CA2C4159145B5FE684995956F155\n#. SourceLocation:\t/Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_2.Text\n#. /Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/GG/GGGateKeeper2.GGGateKeeper2:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_GGGateKeeper2\"\nmsgid \"What?? I thought I will need to prove myself worthy.\"\nmsgstr \"什麽? ? 我想我需要證明自己的價值。\"\n\n#. Key:\t31B0B4214FE4324029BAB2A75CF7D1EA\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/GGSurviverNote.GGSurviverNote:DlgNode_Speech_2.Text\n#. /Game/SO/Dialogues/Wizard/Chapter1/GGSurviverNote.GGSurviverNote:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/GGSurviverNote.GGSurviverNote:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_GGSurviverNote\"\nmsgid \"'I made this statue to give me shelter from the Cataclysm. Only magic can keep it away.'\"\nmsgstr \"“我做這個雕像是為了躲避大災難。只有魔法才能把它趕走。”\"\n\n#. Key:\t852F18354CA9C8D46192CBBD14A325F7\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/GGSurviverNote.GGSurviverNote:DlgNode_Speech_3.Text\n#. /Game/SO/Dialogues/Wizard/Chapter1/GGSurviverNote.GGSurviverNote:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/GGSurviverNote.GGSurviverNote:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_GGSurviverNote\"\nmsgid \"'Cerulean is still safe. I managed to steal the Gem to open the Gate but I can’t use it.'\"\nmsgstr \"“蔚藍之城還是安全的。我設法偷了那塊寶石來打開大門，但我不能用它。”\"\n\n#. Key:\tDF72F90C478E18CFE9211C85CEF9ECBF\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/GGSurviverNote.GGSurviverNote:DlgNode_Speech_4.Text\n#. /Game/SO/Dialogues/Wizard/Chapter1/GGSurviverNote.GGSurviverNote:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/GGSurviverNote.GGSurviverNote:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_GGSurviverNote\"\nmsgid \"'I am doomed.'\"\nmsgstr \"“我是命中註定的。”\"\n\n#. Key:\t04737EC246700D406DAB46BE8091D09C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_1.Children(0).Children.Text\n#. /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_1.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_1.Children(0).Children.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Sure\"\nmsgstr \"當然\"\n\n#. Key:\t09BB4D9F428A5390E5F2ABA019B3ACDC\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_34.Text\n#. /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_34.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_34.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Help you?! This is a courthouse not some charity club!\"\nmsgstr \"幫妳? ! 這是法院不是什麽慈善俱樂部！\"\n\n#. Key:\t0C7D87814BD76EAFE2DCB19B973F0D82\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_52.Text\n#. /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_52.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_52.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"You know I heavily rely on my abacus. But being a ghost and all I can’t really use it.\"\nmsgstr \"妳知道我非常依賴算盤。但作為壹個幽靈，我不能真正地使用它。\"\n\n#. Key:\t0E3535844D16D540C576AC9889D237C8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_9.Text\n#. /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"I’m looking for three artefacts. Do you know anything about them?\"\nmsgstr \"我在找三件工藝品。妳對它們有什麽了解嗎？\"\n\n#. Key:\t0EB00CBB41338DE6294D6EAC2DE999B4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_20.Text\n#. /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Actually it’s kinda awesome!\"\nmsgstr \"其實還挺棒的！\"\n\n#. Key:\t158F86F04D0040AA3D2814A674252E45\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_13.Text\n#. /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Returning again and again is not a crime but maybe we should reconsider the Law regarding this statement.\"\nmsgstr \"壹次又壹次的返回並不是犯罪，但是也許我們應該重新考慮關於這份聲明的法律。\"\n\n#. Key:\t15D395F84D3DBC3CCBC74988369A74DA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_27.Text\n#. /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_27.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_27.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"The Law says many things about being dad but nothing about being dead...\"\nmsgstr \"法律說了很多關於成為父親的內容，卻沒有提到死亡……\"\n\n#. Key:\t2487D3CC4FCE404BEC866287E2057B3F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_3.Text\n#. /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"I can’t rest until the Case is solved.\"\nmsgstr \"這個案子不解決我不能休息。\"\n\n#. Key:\t2D976CD148FB41389A53ED8E499822B4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_54.Text\n#. /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_54.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_54.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Could you get me a ghost abacus?\"\nmsgstr \"妳能給我拿個幽靈算盤嗎?\"\n\n#. Key:\t2F25CC2042D67E3AFB6F3FB5E1DF624D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_38.Text\n#. /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_38.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_38.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Sure whatever...\"\nmsgstr \"無所謂啦...\"\n\n#. Key:\t344253F4469C163E87496A97C193F0A8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_31.Text\n#. /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_31.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_31.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"If you found her please escort her to the Room of the Law so that her vicious acts can be judged.\"\nmsgstr \"如果妳找到了她，請把她帶到法務室去，這樣就可以對她的惡行進行審判。\"\n\n#. Key:\t34D243A343CDFEA68F2FAB88A4190464\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_5.Children(2).Children.Text\n#. /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_5.Children(2).Children.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_5.Children(2).Children.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"You are dead\"\nmsgstr \"妳已經死亡\"\n\n#. Key:\t367BD6CD40B7364D09A19A9F5F833937\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_8.Text\n#. /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Could you help me? I'm forced into this Realm by a Wizard.\"\nmsgstr \"妳能幫我嗎? 我是受壹個巫師所迫進入這個王國的。\"\n\n#. Key:\t3BD4BD5742532C2DB9536F9540EA3D75\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_32.Text\n#. /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_32.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_32.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Ah, even the World will be over sooner than all our cases.\"\nmsgstr \"啊，就連世界末日也會比我們所有的病例來得快。\"\n\n#. Key:\t45882C3C4470919D71E321BF5E1183B9\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_56.Text\n#. /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_56.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_56.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"I've made you a Ghost Abacus.\"\nmsgstr \"我給妳做了個幽靈算盤。\"\n\n#. Key:\t482C838F4E946005A3E4CAAB80DFE37F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_35.Text\n#. /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_35.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_35.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"And being a Wizard is strictly forbidden! If I manage to prove you have some connection with that criminal Wizard I will judge you as well!\"\nmsgstr \"而且做巫師是被嚴格禁止的！如果我能證明妳和那個邪惡的巫師扯上什麽關系，我也會審判妳的!\"\n\n#. Key:\t489CE6C840D8C3430F07FCBC8BAF3F6B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_23.Text\n#. /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_23.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_23.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"The Law never writes it would be forbidden to be a walking ball. Therefore it is not a problem.\"\nmsgstr \"法律從來沒有明確表示禁止會走路的球體。因此，這不是壹個問題。\"\n\n#. Key:\t512723AF4B51C5A843BEACBEA5427877\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_17.Text\n#. /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Staring like that is strictly forbidden!\"\nmsgstr \"那樣的凝視是被嚴格禁止的!\"\n\n#. Key:\t5215675A4B0974C8993858B9F5D6A404\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_1.Text\n#. /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"The Case of the Gnome traveller. A really complicated one.\"\nmsgstr \"地精旅行者的例子。非常復雜。\"\n\n#. Key:\t6922D9F143A5295C7C2D22A71EA4125B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_29.Text\n#. /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_29.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_29.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Makes sense...\"\nmsgstr \"言之有理。\"\n\n#. Key:\t74955E464A85ED006FF47894FD09BD28\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_4.Text\n#. Key:\tE7F9297B4FF3956A965042AA9D870A07\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_37.Text\n#. /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_4.Text\n#. /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_37.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_37.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"The Law says that.\"\nmsgstr \"法律是這麽說的。\"\n\n#. Key:\t74BCB9E04AB452BA2A11088F25DD2FED\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_2.Text\n#. /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"I guess they forgot to tell you but work time is long over...\"\nmsgstr \"我想他們忘記告訴妳了，但是工作時間已經結束了……\"\n\n#. Key:\t74F34750433EF722E89F8F85A871CE1B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_59.Text\n#. /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_59.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_59.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Take this as a reward!\"\nmsgstr \"把這個當作獎勵吧!\"\n\n#. Key:\t766B27FA455983F70AE1F4BA56F4C1B3\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_57.Text\n#. /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_57.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_57.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"How wondrous! I’m sure this will reduce my research time with years!\"\nmsgstr \"多麽奇妙！我相信這將減少我幾年的研究時間！\"\n\n#. Key:\t784D8662443EA775B9554EAEB4C6CB8F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_16.Text\n#. /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"You are guilty for bouncing too loudly! Just like my uncle...\"\nmsgstr \"妳因跳得太大聲而感到內疚！就像我叔叔……\"\n\n#. Key:\t791A095948CFB22CCAF59EAFC60D74EA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_0.SpeechSequence(1).SpeechSequence.Text\n#. /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_0.SpeechSequence(1).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_0.SpeechSequence(1).SpeechSequence.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"We had to reread all the rules to find out if there is anything about this.\"\nmsgstr \"我們得把所有的規定再讀壹遍，看看是否有什麽問題。\"\n\n#. Key:\t7CBAE1084FC39423BBD706A9F939BB14\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_6.Text\n#. /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"So what is this case you are working on?\"\nmsgstr \"妳在處理什麽案子?\"\n\n#. Key:\t7DBA70D14A4EDDE22DABBBB75800865A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_5.Children(3).Children.Text\n#. /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_5.Children(3).Children.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_5.Children(3).Children.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Help\"\nmsgstr \"幫助\"\n\n#. Key:\t7DDD963C45C30134FA79CEAA1834C270\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_1.Children(1).Children.Text\n#. /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_1.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_1.Children(1).Children.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"No way\"\nmsgstr \"沒門\"\n\n#. Key:\t7E1EAB78482CF915AF8A96BA8E0A47F1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_15.Text\n#. /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Just give me some more time and I will prove that you are guilty.\"\nmsgstr \"再給我壹些時間，我會證明妳是有罪的。\"\n\n#. Key:\t7E2FD8D443438BEFF933D1BA0F691A41\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_1.SpeechSequence(2).SpeechSequence.Text\n#. /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_1.SpeechSequence(2).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_1.SpeechSequence(2).SpeechSequence.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Such a tragic death! Now I need to start everything from the beginning!\"\nmsgstr \"多麽悲慘的死亡！現在我需要壹切從頭開始！\"\n\n#. Key:\t7EA289C94C6CF1E43AE0B291AD0A1133\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_30.Text\n#. /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_30.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_30.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Yes, she is a criminal for inhabiting the body of a cat. That is strictly forbidden!\"\nmsgstr \"是的，她是壹個居住在貓身上的罪犯。這是嚴格禁止的!\"\n\n#. Key:\t80596D1B4384F83D73655AB76B2FA2D0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_21.Text\n#. /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Incorrect. It is not.\"\nmsgstr \"錯，它不是。\"\n\n#. Key:\t81C42F5340469CBB4AD780B01E7F02F8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_5.Children(1).Children.Text\n#. /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_5.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_5.Children(1).Children.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Case\"\nmsgstr \"案件\"\n\n#. Key:\t830C84A74369239E2839638F8918E086\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_5.Children(4).Children.Text\n#. /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_5.Children(4).Children.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_5.Children(4).Children.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Artefacts\"\nmsgstr \"工藝品\"\n\n#. Key:\t9090EFE44CB8D7F54F996B970D9A97D2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_14.Text\n#. /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Don’t disturb me!\"\nmsgstr \"別打擾我！\"\n\n#. Key:\t90F79FAC440FB22F0A6BFCABE0963454\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_33.Text\n#. /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_33.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_33.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"That’s very likely.\"\nmsgstr \"這是很有可能的。\"\n\n#. Key:\t9600587D4E3C5B6F2C120BBFB9D40D6A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_22.Text\n#. /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"What?\"\nmsgstr \"什麽？\"\n\n#. Key:\t96945AA143EF1F1B7CE4C0B8EEE4096F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_51.Text\n#. /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_51.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_51.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"All right I was just asking. It’s not forbidden. At least in this case.\"\nmsgstr \"好吧，我只是問問。這並非禁止。至少在這種情況下是這樣。\"\n\n#. Key:\t970DBE99476C7799B4B803B2EECE7E95\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_7.Text\n#. /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"You are dead. Isn’t that a problem?\"\nmsgstr \"妳已經死了。這不是壹個問題嗎?\"\n\n#. Key:\t9B06B22F44D389959A3C99924145EAE7\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_10.Text\n#. /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Do you know a girl called Lillian?\"\nmsgstr \"妳認識壹個叫莉莉安的女孩嗎?\"\n\n#. Key:\t9C1B37574F81FDF4D3F03890504E3490\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_19.Text\n#. /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Well, to be honest it is.\"\nmsgstr \"嗯，說實話是這樣。\"\n\n#. Key:\t9EE15BCA450900DEFFB839856BA78E09\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_55.Text\n#. /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_55.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_55.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"I’ll see what I can do...\"\nmsgstr \"我看看我能做什麽……\"\n\n#. Key:\t9F3FBDE041EA6FDB7B30ECA1547E49A0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_0.SpeechSequence(3).SpeechSequence.Text\n#. /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_0.SpeechSequence(3).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_0.SpeechSequence(3).SpeechSequence.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"We almost finished the process when the Gnome Traveller died of waiting.\"\nmsgstr \"我們幾乎完成了這個過程，這時地精旅行者死於等待。\"\n\n#. Key:\tA22CEEE34864BC25EECFF2BAED83789F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_18.Children(0).Children.Text\n#. /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_18.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_18.Children(0).Children.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"It is\"\nmsgstr \"是的\"\n\n#. Key:\tA69BCEA14AD8A07AC8CC35871548973A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_5.Children(0).Children.Text\n#. /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_5.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_5.Children(0).Children.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Give Abacus\"\nmsgstr \"給予算盤\"\n\n#. Key:\tA7B9690142A3832182C004A99797AB21\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_26.Text\n#. /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_26.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_26.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"And how about being dead?\"\nmsgstr \"那麽死亡呢？\"\n\n#. Key:\tA7EDDDCF423FF086BC0D0A891D232C87\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_0.SpeechSequence(0).SpeechSequence.Text\n#. /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_0.SpeechSequence(0).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_0.SpeechSequence(0).SpeechSequence.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"He asked for permission to use the Railway. Which is really unusual. Before him only dwarves used the Railways.\"\nmsgstr \"他請求允許使用這條鐵路。這很不尋常。在他之前，只有地精使用鐵路。\"\n\n#. Key:\tA9FCBAD04E16A880C3E52AAA35864E35\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_11.Text\n#. /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Respect the Law!\"\nmsgstr \"尊重法律！\"\n\n#. Key:\tAA3210BC4B1C0875817CCDB5F4922AFA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_1.SpeechSequence(0).SpeechSequence.Text\n#. /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_1.SpeechSequence(0).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_1.SpeechSequence(0).SpeechSequence.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"It’s not that simple. In his testament he asked us to bring his corpse home, on the railway.\"\nmsgstr \"事情沒那麽簡單。在他的遺囑中，他要求我們把他的屍體坐鐵路帶回家。\"\n\n#. Key:\tAA9613C041229946AD0033806D77D398\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_49.Text\n#. /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_49.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_49.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"What can I do for you?\"\nmsgstr \"我能幫妳做什麽嗎？\"\n\n#. Key:\tB2D504404A8475C7EFB445AFDA8597A9\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_5.Children(6).Children.Text\n#. /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_5.Children(6).Children.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_5.Children(6).Children.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Leave\"\nmsgstr \"離開\"\n\n#. Key:\tB3A305B84320145E4C0437B7ED50C5B9\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_25.Text\n#. /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_25.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_25.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"The Law doesn’t forbid walking for balls. I guess you are right then.\"\nmsgstr \"法律並沒有禁止帶球行走。我想妳是對的。\"\n\n#. Key:\tB3E56D56494153D0C17355A59EC3F0E6\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_12.Text\n#. /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Rest... err... work in peace!\"\nmsgstr \"休息... 呃... 和平工作！\"\n\n#. Key:\tB69AD6FC4D8373491561CFBCF26C2397\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_1.SpeechSequence(3).SpeechSequence.Text\n#. /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_1.SpeechSequence(3).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_1.SpeechSequence(3).SpeechSequence.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Could you help me?\"\nmsgstr \"妳能幫幫我嗎？\"\n\n#. Key:\tBCFFF4F345E59362764C9AA6582C683C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_0.SpeechSequence(2).SpeechSequence.Text\n#. /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_0.SpeechSequence(2).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_0.SpeechSequence(2).SpeechSequence.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"When we found out there are none, so we needed to create new rules. But for that we had to reread all the existing rules again.\"\nmsgstr \"當我們發現沒有規則時，我們需要創建新的規則。但為此，我們必須重新閱讀現有的全部規則。\"\n\n#. Key:\tC5FDD0A14882D8F74A97B1BD53AFD4FE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_36.Text\n#. /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_36.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_36.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"I don’t. But keep in mind if they were stolen and you find them you have to give them to the Dwarven King.\"\nmsgstr \"我不喜歡。但要記住，如果他們被偷了，妳找到他們，妳必須把他們交給地精國王。\"\n\n#. Key:\tC81E287C4B4EF5B5E77E25A480FC2AEE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_18.Children(1).Children.Text\n#. /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_18.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_18.Children(1).Children.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Not at all\"\nmsgstr \"完全不是。\"\n\n#. Key:\tCCF4D5D04B8D4C57AAA75ABC5F9A1384\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_50.Text\n#. /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_50.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_50.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"No, no, no! I have other things to do.\"\nmsgstr \"不,不,不! 我還有別的事要做。\"\n\n#. Key:\tCD5EF4DE4D29CC774EB5A69A8A65CD95\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_5.Children(5).Children.Text\n#. /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_5.Children(5).Children.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_5.Children(5).Children.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Lillian\"\nmsgstr \"莉莉安\"\n\n#. Key:\tCFC9A6294B4D0653CA9B3384CBD2BC29\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_58.Text\n#. /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_58.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_58.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Thank you! Thank you!\"\nmsgstr \"謝謝！謝謝！\"\n\n#. Key:\tCFEFA4DD4AFEF91C834684A49DFB5890\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_39.Text\n#. /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_39.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_39.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"What crime did the Gnome commit?\"\nmsgstr \"地精犯了什麽罪？\"\n\n#. Key:\tD83C186746373C67E8877594AA3523B8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_53.Text\n#. /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_53.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_53.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"When I touch it my fingers slip past the abacus, I can’t move it.\"\nmsgstr \"當我觸摸它時，手指滑過算盤，我無法移動它。\"\n\n#. Key:\tE00518FA4279FE57E9640F9007E4BC35\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_44.Text\n#. /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_44.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_44.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"I would call that case solved...\"\nmsgstr \"我認為那個案子已經解決了…\"\n\n#. Key:\tE8F4BE4848BE2E257972D09391B0F296\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_1.SpeechSequence(1).SpeechSequence.Text\n#. /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_1.SpeechSequence(1).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_1.SpeechSequence(1).SpeechSequence.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"We decided that Gnomes can use the Railway, but how about Gnome Corpses? That’s a totally different issue.\"\nmsgstr \"我們的決定是地精可以使用鐵路，但是地精屍體怎麽辦呢? 那完全是兩個問題。\"\n\n#. Key:\tEB5B1E474DCFFCF9A38190B8FFAB7C50\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_28.Text\n#. /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"I guess the same rules apply.\"\nmsgstr \"我想同樣的規則也適用。\"\n\n#. Key:\tEB5BFBDC40E1D6A1D5C054AD8B6424FD\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_24.Text\n#. /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_24.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_24.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"Hmmm... Let me see...\"\nmsgstr \"嗯…讓我看看…\"\n\n#. Key:\tEF50A43049824F390D61A3A58D44185A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_18.Text\n#. /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_GhostDwarf\"\nmsgid \"And you are a walking ball. Isn’t that a problem?\"\nmsgstr \"妳是壹個行走的球。這不是壹個問題嗎?\"\n\n#. Key:\t01E5D5DE4524C5AECBE8DAA5A5C3047D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_111.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_111.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_111.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Fishy warns you! This path is dangerous! Turn back! Explore other places!\"\nmsgstr \"呆魚警告妳! 這條路很危險! 回頭! 探索其他地方!\"\n\n#. Key:\t036B0B0E41C74704A5ED648091D58AB0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_65.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_65.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_65.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Long story short I almost reached the Outpost when my cargo went into a pothole and my wheel was broken.\"\nmsgstr \"長話短說，當我幾乎到達前哨站的時候，我的貨物進入壹個洞穴，我的輪子也壞了。\"\n\n#. Key:\t03B6BE674D69EF12EB862EB77CDC7F57\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_97.Text\n#. Key:\t4475043D4A9CFD057ED34FBB9695EC86\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_113.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_97.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_113.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_113.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_97.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Then I will give it for 10 Gold Coins.\"\nmsgstr \"那我就出10枚金幣吧。\"\n\n#. Key:\t0405D11C4961CFB7941F0F9727F80EAD\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_108.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_108.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_108.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"9 Gold I won't go any lower!\"\nmsgstr \"9枚金幣，不能再低了！\"\n\n#. Key:\t069FA4C94559002699885EACD6422FC7\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_115.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_115.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_115.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Such an insult! How dare you?\"\nmsgstr \"這簡直就是侮辱！妳怎麽敢這樣？\"\n\n#. Key:\t114F9B9345D0965FE6EFC592E29477FE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_54.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_54.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_54.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Wohoo! I have some really epic names just for you! Each name costs a Single Gold coin!\"\nmsgstr \"哇噢！我有壹些非常棒的名字給妳! 每個名字價值壹枚金幣!\"\n\n#. Key:\t1164C89641A9E4970985919C8E86936E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(5).Children.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(5).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(5).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Help me?\"\nmsgstr \"幫助我？\"\n\n#. Key:\t11E01CA843185266C441ACBC460A5B06\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_39.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_39.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_39.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Do you really want to help me?\"\nmsgstr \"妳真的想幫我嗎?\"\n\n#. Key:\t12F669184834CDC0466BA4A72BE38420\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_4.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Oh, you come to visit old Gnory again.\"\nmsgstr \"哦，妳又來拜訪老格諾裏了。\"\n\n#. Key:\t148C738E422B1C7889EF8CAEF1E6D115\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(7).Children.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(7).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(7).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Lory\"\nmsgstr \"勞裏\"\n\n#. Key:\t14A787EF447C5AD6579ADDB271BD9B7E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_54.Children(2).Children.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_54.Children(2).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_54.Children(2).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Warlorb\"\nmsgstr \"軍閥\"\n\n#. Key:\t14F4A36B4D34364D1BBB2DAAFA745C41\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_SpeechSequence_0.SpeechSequence(1).SpeechSequence.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_SpeechSequence_0.SpeechSequence(1).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_SpeechSequence_0.SpeechSequence(1).SpeechSequence.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"I so hated them...\"\nmsgstr \"我非常討厭他們……\"\n\n#. Key:\t162A7A25421FFB9B368D60A9BC76FD38\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_15.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Oh, the three artefacts! That sounds a bit too ambitious but after all, they can be quite a unique gift for a young ball lady.\"\nmsgstr \"噢，三件工藝品! 這聽起來野心有點大了，但畢竟，對於壹個年輕的球球女士來說，這是壹份相當獨特的禮物。\"\n\n#. Key:\t166AAF5241332C7954631F9D568B227B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_46.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_46.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_46.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"For everything as well.\"\nmsgstr \"壹切都是如此。\"\n\n#. Key:\t19190B2142877E8CBB6F6D8FBB8D2DB1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_42.Text\n#. Key:\t39E546F34A9886487CD938A70468AEC6\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_59.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_42.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_59.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_42.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_59.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"What?\"\nmsgstr \"什麽？\"\n\n#. Key:\t1AF2DDE74542524EEF19CA9567CFBDAF\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_58.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_58.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_58.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"{name}? It still sounds a bit weird, but I think I might like it.\"\nmsgstr \"{name}? 聽起來還是有點怪，但我想我可能會喜歡的。\"\n\n#. Key:\t22D86B8644CA5BFD8D4CA593C5E3A271\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_54.Children(4).Children.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_54.Children(4).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_54.Children(4).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Dr. Ball\"\nmsgstr \"球博士\"\n\n#. Key:\t2301BDF7421BB3665BED5F92074BB5A2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_84.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_84.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_84.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"I’ve found a wheel for you!\"\nmsgstr \"我給妳找了個輪子！\"\n\n#. Key:\t25502F154A957ECD33B65E879E65B48B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_56.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_56.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_56.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"That's sad. Come back when you have some!\"\nmsgstr \"真是悲劇。當妳搞到壹些了記得再來！\"\n\n#. Key:\t27BF125B4C46E41F58FD45947F1F5CF8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_49.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_49.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_49.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Fishy is Fishy!\"\nmsgstr \"呆魚就是呆魚！\"\n\n#. Key:\t294C4DCC4E8A3A07F15BC8B8C1934BB0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_36.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_36.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_36.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"I've got to go now!\"\nmsgstr \"我得走了!\"\n\n#. Key:\t29EEF2B44C1FAE2BBA7518A685FC99B0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_13.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"An elixir that makes you attractive to the lady... err... balls?\"\nmsgstr \"讓妳能被那位女士...呃...球球吸引的靈丹妙藥。\"\n\n#. Key:\t2A8B24AE4D7C120048DEF2A76FD6D787\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(9).Children.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(9).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(9).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Leave\"\nmsgstr \"離開\"\n\n#. Key:\t2AC10A9B434CEADBA53C1F8C1DB0A26D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_41.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_41.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_41.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"I have some at my shop for sale!\"\nmsgstr \"我店裏有壹些在出售！\"\n\n#. Key:\t2FCB0CE9458F40E2B6738B93937283D2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_107.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_107.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_107.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"See? And I have to listen to him all day!\"\nmsgstr \"看到了嗎? 我整天都得聽他說話!\"\n\n#. Key:\t303548794492148A0C7CE9961AB48C77\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_92.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_92.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_92.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"It's yours for 12 Gold Coins.\"\nmsgstr \"這是妳的12枚金幣。\"\n\n#. Key:\t303B74844F6BC0691F880B970403BE91\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_106.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_106.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_106.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Then I will give it for 8 Gold Coins.\"\nmsgstr \"那麽我就用它換8枚金幣。\"\n\n#. Key:\t31FAEB004D0A1ED819BEF4BC369D9FD5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_51.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_51.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_51.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"I see one of your wagon wheels is broken.\"\nmsgstr \"我看到妳的壹個車輪壞了。\"\n\n#. Key:\t336F7E9E46DDE33326081E937EC0024A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_18.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Don’t care about Fishy. He can’t really speak and I’m not sure if he even understands himself.\"\nmsgstr \"不要在意呆魚。他不會說話，我都不確定他甚至是否能理解他自己。\"\n\n#. Key:\t339A52E04EF86F99DE9BCEAA78F29025\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_66.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_66.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_66.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"See you later!\"\nmsgstr \"回見！\"\n\n#. Key:\t34076BD4489E7C92D8DCB9BC1668B775\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_6.Text\n#. Key:\t5FC68B30456EA7BB5A381780426E2279\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_73.Text\n#. Key:\t89C71F00406C5A31D196B4994CEBBA22\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_50.Text\n#. Key:\t93A76F294E3B6B5AB77DD5A04E76F681\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_83.Text\n#. Key:\t9C69D11144FA077481C6C9865E6ED34A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_80.Text\n#. Key:\tA28EA457442D0820F3633A8ECACEDC75\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_76.Text\n#. Key:\tCC8A6DB3424E6813002643A97EFE6644\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_8.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_6.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_73.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_50.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_83.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_80.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_76.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_50.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_73.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_76.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_80.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_83.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Shut up Fishy!\"\nmsgstr \"閉嘴，呆魚！\"\n\n#. Key:\t365CB4EB4F04825B34F4ADB42F238552\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_85.Children(2).Children.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_85.Children(2).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_85.Children(2).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"12 Gold\"\nmsgstr \"12金幣\"\n\n#. Key:\t3E650BC4417E6A004AF4549F412B1AF4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_26.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_26.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_26.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Ehm, ehm...\"\nmsgstr \"嗯，嗯...\"\n\n#. Key:\t3E904B7D4D5694B715AC268086A4DB2F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_78.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_78.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_78.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"I’ve met another merchant called Lory. Is she your sister you talked about?\"\nmsgstr \"我見過另壹個叫勞裏的商人。她就是妳之前說起過的妹妹嗎？\"\n\n#. Key:\t3EB6AD0C4D8896D36393BE878D3D641E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_100.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_100.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_100.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"What the holy Coins?! Now I'm getting angry!\"\nmsgstr \"什麽神聖的硬幣?!  現在我要生氣了!\"\n\n#. Key:\t43099059444ABE91D004D5992065A06F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_7.Text\n#. Key:\t5A2D69454EA8354F3DE4E6BB9D7BD912\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_5.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_7.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"And Fishy!\"\nmsgstr \"還有呆魚！\"\n\n#. Key:\t43602C93451F3A59EB067ABF7A525D41\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_16.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Fishy know about them!\"\nmsgstr \"呆魚知道他們！\"\n\n#. Key:\t43C2553447FC63D25E26E79ACE5D7316\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_74.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_74.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_74.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"He was a good merchant, so he understood. Business is hard. I always say that for a fair price I would even sell myself.\"\nmsgstr \"他是個不錯的商人，所以他明白。生意不好做。為了壹個公平的價格，我甚至願意出售自己。\"\n\n#. Key:\t477984834246057BF894629ABEA2F0CB\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_116.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_116.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_116.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"You know what? 9 Gold Coins! Take it or leave it that's my final offer!\"\nmsgstr \"廢話少說，9金幣! 要不要隨妳，不要拉倒！\"\n\n#. Key:\t477CBB8C451F6255A8A4FAAE8272F700\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_54.Children(5).Children.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_54.Children(5).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_54.Children(5).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Don't buy\"\nmsgstr \"不購買\"\n\n#. Key:\t494F3D164E51E73CC76FD689BF2A4435\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_110.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_110.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_110.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Then I will give it for 9 Gold Coins.\"\nmsgstr \"那我就出9枚金幣。\"\n\n#. Key:\t4CBFFCE24BDAFBA592E846A4C6827F21\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_102.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_102.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_102.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"All right, you won. I will give it for 11 Gold Coins.\"\nmsgstr \"好吧，妳贏了。我願意用它換11枚金幣。\"\n\n#. Key:\t4D29AE254413D052D6FAA7AA259E2618\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_45.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_45.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_45.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"I see you do have a solution for everything.\"\nmsgstr \"我看妳對每件事都有解決的辦法。\"\n\n#. Key:\t4EACFFA1414DBB56AA162789D34C76F2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_61.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_61.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_61.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Wow, that's magnificent!\"\nmsgstr \"哇，那太棒了！\"\n\n#. Key:\t4F5CF94B464ED01AB43521A56D7C3B13\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_53.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_53.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_53.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"I want to buy a new name!\"\nmsgstr \"我想買個新名字！\"\n\n#. Key:\t51F2252D44A1B1B8B407938C06378303\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_19.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Fishy know a poem.\"\nmsgstr \"呆魚知道壹首詩！\"\n\n#. Key:\t540DEA6540589E8E9BD5789F708F1D95\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_85.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_85.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_85.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"How much do you charge for it?\"\nmsgstr \"妳開價多少?\"\n\n#. Key:\t551FA87F4EC33961257CFBA46B24E39C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_25.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_25.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_25.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Oh, holy golden coins please no...\"\nmsgstr \"哦，神聖的金幣，請不要……\"\n\n#. Key:\t55C0627D41EBB98609EDA49E36CE00F3\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_87.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_87.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_87.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Tummm-dummm I would sell the whole World but who could possibly buy it?\\r\\nUhhh... Yes?\"\nmsgstr \"我願意賣掉全世界，但誰會買呢?\\r\\n呃… ?\"\n\n#. Key:\t5977C80F49FF140CD397C1A3079F8A4C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_54.Children(1).Children.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_54.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_54.Children(1).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Ultimate Frisbee\"\nmsgstr \"極限飛盤\"\n\n#. Key:\t5D529690413CAE4F496DF4B7A3627528\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(6).Children.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(6).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(6).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Broken wheel?\"\nmsgstr \"破損的輪子\"\n\n#. Key:\t5D632016493E1D06116399A364FD3835\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_67.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_67.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_67.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Take care and don't spend Gold anywhere else!\"\nmsgstr \"保重，別把錢花在別的地方！\"\n\n#. Key:\t5F1DF4B44C4E82D6A5FDB6BDF5172AEA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_96.Text\n#. Key:\t9592C2144A7237D49EC42E898AB73642\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_105.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_96.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_105.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_105.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_96.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"How about 10?\"\nmsgstr \"10個如何？\"\n\n#. Key:\t6179A2AF43798114CFEE12900CDAF8CA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_60.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_60.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_60.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Good choice!\"\nmsgstr \"明智的選擇\"\n\n#. Key:\t6185906046DAF51843A52FA2FE2CF5AC\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_101.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_101.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_101.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"11 Gold Coins! Take it or leave it that's my final offer!\"\nmsgstr \"11個金幣！要不要隨妳，這是我最後的出價!\"\n\n#. Key:\t655C05DA44E2BCB7DCF0D38DFAD6182C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_21.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Let him tell the poem!\"\nmsgstr \"讓我來念這首詩吧！\"\n\n#. Key:\t68761B744A892F85CEDB19B8DD6D9649\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_SpeechSequence_0.SpeechSequence(2).SpeechSequence.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_SpeechSequence_0.SpeechSequence(2).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_SpeechSequence_0.SpeechSequence(2).SpeechSequence.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Then I found out there is a Dwarven Outpost here which is still populated.\"\nmsgstr \"然後我發現這裏有壹個地精前哨站，那裏仍然有人居住。\"\n\n#. Key:\t6D8190E2491C99D14C4E37AA8F01E0BC\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_28.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"In Crossroad Cave the three are close.\\r\\nThough where exactly? This poem shows:\\r\\nFor the first one you need to be restless\\r\\nTo avoid the Catacomb death traps.\\r\\nFor the second you need to go down\\r\\nDeep until you reach the ancient fisher town.\\r\\nFor the third one go high and even higher,\\r\\nKeep on til you reach the never sleeping fire.\\r\\n\"\nmsgstr \"在十字路口洞穴，三個人走得很近。\\r\\n那麽確切位置在哪裏? 這首詩表明:\\r\\n對於第壹個，妳需要不安\\r\\n為了避開地下墓穴的死亡陷阱。\\r\\n第二個，妳需要往下走\\r\\n直到妳到達古老的漁村。\\r\\n第三個更高，甚至更高，\\r\\n堅持下去，直到妳到達永不熄滅的火焰。\"\n\n#. Key:\t6F09C2F74E536AB6E4E7D8941571FBDF\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_20.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Sure. Shut up Fishy!\"\nmsgstr \"當然，閉嘴，呆魚！\"\n\n#. Key:\t720870EC444670FB23244D964497F883\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_SpeechSequence_1.SpeechSequence(1).SpeechSequence.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_SpeechSequence_1.SpeechSequence(1).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_SpeechSequence_1.SpeechSequence(1).SpeechSequence.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"However business is business. She is bad for business! Trading with my customers before they could get to me!\"\nmsgstr \"然而，生意就是生意。她壞了生意！她在顧客找到我之前就和他們交易！\"\n\n#. Key:\t757069804B91FF89516ACDA0C1F59C6A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_103.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_103.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_103.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Arrrgh! Fishy please no more poems! My head aches.\"\nmsgstr \"啊！呆魚啊！請不要再寫詩了！我的腦袋好痛。\"\n\n#. Key:\t75A193EA4F6A7EE92BA73D809247B1A1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_62.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_62.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_62.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Dr. who? Oh, see, Dr. Ball.\"\nmsgstr \"博士？誰？噢，我知道了，球博士。\"\n\n#. Key:\t75EADAAB4ACE4E6ECE45BFA6611ED77A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_85.Children(0).Children.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_85.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_85.Children(0).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"8 Gold\"\nmsgstr \"8金幣\"\n\n#. Key:\t7657DDE7438385D8BCC4B08B2BB5881A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_SpeechSequence_0.SpeechSequence(0).SpeechSequence.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_SpeechSequence_0.SpeechSequence(0).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_SpeechSequence_0.SpeechSequence(0).SpeechSequence.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"It all started when I was back with my family. Oh, those peaceful moments!\"\nmsgstr \"這壹切都是從我和家人在壹起的時候開始的。哦，那些平靜的時刻！\"\n\n#. Key:\t778E6A484D8669761018F38DF326C125\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_90.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_90.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_90.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"It's yours for 8 Gold Coins.\"\nmsgstr \"這是妳的8枚金幣換來的。\"\n\n#. Key:\t7A09AFFF435CC002F0B75989307D7791\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_9.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Well met dear err... traveler! How can a humble gnome merchant like me be at your service?\"\nmsgstr \"很好，親愛的……旅行者！像我這樣壹個卑微的地精商人怎麽能為妳效勞呢?\"\n\n#. Key:\t7E964EEC4406A06910B333A0F282360A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_70.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_70.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_70.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Sure! She is the lovely lady ball for whom you would like to buy a precious present, right?\"\nmsgstr \"當然！她就是那個妳想送貴重禮物的可愛球球女士，對嗎?\"\n\n#. Key:\t85D756624371CC3B3A37FC84C111DBB0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_54.Children(3).Children.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_54.Children(3).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_54.Children(3).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Sorbcerer\"\nmsgstr \"巫士\"\n\n#. Key:\t86C8F9B74B869FF4D34CF586AB5AC25E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_20.Children(1).Children.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_20.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_20.Children(1).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Shut up!\"\nmsgstr \"閉嘴！\"\n\n#. Key:\t8701305446A6E0F5E5EA5F86B823273D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_22.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Shut up both of you!\"\nmsgstr \"妳們兩個都閉嘴！\"\n\n#. Key:\t878BA65D462254D8A0FD36BA541E8C70\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_27.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_27.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_27.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"The three artefacts - by Fishy:\"\nmsgstr \"三件工藝品 - 呆魚制作：\"\n\n#. Key:\t8A136EF74C7DE15BFBC664B8447366F1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(2).Children.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(2).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(2).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"I need a name\"\nmsgstr \"我需要壹個名字\"\n\n#. Key:\t8C25603A4AE5F2D6294551AD2BA6322D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_40.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_40.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_40.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Of course! Are you lost in this hollow realm? Disappointed in all creature kind? Searching for a helpful hand? Not anymore!\"\nmsgstr \"當然! 妳是否迷失在這空洞和王國? 對所有生物都感到失望? 在找幫手嗎? 不了!\"\n\n#. Key:\t90F345C4482C46F4B1CD43B20F01B2B6\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_54.Children(0).Children.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_54.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_54.Children(0).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Epic Sphero\"\nmsgstr \"史詩球狀體\"\n\n#. Key:\t92F1D4A84B3609FDE38C82AD5A314554\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_72.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_72.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_72.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"And Fishy is the primitive monster.\"\nmsgstr \"呆魚是原始的怪物。\"\n\n#. Key:\t9574E444465834A7D15565A14C7E0F1D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_SpeechSequence_0.SpeechSequence(5).SpeechSequence.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_SpeechSequence_0.SpeechSequence(5).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_SpeechSequence_0.SpeechSequence(5).SpeechSequence.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"My sister sold my brother, so I had enough money to set out.\"\nmsgstr \"我姐姐把我哥哥賣了，所以我有足夠的錢出發了。\"\n\n#. Key:\t976FD7AB4B31747EF35E3EBE9C82471F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_69.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_69.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_69.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Do you know a girl called Lillian?\"\nmsgstr \"妳認識壹個叫莉莉安的女孩嗎?\"\n\n#. Key:\t9851A2064648DE26EF4501961D721109\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_68.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_68.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_68.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Wake up! He is back!\"\nmsgstr \"醒醒！他回來了！\"\n\n#. Key:\t99CDA18D43B5FC74E152888E674B743C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_30.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_30.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_30.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Let’s talk about something else.\"\nmsgstr \"我們談點別的吧。\"\n\n#. Key:\t9A5056F7472381107ACF5F849A322947\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_64.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_64.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_64.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Bye!\"\nmsgstr \"拜拜！\"\n\n#. Key:\t9B4816554539F6616741FC8A6651FEDD\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_SpeechSequence_1.SpeechSequence(2).SpeechSequence.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_SpeechSequence_1.SpeechSequence(2).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_SpeechSequence_1.SpeechSequence(2).SpeechSequence.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"I will tell her what I think about this that’s for sure!\"\nmsgstr \"我會告訴她我的想法，這是肯定的！\"\n\n#. Key:\t9FD161AC488FFD8D9C6BCAB518A6DFCA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_86.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_86.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_86.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Hello again!\"\nmsgstr \"哈嘍！\"\n\n#. Key:\t9FFADAA44EE730442CFD76BBD942F478\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_38.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_38.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_38.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Fare thee well!\"\nmsgstr \"珍重！\"\n\n#. Key:\tA0E3F7B44422A97F22E1FCB315DC498A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_48.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_48.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_48.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Who are you by the way?\"\nmsgstr \"順便問壹下，妳是誰?\"\n\n#. Key:\tA3EE773446B69B8D37851BAFAD607A9F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_24.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_24.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_24.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Forget your artefacts I have plenty of other valuable items instead!\"\nmsgstr \"忘了妳的工藝品吧，我還有很多其他值錢的東西呢！\"\n\n#. Key:\tA557A981439B7A1B4AA803941A8D6794\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_23.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_23.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_23.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"I guess you don’t know where they are...\"\nmsgstr \"我猜妳不知道他們在哪兒……\"\n\n#. Key:\tA571474F44F33104D2F93386A5C4009C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_75.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_75.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_75.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Yet no one ever wanted to buy him for a single copper coin.\"\nmsgstr \"然而，從來沒有人想用壹枚銅幣買他。\"\n\n#. Key:\tA67ADB3143798188EF7C1F8D4E59690C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_88.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_88.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_88.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Uhhh... Yes?\"\nmsgstr \"呃… 是嗎?\"\n\n#. Key:\tA69D35084A31B957410EF889ED0EC4A4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_57.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_57.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_57.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Yes, yes that's it!\"\nmsgstr \"是的，是的，就是這樣!\"\n\n#. Key:\tAD70372E4A5B0594635FBBBE30CA53F1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_91.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_91.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_91.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"It's yours for 10 Gold Coins.\"\nmsgstr \"這是妳用10枚金幣換來的。\"\n\n#. Key:\tAE2E742F4A087974019D8F810FF97A2E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_104.Children(0).Children.Text\n#. Key:\tB59E143642BBE2D677AA6F97B46C3C06\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_105.Children(0).Children.Text\n#. Key:\tF0726C6B4F8F780C341F319D08E20CF9\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_96.Children(0).Children.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_104.Children(0).Children.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_105.Children(0).Children.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_96.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_104.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_105.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_96.Children(0).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Ok\"\nmsgstr \"好的\"\n\n#. Key:\tAF7B14B241CED9B8BE3F23BC8C857A9A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_82.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_82.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_82.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Now you can imagine those peaceful moments when they were all together.\"\nmsgstr \"現在妳可以想象他們在壹起的那些平靜的時刻了。\"\n\n#. Key:\tB2F8DA594F1A58E8B2FCC7B16C368E21\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_2.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"What... uhhh... me?\"\nmsgstr \"什麽……呃… 我嗎?\"\n\n#. Key:\tBA5B75CD4087B53BB682CD97021FF821\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(3).Children.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(3).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(3).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Artefacts\"\nmsgstr \"工藝品\"\n\n#. Key:\tBBB67671475F19135DCD57AF771F0D85\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_43.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_43.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_43.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Helpful hands of course and all kind of stuffs. Equip yourself. Once you get rid of all your gold, you won’t be alone anymore...\"\nmsgstr \"依靠勤勞的雙手和各種各樣的東西。武裝妳自己。壹旦妳處理掉所有的金子，妳將不再孤單……\"\n\n#. Key:\tBD1AF6114DA5840A340F8DA65B7F59D2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_SpeechSequence_1.SpeechSequence(0).SpeechSequence.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_SpeechSequence_1.SpeechSequence(0).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_SpeechSequence_1.SpeechSequence(0).SpeechSequence.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Yes, she is my beloved sister!\"\nmsgstr \"是的，她是我親愛的姐姐！\"\n\n#. Key:\tBE8F496743A57B5F1AF81B8D48F128FE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_1.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Hello there!\"\nmsgstr \"哈嘍！\"\n\n#. Key:\tBFA7C31A4443A6C89DB61D8556D62FCD\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(0).Children.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(0).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Trade\"\nmsgstr \"交易\"\n\n#. Key:\tC29FF9914C8C1F479E9F7BAB338B067A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_77.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_77.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_77.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"If you could bring me a new wheel I would pay for it with shiny Gold coins!\"\nmsgstr \"如果妳能給我壹個新輪子，我願意用閃閃發光的金幣來買！\"\n\n#. Key:\tC5077FC14569C44087272C9E9DE07992\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_34.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_34.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_34.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Ok, I’ve got it.\"\nmsgstr \"好的，我知道了。\"\n\n#. Key:\tC6F3C52D4719CE471B6EEB90FCE94E3B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_55.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_55.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_55.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Unfortunately I don't have enough gold.\"\nmsgstr \"不幸的是我沒有足夠的金子。\"\n\n#. Key:\tCA1E8A5D4C07A81975C4B4B00572A0C8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_94.Text\n#. Key:\tDB9C0DB146BBE1DFC28F929A37C4408A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_93.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_94.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_93.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_93.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_94.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Ha-ha-ha! You must be kidding that's ridiculously high!\"\nmsgstr \"哈哈哈! 妳壹定是在開玩笑吧!\"\n\n#. Key:\tCB792FAD45F78755935423A5219271FC\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_98.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_98.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_98.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"9 Gold I won't go any higher!\"\nmsgstr \"9金幣 不能再高了！\"\n\n#. Key:\tCE99919C42EC2315EC5B33900FBC09C4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_95.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_95.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_95.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"That’s not fair. It would be a shame on me if I just robbed you like that!\"\nmsgstr \"這不公平。如果我那樣打劫妳，那將是我的恥辱！\"\n\n#. Key:\tD090388E4529CEC2D70899B520973064\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(4).Children.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(4).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(4).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Who are you?\"\nmsgstr \"妳是哪位？\"\n\n#. Key:\tD0AA81A247BE4979A774F3B6095BB820\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_33.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_33.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_33.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"I am Gnory, traveler merchant. I wander the world, seeking rare items, secrets beneath dark doors, revealing truth of forg...\"\nmsgstr \"我是格諾裏，旅行商人。我漫遊世界，尋找稀世珍寶，各種暗門下的秘密，並揭示真相……\"\n\n#. Key:\tD23C65EB4F39580A06045FADE2BCD713\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_81.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_81.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_81.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"She saw our Realm through cat eyes,\\r\\nThe living fire, the dead ice.\\r\\nShe cared, she took care of us all.\\r\\nWhat was ruined she made it whole.\\r\\nThen she left us, this is how it ended.\\r\\nHer own Realm also needed to be mended.\\r\\n\"\nmsgstr \"她通過貓眼看到了我們的王國，\\r\\n富有生命的火，冷冷的死冰。\\r\\n她關心我們，照顧我們所有人。\\r\\n她把壹切都毀了。\\r\\n然後她離開了我們，事情就這樣結束了。\\r\\n她自己的王國也需要修補。\"\n\n#. Key:\tD30843A14519A490FEE89E82E3CB6735\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_14.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"I’m looking for three artefacts.\"\nmsgstr \"我在找三件工藝品。\"\n\n#. Key:\tD9B70A6A453A11FD2115FFB25CCFF195\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_54.Children(6).Children.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_54.Children(6).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_54.Children(6).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Not enough gold\"\nmsgstr \"沒有足夠的金子\"\n\n#. Key:\tDB8982994F2BFF510A6A2EA1D40C68C6\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_37.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_37.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_37.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Good bye!\"\nmsgstr \"拜拜！\"\n\n#. Key:\tDC20CC924E5F898E715B668416678CA1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_104.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_104.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_104.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"How about 8?\"\nmsgstr \"8枚如何？\"\n\n#. Key:\tDC989DED42077EBA3313C69150BB33F0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_63.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_63.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_63.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"That's a weird name I have to admit.\"\nmsgstr \"我得承認這個名字很奇怪。\"\n\n#. Key:\tDEC95D494680878D544FF49DACBDEE4F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_114.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_114.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_114.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"11 Gold I won't go any lower!\"\nmsgstr \"11枚金幣，我不會再降價了！\"\n\n#. Key:\tDF7B371841495C5FB98800BCF44B7C5B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_52.Children(1).Children.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_52.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_52.Children(1).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Skip yack-yack\"\nmsgstr \"跳過\"\n\n#. Key:\tE1322541414052606F718FBF9B68D4B0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_79.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_79.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_79.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Fishy know her.\"\nmsgstr \"呆魚認識她。\"\n\n#. Key:\tE3D668304EE4C7C2E77F3E9AF47CB84E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_SpeechSequence_0.SpeechSequence(4).SpeechSequence.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_SpeechSequence_0.SpeechSequence(4).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_SpeechSequence_0.SpeechSequence(4).SpeechSequence.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Fortunately I had a loving family I could always count on. Since they are all merchants, they could easily help me out.\"\nmsgstr \"幸運的是，我有壹個可以依靠的充滿愛的家庭。既然他們都是商人，他們很容易就能幫到我。\"\n\n#. Key:\tE5031E774F81A45ECB4731BC114AD2E2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_109.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_109.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_109.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"All right, no need to get angry! I can give you 9 Gold for it.\"\nmsgstr \"好吧，沒必要生氣! 我可以給妳9個金幣。\"\n\n#. Key:\tEBE094644F9C8DCEE025FDBF8346AD47\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_44.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_44.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_44.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"...with your problem.\"\nmsgstr \"...妳的問題\"\n\n#. Key:\tEC93512B48219F6BA6DDF5A3F100C19A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_11.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Show me what you have for sale!\"\nmsgstr \"給我看看妳有什麽好賣的！\"\n\n#. Key:\tECF244164CDD4A29C96BBD8E13688FE7\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(1).Children.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(1).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Sell Wheel\"\nmsgstr \"售賣輪子\"\n\n#. Key:\tED410B224B09EFF36ED2AC9752AD59DA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_71.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_71.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_71.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"No, she is...\"\nmsgstr \"不，她是...\"\n\n#. Key:\tEDE4BF2D448CAFEF217C5E86885A7E81\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_117.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_117.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_117.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"All right, you won. I will give it for 9 Gold Coins.\"\nmsgstr \"好吧，妳贏了。我願意用它換9枚金幣。\"\n\n#. Key:\tEEA209E84766D4AF2BD804A7BA11F111\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_85.Children(1).Children.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_85.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_85.Children(1).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"10 Gold\"\nmsgstr \"10金幣\"\n\n#. Key:\tEEE19423423A24146446EEBEB04FAEE9\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_12.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"I’m on a quest to find...\"\nmsgstr \"我在尋找……\"\n\n#. Key:\tF53E6D3443D37DA82663D2976AA90A85\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_20.Children(0).Children.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_20.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_20.Children(0).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Poem?\"\nmsgstr \"詩？\"\n\n#. Key:\tF61EDE3940F24B15BE57D8B5A5AC5570\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_99.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_99.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_99.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Deal! Here you go!\"\nmsgstr \"成交！幹得好！\"\n\n#. Key:\tF6A527234B894C18C0778C918EB1BA4E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_89.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_89.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_89.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Welcome back!\"\nmsgstr \"歡迎歸來\"\n\n#. Key:\tF93CBC6640AF6143C7D1C5AA6F8C4ADF\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_52.Children(0).Children.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_52.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_52.Children(0).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Go on\"\nmsgstr \"繼續\"\n\n#. Key:\tF9EA93DE4B341581745785A7371F797A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(8).Children.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(8).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_10.Children(8).Children.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Lillian\"\nmsgstr \"莉莉安\"\n\n#. Key:\tFE3C4C72489A909B4D9F76A483D293AE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_SpeechSequence_0.SpeechSequence(3).SpeechSequence.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_SpeechSequence_0.SpeechSequence(3).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_SpeechSequence_0.SpeechSequence(3).SpeechSequence.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"This was my chance to make a hit as a merchant but I didn’t have the resources for a journey this long.\"\nmsgstr \"這是我成為壹個成功商人的機會，但我沒有足夠的資源來維持這麽長的路。\"\n\n#. Key:\tFEF58E5B4FB18D128640689499752F75\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_29.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_29.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_29.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"Do you call this a poem? Pathetic! Hardly any info and what a miserable structure! Shame on you Fishy!\"\nmsgstr \"妳把這叫做詩嗎? 簡直可悲! 幾乎沒有任何信息，多麽糟糕的結構! 太可恥了!\"\n\n#. Key:\tFF66071643E10E94DEFF70B8E20876EE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_52.Text\n#. /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_52.Text\n#: /Game/SO/Dialogues/Chapter2/Gnory.Gnory:DlgNode_Speech_52.Text\nmsgctxt \"Dialogue_Gnory\"\nmsgid \"That's a long and sad story...\"\nmsgstr \"這是壹個漫長而悲傷的故事……\"\n\n#. Key:\t1EA717114DFEF4490F58829C2F96566A\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/HW_Candlestick.HW_Candlestick:DlgNode_Speech_3.Text\n#. /Game/SO/Dialogues/Ending/E2/HW_Candlestick.HW_Candlestick:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E2/HW_Candlestick.HW_Candlestick:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_HW_Candlestick\"\nmsgid \"Even after mom passed the servants kept lighting the candles.\"\nmsgstr \"甚至在母親離開之後，仆人們還不停地點蠟燭。\"\n\n#. Key:\t94195B6E4157A1A8BD74BE9224AEED42\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/HW_Candlestick.HW_Candlestick:DlgNode_Speech_2.Text\n#. /Game/SO/Dialogues/Ending/E2/HW_Candlestick.HW_Candlestick:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E2/HW_Candlestick.HW_Candlestick:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_HW_Candlestick\"\nmsgid \"After Mom got sick she really feared darkness.\"\nmsgstr \"母親生病後真的很怕黑。\"\n\n#. Key:\tEF9668BF44D4A52E46ACEA8B82011137\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/HW_Candlestick.HW_Candlestick:DlgNode_Speech_1.Text\n#. /Game/SO/Dialogues/Ending/E2/HW_Candlestick.HW_Candlestick:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Ending/E2/HW_Candlestick.HW_Candlestick:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_HW_Candlestick\"\nmsgid \"We always needed to light the hallway.\"\nmsgstr \"我們總是需要照亮長廊。\"\n\n#. Key:\t2EECB3024693C7F0EA176BB100D6779A\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/HW_Exit.HW_Exit:DlgNode_Speech_3.Text\n#. /Game/SO/Dialogues/Ending/E2/HW_Exit.HW_Exit:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E2/HW_Exit.HW_Exit:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_HW_Exit\"\nmsgid \"This door was really rusty.\"\nmsgstr \"這扇門真的生銹了。\"\n\n#. Key:\t3C6E4A1C41A7EACE15C101A65BBE997A\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/HW_Exit.HW_Exit:DlgNode_Speech_4.Text\n#. /Game/SO/Dialogues/Ending/E2/HW_Exit.HW_Exit:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Ending/E2/HW_Exit.HW_Exit:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_HW_Exit\"\nmsgid \"I had to do something with it otherwise Father would have heard me.\"\nmsgstr \"我必須做點什麽，否則父親會聽到的。\"\n\n#. Key:\t8F63CC8C44D8F8432A66E6B65EC10AF5\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/HW_Exit.HW_Exit:DlgNode_Speech_2.Text\n#. /Game/SO/Dialogues/Ending/E2/HW_Exit.HW_Exit:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E2/HW_Exit.HW_Exit:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_HW_Exit\"\nmsgid \"I used oil on this rusty door. I didn’t want to be heard.\"\nmsgstr \"我在這扇生銹的門上塗了油。我不想被人聽到聲音。\"\n\n#. Key:\t55E7DD2B4C3D8852EC4A64AF44443BDA\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/HW_Explosion.HW_Explosion:DlgNode_Speech_1.Text\n#. /Game/SO/Dialogues/Ending/E1/HW_Explosion.HW_Explosion:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Ending/E1/HW_Explosion.HW_Explosion:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_HW_Explosion\"\nmsgid \"What was this? I have to go back to check what happened!\"\nmsgstr \"這是什麽? 我得回去看看發生了什麽事!\"\n\n#. Key:\t8060689940824917F595BF84B4E95A46\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/HW_FRDoor.HW_FRDoor:DlgNode_Speech_3.Text\n#. /Game/SO/Dialogues/Ending/E2/HW_FRDoor.HW_FRDoor:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E2/HW_FRDoor.HW_FRDoor:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_HW_FRDoor\"\nmsgid \"I always wondered why.\"\nmsgstr \"我壹直想知道為什麽。\"\n\n#. Key:\t816B603341386CF6BB3ADCAAD21D68A3\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/HW_FRDoor.HW_FRDoor:DlgNode_Speech_2.Text\n#. /Game/SO/Dialogues/Ending/E2/HW_FRDoor.HW_FRDoor:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E2/HW_FRDoor.HW_FRDoor:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_HW_FRDoor\"\nmsgid \"Father moved to his workroom and sealed this door.\"\nmsgstr \"父親搬到他的工作室，把這扇門封上。\"\n\n#. Key:\t125DACD243EA6EBCE76D8CB9F681C727\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/HW_MRDoor.HW_MRDoor:DlgNode_Speech_3.Text\n#. /Game/SO/Dialogues/Ending/E2/HW_MRDoor.HW_MRDoor:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E2/HW_MRDoor.HW_MRDoor:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_HW_MRDoor\"\nmsgid \"I felt I should have a last look before I go.\"\nmsgstr \"我覺得我應該在走之前再看壹眼。\"\n\n#. Key:\tE8250D43437C1B1D45637F9499D20936\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/HW_MRDoor.HW_MRDoor:DlgNode_Speech_2.Text\n#. /Game/SO/Dialogues/Ending/E2/HW_MRDoor.HW_MRDoor:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E2/HW_MRDoor.HW_MRDoor:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_HW_MRDoor\"\nmsgid \"Mom’s room looked just like it was when she was still alive.\"\nmsgstr \"母親的房間看起來就像她還活著的時候壹樣。\"\n\n#. Key:\tE0BB63A74E94DA1B327B11BB781EB4DB\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/HW_Painting.HW_Painting:DlgNode_Speech_2.Text\n#. /Game/SO/Dialogues/Ending/E2/HW_Painting.HW_Painting:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E2/HW_Painting.HW_Painting:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_HW_Painting\"\nmsgid \"Mom made this painting before she met Father.\"\nmsgstr \"母親在遇到父親之前就畫了這幅畫。\"\n\n#. Key:\tEAD0C13D4BF1D35BDAEC14A3F25901F5\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/HW_Stairs.HW_Stairs:DlgNode_Speech_2.Text\n#. /Game/SO/Dialogues/Ending/E2/HW_Stairs.HW_Stairs:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E2/HW_Stairs.HW_Stairs:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_HW_Stairs\"\nmsgid \"I had to go really softly otherwise Father would have heard me.\"\nmsgstr \"我必須輕輕地走，否則父親會聽見的。\"\n\n#. Key:\t0494D36047DDCE114A43C9901618D32B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_44.Text\n#. /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_44.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_44.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Unfortunately I don't know where you can find them.\"\nmsgstr \"不幸的是，我不知道妳在哪裏可以找到他們。\"\n\n#. Key:\t0C3E31854B0EB053EABAD4B9DC3D8E60\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_57.Text\n#. /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_57.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_57.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"That’s a serious threat, I have to admit.\"\nmsgstr \"我不得不承認，這是壹個嚴重的威脅。\"\n\n#. Key:\t0C7C89EB4E610752FBE119AA32B99F8B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_34.Text\n#. /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_34.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_34.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Yes I know her. She couldn’t come here so she sent her cat.\"\nmsgstr \"是的，我認識她。她不能來這裏，所以她派了她的貓來。\"\n\n#. Key:\t0EDE363848C05F39DE478DA7A559CF54\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_17.Text\n#. /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Could you bring them to me?\"\nmsgstr \"妳能給我拿過來嗎?\"\n\n#. Key:\t1A914576488DA1393ED641B9F315ABC6\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_53.Text\n#. Key:\t20DA5C2F49DCFADF17F1C983103C0D98\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_29.Text\n#. /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_53.Text\n#. /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_29.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_29.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_53.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Thanks!\"\nmsgstr \"多謝！\"\n\n#. Key:\t1E7EE16F451CAB1193F0B8B3939273AA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_62.Text\n#. /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_62.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_62.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"I managed to defeat one group of the monsters.\"\nmsgstr \"我設法打敗了壹群怪物。\"\n\n#. Key:\t1F5BE4154412819180B1CA92E5B69377\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(6).Children.Text\n#. /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(6).Children.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(6).Children.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Artefacts\"\nmsgstr \"工藝品\"\n\n#. Key:\t1FE89B7045E586E988BEC18B06BEEBDB\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(1).Children.Text\n#. /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(1).Children.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Purple Mushroom\"\nmsgstr \"紫色蘑菇\"\n\n#. Key:\t208B21DE484E3FE42C9978927BC91E78\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_51.Text\n#. /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_51.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_51.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Uh... this was impressive!\"\nmsgstr \"嗯... 真讓人印象深刻！\"\n\n#. Key:\t27DF1ABB483B5073D8C87DB48EF2613F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_70.Text\n#. /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_70.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_70.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Well done!\"\nmsgstr \"幹得好！\"\n\n#. Key:\t2892242A4E74642813A30CBAE853B674\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_27.Text\n#. /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_27.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_27.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Anyway, if you give my Coin back I will apologize.\"\nmsgstr \"不管怎樣，如果妳把我的硬幣還給我，我就道歉。\"\n\n#. Key:\t290F9EE34FA4EA41FE963CA61358D23B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_49.Text\n#. /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_49.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_49.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"In theory if I add this to the soup...\"\nmsgstr \"理論上，如果我把這個加到湯裏…\"\n\n#. Key:\t3015DA144833F0401BADE8B5E5F93BA8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_26.Text\n#. /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_26.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_26.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Huh! Do you think chests are only there so that you can loot them?\"\nmsgstr \"哈! 妳認為箱子在那裏只是為了讓妳可以搶劫嗎?\"\n\n#. Key:\t331D8B314DAF15CD7E343BB7459927DD\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_22.Text\n#. /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Give back my Coin!\"\nmsgstr \"把硬幣還給我！\"\n\n#. Key:\t345BD57D40E09C73044BB981798E2449\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_43.Text\n#. /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_43.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_43.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Purple Mushrooms. That’s the only mushroom which is purple. You can’t miss it.\"\nmsgstr \"紫色蘑菇。這是唯壹的紫色蘑菇。妳不會錯過的。\"\n\n#. Key:\t34B1483D4F1C580BB8DB61BEEBC5BC0F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_20.Text\n#. /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"I saw that you opened my chest!\"\nmsgstr \"我看到妳打開了我的箱子！\"\n\n#. Key:\t35DBF2874748AFCC34A3FAAC083EF9A0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_1.SpeechSequence(3).SpeechSequence.Text\n#. /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_1.SpeechSequence(3).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_1.SpeechSequence(3).SpeechSequence.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"We had the key of the Ancient Temple. According to our prophecies that will fall to Ruin last.\"\nmsgstr \"我們有那座古廟的鑰匙。根據我們的預言，這將會是最後的毀滅。\"\n\n#. Key:\t35FB567B4B09545830D61F84869FC7E7\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_28.Text\n#. /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Here you go!\"\nmsgstr \"幹得好！\"\n\n#. Key:\t3AAE79234A4BD2F8BCA5F790D5E5D84B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_45.Text\n#. /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_45.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_45.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"No problem. If I ever find one I will bring it to you.\"\nmsgstr \"沒有問題。如果我找到了，我會給妳帶來的。\"\n\n#. Key:\t3AE46C894A0CD8F1AA049CB9970D65F3\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_12.Text\n#. /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"I’m the chef and I’m making a soup.\"\nmsgstr \"我是廚師，我正在做湯。\"\n\n#. Key:\t3BB405034447D1C80B99A5A23AFC98FC\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_5.Text\n#. /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"I know you are already hungry but the soup is not yet ready.\"\nmsgstr \"我知道妳已經餓了，但湯還沒做好。\"\n\n#. Key:\t406361704988AD9ABD5DA4AF946451F2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_37.Text\n#. /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_37.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_37.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"In return Lillian drew pictures for my tales.\"\nmsgstr \"作為回報，莉莉安把我的故事畫了下來。\"\n\n#. Key:\t4152700A419F5AE41362D09E21835D98\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_46.Text\n#. /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_46.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_46.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"I already have some...\"\nmsgstr \"我已經有壹些……\"\n\n#. Key:\t4355EB74402DDFD5FF8697B1911593E8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_56.Text\n#. /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_56.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_56.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"I won’t. And I won’t talk to you either.\"\nmsgstr \"我不會的。我也不跟妳說話。\"\n\n#. Key:\t43C4F54B4ABBBB13E129148D9AF04976\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(4).Children.Text\n#. /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(4).Children.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(4).Children.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Village\"\nmsgstr \"村莊\"\n\n#. Key:\t4614DBA24F54CB29C92BA9894849CC39\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_1.SpeechSequence(1).SpeechSequence.Text\n#. /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_1.SpeechSequence(1).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_1.SpeechSequence(1).SpeechSequence.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Long ago we lived in peace and respected the ancestors. Even though they caused the Cataclysm.\"\nmsgstr \"很久以前，我們生活在和平之中，並尊重祖先。即使他們造成了大災難。\"\n\n#. Key:\t4687EF7A45E5FC200C806AB829C64D78\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_8.Text\n#. /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Is this a village? Where are the others?\"\nmsgstr \"這是壹個村莊嗎? 其他人在哪兒?\"\n\n#. Key:\t586F6370480889F551923A97FFF5E89C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_0.SpeechSequence(3).SpeechSequence.Text\n#. /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_0.SpeechSequence(3).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_0.SpeechSequence(3).SpeechSequence.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"They enslaved all the other tribes and forbid us to do our rituals.\"\nmsgstr \"他們奴役了所有其他部落，並禁止我們舉行儀式。\"\n\n#. Key:\t5BCF2C5D4CE9AD6AB4A09DB510BA2039\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_6.Text\n#. /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"You again? Take a seat until the soup is ready!\"\nmsgstr \"又是妳？拿把椅子坐好，等著湯完成吧！\"\n\n#. Key:\t63B9B304450B276F0EC714B43A25F09D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_10.Text\n#. /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"I’m looking for three artefacts. Do you know something about them?\"\nmsgstr \"我在找三件工藝品。妳對它們有什麽了解嗎？\"\n\n#. Key:\t63C0EC124C1B42B5C5FD1F95B23B9155\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_65.Text\n#. /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_65.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_65.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Take this! You deserve it.\"\nmsgstr \"拿著這個！這是妳應得的。\"\n\n#. Key:\t69E0738B489315662A55DA98EAC542E6\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_0.SpeechSequence(4).SpeechSequence.Text\n#. /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_0.SpeechSequence(4).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_0.SpeechSequence(4).SpeechSequence.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"They used this village to produce Fishy slaves.\"\nmsgstr \"他們用這個村子來生產呆魚奴隸。\"\n\n#. Key:\t6CBCFFEB48FF8E0D97AAE4B1CB19CB52\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_22.Children(0).Children.Text\n#. /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_22.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_22.Children(0).Children.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Give back\"\nmsgstr \"歸還\"\n\n#. Key:\t6EACCB4D4D91AF29F6452E81E4C01B57\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_32.Text\n#. /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_32.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_32.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"I see you have a lot of things here. Do you have something for sale?\"\nmsgstr \"我看到妳這裏有很多東西。妳有什麽東西要賣嗎?\"\n\n#. Key:\t7164FF5D440BCEF18CAC7E9104A324CF\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_18.Text\n#. /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"I've got to go now!\"\nmsgstr \"我得走了!\"\n\n#. Key:\t75A92D46421FC2601A13B4BBE9BA4D11\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_54.Text\n#. /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_54.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_54.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Er... I don’t have it. But I will get it back I promise!\"\nmsgstr \"呃… 我沒有。但我會把它拿回來的，我保證!\"\n\n#. Key:\t761F5734479CFA197266F382FD0A6452\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_23.Text\n#. /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_23.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_23.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"I’m sorry, I didn’t know it was yours. There are chests like yours everywhere.\"\nmsgstr \"對不起，我不知道是妳的。像這樣的箱子到處都有。\"\n\n#. Key:\t7D87C5064D739F1EFF23AF8264E83235\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_16.Text\n#. /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Well, this morning. But there are some very special ingredients which make the cook time way shorter.\"\nmsgstr \"嗯, 今天早上。但是有壹些非常特殊的食材可以縮短烹飪時間。\"\n\n#. Key:\t806AEB764A6118D4CBE9CCA71E98EF10\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_72.Text\n#. /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_72.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_72.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Have no fear, I'll do it.\"\nmsgstr \"別怕，我來做。\"\n\n#. Key:\t80B60CA848D3C71B72514AAC976C3910\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_14.Text\n#. /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Yes, the soup! A very special recipe. It takes years to finish.\"\nmsgstr \"是的, 就是湯！非常特別的食譜。需要數年才能完成。\"\n\n#. Key:\t8437D72C44494DE499E528A67B36A123\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_58.Text\n#. /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_58.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_58.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Ah, it's you again.\"\nmsgstr \"啊，又是妳。\"\n\n#. Key:\t885F9FDB498EC13B81E22580D33309F3\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(5).Children.Text\n#. /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(5).Children.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(5).Children.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Kobolds\"\nmsgstr \"地精\"\n\n#. Key:\t8A6043D64FB7B61AF4D553A62D27229C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_36.Text\n#. /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_36.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_36.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Every time the cat came I told him a tale about the ancestors.\"\nmsgstr \"每次貓來的時候，我就給它講壹個關於祖先的故事。\"\n\n#. Key:\t8B29FD7342676763EF53ACBB0677A1A4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_4.Text\n#. /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"The soup still needs time.\"\nmsgstr \"湯還需要時間。\"\n\n#. Key:\t8E0F057044AE753D63AA23847B146662\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_67.Text\n#. /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_67.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_67.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"This is yours.\"\nmsgstr \"這是妳的。\"\n\n#. Key:\t8E4C4FB846539DD46577B490846383F1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_1.SpeechSequence(2).SpeechSequence.Text\n#. /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_1.SpeechSequence(2).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_1.SpeechSequence(2).SpeechSequence.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"We decided to keep their knowledge in our rituals.\"\nmsgstr \"我們決定在我們的儀式中保留他們的知識。\"\n\n#. Key:\t9132C2D24A241722115FD5ADB46B3145\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_15.Text\n#. /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"And when did you start?\"\nmsgstr \"妳什麽時候開始的?\"\n\n#. Key:\t958CE12E48F89AE79E5ED9A4FC4AF6E7\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_48.Text\n#. /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_48.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_48.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"That's wonderful!\"\nmsgstr \"太棒了！\"\n\n#. Key:\t96E5FBCB4795EC1ADACEC7B6D814BD79\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(8).Children.Text\n#. /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(8).Children.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(8).Children.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Lillian\"\nmsgstr \"莉莉安\"\n\n#. Key:\t9845BDB549EF25B9F5C11981123A5CCE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_33.Text\n#. /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_33.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_33.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"You know I’m not really a trader but I might sell you some of them.\"\nmsgstr \"妳知道我不是壹個真正的交易者，但我可能會賣給妳壹些。\"\n\n#. Key:\t9A420B814A1C1762130310AE90157BFD\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_31.Text\n#. /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_31.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_31.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"No, I’m sorry.\"\nmsgstr \"不，我很抱歉。\"\n\n#. Key:\t9D8511F94E19183355A5CC8CE5B562E8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_61.Text\n#. /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_61.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_61.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"That would be great. I appreciate your kindness.\"\nmsgstr \"那太好了。謝謝妳的好意。\"\n\n#. Key:\t9F2DE60B405A15F2BFB8409D162B42FD\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(3).Children.Text\n#. /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(3).Children.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(3).Children.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Soup\"\nmsgstr \"湯\"\n\n#. Key:\tA53CDF2A4D9A582DD163C7B6D3DCE334\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_55.Text\n#. /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_55.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_55.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Come back when you have my Coin.\"\nmsgstr \"妳拿了我的硬幣就回來。\"\n\n#. Key:\tA734229B44743F88ED135FB692B9C956\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_11.Text\n#. /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Do you know a girl called Lillian?\"\nmsgstr \"妳認識壹個叫莉莉安的女孩嗎?\"\n\n#. Key:\tA88F63334DD550FE9955A3A65B87ACDA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_63.Text\n#. /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_63.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_63.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"I banished some of the monsters.\"\nmsgstr \"我驅逐了壹些怪物。\"\n\n#. Key:\tA8B5BE484641EBB61B1168AE798DABF5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_7.Text\n#. /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"So you are making soup...\"\nmsgstr \"妳在做湯……\"\n\n#. Key:\tAAE2E35045B8E0DF8A11BF8BC84A11EF\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_0.SpeechSequence(1).SpeechSequence.Text\n#. /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_0.SpeechSequence(1).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_0.SpeechSequence(1).SpeechSequence.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Every year we made a pilgrimage to the Ancient Temple to express our respect to the ancestors.\"\nmsgstr \"每年我們都去古廟朝拜，以表達我們對祖先的尊敬。\"\n\n#. Key:\tAC26EB6F49B026C3E768398FA0A445CB\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_50.Text\n#. /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_50.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_50.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"then...\"\nmsgstr \"然後...\"\n\n#. Key:\tADE8569E4FC2DCB097FF3FA4B9A0A970\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_40.Text\n#. /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_40.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_40.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Why not? What do you need?\"\nmsgstr \"為什麽不呢? 妳需要什麽?\"\n\n#. Key:\tAE35D91D450D0414FA5F54B71E359511\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(2).Children.Text\n#. /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(2).Children.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(2).Children.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Who are you?\"\nmsgstr \"妳是哪位？\"\n\n#. Key:\tAE387E9846A9C5A56569179359AD941C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_42.Text\n#. /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_42.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_42.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"All right! I was just asking...\"\nmsgstr \"好吧！我就是問問...\"\n\n#. Key:\tAF3D9214401FEEE552256A8BAE5F8E77\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_1.SpeechSequence(4).SpeechSequence.Text\n#. /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_1.SpeechSequence(4).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_1.SpeechSequence(4).SpeechSequence.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"But now Kobolds are wrathful. They make wars. They don’t respect anyone.\"\nmsgstr \"但現在地精是憤怒的。他們制造了戰爭。他們不尊重任何人。\"\n\n#. Key:\tB06407B04855D558D1DB6B9A9A4E0B84\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_1.SpeechSequence(0).SpeechSequence.Text\n#. /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_1.SpeechSequence(0).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_1.SpeechSequence(0).SpeechSequence.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Kobolds are no longer good.\"\nmsgstr \"地精的人設崩塌了！\"\n\n#. Key:\tB082CC4B405800544484B4B0C8A25762\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_41.Text\n#. /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_41.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_41.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"No way!\"\nmsgstr \"沒門！\"\n\n#. Key:\tB35F443641A7626AE4552F8D1045A95F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_38.Text\n#. /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_38.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_38.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"I liked them very much.\"\nmsgstr \"我非常喜歡他們。\"\n\n#. Key:\tB40C1B9948722A549DBC45A1D9C277C0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_24.Text\n#. /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_24.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_24.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"I don’t want to leave my kitchen.\"\nmsgstr \"我不想離開我的廚房。\"\n\n#. Key:\tB71FB3424C74B68E4B9CF9AF3828F867\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_64.Text\n#. /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_64.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_64.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"I think I banished all the monsters.\"\nmsgstr \"我想我驅逐了所有的怪物。\"\n\n#. Key:\tB79F2026493F53FE90BABB987370695D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_21.Text\n#. /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"What do you think honestly? You can just rob me and then come to have a chat?!\"\nmsgstr \"妳是怎麽想的? 妳可以在搶劫了我之後再來找我聊天?!\"\n\n#. Key:\tB7B8A9294FA8D3754BB4CDA897B696BA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_69.Text\n#. /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_69.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_69.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Great. The lake is already more peaceful.\"\nmsgstr \"太好了。湖面基本恢復了平靜。\"\n\n#. Key:\tB9C3EC7342B52C04A491FF9AE87ABB42\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_0.SpeechSequence(0).SpeechSequence.Text\n#. /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_0.SpeechSequence(0).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_0.SpeechSequence(0).SpeechSequence.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"This was the Village of my tribe. We lived here in peace.\"\nmsgstr \"這是我們部落的村莊。我們在這裏的生活很平靜。\"\n\n#. Key:\tBB45D70A4F2AF94BA7FCC9B3141FB98F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_17.Children(0).Children.Text\n#. /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_17.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_17.Children(0).Children.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Accept\"\nmsgstr \"接受\"\n\n#. Key:\tC297D79246A0792DCA2CA9AD693C3A55\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_13.Text\n#. /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"That’s all.\"\nmsgstr \"就這些。\"\n\n#. Key:\tC375726140A40243E29115B58048025E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_52.Text\n#. /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_52.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_52.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Hmm... it’s delicious. Here take some!\"\nmsgstr \"嗯... 太美味了。這兒也來壹些！\"\n\n#. Key:\tC8BC1F254B61D749D62D4B9210DA1891\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_1.Text\n#. /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"If you came for soup you will need to wait a bit more!\"\nmsgstr \"如果妳是來喝湯的，妳需要多等壹會兒!\"\n\n#. Key:\tCB607C4842DF3781F8B6C9AB1A7D31F1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_19.Text\n#. /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Where is my Coin?\"\nmsgstr \"我的硬幣在哪兒？\"\n\n#. Key:\tCE80654A43078EA1E53C5E9C5114DE54\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_60.Text\n#. /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_60.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_60.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"I can help you banish the monsters around the lake.\"\nmsgstr \"我可以幫妳趕走湖邊的怪物。\"\n\n#. Key:\tD1412BF6490EA9357CE9F7A873B1FCAC\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_35.Text\n#. /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_35.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_35.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"She was really curious about our rituals.\"\nmsgstr \"她對我們的儀式很好奇。\"\n\n#. Key:\tD76CDC9F410E2BCC21BCFB8D0D8A9E97\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_47.Text\n#. /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_47.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_47.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"I’ve found some Purple Mushroom!\"\nmsgstr \"我找到壹些紫色蘑菇！\"\n\n#. Key:\tD87335EA45EAC6F84022FEBE57F5CADF\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_25.Text\n#. /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_25.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_25.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Or what? Will you cook me?\"\nmsgstr \"什麽？妳會把我燉了？\"\n\n#. Key:\tD9B7F3E240430AA5EF537A8F81814751\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_71.Text\n#. /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_71.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_71.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"I'm glad that the lake is peaceful again. Thank you!\"\nmsgstr \"我很高興湖水又恢復了平靜。謝謝妳！\"\n\n#. Key:\tE15F80EA40F193E47F372FA7EE9A949E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_0.SpeechSequence(5).SpeechSequence.Text\n#. /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_0.SpeechSequence(5).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_0.SpeechSequence(5).SpeechSequence.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Now they are gone and I'm alone with the monsters they left here.\"\nmsgstr \"現在他們走了，把我和他們的怪物留在壹起。\"\n\n#. Key:\tE3947B064E58A1FD7B96A3956C54415D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_0.SpeechSequence(2).SpeechSequence.Text\n#. /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_0.SpeechSequence(2).SpeechSequence.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_SpeechSequence_0.SpeechSequence(2).SpeechSequence.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"But then other Kobolds came. They called themselves the Great Kobols.\"\nmsgstr \"但後來其他地精來了。他們稱自己為偉大地精。\"\n\n#. Key:\tE48A1DFB458275188357F5811E98CFD4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_59.Text\n#. /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_59.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_59.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"And also take this! I could have not done the soup in time without your help.\"\nmsgstr \"還有這個! 如果沒有妳的幫助，我不可能及時把湯做好。\"\n\n#. Key:\tE58EEE904A6CBF1A0E2E768583EB03DC\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(7).Children.Text\n#. /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(7).Children.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(7).Children.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Trade\"\nmsgstr \"交易\"\n\n#. Key:\tE60B94C04C63F0E074A5B8ABFED7AE62\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_66.Text\n#. /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_66.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_66.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"I have something for you.\"\nmsgstr \"我有壹些東西給妳。\"\n\n#. Key:\tEA71F6A6412E69C31302A2B57BFD266F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_39.Text\n#. /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_39.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_39.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Now they are both gone.\"\nmsgstr \"現在他們都走了。\"\n\n#. Key:\tECA4BB2D4EB774315D57FD9A5D66CF25\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_22.Children(1).Children.Text\n#. /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_22.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_22.Children(1).Children.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Don't give\"\nmsgstr \"不給\"\n\n#. Key:\tED97FDEB46CAC89F65734D990569618C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_17.Children(1).Children.Text\n#. /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_17.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_17.Children(1).Children.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Decline\"\nmsgstr \"拒絕\"\n\n#. Key:\tEFD0511840178E579287BAB7FA3FDADE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(0).Children.Text\n#. /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(0).Children.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Banish Monsters\"\nmsgstr \"驅逐怪物\"\n\n#. Key:\tF5A08C63415DF9FE007B97931B7A7C31\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(9).Children.Text\n#. /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(9).Children.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_2.Children(9).Children.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Leave\"\nmsgstr \"離開\"\n\n#. Key:\tF7EA437842BBD099521D81B87211F49E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_30.Text\n#. /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_30.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_30.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"I’m the last of my tribe.\"\nmsgstr \"我是我們部落僅存的壹個了。\"\n\n#. Key:\tFC8F235840D6AF4A86170791A617BCA9\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_3.Text\n#. /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"Who are you? What are you doing here?\"\nmsgstr \"妳是誰? 妳在這兒幹什麽?\"\n\n#. Key:\tFF27D3BF4D181753D73AD79D384CD3ED\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_9.Text\n#. /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/Chapter2/KoboldChef.KoboldChef:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_KoboldChef\"\nmsgid \"What are you Kobolds like? What are you doing?\"\nmsgstr \"妳們地精是什麽樣的? 妳在幹什麽?\"\n\n#. Key:\t587277824A24A49F9319D0B452A709AD\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/LB_Device.LB_Device:DlgNode_Speech_1.Text\n#. /Game/SO/Dialogues/Ending/E1/LB_Device.LB_Device:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Ending/E1/LB_Device.LB_Device:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_LB_Device\"\nmsgid \"Monk wanted me to use this device to separate the Worlds.\"\nmsgstr \"修道士希望我使用這個裝置來分離世界。\"\n\n#. Key:\t83B9F1E146084039E4BAD185B455209C\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LB_Device.LB_Device:DlgNode_Speech_2.Text\n#. /Game/SO/Dialogues/Ending/E2/LB_Device.LB_Device:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E2/LB_Device.LB_Device:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_LB_Device\"\nmsgid \"With Father we did all we could to make the device perfect. I won’t let us lose so close to the end!\"\nmsgstr \"有了父親的幫助，我們能做得更好！我不會讓我們在接近尾聲的時候失敗的!\"\n\n#. Key:\t90E0E1E44BE9D84FC514248D73A31935\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LB_Device.LB_Device:DlgNode_Speech_1.Text\n#. /Game/SO/Dialogues/Ending/E2/LB_Device.LB_Device:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Ending/E2/LB_Device.LB_Device:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_LB_Device\"\nmsgid \"Three years of hard work.\"\nmsgstr \"三年的努力工作\"\n\n#. Key:\tFB8EC2184310BA168B9C6E9DB51C4492\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LB_Device.LB_Device:DlgNode_Speech_3.Text\n#. /Game/SO/Dialogues/Ending/E2/LB_Device.LB_Device:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E2/LB_Device.LB_Device:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_LB_Device\"\nmsgid \"I need to pull the left lever first.\"\nmsgstr \"我得先拉動左邊的控制桿。\"\n\n#. Key:\tDAC636D74C51C30F4B790B9F87203957\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/LB_DeviceUse.LB_DeviceUse:DlgNode_Speech_1.Text\n#. /Game/SO/Dialogues/Ending/E1/LB_DeviceUse.LB_DeviceUse:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Ending/E1/LB_DeviceUse.LB_DeviceUse:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_LB_DeviceUse\"\nmsgid \"Er... so far pulling the levers worked but this machine looks fairly complicated.\"\nmsgstr \"呃… 到目前為止，拉動桿是起作用的，但這臺機器看起來相當復雜。\"\n\n#. Key:\tE0D3606C4F357F03FBC916AA3573A81D\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/LB_DeviceUse.LB_DeviceUse:DlgNode_Speech_2.Text\n#. /Game/SO/Dialogues/Ending/E1/LB_DeviceUse.LB_DeviceUse:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E1/LB_DeviceUse.LB_DeviceUse:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_LB_DeviceUse\"\nmsgid \"I should look around to find some instructions on how it works.\"\nmsgstr \"我應該四處看看，看看它是如何運作的。\"\n\n#. Key:\t2DB770DF48D3199FFDEA3F8AB99126D5\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LB_LeftLever.LB_LeftLever:DlgNode_Speech_1.Text\n#. /Game/SO/Dialogues/Ending/E2/LB_LeftLever.LB_LeftLever:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Ending/E2/LB_LeftLever.LB_LeftLever:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_LB_LeftLever\"\nmsgid \"I heard them knocking on the door. They surely heard the alarm when I entered.\"\nmsgstr \"我聽見他們在敲門。我進去的時候，他們肯定聽到了警報。\"\n\n#. Key:\tB5D008804CCD51DF8CA8F5B99CA0C0FB\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LB_LeftLever.LB_LeftLever:DlgNode_Speech_2.Text\n#. /Game/SO/Dialogues/Ending/E2/LB_LeftLever.LB_LeftLever:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E2/LB_LeftLever.LB_LeftLever:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_LB_LeftLever\"\nmsgid \"I need to hurry. The middle lever is the next one.\"\nmsgstr \"我得抓緊了。下壹個是中間的拉桿。\"\n\n#. Key:\tC7B08D314C68A7E4D21E20B128670516\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LB_MiddleLever.LB_MiddleLever:DlgNode_Speech_5.Text\n#. /Game/SO/Dialogues/Ending/E2/LB_MiddleLever.LB_MiddleLever:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Ending/E2/LB_MiddleLever.LB_MiddleLever:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_LB_MiddleLever\"\nmsgid \"We both made our decision three years ago.\"\nmsgstr \"我們都是三年前做出這個決定的。\"\n\n#. Key:\tFBC301B94D990F1F3FD30383FF916327\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LB_MiddleLever.LB_MiddleLever:DlgNode_Speech_4.Text\n#. /Game/SO/Dialogues/Ending/E2/LB_MiddleLever.LB_MiddleLever:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Ending/E2/LB_MiddleLever.LB_MiddleLever:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_LB_MiddleLever\"\nmsgid \"I’ve made my choice.\"\nmsgstr \"我已經作出了選擇。\"\n\n#. Key:\tFD2036CF4FC103724FB18F83754367A0\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LB_MiddleLever.LB_MiddleLever:DlgNode_Speech_3.Text\n#. /Game/SO/Dialogues/Ending/E2/LB_MiddleLever.LB_MiddleLever:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E2/LB_MiddleLever.LB_MiddleLever:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_LB_MiddleLever\"\nmsgid \"I heard the door exploding. Father must be really mad but It doesn’t matter now.\"\nmsgstr \"我聽到門爆炸的聲音。父親壹定非常生氣 ，但現在沒關系了。\"\n\n#. Key:\t98F843004F338E4480C942A9B9646BDE\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LB_RightLever.LB_RightLever:DlgNode_Speech_3.Text\n#. /Game/SO/Dialogues/Ending/E2/LB_RightLever.LB_RightLever:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E2/LB_RightLever.LB_RightLever:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_LB_RightLever\"\nmsgid \"I pulled the last lever.\"\nmsgstr \"我拉動了最後壹根拉桿。\"\n\n#. Key:\t9F6EBBE74FA6289497401C8E7400B01E\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LR_Bed.LR_Bed:DlgNode_Speech_3.Text\n#. /Game/SO/Dialogues/Ending/E2/LR_Bed.LR_Bed:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E2/LR_Bed.LR_Bed:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_LR_Bed\"\nmsgid \"Sleeping wasn’t easy since Mom was gone.\"\nmsgstr \"母親離開了，我難以入睡。\"\n\n#. Key:\tAE56EE704265B61C84123F9775EB424C\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LR_Bed.LR_Bed:DlgNode_Speech_2.Text\n#. /Game/SO/Dialogues/Ending/E2/LR_Bed.LR_Bed:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E2/LR_Bed.LR_Bed:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_LR_Bed\"\nmsgid \"I really couldn’t sleep that night.\"\nmsgstr \"當晚我實在睡不著。\"\n\n#. Key:\t344E65304BB63905D487CCAF191DFE95\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LR_Chest.LR_Chest:DlgNode_Speech_1.Text\n#. /Game/SO/Dialogues/Ending/E2/LR_Chest.LR_Chest:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Ending/E2/LR_Chest.LR_Chest:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_LR_Chest\"\nmsgid \"It was half past eleven.\"\nmsgstr \"當時是十壹點半。\"\n\n#. Key:\t5DD659BE428981065F3A989D284C3542\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LR_Chest.LR_Chest:DlgNode_Speech_3.Text\n#. /Game/SO/Dialogues/Ending/E2/LR_Chest.LR_Chest:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E2/LR_Chest.LR_Chest:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_LR_Chest\"\nmsgid \"I took the key.\"\nmsgstr \"我拿了鑰匙。\"\n\n#. Key:\tF21CEE6143FD904B2285F9BEE01174A0\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LR_Chest.LR_Chest:DlgNode_Speech_2.Text\n#. /Game/SO/Dialogues/Ending/E2/LR_Chest.LR_Chest:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E2/LR_Chest.LR_Chest:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_LR_Chest\"\nmsgid \"Daddy didn’t like if I went out in the night but I felt something calling for me.\"\nmsgstr \"父親不喜歡我晚上出去，但我覺得有什麽東西在召喚我。\"\n\n#. Key:\t8B18714145E8614E70F531BDB1A2AAAB\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LR_Door.LR_Door:DlgNode_Speech_2.Text\n#. /Game/SO/Dialogues/Ending/E2/LR_Door.LR_Door:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E2/LR_Door.LR_Door:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_LR_Door\"\nmsgid \"I always locked the door just to make sure I won’t sleep walk out.\"\nmsgstr \"我總是把門鎖上，只是為了確保我不會夢遊出走。\"\n\n#. Key:\tE5B14EEE4719891E2D2493A4E793A2C4\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LR_Door.LR_Door:DlgNode_Speech_4.Text\n#. /Game/SO/Dialogues/Ending/E2/LR_Door.LR_Door:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Ending/E2/LR_Door.LR_Door:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_LR_Door\"\nmsgid \"I opened the door.\"\nmsgstr \"我打開了門。\"\n\n#. Key:\tF8090D7B4DCD959D7893338BDA2B6256\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LR_Door.LR_Door:DlgNode_Speech_3.Text\n#. /Game/SO/Dialogues/Ending/E2/LR_Door.LR_Door:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E2/LR_Door.LR_Door:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_LR_Door\"\nmsgid \"I hid the key under the clock.\"\nmsgstr \"我把鑰匙藏在鐘底下。\"\n\n#. Key:\t8363A3C9426FA1F007A5E783B1D72171\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LR_Notebook.LR_Notebook:DlgNode_Speech_2.Text\n#. /Game/SO/Dialogues/Ending/E2/LR_Notebook.LR_Notebook:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E2/LR_Notebook.LR_Notebook:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_LR_Notebook\"\nmsgid \"Here I collected all my less scientific notes on the Ruined Realm.\"\nmsgstr \"在這裏，我收集了所有關於這片毀滅王國的不太科學的筆記。\"\n\n#. Key:\tA0B131B34A29BEADA3E3CDB74C7EDBCA\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LR_Notebook.LR_Notebook:DlgNode_Speech_4.Text\n#. /Game/SO/Dialogues/Ending/E2/LR_Notebook.LR_Notebook:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Ending/E2/LR_Notebook.LR_Notebook:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_LR_Notebook\"\nmsgid \"They deserve to be remembered. I will miss them.\"\nmsgstr \"他們值得被銘記。我會想念他們的。\"\n\n#. Key:\tB66C98C34782719B5CF6F19F608C00F0\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LR_Notebook.LR_Notebook:DlgNode_Speech_3.Text\n#. /Game/SO/Dialogues/Ending/E2/LR_Notebook.LR_Notebook:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E2/LR_Notebook.LR_Notebook:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_LR_Notebook\"\nmsgid \"So many lovely people! Despite their madness.\"\nmsgstr \"這麽多可愛的人! 盡管他們很瘋狂。\"\n\n#. Key:\t0DAF7BA0480BDF56BC47A7826A5186C2\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LR_TabbyBed.LR_TabbyBed:DlgNode_Speech_3.Text\n#. /Game/SO/Dialogues/Ending/E2/LR_TabbyBed.LR_TabbyBed:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E2/LR_TabbyBed.LR_TabbyBed:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_LR_TabbyBed\"\nmsgid \"Sometimes I wished there could be a place like that for me as well.\"\nmsgstr \"有時我也希望能有壹個像那樣的地方。\"\n\n#. Key:\t6084018D4E86CF2ACA89219824C8F776\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LR_TabbyBed.LR_TabbyBed:DlgNode_Speech_1.Text\n#. /Game/SO/Dialogues/Ending/E2/LR_TabbyBed.LR_TabbyBed:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Ending/E2/LR_TabbyBed.LR_TabbyBed:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_LR_TabbyBed\"\nmsgid \"As usually Tabby was out there maybe hunting or just hanging out with other cats.\"\nmsgstr \"像往常壹樣，泰比會出去抓捕獵物，或者只是和其他的貓呆在壹起。\"\n\n#. Key:\t9702175346DD6BD2CBDB9C8D23460866\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LR_TabbyBed.LR_TabbyBed:DlgNode_Speech_2.Text\n#. /Game/SO/Dialogues/Ending/E2/LR_TabbyBed.LR_TabbyBed:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E2/LR_TabbyBed.LR_TabbyBed:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_LR_TabbyBed\"\nmsgid \"In this World, he was normal.\"\nmsgstr \"在這個世界上，他是正常的。\"\n\n#. Key:\t018B13FB403C2E979380C68B92CC1E46\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LR_Window.LR_Window:DlgNode_Speech_5.Text\n#. /Game/SO/Dialogues/Ending/E2/LR_Window.LR_Window:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Ending/E2/LR_Window.LR_Window:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_LR_Window\"\nmsgid \"Yet sometimes I liked to watch other kids playing in the castle garden.\"\nmsgstr \"但有時我喜歡看其他孩子在城堡的花園裏玩耍。\"\n\n#. Key:\t15454EFF40C99A479173E294B612C66C\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LR_Window.LR_Window:DlgNode_Speech_2.Text\n#. /Game/SO/Dialogues/Ending/E2/LR_Window.LR_Window:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E2/LR_Window.LR_Window:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_LR_Window\"\nmsgid \"They didn’t understand how important my task was.\"\nmsgstr \"他們不知道我的任務有多重要。\"\n\n#. Key:\t4460452B4A8B40C59075779751D3D760\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LR_Window.LR_Window:DlgNode_Speech_1.Text\n#. /Game/SO/Dialogues/Ending/E2/LR_Window.LR_Window:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Ending/E2/LR_Window.LR_Window:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_LR_Window\"\nmsgid \"I didn’t leave the castle since Mom died.\"\nmsgstr \"自從母親去世後，我就沒離開過城堡。\"\n\n#. Key:\t795D92CB49E6F50CE37897A793C6A711\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LR_Window.LR_Window:DlgNode_Speech_4.Text\n#. /Game/SO/Dialogues/Ending/E2/LR_Window.LR_Window:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Ending/E2/LR_Window.LR_Window:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_LR_Window\"\nmsgid \"Two years passed and they still didn’t give up throwing balls on the window to get my attention.\"\nmsgstr \"兩年過去了，他們仍然沒有停止向窗戶扔球來引起我的註意。\"\n\n#. Key:\tB1A689B24F5D77A715114AB718126A75\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/LR_Window.LR_Window:DlgNode_Speech_3.Text\n#. /Game/SO/Dialogues/Ending/E2/LR_Window.LR_Window:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E2/LR_Window.LR_Window:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_LR_Window\"\nmsgid \"They will never understand.\"\nmsgstr \"他們永遠不會明白。\"\n\n#. Key:\t06B2BD844B477A747E086F9F0C3BCAFE\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_13.Text\n#. /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"Well, that fountain is definitely not your cup of tea but you can accept that it might be the fairest for the Magic Mirror...\"\nmsgstr \"嗯，那座噴泉肯定不入妳的眼，但妳得理解它對魔鏡來說或許是最美麗的……\"\n\n#. Key:\t264C2C1040339F9680CA129F4E6E7764\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_65.Children(0).Children.Text\n#. Key:\t608D4BF341FEE76F239D6BA3B34F65E7\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_1.Children(0).Children.Text\n#. /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_65.Children(0).Children.Text\n#. /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_1.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_1.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_65.Children(0).Children.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"Who is the fairest?\"\nmsgstr \"誰是最美的?\"\n\n#. Key:\t2C246C1326080F0A003A03BBBE7E9F40\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_39.Children(1).Children.Text\n#. /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_39.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_39.Children(1).Children.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"Wish something\"\nmsgstr \"許願某事\"\n\n#. Key:\t2C6C88C54439E3C689E86DB30560B807\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_66.Text\n#. /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_66.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_66.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"No matter how hard you try to receive a sign, the Mirror remains silent. It doesn't show you anything this time.\"\nmsgstr \"無論妳多麽努力地想要得到壹個信號，鏡子都保持沈默。這次什麽也看不出來。\"\n\n#. Key:\t317248C14F0904B6E6B04080841C75D1\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_39.Text\n#. /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_39.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_39.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"The water seems to be boiling and the bubbles pop when they hit the surface; it is indeed mesmerizing. Suddenly, something breaks the silence - you can hear whispers.\"\nmsgstr \"水似乎在沸騰，氣泡碰到水面時爆裂; 這確實令人著迷。突然，某種東西打破了寂靜——妳能聽到低語。\"\n\n#. Key:\t372D97104DC7D67AF4B2409B7CBC602D\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_66.Children(0).Children.Text\n#. Key:\t432E8D794C2FB271D9B39283EBD9E33B\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_1.Children(2).Children.Text\n#. Key:\tF212015B402EF862C9869394531175DC\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_65.Children(2).Children.Text\n#. /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_66.Children(0).Children.Text\n#. /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_1.Children(2).Children.Text\n#. /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_65.Children(2).Children.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_1.Children(2).Children.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_65.Children(2).Children.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_66.Children(0).Children.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"Leave\"\nmsgstr \"離開\"\n\n#. Key:\t3FBF959348F2AFFA8016AA9371DD0800\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_16.Text\n#. /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"You politely explain that you want to see your past instead of your body, but the Mirror is stubbornly stuck on this image.\"\nmsgstr \"妳禮貌地解釋說，妳想看看妳的過去，而不是妳的身體，但鏡子卻固執地展現這個形象。\"\n\n#. Key:\t4620F3E84D5DC9847AB8A8891CF66F20\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_67.Text\n#. /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_67.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_67.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"You place the flower and wait to see what happens.\"\nmsgstr \"妳把花放在那裏，等著看會發生什麽。\"\n\n#. Key:\t5C2363C64023EB8E1705D3BFC3310A8A\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_65.Text\n#. /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_65.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_65.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"The vision fades away.\"\nmsgstr \"幻象消失了。\"\n\n#. Key:\t648780E44EF4F6587D31E7AE2BE4CCE4\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_68.Text\n#. /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_68.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_68.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"The Mirror seems to be unavailable at the moment. It doesn't want to be bothered. Maybe you should return later.\"\nmsgstr \"這面鏡子現在似乎用不上。它不想被打擾。也許妳應該晚點再來。\"\n\n#. Key:\t74CAAA1D4671A258A6D188BCED32CCBD\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_69.Text\n#. /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_69.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_69.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"The water turns still. Deep under the surface you notice a glimmering light.\"\nmsgstr \"水靜止不動。在地下深處，妳會註意到壹縷微光。\"\n\n#. Key:\t7CD8BEEA40A36A22057920807BBEEC07\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_1.Text\n#. /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"The Magic Mirror shows things that were, things that are, and things that yet may be. \\r\\nYou fill the basin with water and start contemplating. You meditate about...\"\nmsgstr \"魔鏡告訴我們過去的事，現在的事，將來的事。\\r\\n妳把盆子裝滿水，開始沈思。妳沈思著……\"\n\n#. Key:\t8226F9B3495DE20F137F95A7F3583FE0\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_11.Text\n#. /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"Ruin left this place almost untouched. The street lamps spread light on a couple of metal benches and flower pots.\"\nmsgstr \"毀滅留下了這個幾乎沒有被觸碰的地方。路燈把光灑在幾條金屬長凳和花盆上。\"\n\n#. Key:\t82C33F1E49C5DC76BF19648A414F7209\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_15.Text\n#. /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"You are watching the ball and start to get frustrated. You don't want to look at this body replacement... this raggy shell... You want answers!\"\nmsgstr \"妳盯著球，開始感到沮喪。妳不想看到這個身體的替代品…那個破爛的軀殼… 妳想要答案!\"\n\n#. Key:\t8F94D5E34488ECDCE9E051BB1ABE66B9\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_1.Children(1).Children.Text\n#. /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_1.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_1.Children(1).Children.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"Who you were in the past\"\nmsgstr \"妳過去是誰\"\n\n#. Key:\t9BA86AAD4282A943E8A57390E2C4E3CF\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_39.Children(0).Children.Text\n#. /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_39.Children(0).Children.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_39.Children(0).Children.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"Floating Flower\"\nmsgstr \"漂浮的花\"\n\n#. Key:\tA8A6D8D44F9344A162FAA080C839B28A\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_14.Text\n#. /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"There are glass shards all over the place. There's a ball on the floor next to the girl.\"\nmsgstr \"到處都是玻璃碎片。在那個女孩旁邊的地板上有壹個球。\"\n\n#. Key:\tAF212CEC43A56245A848DABD21ECBAFC\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_70.Text\n#. /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_70.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_70.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"You reach for the light and your fingers grab onto something smooth and cold.\"\nmsgstr \"妳伸手去夠光，妳的手指抓住了光滑冰冷的東西。\"\n\n#. Key:\tB8E2A52B442F3B45A1D993A8548DE124\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_4.Text\n#. /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"You are seeing the wizard's room once more. There is a weakened little girl lying on the floor in the middle of the room. She is surrounded by stone runes, candles and magical potions.\"\nmsgstr \"妳又壹次看到了巫師的房間。房間中央的地板上躺著壹個虛弱的小女孩。她被石符文、蠟燭和魔法藥水包圍著。\"\n\n#. Key:\tB9217F85404B488DB6F4DDACFF2B824C\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_65.Children(1).Children.Text\n#. /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_65.Children(1).Children.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_65.Children(1).Children.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"What you were before\"\nmsgstr \"妳以前是什麽\"\n\n#. Key:\tCD33272B416D2FDE283D44BA6F50475C\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_12.Text\n#. /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"The image zooms in and you have a clearer view of the fountain. You are waiting for more, but nothing happens.\"\nmsgstr \"圖像放大了，妳可以更清楚地看到噴泉。妳在等待更多內容的出現，但什麽也沒有發生。\"\n\n#. Key:\tD64B38F1470B27D21AE539AE80AE666A\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_3.Text\n#. /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"You are seeing the Ruined Realm from afar. The view gets closer until you find yourself looking at the top of a tower.\"\nmsgstr \"妳從遠處看到的是毀滅王國。景象越來越近，然後妳發現自己看到了壹座塔的頂部。\"\n\n#. Key:\tF3C496794CC4A68DDC764895FF2DFC77\n#. SourceLocation:\t/Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_72.Text\n#. /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_72.Text\n#: /Game/SO/Dialogues/AA/MagicMirror1.MagicMirror1:DlgNode_Speech_72.Text\nmsgctxt \"Dialogue_MagicMirror1\"\nmsgid \"You found a precious rune stone! Hmmm...Is this the gift offered by the Mirror in exchange for your enchanting flower?\"\nmsgstr \"妳找到了壹塊珍貴的符石! 嗯…  這是鏡子送給妳的禮物嗎?\"\n\n#. Key:\t10A6FAE44F71FBB21522B1AAE5E20DAE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_29.Text\n#. /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_29.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_29.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"I don’t care what happens here after I’m back home.\"\nmsgstr \"我不在乎我回家後這裏接著會發生什麽。\"\n\n#. Key:\t12C6550D4143AFE12C6986B427D2927A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_21.Text\n#. /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"He can’t release his daughter. He can’t accept that she is gone. He wants to get her back even if it means they all die after a few months...\"\nmsgstr \"他放不下他的女兒。他無法接受她的離去。他想讓她回來，即使這意味著他們幾個月後都會死去……\"\n\n#. Key:\t1C714E474408001FB67CEABF92FAB019\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_10.Text\n#. /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Wait! You can’t just dis...\"\nmsgstr \"等等! 妳不能就這麽…\"\n\n#. Key:\t209B77394D419812DD1BD7A3D7A92B94\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_39.Text\n#. /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_39.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_39.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"All right and what can we do against it?\"\nmsgstr \"好吧，我們能做些什麽呢?\"\n\n#. Key:\t209BF95E4275418CE020E3AB028AFC10\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_11.Text\n#. /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Now it’s better.\"\nmsgstr \"現在好多了。\"\n\n#. Key:\t230C6ED4416FDD6C5E00FAB8B30FBB17\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_15.Text\n#. /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"To be honest I don’t have the faintest idea. I just want to be free again.\"\nmsgstr \"老實說，我壹點兒也不知道。我只想重獲自由。\"\n\n#. Key:\t25227AB342F4A0E76082539072C1143D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_37.Text\n#. /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_37.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_37.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Do you think Ruin will stop after swallowing the Human Realm?\"\nmsgstr \"妳認為毀滅會在吞噬人類王國後停止嗎?\"\n\n#. Key:\t266261C240DB77D1306C5F8EEE3D0189\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_14.Text\n#. /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"He says he wants his daughter back but I think he is still trying to close the Realm to stop Ruin.\"\nmsgstr \"他說他想要他的女兒回來，但我認為他仍在試圖關閉王國以阻止毀滅。\"\n\n#. Key:\t283810E04DE48471FBE6BD9BE9DD337D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_18.Text\n#. /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Yet he doesn’t care about the World. He wants to get her back even if it means they all die after a few months...\"\nmsgstr \"然而他並不關心這個世界。他想讓她回來，即使這意味著他們幾個月後都會死去……\"\n\n#. Key:\t2CE94F19412379ECE927A3AEEEAC3756\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_1.Children(1).Children.Text\n#. /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_1.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_1.Children(1).Children.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Thanks for the Soulcaster\"\nmsgstr \"感謝靈魂施放者\"\n\n#. Key:\t2DB5F39F45BB9EC8ABBFEA9020DF94E7\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_28.Text\n#. /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Why should it concern me if Ruin destroys your Realm? You deserve it for summoning us to do the hard work.\"\nmsgstr \"如果毀滅摧毀了妳的王國，我又有什麽好擔心的呢? 妳召喚我們去做艱苦的工作，這是妳應得的下場。\"\n\n#. Key:\t30E5A67B4135A5402AE021832F89D4D1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"You again? I told you if you want something from the Wizard go and find him yourself...\"\nmsgstr \"又是妳? 我告訴過妳，如果妳想從巫師那裏得到什麽，妳自己去找他……\"\n\n#. Key:\t34BCB98247406A77FB5A5C8942543588\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_38.Text\n#. /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_38.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_38.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"It might take time but it will reach the Unknown Realm and all the spirits will become part of Ruin just like those who were summoned here.\"\nmsgstr \"這可能需要時間，但它將到達未知王國和所有的精神將成為毀滅的壹部分，就像那些被召喚到這裏。\"\n\n#. Key:\t379B50904FB774AD057BBB810BDD445C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_41.Text\n#. /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_41.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_41.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"I’m not sure. I will think about it.\"\nmsgstr \"我不確定。我會考慮的。\"\n\n#. Key:\t38BEECF94D2EB7B2C6596593E576A360\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_30.Text\n#. /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_30.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_30.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"The Wizard created a device which can separate the Realms. This is the only way to stop Ruin from spreading.\"\nmsgstr \"巫師創建了壹個可以分隔王國的裝置。這是防止毀滅蔓延的唯壹辦法。\"\n\n#. Key:\t3D7B856A4D97FCCC2A2B89BCB6295471\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"This time I would like to talk to you...\"\nmsgstr \"這次我想和妳談談……\"\n\n#. Key:\t40A329C7465166A11C73B694D6A79A00\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_12.Children(2).Children.Text\n#. /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_12.Children(2).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_12.Children(2).Children.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Don’t know\"\nmsgstr \"不知道\"\n\n#. Key:\t4D356117496E625B6B4C64A611496A9F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_24.Children(1).Children.Text\n#. /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_24.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_24.Children(1).Children.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Not my problem\"\nmsgstr \"不是我的問題\"\n\n#. Key:\t4FE5ADF04D1079CCD1E16697E82B39B5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_35.Children(0).Children.Text\n#. /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_35.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_35.Children(0).Children.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Accept plan\"\nmsgstr \"接受計劃\"\n\n#. Key:\t53D6055344A880433B1093B029DA8CA5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_12.Children(0).Children.Text\n#. /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_12.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_12.Children(0).Children.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Bring back daughter\"\nmsgstr \"把女兒帶回來\"\n\n#. Key:\t599FF022411F5BA2EB0F32A1F947C661\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_35.Children(2).Children.Text\n#. /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_35.Children(2).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_35.Children(2).Children.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Not sure\"\nmsgstr \"不確定\"\n\n#. Key:\t5FD6018040C38B8A3F40C78C913AC251\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_40.Text\n#. /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_40.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_40.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Have no fear, I will have this done!\"\nmsgstr \"別怕，我會把這事辦好的！\"\n\n#. Key:\t6B3585BA4AFE614FF428FCAE698872A8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_33.Text\n#. /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_33.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_33.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"For you this would be completely different. For you this is not a sacrifice but a way of going home!\"\nmsgstr \"對妳來說，這將是完全不同的。對妳來說，這不是犧牲，而是回家的路!\"\n\n#. Key:\t6E1C94F24F493D7075A7509F8181AD27\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_20.Text\n#. /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"You are wrong. The World is falling apart yet he doesn’t care about it even when he is the only one who could stop Ruin.\"\nmsgstr \"妳錯了。世界正在分崩離析，而他卻毫不在意，即使他是唯壹可以阻止毀滅的人。\"\n\n#. Key:\t71A64B804C0CCE26571E9E8237AA5000\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"I’m also glad. It was bloody damn difficult.\"\nmsgstr \"我也很高興。這真是太難了。\"\n\n#. Key:\t78305AE64B56098D32806EB509133BBC\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_35.Children(1).Children.Text\n#. /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_35.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_35.Children(1).Children.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Decline plan\"\nmsgstr \"拒絕計劃\"\n\n#. Key:\t7C92B8BF4CEA3093BB817682B501DC67\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_17.Text\n#. /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"The World is falling apart and only the Wizard has a chance to stop this.\"\nmsgstr \"世界正在分崩離析，只有巫師有機會阻止它。\"\n\n#. Key:\t8B2CE8144EB2A7C89AFA1BACC3EE1B88\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Hello, little Wanderer! I’m glad you made it this far.\"\nmsgstr \"妳好, 小流浪者！我很高興妳能走到這壹步。\"\n\n#. Key:\t8CC98B374125E6E6A6A20C97F4A3B067\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_24.Children(0).Children.Text\n#. /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_24.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_24.Children(0).Children.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"I'm a demon\"\nmsgstr \"我是壹個惡魔\"\n\n#. Key:\t8D4701A1469997CBC879788351B37B0A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_31.Text\n#. /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_31.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_31.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"My plan is simple.\"\nmsgstr \"我的計劃很簡單\"\n\n#. Key:\t8E4693F04E60AFF4757A5887973894BE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_27.Text\n#. /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_27.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_27.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"I saw Ruin and I don’t want the same to happen to any other Realm. What can I do?\"\nmsgstr \"我看到了毀滅，我不希望任何其他王國會重蹈覆轍。我能做什麽?\"\n\n#. Key:\t9193CB2747033644F006809E0E4A812A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_45.Text\n#. /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_45.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_45.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"For the sake of all Realms I hope you will make the right decision.\"\nmsgstr \"為了所有王國的利益，我希望妳能做出正確的決定。\"\n\n#. Key:\t95D6FBCC42CC4F4041D0B5B64996FD5C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_35.Text\n#. /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_35.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_35.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Once you are there find the Laboratory and activate the device! It will take you home and will separate the Worlds which means no spirit will be ever summoned again!\"\nmsgstr \"壹旦妳到了那裏，找到實驗室，激活裝置! 它會帶妳回家，並將世界分離，這意味著再也不會有靈魂被召喚!\"\n\n#. Key:\t9ADEF37F49EA90EF320B5E8BB2D8D769\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"...and I don’t want our conversation to be overheard, so if you don’t mind...\"\nmsgstr \"...我不想讓別人聽到我們的談話，所以如果妳不介意的話……\"\n\n#. Key:\t9F01EFC54F3FC5B709F697860BE0572D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_24.Children(2).Children.Text\n#. /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_24.Children(2).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_24.Children(2).Children.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"How to save the World?\"\nmsgstr \"如何拯救世界？\"\n\n#. Key:\tA71226674132E2666925AEB28D2FC024\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_46.Text\n#. /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_46.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_46.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Farewell Wanderer!\"\nmsgstr \"再見，流浪者！\"\n\n#. Key:\tB1E3A9DB4A75C08067DCA19113A6A8A2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Calm down little spirit.\"\nmsgstr \"冷靜點，小精靈。\"\n\n#. Key:\tB355BD604F9EC22514DA14B64B0F5E5E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_43.Text\n#. /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_43.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_43.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Thank you Spirit! For the sake of all Realms I hope you won’t fail on your way!\"\nmsgstr \"謝謝妳小精靈! 為了所有的王國，我希望妳不會失敗！\"\n\n#. Key:\tB6D3E23045C4BC5B3E5F3D83E2DFBADB\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_19.Text\n#. Key:\tDC3219914721210BD169D2989F03D18D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_22.Text\n#. /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_19.Text\n#. /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"But we won’t let this happen, will we?\"\nmsgstr \"但我們不會讓這種事發生的，是嗎?\"\n\n#. Key:\tBAC828A540E6C81EE43EBF8036A8146A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_42.Text\n#. /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_42.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_42.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"You deserve Ruin. I won’t save the Human Realm!\"\nmsgstr \"毀滅是妳們咎由自取。我不會拯救人類!\"\n\n#. Key:\tC837CED4495F79594133F4B2C0FCE5F8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_12.Text\n#. /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Where shall I start? Do you know what the Wizard is up to? Did he tell you?\"\nmsgstr \"我該從哪裏開始呢? 妳知道巫師在做什麽嗎? 他告訴妳了嗎?\"\n\n#. Key:\tD060173B4D5502FC06A69E865DAFD5E6\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_26.Text\n#. /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_26.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_26.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"This is not my Realm and not my problem. All I want is to get out of here.\"\nmsgstr \"這不是我的王國，也不是我的問題。我只想離開這裏。\"\n\n#. Key:\tD520C3AC46F62B77554443A4589845C1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_13.Text\n#. /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"He would like to bring his daughter back to life. For that he needs three artefacts which are somewhere here.\"\nmsgstr \"他想讓他的女兒起死回生。他需要三件工藝品，就在這裏。\"\n\n#. Key:\tD7F841B14E18D77AB5FBD2A34D59BC92\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_44.Text\n#. /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_44.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_44.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"I understand your fury. Yet I hope you will change your mind.\"\nmsgstr \"我理解妳的憤怒。但我希望妳能改變主意。\"\n\n#. Key:\tD80B81914A550F305934F9852C1DD6B0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_23.Text\n#. /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_23.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_23.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"He lost his daughter and he can’t release her. He can’t accept that she is gone.\"\nmsgstr \"他失去了女兒，他不能放下她。他無法接受她的離去。\"\n\n#. Key:\tD816A79E4160BC4426CD22A63C7987A0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Before you go on I have something to discuss with you...\"\nmsgstr \"在妳走之前，我有件事要和妳商量壹下。\"\n\n#. Key:\tDD870754471358DEFE9CB5BFA554AB7C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_1.Children(0).Children.Text\n#. /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_1.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_1.Children(0).Children.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Me too\"\nmsgstr \"彼此彼此\"\n\n#. Key:\tE0CCA2604AA40FED355A859A1FA02DDA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_1.Children(2).Children.Text\n#. /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_1.Children(2).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_1.Children(2).Children.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"I won’t deliver any message\"\nmsgstr \"我不會傳遞任何信息\"\n\n#. Key:\tE1C3F2E34680BA8B67521C905AD42ADA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_16.Text\n#. /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"That’s correct. He can’t release his daughter. He can’t accept that she is gone.\"\nmsgstr \"沒錯。他不能放下他的女兒。他無法接受她的離去。\"\n\n#. Key:\tE93136104181FAA899F2CE801497DCBA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_25.Text\n#. /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_25.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_25.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"I know right now it doesn’t look that way, but I’m a mighty demon of the Unknown Realm.\"\nmsgstr \"我知道現在它看起來不像，但我是壹個強大的未知王國的惡魔。\"\n\n#. Key:\tEC116A8848A471EB2C5DC8BA1D187C9A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_12.Children(1).Children.Text\n#. /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_12.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_12.Children(1).Children.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"Close Ruined Realm\"\nmsgstr \"關閉毀滅王國\"\n\n#. Key:\tEC6221CE4B85E7D1887DBCA6D85D8238\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"It wasn’t easy but I made good use of the Spellcaster you gave me.\"\nmsgstr \"這並不容易，但我很好地利用了妳給我的施法者。\"\n\n#. Key:\tED5356DE42F2ED2203F7AFB30231643E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_34.Text\n#. /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_34.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_34.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"When you deliver the artefacts he will let you into his tower.\"\nmsgstr \"當妳把這些工藝品交給他時，他會讓妳進入他的塔。\"\n\n#. Key:\tEE78AD4147800BD0E160A8B6A3F51FBD\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_32.Text\n#. /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_32.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_32.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"When the Wizard’s daughter activated the device it transported her soul into the Unknown Realm. At that point the Wizard stopped the device so that he can summon his daughter back.\"\nmsgstr \"當巫師的女兒激活該裝置時，它將她的靈魂傳送到無名王國。就在這時，巫師停止了那個裝置，這樣他就可以把他的女兒召喚回來了。\"\n\n#. Key:\tEFACA50447BAC08293281BB11A5E11B3\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_36.Text\n#. /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_36.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_36.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"This is just as much your problem as it is mine.\"\nmsgstr \"這既是妳的問題，也是我的問題。\"\n\n#. Key:\tFB0E702746132A3C688D9EA492A01B50\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Chapter2/Monk.Monk:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_Monk\"\nmsgid \"You made it and that is what matters.\"\nmsgstr \"妳成功了，這才是最重要的。\"\n\n#. Key:\t4BE3EE734EFED241B7FA2192EEB146A5\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/MR_Bed.MR_Bed:DlgNode_Speech_1.Text\n#. /Game/SO/Dialogues/Ending/E2/MR_Bed.MR_Bed:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Ending/E2/MR_Bed.MR_Bed:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_MR_Bed\"\nmsgid \"We always wore colourful clothes because that made her happy.\"\nmsgstr \"我們總是穿著五顏六色的衣服，因為這樣能使她高興。\"\n\n#. Key:\t7F5F069D4E9C7F15ED2B8CA45154FCFE\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/MR_Bed.MR_Bed:DlgNode_Speech_2.Text\n#. /Game/SO/Dialogues/Ending/E2/MR_Bed.MR_Bed:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E2/MR_Bed.MR_Bed:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_MR_Bed\"\nmsgid \"Most of her time she just lied here and stared at nothing.\"\nmsgstr \"她大部分時間都躺在這裏，眼神迷離。\"\n\n#. Key:\tEA25DBC34832960AB03A32A5B08AC404\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/MR_Bed.MR_Bed:DlgNode_Speech_3.Text\n#. /Game/SO/Dialogues/Ending/E2/MR_Bed.MR_Bed:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E2/MR_Bed.MR_Bed:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_MR_Bed\"\nmsgid \"Sometimes she talked about grey lands.\"\nmsgstr \"有時她會談到灰色地帶。\"\n\n#. Key:\t58E06C3A45DD46A34F155BAA62933039\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/MR_Chair.MR_Chair:DlgNode_Speech_4.Text\n#. /Game/SO/Dialogues/Ending/E2/MR_Chair.MR_Chair:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Ending/E2/MR_Chair.MR_Chair:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_MR_Chair\"\nmsgid \"I hope they will never find out how wrong they were. I hope there is still time for our World.\"\nmsgstr \"我希望他們永遠不會發現他們錯得有多離譜。我希望我們的世界還有時間。\"\n\n#. Key:\t9EA75B664E62ABF38E44BE8DC3050AC9\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/MR_Chair.MR_Chair:DlgNode_Speech_2.Text\n#. /Game/SO/Dialogues/Ending/E2/MR_Chair.MR_Chair:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E2/MR_Chair.MR_Chair:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_MR_Chair\"\nmsgid \"This is where the doctor used to sit. He never believed that Mom was infected by the Ruin.\"\nmsgstr \"這是醫生過去常坐的地方。他從不相信母親被毀滅感染了。\"\n\n#. Key:\tA408630F44A3B2345A2D0AA8395D97F2\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/MR_Chair.MR_Chair:DlgNode_Speech_3.Text\n#. /Game/SO/Dialogues/Ending/E2/MR_Chair.MR_Chair:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E2/MR_Chair.MR_Chair:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_MR_Chair\"\nmsgid \"No one ever believed in Ruin.\"\nmsgstr \"沒有人相信毀滅。\"\n\n#. Key:\t1AFEF7EB49BB3BEA5BB76793A60ED7C9\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/MR_Lamps.MR_Lamps:DlgNode_Speech_2.Text\n#. /Game/SO/Dialogues/Ending/E2/MR_Lamps.MR_Lamps:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E2/MR_Lamps.MR_Lamps:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_MR_Lamps\"\nmsgid \"This room was the brightest in the castle.\"\nmsgstr \"這個房間是城堡裏最明亮的。\"\n\n#. Key:\tC132BEA446B4441615D7029E8AA5BBB5\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/MR_Lamps.MR_Lamps:DlgNode_Speech_3.Text\n#. /Game/SO/Dialogues/Ending/E2/MR_Lamps.MR_Lamps:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E2/MR_Lamps.MR_Lamps:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_MR_Lamps\"\nmsgid \"I took some oil.\"\nmsgstr \"我取了壹些油。\"\n\n#. Key:\tFE826997431A2665AC2788A62558B88E\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/MR_Lamps.MR_Lamps:DlgNode_Speech_1.Text\n#. /Game/SO/Dialogues/Ending/E2/MR_Lamps.MR_Lamps:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Ending/E2/MR_Lamps.MR_Lamps:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_MR_Lamps\"\nmsgid \"Father bought some exotic lamp oil so that we had coloured lights.\"\nmsgstr \"父親買了壹些燈油，這樣我們就有了各色彩燈。\"\n\n#. Key:\t430A10B04FAC9288EC2794A31DF6699E\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/MR_Paintings.MR_Paintings:DlgNode_Speech_2.Text\n#. /Game/SO/Dialogues/Ending/E2/MR_Paintings.MR_Paintings:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E2/MR_Paintings.MR_Paintings:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_MR_Paintings\"\nmsgid \"Mom was always fond of art.\"\nmsgstr \"母親壹直熱衷於藝術。\"\n\n#. Key:\t53AA7E134FA0E30F37FC8CB50425520F\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/MR_Paintings.MR_Paintings:DlgNode_Speech_3.Text\n#. /Game/SO/Dialogues/Ending/E2/MR_Paintings.MR_Paintings:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E2/MR_Paintings.MR_Paintings:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_MR_Paintings\"\nmsgid \"After she got sick she couldn’t paint the way she did before yet she still liked it.\"\nmsgstr \"她生病後，不能再像以前那樣畫畫了，但她的興趣絲毫不減。\"\n\n#. Key:\t8484045A4107378E9CC8FFAA02C94A87\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E2/MR_Paintings.MR_Paintings:DlgNode_Speech_1.Text\n#. /Game/SO/Dialogues/Ending/E2/MR_Paintings.MR_Paintings:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Ending/E2/MR_Paintings.MR_Paintings:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_MR_Paintings\"\nmsgid \"It could engage her for hours.\"\nmsgstr \"這可能會讓她忙上幾個小時。\"\n\n#. Key:\t009BF08145DBE86FFB07BA9A6BD77A8E\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_5.Children(2).Children.Text\n#. /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_5.Children(2).Children.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_5.Children(2).Children.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"Not my business\"\nmsgstr \"與我無關\"\n\n#. Key:\t00DE9BE1446C5D5C0D62469B41A1B693\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_5.Children(0).Children.Text\n#. /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_5.Children(0).Children.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_5.Children(0).Children.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"Lillian?\"\nmsgstr \"莉莉安？\"\n\n#. Key:\t0C3B729C4618E8A817F019B8E916425B\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_18.Text\n#. /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"Maybe we failed the ritual again and summoned another of your kind.\"\nmsgstr \"也許我們的儀式又壹次失敗了，召喚了妳的同類。\"\n\n#. Key:\t0CAC15144B37144A99A9EB9D13CCC9DE\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_32.Text\n#. /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_32.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_32.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"What do you expect me to do, Spirit?\"\nmsgstr \"妳想讓我怎麽做，精靈？\"\n\n#. Key:\t1493C597483503024A3C5CA8F0FA1327\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_8.Text\n#. /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"I’ve already done way too much for you.\"\nmsgstr \"我已經為妳做得太多了。\"\n\n#. Key:\t15BAD73D49BF7C62469D8E9CD0B2AAF4\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_9.Text\n#. /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"Now, take me home!\"\nmsgstr \"現在，帶我回家吧!\"\n\n#. Key:\t1962A69C42E8FDD365AFC9AB626605F7\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_13.Text\n#. /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"We made the spell... and it worked!\"\nmsgstr \"我們念了咒語… 並且它奏效了!\"\n\n#. Key:\t1AC8DD104163078CA72065A0B43B5C57\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_15.Text\n#. /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"And then what?\"\nmsgstr \"然後呢？\"\n\n#. Key:\t2034A3164695766F8C17B69CD0937C02\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_25.Text\n#. /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_25.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_25.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"And he...\"\nmsgstr \"另外他...\"\n\n#. Key:\t22668011432DEF65ACF29793FF234E07\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_37.Text\n#. /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_37.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_37.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"Someone like me...\"\nmsgstr \"像我這樣的人……\"\n\n#. Key:\t2386A8D24BD256982D486AAF71B57ABD\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_23.Text\n#. /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_23.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_23.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"She destroyed half of the room before we could even cast a spell.\"\nmsgstr \"我們還沒來得及施咒，她就把半個房間給毀了。\"\n\n#. Key:\t250E11A440445CAFB5252A92C5100735\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_22.Text\n#. /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"That’s how you handle situations like these...\"\nmsgstr \"這就是妳處理這種情況的方式……\"\n\n#. Key:\t298BEA5646602444742C3BAD65866EF9\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_12.Text\n#. /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"I’m not sure... Everything happened so fast.\"\nmsgstr \"我不確定… 壹切都發生得太快了。\"\n\n#. Key:\t2FAFABFC43A75D29B671739D16759E43\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_2.Text\n#. /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"What happened?\"\nmsgstr \"什麽情況？\"\n\n#. Key:\t303D9BF54AB3034565A45594AB5636DF\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_10.Text\n#. /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"I can’t... I’m sorry!\"\nmsgstr \"我不能……  我很抱歉!\"\n\n#. Key:\t378D7F984C821E23AF0CBEA7D24EFCC1\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_6.Text\n#. /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"What happened to Lillian? Has she returned?\"\nmsgstr \"莉莉安怎麽了？她回來了嗎？\"\n\n#. Key:\t38EF0908448C7E5298C4F496DACAD5AD\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_3.Text\n#. /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"Something... arrgh... something went wrong...\"\nmsgstr \"有些... 呃... 有些不對勁...\"\n\n#. Key:\t3A328FA74AA2FBC2AFE84CA195DAE236\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_1.Text\n#. /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"You are Raven’s master...\"\nmsgstr \"妳是烏鴉的主人……\"\n\n#. Key:\t462226704638D0C32B1DEBA3DFE138A1\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_17.Text\n#. /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"She was taken over by a wicked force and she unleashed boundless spells.\"\nmsgstr \"她被壹種邪惡的力量控制了，釋放了無盡的咒語。\"\n\n#. Key:\t49B5501A4917D23E6B3B99B430076ABA\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_19.Text\n#. /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"It was like the devil itself.\"\nmsgstr \"它本身就像惡魔壹樣。\"\n\n#. Key:\t4B173FBD4D4F48A468016BB055CC573C\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_7.Text\n#. /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"Where is Wizard? Something happened to him?\"\nmsgstr \"巫師在哪裏？他怎麽了？\"\n\n#. Key:\t5341F61045AA32F212173EA9CAB67695\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_39.Text\n#. /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_39.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_39.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"Wizard was right when he decided to trust you.\"\nmsgstr \"巫師決定相信妳是對的。\"\n\n#. Key:\t551AEBA64D1E99B2CCFA3DB13E168A02\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_27.Children(1).Children.Text\n#. /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_27.Children(1).Children.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_27.Children(1).Children.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"I won’t fight\"\nmsgstr \"我不會幹架\"\n\n#. Key:\t592A8CF045DF1BD875B05F9493FE2BB4\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_38.Text\n#. /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_38.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_38.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"I will face her!\"\nmsgstr \"我會面對她的！\"\n\n#. Key:\t5B65F12D43B12FA943D7469FEE2CE2E0\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_4.Text\n#. /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"We made everything right...\"\nmsgstr \"我們把壹切都做好了……\"\n\n#. Key:\t65A974C344D2B4DD644901994086A31D\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_30.Text\n#. /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_30.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_30.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"Why is it that every time you refuse to face the consequences of your actions, it is me who needs to clean up your mess?\"\nmsgstr \"為什麽每次妳拒絕面對自己行為的後果時，都是我在幫妳收拾爛攤子?\"\n\n#. Key:\t66D0FDF04AF5351330E83080759ED974\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_40.Text\n#. /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_40.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_40.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"I'm sorry that I can't help...\"\nmsgstr \"對不起，我幫不了妳……\"\n\n#. Key:\t7FFE18B74C54BB92334399983F82DBCA\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_34.Text\n#. /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_34.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_34.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"You are free to do whatever you want!\"\nmsgstr \"妳可以想做什麽就做什麽!\"\n\n#. Key:\t8739EB3D48E4F2A997E604A60F7F32B3\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_20.Text\n#. /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"Was it trapped inside a teddy bear?\"\nmsgstr \"它被困在泰迪熊裏了嗎?\"\n\n#. Key:\t8E2F09164340534A484A46AD45E4E105\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_27.Text\n#. /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_27.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_27.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"The demon-Lillian left. There is no one who could stop her now...\"\nmsgstr \"那個惡魔...  莉莉安離開了。現在沒有人能阻止她了……\"\n\n#. Key:\t900D084E4F673FEBEACE3E916103B93E\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_16.Text\n#. /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"She had fire in her eyes...\"\nmsgstr \"她眼睛裏有火……\"\n\n#. Key:\t91C26C314425AB8C973F1FB54061F639\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_14.Text\n#. /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"Lillian woke up and then...\"\nmsgstr \"莉莉安醒了，然後……\"\n\n#. Key:\t95CE9C6C4901E613AD5DB38E51AC0DB3\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_35.Text\n#. /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_35.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_35.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"Leave and let me rest in peace...\"\nmsgstr \"離開吧，讓我安息……\"\n\n#. Key:\t9AF3E069409F31E4F50A5990A416A39C\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_19.Children(1).Children.Text\n#. Key:\tF5A670D640D73DF452C02A948CB68F75\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_5.Children(1).Children.Text\n#. /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_19.Children(1).Children.Text\n#. /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_5.Children(1).Children.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_19.Children(1).Children.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_5.Children(1).Children.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"Wizard?\"\nmsgstr \"巫師？\"\n\n#. Key:\t9B1B8322442B6D7D76F2119E0A0574FA\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_21.Text\n#. /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"Is the Wizard safe? What happened afterwards?\"\nmsgstr \"巫師安全嗎? 後來發生了什麽?\"\n\n#. Key:\tA82789354D984476223432A2BE199293\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_24.Text\n#. /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_24.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_24.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"I was hit by the table.\"\nmsgstr \"我被桌子撞了。\"\n\n#. Key:\tAA6EFD044C1D21008EEA189DE75740E7\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_41.Text\n#. /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_41.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_41.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"Good luck with... everything!\"\nmsgstr \"祝... 萬事順意！\"\n\n#. Key:\tACAF3D904A149C0E9F91E5AC852D8309\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_31.Text\n#. /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_31.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_31.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"Let me go!\"\nmsgstr \"放過我吧！\"\n\n#. Key:\tB223647F4C35858A62A5509C7B22C23B\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_27.Children(0).Children.Text\n#. /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_27.Children(0).Children.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_27.Children(0).Children.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"I'll stop her\"\nmsgstr \"我會阻止她\"\n\n#. Key:\tD0E16FEF4D5415EC6D2C299252E5675D\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_26.Text\n#. /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_26.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_26.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"He was burnt to ashes.\"\nmsgstr \"他被燒成灰燼。\"\n\n#. Key:\tD23076F4475E6CE385ECB2B3B2749CA9\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_36.Text\n#. /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_36.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_36.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"I have always wanted to meet someone of my own kind anyway.\"\nmsgstr \"無論如何，我壹直都想遇到壹個和我壹樣的人。\"\n\n#. Key:\tD290445E4EB74446478970934785BA10\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_11.Text\n#. /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"I can’t open a Gate without Wizard...\"\nmsgstr \"沒有巫師我無法打開大門……\"\n\n#. Key:\tD6EB1BE248E9C483E6D94B8E8A7815F6\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_5.Text\n#. /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"I don't understand... It is...\"\nmsgstr \"我不明白…… 這是……\"\n\n#. Key:\tEC42D62E46269139E9E69B876EDED5B1\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_33.Text\n#. /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_33.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_33.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"It wasn't me who brought you here.\"\nmsgstr \"不是我帶妳來的。\"\n\n#. Key:\tF0711D5F4698DAA99E484E94FDB3EF9C\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_19.Children(0).Children.Text\n#. /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_19.Children(0).Children.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_19.Children(0).Children.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"Was it trapped?\"\nmsgstr \"它被困了？\"\n\n#. Key:\tFDE62A034456071EFE9639B73108BB1E\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_28.Text\n#. /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"I can't let her destroy everything!\"\nmsgstr \"我不能讓她毀了壹切!\"\n\n#. Key:\tFDFD2B2B4352B564118519874199B48C\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_29.Text\n#. /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_29.Text\n#: /Game/SO/Dialogues/Ending/E1/Scholar.Scholar:DlgNode_Speech_29.Text\nmsgctxt \"Dialogue_Scholar\"\nmsgid \"No-no-no!\"\nmsgstr \"不-不-不！\"\n\n#. Key:\t2E3C904D458640A4F06DD793B416366A\n#. SourceLocation:\t/Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_14.Text\n#. /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_SewerCreatures\"\nmsgid \"All right, I will return when I'm done.\"\nmsgstr \"好吧，我做完就回來。\"\n\n#. Key:\t41F6B75041803A654088469BCB887165\n#. SourceLocation:\t/Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_1.Children(0).Children.Text\n#. /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_1.Children(0).Children.Text\n#: /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_1.Children(0).Children.Text\nmsgctxt \"Dialogue_SewerCreatures\"\nmsgid \"Really?\"\nmsgstr \"真的嗎？\"\n\n#. Key:\t43EE0E60407CA7CB7431BDB2767C6E19\n#. SourceLocation:\t/Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_2.Text\n#. /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_SewerCreatures\"\nmsgid \"That's sad. What happened exactly?\"\nmsgstr \"真悲劇。到底發生了什麽事?\"\n\n#. Key:\t53AC225B4F21B68CAC6F8997F324124E\n#. SourceLocation:\t/Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_29.Text\n#. /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_29.Text\n#: /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_29.Text\nmsgctxt \"Dialogue_SewerCreatures\"\nmsgid \"Farewell until we meet again!\"\nmsgstr \"再見，下次見!\"\n\n#. Key:\t5ED0CE6143EC50E6B5A1289D1A9A88E2\n#. SourceLocation:\t/Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_22.Text\n#. /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_SewerCreatures\"\nmsgid \"I'm glad I could help.\"\nmsgstr \"我很高興能幫上忙。\"\n\n#. Key:\t65042BC342E9717229E74A9DD272DC5F\n#. SourceLocation:\t/Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_28.Text\n#. /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_SewerCreatures\"\nmsgid \"It was nice to see you again.\"\nmsgstr \"很高興再次見到妳。\"\n\n#. Key:\t77959A144131C47488B221ADD9B1E13B\n#. SourceLocation:\t/Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_16.Text\n#. /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_SewerCreatures\"\nmsgid \"Don't worry! I'm still looking for it.\"\nmsgstr \"別擔心! 我還在找呢。\"\n\n#. Key:\t7914F3CA40844C2A13A760BB0DAE1BFA\n#. SourceLocation:\t/Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_4.Text\n#. /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_SewerCreatures\"\nmsgid \"I don't have time for you creature! Stay out of my way!\"\nmsgstr \"我可沒時間理妳！別擋道！\"\n\n#. Key:\t79A62658414FE0202F2E9AA0E0238BD4\n#. SourceLocation:\t/Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_9.Children(0).Children.Text\n#. /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_9.Children(0).Children.Text\n#: /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_9.Children(0).Children.Text\nmsgctxt \"Dialogue_SewerCreatures\"\nmsgid \"Accept Quest\"\nmsgstr \"接受任務\"\n\n#. Key:\t7EF6CBFA4A9C0B85B26AA6830C6121A2\n#. SourceLocation:\t/Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_1.Children(2).Children.Text\n#. /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_1.Children(2).Children.Text\n#: /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_1.Children(2).Children.Text\nmsgctxt \"Dialogue_SewerCreatures\"\nmsgid \"Leave\"\nmsgstr \"離開\"\n\n#. Key:\t85A2E48A4B27C5EB7DA4CFAA23555629\n#. SourceLocation:\t/Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_26.Text\n#. /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_26.Text\n#: /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_26.Text\nmsgctxt \"Dialogue_SewerCreatures\"\nmsgid \"Farewell and good luck to you as well!\"\nmsgstr \"再見，祝妳好運!\"\n\n#. Key:\t9AEDA0E84BABEBCD8F18E8BC2D0B75D0\n#. SourceLocation:\t/Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_20.Text\n#. /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_SewerCreatures\"\nmsgid \"Calm down creature! I mean you no harm.\"\nmsgstr \"妳這個生物給我冷靜壹點! 我對妳沒有惡意。\"\n\n#. Key:\tB89304534B24114D19DF7AB07635FFDE\n#. SourceLocation:\t/Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_10.Text\n#. /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_SewerCreatures\"\nmsgid \"All right I will see what I can do.\"\nmsgstr \"好吧，我看看我能做什麽。\"\n\n#. Key:\tB8BD374E4738BFFDAFAC4EAA19E7A9D2\n#. SourceLocation:\t/Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_23.Text\n#. /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_23.Text\n#: /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_23.Text\nmsgctxt \"Dialogue_SewerCreatures\"\nmsgid \"Oh, thank you!\"\nmsgstr \"噢，謝謝！\"\n\n#. Key:\tCAFA874D4ECD3CBFC0ADFD93048A9AA5\n#. SourceLocation:\t/Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_3.Text\n#. /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_SewerCreatures\"\nmsgid \"Just tell me what do you want...\"\nmsgstr \"告訴我妳想要什麽…\"\n\n#. Key:\tCF62984840B7508E82BAC0AB9D53EC0A\n#. SourceLocation:\t/Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_9.Children(1).Children.Text\n#. /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_9.Children(1).Children.Text\n#: /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_9.Children(1).Children.Text\nmsgctxt \"Dialogue_SewerCreatures\"\nmsgid \"Decline\"\nmsgstr \"拒絕\"\n\n#. Key:\tDA1FD0DC49E9B2999DCD489699C04106\n#. SourceLocation:\t/Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_1.Children(1).Children.Text\n#. /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_1.Children(1).Children.Text\n#: /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_1.Children(1).Children.Text\nmsgctxt \"Dialogue_SewerCreatures\"\nmsgid \"Let it talk\"\nmsgstr \"讓它說話\"\n\n#. Key:\tEAD329F04773358B0CA339A4F155D990\n#. SourceLocation:\t/Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_11.Text\n#. /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/TL/SewerCreatures.SewerCreatures:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_SewerCreatures\"\nmsgid \"I'm sorry but I can't help you.\"\nmsgstr \"對不起，我幫不了妳。\"\n\n#. Key:\tDA8649E54E3753ECDF9C4EAAB90D42B6\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/sewertut1.sewertut1:DlgNode_Speech_1.Text\n#. /Game/SO/Dialogues/Wizard/Chapter1/sewertut1.sewertut1:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/sewertut1.sewertut1:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_sewertut1\"\nmsgid \"I don't like the idea of this additional challenge, but without the help of the Keeper you won't be able to get out.\"\nmsgstr \"我不喜歡這個額外的挑戰，但是如果沒有守護者的幫助，妳是不可能出去的。\"\n\n#. Key:\t462EF40B4BF77FA77FD98DB4656692A2\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/sewertut2_magicbox.sewertut2_magicbox:DlgNode_Speech_1.Text\n#. /Game/SO/Dialogues/Wizard/Chapter1/sewertut2_magicbox.sewertut2_magicbox:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/sewertut2_magicbox.sewertut2_magicbox:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_sewertut2_magicbox\"\nmsgid \"It's a magic box! That's what it's supposed to do, demon.\"\nmsgstr \"這是壹個神奇的盒子! 它肯定就是，惡魔。\"\n\n#. Key:\tC34B7D8D499A8E8B767A58A19537A1EA\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/sewertut2_magicbox.sewertut2_magicbox:DlgNode_Speech_2.Text\n#. /Game/SO/Dialogues/Wizard/Chapter1/sewertut2_magicbox.sewertut2_magicbox:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/sewertut2_magicbox.sewertut2_magicbox:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_sewertut2_magicbox\"\nmsgid \"Is that box just floating in the air?\"\nmsgstr \"那個盒子只是漂浮在空中嗎?\"\n\n#. Key:\t348CCFC54F7E952295416496617F7615\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/sewertut3_silverkey.sewertut3_silverkey:DlgNode_Speech_2.Text\n#. /Game/SO/Dialogues/Wizard/Chapter1/sewertut3_silverkey.sewertut3_silverkey:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/sewertut3_silverkey.sewertut3_silverkey:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_sewertut3_silverkey\"\nmsgid \"What is that crystal?\"\nmsgstr \"那塊水晶是什麽?\"\n\n#. Key:\t554B6C924D0234A869BDFF9412FC4F49\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/sewertut3_silverkey.sewertut3_silverkey:DlgNode_Speech_1.Text\n#. /Game/SO/Dialogues/Wizard/Chapter1/sewertut3_silverkey.sewertut3_silverkey:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/sewertut3_silverkey.sewertut3_silverkey:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_sewertut3_silverkey\"\nmsgid \"Don't care about that. Focus on finding a way out.\"\nmsgstr \"別管那個。集中精力尋找出路。\"\n\n#. Key:\t015A0B11422A6F2AE027FF8D9DF70664\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_15.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"We need his help.\"\nmsgstr \"我們需要他的幫助。\"\n\n#. Key:\t03C73AA849BF05421AB97BA696A8C9C4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_79.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_79.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_79.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"They always wanted to invade the Outpost. They are many and we are few.\"\nmsgstr \"他們總是想入侵前哨。他們人數眾多，而我們寥寥無幾。\"\n\n#. Key:\t0849CCCF4491D52B38AE7F827841E479\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_4.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Why should I set you free?\"\nmsgstr \"我為什麽要放了妳？\"\n\n#. Key:\t090C7BBF4222952E1C3FD38F7CF9927E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_76.Text\n#. Key:\t0AC46EF744AA55EDDA83EDB6899BB2D1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_65.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_76.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_65.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_65.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_76.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Some say Tabby's spirit returned and took the artefacts to Lillian. Maybe that is what happened.\"\nmsgstr \"有人說泰比的靈魂回來了，帶著這些工藝品去了莉莉安那裏。也許事實就是如此。\"\n\n#. Key:\t094943BF4D9202CE7B1CFCBF151886D5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_19.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Back to the question: will you get me out?\"\nmsgstr \"回到這個問題: 妳能把我救出來嗎?\"\n\n#. Key:\t0DBF728A4C052550BE5EEDBC9DEFB2E0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_29.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_29.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_29.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"I would invite you for dinner but unfortunately the door is closed.\"\nmsgstr \"我想請妳吃飯，但遺憾的是門關著。\"\n\n#. Key:\t112A48C54853F7689E1676A11FA8C352\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_48.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_48.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_48.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"No time to talk!\"\nmsgstr \"沒閑功夫交談！\"\n\n#. Key:\t116C39AA495E99500962E8B3AF10DD4A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_83.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_83.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_83.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"I mean I'm sorry about the others... not that you survived.\"\nmsgstr \"我是對其他人很遺憾，而不是因為妳存活下來。\"\n\n#. Key:\t134299214C22044B012C27B62337C08E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_69.Text\n#. Key:\tFD1574E845CB284B7A85F09CA1580DD4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_58.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_69.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_58.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_58.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_69.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"But she is gone for months and no one knows where she might be.\"\nmsgstr \"但是她已經走了好幾個月了，沒有人知道她可能在哪裏。\"\n\n#. Key:\t14BD2A7C45E85692430B34820042C96F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_73.Text\n#. Key:\tEA5320F3406E2BFA9BD954899BFA19DA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_62.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_73.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_62.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_62.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_73.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"He had so many friends. We all gathered and buried him near the Ancient Temple.\"\nmsgstr \"他有很多朋友。我們集合起來，把他埋在民古廟附近。\"\n\n#. Key:\t16E175D0437B4A671F4753A56E840278\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_33.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_33.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_33.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"I’m looking for three artefacts. Do you know something about them?\"\nmsgstr \"我在找三件工藝品。妳對它們有什麽了解嗎？\"\n\n#. Key:\t174BA1E34131FB1BD5A543A3CB86C724\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_35.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_35.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_35.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"I will return to the Main Station at Crossroad Cave and see what I can do with the trains.\"\nmsgstr \"我將回到十字路口洞穴的主站，看看我能對火車做些什麽。\"\n\n#. Key:\t1769115D4B72AB6CF8641487126A4A18\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_22.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"It has a key. The end of it is shaped like a dwarven helmet. You can easily recognise it.\"\nmsgstr \"它有壹把鑰匙。它的末端形狀像壹個地精的頭盔。妳很容易就能認出它。\"\n\n#. Key:\t17CBB2E24B331E4C5682919AAD2E7F2E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_60.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_60.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_60.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"What happened to Tabby?\"\nmsgstr \"泰比怎麽了？\"\n\n#. Key:\t1AA8B2E541B2B2E7CA1E86B1E08C1E5A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_7.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"They are all dead...\"\nmsgstr \"他們都死了...\"\n\n#. Key:\t1FCCD37546681195736D2290A8DAE121\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_28.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Oh, it’s you again.\"\nmsgstr \"噢，又是妳。\"\n\n#. Key:\t2581B27E486A1C71835E5BB44B0AE05E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_37.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_37.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_37.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"But first I finish my supper. See you there!\"\nmsgstr \"但我先吃完晚飯。看到妳在那裏!\"\n\n#. Key:\t2589E4AA4E5A406F6A98CB87D7382DC0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_6.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Just ask one of the other dwarfs to open the door.\"\nmsgstr \"只要叫其他地精的壹個打開門。\"\n\n#. Key:\t26162C784D2E65A2F8F491A80838F754\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_24.Children(4).Children.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_24.Children(4).Children.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_24.Children(4).Children.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Everyone dead?\"\nmsgstr \"所有人都死了？\"\n\n#. Key:\t2FEAED2844737D1B20BA64AE2414D8C6\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_72.Text\n#. Key:\tA119C2164FDE16E8F84B4E89578A1015\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_61.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_72.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_61.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_61.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_72.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"By the time I found him he was dead.\"\nmsgstr \"我找到他的時候，他已經死了。\"\n\n#. Key:\t3203A6044456CD8213037A9B1B668763\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_2.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Please help me out!\"\nmsgstr \"請幫幫我！\"\n\n#. Key:\t32C0BE7F49563BC2846691B4F163AEF7\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_8.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Well that explains why they didn’t come for me over the last four months.\"\nmsgstr \"這就解釋了為什麽他們在過去的四個月裏沒有來找我。\"\n\n#. Key:\t35F849134220FAE43E07268C439CE3A1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_31.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_31.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_31.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"What were you Dwarves doing here?\"\nmsgstr \"妳們地精在這兒幹嗎?\"\n\n#. Key:\t39D36DCA4CD40A7E19D4F5AE69954DC3\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_71.Text\n#. Key:\tEFD384D542A5869726CAB7945F4C0EC4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_54.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_71.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_54.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_54.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_71.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Tabby found the three artefacts but on his way home he got injured.\"\nmsgstr \"泰比找到了三件工藝品，但在回家的路上他受傷了。\"\n\n#. Key:\t39DEF30C4C3CCAB79867339AABD92BA0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_24.Children(3).Children.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_24.Children(3).Children.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_24.Children(3).Children.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Artefacts\"\nmsgstr \"工藝品\"\n\n#. Key:\t3AF0406744C4656C5604EF931A688715\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_23.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_23.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_23.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"I've found the key!\"\nmsgstr \"我找到鑰匙了！\"\n\n#. Key:\t3E074E784D66BE166553EB9F85D9854A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_3.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"How can I set you free?\"\nmsgstr \"我怎樣才能讓妳自由？\"\n\n#. Key:\t4100ECBE40C53051121F4C8A588FBDCB\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_24.Children(2).Children.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_24.Children(2).Children.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_24.Children(2).Children.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Train\"\nmsgstr \"火車\"\n\n#. Key:\t41085B174230937FAF97CDBC868F852A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_24.Children(5).Children.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_24.Children(5).Children.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_24.Children(5).Children.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Leave\"\nmsgstr \"離開\"\n\n#. Key:\t4204AAFB49C665B3CC32D78301307582\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_45.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_45.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_45.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Do you mean those traps out there?\"\nmsgstr \"妳是說那些陷阱嗎?\"\n\n#. Key:\t44AF6FF04B8A23F656F485AB9F1AFE60\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_36.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_36.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_36.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Catch me there if you need to go somewhere!\"\nmsgstr \"如果妳需要去什麽地方，就在那兒找我!\"\n\n#. Key:\t48FC728C4467C7CF9692AEB8CC71352D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_49.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_49.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_49.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"I will catch you at Crossroad Cave after I finished my supper.\"\nmsgstr \"我吃完晚飯就去十字路口洞穴找妳。\"\n\n#. Key:\t4A74231B43F74B39906C85904332EE87\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_5.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"What happened? How did you end up here?\"\nmsgstr \"發生了什麽事?  妳怎麽到這兒來的?\"\n\n#. Key:\t4FE354D247D257B181993087E5ADC74C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_11.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Errr... I don’t know... out of pure righteousness perhaps?\"\nmsgstr \"哦…… 我不知道… 也許是出於純粹的正義?\"\n\n#. Key:\t529895FF4D6B505A0EDB5081215845AE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_53.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_53.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_53.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"He wasn't just an ordinary cat. He was somehow connected to a charming young girl called Lillian.\"\nmsgstr \"他不只是壹只普通的貓。不知怎麽的，他和壹個叫莉莉安的迷人的年輕女孩扯上了關系。\"\n\n#. Key:\t5C005582439FD5753AA90BB72F3284C8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_44.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_44.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_44.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"We build walls. We create machines out of golem spirits with simple rules which can't go wrong.\"\nmsgstr \"我們築造了墻壁。我們用簡單的規則創造出不會出錯的機器人靈魂。\"\n\n#. Key:\t5C48292B4E4F1FAF4D7BB487713EA0B1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_59.Text\n#. Key:\t7F06827C4756423AE024F99922B00FDE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_70.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_59.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_70.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_59.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_70.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"I hope she will return.\"\nmsgstr \"我希望她會回來。\"\n\n#. Key:\t624EDA19418303508EA7F58C5BD0DB4E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_20.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"All right!\"\nmsgstr \"好的！\"\n\n#. Key:\t64E994E34D543F58D0F9DAA386AD7438\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_12.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Or do you like trains? I can help you redirect them to stations you couldn’t go otherwise.\"\nmsgstr \"那妳喜歡火車嗎?  我可以幫妳把它們轉去妳去不了的地方。\"\n\n#. Key:\t674A3DC8404EF8FC317D72A70877A0FF\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_16.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Errr... You know, sometimes in the evening I come here and have some late dinner. And there are others who think it would be funny to close the door when I'm inside.\"\nmsgstr \"哦…… 妳知道，有時候晚上我來這裏吃晚餐。還有壹些人覺得當我在裏面的時候把門關上很有趣。\"\n\n#. Key:\t6B07A15F4E86ECA507DE1DA9B0634774\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_74.Text\n#. Key:\t8F415D40481AA448025D79AB123B2DEB\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_63.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_74.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_63.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_63.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_74.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"He was a good friend. We all miss him.\"\nmsgstr \"他是個很好的朋友。我們都很想念他。\"\n\n#. Key:\t6B47D3994D188506700B48BE85E0C740\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_14.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Once you collected all the artefacts you will need to take them back to a point where I can transport you to the Human Realm.\"\nmsgstr \"壹旦妳收集了所有的工藝品，妳需要把它們帶回壹個指定地點，在那裏我可以把妳帶到人類王國。\"\n\n#. Key:\t6B72634A488C0A9471F52AA154E56709\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_82.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_82.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_82.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"I’m sorry about that.\"\nmsgstr \"我很抱歉。\"\n\n#. Key:\t6C7C51F44B3881DDF4AE41B10F4D29E1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_52.Children(0).Children.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_52.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_52.Children(0).Children.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Tabby?\"\nmsgstr \"泰比？\"\n\n#. Key:\t6EC585D64AFBB18576EE17B9DFC08AD7\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_2.Children(2).Children.Text\n#. Key:\tFB66CFE943F6EF32D1A40987B969DCDF\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_52.Children(1).Children.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_2.Children(2).Children.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_52.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_2.Children(2).Children.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_52.Children(1).Children.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"What happened?\"\nmsgstr \"怎麽了？\"\n\n#. Key:\t766A9A50425FA0D0A0374390B2AF5980\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_17.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"I like jokes and it would have been funny for I don’t know a few hours maybe...\"\nmsgstr \"我喜歡笑話，這可能會很有趣，我不知道，也許幾個小時……\"\n\n#. Key:\t81ABC3E441BE2D3A19257BBC9DDD42D0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_41.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_41.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_41.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"You can go down there by using the elevator.\"\nmsgstr \"妳可以乘電梯下去。\"\n\n#. Key:\t85B4C0DB47A2A3C3D504C29965DB6390\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_75.Text\n#. Key:\tE6F106AA404B92C9C6E8889876002813\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_64.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_75.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_64.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_64.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_75.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"We left the artefacts at his tomb, but one day later they disappeared.\"\nmsgstr \"我們把這些工藝品留在他的墓前，但壹天後它們就不見了。\"\n\n#. Key:\t88F0611349D22BB5B8411FA1232B8724\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_38.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_38.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_38.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Bye!\"\nmsgstr \"再見！\"\n\n#. Key:\t8A2BA24948D65C3EC801B6AA589C206F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_30.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_30.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_30.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Welcome back!\"\nmsgstr \"歡迎回來！\"\n\n#. Key:\t8A3CCFA44EAB376D6CB4C3B7DD8CEE8D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_53.Children(0).Children.Text\n#. Key:\tEEEF64F84F3FE0A37D029EB1A8BBE8A9\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_55.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_53.Children(0).Children.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_55.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_53.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_55.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Lillian?\"\nmsgstr \"莉莉安？\"\n\n#. Key:\t8B9C46EA4C46385E6B3770BBD4648280\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_67.Text\n#. Key:\t999245954FBA1853A5E67A88353F152E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_56.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_67.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_56.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_56.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_67.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Lillian was really kind to us Dwarves. We couldn't ever meet her in person but she could talk to us via the cat Tabby.\"\nmsgstr \"莉莉安對我們矮人真的很好。我們不能親自見她，但她可以通過泰比和我們交談。\"\n\n#. Key:\t90C6625D4ED5F6EA08B07A87450A1BC9\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_32.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_32.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_32.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"You said something about trains...\"\nmsgstr \"妳說了關於火車的事…\"\n\n#. Key:\t92793D7F4D0351BF74BB6A8C3EE6A182\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_21.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"How can I open the door?\"\nmsgstr \"我怎麽開門?\"\n\n#. Key:\t941CF27C40D3D82D6B41F5B3DD6501BB\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_52.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_52.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_52.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"My friend Tabby was also looking for artefacts.\"\nmsgstr \"我的朋友泰比也在尋找工藝品。\"\n\n#. Key:\t991D611A4F8BE2F8EAC77C9D746BAF95\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_78.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_78.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_78.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"I think the Kobolds attacked us by surprise.\"\nmsgstr \"我認為地精是突然襲擊我們的。\"\n\n#. Key:\t9A7FA46C4687C80EBE3B4580631E9B8E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_43.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_43.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_43.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"After the Cataclysm we realized the only way to fight madness is to create rules to follow.\"\nmsgstr \"大災難之後，我們意識到對抗瘋狂的唯壹方法就是制定規則。\"\n\n#. Key:\t9E9CE4714145ED45CA301AACA6CEBBAF\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_40.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_40.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_40.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"But there is a spare key in the Catacombs.\"\nmsgstr \"但是地下墓穴裏有壹把備用鑰匙。\"\n\n#. Key:\t9ED5DDC74852A2007D25CDB418A3EDDA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_46.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_46.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_46.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"They surely have nothing to do with madness...\"\nmsgstr \"他們肯定與瘋狂沒什麽關系 ……\"\n\n#. Key:\tA0117BB74AB541DE10847FBC5E5CCB32\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_10.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"What we were doing? Well we Dwarves are not like other creatures you might have met.\"\nmsgstr \"我們在做什麽? 我們地精和妳可能見過的其他生物不壹樣。\"\n\n#. Key:\tA258ABB740D6727685853E88F32936E2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_13.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"That sounds useful.\"\nmsgstr \"這聽起來很有用。\"\n\n#. Key:\tA3F231E34FB4B95DD27A84B9326E0BFE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_24.Children(0).Children.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_24.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_24.Children(0).Children.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Key\"\nmsgstr \"鑰匙\"\n\n#. Key:\tB0B806C147D2EB9F312987B49DEBFC8F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_47.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_47.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_47.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"See? They are simple, effective and logical. Ruin can't harm us as long as we follow all the rules.\"\nmsgstr \"看到了嗎?  它們簡單、有效、合乎邏輯。只要我們遵守所有的規則，毀滅就不會傷害我們。\"\n\n#. Key:\tB464CECC4F774535530FC685E0F62787\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_77.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_77.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_77.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Do you have any idea how the others died?\"\nmsgstr \"妳知道其他人是怎麽死的嗎?\"\n\n#. Key:\tBE69B91C466965EEF56A6F920AF9E5A8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_9.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"I thought they were just kidding.\"\nmsgstr \"我以為他們只是在開玩笑。\"\n\n#. Key:\tBFEAB99A4FE8C61CC35BCC9E926EFA97\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_51.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_51.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_51.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Just help me out.\"\nmsgstr \"幫幫我吧。\"\n\n#. Key:\tC06E3A27466B5D6C7FC4A39E55739800\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_18.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"But being here for four months seems a bit too much for me.\"\nmsgstr \"但是在這裏呆四個月對我來說有點太久了。\"\n\n#. Key:\tC31327F8430D2259C27BAE91F44F0119\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_2.Children(0).Children.Text\n#. Key:\tCCD4C84941546627E158A4915B41CDB7\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_19.Children(0).Children.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_2.Children(0).Children.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_19.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_19.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_2.Children(0).Children.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"How?\"\nmsgstr \"如何？\"\n\n#. Key:\tC3BFAD59497E357A8180ADB86C75F14B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_68.Text\n#. Key:\tFF1A18C04F33FF434A2821A725CBFB5C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_57.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_68.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_57.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_57.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_68.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"She cared about us. She knew all our Strongholds and Outposts. She always warned us before the Kobolds attacked.\"\nmsgstr \"她在乎我們。她知道我們所有的據點和前哨。她總是在地精攻擊之前警告我們。\"\n\n#. Key:\tC5A94EDD47BC3D5F422A29982308E78D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_19.Children(1).Children.Text\n#. Key:\tF811970946DF32346DAE66AFE2F64664\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_2.Children(1).Children.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_19.Children(1).Children.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_2.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_19.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_2.Children(1).Children.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Why?\"\nmsgstr \"為什麽？\"\n\n#. Key:\tC8E54B6E448A194DEB141C84323308F6\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_80.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_80.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_80.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"It was only a matter of time.\"\nmsgstr \"這只是時間問題。\"\n\n#. Key:\tCA02594643A55D1128F06FB2E8FDE676\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_50.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_50.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_50.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Yes, trains. I can help you reach destinations you couldn't reach on your own.\"\nmsgstr \"是的, 火車。我可以幫妳到達妳自己無法到達的目的地。\"\n\n#. Key:\tCC191532450BFB2679AFD88AD95B72B2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_1.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Finally someone!\"\nmsgstr \"終於有人了！\"\n\n#. Key:\tCF4351D047E267981EF869BE88BB0753\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_24.Children(1).Children.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_24.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_24.Children(1).Children.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Dwarves\"\nmsgstr \"地精\"\n\n#. Key:\tD2377C864A2A80F17AD81581D7A7807F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_81.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_81.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_81.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Odd that I survived.\"\nmsgstr \"奇怪的是我活了下來。\"\n\n#. Key:\tDF12303E4C7A4DFB00054EA7CE07FF88\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_39.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_39.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_39.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Errr... I don't know.\"\nmsgstr \"呃... 我不知道。\"\n\n#. Key:\tE8270F474353ECB77560C4A1173638A2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_27.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_27.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_27.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Any idea where that key might be?\"\nmsgstr \"知道鑰匙在哪裏嗎?\"\n\n#. Key:\tEF1EFC6E4119CC9B41AF21ACE008D3B5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_26.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_26.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_26.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Have you found the key?\"\nmsgstr \"妳找到鑰匙嗎？\"\n\n#. Key:\tF47418854FDFB9AD0E10468BEC8F1F58\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_42.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_42.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_42.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"I need to go now.\"\nmsgstr \"我現在得走了。\"\n\n#. Key:\tF553C35F43DFC6CA04DA48A738597696\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_25.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_25.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_25.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Back already?\"\nmsgstr \"已經回來了？\"\n\n#. Key:\tFF942F904300D874A8C59AB8A954EF86\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_34.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_34.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf.SupperDwarf:DlgNode_Speech_34.Text\nmsgctxt \"Dialogue_SupperDwarf\"\nmsgid \"Well done! Thank you! Thank you!\"\nmsgstr \"幹得好！謝謝！謝謝！\"\n\n#. Key:\t0499C9ED4395C4DD8AD1E48E854CD983\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_20.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"It was nice to see you too!\"\nmsgstr \"見到妳也很高興！\"\n\n#. Key:\t07153D014D72AF193040BA91A18BDC0A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_24.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_24.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_24.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"Great!\"\nmsgstr \"太好了！\"\n\n#. Key:\t106E51E34033895E5C7F348AF8994564\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_13.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"Er... Thanks! We'll talk about this later.\"\nmsgstr \"呃…謝謝! 我們稍後再談。\"\n\n#. Key:\t18E140B74385C5E48F23E0B7E862E569\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_19.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"Hello! It's nice to see you again.\"\nmsgstr \"妳好! 很高興再次見到妳。\"\n\n#. Key:\t25F72BCA416C39658A0879A27417EA6B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_8.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"Don’t worry, I’ll make ready a train for you heading that way.\"\nmsgstr \"別擔心，我會為妳準備好開往那個方向的火車。\"\n\n#. Key:\t26CBB1CD40F2080DE2183BA6AB3D2014\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_4.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"Ask him how you can travel to World’s End.\"\nmsgstr \"問問他妳怎樣才能到達世界的盡頭。\"\n\n#. Key:\t26D1F4534C708623FB300DBE4EECADD2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_22.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"But I can't go back, because it's not safe.\"\nmsgstr \"但我不能回去，因為不安全。\"\n\n#. Key:\t2B14E76B4B16316D7525FFA6D37E4CBB\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_14.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"You know I'm a bit worried about what will happen to the Outpost.\"\nmsgstr \"妳知道我有點擔心前哨的事。\"\n\n#. Key:\t2BB0F16046A4CD8DF05DE6A95D2CF9B3\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_2.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"I’m really glad you found that key for me. Now I can finish my supper outside in fresh air!\"\nmsgstr \"真高興妳幫我找到了那把鑰匙。現在我可以在外面新鮮的空氣中吃完我的晚餐了!\"\n\n#. Key:\t36EF13F042D5B5ADB870BEB97F688D08\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_29.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_29.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_29.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"Take this! You deserve it!\"\nmsgstr \"收下吧! 妳受之無愧！\"\n\n#. Key:\t3E09B8F746E999130D26A0BEA945E6D6\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_15.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"Is everything all right?\"\nmsgstr \"壹切都好嗎?\"\n\n#. Key:\t4D5A326948713FE977D0DBB68CF4A475\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_27.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_27.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_27.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"Except those crazy traps...\"\nmsgstr \"除了那些瘋狂的陷阱…\"\n\n#. Key:\t5BE2C4324B64B35BD181B49E2D63E87F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_3.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"By the way, in case you need to go somewhere with the train just let me know.\"\nmsgstr \"順便說壹下，如果妳需要搭火車去什麽地方，請告訴我。\"\n\n#. Key:\t66EDC37F4F3B3813F1B92D91A4107ADE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_17.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"I have banished some of the monsters lurking in the Outpost.\"\nmsgstr \"我已經驅逐了壹些潛伏在前哨的怪物。\"\n\n#. Key:\t67EED0C742F3B4ED0A9B929C4B517A4A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_18.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"The Outpost is safe again.\"\nmsgstr \"前哨又安全了。\"\n\n#. Key:\t6F1AF94E4DE4A338EFF79C85D99B944A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_19.Children(1).Children.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_19.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_19.Children(1).Children.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"Outpost\"\nmsgstr \"前哨\"\n\n#. Key:\t84D15B994BADC0AAED61848E817E49E1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_9.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"Thanks!\"\nmsgstr \"謝謝！\"\n\n#. Key:\t8C7D69324C544DAC53C5CCA724B4B461\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_23.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_23.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_23.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"Could you somehow make the enemies move to somewhere else maybe?\"\nmsgstr \"妳能讓敵人轉移到別的地方嗎?\"\n\n#. Key:\t8F66738A44B7D19EABAD40873B3FCAA3\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_19.Children(0).Children.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_19.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_19.Children(0).Children.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"Do you need help?\"\nmsgstr \"妳需要幫忙嗎？\"\n\n#. Key:\t9249DFC34CFB46E1738C97A3283268D2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_28.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"Well done! Well done!\"\nmsgstr \"幹得好！幹得好！\"\n\n#. Key:\tA027C29849372B1C452083A84609B1F5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_19.Children(2).Children.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_19.Children(2).Children.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_19.Children(2).Children.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"Leave\"\nmsgstr \"離開\"\n\n#. Key:\tA037C9E543AC131DAF4B6281A27BD56C\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_1.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"Hello again my friend!\"\nmsgstr \"又見面了，我的朋友！\"\n\n#. Key:\tA4F1343D4D537FC1907096B564D3842E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_7.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"Oh, it must be a charming place!\"\nmsgstr \"哦，那壹定是個迷人的地方！\"\n\n#. Key:\tACF022EF4C55A6553F29DB969827379D\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_26.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_26.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_26.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"Anyway, take this for your effort!\"\nmsgstr \"不管怎樣，這是妳的努力成果!\"\n\n#. Key:\tB680A1D54923C59C081E46A65A2754D1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_21.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"As the last Defender, it would be my duty to keep that place safe.\"\nmsgstr \"作為最後壹名守衛者，我有責任保護好那個地方。\"\n\n#. Key:\tB9E0526D41FDB742FCB51991A0220B17\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_5.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"That’s where I can take you out of the Ruined Realm.\"\nmsgstr \"我就可以帶妳離開這片毀滅王國。\"\n\n#. Key:\tBF1AD65A407133C13B811CB14A997A2A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_11.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"We can talk some more once I've finished my supper...\"\nmsgstr \"等我吃完晚飯，我們可以再聊壹會兒……\"\n\n#. Key:\tE211EA4D4D69D09144B914850B17A8AE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_25.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_25.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_25.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"Well, I can't do my duty until you banish all of them.\"\nmsgstr \"除非妳把他們都趕走，否則我是不會履行我的職責的。\"\n\n#. Key:\tEFD408FF4DAFD18E10ED3282D959914E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_12.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"You don't need to go anywhere before you find the three artefacts.\"\nmsgstr \"妳不需要去任何地方就能找到這三件文物。\"\n\n#. Key:\tF500AA3C494B40302E298CA54FF3344B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_6.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"I would like to go to World’s End.\"\nmsgstr \"我想去世界的盡頭。\"\n\n#. Key:\tFDC63C35472E1752E2D092BC77DAD28B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_16.Text\n#. /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/Chapter2/SupperDwarf2.SupperDwarf2:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_SupperDwarf2\"\nmsgid \"I'll see what I can do.\"\nmsgstr \"我看看我能做什麽。\"\n\n#. Key:\t00A5A8684B1EF5FF2319428685540844\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_13.Children(0).Children.Text\n#. Key:\t471B46884399845B6D9442A8EADC2A48\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_9.Children(0).Children.Text\n#. /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_13.Children(0).Children.Text\n#. /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_9.Children(0).Children.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_13.Children(0).Children.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_9.Children(0).Children.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"Portal\"\nmsgstr \"入口\"\n\n#. Key:\t03EA3D4249797B593981C1B699A2CF5A\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_1.Text\n#. /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"Oh! The Walking Ball returned! Just in time!\"\nmsgstr \"哦! 步行球回來了! 很準時！\"\n\n#. Key:\t04DC604342615AD3DCFCE99EB9AAF157\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_19.Children(1).Children.Text\n#. Key:\t1070909F4434D9B0D03DD3BD62692CE0\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_16.Children(0).Children.Text\n#. Key:\t76A679CE45B5A9A47CA620A396E02F48\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_13.Children(2).Children.Text\n#. Key:\t8FC1E822454A2FDA1847119C5004F161\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_21.Children(0).Children.Text\n#. Key:\t9036093D446B2F8C34705BBCFC73F4A0\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_9.Children(2).Children.Text\n#. /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_19.Children(1).Children.Text\n#. /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_16.Children(0).Children.Text\n#. /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_13.Children(2).Children.Text\n#. /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_21.Children(0).Children.Text\n#. /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_9.Children(2).Children.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_13.Children(2).Children.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_16.Children(0).Children.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_19.Children(1).Children.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_21.Children(0).Children.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_9.Children(2).Children.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"Leave\"\nmsgstr \"離開\"\n\n#. Key:\t142E85484BA4E9CF475F0780D951BAE5\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_8.Text\n#. /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"But they were so tasty.\"\nmsgstr \"但是它們很好吃。\"\n\n#. Key:\t1E763B4D4D535AA83B50D4B87DB5A15D\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_17.Text\n#. /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"You again?\"\nmsgstr \"又是妳？\"\n\n#. Key:\t2430044E46A3456249D6A99D0FC31D30\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_9.Children(1).Children.Text\n#. Key:\tB3695A284A15574F3874BDAB1B8C14EB\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_19.Children(0).Children.Text\n#. Key:\tDC8D78774D326DA9A70EFC81A857A417\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_13.Children(1).Children.Text\n#. /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_9.Children(1).Children.Text\n#. /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_19.Children(0).Children.Text\n#. /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_13.Children(1).Children.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_13.Children(1).Children.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_19.Children(0).Children.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_9.Children(1).Children.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"Give Weird Device\"\nmsgstr \"給奇怪的裝置\"\n\n#. Key:\t29AD586B41502E4FAFF79E94FDADA50D\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_5.Text\n#. /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"Unfortunately I don't have any.\"\nmsgstr \"不幸的是我沒有。\"\n\n#. Key:\t3418CA5A44B4531926317CB100CEC2F4\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_13.Text\n#. /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"Just let me know when you're done! Meanwhile, I'll be reading a few more pages.\"\nmsgstr \"做完了就告訴我! 同時，我還要再讀幾頁。\"\n\n#. Key:\t37CD676C4C4F585C3CC048B56EEF6B92\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_3.Text\n#. /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"I was supposed to find a portal here.\"\nmsgstr \"我應該能在這裏找到入口。\"\n\n#. Key:\t3C2778B12A09151A002F016B1E3F6212\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_7.Text\n#. /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"Also, if I hadn't drank the last two bottles... that would have helped...\"\nmsgstr \"還有，如果我沒有喝完最後兩瓶…… 也許還有幫助……\"\n\n#. Key:\t42E3EE32491F578E618913B4AF958187\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_6.Text\n#. /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"Really? That sounds like my students! They were always complaining about unannounced examinations or even worse, \\\"Why are there no lessons tomorrow?\\\".\"\nmsgstr \"真的嗎? 聽起來像是我的學生! 他們總是抱怨考試不提前通知，還有，“為什麽明天沒有課?”\"\n\n#. Key:\t44626CCD498CA592B8FAD1B01EDF33AB\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_2.Children(0).Children.Text\n#. /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_2.Children(0).Children.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_2.Children(0).Children.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"Don't have\"\nmsgstr \"沒有\"\n\n#. Key:\t55EAD2524D0BCF52B25A1B9EAB1754B2\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_11.Text\n#. /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"That's it my ball! I wish I had more students like you.\"\nmsgstr \"這是我的球! 真希望我能有更多像妳這樣的學生。\"\n\n#. Key:\t6682474947E016803A188FA968FD76BE\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_16.Text\n#. /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"Oh my...\"\nmsgstr \"噢，我的...\"\n\n#. Key:\t786849EF4E531580865712BBEDD25B32\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_21.Text\n#. /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"That is amazing! Thank you, my globular friend! Take these coins, I am sure that you will enjoy spending them on... on whatever Balls like you like to get.\"\nmsgstr \"太厲害了! 謝謝妳，我的球形朋友! 把這些硬幣拿去吧，我相信妳會樂意把它們用來買……妳喜歡的球。\"\n\n#. Key:\t7FFC816545AA219D43FCA3A2ABF33E9E\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_9.Text\n#. /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"Nevermind, I will just read a bit more... at least until a solution is found for the whole problem.\"\nmsgstr \"算了，我再多讀壹點……  至少在整個問題找到解決方案之前先這樣吧。\"\n\n#. Key:\t818E4C1245F622C192178CB1F21694A3\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_2.Children(1).Children.Text\n#. /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_2.Children(1).Children.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_2.Children(1).Children.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"What's the matter?\"\nmsgstr \"出什麽事了？\"\n\n#. Key:\t84A119EB4FFB518BA7AA6394768F1DD3\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_18.Text\n#. /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"Did the Gatekeeper open the gate for you?\"\nmsgstr \"守護者幫妳開門了嗎？\"\n\n#. Key:\t88FD93954B70482DAC5F2AA5332F23D5\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_12.Text\n#. /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"One must always be eager to solve a problem. No matter how challenging that is.\"\nmsgstr \"壹個人必須總是急於解決問題。無論這有多麽具有挑戰性。\"\n\n#. Key:\t9CEE1942434DACB2DB3C1AA2005A1E94\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_10.Text\n#. /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"But we might find another way to solve the problem.\"\nmsgstr \"但我們可能會找到另壹種方法來解決這個問題。\"\n\n#. Key:\tC070EF8E47744D116D4E39AC8F7C1941\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_2.Text\n#. /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"I hope that you still have at least one bottle of that potion of mine. I could really use some...\"\nmsgstr \"我希望妳至少還有壹瓶我的那種藥水。我真的需要壹些…\"\n\n#. Key:\tC39CD0F34CDFDCB0B2CF08917834F1A8\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_20.Text\n#. /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"Here is a Weird Device that I found in the hideout of the Secret Science Society.\"\nmsgstr \"這是我在秘密科學協會的藏身處發現的壹個奇怪的裝置。\"\n\n#. Key:\tCBB0BCAF4E19F942AC57F988104A9A65\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_4.Text\n#. /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"I've used all of them to get back from the Sewer. You should have told me that there is another way out!\"\nmsgstr \"為了從下水道回來我把它們都花光了。妳之前就應該告訴我還有另壹條出路!\"\n\n#. Key:\tE866A83647B163E53260C2B541AA0D7B\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_14.Text\n#. /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"Well, the portal is definitely here, but as you might have already noticed, the place is a bit worn.\"\nmsgstr \"嗯，入口肯定在這裏，但是正如您可能已經註意到的，這個地方有點破舊。\"\n\n#. Key:\tF0A4AD1448267D94CAB7F79AD6CEFD59\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_19.Text\n#. /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"Not Yet.\"\nmsgstr \"還沒有。\"\n\n#. Key:\tF83C2C894C2EA511DCDCE6B824CC0591\n#. SourceLocation:\t/Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_15.Text\n#. /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/GK/Teachy_GK.Teachy_GK:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_Teachy_GK\"\nmsgid \"Only the Gatekeeper can reopen the portal.\"\nmsgstr \"只有守護者才能重新打開入口。\"\n\n#. Key:\t76653DEC40EE0ED098B5EE8810B1A097\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/TL_GetSoulkeeper.TL_GetSoulkeeper:DlgNode_Speech_3.Text\n#. /Game/SO/Dialogues/Wizard/Chapter1/TL_GetSoulkeeper.TL_GetSoulkeeper:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/TL_GetSoulkeeper.TL_GetSoulkeeper:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_TL_GetSoulkeeper\"\nmsgid \"A Spellcaster. It makes you able to use the Ruined Realm's magic, at least, up to a certain level.\"\nmsgstr \"施法者。至少在壹定程度上，它能讓妳使用被毀滅王國的魔法。\"\n\n#. Key:\tBD48F7804F49751510AB2E909906C52F\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/TL_GetSoulkeeper.TL_GetSoulkeeper:DlgNode_Speech_2.Text\n#. /Game/SO/Dialogues/Wizard/Chapter1/TL_GetSoulkeeper.TL_GetSoulkeeper:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/TL_GetSoulkeeper.TL_GetSoulkeeper:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_TL_GetSoulkeeper\"\nmsgid \"What is it?\"\nmsgstr \"這是什麽？\"\n\n#. Key:\tDFF1C93D4005A778F0B696A2DC949DC6\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/TL_GetSoulkeeper.TL_GetSoulkeeper:DlgNode_Speech_1.Text\n#. /Game/SO/Dialogues/Wizard/Chapter1/TL_GetSoulkeeper.TL_GetSoulkeeper:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/TL_GetSoulkeeper.TL_GetSoulkeeper:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_TL_GetSoulkeeper\"\nmsgid \"That amulet is useful.\"\nmsgstr \"那個護身符很有用。\"\n\n#. Key:\t09CDAFF84CF3F066B25A228640D45277\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_TL_Monk\"\nmsgid \"Please tell your Wizard that Monk would like to have a word with him.\"\nmsgstr \"請告訴妳的巫師，修道士想和他談談。\"\n\n#. Key:\t0E97585C46B73E4AF939169CF45067A3\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_10.Text\n#. /Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_TL_Monk\"\nmsgid \"I can only guess that right now, he's complaining about me.\"\nmsgstr \"我現在只能猜測，他在抱怨我。\"\n\n#. Key:\t2E82A2B6449D8BA37ADBE7AEE1486791\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_11.Text\n#. /Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_TL_Monk\"\nmsgid \"Just get rid of him.\"\nmsgstr \"把他幹掉。\"\n\n#. Key:\t430D927D40EF24EED23E55A83F48FDD7\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_TL_Monk\"\nmsgid \"I'm sorry but he doesn't want to talk to you.\"\nmsgstr \"對不起，他不想和妳說話。\"\n\n#. Key:\t59E21DC1476038EAD4EC91BC00DA4D8B\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_3.Children(2).Children.Text\n#. /Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_3.Children(2).Children.Text\n#: /Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_3.Children(2).Children.Text\nmsgctxt \"Dialogue_TL_Monk\"\nmsgid \"Ask Wizard\"\nmsgstr \"詢問巫師\"\n\n#. Key:\t5AFB166C49DEB2D9017AED887A1E424D\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_15.Text\n#. /Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_TL_Monk\"\nmsgid \"Farewell, my friend, until we meet again!\"\nmsgstr \"再見了，我的朋友，下次再見！\"\n\n#. Key:\t5D80CBEB46203E3A759B498B95571F4F\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_3.Children(1).Children.Text\n#. /Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_3.Children(1).Children.Text\n#: /Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_3.Children(1).Children.Text\nmsgctxt \"Dialogue_TL_Monk\"\nmsgid \"I won't transfer!\"\nmsgstr \"我不會轉移！\"\n\n#. Key:\t66D9E1874A9749A8881372807C0B9D54\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_TL_Monk\"\nmsgid \"Ha-ha-ha... I know he heard everything.\"\nmsgstr \"哈哈哈…… 我知道他什麽都聽到了。\"\n\n#. Key:\t8BD7C20C4084000925D1489BE3F6EE15\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_TL_Monk\"\nmsgid \"I don't talk to him!\"\nmsgstr \"我不和他說話！\"\n\n#. Key:\tA227CE5A47002A80D3988ABA1364CF3E\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_3.Children(0).Children.Text\n#. /Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_3.Children(0).Children.Text\n#: /Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_3.Children(0).Children.Text\nmsgctxt \"Dialogue_TL_Monk\"\nmsgid \"Wizard don't want\"\nmsgstr \"巫師不想要\"\n\n#. Key:\tA8E469374586A1D8A734D696AF662F9A\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_13.Text\n#. /Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_TL_Monk\"\nmsgid \"I also have something for you, Wanderer!\"\nmsgstr \"我也有東西給妳，流浪者!\"\n\n#. Key:\tCE0E3B1B424BEDDF4A830B8DD0BB3272\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_19.Text\n#. /Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_TL_Monk\"\nmsgid \"This might help you along the way.\"\nmsgstr \"這可能會對妳有所幫助。\"\n\n#. Key:\tD6B184754B86F236C93454A95BF92B31\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_TL_Monk\"\nmsgid \"I won't deliver your messages anymore! If the two of you want something, then go get it yourselves!\"\nmsgstr \"我不會再給妳送信了! 如果妳們兩個想要什麽，那就自己去爭取吧!\"\n\n#. Key:\tDB3AEAF24056B19A7D80E29E7D011D80\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_12.Text\n#. /Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_TL_Monk\"\nmsgid \"That's right. I will give him more time.\"\nmsgstr \"沒錯。我會給他更多的時間。\"\n\n#. Key:\tE2F9F07A4A2B8D1A578BCC9716AB4D44\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_TL_Monk\"\nmsgid \"Wizard! A fellow named Monk wants to talk to you!\"\nmsgstr \"巫師！壹個叫修道士的家夥想和妳聊聊！\"\n\n#. Key:\tE8987AC84528E4071DC27E9854C3C4DE\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_TL_Monk\"\nmsgid \"Hello, little Wanderer!\"\nmsgstr \"哈嘍，小流浪者！\"\n\n#. Key:\tFF355D9347D0068FBB40879E3EAEA8FB\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/TL/TL_Monk.TL_Monk:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_TL_Monk\"\nmsgid \"But please...\"\nmsgstr \"但請拜托...\"\n\n#. Key:\tAC0DE5F1402FBAAFE6587B827D463C3C\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/TL_SoulkeeperHint.TL_SoulkeeperHint:DlgNode_Speech_1.Text\n#. /Game/SO/Dialogues/Wizard/Chapter1/TL_SoulkeeperHint.TL_SoulkeeperHint:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/TL_SoulkeeperHint.TL_SoulkeeperHint:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_TL_SoulkeeperHint\"\nmsgid \"Use the Soulstone to summon the Keeper.\"\nmsgstr \"使用靈魂石召喚守護者。\"\n\n#. Key:\t031849B3493F1528A0146DA55BD7F00F\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/TL_TakeSoulkeeperHint.TL_TakeSoulkeeperHint:DlgNode_Speech_3.Text\n#. /Game/SO/Dialogues/Wizard/Chapter1/TL_TakeSoulkeeperHint.TL_TakeSoulkeeperHint:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/TL_TakeSoulkeeperHint.TL_TakeSoulkeeperHint:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_TL_TakeSoulkeeperHint\"\nmsgid \"It would be easier if I could just simply summon her back to me...\"\nmsgstr \"如果我能把她叫回來就好辦多了……\"\n\n#. Key:\t259EE9E14B86B2597D5F4EA60831D269\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/TL_TakeSoulkeeperHint.TL_TakeSoulkeeperHint:DlgNode_Speech_4.Text\n#. /Game/SO/Dialogues/Wizard/Chapter1/TL_TakeSoulkeeperHint.TL_TakeSoulkeeperHint:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/TL_TakeSoulkeeperHint.TL_TakeSoulkeeperHint:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_TL_TakeSoulkeeperHint\"\nmsgid \"Be more careful the next time...\"\nmsgstr \"下次小心點……\"\n\n#. Key:\t86266BC54CC02BE988EA24B18BF76359\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/TL_TakeSoulkeeperHint.TL_TakeSoulkeeperHint:DlgNode_Speech_1.Text\n#. /Game/SO/Dialogues/Wizard/Chapter1/TL_TakeSoulkeeperHint.TL_TakeSoulkeeperHint:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/TL_TakeSoulkeeperHint.TL_TakeSoulkeeperHint:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_TL_TakeSoulkeeperHint\"\nmsgid \"Now go back to the Soulkeeper.\"\nmsgstr \"現在回到靈魂守護者那裏。\"\n\n#. Key:\tDCA8CF9A4CFF4644FBD42EADBFC6E773\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/TL_TakeSoulkeeperHint.TL_TakeSoulkeeperHint:DlgNode_Speech_2.Text\n#. /Game/SO/Dialogues/Wizard/Chapter1/TL_TakeSoulkeeperHint.TL_TakeSoulkeeperHint:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/TL_TakeSoulkeeperHint.TL_TakeSoulkeeperHint:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_TL_TakeSoulkeeperHint\"\nmsgid \"Er... It's still with me.\"\nmsgstr \"呃… 它還在我身邊。\"\n\n#. Key:\t012DDB8E4423EB98285155B3E1EFBF9A\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_65.Children(2).Children.Text\n#. Key:\t3485AE344D04D0944341F3A7391703EF\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.Children(3).Children.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_65.Children(2).Children.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.Children(3).Children.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_65.Children(2).Children.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.Children(3).Children.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"Set me free\"\nmsgstr \"放了我\"\n\n#. Key:\t04E44BE94ABFE8614689AC890D01001D\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_65.Children(1).Children.Text\n#. Key:\t275944AA468D9CA8613B9586EC3D9C62\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.Children(2).Children.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_65.Children(1).Children.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.Children(2).Children.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_65.Children(1).Children.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.Children(2).Children.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"How to open gate\"\nmsgstr \"如何打開大門\"\n\n#. Key:\t10EB6BE941C633380422F7953F0171DA\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_2.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"I think... I am...\"\nmsgstr \"我想... 我是...\"\n\n#. Key:\t22618C8F490BC5932411FFB41F38C383\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.SpeechSequence(0).SpeechSequence.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.SpeechSequence(0).SpeechSequence.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.SpeechSequence(0).SpeechSequence.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"Oh! A walking ball!\"\nmsgstr \"噢！壹個會走的球！\"\n\n#. Key:\t28ED4B8B4023E9A859B8A4BFF7DFEE8A\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_28.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"I am crazy, therefore I think!\"\nmsgstr \"我瘋了，所以我想！\"\n\n#. Key:\t389F7FA440377CA4EBA31DA4EE2FEEAE\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_65.Children(3).Children.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_65.Children(3).Children.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_65.Children(3).Children.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"Leave\"\nmsgstr \"離開\"\n\n#. Key:\t408E74BC4DBA10DA41853B9421DBA07B\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_65.Children(0).Children.Text\n#. Key:\t55BC9258400712FE4D5CED8BFA0AD22C\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.Children(1).Children.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_65.Children(0).Children.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.Children(1).Children.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_65.Children(0).Children.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.Children(1).Children.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"How to prove Worthy\"\nmsgstr \"如何證明價值\"\n\n#. Key:\t5D0DBB0344815D41A50D9FA178339BCA\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_24.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_24.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_24.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"Here, take one!\"\nmsgstr \"這兒，拿壹個！\"\n\n#. Key:\t5E8C88684BE93A26C26BFBAF23D69FD9\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.SpeechSequence(5).SpeechSequence.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.SpeechSequence(5).SpeechSequence.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.SpeechSequence(5).SpeechSequence.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"And I am not wise. In fact, I am totally crazy. But look on the bright side! At least I am aware of it.\"\nmsgstr \"我不聰明。其實，我整個人都瘋了。但是要看到好的壹面! 至少我意識到了這點。\"\n\n#. Key:\t5F9588AA4FFA9FEB2C7101B32CB98950\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_55.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_55.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_55.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"Come back if you change your mind!\"\nmsgstr \"如果妳改變了主意，就回來吧！\"\n\n#. Key:\t69BF5D3C44D3BE2468ADDF97E99920E9\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_4.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"I think something's happening with the door's mechanism... but who knows? I can definitely hear some creaking! It's hard to guess which one of those is the real one...\"\nmsgstr \"我覺得是門的機械裝置出了問題…… 但誰知道呢? 我肯定聽到了吱吱的聲音! 很難猜出裏面哪個是真的……\"\n\n#. Key:\t6B46CC3F44284076B1F460BEE2D93116\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.SpeechSequence(1).SpeechSequence.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.SpeechSequence(1).SpeechSequence.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.SpeechSequence(1).SpeechSequence.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"How unique, how original, how... sporty!\"\nmsgstr \"多麽獨特，多麽原始，多麽……運動！\"\n\n#. Key:\t6DFC995B4364B6358A8F00BEDD007C80\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_3.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"I am, therefore I think!\"\nmsgstr \"我是，所以我想！\"\n\n#. Key:\t72FA8AF8413CF23907BB9EA6587F512E\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_63.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_63.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_63.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"I was pretty sure I had to face him too... that's why I prepared! Potion of Worthiness! I have a few bottles...\"\nmsgstr \"我很確定我也得面對他…… 所以我作了準備！價值藥劑！我搞了幾瓶……\"\n\n#. Key:\t7BB736394144C8B2173886993EE33ADA\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_22.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"Look, I'm forced to stay in this realm so that I could do all these silly tasks for a wizard. Any chance you could help me with that? Please?\"\nmsgstr \"聽著，我被迫留在這個王國裏，為壹個巫師完成這些愚蠢的任務。妳能幫我壹下嗎? 好嗎?\"\n\n#. Key:\t7E8985A441145AE9365C64810036EBE0\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.SpeechSequence(3).SpeechSequence.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.SpeechSequence(3).SpeechSequence.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.SpeechSequence(3).SpeechSequence.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"Actually yes, I...\"\nmsgstr \"其實，是的，我...\"\n\n#. Key:\t85CB0B164556D460A07F948F942D7AC4\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_61.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_61.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_61.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"That's how these rusty monsters work like: you pull a few levers here and there, and... whoops, the door is open! It's called science!\"\nmsgstr \"這些生銹的怪物就是這樣做的: 妳推拉這兒的幾根拉桿，然後……哎呦，門開了！這就叫科學!\"\n\n#. Key:\t878921884D0FDCFC78971E828C7D7FBB\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_66.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_66.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_66.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"I've got to go...\"\nmsgstr \"我得走了……\"\n\n#. Key:\t8FF0B1A64B29AAB8DABAC49F5EBCE625\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_60.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_60.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_60.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"That's easy! Just pull every single lever you can find.\"\nmsgstr \"這很簡單！把妳能找到的每壹根拉桿都拔出來。\"\n\n#. Key:\t9163F7AB40673D9EB5C936A37CC7B0C7\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_62.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_62.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_62.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"Sounds like you met the GateKeeper!\"\nmsgstr \"聽起來妳遇到了守護者！\"\n\n#. Key:\t96EED9B34D798E48F9B47283A5290A5B\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.SpeechSequence(4).SpeechSequence.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.SpeechSequence(4).SpeechSequence.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.SpeechSequence(4).SpeechSequence.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"It was a rhetorical question. I am not old!\"\nmsgstr \"這是個修辭性反問。其實我並不老!\"\n\n#. Key:\tB3141D2247D5DF307B63A4BF330F8070\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_67.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_67.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_67.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"Not really, I don't feel like helping you out. And to be honest, I prefer to stay away from wizards. Sorry!\"\nmsgstr \"不，我不想幫妳。說實話，我更希望離巫師遠壹點。對不起!\"\n\n#. Key:\tB7A8F5A6474D18116F76BC929DB28D40\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_5.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"It's been nice meeting you.\"\nmsgstr \"很高興認識妳。\"\n\n#. Key:\tBE16F7204818B7231748D1B9C55DB4F6\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_1.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"Here, take this! I hope it's worth the trouble... hahaha... Thanks to you I can continue with my journey... after I read a few more pages, of course.\"\nmsgstr \"這個，拿好！希望那些麻煩是值得的... 哈哈哈... 多虧了妳我才能繼續我的旅程... 當然，在我又讀了幾頁之後。\"\n\n#. Key:\tBF9983D645C558E1AB5D559E70FEFDA0\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.SpeechSequence(6).SpeechSequence.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.SpeechSequence(6).SpeechSequence.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.SpeechSequence(6).SpeechSequence.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"Is there anything a middle-aged crazy gnome scientist can do for you? Now, this one is not a rhetorical question!\"\nmsgstr \"壹個中年瘋狂的侏儒科學家能為妳做些什麽?  這，不是壹個反問句!\"\n\n#. Key:\tC29E98A84971D7F0585C0F9522C30209\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_64.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_64.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_64.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"I will give you one if you are kind enough to open this door for me! I am stuck on the other side, you see...\"\nmsgstr \"如果妳為我打開這扇門，我就給妳壹個!  我被困在另壹邊了，妳知道……\"\n\n#. Key:\tC8BEE9304FE466C0EB9F76A0B8A770D6\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.Children(0).Children.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.Children(0).Children.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.Children(0).Children.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"No way!\"\nmsgstr \"沒門！\"\n\n#. Key:\tCB197A5E46F44960333A02B7691B0EA6\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_6.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"Thanks and good luck!\"\nmsgstr \"謝謝，祝妳好運！\"\n\n#. Key:\tCD2D130744EE2EDC8C96B1A286FCCD28\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_20.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"Getting help from a mad scientist? Thanks, but I would rather skip that!\"\nmsgstr \"從壹個瘋狂科學家那裏獲得幫助？謝了，我可不需要！\"\n\n#. Key:\tD0A8B5EA452D49F6400A18A2CDAC9A0E\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_29.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_29.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_29.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"I am crazy, therefore I am!\"\nmsgstr \"我瘋了！\"\n\n#. Key:\tDA95542D4776F0EF7909078DED258AF8\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_27.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_27.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_27.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"You managed to open the gate! Well done!\"\nmsgstr \"妳成功地打開了大門！幹得漂亮！\"\n\n#. Key:\tDEC93709471D0B331684CFAF42A65B49\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_37.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_37.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_37.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"How unfortunate! And I thought that I was the idiot here. You will totally need my help... you'll see.\"\nmsgstr \"真不幸! 我覺得在這裏我才是個白癡。妳會需要我的幫助…… 妳會明白的。\"\n\n#. Key:\tDF18B66D4109CAA0BCC1FDBED74521CD\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_21.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"Some kind of golem sent me here to prove my worthiness... any idea how I could do that?\"\nmsgstr \"某個種類的機器人把我送來這裏證明我的價值…… 妳知道我應該怎麽做嗎?\"\n\n#. Key:\tE546AE1443A4262B05869CB758E42CF2\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.SpeechSequence(2).SpeechSequence.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.SpeechSequence(2).SpeechSequence.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_SpeechSequence_0.SpeechSequence(2).SpeechSequence.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"Is there anything an old wise gnome scientist could do for you, I wonder?\"\nmsgstr \"我想知道壹個聰明的老侏儒科學家能為妳做些什麽?\"\n\n#. Key:\tEEA782044BAA1D5C3B77D49DAE004512\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_58.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_58.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome0.TLAdventurerGnome0:DlgNode_Speech_58.Text\nmsgctxt \"Dialogue_TLAdventurerGnome0\"\nmsgid \"Any idea how I could open this gate for you?\"\nmsgstr \"妳知道如何才能幫妳打開這扇門嗎?\"\n\n#. Key:\t04BFEE6A43E303DB376ACFA5F270F846\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_9.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"I've managed to get this obelisk thing. Do you know what it is?\"\nmsgstr \"我設法弄到了這個方尖碑。妳知道這玩意是什麽嗎?\"\n\n#. Key:\t0A6FE902444DF9B2F18A95B495FB7A90\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_10.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"I... I don't know. They are kinda predictable though...\"\nmsgstr \"我… 我不知道。不過它們是可以預測的……\"\n\n#. Key:\t0AB07AB7403AECECD38D479D8F4A32D2\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_13.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"Don't care about it and you'll live longer.\"\nmsgstr \"不要在意它，妳會活得更長久。\"\n\n#. Key:\t1026E61D4F2798A2E0FEE0B9ACA2135B\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_11.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"There is a floating magical thing right there...\"\nmsgstr \"那裏有壹個神奇的東西飄浮著……\"\n\n#. Key:\t174506D944E38D478377CDA1DEF299B4\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_15.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"Isn't it weird that doors are always closed around these places?\"\nmsgstr \"這些地方的門總是關著的，這不是很奇怪嗎?\"\n\n#. Key:\t240F98824200E33959D455AF1A3219B8\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_37.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_37.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_37.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"This is my research project! Looks totally garbage, but sometimes even I cannot understand my brilliance.\"\nmsgstr \"這是我的研究項目! 看起來完全是垃圾，但有時連我自己甚至不能理解我的才華。\"\n\n#. Key:\t24286C6A494F848CE13B5C98E38D4718\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_6.Children(0).Children.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_6.Children(0).Children.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_6.Children(0).Children.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"Let him answer\"\nmsgstr \"讓他回答\"\n\n#. Key:\t26727CAB403FA6DED50EC38ED01E4241\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_6.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"I found the secret hideout of the Secret Science Society. Is there anything you could tell me about them?\"\nmsgstr \"我找到了秘密科學協會的秘密藏身處。妳能告訴我壹些關於他們的事情嗎?\"\n\n#. Key:\t2BF9EF0C41CB352340F460AE4BC0FE02\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_20.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"I guess he will be happy if you return this to him, but otherwise it's garbage.\"\nmsgstr \"我想如果妳把這個還給他，他會很高興，否則就是垃圾。\"\n\n#. Key:\t315BB85E475FAA4C715E7F850B0E5EE2\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_24.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_24.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_24.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"Really? Then maybe I should give you this: another bottle of Potion of Worthiness!\"\nmsgstr \"真的嗎? 那麽也許我應該給妳這個: 另壹瓶價值藥水!\"\n\n#. Key:\t316CF9AD4CF36FAFFAC45CA0A488FE53\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_57.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_57.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_57.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"I've got to go...\"\nmsgstr \"我得走了……\"\n\n#. Key:\t3A9767C34F0BB6E9E131D8BC7A8D9A25\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_26.Children(1).Children.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_26.Children(1).Children.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_26.Children(1).Children.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"Secret Science Society\"\nmsgstr \"秘密科學學會\"\n\n#. Key:\t3E857073418A17EC48A1EA9D2B28A43E\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_30.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_30.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_30.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"I pulled a few levers here and there...\"\nmsgstr \"我拉了周圍的幾根拉桿...\"\n\n#. Key:\t4671C3394EAF0988255C8090B409415D\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_12.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"Yes, things like that happen here all the time. You'll get used to it.\"\nmsgstr \"是的，那樣的事情在這兒經常發生。妳會習慣的。\"\n\n#. Key:\t4709B6384B48D479672BC69EBC640C7E\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_31.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_31.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_31.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"Oh, really? That was nice, even if it was absolutely unnecessary! Never mind, here is your reward!\"\nmsgstr \"哦, 真的嗎? 很好，即使這完全沒有必要!  無所謂，這是妳的獎勵！\"\n\n#. Key:\t5AE5A1A6408BC2EB0F9F96BA0826ACB0\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_4.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"Hmm... One of the creaks was a bit odd. I think the door will open soon!\"\nmsgstr \"嗯… 其中壹聲怪叫有點奇怪。我想門快開了!\"\n\n#. Key:\t5C81129F4B064C44F44335A3AB1CC178\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_29.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_29.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_29.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"The mind is furnished with ideas by a drunk upholsterer...\"\nmsgstr \"壹個醉醺醺的裝潢商人給頭腦粉飾了各種想法……\"\n\n#. Key:\t5E441CF6434D7CA180853BBCBD6DFE44\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_2.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"Also, reading something represents such a nice way of killing time when I encounter a closed door!\"\nmsgstr \"另外，當我遇到壹扇緊閉的門時，看書就意味著壹種很好的消磨時間的方法!\"\n\n#. Key:\t6B46D1EC463D3B9A4BFBBDB7725C0C22\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_22.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"How about a deal? Open this door and I will give you another bottle from my collection of Potions of Worthiness.\"\nmsgstr \"作個交易如何？打開這扇門，我就把我收藏的另外壹瓶價值藥水給妳。\"\n\n#. Key:\t745CA5274A281AAA12CF798A53D54ACE\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_26.Children(3).Children.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_26.Children(3).Children.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_26.Children(3).Children.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"Ask about the book\"\nmsgstr \"詢問書籍\"\n\n#. Key:\t84DCE2A448C57E7FAD93CB9029BBD605\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_26.Children(0).Children.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_26.Children(0).Children.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_26.Children(0).Children.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"Floating obelisk\"\nmsgstr \"浮動的方尖碑\"\n\n#. Key:\t922B00804A843BD8EC9DB984D794F145\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_1.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"We met before, right? Of course we did.\"\nmsgstr \"我們以前見過，對吧? 我們當然見過。\"\n\n#. Key:\t9837238E42F28684DEBA2DAF9B332415\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_8.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"It might actually be total nonsense. That's what I am trying to find out at the moment, so I am reading it again and again and again...\"\nmsgstr \"這可能完全是無稽之談。這就是我現在想知道的，所以我讀了壹遍又壹遍……\"\n\n#. Key:\t995EAB564791A7F8BF34D3A26026F383\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_26.Children(4).Children.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_26.Children(4).Children.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_26.Children(4).Children.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"Leave\"\nmsgstr \"離開\"\n\n#. Key:\t9AD95267429D21EE59DC83937AD6811A\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_17.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"This is a Memory Crystal made by a really old looking man I've met long ago.\"\nmsgstr \"這是我很久以前見過的壹個看起來很老的人做的記憶水晶。\"\n\n#. Key:\tA9DF44F54971A33775FF939FB292E26E\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_28.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"No man's knowledge here can go beyond my experience!\"\nmsgstr \"這裏沒有人的知識能超越我的經驗!\"\n\n#. Key:\tAC59E35B420DF0F9B771B9938AC23891\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_7.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"I sure can! They used to invent cool stuff back in the days, before... you know, everyone's mind decided to go a bit insane.\"\nmsgstr \"我當然可以! 他們過去常常創造酷酷的東西… 妳知道，每個人的心智都有壹點瘋狂。\"\n\n#. Key:\tB1E177F0430A3887A76CFAA46CE650AD\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_19.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"I don’t know why we are here... maybe to enjoy ourselves?\"\nmsgstr \"我不知道我們為什麽在這裏…  自娛自樂？\"\n\n#. Key:\tB5E57C3A4B0D51020B4F3C872164E8F2\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_26.Children(2).Children.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_26.Children(2).Children.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_26.Children(2).Children.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"Another door\"\nmsgstr \"另壹道門\"\n\n#. Key:\tBA0C0F42482F357506A9C7ABADB6E49A\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_33.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_33.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_33.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"On the other hand, everyone is crazy these days... so we don't need doors anymore!\"\nmsgstr \"另壹方面，最近每個人都很瘋狂…… 所以我們不再需要門了!\"\n\n#. Key:\tBAC86050470A5EC67C30349C6B13DFE0\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_3.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"To be perceived is to be!\"\nmsgstr \"被感知就是存在！\"\n\n#. Key:\tBAD7934444B3EB256141BFB689BB83A0\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_18.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"I will let you know when I come up with something.\"\nmsgstr \"如果我有什麽想法，會讓妳知道的。\"\n\n#. Key:\tBE5570C5477044DD0B1EEE928EAD8FA8\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_32.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_32.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_32.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"Nah. The world is full of crazy people. If I were sane, I would have liked to have as many closed doors as possible between me and those weirdos.\"\nmsgstr \"不。這個世界上到處都是瘋子。如果我心智健全，那我希望在我和那些怪人之間有盡可能多的門。\"\n\n#. Key:\tBE8120CC4E6A028BB45F10843F98135D\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_16.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"The door asks for a password that members use to enter the hideout... any idea what that could be?\"\nmsgstr \"這道門要求輸入密碼，成員使用密碼進入隱藏處… 妳知道密碼是什麽嗎？\"\n\n#. Key:\tC7BE32BF43F7BA6D88A666956FAC35F3\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_21.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"I am here because I actually have to prove my worth again...\"\nmsgstr \"我在這裏是因為我必須再次證明我的價值...\"\n\n#. Key:\tC7ECC6D9457A4C49B39E98AEB14474E5\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_25.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_25.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_25.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"And I would actually feel much happier if I were on the other side of the door! You know,... I tried to ask it nicely to open and it just ignored me!\"\nmsgstr \"如果我在門的另壹邊我會感到更快樂! 妳知道… 我試著友好地要求它打開，但它就是不理我!\"\n\n#. Key:\tD2F4B8E44239904A7BD4DD90336C871A\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_45.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_45.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_45.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"What kind of book is that?\"\nmsgstr \"那是什麽書?\"\n\n#. Key:\tED75E2104CCC3912A77DF18F7C916690\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_5.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"It was nice seeing you...\"\nmsgstr \"很高興見到妳……\"\n\n#. Key:\tF87975A94604B526DE1B638250BD85A9\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_27.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_27.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_27.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"The gate is open! Maybe this creature has a heart after all... and probably started feeling sorry for me as well.\"\nmsgstr \"大門是開著的! 也許這個生物還是有心臟的…… 也許它開始為我感到難過。\"\n\n#. Key:\tFE470DB5464E438A122FAFAF593AF92B\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_14.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome1.TLAdventurerGnome1:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_TLAdventurerGnome1\"\nmsgid \"Let me see! Yes... Oh...\"\nmsgstr \"讓我看看！是的... 噢...\"\n\n#. Key:\t066896454B62A9809060EBB3E0222D9A\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_SpeechSequence_1.SpeechSequence(3).SpeechSequence.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_SpeechSequence_1.SpeechSequence(3).SpeechSequence.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_SpeechSequence_1.SpeechSequence(3).SpeechSequence.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"Also, after skipping a couple of lectures, I got fired from university.\"\nmsgstr \"另外，在我翹了幾節課之後，就被大學除名了。\"\n\n#. Key:\t17D1F3394E12F6C85A11C2B3D3BD1ACE\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_SpeechSequence_1.SpeechSequence(0).SpeechSequence.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_SpeechSequence_1.SpeechSequence(0).SpeechSequence.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_SpeechSequence_1.SpeechSequence(0).SpeechSequence.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"I am a scientist! I managed to prove it! I discovered this when I was conducting my research on gnome behavior...\"\nmsgstr \"我是科學家! 我成功驗證了! 我是在研究地精行為時發現這壹點的……\"\n\n#. Key:\t17D8D3C2484BA654BEAE8CACA3AD7501\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_7.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"Help me out with the door for the last time, and I will give you my last potion!\"\nmsgstr \"最後壹次幫我把門打開，我會給妳我最後的藥劑！\"\n\n#. Key:\t22439DB6407947A700A6E9AFB4D29261\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_1.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"Hello again! You remember me, right? I'm the gnome who was crazy before it was cool!\"\nmsgstr \"又見面了！妳還記得我吧？我就是那個裝酷之前已經變瘋的地精！\"\n\n#. Key:\t2546F34E402CB4B25911238CC1E7A70F\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_29.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_29.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_29.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"Be as you with to seem.\\r\\n... or was it seem as you wish to be?\"\nmsgstr \"就像妳看上去那樣。\\r\\n…還是像妳希望的那樣?\"\n\n#. Key:\t2A78FDD9465789DC4FF5EB970C63F618\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_14.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"That is amazing! Thank you, my globular friend! Take these coins, I am sure you will enjoy spending them on... on whatever Balls like you like to spend.\"\nmsgstr \"太厲害了! 謝謝妳，我的球狀朋友! 把這些硬幣拿去吧，我相信妳會樂意把它們用來買……妳喜歡的球。\"\n\n#. Key:\t2EB726F641E4EF882228F6B49DA2B313\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_26.Children(1).Children.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_26.Children(1).Children.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_26.Children(1).Children.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"Password\"\nmsgstr \"密碼\"\n\n#. Key:\t339840D54BD71CF86F9DE4A801B1414F\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_20.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"I sure can! They used to invent cool stuff back in the days, before... you know, everyone's mind decided to go a bit insane.\"\nmsgstr \"我當然可以! 他們過去常常創造酷酷的東西… 妳知道，每個人的心智都有壹點瘋狂。\"\n\n#. Key:\t3E639AB84A0D241D73AB8A991A483090\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_26.Children(4).Children.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_26.Children(4).Children.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_26.Children(4).Children.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"Leave\"\nmsgstr \"離開\"\n\n#. Key:\t464D32224CC04AD1F97602803245A37C\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_18.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_18.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_18.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"Take this! You deserve it...\"\nmsgstr \"收下吧! 妳受之無愧！\"\n\n#. Key:\t4BB0354D4398A4115F3A78B8EFCC7D16\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_27.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_27.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_27.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"I can't believe my eyes! It is open!\"\nmsgstr \"我簡直不敢相信我的眼睛！它竟然是開著的！\"\n\n#. Key:\t6488288A45256CE464004F9BFF776850\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_24.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_24.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_24.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"It's your lucky day! Take this... it's my last bottle, but I guess your needs are greater than mine!\"\nmsgstr \"今天是妳的幸運日！收下這個… 這是最後壹瓶了，但我想這遠不能滿足妳的需求！\"\n\n#. Key:\t696219734B2E6966C53BE8B43A0C2212\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_28.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"The unexamined life is not worth living!\"\nmsgstr \"混混噩噩的生活不值得過！\"\n\n#. Key:\t6FD516D14E42F5EC1D05CEA0F476BDEC\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_12.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"If you manage to find a strangely unique device in the hideout, I would be more than happy to buy that from you...\"\nmsgstr \"如果妳能在藏身處找到壹個奇特獨特的裝置，我將非常樂意從妳手裏把它買下……\"\n\n#. Key:\t75BBEA604E9A3BAEF7599AA937E1AB2A\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_17.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_17.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_17.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"And you have the habit of needing my potions..\"\nmsgstr \"妳壹直都需要我的藥水。\"\n\n#. Key:\t7978DCFE4044A6A3EC9F6BA54BAAD8BF\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_11.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"Yes, I am pretty sure this week is \\\"The only true wisdom is in knowing you know everything.\\\".\"\nmsgstr \"是的，我十分確定，本周是“ 真正的智慧是知道自己洞悉壹切。”\"\n\n#. Key:\t88881A3742ABFEAB95CA938C1AA81B60\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_25.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_25.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_25.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"I guess we are in the same boat - well, more or less... figuratively speaking, of course, because I can't really stand boats!\"\nmsgstr \"我想我們，嗯或多或少是在同壹條船上……當然，這就是打個比方，因為我暈船!\"\n\n#. Key:\t8A80B7554F39A818E4E66294BAFC9A76\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_26.Children(0).Children.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_26.Children(0).Children.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_26.Children(0).Children.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"Secret Science Society\"\nmsgstr \"秘密科學學會\"\n\n#. Key:\t91E6FD4A44AB2E17C88767B0F17D6D1E\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_30.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_30.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_30.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"Why do you think that you're crazy?\"\nmsgstr \"妳為什麽覺得自己瘋了？\"\n\n#. Key:\t98E36F354D811F5DE5F98A942250997E\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_3.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"It is always wrong to believe everything!\"\nmsgstr \"相信壹切是不可取的！\"\n\n#. Key:\t9B6EADBA4946B100D566988907A9675D\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_19.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_19.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_19.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"Any luck with the password for the Secret Science Society door?\"\nmsgstr \"秘密科學協會大門的密碼有什麽眉目了嗎\"\n\n#. Key:\tA0F52B7148A942673A3489857B8C6EA9\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_26.Children(2).Children.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_26.Children(2).Children.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_26.Children(2).Children.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"Give Weird Device\"\nmsgstr \"給予奇怪裝置\"\n\n#. Key:\tABE60F4D4709CCE1AF2A5197C03C8193\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_22.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"See you later...\"\nmsgstr \"回頭見...\"\n\n#. Key:\tB07C5C9A48839C3E81F6FA8B7550BBA4\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_6.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"I also have the bad habit of being obstructed by closed doors!\"\nmsgstr \"被拒之門外也是我的日常！\"\n\n#. Key:\tB7C7314840274942F6D606B35398F039\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_21.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_21.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_21.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"The door asks for a password that members need to provide in order to enter the hideout... any idea what that could be?\"\nmsgstr \"這道門要求輸入密碼，成員使用密碼進入隱藏處… 妳知道密碼是什麽嗎？\"\n\n#. Key:\tBB1AEBA44695D09192D7CA98AF9166B0\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_SpeechSequence_1.SpeechSequence(2).SpeechSequence.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_SpeechSequence_1.SpeechSequence(2).SpeechSequence.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_SpeechSequence_1.SpeechSequence(2).SpeechSequence.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"No wonder everyone started to consider me an idiot.\"\nmsgstr \"難怪大家都開始認為我是個白癡。\"\n\n#. Key:\tC0B9CA5E4273E95306AD0C824ADFD84B\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_SpeechSequence_1.SpeechSequence(1).SpeechSequence.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_SpeechSequence_1.SpeechSequence(1).SpeechSequence.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_SpeechSequence_1.SpeechSequence(1).SpeechSequence.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"Long story short, I used to do all these crazy things, like talking about the weather or taking naps in the afternoon. At first, they seemed okay to me but in reality what I was doing was totally ridiculous!\"\nmsgstr \"長話短說，我曾經做過所有這些瘋狂的事情，比如談論天氣或者在下午小睡壹會兒。壹開始，我覺得這些事情還好，但實際上我所做的是十分荒謬的！\"\n\n#. Key:\tC4193800427609972A2DECAB99D8CE6C\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_4.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"Hmm... One of the creaks was a bit odd. I think the door will open soon!\"\nmsgstr \"嗯... 有壹聲嘎吱聲聽上去怪怪的。我想門很快就能打開了！\"\n\n#. Key:\tD1254F624213EAE67D6DD780182AA2DA\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_5.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"It was nice seeing you!\"\nmsgstr \"很高興見到妳！\"\n\n#. Key:\tD19327714CD0B2833BC7EBBD1E89CC83\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_26.Children(3).Children.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_26.Children(3).Children.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_26.Children(3).Children.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"You Crazy?\"\nmsgstr \"妳瘋了？\"\n\n#. Key:\tE5C93E794F71C393568D0B855117C738\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_2.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"I found the secret hideout of the Secret Science Society. Do you know anything about them?\"\nmsgstr \"我找到了秘密科學協會的秘密藏身處。妳對他們有什麽了解嗎？\"\n\n#. Key:\tEF216A2549E20C15A2C28184B62D45E6\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_36.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_36.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_36.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"Turns out that you cannot skip lectures if you're the teacher.\"\nmsgstr \"事實證明，如果妳是老師，妳就不能翹課。\"\n\n#. Key:\tEF650E874498865FA9FE6F9B9C37AB71\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_9.Text\n#. /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/TL/TLAdventurerGnome2.TLAdventurerGnome2:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_TLAdventurerGnome2\"\nmsgid \"Here is the Weird Device I found in the hideout of the Secret Science Society.\"\nmsgstr \"這是我在秘密科學協會的藏身處發現的奇怪裝置。\"\n\n#. Key:\t17A0CE394E01E1FFB31AA9A485E033AC\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_2.Children(4).Children.Text\n#. /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_2.Children(4).Children.Text\n#: /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_2.Children(4).Children.Text\nmsgctxt \"Dialogue_TLSecretSocietyGate\"\nmsgid \"Mellon\"\nmsgstr \"梅隆\"\n\n#. Key:\t3293778C41F588EAC2DECDA76DA86A8E\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_2.Children(0).Children.Text\n#. /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_2.Children(0).Children.Text\n#: /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_2.Children(0).Children.Text\nmsgctxt \"Dialogue_TLSecretSocietyGate\"\nmsgid \"The only...\"\nmsgstr \"唯壹的...\"\n\n#. Key:\t359996CC441CAB0497303A9C666F0CCD\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_5.Text\n#. /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_TLSecretSocietyGate\"\nmsgid \"*******? No, that is not correct.\"\nmsgstr \"* * * * * * *? 不，那是不對的。\"\n\n#. Key:\t3C864B7F434DA42CAB07BCA70FB2E6A6\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_1.Children(0).Children.Text\n#. /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_1.Children(0).Children.Text\n#: /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_1.Children(0).Children.Text\nmsgctxt \"Dialogue_TLSecretSocietyGate\"\nmsgid \"Okay, whatever\"\nmsgstr \"好的，隨便啦\"\n\n#. Key:\t40C27B354470AB53239424BCC2B8D259\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_11.Text\n#. /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_TLSecretSocietyGate\"\nmsgid \"Do you really think secret scientists would use an elven word as a password? I don't even know what that means.\"\nmsgstr \"妳真的認為秘密科學家會用精靈語作為密碼嗎? 我甚至不知道那是什麽意思。\"\n\n#. Key:\t4E89070F413EF5CD964EEF90234BEBC5\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_3.Text\n#. /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_TLSecretSocietyGate\"\nmsgid \"I am pretty sure that it is better to avoid the Secret Science Society anyways...\"\nmsgstr \"我很確定，不管怎樣，最好還是避開秘密科學協會……\"\n\n#. Key:\t515B5424465F983D14F3E09B7686899D\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_1.Text\n#. /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_TLSecretSocietyGate\"\nmsgid \"STOP! Do not move! This gate is only for the members of the Secret Science Society!\"\nmsgstr \"住手！不要動它！這扇門僅對秘密科學協會的成員開放！\"\n\n#. Key:\t51706AD44D697A14E6392B97A9E30AFC\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_6.Text\n#. /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_TLSecretSocietyGate\"\nmsgid \"That is the silliest combination I have ever heard about in my whole life! That's the kind of thing an idiot would carry in his luggage!\"\nmsgstr \"這是我聞所未聞的最傻帽組合! 只有傻瓜才會在他的行李裏帶這種東西！\"\n\n#. Key:\t60B0B4E04E74C474AC2F4F8422DCE753\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_3.Children(0).Children.Text\n#. /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_3.Children(0).Children.Text\n#: /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_3.Children(0).Children.Text\nmsgctxt \"Dialogue_TLSecretSocietyGate\"\nmsgid \"Leave the gate\"\nmsgstr \"離開大門\"\n\n#. Key:\t6EB7FD9546B2B89557D9708942CE54BD\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_2.Children(2).Children.Text\n#. /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_2.Children(2).Children.Text\n#: /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_2.Children(2).Children.Text\nmsgctxt \"Dialogue_TLSecretSocietyGate\"\nmsgid \"12345\"\nmsgstr \"12345.0\"\n\n#. Key:\t749AB9CD48924031317291A953254917\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_8.Text\n#. /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_TLSecretSocietyGate\"\nmsgid \"That password is for witch and wizard kids, not for old, wise, world renowned secret scientists!\"\nmsgstr \"那個密碼是給巫婆和巫師孩子設計的，不是給世界聞名的秘密科學家的！\"\n\n#. Key:\t7BB8FA8B4D051983390D3D8D4287DFEC\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_2.Children(1).Children.Text\n#. /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_2.Children(1).Children.Text\n#: /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_2.Children(1).Children.Text\nmsgctxt \"Dialogue_TLSecretSocietyGate\"\nmsgid \"hunter2\"\nmsgstr \"狩獵者2\"\n\n#. Key:\t8CD051C44D9FBBD6D60694AFD2156D24\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_2.Children(5).Children.Text\n#. /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_2.Children(5).Children.Text\n#: /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_2.Children(5).Children.Text\nmsgctxt \"Dialogue_TLSecretSocietyGate\"\nmsgid \"Try to gain some time\"\nmsgstr \"爭取壹些時間\"\n\n#. Key:\t8F2244144056B8C389345F87D8C8B171\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_13.Text\n#. /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_TLSecretSocietyGate\"\nmsgid \"I... I think I forgot... I have to remember it. I'll be back...\"\nmsgstr \"我… 我想我已經忘了…… 我必須把它記住。我會回來的……\"\n\n#. Key:\t8FC96FE94C115E3EDB214CAA3B380072\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_4.Text\n#. /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_TLSecretSocietyGate\"\nmsgid \"Let us go on with the standard protocol then. Tell me the password of the week.\"\nmsgstr \"讓我們接著“標準協議”的話題吧。告訴我本周的密碼。\"\n\n#. Key:\tAA10FF02426D2C5DB9F7CF90596631C4\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_1.Children(1).Children.Text\n#. /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_1.Children(1).Children.Text\n#: /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_1.Children(1).Children.Text\nmsgctxt \"Dialogue_TLSecretSocietyGate\"\nmsgid \"I am a member\"\nmsgstr \"我是會員\"\n\n#. Key:\tB5237D1B4EFB02B1ED5017B68EC5A7EC\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_2.Text\n#. /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_TLSecretSocietyGate\"\nmsgid \"Are you a member? Prove it! What is the password of the week?\"\nmsgstr \"妳是會員？那就證明壹下身份！本周的密碼是什麽？\"\n\n#. Key:\tC8A1985C416AEA563142D7BF3B6DD77D\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_2.Children(3).Children.Text\n#. /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_2.Children(3).Children.Text\n#: /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_2.Children(3).Children.Text\nmsgctxt \"Dialogue_TLSecretSocietyGate\"\nmsgid \"Caput Draconis\"\nmsgstr \"卡普特·德拉科尼斯\"\n\n#. Key:\tDC8F07EA44A20BEF70DFCDA4A62A421E\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_14.Text\n#. /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_TLSecretSocietyGate\"\nmsgid \"Correct. Welcome to the secret hideout 12345, scientist!\"\nmsgstr \"正確。歡迎來到12345的秘密藏身處，科學家!\"\n\n#. Key:\tE0C10509474191587635B48ED0AA6913\n#. SourceLocation:\t/Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_9.Text\n#. /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/TL/TLSecretSocietyGate.TLSecretSocietyGate:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_TLSecretSocietyGate\"\nmsgid \"The only true wisdom is in knowing you know everything!\"\nmsgstr \"知道妳無所不知才是唯壹的大智慧！\"\n\n#. Key:\t0707F21D4313073F47F3C69B64D61DB7\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_15.Text\n#. /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_15.Text\n#: /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_15.Text\nmsgctxt \"Dialogue_TombOfTabby\"\nmsgid \"Take this. It's all I can give now.\"\nmsgstr \"拿著這個，這是我現在全部能給予的。\"\n\n#. Key:\t0918993B4F680528806DE680B471F795\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_10.Text\n#. /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_TombOfTabby\"\nmsgid \"It was too much. I couldn’t keep on. I failed.\"\nmsgstr \"我承受不起了。我失敗了。\"\n\n#. Key:\t1598C2DE44A0BF92DC0E53BFAC47DEF5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_3.Children(3).Children.Text\n#. /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_3.Children(3).Children.Text\n#: /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_3.Children(3).Children.Text\nmsgctxt \"Dialogue_TombOfTabby\"\nmsgid \"Leave\"\nmsgstr \"離開\"\n\n#. Key:\t1EF84FFD484E968FBDFE1386018485DB\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_3.Children(1).Children.Text\n#. /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_3.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_3.Children(1).Children.Text\nmsgctxt \"Dialogue_TombOfTabby\"\nmsgid \"Raven\"\nmsgstr \"烏鴉\"\n\n#. Key:\t3343471F42742EEE0678D49E466448F1\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_3.Text\n#. /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_TombOfTabby\"\nmsgid \"Tell me the name!\"\nmsgstr \"告訴我名字！\"\n\n#. Key:\t3DC816F147ACB79D6339D5AD31E0C5A5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_6.Text\n#. /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_TombOfTabby\"\nmsgid \"Lillian!\"\nmsgstr \"莉莉安！\"\n\n#. Key:\t3DE5FFEB4A5BEC150306999FDEF058BC\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_1.Text\n#. /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_TombOfTabby\"\nmsgid \"Here lies Tabby, wanderer of the Ruined Realm. We will never forget what you did for us. May your spirit find peace in the afterlife.\"\nmsgstr \"泰比長眠於此，它是這片毀滅王國的流浪者。我們永遠不會忘記妳為我們所做的壹切。願妳的靈魂在來世找到安寧。\"\n\n#. Key:\t43F7C0AE4CB91D3957AB4CA54C1D4426\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_11.Text\n#. /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_TombOfTabby\"\nmsgid \"He took the artefacts. His master never knew it.\"\nmsgstr \"他拿走了那些工藝品。他的主人從來都不知道。\"\n\n#. Key:\t57A0634946BB9FD9603572ABD9368E52\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_3.Children(0).Children.Text\n#. /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_3.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_3.Children(0).Children.Text\nmsgctxt \"Dialogue_TombOfTabby\"\nmsgid \"Wizard\"\nmsgstr \"巫師\"\n\n#. Key:\t5A6E99154FB027A82922FA91A9448E14\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_7.Text\n#. /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_TombOfTabby\"\nmsgid \"I’m leaving... I didn’t want to bother you. May you find peace at last.\"\nmsgstr \"我走了…  我不想打擾妳。願妳最終能得到安息。\"\n\n#. Key:\t6A716E164BAACFAFB2EBDBBA8C04438F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_12.Text\n#. /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_TombOfTabby\"\nmsgid \"He liked Lillian. He finished what I started.\"\nmsgstr \"他喜歡莉莉安。他把我開始做的事給完成了。\"\n\n#. Key:\t7CDFB36B41931AADE01C10A465D09EAF\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_8.Text\n#. /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_TombOfTabby\"\nmsgid \"Rest in peace!\"\nmsgstr \"安息吧！\"\n\n#. Key:\t831693034CD9AC88A07F1297BBB10056\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_14.Text\n#. /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_TombOfTabby\"\nmsgid \"I will be there on her side again when the time comes.\"\nmsgstr \"到時候我會站在她這邊的。\"\n\n#. Key:\tA78C16A943587C5EC876BFB0AA319421\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_13.Text\n#. /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_13.Text\n#: /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_13.Text\nmsgctxt \"Dialogue_TombOfTabby\"\nmsgid \"She is my only true master. I can’t leave her. Not yet.\"\nmsgstr \"她是我唯壹真正的主人。我不能離開她。\"\n\n#. Key:\tC86836A149E8580E4608259C8482314F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_5.Text\n#. /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_TombOfTabby\"\nmsgid \"Raven!\"\nmsgstr \"烏鴉！\"\n\n#. Key:\tD05E5AEF498C383F88D1AFBBDF371CDA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_9.Text\n#. /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_TombOfTabby\"\nmsgid \"He forced me. Though I understood. I wanted the same.\"\nmsgstr \"他強迫於我。雖然我能理解。我想要壹樣的。\"\n\n#. Key:\tE41ADE774AF3AF3FE637CE81531F3D29\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_3.Children(2).Children.Text\n#. /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_3.Children(2).Children.Text\n#: /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_3.Children(2).Children.Text\nmsgctxt \"Dialogue_TombOfTabby\"\nmsgid \"Lillian\"\nmsgstr \"莉莉安\"\n\n#. Key:\tED18C66D47BF594818C5DA8100AC2A36\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_2.Text\n#. /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_TombOfTabby\"\nmsgid \"You are familiar... I almost remember...\"\nmsgstr \"妳很眼熟……我快想起來了……\"\n\n#. Key:\tF6D8BC4F489D87A90E852CA3F97B479F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_4.Text\n#. /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Chapter2/TombOfTabby.TombOfTabby:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_TombOfTabby\"\nmsgid \"Wizard!\"\nmsgstr \"巫師！\"\n\n#. Key:\t2A0E02C94A04642C5096038C615E0D5B\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/tut2.tut2:DlgNode_Speech_1.Text\n#. /Game/SO/Dialogues/Wizard/Chapter1/tut2.tut2:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/tut2.tut2:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_tut2\"\nmsgid \"I see you managed to shape that ball body of yours… that’s interesting.\"\nmsgstr \"我親眼見到妳成功地塑造了妳的球狀身體… 真有意思、\"\n\n#. Key:\t4D59C307403F27C91A9168AB58CDB1B3\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/tut2.tut2:DlgNode_Speech_2.Text\n#. /Game/SO/Dialogues/Wizard/Chapter1/tut2.tut2:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/tut2.tut2:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_tut2\"\nmsgid \"I didn’t want to summon you. I wanted to get my daughter back.\"\nmsgstr \"我不想召喚妳。我想找回我的女兒。\"\n\n#. Key:\t8336FD024F34227E1AB7B1BFCCF7FFBF\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/tut2.tut2:DlgNode_Speech_3.Text\n#. /Game/SO/Dialogues/Wizard/Chapter1/tut2.tut2:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/tut2.tut2:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_tut2\"\nmsgid \"Your presence is not welcome here, demon!\"\nmsgstr \"此地不歡迎妳，惡魔！\"\n\n#. Key:\t16A6E7D24DFE49D6844E92B8E476BA66\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/tut5.tut5:DlgNode_Speech_7.Text\n#. /Game/SO/Dialogues/Wizard/Chapter1/tut5.tut5:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/tut5.tut5:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_tut5\"\nmsgid \"Once you are done I will set you free.\"\nmsgstr \"壹旦妳完成任務，我就給妳自由。\"\n\n#. Key:\t48FA56EF4293C577CB1977BE694034CC\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/tut5.tut5:DlgNode_Speech_1.Text\n#. /Game/SO/Dialogues/Wizard/Chapter1/tut5.tut5:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/tut5.tut5:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_tut5\"\nmsgid \"This is the deal demon...\"\nmsgstr \"這是交易惡魔...\"\n\n#. Key:\tA27765824FDD88A579AB6180DDEA06B1\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/tut5.tut5:DlgNode_Speech_5.Text\n#. /Game/SO/Dialogues/Wizard/Chapter1/tut5.tut5:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/tut5.tut5:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_tut5\"\nmsgid \"Get into the Heart of the Realm and find the three Artefacts! I need those to correct the summoning.\"\nmsgstr \"進入王國的中心，找到三件工藝品！我需要用它們來進行正確的召喚。\"\n\n#. Key:\t5E1F54384BC258A91FF1DD9ECBC0DF39\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/tut8.tut8:DlgNode_Speech_3.Text\n#. /Game/SO/Dialogues/Wizard/Chapter1/tut8.tut8:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/tut8.tut8:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_tut8\"\nmsgid \"A cat that used to help my daughter to explore these realms.\"\nmsgstr \"壹只曾經幫助我女兒探索這些王國的貓。\"\n\n#. Key:\t859621E24125177084F4EAA39CF77902\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/tut8.tut8:DlgNode_Speech_2.Text\n#. /Game/SO/Dialogues/Wizard/Chapter1/tut8.tut8:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/tut8.tut8:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_tut8\"\nmsgid \"Who is Tabby?\"\nmsgstr \"泰比是誰？\"\n\n#. Key:\tD0BFF857414714D7C5FCB9B526539215\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/tut8.tut8:DlgNode_Speech_1.Text\n#. /Game/SO/Dialogues/Wizard/Chapter1/tut8.tut8:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/tut8.tut8:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_tut8\"\nmsgid \"Tabby was formidable with her claws, but you will need that sword.\"\nmsgstr \"泰比的爪子很可怕，但妳需要那把劍。\"\n\n#. Key:\tDFCB1A1E48763642E71FD7A040F72F1B\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/tut8.tut8:DlgNode_Speech_4.Text\n#. /Game/SO/Dialogues/Wizard/Chapter1/tut8.tut8:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/tut8.tut8:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_tut8\"\nmsgid \"So he did the hard job before me...\"\nmsgstr \"所以在我之前，他很不容易……\"\n\n#. Key:\t2DD05A7E485B5C23DA0DCD84400D3F23\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/tut9.tut9:DlgNode_Speech_4.Text\n#. /Game/SO/Dialogues/Wizard/Chapter1/tut9.tut9:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/tut9.tut9:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_tut9\"\nmsgid \"What could be possibly weird for a walking ball?\"\nmsgstr \"對於壹個步行球來說，有什麽可奇怪的呢?\"\n\n#. Key:\t62A1ECFC47B762221EA0B1B5B0E0BEF6\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/tut9.tut9:DlgNode_Speech_1.Text\n#. /Game/SO/Dialogues/Wizard/Chapter1/tut9.tut9:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/tut9.tut9:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_tut9\"\nmsgid \"This place is in a better shape...\"\nmsgstr \"這個地方挺好…\"\n\n#. Key:\tA9BCFBB541A9A2CEA8FB90884B8557C5\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/tut9.tut9:DlgNode_Speech_2.Text\n#. /Game/SO/Dialogues/Wizard/Chapter1/tut9.tut9:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/tut9.tut9:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_tut9\"\nmsgid \"The Ancient Magic is still strong within these walls. It keeps the Ruin at bay.\"\nmsgstr \"古老魔法在這裏依然很強大。它能牽制毀滅。\"\n\n#. Key:\tF9551D7849226F88A4FD15AAFB4789E6\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter1/tut9.tut9:DlgNode_Speech_3.Text\n#. /Game/SO/Dialogues/Wizard/Chapter1/tut9.tut9:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Wizard/Chapter1/tut9.tut9:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_tut9\"\nmsgid \"Be careful though... it can have the weirdest side effects.\"\nmsgstr \"不過要註意… 它可能有很奇怪的副作用。\"\n\n#. Key:\t302976FD411E850B3CD7CEA7E0BF6924\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Wizard.Wizard:DlgNode_Speech_9.Text\n#. /Game/SO/Dialogues/Ending/E1/Wizard.Wizard:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/Ending/E1/Wizard.Wizard:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_Wizard\"\nmsgid \"Please wait outside until I repeat the spell. Once Lillian is back, I’ll take you home.\"\nmsgstr \"請在外面等我，直到我重復咒語。壹旦莉莉安回來，我就帶妳回家。\"\n\n#. Key:\t3851C21F419E9F1D29A06DA3B2A0F553\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Wizard.Wizard:DlgNode_Speech_1.Text\n#. /Game/SO/Dialogues/Ending/E1/Wizard.Wizard:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Ending/E1/Wizard.Wizard:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_Wizard\"\nmsgid \"Er... your room is still as untidy as last time, but no problem.\"\nmsgstr \"呃… 妳的房間還是和上次壹樣亂糟糟的，但沒關系。\"\n\n#. Key:\t6CCE5BBC4135176C1FBD8E866FD4B098\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Wizard.Wizard:DlgNode_Speech_5.Text\n#. /Game/SO/Dialogues/Ending/E1/Wizard.Wizard:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Ending/E1/Wizard.Wizard:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_Wizard\"\nmsgid \"I’m sorry we met like this.\"\nmsgstr \"很遺憾，我們以這樣的方式相遇。\"\n\n#. Key:\t7511912D4F72D1D45CFFB9AA9815CCB2\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Wizard.Wizard:DlgNode_Speech_3.Text\n#. /Game/SO/Dialogues/Ending/E1/Wizard.Wizard:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Ending/E1/Wizard.Wizard:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_Wizard\"\nmsgid \"Yes... and thank you!\"\nmsgstr \"是的... 謝謝！\"\n\n#. Key:\tAC1641244DF694B660EAFDA1FC4A177B\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Wizard.Wizard:DlgNode_Speech_2.Text\n#. /Game/SO/Dialogues/Ending/E1/Wizard.Wizard:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Ending/E1/Wizard.Wizard:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_Wizard\"\nmsgid \"Here are your artefacts! I made my part of the deal.\"\nmsgstr \"這是妳的工藝品！我做了我該做的。\"\n\n#. Key:\tB567059148744E3F7A4D3B929F26CBB6\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Wizard.Wizard:DlgNode_Speech_7.Text\n#. /Game/SO/Dialogues/Ending/E1/Wizard.Wizard:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Ending/E1/Wizard.Wizard:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_Wizard\"\nmsgid \"Yes, we made a deal!\"\nmsgstr \"是的，成交！\"\n\n#. Key:\tC2ED3A564A55A644D33F9E9E38D1676A\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Wizard.Wizard:DlgNode_Speech_8.Text\n#. /Game/SO/Dialogues/Ending/E1/Wizard.Wizard:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Ending/E1/Wizard.Wizard:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_Wizard\"\nmsgid \"Give me a few more minutes to finish what we started!\"\nmsgstr \"再給我幾分鐘來完成我們的開始工作！\"\n\n#. Key:\tE1521B0B46F26BFA464C6C81EC2D4900\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Wizard.Wizard:DlgNode_Speech_6.Text\n#. /Game/SO/Dialogues/Ending/E1/Wizard.Wizard:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Ending/E1/Wizard.Wizard:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_Wizard\"\nmsgid \"Will you release me?\"\nmsgstr \"妳會放了我嗎？\"\n\n#. Key:\tFE3EE6014784FCE7EB8001BC1E77D833\n#. SourceLocation:\t/Game/SO/Dialogues/Ending/E1/Wizard.Wizard:DlgNode_Speech_4.Text\n#. /Game/SO/Dialogues/Ending/E1/Wizard.Wizard:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Ending/E1/Wizard.Wizard:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_Wizard\"\nmsgid \"Er... excuse me for being rude with you. I might have misjudged you. And, anyway...\"\nmsgstr \"呃… 請原諒我對妳的冒犯。我可能錯怪妳了。總之…\"\n\n#. Key:\t0D3B0F654B4B3FC1AE9B46809DA7FD74\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter2/Wizard_AfterMonk.Wizard_AfterMonk:DlgNode_Speech_1.Text\n#. /Game/SO/Dialogues/Wizard/Chapter2/Wizard_AfterMonk.Wizard_AfterMonk:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Wizard/Chapter2/Wizard_AfterMonk.Wizard_AfterMonk:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_Wizard_AfterMonk\"\nmsgid \"What did he say?\"\nmsgstr \"他說了什麽？\"\n\n#. Key:\tDE149D01484DA8CD03D1C0848D01BEA6\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter2/Wizard_AfterMonk.Wizard_AfterMonk:DlgNode_Speech_2.Text\n#. /Game/SO/Dialogues/Wizard/Chapter2/Wizard_AfterMonk.Wizard_AfterMonk:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Wizard/Chapter2/Wizard_AfterMonk.Wizard_AfterMonk:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_Wizard_AfterMonk\"\nmsgid \"Nothing...\"\nmsgstr \"沒什麽...\"\n\n#. Key:\t1E43B5674AB45A7BDBEED1BE2AE25FE8\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter2/Wizard_Artefact1.Wizard_Artefact1:DlgNode_Speech_1.Text\n#. /Game/SO/Dialogues/Wizard/Chapter2/Wizard_Artefact1.Wizard_Artefact1:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Wizard/Chapter2/Wizard_Artefact1.Wizard_Artefact1:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_Wizard_Artefact1\"\nmsgid \"Well done. Now we have the first artefact. There are only two left...\"\nmsgstr \"很好。現在我們得到了第壹個工藝品。只剩兩個了…\"\n\n#. Key:\t45AB81D94B2C6C9B13A49C944AD80389\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter2/Wizard_Artefact1.Wizard_Artefact1:DlgNode_Speech_2.Text\n#. /Game/SO/Dialogues/Wizard/Chapter2/Wizard_Artefact1.Wizard_Artefact1:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Wizard/Chapter2/Wizard_Artefact1.Wizard_Artefact1:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_Wizard_Artefact1\"\nmsgid \"Don’t tell me I will need to kill another two of these!\"\nmsgstr \"妳的意思是我還得去消滅兩個那種怪物？！\"\n\n#. Key:\t3CBF720A438F217805FD5F85990FF515\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter2/Wizard_Artefact2.Wizard_Artefact2:DlgNode_Speech_1.Text\n#. /Game/SO/Dialogues/Wizard/Chapter2/Wizard_Artefact2.Wizard_Artefact2:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Wizard/Chapter2/Wizard_Artefact2.Wizard_Artefact2:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_Wizard_Artefact2\"\nmsgid \"We are close! Only one artefact is missing.\"\nmsgstr \"離目標越來越近了！只剩壹件工藝品了。\"\n\n#. Key:\tFD6163CC43BF00E4DB95CBB11CA7D389\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter2/Wizard_Artefact2.Wizard_Artefact2:DlgNode_Speech_2.Text\n#. /Game/SO/Dialogues/Wizard/Chapter2/Wizard_Artefact2.Wizard_Artefact2:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Wizard/Chapter2/Wizard_Artefact2.Wizard_Artefact2:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_Wizard_Artefact2\"\nmsgid \"What I miss is a comfortable apartment somewhere safe...\"\nmsgstr \"我懷念的是壹個安全舒適的公寓……\"\n\n#. Key:\t0D37E1DE44FDF7C5BF8DD28C038FA49D\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter2/Wizard_Artefact3.Wizard_Artefact3:DlgNode_Speech_4.Text\n#. /Game/SO/Dialogues/Wizard/Chapter2/Wizard_Artefact3.Wizard_Artefact3:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Wizard/Chapter2/Wizard_Artefact3.Wizard_Artefact3:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_Wizard_Artefact3\"\nmsgid \"What? Can’t you just... oh, forget it!\"\nmsgstr \"什麽？妳就不能... 噢，沒什麽！\"\n\n#. Key:\t2BDFD83247C8B644DED9CAA6486A064F\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter2/Wizard_Artefact3.Wizard_Artefact3:DlgNode_Speech_2.Text\n#. /Game/SO/Dialogues/Wizard/Chapter2/Wizard_Artefact3.Wizard_Artefact3:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Wizard/Chapter2/Wizard_Artefact3.Wizard_Artefact3:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_Wizard_Artefact3\"\nmsgid \"Yes, I’ve done what you asked. Now it’s your turn. Set me free!\"\nmsgstr \"是的，我已經照妳說的做了。現在輪到妳實現諾言了。快放了我！\"\n\n#. Key:\t8CCAFBA148F1834EABE12CAC93669A79\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter2/Wizard_Artefact3.Wizard_Artefact3:DlgNode_Speech_1.Text\n#. /Game/SO/Dialogues/Wizard/Chapter2/Wizard_Artefact3.Wizard_Artefact3:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Wizard/Chapter2/Wizard_Artefact3.Wizard_Artefact3:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_Wizard_Artefact3\"\nmsgid \"I have to admit I’m impressed. You found all the three artefacts.\"\nmsgstr \"我不得不承認我被妳震撼了。妳竟然把三件工藝品都找來了。\"\n\n#. Key:\tA54C612946D6A5EB76D38B8622F4F76C\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter2/Wizard_Artefact3.Wizard_Artefact3:DlgNode_Speech_3.Text\n#. /Game/SO/Dialogues/Wizard/Chapter2/Wizard_Artefact3.Wizard_Artefact3:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Wizard/Chapter2/Wizard_Artefact3.Wizard_Artefact3:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_Wizard_Artefact3\"\nmsgid \"All right demon. Use the railways to travel to World’s End. That’s where I can bring you back.\"\nmsgstr \"好的，惡魔。使用火車去往世界盡頭。我能在那裏把妳帶回來。\"\n\n#. Key:\t05FE50EE4B18F4FE9C1559979669E616\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_8.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_8.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"Still nothing, but nobody said anything about any visible change at this point, right?\"\nmsgstr \"仍然沒有。不過也沒有人說過這裏會出現視覺上的某種變化，對嗎？\"\n\n#. Key:\t0DDE5A0E47BADFCA9E6E98A10F0AF114\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_1.Children(0).Children.Text\n#. /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_1.Children(0).Children.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_1.Children(0).Children.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"Craft Ghost Abacus\"\nmsgstr \"制作幽靈算盤\"\n\n#. Key:\t0F4008294D6FA43C3D9C17BA600FB024\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_5.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_5.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"You have a glowing hammer. What's next?\"\nmsgstr \"妳有了壹個發光的錘子。下壹個是什麽?\"\n\n#. Key:\t26089F6044B0FD1134C9C99AF17E9E0C\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_7.Children(4).Children.Text\n#. /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_7.Children(4).Children.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_7.Children(4).Children.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"Say a different color\"\nmsgstr \"換壹種顏色\"\n\n#. Key:\t29FFB2FF49C6C231583FF1B549DA218C\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_12.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_12.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"Gnome magic at its best. Did you do everything the way it was supposed to be done? You should find out soon... maybe.\"\nmsgstr \"侏儒的魔法是最棒的。妳做每件事都是按部就班的嗎? 也許，妳很快就能找到答案...\"\n\n#. Key:\t2BF7D8D726080F0A003A0229BE7871C7\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_1.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_1.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"With the proper instructions and materials you could definitely create something valuable here.\"\nmsgstr \"有了正確的介紹和材料，妳肯定能在這裏創造出壹些有價值的東西。\"\n\n#. Key:\t3231FF0D4A2BBEE3E3AD7598E5105E0E\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_9.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_9.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"The object is coagulated into a single Surrected object!\"\nmsgstr \"這個物體被凝結成壹個獨立的超越物!\"\n\n#. Key:\t41335322411CF278B19849AC696E6F93\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_2.Children(4).Children.Text\n#. /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_2.Children(4).Children.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_2.Children(4).Children.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"Break the abacus into pieces\"\nmsgstr \"把算盤弄碎\"\n\n#. Key:\t4C74F3C342690A8246916B85FF4685C9\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"The abacus does not show any emotion.\"\nmsgstr \"算盤沒有任何感情。\"\n\n#. Key:\t4F8E51DA4C0B33020E34AF9AB47BCCD5\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_7.Children(0).Children.Text\n#. /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_7.Children(0).Children.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_7.Children(0).Children.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"Croon \\\"La La LaLaLa LaLaLa\\\"\"\nmsgstr \"低吟 “啦啦啦 啦啦啦 啦啦”\"\n\n#. Key:\t5404D10943BB5F53229FDC845E60B000\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_7.Children(5).Children.Text\n#. /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_7.Children(5).Children.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_7.Children(5).Children.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"Give up for now\"\nmsgstr \"暫時放棄\"\n\n#. Key:\t5548D94E415483F129CCA7A3102B9DB3\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"Poor Abacus. It is broken into pieces now.\"\nmsgstr \"可憐的算盤。現在它已經支離破碎了。\"\n\n#. Key:\t6F3DE41D43326079A2BD72A29059FBA9\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"You have the Abacus and the Ghost Flower Petals in front of you. The workshop has all the tools you need. How do you proceed?\"\nmsgstr \"妳面前有算盤和幽靈花瓣。工作間裏有妳需要的所有工具。妳會如何開展？\"\n\n#. Key:\t7EE3EE474090DCA65BB3199E69E83B43\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_1.Children(1).Children.Text\n#. /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_1.Children(1).Children.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_1.Children(1).Children.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"Leave\"\nmsgstr \"離開\"\n\n#. Key:\t87B760894A587B34EB825487D907D2E4\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_7.Children(1).Children.Text\n#. /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_7.Children(1).Children.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_7.Children(1).Children.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"Croon \\\"La LaLa LaLaLa LaLaLa\\\"\"\nmsgstr \"低吟 “啦啦啦 啦啦啦 啦啦”\"\n\n#. Key:\t947E69AA4EEE6DB329FAD48214D4C416\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_2.Children(0).Children.Text\n#. /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_2.Children(0).Children.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_2.Children(0).Children.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"Say \\\"Sorry my <object name>!\\\"\"\nmsgstr \"說 “對不起，我的<object name>！”\"\n\n#. Key:\t95D5418F4145388680D7C99F720CE191\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_7.Children(3).Children.Text\n#. /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_7.Children(3).Children.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_7.Children(3).Children.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"Say \\\"Brown\\\"\"\nmsgstr \"說 “棕色”\"\n\n#. Key:\tC184ED314482D706C3426CB5034C3AFD\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_7.Children(2).Children.Text\n#. /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_7.Children(2).Children.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_7.Children(2).Children.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"Say \\\"Blue\\\"\"\nmsgstr \"說 “藍色”\"\n\n#. Key:\tC7EB7FC648E0005DC35550A3D71DF221\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_2.Children(3).Children.Text\n#. /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_2.Children(3).Children.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_2.Children(3).Children.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"Cover the Abacus with Petals\"\nmsgstr \"用花瓣覆蓋住算盤\"\n\n#. Key:\tCA7A7E0A4F16FBE20EE16395D6565D7E\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"Maybe the abacus is a bit more ghosty now... or is it just you getting tired of trying?\"\nmsgstr \"也許這把算盤現在更詭異了... 還是妳厭倦了嘗試？\"\n\n#. Key:\tE0507C5E44553E824F998D8D4CB044A4\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"Your last action did not lead to any visible change. What is your next move?\"\nmsgstr \"妳最後的行動並沒有帶來任何肉眼可見的改變。妳的下壹步行動是什麽??\"\n\n#. Key:\tE8550D874C73F12B76345D9AAB2FEB80\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_2.Children(2).Children.Text\n#. /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_2.Children(2).Children.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_2.Children(2).Children.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"Heat a hammer\"\nmsgstr \"加熱壹把錘子\"\n\n#. Key:\tE894C6624CC7A0F92CECBBB364C77CD1\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_2.Children(1).Children.Text\n#. /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_2.Children(1).Children.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_2.Children(1).Children.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"Say \\\"Sorry my Abacus!\\\"\"\nmsgstr \"說 “對不起，我的算盤!”\"\n\n#. Key:\tEFC4E9AB4A1B8DF491B4FBABBC7FA560\n#. SourceLocation:\t/Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_3.Text\n#: /Game/SO/Dialogues/Workshop.Workshop:DlgNode_Speech_3.Text\nmsgctxt \"Dialogue_Workshop\"\nmsgid \"The Abacus is covered with the Petals of the Ghost Flower.\"\nmsgstr \"算盤上覆蓋著幽靈花瓣\"\n\n#. Key:\t100A735A460E0DE2B0D130B802762D8B\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter2/WW_Scroll_Inspect.WW_Scroll_Inspect:DlgNode_Speech_6.Text\n#. /Game/SO/Dialogues/Wizard/Chapter2/WW_Scroll_Inspect.WW_Scroll_Inspect:DlgNode_Speech_6.Text\n#: /Game/SO/Dialogues/Wizard/Chapter2/WW_Scroll_Inspect.WW_Scroll_Inspect:DlgNode_Speech_6.Text\nmsgctxt \"Dialogue_WW_Scroll_Inspect\"\nmsgid \"It says: \\\"Be careful: I think there are Fishies in the water!\\\"\"\nmsgstr \"上面寫著:“小心：水裏可能有魚!”\"\n\n#. Key:\t1D280F60496F7EF5DBDADB90674E8225\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter2/WW_Scroll_Inspect.WW_Scroll_Inspect:DlgNode_Speech_4.Text\n#. /Game/SO/Dialogues/Wizard/Chapter2/WW_Scroll_Inspect.WW_Scroll_Inspect:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Wizard/Chapter2/WW_Scroll_Inspect.WW_Scroll_Inspect:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_WW_Scroll_Inspect\"\nmsgid \"He was.\"\nmsgstr \"他曾經如此。\"\n\n#. Key:\t37D4983B49B8986752A095B03ADCD700\n#. SourceLocation:\t/Game/SO/Dialogues/Wizard/Chapter2/WW_Scroll_Inspect.WW_Scroll_Inspect:DlgNode_Speech_7.Text\n#. /Game/SO/Dialogues/Wizard/Chapter2/WW_Scroll_Inspect.WW_Scroll_Inspect:DlgNode_Speech_7.Text\n#: /Game/SO/Dialogues/Wizard/Chapter2/WW_Scroll_Inspect.WW_Scroll_Inspect:DlgNode_Speech_7.Text\nmsgctxt \"Dialogue_WW_Scroll_Inspect\"\nmsgid \"He was right.\"\nmsgstr \"他是對的。\"\n\n#. Key:\t26432B92474630595CF8B6B44B02657B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_26.Text\n#. /Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_26.Text\n#: /Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_26.Text\nmsgctxt \"Dialogue_WWSewerCreatures\"\nmsgid \"Farewell and good luck to you as well!\"\nmsgstr \"再見，祝妳好運！\"\n\n#. Key:\t2E3C904D458640A4F06DD793B416366A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_14.Text\n#. /Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_14.Text\n#: /Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_14.Text\nmsgctxt \"Dialogue_WWSewerCreatures\"\nmsgid \"All right, I will return when I'm done.\"\nmsgstr \"好吧，我完成後就回來。\"\n\n#. Key:\t382595684668BDA97AAB95BF129246E4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_22.Text\n#. /Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_22.Text\n#: /Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_22.Text\nmsgctxt \"Dialogue_WWSewerCreatures\"\nmsgid \"No problem. I always help when I can.\"\nmsgstr \"沒問題。我總是力所能及地提供幫助。\"\n\n#. Key:\t4BF10AD741739BE69EF797A32410C281\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_2.Text\n#. /Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_2.Text\n#: /Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_2.Text\nmsgctxt \"Dialogue_WWSewerCreatures\"\nmsgid \"One of your brothers is trapped? What happened?\"\nmsgstr \"妳的壹個兄弟被困住了?  出什麽事了？\"\n\n#. Key:\t52403E3341ECEA5801B0E58D2F472FD5\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_1.Children(1).Children.Text\n#. /Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_1.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_1.Children(1).Children.Text\nmsgctxt \"Dialogue_WWSewerCreatures\"\nmsgid \"Leave\"\nmsgstr \"離開\"\n\n#. Key:\t53AC225B4F21B68CAC6F8997F324124E\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_29.Text\n#. /Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_29.Text\n#: /Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_29.Text\nmsgctxt \"Dialogue_WWSewerCreatures\"\nmsgid \"Farewell until we meet again!\"\nmsgstr \"拜拜，下次再見！\"\n\n#. Key:\t65042BC342E9717229E74A9DD272DC5F\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_28.Text\n#. /Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_28.Text\n#: /Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_28.Text\nmsgctxt \"Dialogue_WWSewerCreatures\"\nmsgid \"It was nice to see you again.\"\nmsgstr \"很高興再次見到妳。\"\n\n#. Key:\t77959A144131C47488B221ADD9B1E13B\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_16.Text\n#. /Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_16.Text\n#: /Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_16.Text\nmsgctxt \"Dialogue_WWSewerCreatures\"\nmsgid \"Don't worry! I'm still looking for it.\"\nmsgstr \"別擔心! 我還在找呢。\"\n\n#. Key:\t7914F3CA40844C2A13A760BB0DAE1BFA\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_4.Text\n#. /Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_4.Text\n#: /Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_4.Text\nmsgctxt \"Dialogue_WWSewerCreatures\"\nmsgid \"I don't have time for you creature! Stay out of my way!\"\nmsgstr \"我可沒閑工夫理妳！別擋道！\"\n\n#. Key:\t79A62658414FE0202F2E9AA0E0238BD4\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_9.Children(0).Children.Text\n#. /Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_9.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_9.Children(0).Children.Text\nmsgctxt \"Dialogue_WWSewerCreatures\"\nmsgid \"Accept Quest\"\nmsgstr \"接受任務\"\n\n#. Key:\t9AEDA0E84BABEBCD8F18E8BC2D0B75D0\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_20.Text\n#. /Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_20.Text\n#: /Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_20.Text\nmsgctxt \"Dialogue_WWSewerCreatures\"\nmsgid \"Calm down creature! I mean you no harm.\"\nmsgstr \"別激動！我對妳並沒有惡意。\"\n\n#. Key:\tB89304534B24114D19DF7AB07635FFDE\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_10.Text\n#. /Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_10.Text\n#: /Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_10.Text\nmsgctxt \"Dialogue_WWSewerCreatures\"\nmsgid \"All right I will see what I can do.\"\nmsgstr \"好吧，我看看我能做什麽。\"\n\n#. Key:\tB8BD374E4738BFFDAFAC4EAA19E7A9D2\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_23.Text\n#. /Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_23.Text\n#: /Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_23.Text\nmsgctxt \"Dialogue_WWSewerCreatures\"\nmsgid \"Oh, thank you!\"\nmsgstr \"噢，謝謝！\"\n\n#. Key:\tCF62984840B7508E82BAC0AB9D53EC0A\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_9.Children(1).Children.Text\n#. /Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_9.Children(1).Children.Text\n#: /Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_9.Children(1).Children.Text\nmsgctxt \"Dialogue_WWSewerCreatures\"\nmsgid \"Decline\"\nmsgstr \"拒絕\"\n\n#. Key:\tEAD329F04773358B0CA339A4F155D990\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_11.Text\n#. /Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_11.Text\n#: /Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_11.Text\nmsgctxt \"Dialogue_WWSewerCreatures\"\nmsgid \"I'm sorry but I can't help you.\"\nmsgstr \"對不起，我幫不了妳。\"\n\n#. Key:\tF281396D4110E61ACFEFDBB7AD8E44A8\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_1.Children(0).Children.Text\n#. /Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_1.Children(0).Children.Text\n#: /Game/SO/Dialogues/Chapter2/WWSewerCreatures.WWSewerCreatures:DlgNode_Speech_1.Children(0).Children.Text\nmsgctxt \"Dialogue_WWSewerCreatures\"\nmsgid \"Help\"\nmsgstr \"幫助\"\n\n#. Key:\tedge_next\n#. SourceLocation:\t/Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_1.InnerEdges(0).InnerEdges.Text\n#. /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_1.InnerEdges(0).InnerEdges.Text\n#: /Game/SO/Dialogues/Chapter2/GhostDwarf.GhostDwarf:DlgNode_SpeechSequence_1.InnerEdges(0).InnerEdges.Text\nmsgctxt \"DlgSystemSettings\"\nmsgid \"Next\"\nmsgstr \"下壹個\"\n\n"
  },
  {
    "path": "Docs/Analytics.md",
    "content": "# Analytics\n\nThe default settings values for this are in [`Config/DefaultEngine.ini`](Config/DefaultEngine.ini)\n\n\n## Links\n- [UE Docs](https://docs.unrealengine.com/en-US/Gameplay/Analytics/index.html)\n- [Analytics Provider Website](https://gameanalytics.com/)\n- Plugin Location - /Plugins/GameAnalytics\n- [Repository SDK Unreal](https://github.com/vampy/GA-SDK-UNREAL)\n- [Repository SDK CPP](https://github.com/vampy/GA-SDK-CPP)\n\n## Settings `<Project>/Saved/<Target>/Engine.ini`\n\nTo disable only GameAnalytics:\n```ini\n[Analytics]\nProviderModuleName=AnalyticsMulticast\nProviderModuleNames=FileLogging\n\n[AnalyticsTest]\nProviderModuleName=AnalyticsMulticast\nProviderModuleNames=FileLogging\n\n[AnalyticsDebug]\nProviderModuleName=AnalyticsMulticast\nProviderModuleNames=FileLogging\n\n[AnalyticsDevelopment]\nProviderModuleName=AnalyticsMulticast\nProviderModuleNames=FileLogging\n```\n\nTo enable both file logging and GameAnalytics:\n```ini\n[Analytics]\nProviderModuleName=AnalyticsMulticast\nProviderModuleNames=FileLogging,GameAnalytics\n\n[AnalyticsTest]\nProviderModuleName=AnalyticsMulticast\nProviderModuleNames=FileLogging,GameAnalytics\n\n[AnalyticsDebug]\nProviderModuleName=AnalyticsMulticast\nProviderModuleNames=FileLogging,GameAnalytics\n\n[AnalyticsDevelopment]\nProviderModuleName=AnalyticsMulticast\nProviderModuleNames=FileLogging,GameAnalytics\n```\n\nTo reset to default from engine:\n```ini\n[Analytics]\nUE4TypeOverride=\"Rocket\"\n```\n\n## Settings `<Project>/Saved/<Target>/GameUserSettings.ini`\n\nTo disable the complete collection of analytics\n```ini\n# Must be under this category\n[/Script/SOrb.SoGameSettings]\nbCollectGameAnalytics=False\nbWaitForAnalyticsToSend=False\n```\n"
  },
  {
    "path": "Docs/AssetsSourcesAndLicenses.md",
    "content": "# Fonts\n\n1. [NotoSansDisplay](https://www.google.com/get/noto/#sans-lgc-display) - as default for menus/settings\n2. [Alegreya](https://github.com/huertatipografica/Alegreya) - before main menu screen | LoadingScreen | main menu buttons | command tooltips | character panel titles | some other place in ingame UI\n3. Roboto - default by engine\n4. [Khanaya](https://www.1001freefonts.com/khanaya.font) - for marketing assets, paid font\n5. [Droid Sans](https://fonts.adobe.com/fonts/droid-sans) - fallback font and used for chinese.\n\n\n```\n## NOT USED\n- Grundschrift (SO/GUI/Fonts/)\nhttps://fontlibrary.org/en/font/grundschrift\n\n- ChangaOne (SO/GUI/Fonts/)\nhttps://fonts.google.com/specimen/Changa+One\n\nGrundschrift - [as default for ingame UI](https://fontlibrary.org/en/font/grundschrift)\nChangaOne - for floating damage UI\n```\n\n# Icons\n\n\n## Xbox & Playstation icons & Additional keyboard keys\nSee extended pack from the comments:\n- http://files.fortressofdoors.com/XeluControllerPlus.zip\n- https://opengameart.org/content/free-keyboard-and-controllers-prompts-pack\n\n\nExported with width 2048\n- PlayStation\nhttps://commons.wikimedia.org/wiki/File:PlayStation_3_gamepad.svg\n- Xbox\nhttps://commons.wikimedia.org/wiki/File:Xbox_Controller.svg\n"
  },
  {
    "path": "Docs/CommandLineArguments.md",
    "content": "# Command line arguments\n\nWhen running the game you can append these arguments:\n```markdown\n#\n# Warriorb specific\n#\n-monitor=    - Select a monitor, indexing starts from 1 to M (number of monitors).\n               Usually the same order as the display numbers in windows/linux.\n               If -monitor=0 it selects the primary desktop monitor.\n\n-CollectGameAnalytics | -NoCollectGameAnalytics     - Enable/Disable collecting analytics (override for bCollectGameAnalytics from GameUserSettings.ini)\n-PauseGameWhenUnfocused | -NoPauseGameWhenUnfocused - Enable/Disable pausing when unfocused (override for bPauseGameWhenUnfocused from GameUserSettings.ini)\n-WaitForAnalyticsToSend | -NoWaitForAnalyticsToSend - Enables/Disable waiting for analytics to send (override for bWaitForAnalyticsToSend from GameUserSettings.ini)\n\n-NoHardwareBenchmark - Do not run any hardware benchmark on first startup, useful for low powered devices like intel cards\n\n-NoGPUBlacklistBox - Disables the message popup for blacklisted GPUs, useful for low end GPUs like intel cards\n\n-CheatsPassword=\"<password from WarriorbBuild.json>\" - enable cheats at runtime\n\n-SpeedRunCompetition - Enables the speed run competition mode, checks the checksum and that the time is correct.\n\n-AssetsPrintAll     - Prints in the log all assets\n-AssetsPrintAllMaps - Prints in the log all assets maps\n\n-GAInfoLogBuild | -GANoInfoLogBuild - enable/disable GameAnalytics info logs\n-GAVerboseLogBuild | - GANoVerboseLogBuild - enable/disable GameAnalytics verbose logs\n```\n\n## Editor: [See snippet](https://gitlab.com/snippets/1834336#command-line-arguments)\n"
  },
  {
    "path": "Docs/CommonProblems.md",
    "content": "\n# Common Problems, known issues\n\nThese are engine related issues, google spreadsheets is used for our own bugs.\n\n## Instanced UObject member variables are not working with ActorComponents\n\nThis is the reason we have both `KinematicActor` and `KinematicActorComponent` at the moment.\nUsing `KinematicActorComponent` would be way better (but it does not work right now).\n\nThere is an [issue about this](https://issues.unrealengine.com/issue/UE-34445).\nUpdate: marked as duplicated, most likely this is the one it duplicates:\nhttps://issues.unrealengine.com/issue/UE-38871\n(Still unresolved).\n\nAt the moment we can wait and :pray:.\nIf Epic does not fix it, we have to live with `KinematicActor`, or we have to fix it ourselves\n\n## GetInputKeyAtDistanceAlongSpline() function returns with time(?) instead of inputkey\n\nIt is used in `FSoSplinePoint::SetDistanceFromInputKey`\n\n#### Workaround:\nReturn value multiplied with `(SplineComponent->GetNumberOfSplinePoints() - 1.0f)`\n\n#### Problems:\nDoes not work with closed splines (but we don't use them anyway, so it does not matter).\n\nDoes not work if the duration (total time) is not `1.0f` (it can not be asked and I am not sure what modifies it, was `1.0f` so far).\n\nAccording to Epic support, [it is not a bug](https://answers.unrealengine.com/questions/495036/usplinecomponentgetinputkeyatdistancealongspline-i.html).\nI (elath) made a pull request but it is ignored.\n\n\n## Visual studio is slow as :shit:\n\nIf you use [Resharper](https://www.jetbrains.com/resharper/) you will have a bad time, even after [optimizing it](https://www.jetbrains.com/help/resharper/2016.2/Speeding_Up_ReSharper.html).\n[Visual Assist](http://www.wholetomato.com/) seems to be much better, performance wise.\n\nFortunately much smarter people figured a magical way to increase performance [in the forums](https://forums.unrealengine.com/showthread.php?93546-For-those-who-suffer-from-Visual-Studio-IntelliSense-slowness).\n\n## Renaming assets/files generates redirectors and breaks stuff\n\nAfter you moved the assets in the right directory, right click on the original directory (where you moved them from) and\nclick on `Fix Up Redirectors in Folder` (this should remove  the redirector files), however it means that all levels referencing the moved assets will be opened and modified (so for this reason, if you are overwriting some assets that other people are working on, you should always ask before moving anything).\n\n## 'CheckVA': none of the 11 overloads could convert all the argument types\tSOrb LogMacros.h'\n\nVery appropriate message, you probably did not get the value of the string (did not use `*`) when logging.\n\nYou did:\n```\nUE_LOG(Log, Info, TEXT(\"%s\"), Component->GetName());\n```\n\nInstead of:\n```\nUE_LOG(Log, Info, TEXT(\"%s\"), *Component->GetName());\n```\n\n## Project crashes when trying to open it from the 'Epic Games Launcher'/'Any other source'\n\nThis can have multiple causes/fixes:\n\n- If you edited C++ code and you did not build it, this is most likely the cause, build then open the project from the launcher.\n\n- If it still crashes try to remove all cache from the project.\nThis means removing the following directories `Binaries`, `Saved`, `Intermediate` and the following files `Warriorb.sln`, `Warriorb.VC.db` (windows only)\n\nIf you use the git command line, you could run the following git command to remove all ignored files:\n```\n# remove -n to NOT run the command in dry run mode\ngit clean -f -d -X -n\n```\n\n- If all else fails, try getting a clean version of the repository and try that and do some :pray:.\n"
  },
  {
    "path": "Docs/ConsoleCommands.md",
    "content": "# [Moved to hackmd.io]( https://hackmd.io/@NotYet/SyXmgpiEU)"
  },
  {
    "path": "Docs/Conventions.md",
    "content": "# Conventions\n\n## Commit messages\n\nEvery commit message that has `[C]` means that after updating to that commit, a recompile is required.\n\nEg: `[C] hit react pushed movement cleanup | kobold damage`\n\nEvery commit message that has `[G]` means that after updating to that commit the solution files should be regenerated (and recompiled, *obvious*).\n(Right click on project file -> \"Generate Visual Studio project files\").\n\nEg: `[G] new editor module with blank animation graph node`\n\nEach engine version update has '[4.xx]' tag. Source may or may not be compatilbe with older versions anymore\n\nEg: `[4.16][C] Engine update`\n"
  },
  {
    "path": "Docs/Crash.md",
    "content": "# Crashes\nNOTE: To create a fake crash, type this into the console in game: `debug crash`\n\nNOTE: To force log callstacks you can add `-ForceLogCallstacks` to the command line.\n\nSteps:\n1. Go to `Saved/Crashes/<Crash Folder>`\n2. You can ignore the log file from the `Crashes` folder as it is not complete, check instead `Saved/Logs/<Log file>` this will have the call stack at the end.\n3. Open the project in Visual Studio then open the `UE4Minidump.dmp` file.\n4. Start debugging it via clicking on `Debug with Native Only`\n\n\n## Crash Reporter Client\n\n[**See how the crash reporter reads the config files**](https://forum.sentry.io/t/unreal-engine-crash-reporter-cant-get-it-to-work/7643/10)\n\nNOTE: We also handle our own crashes inside `FSoCrashHandler`\n\nSee Docs:\n- https://docs.sentry.io/platforms/native/ue4/\n- https://forum.sentry.io/t/unreal-engine-crash-reporter-cant-get-it-to-work/7643\n\n## Copy crash Config from project to Engine\n\nThis copies the `[CrashReportClient]` section from config `<ProjectPath>/Config/DefaultEngine.ini` to `<EnginePath>/Engine/Programs/CrashReportClient/Config/DefaultEngine.ini`\n\n```sh\n./Tools/UnrealEngine/CopyCrashReporterSettingsToEngine.py\n```\n\n## CLI and debug files\n\n- https://docs.sentry.io/workflow/debug-files/\n- https://docs.sentry.io/cli/dif/#uploading-files\n- https://docs.sentry.io/cli\n\n```sh\n# Install sentry-cli\n./Tools/setup-entry.sh\n\n# Set auth token, get it from https://sentry.io/settings/account/api/auth-tokens/\n# Modify ./Tools/config.ini SENTRY_AUTH_TOKEN\n\n# Run\n./Tools/SentryCLI.py\n\n\n### Debug files\n./Tools/Warriorb/Demo_Sentry_UploadDif.py <debug files or folders>\n```\n"
  },
  {
    "path": "Docs/DemoPackage.md",
    "content": "# Demo Package\n\n\n## [/Config/DefaultGame.ini](../Config/DefaultGame.ini)\n\n```ini\n[/Script/UnrealEd.ProjectPackagingSettings]\nBuild=IfProjectHasCode\nBuildConfiguration=PPBC_Development\nStagingDirectory=(Path=\"U:/Warriorb/Packaged\")\nFullRebuild=True\nForDistribution=False\nIncludeDebugFiles=True\nBlueprintNativizationMethod=Disabled\nbIncludeNativizedAssetsInProjectGeneration=False\nbExcludeMonolithicEngineHeadersInNativizedCode=False\nUsePakFile=True\nbGenerateChunks=False\nbGenerateNoChunks=False\nbChunkHardReferencesOnly=False\nbForceOneChunkPerFile=False\nMaxChunkSize=0\nbBuildHttpChunkInstallData=False\nHttpChunkInstallDataDirectory=(Path=\"\")\nPakFileCompressionFormats=\nPakFileAdditionalCompressionOptions=\nHttpChunkInstallDataVersion=\nIncludePrerequisites=True\nIncludeAppLocalPrerequisites=False\nbShareMaterialShaderCode=False\nbSharedMaterialNativeLibraries=False\nApplocalPrerequisitesDirectory=(Path=\"\")\nIncludeCrashReporter=True\nInternationalizationPreset=All\n-CulturesToStage=en\n+CulturesToStage=en\n+CulturesToStage=en-001\n+CulturesToStage=en-150\n+CulturesToStage=en-AG\n+CulturesToStage=en-AI\n+CulturesToStage=en-AS\n+CulturesToStage=en-AU\n+CulturesToStage=en-BB\n+CulturesToStage=en-BE\n+CulturesToStage=en-BM\n+CulturesToStage=en-BS\n+CulturesToStage=en-BW\n+CulturesToStage=en-BZ\n+CulturesToStage=en-CA\n+CulturesToStage=en-CC\n+CulturesToStage=en-CK\n+CulturesToStage=en-CX\n+CulturesToStage=en-CM\n+CulturesToStage=en-DG\n+CulturesToStage=en-DM\n+CulturesToStage=en-ER\n+CulturesToStage=en-FK\n+CulturesToStage=en-FJ\n+CulturesToStage=en-FM\n+CulturesToStage=en-GB\n+CulturesToStage=en-GD\n+CulturesToStage=en-GG\n+CulturesToStage=en-GH\n+CulturesToStage=en-GI\n+CulturesToStage=en-GM\n+CulturesToStage=en-GU\n+CulturesToStage=en-GY\n+CulturesToStage=en-HK\n+CulturesToStage=en-IE\n+CulturesToStage=en-IM\n+CulturesToStage=en-IN\n+CulturesToStage=en-IO\n+CulturesToStage=en-JE\n+CulturesToStage=en-JM\n+CulturesToStage=en-KE\n+CulturesToStage=en-KI\n+CulturesToStage=en-KN\n+CulturesToStage=en-KY\n+CulturesToStage=en-LC\n+CulturesToStage=en-LR\n+CulturesToStage=en-LS\n+CulturesToStage=en-MG\n+CulturesToStage=en-MH\n+CulturesToStage=en-MO\n+CulturesToStage=en-MP\n+CulturesToStage=en-MS\n+CulturesToStage=en-MU\n+CulturesToStage=en-MT\n+CulturesToStage=en-MW\n+CulturesToStage=en-NA\n+CulturesToStage=en-NF\n+CulturesToStage=en-NG\n+CulturesToStage=en-NR\n+CulturesToStage=en-NU\n+CulturesToStage=en-NZ\n+CulturesToStage=en-PG\n+CulturesToStage=en-PH\n+CulturesToStage=en-PK\n+CulturesToStage=en-PN\n+CulturesToStage=en-PR\n+CulturesToStage=en-RW\n+CulturesToStage=en-PW\n+CulturesToStage=en-SB\n+CulturesToStage=en-SC\n+CulturesToStage=en-SD\n+CulturesToStage=en-SG\n+CulturesToStage=en-SH\n+CulturesToStage=en-SL\n+CulturesToStage=en-SS\n+CulturesToStage=en-SX\n+CulturesToStage=en-SZ\n+CulturesToStage=en-TC\n+CulturesToStage=en-TK\n+CulturesToStage=en-TO\n+CulturesToStage=en-TT\n+CulturesToStage=en-TV\n+CulturesToStage=en-TZ\n+CulturesToStage=en-UG\n+CulturesToStage=en-UM\n+CulturesToStage=en-US\n+CulturesToStage=en-VC\n+CulturesToStage=en-VG\n+CulturesToStage=en-VI\n+CulturesToStage=en-VU\n+CulturesToStage=en-WS\n+CulturesToStage=en-ZA\n+CulturesToStage=en-ZM\n+CulturesToStage=en-ZW\n+CulturesToStage=hu\n+CulturesToStage=hu-HU\n+CulturesToStage=ro-MD\n+CulturesToStage=ro-RO\n+CulturesToStage=ro\n+CulturesToStage=zh-Hans\n+CulturesToStage=zh-CN\n+CulturesToStage=zh-Hans-CN\n+CulturesToStage=zh-HK\n+CulturesToStage=zh-Hans-HK\n+CulturesToStage=zh-MO\n+CulturesToStage=zh-Hans-MO\n+CulturesToStage=zh-SG\n+CulturesToStage=zh-Hans-SG\n+CulturesToStage=zh-Hant\n+CulturesToStage=zh-Hant-HK\n+CulturesToStage=zh-Hant-MO\n+CulturesToStage=zh-TW\n+CulturesToStage=zh-Hant-TW\n+CulturesToStage=en-US-POSIX\n+CulturesToStage=es\n+CulturesToStage=es-419\n+CulturesToStage=es-AR\n+CulturesToStage=es-BO\n+CulturesToStage=es-CL\n+CulturesToStage=es-CO\n+CulturesToStage=es-CR\n+CulturesToStage=es-CU\n+CulturesToStage=es-DO\n+CulturesToStage=es-EA\n+CulturesToStage=es-EC\n+CulturesToStage=es-ES\n+CulturesToStage=es-GQ\n+CulturesToStage=es-GT\n+CulturesToStage=es-HN\n+CulturesToStage=es-IC\n+CulturesToStage=es-MX\n+CulturesToStage=es-NI\n+CulturesToStage=es-PA\n+CulturesToStage=es-PH\n+CulturesToStage=es-PE\n+CulturesToStage=es-PR\n+CulturesToStage=es-PY\n+CulturesToStage=es-SV\n+CulturesToStage=es-US\n+CulturesToStage=es-UY\n+CulturesToStage=es-VE\n+CulturesToStage=fr\n+CulturesToStage=fr-BE\n+CulturesToStage=fr-BF\n+CulturesToStage=fr-BI\n+CulturesToStage=fr-BJ\n+CulturesToStage=fr-BL\n+CulturesToStage=fr-CA\n+CulturesToStage=fr-CD\n+CulturesToStage=fr-CF\n+CulturesToStage=fr-CG\n+CulturesToStage=fr-CH\n+CulturesToStage=fr-CI\n+CulturesToStage=fr-DJ\n+CulturesToStage=fr-CM\n+CulturesToStage=fr-DZ\n+CulturesToStage=fr-FR\n+CulturesToStage=fr-GA\n+CulturesToStage=fr-GF\n+CulturesToStage=fr-GN\n+CulturesToStage=fr-GP\n+CulturesToStage=fr-GQ\n+CulturesToStage=fr-HT\n+CulturesToStage=fr-KM\n+CulturesToStage=fr-LU\n+CulturesToStage=fr-MA\n+CulturesToStage=fr-MC\n+CulturesToStage=fr-MF\n+CulturesToStage=fr-MG\n+CulturesToStage=fr-ML\n+CulturesToStage=fr-MQ\n+CulturesToStage=fr-MR\n+CulturesToStage=fr-MU\n+CulturesToStage=fr-NE\n+CulturesToStage=fr-NC\n+CulturesToStage=fr-PF\n+CulturesToStage=fr-PM\n+CulturesToStage=fr-RE\n+CulturesToStage=fr-RW\n+CulturesToStage=fr-SC\n+CulturesToStage=fr-SN\n+CulturesToStage=fr-SY\n+CulturesToStage=fr-TD\n+CulturesToStage=fr-TG\n+CulturesToStage=fr-TN\n+CulturesToStage=fr-VU\n+CulturesToStage=fr-WF\n+CulturesToStage=fr-YT\n+CulturesToStage=ru\n+CulturesToStage=ru-BY\n+CulturesToStage=ru-KZ\n+CulturesToStage=ru-KG\n+CulturesToStage=ru-MD\n+CulturesToStage=ru-RU\n+CulturesToStage=ru-UA\nbCookAll=False\nbCookMapsOnly=True\nbCompressed=False\nbEncryptIniFiles=False\nbEncryptPakIndex=False\nGenerateEarlyDownloaderPakFile=False\nbSkipEditorContent=False\nbSkipMovies=True\n-EarlyDownloaderPakFileFiles=...\\Content\\Internationalization\\...\\*.icu\n-EarlyDownloaderPakFileFiles=...\\Content\\Internationalization\\...\\*.brk\n-EarlyDownloaderPakFileFiles=...\\Content\\Internationalization\\...\\*.res\n-EarlyDownloaderPakFileFiles=...\\Content\\Internationalization\\...\\*.nrm\n-EarlyDownloaderPakFileFiles=...\\Content\\Internationalization\\...\\*.cfu\n-EarlyDownloaderPakFileFiles=...\\Content\\Localization\\...\\*.*\n-EarlyDownloaderPakFileFiles=...\\Content\\Localization\\*.*\n-EarlyDownloaderPakFileFiles=...\\Content\\Certificates\\...\\*.*\n-EarlyDownloaderPakFileFiles=...\\Content\\Certificates\\*.*\n-EarlyDownloaderPakFileFiles=-...\\Content\\Localization\\Game\\...\\*.*\n-EarlyDownloaderPakFileFiles=-...\\Content\\Localization\\Game\\*.*\n-EarlyDownloaderPakFileFiles=...\\Config\\...\\*.ini\n-EarlyDownloaderPakFileFiles=...\\Config\\*.ini\n-EarlyDownloaderPakFileFiles=...\\Engine\\GlobalShaderCache*.bin\n-EarlyDownloaderPakFileFiles=...\\Content\\ShaderArchive-Global-*.ushaderbytecode\n-EarlyDownloaderPakFileFiles=...\\Content\\Slate\\*.*\n-EarlyDownloaderPakFileFiles=...\\Content\\Slate\\...\\*.*\n-EarlyDownloaderPakFileFiles=...\\*.upluginmanifest\n-EarlyDownloaderPakFileFiles=...\\*.uproject\n-EarlyDownloaderPakFileFiles=...\\global_sf*.metalmap\n+EarlyDownloaderPakFileFiles=...\\Content\\Internationalization\\...\\*.icu\n+EarlyDownloaderPakFileFiles=...\\Content\\Internationalization\\...\\*.brk\n+EarlyDownloaderPakFileFiles=...\\Content\\Internationalization\\...\\*.res\n+EarlyDownloaderPakFileFiles=...\\Content\\Internationalization\\...\\*.nrm\n+EarlyDownloaderPakFileFiles=...\\Content\\Internationalization\\...\\*.cfu\n+EarlyDownloaderPakFileFiles=...\\Content\\Localization\\...\\*.*\n+EarlyDownloaderPakFileFiles=...\\Content\\Localization\\*.*\n+EarlyDownloaderPakFileFiles=...\\Content\\Certificates\\...\\*.*\n+EarlyDownloaderPakFileFiles=...\\Content\\Certificates\\*.*\n+EarlyDownloaderPakFileFiles=-...\\Content\\Localization\\Game\\...\\*.*\n+EarlyDownloaderPakFileFiles=-...\\Content\\Localization\\Game\\*.*\n+EarlyDownloaderPakFileFiles=...\\Config\\...\\*.ini\n+EarlyDownloaderPakFileFiles=...\\Config\\*.ini\n+EarlyDownloaderPakFileFiles=...\\Engine\\GlobalShaderCache*.bin\n+EarlyDownloaderPakFileFiles=...\\Content\\ShaderArchive-Global-*.ushaderbytecode\n+EarlyDownloaderPakFileFiles=...\\Content\\Slate\\*.*\n+EarlyDownloaderPakFileFiles=...\\Content\\Slate\\...\\*.*\n+EarlyDownloaderPakFileFiles=...\\*.upluginmanifest\n+EarlyDownloaderPakFileFiles=...\\*.uproject\n+EarlyDownloaderPakFileFiles=...\\global_sf*.metalmap\n+MapsToCook=(FilePath=\"/Game/SO/Maps/CustomMaps/WhiteWall\")\n+DirectoriesToAlwaysCook=(Path=\"/Game/SO/CharacterStrikes\")\n+DirectoriesToAlwaysCook=(Path=\"/Game/SO/Items\")\n+DirectoriesToAlwaysCook=(Path=\"/Game/SO/GUI/art/Loading/MainGameLoadingImgs\")\n+DirectoriesToNeverCook=(Path=\"/Game/SO/Maps/PrototypeLevels\")\n+DirectoriesToNeverCook=(Path=\"/Game/SO/Maps/SavedLevelsFromAct2\")\n+DirectoriesToNeverCook=(Path=\"/Game/SO/Maps/Story/Act1\")\n+DirectoriesToNeverCook=(Path=\"/Game/SO/Maps/Story/Act2\")\n+DirectoriesToNeverCook=(Path=\"/Game/SO/Maps/Story/Ending\")\n+DirectoriesToNeverCook=(Path=\"/Game/SO/Maps/Story/Act3\")\n+DirectoriesToNeverCook=(Path=\"/Game/SO/Maps/CustomMaps/DreamHack\")\n+DirectoriesToNeverCook=(Path=\"/Game/SO/Maps/CustomMaps/EscapeFromDarkness\")\n+DirectoriesToNeverCook=(Path=\"/Game/Movies/Demo\")\n+DirectoriesToNeverCook=(Path=\"/Engine/Maps\")\n+DirectoriesToNeverCook=(Path=\"/Engine/MobileResources\")\n+DirectoriesToNeverCook=(Path=\"/Engine/VREditor\")\n+DirectoriesToNeverCook=(Path=\"/Engine/EditorSounds\")\n+DirectoriesToNeverCook=(Path=\"/DlgSystem\")\n+DirectoriesToAlwaysStageAsUFS=(Path=\"SO/Data/CameraData\")\n+DirectoriesToAlwaysStageAsUFS=(Path=\"SO/Data\")\n+DirectoriesToAlwaysStageAsUFS=(Path=\"SO/AIConfig/ActionLists\")\n+DirectoriesToAlwaysStageAsUFS=(Path=\"SO/AIConfig/StrikeMaps\")\n+DirectoriesToAlwaysStageAsUFS=(Path=\"SO/AIConfig\")\n+DirectoriesToAlwaysStageAsUFS=(Path=\"Localization/StringTables\")\n+DirectoriesToAlwaysStageAsNonUFS=(Path=\"FMOD\")\n+DirectoriesToAlwaysStageAsNonUFS=(Path=\"Splash\")\nbNativizeBlueprintAssets=False\nbNativizeOnlySelectedBlueprints=False\n```\n"
  },
  {
    "path": "Docs/EngineInstalledBuild.md",
    "content": "# Engine Installed build\n\n- https://docs.unrealengine.com/en-US/Programming/Deployment/UsinganInstalledBuild/index.html\n\n\n\n## Make an installed build for all supported platforms\n\n\n### Download source code\n```sh\ngit clone git@gitlab.com:NotYetGames/sorb/UnrealEngine.git WarriorbUnrealEngine\ncd WarriorbUnrealEngine\ngit checkout -b warriorb\n```\n\n### FMOD modifications\n\nhttps://www.fmod.com/resources/documentation-ue4?version=2.0&page=platform-specifics.html#xbox-one\n\n\n### Download XBOX XDK\n\nhttps://www.microsoft.com/en-us/software-download/devcenter\n\n### Configure\n```sh\n# Copy full path\ncd WarriorbUnrealEngine\npwd\n```\n\nGo inside your `Warriorb/Tools/config.ini` and change the engine path to the full path of the WarriorbUnrealEngine\n\n\nDownload binaries Xbox and Switch by following  `DOWNLOAD_XBOX_SWITCH_BINARIES.html` an overwrite them over the engine\n\n### Build\n```sh\n\n# Build\n./Tools/UnrealEngine/MakeCompiledInstalledBuild.py --with-windows64 --with-linux --with-xbox-one --with-switch --with-full-debug-info --with-ddc --game-configurations \"Debug;DebugGame;Development;Shipping\"\n\n\n# To clean build add\n# --clean\n\n# Move or rename\n<WarriorbUnrealEngine>/LocalBuilds/Engine/Windows\n```\n\n\n### Clean\n```sh\n\ngit clean -f -d -X -n\n```\n"
  },
  {
    "path": "Docs/Git.md",
    "content": "# GIT install & update\n\n## Install\n1. Make sure you have [Unreal engine](https://www.unrealengine.com) installed.\n\n2. Install a [git client](https://wiki.unrealengine.com/Git_source_control_(Tutorial)#Recommended_Git_GUI.27s) and clone the repository.\n\n3. Clone from the GUI, remember to also initialize the submodules or use the command line to clone the repo properly:\n```sh\n# Or for SSH git@gitlab.com:NotYetGames/sorb/code.git\ngit clone --recursive -j2 https://gitlab.com/NotYetGames/sorb/code2.git\n```\n```sh\n# If you cloned without the --recursive flag, run the following command\ngit submodule update --init --recursive\n```\n\n4. After the repository is cloned, right click on the `Warriorb.uproject` -> `Generate Visual Studio project files`.\n\n   Or just run `./Tools/GenerateProjectFiles.sh` (read the [`./Tools/README.md`](Tools/README.md) first)\n\n\n## Update\nUsually `git pull` works but if you also want to update the submodules you must run:\n```sh\ngit submodule foreach git pull origin\n```\n"
  },
  {
    "path": "Docs/ItchGamejolt.md",
    "content": "# Package and Upload\n\n\n## WarriOrb\n\n### Expected directory structure\n\n```sh\n\n```\n\n\n### Scripts\n\n```sh\n\n```\n\n\n## WarriOrb: Prologue\n\n### Expected directory structure\n```sh\n<WarriorbGitRepo> - The path to the Warriorb git repository\n\n# Windows64\n<WarriorbGitRepo>/Packaged/WarriOrbPrologue_Windows64_<VERSION>_<GIT_COMMIT>/\n\n# Linux\n<WarriorbGitRepo>/Packaged/WarriOrbPrologue_Steam_Linux_<VERSION>_<GIT_COMMIT>/\n```\n\n\n### Scripts\n\n```sh\n# Package ALL (Windows + Linux)\n./Tools/Warriorb/Demo_ItchGameJolt_PackageAll.py --unattended\n\n# [OPTIONAL] Package Windows\n# ./Tools/Warriorb/Demo_ItchGameJolt_PackageWindows.py\n# [OPTIONAL] Package Linux\n# ./Tools/Warriorb/Demo_ItchGameJolt_PackageLinux.py\n\n# Upload to Itch\n./Tools/Warriorb/Demo_Itch_Upload.py\n\n# Sentry crash reporter\n./Tools/Warriorb/Demo_Sentry_UploadDif.py --itch-gamejolt\n```\n\nNOTE: to run all the commands all in one just run\n```sh\n./Tools/Warriorb/Demo_ItchGameJolt_All_Run.sh\n```\n"
  },
  {
    "path": "Docs/Linux.md",
    "content": "# Linux\n\n\n## Callbacks\n\n- `OnShutdownAfterError` - Called when an error occurred.\n"
  },
  {
    "path": "Docs/Localization/Chinese.md",
    "content": "# Chinese\n\nThe pipeline is from to excel:\n```sh\n# Export\n./Tools/Warriorb/Localization/ExportToExcel_Chinese.py\n# The file should be at the root of your project\n\n# Import\n# NOTE: put the file in the root of your project first\n./Tools/Warriorb/Localization/ImportFromExcel_Chinese_WarriorbDemo.py\n./Tools/Warriorb/Localization/ImportFromExcel_Chinese_Warriorb.py\n./Tools/Warriorb/Localization/ImportFromExcel_Chinese_WarriorbDialogues.py\n```\n"
  },
  {
    "path": "Docs/Localization/README.md",
    "content": "# [Localization](https://docs.unrealengine.com/en-US/Gameplay/Localization/index.html)\n\n\n**Config files**: [Config/Localization/](/Config/Localization/)\n\nThe files with the `<All|number>.` prefix are written by hand and are intended to be ran from the command line, the other ones (with the prefix `Warriorb_`) are generated by the [Localization Dashboard](https://docs.unrealengine.com/en-US/Gameplay/Localization/LocalizationTools/index.html) and should generally not be written by hand\n\n\n**Output data**: [Content/Localization/Warriorb](/Content/Localization/Warriorb)\n\nThe file/directory structure of the output is explained [here](https://docs.unrealengine.com/en-US/Gameplay/Localization/Overview/#localizationpipeline).\n\n## [Translation Guide](./TranslationGuide.md)\n\nExport markdown into pdf/tml (see [guide](https://superuser.com/questions/689056/how-can-i-convert-github-flavored-markdown-to-a-pdf)):\n```sh\nnpm install -g markdown-pdf\nmarkdown-pdf Docs/Localization/TranslationGuide.md\n\n# OR\n# HTML, preserves the format better\npip install grip\ngrip Docs/Localization/TranslationGuide.md\n# or\nrip Docs/Localization/TranslationGuide.md --export TranslationGuide.html\n```\n\n## [Romanian](./Romanian.md)\n\n\n## Translating portable object files (po)\n\nAfter you run the pipeline export step, you edit the `*.po` files in something like:\n1. [POEDIT](https://poedit.net/)\n\t- Desktop program, locally on your computer\n\t- Shows warnings and easily translate strings\n\t- More advanced features like automatic translator cost money\n\t- Can NOT collaborate with multiple people\n2. [WEBLATE](https://weblate.org/en/)\n\t- Server program, host on remote server\n\t- Harder to setup, needs a server (but this has a docker image)\n\t- Can collaborate with multiple people\n3. [Convert the po files to an excel (xlsx)](https://github.com/NotYetGames/po-xls) and edit them in something like google spreadsheets\n\t- Another step for conversion to xlsx\n\t- Can [automatic translate](https://jakemiller.net/translate-in-google-sheets/) using spreadsheets\n\t- Can collaborate with multiple people\n\n## Portable Object files (po) to excel files (xlsx)\n\nSometimes people don't want to use poedit to edit\n\n## Demo (WarriorbDemo Target)\n```sh\n# Does all the steps gathering, import of po files and export of new po files\n./Tools/Warriorb/Localization/Demo_All_Run.py\n```\n\n## Run (Warriorb Target)\n```sh\n# Does all the steps gathering, import of po files and export of new po files\n./Tools/Warriorb/Localization/All_Run.py\n```\n\n## [House keeping (pipeline optimization)](https://docs.unrealengine.com/en-US/Gameplay/Localization/LocalizationPipelineOptimization/index.html)\n\n\n### ReportStaleGatherCache\nGenerates a `StaleGatherCacheReport.txt` file alongside the manifest for your localization target. This file contains a list of any Assets that contain a stale gather cache.\n\n```sh\n./Tools/Warriorb/Localization/ReportStaleGatherCache.py\n```\n\n### FixStaleGatherCache\nAttempts to automatically fix any Assets that contain a stale gather cache, by re-saving them.\n\n```sh\n./Tools/Warriorb/Localization/FixStaleGatherCache.py\n```\n\n\n### FixMissingGatherCache\nFor Assets too old to have a gather cache, this attempts to automatically fix Assets that are missing a gather cache by re-saving them.\n\n```sh\n./Tools/Warriorb/Localization/FixMissingGatherCache.py\n```\n\n## Packaging\nYou must always edit the [following fields](https://docs.unrealengine.com/en-US/Gameplay/Localization/Overview/index.html) inside package settings if you add/remove a language:\n- **Localizations to Package** - With this you can choose which cultures you want to stage localization data for. You can use the Show Localized option to filter the list to only show cultures that you have LocRes files for.\n- **Internationalization Support** - With this you can choose which set of ICU internationalization data you want to stage. This option must overlap with the localization data you intend to stage.\n\n\n## [Asset Localization](https://docs.unrealengine.com/en-US/Gameplay/Localization/Asset/index.html)\n\nAsset localization allows you to completely replace one Asset with another on a per-culture basis.\n\n**Not that useful for us.**\n\n\n## ELocalizedTextCollapseMode\n```cpp\n/** Collapse texts with the same text identity (namespace + key) and source text (default 4.15+ behavior). */\nIdenticalTextIdAndSource - \"Identical Text Identity (Namespace + Key) and Source Text\"\n\n/** Collapse texts with the same namespace and source text (legacy pre-4.14 behavior). */\nIdenticalNamespaceAndSource\t- \"Identical Namespace and Source Text\")\n\n// USELESS\n/** Collapse texts with the same package ID, text identity (namespace + key), and source text (deprecated 4.14 behavior, removed in 4.17). */\nIdenticalPackageIdTextIdAndSource - \"Identical Package ID, Text Identity (Namespace + Key) and Source Text\"\n// USELESS\n```\n"
  },
  {
    "path": "Docs/Localization/Romanian.md",
    "content": "# Romanian\n\n| English         |         Romanian          |\n| --------------- | :-----------------------: |\n| Cooldown        |   Viteza de reîncărcare   |\n| Rope            |           Funie           |\n| SoulKeeper      |  Deținătorul Sufletului   |\n| Spellcaster     |    Făcătorul de Vrăji     |\n| Lever           |          Manetă           |\n| Chest           |           Cufăr           |\n| Crossroad Cave! | Peștera de la Intersecție |\n| Keeper          |          Portar           |\n| Trial           |         Provocare         |\n| Trade           |        Târguiește         |\n| Maintainer      |       Întreținător        |\n\n\nTODO: Teleport, worthy, Wanderer?\n"
  },
  {
    "path": "Docs/Localization/Spanish.md",
    "content": "# Spanish\n\n\nhttps://docs.unrealengine.com/en-US/Gameplay/Localization/Overview/#spanish\n"
  },
  {
    "path": "Docs/Localization/TranslationGuide.md",
    "content": "# [Moved to hackmd.io](https://hackmd.io/@NotYet/Syn4K-HNU)\n"
  },
  {
    "path": "Docs/Steam/Achievements.md",
    "content": "# Achievements\n\n**Guides:**\n\n1. https://partner.steamgames.com/doc/features/achievements\n2. https://forums.unrealengine.com/community/community-content-tools-and-tutorials/26348-tutorial-steam-achievements\n3. https://forums.unrealengine.com/development-discussion/blueprint-visual-scripting/1432526-steam-achievements-implementation-for-ue4-developers-tips-and-tricks\n4. https://www.orfeasel.com/handling-steam-achievements-steam-integration-part-2/\n\n\n## Add achievement and use it\n\n1. **[OPTIONAL]** This is not needed but recommended because it appears in the console commands.\nOpen the **Project Settings** -> **Warriorb Achivement** and add the achievement under the **Game** or **Demo** Category.\n2. Add the steam achivements inside steamworks settings for  either the [**Game**](https://partner.steamgames.com/apps/achievements/790360) or for the [**Demo**](https://partner.steamgames.com/apps/achievements/1193760)\n3. Call `USoAchievementManager::UnlockAchievement` to unlock an achievement\n\n## Console commands\n`SO.Achievements.*`\n\n\n## Localization\n```sh\n# Export\n./Tools/Steam/Localization_ExportAchivementsToPOFiles.py -p WarriOrb 790360_loc_all.vdf\n./Tools/Steam/Localization_ExportAchivementsToPOFiles.py -p WarriOrbPrologue 1193760_loc_all.vdf\n\n# Import\n./Tools/Steam//Localization_ImportAchivementsFromPOFiles.py -d 790360_loc_all.vdf <po_files>\n./Tools/Steam//Localization_ImportAchivementsFromPOFiles.py -d 1193760_loc_all.vdf <po_files>\n```\n\nThen just upload it for the achivements localization\n\n### Chinese\n```sh\n# Export to excel\npo2xls.exe -o WarriorbAchievements_zh-Hans+zh-Hant.xlsx WarriorbAchievements_schinese.po WarriorbAchievements_tchinese.po\n\n# Import from excel\nxls2po.exe zh-Hans WarriorbAchievements_zh-Hans+zh-Hant.xlsx WarriorbAchievements_schinese.po\nxls2po.exe zh-Hant WarriorbAchievements_zh-Hans+zh-Hant.xlsx WarriorbAchievements_tchinese.po\n\n# Run the import to po files as the scripts above\n```\n"
  },
  {
    "path": "Docs/Steam/Config.md",
    "content": "# Config file\n\n**Guides:**\n- steam_appid.txt - https://docs.unrealengine.com/latest/INT/Programming/Online/Steam/index.html#steamappid\n\n\nTo configure the steam settings you need to change the config file located at [`Config/DefaultEngine.ini`](/Config/DefaultEngine.ini).\n\n> **Note:**\nThat the `SteamDevAppId` is automatically set at Build time, the value is retrieved from [`Source/WarriorbBuild.json`](/Source/WarriorbBuild.json)\n\n\nFor more details see the Guides above.\n\nNOTE: For non shipping builds you must edit `UE4_PROJECT_STEAMSHIPPINGID`\nmacro, see https://docs.unrealengine.com/en-US/Programming/Online/Steam/index.html#steamappid\n\n\nChanges done with explanations:\n```ini\n[/Script/Engine.GameEngine]\n# DefName - is the unique name of this net driver definition.\n# DriverClassName - is the class name of the primary net driver.\n# DriverClassNameFallBack - is the class name of the fallback net driver if the primary net driver class fails to initialize.\n\n# Clears all the previous definitions\n!NetDriverDefinitions=ClearArray\n\n# Enabled\n+NetDriverDefinitions=(DefName=\"GameNetDriver\",DriverClassName=\"/Script/OnlineSubsystemSteam.SteamNetDriver\",DriverClassNameFallback=\"/Script/OnlineSubsystemUtils.IpNetDriver\")\n\n# Disabled\n+NetDriverDefinitions=(DefName=\"GameNetDriver\",DriverClassName=\"OnlineSubsystemUtils.IpNetDriver\",DriverClassNameFallback=\"/Script/OnlineSubsystemUtils.IpNetDriver\")\n\n# Use steam as the net driver\n[/Script/OnlineSubsystemSteam.SteamNetDriver]\nNetConnectionClassName=\"/Script/OnlineSubsystemSteam.SteamNetConnection\"\n\n# Configure the online stuff\n[OnlineSubsystem]\n\n# Use nothing (LAN)\nDefaultPlatformService=Null\n\n# Use steam\nDefaultPlatformService=Steam\n\n# Default value is 50 ms\nPollingIntervalInMs=50\n\n# Enable/Disable Foice\nbHasVoiceEnabled=False\n\n# Override the build ID for the online subsystem\nbUseBuildIdOverride=false\n\n# Int : the ovverride\nBuildIdOverride=0\n\n[OnlineSubsystemSteam]\nbEnabled=True\n\n# 480 is SpaceWar\n# This is only used in NON SHIPPING builds\nSteamDevAppId=480\nGameServerQueryPort=27015\n\n# Seems to be only useful for server advertising.\n# NOTE: Only useful in multiplayer games.\nGameVersion=1.0.0.0\n\n# Relaunch the game with steam if necessary\nbRelaunchInSteam=True\n\n# VAC cheat protection\n# NOTE: Only useful in multiplayer games.\n# See: https://partner.steamgames.com/doc/api/steam_gameserver\n# True - eServerModeAuthenticationAndSecure\n# False - eServerModeAuthentication\nbVACEnabled=False\n\n# Allow P2P connections to fall back to being relayed through the Steam servers if a direct connection\n# or NAT-traversal cannot be established. Only applies to connections created after setting this value,\n# or to existing connections that need to automatically reconnect after this value is set.\n# NOTE: Only useful in multiplayer games.\nbAllowP2PPacketRelay=true\nP2PConnectionTimeout=90\n```\n"
  },
  {
    "path": "Docs/Steam/LocalContentServer.md",
    "content": "# Local Content Server upload\n\n> **Note:**\nThis is for testing only, it is a local web server on your machine, no data is pushed to steam.\n\nMain app build file: [`Steam/game/app_build_Warriorb_790360_Local.vdf`](/Steam/game/app_build_Warriorb_790360_Local.vdf)\n\n\n## Config File\n\nSee https://partner.steamgames.com/doc/sdk/uploading/local_content_server for details.\n\n\n> **Note:**\n[You MUST Configuring Steam Client To Use Your Local Content Server.](https://partner.steamgames.com/doc/sdk/uploading/local_content_server#3)\n\n\n### WarriOrb\n\nYou need to copy [`Steam/game/app_build_Warriorb_790360_Local.EXAMPLE.vdf`](/Steam/game/app_build_Warriorb_790360_Local.EXAMPLE.vdf) to [`Steam/game/app_build_Warriorb_790360_Local.vdf`](/Steam/game/app_build_Warriorb_790360_Local.vdf) and modify for your local configuration.\nconfiguration.\n\n### WarriOrb: Prologue\n\nYou need to copy [`Steam/demo/app_build_Warriorb_demo_1193760_Local.EXAMPLE.vdf`](/Steam/demo/app_build_Warriorb_demo_1193760_Local.EXAMPLE.vdf) to [`Steam/demo/app_build_Warriorb_demo_1193760_Local.vdf`](/Steam/demo/app_build_Warriorb_demo_1193760_Local.vdf) and modify for your local\n\n\n## Configure paths `htdocs` path:\n1. In `<STEAM_VERSION_SDK_PATH>/tools/ContentServer/mongoose.conf` edit `document_root`\n2. In [`Steam/app_build_Warriorb_790360_Local.vdf`](Steam/app_build_Warriorb_790360_Local.vdf) edit `local` to be the same as the value from `1`\n\n## Run\n\n1. Start web server by running `<STEAM_VERSION_SDK_PATH>/tools/ContentServer/mongoose-3.1.exe`\n\n2. Package\n\n### WarriOrb\n\n```sh\n# Package game\n./Tools/Warriorb/Steam_PackageWindows.py\n\n# Upload to local server\n./Tools/SteamUpload.py ./Steam/game/app_build_Warriorb_790360_Local.vdf\n```\n\n### WarriOrb: Prologue\n```sh\n# Package game\n./Tools/Warriorb/Demo_Steam_PackageWindows.py\n\n# Upload to local server\n./Tools/SteamUpload.py ./Steam/demo/app_build_Warriorb_demo_1193760_Local.vdf\n```\n"
  },
  {
    "path": "Docs/Steam/PackageAndUpload.md",
    "content": "# Steam Package & Upload\n\n**Guides:**\n1. https://partner.steamgames.com/doc/sdk/installscripts\n2. https://partner.steamgames.com/doc/sdk/uploading\n3. https://developer.valvesoftware.com/wiki/SteamCMD\n\n> **Note:**\nTo actually upload change `preview = 0`.\nThat if  `preview = 1` which means that it will only test that everything is ok.\n\nMain app build file: [`Steam/game/app_build_Warriorb_790360.vdf`](/Steam/game/app_build_Warriorb_790360.vdf)\n\nDemo app build file: [`Steam/demo/app_build_Warriorb_demo_1193760.vdf`](/Steam/demo/app_build_Warriorb_demo_1193760.vdf)\n\n## WarriOrb\n\n### Expected directory structure\n\n```sh\n<WarriorbGitRepo> - The path to the Warriorb git repository\n\n# Windows64\n<WarriorbGitRepo>/Packaged/WarriOrb_Steam_Windows64/\n\n# Linux\n<WarriorbGitRepo>/Packaged/WarriOrb_Steam_Linux/\n```\n\n\n### Scripts\n\n```sh\n# Package ALL (Windows + Linux)\n./Tools/Warriorb/Steam_PackageAll.py\n\n# [OPTIONAL] Package Windows\n./Tools/Warriorb/Steam_Package_Windows.py\n# [OPTIONAL] Package Linux\n./Tools/Warriorb/Steam_Package_Linux.py\n\n# Upload\n./Tools/Warriorb/Steam_Upload.py\n\n# Sentry crash reporter\n./Tools/Warriorb/Sentry_UploadDif.py --steam\n```\n\n**NOTE: to run all the commands all in one just run**\n```sh\n./Tools/Warriorb/Steam_All_Run.sh\n```\n\n\n## WarriOrb: Prologue\n\n### Expected directory structure\n```sh\n<WarriorbGitRepo> - The path to the Warriorb git repository\n\n# Windows64\n<WarriorbGitRepo>/Packaged/WarriOrbPrologue_Steam_Windows64/\n\n# Linux\n<WarriorbGitRepo>/Packaged/WarriOrbPrologue_Steam_Linux/\n```\n\n\n### Scripts\n\n```sh\n# Package ALL (Windows + Linux)\n./Tools/Warriorb/Demo_Steam_PackageAll.py\n\n# [OPTIONAL] Package Windows\n./Tools/Warriorb/Demo_Steam_PackageWindows.py\n# [OPTIONAL] Package Linux\n./Tools/Warriorb/Demo_Steam_PackageLinux.py\n\n# Upload\n./Tools/Warriorb/Demo_Steam_Upload.py\n\n# Sentry crash reporter\n./Tools/Warriorb/Demo_Sentry_UploadDif.py --steam\n```\n\n**NOTE: to run all the commands all in one just run**\n```sh\n./Tools/Warriorb/Demo_Steam_All_Run.sh\n```\n"
  },
  {
    "path": "Docs/Steam/README.md",
    "content": "# Steam\n\nGuides:\n- https://docs.unrealengine.com/latest/INT/Programming/Online/Steam/\n- https://wiki.unrealengine.com/Steam,_Using_the_Steam_SDK_During_Development\n\n## Disable\n\n### At runtime\n\nYou can disable steam at runtime (in non shipping builds) by using the `-nosteam` argument when running.\n\n### At build time\n\nEdit the key `WARRIORB_WITH_STEAM` inside [`Source/WarriorbBuild.json`](/Source/WarriorbBuild.json) and rebuilt the project.\n\n\n## [Package & Upload](./PackageAndUpload.md)\n\n## [Achievements](./Achievements.md)\n\n## [Local Content Server](./LocalContentServer.md)\n\n## [Config file]((./Config.md))\n"
  },
  {
    "path": "Docs/Windows.md",
    "content": "# Windows\n\n\n## Callbacks\n\n- `OnControllerConnectionChange` - Callback when controllers disconnected / reconnected\n- `OnShutdownAfterError` - Called when an error occurred.\n"
  },
  {
    "path": "LICENSE.txt",
    "content": "MIT License\n\nCopyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\nCopyright (c) Not Yet Team. All Rights Reserved.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "Packaged/Dependencies/Linux/Warriorb.sh",
    "content": "#!/bin/sh\nUE4_TRUE_SCRIPT_NAME=$(echo \\\"$0\\\" | xargs readlink -f)\nUE4_PROJECT_ROOT=$(dirname \"$UE4_TRUE_SCRIPT_NAME\")\nchmod +x \"$UE4_PROJECT_ROOT/Warriorb/Binaries/Linux/Warriorb\"\n\necho \"\"\necho \"$@\"\necho \"\"\n\n# Bug in linux, if this is set the gamepad will not work sometimes\n# Because Steam runtime + UE 4.22 combination\nunset SDL_GAMECONTROLLER_IGNORE_DEVICES_EXCEPT\n\n# printenv > steam.txt\n\n\"$UE4_PROJECT_ROOT/Warriorb/Binaries/Linux/Warriorb\" Warriorb \"$@\"\n\n\n# #!/usr/bin/env bash\n# UE4_TRUE_SCRIPT_NAME=$(echo \\\"$0\\\" | xargs readlink -f)\n# UE4_PROJECT_ROOT=$(dirname \"$UE4_TRUE_SCRIPT_NAME\")\n# chmod +x \"$UE4_PROJECT_ROOT/Warriorb/Binaries/Linux/Warriorb\"\n\n# # OLD: Modified version becaus GA tries to write ga_log.txt but it crashes the editor\n# # New verion tries to fix some bug in UE?\n# pushd \"$UE4_PROJECT_ROOT/Warriorb/Binaries/Linux/\"\n# LC_ALL=C \"./Warriorb\" Warriorb \"$@\"\n# popd\n"
  },
  {
    "path": "Packaged/Dependencies/README.md",
    "content": "# DebugDLLs\n\nhttps://forums.unrealengine.com/development-discussion/c-gameplay-programming/1396585-the-win-10-fall-creators-update-broke-debugging-dmp-files-generated-by-ue4-workaround-here\n"
  },
  {
    "path": "Packaged/README.md",
    "content": "In this directory all the packaged content will be built and this is where steam gets the content to upload\n\n# Directories Names that must exist\n- Windows 64 bits - `Windows64`\n- Windows 32 bits - `Windows32`\n- Linux - `Linux`\n"
  },
  {
    "path": "Plugins/DlgSystem/.editorconfig",
    "content": "# http://EditorConfig.org\n# See Plugin for VS: https://github.com/editorconfig/editorconfig-visualstudio\n# Other editors: http://editorconfig.org/#download\n\n# top-most EditorConfig file\nroot = true\n\n[*]\n# Unix-style newlines with a newline ending every file\nend_of_line = lf\ninsert_final_newline = true\ntrim_trailing_whitespace = true\nmax_line_length = 140\n\n# Tab with 4 spaces.\nindent_style = tab\nindent_size = 4\ntab_width = 4\ncharset = utf-8\n\n# MSBuild\n[*.{csproj,proj,projitems,shproj,fsproj,target,props}]\nindent_style = space\nindent_size = 2\n\n# Bash/Python files\n[*.py]\nindent_style = space\nindent_size = 4\nend_of_line = lf\ncharset = utf-8\n\n"
  },
  {
    "path": "Plugins/DlgSystem/.gitattributes",
    "content": "# Let git use LF in git and automatic line endings in the OS\n* text=auto\n\n# if something breaks again, add -text to see line endings in diff\n*.dlg\tdiff text\n*.ini\ttext\n\n# Declare files that will always have CRLF line endings on checkout.\n*.sln text eol=crlf\n\n#sources\n*.c text\n*.cc text\n*.cxx text\n*.cpp text\n*.c++ text\n*.hpp text\n*.h text\n*.h++ text\n*.hh text\n\n# Compiled Object files\n*.slo binary\n*.lo binary\n*.o binary\n*.obj binary\n\n# Precompiled Headers\n*.gch binary\n*.pch binary\n\n# Compiled Dynamic libraries\n*.so binary\n*.dylib binary\n*.dll binary\n\n# Compiled Static libraries\n*.lai binary\n*.la binary\n*.a binary\n*.lib binary\n\n# Executables\n*.exe binary\n*.out binary\n*.app binary\n"
  },
  {
    "path": "Plugins/DlgSystem/.gitconfig",
    "content": "[core]\n\tsymlinks = true\n\tautocrlf = input\n\teol = lf\n[color \"diff\"]\n\twhitespace = red reverse\n\n"
  },
  {
    "path": "Plugins/DlgSystem/.gitignore",
    "content": "## Inspired from https://github.com/github/gitignore/blob/master/UnrealEngine.gitignore\n# Visual Studio user specific files\n.vs/\nenc_temp_folder/\n\n# Compiled Object files\n*.slo\n*.lo\n*.o\n*.obj\n\n# Precompiled Headers\n*.gch\n*.pch\n*.ipch\n\n# Compiled Dynamic libraries\n*.so\n*.dylib\n*.dll\n\n# Fortran module files\n*.mod\n\n# Compiled Static libraries\n*.lai\n*.la\n*.a\n*.lib\n\n# Executables\n*.exe\n*.out\n*.app\n*.ipa\n\n# These project files can be generated by the engine\n*.xcodeproj\n*.sln\n*.suo\n*.user\n*.opensdf\n*.sdf\n*.VC.db\n*.opendb\n*.vcxproj*\n*.gen.cpp\n*.generated.h\n\n# Precompiled Assets\nSourceArt/**/*.png\nSourceArt/**/*.tga\n\n# Ignore builds, binary, configuration, cache and starter content directories\nBuild/\nBinaries/\nSaved/\nIntermediate/\n\nDerivedDataCache/\nContent/StarterContent/\nContent/ExampleContent/\nContent/TempTree/\n\n# Don't ignore icon files in Build\n!Build/**/*.ico\n\n# Other IDE's stuff and linux/mac\n.codelite/\n.idea/\n.vscode/\n.kdev4/\ncmake-*/\n*.kdev4\n*.workspace\n*.code-workspace\n*.pri\n*.pro\n*CodeCompletionFolders.txt\n*CodeLitePreProcessor.txt\nCMakeLists.txt\nMakefile\ncore\n.gdb_history\nConfig/QuickSave_1.txt\nConfig/QuickSave_0.txt\n*.autosave\n"
  },
  {
    "path": "Plugins/DlgSystem/Config/BaseDlgSystem.ini",
    "content": "[CoreRedirects]\n; v8\n\n; Runtime\n+EnumRedirects=(OldName=\"/Script/DlgSystem.EDlgDialogueTextFormat\", ValueChanges=((\"DlgDialogueNoTextFormat\", \"None\"), (\"DlgDialogueTextFormatDialogue\", \"DialogueDEPRECATED\"), (\"DlgDialogueTextFormatJson\", \"JSON\")) )\n+EnumRedirects=(OldName=\"/Script/DlgSystem.EDlgVoiceDisplayedFields\", ValueChanges=((\"DlgVoiceDisplayedNoVoice\", \"None\"), (\"DlgVoiceDisplayedSoundWave\", \"SoundWave\"), (\"DlgVoiceDisplayedDialogueWave\", \"DialogueWave\"), (\"DlgVoiceDisplayedSoundWaveAndDialogueWave\", \"SoundWaveAndDialogueWave\")) )\n+EnumRedirects=(OldName=\"/Script/DlgSystem.EDlgSpeakerStateVisibility\", ValueChanges=((\"DlgHideAll\", \"HideAll\"), (\"DlgShowOnEdge\", \"ShowOnEdge\"), (\"DlgShowOnNode\", \"ShowOnNode\"), (\"DlgShowOnNodeAndEdge\", \"ShowOnNodeAndEdge\")) )\n+EnumRedirects=(OldName=\"/Script/DlgSystem.EDlgTextInputKeyForNewLine\", ValueChanges=((\"DlgTextInputKeyForNewLineEnter\", \"Enter\"), (\"DlgTextInputKeyForNewLineShiftPlusEnter\", \"ShiftPlusEnter\")) )\n+EnumRedirects=(OldName=\"/Script/DlgSystem.EDlgTextArgumentType\", ValueChanges=((\"DlgTextArgumentDisplayName\", \"DisplayName\"), (\"DlgTextArgumentGender\", \"Gender\"), (\"DlgTextArgumentDialogueInt\", \"DialogueInt\"), (\"DlgTextArgumentClassInt\", \"ClassInt\"), (\"DlgTextArgumentDialogueFloat\", \"DialogueFloat\"), (\"DlgTextArgumentClassFloat\", \"ClassFloat\"), (\"DlgTextArgumentClassText\", \"ClassText\")) )\n+EnumRedirects=(OldName=\"/Script/DlgSystem.EDlgEventType\", ValueChanges=((\"DlgEventEvent\", \"Event\"), (\"DlgEventModifyInt\", \"ModifyInt\"), (\"DlgEventModifyFloat\", \"ModifyFloat\"), (\"DlgEventModifyBool\", \"ModifyBool\"), (\"DlgEventModifyName\", \"ModifyName\"), (\"DlgEventModifyClassIntVariable\", \"ModifyClassIntVariable\"), (\"DlgEventModifyClassFloatVariable\", \"ModifyClassFloatVariable\"), (\"DlgEventModifyClassBoolVariable\", \"ModifyClassBoolVariable\"), (\"DlgEventModifyClassNameVariable\", \"ModifyClassNameVariable\")) )\n+EnumRedirects=(OldName=\"/Script/DlgSystem.EDlgConditionStrength\", ValueChanges=((\"DlgConditionStrengthStrong\", \"Strong\"), (\"DlgConditionStrengthWeak\", \"Weak\")) )\n+EnumRedirects=(OldName=\"/Script/DlgSystem.EDlgCompareType\", NewName=\"/Script/DlgSystem.EDlgCompare\", ValueChanges=((\"DlgCompareToConst\", \"ToConst\"), (\"DlgCompareToVariable\", \"ToVariable\"), (\"DlgCompareToClassVariable\", \"ToClassVariable\")) )\n+EnumRedirects=(OldName=\"/Script/DlgSystem.EDlgConditionType\", ValueChanges=((\"DlgConditionIntCall\", \"IntCall\"), (\"DlgConditionFloatCall\", \"FloatCall\"), (\"DlgConditionBoolCall\", \"BoolCall\"), (\"DlgConditionNameCall\", \"NameCall\"), (\"DlgConditionEventCall\", \"EventCall\"), (\"DlgConditionClassIntVariable\", \"ClassIntVariable\"), (\"DlgConditionClassFloatVariable\", \"FloatVariable\"), (\"DlgConditionClassBoolVariable\", \"ClassBoolVariable\"), (\"DlgConditionClassNameVariable\", \"ClassNameVariable\"), (\"DlgConditionNodeVisited\", \"WasNodeVisited\"), (\"DlgConditionHasSatisfiedChild\", \"HasSatisfiedChild\")) )\n+EnumRedirects=(OldName=\"/Script/DlgSystem.EDlgOperation\", ValueChanges=((\"DlgEqual\", \"Equal\"), (\"DlgNotEqual\", \"NotEqual\"), (\"DlgLess\", \"Less\"), (\"DlgLessOrEqual\", \"LessOrEqual\"), (\"DlgGreater\", \"Greater\"), (\"DlgGreaterOrEqual\", \"GreaterOrEqual\")) )\n+EnumRedirects=(OldName=\"/Script/DlgSystem.EDlgNodeSelectorType\", ValueChanges=((\"DlgNodeSelectorFirst\", \"First\"), (\"DlgNodeSelectorRandom\", \"Random\")) )\n\n; Editor\n+EnumRedirects=(OldName=\"/Script/DlgSystemEditor.EDlgVariableType\", ValueChanges=((\"DlgVariableTypeFloat\", \"Float\"), (\"DlgVariableTypeInt\", \"Int\"), (\"DlgVariableTypeName\", \"Name\"), (\"DlgVariableTypeSpeakerState\", \"SpeakerState\")) )\n+EnumRedirects=(OldName=\"/Script/DlgSystemEditor.EDlgDialogueCallback\", ValueChanges=((\"DlgEvent\", \"Event\"), (\"DlgCondition\", \"Condition\"), (\"DlgFloatValue\", \"FloatValue\"), (\"DlgIntValue\", \"IntValue\"), (\"DlgBoolValue\", \"BoolValue\"), (\"DlgNameValue\", \"NameValue\")) )\n\n\n; v9.1\n\n+ClassRedirects=(OldName=\"/Script/DlgSystem.DlgContextInternal\", NewName=\"/Script/DlgSystem.DlgContext\")\n\n+FunctionRedirects=(OldName=\"/Script/DlgSystem.DlgContext.GetDialogueGuid\", NewName=\"/Script/DlgSystem.DlgContext.GetDialogueGUID\")\n+FunctionRedirects=(OldName=\"/Script/DlgSystem.DlgContext.GetActiveSpeakerState\", NewName=\"/Script/DlgSystem.DlgContext.GetActiveNodeSpeakerState\")\n+FunctionRedirects=(OldName=\"/Script/DlgSystem.DlgContext.GetActiveParticipantIcon\", NewName=\"/Script/DlgSystem.DlgContext.GetActiveNodeParticipantIcon\")\n+FunctionRedirects=(OldName=\"/Script/DlgSystem.DlgContext.GetActiveParticipant\", NewName=\"/Script/DlgSystem.DlgContext.GetActiveNodeParticipant\")\n+FunctionRedirects=(OldName=\"/Script/DlgSystem.DlgContext.GetActiveParticipantName\", NewName=\"/Script/DlgSystem.DlgContext.GetActiveNodeParticipantName\")\n+FunctionRedirects=(OldName=\"/Script/DlgSystem.DlgContext.IsEdgeConnectedToVisitedNode\", NewName=\"/Script/DlgSystem.DlgContext.IsOptionConnectedToVisitedNode\")\n+FunctionRedirects=(OldName=\"/Script/DlgSystem.DlgContext.IsEdgeConnectedToEndNode\", NewName=\"/Script/DlgSystem.DlgContext.IsOptionConnectedToEndNode\")\n+FunctionRedirects=(OldName=\"/Script/DlgSystem.DlgContext.GetParticipantMap\", NewName=\"/Script/DlgSystem.DlgContext.GetParticipantsMap\")\n\n+FunctionRedirects=(OldName=\"/Script/DlgSystem.DlgDialogue.GetDlgName\", NewName=\"/Script/DlgSystem.DlgDialogue.GetDialogueName\")\n+FunctionRedirects=(OldName=\"/Script/DlgSystem.DlgDialogue.GetDlgFName\", NewName=\"/Script/DlgSystem.DlgDialogue.GetDialogueFName\")\n\n+FunctionRedirects=(OldName=\"/Script/DlgSystem.DlgManager.RegisterDialogueModuleConsoleCommands\", NewName=\"/Script/DlgSystem.DlgManager.RegisterDialogueConsoleCommands\")\n+FunctionRedirects=(OldName=\"/Script/DlgSystem.DlgManager.UnRegisterDialogueModuleConsoleCommands\", NewName=\"/Script/DlgSystem.DlgManager.UnregisterDialogueConsoleCommands\")\n+FunctionRedirects=(OldName=\"/Script/DlgSystem.DlgManager.CouldStartDialogue\", NewName=\"/Script/DlgSystem.DlgManager.CanStartDialogue\")\n\n+FunctionRedirects=(OldName=\"/Script/DlgSystem.DlgNode.GetGenericData\", NewName=\"/Script/DlgSystem.DlgNode.GetNodeGenericData\")\n\n+EnumRedirects=(OldName=\"/Script/DlgSystem.EDlgConditionType\", ValueChanges=((\"FloatVariable\", \"ClassFloatVariable\"))\n\n; v10\n\n+PropertyRedirects=(OldName=\"/Script/DlgSystem.DlgDialogue.DlgSpeakerStates\", NewName=\"/Script/DlgSystem.DlgDialogue.AllSpeakerStates\")\n+PropertyRedirects=(OldName=\"/Script/DlgSystem.DlgDialogue.DlgData\", NewName=\"/Script/DlgSystem.DlgDialogue.ParticipantsData\")\n+PropertyRedirects=(OldName=\"/Script/DlgSystem.DlgDialogue.DlgParticipantClasses\", NewName=\"/Script/DlgSystem.DlgDialogue.ParticipantsClasses\")\n+PropertyRedirects=(OldName=\"/Script/DlgSystem.DlgDialogue.DlgVersion\", NewName=\"/Script/DlgSystem.DlgDialogue.Version\")\n+PropertyRedirects=(OldName=\"/Script/DlgSystem.DlgDialogue.DlgName\", NewName=\"/Script/DlgSystem.DlgDialogue.Name\")\n+PropertyRedirects=(OldName=\"/Script/DlgSystem.DlgDialogue.DlgGuid\", NewName=\"/Script/DlgSystem.DlgDialogue.GUID\")\n\n+FunctionRedirects=(OldName=\"/Script/DlgSystem.DlgDialogue.GetParticipantData\", NewName=\"/Script/DlgSystem.DlgDialogue.GetParticipantsData\")\n+FunctionRedirects=(OldName=\"/Script/DlgSystem.DlgDialogue.IsParticipant\", NewName=\"/Script/DlgSystem.DlgDialogue.HasParticipant\")\n\n\n; v11\n\n+FunctionRedirects=(OldName=\"/Script/DlgSystem.DlgDialogue.GetDlgGuid\", NewName=\"/Script/DlgSystem.DlgDialogue.GetGUID\")\n+FunctionRedirects=(OldName=\"/Script/DlgSystem.DlgDialogue.GetDialogueGUID\", NewName=\"/Script/DlgSystem.DlgDialogue.GetGUID\")\n+FunctionRedirects=(OldName=\"/Script/DlgSystem.DlgDialogue.GetMutableNode\", NewName=\"/Script/DlgSystem.DlgDialogue.GetMutableNodeFromIndex\")\n+FunctionRedirects=(OldName=\"/Script/DlgSystem.DlgDialogue.GetSpeakerStates\", NewName=\"/Script/DlgSystem.DlgDialogue.GetAllSpeakerStates\")\n+FunctionRedirects=(OldName=\"/Script/DlgSystem.DlgDialogue.GetAllSpeakerState\", NewName=\"/Script/DlgSystem.DlgDialogue.GetAllSpeakerStates\")\n+FunctionRedirects=(OldName=\"/Script/DlgSystem.DlgDialogue.GetParticipantNum\", NewName=\"/Script/DlgSystem.DlgDialogue.GetParticipantsNum\")\n\n+FunctionRedirects=(OldName=\"/Script/DlgSystem.DlgContext.GetMutableNode\", NewName=\"/Script/DlgSystem.DlgContext.GetMutableNodeFromIndex\")\n+FunctionRedirects=(OldName=\"/Script/DlgSystem.DlgContext.WasNodeVisitedInThisContext\", NewName=\"/Script/DlgSystem.DlgContext.WasNodeIndexVisitedInThisContext\")\n+FunctionRedirects=(OldName=\"/Script/DlgSystem.DlgContext.GetOptionNum\", NewName=\"/Script/DlgSystem.DlgContext.GetOptionsNum\")\n+FunctionRedirects=(OldName=\"/Script/DlgSystem.DlgContext.GetAllOptionNum\", NewName=\"/Script/DlgSystem.DlgContext.GetAllOptionsNum\")\n\n+FunctionRedirects=(OldName=\"/Script/DlgSystem.DlgManager.ResumeDialogue\", NewName=\"/Script/DlgSystem.DlgManager.ResumeDialogueFromNodeIndex\")\n+FunctionRedirects=(OldName=\"/Script/DlgSystem.DlgManager.SetPersistentWorldContextObject\", NewName=\"/Script/DlgSystem.DlgManager.SetDialoguePersistentWorldContextObject\")\n+FunctionRedirects=(OldName=\"/Script/DlgSystem.DlgManager.ClearPersistentWorldContextObject\", NewName=\"/Script/DlgSystem.DlgManager.ClearDialoguePersistentWorldContextObject\")\n"
  },
  {
    "path": "Plugins/DlgSystem/Config/DefaultDlgSystem.ini",
    "content": "[CoreRedirects]\n; v8\n\n; Runtime\n+EnumRedirects=(OldName=\"/Script/DlgSystem.EDlgDialogueTextFormat\", ValueChanges=((\"DlgDialogueNoTextFormat\", \"None\"), (\"DlgDialogueTextFormatDialogue\", \"DialogueDEPRECATED\"), (\"DlgDialogueTextFormatJson\", \"JSON\")) )\n+EnumRedirects=(OldName=\"/Script/DlgSystem.EDlgVoiceDisplayedFields\", ValueChanges=((\"DlgVoiceDisplayedNoVoice\", \"None\"), (\"DlgVoiceDisplayedSoundWave\", \"SoundWave\"), (\"DlgVoiceDisplayedDialogueWave\", \"DialogueWave\"), (\"DlgVoiceDisplayedSoundWaveAndDialogueWave\", \"SoundWaveAndDialogueWave\")) )\n+EnumRedirects=(OldName=\"/Script/DlgSystem.EDlgSpeakerStateVisibility\", ValueChanges=((\"DlgHideAll\", \"HideAll\"), (\"DlgShowOnEdge\", \"ShowOnEdge\"), (\"DlgShowOnNode\", \"ShowOnNode\"), (\"DlgShowOnNodeAndEdge\", \"ShowOnNodeAndEdge\")) )\n+EnumRedirects=(OldName=\"/Script/DlgSystem.EDlgTextInputKeyForNewLine\", ValueChanges=((\"DlgTextInputKeyForNewLineEnter\", \"Enter\"), (\"DlgTextInputKeyForNewLineShiftPlusEnter\", \"ShiftPlusEnter\")) )\n+EnumRedirects=(OldName=\"/Script/DlgSystem.EDlgTextArgumentType\", ValueChanges=((\"DlgTextArgumentDisplayName\", \"DisplayName\"), (\"DlgTextArgumentGender\", \"Gender\"), (\"DlgTextArgumentDialogueInt\", \"DialogueInt\"), (\"DlgTextArgumentClassInt\", \"ClassInt\"), (\"DlgTextArgumentDialogueFloat\", \"DialogueFloat\"), (\"DlgTextArgumentClassFloat\", \"ClassFloat\"), (\"DlgTextArgumentClassText\", \"ClassText\")) )\n+EnumRedirects=(OldName=\"/Script/DlgSystem.EDlgEventType\", ValueChanges=((\"DlgEventEvent\", \"Event\"), (\"DlgEventModifyInt\", \"ModifyInt\"), (\"DlgEventModifyFloat\", \"ModifyFloat\"), (\"DlgEventModifyBool\", \"ModifyBool\"), (\"DlgEventModifyName\", \"ModifyName\"), (\"DlgEventModifyClassIntVariable\", \"ModifyClassIntVariable\"), (\"DlgEventModifyClassFloatVariable\", \"ModifyClassFloatVariable\"), (\"DlgEventModifyClassBoolVariable\", \"ModifyClassBoolVariable\"), (\"DlgEventModifyClassNameVariable\", \"ModifyClassNameVariable\")) )\n+EnumRedirects=(OldName=\"/Script/DlgSystem.EDlgConditionStrength\", ValueChanges=((\"DlgConditionStrengthStrong\", \"Strong\"), (\"DlgConditionStrengthWeak\", \"Weak\")) )\n+EnumRedirects=(OldName=\"/Script/DlgSystem.EDlgCompareType\", NewName=\"/Script/DlgSystem.EDlgCompare\", ValueChanges=((\"DlgCompareToConst\", \"ToConst\"), (\"DlgCompareToVariable\", \"ToVariable\"), (\"DlgCompareToClassVariable\", \"ToClassVariable\")) )\n+EnumRedirects=(OldName=\"/Script/DlgSystem.EDlgConditionType\", ValueChanges=((\"DlgConditionIntCall\", \"IntCall\"), (\"DlgConditionFloatCall\", \"FloatCall\"), (\"DlgConditionBoolCall\", \"BoolCall\"), (\"DlgConditionNameCall\", \"NameCall\"), (\"DlgConditionEventCall\", \"EventCall\"), (\"DlgConditionClassIntVariable\", \"ClassIntVariable\"), (\"DlgConditionClassFloatVariable\", \"FloatVariable\"), (\"DlgConditionClassBoolVariable\", \"ClassBoolVariable\"), (\"DlgConditionClassNameVariable\", \"ClassNameVariable\"), (\"DlgConditionNodeVisited\", \"WasNodeVisited\"), (\"DlgConditionHasSatisfiedChild\", \"HasSatisfiedChild\")) )\n+EnumRedirects=(OldName=\"/Script/DlgSystem.EDlgOperation\", ValueChanges=((\"DlgEqual\", \"Equal\"), (\"DlgNotEqual\", \"NotEqual\"), (\"DlgLess\", \"Less\"), (\"DlgLessOrEqual\", \"LessOrEqual\"), (\"DlgGreater\", \"Greater\"), (\"DlgGreaterOrEqual\", \"GreaterOrEqual\")) )\n+EnumRedirects=(OldName=\"/Script/DlgSystem.EDlgNodeSelectorType\", ValueChanges=((\"DlgNodeSelectorFirst\", \"First\"), (\"DlgNodeSelectorRandom\", \"Random\")) )\n\n; Editor\n+EnumRedirects=(OldName=\"/Script/DlgSystemEditor.EDlgVariableType\", ValueChanges=((\"DlgVariableTypeFloat\", \"Float\"), (\"DlgVariableTypeInt\", \"Int\"), (\"DlgVariableTypeName\", \"Name\"), (\"DlgVariableTypeSpeakerState\", \"SpeakerState\")) )\n+EnumRedirects=(OldName=\"/Script/DlgSystemEditor.EDlgDialogueCallback\", ValueChanges=((\"DlgEvent\", \"Event\"), (\"DlgCondition\", \"Condition\"), (\"DlgFloatValue\", \"FloatValue\"), (\"DlgIntValue\", \"IntValue\"), (\"DlgBoolValue\", \"BoolValue\"), (\"DlgNameValue\", \"NameValue\")) )\n\n\n; v9.1\n\n+ClassRedirects=(OldName=\"/Script/DlgSystem.DlgContextInternal\", NewName=\"/Script/DlgSystem.DlgContext\")\n\n+FunctionRedirects=(OldName=\"/Script/DlgSystem.DlgContext.GetDialogueGuid\", NewName=\"/Script/DlgSystem.DlgContext.GetDialogueGUID\")\n+FunctionRedirects=(OldName=\"/Script/DlgSystem.DlgContext.GetActiveSpeakerState\", NewName=\"/Script/DlgSystem.DlgContext.GetActiveNodeSpeakerState\")\n+FunctionRedirects=(OldName=\"/Script/DlgSystem.DlgContext.GetActiveParticipantIcon\", NewName=\"/Script/DlgSystem.DlgContext.GetActiveNodeParticipantIcon\")\n+FunctionRedirects=(OldName=\"/Script/DlgSystem.DlgContext.GetActiveParticipant\", NewName=\"/Script/DlgSystem.DlgContext.GetActiveNodeParticipant\")\n+FunctionRedirects=(OldName=\"/Script/DlgSystem.DlgContext.GetActiveParticipantName\", NewName=\"/Script/DlgSystem.DlgContext.GetActiveNodeParticipantName\")\n+FunctionRedirects=(OldName=\"/Script/DlgSystem.DlgContext.IsEdgeConnectedToVisitedNode\", NewName=\"/Script/DlgSystem.DlgContext.IsOptionConnectedToVisitedNode\")\n+FunctionRedirects=(OldName=\"/Script/DlgSystem.DlgContext.IsEdgeConnectedToEndNode\", NewName=\"/Script/DlgSystem.DlgContext.IsOptionConnectedToEndNode\")\n+FunctionRedirects=(OldName=\"/Script/DlgSystem.DlgContext.GetParticipantMap\", NewName=\"/Script/DlgSystem.DlgContext.GetParticipantsMap\")\n\n+FunctionRedirects=(OldName=\"/Script/DlgSystem.DlgDialogue.GetDlgName\", NewName=\"/Script/DlgSystem.DlgDialogue.GetDialogueName\")\n+FunctionRedirects=(OldName=\"/Script/DlgSystem.DlgDialogue.GetDlgFName\", NewName=\"/Script/DlgSystem.DlgDialogue.GetDialogueFName\")\n\n+FunctionRedirects=(OldName=\"/Script/DlgSystem.DlgManager.RegisterDialogueModuleConsoleCommands\", NewName=\"/Script/DlgSystem.DlgManager.RegisterDialogueConsoleCommands\")\n+FunctionRedirects=(OldName=\"/Script/DlgSystem.DlgManager.UnRegisterDialogueModuleConsoleCommands\", NewName=\"/Script/DlgSystem.DlgManager.UnregisterDialogueConsoleCommands\")\n+FunctionRedirects=(OldName=\"/Script/DlgSystem.DlgManager.CouldStartDialogue\", NewName=\"/Script/DlgSystem.DlgManager.CanStartDialogue\")\n\n+FunctionRedirects=(OldName=\"/Script/DlgSystem.DlgNode.GetGenericData\", NewName=\"/Script/DlgSystem.DlgNode.GetNodeGenericData\")\n\n+EnumRedirects=(OldName=\"/Script/DlgSystem.EDlgConditionType\", ValueChanges=((\"FloatVariable\", \"ClassFloatVariable\"))\n\n; v10\n\n+PropertyRedirects=(OldName=\"/Script/DlgSystem.DlgDialogue.DlgSpeakerStates\", NewName=\"/Script/DlgSystem.DlgDialogue.AllSpeakerStates\")\n+PropertyRedirects=(OldName=\"/Script/DlgSystem.DlgDialogue.DlgData\", NewName=\"/Script/DlgSystem.DlgDialogue.ParticipantsData\")\n+PropertyRedirects=(OldName=\"/Script/DlgSystem.DlgDialogue.DlgParticipantClasses\", NewName=\"/Script/DlgSystem.DlgDialogue.ParticipantsClasses\")\n+PropertyRedirects=(OldName=\"/Script/DlgSystem.DlgDialogue.DlgVersion\", NewName=\"/Script/DlgSystem.DlgDialogue.Version\")\n+PropertyRedirects=(OldName=\"/Script/DlgSystem.DlgDialogue.DlgName\", NewName=\"/Script/DlgSystem.DlgDialogue.Name\")\n+PropertyRedirects=(OldName=\"/Script/DlgSystem.DlgDialogue.DlgGuid\", NewName=\"/Script/DlgSystem.DlgDialogue.GUID\")\n\n+FunctionRedirects=(OldName=\"/Script/DlgSystem.DlgDialogue.GetParticipantData\", NewName=\"/Script/DlgSystem.DlgDialogue.GetParticipantsData\")\n+FunctionRedirects=(OldName=\"/Script/DlgSystem.DlgDialogue.IsParticipant\", NewName=\"/Script/DlgSystem.DlgDialogue.HasParticipant\")\n\n\n; v11\n\n+FunctionRedirects=(OldName=\"/Script/DlgSystem.DlgDialogue.GetDlgGuid\", NewName=\"/Script/DlgSystem.DlgDialogue.GetGUID\")\n+FunctionRedirects=(OldName=\"/Script/DlgSystem.DlgDialogue.GetDialogueGUID\", NewName=\"/Script/DlgSystem.DlgDialogue.GetGUID\")\n+FunctionRedirects=(OldName=\"/Script/DlgSystem.DlgDialogue.GetMutableNode\", NewName=\"/Script/DlgSystem.DlgDialogue.GetMutableNodeFromIndex\")\n+FunctionRedirects=(OldName=\"/Script/DlgSystem.DlgDialogue.GetSpeakerStates\", NewName=\"/Script/DlgSystem.DlgDialogue.GetAllSpeakerStates\")\n+FunctionRedirects=(OldName=\"/Script/DlgSystem.DlgDialogue.GetAllSpeakerState\", NewName=\"/Script/DlgSystem.DlgDialogue.GetAllSpeakerStates\")\n+FunctionRedirects=(OldName=\"/Script/DlgSystem.DlgDialogue.GetParticipantNum\", NewName=\"/Script/DlgSystem.DlgDialogue.GetParticipantsNum\")\n\n+FunctionRedirects=(OldName=\"/Script/DlgSystem.DlgContext.GetMutableNode\", NewName=\"/Script/DlgSystem.DlgContext.GetMutableNodeFromIndex\")\n+FunctionRedirects=(OldName=\"/Script/DlgSystem.DlgContext.WasNodeVisitedInThisContext\", NewName=\"/Script/DlgSystem.DlgContext.WasNodeIndexVisitedInThisContext\")\n+FunctionRedirects=(OldName=\"/Script/DlgSystem.DlgContext.GetOptionNum\", NewName=\"/Script/DlgSystem.DlgContext.GetOptionsNum\")\n+FunctionRedirects=(OldName=\"/Script/DlgSystem.DlgContext.GetAllOptionNum\", NewName=\"/Script/DlgSystem.DlgContext.GetAllOptionsNum\")\n\n+FunctionRedirects=(OldName=\"/Script/DlgSystem.DlgManager.ResumeDialogue\", NewName=\"/Script/DlgSystem.DlgManager.ResumeDialogueFromNodeIndex\")\n+FunctionRedirects=(OldName=\"/Script/DlgSystem.DlgManager.SetPersistentWorldContextObject\", NewName=\"/Script/DlgSystem.DlgManager.SetDialoguePersistentWorldContextObject\")\n+FunctionRedirects=(OldName=\"/Script/DlgSystem.DlgManager.ClearPersistentWorldContextObject\", NewName=\"/Script/DlgSystem.DlgManager.ClearDialoguePersistentWorldContextObject\")\n"
  },
  {
    "path": "Plugins/DlgSystem/Config/FilterPlugin.ini",
    "content": "[FilterPlugin]\n; This section lists additional files which will be packaged along with your plugin. Paths should be listed relative to the root plugin directory, and\n; may include \"...\", \"*\", and \"?\" wildcards to match directories, files, and individual characters respectively.\n;\n/Docs/*.md\n/Tools/*.py\n/Config/\n"
  },
  {
    "path": "Plugins/DlgSystem/Content/Icons/LICENSE.txt",
    "content": "DlgDialogue_64x.png | DlgDialogue_16x.png - http://game-icons.net/lorc/originals/conversation.html\nDlgNodeData_64x.png | DlgNodeData_16x.png - https://thenounproject.com/search/?q=data&i=2556692\nEvent_96x.png | DlgEventCustom_64x.png | DlgEventCustom_16x.png - https://thenounproject.com/search/?q=event&i=1757908\nCondition_96x.png | DlgConditionCustom_64x.png | DlgConditionCustom_16x.png - https://thenounproject.com/term/correct-answer/152639/\nDlgTextArgumentCustom_64x.png | DlgTextArgumentCustom_16x.png - https://thenounproject.com/search/?q=text&i=646000\nQuestionMark_16x.png - http://game-icons.net/lorc/originals/uncertainty.html\nSpeaker_96x.png - http://game-icons.net/delapouite/gui/speaker.html\nDialogue_ShowPrimarySecondaryEdges_40x.png - https://thenounproject.com/ArtZ91/collection/strategy/?i=152647\nDiscord_96x.png - https://discord.com/new/branding\nNotYet_96x.png | NotYet_128x_64x.png - https://www.warriorb.com/presskit/warriorb/\nForum_96x.png - https://thenounproject.com/search/?q=forum&i=1871927\nMarketplace_96x.png - https://thenounproject.com/search/?q=marketplace&i=1257504\nWiki_96x.png - https://thenounproject.com/search/?q=book&i=2044267\n"
  },
  {
    "path": "Plugins/DlgSystem/DlgSystem.uplugin",
    "content": "{\n\t\"FileVersion\": 3,\n\t\"Version\": 12,\n\t\"VersionName\": \"12.1\",\n\t\"EngineVersion\" : \"4.22.0\",\n\t\"FriendlyName\": \"Not Yet: Dialogue System\",\n\t\"Description\": \"Dialogue system (with text based dialogues) and nice Editor for editing dialogues\",\n\t\"Category\": \"Misc\",\n\t\"CreatedBy\": \"Not Yet\",\n\t\"CreatedByURL\": \"https://bit.ly/NYMarketplaceEditor\",\n\t\"DocsURL\": \"https://bit.ly/DlgWikiEditor\",\n\t\"MarketplaceURL\": \"com.epicgames.launcher://ue/marketplace/content/6d0255a60be340dfa1c556503cc57eb3\",\n\t\"SupportURL\": \"https://bit.ly/DlgSourceEditor\",\n\t\"CanContainContent\": true,\n\t\"IsBetaVersion\": false,\n\t\"Installed\": false,\n\t\"EnabledByDefault\": true,\n\t\"Modules\": [\n\t\t{\n\t\t\t\"Name\": \"DlgSystem\",\n\t\t\t\"Type\": \"Runtime\",\n\t\t\t\"LoadingPhase\": \"PreDefault\",\n\t\t\t\"WhitelistPlatforms\":\n\t\t\t[\n\t\t\t\t\"Win64\",\n\t\t\t\t\"Win32\",\n\t\t\t\t\"Linux\",\n\t\t\t\t\"LinuxAArch64\",\n\t\t\t\t\"Mac\",\n\t\t\t\t\"Android\",\n\t\t\t\t\"IOS\",\n\t\t\t\t\"TVOS\",\n\t\t\t\t\"HTML5\",\n\t\t\t\t\"XboxOne\",\n\t\t\t\t\"Switch\",\n\t\t\t\t\"PS4\",\n\t\t\t\t\"HoloLens\",\n\t\t\t\t\"Lumin\"\n\t\t\t]\n\t\t},\n\t\t{\n\t\t\t\"Name\": \"DlgSystemEditor\",\n\t\t\t\"Type\": \"Developer\",\n\t\t\t\"LoadingPhase\": \"PreDefault\",\n\t\t\t\"WhitelistPlatforms\": [\"Win64\", \"Win32\", \"Linux\", \"Mac\"]\n\t\t}\n\t]\n}\n"
  },
  {
    "path": "Plugins/DlgSystem/Docs/CHANGELOG.md",
    "content": "\n# v12.1\n**Date:** October 13, 2020\n\n- **Moved** loading all dialogues logic into search manager init, but only after the content browser loads all the assets. This basically moves the loading to the editor so that it seems the plugin is not at fault for the long loading times.\n- **Fixed** `CanStartDialogue` so that it matches the enter logic of `StartDialogue`\n\n# V12\n**Date:** September 30, 2020\n\n- **Fix** crash when opening the Help Menu for UE 4.24 and 4.25\n\n### Blueprint\n\n- When **creating a new Blueprint** of type **Custom Events/Conditions/Text Argument** the overridden function/event is automatically created for you and the blueprint opens there.\n- When **creating a new Blueprint** of type **Node Data** add a comment to the graph saying you need to add variables to see them in the Dialogue Editor, when using the Node Data\n\n### Dialogue Editor\n- **Add option** so that the **participant classes are auto set** to default to the first participant class that matches the participant Name\n  - This only works if there is only one participant class of that Participant Name and Blueprint Classes take priority over Native Classes\n- **Add details panel buttons** for \"Browse to Asset on Content Browser\" and \"Open Asset\" for the **Custom Events/Conditions/Text Argument or Node Data**\n- **Nodes created** from another node will default to having the Participant Name the same as the Parent\n- **Add** “Browse Participant in Content Browser” and “Open Participant Blueprint\" for events and conditions when the participant is involved so that you can easier go the Participant.\n  - This only works if the participant class is set in the particular Dialogue.\n\n### Dialogue Content Browser\n- **Add** support for Custom Events\n\n### Find in Dialogue\n- **Add the following search filters**:\n  - Node GUIDs\n  - Custom Object Names path (NOT the contents of the fields)\n- **Add** the context Index for Events and Conditions so you know which array index it is from\n\n### Content Browser\n- **Allow to create** **Custom Events/Conditions/Text Argument or Node Data** from the Dialogue Menu (the same where you create the Dialogue Asset)\n- **Move**  Dialogues filters to the content browser backend this way you can combine them with other filter\n  - Only the Dialogue Participants Filter remains in the frontend because there is not sane way to implement it in the backend\n\n- **Add** class and thumbnail icons for all custom classes (event, condition, text argument and node data)\n\n### Dialogue\n- Dialogue Participants Data now gathers data about all custom events/conditions/text arguments\n- Increased Dialogue Version number to `AddCustomObjectsToParticipantsData`\n\n\n# v11.1\n**Date:** September 7, 2020\n\n- **Important Bug Fixed** - Fix crash on compile (opened the dialogue asset or packaged the project) for some dialogues that have edges with the `WasNodeVisited` or `HasSatisfiedChild` Condition.\n\n- **Set** namespace and key for default edge texts for \"Finish\" and \"Next\"\n- **Add** the follow new methods to the **Dialogue Context**:\n  - `IsValidOptionIndex`\n  - `IsValidAllOptionIndex`\n  - `GetActiveNodeParticipantDisplayName`\n\n# v11\n**Date:** August 29, 2020\n\n## Important Changes\n\n**Added GUIDs to Nodes**, this fixes [issue #30](https://gitlab.com/NotYetGames/DlgSystem/-/issues/30)\n\nThis is useful because node indices changes if you move nodes around, GUIDs are immutable, so it is\nsafer to use for game saves\n\nAdd the following new methods to the Dialogue:\n- `IsValidNodeGUID`\n- `GetGUIDForNodeIndex`\n- `GetNodeIndexForGUID`\n- `GetNode`\n- `GetNodeFromGUID`\n\nAdd the follow new methods to the Dialogue Context:\n- `GetActiveNodeGUID`\n- `IsValidNodeGUID`\n- `GetGUIDForNodeIndex`\n- `GetNodeIndexForGUID`\n- `GetVisitedNodeGUIDs`\n- `GetNodeFromGUID`\n- `WasNodeIndexVisitedInThisContext` (Renamed from `WasNodeVisitedInThisContext`)\n- `WasNodeGUIDVisitedInThisContext`\n- `StartFromNodeIndex`\n- `StartFromNodeGUID`\n- `StartFromNode`\n- `ResumeDialogueFromNodeIndex` (Renamed from `ResumeDialogue`)\n- `ResumeDialogueFromNodeGUID`\n\n\n## Other Changes\n\n- **Renamed** Dialogue Browser \"Variables\" to \"Dialogue Values\" so that is consistent with the rest of the plugin\n- **Add** better tooltips documentation\n- **Fix** Names for `IsObjectA<CustomStuff>` functions in the Blueprint Editor and **Add**  `IsObjectANodeData`\n- **Fix** the **Virtual Parent Node** first satisfied child to fire its Enter Events if `bVirtualParentFireDirectChildEnterEvents = true` (by default)\n- **Fix** the **Virtual Parent Node** to work with all other nodes types as a direct child (even tho this does not make sense in most cases the virtual parent nodes are usually just meant to be used for loops).\n- **Improvement** - The direct child of the **Virtual Parent Node** is always marked as visited on the parent node OnEnter\n- **Hide** the `bCheckChildrenOnEvaluation` on the **End Node** because it can't have any children\n\n- **Removed** deprecated functions, if you used them in your C++ code you need to use the new versions, otherwise the redirect is done for you in Blueprints automatically. The following functions/properties were renamed in favour of other name:\n\t- `GetAllSpeakerState ` -> `GetAllSpeakerStates `\n\t- `SetPersistentWorldContextObject ` -> `SetDialoguePersistentWorldContextObject`\n\t- `ClearPersistentWorldContextObject ` -> `ClearDialoguePersistentWorldContextObject`\n\t- `GetParticipantNum ` -> `GetParticipantsNum`\n\t- `GetOptionNum ` -> `GetOptionsNum`\n\t- `GetAllOptionNum ` -> `GetAllOptionsNum`\n\n- **Deprecated** some functions inside the **Dialogue Context** so that the names correspond to the rest\n  of the functions:\n  - `ChooseChild` in favour of `ChooseOption`\n  - `ChooseChildBasedOnAllOptionIndex` in favour of `ChooseOptionBasedOnAllOptionIndex`\n  - `ReevaluateChildren` in favour of `ReevaluateOptions`\n\n- **Add** example blueprint and struct data for dialogue variable nodes inside the Plugin\n- **Allow** convert speech nodes to speech sequence from right click on a speech node\n- **Change** Participant Interface methods Category to be `Dialogue|Participant`\n- **Multiplayer** changes:\n  - Added the following methods to the `UDlgContext`: `ChooseSpeechSequenceOptionFromReplicated`, `GetActiveNodeAsSpeechSequence`\n  - Added following methods to the `UDlgNode_SpeechSequence`: `OptionSelectedFromReplicated`, `GetSpeechSequenceIndex`\n\n- **Add** `Jump to Node` button for Node Indices inside Conditions.\n- **Renamed** Dialogue Browser Class Integers/Floats/etc to be just Integers/Floats/etc without the class prefix.\n\n# v10\n**Date:** July 15, 2020\n\n- **Network replicate** the Dialogue Context (specifically the Dialogue and Participants)\n- **Remove** `DlgText` format (the files with the `.dlg` file extension) from being selectable in the UI Dialogue Settings.\nYou can still set it manually in the config but this is not recommended as this format is DEPRECATED and is going to be removed\nas an export method in the next version\n- **Fixed** `UDlgContext::CanBeStarted` and `UDlgManager::CanStartDialogue` so that it does not always return false\n  - `UDlgContext::CanBeStarted` is now a static function\n- **Make** the Node **Children** Array to be view only (read only) and set it as settable option inside the settings (show by default)\n- **Add** to whitelist `Linux Arm 64, Mac, Android, IOS, TVOS, HTML5, XboxOne, Switch, PS4, HoloLens, Lumin`. For most of these platforms we can't build ourselves but the runtime module should be platform agnostic anyways.\n- **Add** The Dialogue Context as the first argument to `UDlgConditionCustom::IsConditionMet`. Only C++ users will have to add it manually in  their code.\n- **Change** Plugin category to be `Misc`\n- **Add** better tooltips to events/conditions/text arguments, it actually tells you what method it calls and where it calls it (dialogue interface or class of the participant).\n- **Add** Custom Text Argument.\n  - User Defined Text Argument, calls GetText on the custom text argument object.\n    1. Create a new Blueprint derived from `DlgTextArgumentCustom` (or `DlgTextArgumentCustomHideCategories`)\n    2. Override GetText\n- **Move** All the Dialogue Filters into the same category in the Content Browser\n- **Add** New Content Browse Filters for Custom Events, Conditions and Text Argument\n- **Add** External Links to Not Yet (discord, plugins, forums, marketplace) inside the Help Menu and inside the Toolbar in the Dialogue Editor (can be hidden from the Dialogue Settings)\n- **Move** The Dialogue Data Display to the proper Category under the Tools Menu\n\n- **Removed** deprecated functions, if you used them in your C++ code you need to use the new versions, otherwise the redirect is done for you in Blueprints automatically. The following functions/properties were renamed in favour of other name:\n\t- `DlgSpeakerStates` -> `AllSpeakerStates`\n\t- `DlgData` -> `ParticipantsData`\n\t- `DlgParticipantClasses` -> `ParticipantsClasses`\n\t- `DlgVersion` -> `Version`\n\t- `DlgName` -> `Name`\n\t- `DlgGuid` -> `GUID`\n\t- `GetSpeakerStates` -> `GetAllSpeakerStates`\n\t- `GetParticipantData` -> `GetParticipantsData`\n\t- `IsParticipant` -> `HasParticipant`\n\n\n# v9.1\n**Date:** June 23, 2020\n\n## Important Bug Fixes\n\n- **Fixed** Custom Condition when set on edges in packaged build. **TO FIX THEM** in your project you have to reset them on all edges where they are used.\n\n- **Fixed** Edges not showing sometimes when creating a new node. See commit [671db137](https://gitlab.com/NotYetGames/DlgSystem/-/commit/671db137dd8190127f4c885f8fb795368ba56810) for more details\n\n## Other Changes\n\n- **Improved** error messages context and text so that it is easier now to know from where the error comes.\n\n- **Improve** fixed some false positive warning messages when using condition types that did not require a participant\n\n- **Improvement** Make everything more blueprint friendly, everything that is dialogue data related should be read accessible from Blueprints\n\n- **Removed** deprecated functions, if you used them in your C++ code you need to use the new versions, otherwise the redirect is done for you in Blueprints automatically. The following functions were renamed in favour of other name:\n\t- `GetDialogueGuid` -> `GetDialogueGUID`\n\t- `GetActiveSpeakerState` -> `GetActiveNodeSpeakerState`\n\t- `GetActiveParticipantIcon` -> `GetActiveNodeParticipantIcon`\n\t- `GetActiveParticipant` -> `GetActiveNodeParticipant`\n\t- `GetActiveParticipantName` -> `GetActiveNodeParticipantName`\n\t- `GetDlgName` -> `GetDialogueName`\n\t- `GetDlgFName` -> `GetDialogueFName`\n\t- `GetDlgGuid` -> `GetDialogueGUID`\n\t- `RegisterDialogueModuleConsoleCommands` -> `RegisterDialogueConsoleCommands`\n\t- `UnRegisterDialogueModuleConsoleCommands` -> `UnregisterDialogueConsoleCommands`\n\t- `GetGenericData` -> `GetNodeGenericData`\n\t- `IsEdgeConnectedToVisitedNode` -> `IsOptionConnectedToVisitedNode`\n\t- `IsEdgeConnectedToEndNode` -> `IsOptionConnectedToEndNode`\n\t- `CouldStartDialogue` -> `CanStartDialogue`\n\t- `GetParticipantMap` -> `GetParticipantsMap`\n\n# v9\n**Date:** May 3, 2020\n\n## Important breaking change\n\n- **Modified**  `IDlgDialogueParticipant` interface functions signature\n\t- Removed `const FName&` in favour of `FName` from all methods\n\t- Added `UDlgContext` as an argument to `CheckCondition` and `OnDialogueEvent`. This was done because if you start a Dialogue where the start (root) node has an enter event and in that enter event you want to get the current dialogue context you can't. Because the dialogue context returns after the start dialogue is called.\n\n- **Renamed** `UDlgReflectionHelper` to `FNYReflectionHelper`\n\n## Other Changes\n\n- **Deprecated** `RegisterDialogueModuleConsoleCommands` and `UnRegisterDialogueModuleConsoleCommands`, you should use `RegisterDialogueConsoleCommands` and `UnregisterDialogueConsoleCommands` instead\n\n- **Add** Custom Events and Conditions\n\t- Custom Event - Create a new blueprint with parent class `UDlgEventCustom` or `UDlgEventCustomHideCategories` (This is the same as UDlgEventCustom but it does NOT show the categories)\n\t- Custom Condition - Create a new blueprint with parent class `UDlgConditionCustom` or `UDlgConditionCustomHideCategories` ( This is the same as UDlgConditionCustom but it does NOT show the categories)\n\n- **Add** setting option `bRegisterDialogueConsoleCommandsAutomatically` (default true) to automatically register the dialogue console commands on Begin Play\n\n- **Improve** Error message on start dialogue when you give it a Blueprint Class instead of a Blueprint Instance\n\n- **Improve** The Sound wave is now a `USoundBase` instead of a `USoundWave` to include more sound objects like cues.\n  - **Added** `GetActiveNodeVoiceSoundBase` to the Dialogue Context. `GetActiveNodeVoiceSoundWave` just calls the SoundBase getter and casts to a `USoundWave`\n\n- **Improvement** All getters of `UDlgNode` are blueprint accessible\n\n- **Improvement** Reflection code is now engine version independent (so that it supports 4.25 more nicely)\n\n- **Improvement** The Dialogue system gets the World from the game automatically (see `UDlgManager::GetDialogueWorld`), if you want to or need to set the  world manually, call `UDlgManager::SetPersistentWorldContextObject`\n\n- **Fix** Null pointer check for LoadedWorld\n- **Fix** Blueprint Nativization for 4.24\n\n# v8.0.2\n**Date:** February 1, 2020\n\n- **Fix** Linux Editor Compile\n\n- **Add** `HasDialogueEnded()` function to the Dialogue Context\n\n- **Add** `StartDialogueWithDefaultParticipants()` helper function to the Dialogue Manager\n```cpp\n\t/**\n\t * Starts a Dialogue with the provided Dialogue\n\t * The function checks all the objects in the world to gather the participants\n\t * This method can fail in the following situations:\n\t *  - The Dialogue has a Participant which does not exist in the World\n\t *\t- Multiple Objects are using the same Participant Name in the World\n\t *\n\t * @returns The dialogue context object or nullptr if something went wrong\n\t *\n\t*/\n\tUFUNCTION(BlueprintCallable, Category = \"Dialogue|Launch\", meta = (WorldContext = \"WorldContextObject\"))\n\tstatic UDlgContext* StartDialogueWithDefaultParticipants(UObject* WorldContextObject, UDlgDialogue* Dialogue);\n```\n\n# v8.0.1\n\nFixed marketplace version of the plugin not handling renamed redirects properly.\n\n# v8\n**Date:** December 15, 2019\n\n## Important breaking change\n\nMoved the config of the `DlgSystemSettings` from `DefaultEditorPerProjectUserSettings.ini` to the `DefaultEngine.ini`\n\n**YOU NEED TO MOVE YOUR CONFIG MANUALLY AS TO AVOID LOSING YOUR CONFIG SETTINGS**\n\nReasons:\n- The dialogue settings were already in the DlgSystem runtime module\n- Previous location `DefaultEditorPerProjectUserSettings.ini` was only loaded for editor builds\n- We have some runtime values in the dialogue settings\n\n## Other changes\n\n- **Deprecated** the *DlgText* text file format, the only supported format now is the JSON one, this will be removed in a future version.\n\n- **Deprecated** the following functions: `GetActiveSpeakerState`, `GetActiveParticipantIcon`, `GetActiveParticipant`, `GetActiveParticipantName` in favour of variants with `Node` in their name. For now you will get a warning about this, but the deprecated functions will be removed in a future version.\n\n- **Fix** localization support so that you can set the same namespace to multiple dialogues texts at the same time if you resave them.\n**NOTE:** the text files do not export the localization information yet\n\n- **Fix** Dialogue PostInitProperties spam (by checking for default class object and if not loaded)\n\n- **Add** new logger type that also logs to the MessageLog. This is configurable in the dialogue settings\n\n- **Add** more configuration options for the:\n\t- logger\n\t- localization/internationalization\n\t- default text edges\n\n- **Add** option to the **File** menu to delete all dialogues text files\n\n- **Disabled** by default exporting to any text file, as sometimes it does not work that well\n\n- **Enabled** by default the SpeakerState visibility as it is a core feature\n\n- **Disabled** by default the Voice Data fields visibility and recommend people use the **NodeData** instead\n\n- **Add** option to search localization data inside the dialogue search\n\n- **Add** function to check if a dialogue could be started or not based on the conditions of the first nodes\n\n- **Renamed** some enums to not have any prefix, you can see the renames inside `Config/DefaultDlgSystem.ini`\n\n## Known issues\n\n- The text file exporter sometimes crashes on import/export, a fix will be implemented in the future.\n- The text file exporter does not save localization data, so information is lost\n"
  },
  {
    "path": "Plugins/DlgSystem/Docs/EditorTypesExplanation.md",
    "content": "# Editor explanations of types that you can extend to make your plugin more awesome\n\n## `UActorFactory`\nWhen you have an asset in the content browser and you want to drag it out on the level editor, how should that happen?\n\n## `IComponentAssetBroker`\nWhen you drag from the content browser to the blueprint how does it know to go from the asset to the component in the blueprint?\n\n## `UFactory`\nCreate a new class from \"new\" or \"import\"\n\n## `FAssetTypeActions_Base` or `IAssetTypeActions`\n\nHow the editor interacts with that asset in the content browser:\n- color that shows at the bottom\n- category it will show in (in filters and create new)\n- what editor is opened\n\nYou must create a UFactory for this object type if you want it to appear in the new or import menu.\n\n## `UThumbnailRenderer` or `UDefaultSizedThumbnailRenderer`\nThe default icon that you see for the asset instead of the asset color and name which is the default.\n\n## `FEditorViewportClient`\nViewport client for editor viewports. Contains common functionality for camera movement, rendering debug information.\n"
  },
  {
    "path": "Plugins/DlgSystem/Docs/README.md",
    "content": "#  Dialogue System\n\n**[CHANGELOG HERE](./CHANGELOG.md)**\n\nBrought to you by Not Yet:\n* Discord: [HERE](https://bit.ly/NYDiscord)\n* Website: [warriorb.com](http://www.warriorb.com)\n* Twitter: https://twitter.com/NotYetDevs\n* [Plugin Source Code](https://bit.ly/DlgSource)\n* [Plugin Forum post](https://bit.ly/DlgForum)\n* [Plugin Marketplace](https://bit.ly/DlgMarketplace)\n* [Wiki/Documentation](https://bit.ly/DlgWiki)\n"
  },
  {
    "path": "Plugins/DlgSystem/LICENSE.txt",
    "content": "Anything not covered by the Unreal Engine EULA and if not otherwise specified is covered under the MIT license.\n\nMIT License\n\nCopyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "Plugins/DlgSystem/README.md",
    "content": "# DlgSystem (Dialogue System) Plugin\n\nBranch Unreal version: `4.22`\n\n## Features:\n\n- 100% free, source code included\n- Full Blueprint and C++ support\n- Events and conditions\n- Branching based on different node types and conditions\n- Well structured runtime and editor modules\n- Full editor support including:\n    - Graph Editor\n    - Search window\n    - Dialogue Browser to get a good overview of all the dialogues\n    - Customized blueprint nodes to handle certain events and conditions in Blueprint easily\n    - Settings panel in Project Settings to modify the layout\n    - Option to import from and export to plain text formats (e.g. json)\n    - Real time display/edit functionality of the Dialogue runtime data.\n\nNot yet convinced? Have you seen our [`showcase page`][(https://gitlab.com/NotYetGames/DlgSystem/wikis/Feature-Showcase](https://bit.ly/DlgFeatureShowcase))?\n\n## General Information\n\nThis plugin is primary developed and used for our own [game (WarriOrb)](http://www.warriorb.com).\nWe have put significant effort into it and decided to make it open source in order to help out other teams facing similar challenges.\n\nContribution, feedback and constructive criticism are appreciated and we would be really happy to hear about your game using our tool.\n\nSee [Support](#support) for how to support this project.\n\nSee the [Wiki](https://gitlab.com/NotYetGames/DlgSystem/wikis/home) for the manual and tutorials.\n\n[DlgSystemExample project](https://gitlab.com/NotYetGames/DlgSystemExample/tree/4.22) is also provided.\n\nBrought to you by Not Yet:\n* Discord: [HERE](https://bit.ly/NYDiscord)\n* Website: [warriorb.com](http://www.warriorb.com)\n* Twitter: https://twitter.com/NotYetDevs\n* [Plugin Forum post](https://bit.ly/DlgForum)\n* [Plugin Marketplace](https://bit.ly/DlgMarketplace)\n\n## Support\n\nNOTE: that initially the plugin was free on the marketplace but later we switched to a small fee because maintaining all of the binary versions for different engine targets took a lot of time, consider buying the plugin on the marketplace as a donation :).\n\n### Buy us some tea/coffee\n\nYou can buy [this plugin](https://bit.ly/DlgMarketplace) or our other plugins on the [unreal engine marketplace](https://www.unrealengine.com/marketplace/en-US/profile/Not+Yet) and always get binary support for the latest 3 engine versions.\n\nOr you can just donate for that cup of tea/coffee :):\n\n[![paypal](https://www.paypalobjects.com/en_US/i/btn/btn_donateCC_LG.gif)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=MMCAD7TZL8N48&source=url)\n\n### Spread the word\n\nShould it prove useful to you, the best way to say thanks is to mention us and our game to your own audience.\n\n## Modules dependency\n\n```mermaid\ngraph TD;\n    A[DlgSystemEditor]-->B[UnrealEd];\n    A-->C[DlgSystem];\n    C-. WITH_EDITOR .->B;\n    C-. WITH_EDITOR using IDlgDialogueEditorAccess .->A\n```\n\n## Conventions\n\n### Branches\n\nThe supported unreal versions have their own branches.\nThe outdated version branches are kept but not updated anymore.\n\n### Code Style\n\nThe code style follows the one from the [UE Coding Standard](https://docs.unrealengine.com/latest/INT/Programming/Development/CodingStandard/)\nwith the additional changes located in the [`.editorconfig`](.editorconfig).\n\n### Commit messages\n\nEvery commit message that has `[C]` means that after updating to that commit, a recompile is required.\nEg: `[C] Added awesome Dialogue feature`\n\nEvery commit message that has `[G]` means that after updating to that commit the solution files should be regenerated (and recompiled, *obvious*).\n(`Right click on project file` -> `Generate Visual Studio project files`) (or from the command line regenerate the project).\n\nEg: `[G] New Dialogue Editor mode`\n"
  },
  {
    "path": "Plugins/DlgSystem/Resources/LICENSE.txt",
    "content": "Icon128.png from http://game-icons.net/lorc/originals/conversation.html\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystem/DlgSystem.Build.cs",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n\nusing UnrealBuildTool;\nusing System.IO;\n\npublic class DlgSystem : ModuleRules\n{\n\tpublic DlgSystem(ReadOnlyTargetRules Target) : base(Target)\n\t{\n\t\t// Enable IWYU\n\t\t// https://docs.unrealengine.com/latest/INT/Programming/UnrealBuildSystem/IWYUReferenceGuide/index.html\n\t\t// https://docs.unrealengine.com/latest/INT/Programming/UnrealBuildSystem/Configuration/\n\t\tPCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs;\n\t\tbEnforceIWYU = true;\n\t\t//MinFilesUsingPrecompiledHeaderOverride = 1;\n\t\t// bFasterWithoutUnity = true;\n\t\t// bUseUnity = false;\n\n\t\tPublicIncludePaths.AddRange(\n\t\t\tnew string[] {\n\t\t\t\tPath.Combine(ModuleDirectory, \"Public\")\n\t\t\t\t// ... add public include paths required here ...\n\t\t\t});\n\n\n\t\tPrivateIncludePaths.AddRange(\n\t\t\tnew string[] {\n\t\t\t\tPath.Combine(ModuleDirectory, \"Private\")\n\t\t\t\t// ... add other private include paths required here ...\n\t\t\t});\n\n\n\t\tPublicDependencyModuleNames.AddRange(\n\t\t\tnew string[] {\n\t\t\t\t\"Core\",\n\t\t\t\t\"Json\",\n\t\t\t\t\"JsonUtilities\"\n\t\t\t\t// ... add other public dependencies that you statically link with here ...\n\t\t\t});\n\n\n\t\tPrivateDependencyModuleNames.AddRange(\n\t\t\tnew string[] {\n\t\t\t\t\"CoreUObject\",\n\t\t\t\t\"Engine\",\n\t\t\t\t\"Projects\", // IPluginManager\n\n\t\t\t\t// UI\n\t\t\t\t\"SlateCore\",\n\t\t\t\t\"Slate\",\n\t\t\t\t\"InputCore\"\n\t\t\t\t// ... add private dependencies that you statically link with here ...\n\t\t\t});\n\n\t\t// Add MessageLog support\n\t\tif (Target.bBuildDeveloperTools)\n\t\t{\n\t\t\tPrivateDependencyModuleNames.Add(\"MessageLog\");\n\t\t}\n\n\t\t// We need this dependency when the DlgSystem works in the editor mode/built with editor\n\t\tif (Target.bBuildEditor)\n\t\t{\n\t\t\tPrivateDependencyModuleNames.Add(\"EditorWidgets\");\n\t\t\tPrivateDependencyModuleNames.Add(\"UnrealEd\");\n\n\t\t\t// Accessing the menu\n\t\t\tPrivateDependencyModuleNames.Add(\"WorkspaceMenuStructure\");\n\t\t}\n\n\t\t// Add GameplayDebugger functionality if not 'Shipping' or 'Test' Target.\n\t\tif (Target.bBuildDeveloperTools ||\n\t\t\t(Target.Configuration != UnrealTargetConfiguration.Shipping && Target.Configuration != UnrealTargetConfiguration.Test))\n\t\t{\n\t\t\tPrivateDependencyModuleNames.Add(\"GameplayDebugger\");\n\t\t\tPublicDefinitions.Add(\"WITH_GAMEPLAY_DEBUGGER=1\");\n\t\t}\n\t\telse\n\t\t{\n\t\t\tPublicDefinitions.Add(\"WITH_GAMEPLAY_DEBUGGER=0\");\n\t\t}\n\n\t\tDynamicallyLoadedModuleNames.AddRange(\n\t\t\tnew string[] {\n\t\t\t\t// ... add any modules that your module loads dynamically here ...\n\t\t\t});\n\t}\n}\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystem/Private/DlgCondition.cpp",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#include \"DlgCondition.h\"\n\n#include \"DlgConstants.h\"\n#include \"DlgMemory.h\"\n#include \"DlgContext.h\"\n#include \"Nodes/DlgNode.h\"\n#include \"NYReflectionHelper.h\"\n#include \"Kismet/GameplayStatics.h\"\n#include \"DlgDialogueParticipant.h\"\n#include \"DlgHelper.h\"\n#include \"Logging/DlgLogger.h\"\n\nbool FDlgCondition::EvaluateArray(const UDlgContext& Context, const TArray<FDlgCondition>& ConditionsArray, FName DefaultParticipantName)\n{\n\tbool bHasAnyWeak = false;\n\tbool bHasSuccessfulWeak = false;\n\n\tfor (const FDlgCondition& Condition : ConditionsArray)\n\t{\n\t\tconst FName ParticipantName = Condition.ParticipantName == NAME_None ? DefaultParticipantName : Condition.ParticipantName;\n\t\tconst bool bSatisfied = Condition.IsConditionMet(Context, Context.GetParticipant(ParticipantName));\n\t\tif (Condition.Strength == EDlgConditionStrength::Weak)\n\t\t{\n\t\t\tbHasAnyWeak = true;\n\t\t\tbHasSuccessfulWeak = bHasSuccessfulWeak || bSatisfied;\n\t\t}\n\t\telse if (!bSatisfied)\n\t\t{\n\t\t\t// All must be satisfied\n\t\t\treturn false;\n\t\t}\n\t}\n\n\treturn bHasSuccessfulWeak || !bHasAnyWeak;\n}\n\nbool FDlgCondition::IsConditionMet(const UDlgContext& Context, const UObject* Participant) const\n{\n\tbool bHasParticipant = true;\n\tif (IsParticipantInvolved())\n\t{\n\t\tbHasParticipant = ValidateIsParticipantValid(Context, TEXT(\"IsConditionMet\"), Participant);\n\t}\n\n\t// We don't care if it has a participant, but warn nonetheless by calling validate it before this\n\tif (ConditionType == EDlgConditionType::Custom)\n\t{\n\t\tif (CustomCondition == nullptr)\n\t\t{\n\t\t\tFDlgLogger::Get().Errorf(\n\t\t\t\tTEXT(\"Custom Condition is empty (not valid). IsConditionMet returning false.\\nContext:\\n\\t%s, Participant = %s\"),\n\t\t\t\t*Context.GetContextString(), Participant ? *Participant->GetPathName() : TEXT(\"INVALID\")\n\t\t\t);\n\t\t\treturn false;\n\t\t}\n\n\t\treturn CustomCondition->IsConditionMet(&Context, Participant);\n\t}\n\n\t// Must have participant from this point onwards\n\tif (!bHasParticipant)\n\t{\n\t\treturn false;\n\t}\n\tswitch (ConditionType)\n\t{\n\t\tcase EDlgConditionType::EventCall:\n\t\t\treturn IDlgDialogueParticipant::Execute_CheckCondition(Participant, &Context, CallbackName) == bBoolValue;\n\n\t\tcase EDlgConditionType::BoolCall:\n\t\t\treturn CheckBool(Context, IDlgDialogueParticipant::Execute_GetBoolValue(Participant, CallbackName));\n\n\t\tcase EDlgConditionType::FloatCall:\n\t\t\treturn CheckFloat(Context, IDlgDialogueParticipant::Execute_GetFloatValue(Participant, CallbackName));\n\n\t\tcase EDlgConditionType::IntCall:\n\t\t\treturn CheckInt(Context, IDlgDialogueParticipant::Execute_GetIntValue(Participant, CallbackName));\n\n\t\tcase EDlgConditionType::NameCall:\n\t\t\treturn CheckName(Context, IDlgDialogueParticipant::Execute_GetNameValue(Participant, CallbackName));\n\n\n\t\tcase EDlgConditionType::ClassBoolVariable:\n\t\t\treturn CheckBool(Context, FNYReflectionHelper::GetVariable<FNYBoolProperty, bool>(Participant, CallbackName));\n\n\t\tcase EDlgConditionType::ClassFloatVariable:\n\t\t\treturn CheckFloat(Context, FNYReflectionHelper::GetVariable<FNYFloatProperty, float>(Participant, CallbackName));\n\n\t\tcase EDlgConditionType::ClassIntVariable:\n\t\t\treturn CheckInt(Context, FNYReflectionHelper::GetVariable<FNYIntProperty, int32>(Participant, CallbackName));\n\n\t\tcase EDlgConditionType::ClassNameVariable:\n\t\t\treturn CheckName(Context, FNYReflectionHelper::GetVariable<FNYNameProperty, FName>(Participant, CallbackName));\n\n\n\t\tcase EDlgConditionType::WasNodeVisited:\n\t\t\tif (bLongTermMemory)\n\t\t\t{\n\t\t\t\treturn FDlgMemory::Get().IsNodeVisited(Context.GetDialogueGUID(), IntValue, GUID) == bBoolValue;\n\t\t\t}\n\n\t\t\treturn Context.GetHistoryOfThisContext().Contains(IntValue, GUID) == bBoolValue;\n\n\t\tcase EDlgConditionType::HasSatisfiedChild:\n\t\t\t{\n\t\t\t\t// Use the GUID if it is valid as it is more reliable\n\t\t\t\tconst UDlgNode* Node = GUID.IsValid() ? Context.GetNodeFromGUID(GUID) : Context.GetNodeFromIndex(IntValue);\n\t\t\t\treturn Node != nullptr ? Node->HasAnySatisfiedChild(Context, {}) == bBoolValue : false;\n\t\t\t}\n\n\t\tdefault:\n\t\t\tcheckNoEntry();\n\t\t\treturn false;\n\t}\n}\n\nbool FDlgCondition::CheckFloat(const UDlgContext& Context, float Value) const\n{\n\tfloat ValueToCheckAgainst = FloatValue;\n\tif (CompareType == EDlgCompare::ToVariable || CompareType == EDlgCompare::ToClassVariable)\n\t{\n\t\tconst UObject* OtherParticipant = Context.GetParticipant(OtherParticipantName);\n\t\tif (!ValidateIsParticipantValid(Context, TEXT(\"CheckFloat\"), OtherParticipant))\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\tif (CompareType == EDlgCompare::ToVariable)\n\t\t{\n\t\t\tValueToCheckAgainst = IDlgDialogueParticipant::Execute_GetFloatValue(OtherParticipant, OtherVariableName);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tValueToCheckAgainst = FNYReflectionHelper::GetVariable<FNYFloatProperty, float>(OtherParticipant, OtherVariableName);\n\t\t}\n\t}\n\n\tswitch (Operation)\n\t{\n\t\tcase EDlgOperation::Equal:\n\t\t\treturn FMath::IsNearlyEqual(Value, ValueToCheckAgainst);\n\n\t\tcase EDlgOperation::Greater:\n\t\t\treturn Value > ValueToCheckAgainst;\n\n\t\tcase EDlgOperation::GreaterOrEqual:\n\t\t\treturn Value >= ValueToCheckAgainst;\n\n\t\tcase EDlgOperation::Less:\n\t\t\treturn Value < ValueToCheckAgainst;\n\n\t\tcase EDlgOperation::LessOrEqual:\n\t\t\treturn Value <= ValueToCheckAgainst;\n\n\t\tcase EDlgOperation::NotEqual:\n\t\t\treturn !FMath::IsNearlyEqual(Value, ValueToCheckAgainst);\n\n\t\tdefault:\n\t\t\tFDlgLogger::Get().Errorf(\n\t\t\t\tTEXT(\"Invalid Operation in float based condition.\\nContext:\\n\\t%s\"),\n\t\t\t\t*Context.GetContextString()\n\t\t\t);\n\t\t\treturn false;\n\t}\n}\n\nbool FDlgCondition::CheckInt(const UDlgContext& Context, int32 Value) const\n{\n\tint32 ValueToCheckAgainst = IntValue;\n\tif (CompareType == EDlgCompare::ToVariable || CompareType == EDlgCompare::ToClassVariable)\n\t{\n\t\tconst UObject* OtherParticipant = Context.GetParticipant(OtherParticipantName);\n\t\tif (!ValidateIsParticipantValid(Context, TEXT(\"CheckInt\"), OtherParticipant))\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\tif (CompareType == EDlgCompare::ToVariable)\n\t\t{\n\t\t\tValueToCheckAgainst = IDlgDialogueParticipant::Execute_GetIntValue(OtherParticipant, OtherVariableName);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tValueToCheckAgainst = FNYReflectionHelper::GetVariable<FNYIntProperty, int32>(OtherParticipant, OtherVariableName);\n\t\t}\n\t}\n\n\tswitch (Operation)\n\t{\n\t\tcase EDlgOperation::Equal:\n\t\t\treturn Value == ValueToCheckAgainst;\n\n\t\tcase EDlgOperation::Greater:\n\t\t\treturn Value > ValueToCheckAgainst;\n\n\t\tcase EDlgOperation::GreaterOrEqual:\n\t\t\treturn Value >= ValueToCheckAgainst;\n\n\t\tcase EDlgOperation::Less:\n\t\t\treturn Value < ValueToCheckAgainst;\n\n\t\tcase EDlgOperation::LessOrEqual:\n\t\t\treturn Value <= ValueToCheckAgainst;\n\n\t\tcase EDlgOperation::NotEqual:\n\t\t\treturn Value != ValueToCheckAgainst;\n\n\t\tdefault:\n\t\t\tFDlgLogger::Get().Errorf(\n\t\t\t\tTEXT(\"Invalid Operation in int based condition.\\nContext:\\n\\t%s\"),\n\t\t\t\t*Context.GetContextString()\n\t\t\t);\n\t\t\treturn false;\n\t}\n}\n\nbool FDlgCondition::CheckBool(const UDlgContext& Context, bool bValue) const\n{\n\tbool bResult = bValue;\n\tif (CompareType == EDlgCompare::ToVariable || CompareType == EDlgCompare::ToClassVariable)\n\t{\n\t\tconst UObject* OtherParticipant = Context.GetParticipant(OtherParticipantName);\n\t\tif (!ValidateIsParticipantValid(Context, TEXT(\"CheckBool\"), OtherParticipant))\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\tbool bValueToCheckAgainst;\n\t\tif (CompareType == EDlgCompare::ToVariable)\n\t\t{\n\t\t\tbValueToCheckAgainst = IDlgDialogueParticipant::Execute_GetBoolValue(OtherParticipant, OtherVariableName);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tbValueToCheckAgainst = FNYReflectionHelper::GetVariable<FNYBoolProperty, bool>(OtherParticipant, OtherVariableName);\n\t\t}\n\n\t\t// Check if value matches other variable\n\t\tbResult = bValue == bValueToCheckAgainst;\n\t}\n\n\treturn bResult == bBoolValue;\n}\n\nbool FDlgCondition::CheckName(const UDlgContext& Context, FName Value) const\n{\n\tFName ValueToCheckAgainst = NameValue;\n\tif (CompareType == EDlgCompare::ToVariable || CompareType == EDlgCompare::ToClassVariable)\n\t{\n\t\tconst UObject* OtherParticipant = Context.GetParticipant(OtherParticipantName);\n\t\tif (!ValidateIsParticipantValid(Context, TEXT(\"CheckName\"), OtherParticipant))\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\tif (CompareType == EDlgCompare::ToVariable)\n\t\t{\n\t\t\tValueToCheckAgainst = IDlgDialogueParticipant::Execute_GetNameValue(OtherParticipant, OtherVariableName);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tValueToCheckAgainst = FNYReflectionHelper::GetVariable<FNYNameProperty, FName>(OtherParticipant, OtherVariableName);\n\t\t}\n\t}\n\n\tconst bool bResult = ValueToCheckAgainst == Value;\n\treturn bResult == bBoolValue;\n}\n\nbool FDlgCondition::ValidateIsParticipantValid(const UDlgContext& Context, const FString& ContextString, const UObject* Participant) const\n{\n\tif (IsValid(Participant))\n\t{\n\t\treturn true;\n\t}\n\n\tFDlgLogger::Get().Errorf(\n\t\tTEXT(\"%s FAILED because the PARTICIPANT is INVALID.\\nContext:\\n\\t%s, ConditionType = %s\"),\n\t\t*ContextString, *Context.GetContextString(), *ConditionTypeToString(ConditionType)\n\t);\n\treturn false;\n}\n\nbool FDlgCondition::IsParticipantInvolved() const\n{\n\treturn ConditionType != EDlgConditionType::HasSatisfiedChild\n\t\t&& ConditionType != EDlgConditionType::WasNodeVisited;\n}\n\nbool FDlgCondition::IsSecondParticipantInvolved() const\n{\n\t// Second participant requires first participant\n\treturn CompareType != EDlgCompare::ToConst && IsParticipantInvolved();\n}\n\nFString FDlgCondition::ConditionTypeToString(EDlgConditionType Type)\n{\n\tFString EnumValue;\n\tif (FDlgHelper::ConvertEnumToString<EDlgConditionType>(TEXT(\"EDlgConditionType\"), Type, false, EnumValue))\n\t\treturn EnumValue;\n\n\treturn EnumValue;\n}\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystem/Private/DlgContext.cpp",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#include \"DlgContext.h\"\n\n#include \"DlgConstants.h\"\n#include \"Nodes/DlgNode.h\"\n#include \"Nodes/DlgNode_End.h\"\n#include \"Nodes/DlgNode_SpeechSequence.h\"\n#include \"DlgDialogueParticipant.h\"\n#include \"DlgMemory.h\"\n#include \"Engine/Texture2D.h\"\n#include \"Logging/DlgLogger.h\"\n#include \"Net/UnrealNetwork.h\"\n\n\nUDlgContext::UDlgContext(const FObjectInitializer& ObjectInitializer)\n\t: UDlgObject(ObjectInitializer)\n{\n\t//UObject.bReplicates = true;\n}\n\nvoid UDlgContext::GetLifetimeReplicatedProps(TArray<FLifetimeProperty>& OutLifetimeProps) const\n{\n\tSuper::GetLifetimeReplicatedProps(OutLifetimeProps);\n\tDOREPLIFETIME(ThisClass, Dialogue);\n\tDOREPLIFETIME(ThisClass, SerializedParticipants);\n}\n\nvoid UDlgContext::SerializeParticipants()\n{\n\tSerializedParticipants.Empty(Participants.Num());\n\tfor (const auto& KeyValue : Participants)\n\t{\n\t\tSerializedParticipants.Add(KeyValue.Value);\n\t}\n}\n\nvoid UDlgContext::OnRep_SerializedParticipants()\n{\n\tParticipants.Empty(SerializedParticipants.Num());\n\tfor (UObject* Participant : SerializedParticipants)\n\t{\n\t\tif (IsValid(Participant))\n\t\t{\n\t\t\tParticipants.Add(IDlgDialogueParticipant::Execute_GetParticipantName(Participant), Participant);\n\t\t}\n\t}\n}\n\nbool UDlgContext::ChooseOption(int32 OptionIndex)\n{\n\tcheck(Dialogue);\n\tif (UDlgNode* Node = GetMutableActiveNode())\n\t{\n\t\tif (Node->OptionSelected(OptionIndex, *this))\n\t\t{\n\t\t\treturn true;\n\t\t}\n\t}\n\n\tbDialogueEnded = true;\n\treturn false;\n}\n\nbool UDlgContext::ChooseSpeechSequenceOptionFromReplicated(int32 OptionIndex)\n{\n\tcheck(Dialogue);\n\tif (UDlgNode_SpeechSequence* Node = GetMutableActiveNodeAsSpeechSequence())\n\t{\n\t\tif (Node->OptionSelectedFromReplicated(OptionIndex, *this))\n\t\t{\n\t\t\treturn true;\n\t\t}\n\t}\n\n\tbDialogueEnded = true;\n\treturn false;\n}\n\nbool UDlgContext::ChooseOptionBasedOnAllOptionIndex(int32 Index)\n{\n\tif (!AllChildren.IsValidIndex(Index))\n\t{\n\t\tLogErrorWithContext(FString::Printf(TEXT(\"ChooseOptionBasedOnAllOptionIndex - INVALID given Index = %d\"), Index));\n\t\tbDialogueEnded = true;\n\t\treturn false;\n\t}\n\n\tif (!AllChildren[Index].IsSatisfied())\n\t{\n\t\tLogErrorWithContext(FString::Printf(TEXT(\"ChooseOptionBasedOnAllOptionIndex - given Index = %d is an unsatisfied edge\"), Index));\n\t\tbDialogueEnded = true;\n\t\treturn false;\n\t}\n\n\tfor (int32 i = 0; i < AvailableChildren.Num(); ++i)\n\t{\n\t\tif (AvailableChildren[i] == AllChildren[Index].GetEdge())\n\t\t{\n\t\t\treturn ChooseOption(i);\n\t\t}\n\t}\n\n\tensure(false);\n\tbDialogueEnded = true;\n\treturn false;\n}\n\nbool UDlgContext::ReevaluateOptions()\n{\n\tcheck(Dialogue);\n\tUDlgNode* Node = GetMutableActiveNode();\n\tif (!IsValid(Node))\n\t{\n\t\tLogErrorWithContext(TEXT(\"ReevaluateOptions - Failed to update dialogue options\"));\n\t\treturn false;\n\t}\n\n\treturn Node->ReevaluateChildren(*this, {});\n}\n\nconst FText& UDlgContext::GetOptionText(int32 OptionIndex) const\n{\n\tcheck(Dialogue);\n\tif (!AvailableChildren.IsValidIndex(OptionIndex))\n\t{\n\t\tLogErrorWithContext(FString::Printf(TEXT(\"GetOptionText - INVALID given OptionIndex = %d\"), OptionIndex));\n\t\treturn FText::GetEmpty();\n\t}\n\n\treturn AvailableChildren[OptionIndex].GetText();\n}\n\nFName UDlgContext::GetOptionSpeakerState(int32 OptionIndex) const\n{\n\tcheck(Dialogue);\n\tif (!AvailableChildren.IsValidIndex(OptionIndex))\n\t{\n\t\tLogErrorWithContext(FString::Printf(TEXT(\"GetOptionSpeakerState - INVALID given OptionIndex = %d\"), OptionIndex));\n\t\treturn NAME_None;\n\t}\n\n\treturn AvailableChildren[OptionIndex].SpeakerState;\n}\n\nconst TArray<FDlgCondition>& UDlgContext::GetOptionEnterConditions(int32 OptionIndex) const\n{\n\tcheck(Dialogue);\n\tif (!AvailableChildren.IsValidIndex(OptionIndex))\n\t{\n\t\tLogErrorWithContext(FString::Printf(TEXT(\"GetOptionEnterConditions - INVALID given OptionIndex = %d\"), OptionIndex));\n\t\tstatic TArray<FDlgCondition> EmptyArray;\n\t\treturn EmptyArray;\n\t}\n\n\treturn AvailableChildren[OptionIndex].Conditions;\n}\n\nconst FDlgEdge& UDlgContext::GetOption(int32 OptionIndex) const\n{\n\tcheck(Dialogue);\n\tif (!AvailableChildren.IsValidIndex(OptionIndex))\n\t{\n\t\tLogErrorWithContext(FString::Printf(TEXT(\"GetOption - INVALID given OptionIndex = %d\"), OptionIndex));\n\t\treturn FDlgEdge::GetInvalidEdge();\n\t}\n\n\treturn AvailableChildren[OptionIndex];\n}\n\nconst FText& UDlgContext::GetOptionTextFromAll(int32 Index) const\n{\n\tcheck(Dialogue);\n\tif (!AllChildren.IsValidIndex(Index))\n\t{\n\t\tLogErrorWithContext(FString::Printf(TEXT(\"GetOptionTextFromAll - INVALID given Index = %d\"), Index));\n\t\treturn FText::GetEmpty();\n\t}\n\n\treturn AllChildren[Index].GetEdge().GetText();\n}\n\nbool UDlgContext::IsOptionSatisfied(int32 Index) const\n{\n\tcheck(Dialogue);\n\tif (!AllChildren.IsValidIndex(Index))\n\t{\n\t\tLogErrorWithContext(FString::Printf(TEXT(\"IsOptionSatisfied - INVALID given Index = %d\"), Index));\n\t\treturn false;\n\t}\n\n\treturn AllChildren[Index].IsSatisfied();\n}\n\nFName UDlgContext::GetOptionSpeakerStateFromAll(int32 Index) const\n{\n\tcheck(Dialogue);\n\tif (!AllChildren.IsValidIndex(Index))\n\t{\n\t\tLogErrorWithContext(FString::Printf(TEXT(\"GetOptionSpeakerStateFromAll - INVALID given Index = %d\"), Index));\n\t\treturn NAME_None;\n\t}\n\n\treturn AllChildren[Index].GetEdge().SpeakerState;\n}\n\nconst FDlgEdgeData& UDlgContext::GetOptionFromAll(int32 Index) const\n{\n\tcheck(Dialogue);\n\tif (!AvailableChildren.IsValidIndex(Index))\n\t{\n\t\tLogErrorWithContext(FString::Printf(TEXT(\"GetOptionFromAll - INVALID given Index = %d\"), Index));\n\t\treturn FDlgEdgeData::GetInvalidEdge();\n\t}\n\n\treturn AllChildren[Index];\n}\n\nconst FText& UDlgContext::GetActiveNodeText() const\n{\n\tconst UDlgNode* Node = GetActiveNode();\n\tif (!IsValid(Node))\n\t{\n\t\tLogErrorWithContext(TEXT(\"GetActiveNodeText - INVALID Active Node\"));\n\t\treturn FText::GetEmpty();\n\t}\n\n\treturn Node->GetNodeText();\n}\n\nFName UDlgContext::GetActiveNodeSpeakerState() const\n{\n\tconst UDlgNode* Node = GetActiveNode();\n\tif (!IsValid(Node))\n\t{\n\t\tLogErrorWithContext(TEXT(\"GetActiveNodeSpeakerState - INVALID Active Node\"));\n\t\treturn NAME_None;\n\t}\n\n\treturn Node->GetSpeakerState();\n}\n\nUSoundWave* UDlgContext::GetActiveNodeVoiceSoundWave() const\n{\n\tconst UDlgNode* Node = GetActiveNode();\n\tif (!IsValid(Node))\n\t{\n\t\tLogErrorWithContext(TEXT(\"GetActiveNodeVoiceSoundWave - INVALID Active Node\"));\n\t\treturn nullptr;\n\t}\n\n\treturn Node->GetNodeVoiceSoundWave();\n}\n\nUSoundBase* UDlgContext::GetActiveNodeVoiceSoundBase() const\n{\n\tconst UDlgNode* Node = GetActiveNode();\n\tif (!IsValid(Node))\n\t{\n\t\tLogErrorWithContext(TEXT(\"GetActiveNodeVoiceSoundBase - INVALID Active Node\"));\n\t\treturn nullptr;\n\t}\n\n\treturn Node->GetNodeVoiceSoundBase();\n}\n\nUDialogueWave* UDlgContext::GetActiveNodeVoiceDialogueWave() const\n{\n\tconst UDlgNode* Node = GetActiveNode();\n\tif (!IsValid(Node))\n\t{\n\t\tLogErrorWithContext(TEXT(\"GetActiveNodeVoiceDialogueWave - INVALID Active Node\"));\n\t\treturn nullptr;\n\t}\n\n\treturn Node->GetNodeVoiceDialogueWave();\n}\n\nUObject* UDlgContext::GetActiveNodeGenericData() const\n{\n\tconst UDlgNode* Node = GetActiveNode();\n\tif (!IsValid(Node))\n\t{\n\t\tLogErrorWithContext(TEXT(\"GetActiveNodeGenericData - INVALID Active Node\"));\n\t\treturn nullptr;\n\t}\n\n\treturn Node->GetNodeGenericData();\n}\n\nUDlgNodeData* UDlgContext::GetActiveNodeData() const\n{\n\tconst UDlgNode* Node = GetActiveNode();\n\tif (!IsValid(Node))\n\t{\n\t\tLogErrorWithContext(TEXT(\"GetActiveNodeData - INVALID Active Node\"));\n\t\treturn nullptr;\n\t}\n\n\treturn Node->GetNodeData();\n}\n\nUTexture2D* UDlgContext::GetActiveNodeParticipantIcon() const\n{\n\tconst UDlgNode* Node = GetActiveNode();\n\tif (!IsValid(Node))\n\t{\n\t\tLogErrorWithContext(TEXT(\"GetActiveNodeParticipantIcon - INVALID Active Node\"));\n\t\treturn nullptr;\n\t}\n\n\tconst FName SpeakerName = Node->GetNodeParticipantName();\n\tauto* ObjectPtr = Participants.Find(SpeakerName);\n\tif (ObjectPtr == nullptr || !IsValid(*ObjectPtr))\n\t{\n\t\tLogErrorWithContext(FString::Printf(\n\t\t\tTEXT(\"GetActiveNodeParticipantIcon - The ParticipantName = `%s` from the Active Node does NOT exist in the current Participants\"),\n\t\t\t*SpeakerName.ToString()\n\t\t));\n\t\treturn nullptr;\n\t}\n\n\treturn IDlgDialogueParticipant::Execute_GetParticipantIcon(*ObjectPtr, SpeakerName, Node->GetSpeakerState());\n}\n\nUObject* UDlgContext::GetActiveNodeParticipant() const\n{\n\tconst UDlgNode* Node = GetActiveNode();\n\tif (!IsValid(Node))\n\t{\n\t\tLogErrorWithContext(TEXT(\"GetActiveNodeParticipant - INVALID Active Node\"));\n\t\treturn nullptr;\n\t}\n\n\tconst FName SpeakerName = Node->GetNodeParticipantName();\n\tauto* ObjectPtr = Participants.Find(Node->GetNodeParticipantName());\n\tif (ObjectPtr == nullptr || !IsValid(*ObjectPtr))\n\t{\n\t\tLogErrorWithContext(FString::Printf(\n\t\t\tTEXT(\"GetActiveNodeParticipant - The ParticipantName = `%s` from the Active Node does NOT exist in the current Participants\"),\n\t\t\t*SpeakerName.ToString()\n\t\t));\n\t\treturn nullptr;\n\t}\n\n\treturn *ObjectPtr;\n}\n\nFName UDlgContext::GetActiveNodeParticipantName() const\n{\n\tconst UDlgNode* Node = GetActiveNode();\n\tif (!IsValid(Node))\n\t{\n\t\tLogErrorWithContext(TEXT(\"GetActiveNodeParticipantName - INVALID Active Node\"));\n\t\treturn NAME_None;\n\t}\n\n\treturn Node->GetNodeParticipantName();\n}\n\nFText UDlgContext::GetActiveNodeParticipantDisplayName() const\n{\n\tconst UDlgNode* Node = GetActiveNode();\n\tif (!IsValid(Node))\n\t{\n\t\tLogErrorWithContext(TEXT(\"GetActiveNodeParticipantDisplayName - INVALID Active Node\"));\n\t\treturn FText::GetEmpty();\n\t}\n\n\tconst FName SpeakerName = Node->GetNodeParticipantName();\n\tauto* ObjectPtr = Participants.Find(SpeakerName);\n\tif (ObjectPtr == nullptr || !IsValid(*ObjectPtr))\n\t{\n\t\tLogErrorWithContext(FString::Printf(\n\t\t\tTEXT(\"GetActiveNodeParticipantDisplayName - The ParticipantName = `%s` from the Active Node does NOT exist in the current Participants\"),\n\t\t\t*SpeakerName.ToString()\n\t\t));\n\t\treturn FText::GetEmpty();\n\t}\n\n\treturn IDlgDialogueParticipant::Execute_GetParticipantDisplayName(*ObjectPtr, SpeakerName);\n}\n\nUObject* UDlgContext::GetMutableParticipant(FName ParticipantName) const\n{\n\tauto* ParticipantPtr = Participants.Find(ParticipantName);\n\tif (ParticipantPtr != nullptr && IsValid(*ParticipantPtr))\n\t{\n\t\treturn *ParticipantPtr;\n\t}\n\n\treturn nullptr;\n}\n\nconst UObject* UDlgContext::GetParticipant(FName ParticipantName) const\n{\n\tauto* ParticipantPtr = Participants.Find(ParticipantName);\n\tif (ParticipantPtr != nullptr && IsValid(*ParticipantPtr))\n\t{\n\t\treturn *ParticipantPtr;\n\t}\n\n\treturn nullptr;\n}\n\nbool UDlgContext::IsValidNodeIndex(int32 NodeIndex) const\n{\n\treturn Dialogue ? Dialogue->IsValidNodeIndex(NodeIndex) : false;\n}\n\nbool UDlgContext::IsValidNodeGUID(const FGuid& NodeGUID) const\n{\n\treturn Dialogue ? Dialogue->IsValidNodeGUID(NodeGUID) : false;\n}\n\nFGuid UDlgContext::GetNodeGUIDForIndex(int32 NodeIndex) const\n{\n\treturn Dialogue ? Dialogue->GetNodeGUIDForIndex(NodeIndex) : FGuid{};\n}\n\nint32 UDlgContext::GetNodeIndexForGUID(const FGuid& NodeGUID) const\n{\n\treturn Dialogue ? Dialogue->GetNodeIndexForGUID(NodeGUID) : INDEX_NONE;\n}\n\nbool UDlgContext::IsOptionConnectedToVisitedNode(int32 Index, bool bLocalHistory, bool bIndexSkipsUnsatisfiedEdges) const\n{\n\tint32 TargetIndex = INDEX_NONE;\n\n\tif (bIndexSkipsUnsatisfiedEdges)\n\t{\n\t\tif (!AvailableChildren.IsValidIndex(Index))\n\t\t{\n\t\t\tLogErrorWithContext(FString::Printf(TEXT(\"IsOptionConnectedToVisitedNode - INVALID Index = %d for AvailableChildren\"), Index));\n\t\t\treturn false;\n\t\t}\n\t\tTargetIndex = AvailableChildren[Index].TargetIndex;\n\t}\n\telse\n\t{\n\t\tif (!AllChildren.IsValidIndex(Index))\n\t\t{\n\t\t\tLogErrorWithContext(FString::Printf(TEXT(\"IsOptionConnectedToVisitedNode - INVALID Index = %d for AllChildren\"), Index));\n\t\t\treturn false;\n\t\t}\n\t\tTargetIndex = AllChildren[Index].GetEdge().TargetIndex;\n\t}\n\n\tconst FGuid TargetGUID = GetNodeGUIDForIndex(TargetIndex);\n\tif (bLocalHistory)\n\t{\n\t\treturn History.Contains(TargetIndex, TargetGUID);\n\t}\n\n\tif (Dialogue == nullptr)\n\t{\n\t\tLogErrorWithContext(TEXT(\"IsOptionConnectedToVisitedNode - This Context does not have a valid Dialogue\"));\n\t\treturn false;\n\t}\n\n\treturn FDlgMemory::Get().IsNodeVisited(Dialogue->GetGUID(), TargetIndex, TargetGUID);\n}\n\nbool UDlgContext::IsOptionConnectedToEndNode(int32 Index, bool bIndexSkipsUnsatisfiedEdges) const\n{\n\tint32 TargetIndex = INDEX_NONE;\n\n\tif (bIndexSkipsUnsatisfiedEdges)\n\t{\n\t\tif (!AvailableChildren.IsValidIndex(Index))\n\t\t{\n\t\t\tLogErrorWithContext(FString::Printf(TEXT(\"IsOptionConnectedToEndNode - INVALID Index = %d for AvailableChildren\"), Index));\n\t\t\treturn false;\n\t\t}\n\t\tTargetIndex = AvailableChildren[Index].TargetIndex;\n\t}\n\telse\n\t{\n\t\tif (!AllChildren.IsValidIndex(Index))\n\t\t{\n\t\t\tLogErrorWithContext(FString::Printf(TEXT(\"IsOptionConnectedToEndNode - INVALID Index = %d for AllChildren\"), Index));\n\t\t\treturn false;\n\t\t}\n\t\tTargetIndex = AllChildren[Index].GetEdge().TargetIndex;\n\t}\n\n\tif (Dialogue == nullptr)\n\t{\n\t\tLogErrorWithContext(TEXT(\"IsOptionConnectedToEndNode - This Context does not have a valid Dialogue\"));\n\t\treturn false;\n\t}\n\n\tconst TArray<UDlgNode*>& Nodes = Dialogue->GetNodes();\n\tif (Nodes.IsValidIndex(TargetIndex))\n\t{\n\t\treturn Nodes[TargetIndex]->IsA<UDlgNode_End>();\n\t}\n\n\tLogErrorWithContext(FString::Printf(TEXT(\"IsOptionConnectedToEndNode - The examined Edge/Option at Index = %d does not point to a valid node\"), Index));\n\treturn false;\n}\n\nbool UDlgContext::EnterNode(int32 NodeIndex, TSet<const UDlgNode*> NodesEnteredWithThisStep)\n{\n\tcheck(Dialogue);\n\tUDlgNode* Node = GetMutableNodeFromIndex(NodeIndex);\n\tif (!IsValid(Node))\n\t{\n\t\tLogErrorWithContext(FString::Printf(TEXT(\"EnterNode - FAILED because of INVALID NodeIndex = %d\"), NodeIndex));\n\t\treturn false;\n\t}\n\n\tActiveNodeIndex = NodeIndex;\n\tSetNodeVisited(NodeIndex, Node->GetGUID());\n\n\treturn Node->HandleNodeEnter(*this, NodesEnteredWithThisStep);\n}\n\nUDlgContext* UDlgContext::CreateCopy() const\n{\n\tUObject* FirstParticipant = nullptr;\n\tfor (const auto& KeyValue : Participants)\n\t{\n\t\tif (KeyValue.Value)\n\t\t{\n\t\t\tFirstParticipant = KeyValue.Value;\n\t\t\tbreak;\n\t\t}\n\t}\n\tif (!FirstParticipant)\n\t{\n\t\treturn nullptr;\n\t}\n\n\tauto* Context = NewObject<UDlgContext>(FirstParticipant, StaticClass());\n\tContext->Dialogue = Dialogue;\n\tContext->SetParticipants(Participants);\n\tContext->ActiveNodeIndex = ActiveNodeIndex;\n\tContext->AvailableChildren = AvailableChildren;\n\tContext->AllChildren = AllChildren;\n\tContext->History = History;\n\tContext->bDialogueEnded = bDialogueEnded;\n\n\treturn Context;\n}\n\nvoid UDlgContext::SetNodeVisited(int32 NodeIndex, const FGuid& NodeGUID)\n{\n\tFDlgMemory::Get().SetNodeVisited(Dialogue->GetGUID(), NodeIndex, NodeGUID);\n\tHistory.Add(NodeIndex, NodeGUID);\n}\n\nUDlgNode_SpeechSequence* UDlgContext::GetMutableActiveNodeAsSpeechSequence() const\n{\n\treturn Cast<UDlgNode_SpeechSequence>(GetMutableNodeFromIndex(ActiveNodeIndex));\n}\n\nconst UDlgNode_SpeechSequence* UDlgContext::GetActiveNodeAsSpeechSequence() const\n{\n\treturn Cast<UDlgNode_SpeechSequence>(GetNodeFromIndex(ActiveNodeIndex));\n}\n\nUDlgNode* UDlgContext::GetMutableNodeFromIndex(int32 NodeIndex) const\n{\n\tcheck(Dialogue);\n\tif (!Dialogue->IsValidNodeIndex(NodeIndex))\n\t{\n\t\treturn nullptr;\n\t}\n\n\treturn Dialogue->GetMutableNodeFromIndex(NodeIndex);\n}\n\nconst UDlgNode* UDlgContext::GetNodeFromIndex(int32 NodeIndex) const\n{\n\tcheck(Dialogue);\n\tif (!Dialogue->IsValidNodeIndex(NodeIndex))\n\t{\n\t\treturn nullptr;\n\t}\n\n\treturn Dialogue->GetMutableNodeFromIndex(NodeIndex);\n}\n\nUDlgNode* UDlgContext::GetMutableNodeFromGUID(const FGuid& NodeGUID) const\n{\n\tcheck(Dialogue);\n\tif (!Dialogue->IsValidNodeGUID(NodeGUID))\n\t{\n\t\treturn nullptr;\n\t}\n\n\treturn Dialogue->GetMutableNodeFromGUID(NodeGUID);\n}\n\nconst UDlgNode* UDlgContext::GetNodeFromGUID(const FGuid& NodeGUID) const\n{\n\tcheck(Dialogue);\n\tif (!Dialogue->IsValidNodeGUID(NodeGUID))\n\t{\n\t\treturn nullptr;\n\t}\n\n\treturn Dialogue->GetMutableNodeFromGUID(NodeGUID);\n}\n\nbool UDlgContext::IsNodeEnterable(int32 NodeIndex, TSet<const UDlgNode*> AlreadyVisitedNodes) const\n{\n\tcheck(Dialogue);\n\tif (const UDlgNode* Node = GetNodeFromIndex(NodeIndex))\n\t{\n\t\treturn Node->CheckNodeEnterConditions(*this, AlreadyVisitedNodes);\n\t}\n\n\treturn false;\n}\n\nbool UDlgContext::CanBeStarted(UDlgDialogue* InDialogue, const TMap<FName, UObject*>& InParticipants)\n{\n\tif (!ValidateParticipantsMapForDialogue(TEXT(\"CanBeStarted\"), InDialogue, InParticipants, false))\n\t{\n\t\treturn false;\n\t}\n\n\t// Get first participant\n\tUObject* FirstParticipant = nullptr;\n\tfor (const auto& KeyValue : InParticipants)\n\t{\n\t\tif (KeyValue.Value)\n\t\t{\n\t\t\tFirstParticipant = KeyValue.Value;\n\t\t\tbreak;\n\t\t}\n\t}\n\tcheck(FirstParticipant != nullptr);\n\n\t// Create temporary context that is Garbage Collected after this function returns (hopefully)\n\tauto* Context = NewObject<UDlgContext>(FirstParticipant, StaticClass());\n\tContext->Dialogue = InDialogue;\n\tContext->SetParticipants(InParticipants);\n\n\t// Evaluate edges/children of the start node\n\tconst UDlgNode& StartNode = InDialogue->GetStartNode();\n\tfor (const FDlgEdge& ChildLink : StartNode.GetNodeChildren())\n\t{\n\t\tif (ChildLink.Evaluate(*Context, {}))\n\t\t{\n\t\t\t// Simulate EnterNode\n\t\t\tUDlgNode* Node = Context->GetMutableNodeFromIndex(ChildLink.TargetIndex);\n\t\t\tif (Node && Node->HasAnySatisfiedChild(*Context, {}))\n\t\t\t{\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn false;\n}\n\nbool UDlgContext::StartWithContext(const FString& ContextString, UDlgDialogue* InDialogue, const TMap<FName, UObject*>& InParticipants)\n{\n\tconst FString ContextMessage = ContextString.IsEmpty()\n\t\t? TEXT(\"Start\")\n\t\t: FString::Printf(TEXT(\"%s - Start\"), *ContextString);\n\n\tDialogue = InDialogue;\n\tSetParticipants(InParticipants);\n\tif (!ValidateParticipantsMapForDialogue(ContextMessage, Dialogue, Participants))\n\t{\n\t\treturn false;\n\t}\n\n\t// Evaluate edges/children of the start node\n\tconst UDlgNode& StartNode = Dialogue->GetStartNode();\n\tfor (const FDlgEdge& ChildLink : StartNode.GetNodeChildren())\n\t{\n\t\tif (ChildLink.Evaluate(*this, {}))\n\t\t{\n\t\t\tif (EnterNode(ChildLink.TargetIndex, {}))\n\t\t\t{\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t}\n\n\tLogErrorWithContext(FString::Printf(\n\t\tTEXT(\"%s - FAILED because all possible start node condition failed. Edge conditions and children enter conditions from the start node are not satisfied\"),\n\t\t*ContextMessage\n\t));\n\treturn false;\n}\n\nbool UDlgContext::StartWithContextFromNode(\n\tconst FString& ContextString,\n\tUDlgDialogue* InDialogue,\n\tconst TMap<FName, UObject*>& InParticipants,\n\tint32 StartNodeIndex,\n\tconst FGuid& StartNodeGUID,\n\tconst FDlgHistory& StartHistory,\n\tbool bFireEnterEvents\n)\n{\n\tconst FString ContextMessage = ContextString.IsEmpty()\n\t\t? TEXT(\"StartFromNode\")\n\t\t: FString::Printf(TEXT(\"%s - StartFromNode\"), *ContextString);\n\n\tDialogue = InDialogue;\n\tSetParticipants(InParticipants);\n\tHistory = StartHistory;\n\tif (!ValidateParticipantsMapForDialogue(ContextMessage, Dialogue, Participants))\n\t{\n\t\treturn false;\n\t}\n\n\t// Get the StartNodeIndex from the GUID\n\tif (StartNodeGUID.IsValid())\n\t{\n\t\tStartNodeIndex = GetNodeIndexForGUID(StartNodeGUID);\n\t}\n\n\tUDlgNode* Node = GetMutableNodeFromIndex(StartNodeIndex);\n\tif (!IsValid(Node))\n\t{\n\t\tLogErrorWithContext(FString::Printf(\n\t\t\tTEXT(\"%s - FAILED because StartNodeIndex = %d  is INVALID. For StartNodeGUID = %s\"),\n\t\t\t*ContextMessage, StartNodeIndex, *StartNodeGUID.ToString()\n\t\t));\n\t\treturn false;\n\t}\n\n\tif (bFireEnterEvents)\n\t{\n\t\treturn EnterNode(StartNodeIndex, {});\n\t}\n\n\tActiveNodeIndex = StartNodeIndex;\n\tSetNodeVisited(StartNodeIndex, Node->GetGUID());\n\n\treturn Node->ReevaluateChildren(*this, {});\n}\n\nFString UDlgContext::GetContextString() const\n{\n\tFString ContextParticipants;\n\tTSet<FString> ParticipantsNames;\n\tfor (const auto& KeyValue : Participants)\n\t{\n\t\tParticipantsNames.Add(KeyValue.Key.ToString());\n\t}\n\n\treturn FString::Printf(\n\t\tTEXT(\"Dialogue = `%s`, ActiveNodeIndex = %d, Participants Names = `%s`\"),\n\t\tDialogue ? *Dialogue->GetPathName() : TEXT(\"INVALID\"),\n\t\tActiveNodeIndex,\n\t\t*FString::Join(ParticipantsNames, TEXT(\", \"))\n\t);\n}\n\nvoid UDlgContext::LogErrorWithContext(const FString& ErrorMessage) const\n{\n\tFDlgLogger::Get().Error(GetErrorMessageWithContext(ErrorMessage));\n}\n\nFString UDlgContext::GetErrorMessageWithContext(const FString& ErrorMessage) const\n{\n\treturn FString::Printf(TEXT(\"%s.\\nContext:\\n\\t%s\"), *ErrorMessage, *GetContextString());\n}\n\nEDlgValidateStatus UDlgContext::IsValidParticipantForDialogue(const UDlgDialogue* Dialogue, const UObject* Participant)\n{\n\tif (!IsValid(Participant))\n\t{\n\t\treturn EDlgValidateStatus::ParticipantIsNull;\n\t}\n\tif (!IsValid(Dialogue))\n\t{\n\t\treturn EDlgValidateStatus::DialogueIsNull;\n\t}\n\n\t// Does not implement interface\n\tif (!Participant->GetClass()->ImplementsInterface(UDlgDialogueParticipant::StaticClass()))\n\t{\n\t\tif (Participant->IsA<UBlueprint>())\n\t\t{\n\t\t\treturn EDlgValidateStatus::ParticipantIsABlueprintClassAndDoesNotImplementInterface;\n\t\t}\n\n\t\treturn EDlgValidateStatus::ParticipantDoesNotImplementInterface;\n\t}\n\n\t// We are more relaxed about this\n\t// Even if the user supplies more participants that required we still allow them to start the dialogue if the number of participants is bigger\n\n\t// Does the participant name exist in the Dialogue?\n\t// const FName ParticipantName = IDlgDialogueParticipant::Execute_GetParticipantName(Participant);\n\t// if (!Dialogue->HasParticipant(ParticipantName))\n\t// {\n\t// \treturn EDlgValidateStatus::DialogueDoesNotContainParticipant;\n\t// }\n\n\treturn EDlgValidateStatus::Valid;\n}\n\nbool UDlgContext::ValidateParticipantForDialogue(\n\tconst FString& ContextString,\n\tconst UDlgDialogue* Dialogue,\n\tconst UObject* Participant,\n\tbool bLog\n)\n{\n\tconst EDlgValidateStatus Status = IsValidParticipantForDialogue(Dialogue, Participant);\n\n\t// Act as IsValidParticipantForDialogue\n\tif (!bLog)\n\t{\n\t\treturn Status == EDlgValidateStatus::Valid;\n\t}\n\n\tswitch (Status)\n\t{\n\t\tcase EDlgValidateStatus::Valid:\n\t\t\treturn true;\n\n\t\tcase EDlgValidateStatus::DialogueIsNull:\n\t\t\tFDlgLogger::Get().Errorf(\n\t\t\t\tTEXT(\"%s - Dialogue is INVALID (not set or null).\\nContext:\\n\\tParticipant = `%s`\"),\n\t\t\t\t*ContextString, Participant ? *Participant->GetPathName() : TEXT(\"INVALID\")\n\t\t\t);\n\t\t\treturn false;\n\n\t\tcase EDlgValidateStatus::ParticipantIsNull:\n\t\t\tFDlgLogger::Get().Errorf(\n\t\t\t\tTEXT(\"%s - Participant is INVALID (not set or null).\\nContext:\\n\\tDialogue = `%s`\"),\n\t\t\t\t*ContextString, Dialogue ? *Dialogue->GetPathName() : TEXT(\"INVALID\")\n\t\t\t);\n\t\t\treturn false;\n\n\t\tcase EDlgValidateStatus::ParticipantDoesNotImplementInterface:\n\t\t\tFDlgLogger::Get().Errorf(\n\t\t\t\tTEXT(\"%s - Participant Path = `%s` does not implement the IDlgDialogueParticipant/UDlgDialogueParticipant interface.\\nContext:\\n\\tDialogue = `%s`\"),\n\t\t\t\t*ContextString, *Participant->GetPathName(), *Dialogue->GetPathName()\n\t\t\t);\n\t\t\treturn false;\n\n\t\tcase EDlgValidateStatus::ParticipantIsABlueprintClassAndDoesNotImplementInterface:\n\t\t\tFDlgLogger::Get().Errorf(\n\t\t\t\tTEXT(\"%s - Participant Path = `%s` is a Blueprint Class (from the content browser) and NOT a Blueprint Instance (from the level world).\\nContext:\\n\\tDialogue = `%s`\"),\n\t\t\t\t*ContextString, *Participant->GetPathName(), *Dialogue->GetPathName()\n\t\t\t);\n\t\t\treturn false;\n\n\t\t// case EDlgValidateStatus::DialogueDoesNotContainParticipant:\n\t //        FDlgLogger::Get().Errorf(\n\t //            TEXT(\"%s - Participant Path = `%s` with ParticipantName = `%s` is NOT referenced (DOES) not exist inside the Dialogue.\\nContext:\\n\\tDialogue = `%s`\"),\n\t //            *ContextString, *Participant->GetPathName(), *IDlgDialogueParticipant::Execute_GetParticipantName(Participant).ToString(), *Dialogue->GetPathName()\n\t //        );\n\t\t// \treturn false;\n\n\t\tdefault:\n\t\t\tFDlgLogger::Get().Errorf(TEXT(\"%s - ValidateParticipantForDialogue - Error EDlgValidateStatus Unhandled = %d\"), *ContextString, static_cast<int32>(Status));\n\t\t\treturn false;\n\t}\n}\n\nbool UDlgContext::ValidateParticipantsMapForDialogue(\n\tconst FString& ContextString,\n\tconst UDlgDialogue* Dialogue,\n\tconst TMap<FName, UObject*>& ParticipantsMap,\n\tbool bLog\n)\n{\n\tconst FString ContextMessage = ContextString.IsEmpty()\n\t\t? FString::Printf(TEXT(\"ValidateParticipantsMapForDialogue\"))\n\t\t: FString::Printf(TEXT(\"%s - ValidateParticipantsMapForDialogue\"), *ContextString);\n\n\tif (!IsValid(Dialogue))\n\t{\n\t\tif (bLog)\n\t\t{\n\t\t\tFDlgLogger::Get().Errorf(TEXT(\"%s - FAILED because the supplied Dialogue Asset is INVALID (nullptr)\"), *ContextMessage);\n\t\t}\n\t\treturn false;\n\t}\n\tif (Dialogue->GetParticipantsData().Num() == 0)\n\t{\n\t\tif (bLog)\n\t\t{\n\t\t\tFDlgLogger::Get().Errorf(TEXT(\"%s - Dialogue = `%s` does not have any participants\"), *ContextMessage, *Dialogue->GetPathName());\n\t\t}\n\t\treturn false;\n\t}\n\n\t// Check if at least these participants are required\n\tconst TMap<FName, FDlgParticipantData>& DialogueParticipants = Dialogue->GetParticipantsData();\n\tTArray<FName> ParticipantsRequiredArray;\n\tconst int32 ParticipantsNum = DialogueParticipants.GetKeys(ParticipantsRequiredArray);\n\tTSet<FName> ParticipantsRequiredSet{ParticipantsRequiredArray};\n\n\t// Iterate over Map\n\tfor (const auto& KeyValue : ParticipantsMap)\n\t{\n\t\tconst FName ParticipantName = KeyValue.Key;\n\t\tconst UObject* Participant = KeyValue.Value;\n\n\t\t// We must check this otherwise we can't get the name\n\t\tif (!ValidateParticipantForDialogue(ContextMessage, Dialogue, Participant, bLog))\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\t// Check the Map Key matches the Participant Name\n\t\t// This should only happen if you constructed the map incorrectly by mistake\n\t\t// If you used ConvertArrayOfParticipantsToMap this should have NOT happened\n\t\t{\n\t\t\tconst FName ObjectParticipantName = IDlgDialogueParticipant::Execute_GetParticipantName(Participant);\n\t\t\tif (ParticipantName != ObjectParticipantName)\n\t\t\t{\n\t\t\t\tif (bLog)\n\t\t\t\t{\n\t\t\t\t\tFDlgLogger::Get().Errorf(\n\t\t\t\t\t\tTEXT(\"%s - The Map has a KEY Participant Name = `%s` DIFFERENT to the VALUE of the Participant Path = `%s` with the Name = `%s` (KEY Participant Name != VALUE Participant Name)\"),\n\t\t\t\t\t\t*ContextMessage, *ParticipantName.ToString(), *Participant->GetPathName(), *ObjectParticipantName.ToString()\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\t// We found one participant from our set\n\t\tif (ParticipantsRequiredSet.Contains(ParticipantName))\n\t\t{\n\t\t\tParticipantsRequiredSet.Remove(ParticipantName);\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// Participant does note exist, just warn about it, we are relaxed about this\n\t\t\tif (bLog)\n\t\t\t{\n\t\t\t\tFDlgLogger::Get().Warningf(\n\t\t\t\t\tTEXT(\"%s - Participant Path = `%s` with Participant Name = `%s` is NOT referenced (DOES) not exist inside the Dialogue. It is going to be IGNORED.\\nContext:\\n\\tDialogue = `%s`\"),\n\t\t\t\t\t*ContextMessage, *Participant->GetPathName(), *ParticipantName.ToString(), *Dialogue->GetPathName()\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\n\t// Some participants are missing\n\tif (ParticipantsRequiredSet.Num() > 0)\n\t{\n\t\tif (bLog)\n\t\t{\n\t\t\tTArray<FString> ParticipantsMissing;\n\t\t\tfor (const auto Name : ParticipantsRequiredSet)\n\t\t\t{\n\t\t\t\tParticipantsMissing.Add(Name.ToString());\n\t\t\t}\n\n\t\t\tconst FString NameList = FString::Join(ParticipantsMissing, TEXT(\", \"));\n\t\t\tFDlgLogger::Get().Errorf(\n\t\t\t\tTEXT(\"%s - FAILED for Dialogue = `%s` because the following Participant Names are MISSING: `%s\"),\n\t\t\t\t*ContextMessage,  *Dialogue->GetPathName(), *NameList\n\t\t\t);\n\t\t}\n\t\treturn false;\n\t}\n\n\treturn true;\n}\n\nbool UDlgContext::ConvertArrayOfParticipantsToMap(\n\tconst FString& ContextString,\n\tconst UDlgDialogue* Dialogue,\n\tconst TArray<UObject*>& ParticipantsArray,\n\tTMap<FName, UObject*>& OutParticipantsMap,\n\tbool bLog\n)\n{\n\tconst FString ContextMessage = ContextString.IsEmpty()\n\t\t? FString::Printf(TEXT(\"ConvertArrayOfParticipantsToMap\"))\n\t\t: FString::Printf(TEXT(\"%s - ConvertArrayOfParticipantsToMap\"), *ContextString);\n\n\t// We don't allow to convert empty arrays\n\tOutParticipantsMap.Empty();\n\tif (ParticipantsArray.Num() == 0)\n\t{\n\t\tif (bLog)\n\t\t{\n\t\t\tFDlgLogger::Get().Errorf(\n\t\t\t\tTEXT(\"%s - Participants Array is EMPTY, can't convert anything. Dialogue = `%s`\"),\n\t\t\t\t*ContextMessage, Dialogue ? *Dialogue->GetPathName() : TEXT(\"INVALID\")\n\t\t\t);\n\t\t}\n\t\treturn false;\n\t}\n\n\tfor (int32 Index = 0; Index < ParticipantsArray.Num(); Index++)\n\t{\n\t\tUObject* Participant = ParticipantsArray[Index];\n\t\tconst FString ContextMessageWithIndex = FString::Printf(TEXT(\"%s - Participant at Index = %d\"), *ContextMessage,  Index);\n\n\t\t// We must check this otherwise we can't get the name\n\t\tif (!ValidateParticipantForDialogue(ContextMessageWithIndex, Dialogue, Participant, bLog))\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\t// Is Duplicate?\n\t\t// Just warn the user about it, but still continue our conversion\n\t\tconst FName ParticipantName = IDlgDialogueParticipant::Execute_GetParticipantName(Participant);\n\t\tif (OutParticipantsMap.Contains(ParticipantName))\n\t\t{\n\t\t\tif (bLog)\n\t\t\t{\n\t\t\t\tFDlgLogger::Get().Warningf(\n\t\t\t\t\tTEXT(\"%s - Participant Path = `%s`, Participant Name = `%s` already exists in the Array. Ignoring it!\"),\n\t\t\t\t\t*ContextMessageWithIndex, *Participant->GetPathName(), *ParticipantName.ToString()\n\t\t\t\t);\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\n\t\tOutParticipantsMap.Add(ParticipantName, Participant);\n\t}\n\n\treturn true;\n}\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystem/Private/DlgDialogue.cpp",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#include \"DlgDialogue.h\"\n\n#include \"UObject/DevObjectVersion.h\"\n#include \"HAL/FileManager.h\"\n#include \"Misc/Paths.h\"\n\n#if WITH_EDITOR\n#include \"EdGraph/EdGraph.h\"\n#include \"EdGraph/EdGraphSchema.h\"\n#endif\n\n#include \"DlgSystemModule.h\"\n#include \"IO/DlgConfigParser.h\"\n#include \"IO/DlgConfigWriter.h\"\n#include \"IO/DlgJsonWriter.h\"\n#include \"IO/DlgJsonParser.h\"\n#include \"Nodes/DlgNode_Speech.h\"\n#include \"Nodes/DlgNode_End.h\"\n#include \"DlgManager.h\"\n#include \"Logging/DlgLogger.h\"\n#include \"DlgHelper.h\"\n\n#define LOCTEXT_NAMESPACE \"DlgDialogue\"\n\n// Unique DlgDialogue Object version id, generated with random\nconst FGuid FDlgDialogueObjectVersion::GUID(0x2B8E5105, 0x6F66348F, 0x2A8A0B25, 0x9047A071);\n// Register Dialogue custom version with Core\nFDevVersionRegistration GRegisterDlgDialogueObjectVersion(FDlgDialogueObjectVersion::GUID,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t  FDlgDialogueObjectVersion::LatestVersion, TEXT(\"Dev-DlgDialogue\"));\n\n\n// Update dialogue up to the ConvertedNodesToUObject version\nvoid UpdateDialogueToVersion_ConvertedNodesToUObject(UDlgDialogue* Dialogue)\n{\n\t// No Longer supported, get data from text file, and reconstruct everything\n\tDialogue->InitialSyncWithTextFile();\n#if WITH_EDITOR\n\t// Force clear the old graph\n\tDialogue->ClearGraph();\n#endif\n}\n\n// Update dialogue up to the UseOnlyOneOutputAndInputPin version\nvoid UpdateDialogueToVersion_UseOnlyOneOutputAndInputPin(UDlgDialogue* Dialogue)\n{\n#if WITH_EDITOR\n\tDialogue->GetDialogueEditorAccess()->UpdateDialogueToVersion_UseOnlyOneOutputAndInputPin(Dialogue);\n#endif\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// Begin UObject interface\nvoid UDlgDialogue::PreSave(const class ITargetPlatform* TargetPlatform)\n{\n\tSuper::PreSave(TargetPlatform);\n\tName = GetDialogueFName();\n\tOnPreAssetSaved();\n}\n\nvoid UDlgDialogue::Serialize(FArchive& Ar)\n{\n\tAr.UsingCustomVersion(FDlgDialogueObjectVersion::GUID);\n\tSuper::Serialize(Ar);\n\tconst int32 DialogueVersion = Ar.CustomVer(FDlgDialogueObjectVersion::GUID);\n\tif (DialogueVersion < FDlgDialogueObjectVersion::ConvertedNodesToUObject)\n\t{\n\t\t// No Longer supported\n\t\treturn;\n\t}\n}\n\nvoid UDlgDialogue::PostLoad()\n{\n\tSuper::PostLoad();\n\tconst int32 DialogueVersion = GetLinkerCustomVersion(FDlgDialogueObjectVersion::GUID);\n\t// Old files, UDlgNode used to be a FDlgNode\n\tif (DialogueVersion < FDlgDialogueObjectVersion::ConvertedNodesToUObject)\n\t{\n\t\tUpdateDialogueToVersion_ConvertedNodesToUObject(this);\n\t}\n\n\t// Simplified and reduced the number of pins (only one input/output pin), used for the new visualization\n\tif (DialogueVersion < FDlgDialogueObjectVersion::UseOnlyOneOutputAndInputPin)\n\t{\n\t\tUpdateDialogueToVersion_UseOnlyOneOutputAndInputPin(this);\n\t}\n\n\t// Simply the number of nodes, VirtualParent Node is merged into Speech Node and SelectRandom and SelectorFirst are merged into one Selector Node\n\tif (DialogueVersion < FDlgDialogueObjectVersion::MergeVirtualParentAndSelectorTypes)\n\t{\n\t\tFDlgLogger::Get().Warningf(\n\t\t\tTEXT(\"Dialogue = `%s` with Version MergeVirtualParentAndSelectorTypes will not be converted. See https://gitlab.com/snippets/1691704 for manual conversion\"),\n\t\t\t*GetTextFilePathName()\n\t\t);\n\t}\n\n\t// Refresh the data, so that it is valid after loading.\n\tif (DialogueVersion < FDlgDialogueObjectVersion::AddTextFormatArguments ||\n\t\tDialogueVersion < FDlgDialogueObjectVersion::AddCustomObjectsToParticipantsData)\n\t{\n\t\tUpdateAndRefreshData();\n\t}\n\n\t// Create thew new GUID\n\tif (!HasGUID())\n\t{\n\t\tRegenerateGUID();\n\t\tFDlgLogger::Get().Debugf(\n\t\t\tTEXT(\"Creating new GUID = `%s` for Dialogue = `%s` because of of invalid GUID.\"),\n\t\t\t*GUID.ToString(), *GetPathName()\n\t\t);\n\t}\n\n#if WITH_EDITOR\n\tconst bool bHasDialogueEditorModule = GetDialogueEditorAccess().IsValid();\n\t// If this is false it means the graph nodes are not even created? Check for old files that were saved\n\t// before graph editor was even implemented. The editor will popup a prompt from FDialogueEditorUtilities::TryToCreateDefaultGraph\n\tif (bHasDialogueEditorModule && !GetDialogueEditorAccess()->AreDialogueNodesInSyncWithGraphNodes(this))\n\t{\n\t\treturn;\n\t}\n#endif\n\n\t// Check Nodes for validity\n\tconst int32 NodesNum = Nodes.Num();\n\tfor (int32 NodeIndex = 0; NodeIndex < NodesNum; NodeIndex++)\n\t{\n\t\tUDlgNode* Node = Nodes[NodeIndex];\n#if WITH_EDITOR\n\t\tif (bHasDialogueEditorModule)\n\t\t{\n\t\t\tcheckf(Node->GetGraphNode(), TEXT(\"Expected DialogueVersion = %d to have a valid GraphNode for Node index = %d :(\"), DialogueVersion, NodeIndex);\n\t\t}\n#endif\n\t\t// Check children point to the right Node\n\t\tconst TArray<FDlgEdge>& NodeEdges = Node->GetNodeChildren();\n\t\tconst int32 EdgesNum = NodeEdges.Num();\n\t\tfor (int32 EdgeIndex = 0; EdgeIndex < EdgesNum; EdgeIndex++)\n\t\t{\n\t\t\tconst FDlgEdge& Edge = NodeEdges[EdgeIndex];\n\t\t\tif (!Edge.IsValid())\n\t\t\t{\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (!Nodes.IsValidIndex(Edge.TargetIndex))\n\t\t\t{\n\t\t\t\tUE_LOG(\n\t\t\t\t\tLogDlgSystem,\n\t\t\t\t\tFatal,\n\t\t\t\t\tTEXT(\"Node with index = %d does not have a valid Edge index = %d with TargetIndex = %d\"),\n\t\t\t\t\tNodeIndex, EdgeIndex, Edge.TargetIndex\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\n\tbWasPostLoaded = true;\n}\n\nvoid UDlgDialogue::PostInitProperties()\n{\n\tSuper::PostInitProperties();\n\n\t// Ignore these cases\n\tif (HasAnyFlags(RF_ClassDefaultObject | RF_NeedLoad))\n\t{\n\t\treturn;\n\t}\n\n\tconst int32 DialogueVersion = GetLinkerCustomVersion(FDlgDialogueObjectVersion::GUID);\n\n#if WITH_EDITOR\n\t// Wait for the editor module to be set by the editor in UDialogueGraph constructor\n\tif (GetDialogueEditorAccess().IsValid())\n\t{\n\t\tCreateGraph();\n\t}\n#endif // #if WITH_EDITOR\n\n\t// Keep Name in sync with the file name\n\tName = GetDialogueFName();\n\n\t// Used when creating new Dialogues\n\t// Initialize with a valid GUID\n\tif (DialogueVersion >= FDlgDialogueObjectVersion::AddGUID && !HasGUID())\n\t{\n\t\tRegenerateGUID();\n\t\tFDlgLogger::Get().Debugf(\n\t\t\tTEXT(\"Creating new GUID = `%s` for Dialogue = `%s` because of new created Dialogue.\"),\n\t\t\t*GUID.ToString(), *GetPathName()\n\t\t);\n\t}\n}\n\nvoid UDlgDialogue::PostRename(UObject* OldOuter, const FName OldName)\n{\n\tSuper::PostRename(OldOuter, OldName);\n\tName = GetDialogueFName();\n}\n\nvoid UDlgDialogue::PostDuplicate(bool bDuplicateForPIE)\n{\n\tSuper::PostDuplicate(bDuplicateForPIE);\n\n\t// Used when duplicating dialogues.\n\t// Make new guid for this copied Dialogue.\n\tRegenerateGUID();\n\tFDlgLogger::Get().Debugf(\n\t\tTEXT(\"Creating new GUID = `%s` for Dialogue = `%s` because Dialogue was copied.\"),\n\t\t*GUID.ToString(), *GetPathName()\n\t);\n}\n\nvoid UDlgDialogue::PostEditImport()\n{\n\tSuper::PostEditImport();\n\n\t// Used when duplicating dialogues.\n\t// Make new guid for this copied Dialogue\n\tRegenerateGUID();\n\tFDlgLogger::Get().Debugf(\n\t\tTEXT(\"Creating new GUID = `%s` for Dialogue = `%s` because Dialogue was copied.\"),\n\t\t*GUID.ToString(), *GetPathName()\n\t);\n}\n\n#if WITH_EDITOR\nTSharedPtr<IDlgDialogueEditorAccess> UDlgDialogue::DialogueEditorAccess = nullptr;\n\nbool UDlgDialogue::Modify(bool bAlwaysMarkDirty)\n{\n\tif (!CanModify())\n\t{\n\t\treturn false;\n\t}\n\n\tconst bool bWasSaved = Super::Modify(bAlwaysMarkDirty);\n\t// if (StartNode)\n\t// {\n\t// \tbWasSaved = bWasSaved && StartNode->Modify(bAlwaysMarkDirty);\n\t// }\n\n\t// for (UDlgNode* Node : Nodes)\n\t// {\n\t// \tbWasSaved = bWasSaved && Node->Modify(bAlwaysMarkDirty);\n\t// }\n\n\treturn bWasSaved;\n}\n\nvoid UDlgDialogue::PostEditChangeProperty(FPropertyChangedEvent& PropertyChangedEvent)\n{\n\tSuper::PostEditChangeProperty(PropertyChangedEvent);\n\n\t// Signal to the listeners\n\tcheck(OnDialoguePropertyChanged.IsBound());\n\tOnDialoguePropertyChanged.Broadcast(PropertyChangedEvent);\n}\n\nvoid UDlgDialogue::PostEditChangeChainProperty(struct FPropertyChangedChainEvent& PropertyChangedEvent)\n{\n\tUpdateAndRefreshData();\n\n\tconst auto* ActiveMemberNode = PropertyChangedEvent.PropertyChain.GetActiveMemberNode();\n\tconst auto* ActivePropertyNode = PropertyChangedEvent.PropertyChain.GetActiveNode();\n\tconst FName MemberPropertyName = ActiveMemberNode && ActiveMemberNode->GetValue() ? ActiveMemberNode->GetValue()->GetFName() : NAME_None;\n\tconst FName PropertyName = ActivePropertyNode && ActivePropertyNode->GetValue() ? ActivePropertyNode->GetValue()->GetFName() : NAME_None;\n\n\t// Check if the participant UClass implements our interface\n\tif (MemberPropertyName == GET_MEMBER_NAME_CHECKED(ThisClass, ParticipantsClasses))\n\t{\n\t\tif (PropertyName == GET_MEMBER_NAME_CHECKED(FDlgParticipantClass, ParticipantClass))\n\t\t{\n\t\t\t//const int32 ArrayIndex = PropertyChangedEvent.GetArrayIndex(MemberPropertyName.ToString());\n\t\t\tfor (FDlgParticipantClass& Participant : ParticipantsClasses)\n\t\t\t{\n\t\t\t\tif (!IsValid(Participant.ParticipantClass))\n\t\t\t\t{\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tif (!Participant.ParticipantClass->ImplementsInterface(UDlgDialogueParticipant::StaticClass()))\n\t\t\t\t{\n\t\t\t\t\tParticipant.ParticipantClass = nullptr;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tSuper::PostEditChangeChainProperty(PropertyChangedEvent);\n}\n\nvoid UDlgDialogue::AddReferencedObjects(UObject* InThis, FReferenceCollector& Collector)\n{\n\t// Add the graph to the list of referenced objects\n\tUDlgDialogue* This = CastChecked<UDlgDialogue>(InThis);\n\tCollector.AddReferencedObject(This->DlgGraph, This);\n\tSuper::AddReferencedObjects(InThis, Collector);\n}\n// End UObject interface\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// Begin own functions\nvoid UDlgDialogue::CreateGraph()\n{\n\t// The Graph will only be null if this is the first time we are creating the graph for the Dialogue.\n\t// After the Dialogue asset is saved, the Dialogue will get the dialogue from the serialized uasset.\n\tif (DlgGraph != nullptr)\n\t{\n\t\treturn;\n\t}\n\n\tif (!IsValid(StartNode))\n\t{\n\t\tStartNode = ConstructDialogueNode<UDlgNode_Speech>();\n\t}\n\n\tFDlgLogger::Get().Debugf(TEXT(\"Creating graph for Dialogue = `%s`\"), *GetPathName());\n\tDlgGraph = GetDialogueEditorAccess()->CreateNewDialogueGraph(this);\n\n\t// Give the schema a chance to fill out any required nodes\n\tDlgGraph->GetSchema()->CreateDefaultNodesForGraph(*DlgGraph);\n\tMarkPackageDirty();\n}\n\nvoid UDlgDialogue::ClearGraph()\n{\n\tif (!IsValid(DlgGraph))\n\t{\n\t\treturn;\n\t}\n\n\tFDlgLogger::Get().Debugf(TEXT(\"Clearing graph for Dialogue = `%s`\"), *GetPathName());\n\tGetDialogueEditorAccess()->RemoveAllGraphNodes(this);\n\n\t// Give the schema a chance to fill out any required nodes\n\tDlgGraph->GetSchema()->CreateDefaultNodesForGraph(*DlgGraph);\n\tMarkPackageDirty();\n}\n\nvoid UDlgDialogue::CompileDialogueNodesFromGraphNodes()\n{\n\tif (!bCompileDialogue)\n\t{\n\t\treturn;\n\t}\n\n\tFDlgLogger::Get().Infof(TEXT(\"Compiling Dialogue = `%s` (Graph data -> Dialogue data)`\"), *GetPathName());\n\tGetDialogueEditorAccess()->CompileDialogueNodesFromGraphNodes(this);\n}\n#endif // #if WITH_EDITOR\n\nvoid UDlgDialogue::ImportFromFile()\n{\n\t// Simply ignore reloading\n\tconst EDlgDialogueTextFormat TextFormat = GetDefault<UDlgSystemSettings>()->DialogueTextFormat;\n\tif (TextFormat == EDlgDialogueTextFormat::None)\n\t{\n\t\tUpdateAndRefreshData();\n\t\treturn;\n\t}\n\n\tImportFromFileFormat(TextFormat);\n}\n\nvoid UDlgDialogue::ImportFromFileFormat(EDlgDialogueTextFormat TextFormat)\n{\n\tconst bool bHasExtension = UDlgSystemSettings::HasTextFileExtension(TextFormat);\n\tconst FString& TextFileName = GetTextFilePathName(TextFormat);\n\n\t// Nothing to do\n\tIFileManager& FileManager = IFileManager::Get();\n\tif (!bHasExtension)\n\t{\n\t\t// Useful For debugging\n\t\tif (TextFormat == EDlgDialogueTextFormat::All)\n\t\t{\n\t\t\t// Import from all\n\t\t\tconst int32 TextFormatsNum = static_cast<int32>(EDlgDialogueTextFormat::NumTextFormats);\n\t\t\tfor (int32 TextFormatIndex = static_cast<int32>(EDlgDialogueTextFormat::StartTextFormats);\n\t\t\t\t\t   TextFormatIndex < TextFormatsNum; TextFormatIndex++)\n\t\t\t{\n\t\t\t\tconst EDlgDialogueTextFormat CurrentTextFormat = static_cast<EDlgDialogueTextFormat>(TextFormatIndex);\n\t\t\t\tconst FString& CurrentTextFileName = GetTextFilePathName(CurrentTextFormat);\n\t\t\t\tif (FileManager.FileExists(*CurrentTextFileName))\n\t\t\t\t{\n\t\t\t\t\tImportFromFileFormat(CurrentTextFormat);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn;\n\t}\n\n\t// File does not exist abort\n\tif (!FileManager.FileExists(*TextFileName))\n\t{\n\t\tFDlgLogger::Get().Errorf(TEXT(\"Reloading data for Dialogue = `%s` FROM file = `%s` FAILED, because the file does not exist\"), *GetPathName(), *TextFileName);\n\t\treturn;\n\t}\n\n\t// Clear data first\n\tStartNode = nullptr;\n\tNodes.Empty();\n\n\t// TODO handle Name == NAME_None or invalid filename\n\tFDlgLogger::Get().Infof(TEXT(\"Reloading data for Dialogue = `%s` FROM file = `%s`\"), *GetPathName(), *TextFileName);\n\n\t// TODO(vampy): Check for errors\n\tcheck(TextFormat != EDlgDialogueTextFormat::None);\n\tswitch (TextFormat)\n\t{\n\t\tcase EDlgDialogueTextFormat::JSON:\n\t\t{\n\t\t\tFDlgJsonParser JsonParser;\n\t\t\tJsonParser.InitializeParser(TextFileName);\n\t\t\tJsonParser.ReadAllProperty(GetClass(), this, this);\n\t\t\tbreak;\n\t\t}\n\t\tcase EDlgDialogueTextFormat::DialogueDEPRECATED:\n\t\t{\n\t\t\tFDlgConfigParser Parser(TEXT(\"Dlg\"));\n\t\t\tParser.InitializeParser(TextFileName);\n\t\t\tParser.ReadAllProperty(GetClass(), this, this);\n\t\t\tbreak;\n\t\t}\n\t\tdefault:\n\t\t\tcheckNoEntry();\n\t\t\tbreak;\n\n\t}\n\n\tif (!IsValid(StartNode))\n\t{\n\t\tStartNode = ConstructDialogueNode<UDlgNode_Speech>();\n\t}\n\n\t// TODO(vampy): validate if data is legit, indicies exist and that sort.\n\t// Check if Guid is not a duplicate\n\tconst TArray<UDlgDialogue*> DuplicateDialogues = UDlgManager::GetDialoguesWithDuplicateGUIDs();\n\tif (DuplicateDialogues.Num() > 0)\n\t{\n\t\tif (DuplicateDialogues.Contains(this))\n\t\t{\n\t\t\t// found duplicate of this Dialogue\n\t\t\tRegenerateGUID();\n\t\t\tFDlgLogger::Get().Warningf(\n\t\t\t\tTEXT(\"Creating new GUID = `%s` for Dialogue = `%s` because the input file contained a duplicate GUID.\"),\n\t\t\t\t*GUID.ToString(), *GetPathName()\n\t\t\t);\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// We have bigger problems on our hands\n\t\t\tFDlgLogger::Get().Errorf(\n\t\t\t\tTEXT(\"Found Duplicate Dialogue that does not belong to this Dialogue = `%s`, DuplicateDialogues.Num = %d\"),\n\t\t\t\t*GetPathName(),  DuplicateDialogues.Num()\n\t\t\t);\n\t\t}\n\t}\n\n\tName = GetDialogueFName();\n\tAutoFixGraph();\n\tUpdateAndRefreshData(true);\n}\n\nvoid UDlgDialogue::OnPreAssetSaved()\n{\n#if WITH_EDITOR\n\t// Compile, graph data -> dialogue data\n\tCompileDialogueNodesFromGraphNodes();\n#endif\n\n\t// Save file, dialogue data -> text file (.dlg)\n\tUpdateAndRefreshData(true);\n\tExportToFile();\n}\n\nvoid UDlgDialogue::ExportToFile() const\n{\n\tconst EDlgDialogueTextFormat TextFormat = GetDefault<UDlgSystemSettings>()->DialogueTextFormat;\n\tif (TextFormat == EDlgDialogueTextFormat::None)\n\t{\n\t\t// Simply ignore saving\n\t\treturn;\n\t}\n\n\tExportToFileFormat(TextFormat);\n}\n\nvoid UDlgDialogue::ExportToFileFormat(EDlgDialogueTextFormat TextFormat) const\n{\n\t// TODO(vampy): Check for errors\n\tconst bool bHasExtension = UDlgSystemSettings::HasTextFileExtension(TextFormat);\n\tconst FString& TextFileName = GetTextFilePathName(TextFormat);\n\tif (bHasExtension)\n\t{\n\t\tFDlgLogger::Get().Infof(TEXT(\"Exporting data for Dialogue = `%s` TO file = `%s`\"), *GetPathName(), *TextFileName);\n\t}\n\n\tswitch (TextFormat)\n\t{\n\t\tcase EDlgDialogueTextFormat::JSON:\n\t\t{\n\t\t\tFDlgJsonWriter JsonWriter;\n\t\t\tJsonWriter.Write(GetClass(), this);\n\t\t\tJsonWriter.ExportToFile(TextFileName);\n\t\t\tbreak;\n\t\t}\n\t\tcase EDlgDialogueTextFormat::DialogueDEPRECATED:\n\t\t{\n\t\t\tFDlgConfigWriter DlgWriter(TEXT(\"Dlg\"));\n\t\t\tDlgWriter.Write(GetClass(), this);\n\t\t\tDlgWriter.ExportToFile(TextFileName);\n\t\t\tbreak;\n\t\t}\n\t\tcase EDlgDialogueTextFormat::All:\n\t\t{\n\t\t\t// Useful for debugging\n\t\t\t// Export to all  formats\n\t\t\tconst int32 TextFormatsNum = static_cast<int32>(EDlgDialogueTextFormat::NumTextFormats);\n\t\t\tfor (int32 TextFormatIndex = static_cast<int32>(EDlgDialogueTextFormat::StartTextFormats);\n\t\t\t\t\t   TextFormatIndex < TextFormatsNum; TextFormatIndex++)\n\t\t\t{\n\t\t\t\tconst EDlgDialogueTextFormat CurrentTextFormat = static_cast<EDlgDialogueTextFormat>(TextFormatIndex);\n\t\t\t\tExportToFileFormat(CurrentTextFormat);\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tdefault:\n\t\t\t// It Should not have any extension\n\t\t\tcheck(!bHasExtension);\n\t\t\tbreak;\n\t}\n}\n\nFDlgParticipantData& UDlgDialogue::GetParticipantDataEntry(FName ParticipantName, FName FallbackParticipantName, bool bCheckNone, const FString& ContextMessage)\n{\n\t// Used to ignore some participants\n\tstatic FDlgParticipantData BlackHoleParticipant;\n\n\t// If the Participant Name is not set, it adopts the Node Owner Name\n\tconst FName& ValidParticipantName = ParticipantName == NAME_None ? FallbackParticipantName : ParticipantName;\n\n\t// Parent/child is not valid, simply do nothing\n\tif (bCheckNone && ValidParticipantName == NAME_None)\n\t{\n\t\tFDlgLogger::Get().Warningf(\n\t\t\tTEXT(\"Ignoring ParticipantName = None, Context = `%s`. Either your node participant name is None or your participant name is None.\"),\n\t\t\t*ContextMessage\n\t\t);\n\t\treturn BlackHoleParticipant;\n\t}\n\n\treturn ParticipantsData.FindOrAdd(ValidParticipantName);\n}\n\nvoid UDlgDialogue::AddConditionsDataFromNodeEdges(const UDlgNode* Node, int32 NodeIndex)\n{\n\tconst FString NodeContext = FString::Printf(TEXT(\"Node %s\"), NodeIndex > INDEX_NONE ? *FString::FromInt(NodeIndex) : TEXT(\"Start\") );\n\tconst FName FallbackParticipantName = Node->GetNodeParticipantName();\n\n\tfor (const FDlgEdge& Edge : Node->GetNodeChildren())\n\t{\n\t\tconst int32 TargetIndex = Edge.TargetIndex;\n\n\t\tfor (const FDlgCondition& Condition : Edge.Conditions)\n\t\t{\n\t\t\tif (Condition.IsParticipantInvolved())\n\t\t\t{\n\t\t\t\tconst FString ContextMessage = FString::Printf(TEXT(\"Adding Edge primary condition data from %s to Node %d\"), *NodeContext, TargetIndex);\n\t\t\t\tGetParticipantDataEntry(Condition.ParticipantName, FallbackParticipantName, true, ContextMessage)\n\t\t\t\t\t.AddConditionPrimaryData(Condition);\n\t\t\t}\n\t\t\tif (Condition.IsSecondParticipantInvolved())\n\t\t\t{\n\t\t\t\tconst FString ContextMessage = FString::Printf(TEXT(\"Adding Edge secondary condition data from %s to Node %d\"), *NodeContext, TargetIndex);\n\t\t\t\tGetParticipantDataEntry(Condition.OtherParticipantName, FallbackParticipantName, true, ContextMessage)\n\t\t\t\t\t.AddConditionSecondaryData(Condition);\n\t\t\t}\n\t\t}\n\t}\n}\n\nvoid UDlgDialogue::RebuildAndUpdateNode(UDlgNode* Node, const UDlgSystemSettings& Settings, bool bUpdateTextsNamespacesAndKeys)\n{\n\tstatic constexpr bool bEdges = true;\n\tstatic constexpr bool bUpdateGraphNode = false;\n\n\t// Rebuild & Update\n\t// NOTE: this can do a dialogue data -> graph node data update\n\tNode->RebuildTextArguments(bEdges, bUpdateGraphNode);\n\tNode->UpdateTextsValuesFromDefaultsAndRemappings(Settings, bEdges, bUpdateGraphNode);\n\tif (bUpdateTextsNamespacesAndKeys)\n\t{\n\t\tNode->UpdateTextsNamespacesAndKeys(Settings, bEdges, bUpdateGraphNode);\n\t}\n\n\t// Sync with the editor aka bUpdateGraphNode = true\n\tNode->UpdateGraphNode();\n}\n\nvoid UDlgDialogue::UpdateAndRefreshData(bool bUpdateTextsNamespacesAndKeys)\n{\n\tFDlgLogger::Get().Infof(TEXT(\"Refreshing data for Dialogue = `%s`\"), *GetPathName());\n\n\tconst UDlgSystemSettings* Settings = GetDefault<UDlgSystemSettings>();\n\tParticipantsData.Empty();\n\tAllSpeakerStates.Empty();\n\n\t// do not forget about the edges of the Root/Start Node\n\tif (IsValid(StartNode))\n\t{\n\t\tAddConditionsDataFromNodeEdges(StartNode, INDEX_NONE);\n\t\tRebuildAndUpdateNode(StartNode, *Settings, bUpdateTextsNamespacesAndKeys);\n\t}\n\n\t// Regular Nodes\n\tconst int32 NodesNum = Nodes.Num();\n\tfor (int32 NodeIndex = 0; NodeIndex < NodesNum; NodeIndex++)\n\t{\n\t\tconst FString NodeContext = FString::Printf(TEXT(\"Node %d\"), NodeIndex);\n\t\tUDlgNode* Node = Nodes[NodeIndex];\n\t\tconst FName NodeParticipantName = Node->GetNodeParticipantName();\n\n\t\t// Rebuild & Update\n\t\tRebuildAndUpdateNode(Node, *Settings, bUpdateTextsNamespacesAndKeys);\n\n\t\t// participant names\n\t\tTArray<FName> Participants;\n\t\tNode->GetAssociatedParticipants(Participants);\n\t\tfor (const FName& Participant : Participants)\n\t\t{\n\t\t\tif (!ParticipantsData.Contains(Participant))\n\t\t\t{\n\t\t\t\tParticipantsData.Add(Participant);\n\t\t\t}\n\t\t}\n\n\t\t// gather SpeakerStates\n\t\tNode->AddAllSpeakerStatesIntoSet(AllSpeakerStates);\n\n\t\t// Conditions from nodes\n\t\tfor (const FDlgCondition& Condition : Node->GetNodeEnterConditions())\n\t\t{\n\t\t\tif (Condition.IsParticipantInvolved())\n\t\t\t{\n\t\t\t\tconst FString ContextMessage = FString::Printf(TEXT(\"Adding primary condition data for %s\"), *NodeContext);\n\t\t\t\tGetParticipantDataEntry(Condition.ParticipantName, NodeParticipantName, true, ContextMessage)\n\t\t\t\t\t.AddConditionPrimaryData(Condition);\n\t\t\t}\n\t\t\tif (Condition.IsSecondParticipantInvolved())\n\t\t\t{\n\t\t\t\tconst FString ContextMessage = FString::Printf(TEXT(\"Adding secondary condition data for %s\"), *NodeContext);\n\t\t\t\tGetParticipantDataEntry(Condition.OtherParticipantName, NodeParticipantName, true, ContextMessage)\n\t\t\t\t\t.AddConditionSecondaryData(Condition);\n\t\t\t}\n\t\t}\n\n\t\t// Gather Edge Data\n\t\tAddConditionsDataFromNodeEdges(Node, NodeIndex);\n\n\t\t// Walk over edges of speaker nodes\n\t\t// NOTE: for speaker sequence nodes, the inner edges are handled by AddAllSpeakerStatesIntoSet\n\t\t// so no need to special case handle it\n\t\tconst int32 NumNodeChildren = Node->GetNumNodeChildren();\n\t\tfor (int32 EdgeIndex = 0; EdgeIndex < NumNodeChildren; EdgeIndex++)\n\t\t{\n\t\t\tconst FDlgEdge& Edge = Node->GetNodeChildAt(EdgeIndex);\n\t\t\tconst int32 TargetIndex = Edge.TargetIndex;\n\n\t\t\t// Speaker states\n\t\t\tAllSpeakerStates.Add(Edge.SpeakerState);\n\n\t\t\t// Text arguments are rebuild from the Node\n\t\t\tfor (const FDlgTextArgument& TextArgument : Edge.GetTextArguments())\n\t\t\t{\n\t\t\t\tconst FString ContextMessage = FString::Printf(TEXT(\"Adding Edge text arguments data from %s, to Node %d\"), *NodeContext, TargetIndex);\n\t\t\t\tGetParticipantDataEntry(TextArgument.ParticipantName, NodeParticipantName, true, ContextMessage)\n\t\t\t\t\t.AddTextArgumentData(TextArgument);\n\t\t\t}\n\t\t}\n\n\t\t// Events\n\t\tfor (const FDlgEvent& Event : Node->GetNodeEnterEvents())\n\t\t{\n\t\t\tconst FString ContextMessage = FString::Printf(TEXT(\"Adding events data for %s\"), *NodeContext);\n\t\t\tGetParticipantDataEntry(Event.ParticipantName, NodeParticipantName, true, ContextMessage)\n\t\t\t\t.AddEventData(Event);\n\t\t}\n\n\t\t// Text arguments\n\t\tfor (const FDlgTextArgument& TextArgument : Node->GetTextArguments())\n\t\t{\n\t\t\tconst FString ContextMessage = FString::Printf(TEXT(\"Adding text arguments data for %s\"), *NodeContext);\n\t\t\tGetParticipantDataEntry(TextArgument.ParticipantName, NodeParticipantName, true, ContextMessage)\n\t\t\t\t.AddTextArgumentData(TextArgument);\n\t\t}\n\t}\n\n\t// Remove default values\n\tAllSpeakerStates.Remove(FName(NAME_None));\n\n\t//\n\t// Fill ParticipantClasses\n\t//\n\tTSet<FName> Participants;\n\tGetAllParticipantNames(Participants);\n\n\t// 1. remove outdated entries\n\tfor (int32 Index = ParticipantsClasses.Num() - 1; Index >= 0; --Index)\n\t{\n\t\tconst FName ExaminedName = ParticipantsClasses[Index].ParticipantName;\n\t\tif (!Participants.Contains(ExaminedName) || ExaminedName.IsNone())\n\t\t{\n\t\t\tParticipantsClasses.RemoveAtSwap(Index);\n\t\t}\n\n\t\tParticipants.Remove(ExaminedName);\n\t}\n\n\t// 2. add new entries\n\tfor (const FName Participant : Participants)\n\t{\n\t\tif (Participant != NAME_None)\n\t\t{\n\t\t\tParticipantsClasses.Add({ Participant, nullptr });\n\t\t}\n\t\telse\n\t\t{\n\t\t\tFDlgLogger::Get().Warning(TEXT(\"Trying to fill ParticipantsClasses, got a Participant name = None. Ignoring!\"));\n\t\t}\n\t}\n\n\t// 3. Set auto default participant classes\n\tif (bWasPostLoaded && Settings->bAutoSetDefaultParticipantClasses)\n\t{\n\t\tTArray<UClass*> NativeClasses;\n\t\tTArray<UClass*> BlueprintClasses;\n\t\tFDlgHelper::GetAllClassesImplementingInterface(UDlgDialogueParticipant::StaticClass(), NativeClasses, BlueprintClasses);\n\n\t\tconst TMap<FName, TArray<FDlgClassAndObject>> NativeClassesMap = FDlgHelper::ConvertDialogueParticipantsClassesIntoMap(NativeClasses);\n\t\tconst TMap<FName, TArray<FDlgClassAndObject>> BlueprintClassesMap = FDlgHelper::ConvertDialogueParticipantsClassesIntoMap(BlueprintClasses);\n\n\t\tfor (FDlgParticipantClass& Struct : ParticipantsClasses)\n\t\t{\n\t\t\t// Participant Name is not set or Class is set, ignore\n\t\t\tif (Struct.ParticipantName == NAME_None || Struct.ParticipantClass != nullptr)\n\t\t\t{\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Blueprint\n\t\t\tif (BlueprintClassesMap.Contains(Struct.ParticipantName))\n\t\t\t{\n\t\t\t\tconst TArray<FDlgClassAndObject>& Array = BlueprintClassesMap.FindChecked(Struct.ParticipantName);\n\t\t\t\tif (Array.Num() == 1)\n\t\t\t\t{\n\t\t\t\t\tStruct.ParticipantClass = Array[0].Class;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Native last resort\n\t\t\tif (Struct.ParticipantClass == nullptr && NativeClassesMap.Contains(Struct.ParticipantName))\n\t\t\t{\n\t\t\t\tconst TArray<FDlgClassAndObject>& Array = NativeClassesMap.FindChecked(Struct.ParticipantName);\n\t\t\t\tif (Array.Num() == 1)\n\t\t\t\t{\n\t\t\t\t\tStruct.ParticipantClass = Array[0].Class;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nFGuid UDlgDialogue::GetNodeGUIDForIndex(int32 NodeIndex) const\n{\n\tif (IsValidNodeIndex(NodeIndex))\n\t{\n\t\treturn Nodes[NodeIndex]->GetGUID();\n\t}\n\n\t// Invalid GUID\n\treturn FGuid{};\n}\n\nint32 UDlgDialogue::GetNodeIndexForGUID(const FGuid& NodeGUID) const\n{\n\tif (const int32* NodeIndexPtr = NodesGUIDToIndexMap.Find(NodeGUID))\n\t{\n\t\treturn *NodeIndexPtr;\n\t}\n\n\treturn INDEX_NONE;\n}\n\nvoid UDlgDialogue::SetStartNode(UDlgNode* InStartNode)\n{\n\tif (!InStartNode)\n\t{\n\t\treturn;\n\t}\n\n\tStartNode = InStartNode;\n\t// UpdateGUIDToIndexMap(StartNode, INDEX_NONE);\n}\n\nvoid UDlgDialogue::SetNodes(const TArray<UDlgNode*>& InNodes)\n{\n\tNodes = InNodes;\n\tfor (int32 NodeIndex = 0; NodeIndex < Nodes.Num(); NodeIndex++)\n\t{\n\t\tUpdateGUIDToIndexMap(Nodes[NodeIndex], NodeIndex);\n\t}\n}\n\nvoid UDlgDialogue::SetNode(int32 NodeIndex, UDlgNode* InNode)\n{\n\tif (!IsValidNodeIndex(NodeIndex) || !InNode)\n\t{\n\t\treturn;\n\t}\n\n\tNodes[NodeIndex] = InNode;\n\tUpdateGUIDToIndexMap(InNode, NodeIndex);\n}\n\nvoid UDlgDialogue::UpdateGUIDToIndexMap(const UDlgNode* Node, int32 NodeIndex)\n{\n\tif (!Node || !IsValidNodeIndex(NodeIndex) || !Node->HasGUID())\n\t{\n\t\treturn;\n\t}\n\n\tNodesGUIDToIndexMap.Add(Node->GetGUID(), NodeIndex);\n}\n\nbool UDlgDialogue::IsEndNode(int32 NodeIndex) const\n{\n\tif (!Nodes.IsValidIndex(NodeIndex))\n\t{\n\t\treturn false;\n\t}\n\n\treturn Nodes[NodeIndex]->IsA<UDlgNode_End>();\n}\n\nvoid UDlgDialogue::AutoFixGraph()\n{\n\tcheck(StartNode);\n\t// syntax correction 1: if there is no start node, we create one pointing to the first node\n\tif (StartNode->GetNodeChildren().Num() == 0 && Nodes.Num() > 0)\n\t{\n\t\tStartNode->AddNodeChild({ 0 });\n\t}\n\tStartNode->SetFlags(RF_Transactional);\n\n\t// syntax correction 2: if there is no end node, we add one\n\tbool bHasEndNode = false;\n\t// check if the end node is already there\n\tfor (UDlgNode* Node : Nodes)\n\t{\n\t\tcheck(Node);\n\t\tNode->SetFlags(RF_Transactional);\n\t\tif (Node->IsA<UDlgNode_End>())\n\t\t{\n\t\t\tbHasEndNode = true;\n\t\t\tbreak;\n\t\t}\n\t}\n\t// add it if not\n\tif (!bHasEndNode && Nodes.Num() > 0)\n\t{\n\t\tauto* EndNode = ConstructDialogueNode<UDlgNode_End>();\n\t\tEndNode->SetNodeParticipantName(Nodes[0]->GetNodeParticipantName());\n\t\tNodes.Add(EndNode);\n\t}\n\n\t// syntax correction 3: if a node is not an end node but has no children it will \"adopt\" the next node\n\tconst UDlgSystemSettings* Settings = GetDefault<UDlgSystemSettings>();\n\tfor (int32 i = 0; i < Nodes.Num() - 1; ++i)\n\t{\n\t\tUDlgNode* Node = Nodes[i];\n\t\tconst TArray<FDlgEdge>& NodeChildren = Node->GetNodeChildren();\n\n\t\tif (!Node->IsA<UDlgNode_End>() && NodeChildren.Num() == 0)\n\t\t{\n\t\t\tNode->AddNodeChild({ i + 1 });\n\t\t}\n\n\t\t// Add some text to the edges.\n\t\tNode->UpdateTextsValuesFromDefaultsAndRemappings(*Settings, true, true);\n\t}\n}\n\nFString UDlgDialogue::GetTextFilePathName(bool bAddExtension/* = true*/) const\n{\n\treturn GetTextFilePathName(GetDefault<UDlgSystemSettings>()->DialogueTextFormat, bAddExtension);\n}\n\nFString UDlgDialogue::GetTextFilePathName(EDlgDialogueTextFormat TextFormat, bool bAddExtension/* = true*/) const\n{\n\t\t// Extract filename from path\n\t// NOTE: this is not a filesystem path, it is an unreal path 'Outermost.[Outer:]Name'\n\t// Usually GetPathName works, but the path name might be weird.\n\t// FSoftObjectPath(this).ToString(); which does call this function GetPathName() but it returns a legit clean path\n\t// if it is in the wrong format\n\tFString TextFileName = GetTextFilePathNameFromAssetPathName(FSoftObjectPath(this).ToString());\n\tif (bAddExtension)\n\t{\n\t\t// Modify the extension of the base text file depending on the extension\n\t\tTextFileName += UDlgSystemSettings::GetTextFileExtension(TextFormat);\n\t}\n\n\treturn TextFileName;\n}\n\nbool UDlgDialogue::DeleteTextFileForTextFormat(EDlgDialogueTextFormat TextFormat) const\n{\n\treturn DeleteTextFileForExtension(UDlgSystemSettings::GetTextFileExtension(TextFormat));\n}\n\nbool UDlgDialogue::DeleteTextFileForExtension(const FString& FileExtension) const\n{\n\tconst FString TextFilePathName = GetTextFilePathName(false);\n\tif (TextFilePathName.IsEmpty())\n\t{\n\t\t// Memory corruption? tread carefully here\n\t\tFDlgLogger::Get().Errorf(\n\t\t\tTEXT(\"Can't delete text file for Dialogue = `%s` because the file path name is empty :O\"),\n\t\t\t*GetPathName()\n\t\t);\n\t\treturn false;\n\t}\n\n\tconst FString FullPathName = TextFilePathName + FileExtension;\n\treturn FDlgHelper::DeleteFile(FullPathName);\n}\n\nbool UDlgDialogue::DeleteAllTextFiles() const\n{\n\tbool bStatus = true;\n\tfor (const FString& FileExtension : GetDefault<UDlgSystemSettings>()->GetAllTextFileExtensions())\n\t{\n\t\tbStatus &= DeleteTextFileForExtension(FileExtension);\n\t}\n\treturn bStatus;\n}\n\nbool UDlgDialogue::IsInProjectDirectory() const\n{\n\treturn FDlgHelper::IsPathInProjectDirectory(GetPathName());\n}\n\nFString UDlgDialogue::GetTextFilePathNameFromAssetPathName(const FString& AssetPathName)\n{\n\tstatic const TCHAR* Separator = TEXT(\"/\");\n\n\t// Get rid of the extension from `filename.extension` from the end of the path\n\tFString PathName = FPaths::GetBaseFilename(AssetPathName, false);\n\n\t// Get rid of the first folder, Game/ or Name/ (if in the plugins dir) from the beginning of the path.\n\t// Are we in the game directory?\n\tFString ContentDir = FPaths::ProjectContentDir();\n\tif (!PathName.RemoveFromStart(TEXT(\"/Game/\")))\n\t{\n\t\t// We are in the plugins dir\n\t\tTArray<FString> PathParts;\n\t\tPathName.ParseIntoArray(PathParts, Separator);\n\t\tif (PathParts.Num() > 0)\n\t\t{\n\t\t\tconst FString PluginName = PathParts[0];\n\t\t\tconst FString PluginDir = FPaths::ProjectPluginsDir() / PluginName;\n\n\t\t\t// Plugin exists\n\t\t\tif (FPaths::DirectoryExists(PluginDir))\n\t\t\t{\n\t\t\t\tContentDir = PluginDir / TEXT(\"Content/\");\n\t\t\t}\n\n\t\t\t// remove plugin name\n\t\t\tPathParts.RemoveAt(0);\n\t\t\tPathName = FString::Join(PathParts, Separator);\n\t\t}\n\t}\n\n\treturn ContentDir + PathName;\n}\n\n\n// End own functions\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n#undef LOCTEXT_NAMESPACE\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystem/Private/DlgDialogueParticipantData.cpp",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#include \"DlgDialogueParticipantData.h\"\n\n#include \"UObject/DevObjectVersion.h\"\n\n#include \"DlgEvent.h\"\n#include \"DlgCondition.h\"\n#include \"DlgTextArgument.h\"\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FDlgParticipantData::AddConditionPrimaryData(const FDlgCondition& Condition)\n{\n\tconst EDlgConditionType ConditionType = Condition.ConditionType;\n\tconst FName ConditionName = Condition.CallbackName;\n\n\tswitch (ConditionType)\n\t{\n\t\tcase EDlgConditionType::EventCall:\n\t\t\tConditions.Add(ConditionName);\n\t\t\tbreak;\n\n\t\tcase EDlgConditionType::IntCall:\n\t\t\tIntVariableNames.Add(ConditionName);\n\t\t\tbreak;\n\t\tcase EDlgConditionType::FloatCall:\n\t\t\tFloatVariableNames.Add(ConditionName);\n\t\t\tbreak;\n\t\tcase EDlgConditionType::BoolCall:\n\t\t\tBoolVariableNames.Add(ConditionName);\n\t\t\tbreak;\n\t\tcase EDlgConditionType::NameCall:\n\t\t\tNameVariableNames.Add(ConditionName);\n\t\t\tbreak;\n\n\t\tcase EDlgConditionType::ClassIntVariable:\n\t\t\tClassIntVariableNames.Add(ConditionName);\n\t\t\tbreak;\n\t\tcase EDlgConditionType::ClassFloatVariable:\n\t\t\tClassFloatVariableNames.Add(ConditionName);\n\t\t\tbreak;\n\t\tcase EDlgConditionType::ClassBoolVariable:\n\t\t\tClassBoolVariableNames.Add(ConditionName);\n\t\t\tbreak;\n\t\tcase EDlgConditionType::ClassNameVariable:\n\t\t\tClassNameVariableNames.Add(ConditionName);\n\t\t\tbreak;\n\n\t\tcase EDlgConditionType::Custom:\n\t\t\tif (Condition.CustomCondition)\n\t\t\t{\n\t\t\t\tCustomConditions.Add(Condition.CustomCondition->GetClass());\n\t\t\t}\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tbreak;\n\t}\n}\n\nvoid FDlgParticipantData::AddConditionSecondaryData(const FDlgCondition& Condition)\n{\n\tconst FName VariableName = Condition.OtherVariableName;\n\tif (Condition.CompareType != EDlgCompare::ToConst)\n\t{\n\t\tconst bool bClassVariable = Condition.CompareType == EDlgCompare::ToClassVariable;\n\t\tswitch (Condition.ConditionType)\n\t\t{\n\t\tcase EDlgConditionType::IntCall:\n\t\tcase EDlgConditionType::ClassIntVariable:\n\t\t\t(bClassVariable ? ClassIntVariableNames : IntVariableNames).Add(VariableName);\n\t\t\tbreak;\n\n\t\tcase EDlgConditionType::FloatCall:\n\t\tcase EDlgConditionType::ClassFloatVariable:\n\t\t\t(bClassVariable ? ClassFloatVariableNames : FloatVariableNames).Add(VariableName);\n\t\t\tbreak;\n\n\t\tcase EDlgConditionType::BoolCall:\n\t\tcase EDlgConditionType::ClassBoolVariable:\n\t\t\t(bClassVariable ? ClassBoolVariableNames : BoolVariableNames).Add(VariableName);\n\t\t\tbreak;\n\t\tcase EDlgConditionType::NameCall:\n\t\tcase EDlgConditionType::ClassNameVariable:\n\t\t\t(bClassVariable ? ClassNameVariableNames : NameVariableNames).Add(VariableName);\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tbreak;\n\t\t}\n\t}\n}\n\nvoid FDlgParticipantData::AddEventData(const FDlgEvent& Event)\n{\n\tswitch (Event.EventType)\n\t{\n\t\tcase EDlgEventType::Event:\n\t\t\tEvents.Add(Event.EventName);\n\t\t\tbreak;\n\n\t\tcase EDlgEventType::ModifyInt:\n\t\t\tIntVariableNames.Add(Event.EventName);\n\t\t\tbreak;\n\t\tcase EDlgEventType::ModifyFloat:\n\t\t\tFloatVariableNames.Add(Event.EventName);\n\t\t\tbreak;\n\t\tcase EDlgEventType::ModifyBool:\n\t\t\tBoolVariableNames.Add(Event.EventName);\n\t\t\tbreak;\n\t\tcase EDlgEventType::ModifyName:\n\t\t\tNameVariableNames.Add(Event.EventName);\n\t\t\tbreak;\n\n\t\tcase EDlgEventType::ModifyClassIntVariable:\n\t\t\tClassIntVariableNames.Add(Event.EventName);\n\t\t\tbreak;\n\t\tcase EDlgEventType::ModifyClassFloatVariable:\n\t\t\tClassFloatVariableNames.Add(Event.EventName);\n\t\t\tbreak;\n\t\tcase EDlgEventType::ModifyClassBoolVariable:\n\t\t\tClassBoolVariableNames.Add(Event.EventName);\n\t\t\tbreak;\n\t\tcase EDlgEventType::ModifyClassNameVariable:\n\t\t\tClassNameVariableNames.Add(Event.EventName);\n\t\t\tbreak;\n\n\t\tcase EDlgEventType::Custom:\n\t\t\tif (Event.CustomEvent)\n\t\t\t{\n\t\t\t\tCustomEvents.Add(Event.CustomEvent->GetClass());\n\t\t\t}\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tbreak;\n\t}\n}\n\nvoid FDlgParticipantData::AddTextArgumentData(const FDlgTextArgument& TextArgument)\n{\n\tswitch (TextArgument.Type)\n\t{\n\t\tcase EDlgTextArgumentType::DialogueInt:\n\t\t\tIntVariableNames.Add(TextArgument.VariableName);\n\t\t\tbreak;\n\t\tcase EDlgTextArgumentType::DialogueFloat:\n\t\t\tFloatVariableNames.Add(TextArgument.VariableName);\n\n\t\tcase EDlgTextArgumentType::ClassInt:\n\t\t\tClassIntVariableNames.Add(TextArgument.VariableName);\n\t\t\tbreak;\n\t\tcase EDlgTextArgumentType::ClassFloat:\n\t\t\tClassFloatVariableNames.Add(TextArgument.VariableName);\n\t\t\tbreak;\n\t\tcase EDlgTextArgumentType::ClassText:\n\t\t\tClassTextVariableNames.Add(TextArgument.VariableName);\n\t\t\tbreak;\n\n\t\tcase EDlgTextArgumentType::Custom:\n\t\t\tif (TextArgument.CustomTextArgument)\n\t\t\t{\n\t\t\t\tCustomTextArguments.Add(TextArgument.CustomTextArgument->GetClass());\n\t\t\t}\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tbreak;\n\t}\n}\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystem/Private/DlgEdge.cpp",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#include \"DlgEdge.h\"\n\n#include \"DlgConstants.h\"\n#include \"DlgContext.h\"\n#include \"DlgLocalizationHelper.h\"\n#include \"Nodes/DlgNode_Selector.h\"\n#include \"Nodes/DlgNode_Speech.h\"\n\nbool FDlgEdge::IsTextVisible(const UDlgNode& ParentNode)\n{\n\t// Selector node\n\tif (ParentNode.IsA<UDlgNode_Selector>())\n\t{\n\t\treturn false;\n\t}\n\n\t// Virtual parent node\n\tif (const UDlgNode_Speech* Node = Cast<UDlgNode_Speech>(&ParentNode))\n\t{\n\t\tif (Node->IsVirtualParent())\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t}\n\n\treturn true;\n}\n\nvoid FDlgEdge::UpdateTextValueFromDefaultAndRemapping(\n\tconst UDlgDialogue& ParentDialogue,\n\tconst UDlgNode& ParentNode,\n\tconst UDlgSystemSettings& Settings,\n\tbool bUpdateFromRemapping\n)\n{\n\tif (!IsValid())\n\t{\n\t\treturn;\n\t}\n\n\t// Clear the current text as it won't be visible anyways\n\tif (!IsTextVisible(ParentNode))\n\t{\n\t\tSetText(FText::GetEmpty());\n\t\treturn;\n\t}\n\n\tif (Settings.bSetDefaultEdgeTexts)\n\t{\n\t\t// Only if empty\n\t\tif (GetUnformattedText().IsEmpty())\n\t\t{\n\t\t\tif (ParentDialogue.IsEndNode(TargetIndex))\n\t\t\t{\n\t\t\t\t// End Node\n\t\t\t\tSetText(Settings.DefaultTextEdgeToEndNode);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t// Normal node\n\t\t\t\tSetText(Settings.DefaultTextEdgeToNormalNode);\n\t\t\t}\n\t\t}\n\t}\n\n\t// Update text remapping\n\tif (bUpdateFromRemapping)\n\t{\n\t\tFDlgLocalizationHelper::UpdateTextFromRemapping(Settings, Text);\n\t}\n}\n\nvoid FDlgEdge::UpdateTextsNamespacesAndKeys(const UObject* ParentObject, const UDlgSystemSettings& Settings)\n{\n\tif (!IsValid())\n\t{\n\t\treturn;\n\t}\n\n\tFDlgLocalizationHelper::UpdateTextNamespaceAndKey(ParentObject, Settings, Text);\n}\n\nbool FDlgEdge::Evaluate(const UDlgContext& Context, TSet<const UDlgNode*> AlreadyVisitedNodes) const\n{\n\tif (!IsValid())\n\t{\n\t\treturn false;\n\t}\n\n\t// Check target node enter conditions\n\tif (!Context.IsNodeEnterable(TargetIndex, AlreadyVisitedNodes))\n\t{\n\t\treturn false;\n\t}\n\n\t// Check this edge conditions\n\treturn FDlgCondition::EvaluateArray(Context, Conditions);\n}\n\nvoid FDlgEdge::RebuildConstructedText(const UDlgContext& Context, FName FallbackParticipantName)\n{\n\tif (TextArguments.Num() <= 0)\n\t{\n\t\treturn;\n\t}\n\n\tFFormatNamedArguments OrderedArguments;\n\tfor (const FDlgTextArgument& DlgArgument : TextArguments)\n\t{\n\t\tOrderedArguments.Add(DlgArgument.DisplayString, DlgArgument.ConstructFormatArgumentValue(Context, FallbackParticipantName));\n\t}\n\tConstructedText = FText::AsCultureInvariant(FText::Format(Text, OrderedArguments));\n}\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystem/Private/DlgEvent.cpp",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#include \"DlgEvent.h\"\n\n#include \"DlgConstants.h\"\n#include \"DlgContext.h\"\n#include \"NYReflectionHelper.h\"\n#include \"DlgDialogueParticipant.h\"\n#include \"DlgHelper.h\"\n#include \"Logging/DlgLogger.h\"\n\nvoid FDlgEvent::Call(UDlgContext& Context, const FString& ContextString, UObject* Participant) const\n{\n\tconst bool bHasParticipant = ValidateIsParticipantValid(\n\t\tContext,\n\t\tFString::Printf(TEXT(\"%s::Call\"), *ContextString),\n\t\tParticipant\n\t);\n\n\t// We don't care if it has a participant, but warn nonetheless by calling validate it before this\n\tif (EventType == EDlgEventType::Custom)\n\t{\n\t\tif (CustomEvent == nullptr)\n\t\t{\n\t\t\tFDlgLogger::Get().Warningf(\n\t\t\t\tTEXT(\"Custom Event is empty (not valid). Ignoring. Context:\\n\\t%s, Participant = %s\"),\n\t\t\t\t*Context.GetContextString(), Participant ? *Participant->GetPathName() : TEXT(\"INVALID\")\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\tCustomEvent->EnterEvent(&Context, Participant);\n\t\treturn;\n\t}\n\n\t// Must have participant from this point onwards\n\tif (MustHaveParticipant() && !bHasParticipant)\n\t{\n\t\treturn;\n\t}\n\tswitch (EventType)\n\t{\n\t\tcase EDlgEventType::Event:\n\t\t\tIDlgDialogueParticipant::Execute_OnDialogueEvent(Participant, &Context, EventName);\n\t\t\tbreak;\n\n\t\tcase EDlgEventType::ModifyInt:\n\t\t\tIDlgDialogueParticipant::Execute_ModifyIntValue(Participant, EventName, bDelta, IntValue);\n\t\t\tbreak;\n\t\tcase EDlgEventType::ModifyFloat:\n\t\t\tIDlgDialogueParticipant::Execute_ModifyFloatValue(Participant, EventName, bDelta, FloatValue);\n\t\t\tbreak;\n\t\tcase EDlgEventType::ModifyBool:\n\t\t\tIDlgDialogueParticipant::Execute_ModifyBoolValue(Participant, EventName, bValue);\n\t\t\tbreak;\n\t\tcase EDlgEventType::ModifyName:\n\t\t\tIDlgDialogueParticipant::Execute_ModifyNameValue(Participant, EventName, NameValue);\n\t\t\tbreak;\n\n\t\tcase EDlgEventType::ModifyClassIntVariable:\n\t\t\tFNYReflectionHelper::ModifyVariable<FNYIntProperty>(Participant, EventName, IntValue, bDelta);\n\t\t\tbreak;\n\t\tcase EDlgEventType::ModifyClassFloatVariable:\n\t\t\tFNYReflectionHelper::ModifyVariable<FNYFloatProperty>(Participant, EventName, FloatValue, bDelta);\n\t\t\tbreak;\n\t\tcase EDlgEventType::ModifyClassBoolVariable:\n\t\t\tFNYReflectionHelper::SetVariable<FNYBoolProperty>(Participant, EventName, bValue);\n\t\t\tbreak;\n\t\tcase EDlgEventType::ModifyClassNameVariable:\n\t\t\tFNYReflectionHelper::SetVariable<FNYNameProperty>(Participant, EventName, NameValue);\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tcheckNoEntry();\n\t}\n}\n\nbool FDlgEvent::ValidateIsParticipantValid(const UDlgContext& Context, const FString& ContextString, const UObject* Participant) const\n{\n\tif (IsValid(Participant))\n\t{\n\t\treturn true;\n\t}\n\n\tif (MustHaveParticipant())\n\t{\n\t\tFDlgLogger::Get().Errorf(\n\t\t\tTEXT(\"%s - Event FAILED because the PARTICIPANT is INVALID. \\nContext:\\n\\t%s, \\n\\tParticipantName = %s, EventType = %s, EventName = %s, CustomEvent = %s\"),\n\t\t\t*ContextString, *Context.GetContextString(), *ParticipantName.ToString(), *EventTypeToString(EventType), *EventName.ToString(), *GetCustomEventName()\n\t\t);\n\t}\n\telse\n\t{\n\t\tFDlgLogger::Get().Warningf(\n\t\t\tTEXT(\"%s - Event WARNING because the PARTICIPANT is INVALID. The call will NOT FAIL, but the participant is not present. \\nContext:\\n\\t%s, \\n\\tParticipantName = %s, EventType = %s, EventName = %s, CustomEvent = %s\"),\n\t\t\t*ContextString, *Context.GetContextString(), *ParticipantName.ToString(), *EventTypeToString(EventType), *EventName.ToString(), *GetCustomEventName()\n\t\t);\n\t}\n\n\treturn false;\n}\n\nFString FDlgEvent::EventTypeToString(EDlgEventType Type)\n{\n\tFString EnumValue;\n\tFDlgHelper::ConvertEnumToString<EDlgEventType>(TEXT(\"EDlgEventType\"), Type, false, EnumValue);\n\treturn EnumValue;\n}\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystem/Private/DlgHelper.cpp",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#include \"DlgHelper.h\"\n\n#include \"DlgDialogueParticipant.h\"\n#include \"HAL/FileManager.h\"\n#include \"Engine/Blueprint.h\"\n#include \"Logging/DlgLogger.h\"\n#include \"DlgSystemSettings.h\"\n#include \"Engine/BlueprintGeneratedClass.h\"\n#include \"Misc/Paths.h\"\n#include \"UObject/UObjectIterator.h\"\n\nbool FDlgHelper::DeleteFile(const FString& PathName, bool bVerbose)\n{\n\tIFileManager& FileManager = IFileManager::Get();\n\n\t// Text file does not exist, ignore\n\tif (!FileManager.FileExists(*PathName))\n\t{\n\t\tif (bVerbose)\n\t\t{\n\t\t\tFDlgLogger::Get().Debugf(TEXT(\"File does not exist at path = `%s`. Can't delete.\"), *PathName);\n\t\t}\n\t\treturn false;\n\t}\n\n\t// Delete the text file\n\tif (!FileManager.Delete(*PathName))\n\t{\n\t\tif (bVerbose)\n\t\t{\n\t\t\tFDlgLogger::Get().Errorf(TEXT(\"Can't delete file at path = `%s`\"), *PathName);\n\t\t}\n\t\treturn false;\n\t}\n\n\tif (bVerbose)\n\t{\n\t\tFDlgLogger::Get().Infof(TEXT(\"Deleted file %s\"), *PathName);\n\t}\n\treturn true;\n}\n\nbool FDlgHelper::RenameFile(const FString& OldPathName, const FString& NewPathName, bool bOverWrite, bool bVerbose)\n{\n\tIFileManager& FileManager = IFileManager::Get();\n\n\t//  File we want to rename does not exist anymore\n\tif (!FileManager.FileExists(*OldPathName))\n\t{\n\t\tif (bVerbose)\n\t\t{\n\t\t\tFDlgLogger::Get().Debugf(TEXT(\"File before rename at path = `%s` does not exist. Can't Rename.\"), *OldPathName);\n\t\t}\n\t\treturn false;\n\t}\n\n\t// File at destination already exists, conflict :/\n\tif (!bOverWrite && FileManager.FileExists(*NewPathName))\n\t{\n\t\tif (bVerbose)\n\t\t{\n\t\t\tFDlgLogger::Get().Errorf(\n\t\t\t\tTEXT(\"File at destination (after rename) at path = `%s` already exists. Current text file at path = `%s` won't be moved/renamed.\"),\n\t\t\t\t*NewPathName, *OldPathName\n\t\t\t);\n\t\t}\n\t\treturn false;\n\t}\n\n\t// Finally Move/Rename\n\tif (!FileManager.Move(/*Dest=*/ *NewPathName, /*Src=*/ *OldPathName, /*bReplace=*/ bOverWrite))\n\t{\n\t\tif (bVerbose)\n\t\t{\n\t\t\tFDlgLogger::Get().Errorf(TEXT(\"Failure to move/rename file from `%s` to `%s`\"), *OldPathName, *NewPathName);\n\t\t}\n\t\treturn false;\n\t}\n\n\tif (bVerbose)\n\t{\n\t\tFDlgLogger::Get().Infof(TEXT(\"Text file moved/renamed from `%s` to `%s`\"), *OldPathName, *NewPathName);\n\t}\n\treturn true;\n}\n\nFString FDlgHelper::CleanObjectName(FString Name)\n{\n\tName.RemoveFromEnd(TEXT(\"_C\"));\n\n\t// Get rid of the extension from `filename.extension` from the end of the path\n\tstatic constexpr bool bRemovePath = false;\n\tName = FPaths::GetBaseFilename(Name, bRemovePath);\n\n\treturn Name;\n}\n\nbool FDlgHelper::IsClassIgnored(const UClass* Class)\n{\n\tif (!Class)\n\t{\n\t\treturn true;\n\t}\n\n\t// Ignore generated types that cannot be spawned\n\tconst FString Name = Class->GetName();\n\treturn Name.StartsWith(TEXT(\"SKEL_\")) || Name.StartsWith(TEXT(\"REINST_\"));\n}\n\nbool FDlgHelper::IsABlueprintClass(const UClass* Class)\n{\n\treturn Cast<UBlueprintGeneratedClass>(Class) != nullptr;\n}\n\nbool FDlgHelper::IsABlueprintObject(const UObject* Object)\n{\n\treturn Cast<UBlueprint>(Object) != nullptr;\n}\n\nbool FDlgHelper::IsObjectAChildOf(const UObject* Object, const UClass* ParentClass)\n{\n\tif (!Object || !ParentClass)\n\t{\n\t\treturn false;\n\t}\n\n\t// Blueprint\n\tif (const UBlueprint* Blueprint = Cast<UBlueprint>(Object))\n\t{\n\t\tif (const UClass* GeneratedClass = Cast<UClass>(Blueprint->GeneratedClass))\n\t\t{\n\t\t\treturn GeneratedClass->IsChildOf(ParentClass);\n\t\t}\n\t}\n\n\t// A class object, does this ever happen?\n\tif (const UClass* ClassObject = Cast<UClass>(Object))\n\t{\n\t\treturn ClassObject->IsChildOf(ParentClass);\n\t}\n\n\t// All other object types\n\treturn Object->GetClass()->IsChildOf(ParentClass);\n}\n\nbool FDlgHelper::IsObjectImplementingInterface(const UObject* Object, const UClass* InterfaceClass)\n{\n\tif (!Object || !InterfaceClass)\n\t{\n\t\treturn false;\n\t}\n\n\t// Blueprint\n\tif (const UBlueprint* Blueprint = Cast<UBlueprint>(Object))\n\t{\n\t\tif (const UClass* GeneratedClass = Cast<UClass>(Blueprint->GeneratedClass))\n\t\t{\n\t\t\treturn GeneratedClass->ImplementsInterface(InterfaceClass);\n\t\t}\n\t}\n\n\t// A class object, does this ever happen?\n\tif (const UClass* Class = Cast<UClass>(Object))\n\t{\n\t\treturn Class->ImplementsInterface(InterfaceClass);\n\t}\n\n\t// All other object types\n\treturn Object->GetClass()->ImplementsInterface(InterfaceClass);\n}\n\nbool FDlgHelper::GetAllChildClassesOf(const UClass* ParentClass, TArray<UClass*>& OutNativeClasses, TArray<UClass*>& OutBlueprintClasses)\n{\n\t// Iterate over UClass, this might be heavy on performance\n\tfor (TObjectIterator<UClass> It; It; ++It)\n\t{\n\t\tUClass* ChildClass = *It;\n\t\tif (!ChildClass->IsChildOf(ParentClass))\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\n\t\t// It is a child of the Parent Class\n\t\t// make sure we don't include our parent class in the array\n\t\tif (ChildClass == ParentClass)\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (IsABlueprintClass(ChildClass))\n\t\t{\n\t\t\t// Blueprint\n\t\t\tOutBlueprintClasses.Add(ChildClass);\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// Native\n\t\t\tOutNativeClasses.Add(ChildClass);\n\t\t}\n\t}\n\n\treturn OutNativeClasses.Num() > 0 || OutBlueprintClasses.Num() > 0;\n}\n\nbool FDlgHelper::GetAllClassesImplementingInterface(const UClass* InterfaceClass, TArray<UClass*>& OutNativeClasses, TArray<UClass*>& OutBlueprintClasses)\n{\n\t// Iterate over UClass, this might be heavy on performance\n\tfor (TObjectIterator<UClass> It; It; ++It)\n\t{\n\t\tUClass* Class = *It;\n\t\tif (!Class->ImplementsInterface(InterfaceClass))\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\t\tif (IsClassIgnored(Class))\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (IsABlueprintClass(Class))\n\t\t{\n\t\t\t// Blueprint\n\t\t\tOutBlueprintClasses.Add(Class);\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// Native\n\t\t\tOutNativeClasses.Add(Class);\n\t\t}\n\t}\n\n\treturn OutNativeClasses.Num() > 0 || OutBlueprintClasses.Num() > 0;\n}\n\nTMap<FName, TArray<FDlgClassAndObject>> FDlgHelper::ConvertDialogueParticipantsClassesIntoMap(const TArray<UClass*>& Classes)\n{\n\tTMap<FName, TArray<FDlgClassAndObject>> ObjectsMap;\n\n\tfor (UClass* Class : Classes)\n\t{\n\t\t// How did this even get here\n\t\tif (!Class->ImplementsInterface(UDlgDialogueParticipant::StaticClass()))\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Should be the same for native and blueprint classes\n\t\tUObject* Object = Class->GetDefaultObject();\n\n\t\t// Something is wrong\n\t\tif (!Object)\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\n\t\tFDlgClassAndObject Struct;\n\t\tStruct.Class = Class;\n\t\tStruct.Object = Object;\n\n\t\tconst FName ParticipantName = IDlgDialogueParticipant::Execute_GetParticipantName(Object);\n\t\tif (ObjectsMap.Contains(ParticipantName))\n\t\t{\n\t\t\t// Update\n\t\t\tObjectsMap[ParticipantName].Add(Struct);\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// Create\n\t\t\tTArray<FDlgClassAndObject> Array;\n\t\t\tArray.Add(Struct);\n\t\t\tObjectsMap.Add(ParticipantName, Array);\n\t\t}\n\t}\n\n\treturn ObjectsMap;\n}\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystem/Private/DlgLocalizationHelper.cpp",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#include \"DlgLocalizationHelper.h\"\n\n#include \"DlgSystemSettings.h\"\n#include \"Internationalization/Text.h\"\n#include \"Internationalization/TextPackageNamespaceUtil.h\"\n#include \"Serialization/TextReferenceCollector.h\"\n\n\nbool FDlgLocalizationHelper::WillTextNamespaceBeUpdated(const FText& Text)\n{\n\tconst auto* Settings = GetDefault<UDlgSystemSettings>();\n\treturn WillTextNamespaceBeUpdated(Text, *Settings);\n}\n\nbool FDlgLocalizationHelper::WillTextNamespaceBeUpdated(const FText& Text, const UDlgSystemSettings& Settings)\n{\n\t// Means we can override it\n\treturn Settings.DialogueTextNamespaceLocalization != EDlgTextNamespaceLocalization::Ignore &&\n\t\t   Settings.IsIgnoredTextForLocalization(Text);\n}\n\nvoid FDlgLocalizationHelper::UpdateTextFromRemapping(const UDlgSystemSettings& Settings, FText& OutText)\n{\n\tif (Settings.IsTextRemapped(OutText))\n\t{\n\t\t// Remapped\n\t\tconst FText& RemappedText = Settings.GetTextRemappedText(OutText);\n\t\tOutText = RemappedText;\n\t\t// Copy namespace and key\n\t\t// NewNamespace = FTextInspector::GetNamespace(RemappedText).Get(DefaultValue);\n\t\t// NewKey = FTextInspector::GetKey(RemappedText).Get(DefaultValue);\n\t}\n}\n\n#if WITH_EDITOR\n\nvoid FDlgLocalizationHelper::UpdateTextNamespaceAndKey(const UObject* Object, const UDlgSystemSettings& Settings, FText& Text)\n{\n\tstatic const FString DefaultValue = TEXT(\"\");\n\n\t// See if we can edit this\n\tif (!IsValid(Object))\n\t{\n\t\treturn;\n\t}\n\n\t// Text remapping takes precedence over everything\n\tFString NewNamespace;\n\tFString NewKey;\n\tif (!GetNewNamespaceAndKey(Object, Settings, Text, NewNamespace, NewKey))\n\t{\n\t\treturn;\n\t}\n\n\t// Change namespace\n\t// Don't use this as this marks the text as immutable\n\t// Text = FInternationalization::ForUseOnlyByLocMacroAndGraphNodeTextLiterals_CreateText(*Text.ToString(), *NewNamespace, *CurrentKey);\n\tText = FText::ChangeKey(NewNamespace, NewKey, Text);\n}\n\nbool FDlgLocalizationHelper::GetNewNamespaceAndKey(\n\tconst UObject* Object,\n\tconst UDlgSystemSettings& Settings,\n\tconst FText& Text,\n\tFString& OutNewNamespace,\n\tFString& OutNewKey\n)\n{\n\tstatic const FString DefaultValue = TEXT(\"\");\n\tif (Settings.DialogueTextNamespaceLocalization == EDlgTextNamespaceLocalization::Ignore)\n\t{\n\t\treturn false;\n\t}\n\t// Culture invariant, empty, from string table, can't update idk\n\tif (!Text.ShouldGatherForLocalization())\n\t{\n\t\treturn false;\n\t}\n\tif (!Settings.IsIgnoredTextForLocalization(Text))\n\t{\n\t\treturn false;\n\t}\n\n\tbool bNamespaceChanged = false;\n\tbool bKeyChanged = false;\n\n\tconst FString CurrentFullNamespace = FTextInspector::GetNamespace(Text).Get(DefaultValue);\n\tconst FString CurrentKey = FTextInspector::GetKey(Text).Get(DefaultValue);\n\tFString NewKey = CurrentKey;\n\n\t// Set new Namespace\n\tFString NewNamespace = Settings.DialogueTextGlobalNamespaceName; // GlobalNamespace\n\tif (Settings.DialogueTextNamespaceLocalization == EDlgTextNamespaceLocalization::PerDialogue)\n\t{\n\t\tNewNamespace = Object->GetName();\n\t}\n\telse if (Settings.DialogueTextNamespaceLocalization == EDlgTextNamespaceLocalization::WithPrefixPerDialogue)\n\t{\n\t\tNewNamespace = Settings.DialogueTextPrefixNamespaceName + Object->GetName();\n\t}\n\n\t// Did namespace change?\n\t// Only apply the change if the new namespace/package is different - we want to keep the keys stable where possible\n#if USE_STABLE_LOCALIZATION_KEYS\n\t{\n\t\t// Compare namespace + package\n\t\tconst UPackage* Package = Object ? Object->GetOutermost() : nullptr;\n\t\tconst FString PackageNamespace = TextNamespaceUtil::EnsurePackageNamespace(const_cast<UPackage*>(Package));\n\t\tconst FString NewFullNamespace = TextNamespaceUtil::BuildFullNamespace(NewNamespace, PackageNamespace, /*bAlwaysApplyPackageNamespace*/true);\n\t\tbNamespaceChanged = !CurrentFullNamespace.Equals(NewFullNamespace, ESearchCase::CaseSensitive);\n\t}\n#else\n\t// Compare only namespaces without the package\n\tconst FString CurrentNamespace = TextNamespaceUtil::StripPackageNamespace(CurrentFullNamespace);\n\tbNamespaceChanged = !CurrentNamespace.Equals(NewNamespace, ESearchCase::CaseSensitive);\n#endif // USE_STABLE_LOCALIZATION_KEYS\n\n\t// Did key change?\n\t//bKeyChanged = !CurrentKey.Equals(NewKey, ESearchCase::CaseSensitive);\n\n\t// Get stabilized namespace and keys\n\t// We must use the package to get a stabilized key\n#if USE_STABLE_LOCALIZATION_KEYS\n\tif (bNamespaceChanged)\n\t{\n\t\t// NOTE: dereference should be legal because GetSourceString always return a valid pointer\n\t\tconst FString& TextSource = *FTextInspector::GetSourceString(Text);\n\t\tFString NewStableNamespace;\n\t\tFString NewStableKey;\n\t\tStaticStableTextId(\n\t\t\tObject,\n\t\t\tIEditableTextProperty::ETextPropertyEditAction::EditedNamespace,\n\t\t\tTextSource,\n\t\t\tNewNamespace,\n\t\t\tNewKey,\n\t\t\tNewStableNamespace,\n\t\t\tNewStableKey\n\t\t);\n\t\tNewNamespace = NewStableNamespace;\n\t\tNewKey = NewStableKey;\n\t}\n#endif // USE_STABLE_LOCALIZATION_KEYS\n\n\t// Did key change?\n\tbKeyChanged = !CurrentKey.Equals(NewKey, ESearchCase::CaseSensitive);\n\n\t// Something changed\n\tif (bNamespaceChanged || bKeyChanged)\n\t{\n\t\tOutNewNamespace = NewNamespace;\n\t\tOutNewKey = NewKey;\n\t\treturn true;\n\t}\n\n\treturn false;\n}\n\n\n#if USE_STABLE_LOCALIZATION_KEYS\n\nvoid FDlgLocalizationHelper::StaticStableTextId(const UObject* InObject, IEditableTextProperty::ETextPropertyEditAction InEditAction, const FString& InTextSource, const FString& InProposedNamespace, const FString& InProposedKey, FString& OutStableNamespace, FString& OutStableKey)\n{\n\tconst UPackage* Package = InObject ? InObject->GetOutermost() : nullptr;\n\tStaticStableTextId(Package, InEditAction, InTextSource, InProposedNamespace, InProposedKey, OutStableNamespace, OutStableKey);\n}\n\nvoid FDlgLocalizationHelper::StaticStableTextId(const UPackage* InPackage, IEditableTextProperty::ETextPropertyEditAction InEditAction, const FString& InTextSource, const FString& InProposedNamespace, const FString& InProposedKey, FString& OutStableNamespace, FString& OutStableKey)\n{\n\tbool bPersistKey = false;\n\n\tconst FString PackageNamespace = TextNamespaceUtil::EnsurePackageNamespace(const_cast<UPackage*>(InPackage));\n\tif (!PackageNamespace.IsEmpty())\n\t{\n\t\t// Make sure the proposed namespace is using the correct namespace for this package\n\t\tOutStableNamespace = TextNamespaceUtil::BuildFullNamespace(InProposedNamespace, PackageNamespace, /*bAlwaysApplyPackageNamespace*/true);\n\n\t\tif (InProposedNamespace.Equals(OutStableNamespace, ESearchCase::CaseSensitive) || InEditAction == IEditableTextProperty::ETextPropertyEditAction::EditedNamespace)\n\t\t{\n\t\t\t// If the proposal was already using the correct namespace (or we just set the namespace), attempt to persist the proposed key too\n\t\t\tif (!InProposedKey.IsEmpty())\n\t\t\t{\n\t\t\t\t// If we changed the source text, then we can persist the key if this text is the *only* reference using that ID\n\t\t\t\t// If we changed the identifier, then we can persist the key only if doing so won't cause an identify conflict\n\t\t\t\tconst FTextReferenceCollector::EComparisonMode ReferenceComparisonMode = InEditAction == IEditableTextProperty::ETextPropertyEditAction::EditedSource ? FTextReferenceCollector::EComparisonMode::MatchId : FTextReferenceCollector::EComparisonMode::MismatchSource;\n\t\t\t\tconst int32 RequiredReferenceCount = InEditAction == IEditableTextProperty::ETextPropertyEditAction::EditedSource ? 1 : 0;\n\n\t\t\t\tint32 ReferenceCount = 0;\n\t\t\t\tFTextReferenceCollector(InPackage, ReferenceComparisonMode, OutStableNamespace, InProposedKey, InTextSource, ReferenceCount);\n\n\t\t\t\tif (ReferenceCount == RequiredReferenceCount)\n\t\t\t\t{\n\t\t\t\t\tbPersistKey = true;\n\t\t\t\t\tOutStableKey = InProposedKey;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse if (InEditAction != IEditableTextProperty::ETextPropertyEditAction::EditedNamespace)\n\t\t{\n\t\t\t// If our proposed namespace wasn't correct for our package, and we didn't just set it (which doesn't include the package namespace)\n\t\t\t// then we should clear out any user specified part of it\n\t\t\tOutStableNamespace = TextNamespaceUtil::BuildFullNamespace(FString(), PackageNamespace, /*bAlwaysApplyPackageNamespace*/true);\n\t\t}\n\t}\n\n\tif (!bPersistKey)\n\t{\n\t\tOutStableKey = FGuid::NewGuid().ToString();\n\t}\n}\n\n#endif // USE_STABLE_LOCALIZATION_KEYS\n\n#endif // WITH_EDITOR\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystem/Private/DlgManager.cpp",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#include \"DlgManager.h\"\n\n#include \"UObject/UObjectIterator.h\"\n#include \"Engine/ObjectLibrary.h\"\n#include \"Interfaces/IPluginManager.h\"\n#include \"Engine/Blueprint.h\"\n#include \"EngineUtils.h\"\n#include \"Engine/Engine.h\"\n\n#include \"IDlgSystemModule.h\"\n#include \"DlgConstants.h\"\n#include \"DlgDialogueParticipant.h\"\n#include \"DlgDialogue.h\"\n#include \"DlgMemory.h\"\n#include \"DlgContext.h\"\n#include \"Logging/DlgLogger.h\"\n#include \"DlgHelper.h\"\n#include \"NYReflectionHelper.h\"\n\nTWeakObjectPtr<const UObject> UDlgManager::UserWorldContextObjectPtr = nullptr;\n\nbool UDlgManager::bCalledLoadAllDialoguesIntoMemory = false;;\n\nUDlgContext* UDlgManager::StartDialogueWithDefaultParticipants(UObject* WorldContextObject, UDlgDialogue* Dialogue)\n{\n\tif (!IsValid(Dialogue))\n\t{\n\t\tFDlgLogger::Get().Error(TEXT(\"StartDialogueWithDefaultParticipants - FAILED to start dialogue because the Dialogue is INVALID (is nullptr)!\"));\n\t\treturn nullptr;\n\t}\n\n\t// Create empty map of participants we need\n\tTSet<FName> ParticipantSet;\n\tDialogue->GetAllParticipantNames(ParticipantSet);\n\tTArray<UObject*> Participants;\n\n\t// Maps from Participant Name => Objects that have that participant name\n\tTMap<FName, TArray<UObject*>> ObjectMap;\n\tfor (const FName& Name : ParticipantSet)\n\t{\n\t\tObjectMap.Add(Name, {});\n\t}\n\n\t// Gather all objects that have our participant name\n\tfor (UObject* Participant : GetAllObjectsWithDialogueParticipantInterface(WorldContextObject))\n\t{\n\t\tconst FName ParticipantName = IDlgDialogueParticipant::Execute_GetParticipantName(Participant);\n\t\tif (ObjectMap.Contains(ParticipantName))\n\t\t{\n\t\t\tObjectMap[ParticipantName].AddUnique(Participant);\n\t\t\tParticipants.AddUnique(Participant);\n\t\t}\n\t}\n\n\t// Find the missing names and the duplicate names\n\tTArray<FString> MissingNames;\n\tTArray<FString> DuplicatedNames;\n\tfor (const auto& Pair : ObjectMap)\n\t{\n\t\tconst FName ParticipantName = Pair.Key;\n\t\tconst TArray<UObject*>& Objects = Pair.Value;\n\n\t\tif (Objects.Num() == 0)\n\t\t{\n\t\t\tMissingNames.Add(ParticipantName.ToString());\n\t\t}\n\t\telse if (Objects.Num() > 1)\n\t\t{\n\t\t\tfor (UObject* Obj : Objects)\n\t\t\t{\n\t\t\t\tDuplicatedNames.Add(Obj->GetName() + \"(\" + ParticipantName.ToString() + \")\");\n\t\t\t}\n\t\t}\n\t}\n\n\tif (MissingNames.Num() > 0)\n\t{\n\t\tconst FString NameList = FString::Join(MissingNames, TEXT(\", \"));\n\t\tFDlgLogger::Get().Errorf(\n\t\t\tTEXT(\"StartDialogueWithDefaultParticipants - FAILED Dialogue = `%s`, the system FAILED to find the following Participant(s): %s\"),\n\t\t\t*Dialogue->GetName(), *NameList\n\t\t);\n\t}\n\n\tif (DuplicatedNames.Num() > 0)\n\t{\n\t\tconst FString NameList = FString::Join(DuplicatedNames, TEXT(\", \"));\n\t\tFDlgLogger::Get().Errorf(\n\t\t\tTEXT(\"StartDialogueWithDefaultParticipants - FAILED for Dialogue = `%s`, the system found multiple participants using the same name: %s\"),\n\t\t\t*Dialogue->GetName(), *NameList\n\t\t);\n\t}\n\n\tif (MissingNames.Num() > 0 || DuplicatedNames.Num() > 0)\n\t{\n\t\treturn nullptr;\n\t}\n\n\treturn StartDialogueWithContext(TEXT(\"StartDialogueWithDefaultParticipants\"), Dialogue, Participants);\n}\n\nUDlgContext* UDlgManager::StartDialogueWithContext(const FString& ContextString, UDlgDialogue* Dialogue, const TArray<UObject*>& Participants)\n{\n\tconst FString ContextMessage = ContextString.IsEmpty()\n\t\t? FString::Printf(TEXT(\"StartDialogue\"))\n\t\t: FString::Printf(TEXT(\"%s - StartDialogue\"), *ContextString);\n\n\tTMap<FName, UObject*> ParticipantBinding;\n\tif (!UDlgContext::ConvertArrayOfParticipantsToMap(ContextMessage, Dialogue, Participants, ParticipantBinding))\n\t{\n\t\treturn nullptr;\n\t}\n\n\tauto* Context = NewObject<UDlgContext>(Participants[0], UDlgContext::StaticClass());\n\tif (Context->StartWithContext(ContextMessage, Dialogue, ParticipantBinding))\n\t{\n\t\treturn Context;\n\t}\n\n\treturn nullptr;\n}\n\nbool UDlgManager::CanStartDialogue(UDlgDialogue* Dialogue, UPARAM(ref)const TArray<UObject*>& Participants)\n{\n\tTMap<FName, UObject*> ParticipantBinding;\n\tif (!UDlgContext::ConvertArrayOfParticipantsToMap(TEXT(\"CanStartDialogue\"), Dialogue, Participants, ParticipantBinding, false))\n\t{\n\t\treturn false;\n\t}\n\n\treturn UDlgContext::CanBeStarted(Dialogue, ParticipantBinding);\n}\n\nUDlgContext* UDlgManager::ResumeDialogueFromNodeIndex(\n\tUDlgDialogue* Dialogue,\n\tUPARAM(ref)const TArray<UObject*>& Participants,\n\tint32 StartNodeIndex,\n\tconst TSet<int32>& AlreadyVisitedNodes,\n\tbool bFireEnterEvents\n)\n{\n\tconst FString ContextMessage = TEXT(\"ResumeDialogueFromNodeIndex\");\n\tTMap<FName, UObject*> ParticipantBinding;\n\tif (!UDlgContext::ConvertArrayOfParticipantsToMap(ContextMessage, Dialogue, Participants, ParticipantBinding))\n\t{\n\t\treturn nullptr;\n\t}\n\n\tauto* Context = NewObject<UDlgContext>(Participants[0], UDlgContext::StaticClass());\n\tFDlgHistory History;\n\tHistory.VisitedNodeIndices = AlreadyVisitedNodes;\n\tif (Context->StartWithContextFromNodeIndex(ContextMessage, Dialogue, ParticipantBinding, StartNodeIndex, History, bFireEnterEvents))\n\t{\n\t\treturn Context;\n\t}\n\n\treturn nullptr;\n}\n\nUDlgContext* UDlgManager::ResumeDialogueFromNodeGUID(\n\tUDlgDialogue* Dialogue,\n\tUPARAM(ref)const TArray<UObject*>& Participants,\n\tconst FGuid& StartNodeGUID,\n\tconst TSet<FGuid>& AlreadyVisitedNodes,\n\tbool bFireEnterEvents\n)\n{\n\tconst FString ContextMessage = TEXT(\"ResumeDialogueFromNodeGUID\");\n\tTMap<FName, UObject*> ParticipantBinding;\n\tif (!UDlgContext::ConvertArrayOfParticipantsToMap(ContextMessage, Dialogue, Participants, ParticipantBinding))\n\t{\n\t\treturn nullptr;\n\t}\n\n\tauto* Context = NewObject<UDlgContext>(Participants[0], UDlgContext::StaticClass());\n\tFDlgHistory History;\n\tHistory.VisitedNodeGUIDs = AlreadyVisitedNodes;\n\tif (Context->StartWithContextFromNodeGUID(ContextMessage, Dialogue, ParticipantBinding, StartNodeGUID, History, bFireEnterEvents))\n\t{\n\t\treturn Context;\n\t}\n\n\treturn nullptr;\n}\n\nUDlgContext* UDlgManager::StartMonologue(UDlgDialogue* Dialogue, UObject* Participant)\n{\n\tTArray<UObject*> Participants;\n\tParticipants.Add(Participant);\n\treturn StartDialogueWithContext(TEXT(\"StartMonologue\"), Dialogue, Participants);\n}\n\nUDlgContext* UDlgManager::StartDialogue2(UDlgDialogue* Dialogue, UObject* Participant0, UObject* Participant1)\n{\n\tTArray<UObject*> Participants;\n\tParticipants.Add(Participant0);\n\tParticipants.Add(Participant1);\n\treturn StartDialogueWithContext(TEXT(\"StartDialogue2\"), Dialogue, Participants);\n}\n\nUDlgContext* UDlgManager::StartDialogue3(UDlgDialogue* Dialogue, UObject* Participant0, UObject* Participant1, UObject* Participant2)\n{\n\tTArray<UObject*> Participants;\n\tParticipants.Add(Participant0);\n\tParticipants.Add(Participant1);\n\tParticipants.Add(Participant2);\n\treturn StartDialogueWithContext(TEXT(\"StartDialogue3\"), Dialogue, Participants);\n}\n\nUDlgContext* UDlgManager::StartDialogue4(UDlgDialogue* Dialogue, UObject* Participant0, UObject* Participant1, UObject* Participant2, UObject* Participant3)\n{\n\tTArray<UObject*> Participants;\n\tParticipants.Add(Participant0);\n\tParticipants.Add(Participant1);\n\tParticipants.Add(Participant2);\n\tParticipants.Add(Participant3);\n\n\treturn StartDialogueWithContext(TEXT(\"StartDialogue4\"), Dialogue, Participants);\n}\n\nint32 UDlgManager::LoadAllDialoguesIntoMemory(bool bAsync)\n{\n\tbCalledLoadAllDialoguesIntoMemory = true;\n\n\t// NOTE: All paths must NOT have the forward slash \"/\" at the end.\n\t// If they do, then this won't load Dialogues that are located in the Content root directory\n\tUObjectLibrary* ObjectLibrary = UObjectLibrary::CreateLibrary(UDlgDialogue::StaticClass(), false, GIsEditor);\n\tTArray<FString> PathsToSearch = { TEXT(\"/Game\") };\n\tObjectLibrary->AddToRoot();\n\n\t// Add the current plugin dir\n\t// TODO maybe add all the non engine plugin paths? IPluginManager::Get().GetEnabledPlugins()\n\tconst TSharedPtr<IPlugin> ThisPlugin = IPluginManager::Get().FindPlugin(DIALOGUE_SYSTEM_PLUGIN_NAME.ToString());\n\tif (ThisPlugin.IsValid())\n\t{\n\t\tFString PluginPath = ThisPlugin->GetMountedAssetPath();\n\t\t// See NOTE above\n\t\tPluginPath.RemoveFromEnd(TEXT(\"/\"));\n\t\tPathsToSearch.Add(PluginPath);\n\t}\n\n\tconst bool bForceSynchronousScan = !bAsync;\n\tconst int32 Count = ObjectLibrary->LoadAssetDataFromPaths(PathsToSearch, bForceSynchronousScan);\n\tObjectLibrary->LoadAssetsFromAssetData();\n\tObjectLibrary->RemoveFromRoot();\n\n\treturn Count;\n}\n\nTArray<UDlgDialogue*> UDlgManager::GetAllDialoguesFromMemory()\n{\n#if WITH_EDITOR\n\t// Hmm, something is wrong\n\tif (!bCalledLoadAllDialoguesIntoMemory)\n\t{\n\t\tLoadAllDialoguesIntoMemory(false);\n\t}\n// \tcheck(bCalledLoadAllDialoguesIntoMemory);\n#endif\n\n\tTArray<UDlgDialogue*> Array;\n\tfor (TObjectIterator<UDlgDialogue> Itr; Itr; ++Itr)\n\t{\n\t\tUDlgDialogue* Dialogue = *Itr;\n\t\tif (IsValid(Dialogue))\n\t\t{\n\t\t\tArray.Add(Dialogue);\n\t\t}\n\t}\n\treturn Array;\n}\n\nTArray<TWeakObjectPtr<AActor>> UDlgManager::GetAllWeakActorsWithDialogueParticipantInterface(UWorld* World)\n{\n\tTArray<TWeakObjectPtr<AActor>> Array;\n\tfor (TActorIterator<AActor> Itr(World); Itr; ++Itr)\n\t{\n\t\tAActor* Actor = *Itr;\n\t\tif (IsValid(Actor) && !Actor->IsPendingKill() && Actor->GetClass()->ImplementsInterface(UDlgDialogueParticipant::StaticClass()))\n\t\t{\n\t\t\tArray.Add(Actor);\n\t\t}\n\t}\n\treturn Array;\n}\n\nTArray<UObject*> UDlgManager::GetAllObjectsWithDialogueParticipantInterface(UObject* WorldContextObject)\n{\n\tTArray<UObject*> Array;\n\tif (!WorldContextObject)\n\t\treturn Array;\n\n\tif (UWorld* World = GEngine->GetWorldFromContextObject(WorldContextObject, EGetWorldErrorMode::LogAndReturnNull))\n\t{\n\t\t// TObjectIterator has some weird ghost objects in editor, I failed to find a way to validate them\n\t\t// Instead of this ActorIterate is used and the properties inside the actors are examined in a recursive way\n\t\t// Containers are not supported yet\n\t\tTSet<UObject*> VisitedSet;\n\t\tfor (TActorIterator<AActor> Itr(World); Itr; ++Itr)\n\t\t{\n\t\t\tGatherParticipantsRecursive(*Itr, Array, VisitedSet);\n\t\t}\n\t}\n\n\t// TArray<UObject*> Array2;\n\t// for (TObjectIterator<UObject> Itr; Itr; ++Itr)\n\t// {\n\t// \tUObject* Object = *Itr;\n\t// \tif (IsValid(Object)\n\t// \t\t&& !Object->IsPendingKill()\n\t// \t\t&& Object->GetClass()->ImplementsInterface(UDlgDialogueParticipant::StaticClass()))\n\t// \t\t//&& IDlgDialogueParticipant::Execute_GetParticipantName(Object) != NAME_None)\n\t// \t{\n\t// \t\tif (Object->HasAllFlags(RF_Transient | RF_Transactional) || !Object->HasAnyFlags(RF_Transient) )\n\t// \t\t{\n\t// \t\t\tArray2.AddUnique(Object);\n\t// \t\t}\n\t// \t}\n\t// }\n\n\treturn Array;\n}\n\nTMap<FName, FDlgObjectsArray> UDlgManager::GetAllObjectsMapWithDialogueParticipantInterface(UObject* WorldContextObject)\n{\n\t// Maps from Participant Name => Objects that have that participant name\n\tTMap<FName, FDlgObjectsArray> ObjectsMap;\n\tfor (UObject* Participant : GetAllObjectsWithDialogueParticipantInterface(WorldContextObject))\n\t{\n\t\tconst FName ParticipantName = IDlgDialogueParticipant::Execute_GetParticipantName(Participant);\n\t\tif (ObjectsMap.Contains(ParticipantName))\n\t\t{\n\t\t\t// Update\n\t\t\tObjectsMap[ParticipantName].Array.Add(Participant);\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// Create\n\t\t\tFDlgObjectsArray ArrayStruct;\n\t\t\tArrayStruct.Array.Add(Participant);\n\t\t\tObjectsMap.Add(ParticipantName, ArrayStruct);\n\t\t}\n\t}\n\n\treturn ObjectsMap;\n}\n\nTArray<UDlgDialogue*> UDlgManager::GetDialoguesWithDuplicateGUIDs()\n{\n\tTArray<UDlgDialogue*> Dialogues = GetAllDialoguesFromMemory();\n\tTArray<UDlgDialogue*> DuplicateDialogues;\n\n\tTSet<FGuid> DialogueGUIDs;\n\tfor (UDlgDialogue* Dialogue : Dialogues)\n\t{\n\t\tconst FGuid ID = Dialogue->GetGUID();\n\t\tif (DialogueGUIDs.Find(ID) == nullptr)\n\t\t{\n\t\t\t// does not exist, good\n\t\t\tDialogueGUIDs.Add(ID);\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// how?\n\t\t\tDuplicateDialogues.Add(Dialogue);\n\t\t}\n\t}\n\n\treturn DuplicateDialogues;\n}\n\nTMap<FGuid, UDlgDialogue*> UDlgManager::GetAllDialoguesGUIDsMap()\n{\n\tTArray<UDlgDialogue*> Dialogues = GetAllDialoguesFromMemory();\n\tTMap<FGuid, UDlgDialogue*> DialoguesMap;\n\n\tfor (UDlgDialogue* Dialogue : Dialogues)\n\t{\n\t\tconst FGuid ID = Dialogue->GetGUID();\n\t\tif (DialoguesMap.Contains(ID))\n\t\t{\n\t\t\tFDlgLogger::Get().Errorf(\n\t\t\t\tTEXT(\"GetAllDialoguesGUIDsMap - ID = `%s` for Dialogue = `%s` already exists\"),\n\t\t\t\t*ID.ToString(), *Dialogue->GetPathName()\n\t\t\t);\n\t\t}\n\n\t\tDialoguesMap.Add(ID, Dialogue);\n\t}\n\n\treturn DialoguesMap;\n}\n\nconst TMap<FGuid, FDlgHistory>& UDlgManager::GetDialogueHistory()\n{\n\treturn FDlgMemory::Get().GetHistoryMaps();\n}\n\nvoid UDlgManager::SetDialogueHistory(const TMap<FGuid, FDlgHistory>& DlgHistory)\n{\n\tFDlgMemory::Get().SetHistoryMap(DlgHistory);\n}\n\nvoid UDlgManager::ClearDialogueHistory()\n{\n\tFDlgMemory::Get().Empty();\n}\n\nbool UDlgManager::DoesObjectImplementDialogueParticipantInterface(const UObject* Object)\n{\n\treturn FDlgHelper::IsObjectImplementingInterface(Object, UDlgDialogueParticipant::StaticClass());\n}\n\nbool UDlgManager::IsObjectACustomEvent(const UObject* Object)\n{\n\treturn FDlgHelper::IsObjectAChildOf(Object, UDlgEventCustom::StaticClass());\n}\n\nbool UDlgManager::IsObjectACustomCondition(const UObject* Object)\n{\n\treturn FDlgHelper::IsObjectAChildOf(Object, UDlgConditionCustom::StaticClass());\n}\n\nbool UDlgManager::IsObjectACustomTextArgument(const UObject* Object)\n{\n\treturn FDlgHelper::IsObjectAChildOf(Object, UDlgTextArgumentCustom::StaticClass());\n}\n\nbool UDlgManager::IsObjectANodeData(const UObject* Object)\n{\n\treturn FDlgHelper::IsObjectAChildOf(Object, UDlgNodeData::StaticClass());\n}\n\nTArray<UDlgDialogue*> UDlgManager::GetAllDialoguesForParticipantName(FName ParticipantName)\n{\n\tTArray<UDlgDialogue*> DialoguesArray;\n\tfor (UDlgDialogue* Dialogue : GetAllDialoguesFromMemory())\n\t{\n\t\tif (Dialogue->HasParticipant(ParticipantName))\n\t\t{\n\t\t\tDialoguesArray.Add(Dialogue);\n\t\t}\n\t}\n\n\treturn DialoguesArray;\n}\n\nvoid UDlgManager::GetAllDialoguesParticipantNames(TArray<FName>& OutArray)\n{\n\tTSet<FName> UniqueNames;\n\tfor (const UDlgDialogue* Dialogue : GetAllDialoguesFromMemory())\n\t{\n\t\tDialogue->GetAllParticipantNames(UniqueNames);\n\t}\n\n\tFDlgHelper::AppendSortedSetToArray(UniqueNames, OutArray);\n}\n\nvoid UDlgManager::GetAllDialoguesSpeakerStates(TArray<FName>& OutArray)\n{\n\tTSet<FName> UniqueNames;\n\tfor (const UDlgDialogue* Dialogue : GetAllDialoguesFromMemory())\n\t{\n\t\tDialogue->GetAllSpeakerStates(UniqueNames);\n\t}\n\n\tFDlgHelper::AppendSortedSetToArray(UniqueNames, OutArray);\n}\n\nvoid UDlgManager::GetAllDialoguesIntNames(FName ParticipantName, TArray<FName>& OutArray)\n{\n\tTSet<FName> UniqueNames;\n\tfor (const UDlgDialogue* Dialogue : GetAllDialoguesFromMemory())\n\t{\n\t\tDialogue->GetIntNames(ParticipantName, UniqueNames);\n\t}\n\n\tFDlgHelper::AppendSortedSetToArray(UniqueNames, OutArray);\n}\n\nvoid UDlgManager::GetAllDialoguesFloatNames(FName ParticipantName, TArray<FName>& OutArray)\n{\n\tTSet<FName> UniqueNames;\n\tfor (const UDlgDialogue* Dialogue : GetAllDialoguesFromMemory())\n\t{\n\t\tDialogue->GetFloatNames(ParticipantName, UniqueNames);\n\t}\n\n\tFDlgHelper::AppendSortedSetToArray(UniqueNames, OutArray);\n}\n\nvoid UDlgManager::GetAllDialoguesBoolNames(FName ParticipantName, TArray<FName>& OutArray)\n{\n\tTSet<FName> UniqueNames;\n\tfor (const UDlgDialogue* Dialogue : GetAllDialoguesFromMemory())\n\t{\n\t\tDialogue->GetBoolNames(ParticipantName, UniqueNames);\n\t}\n\n\tFDlgHelper::AppendSortedSetToArray(UniqueNames, OutArray);\n}\n\nvoid UDlgManager::GetAllDialoguesNameNames(FName ParticipantName, TArray<FName>& OutArray)\n{\n\tTSet<FName> UniqueNames;\n\tfor (const UDlgDialogue* Dialogue : GetAllDialoguesFromMemory())\n\t{\n\t\tDialogue->GetNameNames(ParticipantName, UniqueNames);\n\t}\n\n\tFDlgHelper::AppendSortedSetToArray(UniqueNames, OutArray);\n}\n\nvoid UDlgManager::GetAllDialoguesConditionNames(FName ParticipantName, TArray<FName>& OutArray)\n{\n\tTSet<FName> UniqueNames;\n\tfor (const UDlgDialogue* Dialogue : GetAllDialoguesFromMemory())\n\t{\n\t\tDialogue->GetConditions(ParticipantName, UniqueNames);\n\t}\n\n\tFDlgHelper::AppendSortedSetToArray(UniqueNames, OutArray);\n}\n\nvoid UDlgManager::GetAllDialoguesEventNames(FName ParticipantName, TArray<FName>& OutArray)\n{\n\tTSet<FName> UniqueNames;\n\tfor (const UDlgDialogue* Dialogue : GetAllDialoguesFromMemory())\n\t{\n\t\tDialogue->GetEvents(ParticipantName, UniqueNames);\n\t}\n\n\tFDlgHelper::AppendSortedSetToArray(UniqueNames, OutArray);\n}\n\nbool UDlgManager::RegisterDialogueConsoleCommands()\n{\n\tif (!IDlgSystemModule::IsAvailable())\n\t{\n\t\tFDlgLogger::Get().Error(TEXT(\"RegisterDialogueConsoleCommands - The Dialogue System Module is NOT Loaded\"));\n\t\treturn false;\n\t}\n\n\tIDlgSystemModule::Get().RegisterConsoleCommands(GetDialogueWorld());\n\treturn true;\n}\n\nbool UDlgManager::UnregisterDialogueConsoleCommands()\n{\n\tif (!IDlgSystemModule::IsAvailable())\n\t{\n\t\tFDlgLogger::Get().Error(TEXT(\"UnregisterDialogueConsoleCommands - The Dialogue System Module is NOT Loaded\"));\n\t\treturn false;\n\t}\n\n\tIDlgSystemModule::Get().UnregisterConsoleCommands();\n\treturn true;\n}\n\nvoid UDlgManager::GatherParticipantsRecursive(UObject* Object, TArray<UObject*>& Array, TSet<UObject*>& AlreadyVisited)\n{\n\tif (!IsValid(Object) || Object->IsPendingKill() || AlreadyVisited.Contains(Object))\n\t{\n\t\treturn;\n\t}\n\n\tAlreadyVisited.Add(Object);\n\tif (Object->GetClass()->ImplementsInterface(UDlgDialogueParticipant::StaticClass()))\n\t{\n\t\tArray.Add(Object);\n\t}\n\n\t// Gather recursive from children\n\tfor (auto* Property = Object->GetClass()->PropertyLink; Property != nullptr; Property = Property->PropertyLinkNext)\n\t{\n\t\tif (auto* ObjectProperty = FNYReflectionHelper::CastProperty<FNYObjectProperty>(Property))\n\t\t{\n\t\t\tGatherParticipantsRecursive(ObjectProperty->GetPropertyValue_InContainer(Object), Array, AlreadyVisited);\n\t\t}\n\n\t\t// TODO: handle containers and structs\n\t}\n}\n\nUWorld* UDlgManager::GetDialogueWorld()\n{\n\t// Try to use the user set one\n\tif (UserWorldContextObjectPtr.IsValid())\n\t{\n\t\tif (auto* WorldContextObject = UserWorldContextObjectPtr.Get())\n\t\t{\n\t\t\tif (auto* World = WorldContextObject->GetWorld())\n\t\t\t{\n\t\t\t\treturn World;\n\t\t\t}\n\t\t}\n\t}\n\n\t// Fallback to default autodetection\n\tif (GEngine)\n\t{\n\t\t// Get first PIE world\n\t\t// Copied from TakeUtils::GetFirstPIEWorld()\n\t\tfor (const FWorldContext& Context : GEngine->GetWorldContexts())\n\t\t{\n\t\t\tUWorld* World = Context.World();\n\t\t\tif (!World || !World->IsPlayInEditor())\n\t\t\t\tcontinue;\n\n\t\t\tif (World->GetNetMode() == ENetMode::NM_Standalone ||\n\t\t\t\t(World->GetNetMode() == ENetMode::NM_Client && Context.PIEInstance == 2))\n\t\t\t{\n\t\t\t\treturn World;\n\t\t\t}\n\t\t}\n\n\t\t// Otherwise get the first Game World\n\t\tfor (const FWorldContext& Context : GEngine->GetWorldContexts())\n\t\t{\n\t\t\tUWorld* World = Context.World();\n\t\t\tif (!World || !World->IsGameWorld())\n\t\t\t\tcontinue;\n\n\t\t\treturn World;\n\t\t}\n\t}\n\n\tFDlgLogger::Get().Error(TEXT(\"GetDialogueWorld - Could NOT find any valid world. Call SetDialoguePersistentWorldContextObject in the Being Play of your GameMode\"));\n\treturn nullptr;\n}\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystem/Private/DlgMemory.cpp",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#include \"DlgMemory.h\"\n#include \"DlgHelper.h\"\n\nbool FDlgHistory::operator==(const FDlgHistory& Other) const\n{\n\treturn FDlgHelper::IsSetEqual(VisitedNodeIndices, Other.VisitedNodeIndices)\n\t\t&& FDlgHelper::IsSetEqual(VisitedNodeGUIDs, Other.VisitedNodeGUIDs);\n}\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystem/Private/DlgObject.cpp",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#pragma once\n\n#include \"DlgObject.h\"\n\n#include \"DlgManager.h\"\n#include \"UObject/Object.h\"\n\nvoid UDlgObject::PostInitProperties()\n{\n\t// We must always set the outer to be something that exists at runtime\n#if WITH_EDITOR\n\tif (UEdGraphNode* GraphNode =  Cast<UEdGraphNode>(GetOuter()))\n\t{\n\t\tUDlgDialogue::GetDialogueEditorAccess()->SetNewOuterForObjectFromGraphNode(this, GraphNode);\n\t}\n#endif\n\n\tSuper::PostInitProperties();\n}\n\nUWorld* UDlgObject::GetWorld() const\n{\n\tif (HasAnyFlags(RF_ArchetypeObject | RF_ClassDefaultObject))\n\t{\n\t\treturn nullptr;\n\t}\n\n\t// Get from outer\n\tif (UObject* Outer = GetOuter())\n\t{\n\t\tif (UWorld* World = Outer->GetWorld())\n\t\t{\n\t\t\treturn World;\n\t\t}\n\t}\n\n\t// Last resort\n\treturn UDlgManager::GetDialogueWorld();\n}\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystem/Private/DlgSystemModule.cpp",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#include \"DlgSystemModule.h\"\n\n#include \"Modules/ModuleManager.h\"\n#include \"AssetRegistryModule.h\"\n#include \"Framework/Docking/TabManager.h\"\n#include \"Widgets/Docking/SDockTab.h\"\n#include \"HAL/IConsoleManager.h\"\n#include \"HAL/FileManager.h\"\n#include \"GameFramework/Actor.h\"\n\n#if WITH_GAMEPLAY_DEBUGGER\n#include \"GameplayDebugger.h\"\n#endif // WITH_GAMEPLAY_DEBUGGER\n#if WITH_EDITOR\n#include \"WorkspaceMenuStructureModule.h\"\n#include \"WorkspaceMenuStructure.h\"\n#endif // WITH_EDITOR\n\n#include \"DlgConstants.h\"\n#include \"DlgManager.h\"\n#include \"DlgDialogue.h\"\n#include \"GameplayDebugger/DlgGameplayDebuggerCategory.h\"\n#include \"GameplayDebugger/SDlgDataDisplay.h\"\n#include \"Logging/DlgLogger.h\"\n\n#define LOCTEXT_NAMESPACE \"FDlgSystemModule\"\n\n//////////////////////////////////////////////////////////////////////////\nDEFINE_LOG_CATEGORY(LogDlgSystem)\n//////////////////////////////////////////////////////////////////////////\n\nvoid FDlgSystemModule::StartupModule()\n{\n\tFDlgLogger::OnStart();\n\n\t// This code will execute after your module is loaded into memory; the exact timing is specified in the .uplugin file per-module\n\tFDlgLogger::Get().Info(TEXT(\"DlgSystemModule: StartupModule\"));\n\n\tOnPreLoadMapHandle = FCoreUObjectDelegates::PreLoadMap.AddRaw(this, &Self::HandleOnPreLoadMap);\n\tOnPostLoadMapWithWorldHandle = FCoreUObjectDelegates::PostLoadMapWithWorld.AddRaw(this, &Self::HandleOnPostLoadMapWithWorld);\n\n\t// Listen for deleted assets\n\t// Maybe even check OnAssetRemoved if not loaded into memory?\n\tIAssetRegistry& AssetRegistry = FModuleManager::LoadModuleChecked<FAssetRegistryModule>(NAME_MODULE_AssetRegistry).Get();\n\tOnInMemoryAssetDeletedHandle = AssetRegistry.OnInMemoryAssetDeleted().AddRaw(this, &Self::HandleOnInMemoryAssetDeleted);\n\t// NOTE: this seems to be the same as the OnInMemoryAssetDeleted as they are called from the same method inside\n\t// the asset registry.\n\tOnAssetRemovedHandle = AssetRegistry.OnAssetRemoved().AddRaw(this, &Self::HandleOnAssetRemoved);\n\tOnAssetRenamedHandle = AssetRegistry.OnAssetRenamed().AddRaw(this, &Self::HandleOnAssetRenamed);\n\n#if WITH_GAMEPLAY_DEBUGGER\n\t// If the gameplay debugger is available, register the category and notify the editor about the changes\n\tIGameplayDebugger& GameplayDebuggerModule = IGameplayDebugger::Get();\n\tGameplayDebuggerModule.RegisterCategory(\n\t\tDIALOGUE_SYSTEM_PLUGIN_NAME,\n\t\tIGameplayDebugger::FOnGetCategory::CreateStatic(&FDlgGameplayDebuggerCategory::MakeInstance),\n\t\tEGameplayDebuggerCategoryState::EnabledInGameAndSimulate\n\t);\n\tGameplayDebuggerModule.NotifyCategoriesChanged();\n#endif // WITH_GAMEPLAY_DEBUGGER\n\n\t// Register tab spawners\n\tbHasRegisteredTabSpawners = true;\n\n\tDialogueDataDisplayTabSpawnEntry = &FGlobalTabmanager::Get()->RegisterNomadTabSpawner(\n\t\tDIALOGUE_DATA_DISPLAY_TAB_ID,\n\t\tFOnSpawnTab::CreateLambda([this](const FSpawnTabArgs& Args) -> TSharedRef<SDockTab>\n\t\t{\n\t\t\tTSharedRef<SDockTab> DialogueDataDisplayTab = SNew(SDockTab)\n\t\t\t\t.TabRole(ETabRole::NomadTab)\n\t\t\t\t[\n\t\t\t\t\tGetDialogueDataDisplayWindow()\n\t\t\t\t];\n\t\t\treturn DialogueDataDisplayTab;\n\t\t}))\n\t\t.SetDisplayName(LOCTEXT(\"DialogueDataDisplayTitle\", \"Dialogue Data Display\"))\n\t\t.SetTooltipText(LOCTEXT(\"DialogueDataDisplayTooltipText\", \"Open the Dialogue Data Display tab.\")\n\t);\n}\n\nvoid FDlgSystemModule::ShutdownModule()\n{\n\t// Unregister the console commands in case the user forgot to clear them\n\tUnregisterConsoleCommands();\n\n\t// Unregister the tab spawners\n\tbHasRegisteredTabSpawners = false;\n\tFGlobalTabmanager::Get()->UnregisterTabSpawner(DIALOGUE_DATA_DISPLAY_TAB_ID);\n\n#if WITH_GAMEPLAY_DEBUGGER\n\t// If the gameplay debugger is available, unregister the category\n\tif (IGameplayDebugger::IsAvailable())\n\t{\n\t\tIGameplayDebugger& GameplayDebuggerModule = IGameplayDebugger::Get();\n\t\tGameplayDebuggerModule.UnregisterCategory(DIALOGUE_SYSTEM_PLUGIN_NAME);\n\t\tGameplayDebuggerModule.NotifyCategoriesChanged();\n\t}\n#endif // WITH_GAMEPLAY_DEBUGGER\n\n\t// This function may be called during shutdown to clean up your module. For modules that support dynamic reloading,\n\t// we call this function before unloading the module.\n\tconst FModuleManager& ModuleManger = FModuleManager::Get();\n\n\t// Unregister the the asset registry delete listeners\n\tif (ModuleManger.IsModuleLoaded(NAME_MODULE_AssetRegistry))\n\t{\n\t\tIAssetRegistry& AssetRegistry = FModuleManager::LoadModuleChecked<FAssetRegistryModule>(NAME_MODULE_AssetRegistry).Get();\n\t\tif (OnInMemoryAssetDeletedHandle.IsValid())\n\t\t{\n\t\t\tAssetRegistry.OnInMemoryAssetDeleted().Remove(OnInMemoryAssetDeletedHandle);\n\t\t}\n\t\tif (OnAssetRemovedHandle.IsValid())\n\t\t{\n\t\t\tAssetRegistry.OnAssetRemoved().Remove(OnAssetRemovedHandle);\n\t\t}\n\t\tif (OnAssetRenamedHandle.IsValid())\n\t\t{\n\t\t\tAssetRegistry.OnAssetRenamed().Remove(OnAssetRenamedHandle);\n\t\t}\n\t}\n\n\tif (OnPreLoadMapHandle.IsValid())\n\t{\n\t\tFCoreUObjectDelegates::PreLoadMap.Remove(OnPreLoadMapHandle);\n\t}\n\tif (OnPostLoadMapWithWorldHandle.IsValid())\n\t{\n\t\tFCoreUObjectDelegates::PostLoadMapWithWorld.Remove(OnPostLoadMapWithWorldHandle);\n\t}\n\n\tFDlgLogger::Get().Info(TEXT(\"DlgSystemModule: ShutdownModule\"));\n\tFDlgLogger::OnShutdown();\n}\n\nTSharedRef<SWidget> FDlgSystemModule::GetDialogueDataDisplayWindow()\n{\n\tTSharedPtr<SDlgDataDisplay> DialogueData = DialogueDataDisplayWidget.Pin();\n\tif (!DialogueData.IsValid())\n\t{\n\t\tDialogueData = SNew(SDlgDataDisplay, WorldContextObjectPtr);\n\t\tDialogueDataDisplayWidget = DialogueData;\n\t}\n\n\treturn DialogueData.ToSharedRef();\n}\n\nFTabSpawnerEntry* FDlgSystemModule::GetDialogueDataDisplaySpawnEntry()\n{\n\treturn DialogueDataDisplayTabSpawnEntry;\n}\n\nvoid FDlgSystemModule::RegisterConsoleCommands(const TWeakObjectPtr<const UObject>& InWorldContextObjectPtr)\n{\n\t// Unregister first to prevent double register of commands\n\tUnregisterConsoleCommands();\n\n\tif (InWorldContextObjectPtr.IsValid())\n\t{\n\t\tWorldContextObjectPtr = InWorldContextObjectPtr;\n\t}\n\n\tIConsoleManager& ConsoleManager = IConsoleManager::Get();\n\tConsoleCommands.Add(\n\t\tConsoleManager.RegisterConsoleCommand(\n\t\t\tTEXT(\"Dlg.DataDisplay\"),\n\t\t\tTEXT(\"Displays the Dialogue Data Window\"),\n\t\t\tFConsoleCommandDelegate::CreateRaw(this, &Self::DisplayDialogueDataWindow),\n\t\t\tECVF_Default\n\t\t)\n\t);\n\n\tConsoleCommands.Add(\n\t\tConsoleManager.RegisterConsoleCommand(\n\t\t\tTEXT(\"Dlg.LoadAllDialogues\"),\n\t\t\tTEXT(\"Load All Dialogues into memory\"),\n\t\t\tFConsoleCommandDelegate::CreateLambda([]()\n\t\t\t{\n\t\t\t\tUDlgManager::LoadAllDialoguesIntoMemory();\n\t\t\t}),\n\t\t\tECVF_Default\n\t\t)\n\t);\n\n\t// In case the DlgDataDisplay is already opened, simply refresh the actor reference\n\tRefreshDisplayDialogueDataWindow(false);\n}\n\nvoid FDlgSystemModule::UnregisterConsoleCommands()\n{\n\tWorldContextObjectPtr.Reset();\n\tfor (IConsoleCommand* Command : ConsoleCommands)\n\t{\n\t\tIConsoleManager::Get().UnregisterConsoleObject(Command);\n\t}\n\tConsoleCommands.Empty();\n}\n\nvoid FDlgSystemModule::DisplayDialogueDataWindow()\n{\n\tif (!bHasRegisteredTabSpawners)\n\t{\n\t\tFDlgLogger::Get().Error(TEXT(\"Did not Initialize the tab spawner for the DisplayDialogueDataWindow\"));\n\t\treturn;\n\t}\n\n\tif (!RefreshDisplayDialogueDataWindow())\n\t{\n\t\t// Create, because it does not exist yet\n\t\tFGlobalTabmanager::Get()->InvokeTab(FTabId(DIALOGUE_DATA_DISPLAY_TAB_ID));\n\t}\n}\n\nbool FDlgSystemModule::RefreshDisplayDialogueDataWindow(bool bFocus)\n{\n\tconst TSharedPtr<SDockTab> DlgDisplayDataTab =\n\t\tFGlobalTabmanager::Get()->FindExistingLiveTab(FTabId(DIALOGUE_DATA_DISPLAY_TAB_ID));\n\tif (DlgDisplayDataTab.IsValid())\n\t{\n\t\t// Set the new WorldContextObjectPtr.\n\t\tTSharedRef<SDlgDataDisplay> Window = StaticCastSharedRef<SDlgDataDisplay>(DlgDisplayDataTab->GetContent());\n\t\tif (WorldContextObjectPtr.IsValid())\n\t\t{\n\t\t\tWindow->SetWorldContextObject(WorldContextObjectPtr);\n\t\t\tWindow->RefreshTree(false);\n\t\t}\n\n\t\t// Focus\n\t\tif (bFocus)\n\t\t{\n\t\t\tFGlobalTabmanager::Get()->DrawAttention(DlgDisplayDataTab.ToSharedRef());\n\t\t}\n\n\t\treturn true;\n\t}\n\n\treturn false;\n}\n\nvoid FDlgSystemModule::HandleOnInMemoryAssetDeleted(UObject* DeletedObject)\n{\n\t// Should be safe to access it here\n\t// See UAssetRegistryImpl::AssetDeleted\n\tif (UDlgDialogue* Dialogue = Cast<UDlgDialogue>(DeletedObject))\n\t{\n\t\tHandleDialogueDeleted(Dialogue);\n\t}\n}\n\nvoid FDlgSystemModule::HandleOnAssetRemoved(const FAssetData& RemovedAsset)\n{\n\tif (!RemovedAsset.IsAssetLoaded())\n\t{\n\t\treturn;\n\t}\n}\n\nvoid FDlgSystemModule::HandleOnAssetRenamed(const FAssetData& AssetRenamed, const FString& OldObjectPath)\n{\n\tUObject* ObjectRenamed = AssetRenamed.GetAsset();\n\tif (UDlgDialogue* Dialogue = Cast<UDlgDialogue>(ObjectRenamed))\n\t{\n\t\tHandleDialogueRenamed(Dialogue, OldObjectPath);\n\t}\n}\n\nvoid FDlgSystemModule::HandleDialogueDeleted(UDlgDialogue* DeletedDialogue)\n{\n\tif (!IsValid(DeletedDialogue))\n\t{\n\t\treturn;\n\t}\n\n\tDeletedDialogue->DeleteAllTextFiles();\n}\n\nvoid FDlgSystemModule::HandleDialogueRenamed(UDlgDialogue* RenamedDialogue, const FString& OldObjectPath)\n{\n\tif (!IsValid(RenamedDialogue))\n\t{\n\t\treturn;\n\t}\n\n\t// Rename text file file to new location\n\tconst FString OldTextFilePathName = UDlgDialogue::GetTextFilePathNameFromAssetPathName(OldObjectPath);\n\tif (OldTextFilePathName.IsEmpty())\n\t{\n\t\tFDlgLogger::Get().Error(TEXT(\"OldTextFilePathName is empty. This should never happen\"));\n\t\treturn;\n\t}\n\n\t// Current PathName\n\tconst FString CurrentTextFilePathName = RenamedDialogue->GetTextFilePathName(false);\n\tif (OldTextFilePathName == CurrentTextFilePathName)\n\t{\n\t\tFDlgLogger::Get().Errorf(\n\t\t\tTEXT(\"Dialogue was renamed but the paths before and after are equal :O | `%s` == `%s`\"),\n\t\t\t*OldTextFilePathName, *CurrentTextFilePathName\n\t\t);\n\t\treturn;\n\t}\n\n\t// Iterate over all possible text formats\n\tfor (const FString& FileExtension : GetDefault<UDlgSystemSettings>()->GetAllTextFileExtensions())\n\t{\n\t\tconst FString OldFileName = OldTextFilePathName + FileExtension;\n\t\tconst FString NewFileName = CurrentTextFilePathName + FileExtension;\n\t\tFDlgHelper::RenameFile(OldFileName, NewFileName, true);\n\t}\n}\n\nvoid FDlgSystemModule::HandleOnPreLoadMap(const FString& MapName)\n{\n\t// NOTE: only in NON editor game\n\tconst UDlgSystemSettings* Settings = GetDefault<UDlgSystemSettings>();\n\tif (!Settings)\n\t{\n\t\treturn;\n\t}\n\n\tif (Settings->bClearDialogueHistoryAutomatically)\n\t{\n\t\tFDlgLogger::Get().Debugf(TEXT(\"PreLoadMap = %s. Clearing Dialogue History\"), *MapName);\n\t\tUDlgManager::ClearDialogueHistory();\n\t}\n}\n\nvoid FDlgSystemModule::HandleOnPostLoadMapWithWorld(UWorld* LoadedWorld)\n{\n\t// NOTE: only in NON editor game\n\tif (!LoadedWorld)\n\t{\n\t\treturn;\n\t}\n\n\tLastLoadedWorld = LoadedWorld;\n\tconst UDlgSystemSettings* Settings = GetDefault<UDlgSystemSettings>();\n\tif (!Settings)\n\t{\n\t\treturn;\n\t}\n\n\tif (Settings->bRegisterDialogueConsoleCommandsAutomatically)\n\t{\n\t\tFDlgLogger::Get().Debugf(TEXT(\"PostLoadMapWithWorld = %s. Registering Console commands\"), *LoadedWorld->GetMapName());\n\t\tRegisterConsoleCommands(LoadedWorld);\n\t}\n}\n\n#undef LOCTEXT_NAMESPACE\n\n//////////////////////////////////////////////////////////////////////////\nIMPLEMENT_MODULE(FDlgSystemModule, DlgSystem)\n//////////////////////////////////////////////////////////////////////////\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystem/Private/DlgSystemSettings.cpp",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#include \"DlgSystemSettings.h\"\n\n#include \"GameFramework/Character.h\"\n\n#include \"DlgManager.h\"\n#include \"Logging/DlgLogger.h\"\n\n#define LOCTEXT_NAMESPACE \"DlgSystem\"\n\n//////////////////////////////////////////////////////////////////////////\n// UDlgSystemSettings\nUDlgSystemSettings::UDlgSystemSettings()\n{\n\tBlacklistedReflectionClasses = {AActor::StaticClass(), APawn::StaticClass(),  ACharacter::StaticClass()};\n\t// AdditionalTextFormatFileExtensionsToLookFor = {\"\"};\n\n\tDefaultTextEdgeToEndNode = LOCTEXT(\"edge_finish\", \"Finish\");\n\tDefaultTextEdgeToNormalNode = LOCTEXT(\"edge_next\", \"Next\");\n}\n\n#if WITH_EDITOR\nFText UDlgSystemSettings::GetSectionText() const\n{\n\treturn LOCTEXT(\"SectionText\", \"Dialogue\");\n}\n\nFText UDlgSystemSettings::GetSectionDescription() const\n{\n\treturn LOCTEXT(\"SectionDescription\", \"Configure how the Dialogue Editor behaves + Runtime behaviour\");\n}\n\n\n#if ENGINE_MINOR_VERSION >= 25\nbool UDlgSystemSettings::CanEditChange(const FProperty* InProperty) const\n#else\nbool UDlgSystemSettings::CanEditChange(const UProperty* InProperty) const\n#endif\n{\n\tconst bool bIsEditable = Super::CanEditChange(InProperty);\n\tif (bIsEditable && InProperty)\n\t{\n\t\tconst FName PropertyName = InProperty->GetFName();\n\n\t\t// Do now allow to change the bDrawPrimaryEdges, bDrawSecondaryEdges if we aren't even showing them\n\t\tif (!bShowPrimarySecondaryEdges &&\n\t\t\t(PropertyName == GET_MEMBER_NAME_CHECKED(ThisClass, bDrawPrimaryEdges) ||\n\t\t\t PropertyName == GET_MEMBER_NAME_CHECKED(ThisClass, bDrawSecondaryEdges)))\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\t// Only useful for GlobalNamespace\n\t\tif (DialogueTextNamespaceLocalization != EDlgTextNamespaceLocalization::Global &&\n\t\t\tPropertyName == GET_MEMBER_NAME_CHECKED(ThisClass, DialogueTextGlobalNamespaceName))\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\t// Only useful for WithPrefixPerDialogue\n\t\tif (DialogueTextNamespaceLocalization != EDlgTextNamespaceLocalization::WithPrefixPerDialogue &&\n\t\t\tPropertyName == GET_MEMBER_NAME_CHECKED(ThisClass, DialogueTextPrefixNamespaceName))\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\tif (DialogueTextNamespaceLocalization == EDlgTextNamespaceLocalization::Ignore &&\n\t\t\t(PropertyName == GET_MEMBER_NAME_CHECKED(ThisClass, LocalizationIgnoredStrings)))\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\t// Can't edit because they are not used\n\t\tif (!bSetDefaultEdgeTexts &&\n\t\t\t(PropertyName == GET_MEMBER_NAME_CHECKED(ThisClass, DefaultTextEdgeToEndNode) ||\n\t\t\t PropertyName == GET_MEMBER_NAME_CHECKED(ThisClass, DefaultTextEdgeToNormalNode) ||\n\t\t\t PropertyName == GET_MEMBER_NAME_CHECKED(ThisClass, bSetDefaultEdgeTextOnFirstChildOnly)))\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t}\n\n\treturn bIsEditable;\n}\n\nvoid UDlgSystemSettings::PostEditChangeProperty(FPropertyChangedEvent& PropertyChangedEvent)\n{\n\tSuper::PostEditChangeProperty(PropertyChangedEvent);\n\n\tconst FName PropertyName = PropertyChangedEvent.Property != nullptr ? PropertyChangedEvent.Property->GetFName() : NAME_None;\n\tif (PropertyName == GET_MEMBER_NAME_CHECKED(ThisClass, bEnableMessageLog))\n\t{\n\t\t// Prevent no logging at all\n\t\tbEnableOutputLog = !bEnableMessageLog;\n\t}\n\n\t// Check category\n\tif (PropertyChangedEvent.Property != nullptr && PropertyChangedEvent.Property->HasMetaData(TEXT(\"Category\")))\n\t{\n\t\tconst FString& Category = PropertyChangedEvent.Property->GetMetaData(TEXT(\"Category\"));\n\n\t\t// Sync logger settings\n\t\tif (Category.Equals(TEXT(\"Logger\"), ESearchCase::IgnoreCase))\n\t\t{\n\t\t\tFDlgLogger::Get().SyncWithSettings();\n\t\t}\n\t}\n}\n#endif // WITH_EDITOR\n\nbool UDlgSystemSettings::IsIgnoredTextForLocalization(const FText& Text) const\n{\n\t// Ignored texts\n\t// for (const FText& Ignored : LocalizationIgnoredTexts)\n\t// {\n\t// \tif (Text.EqualTo(Ignored))\n\t// \t{\n\t// \t\treturn false;\n\t// \t}\n\t// }\n\n\t// Ignore strings\n\tconst FString& TextSourceString = *FTextInspector::GetSourceString(Text);\n\tif (LocalizationIgnoredStrings.Contains(TextSourceString))\n\t{\n\t\treturn false;\n\t}\n\t// for (const FString& Ignored : LocalizationIgnoredStrings)\n\t// {\n\t// \tif (TextSourceString.Equals(Ignored))\n\t// \t{\n\t// \t\treturn false;\n\t// \t}\n\t// }\n\n\treturn true;\n}\n\nFString UDlgSystemSettings::GetTextFileExtension(EDlgDialogueTextFormat TextFormat)\n{\n\tswitch (TextFormat)\n\t{\n\t\t// JSON has the .json added at the end\n\t\tcase EDlgDialogueTextFormat::JSON:\n\t\t\treturn TEXT(\".dlg.json\");\n\n\t\tcase EDlgDialogueTextFormat::DialogueDEPRECATED:\n\t\t\treturn TEXT(\".dlg\");\n\n\t\t// Empty\n\t\tcase EDlgDialogueTextFormat::None:\n\t\tdefault:\n\t\t\treturn FString();\n\t}\n}\n\nconst TSet<FString>& UDlgSystemSettings::GetAllCurrentTextFileExtensions()\n{\n\tstatic TSet<FString> Extensions;\n\tif (Extensions.Num() == 0)\n\t{\n\t\t// Iterate over all possible text formats\n\t\tconst int32 TextFormatsNum = static_cast<int32>(EDlgDialogueTextFormat::NumTextFormats);\n\t\tfor (int32 TextFormatIndex = static_cast<int32>(EDlgDialogueTextFormat::StartTextFormats);\n\t\t\t\t   TextFormatIndex < TextFormatsNum; TextFormatIndex++)\n\t\t{\n\t\t\tconst EDlgDialogueTextFormat CurrentTextFormat = static_cast<EDlgDialogueTextFormat>(TextFormatIndex);\n\t\t\tExtensions.Add(GetTextFileExtension(CurrentTextFormat));\n\t\t}\n\t}\n\n\treturn Extensions;\n}\n\nTSet<FString> UDlgSystemSettings::GetAllTextFileExtensions() const\n{\n\tTSet<FString> CurrentFileExtensions = GetAllCurrentTextFileExtensions();\n\n\t// Look for additional file extensions\n\tfor (const FString& Ext : AdditionalTextFormatFileExtensionsToLookFor)\n\t{\n\t\t// Only allow file extension that start with dot, also ignore uasset\n\t\tif (Ext.StartsWith(\".\") && Ext != \".uasset\")\n\t\t{\n\t\t\tCurrentFileExtensions.Add(Ext);\n\t\t}\n\t}\n\n\treturn CurrentFileExtensions;\n}\n\n#undef LOCTEXT_NAMESPACE\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystem/Private/DlgTextArgument.cpp",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#include \"DlgTextArgument.h\"\n\n#include \"UObject/TextProperty.h\"\n\n#include \"DlgConstants.h\"\n#include \"DlgContext.h\"\n#include \"DlgHelper.h\"\n#include \"DlgDialogueParticipant.h\"\n#include \"NYReflectionHelper.h\"\n#include \"Logging/DlgLogger.h\"\n\nFFormatArgumentValue FDlgTextArgument::ConstructFormatArgumentValue(const UDlgContext& Context, FName NodeOwner) const\n{\n\t// If participant name is not valid we use the node owner name\n\tconst FName ValidParticipantName = ParticipantName == NAME_None ? NodeOwner : ParticipantName;\n\tconst UObject* Participant = Context.GetParticipant(ValidParticipantName);\n\tif (Participant == nullptr)\n\t{\n\t\tFDlgLogger::Get().Errorf(\n\t\t\tTEXT(\"FAILED to construct text argument because the PARTICIPANT is INVALID (Supplied Participant = %s). \\nContext:\\n\\t%s, DisplayString = %s, ParticipantName = %s, ArgumentType = %s\"),\n\t\t\t*ValidParticipantName.ToString(), *Context.GetContextString(), *DisplayString, *ParticipantName.ToString(), *ArgumentTypeToString(Type)\n\t\t);\n\t\treturn FFormatArgumentValue(FText::FromString(TEXT(\"[CustomTextArgument is INVALID. Missing Participant. Check log]\")));\n\t}\n\n\tswitch (Type)\n\t{\n\t\tcase EDlgTextArgumentType::DialogueInt:\n\t\t\treturn FFormatArgumentValue(IDlgDialogueParticipant::Execute_GetIntValue(Participant, VariableName));\n\n\t\tcase EDlgTextArgumentType::ClassInt:\n\t\t\treturn FFormatArgumentValue(FNYReflectionHelper::GetVariable<FNYIntProperty, int32>(Participant, VariableName));\n\n\t\tcase EDlgTextArgumentType::DialogueFloat:\n\t\t\treturn FFormatArgumentValue(IDlgDialogueParticipant::Execute_GetFloatValue(Participant, VariableName));\n\n\t\tcase EDlgTextArgumentType::ClassFloat:\n\t\t\treturn FFormatArgumentValue(FNYReflectionHelper::GetVariable<FNYFloatProperty, float>(Participant, VariableName));\n\n\t\tcase EDlgTextArgumentType::ClassText:\n\t\t\treturn FFormatArgumentValue(FNYReflectionHelper::GetVariable<FNYTextProperty, FText>(Participant, VariableName));\n\n\t\tcase EDlgTextArgumentType::DisplayName:\n\t\t\treturn FFormatArgumentValue(IDlgDialogueParticipant::Execute_GetParticipantDisplayName(Participant, NodeOwner));\n\n\t\tcase EDlgTextArgumentType::Gender:\n\t\t\treturn FFormatArgumentValue(IDlgDialogueParticipant::Execute_GetParticipantGender(Participant));\n\n\t\tcase EDlgTextArgumentType::Custom:\n\t\t\tif (CustomTextArgument == nullptr)\n\t\t\t{\n\t\t\t\tFDlgLogger::Get().Errorf(\n\t\t\t\t\tTEXT(\"Custom Text Argument is INVALID. Returning Error Text. Context:\\n\\t%s, Participant = %s\"),\n\t\t\t\t\t*Context.GetContextString(), Participant ? *Participant->GetPathName() : TEXT(\"INVALID\")\n\t\t\t\t);\n\t\t\t\treturn FFormatArgumentValue(FText::FromString(TEXT(\"[CustomTextArgument is INVALID. Missing Custom Text Argument. Check log]\")));\n\t\t\t}\n\n\t\t\treturn FFormatArgumentValue(CustomTextArgument->GetText(&Context, Participant, DisplayString));\n\n\t\tdefault:\n\t\t\tcheckNoEntry();\n\t\t\treturn FFormatArgumentValue(0);\n\t}\n}\n\nvoid FDlgTextArgument::UpdateTextArgumentArray(const FText& Text, TArray<FDlgTextArgument>& InOutArgumentArray)\n{\n\tTArray<FString> NewArgumentParams;\n\tFText::GetFormatPatternParameters(Text, NewArgumentParams);\n\n\tTArray<FDlgTextArgument> OldArguments = InOutArgumentArray;\n\tInOutArgumentArray.Empty();\n\n\tfor (const FString& String : NewArgumentParams)\n\t{\n\t\tFDlgTextArgument Argument;\n\t\tArgument.DisplayString = String;\n\n\t\t// Replace with old argument values if display string matches\n\t\tfor (const FDlgTextArgument& OldArgument : OldArguments)\n\t\t{\n\t\t\tif (String == OldArgument.DisplayString)\n\t\t\t{\n\t\t\t\tArgument = OldArgument;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tInOutArgumentArray.Add(Argument);\n\t}\n}\n\nFString FDlgTextArgument::ArgumentTypeToString(EDlgTextArgumentType Type)\n{\n\tFString EnumValue;\n\tFDlgHelper::ConvertEnumToString<EDlgTextArgumentType>(TEXT(\"EDlgTextArgumentType\"), Type, false, EnumValue);\n\treturn EnumValue;\n}\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystem/Private/GameplayDebugger/DlgDataDisplayTreeNode.cpp",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#include \"GameplayDebugger/DlgDataDisplayTreeNode.h\"\n\n#define LOCTEXT_NAMESPACE \"FDlgDataDisplayTreeNode\"\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// FDlgDataDisplayTreeNode\nFDlgDataDisplayTreeNode::FDlgDataDisplayTreeNode(const FText& InDisplayText, const TSharedPtr<Self>& InParent)\n\t: Super(InDisplayText, InParent)\n{\n}\n\nTWeakObjectPtr<AActor> FDlgDataDisplayTreeNode::GetParentActor() const\n{\n\tif (Parent.IsValid())\n\t{\n\t\treturn Parent.Pin()->GetParentActor();\n\t}\n\n\treturn nullptr;\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// FDialogueBrowserTreeRootNode\nFDlgDataDisplayTreeRootNode::FDlgDataDisplayTreeRootNode() :\n\tSuper(FText::FromString(TEXT(\"ROOT\")), nullptr)\n{\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// FDlgDataDisplayTreeActorNode\nFDlgDataDisplayTreeActorNode::FDlgDataDisplayTreeActorNode(\n\tconst FText& InDisplayText,\n\tconst TSharedPtr<FDlgDataDisplayTreeNode>& InParent,\n\tTWeakObjectPtr<AActor> InActor\n) : Super(InDisplayText, InParent), Actor(InActor)\n{\n\tTextType = EDlgDataDisplayTextTreeNodeType::Actor;\n}\n\nTWeakObjectPtr<AActor> FDlgDataDisplayTreeActorNode::GetParentActor() const\n{\n\t// Get the Actor from this.\n\tif (Actor.IsValid())\n\t{\n\t\treturn Actor;\n\t}\n\n\treturn Super::GetParentActor();\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// FDlgDataDisplayTreeCategoryNode\nFDlgDataDisplayTreeCategoryNode::FDlgDataDisplayTreeCategoryNode(\n\tconst FText& InDisplayText,\n\tconst TSharedPtr<FDlgDataDisplayTreeNode>& InParent,\n\tEDlgDataDisplayCategoryTreeNodeType InCategoryType\n) : Super(InDisplayText, InParent)\n{\n\tCategoryType = InCategoryType;\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// FDlgDataDisplayTreeVariableNode\nFDlgDataDisplayTreeVariableNode::FDlgDataDisplayTreeVariableNode(\n\tconst FText& InDisplayText,\n\tconst TSharedPtr<FDlgDataDisplayTreeNode>& InParent,\n\tFName InVariableName,\n\tEDlgDataDisplayVariableTreeNodeType InVariableType\n) : Super(InDisplayText, InParent), VariableName(InVariableName), VariableType(InVariableType)\n{\n\tTextType = EDlgDataDisplayTextTreeNodeType::Variable;\n}\n\n#undef LOCTEXT_NAMESPACE\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystem/Private/GameplayDebugger/DlgGameplayDebuggerCategory.cpp",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#if WITH_GAMEPLAY_DEBUGGER\n#include \"GameplayDebugger/DlgGameplayDebuggerCategory.h\"\n\n#include \"DebugRenderSceneProxy.h\"\n\n#include \"DlgManager.h\"\n\nFDlgGameplayDebuggerCategory::FDlgGameplayDebuggerCategory()\n{\n\tbShowOnlyWithDebugActor = false;\n}\n\nvoid FDlgGameplayDebuggerCategory::CollectData(APlayerController* OwnerPC, AActor* DebugActor)\n{\n\tData.NumLoadedDialogues = UDlgManager::GetAllDialoguesFromMemory().Num();\n\n\tif (DebugActor)\n\t{\n\n\t}\n}\n\nvoid FDlgGameplayDebuggerCategory::DrawData(APlayerController* OwnerPC, FGameplayDebuggerCanvasContext& CanvasContext)\n{\n\tCanvasContext.Printf(TEXT(\"{green}Number loaded Dialogues: %s\"), *FString::FromInt(Data.NumLoadedDialogues));\n}\n\n#endif // WITH_GAMEPLAY_DEBUGGER\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystem/Private/GameplayDebugger/SDlgDataDisplay.cpp",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#include \"GameplayDebugger/SDlgDataDisplay.h\"\n\n#include \"Widgets/Layout/SBorder.h\"\n#include \"Widgets/Text/STextBlock.h\"\n#include \"Widgets/Layout/SMissingWidget.h\"\n#include \"Widgets/Input/SButton.h\"\n#include \"Widgets/SBoxPanel.h\"\n\n// #if WITH_EDITOR\n// #include \"Editor.h\"\n// #endif\n\n#include \"DlgManager.h\"\n#include \"DlgContext.h\"\n#include \"GameplayDebugger/SDlgDataPropertyValues.h\"\n#include \"Logging/DlgLogger.h\"\n\n//////////////////////////////////////////////////////////////////////////\nDEFINE_LOG_CATEGORY(LogDlgSystemDataDisplay)\n//////////////////////////////////////////////////////////////////////////\n\n#define LOCTEXT_NAMESPACE \"SDlgDataDisplay\"\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// SDlgDataDisplay\nvoid SDlgDataDisplay::Construct(const FArguments& InArgs, const TWeakObjectPtr<const UObject>& InWorldContextObjectPtr)\n{\n\tWorldContextObjectPtr = InWorldContextObjectPtr;\n\tRootTreeItem = MakeShared<FDlgDataDisplayTreeRootNode>();\n\tActorsTreeView = SNew(STreeView<TSharedPtr<FDlgDataDisplayTreeNode>>)\n\t\t.ItemHeight(32)\n\t\t.TreeItemsSource(&RootChildren)\n\t\t.OnGenerateRow(this, &Self::HandleGenerateRow)\n\t\t.OnSelectionChanged(this, &Self::HandleTreeSelectionChanged)\n\t\t.OnGetChildren(this, &Self::HandleGetChildren)\n\t\t.SelectionMode(ESelectionMode::Single)\n\t\t.OnMouseButtonDoubleClick(this, &Self::HandleDoubleClick)\n\t\t.OnSetExpansionRecursive(this, &Self::HandleSetExpansionRecursive)\n\t\t.HeaderRow(\n\t\t\tSNew(SHeaderRow)\n\t\t\t.Visibility(EVisibility::Visible)\n\t\t\t+SHeaderRow::Column(NAME_Name)\n\t\t\t.DefaultLabel(LOCTEXT(\"Name\", \"Name\"))\n\t\t);\n\n\tChildSlot\n\t[\n\t\tSNew(SBorder)\n\t\t.BorderImage(FCoreStyle::Get().GetBrush(\"ToolPanel.GroupBorder\"))\n\t\t.BorderBackgroundColor(FLinearColor::Gray) // Darken the outer border\n\t\t[\n\t\t\tSNew(SVerticalBox)\n\n\t\t\t// Top bar\n\t\t\t+SVerticalBox::Slot()\n\t\t\t.AutoHeight()\n\t\t\t.Padding(2.f, 1.f)\n\t\t\t[\n\t\t\t\tSNew(SHorizontalBox)\n\n\t\t\t\t// Search Input\n\t\t\t\t+SHorizontalBox::Slot()\n\t\t\t\t.FillWidth(1.0f)\n\t\t\t\t.Padding(0.f, 0.f, 4.f, 0.f)\n\t\t\t\t[\n\t\t\t\t\tGetFilterTextBoxWidget()\n\t\t\t\t]\n\n\t\t\t\t// Refresh Actors\n\t\t\t\t+SHorizontalBox::Slot()\n\t\t\t\t.AutoWidth()\n\t\t\t\t[\n\t\t\t\t\tSNew(SButton)\n\t\t\t\t\t.ToolTipText(LOCTEXT(\"RefreshToolTip\", \"Refreshes/Reloads the Actors Dialogue data.\"))\n\t\t\t\t\t.OnClicked(this, &Self::HandleOnRefresh)\n\t\t\t\t\t[\n\t\t\t\t\t\tSNew(STextBlock)\n\t\t\t\t\t\t.Text(LOCTEXT(\"RefreshDialogues\", \"Refresh\"))\n\t\t\t\t\t]\n\t\t\t\t]\n\t\t\t]\n\n\t\t\t// The Tree view\n\t\t\t+SVerticalBox::Slot()\n\t\t\t.AutoHeight()\n\t\t\t.FillHeight(1.0f)\n\t\t\t[\n\t\t\t\tSNew(SBorder)\n\t\t\t\t.BorderImage(FCoreStyle::Get().GetBrush(\"ToolPanel.GroupBorder\"))\n\t\t\t\t.Padding(FMargin(0.0f, 4.0f))\n\t\t\t\t[\n\t\t\t\t\tActorsTreeView.ToSharedRef()\n\t\t\t\t]\n\t\t\t]\n\t\t]\n\t];\n\n\tRefreshTree(false);\n}\n\nvoid SDlgDataDisplay::RefreshTree(bool bPreserveExpansion)\n{\n\t// First, save off current expansion state\n\tTSet<TSharedPtr<FDlgDataDisplayTreeNode>> OldExpansionState;\n\tif (bPreserveExpansion)\n\t{\n\t\tActorsTreeView->GetExpandedItems(OldExpansionState);\n\t}\n\n\tRootTreeItem->ClearChildren();\n\tRootChildren.Empty();\n\tActorsProperties.Empty();\n\n\t// Try the actor World\n\tUWorld* World = WorldContextObjectPtr.IsValid() ? WorldContextObjectPtr->GetWorld() : nullptr;\n\n// \t// Try The Editor World\n// #if WITH_EDITOR\n// \tif (World == nullptr && GEditor)\n// \t{\n// \t\tWorld = GEditor->GetEditorWorldContext().World();\n// \t}\n// #endif\n\n\t// Can't do anything without the world\n\tif (!IsValid(World))\n\t{\n\t\tFDlgLogger::Get().Error(\n\t\t\tTEXT(\"Failed to refresh SDlgDataDisplay tree. World is a null pointer. \"\n\t\t\t\t\"Is the game running? \"\n\t\t\t\t\"Did you setup the DlgSystem Console commands in your GameMode BeginPlay/StartPlay?\")\n\t\t);\n\t\treturn;\n\t}\n\n\tconst TArray<UDlgDialogue*> Dialogues = UDlgManager::GetAllDialoguesFromMemory();\n\tconst TArray<TWeakObjectPtr<AActor>> Actors = UDlgManager::GetAllWeakActorsWithDialogueParticipantInterface(World);\n\n\t// Build fast lookup for ParticipantNames\n\t// Maps from ParticipantName => Array of Dialogues that have this Participant.\n\tTMap<FName, TSet<TWeakObjectPtr<const UDlgDialogue>>> ParticipantNamesDialoguesMap;\n\tfor (const UDlgDialogue* Dialogue : Dialogues)\n\t{\n\t\tTSet<FName> ParticipantsNames;\n\t\tDialogue->GetAllParticipantNames(ParticipantsNames);\n\n\t\tfor (const FName& ParticipantName : ParticipantsNames)\n\t\t{\n\t\t\tTSet<TWeakObjectPtr<const UDlgDialogue>>* ValuePtr = ParticipantNamesDialoguesMap.Find(ParticipantName);\n\t\t\tif (ValuePtr == nullptr)\n\t\t\t{\n\t\t\t\t// does not exist\n\t\t\t\tTSet<TWeakObjectPtr<const UDlgDialogue>> ValueArray{Dialogue};\n\t\t\t\tParticipantNamesDialoguesMap.Add(ParticipantName, ValueArray);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t// exists, add the Dialogue\n\t\t\t\tValuePtr->Add(Dialogue);\n\t\t\t}\n\t\t}\n\t}\n\n\t// Build the fast lookup structure for Actors (the ActorsProperties)\n\tfor (TWeakObjectPtr<AActor> Actor : Actors)\n\t{\n\t\tif (!Actor.IsValid())\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\t// Should never happen, the actor should always be unique in the Actors array.\n\t\tensure(ActorsProperties.Find(Actor) == nullptr);\n\n\t\t// Find out the Dialogues that have the ParticipantName of this Actor.\n\t\tconst FName ParticipantName = IDlgDialogueParticipant::Execute_GetParticipantName(Actor.Get());\n\t\tTSet<TWeakObjectPtr<const UDlgDialogue>> ActorDialogues;\n\t    TSet<TWeakObjectPtr<const UDlgDialogue>>* ActorDialoguesPtr = ParticipantNamesDialoguesMap.Find(ParticipantName);\n\t\tif (ActorDialoguesPtr != nullptr)\n\t\t{\n\t\t\t// Found some dialogue\n\t\t\tActorDialogues = *ActorDialoguesPtr;\n\t\t}\n\n\t\t// Create Key in the ActorsProperties for this Actor.\n\t\tTSharedPtr<FDlgDataDisplayActorProperties> ActorsPropertiesValue =\n\t\t\tMakeShared<FDlgDataDisplayActorProperties>(ActorDialogues);\n\t\tActorsProperties.Add(Actor, ActorsPropertiesValue);\n\n\t\t// Gather Data from the Dialogues\n\t\tfor (TWeakObjectPtr<const UDlgDialogue> Dialogue : ActorDialogues)\n\t\t{\n\t\t\tif (!Dialogue.IsValid())\n\t\t\t{\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Populate Event Names\n\t\t\tTSet<FName> EventsNames;\n\t\t\tDialogue->GetEvents(ParticipantName, EventsNames);\n\t\t\tfor (const FName& EventName : EventsNames)\n\t\t\t{\n\t\t\t\tActorsPropertiesValue->AddDialogueToEvent(EventName, Dialogue);\n\t\t\t}\n\n\t\t\t// Populate conditions\n\t\t\tTSet<FName> ConditionNames;\n\t\t\tDialogue->GetConditions(ParticipantName, ConditionNames);\n\t\t\tfor (const FName& ConditionName : ConditionNames)\n\t\t\t{\n\t\t\t\tActorsPropertiesValue->AddDialogueToCondition(ConditionName, Dialogue);\n\t\t\t}\n\n\t\t\t// Populate int variable names\n\t\t\tTSet<FName> IntVariableNames;\n\t\t\tDialogue->GetIntNames(ParticipantName, IntVariableNames);\n\t\t\tfor (const FName& IntVariableName : IntVariableNames)\n\t\t\t{\n\t\t\t\tActorsPropertiesValue->AddDialogueToIntVariable(IntVariableName, Dialogue);\n\t\t\t}\n\n\t\t\t// Populate float variable names\n\t\t\tTSet<FName> FloatVariableNames;\n\t\t\tDialogue->GetFloatNames(ParticipantName, FloatVariableNames);\n\t\t\tfor (const FName& FloatVariableName : FloatVariableNames)\n\t\t\t{\n\t\t\t\tActorsPropertiesValue->AddDialogueToFloatVariable(FloatVariableName, Dialogue);\n\t\t\t}\n\n\t\t\t// Populate bool variable names\n\t\t\tTSet<FName> BoolVariableNames;\n\t\t\tDialogue->GetBoolNames(ParticipantName, BoolVariableNames);\n\t\t\tfor (const FName& BoolVariableName : BoolVariableNames)\n\t\t\t{\n\t\t\t\tActorsPropertiesValue->AddDialogueToBoolVariable(BoolVariableName, Dialogue);\n\t\t\t}\n\n\t\t\t// Populate FName variable names\n\t\t\tTSet<FName> FNameVariableNames;\n\t\t\tDialogue->GetNameNames(ParticipantName, FNameVariableNames);\n\t\t\tfor (const FName& NameVariableName : FNameVariableNames)\n\t\t\t{\n\t\t\t\tActorsPropertiesValue->AddDialogueToFNameVariable(NameVariableName, Dialogue);\n\t\t\t}\n\n\t\t\t// Populate UClass int variable names\n\t\t\tTSet<FName> ClassIntVariableNames;\n\t\t\tDialogue->GetClassIntNames(ParticipantName, ClassIntVariableNames);\n\t\t\tfor (const FName& IntVariableName : ClassIntVariableNames)\n\t\t\t{\n\t\t\t\tActorsPropertiesValue->AddDialogueToClassIntVariable(IntVariableName, Dialogue);\n\t\t\t}\n\n\t\t\t// Populate UClass float variable names\n\t\t\tTSet<FName> ClassFloatVariableNames;\n\t\t\tDialogue->GetClassFloatNames(ParticipantName, ClassFloatVariableNames);\n\t\t\tfor (const FName& FloatVariableName : ClassFloatVariableNames)\n\t\t\t{\n\t\t\t\tActorsPropertiesValue->AddDialogueToClassFloatVariable(FloatVariableName, Dialogue);\n\t\t\t}\n\n\t\t\t// Populate UClass bool variable names\n\t\t\tTSet<FName> ClassBoolVariableNames;\n\t\t\tDialogue->GetClassBoolNames(ParticipantName, ClassBoolVariableNames);\n\t\t\tfor (const FName& BoolVariableName : ClassBoolVariableNames)\n\t\t\t{\n\t\t\t\tActorsPropertiesValue->AddDialogueToClassBoolVariable(BoolVariableName, Dialogue);\n\t\t\t}\n\n\t\t\t// Populate UClass FName variable names\n\t\t\tTSet<FName> ClassFNameVariableNames;\n\t\t\tDialogue->GetClassNameNames(ParticipantName, ClassFNameVariableNames);\n\t\t\tfor (const FName& NameVariableName : ClassFNameVariableNames)\n\t\t\t{\n\t\t\t\tActorsPropertiesValue->AddDialogueToClassFNameVariable(NameVariableName, Dialogue);\n\t\t\t}\n\n\t\t\t// Populate UClass FText variable names\n\t\t\tTSet<FName> ClassFTextVariableNames;\n\t\t\tDialogue->GetClassTextNames(ParticipantName, ClassFTextVariableNames);\n\t\t\tfor (const FName& NameVariableName : ClassFTextVariableNames)\n\t\t\t{\n\t\t\t\tActorsPropertiesValue->AddDialogueToClassFTextVariable(NameVariableName, Dialogue);\n\t\t\t}\n\t\t}\n\t}\n\n\t// Build the Actors Tree View (aka the actual tree)\n\tfor (const auto& Elem : ActorsProperties)\n\t{\n\t\t// Key: AActor\n\t\tif (!Elem.Key.IsValid())\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\n\t\tAActor* Actor = Elem.Key.Get();\n\t\tTSharedPtr<FDlgDataDisplayTreeNode> ActorItem =\n\t\t\tMakeShared<FDlgDataDisplayTreeActorNode>(FText::FromString(Actor->GetName()), RootTreeItem, Actor);\n\t\tBuildTreeViewItem(ActorItem);\n\t\tRootTreeItem->AddChild(ActorItem);\n\t}\n\tRootChildren = RootTreeItem->GetChildren();\n\n\t// Clear Previous states\n\tActorsTreeView->ClearSelection();\n\t// Triggers RequestTreeRefresh\n\tActorsTreeView->ClearExpandedItems();\n\n\t// Restore old Expansion\n\tif (bPreserveExpansion && OldExpansionState.Num() > 0)\n\t{\n\t\t// Flattened tree\n\t\tTArray<TSharedPtr<FDlgDataDisplayTreeNode>> AllNodes;\n\t\tRootTreeItem->GetAllNodes(AllNodes);\n\n\t\t// Expand to match the old state\n\t\tFDlgTreeViewHelper::RestoreTreeExpansionState<TSharedPtr<FDlgDataDisplayTreeNode>>(ActorsTreeView,\n\t\t\tAllNodes, OldExpansionState, Self::PredicateCompareDlgDataDisplayTreeNode);\n\t}\n}\n\nvoid SDlgDataDisplay::GenerateFilteredItems()\n{\n\tif (FilterString.IsEmpty())\n\t{\n\t\t// No filtering, empty filter, restore original\n\t\tRefreshTree(false);\n\t\treturn;\n\t}\n\n\t// Get all valid paths\n\tTArray<TArray<TSharedPtr<FDlgDataDisplayTreeNode>>> OutPaths;\n\tRootTreeItem->FilterPathsToNodesThatContainText(FilterString, OutPaths);\n\tRootChildren.Empty();\n\tRootTreeItem->GetVisibleChildren(RootChildren);\n\n\t// Refresh, clear expansion\n\tActorsTreeView->ClearExpandedItems(); // Triggers RequestTreeRefresh\n\n\t// Mark paths as expanded\n\tfor (const TArray<TSharedPtr<FDlgDataDisplayTreeNode>>& Path : OutPaths)\n\t{\n\t\tconst int32 PathNum = Path.Num();\n\t\tfor (int32 PathIndex = 0; PathIndex < PathNum; PathIndex++)\n\t\t{\n\t\t\tPath[PathIndex]->SetIsVisible(true);\n\t\t\tActorsTreeView->SetItemExpansion(Path[PathIndex], true);\n\t\t}\n\t}\n}\n\nTSharedRef<SWidget> SDlgDataDisplay::GetFilterTextBoxWidget()\n{\n\t// Is it cached?\n\tif (FilterTextBoxWidget.IsValid())\n\t{\n\t\treturn FilterTextBoxWidget.ToSharedRef();\n\t}\n\n\t// Cache it\n\tFilterTextBoxWidget = SNew(SSearchBox)\n\t\t.HintText(LOCTEXT(\"SearchBoxHintText\", \"Search by Name\"))\n\t\t.OnTextChanged(this, &Self::HandleSearchTextCommited, ETextCommit::Default)\n\t\t.OnTextCommitted(this, &Self::HandleSearchTextCommited)\n\t\t.SelectAllTextWhenFocused(false)\n\t\t.DelayChangeNotificationsWhileTyping(false);\n\n\t// Should return a valid widget\n\treturn GetFilterTextBoxWidget();\n}\n\nvoid SDlgDataDisplay::AddVariableChildrenToItem(\n\tconst TSharedPtr<FDlgDataDisplayTreeNode>& Item,\n\tconst TMap<FName, TSharedPtr<FDlgDataDisplayVariableProperties>>& Variables,\n\tconst FText& DisplayTextFormat,\n\tEDlgDataDisplayVariableTreeNodeType VariableType\n)\n{\n\tif (!Item.IsValid())\n\t{\n\t\treturn;\n\t}\n\n\tfor (const auto& Pair : Variables)\n\t{\n\t\tconst FName VariableName = Pair.Key;\n\t\tFFormatOrderedArguments Args;\n\t\tArgs.Add(FText::FromName(VariableName));\n\t\tconst FText DisplayText = FText::Format(DisplayTextFormat, Args);\n\n\t\t// Create Node\n\t\tconst TSharedPtr<FDlgDataDisplayTreeVariableNode> ChildItem =\n\t\t\tMakeShared<FDlgDataDisplayTreeVariableNode>(DisplayText, Item, VariableName, VariableType);\n\t\tItem->AddChild(ChildItem);\n\t}\n}\n\nvoid SDlgDataDisplay::BuildTreeViewItem(const TSharedPtr<FDlgDataDisplayTreeNode>& Item)\n{\n\tTWeakObjectPtr<AActor> Actor = Item->GetParentActor();\n\tif (!Actor.IsValid())\n\t{\n\t\treturn;\n\t}\n\n\t// Do we have the actor cached?\n\tTSharedPtr<FDlgDataDisplayActorProperties>* ValuePtr = ActorsProperties.Find(Actor);\n\tif (ValuePtr == nullptr)\n\t{\n\t\treturn;\n\t}\n\tTSharedPtr<FDlgDataDisplayActorProperties> ActorPropertiesValue = *ValuePtr;\n\n\tif (Item->IsText())\n\t{\n\t\tswitch (Item->GetTextType())\n\t\t{\n\t\t\tcase EDlgDataDisplayTextTreeNodeType::Actor:\n\t\t\t\tItem->AddChild(MakeShared<FDlgDataDisplayTreeCategoryNode>(\n\t\t\t\t\tLOCTEXT(\"EventKey\", \"Events\"), Item, EDlgDataDisplayCategoryTreeNodeType::Event));\n\t\t\t\tItem->AddChild(MakeShared<FDlgDataDisplayTreeCategoryNode>(\n\t\t\t\t\tLOCTEXT(\"ConditionKey\", \"Conditions\"), Item, EDlgDataDisplayCategoryTreeNodeType::Condition));\n\t\t\t\tItem->AddChild(MakeShared<FDlgDataDisplayTreeCategoryNode>(\n\t\t\t\t\tLOCTEXT(\"VariablesKey\", \"Variables\"), Item, EDlgDataDisplayCategoryTreeNodeType::Variables));\n\t\t\t\tbreak;\n\n\t\t\tcase EDlgDataDisplayTextTreeNodeType::Variable:\n\t\t\t\t// No children for variable.\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tunimplemented()\n\t\t}\n\t}\n\telse if (Item->IsCategory())\n\t{\n\t\t// Add variables for each appropriate category\n\t\tswitch (Item->GetCategoryType())\n\t\t{\n\t\t\tcase EDlgDataDisplayCategoryTreeNodeType::Event:\n\t\t\t\tfor (const auto& Pair: ActorPropertiesValue->GetEvents())\n\t\t\t\t{\n\t\t\t\t\tconst TSharedPtr<FDlgDataDisplayTreeNode> EventItem = MakeShared<FDlgDataDisplayTreeVariableNode>(\n\t\t\t\t\t\tFText::FromName(Pair.Key), Item, Pair.Key, EDlgDataDisplayVariableTreeNodeType::Event\n\t\t\t\t\t);\n\t\t\t\t\tItem->AddChild(EventItem);\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase EDlgDataDisplayCategoryTreeNodeType::Condition:\n\t\t\t\tfor (const auto& Pair: ActorPropertiesValue->GetConditions())\n\t\t\t\t{\n\t\t\t\t\tconst TSharedPtr<FDlgDataDisplayTreeNode> ConditionItem = MakeShared<FDlgDataDisplayTreeVariableNode>(\n\t\t\t\t\t\tFText::FromName(Pair.Key), Item, Pair.Key, EDlgDataDisplayVariableTreeNodeType::Condition\n\t\t\t\t\t);\n\t\t\t\t\tItem->AddChild(ConditionItem);\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase EDlgDataDisplayCategoryTreeNodeType::Variables:\n\t\t\t{\n\t\t\t\tAddVariableChildrenToItem(Item, ActorPropertiesValue->GetIntegers(),\n\t\t\t\t\tLOCTEXT(\"VariableIntKey\", \"int {0} = \"), EDlgDataDisplayVariableTreeNodeType::Integer);\n\t\t\t\tAddVariableChildrenToItem(Item, ActorPropertiesValue->GetFloats(),\n\t\t\t\t\tLOCTEXT(\"VariableFloatKey\", \"float {0} = \"), EDlgDataDisplayVariableTreeNodeType::Float);\n\t\t\t\tAddVariableChildrenToItem(Item, ActorPropertiesValue->GetBools(),\n\t\t\t\t\tLOCTEXT(\"VariableBoolKey\", \"bool {0} = \"), EDlgDataDisplayVariableTreeNodeType::Bool);\n\t\t\t\tAddVariableChildrenToItem(Item, ActorPropertiesValue->GetFNames(),\n\t\t\t\t\tLOCTEXT(\"VariableFNameKey\", \"FName {0} = \"), EDlgDataDisplayVariableTreeNodeType::FName);\n\n\t\t\t\tAddVariableChildrenToItem(Item, ActorPropertiesValue->GetClassIntegers(),\n\t\t\t\t\tLOCTEXT(\"VariableIntKey\", \"int {0} = \"), EDlgDataDisplayVariableTreeNodeType::ClassInteger);\n\t\t\t\tAddVariableChildrenToItem(Item, ActorPropertiesValue->GetClassFloats(),\n\t\t\t\t\tLOCTEXT(\"VariableFloatKey\", \"float {0} = \"), EDlgDataDisplayVariableTreeNodeType::ClassFloat);\n\t\t\t\tAddVariableChildrenToItem(Item, ActorPropertiesValue->GetClassBools(),\n\t\t\t\t\tLOCTEXT(\"VariableBoolKey\", \"bool {0} = \"), EDlgDataDisplayVariableTreeNodeType::ClassBool);\n\t\t\t\tAddVariableChildrenToItem(Item, ActorPropertiesValue->GetClassFNames(),\n\t\t\t\t\tLOCTEXT(\"VariableFNameKey\", \"FName {0} = \"), EDlgDataDisplayVariableTreeNodeType::ClassFName);\n\t\t\t\tAddVariableChildrenToItem(Item, ActorPropertiesValue->GetClassFTexts(),\n\t\t\t\t\tLOCTEXT(\"VariableFTextKey\", \"FText {0} = \"), EDlgDataDisplayVariableTreeNodeType::ClassFText);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tdefault:\n\t\t\t\tunimplemented();\n\t\t}\n\t}\n\n\t// Recursively call on children\n\tfor (const TSharedPtr<FDlgDataDisplayTreeNode>& ChildItem : Item->GetChildren())\n\t{\n\t\tBuildTreeViewItem(ChildItem);\n\t}\n}\n\nvoid SDlgDataDisplay::HandleSearchTextCommited(const FText& InText, ETextCommit::Type InCommitType)\n{\n\t// Trim and sanitized the filter text (so that it more likely matches)\n\tFilterString = FText::TrimPrecedingAndTrailing(InText).ToString();\n\tGenerateFilteredItems();\n}\n\nTSharedRef<ITableRow> SDlgDataDisplay::HandleGenerateRow(TSharedPtr<FDlgDataDisplayTreeNode> InItem,\n\tconst TSharedRef<STableViewBase>& OwnerTable)\n{\n\t// Build row\n\tTSharedPtr<STableRow<TSharedPtr<FDlgDataDisplayTreeNode>>> TableRow;\n\tconst FMargin RowPadding = FMargin(2.f, 2.f);\n\tTableRow = SNew(STableRow<TSharedPtr<FDlgDataDisplayTreeNode>>, OwnerTable)\n\t\t.Padding(1.0f);\n\n\t// Default row content\n\tTSharedPtr<STextBlock> DefaultTextBlock = SNew(STextBlock)\n\t\t.Text(InItem->GetDisplayText())\n\t\t.HighlightText(this, &Self::GetFilterText);\n\n\tTSharedPtr<SWidget> RowContent = DefaultTextBlock;\n\tTSharedPtr<SHorizontalBox> RowContainer;\n\tTableRow->SetRowContent(SAssignNew(RowContainer, SHorizontalBox));\n\n\tif (InItem->IsText())\n\t{\n\t\t// Add custom widget for variables/events/conditions\n\t\tif (InItem->GetTextType() == EDlgDataDisplayTextTreeNodeType::Variable)\n\t\t{\n\t\t\tTSharedPtr<SDlgDataPropertyValue> RightWidget;\n\t\t\tTSharedPtr<FDlgDataDisplayTreeVariableNode> VariableNode =\n\t\t\t\tStaticCastSharedPtr<FDlgDataDisplayTreeVariableNode>(InItem);\n\n\t\t\t// The widget on the right depends on the variable type.\n\t\t\tswitch (VariableNode->GetVariableType())\n\t\t\t{\n\t\t\t\tcase EDlgDataDisplayVariableTreeNodeType::Integer:\n\t\t\t\tcase EDlgDataDisplayVariableTreeNodeType::Float:\n\t\t\t\tcase EDlgDataDisplayVariableTreeNodeType::FName:\n\t\t\t\tcase EDlgDataDisplayVariableTreeNodeType::ClassInteger:\n\t\t\t\tcase EDlgDataDisplayVariableTreeNodeType::ClassFloat:\n\t\t\t\tcase EDlgDataDisplayVariableTreeNodeType::ClassFName:\n\t\t\t\tcase EDlgDataDisplayVariableTreeNodeType::ClassFText:\n\t\t\t\t\t// Editable text box\n\t\t\t\t\tSAssignNew(RightWidget, SDlgDataTextPropertyValue, VariableNode);\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase EDlgDataDisplayVariableTreeNodeType::Event:\n\t\t\t\t\t// Trigger Event Button\n\t\t\t\t\tSAssignNew(RightWidget, SDlgDataEventPropertyValue, VariableNode);\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase EDlgDataDisplayVariableTreeNodeType::Bool:\n\t\t\t\tcase EDlgDataDisplayVariableTreeNodeType::ClassBool:\n\t\t\t\tcase EDlgDataDisplayVariableTreeNodeType::Condition:\n\t\t\t\t\t// Checkbox\n\t\t\t\t\tSAssignNew(RightWidget, SDlgDataBoolPropertyValue, VariableNode);\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase EDlgDataDisplayVariableTreeNodeType::Default:\n\t\t\t\tdefault:\n\t\t\t\t\t// Static text\n\t\t\t\t\tSAssignNew(RightWidget, SDlgDataPropertyValue, VariableNode);\n\t\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tRowContent = SNew(SHorizontalBox)\n\t\t\t\t// <variable type> <variable name> =\n\t\t\t\t+SHorizontalBox::Slot()\n\t\t\t\t.FillWidth(1.0f)\n\t\t\t\t.HAlign(HAlign_Left)\n\t\t\t\t.VAlign(VAlign_Center)\n\t\t\t\t[\n\t\t\t\t\tDefaultTextBlock.ToSharedRef()\n\t\t\t\t]\n\n\t\t\t\t+SHorizontalBox::Slot()\n\t\t\t\t.FillWidth(1.0f)\n\t\t\t\t.HAlign(HAlign_Left)\n\t\t\t\t.VAlign(VAlign_Center)\n\t\t\t\t[\n\t\t\t\t\tRightWidget.ToSharedRef()\n\t\t\t\t];\n\t\t}\n\t}\n\n\t// Add expand arrow\n\tRowContainer->AddSlot()\n\t\t.AutoWidth()\n\t\t.VAlign(VAlign_Fill)\n\t\t.HAlign(HAlign_Right)\n\t\t[\n\t\t\tSNew(SExpanderArrow, TableRow)\n\t\t];\n\n\t// Add the row content\n\tRowContainer->AddSlot()\n\t\t.FillWidth(1.0)\n\t\t.Padding(RowPadding)\n\t\t[\n\t\t\tRowContent.ToSharedRef()\n\t\t];\n\n\treturn TableRow.ToSharedRef();\n}\n\nvoid SDlgDataDisplay::HandleGetChildren(TSharedPtr<FDlgDataDisplayTreeNode> InItem,\n\tTArray<TSharedPtr<FDlgDataDisplayTreeNode>>& OutChildren)\n{\n\tif (!InItem.IsValid())\n\t{\n\t\treturn;\n\t}\n\n\tOutChildren = InItem->GetChildren();\n}\n\nvoid SDlgDataDisplay::HandleTreeSelectionChanged(TSharedPtr<FDlgDataDisplayTreeNode> InItem, ESelectInfo::Type SelectInfo)\n{\n\t// Ignored\n}\n\nvoid SDlgDataDisplay::HandleDoubleClick(TSharedPtr<FDlgDataDisplayTreeNode> InItem)\n{\n\tif (!InItem.IsValid())\n\t{\n\t\treturn;\n\t}\n\n\t// Expand on double click\n\tif (InItem->HasChildren())\n\t{\n\t\tActorsTreeView->SetItemExpansion(InItem, !ActorsTreeView->IsItemExpanded(InItem));\n\t}\n}\n\nvoid SDlgDataDisplay::HandleSetExpansionRecursive(TSharedPtr<FDlgDataDisplayTreeNode> InItem, bool bInIsItemExpanded)\n{\n\tif (InItem.IsValid() && InItem->HasChildren())\n\t{\n\t\tActorsTreeView->SetItemExpansion(InItem, bInIsItemExpanded);\n\t\tfor (const TSharedPtr<FDlgDataDisplayTreeNode>& Child : InItem->GetChildren())\n\t\t{\n\t\t\tHandleSetExpansionRecursive(Child, bInIsItemExpanded);\n\t\t}\n\t}\n}\n\n#undef LOCTEXT_NAMESPACE\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystem/Private/GameplayDebugger/SDlgDataPropertyValues.cpp",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#include \"GameplayDebugger/SDlgDataPropertyValues.h\"\n\n#include \"Widgets/Text/STextBlock.h\"\n#include \"Widgets/Layout/SMissingWidget.h\"\n#include \"Widgets/Input/SButton.h\"\n#include \"Widgets/SBoxPanel.h\"\n#include \"Widgets/Input/SCheckBox.h\"\n#include \"Widgets/Input/SEditableTextBox.h\"\n\n#include \"NYReflectionHelper.h\"\n\n#define LOCTEXT_NAMESPACE \"SDlgDataPropertyValues\"\n\nstatic FText ValidateNameLength(const FText& Text)\n{\n\tif (Text.ToString().Len() > NAME_SIZE)\n\t{\n\t\tstatic FText ErrorString = FText::Format(LOCTEXT(\"NamePropertySizeTooLongError\", \"Name properties may only be a maximum of {0} characters\"),\n\t\t\tFText::AsNumber(NAME_SIZE));\n\t\treturn ErrorString;\n\t}\n\n\treturn FText::GetEmpty();\n}\n\nstatic FString BoolToFString(const bool Value)\n{\n\treturn Value ? TEXT(\"True\") : TEXT(\"False\");\n}\n\nstatic bool FStringToBool(const FString& Value)\n{\n\treturn FCString::ToBool(*Value);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// SDlgDataProperty\nvoid SDlgDataPropertyValue::Construct(const FArguments& InArgs, const TSharedPtr<FDlgDataDisplayTreeVariableNode>& InVariableNode)\n{\n\tVariableNode = InVariableNode;\n\tif (!VariableNode.IsValid())\n\t{\n\t\treturn;\n\t}\n\n\tUpdateVariableNodeFromActor();\n\n\tChildSlot\n\t[\n\t\tSNew(STextBlock)\n\t\t.Text(this, &Self::GetTextValue)\n\t];\n}\n\nvoid SDlgDataPropertyValue::Tick(const FGeometry& AllottedGeometry, double InCurrentTime, float InDeltaTime)\n{\n\tSuper::Tick(AllottedGeometry, InCurrentTime, InDeltaTime);\n\n\t// We only run this Tick only after TickUpdateTimeSeconds has passed\n\tTickPassedDeltaTimeSeconds += InDeltaTime;\n\tif (TickPassedDeltaTimeSeconds < TickUpdateTimeSeconds)\n\t{\n\t\treturn;\n\t}\n\n\t// Update the value\n\tTickPassedDeltaTimeSeconds = 0.f;\n\tUpdateVariableNodeFromActor();\n}\n\nvoid SDlgDataPropertyValue::UpdateVariableNodeFromActor()\n{\n\tif (!VariableNode.IsValid())\n\t{\n\t\treturn;\n\t}\n\n\tTWeakObjectPtr<const AActor> Actor = VariableNode->GetParentActor();\n\tif (!Actor.IsValid())\n\t{\n\t\treturn;\n\t}\n\n\tconst FName VariableName = VariableNode->GetVariableName();\n\tswitch (VariableNode->GetVariableType())\n\t{\n\t\tcase EDlgDataDisplayVariableTreeNodeType::Integer:\n\t\t{\n\t\t\tconst int32 Value = IDlgDialogueParticipant::Execute_GetIntValue(Actor.Get(), VariableName);\n\t\t\tVariableNode->SetVariableValue(FString::FromInt(Value));\n\t\t\tbreak;\n\t\t}\n\t\tcase EDlgDataDisplayVariableTreeNodeType::Float:\n\t\t{\n\t\t\tconst float Value = IDlgDialogueParticipant::Execute_GetFloatValue(Actor.Get(), VariableName);\n\t\t\tVariableNode->SetVariableValue(FString::SanitizeFloat(Value));\n\t\t\tbreak;\n\t\t}\n\t\tcase EDlgDataDisplayVariableTreeNodeType::Bool:\n\t\t{\n\t\t\tconst bool Value = IDlgDialogueParticipant::Execute_GetBoolValue(Actor.Get(), VariableName);\n\t\t\tVariableNode->SetVariableValue(BoolToFString(Value));\n\t\t\tbreak;\n\t\t}\n\t\tcase EDlgDataDisplayVariableTreeNodeType::FName:\n\t\t{\n\t\t\tconst FName Value = IDlgDialogueParticipant::Execute_GetNameValue(Actor.Get(), VariableName);\n\t\t\tVariableNode->SetVariableValue(Value.ToString());\n\t\t\tbreak;\n\t\t}\n\n\t\tcase EDlgDataDisplayVariableTreeNodeType::ClassInteger:\n\t\t{\n\t\t\tconst int32 Value = FNYReflectionHelper::GetVariable<FNYIntProperty, int32>(Actor.Get(), VariableName);\n\t\t\tVariableNode->SetVariableValue(FString::FromInt(Value));\n\t\t\tbreak;\n\t\t}\n\t\tcase EDlgDataDisplayVariableTreeNodeType::ClassFloat:\n\t\t{\n\t\t\tconst float Value = FNYReflectionHelper::GetVariable<FNYFloatProperty, float>(Actor.Get(), VariableName);\n\t\t\tVariableNode->SetVariableValue(FString::SanitizeFloat(Value));\n\t\t\tbreak;\n\t\t}\n\t\tcase EDlgDataDisplayVariableTreeNodeType::ClassBool:\n\t\t{\n\t\t\tconst bool Value = FNYReflectionHelper::GetVariable<FNYBoolProperty, bool>(Actor.Get(), VariableName);\n\t\t\tVariableNode->SetVariableValue(BoolToFString(Value));\n\t\t\tbreak;\n\t\t}\n\t\tcase EDlgDataDisplayVariableTreeNodeType::ClassFName:\n\t\t{\n\t\t\tconst FName Value = FNYReflectionHelper::GetVariable<FNYNameProperty, FName>(Actor.Get(), VariableName);\n\t\t\tVariableNode->SetVariableValue(Value.ToString());\n\t\t\tbreak;\n\t\t}\n\t\tcase EDlgDataDisplayVariableTreeNodeType::ClassFText:\n\t\t{\n\t\t\tconst FText Value = FNYReflectionHelper::GetVariable<FNYTextProperty, FText>(Actor.Get(), VariableName);\n\t\t\tVariableNode->SetVariableValue(Value.ToString());\n\t\t\tbreak;\n\t\t}\n\n\t\tcase EDlgDataDisplayVariableTreeNodeType::Event:\n\t\t{\n\t\t\t// Event does not have any state value, ignore\n\t\t\tbreak;\n\t\t}\n\t\tcase EDlgDataDisplayVariableTreeNodeType::Condition:\n\t\t{\n\t\t\tconst bool Value = IDlgDialogueParticipant::Execute_CheckCondition(Actor.Get(), nullptr, VariableName);\n\t\t\tVariableNode->SetVariableValue(BoolToFString(Value));\n\t\t\tbreak;\n\t\t}\n\t\tcase EDlgDataDisplayVariableTreeNodeType::Default:\n\t\tdefault:\n\t\t\tVariableNode->SetVariableValue(TEXT(\"UNIMPLEMENTED - SHOULD NEVER HAPPEN\"));\n\t}\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// SDlgDataTextPropertyValue\nvoid SDlgDataTextPropertyValue::Construct(const FArguments& InArgs, const TSharedPtr<FDlgDataDisplayTreeVariableNode>& InVariableNode)\n{\n\tVariableNode = InVariableNode;\n\tif (!VariableNode.IsValid())\n\t{\n\t\treturn;\n\t}\n\n\tUpdateVariableNodeFromActor();\n\tbIsFNameProperty = VariableNode->GetVariableType() == EDlgDataDisplayVariableTreeNodeType::FName;\n\n\tChildSlot\n\t[\n\t\tSNew(SHorizontalBox)\n\t\t+SHorizontalBox::Slot()\n\t\t.FillWidth(1.0f)\n\t\t[\n\t\t\tSAssignNew(TextBoxWidget, SEditableTextBox)\n\t\t\t.Text(this, &Self::GetTextValue)\n\t\t\t.SelectAllTextWhenFocused(true)\n\t\t\t.ClearKeyboardFocusOnCommit(false)\n\t\t\t.SelectAllTextOnCommit(true)\n\t\t\t.MinDesiredWidth(120.f)\n\t\t\t.OnTextCommitted(this, &Self::HandleTextCommitted)\n\t\t\t.OnTextChanged(this, &Self::HandleTextChanged)\n\t\t\t.IsReadOnly(this, &Self::IsReadOnly)\n\t\t]\n\t];\n\tPrimaryWidget = TextBoxWidget;\n}\n\nvoid SDlgDataTextPropertyValue::HandleTextCommitted(const FText& NewText, ETextCommit::Type CommitInfo)\n{\n\tstatic const FString MultipleValues(TEXT(\"Multiple Values\"));\n\tconst FString NewString = NewText.ToString();\n\tif (NewString == MultipleValues || !VariableNode.IsValid())\n\t{\n\t\t// can't set this :(\n\t\treturn;\n\t}\n\n\tTWeakObjectPtr<AActor> Actor = VariableNode->GetParentActor();\n\tif (!Actor.IsValid())\n\t{\n\t\treturn;\n\t}\n\n\tconst FName VariableName = VariableNode->GetVariableName();\n\tswitch (VariableNode->GetVariableType())\n\t{\n\t\tcase EDlgDataDisplayVariableTreeNodeType::Integer:\n\t\t{\n\t\t\tconst int32 Value = NewString.IsNumeric() ? FCString::Atoi(*NewString) : 0;\n\t\t\tIDlgDialogueParticipant::Execute_ModifyIntValue(Actor.Get(), VariableName, false, Value);\n\t\t\tbreak;\n\t\t}\n\t\tcase EDlgDataDisplayVariableTreeNodeType::Float:\n\t\t{\n\t\t\tconst float Value = NewString.IsNumeric() ? FCString::Atof(*NewString) : 0.f;\n\t\t\tIDlgDialogueParticipant::Execute_ModifyFloatValue(Actor.Get(), VariableName, false, Value);\n\t\t\tbreak;\n\t\t}\n\t\tcase EDlgDataDisplayVariableTreeNodeType::Bool:\n\t\t{\n\t\t\tconst bool Value = FStringToBool(NewString);\n\t\t\tIDlgDialogueParticipant::Execute_ModifyBoolValue(Actor.Get(), VariableName, Value);\n\t\t\tbreak;\n\t\t}\n\t\tcase EDlgDataDisplayVariableTreeNodeType::FName:\n\t\t{\n\t\t\tconst FName Value(*NewString);\n\t\t\tIDlgDialogueParticipant::Execute_ModifyNameValue(Actor.Get(), VariableName, Value);\n\t\t\tbreak;\n\t\t}\n\n\t\tcase EDlgDataDisplayVariableTreeNodeType::ClassInteger:\n\t\t{\n\t\t\tconst int32 Value = NewString.IsNumeric() ? FCString::Atoi(*NewString) : 0;\n\t\t\tFNYReflectionHelper::SetVariable<FNYIntProperty>(Actor.Get(), VariableName, Value);\n\t\t\tbreak;\n\t\t}\n\t\tcase EDlgDataDisplayVariableTreeNodeType::ClassFloat:\n\t\t{\n\t\t\tconst float Value = NewString.IsNumeric() ? FCString::Atof(*NewString) : 0.f;\n\t\t\tFNYReflectionHelper::SetVariable<FNYFloatProperty>(Actor.Get(), VariableName, Value);\n\t\t\tbreak;\n\t\t}\n\t\tcase EDlgDataDisplayVariableTreeNodeType::ClassBool:\n\t\t{\n\t\t\tconst bool Value = FStringToBool(NewString);\n\t\t\tFNYReflectionHelper::SetVariable<FNYBoolProperty>(Actor.Get(), VariableName, Value);\n\t\t\tbreak;\n\t\t}\n\t\tcase EDlgDataDisplayVariableTreeNodeType::ClassFName:\n\t\t{\n\t\t\tconst FName Value(*NewString);\n\t\t\tFNYReflectionHelper::SetVariable<FNYNameProperty>(Actor.Get(), VariableName, Value);\n\t\t\tbreak;\n\t\t}\n\n\t\tcase EDlgDataDisplayVariableTreeNodeType::ClassFText:\n\t\t{\n\t\t\tconst FText Value = FText::FromString(NewString);\n\t\t\tFNYReflectionHelper::SetVariable<FNYTextProperty>(Actor.Get(), VariableName, Value);\n\t\t\tbreak;\n\t\t}\n\n\t\t// The remaining variable types do not make sense to be text\n\t\tcase EDlgDataDisplayVariableTreeNodeType::Event:\n\t\tcase EDlgDataDisplayVariableTreeNodeType::Condition:\n\t\tcase EDlgDataDisplayVariableTreeNodeType::Default:\n\t\tdefault:\n\t\t\tbreak;\n\t}\n\n\tUpdateVariableNodeFromActor();\n}\n\nvoid SDlgDataTextPropertyValue::HandleTextChanged(const FText& NewText)\n{\n\tif (bIsFNameProperty)\n\t{\n\t\tconst FText ErrorMessage = ValidateNameLength(NewText);\n\t\tif (!ErrorMessage.IsEmpty())\n\t\t{\n\t\t\tVariableNode->SetVariableValue(ErrorMessage.ToString());\n\t\t}\n\t}\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// SDlgDataEventPropertyValue\nvoid SDlgDataEventPropertyValue::Construct(const FArguments& InArgs, const TSharedPtr<FDlgDataDisplayTreeVariableNode>& InVariableNode)\n{\n\tVariableNode = InVariableNode;\n\tif (!VariableNode.IsValid())\n\t{\n\t\treturn;\n\t}\n\n\tif (VariableNode->GetVariableType() == EDlgDataDisplayVariableTreeNodeType::Event)\n\t{\n\t\tChildSlot\n\t\t[\n\t\t\tSAssignNew(PrimaryWidget, SButton)\n\t\t\t.ToolTipText(LOCTEXT(\"EventValueTooltipKey\", \"Triggers this event. Calls OnDialogueEvent on the Actor.\"))\n\t\t\t.OnClicked(this, &Self::HandleTriggerEventClicked)\n\t\t\t[\n\t\t\t\tSNew(STextBlock)\n\t\t\t\t.Text(LOCTEXT(\"EVentButtonTextKey\", \"Trigger Event\"))\n\t\t\t]\n\t\t];\n\t}\n\telse\n\t{\n\t\tChildSlot\n\t\t[\n\t\t\tSNew(STextBlock)\n\t\t\t.Text(LOCTEXT(\"SDlgDataEventPropertyValueINVALID\", \"INVALID VariableType INVALID\"))\n\t\t];\n\t}\n}\n\nFReply SDlgDataEventPropertyValue::HandleTriggerEventClicked()\n{\n\tif (!VariableNode.IsValid() || VariableNode->GetVariableType() != EDlgDataDisplayVariableTreeNodeType::Event)\n\t{\n\t\treturn FReply::Unhandled();\n\t}\n\n\tTWeakObjectPtr<AActor> Actor = VariableNode->GetParentActor();\n\tif (!Actor.IsValid())\n\t{\n\t\treturn FReply::Unhandled();\n\t}\n\n\t// Trigger the event\n\tconst FName EventName = VariableNode->GetVariableName();\n\tIDlgDialogueParticipant::Execute_OnDialogueEvent(Actor.Get(), nullptr, EventName);\n\n\treturn FReply::Handled();\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// SDlgDataBoolPropertyValue\nvoid SDlgDataBoolPropertyValue::Construct(const FArguments& InArgs, const TSharedPtr<FDlgDataDisplayTreeVariableNode>& InVariableNode)\n{\n\tVariableNode = InVariableNode;\n\tif (!VariableNode.IsValid())\n\t{\n\t\treturn;\n\t}\n\n\tUpdateVariableNodeFromActor();\n\tChildSlot\n\t[\n\t\tSAssignNew(CheckBoxWidget, SCheckBox)\n\t\t.OnCheckStateChanged(this, &Self::HandleCheckStateChanged)\n\t\t.IsChecked(this, &Self::IsChecked)\n\t\t.Padding(0.0f)\n\t];\n\tPrimaryWidget = CheckBoxWidget;\n\tSetEnabled(TAttribute<bool>(this, &Self::IsBoolProperty));\n}\n\nbool SDlgDataBoolPropertyValue::HasKeyboardFocus() const\n{\n\t// The rest of the focus methods are handled in the parent class.\n\treturn CheckBoxWidget->HasKeyboardFocus();\n}\n\nFReply SDlgDataBoolPropertyValue::OnMouseButtonDoubleClick(const FGeometry& InMyGeometry, const FPointerEvent& InMouseEvent)\n{\n\tif (InMouseEvent.GetEffectingButton() == EKeys::LeftMouseButton)\n\t{\n\t\t// toggle the our checkbox\n\t\tCheckBoxWidget->ToggleCheckedState();\n\n\t\t// Set focus to this object, but don't capture the mouse\n\t\treturn FReply::Handled().SetUserFocus(AsShared(), EFocusCause::Mouse);\n\t}\n\n\treturn FReply::Unhandled();\n}\n\nECheckBoxState SDlgDataBoolPropertyValue::IsChecked() const\n{\n\tif (!VariableNode.IsValid())\n\t{\n\t\treturn ECheckBoxState::Undetermined;\n\t}\n\n\tconst bool Value = FStringToBool(VariableNode->GetVariableValue());\n\treturn Value ? ECheckBoxState::Checked : ECheckBoxState::Unchecked;\n}\n\nvoid SDlgDataBoolPropertyValue::HandleCheckStateChanged(ECheckBoxState InNewState)\n{\n\t// Can only modify bool values\n\tif (!IsBoolProperty())\n\t{\n\t\treturn;\n\t}\n\n\tTWeakObjectPtr<AActor> Actor = VariableNode->GetParentActor();\n\tif (!Actor.IsValid())\n\t{\n\t\treturn;\n\t}\n\n\t// Set the bool value\n\tconst FName VariableName = VariableNode->GetVariableName();\n\tconst bool Value = InNewState == ECheckBoxState::Checked || InNewState == ECheckBoxState::Undetermined;\n\tif (VariableNode->GetVariableType() == EDlgDataDisplayVariableTreeNodeType::ClassBool)\n\t{\n\t\tFNYReflectionHelper::SetVariable<FNYBoolProperty>(Actor.Get(), VariableName, Value);\n\t}\n\telse\n\t{\n\t\tIDlgDialogueParticipant::Execute_ModifyBoolValue(Actor.Get(), VariableName, Value);\n\t}\n\tUpdateVariableNodeFromActor();\n}\n\n#undef LOCTEXT_NAMESPACE\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystem/Private/IO/DlgConfigParser.cpp",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#include \"IO/DlgConfigParser.h\"\n\n#include \"Logging/LogMacros.h\"\n#include \"Misc/FileHelper.h\"\n#include \"Misc/Paths.h\"\n#include \"UObject/UnrealType.h\"\n#include \"UObject/EnumProperty.h\"\n#include \"UObject/UObjectIterator.h\"\n#include \"UObject/TextProperty.h\"\n\n#include \"NYReflectionHelper.h\"\n\nDEFINE_LOG_CATEGORY(LogDlgConfigParser);\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFDlgConfigParser::FDlgConfigParser(const FString InPreTag) :\n\tPreTag(InPreTag)\n{\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFDlgConfigParser::FDlgConfigParser(const FString& FilePath, const FString& InPreTag) :\n\tPreTag(InPreTag)\n{\n\tInitializeParser(FilePath);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FDlgConfigParser::InitializeParser(const FString& FilePath)\n{\n\tFileName = \"\";\n\tString = \"\";\n\tFrom = 0;\n\tLen = 0;\n\tbHasValidWord = false;\n\n\tif (!FFileHelper::LoadFileToString(String, *FilePath))\n\t{\n\t\tUE_LOG(LogDlgConfigParser, Error, TEXT(\"Failed to load config file %s\"), *FilePath)\n\t}\n\telse\n\t{\n\t\t// find first word\n\t\tFindNextWord();\n\t}\n\n\tFileName = FPaths::GetBaseFilename(FilePath, true);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FDlgConfigParser::InitializeParserFromString(const FString& Text)\n{\n\tFileName = \"\";\n\tString = Text;\n\tFrom = 0;\n\tLen = 0;\n\tbHasValidWord = false;\n\tFindNextWord();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FDlgConfigParser::ReadAllProperty(const UStruct* ReferenceClass, void* TargetObject, UObject* DefaultObjectOuter)\n{\n\twhile (ReadProperty(ReferenceClass, TargetObject, DefaultObjectOuter));\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FDlgConfigParser::ResetParser()\n{\n\tFrom = 0;\n\tLen = 0;\n\tbHasValidWord = false;\n\tFindNextWord();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool FDlgConfigParser::ReadProperty(const UStruct* ReferenceClass, void* TargetObject, UObject* DefaultObjectOuter)\n{\n\tif (!bHasValidWord)\n\t{\n\t\treturn false;\n\t}\n\tcheck(From < String.Len());\n\n\tconst FString PropertyName = GetActiveWord();\n\tauto* PropertyBase = ReferenceClass->FindPropertyByName(*PropertyName);\n\tif (PropertyBase != nullptr)\n\t{\n\t\t// check primitive types and enums\n\t\tif (TryToReadPrimitiveProperty(TargetObject, PropertyBase) || TryToReadEnum(TargetObject, PropertyBase))\n\t\t{\n\t\t\treturn true;\n\t\t}\n\n\t\t// check <MAP>\n\t\tauto* MapProperty = FNYReflectionHelper::CastProperty<FNYMapProperty>(PropertyBase);\n\t\tif (MapProperty != nullptr)\n\t\t{\n\t\t\treturn ReadMap(TargetObject, *MapProperty, DefaultObjectOuter);\n\t\t}\n\n\t\t// check <SET>\n\t\tauto* SetProperty = FNYReflectionHelper::CastProperty<FNYSetProperty>(PropertyBase);\n\t\tif (SetProperty != nullptr)\n\t\t{\n\t\t\treturn ReadSet(TargetObject, *SetProperty, DefaultObjectOuter);\n\t\t}\n\t}\n\n\tauto* ComplexPropBase = ReferenceClass->FindPropertyByName(*PropertyName);\n\n\t// struct\n\tif (auto* StructProperty = FNYReflectionHelper::SmartCastProperty<FNYStructProperty>(ComplexPropBase))\n\t{\n\t\treturn ReadComplexProperty<FNYStructProperty>(TargetObject,\n\t\t\t\t\t\t\t\t\t\t\t\t\tComplexPropBase,\n\t\t\t\t\t\t\t\t\t\t\t\t\tStructProperty->Struct,\n\t\t\t\t\t\t\t\t\t\t\t\t\t[](void* Ptr, const UClass*, UObject*) { return Ptr; },\n\t\t\t\t\t\t\t\t\t\t\t\t\tDefaultObjectOuter);\n\t}\n\n\t// check complex object - type name has to be here as well (dynamic array)\n\tconst FString TypeName = PreTag + PropertyName;\n\tif (!FindNextWord(\"block name\"))\n\t{\n\t\treturn false;\n\t}\n\n\tconst bool bLoadByRef = IsNextWordString();\n\tconst FString VariableName = GetActiveWord();\n\n\t// check if it is stored as reference\n\tif (bLoadByRef)\n\t{\n\t\t// sanity check: if it is not an uobject** we should not try to write it!\n\t\tif (FNYReflectionHelper::SmartCastProperty<FNYObjectProperty>(ComplexPropBase) == nullptr)\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\tauto* ObjectPtrPtr = static_cast<UObject**>(ComplexPropBase->template ContainerPtrToValuePtr<void>(TargetObject));\n\t\t*ObjectPtrPtr = nullptr; // reset first\n\t\tif (!VariableName.TrimStartAndEnd().IsEmpty()) // null reference?\n\t\t{\n\t\t\t*ObjectPtrPtr = StaticLoadObject(UObject::StaticClass(), DefaultObjectOuter, *VariableName);\n\t\t}\n\t\tFindNextWord();\n\t\treturn true;\n\t}\n\n\t// UObject is in the format:\n\t// - not nullptr - UObjectType PropertyName\n\t// - nullptr - PropertyName \"\"\n\tif (bHasNullptr)\n\t{\n\t\tComplexPropBase = ReferenceClass->FindPropertyByName(*PropertyName);\n\t}\n\telse\n\t{\n\t\tComplexPropBase = ReferenceClass->FindPropertyByName(*VariableName);\n\t}\n\tif (auto* ObjectProperty = FNYReflectionHelper::SmartCastProperty<FNYObjectProperty>(ComplexPropBase))\n\t{\n\t\tconst UClass* Class = SmartGetPropertyClass(ComplexPropBase, TypeName);\n\t\tif (Class == nullptr)\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t\tauto ObjectInitializer = std::bind(&FDlgConfigParser::OnInitObject, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3);\n\t\treturn ReadComplexProperty<FNYObjectProperty>(TargetObject, ComplexPropBase, Class, ObjectInitializer, DefaultObjectOuter);\n\t}\n\n\tUE_LOG(LogDlgConfigParser, Warning, TEXT(\"Invalid token `%s` in script `%s` (line: %d) (Property expected for PropertyName = `%s`)\"),\n\t\t   *GetActiveWord(), *FileName, GetActiveLineNumber(), *PropertyName);\n\tFindNextWord();\n\treturn false;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool FDlgConfigParser::ReadPurePropertyBlock(void* TargetObject, const UStruct* ReferenceClass, bool bBlockStartAlreadyRead, UObject* Outer)\n{\n\tif (!bBlockStartAlreadyRead && !FindNextWordAndCheckIfBlockStart(ReferenceClass->GetName()))\n\t{\n\t\treturn false;\n\t}\n\n\t// parse precondition properties\n\tFindNextWord();\n\twhile (!CheckIfBlockEnd(ReferenceClass->GetName()))\n\t{\n\t\tif (!bHasValidWord)\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\tReadProperty(ReferenceClass, TargetObject, Outer);\n\t}\n\n\tFindNextWord();\n\treturn true;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool FDlgConfigParser::GetActiveWordAsFloat(float& FloatValue) const\n{\n\tif (!HasValidWord())\n\t{\n\t\treturn false;\n\t}\n\n\tconst FString FloatString = String.Mid(From, Len);\n\tif (FloatString.Len() == 0 || !FloatString.IsNumeric())\n\t{\n\t\treturn false;\n\t}\n\n\tFloatValue = FCString::Atof(*FloatString);\n\treturn true;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFString FDlgConfigParser::ConstructConfigFile(const UStruct* ReferenceType, void* SourceObject)\n{\n\tFString String;\n\tConstructConfigFileInternal(ReferenceType, 0, SourceObject, String);\n\treturn String;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool FDlgConfigParser::IsNextWordString() const\n{\n\tif (bHasNullptr)\n\t{\n\t\treturn true;\n\t}\n\n\tint32 Index = From + Len;\n\t// Skip whitespaces\n\twhile (Index < String.Len() && FChar::IsWhitespace(String[Index]))\n\t{\n\t\tIndex++;\n\t}\n\n\treturn Index < String.Len() && String[Index] == '\"';\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool FDlgConfigParser::IsActualWordString() const\n{\n\tconst int32 Index = From - 1;\n\treturn String.IsValidIndex(Index) && String[Index] == '\"';\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool FDlgConfigParser::FindNextWord()\n{\n\tbHasNullptr = false;\n\tFrom += Len;\n\n\t// Skip \" (aka the open of string)\n\tif (bActiveIsString)\n\t{\n\t\tFrom++;\n\t}\n\tbActiveIsString = false;\n\n\t// Skip whitespaces\n\twhile (From < String.Len() && FChar::IsWhitespace(String[From]))\n\t{\n\t\tFrom++;\n\t}\n\n\t// Oh noeeeees\n\tif (From >= String.Len())\n\t{\n\t\tbHasValidWord = false;\n\t\treturn false;\n\t}\n\n\t// Handle \"\" as special empty string\n\tif (From + 1 < String.Len() && String[From] == '\"' && String[From + 1] == '\"')\n\t{\n\t\tFrom += 2; // skip both characters for the next string\n\t\tLen = 0;\n\t\tbHasValidWord = true;\n\t\tbHasNullptr = true;\n\t\treturn true;\n\t}\n\n\t// Handle special string case - read everything between two \"\n\tif (String[From] == '\"')\n\t{\n\t\tLen = 1;\n\t\tbActiveIsString = true;\n\t\t// Find the closing \"\n\t\twhile (From + Len < String.Len() && String[From + Len] != '\"')\n\t\t{\n\t\t\tLen++;\n\t\t}\n\n\t\t// Do not include the \"\" in the range\n\t\tFrom += 1;\n\t\tLen -= 1;\n\n\t\t// Something very bad happened\n\t\tif (Len <= 0)\n\t\t{\n\t\t\tbHasValidWord = false;\n\t\t\treturn false;\n\t\t}\n\n\t\tbHasValidWord = true;\n\t\treturn true;\n\t}\n\n\tLen = 0;\n\t// Is block begin/end\n\tif (String[From] == '{' || String[From] == '}')\n\t{\n\t\tLen = 1;\n\t}\n\telse\n\t{\n\t\t// Count until we reach a whitespace char OR EOF\n\t\twhile (From + Len < String.Len() && !FChar::IsWhitespace(String[From + Len]))\n\t\t{\n\t\t\tLen++;\n\t\t}\n\t}\n\n\t// Skip comments //\n\tif (Len > 1 && String[From] == '/' && String[From + 1] == '/')\n\t{\n\t\t// Advance past this line\n\t\twhile (From < String.Len() && String[From] != '\\n' && String[From] != '\\r')\n\t\t{\n\t\t\tFrom++;\n\t\t}\n\n\t\t// Use recursion to go to the next line\n\t\tLen = 0;\n\t\treturn FindNextWord();\n\t}\n\n\t// Phew, valid word\n\tbHasValidWord = true;\n\treturn true;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool FDlgConfigParser::FindNextWord(const FString& ExpectedStuff)\n{\n\tconst bool bNotEof = FindNextWord();\n\tif (!bNotEof)\n\t{\n\t\tUE_LOG(LogDlgConfigParser, Warning, TEXT(\"Unexpected end of file while reading %s (expected: %s)\"), *FileName, *ExpectedStuff);\n\t}\n\n\treturn bNotEof;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool FDlgConfigParser::FindNextWordAndCheckIfBlockStart(const FString& BlockName)\n{\n\tif (!FindNextWord() || !CompareToActiveWord(\"{\"))\n\t{\n\t\tUE_LOG(LogDlgConfigParser, Warning, TEXT(\"Block start signal expected but not found for %s block in script %s (line: %d)\"),\n\t\t\t\t\t\t\t\t\t\t\t*BlockName, *FileName, GetActiveLineNumber());\n\t\treturn false;\n\t}\n\treturn true;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool FDlgConfigParser::FindNextWordAndCheckIfBlockEnd(const FString& BlockName)\n{\n\tif (!FindNextWord())\n\t{\n\t\tUE_LOG(LogDlgConfigParser, Warning, TEXT(\"End of file found but block %s is not yet closed in script %s (line: %d)\"),\n\t\t\t\t\t\t\t\t\t\t\t*BlockName, *FileName, GetActiveLineNumber());\n\t\treturn false;\n\t}\n\treturn Len == 1 && String[From] == '}';\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool FDlgConfigParser::CheckIfBlockEnd(const FString& BlockName)\n{\n\tif (!bHasValidWord)\n\t{\n\t\tUE_LOG(LogDlgConfigParser, Warning, TEXT(\"End of file found but block %s is not yet closed in script %s (line: %d)\"),\n\t\t\t\t\t\t\t\t\t\t\t*BlockName, *FileName, GetActiveLineNumber());\n\t\treturn false;\n\t}\n\treturn Len == 1 && String[From] == '}';\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool FDlgConfigParser::CompareToActiveWord(const FString& StringToCompare) const\n{\n\t// Length differs?\n\tif (!bHasValidWord || StringToCompare.Len() != Len)\n\t{\n\t\treturn false;\n\t}\n\n\t// Content differs?\n\tconst TCHAR* SubStr = &String[From];\n\tfor (int32 i = 0; i < Len; ++i)\n\t{\n\t\tif (SubStr[i] != StringToCompare[i])\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t}\n\n\treturn true;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nint32 FDlgConfigParser::GetActiveLineNumber() const\n{\n\tif (!bHasValidWord)\n\t{\n\t\treturn INDEX_NONE;\n\t}\n\n\tint32 LineCount = 1;\n\tfor (int32 i = 0; i < String.Len() && i < From; ++i)\n\t{\n\t\tswitch (String[i])\n\t\t{\n\t\t\tcase '\\r':\n\t\t\t\t// let's handle '\\r\\n too\n\t\t\t\tif (i + 1 < String.Len() && String[i + 1] == '\\n')\n\t\t\t\t\t++i;\n\t\t\tcase '\\n':\n\t\t\t\t++LineCount;\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\treturn LineCount;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FDlgConfigParser::ConstructConfigFileInternal(const UStruct* ReferenceType, int32 TabCount, void* SourceObject, FString& OutString)\n{\n\tfor (auto* Field = FNYReflectionHelper::GetStructChildren(ReferenceType); Field != nullptr; Field = Field->Next)\n\t{\n\t\tauto* BoolProp = FNYReflectionHelper::CastProperty<FNYBoolProperty>(Field);\n\t\tif (BoolProp != nullptr)\n\t\t{\n\t\t\tOutString += BoolProp->GetName() + \" \" + (BoolProp->GetPropertyValue_InContainer(SourceObject) ? \"True\\n\" : \"False\\n\");\n\t\t}\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool FDlgConfigParser::TryToReadPrimitiveProperty(void* TargetObject, FNYProperty* PropertyBase)\n{\n\tif (ReadPrimitiveProperty<bool, FNYBoolProperty>(TargetObject, PropertyBase, std::bind(&FDlgConfigParser::GetAsBool, this), \"Bool\", false))\n\t{\n\t\treturn true;\n\t}\n\tif (ReadPrimitiveProperty<float, FNYFloatProperty>(TargetObject, PropertyBase, std::bind(&FDlgConfigParser::GetAsFloat, this), \"float\", false))\n\t{\n\t\treturn true;\n\t}\n\tif (ReadPrimitiveProperty<int32, FNYIntProperty>(TargetObject, PropertyBase, std::bind(&FDlgConfigParser::GetAsInt32, this), \"int32\", false))\n\t{\n\t\treturn true;\n\t}\n\tif (ReadPrimitiveProperty<int64, FNYInt64Property>(TargetObject, PropertyBase, std::bind(&FDlgConfigParser::GetAsInt64, this), \"int64\", false))\n\t{\n\t\treturn true;\n\t}\n\tif (ReadPrimitiveProperty<FName, FNYNameProperty>(TargetObject, PropertyBase, std::bind(&FDlgConfigParser::GetAsName, this), \"FName\", false))\n\t{\n\t\treturn true;\n\t}\n\tif (ReadPrimitiveProperty<FString, FNYStrProperty>(TargetObject, PropertyBase, std::bind(&FDlgConfigParser::GetAsString, this), \"FString\", true))\n\t{\n\t\treturn true;\n\t}\n\tif (ReadPrimitiveProperty<FText, FNYTextProperty>(TargetObject, PropertyBase, std::bind(&FDlgConfigParser::GetAsText, this), \"FText\", true))\n\t{\n\t\treturn true;\n\t}\n\n\treturn false;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool FDlgConfigParser::TryToReadEnum(void* Target, FNYProperty* PropertyBase)\n{\n\tauto OnGetAsEnum = [this, &PropertyBase]() -> uint8\n\t{\n\t\tFName Value = NAME_None;\n\t\tif (Len <= 0)\n\t\t{\n\t\t\tOnInvalidValue(\"FName\");\n\t\t}\n\t\telse\n\t\t{\n\t\t\tValue = FName(*String.Mid(From, Len));\n\t\t}\n\n\t\tauto* Prop = FNYReflectionHelper::SmartCastProperty<FNYEnumProperty>(PropertyBase);\n\t\tif (Prop == nullptr || Prop->GetEnum() == nullptr)\n\t\t{\n\t\t\treturn 0;\n\t\t}\n\n\t\tcheck(FNYReflectionHelper::CastProperty<FNYByteProperty>(Prop->GetUnderlyingProperty()));\n\t\treturn uint8(Prop->GetEnum()->GetIndexByName(Value));\n\t};\n\n\t// enum can't be pure array atm!!!\n\tauto* EnumProp = FNYReflectionHelper::CastProperty<FNYEnumProperty>(PropertyBase);\n\tif (EnumProp != nullptr)\n\t{\n\t\tFindNextWord();\n\t\tif (bHasValidWord)\n\t\t{\n\t\t\t// ContainerPtrToValuePtr has to be called on the enum, not on the underlying prop!!!\n\t\t\tvoid* Value = EnumProp->ContainerPtrToValuePtr<uint8>(Target);\n\t\t\tEnumProp->GetUnderlyingProperty()->SetIntPropertyValue(Value, static_cast<int64>(OnGetAsEnum()));\n\t\t}\n\t\telse\n\t\t{\n\t\t\tUE_LOG(LogDlgConfigParser, Warning, TEXT(\"Unexpected end of file while enum value was expected (config %s)\"), *FileName);\n\t\t}\n\n\t\tFindNextWord();\n\t\treturn true;\n\t}\n\n\treturn false;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool FDlgConfigParser::ReadSet(void* TargetObject, FNYSetProperty& Property, UObject* DefaultObjectOuter)\n{\n\tFScriptSetHelper Helper(&Property, Property.ContainerPtrToValuePtr<uint8>(TargetObject));\n\tHelper.EmptyElements();\n\n\tif (!FindNextWordAndCheckIfBlockStart(\"Set block\"))\n\t{\n\t\treturn false;\n\t}\n\n\twhile (!FindNextWordAndCheckIfBlockEnd(\"Set block\"))\n\t{\n\t\tconst int32 Index = Helper.AddDefaultValue_Invalid_NeedsRehash();\n\t\tbool bDone = false;\n\t\tuint8* ElementPtr = Helper.GetElementPtr(Index);\n\t\tif (FNYReflectionHelper::CastProperty<FNYBoolProperty>(Helper.ElementProp))       { *(bool*)ElementPtr = GetAsBool();\t\tbDone = true; }\n\t\telse if (FNYReflectionHelper::CastProperty<FNYFloatProperty>(Helper.ElementProp)) { *(float*)ElementPtr = GetAsFloat();\t\tbDone = true; }\n\t\telse if (FNYReflectionHelper::CastProperty<FNYIntProperty>(Helper.ElementProp))   { *(int32*)ElementPtr = GetAsInt32();\t\tbDone = true; }\n\t\telse if (FNYReflectionHelper::CastProperty<FNYInt64Property>(Helper.ElementProp)) { *(int64*)ElementPtr = GetAsInt64();\t\tbDone = true; }\n\t\telse if (FNYReflectionHelper::CastProperty<FNYNameProperty>(Helper.ElementProp))  { *(FName*)ElementPtr = GetAsName();\t\tbDone = true; }\n\t\telse if (FNYReflectionHelper::CastProperty<FNYStrProperty>(Helper.ElementProp))   { *(FString*)ElementPtr = GetAsString();\tbDone = true; }\n\t\telse if (FNYReflectionHelper::CastProperty<FNYTextProperty>(Helper.ElementProp))  { *(FText*)ElementPtr = GetAsText();\t\tbDone = true; }\n\t\t// else if (Cast<FNYReflectionHelper::CastProperty>(Helper.ElementProp))\t{ *(uint8*)ElementPtr\t= OnGetAsEnum();\tbDone = true; } // would not work, check enum above\n\n\t\tif (!bDone)\n\t\t{\n\t\t\tUE_LOG(LogDlgConfigParser, Warning, TEXT(\"Unsupported set element type %s in script %s(:%d)\"),\n\t\t\t\t*Helper.ElementProp->GetName(), *FileName, GetActiveLineNumber());\n\t\t\treturn false;\n\t\t}\n\t\tHelper.Rehash();\n\t}\n\tFindNextWord();\n\treturn true;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool FDlgConfigParser::ReadMap(void* TargetObject, FNYMapProperty& Property, UObject* DefaultObjectOuter)\n{\n\tFScriptMapHelper Helper(&Property, Property.ContainerPtrToValuePtr<uint8>(TargetObject));\n\tHelper.EmptyValues();\n\n\tif (!FindNextWordAndCheckIfBlockStart(\"Map block\") || !FindNextWord(\"map entry\"))\n\t{\n\t\treturn false;\n\t}\n\n\twhile (!CheckIfBlockEnd(\"Map block\"))\n\t{\n\t\tconst int32 Index = Helper.AddDefaultValue_Invalid_NeedsRehash();\n\t\tvoid* Ptrs[] = { Helper.GetKeyPtr(Index), Helper.GetValuePtr(Index) };\n\t\tFNYProperty* Props[] = { Helper.KeyProp, Helper.ValueProp };\n\t\tbool bDone = false;\n\n\t\tfor (int32 i = 0; i < 2; ++i)\n\t\t{\n\t\t\tif (FNYReflectionHelper::CastProperty<FNYBoolProperty>(Props[i]))\t\t\t{ *(bool*)Ptrs[i]\t = GetAsBool();\t\tbDone = true; }\n\t\t\telse if (FNYReflectionHelper::CastProperty<FNYFloatProperty>(Props[i]))\t{ *(float*)Ptrs[i]\t = GetAsFloat();\tbDone = true; }\n\t\t\telse if (FNYReflectionHelper::CastProperty<FNYIntProperty>(Props[i]))\t\t{ *(int32*)Ptrs[i]\t = GetAsInt32();\tbDone = true; }\n\t\t\telse if (FNYReflectionHelper::CastProperty<FNYInt64Property>(Props[i]))\t{ *(int64*)Ptrs[i]\t = GetAsInt64();\tbDone = true; }\n\t\t\telse if (FNYReflectionHelper::CastProperty<FNYNameProperty>(Props[i]))\t\t{ *(FName*)Ptrs[i]\t = GetAsName();\t\tbDone = true; }\n\t\t\telse if (FNYReflectionHelper::CastProperty<FNYStrProperty>(Props[i]))\t\t{ *(FString*)Ptrs[i] = GetAsString();\tbDone = true; }\n\t\t\telse if (FNYReflectionHelper::CastProperty<FNYTextProperty>(Props[i]))\t\t{ *(FText*)Ptrs[i]   = GetAsText();\t\tbDone = true; }\n\t\t\telse if (i == 1 && bHasNullptr)\t\t\t\t{ bDone = true; } // Value is nullptr, ignore\n\t\t\t// else if (FNYReflectionHelper::CastProperty<FNYByteProperty>(Props[i]))\t\t{ *(uint8*)Ptrs[i]\t = OnGetAsEnum();\tbDone = true; } // would not work, check enum above\n\n\t\t\tauto* StructVal = FNYReflectionHelper::CastProperty<FNYStructProperty>(Props[i]);\n\t\t\tif (StructVal != nullptr)\n\t\t\t{\n\t\t\t\tif (!CompareToActiveWord(\"{\"))\n\t\t\t\t{\n\t\t\t\t\tUE_LOG(LogDlgConfigParser, Warning, TEXT(\"Syntax error: missing struct block start '{' in script %s(:%d)\"),\n\t\t\t\t\t\t\t*FileName, GetActiveLineNumber());\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\tif (!ReadPurePropertyBlock(Ptrs[i], StructVal->Struct, true, DefaultObjectOuter))\n\t\t\t\t{\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif (!bDone)\n\t\t\t\t{\n\t\t\t\t\tUE_LOG(LogDlgConfigParser, Warning, TEXT(\"Invalid map type %s in script `%s` (:%d)\"), *Helper.KeyProp->GetName(), *FileName, GetActiveLineNumber());\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\tbDone = false;\n\t\t\t\tif (!FindNextWord(\"Map Key or Value or End\"))\n\t\t\t\t{\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tHelper.Rehash();\n\t} // while (!CheckIfBlockEnd(\"Map block\"))\n\n\tFindNextWord();\n\treturn true;\n}\n\nvoid* FDlgConfigParser::OnInitObject(void* ValuePtr, const UClass* ChildClass, UObject* OuterInit)\n{\n\tif (ChildClass != nullptr)\n\t{\n\t\tUObject** Value = (UObject**)ValuePtr;\n\t\t*Value = nullptr;\n\t\t*Value = CreateNewUObject(ChildClass, OuterInit);\n\t\treturn *Value;\n\t}\n\tUE_LOG(LogDlgConfigParser, Warning, TEXT(\"OnInitValue called without class!\"));\n\treturn nullptr;\n}\n\n/** gets the UClass from an UObject or from an array of UObjects */\nconst UClass* FDlgConfigParser::SmartGetPropertyClass(FNYProperty* Property, const FString& TypeName)\n{\n\tauto* ObjectProperty = FNYReflectionHelper::SmartCastProperty<FNYObjectProperty>(Property);\n\tcheck(ObjectProperty != nullptr);\n\n\tconst UClass* Class = nullptr;\n\tif (FNYReflectionHelper::CastProperty<FNYArrayProperty>(Property) != nullptr)\n\t{\n\t\tClass = ObjectProperty->PropertyClass;\n\t}\n\telse\n\t{\n\t\tClass = GetChildClassFromName(ObjectProperty->PropertyClass, TypeName);\n\t}\n\n\tif (Class == nullptr)\n\t{\n\t\tUE_LOG(LogDlgConfigParser, Warning, TEXT(\"Could not find class `%s` for `%s` in config `%s` (Line=%d)\"),\n\t\t\t   *TypeName, *ObjectProperty->GetName(), *FileName, GetActiveLineNumber());\n\t}\n\n\treturn Class;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FDlgConfigParser::OnInvalidValue(const FString& PropType) const\n{\n\tif (bHasValidWord)\n\t{\n\t\tconst int32 LineNumber = GetActiveLineNumber();\n\t\tUE_LOG(LogDlgConfigParser, Warning, TEXT(\"Invalid %s property value %s in script %s (line %d)\"),\n\t\t\t*PropType, *String.Mid(From, Len), *FileName, LineNumber);\n\t}\n\telse\n\t\tUE_LOG(LogDlgConfigParser, Warning, TEXT(\"Unexepcted end of file while expecting %s value in script %s\"), *PropType, *FileName);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool FDlgConfigParser::GetAsBool() const\n{\n\tbool bValue = false;\n\tif (CompareToActiveWord(\"True\"))\n\t\tbValue = true;\n\telse if (!CompareToActiveWord(\"False\"))\n\t\tOnInvalidValue(\"Bool\");\n\treturn bValue;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nfloat FDlgConfigParser::GetAsFloat() const\n{\n\tfloat Value = 0.0f;\n\tif (!GetActiveWordAsFloat(Value))\n\t\tOnInvalidValue(\"Float\");\n\treturn Value;\n}\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nint32 FDlgConfigParser::GetAsInt32() const\n{\n\tint32 Value = 0;\n\tconst FString IntString = String.Mid(From, Len);\n\tif (IntString.Len() == 0 || (!IntString.IsNumeric()))\n\t\tOnInvalidValue(\"int32\");\n\telse\n\t\tValue = FCString::Atoi(*IntString);\n\treturn Value;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nint64 FDlgConfigParser::GetAsInt64() const\n{\n\tint64 Value = 0;\n\tconst FString IntString = String.Mid(From, Len);\n\tif (IntString.Len() == 0 || (!IntString.IsNumeric()))\n\t\tOnInvalidValue(\"int64\");\n\telse\n\t\tValue = FCString::Atoi64(*IntString);\n\treturn Value;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFName FDlgConfigParser::GetAsName() const\n{\n\tFName Value = NAME_None;\n\tif (Len <= 0)\n\t\tOnInvalidValue(\"FName\");\n\telse\n\t\tValue = FName(*String.Mid(From, Len));\n\treturn Value;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFString FDlgConfigParser::GetAsString() const\n{\n\tif (Len > 0)\n\t\treturn String.Mid(From, Len);\n\n\treturn \"\";\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFText FDlgConfigParser::GetAsText() const\n{\n\tFString Input;\n\tif (Len > 0)\n\t\tInput = String.Mid(From, Len);\n\n\treturn FText::FromString(Input);\n}\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystem/Private/IO/DlgConfigWriter.cpp",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#include \"IO/DlgConfigWriter.h\"\n\n#include \"Misc/FileHelper.h\"\n#include \"UObject/EnumProperty.h\"\n\n#include \"DlgHelper.h\"\n#include \"NYReflectionHelper.h\"\n\nDEFINE_LOG_CATEGORY(LogDlgConfigWriter);\n\nconst TCHAR* FDlgConfigWriter::EOL_LF = TEXT(\"\\n\");\nconst TCHAR* FDlgConfigWriter::EOL_CRLF = TEXT(\"\\r\\n\");\nconst TCHAR* FDlgConfigWriter::EOL = EOL_LF;\nconst FString FDlgConfigWriter::EOL_String{EOL};\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFDlgConfigWriter::FDlgConfigWriter(const FString InComplexNamePrefix,\n\t\t\t\t\t\t\t\t   bool bInDontWriteEmptyContainer) :\n\tComplexNamePrefix(InComplexNamePrefix),\n\tbDontWriteEmptyContainer(bInDontWriteEmptyContainer)\n{\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FDlgConfigWriter::Write(const UStruct* const StructDefinition, const void* const Object)\n{\n\tTopLevelObjectPtr = Object;\n\tWriteComplexMembersToString(StructDefinition, Object, \"\", EOL, ConfigText);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FDlgConfigWriter::WriteComplexMembersToString(const UStruct* StructDefinition,\n\t\t\t\t\t\t\t\t\t\t\t\t   const void* Object,\n\t\t\t\t\t\t\t\t\t\t\t\t   const FString& PreString,\n\t\t\t\t\t\t\t\t\t\t\t\t   const FString& PostString,\n\t\t\t\t\t\t\t\t\t\t\t\t   FString& Target)\n{\n\tif (StructDefinition == nullptr)\n\t{\n\t\treturn;\n\t}\n\n\t// order\n\tTArray<const FNYProperty*> Primitives;\n\tTArray<const FNYProperty*> PrimitiveContainers;\n\tTArray<const FNYProperty*> ComplexElements;\n\tTArray<const FNYProperty*> ComplexContainers;\n\n\tconstexpr int32 PropCategoryNum = 4;\n\tTArray<const FNYProperty*>* PropCategory[PropCategoryNum] = { &Primitives, &PrimitiveContainers, &ComplexElements, &ComplexContainers };\n\n\t// Handle UObject inheritance (children of class)\n\tif (StructDefinition->IsA<UClass>())\n\t{\n\t\tconst UObject* UnrealObject = static_cast<const UObject*>(Object);\n\t\tif (!UnrealObject->IsValidLowLevelFast())\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\tStructDefinition = UnrealObject->GetClass();\n\t}\n\tif (!StructDefinition->IsValidLowLevelFast())\n\t{\n\t\treturn;\n\t}\n\n\t// Populate categories\n\tfor (TFieldIterator<FNYProperty> It(StructDefinition); It; ++It)\n\t{\n\t\tconst auto* Property = *It;\n\t\tif (IsPrimitive(Property))\n\t\t{\n\t\t\tPrimitives.Add(Property);\n\t\t}\n\t\telse if (IsContainer(Property))\n\t\t{\n\t\t\tif (IsPrimitiveContainer(Property))\n\t\t\t{\n\t\t\t\tPrimitiveContainers.Add(Property);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tComplexContainers.Add(Property);\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tComplexElements.Add(Property);\n\t\t}\n\t}\n\n\tconstexpr bool bContainerElement = false;\n\tfor (int32 i = 0; i < PropCategoryNum; ++i)\n\t{\n\t\tfor (const auto* Prop : *PropCategory[i])\n\t\t{\n\t\t\tWritePropertyToString(Prop, Object, bContainerElement, PreString, PostString, false, Target);\n\t\t}\n\t}\n\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool FDlgConfigWriter::WritePropertyToString(const FNYProperty* Property,\n\t\t\t\t\t\t\t\t\t\t\t const void* Object,\n\t\t\t\t\t\t\t\t\t\t\t bool bContainerElement,\n\t\t\t\t\t\t\t\t\t\t\t const FString& PreString,\n\t\t\t\t\t\t\t\t\t\t\t const FString& PostString,\n\t\t\t\t\t\t\t\t\t\t\t bool bPointerAsRef,\n\t\t\t\t\t\t\t\t\t\t\t FString& Target)\n{\n\tif (CanSkipProperty(Property))\n\t{\n\t\treturn true;\n\t}\n\n\t// Primitive: bool, int, float, FString, FName\n\tif (WritePrimitiveElementToString(Property, Object, bContainerElement, PreString, PostString, Target))\n\t{\n\t\treturn true;\n\t}\n\n\t// Primitive Array: Array[int], Array[bool]\n\tif (WritePrimitiveArrayToString(Property, Object, PreString, PostString, Target))\n\t{\n\t\treturn true;\n\t}\n\n\t// Complex element: UStruct, UObject\n\tif (WriteComplexElementToString(Property, Object, bContainerElement, PreString, PostString, bPointerAsRef, Target))\n\t{\n\t\treturn true;\n\t}\n\n\t// Complex Array: Array[UStruct], Array[UObject]\n\tif (WriteComplexArrayToString(Property, Object, PreString, PostString, Target))\n\t{\n\t\treturn true;\n\t}\n\n\t// Map\n\tif (WriteMapToString(Property, Object, PreString, PostString, Target))\n\t{\n\t\treturn true;\n\t}\n\n\t// Set\n\tif (WriteSetToString(Property, Object, PreString, PostString, Target))\n\t{\n\t\treturn true;\n\t}\n\n\treturn false;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool FDlgConfigWriter::WritePrimitiveElementToString(const FNYProperty* Property,\n\t\t\t\t\t\t\t\t\t\t\t\t\t const void* Object,\n\t\t\t\t\t\t\t\t\t\t\t\t\t bool bInContainer,\n\t\t\t\t\t\t\t\t\t\t\t\t\t const FString& PreS,\n\t\t\t\t\t\t\t\t\t\t\t\t\t const FString& PostS,\n\t\t\t\t\t\t\t\t\t\t\t\t\t FString& Target)\n{\n\t// Try every possible primitive type\n\tif (WritePrimitiveElementToStringTemplated<FNYBoolProperty, bool>(Property, Object, bInContainer, BoolToString, PreS, PostS, Target))\n\t{\n\t\treturn true;\n\t}\n\tif (WritePrimitiveElementToStringTemplated<FNYIntProperty, int32>(Property, Object, bInContainer, IntToString, PreS, PostS, Target))\n\t{\n\t\treturn true;\n\t}\n\tif (WritePrimitiveElementToStringTemplated<FNYInt64Property, int64>(Property, Object, bInContainer, IntToString, PreS, PostS, Target))\n\t{\n\t\treturn true;\n\t}\n\tif (WritePrimitiveElementToStringTemplated<FNYFloatProperty, float>(Property, Object, bInContainer, FloatToString, PreS, PostS, Target))\n\t{\n\t\treturn true;\n\t}\n\tif (WritePrimitiveElementToStringTemplated<FNYStrProperty, FString>(Property, Object, bInContainer, StringToString, PreS, PostS, Target))\n\t{\n\t\treturn true;\n\t}\n\tif (WritePrimitiveElementToStringTemplated<FNYNameProperty, FName>(Property, Object, bInContainer, NameToString, PreS, PostS, Target))\n\t{\n\t\treturn true;\n\t}\n\tif (WritePrimitiveElementToStringTemplated<FNYTextProperty, FText>(Property, Object, bInContainer, TextToString, PreS, PostS, Target))\n\t{\n\t\treturn true;\n\t}\n\n\t// TODO: enum in container - why isn't it implemented in the reader?\n\tif (!bInContainer)\n\t{\n\t\tconst auto* EnumProp = FNYReflectionHelper::CastProperty<FNYEnumProperty>(Property);\n\t\tif (EnumProp != nullptr)\n\t\t{\n\t\t\tconst void* Value = EnumProp->ContainerPtrToValuePtr<uint8>(Object);\n\t\t\tconst FName EnumName = EnumProp->GetEnum()->GetNameByIndex(EnumProp->GetUnderlyingProperty()->GetSignedIntPropertyValue(Value));\n\t\t\tTarget += PreS + Property->GetName() + \" \" + NameToString(EnumName) + PostS;\n\t\t\treturn true;\n\t\t}\n\t}\n\n\treturn false;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool FDlgConfigWriter::WritePrimitiveArrayToString(const FNYProperty* Property,\n\t\t\t\t\t\t\t\t\t\t\t\t   const void* Object,\n\t\t\t\t\t\t\t\t\t\t\t\t   const FString& PreString,\n\t\t\t\t\t\t\t\t\t\t\t\t   const FString& PostString,\n\t\t\t\t\t\t\t\t\t\t\t\t   FString& Target)\n{\n\tconst auto* ArrayProp = FNYReflectionHelper::CastProperty<FNYArrayProperty>(Property);\n\tif (ArrayProp == nullptr)\n\t{\n\t\treturn false;\n\t}\n\n\t// Try every possible primitive array type\n\tif (WritePrimitiveArrayToStringTemplated<FNYBoolProperty, bool>(ArrayProp, Object, BoolToString, PreString, PostString, Target))\n\t{\n\t\treturn true;\n\t}\n\tif (WritePrimitiveArrayToStringTemplated<FNYIntProperty, int32>(ArrayProp, Object, IntToString, PreString, PostString, Target))\n\t{\n\t\treturn true;\n\t}\n\tif (WritePrimitiveArrayToStringTemplated<FNYInt64Property, int64>(ArrayProp, Object, IntToString, PreString, PostString, Target))\n\t{\n\t\treturn true;\n\t}\n\tif (WritePrimitiveArrayToStringTemplated<FNYFloatProperty, float>(ArrayProp, Object, FloatToString, PreString, PostString, Target))\n\t{\n\t\treturn true;\n\t}\n\tif (WritePrimitiveArrayToStringTemplated<FNYStrProperty, FString>(ArrayProp, Object, StringToString, PreString, PostString, Target))\n\t{\n\t\treturn true;\n\t}\n\tif (WritePrimitiveArrayToStringTemplated<FNYNameProperty, FName>(ArrayProp, Object, NameToString, PreString, PostString, Target))\n\t{\n\t\treturn true;\n\t}\n\tif (WritePrimitiveArrayToStringTemplated<FNYTextProperty, FText>(ArrayProp, Object, TextToString, PreString, PostString, Target))\n\t{\n\t\treturn true;\n\t}\n\n\treturn false;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool FDlgConfigWriter::WriteComplexElementToString(const FNYProperty* Property,\n\t\t\t\t\t\t\t\t\t\t\t\t   const void* Object,\n\t\t\t\t\t\t\t\t\t\t\t\t   bool bContainerElement,\n\t\t\t\t\t\t\t\t\t\t\t\t   const FString& PreString,\n\t\t\t\t\t\t\t\t\t\t\t\t   const FString& PostString,\n\t\t\t\t\t\t\t\t\t\t\t\t   bool bPointerAsRef,\n\t\t\t\t\t\t\t\t\t\t\t\t   FString& Target)\n{\n\tif (Property == nullptr)\n\t{\n\t\treturn false;\n\t}\n\n\t// UStruct\n\tif (const auto* StructProperty = FNYReflectionHelper::CastProperty<FNYStructProperty>(Property))\n\t{\n\t\tconst void* StructObject = StructProperty->ContainerPtrToValuePtr<void>(Object, 0);\n\t\tif (StructObject == nullptr)\n\t\t{\n\t\t\treturn true;\n\t\t}\n\n\t\tWriteComplexToString(StructProperty->Struct,\n\t\t\t\t\t\t\t Property,\n\t\t\t\t\t\t\t StructObject,\n\t\t\t\t\t\t\t PreString,\n\t\t\t\t\t\t\t PostString,\n\t\t\t\t\t\t\t bContainerElement,\n\t\t\t\t\t\t\t false,\n\t\t\t\t\t\t\t Target);\n\t\treturn true;\n\t}\n\n\t// UObject\n\tif (const auto* ObjectProperty = FNYReflectionHelper::CastProperty<FNYObjectProperty>(Property))\n\t{\n\t\tUObject** ObjPtrPtr = ((UObject**)ObjectProperty->ContainerPtrToValuePtr<void>(Object, 0));\n\t\tconst FString Path = *ObjPtrPtr != nullptr ? (*ObjPtrPtr)->GetPathName() : \"\";\n\t\tauto WritePathName = [&]()\n\t\t{\n\t\t\tif (bContainerElement)\n\t\t\t{\n\t\t\t\tTarget += PreString + \"\\\"\" + Path + \"\\\"\" + PostString;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tTarget += PreString + Property->GetName() + \" \\\"\" + Path + \"\\\"\" + PostString;\n\t\t\t}\n\t\t};\n\n\t\tif (CanSaveAsReference(ObjectProperty, *ObjPtrPtr) || bPointerAsRef)\n\t\t{\n\t\t\tWritePathName();\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// Write nullptr as empty string\n\t\t\tif (*ObjPtrPtr == nullptr || ObjectProperty->PropertyClass == nullptr)\n\t\t\t{\n\t\t\t\tWritePathName();\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\tWriteComplexToString(ObjectProperty->PropertyClass,\n\t\t\t\t\t\t\t\t Property,\n\t\t\t\t\t\t\t\t *ObjPtrPtr,\n\t\t\t\t\t\t\t\t PreString,\n\t\t\t\t\t\t\t\t PostString,\n\t\t\t\t\t\t\t\t bContainerElement,\n\t\t\t\t\t\t\t\t true,\n\t\t\t\t\t\t\t\t Target);\n\t\t}\n\t\treturn true;\n\t}\n\n\treturn false;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FDlgConfigWriter::WriteComplexToString(const UStruct* StructDefinition,\n\t\t\t\t\t\t\t\t\t\t\tconst FNYProperty* Property,\n\t\t\t\t\t\t\t\t\t\t\tconst void* Object,\n\t\t\t\t\t\t\t\t\t\t\tconst FString& PreString,\n\t\t\t\t\t\t\t\t\t\t\tconst FString& PostString,\n\t\t\t\t\t\t\t\t\t\t\tbool bContainerElement,\n\t\t\t\t\t\t\t\t\t\t\tbool bWriteType,\n\t\t\t\t\t\t\t\t\t\t\tFString& Target)\n{\n\tif (CanSkipProperty(Property) || StructDefinition == nullptr)\n\t{\n\t\treturn;\n\t}\n\n\tconst UObject* UnrealObject = static_cast<const UObject*>(Object);\n\tif (bWriteType && !UnrealObject->IsValidLowLevelFast())\n\t{\n\t\treturn;\n\t}\n\n\tconst bool bLinePerMember = WouldWriteNonPrimitive(StructDefinition, Object);\n\n\t// WARNING: bWriteType implicates objectproperty, if that changes this code (cause of the object cast) should be updated accordingly\n\tconst FString TypeString = bWriteType ? GetNameWithoutPrefix(Property, UnrealObject) + \" \": \"\";\n\tif (bContainerElement)\n\t{\n\t\tif (TypeString.Len() > 0)\n\t\t{\n\t\t\tTarget += PreString + TypeString + (bLinePerMember ? EOL + PreString + \"{\" + EOL : \"{ \");\n\t\t}\n\t\telse\n\t\t{\n\t\t\tTarget += PreString + (bLinePerMember ? \"{\" + EOL_String : \"{ \");\n\t\t}\n\t}\n\telse\n\t{\n\t\tTarget += PreString + TypeString + Property->GetName() + (bLinePerMember ? EOL + PreString + \"{\" + EOL : \" { \");\n\t}\n\n\t// Write the properties of the Struct/Object\n\tWriteComplexMembersToString(StructDefinition, Object, (bLinePerMember ? PreString + \"\\t\" : \" \"), (bLinePerMember ? EOL_String : \"\"), Target);\n\n\tif (bLinePerMember)\n\t{\n\t\tTarget += PreString + \"}\" + PostString;\n\t}\n\telse\n\t{\n\t\tTarget += \" }\" + PostString;\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool FDlgConfigWriter::WriteComplexArrayToString(const FNYProperty* Property,\n\t\t\t\t\t\t\t\t\t\t\t\t const void* Object,\n\t\t\t\t\t\t\t\t\t\t\t\t const FString& PreString,\n\t\t\t\t\t\t\t\t\t\t\t\t const FString& PostString,\n\t\t\t\t\t\t\t\t\t\t\t\t FString& Target)\n{\n\tconst auto* ArrayProp = FNYReflectionHelper::CastProperty<FNYArrayProperty>(Property);\n\tif (ArrayProp == nullptr)\n\t{\n\t\treturn false;\n\t}\n\tif (FNYReflectionHelper::CastProperty<FNYStructProperty>(ArrayProp->Inner) == nullptr\n\t\t&& FNYReflectionHelper::CastProperty<FNYObjectProperty>(ArrayProp->Inner) == nullptr)\n\t{\n\t\treturn false;\n\t}\n\n\t// Empty Array\n\tconst FDlgConstScriptArrayHelper Helper(ArrayProp, ArrayProp->ContainerPtrToValuePtr<uint8>(Object));\n\tif (Helper.Num() == 0 && bDontWriteEmptyContainer)\n\t{\n\t\treturn true;\n\t}\n\n\tconst bool bWriteIndex = CanWriteIndex(Property);\n\tFString TypeText = \"\";\n\tauto* ObjProp = FNYReflectionHelper::CastProperty<FNYObjectProperty>(ArrayProp->Inner);\n\tif (ObjProp != nullptr && ObjProp->PropertyClass != nullptr)\n\t{\n\t\tTypeText = GetStringWithoutPrefix(ObjProp->PropertyClass->GetName()) + \" \";\n\t}\n\n\tif (Helper.Num() == 1 && !WouldWriteNonPrimitive(GetComplexType(ArrayProp->Inner), Helper.GetConstRawPtr(0)))\n\t{\n\t\tTarget += PreString + TypeText + ArrayProp->Inner->GetName() + \" {\";\n\t\tfor (int32 i = 0; i < Helper.Num(); ++i)\n\t\t{\n\t\t\tWriteComplexElementToString(ArrayProp->Inner, Helper.GetConstRawPtr(i), true, \" \", \"\", CanSaveAsReference(ArrayProp, nullptr), Target);\n\t\t}\n\t\tTarget += \" }\" + PostString;\n\t}\n\telse\n\t{\n\t\tTarget += PreString + TypeText + ArrayProp->Inner->GetName() + EOL;\n\t\tTarget += PreString + \"{\" + EOL;\n\t\tfor (int32 i = 0; i < Helper.Num(); ++i)\n\t\t{\n\t\t\tif (bWriteIndex)\n\t\t\t{\n\t\t\t\tTarget += PreString + \"\\t// \" + FString::FromInt(i) + EOL;\n\t\t\t}\n\t\t\tWriteComplexElementToString(ArrayProp->Inner, Helper.GetConstRawPtr(i), true, PreString + \"\\t\", EOL, CanSaveAsReference(ArrayProp, nullptr), Target);\n\t\t}\n\t\tTarget += PreString + \"}\" + EOL;\n\t}\n\n\treturn true;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool FDlgConfigWriter::WriteMapToString(const FNYProperty* Property,\n\t\t\t\t\t\t\t\t\t    const void* Object,\n\t\t\t\t\t\t\t\t\t    const FString& PreString,\n\t\t\t\t\t\t\t\t\t    const FString& PostString,\n\t\t\t\t\t\t\t\t\t    FString& Target)\n{\n\tconst auto* MapProp = FNYReflectionHelper::CastProperty<FNYMapProperty>(Property);\n\tif (MapProp == nullptr)\n\t{\n\t\treturn false;\n\t}\n\n\t// Empty map\n\tconst FScriptMapHelper Helper(MapProp, MapProp->ContainerPtrToValuePtr<uint8>(Object));\n\tif (Helper.Num() == 0 && bDontWriteEmptyContainer)\n\t{\n\t\treturn true;\n\t}\n\n\t// NOTE: Because we access the value with GetPropertyValue_InContainer, we can't use GetValuePtr, instead use GetPairPtr\n\tif (IsPrimitive(MapProp->KeyProp) && IsPrimitive(MapProp->ValueProp))\n\t{\n\t\t// Both Key and Value are primitives\n\t\tTarget += PreString + MapProp->GetName() + \" { \";\n\n\t\t// GetMaxIndex() instead of Num() - the container is not contiguous\n\t\t// elements are in [0, GetMaxIndex[, some of them are invalid (Num() returns with the valid element num)\n\t\tfor (int32 i = 0; i < Helper.GetMaxIndex(); ++i)\n\t\t{\n\t\t\tif (!Helper.IsValidIndex(i))\n\t\t\t{\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tWritePrimitiveElementToString(MapProp->KeyProp, Helper.GetPairPtr(i), true, \"\", \" \", Target);\n\t\t\tWritePrimitiveElementToString(MapProp->ValueProp, Helper.GetPairPtr(i), true, \"\", \" \", Target);\n\t\t}\n\t\tTarget += \"}\" + PostString;\n\t}\n\telse\n\t{\n\t\t// Either Key or Value is not a primitive\n\t\tTarget += PreString + MapProp->GetName() + EOL;\n\t\tTarget += PreString + \"{\" + EOL;\n\n\t\t// GetMaxIndex() instead of Num() - the container is not contiguous\n\t\t// elements are in [0, GetMaxIndex[, some of them are invalid (Num() returns with the valid element num)\n\t\tfor (int32 i = 0; i < Helper.GetMaxIndex(); ++i)\n\t\t{\n\t\t\tif (!Helper.IsValidIndex(i))\n\t\t\t{\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tWritePropertyToString(MapProp->KeyProp, Helper.GetPairPtr(i), true, PreString + \"\\t\", EOL, CanSaveAsReference(MapProp, nullptr), Target);\n\t\t\tWritePropertyToString(MapProp->ValueProp, Helper.GetPairPtr(i), true, PreString + \"\\t\", EOL, CanSaveAsReference(MapProp, nullptr), Target);\n\t\t}\n\t\tTarget += PreString + \"}\" + EOL;\n\t}\n\n\treturn true;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool FDlgConfigWriter::WriteSetToString(const FNYProperty* Property,\n\t\t\t\t\t\t\t\t\t\tconst void* Object,\n\t\t\t\t\t\t\t\t\t\tconst FString& PreString,\n\t\t\t\t\t\t\t\t\t\tconst FString& PostString,\n\t\t\t\t\t\t\t\t\t\tFString& Target)\n{\n\tconst auto* SetProp = FNYReflectionHelper::CastProperty<FNYSetProperty>(Property);\n\tif (SetProp == nullptr)\n\t{\n\t\treturn false;\n\t}\n\n\t// Empty set\n\tconst FScriptSetHelper Helper(SetProp, SetProp->ContainerPtrToValuePtr<uint8>(Object));\n\tif (Helper.Num() == 0 && bDontWriteEmptyContainer)\n\t{\n\t\treturn true;\n\t}\n\n\t// Only write primitive set elements\n\tif (IsPrimitive(SetProp->ElementProp))\n\t{\n\t\tconst bool bLinePerItem = CanWriteOneLinePerItem(SetProp);\n\n\t\t// Add space indentation\n\t\tFString SubPreString = PreString;\n\t\tfor (int32 i = 0; i < SetProp->GetName().Len() + 3; ++i)\n\t\t{\n\t\t\tSubPreString += \" \";\n\t\t}\n\n\t\t// SetName {\n\t\tTarget += PreString + SetProp->GetName() + \" {\";\n\t\tif (!bLinePerItem)\n\t\t{\n\t\t\t// Add space because there is no new line\n\t\t\tTarget += \" \";\n\t\t}\n\n\t\t// Set content\n\t\t// GetMaxIndex() instead of Num() - the container is not contiguous, elements are in [0, GetMaxIndex[, some of them is invalid (Num() returns with the valid element num)\n\t\tfor (int32 i = 0; i < Helper.GetMaxIndex(); ++i)\n\t\t{\n\t\t\tif (!Helper.IsValidIndex(i))\n\t\t\t{\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (bLinePerItem)\n\t\t\t{\n\t\t\t\tWritePrimitiveElementToString(SetProp->ElementProp, Helper.GetElementPtr(i), true, EOL + SubPreString, \"\", Target);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tWritePrimitiveElementToString(SetProp->ElementProp, Helper.GetElementPtr(i), true, \"\", \" \", Target);\n\t\t\t}\n\t\t}\n\n\t\t// }\n\t\tTarget += (bLinePerItem ? \" \" : \"\") + FString(\"}\") + PostString;\n\t}\n\telse\n\t{\n\t\tUE_LOG(LogDlgConfigWriter, Warning, TEXT(\"Set not exported: unsuported set member (%s)\"), *SetProp->ElementProp->GetName());\n\t}\n\n\treturn true;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool FDlgConfigWriter::IsPrimitive(const FNYProperty* Property)\n{\n\treturn FNYReflectionHelper::CastProperty<FNYBoolProperty>(Property) != nullptr ||\n\t\t   FNYReflectionHelper::CastProperty<FNYIntProperty>(Property) != nullptr ||\n\t\t   FNYReflectionHelper::CastProperty<FNYInt64Property>(Property) != nullptr ||\n\t\t   FNYReflectionHelper::CastProperty<FNYFloatProperty>(Property) != nullptr ||\n\t\t   FNYReflectionHelper::CastProperty<FNYStrProperty>(Property) != nullptr ||\n\t\t   FNYReflectionHelper::CastProperty<FNYNameProperty>(Property) != nullptr ||\n\t\t   FNYReflectionHelper::CastProperty<FNYTextProperty>(Property) != nullptr ||\n\t\t   FNYReflectionHelper::CastProperty<FNYEnumProperty>(Property) != nullptr;\n}\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool FDlgConfigWriter::IsContainer(const FNYProperty* Property)\n{\n\treturn FNYReflectionHelper::CastProperty<FNYArrayProperty>(Property) != nullptr ||\n\t\t   FNYReflectionHelper::CastProperty<FNYMapProperty>(Property) != nullptr ||\n\t\t   FNYReflectionHelper::CastProperty<FNYSetProperty>(Property) != nullptr;\n}\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool FDlgConfigWriter::IsPrimitiveContainer(const FNYProperty* Property)\n{\n\t// Array\n\tif (FNYReflectionHelper::CastProperty<FNYArrayProperty>(Property) != nullptr\n\t\t&& IsPrimitive(FNYReflectionHelper::CastProperty<FNYArrayProperty>(Property)->Inner))\n\t{\n\t\treturn true;\n\t}\n\n\t// Map\n\tif (FNYReflectionHelper::CastProperty<FNYMapProperty>(Property) != nullptr &&\n\t\tIsPrimitive(FNYReflectionHelper::CastProperty<FNYMapProperty>(Property)->KeyProp) &&\n\t\tIsPrimitive(FNYReflectionHelper::CastProperty<FNYMapProperty>(Property)->ValueProp))\n\t{\n\t\treturn true;\n\t}\n\n\t// Set\n\tif (FNYReflectionHelper::CastProperty<FNYSetProperty>(Property) != nullptr\n\t\t&& IsPrimitive(FNYReflectionHelper::CastProperty<FNYSetProperty>(Property)->ElementProp))\n\t{\n\t\treturn true;\n\t}\n\n\treturn false;\n}\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nconst UStruct* FDlgConfigWriter::GetComplexType(const FNYProperty* Property)\n{\n\tif (const auto* StructProperty = FNYReflectionHelper::CastProperty<FNYStructProperty>(Property))\n\t{\n\t\treturn StructProperty->Struct;\n\t}\n\n\tif (const auto* ObjectProperty = FNYReflectionHelper::CastProperty<FNYObjectProperty>(Property))\n\t{\n\t\treturn ObjectProperty->PropertyClass;\n\t}\n\n\treturn nullptr;\n}\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool FDlgConfigWriter::WouldWriteNonPrimitive(const UStruct* StructDefinition, const void* Owner)\n{\n\tif (StructDefinition == nullptr || Owner == nullptr)\n\t{\n\t\treturn false;\n\t}\n\n\tfor (TFieldIterator<const FNYProperty> It(StructDefinition); It; ++It)\n\t{\n\t\tconst auto* Property = *It;\n\n\t\t// Ignore primitives\n\t\tif (IsPrimitive(Property))\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (IsContainer(Property))\n\t\t{\n\t\t\t// Map\n\t\t\tif (const auto* MapProperty = FNYReflectionHelper::CastProperty<FNYMapProperty>(Property))\n\t\t\t{\n\t\t\t\tconst FScriptMapHelper Helper(MapProperty, Property->ContainerPtrToValuePtr<uint8>(Owner));\n\t\t\t\tif (Helper.Num() > 0)\n\t\t\t\t{\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Array\n\t\t\tif (const auto* ArrayProperty = FNYReflectionHelper::CastProperty<FNYArrayProperty>(Property))\n\t\t\t{\n\t\t\t\tconst FScriptArrayHelper Helper(ArrayProperty, Property->ContainerPtrToValuePtr<uint8>(Owner));\n\t\t\t\tif (Helper.Num() > 0)\n\t\t\t\t{\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Set\n\t\t\tif (const auto* SetProperty = FNYReflectionHelper::CastProperty<FNYSetProperty>(Property))\n\t\t\t{\n\t\t\t\tconst FScriptSetHelper Helper(SetProperty, Property->ContainerPtrToValuePtr<uint8>(Owner));\n\t\t\t\tif (Helper.Num() > 0)\n\t\t\t\t{\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif (FNYReflectionHelper::CastProperty<FNYStructProperty>(Property) != nullptr)\n\t\t\t{\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\tif (const auto* ObjectProperty = FNYReflectionHelper::CastProperty<FNYObjectProperty>(Property))\n\t\t\t{\n\t\t\t\tUObject** ObjPtrPtr = ((UObject**)ObjectProperty->ContainerPtrToValuePtr<void>(Owner, 0));\n\t\t\t\tif (ObjPtrPtr != nullptr && !CanSaveAsReference(Property, *ObjPtrPtr))\n\t\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t}\n\n\treturn false;\n}\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFString FDlgConfigWriter::GetNameWithoutPrefix(const FNYProperty* Property, const UObject* ObjectPtr)\n{\n\tif (const auto* StructProperty = FNYReflectionHelper::CastProperty<FNYStructProperty>(Property))\n\t{\n\t\treturn GetStringWithoutPrefix(StructProperty->Struct->GetName());\n\t}\n\n\tif (const auto* ObjectProperty = FNYReflectionHelper::CastProperty<FNYObjectProperty>(Property))\n\t{\n\t\t// Get the Class from the ObjectProperty\n\t\tif (ObjectPtr == nullptr)\n\t\t{\n\t\t\treturn GetStringWithoutPrefix(ObjectProperty->PropertyClass->GetName());\n\t\t}\n\n\t\tif (ObjectPtr->GetClass())\n\t\t{\n\t\t\treturn GetStringWithoutPrefix(ObjectPtr->GetClass()->GetName());\n\t\t}\n\t}\n\n\treturn \"\";\n}\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFString FDlgConfigWriter::GetStringWithoutPrefix(const FString& String)\n{\n\tint32 Count = String.Len();\n\tfor (int32 i = 0; i < ComplexNamePrefix.Len() && i < String.Len() && ComplexNamePrefix[i] == String[i]; ++i)\n\t{\n\t\tCount -= 1;\n\t}\n\n\treturn String.Right(Count);\n}\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystem/Private/IO/DlgJsonParser.cpp",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#include \"IO/DlgJsonParser.h\"\n\n\n#include \"Logging/LogMacros.h\"\n#include \"UObject/Object.h\"\n#include \"Misc/FileHelper.h\"\n#include \"Misc/Paths.h\"\n#include \"UObject/UnrealType.h\"\n#include \"UObject/EnumProperty.h\"\n#include \"UObject/UObjectIterator.h\"\n#include \"UObject/TextProperty.h\"\n#include \"UObject/PropertyPortFlags.h\"\n#include \"JsonObjectConverter.h\"\n#include \"JsonObjectWrapper.h\"\n#include \"Internationalization/CulturePointer.h\"\n#include \"Internationalization/Culture.h\"\n#include \"Misc/OutputDevice.h\"\n#include \"Misc/FeedbackContext.h\"\n\n#include \"NYReflectionHelper.h\"\n\n\nDEFINE_LOG_CATEGORY(LogDlgJsonParser);\n\nbool GetTextFromObject(const TSharedRef<FJsonObject>& Obj, FText& TextOut)\n{\n\t// get the prioritized culture name list\n\tconst FCultureRef CurrentCulture = FInternationalization::Get().GetCurrentCulture();\n\tconst TArray<FString> CultureList = CurrentCulture->GetPrioritizedParentCultureNames();\n\n\t// try to follow the fall back chain that the engine uses\n\tFString TextString;\n\tfor (const FString& CultureCode : CultureList)\n\t{\n\t\tif (Obj->TryGetStringField(CultureCode, TextString))\n\t\t{\n\t\t\tTextOut = FText::FromString(TextString);\n\t\t\treturn true;\n\t\t}\n\t}\n\n\t// no luck, is this possibly an unrelated json object?\n\treturn false;\n}\n\nFString GetStringForJsonType(const EJson Type)\n{\n\tswitch (Type)\n\t{\n\t\tcase EJson::None:\n\t\t\treturn TEXT(\"EJson::None\");\n\t\tcase EJson::Null:\n\t\t\treturn TEXT(\"EJson::Null\");\n\t\tcase EJson::String:\n\t\t\treturn TEXT(\"EJson::String\");\n\t\tcase EJson::Number:\n\t\t\treturn TEXT(\"EJson::Number\");\n\t\tcase EJson::Boolean:\n\t\t\treturn TEXT(\"EJson::Boolean\");\n\t\tcase EJson::Array:\n\t\t\treturn TEXT(\"EJson::Array\");\n\t\tcase EJson::Object:\n\t\t\treturn TEXT(\"EJson::Object\");\n\t\tdefault:\n\t\t\treturn TEXT(\"UNKNOWN TYPE, should never happen\");\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FDlgJsonParser::InitializeParser(const FString& FilePath)\n{\n\tif (FFileHelper::LoadFileToString(JsonString, *FilePath))\n\t{\n\t\tFileName = FPaths::GetBaseFilename(FilePath, true);\n\t\tbIsValidFile = true;\n\t}\n\telse\n\t{\n\t\tUE_LOG(LogDlgJsonParser, Error, TEXT(\"Failed to load config file %s\"), *FilePath);\n\t\tbIsValidFile = false;\n\t}\n\n\t// TODO check here if the JSON file is valid.\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FDlgJsonParser::InitializeParserFromString(const FString& Text)\n{\n\tJsonString = Text;\n\tbIsValidFile = true;\n\tFileName = \"\";\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FDlgJsonParser::ReadAllProperty( const UStruct* ReferenceClass, void* TargetObject, UObject* InDefaultObjectOuter)\n{\n\tif (!IsValidFile())\n\t{\n\t\treturn;\n\t}\n\n\t// TODO use DefaultObjectOuter;\n\tDefaultObjectOuter = InDefaultObjectOuter;\n\tbIsValidFile = JsonObjectStringToUStruct(ReferenceClass, TargetObject);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool FDlgJsonParser::ConvertScalarJsonValueToProperty(const TSharedPtr<FJsonValue>& JsonValue, FNYProperty* Property, void* ContainerPtr, void* ValuePtr)\n{\n\tcheck(Property);\n\tif (bLogVerbose)\n\t{\n\t\tUE_LOG(LogDlgJsonParser, Verbose, TEXT(\"ConvertScalarJsonValueToProperty, Property = `%s`\"), *Property->GetPathName());\n\t}\n\tif (ValuePtr == nullptr)\n\t{\n\t\t// Nothing else to do\n\t\treturn true;\n\t}\n\n\t// Enum\n\tif (auto* EnumProperty = FNYReflectionHelper::CastProperty<FNYEnumProperty>(Property))\n\t{\n\t\tif (JsonValue->Type == EJson::String)\n\t\t{\n\t\t\t// see if we were passed a string for the enum\n\t\t\tconst UEnum* Enum = EnumProperty->GetEnum();\n\t\t\tcheck(Enum);\n\t\t\tconst FString StrValue = JsonValue->AsString();\n\t\t\tconst int64 IntValue = Enum->GetValueByName(FName(*StrValue));\n\t\t\tif (IntValue == INDEX_NONE)\n\t\t\t{\n\t\t\t\tUE_LOG(LogDlgJsonParser,\n\t\t\t\t\t   Error,\n\t\t\t\t\t   TEXT(\"ConvertScalarJsonValueToProperty - Unable import enum `%s` from string value `%s` for property `%s`\"),\n\t\t\t\t\t   *Enum->CppType, *StrValue, *Property->GetNameCPP());\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tEnumProperty->GetUnderlyingProperty()->SetIntPropertyValue(ValuePtr, IntValue);\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// Numeric enum\n\t\t\t// AsNumber will log an error for completely inappropriate types (then give us a default)\n\t\t\tEnumProperty->GetUnderlyingProperty()->SetIntPropertyValue(ValuePtr, static_cast<int64>(JsonValue->AsNumber()));\n\t\t}\n\n\t\treturn true;\n\t}\n\n\t// Numeric, int, float, possible enum\n\tif (auto* NumericProperty = FNYReflectionHelper::CastProperty<FNYNumericProperty>(Property))\n\t{\n\t\tif (NumericProperty->IsEnum() && JsonValue->Type == EJson::String)\n\t\t{\n\t\t\t// see if we were passed a string for the enum\n\t\t\tconst UEnum* Enum = NumericProperty->GetIntPropertyEnum();\n\t\t\tcheck(Enum); // should be assured by IsEnum()\n\t\t\tconst FString StrValue = JsonValue->AsString();\n\t\t\tconst int64 IntValue = Enum->GetValueByName(FName(*StrValue));\n\t\t\tif (IntValue == INDEX_NONE)\n\t\t\t{\n\t\t\t\tUE_LOG(\n\t\t\t\t\tLogDlgJsonParser,\n\t\t\t\t\tError,\n\t\t\t\t\tTEXT(\"ConvertScalarJsonValueToProperty - Unable import enum %s from string value %s for property %s\"),\n\t\t\t\t\t*Enum->CppType, *StrValue, *Property->GetNameCPP()\n\t\t\t\t);\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tNumericProperty->SetIntPropertyValue(ValuePtr, IntValue);\n\t\t}\n\t\telse if (NumericProperty->IsInteger())\n\t\t{\n\t\t\tif (JsonValue->Type == EJson::String)\n\t\t\t{\n\t\t\t\t// parse string -> int64 ourselves so we don't lose any precision going through AsNumber (aka double)\n\t\t\t\tNumericProperty->SetIntPropertyValue(ValuePtr, FCString::Atoi64(*JsonValue->AsString()));\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t// AsNumber will log an error for completely inappropriate types (then give us a default)\n\t\t\t\tNumericProperty->SetIntPropertyValue(ValuePtr, static_cast<int64>(JsonValue->AsNumber()));\n\t\t\t}\n\t\t}\n\t\telse if (NumericProperty->IsFloatingPoint())\n\t\t{\n\t\t\t// AsNumber will log an error for completely inappropriate types (then give us a default)\n\t\t\tNumericProperty->SetFloatingPointPropertyValue(ValuePtr, JsonValue->AsNumber());\n\t\t}\n\t\telse\n\t\t{\n\t\t\tUE_LOG(\n\t\t\t\tLogDlgJsonParser,\n\t\t\t\tError,\n\t\t\t\tTEXT(\"ConvertScalarJsonValueToProperty - Unable to set numeric property type %s for property %s\"),\n\t\t\t\t*Property->GetClass()->GetName(), *Property->GetNameCPP()\n\t\t\t);\n\t\t\treturn false;\n\t\t}\n\n\t\treturn true;\n\t}\n\n\t// Bool\n\tif (auto* BoolProperty = FNYReflectionHelper::CastProperty<FNYBoolProperty>(Property))\n\t{\n\t\t// AsBool will log an error for completely inappropriate types (then give us a default)\n\t\tBoolProperty->SetPropertyValue(ValuePtr, JsonValue->AsBool());\n\t\treturn true;\n\t}\n\n\t// FString\n\tif (auto* StringProperty = FNYReflectionHelper::CastProperty<FNYStrProperty>(Property))\n\t{\n\t\t// Seems unsafe: AsString will log an error for completely inappropriate types (then give us a default)\n\t\tFString String = JsonValue->AsString();\n\t\tStringProperty->SetPropertyValue(ValuePtr, String);\n\t\treturn true;\n\t}\n\n\t// FName\n\tif (auto* NameProperty = FNYReflectionHelper::CastProperty<FNYNameProperty>(Property))\n\t{\n\t\tFString String;\n\t\tconst FName StringFName = FName(*JsonValue->AsString());\n\t\tNameProperty->SetPropertyValue(ValuePtr, StringFName);\n\t\treturn true;\n\t}\n\n\t// FText\n\tif (auto* TextProperty = FNYReflectionHelper::CastProperty<FNYTextProperty>(Property))\n\t{\n\t\tif (JsonValue->Type == EJson::String)\n\t\t{\n\t\t\t// assume this string is already localized, so import as invariant\n\t\t\tconst FString String = JsonValue->AsString();\n\t\t\tTextProperty->SetPropertyValue(ValuePtr, FText::FromString(String));\n\t\t}\n\t\telse if (JsonValue->Type == EJson::Object)\n\t\t{\n\t\t\tconst TSharedPtr<FJsonObject> Obj = JsonValue->AsObject();\n\t\t\tcheck(Obj.IsValid()); // should not fail if Type == EJson::Object\n\n\t\t\t// import the subvalue as a culture invariant string\n\t\t\tFText Text;\n\t\t\tif (!GetTextFromObject(Obj.ToSharedRef(), Text))\n\t\t\t{\n\t\t\t\tUE_LOG(\n\t\t\t\t\tLogDlgJsonParser,\n\t\t\t\t\tError,\n\t\t\t\t\tTEXT(\"ConvertScalarJsonValueToProperty - Attempted to import FText from JSON object with invalid keys for property %s\"),\n\t\t\t\t\t*Property->GetNameCPP()\n\t\t\t\t);\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tTextProperty->SetPropertyValue(ValuePtr, Text);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tUE_LOG(\n\t\t\t\tLogDlgJsonParser,\n\t\t\t\tError,\n\t\t\t\tTEXT(\"ConvertScalarJsonValueToProperty - Attempted to import FText from JSON that was neither string nor object for property %s\"),\n\t\t\t\t*Property->GetNameCPP()\n\t\t\t);\n\t\t\treturn false;\n\t\t}\n\n\t\treturn true;\n\t}\n\n\t// TArray\n\tif (auto* ArrayProperty = FNYReflectionHelper::CastProperty<FNYArrayProperty>(Property))\n\t{\n\t\tif (JsonValue->Type == EJson::Array)\n\t\t{\n\t\t\tconst TArray<TSharedPtr<FJsonValue>> ArrayValue = JsonValue->AsArray();\n\t\t\tconst int32 ArrayNum = ArrayValue.Num();\n\n\t\t\t// make the output array size match\n\t\t\tFScriptArrayHelper Helper(ArrayProperty, ValuePtr);\n\t\t\tHelper.EmptyValues();\n\t\t\tHelper.Resize(ArrayNum);\n\n\t\t\t// set the property values\n\t\t\tbool bReturnStatus = true;\n\t\t\tfor (int32 Index = 0; Index < ArrayNum; Index++)\n\t\t\t{\n\t\t\t\tconst TSharedPtr<FJsonValue>& ArrayValueItem = ArrayValue[Index];\n\t\t\t\tif (ArrayValueItem.IsValid())\n\t\t\t\t{\n\t\t\t\t\tif (!JsonValueToProperty(ArrayValueItem, ArrayProperty->Inner, ContainerPtr, Helper.GetRawPtr(Index)))\n\t\t\t\t\t{\n\t\t\t\t\t\tbReturnStatus = false;\n\t\t\t\t\t\tUE_LOG(\n\t\t\t\t\t\t\tLogDlgJsonParser,\n\t\t\t\t\t\t\tError,\n\t\t\t\t\t\t\tTEXT(\"ConvertScalarJsonValueToProperty - Unable to deserialize array element [%d] for property %s\"),\n\t\t\t\t\t\t\tIndex, *Property->GetNameCPP()\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn bReturnStatus;\n\t\t}\n\n\t\tUE_LOG(LogDlgJsonParser,\n\t\t\t   Error,\n\t\t\t   TEXT(\"ConvertScalarJsonValueToProperty - Attempted to import TArray from non-array JSON key for property %s\"),\n\t\t\t   *Property->GetNameCPP());\n\t\treturn false;\n\t}\n\n\t// Set\n\tif (auto* SetProperty = FNYReflectionHelper::CastProperty<FNYSetProperty>(Property))\n\t{\n\t\tif (JsonValue->Type == EJson::Array)\n\t\t{\n\t\t\tconst TArray<TSharedPtr<FJsonValue>> ArrayValue = JsonValue->AsArray();\n\t\t\tconst int32 ArrayNum = ArrayValue.Num();\n\n\t\t\tFScriptSetHelper Helper(SetProperty, ValuePtr);\n\t\t\tHelper.EmptyElements();\n\n\t\t\t// set the property values\n\t\t\tbool bReturnStatus = true;\n\t\t\tfor (int32 Index = 0; Index < ArrayNum; ++Index)\n\t\t\t{\n\t\t\t\tconst TSharedPtr<FJsonValue>& ArrayValueItem = ArrayValue[Index];\n\t\t\t\tif (ArrayValueItem.IsValid())\n\t\t\t\t{\n\t\t\t\t\tconst int32 NewIndex = Helper.AddDefaultValue_Invalid_NeedsRehash();\n\t\t\t\t\tif (!JsonValueToProperty(ArrayValueItem, SetProperty->ElementProp, ContainerPtr, Helper.GetElementPtr(NewIndex)))\n\t\t\t\t\t{\n\t\t\t\t\t\tbReturnStatus = false;\n\t\t\t\t\t\tUE_LOG(\n\t\t\t\t\t\t\tLogDlgJsonParser,\n\t\t\t\t\t\t\tError,\n\t\t\t\t\t\t\tTEXT(\"ConvertScalarJsonValueToProperty - Unable to deserialize set element [%d] for property %s\"),\n\t\t\t\t\t\t\tIndex,\n\t\t\t\t\t\t\t*Property->GetNameCPP()\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tHelper.Rehash();\n\t\t\treturn bReturnStatus;\n\t\t}\n\n\t\tUE_LOG(\n\t\t\tLogDlgJsonParser,\n\t\t\tError,\n\t\t\tTEXT(\"ConvertScalarJsonValueToProperty - Attempted to import TSet from non-array (JsonValue->Type = `%s`) JSON key for property %s\"),\n\t\t\t*GetStringForJsonType(JsonValue->Type), *Property->GetNameCPP()\n\t\t);\n\t\treturn false;\n\t}\n\n\t// TMap\n\tif (auto* MapProperty = FNYReflectionHelper::CastProperty<FNYMapProperty>(Property))\n\t{\n\t\tif (JsonValue->Type == EJson::Object)\n\t\t{\n\t\t\tconst TSharedPtr<FJsonObject> ObjectValue = JsonValue->AsObject();\n\t\t\tFScriptMapHelper Helper(MapProperty, ValuePtr);\n\t\t\tHelper.EmptyValues();\n\n\t\t\t// set the property values\n\t\t\tbool bReturnStatus = true;\n\t\t\tfor (const auto& Entry : ObjectValue->Values)\n\t\t\t{\n\t\t\t\tif (Entry.Value.IsValid())\n\t\t\t\t{\n\t\t\t\t\tconst int32 NewIndex = Helper.AddDefaultValue_Invalid_NeedsRehash();\n\n\t\t\t\t\t// NOTE if key is a FNYStructProperty no need to Import the text item here as it will do that below in UStruct\n\t\t\t\t\t// Add key\n\t\t\t\t\tconst TSharedPtr<FJsonValueString> KeyAsString = MakeShared<FJsonValueString>(Entry.Key);\n\t\t\t\t\tconst bool bKeySuccess = JsonValueToProperty(KeyAsString, Helper.GetKeyProperty(), ContainerPtr, Helper.GetKeyPtr(NewIndex));\n\n\t\t\t\t\t// Add value\n\t\t\t\t\tconst bool bValueSuccess = JsonValueToProperty(Entry.Value, Helper.GetValueProperty(), ContainerPtr, Helper.GetValuePtr(NewIndex));\n\n\t\t\t\t\tif (!bKeySuccess || !bValueSuccess)\n\t\t\t\t\t{\n\t\t\t\t\t\tHelper.RemoveAt(NewIndex);\n\t\t\t\t\t\tbReturnStatus = false;\n\t\t\t\t\t\tUE_LOG(\n\t\t\t\t\t\t\tLogDlgJsonParser,\n\t\t\t\t\t\t\tError,\n\t\t\t\t\t\t\tTEXT(\"ConvertScalarJsonValueToProperty - Unable to deserialize map element [key: %s] for property %s\"),\n\t\t\t\t\t\t\t*Entry.Key, *Property->GetNameCPP()\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tHelper.Rehash();\n\t\t\treturn bReturnStatus;\n\t\t}\n\n\t\tUE_LOG(LogDlgJsonParser,\n\t\t\t   Error,\n\t\t\t   TEXT(\"ConvertScalarJsonValueToProperty - Attempted to import TMap from non-object JSON key for property %s\"),\n\t\t\t   *Property->GetNameCPP());\n\t\treturn false;\n\t}\n\n\t// UStruct\n\tif (auto* StructProperty = FNYReflectionHelper::CastProperty<FNYStructProperty>(Property))\n\t{\n\t\tstatic const FName NAME_DateTime(TEXT(\"DateTime\"));\n\t\tstatic const FName NAME_Color(TEXT(\"Color\"));\n\t\tstatic const FName NAME_LinearColor(TEXT(\"LinearColor\"));\n\n\t\t// Default struct export\n\t\tif (JsonValue->Type == EJson::Object)\n\t\t{\n\t\t\tconst TSharedPtr<FJsonObject> Obj = JsonValue->AsObject();\n\t\t\tcheck(Obj.IsValid()); // should not fail if Type == EJson::Object\n\t\t\tif (!JsonObjectToUStruct(Obj.ToSharedRef(), StructProperty->Struct, ValuePtr))\n\t\t\t{\n\t\t\t\tUE_LOG(\n\t\t\t\t\tLogDlgJsonParser,\n\t\t\t\t\tError,\n\t\t\t\t\tTEXT(\"ConvertScalarJsonValueToProperty - JsonObjectToUStruct failed for property %s\"),\n\t\t\t\t\t*Property->GetNameCPP()\n\t\t\t\t);\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\t// Handle some structs that are exported to string in a special way\n\t\telse if (JsonValue->Type == EJson::String && StructProperty->Struct->GetFName() == NAME_LinearColor)\n\t\t{\n\t\t\tconst FString ColorString = JsonValue->AsString();\n\t\t\tconst FColor IntermediateColor = FColor::FromHex(ColorString);\n\t\t\tFLinearColor& ColorOut = *static_cast<FLinearColor*>(ValuePtr);\n\t\t\tColorOut = IntermediateColor;\n\t\t}\n\t\telse if (JsonValue->Type == EJson::String && StructProperty->Struct->GetFName() == NAME_Color)\n\t\t{\n\t\t\tconst FString ColorString = JsonValue->AsString();\n\t\t\tFColor& ColorOut = *static_cast<FColor*>(ValuePtr);\n\t\t\tColorOut = FColor::FromHex(ColorString);\n\t\t}\n\t\telse if (JsonValue->Type == EJson::String && StructProperty->Struct->GetFName() == NAME_DateTime)\n\t\t{\n\t\t\tconst FString DateString = JsonValue->AsString();\n\t\t\tFDateTime& DateTimeOut = *static_cast<FDateTime*>(ValuePtr);\n\t\t\tif (DateString == TEXT(\"min\"))\n\t\t\t{\n\t\t\t\t// min representable value for our date struct. Actual date may vary by platform (this is used for sorting)\n\t\t\t\tDateTimeOut = FDateTime::MinValue();\n\t\t\t}\n\t\t\telse if (DateString == TEXT(\"max\"))\n\t\t\t{\n\t\t\t\t// max representable value for our date struct. Actual date may vary by platform (this is used for sorting)\n\t\t\t\tDateTimeOut = FDateTime::MaxValue();\n\t\t\t}\n\t\t\telse if (DateString == TEXT(\"now\"))\n\t\t\t{\n\t\t\t\t// this value's not really meaningful from json serialization (since we don't know timezone) but handle it anyway since we're handling the other keywords\n\t\t\t\tDateTimeOut = FDateTime::UtcNow();\n\t\t\t}\n\t\t\telse if (FDateTime::ParseIso8601(*DateString, DateTimeOut))\n\t\t\t{\n\t\t\t\t// ok\n\t\t\t}\n\t\t\telse if (FDateTime::Parse(DateString, DateTimeOut))\n\t\t\t{\n\t\t\t\t// ok\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tUE_LOG(\n\t\t\t\t\tLogDlgJsonParser,\n\t\t\t\t\tWarning,\n\t\t\t\t\tTEXT(\"ConvertScalarJsonValueToProperty - Unable to import FDateTime for property %s\"),\n\t\t\t\t\t*Property->GetNameCPP()\n\t\t\t\t);\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t\telse if (JsonValue->Type == EJson::String &&\n\t\t\t\t StructProperty->Struct->GetCppStructOps() &&\n\t\t\t\t StructProperty->Struct->GetCppStructOps()->HasImportTextItem())\n\t\t{\n\t\t\t// Import as simple native string\n\t\t\tUScriptStruct::ICppStructOps* TheCppStructOps = StructProperty->Struct->GetCppStructOps();\n\n\t\t\tconst FString ImportTextString = JsonValue->AsString();\n\t\t\tconst TCHAR* ImportTextPtr = *ImportTextString;\n\t\t\tif (!TheCppStructOps->ImportTextItem(ImportTextPtr, ValuePtr, PPF_None, nullptr, static_cast<FOutputDevice*>(GWarn)))\n\t\t\t{\n\t\t\t\t// Fall back to trying the tagged property approach if custom ImportTextItem couldn't get it done\n\t\t\t\tProperty->ImportText(ImportTextPtr, ValuePtr, PPF_None, nullptr);\n\t\t\t}\n\t\t}\n\t\telse if (JsonValue->Type == EJson::String)\n\t\t{\n\t\t\t// Import as simple string\n\t\t\t// UTextBuffer* ImportErrors = NewObject<UTextBuffer>();\n\t\t\tconst FString ImportTextString = JsonValue->AsString();\n\t\t\tconst TCHAR* ImportTextPtr = *ImportTextString;\n\t\t\tProperty->ImportText(ImportTextPtr, ValuePtr, PPF_None, nullptr);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tUE_LOG(\n\t\t\t\tLogDlgJsonParser,\n\t\t\t\tError,\n\t\t\t\tTEXT(\"ConvertScalarJsonValueToProperty - Attempted to import UStruct from non-object JSON key for property %s\"),\n\t\t\t\t*Property->GetNameCPP()\n\t\t\t);\n\t\t\treturn false;\n\t\t}\n\n\t\treturn true;\n\t}\n\n\t// UObject\n\tif (auto* ObjectProperty = FNYReflectionHelper::CastProperty<FNYObjectProperty>(Property))\n\t{\n\t\t// NOTE: The Value here should be a pointer to a pointer\n\t\t// Because the UObjects are pointers, we must deference it. So instead of it being a void** we want it to be a void*\n\t\tauto* ObjectPtrPtr = static_cast<UObject**>(ObjectProperty->ContainerPtrToValuePtr<void>(ValuePtr, 0));\n\t\tif (ObjectPtrPtr == nullptr)\n\t\t{\n\t\t\tUE_LOG(\n\t\t\t\tLogDlgJsonParser,\n\t\t\t\tError,\n\t\t\t\tTEXT(\"PropertyName = `%s` Is a FNYObjectProperty but can't get non null ContainerPtrToValuePtr from it's StructObject\"),\n\t\t\t\t*Property->GetNameCPP()\n\t\t\t);\n\t\t\treturn false;\n\t\t}\n\n\t\t// NOTE: We must check one level up to check if it is a nullptr or not\n\t\t// Reset first, if non nullptr\n\t\tconst UObject* ContainerObjectPtr = ObjectProperty->GetObjectPropertyValue_InContainer(ContainerPtr);\n\t\tif (ContainerObjectPtr != nullptr)\n\t\t{\n\t\t\t*ObjectPtrPtr = nullptr;\n\t\t}\n\n\t\t// Nothing else to do\n\t\tif (JsonValue->IsNull())\n\t\t{\n\t\t\treturn true;\n\t\t}\n\t\tconst UClass* ObjectClass = ObjectProperty->PropertyClass;\n\n\t\t// Special case, load by reference, See CanSaveAsReference\n\t\t// Handle some objects that are exported to string in a special way. Similar to the UStruct above.\n\t\tif (JsonValue->Type == EJson::String)\n\t\t{\n\t\t\tconst FString Path = JsonValue->AsString();\n\t\t\tif (!Path.TrimStartAndEnd().IsEmpty()) // null reference?\n\t\t\t{\n\t\t\t\t*ObjectPtrPtr = StaticLoadObject(UObject::StaticClass(), DefaultObjectOuter, *Path);\n\t\t\t}\n\t\t\treturn true;\n\t\t}\n\n\t\t// Load the Normal JSON object\n\t\t// Must have the type inside the Json Object\n\t\tcheck(JsonValue->Type == EJson::Object);\n\t\tconst TSharedPtr<FJsonObject> JsonObject = JsonValue->AsObject();\n\t\tcheck(JsonObject.IsValid()); // should not fail if Type == EJson::Object\n\n\t\tconst FString SpecialKeyType = TEXT(\"__type__\");\n\t\tif (!JsonObject->HasField(SpecialKeyType))\n\t\t{\n\t\t\tUE_LOG(\n\t\t\t\tLogDlgJsonParser,\n\t\t\t\tError,\n\t\t\t\tTEXT(\"ConvertScalarJsonValueToProperty - PropertyName = `%s` JSON does not have the __type__ special property.\"),\n\t\t\t\t*Property->GetNameCPP()\n\t\t\t);\n\t\t\treturn false;\n\t\t}\n\n\t\t//  Create the new Object\n\t\tFString JsonObjectType;\n\t\tcheck(JsonObject->TryGetStringField(SpecialKeyType, JsonObjectType));\n\n\t\tconst UClass* ChildClass = GetChildClassFromName(ObjectClass, JsonObjectType);\n\t\tif (ChildClass == nullptr)\n\t\t{\n\t\t\tUE_LOG(\n\t\t\t\tLogDlgJsonParser,\n\t\t\t\tError,\n\t\t\t\tTEXT(\"ConvertScalarJsonValueToProperty - Trying to load by string reference. Could not find class `%s` for FNYObjectProperty = `%s`. Ignored.\"),\n\t\t\t\t*JsonObjectType, *Property->GetNameCPP()\n\t\t\t);\n\t\t\treturn false;\n\t\t}\n\t\t*ObjectPtrPtr = CreateNewUObject(ChildClass, DefaultObjectOuter);\n\n\t\t// Something is wrong\n\t\tif (*ObjectPtrPtr == nullptr || !(*ObjectPtrPtr)->IsValidLowLevelFast())\n\t\t{\n\t\t\tUE_LOG(\n\t\t\t\tLogDlgJsonParser,\n\t\t\t\tError,\n\t\t\t\tTEXT(\"JsonValueToProperty - PropertyName = `%s` Is a FNYObjectProperty but could not build any valid UObject\"),\n\t\t\t\t*Property->GetNameCPP()\n\t\t\t);\n\t\t\treturn false;\n\t\t}\n\n\t\t// Write the json object\n\t\tif (!JsonObjectToUStruct(JsonObject.ToSharedRef(), ObjectClass, *ObjectPtrPtr))\n\t\t{\n\t\t\tUE_LOG(\n\t\t\t\tLogDlgJsonParser,\n\t\t\t\tError,\n\t\t\t\tTEXT(\"JsonValueToProperty - JsonObjectToUStruct failed for property %s\"),\n\t\t\t\t*Property->GetNameCPP()\n\t\t\t);\n\t\t\treturn false;\n\t\t}\n\n\t\treturn true;\n\t}\n\n\t// Default to expect a string for everything else\n\tcheck(JsonValue->Type != EJson::Object);\n\tconst FString Buffer = JsonValue->AsString();\n\tif (Property->ImportText(*Buffer, ValuePtr, PPF_None, nullptr) == nullptr)\n\t{\n\t\tUE_LOG(\n\t\t\tLogDlgJsonParser,\n\t\t\tError,\n\t\t\tTEXT(\"JsonValueToProperty - Unable import property type %s from string value for property %s\"),\n\t\t\t*Property->GetClass()->GetName(), *Property->GetNameCPP()\n\t\t);\n\t\treturn false;\n\t}\n\treturn true;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool FDlgJsonParser::JsonValueToProperty(const TSharedPtr<FJsonValue>& JsonValue, FNYProperty* Property, void* ContainerPtr, void* ValuePtr)\n{\n\tcheck(Property);\n\tif (bLogVerbose)\n\t{\n\t\tUE_LOG(LogDlgJsonParser, Verbose, TEXT(\"JsonValueToProperty, Property = `%s`\"), *Property->GetPathName());\n\t}\n\tif (!JsonValue.IsValid())\n\t{\n\t\tUE_LOG(LogDlgJsonParser, Error, TEXT(\"JsonValueToProperty - Invalid value JSON key\"));\n\t\treturn false;\n\t}\n\n\tconst bool bArrayProperty = Property->IsA<FNYArrayProperty>();\n\tconst bool bSetProperty = Property->IsA<FNYSetProperty>();\n\tconst bool bJsonArray = JsonValue->Type == EJson::Array;\n\n\t// Scalar only one property\n\tif (!bJsonArray)\n\t{\n\t\tif (bArrayProperty)\n\t\t{\n\t\t\tUE_LOG(\n\t\t\t\tLogDlgJsonParser,\n\t\t\t\tError,\n\t\t\t\tTEXT(\"JsonValueToProperty - Attempted to import TArray from non-array JSON type = `%s`\"),\n\t\t\t\t*GetStringForJsonType(JsonValue->Type)\n\t\t\t);\n\t\t\treturn false;\n\t\t}\n\t\tif (bSetProperty)\n\t\t{\n\t\t\tUE_LOG(\n\t\t\t\tLogDlgJsonParser,\n\t\t\t\tError,\n\t\t\t\tTEXT(\"JsonValueToProperty - Attempted to import TSet from non-array JSON type = `%s`\"),\n\t\t\t\t*GetStringForJsonType(JsonValue->Type)\n\t\t\t);\n\t\t\treturn false;\n\t\t}\n\n\t\tif (Property->ArrayDim != 1)\n\t\t{\n\t\t\tUE_LOG(LogDlgJsonParser, Warning, TEXT(\"[Property->ArrayDim != 1] Ignoring excess properties when deserializing %s\"), *Property->GetNameCPP());\n\t\t}\n\n\t\treturn ConvertScalarJsonValueToProperty(JsonValue, Property, ContainerPtr, ValuePtr);\n\t}\n\n\t// In practice, the ArrayDim == 1 check ought to be redundant, since nested arrays of UPropertys are not supported\n\tif ((bArrayProperty || bSetProperty) && Property->ArrayDim == 1)\n\t{\n\t\t// Read into TArray/TSet\n\t\treturn ConvertScalarJsonValueToProperty(JsonValue, Property, ContainerPtr, ValuePtr);\n\t}\n\n\t// Array\n\t// We're deserializing a JSON array\n\tconst auto& ArrayValue = JsonValue->AsArray();\n\tif (Property->ArrayDim < ArrayValue.Num())\n\t{\n\t\tUE_LOG(LogDlgJsonParser, Warning, TEXT(\"[Property->ArrayDim < ArrayValue.Num()] Ignoring excess properties when deserializing %s\"), *Property->GetNameCPP());\n\t}\n\n\t// Read into Array/Set\n\tconst int32 ItemsToRead = FMath::Clamp(ArrayValue.Num(), 0, Property->ArrayDim);\n\tauto* ValueIntPtr = static_cast<uint8*>(ValuePtr);\n\tbool bReturnStatus = true;\n\tfor (int32 Index = 0; Index < ItemsToRead; ++Index)\n\t{\n\t\t// ValuePtr + Index * Property->ElementSize is literally FScriptArrayHelper::GetRawPtr\n\t\tbReturnStatus &= ConvertScalarJsonValueToProperty(ArrayValue[Index], Property, ContainerPtr, ValueIntPtr + Index * Property->ElementSize);\n\t}\n\treturn bReturnStatus;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool FDlgJsonParser::JsonAttributesToUStruct(const TMap<FString, TSharedPtr<FJsonValue>>& JsonAttributes,\n\t\t\t\t\t\t\t\t\t\t\tconst UStruct* StructDefinition, void* ContainerPtr)\n{\n\tcheck(StructDefinition);\n\tcheck(ContainerPtr);\n\tif (bLogVerbose)\n\t{\n\t\tUE_LOG(LogDlgJsonParser, Verbose, TEXT(\"JsonAttributesToUStruct, StructDefinition = `%s`\"), *StructDefinition->GetPathName());\n\t}\n\n\t// Json Wrapper, already have an Object\n\tif (StructDefinition == FJsonObjectWrapper::StaticStruct())\n\t{\n\t\t// Just copy it into the object\n\t\tFJsonObjectWrapper* ProxyObject = (FJsonObjectWrapper *)ContainerPtr;\n\t\tProxyObject->JsonObject = MakeShared<FJsonObject>();\n\t\tProxyObject->JsonObject->Values = JsonAttributes;\n\t\treturn true;\n\t}\n\n\t// Handle UObject inheritance (children of class)\n\tif (StructDefinition->IsA<UClass>())\n\t{\n\t\t// Structure points to the child\n\t\tconst UObject* UnrealObject = static_cast<const UObject*>(ContainerPtr);\n\t\tif (!UnrealObject->IsValidLowLevelFast())\n\t\t{\n\t\t\tUE_LOG(\n\t\t\t\tLogDlgJsonParser,\n\t\t\t\tError,\n\t\t\t\tTEXT(\"JsonAttributesToUStruct: StructDefinition = `%s` is a UClass and expected ContainerPtr to be an UObject. Memory corruption?\"),\n\t\t\t\t*StructDefinition->GetPathName()\n\t\t\t);\n\t\t\treturn false;\n\t\t}\n\t\tStructDefinition = UnrealObject->GetClass();\n\t}\n\tif (!StructDefinition->IsValidLowLevelFast())\n\t{\n\t\tUE_LOG(\n\t\t\tLogDlgJsonParser,\n\t\t\tError,\n\t\t\tTEXT(\"JsonAttributesToUStruct: StructDefinition = `%s` is a UClass and expected ContainerPtr.Class to be valid. Memory corruption?\"),\n\t\t\t*StructDefinition->GetPathName()\n\t\t);\n\t\treturn false;\n\t}\n\n\t// iterate over the struct properties\n\tfor (TFieldIterator<FNYProperty> PropIt(StructDefinition); PropIt; ++PropIt)\n\t{\n\t\tauto* Property = *PropIt;\n\t\tif (!ensure(Property))\n\t\t\tcontinue;\n\n\t\tconst FString PropertyName = Property->GetName();\n\n\t\t// Check to see if we should ignore this property\n\t\tif (CheckFlags != 0 && !Property->HasAnyPropertyFlags(CheckFlags))\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\t\t// TODO skip property\n\n\t\t// Find a JSON value matching this property name\n\t\tTSharedPtr<FJsonValue> JsonValue;\n\t\tfor (auto& Elem : JsonAttributes)\n\t\t{\n\t\t\t// use case insensitive search since FName may change case strangely on us\n\t\t\t// TODO does this break on struct/classes with properties of similar name?\n\t\t\tif (PropertyName.Equals(Elem.Key, ESearchCase::IgnoreCase))\n\t\t\t{\n\t\t\t\tJsonValue = Elem.Value;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tif (!JsonValue.IsValid())\n\t\t{\n\t\t\t// we allow values to not be found since this mirrors the typical UObject mantra that all the fields are optional when deserializing\n\t\t\tcontinue;\n\t\t}\n\n\t\tvoid* ValuePtr = nullptr;\n\t\tif (Property->IsA<FNYObjectProperty>())\n\t\t{\n\t\t\t// Handle pointers, only allowed to be UObjects (are already pointers to the Value)\n\t\t\tValuePtr = ContainerPtr;\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// Normal non pointer property\n\t\t\tValuePtr = Property->ContainerPtrToValuePtr<void>(ContainerPtr, 0);\n\t\t}\n\n\t\t// Convert the JsonValue to the Property\n\t\tif (!JsonValueToProperty(JsonValue, Property, ContainerPtr, ValuePtr))\n\t\t{\n\t\t\tUE_LOG(\n\t\t\t\tLogDlgJsonParser,\n\t\t\t\tError,\n\t\t\t\tTEXT(\"JsonObjectToUStruct - Unable to parse %s.%s from JSON\"),\n\t\t\t\t*StructDefinition->GetName(), *PropertyName\n\t\t\t);\n\t\t\tcontinue;\n\t\t}\n\t}\n\n\treturn true;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool FDlgJsonParser::JsonObjectStringToUStruct(const UStruct* StructDefinition, void* ContainerPtr)\n{\n\tTSharedPtr<FJsonObject> JsonObject;\n\tTSharedRef<TJsonReader<>> JsonReader = TJsonReaderFactory<>::Create(JsonString);\n\tif (!FJsonSerializer::Deserialize(JsonReader, JsonObject) || !JsonObject.IsValid())\n\t{\n\t\tUE_LOG(LogDlgJsonParser, Error, TEXT(\"JsonObjectStringToUStruct - Unable to parse json=[%s]\"), *JsonString);\n\t\treturn false;\n\t}\n\tif (!JsonObjectToUStruct(JsonObject.ToSharedRef(), StructDefinition, ContainerPtr))\n\t{\n\t\tUE_LOG(LogDlgJsonParser, Error, TEXT(\"JsonObjectStringToUStruct - Unable to deserialize. json=[%s]\"), *JsonString);\n\t\treturn false;\n\t}\n\treturn true;\n}\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystem/Private/IO/DlgJsonWriter.cpp",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#include \"IO/DlgJsonWriter.h\"\n\n#include \"JsonObjectConverter.h\"\n#include \"JsonObjectWrapper.h\"\n#include \"Policies/CondensedJsonPrintPolicy.h\"\n#include \"UObject/UnrealType.h\"\n#include \"UObject/EnumProperty.h\"\n#include \"UObject/UObjectIterator.h\"\n#include \"UObject/TextProperty.h\"\n#include \"UObject/PropertyPortFlags.h\"\n\n#include \"DlgHelper.h\"\n#include \"NYReflectionHelper.h\"\n\nDEFINE_LOG_CATEGORY(LogDlgJsonWriter);\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FDlgJsonWriter::Write(const UStruct* StructDefinition, const void* ContainerPtr)\n{\n\tDlgJsonWriterOptions WriterOptions;\n\tWriterOptions.bPrettyPrint = true;\n\tWriterOptions.InitialIndent = 0;\n\tUStructToJsonString(StructDefinition, ContainerPtr, WriterOptions, JsonString);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nTSharedPtr<FJsonValue> FDlgJsonWriter::ConvertScalarPropertyToJsonValue(const FNYProperty* Property, const void* const ContainerPtr, const void* const ValuePtr)\n{\n\tcheck(Property);\n\tif (bLogVerbose)\n\t{\n\t\tUE_LOG(LogDlgJsonWriter, Verbose, TEXT(\"ConvertScalarPropertyToJsonValue, Property = `%s`\"), *Property->GetPathName());\n\t}\n\tif (ValuePtr == nullptr)\n\t{\n\t\t// Invalid\n\t\treturn MakeShared<FJsonValueNull>();\n\t}\n\n\t//\n\t// NOTE: UProperty::ExportTextItem has the following arguments\n\t// FString& ValueStr, const void* PropertyValue, const void* DefaultValue, UObject* Parent, int32 PortFlags, UObject* ExportRootScope\n\t// We set the PropertyValue to be the same as DefaultValue, if DefaultValue is nullptr then this won't export the values different from default that the UProperty has.\n\t// This is only a problem if the target class is different from default (like it happens in tests).\n\t//\n\n\t// Get Json String for Enum definition\n\tauto GetJsonStringForEnum = [&ValuePtr](const UEnum* EnumDefinition, const FNYNumericProperty* NumericProperty) -> TSharedPtr<FJsonValue>\n\t{\n\t\tconst FString StringValue = EnumDefinition->GetNameByIndex(NumericProperty->GetSignedIntPropertyValue(ValuePtr)).ToString();\n\t\treturn MakeShared<FJsonValueString>(StringValue);\n\t};\n\n\t// Add Index Metadata to JsonObject\n\tauto AddIndexMetadata = [this, Property](TSharedRef<FJsonObject> JsonObject)\n\t{\n\t\tif (IndexInArray != INDEX_NONE && CanWriteIndex(Property))\n\t\t{\n\t\t\tJsonObject->SetField(TEXT(\"__index__\"), MakeShared<FJsonValueNumber>(IndexInArray));\n\t\t}\n\t};\n\n\t// Enum, export enums as strings\n\tif (const auto* EnumProperty = FNYReflectionHelper::CastProperty<FNYEnumProperty>(Property))\n\t{\n\t\treturn GetJsonStringForEnum(EnumProperty->GetEnum(), EnumProperty->GetUnderlyingProperty());\n\t}\n\n\t// Numeric, int, float, possible enum\n\tif (const auto* NumericProperty = FNYReflectionHelper::CastProperty<FNYNumericProperty>(Property))\n\t{\n\t\t// See if it's an enum Numeric property\n\t\tif (UEnum* EnumDef = NumericProperty->GetIntPropertyEnum())\n\t\t{\n\t\t\treturn GetJsonStringForEnum(EnumDef, NumericProperty);\n\t\t}\n\n\t\t// We want to export numbers as numbers\n\t\tif (NumericProperty->IsInteger())\n\t\t{\n\t\t\tif (bIsPropertyMapKey)\n\t\t\t{\n\t\t\t\t// NOTE, because JSON only supports floats we do not use the FJsonValueNumber for map keys because integers\n\t\t\t\t// are displayed as floats. For example '42' is displayed as '42.0'\n\t\t\t\t// Instead we use it as a string, this should be similar as the parser can parse an int from string\n\t\t\t\treturn MakeShared<FJsonValueString>(FString::Printf(TEXT(\"%lld\"), NumericProperty->GetSignedIntPropertyValue(ValuePtr)));\n\t\t\t}\n\n\t\t\treturn MakeShared<FJsonValueNumber>(NumericProperty->GetSignedIntPropertyValue(ValuePtr));\n\t\t}\n\t\tif (NumericProperty->IsFloatingPoint())\n\t\t{\n\t\t\treturn MakeShared<FJsonValueNumber>(NumericProperty->GetFloatingPointPropertyValue(ValuePtr));\n\t\t}\n\n\t\t// Invalid\n\t\treturn MakeShared<FJsonValueNull>();\n\t}\n\n\t// Bool, Export bools as JSON bools\n\tif (const auto* BoolProperty = FNYReflectionHelper::CastProperty<FNYBoolProperty>(Property))\n\t{\n\t\treturn MakeShared<FJsonValueBoolean>(BoolProperty->GetOptionalPropertyValue(ValuePtr));\n\t}\n\n\t// FString\n\tif (const auto* StringProperty = FNYReflectionHelper::CastProperty<FNYStrProperty>(Property))\n\t{\n\t\treturn MakeShared<FJsonValueString>(StringProperty->GetOptionalPropertyValue(ValuePtr));\n\t}\n\n\t// FName\n\tif (const auto* NameProperty = FNYReflectionHelper::CastProperty<FNYNameProperty>(Property))\n\t{\n\t\tauto* NamePtr = static_cast<const FName*>(ValuePtr);\n\t\tif (NamePtr == nullptr)\n\t\t{\n\t\t\tUE_LOG(LogDlgJsonWriter,\n\t\t\t\t   Error,\n\t\t\t\t   TEXT(\"Got Property = `%s` of type FNYNameProperty but the Value it not an FName\"),\n\t\t\t\t   *NameProperty->GetName())\n\t\t\treturn MakeShared<FJsonValueNull>();\n\t\t}\n\t\tif (!NamePtr->IsValidIndexFast() || !NamePtr->IsValid())\n\t\t{\n\t\t\tUE_LOG(LogDlgJsonWriter, Error, TEXT(\"Got Property = `%s` of type FName but it is not valid :(\"), *NameProperty->GetNameCPP())\n\t\t\treturn MakeShared<FJsonValueNull>();\n\t\t}\n\t\t//check(NamePtr == NameProperty->GetPropertyValuePtr(Value));\n\t\treturn MakeShared<FJsonValueString>(NamePtr->ToString());\n\t}\n\n\t// FText\n\tif (const auto* TextProperty = FNYReflectionHelper::CastProperty<FNYTextProperty>(Property))\n\t{\n\t\treturn MakeShared<FJsonValueString>(TextProperty->GetOptionalPropertyValue(ValuePtr).ToString());\n\t}\n\n\t// TArray\n\tif (const auto* ArrayProperty = FNYReflectionHelper::CastProperty<FNYArrayProperty>(Property))\n\t{\n\t\tTArray<TSharedPtr<FJsonValue>> Array;\n\t\tconst FDlgConstScriptArrayHelper Helper(ArrayProperty, ValuePtr);\n\t\tfor (int32 Index = 0, Num = Helper.Num(); Index < Num; Index++)\n\t\t{\n\t\t\tIndexInArray = Index;\n\t\t\tTSharedPtr<FJsonValue> Elem = PropertyToJsonValue(ArrayProperty->Inner, ContainerPtr, Helper.GetConstRawPtr(Index));\n\t\t\tif (Elem.IsValid())\n\t\t\t{\n\t\t\t\t// add to the array\n\t\t\t\tArray.Push(Elem);\n\t\t\t}\n\t\t}\n\n\t\tResetState();\n\t\treturn MakeShared<FJsonValueArray>(Array);\n\t}\n\n\t// TSet\n\tif (const auto* SetProperty = FNYReflectionHelper::CastProperty<FNYSetProperty>(Property))\n\t{\n\t\tTArray<TSharedPtr<FJsonValue>> Array;\n\t\tconst FScriptSetHelper Helper(SetProperty, ValuePtr);\n\n\t\t// GetMaxIndex() instead of Num() - the container is not contiguous\n\t\t// elements are in [0, GetMaxIndex[, some of them are invalid (Num() returns with the valid element num)\n\t\tfor (int32 Index = 0; Index < Helper.GetMaxIndex(); Index++)\n\t\t{\n\t\t\tif (!Helper.IsValidIndex(Index))\n\t\t\t{\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tIndexInArray = Index;\n\t\t\tTSharedPtr<FJsonValue> Elem = PropertyToJsonValue(SetProperty->ElementProp, ContainerPtr, Helper.GetElementPtr(Index));\n\t\t\tif (Elem.IsValid())\n\t\t\t{\n\t\t\t\t// add to the array\n\t\t\t\tArray.Push(Elem);\n\t\t\t}\n\t\t}\n\n\t\tResetState();\n\t\treturn MakeShared<FJsonValueArray>(Array);\n\t}\n\n\t// TMap\n\tif (const auto* MapProperty = FNYReflectionHelper::CastProperty<FNYMapProperty>(Property))\n\t{\n\t\tconst TSharedRef<FJsonObject> OutObject = MakeShared<FJsonObject>();\n\t\tconst FDlgConstScriptMapHelper Helper(MapProperty, ValuePtr);\n\n\t\t// GetMaxIndex() instead of Num() - the container is not contiguous\n\t\t// elements are in [0, GetMaxIndex[, some of them are invalid (Num() returns with the valid element num)\n\t\tfor (int32 Index = 0; Index < Helper.GetMaxIndex(); Index++)\n\t\t{\n\t\t\tif (!Helper.IsValidIndex(Index))\n\t\t\t{\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tIndexInArray = Index;\n\n\t\t\tbIsPropertyMapKey = true;\n\t\t\tconst uint8* MapKeyPtr = Helper.GetConstKeyPtr(Index);\n\t\t\tconst TSharedPtr<FJsonValue> KeyElement = PropertyToJsonValue(Helper.GetKeyProperty(), ContainerPtr, MapKeyPtr);\n\n\t\t\tbIsPropertyMapKey = false;\n\t\t\tconst uint8* MapValuePtr = Helper.GetConstValuePtr(Index);\n\t\t\tconst TSharedPtr<FJsonValue> ValueElement = PropertyToJsonValue(Helper.GetValueProperty(), ContainerPtr, MapValuePtr);\n\n\t\t\tif (KeyElement.IsValid() && ValueElement.IsValid())\n\t\t\t{\n\t\t\t\tcheck(MapKeyPtr);\n\n\t\t\t\tFString KeyString;\n\t\t\t\tif (auto* KeyStructProperty = FNYReflectionHelper::CastProperty<FNYStructProperty>(MapProperty->KeyProp))\n\t\t\t\t{\n\t\t\t\t\t// Key is a struct\n\t\t\t\t\tMapProperty->KeyProp->ExportTextItem(KeyString, MapKeyPtr, MapKeyPtr, nullptr, PPF_None);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t// Default to key string\n\t\t\t\t\tKeyString = KeyElement->AsString();\n\t\t\t\t}\n\n\t\t\t\t// Fallback for anything else, what could this be :O\n\t\t\t\tif (KeyString.IsEmpty())\n\t\t\t\t{\n\t\t\t\t\tMapProperty->KeyProp->ExportTextItem(KeyString, MapKeyPtr, MapKeyPtr, nullptr, PPF_None);\n\n\t\t\t\t\tif (KeyString.IsEmpty())\n\t\t\t\t\t{\n\t\t\t\t\t\tUE_LOG(LogDlgJsonWriter, Error, TEXT(\"Unable to convert key to string for property `%s`.\"), *MapProperty->GetNameCPP())\n\t\t\t\t\t\tKeyString = FString::Printf(TEXT(\"Unparsed Key %d\"), Index);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tOutObject->SetField(KeyString, ValueElement);\n\t\t\t}\n\t\t}\n\n\t\tResetState();\n\t\treturn MakeShared<FJsonValueObject>(OutObject);\n\t}\n\n\t// UStruct\n\tif (const auto* StructProperty = FNYReflectionHelper::CastProperty<FNYStructProperty>(Property))\n\t{\n\t\t// Intentionally exclude the JSON Object wrapper, which specifically needs to export JSON in an object representation instead of a string\n\t\tUScriptStruct::ICppStructOps* TheCppStructOps = StructProperty->Struct->GetCppStructOps();\n\t\tif (StructProperty->Struct != FJsonObjectWrapper::StaticStruct() && TheCppStructOps && TheCppStructOps->HasExportTextItem())\n\t\t{\n\t\t\t// Export to native text\n\t\t\tFString OutValueStr;\n\t\t\tTheCppStructOps->ExportTextItem(OutValueStr, ValuePtr, ValuePtr, nullptr, PPF_None, nullptr);\n\t\t\treturn MakeShared<FJsonValueString>(OutValueStr);\n\t\t}\n\n\t\t// Handle Struct\n\t\tTSharedRef<FJsonObject> OutObject = MakeShared<FJsonObject>();\n\t\tAddIndexMetadata(OutObject);\n\t\tif (UStructToJsonObject(StructProperty->Struct, ValuePtr, OutObject))\n\t\t{\n\t\t\treturn MakeShared<FJsonValueObject>(OutObject);\n\t\t}\n\n\t\t// Invalid\n\t\treturn MakeShared<FJsonValueNull>();\n\t}\n\n\t// UObject\n\tif (const auto* ObjectProperty = FNYReflectionHelper::CastProperty<FNYObjectProperty>(Property))\n\t{\n\t\tauto returnNullptr = [this, &ObjectProperty]() -> TSharedPtr<FJsonValue>\n\t\t{\n\t\t\t// Save reference as empty string\n\t\t\tif (CanSaveAsReference(ObjectProperty, nullptr))\n\t\t\t{\n\t\t\t\treturn MakeShared<FJsonValueString>(TEXT(\"\"));\n\t\t\t}\n\n\t\t\treturn MakeShared<FJsonValueNull>();\n\t\t};\n\n\t\t// NOTE: The ValuePtr here should be a pointer to a pointer\n\t\t// Because the UObjects are pointers, we must deference it. So instead of it being a void** we want it to be a void*\n\t\tconst UObject* ObjectPtr = ObjectProperty->GetObjectPropertyValue_InContainer(ValuePtr);\n\n\t\t// To find out if in nested containers the object is nullptr we must go a level up\n\t\tconst UObject* ContainerObjectPtr = ObjectProperty->GetObjectPropertyValue_InContainer(ContainerPtr);\n\t\tif (ObjectPtr == nullptr || ContainerObjectPtr == nullptr)\n\t\t{\n\t\t\t// We can have nullptrs\n\t\t\tif (bLogVerbose)\n\t\t\t{\n\t\t\t\tUE_LOG(\n\t\t\t\t\tLogDlgJsonWriter,\n\t\t\t\t\tVerbose,\n\t\t\t\t\tTEXT(\"Property = `%s` Is a FNYObjectProperty but got null from ContainerPtrToValuePtr from it's StructObject (NOTE: UObjects can be nullptrs)\"),\n\t\t\t\t\t*Property->GetPathName()\n\t\t\t\t);\n\t\t\t}\n\t\t\treturn returnNullptr();\n\t\t}\n\t\tif (!ObjectPtr->IsValidLowLevelFast())\n\t\t{\n\t\t\t// Memory corruption?\n\t\t\tUE_LOG(\n\t\t\t\tLogDlgJsonWriter,\n\t\t\t\tError,\n\t\t\t\tTEXT(\"ObjectPtr.IsValidLowLevelFast is false for Property = `%s`. Memory corruption for UObjects?\"),\n\t\t\t\t*Property->GetPathName()\n\t\t\t);\n\t\t\treturn returnNullptr();\n\t\t}\n\n\t\t// Special case were we want just to save a reference to the object location\n\t\tif (ObjectPtr != nullptr && CanSaveAsReference(ObjectProperty, ObjectPtr))\n\t\t{\n\t\t\treturn MakeShared<FJsonValueString>(ObjectPtr->GetPathName());\n\t\t}\n\n\t\t// Save as normal JSON Object\n\t\tTSharedRef<FJsonObject> OutObject = MakeShared<FJsonObject>();\n\t\tAddIndexMetadata(OutObject);\n\n\t\t// Set the uproperties of the object\n\t\tconst UClass* ObjectClass = ObjectProperty->PropertyClass;\n\t\tif (UStructToJsonObject(ObjectClass, ObjectPtr, OutObject))\n\t\t{\n\t\t\treturn MakeShared<FJsonValueObject>(OutObject);\n\t\t}\n\n\t\t// Invalid\n\t\treturn MakeShared<FJsonValueNull>();\n\t}\n\n\t// Default, convert to string\n\tFString ValueString;\n\tProperty->ExportTextItem(ValueString, ValuePtr, ValuePtr, nullptr, PPF_None);\n\treturn MakeShared<FJsonValueString>(ValueString);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nTSharedPtr<FJsonValue> FDlgJsonWriter::PropertyToJsonValue(const FNYProperty* Property, const void* const ContainerPtr, const void* const ValuePtr)\n{\n\tcheck(Property);\n\tif (bLogVerbose)\n\t{\n\t\tUE_LOG(LogDlgJsonWriter, Verbose, TEXT(\"PropertyToJsonValue, Property = `%s`\"), *Property->GetPathName());\n\t}\n\n\tif (ContainerPtr == nullptr || ValuePtr == nullptr)\n\t{\n\t\tconst auto* PropertyClass = Property->GetClass();\n\t\tif (Property->IsA<FNYObjectProperty>())\n\t\t{\n\t\t\t// Object property, can be nullptr\n\t\t\tif (bLogVerbose)\n\t\t\t{\n\t\t\t\tUE_LOG(\n\t\t\t\t\tLogDlgJsonWriter,\n\t\t\t\t\tVerbose,\n\t\t\t\t\tTEXT(\"UStructToJsonObject - Unhandled property type Class = '%s', Name = `%s`. (NOTE: UObjects can be nullptrs)\"),\n\t\t\t\t\t*PropertyClass->GetName(), *Property->GetPathName()\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tUE_LOG(\n\t\t\t\tLogDlgJsonWriter,\n\t\t\t\tError,\n\t\t\t\tTEXT(\"UStructToJsonObject - Unhandled property type Class = '%s', Name = `%s`\"),\n\t\t\t\t*PropertyClass->GetName(), *Property->GetNameCPP()\n\t\t\t);\n\t\t}\n\n\t\treturn MakeShared<FJsonValueNull>();\n\t}\n\n\t// Scalar Only one property\n\tif (Property->ArrayDim == 1)\n\t{\n\t\treturn ConvertScalarPropertyToJsonValue(Property, ContainerPtr, ValuePtr);\n\t}\n\n\t// Array\n\t// NOTE: we can't use here ArrayHelper, because then we might also need to use SetHelper, more code, meh\n\tTArray<TSharedPtr<FJsonValue>> Array;\n\tauto* ValueIntPtr = static_cast<const uint8*>(ValuePtr);\n\tfor (int Index = 0; Index < Property->ArrayDim; Index++)\n\t{\n\t\tIndexInArray = Index;\n\n\t\t// ValuePtr + Index * Property->ElementSize is literally FScriptArrayHelper::GetRawPtr\n\t\tconst TSharedPtr<FJsonValue> JsonValue = ConvertScalarPropertyToJsonValue(Property, ContainerPtr, ValueIntPtr + Index * Property->ElementSize);\n\t\tif (JsonValue.IsValid())\n\t\t{\n\t\t\tArray.Add(JsonValue);\n\t\t}\n\t}\n\n\tResetState();\n\treturn MakeShared<FJsonValueArray>(Array);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool FDlgJsonWriter::UStructToJsonAttributes(const UStruct* StructDefinition, const void* const ContainerPtr, TMap<FString, TSharedPtr<FJsonValue>>& OutJsonAttributes)\n{\n\tif (StructDefinition == nullptr || ContainerPtr == nullptr)\n\t{\n\t\treturn false;\n\t}\n\tif (bLogVerbose)\n\t{\n\t\tUE_LOG(LogDlgJsonWriter, Verbose, TEXT(\"UStructToJsonAttributes, StructDefinition = `%s`\"), *StructDefinition->GetPathName());\n\t}\n\n\t// Json Wrapper, already have an Object\n\tif (StructDefinition == FJsonObjectWrapper::StaticStruct())\n\t{\n\t\t// Just copy it into the object\n\t\tconst FJsonObjectWrapper* ProxyObject = static_cast<const FJsonObjectWrapper*>(ContainerPtr);\n\t\tif (ProxyObject->JsonObject.IsValid())\n\t\t{\n\t\t\tOutJsonAttributes = ProxyObject->JsonObject->Values;\n\t\t}\n\n\t\treturn true;\n\t}\n\n\t// Handle UObject inheritance (children of class)\n\tif (StructDefinition->IsA<UClass>())\n\t{\n\t\tconst UObject* UnrealObject = static_cast<const UObject*>(ContainerPtr);\n\t\tif (!UnrealObject->IsValidLowLevelFast())\n\t\t{\n\t\t\tUE_LOG(\n\t\t\t\tLogDlgJsonWriter,\n\t\t\t\tError,\n\t\t\t\tTEXT(\"UStructToJsonObject: StructDefinition = `%s` is a UClass and expected ContainerPtr to be an UObject. Memory corruption?\"),\n\t\t\t\t*StructDefinition->GetPathName()\n\t\t\t);\n\t\t\treturn false;\n\t\t}\n\n\t\t// Write type, Objects because they can have inheritance\n\t\tOutJsonAttributes.Add(TEXT(\"__type__\"), MakeShared<FJsonValueString>(UnrealObject->GetClass()->GetName()));\n\n\t\t// Structure points to the child\n\t\tStructDefinition = UnrealObject->GetClass();\n\t}\n\tif (!StructDefinition->IsValidLowLevelFast())\n\t{\n\t\tUE_LOG(\n\t\t\tLogDlgJsonWriter,\n\t\t\tError,\n\t\t\tTEXT(\"UStructToJsonObject: StructDefinition = `%s` is a UClass and expected ContainerPtr.Class to be valid. Memory corruption?\"),\n\t\t\t*StructDefinition->GetPathName()\n\t\t);\n\t\treturn false;\n\t}\n\n\t// Iterate over all the properties of the struct\n\tfor (TFieldIterator<const FNYProperty> It(StructDefinition); It; ++It)\n\t{\n\t\tconst auto* Property = *It;\n\t\tif (!ensure(Property))\n\t\t\tcontinue;\n\n\t\t// Check to see if we should ignore this property\n\t\tif (CheckFlags != 0 && !Property->HasAnyPropertyFlags(CheckFlags))\n\t\t{\n\t\t\t// Property does not have the required Flags\n\t\t\tif (bLogVerbose)\n\t\t\t{\n\t\t\t\tUE_LOG(LogDlgJsonWriter, Verbose, TEXT(\"Property = `%s` Does not have the required CheckFlags\"), *Property->GetPathName());\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\t\tif (CanSkipProperty(Property))\n\t\t{\n\t\t\t// Mark as skipped.\n\t\t\tif (bLogVerbose)\n\t\t\t{\n\t\t\t\tUE_LOG(LogDlgJsonWriter, Verbose, TEXT(\"Property = `%s` Marked as skiped\"), *Property->GetPathName());\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Get the Pointer to the Value\n\t\tconst void* ValuePtr = nullptr;\n\t\tif (Property->IsA<FNYObjectProperty>())\n\t\t{\n\t\t\t// Handle pointers, only allowed to be UObjects (are already pointers to the Value)\n\t\t\tValuePtr = ContainerPtr;\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// Normal non pointer property\n\t\t\tValuePtr = Property->ContainerPtrToValuePtr<void>(ContainerPtr, 0);\n\t\t}\n\n\t\t// convert the property to a FJsonValue\n\t\tconst TSharedPtr<FJsonValue> JsonValue = PropertyToJsonValue(Property, ContainerPtr, ValuePtr);\n\t\tif (!JsonValue.IsValid())\n\t\t{\n\t\t\tconst auto* PropertyClass = Property->GetClass();\n\t\t\tif (Property->IsA<FNYObjectProperty>())\n\t\t\t{\n\t\t\t\t// Object property, can be nullptr\n\t\t\t\tif (bLogVerbose)\n\t\t\t\t{\n\t\t\t\t\tUE_LOG(\n\t\t\t\t\t\tLogDlgJsonWriter,\n\t\t\t\t\t\tVerbose,\n\t\t\t\t\t\tTEXT(\"UStructToJsonObject - Unhandled property, Class = `%s`, Name =`%s`, inside Struct = `%s`. (NOTE: UObjects can be nullptrs)\"),\n\t\t\t\t\t\t*PropertyClass->GetName(), *Property->GetPathName(), *StructDefinition->GetPathName()\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tUE_LOG(\n\t\t\t\t\tLogDlgJsonWriter,\n\t\t\t\t\tWarning,\n\t\t\t\t\tTEXT(\"UStructToJsonObject - Unhandled property, Class = `%s`, Name =`%s`, inside Struct = `%s`\"),\n\t\t\t\t\t*PropertyClass->GetName(), *Property->GetPathName(), *StructDefinition->GetPathName()\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tcontinue;\n\t\t}\n\n\t\t// set the value on the output object\n\t\t// NOTE default JSON writer makes the first letter to be lowercase, we do not want that ;) FJsonObjectConverter::StandardizeCase\n\t\tconst FString VariableName = Property->GetName();\n\t\tOutJsonAttributes.Add(VariableName, JsonValue);\n\t}\n\n\treturn true;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\ntemplate<class CharType, class PrintPolicy>\nbool UStructToJsonStringInternal(const TSharedRef<FJsonObject>& JsonObject, const int32 InitialIndent, FString& OutJsonString)\n{\n\tTSharedRef<TJsonWriter<CharType, PrintPolicy>> JsonWriter =\n\t\t\tTJsonWriterFactory<CharType, PrintPolicy>::Create(&OutJsonString, InitialIndent);\n\tconst bool bSuccess = FJsonSerializer::Serialize(JsonObject, JsonWriter);\n\tJsonWriter->Close();\n\treturn bSuccess;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool FDlgJsonWriter::UStructToJsonString(const UStruct* StructDefinition, const void* const ContainerPtr,\n\t const DlgJsonWriterOptions& Options, FString& OutJsonString)\n{\n\tTSharedRef<FJsonObject> JsonObject = MakeShared<FJsonObject>();\n\tif (UStructToJsonObject(StructDefinition, ContainerPtr, JsonObject))\n\t{\n\t\tbool bSuccess;\n\t\tif (Options.bPrettyPrint)\n\t\t{\n\t\t\tbSuccess = UStructToJsonStringInternal<TCHAR, TPrettyJsonPrintPolicy<TCHAR>>(JsonObject, Options.InitialIndent, OutJsonString);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tbSuccess = UStructToJsonStringInternal<TCHAR, TCondensedJsonPrintPolicy<TCHAR>>(JsonObject, Options.InitialIndent, OutJsonString);\n\t\t}\n\n\t\tif (bSuccess)\n\t\t{\n\t\t\treturn true;\n\t\t}\n\t}\n\n\tUE_LOG(LogDlgJsonWriter, Error, TEXT(\"UStructToJsonObjectString - Unable to write out json\"));\n\treturn false;\n}\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystem/Private/Logging/DlgLogger.cpp",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#include \"Logging/DlgLogger.h\"\n#include \"DlgConstants.h\"\n#include \"DlgSystemModule.h\"\n#include \"DlgSystemSettings.h\"\n\n#define LOCTEXT_NAMESPACE \"DlgLogger\"\n\nstatic const FName MESSAGE_LOG_NAME{TEXT(\"Dialogue Plugin\")};\n\nFDlgLogger::FDlgLogger() : Super()\n{\n\tstatic constexpr bool bOwnMessageLogMirrorToOutputLog = true;\n\tEnableMessageLog(bOwnMessageLogMirrorToOutputLog);\n\tSetMessageLogMirrorToOutputLog(true);\n\n\tDisableOutputLog();\n\tDisableOnScreen();\n\tDisableClientConsole();\n\n\t// We mirror everything to the output log so that is why we disabled the output log above\n\tSetOutputLogCategory(LogDlgSystem);\n\tSetMessageLogName(MESSAGE_LOG_NAME, false);\n\tSetMessageLogOpenOnNewMessage(true);\n\tSetRedirectMessageLogLevelsHigherThan(ENYLoggerLogLevel::Warning);\n\tSetOpenMessageLogLevelsHigherThan(ENYLoggerLogLevel::NoLogging);\n}\n\nFDlgLogger& FDlgLogger::SyncWithSettings()\n{\n\tconst UDlgSystemSettings* Settings = GetDefault<UDlgSystemSettings>();\n\n\tUseMessageLog(Settings->bEnableMessageLog);\n\tSetMessageLogMirrorToOutputLog(Settings->bMessageLogMirrorToOutputLog);\n\tUseOutputLog(Settings->bEnableOutputLog);\n\tSetRedirectMessageLogLevelsHigherThan(Settings->RedirectMessageLogLevelsHigherThan);\n\tSetOpenMessageLogLevelsHigherThan(Settings->OpenMessageLogLevelsHigherThan);\n\tSetMessageLogOpenOnNewMessage(Settings->bMessageLogOpen);\n\n\treturn *this;\n}\n\nvoid FDlgLogger::OnStart()\n{\n\tMessageLogRegisterLogName(MESSAGE_LOG_NAME, LOCTEXT(\"dlg_key\", \"Dialogue System Plugin\"));\n\tGet().SyncWithSettings();\n}\n\nvoid FDlgLogger::OnShutdown()\n{\n\tMessageLogUnregisterLogName(MESSAGE_LOG_NAME);\n}\n\n#undef  LOCTEXT_NAMESPACE\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystem/Private/Logging/INYLogger.cpp",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#include \"Logging/INYLogger.h\"\n#include \"CoreGlobals.h\"\n#include \"Misc/OutputDevice.h\"\n#include \"Misc/UObjectToken.h\"\n#include \"Misc/FeedbackContext.h\"\n#include \"GameFramework/PlayerController.h\"\n#include \"Engine/Engine.h\"\n#include \"Logging/MessageLog.h\"\n\n#if WITH_UNREAL_DEVELOPER_TOOLS\n#include \"MessageLogInitializationOptions.h\"\n#include \"MessageLogModule.h\"\n#endif // WITH_UNREAL_DEVELOPER_TOOLS\n\n#include \"Modules/ModuleManager.h\"\n\n#if ENGINE_MINOR_VERSION >= 24\n\t#define NY_ARRAY_COUNT UE_ARRAY_COUNT\n#else\n\t#define NY_ARRAY_COUNT ARRAY_COUNT\n#endif\n\n\n// Pulled the two FOutputDevice::Logf functions into shared code. Needs to be a #define\n// since it uses GET_VARARGS_RESULT which uses the va_list stuff which operates on the\n// current function, so we can't easily call a function\n#define NY_GROWABLE_LOGF(SerializeFunc) \\\n\tint32\tBufferSize\t= 1024; \\\n\tTCHAR*\tBuffer\t\t= NULL; \\\n\tint32\tResult\t\t= -1; \\\n\t/* allocate some stack space to use on the first pass, which matches most strings */ \\\n\tTCHAR\tStackBuffer[512]; \\\n\tTCHAR*\tAllocatedBuffer = NULL; \\\n\\\n\t/* first, try using the stack buffer */ \\\n\tBuffer = StackBuffer; \\\n\tGET_VARARGS_RESULT( Buffer, NY_ARRAY_COUNT(StackBuffer), NY_ARRAY_COUNT(StackBuffer) - 1, Fmt, Fmt, Result ); \\\n\\\n\t/* if that fails, then use heap allocation to make enough space */ \\\n\twhile(Result == -1) \\\n\t{ \\\n\t\tFMemory::SystemFree(AllocatedBuffer); \\\n\t\t/* We need to use malloc here directly as GMalloc might not be safe. */ \\\n\t\tBuffer = AllocatedBuffer = (TCHAR*) FMemory::SystemMalloc( BufferSize * sizeof(TCHAR) ); \\\n\t\tGET_VARARGS_RESULT( Buffer, BufferSize, BufferSize-1, Fmt, Fmt, Result ); \\\n\t\tBufferSize *= 2; \\\n\t}; \\\n\tBuffer[Result] = 0; \\\n\t; \\\n\\\n\tSerializeFunc; \\\n\tFMemory::SystemFree(AllocatedBuffer);\n\n\nINYLogger& INYLogger::SetClientConsolePlayerController(APlayerController* PC)\n{\n\tPlayerController = PC;\n\treturn *this;\n}\n\nFOutputDevice* INYLogger::GetOutputDeviceFromLogLevel(ENYLoggerLogLevel Level)\n{\n#if NO_LOGGING\n\treturn nullptr;\n#endif\n\n\tswitch (Level)\n\t{\n\tcase ENYLoggerLogLevel::NoLogging:\n\t\treturn nullptr;\n\n\tcase ENYLoggerLogLevel::Error:\n\tcase ENYLoggerLogLevel::Warning:\n\t\treturn GWarn;\n\n\tdefault:\n\t\treturn GLog;\n\t}\n}\n\n#if WITH_UNREAL_DEVELOPER_TOOLS\nFMessageLogModule* INYLogger::GetMessageLogModule()\n{\n\treturn FModuleManager::LoadModulePtr<FMessageLogModule>(\"MessageLog\");\n}\n#endif // WITH_UNREAL_DEVELOPER_TOOLS\n\nbool INYLogger::IsMessageLogNameRegistered(FName LogName)\n{\n#if WITH_UNREAL_DEVELOPER_TOOLS\n\tFMessageLogModule* MessageLogModule = GetMessageLogModule();\n\tif (!MessageLogModule)\n\t{\n\t\treturn false;\n\t}\n\n\treturn MessageLogModule->IsRegisteredLogListing(LogName);\n#else\n\treturn false;\n#endif // WITH_UNREAL_DEVELOPER_TOOLS\n}\n\nvoid INYLogger::MessageLogRegisterLogName(FName LogName, const FText& LogLabel, const FNYMessageLogInitializationOptions& InitOptions)\n{\n#if WITH_UNREAL_DEVELOPER_TOOLS\n\tFMessageLogModule* MessageLogModule = GetMessageLogModule();\n\tif (!MessageLogModule)\n\t{\n\t\treturn;\n\t}\n\n\tFMessageLogInitializationOptions UnrealInitOptions;\n\tUnrealInitOptions.bShowFilters = InitOptions.bShowFilters;\n\tUnrealInitOptions.bShowPages = InitOptions.bShowPages;\n\tUnrealInitOptions.bAllowClear = InitOptions.bAllowClear;\n\tUnrealInitOptions.bDiscardDuplicates = InitOptions.bDiscardDuplicates;\n\tUnrealInitOptions.MaxPageCount = InitOptions.MaxPageCount;\n\tUnrealInitOptions.bShowInLogWindow = InitOptions.bShowInLogWindow;\n\n\tMessageLogModule->RegisterLogListing(LogName, LogLabel, UnrealInitOptions);\n#endif // WITH_UNREAL_DEVELOPER_TOOLS\n}\n\nbool INYLogger::MessageLogUnregisterLogName(FName LogName)\n{\n#if WITH_UNREAL_DEVELOPER_TOOLS\n\tFMessageLogModule* MessageLogModule = GetMessageLogModule();\n\tif (!MessageLogModule)\n\t{\n\t\treturn false;\n\t}\n\n\treturn MessageLogModule->UnregisterLogListing(LogName);\n#else\n\treturn false;\n#endif // WITH_UNREAL_DEVELOPER_TOOLS\n}\n\n#if WITH_UNREAL_DEVELOPER_TOOLS\nTSharedPtr<IMessageLogListing> INYLogger::MessageLogGetLogNameListing(FName LogName)\n{\n\tFMessageLogModule* MessageLogModule = GetMessageLogModule();\n\tif (!MessageLogModule)\n\t{\n\t\treturn nullptr;\n\t}\n\n\treturn MessageLogModule->GetLogListing(LogName);\n}\n#endif // WITH_UNREAL_DEVELOPER_TOOLS\n\nvoid INYLogger::MessageLogOpenLogName(FName LogName)\n{\n#if WITH_UNREAL_DEVELOPER_TOOLS\n\tFMessageLogModule* MessageLogModule = GetMessageLogModule();\n\tif (!MessageLogModule)\n\t{\n\t\treturn;\n\t}\n\n\tMessageLogModule->OpenMessageLog(LogName);\n#endif // WITH_UNREAL_DEVELOPER_TOOLS\n}\n\nvoid INYLogger::LogfImplementation(ENYLoggerLogLevel Level, const TCHAR* Fmt, ...)\n{\n#if !NO_LOGGING\n\tNY_GROWABLE_LOGF(Log(Level, Buffer))\n#endif // !NO_LOGGING\n}\n\n// void INYLogger::Fatal(const ANSICHAR* File, int32 Line, const FString& Message)\n// {\n// #if NO_LOGGING\n// \tLowLevelFatalErrorHandler(File, Line, *Message);\n// \t_DebugBreakAndPromptForRemote();\n// \tFDebug::AssertFailed(\"\", File, Line, *Message);\n// #else\n// \tLowLevelFatalErrorHandler(File, Line, *Message);\n// \t_DebugBreakAndPromptForRemote();\n// \tFDebug::AssertFailed(\"\", File, Line, *Message);\n// #endif // NO_LOGGING\n// }\n\nvoid INYLogger::Log(ENYLoggerLogLevel Level, const FString& Message)\n{\n\t// Should not happen but just in case redirect to the fatal function\n\t// if (Level == ENYLoggerLogLevel::Fatal)\n\t// {\n\t// \tFatal(__FILE__, __LINE__, Message);\n\t// \treturn;\n\t// }\n\n\t// No logging, abort\n#if !NO_LOGGING\n\tif (IsClientConsoleEnabled())\n\t{\n\t\tLogClientConsole(Level, Message);\n\t}\n\tif (IsOnScreenEnabled())\n\t{\n\t\tLogScreen(Level, Message);\n\t}\n\tif (IsOutputLogEnabled())\n\t{\n\t\tLogOutputLog(Level, Message);\n\t}\n\tif (IsMessageLogEnabled())\n\t{\n\t\tLogMessageLog(Level, Message);\n\t}\n#endif // !NO_LOGGING\n}\n\nvoid INYLogger::LogScreen(ENYLoggerLogLevel Level, const FString& Message)\n{\n\tif (!GEngine)\n\t{\n\t\treturn;\n\t}\n\n\tconst bool bPreviousValue = AreAllOnScreenMessagesEnabled();\n\tif (bForceEnableScreenMessages)\n\t{\n\t\tEnableAllOnScreenMessages();\n\t}\n\n\tconst uint64 Key = INDEX_NONE;\n\tconst FColor Color = GetColorForLogLevel(Level);\n\tGEngine->AddOnScreenDebugMessage(Key, ScreenLogDisplayTimeSeconds, Color, Message, bScreenNewerOnTop, ScreenTextScale);\n\n\tif (bForceEnableScreenMessages)\n\t{\n\t\tSetAreAllOnScreenMessagesEnabled(bPreviousValue);\n\t}\n}\n\nvoid INYLogger::LogClientConsole(ENYLoggerLogLevel Level, const FString& Message)\n{\n\tif (!IsValid(PlayerController) || !PlayerController->IsValidLowLevelFast())\n\t{\n\t\treturn;\n\t}\n\n\t// These arguments seem to not be used\n\tconst FName Type = NAME_None;\n\tconst float LifetimeSeconds = 0.f;\n\tPlayerController->ClientMessage(Message, Type, LifetimeSeconds);\n}\n\nvoid INYLogger::LogMessageLog(ENYLoggerLogLevel Level, const FString& Message)\n{\n\t// Should we be redirecting this message log because\n\tif (RedirectMessageLogLevelsHigherThan != ENYLoggerLogLevel::NoLogging &&\n\t\tLevel > RedirectMessageLogLevelsHigherThan)\n\t{\n\t\t// Redirect to the output log if not enabled\n\t\tif (!IsOutputLogEnabled())\n\t\t{\n\t\t\tLogOutputLog(Level, Message);\n\t\t}\n\t\treturn;\n\t}\n\n\t// TSharedRef<FTokenizedMessage> NewMessage = FTokenizedMessage::Create(Severity);\n\tconst EMessageSeverity::Type Severity = GetMessageSeverityForLogLevel(Level);\n\tauto MessageLog = FMessageLog(MessageLogName);\n\tMessageLog.SuppressLoggingToOutputLog(!bMessageLogMirrorToOutputLog);\n\tMessageLog.Message(Severity, FText::FromString(Message));\n\n\t// Open message log\n\tif (bMessageLogOpen && Level > OpenMessageLogLevelsHigherThan)\n\t{\n\t\tMessageLog.Open(Severity, false);\n\t}\n}\n\nvoid INYLogger::LogOutputLog(ENYLoggerLogLevel Level, const FString& Message)\n{\n\tFOutputDevice* LogDevice = GetOutputDeviceFromLogLevel(Level);\n\tif (!LogDevice)\n\t{\n\t\treturn;\n\t}\n\n\tconst ELogVerbosity::Type UnrealLogType = GetUnrealLogTypeForLogLevel(Level);\n\tLogDevice->Log(OutputLogCategory, UnrealLogType, Message);\n}\n\n\nvoid INYLogger::ClearAllOnScreenLogs()\n{\n\tif (!GEngine)\n\t{\n\t\treturn;\n\t}\n\n\tGEngine->ClearOnScreenDebugMessages();\n}\n\n#undef NY_ARRAY_COUNT\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystem/Private/Nodes/DlgNode.cpp",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#include \"Nodes/DlgNode.h\"\n\n#include \"Kismet/GameplayStatics.h\"\n#include \"EngineUtils.h\"\n\n#include \"DlgContext.h\"\n#include \"Logging/DlgLogger.h\"\n#include \"DlgLocalizationHelper.h\"\n#include \"DlgDialogueParticipant.h\"\n#include \"Sound/SoundWave.h\"\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// Begin UObject interface\nvoid UDlgNode::Serialize(FArchive& Ar)\n{\n\tSuper::Serialize(Ar);\n\tif (Ar.UE4Ver() >= VER_UE4_COOKED_ASSETS_IN_EDITOR_SUPPORT)\n\t{\n\t\t// NOTE: This modifies the Archive\n\t\t// DO NOT REMOVE THIS\n\t\tconst FStripDataFlags StripFlags(Ar);\n\n\t\t// Only in editor, add the graph node\n#if WITH_EDITOR\n\t\tif (!StripFlags.IsEditorDataStripped())\n\t\t{\n\t\t\tAr << GraphNode;\n\t\t}\n#endif // WITH_EDITOR\n\t}\n\telse\n\t{\n\t\t// Super old version, is this possible?\n#if WITH_EDITOR\n\t\tAr << GraphNode;\n#endif // WITH_EDITOR\n\t}\n}\n\nvoid UDlgNode::AddReferencedObjects(UObject* InThis, FReferenceCollector& Collector)\n{\n\tUDlgNode* This = CastChecked<UDlgNode>(InThis);\n\n\t// Add the GraphNode to the referenced objects\n#if WITH_EDITOR\n\tCollector.AddReferencedObject(This->GraphNode, This);\n#endif\n\n\tSuper::AddReferencedObjects(InThis, Collector);\n}\n\nvoid UDlgNode::PostLoad()\n{\n\tSuper::PostLoad();\n\n\t// NOTE: We don't this here but instead we do it in the compile phase\n\t// Create thew new GUID\n\t// if (!HasGUID())\n\t// {\n\t// \tRegenerateGUID();\n\t// }\n}\n\nvoid UDlgNode::PostInitProperties()\n{\n\tSuper::PostInitProperties();\n\n\t// Ignore these cases\n\tif (HasAnyFlags(RF_ClassDefaultObject | RF_NeedLoad))\n\t{\n\t\treturn;\n\t}\n\n\t// GUID is set in the dialogue compile phase\n}\n\nvoid UDlgNode::PostDuplicate(bool bDuplicateForPIE)\n{\n\tSuper::PostDuplicate(bDuplicateForPIE);\n\n\t// Used when duplicating Nodes.\n\t// We only generate a new GUID is the existing one is valid, otherwise it will be set in the compile phase\n\tif (HasGUID())\n\t{\n\t\tRegenerateGUID();\n\t}\n}\n\nvoid UDlgNode::PostEditImport()\n{\n\tSuper::PostEditImport();\n\n\t// Used when duplicating Nodes.\n\t// We only generate a new GUID is the existing one is valid, otherwise it will be set in the compile phase\n\tif (HasGUID())\n\t{\n\t\tRegenerateGUID();\n\t}\n}\n\n#if WITH_EDITOR\nvoid UDlgNode::PostEditChangeProperty(FPropertyChangedEvent& PropertyChangedEvent)\n{\n\tSuper::PostEditChangeProperty(PropertyChangedEvent);\n\n\t// Signal to the listeners\n\tOnDialogueNodePropertyChanged.Broadcast(PropertyChangedEvent, BroadcastPropertyEdgeIndexChanged);\n\tBroadcastPropertyEdgeIndexChanged = INDEX_NONE;\n}\n\nvoid UDlgNode::PostEditChangeChainProperty(struct FPropertyChangedChainEvent& PropertyChangedEvent)\n{\n\t// The Super::PostEditChangeChainProperty will construct a new FPropertyChangedEvent that will only have the Property and the\n\t// MemberProperty name and it will call the PostEditChangeProperty, so we must get the array index of the Nodes modified from here.\n\t// If you want to preserve all the change history of the tree you must broadcast the event from here to the children, but be warned\n\t// that Property and MemberProperty are not set properly.\n\tBroadcastPropertyEdgeIndexChanged = PropertyChangedEvent.GetArrayIndex(GET_MEMBER_NAME_STRING_CHECKED(UDlgNode, Children));\n\tSuper::PostEditChangeChainProperty(PropertyChangedEvent);\n}\n\n\n#endif //WITH_EDITOR\n// End UObject interface\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// Begin own function\nbool UDlgNode::HandleNodeEnter(UDlgContext& Context, TSet<const UDlgNode*> NodesEnteredWithThisStep)\n{\n\t// Fire all the node enter events\n\tFireNodeEnterEvents(Context);\n\n\tfor (FDlgEdge& Edge : Children)\n\t{\n\t\tEdge.RebuildConstructedText(Context, OwnerName);\n\t}\n\n\treturn ReevaluateChildren(Context, {});\n}\n\nvoid UDlgNode::FireNodeEnterEvents(UDlgContext& Context)\n{\n\tfor (const FDlgEvent& Event : EnterEvents)\n\t{\n\t\t// Get Participant from either event or parent\n\t\tUObject* Participant = Context.GetMutableParticipant(Event.ParticipantName);\n\t\tif (!IsValid(Participant))\n\t\t{\n\t\t\tParticipant = Context.GetMutableParticipant(OwnerName);\n\t\t}\n\n\t\tEvent.Call(Context, TEXT(\"FireNodeEnterEvents\"), Participant);\n\t}\n}\n\nbool UDlgNode::ReevaluateChildren(UDlgContext& Context, TSet<const UDlgNode*> AlreadyEvaluated)\n{\n\tTArray<FDlgEdge>& AvailableOptions = Context.GetMutableOptionsArray();\n\tTArray<FDlgEdgeData>& AllOptions = Context.GetAllMutableOptionsArray();\n\tAvailableOptions.Empty();\n\tAllOptions.Empty();\n\n\tfor (const FDlgEdge& Edge : Children)\n\t{\n\t\tconst bool bSatisfied = Edge.Evaluate(Context, { this });\n\n\t\tif (bSatisfied || Edge.bIncludeInAllOptionListIfUnsatisfied)\n\t\t{\n\t\t\tAllOptions.Add(FDlgEdgeData{ bSatisfied, Edge });\n\t\t}\n\t\tif (bSatisfied)\n\t\t{\n\t\t\tAvailableOptions.Add(Edge);\n\t\t}\n\t}\n\n\t// no child, but no end node?\n\tif (AvailableOptions.Num() == 0)\n\t{\n\t\tFDlgLogger::Get().Errorf(\n\t\t\tTEXT(\"ReevaluateChildren (ReevaluateOptions) - no valid child option for a NODE.\\nContext:\\n\\t%s\"),\n\t\t\t*Context.GetContextString()\n\t\t);\n\t\treturn false;\n\t}\n\n\treturn true;\n}\n\nbool UDlgNode::CheckNodeEnterConditions(const UDlgContext& Context, TSet<const UDlgNode*> AlreadyVisitedNodes) const\n{\n\tif (AlreadyVisitedNodes.Contains(this))\n\t{\n\t\treturn true;\n\t}\n\n\tAlreadyVisitedNodes.Add(this);\n\tif (!FDlgCondition::EvaluateArray(Context, EnterConditions, OwnerName))\n\t{\n\t\treturn false;\n\t}\n\tif (!bCheckChildrenOnEvaluation)\n\t{\n\t\treturn true;\n\t}\n\n\t// Has a valid child?\n\treturn HasAnySatisfiedChild(Context, AlreadyVisitedNodes);\n}\n\nbool UDlgNode::HasAnySatisfiedChild(const UDlgContext& Context, TSet<const UDlgNode*> AlreadyVisitedNodes) const\n{\n\tfor (const FDlgEdge& Edge : Children)\n\t{\n\t\t// Found at least one valid child\n\t\tif (Edge.Evaluate(Context, AlreadyVisitedNodes))\n\t\t{\n\t\t\treturn true;\n\t\t}\n\t}\n\n\treturn false;\n}\n\nbool UDlgNode::OptionSelected(int32 OptionIndex, UDlgContext& Context)\n{\n\tconst TArray<FDlgEdge>& AvailableOptions = Context.GetOptionsArray();\n\tif (AvailableOptions.IsValidIndex(OptionIndex))\n\t{\n\t\tcheck(AvailableOptions[OptionIndex].IsValid());\n\t\treturn Context.EnterNode(AvailableOptions[OptionIndex].TargetIndex, {});\n\t}\n\n\tFDlgLogger::Get().Errorf(\n\t\tTEXT(\"OptionSelected - Failed to choose OptionIndex = %d - it only has %d valid options.\\nContext:\\n\\t%s\"),\n\t\tOptionIndex, AvailableOptions.Num(), *Context.GetContextString()\n\t);\n\treturn false;\n}\n\nconst TArray<int32> UDlgNode::GetNodeOpenChildren_DEPRECATED() const\n{\n\tTArray<int32> OutArray;\n\tconst int32 EdgesNum = Children.Num();\n\tfor (int32 EdgeIndex = 0; EdgeIndex < EdgesNum; EdgeIndex++)\n\t{\n\t\tif (!Children[EdgeIndex].IsValid())\n\t\t{\n\t\t\tOutArray.Add(EdgeIndex);\n\t\t}\n\t}\n\n\treturn OutArray;\n}\n\nFDlgEdge* UDlgNode::GetMutableNodeChildForTargetIndex(int32 TargetIndex)\n{\n\tfor (FDlgEdge& Edge : Children)\n\t{\n\t\tif (Edge.TargetIndex == TargetIndex)\n\t\t{\n\t\t\treturn &Edge;\n\t\t}\n\t}\n\n\treturn nullptr;\n}\n\n\nvoid UDlgNode::UpdateTextsValuesFromDefaultsAndRemappings(\n\tconst UDlgSystemSettings& Settings, bool bEdges, bool bUpdateGraphNode\n)\n{\n\t// We only care about edges here\n\tif (bEdges)\n\t{\n\t\tconst bool bSkipAfterFirstChild = Settings.bSetDefaultEdgeTextOnFirstChildOnly;\n\t\tif (Settings.bSetDefaultEdgeTexts)\n\t\t{\n\t\t\tconst UDlgDialogue* Dialogue = GetDialogue();\n\t\t\tfor (FDlgEdge& Edge : Children)\n\t\t\t{\n\t\t\t\tEdge.UpdateTextValueFromDefaultAndRemapping(*Dialogue, *this, Settings, false);\n\n\t\t\t\t// Set only one, kill the rest\n\t\t\t\tif (bSkipAfterFirstChild)\n\t\t\t\t{\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Update the rest of the texts remapping\n\t\tfor (FDlgEdge& Edge : Children)\n\t\t{\n\t\t\tFDlgLocalizationHelper::UpdateTextFromRemapping(Settings, Edge.GetMutableUnformattedText());\n\t\t}\n\t}\n\n\tif (bUpdateGraphNode)\n\t{\n\t\tUpdateGraphNode();\n\t}\n}\n\nvoid UDlgNode::UpdateTextsNamespacesAndKeys(const UDlgSystemSettings& Settings, bool bEdges, bool bUpdateGraphNode)\n{\n\tif (bEdges)\n\t{\n\t\tUObject* Outer = GetOuter();\n\t\tfor (FDlgEdge& Edge : Children)\n\t\t{\n\t\t\tEdge.UpdateTextsNamespacesAndKeys(Outer, Settings);\n\t\t}\n\t}\n\n\tif (bUpdateGraphNode)\n\t{\n\t\tUpdateGraphNode();\n\t}\n}\n\nvoid UDlgNode::RebuildTextArguments(bool bEdges, bool bUpdateGraphNode)\n{\n\tif (bEdges)\n\t{\n\t\tfor (FDlgEdge& Edge : Children)\n\t\t{\n\t\t\tEdge.RebuildTextArguments();\n\t\t}\n\t}\n\n\tif (bUpdateGraphNode)\n\t{\n\t\tUpdateGraphNode();\n\t}\n}\n\nvoid UDlgNode::UpdateGraphNode()\n{\n#if WITH_EDITOR\n\tUDlgDialogue::GetDialogueEditorAccess()->UpdateGraphNodeEdges(GraphNode);\n#endif // WITH_EDITOR\n}\n\nvoid UDlgNode::GetAssociatedParticipants(TArray<FName>& OutArray) const\n{\n\tif (OwnerName != NAME_None)\n\t{\n\t\tOutArray.AddUnique(OwnerName);\n\t}\n}\n\nUDlgDialogue* UDlgNode::GetDialogue() const\n{\n\treturn CastChecked<UDlgDialogue>(GetOuter());\n}\n\nUSoundWave* UDlgNode::GetNodeVoiceSoundWave() const\n{\n\treturn Cast<USoundWave>(GetNodeVoiceSoundBase());\n}\n\n// End own functions\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystem/Private/Nodes/DlgNode_End.cpp",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#include \"Nodes/DlgNode_End.h\"\n\nFString UDlgNode_End::GetDesc()\n{\n\treturn TEXT(\"Node ending the Dialogue.\\nDoes not have text, if it is entered the Dialogue is over.\\nEvents and enter conditions are taken into account.\");\n}\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystem/Private/Nodes/DlgNode_Selector.cpp",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#include \"Nodes/DlgNode_Selector.h\"\n#include \"DlgConstants.h\"\n#include \"DlgContext.h\"\n#include \"Logging/DlgLogger.h\"\n\n\nbool UDlgNode_Selector::HandleNodeEnter(UDlgContext& Context, TSet<const UDlgNode*> NodesEnteredWithThisStep)\n{\n\tFireNodeEnterEvents(Context);\n\n\tif (NodesEnteredWithThisStep.Contains(this))\n\t{\n\t\tFDlgLogger::Get().Errorf(\n\t\t\tTEXT(\"SelectorNode::HandleNodeEnter - Failed to enter selector node, it was entered multiple times in a single step.\"\n\t\t\t\t\t\"Theoretically with some condition magic it could make sense, but chances are that it is an endless loop,\"\n\t\t\t\t\t\"thus entering the same selector twice with a single step is not supported. Dialogue is terminated.\\nContext:\\n\\t%s\"),\n\t\t\t*Context.GetContextString()\n\t\t);\n\n\t\treturn false;\n\t}\n\tNodesEnteredWithThisStep.Add(this);\n\n\tswitch (SelectorType)\n\t{\n\t\tcase EDlgNodeSelectorType::First:\n\t\t{\n\t\t\t// Find first child with satisfies conditions\n\t\t\tfor (const FDlgEdge& Edge : Children)\n\t\t\t\tif (Edge.Evaluate(Context, {this}))\n\t\t\t\t\treturn Context.EnterNode(Edge.TargetIndex, NodesEnteredWithThisStep);\n\n\t\t\tbreak;\n\t\t}\n\n\t\tcase EDlgNodeSelectorType::Random:\n\t\t{\n\t\t\t// Build the list of all valid children\n\t\t\tTArray<int32> Candidates;\n\t\t\tfor (int32 EdgeIndex = 0; EdgeIndex < Children.Num(); ++EdgeIndex)\n\t\t\t\tif (Children[EdgeIndex].Evaluate(Context, { this }))\n\t\t\t\t\tCandidates.Add(EdgeIndex);\n\n\t\t\t// No candidates :(\n\t\t\tif (Candidates.Num() == 0)\n\t\t\t\tbreak;\n\n\t\t\t// Select Random\n\t\t\tconst int32 SelectedIndex = FMath::RandHelper(Candidates.Num());\n\t\t\tconst int32 TargetNodeIndex = Children[Candidates[SelectedIndex]].TargetIndex;\n\t\t\treturn Context.EnterNode(TargetNodeIndex, NodesEnteredWithThisStep);\n\t\t}\n\n\t\tdefault:\n\t\t\tcheckNoEntry();\n\t}\n\n\tFDlgLogger::Get().Errorf(\n\t\tTEXT(\"HandleNodeEnter - selector node entered, no satisfied child.\\nContext:\\n\\t%s\"),\n\t\t*Context.GetContextString()\n\t);\n\treturn false;\n}\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystem/Private/Nodes/DlgNode_Speech.cpp",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#include \"Nodes/DlgNode_Speech.h\"\n\n#include \"DlgContext.h\"\n#include \"DlgConstants.h\"\n#include \"Logging/DlgLogger.h\"\n#include \"DlgLocalizationHelper.h\"\n\n#if WITH_EDITOR\nvoid UDlgNode_Speech::PostEditChangeProperty(FPropertyChangedEvent& PropertyChangedEvent)\n{\n\tSuper::PostEditChangeProperty(PropertyChangedEvent);\n\n\tconst FName PropertyName = PropertyChangedEvent.Property != nullptr ? PropertyChangedEvent.Property->GetFName() : NAME_None;\n\tconst bool bTextChanged = PropertyName == GetMemberNameText();\n\n\t// rebuild text arguments\n\tif (bTextChanged || PropertyName == GetMemberNameTextArguments())\n\t{\n\t\tRebuildTextArguments(true);\n\t}\n}\n\n#endif\n\nvoid UDlgNode_Speech::UpdateTextsValuesFromDefaultsAndRemappings(const UDlgSystemSettings& Settings, bool bEdges, bool bUpdateGraphNode)\n{\n\tFDlgLocalizationHelper::UpdateTextFromRemapping(Settings, Text);\n\tSuper::UpdateTextsValuesFromDefaultsAndRemappings(Settings, bEdges, bUpdateGraphNode);\n}\n\nvoid UDlgNode_Speech::UpdateTextsNamespacesAndKeys(const UDlgSystemSettings& Settings, bool bEdges, bool bUpdateGraphNode)\n{\n\tFDlgLocalizationHelper::UpdateTextNamespaceAndKey(GetOuter(), Settings, Text);\n\tSuper::UpdateTextsNamespacesAndKeys(Settings, bEdges, bUpdateGraphNode);\n}\n\nvoid UDlgNode_Speech::RebuildConstructedText(const UDlgContext& Context)\n{\n\tif (TextArguments.Num() <= 0)\n\t{\n\t\treturn;\n\t}\n\n\tFFormatNamedArguments OrderedArguments;\n\tfor (const FDlgTextArgument& DlgArgument : TextArguments)\n\t{\n\t\tOrderedArguments.Add(DlgArgument.DisplayString, DlgArgument.ConstructFormatArgumentValue(Context, OwnerName));\n\t}\n\tConstructedText = FText::AsCultureInvariant(FText::Format(Text, OrderedArguments));\n}\n\nbool UDlgNode_Speech::HandleNodeEnter(UDlgContext& Context, TSet<const UDlgNode*> NodesEnteredWithThisStep)\n{\n\tRebuildConstructedText(Context);\n\tconst bool bResult = Super::HandleNodeEnter(Context, NodesEnteredWithThisStep);\n\n\t// Handle virtual parent enter events for direct children\n\tif (bResult && bIsVirtualParent && Context.IsValidNodeIndex(VirtualParentFirstSatisfiedDirectChildIndex))\n\t{\n\t\t// Add to history\n\t\tContext.SetNodeVisited(\n\t\t\tVirtualParentFirstSatisfiedDirectChildIndex,\n\t\t\tContext.GetNodeGUIDForIndex(VirtualParentFirstSatisfiedDirectChildIndex)\n\t\t);\n\n\t\t// Fire all the direct child enter events\n\t\tif (bVirtualParentFireDirectChildEnterEvents)\n\t\t{\n\t\t\tif (UDlgNode* Node = Context.GetMutableNodeFromIndex(VirtualParentFirstSatisfiedDirectChildIndex))\n\t\t\t{\n\t\t\t\tNode->FireNodeEnterEvents(Context);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn bResult;\n}\n\nbool UDlgNode_Speech::ReevaluateChildren(UDlgContext& Context, TSet<const UDlgNode*> AlreadyEvaluated)\n{\n\tif (bIsVirtualParent)\n\t{\n\t\tVirtualParentFirstSatisfiedDirectChildIndex = INDEX_NONE;\n\t\tContext.GetMutableOptionsArray().Empty();\n\t\tContext.GetAllMutableOptionsArray().Empty();\n\n\t\t// stop endless loop\n\t\tif (AlreadyEvaluated.Contains(this))\n\t\t{\n\t\t\tFDlgLogger::Get().Errorf(\n\t\t\t\tTEXT(\"ReevaluateChildren - Endless loop detected, a virtual parent became his own parent! \"\n\t\t\t\t\t\"This is not supposed to happen, the dialogue is terminated.\\nContext:\\n\\t%s\"),\n\t\t\t\t*Context.GetContextString()\n\t\t\t);\n\t\t\treturn false;\n\t\t}\n\n\t\tAlreadyEvaluated.Add(this);\n\n\t\tfor (const FDlgEdge& Edge : Children)\n\t\t{\n\t\t\t// Find first satisfied child\n\t\t\tif (Edge.Evaluate(Context, { this }))\n\t\t\t{\n\t\t\t\tif (UDlgNode* Node = Context.GetMutableNodeFromIndex(Edge.TargetIndex))\n\t\t\t\t{\n\t\t\t\t\t// Get Grandchildren\n\t\t\t\t\tconst bool bResult = Node->ReevaluateChildren(Context, AlreadyEvaluated);\n\t\t\t\t\tif (bResult)\n\t\t\t\t\t{\n\t\t\t\t\t\tVirtualParentFirstSatisfiedDirectChildIndex = Edge.TargetIndex;\n\t\t\t\t\t}\n\t\t\t\t\treturn bResult;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t}\n\n\t// Normal speech node\n\treturn Super::ReevaluateChildren(Context, AlreadyEvaluated);\n}\n\n\nvoid UDlgNode_Speech::GetAssociatedParticipants(TArray<FName>& OutArray) const\n{\n\tSuper::GetAssociatedParticipants(OutArray);\n\tfor (const FDlgTextArgument& TextArgument : TextArguments)\n\t{\n\t\tif (TextArgument.ParticipantName != NAME_None)\n\t\t{\n\t\t\tOutArray.AddUnique(TextArgument.ParticipantName);\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystem/Private/Nodes/DlgNode_SpeechSequence.cpp",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#include \"Nodes/DlgNode_SpeechSequence.h\"\n#include \"DlgContext.h\"\n#include \"DlgLocalizationHelper.h\"\n\n\n#if WITH_EDITOR\nvoid UDlgNode_SpeechSequence::PostEditChangeProperty(FPropertyChangedEvent& PropertyChangedEvent)\n{\n\tSuper::PostEditChangeProperty(PropertyChangedEvent);\n\n\t// fill edges automatically based on input data\n\tAutoGenerateInnerEdges();\n}\n#endif\n\nvoid UDlgNode_SpeechSequence::UpdateTextsValuesFromDefaultsAndRemappings(const UDlgSystemSettings& Settings, bool bEdges, bool bUpdateGraphNode)\n{\n\tfor (FDlgSpeechSequenceEntry& Entry : SpeechSequence)\n\t{\n\t\t// We only care about edges here\n\t\tif (Settings.bSetDefaultEdgeTexts)\n\t\t{\n\t\t\t// Inner edges always point to a normal node and are always the unique edge child\n\t\t\tif (Entry.EdgeText.IsEmpty())\n\t\t\t{\n\t\t\t\tEntry.EdgeText = Settings.DefaultTextEdgeToNormalNode;\n\t\t\t}\n\t\t}\n\n\t\tFDlgLocalizationHelper::UpdateTextFromRemapping(Settings, Entry.Text);\n\t\tFDlgLocalizationHelper::UpdateTextFromRemapping(Settings, Entry.EdgeText);\n\t}\n\tSuper::UpdateTextsValuesFromDefaultsAndRemappings(Settings, bEdges, bUpdateGraphNode);\n}\n\nvoid UDlgNode_SpeechSequence::UpdateTextsNamespacesAndKeys(const UDlgSystemSettings& Settings, bool bEdges, bool bUpdateGraphNode)\n{\n\tUObject* Outer = GetOuter();\n\tif (!IsValid(Outer))\n\t{\n\t\treturn;\n\t}\n\n\tfor (FDlgSpeechSequenceEntry& Entry : SpeechSequence)\n\t{\n\t\tFDlgLocalizationHelper::UpdateTextNamespaceAndKey(Outer, Settings, Entry.Text);\n\t\tFDlgLocalizationHelper::UpdateTextNamespaceAndKey(Outer, Settings, Entry.EdgeText);\n\t}\n\n\tSuper::UpdateTextsNamespacesAndKeys(Settings, bEdges, bUpdateGraphNode);\n}\n\nbool UDlgNode_SpeechSequence::HandleNodeEnter(UDlgContext& Context, TSet<const UDlgNode*> NodesEnteredWithThisStep)\n{\n\tActualIndex = 0;\n\treturn Super::HandleNodeEnter(Context, NodesEnteredWithThisStep);\n}\n\nbool UDlgNode_SpeechSequence::ReevaluateChildren(UDlgContext& Context, TSet<const UDlgNode*> AlreadyEvaluated)\n{\n\tTArray<FDlgEdge>& Options = Context.GetMutableOptionsArray();\n\tTArray<FDlgEdgeData>& AllOptions = Context.GetAllMutableOptionsArray();\n\tOptions.Empty();\n\tAllOptions.Empty();\n\n\t// If the last entry is active the real edges are used\n\tif (ActualIndex == SpeechSequence.Num() - 1)\n\t\treturn Super::ReevaluateChildren(Context, AlreadyEvaluated);\n\n\t// give the context the fake inner edge\n\tif (InnerEdges.IsValidIndex(ActualIndex))\n\t{\n\t\tOptions.Add(InnerEdges[ActualIndex]);\n\t\tAllOptions.Add(FDlgEdgeData{ true, InnerEdges[ActualIndex] });\n\t\treturn true;\n\t}\n\n\treturn false;\n}\n\nbool UDlgNode_SpeechSequence::OptionSelected(int32 OptionIndex, UDlgContext& Context)\n{\n\t// Actual index is valid, and not the last node in the speech sequence, increment\n\tif (ActualIndex >= 0 && ActualIndex < SpeechSequence.Num() - 1)\n\t{\n\t\tActualIndex += 1;\n\t\treturn ReevaluateChildren(Context, {this});\n\t}\n\n\t// node finished -> generate true children\n\tActualIndex = 0;\n\tSuper::ReevaluateChildren(Context, { this });\n\treturn Super::OptionSelected(OptionIndex, Context);\n}\n\nbool UDlgNode_SpeechSequence::OptionSelectedFromReplicated(int32 OptionIndex, UDlgContext& Context)\n{\n\t// Is the new option index valid? set that for the actual index\n\tif (SpeechSequence.IsValidIndex(OptionIndex))\n\t{\n\t\tActualIndex = OptionIndex;\n\t\treturn ReevaluateChildren(Context, { this });\n\t}\n\n\t// node finished -> generate true children\n\tActualIndex = 0;\n\tSuper::ReevaluateChildren(Context, { this });\n\treturn Super::OptionSelected(OptionIndex, Context);\n}\n\nconst FText& UDlgNode_SpeechSequence::GetNodeText() const\n{\n\tif (SpeechSequence.IsValidIndex(ActualIndex))\n\t{\n\t\treturn SpeechSequence[ActualIndex].Text;\n\t}\n\n\treturn FText::GetEmpty();\n}\n\nUDlgNodeData* UDlgNode_SpeechSequence::GetNodeData() const\n{\n\tif (SpeechSequence.IsValidIndex(ActualIndex))\n\t{\n\t\treturn SpeechSequence[ActualIndex].NodeData;\n\t}\n\n\treturn nullptr;\n}\n\nUSoundBase* UDlgNode_SpeechSequence::GetNodeVoiceSoundBase() const\n{\n\tif (SpeechSequence.IsValidIndex(ActualIndex))\n\t{\n\t\treturn SpeechSequence[ActualIndex].VoiceSoundWave;\n\t}\n\n\treturn nullptr;\n}\n\nUDialogueWave* UDlgNode_SpeechSequence::GetNodeVoiceDialogueWave() const\n{\n\tif (SpeechSequence.IsValidIndex(ActualIndex))\n\t{\n\t\treturn SpeechSequence[ActualIndex].VoiceDialogueWave;\n\t}\n\n\treturn nullptr;\n}\n\nUObject* UDlgNode_SpeechSequence::GetNodeGenericData() const\n{\n\tif (SpeechSequence.IsValidIndex(ActualIndex))\n\t{\n\t\treturn SpeechSequence[ActualIndex].GenericData;\n\t}\n\n\treturn nullptr;\n}\n\nFName UDlgNode_SpeechSequence::GetSpeakerState() const\n{\n\tif (SpeechSequence.IsValidIndex(ActualIndex))\n\t{\n\t\treturn SpeechSequence[ActualIndex].SpeakerState;\n\t}\n\n\treturn NAME_None;\n}\n\nvoid UDlgNode_SpeechSequence::AddAllSpeakerStatesIntoSet(TSet<FName>& OutStates) const\n{\n\tfor (const auto& SpeechEntry : SpeechSequence)\n\t{\n\t\tOutStates.Add(SpeechEntry.SpeakerState);\n\t}\n}\n\nFName UDlgNode_SpeechSequence::GetNodeParticipantName() const\n{\n\tif (SpeechSequence.IsValidIndex(ActualIndex))\n\t{\n\t\treturn SpeechSequence[ActualIndex].Speaker;\n\t}\n\n\treturn OwnerName;\n}\n\nvoid UDlgNode_SpeechSequence::GetAssociatedParticipants(TArray<FName>& OutArray) const\n{\n\tSuper::GetAssociatedParticipants(OutArray);\n\n\tfor (const FDlgSpeechSequenceEntry& Entry : SpeechSequence)\n\t{\n\t\tif (Entry.Speaker != NAME_None)\n\t\t{\n\t\t\tOutArray.AddUnique(Entry.Speaker);\n\t\t}\n\t}\n}\n\nvoid UDlgNode_SpeechSequence::AutoGenerateInnerEdges()\n{\n\tInnerEdges.Empty();\n\tfor (const FDlgSpeechSequenceEntry& Entry : SpeechSequence)\n\t{\n\t\tFDlgEdge Edge;\n\t\tEdge.SetUnformattedText(Entry.EdgeText);\n\t\tInnerEdges.Add(Edge);\n\t}\n}\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystem/Private/Tests/DlgIOTester.cpp",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#include \"Tests/DlgIOTester.h\"\n\n#include \"CoreTypes.h\"\n#include \"Containers/UnrealString.h\"\n#include \"Misc/AutomationTest.h\"\n\n#include \"IO/DlgConfigWriter.h\"\n#include \"IO/DlgConfigParser.h\"\n#include \"IO/DlgJsonParser.h\"\n#include \"IO/DlgJsonWriter.h\"\n\nDEFINE_LOG_CATEGORY(LogDlgIOTester);\n\nbool FDlgIOTester::TestAllParsers()\n{\n\tbool bAllSucceeded = true;\n\n\tFDlgIOTesterOptions Options;\n\tOptions.bSupportsPureEnumContainer = false;\n\tOptions.bSupportsNonPrimitiveInSet = false;\n\tOptions.bSupportsColorPrimitives = false;\n\tOptions.bSupportsDatePrimitive = false;\n\tOptions.bSupportsUObjectValueInMap = false;\n\tbAllSucceeded &= TestParser<FDlgConfigWriter, FDlgConfigParser>(Options, TEXT(\"FDlgConfigWriter\"), TEXT(\"FDlgConfigParser\"));\n\n\tOptions = {};\n\tOptions.bSupportsDatePrimitive = false;\n\tOptions.bSupportsUObjectValueInMap = false;\n\tbAllSucceeded &= TestParser<FDlgJsonWriter, FDlgJsonParser>(Options, TEXT(\"FDlgJsonWriter\"), TEXT(\"FDlgJsonParser\"));\n\n\treturn bAllSucceeded;\n}\n\n#if WITH_DEV_AUTOMATION_TESTS\n\n// NOTE: to run this test, first remove the EAutomationTestFlags::Disabled flag\nIMPLEMENT_SIMPLE_AUTOMATION_TEST(FDlgIOAutomationTest, \"DlgSystem.IO.Tests\", //EAutomationTestFlags::Disabled |\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t EAutomationTestFlags::RequiresUser |\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t EAutomationTestFlags::EditorContext |\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t EAutomationTestFlags::ClientContext |\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t EAutomationTestFlags::CommandletContext |\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t EAutomationTestFlags::ProductFilter)\n\nbool FDlgIOAutomationTest::RunTest(const FString& Parameters)\n{\n\tTestEqual(TEXT(\"true == true\"), true, true);\n\tTestTrue(TEXT(\"Testing all parsers\"), FDlgIOTester::TestAllParsers());\n\n\treturn true;\n}\n\n#endif //WITH_DEV_AUTOMATION_TESTS\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystem/Private/Tests/DlgIOTesterTypes.cpp",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#include \"Tests/DlgIOTesterTypes.h\"\n\n#include \"Engine/Engine.h\"\n\n#include \"Tests/DlgTesterHelper.h\"\n#include \"NYReflectionTypes.h\"\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// UDlgTestObjectPrimitivesBase\nvoid UDlgTestObjectPrimitivesBase::GenerateRandomData(const FDlgIOTesterOptions& InOptions)\n{\n\tOptions = InOptions;\n\tSetToDefaults();\n\n\tInteger = FMath::Rand();\n\tString = FString::SanitizeFloat(FMath::SRand());\n}\n\nvoid UDlgTestObjectPrimitivesBase::SetToDefaults()\n{\n\tInteger = 0;\n\tString.Empty();\n}\n\nbool UDlgTestObjectPrimitivesBase::IsEqual(const Self* Other, FString& OutError) const\n{\n\tif (Other == nullptr)\n\t{\n\t\tOutError += FString::Printf(TEXT(\"\\tOther is nullptr.\\n\"));\n\t\treturn false;\n\t}\n\n\tbool bIsEqual = true;\n\tif (Integer != Other->Integer)\n\t{\n\t\tbIsEqual = false;\n\t\tOutError += FString::Printf(TEXT(\"\\tThis.Integer (%d) != Other.Integer (%d)\\n\"), Integer, Other->Integer);\n\t}\n\n\tif (String != Other->String)\n\t{\n\t\tbIsEqual = false;\n\t\tOutError += FString::Printf(TEXT(\"\\tThis.String (%s) != Other.String (%s)\\n\"), *String, *Other->String);\n\t}\n\n\treturn bIsEqual;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// UDlgTestObjectPrimitives_ChildA\nvoid UDlgTestObjectPrimitives_ChildA::GenerateRandomData(const FDlgIOTesterOptions& InOptions)\n{\n\tSuper::GenerateRandomData(InOptions);\n\tIntegerChildA = FMath::Rand();\n}\n\nvoid UDlgTestObjectPrimitives_ChildA::SetToDefaults()\n{\n\tSuper::SetToDefaults();\n\tIntegerChildA = 0;\n}\n\nbool UDlgTestObjectPrimitives_ChildA::IsEqual(const Super* Other, FString& OutError) const\n{\n\tconst Self* SelfOther = Cast<Self>(Other);\n\tif (SelfOther == nullptr)\n\t{\n\t\tOutError += FString::Printf(TEXT(\"This.Class (%s) != Other.Class (%s)\\n\"), *FDlgHelper::GetClassNameFromObject(this), *FDlgHelper::GetClassNameFromObject(Other));\n\t\treturn false;\n\t}\n\n\tbool bIsEqual = Super::IsEqual(Other, OutError);\n\tif (IntegerChildA != SelfOther->IntegerChildA)\n\t{\n\t\tbIsEqual = false;\n\t\tOutError += FString::Printf(TEXT(\"\\tThis.IntegerChildA (%d) != Other.IntegerChildA (%d)\\n\"), IntegerChildA, SelfOther->IntegerChildA);\n\t}\n\n\treturn bIsEqual;\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// UDlgTestObjectPrimitives_ChildB\nvoid UDlgTestObjectPrimitives_ChildB::GenerateRandomData(const FDlgIOTesterOptions& InOptions)\n{\n\tSuper::GenerateRandomData(InOptions);\n\tStringChildB = FString::SanitizeFloat(FMath::SRand());\n}\n\nvoid UDlgTestObjectPrimitives_ChildB::SetToDefaults()\n{\n\tSuper::SetToDefaults();\n\tStringChildB.Empty();\n}\n\nbool UDlgTestObjectPrimitives_ChildB::IsEqual(const Super* Other, FString& OutError) const\n{\n\tconst Self* SelfOther = Cast<Self>(Other);\n\tif (SelfOther == nullptr)\n\t{\n\t\tOutError += FString::Printf(TEXT(\"This.Class (%s) != Other.Class (%s)\\n\"), *FDlgHelper::GetClassNameFromObject(this), *FDlgHelper::GetClassNameFromObject(Other));\n\t\treturn false;\n\t}\n\n\tbool bIsEqual = Super::IsEqual(Other, OutError);\n\tif (StringChildB != SelfOther->StringChildB)\n\t{\n\t\tbIsEqual = false;\n\t\tOutError += FString::Printf(TEXT(\"\\tThis.StringChildB (%s) != Other.StringChildB (%s)\\n\"), *StringChildB, *SelfOther->StringChildB);\n\t}\n\n\treturn bIsEqual;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// UDlgTestObjectPrimitives_GrandChildA_Of_ChildA\nvoid UDlgTestObjectPrimitives_GrandChildA_Of_ChildA::GenerateRandomData(const FDlgIOTesterOptions& InOptions)\n{\n\tSuper::GenerateRandomData(InOptions);\n\tIntegerGrandChildA_Of_ChildA = FMath::Rand();\n}\n\nvoid UDlgTestObjectPrimitives_GrandChildA_Of_ChildA::SetToDefaults()\n{\n\tSuper::SetToDefaults();\n\tIntegerGrandChildA_Of_ChildA = 0;\n}\n\nbool UDlgTestObjectPrimitives_GrandChildA_Of_ChildA::IsEqual(const SuperBase* Other, FString& OutError) const\n{\n\tconst Self* SelfOther = Cast<Self>(Other);\n\tif (SelfOther == nullptr)\n\t{\n\t\tOutError += FString::Printf(TEXT(\"This.Class (%s) != Other.Class (%s)\\n\"), *FDlgHelper::GetClassNameFromObject(this), *FDlgHelper::GetClassNameFromObject(Other));\n\t\treturn false;\n\t}\n\n\tbool bIsEqual = Super::IsEqual(Other, OutError);\n\tif (IntegerGrandChildA_Of_ChildA != SelfOther->IntegerGrandChildA_Of_ChildA)\n\t{\n\t\tbIsEqual = false;\n\t\tOutError += FString::Printf(TEXT(\"\\tThis.IntegerGrandChildA_Of_ChildA (%d) != Other.IntegerGrandChildA_Of_ChildA (%d)\\n\"), IntegerGrandChildA_Of_ChildA, IntegerGrandChildA_Of_ChildA);\n\t}\n\n\treturn bIsEqual;\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// FDlgTestStructPrimitives\nvoid FDlgTestStructPrimitives::GenerateRandomData(const FDlgIOTesterOptions& InOptions)\n{\n\tOptions = InOptions;\n\tSetToDefaults();\n\n\tbBoolean = FMath::RandBool();\n\t// Random negative too\n\tInteger32 = FMath::Rand() * (FMath::RandBool() ? 1 : -1);\n\tInteger64 = FDlgHelper::RandomInt64() * (FMath::RandBool() ? 1 : -1);\n\tFloat = FMath::SRand();\n\tString = FString::SanitizeFloat(Float);\n\tName = FName(*String);\n\tEnum = static_cast<EDlgTestEnum>(FMath::RandHelper(static_cast<int32>(EDlgTestEnum::NumOf)));\n\tText = FText::FromString(String);\n\n\tif (Options.bSupportsColorPrimitives)\n\t{\n\t\tLinearColor = FLinearColor(FMath::SRand(), FMath::SRand(), FMath::SRand());\n\t\tColor = LinearColor.ToFColor(false);\n\t}\n\tif (Options.bSupportsDatePrimitive)\n\t{\n\t\tDateTime = FDateTime(FMath::Rand());\n\t}\n\tIntPoint = FIntPoint(FMath::Rand(), FMath::Rand());\n\tVector3 = FVector(FMath::SRand(), FMath::SRand(), FMath::SRand());\n\tVector2 = FVector2D(FMath::SRand(), FMath::SRand());\n\tVector4 = FVector4(FMath::SRand(), FMath::SRand(), FMath::SRand(), FMath::SRand());\n\tRotator = FRotator(FMath::SRand(), FMath::SRand(), FMath::SRand());\n\tMatrix = FMatrix(Vector3, FVector(IntPoint), FVector(Vector4), Vector3);\n\tTransform = FTransform(Vector3);\n\tGUID = FGuid::NewGuid();\n\n\tconst TArray<UClass*> ClassesPool = {\n\t\tUField::StaticClass(), UStruct::StaticClass(), nullptr, UObject::StaticClass(),\n\t\tAActor::StaticClass(), APawn::StaticClass(), nullptr\n\t};\n\tClass = ClassesPool[FMath::RandHelper(ClassesPool.Num())];\n\n\tcheck(GEngine);\n\tconst TArray<UTexture2D*> TexturesPool = {\n\t\tGEngine->DefaultTexture, nullptr, GEngine->DefaultBokehTexture, GEngine->DefaultBloomKernelTexture, GEngine->LightMapDensityTexture,\n\t\tGEngine->HighFrequencyNoiseTexture, GEngine->MiniFontTexture, GEngine->PreIntegratedSkinBRDFTexture, nullptr\n\t};\n\tTexture2DReference = TexturesPool[FMath::RandHelper(TexturesPool.Num())];\n\tConstTexture2D = GEngine->DefaultTexture;\n\n\tObjectPrimitivesBase = NewObject<UDlgTestObjectPrimitivesBase>();\n\tObjectPrimitivesBase->GenerateRandomData(Options);\n\n\tObjectPrimitivesChildA = NewObject<UDlgTestObjectPrimitives_ChildA>();\n\tObjectPrimitivesChildA->GenerateRandomData(Options);\n\n\tObjectPrimitivesPolymorphismChildA = NewObject<UDlgTestObjectPrimitives_ChildA>();\n\tObjectPrimitivesPolymorphismChildA->GenerateRandomData(Options);\n\n\tObjectPrimitivesPolymorphismChildB = NewObject<UDlgTestObjectPrimitives_ChildB>();\n\tObjectPrimitivesPolymorphismChildB->GenerateRandomData(Options);\n\n\tObjectPrimitivesGrandChildA = NewObject<UDlgTestObjectPrimitives_GrandChildA_Of_ChildA>();\n\tObjectPrimitivesGrandChildA->GenerateRandomData(Options);\n\n\tObjectPrimitivesPolymorphismBaseGrandChildA = NewObject<UDlgTestObjectPrimitives_GrandChildA_Of_ChildA>();\n\tObjectPrimitivesPolymorphismBaseGrandChildA->GenerateRandomData(Options);\n\n\tObjectPrimitivesPolymorphismChildGrandChildA = NewObject<UDlgTestObjectPrimitives_GrandChildA_Of_ChildA>();\n\tObjectPrimitivesPolymorphismChildGrandChildA->GenerateRandomData(Options);\n\n\tif (FMath::RandBool())\n\t{\n\t\tObjectSwitch = nullptr;\n\t}\n\telse\n\t{\n\t\tObjectSwitch = NewObject<UDlgTestObjectPrimitivesBase>();\n\t\tObjectSwitch->GenerateRandomData(Options);\n\t}\n}\n\nbool FDlgTestStructPrimitives::IsEqual(const Self& Other, FString& OutError) const\n{\n\t//if (Options != Other.Options)\n\t//{\n\t//\tOutError += FString::Printf(TEXT(\"This.Options(%s) != Other.Options(%s) This will make the test fail most likely:\\n\"), *Options.ToString(), *Other.Options.ToString());\n\t//\treturn false;\n\t//}\n\n\tbool bIsEqual = true;\n\tOutError += TEXT(\"FDlgTestStructPrimitives::IsEqual:\\n\");\n\n\tif ((ObjectSwitch == nullptr && Other.ObjectSwitch != nullptr) || (ObjectSwitch != nullptr && Other.ObjectSwitch == nullptr))\n\t{\n\t\tOutError += FString::Printf(TEXT(\"\\tThis.ObjectSwitch (%d) != Other.ObjectSwitch (%d). Null values are different. Writer supports writing null values?\\n\"), ObjectSwitch != nullptr, Other.ObjectSwitch != nullptr);\n\t\treturn false;\n\t}\n\n\tif (bBoolean != Other.bBoolean)\n\t{\n\t\tbIsEqual = false;\n\t\tOutError += FString::Printf(TEXT(\"\\tThis.bBoolean (%d) != Other.bBoolean (%d)\\n\"), bBoolean, Other.bBoolean);\n\t}\n\n\tif (Integer32 != Other.Integer32)\n\t{\n\t\tbIsEqual = false;\n\t\tOutError += FString::Printf(TEXT(\"\\tThis.Integer32 (%d) != Other.Integer32 (%d)\\n\"), Integer32, Other.Integer32);\n\t}\n\n\tif (Integer64 != Other.Integer64)\n\t{\n\t\tbIsEqual = false;\n\t\tOutError += FString::Printf(TEXT(\"\\tThis.Integer64 (%lld) != Other.Integer64 (%lld)\\n\"), Integer64, Other.Integer64);\n\t}\n\n\tif (!FDlgHelper::IsFloatEqual(Float, Other.Float))\n\t{\n\t\tbIsEqual = false;\n\t\tOutError += FString::Printf(TEXT(\"\\tThis.Float (%f) != Other.Float (%f)\\n\"), Float, Other.Float);\n\t}\n\n\tif (String != Other.String)\n\t{\n\t\tbIsEqual = false;\n\t\tOutError += FString::Printf(TEXT(\"\\tThis.String (%s) != Other.String (%s)\\n\"), *String, *Other.String);\n\t}\n\n\tif (Name != Other.Name)\n\t{\n\t\tbIsEqual = false;\n\t\tOutError += FString::Printf(TEXT(\"\\tThis.Name (%s) != Other.Name (%s)\\n\"), *Name.ToString(), *Other.Name.ToString());\n\t}\n\n\tif (!Text.EqualTo(Other.Text))\n\t{\n\t\tbIsEqual = false;\n\t\tOutError += FString::Printf(TEXT(\"\\tThis.Text (%s) != Other.Text (%s)\\n\"), *Text.ToString(), *Other.Text.ToString());\n\t}\n\n\tif (Enum != Other.Enum)\n\t{\n\t\tbIsEqual = false;\n\t\tOutError += FString::Printf(TEXT(\"\\tThis.Enum (%d) != Other.Enum (%d)\\n\"), static_cast<int32>(Enum), static_cast<int32>(Other.Enum));\n\t}\n\n\tif (Color != Other.Color)\n\t{\n\t\tbIsEqual = false;\n\t\tOutError += FString::Printf(TEXT(\"\\tThis.Color (%s) != Other.Color (%s)\\n\"), *Color.ToString(), *Other.Color.ToString());\n\t}\n\n\tif (!LinearColor.Equals(Other.LinearColor))\n\t{\n\t\tbIsEqual = false;\n\t\tOutError += FString::Printf(TEXT(\"\\tThis.LinearColor (%s) != Other.LinearColor (%s)\\n\"), *LinearColor.ToString(), *Other.LinearColor.ToString());\n\t}\n\n\tif (DateTime != Other.DateTime)\n\t{\n\t\tbIsEqual = false;\n\t\tOutError += FString::Printf(TEXT(\"\\tThis.DateTime.Ticks (%d) != Other.DateTime.Ticks (%d)\\n\"), DateTime.GetTicks(), Other.DateTime.GetTicks());\n\t}\n\n\tif (IntPoint != Other.IntPoint)\n\t{\n\t\tbIsEqual = false;\n\t\tOutError += FString::Printf(TEXT(\"\\tThis.IntPoint (%s) != Other.IntPoint (%s)\\n\"), *IntPoint.ToString(), *Other.IntPoint.ToString());\n\t}\n\n\tif (!Vector3.Equals(Other.Vector3))\n\t{\n\t\tbIsEqual = false;\n\t\tOutError += FString::Printf(TEXT(\"\\tThis.Vector3 (%s) != Other.Vector3 (%s)\\n\"), *Vector3.ToString(), *Other.Vector3.ToString());\n\t}\n\n\tif (!Vector2.Equals(Other.Vector2))\n\t{\n\t\tbIsEqual = false;\n\t\tOutError += FString::Printf(TEXT(\"\\tThis.Vector2 (%s) != Other.Vector2 (%s)\\n\"), *Vector2.ToString(), *Other.Vector2.ToString());\n\t}\n\n\tif (!Vector4.Equals(Other.Vector4))\n\t{\n\t\tbIsEqual = false;\n\t\tOutError += FString::Printf(TEXT(\"\\tThis.Vector4 (%s) != Other.Vector4 (%s)\\n\"), *Vector4.ToString(), *Other.Vector4.ToString());\n\t}\n\n\tif (!Rotator.Equals(Other.Rotator))\n\t{\n\t\tbIsEqual = false;\n\t\tOutError += FString::Printf(TEXT(\"\\tThis.Rotator (%s) != Other.Rotator (%s)\\n\"), *Rotator.ToString(), *Other.Rotator.ToString());\n\t}\n\n\tif (!Matrix.Equals(Other.Matrix))\n\t{\n\t\tbIsEqual = false;\n\t\tOutError += FString::Printf(TEXT(\"\\tThis.Matrix (%s) != Other.Matrix (%s)\\n\"), *Matrix.ToString(), *Other.Matrix.ToString());\n\t}\n\n\tif (!Transform.Equals(Other.Transform))\n\t{\n\t\tbIsEqual = false;\n\t\tOutError += FString::Printf(TEXT(\"\\tThis.Transform (%s) != Other.Transform (%s)\\n\"), *Transform.ToString(), *Other.Transform.ToString());\n\t}\n\n\tif (GUID != Other.GUID)\n\t{\n\t\tbIsEqual = false;\n\t\tOutError += FString::Printf(TEXT(\"\\tThis.Guid (%s) != Other.Guid (%s)\\n\"), *GUID.ToString(), *Other.GUID.ToString());\n\t}\n\n\tif (Class != Other.Class)\n\t{\n\t\tbIsEqual = false;\n\t\tOutError += FString::Printf(TEXT(\"\\tThis.Class (%s) != Other.Class (%s)\\n\"), *FDlgHelper::GetFullNameFromObject(Class), *FDlgHelper::GetFullNameFromObject(Other.Class));\n\t}\n\n\tif (EmptyObjectInitialized != Other.EmptyObjectInitialized || EmptyObjectInitialized != nullptr || Other.EmptyObjectInitialized != nullptr)\n\t{\n\t\tbIsEqual = false;\n\t\tOutError += FString::Printf(TEXT(\"\\tThis.EmptyObjectInitialized OR Other.EmptyObjectInitialized are not empty :O\\n\"));\n\t}\n\n\tif (EmptyObjectInitializedReference != Other.EmptyObjectInitializedReference || EmptyObjectInitializedReference != nullptr || Other.EmptyObjectInitializedReference != nullptr)\n\t{\n\t\tbIsEqual = false;\n\t\tOutError += FString::Printf(TEXT(\"\\tThis.EmptyObjectInitializedReference OR Other.EmptyObjectInitializedReference are not empty :O\\n\"));\n\t}\n\n\tif (Texture2DReference != Other.Texture2DReference)\n\t{\n\t\tbIsEqual = false;\n\t\tOutError += FString::Printf(TEXT(\"\\tThis.Texture2D (%s) != Other.Texture2D (%s)\\n\"), *FDlgHelper::GetFullNameFromObject(Texture2DReference), *FDlgHelper::GetFullNameFromObject(Other.Texture2DReference));\n\t}\n\n\tif (!ObjectPrimitivesBase->IsEqual(Other.ObjectPrimitivesBase, OutError))\n\t{\n\t\tbIsEqual = false;\n\t\tOutError += FString::Printf(TEXT(\"\\tThis.ObjectPrimitives (%s) != Other.ObjectPrimitives (%s)\\n\"), *FDlgHelper::GetFullNameFromObject(ObjectPrimitivesBase), *FDlgHelper::GetFullNameFromObject(Other.ObjectPrimitivesBase));\n\t}\n\n\tif (!ObjectPrimitivesChildA->IsEqual(Other.ObjectPrimitivesChildA, OutError))\n\t{\n\t\tbIsEqual = false;\n\t\tOutError += FString::Printf(TEXT(\"\\tThis.ObjectPrimitivesChildA (%s) != Other.ObjectPrimitivesChildA (%s)\\n\"), *FDlgHelper::GetFullNameFromObject(ObjectPrimitivesChildA), *FDlgHelper::GetFullNameFromObject(Other.ObjectPrimitivesChildA));\n\t}\n\n\tif (!ObjectPrimitivesPolymorphismChildA->IsEqual(Other.ObjectPrimitivesPolymorphismChildA, OutError))\n\t{\n\t\tbIsEqual = false;\n\t\tOutError += FString::Printf(TEXT(\"\\tThis.ObjectPrimitivesPolymorphismChildA (%s) != Other.ObjectPrimitivesPolymorphismChildA (%s)\\n\"), *FDlgHelper::GetFullNameFromObject(ObjectPrimitivesPolymorphismChildA), *FDlgHelper::GetFullNameFromObject(Other.ObjectPrimitivesPolymorphismChildA));\n\t}\n\n\tif (!ObjectPrimitivesPolymorphismChildB->IsEqual(Other.ObjectPrimitivesPolymorphismChildB, OutError))\n\t{\n\t\tbIsEqual = false;\n\t\tOutError += FString::Printf(TEXT(\"\\tThis.ObjectPrimitivesPolymorphismChildB (%s) != Other.ObjectPrimitivesPolymorphismChildB (%s)\\n\"), *FDlgHelper::GetFullNameFromObject(ObjectPrimitivesPolymorphismChildB), *FDlgHelper::GetFullNameFromObject(Other.ObjectPrimitivesPolymorphismChildB));\n\t}\n\n\tif (!ObjectPrimitivesGrandChildA->IsEqual(Other.ObjectPrimitivesGrandChildA, OutError))\n\t{\n\t\tbIsEqual = false;\n\t\tOutError += FString::Printf(TEXT(\"\\tThis.ObjectPrimitivesGrandChildA (%s) != Other.ObjectPrimitivesGrandChildA (%s)\\n\"), *FDlgHelper::GetFullNameFromObject(ObjectPrimitivesGrandChildA), *FDlgHelper::GetFullNameFromObject(Other.ObjectPrimitivesGrandChildA));\n\t}\n\n\tif (!ObjectPrimitivesPolymorphismBaseGrandChildA->IsEqual(Other.ObjectPrimitivesPolymorphismBaseGrandChildA, OutError))\n\t{\n\t\tbIsEqual = false;\n\t\tOutError += FString::Printf(TEXT(\"\\tThis.ObjectPrimitivesPolymorphismBaseGrandChildA (%s) != Other.ObjectPrimitivesPolymorphismBaseGrandChildA (%s)\\n\"), *FDlgHelper::GetFullNameFromObject(ObjectPrimitivesPolymorphismBaseGrandChildA), *FDlgHelper::GetFullNameFromObject(Other.ObjectPrimitivesPolymorphismBaseGrandChildA));\n\t}\n\n\tif (!ObjectPrimitivesPolymorphismChildGrandChildA->IsEqual(Other.ObjectPrimitivesPolymorphismChildGrandChildA, OutError))\n\t{\n\t\tbIsEqual = false;\n\t\tOutError += FString::Printf(TEXT(\"\\tThis.ObjectPrimitivesPolymorphismChildGrandChildA (%s) != Other.ObjectPrimitivesPolymorphismChildGrandChildA (%s)\\n\"), *FDlgHelper::GetFullNameFromObject(ObjectPrimitivesPolymorphismChildGrandChildA), *FDlgHelper::GetFullNameFromObject(Other.ObjectPrimitivesPolymorphismChildGrandChildA));\n\t}\n\n\t// Clear error message\n\tif (bIsEqual)\n\t{\n\t\tOutError.Empty();\n\t}\n\treturn bIsEqual;\n}\n\nvoid FDlgTestStructPrimitives::SetToDefaults()\n{\n\tInteger32 = 42;\n\tInteger64 = 223372036854775807;\n\tbBoolean = true;\n\tEnum = EDlgTestEnum::Second;\n\tFloat = -23.549f;\n\tName = NAME_None;\n\tString.Empty();\n\tEmptyString.Empty();\n\tText = FText::GetEmpty();\n\tLinearColor = FLinearColor(ForceInitToZero);\n\tColor = FColor(ForceInitToZero);\n\tDateTime = FDateTime(0);\n\tIntPoint = FIntPoint(ForceInitToZero);\n\tVector3 = FVector(ForceInitToZero);\n\tVector2 = FVector2D(ForceInitToZero);\n\tVector4 = FVector4(ForceInitToZero);\n\tRotator = FRotator(ForceInitToZero);\n\tMatrix = FMatrix(ForceInitToZero);\n\tTransform = FTransform();\n\tGUID = FGuid();\n\tClass = nullptr;\n\tEmptyObjectInitialized = nullptr;\n\tEmptyObjectInitializedReference = nullptr;\n\tTexture2DReference = nullptr;\n\tConstTexture2D = nullptr;\n\tObjectPrimitivesBase = nullptr;\n\tObjectPrimitivesChildA = nullptr;\n\tObjectPrimitivesPolymorphismChildA = nullptr;\n\tObjectPrimitivesPolymorphismChildB = nullptr;\n\tObjectPrimitivesGrandChildA = nullptr;\n\tObjectPrimitivesPolymorphismBaseGrandChildA = nullptr;\n\tObjectPrimitivesPolymorphismChildGrandChildA = nullptr;\n\tObjectSwitch = nullptr;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// FDlgTestStructPrimitives\nvoid FDlgTestStructComplex::GenerateRandomData(const FDlgIOTesterOptions& InOptions)\n{\n\tOptions = InOptions;\n\tSetToDefaults();\n\tconst int32 Num = FMath::RandHelper(10) + 2;\n\tstatic const TArray<UClass*> ObjectClassPool = {\n\t\tUDlgTestObjectPrimitivesBase::StaticClass(), UDlgTestObjectPrimitives_ChildA::StaticClass(),\n\t\tUDlgTestObjectPrimitives_ChildB::StaticClass(), UDlgTestObjectPrimitives_GrandChildA_Of_ChildA::StaticClass(), nullptr\n\t};\n\n\tfor (int32 i = 0; i < Num; ++i)\n\t{\n\t\t// StructArrayPrimitives\n\t\tFDlgTestStructPrimitives StructPrimitives;\n\t\tStructPrimitives.GenerateRandomData(Options);\n\t\tStructArrayPrimitives.Add(StructPrimitives);\n\n\t\t// ArrayOfObjects\n\t\t{\n\t\t\tUClass* ChosenClass = ObjectClassPool[FMath::RandHelper(ObjectClassPool.Num())];\n\t\t\tif (ChosenClass == nullptr)\n\t\t\t{\n\t\t\t\tArrayOfObjects.Add(nullptr);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tUDlgTestObjectPrimitivesBase* ObjectPrimitives = NewObject<UDlgTestObjectPrimitivesBase>((UObject*)GetTransientPackage(), ChosenClass);\n\t\t\t\tObjectPrimitives->GenerateRandomData(Options);\n\t\t\t\tArrayOfObjects.Add(ObjectPrimitives);\n\t\t\t}\n\t\t}\n\t}\n}\n\nbool FDlgTestStructComplex::IsEqual(const Self& Other, FString& OutError) const\n{\n\tFString PropertyName;\n\tbool bIsEqual = true;\n\tOutError += TEXT(\"FDlgTestStructComplex::IsEqual:\\n\");\n\n\tPropertyName = TEXT(\"StructArrayPrimitives\");\n\tbIsEqual &= FDlgTestHelper::IsComplexArrayEqual<FDlgTestStructPrimitives>(StructArrayPrimitives, Other.StructArrayPrimitives, PropertyName, OutError);\n\n\tPropertyName = TEXT(\"ArrayOfObjects\");\n\tbIsEqual &= FDlgTestHelper::IsComplexPointerArrayEqual<UDlgTestObjectPrimitivesBase>(ArrayOfObjects, Other.ArrayOfObjects, PropertyName, OutError);\n\n\n\t// Clear error message\n\tif (bIsEqual)\n\t{\n\t\tOutError.Empty();\n\t}\n\treturn bIsEqual;\n}\n\n\nvoid FDlgTestStructComplex::SetToDefaults()\n{\n\tStructArrayPrimitives = {};\n\tArrayOfObjects = {};\n\tArrayOfObjectsAsReference = {};\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// FDlgTestArrayPrimitive\nvoid FDlgTestArrayPrimitive::GenerateRandomData(const FDlgIOTesterOptions& InOptions)\n{\n\tOptions = InOptions;\n\tNum1_Array = { FMath::Rand() };\n\tEmptyArray.Empty();\n\tInt32Array.Empty();\n\tInt64Array.Empty();\n\tBoolArray.Empty();\n\tFloatArray.Empty();\n\tEnumArray.Empty();\n\tNameArray.Empty();\n\tStringArray.Empty();\n\tObjectArrayConstantNulls.Empty();\n\n\tconst int32 Num = FMath::RandHelper(10) + 2;\n\tInt32Array.SetNum(Num);\n\tInt64Array.SetNum(Num);\n\tBoolArray.SetNum(Num);\n\tFloatArray.SetNum(Num);\n\tif (Options.bSupportsPureEnumContainer)\n\t{\n\t\tEnumArray.SetNum(Num);\n\t}\n\tNameArray.SetNum(Num);\n\tStringArray.SetNum(Num);\n\tObjectArrayConstantNulls.SetNum(Num);\n\n\tfor (int32 i = 0; i < Num; ++i)\n\t{\n\t\tInt32Array[i] = FMath::Rand();\n\t\tInt64Array[i] = FDlgHelper::RandomInt64();\n\t\tBoolArray[i] = FMath::RandBool();\n\t\tif (Options.bSupportsPureEnumContainer)\n\t\t{\n\t\t\tEnumArray[i] = static_cast<EDlgTestEnum>(FMath::RandHelper(static_cast<int32>(EDlgTestEnum::NumOf)));\n\t\t}\n\t\tFloatArray[i] = FMath::SRand();\n\t\tStringArray[i] = FString::SanitizeFloat(FloatArray[i]);\n\t\tNameArray[i] = FName(*StringArray[i]);\n\n\t\t// ObjectArrayConstantNulls\n\t\tObjectArrayConstantNulls[i] = nullptr;\n\t}\n}\n\nbool FDlgTestArrayPrimitive::IsEqual(const Self& Other, FString& OutError) const\n{\n\tFString PropertyName;\n\tbool bIsEqual = true;\n\tOutError += TEXT(\"FDlgTestArrayPrimitive::IsEqual:\\n\");\n\n\tPropertyName = TEXT(\"ObjectArrayConstantNulls\");\n\tif (ObjectArrayConstantNulls.Num() != Other.ObjectArrayConstantNulls.Num())\n\t{\n\t\tOutError = FString::Printf(TEXT(\"This.ObjectArrayConstantNulls.Num(%d) != Other.ObjectArrayConstantNulls.Num(%d). Most likely because the writer does not support writing nulls.\"),\n\t\t\tObjectArrayConstantNulls.Num(), Other.ObjectArrayConstantNulls.Num());\n\t\treturn false;\n\t}\n\n\tPropertyName = TEXT(\"EmptyArray\");\n\tif (EmptyArray.Num() != Other.EmptyArray.Num())\n\t{\n\t\tOutError = FString::Printf(TEXT(\"This.EmptyArray.Num(%d) != Other.EmptyArray.Num(%d). but why :O\"),\n\t\t\tEmptyArray.Num(), Other.EmptyArray.Num());\n\t\treturn false;\n\t}\n\n\tPropertyName = TEXT(\"Num1_Array\");\n\tbIsEqual &= FDlgTestHelper::IsPrimitiveArrayEqual<int32>(Num1_Array, Other.Num1_Array, PropertyName, OutError,\n\t\tFDlgTestHelper::Int32ToString);\n\n\tPropertyName = TEXT(\"Int32Array\");\n\tbIsEqual &= FDlgTestHelper::IsPrimitiveArrayEqual<int32>(Int32Array, Other.Int32Array, PropertyName, OutError,\n\t\tFDlgTestHelper::Int32ToString);\n\n\tPropertyName = TEXT(\"Int64Array\");\n\tbIsEqual &= FDlgTestHelper::IsPrimitiveArrayEqual<int64>(Int64Array, Other.Int64Array, PropertyName, OutError,\n\t\tFDlgTestHelper::Int64ToString);\n\n\tPropertyName = TEXT(\"BoolArray\");\n\tbIsEqual &= FDlgTestHelper::IsPrimitiveArrayEqual<bool>(BoolArray, Other.BoolArray, PropertyName, OutError,\n\t\t[](const bool& Value) -> FString { return FString::FromInt(Value); });\n\n\tPropertyName = TEXT(\"FloatArray\");\n\tbIsEqual &= FDlgTestHelper::IsPrimitiveArrayEqual<float>(FloatArray, Other.FloatArray, PropertyName, OutError,\n\t\tFDlgTestHelper::FloatToString);\n\n\tPropertyName = TEXT(\"EnumArray\");\n\tbIsEqual &= FDlgTestHelper::IsPrimitiveArrayEqual<EDlgTestEnum>(EnumArray, Other.EnumArray, PropertyName, OutError,\n\t\t[](const EDlgTestEnum& Value) -> FString { return FString::FromInt(static_cast<int32>(Value)); });\n\n\tPropertyName = TEXT(\"NameArray\");\n\tbIsEqual &= FDlgTestHelper::IsPrimitiveArrayEqual<FName>(NameArray, Other.NameArray, PropertyName, OutError,\n\t\tFDlgTestHelper::NameToString);\n\n\tPropertyName = TEXT(\"StringArray\");\n\tbIsEqual &= FDlgTestHelper::IsPrimitiveArrayEqual<FString>(StringArray, Other.StringArray, PropertyName, OutError,\n\t\tFDlgTestHelper::StringToString);\n\n\t// Clear error message\n\tif (bIsEqual)\n\t{\n\t\tOutError.Empty();\n\t}\n\treturn bIsEqual;\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// FDlgTestArrayStruct\nvoid FDlgTestArrayComplex::GenerateRandomData(const FDlgIOTesterOptions& InOptions)\n{\n\tOptions = InOptions;\n\tStructArrayPrimitives.Empty();\n\tStructArrayOfArrayPrimitives.Empty();\n\tObjectArrayPrimitivesBase.Empty();\n\tObjectArrayPrimitivesAll.Empty();\n\n\tconst int32 Num = FMath::RandHelper(20) + 3;\n\tstatic const TArray<UClass*> ObjectPrimitiveClassPool = {\n\t\tUDlgTestObjectPrimitivesBase::StaticClass(), UDlgTestObjectPrimitives_ChildA::StaticClass(),\n\t\tUDlgTestObjectPrimitives_ChildB::StaticClass(), UDlgTestObjectPrimitives_GrandChildA_Of_ChildA::StaticClass(), nullptr\n\t};\n\tfor (int32 Index = 0; Index < Num; Index++)\n\t{\n\t\t// StructArrayPrimitives\n\t\tFDlgTestStructPrimitives StructPrimitives;\n\t\tStructPrimitives.GenerateRandomData(Options);\n\t\tStructArrayPrimitives.Add(StructPrimitives);\n\n\t\t//StructArrayOfArrayPrimitives\n\t\tFDlgTestArrayPrimitive ArrayOfArrayPrimitive;\n\t\tArrayOfArrayPrimitive.GenerateRandomData(Options);\n\t\tStructArrayOfArrayPrimitives.Add(ArrayOfArrayPrimitive);\n\n\t\t// ObjectArrayPrimitivesBase\n\t\t{\n\t\t\tUDlgTestObjectPrimitivesBase* ObjectPrimitives = NewObject<UDlgTestObjectPrimitivesBase>();\n\t\t\tObjectPrimitives->GenerateRandomData(Options);\n\t\t\tObjectArrayPrimitivesBase.Add(ObjectPrimitives);\n\t\t}\n\n\t\t// ObjectArrayPrimitivesAll\n\t\t{\n\t\t\tUClass* ChosenClass = ObjectPrimitiveClassPool[FMath::RandHelper(ObjectPrimitiveClassPool.Num())];\n\t\t\tif (ChosenClass == nullptr)\n\t\t\t{\n\t\t\t\tObjectArrayPrimitivesAll.Add(nullptr);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tUDlgTestObjectPrimitivesBase* ObjectPrimitives = NewObject<UDlgTestObjectPrimitivesBase>((UObject*)GetTransientPackage(), ChosenClass);\n\t\t\t\tObjectPrimitives->GenerateRandomData(Options);\n\t\t\t\tObjectArrayPrimitivesAll.Add(ObjectPrimitives);\n\t\t\t}\n\t\t}\n\n\t\t// ObjectArrayFrequentsNulls\n\t\t{\n\t\t\tconst bool bNull = FMath::RandBool();\n\t\t\tif (bNull)\n\t\t\t{\n\t\t\t\tObjectArrayFrequentsNulls.Add(nullptr);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tUDlgTestObjectPrimitivesBase* ObjectPrimitives = NewObject<UDlgTestObjectPrimitivesBase>();\n\t\t\t\tObjectPrimitives->GenerateRandomData(Options);\n\t\t\t\tObjectArrayFrequentsNulls.Add(ObjectPrimitives);\n\t\t\t}\n\t\t}\n\t}\n}\n\nbool FDlgTestArrayComplex::IsEqual(const Self& Other, FString& OutError) const\n{\n\tFString PropertyName;\n\tbool bIsEqual = true;\n\tOutError += TEXT(\"FDlgTestArrayStruct::IsEqual:\\n\");\n\n\tPropertyName = TEXT(\"StructArrayPrimitives\");\n\tbIsEqual &= FDlgTestHelper::IsComplexArrayEqual<FDlgTestStructPrimitives>(StructArrayPrimitives, Other.StructArrayPrimitives, PropertyName, OutError);\n\n\tPropertyName = TEXT(\"StructArrayOfArrayPrimitives\");\n\tbIsEqual &= FDlgTestHelper::IsComplexArrayEqual<FDlgTestArrayPrimitive>(StructArrayOfArrayPrimitives, Other.StructArrayOfArrayPrimitives, PropertyName, OutError);\n\n\tPropertyName = TEXT(\"ObjectArrayPrimitivesBase\");\n\tbIsEqual &= FDlgTestHelper::IsComplexPointerArrayEqual<UDlgTestObjectPrimitivesBase>(ObjectArrayPrimitivesBase, Other.ObjectArrayPrimitivesBase, PropertyName, OutError);\n\n\tPropertyName = TEXT(\"ObjectArrayPrimitivesAll\");\n\tbIsEqual &= FDlgTestHelper::IsComplexPointerArrayEqual<UDlgTestObjectPrimitivesBase>(ObjectArrayPrimitivesAll, Other.ObjectArrayPrimitivesAll, PropertyName, OutError);\n\n\tPropertyName = TEXT(\"ObjectArrayFrequentsNulls\");\n\tbIsEqual &= FDlgTestHelper::IsComplexPointerArrayEqual<UDlgTestObjectPrimitivesBase>(ObjectArrayFrequentsNulls, Other.ObjectArrayFrequentsNulls, PropertyName, OutError);\n\n\t// Clear error message\n\tif (bIsEqual)\n\t{\n\t\tOutError.Empty();\n\t}\n\treturn bIsEqual;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// FDlgTestSetPrimitive\nvoid FDlgTestSetPrimitive::GenerateRandomData(const FDlgIOTesterOptions& InOptions)\n{\n\tOptions = InOptions;\n\tNum1_Set = { FMath::Rand() };\n\tEmptySet.Empty();\n\tInt32Set.Empty();\n\tInt64Set.Empty();\n\tEnumSet.Empty();\n\tNameSet.Empty();\n\tStringSet.Empty();\n\n\tconst int32 Num = FMath::RandHelper(10) + 2;\n\tfor (int32 i = 0; i < Num; ++i)\n\t{\n\t\tInt32Set.Add(FMath::Rand());\n\t\tInt64Set.Add(FDlgHelper::RandomInt64());\n\t\tif (Options.bSupportsPureEnumContainer)\n\t\t{\n\t\t\tEnumSet.Add(static_cast<EDlgTestEnum>(FMath::RandHelper(static_cast<int32>(EDlgTestEnum::NumOf))));\n\t\t}\n\t\tconst float Float = FMath::SRand();\n\t\tconst FString String = FString::SanitizeFloat(Float);\n\t\tStringSet.Add(String);\n\t\tNameSet.Add(FName(*String));\n\t}\n}\n\nbool FDlgTestSetPrimitive::IsEqual(const Self& Other, FString& OutError) const\n{\n\tFString PropertyName;\n\tbool bIsEqual = true;\n\tOutError += TEXT(\"FDlgTestSetPrimitive::IsEqual:\\n\");\n\n\tPropertyName = TEXT(\"EmptySet\");\n\tif (EmptySet.Num() != Other.EmptySet.Num())\n\t{\n\t\tOutError = FString::Printf(TEXT(\"This.EmptySet.Num(%d) != Other.EmptySet.Num(%d). but why :O\"),\n\t\t\tEmptySet.Num(), Other.EmptySet.Num());\n\t\treturn false;\n\t}\n\n\tPropertyName = TEXT(\"Num1_Set\");\n\tbIsEqual &= FDlgTestHelper::IsSetEqual<int32>(Num1_Set, Other.Num1_Set, PropertyName, OutError, FDlgTestHelper::Int32ToString);\n\n\tPropertyName = TEXT(\"Int32Set\");\n\tbIsEqual &= FDlgTestHelper::IsSetEqual<int32>(Int32Set, Other.Int32Set, PropertyName, OutError, FDlgTestHelper::Int32ToString);\n\n\tPropertyName = TEXT(\"Int64Set\");\n\tbIsEqual &= FDlgTestHelper::IsSetEqual<int64>(Int64Set, Other.Int64Set, PropertyName, OutError, FDlgTestHelper::Int64ToString);\n\n\tPropertyName = TEXT(\"EnumSet\");\n\tbIsEqual &= FDlgTestHelper::IsSetEqual<EDlgTestEnum>(EnumSet, Other.EnumSet, PropertyName, OutError,\n\t\t[](const EDlgTestEnum& Value) -> FString { return FString::FromInt(static_cast<int32>(Value)); });\n\n\tPropertyName = TEXT(\"NameSet\");\n\tbIsEqual &= FDlgTestHelper::IsSetEqual<FName>(NameSet, Other.NameSet, PropertyName, OutError, FDlgTestHelper::NameToString);\n\n\tPropertyName = TEXT(\"StringSet\");\n\tbIsEqual &= FDlgTestHelper::IsSetEqual<FString>(StringSet, Other.StringSet, PropertyName, OutError, FDlgTestHelper::StringToString);\n\n\tif (bIsEqual)\n\t{\n\t\tOutError.Empty();\n\t}\n\treturn bIsEqual;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// FDlgTestSetStruct\nvoid FDlgTestSetComplex::GenerateRandomData(const FDlgIOTesterOptions& InOptions)\n{\n\tOptions = InOptions;\n\tStructSetPrimitives.Empty();\n\n\tif (!Options.bSupportsNonPrimitiveInSet)\n\t{\n\t\treturn;\n\t}\n\n\tconst int32 Num = FMath::RandHelper(10) + 2;\n\tfor (int32 i = 0; i < Num; ++i)\n\t{\n\t\tFDlgTestStructPrimitives StructPrimitives;\n\t\tStructPrimitives.GenerateRandomData(Options);\n\t\tStructSetPrimitives.Add(StructPrimitives);\n\t}\n}\n\nbool FDlgTestSetComplex::IsEqual(const Self& Other, FString& OutError) const\n{\n\tif (!Options.bSupportsNonPrimitiveInSet)\n\t{\n\t\treturn true;\n\t}\n\n\tFString PropertyName;\n\tbool bIsEqual = true;\n\tOutError += TEXT(\"FDlgTestSetStruct::IsEqual:\\n\");\n\n\tPropertyName = TEXT(\"StructSetPrimitives\");\n\tbIsEqual = bIsEqual && FDlgTestHelper::IsSetEqual<FDlgTestStructPrimitives>(StructSetPrimitives, Other.StructSetPrimitives, PropertyName, OutError,\n\t\t[](const FDlgTestStructPrimitives& Value) -> FString\n\t\t{\n\t\t\treturn FString::Printf(TEXT(\"Struct(%s)\"), *Value.ToString());\n\t\t});\n\n\t// Clear error message\n\tif (bIsEqual)\n\t{\n\t\tOutError.Empty();\n\t}\n\treturn bIsEqual;\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// FDlgTestMapPrimitive\nvoid FDlgTestMapPrimitive::GenerateRandomData(const FDlgIOTesterOptions& InOptions)\n{\n\tOptions = InOptions;\n\tEmptyMap.Empty();\n\tInt32ToInt32Map.Empty();\n\tInt64ToInt64Map.Empty();\n\tInt32ToStringMap.Empty();\n\tInt32ToNameMap.Empty();\n\tStringToInt32Map.Empty();\n\tStringToStringMap.Empty();\n\tNameToInt32Map.Empty();\n\tNameToNameMap.Empty();\n\tStringToFloatMap.Empty();\n\tInt32ToFloatMap.Empty();\n\tNameToColorMap.Empty();\n\tObjectConstantNullMap.Empty();\n\tObjectFrequentsNullsMap.Empty();\n\tObjectPrimitivesAllMap.Empty();\n\n\tstatic TArray<UClass*> ObjectPrimitiveClassPool = {\n\t\tUDlgTestObjectPrimitivesBase::StaticClass(), UDlgTestObjectPrimitives_ChildA::StaticClass(),\n\t\tUDlgTestObjectPrimitives_ChildB::StaticClass(), UDlgTestObjectPrimitives_GrandChildA_Of_ChildA::StaticClass(), nullptr\n\t};\n\tconst int32 Num = FMath::RandHelper(10) + 2;\n\tfor (int32 i = 0; i < Num; ++i)\n\t{\n\t\tInt32ToInt32Map.Add(FMath::Rand(), FMath::Rand());\n\t\tInt64ToInt64Map.Add(FDlgHelper::RandomInt64(), FDlgHelper::RandomInt64());\n\t\tInt32ToStringMap.Add(FMath::Rand(), FString::SanitizeFloat(FMath::SRand()));\n\t\tInt32ToNameMap.Add(FMath::Rand(), FName(*FString::SanitizeFloat(FMath::SRand())));\n\n\t\tStringToInt32Map.Add(FString::FromInt(FMath::Rand()), FMath::Rand());\n\t\tStringToStringMap.Add(FString::FromInt(FMath::Rand()), FString::FromInt(FMath::Rand()));\n\t\tNameToInt32Map.Add(FName(*FString::FromInt(FMath::Rand())), FMath::Rand());\n\t\tNameToNameMap.Add(FName(*FString::FromInt(FMath::Rand())), FName(*FString::FromInt(FMath::Rand())));\n\t\tStringToFloatMap.Add(FString::FromInt(FMath::Rand()), FMath::SRand());\n\t\tInt32ToFloatMap.Add(FMath::Rand(), FMath::SRand());\n\n\t\tObjectConstantNullMap.Add(FString::FromInt(FMath::Rand()), nullptr);\n\n\t\tif (Options.bSupportsColorPrimitives)\n\t\t{\n\t\t\tconst FColor Color(FMath::Rand());\n\t\t\tNameToColorMap.Add(FName(*FString::FromInt(FMath::Rand())), Color);\n\t\t}\n\n\t\t// ObjectArrayPrimitivesAll\n\t\tif (Options.bSupportsUObjectValueInMap)\n\t\t{\n\t\t\tUClass* ChosenClass = ObjectPrimitiveClassPool[FMath::RandHelper(ObjectPrimitiveClassPool.Num())];\n\t\t\tif (ChosenClass == nullptr)\n\t\t\t{\n\t\t\t\tObjectPrimitivesAllMap.Add(FString::FromInt(FMath::Rand()), nullptr);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tUDlgTestObjectPrimitivesBase* ObjectPrimitives = NewObject<UDlgTestObjectPrimitivesBase>((UObject*)GetTransientPackage(), ChosenClass);\n\t\t\t\tObjectPrimitives->GenerateRandomData(Options);\n\t\t\t\tObjectPrimitivesAllMap.Add(FString::FromInt(FMath::Rand()), ObjectPrimitives);\n\t\t\t}\n\t\t}\n\n\t\t// ObjectFrequentsNullsMap\n\t\tif (Options.bSupportsUObjectValueInMap)\n\t\t{\n\t\t\tconst bool bNull = FMath::RandBool();\n\t\t\tif (bNull)\n\t\t\t{\n\t\t\t\tObjectFrequentsNullsMap.Add(FString::FromInt(FMath::Rand()), nullptr);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tUDlgTestObjectPrimitivesBase* ObjectPrimitives = NewObject<UDlgTestObjectPrimitivesBase>();\n\t\t\t\tObjectPrimitives->GenerateRandomData(Options);\n\t\t\t\tObjectFrequentsNullsMap.Add(FString::FromInt(FMath::Rand()), ObjectPrimitives);\n\t\t\t}\n\t\t}\n\t}\n\tCheckInvariants();\n}\n\nvoid FDlgTestMapPrimitive::CheckInvariants() const\n{\n\tFDlgTestHelper::CheckMapStringKeyInvariants(StringToInt32Map);\n\tFDlgTestHelper::CheckMapStringKeyInvariants(StringToStringMap);\n\tFDlgTestHelper::CheckMapStringKeyInvariants(StringToFloatMap);\n\tFDlgTestHelper::CheckMapStringKeyInvariants(ObjectConstantNullMap);\n}\n\nbool FDlgTestMapPrimitive::IsEqual(const Self& Other, FString& OutError) const\n{\n\tCheckInvariants();\n\tOther.CheckInvariants();\n\n\tFString PropertyName;\n\tbool bIsEqual = true;\n\tOutError += TEXT(\"FDlgTestMapPrimitive::IsEqual:\\n\");\n\n\tPropertyName = TEXT(\"EmptyMap\");\n\tif (EmptyMap.Num() != Other.EmptyMap.Num())\n\t{\n\t\tOutError = FString::Printf(TEXT(\"This.EmptyMap.Num(%d) != Other.EmptyMap.Num(%d). but why :O\"),\n\t\t\tEmptyMap.Num(), Other.EmptyMap.Num());\n\t\treturn false;\n\t}\n\n\tPropertyName = TEXT(\"Int32ToInt32Map\");\n\tbIsEqual &= FDlgTestHelper::IsPrimitiveMapEqual<int32, int32>(Int32ToInt32Map, Other.Int32ToInt32Map, PropertyName, OutError,\n\t\tFDlgTestHelper::Int32ToString, FDlgTestHelper::Int32ToString);\n\n\tPropertyName = TEXT(\"Int64ToInt64Map\");\n\tbIsEqual &= FDlgTestHelper::IsPrimitiveMapEqual<int64, int64>(Int64ToInt64Map, Other.Int64ToInt64Map, PropertyName, OutError,\n\t\tFDlgTestHelper::Int64ToString, FDlgTestHelper::Int64ToString);\n\n\tPropertyName = TEXT(\"Int32ToStringMap\");\n\tbIsEqual &= FDlgTestHelper::IsPrimitiveMapEqual<int32, FString>(Int32ToStringMap, Other.Int32ToStringMap, PropertyName, OutError,\n\t\tFDlgTestHelper::Int32ToString, FDlgTestHelper::StringToString);\n\n\tPropertyName = TEXT(\"Int32ToNameMap\");\n\tbIsEqual &= FDlgTestHelper::IsPrimitiveMapEqual<int32, FName>(Int32ToNameMap, Other.Int32ToNameMap, PropertyName, OutError,\n\t\tFDlgTestHelper::Int32ToString, FDlgTestHelper::NameToString);\n\n\tPropertyName = TEXT(\"NameToInt32Map\");\n\tbIsEqual &= FDlgTestHelper::IsPrimitiveMapEqual<FName, int32>(NameToInt32Map, Other.NameToInt32Map, PropertyName, OutError,\n\t\tFDlgTestHelper::NameToString, FDlgTestHelper::Int32ToString);\n\n\tPropertyName = TEXT(\"NameToNameMap\");\n\tbIsEqual &= FDlgTestHelper::IsPrimitiveMapEqual<FName, FName>(NameToNameMap, Other.NameToNameMap, PropertyName, OutError,\n\t\tFDlgTestHelper::NameToString, FDlgTestHelper::NameToString);\n\n\tPropertyName = TEXT(\"StringToInt32Map\");\n\tbIsEqual &= FDlgTestHelper::IsPrimitiveMapEqual<FString, int32>(StringToInt32Map, Other.StringToInt32Map, PropertyName, OutError,\n\t\tFDlgTestHelper::StringToString, FDlgTestHelper::Int32ToString);\n\n\tPropertyName = TEXT(\"StringToStringMap\");\n\tbIsEqual &= FDlgTestHelper::IsPrimitiveMapEqual<FString, FString>(StringToStringMap, Other.StringToStringMap, PropertyName, OutError,\n\t\tFDlgTestHelper::StringToString, FDlgTestHelper::StringToString);\n\n\tPropertyName = TEXT(\"StringToFloatMap\");\n\tbIsEqual &= FDlgTestHelper::IsPrimitiveMapEqual<FString, float>(StringToFloatMap, Other.StringToFloatMap, PropertyName, OutError,\n\t\tFDlgTestHelper::StringToString, FDlgTestHelper::FloatToString);\n\n\tPropertyName = TEXT(\"IntToFloatMap\");\n\tbIsEqual &= FDlgTestHelper::IsPrimitiveMapEqual<int32, float>(Int32ToFloatMap, Other.Int32ToFloatMap, PropertyName, OutError,\n\t\tFDlgTestHelper::Int32ToString, FDlgTestHelper::FloatToString);\n\n\tPropertyName = TEXT(\"NameToColorMap\");\n\tbIsEqual &= FDlgTestHelper::IsPrimitiveMapEqual<FName, FColor>(NameToColorMap, Other.NameToColorMap, PropertyName, OutError,\n\t\tFDlgTestHelper::NameToString, FDlgTestHelper::ColorToString);\n\n\tPropertyName = TEXT(\"ObjectConstantNullMap\");\n\tbIsEqual &= FDlgTestHelper::IsComplexPointersMapEqual<FString, UDlgTestObjectPrimitivesBase>(ObjectConstantNullMap, Other.ObjectConstantNullMap, PropertyName, OutError,\n\t\tFDlgTestHelper::StringToString);\n\n\tPropertyName = TEXT(\"ObjectFrequentsNullsMap\");\n\tbIsEqual &= FDlgTestHelper::IsComplexPointersMapEqual<FString, UDlgTestObjectPrimitivesBase>(ObjectFrequentsNullsMap, Other.ObjectFrequentsNullsMap, PropertyName, OutError,\n\t\tFDlgTestHelper::StringToString);\n\n\tPropertyName = TEXT(\"ObjectPrimitivesAllMap\");\n\tbIsEqual &= FDlgTestHelper::IsComplexPointersMapEqual<FString, UDlgTestObjectPrimitivesBase>(ObjectPrimitivesAllMap, Other.ObjectPrimitivesAllMap, PropertyName, OutError,\n\t\tFDlgTestHelper::StringToString);\n\n\t// Clear error message\n\tif (bIsEqual)\n\t{\n\t\tOutError.Empty();\n\t}\n\treturn bIsEqual;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// FDlgTestMapStruct\nvoid FDlgTestMapComplex::GenerateRandomData(const FDlgIOTesterOptions& InOptions)\n{\n\tOptions = InOptions;\n\tInt32ToStructPrimitiveMap.Empty();\n\tStructPrimitiveToIntMap.Empty();\n\tNameToStructPrimitiveMap.Empty();\n\tNameToStructOfMapPrimitives.Empty();\n\tNameToStructOfArrayPrimitives.Empty();\n\tNameToStructOfSetPrimitives.Empty();\n\tNameToStructOfArrayComplex.Empty();\n\tNameToStructOfSetComplex.Empty();\n\n\tconst int32 Num = FMath::RandHelper(10) + 2;\n\tfor (int32 i = 0; i < Num; ++i)\n\t{\n\t\tconst FString StringKey = FString::FromInt(FMath::Rand());\n\t\tFDlgTestStructPrimitives StructPrimitives;\n\t\tStructPrimitives.GenerateRandomData(Options);\n\n\t\tInt32ToStructPrimitiveMap.Add(FMath::Rand(), StructPrimitives);\n\t\tNameToStructPrimitiveMap.Add(FName(*StringKey), StructPrimitives);\n\t\tStructPrimitiveToIntMap.Add(StructPrimitives, FMath::Rand());\n\n\t\tFDlgTestMapPrimitive MapPrimitive;\n\t\tMapPrimitive.GenerateRandomData(Options);\n\t\tNameToStructOfMapPrimitives.Add(FName(*StringKey), MapPrimitive);\n\n\t\tFDlgTestArrayPrimitive ArrayPrimitive;\n\t\tArrayPrimitive.GenerateRandomData(Options);\n\t\tNameToStructOfArrayPrimitives.Add(FName(*StringKey), ArrayPrimitive);\n\n\t\tFDlgTestSetPrimitive SetPrimitive;\n\t\tSetPrimitive.GenerateRandomData(Options);\n\t\tNameToStructOfSetPrimitives.Add(FName(*StringKey), SetPrimitive);\n\n\t\tFDlgTestArrayComplex ArrayComplex;\n\t\tArrayComplex.GenerateRandomData(Options);\n\t\tNameToStructOfArrayComplex.Add(FName(*StringKey), ArrayComplex);\n\n\t\tFDlgTestSetComplex SetComplex;\n\t\tSetComplex.GenerateRandomData(Options);\n\t\tNameToStructOfSetComplex.Add(FName(*StringKey), SetComplex);\n\t}\n}\n\nbool FDlgTestMapComplex::IsEqual(const Self& Other, FString& OutError) const\n{\n\tFString PropertyName;\n\tbool bIsEqual = true;\n\tOutError += TEXT(\"FDlgTestMapStruct::IsEqual:\\n\");\n\n\tauto StructPrimitiveToString = [](const FDlgTestStructPrimitives& Value) -> FString\n\t{\n\t\treturn FString::Printf(TEXT(\"Struct(%s)\"), *Value.ToString());\n\t};\n\tauto StructMapPrimitiveToString = [](const FDlgTestMapPrimitive& Value) -> FString\n\t{\n\t\treturn TEXT(\"FDlgTestMapPrimitive\");\n\t};\n\tauto StructArrayPrimitiveToString = [](const FDlgTestArrayPrimitive& Value) -> FString\n\t{\n\t\treturn TEXT(\"FDlgTestArrayPrimitive\");\n\t};\n\tauto StructSetPrimitiveToString = [](const FDlgTestSetPrimitive& Value) -> FString\n\t{\n\t\treturn TEXT(\"FDlgTestSetPrimitive\");\n\t};\n\tauto StructArrayComplexToString = [](const FDlgTestArrayComplex& Value) -> FString\n\t{\n\t\treturn TEXT(\"FDlgTestArrayComplex\");\n\t};\n\tauto StructSetComplexToString = [](const FDlgTestSetComplex& Value) -> FString\n\t{\n\t\treturn TEXT(\"FDlgTestSetComplex\");\n\t};\n\n\tPropertyName = TEXT(\"Int32ToStructPrimitiveMap\");\n\tbIsEqual &= FDlgTestHelper::IsComplexMapValueEqual<int32, FDlgTestStructPrimitives>(Int32ToStructPrimitiveMap, Other.Int32ToStructPrimitiveMap, PropertyName, OutError,\n\t\tFDlgTestHelper::Int32ToString, StructPrimitiveToString);\n\n\tPropertyName = TEXT(\"NameToStructPrimitiveMap\");\n\tbIsEqual &= FDlgTestHelper::IsComplexMapValueEqual<FName, FDlgTestStructPrimitives>(NameToStructPrimitiveMap, Other.NameToStructPrimitiveMap, PropertyName, OutError,\n\t\tFDlgTestHelper::NameToString, StructPrimitiveToString);\n\n\tPropertyName = TEXT(\"StructPrimitiveToIntMap\");\n\tbIsEqual &= FDlgTestHelper::IsPrimitiveMapEqual<FDlgTestStructPrimitives, int32>(StructPrimitiveToIntMap, Other.StructPrimitiveToIntMap, PropertyName, OutError,\n\t\tStructPrimitiveToString, FDlgTestHelper::Int32ToString);\n\n\tPropertyName = TEXT(\"NameToStructOfMapPrimitives\");\n\tbIsEqual &= FDlgTestHelper::IsComplexMapValueEqual<FName, FDlgTestMapPrimitive>(NameToStructOfMapPrimitives, Other.NameToStructOfMapPrimitives, PropertyName, OutError,\n\t\tFDlgTestHelper::NameToString, StructMapPrimitiveToString);\n\n\tPropertyName = TEXT(\"NameToStructOfArrayPrimitives\");\n\tbIsEqual &= FDlgTestHelper::IsComplexMapValueEqual<FName, FDlgTestArrayPrimitive>(NameToStructOfArrayPrimitives, Other.NameToStructOfArrayPrimitives, PropertyName, OutError,\n\t\tFDlgTestHelper::NameToString, StructArrayPrimitiveToString);\n\n\tPropertyName = TEXT(\"NameToStructOfSetPrimitives\");\n\tbIsEqual &= FDlgTestHelper::IsComplexMapValueEqual<FName, FDlgTestSetPrimitive>(NameToStructOfSetPrimitives, Other.NameToStructOfSetPrimitives, PropertyName, OutError,\n\t\tFDlgTestHelper::NameToString, StructSetPrimitiveToString);\n\n\tPropertyName = TEXT(\"NameToStructOfArrayComplex\");\n\tbIsEqual &= FDlgTestHelper::IsComplexMapValueEqual<FName, FDlgTestArrayComplex>(NameToStructOfArrayComplex, Other.NameToStructOfArrayComplex, PropertyName, OutError,\n\t\tFDlgTestHelper::NameToString, StructArrayComplexToString);\n\n\tPropertyName = TEXT(\"NameToStructOfSetComplex\");\n\tbIsEqual &= FDlgTestHelper::IsComplexMapValueEqual<FName, FDlgTestSetComplex>(NameToStructOfSetComplex, Other.NameToStructOfSetComplex, PropertyName, OutError,\n\t\tFDlgTestHelper::NameToString, StructSetComplexToString);\n\n\t// Clear error message\n\tif (bIsEqual)\n\t{\n\t\tOutError.Empty();\n\t}\n\treturn bIsEqual;\n}\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystem/Private/Tests/DlgTesterHelper.cpp",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#include \"Tests/DlgTesterHelper.h\"\n\n\nstd::function<FString(const int32&)> FDlgTestHelper::Int32ToString = [](const int32& Value) -> FString\n{\n\treturn FString::FromInt(Value);\n};\n\nstd::function<FString(const int64&)> FDlgTestHelper::Int64ToString = [](const int64& Value) -> FString\n{\n\treturn FString::Printf(TEXT(\"%lld\"), Value);\n};\n\n\nstd::function<FString(const FName&)> FDlgTestHelper::NameToString = [](const FName& Value) -> FString\n{\n\treturn Value.ToString();\n};\n\nstd::function<FString(const FString&)> FDlgTestHelper::StringToString = [](const FString& Value) -> FString\n{\n\treturn Value;\n};\n\nstd::function<FString(const float&)> FDlgTestHelper::FloatToString = [](const float& Value) -> FString\n{\n\treturn FString::SanitizeFloat(Value);\n};\n\nstd::function<FString(const FVector&)> FDlgTestHelper::VectorToString = [](const FVector& Value) -> FString\n{\n\treturn Value.ToString();\n};\n\nstd::function<FString(const FColor&)> FDlgTestHelper::ColorToString = [](const FColor& Value) -> FString\n{\n\treturn Value.ToString();\n};\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystem/Public/DlgCondition.h",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#pragma once\n\n#include \"CoreMinimal.h\"\n#include \"DlgConditionCustom.h\"\n\n\n#include \"DlgCondition.generated.h\"\n\nclass IDlgDialogueParticipant;\nclass UDlgContext;\n\n// Defines the way the condition is interpreted inside a condition array\nUENUM(BlueprintType)\nenum class EDlgConditionStrength : uint8\n{\n\t/// All strong condition must be satisfied inside the condition array\n\t// Aka an AND condition\n\tStrong = 0\t\tUMETA(DisplayName = \"Strong Condition (AND Condition)\"),\n\n\t// At least one of the weak conditions must be satisfied inside the condition array (if there is any)\n\t// Aka an OR condition\n\tWeak\t\t\tUMETA(DisplayName = \"Weak Condition (OR Condition)\"),\n};\n\n// The Type of condition FDlgCondition is based upon\nUENUM(BlueprintType)\nenum class EDlgConditionType : uint8\n{\n\t// Calls GetIntValue on the Participant\n\tIntCall = 0\t\tUMETA(DisplayName = \"Check Dialogue Int Value\"),\n\n\t// Calls GetFloatValue on the Participant\n\tFloatCall\t\tUMETA(DisplayName = \"Check Dialogue Float Value\"),\n\n\t// Calls GetBoolValue on the Participant\n\tBoolCall\t\tUMETA(DisplayName = \"Check Dialogue Bool Value\"),\n\n\t// Calls GetNameValue on the Participant\n\tNameCall\t\tUMETA(DisplayName = \"Check Dialogue Name Value\"),\n\n\t// A named condition call.\n\t// Calls CheckCondition on the Participant\n\tEventCall\t\tUMETA(DisplayName = \"Check Dialogue Named Condition\"),\n\n\t// Gets the value from the Participant Int Variable\n\tClassIntVariable\tUMETA(DisplayName = \"Check Class Int Variable\"),\n\n\t// Gets the value from the Participant Float Variable\n\tClassFloatVariable\tUMETA(DisplayName = \"Check Class Float Variable\"),\n\n\t// Gets the value from the Participant Bool Variable\n\tClassBoolVariable\tUMETA(DisplayName = \"Check Class Bool Variable\"),\n\n\t// Gets the value from the Participant Name Variable\n\tClassNameVariable\tUMETA(DisplayName = \"Check Class Name Variable\"),\n\n\t// Checks if the target node was already visited\n\tWasNodeVisited\t\tUMETA(DisplayName = \"Was node already visited?\"),\n\n\t// Checks if the target node has any satisfied child\n\tHasSatisfiedChild\tUMETA(DisplayName = \"Has satisfied child?\"),\n\n\t// User Defined Condition, calls IsConditionMet on the custom condition object.\n\t//\n\t// 1. Create a new Blueprint derived from DlgConditionCustom (or DlgConditionCustomHideCategories)\n\t// 2. Override IsConditionMet\n\t// 3. Return true if you want the condition to succeed or false otherwise\n\tCustom\t\t\t\tUMETA(DisplayName = \"Custom Condition\")\n};\n\n// Operation the return value of a IntCall/FloatCall is checked with\nUENUM(BlueprintType)\nenum class EDlgOperation : uint8\n{\n\tEqual = 0\t\tUMETA(DisplayName = \"== (Is Equal To)\"),\n\tNotEqual\t\tUMETA(DisplayName = \"!= (Is Not Equal To)\"),\n\tLess\t\t\tUMETA(DisplayName = \"<  (Is Less Than)\"),\n\tLessOrEqual\t\tUMETA(DisplayName = \"<= (Is Less Than Or Equal To)\"),\n\tGreater\t\t\tUMETA(DisplayName = \">  (Is Greater Than)\"),\n\tGreaterOrEqual\tUMETA(DisplayName = \">= (Is Greater Than Or Equal To)\"),\n};\n\n// Type of value the participant's value is checked against\nUENUM(BlueprintType)\nenum class EDlgCompare : uint8\n{\n\t// Compares against a constat value\n\tToConst = 0\t\t\tUMETA(DisplayName = \"Compare to Constant\"),\n\n\t// Compares against a Dialogue Value\n\tToVariable\t\t\tUMETA(DisplayName = \"Compare to Dialogue Value\"),\n\n\t// Compares against a Participant Class Variable\n\tToClassVariable\t\tUMETA(DisplayName = \"Compare to Class Variable\")\n};\n\n\n// A condition is a logical operation which is evaluated based on a participant or on the local (context based) or global dialogue memory.\n// More conditions are stored together in condition arrays in FDlgEdge and in UDlgNode, the node (or the edge's target node) is only visitable\n// if the condition array is satisfied\nUSTRUCT(Blueprintable)\nstruct DLGSYSTEM_API FDlgCondition\n{\n\tGENERATED_USTRUCT_BODY()\n\npublic:\n\t//\n\t// ICppStructOps Interface\n\t//\n\tbool operator==(const FDlgCondition& Other) const\n\t{\n\t\treturn Strength == Other.Strength &&\n\t\t\tConditionType == Other.ConditionType &&\n\t\t\tParticipantName == Other.ParticipantName &&\n\t\t\tCallbackName == Other.CallbackName &&\n\t\t\tIntValue == Other.IntValue &&\n\t\t\tFMath::IsNearlyEqual(FloatValue, Other.FloatValue) &&\n\t\t\tNameValue == Other.NameValue &&\n\t\t\tbBoolValue == Other.bBoolValue &&\n\t\t\tbLongTermMemory == Other.bLongTermMemory &&\n\t\t\tOperation == Other.Operation &&\n\t\t\tCompareType == Other.CompareType &&\n\t\t\tOtherParticipantName == Other.OtherParticipantName &&\n\t\t\tOtherVariableName == Other.OtherVariableName &&\n\t\t\tGUID == Other.GUID &&\n\t\t\tCustomCondition == Other.CustomCondition;\n\t}\n\n\t//\n\t// Own methods\n\t//\n\n\tstatic bool EvaluateArray(const UDlgContext& Context, const TArray<FDlgCondition>& ConditionsArray, FName DefaultParticipantName = NAME_None);\n\tbool IsConditionMet(const UDlgContext& Context, const UObject* Participant) const;\n\n\t// returns true if ParticipantName has to belong to match with a valid Participant in order for the condition type to work */\n\tbool IsParticipantInvolved() const;\n\tbool IsSecondParticipantInvolved() const;\n\n\t// Does this Condition have a IntValue which is in fact a NodeIndex\n\tstatic bool HasNodeIndex(EDlgConditionType ConditionType)\n\t{\n\t\treturn ConditionType == EDlgConditionType::WasNodeVisited\n\t\t\t|| ConditionType == EDlgConditionType::HasSatisfiedChild;\n\t}\n\n\t// Is this a Condition which has a Dialogue Value\n\t// NOTE: without EDlgConditionType::EventCall, for that call HasParticipantInterfaceValue\n\tstatic bool HasDialogueValue(EDlgConditionType Type)\n\t{\n\t\treturn Type == EDlgConditionType::BoolCall\n\t\t    || Type == EDlgConditionType::FloatCall\n\t\t    || Type == EDlgConditionType::IntCall\n\t\t    || Type == EDlgConditionType::NameCall;\n\t}\n\n\t// Same as HasDialogueValue but also Has the Event\n\tstatic bool HasParticipantInterfaceValue(EDlgConditionType Type)\n\t{\n\t\treturn Type == EDlgConditionType::EventCall || HasDialogueValue(Type);\n\t}\n\n\t// Is this a Condition which has a Class Variable\n\tstatic bool HasClassVariable(EDlgConditionType Type)\n\t{\n\t\treturn Type == EDlgConditionType::ClassBoolVariable\n            || Type == EDlgConditionType::ClassFloatVariable\n            || Type == EDlgConditionType::ClassIntVariable\n            || Type == EDlgConditionType::ClassNameVariable;\n\t}\n\n\t// Does the type for FirstType and SecondType match?\n\t// Aka are both for int, float, bool, name?\n\tstatic bool IsSameValueType(EDlgConditionType FirstType, EDlgConditionType SecondType)\n\t{\n\t\tif (FirstType == EDlgConditionType::BoolCall || FirstType == EDlgConditionType::ClassBoolVariable)\n\t\t{\n\t\t\treturn SecondType == EDlgConditionType::BoolCall || SecondType == EDlgConditionType::ClassBoolVariable;\n\t\t}\n\t\tif (FirstType == EDlgConditionType::IntCall || FirstType == EDlgConditionType::ClassIntVariable)\n\t\t{\n\t\t\treturn SecondType == EDlgConditionType::IntCall || SecondType == EDlgConditionType::ClassIntVariable;\n\t\t}\n\t\tif (FirstType == EDlgConditionType::FloatCall || FirstType == EDlgConditionType::ClassFloatVariable)\n\t\t{\n\t\t\treturn SecondType == EDlgConditionType::FloatCall || SecondType == EDlgConditionType::ClassFloatVariable;\n\t\t}\n\t\tif (FirstType == EDlgConditionType::NameCall || FirstType == EDlgConditionType::ClassNameVariable)\n\t\t{\n\t\t\treturn SecondType == EDlgConditionType::NameCall || SecondType == EDlgConditionType::ClassNameVariable;\n\t\t}\n\n\t\treturn false;\n\t}\n\n\tstatic FString ConditionTypeToString(EDlgConditionType Type);\n\nprotected:\n\t//\n\t// Helper functions doing the check on the primary value based on EDlgCompare\n\t//\n\n\tbool CheckFloat(const UDlgContext& Context, float Value) const;\n\tbool CheckInt(const UDlgContext& Context, int32 Value) const;\n\tbool CheckBool(const UDlgContext& Context, bool bValue) const;\n\tbool CheckName(const UDlgContext& Context, FName Value) const;\n\n\t// Checks Participant, prints warning if it is nullptr\n\tbool ValidateIsParticipantValid(const UDlgContext& Context, const FString& ContextString, const UObject* Participant) const;\n\npublic:\n\t// Defines the way the condition is interpreted inside the condition array\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = \"Dialogue|Condition\")\n\tEDlgConditionStrength Strength = EDlgConditionStrength::Strong;\n\n\t// Type of the condition, defines the behavior\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = \"Dialogue|Condition\")\n\tEDlgConditionType ConditionType = EDlgConditionType::IntCall;\n\n\t// Name of the participant (speaker) the event is called on.\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = \"Dialogue|Condition\")\n\tFName ParticipantName;\n\n\t// Name of the variable or event, passed in the function call to the participant\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = \"Dialogue|Condition\")\n\tFName CallbackName;\n\n\t// The desired operation on the selected variable\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = \"Dialogue|Condition\")\n\tEDlgOperation Operation = EDlgOperation::Equal;\n\n\t// Type of value to check against\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = \"Dialogue|Condition\")\n\tEDlgCompare CompareType = EDlgCompare::ToConst;\n\n\t// Name of the other participant (speaker) the check is performed against (with some compare types)\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = \"Dialogue|Condition\")\n\tFName OtherParticipantName;\n\n\t// Name of the variable of the other participant the value is checked against (with some compare types)\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = \"Dialogue|Condition\")\n\tFName OtherVariableName;\n\n\t// Node index for \"node already visited\" condition, the value the participant's int is checked against otherwise\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = \"Dialogue|Condition\")\n\tint32 IntValue = 0;\n\n\t// Float the participants float is checked against\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = \"Dialogue|Condition\")\n\tfloat FloatValue = 0.f;\n\n\t// FName the participants name is checked against\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = \"Dialogue|Condition\")\n\tFName NameValue;\n\n\t// Weather the result defined by the other params has to be true or false in order for this condition to be satisfied\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = \"Dialogue|Condition\")\n\tbool bBoolValue = true;\n\n\t// Weather to check if the node was visited at all (in the long term).\n\t// Set it to false to check if it was visited in the actual dialogue context\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = \"Dialogue|Condition\")\n\tbool bLongTermMemory = true;\n\n\t// GUID for the Node, used for \"node already visited\"\n\tUPROPERTY(VisibleAnywhere, BlueprintReadWrite, Category = \"Dialogue|Condition\")\n\tFGuid GUID;\n\n\t// User Defined Condition, calls IsConditionMet on the custom condition object.\n\t//\n\t// 1. Create a new Blueprint derived from DlgConditionCustom (or DlgConditionCustomHideCategories)\n\t// 2. Override IsConditionMet\n\t// 3. Return true if you want the condition to succeed or false otherwise\n\tUPROPERTY(Instanced, EditAnywhere, BlueprintReadWrite, Category = \"Dialogue|Condition\")\n\tUDlgConditionCustom* CustomCondition = nullptr;\n};\n\ntemplate<>\nstruct TStructOpsTypeTraits<FDlgCondition> : public TStructOpsTypeTraitsBase2<FDlgCondition>\n{\n\tenum\n\t{\n\t\tWithIdenticalViaEquality = true\n\t};\n};\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystem/Public/DlgConditionCustom.h",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#pragma once\n#include \"DlgObject.h\"\n\n#include \"DlgConditionCustom.generated.h\"\n\nclass UDlgContext;\n\n// Abstract base class for a custom condition\n// Extend this class to define additional data you want to store\n//\n// 1. Override IsConditionMet\n// 2. Return true if you want the condition to succeed or false otherwise\nUCLASS(Blueprintable, BlueprintType, Abstract, EditInlineNew)\nclass DLGSYSTEM_API UDlgConditionCustom : public UDlgObject\n{\n\tGENERATED_BODY()\npublic:\n\t// Checks if the condition is met\n\tUFUNCTION(BlueprintCallable, BlueprintNativeEvent, Category = \"Dialogue\")\n\tbool IsConditionMet(const UDlgContext* Context, const UObject* Participant);\n\tvirtual bool IsConditionMet_Implementation(const UDlgContext* Context, const UObject* Participant)\n\t{\n\t\treturn false;\n\t}\n};\n\n// This is the same as UDlgConditionCustom but it does NOT show the categories\nUCLASS(Blueprintable, BlueprintType, Abstract, EditInlineNew, CollapseCategories)\nclass DLGSYSTEM_API UDlgConditionCustomHideCategories : public UDlgConditionCustom\n{\n\tGENERATED_BODY()\n};\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystem/Public/DlgConstants.h",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#pragma once\n\n#include \"CoreMinimal.h\"\n\nstatic const FName DIALOGUE_SYSTEM_MENU_CATEGORY_KEY(TEXT(\"Dialogue System\"));\nstatic const FText DIALOGUE_SYSTEM_MENU_CATEGORY_KEY_TEXT(NSLOCTEXT(\"DlgSystemEditor\", \"DlgSystemAssetCategory\", \"Dialogue System\"));\n\nstatic const FName OTHER_DIALOGUE_SYSTEM_MENU_CATEGORY_KEY(TEXT(\"Other Dialogue System\"));\nstatic const FText OTHER_DIALOGUE_SYSTEM_MENU_CATEGORY_KEY_TEXT(NSLOCTEXT(\"OtherDlgSystemEditor\", \"OtherDlgSystemAssetCategory\", \"OtherDialogue System\"));\n\n// DlgDataDisplay TabID\nstatic const FName DIALOGUE_DATA_DISPLAY_TAB_ID(TEXT(\"DlgDataDisplayWindow\"));\n\n// Other Modules constants\nstatic const FName NAME_MODULE_AssetTools(TEXT(\"AssetTools\"));\nstatic const FName NAME_MODULE_AssetRegistry(TEXT(\"AssetRegistry\"));\nstatic const FName NAME_MODULE_LevelEditor(TEXT(\"LevelEditor\"));\nstatic const FName NAME_MODULE_PropertyEditor(TEXT(\"PropertyEditor\"));\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystem/Public/DlgContext.h",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#pragma once\n\n#include \"DlgObject.h\"\n#include \"DlgDialogue.h\"\n#include \"Nodes/DlgNode.h\"\n#include \"DlgMemory.h\"\n\n#include \"DlgContext.generated.h\"\n\nclass USoundWave;\nclass USoundBase;\nclass UDialogueWave;\nclass UTexture2D;\nclass UDlgNodeData;\nclass UDlgNode;\nclass UDlgNode_SpeechSequence;\n\n// Used to store temporary state of edges\n// This represents a const version of an Edge\nUSTRUCT(BlueprintType)\nstruct DLGSYSTEM_API FDlgEdgeData\n{\n\tGENERATED_USTRUCT_BODY()\npublic:\n\tFDlgEdgeData() {}\n\tFDlgEdgeData(bool bInSatisfied, const FDlgEdge& InEdge) : bSatisfied(bInSatisfied), Edge(InEdge) {};\n\n\tbool IsValid() const { return Edge.IsValid(); }\n\tbool IsSatisfied() const { return bSatisfied; }\n\tconst FDlgEdge& GetEdge() const { return Edge; }\n\n\tstatic const FDlgEdgeData& GetInvalidEdge()\n\t{\n\t\tstatic FDlgEdgeData DlgEdge{false, FDlgEdge::GetInvalidEdge()};\n\t\treturn DlgEdge;\n\t}\n\n\t// FDlgEdge& GetMutableEdge() { return *EdgePtr; }\n\nprotected:\n\tUPROPERTY(BlueprintReadOnly, Category = \"Dialogue|Edge\")\n\tbool bSatisfied = false;\n\n\tUPROPERTY(BlueprintReadOnly, Category = \"Dialogue|Edge\")\n\tFDlgEdge Edge;\n};\n\n\nUENUM()\nenum class EDlgValidateStatus : uint8\n{\n\tValid = 0,\n\n\t// Either the participant or dialogue is invalid\n\tParticipantIsNull,\n\tDialogueIsNull,\n\n\t// Is an instance but does not implement the UDlgDialogueParticipant interface\n\tParticipantDoesNotImplementInterface,\n\n\t// Is a blueprint class from the content browser and does not implement the UDlgDialogueParticipant interface\n\tParticipantIsABlueprintClassAndDoesNotImplementInterface,\n\n\t// The Participant does not exist in the Dialogue\n\t// DialogueDoesNotContainParticipant\n};\n\n/**\n *  Class representing an active dialogue, can be used to gain information and to control it\n *  Should be controlled from Player Character/Player controller\n *  For starting a dialogue check UDlgManager - the proper function creates an UDlgContext for you\n *\n *  Call ChooseOption() if an option is selected\n *  If the return value is false the dialogue is over and the context should be dropped\n *  This abstract class contains the outer functionality only\n */\nUCLASS(BlueprintType)\nclass DLGSYSTEM_API UDlgContext : public UDlgObject\n{\n\tGENERATED_BODY()\npublic:\n\n\t//\n\t// UObject Interface\n\t//\n\n\tvoid PostInitProperties() override { Super::PostInitProperties(); }\n\n\tUDlgContext(const FObjectInitializer& ObjectInitializer);\n\n\t// Network support\n\tbool IsSupportedForNetworking() const override { return true; };\n\tvoid GetLifetimeReplicatedProps(TArray<FLifetimeProperty>& OutLifetimeProps) const override;\n\n\t//\n\t// Own methods\n\t//\n\n\tUFUNCTION()\n\tvoid OnRep_SerializedParticipants();\n\tvoid SerializeParticipants();\n\n\tUE_DEPRECATED(4.22, \"ChooseChild has been deprecated in Favour of ChooseOption\")\n\tUFUNCTION(BlueprintCallable, Category = \"Dialogue|Control\", meta = (DeprecatedFunction, DeprecationMessage = \"ChooseChild has been deprecated in favour of ChooseOption\"))\n\tbool ChooseChild(int32 OptionIndex) { return ChooseOption(OptionIndex); }\n\n\t/**\n\t* Chooses the option with index OptionIndex of the active node index and it enters that node.\n\t* Typically called based on user input.\n\t* NOTICE: If the return value is false the dialogue is over and the context should be dropped\n\t*\n\t* @return true if the dialogue did not end, false otherwise\n\t*/\n\tUFUNCTION(BlueprintCallable, Category = \"Dialogue|Control\")\n\tbool ChooseOption(int32 OptionIndex);\n\n\t/**\n\t * Chooses the option with OptionIndex that is replicated\n\t * NOTE: the ActiveNodeIndex must be a speech sequence node, otherwise the dialogue will end\n\t *\n\t * @return true if the dialogue did not end, false otherwise\n\t */\n\tUFUNCTION(BlueprintCallable, Category = \"Dialogue|Control\")\n\tbool ChooseSpeechSequenceOptionFromReplicated(int32 OptionIndex);\n\n\tUE_DEPRECATED(4.22, \"ChooseChildBasedOnAllOptionIndex has been deprecated in Favour of ChooseOptionBasedOnAllOptionIndex\")\n\tUFUNCTION(BlueprintCallable, Category = \"Dialogue|Control|All\", meta = (DeprecatedFunction, DeprecationMessage = \"ChooseChildBasedOnAllOptionIndex has been deprecated in Favour of ChooseOptionBasedOnAllOptionIndex\"))\n\tbool ChooseChildBasedOnAllOptionIndex(int32 Index) { return ChooseOptionBasedOnAllOptionIndex(Index); }\n\n\t/**\n\t *  Exactly as ChooseChild but expects an index from the AllOptions array\n\t *  If the index is invalid or the selected edge is not satisfied the call fails\n\t */\n\tUFUNCTION(BlueprintCallable, Category = \"Dialogue|Control|All\")\n\tbool ChooseOptionBasedOnAllOptionIndex(int32 Index);\n\n\tUE_DEPRECATED(4.22, \"ReevaluateChildren has been deprecated in Favour of ReevaluateOptions\")\n\tUFUNCTION(BlueprintCallable, Category = \"Dialogue|Control\", meta = (DeprecatedFunction, DeprecationMessage = \"ReevaluateChildren has been deprecated in Favour of ReevaluateOptions\"))\n\tbool ReevaluateChildren() { return ReevaluateOptions(); }\n\n\t/**\n\t * Normally the options of the active node are checked only once, when the conversation enters the node.\n\t * If an option can appear/disappear real time in the middle of the conversation this function should be called manually each frame\n\t */\n\tUFUNCTION(BlueprintCallable, Category = \"Dialogue|Control\")\n\tbool ReevaluateOptions();\n\n\tUFUNCTION(BlueprintPure, Category = \"Dialogue|Control\")\n\tbool HasDialogueEnded() const { return bDialogueEnded; }\n\n\t//\n\t// Use these functions if you don't care about unsatisfied player options:\n\t//\n\n\t// Gets the number of options with satisfied conditions (number of options)\n\tUFUNCTION(BlueprintPure, Category = \"Dialogue|Options|Satisfied\")\n\tint32 GetOptionsNum() const { return AvailableChildren.Num(); }\n\n\t// Is the OptionIndex valid index for the satisfied conditions?\n\tUFUNCTION(BlueprintPure, Category = \"Dialogue|Options|Satisfied\")\n\tbool IsValidOptionIndex(int32 OptionIndex) const { return AvailableChildren.IsValidIndex(OptionIndex);  }\n\n\t// Gets the Text of the (satisfied) option with index OptionIndex\n\t// NOTE: This is just a helper method, you could have called GetOption\n\tUFUNCTION(BlueprintPure, Category = \"Dialogue|Options|Satisfied\")\n\tconst FText& GetOptionText(int32 OptionIndex) const;\n\n\t// Gets the SpeakerState of the (satisfied) edge with index OptionIndex\n\t// NOTE: This is just a helper method, you could have called GetOption\n\tUFUNCTION(BlueprintPure, Category = \"Dialogue|Options|Satisfied\")\n\tFName GetOptionSpeakerState(int32 OptionIndex) const;\n\n\t// Gets the Enter Conditions of the (satisfied) edge with index OptionIndex\n\t// NOTE: This is just a helper method, you could have called GetOption\n\tUFUNCTION(BlueprintPure, Category = \"Dialogue|Options|Satisfied\")\n\tconst TArray<FDlgCondition>& GetOptionEnterConditions(int32 OptionIndex) const;\n\n\t// Gets the edge representing a player option from the satisfied options\n\tUFUNCTION(BlueprintPure, Category = \"Dialogue|Options|Satisfied\")\n\tconst FDlgEdge& GetOption(int32 OptionIndex) const;\n\n\t// Gets all satisfied edges\n\tUFUNCTION(BlueprintPure, Category = \"Dialogue|Options|Satisfied\")\n\tconst TArray<FDlgEdge>& GetOptionsArray() const { return AvailableChildren; }\n\tTArray<FDlgEdge>& GetMutableOptionsArray() { return AvailableChildren; }\n\n\t//\n\t//  Use these functions bellow if you don't care about unsatisfied player options:\n\t//  DO NOT missuse the indices above and bellow! The functions above expect < GetOptionsNum(), bellow < GetAllOptionsNum()\n\t//\n\n\t// Gets the number of options (both satisfied and unsatisfied ones are counted)\n\tUFUNCTION(BlueprintPure, Category = \"Dialogue|Options|All\")\n\tint32 GetAllOptionsNum() const { return AllChildren.Num(); }\n\n\t// Is the Index valid index for both satisfied and unsatisfied conditions\n\tUFUNCTION(BlueprintPure, Category = \"Dialogue|Options|All\")\n\tbool IsValidAllOptionIndex(int32 Index) const { return AllChildren.IsValidIndex(Index);  }\n\n\t// Gets the Text of an option from the all list, which includes the unsatisfied ones as well\n\tUFUNCTION(BlueprintPure, Category = \"Dialogue|Options|All\")\n\tconst FText& GetOptionTextFromAll(int32 Index) const;\n\n\t// Is the option at Index satisfied? (Does it meet all the conditions)\n\tUFUNCTION(BlueprintPure, Category = \"Dialogue|Options|All\")\n\tbool IsOptionSatisfied(int32 Index) const;\n\n\t// Gets the SpeakerState of the edge with index OptionIndex\n\tUFUNCTION(BlueprintPure, Category = \"Dialogue|Options|All\")\n\tFName GetOptionSpeakerStateFromAll(int32 Index) const;\n\n\t// Gets the edge representing a player option from all options\n\tUFUNCTION(BlueprintPure, Category = \"Dialogue|Options|All\")\n\tconst FDlgEdgeData& GetOptionFromAll(int32 Index) const;\n\n\t// Gets all edges (both satisfied and unsatisfied)\n\tUFUNCTION(BlueprintPure, Category = \"Dialogue|Options|All\")\n\tconst TArray<FDlgEdgeData>& GetAllOptionsArray() const { return AllChildren; }\n\tTArray<FDlgEdgeData>& GetAllMutableOptionsArray() { return AllChildren; }\n\n\t/**\n\t*  Checks if the node connected directly to one of the active player choices was already visited or not\n\t*  Does not handle complicated logic - if the said node is a logical one it will still check that node, and not one\n\t*  of its options\n\t*\n\t* @param Index  Index of the edge/player option to test\n\t* @param bLocalHistory If true, only the history of this dialogue context is checked. If false, it is a global check\n\t* @param bIndexSkipsUnsatisfiedEdges  Decides if the index is in the [0, GetOptionsNum()[ interval (if true), or in the [0, GetAllOptionsNum()[ (if false)\n\t* @return true if the node was already IsOptionConnectedToVisitedNode\n\t*/\n\tUFUNCTION(BlueprintPure, Category = \"Dialogue|Data\")\n\tbool IsOptionConnectedToVisitedNode(int32 Index, bool bLocalHistory = false, bool bIndexSkipsUnsatisfiedEdges = true) const;\n\n\t/**\n\t*  Checks if the node is connected directly to an end node or not\n\t*  Does not handle complicated logic - if the said node is a logical one it will still check that node, and not one\n\t*  of its option\n\t*\n\t* @param Index  Index of the edge/player option to test\n\t* @param bIndexSkipsUnsatisfiedEdges  Decides if the index is in the [0, GetOptionsNum()[ interval (if true), or in the [0, GetAllOptionsNum()[ (if false)\n\t* @return true if the node is an end node\n\t*/\n\tUFUNCTION(BlueprintPure, Category = \"Dialogue|Data\")\n\tbool IsOptionConnectedToEndNode(int32 Index, bool bIndexSkipsUnsatisfiedEdges = true) const;\n\n\n\t//\n\t// Active Node\n\t//\n\n\t// Gets the Text of the active node index\n\tUFUNCTION(BlueprintPure, Category = \"Dialogue|ActiveNode\")\n\tconst FText& GetActiveNodeText() const;\n\n\t// Gets the SpeakerState of the active node index\n\tUFUNCTION(BlueprintPure, Category = \"Dialogue|ActiveNode\")\n\tFName GetActiveNodeSpeakerState() const;\n\n\t// Gets the Voice as a Sound Wave of the active node index\n\t// This will get cast to USoundWave from a USoundBase\n\tUFUNCTION(BlueprintPure, Category = \"Dialogue|ActiveNode\")\n\tUSoundWave* GetActiveNodeVoiceSoundWave() const;\n\n\t// Same as GetActiveNodeVoiceSoundWave but this just returns the variable without casting it\n\t// to a USoundWave\n\tUFUNCTION(BlueprintPure, Category = \"Dialogue|ActiveNode\")\n\tUSoundBase* GetActiveNodeVoiceSoundBase() const;\n\n\t// Gets the Voice as a Dialogue Wave of the active node index\n\tUFUNCTION(BlueprintPure, Category = \"Dialogue|ActiveNode\")\n\tUDialogueWave* GetActiveNodeVoiceDialogueWave() const;\n\n\tUFUNCTION(BlueprintPure, Category = \"Dialogue|ActiveNode\")\n\tUObject* GetActiveNodeGenericData() const;\n\n\tUFUNCTION(BlueprintPure, Category = \"Dialogue|ActiveNode\")\n\tUDlgNodeData* GetActiveNodeData() const;\n\n\t// Gets the Icon associated with the active node participant name (owner name).\n\tUFUNCTION(BlueprintPure, Category = \"Dialogue|ActiveNode\")\n\tUTexture2D* GetActiveNodeParticipantIcon() const;\n\n\t// Gets the Object associated with the active node participant name (owner name).\n\tUFUNCTION(BlueprintPure, Category = \"Dialogue|ActiveNode\")\n\tUObject* GetActiveNodeParticipant() const;\n\n\t// Gets the active node participant name (owner name).\n\tUFUNCTION(BlueprintPure, Category = \"Dialogue|ActiveNode\")\n\tFName GetActiveNodeParticipantName() const;\n\n\t// Gets the active participant display name\n\tUFUNCTION(BlueprintPure, Category = \"Dialogue|ActiveNode\")\n\tFText GetActiveNodeParticipantDisplayName() const;\n\n\tUFUNCTION(BlueprintPure, Category = \"Dialogue|Data\", DisplayName = \"Get Participant\")\n\tUObject* GetMutableParticipant(FName ParticipantName) const;\n\tconst UObject* GetParticipant(FName ParticipantName) const;\n\n\tUFUNCTION(BlueprintPure, Category = \"Dialogue|Data\")\n\tconst TMap<FName, UObject*>& GetParticipantsMap() const { return Participants; }\n\n\tUFUNCTION(BlueprintPure, Category = \"Dialogue|ActiveNode\")\n\tint32 GetActiveNodeIndex() const { return ActiveNodeIndex; }\n\n\tUFUNCTION(BlueprintPure, Category = \"Dialogue|ActiveNode\")\n\tFGuid GetActiveNodeGUID() const { return GetNodeGUIDForIndex(ActiveNodeIndex); }\n\n\tUFUNCTION(BlueprintPure, Category = \"Dialogue|ActiveNode\", DisplayName = \"Get Active Node\")\n\tUDlgNode* GetMutableActiveNode() const { return GetMutableNodeFromIndex(ActiveNodeIndex); }\n\tconst UDlgNode* GetActiveNode() const { return GetNodeFromIndex(ActiveNodeIndex); }\n\n\t// Just a helper method for GetActiveNode that casts to UDlgNode_SpeechSequence\n\tUFUNCTION(BlueprintPure, Category = \"Dialogue|ActiveNode\", DisplayName = \"Get Active Node As Speech Sequence\")\n\tUDlgNode_SpeechSequence* GetMutableActiveNodeAsSpeechSequence() const;\n\tconst UDlgNode_SpeechSequence* GetActiveNodeAsSpeechSequence() const;\n\n\t//\n\t// Data\n\t//\n\n\tUFUNCTION(BlueprintPure, Category = \"Dialogue|Data\")\n\tbool IsValidNodeIndex(int32 NodeIndex) const;\n\n\tUFUNCTION(BlueprintPure, Category = \"Dialogue|Data\")\n\tbool IsValidNodeGUID(const FGuid& NodeGUID) const;\n\n\t// Gets the GUID for the Node at NodeIndex\n\tUFUNCTION(BlueprintPure, Category = \"Dialogue|Data\", DisplayName = \"Get Node GUID For Index\")\n\tFGuid GetNodeGUIDForIndex(int32 NodeIndex) const;\n\n\t// Gets the corresponding Node Index for the supplied NodeGUID\n\t// Returns -1 (INDEX_NONE) if the Node GUID does not exist.\n\tUFUNCTION(BlueprintPure, Category = \"Dialogue|Data\", DisplayName = \"Get Node Index For GUID\")\n\tint32 GetNodeIndexForGUID(const FGuid& NodeGUID) const;\n\n\t// Returns the indices which were visited inside this single context. For global data check DlgMemory\n\t// NOTE: You should use GetVisitedNodeGUIDs\n\tUFUNCTION(BlueprintPure, Category = \"Dialogue|Context|History\")\n\tconst TSet<int32>& GetVisitedNodeIndices() const { return History.VisitedNodeIndices; }\n\n\t// Returns the GUIDs which were visited inside this single context. For global data check DlgMemory\n\tUFUNCTION(BlueprintPure, Category = \"Dialogue|Context|History\")\n\tconst TSet<FGuid>& GetVisitedNodeGUIDs() const { return History.VisitedNodeGUIDs; }\n\n\t// Helper methods to get some Dialogue properties\n\tUFUNCTION(BlueprintPure, Category = \"Dialogue|Data\")\n\tUDlgDialogue* GetDialogue() const { return Dialogue; }\n\n\tUFUNCTION(BlueprintPure, Category = \"Dialogue|Data\")\n\tFName GetDialogueName() const { check(Dialogue); return Dialogue->GetDialogueFName(); }\n\n\tUFUNCTION(BlueprintPure, Category = \"Dialogue|Data\")\n\tFGuid GetDialogueGUID() const { check(Dialogue); return Dialogue->GetGUID(); }\n\n\tUFUNCTION(BlueprintPure, Category = \"Dialogue|Data\")\n\tFString GetDialoguePathName() const { check(Dialogue); return Dialogue->GetPathName(); }\n\n\tUFUNCTION(BlueprintPure, Category = \"Dialogue|Data\")\n\tconst TMap<FName, UObject*>& GetParticipants() const { return Participants; }\n\n\n\t// the Dialogue jumps to the defined node, or the function returns with false, if the conversation is over\n\t// the Dialogue jumps to the defined node, or the function returns with false if the conversation is over\n\t// Depending on the node the EnterNode() call can lead to other EnterNode() calls - having NodeIndex as active node after the call\n\t// is not granted\n\t// Conditions are not checked here - they are expected to be satisfied\n\tbool EnterNode(int32 NodeIndex, TSet<const UDlgNode*> NodesEnteredWithThisStep);\n\n\t// Adds the node as visited in the current dialogue memory\n\tvoid SetNodeVisited(int32 NodeIndex, const FGuid& NodeGUID);\n\n\t// Gets the Node at the NodeIndex index\n\tUFUNCTION(BlueprintPure, Category = \"Dialogue|Data\", DisplayName = \"Get Node From Index\")\n\tUDlgNode* GetMutableNodeFromIndex(int32 NodeIndex) const;\n\tconst UDlgNode* GetNodeFromIndex(int32 NodeIndex) const;\n\n\tUFUNCTION(BlueprintPure, Category = \"Dialogue|Data\", DisplayName = \"Get Node From GUID\")\n\tUDlgNode* GetMutableNodeFromGUID(const FGuid& NodeGUID) const;\n\tconst UDlgNode* GetNodeFromGUID(const FGuid& NodeGUID) const;\n\n\t// Was the node Index visited in the lifetime of this context?\n\t// NOTE: you should  most likely use WasNodeGUIDVisitedInThisContext\n\tUFUNCTION(BlueprintPure, Category = \"Dialogue|Context|History\", DisplayName = \"Was Node Index Visited In This Context\")\n\tbool WasNodeIndexVisitedInThisContext(int32 NodeIndex) const\n\t{\n\t\treturn History.VisitedNodeIndices.Contains(NodeIndex);\n\t}\n\n\t// Was the node GUID visited in the lifetime of this context?\n\tUFUNCTION(BlueprintPure, Category = \"Dialogue|Context|History\", DisplayName = \"Was Node GUID Visited In This Context\")\n\tbool WasNodeGUIDVisitedInThisContext(const FGuid& NodeGUID) const\n\t{\n\t\treturn History.VisitedNodeGUIDs.Contains(NodeGUID);\n\t}\n\n\t// Gets the History of this context\n\tconst FDlgHistory& GetHistoryOfThisContext() const { return History; }\n\n\t// Checks the enter conditions of the node.\n\t// return false if they are not satisfied or if the index is invalid\n\tbool IsNodeEnterable(int32 NodeIndex, TSet<const UDlgNode*> AlreadyVisitedNodes) const;\n\n\t// Initializes/Starts the context, the first (start) node is selected and the first valid child node is entered.\n\t// Called by the UDlgManager which creates the context\n\tbool Start(UDlgDialogue* InDialogue, const TMap<FName, UObject*>& InParticipants) { return StartWithContext(TEXT(\"\"), InDialogue, InParticipants); }\n\tbool StartWithContext(const FString& ContextString, UDlgDialogue* InDialogue, const TMap<FName, UObject*>& InParticipants);\n\n\t//\n\t// Initializes/Start the context using the given node as entry point\n\t// This is useful to resume a dialogue\n\t//\n\n\t// Variant that works with only the NodeIndex\n\t// NOTE: This is not safe, please use StartFromNodeGUID\n\tbool StartFromNodeIndex(\n\t\tUDlgDialogue* InDialogue,\n\t\tconst TMap<FName, UObject*>& InParticipants,\n\t\tint32 StartNodeIndex,\n\t\tconst FDlgHistory& StartHistory,\n\t\tbool bFireEnterEvents\n\t)\n\t{\n\t\treturn StartWithContextFromNodeIndex(\n\t\t\tTEXT(\"\"),\n\t\t\tInDialogue,\n\t\t\tInParticipants,\n\t\t\tStartNodeIndex,\n\t\t\tStartHistory,\n\t\t\tbFireEnterEvents\n\t\t);\n\t}\n\tbool StartWithContextFromNodeIndex(\n\t\tconst FString& ContextString,\n\t\tUDlgDialogue* InDialogue,\n\t\tconst TMap<FName, UObject*>& InParticipants,\n\t\tint32 StartNodeIndex,\n\t\tconst FDlgHistory& StartHistory,\n\t\tbool bFireEnterEvents\n\t)\n\t{\n\t\tconst FString ContextMessage = ContextString.IsEmpty()\n\t\t\t? TEXT(\"StartFromNodeIndex\")\n\t\t\t: FString::Printf(TEXT(\"%s - StartFromNodeIndex\"), *ContextString);\n\n\t\treturn StartWithContextFromNode(\n\t\t\tContextMessage,\n\t\t\tInDialogue,\n\t\t\tInParticipants,\n\t\t\tStartNodeIndex,\n\t\t\tFGuid{},\n\t\t\tStartHistory,\n\t\t\tbFireEnterEvents\n\t\t);\n\t}\n\n\t// Variant that works with only the NodeGUID\n\tbool StartFromNodeGUID(\n\t\tUDlgDialogue* InDialogue,\n\t\tconst TMap<FName, UObject*>& InParticipants,\n\t\tconst FGuid& StartNodeGUID,\n\t\tconst FDlgHistory& StartHistory,\n\t\tbool bFireEnterEvents\n\t)\n\t{\n\t\treturn StartWithContextFromNodeGUID(\n\t\t\tTEXT(\"\"),\n\t\t\tInDialogue,\n\t\t\tInParticipants,\n\t\t\tStartNodeGUID,\n\t\t\tStartHistory,\n\t\t\tbFireEnterEvents\n\t\t);\n\t}\n\tbool StartWithContextFromNodeGUID(\n\t\tconst FString& ContextString,\n\t\tUDlgDialogue* InDialogue,\n\t\tconst TMap<FName, UObject*>& InParticipants,\n\t\tconst FGuid& StartNodeGUID,\n\t\tconst FDlgHistory& StartHistory,\n\t\tbool bFireEnterEvents\n\t)\n\t{\n\t\tconst FString ContextMessage = ContextString.IsEmpty()\n\t\t\t? TEXT(\"StartFromNodeGUID\")\n\t\t\t: FString::Printf(TEXT(\"%s - StartFromNodeGUID\"), *ContextString);\n\n\t\treturn StartWithContextFromNode(\n\t\t\tContextMessage,\n\t\t\tInDialogue,\n\t\t\tInParticipants,\n\t\t\tINDEX_NONE,\n\t\t\tStartNodeGUID,\n\t\t\tStartHistory,\n\t\t\tbFireEnterEvents\n\t\t);\n\t}\n\n\t// Generic variant that accepts both NodeIndex and NodeGUID\n\t// If NodeGUID is valid this will be used to get the correct Node\n\t// Otherwise fallback to the NodeIndex\n\tbool StartFromNode(\n\t\tUDlgDialogue* InDialogue,\n\t\tconst TMap<FName, UObject*>& InParticipants,\n\t\tint32 StartNodeIndex,\n\t\tconst FGuid& StartNodeGUID,\n\t\tconst FDlgHistory& StartHistory,\n\t\tbool bFireEnterEvents\n\t)\n\t{\n\t\treturn StartWithContextFromNode(\n\t\t\tTEXT(\"\"),\n\t\t\tInDialogue,\n\t\t\tInParticipants,\n\t\t\tStartNodeIndex,\n\t\t\tStartNodeGUID,\n\t\t\tStartHistory,\n\t\t\tbFireEnterEvents\n\t\t);\n\t}\n\tbool StartWithContextFromNode(\n\t\tconst FString& ContextString,\n\t\tUDlgDialogue* InDialogue,\n\t\tconst TMap<FName, UObject*>& InParticipants,\n\t\tint32 StartNodeIndex,\n\t\tconst FGuid& StartNodeGUID,\n\t\tconst FDlgHistory& StartHistory,\n\t\tbool bFireEnterEvents\n\t);\n\n\t// Create a copy of the current Context\n\tUDlgContext* CreateCopy() const;\n\n\t// Checks if the context could be started, used to check if there is any reachable node from the start node\n\tstatic bool CanBeStarted(UDlgDialogue* InDialogue, const TMap<FName, UObject*>& InParticipants);\n\n\tUFUNCTION(BlueprintPure, Category = \"Dialogue|Context\")\n\tFString GetContextString() const;\n\n\t// Checks if the Participant object is a valid participant for starting the Dialogue\n\tstatic EDlgValidateStatus IsValidParticipantForDialogue(const UDlgDialogue* Dialogue, const UObject* Participant);\n\n\t// Same as IsValidParticipantForDialogue but this just returns a bool and logs to the output log if something is wrong\n\t// If bLog = true then this act exactly as IsValidParticipantForDialogue\n\tstatic bool ValidateParticipantForDialogue(\n\t\tconst FString& ContextString,\n\t\tconst UDlgDialogue* Dialogue,\n\t\tconst UObject* Participant,\n\t\tbool bLog = true\n\t);\n\n\t// Same as ValidateParticipantForDialogue but works on a Map of Participants\n\tstatic bool ValidateParticipantsMapForDialogue(\n\t\tconst FString& ContextString,\n\t\tconst UDlgDialogue* Dialogue,\n\t\tconst TMap<FName, UObject*>& ParticipantsMap,\n\t\tbool bLog = true\n\t);\n\n\t// Just converts the array to a map, this does minimal checking just for the conversion to work\n\t// NOTE: this outputs to log if an error occurs\n\tstatic bool ConvertArrayOfParticipantsToMap(\n\t\tconst FString& ContextString,\n\t\tconst UDlgDialogue* Dialogue,\n\t\tconst TArray<UObject*>& ParticipantsArray,\n\t\tTMap<FName, UObject*>& OutParticipantsMap,\n\t\tbool bLog = true\n\t);\n\nprotected:\n\t// bool StartInternal(UDlgDialogue* InDialogue, const TMap<FName, UObject*>& InParticipants, bool bLog, FString& OutErrorMessage);\n\tvoid LogErrorWithContext(const FString& ErrorMessage) const;\n\tFString GetErrorMessageWithContext(const FString& ErrorMessage) const;\n\n\tvoid SetParticipants(const TMap<FName, UObject*>& InParticipants)\n\t{\n\t\tParticipants = InParticipants;\n\t\tSerializeParticipants();\n\t}\n\nprotected:\n\t// Current Dialogue used in this context at runtime.\n\tUPROPERTY(Replicated)\n\tUDlgDialogue* Dialogue = nullptr;\n\n\t// Helper array to serialize to Participants map for clients as well\n\tUPROPERTY(Replicated, ReplicatedUsing = OnRep_SerializedParticipants)\n\tTArray<UObject*> SerializedParticipants;\n\n\t// All object is expected to implement the IDlgDialogueParticipant interface\n\t// the key is the return value of IDlgDialogueParticipant::GetParticipantName()\n\tUPROPERTY()\n\tTMap<FName, UObject*> Participants;\n\n\t// The index of the active node in the dialogues Nodes array\n\tint32 ActiveNodeIndex = INDEX_NONE;\n\n\t// Options of the active node with satisfied conditions - the options the player can choose from\n\tTArray<FDlgEdge> AvailableChildren;\n\n\t/**\n\t *  List of options which is possible, or would be with satisfied conditions\n\t *  (e.g. in case of virtual parent it isn't necessary the node's child, that's why we have this array here\n\t *  instead of simply returning something from active node\n\t */\n\tTArray<FDlgEdgeData> AllChildren;\n\n\t// Node indices visited in this specific Dialogue instance (isn't serialized)\n\t// History for this Context only\n\tFDlgHistory History;\n\n\t// cache the result of the last ChooseOption call\n\tbool bDialogueEnded = false;\n};\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystem/Public/DlgDialogue.h",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#pragma once\n\n#include \"Templates/SubclassOf.h\"\n\n#include \"IDlgDialogueEditorAccess.h\"\n#include \"DlgSystemSettings.h\"\n#include \"DlgDialogueParticipantData.h\"\n\n#include \"DlgDialogue.generated.h\"\n\nclass UDlgNode;\n\n// Custom serialization version for changes made in Dev-Dialogues stream\nstruct DLGSYSTEM_API FDlgDialogueObjectVersion\n{\n\tenum Type\n\t{\n\t\t// Before any version changes were made\n\t\tBeforeCustomVersionWasAdded = 0,\n\t\tConvertedNodesToUObject,\n\t\tUseOnlyOneOutputAndInputPin,\n\t\tMergeVirtualParentAndSelectorTypes,\n\t\tConvertDialogueDataArraysToSets,\n\t\tAddGUID,\n\t\tAddComparisonWithOtherParticipant,\n\t\tAddTextFormatArguments,\n\t\tAddLocalizationOverwrittenNamespacesAndKeys,\n\t\tAddVirtualParentFireDirectChildEnterEvents,\n\t\tAddGUIDToNodes,\n\t\tAddCustomObjectsToParticipantsData,\n\n\t\t// -----<new versions can be added above this line>-------------------------------------------------\n\t\tVersionPlusOne,\n\t\tLatestVersion = VersionPlusOne - 1\n\t};\n\n\t// The GUID for this custom version number\n\tconst static FGuid GUID;\n\nprivate:\n\tFDlgDialogueObjectVersion() {}\n};\n\n\n// Structure useful to cache all the names used by a participant\nUSTRUCT(BlueprintType)\nstruct DLGSYSTEM_API FDlgParticipantClass\n{\n\tGENERATED_USTRUCT_BODY()\n\npublic:\n\t// The Name of the Participant Used inside this Dialogue\n\tUPROPERTY(VisibleAnywhere, BlueprintReadWrite, Category = \"Dialogue|Participant\")\n\tFName ParticipantName = NAME_None;\n\n\t// The Participant Class corresponding for the ParticipantName\n\t// This is used to autocomplete and retrieve the Variables from that Class automatically when Using Class based Conditions/Events\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = \"Dialogue|Participant\", meta = (MustImplement = \"DlgDialogueParticipant\"))\n\tUClass* ParticipantClass = nullptr;\n};\n\n\n/**\n *  Dialogue asset containing the static data of a dialogue\n *  Instances can be created in content browser\n *  Dialogues have a custom blueprint editor\n */\nUCLASS(BlueprintType, Meta = (DisplayThumbnail = \"true\"))\nclass DLGSYSTEM_API UDlgDialogue : public UObject\n{\n\tGENERATED_BODY()\npublic:\n\n\t//\n\t// Begin UObject Interface.\n\t//\n\n\t/** @return a one line description of an object for viewing in the thumbnail view of the generic browser */\n\tFString GetDesc() override { return TEXT(\" DESCRIPTION = \") + GetName();  }\n\n\t/**\n\t * Presave function. Gets called once before an object gets serialized for saving. This function is necessary\n\t * for save time computation as Serialize gets called three times per object from within SavePackage.\n\t *\n\t * @warning: Objects created from within PreSave will NOT have PreSave called on them!!!\n\t */\n\tvoid PreSave(const class ITargetPlatform* TargetPlatform) override;\n\n\t/** UObject serializer. */\n\tvoid Serialize(FArchive& Ar) override;\n\n\t/**\n\t * Do any object-specific cleanup required immediately after loading an object,\n\t * and immediately after any undo/redo.\n\t */\n\tvoid PostLoad() override;\n\n\t/**\n\t * Called after the C++ constructor and after the properties have been initialized, including those loaded from config.\n\t * mainly this is to emulate some behavior of when the constructor was called after the properties were initialized.\n\t * This creates the DlgGraph for this Dialogue.\n\t */\n\tvoid PostInitProperties() override;\n\n\t/** Executed after Rename is executed. */\n\tvoid PostRename(UObject* OldOuter, FName OldName) override;\n\n\t/**\n\t * Called after duplication & serialization and before PostLoad. Used to e.g. make sure UStaticMesh's UModel gets copied as well.\n\t * Note: NOT called on components on actor duplication (alt-drag or copy-paste).  Use PostEditImport as well to cover that case.\n\t */\n\tvoid PostDuplicate(bool bDuplicateForPIE) override;\n\n\t/**\n\t* Called after importing property values for this object (paste, duplicate or .t3d import)\n\t* Allow the object to perform any cleanup for properties which shouldn't be duplicated or\n\t* are unsupported by the script serialization\n\t*/\n\tvoid PostEditImport() override;\n\n#if WITH_EDITOR\n\t/**\n\t * Note that the object will be modified.  If we are currently recording into the\n\t * transaction buffer (undo/redo), save a copy of this object into the buffer and\n\t * marks the package as needing to be saved.\n\t *\n\t * @param\tbAlwaysMarkDirty\tif true, marks the package dirty even if we aren't\n\t *\t\t\t\t\t\t\t\tcurrently recording an active undo/redo transaction\n\t * @return true if the object was saved to the transaction buffer\n\t */\n\tbool Modify(bool bAlwaysMarkDirty = true) override;\n\n\t/**\n\t * Called when a property on this object has been modified externally\n\t *\n\t * @param PropertyChangedEvent the property that was modified\n\t */\n\tvoid PostEditChangeProperty(FPropertyChangedEvent& PropertyChangedEvent) override;\n\n\t/**\n\t * This alternate version of PostEditChange is called when properties inside structs are modified.  The property that was actually modified\n\t * is located at the tail of the list.  The head of the list of the FNYStructProperty member variable that contains the property that was modified.\n\t */\n\tvoid PostEditChangeChainProperty(struct FPropertyChangedChainEvent& PropertyChangedEvent) override;\n\n\t/**\n\t * Callback used to allow object register its direct object references that are not already covered by\n\t * the token stream.\n\t *\n\t * @param InThis Object to collect references from.\n\t * @param Collector\tFReferenceCollector objects to be used to collect references.\n\t */\n\tstatic void AddReferencedObjects(UObject* InThis, FReferenceCollector& Collector);\n\t// End UObject Interface.\n\n\t//\n\t// Begin own functions\n\t//\n\n\t// Broadcasts whenever a property of this dialogue changes.\n\tDECLARE_EVENT_OneParam(UDlgDialogue, FDialoguePropertyChanged, const FPropertyChangedEvent& /* PropertyChangedEvent */);\n\tFDialoguePropertyChanged OnDialoguePropertyChanged;\n\n\t// Helper functions to get the names of some properties. Used by the DlgSystemEditor module.\n\tstatic FName GetMemberNameName() { return GET_MEMBER_NAME_CHECKED(UDlgDialogue, Name); }\n\tstatic FName GetMemberNameGUID() { return GET_MEMBER_NAME_CHECKED(UDlgDialogue, GUID); }\n\tstatic FName GetMemberNameParticipantsData() { return GET_MEMBER_NAME_CHECKED(UDlgDialogue, ParticipantsData); }\n\tstatic FName GetMemberNameStartNode() { return GET_MEMBER_NAME_CHECKED(UDlgDialogue, StartNode); }\n\tstatic FName GetMemberNameNodes() { return GET_MEMBER_NAME_CHECKED(UDlgDialogue, Nodes); }\n\n\t// Create the basic dialogue graph.\n\tvoid CreateGraph();\n\n\t// Clears all nodes from the graph.\n\tvoid ClearGraph();\n\n\t// Gets the editor graph of this Dialogue.\n\tUEdGraph* GetGraph()\n\t{\n\t\tcheck(DlgGraph);\n\t\treturn DlgGraph;\n\t}\n\tconst UEdGraph* GetGraph() const\n\t{\n\t\tcheck(DlgGraph);\n\t\treturn DlgGraph;\n\t}\n\n\t// Useful for initially compiling the Dialogue when we need the extra processing steps done by the compiler.\n\tvoid InitialCompileDialogueNodesFromGraphNodes()\n\t{\n\t\tif (bWasCompiledAtLeastOnce)\n\t\t\treturn;\n\n\t\tCompileDialogueNodesFromGraphNodes();\n\t\tbWasCompiledAtLeastOnce = true;\n\t}\n\n\t// Compiles the dialogue nodes from the graph nodes. Meaning it transforms the graph data -> (into) dialogue data.\n\tvoid CompileDialogueNodesFromGraphNodes();\n\n\t// Sets the dialogue editor implementation. This is called in the constructor of the DlgDialogueGraph in the DlgSytemEditor module.\n\tstatic void SetDialogueEditorAccess(const TSharedPtr<IDlgDialogueEditorAccess>& InDialogueEditor)\n\t{\n\t\tcheck(!DialogueEditorAccess.IsValid());\n\t\tcheck(InDialogueEditor.IsValid());\n\t\tDialogueEditorAccess = InDialogueEditor;\n\t}\n\n\t// Gets the dialogue editor implementation.\n\tstatic TSharedPtr<IDlgDialogueEditorAccess> GetDialogueEditorAccess() { return DialogueEditorAccess; }\n\n\t// Enables/disables the compilation of the dialogues in the editor, use with care. Mainly used for optimization.\n\tvoid EnableCompileDialogue() { bCompileDialogue = true; }\n\tvoid DisableCompileDialogue() { bCompileDialogue = false; }\n#endif\n\n\t// Construct and initialize a node within this Dialogue.\n\ttemplate<class T>\n\tT* ConstructDialogueNode(TSubclassOf<UDlgNode> DialogueNodeClass = T::StaticClass())\n\t{\n\t\t// Set flag to be transactional so it registers with undo system\n\t\tT* DialogueNode = NewObject<T>(this, DialogueNodeClass, NAME_None, RF_Transactional);\n\t\treturn DialogueNode;\n\t}\n\n\t//\n\t// Dialogue Data\n\t//\n\n\t// Gets the Dialogue Data Map. It maps Participant Name => Participant Data\n\tUFUNCTION(BlueprintPure, Category = \"Dialogue\")\n\tconst TMap<FName, FDlgParticipantData>& GetParticipantsData() const { return ParticipantsData; }\n\n\t// Checks if the provided ParticipantName (SpeakerName) is a key in the Dialogue Data Map\n\tUFUNCTION(BlueprintPure, Category = \"Dialogue\")\n\tbool HasParticipant(FName ParticipantName) const { return ParticipantsData.Contains(ParticipantName); }\n\n\t// Gets the number of participants in the Dialogue Data Map.\n\tUFUNCTION(BlueprintPure, Category = \"Dialogue\")\n\tint32 GetParticipantsNum() const { return ParticipantsData.Num(); }\n\n\t// Gets all the keys (participant names) of the DlgData Map\n\tUFUNCTION(BlueprintPure, Category = \"Dialogue\")\n\tvoid GetAllParticipantNames(TSet<FName>& OutSet) const\n\t{\n\t\tfor (const auto& Element : ParticipantsData)\n\t\t{\n\t\t\t// Key is the ParticipantName\n\t\t\tOutSet.Add(Element.Key);\n\t\t}\n\t}\n\n\tUFUNCTION(BlueprintPure, Category = \"Dialogue\")\n\tconst TArray<FDlgParticipantClass>& GetAllParticipantClasses() const { return ParticipantsClasses; }\n\n\t/// EDITOR function, it only works if the participant class is setup in the ParticipantsClasses array\n\tUFUNCTION(BlueprintPure, Category = \"Dialogue\")\n\tUClass* GetParticipantClass(FName ParticipantName) const\n\t{\n\t\tfor (const FDlgParticipantClass& Pair : ParticipantsClasses)\n\t\t{\n\t\t\tif (Pair.ParticipantName == ParticipantName)\n\t\t\t{\n\t\t\t\treturn Pair.ParticipantClass;\n\t\t\t}\n\t\t}\n\t\treturn nullptr;\n\t}\n\n\n\t// Gets the Condition Names that correspond to the provided ParticipantName.\n\tUFUNCTION(BlueprintPure, Category = \"Dialogue\")\n\tvoid GetConditions(FName ParticipantName, TSet<FName>& OutSet) const\n\t{\n\t\tif (ParticipantsData.Contains(ParticipantName))\n\t\t{\n\t\t\tOutSet.Append(ParticipantsData[ParticipantName].Conditions);\n\t\t}\n\t}\n\n\t// Gets the Event Names that correspond to the provided ParticipantName.\n\tUFUNCTION(BlueprintPure, Category = \"Dialogue\")\n\tvoid GetEvents(FName ParticipantName, TSet<FName>& OutSet) const\n\t{\n\t\tif (ParticipantsData.Contains(ParticipantName))\n\t\t{\n\t\t\tOutSet.Append(ParticipantsData[ParticipantName].Events);\n\t\t}\n\t}\n\n\t// Gets the Custom Events UClasses that correspond to the provided ParticipantName.\n\tUFUNCTION(BlueprintPure, Category = \"Dialogue\")\n\tvoid GetCustomEvents(FName ParticipantName, TSet<UClass*>& OutSet) const\n\t{\n\t\tif (ParticipantsData.Contains(ParticipantName))\n\t\t{\n\t\t\tOutSet.Append(ParticipantsData[ParticipantName].CustomEvents);\n\t\t}\n\t}\n\n\t// Gets the int variable Names that correspond to the provided ParticipantName.\n\tUFUNCTION(BlueprintPure, Category = \"Dialogue\")\n\tvoid GetIntNames(FName ParticipantName, TSet<FName>& OutSet) const\n\t{\n\t\tif (ParticipantsData.Contains(ParticipantName))\n\t\t{\n\t\t\tOutSet.Append(ParticipantsData[ParticipantName].IntVariableNames);\n\t\t}\n\t}\n\n\t// Gets the float variable Names that correspond to the provided ParticipantName.\n\tUFUNCTION(BlueprintPure, Category = \"Dialogue\")\n\tvoid GetFloatNames(FName ParticipantName, TSet<FName>& OutSet) const\n\t{\n\t\tif (ParticipantsData.Contains(ParticipantName))\n\t\t{\n\t\t\tOutSet.Append(ParticipantsData[ParticipantName].FloatVariableNames);\n\t\t}\n\t}\n\n\t// Gets the bool variable Names that correspond to the provided ParticipantName.\n\tUFUNCTION(BlueprintPure, Category = \"Dialogue\")\n\tvoid GetBoolNames(FName ParticipantName, TSet<FName>& OutSet) const\n\t{\n\t\tif (ParticipantsData.Contains(ParticipantName))\n\t\t{\n\t\t\tOutSet.Append(ParticipantsData[ParticipantName].BoolVariableNames);\n\t\t}\n\t}\n\n\t// Gets the name variable Names that correspond to the provided ParticipantName.\n\tUFUNCTION(BlueprintPure, Category = \"Dialogue\")\n\tvoid GetNameNames(FName ParticipantName, TSet<FName>& OutSet) const\n\t{\n\t\tif (ParticipantsData.Contains(ParticipantName))\n\t\t{\n\t\t\tOutSet.Append(ParticipantsData[ParticipantName].NameVariableNames);\n\t\t}\n\t}\n\n\n\t// Gets the int variable Names that correspond to the UClass of the provided ParticipantName.\n\tUFUNCTION(BlueprintPure, Category = \"Dialogue\")\n\tvoid GetClassIntNames(FName ParticipantName, TSet<FName>& OutSet) const\n\t{\n\t\tif (ParticipantsData.Contains(ParticipantName))\n\t\t{\n\t\t\tOutSet.Append(ParticipantsData[ParticipantName].ClassIntVariableNames);\n\t\t}\n\t}\n\n\t// Gets the float variable Names that correspond to the UClass of the provided ParticipantName.\n\tUFUNCTION(BlueprintPure, Category = \"Dialogue\")\n\tvoid GetClassFloatNames(FName ParticipantName, TSet<FName>& OutSet) const\n\t{\n\t\tif (ParticipantsData.Contains(ParticipantName))\n\t\t{\n\t\t\tOutSet.Append(ParticipantsData[ParticipantName].ClassFloatVariableNames);\n\t\t}\n\t}\n\n\t// Gets the bool variable Names that correspond to the UClass of the provided ParticipantName.\n\tUFUNCTION(BlueprintPure, Category = \"Dialogue\")\n\tvoid GetClassBoolNames(FName ParticipantName, TSet<FName>& OutSet) const\n\t{\n\t\tif (ParticipantsData.Contains(ParticipantName))\n\t\t{\n\t\t\tOutSet.Append(ParticipantsData[ParticipantName].ClassBoolVariableNames);\n\t\t}\n\t}\n\n\t// Gets the name variable Names that correspond to the UClass of the provided ParticipantName.\n\tUFUNCTION(BlueprintPure, Category = \"Dialogue\")\n\tvoid GetClassNameNames(FName ParticipantName, TSet<FName>& OutSet) const\n\t{\n\t\tif (ParticipantsData.Contains(ParticipantName))\n\t\t{\n\t\t\tOutSet.Append(ParticipantsData[ParticipantName].ClassNameVariableNames);\n\t\t}\n\t}\n\n\t// Gets the FText variable Names that correspond to the UClass of the provided ParticipantName.\n\tUFUNCTION(BlueprintPure, Category = \"Dialogue\")\n\tvoid GetClassTextNames(FName ParticipantName, TSet<FName>& OutSet) const\n\t{\n\t\tif (ParticipantsData.Contains(ParticipantName))\n\t\t{\n\t\t\tOutSet.Append(ParticipantsData[ParticipantName].ClassTextVariableNames);\n\t\t}\n\t}\n\n\t// Gets all the SpeakerStates used inside this dialogue\n\tUFUNCTION(BlueprintPure, Category = \"Dialogue\")\n\tvoid GetAllSpeakerStates(TSet<FName>& OutSet) const\n\t{\n\t\tOutSet.Append(AllSpeakerStates);\n\t}\n\n\tUFUNCTION(BlueprintPure, Category = \"Dialogue\")\n\tint32 GetDialogueVersion() const { return Version; }\n\n\t// Gets/extracts the name (without extension) of the dialog from the uasset filename\n\tUFUNCTION(BlueprintPure, Category = \"Dialogue\")\n\tFString GetDialogueName() const\n\t{\n\t\t// Note: GetPathName() calls this at the end, so this just gets the direct name that we want.\n\t\t// Assumption only true for objects that have the Outer an UPackage.\n\t\t// Otherwise call FPaths::GetBaseFilename(GetPathName())\n\t\treturn GetName();\n\t}\n\n\t// Same as the GetDialogueName only it returns a FName.\n\tUFUNCTION(BlueprintPure, Category = \"Dialogue\")\n\tFName GetDialogueFName() const { return GetFName(); }\n\n\t// Gets the unique identifier for this dialogue.\n\tUFUNCTION(BlueprintPure, Category = \"Dialogue|GUID\")\n\tFGuid GetGUID() const { check(GUID.IsValid()); return GUID; }\n\n\t// Regenerate the GUID of this Dialogue\n\tvoid RegenerateGUID() { GUID = FGuid::NewGuid(); }\n\n\tUFUNCTION(BlueprintPure, Category = \"Dialogue|GUID\")\n\tbool HasGUID() const { return GUID.IsValid(); }\n\n\t// Gets all the nodes\n\tUFUNCTION(BlueprintPure, Category = \"Dialogue\")\n\tconst TArray<UDlgNode*>& GetNodes() const { return Nodes; }\n\n\t// Gets the Start Node as a mutable pointer.\n\tUFUNCTION(BlueprintPure, Category = \"Dialogue\", DisplayName = \"Get Start Node\")\n\tUDlgNode* GetMutableStartNode() const { return StartNode; }\n\tconst UDlgNode& GetStartNode() const { return *StartNode; }\n\n\tUFUNCTION(BlueprintPure, Category = \"Dialogue\")\n\tbool IsValidNodeIndex(int32 NodeIndex) const { return Nodes.IsValidIndex(NodeIndex); }\n\n\tUFUNCTION(BlueprintPure, Category = \"Dialogue\")\n\tbool IsValidNodeGUID(const FGuid& NodeGUID) const { return IsValidNodeIndex(GetNodeIndexForGUID(NodeGUID)); }\n\n\t// Gets the GUID for the Node at NodeIndex\n\tUFUNCTION(BlueprintPure, Category = \"Dialogue\", DisplayName = \"Get Node GUID For Index\")\n\tFGuid GetNodeGUIDForIndex(int32 NodeIndex) const;\n\n\t// Gets the corresponding Node Index for the supplied NodeGUID\n\t// Returns -1 (INDEX_NONE) if the Node GUID does not exist.\n\tUFUNCTION(BlueprintPure, Category = \"Dialogue\", DisplayName = \"Get Node Index For GUID\")\n\tint32 GetNodeIndexForGUID(const FGuid& NodeGUID) const;\n\n\t// Gets the Node as a mutable pointer.\n\tUFUNCTION(BlueprintPure, Category = \"Dialogue\", DisplayName = \"Get Node From Index\")\n\tUDlgNode* GetMutableNodeFromIndex(int32 NodeIndex) const { return Nodes.IsValidIndex(NodeIndex) ? Nodes[NodeIndex] : nullptr; }\n\n\tUFUNCTION(BlueprintPure, Category = \"Dialogue|Data\", DisplayName = \"Get Node From GUID\")\n    UDlgNode* GetMutableNodeFromGUID(const FGuid& NodeGUID) const { return GetMutableNodeFromIndex(GetNodeIndexForGUID(NodeGUID));   }\n\n\t// Sets a new Start Node. Use with care.\n\tvoid SetStartNode(UDlgNode* InStartNode);\n\n\t// NOTE: don't call this if you don't know what you are doing, you most likely need to call\n\t// SetStartNode\n\t// SetNodes\n\t// After this\n\tvoid EmptyNodesGUIDToIndexMap() { NodesGUIDToIndexMap.Empty(); }\n\n\t// Sets the Dialogue Nodes. Use with care.\n\tvoid SetNodes(const TArray<UDlgNode*>& InNodes);\n\n\t// Sets the Node at index NodeIndex. Use with care.\n\tvoid SetNode(int32 NodeIndex, UDlgNode* InNode);\n\n\t// Is the Node at NodeIndex (if it exists) an end node?\n\tbool IsEndNode(int32 NodeIndex) const;\n\n\t// Check if a text file in the same folder with the same name (Name) exists and loads the data from that file.\n\tvoid ImportFromFile();\n\n\t// Method to handle when this asset is going to be saved. Compiles the dialogue and saves to the text file.\n\tvoid OnPreAssetSaved();\n\n\t// Useful for initially reloading the data from the text file so that the dialogue is always in sync.\n\tvoid InitialSyncWithTextFile()\n\t{\n\t\tif (bIsSyncedWithTextFile)\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\tImportFromFile();\n\t\tbIsSyncedWithTextFile = true;\n\t}\n\n\t// Exports this dialogue data into it's corresponding \".dlg\" text file with the same name as this (Name).\n\tvoid ExportToFile() const;\n\n\t// Updates the data of some nodes\n\t// Fills the DlgData with the updated data\n\t// NOTE: this can do a dialogue data -> graph node data update\n\tvoid UpdateAndRefreshData(bool bUpdateTextsNamespacesAndKeys = false);\n\n\t// Adds a new node to this dialogue, returns the index location of the added node in the Nodes array.\n\tint32 AddNode(UDlgNode* NodeToAdd) { return Nodes.Add(NodeToAdd); }\n\n\t/**\n\t * @param\tbAddExtension\tIf this adds the .dlg or .dlg.json extension depending on the TextFormat.\n\t * @return The path (as a relative path) and name of the text file, or empty string if something is wrong.\n\t */\n\tFString GetTextFilePathName(bool bAddExtension = true) const;\n\tFString GetTextFilePathName(EDlgDialogueTextFormat TextFormat, bool bAddExtension = true) const;\n\n\t// Perform deletion on the text files\n\tbool DeleteTextFileForTextFormat(EDlgDialogueTextFormat TextFormat) const;\n\tbool DeleteTextFileForExtension(const FString& FileExtension) const;\n\tbool DeleteAllTextFiles() const;\n\n\t// Is this dialogue located inside the project directory\n\tbool IsInProjectDirectory() const;\n\n\t/**\n\t * @return the text file path name (as a relative path) from the asset path name.\n\t * NOTE: does not have extension, call GetTextFileExtension for that.\n\t */\n\tstatic FString GetTextFilePathNameFromAssetPathName(const FString& AssetPathName);\n\nprivate:\n\t// Adds conditions from the edges of this Node.\n\tvoid AddConditionsDataFromNodeEdges(const UDlgNode* Node, int32 NodeIndex);\n\n\t// Gets the map entry - creates it first if it is not yet there\n\tFDlgParticipantData& GetParticipantDataEntry(FName ParticipantName, FName FallbackParticipantName, bool bCheckNone, const FString& ContextMessage);\n\n\t// Rebuild & Update and node and its edges\n\tvoid RebuildAndUpdateNode(UDlgNode* Node, const UDlgSystemSettings& Settings, bool bUpdateTextsNamespacesAndKeys);\n\n\tvoid ImportFromFileFormat(EDlgDialogueTextFormat TextFormat);\n\tvoid ExportToFileFormat(EDlgDialogueTextFormat TextFormat) const;\n\n\t/**\n\t * Tries to fix the internal graph of this Dialogue in the following ways:\n\t * 1. If there is no start node, we create one pointing to the first node\n\t * 2. If there is no end node, we add one\n\t * 3. If a node is not an end node but has no children it will \"adopt\" the next node\n\t */\n\tvoid AutoFixGraph();\n\n\t// Updates NodesGUIDToIndexMap with Node\n\tvoid UpdateGUIDToIndexMap(const UDlgNode* Node, int32 NodeIndex);\n\nprotected:\n\t// Used to keep track of the version in text  file too, besides being written in the .uasset file.\n\tUPROPERTY()\n\tint32 Version = FDlgDialogueObjectVersion::LatestVersion;\n\n\t// The name of the dialog, only used for reference in the text file, as this must always match the .uasset file name and .dlg file name\n\tUPROPERTY(VisibleAnywhere, Category = \"Dialogue\")\n\tFName Name;\n\n\t// The Unique identifier for each dialogue. This is used to uniquely identify a Dialogue, instead of it's name or path. Much more safer.\n\tUPROPERTY(VisibleAnywhere, Category = \"Dialogue\")\n\tFGuid GUID;\n\n\t// All the Participants that require for you to define its UClass otherwise the auto completion/suggestion won't work in case you want to modify/check Class variables.\n\tUPROPERTY(EditAnywhere, EditFixedSize, Category = \"Dialogue\")\n\tTArray<FDlgParticipantClass> ParticipantsClasses;\n\n\t// Gathered data about events/conditions for each participant (for bp nodes, suggestions, etc.)\n\tUPROPERTY(VisibleAnywhere, AdvancedDisplay, Category = \"Dialogue\", Meta = (DlgNoExport))\n\tTMap<FName, FDlgParticipantData> ParticipantsData;\n\n\t// All the speaker states used inside this Dialogue.\n\tUPROPERTY(VisibleAnywhere, AdvancedDisplay, Category = \"Dialogue\", Meta = (DlgNoExport))\n\tTSet<FName> AllSpeakerStates;\n\n\t// Root node, Dialogue is started from the first child with satisfied condition (like the SelectorFirst node)\n\t// NOTE: Add VisibleAnywhere to make it easier to debug\n\tUPROPERTY(Instanced)\n\tUDlgNode* StartNode;\n\n\t// The new list of all nodes that belong to this Dialogue. Each nodes has children (edges) that have indices that point\n\t// to other nodes in this array.\n\t// NOTE: Add VisibleAnywhere to make it easier to debug\n\tUPROPERTY(AdvancedDisplay, EditFixedSize, Instanced, Meta = (DlgWriteIndex))\n\tTArray<UDlgNode*> Nodes;\n\n\t// Maps Node GUID => Node Index\n\tUPROPERTY(VisibleAnywhere, AdvancedDisplay, Category = \"Dialogue\", DisplayName = \"Nodes GUID To Index Map\")\n\tTMap<FGuid, int32> NodesGUIDToIndexMap;\n\n\t// Useful for syncing on the first run with the text file.\n\tbool bIsSyncedWithTextFile = false;\n\n#if WITH_EDITORONLY_DATA\n\t// EdGraph based representation of the DlgDialogue class\n\tUPROPERTY(Meta = (DlgNoExport))\n\tUEdGraph* DlgGraph;\n\n\t// Ptr to interface to dialogue editor operations. See function SetDialogueEditorAccess for more details.\n\tstatic TSharedPtr<IDlgDialogueEditorAccess> DialogueEditorAccess;\n\n\t// Flag used for optimization, used to enable/disable compiling of the dialogue for bulk operations.\n\tbool bCompileDialogue = true;\n\n\t// Flag indicating if this Dialogue was compiled at least once in the current runtime.\n\tbool bWasCompiledAtLeastOnce = false;\n\n\t// Used to build the change event and broadcast it to the children\n\tint32 BroadcastPropertyNodeIndexChanged = INDEX_NONE;\n#endif\n\n\n\t// Flag that indicates that PostLoad was called\n\tbool bWasPostLoaded = false;\n};\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystem/Public/DlgDialogueParticipant.h",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#pragma once\n\n#include \"CoreMinimal.h\"\n#include \"UObject/ObjectMacros.h\"\n#include \"UObject/Interface.h\"\n\n#include \"DlgDialogueParticipant.generated.h\"\n\nclass UTexture2D;\nclass UDlgContext;\n\nUINTERFACE(BlueprintType, Blueprintable)\nclass DLGSYSTEM_API UDlgDialogueParticipant : public UInterface\n{\n\tGENERATED_UINTERFACE_BODY()\n};\ninline UDlgDialogueParticipant::UDlgDialogueParticipant(const FObjectInitializer& ObjectInitializer) {}\n\n/**\n * Interface that each Dialogue participant must implement\n */\nclass DLGSYSTEM_API IDlgDialogueParticipant\n{\n\tGENERATED_IINTERFACE_BODY()\n\n\t//\n\t// Participant information\n\t//\n\n\tUFUNCTION(BlueprintNativeEvent, BlueprintCallable, Category = \"Dialogue|Participant\")\n\tFName GetParticipantName() const;\n\n\tUFUNCTION(BlueprintNativeEvent, BlueprintCallable, Category = \"Dialogue|Participant\")\n\tFText GetParticipantDisplayName(FName ActiveSpeaker) const;\n\n\t/** May be used for formatted node texts, check https://docs.unrealengine.com/en-us/Gameplay/Localization/Formatting for more information */\n\tUFUNCTION(BlueprintNativeEvent, BlueprintCallable, Category = \"Dialogue|Participant\")\n\tETextGender GetParticipantGender() const;\n\n\t/**\n\t* @param\tActiveSpeaker: name of the active speaker at the time of the call (might or might not this participant)\n\t* @param\tActiveSpeakerState: state of the active participant (might or might not belong to this participant)\n\t*\t\t\tIf it is not displayed in editor it has to be turned on in the dialogue settings\n\t* @return\tParticipant icon to display\n\t*/\n\tUFUNCTION(BlueprintNativeEvent, BlueprintCallable, Category = \"Dialogue|Participant\")\n\tUTexture2D* GetParticipantIcon(FName ActiveSpeaker, FName ActiveSpeakerState) const;\n\n\t//\n\t// Conditions\n\t//\n\n\tUFUNCTION(BlueprintNativeEvent, BlueprintCallable, Category = \"Dialogue|Participant|Condition\")\n\tbool CheckCondition(const UDlgContext* Context, FName ConditionName) const;\n\n\tUFUNCTION(BlueprintNativeEvent, BlueprintCallable, Category = \"Dialogue|Participant|Condition\")\n\tfloat GetFloatValue(FName ValueName) const;\n\n\tUFUNCTION(BlueprintNativeEvent, BlueprintCallable, Category = \"Dialogue|Participant|Condition\")\n\tint32 GetIntValue(FName ValueName) const;\n\n\tUFUNCTION(BlueprintNativeEvent, BlueprintCallable, Category = \"Dialogue|Participant|Condition\")\n\tbool GetBoolValue(FName ValueName) const;\n\n\tUFUNCTION(BlueprintNativeEvent, BlueprintCallable, Category = \"Dialogue|Participant|Condition\")\n\tFName GetNameValue(FName ValueName) const;\n\n\t//\n\t// Events\n\t//\n\n\t /** @return value: irrelevant */\n\tUFUNCTION(BlueprintNativeEvent, BlueprintCallable, Category = \"Dialogue|Participant|Event\")\n\tbool OnDialogueEvent(UDlgContext* Context, FName EventName);\n\n\t/**\n\t * @param\tbDelta Whether we expect the value to be set or modified\n\t * @return\tIrrelevant, ignored\n\t */\n\tUFUNCTION(BlueprintNativeEvent, BlueprintCallable, Category = \"Dialogue|Participant|Event\")\n\tbool ModifyFloatValue(FName ValueName, bool bDelta, float Value);\n\n\t/**\n\t * @param\tbDelta Whether we expect the value to be set or modified\n\t * @return\tIrrelevant, ignored\n\t */\n\tUFUNCTION(BlueprintNativeEvent, BlueprintCallable, Category = \"Dialogue|Participant|Event\")\n\tbool ModifyIntValue(FName ValueName, bool bDelta, int32 Value);\n\n\t/** @return value: irrelevant */\n\tUFUNCTION(BlueprintNativeEvent, BlueprintCallable, Category = \"Dialogue|Participant|Event\")\n\tbool ModifyBoolValue(FName ValueName, bool bNewValue);\n\n\t/** @return value: irrelevant */\n\tUFUNCTION(BlueprintNativeEvent, BlueprintCallable, Category = \"Dialogue|Participant|Event\")\n\tbool ModifyNameValue(FName ValueName, FName NameValue);\n};\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystem/Public/DlgDialogueParticipantData.h",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#pragma once\n\n#include \"DlgDialogueParticipantData.generated.h\"\n\nstruct FDlgCondition;\nstruct FDlgEvent;\nstruct FDlgTextArgument;\n\n// Structure useful to cache all the names used by a participant\nUSTRUCT(BlueprintType)\nstruct DLGSYSTEM_API FDlgParticipantData\n{\n\tGENERATED_USTRUCT_BODY()\n\npublic:\n\t// Helper functions to fill the data\n\tvoid AddConditionPrimaryData(const FDlgCondition& Condition);\n\tvoid AddConditionSecondaryData(const FDlgCondition& Condition);\n\tvoid AddEventData(const FDlgEvent& Event);\n\tvoid AddTextArgumentData(const FDlgTextArgument& TextArgument);\n\npublic:\n\t// FName based conditions (aka conditions of type EventCall).\n\tUPROPERTY(BlueprintReadWrite, VisibleAnywhere, Category = \"Dialogue|Participant\")\n\tTSet<FName> Conditions;\n\n\t// Custom Conditions UClasses of type UDlgConditionCustom\n\tUPROPERTY(BlueprintReadWrite, VisibleAnywhere, Category = \"Dialogue|Participant\")\n\tTSet<UClass*> CustomConditions;\n\n\t// FName based events (aka events of type EDlgEventType)\n\tUPROPERTY(BlueprintReadWrite, VisibleAnywhere, Category = \"Dialogue|Participant\")\n\tTSet<FName> Events;\n\n\t// Custom Events UClasses of type UDlgEventCustom\n\tUPROPERTY(BlueprintReadWrite, VisibleAnywhere, Category = \"Dialogue|Participant\")\n\tTSet<UClass*> CustomEvents;\n\n\t// Custom Events UClasses of type UDlgTextArgumentCustom\n\tUPROPERTY(BlueprintReadWrite, VisibleAnywhere, Category = \"Dialogue|Participant\")\n\tTSet<UClass*> CustomTextArguments;\n\n\t// Integers used in a Dialogue\n\tUPROPERTY(BlueprintReadWrite, VisibleAnywhere, Category = \"Dialogue|Participant\")\n\tTSet<FName> IntVariableNames;\n\n\t// Floats used in a Dialogue\n\tUPROPERTY(BlueprintReadWrite, VisibleAnywhere, Category = \"Dialogue|Participant\")\n\tTSet<FName> FloatVariableNames;\n\n\t// Booleans used in a Dialogue\n\tUPROPERTY(BlueprintReadWrite, VisibleAnywhere, Category = \"Dialogue|Participant\")\n\tTSet<FName> BoolVariableNames;\n\n\t// Names used in a Dialogue\n\tUPROPERTY(BlueprintReadWrite, VisibleAnywhere, Category = \"Dialogue|Participant\")\n\tTSet<FName> NameVariableNames;\n\n\t// Class Integers used in a Dialogue\n\tUPROPERTY(BlueprintReadWrite, VisibleAnywhere, Category = \"Dialogue|Participant\")\n\tTSet<FName> ClassIntVariableNames;\n\n\t// Class Floats used in a Dialogue\n\tUPROPERTY(BlueprintReadWrite, VisibleAnywhere, Category = \"Dialogue|Participant\")\n\tTSet<FName> ClassFloatVariableNames;\n\n\t// Class Booleans used in a Dialogue\n\tUPROPERTY(BlueprintReadWrite, VisibleAnywhere, Category = \"Dialogue|Participant\")\n\tTSet<FName> ClassBoolVariableNames;\n\n\t// Class Names used in a Dialogue\n\tUPROPERTY(BlueprintReadWrite, VisibleAnywhere, Category = \"Dialogue|Participant\")\n\tTSet<FName> ClassNameVariableNames;\n\n\t// Class Texts used in a Dialogue\n\tUPROPERTY(BlueprintReadWrite, VisibleAnywhere, Category = \"Dialogue|Participant\")\n\tTSet<FName> ClassTextVariableNames;\n};\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystem/Public/DlgEdge.h",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#pragma once\n\n#include \"CoreTypes.h\"\n\n#include \"DlgCondition.h\"\n#include \"DlgEvent.h\"\n#include \"DlgTextArgument.h\"\n\n#include \"DlgEdge.generated.h\"\n\nclass UDlgSystemSettings;\nclass UDlgContext;\nclass UDlgNode;\nclass UDlgDialogue;\n\n/**\n * The representation of a child in a node. Defined by a TargetIndex which points to the index array in the Dialogue.Nodes\n */\nUSTRUCT(BlueprintType)\nstruct DLGSYSTEM_API FDlgEdge\n{\n\tGENERATED_USTRUCT_BODY()\n\npublic:\n\t// Creates a simple edge without text, without conditions\n\tFDlgEdge(int32 InTargetIndex = INDEX_NONE) : TargetIndex(InTargetIndex) {}\n\n\t//\n\t// ICppStructOps Interface\n\t//\n\n\tbool operator==(const FDlgEdge& Other) const\n\t{\n\t\treturn TargetIndex == Other.TargetIndex &&\n            SpeakerState == Other.SpeakerState &&\n            Text.EqualTo(Other.Text) &&\n            bIncludeInAllOptionListIfUnsatisfied == Other.bIncludeInAllOptionListIfUnsatisfied &&\n            TextArguments == Other.TextArguments &&\n            Conditions == Other.Conditions;\n\t}\n\n\tbool operator!=(const FDlgEdge& Other) const\n\t{\n\t\treturn !(*this == Other);\n\t}\n\n\t//\n\t// Own methods\n\t//\n\n\t// Is the Text property visible on this edge, the edges comes from the ParentNode\n\tstatic bool IsTextVisible(const UDlgNode& ParentNode);\n\n\t// Updates the text value of the Edge Text from the default value and text remapping (if any)\n\tvoid UpdateTextValueFromDefaultAndRemapping(\n\t\tconst UDlgDialogue& ParentDialogue, const UDlgNode& ParentNode, const UDlgSystemSettings& Settings, bool bUpdateFromRemapping\n\t);\n\n\t// Updates the namespace or keys depending on the settings\n\tvoid UpdateTextsNamespacesAndKeys(const UObject* ParentObject, const UDlgSystemSettings& Settings);\n\n\t// Rebuilds TextArguments\n\tvoid RebuildTextArguments() { FDlgTextArgument::UpdateTextArgumentArray(Text, TextArguments); }\n\tvoid RebuildTextArgumentsFromPreview(const FText& Preview) { FDlgTextArgument::UpdateTextArgumentArray(Preview, TextArguments); }\n\n\t// Returns with true if every condition attached to the edge and every enter condition of the target node are satisfied //\n\tbool Evaluate(const UDlgContext& Context, TSet<const UDlgNode*> AlreadyVisitedNodes) const;\n\n\t// Constructs the ConstructedText.\n\tvoid RebuildConstructedText(const UDlgContext& Context, FName FallbackParticipantName);\n\n\tconst TArray<FDlgTextArgument>& GetTextArguments() const { return TextArguments; }\n\n\t// Sets the text and rebuilds the formatted constructed text\n\tvoid SetText(const FText& NewText)\n\t{\n\t\tSetUnformattedText(NewText);\n\t\tRebuildTextArguments();\n\t}\n\n\t// Sets the unformatted text, this is the text that includes the {identifier}\n\t// NOTE: this is not call RebuildTextArguments(), use SetText for that\n\tvoid SetUnformattedText(const FText& NewText)\n\t{\n\t\tText = NewText;\n\t}\n\n\t/** Gets the edge text. Empty text, or Text formatted with the text arguments if there is any, when the parent node is entered. */\n\tconst FText& GetText() const\n\t{\n\t\tif (TextArguments.Num() > 0 && !ConstructedText.IsEmpty())\n\t\t{\n\t\t\treturn ConstructedText;\n\t\t}\n\t\treturn Text;\n\t}\n\n\t// This always returns the unformatted text, if you want the formatted text use GetText()\n\tconst FText& GetUnformattedText() const { return Text; }\n\tFText& GetMutableUnformattedText() { return Text; }\n\n\t// Returns if the Edge is valid, has the TargetIndex non negative\n\tbool IsValid() const { return TargetIndex > INDEX_NONE; }\n\n\tstatic const FDlgEdge& GetInvalidEdge()\n\t{\n\t\tstatic FDlgEdge DlgEdge;\n\t\treturn DlgEdge;\n\t}\n\n\t// Helper functions to get the names of some properties. Used by the DlgSystemEditor module.\n\tstatic FName GetMemberNameText() { return GET_MEMBER_NAME_CHECKED(FDlgEdge, Text); }\n\tstatic FName GetMemberNameTextArguments() { return GET_MEMBER_NAME_CHECKED(FDlgEdge, TextArguments); }\n\npublic:\n\t// Index of the node in the Nodes TArray of the dialogue this edge is leading to\n\tUPROPERTY(VisibleAnywhere, BlueprintReadWrite, Category = \"Dialogue|Edge\", Meta = (ClampMin = -1))\n\tint32 TargetIndex = INDEX_NONE;\n\n\t// Required but not sufficient conditions - target node's enter conditions are checked too\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = \"Dialogue|Edge\")\n\tTArray<FDlgCondition> Conditions;\n\n\t// Player emotion/state attached to this player choice\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = \"Dialogue|Edge\")\n\tFName SpeakerState;\n\n\t// Set this to false in order to skip this edge in the AllChildren array (which lists both satisfied and not satisfied player choices\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = \"Dialogue|Edge\")\n\tbool bIncludeInAllOptionListIfUnsatisfied = true;\n\nprotected:\n\t// Some Variables are here to stop misuse\n\n\t// Text associated with the child, can be used for user choices\n\tUPROPERTY(EditAnywhere, BlueprintReadOnly, Category = \"Dialogue|Edge\", Meta = (MultiLine = true))\n\tFText Text;\n\n\t// If you want replaceable portions inside your Text nodes just add {identifier} inside it and set the value it should have at runtime.\n\tUPROPERTY(EditAnywhere, BlueprintReadOnly, EditFixedSize, Category = \"Dialogue|Edge\")\n\tTArray<FDlgTextArgument> TextArguments;\n\n\t// Constructed at runtime from the original text and the arguments if there is any.\n\tFText ConstructedText;\n};\n\ntemplate<>\nstruct TStructOpsTypeTraits<FDlgEdge> : public TStructOpsTypeTraitsBase2<FDlgEdge>\n{\n\tenum\n\t{\n\t\tWithIdenticalViaEquality = true\n    };\n};\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystem/Public/DlgEvent.h",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#pragma once\n\n#include \"CoreMinimal.h\"\n#include \"DlgEventCustom.h\"\n\n#include \"DlgEvent.generated.h\"\n\nclass UDlgContext;\n\nUENUM(BlueprintType)\nenum class EDlgEventType : uint8\n{\n\t// Calls OnDialogueEvent on the Participant\n\tEvent\t\t\t\t\t\tUMETA(DisplayName = \"Event\"),\n\n\t// Calls ModifyIntValue on the Participant\n\tModifyInt\t\t\t\t\tUMETA(DisplayName = \"Modify Dialogue Int Value\"),\n\n\t// Calls ModifyFloatValue on the Participant\n\tModifyFloat\t\t\t\t\tUMETA(DisplayName = \"Modify Dialogue Float Value\"),\n\n\t// Calls ModifyBoolValue on the Participant\n\tModifyBool\t\t\t\t\tUMETA(DisplayName = \"Modify Dialogue Bool Value\"),\n\n\t// Calls ModifyNameValue on the Participant\n\tModifyName\t\t\t\t\tUMETA(DisplayName = \"Modify Dialogue Name Value\"),\n\n\t// Modifies the value from the Participant Int Variable\n\tModifyClassIntVariable\t\tUMETA(DisplayName = \"Modify Class Int Variable\"),\n\n\t// Modifies the value from the Participant Float Variable\n\tModifyClassFloatVariable\tUMETA(DisplayName = \"Modify Class Float Variable\"),\n\n\t// Modifies the value from the Participant Bool Variable\n\tModifyClassBoolVariable\t\tUMETA(DisplayName = \"Modify Class Bool Variable\"),\n\n\t// Modifies the value from the Participant Name Variable\n\tModifyClassNameVariable\t\tUMETA(DisplayName = \"Modify Class Name Variable\"),\n\n\t// User Defined Event, calls EnterEvent on the custom event object.\n\t//\n\t// 1. Create a new Blueprint derived from DlgEventCustom (or DlgEventCustomHideCategories)\n\t// 2. Override EnterEvent\n\tCustom\t\t\t\t\t\tUMETA(DisplayName = \"Custom Event\")\n};\n\n\n// Events are executed via calling IDlgDialogueParticipant methods on dialogue participants\n// They must be handled in game side, can be used to modify game state based on dialogue\nUSTRUCT(BlueprintType)\nstruct DLGSYSTEM_API FDlgEvent\n{\n\tGENERATED_USTRUCT_BODY()\n\npublic:\n\t//\n\t// ICppStructOps Interface\n\t//\n\n\tbool operator==(const FDlgEvent& Other) const\n\t{\n\t\treturn ParticipantName == Other.ParticipantName &&\n\t\t\tEventName == Other.EventName &&\n\t\t\tIntValue == Other.IntValue &&\n\t\t\tFMath::IsNearlyEqual(FloatValue, Other.FloatValue, KINDA_SMALL_NUMBER) &&\n\t\t\tbDelta == Other.bDelta &&\n\t\t\tbValue == Other.bValue &&\n\t\t\tEventType == Other.EventType &&\n\t\t\tCustomEvent == Other.CustomEvent;\n\t}\n\n\t//\n\t// Own methods\n\t//\n\n\t// Executes the event\n\t// Participant is expected to implement IDlgDialogueParticipant interface\n\tvoid Call(UDlgContext& Context, const FString& ContextString, UObject* Participant) const;\n\n\tFString GetCustomEventName() const\n\t{\n\t\treturn CustomEvent ? CustomEvent->GetName() : TEXT(\"INVALID\");\n\t}\n\n\tstatic FString EventTypeToString(EDlgEventType Type);\n\n\t// Is this a Condition which has a Dialogue Value\n\t// NOTE: without EDlgConditionType::EventCall, for that call HasParticipantInterfaceValue\n\tstatic bool HasDialogueValue(EDlgEventType Type)\n\t{\n\t\treturn Type == EDlgEventType::ModifyBool\n            || Type == EDlgEventType::ModifyFloat\n            || Type == EDlgEventType::ModifyInt\n            || Type == EDlgEventType::ModifyName;\n\t}\n\n\t// Same as HasDialogueValue but also Has the Event\n\tstatic bool HasParticipantInterfaceValue(EDlgEventType Type)\n\t{\n\t\treturn Type == EDlgEventType::Event || HasDialogueValue(Type);\n\t}\n\n\t// Is this a Condition which has a Class Variable\n\tstatic bool HasClassVariable(EDlgEventType Type)\n\t{\n\t\treturn Type == EDlgEventType::ModifyClassBoolVariable\n            || Type == EDlgEventType::ModifyClassFloatVariable\n            || Type == EDlgEventType::ModifyClassIntVariable\n            || Type == EDlgEventType::ModifyClassNameVariable;\n\t}\n\nprotected:\n\tbool ValidateIsParticipantValid(const UDlgContext& Context, const FString& ContextString, const UObject* Participant) const;\n\n\t// Is the participant required?\n\tbool MustHaveParticipant() const { return EventType != EDlgEventType::Custom; }\n\npublic:\n\t// Name of the participant (speaker) the event is called on.\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = \"Dialogue|Event\")\n\tFName ParticipantName;\n\n\t// Type of the event, can be a simple event or a call to modify a bool/int/float variable\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = \"Dialogue|Event\")\n\tEDlgEventType EventType = EDlgEventType::Event;\n\n\t// Name of the relevant variable or event\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = \"Dialogue|Event\")\n\tFName EventName;\n\n\t// The value the participant gets\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = \"Dialogue|Event\")\n\tint32 IntValue = 0;\n\n\t// The value the participant gets\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = \"Dialogue|Event\")\n\tfloat FloatValue = 0.f;\n\n\t// The value the participant gets\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = \"Dialogue|Event\")\n\tFName NameValue;\n\n\t// Weather to add the value to the existing one, or simply override it\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = \"Dialogue|Event\")\n\tbool bDelta = false;\n\n\t// The value the participant gets\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = \"Dialogue|Event\")\n\tbool bValue = false;\n\n\t// User Defined Event, calls EnterEvent on the custom event object.\n\t//\n\t// 1. Create a new Blueprint derived from DlgEventCustom (or DlgEventCustomHideCategories)\n\t// 2. Override EnterEvent\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Instanced, Category = \"Dialogue|Event\")\n\tUDlgEventCustom* CustomEvent = nullptr;\n};\n\ntemplate<>\nstruct TStructOpsTypeTraits<FDlgEvent> : public TStructOpsTypeTraitsBase2<FDlgEvent>\n{\n\tenum\n\t{\n\t\tWithIdenticalViaEquality = true\n    };\n};\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystem/Public/DlgEventCustom.h",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#pragma once\n#include \"DlgObject.h\"\n\n#include \"DlgEventCustom.generated.h\"\n\nclass UDlgContext;\n\n// Abstract base class for a custom event\n// Extend this class to define additional data you want to store\n//\n// 1. Override EnterEvent\nUCLASS(Blueprintable, BlueprintType, Abstract, EditInlineNew)\nclass DLGSYSTEM_API UDlgEventCustom : public UDlgObject\n{\n\tGENERATED_BODY()\npublic:\n\t// Called when the event is triggered.\n\tUFUNCTION(BlueprintCallable, BlueprintNativeEvent, Category = \"Dialogue\", DisplayName = \"Enter\")\n\tvoid EnterEvent(UDlgContext* Context, UObject* Participant);\n\tvirtual void EnterEvent_Implementation(UDlgContext* Context, UObject* Participant) {}\n};\n\n// This is the same as UDlgEventCustom but it does NOT show the categories\nUCLASS(Blueprintable, BlueprintType, Abstract, EditInlineNew, CollapseCategories)\nclass DLGSYSTEM_API UDlgEventCustomHideCategories : public UDlgEventCustom\n{\n\tGENERATED_BODY()\n};\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystem/Public/DlgHelper.h",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#pragma once\n\n#include \"CoreMinimal.h\"\n#include \"Math/UnrealMathUtility.h\"\n#include \"UObject/Object.h\"\n#include \"UObject/UnrealType.h\"\n#include \"UObject/ObjectMacros.h\"\n#include <functional>\n\n\n\n#include \"DlgCondition.h\"\n#include \"DlgEvent.h\"\n#include \"NYReflectionTypes.h\"\n\n#include \"DlgHelper.generated.h\"\n\nclass UDlgSystemSettings;\n\n\nUSTRUCT()\nstruct FDlgClassAndObject\n{\n\tGENERATED_USTRUCT_BODY()\npublic:\n\tUPROPERTY()\n\tUClass* Class = nullptr;\n\n\tUPROPERTY()\n\tUObject* Object = nullptr;\n};\n\n// Const version of FScriptArrayHelper\nclass FDlgConstScriptArrayHelper : public FScriptArrayHelper\n{\n\ttypedef FScriptArrayHelper Super;\n\ttypedef FDlgConstScriptArrayHelper Self;\npublic:\n\tFORCEINLINE FDlgConstScriptArrayHelper(const FNYArrayProperty* InProperty, const void *InArray)\n\t\t: Super(InProperty, InArray) {}\n\n\tFORCEINLINE const uint8* GetConstRawPtr(int32 Index = 0) const\n\t{\n\t\treturn const_cast<Self*>(this)->GetRawPtr(Index);\n\t}\n};\n\n\n// Const version of FScriptMapHelper\nclass FDlgConstScriptMapHelper : public FScriptMapHelper\n{\n\ttypedef FScriptMapHelper Super;\n\ttypedef FDlgConstScriptMapHelper Self;\npublic:\n\n\tFORCEINLINE FDlgConstScriptMapHelper(const FNYMapProperty* InProperty, const void* InMap)\n\t\t: Super(InProperty, InMap) {}\n\n\n\tFORCEINLINE const uint8* GetConstKeyPtr(int32 Index) const\n\t{\n\t\treturn const_cast<Self*>(this)->GetKeyPtr(Index);\n\t}\n\n\tFORCEINLINE const uint8* GetConstValuePtr(int32 Index) const\n\t{\n\t\treturn const_cast<Self*>(this)->GetValuePtr(Index);\n\t}\n};\n\n\n/**\n * Classes created because Function templates cannot be partially specialised. so we use a delegate class trick\n * https://stackoverflow.com/questions/16154480/getting-illegal-use-of-explicit-template-arguments-when-doing-a-pointer-partia\n */\ntemplate <typename KeyType, typename ValueType>\nclass FDlgHelper_MapEqualImpl\n{\npublic:\n\tstatic bool IsEqual(\n\t\tconst TMap<KeyType, ValueType>& FirstMap,\n\t\tconst TMap<KeyType, ValueType>& SecondMap,\n\t\tstd::function<bool(const ValueType& FirstMapValue,\n\t\tconst ValueType& SecondMapValue)> AreValuesEqual\n\t)\n\t{\n\t\tif (FirstMap.Num() == SecondMap.Num())\n\t\t{\n\t\t\tfor (const auto& ElemFirstMap : FirstMap)\n\t\t\t{\n\t\t\t\tconst auto* FoundValueSecondMap = SecondMap.Find(ElemFirstMap.Key);\n\t\t\t\tif (FoundValueSecondMap != nullptr)\n\t\t\t\t{\n\t\t\t\t\t// Key exists in second map\n\t\t\t\t\tif (!AreValuesEqual(ElemFirstMap.Value, *FoundValueSecondMap))\n\t\t\t\t\t{\n\t\t\t\t\t\t// Value differs\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t// Key does not even exist\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn true;\n\t\t}\n\n\t\t// Length differs\n\t\treturn false;\n\t}\n};\n\n// Variant with default comparison\ntemplate <typename KeyType, typename ValueType>\nclass FDlgHelper_MapEqualVariantImpl\n{\npublic:\n\tstatic bool IsEqual(const TMap<KeyType, ValueType>& FirstMap, const TMap<KeyType, ValueType>& SecondMap)\n\t{\n\t\treturn FDlgHelper_MapEqualImpl<KeyType, ValueType>::IsEqual(FirstMap, SecondMap,\n\t\t\t[](const ValueType& FirstMapValue, const ValueType& SecondMapValue) -> bool\n\t\t{\n\t\t\treturn FirstMapValue == SecondMapValue;\n\t\t});\n\t}\n};\n\n// Variant with Specialization for float ValueType\ntemplate <typename KeyType>\nclass FDlgHelper_MapEqualVariantImpl<KeyType, float>\n{\npublic:\n\tstatic bool IsEqual(const TMap<KeyType, float>& FirstMap, const TMap<KeyType, float>& SecondMap)\n\t{\n\t\treturn FDlgHelper_MapEqualImpl<KeyType, float>::IsEqual(FirstMap, SecondMap,\n\t\t\t[](const float& FirstMapValue, const float& SecondMapValue) -> bool\n\t\t{\n\t\t\treturn FMath::IsNearlyEqual(FirstMapValue, SecondMapValue, KINDA_SMALL_NUMBER);\n\t\t});\n\t}\n};\n\n\ntemplate <typename ArrayType>\nclass FDlgHelper_ArrayEqualImpl\n{\npublic:\n\tstatic bool IsEqual(\n\t\tconst TArray<ArrayType>& FirstArray,\n\t\tconst TArray<ArrayType>& SecondArray,\n\t\tstd::function<bool(const ArrayType& FirstValue,\n\t\tconst ArrayType& SecondValue)> AreValuesEqual\n\t)\n\t{\n\t\tif (FirstArray.Num() == SecondArray.Num())\n\t\t{\n\t\t\t// Some value is not equal\n\t\t\tfor (int32 Index = 0; Index < FirstArray.Num(); Index++)\n\t\t\t{\n\t\t\t\tif (!AreValuesEqual(FirstArray[Index], SecondArray[Index]))\n\t\t\t\t{\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn true;\n\t\t}\n\n\t\t// length differs\n\t\treturn false;\n\t}\n};\n\n// Variant with default comparison\ntemplate <typename ArrayType>\nclass FDlgHelper_ArrayEqualVariantImpl\n{\npublic:\n\tstatic bool IsEqual(const TArray<ArrayType>& FirstArray, const TArray<ArrayType>& SecondArray)\n\t{\n\t\treturn FDlgHelper_ArrayEqualImpl<ArrayType>::IsEqual(FirstArray\t, SecondArray,\n\t\t\t[](const ArrayType& FirstValue, const ArrayType& SecondValue) -> bool\n\t\t{\n\t\t\treturn FirstValue == SecondValue;\n\t\t});\n\t}\n};\n\n// Variant with Specialization for float ArrayType\ntemplate <>\nclass FDlgHelper_ArrayEqualVariantImpl<float>\n{\npublic:\n\tstatic bool IsEqual(const TArray<float>& FirstArray, const TArray<float>& SecondArray)\n\t{\n\t\treturn FDlgHelper_ArrayEqualImpl<float>::IsEqual(FirstArray, SecondArray,\n\t\t\t[](const float& FirstValue, const float& SecondValue) -> bool\n\t\t{\n\t\t\treturn FMath::IsNearlyEqual(FirstValue, SecondValue, KINDA_SMALL_NUMBER);\n\t\t});\n\t}\n};\n\n\n/**\n * General helper methods\n */\nclass DLGSYSTEM_API FDlgHelper\n{\n\ttypedef FDlgHelper Self;\npublic:\n\tFORCEINLINE static int64 RandomInt64() { return static_cast<int64>(FMath::Rand()) << 32 | FMath::Rand(); }\n\tFORCEINLINE static bool IsFloatEqual(const float A, const float B) { return FMath::IsNearlyEqual(A, B, KINDA_SMALL_NUMBER); }\n\tFORCEINLINE static bool IsPathInProjectDirectory(const FString& Path) { return Path.StartsWith(\"/Game\");  }\n\n\tstatic FString GetFullNameFromObject(const UObject* Object)\n\t{\n\t\tif (!IsValid(Object))\n\t\t{\n\t\t\treturn TEXT(\"nullptr\");\n\t\t}\n\t\treturn Object->GetFullName();\n\t}\n\n\tstatic FString GetClassNameFromObject(const UObject* Object)\n\t{\n\t\tif (!IsValid(Object))\n\t\t{\n\t\t\treturn TEXT(\"INVALID CLASS\");\n\t\t}\n\t\treturn Object->GetClass()->GetName();\n\t}\n\n\t// Removes _C from the end of the Name\n\t// And removes the .extension from the path names\n\tstatic FString CleanObjectName(FString Name);\n\n\t// Blueprint Helpers\n\tstatic bool IsClassIgnored(const UClass* Class);\n\tstatic bool IsABlueprintClass(const UClass* Class);\n\tstatic bool IsABlueprintObject(const UObject* Object);\n\n\t// This also works with Blueprints\n\tstatic bool IsObjectAChildOf(const UObject* Object, const UClass* ParentClass);\n\n\t// This also works with Blueprints\n\tstatic bool IsObjectImplementingInterface(const UObject* Object, const UClass* InterfaceClass);\n\n\t// Gets all child classes of ParentClass\n\t// NOTE: this is super slow, use with care\n\tstatic bool GetAllChildClassesOf(const UClass* ParentClass, TArray<UClass*>& OutNativeClasses, TArray<UClass*>& OutBlueprintClasses);\n\n\t// Gets all classes that implement InterfaceClass\n\t// NOTE: this is super slow, use with care\n\tstatic bool GetAllClassesImplementingInterface(const UClass* InterfaceClass, TArray<UClass*>& OutNativeClasses, TArray<UClass*>& OutBlueprintClasses);\n\n\t// Converts the Classes Array that represent the Dialogue Participants into a map where\n\t// Key: The participant Name\n\t// Value: An array of structs that contain the class and the object for that participant name\n\tstatic TMap<FName, TArray<FDlgClassAndObject>> ConvertDialogueParticipantsClassesIntoMap(const TArray<UClass*>& Classes);\n\n\t// FileSystem\n\tstatic bool DeleteFile(const FString& PathName, bool bVerbose = true);\n\tstatic bool RenameFile(const FString& OldPathName, const FString& NewPathName, bool bOverWrite = false, bool bVerbose = true);\n\n\t// Get the Interface Function Name for this Event Type\n\tstatic FName GetFunctionNameForEventType(EDlgEventType EventType)\n\t{\n\t\tswitch (EventType)\n\t\t{\n\t\tcase EDlgEventType::Event:\n\t\t\treturn TEXT(\"OnDialogueEvent\");\n\t\tcase EDlgEventType::ModifyBool:\n\t\t\treturn TEXT(\"ModifyBoolValue\");\n\t\tcase EDlgEventType::ModifyFloat:\n\t\t\treturn TEXT(\"ModifyFloatValue\");\n\t\tcase EDlgEventType::ModifyInt:\n\t\t\treturn TEXT(\"ModifyIntValue\");\n\t\tcase EDlgEventType::ModifyName:\n\t\t\treturn TEXT(\"ModifyIntValue\");\n\t\tdefault:\n\t\t\tbreak;\n\t\t}\n\n\t\treturn NAME_None;\n\t}\n\n\tstatic FName GetFunctionNameForConditionType(EDlgConditionType ConditionType)\n\t{\n\t\tswitch (ConditionType)\n\t\t{\n\t\tcase EDlgConditionType::EventCall:\n\t\t\treturn TEXT(\"CheckCondition\");\n\t\tcase EDlgConditionType::BoolCall:\n\t\t\treturn TEXT(\"GetBoolValue\");\n\t\tcase EDlgConditionType::FloatCall:\n\t\t\treturn TEXT(\"GetFloatValue\");\n\t\tcase EDlgConditionType::IntCall:\n\t\t\treturn TEXT(\"GetIntValue\");\n\t\tcase EDlgConditionType::NameCall:\n\t\t\treturn TEXT(\"GetNameValue\");\n\t\tdefault:\n\t\t\tbreak;\n\t\t}\n\n\t\treturn NAME_None;\n\t}\n\n\ttemplate<typename TEnum>\n    static bool ConvertEnumToString(const FString& EnumName, TEnum EnumValue, bool bWithNameSpace, FString& OutEnumValue)\n\t{\n\t\tconst UEnum* EnumPtr = FindObject<UEnum>(ANY_PACKAGE, *EnumName, true);\n\t\tif (!EnumPtr)\n\t\t{\n\t\t\tOutEnumValue = FString::Printf(TEXT(\"INVALID EnumName = `%s`\"), *EnumName);\n\t\t\treturn false;\n\t\t}\n\n\t\tOutEnumValue = bWithNameSpace ? EnumPtr->GetNameByIndex(static_cast<int32>(EnumValue)).ToString()\n                                      : EnumPtr->GetNameStringByIndex(static_cast<int32>(EnumValue));\n\t\treturn true;\n\t}\n\n\ttemplate<typename TEnum>\n    static bool ConvertStringToEnum(const FString& String, const FString& EnumName, TEnum& OutEnumValue)\n\t{\n\t\tconst UEnum* EnumPtr = FindObject<UEnum>(ANY_PACKAGE, *EnumName, true);\n\t\tif (!EnumPtr)\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\tconst int32 Index = EnumPtr->GetIndexByNameString(String);\n\t\tOutEnumValue = static_cast<TEnum>(Index);\n\t\treturn true;\n\t}\n\n\ttemplate<typename TEnum>\n    static bool ConvertFNameToEnum(FName Name, const FString& EnumName, TEnum& OutEnumValue)\n\t{\n\t\tconst UEnum* EnumPtr = FindObject<UEnum>(ANY_PACKAGE, *EnumName, true);\n\t\tif (!EnumPtr)\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\tconst int32 Index = EnumPtr->GetIndexByName(Name);\n\t\tOutEnumValue = static_cast<TEnum>(Index);\n\t\treturn true;\n\t}\n\n\t// Gets the first element from a set. From https://answers.unrealengine.com/questions/332443/how-to-get-the-firstonly-element-in-tset.html\n\ttemplate <typename SetType>\n\tstatic typename TCopyQualifiersFromTo<SetType, typename SetType::ElementType>::Type* GetFirstSetElement(SetType& Set)\n\t{\n\t\tfor (auto& Element : Set)\n\t\t{\n\t\t\treturn &Element;\n\t\t}\n\n\t\treturn nullptr;\n\t}\n\n\t// Is FirstSet == SecondSet\n\t// NOTE for SetType = float this won't work, what are you even doing?\n\ttemplate <typename SetType>\n\tstatic bool IsSetEqual(const TSet<SetType>& FirstSet, const TSet<SetType>& SecondSet)\n\t{\n\t\tif (FirstSet.Num() == SecondSet.Num())\n\t\t{\n\t\t\t// No duplicates should be found\n\t\t\tTSet<SetType> Set = FirstSet;\n\t\t\tSet.Append(SecondSet);\n\n\t\t\treturn Set.Num() == FirstSet.Num();\n\t\t}\n\n\t\treturn false;\n\t}\n\n\t// Is FirstArray == SecondArray ?\n\ttemplate <typename ArrayType>\n\tstatic bool IsArrayEqual(const TArray<ArrayType>& FirstArray, const TArray<ArrayType>& SecondArray,\n\t\tstd::function<bool(const ArrayType& FirstValue, const ArrayType& SecondValue)> AreValuesEqual)\n\t{\n\t\treturn FDlgHelper_ArrayEqualImpl<ArrayType>::IsEqual(FirstArray, SecondArray, AreValuesEqual);\n\t}\n\n\t// Variant with default comparison\n\ttemplate <typename ArrayType>\n\tstatic bool IsArrayEqual(const TArray<ArrayType>& FirstArray, const TArray<ArrayType>& SecondArray)\n\t{\n\t\treturn FDlgHelper_ArrayEqualVariantImpl<ArrayType>::IsEqual(FirstArray, SecondArray);\n\t}\n\n\t// Variant with pointer value comparison\n\ttemplate <typename ArrayType>\n\tstatic bool IsArrayOfPointersEqual(const TArray<ArrayType*>& FirstArray, const TArray<ArrayType*>& SecondArray)\n\t{\n\t\treturn FDlgHelper_ArrayEqualImpl<ArrayType*>::IsEqual(FirstArray, SecondArray,\n\t\t\t[](const auto* FirstValue, const auto* SecondValue) -> bool\n\t\t\t{\n\t\t\t\tif (FirstValue == nullptr)\n\t\t\t\t{\n\t\t\t\t\treturn SecondValue == nullptr;\n\t\t\t\t}\n\t\t\t\treturn *FirstValue == *SecondValue;\n\t\t\t});\n\t}\n\n\t// Is FirstMap == SecondMap ?\n\ttemplate <typename KeyType, typename ValueType>\n\tstatic bool IsMapEqual(const TMap<KeyType, ValueType>& FirstMap, const TMap<KeyType, ValueType>& SecondMap,\n\t\tstd::function<bool(const ValueType& FirstMapValue, const ValueType& SecondMapValue)> AreValuesEqual)\n\t{\n\t\treturn FDlgHelper_MapEqualImpl<KeyType, ValueType>::IsEqual(FirstMap, SecondMap, AreValuesEqual);\n\t}\n\n\t// Variant with default comparison\n\ttemplate <typename KeyType, typename ValueType>\n\tstatic bool IsMapEqual(const TMap<KeyType, ValueType>& FirstMap, const TMap<KeyType, ValueType>& SecondMap)\n\t{\n\t\treturn FDlgHelper_MapEqualVariantImpl<KeyType, ValueType>::IsEqual(FirstMap, SecondMap);\n\t}\n\n\t// Default comparison function\n\tstatic bool PredicateSortFNameAlphabeticallyAscending(FName A, FName B)\n\t{\n\t\treturn A.Compare(B) < 0;\n\t}\n\n\t/** Default sorting function used by all the Dialogue related methods. Sorts alphabetically ascending. */\n\tstatic void SortDefault(TArray<FName>& OutArray)\n    {\n\t\tOutArray.Sort(PredicateSortFNameAlphabeticallyAscending);\n    }\n\tstatic void SortDefault(TSet<FName>& OutSet)\n\t{\n\t\tOutSet.Sort(PredicateSortFNameAlphabeticallyAscending);\n\t}\n\n\ttemplate<typename ValueType>\n\tstatic void SortDefault(TMap<FName, ValueType>& Map)\n\t{\n\t\tMap.KeySort(PredicateSortFNameAlphabeticallyAscending);\n\t}\n\n\t/** Helper method, used to append a set to an array. Also sort. */\n\tstatic void AppendSortedSetToArray(const TSet<FName>& InSet, TArray<FName>& OutArray)\n\t{\n\t\tTArray<FName> UniqueNamesArray = InSet.Array();\n\t\tSortDefault(UniqueNamesArray);\n\t\tOutArray.Append(UniqueNamesArray);\n\t}\n\n\tFORCEINLINE static bool IsPossiblyAllocatedUObjectPointer(const void* Ptr)\n\t{\n\t\tauto CountByteValues = [](UPTRINT Val, UPTRINT ByteVal) -> int32\n\t\t{\n\t\t\tint32 Result = 0;\n\n\t\t\tfor (int32 I = 0; I != sizeof(UPTRINT); ++I)\n\t\t\t{\n\t\t\t\tif ((Val & 0xFF) == ByteVal)\n\t\t\t\t{\n\t\t\t\t\t++Result;\n\t\t\t\t}\n\t\t\t\tVal >>= 8;\n\t\t\t}\n\n\t\t\treturn Result;\n\t\t};\n\n\t\tconst UPTRINT PtrVal = (UPTRINT)Ptr;\n\t\t// (void*) - 1 Is technically a valid address 0xffffffff, but is it?\n\t\treturn Ptr != nullptr && Ptr != ((void*) - 1) && PtrVal >= 0x1000 && CountByteValues(PtrVal, 0xCD) < sizeof(UPTRINT) / 2;\n\t}\n\n\t/** Very low level and safe way to check if the object is valid. Kinda slow but safe. */\n\tstatic bool IsValidLowLevel(const UObject* Object)\n\t{\n\t\tif (Object == nullptr)\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\t// From IsValidLowLevelFast\n\t\t// Check pointer range, may the gods have mercy\n\t\tif (!::IsPossiblyAllocatedUObjectPointer(const_cast<UObject*>(Object)))\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\t// As DEFAULT_ALIGNMENT is defined to 0 now, I changed that to the original numerical value here\n\t\tstatic const int32 AlignmentCheck = MIN_ALIGNMENT - 1;\n\t\tif ((UPTRINT)Object & AlignmentCheck)\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t\t//if (!FDlgHelper::IsPossiblyAllocatedUObjectPointer((void**)Object) || !FDlgHelper::IsPossiblyAllocatedUObjectPointer(*(void**)Object))\n\t\t//{\n\t\t//\treturn false;\n\t\t//}\n\n\t\t// Virtual functions table is invalid.\n\t\tif ((void**)Object == nullptr || *(void**)Object == nullptr)\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\tif (!Object->IsValidLowLevelFast())\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\treturn !Object->IsPendingKillOrUnreachable();\n\t}\n};\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystem/Public/DlgLocalizationHelper.h",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#pragma once\n\n#include \"CoreMinimal.h\"\n\n#if WITH_EDITOR && USE_STABLE_LOCALIZATION_KEYS\n#include \"STextPropertyEditableTextBox.h\"\n#endif// WITH_EDITOR && USE_STABLE_LOCALIZATION_KEYS\n\nclass UDlgSystemSettings;\n\n/**\n * General helper methods\n */\nclass DLGSYSTEM_API FDlgLocalizationHelper\n{\n\ttypedef FDlgLocalizationHelper Self;\npublic:\n\tstatic void UpdateTextFromRemapping(const UDlgSystemSettings& Settings, FText& OutText);\n\n#if WITH_EDITOR\n\t// Updates the text namespace to match the settings options\n\t// NOTE: only works in editor mode\n\tstatic void UpdateTextNamespaceAndKey(const UObject* Object, const UDlgSystemSettings& Settings, FText& Text);\n#else\n\t// NO OP\n\tstatic void UpdateTextNamespaceAndKey(const UObject* Object, const UDlgSystemSettings& Settings, FText& Text) {}\n#endif\n\n\t// Will we update the text namespace for the following texts\n\tstatic bool WillTextNamespaceBeUpdated(const FText& Text);\n\tstatic bool WillTextNamespaceBeUpdated(const FText& Text, const UDlgSystemSettings& Settings);\n\n#if WITH_EDITOR && USE_STABLE_LOCALIZATION_KEYS\n\t// Copied From IEditableTextProperty\n\n\t/** Get the localization ID we should use for the given object, and the given text instance */\n\tstatic void StaticStableTextId(const UObject* InObject, IEditableTextProperty::ETextPropertyEditAction InEditAction, const FString& InTextSource, const FString& InProposedNamespace, const FString& InProposedKey, FString& OutStableNamespace, FString& OutStableKey);\n\n\t/** Get the localization ID we should use for the given package, and the given text instance */\n\tstatic void StaticStableTextId(const UPackage* InPackage, IEditableTextProperty::ETextPropertyEditAction InEditAction, const FString& InTextSource, const FString& InProposedNamespace, const FString& InProposedKey, FString& OutStableNamespace, FString& OutStableKey);\n\nprotected:\n\t// Returns true if we should do an update of the FText\n\t//         false otherwise\n\tstatic bool GetNewNamespaceAndKey(\n\t\tconst UObject* Object,\n\t\tconst UDlgSystemSettings& Settings,\n\t\tconst FText& Text,\n\t\tFString& OutNewNamespace,\n\t\tFString& OutNewKey\n\t);\n\n#endif // WITH_EDITOR && USE_STABLE_LOCALIZATION_KEYS\n\n};\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystem/Public/DlgManager.h",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#pragma once\n#include \"Kismet/BlueprintFunctionLibrary.h\"\n\n#include \"DlgDialogue.h\"\n#include \"DlgDialogueParticipant.h\"\n#include \"DlgMemory.h\"\n\n#include \"DlgManager.generated.h\"\n\nclass AActor;\nclass UDlgContext;\nclass UDlgDialogue;\n\n\nUSTRUCT(BlueprintType)\nstruct DLGSYSTEM_API FDlgObjectsArray\n{\n\tGENERATED_USTRUCT_BODY()\n\npublic:\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = \"Data\")\n\tTArray<UObject*> Array;\n};\n\n/**\n *  Class providing a collection of static functions to start a conversation and work with Dialogues.\n */\nUCLASS()\nclass DLGSYSTEM_API UDlgManager : public UBlueprintFunctionLibrary\n{\n\tGENERATED_BODY()\n\npublic:\n\n\t/**\n\t * Starts a Dialogue with the provided Dialogue\n\t * The function checks all the objects in the world to gather the participants\n\t * This method can fail in the following situations:\n\t *  - The Dialogue has a Participant which does not exist in the World\n\t *\t- Multiple Objects are using the same Participant Name in the World\n\t *\n\t *\tNOTE: If this fails because it can't find the unique participants you should use the StartDialogue* functions\n\t *\n\t * @returns The dialogue context object or nullptr if something went wrong\n\t */\n\tUFUNCTION(BlueprintCallable, Category = \"Dialogue|Launch\", meta = (WorldContext = \"WorldContextObject\"))\n\tstatic UDlgContext* StartDialogueWithDefaultParticipants(UObject* WorldContextObject, UDlgDialogue* Dialogue);\n\n\t// Supplies where we called this from\n\tstatic UDlgContext* StartDialogueWithContext(const FString& ContextString, UDlgDialogue* Dialogue, const TArray<UObject*>& Participants);\n\n\t/**\n\t * Starts a Dialogue with the provided Dialogue and Participants array\n\t * This method can fail in the following situations:\n\t *  - The Participants number does not match the number of participants from the Dialogue.\n\t *  - Any UObject in the Participant array does not implement the Participant Interface\n\t *  - Participant->GetParticipantName() does not exist in the Dialogue\n\t *\n\t * @returns The dialogue context object or nullptr if something wrong happened\n\t */\n\tUFUNCTION(BlueprintCallable, Category = \"Dialogue|Launch\")\n\tstatic UDlgContext* StartDialogue(UDlgDialogue* Dialogue, UPARAM(ref)const TArray<UObject*>& Participants)\n\t{\n\t\treturn StartDialogueWithContext(TEXT(\"StartDialogue\"), Dialogue, Participants);\n\t}\n\n\t/**\n\t * Checks if there is any child of the start node which can be enterred based on the conditions\n\t *\n\t * @returns true if there is an enterable node from the start node\n\t */\n\tUFUNCTION(BlueprintCallable, Category = \"Dialogue|Launch\")\n\tstatic bool CanStartDialogue(UDlgDialogue* Dialogue, UPARAM(ref)const TArray<UObject*>& Participants);\n\n\t/**\n\t * Starts a Dialogue with the provided Dialogue and Participants array, at the given entry point\n\t *\n\t * NOTE: You should most likely use ResumeDialogueFromNodeGUID\n\t *\n\t * This method can fail in the following situations:\n\t *  - The Participants number does not match the number of participants from the Dialogue.\n\t *  - Any UObject in the Participant array does not implement the Participant Interface\n\t *  - Participant->GetParticipantName() does not exist in the Dialogue\n\t *  - The given node index is invalid\n\t *  - The starter node does not have any valid child\n\t *\n\t * @param Dialogue\t\t\t\t- The dialogue asset to start\n\t * @param Participants\t\t\t- Array of participants, has to match with the expected input for the Dialogue\n\t * @param StartIndex\t\t    - Index of the node the dialogue is resumed at\n\t * @param AlreadyVisitedNodes\t- Set of nodes already visited in the context the last time this Dialogue was going on.\n\t *\t\t\t\t\t\t\t\t  Can be acquired via GetVisitedNodeIndices() on the context\n\t * @param bFireEnterEvents\t\t- decides if the enter events should be fired on the resumed node or not\n\t * @returns The dialogue context object or nullptr if something wrong happened\n\t */\n\tUFUNCTION(BlueprintCallable, Category = \"Dialogue|Launch\")\n\tstatic UDlgContext* ResumeDialogueFromNodeIndex(\n\t\tUDlgDialogue* Dialogue,\n\t\tUPARAM(ref)const TArray<UObject*>& Participants,\n\t\tUPARAM(DisplayName=\"Start Node Index\") int32 StartIndex,\n\t\tconst TSet<int32>& AlreadyVisitedNodes,\n\t\tbool bFireEnterEvents\n\t);\n\n\t/**\n\t* Starts a Dialogue with the provided Dialogue and Participants array, at the given entry point\n\t*\n\t* This method can fail in the following situations:\n\t*  - The Participants number does not match the number of participants from the Dialogue.\n\t*  - Any UObject in the Participant array does not implement the Participant Interface\n\t*  - Participant->GetParticipantName() does not exist in the Dialogue\n\t*  - The given node GUID is invalid\n\t*  - The starter node does not have any valid child\n\t*\n\t* @param Dialogue\t\t\t\t- The dialogue asset to start\n\t* @param Participants\t\t\t- Array of participants, has to match with the expected input for the Dialogue\n\t* @param StartNodeGUID\t\t\t- GUID of the node the dialogue is resumed at\n\t* @param AlreadyVisitedNodes\t- Set of nodes already visited in the context the last time this Dialogue was going on.\n\t*\t\t\t\t\t\t\t\t  Can be acquired via GetVisitedNodeGUIDs() on the context\n\t* @param bFireEnterEvents\t\t- decides if the enter events should be fired on the resumed node or not\n\t* @returns The dialogue context object or nullptr if something wrong happened\n\t*/\n\tUFUNCTION(BlueprintCallable, Category = \"Dialogue|Launch\")\n    static UDlgContext* ResumeDialogueFromNodeGUID(\n        UDlgDialogue* Dialogue,\n        UPARAM(ref)const TArray<UObject*>& Participants,\n        const FGuid& StartNodeGUID,\n        const TSet<FGuid>& AlreadyVisitedNodes,\n        bool bFireEnterEvents\n    );\n\n\n\t//\n\t// Helper methods, same as StartDialogue but with fixed amount of participant(s)\n\t//\n\n\t// Helper methods that allows you to start a Dialogue with only a participant\n\t// For N Participants just use StartDialogue\n\tUFUNCTION(BlueprintCallable, Category = \"Dialogue|Launch\")\n\tstatic UDlgContext* StartMonologue(UDlgDialogue* Dialogue, UObject* Participant);\n\n\t// Helper methods that allows you to start a Dialogue with 2 participants\n\t// For N Participants just use StartDialogue\n\tUFUNCTION(BlueprintCallable, Category = \"Dialogue|Launch\")\n\tstatic UDlgContext* StartDialogue2(UDlgDialogue* Dialogue, UObject* Participant0, UObject* Participant1);\n\n\t// Helper methods that allows you to start a Dialogue with 3 participants\n\t// For N Participants just use StartDialogue\n\tUFUNCTION(BlueprintCallable, Category = \"Dialogue|Launch\")\n\tstatic UDlgContext* StartDialogue3(UDlgDialogue* Dialogue, UObject* Participant0, UObject* Participant1, UObject* Participant2);\n\n\t// Helper methods that allows you to start a Dialogue with 4 participants\n\t// For N Participants just use StartDialogue\n\tUFUNCTION(BlueprintCallable, Category = \"Dialogue|Launch\")\n\tstatic UDlgContext* StartDialogue4(UDlgDialogue* Dialogue, UObject* Participant0, UObject* Participant1, UObject* Participant2, UObject* Participant3);\n\n\t/**\n\t * Loads all dialogues from the filesystem into memory\n\t * @return number of loaded dialogues\n\t */\n\tstatic int32 LoadAllDialoguesIntoMemory(bool bAsync = false);\n\n\t// Gets all loaded dialogues from memory. LoadAllDialoguesIntoMemory must be called before this\n\tstatic TArray<UDlgDialogue*> GetAllDialoguesFromMemory();\n\n\t// Gets all the objects from the provided World that implement the Dialogue Participant Interface. Iterates through all objects, DO NOT CALL EACH FRAME\n\tstatic TArray<TWeakObjectPtr<AActor>> GetAllWeakActorsWithDialogueParticipantInterface(UWorld* World);\n\n\t// Gets all objects from the World that implement the Dialogue Participant Interface\n\tUFUNCTION(BlueprintPure, Category = \"Dialogue|Helper\", meta = (WorldContext = \"WorldContextObject\"))\n\tstatic TArray<UObject*> GetAllObjectsWithDialogueParticipantInterface(UObject* WorldContextObject);\n\n\t// Same as GetAllObjectsWithDialogueParticipantInterface but groups the Objects into a Map\n\t// Where the Key is the Participant Name\n\t// and the Value is the Participants Array\n\tUFUNCTION(BlueprintPure, Category = \"Dialogue|Helper\", meta = (WorldContext = \"WorldContextObject\"))\n\tstatic TMap<FName, FDlgObjectsArray> GetAllObjectsMapWithDialogueParticipantInterface(UObject* WorldContextObject);\n\n\t// Gets all the dialogues that have a duplicate GUID, should not happen, like ever.\n\tstatic TArray<UDlgDialogue*> GetDialoguesWithDuplicateGUIDs();\n\n\t// Helper methods that gets all the dialogues in a map by guid.\n\tstatic TMap<FGuid, UDlgDialogue*> GetAllDialoguesGUIDsMap();\n\n\t// Gets all the loaded dialogues from memory that have the ParticipantName included inside them.\n\tstatic TArray<UDlgDialogue*> GetAllDialoguesForParticipantName(FName ParticipantName);\n\n\t// Sets the FDlgMemory Dialogue history.\n\tUFUNCTION(BlueprintCallable, Category = \"Dialogue|Memory\")\n\tstatic void SetDialogueHistory(const TMap<FGuid, FDlgHistory>& DlgHistory);\n\n\t// Empties the FDlgMemory Dialogue history.\n\tUFUNCTION(BlueprintCallable, Category = \"Dialogue|Memory\")\n\tstatic void ClearDialogueHistory();\n\n\t// Gets the Dialogue History from the FDlgMemory.\n\tUFUNCTION(BlueprintPure, Category = \"Dialogue|Memory\")\n\tstatic const TMap<FGuid, FDlgHistory>& GetDialogueHistory();\n\n\t// Does the Object implement the Dialogue Participant Interface?\n\tUFUNCTION(BlueprintPure, Category = \"Dialogue|Helper\")\n\tstatic bool DoesObjectImplementDialogueParticipantInterface(const UObject* Object);\n\n\t// Is Object a UDlgEventCustom or a child from that\n\tUFUNCTION(BlueprintPure, Category = \"Dialogue|Helper\", DisplayName = \"Is Object A Custom Event\")\n\tstatic bool IsObjectACustomEvent(const UObject* Object);\n\n\t// Is Object a UDlgConditionCustom or a child from that\n\tUFUNCTION(BlueprintPure, Category = \"Dialogue|Helper\", DisplayName = \"Is Object A Custom Condition\")\n\tstatic bool IsObjectACustomCondition(const UObject* Object);\n\n\t// Is Object a UDlgTextArgumentCustom or a child from that\n\tUFUNCTION(BlueprintPure, Category = \"Dialogue|Helper\", DisplayName = \"Is Object A Custom Text Argument\")\n\tstatic bool IsObjectACustomTextArgument(const UObject* Object);\n\n\t// Is Object a UDlgNodeData or a child from that\n\tUFUNCTION(BlueprintPure, Category = \"Dialogue|Helper\", DisplayName = \"Is Object A Node Data\")\n    static bool IsObjectANodeData(const UObject* Object);\n\n\t// Gets all the unique participant names sorted alphabetically from all the Dialogues loaded into memory.\n\tUFUNCTION(BlueprintPure, Category = \"Dialogue|Data\")\n\tstatic void GetAllDialoguesParticipantNames(TArray<FName>& OutArray);\n\n\t// Gets all the used speaker states sorted alphabetically from all the Dialogues loaded into memory.\n\tUFUNCTION(BlueprintPure, Category = \"Dialogue|Data\")\n\tstatic void GetAllDialoguesSpeakerStates(TArray<FName>& OutArray);\n\n\t// Gets all the unique int variable names sorted alphabetically for the specified ParticipantName from the loaded Dialogues\n\tUFUNCTION(BlueprintPure, Category = \"Dialogue|Data\")\n\tstatic void GetAllDialoguesIntNames(FName ParticipantName, TArray<FName>& OutArray);\n\n\t// Gets all the unique float variable names sorted alphabetically for the specified ParticipantName from the loaded Dialogues\n\tUFUNCTION(BlueprintPure, Category = \"Dialogue|Data\")\n\tstatic void GetAllDialoguesFloatNames(FName ParticipantName, TArray<FName>& OutArray);\n\n\t// Gets all the unique bool variable names sorted alphabetically for the specified ParticipantName from the loaded Dialogues\n\tUFUNCTION(BlueprintPure, Category = \"Dialogue|Data\")\n\tstatic void GetAllDialoguesBoolNames(FName ParticipantName, TArray<FName>& OutArray);\n\n\t// Gets all the unique name variable names sorted alphabetically for the specified ParticipantName from the loaded Dialogues\n\tUFUNCTION(BlueprintPure, Category = \"Dialogue|Data\")\n\tstatic void GetAllDialoguesNameNames(FName ParticipantName, TArray<FName>& OutArray);\n\n\t// Gets all the unique condition names sorted alphabetically for the specified ParticipantName from the loaded Dialogues\n\tUFUNCTION(BlueprintPure, Category = \"Dialogue|Data\")\n\tstatic void GetAllDialoguesConditionNames(FName ParticipantName, TArray<FName>& OutArray);\n\n\t// Gets all the unique event names sorted alphabetically for the specified ParticipantName from the loaded Dialogues\n\tUFUNCTION(BlueprintPure, Category = \"Dialogue|Data\")\n\tstatic void GetAllDialoguesEventNames(FName ParticipantName, TArray<FName>& OutArray);\n\n\t// Registers all the DlgSystem Module console commands.\n\t// To set the custom reference WorldContextObjectPtr, set it with SetDialoguePersistentWorldContextObject\n\t// @return true on success, false otherwise\n\tUFUNCTION(BlueprintCallable, Category = \"Dialogue|Console\")\n\tstatic bool RegisterDialogueConsoleCommands();\n\n\t// Unregister all the DlgSystem Module console commands.\n\t// @return true on success, false otherwise\n\tUFUNCTION(BlueprintCallable, Category = \"Dialogue|Console\")\n\tstatic bool UnregisterDialogueConsoleCommands();\n\n\n\t// This tries to get the source world for the dialogues\n\t// In the following order (the first one that is valid, returns that):\n\t// 1. The user set one UserWorldContextObjectPtr (if it is set):\n\t//    - Set  with SetDialoguePersistentWorldContextObject\n\t//    - Clear with ClearDialoguePersistentWorldContextObject\n\t// 2. The first PIE world\n\t// 3. The first Game World\n\tUFUNCTION(BlueprintCallable, Category = \"Dialogue|Persistence\")\n\tstatic UWorld* GetDialogueWorld();\n\n\t// If the user wants to set the world context object manually\n\t// Otherwise just use GetDialogueWorld\n\tUFUNCTION(BlueprintCallable, Category = \"Dialogue|Persistence\")\n\tstatic void SetDialoguePersistentWorldContextObject(const UObject* WorldContextObject)\n\t{\n\t\tUserWorldContextObjectPtr = WorldContextObject;\n\t}\n\n\tUFUNCTION(BlueprintCallable, Category = \"Dialogue|Persistence\")\n\tstatic void ClearDialoguePersistentWorldContextObject()\n\t{\n\t\tUserWorldContextObjectPtr.Reset();\n\t}\n\nprivate:\n\tstatic void GatherParticipantsRecursive(UObject* Object, TArray<UObject*>& Array, TSet<UObject*>& AlreadyVisited);\n\n\t// Set by the user, we will default to automagically resolve the world\n\tstatic TWeakObjectPtr<const UObject> UserWorldContextObjectPtr;\n\n\tstatic bool bCalledLoadAllDialoguesIntoMemory;\n};\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystem/Public/DlgMemory.h",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#pragma once\n\n#include \"CoreMinimal.h\"\n\n#include \"DlgMemory.generated.h\"\n\nUSTRUCT(BlueprintType)\nstruct DLGSYSTEM_API FDlgHistory\n{\n\tGENERATED_USTRUCT_BODY()\npublic:\n\tFDlgHistory() {}\n\n\tvoid Add(int32 NodeIndex, const FGuid& NodeGUID)\n\t{\n\t\tif (NodeIndex >= 0)\n\t\t{\n\t\t\tVisitedNodeIndices.Add(NodeIndex);\n\t\t}\n\t\tif (NodeGUID.IsValid())\n\t\t{\n\t\t\tVisitedNodeGUIDs.Add(NodeGUID);\n\t\t}\n\t}\n\n\t// The following scenarios will be present:\n\t//\n\t// ---------------------------------------------------------------------------------------\n\t// A. Scenario\n\t// - User has save files with only VisitedNodeIndices present\n\t// - Developer does NOT resave the Dialogue files so that the Nodes don't have a valid GUID\n\t//\n\t// Result:\n\t//     The history will just use the Node Indices because the GUID will not be valid for any Node\n\t//\n\t// ---------------------------------------------------------------------------------------\n\t// B. Scenario\n\t// - User has save files with only the VisitedNodeIndices present\n\t// - Developer DOES resave the Dialogue files so that the Nodes have a valid GUID\n\t//\n\t// Result:\n\t//     The history will still use the Node Indices to figure out if a Node Is Visited,\n\t//     even tho the Dialogue Nodes have a valid GUIDs we won't use those because the user save files\n\t//     has VisitedNodeGUIDs.Num() < VisitedNodeIndices.Num() (the user most likely has empty VisitedNodeGUIDs),\n\t//     because the way the history is constructed now the following is a requirement\n\t//     VisitedNodeGUIDs.Num() >= VisitedNodeIndices.Num(), if this is not met we just fallback to the Node Indices\n\t//\n\t// ---------------------------------------------------------------------------------------\n\t// C. Scenario\n\t// - User has save files with the VisitedNodeIndices present and some VisitedNodeGUIDs but not all of them,\n\t//   because he only got the new update after he played some time through the game\n\t// - Developer DOES resave the Dialogue files so that the Nodes have a valid GUID and the game is in the users\n\t//   hands for some time for them to play.\n\t//\n\t// Result:\n\t//     Same as in Scenario B we will still use the Node Indices, because the requirement\n\t//     VisitedNodeGUIDs.Num() >= VisitedNodeIndices.Num() is NOT met\n\tbool CanUseGUIDForSearch() const\n\t{\n\t\treturn VisitedNodeGUIDs.Num() >= VisitedNodeIndices.Num();\n\t}\n\n\tbool Contains(int32 NodeIndex, const FGuid& NodeGUID) const\n\t{\n\t\t// Use GUID\n\t\tif (CanUseGUIDForSearch() && NodeGUID.IsValid())\n\t\t{\n\t\t\treturn VisitedNodeGUIDs.Contains(NodeGUID);\n\t\t}\n\n\t\t// FallBack to Node Index\n\t\treturn VisitedNodeIndices.Contains(NodeIndex);\n\t}\n\n\tbool operator==(const FDlgHistory& Other) const;\n\npublic:\n\t// Sed of already visited Node indices\n\t// NOTE: if you serialize this but then later change the dialogue node positions this will have the wrong indices\n\t// NOTE: You should use VisitedNodeGUIDs\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = \"Dialogue|History\")\n\tTSet<int32> VisitedNodeIndices;\n\n\t// Set of already visited node GUIDs\n\t// This was added to fix Issue 30 (https://gitlab.com/NotYetGames/DlgSystem/-/issues/30)\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = \"Dialogue|History\")\n\tTSet<FGuid> VisitedNodeGUIDs;\n};\n\n// Singleton to store Dialogue history\n// TODO: investigate if this is multiplayer friendly, it does not seem so as there exists only a single global dialogue memory\nUSTRUCT()\nstruct DLGSYSTEM_API FDlgMemory\n{\n\tGENERATED_USTRUCT_BODY()\npublic:\n\tFDlgMemory() {}\n\tstatic FDlgMemory* GetInstance()\n\t{\n\t\tstatic FDlgMemory Instance;\n\t\treturn &Instance;\n\t}\n\tstatic FDlgMemory& Get()\n\t{\n\t\tauto* Instance = GetInstance();\n\t\tcheck(Instance != nullptr);\n\t\treturn *Instance;\n\t}\n\n\t// Removes all entries\n\tvoid Empty() { HistoryMap.Empty(); }\n\n\t// Adds an entry to the map or overrides an existing one\n\tvoid SetEntry(const FGuid& DialogueGUID, const FDlgHistory& History)\n\t{\n\t\tFDlgHistory* OldEntry = HistoryMap.Find(DialogueGUID);\n\n\t\tif (OldEntry == nullptr)\n\t\t{\n\t\t\tHistoryMap.Add(DialogueGUID, History);\n\t\t}\n\t\telse\n\t\t{\n\t\t\t*OldEntry = History;\n\t\t}\n\t}\n\n\t// Returns the entry for the given name, or nullptr if it does not exist */\n\tFDlgHistory* GetEntry(const FGuid& DialogueGUID) { return HistoryMap.Find(DialogueGUID); }\n\n\tvoid SetNodeVisited(const FGuid& DialogueGUID, int32 NodeIndex, const FGuid& NodeGUID)\n\t{\n\t\t// Add it if it does not exist already\n\t\tFDlgHistory* History = HistoryMap.Find(DialogueGUID);\n\t\tif (History == nullptr)\n\t\t{\n\t\t\tHistory = &HistoryMap.Add(DialogueGUID);\n\t\t}\n\n\t\tHistory->Add(NodeIndex, NodeGUID);\n\t}\n\n\tbool IsNodeVisited(const FGuid& DialogueGUID, int32 NodeIndex, const FGuid& NodeGUID) const\n\t{\n\t\t// Dialogue entry does not even exist\n\t\tconst FDlgHistory* History = HistoryMap.Find(DialogueGUID);\n\t\tif (History == nullptr)\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\treturn History->Contains(NodeIndex, NodeGUID);\n\t}\n\n\tbool IsNodeIndexVisited(const FGuid& DialogueGUID, int32 NodeIndex) const\n\t{\n\t\t// Dialogue entry does not even exist\n\t\tconst FDlgHistory* History = HistoryMap.Find(DialogueGUID);\n\t\tif (History == nullptr)\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\treturn History->VisitedNodeIndices.Contains(NodeIndex);\n\t}\n\n\tbool IsNodeGUIDVisited(const FGuid& DialogueGUID, const FGuid& NodeGUID) const\n\t{\n\t\t// Dialogue entry does not even exist\n\t\tconst FDlgHistory* History = HistoryMap.Find(DialogueGUID);\n\t\tif (History == nullptr)\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\treturn History->VisitedNodeGUIDs.Contains(NodeGUID);\n\t}\n\n\tconst TMap<FGuid, FDlgHistory>& GetHistoryMaps() const { return HistoryMap; }\n\tvoid SetHistoryMap(const TMap<FGuid, FDlgHistory>& Map) { HistoryMap = Map; }\n\nprivate:\n\t // Key: Dialogue unique identifier GUID\n\t // Value: set of already visited nodes\n\tUPROPERTY()\n\tTMap<FGuid, FDlgHistory> HistoryMap;\n};\n\ntemplate<>\nstruct TStructOpsTypeTraits<FDlgHistory> : public TStructOpsTypeTraitsBase2<FDlgHistory>\n{\n\tenum\n\t{\n\t\tWithIdenticalViaEquality = true\n\t};\n};\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystem/Public/DlgNodeData.h",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#pragma once\n#include \"DlgObject.h\"\n\n#include \"DlgNodeData.generated.h\"\n\n// Abstract base class for node data\n// Defining class via inheriting from UDlgNodeData outside of the plugin is possible both in Blueprint and C++\n// Extend this class to define additional data you want to store on your nodes\nUCLASS(Blueprintable, BlueprintType, Abstract, EditInlineNew)\nclass DLGSYSTEM_API UDlgNodeData : public UDlgObject\n{\n\tGENERATED_BODY()\n};\n\n// This is the same as UDlgNodeData but it does NOT show any categories\nUCLASS(Blueprintable, BlueprintType, Abstract, EditInlineNew, CollapseCategories)\nclass DLGSYSTEM_API UDlgNodeDataHideCategories : public UDlgNodeData\n{\n\tGENERATED_BODY()\n};\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystem/Public/DlgObject.h",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#pragma once\n#include \"UObject/Object.h\"\n\n#include \"DlgObject.generated.h\"\n\n// Our Dialogue base object\nUCLASS(Abstract, ClassGroup = \"Dialogue\", HideCategories = (\"DoNotShow\"), AutoExpandCategories = (\"Default\"))\nclass DLGSYSTEM_API UDlgObject : public UObject\n{\n\tGENERATED_BODY()\npublic:\n\t// UObject interface\n\tvoid PostInitProperties() override;\n\tUWorld* GetWorld() const override;\n};\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystem/Public/DlgSystemModule.h",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#pragma once\n\n#include \"IDlgSystemModule.h\"\n\nclass UDlgDialogue;\nclass SWidget;\nstruct FAssetData;\nclass SDlgDataDisplay;\nclass SDockTab;\nstruct IConsoleCommand;\nclass AActor;\nstruct FTabSpawnerEntry;\n\nDECLARE_LOG_CATEGORY_EXTERN(LogDlgSystem, All, All);\n\n// Implementation of the DlgSystem Module\nclass DLGSYSTEM_API FDlgSystemModule : public IDlgSystemModule\n{\n\ttypedef FDlgSystemModule Self;\npublic:\n\t// IModuleInterface implementation\n\tvoid StartupModule() override;\n\tvoid ShutdownModule() override;\n\n\t// IDlgSystemModule implementation\n\tvoid RegisterConsoleCommands(const TWeakObjectPtr<const UObject>& InWorldContextObjectPtr) override;\n\tvoid UnregisterConsoleCommands() override;\n\tTSharedRef<SWidget> GetDialogueDataDisplayWindow() override;\n\tFTabSpawnerEntry* GetDialogueDataDisplaySpawnEntry() override;\n\tvoid DisplayDialogueDataWindow() override;\n\nprivate:\n\t// Refreshes the actor of the DlgDataDisplay if it is already opened. Return true if refresh was successful\n\tbool RefreshDisplayDialogueDataWindow(bool bFocus = true);\n\n\t// Handle the event from the asset registry when an asset was deleted.\n\tvoid HandleOnInMemoryAssetDeleted(UObject* DeletedObject);\n\n\t// Handle the event for when assets are removed from the asset registry.\n\tvoid HandleOnAssetRemoved(const FAssetData& RemovedAsset);\n\n\t// Handle the event for when assets are renamed in the registry\n\tvoid HandleOnAssetRenamed(const FAssetData& AssetRenamed, const FString& OldObjectPath);\n\n\t// Handle the event after the Dialogue was deleted. Deletes the text file(s).\n\tvoid HandleDialogueDeleted(UDlgDialogue* DeletedDialogue);\n\n\t// Handle the event after the Dialogue was renamed. Rename the text file(s).\n\tvoid HandleDialogueRenamed(UDlgDialogue* RenamedDialogue, const FString& OldObjectPath);\n\n\t// Handle event when a new map is loaded.\n\tvoid HandleOnPreLoadMap(const FString& MapName);\n\n\t// Handle event when a new map with world is loaded is loaded.\n\tvoid HandleOnPostLoadMapWithWorld(UWorld* LoadedWorld);\n\nprivate:\n\t// True if the tab spawners have been registered for this module\n\tbool bHasRegisteredTabSpawners = false;\n\n\t// Holds the widget reflector singleton.\n\tTWeakPtr<SDlgDataDisplay> DialogueDataDisplayWidget;\n\tFTabSpawnerEntry* DialogueDataDisplayTabSpawnEntry = nullptr;\n\n\t// Holds the console commands for this Module\n\tTArray<IConsoleCommand*> ConsoleCommands;\n\n\t// Reference Object used to get the World\n\tTWeakObjectPtr<const UObject> WorldContextObjectPtr = nullptr;\n\n\t// NOTE: only in NON editor game\n\tTWeakObjectPtr<UWorld> LastLoadedWorld = nullptr;\n\n\t// Handlers\n\tFDelegateHandle OnPreLoadMapHandle;\n\tFDelegateHandle OnPostLoadMapWithWorldHandle;\n\tFDelegateHandle OnInMemoryAssetDeletedHandle;\n\tFDelegateHandle OnAssetRemovedHandle;\n\tFDelegateHandle OnAssetRenamedHandle;\n};\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystem/Public/DlgSystemSettings.h",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#pragma once\n#include \"CoreMinimal.h\"\n#include \"Misc/Build.h\"\n\n#include \"Engine/DeveloperSettings.h\"\n#include \"Layout/Margin.h\"\n#include \"Logging/INYLogger.h\"\n\n#if WITH_EDITOR\n#include \"ClassViewerModule.h\"\n#endif\n\n#include \"DlgSystemSettings.generated.h\"\n\n// Defines the format of the Dialogue text\nUENUM()\nenum class EDlgDialogueTextFormat : uint8\n{\n\t// No Text Format used.\n\tNone\tUMETA(DisplayName = \"No Text Format\"),\n\n\t// Output all text formats, mostly used for debugging\n\tAll     UMETA(Hidden),\n\n\t// DEPRECATED. The own Dialogue Text format. DEPRECATED.\n\t// NOTE: this format is deprecated AND in the next version it will be removed\n\tDialogueDEPRECATED\tUMETA(Hidden),\n\n\t// Hidden represents the start of the text formats index\n\tStartTextFormats = DialogueDEPRECATED \tUMETA(Hidden),\n\n\t// The JSON format.\n\tJSON\t\t\t\tUMETA(DisplayName = \"JSON\"),\n\n\t// Hidden, represents the number of text formats */\n\tNumTextFormats \t\tUMETA(Hidden),\n};\n\n// Defines the displayed properties of the voice fields.\nUENUM()\nenum class EDlgVoiceDisplayedFields : uint8\n{\n\t// No Voice fields are displayed.\n\tNone\t\t\t\t\t\tUMETA(DisplayName = \"No Voice\"),\n\n\t// Only display the SoundWave voice fields.\n\tSoundWave\t\t\t\t\tUMETA(DisplayName = \"Sound Wave\"),\n\n\t// Only display the DialogueWave voice fields.\n\tDialogueWave\t\t\t\tUMETA(DisplayName = \"Dialogue Wave\"),\n\n\t// Display both SoundWave and DialogueWave fields.\n\tSoundWaveAndDialogueWave\tUMETA(DisplayName = \"Sound Wave & Dialogue Wave\")\n};\n\n// Defines the visibility of the SpeakerState values\nUENUM()\nenum class EDlgSpeakerStateVisibility : uint8\n{\n\t// No visibility fields are displayed.\n\tHideAll\t\t\t\t\tUMETA(DisplayName = \"Hide All\"),\n\n\t// Only display the SoundWave voice fields.\n\tShowOnEdge\t\t\t\tUMETA(DisplayName = \"Show On Edge\"),\n\n\t// Only display the DialogueWave voice fields.\n\tShowOnNode\t\t\t\tUMETA(DisplayName = \"Show On Node\"),\n\n\t// Display both SoundWave and DialogueWave fields.\n\tShowOnNodeAndEdge\t\tUMETA(DisplayName = \"Show On Both (Edge + Node)\")\n};\n\n// Defines what key combination to press to add a new line to an FText\nUENUM()\nenum class EDlgTextInputKeyForNewLine : uint8\n{\n\t// Press 'Enter' to add a new line.\n\tEnter\t\t\t\tUMETA(DisplayName = \"Enter\"),\n\n\t// Preset 'Shift + Enter' to add a new line. (like in blueprints)\n\tShiftPlusEnter\t\tUMETA(DisplayName = \"Shift + Enter\"),\n};\n\n// Defines how the overriden namespace will be set\nUENUM()\nenum class EDlgTextNamespaceLocalization : uint8\n{\n\t// The system does not modify the Namespace and Key values of the Text fields.\n\tIgnore\t\t\tUMETA(DisplayName = \"Ignore\"),\n\n\t// The system sets the Namespace for Text fields for each dialogue separately. Unique keys are also generated.\n\tPerDialogue\t\tUMETA(DisplayName = \"Namespace Per Dialogue (DialogueName)\"),\n\n\t// Same as PerDialogue only we will have a prefix set\n\tWithPrefixPerDialogue UMETA(DisplayName = \"Prefix + Namespace Per Dialogue (Prefix.DialogueName)\"),\n\n\t// The system sets the Namespace for Text fields for each dialogue into the same value. Unique keys are also generated.\n\tGlobal\t\t\t\tUMETA(DisplayName = \"Global Namespace\")\n};\n\n\nUENUM()\nenum class EDlgClassPickerDisplayMode : uint8\n{\n\t// Default will choose what view mode based on if in Viewer or Picker mode.\n\tDefaultView,\n\n\t// Displays all classes as a tree.\n    TreeView,\n\n    // Displays all classes as a list.\n    ListView\n};\n\n// UDeveloperSettings classes are auto discovered https://wiki.unrealengine.com/CustomSettings\nUCLASS(Config = Engine, DefaultConfig, meta = (DisplayName = \"Dialogue System Settings\"))\nclass DLGSYSTEM_API UDlgSystemSettings : public UDeveloperSettings\n{\n\tGENERATED_BODY()\n\npublic:\n\tUDlgSystemSettings();\n\n\t// UDeveloperSettings interface\n\t// Gets the settings container name for the settings, either Project or Editor\n\tFName GetContainerName() const override { return TEXT(\"Project\"); }\n\t// Gets the category for the settings, some high level grouping like, Editor, Engine, Game...etc.\n\tFName GetCategoryName() const override { return TEXT(\"Editor\"); };\n\t// The unique name for your section of settings, uses the class's FName.\n\tFName GetSectionName() const override { return Super::GetSectionName(); };\n\n#if WITH_EDITOR\n\t// Gets the section text, uses the classes DisplayName by default.\n\tFText GetSectionText() const override;\n\t// Gets the description for the section, uses the classes ToolTip by default.\n\tFText GetSectionDescription() const override;\n\n\t// Whether or not this class supports auto registration or if the settings have a custom setup\n\tbool SupportsAutoRegistration() const override { return true; }\n\n\t// UObject interface\n#if ENGINE_MINOR_VERSION >= 25\n\tbool CanEditChange(const FProperty* InProperty) const override;\n#else\n\tbool CanEditChange(const UProperty* InProperty) const override;\n#endif\n\n\tvoid PostEditChangeProperty(FPropertyChangedEvent& PropertyChangedEvent) override;\n#endif // WITH_EDITOR\n\n\t// Own functions\n#define CREATE_SETTER(_NameMethod, _VariableType, _VariableName)  \\\n\tvoid _NameMethod(_VariableType InVariableValue)               \\\n\t{                                                             \\\n\t\tif (_VariableName != InVariableValue)                     \\\n\t\t{                                                         \\\n\t\t\t_VariableName = InVariableValue;                      \\\n\t\t\tSaveSettings();                                       \\\n\t\t}                                                         \\\n\t}\n\n\tCREATE_SETTER(SetShowPrimarySecondaryEdges, bool, bShowPrimarySecondaryEdges)\n\tCREATE_SETTER(SetDrawPrimaryEdges, bool, bDrawPrimaryEdges)\n\tCREATE_SETTER(SetDrawSecondaryEdges, bool, bDrawSecondaryEdges)\n\tCREATE_SETTER(SetHideEmptyDialogueBrowserCategories, bool, bHideEmptyDialogueBrowserCategories)\n\n#undef CREATE_SETTER\n\n\t// Depends on:\n\t// - LocalizationIgnoredTexts\n\t// - LocalizationIgnoredStrings\n\tbool IsIgnoredTextForLocalization(const FText& Text) const;\n\n\t// Is this text remapped\n\tFORCEINLINE bool IsTextRemapped(const FText& Text) const { return IsSourceStringRemapped(*FTextInspector::GetSourceString(Text));  }\n\tFORCEINLINE bool IsSourceStringRemapped(const FString& SourceString) const { return LocalizationRemapSourceStringsToTexts.Contains(SourceString); }\n\tFORCEINLINE const FText& GetTextRemappedText(const FText& Text) const { return GetSourceStringRemappedText(*FTextInspector::GetSourceString(Text)); }\n\tFORCEINLINE const FText& GetSourceStringRemappedText(const FString& SourceString) const { return LocalizationRemapSourceStringsToTexts.FindChecked(SourceString); }\n\n\t// Saves the settings to the config file depending on the settings of this class.\n\tvoid SaveSettings()\n\t{\n\t\tconst UClass* ThisClass = GetClass();\n\t\tif (ThisClass->HasAnyClassFlags(CLASS_DefaultConfig))\n\t\t{\n\t\t\tUpdateDefaultConfigFile();\n\t\t}\n\t\telse if (ThisClass->HasAnyClassFlags(CLASS_GlobalUserConfig))\n\t\t{\n\t\t\tUpdateGlobalUserConfigFile();\n\t\t}\n\t\telse\n\t\t{\n\t\t\tSaveConfig();\n\t\t}\n\t}\n\n\t// @return the extension of the text file depending on the InTextFormat.\n\tstatic FString GetTextFileExtension(EDlgDialogueTextFormat TextFormat);\n\tstatic bool HasTextFileExtension(EDlgDialogueTextFormat TextFormat) { return !GetTextFileExtension(TextFormat).IsEmpty(); }\n\n\t// Only the current ones from the enum\n\tstatic const TSet<FString>& GetAllCurrentTextFileExtensions();\n\n\t// GetAllCurrentTextFileExtensions() + AdditionalTextFormatFileExtensionsToLookFor\n\tTSet<FString> GetAllTextFileExtensions() const;\n\n#if WITH_EDITOR\n\tEClassViewerDisplayMode::Type GetUnrealClassPickerDisplayMode() const\n\t{\n\t\tif (ClassPickerDisplayMode == EDlgClassPickerDisplayMode::ListView)\n\t\t{\n\t\t\treturn EClassViewerDisplayMode::ListView;\n\t\t}\n\t\tif (ClassPickerDisplayMode == EDlgClassPickerDisplayMode::TreeView)\n\t\t{\n\t\t\treturn EClassViewerDisplayMode::TreeView;\n\t\t}\n\n\t\treturn EClassViewerDisplayMode::DefaultView;\n\t}\n#endif // WITH_EDITOR\n\npublic:\n\t// If enabled this clears the dialogue history automatically on Editor Start PIE and On Load New Map */\n\t// Calls ClearDialogueHistory\n\tUPROPERTY(Category = \"Runtime\", Config, EditAnywhere)\n\tbool bClearDialogueHistoryAutomatically = true;\n\n\t// If enabled this auto registers and unregisters the dialogue console commands on Begin Play\n\t// Calls RegisterDialogueConsoleCommands and UnregisterDialogueConsoleCommands\n\tUPROPERTY(Category = \"Runtime\", Config, EditAnywhere)\n\tbool bRegisterDialogueConsoleCommandsAutomatically = true;\n\n\n\t// The dialogue text format used for saving and reloading from text files.\n\tUPROPERTY(Category = \"Dialogue\", Config, EditAnywhere, DisplayName = \"Text Format\")\n\tEDlgDialogueTextFormat DialogueTextFormat = EDlgDialogueTextFormat::None;\n\n\t// What key combination to press to add a new line for FText fields in the Dialogue Editor.\n\tUPROPERTY(Category = \"Dialogue\", Config, EditAnywhere, DisplayName = \"Text Input Key for NewLine\")\n\tEDlgTextInputKeyForNewLine DialogueTextInputKeyForNewLine = EDlgTextInputKeyForNewLine::Enter;\n\n\t// If true, ParticipantsClasses from each Dialogue will be set to the first Class that matches the ParticipantName\n\t// NOTE: This only sets the default for participant names that have only ONE participant class\n\t// NOTE: This does not work for the None Participant Name\n\tUPROPERTY(Category = \"Dialogue\", Config, EditAnywhere)\n\tbool bAutoSetDefaultParticipantClasses = true;\n\n\t// Shows the NodeData that you can customize yourself\n\tUPROPERTY(Category = \"Dialogue Node Data\", Config, EditAnywhere)\n\tbool bShowNodeData = true;\n\n\t// Where to display the SpeakerState FName property\n\tUPROPERTY(Category = \"Dialogue Node Data\", Config, EditAnywhere, DisplayName = \"SpeakerState Visibility\")\n\tEDlgSpeakerStateVisibility DialogueSpeakerStateVisibility = EDlgSpeakerStateVisibility::ShowOnNodeAndEdge;\n\n\t// What Voice fields to show in the Dialogue Editor, if any.\n\tUPROPERTY(Category = \"Dialogue Node Data\", Config, EditAnywhere, DisplayName = \"Displayed Voice Fields\")\n\tEDlgVoiceDisplayedFields DialogueDisplayedVoiceFields = EDlgVoiceDisplayedFields::None;\n\n\t// Generic data is an UObject* which can be assigned to nodes and can be asked from the active one\n\tUPROPERTY(Category = \"Dialogue Node Data\", Config, EditAnywhere)\n\tbool bShowGenericData = false;\n\n\tUPROPERTY(Category = \"Dialogue Node Data\", Config, EditAnywhere, AdvancedDisplay)\n\tbool bShowAdvancedChildren = true;\n\n\t// Any properties that belong to these classes won't be shown in the suggestion list when you use the reflection system (class variables).\n\tUPROPERTY(Category = \"Dialogue\", Config, EditAnywhere)\n\tTArray<UClass*> BlacklistedReflectionClasses;\n\n\t// How the Blueprint class pricker looks like\n\tUPROPERTY(Category = \"Blueprint\", Config, EditAnywhere)\n\tEDlgClassPickerDisplayMode ClassPickerDisplayMode = EDlgClassPickerDisplayMode::DefaultView;\n\n\t// Should we only process batch dialogues that are only in the /Game folder.\n\t// This is used for saving all dialogues or deleting all text files.\n\tUPROPERTY(Category = \"Batch\", Config, EditAnywhere)\n\tbool bBatchOnlyInGameDialogues = true;\n\n\t// Additional file extension to look for when doing operations with dialogue text formats, like: deleting/renaming.\n\t// NOTE: file extensions must start with a full stop\n\tUPROPERTY(Category = \"Batch\", Config, EditAnywhere)\n\tTSet<FString> AdditionalTextFormatFileExtensionsToLookFor;\n\n\n\t// Should the dialogue system set the default texts on empty edges on save dialogue and when creating them?\n\tUPROPERTY(Category = \"Default Texts\", Config, EditAnywhere, DisplayName = \"Set Default Edge Texts\")\n\tbool bSetDefaultEdgeTexts = true;\n\n\t// If true the default text will be only applied to the first child instead of all children from a node\n\tUPROPERTY(Category = \"Default Texts\", Config, EditAnywhere, DisplayName = \"Set Default Edge Texts on First Child Only\")\n\tbool bSetDefaultEdgeTextOnFirstChildOnly = true;\n\n\t// Default text that appears on empty edges that lead to an end node\n\tUPROPERTY(Category = \"Default Texts\", Config, EditAnywhere, DisplayName = \"Edge Text To End Node\")\n\tFText DefaultTextEdgeToEndNode;\n\n\t// Default text that appears on empty edges texts that lead to a normal node (not an end node).\n\tUPROPERTY(Category = \"Default Texts\", Config, EditAnywhere, DisplayName = \"Edge Text To Normal Node\")\n\tFText DefaultTextEdgeToNormalNode;\n\n\n\t// Defines what the system should do with Text Namespaces for localization\n\tUPROPERTY(Category = \"Localization\", Config, EditAnywhere, DisplayName = \"Text Namespace\")\n\tEDlgTextNamespaceLocalization DialogueTextNamespaceLocalization = EDlgTextNamespaceLocalization::Ignore;\n\n\t// Depending on TextLocalizationMode it can be used as the namespace for all dialogue\n\t// Only used for GlobalNamespace\n\tUPROPERTY(Category = \"Localization\", Config, EditAnywhere, DisplayName = \"Text Global Namespace Name\")\n\tFString DialogueTextGlobalNamespaceName = \"Dialogue\";\n\n\t// Depending on TextLocalizationMode it can be used as the prefix for all dialogues namespace name\n\t// Only used for WithPrefixPerDialogue\n\tUPROPERTY(Category = \"Localization\", Config, EditAnywhere, DisplayName = \"Text Namespace Name Prefix\")\n\tFString DialogueTextPrefixNamespaceName = \"Dialogue_\";\n\n\t// Additional Array of texts that this system won't overwrite the namespace or key for\n\t//UPROPERTY(Category = \"Localization\", Config, EditAnywhere, DisplayName = \"Ignored Texts\")\n\t//TArray<FText> LocalizationIgnoredTexts;\n\n\t// Additional Array of source strings that this system won't overwrite the namespace or key for\n\tUPROPERTY(Category = \"Localization\", Config, EditAnywhere, AdvancedDisplay, DisplayName = \"Ignored Strings\")\n\tTSet<FString> LocalizationIgnoredStrings;\n\n\t// Map used to remap some SourceStrings texts found in the dialogues with a new Text value/namespace/key\n\t// Key: SourceString we are searching for\n\t// Value: Text replacement. NOTE: if the text value is usually not empty\n\tUPROPERTY(Category = \"Localization\", Config, EditAnywhere, AdvancedDisplay, DisplayName = \"Remap Source Strings to Texts\")\n\tTMap<FString, FText> LocalizationRemapSourceStringsToTexts;\n\n\n\t// Enables the message log to output info/errors/warnings to it\n\tUPROPERTY(Category = \"Logger\", Config, EditAnywhere)\n\tbool bEnableMessageLog = true;\n\n\t// Should the message log mirror the message with the output log, used even if the output log is disabled.\n\tUPROPERTY(Category = \"Logger\", Config, EditAnywhere)\n\tbool bMessageLogMirrorToOutputLog = true;\n\n\t// Opens the message log in front of the user if messages are displayed\n\t// See OpenMessageLogLevelsHigherThan for the filter\n\tUPROPERTY(Category = \"Logger\", Config, EditAnywhere)\n\tbool bMessageLogOpen = true;\n\n\t// NOTE: Not editable is intended so that not to allow the user to disable logging completely\n\tUPROPERTY(Config)\n\tbool bEnableOutputLog = false;\n\n\t// By default the message log does not support debug output, latest is info.\n\t// For the sake of sanity we redirect all levels higher than RedirectMessageLogLevelsHigherThan to the output log\n\t// even if the output log is disabled.\n\t// So that not to output for example debug output to the message log only to the output log.\n\t// NOTE: A value of ENYLoggerLogLevel::NoLogging means no log level will get redirected\n\tUPROPERTY(Category = \"Logger\", Config, EditAnywhere, AdvancedDisplay)\n\tENYLoggerLogLevel RedirectMessageLogLevelsHigherThan = ENYLoggerLogLevel::Warning;\n\n\t// All the log levels messages that will open the message log window if bMessageLogOpen is true\n\t// NOTE: A value of  ENYLoggerLogLevel::NoLogging means all log levels will be opened if bMessageLogOpen is true\n\tUPROPERTY(Category = \"Logger\", Config, EditAnywhere, AdvancedDisplay)\n\tENYLoggerLogLevel OpenMessageLogLevelsHigherThan = ENYLoggerLogLevel::NoLogging;\n\n\n\t// Should we hide the categories in the Dialogue browser that do not have any children?\n\tUPROPERTY(Category = \"Browser\", Config, EditAnywhere)\n\tbool bHideEmptyDialogueBrowserCategories = true;\n\n\n\t//\n\t// External URLs\n\t//\n\n\t// Should the external URLs toolbar be displayed\n\tUPROPERTY(Category = \"External URLs\", Config, EditAnywhere)\n\tbool bShowExternalURLsToolbar = true;\n\n\tFString URLNotYetPlugins = \"https://bit.ly/NotYetPluginsEditor\";\n\tFString URLMarketplace = \"https://bit.ly/DlgMarketplaceEditor\";\n\tFString URLWiki = \"https://bit.ly/DlgWikiEditor\";\n\tFString URLForum = \"https://bit.ly/DlgForumEditor\";\n\tFString URLDiscord = \"https://bit.ly/NYDiscordEditor\";\n\n\t//\n\t// Graph NOde\n\t//\n\n\t// Whether the description text wraps onto a new line when it's length exceeds this width;\n\t// Tf this value is zero or negative, no wrapping occurs.\n\tUPROPERTY(Category = \"Graph Node\", Config, EditAnywhere)\n\tfloat DescriptionWrapTextAt = 256.f;\n\n\t// The amount of blank space left around the edges of the description text area.\n\tUPROPERTY(Category = \"Graph Node\", Config, EditAnywhere)\n\tFMargin DescriptionTextMargin = FMargin(5.f);\n\n\t// The horizontal alignment of the graph node title and icon\n\tUPROPERTY(Category = \"Graph Node\", Config, EditAnywhere)\n\tTEnumAsByte<EHorizontalAlignment> TitleHorizontalAlignment = HAlign_Fill;\n\n\t// To show or not the condition icon in the case the node has any enter conditions defined on it.\n\tUPROPERTY(Category = \"Graph Node\", Config, EditAnywhere)\n\tbool bShowHasEnterConditionsIcon = true;\n\n\t// To show or not the event icon in the case the node has any enter events defined on it.\n\tUPROPERTY(Category = \"Graph Node\", Config, EditAnywhere)\n\tbool bShowHasEnterEventsIcon = true;\n\n\t// To show or not the voice icon in the case the node has any voice members set\n\tUPROPERTY(Category = \"Graph Node\", Config, EditAnywhere)\n\tbool bShowHasVoiceIcon = true;\n\n\t// To show or not the voice icon in the case the node has any voice members set\n\tUPROPERTY(Category = \"Graph Node\", Config, EditAnywhere)\n\tbool bShowHasGenericDataIcon = true;\n\n\t//\n\t// Colors based on https://material.io/guidelines/style/color.html#color-color-palette\n\t//\n\n\t// The background color of the normal speech node. */\n\tUPROPERTY(Category = \"Graph Node Color\", Config, EditAnywhere)\n\tFLinearColor SpeechNodeColor = FLinearColor{0.050980f, 0.278431f, 0.631373f, 1.f}; // blueish\n\n\t// The background color of the root node.\n\tUPROPERTY(Category = \"Graph Node Color\", Config, EditAnywhere)\n\tFLinearColor RootNodeColor = FLinearColor{0.105882f, 0.368627f, 0.125490f, 1.f}; // greenish\n\n\t// The background color of the end node.\n\tUPROPERTY(Category = \"Graph Node Color\", Config, EditAnywhere)\n\tFLinearColor EndNodeColor = FLinearColor{0.835294f, 0.f, 0.f, 1.f}; // redish\n\n\t// The background color of the virtual parent node.\n\tUPROPERTY(Category = \"Graph Node Color\", Config, EditAnywhere)\n\tFLinearColor VirtualParentNodeColor = FLinearColor{0.129412f, 0.129412f, 0.129412f, 1.0f}; // dark gray\n\n\t// The background color of the selector first node.\n\tUPROPERTY(Category = \"Graph Node Color\", Config, EditAnywhere)\n\tFLinearColor SelectorFirstNodeColor = FLinearColor{0.f, 0.721569f, 0.831373f, 1.f};  // cyan\n\n\t// The background color of the selector random node.\n\tUPROPERTY(Category = \"Graph Node Color\", Config, EditAnywhere)\n\tFLinearColor SelectorRandomNodeColor = FLinearColor{1.f, 0.839216f, 0.f, 1.f}; // yellow\n\n\t// The background color of the selector random node.\n\tUPROPERTY(Category = \"Graph Node Color\", Config, EditAnywhere)\n\tFLinearColor SpeechSequenceNodeColor = FLinearColor{0.050980f, 0.278431f, 0.631373f, 1.f}; // blueish\n\n\t// The background color of the node borders.\n\tUPROPERTY(Category = \"Graph Node Color\", Config, EditAnywhere)\n\tFLinearColor BorderBackgroundColor = FLinearColor::Black;\n\n\t// The background color of the node borders when hovered over\n\tUPROPERTY(Category = \"Graph Node Color\", Config, EditAnywhere)\n\tFLinearColor BorderHoveredBackgroundColor = FLinearColor(0.380392f, 0.380392f, 0.380392f, 1.0f); // gray\n\n\t// The amount of blank space left around the edges of the speaker text area in case of speech sequence nodes.\n\tUPROPERTY(Category = \"Graph Node Speech Sequence\", Config, EditAnywhere)\n\tFMargin DescriptionSpeakerMargin = FMargin(1.f);\n\n\t// The horizontal alignment of the Speaker in case the node is a speech sequence.\n\tUPROPERTY(Category = \"Graph Node Speech Sequence\", Config, EditAnywhere)\n\tTEnumAsByte<EHorizontalAlignment> DescriptionSpeakerHorizontalAlignment = HAlign_Center;\n\n\n\t// The wire thickness of the connections between nodes.\n\tUPROPERTY(Category = \"Graph Edge\", Config, EditAnywhere)\n\tfloat WireThickness = 2.0f;\n\n\t// Flag indicating to draw the bubbles of the wire or not.\n\tUPROPERTY(Category = \"Graph Edge\", Config, EditAnywhere)\n\tbool bWireDrawBubbles = false;\n\n\t// To show or not the condition icon in the case the edge has any conditions defined on it.\n\tUPROPERTY(Category = \"Graph Edge\", Config, EditAnywhere)\n\tbool bShowEdgeHasConditionsIcon = true;\n\n\t// The base color of the wire.\n\tUPROPERTY(Category = \"Graph Edge Color\", Config, EditAnywhere)\n\tFLinearColor WireBaseColor = FLinearColor{1.0f, 1.0f, 1.0f, 1.0f}; // white\n\n\t// Does the wire use the condition color (if it has conditions) in the normal mode?\n\tUPROPERTY(Category = \"Graph Edge Color\", Config, EditAnywhere)\n\tbool bShowDifferentColorForConditionWires = true;\n\n\t// The color of the wire if the edge has any conditions.\n\tUPROPERTY(Category = \"Graph Edge Color\", Config, EditAnywhere)\n\tFLinearColor WireWithConditionsColor = FLinearColor{1.f, 0.341176f, 0.133333f, 1.0f}; // orangeish\n\n\t// The color of the wire when hovered over\n\tUPROPERTY(Category = \"Graph Edge Color\", Config, EditAnywhere)\n\tFLinearColor WireHoveredColor = FLinearColor{1.0f, 0.596078f, 0.0f, 1.0f}; // orange\n\n\t// Is the the viewing of primary/secondary edges enabled?\n\tUPROPERTY(Category = \"Graph Edge\", Config, EditAnywhere)\n\tbool bShowPrimarySecondaryEdges = true;\n\n\t// Should we draw the primary edges?\n\tUPROPERTY(Category = \"Graph Edge\", Config, EditAnywhere)\n\tbool bDrawPrimaryEdges = true;\n\n\t// Should we draw the secondary edges?\n\tUPROPERTY(Category = \"Graph Edge\", Config, EditAnywhere)\n\tbool bDrawSecondaryEdges = true;\n\n\t// The Color of the wire when the edge is primary.\n\tUPROPERTY(Category = \"Graph Edge Color\", Config, EditAnywhere)\n\tFLinearColor WirePrimaryEdgeColor = FLinearColor{0.717647f, 0.109804f, 0.109804f, 1.0f}; // redish\n\n\t// The Color of the wire when the edge is secondary.\n\tUPROPERTY(Category = \"Graph Edge Color\", Config, EditAnywhere)\n\tFLinearColor WireSecondaryEdgeColor = FLinearColor{0.101961f, 0.137255f, 0.494118f, 1.f}; // blueish\n\n\t//\n\t// Advanced Section\n\t//\n\n\t// The offset on the X axis (left/right) to use when automatically positioning nodes.\n\tUPROPERTY(Category = \"Position\", Config, EditAnywhere, AdvancedDisplay)\n\tint32 OffsetBetweenColumnsX = 500;\n\n\t// The offset on the Y axis (up/down) to use when automatically positioning nodes.\n\tUPROPERTY(Category = \"Position\", Config, EditAnywhere, AdvancedDisplay)\n\tint32 OffsetBetweenRowsY = 200;\n};\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystem/Public/DlgTextArgument.h",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#pragma once\n\n#include \"CoreMinimal.h\"\n#include \"DlgTextArgumentCustom.h\"\n\n#include \"DlgTextArgument.generated.h\"\n\nclass IDlgDialogueParticipant;\nclass UDlgContext;\n\n\n// Argument type, which defines both the type of the argument and the way the system will acquire the value\n// NOTE: the values are out of order here for backwards compatibility\nUENUM(BlueprintType)\nenum class EDlgTextArgumentType : uint8\n{\n\t// Calls GetParticipantDisplayName on the Participant\n\tDisplayName = 0\tUMETA(DisplayName = \"Participant Display Name\"),\n\n\t// Calls GetParticipantGender on the Participant\n\tGender\t\t\tUMETA(DisplayName = \"Participant Gender\"),\n\n\t// Calls GetIntValue on the Participant\n\tDialogueInt \tUMETA(DisplayName = \"Dialogue Int Value\"),\n\n\t// Calls GetFloatValue on the Participant\n\tDialogueFloat\tUMETA(DisplayName = \"Dialogue Float Value\"),\n\n\t// Gets the value from the Participant Int Variable\n\tClassInt \t\tUMETA(DisplayName = \"Class Int Variable\"),\n\n\t// Gets the value from the Participant Float Variable\n\tClassFloat\t\tUMETA(DisplayName = \"Class Float Variable\"),\n\n\t// Gets the value from the Participant Text Variable\n\tClassText\t\tUMETA(DisplayName = \"Class Text Variable\"),\n\n\n\t// User Defined Text Argument, calls GetText on the custom text argument object.\n\t//\n\t// 1. Create a new Blueprint derived from DlgTextArgumentCustom (or DlgTextArgumentCustomHideCategories)\n\t// 2. Override GetText\n\tCustom\t\t\t\t\t\tUMETA(DisplayName = \"Custom Text Argument\")\n};\n\n/**\n * An argument is a variable to extend node texts with dynamic values runtime\n * It can be inserted to the FText, the same way FText::Format works\n * See: https://docs.unrealengine.com/en-us/Gameplay/Localization/Formatting\n */\nUSTRUCT(BlueprintType)\nstruct DLGSYSTEM_API FDlgTextArgument\n{\n\tGENERATED_USTRUCT_BODY()\n\npublic:\n\t//\n\t// ICppStructOps Interface\n\t//\n\n\tbool operator==(const FDlgTextArgument& Other) const\n\t{\n\t\treturn\tDisplayString == Other.DisplayString &&\n\t\t\tType == Other.Type &&\n\t\t\tParticipantName == Other.ParticipantName &&\n\t\t\tVariableName == Other.VariableName &&\n\t\t\tCustomTextArgument == Other.CustomTextArgument;\n\t}\n\n\t//\n\t// Own methods\n\t//\n\n\t// Construct the argument for usage in FText::Format\n\tFFormatArgumentValue ConstructFormatArgumentValue(const UDlgContext& Context, FName NodeOwner) const;\n\n\t// Helper method to update the array InOutArgumentArray with the new arguments from Text.\n\tstatic void UpdateTextArgumentArray(const FText& Text, TArray<FDlgTextArgument>& InOutArgumentArray);\n\n\tstatic FString ArgumentTypeToString(EDlgTextArgumentType Type);\n\npublic:\n\tUPROPERTY(VisibleAnywhere, BlueprintReadWrite, Category = \"Dialogue|TextArgument\")\n\tFString DisplayString;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = \"Dialogue|TextArgument\")\n\tEDlgTextArgumentType Type = EDlgTextArgumentType::DisplayName;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = \"Dialogue|TextArgument\")\n\tFName ParticipantName;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = \"Dialogue|TextArgument\")\n\tFName VariableName;\n\n\t// User Defined Text Argument, calls GetText on the custom text argument object.\n\t//\n\t// 1. Create a new Blueprint derived from DlgTextArgumentCustom (or DlgTextArgumentCustomHideCategories)\n\t// 2. Override GetText\n\tUPROPERTY(Instanced, EditAnywhere, BlueprintReadWrite, Category = \"Dialogue|TextArgument\")\n\tUDlgTextArgumentCustom* CustomTextArgument = nullptr;\n};\n\ntemplate<>\nstruct TStructOpsTypeTraits<FDlgTextArgument> : public TStructOpsTypeTraitsBase2<FDlgTextArgument>\n{\n\tenum\n\t{\n\t\tWithIdenticalViaEquality = true\n    };\n};\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystem/Public/DlgTextArgumentCustom.h",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#pragma once\n#include \"DlgObject.h\"\n\n#include \"DlgTextArgumentCustom.generated.h\"\n\nclass UDlgContext;\n\n\n// Abstract base class for a custom text argument\n// Extend this class to define additional data you want to store\n//\n// 1. Override GetText\n// 2. Return the new Text for the specified text argument\nUCLASS(Blueprintable, BlueprintType, Abstract, EditInlineNew)\nclass DLGSYSTEM_API UDlgTextArgumentCustom : public UDlgObject\n{\n\tGENERATED_BODY()\npublic:\n\tUFUNCTION(BlueprintCallable, BlueprintNativeEvent, Category = \"Dialogue\")\n\tFText GetText(const UDlgContext* Context, const UObject* Participant, const FString& DisplayStringParam);\n\tvirtual FText GetText_Implementation(const UDlgContext* Context, const UObject* Participant, const FString& DisplayStringParam)\n\t{\n\t\treturn FText::GetEmpty();\n\t}\n};\n\n// This is the same as UDlgTextArgumentCustom but it does NOT show the categories\nUCLASS(Blueprintable, BlueprintType, Abstract, EditInlineNew, CollapseCategories)\nclass DLGSYSTEM_API UDlgTextArgumentCustomHideCategories : public UDlgTextArgumentCustom\n{\n\tGENERATED_BODY()\n};\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystem/Public/GameplayDebugger/DlgDataDisplayActorProperties.h",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#pragma once\n\n#include \"CoreMinimal.h\"\n\n#include \"TreeViewHelpers/DlgTreeViewParticipantProperties.h\"\n#include \"TreeViewHelpers/DlgTreeViewVariableProperties.h\"\n\n\n/** Used as a key for the variable property */\nclass DLGSYSTEM_API FDlgDataDisplayVariableProperties : public FDlgTreeViewVariableProperties\n{\n\ttypedef FDlgTreeViewVariableProperties Super;\n\npublic:\n\tFDlgDataDisplayVariableProperties(const TSet<TWeakObjectPtr<const UDlgDialogue>>& InDialogues) : Super(InDialogues) {}\n\tFDlgDataDisplayVariableProperties(const TSet<TWeakObjectPtr<const UDlgDialogue>>&& InDialogues) : Super(InDialogues) {}\n};\n\n/** Used as a key for the Actor in the fast lookup table. */\nclass DLGSYSTEM_API FDlgDataDisplayActorProperties : public FDlgTreeViewParticipantProperties<FDlgDataDisplayVariableProperties>\n{\n\ttypedef FDlgTreeViewParticipantProperties Super;\n\npublic:\n\tFDlgDataDisplayActorProperties(const TSet<TWeakObjectPtr<const UDlgDialogue>>& InDialogues) : Super(InDialogues) {}\n\tFDlgDataDisplayActorProperties(const TSet<TWeakObjectPtr<const UDlgDialogue>>&& InDialogues) : Super(InDialogues) {}\n};\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystem/Public/GameplayDebugger/DlgDataDisplayTreeNode.h",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#pragma once\n\n#include \"CoreMinimal.h\"\n#include \"GameFramework/Actor.h\"\n\n#include \"TreeViewHelpers/DlgTreeViewNode.h\"\n\n// Type of Variable\nenum class EDlgDataDisplayVariableTreeNodeType : uint8\n{\n\tDefault = 0,\n\n\tEvent,\n\tCondition,\n\n\tInteger,\n\tFloat,\n\tBool,\n\tFName,\n\n\tClassInteger,\n\tClassFloat,\n\tClassBool,\n\tClassFName,\n\tClassFText\n};\n\n// Type of Text\nenum class EDlgDataDisplayTextTreeNodeType : uint8\n{\n\tDefault = 0,\n\n\tActor,\n\tVariable\n};\n\n// Type of Category\nenum class EDlgDataDisplayCategoryTreeNodeType : uint8\n{\n\tDefault = 0,\n\n\tEvent,\n\tCondition,\n\tVariables\n};\n\nclass FDlgDataDisplayTreeNode;\n\n/* Base class node for all Nodes in the DlgDataDisplayWindow  */\nclass DLGSYSTEM_API FDlgDataDisplayTreeNode : public FDlgTreeViewNode<FDlgDataDisplayTreeNode>\n{\n\ttypedef FDlgDataDisplayTreeNode Self;\n\ttypedef FDlgTreeViewNode Super;\npublic:\n\tFDlgDataDisplayTreeNode(const FText& InDisplayText, const TSharedPtr<Self>& InParent);\n\n\t// Categories\n\tEDlgDataDisplayTextTreeNodeType GetTextType() const { return TextType; }\n\tEDlgDataDisplayCategoryTreeNodeType GetCategoryType() const { return CategoryType; }\n\n\t/** Gets the Actor that has this Node belongs to. */\n\tvirtual TWeakObjectPtr<AActor> GetParentActor() const;\n\n\tvirtual bool IsText() const { return TextType != EDlgDataDisplayTextTreeNodeType::Default; }\n\tvirtual bool IsCategory() const { return false; }\n\tvirtual bool IsSeparator() const { return false; }\n\n\t/** Is this equal with Other? */\n\tvirtual bool IsEqual(const Self& Other)\n\t{\n\t\treturn TextType == Other.GetTextType() &&\n\t\t\tCategoryType == Other.GetCategoryType() &&\n\t\t\tDisplayText.EqualTo(Other.GetDisplayText()) &&\n\t\t\tGetParentActor() == Other.GetParentActor();\n\t}\n\n\tbool operator==(const Self& Other)\n\t{\n\t\treturn IsEqual(Other);\n\t}\n\nprotected:\n\t// FDlgTreeViewNode Interface\n\tvoid PostFilterPathsToNodes(const TSharedPtr<Self>& Child) override\n\t{\n\t\tSuper::PostFilterPathsToNodes(Child);\n\n\t\t// Hide separators\n\t\tif (Child->IsSeparator())\n\t\t{\n\t\t\tChild->SetIsVisible(false);\n\t\t}\n\t}\n\tvoid PostBuildPathToTopMostParent(const TSharedPtr<Self>& CurrentParentNode) override\n\t{\n\t\tSuper::PostBuildPathToTopMostParent(CurrentParentNode);\n\t\tcheck(!CurrentParentNode->IsSeparator());\n\t}\n\tbool FilterIsChildVisible(const TSharedPtr<Self>& GrandChild) override\n\t{\n\t\treturn !GrandChild->IsSeparator() && !GrandChild->IsCategory() && Super::FilterIsChildVisible(GrandChild);\n\t}\n\tbool FilterDoesChildContainText(const TSharedPtr<Self>& Child, const FString& InSearch) override\n\t{\n\t\treturn !Child->IsSeparator() && Super::FilterDoesChildContainText(Child, InSearch);\n\t}\n\nprotected:\n\t// Specific category type, only used if Type is Category.\n\tEDlgDataDisplayCategoryTreeNodeType CategoryType;\n\n\t// Specific text type, only used if the Type is Text.\n\tEDlgDataDisplayTextTreeNodeType TextType;\n};\n\n\n/** Root node of the Dialogue Data Display */\nclass DLGSYSTEM_API FDlgDataDisplayTreeRootNode : public FDlgDataDisplayTreeNode\n{\n\ttypedef FDlgDataDisplayTreeNode Super;\npublic:\n\tFDlgDataDisplayTreeRootNode();\n};\n\n\n/** Node result that Represents the Actor. */\nclass DLGSYSTEM_API FDlgDataDisplayTreeActorNode : public FDlgDataDisplayTreeNode\n{\n\ttypedef FDlgDataDisplayTreeNode Super;\npublic:\n\tFDlgDataDisplayTreeActorNode(\n\t\tconst FText& InDisplayText,\n\t\tconst TSharedPtr<FDlgDataDisplayTreeNode>& InParent,\n\t\tTWeakObjectPtr<AActor> InActor\n\t);\n\n\t/** FDlgDataDisplayTreeNode interface */\n\tTWeakObjectPtr<AActor> GetParentActor() const override;\n\t/** End FDlgDataDisplayTreeNode interface */\n\nprotected:\n\t/** The Actor this represents. */\n\tTWeakObjectPtr<AActor> Actor;\n};\n\n\n/** Node Representing a Category. */\nclass DLGSYSTEM_API FDlgDataDisplayTreeCategoryNode : public FDlgDataDisplayTreeNode\n{\n\ttypedef FDlgDataDisplayTreeNode Super;\npublic:\n\tFDlgDataDisplayTreeCategoryNode(\n\t\tconst FText& InDisplayText,\n\t\tconst TSharedPtr<FDlgDataDisplayTreeNode>& InParent,\n\t\tEDlgDataDisplayCategoryTreeNodeType InCategoryType\n\t);\n\n\tbool IsText() const override { return false; }\n\tbool IsCategory() const  override { return CategoryType != EDlgDataDisplayCategoryTreeNodeType::Default; }\n};\n\n\n/** Node result that Represents the Variable (Int/Float/Condition). */\nclass DLGSYSTEM_API FDlgDataDisplayTreeVariableNode : public FDlgDataDisplayTreeNode\n{\n\ttypedef FDlgDataDisplayTreeVariableNode Self;\n\ttypedef FDlgDataDisplayTreeNode Super;\npublic:\n\tFDlgDataDisplayTreeVariableNode(\n\t\tconst FText& InDisplayText,\n\t\tconst TSharedPtr<FDlgDataDisplayTreeNode>& InParent,\n\t\tFName InVariableName,\n\t\tEDlgDataDisplayVariableTreeNodeType InVariableType\n\t);\n\n\t// VariableName:\n\tFName GetVariableName() const { return VariableName; }\n\n\t// VariableValue:\n\tvoid SetVariableValue(const FString& InVariableValue) { VariableValue = InVariableValue; }\n\tFString GetVariableValue() const { return VariableValue; }\n\n\t// VariableType:\n\tEDlgDataDisplayVariableTreeNodeType GetVariableType() const { return VariableType; }\n\n\tbool IsEqual(const Super& Other) override\n\t{\n\t\tif (const Self* OtherSelf = static_cast<const Self*>(&Other))\n\t\t{\n\t\t\treturn VariableName == OtherSelf->GetVariableName() &&\n\t\t\t\tVariableType == OtherSelf->GetVariableType() &&\n\t\t\t\tVariableValue == OtherSelf->GetVariableValue() &&\n\t\t\t\tSuper::IsEqual(Other);\n\t\t}\n\t\treturn false;\n\t}\n\nprotected:\n\t/** Used to store the name Event, Condition, IntName, etc */\n\tFName VariableName = NAME_None;\n\n\t/** The Value of the Variable. Not Used for variable types that do not have a value (like event). */\n\tFString VariableValue;\n\n\t/** What type is this Variable? */\n\tEDlgDataDisplayVariableTreeNodeType VariableType;\n};\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystem/Public/GameplayDebugger/DlgGameplayDebuggerCategory.h",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#pragma once\n#if WITH_GAMEPLAY_DEBUGGER\n\n#include \"CoreMinimal.h\"\n#include \"GameplayDebuggerCategory.h\"\n\nclass AActor;\nclass APlayerController;\nclass FGameplayDebuggerCanvasContext;\n\n// The data we're going to print inside the viewport\nstruct DLGSYSTEM_API FDlgDataToPrint\n{\n\tint32 NumLoadedDialogues = 0;\n};\n\nclass DLGSYSTEM_API FDlgGameplayDebuggerCategory : public FGameplayDebuggerCategory\n{\nprivate:\n\ttypedef FDlgGameplayDebuggerCategory Self;\n\npublic:\n\tFDlgGameplayDebuggerCategory();\n\n\t/** Creates an instance of this category - will be used on module startup to include our category in the Editor */\n\tstatic TSharedRef<FGameplayDebuggerCategory> MakeInstance() { return MakeShared<Self>(); }\n\n\t// Begin FGameplayDebuggerCategory Interface\n\n\t/** Collects the data we would like to print */\n\tvoid CollectData(APlayerController* OwnerPC, AActor* DebugActor) override;\n\n\t/** Displays the data we collected in the CollectData function */\n\tvoid DrawData(APlayerController* OwnerPC, FGameplayDebuggerCanvasContext& CanvasContext) override;\n\nprotected:\n\t// The data that we're going to print\n\tFDlgDataToPrint Data;\n};\n\n#endif // WITH_GAMEPLAY_DEBUGGER\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystem/Public/GameplayDebugger/SDlgDataDisplay.h",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#pragma once\n#include \"Widgets/DeclarativeSyntaxSupport.h\"\n#include \"Widgets/SCompoundWidget.h\"\n#include \"Widgets/Views/STreeView.h\"\n#include \"Widgets/Input/SSearchBox.h\"\n\n#include \"GameplayDebugger/DlgDataDisplayTreeNode.h\"\n#include \"GameplayDebugger/DlgDataDisplayActorProperties.h\"\n\nDECLARE_LOG_CATEGORY_EXTERN(LogDlgSystemDataDisplay, Verbose, All);\n\n// Implements the Runtime Dialogue Data Display\nclass DLGSYSTEM_API SDlgDataDisplay : public SCompoundWidget\n{\n\ttypedef SDlgDataDisplay Self;\n\npublic:\n\tSLATE_BEGIN_ARGS(Self) {}\n\tSLATE_END_ARGS()\n\n\tvoid Construct(const FArguments& InArgs, const TWeakObjectPtr<const UObject>& InWorldContextObjectPtr);\n\n\tvoid SetWorldContextObject(const TWeakObjectPtr<const UObject>& InWorldContextObjectPtr)\n\t{\n\t\tWorldContextObjectPtr = InWorldContextObjectPtr;\n\t}\n\n\t// Updates the actors tree.\n\tvoid RefreshTree(bool bPreserveExpansion);\n\n\t// Get current filter text\n\tFText GetFilterText() const { return FilterTextBoxWidget->GetText(); }\n\nprivate:\n\t// Handle filtering.\n\tvoid GenerateFilteredItems();\n\n\t// Getters for widgets.\n\tTSharedRef<SWidget> GetFilterTextBoxWidget();\n\n\t// Add the Variables as children to the Item\n\tvoid AddVariableChildrenToItem(\n\t\tconst TSharedPtr<FDlgDataDisplayTreeNode>& Item,\n\t\tconst TMap<FName, TSharedPtr<FDlgDataDisplayVariableProperties>>& Variables,\n\t\tconst FText& DisplayTextFormat,\n\t\tEDlgDataDisplayVariableTreeNodeType VariableType\n\t);\n\n\t// Recursively build the view item.\n\tvoid BuildTreeViewItem(const TSharedPtr<FDlgDataDisplayTreeNode>& Item);\n\n\t// Text search changed\n\tvoid HandleSearchTextCommited(const FText& InText, ETextCommit::Type InCommitType);\n\n\t// Refresh button clicked.\n\tFReply HandleOnRefresh()\n\t{\n\t\tRefreshTree(true);\n\t\treturn FReply::Handled();\n\t}\n\n\t// Make the row\n\tTSharedRef<ITableRow> HandleGenerateRow(TSharedPtr<FDlgDataDisplayTreeNode> InItem, const TSharedRef<STableViewBase>& OwnerTable);\n\n\t// General Get children\n\tvoid HandleGetChildren(TSharedPtr<FDlgDataDisplayTreeNode> InItem, TArray<TSharedPtr<FDlgDataDisplayTreeNode>>& OutChildren);\n\n\t// Handles changes in the Tree View.\n\tvoid HandleTreeSelectionChanged(TSharedPtr<FDlgDataDisplayTreeNode> InItem, ESelectInfo::Type SelectInfo);\n\n\t// User clicked on item.\n\tvoid HandleDoubleClick(TSharedPtr<FDlgDataDisplayTreeNode> InItem);\n\n\t// Callback for expanding tree items recursively\n\tvoid HandleSetExpansionRecursive(TSharedPtr<FDlgDataDisplayTreeNode> InItem, bool bInIsItemExpanded);\n\n\t// Compare two FDlgDataDisplayTreeNode\n\tstatic bool PredicateCompareDlgDataDisplayTreeNode(const TSharedPtr<FDlgDataDisplayTreeNode>& FirstNode, const TSharedPtr<FDlgDataDisplayTreeNode>& SecondNode)\n\t{\n\t\tif (!FirstNode.IsValid() || !SecondNode.IsValid())\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t\treturn *FirstNode == *SecondNode;\n\t}\n\nprivate:\n\t// The search box\n\tTSharedPtr<SSearchBox> FilterTextBoxWidget;\n\n\t// The filter text from the search box.\n\tFString FilterString;\n\n\t// The root data source\n\tTSharedPtr<FDlgDataDisplayTreeNode> RootTreeItem;\n\n\t// The root children. Kept separate so that we do not corrupt the data.\n\tTArray<TSharedPtr<FDlgDataDisplayTreeNode>> RootChildren;\n\n\t// Tree view for showing all Actors that implement the , etc.\n\tTSharedPtr<STreeView<TSharedPtr<FDlgDataDisplayTreeNode>>> ActorsTreeView;\n\n\t// Used for fast lookup of each actor\n\t// Key: Weak Pointer to the Actor\n\t// Value: Actor properties\n\tTMap<TWeakObjectPtr<AActor>, TSharedPtr<FDlgDataDisplayActorProperties>> ActorsProperties;\n\n\t// Reference Object used to get the World\n\tTWeakObjectPtr<const UObject> WorldContextObjectPtr = nullptr;\n};\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystem/Public/GameplayDebugger/SDlgDataPropertyValues.h",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#pragma once\n#include \"Widgets/DeclarativeSyntaxSupport.h\"\n#include \"Widgets/SCompoundWidget.h\"\n\n#include \"GameplayDebugger/DlgDataDisplayTreeNode.h\"\n#include \"GameplayDebugger/DlgDataDisplayActorProperties.h\"\n\nclass SEditableTextBox;\nclass SCheckBox;\n\n\n/** The base type PropertyValue Widget. If just used by itself it displays the VariableValue as a static text. */\nclass DLGSYSTEM_API SDlgDataPropertyValue : public SCompoundWidget\n{\n\ttypedef SDlgDataPropertyValue Self;\n\ttypedef SCompoundWidget Super;\npublic:\n\tSLATE_BEGIN_ARGS(Self) {}\n\tSLATE_END_ARGS()\n\n\tvoid Construct(const FArguments& InArgs, const TSharedPtr<FDlgDataDisplayTreeVariableNode>& InVariableNode);\n\n\t// SWidget Interface\n\n\t/**\n\t * Ticks this widget with Geometry.  Override in derived classes, but always call the parent implementation.\n\t *\n\t * @param  AllottedGeometry The space allotted for this widget\n\t * @param  InCurrentTime  Current absolute real time\n\t * @param  InDeltaTime  Real time passed since last tick\n\t */\n\tvoid Tick(const FGeometry& AllottedGeometry, double InCurrentTime, float InDeltaTime) override;\n\n\t/**\n\t * Checks to see if this widget supports keyboard focus.  Override this in derived classes.\n\t *\n\t * @return  True if this widget can take keyboard focus\n\t */\n\tbool SupportsKeyboardFocus() const override\n\t{\n\t\treturn VariableNode.IsValid() && PrimaryWidget.IsValid() && PrimaryWidget->SupportsKeyboardFocus();\n\t}\n\n\t/**\n\t * Called when focus is given to this widget.  This event does not bubble.\n\t *\n\t * @param MyGeometry The Geometry of the widget receiving the event\n\t * @param  InFocusEvent  The FocusEvent\n\t * @return  Returns whether the event was handled, along with other possible actions\n\t */\n\tFReply OnFocusReceived(const FGeometry& MyGeometry, const FFocusEvent& InFocusEvent) override\n\t{\n\t\tif (PrimaryWidget.IsValid())\n\t\t{\n\t\t\treturn FReply::Handled().SetUserFocus(PrimaryWidget.ToSharedRef(), InFocusEvent.GetCause());\n\t\t}\n\n\t\treturn Super::OnFocusReceived(MyGeometry, InFocusEvent);\n\t}\n\n\t// Own functions\n\n\t/** Gets the Value of this Property as an FText; */\n\tFText GetTextValue() const { return FText::FromString(VariableNode->GetVariableValue()); }\n\nprotected:\n\t/** Updates the VariableNode value from the Actor. */\n\tvoid UpdateVariableNodeFromActor();\n\nprotected:\n\t/** The Node this widget value represents */\n\tTSharedPtr<FDlgDataDisplayTreeVariableNode> VariableNode;\n\n\t/** Primary Widget of this PropertyValue */\n\tTSharedPtr<SWidget> PrimaryWidget;\n\n\t/** Number of seconds passed in the Tick */\n\tfloat TickPassedDeltaTimeSeconds = 0.f;\n\n\tstatic constexpr float TickUpdateTimeSeconds = 1.0f;\n};\n\n\n/** The editable text property value of the variable. */\nclass SDlgDataTextPropertyValue : public SDlgDataPropertyValue\n{\n\ttypedef SDlgDataTextPropertyValue Self;\npublic:\n\tSLATE_BEGIN_ARGS(Self) {}\n\tSLATE_END_ARGS()\n\n\tvoid Construct(const FArguments& InArgs, const TSharedPtr<FDlgDataDisplayTreeVariableNode>& InVariableNode);\n\nprotected:\n\tvoid HandleTextCommitted(const FText& NewText, ETextCommit::Type CommitInfo);\n\tvoid HandleTextChanged(const FText& NewText);\n\n\tbool IsReadOnly() const { return !VariableNode.IsValid(); }\n\nprotected:\n\t/** Widget used for the single line version of the text property */\n\tTSharedPtr<SEditableTextBox> TextBoxWidget;\n\n\t/** True if property is an FName property which causes us to run extra size validation checks */\n\tbool bIsFNameProperty = false;\n};\n\n\n/** Even property value is just a button that triggers the event. */\nclass SDlgDataEventPropertyValue : public SDlgDataPropertyValue\n{\n\ttypedef SDlgDataEventPropertyValue Self;\npublic:\n\tSLATE_BEGIN_ARGS(Self) {}\n\tSLATE_END_ARGS()\n\n\tvoid Construct(const FArguments& InArgs, const TSharedPtr<FDlgDataDisplayTreeVariableNode>& InVariableNode);\n\n\t// SWidget Interface\n\tvoid Tick(const FGeometry& AllottedGeometry, double InCurrentTime, float InDeltaTime) override\n\t{\n\t\tSCompoundWidget::Tick(AllottedGeometry, InCurrentTime, InDeltaTime);\n\t}\n\nprotected:\n\tFReply HandleTriggerEventClicked();\n};\n\n\n/** The editable bool property value of the variable. Is represented by a checkbox */\nclass SDlgDataBoolPropertyValue : public SDlgDataPropertyValue\n{\n\ttypedef SDlgDataBoolPropertyValue Self;\npublic:\n\tSLATE_BEGIN_ARGS(Self) {}\n\tSLATE_END_ARGS()\n\n\tvoid Construct(const FArguments& InArgs, const TSharedPtr<FDlgDataDisplayTreeVariableNode>& InVariableNode);\n\n\t// SWidget interface\n\tbool HasKeyboardFocus() const override;\n\n\t/**\n\t * Called when a mouse button is double clicked.  Override this in derived classes.\n\t *\n\t * @param  InMyGeometry  Widget geometry\n\t * @param  InMouseEvent  Mouse button event\n\t * @return  Returns whether the event was handled, along with other possible actions\n\t */\n\tFReply OnMouseButtonDoubleClick(const FGeometry& InMyGeometry, const FPointerEvent& InMouseEvent) override;\n\nprotected:\n\tECheckBoxState IsChecked() const;\n\tvoid HandleCheckStateChanged(ECheckBoxState InNewState);\n\tbool IsBoolProperty() const { return VariableNode->GetVariableType() == EDlgDataDisplayVariableTreeNodeType::Bool ||\n\t\t\t\t\t\t\t\t\t\t VariableNode->GetVariableType() == EDlgDataDisplayVariableTreeNodeType::ClassBool; }\n\nprotected:\n\tTSharedPtr<SCheckBox> CheckBoxWidget;\n};\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystem/Public/IDlgDialogueEditorAccess.h",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#pragma once\n\n#include \"CoreMinimal.h\"\n\n#if WITH_EDITOR\nclass UEdGraph;\nclass UDlgDialogue;\nclass UEdGraphNode;\nclass UDlgNode;\n\n/**\n * Interface for dialogue graph interaction with the DlgSystemEditor module.\n * See DlgDialogueEditorModule.h (in the DlgSystemEditor) for the implementation of this interface.\n */\nclass DLGSYSTEM_API IDlgDialogueEditorAccess\n{\npublic:\n\tvirtual ~IDlgDialogueEditorAccess() {}\n\n\t// Updates the graph node edges data to match the dialogue data\n\tvirtual void UpdateGraphNodeEdges(UEdGraphNode* GraphNode) = 0;\n\n\t// Creates a new dialogue graph.\n\tvirtual UEdGraph* CreateNewDialogueGraph(UDlgDialogue* Dialogue) const = 0;\n\n\t// Compiles the dialogue nodes from the graph nodes. Meaning it transforms the graph data -> (into) dialogue data.\n\tvirtual void CompileDialogueNodesFromGraphNodes(UDlgDialogue* Dialogue) const = 0;\n\n\t// Removes all nodes from the graph.\n\tvirtual void RemoveAllGraphNodes(UDlgDialogue* Dialogue) const = 0;\n\n\t// Tells us if the number of dialogue nodes matches with the number of graph nodes (corresponding to dialogues).\n\tvirtual bool AreDialogueNodesInSyncWithGraphNodes(UDlgDialogue* Dialogue) const = 0;\n\n\t// Updates the Dialogue to match the version UseOnlyOneOutputAndInputPin\n\tvirtual void UpdateDialogueToVersion_UseOnlyOneOutputAndInputPin(UDlgDialogue* Dialogue) const = 0;\n\n\t// Tries to set the new outer for Object to the closes UDlgNode from UEdGraphNode\n\tvirtual void SetNewOuterForObjectFromGraphNode(UObject* Object, UEdGraphNode* GraphNode) const = 0;\n};\n#endif\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystem/Public/IDlgSystemModule.h",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#pragma once\n\n#include \"Modules/ModuleManager.h\"\n#include \"Modules/ModuleInterface.h\"\n\n// The name of the Dialogue System plugin as defined in the .uplugin file\nconst FName DIALOGUE_SYSTEM_PLUGIN_NAME(TEXT(\"DlgSystem\"));\n\nclass AActor;\nclass SWidget;\nclass SDockTab;\nstruct FTabSpawnerEntry;\n\n/**\n * Interface for the DlgSystem module.\n */\nclass DLGSYSTEM_API IDlgSystemModule : public IModuleInterface\n{\npublic:\n\n\t/**\n\t * Singleton-like access to this module's interface.  This is just for convenience!\n\t * Beware of calling this during the shutdown phase, though.  Your module might have been unloaded already.\n\t *\n\t * @return Returns singleton instance, loading the module on demand if needed\n\t */\n\tstatic IDlgSystemModule& Get()\n\t{\n\t\treturn FModuleManager::LoadModuleChecked<IDlgSystemModule>(DIALOGUE_SYSTEM_PLUGIN_NAME);\n\t}\n\n\t/**\n\t * Checks to see if this module is loaded and ready.  It is only valid to call Get() if IsAvailable() returns true.\n\t *\n\t * @return True if the module is loaded and ready to use\n\t */\n\tstatic bool IsAvailable()\n\t{\n\t\treturn FModuleManager::Get().IsModuleLoaded(DIALOGUE_SYSTEM_PLUGIN_NAME);\n\t}\n\npublic:\n\tvirtual ~IDlgSystemModule() {}\n\n\t/**\n\t * Registers all the console commands.\n\t * @param WorldConextObjectPtr - The reference actor for the World. Without this the runtime module won't know how to get the UWorld.\n\t */\n\tvirtual void RegisterConsoleCommands(const TWeakObjectPtr<const UObject>& WorldContextObjectPtr) = 0;\n\n\t// Unregister all the console commands\n\tvirtual void UnregisterConsoleCommands() = 0;\n\n\t// Gets the debug Dialogue Data Display Window.\n\tvirtual TSharedRef<SWidget> GetDialogueDataDisplayWindow() = 0;\n\n\t// Gets the tab entry for the Window\n\tvirtual FTabSpawnerEntry* GetDialogueDataDisplaySpawnEntry() = 0;\n\n\t// Display the debug Dialogue Data Window on the screen\n\tvirtual void DisplayDialogueDataWindow() = 0;\n};\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystem/Public/IO/DlgConfigParser.h",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#pragma once\n\n#include <functional>\n#include \"CoreTypes.h\"\n#include \"Logging/LogMacros.h\"\n\n#include \"IDlgParser.h\"\n#include \"NYReflectionHelper.h\"\n\nDECLARE_LOG_CATEGORY_EXTERN(LogDlgConfigParser, Log, All);\n\n\n/**\n * Because there is always another config format\n * Parser can be used to process the config word by word\n * 'word' is defined here as the thing between whitespaces\n * '{' and '}' are exceptions:\n *\t\tthey can be in block and treated separately as *first* character recursively (e.g. \"}}}}\" is valid but \"Name}\" is not\n * Default functionality can read a whole data structure from the proper config format\n * Supported Primitives: FString, FName, int32, bool, float\n * Supported complex types: Struct, Class\n * Supported containers: Array(*), Map (Key: Primitive + Struct, Value: Primitive + Struct), Set (Primitive)\n * Enum support: limited\n *\t\tpure enum array is not supported (enum can be a member in a struct which is in an array, but it can't be in an array directly)\n *\t\tenum set, enum in map: NOT IMPLEMENTED\n *\n * Heterogenous Collections are also supported (e.g. TArray<UObject*>)\n */\nclass DLGSYSTEM_API FDlgConfigParser : public IDlgParser\n{\npublic:\n\t/**\n\t *  Creates empty parser\n\t *  Call ReinitializeParser() on it to parse a file\n\t *  It is better to use a single parser for more files from the same type if those contain dynamic arrays,\n\t *  because it has to check all class names for the first time for each class\n\t */\n\tFDlgConfigParser(const FString InPreTag = \"\");\n\n\t/**\n\t * Creates the parser and finds the first word\n\t *\n\t * @param FilePath: path to the text file the parser will parse\n\t * @param InPreTag: Optional pretag added at the front of structs and classes\n\t */\n\tFDlgConfigParser(const FString& FilePath, const FString& InPreTag);\n\n\t// IDlgParser Interface\n\tvoid InitializeParser(const FString& FilePath) override;\n\n\tvoid InitializeParserFromString(const FString& Text) override;\n\n\tbool IsValidFile() const override\n\t{\n\t\treturn HasValidWord();\n\t}\n\n\tvoid ReadAllProperty(const UStruct* ReferenceClass, void* TargetObject, UObject* DefaultObjectOuter = nullptr) override;\n\n\tvoid ResetParser();\n\n\t/**\n\t * Tries to read a property from the config starting from the current word\n\t * If everything goes well the active word will be the first word *after* the property value\n\t * If the initial active word wasn't a property the next word will be the active one (or eof)\n\t *\n\t * @param ReferenceClass: UStruct (or UClass) of the TargetObject\n\t * @param TargetObject: pointer to the object instance the function will modify based on the config values\n\t * @param DefaultObjectOuter: Outer used for UObject construction if necessary\n\t *\n\t * @return Whether the word was interpreted successfully as a property or not\n\t */\n\tbool ReadProperty(const UStruct* ReferenceClass, void* TargetObject, UObject* DefaultObjectOuter = nullptr);\n\nprivate:\n\t/**\n\t * Tries to read a block where each entry is a property\n\t * a block is a '{', then properties, then '}'\n\t *\n\t * @param TargetObject: pointer to the object instance the function will modify based on the config values\n\t * @param ReferenceClass: UStruct (or UClass) of the TargetObject\n\t * @param bBlockStartAlreadyRead: if '{' is the actual word or the next\n\t * @param DefaultObjectOuter: Outer used for UObject construction if necessary\n\t *\n\t * @return Whether there was any syntax error or not\n\t */\n\tbool ReadPurePropertyBlock(void* TargetObject, const UStruct* ReferenceClass, bool bBlockStartAlreadyRead = false, UObject* DefaultObjectOuter = nullptr);\n\n\t/**\n\t * Creates a config string from the given top level object\n\t * WARNING: it exports *every* non-transient property from the supported types (check the class constructor)\n\t *\n\t * @param ReferenceType: UStruct (or UClass) of SourceObject\n\t * @param SourceObject: pointer to the object instance the function will copy to config\n\t *\n\t * @return the constructed config string\n\t */\n\tstatic FString ConstructConfigFile(const UStruct* ReferenceType, void* SourceObject);\n\n\n\t/**\n\t * Jumps to the next word in the parsed config\n\t *\n\t * @return Whether a new word was found (false -> end of file)\n\t */\n\tbool FindNextWord();\n\n\t/** Checks if the next parsed word begins with '\"' or not */\n\tbool IsNextWordString() const;\n\n\t/** Checks if the actual word begins with '\"' or not */\n\tbool IsActualWordString() const;\n\n\t/**\n\t * Jumps to the next word in the parsed config\n\t * warning is printed on eof based on input\n\t *\n\t * @return Whether a new word was found (false -> end of file)\n\t */\n\tbool FindNextWord(const FString& ExpectedStuff);\n\n\t/**\n\t * Jumps to the next word in the parsed config, and checks if it is a block start character (\"{\")\n\t * warning is printed if the word is not \"{\" or if the end of file is reached\n\t * @return Whether a new word \"{\" was found\n\t */\n\tbool FindNextWordAndCheckIfBlockStart(const FString& BlockName);\n\n\t/**\n\t * Jumps to the next word in the parsed config, and checks if it is a block end character (\"}\")\n\t * Warning is only printed if the end of file is reached\n\t * @return Whether a new word \"}\" was found\n\t */\n\tbool FindNextWordAndCheckIfBlockEnd(const FString& BlockName);\n\n\t/**\n\t * Checks the active word if it is a block end character (\"}\")\n\t * Warning is only printed if the end of file is reached\n\t * @Return Whether the active word is \"}\"\n\t */\n\tbool CheckIfBlockEnd(const FString& BlockName);\n\n\t/**\n\t * Compares the input string with the active word\n\t * This function is CASE SENSITIVE\n\t *\n\t * @return Whether the word and the strings are equal\n\t */\n\tbool CompareToActiveWord(const FString& StringToCompare) const;\n\n\t/**\n\t * Calculates the line count for the current word\n\t * TODO: could be counted on the fly\n\t * @return Active line index, or INDEX_NONE if there is no valid word\n\t */\n\tint32 GetActiveLineNumber() const;\n\n\t// @return false if the file could not be read or if the end of file is reached\n\tbool HasValidWord() const { return bHasValidWord; }\n\n\t/**\n\t * Should be avoided whenever possible (use CompareToActiveWord)\n\t * @return the active word, or an empty string if there isn't any\n\t */\n\tFString GetActiveWord() const { return bHasValidWord ? String.Mid(From, Len) : \"\"; }\n\n\t/**\n\t * @param FloatValue: out float value if the call succeeds\n\t * @return the active word converted, or an empty string if there isn't any\n\t */\n\tbool GetActiveWordAsFloat(float& FloatValue) const;\n\n\t/**\n\t *\n\t * @param TabCount: amount of tabs at the begining of each new line\n\t * @param OutString: InOut param, new lines will be added\n\t *\n\t * @return the constructed config string\n\t */\n\tstatic void ConstructConfigFileInternal(const UStruct* ReferenceType, int32 TabCount, void* SourceObject, FString& OutString);\n\n\n\t/** Tries to read the actual config value as a primitive property (all supported primitive is checked) */\n\tbool TryToReadPrimitiveProperty(void* Target, FNYProperty* PropertyBase);\n\n\tbool TryToReadEnum(void* TargetObject, FNYProperty* PropertyBase);\n\n\t/** Return value shows if it was read properly or not */\n\tbool ReadSet(void* TargetObject, FNYSetProperty& Property, UObject* DefaultObjectOuter);\n\n\t/** Return value shows if it was read properly or not */\n\tbool ReadMap(void* TargetObject, FNYMapProperty& Property, UObject* DefaultObjectOuter);\n\n\t/**\n\t * Tries to read the actual config value as a Type\n\t *\n\t * @param Target The struct/object whose properties are searched and modified based on the config string\n\t * @param PropertyBase The property - can be a TypeProperty or an ArrayProperty storing Type-s\n\t * @param OnGetAsValue Function returning the actual word converted to Type\n\t * @param TypeName The name of the type for logs (e.g. \"bool\")\n\t *\n\t * @return true if the property was a PropertyType or an array containging Type\n\t */\n\ttemplate <typename Type, typename PropertyType>\n\tbool ReadPrimitiveProperty(void* Target,\n\t\t\t\t\t\t\t   FNYProperty* PropertyBase,\n\t\t\t\t\t\t\t   std::function<Type()> OnGetAsValue,\n\t\t\t\t\t\t\t   const FString& TypeName,\n\t\t\t\t\t\t\t   bool bCanBeEmpty);\n\n\n\t/**\n\t * Tries to read a complex object from the config (object/struct)\n\t *\n\t * @param Target The struct/object whose properties are searched and modified based on the config string\n\t * @param Property can be a PropertyType or an ArrayProperty storing Type-s\n\t * @param ReferenceType The uclass/ustruct of the object the function is supposed to read\n\t * @param OnInitValue Creates the complex type if necessary (void*: the newly created object, UClass: the type of the object or nullptr, UObject*: outer)\n\t * @param Outer the object used as outer for uobject construction\n\t *\n\t * @return true if the complex type was read properly\n\t */\n\ttemplate <typename PropertyType>\n\tbool ReadComplexProperty(void* Target,\n\t\t\t\t\t\t\t FNYProperty* Property,\n\t\t\t\t\t\t\t const UStruct* ReferenceType,\n\t\t\t\t\t\t\t std::function<void*(void*, const UClass*, UObject*)> OnInitValue,\n\t\t\t\t\t\t\t UObject* Outer);\n\n\n\tbool GetAsBool() const;\n\tfloat GetAsFloat() const;\n\tint32 GetAsInt32() const;\n\tint64 GetAsInt64() const;\n\tFName GetAsName() const;\n\tFString GetAsString() const;\n\tFText GetAsText() const;\n\n\tvoid OnInvalidValue(const FString& PropType) const;\n\n\tvoid* OnInitObject(void* ValuePtr, const UClass* ChildClass, UObject* OuterInit);\n\n\t/** gets the UClass from an UObject or from an array of UObjects */\n\tconst UClass* SmartGetPropertyClass(FNYProperty* Property, const FString& TypeName);\n\nprivate:\n\n\t/** file path stored for log messages */\n\tFString FileName = \"\";\n\t/** whole config stored in a string */\n\tFString String = \"\";\n\t/** first character of active word */\n\tint32 From = 0;\n\t/** length of active word */\n\tint32 Len = 0;\n\n\t/** optional pretag before struct and class names */\n\tconst FString PreTag;\n\n\tbool bHasValidWord = false;\n\n\t// Nullptr value?\n\tbool bHasNullptr = false;\n\n\t/** used to skip the closing '\"' */\n\tbool bActiveIsString = false;\n};\n\n\ntemplate <typename Type, typename PropertyType>\nbool FDlgConfigParser::ReadPrimitiveProperty(void* Target,\n\t\t\t\t\t\t\t\t\t\t\t FNYProperty* PropertyBase,\n\t\t\t\t\t\t\t\t\t\t\t std::function<Type()> OnGetAsValue,\n\t\t\t\t\t\t\t\t\t\t\t const FString& TypeName,\n\t\t\t\t\t\t\t\t\t\t\t bool bCanBeEmpty)\n{\n\t// try to find a member variable with the name\n\tPropertyType* Property = FNYReflectionHelper::CastProperty<PropertyType>(PropertyBase);\n\tif (Property == nullptr)\n\t{\n\t\t// Array\n\t\t// No property found, let's check if there is an array with the same name\n\t\tauto* ArrayProp = FNYReflectionHelper::CastProperty<FNYArrayProperty>(PropertyBase);\n\n\t\t// SmartCastProperty gets the inner type of the array and uses dynamic_cast to cast it to the proper type\n\t\tif (ArrayProp == nullptr || FNYReflectionHelper::SmartCastProperty<PropertyType>(ArrayProp) == nullptr)\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\tTArray<Type>* Array = ArrayProp->ContainerPtrToValuePtr<TArray<Type>>(Target);\n\t\tArray->Empty();\n\t\tif (FindNextWordAndCheckIfBlockStart(TypeName + \"Array\"))\n\t\t{\n\t\t\t// read values until the block ends\n\t\t\twhile (!FindNextWordAndCheckIfBlockEnd(TypeName + \"Array\"))\n\t\t\t{\n\t\t\t\tif (!bHasValidWord && !bCanBeEmpty)\n\t\t\t\t{\n\t\t\t\t\tUE_LOG(LogDlgConfigParser, Warning, TEXT(\"Unexpected end of file while array end was expected (config %s)\"), *FileName)\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tArray->Add(OnGetAsValue());\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\telse\n\t{\n\t\t// Primitive type\n\t\tFindNextWord();\n\t\tif (bHasValidWord || bCanBeEmpty)\n\t\t{\n\t\t\tProperty->SetPropertyValue_InContainer(Target, OnGetAsValue());\n\t\t}\n\t\telse\n\t\t{\n\t\t\tUE_LOG(LogDlgConfigParser, Warning, TEXT(\"Unexpected end of file while %s value was expected (config %s)\"), *TypeName, *FileName)\n\t\t}\n\t}\n\n\tFindNextWord();\n\treturn true;\n}\n\n\ntemplate <typename PropertyType>\nbool FDlgConfigParser::ReadComplexProperty(void* Target,\n\t\t\t\t\t\t\t\t\t\t   FNYProperty* Property,\n\t\t\t\t\t\t\t\t\t\t   const UStruct* ReferenceType,\n\t\t\t\t\t\t\t\t\t\t   std::function<void*(void*, const UClass*, UObject*)> OnInitValue,\n\t\t\t\t\t\t\t\t\t\t   UObject* Outer)\n{\n\tPropertyType* ElementProp = FNYReflectionHelper::CastProperty<PropertyType>(Property);\n\tif (ElementProp == nullptr)\n\t{\n\t\tauto* ArrayProp = FNYReflectionHelper::CastProperty<FNYArrayProperty>(Property);\n\t\tif (ArrayProp == nullptr || FNYReflectionHelper::SmartCastProperty<PropertyType>(ArrayProp) == nullptr)\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\t// Array\n\t\tFScriptArrayHelper Helper(ArrayProp, ArrayProp->ContainerPtrToValuePtr<uint8>(Target));\n\t\tHelper.EmptyValues();\n\t\tif (!FindNextWordAndCheckIfBlockStart(ReferenceType->GetName() + \"Array element\") || !FindNextWord(\"{ or }\"))\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\twhile (!CheckIfBlockEnd(ReferenceType->GetName() + \"Array element\"))\n\t\t{\n\t\t\tconst UClass* ReferenceClass = Cast<UClass>(ReferenceType);\n\t\t\tif (ReferenceClass != nullptr)\n\t\t\t{\n\t\t\t\tif (IsActualWordString() && ArrayProp->Inner != nullptr) // UObject by reference\n\t\t\t\t{\n\t\t\t\t\tconst FString Path = GetActiveWord();\n\t\t\t\t\tvoid* TargetPtr = Helper.GetRawPtr(Helper.AddValue());\n\t\t\t\t\tauto* ObjectPtrPtr = static_cast<UObject**>(TargetPtr);\n\t\t\t\t\t*ObjectPtrPtr = nullptr; // reset first\n\t\t\t\t\tif (!Path.TrimStartAndEnd().IsEmpty()) // null reference ?\n\t\t\t\t\t{\n\t\t\t\t\t\t*ObjectPtrPtr = StaticLoadObject(UObject::StaticClass(), Outer, *Path);\n\t\t\t\t\t}\n\n\t\t\t\t\tFindNextWord();\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tconst FString TypeName = PreTag + GetActiveWord();\n\t\t\t\tReferenceClass = GetChildClassFromName(ReferenceClass, TypeName);\n\t\t\t\tif (ReferenceClass == nullptr)\n\t\t\t\t{\n\t\t\t\t\tUE_LOG(LogDlgConfigParser, Warning, TEXT(\"Failed to find class %s in config %s (:%d)\"),\n\t\t\t\t\t\t*TypeName, *FileName, GetActiveLineNumber());\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (!CompareToActiveWord(\"{\"))\n\t\t\t{\n\t\t\t\tif (!bHasValidWord)\n\t\t\t\t{\n\t\t\t\t\tUE_LOG(LogDlgConfigParser, Warning, TEXT(\"Unexpected end of file while %s array element end was expected (config %s)\"),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t*ReferenceType->GetName(), *FileName)\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tUE_LOG(LogDlgConfigParser, Warning, TEXT(\"'{' expected but %s found for %s array element (config %s :%d)\"),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t*ReferenceType->GetName(), *GetActiveWord(), *FileName, GetActiveLineNumber());\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tvoid* Value = OnInitValue(Helper.GetRawPtr(Helper.AddValue()), ReferenceClass, Outer);\n\t\t\tif (!ReadPurePropertyBlock(Value, ReferenceClass == nullptr ? ReferenceType : ReferenceClass, ReferenceClass == nullptr, Outer))\n\t\t\t{\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\tFindNextWord();\n\t\treturn true;\n\t}\n\n\t// Try pure block\n\tvoid* Value = OnInitValue(ElementProp->template ContainerPtrToValuePtr<void>(Target), Cast<UClass>(ReferenceType), Outer);\n\treturn ReadPurePropertyBlock(Value, ReferenceType, false, Outer);\n}\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystem/Public/IO/DlgConfigWriter.h",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#pragma once\n\n#include <functional>\n#include \"Logging/LogMacros.h\"\n#include \"UObject/UnrealType.h\"\n#include \"Misc/FileHelper.h\"\n#include \"UObject/TextProperty.h\"\n\n#include \"IDlgWriter.h\"\n#include \"NYReflectionHelper.h\"\n\nDECLARE_LOG_CATEGORY_EXTERN(LogDlgConfigWriter, Log, All);\n\n\n\n/**\n * Because there is always another config format\n * And there is always a copy-pasted comment.\n * See IDlgWriter for properties and METADATA specifiers.\n */\nclass DLGSYSTEM_API FDlgConfigWriter : public IDlgWriter\n{\n\npublic:\n\n\t/**\n\t * Creates a config string from the input struct/object\n\t * All property is saved recursively except the ones with the metadata \"DlgNoExport\" and the nodes with the flags\n\t * defined in SkipFlags.\n\t * Call ExportToFile() to save it\n\t *\n\t * Check FDlgConfigParser for the list of supported constructions (some container is limited in some ways)\n\t * If there is a nullptr in the middle of an array it is skipped, the array num will be different after parsing it back,\n\t * unless it is written by reference\n\t *\n\t * @param StructDefinition: UStruct of Object\n\t * @param Object: pointer to a variable (Struct / UObject)\n\t * @param InComplexNamePrefix: project specific pretag in struct and class names\n\t\t\t\t\t\t\t\t   can be used not to export it to have better readable config file\n\t * @param bInDontWriteEmptyContainer: if it is enabled empty TSet, TMap and TArray properties won't be written\n\t */\n\tFDlgConfigWriter(const FString InComplexNamePrefix = \"\",\n\t\t\t\t\t bool bInDontWriteEmptyContainer = true);\n\n\t// IDlgWriter Interface\n\n\t/** Has to be called to prepare the text data */\n\tvoid Write(const UStruct* StructDefinition, const void* Object) override;\n\n\t/**\n\t * Save the config string to a text file\n\t * @param FullName: Full path + file name + extension\n\t */\n\tbool ExportToFile(const FString& FileName) override\n\t{\n\t\treturn FFileHelper::SaveStringToFile(ConfigText, *FileName, FFileHelper::EEncodingOptions::ForceUTF8WithoutBOM);\n\t}\n\n\tconst FString& GetAsString() const override\n\t{\n\t\treturn ConfigText;\n\t}\n\nprotected:\n\n\tvoid WriteComplexToString(const UStruct* StructDefinition,\n\t\t\t\t\t\t\t  const FNYProperty* Property,\n\t\t\t\t\t\t\t  const void* Object,\n\t\t\t\t\t\t\t  const FString& PreString,\n\t\t\t\t\t\t\t  const FString& PostString,\n\t\t\t\t\t\t\t  bool bContainerElement,\n\t\t\t\t\t\t\t  bool bWriteType,\n\t\t\t\t\t\t\t  FString& Target);\n\n\tvoid WriteComplexMembersToString(const UStruct* StructDefinition,\n\t\t\t\t\t\t\t\t\t const void* Object,\n\t\t\t\t\t\t\t\t\t const FString& PreString,\n\t\t\t\t\t\t\t\t\t const FString& PostString,\n\t\t\t\t\t\t\t\t\t FString& Target);\n\n\tbool WritePropertyToString(const FNYProperty* Property,\n\t\t\t\t\t\t\t   const void* Object,\n\t\t\t\t\t\t\t   bool bContainerElement,\n\t\t\t\t\t\t\t   const FString& PreString,\n\t\t\t\t\t\t\t   const FString& PostString,\n\t\t\t\t\t\t\t   bool bPointerAsRef,\n\t\t\t\t\t\t\t   FString& Target);\n\n\t// object is pointer to the owner\n\tbool WritePrimitiveElementToString(const FNYProperty* Property,\n\t\t\t\t\t\t\t\t\t   const void* Object,\n\t\t\t\t\t\t\t\t\t   bool bContainerElement,\n\t\t\t\t\t\t\t\t\t   const FString& PreString,\n\t\t\t\t\t\t\t\t\t   const FString& PostString,\n\t\t\t\t\t\t\t\t\t   FString& Target);\n\n\tbool WritePrimitiveArrayToString(const FNYProperty* Property,\n\t\t\t\t\t\t\t\t\t const void* Object,\n\t\t\t\t\t\t\t\t\t const FString& PreString,\n\t\t\t\t\t\t\t\t\t const FString& PostString,\n\t\t\t\t\t\t\t\t\t FString& Target);\n\n\tbool WriteComplexElementToString(const FNYProperty* Property,\n\t\t\t\t\t\t\t\t\t const void* Object,\n\t\t\t\t\t\t\t\t\t bool bContainerElement,\n\t\t\t\t\t\t\t\t\t const FString& PreString,\n\t\t\t\t\t\t\t\t\t const FString& PostString,\n\t\t\t\t\t\t\t\t\t bool bPointerAsRef,\n\t\t\t\t\t\t\t\t\t FString& Target);\n\n\tbool WriteComplexArrayToString(const FNYProperty* Property,\n\t\t\t\t\t\t\t\t   const void* Object,\n\t\t\t\t\t\t\t\t   const FString& PreString,\n\t\t\t\t\t\t\t\t   const FString& PostString,\n\t\t\t\t\t\t\t\t   FString& Target);\n\n\tbool WriteMapToString(const FNYProperty* Property,\n\t\t\t\t\t\t  const void* Object,\n\t\t\t\t\t\t  const FString& PreString,\n\t\t\t\t\t\t  const FString& PostString,\n\t\t\t\t\t\t  FString& Target);\n\n\tbool WriteSetToString(const FNYProperty* Property,\n\t\t\t\t\t\t  const void* Object,\n\t\t\t\t\t\t  const FString& PreString,\n\t\t\t\t\t\t  const FString& PostString,\n\t\t\t\t\t\t  FString& Target);\n\n\tbool IsPrimitive(const FNYProperty* Property);\n\tbool IsContainer(const FNYProperty* Property);\n\tbool IsPrimitiveContainer(const FNYProperty* Property);\n\n\tbool WouldWriteNonPrimitive(const UStruct* StructDefinition, const void* Owner);\n\n\tconst UStruct* GetComplexType(const FNYProperty* Property);\n\n\n\t// expects object or struct property, returns empty string otherwise\n\tFString GetNameWithoutPrefix(const FNYProperty* StructDefinition, const UObject* ObjectPtr = nullptr);\n\tFString GetStringWithoutPrefix(const FString& String);\n\n\n\t////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\ttemplate <typename PropertyType, typename VariableType>\n\tbool WritePrimitiveElementToStringTemplated(const FNYProperty* Property,\n\t\t\t\t\t\t\t\t\t\t\t\tconst void* Object,\n\t\t\t\t\t\t\t\t\t\t\t\tbool bContainerElement,\n\t\t\t\t\t\t\t\t\t\t\t\tstd::function<FString(const VariableType&)> GetAsString,\n\t\t\t\t\t\t\t\t\t\t\t\tconst FString& PreString,\n\t\t\t\t\t\t\t\t\t\t\t\tconst FString& PostString,\n\t\t\t\t\t\t\t\t\t\t\t\tFString& Target)\n\t{\n\t\tconst PropertyType* CastedProperty = FNYReflectionHelper::CastProperty<PropertyType>(Property);\n\t\tif (CastedProperty != nullptr)\n\t\t{\n\t\t\tTarget += PreString +\n\t\t\t\t\t  (bContainerElement ? \"\" : (CastedProperty->GetName() + \" \")) +\n\t\t\t\t\t  GetAsString(CastedProperty->GetPropertyValue_InContainer(Object, 0)) +\n\t\t\t\t\t  PostString;\n\t\t\treturn true;\n\t\t}\n\n\t\treturn false;\n\t}\n\n\t////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\ttemplate <typename PropertyType, typename VariableType>\n\tbool WritePrimitiveArrayToStringTemplated(const FNYArrayProperty* ArrayProp,\n\t\t\t\t\t\t\t\t\t\t\t  const void* Object,\n\t\t\t\t\t\t\t\t\t\t\t  std::function<FString(const VariableType&)> ToString,\n\t\t\t\t\t\t\t\t\t\t\t  const FString& PreString,\n\t\t\t\t\t\t\t\t\t\t\t  const FString& PostString,\n\t\t\t\t\t\t\t\t\t\t\t  FString& Target)\n\t{\n\t\tif (FNYReflectionHelper::CastProperty<PropertyType>(ArrayProp->Inner) == nullptr)\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\tconst TArray<VariableType>* ArrayPtr = ArrayProp->ContainerPtrToValuePtr<TArray<VariableType>>(Object);\n\t\tif (ArrayPtr == nullptr)\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t\tconst bool bLinePerItem = CanWriteOneLinePerItem(ArrayProp);\n\n\t\t// Empty array\n\t\tconst TArray<VariableType> Array = *ArrayPtr;\n\t\tif (Array.Num() == 0 && bDontWriteEmptyContainer)\n\t\t{\n\t\t\treturn true;\n\t\t}\n\n\t\t// Establish indentation to be the same as the ArrayName.len + 3 spaces\n\t\tFString SubPreString = PreString;\n\t\tfor (int32 i = 0; i < ArrayProp->GetName().Len() + 3; ++i)\n\t\t{\n\t\t\tSubPreString += \" \";\n\t\t}\n\n\t\t// ArrayName {\n\t\tTarget += PreString + ArrayProp->GetName() + \" {\" + (bLinePerItem ? EOL_String : \" \");\n\n\t\t// Array content\n\t\tfor (int32 i = 0; i < Array.Num(); ++i)\n\t\t{\n\t\t\tif (bLinePerItem)\n\t\t\t{\n\t\t\t\tTarget += SubPreString + ToString(Array[i]) + EOL;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tTarget += ToString(Array[i]) + \" \";\n\t\t\t}\n\t\t}\n\n\t\t// }\n\t\tTarget += (bLinePerItem ? PreString : \"\") + \"}\" + PostString;\n\n\t\treturn true;\n\t}\n\n\t////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\ttemplate <typename PropertyType, typename VariableType>\n\tbool WritePrimitiveToStringTemplated(const FNYProperty* Property,\n\t\t\t\t\t\t\t\t\t\t const void* Object,\n\t\t\t\t\t\t\t\t\t\t bool bContainerElement,\n\t\t\t\t\t\t\t\t\t\t std::function<FString(const VariableType&)> GetAsString,\n\t\t\t\t\t\t\t\t\t\t const FString& PreString,\n\t\t\t\t\t\t\t\t\t\t const FString& PostString,\n\t\t\t\t\t\t\t\t\t\t FString& Target)\n\t{\n\t\tconst PropertyType* CastedProperty = FNYReflectionHelper::CastProperty<PropertyType>(Property);\n\t\tif (CastedProperty != nullptr)\n\t\t{\n\t\t\tTarget += PreString +\n\t\t\t\t\t  (bContainerElement ? \"\" : (CastedProperty->GetName() + \" \")) +\n\t\t\t\t\t  GetAsString(*((VariableType*)(Object))) +\n\t\t\t\t\t  PostString;\n\t\t\treturn true;\n\t\t}\n\n\t\treturn false;\n\t}\n\n\t/** Converts all endlines to be of one type. */\n\tstatic FString NormalizeEndlines(const FString& Original)\n\t{\n\t\treturn Original.Replace(EOL_CRLF, EOL_LF, ESearchCase::IgnoreCase);\n\t}\n\nprivate:\n\t// End of line\n\tstatic const TCHAR* EOL_LF;\n\tstatic const TCHAR* EOL_CRLF;\n\tstatic const TCHAR* EOL;\n\n\t// Helper strings\n\tstatic const FString EOL_String;\n\n\tFString ConfigText = \"\";\n\n\tconst void* TopLevelObjectPtr = nullptr;\n\tconst FString ComplexNamePrefix;\n\tconst bool bDontWriteEmptyContainer;\n\n\t// Conversion to string functions\n\tconst std::function<FString(const bool&)> BoolToString = [](const bool& bBool) -> FString\n\t{\n\t\treturn bBool ? \"True\" : \"False\";\n\t};\n\n\tconst std::function<FString(const int64&)> IntToString = [](const int64& IntVal) -> FString\n\t{\n\t\treturn FString::Printf(TEXT(\"%lld\"), IntVal);\n\t};\n\n\tconst std::function<FString(const float&)> FloatToString = [](const float& FloatVal) -> FString\n\t{\n\t\treturn FString::SanitizeFloat(FloatVal);\n\t};\n\n\tconst std::function<FString(const FString&)> StringToString = [](const FString& String) -> FString\n\t{\n\t\treturn FString(\"\\\"\") + NormalizeEndlines(String) + \"\\\"\";\n\t};\n\n\tconst std::function<FString(const FName&)> NameToString = [](const FName& Name) -> FString\n\t{\n\t\treturn FString(\"\\\"\") + NormalizeEndlines(Name.ToString()) + \"\\\"\";\n\t};\n\n\tconst std::function<FString(const FText&)> TextToString = [](const FText& Text) -> FString\n\t{\n\t\treturn FString(\"\\\"\") + NormalizeEndlines(Text.ToString()) + \"\\\"\";\n\t};\n};\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystem/Public/IO/DlgJsonParser.h",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#pragma once\n\n#include \"CoreTypes.h\"\n#include \"Logging/LogMacros.h\"\n#include \"Dom/JsonValue.h\"\n#include \"Dom/JsonObject.h\"\n\n#include \"IDlgParser.h\"\n#include \"NYReflectionTypes.h\"\n\nDECLARE_LOG_CATEGORY_EXTERN(LogDlgJsonParser, All, All);\n\n\n/**\n * @brief The DlgJsonParser class mostly adapted for Dialogues, copied from FJsonObjectConverter\n * See IDlgParser for properties and METADATA specifiers.\n */\nclass DLGSYSTEM_API FDlgJsonParser : public IDlgParser\n{\n\t/**\n\t * Call Order and possible calls:\n\t *  - DlgJsonParser\n\t *\t\t- InitializeParser\n\t *\t\t\t- JsonObjectStringToUStruct\n\t *\t\t\t\t- JsonObjectToUStruct\n\t *\t\t\t\t\t- JsonAttributesToUStruct\n\t *\t\t\t\t\t\t- JsonValueToProperty\n\t *\t\t\t\t\t\t\t- ConvertScalarJsonValueToProperty\n\t *\t\t\t\t\t\t\t\t- JsonValueToProperty\n\t *\t\t\t\t\t\t\t\t- JsonObjectToUStruct\n\t */\n\npublic:\n\tFDlgJsonParser() {}\n\n\tFDlgJsonParser(const FString& FilePath)\n\t{\n\t\tInitializeParser(FilePath);\n\t}\n\n\t// IDlgParser Interface\n\tvoid InitializeParser(const FString& FilePath) override;\n\tvoid InitializeParserFromString(const FString& Text) override;\n\tbool IsValidFile() const override { return bIsValidFile; }\n\tvoid ReadAllProperty(const UStruct* ReferenceClass, void* TargetObject, UObject* DefaultObjectOuter = nullptr) override;\n\n\nprivate: // JSON -> UStruct\n\n\t/**\n\t * Convert JSON to property, assuming either the property is not an array or the value is an individual array element\n\t * Used by JsonValueToProperty\n\t */\n\tbool ConvertScalarJsonValueToProperty(const TSharedPtr<FJsonValue>& JsonValue, FNYProperty* Property, void* ContainerPtr, void* ValuePtr);\n\n\t/**\n\t * Converts a single JsonValue to the corresponding Property (this may recurse if the property is a UStruct for instance).\n\t *\n\t * @param JsonValue The value to assign to this property\n\t * @param Property The Property definition of the property we're setting.\n\t * @param ValuePtr Pointer to the property instance to be modified.\n\t *\n\t * @return False if the property failed to serialize\n\t */\n\tbool JsonValueToProperty(const TSharedPtr<FJsonValue>& JsonValue, FNYProperty* Property, void* ContainerPtr, void* ValuePtr);\n\n\t/**\n\t * Converts a set of json attributes (possibly from within a JsonObject) to a UStruct, using importText\n\t *\n\t * @param JsonAttributes \tJson Object to copy data out of\n\t * @param StructDefinition  UStruct definition that is looked over for properties\n\t * @param ContainerPtr \t\tThe Pointer instance to copy in to\n\t *\n\t * @return False if any properties matched but failed to deserialize\n\t */\n\tbool JsonAttributesToUStruct(const TMap<FString, TSharedPtr<FJsonValue>>& JsonAttributes,\n\t\t\t\t\t\t\t\tconst UStruct* StructDefinition, void* ContainerPtr);\n\n\t/**\n\t * Converts from a Json Object to a UStruct, using importText\n\t *\n\t * @param JsonObject \t\tJson Object to copy data out of\n\t * @param StructDefinition  UStruct definition that is looked over for properties\n\t * @param ContainerPtr \t\tThe Pointer instance to copy in to\n\t *\n\t * @return False if any properties matched but failed to deserialize\n\t */\n\tbool JsonObjectToUStruct(const TSharedRef<const FJsonObject>& JsonObject, const UStruct* StructDefinition, void* ContainerPtr)\n\t{\n\t\treturn JsonAttributesToUStruct(JsonObject->Values, StructDefinition, ContainerPtr);\n\t}\n\n\t/**\n\t * Converts from a json string containing an object to a UStruct\n\t *\n\t * @param OutStruct The UStruct instance to copy in to\n\t * @param ContainerPtr \t\tThe Pointer instance to copy in to\n\t *\n\t * @return False if any properties matched but failed to deserialize\n\t */\n\tbool JsonObjectStringToUStruct(const UStruct* StructDefinition, void* ContainerPtr);\n\nprivate:\n\tFString JsonString;\n\tFString FileName;\n\tbool bIsValidFile = false;\n\n\t/** The default object outer used when creating new objects when using NewObject.  */\n\tUObject* DefaultObjectOuter = nullptr;\n\n\t/** Only properties that have these flags will be read. */\n\tstatic constexpr int64 CheckFlags = ~CPF_ParmFlags;\n};\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystem/Public/IO/DlgJsonWriter.h",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#pragma once\n\n#include \"Logging/LogMacros.h\"\n#include \"UObject/UnrealType.h\"\n#include \"Misc/FileHelper.h\"\n#include \"Dom/JsonValue.h\"\n#include \"Dom/JsonObject.h\"\n\n#include \"IDlgWriter.h\"\n\nDECLARE_LOG_CATEGORY_EXTERN(LogDlgJsonWriter, All, All);\n\n\nstruct DLGSYSTEM_API DlgJsonWriterOptions\n{\n\tint32 InitialIndent = 0;\n\tbool bPrettyPrint = true;\n};\n\n/**\n * @brief The DlgJsonWriter class mostly adapted for Dialogues, copied from FJsonObjectConverter\n * See IDlgWriter for properties and METADATA specifiers.\n */\nclass DLGSYSTEM_API FDlgJsonWriter : public IDlgWriter\n{\n\t/**\n\t * Call Order and possible calls:\n\t *  - DlgJsonWriter\n\t *\t\t- UStructToJsonString\n\t *\t\t\t- UStructToJsonObject\n\t *\t\t\t\t- UStructToJsonAttributes\n\t *\t\t\t\t\t- PropertyToJsonValue\n\t *\t\t\t\t\t\t- ConvertScalarPropertyToJsonValue\n\t *\t\t\t\t\t\t\t- PropertyToJsonValue\n\t *\t\t\t\t\t\t\t- UStructToJsonObject\n\t */\npublic:\n\n\tFDlgJsonWriter() {};\n\n\t// IDlgWriter Interface\n\tvoid Write(const UStruct* StructDefinition, const void* ContainerPtr) override;\n\n\t/**\n\t * Save the config string to a text file\n\t * @param FullName: Full path + file name + extension\n\t * @return\tFalse on failure to write\n\t */\n\tbool ExportToFile(const FString& FileName) override\n\t{\n\t\treturn FFileHelper::SaveStringToFile(JsonString, *FileName, FFileHelper::EEncodingOptions::ForceUTF8WithoutBOM);\n\t}\n\n\tconst FString& GetAsString() const override\n\t{\n\t\treturn JsonString;\n\t}\n\nprivate: // UStruct -> JSON\n\t/**\n\t * Convert property to JSON, assuming either the property is not an array or the value is an individual array element\n\t * Used by PropertyToJsonValue\n\t */\n\tTSharedPtr<FJsonValue> ConvertScalarPropertyToJsonValue(const FNYProperty* Property, const void* const ContainerPtr, const void* const ValuePtr);\n\n\t/**\n\t * Converts from a Property to a Json Value using exportText\n\t *\n\t * @param Property\t\t\tThe property to export\n\t * @param ValuePtr\t\t\tPointer to the value of the property\n\t *\n\t * @return\t\t\t\t\tThe constructed JsonValue from the property\n\t */\n\tTSharedPtr<FJsonValue> PropertyToJsonValue(const FNYProperty* Property, const void* const ContainerPtr, const void* const ValuePtr);\n\n\t/**\n\t * Converts from a UStruct to a set of json attributes (possibly from within a JsonObject)\n\t *\n\t * @param StructDefinition UStruct definition that is looked over for properties\n\t * @param ContainerPtr\t   The object the UStruct represents.\n\t * @param JsonAttributes   Map of attributes to copy in to\n\t *\n\t * @return False if any properties failed to write\n\t */\n\tbool UStructToJsonAttributes(const UStruct* StructDefinition, const void* const ContainerPtr,\n\t\t\t\t\t\t\t\t TMap<FString, TSharedPtr<FJsonValue>>& OutJsonAttributes);\n\n\t/**\n\t * Converts from a UStruct to a JSON Object\n\t *\n\t * @param StructDefinition UStruct definition that is looked over for properties\n\t * @param ContainerPtr\t   The object the UStruct represents.\n\t * @param OutJsonObject    Json Object to be filled in with data from the ustruct\n\t *\n\t * @return False if faile to fill properties\n\t */\n\tbool UStructToJsonObject(const UStruct* StructDefinition, const void* const ContainerPtr, TSharedRef<FJsonObject>& OutJsonObject)\n\t{\n\t\treturn UStructToJsonAttributes(StructDefinition, ContainerPtr, OutJsonObject->Values);\n\t}\n\n\t/**\n\t * Converts from a UStruct to a JSON string containing an object, using exportText\n\t *\n\t * @param StructDefinition UStruct definition that is looked over for properties\n\t * @param ContainerPtr\t   The object the UStruct represents.\n\t * @param OutJsonString    Json Object to be filled in with data from the ustruct\n\t *\n\t * @return False if failed to serialize to string\n\t */\n\tbool UStructToJsonString(const UStruct* StructDefinition, const void* const ContainerPtr, const DlgJsonWriterOptions& Options,\n\t\t\t\t\t\t\t FString& OutJsonString);\n\n\tvoid ResetState()\n\t{\n\t\tIndexInArray = INDEX_NONE;\n\t\tbIsPropertyMapKey = false;\n\t}\n\nprivate:\n\t// Final output string\n\tFString JsonString;\n\n\t/** Only properties that have these flags will be written. */\n\tstatic constexpr int64 CheckFlags = ~CPF_ParmFlags; // all properties except those who have these flags? TODO is this ok?\n\n\t// Used when parsing\n\n\t// If it is in an array this is != INDEX_NONE\n\tint32 IndexInArray = INDEX_NONE;\n\n\t// Is the current property used as a map key?\n\tbool bIsPropertyMapKey = false;\n};\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystem/Public/IO/IDlgParser.h",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#pragma once\n\n#include \"UObject/UnrealType.h\"\n#include \"UObject/UObjectIterator.h\"\n#include \"Containers/Array.h\"\n#include \"UObject/Object.h\"\n\nclass DLGSYSTEM_API IDlgParser\n{\npublic:\n\tvirtual ~IDlgParser() {}\n\n\t/** Initializes the parser with the specified FilePath. */\n\tvirtual void InitializeParser(const FString& FilePath) = 0;\n\n\t/** Initializes the parser with the specified input string */\n\tvirtual void InitializeParserFromString(const FString& Text) {};\n\n\t/** Is the parsed file valid? */\n\tvirtual bool IsValidFile() const = 0;\n\n\t/**\n\t * Reads all property from the config file.\n\t *\n\t * @param ReferenceClass: UStruct (or UClass) of the TargetObject\n\t * @param TargetObject: pointer to the object instance the function will modify based on the config values\n\t * @param DefaultObjectOuter: Outer used for UObject construction if necessary\n\t */\n\tvirtual void ReadAllProperty(const UStruct* ReferenceClass, void* TargetObject, UObject* DefaultObjectOuter = nullptr) = 0;\n\n\t// bLogVerbose:\n\tbool IsLogVerbose() const { return bLogVerbose; }\n\tvoid SetLogVerbose(bool bValue) { bLogVerbose = bValue; }\n\nprotected:\n\t/**\n\t * Searches the proper not abstract class\n\t *\n\t * @param ParentClass: the class we are looking for has to inherit from this class\n\t * @param Name: the name of the class we are looking for (without engine pretags, e.g. Actor for AActor)\n\t *\n\t * @return the class, or nullptr if it does not exist\n\t */\n\tconst UClass* GetChildClassFromName(const UClass* ParentClass, const FString& Name)\n\t{\n\t\tfor (UClass* Class : StructCache)\n\t\t{\n\t\t\tif (Class->IsChildOf(ParentClass) && Class->GetName() == Name)\n\t\t\t{\n\t\t\t\treturn Class;\n\t\t\t}\n\t\t}\n\n\t\tfor (TObjectIterator<UClass> It; It; ++It)\n\t\t{\n\t\t\tif (It->IsChildOf(ParentClass) && !It->HasAnyClassFlags(CLASS_Abstract) && (*It)->GetName() == Name)\n\t\t\t{\n\t\t\t\tStructCache.Add(*It);\n\t\t\t\treturn *It;\n\t\t\t}\n\t\t}\n\n\t\treturn nullptr;\n\t}\n\n\t/**\n\t * Default way to create new objects\n\t */\n\tstatic UObject* CreateNewUObject(const UClass* StructDefinition, UObject* ObjectOuter)\n\t{\n\t\treturn NewObject<UObject>(!IsValid(ObjectOuter) ? (UObject*)GetTransientPackage() : ObjectOuter,\n\t\t\t\t\t\t\t\t const_cast<UClass*>(StructDefinition), NAME_None, RF_Transactional);\n\t}\n\nprotected:\n\t/** each time a class is read it also cached here, so next time when it has to be found based on name it can be found faster */\n\tTArray<UClass*> StructCache;\n\n\t// Should this class verbose log?\n\tbool bLogVerbose = false;\n};\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystem/Public/IO/IDlgWriter.h",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#pragma once\n\n#include \"CoreMinimal.h\"\n#include \"UObject/UnrealType.h\"\n\n#include \"NYReflectionTypes.h\"\n\n/**\n * The writer will ignore properties by default that are marked DEPRECATED or TRANSIENT, see SkipFlags variable.\n *\n * Limitations:\n * - TSet or TMap with the KeyType as float or structures that have floats, this is very bad you should not do this anyways\n * - limitation for each type you can see inside DlgIoTester.cpp in the Options.\n * - Having an uninitialized UObject property inside a USTRUCT (https://answers.unrealengine.com/questions/566684/editor-crashes-on-startup-if-uninitialized-uproper.html)\n *   THIS CRASHES THE WRITERS so initialize them with nullptr\n *\n * MetaData specifiers:\n *\t\tUnfortunately they only work in editor build\n *\t\tThe class can be used in exported game too, but the MetaData specifiers are ignored\n *\n *\t\t- DlgNoExport: property is skipped - WARNING: should be only used on editor only variables,\n *\t\t\tin non-editor builds you should use the properties from the SkipFlags\n *\t\t- DlgWriteIndex: used on complex (struct/object) arrays, element index is exported as comment\n * \t\t- DlgLinePerItem: used to force primitive container to write each element into a new line (TODO: MAP SUPPORT)\n *\t\t- DlgSaveOnlyReference: UObject path is serialized instead of UObject (can be used for DataAsset like objects stored in content browser)\n *\t\t\tATM IT ONLY WORKS IF IT IS NOT INSIDE A CONTAINER DIRECTLY (can be e.g. inside a struct inside a container tho)\n *\n */\nclass DLGSYSTEM_API IDlgWriter\n{\npublic:\n\tvirtual ~IDlgWriter() {}\n\n\t/** Has to be called before ExportToFile in order to have something to write */\n\tvirtual void Write(const UStruct* StructDefinition, const void* Object) = 0;\n\tvirtual bool ExportToFile(const FString& FileName) = 0;\n\tvirtual const FString& GetAsString() const = 0;\n\n\t/** Can we skip this property from exporting? */\n\tstatic bool CanSkipProperty(const FNYProperty* Property)\n\t{\n\t\tif (!Property)\n\t\t{\n\t\t\treturn true;\n\t\t}\n\n#if WITH_EDITOR\n\t\tif (Property->HasMetaData(TEXT(\"DlgNoExport\")))\n\t\t{\n\t\t\treturn true;\n\t\t}\n#endif\n\t\tif (Property->HasAnyPropertyFlags(SkipFlags))\n\t\t{\n\t\t\treturn true;\n\t\t}\n\n\t\treturn false;\n\t}\n\n\t/** Should  write one item per line for Property? */\n\tstatic bool CanWriteOneLinePerItem(const FNYProperty* Property)\n\t{\n#if WITH_EDITOR\n\t\treturn Property && Property->HasMetaData(TEXT(\"DlgLinePerItem\"));\n#else\n\t\treturn false;\n#endif\n\t}\n\n\t/** Should write the index number for Property? */\n\tstatic bool CanWriteIndex(const FNYProperty* Property)\n\t{\n#if WITH_EDITOR\n\t\treturn Property && Property->HasMetaData(TEXT(\"DlgWriteIndex\"));\n#else\n\t\treturn false;\n#endif\n\t}\n\n\t/** Decides if the path to the object should be serialized, or the object itself */\n\tvirtual bool CanSaveAsReference(const FNYProperty* Property, const UObject* Object)\n\t{\n\t\t// UClass\n\t\tif (Property && Property->IsA<FNYClassProperty>())\n\t\t{\n\t\t\treturn true;\n\t\t}\n\n\t\t// if outer is nullptr we assume this is something from content browser (texture, mesh, etc.)\n\t\tif (IsValid(Object) && Object->IsValidLowLevelFast())\n\t\t{\n\t\t\tif (!IsValid(Object->GetOuter()) || Object->GetOuter()->IsA<UPackage>())\n\t\t\t{\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n#if WITH_EDITOR\n\t\treturn Property && Property->HasMetaData(TEXT(\"DlgSaveOnlyReference\"));\n#else\n\t\treturn false;\n#endif\n\t}\n\n\t// bLogVerbose:\n\tbool IsLogVerbose() const { return bLogVerbose; }\n\tvoid SetLogVerbose(bool bValue) { bLogVerbose = bValue; }\n\nprotected:\n\t/** The properties with these flags set will be ignored from writing. */\n\tstatic constexpr int64 SkipFlags = CPF_Deprecated | CPF_Transient;\n\n\t// Should this class verbose log?\n\tbool bLogVerbose = false;\n};\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystem/Public/Logging/DlgLogger.h",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#pragma once\n\n#include \"CoreMinimal.h\"\n#include \"INYLogger.h\"\n\n\nclass DLGSYSTEM_API FDlgLogger : public INYLogger\n{\n\ttypedef FDlgLogger Self;\n\ttypedef INYLogger Super;\n\nprotected:\n\tFDlgLogger();\n\t\npublic:\n\tvirtual ~FDlgLogger() {}\n\n\t// Sync values with system UDlgSystemSettings values\n\tSelf& SyncWithSettings();\n\t\n\t// Create a new logger\n\tstatic FDlgLogger New() { return Self{}; }\n\tstatic FDlgLogger& Get()\n\t{\n\t\tstatic FDlgLogger Instance;\n\t\treturn Instance;\n\t}\n\n\tstatic void OnStart();\n\tstatic void OnShutdown();\n};\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystem/Public/Logging/INYLogger.h",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#pragma once\n\n#include \"CoreMinimal.h\"\n#include \"Logging/TokenizedMessage.h\"\n#include \"Logging/LogCategory.h\"\n// #include \"INYLogger.generated.h\"\n\nclass FOutputDevice;\nclass APlayerController;\nclass FMessageLogModule;\nclass IMessageLogListing;\n\n\n/**\n * Options for setting up a message log's UI\n */\nstruct FNYMessageLogInitializationOptions\n{\n\tFNYMessageLogInitializationOptions() {}\n\n\t// Whether to show the filters menu\n\tbool bShowFilters = true;\n\n\t// Whether to initially  show the pages widget. Setting this to false will allow the user to manually clear the log.\n\t// If this is not set & NewPage() is called on the log, the pages widget will show itself\n\tbool bShowPages = false;\n\n\t// Whether to allow the user to clear this log.\n\tbool bAllowClear = true;\n\n\t/// Whether to check for duplicate messages & discard them\n\tbool bDiscardDuplicates = false;\n\n\t// The maximum number of pages this log can hold. Pages are managed in a first in, last out manner\n\tuint32 MaxPageCount = 20;\n\n\t// Whether to show this log in the main log window\n\tbool bShowInLogWindow = true;\n};\n\n\nUENUM()\nenum class ENYLoggerLogLevel : uint8\n{\n\tNoLogging = 0,\n\n\t// Kills the program\n\t// TODO use\n\t// Fatal,\n\n\tError,\n\tWarning,\n\n\t// Log\n\tInfo,\n\t//Log = Info,\n\n\t// Verbose\n\tDebug,\n\t//Verbose = Debug,\n\n\t// VeryVerbose\n\t// Used for\n\tTrace,\n\t//VeryVerbose = Trace\n};\n\n\n/**\n * The following output are available:\n * - output log, also file on your filesystem which corresponds to the output log\n * - message log, only available in editor\n * - in the client console, press ~ (tilde) to see it\n * - on screen\n */\nclass DLGSYSTEM_API INYLogger\n{\n\ttypedef INYLogger Self;\nprotected:\n\tINYLogger() {}\n\npublic:\n\tvirtual ~INYLogger() {}\n\n\t// Create a new logger\n\tstatic INYLogger New() { return Self{}; }\n\tstatic INYLogger& Get()\n\t{\n\t\tstatic INYLogger Instance;\n\t\treturn Instance;\n\t}\n\n\t// Exclusive enables\n\tSelf& OnlyEnableClientConsole(APlayerController* PC)\n\t{\n\t\tEnableClientConsole(PC);\n\t\tDisableOnScreen();\n\t\tDisableMessageLog();\n\t\tDisableOutputLog();\n\t\treturn *this;\n\t}\n\tSelf& OnlyEnableOnScreen(bool bInForceEnableScreenMessages = false)\n\t{\n\t\tEnableOnScreen(bInForceEnableScreenMessages);\n\t\tDisableClientConsole();\n\t\tDisableMessageLog();\n\t\tDisableOutputLog();\n\t\treturn *this;\n\t}\n\tSelf& OnlyEnableOutputLog()\n\t{\n\t\tEnableOutputLog();\n\t\tDisableOnScreen();\n\t\tDisableClientConsole();\n\t\tDisableMessageLog();\n\t\treturn *this;\n\t}\n\n\tSelf& OnlyEnableMessageLog(bool bSuppressLoggingToOutputLog = false)\n\t{\n\t\tEnableMessageLog(bSuppressLoggingToOutputLog);\n\t\tDisableOnScreen();\n\t\tDisableClientConsole();\n\t\tDisableOutputLog();\n\t\treturn *this;\n\t}\n\n\n\t//\n\t// Client console\n\t//\n\n\tSelf& EnableClientConsole(APlayerController* PC)\n\t{\n\t\tUseClientConsole(true);\n\t\tSetClientConsolePlayerController(PC);\n\t\treturn *this;\n\t}\n\tSelf& DisableClientConsole() { return UseClientConsole(false); }\n\tSelf& UseClientConsole(bool bValue)\n\t{\n\t\tbClientConsole = bValue;\n\t\treturn *this;\n\t}\n\tSelf& SetClientConsolePlayerController(APlayerController* PC);\n\n\t//\n\t// On screen\n\t//\n\n\t// bInForceEnableScreenMessages - if true, even if the screen messages are disabled we will force display it\n\tSelf& EnableOnScreen(bool bInForceEnableScreenMessages = false) { return UseOnScreen(true, bInForceEnableScreenMessages); }\n\tSelf& DisableOnScreen() { return UseOnScreen(false); }\n\tSelf& UseOnScreen(bool bValue, bool bInForceEnableScreenMessages = false)\n\t{\n\t\tbOnScreen = bValue;\n\t\tbForceEnableScreenMessages = bInForceEnableScreenMessages;\n\t\treturn *this;\n\t}\n\n\t// How long to display the on screen log messages\n\tSelf& SetOnScreenTimeToDisplay(float Seconds)\n\t{\n\t\tScreenLogDisplayTimeSeconds = Seconds;\n\t\treturn *this;\n\t}\n\n\t// Should newer messages appear on top\n\tSelf& SetOnScreenNewerOnTop(bool bValue)\n\t{\n\t\tbScreenNewerOnTop = bValue;\n\t\treturn *this;\n\t}\n\n\t// Clears all the on screen messages\n\tstatic void ClearAllOnScreenLogs();\n\tFORCEINLINE static bool AreAllOnScreenMessagesEnabled() { return GAreScreenMessagesEnabled; }\n\tFORCEINLINE static void SetAreAllOnScreenMessagesEnabled(bool bValue)\n\t{\n\t\tGAreScreenMessagesEnabled = bValue;\n\t}\n\tFORCEINLINE static void DisableAllOnScreenMessages() { SetAreAllOnScreenMessagesEnabled(false); }\n\tFORCEINLINE static void EnableAllOnScreenMessages() { SetAreAllOnScreenMessagesEnabled(true); }\n\n\n\t//\n\t// Output log\n\t//\n\n\tSelf& EnableOutputLog() { return UseOutputLog(true); }\n\tSelf& DisableOutputLog() { return UseOutputLog(false); }\n\tSelf& UseOutputLog(bool bValue)\n\t{\n\t\tbOutputLog = bValue;\n\t\treturn *this;\n\t}\n\n\t// The log category must exist\n\tSelf& SetNoOutputLogCategory() { return SetOutputLogCategory(NAME_None); }\n\tSelf& SetOutputLogCategory(const FLogCategoryBase& NewCategory) { return SetOutputLogCategory(NewCategory.GetCategoryName()); }\n\tSelf& SetOutputLogCategory(FName NewCategory)\n\t{\n\t\tPreviousOutputLogCategory = OutputLogCategory;\n\t\tOutputLogCategory = NewCategory;\n\t\treturn *this;\n\t}\n\n\t// Special case for no logging, aka shipping build\n#if NO_LOGGING\n\tSelf& SetOutputLogCategory(FNoLoggingCategory NoLogging)\n\t{\n\t\tOutputLogCategory = NAME_None;\n\t\tbOutputLog = false;\n\t\treturn *this;\n\t}\n#endif // NO_LOGGING\n\n\t//\n\t// Message log\n\t//\n\n\tSelf& EnableMessageLog(bool bSuppressLoggingToOutputLog = false) { return UseMessageLog(true, bSuppressLoggingToOutputLog); }\n\tSelf& DisableMessageLog() { return UseMessageLog(true); }\n\tSelf& UseMessageLog(bool bValue, bool bInMessageLogMirrorToOutputLog = true)\n\t{\n\t\tbMessageLog = bValue;\n\t\treturn SetMessageLogMirrorToOutputLog(bInMessageLogMirrorToOutputLog);\n\t}\n\n\t// Opens the log for display to the user given certain conditions.\n\t// Set filter with SetOpenMessageLogLevelsHigherThan\n\tSelf& SetMessageLogOpenOnNewMessage(bool bValue)\n\t{\n\t\tbMessageLogOpen = bValue;\n\t\treturn *this;\n\t}\n\n\t// Should we mirror message log messages from this instance to the output log during flush?\n\tSelf& SetMessageLogMirrorToOutputLog(bool bValue)\n\t{\n\t\tbMessageLogMirrorToOutputLog = bValue;\n\t\treturn *this;\n\t}\n\n\tSelf& DisableRedirectMessageLogLevels() { return SetRedirectMessageLogLevelsHigherThan(ENYLoggerLogLevel::NoLogging); }\n\tSelf& SetRedirectMessageLogLevelsHigherThan(ENYLoggerLogLevel AfterOrEqualLevel)\n\t{\n\t\tRedirectMessageLogLevelsHigherThan = AfterOrEqualLevel;\n\t\treturn *this;\n\t}\n\n\t// Only useful if bMessageLogOpen is set to true\n\tSelf& SetOpenMessageLogLevelsHigherThan(ENYLoggerLogLevel AfterOrEqualLevel)\n\t{\n\t\tOpenMessageLogLevelsHigherThan = AfterOrEqualLevel;\n\t\treturn *this;\n\t}\n\n\tstatic bool IsMessageLogNameRegistered(FName LogName);\n\tstatic bool MessageLogUnregisterLogName(FName LogName);\n\tstatic void MessageLogRegisterLogName(FName LogName, const FText& LogLabel, const FNYMessageLogInitializationOptions& InitOptions = {});\n#if WITH_UNREAL_DEVELOPER_TOOLS\n\tstatic TSharedPtr<IMessageLogListing> MessageLogGetLogNameListing(FName LogName);\n#endif // WITH_UNREAL_DEVELOPER_TOOLS\n\tstatic void MessageLogOpenLogName(FName LogName);\n\n\n\t// Registers the new Message log name\n\t// NOTE: Call MessageLogRegisterLogName before calling this\n\tSelf& SetMessageLogName(FName LogName, bool bVerify = true)\n\t{\n#if WITH_UNREAL_DEVELOPER_TOOLS\n\t\tif (bVerify && !IsMessageLogNameRegistered(LogName))\n\t\t{\n\t\t\tWarning(TEXT(\"SetMessageLogName: Failed to register the message log name\"));\n\t\t}\n#endif // WITH_UNREAL_DEVELOPER_TOOLS\n\n\t\tMessageLogName = LogName;\n\t\treturn *this;\n\t}\n\n\t//\n\t// Public accessors\n\t//\n\n\tFORCEINLINE FName GetOutputLogCategory() const { return OutputLogCategory; }\n\tFORCEINLINE bool IsClientConsoleEnabled() const { return bClientConsole; }\n\tFORCEINLINE bool IsOnScreenEnabled() const { return bOnScreen; }\n\tFORCEINLINE bool IsOutputLogEnabled() const { return bOutputLog; }\n\tFORCEINLINE bool IsMessageLogEnabled() const { return bMessageLog; }\n\n\ttemplate <typename FmtType, typename... Types>\n\tvoid Logf(ENYLoggerLogLevel Level, const FmtType& Fmt, Types... Args)\n\t{\n\t\tstatic_assert(TIsArrayOrRefOfType<FmtType, TCHAR>::Value, \"Formatting string must be a TCHAR array.\");\n\t\tstatic_assert(TAnd<TIsValidVariadicFunctionArg<Types>...>::Value, \"Invalid argument(s) passed to INYLogger::Logf\");\n\t\tLogfImplementation(Level, Fmt, Args...);\n\t}\n\n\ttemplate <typename FmtType, typename... Types>\n\tvoid Errorf(const FmtType& Fmt, Types... Args) { Logf(ENYLoggerLogLevel::Error, Fmt, Args...); }\n\n\ttemplate <typename FmtType, typename... Types>\n\tvoid Warningf(const FmtType& Fmt, Types... Args) { Logf(ENYLoggerLogLevel::Warning, Fmt, Args...); }\n\n\ttemplate <typename FmtType, typename... Types>\n\tvoid Infof(const FmtType& Fmt, Types... Args) { Logf(ENYLoggerLogLevel::Info, Fmt, Args...); }\n\n\ttemplate <typename FmtType, typename... Types>\n\tvoid Debugf(const FmtType& Fmt, Types... Args) { Logf(ENYLoggerLogLevel::Debug, Fmt, Args...); }\n\n\ttemplate <typename FmtType, typename... Types>\n\tvoid Tracef(const FmtType& Fmt, Types... Args) { Logf(ENYLoggerLogLevel::Trace, Fmt, Args...); }\n\n\n\t// void Fatal(const ANSICHAR* File, int32 Line, const FString& Message);\n\tvoid Log(ENYLoggerLogLevel Level, const FString& Message);\n\n\t// TODO implement\n\t// void Fatal(const FString& Message) { Log(ENYLoggerLogLevel::Fatal, Message); }\n\tFORCEINLINE void Error(const FString& Message) { Log(ENYLoggerLogLevel::Error, Message); }\n\tFORCEINLINE void Warning(const FString& Message) { Log(ENYLoggerLogLevel::Warning, Message); }\n\tFORCEINLINE void Info(const FString& Message) { Log(ENYLoggerLogLevel::Info, Message); }\n\tFORCEINLINE void Debug(const FString& Message) { Log(ENYLoggerLogLevel::Debug, Message); }\n\tFORCEINLINE void Trace(const FString& Message) { Log(ENYLoggerLogLevel::Trace, Message); }\n\nprotected:\n\tvoid VARARGS LogfImplementation(ENYLoggerLogLevel Level, const TCHAR* Fmt, ...);\n\n#if WITH_UNREAL_DEVELOPER_TOOLS\n\tstatic FMessageLogModule* GetMessageLogModule();\n#endif // WITH_UNREAL_DEVELOPER_TOOLS\n\n\tvirtual void LogScreen(ENYLoggerLogLevel Level, const FString& Message);\n\tvirtual void LogOutputLog(ENYLoggerLogLevel Level, const FString& Message);\n\tvirtual void LogMessageLog(ENYLoggerLogLevel Level, const FString& Message);\n\tvirtual void LogClientConsole(ENYLoggerLogLevel Level, const FString& Message);\n\n\tstatic ELogVerbosity::Type GetUnrealLogTypeForLogLevel(ENYLoggerLogLevel Level)\n\t{\n\t \tswitch (Level)\n\t\t{\n\t\t// case ENYLoggerLogLevel::Fatal:\n\t\t// \treturn ELogVerbosity::Fatal;\n\n\t\tcase ENYLoggerLogLevel::Error:\n\t\t\treturn ELogVerbosity::Error;\n\n\t\tcase ENYLoggerLogLevel::Warning:\n\t\t\treturn ELogVerbosity::Warning;\n\n\t\tcase ENYLoggerLogLevel::Debug:\n\t\t\treturn ELogVerbosity::Verbose;\n\n\t\tcase ENYLoggerLogLevel::Trace:\n\t\t\treturn ELogVerbosity::VeryVerbose;\n\n\t\tdefault:\n\t\t\treturn ELogVerbosity::Log;\n\t\t}\n\t}\n\tstatic EMessageSeverity::Type GetMessageSeverityForLogLevel(ENYLoggerLogLevel Level)\n\t{\n\t\tswitch (Level)\n\t\t{\n\t\t// case ENYLoggerLogLevel::Fatal:\n\t\t// \treturn EMessageSeverity::CriticalError;\n\n\t\tcase ENYLoggerLogLevel::Error:\n\t\t\treturn EMessageSeverity::Error;\n\n\t\tcase ENYLoggerLogLevel::Warning:\n\t\t\treturn EMessageSeverity::Warning;\n\n\t\tdefault:\n\t\t\treturn EMessageSeverity::Info;\n\t\t}\n\t}\n\n\tFColor GetColorForLogLevel(ENYLoggerLogLevel Level) const\n\t{\n\t\tswitch (Level)\n\t\t{\n\t\t// case ENYLoggerLogLevel::Fatal:\n\t\t// \treturn ColorFatal;\n\n\t\tcase ENYLoggerLogLevel::Error:\n\t\t\treturn ColorError;\n\n\t\tcase ENYLoggerLogLevel::Warning:\n\t\t\treturn ColorWarning;\n\n\t\tcase ENYLoggerLogLevel::Debug:\n\t\t\treturn ColorDebug;\n\n\t\tcase ENYLoggerLogLevel::Trace:\n\t\t\treturn ColorTrace;\n\n\t\tdefault:\n\t\t\treturn ColorInfo;\n\t\t}\n\t}\n\tstatic FOutputDevice* GetOutputDeviceFromLogLevel(ENYLoggerLogLevel Level);\n\nprotected:\n\t//\n\t// On screen\n\t//\n\n\t// Output to the screen\n\tbool bOnScreen = false;\n\n\t// Time to stay on screen\n\tfloat ScreenLogDisplayTimeSeconds = 5.f;\n\n\t// How to scale the text for the on screen messages\n\tFVector2D ScreenTextScale = FVector2D::UnitVector;\n\n\t// Newer screen messages appear on top\n\tbool bScreenNewerOnTop = true;\n\n\t// If bScreen == true and this is true, we force enable the screen messages\n\tbool bForceEnableScreenMessages = false;\n\n\t//\n\t// Output log\n\t//\n\n\t// Output to the output log and log file\n\tbool bOutputLog = false;\n\n\t// Category for output log\n\tFName OutputLogCategory = NAME_None;\n\n\t// Useful when temporarily using another category\n\tFName PreviousOutputLogCategory = NAME_None;\n\n\t//\n\t// Message log\n\t//\n\n\t// Output to the message log\n\tbool bMessageLog = true;\n\n\t// Category for message log\n\tFName MessageLogName = TEXT(\"PIE\");\n\n\t// Should we mirror message log messages from this instance to the output log during flush?\n\tbool bMessageLogMirrorToOutputLog = true;\n\n\t// By default the message log does not support debug output, latest is info.\n\t// For the sake of sanity we redirect all levels higher than RedirectMessageLogLevelsHigherThan to the output log\n\t// even if the output log is disabled.\n\t// So that not to output for example debug output to the message log only to the output log.\n\t// NOTE: A value of ENYLoggerLogLevel::NoLogging means no log level will get redirected\n\tENYLoggerLogLevel RedirectMessageLogLevelsHigherThan = ENYLoggerLogLevel::Warning;\n\n\t// Opens the log for display to the user given certain conditions.\n\t// See OpenMessageLogLevelsHigherThan for the filter\n\tbool bMessageLogOpen = true;\n\n\t// All the log levels messages that will open the message log window if bMessageLogOpen is true\n\t// NOTE: A value of  ENYLoggerLogLevel::NoLogging means all log levels will be opened if bMessageLogOpen is true\n\tENYLoggerLogLevel OpenMessageLogLevelsHigherThan = ENYLoggerLogLevel::NoLogging;\n\n\t//\n\t// Client console\n\t//\n\n\t// Output to the dropdown in game console, requires the PlayerController to be set\n\tbool bClientConsole = false;\n\n\t// Required to print to client console\n\tAPlayerController* PlayerController = nullptr;\n\n\t//\n\t// Colors\n\t//\n\t//\n\tFColor ColorFatal = FColor::Red;\n\tFColor ColorError = FColor::Red;\n\tFColor ColorWarning = FColor::Yellow;\n\tFColor ColorInfo = FColor::White;\n\tFColor ColorDebug = FColor::Blue;\n\tFColor ColorTrace = FColor::Cyan;\n};\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystem/Public/NYReflectionHelper.h",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#pragma once\n\n// Protect against inclusion in multiple projects\n#ifndef NY_REFLECTION_HELPER\n#define NY_REFLECTION_HELPER\n\n#include \"CoreMinimal.h\"\n#include \"NYReflectionTypes.h\"\n\nDEFINE_LOG_CATEGORY_STATIC(LogDlgSystemReflectionHelper, All, All)\n\nclass DLGSYSTEM_API FNYReflectionHelper\n{\npublic:\n\n#if ENGINE_MINOR_VERSION >= 25\n\t// From 4.25 UProperties are different\n\ttemplate<typename FieldType>\n\tFORCEINLINE static FieldType* CastProperty(FField* Src)\n\t{\n\t\treturn Src && Src->HasAnyCastFlags(FieldType::StaticClassCastFlagsPrivate()) ? static_cast<FieldType*>(Src) : nullptr;\n\t}\n\t// Const Version\n\ttemplate<typename FieldType>\n\tFORCEINLINE static const FieldType* CastProperty(const FField* Src)\n\t{\n\t\treturn Src && Src->HasAnyCastFlags(FieldType::StaticClassCastFlagsPrivate()) ? static_cast<const FieldType*>(Src) : nullptr;\n\t}\n\n\tFORCEINLINE static FField* GetStructChildren(const UStruct* Struct)\n\t{\n\t\treturn Struct ? Struct->ChildProperties : nullptr;\n\t}\n\n\t// the old removed engine function this code still uses a lot:\n\ttemplate <typename To, typename From>\n\tstatic To* SmartCastProperty(From* Src)\n\t{\n\t\tTo* Result = CastProperty<To>(Src);\n\t\tif (Result == nullptr)\n\t\t{\n\t\t\tFNYArrayProperty* ArrayProp = CastProperty<FNYArrayProperty>(Src);\n\t\t\tif (ArrayProp != nullptr)\n\t\t\t{\n\t\t\t\tResult = CastProperty<To>(ArrayProp->Inner);\n\t\t\t}\n\t\t}\n\t\treturn Result;\n\t}\n\n#else\n\ttemplate <typename To, typename From>\n\tFORCEINLINE static To* CastProperty(From* Src)\n\t{\n\t\treturn TCastImpl<From, To>::DoCast(Src);\n\t}\n\t// Const Version\n\ttemplate <typename To, typename From>\n\tFORCEINLINE static const To* CastProperty(const From* Src)\n\t{\n\t\treturn CastProperty<To>(const_cast<From*>(Src));\n\t}\n\n\tFORCEINLINE static UField* GetStructChildren(const UStruct* Struct)\n\t{\n\t\treturn Struct ? Struct->Children : nullptr;\n\t}\n\n\t// the old removed engine function this code still uses a lot:\n\ttemplate <typename To, typename From>\n\tstatic To* SmartCastProperty(From* Src)\n\t{\n\t\tTo* Result = dynamic_cast<To*>(Src);\n\t\tif (Result == nullptr)\n\t\t{\n\t\t\tFNYArrayProperty* ArrayProp = dynamic_cast<FNYArrayProperty*>(Src);\n\t\t\tif (ArrayProp != nullptr)\n\t\t\t{\n\t\t\t\tResult = dynamic_cast<To*>(ArrayProp->Inner);\n\t\t\t}\n\t\t}\n\t\treturn Result;\n\t}\n#endif // ENGINE_MINOR_VERSION >= 25\n\n\t// Attempts to get the property VariableName from Object\n\ttemplate <typename PropertyType, typename VariableType>\n\tstatic VariableType GetVariable(const UObject* Object, FName VariableName)\n\t{\n\t\tif (!IsValid(Object))\n\t\t{\n\t\t\tUE_LOG(\n\t\t\t\tLogDlgSystemReflectionHelper,\n\t\t\t\tError,\n\t\t\t\tTEXT(\"Failed to get %s %s from Object that is null (not valid)\"),\n\t\t\t\t*PropertyType::StaticClass()->GetName(), *VariableName.ToString()\n\t\t\t);\n\t\t\treturn VariableType{};\n\t\t}\n\n\t\tfor (auto* Property = Object->GetClass()->PropertyLink; Property != nullptr; Property = Property->PropertyLinkNext)\n\t\t{\n\t\t\tconst PropertyType* CastedProperty = CastProperty<PropertyType>(Property);\n\t\t\tif (CastedProperty != nullptr && CastedProperty->GetFName() == VariableName)\n\t\t\t{\n\t\t\t\treturn CastedProperty->GetPropertyValue_InContainer(Object, 0);\n\t\t\t}\n\t\t}\n\n\t\tUE_LOG(\n\t\t\tLogDlgSystemReflectionHelper,\n\t\t\tWarning,\n\t\t\tTEXT(\"Failed to get %s %s from %s - property not found!\"),\n\t\t\t*PropertyType::StaticClass()->GetName(), *VariableName.ToString(), *Object->GetName()\n\t\t);\n\t\treturn VariableType{};\n\t}\n\n\t// Attempts to modify the property VariableName from Object\n\ttemplate <typename PropertyType, typename VariableType>\n\tstatic void ModifyVariable(UObject* Object, FName VariableName, const VariableType Value, bool bDelta)\n\t{\n\t\tif (!IsValid(Object))\n\t\t{\n\t\t\tUE_LOG(\n\t\t\t\tLogDlgSystemReflectionHelper,\n\t\t\t\tError,\n\t\t\t\tTEXT(\"Failed to modify %s %s of Object that is null (not valid)\"),\n\t\t\t\t*PropertyType::StaticClass()->GetName(), *VariableName.ToString()\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\t// Set the variable\n\t\tif (!bDelta)\n\t\t{\n\t\t\tSetVariable<PropertyType>(Object, VariableName, Value);\n\t\t\treturn;\n\t\t}\n\n\t\t// Modify the current variable\n\t\tfor (auto* Property = Object->GetClass()->PropertyLink; Property != nullptr; Property = Property->PropertyLinkNext)\n\t\t{\n\t\t\tconst PropertyType* CastedProperty = CastProperty<PropertyType>(Property);\n\t\t\tif (CastedProperty != nullptr && CastedProperty->GetFName() == VariableName)\n\t\t\t{\n\t\t\t\tconst VariableType OldValue = CastedProperty->GetPropertyValue_InContainer(Object, 0);\n\t\t\t\tCastedProperty->SetPropertyValue_InContainer(Object, OldValue + Value);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tUE_LOG(\n\t\t\tLogDlgSystemReflectionHelper,\n\t\t\tWarning,\n\t\t\tTEXT(\"Failed to modify %s %s from %s - property not found!\"),\n\t\t\t*PropertyType::StaticClass()->GetName(), *VariableName.ToString(), *Object->GetName()\n\t\t);\n\t}\n\n\n\t// Attempts to set the property VariableName from Object\n\ttemplate <typename PropertyType, typename VariableType>\n\tstatic void SetVariable(UObject* Object, FName VariableName, const VariableType NewValue)\n\t{\n\t\tif (!IsValid(Object))\n\t\t{\n\t\t\tUE_LOG(\n\t\t\t\tLogDlgSystemReflectionHelper,\n\t\t\t\tError,\n\t\t\t\tTEXT(\"Failed to set %s %s of Object that is null (not valid)\"),\n\t\t\t\t*PropertyType::StaticClass()->GetName(), *VariableName.ToString()\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\tfor (auto* Property = Object->GetClass()->PropertyLink; Property != nullptr; Property = Property->PropertyLinkNext)\n\t\t{\n\t\t\tconst PropertyType* CastedProperty = CastProperty<PropertyType>(Property);\n\t\t\tif (CastedProperty != nullptr && CastedProperty->GetFName() == VariableName)\n\t\t\t{\n\t\t\t\tCastedProperty->SetPropertyValue_InContainer(Object, NewValue);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tUE_LOG(\n\t\t\tLogDlgSystemReflectionHelper,\n\t\t\tWarning,\n\t\t\tTEXT(\"Failed to set %s %s from %s - property not found!\"),\n\t\t\t*PropertyType::StaticClass()->GetName(), *VariableName.ToString(), *Object->GetName()\n\t\t);\n\t}\n\n\t// Gathers the name of all variables in ParticipantClass (except those properties that belong to the black listed classes) from the type defined by PropertyClass\n\t// If the BlacklistedClasses is empty it will get the default ones from the settings\n\ttemplate <typename ContainerType>\n\tstatic void GetVariableNames(\n\t\tconst UClass* ParticipantClass,\n\t\tconst FNYPropertyClass* PropertyClass,\n\t\tContainerType& OutContainer,\n\t\tconst TArray<UClass*>& BlacklistedClasses\n\t)\n\t{\n\t\tif (!IsValid(ParticipantClass) || !PropertyClass)\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\tauto IsPropertyAtStartOfBlacklistedClass = [&BlacklistedClasses](FNYProperty* CheckProperty) -> bool\n\t\t{\n\t\t\tfor (UClass* Class : BlacklistedClasses)\n\t\t\t{\n\t\t\t\tif (!IsValid(Class))\n\t\t\t\t{\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// CheckProperty is at the start of the blacklisted class\n\t\t\t\tif (Class->PropertyLink == CheckProperty)\n\t\t\t\t{\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn false;\n\t\t};\n\n\t\t// Property link goes from the left to right where on the left there are the most inner child properties and at the right ther are the top most parents.\n\t\tauto* Property = ParticipantClass->PropertyLink;\n\t\twhile (Property != nullptr && !IsPropertyAtStartOfBlacklistedClass(Property))\n\t\t{\n\t\t\tif (Property->GetClass() == PropertyClass)\n\t\t\t{\n\t\t\t\tOutContainer.Add(Property->GetFName());\n\t\t\t}\n\t\t\tProperty = Property->PropertyLinkNext;\n\t\t}\n\t}\n};\n#endif // NY_REFLECTION_HELPER\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystem/Public/NYReflectionTypes.h",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#pragma once\n\n#include \"Launch/Resources/Version.h\"\n\n// Protect against inclusion in multiple projects\n#ifndef NY_REFLECTION_TYPES\n#define NY_REFLECTION_TYPES\n\n#if ENGINE_MINOR_VERSION >= 25\n// 4.25 Reflection system changes\n\ntypedef FFieldClass FNYPropertyClass;\ntypedef FProperty FNYProperty;\n\ntypedef FNumericProperty FNYNumericProperty;\ntypedef FByteProperty FNYByteProperty;\ntypedef FInt8Property FNYInt8Property;\ntypedef FInt16Property FNYInt16Property;\ntypedef FInt16Property FNYInt16Property;\ntypedef FIntProperty FNYIntProperty;\ntypedef FInt64Property FNYInt64Property;\ntypedef FUInt16Property FNYUInt16Property;\ntypedef FUInt32Property FNYUInt32Property;\ntypedef FUInt64Property FNYUInt64Property;\ntypedef FFloatProperty FNYFloatProperty;\ntypedef FDoubleProperty FNYDoubleProperty;\ntypedef FBoolProperty FNYBoolProperty;\n\ntypedef FObjectPropertyBase FNYObjectPropertyBase;\ntypedef FObjectProperty FNYObjectProperty;\ntypedef FWeakObjectProperty FNYWeakObjectProperty;\ntypedef FLazyObjectProperty FNYLazyObjectProperty;\ntypedef FSoftObjectProperty FNYSofObjectProperty;\ntypedef FClassProperty FNYClassProperty;\ntypedef FSoftClassProperty FNYSoftClassProperty;\ntypedef FInterfaceProperty FNYInterfaceProperty;\n\ntypedef FNameProperty FNYNameProperty;\ntypedef FStrProperty FNYStrProperty;\ntypedef FTextProperty FNYTextProperty;\n\ntypedef FArrayProperty FNYArrayProperty;\ntypedef FMapProperty FNYMapProperty;\ntypedef FSetProperty FNYSetProperty;\n\ntypedef FStructProperty FNYStructProperty;\n// typedef FMulticastDelegateProperty FNYMulticastDelegateProperty;\n// typedef FMulticastInlineDelegateProperty FNYMulticastInlineDelegateProperty;\n// typedef FMulticastSparseDelegateProperty FNYMulticastSparseDelegateProperty;\ntypedef FEnumProperty FNYEnumProperty;\n\n#else\n// 4.24 and before where properties where UObjects\n\ntypedef UClass FNYPropertyClass;\ntypedef UProperty FNYProperty;\n\ntypedef UNumericProperty FNYNumericProperty;\ntypedef UByteProperty FNYByteProperty;\ntypedef UInt8Property FNYInt8Property;\ntypedef UInt16Property FNYInt16Property;\ntypedef UInt16Property FNYInt16Property;\ntypedef UIntProperty FNYIntProperty;\ntypedef UInt64Property FNYInt64Property;\ntypedef UUInt16Property FNYUInt16Property;\ntypedef UUInt32Property FNYUInt32Property;\ntypedef UUInt64Property FNYUInt64Property;\ntypedef UFloatProperty FNYFloatProperty;\ntypedef UDoubleProperty FNYDoubleProperty;\ntypedef UBoolProperty FNYBoolProperty;\n\ntypedef UObjectPropertyBase FNYObjectPropertyBase;\ntypedef UObjectProperty FNYObjectProperty;\ntypedef UWeakObjectProperty FNYWeakObjectProperty;\ntypedef ULazyObjectProperty FNYLazyObjectProperty;\ntypedef USoftObjectProperty FNYSofObjectProperty;\ntypedef UClassProperty FNYClassProperty;\ntypedef USoftClassProperty FNYSoftClassProperty;\ntypedef UInterfaceProperty FNYInterfaceProperty;\n\ntypedef UNameProperty FNYNameProperty;\ntypedef UStrProperty FNYStrProperty;\ntypedef UTextProperty FNYTextProperty;\n\ntypedef UArrayProperty FNYArrayProperty;\ntypedef UMapProperty FNYMapProperty;\ntypedef USetProperty FNYSetProperty;\n\ntypedef UStructProperty FNYStructProperty;\n// typedef UMulticastDelegateProperty FNYMulticastDelegateProperty;\n// typedef UMulticastInlineDelegateProperty FNYMulticastInlineDelegateProperty;\n// typedef UMulticastSparseDelegateProperty FNYMulticastSparseDelegateProperty;\ntypedef UEnumProperty FNYEnumProperty;\n\n#endif //  ENGINE_MINOR_VERSION >= 25\n\n\n#endif // NY_REFLECTION_TYPES\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystem/Public/Nodes/DlgNode.h",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#pragma once\n\n#include \"CoreMinimal.h\"\n#include \"Misc/Build.h\"\n#include \"UObject/Object.h\"\n\n#if WITH_EDITOR\n#include \"EdGraph/EdGraphNode.h\"\n#endif\n\n#include \"DlgEdge.h\"\n#include \"DlgCondition.h\"\n#include \"DlgEvent.h\"\n#include \"DlgNodeData.h\"\n#include \"DlgNode.generated.h\"\n\n\nclass UDlgSystemSettings;\nclass UDlgContext;\nclass UDlgNode;\nclass USoundBase;\nclass USoundWave;\nclass UDialogueWave;\nstruct FDlgTextArgument;\nclass UDlgDialogue;\n\n/**\n *  Abstract base class for Dialogue nodes\n *  Depending on the implementation in the child class the dialogue node can contain one or more lines of one or more participants,\n *  or simply some logic to go on in the UDlgNode graph\n */\nUCLASS(BlueprintType, Abstract, EditInlineNew, ClassGroup = \"Dialogue\")\nclass DLGSYSTEM_API UDlgNode : public UObject\n{\n\tGENERATED_BODY()\n\npublic:\n\t//\n\t// Begin UObject Interface.\n\t//\n\n\tvoid Serialize(FArchive& Ar) override;\n\tFString GetDesc() override { return TEXT(\"INVALID DESCRIPTION\"); }\n\tvoid PostLoad() override;\n\tvoid PostInitProperties() override;\n\tvoid PostDuplicate(bool bDuplicateForPIE) override;\n\tvoid PostEditImport() override;\n\n\tstatic void AddReferencedObjects(UObject* InThis, FReferenceCollector& Collector);\n\n#if WITH_EDITOR\n\t/**\n\t * Called when a property on this object has been modified externally\n\t *\n\t * @param PropertyChangedEvent the property that was modified\n\t */\n\tvoid PostEditChangeProperty(FPropertyChangedEvent& PropertyChangedEvent) override;\n\n\t/**\n\t * This alternate version of PostEditChange is called when properties inside structs are modified.  The property that was actually modified\n\t * is located at the tail of the list.  The head of the list of the FNYStructProperty member variable that contains the property that was modified.\n\t */\n\tvoid PostEditChangeChainProperty(struct FPropertyChangedChainEvent& PropertyChangedEvent) override;\n\n\t//\n\t// Begin own function\n\t//\n\n\t// Used internally by the Dialogue editor:\n\tvirtual FString GetNodeTypeString() const { return TEXT(\"INVALID\"); }\n#endif //WITH_EDITOR\n\n#if WITH_EDITOR\n\tvoid SetGraphNode(UEdGraphNode* InNode) { GraphNode = InNode; }\n\tvoid ClearGraphNode() { GraphNode = nullptr; }\n\tUEdGraphNode* GetGraphNode() const { return GraphNode; }\n#endif\n\n\t/** Broadcasts whenever a property of this dialogue changes. */\n\tDECLARE_EVENT_TwoParams(UDlgNode, FDialogueNodePropertyChanged, const FPropertyChangedEvent& /* PropertyChangedEvent */, int32 /* EdgeIndexChanged */);\n\tFDialogueNodePropertyChanged OnDialogueNodePropertyChanged;\n\n\tvirtual bool HandleNodeEnter(UDlgContext& Context, TSet<const UDlgNode*> NodesEnteredWithThisStep);\n\tvirtual bool ReevaluateChildren(UDlgContext& Context, TSet<const UDlgNode*> AlreadyEvaluated);\n\n\tvirtual bool CheckNodeEnterConditions(const UDlgContext& Context, TSet<const UDlgNode*> AlreadyVisitedNodes) const;\n\tbool HasAnySatisfiedChild(const UDlgContext& Context, TSet<const UDlgNode*> AlreadyVisitedNodes) const;\n\n\tvirtual bool OptionSelected(int32 OptionIndex, UDlgContext& Context);\n\n\t//\n\t// Getters/Setters:\n\t//\n\n\tUFUNCTION(BlueprintPure, Category = \"Dialogue|Node\")\n\tFGuid GetGUID() const { return NodeGUID; }\n\n\tUFUNCTION(BlueprintPure, Category = \"Dialogue|Node\")\n\tbool HasGUID() const { return NodeGUID.IsValid(); }\n\n\tvoid RegenerateGUID()\n\t{\n\t\tNodeGUID = FGuid::NewGuid();\n\t\tModify();\n\t}\n\n\t//\n\t// For the ParticipantName\n\t//\n\n\tUFUNCTION(BlueprintPure, Category = \"Dialogue|Node\")\n\tvirtual FName GetNodeParticipantName() const { return OwnerName; }\n\n\tvirtual void SetNodeParticipantName(FName InName) { OwnerName = InName; }\n\n\t//\n\t// For the EnterConditions\n\t//\n\n\tUFUNCTION(BlueprintPure, Category = \"Dialogue|Node\")\n\tvirtual bool HasAnyEnterConditions() const { return GetNodeEnterConditions().Num() > 0; }\n\n\tUFUNCTION(BlueprintPure, Category = \"Dialogue|Node\")\n\tvirtual const TArray<FDlgCondition>& GetNodeEnterConditions() const { return EnterConditions; }\n\n\tvirtual void SetNodeEnterConditions(const TArray<FDlgCondition>& InEnterConditions) { EnterConditions = InEnterConditions; }\n\n\t// Gets the mutable enter condition at location EnterConditionIndex.\n\tvirtual FDlgCondition* GetMutableEnterConditionAt(int32 EnterConditionIndex)\n\t{\n\t\tcheck(EnterConditions.IsValidIndex(EnterConditionIndex));\n\t\treturn &EnterConditions[EnterConditionIndex];\n\t}\n\n\t//\n\t// For the EnterEvents\n\t//\n\n\tUFUNCTION(BlueprintPure, Category = \"Dialogue|Node\")\n\tvirtual bool HasAnyEnterEvents() const { return GetNodeEnterEvents().Num() > 0; }\n\n\tUFUNCTION(BlueprintPure, Category = \"Dialogue|Node\")\n\tvirtual const TArray<FDlgEvent>& GetNodeEnterEvents() const { return EnterEvents; }\n\n\tvirtual void SetNodeEnterEvents(const TArray<FDlgEvent>& InEnterEvents) { EnterEvents = InEnterEvents; }\n\n\t//\n\t// For the Children\n\t//\n\n\t/// Gets this nodes children (edges) as a const/mutable array\n\n\tUFUNCTION(BlueprintPure, Category = \"Dialogue|Node\")\n\tvirtual const TArray<FDlgEdge>& GetNodeChildren() const { return Children; }\n\tvirtual void SetNodeChildren(const TArray<FDlgEdge>& InChildren) { Children = InChildren; }\n\n\tUFUNCTION(BlueprintPure, Category = \"Dialogue|Node\")\n\tvirtual int32 GetNumNodeChildren() const { return Children.Num(); }\n\n\tUFUNCTION(BlueprintPure, Category = \"Dialogue|Node\")\n\tvirtual const FDlgEdge& GetNodeChildAt(int32 EdgeIndex) const { return Children[EdgeIndex]; }\n\n\t// Adds an Edge to the end of the Children Array.\n\tvirtual void AddNodeChild(const FDlgEdge& InChild) { Children.Add(InChild); }\n\n\t// Removes the Edge at the specified EdgeIndex location.\n\tvirtual void RemoveChildAt(int32 EdgeIndex)\n\t{\n\t\tcheck(Children.IsValidIndex(EdgeIndex));\n\t\tChildren.RemoveAt(EdgeIndex);\n\t}\n\n\t// Removes all edges/children\n\tvirtual void RemoveAllChildren() { Children.Empty(); }\n\n\t// Gets the mutable edge/child at location EdgeIndex.\n\tvirtual FDlgEdge* GetSafeMutableNodeChildAt(int32 EdgeIndex)\n\t{\n\t\tcheck(Children.IsValidIndex(EdgeIndex));\n\t\treturn &Children[EdgeIndex];\n\t}\n\n\t// Unsafe version, can be null\n\tvirtual FDlgEdge* GetMutableNodeChildAt(int32 EdgeIndex)\n\t{\n\t\treturn Children.IsValidIndex(EdgeIndex) ? &Children[EdgeIndex] : nullptr;\n\t}\n\n\t// Gets the mutable Edge that corresponds to the provided TargetIndex or nullptr if nothing was found.\n\tvirtual FDlgEdge* GetMutableNodeChildForTargetIndex(int32 TargetIndex);\n\n\t// Gets all the edges (children) indices that DO NOT have a valid TargetIndex (is negative).\n\tconst TArray<int32> GetNodeOpenChildren_DEPRECATED() const;\n\n\t// Gathers associated participants, they are only added to the array if they are not yet there\n\tvirtual void GetAssociatedParticipants(TArray<FName>& OutArray) const;\n\n\t// Updates the value of the texts from the default values or the remappings (if any)\n\tvirtual void UpdateTextsValuesFromDefaultsAndRemappings(\n\t\tconst UDlgSystemSettings& Settings, bool bEdges, bool bUpdateGraphNode = true\n\t);\n\n\t// Updates the namespace and key of all the texts depending on the settings\n\tvirtual void UpdateTextsNamespacesAndKeys(const UDlgSystemSettings& Settings, bool bEdges, bool bUpdateGraphNode = true);\n\n\t// Rebuilds ConstructedText\n\tvirtual void RebuildTextArguments(bool bEdges, bool bUpdateGraphNode = true);\n\tvirtual void RebuildTextArgumentsFromPreview(const FText& Preview) {}\n\n\t// Constructs the ConstructedText.\n\tvirtual void RebuildConstructedText(const UDlgContext& Context) {}\n\n\t// Gets the text arguments for this Node (if any). Used for FText::Format\n\tUFUNCTION(BlueprintPure, Category = \"Dialogue|Node\")\n\tvirtual const TArray<FDlgTextArgument>& GetTextArguments() const\n\t{\n\t\tstatic TArray<FDlgTextArgument> EmptyArray;\n\t\treturn EmptyArray;\n\t};\n\n\t// Gets the Text of this Node. This can be the final formatted string.\n\tUFUNCTION(BlueprintPure, Category = \"Dialogue|Node\")\n\tvirtual const FText& GetNodeText() const { return FText::GetEmpty(); }\n\n\tUFUNCTION(BlueprintPure, Category = \"Dialogue|Node\")\n\tvirtual bool GetCheckChildrenOnEvaluation() const { return bCheckChildrenOnEvaluation; }\n\n\t/**\n\t * Gets the Raw unformatted Text of this Node. Usually the same as GetNodeText but in case the node supports formatted string this\n\t * is the raw form with all the arguments intact. To get the text arguments call GetTextArguments.\n\t */\n\tUFUNCTION(BlueprintPure, Category = \"Dialogue|Node\")\n\tvirtual const FText& GetNodeUnformattedText() const { return GetNodeText(); }\n\n\t// Gets the voice of this Node as a SoundWave.\n\tUFUNCTION(BlueprintPure, Category = \"Dialogue|Node\")\n\tUSoundWave* GetNodeVoiceSoundWave() const;\n\n\t// Gets the voice of this Node as a SoundWave.\n\tUFUNCTION(BlueprintPure, Category = \"Dialogue|Node\")\n\tvirtual USoundBase* GetNodeVoiceSoundBase() const { return nullptr; }\n\n\t// Gets the voice of this Node as a DialogueWave. Only the first Dialogue context in the wave should be used.\n\tUFUNCTION(BlueprintPure, Category = \"Dialogue|Node\")\n\tvirtual UDialogueWave* GetNodeVoiceDialogueWave() const { return nullptr; }\n\n\t// Gets the speaker state ordered to this node (can be used e.g. for icon selection)\n\tUFUNCTION(BlueprintPure, Category = \"Dialogue|Node\")\n\tvirtual FName GetSpeakerState() const { return NAME_None; }\n\tvirtual void AddAllSpeakerStatesIntoSet(TSet<FName>& OutStates) const {};\n\n\t// Gets the generic data asset of this Node.\n\tUFUNCTION(BlueprintPure, Category = \"Dialogue|Node\")\n\tvirtual UObject* GetNodeGenericData() const { return nullptr; }\n\n\tUFUNCTION(BlueprintPure, Category = \"Dialogue|Node\")\n\tvirtual UDlgNodeData* GetNodeData() const { return nullptr; }\n\n\t// Helper method to get directly the Dialogue (which is our parent)\n\tUDlgDialogue* GetDialogue() const;\n\n\t// Helper functions to get the names of some properties. Used by the DlgSystemEditor module.\n\tstatic FName GetMemberNameOwnerName() { return GET_MEMBER_NAME_CHECKED(UDlgNode, OwnerName); }\n\tstatic FName GetMemberNameCheckChildrenOnEvaluation() { return GET_MEMBER_NAME_CHECKED(UDlgNode, bCheckChildrenOnEvaluation); }\n\tstatic FName GetMemberNameEnterConditions() { return GET_MEMBER_NAME_CHECKED(UDlgNode, EnterConditions); }\n\tstatic FName GetMemberNameEnterEvents() { return GET_MEMBER_NAME_CHECKED(UDlgNode, EnterEvents); }\n\tstatic FName GetMemberNameChildren() { return GET_MEMBER_NAME_CHECKED(UDlgNode, Children); }\n\tstatic FName GetMemberNameGUID() { return GET_MEMBER_NAME_CHECKED(UDlgNode, NodeGUID); }\n\n\t// Syncs the GraphNode Edges with our edges\n\tvoid UpdateGraphNode();\n\n\t// Fires this Node enter Events\n\tvoid FireNodeEnterEvents(UDlgContext& Context);\n\nprotected:\n#if WITH_EDITORONLY_DATA\n\t// Node's Graph representation, used to get position.\n\tUPROPERTY(Meta = (DlgNoExport))\n\tUEdGraphNode* GraphNode = nullptr;\n\n\t// Used to build the change event and broadcast it\n\tint32 BroadcastPropertyEdgeIndexChanged = INDEX_NONE;\n#endif // WITH_EDITORONLY_DATA\n\n\t// Name of a participant (speaker) associated with this node.\n\tUPROPERTY(EditAnywhere, Category = \"Dialogue|Node\", Meta = (DisplayName = \"Participant Name\"))\n\tFName OwnerName;\n\n\t/**\n\t *  If it is set the node is only satisfied if at least one of its children is\n\t *  Should not be used if entering this node can modify the condition results of its children.\n\t */\n\tUPROPERTY(EditAnywhere, Category = \"Dialogue|Node\")\n\tbool bCheckChildrenOnEvaluation = false;\n\n\t// Conditions necessary to enter this node\n\tUPROPERTY(EditAnywhere, Category = \"Dialogue|Node\")\n\tTArray<FDlgCondition> EnterConditions;\n\n\t// Events fired when the node is reached in the dialogue\n\tUPROPERTY(EditAnywhere, Category = \"Dialogue|Node\")\n\tTArray<FDlgEvent> EnterEvents;\n\n\t// The Unique identifier for each Node. This is much safer than a Node Index.\n\t// Compile/Save Asset to generate this\n\tUPROPERTY(VisibleAnywhere, Category = \"Dialogue|Node\", AdvancedDisplay)\n\tFGuid NodeGUID;\n\t// NOTE: For some reason if this is named GUID the details panel does not work all the time for this, wtf unreal?\n\n\t// Edges that point to Children of this Node\n\tUPROPERTY(VisibleAnywhere, EditFixedSize, AdvancedDisplay, Category = \"Dialogue|Node\")\n\tTArray<FDlgEdge> Children;\n};\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystem/Public/Nodes/DlgNode_End.h",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#pragma once\n\n#include \"CoreMinimal.h\"\n\n#include \"Nodes/DlgNode.h\"\n\n#include \"DlgNode_End.generated.h\"\n\n\n/**\n * Node ending the Dialogue.\n * Does not have text, if it is entered the Dialogue is over.\n * Events and enter conditions are taken into account.\n */\nUCLASS(BlueprintType, ClassGroup = \"Dialogue\")\nclass DLGSYSTEM_API UDlgNode_End : public UDlgNode\n{\n\tGENERATED_BODY()\n\npublic:\n\t// Begin UObject Interface.\n\n\t/** @return a one line description of an object. */\n\tFString GetDesc() override;\n\n\t// Begin UDlgNode Interface.\n\tbool ReevaluateChildren(UDlgContext& Context, TSet<const UDlgNode*> AlreadyEvaluated) override { return false; }\n\tbool OptionSelected(int32 OptionIndex, UDlgContext& Context) override { return false; }\n\n#if WITH_EDITOR\n\tFString GetNodeTypeString() const override { return TEXT(\"End\"); }\n#endif\n};\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystem/Public/Nodes/DlgNode_Selector.h",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#pragma once\n#include \"CoreMinimal.h\"\n\n#include \"Nodes/DlgNode.h\"\n\n#include \"DlgNode_Selector.generated.h\"\n\n\nUENUM(BlueprintType)\nenum class EDlgNodeSelectorType : uint8\n{\n\t// As soon as it is entered it selects its first satisfied child.\n\tFirst\t\tUMETA(DisplayName = \"First\"),\n\n\t// As soon as it is entered it selects a satisfied child randomly.\n\tRandom\t\tUMETA(DisplayName = \"Random\"),\n};\n\n/**\n * Node without text. Selector of child depends on the type.\n * It should have at least one (satisfied child), HandleNodeEnter returns false and the Dialogue is terminated otherwise.\n */\nUCLASS(BlueprintType, ClassGroup = \"Dialogue\")\nclass DLGSYSTEM_API UDlgNode_Selector : public UDlgNode\n{\n\tGENERATED_BODY()\n\npublic:\n\tUDlgNode_Selector() { bCheckChildrenOnEvaluation = true; }\n\n\t// @return a one line description of an object.\n\tFString GetDesc() override\n\t{\n\t\tswitch (SelectorType)\n\t\t{\n\t\tcase EDlgNodeSelectorType::First:\n\t\t\treturn TEXT(\"Node without text and as soon as entered it selects its first satisfied child.\\n It should have at least one (satisfied child), otherwise the Dialogue is terminated.\");\n\t\tcase EDlgNodeSelectorType::Random:\n\t\t\treturn TEXT(\"Node without text and as soon as entered it selects a satisfied child randomly.\\nIt should have at least one (satisfied child), otherwise the Dialogue is terminated.\");\n\t\tdefault:\n\t\t\treturn TEXT(\"UNHANDLED\");\n\t\t}\n\t}\n\n\t//\n\t// Begin UDlgNode Interface.\n\t//\n\n\tbool HandleNodeEnter(UDlgContext& Context, TSet<const UDlgNode*> NodesEnteredWithThisStep) override;\n\n#if WITH_EDITOR\n\tFString GetNodeTypeString() const override { return TEXT(\"Selector\"); }\n#endif\n\n\t//\n\t// Begin own functions\n\t//\n\n\t// Gets the Selector Type\n\tUFUNCTION(BlueprintPure, Category = \"Dialogue|Node\")\n\tEDlgNodeSelectorType GetSelectorType() const { return SelectorType; }\n\n\t// Sets the Selector Type\n\tvoid SetSelectorType(EDlgNodeSelectorType InType) { SelectorType = InType; }\n\n\t// Helper functions to get the names of some properties. Used by the DlgSystemEditor module.\n\tstatic FName GetMemberNameSelectorType() { return GET_MEMBER_NAME_CHECKED(UDlgNode_Selector, SelectorType); }\n\nprotected:\n\t// Defines the type of selector this node represents\n\tUPROPERTY(EditAnywhere, Category = \"Dialogue|Node\")\n\tEDlgNodeSelectorType SelectorType = EDlgNodeSelectorType::First;\n};\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystem/Public/Nodes/DlgNode_Speech.h",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#pragma once\n\n#include \"Nodes/DlgNode.h\"\n#include \"DlgTextArgument.h\"\n#include \"DlgNode_Speech.generated.h\"\n\nclass USoundWave;\nclass UDialogueWave;\nstruct FDlgTextArgument;\n\n/**\n * Normal dialogue node - someone says something.\n */\nUCLASS(BlueprintType, ClassGroup = \"Dialogue\")\nclass DLGSYSTEM_API UDlgNode_Speech : public UDlgNode\n{\n\tGENERATED_BODY()\n\npublic:\n\t// Begin UObject Interface.\n\tFString GetDesc() override\n\t{\n\t\tif (bIsVirtualParent)\n\t\t{\n\t\t\treturn TEXT(\"Virtual Parent Node. Acts like a fake parent (proxy) to other child nodes. (aka makes it get the grandchildren)\\nOn revaluate children, it does not get the direct children but the children of the first satisfied direct child node (grandchildren).\\nIt should have at least one satisified child otherwise the Dialogue is terminated.\");\n\t\t}\n\n\t\treturn TEXT(\"Normal dialogue node - someone says something.\");\n\t}\n\n#if WITH_EDITOR\n\t/**\n\t * Called when a property on this object has been modified externally\n\t *\n\t * @param PropertyChangedEvent the property that was modified\n\t */\n\tvoid PostEditChangeProperty(FPropertyChangedEvent& PropertyChangedEvent) override;\n#endif\n\n\t//\n\t// Begin UDlgNode Interface.\n\t//\n\n\tbool HandleNodeEnter(UDlgContext& Context, TSet<const UDlgNode*> NodesEnteredWithThisStep) override;\n\tbool ReevaluateChildren(UDlgContext& Context, TSet<const UDlgNode*> AlreadyEvaluated) override;\n\tvoid GetAssociatedParticipants(TArray<FName>& OutArray) const override;\n\n\tvoid UpdateTextsValuesFromDefaultsAndRemappings(const UDlgSystemSettings& Settings, bool bEdges, bool bUpdateGraphNode = true) override;\n\tvoid UpdateTextsNamespacesAndKeys(const UDlgSystemSettings& Settings, bool bEdges, bool bUpdateGraphNode = true) override;\n\tvoid RebuildConstructedText(const UDlgContext& Context) override;\n\tvoid RebuildTextArguments(bool bEdges, bool bUpdateGraphNode = true) override\n\t{\n\t\tSuper::RebuildTextArguments(bEdges, bUpdateGraphNode);\n\t\tFDlgTextArgument::UpdateTextArgumentArray(Text, TextArguments);\n\t}\n\tvoid RebuildTextArgumentsFromPreview(const FText& Preview) override { FDlgTextArgument::UpdateTextArgumentArray(Preview, TextArguments); }\n\tconst TArray<FDlgTextArgument>& GetTextArguments() const override { return TextArguments; };\n\n\t// Getters:\n\tconst FText& GetNodeText() const override\n\t{\n\t\tif (TextArguments.Num() > 0 && !ConstructedText.IsEmpty())\n\t\t{\n\t\t\treturn ConstructedText;\n\t\t}\n\t\treturn Text;\n\t}\n\tconst FText& GetNodeUnformattedText() const override { return Text; }\n\tUDlgNodeData* GetNodeData() const override { return NodeData; }\n\n\t// stuff we have to keep for legacy reason (but would make more sense to remove them from the plugin as they could be created in NodeData):\n\tFName GetSpeakerState() const override { return SpeakerState; }\n\tUSoundBase* GetNodeVoiceSoundBase() const override { return VoiceSoundWave; }\n\tUDialogueWave* GetNodeVoiceDialogueWave() const override { return VoiceDialogueWave; }\n\tUObject* GetNodeGenericData() const override { return GenericData; }\n\n\tvoid AddAllSpeakerStatesIntoSet(TSet<FName>& OutStates) const override { OutStates.Add(SpeakerState); }\n\n#if WITH_EDITOR\n\tFString GetNodeTypeString() const override { return bIsVirtualParent ? TEXT(\"Virtual Parent\") : TEXT(\"Speech\"); }\n#endif\n\n\t//\n\t// Begin own functions.\n\t//\n\n\t// Is this node a virtual parent?\n\tUFUNCTION(BlueprintPure, Category = \"Dialogue|Node\")\n\tvirtual bool IsVirtualParent() const { return bIsVirtualParent; }\n\n\t// Sets the virtual parent status\n\tvirtual void SetIsVirtualParent(bool bValue) { bIsVirtualParent = bValue; }\n\n\t// Sets the RawNodeText of the Node and rebuilds the constructed text\n\tvirtual void SetNodeText(const FText& InText)\n\t{\n\t\tText = InText;\n\t\tRebuildTextArguments(false);\n\t}\n\n\tvoid SetNodeData(UDlgNodeData* InNodeData) { NodeData = InNodeData; }\n\tvoid SetSpeakerState(FName InSpeakerState) { SpeakerState = InSpeakerState; }\n\tvoid SetVoiceSoundBase(USoundBase* InVoiceSoundBase) { VoiceSoundWave = InVoiceSoundBase; }\n\tvoid SetVoiceDialogueWave(UDialogueWave* InVoiceDialogueWave) { VoiceDialogueWave = InVoiceDialogueWave; }\n\tvoid SetGenericData(UObject* InGenericData) { GenericData = InGenericData; }\n\n\t// Helper functions to get the names of some properties. Used by the DlgSystemEditor module.\n\tstatic FName GetMemberNameText() { return GET_MEMBER_NAME_CHECKED(UDlgNode_Speech, Text); }\n\tstatic FName GetMemberNameTextArguments() { return GET_MEMBER_NAME_CHECKED(UDlgNode_Speech, TextArguments); }\n\tstatic FName GetMemberNameNodeData() { return GET_MEMBER_NAME_CHECKED(UDlgNode_Speech, NodeData); }\n\tstatic FName GetMemberNameVoiceSoundWave() { return GET_MEMBER_NAME_CHECKED(UDlgNode_Speech, VoiceSoundWave); }\n\tstatic FName GetMemberNameVoiceDialogueWave() { return GET_MEMBER_NAME_CHECKED(UDlgNode_Speech, VoiceDialogueWave); }\n\tstatic FName GetMemberNameGenericData() { return GET_MEMBER_NAME_CHECKED(UDlgNode_Speech, GenericData); }\n\tstatic FName GetMemberNameSpeakerState() { return GET_MEMBER_NAME_CHECKED(UDlgNode_Speech, SpeakerState); }\n\tstatic FName GetMemberNameIsVirtualParent() { return GET_MEMBER_NAME_CHECKED(UDlgNode_Speech, bIsVirtualParent); }\n\tstatic FName GetMemberNameVirtualParentFireDirectChildEnterEvents() { return GET_MEMBER_NAME_CHECKED(UDlgNode_Speech, bVirtualParentFireDirectChildEnterEvents); }\n\nprotected:\n\t// Make this Node act like a fake parent (proxy) to other child nodes (makes it get the granchildren).\n\t// On reevaluate children, it does not get the direct children but the children of the first satisfied direct child node (grandchildren).\n\t//\n\t// NOTE: It should have at least one satisfied child otherwise the Dialogue is terminated.\n\t// NOTE: The first satisfied direct child will be added to the visited history when this node is entered.\n\t// NOTE: Most Common usage for this is to make loops.\n\tUPROPERTY(EditAnywhere, Category = \"Dialogue|Node\")\n\tbool bIsVirtualParent = false;\n\n\t// If true the first satisfied Direct Child of this Virtual Parent Node will fire its Enter Events after this node is entered (and fires its enter events).\n\tUPROPERTY(EditAnywhere, Category = \"Dialogue|Node\")\n\tbool bVirtualParentFireDirectChildEnterEvents = true;\n\n\t// Text that will appear when this node participant name speaks to someone else.\n\t// If you want replaceable portions inside your Text nodes just add {identifier} inside it and set the value it should have at runtime.\n\tUPROPERTY(EditAnywhere, Category = \"Dialogue|Node\", Meta = (MultiLine = true))\n\tFText Text;\n\n\t// If you want replaceable portions inside your Text nodes just add {identifier} inside it and set the value it should have at runtime.\n\tUPROPERTY(EditAnywhere, EditFixedSize, Category = \"Dialogue|Node\")\n\tTArray<FDlgTextArgument> TextArguments;\n\n\t// State of the speaker attached to this node. Passed to the GetParticipantIcon function.\n\tUPROPERTY(EditAnywhere, Category = \"Dialogue|Node\")\n\tFName SpeakerState;\n\n\t// User Defined Custom Node data you can customize yourself with your own data types\n\t//\n\t// Create a new Blueprint derived from DlgNodeData (or DlgNodeDataHideCategories)\n\tUPROPERTY(EditAnywhere, Instanced, Category = \"Dialogue|Node\")\n\tUDlgNodeData* NodeData = nullptr;\n\n\t// Voice attached to this node. The Sound Wave variant.\n\t// NOTE: You should probably use the NodeData\n\tUPROPERTY(EditAnywhere, Category = \"Dialogue|Node\", Meta = (DlgSaveOnlyReference))\n\tUSoundBase* VoiceSoundWave = nullptr;\n\n\t// Voice attached to this node. The Dialogue Wave variant. Only the first wave from the dialogue context array should be used.\n\t// NOTE: You should probably use the NodeData\n\tUPROPERTY(EditAnywhere, Category = \"Dialogue|Node\", Meta = (DlgSaveOnlyReference))\n\tUDialogueWave* VoiceDialogueWave = nullptr;\n\n\t// Any generic object you would like\n\t// NOTE: You should probably use the NodeData\n\tUPROPERTY(EditAnywhere, Category = \"Dialogue|Node\", Meta = (DlgSaveOnlyReference))\n\tUObject* GenericData = nullptr;\n\n\t// Constructed at runtime from the original text and the arguments if there is any.\n\tFText ConstructedText;\n\n\tint32 VirtualParentFirstSatisfiedDirectChildIndex = INDEX_NONE;\n};\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystem/Public/Nodes/DlgNode_SpeechSequence.h",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#pragma once\n\n#include \"Nodes/DlgNode.h\"\n#include \"DlgSystemSettings.h\"\n#include \"DlgNode_SpeechSequence.generated.h\"\n\nclass USoundWave;\nclass USoundBase;\nclass UDialogueWave;\n\nUSTRUCT(BlueprintType)\nstruct DLGSYSTEM_API FDlgSpeechSequenceEntry\n{\n\tGENERATED_USTRUCT_BODY()\n\t// NOTE: don't create a default constructor here, because otherwise if will fail because some CDO BS after you convert nodes to speech sequence\n\npublic:\n\t// The Participant Name (speaker) associated with this speech entry.\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = \"Dialogue|Node\", Meta = (DisplayName = \"Participant Name\"))\n\tFName Speaker;\n\n\t// Text that will appear when this node participant name speaks to someone else.\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = \"Dialogue|Node\", Meta = (MultiLine = true))\n\tFText Text;\n\n\t// Text that will appear when you want to continue down this edge to the next conversation. Usually \"Next\".\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = \"Dialogue|Node\", Meta = (MultiLine = true))\n\tFText EdgeText;\n\n\t// State of the speaker attached to the entry. Passed to the GetParticipantIcon function.\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = \"Dialogue|Node\")\n\tFName SpeakerState;\n\n\t// Node data that you can customize yourself with your own data types\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Instanced, Category = \"Dialogue|Node\")\n\tUDlgNodeData* NodeData = nullptr;\n\n\t// Voice attached to this node. The Sound Wave variant.\n\t// NOTE: You should probably use the NodeData\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = \"Dialogue|Node\", Meta = (DlgSaveOnlyReference))\n\tUSoundBase* VoiceSoundWave = nullptr;\n\n\t// Voice attached to this node. The Dialogue Wave variant. Only the first wave from the dialogue context array should be used.\n\t// NOTE: You should probably use the NodeData\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = \"Dialogue|Node\", Meta = (DlgSaveOnlyReference))\n\tUDialogueWave* VoiceDialogueWave = nullptr;\n\n\t// Any generic object you would like\n\t// NOTE: You should probably use the NodeData\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = \"Dialogue|Node\", Meta = (DlgSaveOnlyReference))\n\tUObject* GenericData = nullptr;\n};\n\n\n/**\n * Sequence of speeches - each can have a different speaker independently from the node owner.\n * The node stays active and proceeds one step in the SpeechSequence (internal) array until everyone said everything.\n */\nUCLASS(BlueprintType, ClassGroup = \"Dialogue\")\nclass DLGSYSTEM_API UDlgNode_SpeechSequence : public UDlgNode\n{\n\tGENERATED_BODY()\n\npublic:\n\t// Begin UObject Interface.\n\t/** @return a one line description of an object. */\n\tFString GetDesc() override\n\t{\n\t\treturn TEXT(\"Sequence of speeches - each can have a different speaker independently from the node owner.\\nThe node stays active and proceeds one step in the SpeechSequence (internal) array until everyone said everything.\");\n\t}\n#if WITH_EDITOR\n\tvoid PostEditChangeProperty(FPropertyChangedEvent& PropertyChangedEvent) override;\n#endif\n\n\t// Begin UDlgNode interface\n\tvoid UpdateTextsValuesFromDefaultsAndRemappings(const UDlgSystemSettings& Settings, bool bEdges, bool bUpdateGraphNode = true) override;\n\tvoid UpdateTextsNamespacesAndKeys(const UDlgSystemSettings& Settings, bool bEdges, bool bUpdateGraphNode = true) override;\n\tbool HandleNodeEnter(UDlgContext& Context, TSet<const UDlgNode*> NodesEnteredWithThisStep) override;\n\tbool ReevaluateChildren(UDlgContext& Context, TSet<const UDlgNode*> AlreadyEvaluated) override;\n\tbool OptionSelected(int32 OptionIndex, UDlgContext& Context) override;\n\n\t// Getters\n\tconst FText& GetNodeText() const override;\n\tUDlgNodeData* GetNodeData() const override;\n\tUSoundBase* GetNodeVoiceSoundBase() const override;\n\tUDialogueWave* GetNodeVoiceDialogueWave() const override;\n\tFName GetSpeakerState() const override;\n\tvoid AddAllSpeakerStatesIntoSet(TSet<FName>& OutStates) const override;\n\tUObject* GetNodeGenericData() const override;\n\tFName GetNodeParticipantName() const override;\n\tvoid GetAssociatedParticipants(TArray<FName>& OutArray) const override;\n\n#if WITH_EDITOR\n\tFString GetNodeTypeString() const override { return TEXT(\"Speech Sequence\"); }\n#endif\n\n\t//\n\t// Begin own functions\n\t//\n\n\t// Useful for multiplayer when you replicate the GetSpeechSequenceIndex\n\t// This is different from OptionSelected  because this just sets the ActualIndex = OptionIndex instead of incremeting\n\t// the Actual Index\n\t// TODO: Proper replicate ActualIndex instead of this hack and all the subnodes\n\tbool OptionSelectedFromReplicated(int32 OptionIndex, UDlgContext& Context);\n\tint32 GetSpeechSequenceIndex() const { return ActualIndex; }\n\n\t// Fills the inner edges from the corresponding  input data (SpeechSequence)\n\tvoid AutoGenerateInnerEdges();\n\n\t// Gets the SpeechSequence as a const array\n\tUFUNCTION(BlueprintPure, Category = \"Dialogue|Node\")\n\tconst TArray<FDlgSpeechSequenceEntry>& GetNodeSpeechSequence() const { return SpeechSequence; }\n\n\t// Gets the SpeechSequence as a mutable array\n\tTArray<FDlgSpeechSequenceEntry>* GetMutableNodeSpeechSequence() { return &SpeechSequence; }\n\n\t// Tells us if the speech sequence has any speeches (aka not empty)\n\tUFUNCTION(BlueprintPure, Category = \"Dialogue|Node\")\n\tbool HasSpeechSequences() const { return SpeechSequence.Num() > 0; }\n\n\t// Helper functions to get the names of some properties. Used by the DlgSystemEditor module.\n\tstatic FName GetMemberNameSpeechSequence() { return GET_MEMBER_NAME_CHECKED(UDlgNode_SpeechSequence, SpeechSequence); }\n\nprotected:\n\t// Array of important stuff to say\n\tUPROPERTY(EditAnywhere, Category = \"Dialogue|Node\")\n\tTArray<FDlgSpeechSequenceEntry> SpeechSequence;\n\n\t// Inner edge, filled automatically based on SpeechSequence\n\tUPROPERTY()\n\tTArray<FDlgEdge> InnerEdges;\n\n\t// The current active index in the SpeechSequence array\n\tint32 ActualIndex = INDEX_NONE;\n};\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystem/Public/Tests/DlgIOTester.h",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#pragma once\n\n#include \"CoreTypes.h\"\n#include \"Logging/LogMacros.h\"\n\n#include \"DlgIOTesterTypes.h\"\n\nDECLARE_LOG_CATEGORY_EXTERN(LogDlgIOTester, All, All);\n\n\n/**\n *\tWIP test class for parsers\n *\tTODO: UObject* tests\n */\nclass DLGSYSTEM_API FDlgIOTester\n{\npublic:\n\t// Tests Parser and Writer\n\ttemplate <typename ConfigWriterType, typename ConfigParserType>\n\tstatic bool TestParser(const FDlgIOTesterOptions& Options, const FString NameWriterType = FString(),\n\t\t\t\t\t\t   const FString NameParserType = FString());\n\n\t// Test all parsers/writers\n\tstatic bool TestAllParsers();\n\n\ttemplate <typename ConfigWriterType, typename ConfigParserType, typename StructType>\n\tstatic bool TestStruct(const FString& StructDescription,\n\t\t\t\t\t\t   const FDlgIOTesterOptions& Options,\n\t\t\t\t\t\t   const FString NameWriterType = FString(),\n\t\t\t\t\t\t   const FString NameParserType = FString());\n};\n\n\ntemplate <typename ConfigWriterType, typename ConfigParserType>\nbool FDlgIOTester::TestParser(const FDlgIOTesterOptions& Options, const FString NameWriterType, const FString NameParserType)\n{\n\tbool bAllSucceeded = true;\n\n\tbAllSucceeded &= TestStruct<ConfigWriterType, ConfigParserType, FDlgTestStructPrimitives>(\"Struct of Primitives\", Options, NameWriterType, NameParserType);\n\tbAllSucceeded &= TestStruct<ConfigWriterType, ConfigParserType, FDlgTestStructComplex>(\"Struct of Complex types\", Options, NameWriterType, NameParserType);\n\n\tbAllSucceeded &= TestStruct<ConfigWriterType, ConfigParserType, FDlgTestArrayPrimitive>(\"Array of Primitives\", Options, NameWriterType, NameParserType);\n\tbAllSucceeded &= TestStruct<ConfigWriterType, ConfigParserType, FDlgTestArrayComplex>(\"Array of Complex types\", Options, NameWriterType, NameParserType);\n\n\tbAllSucceeded &= TestStruct<ConfigWriterType, ConfigParserType, FDlgTestSetPrimitive>(\"Set of Primitives\", Options, NameWriterType, NameParserType);\n\tbAllSucceeded &= TestStruct<ConfigWriterType, ConfigParserType, FDlgTestSetComplex>(\"Set of Complex types\", Options, NameWriterType, NameParserType);\n\n\tbAllSucceeded &= TestStruct<ConfigWriterType, ConfigParserType, FDlgTestMapPrimitive>(\"Map with Primitives\", Options, NameWriterType, NameParserType);\n\tbAllSucceeded &= TestStruct<ConfigWriterType, ConfigParserType, FDlgTestMapComplex>(\"Map with Complex types\", Options, NameWriterType, NameParserType);\n\n\treturn bAllSucceeded;\n}\n\n\ntemplate <typename ConfigWriterType, typename ConfigParserType, typename StructType>\nbool FDlgIOTester::TestStruct(const FString& StructDescription, const FDlgIOTesterOptions& Options, const FString NameWriterType, const FString NameParserType)\n{\n\tStructType ExportedStruct;\n\tStructType ImportedStruct;\n\tExportedStruct.GenerateRandomData(Options);\n\tImportedStruct.GenerateRandomData(Options);\n\n\t// Write struct\n\tConfigWriterType Writer;\n\t//Writer.SetLogVerbose(true);\n\tWriter.Write(StructType::StaticStruct(), &ExportedStruct);\n\tconst FString WriterString = Writer.GetAsString();\n\n\t// Read struct\n\tConfigParserType Parser;\n\t//Parser.SetLogVerbose(true);\n\tParser.InitializeParserFromString(WriterString);\n\tParser.ReadAllProperty(StructType::StaticStruct(), &ImportedStruct);\n\n\t// Should be the same\n\tFString ErrorMessage;\n\tif (ExportedStruct.IsEqual(ImportedStruct, ErrorMessage))\n\t{\n\t\treturn true;\n\t}\n\n\tif (NameWriterType.IsEmpty() || NameParserType.IsEmpty())\n\t{\n\t\tUE_LOG(LogDlgIOTester, Warning, TEXT(\"TestStruct: Test Failed (both empty) = %s\"), *StructDescription);\n\t}\n\telse\n\t{\n\t\t// Used only for debugging\n\t\tConfigWriterType DebugParser;\n\t\tDebugParser.Write(StructType::StaticStruct(), &ImportedStruct);\n\t\tconst FString ParserString = DebugParser.GetAsString();\n\n\t\tUE_LOG(LogDlgIOTester, Warning, TEXT(\"This = ExportedStruct, Other = ImportedStruct\"));\n\t\tUE_LOG(LogDlgIOTester, Warning, TEXT(\"Writer = %s, Parser = %s. Test Failed = %s\"), *NameWriterType, *NameParserType, *StructDescription);\n\t\tUE_LOG(LogDlgIOTester, Warning, TEXT(\"ErrorMessage = %s\"), *ErrorMessage);\n\t\tUE_LOG(LogDlgIOTester, Warning, TEXT(\"ExportedStruct.GetAsString() = |%s|\\n\"), *WriterString);\n\t\tUE_LOG(LogDlgIOTester, Warning, TEXT(\"ImportedStruct.GetAsString() = |%s|\\n\"), *ParserString);\n\t\tUE_LOG(LogDlgIOTester, Warning, TEXT(\"\"));\n\t}\n\n\treturn false;\n}\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystem/Public/Tests/DlgIOTesterTypes.h",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#pragma once\n\n#include \"CoreMinimal.h\"\n#include \"Misc/DateTime.h\"\n#include \"Engine/Texture2D.h\"\n\n#include \"DlgHelper.h\"\n\n#include \"DlgIOTesterTypes.generated.h\"\n\n\nUSTRUCT()\nstruct FDlgIOTesterOptions\n{\n\tGENERATED_USTRUCT_BODY()\n\npublic:\n\tFDlgIOTesterOptions() {}\n\n\t// can Have TArray<Enum>, TSet<Enum>\n\tUPROPERTY()\n\tbool bSupportsPureEnumContainer = true;\n\n\t// Can have TSet<FStructType>\n\tUPROPERTY()\n\tbool bSupportsNonPrimitiveInSet = true;\n\n\t// Can we write FLinearColor and FColor\n\tUPROPERTY()\n\tbool bSupportsColorPrimitives = true;\n\n\t// Can we write FDateTime\n\tUPROPERTY()\n\tbool bSupportsDatePrimitive = true;\n\n\t// Can we Have TMap<Key, UObject*> ?\n\tUPROPERTY()\n\tbool bSupportsUObjectValueInMap = true;\n\npublic:\n\tbool operator==(const FDlgIOTesterOptions& Other) const\n\t{\n\t\treturn bSupportsPureEnumContainer == Other.bSupportsPureEnumContainer &&\n\t\t\tbSupportsNonPrimitiveInSet == Other.bSupportsNonPrimitiveInSet &&\n\t\t\tbSupportsColorPrimitives == Other.bSupportsColorPrimitives;\n\t}\n\tbool operator!=(const FDlgIOTesterOptions& Other) const { return !(*this == Other); }\n\n\tFString ToString() const\n\t{\n\t\treturn FString::Printf(TEXT(\"bSupportsPureEnumContainer=%d, bSupportsNonPrimitiveInSet=%d, bSupportsColorPrimitives=%d\"),\n\t\t\tbSupportsPureEnumContainer, bSupportsNonPrimitiveInSet, bSupportsColorPrimitives);\n\t}\n\n};\n\n\nUENUM()\nenum class EDlgTestEnum : uint8\n{\n\tFirst = 0,\n\tSecond,\n\tThird,\n\tNumOf\n};\n\nUCLASS()\nclass UDlgTestObjectPrimitivesBase : public UObject\n{\n\tGENERATED_BODY()\n\ttypedef UDlgTestObjectPrimitivesBase Self;\npublic:\n\tUDlgTestObjectPrimitivesBase() { SetToDefaults(); }\n\tvirtual void GenerateRandomData(const FDlgIOTesterOptions& InOptions);\n\tvirtual void SetToDefaults();\n\tvirtual bool IsEqual(const Self* Other, FString& OutError) const;\n\tbool operator==(const Self& Other) const\n\t{\n\t\tFString DiscardError;\n\t\treturn IsEqual(&Other, DiscardError);\n\t}\n\n\tFString ToString() const\n\t{\n\t\treturn FString::Printf(TEXT(\"Integer=%d, String=%s\"), Integer, *String);\n\t}\n\npublic:\n\t// Tester Options\n\tFDlgIOTesterOptions Options;\n\n\tUPROPERTY()\n\tint32 Integer;\n\n\tUPROPERTY()\n\tFString String;\n};\n\nUCLASS()\nclass UDlgTestObjectPrimitives_ChildA : public UDlgTestObjectPrimitivesBase\n{\n\tGENERATED_BODY()\n\ttypedef UDlgTestObjectPrimitives_ChildA Self;\npublic:\n\tUDlgTestObjectPrimitives_ChildA() { SetToDefaults(); }\n\tvoid GenerateRandomData(const FDlgIOTesterOptions& InOptions) override;\n\tvoid SetToDefaults() override;\n\tbool IsEqual(const Super* Other, FString& OutError) const override;\n\tbool operator==(const Self& Other) const\n\t{\n\t\tFString DiscardError;\n\t\treturn IsEqual(&Other, DiscardError);\n\t}\n\npublic:\n\t// Tester Options\n\tFDlgIOTesterOptions Options;\n\n\tUPROPERTY()\n\tint32 IntegerChildA;\n};\n\nUCLASS()\nclass UDlgTestObjectPrimitives_ChildB : public UDlgTestObjectPrimitivesBase\n{\n\tGENERATED_BODY()\n\ttypedef UDlgTestObjectPrimitives_ChildB Self;\npublic:\n\tUDlgTestObjectPrimitives_ChildB() { SetToDefaults(); }\n\tvoid GenerateRandomData(const FDlgIOTesterOptions& InOptions) override;\n\tvoid SetToDefaults() override;\n\tbool IsEqual(const Super* Other, FString& OutError) const override;\n\tbool operator==(const Self& Other) const\n\t{\n\t\tFString DiscardError;\n\t\treturn IsEqual(&Other, DiscardError);\n\t}\n\npublic:\n\t// Tester Options\n\tFDlgIOTesterOptions Options;\n\n\tUPROPERTY()\n\tFString StringChildB;\n};\n\nUCLASS()\nclass UDlgTestObjectPrimitives_GrandChildA_Of_ChildA : public UDlgTestObjectPrimitives_ChildA\n{\n\tGENERATED_BODY()\n\ttypedef UDlgTestObjectPrimitives_GrandChildA_Of_ChildA Self;\n\ttypedef UDlgTestObjectPrimitivesBase SuperBase;\npublic:\n\tUDlgTestObjectPrimitives_GrandChildA_Of_ChildA() { SetToDefaults(); }\n\tvoid GenerateRandomData(const FDlgIOTesterOptions& InOptions) override;\n\tvoid SetToDefaults() override;\n\tbool IsEqual(const SuperBase* Other, FString& OutError) const override;\n\tbool operator==(const Self& Other) const\n\t{\n\t\tFString DiscardError;\n\t\treturn IsEqual(&Other, DiscardError);\n\t}\n\npublic:\n\t// Tester Options\n\tFDlgIOTesterOptions Options;\n\n\tUPROPERTY()\n\tint32 IntegerGrandChildA_Of_ChildA;\n};\n\n// Struct of primitives\nUSTRUCT()\nstruct DLGSYSTEM_API FDlgTestStructPrimitives\n{\n\tGENERATED_USTRUCT_BODY()\n\ttypedef FDlgTestStructPrimitives Self;\npublic:\n\tFDlgTestStructPrimitives() { SetToDefaults(); }\n\tbool IsEqual(const Self& Other, FString& OutError) const;\n\tbool operator==(const Self& Other) const\n\t{\n\t\tFString DiscardError;\n\t\treturn IsEqual(Other, DiscardError);\n\t}\n\tbool operator!=(const Self& Other) const { return !(*this == Other); }\n\tfriend uint32 GetTypeHash(const Self& This)\n\t{\n\t\t// NOTE not floats in the hash, these should be enough\n\t\tuint32 KeyHash = GetTypeHash(This.Integer32);\n\t\tKeyHash = HashCombine(KeyHash, GetTypeHash(This.Integer64));\n\t\tKeyHash = HashCombine(KeyHash, GetTypeHash(This.String));\n\t\tKeyHash = HashCombine(KeyHash, GetTypeHash(This.Name));\n\t\tKeyHash = HashCombine(KeyHash, GetTypeHash(This.bBoolean));\n\t\tKeyHash = HashCombine(KeyHash, GetTypeHash(This.Enum));\n\t\tKeyHash = HashCombine(KeyHash, GetTypeHash(This.Color));\n\t\tKeyHash = HashCombine(KeyHash, GetTypeHash(This.DateTime));\n\t\tKeyHash = HashCombine(KeyHash, GetTypeHash(This.IntPoint));\n\t\tKeyHash = HashCombine(KeyHash, GetTypeHash(This.GUID));\n\t\tKeyHash = HashCombine(KeyHash, GetTypeHash(This.Texture2DReference));\n\t\treturn KeyHash;\n\t}\n\tvoid GenerateRandomData(const FDlgIOTesterOptions& InOptions);\n\tvoid SetToDefaults();\n\n\tFString ToString() const\n\t{\n\t\treturn FString::Printf(TEXT(\"bBoolean=%d, Integer32=%d, Integer64=%lld, Float=%f, Enum=%d, Name=%s, String=%s, Text=%s, Color=%s, LinearColor=%s, DateTime=%s\"),\n\t\t\tbBoolean, Integer32, Integer64, Float, static_cast<int32>(Enum), *Name.ToString(), *String, *Text.ToString(), *Color.ToString(), *LinearColor.ToString(), *DateTime.ToString());\n\t}\n\npublic:\n\t// Tester Options\n\tFDlgIOTesterOptions Options;\n\n\tUPROPERTY()\n\tint32 Integer32;\n\n\tUPROPERTY()\n\tint64 Integer64;\n\n\tUPROPERTY()\n\tbool bBoolean;\n\n\tUPROPERTY()\n\tEDlgTestEnum Enum;\n\n\tUPROPERTY()\n\tfloat Float;\n\n\tUPROPERTY()\n\tFName Name;\n\n\tUPROPERTY()\n\tFString String;\n\n\tUPROPERTY()\n\tFString EmptyString;\n\n\tUPROPERTY()\n\tFText Text;\n\n\tUPROPERTY()\n\tFColor Color;\n\n\tUPROPERTY()\n\tFLinearColor LinearColor;\n\n\tUPROPERTY()\n\tFDateTime DateTime;\n\n\tUPROPERTY()\n\tFIntPoint IntPoint;\n\n\tUPROPERTY()\n\tFVector Vector3;\n\n\tUPROPERTY()\n\tFVector2D Vector2;\n\n\tUPROPERTY()\n\tFVector4 Vector4;\n\n\tUPROPERTY()\n\tFRotator Rotator;\n\n\tUPROPERTY()\n\tFMatrix Matrix;\n\n\tUPROPERTY()\n\tFTransform Transform;\n\n\tUPROPERTY()\n\tFGuid GUID;\n\n\tUPROPERTY()\n\tUClass* Class;\n\n\tUPROPERTY()\n\tUObject* EmptyObjectInitialized = nullptr;\n\n\tUPROPERTY(meta = (DlgSaveOnlyReference))\n\tUObject* EmptyObjectInitializedReference = nullptr;\n\n\t// Not initialized, check if any writer crashes. It does sadly. Can't know in C++ if a variable is initialized\n\t//UPROPERTY()\n\t//UObject* EmptyObject;\n\n\t// Check if anything crashes\n\tUPROPERTY()\n\tUTexture2D* ConstTexture2D;\n\n\tUPROPERTY(meta=(DlgSaveOnlyReference))\n\tUTexture2D* Texture2DReference;\n\n\tUPROPERTY()\n\tUDlgTestObjectPrimitivesBase* ObjectPrimitivesBase;\n\n\tUPROPERTY()\n\tUDlgTestObjectPrimitives_ChildA* ObjectPrimitivesChildA;\n\n\t// Can be nullptr or not\n\tUPROPERTY()\n\tUDlgTestObjectPrimitivesBase* ObjectSwitch;\n\n\t// Object is defined as base but actually assigned to Child A\n\tUPROPERTY()\n\tUDlgTestObjectPrimitivesBase* ObjectPrimitivesPolymorphismChildA;\n\n\tUPROPERTY()\n\tUDlgTestObjectPrimitivesBase* ObjectPrimitivesPolymorphismChildB;\n\n\tUPROPERTY()\n\tUDlgTestObjectPrimitives_GrandChildA_Of_ChildA* ObjectPrimitivesGrandChildA;\n\n\tUPROPERTY()\n\tUDlgTestObjectPrimitivesBase* ObjectPrimitivesPolymorphismBaseGrandChildA;\n\n\tUPROPERTY()\n\tUDlgTestObjectPrimitives_ChildA* ObjectPrimitivesPolymorphismChildGrandChildA;\n};\n\n\n// Struct of Complex types\nUSTRUCT()\nstruct DLGSYSTEM_API FDlgTestStructComplex\n{\n\tGENERATED_USTRUCT_BODY()\n\ttypedef FDlgTestStructComplex Self;\npublic:\n\tFDlgTestStructComplex() { SetToDefaults(); }\n\tbool IsEqual(const Self& Other, FString& OutError) const;\n\tbool operator==(const Self& Other) const\n\t{\n\t\tFString DiscardError;\n\t\treturn IsEqual(Other, DiscardError);\n\t}\n\tbool operator!=(const Self& Other) const { return !(*this == Other); }\n\tvoid GenerateRandomData(const FDlgIOTesterOptions& InOptions);\n\tvoid SetToDefaults();\n\n\tFString ToString() const\n\t{\n\t\treturn FString();\n\t}\n\npublic:\n\t// Tester Options\n\tFDlgIOTesterOptions Options;\n\n\tUPROPERTY()\n\tTArray<FDlgTestStructPrimitives> StructArrayPrimitives;\n\n\tUPROPERTY()\n\tTArray<UDlgTestObjectPrimitivesBase*> ArrayOfObjects;\n\n\tUPROPERTY(meta = (DlgSaveOnlyReference))\n\tTArray<UDlgTestObjectPrimitivesBase*> ArrayOfObjectsAsReference;\n};\n\n\n// Arrays simple\nUSTRUCT()\nstruct DLGSYSTEM_API FDlgTestArrayPrimitive\n{\n\tGENERATED_USTRUCT_BODY()\n\ttypedef FDlgTestArrayPrimitive Self;\npublic:\n\tFDlgTestArrayPrimitive() {}\n\tbool IsEqual(const Self& Other, FString& OutError) const;\n\tbool operator==(const Self& Other) const\n\t{\n\t\tFString DiscardError;\n\t\treturn IsEqual(Other, DiscardError);\n\t}\n\tvoid GenerateRandomData(const FDlgIOTesterOptions& InOptions);\n\npublic:\n\t// Tester Options\n\tFDlgIOTesterOptions Options;\n\n\tUPROPERTY()\n\tTArray<int32> EmptyArray;\n\n\tUPROPERTY()\n\tTArray<int32> Num1_Array;\n\n\tUPROPERTY()\n\tTArray<int32> Int32Array;\n\n\tUPROPERTY()\n\tTArray<int64> Int64Array;\n\n\tUPROPERTY()\n\tTArray<bool> BoolArray;\n\n\tUPROPERTY()\n\tTArray<float> FloatArray;\n\n\tUPROPERTY()\n\tTArray<EDlgTestEnum> EnumArray;\n\n\tUPROPERTY()\n\tTArray<FName> NameArray;\n\n\tUPROPERTY()\n\tTArray<FString> StringArray;\n\n\t// Filled with only nulls, check if the writers support it\n\tUPROPERTY()\n\tTArray<UDlgTestObjectPrimitivesBase*> ObjectArrayConstantNulls;\n};\n\n// Array complex\nUSTRUCT()\nstruct DLGSYSTEM_API FDlgTestArrayComplex\n{\n\tGENERATED_USTRUCT_BODY()\n\ttypedef FDlgTestArrayComplex Self;\npublic:\n\tFDlgTestArrayComplex() {}\n\tbool IsEqual(const Self& Other, FString& OutError) const;\n\tvoid GenerateRandomData(const FDlgIOTesterOptions& InOptions);\n\tbool operator==(const Self& Other) const\n\t{\n\t\tFString DiscardError;\n\t\treturn IsEqual(Other, DiscardError);\n\t}\n\npublic:\n\t// Tester Options\n\tFDlgIOTesterOptions Options;\n\n\tUPROPERTY()\n\tTArray<FDlgTestStructPrimitives> StructArrayPrimitives;\n\n\tUPROPERTY()\n\tTArray<FDlgTestArrayPrimitive> StructArrayOfArrayPrimitives;\n\n\tUPROPERTY()\n\tTArray<UDlgTestObjectPrimitivesBase*> ObjectArrayFrequentsNulls;\n\n\tUPROPERTY()\n\tTArray<UDlgTestObjectPrimitivesBase*> ObjectArrayPrimitivesBase;\n\n\tUPROPERTY()\n\tTArray<UDlgTestObjectPrimitivesBase*> ObjectArrayPrimitivesAll;\n};\n\n\n// Set primitive\nUSTRUCT()\nstruct DLGSYSTEM_API FDlgTestSetPrimitive\n{\n\tGENERATED_USTRUCT_BODY()\n\ttypedef FDlgTestSetPrimitive Self;\npublic:\n\tFDlgTestSetPrimitive() {}\n\tbool IsEqual(const Self& Other, FString& OutError) const;\n\tvoid GenerateRandomData(const FDlgIOTesterOptions& InOptions);\n\tbool operator==(const Self& Other) const\n\t{\n\t\tFString DiscardError;\n\t\treturn IsEqual(Other, DiscardError);\n\t}\n\npublic:\n\t// Tester Options\n\tFDlgIOTesterOptions Options;\n\n\tUPROPERTY()\n\tTSet<int32> EmptySet;\n\n\tUPROPERTY()\n\tTSet<int32> Num1_Set;\n\n\tUPROPERTY()\n\tTSet<int32> Int32Set;\n\n\tUPROPERTY()\n\tTSet<int64> Int64Set;\n\n\tUPROPERTY()\n\tTSet<EDlgTestEnum> EnumSet;\n\n\tUPROPERTY()\n\tTSet<FName> NameSet;\n\n\tUPROPERTY()\n\tTSet<FString> StringSet;\n};\n\n// Set complex\nUSTRUCT()\nstruct DLGSYSTEM_API FDlgTestSetComplex\n{\n\tGENERATED_USTRUCT_BODY()\n\ttypedef FDlgTestSetComplex Self;\npublic:\n\tFDlgTestSetComplex() {}\n\tbool IsEqual(const Self& Other, FString& OutError) const;\n\tvoid GenerateRandomData(const FDlgIOTesterOptions& InOptions);\n\tbool operator==(const Self& Other) const\n\t{\n\t\tFString DiscardError;\n\t\treturn IsEqual(Other, DiscardError);\n\t}\n\npublic:\n\t// Tester Options\n\tFDlgIOTesterOptions Options;\n\n\tUPROPERTY()\n\tTSet<FDlgTestStructPrimitives> StructSetPrimitives;\n};\n\n\n// Map primitive\nUSTRUCT()\nstruct DLGSYSTEM_API FDlgTestMapPrimitive\n{\n\tGENERATED_USTRUCT_BODY()\n\ttypedef FDlgTestMapPrimitive Self;\npublic:\n\tFDlgTestMapPrimitive() {}\n\tbool IsEqual(const Self& Other, FString& OutError) const;\n\tvoid GenerateRandomData(const FDlgIOTesterOptions& InOptions);\n\tvoid CheckInvariants() const;\n\tbool operator==(const Self& Other) const\n\t{\n\t\tFString DiscardError;\n\t\treturn IsEqual(Other, DiscardError);\n\t}\n\tFString ToString() const\n\t{\n\t\treturn FString::Printf(TEXT(\"IntToIntMap.Num()=%d, IntToStringMap.Num()=%d\"),  Int32ToInt32Map.Num(), Int32ToStringMap.Num());\n\t}\n\npublic:\n\t// Tester Options\n\tFDlgIOTesterOptions Options;\n\n\tUPROPERTY()\n\tTMap<int32, int32> EmptyMap;\n\n\tUPROPERTY()\n\tTMap<int32, int32> Int32ToInt32Map;\n\n\tUPROPERTY()\n\tTMap<int64, int64> Int64ToInt64Map;\n\n\tUPROPERTY()\n\tTMap<int32, FString> Int32ToStringMap;\n\n\tUPROPERTY()\n\tTMap<int32, FName> Int32ToNameMap;\n\n\tUPROPERTY()\n\tTMap<FString, int32> StringToInt32Map;\n\n\tUPROPERTY()\n\tTMap<FString, FString> StringToStringMap;\n\n\tUPROPERTY()\n\tTMap<FName, int32> NameToInt32Map;\n\n\tUPROPERTY()\n\tTMap<FName, FName> NameToNameMap;\n\n\tUPROPERTY()\n\tTMap<FString, float> StringToFloatMap;\n\n\tUPROPERTY()\n\tTMap<int32, float> Int32ToFloatMap;\n\n\tUPROPERTY()\n\tTMap<FName, FColor> NameToColorMap;\n\n\t// Filled with only nulls, check if the writers support it\n\tUPROPERTY()\n\tTMap<FString, UDlgTestObjectPrimitivesBase*> ObjectConstantNullMap;\n\n\tUPROPERTY()\n\tTMap<FString, UDlgTestObjectPrimitivesBase*> ObjectFrequentsNullsMap;\n\n\tUPROPERTY()\n\tTMap<FString, UDlgTestObjectPrimitivesBase*> ObjectPrimitivesAllMap;\n};\n\n// Map complex\nUSTRUCT()\nstruct DLGSYSTEM_API FDlgTestMapComplex\n{\n\tGENERATED_USTRUCT_BODY()\n\ttypedef FDlgTestMapComplex Self;\npublic:\n\tFDlgTestMapComplex() {}\n\tbool IsEqual(const Self& Other, FString& OutError) const;\n\tvoid GenerateRandomData(const FDlgIOTesterOptions& InOptions);\n\tbool operator==(const Self& Other) const\n\t{\n\t\tFString DiscardError;\n\t\treturn IsEqual(Other, DiscardError);\n\t}\n\npublic:\n\t// Tester Options\n\tFDlgIOTesterOptions Options;\n\n\tUPROPERTY()\n\tTMap<int32, FDlgTestStructPrimitives> Int32ToStructPrimitiveMap;\n\n\tUPROPERTY()\n\tTMap<FName, FDlgTestStructPrimitives> NameToStructPrimitiveMap;\n\n\tUPROPERTY()\n\tTMap<FDlgTestStructPrimitives, int32> StructPrimitiveToIntMap;\n\n\tUPROPERTY()\n\tTMap<FName, FDlgTestMapPrimitive> NameToStructOfMapPrimitives;\n\n\tUPROPERTY()\n\tTMap<FName, FDlgTestArrayPrimitive> NameToStructOfArrayPrimitives;\n\n\tUPROPERTY()\n\tTMap<FName, FDlgTestSetPrimitive> NameToStructOfSetPrimitives;\n\n\tUPROPERTY()\n\tTMap<FName, FDlgTestArrayComplex> NameToStructOfArrayComplex;\n\n\tUPROPERTY()\n\tTMap<FName, FDlgTestSetComplex> NameToStructOfSetComplex;\n};\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystem/Public/Tests/DlgTesterHelper.h",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#pragma once\n\n#include <functional>\n#include \"CoreMinimal.h\"\n#include \"UObject/NoExportTypes.h\"\n\n#include \"DlgHelper.h\"\n\ntemplate <typename ArrayType>\nclass FDlgTestHelper_ArrayEqualImpl\n{\npublic:\n\tstatic bool IsEqual(const TArray<ArrayType>& ThisArray, const TArray<ArrayType>& OtherArray,\n\t\tconst FString& PropertyName, FString& OutError, const bool bIsPrimitive,\n\t\tstd::function<FString(const ArrayType&)> GetArrayTypeAsString,\n\t\tstd::function<bool(const ArrayType& FirstValue, const ArrayType& SecondValue, FString& ComparisonErrorMessage)> AreValuesEqual)\n\t{\n\t\tbool bIsEqual = true;\n\t\tauto AreValuesEqualWithoutMessage = [&AreValuesEqual](const ArrayType& FirstValue, const ArrayType& SecondValue) -> bool\n\t\t{\n\t\t\tFString DiscardMessage;\n\t\t\treturn AreValuesEqual(FirstValue, SecondValue, DiscardMessage);\n\t\t};\n\n\t\tif (FDlgHelper::IsArrayEqual<ArrayType>(ThisArray, OtherArray, AreValuesEqualWithoutMessage) == false)\n\t\t{\n\t\t\tbIsEqual = false;\n\t\t\tif (ThisArray.Num() != OtherArray.Num())\n\t\t\t{\n\t\t\t\tOutError += FString::Printf(\n\t\t\t\t\tTEXT(\"\\tThis.%s.Num (%d) != Other.%s.Num (%d)\\n\"),\n\t\t\t\t\t*PropertyName, ThisArray.Num(), *PropertyName, OtherArray.Num());\n\t\t\t}\n\n\t\t\t// Find which element is different\n\t\t\tfor (int32 Index = 0; Index < ThisArray.Num() && Index < OtherArray.Num(); Index++)\n\t\t\t{\n\t\t\t\t// Values differ\n\t\t\t\tFString ComparisonErrorMessage;\n\t\t\t\tif (!AreValuesEqual(ThisArray[Index], OtherArray[Index], ComparisonErrorMessage))\n\t\t\t\t{\n\t\t\t\t\tif (bIsPrimitive)\n\t\t\t\t\t{\n\t\t\t\t\t\tOutError += FString::Printf(TEXT(\"\\tThis.%s[%d] (%d) != Other.%s[%d] (%d)\\n\"),\n\t\t\t\t\t\t\t*PropertyName, Index, *GetArrayTypeAsString(ThisArray[Index]), *PropertyName, Index, *GetArrayTypeAsString(OtherArray[Index]));\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tOutError += FString::Printf(TEXT(\"\\tThis.%s[%d] != Other.%s[%d] |message = %s|\\n\"),\n\t\t\t\t\t\t\t*PropertyName, Index, *PropertyName, Index, *ComparisonErrorMessage);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn bIsEqual;\n\t}\n};\n\n// Variant with default comparison\ntemplate <typename ArrayType>\nclass FDlgTestHelper_ArrayPrimitiveVariantImpl\n{\npublic:\n\tstatic bool IsEqual(const TArray<ArrayType>& ThisArray, const TArray<ArrayType>& OtherArray,\n\t\tconst FString& PropertyName, FString& OutError,\n\t\tstd::function<FString(const ArrayType&)> GetArrayTypeAsString)\n\t{\n\t\treturn FDlgTestHelper_ArrayEqualImpl<ArrayType>::IsEqual(ThisArray, OtherArray, PropertyName, OutError, true, GetArrayTypeAsString,\n\t\t\t[](const ArrayType& FirstValue, const ArrayType& SecondValue, FString& ComparisonErrorMessage) -> bool\n\t\t{\n\t\t\treturn FirstValue == SecondValue;\n\t\t});\n\t}\n};\n\n// Variant for float\ntemplate <>\nclass FDlgTestHelper_ArrayPrimitiveVariantImpl<float>\n{\npublic:\n\tstatic bool IsEqual(const TArray<float>& ThisArray, const TArray<float>& OtherArray,\n\t\tconst FString& PropertyName, FString& OutError,\n\t\tstd::function<FString(const float&)> GetArrayTypeAsString)\n\t{\n\t\treturn FDlgTestHelper_ArrayEqualImpl<float>::IsEqual(ThisArray, OtherArray, PropertyName, OutError, true, GetArrayTypeAsString,\n\t\t\t[](const float& FirstValue, const float& SecondValue, FString& ComparisonErrorMessage) -> bool\n\t\t{\n\t\t\treturn FMath::IsNearlyEqual(FirstValue, SecondValue, KINDA_SMALL_NUMBER);\n\t\t});\n\t}\n};\n\n\n// NOTE for SetType = float this won't work, what are you even doing?\ntemplate <typename SetType>\nstruct FDlgTestHelper_SetEqualImpl\n{\npublic:\n\tstatic bool IsEqual(const TSet<SetType>& ThisSet, const TSet<SetType>& OtherSet,\n\t\tconst FString& PropertyName, FString& OutError,\n\t\tstd::function<FString(const SetType&)> GetSetTypeAsString)\n\t{\n\t\tbool bIsEqual = true;\n\t\tif (FDlgHelper::IsSetEqual<SetType>(ThisSet, OtherSet) == false)\n\t\t{\n\t\t\tbIsEqual = false;\n\t\t\tif (ThisSet.Num() != OtherSet.Num())\n\t\t\t{\n\t\t\t\tOutError += FString::Printf(\n\t\t\t\t\tTEXT(\"\\tThis.%s.Num (%d) != Other.%s.Num (%d)\\n\"),\n\t\t\t\t\t*PropertyName, ThisSet.Num(), *PropertyName, OtherSet.Num());\n\t\t\t}\n\n\t\t\t// Find The set that is different from the other\n\t\t\tconst TSet<SetType> NotInOther = ThisSet.Difference(OtherSet);\n\t\t\tOutError += FString::Printf(\n\t\t\t\tTEXT(\"\\tNotInOther = This.%s - Other.%s is of length = %d\\n\"),\n\t\t\t\t*PropertyName, *PropertyName, NotInOther.Num());\n\n\t\t\tFString NotInOtherString;\n\t\t\tfor (const SetType& ValueInOther : NotInOther)\n\t\t\t{\n\t\t\t\tNotInOtherString += FString::Printf(TEXT(\"%s,\"), *GetSetTypeAsString(ValueInOther));\n\t\t\t}\n\t\t\tOutError += FString::Printf(TEXT(\"\\tNotInOther = {%s}\\n\"), *NotInOtherString);\n\t\t}\n\n\t\treturn bIsEqual;\n\t}\n};\n\ntemplate <typename KeyType, typename ValueType>\nstruct FDlgTestHelper_MapEqualImpl\n{\npublic:\n\tstatic bool IsEqual(const TMap<KeyType, ValueType>& ThisMap, const TMap<KeyType, ValueType>& OtherMap,\n\t\tconst FString& PropertyName, FString& OutError, const bool bIsValuePrimitive,\n\t\tstd::function<FString(const KeyType&)> GetKeyTypeAsString,\n\t\tstd::function<FString(const ValueType&)> GetValueTypeAsString,\n\t\tstd::function<bool(const ValueType& FirstValue, const ValueType& SecondValue, FString& ComparisonErrorMessage)> AreValuesEqual)\n\t{\n\t\tbool bIsEqual = true;\n\t\tauto AreValuesEqualWithoutMessage = [&AreValuesEqual](const ValueType& FirstValue, const ValueType& SecondValue) -> bool\n\t\t{\n\t\t\tFString DiscardMessage;\n\t\t\treturn AreValuesEqual(FirstValue, SecondValue, DiscardMessage);\n\t\t};\n\n\t\tif (FDlgHelper::IsMapEqual<KeyType, ValueType>(ThisMap, OtherMap, AreValuesEqualWithoutMessage) == false)\n\t\t{\n\t\t\tbIsEqual = false;\n\t\t\tif (ThisMap.Num() != OtherMap.Num())\n\t\t\t{\n\t\t\t\tOutError += FString::Printf(\n\t\t\t\t\tTEXT(\"\\tThis.%s.Num (%d) != Other.%s.Num (%d)\\n\"),\n\t\t\t\t\t*PropertyName, ThisMap.Num(), *PropertyName, OtherMap.Num());\n\t\t\t}\n\n\t\t\t// Find values in ThisMap that do not exist in OtherMap\n\t\t\tint32 NumKeysNotInOther = 0;\n\t\t\tFString KeysNotInOtherString;\n\t\t\tFString ValuesThatDifferString;\n\t\t\tconst bool OtherMapIsEmpty = OtherMap.Num() == 0;\n\t\t\tfor (const auto& ThisElem : ThisMap)\n\t\t\t{\n\t\t\t\tconst ValueType* OtherMapValue = OtherMap.Find(ThisElem.Key);\n\t\t\t\tif (OtherMapValue != nullptr)\n\t\t\t\t{\n\t\t\t\t\tFString ComparisonErrorMessage;\n\t\t\t\t\tif (!AreValuesEqual(ThisElem.Value, *OtherMapValue, ComparisonErrorMessage))\n\t\t\t\t\t{\n\t\t\t\t\t\tif (bIsValuePrimitive)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tValuesThatDifferString += FString::Printf(\n\t\t\t\t\t\t\t\tTEXT(\"\\tThis.%s[key] (%s) != Other.%s[key] (%s). Key = (%s)\\n\"),\n\t\t\t\t\t\t\t\t*PropertyName, *GetValueTypeAsString(ThisElem.Value),\n\t\t\t\t\t\t\t\t*PropertyName, *GetValueTypeAsString(*OtherMapValue),\n\t\t\t\t\t\t\t\t*GetKeyTypeAsString(ThisElem.Key));\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tValuesThatDifferString += FString::Printf(\n\t\t\t\t\t\t\t\tTEXT(\"\\tThis.%s[key] (%s) != Other.%s[key] (%s). Key = (%s). |Message = %s|\\n\"),\n\t\t\t\t\t\t\t\t*PropertyName, *GetValueTypeAsString(ThisElem.Value),\n\t\t\t\t\t\t\t\t*PropertyName, *GetValueTypeAsString(*OtherMapValue),\n\t\t\t\t\t\t\t\t*GetKeyTypeAsString(ThisElem.Key), *ComparisonErrorMessage);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tKeysNotInOtherString += FString::Printf(TEXT(\"%s,\"), *GetKeyTypeAsString(ThisElem.Key));\n\t\t\t\t\tNumKeysNotInOther++;\n\t\t\t\t}\n\t\t\t}\n\n\n\t\t\tif (OtherMapIsEmpty)\n\t\t\t{\n\t\t\t\tOutError += FString::Printf(TEXT(\"\\tOther.%s IS EMPTY\\n\"), *PropertyName);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tFString OtherStringKeys;\n\t\t\t\tfor (const auto& OtherElem : OtherMap)\n\t\t\t\t{\n\t\t\t\t\tOtherStringKeys += FString::Printf(TEXT(\"%s,\"), *GetKeyTypeAsString(OtherElem.Key));\n\t\t\t\t}\n\t\t\t\tOutError += FString::Printf(TEXT(\"\\tOther.%s KEYS (Num = %d) = {%s}\\n\"),\n\t\t\t\t\t*PropertyName, OtherMap.Num(), *OtherStringKeys);\n\t\t\t}\n\n\t\t\tOutError += FString::Printf(TEXT(\"\\tKeys that ONLY exist in This.%s (Num = %d) = {%s}\\n\"),\n\t\t\t\t*PropertyName, NumKeysNotInOther, *KeysNotInOtherString);\n\t\t\tOutError += FString::Printf(TEXT(\"\\tValues that differ:\\n%s\\n\"), *ValuesThatDifferString);\n\t\t}\n\n\t\treturn bIsEqual;\n\t}\n};\n\n\n// Variant with default comparison\ntemplate <typename KeyType, typename ValueType>\nclass FDlgTestHelper_MapPrimitiveVariantImpl\n{\npublic:\n\tstatic bool IsEqual(const TMap<KeyType, ValueType>& ThisMap, const TMap<KeyType, ValueType>& OtherMap,\n\t\tconst FString& PropertyName, FString& OutError,\n\t\tstd::function<FString(const KeyType&)> GetKeyTypeAsString,\n\t\tstd::function<FString(const ValueType&)> GetValueTypeAsString)\n\t{\n\t\treturn FDlgTestHelper_MapEqualImpl<KeyType, ValueType>::IsEqual(ThisMap, OtherMap, PropertyName, OutError, true, GetKeyTypeAsString, GetValueTypeAsString,\n\t\t\t[](const ValueType& FirstMapValue, const ValueType& SecondMapValue, FString& ComparisonErrorMessage) -> bool\n\t\t{\n\t\t\treturn FirstMapValue == SecondMapValue;\n\t\t});\n\t}\n};\n\n// Variant for float\ntemplate <typename KeyType>\nclass FDlgTestHelper_MapPrimitiveVariantImpl<KeyType, float>\n{\npublic:\n\tstatic bool IsEqual(const TMap<KeyType, float>& ThisMap, const TMap<KeyType, float>& OtherMap,\n\t\tconst FString& PropertyName, FString& OutError,\n\t\tstd::function<FString(const KeyType&)> GetKeyTypeAsString,\n\t\tstd::function<FString(const float&)> GetValueTypeAsString)\n\t{\n\t\treturn FDlgTestHelper_MapEqualImpl<KeyType, float>::IsEqual(ThisMap, OtherMap, PropertyName, OutError, true, GetKeyTypeAsString, GetValueTypeAsString,\n\t\t\t[](const float& FirstMapValue, const float& SecondMapValue, FString& ComparisonErrorMessage) -> bool\n\t\t{\n\t\t\treturn FMath::IsNearlyEqual(FirstMapValue, SecondMapValue, KINDA_SMALL_NUMBER);\n\t\t});\n\t}\n};\n\n/**\n* Helpers for tests\n*/\nstruct FDlgTestHelper\n{\npublic:\n\n\n\ttemplate <typename ValueType>\n\tstatic void CheckMapStringKeyInvariants(const TMap<FString, ValueType>& ThisMap)\n\t{\n\t\tfor (const auto& Elem : ThisMap)\n\t\t{\n\t\t\t// Most likely the map is corrupted\n\t\t\tcheck((void*)(*Elem.Key) != nullptr);\n\t\t\tElem.Key.CheckInvariants();\n\t\t}\n\t}\n\n\ttemplate <typename SetType>\n\tstatic bool IsSetEqual(const TSet<SetType>& ThisSet, const TSet<SetType>& OtherSet,\n\t\tconst FString& PropertyName, FString& OutError, std::function<FString(const SetType&)> GetSetTypeAsString)\n\t{\n\t\treturn FDlgTestHelper_SetEqualImpl<SetType>::IsEqual(ThisSet, OtherSet, PropertyName, OutError, GetSetTypeAsString);\n\t}\n\n\ttemplate <typename KeyType, typename ValueType>\n\tstatic bool IsPrimitiveMapEqual(const TMap<KeyType, ValueType>& ThisMap, const TMap<KeyType, ValueType>& OtherMap,\n\t\tconst FString& PropertyName, FString& OutError,\n\t\tstd::function<FString(const KeyType&)> GetKeyTypeAsString,\n\t\tstd::function<FString(const ValueType&)> GetValueTypeAsString)\n\t{\n\t\treturn FDlgTestHelper_MapPrimitiveVariantImpl<KeyType, ValueType>::IsEqual(ThisMap, OtherMap, PropertyName, OutError, GetKeyTypeAsString, GetValueTypeAsString);\n\t}\n\n\ttemplate <typename KeyType, typename ValueType>\n\tstatic bool IsComplexMapValueEqual(const TMap<KeyType, ValueType>& ThisMap, const TMap<KeyType, ValueType>& OtherMap,\n\t\tconst FString& PropertyName, FString& OutError,\n\t\tstd::function<FString(const KeyType&)> GetKeyTypeAsString,\n\t\tstd::function<FString(const ValueType&)> GetValueTypeAsString)\n\t{\n\t\treturn FDlgTestHelper_MapEqualImpl<KeyType, ValueType>::IsEqual(ThisMap, OtherMap, PropertyName, OutError, false, GetKeyTypeAsString, GetValueTypeAsString,\n\t\t\t[](const ValueType& FirstMapValue, const ValueType& SecondMapValue, FString& ComparisonErrorMessage) -> bool\n\t\t\t{\n\t\t\t\treturn FirstMapValue.IsEqual(SecondMapValue, ComparisonErrorMessage);\n\t\t\t});\n\t}\n\n\ttemplate <typename KeyType, typename ValueType>\n\tstatic bool IsComplexPointersMapEqual(const TMap<KeyType, ValueType*>& ThisMap, const TMap<KeyType, ValueType*>& OtherMap,\n\t\tconst FString& PropertyName, FString& OutError,\n\t\tstd::function<FString(const KeyType&)> GetKeyTypeAsString)\n\t{\n\t\treturn FDlgTestHelper_MapEqualImpl<KeyType, ValueType*>::IsEqual(ThisMap, OtherMap, PropertyName, OutError, false, GetKeyTypeAsString,\n\t\t\t[](const auto* Object) -> FString\n\t\t\t{\n\t\t\t\treturn FDlgHelper::GetFullNameFromObject(Object);\n\t\t\t},\n\t\t\t[](const auto* FirstMapValue, const auto* SecondMapValue, FString& ComparisonErrorMessage) -> bool\n\t\t\t{\n\t\t\t\tif (FirstMapValue == nullptr)\n\t\t\t\t{\n\t\t\t\t\tComparisonErrorMessage = TEXT(\"FirstMapValue is nullptr\");\n\t\t\t\t\treturn SecondMapValue == nullptr;\n\t\t\t\t}\n\t\t\t\treturn FirstMapValue->IsEqual(SecondMapValue, ComparisonErrorMessage);\n\t\t\t});\n\t}\n\n\ttemplate <typename ArrayType>\n\tstatic bool IsPrimitiveArrayEqual(const TArray<ArrayType>& ThisArray, const TArray<ArrayType>& OtherArray,\n\t\tconst FString& PropertyName, FString& OutError, std::function<FString(const ArrayType&)> GetArrayTypeAsString)\n\t{\n\t\treturn FDlgTestHelper_ArrayPrimitiveVariantImpl<ArrayType>::IsEqual(ThisArray, OtherArray, PropertyName, OutError, GetArrayTypeAsString);\n\t}\n\n\ttemplate <typename ArrayType>\n\tstatic bool IsComplexArrayEqual(const TArray<ArrayType>& ThisArray, const TArray<ArrayType>& OtherArray,\n\t\tconst FString& PropertyName, FString& OutError)\n\t{\n\t\treturn FDlgTestHelper_ArrayEqualImpl<ArrayType>::IsEqual(ThisArray, OtherArray, PropertyName, OutError, false,\n\t\t\t[](const ArrayType& Value) -> FString\n\t\t\t{\n\t\t\t\treturn TEXT(\"IsComplexArrayEqual SHOULD NOT SEE THIS\");\n\t\t\t},\n\t\t\t[](const ArrayType& FirstValue, const ArrayType& SecondValue, FString& ComparisonErrorMessage) -> bool\n\t\t\t{\n\t\t\t\treturn FirstValue.IsEqual(SecondValue, ComparisonErrorMessage);\n\t\t\t});\n\t}\n\n\ttemplate <typename ArrayType>\n\tstatic bool IsComplexPointerArrayEqual(const TArray<ArrayType*>& ThisArray, const TArray<ArrayType*>& OtherArray,\n\t\tconst FString& PropertyName, FString& OutError)\n\t{\n\t\treturn FDlgTestHelper_ArrayEqualImpl<ArrayType*>::IsEqual(ThisArray, OtherArray, PropertyName, OutError, false,\n\t\t\t[](const auto* Value) -> FString\n\t\t\t{\n\t\t\t\treturn Value ? Value->ToString() : \"\";\n\t\t\t},\n\t\t\t[](const auto* FirstValue, const auto* SecondValue, FString& ComparisonErrorMessage) -> bool\n\t\t\t{\n\t\t\t\tif (FirstValue == nullptr)\n\t\t\t\t{\n\t\t\t\t\tComparisonErrorMessage = TEXT(\"FirstValue is nullptr\");\n\t\t\t\t\treturn SecondValue == nullptr;\n\t\t\t\t}\n\t\t\t\treturn FirstValue->IsEqual(SecondValue, ComparisonErrorMessage);\n\t\t\t});\n\t}\n\n\tstatic std::function<FString(const int32&)> Int32ToString;\n\tstatic std::function<FString(const int64&)> Int64ToString;\n\tstatic std::function<FString(const FName&)> NameToString;\n\tstatic std::function<FString(const FString&)> StringToString;\n\tstatic std::function<FString(const float&)> FloatToString;\n\tstatic std::function<FString(const FVector&)> VectorToString;\n\tstatic std::function<FString(const FColor&)> ColorToString;\n};\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystem/Public/TreeViewHelpers/DlgTreeViewHelper.h",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#pragma once\n\n#include \"CoreMinimal.h\"\n#include \"Widgets/Views/STreeView.h\"\n\n#include \"DlgHelper.h\"\n\nclass DLGSYSTEM_API FDlgTreeViewHelper\n{\npublic:\n\tstatic bool PredicateSortDialogueWeakPtrAlphabeticallyAscending(\n\t\tconst TWeakObjectPtr<const UDlgDialogue>& First,\n\t\tconst TWeakObjectPtr<const UDlgDialogue>& Second\n\t)\n\t{\n\t\tif (!First.IsValid())\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t\tif (!Second.IsValid())\n\t\t{\n\t\t\treturn true;\n\t\t}\n\n\t\treturn FDlgHelper::PredicateSortFNameAlphabeticallyAscending(First->GetFName(), Second->GetFName());\n\t}\n\n\t/** Restore the expansion state of the InTree with the ItemSource provided (usually the flattened tree) */\n\ttemplate<typename ItemType, typename ComparisonType>\n\tstatic void RestoreTreeExpansionState(\n\t\tconst TSharedPtr<STreeView<ItemType>>& InTree,\n\t\tconst TArray<ItemType>& ItemSource,\n\t\tconst TSet<ItemType>& OldExpansionState, ComparisonType ComparisonFunction\n\t)\n\t{\n\t\tcheck(InTree.IsValid());\n\n\t\t// Iterate over new tree items\n\t\tfor (int32 ItemIdx = 0; ItemIdx < ItemSource.Num(); ItemIdx++)\n\t\t{\n\t\t\tItemType NewItem = ItemSource[ItemIdx];\n\n\t\t\t// Look through old expansion state\n\t\t\tfor (const ItemType OldItem : OldExpansionState)\n\t\t\t{\n\t\t\t\t// See if this matches this new item\n\t\t\t\tif (ComparisonFunction(OldItem, NewItem))\n\t\t\t\t{\n\t\t\t\t\t// It does, so expand it\n\t\t\t\t\tInTree->SetItemExpansion(NewItem, true);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n};\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystem/Public/TreeViewHelpers/DlgTreeViewNode.h",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#pragma once\n\n#include \"CoreMinimal.h\"\n#include \"Widgets/Views/STreeView.h\"\n\n/** Base Tree Node for all Nodes used in the STreeView. */\ntemplate <class SelfType>\nclass FDlgTreeViewNode : public TSharedFromThis<SelfType>\n{\npublic:\n\t/* Create a listing for a search result*/\n\tFDlgTreeViewNode(const FText& InDisplayText, const TSharedPtr<SelfType>& InParent)\n\t\t: Parent(InParent), DisplayText(InDisplayText) {}\n\tvirtual ~FDlgTreeViewNode() {}\n\n\t/* Called when user clicks on the search item */\n\tvirtual FReply OnClick()\n\t{\n\t\t// If there is a parent, handle it using the parent's functionality\n\t\tif (Parent.IsValid())\n\t\t{\n\t\t\treturn Parent.Pin()->OnClick();\n\t\t}\n\n\t\treturn FReply::Unhandled();\n\t}\n\n\t// DisplayText:\n\tFText GetDisplayText() const { return DisplayText; }\n\tFName GetDisplayTextAsFName() const { return FName(*DisplayText.ToString()); }\n\tvoid SetDisplayText(const FText& InText) { DisplayText = InText; }\n\tbool DoesDisplayTextContains(const FString& InSearch, ESearchCase::Type SearchCase = ESearchCase::IgnoreCase)\n\t{\n\t\treturn DisplayText.ToString().Contains(InSearch, SearchCase);\n\t}\n\n\t// Parent:\n\tbool HasParent() const { return Parent.IsValid(); }\n\tTWeakPtr<SelfType> GetParent() const { return Parent; }\n\tvoid SetParent(TWeakPtr<SelfType> InParentNode) { Parent = InParentNode; }\n\tvoid ClearParent() { Parent.Reset(); }\n\n\t// Children:\n\tbool HasChildren() const { return Children.Num() > 0; }\n\tconst TArray<TSharedPtr<SelfType>>& GetChildren() const { return Children; }\n\tvoid GetVisibleChildren(TArray<TSharedPtr<SelfType>>& OutChildren)\n\t{\n\t\tfor (const TSharedPtr<SelfType>& Child : Children)\n\t\t{\n\t\t\tif (Child->IsVisible())\n\t\t\t{\n\t\t\t\tOutChildren.Add(Child);\n\t\t\t}\n\t\t}\n\t}\n\tvirtual void AddChild(const TSharedPtr<SelfType>& ChildNode)\n\t{\n\t\tensure(!ChildNode->IsRoot());\n\t\tChildNode->SetParent(this->AsShared());\n\t\tChildren.Add(ChildNode);\n\t}\n\tvirtual void SetChildren(const TArray<TSharedPtr<SelfType>>& InChildren)\n\t{\n\t\tChildren = InChildren;\n\t\tfor (const TSharedPtr<SelfType>& Child : Children)\n\t\t{\n\t\t\tensure(!Child->IsRoot());\n\t\t\tChild->SetParent(this->AsShared());\n\t\t}\n\t}\n\tvirtual void ClearChildren()\n\t{\n\t\tChildren.Empty();\n\t}\n\n\t// bIsVisible:\n\tbool IsVisible() const { return bIsVisible; }\n\tvoid SetIsVisible(bool InIsVisible) { bIsVisible = InIsVisible; }\n\n\t/** Is this the root node? Aka no parent. */\n\tbool IsRoot() const { return !Parent.IsValid(); }\n\n\t/** Is this the leaf node? Aka no children. */\n\tbool IsLeaf() const { return Children.Num() == 0; }\n\n\t/**\n\t * Takes the tree view and expands its elements for each child.\n\t *\n\t * @param  TreeView\t\tThe tree responsible for visualizing this node hierarchy.\n\t * @param  bRecursive\tDetermines if you want children/descendants to expand their children as well.\n\t */\n\tvoid ExpandAllChildren(const TSharedPtr<STreeView<TSharedPtr<SelfType>>>& TreeView, bool bRecursive = true)\n\t{\n\t\tstatic constexpr bool bShouldExpandItem = true;\n\t\tif (!HasChildren())\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\tTreeView->SetItemExpansion(this->AsShared(), bShouldExpandItem);\n\t\tfor (const TSharedPtr<SelfType>& ChildNode : Children)\n\t\t{\n\t\t\tif (bRecursive)\n\t\t\t{\n\t\t\t\t// recursive on all children.\n\t\t\t\tChildNode->ExpandAllChildren(TreeView, bRecursive);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t// Only direct children\n\t\t\t\tTreeView->SetItemExpansion(ChildNode, bShouldExpandItem);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Recursively collects all child/grandchild/descendant nodes.\n\t * Aka Flattened tree.\n\t * @param  OutNodeArray\tThe array to fill out with descendant nodes.\n\t */\n\tvoid GetAllNodes(TArray<TSharedPtr<SelfType>>& OutNodeArray) const\n\t{\n\t\tfor (const TSharedPtr<SelfType>& ChildNode : Children)\n\t\t{\n\t\t\tOutNodeArray.Add(ChildNode);\n\t\t\tChildNode->GetAllNodes(OutNodeArray);\n\t\t}\n\t}\n\n\t/**\n\t * Searches the node so that the OutNodes will only contains paths to nodes that contains the specified string.\n\t * @param InSearch\t\tThe string to search by\n\t * @param OutNodes\t\tArray of arrays, each array inside represents a node path that points to the Node that contains the InSearch\n\t */\n\tvirtual void FilterPathsToNodesThatContainText(const FString& InSearch, TArray<TArray<TSharedPtr<SelfType>>>& OutNodes)\n\t{\n\t\tfor (int32 Index = 0, Num = Children.Num(); Index < Num; Index++)\n\t\t{\n\t\t\tTSharedPtr<SelfType> CurrentChild = Children[Index];\n\t\t\tCurrentChild->SetIsVisible(false);\n\t\t\tGetPathToChildThatContainsText(Children[Index], InSearch, OutNodes);\n\n\t\t\t// Let child classes handle this themselves\n\t\t\tPostFilterPathsToNodes(CurrentChild);\n\t\t}\n\t}\n\nprotected:\n\t/** Called inside FilterPathsToNodesThatContainText after we got the path for the current Child.  */\n\tvirtual void PostFilterPathsToNodes(const TSharedPtr<SelfType>& Child) {}\n\n\t/** Called inside GetPathToChildThatContainsText after we advanced one parent in the path */\n\tvirtual void PostBuildPathToTopMostParent(const TSharedPtr<SelfType>& CurrentParentNode) {}\n\n\t/** Called inside GetPathToChildThatContainsText after we got the path of the GrandChild  */\n\tvirtual bool FilterIsChildVisible(const TSharedPtr<SelfType>& GrandChild)\n\t{\n\t\treturn GrandChild->IsLeaf();\n\t}\n\n\t/** Called inside GetPathToChildThatContainsText to determine if the child has the text  */\n\tvirtual bool FilterDoesChildContainText(const TSharedPtr<SelfType>& Child, const FString& InSearch)\n\t{\n\t\treturn Child->DoesDisplayTextContains(InSearch);\n\t}\n\n\tvirtual void GetPathToChildThatContainsText(\n\t\tconst TSharedPtr<SelfType>& Child,\n\t\tconst FString& InSearch,\n\t\tTArray<TArray<TSharedPtr<SelfType>>>& OutNodes\n\t)\n\t{\n\t\t// Child has text, build path to it\n\t\tbool bChildIsVisible;\n\t\tif (FilterDoesChildContainText(Child, InSearch))\n\t\t{\n\t\t\tbChildIsVisible = true;\n\n\t\t\t// Build path to top most parent\n\t\t\tTSharedPtr<SelfType> CurrentNode = Child;\n\t\t\tTArray<TSharedPtr<SelfType>> ChildOutNodes;\n\t\t\twhile (CurrentNode->HasParent())\n\t\t\t{\n\t\t\t\tChildOutNodes.Add(CurrentNode);\n\n\t\t\t\t// Parents are visible too\n\t\t\t\tTSharedPtr<SelfType> CurrentParentNode = CurrentNode->GetParent().Pin();\n\t\t\t\tCurrentParentNode->SetIsVisible(bChildIsVisible);\n\n\t\t\t\t// Advance up the tree\n\t\t\t\tCurrentNode = CurrentParentNode;\n\n\t\t\t\tPostBuildPathToTopMostParent(CurrentParentNode);\n\t\t\t}\n\n\t\t\t// reverse\n\t\t\tAlgo::Reverse(ChildOutNodes);\n\t\t\tOutNodes.Emplace(ChildOutNodes);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tbChildIsVisible = false;\n\t\t}\n\t\tChild->SetIsVisible(bChildIsVisible);\n\n\t\t// Check children\n\t\tfor (const TSharedPtr<SelfType>& GrandChild : Child->GetChildren())\n\t\t{\n\t\t\tGetPathToChildThatContainsText(GrandChild, InSearch, OutNodes);\n\t\t\tGrandChild->SetIsVisible(bChildIsVisible && FilterIsChildVisible(GrandChild));\n\t\t}\n\t}\n\nprotected:\n\t/** Any children listed under this node. */\n\tTArray<TSharedPtr<SelfType>> Children;\n\n\t/** The node that this is a direct child of (empty if this is a root node)  */\n\tTWeakPtr<SelfType> Parent;\n\n\t/** The displayed text for this item. */\n\tFText DisplayText;\n\n\t/** Is this node displayed? */\n\tbool bIsVisible = true;\n};\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystem/Public/TreeViewHelpers/DlgTreeViewParticipantProperties.h",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#pragma once\n\n#include <type_traits>\n#include \"CoreMinimal.h\"\n\n#include \"DlgManager.h\"\n#include \"TreeViewHelpers/DlgTreeViewVariableProperties.h\"\n#include \"TreeViewHelpers/DlgTreeViewHelper.h\"\n\n/** Structure that holds the common properties of a Participant (where it appears and stuff like this) in the STreeView. */\ntemplate <class VariablePropertyType>\nclass FDlgTreeViewParticipantProperties\n{\n\t// Compile time Typecheck if subclass\n\ttypedef typename std::enable_if<std::is_base_of<FDlgTreeViewVariableProperties, VariablePropertyType>::value>::type check;\n\npublic:\n\tFDlgTreeViewParticipantProperties(const TSet<TWeakObjectPtr<const UDlgDialogue>>& InDialogues) : Dialogues(InDialogues) {}\n\tFDlgTreeViewParticipantProperties(const TSet<TWeakObjectPtr<const UDlgDialogue>>&& InDialogues) : Dialogues(InDialogues) {}\n\n\t/** Sorts all the properties it can */\n\tvoid Sort()\n\t{\n\t\tDialogues.Sort(FDlgTreeViewHelper::PredicateSortDialogueWeakPtrAlphabeticallyAscending);\n\t\tfor (const auto& Pair : Events)\n\t\t{\n\t\t\tPair.Value->Sort();\n\t\t}\n\n\t\tFDlgHelper::SortDefault(Events);\n\t\tFDlgHelper::SortDefault(Conditions);\n\t\tFDlgHelper::SortDefault(Integers);\n\t\tFDlgHelper::SortDefault(Floats);\n\t\tFDlgHelper::SortDefault(Bools);\n\t\tFDlgHelper::SortDefault(FNames);\n\t\tFDlgHelper::SortDefault(ClassIntegers);\n\t\tFDlgHelper::SortDefault(ClassFloats);\n\t\tFDlgHelper::SortDefault(ClassBools);\n\t\tFDlgHelper::SortDefault(ClassFNames);\n\t\tFDlgHelper::SortDefault(ClassFTexts);\n\t}\n\n\t// Setters\n\n\t// Add Dialogue that containt this participant.\n\tvoid AddDialogue(TWeakObjectPtr<const UDlgDialogue> Dialogue) { Dialogues.Add(Dialogue); }\n\n\t// Returns the EventName Property\n\tTSharedPtr<VariablePropertyType> AddDialogueToEvent(FName EventName, TWeakObjectPtr<const UDlgDialogue> Dialogue)\n\t{\n\t\treturn AddDialogueToVariable(&Events, EventName, Dialogue);\n\t}\n\n\t// Returns the EventClass Property\n\tTSharedPtr<VariablePropertyType> AddDialogueToCustomEvent(UClass* EventClass, TWeakObjectPtr<const UDlgDialogue> Dialogue)\n\t{\n\t\treturn AddDialogueToVariable<UClass*>(&CustomEvents, EventClass, Dialogue);\n\t}\n\n\t// Returns the ConditionName Property\n\tTSharedPtr<VariablePropertyType> AddDialogueToCondition(FName ConditionName, TWeakObjectPtr<const UDlgDialogue> Dialogue)\n\t{\n\t\treturn AddDialogueToVariable(&Conditions, ConditionName, Dialogue);\n\t}\n\n\t// Returns the IntName Property\n\tTSharedPtr<VariablePropertyType> AddDialogueToIntVariable(FName IntVariableName, TWeakObjectPtr<const UDlgDialogue> Dialogue)\n\t{\n\t\treturn AddDialogueToVariable(&Integers, IntVariableName, Dialogue);\n\t}\n\n\t// Returns the FloatName Property\n\tTSharedPtr<VariablePropertyType> AddDialogueToFloatVariable(FName FloatVariableName, TWeakObjectPtr<const UDlgDialogue> Dialogue)\n\t{\n\t\treturn AddDialogueToVariable(&Floats, FloatVariableName, Dialogue);\n\t}\n\n\t// Returns the BoolName Property\n\tTSharedPtr<VariablePropertyType> AddDialogueToBoolVariable(FName BoolVariableName, TWeakObjectPtr<const UDlgDialogue> Dialogue)\n\t{\n\t\treturn AddDialogueToVariable(&Bools, BoolVariableName, Dialogue);\n\t}\n\n\t// Returns the FName Property\n\tTSharedPtr<VariablePropertyType> AddDialogueToFNameVariable(FName FNameVariableName, TWeakObjectPtr<const UDlgDialogue> Dialogue)\n\t{\n\t\treturn AddDialogueToVariable(&FNames, FNameVariableName, Dialogue);\n\t}\n\n\t// Returns the IntName Property\n\tTSharedPtr<VariablePropertyType> AddDialogueToClassIntVariable(FName IntVariableName, TWeakObjectPtr<const UDlgDialogue> Dialogue)\n\t{\n\t\treturn AddDialogueToVariable(&ClassIntegers, IntVariableName, Dialogue);\n\t}\n\n\t// Returns the FloatName Property\n\tTSharedPtr<VariablePropertyType> AddDialogueToClassFloatVariable(FName FloatVariableName, TWeakObjectPtr<const UDlgDialogue> Dialogue)\n\t{\n\t\treturn AddDialogueToVariable(&ClassFloats, FloatVariableName, Dialogue);\n\t}\n\n\t// Returns the BoolName Property\n\tTSharedPtr<VariablePropertyType> AddDialogueToClassBoolVariable(FName BoolVariableName, TWeakObjectPtr<const UDlgDialogue> Dialogue)\n\t{\n\t\treturn AddDialogueToVariable(&ClassBools, BoolVariableName, Dialogue);\n\t}\n\n\t// Returns the FName Property\n\tTSharedPtr<VariablePropertyType> AddDialogueToClassFNameVariable(FName FNameVariableName, TWeakObjectPtr<const UDlgDialogue> Dialogue)\n\t{\n\t\treturn AddDialogueToVariable(&ClassFNames, FNameVariableName, Dialogue);\n\t}\n\n\t// Returns the FText Property *\n\tTSharedPtr<VariablePropertyType> AddDialogueToClassFTextVariable(FName FTextVariableName, TWeakObjectPtr<const UDlgDialogue> Dialogue)\n\t{\n\t\treturn AddDialogueToVariable(&ClassFTexts, FTextVariableName, Dialogue);\n\t}\n\n\t// Getters\n\tconst TSet<TWeakObjectPtr<const UDlgDialogue>>& GetDialogues() const { return Dialogues; }\n\tconst TMap<FName, TSharedPtr<VariablePropertyType>>& GetEvents() const { return Events; }\n\tconst TMap<UClass*, TSharedPtr<VariablePropertyType>>& GetCustomEvents() const { return CustomEvents; }\n\tconst TMap<FName, TSharedPtr<VariablePropertyType>>& GetConditions() const { return Conditions; }\n\tconst TMap<FName, TSharedPtr<VariablePropertyType>>& GetIntegers() const { return Integers; }\n\tconst TMap<FName, TSharedPtr<VariablePropertyType>>& GetFloats() const { return Floats; }\n\tconst TMap<FName, TSharedPtr<VariablePropertyType>>& GetBools() const { return Bools; }\n\tconst TMap<FName, TSharedPtr<VariablePropertyType>>& GetFNames() const { return FNames; }\n\tconst TMap<FName, TSharedPtr<VariablePropertyType>>& GetClassIntegers() const { return ClassIntegers; }\n\tconst TMap<FName, TSharedPtr<VariablePropertyType>>& GetClassFloats() const { return ClassFloats; }\n\tconst TMap<FName, TSharedPtr<VariablePropertyType>>& GetClassBools() const { return ClassBools; }\n\tconst TMap<FName, TSharedPtr<VariablePropertyType>>& GetClassFNames() const { return ClassFNames; }\n\tconst TMap<FName, TSharedPtr<VariablePropertyType>>& GetClassFTexts() const { return ClassFTexts; }\n\n\t/** Does this participant has any dialogue values of the basic type */\n\tbool HasDialogueValues() const\n\t{\n\t\treturn Integers.Num() > 0 || Floats.Num() > 0 || Bools.Num() > 0 || FNames.Num() > 0;\n\t}\n\n\t/** Does this participant has any variables that belong to the UClass of the participant */\n\tbool HasClassVariables() const\n\t{\n\t\treturn ClassIntegers.Num() > 0 || ClassFloats.Num() > 0 || ClassBools.Num() > 0 || ClassFNames.Num() > 0 || ClassFTexts.Num() > 0;\n\t}\n\n\tbool HasDialogues() const { return Dialogues.Num() > 0; }\n\tbool HasEvents() const { return Events.Num() > 0; }\n\tbool HasCustomEvents() const { return CustomEvents.Num() > 0; }\n\tbool HasConditions() const { return Conditions.Num() > 0; }\n\tbool HasIntegers() const { return Integers.Num() > 0; }\n\tbool HasFloats() const { return Floats.Num() > 0; }\n\tbool HasBools() const { return Bools.Num() > 0; }\n\tbool HasFNames() const { return FNames.Num() > 0; }\n\tbool HasClassIntegers() const { return ClassIntegers.Num() > 0; }\n\tbool HasClassFloats() const { return ClassFloats.Num() > 0; }\n\tbool HasClassBools() const { return ClassBools.Num() > 0; }\n\tbool HasClassFNames() const { return ClassFNames.Num() > 0; }\n\tbool HasClassFTexts() const { return ClassFTexts.Num() > 0; }\n\nprotected:\n\ttemplate <typename KeyType>\n\tTSharedPtr<VariablePropertyType> AddDialogueToVariable(\n\t\tTMap<KeyType, TSharedPtr<VariablePropertyType>>* VariableMap,\n\t\tKeyType VariableKeyValue,\n\t\tTWeakObjectPtr<const UDlgDialogue> Dialogue\n\t)\n\t{\n\t\tTSharedPtr<VariablePropertyType>* VariablePropsPtr = VariableMap->Find(VariableKeyValue);\n\t\tTSharedPtr<VariablePropertyType> VariableProps;\n\t\tif (VariablePropsPtr == nullptr)\n\t\t{\n\t\t\t// Variable does not exist for participant, create it\n\t\t\tconst TSet<TWeakObjectPtr<const UDlgDialogue>> SetArgument{Dialogue};\n\t\t\tVariableProps = MakeShared<VariablePropertyType>(SetArgument);\n\t\t\tVariableMap->Add(VariableKeyValue, VariableProps);\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// exists\n\t\t\tVariableProps = *VariablePropsPtr;\n\t\t\tVariableProps->AddDialogue(Dialogue);\n\t\t}\n\n\t\treturn VariableProps;\n\t}\n\nprotected:\n\t/**\n\t * Dialogues that contain this participant\n\t * NOTE: can't convert it into a map with the key as an FName becaus we can expect duplicate dialogues\n\t */\n\tTSet<TWeakObjectPtr<const UDlgDialogue>> Dialogues;\n\n\t/**\n\t * Events that belong to this participant\n\t * Key: Event Name\n\t * Value: The properties of this event\n\t */\n\tTMap<FName, TSharedPtr<VariablePropertyType>> Events;\n\n\t/**\n\t * Custom Events that belong to this participant\n\t * Key: Custom Event Class\n\t * Value: The properties of this event\n\t */\n\tTMap<UClass*, TSharedPtr<VariablePropertyType>> CustomEvents;\n\n\t/**\n\t * Conditions that belong to this participant\n\t * Key: Condition Name\n\t * Value: The properties of this condition\n\t */\n\tTMap<FName, TSharedPtr<VariablePropertyType>> Conditions;\n\n\t/**\n\t * Int variables that belong to this participant\n\t * Key: Int Variable Name\n\t * Value: The properties of this int variable\n\t */\n\tTMap<FName, TSharedPtr<VariablePropertyType>> Integers;\n\n\t/**\n\t * Float variables that belong to this participant\n\t * Key: Float Variable Name\n\t * Value: The properties of this float variable\n\t */\n\tTMap<FName, TSharedPtr<VariablePropertyType>> Floats;\n\n\t/**\n\t * Bool variables that belong to this participant\n\t * Key: Bool Variable Name\n\t * Value: The properties of this bool variable\n\t */\n\tTMap<FName, TSharedPtr<VariablePropertyType>> Bools;\n\n\t/**\n\t * FNames variables that belong to this participant\n\t * Key: FName Variable Name\n\t * Value: The properties of this FName variable\n\t */\n\tTMap<FName, TSharedPtr<VariablePropertyType>> FNames;\n\n\t/**\n\t * Int variables that belong to the UClass of this participant\n\t * Key: Int Variable Name\n\t * Value: The properties of this int variable\n\t */\n\tTMap<FName, TSharedPtr<VariablePropertyType>> ClassIntegers;\n\n\t/**\n\t * Float variables that belong to the UClass of this participant\n\t * Key: Float Variable Name\n\t * Value: The properties of this float variable\n\t */\n\tTMap<FName, TSharedPtr<VariablePropertyType>> ClassFloats;\n\n\t/**\n\t * Bool variables that belong to the UClass of this participant\n\t * Key: Bool Variable Name\n\t * Value: The properties of this bool variable\n\t */\n\tTMap<FName, TSharedPtr<VariablePropertyType>> ClassBools;\n\n\t/**\n\t * FNames variables that belong to the UClass of this participant\n\t * Key: FName Variable Name\n\t * Value: The properties of this FName variable\n\t */\n\tTMap<FName, TSharedPtr<VariablePropertyType>> ClassFNames;\n\n\t/**\n\t* FText variables that belong to the UClass of this participant\n\t* Key: FText Variable Name\n\t* Value: The properties of this FText variable\n\t*/\n\tTMap<FName, TSharedPtr<VariablePropertyType>> ClassFTexts;\n};\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystem/Public/TreeViewHelpers/DlgTreeViewVariableProperties.h",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#pragma once\n\n#include \"CoreMinimal.h\"\n\n#include \"DlgManager.h\"\n#include \"TreeViewHelpers/DlgTreeViewHelper.h\"\n\nclass UDlgDialogue;\n\n/** Structure that holds the common properties of a Variable. */\nclass DLGSYSTEM_API FDlgTreeViewVariableProperties\n{\npublic:\n\tFDlgTreeViewVariableProperties(const TSet<TWeakObjectPtr<const UDlgDialogue>>& InDialogues) : Dialogues(InDialogues) {}\n\tvirtual ~FDlgTreeViewVariableProperties() {}\n\n\t// Dialogues:\n\tvirtual void AddDialogue(TWeakObjectPtr<const UDlgDialogue> Dialogue) { Dialogues.Add(Dialogue); }\n\tconst TSet<TWeakObjectPtr<const UDlgDialogue>>& GetDialogues() const { return Dialogues; }\n\n\t/** Sorts all the properties it can */\n\tvirtual void Sort()\n\t{\n\t\tDialogues.Sort(FDlgTreeViewHelper::PredicateSortDialogueWeakPtrAlphabeticallyAscending);\n\t}\n\nprotected:\n\t/** Dialogues that contain this variable property */\n\tTSet<TWeakObjectPtr<const UDlgDialogue>> Dialogues;\n};\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystemEditor/DlgSystemEditor.Build.cs",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n\nusing UnrealBuildTool;\nusing System.IO;\n\npublic class DlgSystemEditor : ModuleRules\n{\n\tpublic DlgSystemEditor(ReadOnlyTargetRules Target) : base(Target)\n\t{\n\t\t// Enable IWYU\n\t\t// https://docs.unrealengine.com/latest/INT/Programming/UnrealBuildSystem/IWYUReferenceGuide/index.html\n\t\t// https://docs.unrealengine.com/latest/INT/Programming/UnrealBuildSystem/Configuration/\n\t\tPCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs;\n\t\tbEnforceIWYU = true;\n\t\t//MinFilesUsingPrecompiledHeaderOverride = 1;\n\t\t// bFasterWithoutUnity = true;\n\t\t// bUseUnity = false;\n\t\t//PrivatePCHHeaderFile = \"Private/DlgSystemEditorPrivatePCH.h\";\n\n\t\t//if ((Target.Platform == UnrealTargetPlatform.Win32 || Target.Platform == UnrealTargetPlatform.Win64)\n\t\t//\t&& WindowsPlatform.Compiler >= WindowsCompiler.VisualStudio2015)\n\t\t//{\n\t\t\t//Definitions.Add(\"/Wall\");\n\t\t//}\n\n\t\t// Docs see https://docs.unrealengine.com/latest/INT/Programming/UnrealBuildSystem/ModuleFiles/\n\n\t\tPublicIncludePaths.AddRange(\n\t\t\tnew string[] {\n\t\t\t\tPath.Combine(ModuleDirectory, \"Public\")\n\t\t\t\t// ... add public include paths required here ...\n\t\t\t});\n\n\n\t\tstring PrivateDirectory = Path.Combine(ModuleDirectory, \"Private\");\n\t\tPrivateIncludePaths.AddRange(\n\t\t\tnew string[] {\n\t\t\t\tPrivateDirectory,\n\t\t\t\tPath.Combine(PrivateDirectory, \"Commandlets\")\n\t\t\t\t// ... add other private include paths required here ...\n\t\t\t});\n\n\n\t\tPublicDependencyModuleNames.AddRange(\n\t\t\tnew string[] {\n\t\t\t\t\"Core\",\n\t\t\t\t\"DlgSystem\",\n\t\t\t\t// ... add other public dependencies that you statically link with here ...\n\t\t\t});\n\n\n\t\tPrivateDependencyModuleNames.AddRange(\n\t\t\tnew string[] {\n\t\t\t\t// Core modules\n\t\t\t\t\"Engine\",\n\t\t\t\t\"CoreUObject\",\n\t\t\t\t\"Projects\", // IPluginManager\n\t\t\t\t\"UnrealEd\", // for FAssetEditorManager\n\t\t\t\t\"RenderCore\",\n\t\t\t\t\"InputCore\",\n\t\t\t\t\"SlateCore\",\n\t\t\t\t\"Slate\",\n\t\t\t\t\"EditorStyle\",\n\t\t\t\t\"MessageLog\",\n\t\t\t\t\"EditorWidgets\",\n\n\t\t\t\t// Accessing the menu\n\t\t\t\t\"WorkspaceMenuStructure\",\n\n\t\t\t\t// Details/Property editor\n\t\t\t\t\"DetailCustomizations\",\n\t\t\t\t\"PropertyEditor\",\n\n\t\t\t\t// Used for the Blueprint Nodes\n\t\t\t\t\"BlueprintGraph\",\n\t\t\t\t\"Kismet\",\n\t\t\t\t\"KismetCompiler\",\n\t\t\t\t\"KismetWidgets\",\n\n\t\t\t\t// graph stuff\n\t\t\t\t\"GraphEditor\",\n\t\t\t\t\"ContentBrowser\",\n\n\t\t\t\t// e.g. FPlatformApplicationMisc::ClipboardCopy\n\t\t\t\t\"ApplicationCore\",\n\t\t\t});\n\n#if UE_4_24_OR_LATER\n\t\tPrivateDependencyModuleNames.Add(\"ToolMenus\");\n#endif\n\n\t\tPrivateIncludePathModuleNames.AddRange(\n\t\t\tnew string[] {\n\t\t\t\t\"AssetRegistry\",\n\t\t\t\t\"AssetTools\",\n\t\t\t});\n\n\t\tDynamicallyLoadedModuleNames.AddRange(\n\t\t\tnew string[] {\n\t\t\t\t// ... add any modules that your module loads dynamically here ...\n\t\t\t});\n\t}\n}\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystemEditor/Private/AssetTypeActions/AssetTypeActions_DlgBlueprintDerived.h",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#pragma once\n\n#include \"AssetTypeActions_Base.h\"\n#include \"DlgConditionCustom.h\"\n#include \"DlgEventCustom.h\"\n\n#include \"DlgNodeData.h\"\n#include \"DlgTextArgumentCustom.h\"\n#include \"DialogueEditorUtilities.h\"\n#include \"DlgHelper.h\"\n\nclass IToolkitHost;\n\n/**\n * See FDlgSystemEditorModule::StartupModule for usage.\n * NOTE: all of these are Blueprints but we derrive it here so that it appears nicer in the content browser\n */\nclass FAssetTypeActions_DlgBlueprintDerived : public FAssetTypeActions_Base\n{\npublic:\n\t//\n\t// IAssetTypeActions interface\n\t//\n\tFAssetTypeActions_DlgBlueprintDerived(EAssetTypeCategories::Type InAssetCategory) : AssetCategory(InAssetCategory) {}\n\n\t// Same Color as the Blueprints\n\tFColor GetTypeColor() const override { return FColor(63, 126, 255); }\n\tbool HasActions(const TArray<UObject*>& InObjects) const override { return false; }\n\tuint32 GetCategories() override { return AssetCategory; }\n\tbool CanFilter() override { return true; }\n\tvoid BuildBackendFilter(FARFilter& InFilter) override\n\t{\n\t\tFilterAddNativeParentClassPath(InFilter, GetSupportedClass());\n\n\t\t// Add to filter all native children classes of our supported class\n\t\tTArray<UClass*> NativeChildClasses;\n\t\tTArray<UClass*> BlueprintChildClasses;\n\t\tFDlgHelper::GetAllChildClassesOf(GetSupportedClass(), NativeChildClasses, BlueprintChildClasses);\n\t\tfor (const UClass* ChildNativeClass : NativeChildClasses)\n\t\t{\n\t\t\tFilterAddNativeParentClassPath(InFilter, ChildNativeClass);\n\t\t}\n\n\t\tInFilter.ClassNames.Add(UBlueprint::StaticClass()->GetFName());\n\t\tInFilter.bRecursiveClasses = true;\n\t}\n\n\tstatic void FilterAddNativeParentClassPath(FARFilter& InFilter, const UClass* Class)\n\t{\n\t\tif (Class == nullptr)\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\tconst FString Value = FString::Printf(\n\t\t\tTEXT(\"%s'%s'\"),\n\t\t\t*UClass::StaticClass()->GetName(),\n\t\t\t*Class->GetPathName()\n\t\t);\n\t\tInFilter.TagsAndValues.Add(FBlueprintTags::NativeParentClassPath, Value);\n\t}\n\nprotected:\n\tEAssetTypeCategories::Type AssetCategory;\n};\n\n\nclass FAssetTypeActions_DlgNodeData : public FAssetTypeActions_DlgBlueprintDerived\n{\npublic:\n\t//\n\t// IAssetTypeActions interface\n\t//\n\tFAssetTypeActions_DlgNodeData(EAssetTypeCategories::Type InAssetCategory) : FAssetTypeActions_DlgBlueprintDerived(InAssetCategory) {}\n\n\tFText GetName() const override { return NSLOCTEXT(\"AssetTypeActions\", \"DlgNodeDataAssetTypeActions\", \"Dialogue Node Data Blueprint\"); }\n\tUClass* GetSupportedClass() const override { return UDlgNodeData::StaticClass(); }\n};\n\n\nclass FAssetTypeActions_DlgEventCustom : public FAssetTypeActions_DlgBlueprintDerived\n{\npublic:\n\t//\n\t// IAssetTypeActions interface\n\t//\n\tFAssetTypeActions_DlgEventCustom(EAssetTypeCategories::Type InAssetCategory) : FAssetTypeActions_DlgBlueprintDerived(InAssetCategory) {}\n\n\tFText GetName() const override { return NSLOCTEXT(\"AssetTypeActions\", \"DlgEventCustomAssetTypeActions\", \"Dialogue Custom Event Blueprint\"); }\n\tUClass* GetSupportedClass() const override { return UDlgEventCustom::StaticClass(); }\n};\n\n\nclass FAssetTypeActions_DlgConditionCustom : public FAssetTypeActions_DlgBlueprintDerived\n{\npublic:\n\t//\n\t// IAssetTypeActions interface\n\t//\n\tFAssetTypeActions_DlgConditionCustom(EAssetTypeCategories::Type InAssetCategory) : FAssetTypeActions_DlgBlueprintDerived(InAssetCategory) {}\n\n\tFText GetName() const override { return NSLOCTEXT(\"AssetTypeActions\", \"DlgConditionCustomAssetTypeActions\", \"Dialogue Custom Condition Blueprint\"); }\n\tUClass* GetSupportedClass() const override { return UDlgConditionCustom::StaticClass(); }\n};\n\n\nclass FAssetTypeActions_DlgTextArgumentCustom : public FAssetTypeActions_DlgBlueprintDerived\n{\npublic:\n\t//\n\t// IAssetTypeActions interface\n\t//\n\tFAssetTypeActions_DlgTextArgumentCustom(EAssetTypeCategories::Type InAssetCategory) : FAssetTypeActions_DlgBlueprintDerived(InAssetCategory) {}\n\n\tFText GetName() const override { return NSLOCTEXT(\"AssetTypeActions\", \"DlgTextArgumentCustomAssetTypeActions\", \"Dialogue Custom Text Argument Blueprint\"); }\n\tUClass* GetSupportedClass() const override { return UDlgTextArgumentCustom::StaticClass(); }\n};\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystemEditor/Private/AssetTypeActions/AssetTypeActions_DlgDialogue.cpp",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#include \"AssetTypeActions_DlgDialogue.h\"\n\n#include \"DialogueEditor/DialogueEditor.h\"\n#include \"DlgSystemEditorModule.h\"\n\nvoid FAssetTypeActions_DlgDialogue::GetActions(const TArray<UObject*>& InObjects, FMenuBuilder& MenuBuilder)\n{\n\t// Implement the menu actions here\n}\n\nvoid FAssetTypeActions_DlgDialogue::OpenAssetEditor(const TArray<UObject*>& InObjects,\n\t\t\t\t\t\t\t\t\t\t\t\tTSharedPtr<IToolkitHost> EditWithinLevelEditor)\n{\n\tconst EToolkitMode::Type Mode = EditWithinLevelEditor.IsValid() ? EToolkitMode::WorldCentric : EToolkitMode::Standalone;\n\n\tfor (UObject* Object : InObjects)\n\t{\n\t\t// Only handle dialogues\n\t\tif (UDlgDialogue* Dialogue = Cast<UDlgDialogue>(Object))\n\t\t{\n\t\t\tUE_LOG(LogDlgSystemEditor, Log, TEXT(\"Clicked a Dialogue = `%s`\"), *Dialogue->GetPathName());\n\n\t\t\tTSharedRef<FDialogueEditor> NewDialogueEditor(new FDialogueEditor());\n \t\t\tNewDialogueEditor->InitDialogueEditor(Mode, EditWithinLevelEditor, Dialogue);\n\n\t\t\t// Default Editor\n//\t\t\tFSimpleAssetEditor::CreateEditor(EToolkitMode::Standalone, EditWithinLevelEditor, Dialogue);\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystemEditor/Private/AssetTypeActions/AssetTypeActions_DlgDialogue.h",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#pragma once\n\n#include \"AssetTypeActions_Base.h\"\n\n#include \"DlgDialogue.h\"\n\nclass IToolkitHost;\n\n/**\n * Defines the look and actions the editor takes when clicking/viewing a Dialogue asset.\n * See FDlgSystemEditorModule::StartupModule for usage.\n */\nclass FAssetTypeActions_DlgDialogue : public FAssetTypeActions_Base\n{\npublic:\n\tFAssetTypeActions_DlgDialogue(EAssetTypeCategories::Type InAssetCategory) : AssetCategory(InAssetCategory) {}\n\n\t//\n\t// IAssetTypeActions interface\n\t//\n\n\t/** Returns the name of this type */\n\tFText GetName() const override { return NSLOCTEXT(\"AssetTypeActions\", \"DlgDialogueAssetTypeActions\", \"Dialogue\"); }\n\n\t/** Returns the color associated with this type */\n\tFColor GetTypeColor() const override { return FColor::Yellow; }\n\n\t/** Checks to see if the specified object is handled by this type. */\n\tUClass* GetSupportedClass() const override { return UDlgDialogue::StaticClass(); }\n\n\t// if the menu has actions from another asset, like create dialogue from this text file or idk\n\t/** Returns true if this class can supply actions for InObjects. */\n\tbool HasActions(const TArray<UObject*>& InObjects) const override { return false; }\n\n\t/** Generates a menubuilder for the specified objects. */\n\tvoid GetActions(const TArray<UObject*>& InObjects, FMenuBuilder& MenuBuilder) override;\n\n\t/** Opens the asset editor for the specified objects. If EditWithinLevelEditor is valid, the world-centric editor will be used. */\n\tvoid OpenAssetEditor(const TArray<UObject*>& InObjects, TSharedPtr<IToolkitHost> EditWithinLevelEditor = TSharedPtr<IToolkitHost>()) override;\n\n\t/** Returns the categories that this asset type. The return value is one or more flags from EAssetTypeCategories.  */\n\tuint32 GetCategories() override { return AssetCategory; }\n\n\t// Hide from filtered, we use our custom FFrontendFilter_Dialogue because it allows us more flexibility\n\tbool CanFilter() override { return true; }\n\nprivate:\n\t/** Indicates the category used for Dialogues */\n\tEAssetTypeCategories::Type AssetCategory;\n};\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystemEditor/Private/AssetTypeActions/AssetTypeActions_DlgParticipants.h",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#pragma once\n\n#include \"AssetTypeActions_Base.h\"\n#include \"DlgDialogueParticipant.h\"\n\nclass IToolkitHost;\n\n/**\n * See FDlgSystemEditorModule::StartupModule for usage.\n * Search for all objects\n */\n// class FAssetTypeActions_DlgParticipants : public FAssetTypeActions_Base\n// {\n// public:\n// \t//\n// \t// IAssetTypeActions interface\n// \t//\n// \tFAssetTypeActions_DlgParticipants(EAssetTypeCategories::Type InAssetCategory) : AssetCategory(InAssetCategory) {}\n//\n// \tFText GetName() const override { return NSLOCTEXT(\"AssetTypeActions\", \"DlgParticipantAssetTypeActions\", \"Dialogue Participant\"); }\n// \tUClass* GetSupportedClass() const override { return UObject::StaticClass(); }\n// \tFColor GetTypeColor() const override { return FColor(232, 232, 0); }\n// \tbool HasActions(const TArray<UObject*>& InObjects) const override { return false; }\n// \tuint32 GetCategories() override { return EAssetTypeCategories::Blueprint; }\n// \tbool CanFilter() override { return true; }\n// \tvoid BuildBackendFilter(FARFilter& InFilter) override\n// \t{\n// \t\t// ImplementedInterfaces is an array of structs (FBPInterfaceDescription). When exported to an AR tag value, each entry will be formatted as:\n// \t\t//\n// \t\t//\tEntry := (Interface=Type'Package.Class')\n// \t\t// The full tag value (array of exported struct values) will then be formatted as follows:\n// \t\t//\n// \t\t//  Value := (Entry1,Entry2,...EntryN)\n// \t\tconst FString Value = FString::Printf(\n// \t\t\tTEXT(\"%s\"),\n// \t\t\t*UDlgDialogueParticipant::StaticClass()->GetPathName()\n// \t\t);\n// \t\t//ImplementedInterfaces=/Script/DlgSystem.DlgDialogueParticipant\n// \t\t//ImplementedInterfaces=/Script/DlgSystem.DlgDialogueParticipant\n// \t\tInFilter.TagsAndValues.Add(FBlueprintTags::ImplementedInterfaces, Value);\n//\n// \t\tFBPInterfaceDescription Interface;\n//\n// \t\tInFilter.ClassNames.Add(GetSupportedClass()->GetFName());\n// \t\tInFilter.bRecursiveClasses = true;\n// \t}\n//\n// protected:\n// \tEAssetTypeCategories::Type AssetCategory;\n// };\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystemEditor/Private/BlueprintNodes/DialogueBlueprintUtilities.h",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#pragma once\n\n#include \"CoreMinimal.h\"\n#include \"Kismet2/BlueprintEditorUtils.h\"\n\n#include \"DlgDialogueParticipant.h\"\n#include \"DlgManager.h\"\n\nclass FDialogueBlueprintUtilities\n{\npublic:\n\t// Gets the blueprint for the provided Node\n\tstatic UBlueprint* GetBlueprintForGraphNode(const UK2Node* Node)\n\t{\n\t\tif (!IsValid(Node))\n\t\t{\n\t\t\treturn nullptr;\n\t\t}\n\n\t\t// NOTE we can't call Node->GetBlueprint() because this is called in strange places ;)\n\t\tif (const UEdGraph* Graph = Cast<UEdGraph>(Node->GetOuter()))\n\t\t{\n\t\t\treturn FBlueprintEditorUtils::FindBlueprintForGraph(Graph);\n\t\t}\n\n\t\treturn nullptr;\n\t}\n\n\t// Checks if the Blueprint for the Node is loaded or not.\n\tstatic bool IsBlueprintLoadedForGraphNode(const UK2Node* Node)\n\t{\n\t\tif (UBlueprint* Blueprint = GetBlueprintForGraphNode(Node))\n\t\t{\n\t\t\treturn !Blueprint->HasAnyFlags(RF_NeedLoad | RF_NeedPostLoad);\n\t\t}\n\t\treturn false;\n\t}\n\n\t/**\n\t * Tries to get the dialogue name... it expects the owner of the node to implement IDlgDialogueParticipant interface\n\t * @return\t\tthe participant name on success or NAME_None on failure.\n\t */\n\tstatic FName GetParticipantNameFromNode(const UK2Node* Node)\n\t{\n\t\tif (const UBlueprint* Blueprint = GetBlueprintForGraphNode(Node))\n\t\t{\n\t\t\tif (UDlgManager::DoesObjectImplementDialogueParticipantInterface(Blueprint))\n\t\t\t{\n\t\t\t\treturn IDlgDialogueParticipant::Execute_GetParticipantName(Blueprint->GeneratedClass->GetDefaultObject());\n\t\t\t}\n\t\t}\n\n\t\treturn NAME_None;\n\t}\n};\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystemEditor/Private/BlueprintNodes/DialogueK2Node_Redirects.h",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#pragma once\n\n#include \"DialogueK2Node_Select.h\"\n#include \"DialogueK2Node_SwitchDialogueCallback.h\"\n#include \"DialogueK2Node_SwitchDialogueCallbackVariants.h\"\n\n#include \"DialogueK2Node_Redirects.generated.h\"\n\n// Make the node not appear in the menus\n// So that the user creates only new nodes, instead of old\n#define MAKE_NODE_FITERED_OUT() bool IsActionFilteredOut(FBlueprintActionFilter const& Filter) override { return true; }\n\n// Selects\nUCLASS()\nclass UDlgK2Node_Select : public UDialogueK2Node_Select\n{\n\tGENERATED_BODY()\n\tMAKE_NODE_FITERED_OUT()\n};\n\nUCLASS()\nclass UDlgK2Node_SelectFloat : public UDialogueK2Node_SelectFloat\n{\n\tGENERATED_BODY()\n\tMAKE_NODE_FITERED_OUT()\n};\n\n// Switches\nUCLASS()\nclass UDlgK2Node_SwitchDialogueCallback : public UDialogueK2Node_SwitchDialogueCallback\n{\n\tGENERATED_BODY()\n\tMAKE_NODE_FITERED_OUT()\n};\n\nUCLASS()\nclass UDlgK2Node_SwitchDialogueCallbackEvent : public UDialogueK2Node_SwitchDialogueCallbackEvent\n{\n\tGENERATED_BODY()\n\tMAKE_NODE_FITERED_OUT()\n};\n\nUCLASS()\nclass UDlgK2Node_SwitchDialogueCallbackCondition : public UDialogueK2Node_SwitchDialogueCallbackCondition\n{\n\tGENERATED_BODY()\n\tMAKE_NODE_FITERED_OUT()\n};\n\nUCLASS()\nclass UDlgK2Node_SwitchDialogueCallbackFloatValue : public UDialogueK2Node_SwitchDialogueCallbackFloatValue\n{\n\tGENERATED_BODY()\n\tMAKE_NODE_FITERED_OUT()\n};\n\nUCLASS()\nclass UDlgK2Node_SwitchDialogueCallbackIntValue : public UDialogueK2Node_SwitchDialogueCallbackIntValue\n{\n\tGENERATED_BODY()\n\tMAKE_NODE_FITERED_OUT()\n};\n\nUCLASS()\nclass UDlgK2Node_SwitchDialogueCallbackBoolValue : public UDialogueK2Node_SwitchDialogueCallbackBoolValue\n{\n\tGENERATED_BODY()\n\tMAKE_NODE_FITERED_OUT()\n};\n\n#undef MAKE_NODE_FITERED_OUT\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystemEditor/Private/BlueprintNodes/DialogueK2Node_Select.cpp",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#include \"DialogueK2Node_Select.h\"\n\n#include \"EdGraphUtilities.h\"\n#include \"KismetCompiler.h\"\n#include \"BlueprintNodeSpawner.h\"\n#include \"BlueprintActionDatabaseRegistrar.h\"\n#include \"Kismet/KismetMathLibrary.h\"\n#include \"Kismet/KismetSystemLibrary.h\"\n#include \"EditorStyleSet.h\"\n\n#include \"DlgSystemEditorModule.h\"\n#include \"DlgManager.h\"\n#include \"DialogueBlueprintUtilities.h\"\n\n#define LOCTEXT_NAMESPACE \"DlgK2Node_Select\"\n\nconst FName UDialogueK2Node_Select::PIN_VariableName(TEXT(\"VariableName\"));\nconst FName UDialogueK2Node_Select::PIN_DefaultValue(TEXT(\"DefaultValue\"));\n\n//////////////////////////////////////////////////////////////////////////\n// FKCHandler_DialogueSelect\n// TODO(vampy): Figure out why having the same name for a handler crashes things on linux and only some times in Windows\n// For example if this is name FKCHandler_Select (like the normal K2Node_Select handler) the compiler confuses our node\n// for that node. The name should be irrelevant right? the handler is used as value in a TMap, right????\nclass FKCHandler_DialogueSelect : public FNodeHandlingFunctor\n{\nprotected:\n\t// Mutiple nodes possible? isn't this called only on this node\n\tTMap<UEdGraphNode*, FBPTerminal*> BoolTermMap;\n\npublic:\n\tFKCHandler_DialogueSelect(FKismetCompilerContext& InCompilerContext) : FNodeHandlingFunctor(InCompilerContext)\n\t{\n\t}\n\n\tvoid RegisterNets(FKismetFunctionContext& Context, UEdGraphNode* Node) override\n\t{\n\t\tFNodeHandlingFunctor::RegisterNets(Context, Node);\n\t\tconst UDialogueK2Node_Select* SelectNode = CastChecked<UDialogueK2Node_Select>(Node);\n\n\t\t// Create the net for the return value manually as it's a special case Output Direction pin\n\t\t{\n\t\t\tUEdGraphPin* ReturnPin = SelectNode->GetReturnValuePin();\n\t\t\tFBPTerminal* Term = Context.CreateLocalTerminalFromPinAutoChooseScope(ReturnPin, Context.NetNameMap->MakeValidName(ReturnPin));\n\t\t\tContext.NetMap.Add(ReturnPin, Term);\n\t\t}\n\n\t\t// Create a terminal to determine if the compare was successful or not\n\t\tFBPTerminal* BoolTerm = Context.CreateLocalTerminal();\n\t\tBoolTerm->Type.PinCategory = UEdGraphSchema_K2::PC_Boolean;\n\t\tBoolTerm->Source = Node;\n\t\tBoolTerm->Name = Context.NetNameMap->MakeValidName(Node) + TEXT(\"_CmpSuccess\");\n\t\tBoolTermMap.Add(Node, BoolTerm);\n\t}\n\n\tvoid Compile(FKismetFunctionContext& Context, UEdGraphNode* Node) override\n\t{\n\t\t// Pseudocode of how this is compiled to:\n\t\t// We have N option pins - Options[N]\n\t\t//\n\t\t// IndexValue = ConditionTerm\n\t\t// ReturnValue = ReturnTerm\n\t\t// PrevIfNotStatement = null\n\t\t//\n\t\t// for Option in Options:\n\t\t//    OptionValue = Value of Option\n\t\t//    CallConditionFunctionStatement = AddStatement `BoolTerm = ConditionFunction(IndexValue, OptionValue)`\n\t\t//\n\t\t//    // where the previous statement jumps if it fails\n\t\t//    if PrevIfNotStatement is not null:\n\t\t//       PrevIfNotStatement.JumpTarget = CallConditionFunctionStatement\n\t\t//\n\t\t//    // the target is set above\n\t\t//    IfNotStatement = AddStatement `GoToTargetIfNot(BoolTerm, JumpTarget=null)`\n\t\t//\n\t\t//    // Add return option for this Option\n\t\t//    AddStatement `ReturnValue = OptionValue`\n\t\t//\n\t\t//   PrevIfNotStatement = IfNotStatement\n\t\t//   // add some goto statements that allows us to to safely exit the loop\n\t\t//\n\t\t// // point goto statements to a noop at the end\n\n\t\t// Cast the node and get all the input pins, the options we are selecting from\n\t\tUDialogueK2Node_Select* SelectNode = CastChecked<UDialogueK2Node_Select>(Node);\n\t\tconst TArray<UEdGraphPin*> OptionPins = SelectNode->GetOptionPins();\n\n\t\t// Get the kismet term for the (Condition or Index) that will determine which option to use\n\t\tconst UEdGraphPin* VariableNameConditionPin = FEdGraphUtilities::GetNetFromPin(SelectNode->GetVariableNamePin());\n\t\tFBPTerminal** ConditionTerm = Context.NetMap.Find(VariableNameConditionPin);\n\n\t\t// Get the kismet term for the return value\n\t\tconst UEdGraphPin* ReturnPin = SelectNode->GetReturnValuePin();\n\t\tFBPTerminal** ReturnTerm = Context.NetMap.Find(ReturnPin);\n\n\t\t// Get the kismet term for the default value\n\t\tconst UEdGraphPin* DefaultPin = FEdGraphUtilities::GetNetFromPin(SelectNode->GetDefaultValuePin());\n\t\tFBPTerminal** DefaultTerm = Context.NetMap.Find(DefaultPin);\n\n\t\t// Don't proceed if there is no return value or there is no selection\n\t\tif (ConditionTerm == nullptr || ReturnTerm == nullptr || DefaultTerm == nullptr)\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\t// Get the function that determines how the condition is computed\n\t\tUFunction* ConditionFunction = SelectNode->GetConditionalFunction();\n\n\t\t// Find the local boolean for use in the equality call function below (BoolTerm = result of EqualEqual_NameName)\n\t\t// Aka the result of the ConditionFunction\n\t\tFBPTerminal* BoolTerm = BoolTermMap.FindRef(SelectNode);\n\n\t\t// We need to keep a pointer to the previous IfNot statement so it can be linked to the next conditional statement\n\t\tFBlueprintCompiledStatement* PrevIfNotStatement = nullptr;\n\n\t\t// Keep an array of all the unconditional goto statements so we can clean up their jumps after the noop statement is created\n\t\tTArray<FBlueprintCompiledStatement*> GotoStatementList;\n\n\t\t// Loop through all the options\n\t\tconst int32 OptionsNum = OptionPins.Num();\n\t\tfor (int32 OptionIndex = 0; OptionIndex < OptionsNum; OptionIndex++)\n\t\t{\n\t\t\tUEdGraphPin* OptionPin = OptionPins[OptionIndex];\n\n\t\t\t// Create a CallFunction statement with the condition function from the Select Node class\n\t\t\t// The Previous option (PrevIfNotStatement) points to this CallConditionFunctionStatement\n\t\t\t{\n\t\t\t\t// This is our Condition function.\n\t\t\t\tFBlueprintCompiledStatement& CallConditionFunctionStatement = Context.AppendStatementForNode(Node);\n\t\t\t\tCallConditionFunctionStatement.Type = KCST_CallFunction;\n\t\t\t\tCallConditionFunctionStatement.FunctionToCall = ConditionFunction;\n\t\t\t\tCallConditionFunctionStatement.FunctionContext = nullptr;\n\t\t\t\tCallConditionFunctionStatement.bIsParentContext = false;\n\n\t\t\t\t// BoolTerm will be the return value of the condition statement\n\t\t\t\tCallConditionFunctionStatement.LHS = BoolTerm;\n\n\t\t\t\t// Compare index value == option value\n\t\t\t\t// The condition passed into the Select node\n\t\t\t\tCallConditionFunctionStatement.RHS.Add(*ConditionTerm);\n\n\t\t\t\t// Create a literal/constant for the current option pin\n\t\t\t\tFBPTerminal* LiteralTerm = Context.CreateLocalTerminal(ETerminalSpecification::TS_Literal);\n\t\t\t\tLiteralTerm->bIsLiteral = true;\n\n\t\t\t\t// Does the name of the input pin matches the VariableName Pin value?\n\t\t\t\tLiteralTerm->Type.PinCategory = UEdGraphSchema_K2::PC_Name;\n\t\t\t\tLiteralTerm->Name = OptionPin->PinName.ToString();\n\n\t\t\t\t// Compare against the current literal\n\t\t\t\tCallConditionFunctionStatement.RHS.Add(LiteralTerm);\n\n\t\t\t\t// If there is a previous IfNot statement, hook this one to that one for jumping\n\t\t\t\tif (PrevIfNotStatement)\n\t\t\t\t{\n\t\t\t\t\tCallConditionFunctionStatement.bIsJumpTarget = true;\n\t\t\t\t\tPrevIfNotStatement->TargetLabel = &CallConditionFunctionStatement;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Create a GotoIfNot statement using the BoolTerm from above as the condition\n\t\t\tFBlueprintCompiledStatement* IfNotStatement = &Context.AppendStatementForNode(Node);\n\t\t\tIfNotStatement->Type = KCST_GotoIfNot;\n\t\t\tIfNotStatement->LHS = BoolTerm;\n\n\t\t\t// Create an assignment statement\n\t\t\t// If the option matches, make the return (terminal) be the value of our option\n\t\t\t{\n\t\t\t\tFBlueprintCompiledStatement& AssignStatement = Context.AppendStatementForNode(Node);\n\t\t\t\tAssignStatement.Type = KCST_Assignment;\n\t\t\t\tAssignStatement.LHS = *ReturnTerm;\n\n\t\t\t\t// Get the kismet terminal from the option pin\n\t\t\t\tUEdGraphPin* OptionPinToTry = FEdGraphUtilities::GetNetFromPin(OptionPin);\n\t\t\t\tFBPTerminal** OptionTerm = Context.NetMap.Find(OptionPinToTry);\n\t\t\t\tif (!OptionTerm)\n\t\t\t\t{\n\t\t\t\t\tContext.MessageLog.Error(*LOCTEXT(\"Error_UnregisterOptionPin\", \"Unregister option pin @@\").ToString(), OptionPin);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tAssignStatement.RHS.Add(*OptionTerm);\n\t\t\t}\n\n\t\t\t// Create an unconditional goto to exit the node\n\t\t\tFBlueprintCompiledStatement& GotoStatement = Context.AppendStatementForNode(Node);\n\t\t\tGotoStatement.Type = KCST_UnconditionalGoto;\n\t\t\tGotoStatementList.Add(&GotoStatement);\n\n\t\t\t// If this is the last IfNot statement, hook the next jump target to be the default value\n\t\t\t// as all the options are exhausted\n\t\t\tif (OptionIndex == OptionsNum - 1)\n\t\t\t{\n\t\t\t\tFBlueprintCompiledStatement& AssignStatement = Context.AppendStatementForNode(Node);\n\t\t\t\tAssignStatement.Type = KCST_Assignment;\n\t\t\t\tAssignStatement.bIsJumpTarget = true;\n\t\t\t\tAssignStatement.LHS = *ReturnTerm;\n\t\t\t\tAssignStatement.RHS.Add(*DefaultTerm);\n\n\t\t\t\t// Hook the IfNot statement's jump target to this assign statement\n\t\t\t\tIfNotStatement->TargetLabel = &AssignStatement;\n\t\t\t}\n\n\t\t\tPrevIfNotStatement = IfNotStatement;\n\t\t}\n\n\t\t// Create a noop to jump to so the unconditional goto statements can exit the node after successful assignment\n\t\tFBlueprintCompiledStatement& NopStatement = Context.AppendStatementForNode(Node);\n\t\tNopStatement.Type = KCST_Nop;\n\t\tNopStatement.bIsJumpTarget = true;\n\n\t\t// Loop through the unconditional goto statements and fix their jump targets\n\t\tfor (FBlueprintCompiledStatement* GotoStatement : GotoStatementList)\n\t\t{\n\t\t\tGotoStatement->TargetLabel = &NopStatement;\n\t\t}\n\t}\n};\n\nUDialogueK2Node_Select::UDialogueK2Node_Select(const FObjectInitializer& ObjectInitializer)\n\t: Super(ObjectInitializer)\n{\n\tVariableType = EDlgVariableType::Int;\n\tAdvancedPinDisplay = ENodeAdvancedPins::NoPins;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// Begin UEdGraphNode interface\nvoid UDialogueK2Node_Select::AllocateDefaultPins()\n{\n\tbReconstructNode = false;\n\n\tRefreshVariablePinType();\n\tRefreshPinNames();\n\tconst UEdGraphSchema_K2* Schema = GetDefault<UEdGraphSchema_K2>();\n\n\t// Params for all the pins, only the index is changed.\n\tFCreatePinParams PinParams;\n\n\t// Create the return value\n\t{\n\t\tPinParams.Index = INDEX_PIN_Return;\n\t\tUEdGraphPin* ReturnPin = CreatePin(EGPD_Output, VariablePinType, UEdGraphSchema_K2::PN_ReturnValue, PinParams);\n\t\tReturnPin->bDisplayAsMutableRef = false;\n\t}\n\n\t// Create the variable name pin, the one the selections are based on\n\t{\n\t\tPinParams.Index = INDEX_PIN_VariableName;\n\t\tUEdGraphPin* VariableNamePin = CreatePin(EGPD_Input, UEdGraphSchema_K2::PC_Name, PIN_VariableName, PinParams);\n\t\tVariableNamePin->bDisplayAsMutableRef = false;\n\t\tVariableNamePin->PinToolTip = TEXT(\"The Index/Condition Name that tells what option value to use.\");\n\t\tSchema->SetPinAutogeneratedDefaultValueBasedOnType(VariableNamePin);\n\t}\n\n\t// Create the default value pin\n\t{\n\t\tPinParams.Index = INDEX_PIN_Default;\n\t\tUEdGraphPin* DefaultPin = CreatePin(EGPD_Input, VariablePinType, PIN_DefaultValue, PinParams);\n\t\tDefaultPin->bDisplayAsMutableRef = false;\n\t\tDefaultPin->PinToolTip = TEXT(\"The default value used if the Variable Name does not match any of the options above\");\n\t\tSchema->SetPinAutogeneratedDefaultValueBasedOnType(DefaultPin);\n\t}\n\n\t// Create the option pins at the end of the array\n\tfor (const FName& PinName : PinNames)\n\t{\n\t\t// NOTE: NO PinParams\n\t\tUEdGraphPin* NewPin = CreatePin(EGPD_Input, VariablePinType, PinName);\n\t\tNewPin->bDisplayAsMutableRef = false;\n\t\tSchema->SetPinAutogeneratedDefaultValueBasedOnType(NewPin);\n\t}\n\n\tSuper::AllocateDefaultPins();\n}\n\nvoid UDialogueK2Node_Select::PinTypeChanged(UEdGraphPin* Pin)\n{\n\tconst UEdGraphSchema_K2* Schema = GetDefault<UEdGraphSchema_K2>();\n\n\tif (Pin != GetVariableNamePin())\n\t{\n\t\t// Set the return value\n\t\tUEdGraphPin* ReturnPin = GetReturnValuePin();\n\n\t\t// Recombine the sub pins back into the ReturnPin\n\t\tif (ReturnPin->SubPins.Num() > 0)\n\t\t{\n\t\t\tSchema->RecombinePin(ReturnPin->SubPins[0]);\n\t\t}\n\t\tReturnPin->PinType = Pin->PinType;\n\n\t\t// Recombine all option pins back into their root\n\t\tTArray<UEdGraphPin*> OptionPins = GetOptionPins();\n\t\tfor (UEdGraphPin* OptionPin : OptionPins)\n\t\t{\n\t\t\t// Recombine the sub pins back into the OptionPin\n\t\t\tif (OptionPin->ParentPin == nullptr && OptionPin->SubPins.Num() > 0)\n\t\t\t{\n\t\t\t\tSchema->RecombinePin(OptionPin->SubPins[0]);\n\t\t\t}\n\t\t}\n\n\t\t// Get the options again and set them\n\t\tOptionPins = GetOptionPins();\n\t\tfor (UEdGraphPin* OptionPin : OptionPins)\n\t\t{\n\t\t\tif (OptionPin->PinType != Pin->PinType || OptionPin == Pin)\n\t\t\t{\n\t\t\t\tOptionPin->PinType = Pin->PinType;\n\t\t\t}\n\n\t\t\tif (!Schema->IsPinDefaultValid(OptionPin, OptionPin->DefaultValue, OptionPin->DefaultObject, OptionPin->DefaultTextValue).IsEmpty())\n\t\t\t{\n\t\t\t\tSchema->ResetPinToAutogeneratedDefaultValue(OptionPin);\n\t\t\t}\n\t\t}\n\n\t\t// Recombine default pin\n\t\tUEdGraphPin* DefaultPin = GetDefaultValuePin();\n\t\tif (DefaultPin->ParentPin == nullptr && DefaultPin->SubPins.Num() > 0)\n\t\t{\n\t\t\tSchema->RecombinePin(DefaultPin->SubPins[0]);\n\t\t}\n\t\tDefaultPin->PinType = Pin->PinType;\n\n\t\tbReconstructNode = true;\n\t}\n}\n\n\nvoid UDialogueK2Node_Select::NodeConnectionListChanged()\n{\n\tSuper::NodeConnectionListChanged();\n\n\tif (bReconstructNode)\n\t{\n\t\tReconstructNode();\n\n\t\tUBlueprint* Blueprint = GetBlueprint();\n\t\tif (!Blueprint->bBeingCompiled)\n\t\t{\n\t\t\tFBlueprintEditorUtils::MarkBlueprintAsModified(Blueprint);\n\t\t\tBlueprint->BroadcastChanged();\n\t\t}\n\t}\n}\n\nFText UDialogueK2Node_Select::GetTooltipText() const\n{\n\treturn LOCTEXT(\"DlgSelectNodeTooltipInt\", \"Return the int variable based on the name\");\n}\n\nFText UDialogueK2Node_Select::GetNodeTitle(ENodeTitleType::Type TitleType) const\n{\n\treturn LOCTEXT(\"DlgSelectInt\", \"Select Dialogue Int\");\n}\n\nFSlateIcon UDialogueK2Node_Select::GetIconAndTint(FLinearColor& OutColor) const\n{\n\tstatic FSlateIcon Icon(FEditorStyle::GetStyleSetName(), \"GraphEditor.Select_16x\");\n\treturn Icon;\n}\n// End UEdGraphNode interface\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// Begin UK2Node Interface\nFNodeHandlingFunctor* UDialogueK2Node_Select::CreateNodeHandler(FKismetCompilerContext& CompilerContext) const\n{\n\treturn static_cast<FNodeHandlingFunctor*>(new FKCHandler_DialogueSelect(CompilerContext));\n}\n\nbool UDialogueK2Node_Select::IsConnectionDisallowed(const UEdGraphPin* MyPin, const UEdGraphPin* OtherPin, FString& OutReason) const\n{\n\tif (OtherPin && (OtherPin->PinType.PinCategory == UEdGraphSchema_K2::PC_Exec))\n\t{\n\t\tOutReason = LOCTEXT(\"ExecConnectionDisallowed\", \"Cannot connect with Exec pin.\").ToString();\n\t\treturn true;\n\t}\n\n\treturn Super::IsConnectionDisallowed(MyPin, OtherPin, OutReason);\n}\n\n/** Determine if any pins are connected, if so make all the other pins the same type, if not, make sure pins are switched back to wildcards */\nvoid UDialogueK2Node_Select::NotifyPinConnectionListChanged(UEdGraphPin* Pin)\n{\n\tSuper::NotifyPinConnectionListChanged(Pin);\n\n\t// Check for WildCard pins\n\tif (Pin != GetVariableNamePin())\n\t{\n\t\t// Grab references to all option pins and the return pin\n\t\tconst TArray<UEdGraphPin*> OptionPins = GetOptionPins();\n\t\tconst UEdGraphPin* ReturnPin = GetReturnValuePin();\n\t\tconst UEdGraphPin* DefaultPin = GetDefaultValuePin();\n\n\t\t// See if this pin is one of the wildcard pins\n\t\tconst bool bIsWildcardPin = (Pin == ReturnPin || Pin == DefaultPin || OptionPins.Find(Pin) != INDEX_NONE)\n\t\t\t\t&& Pin->PinType.PinCategory == UEdGraphSchema_K2::PC_Wildcard;\n\n\t\t// If the pin was one of the wildcards we have to handle it specially\n\t\tif (bIsWildcardPin)\n\t\t{\n\t\t\t// If the pin is linked, make sure the other wildcard pins match\n\t\t\tif (Pin->LinkedTo.Num() > 0)\n\t\t\t{\n\t\t\t\tconst UEdGraphPin* LinkPin = Pin->LinkedTo[0];\n\n\t\t\t\t// Linked pin type differs, change this type, change type\n\t\t\t\tif (Pin->PinType != LinkPin->PinType)\n\t\t\t\t{\n\t\t\t\t\tPin->PinType = LinkPin->PinType;\n\t\t\t\t\tPinTypeChanged(Pin);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nvoid UDialogueK2Node_Select::GetMenuActions(FBlueprintActionDatabaseRegistrar& ActionRegistrar) const\n{\n\t// actions get registered under specific object-keys; the idea is that\n\t// actions might have to be updated (or deleted) if their object-key is\n\t// mutated (or removed)... here we use the node's class (so if the node\n\t// type disappears, then the action should go with it)\n\tUClass* ActionKey = GetClass();\n\n\t// to keep from needlessly instantiating a UBlueprintNodeSpawner, first\n\t// check to make sure that the registrar is looking for actions of this type\n\t// (could be regenerating actions for a specific asset, and therefore the\n\t// registrar would only accept actions corresponding to that asset)\n\tif (ActionRegistrar.IsOpenForRegistration(ActionKey))\n\t{\n\t\tUBlueprintNodeSpawner* NodeSpawner = UBlueprintNodeSpawner::Create(GetClass());\n\t\tcheck(NodeSpawner);\n\n\t\tActionRegistrar.AddBlueprintAction(ActionKey, NodeSpawner);\n\t}\n}\n\nFText UDialogueK2Node_Select::GetMenuCategory() const\n{\n\treturn LOCTEXT(\"DlgGetMenuCategory\", \"Dialogue|Select\");\n}\n\nvoid UDialogueK2Node_Select::PostReconstructNode()\n{\n\t// After ReconstructNode we must be sure that no additional reconstruction is required\n\tbReconstructNode = false;\n\n\tUEdGraphPin* ReturnPin = GetReturnValuePin();\n\n\t// Wild card pin? set types depending on options\n\tconst bool bFillTypeFromConnected = ReturnPin && (ReturnPin->PinType.PinCategory == UEdGraphSchema_K2::PC_Wildcard);\n\tif (bFillTypeFromConnected)\n\t{\n\t\tcheck(VariablePinType == ReturnPin->PinType.PinCategory);\n\t\tFEdGraphPinType PinType = ReturnPin->PinType;\n\n\t\t// Determine from Return pin type connection\n\t\tif (ReturnPin->LinkedTo.Num() > 0)\n\t\t{\n\t\t\tPinType = ReturnPin->LinkedTo[0]->PinType;\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// Determine from Default pin type connection\n\t\t\tconst UEdGraphPin* DefaultPin = GetDefaultValuePin();\n\t\t\tif (DefaultPin && DefaultPin->LinkedTo.Num() > 0)\n\t\t\t{\n\t\t\t\tPinType = DefaultPin->LinkedTo[0]->PinType;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t// Determine from one of the option pin types connections\n\t\t\t\tconst TArray<UEdGraphPin*> OptionPins = GetOptionPins();\n\t\t\t\tfor (const UEdGraphPin* Pin : OptionPins)\n\t\t\t\t{\n\t\t\t\t\tif (Pin && Pin->LinkedTo.Num() > 0)\n\t\t\t\t\t{\n\t\t\t\t\t\tPinType = Pin->LinkedTo[0]->PinType;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tReturnPin->PinType = PinType;\n\t\tPinTypeChanged(ReturnPin);\n\t}\n\n\tSuper::PostReconstructNode();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// Begin own functions\nUFunction* UDialogueK2Node_Select::GetConditionalFunction()\n{\n\t// The IndexPin (select by type)  is always an String (FName), so only use that\n\tconst FName FunctionName = GET_FUNCTION_NAME_CHECKED(UKismetMathLibrary, EqualEqual_NameName);\n\n#if ENGINE_MINOR_VERSION >= 25\n\treturn FindUField<UFunction>(UKismetMathLibrary::StaticClass(), FunctionName);\n#else\n\treturn FindField<UFunction>(UKismetMathLibrary::StaticClass(), FunctionName);\n#endif\n}\n\nvoid UDialogueK2Node_Select::GetPrintStringFunction(FName& FunctionName, UClass** FunctionClass)\n{\n\tFunctionName = GET_FUNCTION_NAME_CHECKED(UKismetSystemLibrary, PrintWarning);\n\t*FunctionClass = UKismetSystemLibrary::StaticClass();\n}\n\nbool UDialogueK2Node_Select::RefreshPinNames()\n{\n\t// Stop anything if the blueprint is loading, this can happen because we now have reference to blueprint UClasses (reflection system) from the UDlgDialogue\n\tif (!FDialogueBlueprintUtilities::IsBlueprintLoadedForGraphNode(this))\n\t{\n\t\treturn false;\n\t}\n\n\tconst FName ParticipantName = FDialogueBlueprintUtilities::GetParticipantNameFromNode(this);\n\tif (ParticipantName == NAME_None && VariableType != EDlgVariableType::SpeakerState)\n\t{\n\t\treturn false;\n\t}\n\n\tTArray<FName> NewPinNames;\n\tswitch (VariableType)\n\t{\n\t\tcase EDlgVariableType::Float:\n\t\t\tUDlgManager::GetAllDialoguesFloatNames(ParticipantName, NewPinNames);\n\t\t\tbreak;\n\n\t\tcase EDlgVariableType::Int:\n\t\t\tUDlgManager::GetAllDialoguesIntNames(ParticipantName, NewPinNames);\n\t\t\tbreak;\n\n\t\tcase EDlgVariableType::Name:\n\t\t\tUDlgManager::GetAllDialoguesNameNames(ParticipantName, NewPinNames);\n\t\t\tbreak;\n\n\t\tcase EDlgVariableType::SpeakerState:\n\t\t\tUDlgManager::GetAllDialoguesSpeakerStates(NewPinNames);\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tunimplemented();\n\t}\n\n\t// Size changed, simply copy\n\tif (NewPinNames.Num() != PinNames.Num())\n\t{\n\t\tPinNames = NewPinNames;\n\t\treturn true;\n\t}\n\n\t// Find any difference, if any\n\tfor (int32 i = 0; i < NewPinNames.Num(); ++i)\n\t{\n\t\tif (NewPinNames[i] != PinNames[i])\n\t\t{\n\t\t\tPinNames = NewPinNames;\n\t\t\treturn true;\n\t\t}\n\t}\n\n\treturn false;\n}\n// End own functions\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// UDlgK2Node_SelectFloat\n// float variant\nUDialogueK2Node_SelectFloat::UDialogueK2Node_SelectFloat(const FObjectInitializer& ObjectInitializer)\n\t: Super(ObjectInitializer)\n{\n\tVariableType = EDlgVariableType::Float;\n}\n\nFText UDialogueK2Node_SelectFloat::GetTooltipText() const\n{\n\treturn LOCTEXT(\"DlgSelectNodeTooltipFloat\", \"Return the float variable based on the name\");\n}\n\nFText UDialogueK2Node_SelectFloat::GetNodeTitle(ENodeTitleType::Type TitleType) const\n{\n\treturn LOCTEXT(\"DlgSelectFloat\", \"Select Dialogue Float\");\n}\n\n\n// name variant\nUDialogueK2Node_SelectName::UDialogueK2Node_SelectName(const FObjectInitializer& ObjectInitializer)\n\t: Super(ObjectInitializer)\n{\n\tVariableType = EDlgVariableType::Name;\n}\n\nFText UDialogueK2Node_SelectName::GetTooltipText() const\n{\n\treturn LOCTEXT(\"DlgSelectNodeTooltipName\", \"Return the name variable based on the name\");\n}\n\nFText UDialogueK2Node_SelectName::GetNodeTitle(ENodeTitleType::Type TitleType) const\n{\n\treturn LOCTEXT(\"DlgSelectName\", \"Select Dialogue Name\");\n}\n\n\n// speaker state variant\nUDialogueK2Node_SelectOnSpeakerState::UDialogueK2Node_SelectOnSpeakerState(const FObjectInitializer& ObjectInitializer)\n\t: Super(ObjectInitializer)\n{\n\tVariableType = EDlgVariableType::SpeakerState;\n}\n\nFText UDialogueK2Node_SelectOnSpeakerState::GetTooltipText() const\n{\n\treturn LOCTEXT(\"DlgSelectNodeTooltipOnSpeakerState\", \"Return the selected input based on the speaker state\");\n}\n\nFText UDialogueK2Node_SelectOnSpeakerState::GetNodeTitle(ENodeTitleType::Type TitleType) const\n{\n\treturn LOCTEXT(\"DlgSelectOnSpeakerState\", \"Select Dialogue SpeakerState\");\n}\n\n#undef LOCTEXT_NAMESPACE\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystemEditor/Private/BlueprintNodes/DialogueK2Node_Select.h",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#pragma once\n\n#include \"K2Node.h\"\n#include \"EdGraphSchema_K2.h\"\n\n#include \"DialogueK2Node_Select.generated.h\"\n\n\nUENUM()\nenum class EDlgVariableType : uint8\n{\n\tFloat\t\t\tUMETA(DisplayName = \"Dialogue Float Variable\"),\n\tInt\t\t\t\tUMETA(DisplayName = \"Dialogue Int Variable\"),\n\tName\t\t\tUMETA(DisplayName = \"Dialogue Name Variable\"),\n\tSpeakerState\tUMETA(DisplayName = \"Dialogue Speaker State\"),\n};\n\n/**\n * Select BlueprintNode Based on UK2Node_Select\n */\nUCLASS(MinimalAPI, Meta=(Keywords = \"Ternary If\"))\nclass UDialogueK2Node_Select : public UK2Node\n{\n\tGENERATED_BODY()\n\npublic:\n\tUDialogueK2Node_Select(const FObjectInitializer& ObjectInitializer);\n\n\t//~ Begin UEdGraphNode Interface\n\tvoid AllocateDefaultPins() override;\n\tvoid PinTypeChanged(UEdGraphPin* Pin) override;\n\tFText GetTooltipText() const override;\n\tvoid NodeConnectionListChanged() override;\n\tFText GetNodeTitle(ENodeTitleType::Type TitleType) const override;\n\tFSlateIcon GetIconAndTint(FLinearColor& OutColor) const override;\n\t//~ End UEdGraphNode Interface\n\n\t//~ Begin UK2Node Interface\n\tbool IsNodeSafeToIgnore() const override { return true; }\n\tbool IsNodePure() const override { return true; }\n\tclass FNodeHandlingFunctor* CreateNodeHandler(class FKismetCompilerContext& CompilerContext) const override;\n\tbool IsConnectionDisallowed(const UEdGraphPin* MyPin, const UEdGraphPin* OtherPin, FString& OutReason) const override;\n\tvirtual void NotifyPinConnectionListChanged(UEdGraphPin* Pin) override;\n\tvoid GetMenuActions(FBlueprintActionDatabaseRegistrar& ActionRegistrar) const override;\n\tFText GetMenuCategory() const override;\n\tint32 GetNodeRefreshPriority() const override { return EBaseNodeRefreshPriority::Normal; }\n\tvoid PostReconstructNode() override;\n\t//~ End UK2Node Interface\n\n\t// Begin own functions\n\t/** Gets the return value pin */\n\tUEdGraphPin* GetReturnValuePin() const\n\t{\n\t\tcheck(Pins.IsValidIndex(INDEX_PIN_Return) && Pins[INDEX_PIN_Return]->PinName == UEdGraphSchema_K2::PN_ReturnValue)\n\t\treturn Pins[INDEX_PIN_Return];\n\t}\n\n\t// The return pin is alright, because it is the only output pin\n\t/** Gets the condition pin */\n\tUEdGraphPin* GetVariableNamePin() const\n\t{\n\t\tcheck(Pins.IsValidIndex(INDEX_PIN_VariableName) && Pins[INDEX_PIN_VariableName]->PinName == PIN_VariableName)\n\t\treturn Pins[INDEX_PIN_VariableName];\n\t}\n\n\t/** Gets the default value pin */\n\tUEdGraphPin* GetDefaultValuePin() const\n\t{\n\t\tcheck(Pins.IsValidIndex(INDEX_PIN_Default) && Pins[INDEX_PIN_Default]->PinName == PIN_DefaultValue)\n\t\treturn Pins[INDEX_PIN_Default];\n\t}\n\n\t/** Returns a list of pins that represent the selectable options */\n\tconst TArray<UEdGraphPin*> GetOptionPins() const\n\t{\n\t\t// The end of the array is all option pins\n\t\tTArray<UEdGraphPin*> OptionPins;\n\t\tfor (int32 PinIndex = INDEX_PIN_OPTIONS_START, PinsNum = Pins.Num(); PinIndex < PinsNum; PinIndex++)\n\t\t{\n\t\t\t// check(Pins[PinIndex]->PinType.PinCategory == VariablePinType);\n\t\t\tOptionPins.Add(Pins[PinIndex]);\n\t\t}\n\n\t\treturn OptionPins;\n\t}\n\n\t/** Gets the function that compares FNames (EqualEqual_NameName function) */\n\tstatic UFunction* GetConditionalFunction();\n\n\t/** Gets the name and class of the PrintString function */\n\tstatic void GetPrintStringFunction(FName& FunctionName, UClass** FunctionClass);\n\n\t/** Refreshes the PinNames array */\n\tbool RefreshPinNames();\n\nprivate:\n\t/** Refreshes the VariablePinType  */\n\tvoid RefreshVariablePinType()\n\t{\n\t\tswitch (VariableType)\n\t\t{\n\t\tcase EDlgVariableType::Float:\n\t\t\tVariablePinType = UEdGraphSchema_K2::PC_Float;\n\t\t\tbreak;\n\t\tcase EDlgVariableType::Int:\n\t\t\tVariablePinType = UEdGraphSchema_K2::PC_Int;\n\t\t\tbreak;\n\t\tcase EDlgVariableType::Name:\n\t\t\tVariablePinType = UEdGraphSchema_K2::PC_Name;\n\t\t\tbreak;\n\t\tcase EDlgVariableType::SpeakerState:\n\t\t\tVariablePinType = UEdGraphSchema_K2::PC_Wildcard;\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tunimplemented();\n\t\t}\n\t}\n\npublic:\n\t// Constants for the location of the input/output pins in the Pins array\n\tstatic constexpr int32 INDEX_PIN_Return = 0;\n\tstatic constexpr int32 INDEX_PIN_VariableName = 1;\n\tstatic constexpr int32 INDEX_PIN_Default = 2;\n\tstatic constexpr int32 INDEX_PIN_OPTIONS_START = 3;\n\nprotected:\n\t/** List of the current entries (Pin Names) based on owner dialogue name and on all dialogues */\n\tUPROPERTY()\n\tTArray<FName> PinNames;\n\n\tUPROPERTY()\n\tEDlgVariableType VariableType;\n\n\t// The pin type of this select\n\tUPROPERTY()\n\tFName VariablePinType;\n\n\t/** Whether we need to reconstruct the node after the pins have changed */\n\tUPROPERTY(Transient)\n\tbool bReconstructNode;\n\n\t// Constants.\n\tstatic const FName PIN_VariableName; // index\n\tstatic const FName PIN_DefaultValue;\n};\n\n/**\n *  Float variant\n */\nUCLASS(MinimalAPI, Meta=(Keywords = \"Ternary If\"))\nclass UDialogueK2Node_SelectFloat : public UDialogueK2Node_Select\n{\n\tGENERATED_BODY()\n\npublic:\n\tUDialogueK2Node_SelectFloat(const FObjectInitializer& ObjectInitializer);\n\n\t//~ Begin UEdGraphNode Interface\n\tFText GetTooltipText() const override;\n\tFText GetNodeTitle(ENodeTitleType::Type TitleType) const override;\n};\n\n/**\n *  Name variant\n */\nUCLASS(MinimalAPI, Meta=(Keywords = \"Ternary If\"))\nclass UDialogueK2Node_SelectName : public UDialogueK2Node_Select\n{\n\tGENERATED_BODY()\n\npublic:\n\tUDialogueK2Node_SelectName(const FObjectInitializer& ObjectInitializer);\n\n\t//~ Begin UEdGraphNode Interface\n\tFText GetTooltipText() const override;\n\tFText GetNodeTitle(ENodeTitleType::Type TitleType) const override;\n};\n\n/**\n *  SpeakerState variant\n */\nUCLASS(MinimalAPI, Meta=(Keywords = \"Ternary If\"))\nclass UDialogueK2Node_SelectOnSpeakerState : public UDialogueK2Node_Select\n{\n\tGENERATED_BODY()\n\npublic:\n\tUDialogueK2Node_SelectOnSpeakerState(const FObjectInitializer& ObjectInitializer);\n\n\t//~ Begin UEdGraphNode Interface\n\tFText GetTooltipText() const override;\n\tFText GetNodeTitle(ENodeTitleType::Type TitleType) const override;\n};\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystemEditor/Private/BlueprintNodes/DialogueK2Node_SwitchDialogueCallback.cpp",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#include \"DialogueK2Node_SwitchDialogueCallback.h\"\n\n#include \"BlueprintNodeSpawner.h\"\n#include \"BlueprintActionDatabaseRegistrar.h\"\n#include \"EdGraphSchema_K2.h\"\n#include \"Kismet/KismetMathLibrary.h\"\n#include \"UObject/UObjectIterator.h\"\n\n#include \"DlgSystemEditorModule.h\"\n#include \"DlgManager.h\"\n#include \"DialogueBlueprintUtilities.h\"\n\n#define LOCTEXT_NAMESPACE \"DlgK2Node_Select\"\n\nUDialogueK2Node_SwitchDialogueCallback::UDialogueK2Node_SwitchDialogueCallback(const FObjectInitializer& ObjectInitializer)\n\t: Super(ObjectInitializer)\n{\n\tFunctionName = TEXT(\"NotEqual_NameName\");\n\tFunctionClass = UKismetMathLibrary::StaticClass();\n\tbHasDefaultPin = true;\n\tAdvancedPinDisplay = ENodeAdvancedPins::NoPins;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// Begin UEdGraphNode interface\nvoid UDialogueK2Node_SwitchDialogueCallback::AllocateDefaultPins()\n{\n\tRefreshPinNames();\n\tSuper::AllocateDefaultPins();\n}\n\nFText UDialogueK2Node_SwitchDialogueCallback::GetNodeTitle(ENodeTitleType::Type TitleType) const\n{\n\treturn LOCTEXT(\"DlgCallbackSwitch_NodeTitle\", \"Switch on Relevant Dialogue Callback\");\n}\n\nFText UDialogueK2Node_SwitchDialogueCallback::GetTooltipText() const\n{\n\treturn LOCTEXT(\"DlgCallbackSwitch_Tooltip\", \"Selects an output based on the input\");\n}\n// End UEdGraphNode interface\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// Begin UK2Node Interface\nvoid UDialogueK2Node_SwitchDialogueCallback::GetMenuActions(FBlueprintActionDatabaseRegistrar& ActionRegistrar) const\n{\n\t// actions get registered under specific object-keys; the idea is that\n\t// actions might have to be updated (or deleted) if their object-key is\n\t// mutated (or removed)... here we use the node's class (so if the node\n\t// type disappears, then the action should go with it)\n\tUClass* ActionKey = GetClass();\n\n\t// to keep from needlessly instantiating a UBlueprintNodeSpawner, first\n\t// check to make sure that the registrar is looking for actions of this type\n\t// (could be regenerating actions for a specific asset, and therefore the\n\t// registrar would only accept actions corresponding to that asset)\n\tif (ActionRegistrar.IsOpenForRegistration(ActionKey))\n\t{\n\t\tUBlueprintNodeSpawner* NodeSpawner = UBlueprintNodeSpawner::Create(GetClass());\n\t\tcheck(NodeSpawner);\n\n\t\tActionRegistrar.AddBlueprintAction(ActionKey, NodeSpawner);\n\t}\n}\n\nFText UDialogueK2Node_SwitchDialogueCallback::GetMenuCategory() const\n{\n\treturn LOCTEXT(\"DlgCallbackSwitch_MenuCategory\", \"Dialogue|Switch\");\n}\n\nvoid UDialogueK2Node_SwitchDialogueCallback::CreateSelectionPin()\n{\n\tconst UEdGraphSchema_K2* K2Schema = GetDefault<UEdGraphSchema_K2>();\n\tUEdGraphPin* Pin = CreatePin(EGPD_Input, K2Schema->PC_Name, GetSelectionPinName());\n\tK2Schema->SetPinAutogeneratedDefaultValueBasedOnType(Pin);\n}\n// End UK2Node Interface\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// Begin UK2Node_Switch Interface\nFEdGraphPinType UDialogueK2Node_SwitchDialogueCallback::GetPinType() const\n{\n\tFEdGraphPinType PinType;\n\tPinType.PinCategory = UEdGraphSchema_K2::PC_Name;\n\treturn PinType;\n}\n\nvoid UDialogueK2Node_SwitchDialogueCallback::RemovePinFromSwitchNode(UEdGraphPin* TargetPin)\n{\n\t// Stop removing option pins, should never arrive here\n\tif (TargetPin != GetDefaultPin())\n\t{\n\t\treturn;\n\t}\n\n\tSuper::RemovePinFromSwitchNode(TargetPin);\n}\n\nbool UDialogueK2Node_SwitchDialogueCallback::CanRemoveExecutionPin(UEdGraphPin* TargetPin) const\n{\n\t// Do not allow to remove normal pins, only the execution pin\n\tif (TargetPin != GetDefaultPin())\n\t{\n\t\treturn false;\n\t}\n\n\treturn Super::CanRemoveExecutionPin(TargetPin);\n}\n\nFName UDialogueK2Node_SwitchDialogueCallback::GetPinNameGivenIndex(int32 Index) const\n{\n\treturn Index < DialoguePinNames.Num() ? DialoguePinNames[Index] : NAME_None;\n}\n\nFName UDialogueK2Node_SwitchDialogueCallback::GetUniquePinName()\n{\n\tcheckNoEntry();\n\treturn NAME_None;\n}\n\nvoid UDialogueK2Node_SwitchDialogueCallback::CreateCasePins()\n{\n\tconst UEdGraphSchema_K2* K2Schema = GetDefault<UEdGraphSchema_K2>();\n\tfor (const auto& PinName : DialoguePinNames)\n\t{\n\t\tCreatePin(EGPD_Output, K2Schema->PC_Exec, PinName);\n\t}\n}\n\nvoid UDialogueK2Node_SwitchDialogueCallback::CreateFunctionPin()\n{\n\t// Copied from base class, because it is not exported\n\t// TODO PR\n\t// Set properties on the function pin\n\tUEdGraphPin* FunctionPin = CreatePin(EGPD_Input, UEdGraphSchema_K2::PC_Object, FunctionClass, FunctionName);\n\tFunctionPin->bDefaultValueIsReadOnly = true;\n\tFunctionPin->bNotConnectable = true;\n\tFunctionPin->bHidden = true;\n\n#if ENGINE_MINOR_VERSION >= 25\n\tUFunction* Function = FindUField<UFunction>(FunctionClass, FunctionName);\n#else\n\tUFunction* Function = FindField<UFunction>(FunctionClass, FunctionName);\n#endif\n\tconst bool bIsStaticFunc = Function->HasAllFunctionFlags(FUNC_Static);\n\tif (bIsStaticFunc)\n\t{\n\t\t// Wire up the self to the CDO of the class if it's not us\n\t\tif (UBlueprint* BP = GetBlueprint())\n\t\t{\n\t\t\tUClass* FunctionOwnerClass = Function->GetOuterUClass();\n\t\t\tif (!BP->SkeletonGeneratedClass->IsChildOf(FunctionOwnerClass))\n\t\t\t{\n\t\t\t\tFunctionPin->DefaultObject = FunctionOwnerClass->GetDefaultObject();\n\t\t\t}\n\t\t}\n\t}\n}\n\nvoid UDialogueK2Node_SwitchDialogueCallback::AddPinToSwitchNode()\n{\n\t// overwrite default behaviour, should never be used\n\tif (RefreshPinNames())\n\t{\n\t\tReconstructNode();\n\t}\n}\n// End UK2Node_Switch Interface\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// Begin own functions\nbool UDialogueK2Node_SwitchDialogueCallback::RefreshPinNames()\n{\n\tconst FName ParticipantName = FDialogueBlueprintUtilities::GetParticipantNameFromNode(this);\n\tif (ParticipantName == NAME_None)\n\t{\n\t\treturn false;\n\t}\n\n\tTArray<FName> NewPinNames;\n\tswitch (CallbackType)\n\t{\n\t\tcase EDlgDialogueCallback::Event:\n\t\t\tUDlgManager::GetAllDialoguesEventNames(ParticipantName, NewPinNames);\n\t\t\tbreak;\n\n\t\tcase EDlgDialogueCallback::Condition:\n\t\t\tUDlgManager::GetAllDialoguesConditionNames(ParticipantName, NewPinNames);\n\t\t\tbreak;\n\n\t\tcase EDlgDialogueCallback::FloatValue:\n\t\t\tUDlgManager::GetAllDialoguesFloatNames(ParticipantName, NewPinNames);\n\t\t\tbreak;\n\n\t\tcase EDlgDialogueCallback::IntValue:\n\t\t\tUDlgManager::GetAllDialoguesIntNames(ParticipantName, NewPinNames);\n\t\t\tbreak;\n\n\t\tcase EDlgDialogueCallback::BoolValue:\n\t\t\tUDlgManager::GetAllDialoguesBoolNames(ParticipantName, NewPinNames);\n\t\t\tbreak;\n\n\t\tcase EDlgDialogueCallback::NameValue:\n\t\t\tUDlgManager::GetAllDialoguesNameNames(ParticipantName, NewPinNames);\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tunimplemented();\n\t}\n\n\t// Size changed, simply copy\n\tif (NewPinNames.Num() != DialoguePinNames.Num())\n\t{\n\t\tDialoguePinNames = NewPinNames;\n\t\treturn true;\n\t}\n\n\t// Find any difference, if any\n\tfor (int32 i = 0; i < NewPinNames.Num(); ++i)\n\t{\n\t\tif (NewPinNames[i] != DialoguePinNames[i])\n\t\t{\n\t\t\tDialoguePinNames = NewPinNames;\n\t\t\treturn true;\n\t\t}\n\t}\n\n\treturn false;\n}\n// End own functions\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n#undef LOCTEXT_NAMESPACE\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystemEditor/Private/BlueprintNodes/DialogueK2Node_SwitchDialogueCallback.h",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#pragma once\n\n#include \"K2Node_Switch.h\"\n\n#include \"DialogueK2Node_SwitchDialogueCallback.generated.h\"\n\n\nUENUM()\nenum class EDlgDialogueCallback : uint8\n{\n\t/** Normal dialogue event during the conversation */\n\tEvent UMETA(DisplayName = \"Dialogue Event\"),\n\t/** Function call to check a condition */\n\tCondition UMETA(DisplayName = \"Dialogue Condition\"),\n\n\tFloatValue UMETA(DisplayName = \"Condition asking for a float value\"),\n\n\tIntValue UMETA(DisplayName = \"Condition asking for an int value\"),\n\n\tBoolValue UMETA(DisplayName = \"Condition asking for a bool value\"),\n\n\tNameValue UMETA(DisplayName = \"Condition asking for a name value\"),\n};\n\n/**\n *\n */\nUCLASS()\nclass UDialogueK2Node_SwitchDialogueCallback : public UK2Node_Switch\n{\n\tGENERATED_BODY()\n\npublic:\n\tUDialogueK2Node_SwitchDialogueCallback(const FObjectInitializer& ObjectInitializer);\n\n\t// UEdGraphNode interface\n\tvoid AllocateDefaultPins() override;\n\tFText GetNodeTitle(ENodeTitleType::Type TitleType) const override;\n\tFText GetTooltipText() const override;\n\t// End of UEdGraphNode interface\n\n\t// UK2Node interface\n\tvoid GetMenuActions(FBlueprintActionDatabaseRegistrar& ActionRegistrar) const override;\n\tFText GetMenuCategory() const override;\n\tbool ShouldShowNodeProperties() const override { return true; }\n\t// End of UK2Node interface\n\n\t// UK2Node_Switch Interface\n\tvoid AddPinToSwitchNode() override;\n\tFName GetUniquePinName() override;\n\tFName GetPinNameGivenIndex(int32 Index) const override;\n\tFEdGraphPinType GetPinType() const override;\n\tvoid RemovePinFromSwitchNode(UEdGraphPin* TargetPin) override;\n\tbool CanRemoveExecutionPin(UEdGraphPin* TargetPin) const override;\n\t// End of UK2Node_Switch Interface\n\nprotected:\n\t// UK2Node_Switch Interface\n\tvoid CreateCasePins() override;\n\tvoid CreateSelectionPin() override;\n\tvoid CreateFunctionPin() override;\n\tvoid RemovePin(UEdGraphPin* TargetPin) override {}\n\t// End of UK2Node_Switch Interface\n\n\t// Begin own functions\n\t// updates DialoguePinNames, return value is true if it is changed\n\tbool RefreshPinNames();\n\nprotected:\n\tUPROPERTY()\n\tTArray<FName> DialoguePinNames;\n\n\tUPROPERTY()\n\tEDlgDialogueCallback CallbackType;\n};\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystemEditor/Private/BlueprintNodes/DialogueK2Node_SwitchDialogueCallbackVariants.cpp",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#include \"DialogueK2Node_SwitchDialogueCallbackVariants.h\"\n\nUDialogueK2Node_SwitchDialogueCallbackEvent::UDialogueK2Node_SwitchDialogueCallbackEvent(const FObjectInitializer& ObjectInitializer)\n\t: Super(ObjectInitializer)\n{\n\tCallbackType = EDlgDialogueCallback::Event;\n}\n\nFText UDialogueK2Node_SwitchDialogueCallbackEvent::GetNodeTitle(ENodeTitleType::Type TitleType) const\n{\n\treturn NSLOCTEXT(\"K2Node\", \"Switch_DialogueCallbackEvent\", \"Switch on Relevant Dialogue Event\");\n}\n\nFText UDialogueK2Node_SwitchDialogueCallbackEvent::GetTooltipText() const\n{\n\treturn NSLOCTEXT(\"K2Node\", \"SwitchDialogueCallbackEvent_ToolTip\", \"Lists all available events from all dialogues for the owner based on IDlgDialogueParticipant::GetParticipantName() function call\");\n}\n\nUDialogueK2Node_SwitchDialogueCallbackCondition::UDialogueK2Node_SwitchDialogueCallbackCondition(const FObjectInitializer& ObjectInitializer)\n\t: Super(ObjectInitializer)\n{\n\tCallbackType = EDlgDialogueCallback::Condition;\n}\n\nFText UDialogueK2Node_SwitchDialogueCallbackCondition::GetNodeTitle(ENodeTitleType::Type TitleType) const\n{\n\treturn NSLOCTEXT(\"K2Node\", \"Switch_DialogueCallbackCondition\", \"Switch on Relevant Dialogue Condition\");\n}\n\nFText UDialogueK2Node_SwitchDialogueCallbackCondition::GetTooltipText() const\n{\n\treturn NSLOCTEXT(\"K2Node\", \"SwitchDialogueCallbackCondition_ToolTip\", \"Lists all available conditions from all dialogues for the owner based on IDlgDialogueParticipant::GetParticipantName() function call\");\n}\n\n\nUDialogueK2Node_SwitchDialogueCallbackFloatValue::UDialogueK2Node_SwitchDialogueCallbackFloatValue(const FObjectInitializer& ObjectInitializer)\n\t: Super(ObjectInitializer)\n{\n\tCallbackType = EDlgDialogueCallback::FloatValue;\n}\n\nFText UDialogueK2Node_SwitchDialogueCallbackFloatValue::GetNodeTitle(ENodeTitleType::Type TitleType) const\n{\n\treturn NSLOCTEXT(\"K2Node\", \"Switch_DialogueFloatValue\", \"Switch on Relevant Dialogue Float Value\");\n}\n\nFText UDialogueK2Node_SwitchDialogueCallbackFloatValue::GetTooltipText() const\n{\n\treturn NSLOCTEXT(\"K2Node\", \"SwitchDialogueFloatValue_ToolTip\", \"Lists all available float value name from all dialogues for the owner based on IDlgDialogueParticipant::GetParticipantName() function call\");\n}\n\n\nUDialogueK2Node_SwitchDialogueCallbackIntValue::UDialogueK2Node_SwitchDialogueCallbackIntValue(const FObjectInitializer& ObjectInitializer)\n\t: Super(ObjectInitializer)\n{\n\tCallbackType = EDlgDialogueCallback::IntValue;\n}\n\nFText UDialogueK2Node_SwitchDialogueCallbackIntValue::GetNodeTitle(ENodeTitleType::Type TitleType) const\n{\n\treturn NSLOCTEXT(\"K2Node\", \"Switch_DialogueIntValue\", \"Switch on Relevant Dialogue Int Value\");\n}\n\nFText UDialogueK2Node_SwitchDialogueCallbackIntValue::GetTooltipText() const\n{\n\treturn NSLOCTEXT(\"K2Node\", \"SwitchDialogueIntValue_ToolTip\", \"Lists all available Integer value names from all dialogues for the owner based on IDlgDialogueParticipant::GetParticipantName() function call\");\n}\n\n\nUDialogueK2Node_SwitchDialogueCallbackBoolValue::UDialogueK2Node_SwitchDialogueCallbackBoolValue(const FObjectInitializer& ObjectInitializer)\n\t: Super(ObjectInitializer)\n{\n\tCallbackType = EDlgDialogueCallback::BoolValue;\n}\n\nFText UDialogueK2Node_SwitchDialogueCallbackBoolValue::GetNodeTitle(ENodeTitleType::Type TitleType) const\n{\n\treturn NSLOCTEXT(\"K2Node\", \"Switch_DialogueBoolValue\", \"Switch on Relevant Dialogue Bool Value\");\n}\n\nFText UDialogueK2Node_SwitchDialogueCallbackBoolValue::GetTooltipText() const\n{\n\treturn NSLOCTEXT(\"K2Node\", \"SwitchDialogueBoolValue_ToolTip\", \"Lists all available Bool value names from all dialogues for the owner based on IDlgDialogueParticipant::GetParticipantName() function call\");\n}\n\n\nUDialogueK2Node_SwitchDialogueCallbackNameValue::UDialogueK2Node_SwitchDialogueCallbackNameValue(const FObjectInitializer& ObjectInitializer)\n\t: Super(ObjectInitializer)\n{\n\tCallbackType = EDlgDialogueCallback::NameValue;\n}\n\nFText UDialogueK2Node_SwitchDialogueCallbackNameValue::GetNodeTitle(ENodeTitleType::Type TitleType) const\n{\n\treturn NSLOCTEXT(\"K2Node\", \"Switch_DialogueNameValue\", \"Switch on Relevant Dialogue Name Value\");\n}\n\nFText UDialogueK2Node_SwitchDialogueCallbackNameValue::GetTooltipText() const\n{\n\treturn NSLOCTEXT(\"K2Node\", \"SwitchDialogueNameValue_ToolTip\", \"Lists all available Name value names from all dialogues for the owner based on IDlgDialogueParticipant::GetParticipantName() function call\");\n}\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystemEditor/Private/BlueprintNodes/DialogueK2Node_SwitchDialogueCallbackVariants.h",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#pragma once\n\n#include \"DialogueK2Node_SwitchDialogueCallback.h\"\n\n#include \"DialogueK2Node_SwitchDialogueCallbackVariants.generated.h\"\n\n/**\n *   Subclasses for quicker access in blueprint\n *\t They just set and hide the type enum property of the parent\n */\n\nUCLASS()\nclass UDialogueK2Node_SwitchDialogueCallbackEvent : public UDialogueK2Node_SwitchDialogueCallback\n{\n\tGENERATED_BODY()\n\npublic:\n\tUDialogueK2Node_SwitchDialogueCallbackEvent(const FObjectInitializer& ObjectInitializer);\n\n\tFText GetNodeTitle(ENodeTitleType::Type TitleType) const override;\n\tFText GetTooltipText() const override;\n};\n\nUCLASS()\nclass UDialogueK2Node_SwitchDialogueCallbackCondition : public UDialogueK2Node_SwitchDialogueCallback\n{\n\tGENERATED_BODY()\n\npublic:\n\tUDialogueK2Node_SwitchDialogueCallbackCondition(const FObjectInitializer& ObjectInitializer);\n\n\tFText GetNodeTitle(ENodeTitleType::Type TitleType) const override;\n\tFText GetTooltipText() const override;\n};\n\nUCLASS()\nclass UDialogueK2Node_SwitchDialogueCallbackFloatValue : public UDialogueK2Node_SwitchDialogueCallback\n{\n\tGENERATED_BODY()\n\npublic:\n\tUDialogueK2Node_SwitchDialogueCallbackFloatValue(const FObjectInitializer& ObjectInitializer);\n\n\tFText GetNodeTitle(ENodeTitleType::Type TitleType) const override;\n\tFText GetTooltipText() const override;\n};\n\nUCLASS()\nclass UDialogueK2Node_SwitchDialogueCallbackIntValue : public UDialogueK2Node_SwitchDialogueCallback\n{\n\tGENERATED_BODY()\n\npublic:\n\tUDialogueK2Node_SwitchDialogueCallbackIntValue(const FObjectInitializer& ObjectInitializer);\n\n\tFText GetNodeTitle(ENodeTitleType::Type TitleType) const override;\n\tFText GetTooltipText() const override;\n};\n\nUCLASS()\nclass UDialogueK2Node_SwitchDialogueCallbackBoolValue : public UDialogueK2Node_SwitchDialogueCallback\n{\n\tGENERATED_BODY()\n\npublic:\n\tUDialogueK2Node_SwitchDialogueCallbackBoolValue(const FObjectInitializer& ObjectInitializer);\n\n\tFText GetNodeTitle(ENodeTitleType::Type TitleType) const override;\n\tFText GetTooltipText() const override;\n};\n\nUCLASS()\nclass UDialogueK2Node_SwitchDialogueCallbackNameValue : public UDialogueK2Node_SwitchDialogueCallback\n{\n\tGENERATED_BODY()\n\npublic:\n\tUDialogueK2Node_SwitchDialogueCallbackNameValue(const FObjectInitializer& ObjectInitializer);\n\n\tFText GetNodeTitle(ENodeTitleType::Type TitleType) const override;\n\tFText GetTooltipText() const override;\n};\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystemEditor/Private/BlueprintNodes/SGraphNode_DialogueK2Select.cpp",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#include \"SGraphNode_DialogueK2Select.h\"\n\n#include \"ScopedTransaction.h\"\n#include \"Widgets/SBoxPanel.h\"\n#include \"GraphEditorSettings.h\"\n#include \"K2Node.h\"\n#include \"Kismet2/BlueprintEditorUtils.h\"\n#include \"Widgets/Images/SImage.h\"\n\n#include \"DialogueK2Node_Select.h\"\n\nvoid SGraphNode_DialogueK2Select::Construct(const FArguments& InArgs, UDialogueK2Node_Select* InNode)\n{\n\tGraphNode = CastChecked<UK2Node>(InNode);\n\tDialogueK2Node_Select = InNode;\n\n\tSetCursor(EMouseCursor::CardinalCross);\n\tUpdateGraphNode();\n}\n\nvoid SGraphNode_DialogueK2Select::CreatePinWidgets()\n{\n\t// does not matter order for output pin\n\tCreateStandardPinWidget(DialogueK2Node_Select->GetReturnValuePin());\n\n\t// Add all option pins first\n\tconst int32 PinsNum = DialogueK2Node_Select->Pins.Num();\n\tfor (int32 PinIndex = UDialogueK2Node_Select::INDEX_PIN_OPTIONS_START; PinIndex < PinsNum; PinIndex++)\n\t{\n\t\tCreateStandardPinWidget(DialogueK2Node_Select->Pins[PinIndex]);\n\t}\n\n\t// Create the Default and VariableName input pin\n\t// Create some padding\n\tLeftNodeBox->AddSlot()\n\t\t.AutoHeight()\n\t\t.HAlign(HAlign_Left)\n\t\t.VAlign(VAlign_Center)\n\t\t.Padding(1.0f)\n\t\t[\n\t\t\tSNew(SImage)\n\t\t\t.Image(FEditorStyle::GetBrush(\"Graph.Pin.DefaultPinSeparator\"))\n\t\t];\n\n\tCreateStandardPinWidget(DialogueK2Node_Select->GetDefaultValuePin());\n\n\t// Create some padding\n\tLeftNodeBox->AddSlot()\n\t\t.AutoHeight()\n\t\t.HAlign(HAlign_Left)\n\t\t.VAlign(VAlign_Center)\n\t\t.Padding(1.0f)\n\t\t[\n\t\t\tSNew(SImage)\n\t\t\t.Image(FEditorStyle::GetBrush(\"Graph.Pin.DefaultPinSeparator\"))\n\t\t];\n\n\tCreateStandardPinWidget(DialogueK2Node_Select->GetVariableNamePin());\n}\n\nvoid SGraphNode_DialogueK2Select::CreateOutputSideAddButton(TSharedPtr<SVerticalBox> OutputBox)\n{\n\tTSharedRef<SWidget> RefreshButton = AddPinButtonContent(\n\t\tNSLOCTEXT(\"SGraphNode_DialogueK2Select\", \"RefreshNodeButton\", \"Refresh Node\"),\n\t\tNSLOCTEXT(\"SGraphNode_DialogueK2Select\", \"RefreshNodeButton_Tooltip\", \"Refreshes the node with the dialogue values\"));\n\n\tFMargin AddPinPadding = Settings->GetOutputPinPadding();\n\tAddPinPadding.Top += 6.0f;\n\n\tOutputBox->AddSlot()\n\t\t.AutoHeight()\n\t\t.VAlign(VAlign_Center)\n\t\t.Padding(AddPinPadding)\n\t\t[\n\t\t\tRefreshButton\n\t\t];\n}\n\nEVisibility SGraphNode_DialogueK2Select::IsAddPinButtonVisible() const\n{\n\treturn EVisibility::Visible;\n}\n\nFReply SGraphNode_DialogueK2Select::OnAddPin()\n{\n\tconst FScopedTransaction Transaction(NSLOCTEXT(\"Kismet\", \"RefreshNode\", \"Refresh Node\"));\n\tDialogueK2Node_Select->Modify();\n\tFBlueprintEditorUtils::MarkBlueprintAsModified(DialogueK2Node_Select->GetBlueprint());\n\n\t// Reconstruct and notify\n\tDialogueK2Node_Select->ReconstructNode();\n\tUpdateGraphNode();\n\tDialogueK2Node_Select->GetGraph()->NotifyGraphChanged();\n\n\treturn FReply::Handled();\n}\n\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystemEditor/Private/BlueprintNodes/SGraphNode_DialogueK2Select.h",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#pragma once\n\n#include \"CoreMinimal.h\"\n#include \"Widgets/DeclarativeSyntaxSupport.h\"\n#include \"KismetNodes/SGraphNodeK2Base.h\"\n\nclass UDialogueK2Node_Select;\n\nclass SGraphNode_DialogueK2Select : public SGraphNodeK2Base\n{\n\ttypedef SGraphNodeK2Base Super;\n\ttypedef SGraphNode_DialogueK2Select Self;\n\npublic:\n\tSLATE_BEGIN_ARGS(Self) {}\n\tSLATE_END_ARGS()\n\n\tvoid Construct(const FArguments& InArgs, UDialogueK2Node_Select* InNode);\n\n\t// SGraphNode interface\n\tvoid CreatePinWidgets() override;\n\nprotected:\n\tvoid CreateOutputSideAddButton(TSharedPtr<SVerticalBox> OutputBox) override;\n\tEVisibility IsAddPinButtonVisible() const override;\n\tFReply OnAddPin() override;\n\t// End of SGraphNode interface\n\nprivate:\n\t// The blueprint dialogue select this view represents\n\tUDialogueK2Node_Select* DialogueK2Node_Select = nullptr;\n};\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystemEditor/Private/BlueprintNodes/SGraphNode_DialogueK2Switch.cpp",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#include \"SGraphNode_DialogueK2Switch.h\"\n\n#include \"ScopedTransaction.h\"\n#include \"Widgets/SBoxPanel.h\"\n#include \"Widgets/Images/SImage.h\"\n#include \"GraphEditorSettings.h\"\n#include \"NodeFactory.h\"\n#include \"KismetPins/SGraphPinExec.h\"\n#include \"Kismet2/BlueprintEditorUtils.h\"\n#include \"K2Node_Switch.h\"\n\n#include \"DialogueK2Node_SwitchDialogueCallback.h\"\n\n\n//////////////////////////////////////////////////////////////////////////\n// SGraphPinSwitchNodeDefaultCaseExec\nclass SGraphPinSwitchNodeDefaultCaseExec : public SGraphPinExec\n{\npublic:\n\tSLATE_BEGIN_ARGS(SGraphPinSwitchNodeDefaultCaseExec) {}\n\tSLATE_END_ARGS()\n\n\tvoid Construct(const FArguments& InArgs, UEdGraphPin* InPin)\n\t{\n\t\tSGraphPin::Construct(SGraphPin::FArguments().PinLabelStyle(FName(\"Graph.Node.DefaultPinName\")), InPin);\n\t\tCachePinIcons();\n\t}\n};\n\n//////////////////////////////////////////////////////////////////////////\n// SGraphNode_DialogueK2Switch\nvoid SGraphNode_DialogueK2Switch::Construct(const FArguments& InArgs, UDialogueK2Node_SwitchDialogueCallback* InNode)\n{\n\tGraphNode = CastChecked<UEdGraphNode>(InNode);\n\tDialogueK2Node_Switch = InNode;\n\n\tSetCursor(EMouseCursor::CardinalCross);\n\tUpdateGraphNode();\n}\n\nvoid SGraphNode_DialogueK2Switch::CreatePinWidgets()\n{\n\tUK2Node_Switch* SwitchNode = CastChecked<UK2Node_Switch>(GraphNode);\n\tUEdGraphPin* DefaultPin = SwitchNode->GetDefaultPin();\n\n\t// Create Pin widgets for each of the pins, except for the default pin\n\tfor (UEdGraphPin* CurrentPin : GraphNode->Pins)\n\t{\n\t\tif (!CurrentPin->bHidden && CurrentPin != DefaultPin)\n\t\t{\n\t\t\tTSharedPtr<SGraphPin> NewPin = FNodeFactory::CreatePinWidget(CurrentPin);\n\t\t\tcheck(NewPin.IsValid());\n\t\t\tAddPin(NewPin.ToSharedRef());\n\t\t}\n\t}\n\n\t// Handle the default pin\n\tif (DefaultPin != nullptr)\n\t{\n\t\t// Create some padding\n\t\tRightNodeBox->AddSlot()\n\t\t\t.AutoHeight()\n\t\t\t.HAlign(HAlign_Right)\n\t\t\t.VAlign(VAlign_Center)\n\t\t\t.Padding(1.0f)\n\t\t\t[\n\t\t\t\tSNew(SImage)\n\t\t\t\t.Image(FEditorStyle::GetBrush(\"Graph.Pin.DefaultPinSeparator\"))\n\t\t\t];\n\n\t\t// Create the pin itself\n\t\tTSharedPtr<SGraphPin> NewPin = SNew(SGraphPinSwitchNodeDefaultCaseExec, DefaultPin);\n\t\tAddPin(NewPin.ToSharedRef());\n\t}\n}\n\nvoid SGraphNode_DialogueK2Switch::CreateOutputSideAddButton(TSharedPtr<SVerticalBox> OutputBox)\n{\n\tTSharedRef<SWidget> AddPinButton = AddPinButtonContent(\n\t\tNSLOCTEXT(\"SwitchStatementNode\", \"RefreshNodeButton\", \"Refresh Node\"),\n\t\tNSLOCTEXT(\"SwitchStatementNode\", \"RefreshNodeButton_Tooltip\", \"Refreshes the node with the dialogue values\"));\n\n\tFMargin AddPinPadding = Settings->GetOutputPinPadding();\n\tAddPinPadding.Top += 6.0f;\n\n\tOutputBox->AddSlot()\n\t\t.AutoHeight()\n\t\t.VAlign(VAlign_Center)\n\t\t.Padding(AddPinPadding)\n\t\t[\n\t\t\tAddPinButton\n\t\t];\n}\n\nEVisibility SGraphNode_DialogueK2Switch::IsAddPinButtonVisible() const\n{\n\treturn EVisibility::Visible;\n}\n\nFReply SGraphNode_DialogueK2Switch::OnAddPin()\n{\n\tconst FScopedTransaction Transaction(NSLOCTEXT(\"Kismet\", \"RefreshNode\", \"Refresh Node\"));\n\tDialogueK2Node_Switch->Modify();\n\tFBlueprintEditorUtils::MarkBlueprintAsModified(DialogueK2Node_Switch->GetBlueprint());\n\n\t// Reconstruct and notify\n\tDialogueK2Node_Switch->ReconstructNode();\n\tUpdateGraphNode();\n\tGraphNode->GetGraph()->NotifyGraphChanged();\n\n\treturn FReply::Handled();\n}\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystemEditor/Private/BlueprintNodes/SGraphNode_DialogueK2Switch.h",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#pragma once\n\n#include \"CoreMinimal.h\"\n#include \"Widgets/DeclarativeSyntaxSupport.h\"\n#include \"KismetNodes/SGraphNodeK2Base.h\"\n\n\nclass UDialogueK2Node_SwitchDialogueCallback;\n\nclass SGraphNode_DialogueK2Switch : public SGraphNodeK2Base\n{\n\ttypedef SGraphNodeK2Base Super;\n\ttypedef SGraphNode_DialogueK2Switch Self;\n\npublic:\n\tSLATE_BEGIN_ARGS(Self) {}\n\tSLATE_END_ARGS()\n\n\tvoid Construct(const FArguments& InArgs, UDialogueK2Node_SwitchDialogueCallback* InNode);\n\n\t// SGraphNode interface\n\tvoid CreatePinWidgets() override;\n\nprotected:\n\tvoid CreateOutputSideAddButton(TSharedPtr<SVerticalBox> OutputBox) override;\n\tEVisibility IsAddPinButtonVisible() const override;\n\tFReply OnAddPin() override;\n\t// End of SGraphNode interface\n\nprivate:\n\t// The blueprint dialogue switch this view represents\n\tUDialogueK2Node_SwitchDialogueCallback* DialogueK2Node_Switch = nullptr;\n};\n\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystemEditor/Private/Commandlets/DlgCommandletHelper.h",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#pragma once\n\n#include \"CoreMinimal.h\"\n\n#include \"FileHelpers.h\"\n#include \"DlgDialogue.h\"\n#include \"DlgManager.h\"\n\n\nclass FDlgCommandletHelper\n{\npublic:\n\tstatic bool SaveAllDirtyDialogues()\n\t{\n\t\t// Save all dirty packages\n\t\tconstexpr bool bPromptUserToSave = false;\n\t\tconstexpr bool bFastSave = true;\n\t\tconstexpr bool bNotifyNoPackagesSaved = false;\n\t\tconstexpr bool bCanBeDeclined = false;\n\t\tstatic TArray<UClass*> SaveContentClasses = { UDlgDialogue::StaticClass() };\n\t\treturn FEditorFileUtils::SaveDirtyContentPackages(SaveContentClasses, bPromptUserToSave, bFastSave, bNotifyNoPackagesSaved, bCanBeDeclined);\n\t}\n\n\tstatic bool SaveAllDialogues()\n\t{\n\t\tTArray<UDlgDialogue*> Dialogues = UDlgManager::GetAllDialoguesFromMemory();\n\t\tTArray<UPackage*> PackagesToSave;\n\t\tfor (UDlgDialogue* Dialogue : Dialogues)\n\t\t{\n\t\t\tDialogue->OnPreAssetSaved();\n\t\t\tDialogue->MarkPackageDirty();\n\t\t\tPackagesToSave.Add(Dialogue->GetOutermost());\n\t\t}\n\n\t\tstatic constexpr bool bCheckDirty = false;\n\t\treturn UEditorLoadingAndSavingUtils::SavePackages(PackagesToSave, bCheckDirty);\n\t}\n};\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystemEditor/Private/Commandlets/DlgExportTwineCommandlet.cpp",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n\n#include \"DlgExportTwineCommandlet.h\"\n\n#include \"Misc/Paths.h\"\n#include \"Misc/FileHelper.h\"\n#include \"HAL/PlatformFilemanager.h\"\n#include \"GenericPlatform/GenericPlatformFile.h\"\n#include \"UObject/Package.h\"\n#include \"FileHelpers.h\"\n\n#include \"DlgManager.h\"\n#include \"Nodes/DlgNode_Speech.h\"\n#include \"Nodes/DlgNode_SpeechSequence.h\"\n#include \"DialogueEditor/Nodes/DialogueGraphNode.h\"\n#include \"DlgCommandletHelper.h\"\n#include \"DlgHelper.h\"\n\n\nDEFINE_LOG_CATEGORY(LogDlgExportTwineCommandlet);\n\n\nconst FString UDlgExportTwineCommandlet::TagNodeStart(TEXT(\"node-start\"));\nconst FString UDlgExportTwineCommandlet::TagNodeEnd(TEXT(\"node-end\"));\nconst FString UDlgExportTwineCommandlet::TagNodeVirtualParent(TEXT(\"node-virtual-parent\"));\nconst FString UDlgExportTwineCommandlet::TagNodeSpeech(TEXT(\"node-speech\"));\nconst FString UDlgExportTwineCommandlet::TagNodeSpeechSequence(TEXT(\"node-speech-sequence\"));\nconst FString UDlgExportTwineCommandlet::TagNodeSelectorFirst(TEXT(\"node-selector-first\"));\nconst FString UDlgExportTwineCommandlet::TagNodeSelectorRandom(TEXT(\"node-selector-random\"));\n\nconst FIntPoint UDlgExportTwineCommandlet::SizeSmall(100, 100);\nconst FIntPoint UDlgExportTwineCommandlet::SizeWide(200, 100);\nconst FIntPoint UDlgExportTwineCommandlet::SizeTall(100, 200);\nconst FIntPoint UDlgExportTwineCommandlet::SizeLarge(200, 200);\n\nTMap<FString, FString> UDlgExportTwineCommandlet::TwineTagNodesColorsMap;\n\nUDlgExportTwineCommandlet::UDlgExportTwineCommandlet()\n{\n\tIsClient = false;\n\tIsEditor = true;\n\tIsServer = false;\n\tLogToConsole = true;\n\tShowErrorCount = true;\n}\n\n\nint32 UDlgExportTwineCommandlet::Main(const FString& Params)\n{\n\tUE_LOG(LogDlgExportTwineCommandlet, Display, TEXT(\"Starting\"));\n\n\tInitTwinetagNodesColors();\n\n\t// Parse command line - we're interested in the param vals\n\tTArray<FString> Tokens;\n\tTArray<FString> Switches;\n\tTMap<FString, FString> ParamVals;\n\tUCommandlet::ParseCommandLine(*Params, Tokens, Switches, ParamVals);\n\n\tif (Switches.Contains(TEXT(\"Flatten\")))\n\t{\n\t\tbFlatten = true;\n\t}\n\n\t// Set the output directory\n\tconst FString* OutputDirectoryVal = ParamVals.Find(FString(TEXT(\"OutputDirectory\")));\n\tif (OutputDirectoryVal == nullptr)\n\t{\n\t\tUE_LOG(LogDlgExportTwineCommandlet, Error, TEXT(\"Did not provide argument -OutputDirectory=<Path>\"));\n\t\treturn -1;\n\t}\n\tOutputDirectory = *OutputDirectoryVal;\n\n\tif (OutputDirectory.IsEmpty())\n\t{\n\t\tUE_LOG(LogDlgExportTwineCommandlet, Error, TEXT(\"OutputDirectory is empty, please provide a non empty one with -OutputDirectory=<Path>\"));\n\t\treturn -1;\n\t}\n\n\t// Make it absolute\n\tif (FPaths::IsRelative(OutputDirectory))\n\t{\n\t\tOutputDirectory = FPaths::Combine(FPaths::ProjectDir(), OutputDirectory);\n\t}\n\n\t// Create destination directory\n\tIPlatformFile& PlatformFile = FPlatformFileManager::Get().GetPlatformFile();\n\tif (!PlatformFile.DirectoryExists(*OutputDirectory) && PlatformFile.CreateDirectoryTree(*OutputDirectory))\n\t{\n\t\tUE_LOG(LogDlgExportTwineCommandlet, Display, TEXT(\"Creating OutputDirectory = `%s`\"), *OutputDirectory);\n\t}\n\n\tUDlgManager::LoadAllDialoguesIntoMemory();\n\tUE_LOG(LogDlgExportTwineCommandlet, Display, TEXT(\"Exporting to = `%s`\"), *OutputDirectory);\n\n\t// Some Dialogues may be unclean?\n\t//FDlgCommandletHelper::SaveAllDialogues();\n\n\t// Keep track of all created files so that we don't have duplicates\n\tTSet<FString> CreateFiles;\n\n\t// Export to twine\n\tconst TArray<UDlgDialogue*> AllDialogues = UDlgManager::GetAllDialoguesFromMemory();\n\tfor (const UDlgDialogue* Dialogue : AllDialogues)\n\t{\n\t\tUPackage* Package = Dialogue->GetOutermost();\n\t\tcheck(Package);\n\t\tconst FString OriginalDialoguePath = Package->GetPathName();\n\t\tFString DialoguePath = OriginalDialoguePath;\n\n\t\t// Only export game dialogues\n\t\tif (!FDlgHelper::IsPathInProjectDirectory(DialoguePath))\n\t\t{\n\t\t\tUE_LOG(LogDlgExportTwineCommandlet, Warning, TEXT(\"Dialogue = `%s` is not in the game directory, ignoring\"), *DialoguePath);\n\t\t\tcontinue;\n\t\t}\n\n\t\tverify(DialoguePath.RemoveFromStart(TEXT(\"/Game\")));\n\t\tconst FString FileName = FPaths::GetBaseFilename(DialoguePath);\n\t\tconst FString Directory = FPaths::GetPath(DialoguePath);\n\n\t\tFString FileSystemFilePath;\n\t\tif (bFlatten)\n\t\t{\n\t\t\t// Create in root of output directory\n\n\t\t\t// Make sure file does not exist\n\t\t\tFString FlattenedFileName = FileName;\n\t\t\tint32 CurrentTryIndex = 1;\n\t\t\twhile (CreateFiles.Contains(FlattenedFileName) && CurrentTryIndex < 100)\n\t\t\t{\n\t\t\t\tFlattenedFileName = FString::Printf(TEXT(\"%s-%d\"), *FileName, CurrentTryIndex);\n\t\t\t\tCurrentTryIndex++;\n\t\t\t}\n\n\t\t\t// Give up :(\n\t\t\tif (CreateFiles.Contains(FlattenedFileName))\n\t\t\t{\n\t\t\t\tUE_LOG(LogDlgExportTwineCommandlet, Warning, TEXT(\"Dialogue = `%s` could not generate unique flattened file, ignoring\"), *DialoguePath);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tCreateFiles.Add(FlattenedFileName);\n\t\t\tFileSystemFilePath = OutputDirectory / FlattenedFileName + TEXT(\".html\");\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// Ensure directory tree\n\t\t\tconst FString FileSystemDirectoryPath = OutputDirectory / Directory;\n\t\t\tif (!PlatformFile.DirectoryExists(*FileSystemDirectoryPath) && PlatformFile.CreateDirectoryTree(*FileSystemDirectoryPath))\n\t\t\t{\n\t\t\t\tUE_LOG(LogDlgExportTwineCommandlet, Display, TEXT(\"Creating directory = `%s`\"), *FileSystemDirectoryPath);\n\t\t\t}\n\t\t\tFileSystemFilePath = FileSystemDirectoryPath / FileName + TEXT(\".html\");\n\t\t}\n\n\t\t// Compute minimum graph node positions\n\t\tconst TArray<UDlgNode*>& Nodes = Dialogue->GetNodes();\n\t\tMinimumGraphX = 0;\n\t\tMinimumGraphY = 0;\n\t\tif (const UDialogueGraphNode* DialogueGraphNode = Cast<UDialogueGraphNode>(Dialogue->GetStartNode().GetGraphNode()))\n\t\t{\n\t\t\tMinimumGraphX = FMath::Min(MinimumGraphX, DialogueGraphNode->NodePosX);\n\t\t\tMinimumGraphY = FMath::Min(MinimumGraphY, DialogueGraphNode->NodePosY);\n\t\t}\n\t\tfor (const UDlgNode* Node : Nodes)\n\t\t{\n\t\t\tconst UDialogueGraphNode* DialogueGraphNode = Cast<UDialogueGraphNode>(Node->GetGraphNode());\n\t\t\tif (DialogueGraphNode == nullptr)\n\t\t\t{\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tMinimumGraphX = FMath::Min(MinimumGraphX, DialogueGraphNode->NodePosX);\n\t\t\tMinimumGraphY = FMath::Min(MinimumGraphY, DialogueGraphNode->NodePosY);\n\t\t}\n\t\t//UE_LOG(LogDlgExportTwineCommandlet, Verbose, TEXT(\"MinimumGraphX = %d, MinimumGraphY = %d\"), MinimumGraphX, MinimumGraphY);\n\n\t\t// Gather passages data\n\t\tCurrentNodesAreas.Empty();\n\t\tFString PassagesData;\n\t\tPassagesData += CreateTwinePassageDataFromNode(*Dialogue, Dialogue->GetStartNode(), INDEX_NONE) + TEXT(\"\\n\");\n\n\t\t// The rest of the nodes\n\t\tfor (int32 NodeIndex = 0; NodeIndex < Nodes.Num(); NodeIndex++)\n\t\t{\n\t\t\tPassagesData += CreateTwinePassageDataFromNode(*Dialogue, *Nodes[NodeIndex], NodeIndex) + TEXT(\"\\n\");\n\t\t}\n\n\t\t// Export file\n\t\tconst FString TwineFileContent = CreateTwineStoryData(Dialogue->GetDialogueName(), Dialogue->GetGUID(), INDEX_NONE, PassagesData);\n\t\tif (FFileHelper::SaveStringToFile(TwineFileContent, *FileSystemFilePath, FFileHelper::EEncodingOptions::ForceUTF8WithoutBOM))\n\t\t{\n\t\t\tUE_LOG(LogDlgExportTwineCommandlet, Display, TEXT(\"Writing file = `%s` for Dialogue = `%s` \"), *FileSystemFilePath, *OriginalDialoguePath);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tUE_LOG(LogDlgExportTwineCommandlet, Error, TEXT(\"FAILED to write file = `%s` for Dialogue = `%s`\"), *FileSystemFilePath, *OriginalDialoguePath);\n\t\t}\n\t}\n\n\treturn 0;\n}\n\n\nFString UDlgExportTwineCommandlet::CreateTwineStoryData(const FString& Name, const FGuid& DialogueGUID, int32 StartNodeIndex, const FString& PassagesData)\n{\n\tstatic const FString Creator = TEXT(\"UE-NotYetDlgSystem\");\n\tstatic const FString CreatorVersion = TEXT(\"5.0\"); // TODO\n\tstatic constexpr int32 Zoom = 1;\n\tstatic const FString Format = TEXT(\"Harlowe\");\n\tstatic const FString FormatVersion = TEXT(\"2.1.0\");\n\n\t//const FGuid UUID = FGuid::NewGuid();\n\treturn FString::Printf(\n\t\tTEXT(\"<tw-storydata name=\\\"%s\\\" startnode=\\\"%d\\\" creator=\\\"%s\\\" creator-version=\\\"%s\\\"\")\n\t\tTEXT(\" ifid=\\\"%s\\\" zoom=\\\"%d\\\" format=\\\"%s\\\" format-version=\\\"%s\\\" options=\\\"\\\" hidden>\\n\")\n\n\t\tTEXT(\"<style role=\\\"stylesheet\\\" id=\\\"twine-user-stylesheet\\\" type=\\\"text/twine-css\\\">%s</style>\\n\")\n\t\tTEXT(\"<script role=\\\"script\\\" id=\\\"twine-user-script\\\" type=\\\"text/twine-javascript\\\"></script>\\n\")\n\n\t\t// tags colors data\n\t\tTEXT(\"\\n%s\\n\")\n\t\t// Special tag to identify the dialogue id\n\t\t//TEXT(\"<tw-passagedata pid=\\\"-1\\\" tags=\\\"\\\" name=\\\"DialogueGUID\\\" position=\\\"0,0\\\" size=\\\"10,10\\\">%s</tw-passagedata>\\n\")\n\n\t\tTEXT(\"%s\\n\")\n\n\t\tTEXT(\"</tw-storydata>\"),\n\t\t*Name, StartNodeIndex + 2, *Creator, *CreatorVersion,\n\t\t*DialogueGUID.ToString(EGuidFormats::DigitsWithHyphens), Zoom, *Format, *FormatVersion,\n\t\t*CreateTwineCustomCss(),\n\t\t*CreateTwineTagColorsData(),\n\t\t*PassagesData\n\t);\n}\n\nbool UDlgExportTwineCommandlet::GetBoxThatConflicts(const FBox2D& Box, FBox2D& OutConflict)\n{\n\tfor (const FBox2D& CurrentBox : CurrentNodesAreas)\n\t{\n\t\tif (CurrentBox.Intersect(Box))\n\t\t{\n\t\t\tOutConflict = CurrentBox;\n\t\t\treturn true;\n\t\t}\n\t}\n\n\treturn false;\n}\n\nFIntPoint UDlgExportTwineCommandlet::GetNonConflictingPointFor(const FIntPoint& Point, const FIntPoint& Size, const FIntPoint& Padding)\n{\n\tFVector2D MinVector(Point + Padding);\n\tFVector2D MaxVector(MinVector + Size);\n\tFBox2D NewBox(MinVector, MaxVector);\n\n\tFBox2D ConflictBox;\n\twhile (GetBoxThatConflicts(NewBox, ConflictBox))\n\t{\n\t\t//UE_LOG(LogDlgExportTwineCommandlet, Warning, TEXT(\"Found conflict in rectangle: %s for Point: %s\"), *ConflictRect.ToString(), *NewPoint.ToString());\n\t\t// Assume the curent box is a child, adjust\n\t\tFVector2D Center, Extent;\n\t\tConflictBox.GetCenterAndExtents(Center, Extent);\n\n\t\t// Update on vertical\n\t\tMinVector.Y += Extent.Y / 2.f;\n\t\tMaxVector = MinVector + Size;\n\t\tNewBox = FBox2D(MinVector, MaxVector);\n\t}\n\n\tCurrentNodesAreas.Add(NewBox);\n\treturn MinVector.IntPoint();\n}\n\nFString UDlgExportTwineCommandlet::CreateTwinePassageDataFromNode(const UDlgDialogue& Dialogue, const UDlgNode& Node, int32 NodeIndex)\n{\n\tconst UDialogueGraphNode* DialogueGraphNode = Cast<UDialogueGraphNode>(Node.GetGraphNode());\n\tif (DialogueGraphNode == nullptr)\n\t{\n\t\tUE_LOG(LogDlgExportTwineCommandlet, Warning, TEXT(\"Invalid UDialogueGraphNode for Node index = %d in Dialogue = `%s`. Ignoring.\"), NodeIndex, *Dialogue.GetPathName());\n\t\treturn \"\";\n\t}\n\tconst bool bIsRootNode = DialogueGraphNode->IsRootNode();\n\n\tconst FString NodeName = GetNodeNameFromNode(Node, NodeIndex, bIsRootNode);\n\tFString Tags;\n\tFIntPoint Position = GraphNodeToTwineCanvas(DialogueGraphNode->NodePosX, DialogueGraphNode->NodePosY);\n\n\t// TODO fix this\n\tTSharedPtr<SGraphNode> NodeWidget = DialogueGraphNode->GetNodeWidget();\n\tFIntPoint Size = SizeLarge;\n\tif (NodeWidget.IsValid())\n\t{\n\t\tSize = FIntPoint(NodeWidget->GetDesiredSize().X, NodeWidget->GetDesiredSize().Y);\n\t}\n\n\tFString NodeContent;\n\tconst FIntPoint Padding(20, 20);\n\tif (DialogueGraphNode->IsRootNode())\n\t{\n\t\tverify(NodeIndex == INDEX_NONE);\n\t\tTags += TagNodeStart;\n\t\tSize = SizeSmall;\n\t\tPosition = GetNonConflictingPointFor(Position, Size, Padding);\n\n\t\tNodeContent += CreateTwinePassageDataLinksFromEdges(Dialogue, Node.GetNodeChildren());\n\t\treturn CreateTwinePassageData(NodeIndex, NodeName, Tags, Position, Size, NodeContent);\n\t}\n\n\tverify(NodeIndex >= 0);\n\tif (DialogueGraphNode->IsVirtualParentNode())\n\t{\n\t\t// Edges from this node do not matter\n\t\tTags += TagNodeVirtualParent;\n\t\tPosition = GetNonConflictingPointFor(Position, Size, Padding);\n\t\t//CurrentNodesAreas.Add(FIntRect(Position + Padding, Position + Size + Padding));\n\n\t\tconst UDlgNode_Speech& NodeSpeech = DialogueGraphNode->GetDialogueNode<UDlgNode_Speech>();\n\t\tNodeContent += EscapeHtml(NodeSpeech.GetNodeUnformattedText().ToString());\n\t\tNodeContent += TEXT(\"\\n\\n\\n\") + CreateTwinePassageDataLinksFromEdges(Dialogue, Node.GetNodeChildren(), true);\n\t\treturn CreateTwinePassageData(NodeIndex, NodeName, Tags, Position, Size, NodeContent);\n\t}\n\tif (DialogueGraphNode->IsSpeechNode())\n\t{\n\t\tTags += TagNodeSpeech;\n\t\tPosition = GetNonConflictingPointFor(Position, Size, Padding);\n\t\t//CurrentNodesAreas.Add(FIntRect(Position + Padding, Position + Size + Padding));\n\n\t\tconst UDlgNode_Speech& NodeSpeech = DialogueGraphNode->GetDialogueNode<UDlgNode_Speech>();\n\t\tNodeContent += EscapeHtml(NodeSpeech.GetNodeUnformattedText().ToString());\n\t\tNodeContent += TEXT(\"\\n\\n\\n\") + CreateTwinePassageDataLinksFromEdges(Dialogue, Node.GetNodeChildren());\n\t\treturn CreateTwinePassageData(NodeIndex, NodeName, Tags, Position, Size, NodeContent);\n\t}\n\tif (DialogueGraphNode->IsEndNode())\n\t{\n\t\t// Does not have any children/text\n\t\tTags += TagNodeEnd;\n\t\tSize = SizeSmall;\n\t\tPosition = GetNonConflictingPointFor(Position, Size, Padding);\n\t\t//CurrentNodesAreas.Add(FIntRect(Position + Padding, Position + Size + Padding));\n\n\t\tNodeContent += TEXT(\"END\");\n\t\treturn CreateTwinePassageData(NodeIndex, NodeName, Tags, Position, Size, NodeContent);\n\t}\n\tif (DialogueGraphNode->IsSelectorNode())\n\t{\n\t\t// Does not have any text and text for edges does not matter\n\t\tif (DialogueGraphNode->IsSelectorFirstNode())\n\t\t{\n\t\t\tTags += TagNodeSelectorFirst;\n\t\t}\n\t\tif (DialogueGraphNode->IsSelectorRandomNode())\n\t\t{\n\t\t\tTags += TagNodeSelectorRandom;\n\t\t}\n\t\tSize = SizeSmall;\n\t\tPosition = GetNonConflictingPointFor(Position, Size, Padding);\n\n\t\tNodeContent += TEXT(\"SELECTOR\\n\");\n\t\tNodeContent += CreateTwinePassageDataLinksFromEdges(Dialogue, Node.GetNodeChildren(), true);\n\t\treturn CreateTwinePassageData(NodeIndex, NodeName, Tags, Position, Size, NodeContent);\n\t}\n\tif (DialogueGraphNode->IsSpeechSequenceNode())\n\t{\n\t\tTags += TagNodeSpeechSequence;\n\t\tPosition = GetNonConflictingPointFor(Position, Size, Padding);\n\n\t\tconst UDlgNode_SpeechSequence& NodeSpeechSequence = DialogueGraphNode->GetDialogueNode<UDlgNode_SpeechSequence>();\n\n\t\t// Fill sequence\n\t\tconst TArray<FDlgSpeechSequenceEntry>& Sequence = NodeSpeechSequence.GetNodeSpeechSequence();\n\t\tfor (int32 EntryIndex = 0; EntryIndex < Sequence.Num(); EntryIndex++)\n\t\t{\n\t\t\tconst FDlgSpeechSequenceEntry& Entry = Sequence[EntryIndex];\n\t\t\tNodeContent += FString::Printf(\n\t\t\t\tTEXT(\"``Speaker:`` //%s//\\n\")\n\t\t\t\tTEXT(\"``Text:`` //%s//\\n\")\n\t\t\t\tTEXT(\"``EdgeText:`` //%s//\\n\"),\n\t\t\t\t*EscapeHtml(Entry.Speaker.ToString()),\n\t\t\t\t*EscapeHtml(Entry.Text.ToString()),\n\t\t\t\t*EscapeHtml(Entry.EdgeText.ToString())\n\t\t\t);\n\n\t\t\tif (EntryIndex != Sequence.Num() - 1)\n\t\t\t{\n\t\t\t\tNodeContent += TEXT(\"---\\n\");\n\t\t\t}\n\t\t}\n\n\t\tNodeContent += TEXT(\"\\n\\n\\n\") + CreateTwinePassageDataLinksFromEdges(Dialogue, Node.GetNodeChildren());\n\t\treturn CreateTwinePassageData(NodeIndex, NodeName, Tags, Position, Size, NodeContent);\n\t}\n\n\tUE_LOG(LogDlgExportTwineCommandlet, Warning, TEXT(\"Node index = %d not handled in Dialogue = `%s`. Ignoring.\"), NodeIndex, *Dialogue.GetPathName());\n\treturn \"\";\n}\n\nFString UDlgExportTwineCommandlet::GetNodeNameFromNode(const UDlgNode& Node, int32 NodeIndex, bool bIsRootNode)\n{\n\treturn FString::Printf(TEXT(\"%d. %s\"), NodeIndex, bIsRootNode ? TEXT(\"START\") : *Node.GetNodeParticipantName().ToString());\n}\n\nFString UDlgExportTwineCommandlet::CreateTwinePassageDataLinksFromEdges(const UDlgDialogue& Dialogue, const TArray<FDlgEdge>& Edges, bool bNoTextOnEdges)\n{\n\tFString Links;\n\tconst TArray<UDlgNode*>& Nodes = Dialogue.GetNodes();\n\tfor (const FDlgEdge& Edge : Edges)\n\t{\n\t\tif (!Edge.IsValid())\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\t\tif (!Nodes.IsValidIndex(Edge.TargetIndex))\n\t\t{\n\t\t\tUE_LOG(LogDlgExportTwineCommandlet, Warning, TEXT(\"Target index = %d not valid. Ignoring\"), Edge.TargetIndex);\n\t\t\tcontinue;\n\t\t}\n\n\t\tFString EdgeText;\n\t\tif (bNoTextOnEdges || Edge.GetUnformattedText().IsEmpty())\n\t\t{\n\t\t\tEdgeText = FString::Printf(TEXT(\"~ignore~ To Node %d\"), Edge.TargetIndex);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tEdgeText = EscapeHtml(Edge.GetUnformattedText().ToString());\n\t\t}\n\t\tLinks += FString::Printf(TEXT(\"[[%s|%s]]\\n\"), *EdgeText, *GetNodeNameFromNode(*Nodes[Edge.TargetIndex], Edge.TargetIndex, false));\n\t}\n\tLinks.RemoveFromEnd(TEXT(\"\\n\"));\n\treturn Links;\n}\n\n\nFString UDlgExportTwineCommandlet::CreateTwinePassageData(int32 Pid, const FString& Name, const FString& Tags, const FIntPoint& Position, const FIntPoint& Size, const FString& Content)\n{\n\treturn FString::Printf(\n\t\tTEXT(\"<tw-passagedata pid=\\\"%d\\\" name=\\\"%s\\\" tags=\\\"%s\\\" position=\\\"%d, %d\\\" size=\\\"%d, %d\\\">%s</tw-passagedata>\"),\n\t\tPid + 2, *Name, *Tags, Position.X, Position.Y, Size.X, Size.Y, *Content\n\t);\n}\n\nFString UDlgExportTwineCommandlet::CreateTwineCustomCss()\n{\n\treturn TEXT(\"#storyEditView.passage.tags div.cyan { background: #19e5e6; }\");\n}\n\n\nFString UDlgExportTwineCommandlet::CreateTwineTagColorsData()\n{\n\tInitTwinetagNodesColors();\n\n\tFString TagColorsString;\n\tfor (const auto& Elem : TwineTagNodesColorsMap)\n\t{\n\t\tTagColorsString += FString::Printf(\n\t\t\tTEXT(\"<tw-tag name=\\\"%s\\\" color=\\\"%s\\\"></tw-tag>\\n\"),\n\t\t\t*Elem.Key, *Elem.Value\n\t\t);\n\t}\n\n\treturn TagColorsString;\n}\n\nvoid UDlgExportTwineCommandlet::InitTwinetagNodesColors()\n{\n\tif (TwineTagNodesColorsMap.Num() > 0)\n\t{\n\t\treturn;\n\t}\n\n\tTwineTagNodesColorsMap.Add(TagNodeStart, TEXT(\"green\"));\n\tTwineTagNodesColorsMap.Add(TagNodeEnd, TEXT(\"red\"));\n\tTwineTagNodesColorsMap.Add(TagNodeVirtualParent, TEXT(\"blue\"));\n\tTwineTagNodesColorsMap.Add(TagNodeSpeech, TEXT(\"blue\"));\n\tTwineTagNodesColorsMap.Add(TagNodeSpeechSequence, TEXT(\"blue\"));\n\tTwineTagNodesColorsMap.Add(TagNodeSelectorFirst, TEXT(\"purple\"));\n\tTwineTagNodesColorsMap.Add(TagNodeSelectorRandom, TEXT(\"yellow\"));\n}\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystemEditor/Private/Commandlets/DlgExportTwineCommandlet.h",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#pragma once\n\n#include \"Commandlets/Commandlet.h\"\n\n#include \"DlgExportTwineCommandlet.generated.h\"\n\n\nDECLARE_LOG_CATEGORY_EXTERN(LogDlgExportTwineCommandlet, All, All);\n\nclass UDlgDialogue;\nclass UDlgNode;\nclass UDialogueGraphNode;\nstruct FDlgEdge;\n\n\nUCLASS()\nclass UDlgExportTwineCommandlet : public UCommandlet\n{\n\tGENERATED_BODY()\n\npublic:\n\tUDlgExportTwineCommandlet();\n\npublic:\n\n\t//~ UCommandlet interface\n\tint32 Main(const FString& Params) override;\n\n\tFString CreateTwineStoryData(const FString& Name, const FGuid& DialogueGuid, int32 StartNodeIndex, const FString& PassagesData);\n\n\tFString CreateTwinePassageDataFromNode(const UDlgDialogue& Dialogue, const UDlgNode& Node, int32 NodeIndex);\n\tFString CreateTwinePassageDataLinksFromEdges(const UDlgDialogue& Dialogue, const TArray<FDlgEdge>& Edges, bool bNoTextOnEdges = false);\n\n\tFString CreateTwinePassageData(int32 Pid, const FString& Name, const FString& Tags, const FIntPoint& Position, const FIntPoint& Size, const FString& Content);\n\n\tFString CreateTwineCustomCss();\n\n\tFORCEINLINE FIntPoint GraphNodeToTwineCanvas(int32 PositionX, int32 PositionY)\n\t{\n\t\t// Twine Graph canvas always starts from 0,0 - there is not negative position\n\t\tconst int32 NewX = FMath::Abs(MinimumGraphX) + PositionX;\n\t\tconst int32 NewY = FMath::Abs(MinimumGraphY) + PositionY;\n\t\treturn FIntPoint(NewX, NewY);\n\t}\n\n\tbool GetBoxThatConflicts(const FBox2D& Box, FBox2D& OutConflict);\n\tFIntPoint GetNonConflictingPointFor(const FIntPoint& InPoint, const FIntPoint& Size, const FIntPoint& Padding);\n\n\tstatic FString CreateTwineTagColorsData();\n\n\tFString GetNodeNameFromNode(const UDlgNode& Node, int32 NodeIndex, bool bIsRootNode = false);\n\n\tFORCEINLINE static FString& EscapeHtml(FString& String)\n\t{\n\t\tString.ReplaceInline(TEXT(\"&\"), TEXT(\"&amp;\"), ESearchCase::CaseSensitive);\n\t\tString.ReplaceInline(TEXT(\"\\\"\"), TEXT(\"&quot;\"), ESearchCase::CaseSensitive);\n\t\tString.ReplaceInline(TEXT(\"'\"), TEXT(\"&apos;\"), ESearchCase::CaseSensitive);\n\t\tString.ReplaceInline(TEXT(\"<\"), TEXT(\"&lt;\"), ESearchCase::CaseSensitive);\n\t\tString.ReplaceInline(TEXT(\">\"), TEXT(\"&gt;\"), ESearchCase::CaseSensitive);\n\t\treturn String;\n\t}\n\n\tFORCEINLINE static FString EscapeHtml(const FString& String)\n\t{\n\t\tFString NewString = String;\n\t\tNewString.ReplaceInline(TEXT(\"&\"), TEXT(\"&amp;\"), ESearchCase::CaseSensitive);\n\t\tNewString.ReplaceInline(TEXT(\"\\\"\"), TEXT(\"&quot;\"), ESearchCase::CaseSensitive);\n\t\tNewString.ReplaceInline(TEXT(\"'\"), TEXT(\"&apos;\"), ESearchCase::CaseSensitive);\n\t\tNewString.ReplaceInline(TEXT(\"<\"), TEXT(\"&lt;\"), ESearchCase::CaseSensitive);\n\t\tNewString.ReplaceInline(TEXT(\">\"), TEXT(\"&gt;\"), ESearchCase::CaseSensitive);\n\t\treturn NewString;\n\t}\n\nprotected:\n\tstatic void InitTwinetagNodesColors();\n\nprotected:\n\tFString OutputDirectory;\n\n\t// Flatten files to the same directory\n\tbool bFlatten = false;\n\n\t// used to compute the proper size\n\tint32 MinimumGraphX = 0;\n\tint32 MinimumGraphY = 0;\n\n\t// Stop overlapping nodes\n\tTArray<FBox2D> CurrentNodesAreas;\n\n\t// Maps from:\n\t// Key: NodeTagName\n\t// Value: Color name https://twine2.neocities.org/#type_colour\n\tstatic TMap<FString, FString> TwineTagNodesColorsMap;\n\n\tstatic const FIntPoint SizeSmall;\n\tstatic const FIntPoint SizeWide;\n\tstatic const FIntPoint SizeTall;\n\tstatic const FIntPoint SizeLarge;\n\n\tstatic const FString TagNodeStart;\n\tstatic const FString TagNodeEnd;\n\tstatic const FString TagNodeVirtualParent;\n\tstatic const FString TagNodeSpeech;\n\tstatic const FString TagNodeSpeechSequence;\n\tstatic const FString TagNodeSelectorFirst;\n\tstatic const FString TagNodeSelectorRandom;\n};\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystemEditor/Private/Commandlets/DlgHumanReadableTextCommandlet.cpp",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#include \"DlgHumanReadableTextCommandlet.h\"\n\n#include \"Misc/Paths.h\"\n#include \"HAL/PlatformFilemanager.h\"\n#include \"GenericPlatform/GenericPlatformFile.h\"\n#include \"UObject/Package.h\"\n#include \"FileHelpers.h\"\n\n#include \"DlgManager.h\"\n#include \"Nodes/DlgNode_Speech.h\"\n#include \"IO/DlgJsonWriter.h\"\n#include \"Nodes/DlgNode_SpeechSequence.h\"\n#include \"DialogueEditor/Nodes/DialogueGraphNode.h\"\n#include \"IO/DlgJsonParser.h\"\n#include \"DlgCommandletHelper.h\"\n#include \"DlgHelper.h\"\n\n\nDEFINE_LOG_CATEGORY(LogDlgHumanReadableTextCommandlet);\n\nconst TCHAR* UDlgHumanReadableTextCommandlet::FileExtension = TEXT(\".dlg_human.json\");\n\nUDlgHumanReadableTextCommandlet::UDlgHumanReadableTextCommandlet()\n{\n\tIsClient = false;\n\tIsEditor = true;\n\tIsServer = false;\n\tLogToConsole = true;\n\tShowErrorCount = true;\n}\n\nint32 UDlgHumanReadableTextCommandlet::Main(const FString& Params)\n{\n\tUE_LOG(LogDlgHumanReadableTextCommandlet, Display, TEXT(\"Starting\"));\n\tSettings = GetDefault<UDlgSystemSettings>();\n\n\t// Parse command line - we're interested in the param vals\n\tTArray<FString> Tokens;\n\tTArray<FString> Switches;\n\tTMap<FString, FString> ParamVals;\n\tUCommandlet::ParseCommandLine(*Params, Tokens, Switches, ParamVals);\n\n\t// Set the output directory\n\tconst FString* OutputInputDirectoryVal = ParamVals.Find(FString(TEXT(\"OutputInputDirectory\")));\n\tif (OutputInputDirectoryVal == nullptr)\n\t{\n\t\tUE_LOG(LogDlgHumanReadableTextCommandlet, Error, TEXT(\"Did not provide argument -OutputInputDirectory=<Path>\"));\n\t\treturn -1;\n\t}\n\tOutputInputDirectory = *OutputInputDirectoryVal;\n\n\tif (OutputInputDirectory.IsEmpty())\n\t{\n\t\tUE_LOG(LogDlgHumanReadableTextCommandlet, Error, TEXT(\"OutputInputDirectory is empty, please provide a non empty one with -OutputInputDirectory=<Path>\"));\n\t\treturn -1;\n\t}\n\n\t// Make it absolute\n\tif (FPaths::IsRelative(OutputInputDirectory))\n\t{\n\t\tOutputInputDirectory = FPaths::Combine(FPaths::ProjectDir(), OutputInputDirectory);\n\t}\n\n\tif (Switches.Contains(TEXT(\"SaveAllDialogues\")))\n\t{\n\t\tbSaveAllDialogues = true;\n\t}\n\telse if (Switches.Contains(TEXT(\"NoSaveAllDialogues\")))\n\t{\n\t\tbSaveAllDialogues = false;\n\t}\n\n\tif (Switches.Contains(TEXT(\"Export\")))\n\t{\n\t\tbExport = true;\n\t}\n\telse if (Switches.Contains(\"Import\"))\n\t{\n\t\tbImport = true;\n\t}\n\tif (!bExport && !bImport)\n\t{\n\t\tUE_LOG(LogDlgHumanReadableTextCommandlet, Error, TEXT(\"Did not choose any operationg. Either -export OR -import\"));\n\t\treturn -1;\n\t}\n\n\t// Create destination directory\n\tIPlatformFile& PlatformFile = FPlatformFileManager::Get().GetPlatformFile();\n\tif (!PlatformFile.DirectoryExists(*OutputInputDirectory) && PlatformFile.CreateDirectoryTree(*OutputInputDirectory))\n\t{\n\t\tUE_LOG(LogDlgHumanReadableTextCommandlet, Display, TEXT(\"Creating OutputInputDirectory = `%s`\"), *OutputInputDirectory);\n\t}\n\n\tUDlgManager::LoadAllDialoguesIntoMemory();\n\n\tif (bExport)\n\t\treturn Export();\n\tif (bImport)\n\t\treturn Import();\n\n\treturn 0;\n}\n\nint32 UDlgHumanReadableTextCommandlet::Export()\n{\n\tUE_LOG(LogDlgHumanReadableTextCommandlet, Display, TEXT(\"Exporting to = `%s`\"), *OutputInputDirectory);\n\n\t// Some Dialogues may be unclean?\n\tif (bSaveAllDialogues)\n\t{\n\t\tFDlgCommandletHelper::SaveAllDialogues();\n\t}\n\n\tIPlatformFile& PlatformFile = FPlatformFileManager::Get().GetPlatformFile();\n\tconst TArray<UDlgDialogue*> AllDialogues = UDlgManager::GetAllDialoguesFromMemory();\n\tfor (const UDlgDialogue* Dialogue : AllDialogues)\n\t{\n\t\tUPackage* Package = Dialogue->GetOutermost();\n\t\tcheck(Package);\n\t\tconst FString OriginalDialoguePath = Package->GetPathName();\n\t\tFString DialoguePath = OriginalDialoguePath;\n\n\t\t// Only export game dialogues\n\t\tif (!FDlgHelper::IsPathInProjectDirectory(DialoguePath))\n\t\t{\n\t\t\tUE_LOG(LogDlgHumanReadableTextCommandlet, Warning, TEXT(\"Dialogue = `%s` is not in the game directory, ignoring\"), *DialoguePath);\n\t\t\tcontinue;\n\t\t}\n\n\t\tverify(DialoguePath.RemoveFromStart(TEXT(\"/Game\")));\n\t\tconst FString FileName = FPaths::GetBaseFilename(DialoguePath);\n\t\tconst FString Directory = FPaths::GetPath(DialoguePath);\n\n\t\t// Ensure directory tree\n\t\tconst FString FileSystemDirectoryPath = OutputInputDirectory / Directory;\n\t\tif (!PlatformFile.DirectoryExists(*FileSystemDirectoryPath) && PlatformFile.CreateDirectoryTree(*FileSystemDirectoryPath))\n\t\t{\n\t\t\tUE_LOG(LogDlgHumanReadableTextCommandlet, Display, TEXT(\"Creating directory = `%s`\"), *FileSystemDirectoryPath);\n\t\t}\n\n\t\t// Export file\n\t\tFDlgJsonWriter JsonWriter;\n\t\tFDlgDialogue_FormatHumanReadable ExportFormat;\n\t\tif (!ExportDialogueToHumanReadableFormat(*Dialogue, ExportFormat))\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\t\tJsonWriter.Write(FDlgDialogue_FormatHumanReadable::StaticStruct(), &ExportFormat);\n\n\t\tconst FString FileSystemFilePath = FileSystemDirectoryPath / FileName + FileExtension;\n\t\tif (JsonWriter.ExportToFile(FileSystemFilePath))\n\t\t{\n\t\t\tUE_LOG(LogDlgHumanReadableTextCommandlet, Display, TEXT(\"Writing file = `%s` for Dialogue = `%s` \"), *FileSystemFilePath, *OriginalDialoguePath);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tUE_LOG(LogDlgHumanReadableTextCommandlet, Error, TEXT(\"FAILED to write file = `%s` for Dialogue = `%s`\"), *FileSystemFilePath, *OriginalDialoguePath);\n\t\t}\n\t}\n\n\treturn 0;\n}\n\nint32 UDlgHumanReadableTextCommandlet::Import()\n{\n\tUE_LOG(LogDlgHumanReadableTextCommandlet, Display, TEXT(\"Importing from = `%s`\"), *OutputInputDirectory);\n\n\tPackagesToSave.Empty();\n\tTMap<FGuid, UDlgDialogue*> DialoguesMap = UDlgManager::GetAllDialoguesGUIDsMap();\n\tIPlatformFile& PlatformFile = FPlatformFileManager::Get().GetPlatformFile();\n\n\t// Find all files\n\tTArray<FString> FoundFiles;\n\tPlatformFile.FindFilesRecursively(FoundFiles, *OutputInputDirectory, FileExtension);\n\tif (FoundFiles.Num() == 0)\n\t{\n\t\tUE_LOG(LogDlgHumanReadableTextCommandlet, Error, TEXT(\"FAILED import, could not find any files with the extension = `%s` inside the directory = `%s`\"), FileExtension, *OutputInputDirectory);\n\t\treturn -1;\n\t}\n\n\tfor (const FString& File : FoundFiles)\n\t{\n\t\tUE_LOG(LogDlgHumanReadableTextCommandlet, Display, TEXT(\"Reading file = `%s` \"), *File);\n\n\t\tFDlgJsonParser JsonParser;\n\t\tJsonParser.InitializeParser(File);\n\t\tif (!JsonParser.IsValidFile())\n\t\t{\n\t\t\tUE_LOG(LogDlgHumanReadableTextCommandlet, Error, TEXT(\"FAILED to read file = `%s`\"), *File);\n\t\t\tcontinue;\n\t\t}\n\n\t\tFDlgDialogue_FormatHumanReadable HumanFormat;\n\t\tJsonParser.ReadAllProperty(FDlgDialogue_FormatHumanReadable::StaticStruct(), &HumanFormat);\n\t\tif (!JsonParser.IsValidFile())\n\t\t{\n\t\t\tUE_LOG(LogDlgHumanReadableTextCommandlet, Error, TEXT(\"File = `%s` is not a valid JSON file\"), *File);\n\t\t\tcontinue;\n\t\t}\n\n\n\t\t// Find Dialogue\n\t\tUDlgDialogue** DialoguePtr = DialoguesMap.Find(HumanFormat.DialogueGUID);\n\t\tif (DialoguePtr == nullptr)\n\t\t{\n\t\t\tUE_LOG(LogDlgHumanReadableTextCommandlet,\n\t\t\t\tError,\n\t\t\t\tTEXT(\"Can't find Dialogue for GUID = `%s`, DialogueName = `%s` from File = `%s`\"),\n\t\t\t\t*HumanFormat.DialogueGUID.ToString(), *HumanFormat.DialogueName.ToString(), *File);\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Import\n\t\tUDlgDialogue* Dialogue = *DialoguePtr;\n\t\tif (ImportHumanReadableFormatIntoDialogue(HumanFormat, Dialogue))\n\t\t{\n\t\t\tPackagesToSave.Add(Dialogue->GetOutermost());\n\t\t}\n\t}\n\n\treturn UEditorLoadingAndSavingUtils::SavePackages(PackagesToSave, false) == true ? 0 : -1;\n}\n\nbool UDlgHumanReadableTextCommandlet::ExportDialogueToHumanReadableFormat(const UDlgDialogue& Dialogue, FDlgDialogue_FormatHumanReadable& OutFormat)\n{\n\tOutFormat.DialogueName = Dialogue.GetDialogueFName();\n\tOutFormat.DialogueGUID = Dialogue.GetGUID();\n\n\t// Root Node\n\t{\n\t\tFDlgNodeSpeech_FormatHumanReadable RootNode;\n\t\tRootNode.NodeIndex = RootNodeIndex;\n\t\tExportNodeEdgesToHumanReadableFormat(Dialogue.GetStartNode().GetNodeChildren(), RootNode.Edges);\n\t\tOutFormat.SpeechNodes.Add(RootNode);\n\t}\n\n\tconst TArray<UDlgNode*>& Nodes = Dialogue.GetNodes();\n\tfor (int32 NodeIndex = 0; NodeIndex < Nodes.Num(); NodeIndex++)\n\t{\n\t\tconst UDlgNode* Node = Nodes[NodeIndex];\n\t\tif (const UDlgNode_Speech* NodeSpeech = Cast<UDlgNode_Speech>(Node))\n\t\t{\n\t\t\t// Fill Nodes\n\t\t\tFDlgNodeSpeech_FormatHumanReadable ExportNode;\n\t\t\tExportNode.NodeIndex = NodeIndex;\n\t\t\tExportNode.Speaker = NodeSpeech->GetNodeParticipantName();\n\t\t\tExportNode.Text = NodeSpeech->GetNodeUnformattedText();\n\n\t\t\t// Fill Edges\n\t\t\tExportNodeEdgesToHumanReadableFormat(Node->GetNodeChildren(), ExportNode.Edges);\n\t\t\tOutFormat.SpeechNodes.Add(ExportNode);\n\t\t}\n\t\telse if (const UDlgNode_SpeechSequence* NodeSpeechSequence = Cast<UDlgNode_SpeechSequence>(Node))\n\t\t{\n\t\t\t// Speech Sequence\n\n\t\t\tFDlgNodeSpeechSequence_FormatHumanReadable ExportNode;\n\t\t\tExportNode.NodeIndex = NodeIndex;\n\t\t\tExportNode.Speaker = NodeSpeechSequence->GetNodeParticipantName();\n\n\t\t\t// Fill sequence\n\t\t\tfor (const FDlgSpeechSequenceEntry& Entry : NodeSpeechSequence->GetNodeSpeechSequence())\n\t\t\t{\n\t\t\t\tFDlgSpeechSequenceEntry_FormatHumanReadable ExportEntry;\n\t\t\t\tExportEntry.EdgeText = Entry.EdgeText;\n\t\t\t\tExportEntry.Text = Entry.Text;\n\t\t\t\tExportEntry.Speaker = Entry.Speaker;\n\t\t\t\tExportNode.Sequence.Add(ExportEntry);\n\t\t\t}\n\n\t\t\t// Fill Edges\n\t\t\tExportNodeEdgesToHumanReadableFormat(Node->GetNodeChildren(), ExportNode.Edges);\n\t\t\tOutFormat.SpeechSequenceNodes.Add(ExportNode);\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// not supported\n\t\t}\n\n\t\t// Sanity check\n\t\tif (const UDialogueGraphNode_Base* GraphNode = Cast<UDialogueGraphNode_Base>(Node->GetGraphNode()))\n\t\t{\n\t\t\tGraphNode->CheckAll();\n\t\t}\n\t}\n\n\treturn true;\n}\n\nbool UDlgHumanReadableTextCommandlet::ExportNodeToContext(const UDlgNode* Node, FDlgNodeContext_FormatHumanReadable& OutContext)\n{\n\tif (Node == nullptr)\n\t{\n\t\treturn false;\n\t}\n\n\tconst UEdGraphNode* GraphNode = Node->GetGraphNode();\n\tif (GraphNode == nullptr)\n\t{\n\t\treturn false;\n\t}\n\n\tconst UDialogueGraphNode* DialogueGraphNode = Cast<UDialogueGraphNode>(GraphNode);\n\tif (DialogueGraphNode == nullptr)\n\t{\n\t\treturn false;\n\t}\n\n\tfor (const UDialogueGraphNode* ParentNode : DialogueGraphNode->GetParentNodes())\n\t{\n\t\tOutContext.ParentNodeIndices.Add(ParentNode->GetDialogueNodeIndex());\n\t}\n\tfor (const UDialogueGraphNode* ChildNode : DialogueGraphNode->GetChildNodes())\n\t{\n\t\tOutContext.ChildNodeIndices.Add(ChildNode->GetDialogueNodeIndex());\n\t}\n\n\treturn true;\n}\n\nvoid UDlgHumanReadableTextCommandlet::ExportNodeEdgesToHumanReadableFormat(const TArray<FDlgEdge>& Edges, TArray<FDlgEdge_FormatHumanReadable>& OutEdges)\n{\n\t// Fill Edges\n\tfor (const FDlgEdge& Edge : Edges)\n\t{\n\t\tif (!Edge.IsValid())\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\n\t\tFDlgEdge_FormatHumanReadable ExportEdge;\n\t\tExportEdge.TargetNodeIndex = Edge.TargetIndex;\n\t\tExportEdge.Text = Edge.GetUnformattedText();\n\t\tOutEdges.Add(ExportEdge);\n\t}\n}\n\nbool UDlgHumanReadableTextCommandlet::ImportHumanReadableFormatIntoDialogue(const FDlgDialogue_FormatHumanReadable& Format, UDlgDialogue* Dialogue)\n{\n\tverify(Dialogue);\n\n\tbool bModified = false;\n\tif (Format.SpeechNodes.Num() == 0 && Format.SpeechSequenceNodes.Num() == 0)\n\t{\n\t\tUE_LOG(LogDlgHumanReadableTextCommandlet, Warning, TEXT(\"ImportHumanReadableFormatIntoDialogue: No data to import for Dialogue = `%s`\"), *Dialogue->GetPathName());\n\t\treturn false;\n\t}\n\n\t// Speech nodes\n\tfor (const FDlgNodeSpeech_FormatHumanReadable& HumanNode : Format.SpeechNodes)\n\t{\n\t\tif (!HumanNode.IsValid())\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Handle root Node\n\t\tconst bool bIsRootNode = HumanNode.NodeIndex == RootNodeIndex;\n\n\t\t// Node\n\t\tUDlgNode* Node = bIsRootNode ? Dialogue->GetMutableStartNode() : Dialogue->GetMutableNodeFromIndex(HumanNode.NodeIndex);\n\t\tif (Node == nullptr)\n\t\t{\n\t\t\tUE_LOG(LogDlgHumanReadableTextCommandlet, Warning, TEXT(\"Invalid node index = %d, in Dialogue = `%s`. Ignoring.\"), HumanNode.NodeIndex, *Dialogue->GetPathName());\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (!bIsRootNode)\n\t\t{\n\t\t\tUDlgNode_Speech* NodeSpeech = Cast<UDlgNode_Speech>(Node);\n\t\t\tif (NodeSpeech == nullptr)\n\t\t\t{\n\t\t\t\tUE_LOG(LogDlgHumanReadableTextCommandlet, Warning, TEXT(\"Node index = %d  is not a UDlgNode_Speech, in Dialogue = `%s`. Ignoring.\"), HumanNode.NodeIndex, *Dialogue->GetPathName());\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Node Text changed\n\t\t\tif (!NodeSpeech->GetNodeUnformattedText().EqualTo(HumanNode.Text))\n\t\t\t{\n\t\t\t\tNodeSpeech->SetNodeText(HumanNode.Text);\n\t\t\t\tbModified = true;\n\t\t\t}\n\n\t\t\t// Node speaker changed\n\t\t\tif (!NodeSpeech->GetNodeParticipantName().IsEqual(HumanNode.Speaker, ENameCase::CaseSensitive))\n\t\t\t{\n\t\t\t\tNodeSpeech->SetNodeParticipantName(HumanNode.Speaker);\n\t\t\t\tbModified = true;\n\t\t\t}\n\t\t}\n\n\t\tUDialogueGraphNode* GraphNode = Cast<UDialogueGraphNode>(Node->GetGraphNode());\n\t\tif (GraphNode == nullptr)\n\t\t{\n\t\t\tUE_LOG(LogDlgHumanReadableTextCommandlet, Warning, TEXT(\"Invalid UDialogueGraphNode for Node index = %d in Dialogue = `%s`. Ignoring.\"), HumanNode.NodeIndex, *Dialogue->GetPathName());\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Edges\n\t\tif (SetGraphNodesNewEdgesText(GraphNode, HumanNode.Edges, HumanNode.NodeIndex, Dialogue))\n\t\t{\n\t\t\tbModified = true;\n\t\t}\n\t\tGraphNode->CheckAll();\n\t}\n\n\t// Speech sequence nodes\n\tfor (const FDlgNodeSpeechSequence_FormatHumanReadable& HumanSpeechSequence : Format.SpeechSequenceNodes)\n\t{\n\t\tif (!HumanSpeechSequence.IsValid())\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Node\n\t\tUDlgNode* Node = Dialogue->GetMutableNodeFromIndex(HumanSpeechSequence.NodeIndex);\n\t\tif (Node == nullptr)\n\t\t{\n\t\t\tUE_LOG(LogDlgHumanReadableTextCommandlet,\n\t\t\t\tWarning,\n\t\t\t\tTEXT(\"Invalid node speech sequence index = %d, in Dialogue = `%s`. Ignoring.\"),\n\t\t\t\tHumanSpeechSequence.NodeIndex, *Dialogue->GetPathName());\n\t\t\tcontinue;\n\t\t}\n\n\t\tUDlgNode_SpeechSequence* NodeSpeechSequence = Cast<UDlgNode_SpeechSequence>(Node);\n\t\tif (NodeSpeechSequence == nullptr)\n\t\t{\n\t\t\tUE_LOG(LogDlgHumanReadableTextCommandlet,\n\t\t\t\tWarning,\n\t\t\t\tTEXT(\"Node node speech sequence  index = %d  is not a UDlgNode_SpeechSequence, in Dialogue = `%s`. Ignoring.\"),\n\t\t\t\tHumanSpeechSequence.NodeIndex, *Dialogue->GetPathName());\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Node speaker changed\n\t\tif (!NodeSpeechSequence->GetNodeParticipantName().IsEqual(HumanSpeechSequence.Speaker, ENameCase::CaseSensitive))\n\t\t{\n\t\t\tNodeSpeechSequence->SetNodeParticipantName(HumanSpeechSequence.Speaker);\n\t\t\tbModified = true;\n\t\t}\n\n\t\t// Sequence nodes\n\t\tTArray<FDlgSpeechSequenceEntry>& SequenceArray = *NodeSpeechSequence->GetMutableNodeSpeechSequence();\n\t\tfor (int32 SequenceIndex = 0; SequenceIndex < SequenceArray.Num() && SequenceIndex < HumanSpeechSequence.Sequence.Num(); SequenceIndex++)\n\t\t{\n\t\t\tconst FDlgSpeechSequenceEntry_FormatHumanReadable& HumanSequence = HumanSpeechSequence.Sequence[SequenceIndex];\n\n\t\t\t// Edge changed\n\t\t\tif (!SequenceArray[SequenceIndex].EdgeText.EqualTo(HumanSequence.EdgeText))\n\t\t\t{\n\t\t\t\tSequenceArray[SequenceIndex].EdgeText = HumanSequence.EdgeText;\n\t\t\t\tbModified = true;\n\t\t\t}\n\n\t\t\t// Speaker Changed\n\t\t\tif (!SequenceArray[SequenceIndex].Speaker.IsEqual(HumanSequence.Speaker, ENameCase::CaseSensitive))\n\t\t\t{\n\t\t\t\tSequenceArray[SequenceIndex].Speaker = HumanSequence.Speaker;\n\t\t\t\tbModified = true;\n\t\t\t}\n\n\t\t\t// Text changed\n\t\t\tif (!SequenceArray[SequenceIndex].Text.EqualTo(HumanSequence.Text))\n\t\t\t{\n\t\t\t\tSequenceArray[SequenceIndex].Text = HumanSequence.Text;\n\t\t\t\tbModified = true;\n\t\t\t}\n\t\t}\n\n\t\tUDialogueGraphNode* GraphNode = Cast<UDialogueGraphNode>(Node->GetGraphNode());\n\t\tif (GraphNode == nullptr)\n\t\t{\n\t\t\tUE_LOG(LogDlgHumanReadableTextCommandlet, Warning, TEXT(\"Invalid UDialogueGraphNode for Node index = %d in Dialogue = `%s`. Ignoring.\"), HumanSpeechSequence.NodeIndex, *Dialogue->GetPathName());\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Edges from big node\n\t\tif (SetGraphNodesNewEdgesText(GraphNode, HumanSpeechSequence.Edges, HumanSpeechSequence.NodeIndex, Dialogue))\n\t\t{\n\t\t\tbModified = true;\n\t\t}\n\t\tGraphNode->CheckAll();\n\t}\n\n\tif (bModified)\n\t{\n\t\tDialogue->Modify();\n\t\tDialogue->MarkPackageDirty();\n\t}\n\n\treturn bModified;\n}\n\nbool UDlgHumanReadableTextCommandlet::SetGraphNodesNewEdgesText(UDialogueGraphNode* GraphNode, const TArray<FDlgEdge_FormatHumanReadable>& Edges, int32 NodeIndex, const UDlgDialogue* Dialogue)\n{\n\tbool bModified = false;\n\n\tfor (const FDlgEdge_FormatHumanReadable& HumanEdge : Edges)\n\t{\n\t\tconst int32 EdgeIndex = GraphNode->GetChildEdgeIndexForChildNodeIndex(HumanEdge.TargetNodeIndex);\n\t\tif (EdgeIndex < 0)\n\t\t{\n\t\t\tUE_LOG(LogDlgHumanReadableTextCommandlet,\n\t\t\t\tWarning,\n\t\t\t\tTEXT(\"Invalid EdgeIndex = %d for Node index = %d in Dialogue = `%s`. Ignoring.\"),\n\t\t\t\tHumanEdge.TargetNodeIndex, NodeIndex, *Dialogue->GetPathName());\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Edge Changed\n\t\tif (!GraphNode->GetDialogueNode().GetNodeChildren()[EdgeIndex].GetUnformattedText().EqualTo(HumanEdge.Text))\n\t\t{\n\t\t\tGraphNode->SetEdgeTextAt(EdgeIndex, HumanEdge.Text);\n\t\t\tbModified = true;\n\t\t}\n\t}\n\n\treturn bModified;\n}\n\nbool UDlgHumanReadableTextCommandlet::IsEdgeTextDefault(const FText& EdgeText)\n{\n\tcheckNoEntry();\n\treturn false;\n\t// if (Settings->bSetDefaultEdgeTexts)\n\t// {\n\n\t// }\n\n\t// return UDlgSystemSettings::EdgeTextFinish.EqualToCaseIgnored(EdgeText) || UDlgSystemSettings::EdgeTextNext.EqualToCaseIgnored(EdgeText);\n}\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystemEditor/Private/Commandlets/DlgHumanReadableTextCommandlet.h",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#pragma once\n\n\n#include \"Commandlets/Commandlet.h\"\n#include \"DlgEdge.h\"\n\n#include \"DlgHumanReadableTextCommandlet.generated.h\"\n\n\nDECLARE_LOG_CATEGORY_EXTERN(LogDlgHumanReadableTextCommandlet, All, All);\n\nclass UDlgDialogue;\nclass UDlgNode;\nclass UDialogueGraphNode;\nclass UDlgSystemSettings;\n\nUSTRUCT()\nstruct FDlgNodeContext_FormatHumanReadable\n{\n\tGENERATED_USTRUCT_BODY()\npublic:\n\tUPROPERTY()\n\tTArray<int32> ParentNodeIndices;\n\n\tUPROPERTY()\n\tTArray<int32> ChildNodeIndices;\n};\n\n\n// Variant of the FDlgEdge that also tells us from what node to what node\nUSTRUCT()\nstruct FDlgEdgeOrphan_FormatHumanReadable\n{\n\tGENERATED_USTRUCT_BODY()\n\npublic:\n\t// Metadata\n\tUPROPERTY()\n\tint32 SourceNodeIndex = INDEX_NONE - 1;\n\n\tUPROPERTY()\n\tint32 TargetNodeIndex = INDEX_NONE - 1;\n\n\tUPROPERTY()\n\tFText Text;\n};\n\n\n// Variant of the FDlgEdge that is human readable\nUSTRUCT()\nstruct FDlgEdge_FormatHumanReadable\n{\n\tGENERATED_USTRUCT_BODY()\n\npublic:\n\t// Metadata\n\tUPROPERTY()\n\tint32 TargetNodeIndex = INDEX_NONE - 1;\n\n\tUPROPERTY()\n\tFText Text;\n};\n\n\n// Variant of the FDlgSpeechSequenceEntry that is human readable\nUSTRUCT()\nstruct FDlgSpeechSequenceEntry_FormatHumanReadable\n{\n\tGENERATED_USTRUCT_BODY()\npublic:\n\t// ParticipantName\n\tUPROPERTY()\n\tFName Speaker;\n\n\tUPROPERTY()\n\tFText Text;\n\n\tUPROPERTY()\n\tFText EdgeText;\n};\n\n\n// Variant of the UDlgNode_SpeechSequence that is human readable\nUSTRUCT()\nstruct FDlgNodeSpeechSequence_FormatHumanReadable\n{\n\tGENERATED_USTRUCT_BODY()\npublic:\n\t// INDEX_NONE is root node\n\tbool IsValid() const { return NodeIndex >= INDEX_NONE; }\n\npublic:\n\t// Metadata\n\tUPROPERTY()\n\tint32 NodeIndex = INDEX_NONE - 1;\n\n\tUPROPERTY()\n\tFName Speaker;\n\n\tUPROPERTY()\n\tTArray<FDlgSpeechSequenceEntry_FormatHumanReadable> Sequence;\n\n\tUPROPERTY()\n\tTArray<FDlgEdge_FormatHumanReadable> Edges;\n};\n\n\n// Variant of the UDlgNode_Speech that is human readable\nUSTRUCT()\nstruct FDlgNodeSpeech_FormatHumanReadable\n{\n\tGENERATED_USTRUCT_BODY()\n\npublic:\n\t// INDEX_NONE is root node\n\tbool IsValid() const { return NodeIndex >= INDEX_NONE; }\n\npublic:\n\t// Metadata, NodeIndex\n\tUPROPERTY()\n\tint32 NodeIndex = INDEX_NONE - 1;\n\n\tUPROPERTY()\n\tFName Speaker;\n\n\tUPROPERTY()\n\tFText Text;\n\n\tUPROPERTY()\n\tTArray<FDlgEdge_FormatHumanReadable> Edges;\n};\n\n\n// Variant of the UDlgDialogue that is human readable\nUSTRUCT()\nstruct FDlgDialogue_FormatHumanReadable\n{\n\tGENERATED_USTRUCT_BODY()\n\npublic:\n\tUPROPERTY()\n\tFName DialogueName;\n\n\tUPROPERTY()\n\tFGuid DialogueGUID;\n\n\tUPROPERTY()\n\tTArray<FDlgNodeSpeech_FormatHumanReadable> SpeechNodes;\n\n\tUPROPERTY()\n\tTArray<FDlgNodeSpeechSequence_FormatHumanReadable> SpeechSequenceNodes;\n};\n\n\nUCLASS()\nclass UDlgHumanReadableTextCommandlet : public UCommandlet\n{\n\tGENERATED_BODY()\n\npublic:\n\tUDlgHumanReadableTextCommandlet();\n\npublic:\n\n\t//~ UCommandlet interface\n\tint32 Main(const FString& Params) override;\n\n\tbool ExportDialogueToHumanReadableFormat(const UDlgDialogue& Dialogue, FDlgDialogue_FormatHumanReadable& OutFormat);\n\n\tbool ImportHumanReadableFormatIntoDialogue(const FDlgDialogue_FormatHumanReadable& Format, UDlgDialogue* Dialogue);\n\n\t// Tells us if the edge text is default\n\tbool IsEdgeTextDefault(const FText& EdgeText);\n\nprotected:\n\t// Own methods\n\tint32 Export();\n\tint32 Import();\n\n\tstatic bool ExportNodeToContext(const UDlgNode* Node, FDlgNodeContext_FormatHumanReadable& OutContext);\n\tstatic void ExportNodeEdgesToHumanReadableFormat(const TArray<FDlgEdge>& Edges, TArray<FDlgEdge_FormatHumanReadable>& OutEdges);\n\tstatic bool SetGraphNodesNewEdgesText(UDialogueGraphNode* GraphNode, const TArray<FDlgEdge_FormatHumanReadable>& Edges, int32 NodeIndex, const UDlgDialogue* Dialogue);\n\nprotected:\n\tFString OutputInputDirectory;\n\n\tTArray<UPackage*> PackagesToSave;\n\tconst UDlgSystemSettings* Settings = nullptr;\n\n\tbool bSaveAllDialogues = false;\n\tbool bExport = false;\n\tbool bImport = false;\n\n\tstatic constexpr int32 RootNodeIndex = INDEX_NONE;\n\tstatic const TCHAR* FileExtension;\n};\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystemEditor/Private/Commandlets/DlgStatsCommandlet.cpp",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n\n#include \"DlgStatsCommandlet.h\"\n#include \"DlgManager.h\"\n#include \"DlgDialogue.h\"\n#include \"DlgCommandletHelper.h\"\n#include \"Nodes/DlgNode_SpeechSequence.h\"\n#include \"Nodes/DlgNode_Speech.h\"\n#include \"DlgHelper.h\"\n\n\nDEFINE_LOG_CATEGORY(LogDlgStatsCommandlet);\n\n\nUDlgStatsCommandlet::UDlgStatsCommandlet()\n{\n\tIsClient = false;\n\tIsEditor = true;\n\tIsServer = false;\n\tLogToConsole = false;\n\tShowErrorCount = false;\n}\n\nint32 UDlgStatsCommandlet::Main(const FString& Params)\n{\n\tUE_LOG(LogDlgStatsCommandlet, Display, TEXT(\"Starting\"));\n\n\t// Parse command line - we're interested in the param vals\n\tTArray<FString> Tokens;\n\tTArray<FString> Switches;\n\tTMap<FString, FString> ParamVals;\n\tUCommandlet::ParseCommandLine(*Params, Tokens, Switches, ParamVals);\n\n\tUDlgManager::LoadAllDialoguesIntoMemory();\n\tconst TArray<UDlgDialogue*> AllDialogues = UDlgManager::GetAllDialoguesFromMemory();\n\n\tFDlgStatsDialogue TotalStats;\n\tfor (const UDlgDialogue* Dialogue : AllDialogues)\n\t{\n\t\tUPackage* Package = Dialogue->GetOutermost();\n\t\tcheck(Package);\n\t\tconst FString OriginalDialoguePath = Package->GetPathName();\n\n\t\t// Only count game dialogues\n\t\tif (!FDlgHelper::IsPathInProjectDirectory(OriginalDialoguePath))\n\t\t{\n\t\t\tUE_LOG(LogDlgStatsCommandlet, Warning, TEXT(\"Dialogue = `%s` is not in the game directory, ignoring\"), *OriginalDialoguePath);\n\t\t\tcontinue;\n\t\t}\n\n\t\tFDlgStatsDialogue DialogueStats;\n\t\tGetStatsForDialogue(*Dialogue, DialogueStats);\n\t\tTotalStats += DialogueStats;\n\t\tUE_LOG(LogDlgStatsCommandlet, Display, TEXT(\"Dialogue = %s. Total Text Word count = %d\"), *OriginalDialoguePath, DialogueStats.WordCount);\n\t}\n\n\tUE_LOG(LogDlgStatsCommandlet, Display,\n\t\tLINE_TERMINATOR TEXT(\"Stats:\") LINE_TERMINATOR\n\t\tTEXT(\"Total Text Word Count = %d\"),\n\t\tTotalStats.WordCount);\n\n\treturn 0;\n}\n\n\nbool UDlgStatsCommandlet::GetStatsForDialogue(const UDlgDialogue& Dialogue, FDlgStatsDialogue& OutStats)\n{\n\t// Root\n\tOutStats.WordCount += GetNodeWordCount(Dialogue.GetStartNode());\n\n\t// Nodes\n\tconst TArray<UDlgNode*>& Nodes = Dialogue.GetNodes();\n\tfor (int32 NodeIndex = 0; NodeIndex < Nodes.Num(); NodeIndex++)\n\t{\n\t\tOutStats.WordCount += GetNodeWordCount(*Nodes[NodeIndex]);\n\t}\n\n\treturn true;\n}\n\nint32 UDlgStatsCommandlet::GetNodeWordCount(const UDlgNode& Node) const\n{\n\tconst UDlgNode* NodePtr = &Node;\n\tint32 WordCount = 0;\n\n\tif (const UDlgNode_Speech* NodeSpeech = Cast<UDlgNode_Speech>(NodePtr))\n\t{\n\t\tWordCount += GetTextWordCount(NodeSpeech->GetNodeUnformattedText());\n\t}\n\telse if (const UDlgNode_SpeechSequence* NodeSpeechSequence = Cast<UDlgNode_SpeechSequence>(NodePtr))\n\t{\n\t\t// Speech Sequence\n\t\tfor (const FDlgSpeechSequenceEntry& Entry : NodeSpeechSequence->GetNodeSpeechSequence())\n\t\t{\n\t\t\tWordCount += GetTextWordCount(Entry.Text);\n\t\t}\n\t}\n\telse\n\t{\n\t\t// not supported\n\t}\n\n\t// Edges\n\tfor (const FDlgEdge& Edge : Node.GetNodeChildren())\n\t{\n\t\tWordCount += GetTextWordCount(Edge.GetUnformattedText());\n\t}\n\n\treturn WordCount;\n}\n\nint32 UDlgStatsCommandlet::GetStringWordCount(const FString& String) const\n{\n\tTArray<FString> Out;\n\tString.ParseIntoArray(Out, TEXT(\" \"), true);\n\treturn Out.Num();\n}\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystemEditor/Private/Commandlets/DlgStatsCommandlet.h",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#pragma once\n\n#include \"Commandlets/Commandlet.h\"\n\n#include \"DlgStatsCommandlet.generated.h\"\n\nDECLARE_LOG_CATEGORY_EXTERN(LogDlgStatsCommandlet, All, All);\n\n\nclass UDlgDialogue;\nclass UDlgNode;\n\n\nstruct FDlgStatsDialogue\n{\npublic:\n\tint32 WordCount = 0;\n\n\tFDlgStatsDialogue& operator+=(const FDlgStatsDialogue& Other)\n\t{\n\t\tWordCount += Other.WordCount;\n\t\treturn *this;\n\t}\n\n};\n\n\nUCLASS()\nclass UDlgStatsCommandlet: public UCommandlet\n{\n\tGENERATED_BODY()\n\npublic:\n\tUDlgStatsCommandlet();\n\npublic:\n\n\t//~ UCommandlet interface\n\tint32 Main(const FString& Params) override;\n\n\tbool GetStatsForDialogue(const UDlgDialogue& Dialogue, FDlgStatsDialogue& OutStats);\n\tint32 GetNodeWordCount(const UDlgNode& Node) const;\n\n\tint32 GetStringWordCount(const FString& String) const;\n\tint32 GetFNameWordCount(const FName Name) const { return GetStringWordCount(Name.ToString()); }\n\tint32 GetTextWordCount(const FText& Text) const { return GetStringWordCount(Text.ToString()); }\n};\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystemEditor/Private/DialogueBrowser/DialogueBrowserTreeNode.cpp",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#include \"DialogueBrowserTreeNode.h\"\n\n#include \"Widgets/Views/STreeView.h\"\n\n#include \"DialogueEditorUtilities.h\"\n#include \"DialogueEditor/Nodes/DialogueGraphNode.h\"\n#include \"DialogueEditor/Nodes/DialogueGraphNode_Edge.h\"\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// FDialogueBrowserTreeNode\nFDialogueBrowserTreeNode::FDialogueBrowserTreeNode(const FText& InDisplayText, const TSharedPtr<Self>& InParent)\n\t: Super(InDisplayText, InParent)\n{\n}\n\nFName FDialogueBrowserTreeNode::GetParentParticipantName() const\n{\n\tif (Parent.IsValid())\n\t{\n\t\treturn Parent.Pin()->GetParentParticipantName();\n\t}\n\n\treturn NAME_None;\n}\n\nFName FDialogueBrowserTreeNode::GetParentVariableName() const\n{\n\tif (Parent.IsValid())\n\t{\n\t\treturn Parent.Pin()->GetParentVariableName();\n\t}\n\n\treturn NAME_None;\n}\n\nUClass* FDialogueBrowserTreeNode::GetParentClass() const\n{\n\tif (Parent.IsValid())\n\t{\n\t\treturn Parent.Pin()->GetParentClass();\n\t}\n\n\treturn nullptr;\n}\n\nFString FDialogueBrowserTreeNode::ToString() const\n{\n\t// static const ANSICHAR* EDialogueTreeItemCategoryTypeStringMap[] = {\n\t// \t\"Default\",\n\t// \t\"Participant\",\n\t// \t\"Dialogue\",\n\t// \t\"Event\",\n\t// \t\"Condition\",\n\t// \t\"Variable\",\n\t// \t\"VariableInt\",\n\t// \t\"VariableFloat\",\n\t// \t\"VariableBool\",\n\t// \t\"Max\"\n\t// };\n\n\tFString Output = \"FTextItem { \";\n\n\tauto AddKeyValueField = [&Output](const FString& Key, const FString& Value, const bool bAddSeparator = true)\n\t{\n\t\tif (bAddSeparator)\n\t\t{\n\t\t\tOutput += \" | \";\n\t\t}\n\t\tOutput += Key + \" = `\" + Value + \"`\";\n\t};\n\tauto AddFNameToOutput = [&Output, &AddKeyValueField](const FString& Name, FName Value)\n\t{\n\t\tif (!Value.IsNone() && Value.IsValid())\n\t\t{\n\t\t\tAddKeyValueField(Name, Value.ToString());\n\t\t}\n\t};\n\n\tAddKeyValueField(\"Text\", DisplayText.ToString(), false);\n\t//AddFNameToOutput(\"ParticipantName\", ParticipantName);\n\t//AddFNameToOutput(\"VariableName\", VariableName);\n\n\t// if (Object.IsValid())\n\t// {\n\t// \tAddKeyValueField(\"Object Name\", Object.Get()->GetName());\n\t// }\n\tAddKeyValueField(\"Children Num\", FString::FromInt(Children.Num()));\n\n\treturn Output + \" }\";\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// FDialogueBrowserTreeRootNode\nFDialogueBrowserTreeRootNode::FDialogueBrowserTreeRootNode() :\n\tSuper(FText::FromString(TEXT(\"ROOT\")), nullptr)\n{\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// FDialogueBrowserTreeSeparatorNode\nFDialogueBrowserTreeSeparatorNode::FDialogueBrowserTreeSeparatorNode(\n\tconst TSharedPtr<FDialogueBrowserTreeNode>& InParent)\n\t: Super(FText::FromString(TEXT(\"SEPARATOR\")), InParent)\n{\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// FDialogueBrowserTreeCategoryNode\nFDialogueBrowserTreeCategoryNode::FDialogueBrowserTreeCategoryNode(\n\tconst FText& InDisplayText,\n\tconst TSharedPtr<FDialogueBrowserTreeNode>& InParent,\n\tEDialogueTreeNodeCategoryType InCategoryType\n) : Super(InDisplayText, InParent)\n{\n\tCategoryType = InCategoryType;\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// FDialogueBrowserTreeParticipantNode\nFDialogueBrowserTreeParticipantNode::FDialogueBrowserTreeParticipantNode(\n\tconst FText& InDisplayText,\n\tconst TSharedPtr<FDialogueBrowserTreeNode>& InParent,\n\tFName InParticipantName\n) : Super(InDisplayText, InParent), ParticipantName(InParticipantName)\n{\n}\n\nFName FDialogueBrowserTreeParticipantNode::GetParentParticipantName() const\n{\n\tif (ParticipantName.IsValid() && !ParticipantName.IsNone())\n\t{\n\t\treturn ParticipantName;\n\t}\n\n\treturn Super::GetParentParticipantName();\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// FDialogueBrowserTreeVariableNode\nFDialogueBrowserTreeVariableNode::FDialogueBrowserTreeVariableNode(\n\tconst FText& InDisplayText,\n\tconst TSharedPtr<FDialogueBrowserTreeNode>& InParent,\n\tFName InVariableName\n) : Super(InDisplayText, InParent), VariableName(InVariableName)\n{\n}\n\nFName FDialogueBrowserTreeVariableNode::GetParentVariableName() const\n{\n\tif (VariableName.IsValid() && !VariableName.IsNone())\n\t{\n\t\treturn VariableName;\n\t}\n\n\treturn Super::GetParentVariableName();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// FDialogueBrowserTreeCustomObjectNode\n\nFDialogueBrowserTreeCustomObjectNode::FDialogueBrowserTreeCustomObjectNode(\n    const FText& InDisplayText,\n    const TSharedPtr<FDialogueBrowserTreeNode>& InParent,\n    UClass* ObjectClass\n) : Super(InDisplayText, InParent), Class(ObjectClass)\n{\n\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// FDialogueBrowserTreeCategoryParticipantNode\nFDialogueBrowserTreeCategoryParticipantNode::FDialogueBrowserTreeCategoryParticipantNode(\n\tconst FText& InDisplayText,\n\tconst TSharedPtr<FDialogueBrowserTreeNode>& InParent,\n\tFName InParticipantName\n) : Super(InDisplayText, InParent, InParticipantName)\n{\n\tCategoryType = EDialogueTreeNodeCategoryType::Participant;\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// FDialogueBrowserTreeDialogueNode\nFDialogueBrowserTreeDialogueNode::FDialogueBrowserTreeDialogueNode(\n\tconst FText& InDisplayText,\n\tconst TSharedPtr<FDialogueBrowserTreeNode>& InParent,\n\tconst TWeakObjectPtr<const UDlgDialogue>& InObject\n) : Super(InDisplayText, InParent), Dialogue(InObject)\n{\n}\n\nFReply FDialogueBrowserTreeDialogueNode::OnClick()\n{\n\tif (Dialogue.IsValid())\n\t{\n\t\tFDialogueEditorUtilities::OpenEditorForAsset(Dialogue.Get());\n\t\treturn FReply::Handled();\n\t}\n\n\treturn FReply::Unhandled();\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// FDialogueBrowserTreeGraphNode\nFDialogueBrowserTreeGraphNode::FDialogueBrowserTreeGraphNode(\n\tconst FText& InDisplayText,\n\tconst TSharedPtr<FDialogueBrowserTreeNode>& InParent,\n\tconst TWeakObjectPtr<const UDialogueGraphNode>& InObject\n) : Super(InDisplayText, InParent), GraphNode(InObject)\n{\n}\n\nFReply FDialogueBrowserTreeGraphNode::OnClick()\n{\n\tif (GraphNode.IsValid())\n\t{\n\t\treturn FDialogueEditorUtilities::OpenEditorAndJumpToGraphNode(Cast<UDialogueGraphNode_Base>(GraphNode.Get()))\n\t\t\t\t? FReply::Handled() : FReply::Unhandled();\n\t}\n\n\treturn FReply::Unhandled();\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// FDialogueBrowserTreeEdgeNode\nFDialogueBrowserTreeEdgeNode::FDialogueBrowserTreeEdgeNode(\n\tconst FText& InDisplayText,\n\tconst TSharedPtr<FDialogueBrowserTreeNode>& InParent,\n\tconst TWeakObjectPtr<const UDialogueGraphNode_Edge>& InObject\n) : Super(InDisplayText, InParent), EdgeNode(InObject)\n{\n}\n\nFReply FDialogueBrowserTreeEdgeNode::OnClick()\n{\n\tif (EdgeNode.IsValid())\n\t{\n\t\treturn FDialogueEditorUtilities::OpenEditorAndJumpToGraphNode(Cast<UDialogueGraphNode_Base>(EdgeNode.Get()))\n\t\t\t\t? FReply::Handled() : FReply::Unhandled();\n\t}\n\n\treturn FReply::Unhandled();\n}\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystemEditor/Private/DialogueBrowser/DialogueBrowserTreeNode.h",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#pragma once\n\n#include \"CoreMinimal.h\"\n#include \"Widgets/Views/STreeView.h\"\n\n#include \"TreeViewHelpers/DlgTreeViewNode.h\"\n\nclass FDialogueBrowserTreeNode;\nclass UDlgDialogue;\nclass UDialogueGraphNode;\nclass UDialogueGraphNode_Edge;\n\n// The types of categories.\nenum class EDialogueTreeNodeCategoryType : uint8\n{\n\tDefault = 0,\n\n\tParticipant,\n\tDialogue,\n\tEvent,\n\tCondition,\n\n\tVariable,\n\tVariableInt,\n\tVariableFloat,\n\tVariableBool,\n\tVariableFName,\n\n\tClassVariable,\n\tClassVariableInt,\n\tClassVariableFloat,\n\tClassVariableBool,\n\tClassVariableFName,\n\tClassVariableFText,\n\n\tMax\n};\n\nenum class EDialogueTreeNodeTextType : uint8\n{\n\tDefault = 0,\n\n\tParticipantDialogue,\n\tParticipantEvent,\n\tParticipantCustomEvent,\n\tParticipantCondition,\n\tParticipantVariableInt,\n\tParticipantVariableFloat,\n\tParticipantVariableBool,\n\tParticipantVariableFName,\n\tParticipantClassVariableInt,\n\tParticipantClassVariableFloat,\n\tParticipantClassVariableBool,\n\tParticipantClassVariableFName,\n\tParticipantClassVariableFText,\n\n\tEventDialogue,\n\tCustomEventDialogue,\n\tEventGraphNode,\n\tCustomEventGraphNode,\n\n\tConditionDialogue,\n\tConditionGraphNode,\n\tConditionEdgeNode,\n\n\tIntVariableDialogue,\n\tIntClassVariableDialogue,\n\tIntVariableGraphNode,\n\tIntVariableEdgeNode,\n\n\tFloatVariableDialogue,\n\tFloatClassVariableDialogue,\n\tFloatVariableGraphNode,\n\tFloatVariableEdgeNode,\n\n\tBoolVariableDialogue,\n\tBoolClassVariableDialogue,\n\tBoolVariableGraphNode,\n\tBoolVariableEdgeNode,\n\n\tFNameVariableDialogue,\n\tFNameClassVariableDialogue,\n\tFNameVariableGraphNode,\n\tFNameVariableEdgeNode,\n\n\tFTextClassVariableDialogue,\n\tFTextVariableGraphNode,\n\tFTextVariableEdgeNode,\n\n\tMax\n};\n\n\n/**\n * Defines the singular Text item in the Tree.\n * For Category type see FDialogueBrowserTreeCategoryNode.\n */\nclass FDialogueBrowserTreeNode : public FDlgTreeViewNode<FDialogueBrowserTreeNode>\n{\n\ttypedef FDialogueBrowserTreeNode Self;\n\ttypedef FDlgTreeViewNode Super;\n\npublic:\n\tFDialogueBrowserTreeNode(const FText& InDisplayText, const TSharedPtr<Self>& InParent);\n\n\t/** Gets the Participant Name that this Node belongs to. This must always return a valid value. */\n\tvirtual FName GetParentParticipantName() const;\n\n\t/** Gets the Variable name that this Node belongs to if any. This could be empty in most cases. */\n\tvirtual FName GetParentVariableName() const;\n\n\t/** Gets the Class that this Node belongs to if any. This could be empty in most cases. */\n\tvirtual UClass* GetParentClass() const;\n\n\t//\n\t// Getters for the properties\n\t//\n\n\t// TextType:\n\tEDialogueTreeNodeTextType GetTextType() const { return TextType; }\n\tvoid SetTextType(EDialogueTreeNodeTextType InTextType) { TextType = InTextType; }\n\n\t// CategoryType:\n\tEDialogueTreeNodeCategoryType GetCategoryType() const { return CategoryType; }\n\n\t// Children/InlineChildren:\n\tvoid AddChild(const TSharedPtr<Self>& ChildNode) override\n\t{\n\t\tensure(!IsSeparator());\n\t\tSuper::AddChild(ChildNode);\n\t}\n\tvoid ClearChildren() override\n\t{\n\t\tSuper::ClearChildren();\n\t\tInlineChildren.Empty();\n\t}\n\n\tvoid AddInlineChild(const TSharedPtr<Self>& ChildNode, bool bIsInline = false)\n\t{\n\t\tensure(!ChildNode->IsRoot());\n\t\tensure(!IsSeparator());\n\t\tChildNode->SetParent(this->AsShared());\n\t\tInlineChildren.Add(ChildNode);\n\t}\n\tbool HasInlineChildren() const { return InlineChildren.Num() > 0; }\n\tconst TArray<TSharedPtr<Self>>& GetInlineChildren() const { return InlineChildren; }\n\tvoid SetInlineChildren(const TArray<TSharedPtr<Self>>& InChildren)\n\t{\n\t\tInlineChildren = InChildren;\n\t\tfor (const TSharedPtr<Self>& Child : InlineChildren)\n\t\t{\n\t\t\tChild->SetParent(this->AsShared());\n\t\t}\n\t}\n\n\t// Checks type of this Node.\n\tvirtual bool IsText() const { return TextType != EDialogueTreeNodeTextType::Default; }\n\tvirtual bool IsCategory() const { return false; }\n\tvirtual bool IsSeparator() const { return false; }\n\tbool IsDialogueText() const\n\t{\n\t\treturn IsText() &&\n\t\t\t  (TextType == EDialogueTreeNodeTextType::ParticipantDialogue\n\t\t\t|| TextType == EDialogueTreeNodeTextType::EventDialogue\n\t\t\t|| TextType == EDialogueTreeNodeTextType::CustomEventDialogue\n\t\t\t|| TextType == EDialogueTreeNodeTextType::ConditionDialogue\n\t\t\t|| TextType == EDialogueTreeNodeTextType::IntVariableDialogue\n\t\t\t|| TextType == EDialogueTreeNodeTextType::FloatVariableDialogue\n\t\t\t|| TextType == EDialogueTreeNodeTextType::BoolVariableDialogue\n\t\t\t|| TextType == EDialogueTreeNodeTextType::FNameVariableDialogue\n\t\t\t|| TextType == EDialogueTreeNodeTextType::IntClassVariableDialogue\n\t\t\t|| TextType == EDialogueTreeNodeTextType::FloatClassVariableDialogue\n\t\t\t|| TextType == EDialogueTreeNodeTextType::BoolClassVariableDialogue\n\t\t\t|| TextType == EDialogueTreeNodeTextType::FTextClassVariableDialogue\n\t\t\t|| TextType == EDialogueTreeNodeTextType::FNameClassVariableDialogue);\n\t}\n\tbool IsEventText() const\n\t{\n\t\treturn IsText() && TextType == EDialogueTreeNodeTextType::ParticipantEvent;\n\t}\n\tbool IsCustomEventText() const\n\t{\n\t\treturn IsText() && TextType == EDialogueTreeNodeTextType::ParticipantCustomEvent;\n\t}\n\tbool IsConditionText() const\n\t{\n\t\treturn IsText() && (TextType == EDialogueTreeNodeTextType::ParticipantCondition);\n\t}\n\tbool IsGraphNodeText() const\n\t{\n\t\treturn IsText() &&\n\t\t\t  (TextType == EDialogueTreeNodeTextType::EventGraphNode\n\t\t\t|| TextType == EDialogueTreeNodeTextType::CustomEventGraphNode\n\t\t\t|| TextType == EDialogueTreeNodeTextType::ConditionGraphNode\n\t\t\t|| TextType == EDialogueTreeNodeTextType::IntVariableGraphNode\n\t\t\t|| TextType == EDialogueTreeNodeTextType::FloatVariableGraphNode\n\t\t\t|| TextType == EDialogueTreeNodeTextType::BoolVariableGraphNode\n\t\t\t|| TextType == EDialogueTreeNodeTextType::FTextVariableGraphNode\n\t\t\t|| TextType == EDialogueTreeNodeTextType::FNameVariableGraphNode);\n\t}\n\tbool IsEdgeNodeText()\n\t{\n\t\treturn IsText() &&\n\t\t\t  (TextType == EDialogueTreeNodeTextType::ConditionEdgeNode\n\t\t\t|| TextType == EDialogueTreeNodeTextType::IntVariableEdgeNode\n\t\t\t|| TextType == EDialogueTreeNodeTextType::FloatVariableEdgeNode\n\t\t\t|| TextType == EDialogueTreeNodeTextType::BoolVariableEdgeNode\n\t\t\t|| TextType == EDialogueTreeNodeTextType::FTextVariableEdgeNode\n\t\t\t|| TextType == EDialogueTreeNodeTextType::FNameVariableEdgeNode);\n\t}\n\n\t// Gets the textual representation of this item\n\tFString ToString() const;\n\n\t// Is this equal with Other?\n\tvirtual bool IsEqual(const Self& Other)\n\t{\n\t\treturn TextType == Other.GetTextType() &&\n\t\t\tCategoryType == Other.GetCategoryType() &&\n\t\t\tDisplayText.EqualTo(Other.GetDisplayText()) &&\n\t\t\tGetParentParticipantName() == Other.GetParentParticipantName() &&\n\t\t\tGetParentVariableName() == Other.GetParentVariableName();\n\t}\n\n\tbool operator==(const Self& Other)\n\t{\n\t\treturn IsEqual(Other);\n\t}\n\nprotected:\n\t// FDlgTreeViewNode Interface\n\tvoid PostFilterPathsToNodes(const TSharedPtr<Self>& Child) override\n\t{\n\t\tSuper::PostFilterPathsToNodes(Child);\n\n\t\t// Hide separators\n\t\tif (Child->IsSeparator())\n\t\t{\n\t\t\tChild->SetIsVisible(false);\n\t\t}\n\t\t// Some child has the InSearch or this Node has the text\n\t\t//Children[Index]->SetIsVisible(NumBefore != OutNodes.Num() || Children[Index]->TextContains(InSearch));\n\t}\n\n\tvoid PostBuildPathToTopMostParent(const TSharedPtr<Self>& CurrentParentNode) override\n\t{\n\t\tSuper::PostBuildPathToTopMostParent(CurrentParentNode);\n\t\tcheck(!CurrentParentNode->IsSeparator());\n\t}\n\n\tbool FilterIsChildVisible(const TSharedPtr<Self>& GrandChild) override\n\t{\n\t\treturn !GrandChild->IsSeparator() && !GrandChild->IsCategory() && Super::FilterIsChildVisible(GrandChild);\n\t}\n\n\tbool FilterDoesChildContainText(const TSharedPtr<Self>& Child, const FString& InSearch) override\n\t{\n\t\treturn !Child->IsSeparator() && Super::FilterDoesChildContainText(Child, InSearch);\n\t}\n\nprotected:\n\t// Specific category type, only used if Type is Category.\n\tEDialogueTreeNodeCategoryType CategoryType = EDialogueTreeNodeCategoryType::Default;\n\n\t// Specific text type, only used if the Type is Text.\n\tEDialogueTreeNodeTextType TextType = EDialogueTreeNodeTextType::Default;\n\n\t// Inline Nodes, Nodes that are displayed in the same line as this Node\n\tTArray<TSharedPtr<Self>> InlineChildren;\n};\n\n\n// Root node of the Dialogue browser\nclass FDialogueBrowserTreeRootNode : public FDialogueBrowserTreeNode\n{\n\ttypedef FDialogueBrowserTreeNode Super;\npublic:\n\tFDialogueBrowserTreeRootNode();\n};\n\n\n// Separator node of the Dialogue browser\nclass FDialogueBrowserTreeSeparatorNode : public FDialogueBrowserTreeNode\n{\n\ttypedef FDialogueBrowserTreeNode Super;\npublic:\n\tFDialogueBrowserTreeSeparatorNode(const TSharedPtr<FDialogueBrowserTreeNode>& InParent = nullptr);\n\tbool IsText() const override { return false; }\n\tbool IsCategory() const  override { return false; }\n\tbool IsSeparator() const override { return true; }\n};\n\n\n/**\n * Category node of the Dialogue browser. Defines a node that is a Category.\n * The same as FDialogueBrowserTreeNode only that is of type Text.\n */\nclass FDialogueBrowserTreeCategoryNode : public FDialogueBrowserTreeNode\n{\n\ttypedef FDialogueBrowserTreeNode Super;\npublic:\n\tFDialogueBrowserTreeCategoryNode(\n\t\tconst FText& InDisplayText,\n\t\tconst TSharedPtr<FDialogueBrowserTreeNode>& InParent,\n\t\tEDialogueTreeNodeCategoryType InCategoryType\n\t);\n\n\tbool IsText() const override { return false; }\n\tbool IsCategory() const  override { return CategoryType != EDialogueTreeNodeCategoryType::Default; }\n};\n\n\n// Node results that represents the Participant Name.\nclass FDialogueBrowserTreeParticipantNode : public FDialogueBrowserTreeNode\n{\n\ttypedef FDialogueBrowserTreeParticipantNode Self;\n\ttypedef FDialogueBrowserTreeNode Super;\npublic:\n\tFDialogueBrowserTreeParticipantNode(\n\t\tconst FText& InDisplayText,\n\t\tconst TSharedPtr<FDialogueBrowserTreeNode>& InParent,\n\t\tFName InParticipantName\n\t);\n\n\t// ParticipantName:\n\tFName GetParentParticipantName() const override;\n\nprotected:\n\t/** The Participant Name it represents. */\n\tFName ParticipantName = NAME_None;\n};\n\n\n// Node results that represents a Variable Name.\nclass FDialogueBrowserTreeVariableNode : public FDialogueBrowserTreeNode\n{\n\ttypedef FDialogueBrowserTreeVariableNode Self;\n\ttypedef FDialogueBrowserTreeNode Super;\n\npublic:\n\tFDialogueBrowserTreeVariableNode(\n\t\tconst FText& InDisplayText,\n\t\tconst TSharedPtr<FDialogueBrowserTreeNode>& InParent,\n\t\tFName InVariableName\n\t);\n\n\t// VariableName:\n\tFName GetParentVariableName() const override;\n\nprotected:\n\t// Used to store Event, Condition, IntName, Dialogue name etc\n\tFName VariableName = NAME_None;\n};\n\n// Node result that represents a custom object\nclass FDialogueBrowserTreeCustomObjectNode : public FDialogueBrowserTreeNode\n{\n\ttypedef FDialogueBrowserTreeCustomObjectNode Self;\n\ttypedef FDialogueBrowserTreeNode Super;\n\npublic:\n\tFDialogueBrowserTreeCustomObjectNode(\n        const FText& InDisplayText,\n        const TSharedPtr<FDialogueBrowserTreeNode>& InParent,\n        UClass* ObjectClass\n    );\n\n\t// Class\n\tUClass* GetClass() const { return Class.Get(); }\n\tUClass* GetParentClass() const { return GetClass(); }\n\nprotected:\n\t// Class this represents\n\tTWeakObjectPtr<UClass> Class = nullptr;\n};\n\n\n// Similar to the FDialogueBrowserTreeParticipantNode only this is a Category\nclass FDialogueBrowserTreeCategoryParticipantNode : public FDialogueBrowserTreeParticipantNode\n{\n\ttypedef FDialogueBrowserTreeParticipantNode Super;\npublic:\n\tFDialogueBrowserTreeCategoryParticipantNode(\n\t\tconst FText& InDisplayText,\n\t\tconst TSharedPtr<FDialogueBrowserTreeNode>& InParent,\n\t\tFName InParticipantName\n\t);\n\n\tbool IsText() const override { return false; }\n\tbool IsCategory() const override { return true; }\n};\n\n\n// Node results that represents the Dialogue.\nclass FDialogueBrowserTreeDialogueNode : public FDialogueBrowserTreeNode\n{\n\ttypedef FDialogueBrowserTreeDialogueNode Self;\n\ttypedef FDialogueBrowserTreeNode Super;\npublic:\n\tFDialogueBrowserTreeDialogueNode(\n\t\tconst FText& InDisplayText,\n\t\tconst TSharedPtr<FDialogueBrowserTreeNode>& InParent,\n\t\tconst TWeakObjectPtr<const UDlgDialogue>& InObject\n\t);\n\n\t// Dialogue:\n\tconst TWeakObjectPtr<const UDlgDialogue>& GetDialogue() const { return Dialogue; }\n\tFReply OnClick() override;\n\n\tbool IsEqual(const Super& Other) override\n\t{\n\t\tif (const Self* OtherSelf = static_cast<const Self*>(&Other))\n\t\t{\n\t\t\treturn Dialogue == OtherSelf->GetDialogue() && Super::IsEqual(Other);\n\t\t}\n\t\treturn false;\n\t}\n\nprotected:\n\t// The Dialogue this represents.\n\tTWeakObjectPtr<const UDlgDialogue> Dialogue;\n};\n\n\n// Node results that represents the GraphNode.\nclass FDialogueBrowserTreeGraphNode : public FDialogueBrowserTreeNode\n{\n\ttypedef FDialogueBrowserTreeGraphNode Self;\n\ttypedef FDialogueBrowserTreeNode Super;\npublic:\n\tFDialogueBrowserTreeGraphNode(\n\t\tconst FText& InDisplayText,\n\t\tconst TSharedPtr<FDialogueBrowserTreeNode>& InParent,\n\t\tconst TWeakObjectPtr<const UDialogueGraphNode>& InObject\n\t);\n\n\t// GraphNode:\n\tconst TWeakObjectPtr<const UDialogueGraphNode>& GetGraphNode() const { return GraphNode; }\n\tFReply OnClick() override;\n\n\tbool IsEqual(const Super& Other) override\n\t{\n\t\tif (const Self* OtherSelf = static_cast<const Self*>(&Other))\n\t\t{\n\t\t\treturn GraphNode == OtherSelf->GetGraphNode() && Super::IsEqual(Other);\n\t\t}\n\t\treturn false;\n\t}\n\nprotected:\n\t// The GraphNode this represents.\n\tTWeakObjectPtr<const UDialogueGraphNode> GraphNode;\n};\n\n\n// Node results that represents the EdgeNode.\nclass FDialogueBrowserTreeEdgeNode : public FDialogueBrowserTreeNode\n{\n\ttypedef FDialogueBrowserTreeEdgeNode Self;\n\ttypedef FDialogueBrowserTreeNode Super;\npublic:\n\tFDialogueBrowserTreeEdgeNode(\n\t\tconst FText& InDisplayText,\n\t\tconst TSharedPtr<FDialogueBrowserTreeNode>& InParent,\n\t\tconst TWeakObjectPtr<const UDialogueGraphNode_Edge>& InObject\n\t);\n\n\t// EdgeNode:\n\tconst TWeakObjectPtr<const UDialogueGraphNode_Edge>& GetEdgeNode() const { return EdgeNode; }\n\tFReply OnClick() override;\n\n\tbool IsEqual(const Super& Other) override\n\t{\n\t\tif (const Self* OtherSelf = static_cast<const Self*>(&Other))\n\t\t{\n\t\t\treturn EdgeNode == OtherSelf->GetEdgeNode() && Super::IsEqual(Other);\n\t\t}\n\t\treturn false;\n\t}\n\nprotected:\n\t// The EdgeNode this represents.\n\tTWeakObjectPtr<const UDialogueGraphNode_Edge> EdgeNode;\n};\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystemEditor/Private/DialogueBrowser/DialogueBrowserUtilities.cpp",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n\n#include \"DialogueBrowserUtilities.h\"\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystemEditor/Private/DialogueBrowser/DialogueBrowserUtilities.h",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#pragma once\n\n#include \"CoreMinimal.h\"\n\n#include \"DialogueBrowserTreeNode.h\"\n#include \"DialogueTreeProperties/DialogueBrowserTreeParticipantProperties.h\"\n\nenum class EDialogueBrowserSortOption : uint8\n{\n\tName = 0,\n\tDialogueReferences\n};\n\nstruct FDialogueBrowserSortOption\n{\n\npublic:\n\tFDialogueBrowserSortOption(EDialogueBrowserSortOption InOption, FName InName)\n\t\t: Option(InOption), Name(InName) {}\n\n\tFName GetFName() const { return Name; }\n\tFText GetFText() const { return FText::FromName(Name); }\n\tFString GetFString() const { return Name.ToString(); }\n\n\tbool IsByName() const { return Option == EDialogueBrowserSortOption::Name; }\n\npublic:\n\tEDialogueBrowserSortOption Option;\n\n\t// The name of the option.\n\tFName Name;\n\n\t// TODO add ascending descending\n};\n\nclass FDialogueBrowserUtilities\n{\npublic:\n\t// Compare two FDialogueBrowserTreeNode\n\tstatic bool PredicateCompareDialogueTreeNode(\n\t\tconst TSharedPtr<FDialogueBrowserTreeNode>& FirstNode,\n\t\tconst TSharedPtr<FDialogueBrowserTreeNode> SecondNode\n\t)\n\t{\n\t\tcheck(FirstNode.IsValid());\n\t\tcheck(SecondNode.IsValid());\n\t\treturn *FirstNode == *SecondNode;\n\t}\n\n\t// Predicate that sorts participants by dialogue number references, in descending order.\n\tstatic bool PredicateSortByDialoguesNumDescending(\n\t\tFName FirstParticipant,\n\t\tFName SecondParticipant,\n\t\tconst TMap<FName, TSharedPtr<FDialogueBrowserTreeParticipantProperties>>& ParticipantsProperties\n\t)\n\t{\n\t\tint32 FirstNum = 0;\n\t\tint32 SecondNum = 0;\n\n\t\tconst TSharedPtr<FDialogueBrowserTreeParticipantProperties>* FirstPtr =\n\t\t\tParticipantsProperties.Find(FirstParticipant);\n\t\tif (FirstPtr)\n\t\t{\n\t\t\tFirstNum = (*FirstPtr)->GetDialogues().Num();\n\t\t}\n\t\tconst TSharedPtr<FDialogueBrowserTreeParticipantProperties>* SecondPtr =\n\t\t\tParticipantsProperties.Find(SecondParticipant);\n\t\tif (SecondPtr)\n\t\t{\n\t\t\tSecondNum = (*SecondPtr)->GetDialogues().Num();\n\t\t}\n\n\t\treturn FirstNum > SecondNum;\n\t}\n};\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystemEditor/Private/DialogueBrowser/DialogueTreeProperties/DialogueBrowserTreeParticipantProperties.h",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#pragma once\n#include \"CoreMinimal.h\"\n\n#include \"DialogueBrowserTreeVariableProperties.h\"\n#include \"TreeViewHelpers/DlgTreeViewParticipantProperties.h\"\n\n/** Used as a key in the fast lookup table. */\nclass FDialogueBrowserTreeParticipantProperties : public FDlgTreeViewParticipantProperties<FDialogueBrowserTreeVariableProperties>\n{\n\ttypedef FDialogueBrowserTreeParticipantProperties Self;\n\ttypedef FDlgTreeViewParticipantProperties Super;\n\npublic:\n\tFDialogueBrowserTreeParticipantProperties(const TSet<TWeakObjectPtr<const UDlgDialogue>>& InDialogues) : Super(InDialogues) {}\n\tFDialogueBrowserTreeParticipantProperties(const TSet<TWeakObjectPtr<const UDlgDialogue>>&& InDialogues) : Super(InDialogues) {}\n};\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystemEditor/Private/DialogueBrowser/DialogueTreeProperties/DialogueBrowserTreeVariableProperties.cpp",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#include \"DialogueBrowserTreeVariableProperties.h\"\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// FDialogueTreeVariableProperties\nFDialogueBrowserTreeVariableProperties::FDialogueBrowserTreeVariableProperties(const TSet<TWeakObjectPtr<const UDlgDialogue>>& InDialogues)\n\t: Super(InDialogues)\n{\n\t// Empty initialize the graph nodes\n\tfor (TWeakObjectPtr<const UDlgDialogue> Dialogue: InDialogues)\n\t{\n\t\tGraphNodes.Add(Dialogue->GetGUID(), {});\n\t}\n\n\t// Empty initialize the edge nodes\n\tfor (TWeakObjectPtr<const UDlgDialogue> Dialogue : InDialogues)\n\t{\n\t\tEdgeNodes.Add(Dialogue->GetGUID(), {});\n\t}\n}\n\nvoid FDialogueBrowserTreeVariableProperties::AddDialogue(TWeakObjectPtr<const UDlgDialogue> Dialogue)\n{\n\tSuper::AddDialogue(Dialogue);\n\n\t// Initialize the graph nodes\n\t{\n\t\tconst FGuid Id = Dialogue->GetGUID();\n\t\tauto* SetPtr = GraphNodes.Find(Id);\n\t\tif (SetPtr == nullptr)\n\t\t{\n\t\t\t// Does not exist, empty initialize.\n\t\t\tGraphNodes.Add(Id, {});\n\t\t}\n\t}\n\n\t// Initialize the edge nodes\n\t{\n\n\t\tconst FGuid ID = Dialogue->GetGUID();\n\t\tauto* SetPtr = EdgeNodes.Find(ID);\n\t\tif (SetPtr == nullptr)\n\t\t{\n\t\t\t// Does not exist, empty initialize.\n\t\t\tEdgeNodes.Add(ID, {});\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystemEditor/Private/DialogueBrowser/DialogueTreeProperties/DialogueBrowserTreeVariableProperties.h",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#pragma once\n\n#include \"CoreMinimal.h\"\n\n#include \"DlgManager.h\"\n#include \"TreeViewHelpers/DlgTreeViewVariableProperties.h\"\n\nclass UDialogueGraphNode;\nclass UDialogueGraphNode_Edge;\nclass UDlgDialogue;\nclass FDialogueBrowserTreeVariableProperties;\n\nclass FDialogueBrowserTreeVariableProperties : public FDlgTreeViewVariableProperties\n{\n\ttypedef FDialogueBrowserTreeVariableProperties Self;\n\ttypedef FDlgTreeViewVariableProperties Super;\n\npublic:\n\tFDialogueBrowserTreeVariableProperties(const TSet<TWeakObjectPtr<const UDlgDialogue>>& InDialogues);\n\n\t// Dialogues:\n\tvoid AddDialogue(TWeakObjectPtr<const UDlgDialogue> Dialogue) override;\n\n\t// GraphNodes:\n\tbool HasGraphNodeSet(const FGuid& DialogueGUID) { return GraphNodes.Find(DialogueGUID) != nullptr; }\n\tTSet<TWeakObjectPtr<const UDialogueGraphNode>>* GetMutableGraphNodeSet(const FGuid& DialogueGUID)\n\t{\n\t\treturn GraphNodes.Find(DialogueGUID);\n\t}\n\tconst TSet<TWeakObjectPtr<const UDialogueGraphNode>>& GetGraphNodeSet(const FGuid& DialogueGUID) const\n\t{\n\t\tauto* SetPtr = GraphNodes.Find(DialogueGUID);\n\t\tcheck(SetPtr);\n\t\treturn *SetPtr;\n\t}\n\n\t// EdgeNodes:\n\tbool HasEdgeNodeSet(const FGuid& DialogueGUID) { return EdgeNodes.Find(DialogueGUID) != nullptr; }\n\tTSet<TWeakObjectPtr<const UDialogueGraphNode_Edge>>* GetMutableEdgeNodeSet(const FGuid& DialogueGUID)\n\t{\n\t\treturn EdgeNodes.Find(DialogueGUID);\n\t}\n\tconst TSet<TWeakObjectPtr<const UDialogueGraphNode_Edge>>& GetEdgeNodeSet(const FGuid& DialogueGUID) const\n\t{\n\t\tauto* SetPtr = EdgeNodes.Find(DialogueGUID);\n\t\tcheck(SetPtr);\n\t\treturn *SetPtr;\n\t}\n\nprotected:\n\t/**\n\t * All the nodes that contain this variable property\n\t * Key: The unique identifier for the Dialogue\n\t * Value: All nodes in the Dialogue that contain this variable name.\n\t */\n\tTMap<FGuid, TSet<TWeakObjectPtr<const UDialogueGraphNode>>> GraphNodes;\n\n\t/**\n\t * All the edge nodes that contain this variable property\n\t * Key: The unique identifier for the Dialogue\n\t * Value: All edge in the Dialogue that contain this condition.\n\t */\n\tTMap<FGuid, TSet<TWeakObjectPtr<const UDialogueGraphNode_Edge>>> EdgeNodes;\n};\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystemEditor/Private/DialogueBrowser/SDialogueBrowser.cpp",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#include \"SDialogueBrowser.h\"\n\n#include \"Editor.h\"\n#include \"Toolkits/AssetEditorManager.h\"\n#include \"Widgets/Input/SComboBox.h\"\n#include \"Widgets/Input/SSearchBox.h\"\n#include \"Widgets/Images/SImage.h\"\n#include \"Widgets/Layout/SMissingWidget.h\"\n#include \"Widgets/Layout/SWrapBox.h\"\n#include \"Widgets/Input/SButton.h\"\n\n#include \"DlgManager.h\"\n#include \"DlgDialogue.h\"\n#include \"DialogueStyle.h\"\n#include \"DialogueSearch/DialogueSearchUtilities.h\"\n#include \"DialogueEditor/Nodes/DialogueGraphNode.h\"\n#include \"DialogueEditor/Nodes/DialogueGraphNode_Edge.h\"\n#include \"DialogueBrowserUtilities.h\"\n#include \"SourceCodeNavigation.h\"\n#include \"Engine/BlueprintGeneratedClass.h\"\n#include \"TreeViewHelpers/DlgTreeViewHelper.h\"\n#include \"Framework/MultiBox/MultiBoxBuilder.h\"\n#include \"Kismet2/KismetEditorUtilities.h\"\n\n#define LOCTEXT_NAMESPACE \"SDialogueBrowser\"\n#define DEFAULT_FONT(...) FCoreStyle::GetDefaultFontStyle(__VA_ARGS__)\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\ntemplate<typename ItemType>\nclass SCategoryHeaderTableRow : public STableRow<ItemType>\n{\nprivate:\n\ttypedef SCategoryHeaderTableRow Self;\n\npublic:\n\tSLATE_BEGIN_ARGS(SCategoryHeaderTableRow)\n\t{}\n\t\tSLATE_DEFAULT_SLOT(typename SCategoryHeaderTableRow::FArguments, Content)\n\tSLATE_END_ARGS()\n\n\tvoid Construct(const FArguments& InArgs, const TSharedRef<STableViewBase>& InOwnerTableView)\n\t{\n\t\tSTableRow<ItemType>::ChildSlot\n\t\t.Padding(8.0f, 2.0f, 0.0f, 0.0f)\n\t\t[\n\t\t\tSAssignNew(ContentBorder, SBorder)\n\t\t\t.BorderImage(this, &Self::GetBackgroundImage)\n\t\t\t.Padding(FMargin(1.0f, 3.0f))\n\t\t\t.BorderBackgroundColor(FLinearColor(.6, .6, .6, 1.0f))\n\t\t\t[\n\t\t\t\tSNew(SHorizontalBox)\n\n\t\t\t\t+SHorizontalBox::Slot()\n\t\t\t\t.VAlign(VAlign_Center)\n\t\t\t\t.Padding(2.0f, 2.0f, 2.0f, 2.0f)\n\t\t\t\t.AutoWidth()\n\t\t\t\t[\n\t\t\t\t\tSNew(SExpanderArrow, STableRow<ItemType>::SharedThis(this))\n\t\t\t\t]\n\n\t\t\t\t+SHorizontalBox::Slot()\n\t\t\t\t.VAlign(VAlign_Center)\n\t\t\t\t[\n\t\t\t\t\tInArgs._Content.Widget\n\t\t\t\t]\n\t\t\t]\n\t\t];\n\n\t\tSTableRow<ItemType>::ConstructInternal(\n\t\t\ttypename STableRow<ItemType>::FArguments()\n\t\t\t.Style(FEditorStyle::Get(), \"DetailsView.TreeView.TableRow\")\n\t\t\t.ShowSelection(false),\n\t\t\tInOwnerTableView\n\t\t);\n\t}\n\n\tconst FSlateBrush* GetBackgroundImage() const\n\t{\n\t\tif (STableRow<ItemType>::IsHovered())\n\t\t{\n\t\t\treturn STableRow<ItemType>::IsItemExpanded() ? FEditorStyle::GetBrush(\"DetailsView.CategoryTop_Hovered\") : FEditorStyle::GetBrush(\"DetailsView.CollapsedCategory_Hovered\");\n\t\t}\n\n\t\treturn STableRow<ItemType>::IsItemExpanded() ? FEditorStyle::GetBrush(\"DetailsView.CategoryTop\") : FEditorStyle::GetBrush(\"DetailsView.CollapsedCategory\");\n\t}\n\n\tvoid SetContent(TSharedRef<SWidget> InContent) override\n\t{\n\t\tContentBorder->SetContent(InContent);\n\t}\n\n\tvoid SetRowContent(TSharedRef< SWidget > InContent) override\n\t{\n\t\tContentBorder->SetContent(InContent);\n\t}\n\nprivate:\n\tTSharedPtr<SBorder> ContentBorder;\n};\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// SDialogueBrowser\nvoid SDialogueBrowser::Construct(const FArguments& InArgs)\n{\n\tDefaultSortOption = MakeShared<FDialogueBrowserSortOption>(EDialogueBrowserSortOption::DialogueReferences, TEXT(\"Dialogue References\"));\n\tSelectedSortOption = DefaultSortOption;\n\tSortOptions = {\n\t\tDefaultSortOption,\n\t\tMakeShared<FDialogueBrowserSortOption>(EDialogueBrowserSortOption::Name, TEXT(\"Name\"))\n\t};\n\n\tRootTreeItem = MakeShared<FDialogueBrowserTreeRootNode>();\n\tParticipantsTreeView = SNew(STreeView<TSharedPtr<FDialogueBrowserTreeNode>>)\n\t\t.ItemHeight(32)\n\t\t.TreeItemsSource(&RootChildren)\n\t\t.OnGenerateRow(this, &Self::HandleGenerateRow)\n\t\t.OnSelectionChanged(this, &Self::HandleTreeSelectionChanged)\n\t\t.OnGetChildren(this, &Self::HandleGetChildren)\n\t\t.SelectionMode(ESelectionMode::Single)\n\t\t.OnMouseButtonDoubleClick(this, &Self::HandleDoubleClick)\n\t\t.OnSetExpansionRecursive(this, &Self::HandleSetExpansionRecursive)\n\t\t.HeaderRow(\n\t\t\tSNew(SHeaderRow)\n\t\t\t.Visibility(EVisibility::Visible)\n\t\t\t+SHeaderRow::Column(NAME_Name)\n\t\t\t.DefaultLabel(LOCTEXT(\"Name\", \"Participant Name\"))\n\t\t);\n\n\tChildSlot\n\t[\n\t\tSNew(SBorder)\n\t\t.Padding(FMargin(3.f))\n\t\t.BorderImage(FEditorStyle::GetBrush(\"ToolPanel.GroupBorder\"))\n\t\t[\n\t\t\tSNew(SVerticalBox)\n\n\t\t\t// Top bar\n\t\t\t+SVerticalBox::Slot()\n\t\t\t.AutoHeight()\n\t\t\t.Padding(2.f, 1.f)\n\t\t\t[\n\t\t\t\tSNew(SHorizontalBox)\n\n\t\t\t\t// Search Input\n\t\t\t\t+SHorizontalBox::Slot()\n\t\t\t\t.FillWidth(1.0f)\n\t\t\t\t.Padding(0.f, 0.f, 4.f, 0.f)\n\t\t\t\t[\n\t\t\t\t\tGetFilterTextBoxWidget()\n\t\t\t\t]\n\n\t\t\t\t// View Options\n\t\t\t\t+SHorizontalBox::Slot()\n\t\t\t\t.AutoWidth()\n\t\t\t\t.Padding(2.0f, 2.0f)\n\t\t\t\t[\n\t\t\t\t\tSNew(SComboButton)\n\t\t\t\t\t.ComboButtonStyle(FEditorStyle::Get(), \"GenericFilters.ComboButtonStyle\")\n\t\t\t\t\t.ForegroundColor(FLinearColor::White)\n\t\t\t\t\t.ContentPadding(0)\n\t\t\t\t\t.ToolTipText(LOCTEXT(\"View_Tooltip\", \"View Options for the Dialogue Browser\"))\n\t\t\t\t\t.OnGetMenuContent(this, &Self::FillViewOptionsEntries)\n\t\t\t\t\t.HasDownArrow(true)\n\t\t\t\t\t.ContentPadding(FMargin(1, 0))\n\t\t\t\t\t.ButtonContent()\n\t\t\t\t\t[\n\t\t\t\t\t\tSNew(SHorizontalBox)\n\t\t\t\t\t\t+SHorizontalBox::Slot()\n\t\t\t\t\t\t.AutoWidth()\n\t\t\t\t\t\t[\n\t\t\t\t\t\t\tSNew(STextBlock)\n\t\t\t\t\t\t\t.TextStyle(FEditorStyle::Get(), \"GenericFilters.TextStyle\")\n\t\t\t\t\t\t\t.Font(FEditorStyle::Get().GetFontStyle(\"FontAwesome.9\"))\n\t\t\t\t\t\t\t.Text(FText::FromString(FString(TEXT(\"\\xf0b0\"))) /*fa-filter*/)\n\t\t\t\t\t\t]\n\t\t\t\t\t\t+SHorizontalBox::Slot()\n\t\t\t\t\t\t.AutoWidth()\n\t\t\t\t\t\t.Padding(2, 0, 0, 0)\n\t\t\t\t\t\t[\n\t\t\t\t\t\t\tSNew(STextBlock)\n\t\t\t\t\t\t\t.TextStyle(FEditorStyle::Get(), \"GenericFilters.TextStyle\")\n\t\t\t\t\t\t\t.Text(LOCTEXT(\"View_Key\", \"View Options\"))\n\t\t\t\t\t\t]\n\t\t\t\t\t]\n\t\t\t\t]\n\n\t\t\t\t// Sort menu\n\t\t\t\t+SHorizontalBox::Slot()\n\t\t\t\t.AutoWidth()\n\t\t\t\t[\n\t\t\t\t\tSNew(SComboBox<SortOptionType>)\n\t\t\t\t\t.OptionsSource(&SortOptions)\n\t\t\t\t\t.InitiallySelectedItem(DefaultSortOption)\n\t\t\t\t\t.ContentPadding(FMargin(4.0, 2.0))\n\t\t\t\t\t.OnGenerateWidget_Lambda([](SortOptionType NameItem)\n\t\t\t\t\t{\n\t\t\t\t\t\treturn SNew(STextBlock)\n\t\t\t\t\t\t\t.Text(NameItem->GetFText());\n\t\t\t\t\t})\n\t\t\t\t\t.OnSelectionChanged(this, &Self::HandleSortSelectionChanged)\n\t\t\t\t\t.ToolTipText(LOCTEXT(\"AddFilterToolTip\", \"Sort by a specific criteria.\"))\n\t\t\t\t\t[\n\t\t\t\t\t\tSNew(STextBlock)\n\t\t\t\t\t\t.Text(LOCTEXT(\"Sort\", \"Sort By\"))\n\t\t\t\t\t]\n\t\t\t\t]\n\n\t\t\t\t// Refresh dialogues\n\t\t\t\t+SHorizontalBox::Slot()\n\t\t\t\t.AutoWidth()\n\t\t\t\t[\n\t\t\t\t\tSNew(SButton)\n\t\t\t\t\t.ToolTipText(LOCTEXT(\"RefreshToolTip\", \"Refreshes/Reloads the Dialogue Browser view.\"))\n\t\t\t\t\t.OnClicked(this, &Self::HandleOnRefresh)\n\t\t\t\t\t[\n\t\t\t\t\t\tMakeIconAndTextWidget(\n\t\t\t\t\t\t\tLOCTEXT(\"RefreshDialogues\", \"Refresh\"),\n\t\t\t\t\t\t\tFDialogueStyle::Get()->GetBrush(FDialogueStyle::PROPERTY_ReloadAssetIcon)\n\t\t\t\t\t\t)\n\t\t\t\t\t]\n\t\t\t\t]\n\t\t\t]\n\n\t\t\t// The Tree view\n\t\t\t+SVerticalBox::Slot()\n\t\t\t.AutoHeight()\n\t\t\t.FillHeight(1.0f)\n\t\t\t[\n\t\t\t\tSNew(SBorder)\n\t\t\t\t.BorderImage(FEditorStyle::GetBrush(\"ToolPanel.GroupBorder\"))\n\t\t\t\t.Padding(FMargin(0.0f, 4.0f))\n\t\t\t\t[\n\t\t\t\t\tParticipantsTreeView.ToSharedRef()\n\t\t\t\t]\n\t\t\t]\n\t\t]\n\t];\n\n\tRefreshTree(false);\n}\n\nvoid SDialogueBrowser::RefreshTree(bool bPreserveExpansion)\n{\n\t// First, save off current expansion state\n\tTSet<TSharedPtr<FDialogueBrowserTreeNode>> OldExpansionState;\n\tif (bPreserveExpansion)\n\t{\n\t\tParticipantsTreeView->GetExpandedItems(OldExpansionState);\n\t}\n\n\tRootTreeItem->ClearChildren();\n\tRootChildren.Empty();\n\tParticipantsProperties.Empty();\n\n\tauto PopulateVariablePropertiesFromSearchResult = [](\n\t\tconst TSharedPtr<FDialogueBrowserTreeVariableProperties> VariableProperties,\n\t\tconst TSharedPtr<FDialogueSearchFoundResult> SearchResult,\n\t\tconst FGuid& DialogueGUID\n\t)\n\t{\n\t\tif (VariableProperties->HasGraphNodeSet(DialogueGUID))\n\t\t{\n\t\t\tVariableProperties\n\t\t\t\t->GetMutableGraphNodeSet(DialogueGUID)\n\t\t\t\t->Append(SearchResult->GraphNodes);\n\t\t}\n\t\tif (VariableProperties->HasEdgeNodeSet(DialogueGUID))\n\t\t{\n\t\t\tVariableProperties\n\t\t\t\t->GetMutableEdgeNodeSet(DialogueGUID)\n\t\t\t\t->Append(SearchResult->EdgeNodes);\n\t\t}\n\t};\n\n\t// Build fast lookup structure for participants (the ParticipantsProperties)\n\tTArray<UDlgDialogue*> Dialogues = UDlgManager::GetAllDialoguesFromMemory();\n\tfor (const UDlgDialogue* Dialogue : Dialogues)\n\t{\n\t\tconst FGuid DialogueGUID = Dialogue->GetGUID();\n\n\t\t// Populate Participants\n\t\tTSet<FName> ParticipantsNames;\n\t\tDialogue->GetAllParticipantNames(ParticipantsNames);\n\t\tfor (const FName& ParticipantName : ParticipantsNames)\n\t\t{\n\t\t\tTSharedPtr<FDialogueBrowserTreeParticipantProperties>* ParticipantPropsPtr = ParticipantsProperties.Find(ParticipantName);\n\t\t\tTSharedPtr<FDialogueBrowserTreeParticipantProperties> ParticipantProps;\n\t\t\tif (ParticipantPropsPtr == nullptr)\n\t\t\t{\n\t\t\t\t// participant does not exist, create it\n\t\t\t\tconst TSet<TWeakObjectPtr<const UDlgDialogue>> SetArgument{Dialogue};\n\t\t\t\tParticipantProps = MakeShared<FDialogueBrowserTreeParticipantProperties>(SetArgument);\n\t\t\t\tParticipantsProperties.Add(ParticipantName, ParticipantProps);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t// exists\n\t\t\t\tParticipantProps = *ParticipantPropsPtr;\n\t\t\t\tParticipantProps->AddDialogue(Dialogue);\n\t\t\t}\n\n\t\t\t// Populate events\n\t\t\tTSet<FName> EventsNames;\n\t\t\tDialogue->GetEvents(ParticipantName, EventsNames);\n\t\t\tfor (const FName& EventName : EventsNames)\n\t\t\t{\n\t\t\t\tPopulateVariablePropertiesFromSearchResult(\n\t\t\t\t\tParticipantProps->AddDialogueToEvent(EventName, Dialogue),\n\t\t\t\t\tFDialogueSearchUtilities::GetGraphNodesForEventEventName(EventName, Dialogue),\n\t\t\t\t\tDialogueGUID\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// Populate Custom events\n\t\t\tTSet<UClass*> CustomEventsClasses;\n\t\t\tDialogue->GetCustomEvents(ParticipantName, CustomEventsClasses);\n\t\t\tfor (UClass* EventClass : CustomEventsClasses)\n\t\t\t{\n\t\t\t\tPopulateVariablePropertiesFromSearchResult(\n\t\t\t\t\tParticipantProps->AddDialogueToCustomEvent(EventClass, Dialogue),\n\t\t\t\t\tFDialogueSearchUtilities::GetGraphNodesForCustomEvent(EventClass, Dialogue),\n\t\t\t\t\tDialogueGUID\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// Populate conditions\n\t\t\tTSet<FName> ConditionNames;\n\t\t\tDialogue->GetConditions(ParticipantName, ConditionNames);\n\t\t\tfor (const FName& ConditionName : ConditionNames)\n\t\t\t{\n\t\t\t\tPopulateVariablePropertiesFromSearchResult(\n\t\t\t\t\tParticipantProps->AddDialogueToCondition(ConditionName, Dialogue),\n\t\t\t\t\tFDialogueSearchUtilities::GetGraphNodesForConditionEventCallName(ConditionName, Dialogue),\n\t\t\t\t\tDialogueGUID\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// Populate int variable names\n\t\t\tTSet<FName> IntVariableNames;\n\t\t\tDialogue->GetIntNames(ParticipantName, IntVariableNames);\n\t\t\tfor (const FName& IntVariableName : IntVariableNames)\n\t\t\t{\n\t\t\t\tPopulateVariablePropertiesFromSearchResult(\n\t\t\t\t\tParticipantProps->AddDialogueToIntVariable(IntVariableName, Dialogue),\n\t\t\t\t\tFDialogueSearchUtilities::GetGraphNodesForIntVariableName(IntVariableName, Dialogue),\n\t\t\t\t\tDialogueGUID\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// Populate float variable names\n\t\t\tTSet<FName> FloatVariableNames;\n\t\t\tDialogue->GetFloatNames(ParticipantName, FloatVariableNames);\n\t\t\tfor (const FName& FloatVariableName : FloatVariableNames)\n\t\t\t{\n\t\t\t\tPopulateVariablePropertiesFromSearchResult(\n\t\t\t\t\tParticipantProps->AddDialogueToFloatVariable(FloatVariableName, Dialogue),\n\t\t\t\t\tFDialogueSearchUtilities::GetGraphNodesForFloatVariableName(FloatVariableName, Dialogue),\n\t\t\t\t\tDialogueGUID\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// Populate bool variable names\n\t\t\tTSet<FName> BoolVariableNames;\n\t\t\tDialogue->GetBoolNames(ParticipantName, BoolVariableNames);\n\t\t\tfor (const FName& BoolVariableName : BoolVariableNames)\n\t\t\t{\n\t\t\t\tPopulateVariablePropertiesFromSearchResult(\n\t\t\t\t\tParticipantProps->AddDialogueToBoolVariable(BoolVariableName, Dialogue),\n\t\t\t\t\tFDialogueSearchUtilities::GetGraphNodesForBoolVariableName(BoolVariableName, Dialogue),\n\t\t\t\t\tDialogueGUID\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// Populate FName variable names\n\t\t\tTSet<FName> FNameVariableNames;\n\t\t\tDialogue->GetNameNames(ParticipantName, FNameVariableNames);\n\t\t\tfor (const FName& NameVariableName : FNameVariableNames)\n\t\t\t{\n\t\t\t\tPopulateVariablePropertiesFromSearchResult(\n\t\t\t\t\tParticipantProps->AddDialogueToFNameVariable(NameVariableName, Dialogue),\n\t\t\t\t\tFDialogueSearchUtilities::GetGraphNodesForFNameVariableName(NameVariableName, Dialogue),\n\t\t\t\t\tDialogueGUID\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// Populate UClass int variable names\n\t\t\tTSet<FName> ClassIntVariableNames;\n\t\t\tDialogue->GetClassIntNames(ParticipantName, ClassIntVariableNames);\n\t\t\tfor (const FName& IntVariableName : ClassIntVariableNames)\n\t\t\t{\n\t\t\t\tPopulateVariablePropertiesFromSearchResult(\n\t\t\t\t\tParticipantProps->AddDialogueToClassIntVariable(IntVariableName, Dialogue),\n\t\t\t\t\tFDialogueSearchUtilities::GetGraphNodesForClassIntVariableName(IntVariableName, Dialogue),\n\t\t\t\t\tDialogueGUID\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// Populate UClass float variable names\n\t\t\tTSet<FName> ClassFloatVariableNames;\n\t\t\tDialogue->GetClassFloatNames(ParticipantName, ClassFloatVariableNames);\n\t\t\tfor (const FName& FloatVariableName : ClassFloatVariableNames)\n\t\t\t{\n\t\t\t\tPopulateVariablePropertiesFromSearchResult(\n\t\t\t\t\tParticipantProps->AddDialogueToClassFloatVariable(FloatVariableName, Dialogue),\n\t\t\t\t\tFDialogueSearchUtilities::GetGraphNodesForClassFloatVariableName(FloatVariableName, Dialogue),\n\t\t\t\t\tDialogueGUID\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// Populate UClass bool variable names\n\t\t\tTSet<FName> ClassBoolVariableNames;\n\t\t\tDialogue->GetClassBoolNames(ParticipantName, ClassBoolVariableNames);\n\t\t\tfor (const FName& BoolVariableName : ClassBoolVariableNames)\n\t\t\t{\n\t\t\t\tPopulateVariablePropertiesFromSearchResult(\n\t\t\t\t\tParticipantProps->AddDialogueToClassBoolVariable(BoolVariableName, Dialogue),\n\t\t\t\t\tFDialogueSearchUtilities::GetGraphNodesForClassBoolVariableName(BoolVariableName, Dialogue),\n\t\t\t\t\tDialogueGUID\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// Populate UClass FName variable names\n\t\t\tTSet<FName> ClassFNameVariableNames;\n\t\t\tDialogue->GetClassNameNames(ParticipantName, ClassFNameVariableNames);\n\t\t\tfor (const FName& NameVariableName : ClassFNameVariableNames)\n\t\t\t{\n\t\t\t\tPopulateVariablePropertiesFromSearchResult(\n\t\t\t\t\tParticipantProps->AddDialogueToClassFNameVariable(NameVariableName, Dialogue),\n\t\t\t\t\tFDialogueSearchUtilities::GetGraphNodesForClassFNameVariableName(NameVariableName, Dialogue),\n\t\t\t\t\tDialogueGUID\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// Populate UClass FText variable names\n\t\t\tTSet<FName> ClassFTextVariableNames;\n\t\t\tDialogue->GetClassTextNames(ParticipantName, ClassFTextVariableNames);\n\t\t\tfor (const FName& TextVariableName : ClassFTextVariableNames)\n\t\t\t{\n\t\t\t\tPopulateVariablePropertiesFromSearchResult(\n\t\t\t\t\tParticipantProps->AddDialogueToClassFTextVariable(TextVariableName, Dialogue),\n\t\t\t\t\tFDialogueSearchUtilities::GetGraphNodesForClassFTextVariableName(TextVariableName, Dialogue),\n\t\t\t\t\tDialogueGUID\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\n\t// Sort the properties\n\tTArray<FName> AllParticipants;\n\tfor (const auto Elem : ParticipantsProperties)\n\t{\n\t\tAllParticipants.Add(Elem.Key);\n\t\tTSharedPtr<FDialogueBrowserTreeParticipantProperties> Property = Elem.Value;\n\n\t\t// sort\n\t\tProperty->Sort();\n\t}\n\n\t// Sort the participant names\n\tif (SelectedSortOption->IsByName())\n\t{\n\t\t// Sort by name\n\t\tFDlgHelper::SortDefault(AllParticipants);\n\t}\n\telse\n\t{\n\t\t// Sort by dialogue references\n\t\tAllParticipants.Sort([this](const FName& A, const FName& B)\n\t\t{\n\t\t\treturn FDialogueBrowserUtilities::PredicateSortByDialoguesNumDescending(A, B, ParticipantsProperties);\n\t\t});\n\t}\n\n\t// Build the tree\n\tfor (const FName& Name : AllParticipants)\n\t{\n\t\tconst TSharedPtr<FDialogueBrowserTreeNode> Participant =\n\t\t\tMakeShared<FDialogueBrowserTreeCategoryParticipantNode>(FText::FromName(Name), RootTreeItem, Name);\n\n\t\tBuildTreeViewItem(Participant);\n\t\tRootTreeItem->AddChild(Participant);\n\t\tRootTreeItem->AddChild(MakeShared<FDialogueBrowserTreeSeparatorNode>(RootTreeItem));\n\t}\n\tRootTreeItem->GetVisibleChildren(RootChildren);\n\n\t// Clear Previous states\n\tParticipantsTreeView->ClearSelection();\n\t// Triggers RequestTreeRefresh\n\tParticipantsTreeView->ClearExpandedItems();\n\n\t// Restore old expansion\n\tif (bPreserveExpansion && OldExpansionState.Num() > 0)\n\t{\n\t\t// Flattened tree\n\t\tTArray<TSharedPtr<FDialogueBrowserTreeNode>> AllNodes;\n\t\tRootTreeItem->GetAllNodes(AllNodes);\n\n\t\t// Expand to match the old state\n\t\tFDlgTreeViewHelper::RestoreTreeExpansionState<TSharedPtr<FDialogueBrowserTreeNode>>(\n\t\t\tParticipantsTreeView,\n\t\t\tAllNodes,\n\t\t\tOldExpansionState,\n\t\t\tFDialogueBrowserUtilities::PredicateCompareDialogueTreeNode\n\t\t);\n\t}\n}\n\nvoid SDialogueBrowser::GenerateFilteredItems()\n{\n\tif (FilterString.IsEmpty())\n\t{\n\t\t// No filtering, empty filter, restore original\n\t\tRefreshTree(false);\n\t\treturn;\n\t}\n\n\t// Get all valid paths\n\tTArray<TArray<TSharedPtr<FDialogueBrowserTreeNode>>> OutPaths;\n\tRootTreeItem->FilterPathsToNodesThatContainText(FilterString, OutPaths);\n\tRootChildren.Empty();\n\tRootTreeItem->GetVisibleChildren(RootChildren);\n\n\t// Refresh, clear expansion\n\tParticipantsTreeView->ClearExpandedItems(); // Triggers RequestTreeRefresh\n\n\t// Mark paths as expanded\n\tfor (const TArray<TSharedPtr<FDialogueBrowserTreeNode>>& Path : OutPaths)\n\t{\n\t\tconst int32 PathNum = Path.Num();\n\t\tfor (int32 PathIndex = 0; PathIndex < PathNum; PathIndex++)\n\t\t{\n\t\t\tPath[PathIndex]->SetIsVisible(true);\n\t\t\tParticipantsTreeView->SetItemExpansion(Path[PathIndex], true);\n\t\t}\n\t}\n\n\t// TODO tokens\n}\n\nTSharedRef<SWidget> SDialogueBrowser::GetFilterTextBoxWidget()\n{\n\t// Is it cached?\n\tif (FilterTextBoxWidget.IsValid())\n\t{\n\t\treturn FilterTextBoxWidget.ToSharedRef();\n\t}\n\n\t// Cache it\n\tFilterTextBoxWidget = SNew(SSearchBox)\n\t\t.HintText(LOCTEXT(\"SearchBoxHintText\", \"Search by Name\"))\n\t\t.OnTextChanged(this, &Self::HandleSearchTextCommitted, ETextCommit::Default)\n\t\t.OnTextCommitted(this, &Self::HandleSearchTextCommitted)\n\t\t.SelectAllTextWhenFocused(false)\n\t\t.DelayChangeNotificationsWhileTyping(false);\n\n\t// Should return a valid widget\n\treturn GetFilterTextBoxWidget();\n}\n\nvoid SDialogueBrowser::AddDialogueChildrenToItemFromProperty(\n\tconst TSharedPtr<FDialogueBrowserTreeNode>& InItem,\n\tconst TSharedPtr<FDialogueBrowserTreeVariableProperties>* PropertyPtr,\n\tEDialogueTreeNodeTextType TextType\n)\n{\n\t// List the dialogues that contain this event for this property\n\tTSet<TWeakObjectPtr<const UDlgDialogue>> Dialogues;\n\tif (PropertyPtr != nullptr)\n\t{\n\t\tDialogues = (*PropertyPtr)->GetDialogues();\n\t}\n\n\tfor (TWeakObjectPtr<const UDlgDialogue> Dialogue : Dialogues)\n\t{\n\t\tif (!Dialogue.IsValid())\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst TSharedPtr<FDialogueBrowserTreeNode> DialogueItem = MakeShared<FDialogueBrowserTreeDialogueNode>(\n\t\t\tFText::FromName(Dialogue->GetDialogueFName()),\n\t\t\tInItem,\n\t\t\tDialogue\n\t\t);\n\t\tDialogueItem->SetTextType(TextType);\n\t\tInItem->AddChild(DialogueItem);\n\t}\n}\n\nvoid SDialogueBrowser::AddGraphNodeChildrenToItem(\n\tconst TSharedPtr<FDialogueBrowserTreeNode>& InItem,\n\tconst TSet<TWeakObjectPtr<const UDialogueGraphNode>>& GraphNodes,\n\tEDialogueTreeNodeTextType TextType\n)\n{\n\tfor (TWeakObjectPtr<const UDialogueGraphNode> GraphNode : GraphNodes)\n\t{\n\t\tif (!GraphNode.IsValid())\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst FName Text = *FString::Printf(TEXT(\"%d\"), GraphNode->GetDialogueNodeIndex());\n\t\tconst TSharedPtr<FDialogueBrowserTreeNode> NodeItem =\n\t\t\tMakeShared<FDialogueBrowserTreeGraphNode>(FText::FromName(Text), InItem, GraphNode);\n\t\tNodeItem->SetTextType(TextType);\n\t\tInItem->AddInlineChild(NodeItem);\n\t}\n}\n\nvoid SDialogueBrowser::AddEdgeNodeChildrenToItem(\n\tconst TSharedPtr<FDialogueBrowserTreeNode>& InItem,\n\tconst TSet<TWeakObjectPtr<const UDialogueGraphNode_Edge>>& EdgeNodes,\n\tEDialogueTreeNodeTextType TextType\n)\n{\n\tfor (TWeakObjectPtr<const UDialogueGraphNode_Edge> EdgeNode : EdgeNodes)\n\t{\n\t\tif (!EdgeNode.IsValid())\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\n\t\tint32 FromParent = -1;\n\t\tint32 ToChild = -1;\n\t\tif (EdgeNode->HasParentNode())\n\t\t{\n\t\t\tFromParent = EdgeNode->GetParentNode()->GetDialogueNodeIndex();\n\t\t}\n\t\tif (EdgeNode->HasChildNode())\n\t\t{\n\t\t\tToChild = EdgeNode->GetChildNode()->GetDialogueNodeIndex();\n\t\t}\n\t\tconst FName Text = *FString::Printf(TEXT(\"%d -> %d\"), FromParent, ToChild);\n\t\tconst TSharedPtr<FDialogueBrowserTreeNode> NodeItem =\n\t\t\tMakeShared<FDialogueBrowserTreeEdgeNode>(FText::FromName(Text), InItem, EdgeNode);\n\t\tNodeItem->SetTextType(TextType);\n\t\tInItem->AddInlineChild(NodeItem);\n\t}\n}\n\nvoid SDialogueBrowser::AddGraphNodeBaseChildrenToItemFromProperty(\n\tconst TSharedPtr<FDialogueBrowserTreeNode>& InItem,\n\tconst TSharedPtr<FDialogueBrowserTreeVariableProperties>* PropertyPtr,\n\tEDialogueTreeNodeTextType GraphNodeTextType,\n\tEDialogueTreeNodeTextType EdgeNodeTextType\n)\n{\n\tTSharedPtr<FDialogueBrowserTreeDialogueNode> DialogueItem =\n\t\tStaticCastSharedPtr<FDialogueBrowserTreeDialogueNode>(InItem);\n\tif (!DialogueItem.IsValid())\n\t{\n\t\treturn;\n\t}\n\tif (PropertyPtr == nullptr || !DialogueItem->GetDialogue().IsValid())\n\t{\n\t\treturn;\n\t}\n\n\tconst TSharedPtr<FDialogueBrowserTreeVariableProperties> Property = *PropertyPtr;\n\tconst UDlgDialogue* Dialogue = DialogueItem->GetDialogue().Get();\n\tconst FGuid DialogueGUID = Dialogue->GetGUID();\n\n\t// Display the GraphNode\n\tif (Property->HasGraphNodeSet(DialogueGUID))\n\t{\n\t\tAddGraphNodeChildrenToItem(DialogueItem, Property->GetGraphNodeSet(DialogueGUID), GraphNodeTextType);\n\t}\n\tif (Property->HasEdgeNodeSet(DialogueGUID))\n\t{\n\t\tAddEdgeNodeChildrenToItem(DialogueItem, Property->GetEdgeNodeSet(DialogueGUID), EdgeNodeTextType);\n\t}\n}\n\nvoid SDialogueBrowser::AddVariableChildrenToItem(\n\tconst TSharedPtr<FDialogueBrowserTreeNode>& Item,\n\tconst TMap<FName, TSharedPtr<FDialogueBrowserTreeVariableProperties>>& Variables,\n\tEDialogueTreeNodeTextType VariableType\n)\n{\n\tfor (const auto& Pair : Variables)\n\t{\n\t\tconst FName VariableName = Pair.Key;\n\t\tconst TSharedPtr<FDialogueBrowserTreeNode> ChildItem =\n\t\t\tMakeShared<FDialogueBrowserTreeVariableNode>(FText::FromName(VariableName), Item, VariableName);\n\t\tChildItem->SetTextType(VariableType);\n\t\tItem->AddChild(ChildItem);\n\t}\n}\n\nvoid SDialogueBrowser::BuildTreeViewItem(const TSharedPtr<FDialogueBrowserTreeNode>& Item)\n{\n\tconst FName ParticipantName = Item->GetParentParticipantName();\n\tif (!ParticipantName.IsValid() || ParticipantName.IsNone())\n\t{\n\t\treturn;\n\t}\n\n\t// Do we have the Participant cached?\n\tTSharedPtr<FDialogueBrowserTreeParticipantProperties>* ParticipantPropertiesPtr = ParticipantsProperties.Find(ParticipantName);\n\tif (ParticipantPropertiesPtr == nullptr)\n\t{\n\t\treturn;\n\t}\n\n\tTSharedPtr<FDialogueBrowserTreeParticipantProperties> ParticipantProperties = *ParticipantPropertiesPtr;\n\tif (Item->IsCategory())\n\t{\n\t\tswitch (Item->GetCategoryType())\n\t\t{\n\t\tcase EDialogueTreeNodeCategoryType::Participant:\n\t\t{\n\t\t\t// Display the categories for the participant\n\t\t\tconst bool bHideEmptyCategories = GetDefault<UDlgSystemSettings>()->bHideEmptyDialogueBrowserCategories;\n\t\t\tItem->SetChildren(MakeParticipantCategoriesChildren(Item, ParticipantProperties, bHideEmptyCategories));\n\t\t\tbreak;\n\t\t}\n\t\tcase EDialogueTreeNodeCategoryType::Dialogue:\n\t\t{\n\t\t\t// Add the dialogues\n\t\t\tfor (TWeakObjectPtr<const UDlgDialogue> Dialogue : ParticipantProperties->GetDialogues())\n\t\t\t{\n\t\t\t\tif (!Dialogue.IsValid())\n\t\t\t\t{\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tconst TSharedPtr<FDialogueBrowserTreeNode> DialogueItem =\n\t\t\t\t\tMakeShared<FDialogueBrowserTreeDialogueNode>(FText::FromName(Dialogue->GetDialogueFName()), Item, Dialogue);\n\t\t\t\tDialogueItem->SetTextType(EDialogueTreeNodeTextType::ParticipantDialogue);\n\t\t\t\tItem->AddChild(DialogueItem);\n\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase EDialogueTreeNodeCategoryType::Event:\n\t\t{\n\t\t\t// Display the events for this category\n\t\t\tfor (const auto& Pair : ParticipantProperties->GetEvents())\n\t\t\t{\n\t\t\t\tconst TSharedPtr<FDialogueBrowserTreeNode> EventItem =\n\t\t\t\t\tMakeShared<FDialogueBrowserTreeVariableNode>(FText::FromName(Pair.Key), Item, Pair.Key);\n\t\t\t\tEventItem->SetTextType(EDialogueTreeNodeTextType::ParticipantEvent);\n\t\t\t\tItem->AddChild(EventItem);\n\t\t\t}\n\n\t\t\t// Display the custom events for this category\n\t\t\tfor (const auto& Pair : ParticipantProperties->GetCustomEvents())\n\t\t\t{\n\t\t\t\tUClass* Class = Pair.Key;\n\t\t\t\tconst TSharedPtr<FDialogueBrowserTreeNode> CustomEventItem = MakeShared<FDialogueBrowserTreeCustomObjectNode>(\n\t\t\t\t\tFText::FromString(FDlgHelper::CleanObjectName(Class->GetPathName())),\n\t\t\t\t\tItem,\n\t\t\t\t\tClass\n\t\t\t\t);\n\t\t\t\tCustomEventItem->SetTextType(EDialogueTreeNodeTextType::ParticipantCustomEvent);\n\t\t\t\tItem->AddChild(CustomEventItem);\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase EDialogueTreeNodeCategoryType::Condition:\n\t\t{\n\t\t\tfor (const auto& Pair : ParticipantProperties->GetConditions())\n\t\t\t{\n\t\t\t\tconst TSharedPtr<FDialogueBrowserTreeNode> ConditionItem =\n\t\t\t\t\tMakeShared<FDialogueBrowserTreeVariableNode>(FText::FromName(Pair.Key), Item, Pair.Key);\n\t\t\t\tConditionItem->SetTextType(EDialogueTreeNodeTextType::ParticipantCondition);\n\t\t\t\tItem->AddChild(ConditionItem);\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\n\t\tcase EDialogueTreeNodeCategoryType::Variable:\n\t\t{\n\t\t\t// Only display the categories if the Participant has at least one variable.\n\t\t\tif (ParticipantProperties->HasDialogueValues())\n\t\t\t{\n\t\t\t\tconst bool bHideEmptyCategories = GetDefault<UDlgSystemSettings>()->bHideEmptyDialogueBrowserCategories;\n\t\t\t\tItem->SetChildren(MakeVariableCategoriesChildren(Item, ParticipantProperties, bHideEmptyCategories));\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase EDialogueTreeNodeCategoryType::VariableInt:\n\t\t\tAddVariableChildrenToItem(\n\t\t\t\tItem,\n\t\t\t\tParticipantProperties->GetIntegers(),\n\t\t\t\tEDialogueTreeNodeTextType::ParticipantVariableInt\n\t\t\t);\n\t\t\tbreak;\n\t\tcase EDialogueTreeNodeCategoryType::VariableFloat:\n\t\t\tAddVariableChildrenToItem(\n\t\t\t\tItem,\n\t\t\t\tParticipantProperties->GetFloats(),\n\t\t\t\tEDialogueTreeNodeTextType::ParticipantVariableFloat\n\t\t\t);\n\t\t\tbreak;\n\t\tcase EDialogueTreeNodeCategoryType::VariableBool:\n\t\t\tAddVariableChildrenToItem(\n\t\t\t\tItem,\n\t\t\t\tParticipantProperties->GetBools(),\n\t\t\t\tEDialogueTreeNodeTextType::ParticipantVariableBool\n\t\t\t);\n\t\t\tbreak;\n\t\tcase EDialogueTreeNodeCategoryType::VariableFName:\n\t\t\tAddVariableChildrenToItem(\n\t\t\t\tItem,\n\t\t\t\tParticipantProperties->GetFNames(),\n\t\t\t\tEDialogueTreeNodeTextType::ParticipantVariableFName\n\t\t\t);\n\t\t\tbreak;\n\n\t\tcase EDialogueTreeNodeCategoryType::ClassVariable:\n\t\t{\n\t\t\t// Only display the categories if the Participant has at least one class variable.\n\t\t\tif (ParticipantProperties->HasClassVariables())\n\t\t\t{\n\t\t\t\tconst bool bHideEmptyCategories = GetDefault<UDlgSystemSettings>()->bHideEmptyDialogueBrowserCategories;\n\t\t\t\tItem->SetChildren(MakeClassVariableCategoriesChildren(Item, ParticipantProperties, bHideEmptyCategories));\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase EDialogueTreeNodeCategoryType::ClassVariableInt:\n\t\t\tAddVariableChildrenToItem(\n\t\t\t\tItem,\n\t\t\t\tParticipantProperties->GetClassIntegers(),\n\t\t\t\tEDialogueTreeNodeTextType::ParticipantClassVariableInt\n\t\t\t);\n\t\t\tbreak;\n\t\tcase EDialogueTreeNodeCategoryType::ClassVariableFloat:\n\t\t\tAddVariableChildrenToItem(\n\t\t\t\tItem,\n\t\t\t\tParticipantProperties->GetClassFloats(),\n\t\t\t\tEDialogueTreeNodeTextType::ParticipantClassVariableFloat\n\t\t\t);\n\t\t\tbreak;\n\t\tcase EDialogueTreeNodeCategoryType::ClassVariableBool:\n\t\t\tAddVariableChildrenToItem(\n\t\t\t\tItem,\n\t\t\t\tParticipantProperties->GetClassBools(),\n\t\t\t\tEDialogueTreeNodeTextType::ParticipantClassVariableBool\n\t\t\t);\n\t\t\tbreak;\n\t\tcase EDialogueTreeNodeCategoryType::ClassVariableFName:\n\t\t\tAddVariableChildrenToItem(\n\t\t\t\tItem,\n\t\t\t\tParticipantProperties->GetClassFNames(),\n\t\t\t\tEDialogueTreeNodeTextType::ParticipantClassVariableFName\n\t\t\t);\n\t\t\tbreak;\n\t\tcase EDialogueTreeNodeCategoryType::ClassVariableFText:\n\t\t\tAddVariableChildrenToItem(\n\t\t\t\tItem,\n\t\t\t\tParticipantProperties->GetClassFTexts(),\n\t\t\t\tEDialogueTreeNodeTextType::ParticipantClassVariableFText\n\t\t\t);\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tbreak;\n\t\t}\n\t}\n\telse if (Item->IsText())\n\t{\n\t\tswitch (Item->GetTextType())\n\t\t{\n\t\tcase EDialogueTreeNodeTextType::ParticipantEvent:\n\t\t\t// List the dialogues that contain this event for this participant\n\t\t\tAddDialogueChildrenToItemFromProperty(\n\t\t\t\tItem,\n\t\t\t\tParticipantProperties->GetEvents().Find(Item->GetParentVariableName()),\n\t\t\t\tEDialogueTreeNodeTextType::EventDialogue\n\t\t\t);\n\t\t\tbreak;\n\n\t\tcase EDialogueTreeNodeTextType::ParticipantCustomEvent:\n\t\t\t// List the dialogues that contain this event for this custom event participant\n\t\t\tAddDialogueChildrenToItemFromProperty(\n\t\t\t\tItem,\n\t\t\t\tParticipantProperties->GetCustomEvents().Find(Item->GetParentClass()),\n\t\t\t\tEDialogueTreeNodeTextType::CustomEventDialogue\n\t\t\t);\n\t\t\tbreak;\n\n\t\tcase EDialogueTreeNodeTextType::ParticipantCondition:\n\t\t\t// List the dialogues that contain this condition for this participant\n\t\t\tAddDialogueChildrenToItemFromProperty(\n\t\t\t\tItem,\n\t\t\t\tParticipantProperties->GetConditions().Find(Item->GetParentVariableName()),\n\t\t\t\tEDialogueTreeNodeTextType::ConditionDialogue\n\t\t\t);\n\t\t\tbreak;\n\n\t\tcase EDialogueTreeNodeTextType::ParticipantVariableInt:\n\t\t\t// List the dialogues that contain this int variable for this participant\n\t\t\tAddDialogueChildrenToItemFromProperty(\n\t\t\t\tItem,\n\t\t\t\tParticipantProperties->GetIntegers().Find(Item->GetParentVariableName()),\n\t\t\t\tEDialogueTreeNodeTextType::IntVariableDialogue\n\t\t\t);\n\t\t\tbreak;\n\t\tcase EDialogueTreeNodeTextType::ParticipantVariableFloat:\n\t\t\t// List the dialogues that contain this float variable for this participant\n\t\t\tAddDialogueChildrenToItemFromProperty(\n\t\t\t\tItem,\n\t\t\t\tParticipantProperties->GetFloats().Find(Item->GetParentVariableName()),\n\t\t\t\tEDialogueTreeNodeTextType::FloatVariableDialogue\n\t\t\t);\n\t\t\tbreak;\n\t\tcase EDialogueTreeNodeTextType::ParticipantVariableBool:\n\t\t\t// List the dialogues that contain this bool variable for this participant\n\t\t\tAddDialogueChildrenToItemFromProperty(\n\t\t\t\tItem,\n\t\t\t\tParticipantProperties->GetBools().Find(Item->GetParentVariableName()),\n\t\t\t\tEDialogueTreeNodeTextType::BoolVariableDialogue\n\t\t\t);\n\t\t\tbreak;\n\t\tcase EDialogueTreeNodeTextType::ParticipantVariableFName:\n\t\t\t// List the dialogues that contain this Fname variable for this participant\n\t\t\tAddDialogueChildrenToItemFromProperty(\n\t\t\t\tItem,\n\t\t\t\tParticipantProperties->GetFNames().Find(Item->GetParentVariableName()),\n\t\t\t\tEDialogueTreeNodeTextType::FNameVariableDialogue\n\t\t\t);\n\t\t\tbreak;\n\n\t\tcase EDialogueTreeNodeTextType::ParticipantClassVariableInt:\n\t\t\t// List the dialogues that contain this UClass int variable for this participant\n\t\t\tAddDialogueChildrenToItemFromProperty(\n\t\t\t\tItem,\n\t\t\t\tParticipantProperties->GetClassIntegers().Find(Item->GetParentVariableName()),\n\t\t\t\tEDialogueTreeNodeTextType::IntClassVariableDialogue\n\t\t\t);\n\t\t\tbreak;\n\t\tcase EDialogueTreeNodeTextType::ParticipantClassVariableFloat:\n\t\t\t// List the dialogues that contain this UClass float variable for this participant\n\t\t\tAddDialogueChildrenToItemFromProperty(\n\t\t\t\tItem,\n\t\t\t\tParticipantProperties->GetClassFloats().Find(Item->GetParentVariableName()),\n\t\t\t\tEDialogueTreeNodeTextType::FloatClassVariableDialogue\n\t\t\t);\n\t\t\tbreak;\n\t\tcase EDialogueTreeNodeTextType::ParticipantClassVariableBool:\n\t\t\t// List the dialogues that contain this UClass bool variable for this participant\n\t\t\tAddDialogueChildrenToItemFromProperty(\n\t\t\t\tItem,\n\t\t\t\tParticipantProperties->GetClassBools().Find(Item->GetParentVariableName()),\n\t\t\t\tEDialogueTreeNodeTextType::BoolClassVariableDialogue\n\t\t\t);\n\t\t\tbreak;\n\t\tcase EDialogueTreeNodeTextType::ParticipantClassVariableFName:\n\t\t\t// List the dialogues that contain this UClass Fname variable for this participant\n\t\t\tAddDialogueChildrenToItemFromProperty(\n\t\t\t\tItem,\n\t\t\t\tParticipantProperties->GetClassFNames().Find(Item->GetParentVariableName()),\n\t\t\t\tEDialogueTreeNodeTextType::FNameClassVariableDialogue\n\t\t\t);\n\t\t\tbreak;\n\t\tcase EDialogueTreeNodeTextType::ParticipantClassVariableFText:\n\t\t\t// List the dialogues that contain this UClass FText variable for this participant\n\t\t\tAddDialogueChildrenToItemFromProperty(\n\t\t\t\tItem,\n\t\t\t\tParticipantProperties->GetClassFTexts().Find(Item->GetParentVariableName()),\n\t\t\t\tEDialogueTreeNodeTextType::FTextClassVariableDialogue\n\t\t\t);\n\t\t\tbreak;\n\n\t\tcase EDialogueTreeNodeTextType::EventDialogue:\n\t\t\t// List the graph nodes for the dialogue that contains this event\n\t\t\tAddGraphNodeBaseChildrenToItemFromProperty(\n\t\t\t\tItem,\n\t\t\t\tParticipantProperties->GetEvents().Find(Item->GetParentVariableName()),\n\t\t\t\tEDialogueTreeNodeTextType::EventGraphNode,\n\t\t\t\tEDialogueTreeNodeTextType::EventGraphNode\n\t\t\t);\n\t\t\tbreak;\n\n\t\tcase EDialogueTreeNodeTextType::CustomEventDialogue:\n\t\t\t// List the graph nodes for the dialogue that contains this event\n\t\t\tAddGraphNodeBaseChildrenToItemFromProperty(\n\t\t\t\tItem,\n\t\t\t\tParticipantProperties->GetCustomEvents().Find(Item->GetParentClass()),\n\t\t\t\tEDialogueTreeNodeTextType::CustomEventGraphNode,\n\t\t\t\tEDialogueTreeNodeTextType::CustomEventGraphNode\n\t\t\t);\n\t\t\tbreak;\n\n\t\tcase EDialogueTreeNodeTextType::ConditionDialogue:\n\t\t\t// List the graph nodes for the dialogue that contains this condition\n\t\t\tAddGraphNodeBaseChildrenToItemFromProperty(Item,\n\t\t\t\tParticipantProperties->GetConditions().Find(Item->GetParentVariableName()),\n\t\t\t\tEDialogueTreeNodeTextType::ConditionGraphNode,\n\t\t\t\tEDialogueTreeNodeTextType::ConditionEdgeNode);\n\t\t\tbreak;\n\n\t\tcase EDialogueTreeNodeTextType::IntVariableDialogue:\n\t\t\t// List the graph nodes for the dialogue that contains this int variable\n\t\t\tAddGraphNodeBaseChildrenToItemFromProperty(\n\t\t\t\tItem,\n\t\t\t\tParticipantProperties->GetIntegers().Find(Item->GetParentVariableName()),\n\t\t\t\tEDialogueTreeNodeTextType::IntVariableGraphNode,\n\t\t\t\tEDialogueTreeNodeTextType::IntVariableEdgeNode\n\t\t\t);\n\t\t\tbreak;\n\t\tcase EDialogueTreeNodeTextType::FloatVariableDialogue:\n\t\t\t// List the graph nodes for the dialogue that contains this float variable\n\t\t\tAddGraphNodeBaseChildrenToItemFromProperty(\n\t\t\t\tItem,\n\t\t\t\tParticipantProperties->GetFloats().Find(Item->GetParentVariableName()),\n\t\t\t\tEDialogueTreeNodeTextType::FloatVariableGraphNode,\n\t\t\t\tEDialogueTreeNodeTextType::FloatVariableEdgeNode\n\t\t\t);\n\t\t\tbreak;\n\t\tcase EDialogueTreeNodeTextType::BoolVariableDialogue:\n\t\t\t// List the graph nodes for the dialogue that contains this bool variable\n\t\t\tAddGraphNodeBaseChildrenToItemFromProperty(\n\t\t\t\tItem,\n\t\t\t\tParticipantProperties->GetBools().Find(Item->GetParentVariableName()),\n\t\t\t\tEDialogueTreeNodeTextType::BoolVariableGraphNode,\n\t\t\t\tEDialogueTreeNodeTextType::BoolVariableEdgeNode\n\t\t\t);\n\t\t\tbreak;\n\t\tcase EDialogueTreeNodeTextType::FNameVariableDialogue:\n\t\t\t// List the graph nodes for the dialogue that contains this FName variable\n\t\t\tAddGraphNodeBaseChildrenToItemFromProperty(\n\t\t\t\tItem,\n\t\t\t\tParticipantProperties->GetFNames().Find(Item->GetParentVariableName()),\n\t\t\t\tEDialogueTreeNodeTextType::FNameVariableGraphNode,\n\t\t\t\tEDialogueTreeNodeTextType::FNameVariableEdgeNode\n\t\t\t);\n\t\t\tbreak;\n\n\t\tcase EDialogueTreeNodeTextType::IntClassVariableDialogue:\n\t\t\t// List the graph nodes for the dialogue that contains this UClass int variable\n\t\t\tAddGraphNodeBaseChildrenToItemFromProperty(\n\t\t\t\tItem,\n\t\t\t\tParticipantProperties->GetClassIntegers().Find(Item->GetParentVariableName()),\n\t\t\t\tEDialogueTreeNodeTextType::IntVariableGraphNode,\n\t\t\t\tEDialogueTreeNodeTextType::IntVariableEdgeNode\n\t\t\t);\n\t\t\tbreak;\n\t\tcase EDialogueTreeNodeTextType::FloatClassVariableDialogue:\n\t\t\t// List the graph nodes for the dialogue that contains this UClass float variable\n\t\t\tAddGraphNodeBaseChildrenToItemFromProperty(\n\t\t\t\tItem,\n\t\t\t\tParticipantProperties->GetClassFloats().Find(Item->GetParentVariableName()),\n\t\t\t\tEDialogueTreeNodeTextType::FloatVariableGraphNode,\n\t\t\t\tEDialogueTreeNodeTextType::FloatVariableEdgeNode\n\t\t\t);\n\t\t\tbreak;\n\t\tcase EDialogueTreeNodeTextType::BoolClassVariableDialogue:\n\t\t\t// List the graph nodes for the dialogue that contains this UClass bool variable\n\t\t\tAddGraphNodeBaseChildrenToItemFromProperty(\n\t\t\t\tItem,\n\t\t\t\tParticipantProperties->GetClassBools().Find(Item->GetParentVariableName()),\n\t\t\t\tEDialogueTreeNodeTextType::BoolVariableGraphNode,\n\t\t\t\tEDialogueTreeNodeTextType::BoolVariableEdgeNode\n\t\t\t);\n\t\t\tbreak;\n\t\tcase EDialogueTreeNodeTextType::FNameClassVariableDialogue:\n\t\t\t// List the graph nodes for the dialogue that contains this UClass FName variable\n\t\t\tAddGraphNodeBaseChildrenToItemFromProperty(\n\t\t\t\tItem,\n\t\t\t\tParticipantProperties->GetClassFNames().Find(Item->GetParentVariableName()),\n\t\t\t\tEDialogueTreeNodeTextType::FNameVariableGraphNode,\n\t\t\t\tEDialogueTreeNodeTextType::FNameVariableEdgeNode\n\t\t\t);\n\t\t\tbreak;\n\n\t\tcase EDialogueTreeNodeTextType::FTextClassVariableDialogue:\n\t\t\t// List the graph nodes for the dialogue that contains this UClass FText variable\n\t\t\tAddGraphNodeBaseChildrenToItemFromProperty(\n\t\t\t\tItem,\n\t\t\t\tParticipantProperties->GetClassFTexts().Find(Item->GetParentVariableName()),\n\t\t\t\tEDialogueTreeNodeTextType::FTextVariableGraphNode,\n\t\t\t\tEDialogueTreeNodeTextType::FTextVariableEdgeNode\n\t\t\t);\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tbreak;\n\t\t}\n\t}\n\n\t// Recursively call on children\n\tfor (const TSharedPtr<FDialogueBrowserTreeNode>& ChildItem : Item->GetChildren())\n\t{\n\t\tBuildTreeViewItem(ChildItem);\n\t}\n\n\t// The same for the inline children, handled separately.\n\tfor (const TSharedPtr<FDialogueBrowserTreeNode>& ChildItem : Item->GetInlineChildren())\n\t{\n\t\tBuildTreeViewItem(ChildItem);\n\t}\n}\n\nTSharedRef<SWidget> SDialogueBrowser::MakeButtonWidgetForGraphNodes(\n\tconst TArray<TSharedPtr<FDialogueBrowserTreeNode>>& InChildren\n)\n{\n\tTSharedPtr<SWrapBox> Buttons = SNew(SWrapBox)\n\t\t\t.PreferredWidth(600.f);\n\n\t// Constructs [Node 1] [Node 2]\n\tconst FText GraphNodeTooltip = LOCTEXT(\"JumpToNodeTipGraphNode\", \"Opens the Dialogue Editor and jumps to the Node\");\n\tconst FText EdgeNodeTooltip = LOCTEXT(\"JumpToNodeTipEdgeNode\", \"Opens the Dialogue Editor and jumps to the Edge\");\n\tfor (const TSharedPtr<FDialogueBrowserTreeNode>& ChildItem : InChildren)\n\t{\n\t\tconst bool bIsEdgeNodeText =  ChildItem->IsEdgeNodeText();\n\t\tif (ChildItem->IsGraphNodeText() || bIsEdgeNodeText)\n\t\t{\n\t\t\tButtons->AddSlot()\n\t\t\t\t.HAlign(HAlign_Fill)\n\t\t\t\t.VAlign(VAlign_Fill)\n\t\t\t\t.Padding(2.f, 0.f, 0.f, 0.f)\n\t\t\t\t[\n\t\t\t\t\t// Jump To node\n\t\t\t\t\tSNew(SButton)\n\t\t\t\t\t.ToolTipText(bIsEdgeNodeText ? EdgeNodeTooltip : GraphNodeTooltip)\n\t\t\t\t\t.OnClicked(ChildItem.Get(), &FDialogueBrowserTreeNode::OnClick)\n\t\t\t\t\t[\n\t\t\t\t\t\tSNew(STextBlock)\n\t\t\t\t\t\t.Text(ChildItem->GetDisplayText())\n\t\t\t\t\t\t.Font(DEFAULT_FONT(\"Regular\", 10))\n\t\t\t\t\t]\n\t\t\t\t];\n\t\t}\n\t}\n\n\treturn Buttons.ToSharedRef();\n}\n\nTSharedRef<SWidget> SDialogueBrowser::MakeInlineWidget(const TSharedPtr<FDialogueBrowserTreeNode>& InItem)\n{\n\tif (!InItem.IsValid())\n\t{\n\t\treturn SMissingWidget::MakeMissingWidget();\n\t}\n\tif (!InItem->HasInlineChildren() || !InItem->IsText())\n\t{\n\t\treturn SMissingWidget::MakeMissingWidget();\n\t}\n\n\tif (InItem->IsDialogueText())\n\t{\n\t\t// Display the [Dialogue] [Node1] [Node2] [Node3] [Jump to Content Browser] [Open Dialogue]\n\t\treturn SNew(SHorizontalBox)\n\t\t\t// Icon and Dialogue Name\n\t\t\t+SHorizontalBox::Slot()\n\t\t\t.HAlign(HAlign_Left)\n\t\t\t.VAlign(VAlign_Center)\n\t\t\t.Padding(0.f, 0.f, 10.f, 0.f)\n\t\t\t[\n\t\t\t\tMakeIconAndTextWidget(InItem->GetDisplayText(), FDialogueStyle::Get()->GetBrush(FDialogueStyle::PROPERTY_DlgDialogueClassThumbnail))\n\t\t\t]\n\n\t\t\t// Graph Nodes\n\t\t\t+SHorizontalBox::Slot()\n\t\t\t.HAlign(HAlign_Left)\n\t\t\t.VAlign(VAlign_Center)\n\t\t\t[\n\t\t\t\tMakeButtonWidgetForGraphNodes(InItem->GetInlineChildren())\n\t\t\t]\n\n\t\t\t// Buttons on the right side\n\t\t\t+SHorizontalBox::Slot()\n\t\t\t.HAlign(HAlign_Right)\n\t\t\t.VAlign(VAlign_Center)\n\t\t\t[\n\t\t\t\tMakeButtonsWidgetForDialogue(InItem)\n\t\t\t];\n\t}\n\n\treturn SMissingWidget::MakeMissingWidget();\n}\n\nTSharedRef<SWidget> SDialogueBrowser::MakeButtonsWidgetForDialogue(const TSharedPtr<FDialogueBrowserTreeNode>& InItem)\n{\n\treturn SNew(SHorizontalBox)\n\t\t// Find in Content Browser\n\t\t+SHorizontalBox::Slot()\n\t\t.AutoWidth()\n\t\t.HAlign(HAlign_Left)\n\t\t[\n\t\t\tSNew(SButton)\n\t\t\t.ButtonStyle(FEditorStyle::Get(), \"HoverHintOnly\")\n\t\t\t.ToolTipText(LOCTEXT(\"FindInContentBrowserToolTip\", \"Find the Dialogue in the Context Browser\"))\n\t\t\t.OnClicked(this, &Self::FindInContentBrowserForItem, InItem)\n\t\t\t[\n\t\t\t\tSNew(SBox)\n\t\t\t\t.HAlign(HAlign_Fill)\n\t\t\t\t.VAlign(VAlign_Fill)\n\t\t\t\t.WidthOverride(16)\n\t\t\t\t.HeightOverride(16)\n\t\t\t\t[\n\t\t\t\t\tSNew(SImage)\n\t\t\t\t\t.Image(FDialogueStyle::Get()->GetBrush(FDialogueStyle::PROPERTY_FindAssetIcon))\n\t\t\t\t]\n\t\t\t]\n\t\t]\n\n\t\t// Open Editor\n\t\t+SHorizontalBox::Slot()\n\t\t.AutoWidth()\n\t\t.HAlign(HAlign_Left)\n\t\t[\n\t\t\tSNew(SButton)\n\t\t\t.ButtonStyle(FEditorStyle::Get(), \"HoverHintOnly\")\n\t\t\t.ToolTipText(LOCTEXT(\"OpenDialogueToolTip\", \"Opens the dialogue editor.\"))\n\t\t\t.OnClicked(InItem.Get(), &FDialogueBrowserTreeNode::OnClick)\n\t\t\t[\n\t\t\t\tSNew(SBox)\n\t\t\t\t.HAlign(HAlign_Fill)\n\t\t\t\t.VAlign(VAlign_Fill)\n\t\t\t\t.WidthOverride(16)\n\t\t\t\t.HeightOverride(16)\n\t\t\t\t[\n\t\t\t\t\tSNew(SImage)\n\t\t\t\t\t.Image(FDialogueStyle::Get()->GetBrush(FDialogueStyle::PROPERTY_OpenAssetIcon))\n\t\t\t\t]\n\t\t\t]\n\t\t];\n}\n\nvoid SDialogueBrowser::HandleSearchTextCommitted(const FText& InText, ETextCommit::Type InCommitType)\n{\n\t// Trim and sanitized the filter text (so that it more likely matches)\n\tFilterString = FText::TrimPrecedingAndTrailing(InText).ToString();\n\tGenerateFilteredItems();\n//\tRefreshTree(false);\n}\n\nTSharedRef<ITableRow> SDialogueBrowser::HandleGenerateRow(\n\tTSharedPtr<FDialogueBrowserTreeNode> InItem,\n\tconst TSharedRef<STableViewBase>& OwnerTable\n)\n{\n\t// Build row\n\tTSharedPtr<STableRow<TSharedPtr<FDialogueBrowserTreeNode>>> TableRow;\n\tFMargin RowPadding = FMargin(2.f, 2.f);\n\tconst bool bIsCategory = InItem->IsCategory();\n\tconst bool bIsSeparator = InItem->IsSeparator();\n\n\tif (bIsCategory)\n\t{\n\t\tTableRow =\n\t\t\tSNew(SCategoryHeaderTableRow<TSharedPtr<FDialogueBrowserTreeNode>>, OwnerTable)\n\t\t\t.Visibility(InItem->IsVisible() ? EVisibility::Visible : EVisibility::Collapsed);\n\t}\n\telse\n\t{\n\t\tTableRow =\n\t\t\tSNew(STableRow<TSharedPtr<FDialogueBrowserTreeNode>>, OwnerTable)\n\t\t\t.Padding(1.0f)\n\t\t\t.Visibility(InItem->IsVisible() ? EVisibility::Visible : EVisibility::Collapsed)\n\t\t\t.ShowSelection(!bIsSeparator);\n\t}\n\n\t// Not visible.\n\t// NOTE should not be used normally, but only after the tree view is dirty.\n\tif (!InItem->IsVisible())\n\t{\n\t\tcheckNoEntry();\n\t\treturn TableRow.ToSharedRef();\n\t}\n\n\t// Default row content\n\tTSharedPtr<STextBlock> DefaultTextBlock =\n\t\tSNew(STextBlock)\n\t\t.Text(InItem->GetDisplayText())\n\t\t.HighlightText(this, &Self::GetFilterText)\n\t\t.Font(DEFAULT_FONT(\"Regular\", 10));\n\n\tTSharedPtr<SWidget> RowContent = DefaultTextBlock;\n\tTSharedPtr<SHorizontalBox> RowContainer;\n\tTableRow->SetRowContent(SAssignNew(RowContainer, SHorizontalBox));\n\n\t// Build content\n\tif (bIsSeparator)\n\t{\n\t\tRowPadding = FMargin(0);\n\t\tRowContent = SNew(SVerticalBox)\n\t\t\t.Visibility(EVisibility::HitTestInvisible)\n\n\t\t\t+SVerticalBox::Slot()\n\t\t\t.AutoHeight()\n\t\t\t// Add some empty space before the line, and a tiny bit after it\n\t\t\t.Padding(0.0f, 5.f, 0.0f, 5.f)\n\t\t\t[\n\t\t\t\tSNew(SBorder)\n\n\t\t\t\t// We'll use the border's padding to actually create the horizontal line\n\t\t\t\t.Padding(FEditorStyle::GetMargin(TEXT(\"Menu.Separator.Padding\")))\n\n\t\t\t\t// Separator graphic\n\t\t\t\t.BorderImage(FEditorStyle::GetBrush(TEXT(\"Menu.Separator\")))\n\t\t\t];\n\t}\n\telse if (bIsCategory)\n\t{\n\t\tif (InItem->GetCategoryType() == EDialogueTreeNodeCategoryType::Participant)\n\t\t{\n\t\t\tint32 DialogueReferences = 0;\n\t\t\tTSharedPtr<FDialogueBrowserTreeParticipantProperties>* ParticipantPropertiesPtr =\n\t\t\t\tParticipantsProperties.Find(InItem->GetParentParticipantName());\n\t\t\tif (ParticipantPropertiesPtr)\n\t\t\t{\n\t\t\t\tDialogueReferences = (*ParticipantPropertiesPtr)->GetDialogues().Num();\n\t\t\t}\n\n\t\t\tRowContent = SNew(SHorizontalBox)\n\n\t\t\t\t// Name of participant\n\t\t\t\t+SHorizontalBox::Slot()\n\t\t\t\t.HAlign(HAlign_Left)\n\t\t\t\t.VAlign(VAlign_Center)\n\t\t\t\t[\n\t\t\t\t\tSNew(STextBlock)\n\t\t\t\t\t.Font(DEFAULT_FONT(\"Regular\", 16))\n\t\t\t\t\t.Text(InItem->GetDisplayText())\n\t\t\t\t\t.HighlightText(this, &Self::GetFilterText)\n\t\t\t\t]\n\n\t\t\t\t// Number of dialogue references\n\t\t\t\t+SHorizontalBox::Slot()\n\t\t\t\t.HAlign(HAlign_Right)\n\t\t\t\t.VAlign(VAlign_Center)\n\t\t\t\t[\n\t\t\t\t\tSNew(STextBlock)\n\t\t\t\t\t.Font(DEFAULT_FONT(\"Regular\", 9))\n\t\t\t\t\t.Text(FText::FromString(FString::Printf(TEXT(\"Dialogue references %d\"), DialogueReferences)))\n\t\t\t\t];\n\t\t}\n\t\telse\n\t\t{\n\t\t\tRowContent = SNew(STextBlock)\n\t\t\t\t.Font(DEFAULT_FONT(\"Regular\", 12))\n\t\t\t\t.Text(InItem->GetDisplayText())\n\t\t\t\t.HighlightText(this, &Self::GetFilterText);\n\t\t}\n\t}\n\telse if (InItem->IsText())\n\t{\n\t\tif (InItem->HasInlineChildren())\n\t\t{\n\t\t\tRowContent = MakeInlineWidget(InItem);\n\t\t}\n\t\telse if (InItem->IsDialogueText())\n\t\t{\n\t\t\tRowContent = SNew(SHorizontalBox)\n\n\t\t\t\t// Icon and Dialogue Name\n\t\t\t\t+SHorizontalBox::Slot()\n\t\t\t\t.HAlign(HAlign_Left)\n\t\t\t\t.VAlign(VAlign_Center)\n\t\t\t\t[\n\t\t\t\t\tMakeIconAndTextWidget(InItem->GetDisplayText(),\n\t\t\t\t\t\tFDialogueStyle::Get()->GetBrush(FDialogueStyle::PROPERTY_DlgDialogueClassThumbnail))\n\t\t\t\t]\n\n\t\t\t\t// Buttons on the right side\n\t\t\t\t+SHorizontalBox::Slot()\n\t\t\t\t.HAlign(HAlign_Right)\n\t\t\t\t.VAlign(VAlign_Center)\n\t\t\t\t[\n\t\t\t\t\tMakeButtonsWidgetForDialogue(InItem)\n\t\t\t\t];\n\t\t}\n\t\telse if (InItem->IsEventText())\n\t\t{\n\t\t\tRowContent = MakeIconAndTextWidget(\n\t\t\t\tInItem->GetDisplayText(),\n\t\t\t\tFDialogueStyle::Get()->GetBrush(FDialogueStyle::PROPERTY_EventIcon)\n\t\t\t);\n\t\t}\n\t\telse if (InItem->IsCustomEventText())\n\t\t{\n\t\t\tRowContent = MakeCustomObjectIconAndTextWidget(\n                InItem->GetDisplayText(),\n                FDialogueStyle::Get()->GetBrush(FDialogueStyle::PROPERTY_EventIcon),\n                InItem->GetParentClass(),\n                EDialogueBlueprintOpenType::Event,\n                GET_FUNCTION_NAME_CHECKED(UDlgEventCustom, EnterEvent)\n            );\n\t\t}\n\t\telse if (InItem->IsConditionText())\n\t\t{\n\t\t\tRowContent = MakeIconAndTextWidget(\n\t\t\t\tInItem->GetDisplayText(),\n\t\t\t\tFDialogueStyle::Get()->GetBrush(FDialogueStyle::PROPERTY_ConditionIcon)\n\t\t\t);\n\t\t}\n\t\telse if (InItem->IsGraphNodeText() || InItem->IsEdgeNodeText())\n\t\t{\n\t\t\tRowContent = SNew(SHorizontalBox)\n\n\t\t\t\t// Text\n\t\t\t\t+SHorizontalBox::Slot()\n\t\t\t\t.HAlign(HAlign_Left)\n\t\t\t\t.VAlign(VAlign_Center)\n\t\t\t\t[\n\t\t\t\t\tDefaultTextBlock.ToSharedRef()\n\t\t\t\t]\n\n\t\t\t\t// Jump To node\n\t\t\t\t+SHorizontalBox::Slot()\n\t\t\t\t.HAlign(HAlign_Right)\n\t\t\t\t.VAlign(VAlign_Center)\n\t\t\t\t[\n\t\t\t\t\tSNew(SButton)\n\t\t\t\t\t.ToolTipText(LOCTEXT(\"JumpToNodeTip\", \"Opens the Editor for the Dialogue and jumps to the node\"))\n\t\t\t\t\t.OnClicked(InItem.Get(), &FDialogueBrowserTreeNode::OnClick)\n\t\t\t\t\t[\n\t\t\t\t\t\tSNew(STextBlock)\n\t\t\t\t\t\t.Text(LOCTEXT(\"JumpToNode\", \"Jump\"))\n\t\t\t\t\t]\n\t\t\t\t];\n\t\t}\n\t}\n\telse\n\t{\n\t\t// did we miss something?\n\t}\n\n\tRowContainer->AddSlot()\n\t\t.AutoWidth()\n\t\t.VAlign(VAlign_Fill)\n\t\t.HAlign(HAlign_Right)\n\t\t[\n\t\t\tSNew(SExpanderArrow, TableRow)\n\t\t];\n\n\tRowContainer->AddSlot()\n\t\t.FillWidth(1.0)\n\t\t.Padding(RowPadding)\n\t\t[\n\t\t\tRowContent.ToSharedRef()\n\t\t];\n\n\treturn TableRow.ToSharedRef();\n}\n\nvoid SDialogueBrowser::HandleGetChildren(TSharedPtr<FDialogueBrowserTreeNode> InItem, TArray<TSharedPtr<FDialogueBrowserTreeNode>>& OutChildren)\n{\n\tif (!InItem.IsValid() || InItem->IsSeparator())\n\t{\n\t\treturn;\n\t}\n\tif (InItem->HasChildren())\n\t{\n\t\tInItem->GetVisibleChildren(OutChildren);\n\t}\n}\n\nvoid SDialogueBrowser::HandleTreeSelectionChanged(TSharedPtr<FDialogueBrowserTreeNode> NewValue, ESelectInfo::Type SelectInfo)\n{\n\t// Ignore\n}\n\nvoid SDialogueBrowser::HandleDoubleClick(TSharedPtr<FDialogueBrowserTreeNode> InItem)\n{\n\tif (!InItem.IsValid())\n\t{\n\t\treturn;\n\t}\n\n\tif (InItem->IsText())\n\t{\n\t\tInItem->OnClick();\n\t}\n\n\t// Expand on double click\n\tif (InItem->HasChildren())\n\t{\n\t\tParticipantsTreeView->SetItemExpansion(InItem, !ParticipantsTreeView->IsItemExpanded(InItem));\n\t}\n}\n\nvoid SDialogueBrowser::HandleSetExpansionRecursive(TSharedPtr<FDialogueBrowserTreeNode> InItem, bool bInIsItemExpanded)\n{\n\tif (InItem.IsValid() && InItem->HasChildren())\n\t{\n\t\tParticipantsTreeView->SetItemExpansion(InItem, bInIsItemExpanded);\n\t\tfor (const TSharedPtr<FDialogueBrowserTreeNode> Child : InItem->GetChildren())\n\t\t{\n\t\t\tHandleSetExpansionRecursive(Child, bInIsItemExpanded);\n\t\t}\n\t}\n}\n\nvoid SDialogueBrowser::HandleSortSelectionChanged(SortOptionType Selection, ESelectInfo::Type SelectInfo)\n{\n\tif (Selection.IsValid())\n\t{\n\t\tSelectedSortOption = Selection;\n\t\tRefreshTree(true);\n\t}\n}\n\nFReply SDialogueBrowser::FindInContentBrowserForItem(TSharedPtr<FDialogueBrowserTreeNode> InItem)\n{\n\tTSharedPtr<FDialogueBrowserTreeDialogueNode> DialogueItem =\n\t\tStaticCastSharedPtr<FDialogueBrowserTreeDialogueNode>(InItem);\n\tif (!DialogueItem.IsValid())\n\t{\n\t\treturn FReply::Unhandled();\n\t}\n\n\tstatic constexpr bool bFocusContentBrowser = true;\n\tif (GEditor && DialogueItem->GetDialogue().IsValid())\n\t{\n\t\tTArray<UObject*> ObjectsToSyncTo{const_cast<UDlgDialogue*>(DialogueItem->GetDialogue().Get())};\n\t\tGEditor->SyncBrowserToObjects(ObjectsToSyncTo, bFocusContentBrowser);\n\t\treturn FReply::Handled();\n\t}\n\n\treturn FReply::Unhandled();\n}\n\nTArray<TSharedPtr<FDialogueBrowserTreeNode>> SDialogueBrowser::MakeParticipantCategoriesChildren(\n\tconst TSharedPtr<FDialogueBrowserTreeNode>& Parent,\n\tconst TSharedPtr<FDialogueBrowserTreeParticipantProperties>& ParticipantProperties,\n\tbool bHideEmptyCategories\n) const\n{\n\tTArray<TSharedPtr<FDialogueBrowserTreeNode>> Categories;\n\tif (!bHideEmptyCategories || (bHideEmptyCategories && ParticipantProperties->HasDialogues()))\n\t{\n\t\tTSharedPtr<FDialogueBrowserTreeNode> Category = MakeShared<FDialogueBrowserTreeCategoryNode>(\n\t\t\tFText::FromString(TEXT(\"Dialogues\")),\n\t\t\tParent,\n\t\t\tEDialogueTreeNodeCategoryType::Dialogue\n\t\t);\n\t\tCategories.Add(Category);\n\t}\n\n\tif (!bHideEmptyCategories || (bHideEmptyCategories && ParticipantProperties->HasEvents()))\n\t{\n\t\tTSharedPtr<FDialogueBrowserTreeNode> Category = MakeShared<FDialogueBrowserTreeCategoryNode>(\n\t\t\tFText::FromString(TEXT(\"Events\")),\n\t\t\tParent,\n\t\t\tEDialogueTreeNodeCategoryType::Event\n\t\t);\n\t\tCategories.Add(Category);\n\t}\n\n\tif (!bHideEmptyCategories || (bHideEmptyCategories && ParticipantProperties->HasConditions()))\n\t{\n\t\tTSharedPtr<FDialogueBrowserTreeNode> Category = MakeShared<FDialogueBrowserTreeCategoryNode>(\n\t\t\tFText::FromString(TEXT(\"Conditions\")),\n\t\t\tParent,\n\t\t\tEDialogueTreeNodeCategoryType::Condition\n\t\t);\n\t\tCategories.Add(Category);\n\t}\n\n\tif (!bHideEmptyCategories || (bHideEmptyCategories && ParticipantProperties->HasDialogueValues()))\n\t{\n\t\tTSharedPtr<FDialogueBrowserTreeNode> Category = MakeShared<FDialogueBrowserTreeCategoryNode>(\n\t\t\tFText::FromString(TEXT(\"Dialogue Values\")),\n\t\t\tParent,\n\t\t\tEDialogueTreeNodeCategoryType::Variable\n\t\t);\n\t\tCategories.Add(Category);\n\t}\n\n\tif (!bHideEmptyCategories || (bHideEmptyCategories && ParticipantProperties->HasClassVariables()))\n\t{\n\t\tTSharedPtr<FDialogueBrowserTreeNode> Category = MakeShared<FDialogueBrowserTreeCategoryNode>(\n\t\t\tFText::FromString(TEXT(\"Class Variables\")),\n\t\t\tParent,\n\t\t\tEDialogueTreeNodeCategoryType::ClassVariable\n\t\t);\n\t\tCategories.Add(Category);\n\t}\n\treturn Categories;\n}\n\nTArray<TSharedPtr<FDialogueBrowserTreeNode>> SDialogueBrowser::MakeVariableCategoriesChildren(\n\tconst TSharedPtr<FDialogueBrowserTreeNode>& Parent,\n\tconst TSharedPtr<FDialogueBrowserTreeParticipantProperties>& ParticipantProperties,\n\tbool bHideEmptyCategories\n) const\n{\n\tTArray<TSharedPtr<FDialogueBrowserTreeNode>> Categories;\n\tif (!bHideEmptyCategories || (bHideEmptyCategories && ParticipantProperties->HasIntegers()))\n\t{\n\t\tTSharedPtr<FDialogueBrowserTreeNode> Category = MakeShared<FDialogueBrowserTreeCategoryNode>(\n\t\t\tFText::FromString(TEXT(\"Integers\")),\n\t\t\tParent,\n\t\t\tEDialogueTreeNodeCategoryType::VariableInt\n\t\t);\n\t\tCategories.Add(Category);\n\t}\n\n\tif (!bHideEmptyCategories || (bHideEmptyCategories && ParticipantProperties->HasFloats()))\n\t{\n\t\tTSharedPtr<FDialogueBrowserTreeNode> Category = MakeShared<FDialogueBrowserTreeCategoryNode>(\n\t\t\tFText::FromString(TEXT(\"Floats\")),\n\t\t\tParent,\n\t\t\tEDialogueTreeNodeCategoryType::VariableFloat\n\t\t);\n\t\tCategories.Add(Category);\n\t}\n\n\tif (!bHideEmptyCategories || (bHideEmptyCategories && ParticipantProperties->HasBools()))\n\t{\n\t\tTSharedPtr<FDialogueBrowserTreeNode> Category = MakeShared<FDialogueBrowserTreeCategoryNode>(\n\t\t\tFText::FromString(TEXT(\"Bools\")),\n\t\t\tParent,\n\t\t\tEDialogueTreeNodeCategoryType::VariableBool\n\t\t);\n\t\tCategories.Add(Category);\n\t}\n\n\tif (!bHideEmptyCategories || (bHideEmptyCategories && ParticipantProperties->HasFNames()))\n\t{\n\t\tTSharedPtr<FDialogueBrowserTreeNode> Category = MakeShared<FDialogueBrowserTreeCategoryNode>(\n\t\t\tFText::FromString(TEXT(\"FNames\")),\n\t\t\tParent,\n\t\t\tEDialogueTreeNodeCategoryType::VariableFName\n\t\t);\n\t\tCategories.Add(Category);\n\t}\n\n\treturn Categories;\n}\n\nTArray<TSharedPtr<FDialogueBrowserTreeNode>> SDialogueBrowser::MakeClassVariableCategoriesChildren(\n\tconst TSharedPtr<FDialogueBrowserTreeNode>& Parent,\n\tconst TSharedPtr<FDialogueBrowserTreeParticipantProperties>& ParticipantProperties,\n\tbool bHideEmptyCategories\n) const\n{\n\tTArray<TSharedPtr<FDialogueBrowserTreeNode>> Categories;\n\n\tif (!bHideEmptyCategories || (bHideEmptyCategories && ParticipantProperties->HasClassIntegers()))\n\t{\n\t\tTSharedPtr<FDialogueBrowserTreeNode> Category = MakeShared<FDialogueBrowserTreeCategoryNode>(\n\t\t\tFText::FromString(TEXT(\"Integers\")),\n\t\t\tParent,\n\t\t\tEDialogueTreeNodeCategoryType::ClassVariableInt\n\t\t);\n\t\tCategories.Add(Category);\n\t}\n\n\tif (!bHideEmptyCategories || (bHideEmptyCategories && ParticipantProperties->HasClassFloats()))\n\t{\n\t\tTSharedPtr<FDialogueBrowserTreeNode> Category = MakeShared<FDialogueBrowserTreeCategoryNode>(\n\t\t\tFText::FromString(TEXT(\"Floats\")),\n\t\t\tParent,\n\t\t\tEDialogueTreeNodeCategoryType::ClassVariableFloat\n\t\t);\n\t\tCategories.Add(Category);\n\t}\n\n\tif (!bHideEmptyCategories || (bHideEmptyCategories && ParticipantProperties->HasClassBools()))\n\t{\n\t\tTSharedPtr<FDialogueBrowserTreeNode> Category = MakeShared<FDialogueBrowserTreeCategoryNode>(\n\t\t\tFText::FromString(TEXT(\"Bools\")),\n\t\t\tParent,\n\t\t\tEDialogueTreeNodeCategoryType::ClassVariableBool\n\t\t);\n\t\tCategories.Add(Category);\n\t}\n\n\tif (!bHideEmptyCategories || (bHideEmptyCategories && ParticipantProperties->HasClassFNames()))\n\t{\n\t\tTSharedPtr<FDialogueBrowserTreeNode> Category = MakeShared<FDialogueBrowserTreeCategoryNode>(\n\t\t\tFText::FromString(TEXT(\"FNames\")),\n\t\t\tParent,\n\t\t\tEDialogueTreeNodeCategoryType::ClassVariableFName\n\t\t);\n\t\tCategories.Add(Category);\n\t}\n\n\tif (!bHideEmptyCategories || (bHideEmptyCategories && ParticipantProperties->HasClassFTexts()))\n\t{\n\t\tTSharedPtr<FDialogueBrowserTreeNode> Category = MakeShared<FDialogueBrowserTreeCategoryNode>(\n\t\t\tFText::FromString(TEXT(\"FTexts\")),\n\t\t\tParent,\n\t\t\tEDialogueTreeNodeCategoryType::ClassVariableFText\n\t\t);\n\t\tCategories.Add(Category);\n\t}\n\n\treturn Categories;\n}\n\nTSharedRef<SHorizontalBox> SDialogueBrowser::MakeIconAndTextWidget(\n\tconst FText& InText,\n\tconst FSlateBrush* IconBrush,\n\tint32 IconSize\n)\n{\n\treturn SNew(SHorizontalBox)\n\t\t+SHorizontalBox::Slot()\n\t\t.VAlign(VAlign_Center)\n\t\t.AutoWidth()\n\t\t[\n\t\t\tSNew(SBox)\n\t\t\t.HAlign(HAlign_Fill)\n\t\t\t.VAlign(VAlign_Fill)\n\t\t\t.WidthOverride(IconSize)\n\t\t\t.HeightOverride(IconSize)\n\t\t\t[\n\t\t\t\tSNew(SImage)\n\t\t\t\t.Image(IconBrush)\n\t\t\t]\n\t\t]\n\n\t\t+SHorizontalBox::Slot()\n\t\t.VAlign(VAlign_Center)\n\t\t.AutoWidth()\n\t\t.Padding(2.f, 0.f)\n\t\t[\n\t\t\tSNew(STextBlock)\n\t\t\t.Text(InText)\n\t\t\t.HighlightText(this, &Self::GetFilterText)\n\t\t];\n}\n\nTSharedRef<SHorizontalBox> SDialogueBrowser::MakeCustomObjectIconAndTextWidget(\n    const FText& InText,\n    const FSlateBrush* IconBrush,\n    UClass* Class,\n    EDialogueBlueprintOpenType OpenType,\n\tFName FunctionNameToOpen,\n    int32 IconSize\n)\n{\n\tTSharedRef<SHorizontalBox> HorizontalBox = MakeIconAndTextWidget(InText, IconBrush, IconSize);\n\n\t// Browse Asset\n\tHorizontalBox->AddSlot()\n    .AutoWidth()\n    .VAlign(VAlign_Center)\n    .Padding(4.f)\n    [\n        SNew(SButton)\n        .ButtonStyle(FEditorStyle::Get(), \"HoverHintOnly\")\n        .ToolTipText_Static(&Self::GetBrowseAssetText, Class)\n        .ContentPadding(4.f)\n        .ForegroundColor(FSlateColor::UseForeground())\n        .Visibility_Static(&Self::GetBrowseAssetButtonVisibility, Class)\n        .OnClicked_Static(&Self::OnBrowseAssetClicked, Class)\n        [\n            SNew(SImage)\n            .Image(FEditorStyle::GetBrush(\"PropertyWindow.Button_Browse\"))\n            .ColorAndOpacity(FSlateColor::UseForeground())\n        ]\n    ];\n\n\t// Jump to Object\n\tHorizontalBox->AddSlot()\n    .AutoWidth()\n    .VAlign(VAlign_Center)\n    .Padding(4.f, 2.f)\n    [\n        SNew(SButton)\n        .ButtonStyle(FEditorStyle::Get(), \"HoverHintOnly\")\n        .ToolTipText_Static(&Self::GetJumpToAssetText, Class)\n        .ContentPadding(4.f)\n        .ForegroundColor(FSlateColor::UseForeground())\n        .Visibility_Static(&Self::GetOpenAssetButtonVisibility, Class)\n        .OnClicked_Static(&Self::OnOpenAssetClicked, Class, OpenType, FunctionNameToOpen)\n        [\n            SNew(SImage)\n             .Image(FEditorStyle::GetBrush(\"PropertyWindow.Button_Edit\"))\n             .ColorAndOpacity( FSlateColor::UseForeground() )\n        ]\n    ];\n\n\treturn HorizontalBox;\n}\n\nEVisibility SDialogueBrowser::GetOpenAssetButtonVisibility(UClass* Class)\n{\n\t// Blueprint, always visible\n\tif (FDlgHelper::IsABlueprintClass(Class))\n\t{\n\t\treturn EVisibility::Visible;\n\t}\n\n\t// Native\n\treturn FSourceCodeNavigation::CanNavigateToClass(Class) ? EVisibility::Visible : EVisibility::Collapsed;\n}\n\nEVisibility SDialogueBrowser::GetBrowseAssetButtonVisibility(UClass* Class)\n{\n\t// Blueprint, always Visible\n\tif (FDlgHelper::IsABlueprintClass(Class))\n\t{\n\t\treturn EVisibility::Visible;\n\t}\n\n\t// Native Hide\n\treturn EVisibility::Collapsed;\n}\n\nFReply SDialogueBrowser::OnBrowseAssetClicked(UClass* Class)\n{\n\tUBlueprint* Blueprint = nullptr;\n\tif (const UBlueprintGeneratedClass* BlueprintClass = Cast<UBlueprintGeneratedClass>(Class))\n\t{\n\t\tBlueprint = Cast<UBlueprint>(BlueprintClass->ClassGeneratedBy);\n\t}\n\n\tstatic constexpr bool bFocusContentBrowser = true;\n\tTArray<UObject*> ObjectsToSyncTo;\n\tif (Blueprint)\n\t{\n\t\tObjectsToSyncTo.Add(Blueprint);\n\t}\n\tGEditor->SyncBrowserToObjects(ObjectsToSyncTo, bFocusContentBrowser);\n\n\treturn FReply::Handled();\n}\n\nFReply SDialogueBrowser::OnOpenAssetClicked(\n\tUClass* Class,\n    EDialogueBlueprintOpenType OpenType,\n    FName FunctionNameToOpen\n)\n{\n\tUBlueprint* Blueprint = nullptr;\n\tif (const UBlueprintGeneratedClass* BlueprintClass = Cast<UBlueprintGeneratedClass>(Class))\n\t{\n\t\tBlueprint = Cast<UBlueprint>(BlueprintClass->ClassGeneratedBy);\n\t}\n\n\tif (Blueprint)\n\t{\n\t\tstatic constexpr bool bForceFullEditor = true;\n\t\tstatic constexpr bool bAddBlueprintFunctionIfItDoesNotExist = true;\n\t\tFDialogueEditorUtilities::OpenBlueprintEditor(\n            Blueprint,\n            OpenType,\n            FunctionNameToOpen,\n            bForceFullEditor,\n            bAddBlueprintFunctionIfItDoesNotExist\n        );\n\t}\n\telse if (UObject* Object = Class->GetDefaultObject())\n\t{\n\t\t// Native\n\t\tFSourceCodeNavigation::NavigateToClass(Object->GetClass());\n\t}\n\n\treturn FReply::Handled();\n}\n\nFText SDialogueBrowser::GetJumpToAssetText(UClass* Class)\n{\n\t// Blueprint, always visible\n\tif (FDlgHelper::IsABlueprintClass(Class))\n\t{\n\t\treturn LOCTEXT(\"OpenObjectBlueprintTooltipKey\", \"Open Blueprint Editor\");\n\t}\n\n\t// Native\n\treturn FText::Format(\n        LOCTEXT(\"OpenObjectBlueprintTooltipKey\", \"Open Source File in {0}\"),\n        FSourceCodeNavigation::GetSelectedSourceCodeIDE()\n    );\n}\n\nFText SDialogueBrowser::GetBrowseAssetText(UClass* Class)\n{\n\treturn LOCTEXT(\"BrowseButtonToolTipText\", \"Browse to Asset in Content Browser\");\n}\n\nTSharedRef<SWidget> SDialogueBrowser::FillViewOptionsEntries()\n{\n\tFMenuBuilder MenuBuilder(true, nullptr);\n\tMenuBuilder.AddMenuEntry(\n\t\tLOCTEXT(\"HideEmptyCategories\", \"Hide empty categories\"),\n\t\tLOCTEXT(\"HideEmptyCategories_ToolTip\", \"Hides categories that do not have any children\"),\n\t\tFSlateIcon(),\n\t\tFUIAction(\n\t\t\tFExecuteAction::CreateLambda([this]()\n\t\t\t{\n\t\t\t\tUDlgSystemSettings* Settings = GetMutableDefault<UDlgSystemSettings>();\n\t\t\t\tSettings->SetHideEmptyDialogueBrowserCategories(!Settings->bHideEmptyDialogueBrowserCategories);\n\t\t\t\tRefreshTree(true);\n\t\t\t}),\n\t\t\tFCanExecuteAction(),\n\t\t\tFIsActionChecked::CreateLambda([]() -> bool\n\t\t\t{\n\t\t\t\treturn GetDefault<UDlgSystemSettings>()->bHideEmptyDialogueBrowserCategories;\n\t\t\t})\n\t\t),\n\t\tNAME_None,\n\t\tEUserInterfaceActionType::ToggleButton\n\t);\n\n\treturn MenuBuilder.MakeWidget();\n}\n\n#undef LOCTEXT_NAMESPACE\n#undef DEFAULT_FONT\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystemEditor/Private/DialogueBrowser/SDialogueBrowser.h",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#pragma once\n\n#include \"Widgets/DeclarativeSyntaxSupport.h\"\n#include \"Widgets/SCompoundWidget.h\"\n#include \"Widgets/Views/SListView.h\"\n#include \"Widgets/Views/STreeView.h\"\n#include \"Widgets/Input/SSearchBox.h\"\n\n#include \"DialogueBrowserTreeNode.h\"\n#include \"DialogueTreeProperties/DialogueBrowserTreeParticipantProperties.h\"\n#include \"DialogueBrowserUtilities.h\"\n\nenum class EDialogueBlueprintOpenType : unsigned char;\nclass UDlgDialogue;\nclass SImage;\n\n/**\n * Implements the Dialogue Browser\n */\nclass SDialogueBrowser : public SCompoundWidget\n{\n\ttypedef SDialogueBrowser Self;\n\ttypedef TSharedPtr<FDialogueBrowserSortOption> SortOptionType;\n\npublic:\n\tSLATE_BEGIN_ARGS(Self) {}\n\tSLATE_END_ARGS()\n\n\tvoid Construct(const FArguments& InArgs);\n\n\t// Updates the participants tree.\n\tvoid RefreshTree(bool bPreserveExpansion);\n\n\t// Get current filter text\n\tFText GetFilterText() const { return FilterTextBoxWidget->GetText(); }\n\nprotected:\n\t// Handle filtering.\n\tvoid GenerateFilteredItems();\n\n\t// Getters for widgets.\n\tTSharedRef<SWidget> GetFilterTextBoxWidget();\n\n\t// Add Dialogue Children of type TextType to the InItem.\n\tvoid AddDialogueChildrenToItemFromProperty(\n\t\tconst TSharedPtr<FDialogueBrowserTreeNode>& InItem,\n\t\tconst TSharedPtr<FDialogueBrowserTreeVariableProperties>* PropertyPtr,\n\t\tEDialogueTreeNodeTextType TextType\n\t);\n\n\t// Add GraphNode Children of type TextType to the InItem.\n\tvoid AddGraphNodeChildrenToItem(\n\t\tconst TSharedPtr<FDialogueBrowserTreeNode>& InItem,\n\t\tconst TSet<TWeakObjectPtr<const UDialogueGraphNode>>& GraphNodes,\n\t\tEDialogueTreeNodeTextType TextType\n\t);\n\n\t// Add EdgeNode Children of type TextType to the InItem.\n\tvoid AddEdgeNodeChildrenToItem(\n\t\tconst TSharedPtr<FDialogueBrowserTreeNode>& InItem,\n\t\tconst TSet<TWeakObjectPtr<const UDialogueGraphNode_Edge>>& EdgeNodes,\n\t\tEDialogueTreeNodeTextType TextType\n\t);\n\n\t// Add both GraphNode Children and EdgeNode Children to the InItem from The Property.\n\tvoid AddGraphNodeBaseChildrenToItemFromProperty(\n\t\tconst TSharedPtr<FDialogueBrowserTreeNode>& InItem,\n\t\tconst TSharedPtr<FDialogueBrowserTreeVariableProperties>* PropertyPtr,\n\t\tEDialogueTreeNodeTextType GraphNodeTextType,\n\t\tEDialogueTreeNodeTextType EdgeNodeTextType);\n\n\t// Adds the Variables to the Item\n\tvoid AddVariableChildrenToItem(\n\t\tconst TSharedPtr<FDialogueBrowserTreeNode>& Item,\n\t\tconst TMap<FName, TSharedPtr<FDialogueBrowserTreeVariableProperties>>& Variables,\n\t\tEDialogueTreeNodeTextType VariableType\n\t);\n\n\t// Recursively build the view item.\n\tvoid BuildTreeViewItem(const TSharedPtr<FDialogueBrowserTreeNode>& Item);\n\n\t// helper function to generate inline widgets for item.\n\tTSharedRef<SWidget> MakeInlineWidget(const TSharedPtr<FDialogueBrowserTreeNode>& InItem);\n\n\t// Make the row of buttons for the graph nodes.\n\tTSharedRef<SWidget> MakeButtonWidgetForGraphNodes(const TArray<TSharedPtr<FDialogueBrowserTreeNode>>& InChildren);\n\n\t// Make the buttons to open the dialogue.\n\tTSharedRef<SWidget> MakeButtonsWidgetForDialogue(const TSharedPtr<FDialogueBrowserTreeNode>& InItem);\n\n\t// Text search changed\n\tvoid HandleSearchTextCommitted(const FText& InText, ETextCommit::Type InCommitType);\n\n\t// Make the row\n\tTSharedRef<ITableRow> HandleGenerateRow(TSharedPtr<FDialogueBrowserTreeNode> InItem, const TSharedRef<STableViewBase>& OwnerTable);\n\n\t// General Get children\n\tvoid HandleGetChildren(TSharedPtr<FDialogueBrowserTreeNode> InItem, TArray<TSharedPtr<FDialogueBrowserTreeNode>>& OutChildren);\n\n\t// Handles changes in the Tree View.\n\tvoid HandleTreeSelectionChanged(TSharedPtr<FDialogueBrowserTreeNode> NewValue, ESelectInfo::Type SelectInfo);\n\n\t// User clicked on item.\n\tvoid HandleDoubleClick(TSharedPtr<FDialogueBrowserTreeNode> InItem);\n\n\t// Refresh button clicked.\n\tFReply HandleOnRefresh()\n\t{\n\t\tRefreshTree(true);\n\t\treturn FReply::Handled();\n\t}\n\n\t// Callback for expanding tree items recursively\n\tvoid HandleSetExpansionRecursive(TSharedPtr<FDialogueBrowserTreeNode> InItem, bool bInIsItemExpanded);\n\n\t// When the sort option selection changes.\n\tvoid HandleSortSelectionChanged(SortOptionType Selection, ESelectInfo::Type SelectInfo);\n\n\t// Finds the object of the item inside the Content browser.\n\tFReply FindInContentBrowserForItem(TSharedPtr<FDialogueBrowserTreeNode> InItem);\n\n\t// Makes Participant categories.\n\tTArray<TSharedPtr<FDialogueBrowserTreeNode>> MakeParticipantCategoriesChildren(\n\t\tconst TSharedPtr<FDialogueBrowserTreeNode>& Parent,\n\t\tconst TSharedPtr<FDialogueBrowserTreeParticipantProperties>& ParticipantProperties,\n\t\tbool bHideEmptyCategories\n\t) const;\n\n\t// Makes Variable categories.\n\tTArray<TSharedPtr<FDialogueBrowserTreeNode>> MakeVariableCategoriesChildren(\n\t\tconst TSharedPtr<FDialogueBrowserTreeNode>& Parent,\n\t\tconst TSharedPtr<FDialogueBrowserTreeParticipantProperties>& ParticipantProperties,\n\t\tbool bHideEmptyCategories\n\t) const;\n\n\t// Makes Class Variable categories.\n\tTArray<TSharedPtr<FDialogueBrowserTreeNode>> MakeClassVariableCategoriesChildren(\n\t\tconst TSharedPtr<FDialogueBrowserTreeNode>& Parent,\n\t\tconst TSharedPtr<FDialogueBrowserTreeParticipantProperties>& ParticipantProperties,\n\t\tbool bHideEmptyCategories\n\t) const;\n\n\t// Makes a widget that has IconName. Text of item.\n\tTSharedRef<SHorizontalBox> MakeIconAndTextWidget(\n\t\tconst FText& InText,\n\t\tconst FSlateBrush* IconBrush,\n\t\tint32 IconSize = 24\n\t);\n\n\t// Makes a widget for a Class that has IconName. Text of item.\n\tTSharedRef<SHorizontalBox> MakeCustomObjectIconAndTextWidget(\n        const FText& InText,\n        const FSlateBrush* IconBrush,\n        UClass* Class,\n        EDialogueBlueprintOpenType OpenType,\n\t\tFName FunctionNameToOpen,\n        int32 IconSize = 24\n    );\n\n\t// Fills the menu of the View Options\n\tTSharedRef<SWidget>\tFillViewOptionsEntries();\n\n\tstatic EVisibility GetOpenAssetButtonVisibility(UClass* Class);\n\tstatic EVisibility GetBrowseAssetButtonVisibility(UClass* Class);\n\tstatic FReply OnBrowseAssetClicked(UClass* Class);\n\tstatic FReply OnOpenAssetClicked(\n\t\tUClass* Class,\n\t\tEDialogueBlueprintOpenType OpenType,\n\t\tFName FunctionNameToOpen\n\t);\n\tstatic FText GetJumpToAssetText(UClass* Class);\n\tstatic FText GetBrowseAssetText(UClass* Class);\n\nprotected:\n\t// The search box\n\tTSharedPtr<SSearchBox> FilterTextBoxWidget;\n\n\t// The filter text from the search box.\n\tFString FilterString;\n\n\t// The root data source\n\tTSharedPtr<FDialogueBrowserTreeNode> RootTreeItem;\n\n\t// The root children. Kept separate so that we do not corrupt the data.\n\tTArray<TSharedPtr<FDialogueBrowserTreeNode>> RootChildren;\n\n\t// Tree view for showing all participants, etc.\n\tTSharedPtr<STreeView<TSharedPtr<FDialogueBrowserTreeNode>>> ParticipantsTreeView;\n\n\t/**\n\t * Used for fast lookup of each participants\n\t * Key: Participant Name\n\t * Value: participant properties\n\t */\n\tTMap<FName, TSharedPtr<FDialogueBrowserTreeParticipantProperties>> ParticipantsProperties;\n\n\t//\n\t// Sort variables\n\t//\n\n\t// The data sources\n\tTArray<SortOptionType> SortOptions;\n\n\t// Default option.\n\tSortOptionType DefaultSortOption;\n\n\t// Selected option.\n\tSortOptionType SelectedSortOption;\n};\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystemEditor/Private/DialogueCommands.cpp",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#include \"DialogueCommands.h\"\n\n//////////////////////////////////////////////////////////////////////////\n// DlgEditorCommands\n#define LOCTEXT_NAMESPACE \"DialogueCommands\"\n\nvoid FDialogueCommands::RegisterCommands()\n{\n\tUI_COMMAND(\n\t\tDialogueReloadData,\n\t\t\"Reload Data\",\n\t\t\"Reloads the Dialogue data from the .dlg text file with the same name in the folder\",\n\t\tEUserInterfaceActionType::Button, FInputChord()\n\t);\n\n\tUI_COMMAND(\n\t\tToggleShowPrimarySecondaryEdges,\n\t\t\"Show primary/secondary edges\",\n\t\t\"Toggles the viewing of the primary/secondary edges.\",\n\t\tEUserInterfaceActionType::ToggleButton, FInputChord()\n\t);\n\n\tUI_COMMAND(\n\t\tToggleDrawPrimaryEdges,\n\t\t\"Draws the primary edges\",\n\t\t\"Toggles the drawing of the primary edges\",\n\t\tEUserInterfaceActionType::ToggleButton, FInputChord()\n\t);\n\n\tUI_COMMAND(\n\t\tToggleDrawSecondaryEdges,\n\t\t\"Draws the secondary edges\",\n\t\t\"Toggles the drawing of the secondary edges\",\n\t\tEUserInterfaceActionType::ToggleButton, FInputChord()\n\t);\n\n\tUI_COMMAND(\n\t\tConvertSpeechSequenceNodeToSpeechNodes,\n\t\t\"Convert to speech nodes\",\n\t\t\"Converts/breaks the speech sequence node to a list of speech node.\",\n\t\tEUserInterfaceActionType::Button, FInputChord()\n\t);\n\n\tUI_COMMAND(\n\t\tConvertSpeechNodesToSpeechSequence,\n\t    \"Converts selected Speech node(s) to a Speech Sequence Node\",\n\t    \"Converts selected (compresses) linear Speech node(s) to a Speech Sequence Node\",\n\t    EUserInterfaceActionType::Button, FInputChord()\n\t);\n\n\tUI_COMMAND(\n\t\tSaveAllDialogues,\n\t\t\"Save All Dialogues...\",\n\t\t\"Saves all dialogues to the disk\",\n\t\tEUserInterfaceActionType::Button, FInputChord()\n\t);\n\n\tUI_COMMAND(\n\t\tDeleteAllDialoguesTextFiles,\n\t\t\"Delete All Dialogues Text Files...\",\n\t\t\"Delete all dialogues text files on the disk from all existing known text formats and from the Settings AdditionalTextFormatFileExtensionsToLookFor\",\n\t\tEUserInterfaceActionType::Button, FInputChord()\n\t);\n\n\tUI_COMMAND(\n\t\tDeleteCurrentDialogueTextFiles,\n\t\t\"Delete Current Dialogue Text Files...\",\n\t\t\"Delete all text files of the CURRENT Dialogue on the disk from all existing known text formats and from the Settings AdditionalTextFormatFileExtensionsToLookFor\",\n\t\tEUserInterfaceActionType::Button, FInputChord()\n\t);\n\n\tUI_COMMAND(\n\t\tOpenNotYetPlugins,\n\t\t\"Not Yet: Plugins...\",\n\t\t\"Navigates to the Not Yet Plugins page\",\n\t\tEUserInterfaceActionType::Button, FInputChord()\n\t);\n\n\tUI_COMMAND(\n\t\tOpenMarketplace,\n\t\t\"Marketplace...\",\n\t\t\"Navigates to the Dialogue Unreal Marketplace page\",\n\t\tEUserInterfaceActionType::Button, FInputChord()\n\t);\n\n\tUI_COMMAND(\n\t\tOpenWiki,\n\t\t\"Wiki/Documentation...\",\n\t\t\"Navigates to the Dialogue System Wiki/Documentation page\",\n\t\tEUserInterfaceActionType::Button, FInputChord()\n\t);\n\n\tUI_COMMAND(\n\t\tOpenDiscord,\n\t\t\"Discord...\",\n\t\t\"Navigates to the Dialogue System Discord server\",\n\t\tEUserInterfaceActionType::Button, FInputChord()\n\t);\n\n\tUI_COMMAND(\n\t\tOpenForum,\n\t\t\"Forum...\",\n\t\t\"Navigates to the Dialogue System Forum\",\n\t\tEUserInterfaceActionType::Button, FInputChord()\n\t);\n\n\tUI_COMMAND(\n\t\tFindInAllDialogues,\n\t\t\"Find in All Dialogues\",\n\t\t\"Find references to descriptions, events, condition and variables in ALL Dialogue\",\n\t\tEUserInterfaceActionType::Button,\n\t\tFInputChord(EModifierKey::Control | EModifierKey::Shift, EKeys::F)\n\t);\n\n\tUI_COMMAND(\n\t\tFindInDialogue,\n\t\t\"Find\",\n\t\t\"Find references to descriptions, events, condition and variables in the current Dialogue (use Ctrl+Shift+F to search in all Dialogues)\",\n\t\tEUserInterfaceActionType::Button,\n\t\tFInputChord(EModifierKey::Control, EKeys::F)\n\t);\n\n\tUI_COMMAND(\n\t\tHideNodes,\n\t\t\"HideNodes\",\n\t\t\"Hide selected nodes\",\n\t\tEUserInterfaceActionType::Button,\n\t\tFInputChord(EKeys::H)\n\t);\n\n\tUI_COMMAND(\n\t\tUnHideAllNodes,\n\t\t\"UnHideAllNodes\",\n\t\t\"UnHide all nodes\",\n\t\tEUserInterfaceActionType::Button,\n\t\tFInputChord(EModifierKey::Control, EKeys::H)\n\t);\n}\n\n#undef LOCTEXT_NAMESPACE\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystemEditor/Private/DialogueCommands.h",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#pragma once\n\n#include \"Framework/Commands/Commands.h\"\n\n#include \"DialogueStyle.h\"\n\n// Add menu commands and stuff, if you want to that is\nclass FDialogueCommands : public TCommands<FDialogueCommands>\n{\npublic:\n\tFDialogueCommands()\n\t\t: TCommands<FDialogueCommands>(\n\t\t\tTEXT(\"DlgSystemEditor\"), // Context name for fast lookup\n\t\t\tNSLOCTEXT(\"Contexts\", \"DlgSystemEditor\", \"DlgSystem Editor\"), // Localized context name for displaying\n\t\t\tNAME_None, // Parent\n\t\t\tFDialogueStyle::Get()->GetStyleSetName() // Icon Style Set\n\t\t\t)\n\t{\n\t}\n\n\t//\n\t// TCommand<> interface\n\t//\n\tvoid RegisterCommands() override;\n\npublic:\n\t// Reloads the dialogue data from the .dlg text file that match the name of this dialogue\n\tTSharedPtr<FUICommandInfo> DialogueReloadData;\n\n\t// Shows the primary/secondary edges\n\tTSharedPtr<FUICommandInfo> ToggleShowPrimarySecondaryEdges;\n\n\t// Draw the primary edges\n\tTSharedPtr<FUICommandInfo> ToggleDrawPrimaryEdges;\n\n\t// Draw the secondary edges\n\tTSharedPtr<FUICommandInfo> ToggleDrawSecondaryEdges;\n\n\t// Converts a speech sequence node to a list of speech node\n\tTSharedPtr<FUICommandInfo> ConvertSpeechSequenceNodeToSpeechNodes;\n\n\t// Converts  a list of speech nodes a speech sequence node\n\tTSharedPtr<FUICommandInfo> ConvertSpeechNodesToSpeechSequence;\n\n\t// Saves all the dialogues\n\tTSharedPtr<FUICommandInfo> SaveAllDialogues;\n\n\t// Delete all the dialogues text files\n\tTSharedPtr<FUICommandInfo> DeleteAllDialoguesTextFiles;\n\n\t// Delete all the text files for the CURRENT Dialogue\n\tTSharedPtr<FUICommandInfo> DeleteCurrentDialogueTextFiles;\n\n\t// External links\n\tTSharedPtr<FUICommandInfo> OpenNotYetPlugins;\n\tTSharedPtr<FUICommandInfo> OpenMarketplace;\n\tTSharedPtr<FUICommandInfo> OpenWiki;\n\tTSharedPtr<FUICommandInfo> OpenDiscord;\n\tTSharedPtr<FUICommandInfo> OpenForum;\n\n\t// Open find in ALL Dialogues search window\n\tTSharedPtr<FUICommandInfo> FindInAllDialogues;\n\n\t// Open find in current Dialogue tab\n\tTSharedPtr<FUICommandInfo> FindInDialogue;\n\n\t// Hide Selected Node\n\tTSharedPtr<FUICommandInfo> HideNodes;\n\n\t// UnHide all nodes\n\tTSharedPtr<FUICommandInfo> UnHideAllNodes;\n};\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystemEditor/Private/DialogueContentBrowserExtensions.cpp",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#include \"DialogueContentBrowserExtensions.h\"\n\n#include \"ContentBrowserModule.h\"\n#include \"DlgConstants.h\"\n#include \"DlgEventCustom.h\"\n#include \"Engine/Blueprint.h\"\n\n#include \"DlgManager.h\"\n#include \"DlgSystemEditorModule.h\"\n\n#define LOCTEXT_NAMESPACE \"DialogueSystemContentBrowserExtensions\"\n\n\n// //////////////////////////////////////////////////////////////////////////\n// // A filter that searches for Dialogues\n// // We use this because it allows us more flexibility FAssetTypeActions_DlgDialogue\n// // NOTE: Because this is a frontend filter we can't combine it with the other backend filters (blueprint, texture, particles, etc)\n// // Unreal does not allow you to have custom backend filters, which is kinda retarded\n// class FFrontendFilter_Dialogue : public FFrontendFilter\n// {\n// public:\n//     FFrontendFilter_Dialogue(const TSharedPtr<FFrontendFilterCategory>& InCategory)\n//         : FFrontendFilter(InCategory)\n//     {\n//     }\n//\n// \t//\n// \t// FFrontendFilter implementation\n// \t//\n//\n// \tFString GetName() const override\n//     {\n//     \treturn TEXT(\"Dialogue\");\n//     }\n// \tFText GetDisplayName() const override\n//     {\n//     \treturn LOCTEXT(\"FilterDialogue_Name\", \"Dialogue\");\n//     }\n// \tFText GetToolTipText() const override\n//     {\n//     \treturn LOCTEXT(\"FilterDialogue_ToolTip\", \"Filter By Dialogue\");\n//     }\n//\n// \tFLinearColor GetColor() const override  { return FLinearColor::Yellow; }\n// \tFName GetIconName() const override { return NAME_None; }\n//\n// \tvoid SetCurrentFilter(const FARFilter& InBaseFilter) override\n//     {\n//\n//     }\n//\n// \t//\n// \t// IFilter implementation\n// \t//\n//\n// \t/** Returns whether the specified Item passes the Filter's restrictions */\n// \tbool PassesFilter(FAssetFilterType InItem) const override\n//     {\n//     \treturn InItem.GetClass() == UDlgDialogue::StaticClass();\n//     }\n// };\n\n//////////////////////////////////////////////////////////////////////////\n// A filter that search for blueprints that have implemented the Dialogue Participant\nclass FFrontendFilter_DialogueParticipants : public FFrontendFilter\n{\npublic:\n\tFFrontendFilter_DialogueParticipants(const TSharedPtr<FFrontendFilterCategory>& InCategory)\n\t\t: FFrontendFilter(InCategory)\n\t{\n\t}\n\n\t//\n\t// FFrontendFilter implementation\n\t//\n\n\tFString GetName() const override\n\t{\n\t\treturn TEXT(\"Dialogue Participant Filter\");\n\t}\n\tFText GetDisplayName() const override\n\t{\n\t\treturn LOCTEXT(\"FilterDialogueParticipants_Name\", \"Dialogue Participant\");\n\t}\n\tFText GetToolTipText() const override\n\t{\n\t\treturn LOCTEXT(\"FilterDialogueParticipants_ToolTip\", \"Search for any Blueprints that implement the Dialogue Participant Interface\");\n\t}\n\n\tFLinearColor GetColor() const override  { return FLinearColor(0.91f, 0.91f, 0.f); }\n\tFName GetIconName() const override { return NAME_None; }\n\n\tvoid SetCurrentFilter(const FARFilter& InBaseFilter) override\n\t{\n\n\t}\n\n\t//\n\t// IFilter implementation\n\t//\n\n\t/** Returns whether the specified Item passes the Filter's restrictions */\n\tbool PassesFilter(FAssetFilterType InItem) const override\n\t{\n\t\tif (!InItem.IsAssetLoaded())\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\tif (const UObject* Object = InItem.GetAsset())\n\t\t{\n\t\t\treturn UDlgManager::DoesObjectImplementDialogueParticipantInterface(Object);\n\t\t}\n\n\t\treturn false;\n\t}\n};\n\n// //////////////////////////////////////////////////////////////////////////\n// // A filter that search for Custom Events\n// class FFrontendFilter_DialogueCustomEvent : public FFrontendFilter\n// {\n// public:\n//     FFrontendFilter_DialogueCustomEvent(const TSharedPtr<FFrontendFilterCategory>& InCategory)\n//         : FFrontendFilter(InCategory)\n//     {\n//     }\n//\n// \t//\n// \t// FFrontendFilter implementation\n// \t//\n//\n// \tFString GetName() const override\n//     {\n//     \treturn TEXT(\"Dialogue Custom Event\");\n//     }\n// \tFText GetDisplayName() const override\n//     {\n//     \treturn LOCTEXT(\"FilterDialogueCustomEvent_Name\", \"Dialogue Custom Event\");\n//     }\n// \tFText GetToolTipText() const override\n//     {\n//     \treturn LOCTEXT(\"FilterDialogueCustomEvent__ToolTip\", \"Search for any Blueprints that is a Dialogue Custom Event\");\n//     }\n//\n// \t// Orange\n// \tFLinearColor GetColor() const override  { return FLinearColor(1.f, 0.46f, 0.f); }\n// \tFName GetIconName() const override { return NAME_None; }\n//\n// \tvoid SetCurrentFilter(const FARFilter& InBaseFilter) override\n//     {\n//\n//     }\n//\n// \t//\n// \t// IFilter implementation\n// \t//\n//\n// \t/** Returns whether the specified Item passes the Filter's restrictions */\n// \tbool PassesFilter(FAssetFilterType InItem) const override\n//     {\n//     \tif (!InItem.IsAssetLoaded())\n//     \t{\n//     \t\treturn false;\n//     \t}\n//\n//     \tif (const UObject* Object = InItem.GetAsset())\n//     \t{\n//     \t\treturn UDlgManager::IsObjectACustomEvent(Object);\n//     \t}\n//\n//     \treturn false;\n//     }\n// };\n//\n// //////////////////////////////////////////////////////////////////////////\n// // A filter that search for Custom Events\n// class FFrontendFilter_DialogueCustomCondition : public FFrontendFilter\n// {\n// public:\n//     FFrontendFilter_DialogueCustomCondition(const TSharedPtr<FFrontendFilterCategory>& InCategory)\n//         : FFrontendFilter(InCategory)\n//     {\n//     }\n//\n// \t//\n// \t// FFrontendFilter implementation\n// \t//\n//\n// \tFString GetName() const override\n//     {\n//     \treturn TEXT(\"Dialogue Custom Condtition\");\n//     }\n// \tFText GetDisplayName() const override\n//     {\n//     \treturn LOCTEXT(\"FilterDialogueCustomCondition_Name\", \"Dialogue Custom Condition\");\n//     }\n// \tFText GetToolTipText() const override\n//     {\n//     \treturn LOCTEXT(\"FilterDialogueCustomCondition_ToolTip\", \"Search for any Blueprints that is a Dialogue Custom Condition\");\n//     }\n//\n// \t// Orange\n// \tFLinearColor GetColor() const override  { return FLinearColor(1.f, 0.46f, 0.f); }\n// \tFName GetIconName() const override { return NAME_None; }\n//\n// \tvoid SetCurrentFilter(const FARFilter& InBaseFilter) override\n//     {\n//\n//     }\n//\n// \t//\n// \t// IFilter implementation\n// \t//\n//\n// \t/** Returns whether the specified Item passes the Filter's restrictions */\n// \tbool PassesFilter(FAssetFilterType InItem) const override\n//     {\n//     \tif (!InItem.IsAssetLoaded())\n//     \t{\n//     \t\treturn false;\n//     \t}\n//\n//     \tif (const UObject* Object = InItem.GetAsset())\n//     \t{\n//     \t\treturn UDlgManager::IsObjectACustomCondition(Object);\n//     \t}\n//\n//     \treturn false;\n//     }\n// };\n//\n// //////////////////////////////////////////////////////////////////////////\n// // A filter that search for Custom Text Argument\n// class FFrontendFilter_DialogueCustomTextArgument : public FFrontendFilter\n// {\n// public:\n//     FFrontendFilter_DialogueCustomTextArgument(const TSharedPtr<FFrontendFilterCategory>& InCategory)\n//         : FFrontendFilter(InCategory)\n//     {\n//     }\n//\n// \t//\n// \t// FFrontendFilter implementation\n// \t//\n//\n// \tFString GetName() const override\n//     {\n//     \treturn TEXT(\"Dialogue Custom Text Argument\");\n//     }\n// \tFText GetDisplayName() const override\n//     {\n//     \treturn LOCTEXT(\"FilterDialogueCustomTextArgument_Name\", \"Dialogue Custom Text Argument\");\n//     }\n// \tFText GetToolTipText() const override\n//     {\n//     \treturn LOCTEXT(\"FilterDialogueCustomTextArgument_ToolTip\", \"Search for any Blueprints that is a Dialogue Custom Text Argument\");\n//     }\n//\n// \t// Orange\n// \tFLinearColor GetColor() const override  { return FLinearColor(1.f, 0.46f, 0.f); }\n// \tFName GetIconName() const override { return NAME_None; }\n//\n// \tvoid SetCurrentFilter(const FARFilter& InBaseFilter) override\n//     {\n//\n//     }\n//\n// \t//\n// \t// IFilter implementation\n// \t//\n//\n// \t/** Returns whether the specified Item passes the Filter's restrictions */\n// \tbool PassesFilter(FAssetFilterType InItem) const override\n//     {\n//     \tif (!InItem.IsAssetLoaded())\n//     \t{\n//     \t\treturn false;\n//     \t}\n//\n//     \tif (const UObject* Object = InItem.GetAsset())\n//     \t{\n//     \t\treturn UDlgManager::IsObjectACustomTextArgument(Object);\n//     \t}\n//\n//     \treturn false;\n//     }\n// };\n\n//////////////////////////////////////////////////////////////////////////\n// UDialogueSearchFilter\nvoid UDialogueSearchFilter::AddFrontEndFilterExtensions(\n\tTSharedPtr<FFrontendFilterCategory> DefaultCategory,\n\tTArray<TSharedRef<FFrontendFilter>>& InOutFilterList\n) const\n{\n\t// TSharedPtr<FFrontendFilterCategory> DialogueCategory = MakeShared<FFrontendFilterCategory>(\n\t// \tLOCTEXT(\"DlgSystemCategoryName\", \"Dialogue System Filters\"),\n\t// \tLOCTEXT(\"DlgSystemCategoryTooltip\", \"Filter Dialogue System assets\")\n\t// );\n\tTSharedPtr<FFrontendFilterCategory> DialogueCategory = MakeShared<FFrontendFilterCategory>(\n\t     FText::FromName(OTHER_DIALOGUE_SYSTEM_MENU_CATEGORY_KEY),\n\t     OTHER_DIALOGUE_SYSTEM_MENU_CATEGORY_KEY_TEXT\n\t);\n\n\t// NOTE: we can't combine these with multiple filters\n\t// InOutFilterList.Add(MakeShared<FFrontendFilter_Dialogue>(DialogueCategory));\n\tInOutFilterList.Add(MakeShared<FFrontendFilter_DialogueParticipants>(DialogueCategory));\n\t//InOutFilterList.Add(MakeShared<FFrontendFilter_DialogueCustomEvent>(DialogueCategory));\n\t//InOutFilterList.Add(MakeShared<FFrontendFilter_DialogueCustomCondition>(DialogueCategory));\n\t//InOutFilterList.Add(MakeShared<FFrontendFilter_DialogueCustomTextArgument>(DialogueCategory));\n}\n\n\n//////////////////////////////////////////////////////////////////////////\n// FDialogueContentBrowserExtensions\nvoid FDialogueContentBrowserExtensions::InstallHooks()\n{\n\n}\n\nvoid FDialogueContentBrowserExtensions::RemoveHooks()\n{\n\n}\n\n#undef LOCTEXT_NAMESPACE\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystemEditor/Private/DialogueContentBrowserExtensions.h",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#pragma once\n\n#include \"CoreMinimal.h\"\n#include \"ContentBrowserFrontEndFilterExtension.h\"\n\n#include \"DialogueContentBrowserExtensions.generated.h\"\n\n/**\n * Register custom  filters with the content browser\n */\nUCLASS()\nclass UDialogueSearchFilter : public UContentBrowserFrontEndFilterExtension\n{\npublic:\n\tGENERATED_BODY()\n\n\t// UContentBrowserFrontEndFilterExtension interface\n\tvoid AddFrontEndFilterExtensions(\n\t\tTSharedPtr<FFrontendFilterCategory> DefaultCategory,\n\t\tTArray<TSharedRef<FFrontendFilter>>& InOutFilterList\n\t) const override;\n};\n\n/**\n * Integrate DlgSystem actions associated with existing engine types (e.g., DlgSystem) into the content browser.\n * When you right click on a specific asset for example.\n * See Paper2D class for proper example FPaperContentBrowserExtensions\n */\nclass FDialogueContentBrowserExtensions\n{\npublic:\n\tstatic void InstallHooks();\n\tstatic void RemoveHooks();\n};\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystemEditor/Private/DialogueEditor/DetailsPanel/DialogueCondition_Details.cpp",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#include \"DialogueCondition_Details.h\"\n\n#include \"IDetailPropertyRow.h\"\n#include \"IDetailChildrenBuilder.h\"\n\n#include \"Nodes/DlgNode.h\"\n#include \"NYReflectionHelper.h\"\n#include \"DialogueDetailsPanelUtils.h\"\n#include \"DialogueEditor/Nodes/DialogueGraphNode.h\"\n#include \"Widgets/SDialogueTextPropertyPickList.h\"\n#include \"IPropertyUtilities.h\"\n#include \"Widgets/DialogueTextPropertyPickList_CustomRowHelper.h\"\n#include \"DlgHelper.h\"\n#include \"Widgets/DialogueEnumTypeWithObject_CustomRowHelper.h\"\n#include \"Widgets/DialogueIntTextBox_CustomRowHelper.h\"\n#include \"Widgets/DialogueObject_CustomRowHelper.h\"\n\n#define LOCTEXT_NAMESPACE \"DialogueCondition_Details\"\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// FDialogueCondition_Details\nvoid FDialogueCondition_Details::CustomizeHeader(TSharedRef<IPropertyHandle> InStructPropertyHandle,\n\tFDetailWidgetRow& HeaderRow, IPropertyTypeCustomizationUtils& StructCustomizationUtils)\n{\n\tStructPropertyHandle = InStructPropertyHandle;\n\tDialogue = FDialogueDetailsPanelUtils::GetDialogueFromPropertyHandle(StructPropertyHandle.ToSharedRef());\n\tPropertyUtils = StructCustomizationUtils.GetPropertyUtilities();\n\n\t// Cache the Property Handle for some properties\n\tParticipantNamePropertyHandle = StructPropertyHandle->GetChildHandle(GET_MEMBER_NAME_CHECKED(FDlgCondition, ParticipantName));\n\tOtherParticipantNamePropertyHandle = StructPropertyHandle->GetChildHandle(GET_MEMBER_NAME_CHECKED(FDlgCondition, OtherParticipantName));\n\tConditionTypePropertyHandle = StructPropertyHandle->GetChildHandle(GET_MEMBER_NAME_CHECKED(FDlgCondition, ConditionType));\n\tCompareTypePropertyHandle = StructPropertyHandle->GetChildHandle(GET_MEMBER_NAME_CHECKED(FDlgCondition, CompareType));\n\tIntValuePropertyHandle = StructPropertyHandle->GetChildHandle(GET_MEMBER_NAME_CHECKED(FDlgCondition, IntValue));\n\tcheck(ParticipantNamePropertyHandle.IsValid());\n\tcheck(OtherParticipantNamePropertyHandle.IsValid());\n\tcheck(ConditionTypePropertyHandle.IsValid());\n\tcheck(CompareTypePropertyHandle.IsValid());\n\tcheck(IntValuePropertyHandle.IsValid());\n\n\t// Register handler properties changes\n\tConditionTypePropertyHandle->SetOnPropertyValueChanged(FSimpleDelegate::CreateSP(this, &Self::OnConditionTypeChanged, true));\n\tCompareTypePropertyHandle->SetOnPropertyValueChanged(FSimpleDelegate::CreateSP(this, &Self::OnCompareTypeChanged, true));\n\n\tconst bool bShowOnlyInnerProperties = StructPropertyHandle->GetProperty()->HasMetaData(META_ShowOnlyInnerProperties);\n\tif (!bShowOnlyInnerProperties)\n\t{\n\t\tHeaderRow.NameContent()\n\t\t\t[\n\t\t\t\tStructPropertyHandle->CreatePropertyNameWidget()\n\t\t\t];\n\t}\n}\n\nvoid FDialogueCondition_Details::CustomizeChildren(\n\tTSharedRef<IPropertyHandle> InStructPropertyHandle,\n\tIDetailChildrenBuilder& StructBuilder,\n\tIPropertyTypeCustomizationUtils& StructCustomizationUtils\n)\n{\n\tconst bool bHasDialogue = Dialogue != nullptr;\n\n\t// Add common ConditionStrength, ConditionType\n\tStructBuilder.AddProperty(StructPropertyHandle->GetChildHandle(GET_MEMBER_NAME_CHECKED(FDlgCondition, Strength)).ToSharedRef());\n\n\t// ConditionType\n\t{\n\t\tConditionTypePropertyRow = &StructBuilder.AddProperty(ConditionTypePropertyHandle.ToSharedRef());\n\n\t\t// Add Custom buttons\n\t\tConditionTypePropertyRow_CustomDisplay = MakeShared<FDialogueEnumTypeWithObject_CustomRowHelper>(\n\t\t\tConditionTypePropertyRow,\n\t\t\tDialogue,\n\t\t\tParticipantNamePropertyHandle\n\t\t);\n\t\tConditionTypePropertyRow_CustomDisplay->SetEnumType(EDialogueEnumWithObjectType::Condition);\n\t\tConditionTypePropertyRow_CustomDisplay->Update();\n\t}\n\n\t// ParticipantName\n\t{\n\t\tFDetailWidgetRow* DetailWidgetRow = &StructBuilder.AddCustomRow(LOCTEXT(\"ParticipantNameSearchKey\", \"Participant Name\"));\n\n\t\tParticipantNamePropertyRow = MakeShared<FDialogueTextPropertyPickList_CustomRowHelper>(DetailWidgetRow, ParticipantNamePropertyHandle);\n\t\tParticipantNamePropertyRow->SetTextPropertyPickListWidget(\n\t\t\tSNew(SDialogueTextPropertyPickList)\n\t\t\t.IsEnabled(InStructPropertyHandle->IsEditable())\n\t\t\t.AvailableSuggestions(this, &Self::GetAllDialoguesParticipantNames)\n\t\t\t.OnTextCommitted(this, &Self::HandleTextCommitted)\n\t\t\t.HasContextCheckbox(bHasDialogue)\n\t\t\t.IsContextCheckBoxChecked(true)\n\t\t\t.CurrentContextAvailableSuggestions(this, &Self::GetCurrentDialogueParticipantNames)\n\t\t)\n\t\t.SetVisibility(CREATE_VISIBILITY_CALLBACK(&Self::GetParticipantNameVisibility))\n\t\t.Update();\n\t}\n\n\t// CallbackName (variable name)\n\t{\n\t\tconst TSharedPtr<IPropertyHandle> CallbackNamePropertyHandle =\n\t\t\tStructPropertyHandle->GetChildHandle(GET_MEMBER_NAME_CHECKED(FDlgCondition, CallbackName));\n\t\tFDetailWidgetRow* DetailWidgetRow = &StructBuilder.AddCustomRow(LOCTEXT(\"CallBackNameSearchKey\", \"Variable Name\"));\n\n\t\tCallbackNamePropertyRow = MakeShared<FDialogueTextPropertyPickList_CustomRowHelper>(DetailWidgetRow, CallbackNamePropertyHandle);\n\t\tCallbackNamePropertyRow->SetTextPropertyPickListWidget(\n\t\t\tSNew(SDialogueTextPropertyPickList)\n\t\t\t.IsEnabled(InStructPropertyHandle->IsEditable())\n\t\t\t.AvailableSuggestions(this, &Self::GetAllDialoguesCallbackNames)\n\t\t\t.OnTextCommitted(this, &Self::HandleTextCommitted)\n\t\t\t.HasContextCheckbox(bHasDialogue)\n\t\t\t.IsContextCheckBoxChecked(false)\n\t\t\t.CurrentContextAvailableSuggestions(this, &Self::GetCurrentDialogueCallbackNames)\n\t\t)\n\t\t.SetVisibility(CREATE_VISIBILITY_CALLBACK(&Self::GetCallbackNameVisibility))\n\t\t.Update();\n\t}\n\n\t// Operation\n\t{\n\t\tOperationPropertyRow = &StructBuilder.AddProperty(\n\t\t\tStructPropertyHandle->GetChildHandle(GET_MEMBER_NAME_CHECKED(FDlgCondition, Operation)).ToSharedRef()\n\t\t);\n\t\tOperationPropertyRow->Visibility(CREATE_VISIBILITY_CALLBACK(&Self::GetOperationVisibility));\n\t}\n\n\t// CompareType\n\t{\n\t\tCompareTypePropertyRow = &StructBuilder.AddProperty(\n\t\t\tStructPropertyHandle->GetChildHandle(GET_MEMBER_NAME_CHECKED(FDlgCondition, CompareType)).ToSharedRef()\n\t\t);\n\t\tCompareTypePropertyRow->Visibility(CREATE_VISIBILITY_CALLBACK(&Self::GetCompareTypeVisibility));\n\t}\n\n\t// OtherParticipantName\n\t{\n\t\tFDetailWidgetRow* DetailWidgetRow = &StructBuilder.AddCustomRow(LOCTEXT(\"ParticipantNameSearchKey\", \"Participant Name\"));\n\n\t\tParticipantNamePropertyRow = MakeShared<FDialogueTextPropertyPickList_CustomRowHelper>(DetailWidgetRow, OtherParticipantNamePropertyHandle);\n\t\tParticipantNamePropertyRow->SetTextPropertyPickListWidget(\n\t\t\tSNew(SDialogueTextPropertyPickList)\n\t\t\t.IsEnabled(InStructPropertyHandle->IsEditable())\n\t\t\t.AvailableSuggestions(this, &Self::GetAllDialoguesParticipantNames)\n\t\t\t.OnTextCommitted(this, &Self::HandleTextCommitted)\n\t\t\t.HasContextCheckbox(true)\n\t\t\t.IsContextCheckBoxChecked(true)\n\t\t\t.CurrentContextAvailableSuggestions(this, &Self::GetCurrentDialogueParticipantNames)\n\t\t)\n\t\t.SetVisibility(CREATE_VISIBILITY_CALLBACK(&Self::GetOtherParticipantNameAndVariableVisibility))\n\t\t.Update();\n\t}\n\n\t// Other variable name\n\t{\n\t\tconst TSharedPtr<IPropertyHandle> CallbackNamePropertyHandle =\n\t\t\tStructPropertyHandle->GetChildHandle(GET_MEMBER_NAME_CHECKED(FDlgCondition, OtherVariableName));\n\t\tFDetailWidgetRow* DetailWidgetRow = &StructBuilder.AddCustomRow(LOCTEXT(\"CallBackNameSearchKey\", \"Variable Name\"));\n\n\t\tOtherVariableNamePropertyRow = MakeShared<FDialogueTextPropertyPickList_CustomRowHelper>(DetailWidgetRow, CallbackNamePropertyHandle);\n\t\tOtherVariableNamePropertyRow->SetTextPropertyPickListWidget(\n\t\t\tSNew(SDialogueTextPropertyPickList)\n\t\t\t.IsEnabled(InStructPropertyHandle->IsEditable())\n\t\t\t.AvailableSuggestions(this, &Self::GetAllDialoguesOtherVariableNames)\n\t\t\t.OnTextCommitted(this, &Self::HandleTextCommitted)\n\t\t\t.HasContextCheckbox(true)\n\t\t\t.IsContextCheckBoxChecked(false)\n\t\t\t.CurrentContextAvailableSuggestions(this, &Self::GetCurrentDialogueOtherVariableNames)\n\t\t)\n\t\t.SetVisibility(CREATE_VISIBILITY_CALLBACK(&Self::GetOtherParticipantNameAndVariableVisibility))\n\t\t.Update();\n\t}\n\n\n\t// IntValue\n\t{\n\t\tFDetailWidgetRow* DetailWidgetRow = &StructBuilder.AddCustomRow(LOCTEXT(\"IntValueSearchKey\", \"Int Value\"));\n\t\tIntValuePropertyRow = MakeShared<FDialogueIntTextBox_CustomRowHelper>(DetailWidgetRow, IntValuePropertyHandle, Dialogue);\n\t\tIntValuePropertyRow->SetVisibility(CREATE_VISIBILITY_CALLBACK(&Self::GetIntValueVisibility));\n\t\tIntValuePropertyRow->SetJumpToNodeVisibility(CREATE_VISIBILITY_CALLBACK(&Self::GetGUIDVisibility));\n\t\tIntValuePropertyRow->Update();\n\t}\n\n\t// FloatValue\n\t{\n\t\tFloatValuePropertyRow = &StructBuilder.AddProperty(\n\t\t\tStructPropertyHandle->GetChildHandle(GET_MEMBER_NAME_CHECKED(FDlgCondition, FloatValue)).ToSharedRef()\n\t\t);\n\t\tFloatValuePropertyRow->Visibility(CREATE_VISIBILITY_CALLBACK(&Self::GetFloatValueVisibility));\n\t}\n\n\t// NameValue\n\t{\n\t\tNameValuePropertyRow = &StructBuilder.AddProperty(\n\t\t\tStructPropertyHandle->GetChildHandle(GET_MEMBER_NAME_CHECKED(FDlgCondition, NameValue)).ToSharedRef()\n\t\t);\n\t\tNameValuePropertyRow->Visibility(CREATE_VISIBILITY_CALLBACK(&Self::GetNameValueVisibility));\n\t}\n\n\t// bBoolValue\n\t{\n\t\tBoolValuePropertyRow = &StructBuilder.AddProperty(\n\t\t\tStructPropertyHandle->GetChildHandle(GET_MEMBER_NAME_CHECKED(FDlgCondition, bBoolValue)).ToSharedRef()\n\t\t);\n\t\tBoolValuePropertyRow->Visibility(CREATE_VISIBILITY_CALLBACK(&Self::GetBoolValueVisibility));\n\t}\n\n\t// bLongTermMemory\n\t{\n\t\tLongTermMemoryPropertyRow = &StructBuilder.AddProperty(\n\t\t\tStructPropertyHandle->GetChildHandle(GET_MEMBER_NAME_CHECKED(FDlgCondition, bLongTermMemory)).ToSharedRef()\n\t\t);\n\t\tLongTermMemoryPropertyRow->Visibility(CREATE_VISIBILITY_CALLBACK(&Self::GetLongTermMemoryVisibility));\n\t}\n\n\t// GUID\n\t{\n\t\tGUIDPropertyRow = &StructBuilder.AddProperty(\n\t\t\tStructPropertyHandle->GetChildHandle(GET_MEMBER_NAME_CHECKED(FDlgCondition, GUID)).ToSharedRef()\n\t\t);\n\t\tGUIDPropertyRow->Visibility(CREATE_VISIBILITY_CALLBACK(&Self::GetGUIDVisibility));\n\t}\n\n\t// CustomCondition\n\t{\n\t\tCustomConditionPropertyRow = &StructBuilder.AddProperty(\n\t\t\tStructPropertyHandle->GetChildHandle(GET_MEMBER_NAME_CHECKED(FDlgCondition, CustomCondition)).ToSharedRef()\n\t\t);\n\t\tCustomConditionPropertyRow->Visibility(CREATE_VISIBILITY_CALLBACK(&Self::GetCustomConditionVisibility));\n\n\t\t// Add Custom buttons\n\t\tCustomConditionPropertyRow_CustomDisplay = MakeShared<FDialogueObject_CustomRowHelper>(CustomConditionPropertyRow);\n\t\tCustomConditionPropertyRow_CustomDisplay->Update();\n\t\tCustomConditionPropertyRow_CustomDisplay->SetFunctionNameToOpen(\n\t\t\tEDialogueBlueprintOpenType::Function,\n\t\t\tGET_FUNCTION_NAME_CHECKED(UDlgConditionCustom, IsConditionMet)\n\t\t);\n\t}\n\n\t// Cache the initial values\n\tOnCompareTypeChanged(false);\n\tOnConditionTypeChanged(false);\n}\n\nvoid FDialogueCondition_Details::OnConditionTypeChanged(bool bForceRefresh)\n{\n\t// Update to the new type\n\tuint8 Value = 0;\n\tif (ConditionTypePropertyHandle->GetValue(Value) != FPropertyAccess::Success)\n\t{\n\t\treturn;\n\t}\n\tConditionType = static_cast<EDlgConditionType>(Value);\n\n\t// Update the display names/tooltips\n\tFText CallBackNameDisplayName = LOCTEXT(\"CallBackNameDisplayName\", \"Variable Name\");\n\tFText CallBackNameToolTip = LOCTEXT(\"CallBackNameToolTip\", \"The name of the checked variable\");\n\tFText BoolValueDisplayName = LOCTEXT(\"BoolValueDisplayName\", \"Return Value\");\n\tFText BoolValueToolTip = LOCTEXT(\"BoolValueToolTip\", \"SHOULD NOT BE VISIBLE\");\n\t// TODO remove the \"equal\" operations for float values as they are imprecise\n\tFText FloatValueToolTip = LOCTEXT(\n\t\t\"FloatValueToolTip\",\n\t\t\"The float value the VariableName is checked against (depending on the operation).\\n\"\n\t\t\"VariableName <Operation> FloatValue\"\n\t);\n\tFText IntValueDisplayName = LOCTEXT(\"IntValueDisplayName\", \"Int Value\");\n\tFText IntValueToolTip = LOCTEXT(\n\t\t\"IntValueToolTip\",\n\t\t\"The int value the VariableName is checked against (depending on the operation).\\n\"\n\t\t\"VariableName <Operation> IntValue\"\n\t);\n\tFText GUIDDisplayName = LOCTEXT(\"GUIDDisplayName\", \"Node GUID\");\n\tFText GUIDToolTip = LOCTEXT(\n\t\t\"GUIDToolTip\",\n\t\t\"The Corresponding GUID of the Node Index. (Set On Compile)\"\n\t);\n\n\tFDialogueDetailsPanelUtils::ResetNumericPropertyLimits(IntValuePropertyHandle);\n\tswitch (ConditionType)\n\t{\n\tcase EDlgConditionType::EventCall:\n\t\tCallBackNameDisplayName = LOCTEXT(\"ConditionEvent_CallBackNameDisplayName\", \"Condition Name\");\n\t\tCallBackNameToolTip = LOCTEXT(\"ConditionEvent_CallBackNameToolTip\", \"Name parameter of the event call the participant gets\");\n\t\tBoolValueToolTip = LOCTEXT(\"ConditionEvent_BoolValueToolTip\", \"Does the return result of the Event/Condition has this boolean value?\");\n\t\tbreak;\n\n\tcase EDlgConditionType::BoolCall:\n\tcase EDlgConditionType::ClassBoolVariable:\n\t\tBoolValueToolTip = LOCTEXT(\"ConditionBool_BoolValueToolTip\", \"Whether the bool check is expected to be true or false in order to satisfy the condition\");\n\t\tbreak;\n\n\tcase EDlgConditionType::NameCall:\n\tcase EDlgConditionType::ClassNameVariable:\n\t\tBoolValueToolTip = LOCTEXT(\"ConditionBool_BoolValueToolTip\", \"Whether the two Name is expected to be equal or not in order to satisfy the condition\");\n\t\tBoolValueDisplayName = LOCTEXT(\"BoolValueDisplayName\", \"Succeed on Equal\");\n\t\tbreak;\n\n\tcase EDlgConditionType::FloatCall:\n\tcase EDlgConditionType::ClassFloatVariable:\n\t\tbreak;\n\n\tcase EDlgConditionType::IntCall:\n\tcase EDlgConditionType::ClassIntVariable:\n\t\tbreak;\n\n\tcase EDlgConditionType::WasNodeVisited:\n\t\tif (Dialogue)\n\t\t{\n\t\t\tFDialogueDetailsPanelUtils::SetNumericPropertyLimits<int32>(IntValuePropertyHandle, 0, Dialogue->GetNodes().Num() - 1);\n\t\t}\n\n\t\tIntValueDisplayName = LOCTEXT(\"ConditionNodeVisited_IntValueDisplayName\", \"Node Index\");\n\t\tIntValueToolTip = LOCTEXT(\"ConditionNodeVisited_IntValueToolTip\", \"Node index of the node we want to check the visited status\");\n\t\tBoolValueDisplayName = LOCTEXT(\"ConditionNodeVisited_BoolValueDisplayName\", \"Is Node Visited?\");\n\t\tBoolValueToolTip = LOCTEXT(\"ConditionNodeVisited_BoolValueToolTip\", \"Should the node be visited? True/False.\");\n\t\tbreak;\n\n\tcase EDlgConditionType::HasSatisfiedChild:\n\t\tif (Dialogue)\n\t\t{\n\t\t\tFDialogueDetailsPanelUtils::SetNumericPropertyLimits<int32>(IntValuePropertyHandle, 0, Dialogue->GetNodes().Num() - 1);\n\t\t}\n\n\t\tIntValueDisplayName = LOCTEXT(\"ConditionHasSatisfiedChild_IntValueDisplayName\", \"Node Index\");\n\t\tIntValueToolTip = LOCTEXT(\"ConditionHasSatisfiedChild_IntValueToolTip\", \"Node index of the node we want to check\");\n\t\tBoolValueDisplayName = LOCTEXT(\"ConditionHasSatisfiedChild_BoolValueDisplayName\", \"Has?\");\n\t\tBoolValueToolTip = LOCTEXT(\"ConditionHasSatisfiedChild_BoolValueToolTip\", \"Should the node have satisfied child(ren)?\");\n\t\tbreak;\n\n\tcase EDlgConditionType::Custom:\n\t\tbreak;\n\n\tdefault:\n\t\tcheckNoEntry();\n\t}\n\n\tCallbackNamePropertyRow->SetDisplayName(CallBackNameDisplayName)\n\t\t.SetToolTip(CallBackNameToolTip)\n\t\t.Update();\n\n\tBoolValuePropertyRow->DisplayName(BoolValueDisplayName);\n\tBoolValuePropertyRow->ToolTip(BoolValueToolTip);\n\n\tIntValuePropertyRow->SetDisplayName(IntValueDisplayName);\n\tIntValuePropertyRow->SetToolTip(IntValueToolTip);\n\tIntValuePropertyRow->Update();\n\tFloatValuePropertyRow->ToolTip(FloatValueToolTip);\n\n\tGUIDPropertyRow->DisplayName(GUIDDisplayName);\n\tGUIDPropertyRow->ToolTip(GUIDToolTip);\n\n\t// Refresh the view, without this some names/tooltips won't get refreshed\n\tif (bForceRefresh && PropertyUtils.IsValid())\n\t{\n\t\tPropertyUtils->ForceRefresh();\n\t}\n}\n\nvoid FDialogueCondition_Details::OnCompareTypeChanged(bool bForceRefresh)\n{\n\tuint8 Value = 0;\n\tif (CompareTypePropertyHandle->GetValue(Value) != FPropertyAccess::Success)\n\t{\n\t\treturn;\n\t}\n\tCompareType = static_cast<EDlgCompare>(Value);\n\n\t// Refresh the view, without this some names/tooltips won't get refreshed\n\tif (bForceRefresh && PropertyUtils.IsValid())\n\t{\n\t\tPropertyUtils->ForceRefresh();\n\t}\n}\n\n/** Gets all the condition name suggestions depending on ConditionType from all Dialogues. */\nTArray<FName> FDialogueCondition_Details::GetCallbackNamesForParticipant(bool bCurrentOnly, bool bOtherValue) const\n{\n\tTArray<FName> Suggestions;\n\tTSet<FName> SuggestionSet;\n\tconst TSharedPtr<IPropertyHandle>& ParticipantHandle = bOtherValue ? OtherParticipantNamePropertyHandle : ParticipantNamePropertyHandle;\n\tconst FName ParticipantName = FDialogueDetailsPanelUtils::GetParticipantNameFromPropertyHandle(ParticipantHandle.ToSharedRef());\n\n\tbool bReflectionBased = false;\n\tif (bOtherValue)\n\t{\n\t\tbReflectionBased = CompareType == EDlgCompare::ToClassVariable;\n\t}\n\telse\n\t{\n\t\tbReflectionBased = ConditionType == EDlgConditionType::ClassBoolVariable\n\t\t\t\t\t\t|| ConditionType == EDlgConditionType::ClassIntVariable\n\t\t\t\t\t\t|| ConditionType == EDlgConditionType::ClassFloatVariable\n\t\t\t\t\t\t|| ConditionType == EDlgConditionType::ClassNameVariable;\n\t}\n\n\tswitch (ConditionType)\n\t{\n\tcase EDlgConditionType::ClassBoolVariable:\n\tcase EDlgConditionType::BoolCall:\n\t\tif (bReflectionBased && Dialogue)\n\t\t{\n\t\t\tFNYReflectionHelper::GetVariableNames(\n\t\t\t\tDialogue->GetParticipantClass(ParticipantName),\n\t\t\t\tFNYBoolProperty::StaticClass(),\n\t\t\t\tSuggestions,\n\t\t\t\tGetDefault<UDlgSystemSettings>()->BlacklistedReflectionClasses\n\t\t\t);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif (bCurrentOnly && Dialogue)\n\t\t\t{\n\t\t\t\tDialogue->GetBoolNames(ParticipantName, SuggestionSet);\n\t\t\t\tSuggestions = SuggestionSet.Array();\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tUDlgManager::GetAllDialoguesBoolNames(ParticipantName, Suggestions);\n\t\t\t}\n\t\t}\n\t\tbreak;\n\n\tcase EDlgConditionType::ClassFloatVariable:\n\tcase EDlgConditionType::FloatCall:\n\t\tif (bReflectionBased && Dialogue)\n\t\t{\n\t\t\tFNYReflectionHelper::GetVariableNames(\n\t\t\t\tDialogue->GetParticipantClass(ParticipantName),\n\t\t\t\tFNYFloatProperty::StaticClass(),\n\t\t\t\tSuggestions,\n\t\t\t\tGetDefault<UDlgSystemSettings>()->BlacklistedReflectionClasses\n\t\t\t);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif (bCurrentOnly && Dialogue)\n\t\t\t{\n\t\t\t\tDialogue->GetFloatNames(ParticipantName, SuggestionSet);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tUDlgManager::GetAllDialoguesFloatNames(ParticipantName, Suggestions);\n\t\t\t}\n\t\t}\n\t\tbreak;\n\n\tcase EDlgConditionType::ClassIntVariable:\n\tcase EDlgConditionType::IntCall:\n\t\tif (bReflectionBased && Dialogue)\n\t\t{\n\t\t\tFNYReflectionHelper::GetVariableNames(\n\t\t\t\tDialogue->GetParticipantClass(ParticipantName),\n\t\t\t\tFNYIntProperty::StaticClass(),\n\t\t\t\tSuggestions,\n\t\t\t\tGetDefault<UDlgSystemSettings>()->BlacklistedReflectionClasses\n\t\t\t);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif (bCurrentOnly && Dialogue)\n\t\t\t{\n\t\t\t\tDialogue->GetIntNames(ParticipantName, SuggestionSet);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tUDlgManager::GetAllDialoguesIntNames(ParticipantName, Suggestions);\n\t\t\t}\n\t\t}\n\t\tbreak;\n\n\tcase EDlgConditionType::NameCall:\n\tcase EDlgConditionType::ClassNameVariable:\n\t\tif (bReflectionBased && Dialogue)\n\t\t{\n\t\t\tFNYReflectionHelper::GetVariableNames(\n\t\t\t\tDialogue->GetParticipantClass(ParticipantName),\n\t\t\t\tFNYNameProperty::StaticClass(),\n\t\t\t\tSuggestions,\n\t\t\t\tGetDefault<UDlgSystemSettings>()->BlacklistedReflectionClasses\n\t\t\t);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif (bCurrentOnly && Dialogue)\n\t\t\t{\n\t\t\t\tDialogue->GetNameNames(ParticipantName, SuggestionSet);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tUDlgManager::GetAllDialoguesNameNames(ParticipantName, Suggestions);\n\t\t\t}\n\t\t}\n\t\tbreak;\n\n\tcase EDlgConditionType::EventCall:\n\tcase EDlgConditionType::WasNodeVisited:\n\tdefault:\n\t\tif (bCurrentOnly && Dialogue)\n\t\t{\n\t\t\tDialogue->GetConditions(ParticipantName, SuggestionSet);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tUDlgManager::GetAllDialoguesConditionNames(ParticipantName, Suggestions);\n\t\t}\n\t\tbreak;\n\t}\n\n\tif (SuggestionSet.Num() > Suggestions.Num())\n\t{\n\t\tSuggestions = SuggestionSet.Array();\n\t}\n\n\tFDlgHelper::SortDefault(Suggestions);\n\treturn Suggestions;\n}\n\n\n#undef LOCTEXT_NAMESPACE\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystemEditor/Private/DialogueEditor/DetailsPanel/DialogueCondition_Details.h",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#pragma once\n\n#include \"IPropertyTypeCustomization.h\"\n#include \"Layout/Visibility.h\"\n#include \"IDetailPropertyRow.h\"\n\n#include \"DlgDialogue.h\"\n#include \"DlgCondition.h\"\n#include \"DlgManager.h\"\n#include \"DialogueDetailsPanelUtils.h\"\n#include \"Widgets/DialogueTextPropertyPickList_CustomRowHelper.h\"\n\nclass FDialogueTextPropertyPickList_CustomRowHelper;\nclass FDialogueIntTextBox_CustomRowHelper;\nclass FDialogueObject_CustomRowHelper;\nclass FDialogueEnumTypeWithObject_CustomRowHelper;\n\n/**\n* How the details panel renders the FDlgCondition\n* See FDlgSystemEditorModule::StartupModule for usage.\n*/\nclass FDialogueCondition_Details : public IPropertyTypeCustomization\n{\n\ttypedef FDialogueCondition_Details Self;\n\npublic:\n\tstatic TSharedRef<IPropertyTypeCustomization> MakeInstance() { return MakeShared<Self>(); }\n\n\t/** IPropertyTypeCustomization interface */\n\t/**\n\t * Called when the header of the property (the row in the details panel where the property is shown)\n\t * If nothing is added to the row, the header is not displayed\n\t *\n\t * @param StructPropertyHandle\t\tHandle to the property being customized\n\t * @param HeaderRow\t\t\t\t\tA row that widgets can be added to\n\t * @param StructCustomizationUtils\tUtilities for customization\n\t */\n\tvoid CustomizeHeader(TSharedRef<IPropertyHandle> StructPropertyHandle,\n\t\tFDetailWidgetRow& HeaderRow,\n\t\tIPropertyTypeCustomizationUtils& StructCustomizationUtils) override;\n\n\t/**\n\t * Called when the children of the property should be customized or extra rows added\n\t *\n\t * @param StructPropertyHandle\t\tHandle to the property being customized\n\t * @param StructBuilder\t\t\t\tA builder for adding children\n\t * @param StructCustomizationUtils\tUtilities for customization\n\t */\n\tvoid CustomizeChildren(TSharedRef<IPropertyHandle> StructPropertyHandle,\n\t\tIDetailChildrenBuilder& StructBuilder,\n\t\tIPropertyTypeCustomizationUtils& StructCustomizationUtils) override;\n\nprivate:\n\t// Called every time the condition type is changed\n\tvoid OnConditionTypeChanged(bool bForceRefresh);\n\n\t// Called every time the compare type is changed\n\tvoid OnCompareTypeChanged(bool bForceRefresh);\n\n\t// Getters for the visibility of some properties\n\tEVisibility GetParticipantNameVisibility() const\n\t{\n\t\treturn ConditionType != EDlgConditionType::WasNodeVisited\n\t\t\t&& ConditionType != EDlgConditionType::HasSatisfiedChild\n\t\t\t? EVisibility::Visible : EVisibility::Hidden;\n\t}\n\n\tEVisibility GetOtherParticipantNameAndVariableVisibility() const\n\t{\n\t\treturn ConditionType != EDlgConditionType::WasNodeVisited\n\t\t\t&& ConditionType != EDlgConditionType::HasSatisfiedChild\n\t\t\t&& CompareType != EDlgCompare::ToConst\n\t\t\t? EVisibility::Visible : EVisibility::Hidden;\n\t}\n\n\tEVisibility GetCallbackNameVisibility() const\n\t{\n\t\treturn ConditionType != EDlgConditionType::WasNodeVisited\n\t\t\t&& ConditionType != EDlgConditionType::HasSatisfiedChild\n\t\t\t&& ConditionType != EDlgConditionType::Custom\n\t\t\t? EVisibility::Visible : EVisibility::Hidden;\n\t}\n\n\tEVisibility GetIntValueVisibility() const\n\t{\n\t\treturn ((CompareType == EDlgCompare::ToConst)\n\t\t\t\t&& (ConditionType == EDlgConditionType::IntCall || ConditionType == EDlgConditionType::ClassIntVariable))\n\t\t\t\t|| ConditionType == EDlgConditionType::WasNodeVisited\n\t\t\t\t|| ConditionType == EDlgConditionType::HasSatisfiedChild\n\t\t\t? EVisibility::Visible : EVisibility::Hidden;\n\t}\n\n\tEVisibility GetFloatValueVisibility() const\n\t{\n\t\treturn (CompareType == EDlgCompare::ToConst) &&\n\t\t\t(ConditionType == EDlgConditionType::FloatCall || ConditionType == EDlgConditionType::ClassFloatVariable)\n\t\t\t? EVisibility::Visible : EVisibility::Hidden;\n\t}\n\n\tEVisibility GetNameValueVisibility() const\n\t{\n\t\treturn(CompareType == EDlgCompare::ToConst) &&\n\t\t\t  (ConditionType == EDlgConditionType::NameCall || ConditionType == EDlgConditionType::ClassNameVariable)\n\t\t\t? EVisibility::Visible : EVisibility::Hidden;\n\t}\n\n\tEVisibility GetBoolValueVisibility() const\n\t{\n\t\treturn ConditionType == EDlgConditionType::EventCall\n\t\t\t|| ConditionType == EDlgConditionType::NameCall\n\t\t\t|| ConditionType == EDlgConditionType::ClassNameVariable\n\t\t\t|| ConditionType == EDlgConditionType::WasNodeVisited\n\t\t\t|| ConditionType == EDlgConditionType::HasSatisfiedChild\n\t\t\t|| ConditionType == EDlgConditionType::BoolCall\n\t\t\t|| ConditionType == EDlgConditionType::ClassBoolVariable\n\t\t\t? EVisibility::Visible : EVisibility::Hidden;\n\t}\n\n\tEVisibility GetLongTermMemoryVisibility() const\n\t{\n\t\treturn ConditionType == EDlgConditionType::WasNodeVisited ? EVisibility::Visible : EVisibility::Hidden;\n\t}\n\n\tEVisibility GetGUIDVisibility() const\n\t{\n\t\treturn ConditionType == EDlgConditionType::WasNodeVisited\n\t\t\t|| ConditionType == EDlgConditionType::HasSatisfiedChild\n\t\t\t? EVisibility::Visible : EVisibility::Hidden;\n\t}\n\n\tEVisibility GetOperationVisibility() const\n\t{\n\t\treturn ConditionType == EDlgConditionType::FloatCall\n\t\t\t|| ConditionType == EDlgConditionType::IntCall\n\t\t\t|| ConditionType == EDlgConditionType::ClassIntVariable\n\t\t\t|| ConditionType == EDlgConditionType::ClassFloatVariable\n\t\t\t? EVisibility::Visible : EVisibility::Hidden;\n\t}\n\n\tEVisibility GetCompareTypeVisibility() const\n\t{\n\t\treturn ConditionType == EDlgConditionType::FloatCall\n\t\t\t|| ConditionType == EDlgConditionType::IntCall\n\t\t\t|| ConditionType == EDlgConditionType::BoolCall\n\t\t\t|| ConditionType == EDlgConditionType::NameCall\n\t\t\t|| ConditionType == EDlgConditionType::ClassIntVariable\n\t\t\t|| ConditionType == EDlgConditionType::ClassFloatVariable\n\t\t\t|| ConditionType == EDlgConditionType::ClassNameVariable\n\t\t\t|| ConditionType == EDlgConditionType::ClassBoolVariable\n\t\t\t? EVisibility::Visible : EVisibility::Hidden;\n\t}\n\n\tEVisibility GetCustomConditionVisibility() const\n\t{\n\t\treturn ConditionType == EDlgConditionType::Custom ? EVisibility::Visible : EVisibility::Hidden;\n\t}\n\n\t// Gets all the condition name suggestions depending on ConditionType from all Dialogues.\n\tTArray<FName> GetAllDialoguesCallbackNames() const\n\t{\n\t\treturn GetCallbackNamesForParticipant(false, false);\n\t}\n\n\t// Gets all the condition name suggestions depending on EventType from the current Dialogue\n\tTArray<FName> GetCurrentDialogueCallbackNames() const\n\t{\n\t\treturn GetCallbackNamesForParticipant(true, false);\n\t}\n\n\tTArray<FName> GetAllDialoguesOtherVariableNames() const\n\t{\n\t\treturn GetCallbackNamesForParticipant(false, true);\n\t}\n\n\tTArray<FName> GetCurrentDialogueOtherVariableNames() const\n\t{\n\t\treturn GetCallbackNamesForParticipant(true, true);\n\t}\n\n\tTArray<FName> GetCallbackNamesForParticipant(bool bCurrentOnly, bool bOtherValue) const;\n\n\t// Gets the ParticipantNames from all Dialogues.\n\tTArray<FName> GetAllDialoguesParticipantNames() const\n\t{\n\t\tTArray<FName> OutArray;\n\t\tUDlgManager::GetAllDialoguesParticipantNames(OutArray);\n\t\treturn OutArray;\n\t}\n\n\t// Gets the current Dialogue Participant Names.\n\tTArray<FName> GetCurrentDialogueParticipantNames() const\n\t{\n\t\treturn FDialogueDetailsPanelUtils::GetDialogueSortedParticipantNames(Dialogue);\n\t}\n\n\t// Handler for when text in the editable text box changed\n\tvoid HandleTextCommitted(const FText& InSearchText, ETextCommit::Type CommitInfo) const\n\t{\n\t\tif (Dialogue)\n\t\t{\n\t\t\tDialogue->UpdateAndRefreshData();\n\t\t}\n\t}\n\nprivate:\n\t// The current Condition type of the struct.\n\tEDlgConditionType ConditionType = EDlgConditionType::EventCall;\n\tEDlgCompare CompareType = EDlgCompare::ToConst;\n\n\t// Cache the Struct property handle\n\tTSharedPtr<IPropertyHandle> StructPropertyHandle;\n\n\t// Cache the property handle of some properties\n\tTSharedPtr<IPropertyHandle> ParticipantNamePropertyHandle;\n\tTSharedPtr<IPropertyHandle> OtherParticipantNamePropertyHandle;\n\tTSharedPtr<IPropertyHandle> ConditionTypePropertyHandle;\n\tTSharedPtr<IPropertyHandle> CompareTypePropertyHandle;\n\tTSharedPtr<IPropertyHandle> IntValuePropertyHandle;\n\n\t// just some nice utilities\n\tTSharedPtr<IPropertyUtilities> PropertyUtils;\n\n\t// Cache the rows of the properties, created in CustomizeChildren\n\tTSharedPtr<FDialogueTextPropertyPickList_CustomRowHelper> ParticipantNamePropertyRow;\n\tTSharedPtr<FDialogueTextPropertyPickList_CustomRowHelper> CallbackNamePropertyRow;\n\tTSharedPtr<FDialogueIntTextBox_CustomRowHelper> IntValuePropertyRow;\n\n\tIDetailPropertyRow* FloatValuePropertyRow = nullptr;\n\tIDetailPropertyRow* NameValuePropertyRow = nullptr;\n\tIDetailPropertyRow* BoolValuePropertyRow = nullptr;\n\tIDetailPropertyRow* LongTermMemoryPropertyRow = nullptr;\n\tIDetailPropertyRow* OperationPropertyRow = nullptr;\n\tIDetailPropertyRow* CompareTypePropertyRow = nullptr;\n\tIDetailPropertyRow* GUIDPropertyRow = nullptr;\n\n\tIDetailPropertyRow* CustomConditionPropertyRow = nullptr;\n\tTSharedPtr<FDialogueObject_CustomRowHelper> CustomConditionPropertyRow_CustomDisplay;\n\n\tIDetailPropertyRow* ConditionTypePropertyRow = nullptr;\n\tTSharedPtr<FDialogueEnumTypeWithObject_CustomRowHelper> ConditionTypePropertyRow_CustomDisplay;\n\n\tTSharedPtr<FDialogueTextPropertyPickList_CustomRowHelper> OtherParticipantNamePropertyRow;\n\tTSharedPtr<FDialogueTextPropertyPickList_CustomRowHelper> OtherVariableNamePropertyRow;\n\n\t// Hold a reference to dialogue we are displaying.\n\tUDlgDialogue* Dialogue = nullptr;\n};\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystemEditor/Private/DialogueEditor/DetailsPanel/DialogueDetailsPanelUtils.cpp",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#include \"DialogueDetailsPanelUtils.h\"\n#include \"DlgHelper.h\"\n\n\nUDialogueGraphNode_Base* FDialogueDetailsPanelUtils::GetGraphNodeBaseFromPropertyHandle(const TSharedRef<IPropertyHandle>& PropertyHandle)\n{\n\tTArray<UObject*> OuterObjects;\n\tPropertyHandle->GetOuterObjects(OuterObjects);\n\n\tfor (UObject* Object : OuterObjects)\n\t{\n\t\tif (UDlgNode* Node = Cast<UDlgNode>(Object))\n\t\t{\n\t\t\treturn CastChecked<UDialogueGraphNode_Base>(Node->GetGraphNode());\n\t\t}\n\n\t\tif (UDialogueGraphNode_Base* Node = Cast<UDialogueGraphNode_Base>(Object))\n\t\t{\n\t\t\treturn Node;\n\t\t}\n\t}\n\n\treturn nullptr;\n}\n\nUDialogueGraphNode* FDialogueDetailsPanelUtils::GetClosestGraphNodeFromPropertyHandle(const TSharedRef<IPropertyHandle>& PropertyHandle)\n{\n\tif (UDialogueGraphNode_Base* BaseGraphNode = GetGraphNodeBaseFromPropertyHandle(PropertyHandle))\n\t{\n\t\tif (UDialogueGraphNode* Node = Cast<UDialogueGraphNode>(BaseGraphNode))\n\t\t{\n\t\t\treturn Node;\n\t\t}\n\t\tif (UDialogueGraphNode_Edge* GraphEdge = Cast<UDialogueGraphNode_Edge>(BaseGraphNode))\n\t\t{\n\t\t\tif (GraphEdge->HasParentNode())\n\t\t\t{\n\t\t\t\treturn GraphEdge->GetParentNode();\n\t\t\t}\n\t\t}\n\t}\n\n\treturn nullptr;\n}\n\nUDlgDialogue* FDialogueDetailsPanelUtils::GetDialogueFromPropertyHandle(const TSharedRef<IPropertyHandle>& PropertyHandle)\n{\n\tUDlgDialogue* Dialogue = nullptr;\n\n\t// Check first children objects of property handle, should be a dialogue node or a graph node\n\tif (UDialogueGraphNode_Base* GraphNode = GetGraphNodeBaseFromPropertyHandle(PropertyHandle))\n\t{\n\t\tDialogue = GraphNode->GetDialogue();\n\t}\n\n\t// One last try, get to the root of the problem ;)\n\tif (!IsValid(Dialogue))\n\t{\n\t\tTSharedPtr<IPropertyHandle> ParentHandle = PropertyHandle->GetParentHandle();\n\t\t// Find the root property handle\n\t\twhile (ParentHandle.IsValid() && ParentHandle->GetParentHandle().IsValid())\n\t\t{\n\t\t\tParentHandle = ParentHandle->GetParentHandle();\n\t\t}\n\n\t\t// The outer should be a dialogue\n\t\tif (ParentHandle.IsValid())\n\t\t{\n\t\t\tTArray<UObject*> OuterObjects;\n\t\t\tParentHandle->GetOuterObjects(OuterObjects);\n\t\t\tfor (UObject* Object : OuterObjects)\n\t\t\t{\n\t\t\t\tif (UDlgDialogue* FoundDialogue = Cast<UDlgDialogue>(Object))\n\t\t\t\t{\n\t\t\t\t\tDialogue = FoundDialogue;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn Dialogue;\n}\n\nFName FDialogueDetailsPanelUtils::GetParticipantNameFromPropertyHandle(const TSharedRef<IPropertyHandle>& ParticipantNamePropertyHandle)\n{\n\tFName ParticipantName = NAME_None;\n\tif (ParticipantNamePropertyHandle->GetValue(ParticipantName) != FPropertyAccess::Success)\n\t{\n\t\treturn ParticipantName;\n\t}\n\n\t// Try the node that owns this\n\tif (ParticipantName.IsNone())\n\t{\n\t\t// Possible edge?\n\t\tif (UDialogueGraphNode* GraphNode = GetClosestGraphNodeFromPropertyHandle(ParticipantNamePropertyHandle))\n\t\t{\n\t\t\treturn GraphNode->GetDialogueNode().GetNodeParticipantName();\n\t\t}\n\t}\n\n\treturn ParticipantName;\n}\n\nTArray<FName> FDialogueDetailsPanelUtils::GetDialogueSortedParticipantNames(UDlgDialogue* Dialogue)\n{\n\tif (Dialogue == nullptr)\n\t{\n\t\treturn {};\n\t}\n\n\tTSet<FName> ParticipantNames;\n\tDialogue->GetAllParticipantNames(ParticipantNames);\n\tFDlgHelper::SortDefault(ParticipantNames);\n\treturn ParticipantNames.Array();\n}\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystemEditor/Private/DialogueEditor/DetailsPanel/DialogueDetailsPanelUtils.h",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#pragma once\n\n#include \"CoreMinimal.h\"\n\n#include \"DialogueEditor/Nodes/DialogueGraphNode_Edge.h\"\n#include \"DialogueEditor/Nodes/DialogueGraphNode.h\"\n\n#define CREATE_VISIBILITY_CALLBACK(_SelfMethod) \\\n\tTAttribute<EVisibility>::Create(TAttribute<EVisibility>::FGetter::CreateSP(this, _SelfMethod))\n\n#define CREATE_VISIBILITY_CALLBACK_STATIC(_StaticMethod) \\\n\tTAttribute<EVisibility>::Create(TAttribute<EVisibility>::FGetter::CreateStatic(_StaticMethod))\n\n#define CREATE_BOOL_CALLBACK(_SelfMethod) \\\n\tTAttribute<bool>::Create(TAttribute<bool>::FGetter::CreateSP(this, _SelfMethod))\n\n#define CREATE_BOOL_CALLBACK_STATIC(_StaticMethod) \\\n\tTAttribute<bool>::Create(TAttribute<bool>::FGetter::CreateStatic(_StaticMethod))\n\n// Constants used in this file\nstatic const TCHAR* META_ShowOnlyInnerProperties = TEXT(\"ShowOnlyInnerProperties\");\nstatic const TCHAR* META_UIMin = TEXT(\"UIMin\");\nstatic const TCHAR* META_UIMax = TEXT(\"UIMax\");\nstatic const TCHAR* META_ClampMin = TEXT(\"ClampMin\");\nstatic const TCHAR* META_ClampMax = TEXT(\"ClampMax\");\n\nstruct FDialogueDetailsPanelUtils\n{\npublic:\n\t// Getters for visibility of some properties\n\tstatic EVisibility GetVoiceSoundWaveVisibility()\n\t{\n\t\tconst UDlgSystemSettings* Settings = GetDefault<UDlgSystemSettings>();\n\t\treturn Settings->DialogueDisplayedVoiceFields == EDlgVoiceDisplayedFields::SoundWave ||\n\t\t\t   Settings->DialogueDisplayedVoiceFields == EDlgVoiceDisplayedFields::SoundWaveAndDialogueWave\n\t\t\t   ? EVisibility::Visible : EVisibility::Hidden;\n\t}\n\n\tstatic EVisibility GetVoiceDialogueWaveVisibility()\n\t{\n\t\tconst UDlgSystemSettings* Settings = GetDefault<UDlgSystemSettings>();\n\t\treturn Settings->DialogueDisplayedVoiceFields == EDlgVoiceDisplayedFields::DialogueWave ||\n\t\t\t   Settings->DialogueDisplayedVoiceFields == EDlgVoiceDisplayedFields::SoundWaveAndDialogueWave\n\t\t\t   ? EVisibility::Visible : EVisibility::Hidden;\n\t}\n\n\tstatic EVisibility GetSpeakerStateNodeVisibility()\n\t{\n\t\tconst UDlgSystemSettings* Settings = GetDefault<UDlgSystemSettings>();\n\t\treturn Settings->DialogueSpeakerStateVisibility == EDlgSpeakerStateVisibility::ShowOnNode ||\n\t\t\t   Settings->DialogueSpeakerStateVisibility == EDlgSpeakerStateVisibility::ShowOnNodeAndEdge\n\t\t\t   ? EVisibility::Visible : EVisibility::Hidden;\n\t}\n\n\tstatic EVisibility GetNodeDataVisibility()\n\t{\n\t\treturn GetDefault<UDlgSystemSettings>()->bShowNodeData ? EVisibility::Visible : EVisibility::Hidden;\n\t}\n\n\tstatic EVisibility GetNodeGenericDataVisibility()\n\t{\n\t\treturn GetDefault<UDlgSystemSettings>()->bShowGenericData ? EVisibility::Visible : EVisibility::Hidden;\n\t}\n\n\tstatic EVisibility GetChildrenVisibility()\n\t{\n\t\treturn GetDefault<UDlgSystemSettings>()->bShowAdvancedChildren ? EVisibility::Visible : EVisibility::Hidden;\n\t}\n\n\t/** Gets the appropriate modifier key for an input field depending on the Dialogue System Settings */\n\tstatic EModifierKey::Type GetModifierKeyFromDialogueSettings()\n\t{\n\t\tswitch (GetDefault<UDlgSystemSettings>()->DialogueTextInputKeyForNewLine)\n\t\t{\n\t\tcase EDlgTextInputKeyForNewLine::ShiftPlusEnter:\n\t\t\treturn EModifierKey::Shift;\n\n\t\tcase EDlgTextInputKeyForNewLine::Enter:\n\t\tdefault:\n\t\t\treturn EModifierKey::None;\n\t\t}\n\t}\n\n\t/** Resets the numeric property to not have any limits */\n\tstatic void ResetNumericPropertyLimits(const TSharedPtr<IPropertyHandle>& PropertyHandle)\n\t{\n\t\tif (!PropertyHandle.IsValid())\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\tauto* Property = PropertyHandle->GetProperty();\n\t\tProperty->RemoveMetaData(META_UIMin);\n\t\tProperty->RemoveMetaData(META_UIMax);\n\t\tProperty->RemoveMetaData(META_ClampMin);\n\t\tProperty->RemoveMetaData(META_ClampMax);\n\t}\n\n\t/** Sets the limits of the numeric property. It can only have values in the range [Min, Max] */\n\ttemplate <typename NumericType>\n\tstatic void SetNumericPropertyLimits(const TSharedPtr<IPropertyHandle>& PropertyHandle, const NumericType Min, const NumericType Max)\n\t{\n\t\tif (!PropertyHandle.IsValid())\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\t// Clamp Current value if not in range\n\t\tNumericType NumericValue;\n\t\tif (PropertyHandle->GetValue(NumericValue) != FPropertyAccess::Success)\n\t\t{\n\t\t\treturn;\n\t\t}\n\t\tif (PropertyHandle->SetValue(FMath::Clamp(NumericValue, Min, Max)) != FPropertyAccess::Success)\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\tconst FString MinString = FString::FromInt(Min);\n\t\tconst FString MaxString = FString::FromInt(Max);\n\t\tauto* Property = PropertyHandle->GetProperty();\n\n\t\t// min\n\t\tProperty->SetMetaData(META_UIMin, *MinString);\n\t\tProperty->SetMetaData(META_ClampMin, *MinString);\n\n\t\t// max\n\t\tProperty->SetMetaData(META_UIMax, *MaxString);\n\t\tProperty->SetMetaData(META_ClampMax, *MaxString);\n\t}\n\n\t/** Gets the Base GraphNode owner that belongs to this PropertyHandle. It could be an Edge or a GraphNode */\n\tstatic UDialogueGraphNode_Base* GetGraphNodeBaseFromPropertyHandle(const TSharedRef<IPropertyHandle>& PropertyHandle);\n\n\t/**\n\t * Similar to the Base node only this always returns a UDialogueGraphNode\n\t * If the BaseGraphNode is an GraphNode then return that\n\t * If the BaseGraphNode is an Edge then return the ParentGraphNode\n\t */\n\tstatic UDialogueGraphNode* GetClosestGraphNodeFromPropertyHandle(const TSharedRef<IPropertyHandle>& PropertyHandle);\n\n\t/**\n\t * Similar to the Base node only this always returns a UDialogueGraphNode_Edge\n\t * If the BaseGraphNode is an GraphNode then returns nullptr\n\t * If the BaseGraphNode is an Edge then returns that\n\t */\n\tstatic UDialogueGraphNode_Edge* GetAsGraphNodeEdgeFromPropertyHandle(const TSharedRef<IPropertyHandle>& PropertyHandle)\n\t{\n\t\treturn Cast<UDialogueGraphNode_Edge>(GetGraphNodeBaseFromPropertyHandle(PropertyHandle));\n\t}\n\n\t/** Gets the Dialogue that is the top most root owner of this PropertyHandle. used in the details panel. */\n\tstatic UDlgDialogue* GetDialogueFromPropertyHandle(const TSharedRef<IPropertyHandle>& PropertyHandle);\n\n\t/**\n\t * Tries to get the participant name of the struct by using that structs PropertyName\n\t * 1. Tries to get the value from the ParticipantNamePropertyHandle of that struct.\n\t * 2. Gets the ParticipantName from the Node that has this property.\n\t */\n\tstatic FName GetParticipantNameFromPropertyHandle(const TSharedRef<IPropertyHandle>& ParticipantNamePropertyHandle);\n\n\t/** Gets all the participant names of the Dialogue sorted alphabetically */\n\tstatic TArray<FName> GetDialogueSortedParticipantNames(UDlgDialogue* Dialogue);\n};\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystemEditor/Private/DialogueEditor/DetailsPanel/DialogueEdge_Details.cpp",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#include \"DialogueEdge_Details.h\"\n\n#include \"IDetailPropertyRow.h\"\n#include \"IDetailChildrenBuilder.h\"\n#include \"IPropertyTypeCustomization.h\"\n\n#include \"Nodes/DlgNode.h\"\n#include \"DialogueDetailsPanelUtils.h\"\n#include \"DialogueEditor/Nodes/DialogueGraphNode.h\"\n#include \"Widgets/DialogueMultiLineEditableTextBox_CustomRowHelper.h\"\n#include \"Widgets/SDialogueTextPropertyPickList.h\"\n#include \"Widgets/DialogueTextPropertyPickList_CustomRowHelper.h\"\n\n#define LOCTEXT_NAMESPACE \"DialogueEdge_Details\"\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// FDialogueEdge_Details\nvoid FDialogueEdge_Details::CustomizeHeader(TSharedRef<IPropertyHandle> InStructPropertyHandle,\n\tFDetailWidgetRow& HeaderRow, IPropertyTypeCustomizationUtils& StructCustomizationUtils)\n{\n\tStructPropertyHandle = InStructPropertyHandle;\n\tDialogue = FDialogueDetailsPanelUtils::GetDialogueFromPropertyHandle(StructPropertyHandle.ToSharedRef());\n\tbShowTextProperty = true;\n\n\t// Should we show hide the Text property?\n\tif (const UDialogueGraphNode* GraphNode = FDialogueDetailsPanelUtils::GetClosestGraphNodeFromPropertyHandle(StructPropertyHandle.ToSharedRef()))\n\t{\n\t\t// Virtual parents do not handle direct children, only grand children\n\t\t// And selector node do not even touch them\n\t\tbShowTextProperty = FDlgEdge::IsTextVisible(GraphNode->GetDialogueNode());\n\n\t\t// Special case\n\t\t// Selector node but one of its parent is a virtual parent, allow text then\n\t\tif (!bShowTextProperty && GraphNode->IsSelectorNode())\n\t\t{\n\t\t\tfor (const UDialogueGraphNode* ParentNode : GraphNode->GetParentNodes())\n\t\t\t{\n\t\t\t\tif (ParentNode->IsVirtualParentNode())\n\t\t\t\t{\n\t\t\t\t\tbShowTextProperty = true;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tconst bool bShowOnlyInnerProperties = StructPropertyHandle->GetProperty()->HasMetaData(META_ShowOnlyInnerProperties);\n\tif (!bShowOnlyInnerProperties)\n\t{\n\t\tHeaderRow.NameContent()\n\t\t\t[\n\t\t\t\tStructPropertyHandle->CreatePropertyNameWidget()\n\t\t\t];\n\t}\n}\n\nvoid FDialogueEdge_Details::CustomizeChildren(TSharedRef<IPropertyHandle> InStructPropertyHandle,\n\tIDetailChildrenBuilder& StructBuilder, IPropertyTypeCustomizationUtils& StructCustomizationUtils)\n{\n\t// TargetIndex\n\tStructBuilder.AddProperty(StructPropertyHandle->GetChildHandle(GET_MEMBER_NAME_CHECKED(FDlgEdge, TargetIndex)).ToSharedRef());\n\n\t// Conditions\n\tStructBuilder.AddProperty(StructPropertyHandle->GetChildHandle(GET_MEMBER_NAME_CHECKED(FDlgEdge, Conditions)).ToSharedRef());\n\n\t// Text\n\tTextPropertyHandle = StructPropertyHandle->GetChildHandle(FDlgEdge::GetMemberNameText());\n\tFDetailWidgetRow* TextDetailWidgetRow = &StructBuilder.AddCustomRow(LOCTEXT(\"TextSearchKey\", \"Text\"));\n\n\tTextPropertyRow = MakeShared<FDialogueMultiLineEditableTextBox_CustomRowHelper>(TextDetailWidgetRow, TextPropertyHandle);\n\tTextPropertyRow->SetPropertyUtils(StructCustomizationUtils.GetPropertyUtilities())\n\t\t.SetVisibility(CREATE_VISIBILITY_CALLBACK(&Self::GetTextVisibility))\n\t\t.Update();\n\tTextPropertyRow->OnTextCommittedEvent().AddRaw(this, &Self::HandleTextCommitted);\n\tTextPropertyRow->OnTextChangedEvent().AddRaw(this, &Self::HandleTextChanged);\n\n\t// Text Arguments\n\tStructBuilder.AddProperty(StructPropertyHandle->GetChildHandle(FDlgEdge::GetMemberNameTextArguments()).ToSharedRef())\n\t\t.Visibility(CREATE_VISIBILITY_CALLBACK(&Self::GetTextVisibility));\n\n\t// Speaker State\n\t{\n\t\tconst TSharedPtr<IPropertyHandle> SpeakerStatePropertyHandle =\n\t\t\tStructPropertyHandle->GetChildHandle(GET_MEMBER_NAME_CHECKED(FDlgEdge, SpeakerState));\n\n\t\tFDetailWidgetRow* SpeakerStateDetailWidgetRow = &StructBuilder.AddCustomRow(LOCTEXT(\"SpeakerStateSearchKey\", \"Speaker State\"));\n\n\t\tSpeakerStatePropertyRow = MakeShared<FDialogueTextPropertyPickList_CustomRowHelper>(SpeakerStateDetailWidgetRow, SpeakerStatePropertyHandle);\n\t\tSpeakerStatePropertyRow->SetTextPropertyPickListWidget(\n\t\t\tSNew(SDialogueTextPropertyPickList)\n\t\t\t.IsEnabled(InStructPropertyHandle->IsEditable())\n\t\t\t.AvailableSuggestions(this, &Self::GetAllDialoguesSpeakerStates)\n\t\t\t.OnTextCommitted(this, &Self::HandleSpeakerStateCommitted)\n\t\t\t.HasContextCheckbox(false)\n\t\t)\n\t\t.SetVisibility(CREATE_VISIBILITY_CALLBACK(&Self::GetSpeakerStateVisibility))\n\t\t.Update();\n\t}\n\n\t// bIncludeInAllOptionListIfUnsatisfied\n\tIDetailPropertyRow& BoolPropertyRow = StructBuilder.AddProperty(StructPropertyHandle->GetChildHandle(\n\t\tGET_MEMBER_NAME_CHECKED(FDlgEdge, bIncludeInAllOptionListIfUnsatisfied)).ToSharedRef()\n\t);\n\tBoolPropertyRow.Visibility(CREATE_VISIBILITY_CALLBACK(&Self::GetTextVisibility));\n}\n\nvoid FDialogueEdge_Details::HandleSpeakerStateCommitted(const FText& InSearchText, ETextCommit::Type CommitInfo)\n{\n\tif (Dialogue)\n\t{\n\t\tDialogue->UpdateAndRefreshData();\n\t}\n}\n\nvoid FDialogueEdge_Details::HandleTextCommitted(const FText& InText, ETextCommit::Type CommitInfo)\n{\n\tif (UDialogueGraphNode_Edge* GraphEdge = FDialogueDetailsPanelUtils::GetAsGraphNodeEdgeFromPropertyHandle(StructPropertyHandle.ToSharedRef()))\n\t{\n\t\tif (Dialogue)\n\t\t{\n\t\t\tDialogue->UpdateAndRefreshData();\n\t\t}\n\n\t\tGraphEdge->GetDialogueEdge().RebuildTextArguments();\n\t}\n}\n\nvoid FDialogueEdge_Details::HandleTextChanged(const FText& InText)\n{\n\tif (UDialogueGraphNode_Edge* GraphEdge = FDialogueDetailsPanelUtils::GetAsGraphNodeEdgeFromPropertyHandle(StructPropertyHandle.ToSharedRef()))\n\t{\n\t\tGraphEdge->GetDialogueEdge().RebuildTextArgumentsFromPreview(InText);\n\t}\n}\n\n\n#undef LOCTEXT_NAMESPACE\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystemEditor/Private/DialogueEditor/DetailsPanel/DialogueEdge_Details.h",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#pragma once\n\n#include \"IPropertyTypeCustomization.h\"\n#include \"Layout/Visibility.h\"\n#include \"DialogueDetailsPanelUtils.h\"\n#include \"DlgManager.h\"\n\nclass UDlgDialogue;\nclass FDialogueMultiLineEditableTextBox_CustomRowHelper;\nclass FDialogueTextPropertyPickList_CustomRowHelper;\n\n/**\n * How the details customization panel looks for the FDlgEdge\n * See FDlgSystemEditorModule::StartupModule for usage.\n */\nclass FDialogueEdge_Details : public IPropertyTypeCustomization\n{\n\ttypedef FDialogueEdge_Details Self;\n\npublic:\n\tstatic TSharedRef<IPropertyTypeCustomization> MakeInstance() { return MakeShared<Self>(); }\n\n\t/** IPropertyTypeCustomization interface */\n\t/**\n\t * Called when the header of the property (the row in the details panel where the property is shown)\n\t * If nothing is added to the row, the header is not displayed\n\t *\n\t * @param StructPropertyHandle\t\tHandle to the property being customized\n\t * @param HeaderRow\t\t\t\t\tA row that widgets can be added to\n\t * @param StructCustomizationUtils\tUtilities for customization\n\t */\n\tvoid CustomizeHeader(TSharedRef<IPropertyHandle> StructPropertyHandle,\n\t\tFDetailWidgetRow& HeaderRow,\n\t\tIPropertyTypeCustomizationUtils& StructCustomizationUtils) override;\n\n\t/**\n\t * Called when the children of the property should be customized or extra rows added\n\t *\n\t * @param StructPropertyHandle\t\tHandle to the property being customized\n\t * @param StructBuilder\t\t\t\tA builder for adding children\n\t * @param StructCustomizationUtils\tUtilities for customization\n\t */\n\tvoid CustomizeChildren(TSharedRef<IPropertyHandle> StructPropertyHandle,\n\t\tIDetailChildrenBuilder& StructBuilder,\n\t\tIPropertyTypeCustomizationUtils& StructCustomizationUtils) override;\n\n\t/** Gets the Speaker States from all Dialogues. */\n\tTArray<FName> GetAllDialoguesSpeakerStates() const\n\t{\n\t\tTArray<FName> OutArray;\n\t\tUDlgManager::GetAllDialoguesSpeakerStates(OutArray);\n\t\treturn OutArray;\n\t}\n\n\t/** Handler for when the speaker state is changed */\n\tvoid HandleSpeakerStateCommitted(const FText& InSearchText, ETextCommit::Type CommitInfo);\n\n\t/** Handler for when the text is changed */\n\tvoid HandleTextCommitted(const FText& InText, ETextCommit::Type CommitInfo);\n\tvoid HandleTextChanged(const FText& InText);\n\t\nprivate:\n\t// Getters for the visibility of some properties\n\tEVisibility GetTextVisibility() const { return bShowTextProperty ? EVisibility::Visible : EVisibility::Hidden; }\n\n\tEVisibility GetSpeakerStateVisibility() const\n\t{\n\t\tconst UDlgSystemSettings* Settings = GetDefault<UDlgSystemSettings>();\n\t\tconst bool bSettingsShow =\n\t\t\tSettings->DialogueSpeakerStateVisibility == EDlgSpeakerStateVisibility::ShowOnEdge ||\n\t\t\tSettings->DialogueSpeakerStateVisibility == EDlgSpeakerStateVisibility::ShowOnNodeAndEdge;\n\t\t\n\t\treturn bShowTextProperty && bSettingsShow ? EVisibility::Visible : EVisibility::Hidden;\n\t}\n\nprivate:\n\t/** The property handle of the entire struct. */\n\tTSharedPtr<IPropertyHandle> StructPropertyHandle;\n\n\t/** Bool flag indicating to show or not the Text Property of the Edge */\n\tbool bShowTextProperty = true;\n\n\t/** Cache some properties */\n\tTSharedPtr<IPropertyHandle> TextPropertyHandle;\n\tTSharedPtr<FDialogueMultiLineEditableTextBox_CustomRowHelper> TextPropertyRow;\n\tTSharedPtr<FDialogueTextPropertyPickList_CustomRowHelper> SpeakerStatePropertyRow;\n\n\t/** Hold a reference to dialogue we are displaying. */\n\tUDlgDialogue* Dialogue = nullptr;\n};\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystemEditor/Private/DialogueEditor/DetailsPanel/DialogueEvent_Details.cpp",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#include \"DialogueEvent_Details.h\"\n\n#include \"IDetailPropertyRow.h\"\n#include \"IPropertyUtilities.h\"\n#include \"IDetailChildrenBuilder.h\"\n\n#include \"Nodes/DlgNode.h\"\n#include \"NYReflectionHelper.h\"\n#include \"DialogueDetailsPanelUtils.h\"\n#include \"DialogueEditor/Nodes/DialogueGraphNode.h\"\n#include \"Widgets/SDialogueTextPropertyPickList.h\"\n#include \"Widgets/DialogueTextPropertyPickList_CustomRowHelper.h\"\n#include \"DlgHelper.h\"\n#include \"Widgets/DialogueEnumTypeWithObject_CustomRowHelper.h\"\n#include \"Widgets/DialogueObject_CustomRowHelper.h\"\n\n#define LOCTEXT_NAMESPACE \"DialogueEvent_Details\"\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// FDialogueCustomEventization\nvoid FDialogueEvent_Details::CustomizeHeader(TSharedRef<IPropertyHandle> InStructPropertyHandle,\n\tFDetailWidgetRow& HeaderRow, IPropertyTypeCustomizationUtils& StructCustomizationUtils)\n{\n\tStructPropertyHandle = InStructPropertyHandle;\n\tDialogue = FDialogueDetailsPanelUtils::GetDialogueFromPropertyHandle(StructPropertyHandle.ToSharedRef());\n\tPropertyUtils = StructCustomizationUtils.GetPropertyUtilities();\n\n\t// Cache the Property Handle for the EventType\n\tParticipantNamePropertyHandle = StructPropertyHandle->GetChildHandle(GET_MEMBER_NAME_CHECKED(FDlgEvent, ParticipantName));\n\tEventTypePropertyHandle = StructPropertyHandle->GetChildHandle(GET_MEMBER_NAME_CHECKED(FDlgEvent, EventType));\n\tcheck(ParticipantNamePropertyHandle.IsValid());\n\tcheck(EventTypePropertyHandle.IsValid());\n\n\t// Register handler for event type change\n\tEventTypePropertyHandle->SetOnPropertyValueChanged(\n\t\tFSimpleDelegate::CreateSP(this, &Self::OnEventTypeChanged, true)\n\t);\n\n\tconst bool bShowOnlyInnerProperties = StructPropertyHandle->GetProperty()->HasMetaData(META_ShowOnlyInnerProperties);\n\tif (!bShowOnlyInnerProperties)\n\t{\n\t\tHeaderRow.NameContent()\n\t\t\t[\n\t\t\t\tStructPropertyHandle->CreatePropertyNameWidget()\n\t\t\t];\n\t}\n}\n\nvoid FDialogueEvent_Details::CustomizeChildren(TSharedRef<IPropertyHandle> InStructPropertyHandle,\n\tIDetailChildrenBuilder& StructBuilder, IPropertyTypeCustomizationUtils& StructCustomizationUtils)\n{\n\tconst bool bHasDialogue = Dialogue != nullptr;\n\n\n\t// Common ParticipantName\n\t{\n\t\tFDetailWidgetRow* DetailWidgetRow = &StructBuilder.AddCustomRow(LOCTEXT(\"ParticipantNameSearchKey\", \"Participant Name\"));\n\n\t\tParticipantNamePropertyRow = MakeShared<FDialogueTextPropertyPickList_CustomRowHelper>(DetailWidgetRow, ParticipantNamePropertyHandle);\n\t\tParticipantNamePropertyRow->SetTextPropertyPickListWidget(\n\t\t\tSNew(SDialogueTextPropertyPickList)\n\t\t\t.AvailableSuggestions(this, &Self::GetAllDialoguesParticipantNames)\n\t\t\t.OnTextCommitted(this, &Self::HandleTextCommitted)\n\t\t\t.HasContextCheckbox(bHasDialogue)\n\t\t\t.IsContextCheckBoxChecked(true)\n\t\t\t.CurrentContextAvailableSuggestions(this, &Self::GetCurrentDialogueParticipantNames)\n\t\t)\n\t\t.Update();\n\t}\n\n\t// EventType\n\t{\n\t\tEventTypePropertyRow = &StructBuilder.AddProperty(EventTypePropertyHandle.ToSharedRef());\n\n\t\t// Add Custom buttons\n\t\tEventTypePropertyRow_CustomDisplay = MakeShared<FDialogueEnumTypeWithObject_CustomRowHelper>(\n            EventTypePropertyRow,\n            Dialogue,\n            ParticipantNamePropertyHandle\n        );\n\t\tEventTypePropertyRow_CustomDisplay->SetEnumType(EDialogueEnumWithObjectType::Event);\n\t\tEventTypePropertyRow_CustomDisplay->Update();\n\t}\n\n\t// EventName\n\t{\n\t\tconst TSharedPtr<IPropertyHandle> EventNamePropertyHandle = StructPropertyHandle->GetChildHandle(\n\t\t\tGET_MEMBER_NAME_CHECKED(FDlgEvent, EventName)\n\t\t);\n\t\tFDetailWidgetRow* DetailWidgetRow = &StructBuilder.AddCustomRow(LOCTEXT(\"EventNameSearchKey\", \"Event Name\"));\n\n\t\tEventNamePropertyRow = MakeShared<FDialogueTextPropertyPickList_CustomRowHelper>(DetailWidgetRow, EventNamePropertyHandle);\n\t\tEventNamePropertyRow->SetTextPropertyPickListWidget(\n\t\t\t\tSNew(SDialogueTextPropertyPickList)\n\t\t\t\t.AvailableSuggestions(this, &Self::GetAllDialoguesEventNames)\n\t\t\t\t.OnTextCommitted(this, &Self::HandleTextCommitted)\n\t\t\t\t.HasContextCheckbox(bHasDialogue)\n\t\t\t\t.IsContextCheckBoxChecked(false)\n\t\t\t\t.CurrentContextAvailableSuggestions(this, &Self::GetCurrentDialogueEventNames)\n\t\t)\n\t\t.SetVisibility(CREATE_VISIBILITY_CALLBACK(&Self::GetEventNameVisibility))\n\t\t.Update();\n\t}\n\n\t// IntValue\n\t{\n\t\tIntValuePropertyRow = &StructBuilder.AddProperty(\n\t\t\tStructPropertyHandle->GetChildHandle(GET_MEMBER_NAME_CHECKED(FDlgEvent, IntValue)).ToSharedRef()\n\t\t);\n\t\tIntValuePropertyRow->Visibility(CREATE_VISIBILITY_CALLBACK(&Self::GetIntValueVisibility));\n\t}\n\n\t// FloatValue\n\t{\n\t\tFloatValuePropertyRow = &StructBuilder.AddProperty(\n\t\t\tStructPropertyHandle->GetChildHandle(GET_MEMBER_NAME_CHECKED(FDlgEvent, FloatValue)).ToSharedRef()\n\t\t);\n\t\tFloatValuePropertyRow->Visibility(CREATE_VISIBILITY_CALLBACK(&Self::GetFloatValueVisibility));\n\t}\n\n\t// NameValue\n\t{\n\t\tNameValuePropertyRow = &StructBuilder.AddProperty(\n\t\t\tStructPropertyHandle->GetChildHandle(GET_MEMBER_NAME_CHECKED(FDlgEvent, NameValue)).ToSharedRef()\n\t\t);\n\t\tNameValuePropertyRow->Visibility(CREATE_VISIBILITY_CALLBACK(&Self::GetNameValueVisibility));\n\t}\n\n\t// bDelta\n\t{\n\t\tBoolDeltaPropertyRow = &StructBuilder.AddProperty(\n\t\t\tStructPropertyHandle->GetChildHandle(GET_MEMBER_NAME_CHECKED(FDlgEvent, bDelta)).ToSharedRef()\n\t\t);\n\t\tBoolDeltaPropertyRow->Visibility(CREATE_VISIBILITY_CALLBACK(&Self::GetBoolDeltaVisibility));\n\t}\n\n\t// bValue\n\t{\n\t\tBoolValuePropertyRow = &StructBuilder.AddProperty(\n\t\t\tStructPropertyHandle->GetChildHandle(GET_MEMBER_NAME_CHECKED(FDlgEvent, bValue)).ToSharedRef()\n\t\t);\n\t\tBoolValuePropertyRow->Visibility(CREATE_VISIBILITY_CALLBACK(&Self::GetBoolValueVisibility));\n\t}\n\n\t// CustomEvent\n\t{\n\t\tCustomEventPropertyRow = &StructBuilder.AddProperty(\n\t\t\tStructPropertyHandle->GetChildHandle(GET_MEMBER_NAME_CHECKED(FDlgEvent, CustomEvent)).ToSharedRef()\n\t\t);\n\t\tCustomEventPropertyRow->Visibility(CREATE_VISIBILITY_CALLBACK(&Self::GetCustomEventVisibility));\n\n\t\t// Add Custom buttons\n\t\tCustomEventPropertyRow_CustomDisplay = MakeShared<FDialogueObject_CustomRowHelper>(CustomEventPropertyRow);\n\t\tCustomEventPropertyRow_CustomDisplay->Update();\n\t\tCustomEventPropertyRow_CustomDisplay->SetFunctionNameToOpen(\n\t\t\tEDialogueBlueprintOpenType::Event,\n\t\t\tGET_FUNCTION_NAME_CHECKED(UDlgEventCustom, EnterEvent)\n\t\t);\n\t}\n\n\t// Cache the initial event type\n\tOnEventTypeChanged(false);\n}\n\nvoid FDialogueEvent_Details::OnEventTypeChanged(bool bForceRefresh)\n{\n\t// Update to the new type\n\tuint8 Value = 0;\n\tif (EventTypePropertyHandle->GetValue(Value) != FPropertyAccess::Success)\n\t{\n\t\treturn;\n\t}\n\tEventType = static_cast<EDlgEventType>(Value);\n\n\t// Update the display name/tooltips\n\tFText EventNameDisplayName = LOCTEXT(\"EventNameDisplayName\", \"Variable Name\");\n\tFText EventNameToolTip = LOCTEXT(\"EventNameToolTip\", \"Name of the relevant variable\");\n\tif (EventType == EDlgEventType::Event)\n\t{\n\t\tEventNameDisplayName = LOCTEXT(\"DlgEvent_EventNameDisplayName\", \"Event Name\");\n\t\tEventNameToolTip = LOCTEXT(\"DlgEvent_EventNameToolTip\", \"Name of the relevant event\");\n\t}\n\n\tEventNamePropertyRow->SetDisplayName(EventNameDisplayName)\n\t\t.SetToolTip(EventNameToolTip)\n\t\t.Update();\n\n\t// Refresh the view, without this some names/tooltips won't get refreshed\n\tif (bForceRefresh && PropertyUtils.IsValid())\n\t{\n\t\tPropertyUtils->ForceRefresh();\n\t}\n}\n\nTArray<FName> FDialogueEvent_Details::GetAllDialoguesEventNames() const\n{\n\tTArray<FName> Suggestions;\n\tconst FName ParticipantName = FDialogueDetailsPanelUtils::GetParticipantNameFromPropertyHandle(ParticipantNamePropertyHandle.ToSharedRef());\n\n\tswitch (EventType)\n\t{\n\tcase EDlgEventType::ModifyBool:\n\t\tUDlgManager::GetAllDialoguesBoolNames(ParticipantName, Suggestions);\n\t\tbreak;\n\n\tcase EDlgEventType::ModifyFloat:\n\t\tUDlgManager::GetAllDialoguesFloatNames(ParticipantName, Suggestions);\n\t\tbreak;\n\n\tcase EDlgEventType::ModifyInt:\n\t\tUDlgManager::GetAllDialoguesIntNames(ParticipantName, Suggestions);\n\t\tbreak;\n\n\tcase EDlgEventType::ModifyName:\n\t\tUDlgManager::GetAllDialoguesNameNames(ParticipantName, Suggestions);\n\t\tbreak;\n\n\tcase EDlgEventType::ModifyClassIntVariable:\n\t\tif (Dialogue)\n\t\t{\n\t\t\tFNYReflectionHelper::GetVariableNames(\n\t\t\t\tDialogue->GetParticipantClass(ParticipantName),\n\t\t\t\tFNYIntProperty::StaticClass(),\n\t\t\t\tSuggestions,\n\t\t\t\tGetDefault<UDlgSystemSettings>()->BlacklistedReflectionClasses\n\t\t\t);\n\t\t\tFDlgHelper::SortDefault(Suggestions);\n\t\t}\n\t\tbreak;\n\n\tcase EDlgEventType::ModifyClassFloatVariable:\n\t\tif (Dialogue)\n\t\t{\n\t\t\tFNYReflectionHelper::GetVariableNames(\n\t\t\t\tDialogue->GetParticipantClass(ParticipantName),\n\t\t\t\tFNYFloatProperty::StaticClass(),\n\t\t\t\tSuggestions,\n\t\t\t\tGetDefault<UDlgSystemSettings>()->BlacklistedReflectionClasses\n\t\t\t);\n\t\t\tFDlgHelper::SortDefault(Suggestions);\n\t\t}\n\t\tbreak;\n\n\tcase EDlgEventType::ModifyClassBoolVariable:\n\t\tif (Dialogue)\n\t\t{\n\t\t\tFNYReflectionHelper::GetVariableNames(\n\t\t\t\tDialogue->GetParticipantClass(ParticipantName),\n\t\t\t\tFNYBoolProperty::StaticClass(),\n\t\t\t\tSuggestions,\n\t\t\t\tGetDefault<UDlgSystemSettings>()->BlacklistedReflectionClasses\n\t\t\t);\n\t\t\tFDlgHelper::SortDefault(Suggestions);\n\t\t}\n\t\tbreak;\n\n\tcase EDlgEventType::ModifyClassNameVariable:\n\t\tif (Dialogue)\n\t\t{\n\t\t\tFNYReflectionHelper::GetVariableNames(\n\t\t\t\tDialogue->GetParticipantClass(ParticipantName),\n\t\t\t\tFNYNameProperty::StaticClass(),\n\t\t\t\tSuggestions,\n\t\t\t\tGetDefault<UDlgSystemSettings>()->BlacklistedReflectionClasses\n\t\t\t);\n\t\t\tFDlgHelper::SortDefault(Suggestions);\n\t\t}\n\t\tbreak;\n\n\n\tcase EDlgEventType::Event:\n\tdefault:\n\t\tUDlgManager::GetAllDialoguesEventNames(ParticipantName, Suggestions);\n\t\tbreak;\n\t}\n\n\treturn Suggestions;\n}\n\nTArray<FName> FDialogueEvent_Details::GetCurrentDialogueEventNames() const\n{\n\tif (Dialogue == nullptr)\n\t{\n\t\treturn {};\n\t}\n\n\tconst FName ParticipantName = FDialogueDetailsPanelUtils::GetParticipantNameFromPropertyHandle(ParticipantNamePropertyHandle.ToSharedRef());\n\tTSet<FName> Suggestions;\n\n\tswitch (EventType)\n\t{\n\tcase EDlgEventType::ModifyBool:\n\t\tDialogue->GetBoolNames(ParticipantName, Suggestions);\n\t\tbreak;\n\n\tcase EDlgEventType::ModifyName:\n\t\tDialogue->GetNameNames(ParticipantName, Suggestions);\n\t\tbreak;\n\n\tcase EDlgEventType::ModifyFloat:\n\t\tDialogue->GetFloatNames(ParticipantName, Suggestions);\n\t\tbreak;\n\n\tcase EDlgEventType::ModifyInt:\n\t\tDialogue->GetIntNames(ParticipantName, Suggestions);\n\t\tbreak;\n\n\tcase EDlgEventType::ModifyClassIntVariable:\n\t\tFNYReflectionHelper::GetVariableNames(\n\t\t\tDialogue->GetParticipantClass(ParticipantName),\n\t\t\tFNYIntProperty::StaticClass(),\n\t\t\tSuggestions,\n\t\t\tGetDefault<UDlgSystemSettings>()->BlacklistedReflectionClasses\n\t\t);\n\t\tbreak;\n\n\tcase EDlgEventType::ModifyClassFloatVariable:\n\t\tFNYReflectionHelper::GetVariableNames(\n\t\t\tDialogue->GetParticipantClass(ParticipantName),\n\t\t\tFNYFloatProperty::StaticClass(),\n\t\t\tSuggestions,\n\t\t\tGetDefault<UDlgSystemSettings>()->BlacklistedReflectionClasses\n\t\t);\n\t\tbreak;\n\n\tcase EDlgEventType::ModifyClassBoolVariable:\n\t\tFNYReflectionHelper::GetVariableNames(\n\t\t\tDialogue->GetParticipantClass(ParticipantName),\n\t\t\tFNYBoolProperty::StaticClass(),\n\t\t\tSuggestions,\n\t\t\tGetDefault<UDlgSystemSettings>()->BlacklistedReflectionClasses\n\t\t);\n\t\tbreak;\n\n\tcase EDlgEventType::ModifyClassNameVariable:\n\t\tFNYReflectionHelper::GetVariableNames(\n\t\t\tDialogue->GetParticipantClass(ParticipantName),\n\t\t\tFNYNameProperty::StaticClass(),\n\t\t\tSuggestions,\n\t\t\tGetDefault<UDlgSystemSettings>()->BlacklistedReflectionClasses\n\t\t);\n\t\tbreak;\n\n\tcase EDlgEventType::Event:\n\tdefault:\n\t\tDialogue->GetEvents(ParticipantName, Suggestions);\n\t\tbreak;\n\t}\n\n\tFDlgHelper::SortDefault(Suggestions);\n\treturn Suggestions.Array();\n}\n\n#undef LOCTEXT_NAMESPACE\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystemEditor/Private/DialogueEditor/DetailsPanel/DialogueEvent_Details.h",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#pragma once\n\n#include \"IPropertyTypeCustomization.h\"\n#include \"Layout/Visibility.h\"\n#include \"IDetailPropertyRow.h\"\n\n#include \"DlgEvent.h\"\n#include \"DlgManager.h\"\n#include \"DialogueDetailsPanelUtils.h\"\n\nclass FDialogueTextPropertyPickList_CustomRowHelper;\nclass FDialogueObject_CustomRowHelper;\nclass FDialogueEnumTypeWithObject_CustomRowHelper;\n\n/**\n * How the details panel renders the FDlgEvent\n * See FDlgSystemEditorModule::StartupModule for usage.\n */\nclass FDialogueEvent_Details : public IPropertyTypeCustomization\n{\n\ttypedef FDialogueEvent_Details Self;\n\npublic:\n\tstatic TSharedRef<IPropertyTypeCustomization> MakeInstance() { return MakeShared<Self>(); }\n\n\t/** IPropertyTypeCustomization interface */\n\t/**\n\t * Called when the header of the property (the row in the details panel where the property is shown)\n\t * If nothing is added to the row, the header is not displayed\n\t *\n\t * @param StructPropertyHandle\t\tHandle to the property being customized\n\t * @param HeaderRow\t\t\t\t\tA row that widgets can be added to\n\t * @param StructCustomizationUtils\tUtilities for customization\n\t */\n\tvoid CustomizeHeader(TSharedRef<IPropertyHandle> StructPropertyHandle,\n\t\tFDetailWidgetRow& HeaderRow,\n\t\tIPropertyTypeCustomizationUtils& StructCustomizationUtils) override;\n\n\t/**\n\t * Called when the children of the property should be customized or extra rows added\n\t *\n\t * @param StructPropertyHandle\t\tHandle to the property being customized\n\t * @param StructBuilder\t\t\t\tA builder for adding children\n\t * @param StructCustomizationUtils\tUtilities for customization\n\t */\n\tvoid CustomizeChildren(TSharedRef<IPropertyHandle> StructPropertyHandle,\n\t\tIDetailChildrenBuilder& StructBuilder,\n\t\tIPropertyTypeCustomizationUtils& StructCustomizationUtils) override;\n\nprivate:\n\t// Called every time the event type is changed\n\tvoid OnEventTypeChanged(bool bForceRefresh);\n\n\t// Getters for the visibility of some properties\n\tEVisibility GetEventNameVisibility() const\n\t{\n\t\treturn EventType != EDlgEventType::Custom\n\t\t\t? EVisibility::Visible : EVisibility::Hidden;\n\t}\n\n\tEVisibility GetIntValueVisibility() const\n\t{\n\t\treturn EventType == EDlgEventType::ModifyInt\n\t\t\t|| EventType == EDlgEventType::ModifyClassIntVariable\n\t\t\t? EVisibility::Visible : EVisibility::Hidden;\n\t}\n\n\tEVisibility GetFloatValueVisibility() const\n\t{\n\t\treturn EventType == EDlgEventType::ModifyFloat\n\t\t\t|| EventType == EDlgEventType::ModifyClassFloatVariable\n\t\t\t? EVisibility::Visible : EVisibility::Hidden;\n\t}\n\n\tEVisibility GetNameValueVisibility() const\n\t{\n\t\treturn EventType == EDlgEventType::ModifyName\n\t\t\t|| EventType == EDlgEventType::ModifyClassNameVariable\n\t\t\t? EVisibility::Visible : EVisibility::Hidden;\n\t}\n\n\tEVisibility GetBoolDeltaVisibility() const\n\t{\n\t\treturn EventType == EDlgEventType::ModifyInt\n\t\t\t|| EventType == EDlgEventType::ModifyFloat\n\t\t\t|| EventType == EDlgEventType::ModifyClassIntVariable\n\t\t\t|| EventType == EDlgEventType::ModifyClassFloatVariable\n\t\t\t? EVisibility::Visible : EVisibility::Hidden;\n\t}\n\n\tEVisibility GetBoolValueVisibility() const\n\t{\n\t\treturn EventType == EDlgEventType::ModifyBool\n\t\t\t|| EventType == EDlgEventType::ModifyClassBoolVariable\n\t\t\t? EVisibility::Visible : EVisibility::Hidden;\n\t}\n\n\tEVisibility GetCustomEventVisibility() const\n\t{\n\t\treturn EventType == EDlgEventType::Custom ? EVisibility::Visible : EVisibility::Hidden;\n\t}\n\n\t// Gets all the event name suggestions depending on EventType from all Dialogues.\n\tTArray<FName> GetAllDialoguesEventNames() const;\n\n\t// Gets all the event name suggestions depending on EventType from the current Dialogue\n\tTArray<FName> GetCurrentDialogueEventNames() const;\n\n\t// Gets the ParticipantNames from all Dialogues.\n\tTArray<FName> GetAllDialoguesParticipantNames() const\n\t{\n\t\tTArray<FName> OutArray;\n\t\tUDlgManager::GetAllDialoguesParticipantNames(OutArray);\n\t\treturn OutArray;\n\t}\n\n\t// Gets the current Dialogue Participant Names.\n\tTArray<FName> GetCurrentDialogueParticipantNames() const\n\t{\n\t\treturn FDialogueDetailsPanelUtils::GetDialogueSortedParticipantNames(Dialogue);\n\t}\n\n\t// Handler for when text in the editable text box changed\n\tvoid HandleTextCommitted(const FText& InSearchText, ETextCommit::Type CommitInfo) const\n\t{\n\t\tif (Dialogue)\n\t\t{\n\t\t\tDialogue->UpdateAndRefreshData();\n\t\t}\n\t}\n\nprivate:\n\t// The current Event type of the struct.\n\tEDlgEventType EventType = EDlgEventType::Event;\n\n\t// Cache the some property handles\n\tTSharedPtr<IPropertyHandle> StructPropertyHandle;\n\tTSharedPtr<IPropertyHandle> ParticipantNamePropertyHandle;\n\n\t// Cache the properties\n\tTSharedPtr<IPropertyHandle> EventTypePropertyHandle;\n\n\t// just some nice utilities\n\tTSharedPtr<IPropertyUtilities> PropertyUtils;\n\n\t// Cache the rows of the properties, created in CustomizeChildren\n\tTSharedPtr<FDialogueTextPropertyPickList_CustomRowHelper> ParticipantNamePropertyRow;\n\tTSharedPtr<FDialogueTextPropertyPickList_CustomRowHelper> EventNamePropertyRow;\n\tIDetailPropertyRow* IntValuePropertyRow = nullptr;\n\tIDetailPropertyRow* FloatValuePropertyRow = nullptr;\n\tIDetailPropertyRow* NameValuePropertyRow = nullptr;\n\tIDetailPropertyRow* BoolDeltaPropertyRow = nullptr;\n\tIDetailPropertyRow* BoolValuePropertyRow = nullptr;\n\n\tIDetailPropertyRow* CustomEventPropertyRow = nullptr;\n\tTSharedPtr<FDialogueObject_CustomRowHelper> CustomEventPropertyRow_CustomDisplay;\n\n\tIDetailPropertyRow* EventTypePropertyRow = nullptr;\n\tTSharedPtr<FDialogueEnumTypeWithObject_CustomRowHelper> EventTypePropertyRow_CustomDisplay;\n\n\t// Hold a reference to dialogue we are displaying.\n\tUDlgDialogue* Dialogue = nullptr;\n};\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystemEditor/Private/DialogueEditor/DetailsPanel/DialogueGraphNode_Details.cpp",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#include \"DialogueGraphNode_Details.h\"\n\n#include \"DetailCategoryBuilder.h\"\n#include \"DetailLayoutBuilder.h\"\n\n#include \"Nodes/DlgNode.h\"\n#include \"Nodes/DlgNode_SpeechSequence.h\"\n#include \"Nodes/DlgNode_Speech.h\"\n#include \"Nodes/DlgNode_Selector.h\"\n#include \"DialogueEditor/Nodes/DialogueGraphNode.h\"\n#include \"Widgets/SDialogueTextPropertyPickList.h\"\n#include \"Widgets/DialogueTextPropertyPickList_CustomRowHelper.h\"\n#include \"Widgets/DialogueMultiLineEditableTextBox_CustomRowHelper.h\"\n#include \"Widgets/DialogueObject_CustomRowHelper.h\"\n#include \"Widgets/Input/SButton.h\"\n\n#define LOCTEXT_NAMESPACE \"DialoguGraphNode_Details\"\n\nvoid FDialogueGraphNode_Details::CustomizeDetails(IDetailLayoutBuilder& DetailBuilder)\n{\n\tTArray<TWeakObjectPtr<UObject>> ObjectsBeingCustomized;\n\tDetailBuilder.GetObjectsBeingCustomized(ObjectsBeingCustomized);\n\n\t// Only support one object being customized\n\tif (ObjectsBeingCustomized.Num() != 1)\n\t{\n\t\treturn;\n\t}\n\n\tTWeakObjectPtr<UDialogueGraphNode> WeakGraphNode = Cast<UDialogueGraphNode>(ObjectsBeingCustomized[0].Get());\n\tif (!WeakGraphNode.IsValid())\n\t{\n\t\treturn;\n\t}\n\n\tGraphNode = WeakGraphNode.Get();\n\tif (!IsValid(GraphNode))\n\t{\n\t\treturn;\n\t}\n\n\tDetailLayoutBuilder = &DetailBuilder;\n\tDialogue = GraphNode->GetDialogue();\n\tconst UDlgNode& DialogueNode = GraphNode->GetDialogueNode();\n\tconst bool bIsRootNode = GraphNode->IsRootNode();\n\tconst bool bIsEndNode = GraphNode->IsEndNode();\n\tconst bool bIsSpeechNode = GraphNode->IsSpeechNode();\n\tconst bool bIsSelectorNode = GraphNode->IsSelectorNode();;\n\tconst bool bIsSpeechSequenceNode = GraphNode->IsSpeechSequenceNode();\n\tconst bool bIsVirtualParentNode = GraphNode->IsVirtualParentNode();\n\n\t// Hide the existing category\n\tDetailLayoutBuilder->HideCategory(UDialogueGraphNode::StaticClass()->GetFName());\n\n\t// Fill with the properties of the DialogueNode\n\tIDetailCategoryBuilder& BaseDataCategory = DetailLayoutBuilder->EditCategory(TEXT(\"Base Node\"), FText::GetEmpty(), ECategoryPriority::Important);\n\tBaseDataCategory.InitiallyCollapsed(false);\n\tconst TSharedPtr<IPropertyHandle> PropertyDialogueNode =\n\t\tDetailLayoutBuilder->GetProperty(UDialogueGraphNode::GetMemberNameDialogueNode(), UDialogueGraphNode::StaticClass());\n\n\tif (!bIsRootNode)\n\t{\n\t\t// NodeIndex\n\t\tBaseDataCategory.AddProperty(UDialogueGraphNode::GetMemberNameNodeIndex(), UDialogueGraphNode::StaticClass());\n\n\t\t// OwnerName\n\t\t{\n\t\t\tconst TSharedPtr<IPropertyHandle> ParticipantNamePropertyHandle =\n\t\t\t\tPropertyDialogueNode->GetChildHandle(UDlgNode::GetMemberNameOwnerName());\n\t\t\tFDetailWidgetRow* DetailWidgetRow = &BaseDataCategory.AddCustomRow(LOCTEXT(\"ParticipantNameSearcKey\", \"Participant Name\"));\n\n\t\t\tParticipantNamePropertyRow = MakeShared<FDialogueTextPropertyPickList_CustomRowHelper>(DetailWidgetRow, ParticipantNamePropertyHandle);\n\t\t\tParticipantNamePropertyRow->SetTextPropertyPickListWidget(\n\t\t\t\tSNew(SDialogueTextPropertyPickList)\n\t\t\t\t.AvailableSuggestions(this, &Self::GetAllDialoguesParticipantNames)\n\t\t\t\t.OnTextCommitted(this, &Self::HandleParticipantTextCommitted)\n\t\t\t\t.HasContextCheckbox(true)\n\t\t\t\t.IsContextCheckBoxChecked(true)\n\t\t\t\t.CurrentContextAvailableSuggestions(this, &Self::GetCurrentDialogueParticipantNames)\n\t\t\t)\n\t\t\t.Update();\n\t\t}\n\n\t\t// End Nodes can't have children\n\t\tif (!bIsEndNode)\n\t\t{\n\t\t\tBaseDataCategory.AddProperty(PropertyDialogueNode->GetChildHandle(UDlgNode::GetMemberNameCheckChildrenOnEvaluation()));\n\t\t}\n\n\t\tBaseDataCategory.AddProperty(PropertyDialogueNode->GetChildHandle(UDlgNode::GetMemberNameEnterConditions()))\n\t\t\t.ShouldAutoExpand(true);\n\t\tBaseDataCategory.AddProperty(PropertyDialogueNode->GetChildHandle(UDlgNode::GetMemberNameEnterEvents()))\n\t\t\t.ShouldAutoExpand(true);\n\t}\n\n\t// GUID\n\tBaseDataCategory.AddProperty(PropertyDialogueNode->GetChildHandle(UDlgNode::GetMemberNameGUID()))\n\t\t.ShouldAutoExpand(true);\n\n\tif (!bIsEndNode)\n\t{\n\t\tChildrenPropertyRow = &BaseDataCategory.AddProperty(\n\t\t\tPropertyDialogueNode->GetChildHandle(UDlgNode::GetMemberNameChildren())\n\t\t);\n\t\tChildrenPropertyRow->ShouldAutoExpand(true);\n\t\tChildrenPropertyRow->Visibility(CREATE_VISIBILITY_CALLBACK_STATIC(&FDialogueDetailsPanelUtils::GetChildrenVisibility));\n\t}\n\n\n\t// Do nothing\n\tif (bIsRootNode)\n\t{\n\t\treturn;\n\t}\n\n\t// NOTE: be careful here with the child handle names that are common. For example 'Text' so that we do not get the child\n\t// property from some inner properties\n\tif (bIsSpeechNode)\n\t{\n\t\tIDetailCategoryBuilder& SpeechCategory = DetailLayoutBuilder->EditCategory(TEXT(\"Speech Node\"));\n\t\tSpeechCategory.InitiallyCollapsed(false);\n\n\t\t// bIsVirtualParent\n\t\tIsVirtualParentPropertyHandle = PropertyDialogueNode->GetChildHandle(UDlgNode_Speech::GetMemberNameIsVirtualParent());\n\t\tIsVirtualParentPropertyHandle->SetOnPropertyValueChanged(FSimpleDelegate::CreateSP(this, &Self::OnIsVirtualParentChanged));\n\t\tSpeechCategory.AddProperty(IsVirtualParentPropertyHandle);\n\n\t\t// bVirtualParentFireDirectChildEnterEvents\n\t\tif (bIsVirtualParentNode)\n\t\t{\n\t\t\tSpeechCategory.AddProperty(PropertyDialogueNode->GetChildHandle(UDlgNode_Speech::GetMemberNameVirtualParentFireDirectChildEnterEvents()))\n\t\t\t\t.ShouldAutoExpand(true);\n\t\t}\n\n\t\t// Text\n\t\t{\n\t\t\tTextPropertyHandle = PropertyDialogueNode->GetChildHandle(UDlgNode_Speech::GetMemberNameText());\n\t\t\tFDetailWidgetRow* DetailWidgetRow = &SpeechCategory.AddCustomRow(LOCTEXT(\"TextSearchKey\", \"Text\"));\n\n\t\t\tTextPropertyRow = MakeShared<FDialogueMultiLineEditableTextBox_CustomRowHelper>(DetailWidgetRow, TextPropertyHandle);\n\t\t\tTextPropertyRow->SetPropertyUtils(DetailBuilder.GetPropertyUtilities());\n\t\t\tTextPropertyRow->Update();\n\n\t\t\tTextPropertyRow->OnTextCommittedEvent().AddRaw(this, &Self::HandleTextCommitted);\n\t\t\tTextPropertyRow->OnTextChangedEvent().AddRaw(this, &Self::HandleTextChanged);\n\t\t}\n\n\t\t// Text arguments\n\t\tSpeechCategory.AddProperty(PropertyDialogueNode->GetChildHandle(UDlgNode_Speech::GetMemberNameTextArguments()))\n\t\t\t.ShouldAutoExpand(true);\n\n\t\t//\n\t\t// Data\n\t\t//\n\n\t\tIDetailCategoryBuilder& SpeechDataCategory = DetailLayoutBuilder->EditCategory(TEXT(\"Speech Node Data\"));\n\t\tSpeechDataCategory.InitiallyCollapsed(false);\n\n\t\t// Speaker State\n\t\t{\n\t\t\tconst TSharedPtr<IPropertyHandle> SpeakerStatePropertyHandle =\n\t\t\t\tPropertyDialogueNode->GetChildHandle(UDlgNode_Speech::GetMemberNameSpeakerState());\n\n\t\t\tFDetailWidgetRow* DetailWidgetRow = &SpeechDataCategory.AddCustomRow(LOCTEXT(\"SpeakerStateSearchKey\", \"Speaker State\"));\n\n\t\t\tSpeakerStatePropertyRow = MakeShared<FDialogueTextPropertyPickList_CustomRowHelper>(DetailWidgetRow, SpeakerStatePropertyHandle);\n\t\t\tSpeakerStatePropertyRow->SetTextPropertyPickListWidget(\n\t\t\t\tSNew(SDialogueTextPropertyPickList)\n\t\t\t\t.AvailableSuggestions(this, &Self::GetAllDialoguesSpeakerStates)\n\t\t\t\t.OnTextCommitted(this, &Self::HandleSpeakerStateCommitted)\n\t\t\t\t.HasContextCheckbox(false)\n\t\t\t)\n\t\t\t.SetVisibility(CREATE_VISIBILITY_CALLBACK_STATIC(&FDialogueDetailsPanelUtils::GetSpeakerStateNodeVisibility))\n\t\t\t.Update();\n\t\t}\n\n\t\t// Node Data that can be anything set by the user\n\t\tNodeDataPropertyRow = &SpeechDataCategory.AddProperty(\n\t\t\tPropertyDialogueNode->GetChildHandle(UDlgNode_Speech::GetMemberNameNodeData())\n\t\t);\n\t\tNodeDataPropertyRow->Visibility(CREATE_VISIBILITY_CALLBACK_STATIC(&FDialogueDetailsPanelUtils::GetNodeDataVisibility));\n\t\tNodeDataPropertyRow->ShouldAutoExpand(true);\n\t\tNodeDataPropertyRow->ShowPropertyButtons(true);\n\n\t\t// Add Custom buttons\n\t\tNodeDataPropertyRow_CustomDisplay = MakeShared<FDialogueObject_CustomRowHelper>(NodeDataPropertyRow);\n\t\tNodeDataPropertyRow_CustomDisplay->Update();\n\n\t\t// SoundWave\n\t\tVoiceSoundWavePropertyRow = &SpeechDataCategory.AddProperty(\n\t\t\tPropertyDialogueNode->GetChildHandle(UDlgNode_Speech::GetMemberNameVoiceSoundWave())\n\t\t);\n\t\tVoiceSoundWavePropertyRow->Visibility(CREATE_VISIBILITY_CALLBACK_STATIC(&FDialogueDetailsPanelUtils::GetVoiceSoundWaveVisibility));\n\n\t\t// DialogueWave\n\t\tVoiceDialogueWavePropertyRow =  &SpeechDataCategory.AddProperty(\n\t\t\tPropertyDialogueNode->GetChildHandle(UDlgNode_Speech::GetMemberNameVoiceDialogueWave())\n\t\t);\n\t\tVoiceDialogueWavePropertyRow->Visibility(CREATE_VISIBILITY_CALLBACK_STATIC(&FDialogueDetailsPanelUtils::GetVoiceDialogueWaveVisibility));\n\n\t\t// Generic Data, can be FMOD sound\n\t\tGenericDataPropertyRow = &SpeechDataCategory.AddProperty(\n\t\t\tPropertyDialogueNode->GetChildHandle(UDlgNode_Speech::GetMemberNameGenericData())\n\t\t);\n\t\tGenericDataPropertyRow->Visibility(CREATE_VISIBILITY_CALLBACK_STATIC(&FDialogueDetailsPanelUtils::GetNodeGenericDataVisibility));\n\t}\n\telse if (bIsSelectorNode)\n\t{\n\t\tIDetailCategoryBuilder& SpeechDataCategory = DetailLayoutBuilder->EditCategory(TEXT(\"Selector Node\"));\n\t\tSpeechDataCategory.InitiallyCollapsed(false);\n\t\tSpeechDataCategory.AddProperty(PropertyDialogueNode->GetChildHandle(UDlgNode_Selector::GetMemberNameSelectorType()));\n\t}\n\telse if (bIsSpeechSequenceNode)\n\t{\n\t\tIDetailCategoryBuilder& SpeechSequenceDataCategory = DetailLayoutBuilder->EditCategory(TEXT(\"Speech Sequence Node\"));\n\t\tSpeechSequenceDataCategory.InitiallyCollapsed(false)\n\t\t\t.RestoreExpansionState(true);\n\t\tSpeechSequenceDataCategory.AddProperty(PropertyDialogueNode->GetChildHandle(UDlgNode_SpeechSequence::GetMemberNameSpeechSequence()))\n\t\t\t.ShouldAutoExpand(true);;\n\t}\n}\n\nvoid FDialogueGraphNode_Details::HandleTextCommitted(const FText& InText, ETextCommit::Type CommitInfo)\n{\n\t// Text arguments already handled in node post change properties\n}\n\nvoid FDialogueGraphNode_Details::HandleTextChanged(const FText& InText)\n{\n\tif (GraphNode)\n\t{\n\t\tGraphNode->GetMutableDialogueNode()->RebuildTextArgumentsFromPreview(InText);\n\t}\n}\n\n\nvoid FDialogueGraphNode_Details::OnIsVirtualParentChanged()\n{\n\tDetailLayoutBuilder->ForceRefreshDetails();\n}\n\n//////////////////////////////////////////////////////////////////////////\n\n#undef LOCTEXT_NAMESPACE\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystemEditor/Private/DialogueEditor/DetailsPanel/DialogueGraphNode_Details.h",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#pragma once\n\n#include \"PropertyEditorModule.h\"\n#include \"IDetailCustomization.h\"\n#include \"IDetailPropertyRow.h\"\n\n#include \"DlgManager.h\"\n#include \"DialogueEditor/Nodes/DialogueGraphNode.h\"\n#include \"DialogueDetailsPanelUtils.h\"\n\nclass FDialogueObject_CustomRowHelper;\nclass FDialogueTextPropertyPickList_CustomRowHelper;\nclass FDialogueMultiLineEditableTextBox_CustomRowHelper;\n\n/**\n * How the details customization panel looks for UDialogueGraphNode object\n * See FDlgSystemEditorModule::StartupModule for usage.\n */\nclass FDialogueGraphNode_Details : public IDetailCustomization\n{\n\ttypedef FDialogueGraphNode_Details Self;\n\npublic:\n\t// Makes a new instance of this detail layout class for a specific detail view requesting it\n\tstatic TSharedRef<IDetailCustomization> MakeInstance() { return MakeShared<Self>(); }\n\n\t// IDetailCustomization interface\n\t/** Called when details should be customized */\n\tvoid CustomizeDetails(IDetailLayoutBuilder& DetailBuilder) override;\n\nprivate:\n\t/** Handler for when the text is changed */\n\tvoid HandleTextCommitted(const FText& InText, ETextCommit::Type CommitInfo);\n\tvoid HandleTextChanged(const FText& InText);\n\n\n\t/** Gets the ParticipantNames from all Dialogues. */\n\tTArray<FName> GetAllDialoguesParticipantNames() const\n\t{\n\t\tTArray<FName> OutArray;\n\t\tUDlgManager::GetAllDialoguesParticipantNames(OutArray);\n\t\treturn OutArray;\n\t}\n\n\t/** Gets the current Dialogue Participant Names. */\n\tTArray<FName> GetCurrentDialogueParticipantNames() const\n\t{\n\t\treturn FDialogueDetailsPanelUtils::GetDialogueSortedParticipantNames(Dialogue);\n\t}\n\n\t/** Gets the Speaker States from all Dialogues. */\n\tTArray<FName> GetAllDialoguesSpeakerStates() const\n\t{\n\t\tTArray<FName> OutArray;\n\t\tUDlgManager::GetAllDialoguesSpeakerStates(OutArray);\n\t\treturn OutArray;\n\t}\n\n\t/** Handler for when text in the editable text box changed */\n\tvoid HandleParticipantTextCommitted(const FText& InSearchText, ETextCommit::Type CommitInfo)\n\t{\n\t\tDialogue->UpdateAndRefreshData();\n\t}\n\n\t/** Handler for when the speaker state is changed */\n\tvoid HandleSpeakerStateCommitted(const FText& InSearchText, ETextCommit::Type CommitInfo)\n\t{\n\t\tDialogue->UpdateAndRefreshData();\n\t}\n\n\t// The IsVirtualParent property changed\n\tvoid OnIsVirtualParentChanged();\n\nprivate:\n\t/** Hold the reference to the Graph Node this represents */\n\tUDialogueGraphNode* GraphNode = nullptr;\n\n\t/** Cache some properties. */\n\t// Property Handles\n\tTSharedPtr<IPropertyHandle> IsVirtualParentPropertyHandle;\n\tTSharedPtr<IPropertyHandle> TextPropertyHandle;\n\n\t// Property rows\n\tTSharedPtr<FDialogueTextPropertyPickList_CustomRowHelper> ParticipantNamePropertyRow;\n\tTSharedPtr<FDialogueTextPropertyPickList_CustomRowHelper> SpeakerStatePropertyRow;\n\tTSharedPtr<FDialogueMultiLineEditableTextBox_CustomRowHelper> TextPropertyRow;\n\tIDetailPropertyRow* NodeDataPropertyRow = nullptr;\n\tTSharedPtr<FDialogueObject_CustomRowHelper> NodeDataPropertyRow_CustomDisplay;\n\tIDetailPropertyRow* VoiceSoundWavePropertyRow = nullptr;\n\tIDetailPropertyRow* VoiceDialogueWavePropertyRow = nullptr;\n\tIDetailPropertyRow* GenericDataPropertyRow = nullptr;\n\tIDetailPropertyRow* ChildrenPropertyRow = nullptr;\n\n\t/** The details panel layout builder reference. */\n\tIDetailLayoutBuilder* DetailLayoutBuilder = nullptr;\n\n\t/** Hold a reference to dialogue we are displaying. */\n\tUDlgDialogue* Dialogue = nullptr;\n};\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystemEditor/Private/DialogueEditor/DetailsPanel/DialogueNode_Details.cpp",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#include \"DialogueNode_Details.h\"\n\n#include \"DetailCategoryBuilder.h\"\n#include \"DetailLayoutBuilder.h\"\n#include \"IPropertyUtilities.h\"\n#include \"Widgets/Text/STextBlock.h\"\n#include \"DetailWidgetRow.h\"\n\n#include \"Nodes/DlgNode.h\"\n#include \"DialogueEditor/Nodes/DialogueGraphNode.h\"\n\n#define LOCTEXT_NAMESPACE \"DialogueNode_Details\"\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// FDialogueNode_Details\nvoid FDialogueNode_Details::CustomizeDetails(IDetailLayoutBuilder& DetailBuilder)\n{\n\tTArray<TWeakObjectPtr<UObject>> ObjectsBeingCustomized;\n\tDetailBuilder.GetObjectsBeingCustomized(ObjectsBeingCustomized);\n\t// Only support one object being customized\n\tif (ObjectsBeingCustomized.Num() != 1)\n\t{\n\t\treturn;\n\t}\n\n\t// NOTE currently not used, see FDialogueGraphNodeDetails\n\tIDetailCategoryBuilder& DataCategory = DetailBuilder.EditCategory(TEXT(\"Do we need this?\"));\n\tDataCategory.InitiallyCollapsed(false);\n\tDataCategory.AddCustomRow(NSLOCTEXT(\"TEST\", \"MyWarningRowFilterString\", \"Search Filter Keywords\"))\n\t\t.Visibility(EVisibility::Visible)\n\t\t.WholeRowContent()\n\t\t[\n\t\t\tSNew(STextBlock)\n\t\t\t.Text(LOCTEXT(\"MyWarningTest\", \"BaseString should not be empty!\"))\n\t\t];\n}\n\n#undef LOCTEXT_NAMESPACE\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystemEditor/Private/DialogueEditor/DetailsPanel/DialogueNode_Details.h",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#pragma once\n\n#include \"CoreMinimal.h\"\n#include \"IDetailCustomization.h\"\n\n/**\n * How the details customization panel looks for the UDlgNode (and derived types)\n * See FDlgSystemEditorModule::StartupModule for usage.\n */\nclass FDialogueNode_Details : public IDetailCustomization\n{\n\ttypedef FDialogueNode_Details Self;\n\npublic:\n\t// Makes a new instance of this detail layout class for a specific detail view requesting it\n\tstatic TSharedRef<IDetailCustomization> MakeInstance() { return MakeShared<Self>(); }\n\n\t// IDetailCustomization interface\n\t/** Called when details should be customized */\n\tvoid CustomizeDetails(IDetailLayoutBuilder& DetailBuilder) override;\n};\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystemEditor/Private/DialogueEditor/DetailsPanel/DialogueSpeechSequenceEntry_Details.cpp",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#include \"DialogueSpeechSequenceEntry_Details.h\"\n\n#include \"IPropertyUtilities.h\"\n#include \"IDetailChildrenBuilder.h\"\n\n#include \"DialogueDetailsPanelUtils.h\"\n#include \"DialogueEditor/Nodes/DialogueGraphNode.h\"\n#include \"Widgets/SDialogueTextPropertyPickList.h\"\n#include \"Widgets/DialogueTextPropertyPickList_CustomRowHelper.h\"\n#include \"Widgets/DialogueMultiLineEditableTextBox_CustomRowHelper.h\"\n\n#define LOCTEXT_NAMESPACE \"DialogueSpeechSequenceEntry_Details\"\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// FDialogueSpeechSequenceEntry_Details\nvoid FDialogueSpeechSequenceEntry_Details::CustomizeHeader(TSharedRef<IPropertyHandle> InStructPropertyHandle,\n\tFDetailWidgetRow& HeaderRow, IPropertyTypeCustomizationUtils& StructCustomizationUtils)\n{\n\tStructPropertyHandle = InStructPropertyHandle;\n\tDialogue = FDialogueDetailsPanelUtils::GetDialogueFromPropertyHandle(StructPropertyHandle.ToSharedRef());\n\n\tconst bool bShowOnlyInnerProperties = StructPropertyHandle->GetProperty()->HasMetaData(META_ShowOnlyInnerProperties);\n\tif (!bShowOnlyInnerProperties)\n\t{\n\t\tHeaderRow.NameContent()\n\t\t\t[\n\t\t\t\tStructPropertyHandle->CreatePropertyNameWidget()\n\t\t\t];\n\t}\n}\n\nvoid FDialogueSpeechSequenceEntry_Details::CustomizeChildren(TSharedRef<IPropertyHandle> InStructPropertyHandle,\n\tIDetailChildrenBuilder& StructBuilder, IPropertyTypeCustomizationUtils& StructCustomizationUtils)\n{\n\tconst bool bHasDialogue = Dialogue != nullptr;\n\n\t// Speaker\n\t{\n\t\tconst TSharedPtr<IPropertyHandle> ParticipantNamePropertyHandle =\n\t\t\tStructPropertyHandle->GetChildHandle(GET_MEMBER_NAME_CHECKED(FDlgSpeechSequenceEntry, Speaker));\n\t\tFDetailWidgetRow* DetailWidgetRow = &StructBuilder.AddCustomRow(LOCTEXT(\"ParticipantNameSearchKey\", \"Participant Name\"));\n\n\t\tParticipantNamePropertyRow = MakeShared<FDialogueTextPropertyPickList_CustomRowHelper>(DetailWidgetRow, ParticipantNamePropertyHandle);\n\t\tParticipantNamePropertyRow->SetTextPropertyPickListWidget(\n\t\t\tSNew(SDialogueTextPropertyPickList)\n\t\t\t.AvailableSuggestions(this, &Self::GetAllDialoguesParticipantNames)\n\t\t\t.OnTextCommitted(this, &Self::HandleTextCommitted)\n\t\t\t.HasContextCheckbox(bHasDialogue)\n\t\t\t.IsContextCheckBoxChecked(true)\n\t\t\t.CurrentContextAvailableSuggestions(this, &Self::GetCurrentDialogueParticipantNames)\n\t\t)\n\t\t.Update();\n\t}\n\n\t// Text\n\t{\n\t\tTextPropertyHandle = StructPropertyHandle->GetChildHandle(GET_MEMBER_NAME_CHECKED(FDlgSpeechSequenceEntry, Text));\n\t\tFDetailWidgetRow* DetailWidgetRow = &StructBuilder.AddCustomRow(LOCTEXT(\"TextSearchKey\", \"Text\"));\n\n\t\tTextPropertyRow = MakeShared<FDialogueMultiLineEditableTextBox_CustomRowHelper>(DetailWidgetRow, TextPropertyHandle);\n\t\tTextPropertyRow->SetPropertyUtils(StructCustomizationUtils.GetPropertyUtilities());\n\t\tTextPropertyRow->Update();\n\t}\n\n\n\t// Edge Text\n\t{\n\t\tEdgeTextPropertyHandle = StructPropertyHandle->GetChildHandle(GET_MEMBER_NAME_CHECKED(FDlgSpeechSequenceEntry, EdgeText));\n\t\tFDetailWidgetRow* DetailWidgetRow = &StructBuilder.AddCustomRow(LOCTEXT(\"EdgeTextSearchKey\", \"Edge Text\"));\n\n\t\tEdgeTextPropertyRow = MakeShared<FDialogueMultiLineEditableTextBox_CustomRowHelper>(DetailWidgetRow, EdgeTextPropertyHandle);\n\t\tEdgeTextPropertyRow->SetPropertyUtils(StructCustomizationUtils.GetPropertyUtilities());\n\t\tEdgeTextPropertyRow->Update();\n\t}\n\n\t//\n\t// Data\n\t//\n\n\t// Speaker State\n\t{\n\t\tconst TSharedPtr<IPropertyHandle> SpeakerStatePropertyHandle =\n\t\t\tStructPropertyHandle->GetChildHandle(GET_MEMBER_NAME_CHECKED(FDlgSpeechSequenceEntry, SpeakerState));\n\n\t\tFDetailWidgetRow* DetailWidgetRow = &StructBuilder.AddCustomRow(LOCTEXT(\"SpeakerStateSearchKey\", \"Speaker State\"));\n\n\t\tSpeakerStatePropertyRow = MakeShared<FDialogueTextPropertyPickList_CustomRowHelper>(DetailWidgetRow, SpeakerStatePropertyHandle);\n\t\tSpeakerStatePropertyRow->SetTextPropertyPickListWidget(\n\t\t\tSNew(SDialogueTextPropertyPickList)\n\t\t\t.AvailableSuggestions(this, &Self::GetAllDialoguesSpeakerStates)\n\t\t\t.OnTextCommitted(this, &Self::HandleTextCommitted)\n\t\t\t.HasContextCheckbox(false)\n\t\t)\n\t\t.SetVisibility(CREATE_VISIBILITY_CALLBACK_STATIC(&FDialogueDetailsPanelUtils::GetSpeakerStateNodeVisibility))\n\t\t.Update();\n\t}\n\n\t// Node Data that can be anything set by the user\n\tNodeDataPropertyRow = &StructBuilder.AddProperty(\n\t\tStructPropertyHandle->GetChildHandle(GET_MEMBER_NAME_CHECKED(FDlgSpeechSequenceEntry, NodeData)).ToSharedRef());\n\tNodeDataPropertyRow->Visibility(CREATE_VISIBILITY_CALLBACK_STATIC(&FDialogueDetailsPanelUtils::GetNodeDataVisibility));\n\n\t// SoundWave\n\tVoiceSoundWavePropertyRow = &StructBuilder.AddProperty(\n\t\tStructPropertyHandle->GetChildHandle(GET_MEMBER_NAME_CHECKED(FDlgSpeechSequenceEntry, VoiceSoundWave)).ToSharedRef());\n\tVoiceSoundWavePropertyRow->Visibility(CREATE_VISIBILITY_CALLBACK_STATIC(&FDialogueDetailsPanelUtils::GetVoiceSoundWaveVisibility));\n\n\t// DialogueWave\n\tVoiceDialogueWavePropertyRow = &StructBuilder.AddProperty(\n\t\tStructPropertyHandle->GetChildHandle(GET_MEMBER_NAME_CHECKED(FDlgSpeechSequenceEntry, VoiceDialogueWave)).ToSharedRef());\n\tVoiceDialogueWavePropertyRow->Visibility(CREATE_VISIBILITY_CALLBACK_STATIC(&FDialogueDetailsPanelUtils::GetVoiceDialogueWaveVisibility));\n\n\t// Generic Data, can be FMOD sound\n\tGenericDataPropertyRow = &StructBuilder.AddProperty(\n\t\tStructPropertyHandle->GetChildHandle(GET_MEMBER_NAME_CHECKED(FDlgSpeechSequenceEntry, GenericData)).ToSharedRef());\n\tGenericDataPropertyRow->Visibility(CREATE_VISIBILITY_CALLBACK_STATIC(&FDialogueDetailsPanelUtils::GetNodeGenericDataVisibility));\n}\n\n#undef LOCTEXT_NAMESPACE\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystemEditor/Private/DialogueEditor/DetailsPanel/DialogueSpeechSequenceEntry_Details.h",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#pragma once\n\n#include \"IPropertyTypeCustomization.h\"\n#include \"Layout/Visibility.h\"\n#include \"IDetailPropertyRow.h\"\n\n#include \"DlgManager.h\"\n#include \"DialogueDetailsPanelUtils.h\"\n\nclass FDialogueTextPropertyPickList_CustomRowHelper;\nclass FDialogueMultiLineEditableTextBox_CustomRowHelper;\n\n/**\n* How the details customization panel looks for the FDlgSpeechSequenceEntry\n* See FDlgSystemEditorModule::StartupModule for usage.\n*/\nclass FDialogueSpeechSequenceEntry_Details : public IPropertyTypeCustomization\n{\n\ttypedef FDialogueSpeechSequenceEntry_Details Self;\n\npublic:\n\tstatic TSharedRef<IPropertyTypeCustomization> MakeInstance() { return MakeShared<Self>(); }\n\n\t/** IPropertyTypeCustomization interface */\n\t/**\n\t * Called when the header of the property (the row in the details panel where the property is shown)\n\t * If nothing is added to the row, the header is not displayed\n\t *\n\t * @param StructPropertyHandle\t\tHandle to the property being customized\n\t * @param HeaderRow\t\t\t\t\tA row that widgets can be added to\n\t * @param StructCustomizationUtils\tUtilities for customization\n\t */\n\tvoid CustomizeHeader(TSharedRef<IPropertyHandle> StructPropertyHandle,\n\t\tFDetailWidgetRow& HeaderRow,\n\t\tIPropertyTypeCustomizationUtils& StructCustomizationUtils) override;\n\n\t/**\n\t * Called when the children of the property should be customized or extra rows added\n\t *\n\t * @param StructPropertyHandle\t\tHandle to the property being customized\n\t * @param StructBuilder\t\t\t\tA builder for adding children\n\t * @param StructCustomizationUtils\tUtilities for customization\n\t */\n\tvoid CustomizeChildren(TSharedRef<IPropertyHandle> StructPropertyHandle,\n\t\tIDetailChildrenBuilder& StructBuilder,\n\t\tIPropertyTypeCustomizationUtils& StructCustomizationUtils) override;\n\nprivate:\n\t/** Gets the ParticipantNames from all Dialogues. */\n\tTArray<FName> GetAllDialoguesParticipantNames() const\n\t{\n\t\tTArray<FName> OutArray;\n\t\tUDlgManager::GetAllDialoguesParticipantNames(OutArray);\n\t\treturn OutArray;\n\t}\n\n\t/** Gets the Speaker States from all Dialogues. */\n\tTArray<FName> GetAllDialoguesSpeakerStates() const\n\t{\n\t\tTArray<FName> OutArray;\n\t\tUDlgManager::GetAllDialoguesSpeakerStates(OutArray);\n\t\treturn OutArray;\n\t}\n\n\t/** Gets the current Dialogue Participant Names. */\n\tTArray<FName> GetCurrentDialogueParticipantNames() const\n\t{\n\t\treturn FDialogueDetailsPanelUtils::GetDialogueSortedParticipantNames(Dialogue);\n\t}\n\n\t/** Handler for when text in the editable text box changed */\n\tvoid HandleTextCommitted(const FText& InSearchText, ETextCommit::Type CommitInfo) const\n\t{\n\t\tif (Dialogue)\n\t\t{\n\t\t\tDialogue->UpdateAndRefreshData();\n\t\t}\n\t}\n\nprivate:\n\t/** The property handle of the entire struct. */\n\tTSharedPtr<IPropertyHandle> StructPropertyHandle;\n\n\t// Cache the rows of the properties, created in CustomizeChildren\n\tTSharedPtr<IPropertyHandle> TextPropertyHandle;\n\tTSharedPtr<IPropertyHandle> EdgeTextPropertyHandle;\n\n\tTSharedPtr<FDialogueTextPropertyPickList_CustomRowHelper> ParticipantNamePropertyRow;\n\tTSharedPtr<FDialogueTextPropertyPickList_CustomRowHelper> SpeakerStatePropertyRow;\n\tIDetailPropertyRow* VoiceSoundWavePropertyRow = nullptr;\n\tIDetailPropertyRow* VoiceDialogueWavePropertyRow = nullptr;\n\tIDetailPropertyRow* GenericDataPropertyRow = nullptr;\n\tIDetailPropertyRow* NodeDataPropertyRow = nullptr;\n\tTSharedPtr<FDialogueMultiLineEditableTextBox_CustomRowHelper> TextPropertyRow;\n\tTSharedPtr<FDialogueMultiLineEditableTextBox_CustomRowHelper> EdgeTextPropertyRow;\n\n\t/** Hold a reference to dialogue we are displaying. */\n\tUDlgDialogue* Dialogue = nullptr;\n};\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystemEditor/Private/DialogueEditor/DetailsPanel/DialogueTextArgument_Details.cpp",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#include \"DialogueTextArgument_Details.h\"\n\n#include \"IDetailPropertyRow.h\"\n#include \"IPropertyUtilities.h\"\n#include \"IDetailChildrenBuilder.h\"\n#include \"UObject/TextProperty.h\"\n\n#include \"NYReflectionHelper.h\"\n#include \"DialogueDetailsPanelUtils.h\"\n#include \"DialogueEditor/Nodes/DialogueGraphNode.h\"\n#include \"Widgets/SDialogueTextPropertyPickList.h\"\n#include \"Widgets/DialogueTextPropertyPickList_CustomRowHelper.h\"\n#include \"DlgHelper.h\"\n#include \"Widgets/DialogueObject_CustomRowHelper.h\"\n\n#define LOCTEXT_NAMESPACE \"DialogueTextArgument_Details\"\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// FDialogueEventCustomization\nvoid FDialogueTextArgument_Details::CustomizeHeader(TSharedRef<IPropertyHandle> InStructPropertyHandle,\n\tFDetailWidgetRow& HeaderRow, IPropertyTypeCustomizationUtils& StructCustomizationUtils)\n{\n\tStructPropertyHandle = InStructPropertyHandle;\n\tDialogue = FDialogueDetailsPanelUtils::GetDialogueFromPropertyHandle(StructPropertyHandle.ToSharedRef());\n\tPropertyUtils = StructCustomizationUtils.GetPropertyUtilities();\n\n\t// Cache the Property Handle for the ArgumentType\n\tParticipantNamePropertyHandle = StructPropertyHandle->GetChildHandle(GET_MEMBER_NAME_CHECKED(FDlgTextArgument, ParticipantName));\n\tArgumentTypePropertyHandle = StructPropertyHandle->GetChildHandle(GET_MEMBER_NAME_CHECKED(FDlgTextArgument, Type));\n\tcheck(ParticipantNamePropertyHandle.IsValid());\n\tcheck(ArgumentTypePropertyHandle.IsValid());\n\n\t// Register handler for event type change\n\tArgumentTypePropertyHandle->SetOnPropertyValueChanged(\n\t\tFSimpleDelegate::CreateSP(this, &Self::OnArgumentTypeChanged, true));\n\n\tconst bool bShowOnlyInnerProperties = StructPropertyHandle->GetProperty()->HasMetaData(META_ShowOnlyInnerProperties);\n\tif (!bShowOnlyInnerProperties)\n\t{\n\t\tHeaderRow.NameContent()\n\t\t\t[\n\t\t\t\tStructPropertyHandle->CreatePropertyNameWidget()\n\t\t\t];\n\t}\n}\n\nvoid FDialogueTextArgument_Details::CustomizeChildren(TSharedRef<IPropertyHandle> InStructPropertyHandle,\n\tIDetailChildrenBuilder& StructBuilder, IPropertyTypeCustomizationUtils& StructCustomizationUtils)\n{\n\tconst bool bHasDialogue = Dialogue != nullptr;\n\n\t// DisplayString\n\tStructBuilder.AddProperty(StructPropertyHandle->GetChildHandle(GET_MEMBER_NAME_CHECKED(FDlgTextArgument, DisplayString)).ToSharedRef());\n\n\t// ParticipantName\n\t{\n\t\tFDetailWidgetRow* DetailWidgetRow = &StructBuilder.AddCustomRow(LOCTEXT(\"ParticipantNameSearchKey\", \"Participant Name\"));\n\n\t\tParticipantNamePropertyRow = MakeShared<FDialogueTextPropertyPickList_CustomRowHelper>(DetailWidgetRow, ParticipantNamePropertyHandle);\n\t\tParticipantNamePropertyRow->SetTextPropertyPickListWidget(\n\t\t\tSNew(SDialogueTextPropertyPickList)\n\t\t\t.AvailableSuggestions(this, &Self::GetAllDialoguesParticipantNames)\n\t\t\t.OnTextCommitted(this, &Self::HandleTextCommitted)\n\t\t\t.HasContextCheckbox(bHasDialogue)\n\t\t\t.IsContextCheckBoxChecked(true)\n\t\t\t.CurrentContextAvailableSuggestions(this, &Self::GetCurrentDialogueParticipantNames)\n\t\t)\n\t\t.Update();\n\t}\n\n\t// ArgumentType\n\tStructBuilder.AddProperty(ArgumentTypePropertyHandle.ToSharedRef());\n\n\t// VariableName\n\t{\n\t\tconst TSharedPtr<IPropertyHandle> VariableNamePropertyHandle = StructPropertyHandle->GetChildHandle(\n\t\t\tGET_MEMBER_NAME_CHECKED(FDlgTextArgument, VariableName)\n\t\t);\n\t\tFDetailWidgetRow* DetailWidgetRow = &StructBuilder.AddCustomRow(LOCTEXT(\"VariableNameSearchKey\", \"Variable Name\"));\n\n\t\tVariableNamePropertyRow = MakeShared<FDialogueTextPropertyPickList_CustomRowHelper>(DetailWidgetRow, VariableNamePropertyHandle);\n\t\tVariableNamePropertyRow->SetTextPropertyPickListWidget(\n\t\t\t\tSNew(SDialogueTextPropertyPickList)\n\t\t\t\t.AvailableSuggestions(this, &Self::GetAllDialoguesVariableNames)\n\t\t\t\t.OnTextCommitted(this, &Self::HandleTextCommitted)\n\t\t\t\t.HasContextCheckbox(bHasDialogue)\n\t\t\t\t.IsContextCheckBoxChecked(false)\n\t\t\t\t.CurrentContextAvailableSuggestions(this, &Self::GetCurrentDialogueVariableNames)\n\t\t);\n\t\tVariableNamePropertyRow->SetVisibility(CREATE_VISIBILITY_CALLBACK(&Self::GetVariableNameVisibility));\n\t\tVariableNamePropertyRow->Update();\n\t}\n\n\t// CustomTextArgument\n\t{\n\t\tCustomTextArgumentPropertyRow = &StructBuilder.AddProperty(\n\t\t\tStructPropertyHandle->GetChildHandle(GET_MEMBER_NAME_CHECKED(FDlgTextArgument, CustomTextArgument)).ToSharedRef()\n\t\t);\n\t\tCustomTextArgumentPropertyRow->Visibility(CREATE_VISIBILITY_CALLBACK(&Self::GetCustomTextArgumentVisibility));\n\n\t\t// Add Custom buttons\n\t\tCustomTextArgumentPropertyRow_CustomDisplay = MakeShared<FDialogueObject_CustomRowHelper>(CustomTextArgumentPropertyRow);\n\t\tCustomTextArgumentPropertyRow_CustomDisplay->Update();\n\t\tCustomTextArgumentPropertyRow_CustomDisplay->SetFunctionNameToOpen(\n\t\t\tEDialogueBlueprintOpenType::Function,\n\t\t\tGET_FUNCTION_NAME_CHECKED(UDlgTextArgumentCustom, GetText)\n\t\t);\n\t}\n\n\t// Cache the initial event type\n\tOnArgumentTypeChanged(false);\n}\n\nvoid FDialogueTextArgument_Details::OnArgumentTypeChanged(bool bForceRefresh)\n{\n\t// Update to the new type\n\tuint8 Value = 0;\n\tif (ArgumentTypePropertyHandle->GetValue(Value) != FPropertyAccess::Success)\n\t{\n\t\treturn;\n\t}\n\tArgumentType = static_cast<EDlgTextArgumentType>(Value);\n\n\t// Refresh the view, without this some names/tooltips won't get refreshed\n\tif (bForceRefresh && PropertyUtils.IsValid())\n\t{\n\t\tPropertyUtils->ForceRefresh();\n\t}\n}\n\nTArray<FName> FDialogueTextArgument_Details::GetDialogueVariableNames(bool bCurrentOnly) const\n{\n\tTArray<FName> Suggestions;\n\tconst FName ParticipantName = FDialogueDetailsPanelUtils::GetParticipantNameFromPropertyHandle(ParticipantNamePropertyHandle.ToSharedRef());\n\n\tswitch (ArgumentType)\n\t{\n\t\tcase EDlgTextArgumentType::DialogueInt:\n\t\t\tif (bCurrentOnly && Dialogue)\n\t\t\t{\n\t\t\t\tTSet<FName> SuggestionsSet;\n\t\t\t\tDialogue->GetIntNames(ParticipantName, SuggestionsSet);\n\t\t\t\tSuggestions = SuggestionsSet.Array();\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tUDlgManager::GetAllDialoguesIntNames(ParticipantName, Suggestions);\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase EDlgTextArgumentType::ClassInt:\n\t\t\tFNYReflectionHelper::GetVariableNames(\n\t\t\t\tDialogue->GetParticipantClass(ParticipantName),\n\t\t\t\tFNYIntProperty::StaticClass(),\n\t\t\t\tSuggestions,\n\t\t\t\tGetDefault<UDlgSystemSettings>()->BlacklistedReflectionClasses\n\t\t\t);\n\t\t\tbreak;\n\n\t\tcase EDlgTextArgumentType::DialogueFloat:\n\t\t\tif (bCurrentOnly && Dialogue)\n\t\t\t{\n\t\t\t\tTSet<FName> SuggestionsSet;\n\t\t\t\tDialogue->GetFloatNames(ParticipantName, SuggestionsSet);\n\t\t\t\tSuggestions = SuggestionsSet.Array();\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tUDlgManager::GetAllDialoguesFloatNames(ParticipantName, Suggestions);\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase EDlgTextArgumentType::ClassFloat:\n\t\t\tif (Dialogue)\n\t\t\t{\n\t\t\t\tFNYReflectionHelper::GetVariableNames(\n\t\t\t\t\tDialogue->GetParticipantClass(ParticipantName),\n\t\t\t\t\tFNYFloatProperty::StaticClass(),\n\t\t\t\t\tSuggestions,\n\t\t\t\t\tGetDefault<UDlgSystemSettings>()->BlacklistedReflectionClasses\n\t\t\t\t);\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase EDlgTextArgumentType::ClassText:\n\t\t\tif (Dialogue)\n\t\t\t{\n\t\t\t\tFNYReflectionHelper::GetVariableNames(\n\t\t\t\t\tDialogue->GetParticipantClass(ParticipantName),\n\t\t\t\t\tFNYTextProperty::StaticClass(),\n\t\t\t\t\tSuggestions,\n\t\t\t\t\tGetDefault<UDlgSystemSettings>()->BlacklistedReflectionClasses\n\t\t\t\t);\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase EDlgTextArgumentType::DisplayName:\n\t\tdefault:\n\t\t\tbreak;\n\t}\n\tFDlgHelper::SortDefault(Suggestions);\n\treturn Suggestions;\n}\n\n#undef LOCTEXT_NAMESPACE\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystemEditor/Private/DialogueEditor/DetailsPanel/DialogueTextArgument_Details.h",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#pragma once\n\n#include \"IPropertyTypeCustomization.h\"\n#include \"Layout/Visibility.h\"\n\n#include \"DlgTextArgument.h\"\n#include \"DialogueDetailsPanelUtils.h\"\n#include \"DlgManager.h\"\n\nclass FDialogueTextPropertyPickList_CustomRowHelper;\nclass IDetailPropertyRow;\nclass FDialogueObject_CustomRowHelper;\n\n/**\n * How the details panel renders the FDlgTextArgument\n * See FDlgSystemEditorModule::StartupModule for usage.\n */\nclass FDialogueTextArgument_Details : public IPropertyTypeCustomization\n{\n\ttypedef FDialogueTextArgument_Details Self;\n\npublic:\n\tstatic TSharedRef<IPropertyTypeCustomization> MakeInstance() { return MakeShared<Self>(); }\n\n\t/** IPropertyTypeCustomization interface */\n\t/**\n\t * Called when the header of the property (the row in the details panel where the property is shown)\n\t * If nothing is added to the row, the header is not displayed\n\t *\n\t * @param StructPropertyHandle\t\tHandle to the property being customized\n\t * @param HeaderRow\t\t\t\t\tA row that widgets can be added to\n\t * @param StructCustomizationUtils\tUtilities for customization\n\t */\n\tvoid CustomizeHeader(TSharedRef<IPropertyHandle> StructPropertyHandle,\n\t\tFDetailWidgetRow& HeaderRow,\n\t\tIPropertyTypeCustomizationUtils& StructCustomizationUtils) override;\n\n\t/**\n\t * Called when the children of the property should be customized or extra rows added\n\t *\n\t * @param StructPropertyHandle\t\tHandle to the property being customized\n\t * @param StructBuilder\t\t\t\tA builder for adding children\n\t * @param StructCustomizationUtils\tUtilities for customization\n\t */\n\tvoid CustomizeChildren(TSharedRef<IPropertyHandle> StructPropertyHandle,\n\t\tIDetailChildrenBuilder& StructBuilder,\n\t\tIPropertyTypeCustomizationUtils& StructCustomizationUtils) override;\n\nprivate:\n\t// Called every time the event type is changed\n\tvoid OnArgumentTypeChanged(bool bForceRefresh);\n\n\t// Getters for the visibility of some properties\n\tEVisibility GetVariableNameVisibility() const\n\t{\n\t\treturn ArgumentType != EDlgTextArgumentType::DisplayName &&\n\t\t\t   ArgumentType != EDlgTextArgumentType::Gender &&\n\t\t\t   ArgumentType != EDlgTextArgumentType::Custom\n\t\t\t   ? EVisibility::Visible : EVisibility::Hidden;\n\t}\n\tEVisibility GetCustomTextArgumentVisibility() const\n\t{\n\t\treturn ArgumentType == EDlgTextArgumentType::Custom ? EVisibility::Visible : EVisibility::Hidden;\n\t}\n\n\t/** Gets all the event name suggestions depending on EventType from all Dialogues. */\n\tTArray<FName> GetAllDialoguesVariableNames() const\n\t{\n\t\treturn GetDialogueVariableNames(false);\n\t}\n\n\t/** Gets all the event name suggestions depending on EventType from the current Dialogue */\n\tTArray<FName> GetCurrentDialogueVariableNames() const\n\t{\n\t\treturn GetDialogueVariableNames(true);\n\t}\n\n\tTArray<FName> GetDialogueVariableNames(bool bCurrentOnly) const;\n\n\n\t/** Gets the ParticipantNames from all Dialogues. */\n\tTArray<FName> GetAllDialoguesParticipantNames() const\n\t{\n\t\tTArray<FName> OutArray;\n\t\tUDlgManager::GetAllDialoguesParticipantNames(OutArray);\n\t\treturn OutArray;\n\t}\n\n\t/** Gets the current Dialogue Participant Names. */\n\tTArray<FName> GetCurrentDialogueParticipantNames() const\n\t{\n\t\treturn FDialogueDetailsPanelUtils::GetDialogueSortedParticipantNames(Dialogue);\n\t}\n\n\t/** Handler for when text in the editable text box changed */\n\tvoid HandleTextCommitted(const FText& InSearchText, ETextCommit::Type CommitInfo) const\n\t{\n\t\tif (Dialogue)\n\t\t{\n\t\t\tDialogue->UpdateAndRefreshData();\n\t\t}\n\t}\n\nprivate:\n\t// The current Event type of the struct.\n\tEDlgTextArgumentType ArgumentType = EDlgTextArgumentType::DisplayName;\n\n\t// Cache the some property handles\n\tTSharedPtr<IPropertyHandle> StructPropertyHandle;\n\tTSharedPtr<IPropertyHandle> ParticipantNamePropertyHandle;\n\n\t// Cache the properties\n\tTSharedPtr<IPropertyHandle> ArgumentTypePropertyHandle;\n\n\t// just some nice utilities\n\tTSharedPtr<IPropertyUtilities> PropertyUtils;\n\n\t// Cache the rows of the properties, created in CustomizeChildren\n\tTSharedPtr<FDialogueTextPropertyPickList_CustomRowHelper> ParticipantNamePropertyRow;\n\tTSharedPtr<FDialogueTextPropertyPickList_CustomRowHelper> VariableNamePropertyRow;\n\tIDetailPropertyRow* CustomTextArgumentPropertyRow = nullptr;\n\tTSharedPtr<FDialogueObject_CustomRowHelper> CustomTextArgumentPropertyRow_CustomDisplay;\n\n\t/** Hold a reference to dialogue we are displaying. */\n\tUDlgDialogue* Dialogue = nullptr;\n};\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystemEditor/Private/DialogueEditor/DetailsPanel/Dialogue_Details.cpp",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#include \"Dialogue_Details.h\"\n\n#include \"DetailCategoryBuilder.h\"\n#include \"DetailLayoutBuilder.h\"\n\n#include \"DlgDialogue.h\"\n\n#define LOCTEXT_NAMESPACE \"Dialogue_Details\"\n\nvoid FDialogue_Details::CustomizeDetails(IDetailLayoutBuilder& DetailBuilder)\n{\n\tTArray<TWeakObjectPtr<UObject>> ObjectsBeingCustomized;\n\tDetailBuilder.GetObjectsBeingCustomized(ObjectsBeingCustomized);\n\t// Only support one object being customized\n\tif (ObjectsBeingCustomized.Num() != 1)\n\t{\n\t\treturn;\n\t}\n\n\tUClass* DialogueClass = UDlgDialogue::StaticClass();\n\t// IDetailCategoryBuilder& GeneratedCategory = DetailBuilder.EditCategory(TEXT(\"Generated\"));\n\t// GeneratedCategory.InitiallyCollapsed(false);\n\t// GeneratedCategory.AddProperty(UDlgDialogue::GetMemberNameName(), DialogueClass);\n\t// GeneratedCategory.AddProperty(UDlgDialogue::GetMemberNameGUID(), DialogueClass);\n\t// GeneratedCategory.AddProperty(UDlgDialogue::GetMemberNameParticipantsData(), DialogueClass);\n\n\tIDetailCategoryBuilder& DataCategory = DetailBuilder.EditCategory(TEXT(\"DialogueData\"));\n\tDataCategory.InitiallyCollapsed(false);\n\t// DataCategory.AddProperty(UDlgDialogue::GetMemberNameStartNode(), DialogueClass)\n\t// \t.ShouldAutoExpand(true);\n\t// DataCategory.AddProperty(UDlgDialogue::GetMemberNameNodes(), DialogueClass)\n\t// \t.ShouldAutoExpand(true);\n}\n\n//////////////////////////////////////////////////////////////////////////\n\n#undef LOCTEXT_NAMESPACE\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystemEditor/Private/DialogueEditor/DetailsPanel/Dialogue_Details.h",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#pragma once\n\n#include \"IDetailCustomization.h\"\n\n/**\n * How the details customization panel looks for the DlgDialogue object.\n * See FDlgSystemEditorModule::StartupModule for usage.\n */\nclass FDialogue_Details : public IDetailCustomization\n{\n\ttypedef FDialogue_Details Self;\npublic:\n\t// Makes a new instance of this detail layout class for a specific detail view requesting it\n\tstatic TSharedRef<IDetailCustomization> MakeInstance() { return MakeShared<Self>(); }\n\n\t// IDetailCustomization interface\n\t/** Called when details should be customized */\n\tvoid CustomizeDetails(IDetailLayoutBuilder& DetailBuilder) override;\n};\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystemEditor/Private/DialogueEditor/DetailsPanel/Widgets/DialogueBase_CustomRowHelper.cpp",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#include \"DialogueBase_CustomRowHelper.h\"\n\n#include \"PropertyHandle.h\"\n#include \"DetailWidgetRow.h\"\n\n#define LOCTEXT_NAMESPACE \"TextPropertyPickListCustomRowHelper\"\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// FDialogueBase_CustomRowHelper\nFDialogueBase_CustomRowHelper::FDialogueBase_CustomRowHelper(FDetailWidgetRow* InDetailWidgetRow, const TSharedPtr<IPropertyHandle>& InPropertyHandle) :\n\tDetailWidgetRow(InDetailWidgetRow),\n\tPropertyHandle(InPropertyHandle),\n\tDisplayName(DetailWidgetRow->FilterTextString),\n\tToolTip(InPropertyHandle->GetToolTipText())\n{\n\tcheck(DetailWidgetRow);\n\tcheck(PropertyHandle.IsValid());\n}\n\n/** Build the full property row. */\nvoid FDialogueBase_CustomRowHelper::Update()\n{\n\t// Set display name and tooltips\n\t// Sets a string which should be used to filter the content when a user searches\n\tDetailWidgetRow->FilterString(DisplayName);\n\tPropertyHandle->SetToolTipText(ToolTip);\n\n\tNameContentWidget = PropertyHandle->CreatePropertyNameWidget(DisplayName, ToolTip);\n\n\t// NOTE set the tooltip of your value content widget inside the implementation class.\n\tUpdateInternal();\n}\n\n#undef LOCTEXT_NAMESPACE\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystemEditor/Private/DialogueEditor/DetailsPanel/Widgets/DialogueBase_CustomRowHelper.h",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#pragma once\n\n#include \"DetailWidgetRow.h\"\n\nclass FDetailWidgetRow;\n\n/**\n * Base class for all Custom Row Helpers.\n * Makes sure that the ToolTips and Display Names are in sync with the PropertyHandle and the SWidget that is represented by.\n */\nclass FDialogueBase_CustomRowHelper\n{\n\ttypedef FDialogueBase_CustomRowHelper Self;\npublic:\n\tFDialogueBase_CustomRowHelper(FDetailWidgetRow* InDetailWidgetRow, const TSharedPtr<IPropertyHandle>& InPropertyHandle);\n\tvirtual ~FDialogueBase_CustomRowHelper() {}\n\n\t// Sets the localized display name of the property.\n\tSelf& SetDisplayName(const FText& InDisplayName)\n\t{\n\t\tDisplayName = InDisplayName;\n\t\treturn *this;\n\t}\n\n\t// Sets the localized tooltip of the property.\n\tSelf& SetToolTip(const FText& InToolTip)\n\t{\n\t\tToolTip = InToolTip;\n\t\treturn *this;\n\t}\n\n\t// Sets the visibility of this property.\n\tSelf& SetVisibility(const TAttribute<EVisibility>& InVisibility)\n\t{\n\t\tDetailWidgetRow->Visibility(InVisibility);\n\t\treturn *this;\n\t}\n\n\t// Set the optional utils\n\tSelf& SetPropertyUtils(const TSharedPtr<IPropertyUtilities>& Utils)\n\t{\n\t\tPropertyUtils = Utils;\n\t\treturn *this;\n\t}\n\n\t// Update the full property row.\n\tvoid Update();\n\nprotected:\n\t// Internal update method that must be implemented. Called after Update finishes.\n\tvirtual void UpdateInternal() = 0;\n\nprotected:\n\t// The custom widget row this represents\n\tFDetailWidgetRow* DetailWidgetRow = nullptr;\n\n\t// Helpers class\n\tTSharedPtr<IPropertyUtilities> PropertyUtils;\n\n\t// The Property handle of what this row represents\n\tTSharedPtr<IPropertyHandle> PropertyHandle;\n\n\t// The NameContent Widget.\n\tTSharedPtr<SWidget> NameContentWidget;\n\n\t// Texts used for this property row.\n\tFText DisplayName;\n\tFText ToolTip;\n};\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystemEditor/Private/DialogueEditor/DetailsPanel/Widgets/DialogueEditableTextPropertyHandle.h",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#pragma once\n#include \"CoreMinimal.h\"\n#include \"SDialogueTextPropertyEditableTextBox.h\"\n#include \"IPropertyUtilities.h\"\n#include \"PropertyHandle.h\"\n#include \"DlgLocalizationHelper.h\"\n\n// FROM: FTextCustomization\n// Allows us to edit a property handle\nclass FDialogueEditableTextPropertyHandle : public IEditableTextProperty\n{\npublic:\n\tFDialogueEditableTextPropertyHandle(const TSharedRef<IPropertyHandle>& InPropertyHandle, const TSharedPtr<IPropertyUtilities>& InPropertyUtilities)\n\t\t: PropertyHandle(InPropertyHandle)\n\t\t, PropertyUtilities(InPropertyUtilities)\n\t{\n\t}\n\n\tbool IsMultiLineText() const override\n\t{\n\t\treturn PropertyHandle->IsValidHandle() && PropertyHandle->GetMetaDataProperty()->GetBoolMetaData(\"MultiLine\");\n\t}\n\n\tbool IsPassword() const override\n\t{\n\t\treturn PropertyHandle->IsValidHandle() && PropertyHandle->GetMetaDataProperty()->GetBoolMetaData(\"PasswordField\");\n\t}\n\n\tbool IsReadOnly() const override\n\t{\n\t\treturn !PropertyHandle->IsValidHandle() || PropertyHandle->IsEditConst();\n\t}\n\n\tbool IsDefaultValue() const override\n\t{\n\t\treturn PropertyHandle->IsValidHandle() && !PropertyHandle->DiffersFromDefault();\n\t}\n\n\tFText GetToolTipText() const override\n\t{\n\t\treturn PropertyHandle->IsValidHandle() ? PropertyHandle->GetToolTipText() : FText::GetEmpty();\n\t}\n\n\tint32 GetNumTexts() const override\n\t{\n\t\treturn (PropertyHandle->IsValidHandle())\n\t\t\t? PropertyHandle->GetNumPerObjectValues()\n\t\t\t: 0;\n\t}\n\n\tFText GetText(int32 InIndex) const override\n\t{\n\t\tif (PropertyHandle->IsValidHandle())\n\t\t{\n\t\t\tFString ObjectValue;\n\t\t\tif (PropertyHandle->GetPerObjectValue(InIndex, ObjectValue) == FPropertyAccess::Success)\n\t\t\t{\n\t\t\t\tFText TextValue;\n\t\t\t\tif (FTextStringHelper::ReadFromBuffer(*ObjectValue, TextValue))\n\t\t\t\t{\n\t\t\t\t\treturn TextValue;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn FText::GetEmpty();\n\t}\n\n\tvoid SetText(int32 InIndex, const FText& InText) override\n\t{\n\t\tif (PropertyHandle->IsValidHandle())\n\t\t{\n\t\t\tFString ObjectValue;\n\t\t\tFTextStringHelper::WriteToBuffer(ObjectValue, InText);\n\t\t\tPropertyHandle->SetPerObjectValue(InIndex, ObjectValue);\n\t\t}\n\t}\n\n\tbool IsValidText(const FText& InText, FText& OutErrorMsg) const override\n\t{\n\t\treturn true;\n\t}\n\n#if USE_STABLE_LOCALIZATION_KEYS\n\tvoid GetStableTextId(\n\t\tint32 InIndex,\n\t\tETextPropertyEditAction InEditAction,\n\t\tconst FString& InTextSource,\n\t\tconst FString& InProposedNamespace,\n\t\tconst FString& InProposedKey,\n\t\tFString& OutStableNamespace, FString& OutStableKey\n\t) const override\n\t{\n\t\tif (PropertyHandle->IsValidHandle())\n\t\t{\n\t\t\tTArray<UPackage*> PropertyPackages;\n\t\t\tPropertyHandle->GetOuterPackages(PropertyPackages);\n\n\t\t\tcheck(PropertyPackages.IsValidIndex(InIndex));\n\n\t\t\t// NOTE: We use our copied version so that everything is in sync\n\t\t\tFDlgLocalizationHelper::StaticStableTextId(PropertyPackages[InIndex], InEditAction, InTextSource, InProposedNamespace, InProposedKey, OutStableNamespace, OutStableKey);\n\t\t\t//StaticStableTextId(PropertyPackages[InIndex], InEditAction, InTextSource, InProposedNamespace, InProposedKey, OutStableNamespace, OutStableKey);\n\t\t}\n\t}\n#endif // USE_STABLE_LOCALIZATION_KEYS\n\n\tvoid RequestRefresh() override\n\t{\n\t\tif (PropertyUtilities.IsValid())\n\t\t{\n\t\t\tPropertyUtilities->RequestRefresh();\n\t\t}\n\t}\n\nprivate:\n\tTSharedRef<IPropertyHandle> PropertyHandle;\n\tTSharedPtr<IPropertyUtilities> PropertyUtilities;\n};\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystemEditor/Private/DialogueEditor/DetailsPanel/Widgets/DialogueEnumTypeWithObject_CustomRowHelper.cpp",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#include \"DialogueEnumTypeWithObject_CustomRowHelper.h\"\n\n#include \"DetailWidgetRow.h\"\n#include \"Widgets/Input/SButton.h\"\n#include \"Widgets/Input/SComboButton.h\"\n#include \"Internationalization/TextNamespaceUtil.h\"\n#include \"DialogueEditableTextPropertyHandle.h\"\n#include \"DlgHelper.h\"\n#include \"Editor.h\"\n#include \"SourceCodeNavigation.h\"\n#include \"DialogueEditor/DetailsPanel/DialogueDetailsPanelUtils.h\"\n#include \"Kismet2/BlueprintEditorUtils.h\"\n#include \"Widgets/Images/SImage.h\"\n\n\n#define LOCTEXT_NAMESPACE \"DialogueEnumTypeWithObject_CustomRowHelper\"\n#define DEFAULT_FONT(...) FCoreStyle::GetDefaultFontStyle(__VA_ARGS__)\n\nbool FDialogueEnumTypeWithObject_CustomRowHelper::CanBeVisible() const\n{\n\tif (!HasParticipantName() || !Dialogue.IsValid() || !GetObject())\n\t{\n\t\treturn false;\n\t}\n\n\tif (EnumType == EDialogueEnumWithObjectType::Condition)\n\t{\n\t\treturn CanBeVisibleForConditionType();\n\t}\n\tif (EnumType == EDialogueEnumWithObjectType::Event)\n\t{\n\t\treturn CanBeVisibleForEventType();\n\t}\n\n\treturn false;\n}\n\nUObject* FDialogueEnumTypeWithObject_CustomRowHelper::GetObject() const\n{\n\tif (!Dialogue.IsValid())\n\t{\n\t\treturn nullptr;\n\t}\n\tconst FName ParticipantName = GetParticipantName();\n\tif (ParticipantName == NAME_None)\n\t{\n\t\treturn nullptr;\n\t}\n\n\tUClass* Class = Dialogue->GetParticipantClass(ParticipantName);\n\tif (!Class)\n\t{\n\t\treturn nullptr;\n\t}\n\n\treturn Class->GetDefaultObject();\n}\n\nFText FDialogueEnumTypeWithObject_CustomRowHelper::GetBrowseObjectText() const\n{\n\treturn LOCTEXT(\"BrowseButtonToolTipText\", \"Browse Participant Asset in Content Browser\");\n}\n\nFText FDialogueEnumTypeWithObject_CustomRowHelper::GetJumpToObjectText() const\n{\n\tif (IsObjectABlueprint())\n\t{\n\t\treturn LOCTEXT(\"OpenObjectBlueprintTooltipKey\", \"Open Participant Blueprint Editor\");\n\t}\n\n\t// Native Class\n\treturn FText::Format(\n\t\tLOCTEXT(\"OpenObjectBlueprintTooltipKey\", \"Open Participant Source File in {0}\"),\n\t\tFSourceCodeNavigation::GetSelectedSourceCodeIDE()\n\t);\n}\n\nFReply FDialogueEnumTypeWithObject_CustomRowHelper::OnOpenClicked()\n{\n\t// Set function/event name to open\n\tif (EnumType == EDialogueEnumWithObjectType::Condition)\n\t{\n\t\tSetFunctionNameToOpen(EDialogueBlueprintOpenType::Function, FDlgHelper::GetFunctionNameForConditionType(GetConditionType()));\n\t}\n\tif (EnumType == EDialogueEnumWithObjectType::Event)\n\t{\n\t\tSetFunctionNameToOpen(EDialogueBlueprintOpenType::Function, FDlgHelper::GetFunctionNameForEventType(GetEventType()));\n\t}\n\n\treturn Super::OnOpenClicked();\n}\n\nuint8 FDialogueEnumTypeWithObject_CustomRowHelper::GetEnumValue() const\n{\n\tif (!PropertyRow)\n\t{\n\t\treturn 0;\n\t}\n\n\tuint8 Value = 0;\n\tTSharedPtr<IPropertyHandle> PropertyHandle = PropertyRow->GetPropertyHandle();\n\tif (!PropertyHandle.IsValid())\n\t{\n\t\treturn 0;\n\t}\n\tPropertyHandle->GetValue(Value);\n\treturn Value;\n}\n\nFName FDialogueEnumTypeWithObject_CustomRowHelper::GetParticipantName() const\n{\n\tif (!ParticipantNamePropertyHandle.IsValid())\n\t{\n\t\treturn NAME_None;\n\t}\n\n\treturn FDialogueDetailsPanelUtils::GetParticipantNameFromPropertyHandle(ParticipantNamePropertyHandle.ToSharedRef());\n}\n\n#undef LOCTEXT_NAMESPACE\n#undef DEFAULT_FONT\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystemEditor/Private/DialogueEditor/DetailsPanel/Widgets/DialogueEnumTypeWithObject_CustomRowHelper.h",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#pragma once\n\n#include \"DialogueObject_CustomRowHelper.h\"\n#include \"DlgCondition.h\"\n#include \"DlgDialogueParticipant.h\"\n#include \"DlgEvent.h\"\n#include \"IDetailPropertyRow.h\"\n\nclass FDetailWidgetRow;\nclass UDlgDialogue;\nclass UBlueprint;\n\nenum class EDialogueEnumWithObjectType : uint8\n{\n\tNone = 0,\n\tCondition, // EDlgConditionType\n\tEvent // EDlgEventType\n};\n\n// Widget:\n// [Enum type] [Browse Participant] [Open Function or ParticipantBlueprint]\nclass FDialogueEnumTypeWithObject_CustomRowHelper : public FDialogueObject_CustomRowHelper\n{\n\ttypedef FDialogueEnumTypeWithObject_CustomRowHelper Self;\n\ttypedef FDialogueObject_CustomRowHelper Super;\n\npublic:\n\tFDialogueEnumTypeWithObject_CustomRowHelper(\n\t\tIDetailPropertyRow* InPropertyRow,\n\t\tconst UDlgDialogue* InDialogue,\n\t\tconst TSharedPtr<IPropertyHandle>& InParticipantNamePropertyHandle\n\t) : Super(InPropertyRow), Dialogue(InDialogue), ParticipantNamePropertyHandle(InParticipantNamePropertyHandle)\n\t{\n\t\tbAddBlueprintFunctionIfItDoesNotExist = false;\n\t}\n\tvirtual ~FDialogueEnumTypeWithObject_CustomRowHelper() {}\n\n\t//\n\t// FDialogueObject_CustomRowHelper Interface\n\t//\n\n\tUObject* GetObject() const override;\n\tFText GetBrowseObjectText() const override;\n\tFText GetJumpToObjectText() const override;\n\tFReply OnOpenClicked() override;\n\tbool CanBeVisible() const override;\n\tfloat GetRowMinimumDesiredWidth() const override { return 200.f; }\n\n\t//\n\t// Own methods\n\t//\n\n\tvoid SetEnumType(EDialogueEnumWithObjectType Type)\n\t{\n\t\tEnumType = Type;\n\t}\n\nprotected:\n\tbool CanBeVisibleForEventType() const\n\t{\n\t\treturn IsEventTypeForADialogueValue() || IsEventTypeForAClassVariable();\n\t}\n\n\tbool CanBeVisibleForConditionType() const\n\t{\n\t\treturn IsConditionTypeForADialogueValue() || IsConditionTypeForAClassVariable();\n\t}\n\n\tbool IsEventTypeForADialogueValue() const\n\t{\n\t\tconst EDlgEventType EventType = GetEventType();\n\t\treturn FDlgEvent::HasParticipantInterfaceValue(EventType);\n\t}\n\n\tbool IsEventTypeForAClassVariable() const\n\t{\n\t\tconst EDlgEventType EventType = GetEventType();\n\t\treturn FDlgEvent::HasClassVariable(EventType);\n\t}\n\n\tbool IsConditionTypeForADialogueValue() const\n\t{\n\t\tconst EDlgConditionType ConditionType = GetConditionType();\n\t\treturn FDlgCondition::HasParticipantInterfaceValue(ConditionType);\n\t}\n\n\tbool IsConditionTypeForAClassVariable() const\n\t{\n\t\tconst EDlgConditionType ConditionType = GetConditionType();\n\t\treturn FDlgCondition::HasClassVariable(ConditionType);\n\t}\n\n\tuint8 GetEnumValue() const;\n\tFName GetParticipantName() const;\n\tbool HasParticipantName() const { return GetParticipantName() != NAME_None; }\n\tEDlgEventType GetEventType() const { return static_cast<EDlgEventType>(GetEnumValue()); }\n\tEDlgConditionType GetConditionType() const {  return static_cast<EDlgConditionType>(GetEnumValue()); }\n\n\nprotected:\n\tEDialogueEnumWithObjectType EnumType = EDialogueEnumWithObjectType::None;\n\tTWeakObjectPtr<UDlgDialogue> Dialogue = nullptr;\n\tTSharedPtr<IPropertyHandle> ParticipantNamePropertyHandle = nullptr;\n};\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystemEditor/Private/DialogueEditor/DetailsPanel/Widgets/DialogueIntTextBox_CustomRowHelper.cpp",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#include \"DialogueIntTextBox_CustomRowHelper.h\"\n\n#include \"PropertyHandle.h\"\n#include \"DetailWidgetRow.h\"\n#include \"Widgets/Input/SButton.h\"\n#include \"Widgets/Images/SImage.h\"\n#include \"Widgets/Input/SComboButton.h\"\n#include \"Widgets/Layout/SUniformGridPanel.h\"\n#include \"Internationalization/TextNamespaceUtil.h\"\n#include \"IPropertyUtilities.h\"\n#include \"DialogueEditableTextPropertyHandle.h\"\n#include \"DialogueEditor/DetailsPanel/DialogueDetailsPanelUtils.h\"\n\n#define LOCTEXT_NAMESPACE \"DialogueIntTextBox_CustomRowHelper\"\n#define DEFAULT_FONT(...) FCoreStyle::GetDefaultFontStyle(__VA_ARGS__)\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// FDialogueMultiLineEditableTextBox_CustomRowHelper\nvoid FDialogueIntTextBox_CustomRowHelper::UpdateInternal()\n{\n\tcheck(PropertyHandle.IsValid());\n\n\tTSharedPtr<SHorizontalBox> HorizontalBox;\n\tDetailWidgetRow\n\t->NameContent()\n\t[\n\t\tNameContentWidget.ToSharedRef()\n\t]\n\t.ValueContent()\n\t// Similar to TextProperty, see FTextCustomization\n\t.MinDesiredWidth(200.f)\n\t// .MaxDesiredWidth(300.f)\n\t[\n\t\tSAssignNew(HorizontalBox, SHorizontalBox)\n\t\t+SHorizontalBox::Slot()\n\t\t.Padding(0.f, 0.f, 4.f, 0.f)\n\t\t.FillWidth(1.f)\n\t\t[\n\t\t\tPropertyHandle->CreatePropertyValueWidget()\n\t\t]\n\t];\n\n\t// Add Reset to default\n\tif (bAddResetToDefaultWidget)\n\t{\n\t\tPropertyHandle->MarkResetToDefaultCustomized(true);\n\t\tHorizontalBox->AddSlot()\n\t\t.AutoWidth()\n\t\t.VAlign(VAlign_Center)\n\t\t.Padding(4.f, 2.f)\n\t\t[\n\t\t\tSNew(SButton)\n\t\t\t.IsFocusable(false)\n\t\t\t.ToolTipText(this, &Self::GetResetToolTip)\n\t\t\t.ButtonStyle(FEditorStyle::Get(), \"NoBorder\")\n\t\t\t.ContentPadding(0)\n\t\t\t.Visibility(this, &Self::GetDiffersFromDefaultAsVisibility)\n\t\t\t.OnClicked(this, &Self::OnResetClicked)\n\t\t\t.Content()\n\t\t\t[\n\t\t\t\tSNew(SImage)\n\t\t\t\t.Image(FEditorStyle::GetBrush(\"PropertyWindow.DiffersFromDefault\"))\n\t\t\t]\n\t\t];\n\t}\n\n\t// Jump to Node\n\tHorizontalBox->AddSlot()\n\t.AutoWidth()\n\t.VAlign(VAlign_Center)\n\t.Padding(4.f, 2.f)\n\t[\n\t\tSNew(SButton)\n\t\t.Visibility(JumpToNodeVisibility)\n\t\t.ToolTipText(LOCTEXT(\"JumpToNodeTooltipKey\", \"Jump to Node\"))\n\t\t.OnClicked(this, &Self::OnJumpToNodeClicked)\n\t\t[\n\t\t\tSNew(STextBlock)\n\t\t\t.Text(LOCTEXT(\"JumpToNodeKey\", \"Jump to Node\"))\n\t\t\t.Font(DEFAULT_FONT(\"Regular\", 10))\n\t\t]\n\t];\n}\n\nFText FDialogueIntTextBox_CustomRowHelper::GetResetToolTip() const\n{\n\tFString Tooltip = NSLOCTEXT(\"PropertyEditor\", \"ResetToDefaultToolTip\", \"Reset to Default\").ToString();\n\tif (PropertyHandle.IsValid() && !PropertyHandle->IsEditConst() && PropertyHandle->DiffersFromDefault())\n\t{\n\t\tconst FString DefaultLabel = PropertyHandle->GetResetToDefaultLabel().ToString();\n\t\tif (DefaultLabel.Len() > 0)\n\t\t{\n\t\t\tTooltip += \"\\n\";\n\t\t\tTooltip += DefaultLabel;\n\t\t}\n\t}\n\n\treturn FText::FromString(Tooltip);\n}\n\nEVisibility FDialogueIntTextBox_CustomRowHelper::GetDiffersFromDefaultAsVisibility() const\n{\n\tif (PropertyHandle.IsValid())\n\t{\n\t\treturn PropertyHandle->DiffersFromDefault() ? EVisibility::Visible : EVisibility::Hidden;\n\t}\n\n\treturn EVisibility::Visible;\n}\n\nFReply FDialogueIntTextBox_CustomRowHelper::OnResetClicked()\n{\n\tif (PropertyHandle.IsValid())\n\t{\n\t\tPropertyHandle->ResetToDefault();\n\t}\n\treturn FReply::Handled();\n}\n\nFReply FDialogueIntTextBox_CustomRowHelper::OnJumpToNodeClicked()\n{\n\tint32 NodeIndex = 0;\n\tif (PropertyHandle->GetValue(NodeIndex) == FPropertyAccess::Success)\n\t{\n\t\tFDialogueEditorUtilities::JumpToGraphNodeIndex(Dialogue.Get(), NodeIndex);\n\t}\n\n\treturn FReply::Handled();\n}\n\n#undef LOCTEXT_NAMESPACE\n#undef DEFAULT_FONT\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystemEditor/Private/DialogueEditor/DetailsPanel/Widgets/DialogueIntTextBox_CustomRowHelper.h",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#pragma once\n\n#include \"DetailWidgetRow.h\"\n\n#include \"Widgets/Input/SMultiLineEditableTextBox.h\"\n#include \"DialogueBase_CustomRowHelper.h\"\n#include \"SDialogueTextPropertyEditableTextBox.h\"\n\nclass FDetailWidgetRow;\nclass UDlgDialogue;\n\n// Custom row for integers\nclass FDialogueIntTextBox_CustomRowHelper :\n\tpublic FDialogueBase_CustomRowHelper,\n\tpublic TSharedFromThis<FDialogueIntTextBox_CustomRowHelper>\n{\n\ttypedef FDialogueIntTextBox_CustomRowHelper Self;\n\ttypedef FDialogueBase_CustomRowHelper Super;\npublic:\n\tFDialogueIntTextBox_CustomRowHelper(\n\t\tFDetailWidgetRow* InDetailWidgetRow,\n\t\tconst TSharedPtr<IPropertyHandle>& InPropertyHandle,\n\t\tconst UDlgDialogue* InDialogue\n\t) : FDialogueBase_CustomRowHelper(InDetailWidgetRow, InPropertyHandle), Dialogue(InDialogue) {}\n\n\tSelf& SetJumpToNodeVisibility(const TAttribute<EVisibility>& Visibility)\n\t{\n\t\tJumpToNodeVisibility = Visibility;\n\t\treturn *this;\n\t}\n\nprotected:\n\tvoid UpdateInternal() override;\n\n\t// Reset to default\n\tFText GetResetToolTip() const;\n\tEVisibility GetDiffersFromDefaultAsVisibility() const;\n\tFReply OnResetClicked();\n\tFReply OnJumpToNodeClicked();\n\nprivate:\n\tbool bAddResetToDefaultWidget = true;\n\n\tTWeakObjectPtr<UDlgDialogue> Dialogue = nullptr;\n\n\tTAttribute<EVisibility> JumpToNodeVisibility;\n};\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystemEditor/Private/DialogueEditor/DetailsPanel/Widgets/DialogueMultiLineEditableTextBox_CustomRowHelper.cpp",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#include \"DialogueMultiLineEditableTextBox_CustomRowHelper.h\"\n\n#include \"PropertyHandle.h\"\n#include \"DetailWidgetRow.h\"\n#include \"Widgets/Input/SButton.h\"\n#include \"Widgets/Images/SImage.h\"\n#include \"Widgets/Input/SComboButton.h\"\n#include \"Widgets/Layout/SUniformGridPanel.h\"\n#include \"Internationalization/TextNamespaceUtil.h\"\n#include \"IPropertyUtilities.h\"\n#include \"DialogueEditableTextPropertyHandle.h\"\n#include \"DialogueEditor/DetailsPanel/DialogueDetailsPanelUtils.h\"\n\n#define LOCTEXT_NAMESPACE \"MultiLineEditableTextBox_CustomRowHelper\"\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// FDialogueMultiLineEditableTextBoxOptions\nvoid FDialogueMultiLineEditableTextBoxOptions::SetDefaults()\n{\n\tconst auto DefaultValues = Self{};\n\n\t// Set default values\n\tbSelectAllTextWhenFocused = DefaultValues.bSelectAllTextWhenFocused;\n\tbClearKeyboardFocusOnCommit = DefaultValues.bClearKeyboardFocusOnCommit;\n\tbSelectAllTextOnCommit = DefaultValues.bSelectAllTextOnCommit;\n\tbAutoWrapText = DefaultValues.bAutoWrapText;\n\tWrapTextAt = DefaultValues.WrapTextAt;\n\tModiferKeyForNewLine = FDialogueDetailsPanelUtils::GetModifierKeyFromDialogueSettings();\n\n\t// Set values that can't be set in the class definition\n\tStyle = FCoreStyle::Get().GetWidgetStyle<FEditableTextBoxStyle>(\"NormalEditableTextBox\");\n\tFont = FEditorStyle::GetFontStyle(TEXT(\"PropertyWindow.NormalFont\"));\n\t// ForegroundColor =\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// FDialogueMultiLineEditableTextBox_CustomRowHelper\nvoid FDialogueMultiLineEditableTextBox_CustomRowHelper::UpdateInternal()\n{\n\tcheck(PropertyHandle.IsValid());\n\tcheck(PropertyUtils.IsValid());\n\n\tEditableTextProperty = MakeShared<FDialogueEditableTextPropertyHandle>(PropertyHandle.ToSharedRef(), PropertyUtils);\n\n\tTSharedPtr<SHorizontalBox> HorizontalBox;\n\tDetailWidgetRow\n\t->NameContent()\n\t[\n\t\tNameContentWidget.ToSharedRef()\n\t]\n\t.ValueContent()\n\t// Similar to TextProperty, see FTextCustomization\n\t.MinDesiredWidth(209.f)\n\t.MaxDesiredWidth(600.f)\n\t[\n\t\tSAssignNew(HorizontalBox, SHorizontalBox)\n\t\t+SHorizontalBox::Slot()\n\t\t.Padding(0.f, 0.f, 4.f, 0.f)\n\t\t.FillWidth(1.f)\n\t\t[\n\t\t\t// Set custom size of text box\n\t\t\t// SNew(SBox)\n\t\t\t// .HeightOverride(100)\n\t\t\t// [\n\t\t\t\t//MultiLineEditableTextBoxWidget.ToSharedRef()\n\t\t\t// ]\n\t\t\t//\n\t\t\tSAssignNew(TextBoxWidget, SDialogueTextPropertyEditableTextBox, EditableTextProperty.ToSharedRef(), PropertyHandle.ToSharedRef())\n\t\t\t.Style(&Options.Style)\n\t\t\t.Font(Options.Font)\n\t\t\t.ForegroundColor(Options.ForegroundColor)\n\t\t\t.ReadOnlyForegroundColor(Options.ReadOnlyForegroundColor)\n\t\t\t.SelectAllTextWhenFocused(Options.bSelectAllTextWhenFocused)\n\t\t\t.ClearKeyboardFocusOnCommit(Options.bClearKeyboardFocusOnCommit)\n\t\t\t.SelectAllTextOnCommit(Options.bSelectAllTextOnCommit)\n\t\t\t.AutoWrapText(Options.bAutoWrapText)\n\t\t\t.WrapTextAt(Options.WrapTextAt)\n\t\t\t.ModiferKeyForNewLine(Options.ModiferKeyForNewLine)\n\t\t\t.AddResetToDefaultWidget(true)\n\t\t]\n\t];\n}\n\nFDialogueTextCommitedDelegate& FDialogueMultiLineEditableTextBox_CustomRowHelper::OnTextCommittedEvent()\n{\n\tcheck(TextBoxWidget.IsValid());\n\treturn TextBoxWidget->OnTextCommittedEvent();\n}\n\nFDialogueTextChangedDelegate& FDialogueMultiLineEditableTextBox_CustomRowHelper::OnTextChangedEvent()\n{\n\tcheck(TextBoxWidget.IsValid());\n\treturn TextBoxWidget->OnTextChangedEvent();\n}\n\nFText FDialogueMultiLineEditableTextBox_CustomRowHelper::GetTextValue() const\n{\n\tif (TextBoxWidget.IsValid())\n\t{\n\t\treturn TextBoxWidget->GetTextValue();\n\t}\n\n\treturn FText::GetEmpty();\n}\n\n#undef LOCTEXT_NAMESPACE\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystemEditor/Private/DialogueEditor/DetailsPanel/Widgets/DialogueMultiLineEditableTextBox_CustomRowHelper.h",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#pragma once\n\n#include \"DetailWidgetRow.h\"\n\n#include \"Widgets/Input/SMultiLineEditableTextBox.h\"\n#include \"DialogueBase_CustomRowHelper.h\"\n#include \"SDialogueTextPropertyEditableTextBox.h\"\n\nclass FDetailWidgetRow;\n\nstruct FDialogueMultiLineEditableTextBoxOptions\n{\n\ttypedef FDialogueMultiLineEditableTextBoxOptions Self;\npublic:\n\tFDialogueMultiLineEditableTextBoxOptions() {}\n\n\tvoid SetDefaults();\n\npublic:\n\tbool bSelectAllTextWhenFocused = false;\n\tbool bClearKeyboardFocusOnCommit = false;\n\tbool bSelectAllTextOnCommit = false;\n\tbool bAutoWrapText = true;\n\n\tfloat WrapTextAt = 0.f;\n\tEModifierKey::Type ModiferKeyForNewLine = EModifierKey::None;\n\n\t// Can not be set here\n\tTAttribute<FSlateFontInfo> Font;\n\tTAttribute<FSlateColor> ForegroundColor;\n\tTAttribute<FSlateColor> ReadOnlyForegroundColor;\n\tFEditableTextBoxStyle Style;\n};\n\n/**\n * Helper for a custom row when using SMultiLineEditableTextBox.\n */\nclass FDialogueMultiLineEditableTextBox_CustomRowHelper :\n\tpublic FDialogueBase_CustomRowHelper,\n\tpublic TSharedFromThis<FDialogueMultiLineEditableTextBox_CustomRowHelper>\n{\n\ttypedef FDialogueMultiLineEditableTextBox_CustomRowHelper Self;\n\ttypedef FDialogueBase_CustomRowHelper Super;\n\npublic:\n\tFDialogueMultiLineEditableTextBox_CustomRowHelper(FDetailWidgetRow* InDetailWidgetRow, const TSharedPtr<IPropertyHandle>& InPropertyHandle)\n\t\t: FDialogueBase_CustomRowHelper(InDetailWidgetRow, InPropertyHandle)\n\t{\n\t\tOptions.SetDefaults();\n\t}\n\n#define CREATE_OPTIONS_SETTER(_NameMethod, _VariableType, _OptionVariableName)  \\\n\tSelf& _NameMethod(_VariableType InVariableValue)              \\\n\t{                                                             \\\n\t\tOptions._OptionVariableName = InVariableValue;            \\\n\t\treturn *this;                                             \\\n\t}\n\n\tCREATE_OPTIONS_SETTER(Style, const FEditableTextBoxStyle&, Style)\n\tCREATE_OPTIONS_SETTER(Font, const TAttribute<FSlateFontInfo>&, Font)\n\tCREATE_OPTIONS_SETTER(ForegroundColor, const TAttribute<FSlateColor>&, ForegroundColor)\n\tCREATE_OPTIONS_SETTER(ReadOnlyForegroundColor, const TAttribute<FSlateColor>&, ReadOnlyForegroundColor)\n\tCREATE_OPTIONS_SETTER(SelectAllTextWhenFocused, bool, bSelectAllTextWhenFocused)\n\tCREATE_OPTIONS_SETTER(ClearKeyboardFocusOnCommit, bool, bClearKeyboardFocusOnCommit)\n\tCREATE_OPTIONS_SETTER(SelectAllTextOnCommit, bool, bSelectAllTextOnCommit)\n\tCREATE_OPTIONS_SETTER(AutoWrapText, bool, bAutoWrapText)\n\tCREATE_OPTIONS_SETTER(WrapTextAt, float, WrapTextAt)\n\tCREATE_OPTIONS_SETTER(ModiferKeyForNewLine, EModifierKey::Type, ModiferKeyForNewLine)\n\n#undef CREATE_OPTIONS_SETTER\n\n\t/** Gets the value of the text property. */\n\tFText GetTextValue() const;\n\n\t// NOTE: only call these after Update()\n\tFDialogueTextCommitedDelegate& OnTextCommittedEvent();\n\tFDialogueTextChangedDelegate& OnTextChangedEvent();\n\n\nprotected:\n\tvoid UpdateInternal() override;\n\nprivate:\n\t// Events\n\tFDialogueTextCommitedDelegate TextCommittedEvent;\n\n\t// The text box Widget.\n\tTSharedPtr<SDialogueTextPropertyEditableTextBox> TextBoxWidget;\n\n\t// Options for the widget\n\tFDialogueMultiLineEditableTextBoxOptions Options;\n\n\t// Editable text property\n\tTSharedPtr<IEditableTextProperty> EditableTextProperty;\n};\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystemEditor/Private/DialogueEditor/DetailsPanel/Widgets/DialogueObject_CustomRowHelper.cpp",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#include \"DialogueObject_CustomRowHelper.h\"\n\n#include \"PropertyHandle.h\"\n#include \"DetailWidgetRow.h\"\n#include \"Widgets/Input/SButton.h\"\n#include \"Widgets/Input/SComboButton.h\"\n#include \"Widgets/Layout/SUniformGridPanel.h\"\n#include \"Internationalization/TextNamespaceUtil.h\"\n#include \"DialogueEditableTextPropertyHandle.h\"\n#include \"Editor.h\"\n#include \"DialogueEditor/DetailsPanel/DialogueDetailsPanelUtils.h\"\n#include \"Kismet2/KismetEditorUtilities.h\"\n#include \"Engine/Blueprint.h\"\n#include \"Kismet2/BlueprintEditorUtils.h\"\n#include \"Widgets/Images/SImage.h\"\n#include \"K2Node_Event.h\"\n#include \"SourceCodeNavigation.h\"\n\n#define LOCTEXT_NAMESPACE \"DialogueObject_CustomRowHelper\"\n#define DEFAULT_FONT(...) FCoreStyle::GetDefaultFontStyle(__VA_ARGS__)\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// FDialogueObject_CustomRowHelper\nFDialogueObject_CustomRowHelper::FDialogueObject_CustomRowHelper(IDetailPropertyRow* InPropertyRow) :\n\tPropertyRow(InPropertyRow)\n{\n}\n\nvoid FDialogueObject_CustomRowHelper::Update()\n{\n\t// SPropertyEditorClass for Classes\n\t// SPropertyEditorAsset for EditInlineNew ?\n\n\t// Get Default widgets\n\tTSharedPtr<SWidget> DefaultNameWidget;\n\tTSharedPtr<SWidget> DefaultValueWidget;\n\tPropertyRow->GetDefaultWidgets(\n\t\tDefaultNameWidget,\n\t\tDefaultValueWidget,\n\t\tfalse\n\t);\n\n\tFDetailWidgetRow& DetailWidgetRow = PropertyRow->CustomWidget(true);\n\tDetailWidgetRow.NameContent()\n\t[\n\t\tDefaultNameWidget.ToSharedRef()\n\t];\n\n\tTSharedPtr<SHorizontalBox> HorizontalBox;\n\tDetailWidgetRow.ValueContent()\n\t.MinDesiredWidth(GetRowMinimumDesiredWidth())\n\t[\n\t\tSAssignNew(HorizontalBox, SHorizontalBox)\n\t];\n\n\t// Default previous widget\n\t HorizontalBox->AddSlot()\n\t.Padding(0.f, 0.f, 2.f, 0.f)\n\t.FillWidth(1.f)\n\t// .AutoWidth()\n\t[\n\t\tDefaultValueWidget.ToSharedRef()\n\t];\n\n\t// Browse Asset\n\tHorizontalBox->AddSlot()\n\t.AutoWidth()\n\t.VAlign(VAlign_Center)\n\t.Padding(4.f)\n\t[\n\t\tSNew(SButton)\n\t\t.ButtonStyle(FEditorStyle::Get(), \"HoverHintOnly\")\n\t\t.ToolTipText(this, &Self::GetBrowseObjectText)\n\t\t.ContentPadding(4.f)\n\t\t.ForegroundColor(FSlateColor::UseForeground())\n\t\t.Visibility(this, &Self::GetBrowseButtonVisibility)\n\t\t.OnClicked(this, &Self::OnBrowseClicked)\n\t\t[\n\t\t\tSNew(SImage)\n\t\t\t.Image(FEditorStyle::GetBrush(\"PropertyWindow.Button_Browse\"))\n\t\t\t.ColorAndOpacity(FSlateColor::UseForeground())\n\t\t]\n\t];\n\n\t// Jump to Object\n\tHorizontalBox->AddSlot()\n\t.AutoWidth()\n\t.VAlign(VAlign_Center)\n\t.Padding(4.f, 2.f)\n\t[\n\t\tSNew(SButton)\n\t\t.ButtonStyle(FEditorStyle::Get(), \"HoverHintOnly\")\n\t\t.ToolTipText(this, &Self::GetJumpToObjectText)\n\t\t.ContentPadding(4.f)\n\t\t.ForegroundColor(FSlateColor::UseForeground())\n\t\t.Visibility(this, &Self::GetOpenButtonVisibility)\n\t\t.OnClicked(this, &Self::OnOpenClicked)\n\t\t[\n\t\t\tSNew(SImage)\n\t\t\t .Image(FEditorStyle::GetBrush(\"PropertyWindow.Button_Edit\"))\n\t\t\t .ColorAndOpacity( FSlateColor::UseForeground() )\n\n\t\t\t// SNew(STextBlock)\n\t\t\t// .Text(LOCTEXT(\"OpenObjectKey\", \"Open\"))\n\t\t\t// .Font(DEFAULT_FONT(\"Regular\", 10))\n\t\t]\n\t];\n}\n\nUObject* FDialogueObject_CustomRowHelper::GetObject() const\n{\n\tif (!PropertyRow)\n\t{\n\t\treturn nullptr;\n\t}\n\n\tTSharedPtr<IPropertyHandle> PropertyHandle = PropertyRow->GetPropertyHandle();\n\tif (!PropertyHandle.IsValid())\n\t{\n\t\treturn nullptr;\n\t}\n\tUObject* Object = nullptr;\n\tPropertyHandle->GetValue(Object);\n\treturn Object;\n}\n\nUBlueprint* FDialogueObject_CustomRowHelper::GetBlueprint() const\n{\n\tUObject* Object = GetObject();\n\tif (!Object)\n\t{\n\t\treturn nullptr;\n\t}\n\n\t// Class\n\tUClass* Class = Object->GetClass();\n\tif (const UBlueprintGeneratedClass* BlueprintClass = Cast<UBlueprintGeneratedClass>(Class))\n\t{\n\t\tif (UBlueprint* Blueprint = Cast<UBlueprint>(BlueprintClass->ClassGeneratedBy))\n\t\t{\n\t\t\treturn Blueprint;\n\t\t}\n\t}\n\n\treturn Cast<UBlueprint>(Object);\n}\n\n\nbool FDialogueObject_CustomRowHelper::IsObjectABlueprint() const\n{\n\treturn GetBlueprint() != nullptr;\n}\n\nFReply FDialogueObject_CustomRowHelper::OnBrowseClicked()\n{\n\tif (!GEditor)\n\t{\n\t\treturn FReply::Handled();\n\t}\n\n\tstatic constexpr bool bFocusContentBrowser = true;\n\tTArray<UObject*> ObjectsToSyncTo;\n\tif (UBlueprint* Blueprint = GetBlueprint())\n\t{\n\t\tObjectsToSyncTo.Add(Blueprint);\n\t}\n\tGEditor->SyncBrowserToObjects(ObjectsToSyncTo, bFocusContentBrowser);\n\n\treturn FReply::Handled();\n}\n\nFReply FDialogueObject_CustomRowHelper::OnOpenClicked()\n{\n\tif (UBlueprint* Blueprint = GetBlueprint())\n\t{\n\t\tFDialogueEditorUtilities::OpenBlueprintEditor(\n\t\t\tBlueprint,\n\t\t\tOpenType,\n\t\t\tFunctionNameToOpen,\n\t\t\tbForceFullEditor,\n\t\t\tbAddBlueprintFunctionIfItDoesNotExist\n\t\t);\n\t}\n\telse if (UObject* Object = GetObject())\n\t{\n\t\t// Native\n\t\tFSourceCodeNavigation::NavigateToClass(Object->GetClass());\n\t}\n\n\treturn FReply::Handled();\n}\n\nFText FDialogueObject_CustomRowHelper::GetBrowseObjectText() const\n{\n\treturn LOCTEXT(\"BrowseButtonToolTipText\", \"Browse to Asset in Content Browser\");\n}\n\nFText FDialogueObject_CustomRowHelper::GetJumpToObjectText() const\n{\n\tif (IsObjectABlueprint())\n\t{\n\t\treturn LOCTEXT(\"OpenObjectBlueprintTooltipKey\", \"Open Blueprint Editor\");\n\t}\n\n\t// Native Class\n\treturn FText::Format(\n\t\tLOCTEXT(\"OpenObjectBlueprintTooltipKey\", \"Open Source File in {0}\"),\n\t\tFSourceCodeNavigation::GetSelectedSourceCodeIDE()\n\t);\n}\n\nEVisibility FDialogueObject_CustomRowHelper::GetOpenButtonVisibility() const\n{\n\tif (!CanBeVisible())\n\t{\n\t\treturn EVisibility::Collapsed;\n\t}\n\n\tif (UObject* Object = GetObject())\n\t{\n\t\t// Blueprint\n\t\tif (IsObjectABlueprint())\n\t\t{\n\t\t\treturn EVisibility::Visible;\n\t\t}\n\n\t\t// Native\n\t\treturn FSourceCodeNavigation::CanNavigateToClass(Object->GetClass()) ? EVisibility::Visible : EVisibility::Collapsed;\n\t}\n\n\treturn EVisibility::Collapsed;\n}\n\nEVisibility FDialogueObject_CustomRowHelper::GetBrowseButtonVisibility() const\n{\n\tif (!CanBeVisible())\n\t{\n\t\treturn EVisibility::Collapsed;\n\t}\n\n\treturn IsObjectABlueprint() ? EVisibility::Visible : EVisibility::Collapsed;\n}\n\n#undef LOCTEXT_NAMESPACE\n#undef DEFAULT_FONT\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystemEditor/Private/DialogueEditor/DetailsPanel/Widgets/DialogueObject_CustomRowHelper.h",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#pragma once\n\n#include \"DetailWidgetRow.h\"\n#include \"DialogueEditorUtilities.h\"\n#include \"IDetailPropertyRow.h\"\n\nclass FDetailWidgetRow;\nclass UDlgDialogue;\nclass UBlueprint;\n\n\n// Custom row for Objects that most likely are Blueprints?\n// This only works with the IDetailPropertyRow::CustomWidget\n// If we don't use this the children of EditInlineNew won't be displayed\n// Custom row for things that can Handle Objects that are most likely Blueprints or Native Classes\n// And this helps us to open them in the Blueprint Editor or open the Native Class inside the IDE\nclass FDialogueObject_CustomRowHelper : public TSharedFromThis<FDialogueObject_CustomRowHelper>\n{\n\ttypedef FDialogueObject_CustomRowHelper Self;\n\npublic:\n\tFDialogueObject_CustomRowHelper(IDetailPropertyRow* InPropertyRow);\n\tvirtual ~FDialogueObject_CustomRowHelper() {}\n\n\t// Update the full property row.\n\tvoid Update();\n\n\t// Mutually exclusive with\n\tSelf& SetFunctionNameToOpen(EDialogueBlueprintOpenType InOpenType, FName Name)\n\t{\n\t\tOpenType = InOpenType;\n\t\tFunctionNameToOpen = Name;\n\t\treturn *this;\n\t}\n\nprotected:\n\t// Reset to default\n\tvirtual FReply OnBrowseClicked();\n\tvirtual FReply OnOpenClicked();\n\n\tvirtual UObject* GetObject() const;\n\tUBlueprint* GetBlueprint() const;\n\tbool IsObjectABlueprint() const;\n\n\tvirtual FText GetBrowseObjectText() const;\n\tvirtual FText GetJumpToObjectText() const;\n\tvirtual float GetRowMinimumDesiredWidth() const { return 300.f; }\n\n\tEVisibility GetOpenButtonVisibility() const;\n\tEVisibility GetBrowseButtonVisibility() const;\n\tvirtual bool CanBeVisible() const { return true; }\n\nprotected:\n\t// The Property handle of what this row represents\n\tIDetailPropertyRow* PropertyRow = nullptr;\n\n\t// Blueprint Editor\n\tbool bForceFullEditor = true;\n\tFName FunctionNameToOpen = NAME_None;\n\tbool bAddBlueprintFunctionIfItDoesNotExist = true;\n\tEDialogueBlueprintOpenType OpenType = EDialogueBlueprintOpenType::None;\n};\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystemEditor/Private/DialogueEditor/DetailsPanel/Widgets/DialogueTextPropertyPickList_CustomRowHelper.cpp",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#include \"DialogueTextPropertyPickList_CustomRowHelper.h\"\n\n#include \"DetailWidgetRow.h\"\n\n#include \"DialogueEditor/DetailsPanel/Widgets/SDialogueTextPropertyPickList.h\"\n\n#define LOCTEXT_NAMESPACE \"TextPropertyPickList_CustomRowHelper\"\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// FDialogueTextPropertyPickList_CustomRowHelper\nvoid FDialogueTextPropertyPickList_CustomRowHelper::UpdateInternal()\n{\n\tcheck(TextPropertyPickListWidget.IsValid());\n\tTextPropertyPickListWidget->SetToolTipAttribute(ToolTip);\n\tTextPropertyPickListWidget->SetPropertyHandle(PropertyHandle);\n\n\tDetailWidgetRow\n\t->NameContent()\n\t[\n\t\tNameContentWidget.ToSharedRef()\n\t]\n\t.ValueContent()\n\t// Similar to TextProperty, see FTextCustomization\n\t.MinDesiredWidth(209.f)\n\t.MaxDesiredWidth(600.f)\n\t[\n\t\tTextPropertyPickListWidget.ToSharedRef()\n\t];\n}\n\n#undef LOCTEXT_NAMESPACE\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystemEditor/Private/DialogueEditor/DetailsPanel/Widgets/DialogueTextPropertyPickList_CustomRowHelper.h",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#pragma once\n\n#include \"DetailWidgetRow.h\"\n\n#include \"DialogueBase_CustomRowHelper.h\"\n\nclass SDialogueTextPropertyPickList;\nclass FDetailWidgetRow;\n\n// Helper for details panel, when we want to use SDialogueTextPropertyPickList in a custom row in the details panel\nclass FDialogueTextPropertyPickList_CustomRowHelper : public FDialogueBase_CustomRowHelper\n{\n\ttypedef FDialogueTextPropertyPickList_CustomRowHelper Self;\n\ttypedef FDialogueBase_CustomRowHelper Super;\npublic:\n\tFDialogueTextPropertyPickList_CustomRowHelper(FDetailWidgetRow* InDetailWidgetRow, const TSharedPtr<IPropertyHandle>& InPropertyHandle)\n\t\t: FDialogueBase_CustomRowHelper(InDetailWidgetRow, InPropertyHandle) {}\n\n\t// Set the SPropertyPickList\n\tSelf& SetTextPropertyPickListWidget(const TSharedRef<SDialogueTextPropertyPickList>& InWidget)\n\t{\n\t\tTextPropertyPickListWidget = InWidget;\n\t\treturn *this;\n\t}\n\nprivate:\n\tvoid UpdateInternal() override;\n\nprivate:\n\t// The TextPropertyPickList Widget.\n\tTSharedPtr<SDialogueTextPropertyPickList> TextPropertyPickListWidget;\n};\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystemEditor/Private/DialogueEditor/DetailsPanel/Widgets/SDialogueTextPropertyEditableTextBox.cpp",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#include \"SDialogueTextPropertyEditableTextBox.h\"\n#include \"Internationalization/TextNamespaceUtil.h\"\n#include \"Widgets/SBoxPanel.h\"\n#include \"Widgets/Images/SImage.h\"\n#include \"Widgets/Text/STextBlock.h\"\n#include \"Widgets/Layout/SBox.h\"\n#include \"Widgets/Layout/SGridPanel.h\"\n#include \"Widgets/Layout/SUniformGridPanel.h\"\n#include \"Widgets/Input/SButton.h\"\n#include \"Widgets/Input/SMultiLineEditableTextBox.h\"\n#include \"Widgets/Input/SEditableTextBox.h\"\n#include \"Widgets/Input/SComboButton.h\"\n#include \"Widgets/Input/SComboBox.h\"\n#include \"Widgets/Input/SCheckBox.h\"\n#include \"EditorStyleSet.h\"\n#include \"AssetRegistryModule.h\"\n#include \"Internationalization/StringTable.h\"\n#include \"Internationalization/TextPackageNamespaceUtil.h\"\n#include \"Internationalization/StringTableCore.h\"\n#include \"Internationalization/StringTableRegistry.h\"\n#include \"Serialization/TextReferenceCollector.h\"\n#include \"DlgLocalizationHelper.h\"\n\n#define LOCTEXT_NAMESPACE \"STextPropertyEditableTextBox\"\n\nFText SDialogueTextPropertyEditableTextBox::MultipleValuesText(NSLOCTEXT(\"PropertyEditor\", \"MultipleValues\", \"Multiple Values\"));\n\nvoid SDialogueTextPropertyEditableTextBox::Construct(\n\tconst FArguments& InArgs,\n\tconst TSharedRef<IEditableTextProperty>& InEditableTextProperty,\n\tconst TSharedRef<IPropertyHandle>& InPropertyHandle\n)\n{\n\tEditableTextProperty = InEditableTextProperty;\n\tPropertyHandle = InPropertyHandle;\n\tbAddResetToDefaultWidget = InArgs._AddResetToDefaultWidget;\n\n\tTSharedPtr<SHorizontalBox> HorizontalBox;\n\n\t//const bool bIsPassword = EditableTextProperty->IsPassword();\n\t//bIsMultiLine = EditableTextProperty->IsMultiLineText();\n\tif (bIsMultiLine)\n\t{\n\t\tChildSlot\n\t\t[\n\t\t\tSAssignNew(HorizontalBox, SHorizontalBox)\n\t\t\t+SHorizontalBox::Slot()\n\t\t\t.FillWidth(1.0f)\n\t\t\t[\n\t\t\t\tSNew(SBox)\n\t\t\t\t.MinDesiredWidth(InArgs._MinDesiredWidth)\n\t\t\t\t.MaxDesiredHeight(InArgs._MaxDesiredHeight)\n\t\t\t\t[\n\t\t\t\t\tSAssignNew(MultiLineWidget, SMultiLineEditableTextBox)\n\t\t\t\t\t.Text(this, &Self::GetTextValue)\n\t\t\t\t\t.ToolTipText(this, &Self::GetToolTipText)\n\t\t\t\t\t.Style(InArgs._Style)\n\t\t\t\t\t.Font(InArgs._Font)\n\t\t\t\t\t.ForegroundColor(InArgs._ForegroundColor)\n\t\t\t\t\t.ReadOnlyForegroundColor(InArgs._ReadOnlyForegroundColor)\n\t\t\t\t\t.SelectAllTextWhenFocused(InArgs._SelectAllTextWhenFocused)\n\t\t\t\t\t.ClearKeyboardFocusOnCommit(InArgs._ClearKeyboardFocusOnCommit)\n\t\t\t\t\t.SelectAllTextOnCommit(InArgs._SelectAllTextOnCommit)\n\t\t\t\t\t.OnTextChanged(this, &Self::OnTextChanged)\n\t\t\t\t\t.OnTextCommitted(this, &Self::OnTextCommitted)\n\t\t\t\t\t.IsReadOnly(this, &Self::IsSourceTextReadOnly)\n\t\t\t\t\t.AutoWrapText(InArgs._AutoWrapText)\n\t\t\t\t\t.WrapTextAt(InArgs._WrapTextAt)\n\t\t\t\t\t.ModiferKeyForNewLine(InArgs._ModiferKeyForNewLine)\n\t\t\t\t\t.AllowMultiLine(true)\n\t\t\t\t\t//.IsPassword(bIsPassword)\n\t\t\t\t]\n\t\t\t]\n\t\t];\n\n\t\tPrimaryWidget = MultiLineWidget;\n\t}\n\telse\n\t{\n\t\tcheckNoEntry();\n\t}\n\n\tHorizontalBox->AddSlot()\n\t\t.AutoWidth()\n\t\t[\n\t\t\tSNew(SComboButton)\n\t\t\t.HAlign(HAlign_Center)\n\t\t\t.VAlign(VAlign_Center)\n\t\t\t.ContentPadding(FMargin(4, 0))\n\t\t\t.ButtonStyle(FEditorStyle::Get(), \"HoverHintOnly\")\n\t\t\t.ForegroundColor(FSlateColor::UseForeground())\n\t\t\t.ToolTipText(LOCTEXT(\"AdvancedTextSettingsComboToolTip\", \"Edit advanced text settings.\"))\n\t\t\t.MenuContent()\n\t\t\t[\n\t\t\t\tSNew(SBox)\n\t\t\t\t.WidthOverride(340)\n\t\t\t\t.Padding(4)\n\t\t\t\t[\n\t\t\t\t\tSNew(SGridPanel)\n\t\t\t\t\t.FillColumn(1, 1.0f)\n\n\t\t\t\t\t// Inline Text\n\t\t\t\t\t+SGridPanel::Slot(0, 0)\n\t\t\t\t\t.ColumnSpan(2)\n\t\t\t\t\t.Padding(2)\n\t\t\t\t\t.HAlign(HAlign_Left)\n\t\t\t\t\t.VAlign(VAlign_Center)\n\t\t\t\t\t[\n\t\t\t\t\t\tSNew(STextBlock)\n\t\t\t\t\t\t.TextStyle(FEditorStyle::Get(), \"LargeText\")\n\t\t\t\t\t\t.Text(LOCTEXT(\"TextInlineTextLabel\", \"Inline Text\"))\n\t\t\t\t\t]\n\n\t\t\t\t\t// Localizable?\n\t\t\t\t\t+SGridPanel::Slot(0, 1)\n\t\t\t\t\t.Padding(2)\n\t\t\t\t\t.HAlign(HAlign_Right)\n\t\t\t\t\t.VAlign(VAlign_Center)\n\t\t\t\t\t[\n\t\t\t\t\t\tSNew(STextBlock)\n\t\t\t\t\t\t.Text(LOCTEXT(\"TextLocalizableLabel\", \"Localizable:\"))\n\t\t\t\t\t]\n\t\t\t\t\t+SGridPanel::Slot(1, 1)\n\t\t\t\t\t.Padding(2)\n\t\t\t\t\t[\n\t\t\t\t\t\tSNew(SHorizontalBox)\n\n\t\t\t\t\t\t+SHorizontalBox::Slot()\n\t\t\t\t\t\t.AutoWidth()\n\t\t\t\t\t\t.Padding(0)\n\t\t\t\t\t\t[\n\t\t\t\t\t\t\tSNew(SUniformGridPanel)\n\t\t\t\t\t\t\t.SlotPadding(FMargin(0, 0, 4, 0))\n\n\t\t\t\t\t\t\t+SUniformGridPanel::Slot(0, 0)\n\t\t\t\t\t\t\t[\n\t\t\t\t\t\t\t\tSNew(SCheckBox)\n\t\t\t\t\t\t\t\t.Style(FEditorStyle::Get(), \"ToggleButtonCheckbox\")\n\t\t\t\t\t\t\t\t.ToolTipText(LOCTEXT(\"TextLocalizableToggleYesToolTip\", \"Assign this text a key and allow it to be gathered for localization.\"))\n\t\t\t\t\t\t\t\t.Padding(FMargin(4, 2))\n\t\t\t\t\t\t\t\t.HAlign(HAlign_Center)\n\t\t\t\t\t\t\t\t.IsEnabled(this, &Self::IsCultureInvariantFlagEnabled)\n\t\t\t\t\t\t\t\t.IsChecked(this, &Self::GetLocalizableCheckState, true/*bActiveState*/)\n\t\t\t\t\t\t\t\t.OnCheckStateChanged(this, &Self::HandleLocalizableCheckStateChanged, true/*bActiveState*/)\n\t\t\t\t\t\t\t\t[\n\t\t\t\t\t\t\t\t\tSNew(STextBlock)\n\t\t\t\t\t\t\t\t\t.Text(LOCTEXT(\"TextLocalizableToggleYes\", \"Yes\"))\n\t\t\t\t\t\t\t\t]\n\t\t\t\t\t\t\t]\n\n\t\t\t\t\t\t\t+SUniformGridPanel::Slot(1, 0)\n\t\t\t\t\t\t\t[\n\t\t\t\t\t\t\t\tSNew(SCheckBox)\n\t\t\t\t\t\t\t\t.Style(FEditorStyle::Get(), \"ToggleButtonCheckbox\")\n\t\t\t\t\t\t\t\t.ToolTipText(LOCTEXT(\"TextLocalizableToggleNoToolTip\", \"Mark this text as 'culture invariant' to prevent it being gathered for localization.\"))\n\t\t\t\t\t\t\t\t.Padding(FMargin(4, 2))\n\t\t\t\t\t\t\t\t.HAlign(HAlign_Center)\n\t\t\t\t\t\t\t\t.IsEnabled(this, &Self::IsCultureInvariantFlagEnabled)\n\t\t\t\t\t\t\t\t.IsChecked(this, &Self::GetLocalizableCheckState, false/*bActiveState*/)\n\t\t\t\t\t\t\t\t.OnCheckStateChanged(this, &Self::HandleLocalizableCheckStateChanged, false/*bActiveState*/)\n\t\t\t\t\t\t\t\t[\n\t\t\t\t\t\t\t\t\tSNew(STextBlock)\n\t\t\t\t\t\t\t\t\t.Text(LOCTEXT(\"TextLocalizableToggleNo\", \"No\"))\n\t\t\t\t\t\t\t\t]\n\t\t\t\t\t\t\t]\n\t\t\t\t\t\t]\n\t\t\t\t\t]\n\n#if USE_STABLE_LOCALIZATION_KEYS\n\t\t\t\t\t// Package\n\t\t\t\t\t+SGridPanel::Slot(0, 2)\n\t\t\t\t\t.Padding(2)\n\t\t\t\t\t.HAlign(HAlign_Right)\n\t\t\t\t\t.VAlign(VAlign_Center)\n\t\t\t\t\t[\n\t\t\t\t\t\tSNew(STextBlock)\n\t\t\t\t\t\t.Text(LOCTEXT(\"TextPackageLabel\", \"Package:\"))\n\t\t\t\t\t\t.Visibility(this, &Self::GetLocalizableVisibility)\n\t\t\t\t\t]\n\t\t\t\t\t+SGridPanel::Slot(1, 2)\n\t\t\t\t\t.Padding(2)\n\t\t\t\t\t[\n\t\t\t\t\t\tSNew(SEditableTextBox)\n\t\t\t\t\t\t.Text(this, &Self::GetPackageValue)\n\t\t\t\t\t\t.Visibility(this, &Self::GetLocalizableVisibility)\n\t\t\t\t\t\t.IsReadOnly(true)\n\t\t\t\t\t]\n#endif // USE_STABLE_LOCALIZATION_KEYS\n\n\t\t\t\t\t// Namespace\n\t\t\t\t\t+SGridPanel::Slot(0, 3)\n\t\t\t\t\t.Padding(2)\n\t\t\t\t\t.HAlign(HAlign_Right)\n\t\t\t\t\t.VAlign(VAlign_Center)\n\t\t\t\t\t[\n\t\t\t\t\t\tSNew(STextBlock)\n\t\t\t\t\t\t.Text(LOCTEXT(\"TextNamespaceLabel\", \"Namespace:\"))\n\t\t\t\t\t\t.Visibility(this, &Self::GetLocalizableVisibility)\n\t\t\t\t\t]\n\t\t\t\t\t+SGridPanel::Slot(1, 3)\n\t\t\t\t\t.Padding(2)\n\t\t\t\t\t[\n\t\t\t\t\t\tSAssignNew(NamespaceEditableTextBox, SEditableTextBox)\n\t\t\t\t\t\t.Text(this, &Self::GetNamespaceValue)\n\t\t\t\t\t\t.SelectAllTextWhenFocused(true)\n\t\t\t\t\t\t.ClearKeyboardFocusOnCommit(false)\n\t\t\t\t\t\t.OnTextChanged(this, &Self::OnNamespaceChanged)\n\t\t\t\t\t\t.OnTextCommitted(this, &Self::OnNamespaceCommitted)\n\t\t\t\t\t\t.SelectAllTextOnCommit(true)\n\t\t\t\t\t\t.Visibility(this, &Self::GetLocalizableVisibility)\n\t\t\t\t\t\t.IsReadOnly(this, &Self::IsNamespaceReadOnly)\n\t\t\t\t\t]\n\n\t\t\t\t\t// Warning, key will be overriden\n\t\t\t\t\t+SGridPanel::Slot(2, 3)\n\t\t\t\t\t.Padding(2)\n\t\t\t\t\t[\n\t\t\t\t\t\tSNew(SImage)\n\t\t\t\t\t\t.Image(FCoreStyle::Get().GetBrush(\"Icons.Warning\"))\n\t\t\t\t\t\t.Visibility(this, &Self::GetNamespaceOverridenWarningImageVisibility)\n\t\t\t\t\t\t.ToolTipText(LOCTEXT(\"NamespaceOverridenWarningToolTip\", \"The namespace will be overriden on Save.\\nTo change this bevahiour go to Project Settings -> (Editors) Dialogue -> Localization\"))\n\t\t\t\t\t]\n\n\t\t\t\t\t// Key\n\t\t\t\t\t+SGridPanel::Slot(0, 4)\n\t\t\t\t\t.Padding(2)\n\t\t\t\t\t.HAlign(HAlign_Right)\n\t\t\t\t\t.VAlign(VAlign_Center)\n\t\t\t\t\t[\n\t\t\t\t\t\tSNew(STextBlock)\n\t\t\t\t\t\t.Text(LOCTEXT(\"TextKeyLabel\", \"Key:\"))\n\t\t\t\t\t\t.Visibility(this, &Self::GetLocalizableVisibility)\n\t\t\t\t\t]\n\t\t\t\t\t+SGridPanel::Slot(1, 4)\n\t\t\t\t\t.Padding(2)\n\t\t\t\t\t[\n\t\t\t\t\t\tSAssignNew(KeyEditableTextBox, SEditableTextBox)\n\t\t\t\t\t\t.Text(this, &Self::GetKeyValue)\n\t\t\t\t\t\t.Visibility(this, &Self::GetLocalizableVisibility)\n#if USE_STABLE_LOCALIZATION_KEYS\n\t\t\t\t\t\t.SelectAllTextWhenFocused(true)\n\t\t\t\t\t\t.ClearKeyboardFocusOnCommit(false)\n\t\t\t\t\t\t.OnTextChanged(this, &Self::OnKeyChanged)\n\t\t\t\t\t\t.OnTextCommitted(this, &Self::OnKeyCommitted)\n\t\t\t\t\t\t.SelectAllTextOnCommit(true)\n\t\t\t\t\t\t.IsReadOnly(this, &Self::IsKeyReadOnly)\n#else\t// USE_STABLE_LOCALIZATION_KEYS\n\t\t\t\t\t\t.IsReadOnly(true)\n#endif\t// USE_STABLE_LOCALIZATION_KEYS\n\t\t\t\t\t]\n\n\t\t\t\t\t// Referenced Text\n\t\t\t\t\t+SGridPanel::Slot(0, 5)\n\t\t\t\t\t.ColumnSpan(2)\n\t\t\t\t\t.Padding(2)\n\t\t\t\t\t.HAlign(HAlign_Left)\n\t\t\t\t\t.VAlign(VAlign_Center)\n\t\t\t\t\t[\n\t\t\t\t\t\tSNew(STextBlock)\n\t\t\t\t\t\t.TextStyle(FEditorStyle::Get(), \"LargeText\")\n\t\t\t\t\t\t.Text(LOCTEXT(\"TextReferencedTextLabel\", \"Referenced Text\"))\n\t\t\t\t\t\t.Visibility(this, &Self::GetLocalizableVisibility)\n\t\t\t\t\t]\n\n\t\t\t\t\t// String Table\n\t\t\t\t\t+SGridPanel::Slot(0, 6)\n\t\t\t\t\t.Padding(2)\n\t\t\t\t\t.HAlign(HAlign_Right)\n\t\t\t\t\t.VAlign(VAlign_Center)\n\t\t\t\t\t[\n\t\t\t\t\t\tSNew(STextBlock)\n\t\t\t\t\t\t.Text(LOCTEXT(\"TextStringTableLabel\", \"String Table:\"))\n\t\t\t\t\t\t.Visibility(this, &Self::GetLocalizableVisibility)\n\t\t\t\t\t]\n\t\t\t\t\t+SGridPanel::Slot(1, 6)\n\t\t\t\t\t.Padding(2)\n\t\t\t\t\t[\n\t\t\t\t\t\tSNew(STextPropertyEditableStringTableReference, InEditableTextProperty)\n\t\t\t\t\t\t.AllowUnlink(true)\n\t\t\t\t\t\t.IsEnabled(this, &Self::CanEdit)\n\t\t\t\t\t\t.Visibility(this, &Self::GetLocalizableVisibility)\n\t\t\t\t\t]\n\t\t\t\t]\n\t\t\t]\n\t\t];\n\n\tHorizontalBox->AddSlot()\n\t\t.VAlign(VAlign_Center)\n\t\t.HAlign(HAlign_Center)\n\t\t.AutoWidth()\n\t\t[\n\t\t\tSNew(SImage)\n\t\t\t.Image(FCoreStyle::Get().GetBrush(\"Icons.Warning\"))\n\t\t\t.Visibility(this, &Self::GetTextWarningImageVisibility)\n\t\t\t.ToolTipText(LOCTEXT(\"TextNotLocalizedWarningToolTip\", \"This text is marked as 'culture invariant' and won't be gathered for localization.\\nYou can change this by editing the advanced text settings.\"))\n\t\t];\n\n\n\t// Add Reset to default\n\tif (bAddResetToDefaultWidget)\n\t{\n\t\tPropertyHandle->MarkResetToDefaultCustomized(true);\n\t\tHorizontalBox->AddSlot()\n\t\t.AutoWidth()\n\t\t.VAlign(VAlign_Center)\n\t\t.Padding(4.f, 2.f)\n\t\t[\n\t\t\tSNew(SButton)\n\t\t\t.IsFocusable(false)\n\t\t\t.ToolTipText(this, &Self::GetResetToolTip)\n\t\t\t.ButtonStyle(FEditorStyle::Get(), \"NoBorder\")\n\t\t\t.ContentPadding(0)\n\t\t\t.Visibility(this, &Self::GetDiffersFromDefaultAsVisibility)\n\t\t\t.OnClicked(this, &Self::OnResetClicked)\n\t\t\t.Content()\n\t\t\t[\n\t\t\t\tSNew(SImage)\n\t\t\t\t.Image(FEditorStyle::GetBrush(\"PropertyWindow.DiffersFromDefault\"))\n\t\t\t]\n\t\t];\n\t}\n\n\tSetEnabled(TAttribute<bool>(this, &Self::CanEdit));\n}\n\nFText SDialogueTextPropertyEditableTextBox::GetResetToolTip() const\n{\n\tFString Tooltip = NSLOCTEXT(\"PropertyEditor\", \"ResetToDefaultToolTip\", \"Reset to Default\").ToString();\n\tif (PropertyHandle.IsValid() && !PropertyHandle->IsEditConst() && PropertyHandle->DiffersFromDefault())\n\t{\n\t\tconst FString DefaultLabel = PropertyHandle->GetResetToDefaultLabel().ToString();\n\t\tif (DefaultLabel.Len() > 0)\n\t\t{\n\t\t\tTooltip += \"\\n\";\n\t\t\tTooltip += DefaultLabel;\n\t\t}\n\t}\n\n\treturn FText::FromString(Tooltip);\n}\n\nEVisibility SDialogueTextPropertyEditableTextBox::GetDiffersFromDefaultAsVisibility() const\n{\n\tif (PropertyHandle.IsValid())\n\t{\n\t\treturn PropertyHandle->DiffersFromDefault() ? EVisibility::Visible : EVisibility::Hidden;\n\t}\n\n\treturn EVisibility::Visible;\n}\n\nFReply SDialogueTextPropertyEditableTextBox::OnResetClicked()\n{\n\tif (EditableTextProperty.IsValid() && PropertyHandle.IsValid())\n\t{\n\t\tPropertyHandle->ResetToDefault();\n\t\tSetTextValue(EditableTextProperty->GetText(0));\n\t}\n\treturn FReply::Handled();\n}\n\n\nEVisibility SDialogueTextPropertyEditableTextBox::GetLocalizableVisibility() const\n{\n\tconst int32 NumTexts = EditableTextProperty->GetNumTexts();\n\tif (NumTexts == 1)\n\t{\n\t\tconst FText PropertyValue = EditableTextProperty->GetText(0);\n\t\treturn PropertyValue.IsCultureInvariant() ? EVisibility::Collapsed : EVisibility::Visible;\n\t}\n\treturn EVisibility::Visible;\n}\n\nvoid SDialogueTextPropertyEditableTextBox::GetDesiredWidth(float& OutMinDesiredWidth, float& OutMaxDesiredWidth)\n{\n\tif (bIsMultiLine)\n\t{\n\t\tOutMinDesiredWidth = 250.0f;\n\t}\n\telse\n\t{\n\t\tOutMinDesiredWidth = 125.0f;\n\t}\n\n\tOutMaxDesiredWidth = 600.0f;\n}\n\nbool SDialogueTextPropertyEditableTextBox::SupportsKeyboardFocus() const\n{\n\treturn PrimaryWidget.IsValid() && PrimaryWidget->SupportsKeyboardFocus();\n}\n\nFReply SDialogueTextPropertyEditableTextBox::OnFocusReceived(const FGeometry& MyGeometry, const FFocusEvent& InFocusEvent)\n{\n\t// Forward keyboard focus to our editable text widget\n\treturn FReply::Handled().SetUserFocus(PrimaryWidget.ToSharedRef(), InFocusEvent.GetCause());\n}\n\nvoid SDialogueTextPropertyEditableTextBox::Tick(const FGeometry& AllottedGeometry, double InCurrentTime, float InDeltaTime)\n{\n\tconst float CurrentHeight = AllottedGeometry.GetLocalSize().Y;\n\tif (bIsMultiLine && PreviousHeight.IsSet() && PreviousHeight.GetValue() != CurrentHeight)\n\t{\n\t\tEditableTextProperty->RequestRefresh();\n\t}\n\tPreviousHeight = CurrentHeight;\n}\n\nbool SDialogueTextPropertyEditableTextBox::CanEdit() const\n{\n\tconst bool bIsReadOnly = FTextLocalizationManager::Get().IsLocalizationLocked() || EditableTextProperty->IsReadOnly();\n\treturn !bIsReadOnly;\n}\n\nbool SDialogueTextPropertyEditableTextBox::IsCultureInvariantFlagEnabled() const\n{\n\treturn !IsSourceTextReadOnly();\n}\n\nbool SDialogueTextPropertyEditableTextBox::IsSourceTextReadOnly() const\n{\n\tif (!CanEdit())\n\t{\n\t\treturn true;\n\t}\n\n\t// We can't edit the source string of string table references\n\tconst int32 NumTexts = EditableTextProperty->GetNumTexts();\n\tif (NumTexts == 1)\n\t{\n\t\tconst FText TextValue = EditableTextProperty->GetText(0);\n\t\tif (TextValue.IsFromStringTable())\n\t\t{\n\t\t\treturn true;\n\t\t}\n\t}\n\n\treturn false;\n}\n\nbool SDialogueTextPropertyEditableTextBox::WillNamespaceBeUpdated() const\n{\n\treturn !IsIdentityReadOnly() && FDlgLocalizationHelper::WillTextNamespaceBeUpdated(GetTextValue());\n}\n\nbool SDialogueTextPropertyEditableTextBox::IsNamespaceReadOnly() const\n{\n\treturn IsIdentityReadOnly() || WillNamespaceBeUpdated();\n}\n\nbool SDialogueTextPropertyEditableTextBox::IsIdentityReadOnly() const\n{\n\tif (!CanEdit())\n\t{\n\t\treturn true;\n\t}\n\n\t// We can't edit the identity of texts that don't gather for localization\n\tconst int32 NumTexts = EditableTextProperty->GetNumTexts();\n\tif (NumTexts == 1)\n\t{\n\t\tconst FText TextValue = EditableTextProperty->GetText(0);\n\t\tif (!TextValue.ShouldGatherForLocalization())\n\t\t{\n\t\t\treturn true;\n\t\t}\n\t}\n\n\treturn false;\n}\n\nFText SDialogueTextPropertyEditableTextBox::GetToolTipText() const\n{\n\tFText LocalizedTextToolTip;\n\tconst int32 NumTexts = EditableTextProperty->GetNumTexts();\n\tif (NumTexts == 1)\n\t{\n\t\tconst FText TextValue = EditableTextProperty->GetText(0);\n\n\t\tif (TextValue.IsFromStringTable())\n\t\t{\n\t\t\tFName TableId;\n\t\t\tFString Key;\n\t\t\tFStringTableRegistry::Get().FindTableIdAndKey(TextValue, TableId, Key);\n\n\t\t\tLocalizedTextToolTip = FText::Format(\n\t\t\t\tLOCTEXT(\"StringTableTextToolTipFmt\", \"--- String Table Reference ---\\nTable ID: {0}\\nKey: {1}\"),\n\t\t\t\tFText::FromName(TableId), FText::FromString(Key)\n\t\t\t\t);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tbool bIsLocalized = false;\n\t\t\tFString Namespace;\n\t\t\tFString Key;\n\t\t\tconst FString* SourceString = FTextInspector::GetSourceString(TextValue);\n\n\t\t\tif (SourceString && TextValue.ShouldGatherForLocalization())\n\t\t\t{\n\t\t\t\tbIsLocalized = FTextLocalizationManager::Get().FindNamespaceAndKeyFromDisplayString(FTextInspector::GetSharedDisplayString(TextValue), Namespace, Key);\n\t\t\t}\n\n\t\t\tif (bIsLocalized)\n\t\t\t{\n\t\t\t\tconst FString PackageNamespace = TextNamespaceUtil::ExtractPackageNamespace(Namespace);\n\t\t\t\tconst FString TextNamespace = TextNamespaceUtil::StripPackageNamespace(Namespace);\n\n\t\t\t\tLocalizedTextToolTip = FText::Format(\n\t\t\t\t\tLOCTEXT(\"LocalizedTextToolTipFmt\", \"--- Localized Text ---\\nPackage: {0}\\nNamespace: {1}\\nKey: {2}\\nSource: {3}\"),\n\t\t\t\t\tFText::FromString(PackageNamespace), FText::FromString(TextNamespace), FText::FromString(Key), FText::FromString(*SourceString)\n\t\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\n\tFText BaseToolTipText = EditableTextProperty->GetToolTipText();\n\tif (FTextLocalizationManager::Get().IsLocalizationLocked())\n\t{\n\t\tconst FText LockdownToolTip = FTextLocalizationManager::Get().IsGameLocalizationPreviewEnabled()\n\t\t\t? LOCTEXT(\"LockdownToolTip_Preview\", \"Localization is locked down due to the active game localization preview\")\n\t\t\t: LOCTEXT(\"LockdownToolTip_Other\", \"Localization is locked down\");\n\t\tBaseToolTipText = BaseToolTipText.IsEmptyOrWhitespace() ? LockdownToolTip : FText::Format(LOCTEXT(\"ToolTipLockdownFmt\", \"!!! {0} !!!\\n\\n{1}\"), LockdownToolTip, BaseToolTipText);\n\t}\n\n\tif (LocalizedTextToolTip.IsEmptyOrWhitespace())\n\t{\n\t\treturn BaseToolTipText;\n\t}\n\tif (BaseToolTipText.IsEmptyOrWhitespace())\n\t{\n\t\treturn LocalizedTextToolTip;\n\t}\n\n\treturn FText::Format(LOCTEXT(\"ToolTipCompleteFmt\", \"{0}\\n\\n{1}\"), BaseToolTipText, LocalizedTextToolTip);\n}\n\nFText SDialogueTextPropertyEditableTextBox::GetTextValue() const\n{\n\tFText TextValue;\n\n\tconst int32 NumTexts = EditableTextProperty->GetNumTexts();\n\tif (NumTexts == 1)\n\t{\n\t\tTextValue = EditableTextProperty->GetText(0);\n\t}\n\telse if (NumTexts > 1)\n\t{\n\t\tTextValue = MultipleValuesText;\n\t}\n\n\treturn TextValue;\n}\n\nvoid SDialogueTextPropertyEditableTextBox::SetTextValue(const FText& NewValue)\n{\n\tif (MultiLineWidget.IsValid())\n\t{\n\t\tMultiLineWidget->SetText(NewValue);\n\t}\n}\n\nvoid SDialogueTextPropertyEditableTextBox::OnTextChanged(const FText& NewText)\n{\n\tconst int32 NumTexts = EditableTextProperty->GetNumTexts();\n\n\tFText TextErrorMsg;\n\n\t// Don't validate the Multiple Values text if there are multiple properties being set\n\tif (NumTexts > 0 && (NumTexts == 1 || NewText.ToString().Equals(MultipleValuesText.ToString(), ESearchCase::CaseSensitive)))\n\t{\n\t\tEditableTextProperty->IsValidText(NewText, TextErrorMsg);\n\t}\n\n\t// Update or clear the error message\n\tSetTextError(TextErrorMsg);\n\tTextChangedEvent.Broadcast(NewText);\n}\n\nvoid SDialogueTextPropertyEditableTextBox::OnTextCommitted(const FText& NewText, ETextCommit::Type CommitInfo)\n{\n\tconst int32 NumTexts = EditableTextProperty->GetNumTexts();\n\n\t// Don't commit the Multiple Values text if there are multiple properties being set\n\tif (NumTexts > 0 && (NumTexts == 1 || !NewText.ToString().Equals(MultipleValuesText.ToString(), ESearchCase::CaseSensitive)))\n\t{\n\t\tFText TextErrorMsg;\n\t\tif (EditableTextProperty->IsValidText(NewText, TextErrorMsg))\n\t\t{\n\t\t\t// Valid text; clear any error\n\t\t\tSetTextError(FText::GetEmpty());\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// Invalid text; set the error and prevent the new text from being set\n\t\t\tSetTextError(TextErrorMsg);\n\t\t\treturn;\n\t\t}\n\n\t\tconst FString& SourceString = NewText.ToString();\n\t\tfor (int32 TextIndex = 0; TextIndex < NumTexts; ++TextIndex)\n\t\t{\n\t\t\tconst FText PropertyValue = EditableTextProperty->GetText(TextIndex);\n\n\t\t\t// Only apply the change if the new text is different\n\t\t\tif (PropertyValue.ToString().Equals(NewText.ToString(), ESearchCase::CaseSensitive))\n\t\t\t{\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Is the new text is empty, just use the empty instance\n\t\t\tif (NewText.IsEmpty())\n\t\t\t{\n\t\t\t\tEditableTextProperty->SetText(TextIndex, FText::GetEmpty());\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Maintain culture invariance when editing the text\n\t\t\tif (PropertyValue.IsCultureInvariant())\n\t\t\t{\n\t\t\t\tEditableTextProperty->SetText(TextIndex, FText::AsCultureInvariant(NewText.ToString()));\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tFString NewNamespace;\n\t\t\tFString NewKey;\n#if USE_STABLE_LOCALIZATION_KEYS\n\t\t\t{\n\t\t\t\t// Get the stable namespace and key that we should use for this property\n\t\t\t\tconst FString* TextSource = FTextInspector::GetSourceString(PropertyValue);\n\t\t\t\tEditableTextProperty->GetStableTextId(\n\t\t\t\t\tTextIndex,\n\t\t\t\t\tIEditableTextProperty::ETextPropertyEditAction::EditedSource,\n\t\t\t\t\tTextSource ? *TextSource : FString(),\n\t\t\t\t\tFTextInspector::GetNamespace(PropertyValue).Get(FString()),\n\t\t\t\t\tFTextInspector::GetKey(PropertyValue).Get(FString()),\n\t\t\t\t\tNewNamespace,\n\t\t\t\t\tNewKey\n\t\t\t\t\t);\n\t\t\t}\n#else\t// USE_STABLE_LOCALIZATION_KEYS\n\t\t\t{\n\t\t\t\t// We want to preserve the namespace set on this property if it's *not* the default value\n\t\t\t\tif (!EditableTextProperty->IsDefaultValue())\n\t\t\t\t{\n\t\t\t\t\t// Some properties report that they're not the default, but still haven't been set from a property, so we also check the property key to see if it's a valid GUID before allowing the namespace to persist\n\t\t\t\t\tFGuid TmpGUID;\n\t\t\t\t\tif (FGuid::Parse(FTextInspector::GetKey(PropertyValue).Get(FString()), TmpGUID))\n\t\t\t\t\t{\n\t\t\t\t\t\tNewNamespace = FTextInspector::GetNamespace(PropertyValue).Get(FString());\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tNewKey = FGuid::NewGuid().ToString();\n\t\t\t}\n#endif\t// USE_STABLE_LOCALIZATION_KEYS\n\n\t\t\tconst FText FinalText = FText::ChangeKey(NewNamespace, NewKey, NewText);\n\t\t\tEditableTextProperty->SetText(TextIndex, FinalText);\n\t\t\tTextCommittedEvent.Broadcast(FinalText, CommitInfo);\n\t\t}\n\t}\n}\n\nvoid SDialogueTextPropertyEditableTextBox::SetTextError(const FText& InErrorMsg)\n{\n\tif (MultiLineWidget.IsValid())\n\t{\n\t\tMultiLineWidget->SetError(InErrorMsg);\n\t}\n\n\t// if (SingleLineWidget.IsValid())\n\t// {\n\t// \tSingleLineWidget->SetError(InErrorMsg);\n\t// }\n}\n\nFText SDialogueTextPropertyEditableTextBox::GetNamespaceValue() const\n{\n\tFText NamespaceValue;\n\n\tconst int32 NumTexts = EditableTextProperty->GetNumTexts();\n\tif (NumTexts == 1)\n\t{\n\t\tconst FText PropertyValue = EditableTextProperty->GetText(0);\n\t\tTOptional<FString> FoundNamespace = FTextInspector::GetNamespace(PropertyValue);\n\t\tif (FoundNamespace.IsSet())\n\t\t{\n\t\t\tNamespaceValue = FText::FromString(TextNamespaceUtil::StripPackageNamespace(FoundNamespace.GetValue()));\n\t\t}\n\t}\n\telse if (NumTexts > 1)\n\t{\n\t\tNamespaceValue = MultipleValuesText;\n\t}\n\n\treturn NamespaceValue;\n}\n\nvoid SDialogueTextPropertyEditableTextBox::OnNamespaceChanged(const FText& NewText)\n{\n\tFText ErrorMessage;\n\tconst FText ErrorCtx = LOCTEXT(\"TextNamespaceErrorCtx\", \"Namespace\");\n\tIsValidIdentity(NewText, &ErrorMessage, &ErrorCtx);\n\n\tNamespaceEditableTextBox->SetError(ErrorMessage);\n}\n\nvoid SDialogueTextPropertyEditableTextBox::OnNamespaceCommitted(const FText& NewText, ETextCommit::Type CommitInfo)\n{\n\tif (!IsValidIdentity(NewText))\n\t{\n\t\treturn;\n\t}\n\n\tconst int32 NumTexts = EditableTextProperty->GetNumTexts();\n\n\t// Don't commit the Multiple Values text if there are multiple properties being set\n\tif (NumTexts > 0 && (NumTexts == 1 || NewText.ToString() != MultipleValuesText.ToString()))\n\t{\n\t\tconst FString& TextNamespace = NewText.ToString();\n\t\tfor (int32 TextIndex = 0; TextIndex < NumTexts; ++TextIndex)\n\t\t{\n\t\t\tconst FText PropertyValue = EditableTextProperty->GetText(TextIndex);\n\n\t\t\t// Only apply the change if the new namespace is different - we want to keep the keys stable where possible\n\t\t\tconst FString CurrentTextNamespace = TextNamespaceUtil::StripPackageNamespace(FTextInspector::GetNamespace(PropertyValue).Get(FString()));\n\t\t\tif (CurrentTextNamespace.Equals(TextNamespace, ESearchCase::CaseSensitive))\n\t\t\t{\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Get the stable namespace and key that we should use for this property\n\t\t\tFString NewNamespace;\n\t\t\tFString NewKey;\n#if USE_STABLE_LOCALIZATION_KEYS\n\t\t\t{\n\t\t\t\tconst FString* TextSource = FTextInspector::GetSourceString(PropertyValue);\n\t\t\t\tEditableTextProperty->GetStableTextId(\n\t\t\t\t\tTextIndex,\n\t\t\t\t\tIEditableTextProperty::ETextPropertyEditAction::EditedNamespace,\n\t\t\t\t\tTextSource ? *TextSource : FString(),\n\t\t\t\t\tTextNamespace,\n\t\t\t\t\tFTextInspector::GetKey(PropertyValue).Get(FString()),\n\t\t\t\t\tNewNamespace,\n\t\t\t\t\tNewKey\n\t\t\t\t\t);\n\t\t\t}\n#else\t// USE_STABLE_LOCALIZATION_KEYS\n\t\t\t{\n\t\t\t\tNewNamespace = TextNamespace;\n\n\t\t\t\t// If the current key is a GUID, then we can preserve that when setting the new namespace\n\t\t\t\tNewKey = FTextInspector::GetKey(PropertyValue).Get(FString());\n\t\t\t\t{\n\t\t\t\t\tFGuid TmpGuid;\n\t\t\t\t\tif (!FGuid::Parse(NewKey, TmpGuid))\n\t\t\t\t\t{\n\t\t\t\t\t\tNewKey = FGuid::NewGuid().ToString();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n#endif\t// USE_STABLE_LOCALIZATION_KEYS\n\n\t\t\tEditableTextProperty->SetText(TextIndex, FText::ChangeKey(NewNamespace, NewKey, PropertyValue));\n\t\t}\n\t}\n}\n\nFText SDialogueTextPropertyEditableTextBox::GetKeyValue() const\n{\n\tFText KeyValue;\n\n\tconst int32 NumTexts = EditableTextProperty->GetNumTexts();\n\tif (NumTexts == 1)\n\t{\n\t\tconst FText PropertyValue = EditableTextProperty->GetText(0);\n\t\tTOptional<FString> FoundKey = FTextInspector::GetKey(PropertyValue);\n\t\tif (FoundKey.IsSet())\n\t\t{\n\t\t\tKeyValue = FText::FromString(FoundKey.GetValue());\n\t\t}\n\t}\n\telse if (NumTexts > 1)\n\t{\n\t\tKeyValue = MultipleValuesText;\n\t}\n\n\treturn KeyValue;\n}\n\n#if USE_STABLE_LOCALIZATION_KEYS\n\nvoid SDialogueTextPropertyEditableTextBox::OnKeyChanged(const FText& NewText)\n{\n\tFText ErrorMessage;\n\tconst FText ErrorCtx = LOCTEXT(\"TextKeyErrorCtx\", \"Key\");\n\tconst bool bIsValidName = IsValidIdentity(NewText, &ErrorMessage, &ErrorCtx);\n\n\tif (NewText.IsEmptyOrWhitespace())\n\t{\n\t\tErrorMessage = LOCTEXT(\"TextKeyEmptyErrorMsg\", \"Key cannot be empty so a new key will be assigned\");\n\t}\n\telse if (bIsValidName)\n\t{\n\t\t// Valid name, so check it won't cause an identity conflict (only test if we have a single text selected to avoid confusion)\n\t\tconst int32 NumTexts = EditableTextProperty->GetNumTexts();\n\t\tif (NumTexts == 1)\n\t\t{\n\t\t\tconst FText PropertyValue = EditableTextProperty->GetText(0);\n\n\t\t\tconst FString TextNamespace = FTextInspector::GetNamespace(PropertyValue).Get(FString());\n\t\t\tconst FString TextKey = NewText.ToString();\n\n\t\t\t// Get the stable namespace and key that we should use for this property\n\t\t\t// If it comes back with the same namespace but a different key then it means there was an identity conflict\n\t\t\tFString NewNamespace;\n\t\t\tFString NewKey;\n\t\t\tconst FString* TextSource = FTextInspector::GetSourceString(PropertyValue);\n\t\t\tEditableTextProperty->GetStableTextId(\n\t\t\t\t0,\n\t\t\t\tIEditableTextProperty::ETextPropertyEditAction::EditedKey,\n\t\t\t\tTextSource ? *TextSource : FString(),\n\t\t\t\tTextNamespace,\n\t\t\t\tTextKey,\n\t\t\t\tNewNamespace,\n\t\t\t\tNewKey\n\t\t\t\t);\n\n\t\t\tif (TextNamespace.Equals(NewNamespace, ESearchCase::CaseSensitive) && !TextKey.Equals(NewKey, ESearchCase::CaseSensitive))\n\t\t\t{\n\t\t\t\tErrorMessage = LOCTEXT(\"TextKeyConflictErrorMsg\", \"Identity (namespace & key) is being used by a different text within this package so a new key will be assigned\");\n\t\t\t}\n\t\t}\n\t}\n\n\tKeyEditableTextBox->SetError(ErrorMessage);\n}\n\nvoid SDialogueTextPropertyEditableTextBox::OnKeyCommitted(const FText& NewText, ETextCommit::Type CommitInfo)\n{\n\tif (!IsValidIdentity(NewText))\n\t{\n\t\treturn;\n\t}\n\n\tconst int32 NumTexts = EditableTextProperty->GetNumTexts();\n\n\t// Don't commit the Multiple Values text if there are multiple properties being set\n\tif (NumTexts > 0 && (NumTexts == 1 || NewText.ToString() != MultipleValuesText.ToString()))\n\t{\n\t\tconst FString& TextKey = NewText.ToString();\n\t\tfor (int32 TextIndex = 0; TextIndex < NumTexts; ++TextIndex)\n\t\t{\n\t\t\tconst FText PropertyValue = EditableTextProperty->GetText(TextIndex);\n\n\t\t\t// Only apply the change if the new key is different - we want to keep the keys stable where possible\n\t\t\tconst FString CurrentTextKey = FTextInspector::GetKey(PropertyValue).Get(FString());\n\t\t\tif (CurrentTextKey.Equals(TextKey, ESearchCase::CaseSensitive))\n\t\t\t{\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Get the stable namespace and key that we should use for this property\n\t\t\tFString NewNamespace;\n\t\t\tFString NewKey;\n\t\t\tconst FString* TextSource = FTextInspector::GetSourceString(PropertyValue);\n\t\t\tEditableTextProperty->GetStableTextId(\n\t\t\t\tTextIndex,\n\t\t\t\tIEditableTextProperty::ETextPropertyEditAction::EditedKey,\n\t\t\t\tTextSource ? *TextSource : FString(),\n\t\t\t\tFTextInspector::GetNamespace(PropertyValue).Get(FString()),\n\t\t\t\tTextKey,\n\t\t\t\tNewNamespace,\n\t\t\t\tNewKey\n\t\t\t\t);\n\n\t\t\tEditableTextProperty->SetText(TextIndex, FText::ChangeKey(NewNamespace, NewKey, PropertyValue));\n\t\t}\n\t}\n}\n\nFText SDialogueTextPropertyEditableTextBox::GetPackageValue() const\n{\n\tFText PackageValue;\n\n\tconst int32 NumTexts = EditableTextProperty->GetNumTexts();\n\tif (NumTexts == 1)\n\t{\n\t\tconst FText PropertyValue = EditableTextProperty->GetText(0);\n\t\tTOptional<FString> FoundNamespace = FTextInspector::GetNamespace(PropertyValue);\n\t\tif (FoundNamespace.IsSet())\n\t\t{\n\t\t\tPackageValue = FText::FromString(TextNamespaceUtil::ExtractPackageNamespace(FoundNamespace.GetValue()));\n\t\t}\n\t}\n\telse if (NumTexts > 1)\n\t{\n\t\tPackageValue = MultipleValuesText;\n\t}\n\n\treturn PackageValue;\n}\n\n#endif // USE_STABLE_LOCALIZATION_KEYS\n\nECheckBoxState SDialogueTextPropertyEditableTextBox::GetLocalizableCheckState(bool bActiveState) const\n{\n\tconst int32 NumTexts = EditableTextProperty->GetNumTexts();\n\tif (NumTexts == 1)\n\t{\n\t\tconst FText PropertyValue = EditableTextProperty->GetText(0);\n\n\t\tconst bool bIsLocalized = !PropertyValue.IsCultureInvariant();\n\t\treturn bIsLocalized == bActiveState ? ECheckBoxState::Checked : ECheckBoxState::Unchecked;\n\t}\n\n\treturn ECheckBoxState::Undetermined;\n}\n\nvoid SDialogueTextPropertyEditableTextBox::HandleLocalizableCheckStateChanged(ECheckBoxState InCheckboxState, bool bActiveState)\n{\n\tconst int32 NumTexts = EditableTextProperty->GetNumTexts();\n\n\tif (bActiveState)\n\t{\n\t\tfor (int32 TextIndex = 0; TextIndex < NumTexts; ++TextIndex)\n\t\t{\n\t\t\tconst FText PropertyValue = EditableTextProperty->GetText(TextIndex);\n\n\t\t\t// Assign a key to any currently culture invariant texts\n\t\t\tif (PropertyValue.IsCultureInvariant())\n\t\t\t{\n\t\t\t\t// Get the stable namespace and key that we should use for this property\n\t\t\t\tFString NewNamespace;\n\t\t\t\tFString NewKey;\n\t\t\t\tEditableTextProperty->GetStableTextId(\n\t\t\t\t\tTextIndex,\n\t\t\t\t\tIEditableTextProperty::ETextPropertyEditAction::EditedKey,\n\t\t\t\t\tPropertyValue.ToString(),\n\t\t\t\t\tFString(),\n\t\t\t\t\tFString(),\n\t\t\t\t\tNewNamespace,\n\t\t\t\t\tNewKey\n\t\t\t\t\t);\n\n\t\t\t\tEditableTextProperty->SetText(TextIndex, FInternationalization::Get().ForUseOnlyByLocMacroAndGraphNodeTextLiterals_CreateText(*PropertyValue.ToString(), *NewNamespace, *NewKey));\n\t\t\t}\n\t\t}\n\t}\n\telse\n\t{\n\t\tfor (int32 TextIndex = 0; TextIndex < NumTexts; ++TextIndex)\n\t\t{\n\t\t\tconst FText PropertyValue = EditableTextProperty->GetText(TextIndex);\n\n\t\t\t// Clear the identity from any non-culture invariant texts\n\t\t\tif (!PropertyValue.IsCultureInvariant())\n\t\t\t{\n\t\t\t\tconst FString* TextSource = FTextInspector::GetSourceString(PropertyValue);\n\t\t\t\tEditableTextProperty->SetText(TextIndex, FText::AsCultureInvariant(PropertyValue.ToString()));\n\t\t\t}\n\t\t}\n\t}\n}\n\nEVisibility SDialogueTextPropertyEditableTextBox::GetNamespaceOverridenWarningImageVisibility() const\n{\n\t// Nothing to show\n\tif (GetLocalizableVisibility() != EVisibility::Visible)\n\t{\n\t\treturn EVisibility::Collapsed;\n\t}\n\n\treturn WillNamespaceBeUpdated() ? EVisibility::Visible : EVisibility::Collapsed;\n}\n\nEVisibility SDialogueTextPropertyEditableTextBox::GetTextWarningImageVisibility() const\n{\n\tconst int32 NumTexts = EditableTextProperty->GetNumTexts();\n\n\tif (NumTexts == 1)\n\t{\n\t\tconst FText PropertyValue = EditableTextProperty->GetText(0);\n\t\treturn PropertyValue.IsCultureInvariant() ? EVisibility::Visible : EVisibility::Collapsed;\n\t}\n\n\treturn EVisibility::Collapsed;\n}\n\nbool SDialogueTextPropertyEditableTextBox::IsValidIdentity(const FText& InIdentity, FText* OutReason, const FText* InErrorCtx) const\n{\n\tconst FString InvalidIdentityChars = FString::Printf(TEXT(\"%s%c%c\"), INVALID_NAME_CHARACTERS, TextNamespaceUtil::PackageNamespaceStartMarker, TextNamespaceUtil::PackageNamespaceEndMarker);\n\treturn FName::IsValidXName(InIdentity.ToString(), InvalidIdentityChars, OutReason, InErrorCtx);\n}\n\n#undef LOCTEXT_NAMESPACE\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystemEditor/Private/DialogueEditor/DetailsPanel/Widgets/SDialogueTextPropertyEditableTextBox.h",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#pragma once\n#include \"CoreMinimal.h\"\n#include \"Widgets/SCompoundWidget.h\"\n#include \"Styling/CoreStyle.h\"\n#include \"STextPropertyEditableTextBox.h\"\n#include \"PropertyHandle.h\"\n\nDECLARE_MULTICAST_DELEGATE_TwoParams(FDialogueTextCommitedDelegate, const FText&, ETextCommit::Type);\nDECLARE_MULTICAST_DELEGATE_OneParam(FDialogueTextChangedDelegate, const FText&);\n\n\n// Own STextPropertyEditableTextBox version with custom modifications\n// Used to edit FText multiline FText instances\nclass SDialogueTextPropertyEditableTextBox : public SCompoundWidget\n{\n\ttypedef SDialogueTextPropertyEditableTextBox Self;\n\n\tSLATE_BEGIN_ARGS(SDialogueTextPropertyEditableTextBox)\n\t\t: _Style(&FCoreStyle::Get().GetWidgetStyle<FEditableTextBoxStyle>(\"NormalEditableTextBox\"))\n\t\t, _Font()\n\t\t, _ForegroundColor()\n\t\t, _ReadOnlyForegroundColor()\n\t\t, _WrapTextAt(0.0f)\n\t\t, _AutoWrapText(true)\n\t\t, _SelectAllTextWhenFocused(false)\n\t\t, _ClearKeyboardFocusOnCommit(false)\n\t\t, _SelectAllTextOnCommit(false)\n\t\t, _AddResetToDefaultWidget(true)\n\t\t, _ModiferKeyForNewLine(EModifierKey::None)\n\n\t\t// Similar to TextProperty, see FTextCustomization\n\t\t, _MinDesiredWidth(209.f)\n\t\t, _MaxDesiredHeight(600.f)\n\t\t{}\n\t\t/** The styling of the textbox */\n\t\tSLATE_STYLE_ARGUMENT(FEditableTextBoxStyle, Style)\n\n\t\t/** Font color and opacity (overrides Style) */\n\t\tSLATE_ATTRIBUTE(FSlateFontInfo, Font)\n\n\t\t/** Text color and opacity (overrides Style) */\n\t\tSLATE_ATTRIBUTE(FSlateColor, ForegroundColor)\n\n\t\t/** Text color and opacity when read-only (overrides Style) */\n\t\tSLATE_ATTRIBUTE(FSlateColor, ReadOnlyForegroundColor)\n\n\t\t/** Whether text wraps onto a new line when it's length exceeds this width; if this value is zero or negative, no wrapping occurs */\n\t\tSLATE_ATTRIBUTE(float, WrapTextAt)\n\n\t\t/** Whether to wrap text automatically based on the widget's computed horizontal space */\n\t\tSLATE_ATTRIBUTE(bool, AutoWrapText)\n\n\t\t/** Whether to select all text when the user clicks to give focus on the widget */\n\t\tSLATE_ATTRIBUTE(bool, SelectAllTextWhenFocused)\n\n\t\t/** Whether to clear keyboard focus when pressing enter to commit changes */\n\t\tSLATE_ATTRIBUTE(bool, ClearKeyboardFocusOnCommit)\n\n\t\t/** Whether to select all text when pressing enter to commit changes */\n\t\tSLATE_ATTRIBUTE(bool, SelectAllTextOnCommit)\n\n\t\t// Add reset to default buton\n\t\tSLATE_ARGUMENT(bool, AddResetToDefaultWidget)\n\n\t\t/** The optional modifier key necessary to create a newline when typing into the editor. */\n\t\tSLATE_ARGUMENT(EModifierKey::Type, ModiferKeyForNewLine)\n\n\t\t/** When specified, will report the MinDesiredWidth if larger than the content's desired width */\n\t\tSLATE_ATTRIBUTE(FOptionalSize, MinDesiredWidth)\n\n\t\t/** When specified, will report the MaxDesiredHeight if smaller than the content's desired height */\n\t\tSLATE_ATTRIBUTE(FOptionalSize, MaxDesiredHeight)\n\tSLATE_END_ARGS()\n\npublic:\n\tvoid Construct(\n\t\tconst FArguments& Arguments,\n\t\tconst TSharedRef<IEditableTextProperty>& InEditableTextProperty,\n\t\tconst TSharedRef<IPropertyHandle>& InPropertyHandle\n\t);\n\tbool SupportsKeyboardFocus() const override;\n\tFReply OnFocusReceived(const FGeometry& MyGeometry, const FFocusEvent& InFocusEvent) override;\n\tvoid Tick(const FGeometry& AllottedGeometry, double InCurrentTime, float InDeltaTime) override;\n\n\tFText GetTextValue() const;\n\tvoid SetTextValue(const FText& NewValue);\n\n\tFDialogueTextCommitedDelegate& OnTextCommittedEvent() { return TextCommittedEvent; }\n\tFDialogueTextChangedDelegate& OnTextChangedEvent() { return TextChangedEvent; }\n\nprivate:\n\tvoid GetDesiredWidth(float& OutMinDesiredWidth, float& OutMaxDesiredWidth);\n\tbool CanEdit() const;\n\tbool IsCultureInvariantFlagEnabled() const;\n\tbool IsSourceTextReadOnly() const;\n\n\tbool WillNamespaceBeUpdated() const;\n\tbool IsNamespaceReadOnly() const;\n\tbool IsKeyReadOnly() const { return IsIdentityReadOnly(); }\n\tbool IsIdentityReadOnly() const;\n\n\tFText GetToolTipText() const;\n\tEVisibility GetLocalizableVisibility() const;\n\n\tvoid OnTextChanged(const FText& NewText);\n\tvoid OnTextCommitted(const FText& NewText, ETextCommit::Type CommitInfo);\n\tvoid SetTextError(const FText& InErrorMsg);\n\n\tFText GetNamespaceValue() const;\n\tvoid OnNamespaceChanged(const FText& NewText);\n\tvoid OnNamespaceCommitted(const FText& NewText, ETextCommit::Type CommitInfo);\n\n\tFText GetKeyValue() const;\n#if USE_STABLE_LOCALIZATION_KEYS\n\tvoid OnKeyChanged(const FText& NewText);\n\tvoid OnKeyCommitted(const FText& NewText, ETextCommit::Type CommitInfo);\n\n\tFText GetPackageValue() const;\n#endif // USE_STABLE_LOCALIZATION_KEYS\n\n\tECheckBoxState GetLocalizableCheckState(bool bActiveState) const;\n\n\tvoid HandleLocalizableCheckStateChanged(ECheckBoxState InCheckboxState, bool bActiveState);\n\n\tEVisibility GetNamespaceOverridenWarningImageVisibility() const;\n\tEVisibility GetTextWarningImageVisibility() const;\n\n\tbool IsValidIdentity(const FText& InIdentity, FText* OutReason = nullptr, const FText* InErrorCtx = nullptr) const;\n\n\t// Reset to default\n\tFText GetResetToolTip() const;\n\tEVisibility GetDiffersFromDefaultAsVisibility() const;\n\tFReply OnResetClicked();\n\nprotected:\n\t// Events\n\tFDialogueTextCommitedDelegate TextCommittedEvent;\n\tFDialogueTextChangedDelegate TextChangedEvent;\n\n\t// Property variables\n\tTSharedPtr<IEditableTextProperty> EditableTextProperty;\n\tTSharedPtr<IPropertyHandle> PropertyHandle;\n\n\tTSharedPtr<SWidget> PrimaryWidget;\n\tTSharedPtr<SMultiLineEditableTextBox> MultiLineWidget;\n\n\t// TSharedPtr<SEditableTextBox> SingleLineWidget;\n\n\tTSharedPtr<SEditableTextBox> NamespaceEditableTextBox;\n\tTSharedPtr<SEditableTextBox> KeyEditableTextBox;\n\n\tTOptional<float> PreviousHeight;\n\n\tbool bIsMultiLine = true;\n\tbool bAddResetToDefaultWidget = true;\n\n\tstatic FText MultipleValuesText;\n};\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystemEditor/Private/DialogueEditor/DetailsPanel/Widgets/SDialogueTextPropertyPickList.cpp",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#include \"SDialogueTextPropertyPickList.h\"\n\n#include \"PropertyHandle.h\"\n#include \"Widgets/Input/SSearchBox.h\"\n#include \"Framework/Application/SlateApplication.h\"\n#include \"DetailWidgetRow.h\"\n#include \"IDocumentation.h\"\n#include \"Layout/WidgetPath.h\"\n\n#define LOCTEXT_NAMESPACE \"SDialogueTextPropertyPickList\"\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// SDialogueTextPropertyPickList\nvoid SDialogueTextPropertyPickList::Construct(const FArguments& InArgs)\n{\n\t// MUST call SetPropertyHandle later or a check will fail.\n\tif (InArgs._PropertyHandle.IsValid())\n\t{\n\t\tSetPropertyHandle(InArgs._PropertyHandle);\n\t}\n\tSetToolTipAttribute(InArgs._ToolTipText);\n\n\t// Context checkbox arguments\n\tbHasContextCheckBox = InArgs._HasContextCheckbox;\n\tbIsContextCheckBoxChecked = bHasContextCheckBox ? InArgs._IsContextCheckBoxChecked : false;\n\tCurrentContextSuggestionAttributes = InArgs._CurrentContextAvailableSuggestions;\n\tContextCheckBoxTextAttribute = InArgs._ContextCheckBoxText;\n\tContextCheckBoxToolTipTextAttribute = InArgs._ContextCheckBoxToolTipText;\n\n\tHintTextAttribute = InArgs._HintText;\n\tSuggestionAttributes = InArgs._AvailableSuggestions;\n\tOnTextChanged = InArgs._OnTextChanged;\n\tOnTextCommitted = InArgs._OnTextCommitted;\n\tOnKeyDownHandler = InArgs._OnKeyDownHandler;\n\tbDelayChangeNotificationsWhileTyping = InArgs._DelayChangeNotificationsWhileTyping;\n\n\t// Assign the main horizontal box of this widget\n\tTSharedPtr<SHorizontalBox> ContentBox = SNew(SHorizontalBox);\n\tChildSlot\n\t\t[\n\t\t\tContentBox.ToSharedRef()\n\t\t];\n\n\t// right of the combo box\n//\tconst TSharedRef<SHorizontalBox> ButtonBox = SNew(SHorizontalBox);\n//\tTSharedRef<SWidget> ButtonBoxWrapper =\n//\t\tSNew(SBox)\n//\t\t.Padding(FMargin(1.f, 0.f))\n//\t\t[\n//\t\t\tButtonBox\n//\t\t];\n\n\t// TODO maybe have a look at SNameComboBox and SComboBox\n\t// Build the button and text view\n\tComboButtonWidget = SNew(SComboButton)\n\t\t.ButtonStyle(FEditorStyle::Get(), \"PropertyEditor.AssetComboStyle\")\n\t\t.ForegroundColor(FEditorStyle::GetColor(\"PropertyEditor.AssetName.ColorAndOpacity\"))\n\t\t.OnGetMenuContent(this, &Self::GetMenuWidget)\n\t\t.OnMenuOpenChanged(this, &Self::HandleMenuOpenChanged)\n\t\t.OnComboBoxOpened(this, &Self::HandleComboBoxOpened)\n\t\t.IsEnabled(true)\n\t\t.IsFocusable(false) // if set to true, it won't select the search input box\n\t\t.ContentPadding(2.0f)\n\t\t.ButtonContent()\n\t\t[\n\t\t\t// Show the name of the asset or actor\n\t\t\tSAssignNew(ComboButtonTextWidget, STextBlock)\n\t\t\t.TextStyle(FEditorStyle::Get(), \"PropertyEditor.AssetClass\")\n\t\t\t.Text(TextAttribute)\n\t\t];\n\n\tContentBox->AddSlot()\n\t\t[\n\t\t\t\tSNew(SHorizontalBox)\n\t\t\t\t+SHorizontalBox::Slot()\n\t\t\t\t[\n\t\t\t\t\tComboButtonWidget.ToSharedRef()\n\t\t\t\t]\n\n\t//\t\t\t\t+SHorizontalBox::Slot()\n\t//\t\t\t\t.AutoWidth()\n\t//\t\t\t\t[\n\t//\t\t\t\t\tButtonBoxWrapper\n\t//\t\t\t\t]\n\t\t];\n\n//\tButtonBoxWrapper->SetVisibility(ButtonBox->NumSlots() > 0 ? EVisibility::Visible : EVisibility::Collapsed);\n}\n\nFReply SDialogueTextPropertyPickList::OnPreviewKeyDown(const FGeometry& MyGeometry, const FKeyEvent& InKeyEvent)\n{\n\tif (InKeyEvent.GetKey() == EKeys::Escape)\n\t{\n\t\t// Clear any selection first to prevent the currently selection being set in the text box\n\t\tListViewWidget->ClearSelection();\n\t\treturn FReply::Handled();\n\t}\n\n\treturn FReply::Unhandled();\n}\n\nvoid SDialogueTextPropertyPickList::SetText(const TAttribute<FText>& InNewText)\n{\n\tconst FText NewText = InNewText.Get();\n\tTextAttribute.Set(NewText);\n\n\tPropertyHandle->SetValueFromFormattedString(*NewText.ToString());\n\tif (ComboButtonTextWidget.IsValid())\n\t{\n\t\tComboButtonTextWidget->SetText(TextAttribute);\n\t}\n\tif (InputTextWidget.IsValid())\n\t{\n\t\tInputTextWidget->SetText(TextAttribute);\n\t}\n}\n\nvoid SDialogueTextPropertyPickList::SetToolTipAttribute(const TAttribute<FText>& InNewText)\n{\n\tconst FText NewText = InNewText.Get();\n\tToolTipAttribute.Set(NewText);\n\tSetToolTipText(ToolTipAttribute);\n}\n\nvoid SDialogueTextPropertyPickList::SetPropertyHandle(const TSharedPtr<IPropertyHandle>& InPropertyHandle)\n{\n\tPropertyHandle = InPropertyHandle;\n\tcheck(PropertyHandle.IsValid());\n\n\t// Read the initial value of the text this widget belongs to\n\tFText ReadData;\n\tif (PropertyHandle->GetValueAsFormattedText(ReadData) == FPropertyAccess::Success)\n\t{\n\t\tSetText(ReadData);\n\t}\n}\n\nTSharedRef<SWidget> SDialogueTextPropertyPickList::GetMenuWidget()\n{\n\t// Is it cached?\n\tif (MenuWidget.IsValid())\n\t{\n\t\treturn SNew(SVerticalBox)\n\t\t\t+SVerticalBox::Slot()\n\t\t\t.AutoHeight()\n\t\t\t.Padding(2.f, 2.f, 2.f, 5.f)\n\t\t\t[\n\t\t\t\tMenuWidget.ToSharedRef()\n\t\t\t];\n\t}\n\n\t// Cache it\n\tMenuWidget = SNew(SVerticalBox);\n\n\t// Context Sensitive widget\n\tif (bHasContextCheckBox)\n\t{\n\t\tMenuWidget->AddSlot()\n\t\t\t.AutoHeight()\n\t\t\t.Padding(0.f, 0.f, 0.f, 1.f)\n\t\t\t[\n\t\t\t\tGetContextCheckBoxWidget()\n\t\t\t];\n\t}\n\n\t// Search Box\n\tMenuWidget->AddSlot()\n\t\t.AutoHeight()\n\t\t.Padding(0.f, 0.f, 0.f, 1.f)\n\t\t[\n\t\t\tSNew(STextBlock)\n\t\t\t.Text(LOCTEXT(\"SearchHeader\", \"Search or Set new text (press enter)\"))\n\t\t\t.TextStyle(FCoreStyle::Get(), TEXT(\"Menu.Heading\"))\n\t\t];\n\n\tMenuWidget->AddSlot()\n\t\t.AutoHeight()\n\t\t.Padding(0, 0, 0, 1)\n\t\t[\n\t\t\tGetSearchBoxWidget()\n\t\t];\n\n\t// List view widget\n\tMenuWidget->AddSlot()\n\t\t.FillHeight(1.f)\n\t\t.Padding(1.f, 2.f)\n\t\t[\n\t\t\tGetListViewWidget()\n\t\t];\n\n\t// Should return a valid widget\n\treturn GetMenuWidget();\n}\n\nTSharedRef<SWidget> SDialogueTextPropertyPickList::GetContextCheckBoxWidget()\n{\n\t// It is cached?\n\tif (ContextCheckBoxWidget.IsValid())\n\t{\n\t\treturn SNew(SHorizontalBox)\n\n\t\t\t// Context Toggle\n\t\t\t+SHorizontalBox::Slot()\n\t\t\t.HAlign(HAlign_Right)\n\t\t\t.VAlign(VAlign_Center)\n\t\t\t[\n\t\t\t\tContextCheckBoxWidget.ToSharedRef()\n\t\t\t];\n\t}\n\n\t// Cache it\n\tContextCheckBoxWidget = SNew(SCheckBox)\n\t\t.OnCheckStateChanged(this, &Self::HandleContextCheckboxChanged)\n\t\t.IsFocusable(false)\n\t\t.IsChecked(this, &Self::IsContextCheckBoxChecked)\n\t\t.ToolTipText(ContextCheckBoxToolTipTextAttribute)\n\t\t[\n\t\t\tSNew(STextBlock)\n\t\t\t.Text(ContextCheckBoxTextAttribute)\n\t\t];\n\n\t// Should return a valid widget\n\treturn GetContextCheckBoxWidget();\n}\n\nTSharedRef<SWidget> SDialogueTextPropertyPickList::GetSearchBoxWidget()\n{\n\t// Is it cached?\n\tif (InputTextWidget.IsValid())\n\t{\n\t\treturn SNew(SHorizontalBox)\n\t\t\t+SHorizontalBox::Slot()\n\t\t\t.FillWidth(1.0f)\n\t\t\t[\n\t\t\t\tInputTextWidget.ToSharedRef()\n\t\t\t];\n\t}\n\n\t// Cache it\n\tInputTextWidget = SNew(SSearchBox)\n\t\t.InitialText(TextAttribute)\n\t\t.HintText(HintTextAttribute)\n\t\t.OnTextChanged(this, &Self::HandleTextChanged)\n\t\t.OnTextCommitted(this, &Self::HandleTextCommitted)\n\t\t.SelectAllTextWhenFocused(true)\n\t\t.DelayChangeNotificationsWhileTyping(bDelayChangeNotificationsWhileTyping)\n\t\t.OnKeyDownHandler(this, &Self::HandleKeyDown);\n\n\t// Should return a valid widget\n\treturn GetSearchBoxWidget();\n}\n\nTSharedRef<SWidget> SDialogueTextPropertyPickList::GetListViewWidget()\n{\n\t// Is it cached?\n\tif (ListViewContainerWidget.IsValid())\n\t{\n\t\treturn SNew(SOverlay)\n\t\t\t+SOverlay::Slot()\n\t\t\t[\n\t\t\t\tListViewContainerWidget.ToSharedRef()\n\t\t\t];\n\t}\n\n\t// Cache it\n\tListViewContainerWidget = SNew(SBorder)\n\t\t.Padding(0)\n\t\t.BorderImage(FEditorStyle::GetBrush(\"NoBorder\"));\n\n\tListViewWidget = SNew(SListView<TextListItem>)\n\t\t.SelectionMode(ESelectionMode::Single)\n\t\t.ListItemsSource(&Suggestions)\n\t\t.OnGenerateRow(this, &Self::HandleListGenerateRow)\n\t\t.OnSelectionChanged(this, &Self::HandleListSelectionChanged)\n\t\t.ItemHeight(20);\n\n\tListViewContainerWidget->SetContent(CreateShadowOverlay(ListViewWidget.ToSharedRef()));\n\n\t// Should return a valid widget\n\treturn GetListViewWidget();\n}\n\nTSharedRef<ITableRow> SDialogueTextPropertyPickList::HandleListGenerateRow(TextListItem Text, const TSharedRef<STableViewBase>& OwnerTable)\n{\n\tcheck(Text.IsValid());\n\treturn SNew(STableRow<TextListItem>, OwnerTable)\n\t\t[\n\t\t\tSNew(STextBlock)\n\t\t\t.Text(FText::FromName(*Text.Get()))\n\t\t\t.HighlightText(this, &Self::GetHighlightText)\n\t\t];\n}\n\nvoid SDialogueTextPropertyPickList::HandleMenuOpenChanged(bool bOpen)\n{\n\tif (!bOpen)\n\t{\n\t\tFSlateApplication::Get().ClearKeyboardFocus(EFocusCause::SetDirectly);\n\t\tComboButtonWidget->SetMenuContent(SNullWidget::NullWidget);\n\t}\n}\n\nvoid SDialogueTextPropertyPickList::HandleComboBoxOpened()\n{\n\tGetSearchBoxWidget();\n\tFocusSearchBox();\n\tUpdateSuggestionList();\n}\n\n/** Handler for when text in the editable text box changed */\nvoid SDialogueTextPropertyPickList::HandleTextChanged(const FText& InSearchText)\n{\n\tUpdateSuggestionList();\n\n\t// Check if in suggestion list\n\tOnTextChanged.ExecuteIfBound(InSearchText);\n}\n\n/** Handler for when text in the editable text box changed */\nvoid SDialogueTextPropertyPickList::HandleTextCommitted(const FText& NewText, ETextCommit::Type CommitType)\n{\n\t// Ignore default\n\tif (CommitType == ETextCommit::Default)\n\t{\n\t\treturn;\n\t}\n\n\tTSharedPtr<FName> SelectedSuggestion = GetSelectedSuggestion();\n\tFText CommittedText;\n\tif (SelectedSuggestion.IsValid() && CommitType != ETextCommit::OnCleared)\n\t{\n\t\t// Pressed selected a suggestion, set the text\n\t\tCommittedText = FText::FromName(*SelectedSuggestion.Get());\n\t}\n\telse\n\t{\n\t\tif (CommitType == ETextCommit::OnCleared)\n\t\t{\n\t\t\t// Clear text when escape is pressed then commit an empty string\n\t\t\tCommittedText = FText::GetEmpty();\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// otherwise, set the typed text\n\t\t\tCommittedText = NewText;\n\t\t}\n\t}\n\n\t// Use \"None\" as empty string\n\tif (CommittedText.IdenticalTo(FText::GetEmpty()))\n\t{\n\t\tCommittedText = FText::FromName(NAME_None);\n\t}\n\n\t// Update the displayed text\n\tSetText(CommittedText);\n\tOnTextCommitted.ExecuteIfBound(CommittedText, CommitType);\n\n\t// Only close the menu when the user did not loose focus\n\tif (CommitType != ETextCommit::OnUserMovedFocus)\n\t{\n\t\tComboButtonWidget->SetIsOpen(false);\n\t}\n}\n\nFReply SDialogueTextPropertyPickList::HandleKeyDown(const FGeometry& MyGeometry, const FKeyEvent& InKeyEvent)\n{\n\tif (InKeyEvent.GetKey() == EKeys::Up || InKeyEvent.GetKey() == EKeys::Down)\n\t{\n\t\tconst bool bSelectingUp = InKeyEvent.GetKey() == EKeys::Up;\n\t\tTSharedPtr<FName> SelectedSuggestion = GetSelectedSuggestion();\n\n\t\tif (SelectedSuggestion.IsValid())\n\t\t{\n\t\t\t// Find the selection index and select the previous or next one\n\t\t\tint32 TargetIdx = INDEX_NONE;\n\t\t\tfor (int32 SuggestionIdx = 0; SuggestionIdx < Suggestions.Num(); ++SuggestionIdx)\n\t\t\t{\n\t\t\t\tif (Suggestions[SuggestionIdx] == SelectedSuggestion)\n\t\t\t\t{\n\t\t\t\t\tif (bSelectingUp)\n\t\t\t\t\t{\n\t\t\t\t\t\tTargetIdx = SuggestionIdx - 1;\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tTargetIdx = SuggestionIdx + 1;\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (Suggestions.IsValidIndex(TargetIdx))\n\t\t\t{\n\t\t\t\tListViewWidget->SetSelection(Suggestions[TargetIdx]);\n\t\t\t\tListViewWidget->RequestScrollIntoView(Suggestions[TargetIdx]);\n\t\t\t}\n\t\t}\n\t\telse if (!bSelectingUp && Suggestions.Num() > 0)\n\t\t{\n\t\t\t// Nothing selected and pressed down, select the first item\n\t\t\tListViewWidget->SetSelection(Suggestions[0]);\n\t\t}\n\n\t\treturn FReply::Handled();\n\t}\n\n\tif (OnKeyDownHandler.IsBound())\n\t{\n\t\treturn OnKeyDownHandler.Execute(MyGeometry, InKeyEvent);\n\t}\n\n\treturn FReply::Unhandled();\n}\n\nvoid SDialogueTextPropertyPickList::HandleListSelectionChanged(TextListItem NewValue, ESelectInfo::Type SelectInfo)\n{\n\t// If the user selected it via click or keyboard then select it, then accept the choice and close the window\n\tif (SelectInfo == ESelectInfo::OnMouseClick || SelectInfo == ESelectInfo::OnKeyPress || SelectInfo == ESelectInfo::Direct )\n\t{\n\t\tif (NewValue.IsValid())\n\t\t{\n\t\t\tSetText(FText::FromName(*NewValue.Get()));\n\t\t\tFocusSearchBox();\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// Can happen in the case selecting the option directly (SelectInfo == ESelectInfo::Direct)\n\t\t\t// HandleTextCommitted will be called automatically because it looses focus, but we want\n\t\t\t// to close the menu explicitly\n\t\t\tComboButtonWidget->SetIsOpen(false);\n\t\t}\n\t}\n}\n\nvoid SDialogueTextPropertyPickList::HandleContextCheckboxChanged(ECheckBoxState CheckState)\n{\n\tbIsContextCheckBoxChecked = CheckState == ECheckBoxState::Checked;\n\tUpdateSuggestionList();\n\t// Return focus to search input so it is easier to navigate down.\n\tFocusSearchBox();\n}\n\nvoid SDialogueTextPropertyPickList::UpdateSuggestionList()\n{\n\tconst FString TypedText = InputTextWidget.IsValid() ? InputTextWidget->GetText().ToString() : TEXT(\"\");\n\tSuggestions.Empty();\n\n\t// Find out what pool of suggestions ot use\n\tTArray<FName> AllSuggestions;\n\tif (bHasContextCheckBox && bIsContextCheckBoxChecked)\n\t{\n\t\t// has checkbox and it is true\n\t\tAllSuggestions = CurrentContextSuggestionAttributes.Get();\n\t}\n\telse\n\t{\n\t\t// default\n\t\tAllSuggestions = SuggestionAttributes.Get();\n\t}\n\n\t// Must have typed something, but that something must be different than the set value\n\tif (TypedText.Len() > 0 && TypedText != TextAttribute.Get().ToString())\n\t{\n\t\t// Match typed text\n\t\tfor (const FName& Suggestion : AllSuggestions)\n\t\t{\n\t\t\tif (Suggestion.ToString().Contains(TypedText))\n\t\t\t{\n\t\t\t\tSuggestions.Add(MakeShared<FName>(Suggestion));\n\t\t\t}\n\t\t}\n\t}\n\telse\n\t{\n\t\t// Copy all\n\t\tfor (const FName& Suggestion : AllSuggestions)\n\t\t{\n\t\t\tSuggestions.Add(MakeShared<FName>(Suggestion));\n\t\t}\n\t}\n\n\tif (ListViewWidget.IsValid())\n\t{\n\t\tListViewWidget->RequestListRefresh();\n\t}\n}\n\nvoid SDialogueTextPropertyPickList::FocusSearchBox() const\n{\n\tFWidgetPath WidgetToFocusPath;\n\tFSlateApplication::Get().GeneratePathToWidgetChecked(InputTextWidget.ToSharedRef(), WidgetToFocusPath);\n\tFSlateApplication::Get().SetKeyboardFocus(WidgetToFocusPath, EFocusCause::SetDirectly);\n}\n\nTSharedPtr<FName> SDialogueTextPropertyPickList::GetSelectedSuggestion() const\n{\n\tTSharedPtr<FName> SelectedSuggestion;\n\tconst TArray<TSharedPtr<FName>>& SelectedSuggestionList = ListViewWidget->GetSelectedItems();\n\tif (SelectedSuggestionList.Num() > 0)\n\t{\n\t\t// Selection mode is Single, so there should only be one suggestion at the most\n\t\tcheck(SelectedSuggestionList.Num() == 1)\n\t\tSelectedSuggestion = SelectedSuggestionList[0];\n\t}\n\n\treturn SelectedSuggestion;\n}\n\n\n//////////////////////////////////////////////////////////////////////////\n#undef LOCTEXT_NAMESPACE\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystemEditor/Private/DialogueEditor/DetailsPanel/Widgets/SDialogueTextPropertyPickList.h",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#pragma once\n\n#include \"Widgets/DeclarativeSyntaxSupport.h\"\n#include \"Widgets/Input/SSearchBox.h\"\n#include \"Widgets/Layout/SScrollBorder.h\"\n#include \"Widgets/Views/SListView.h\"\n#include \"Widgets/Input/SComboButton.h\"\n#include \"Widgets/Input/SCheckBox.h\"\n\nclass IPropertyHandle;\n\n/**\n * A widget to edit a Text property but it allows you to pick from a list of possible values and search in it.\n * Inspired from SPropertyMenuAssetPicker and SAssetPicker and SAssetView\n */\nclass SDialogueTextPropertyPickList : public SCompoundWidget\n{\n\ttypedef TSharedPtr<FName> TextListItem;\n\ttypedef SDialogueTextPropertyPickList Self;\n\ttypedef SCompoundWidget Super;\n\npublic:\n\tSLATE_BEGIN_ARGS(Self)\n\t\t: _PropertyHandle()\n\t\t, _HasContextCheckbox(false)\n\t\t, _IsContextCheckBoxChecked(false)\n\t\t, _ContextCheckBoxText(NSLOCTEXT(\"SDialogueTextPropertyPickList\", \"ContextCheckBoxText\", \"Local Search\"))\n\t\t, _ContextCheckBoxToolTipText(NSLOCTEXT(\"SDialogueTextPropertyPickList\", \"ContextCheckBoxToolTipText\",\n\t\t\t\t\t\t\t\t\t \"Should the search be local? If not checked the search is global.\"))\n\t\t, _ToolTipText(NSLOCTEXT(\"SDialogueTextPropertyPickList\", \"DefaultToolTip\", \"REPLACE ME\"))\n\t\t, _HintText(NSLOCTEXT(\"SDialogueTextPropertyPickList\", \"SearchBoxHint\", \"Search Names\"))\n\t\t, _CurrentContextAvailableSuggestions(TArray<FName>())\n\t\t, _AvailableSuggestions(TArray<FName>())\n\t\t, _OnTextChanged()\n\t\t, _OnTextCommitted()\n\t\t, _OnKeyDownHandler()\n\t\t, _DelayChangeNotificationsWhileTyping(true)\n\t{}\n\t\t/** The Property handle of the property this widget represents. */\n\t\tSLATE_ARGUMENT(TSharedPtr<IPropertyHandle>, PropertyHandle)\n\n\t\t/** Does this pick list has a checkbox for ContextSensitive suggestions? */\n\t\tSLATE_ARGUMENT(bool, HasContextCheckbox)\n\n\t\t/** The check status of the context sensitive checkbox. */\n\t\tSLATE_ARGUMENT(bool, IsContextCheckBoxChecked)\n\n\t\t/** The Text that is displayed besides the display checkbox */\n\t\tSLATE_ATTRIBUTE(FText, ContextCheckBoxText)\n\n\t\t/** The tooltip text for the context checkbox. */\n\t\tSLATE_ATTRIBUTE(FText, ContextCheckBoxToolTipText)\n\n\t\t/** Tooltip text to displayed all over  the place. */\n\t\tSLATE_ATTRIBUTE(FText, ToolTipText)\n\n\t\t/** Hint text to display for the search text when there is no value */\n\t\tSLATE_ATTRIBUTE(FText, HintText)\n\n\t\t/**\n\t\t *  All possible suggestions for the search text If the context sensitive checkbox is true.\n\t\t *  Aka the current context\n\t\t *  Only used if HasContextCheckbox is true.\n\t\t */\n\t\tSLATE_ATTRIBUTE(TArray<FName>, CurrentContextAvailableSuggestions)\n\n\t\t/** All possible suggestions for the search text. If the context sensitive checkbox is false. */\n\t\tSLATE_ATTRIBUTE(TArray<FName>, AvailableSuggestions)\n\n\t\t/** Invoked whenever the text changes */\n\t\tSLATE_EVENT(FOnTextChanged, OnTextChanged)\n\n\t\t/** Invoked whenever the text is committed (e.g. user presses enter) */\n\t\tSLATE_EVENT(FOnTextCommitted, OnTextCommitted)\n\n\t\t/** Callback delegate to have first chance handling of the OnKeyDown event */\n\t\tSLATE_EVENT(FOnKeyDown, OnKeyDownHandler)\n\n\t\t/** Whether the SearchBox should delay notifying listeners of text changed events until the user is done typing */\n\t\tSLATE_ARGUMENT(bool, DelayChangeNotificationsWhileTyping)\n\tSLATE_END_ARGS()\n\n\t/**\n\t * Construct the widget. It must have the PropertyHandle set or else it will fail\n\t * @param\tInArgs\t\t\t\tArguments for widget construction\n\t */\n\tvoid Construct(const FArguments& InArgs);\n\n\t// SWidget implementation\n\t/**\n\t * Called after a key is pressed when this widget or a child of this widget has focus\n\t * If a widget handles this event, OnKeyDown will *not* be passed to the focused widget.\n\t *\n\t * This event is primarily to allow parent widgets to consume an event before a child widget processes\n\t * it and it should be used only when there is no better design alternative.\n\t *\n\t * @param MyGeometry The Geometry of the widget receiving the event\n\t * @param InKeyEvent  Key event\n\t * @return Returns whether the event was handled, along with other possible actions\n\t */\n\tFReply OnPreviewKeyDown(const FGeometry& MyGeometry, const FKeyEvent& InKeyEvent) override;\n\n\t/**\n\t * Checks to see if this widget supports keyboard focus.  Override this in derived classes.\n\t * @return  True if this widget can take keyboard focus\n\t */\n\tbool SupportsKeyboardFocus() const override { return true; }\n\n\t/**\n\t * Checks to see if this widget currently has the keyboard focus\n\t * @return  True if this widget has keyboard focus\n\t */\n\tbool HasKeyboardFocus() const override { return InputTextWidget->HasKeyboardFocus(); }\n\n\t/**\n\t * Called when focus is given to this widget.  This event does not bubble.\n\t *\n\t * @param MyGeometry The Geometry of the widget receiving the event\n\t * @param  InFocusEvent  The FocusEvent\n\t * @return  Returns whether the event was handled, along with other possible actions\n\t */\n\tFReply OnFocusReceived(const FGeometry& MyGeometry, const FFocusEvent& InFocusEvent) override\n\t{\n\t\t// Forward keyboard focus to our editable text widget\n\t\tif (IsEnabled() && ComboButtonWidget.IsValid() && ComboButtonWidget->IsEnabled())\n\t\t{\n\t\t\treturn FReply::Handled().SetUserFocus(InputTextWidget.ToSharedRef(), InFocusEvent.GetCause());\n\t\t}\n\n\t\treturn Super::OnFocusReceived(MyGeometry, InFocusEvent);\n\t}\n\n\t// Own functions\n\t/** Sets the text string currently being edited */\n\tvoid SetText(const TAttribute<FText>& InNewText);\n\n\t/** Sets the current tooltip being displayed */\n\tvoid SetToolTipAttribute(const TAttribute<FText>& InNewText);\n\n\t/** Sets the property handle this widget represents. */\n\tvoid SetPropertyHandle(const TSharedPtr<IPropertyHandle>& InPropertyHandle);\n\nprivate:\n\t/** Gets the menu content widget that is shown once the text is clicked on */\n\tTSharedRef<SWidget> GetMenuWidget();\n\n\t/** Gets the context sensitive checkbox widget */\n\tTSharedRef<SWidget> GetContextCheckBoxWidget();\n\n\t/** Gets the search box widget/input text. */\n\tTSharedRef<SWidget> GetSearchBoxWidget();\n\n\t/** Gets the list view that is displaying the text strings  */\n\tTSharedRef<SWidget> GetListViewWidget();\n\n\t/** Makes the widget row for the list view */\n\tTSharedRef<ITableRow> HandleListGenerateRow(TextListItem Text, const TSharedRef<STableViewBase>& OwnerTable);\n\n\t/** Gets the text to highlight in the suggestion list */\n\tFText GetHighlightText() const { return InputTextWidget->GetText(); }\n\n\t/** Adds A SScrollBorder over a Table */\n\tTSharedRef<SWidget> CreateShadowOverlay(TSharedRef<STableViewBase> Table) const\n\t{\n\t\treturn SNew(SScrollBorder, Table)\n\t\t\t[\n\t\t\t\tTable\n\t\t\t];\n\t}\n\n\t/** Handles when the menu of the combo box open status changes */\n\tvoid HandleMenuOpenChanged(bool bOpen);\n\n\t/** Handles when the combo box opens */\n\tvoid HandleComboBoxOpened();\n\n\t/** Handles when text in the editable text box changed */\n\tvoid HandleTextChanged(const FText& InSearchText);\n\n\t/** Handles for when text in the editable text box is commited (pressed enter/click). */\n\tvoid HandleTextCommitted(const FText& InSearchText, ETextCommit::Type CommitInfo);\n\n\t/** Handles key down events to the editable text widget */\n\tFReply HandleKeyDown(const FGeometry& MyGeometry, const FKeyEvent& InKeyEvent);\n\n\t/** Handles when the selection changes in the suggestion list (list view widget) */\n\tvoid HandleListSelectionChanged(TextListItem NewValue, ESelectInfo::Type SelectInfo);\n\n\t/** Toggle changed. */\n\tvoid HandleContextCheckboxChanged(ECheckBoxState CheckState);\n\n\t/** Is the context sensitive toggle checked? */\n\tECheckBoxState IsContextCheckBoxChecked() const\n\t{\n\t\treturn bIsContextCheckBoxChecked ? ECheckBoxState::Checked : ECheckBoxState::Unchecked;\n\t}\n\n\t/** Updates and shows or hides the suggestion list */\n\tvoid UpdateSuggestionList();\n\n\t/** Returns the currently selected suggestion */\n\tTextListItem GetSelectedSuggestion() const;\n\n\t/** Sets the focus to the InputText box */\n\tvoid FocusSearchBox() const;\n\nprivate:\n\t/** The Property handle of the property this widget represents. */\n\tTSharedPtr<IPropertyHandle> PropertyHandle;\n\n\t/** All possible suggestions for the search text. When there is no context sensitive checkbox or the context sensitive checkbox is unchecked. */\n\tTAttribute<TArray<FName>> SuggestionAttributes;\n\n\t/** Used when the context sensitive checkbox is cehcked */\n\tTAttribute<TArray<FName>> CurrentContextSuggestionAttributes;;\n\n\t/** Text Value to display for the search text/Combo Button */\n\tTAttribute<FText> TextAttribute;\n\n\t/** Tooltip Value to display.  */\n\tTAttribute<FText> ToolTipAttribute;\n\n\t/** Hint text to display for the search text when there is no value */\n\tTAttribute<FText> HintTextAttribute;\n\n\t/** The Text that is displayed besides the display checkbox */\n\tTAttribute<FText> ContextCheckBoxTextAttribute;\n\n\t/** The tooltip text for the context checkbox. */\n\tTAttribute<FText> ContextCheckBoxToolTipTextAttribute;\n\n\t/** Delegate for when text is changed in the edit box */\n\tFOnTextChanged OnTextChanged;\n\n\t/** Delegate for when text is changed in the edit box */\n\tFOnTextCommitted OnTextCommitted;\n\n\t/** Delegate for first chance handling for key down events */\n\tFOnKeyDown OnKeyDownHandler;\n\n\t/** The list view that is displaying the text strings */\n\tTSharedPtr<SBorder> ListViewContainerWidget;\n\n\t/** The list view for showing all suggestions */\n\tTSharedPtr<SListView<TextListItem>> ListViewWidget;\n\n\t/** Main combo button */\n\tTSharedPtr<SComboButton> ComboButtonWidget;\n\n\t/** Text of the combo button */\n\tTSharedPtr<STextBlock> ComboButtonTextWidget;\n\n\t/** The context sensitive checkbox widget. */\n\tTSharedPtr<SCheckBox> ContextCheckBoxWidget;\n\n\t/** The menu content widget displyed on click. */\n\tTSharedPtr<SVerticalBox> MenuWidget;\n\n\t/** The editable text field aka the search box */\n\tTSharedPtr<SSearchBox> InputTextWidget;\n\n\t/**\n\t * All suggestions stored in this widget for the list view.\n\t * It represents a snapshot of the SuggestionsAttribute or ContextSensitiveSuggestionsAttribute depending on situation.\n\t * Call UpdateSuggestionList to update.\n\t */\n\tTArray<TextListItem> Suggestions;\n\n\t/** Whether the SearchBox should delay notifying listeners of text changed events until the user is done typing */\n\tbool bDelayChangeNotificationsWhileTyping = true;\n\n\t/** Do we display the context sensitive checkbox? */\n\tbool bHasContextCheckBox = false;\n\n\t/** Is the box checked? */\n\tbool bIsContextCheckBoxChecked = false;\n};\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystemEditor/Private/DialogueEditor/DialogueCompiler.cpp",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#include \"DialogueCompiler.h\"\n\n#include \"Algo/Reverse.h\"\n\n#include \"DlgSystemEditorModule.h\"\n#include \"DialogueEditor/Graph/DialogueGraph.h\"\n#include \"DialogueEditorUtilities.h\"\n#include \"DialogueEditor/Nodes/DialogueGraphNode_Root.h\"\n#include \"DialogueEditor/Nodes/DialogueGraphNode_Edge.h\"\n#include \"Nodes/DlgNode.h\"\n#include \"DlgDialogue.h\"\n#include \"DlgHelper.h\"\n\nvoid FDialogueCompilerContext::Compile()\n{\n\tcheck(Dialogue);\n\tUDialogueGraph* DialogueGraph = CastChecked<UDialogueGraph>(Dialogue->GetGraph());\n\tDialogueGraphNodes = DialogueGraph->GetAllDialogueGraphNodes();\n\tif (DialogueGraphNodes.Num() == 0)\n\t\treturn;\n\n\tResultDialogueNodes.Empty();\n\tVisitedNodes.Empty();\n\tQueue.Empty();\n\tIndicesHistory.Empty();\n\tNodesPath.Empty();\n\tNextAvailableIndex = 0;\n\n\t// The code below tries to reconstruct the Dialogue Nodes from the Graph Nodes (aka compile).\n\t// The tricky part of the reconstructing (the Dialogue Nodes) is the node indices, because it takes\n\t// too much time to find the graph node with index X and add it in position X in the Dialogue.Nodes Array,\n\t// we simply walk the graph with a breath first search and reassign the indices as they appear.\n\t// This also has the advantage that close nodes will also have indices close to each other.\n\n\t// TODO(vampy): Add checking and output errors for the nodes, like orphans\n\t// Step 1. Find the root and set the start node\n\tGraphNodeRoot = DialogueGraph->GetRootGraphNode();\n\tcheck(GraphNodeRoot);\n\tVisitedNodes.Add(GraphNodeRoot);\n\n\t// Add initially the children as we do not add the StartNode to the array of DialogueNodes\n\tNodeDepth = 0;\n\tNodesNumberUntilDepthIncrease = 1; // root/start node\n\tNodesNumberNextDepth = 0; // we do not know yet\n\tCompileGraphNode(GraphNodeRoot);\n\n\t// Step 2. Walk the graph and set the rest of the nodes.\n\tCompileGraph();\n\n\t// Step 3. Set nodes categorization, this ignores isolated nodes\n\tSetEdgesCategorization();\n\n\t// Step 4. Add orphan nodes (nodes / node group with no parents), not connected to the start node\n\tPruneIsolatedNodes();\n\n\t// Step 5. Update the dialogue data.\n\tDialogue->EmptyNodesGUIDToIndexMap();\n\tDialogue->SetStartNode(GraphNodeRoot->GetMutableDialogueNode());\n\tDialogue->SetNodes(ResultDialogueNodes);\n\n\t// Step 6. Fix old indices and update GUID for the Conditions\n\tFixBrokenOldIndicesAndUpdateGUID();\n\n\tDialogue->PostEditChange();\n}\n\nvoid FDialogueCompilerContext::PreCompileGraphNode(UDialogueGraphNode* GraphNode)\n{\n\t// Sort connections/children so that they're organized the same as user can see in the editor.\n\tGraphNode->SortChildrenBasedOnXLocation();\n\tGraphNode->CheckDialogueNodeSyncWithGraphNode();\n\tGraphNode->SetNodeDepth(NodeDepth);\n\tNodeUnvisitedChildrenNum = 0;\n}\n\nvoid FDialogueCompilerContext::PostCompileGraphNode(UDialogueGraphNode* GraphNode)\n{\n\tGraphNode->ApplyCompilerWarnings();\n\n\t// Check symmetry, dialogue node <-> graph node\n\tGraphNode->CheckDialogueNodeSyncWithGraphNode(true);\n\n\t// Ensure the Node has a valid GUID\n\tUDlgNode* DialogueNode = GraphNode->GetMutableDialogueNode();\n\tif (!DialogueNode->HasGUID())\n\t{\n\t\tDialogueNode->RegenerateGUID();\n\t}\n\n\t// Update depth\n\t// BFS has the property that unvisited nodes in the queue all have depths that never decrease,\n\t// and increase by at most 1.\n\t--NodesNumberUntilDepthIncrease;\n\n\t// Track NodeDepth + 1 number\n\tNodesNumberNextDepth += NodeUnvisitedChildrenNum;\n\tif (NodesNumberUntilDepthIncrease == 0)\n\t{\n\t\t// Next depth coming up!\n\t\tNodeDepth++;\n\t\tNodesNumberUntilDepthIncrease = NodesNumberNextDepth;\n\t\t// Reset for the next dept aka NodeDepth + 1\n\t\tNodesNumberNextDepth = 0;\n\t}\n}\n\nvoid FDialogueCompilerContext::CompileGraphNode(UDialogueGraphNode* GraphNode)\n{\n\tPreCompileGraphNode(GraphNode);\n\n\t// Get the data as mutable, so what we can modify inplace\n\tconst UDlgNode& DialogueNode = GraphNode->GetDialogueNode();\n\tconst TArray<FDlgEdge>& NodeEdges = DialogueNode.GetNodeChildren();;\n\n\t// Walk over direct children\n\t// NOTE: GraphNode.OutputPin.LinkedTo are kept in sync with the Dialogue.Children\n\tconst TArray<UDlgNode*>& DialogueNodes = Dialogue->GetNodes();\n\tconst TArray<UDialogueGraphNode*> ChildNodes = GraphNode->GetChildNodes();\n\n\tfor (int32 ChildIndex = 0, ChildrenNum = ChildNodes.Num(); ChildIndex < ChildrenNum; ChildIndex++)\n\t{\n\t\t// Fail on invalid edges\n\t\tcheck(NodeEdges[ChildIndex].IsValid());\n\t\tUDialogueGraphNode* ChildNode = ChildNodes[ChildIndex];\n\n\t\t// Sanity check to assume that the child node will have the same edge data from the parent\n\t\t// BEFORE TargetIndex reassignment. If this fails it means that the Dialogue Node Children are not in\n\t\t// the right order (assumption below fails).\n\t\tconst int32 ChildNodeTargetIndex = NodeEdges[ChildIndex].TargetIndex;\n\t\tcheck(ChildNode == DialogueNodes[ChildNodeTargetIndex]->GetGraphNode())\n\n\t\t// Prevent double visiting nodes\n\t\tif (VisitedNodes.Contains(ChildNode))\n\t\t{\n\t\t\t// Node already visited, this means it has already a set index (we found a cycle)\n\t\t\tGraphNode->SetEdgeTargetIndexAt(ChildIndex, ChildNode->GetDialogueNodeIndex());\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Traverse the queue\n\t\tverify(Queue.Enqueue(ChildNode));\n\t\tVisitedNodes.Add(ChildNode);\n\n\t\t// From This Node => Parent Node\n\t\tNodesPath.Add(ChildNode, GraphNode);\n\t\tNodeUnvisitedChildrenNum++;\n\n\t\t// Assume they will be added in order.\n\t\t// Parent (GraphNode) points to the new assigned ChildNode.NodeIndex\n\t\tSetNextAvailableIndexToNode(ChildNode);\n\t\tGraphNode->SetEdgeTargetIndexAt(ChildIndex, NextAvailableIndex);\n\t\tNextAvailableIndex++;\n\t}\n\n\t// Update the graph node/dialogue node with the new Node data (indices of children)\n\tPostCompileGraphNode(GraphNode);\n}\n\nvoid FDialogueCompilerContext::CompileGraph()\n{\n\t// Complexity O(|V| + |E|)\n\t// Reassign all the indices in the queue\n\twhile (!Queue.IsEmpty())\n\t{\n\t\tUDialogueGraphNode* GraphNode;\n\t\tverify(Queue.Dequeue(GraphNode));\n\n\t\t// See children\n\t\tCompileGraphNode(GraphNode);\n\n\t\t// Accumulate for the Dialogue.Nodes array\n\t\tconst int32 NodeAddedIndex = ResultDialogueNodes.Add(GraphNode->GetMutableDialogueNode());\n\n\t\t// Expect prediction to be true\n\t\tcheck(NodeAddedIndex == GraphNode->GetDialogueNodeIndex());\n\t}\n}\n\nbool FDialogueCompilerContext::GetPathToNode(\n\tconst UDialogueGraphNode* SourceNode,\n\tconst UDialogueGraphNode* TargetNode,\n\tTArray<const UDialogueGraphNode*>& OutPath\n)\n{\n\tOutPath.Empty();\n\tOutPath.Add(TargetNode);\n\n\t// backtrack to the source node\n\tconst UDialogueGraphNode* CurrentNode = TargetNode;\n\twhile (CurrentNode != SourceNode)\n\t{\n\t\t// Find the parent of the current node in the path\n\t\tconst UDialogueGraphNode** ParentNodePtr = NodesPath.Find(CurrentNode);\n\n\t\t// Something went wrong :(\n\t\tif (ParentNodePtr == nullptr)\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\t// continue searching\n\t\tOutPath.Add(*ParentNodePtr);\n\t\tCurrentNode = *ParentNodePtr;\n\t}\n\n\tAlgo::Reverse(OutPath);\n\treturn true;\n}\n\nbool FDialogueCompilerContext::GetPathToNodeAsSet(\n\tconst UDialogueGraphNode* SourceNode,\n\tconst UDialogueGraphNode* TargetNode,\n\tTSet<const UDialogueGraphNode*>& OutNodesInPath\n)\n{\n\tOutNodesInPath.Empty();\n\tOutNodesInPath.Add(TargetNode);\n\n\tconst UDialogueGraphNode* CurrentNode = TargetNode;\n\twhile (CurrentNode != SourceNode)\n\t{\n\t\tconst UDialogueGraphNode** ParentNodePtr = NodesPath.Find(CurrentNode);\n\t\tif (ParentNodePtr == nullptr)\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\tOutNodesInPath.Add(*ParentNodePtr);\n\t\tCurrentNode = *ParentNodePtr;\n\t}\n\n\treturn true;\n}\n\nvoid FDialogueCompilerContext::SetEdgesCategorization()\n{\n\t// If there is an unique path from the root node to the child node (the node the edge points to) of this edge it means the\n\t// edge is primary, otherwise it is secondary.\n\tfor (UDialogueGraphNode* GraphNode : VisitedNodes)\n\t{\n\t\t// Ignore the root node\n\t\tif (GraphNode->IsRootNode())\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\n\t\tTSet<const UDialogueGraphNode*> PathToThisNodeSet;\n\t\tif (!GetPathToNodeAsSet(GraphNodeRoot, GraphNode, PathToThisNodeSet))\n\t\t{\n\t\t\tUE_LOG(LogDlgSystemEditor, Warning, TEXT(\"Can't find a path from the root node to the node with index = %d\"), GraphNode->GetDialogueNodeIndex());\n\t\t\tcontinue;\n\t\t}\n\n\t\t// (input pin) GraphNode (output pin) -> (input pin) ChildEdgeNode (output pin) -> (input pin) ChildNode (output pin)\n\t\tfor (UDialogueGraphNode_Edge* ChildEdgeNode : GraphNode->GetChildEdgeNodes())\n\t\t{\n\t\t\t// Unique path is determined by:\n\t\t\t// If the path to the parent Node of this Edge (aka PathToThisNode) does not contain the ChildNode\n\t\t\t// it means this path is unique (primary edge) to the ChildNode\n\t\t\tChildEdgeNode->SetIsPrimaryEdge(!PathToThisNodeSet.Contains(ChildEdgeNode->GetChildNode()));\n\t\t}\n\t}\n}\n\nvoid FDialogueCompilerContext::PruneIsolatedNodes()\n{\n\t// No orphans/isolated nodes\n\tif (DialogueGraphNodes.Num() == VisitedNodes.Num())\n\t{\n\t\treturn;\n\t}\n\n\tconst TSet<UDialogueGraphNode*> NodesSet(DialogueGraphNodes);\n\t// Get every orphan\n\twhile (NodesSet.Num() != VisitedNodes.Num())\n\t{\n\t\t// Nodes that are in the graph but not in the visited nodes set\n\t\tconst TSet<UDialogueGraphNode*> OrphanedNodes = NodesSet.Difference(VisitedNodes);\n\n\t\t// Try to find the root orphan (the one with 0 inputs)\n\t\t// This will fail  if the orphan subgraph is cyclic.\n\t\tUDialogueGraphNode* RootOrphan = nullptr;\n\t\tfor (UDialogueGraphNode* GraphNode : OrphanedNodes)\n\t\t{\n\t\t\tif (GraphNode->GetInputPin()->LinkedTo.Num() == 0)\n\t\t\t{\n\t\t\t\tRootOrphan = GraphNode;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\t// Cyclic orphan subgraph found, choose first node\n\t\tif (!IsValid(RootOrphan))\n\t\t{\n\t\t\tRootOrphan = CastChecked<UDialogueGraphNode>(*FDlgHelper::GetFirstSetElement(OrphanedNodes));\n\t\t}\n\n\t\t// Queue and assign node\n\t\tSetNextAvailableIndexToNode(RootOrphan);\n\t\tVisitedNodes.Add(RootOrphan);\n\t\tQueue.Empty();\n\t\tverify(Queue.Enqueue(RootOrphan));\n\t\tNextAvailableIndex++;\n\t\tCompileGraph();\n\t}\n}\n\nvoid FDialogueCompilerContext::FixBrokenOldIndicesAndUpdateGUID()\n{\n\t// Check if we have any modified indices\n\t// bool bHistoryModified = false;\n\t// for (auto& Elem : IndicesHistory)\n\t// {\n\t// \tif (Elem.Key != Elem.Value)\n\t// \t{\n\t// \t\tbHistoryModified = true;\n\t// \t\tbreak;\n\t// \t}\n\t// }\n\t// if (!bHistoryModified)\n\t// {\n\t// \treturn;\n\t// }\n\n\tFDialogueEditorUtilities::RemapOldIndicesWithNewAndUpdateGUID(DialogueGraphNodes, IndicesHistory);\n}\n\nvoid FDialogueCompilerContext::SetNextAvailableIndexToNode(UDialogueGraphNode* GraphNode)\n{\n\t// History is important.\n\tIndicesHistory.Add(GraphNode->GetDialogueNodeIndex(), NextAvailableIndex);\n\tGraphNode->SetDialogueNodeIndex(NextAvailableIndex);\n}\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystemEditor/Private/DialogueEditor/DialogueCompiler.h",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#pragma once\n\n#include \"CoreTypes.h\"\n#include \"Kismet2/CompilerResultsLog.h\"\n#include \"Containers/Queue.h\"\n\nclass UDialogueGraphNode_Root;\nclass UDlgNode;\nclass UDlgDialogue;\nclass UDialogueGraphNode;\nclass UDlgSystemSettings;\n\nclass FDialogueCompilerContext\n{\n\tfriend UDlgDialogue;\n\npublic:\n\tFDialogueCompilerContext(UDlgDialogue* InDialogue, const UDlgSystemSettings* InSettings, FCompilerResultsLog& InMessageLog)\n\t: Dialogue(InDialogue), Settings(InSettings), MessageLog(InMessageLog)\n\t{}\n\n\t/** Compile the Dialogue from its graph nodes */\n\tvoid Compile();\n\nprivate:\n\t/** Applies necessary steps before the main compile routine (CompileGraphNode) has compiled on a node. */\n\tvoid PreCompileGraphNode(UDialogueGraphNode* GraphNode);\n\n\t/** Applies necessary steps after the main compile routine (CompileGraphNode) has finished on a node. */\n\tvoid PostCompileGraphNode(UDialogueGraphNode* GraphNode);\n\n\t/** Compiles/reassign the children of a GraphNode and reassign it's indices. */\n\tvoid CompileGraphNode(UDialogueGraphNode* GraphNode);\n\n\t/** Used for the step 2 and 4 of the compile phase, reassign/compile the whole graph queue. */\n\tvoid CompileGraph();\n\n\t/** Gets the Path from SourceNode to the TargetNode in the OutPath. Returns false if no path can be found.  */\n\tbool GetPathToNode(const UDialogueGraphNode* SourceNode, const UDialogueGraphNode* TargetNode, TArray<const UDialogueGraphNode*>& OutPath);\n\n\t/** Same as above only return a set. */\n\tbool GetPathToNodeAsSet(const UDialogueGraphNode* SourceNode, const UDialogueGraphNode* TargetNode, TSet<const UDialogueGraphNode*>& OutNodesInPath);\n\n\t/** Sets the Edge category of each edge. */\n\tvoid SetEdgesCategorization();\n\n\t/** Compiles/handles all remaining isolated nodes of the graph. */\n\tvoid PruneIsolatedNodes();\n\n\t/** Fixes all references to the old indices that this compile most likely broke. */\n\tvoid FixBrokenOldIndicesAndUpdateGUID();\n\n\t/** Sets NextAvailableIndex on the provided nodes, also keeps track of history in IndicesHistory. */\n\tvoid SetNextAvailableIndexToNode(UDialogueGraphNode* GraphNode);\n\nprivate:\n\t/** The dialogue being compiled. */\n\tUDlgDialogue* Dialogue = nullptr;\n\n\t// Settings we will use\n\tconst UDlgSystemSettings* Settings = nullptr;\n\n\t// TODO Use this\n\t/** Compiler message log (errors, warnings, notes) */\n\tFCompilerResultsLog& MessageLog;\n\n\t// Used when compiling:\n\t/** All the graph nodes of the Dialogue */\n\tTArray<UDialogueGraphNode*> DialogueGraphNodes;\n\n\t/** The result of the compile will be stored here. This represents the new Dialogue.Nodes Array. */\n\tTArray<UDlgNode*> ResultDialogueNodes;\n\n\t/** All the visited graph nodes in the BFS. */\n\tTSet<UDialogueGraphNode*> VisitedNodes;\n\n\t/** The queue for the BFS */\n\tTQueue<UDialogueGraphNode*> Queue;\n\n\t/**\n\t * Used to keep track of how indices change.\n\t * Key: Old index\n\t * Value: New index\n     */\n\tTMap<int32, int32> IndicesHistory;\n\n\t/** The root graph node. */\n\tUDialogueGraphNode_Root* GraphNodeRoot = nullptr;\n\n\t/**\n\t * Keep track of paths. Use pointers as the indices change at compile time.\n\t * Key: Node\n\t * Value: Parent Node\n\t */\n\tTMap<const UDialogueGraphNode*, const UDialogueGraphNode*> NodesPath;\n\n\t/** Useful for keeping track of the next available index in the DialogueNodes. */\n\tint32 NextAvailableIndex = INDEX_NONE;\n\n\t/** Indicates the current node depth the BFS is at. Root Node as depth 0. */\n\tint32 NodeDepth = INDEX_NONE;\n\n\t/** Tells us the number of unvisited children the current node has. */\n\tint32 NodeUnvisitedChildrenNum = INDEX_NONE;\n\n\t/**\n\t * Keeps track of how many nodes we must process (take from the queue) until we reach the next depth.\n\t * When it reaches 0 it means we have reached the next level.\n\t */\n\tint32 NodesNumberUntilDepthIncrease = INDEX_NONE;\n\n\t/**\n\t * Keeps track of the nodes numbers at depth NodeDepth + 1.\n\t * Useful because we are only looking at the current depth and Unreal Queue does not have Size() sigh.\n\t * This could have been done with a bool only, because we know how many items there are at current level and when\n\t * we take all of them out, we know that the size of the current Queue is the nodes number at the next depth.\n\t */\n\tint32 NodesNumberNextDepth = INDEX_NONE;\n};\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystemEditor/Private/DialogueEditor/DialogueEditor.cpp",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#include \"DialogueEditor.h\"\n\n#include \"Editor.h\"\n#include \"SSingleObjectDetailsPanel.h\"\n#include \"Widgets/Docking/SDockTab.h\"\n#include \"ScopedTransaction.h\"\n#include \"Framework/Application/SlateApplication.h\"\n#include \"PropertyEditorModule.h\"\n#include \"GraphEditor.h\"\n#include \"Toolkits/IToolkitHost.h\"\n#include \"IDetailsView.h\"\n#include \"Framework/Commands/GenericCommands.h\"\n#include \"GraphEditorActions.h\"\n#include \"Modules/ModuleManager.h\"\n#include \"Framework/MultiBox/MultiBoxBuilder.h\"\n#include \"EdGraphUtilities.h\"\n#include \"HAL/PlatformApplicationMisc.h\"\n\n#include \"DlgSystemEditorModule.h\"\n#include \"DlgDialogue.h\"\n#include \"DlgHelper.h\"\n#include \"SDialoguePalette.h\"\n#include \"SDialogueActionMenu.h\"\n#include \"DialogueEditor/Nodes/DialogueGraphNode_Root.h\"\n#include \"DialogueEditor/Nodes/DialogueGraphNode.h\"\n#include \"DialogueEditor/Nodes/DialogueGraphNode_Edge.h\"\n#include \"DialogueEditor/Graph/DialogueGraphSchema.h\"\n#include \"DialogueCommands.h\"\n#include \"Graph/SchemaActions/ConvertSpeechSequenceNodeToSpeechNodes_DialogueGraphSchemaAction.h\"\n#include \"DialogueSearch/DialogueSearchManager.h\"\n#include \"DialogueSearch/SFindInDialogues.h\"\n#include \"Graph/SchemaActions/ConvertSpeechNodesToSpeechSequence_DialogueGraphSchemaAction.h\"\n\n#define LOCTEXT_NAMESPACE \"DialogueEditor\"\n\n// define constants\nconst FName FDialogueEditor::DetailsTabID(TEXT(\"DialogueEditor_Details\"));\nconst FName FDialogueEditor::GraphCanvasTabID(TEXT(\"DialogueEditor_GraphCanvas\"));\nconst FName FDialogueEditor::PaletteTabId(TEXT(\"DialogueEditor_Palette\"));\nconst FName FDialogueEditor::FindInDialogueTabId(TEXT(\"DialogueEditor_Find\"));\nconst FName DialogueEditorAppName = FName(TEXT(\"DialogueEditorAppName\"));\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// FDialogueEditor\nFDialogueEditor::FDialogueEditor() : DialogueBeingEdited(nullptr)\n{\n\tGEditor->RegisterForUndo(this);\n}\n\nFDialogueEditor::~FDialogueEditor()\n{\n\tGEditor->UnregisterForUndo(this);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// Begin IToolkit interface\nvoid FDialogueEditor::RegisterTabSpawners(const TSharedRef<class FTabManager>& InTabManager)\n{\n\tWorkspaceMenuCategory = TabManager->AddLocalWorkspaceMenuCategory(LOCTEXT(\"WorkspaceMenu_DialogueEditor\", \"Dialogue Editor\"));\n\tconst TSharedRef<FWorkspaceItem> WorkspaceMenuCategoryRef = WorkspaceMenuCategory.ToSharedRef();\n\n\tFAssetEditorToolkit::RegisterTabSpawners(InTabManager);\n\n\t// spawn tabs\n\tInTabManager->RegisterTabSpawner(\n\t\tGraphCanvasTabID,\n\t\tFOnSpawnTab::CreateSP(this, &Self::SpawnTab_GraphCanvas)\n\t)\n\t.SetDisplayName(LOCTEXT(\"GraphCanvasTab\", \"Viewport\"))\n\t.SetGroup(WorkspaceMenuCategoryRef)\n\t.SetIcon(FSlateIcon(FEditorStyle::GetStyleSetName(), \"GraphEditor.EventGraph_16x\"));\n\n\tInTabManager->RegisterTabSpawner(\n\t\tDetailsTabID,\n\t\tFOnSpawnTab::CreateSP(this, &Self::SpawnTab_Details)\n\t)\n\t.SetDisplayName(LOCTEXT(\"DetailsTabLabel\", \"Details\"))\n\t.SetGroup(WorkspaceMenuCategoryRef)\n\t.SetIcon(FSlateIcon(FEditorStyle::GetStyleSetName(), \"LevelEditor.Tabs.Details\"));\n\n\tInTabManager->RegisterTabSpawner(\n\t\tPaletteTabId,\n\t\tFOnSpawnTab::CreateSP(this, &Self::SpawnTab_Palette)\n\t)\n\t.SetDisplayName(LOCTEXT(\"PaletteTab\", \"Palette\"))\n\t.SetGroup(WorkspaceMenuCategoryRef)\n\t.SetIcon(FSlateIcon(FEditorStyle::GetStyleSetName(), \"Kismet.Tabs.Palette\"));\n\n\tInTabManager->RegisterTabSpawner(\n\t\tFindInDialogueTabId,\n\t\tFOnSpawnTab::CreateSP(this, &Self::SpawnTab_FindInDialogue)\n\t)\n\t.SetDisplayName(LOCTEXT(\"FindInDialogueTab\", \"Find Results\"))\n\t.SetGroup(WorkspaceMenuCategoryRef)\n\t.SetIcon(FSlateIcon(FEditorStyle::GetStyleSetName(), \"Kismet.Tabs.FindResults\"));\n}\n\nvoid FDialogueEditor::UnregisterTabSpawners(const TSharedRef<class FTabManager>& InTabManager)\n{\n\tFAssetEditorToolkit::UnregisterTabSpawners(InTabManager);\n\n\tInTabManager->UnregisterTabSpawner(GraphCanvasTabID);\n\tInTabManager->UnregisterTabSpawner(DetailsTabID);\n\tInTabManager->UnregisterTabSpawner(PaletteTabId);\n\tInTabManager->UnregisterTabSpawner(FindInDialogueTabId);\n}\n\nFText FDialogueEditor::GetBaseToolkitName() const\n{\n\treturn LOCTEXT(\"DialogueEditorAppLabel\", \"Dialogue Editor\");\n}\n\nFText FDialogueEditor::GetToolkitName() const\n{\n\tconst bool bDirtyState = DialogueBeingEdited->GetOutermost()->IsDirty();\n\n\tFFormatNamedArguments Args;\n\tArgs.Add(TEXT(\"DialogueName\"), FText::FromString(DialogueBeingEdited->GetName()));\n\tArgs.Add(TEXT(\"DirtyState\"), bDirtyState ? FText::FromString(TEXT(\"*\")) : FText::GetEmpty());\n\treturn FText::Format(LOCTEXT(\"DialogueEditorToolkitName\", \"{DialogueName}{DirtyState}\"), Args);\n}\n// End of IToolkit Interface\n//////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// Begin FAssetEditorToolkit\nvoid FDialogueEditor::SaveAsset_Execute()\n{\n\tFAssetEditorToolkit::SaveAsset_Execute();\n}\n\nvoid FDialogueEditor::SaveAssetAs_Execute()\n{\n\tFAssetEditorToolkit::SaveAssetAs_Execute();\n}\n// End of FAssetEditorToolkit\n//////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// Begin IAssetEditorInstance\nvoid FDialogueEditor::FocusWindow(UObject* ObjectToFocusOn)\n{\n\tBringToolkitToFront();\n\tJumpToObject(ObjectToFocusOn);\n}\n// End of IAssetEditorInstance\n//////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n//////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// Begin FEditorUndoClient Interface\nvoid FDialogueEditor::PostUndo(bool bSuccess)\n{\n\tif (bSuccess)\n\t{\n\t\tRefresh(false);\n\t\tCheckAll();\n\t}\n}\n\nvoid FDialogueEditor::PostRedo(bool bSuccess)\n{\n\tif (bSuccess)\n\t{\n\t\tRefresh(false);\n\t\tCheckAll();\n\t}\n}\n// End of FEditorUndoClient Interface\n//////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n//////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// Begin IDialogueEditor\n\nvoid FDialogueEditor::RefreshDetailsView(bool bRestorePreviousSelection)\n{\n\tif (DetailsView.IsValid())\n\t{\n\t\tif (DialogueBeingEdited)\n\t\t{\n\t\t\tDetailsView->SetObject(DialogueBeingEdited, true);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tDetailsView->ForceRefresh();\n\t\t}\n\t\tDetailsView->ClearSearch();\n\t}\n\n\tif (bRestorePreviousSelection)\n\t{\n\t\t// Create local copy because this can be changed by node selection again\n\t\tTArray<TWeakObjectPtr<UObject>> ArrayCopy = PreviousSelectedNodeObjects;\n\n\t\t// Select all previous nodes\n\t\tfor (const TWeakObjectPtr<UObject>& WeakObj : ArrayCopy)\n\t\t{\n\t\t\tif (!WeakObj.IsValid(false))\n\t\t\t{\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tUObject* Object = WeakObj.Get();\n\t\t\tif (!IsValid(Object))\n\t\t\t{\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tUEdGraphNode* GraphNode = Cast<UEdGraphNode>(Object);\n\t\t\tif (!IsValid(GraphNode))\n\t\t\t{\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tGraphEditorView->SetNodeSelection(const_cast<UEdGraphNode*>(GraphNode), true);\n\t\t}\n\t}\n}\n\nvoid FDialogueEditor::Refresh(bool bRestorePreviousSelection)\n{\n\tClearViewportSelection();\n\tRefreshViewport();\n\tRefreshDetailsView(bRestorePreviousSelection);\n\tFSlateApplication::Get().DismissAllMenus();\n}\n\nvoid FDialogueEditor::JumpToObject(const UObject* Object)\n{\n\t// Ignore invalid objects\n\tif (!IsValid(Object) || !GraphEditorView.IsValid())\n\t{\n\t\treturn;\n\t}\n\n\tconst UEdGraphNode* GraphNode = Cast<UEdGraphNode>(Object);\n\tif (!IsValid(GraphNode))\n\t{\n\t\treturn;\n\t}\n\n\t// Are we in the same graph?\n\tif (DialogueBeingEdited->GetGraph() != GraphNode->GetGraph())\n\t{\n\t\treturn;\n\t}\n\n\t// TODO create custom SGraphEditor\n\t// Not part of the graph anymore :(\n\tif (!DialogueBeingEdited->GetGraph()->Nodes.Contains(GraphNode))\n\t{\n\t\treturn;\n\t}\n\n\t// Jump to the node\n\tstatic constexpr bool bRequestRename = false;\n\tstatic constexpr bool bSelectNode = true;\n\tRefresh(false);\n\tGraphEditorView->JumpToNode(GraphNode, bRequestRename, bSelectNode);\n\n\t// Select from JumpNode seems to be buggy sometimes, WE WILL DO IT OURSELFS!\n\t// I know, I know, it is not my fault that SetNodeSelection does not have the graph node as const, sigh\n\tGraphEditorView->SetNodeSelection(const_cast<UEdGraphNode*>(GraphNode), bSelectNode);\n}\n// End of IDialogueEditor\n//////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n//////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// Begin own functions\nvoid FDialogueEditor::SummonSearchUI(bool bSetFindWithinDialogue, FString NewSearchTerms, bool bSelectFirstResult)\n{\n\tTSharedPtr<SFindInDialogues> FindResultsToUse;\n\tif (bSetFindWithinDialogue)\n\t{\n\t\t// Open local tab\n\t\tFindResultsToUse = FindResultsView;\n\t\tTabManager->InvokeTab(FindInDialogueTabId);\n\t}\n\telse\n\t{\n\t\t// Open global tab\n\t\tFindResultsToUse = FDialogueSearchManager::Get()->GetGlobalFindResults();\n\t}\n\n\tif (FindResultsToUse.IsValid())\n\t{\n\t\tFDialogueSearchFilter Filter;\n\t\tFilter.SearchString = NewSearchTerms;\n\t\tFindResultsToUse->FocusForUse(bSetFindWithinDialogue, Filter, bSelectFirstResult);\n\t}\n}\n\nvoid FDialogueEditor::InitDialogueEditor(\n\tEToolkitMode::Type Mode,\n\tconst TSharedPtr<IToolkitHost>& InitToolkitHost,\n\tUDlgDialogue* InitDialogue\n)\n{\n\tSettings = GetMutableDefault<UDlgSystemSettings>();\n\n\t// close all other editors editing this asset\n\tFDialogueEditorUtilities::CloseOtherEditors(InitDialogue, this);\n\tDialogueBeingEdited = InitDialogue;\n\tFDialogueEditorUtilities::TryToCreateDefaultGraph(DialogueBeingEdited);\n\n\t// Bind Undo/Redo methods\n\tDialogueBeingEdited->SetFlags(RF_Transactional);\n\n\t// Gather data for the showing of primary/secondary edges\n\tif (GetSettings().bShowPrimarySecondaryEdges)\n\t{\n\t\tDialogueBeingEdited->InitialCompileDialogueNodesFromGraphNodes();\n\t}\n\n\t// Bind commands\n\tFGraphEditorCommands::Register();\n\tFDialogueCommands::Register();\n\tBindEditorCommands();\n\tCreateInternalWidgets();\n\n\t// Default layout\n\tconst TSharedRef<FTabManager::FLayout> StandaloneDefaultLayout =\n\t\tFTabManager::NewLayout(\"Standalone_DialogueEditor_Layout_v1\")\n\t\t->AddArea\n\t\t(\n\t\t\tFTabManager::NewPrimaryArea()\n\t\t\t->SetOrientation(Orient_Vertical)\n\t\t\t->Split\n\t\t\t(\n\t\t\t\t// Toolbar\n\t\t\t\tFTabManager::NewStack()\n\t\t\t\t->SetSizeCoefficient(0.1f)\n\t\t\t\t->AddTab(GetToolbarTabId(), ETabState::OpenedTab)\n\t\t\t\t->SetHideTabWell(true)\n\t\t\t)\n\t\t\t->Split\n\t\t\t(\n\t\t\t\t// Main Application area\n\t\t\t\tFTabManager::NewSplitter()\n\t\t\t\t->SetOrientation(Orient_Horizontal)\n\t\t\t\t->SetSizeCoefficient(0.9f)\n\t\t\t\t->Split\n\t\t\t\t(\n\t\t\t\t\t// Left\n\t\t\t\t\t// Details tab\n\t\t\t\t\tFTabManager::NewStack()\n\t\t\t\t\t->SetSizeCoefficient(0.3f)\n\t\t\t\t\t->AddTab(DetailsTabID, ETabState::OpenedTab)\n\t\t\t\t)\n\t\t\t\t->Split\n\t\t\t\t(\n\t\t\t\t\t// Middle\n\t\t\t\t\tFTabManager::NewSplitter()\n\t\t\t\t\t->SetOrientation(Orient_Vertical)\n\t\t\t\t\t->SetSizeCoefficient(0.6f)\n\t\t\t\t\t->Split\n\t\t\t\t\t(\n\t\t\t\t\t\t// Top\n\t\t\t\t\t\t// Graph canvas\n\t\t\t\t\t\tFTabManager::NewStack()\n\t\t\t\t\t\t->SetSizeCoefficient(0.8f)\n\t\t\t\t\t\t->SetHideTabWell(true)\n\t\t\t\t\t\t->AddTab(GraphCanvasTabID, ETabState::OpenedTab)\n\t\t\t\t\t)\n\t\t\t\t\t->Split\n\t\t\t\t\t(\n\t\t\t\t\t\t// Bottom\n\t\t\t\t\t\t// Find Dialogue results\n\t\t\t\t\t\tFTabManager::NewStack()\n\t\t\t\t\t\t->SetSizeCoefficient(0.2f)\n\t\t\t\t\t\t->AddTab(FindInDialogueTabId, ETabState::ClosedTab)\n\t\t\t\t\t)\n\n\t\t\t\t)\n\t\t\t\t->Split\n\t\t\t\t(\n\t\t\t\t\t// Right\n\t\t\t\t\t// Properties tab\n\t\t\t\t\tFTabManager::NewStack()\n\t\t\t\t\t->SetSizeCoefficient(0.1f)\n\t\t\t\t\t->AddTab(PaletteTabId, ETabState::OpenedTab)\n\t\t\t\t)\n\n\t\t\t)\n\t\t);\n\n\t// Initialize the asset editor and spawn nothing (dummy layout)\n\tconstexpr bool bCreateDefaultStandaloneMenu = true;\n\tconstexpr bool bCreateDefaultToolbar = true;\n\tconstexpr bool bInIsToolbarFocusable = false;\n\tFAssetEditorToolkit::InitAssetEditor(Mode, InitToolkitHost, DialogueEditorAppName, StandaloneDefaultLayout,\n\t\t\tbCreateDefaultStandaloneMenu, bCreateDefaultToolbar, /*ObjectToEdit =*/ InitDialogue, bInIsToolbarFocusable);\n\n\t// extend menus and toolbar\n\tExtendMenu();\n\tExtendToolbar();\n\tRegenerateMenusAndToolbars();\n\n\t// Default show all nodes on editor open\n\tOnCommandUnHideAllNodes();\n}\n\nvoid FDialogueEditor::CheckAll() const\n{\n#if DO_CHECK\n\tcheck(DialogueBeingEdited);\n\tUDialogueGraph* Graph = GetDialogueGraph();\n\tfor (UEdGraphNode* GraphNode : Graph->Nodes)\n\t{\n\t\tcheck(GraphNode);\n\t}\n\n\tcheck(FDialogueEditorUtilities::AreDialogueNodesInSyncWithGraphNodes(DialogueBeingEdited));\n\tfor (UDialogueGraphNode* GraphNode : Graph->GetAllDialogueGraphNodes())\n\t{\n\t\tGraphNode->CheckAll();\n\t}\n#endif\n}\n\nvoid FDialogueEditor::SetDialogueBeingEdited(UDlgDialogue* NewDialogue)\n{\n\t// TODO do we need this method?\n\n\t// not different or a null poointer, do not set anything\n\tif (NewDialogue == DialogueBeingEdited || !IsValid(NewDialogue))\n\t\treturn;\n\n\t// set to the new dialogue\n\tUDlgDialogue* OldDialogue = DialogueBeingEdited;\n\tDialogueBeingEdited = NewDialogue;\n\n\t// Let the viewport know that we are editing something different\n\n\t// Let the editor know that are editing something different\n\tRemoveEditingObject(OldDialogue);\n\tAddEditingObject(NewDialogue);\n\n\t// Update the asset picker to select the new active dialogue\n}\n\nvoid FDialogueEditor::NotifyPostChange(const FPropertyChangedEvent& PropertyChangedEvent, FNYProperty* PropertyThatChanged)\n{\n\tif (GraphEditorView.IsValid() && PropertyChangedEvent.ChangeType != EPropertyChangeType::Interactive)\n\t{\n\t\tGraphEditorView->NotifyGraphChanged();\n\t}\n}\n\nvoid FDialogueEditor::CreateInternalWidgets()\n{\n\t// The graph Viewport\n\tGraphEditorView = CreateGraphEditorWidget();\n\n\t// Details View (properties panel)\n\tFDetailsViewArgs DetailsViewArgs;\n\tDetailsViewArgs.bUpdatesFromSelection = false;\n\tDetailsViewArgs.bLockable = false;\n\tDetailsViewArgs.bAllowSearch = true;\n\tDetailsViewArgs.NotifyHook = this;\n\tDetailsViewArgs.NameAreaSettings = FDetailsViewArgs::ObjectsUseNameArea;\n\tDetailsViewArgs.bHideSelectionTip = false;\n\n\tFPropertyEditorModule& PropertyEditorModule = FModuleManager::GetModuleChecked<FPropertyEditorModule>(\"PropertyEditor\");\n\tDetailsView = PropertyEditorModule.CreateDetailView(DetailsViewArgs);\n\tDetailsView->SetObject(DialogueBeingEdited);\n\n\t// Pallete view\n\tPaletteView = SNew(SDialoguePalette);\n\n\t// Find Results\n\tFindResultsView = SNew(SFindInDialogues, SharedThis(this));\n}\n\nTSharedRef<SGraphEditor> FDialogueEditor::CreateGraphEditorWidget()\n{\n\tcheck(DialogueBeingEdited);\n\t// Customize the appearance of the graph.\n\tFGraphAppearanceInfo AppearanceInfo;\n\t// The text that appears on the bottom right corner in the graph view.\n\tAppearanceInfo.CornerText = LOCTEXT(\"AppearanceCornerText_DlgDialogue\", \"DIALOGUE\");\n\tAppearanceInfo.InstructionText = LOCTEXT(\"AppearanceInstructionText_DlgDialogue\", \"Right Click to add new nodes.\");\n\n\t// Bind graph events actions from the editor\n\tSGraphEditor::FGraphEditorEvents InEvents;\n\tInEvents.OnTextCommitted = FOnNodeTextCommitted::CreateSP(this, &FDialogueEditor::OnNodeTitleCommitted);\n\tInEvents.OnSelectionChanged = SGraphEditor::FOnSelectionChanged::CreateSP(this, &FDialogueEditor::OnSelectedNodesChanged);\n\tInEvents.OnCreateActionMenu = SGraphEditor::FOnCreateActionMenu::CreateSP(this, &FDialogueEditor::OnCreateGraphActionMenu);\n\n\treturn SNew(SGraphEditor)\n\t\t.AdditionalCommands(GraphEditorCommands)\n\t\t.IsEditable(true)\n\t\t.Appearance(AppearanceInfo)\n\t\t.GraphToEdit(DialogueBeingEdited->GetGraph())\n\t\t.GraphEvents(InEvents)\n\t\t.ShowGraphStateOverlay(false);\n}\n\nvoid FDialogueEditor::BindEditorCommands()\n{\n\t// Prevent duplicate assigns. This should never happen\n\tif (GraphEditorCommands.IsValid())\n\t{\n\t\treturn;\n\t}\n\tGraphEditorCommands = MakeShared<FUICommandList>();\n\n\t// Graph Editor Commands\n\t// Create comment node on graph. Default when you press the \"C\" key on the keyboard to create a comment.\n\tGraphEditorCommands->MapAction(\n\t\tFGraphEditorCommands::Get().CreateComment,\n\t\tFExecuteAction::CreateLambda([this]\n\t\t{\n\t\t\tFNewComment_DialogueGraphSchemaAction CommentAction;\n\t\t\tCommentAction.PerformAction(DialogueBeingEdited->GetGraph(), nullptr, GraphEditorView->GetPasteLocation());\n\t\t})\n\t);\n\n\tGraphEditorCommands->MapAction(\n\t\tFGenericCommands::Get().SelectAll,\n\t\tFExecuteAction::CreateLambda([this] { GraphEditorView->SelectAllNodes(); } ),\n\t\tFCanExecuteAction::CreateLambda([] { return true; })\n\t);\n\n\t// Edit Node commands\n\tconst auto DialogueCommands = FDialogueCommands::Get();\n\tGraphEditorCommands->MapAction(\n\t\tDialogueCommands.ConvertSpeechSequenceNodeToSpeechNodes,\n\t\tFExecuteAction::CreateSP(this, &Self::OnCommandConvertSpeechSequenceNodeToSpeechNodes),\n\t\tFCanExecuteAction::CreateLambda([this]\n\t\t{\n\t\t\treturn FDialogueEditorUtilities::CanConvertSpeechSequenceNodeToSpeechNodes(GetSelectedNodes());\n\t\t})\n\t);\n\n\tGraphEditorCommands->MapAction(\n\t\tDialogueCommands.ConvertSpeechNodesToSpeechSequence,\n\t\tFExecuteAction::CreateSP(this, &Self::OnCommandConvertSpeechNodesToSpeechSequence),\n\t\tFCanExecuteAction::CreateLambda([this]\n\t\t{\n\t\t\treturn FDialogueEditorUtilities::CanConvertSpeechNodesToSpeechSequence(GetSelectedNodes());\n\t\t})\n\t);\n\n\tGraphEditorCommands->MapAction(\n\t\tFGenericCommands::Get().Delete,\n\t\tFExecuteAction::CreateSP(this, &Self::OnCommandDeleteSelectedNodes),\n\t\tFCanExecuteAction::CreateSP(this, &Self::CanDeleteNodes)\n\t);\n\n\tGraphEditorCommands->MapAction(\n\t\tFGenericCommands::Get().Copy,\n\t\tFExecuteAction::CreateRaw(this, &Self::OnCommandCopySelectedNodes),\n\t\tFCanExecuteAction::CreateRaw(this, &Self::CanCopyNodes)\n\t);\n\n\tGraphEditorCommands->MapAction(\n\t\tFGenericCommands::Get().Paste,\n\t\tFExecuteAction::CreateRaw(this, &Self::OnCommandPasteNodes),\n\t\tFCanExecuteAction::CreateRaw(this, &Self::CanPasteNodes)\n\t);\n\n\t// Hide/Unhide nodes\n\tGraphEditorCommands->MapAction(\n\t\tDialogueCommands.HideNodes,\n\t\tFExecuteAction::CreateRaw(this, &Self::OnCommandHideSelectedNodes)\n\t);\n\n\tGraphEditorCommands->MapAction(\n\t\tDialogueCommands.UnHideAllNodes,\n\t\tFExecuteAction::CreateRaw(this, &Self::OnCommandUnHideAllNodes)\n\t);\n\n\t// Toolikit/Toolbar commands/Menu Commands\n\t// Undo Redo menu options\n\tToolkitCommands->MapAction(\n\t\tFGenericCommands::Get().Undo,\n\t\tFExecuteAction::CreateSP(this, &Self::OnCommandUndoGraphAction)\n\t);\n\n\tToolkitCommands->MapAction(\n\t\tFGenericCommands::Get().Redo,\n\t\tFExecuteAction::CreateSP(this, &Self::OnCommandRedoGraphAction)\n\t);\n\n\t// The toolbar reload button\n\tToolkitCommands->MapAction(\n\t\tDialogueCommands.DialogueReloadData,\n\t\tFExecuteAction::CreateSP(this, &Self::OnCommandDialogueReload),\n\t\tFCanExecuteAction::CreateLambda([this]\n\t\t{\n\t\t\treturn GetSettings().DialogueTextFormat != EDlgDialogueTextFormat::None;\n\t\t})\n\t);\n\n\t// The Show primary/secondary edge buttons\n\tToolkitCommands->MapAction(\n\t\tDialogueCommands.ToggleShowPrimarySecondaryEdges,\n\t\tFExecuteAction::CreateLambda([this]\n\t\t{\n\t\t\tSettings->SetShowPrimarySecondaryEdges(!GetSettings().bShowPrimarySecondaryEdges);\n\t\t\tif (GetSettings().bShowPrimarySecondaryEdges)\n\t\t\t{\n\t\t\t\tDialogueBeingEdited->InitialCompileDialogueNodesFromGraphNodes();\n\t\t\t}\n\t\t}),\n\t\tFCanExecuteAction::CreateLambda([] { return true; } ),\n\t\tFIsActionChecked::CreateLambda([this] { return GetSettings().bShowPrimarySecondaryEdges; })\n\t);\n\n\tToolkitCommands->MapAction(\n\t\tDialogueCommands.ToggleDrawPrimaryEdges,\n\t\tFExecuteAction::CreateLambda([this] { Settings->SetDrawPrimaryEdges(!GetSettings().bDrawPrimaryEdges); }),\n\t\tFCanExecuteAction::CreateLambda([this] { return GetSettings().bShowPrimarySecondaryEdges; }),\n\t\tFIsActionChecked::CreateLambda([this] { return GetSettings().bDrawPrimaryEdges; })\n\t);\n\n\tToolkitCommands->MapAction(\n\t\tDialogueCommands.ToggleDrawSecondaryEdges,\n\t\tFExecuteAction::CreateLambda([this] { Settings->SetDrawSecondaryEdges(!GetSettings().bDrawSecondaryEdges); }),\n\t\tFCanExecuteAction::CreateLambda([this] { return GetSettings().bShowPrimarySecondaryEdges; }),\n\t\tFIsActionChecked::CreateLambda([this] { return GetSettings().bDrawSecondaryEdges; })\n\t);\n\n\t// Find in All Dialogues\n\tToolkitCommands->MapAction(\n\t\tFDialogueCommands::Get().FindInAllDialogues,\n\t\tFExecuteAction::CreateLambda([this] { SummonSearchUI(false); })\n\t);\n\n\t// Find in current Dialogue\n\tToolkitCommands->MapAction(\n\t\tFDialogueCommands::Get().FindInDialogue,\n\t\tFExecuteAction::CreateLambda([this] { SummonSearchUI(true); })\n\t);\n\n\t// Map the global actions\n\tFDlgSystemEditorModule::MapActionsForFileMenuExtender(ToolkitCommands);\n\tFDlgSystemEditorModule::MapActionsForHelpMenuExtender(ToolkitCommands);\n\n\tToolkitCommands->MapAction(\n\t\tFDialogueCommands::Get().DeleteCurrentDialogueTextFiles,\n\t\tFExecuteAction::CreateLambda([this]\n\t\t{\n\t\t\tcheck(DialogueBeingEdited);\n\t\t\tconst FString Text = TEXT(\"Delete All text files for this Dialogue?\");\n\t\t\tconst EAppReturnType::Type Response = FPlatformMisc::MessageBoxExt(EAppMsgType::YesNo, *Text, *Text);\n\t\t\tif (Response == EAppReturnType::Yes)\n\t\t\t{\n\t\t\t\tDialogueBeingEdited->DeleteAllTextFiles();\n\t\t\t}\n\t\t})\n\t);\n}\n\nvoid FDialogueEditor::ExtendMenu()\n{\n\tTSharedPtr<FExtender> MenuExtender = MakeShared<FExtender>();\n\n\t// Extend the Edit menu\n\tMenuExtender->AddMenuExtension(\n\t\t\"EditHistory\",\n\t\tEExtensionHook::After,\n\t\tToolkitCommands,\n\t\tFMenuExtensionDelegate::CreateLambda([this](FMenuBuilder& MenuBuilder)\n\t\t{\n\t\t\tMenuBuilder.BeginSection(\"EditSearch\", LOCTEXT(\"EditMenu_SearchHeading\", \"Search\") );\n\t\t\t{\n\t\t\t\tMenuBuilder.AddMenuEntry(FDialogueCommands::Get().FindInDialogue);\n\t\t\t\tMenuBuilder.AddMenuEntry(FDialogueCommands::Get().FindInAllDialogues);\n\t\t\t}\n\t\t\tMenuBuilder.EndSection();\n\t\t})\n\t);\n\n\tAddMenuExtender(MenuExtender);\n\n\tAddMenuExtender(\n\t\tFDlgSystemEditorModule::CreateFileMenuExtender(\n\t\t\tToolkitCommands,\n\t\t\t{FDialogueCommands::Get().DeleteCurrentDialogueTextFiles}\n\t\t)\n\t);\n\tAddMenuExtender(FDlgSystemEditorModule::CreateHelpMenuExtender(ToolkitCommands));\n}\n\nTSharedRef<SWidget> FDialogueEditor::GeneratePrimarySecondaryEdgesMenu() const\n{\n\tconstexpr bool bShouldCloseWindowAfterMenuSelection = true;\n\tFMenuBuilder MenuBuilder(bShouldCloseWindowAfterMenuSelection, ToolkitCommands, {});\n\tMenuBuilder.BeginSection(\"ViewingOptions\", LOCTEXT(\"PrimarySecondaryEdgesMenu\", \"Viewing Options\"));\n\t{\n\t\tMenuBuilder.AddMenuEntry(FDialogueCommands::Get().ToggleDrawPrimaryEdges);\n\t\tMenuBuilder.AddMenuEntry(FDialogueCommands::Get().ToggleDrawSecondaryEdges);\n\t}\n\tMenuBuilder.EndSection();\n\n\treturn MenuBuilder.MakeWidget();\n}\n\nTSharedRef<SWidget> FDialogueEditor::GenerateExternalURLsMenu() const\n{\n\tconstexpr bool bShouldCloseWindowAfterMenuSelection = true;\n\tFMenuBuilder MenuBuilder(bShouldCloseWindowAfterMenuSelection, ToolkitCommands, {});\n\tMenuBuilder.BeginSection(\"OtherURls\", LOCTEXT(\"OtherURLsMenu\", \"Other URLs\"));\n\t{\n\t\tMenuBuilder.AddMenuEntry(FDialogueCommands::Get().OpenMarketplace);\n\t\tMenuBuilder.AddMenuEntry(FDialogueCommands::Get().OpenWiki);\n\t\tMenuBuilder.AddMenuEntry(FDialogueCommands::Get().OpenDiscord);\n\t\tMenuBuilder.AddMenuEntry(FDialogueCommands::Get().OpenForum);\n\t}\n\tMenuBuilder.EndSection();\n\n\treturn MenuBuilder.MakeWidget();\n}\n\nvoid FDialogueEditor::ExtendToolbar()\n{\n\t// Make toolbar to the right of the Asset Toolbar (Save and Find in content browser buttons).\n\t{\n\t\tTSharedPtr<FExtender> ToolbarExtender = MakeShared<FExtender>();\n\t\tToolbarExtender->AddToolBarExtension(\n\t\t\t\"Asset\",\n\t\t\tEExtensionHook::After,\n\t\t\tToolkitCommands,\n\t\t\tFToolBarExtensionDelegate::CreateLambda([this](FToolBarBuilder& ToolbarBuilder)\n\t\t\t{\n\t\t\t\tToolbarBuilder.BeginSection(\"Dialogue\");\n\t\t\t\t{\n\t\t\t\t\tToolbarBuilder.AddToolBarButton(FDialogueCommands::Get().DialogueReloadData);\n\t\t\t\t\tToolbarBuilder.AddToolBarButton(FDialogueCommands::Get().FindInDialogue);\n\n\t\t\t\t\tToolbarBuilder.AddToolBarButton(FDialogueCommands::Get().ToggleShowPrimarySecondaryEdges);\n\t\t\t\t\tToolbarBuilder.AddComboButton(\n\t\t\t\t\t\tFUIAction(\n\t\t\t\t\t\t\tFExecuteAction(),\n\t\t\t\t\t\t\tFCanExecuteAction::CreateLambda([this] {\n\t\t\t\t\t\t\t\t// only when the show/primary secondary edges is true\n\t\t\t\t\t\t\t\treturn GetSettings().bShowPrimarySecondaryEdges;\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t),\n\t\t\t\t\t\tFOnGetContent::CreateSP(this, &Self::GeneratePrimarySecondaryEdgesMenu),\n\t\t\t\t\t\tLOCTEXT(\"PrimarySecondaryEdges\", \"Viewing Options\"),\n\t\t\t\t\t\tLOCTEXT(\"PrimarySecondaryEdges_ToolTip\", \"Viewing settings\"),\n\t\t\t\t\t\tFSlateIcon(),\n\t\t\t\t\t\ttrue\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tToolbarBuilder.EndSection();\n\t\t\t})\n\t\t);\n\t\tAddToolbarExtender(ToolbarExtender);\n\t}\n\n\t// Add External URLs\n\tif (GetSettings().bShowExternalURLsToolbar)\n\t{\n\t\tTSharedPtr<FExtender> ExternalToolbarExtender = MakeShared<FExtender>();\n\t\tExternalToolbarExtender->AddToolBarExtension(\n\t\t\t\"Asset\",\n\t\t\tEExtensionHook::After,\n\t\t\tToolkitCommands,\n\t\t\tFToolBarExtensionDelegate::CreateLambda([this](FToolBarBuilder& ToolbarBuilder)\n\t\t\t{\n\t\t\t\tToolbarBuilder.BeginSection(\"DialogueExternal\");\n\t\t\t\t{\n\t\t\t\t\tToolbarBuilder.AddToolBarButton(\n\t\t\t\t\t\tFDialogueCommands::Get().OpenNotYetPlugins,\n\t\t\t\t\t\tNAME_None,\n\t\t\t\t\t\tLOCTEXT(\"NotYetPlugins\", \"Not Yet: Plugins\"),\n\t\t\t\t\t\t{},\n\t\t\t\t\t\tFSlateIcon(FDialogueStyle::GetStyleSetName(), FDialogueStyle::PROPERTY_NotYetLogoIcon)\n\t\t\t\t\t);\n\t\t\t\t\tToolbarBuilder.AddComboButton(\n\t\t\t\t\t\tFUIAction(),\n\t\t\t\t\t\tFOnGetContent::CreateSP(this, &Self::GenerateExternalURLsMenu),\n\t\t\t\t\t\tLOCTEXT(\"OtherURLs\", \"Other URLs\"),\n\t\t\t\t\t\tLOCTEXT(\"OtherURLs_ToolTip\", \"Other URLs\"),\n\t\t\t\t\t\tFSlateIcon(),\n\t\t\t\t\t\ttrue\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tToolbarBuilder.EndSection();\n\t\t\t})\n\t\t);\n\t\tAddToolbarExtender(ExternalToolbarExtender);\n\t}\n}\n\nTSharedRef<SDockTab> FDialogueEditor::SpawnTab_Details(const FSpawnTabArgs& Args) const\n{\n\tcheck(Args.GetTabId() == DetailsTabID);\n\treturn SNew(SDockTab)\n\t\t// TODO use DialogueEditor.Tabs.Properties\n\t\t.Icon(FEditorStyle::GetBrush(\"GenericEditor.Tabs.Properties\"))\n\t\t.Label(LOCTEXT(\"DialogueDetailsTitle\", \"Details\"))\n\t\t.TabColorScale(GetTabColorScale())\n\t\t[\n\t\t\tDetailsView.ToSharedRef()\n\t\t];\n}\n\nTSharedRef<SDockTab> FDialogueEditor::SpawnTab_GraphCanvas(const FSpawnTabArgs& Args) const\n{\n\tcheck(Args.GetTabId() == GraphCanvasTabID);\n\treturn SNew(SDockTab)\n\t\t.Label(LOCTEXT(\"DialogueGraphCanvasTiele\", \"Viewport\"))\n\t\t[\n\t\t\tGraphEditorView.ToSharedRef()\n\t\t];\n}\n\nTSharedRef<SDockTab> FDialogueEditor::SpawnTab_Palette(const FSpawnTabArgs& Args) const\n{\n\tcheck(Args.GetTabId() == PaletteTabId);\n\treturn SNew(SDockTab)\n\t\t.Icon(FEditorStyle::GetBrush(\"Kismet.Tabs.Palette\"))\n\t\t.Label(LOCTEXT(\"DialoguePaletteTitle\", \"Palette\"))\n\t\t[\n\t\t\tPaletteView.ToSharedRef()\n\t\t];\n}\n\nTSharedRef<SDockTab> FDialogueEditor::SpawnTab_FindInDialogue(const FSpawnTabArgs& Args) const\n{\n\tcheck(Args.GetTabId() == FindInDialogueTabId);\n\treturn SNew(SDockTab)\n\t\t.Icon(FEditorStyle::GetBrush(\"Kismet.Tabs.FindResults\"))\n\t\t.Label(LOCTEXT(\"FindResultsView\", \"Find Results\"))\n\t\t[\n\t\t\tFindResultsView.ToSharedRef()\n\t\t];\n}\n\nvoid FDialogueEditor::OnCommandUndoGraphAction() const\n{\n\tconstexpr bool bCanRedo = true;\n\tif (!GEditor->UndoTransaction(bCanRedo))\n\t{\n\t\tconst FText TransactionName = GEditor->Trans->GetUndoContext(true).Title;\n\t\tUE_LOG(LogDlgSystemEditor, Warning, TEXT(\"Undo Transaction with Name = `%s` failed\"), *TransactionName.ToString());\n\t}\n}\n\nvoid FDialogueEditor::OnCommandRedoGraphAction() const\n{\n\t// Clear selection, to avoid holding refs to nodes that go away\n\tClearViewportSelection();\n\tif (!GEditor->RedoTransaction())\n\t{\n\t\tconst FText TransactionName = GEditor->Trans->GetUndoContext(true).Title;\n\t\tUE_LOG(LogDlgSystemEditor, Warning, TEXT(\"Redo Transaction with Name = `%s` failed\"), *TransactionName.ToString());\n\t}\n}\n\nvoid FDialogueEditor::OnCommandConvertSpeechSequenceNodeToSpeechNodes() const\n{\n\tconst TSet<UObject*> SelectedNodes = GetSelectedNodes();\n\tcheck(SelectedNodes.Num() == 1);\n\tUDialogueGraphNode* SpeechSequence_GraphNode = CastChecked<UDialogueGraphNode>(*FDlgHelper::GetFirstSetElement(SelectedNodes));\n\tcheck(SpeechSequence_GraphNode->IsSpeechSequenceNode());\n\n\tFConvertSpeechSequenceNodeToSpeechNodes_DialogueGraphSchemaAction ConvertAction(SpeechSequence_GraphNode);\n\tConvertAction.PerformAction(DialogueBeingEdited->GetGraph(), nullptr, SpeechSequence_GraphNode->GetPosition(), false);\n}\n\nvoid FDialogueEditor::OnCommandConvertSpeechNodesToSpeechSequence() const\n{\n\tconst TSet<UObject*> SelectedNodes = GetSelectedNodes();\n\tTArray<UDialogueGraphNode*> OutSelectedGraphNodes;\n\tif (!FDialogueEditorUtilities::CanConvertSpeechNodesToSpeechSequence(SelectedNodes, OutSelectedGraphNodes))\n\t{\n\t\treturn;\n\t}\n\n\tUDialogueGraphNode* Speech_GraphNode = CastChecked<UDialogueGraphNode>(OutSelectedGraphNodes[0]);\n\tcheck(Speech_GraphNode->IsSpeechNode());\n\n\tFConvertSpeechNodesToSpeechSequence_DialogueGraphSchemaAction ConvertAction(OutSelectedGraphNodes);\n\tConvertAction.PerformAction(DialogueBeingEdited->GetGraph(), nullptr, Speech_GraphNode->GetPosition(), false);\n}\n\nvoid FDialogueEditor::OnCommandDeleteSelectedNodes() const\n{\n\tconst FScopedTransaction Transaction(LOCTEXT(\"DialogueEditRemoveSelectedNode\", \"Dialogue Editor: Remove Node\"));\n\tverify(DialogueBeingEdited->Modify());\n\n\tconst TSet<UObject*> SelectedNodes = GetSelectedNodes();\n\tUDialogueGraph* DialogueGraph = GetDialogueGraph();\n\tverify(DialogueGraph->Modify());\n\n\t// Keep track of all the node types removed\n\tint32 NumNodesRemoved = 0;\n\tint32 NumDialogueNodesRemoved = 0;\n\tint32 NumBaseDialogueNodesRemoved = 0;\n\tint32 NumEdgeDialogueNodesRemoved = 0;\n\n#if DO_CHECK\n\tconst int32 Initial_DialogueNodesNum = DialogueBeingEdited->GetNodes().Num();\n\tconst int32 Initial_GraphNodesNum = DialogueGraph->Nodes.Num();\n\tconst int32 Initial_GraphDialogueNodesNum = DialogueGraph->GetAllDialogueGraphNodes().Num();\n\tconst int32 Initial_GraphBaseDialogueNodesNum = DialogueGraph->GetAllBaseDialogueGraphNodes().Num();\n\tconst int32 Initial_GraphEdgeDialogueNodesNum = DialogueGraph->GetAllEdgeDialogueGraphNodes().Num();\n#endif\n\n\t// Unselect nodes we are about to delete\n\tClearViewportSelection();\n\n\t// Disable compiling for optimization\n\tDialogueBeingEdited->DisableCompileDialogue();\n\n\t// Helper function to also count the number of removed nodes\n\tauto RemoveGraphNode = [&NumNodesRemoved](UEdGraphNode* NodeToRemove)\n\t{\n\t\tverify(FDialogueEditorUtilities::RemoveNode(NodeToRemove));\n\t\tNumNodesRemoved++;\n\t};\n\n\t// Keep track of all the removed edges so that we do not attempt double removal\n\tTSet<UDialogueGraphNode_Edge*> RemovedEdges;\n\tauto AddToRemovedEdges = [&RemovedEdges, &NumBaseDialogueNodesRemoved, &NumEdgeDialogueNodesRemoved](UDialogueGraphNode_Edge* NodeEdge)\n\t{\n\t\tRemovedEdges.Add(NodeEdge);\n\t\tNumBaseDialogueNodesRemoved++;\n\t\tNumEdgeDialogueNodesRemoved++;\n\t};\n\n\tauto RemoveGraphEdgeNode = [&RemovedEdges, &RemoveGraphNode, &AddToRemovedEdges](UDialogueGraphNode_Edge* Edge)\n\t{\n\t\tif (!RemovedEdges.Contains(Edge))\n\t\t{\n\t\t\tRemoveGraphNode(Edge);\n\t\t\tAddToRemovedEdges(Edge);\n\t\t}\n\t};\n\n\n\tfor (UObject* NodeObject : SelectedNodes)\n\t{\n\t\tUEdGraphNode* SelectedNode = CastChecked<UEdGraphNode>(NodeObject);\n\t\tif (!SelectedNode->CanUserDeleteNode())\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Base Node type\n\t\tif (UDialogueGraphNode_Base* NodeBase = Cast<UDialogueGraphNode_Base>(SelectedNode))\n\t\t{\n\t\t\tif (UDialogueGraphNode* Node = Cast<UDialogueGraphNode>(NodeBase))\n\t\t\t{\n\t\t\t\t// Remove the parent/child edges\n\t\t\t\tfor (UDialogueGraphNode_Edge* ParentNodeEdge : Node->GetParentEdgeNodes())\n\t\t\t\t{\n\t\t\t\t\tRemoveGraphEdgeNode(ParentNodeEdge);\n\t\t\t\t}\n\n\t\t\t\tfor (UDialogueGraphNode_Edge* ChildNodeEdge : Node->GetChildEdgeNodes())\n\t\t\t\t{\n\t\t\t\t\tRemoveGraphEdgeNode(ChildNodeEdge);\n\t\t\t\t}\n\n\t\t\t\t// Remove the Node\n\t\t\t\t// No need to recompile as the the break node links step will do that for us\n\t\t\t\tRemoveGraphNode(Node);\n\t\t\t\tNumBaseDialogueNodesRemoved++;\n\t\t\t\tNumDialogueNodesRemoved++;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t// Edge type\n\t\t\t\tUDialogueGraphNode_Edge* NodeEdge = CastChecked<UDialogueGraphNode_Edge>(NodeBase);\n\t\t\t\tRemoveGraphEdgeNode(NodeEdge);\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// Most likely it is a comment\n\t\t\tRemoveGraphNode(SelectedNode);\n\t\t}\n\t}\n\n\tDialogueBeingEdited->EnableCompileDialogue();\n\tif (NumBaseDialogueNodesRemoved > 0)\n\t{\n\t\tDialogueBeingEdited->CompileDialogueNodesFromGraphNodes();\n\t\tDialogueBeingEdited->PostEditChange();\n\t\tDialogueBeingEdited->MarkPackageDirty();\n\t\tRefreshViewport();\n\t}\n\n#if DO_CHECK\n\t// Check if we removed as we counted\n\tcheck(Initial_DialogueNodesNum - NumDialogueNodesRemoved == DialogueBeingEdited->GetNodes().Num());\n\tcheck(Initial_GraphNodesNum - NumNodesRemoved == DialogueGraph->Nodes.Num());\n\tcheck(Initial_GraphDialogueNodesNum - NumDialogueNodesRemoved == DialogueGraph->GetAllDialogueGraphNodes().Num());\n\tcheck(Initial_GraphBaseDialogueNodesNum - NumBaseDialogueNodesRemoved == DialogueGraph->GetAllBaseDialogueGraphNodes().Num());\n\tcheck(Initial_GraphEdgeDialogueNodesNum - NumEdgeDialogueNodesRemoved == DialogueGraph->GetAllEdgeDialogueGraphNodes().Num());\n\tcheck(NumEdgeDialogueNodesRemoved == RemovedEdges.Num());\n#endif\n}\n\nbool FDialogueEditor::CanDeleteNodes() const\n{\n\tconst TSet<UObject*>& SelectedNodes = GetSelectedNodes();\n\t// Return false if only root node is selected, as it can't be deleted\n\tif (SelectedNodes.Num() == 1)\n\t{\n\t\tconst UObject* SelectedNode = *FDlgHelper::GetFirstSetElement(SelectedNodes);\n\t\treturn !SelectedNode->IsA(UDialogueGraphNode_Root::StaticClass());\n\t}\n\n\treturn SelectedNodes.Num() > 0;\n}\n\nvoid FDialogueEditor::OnCommandCopySelectedNodes() const\n{\n\t// Export the selected nodes and place the text on the clipboard\n\tconst TSet<UObject*>& SelectedNodes = GetSelectedNodes();\n\tfor (UObject* Object : SelectedNodes)\n\t{\n\t\tif (UEdGraphNode* Node = Cast<UEdGraphNode>(Object))\n\t\t{\n\t\t\tNode->PrepareForCopying();\n\t\t}\n\t}\n\n\t// Copy to clipboard\n\tFString ExportedText;\n\tFEdGraphUtilities::ExportNodesToText(SelectedNodes, /*out*/ ExportedText);\n\tFPlatformApplicationMisc::ClipboardCopy(*ExportedText);\n\n\tfor (UObject* Object : SelectedNodes)\n\t{\n\t\tif (UDialogueGraphNode_Base* Node = Cast<UDialogueGraphNode_Base>(Object))\n\t\t{\n\t\t\tNode->PostCopyNode();\n\t\t}\n\t}\n}\n\nbool FDialogueEditor::CanCopyNodes() const\n{\n\t// If any of the nodes can be duplicated then we should allow copying\n\tfor (UObject* Object : GetSelectedNodes())\n\t{\n\t\tUEdGraphNode* Node = Cast<UEdGraphNode>(Object);\n\t\tif (Node && Node->CanDuplicateNode())\n\t\t{\n\t\t\treturn true;\n\t\t}\n\t}\n\n\treturn false;\n}\n\nvoid FDialogueEditor::OnCommandPasteNodes()\n{\n\tPasteNodesHere(GraphEditorView->GetPasteLocation());\n}\n\nvoid FDialogueEditor::PasteNodesHere(const FVector2D& Location)\n{\n\t// Undo/Redo support\n\tconst FScopedTransaction Transaction(FGenericCommands::Get().Paste->GetDescription());\n\tUDialogueGraph* DialogueGraph = GetDialogueGraph();\n\tverify(DialogueBeingEdited->Modify());\n\tverify(DialogueGraph->Modify());\n\n\t// Clear the selection set (newly pasted stuff will be selected)\n\tClearViewportSelection();\n\n\t// Disable compiling for optimization\n\tDialogueBeingEdited->DisableCompileDialogue();\n\n\t// Grab the text to paste from the clipboard.\n\tFString TextToImport;\n\tFPlatformApplicationMisc::ClipboardPaste(TextToImport);\n\n\t// Import the nodes\n\tTSet<UEdGraphNode*> PastedNodes;\n\tFEdGraphUtilities::ImportNodesFromText(DialogueGraph, TextToImport, /*out*/ PastedNodes);\n\n\t// Step 1. Calculate average position\n\t// Average position of nodes so we can move them while still maintaining relative distances to each other\n\tFVector2D AvgNodePosition(0.0f, 0.0f);\n\tfor (UEdGraphNode* Node : PastedNodes)\n\t{\n\t\tAvgNodePosition.X += Node->NodePosX;\n\t\tAvgNodePosition.Y += Node->NodePosY;\n\t}\n\tif (PastedNodes.Num() > 0)\n\t{\n\t\tconst float InvNumNodes = 1.0f / float(PastedNodes.Num());\n\t\tAvgNodePosition.X *= InvNumNodes;\n\t\tAvgNodePosition.Y *= InvNumNodes;\n\t}\n\n\t// maps from old index -> new index\n\t// Used to remap node edges (FDlgEdge) and checking if some TargetIndex edges are still valid\n\tTMap<int32, int32> OldToNewIndexMap;\n\tTArray<UDialogueGraphNode*> GraphNodes;\n\n\t// Step 2. Filter Dialogue nodes and position all valid nodes\n\tfor (UEdGraphNode* Node : PastedNodes)\n\t{\n\t\tbool bAddToSelection = true;\n\t\tbool bPositionNode = true;\n\n\n\t\tif (auto* GraphNode = Cast<UDialogueGraphNode>(Node))\n\t\t{\n\t\t\t// Add to the dialogue\n\t\t\tconst int32 OldNodeIndex = GraphNode->GetDialogueNodeIndex();\n\t\t\tconst int32 NewNodeIndex = DialogueBeingEdited->AddNode(GraphNode->GetMutableDialogueNode());\n\t\t\tGraphNode->SetDialogueNodeIndex(NewNodeIndex);\n\n\t\t\tOldToNewIndexMap.Add(OldNodeIndex, NewNodeIndex);\n\t\t\tGraphNodes.Add(GraphNode);\n\t\t}\n\t\telse if (UDialogueGraphNode_Edge* Edge = Cast<UDialogueGraphNode_Edge>(Node))\n\t\t{\n\t\t\tbPositionNode = false;\n\t\t\tbAddToSelection = Edge->HasParentNode() && Edge->HasChildNode();\n\t\t}\n\n\t\t// Select the newly pasted stuff\n\t\tif (bAddToSelection)\n\t\t{\n\t\t\tGraphEditorView->SetNodeSelection(Node, true);\n\t\t}\n\n\t\tif (bPositionNode)\n\t\t{\n\t\t\tconst float NodePosX = (Node->NodePosX - AvgNodePosition.X) + Location.X;\n\t\t\tconst float NodePosY = (Node->NodePosY - AvgNodePosition.Y) + Location.Y;\n\n\t\t\tif (auto* GraphNodeBase = Cast<UDialogueGraphNode_Base>(Node))\n\t\t\t{\n\t\t\t\tGraphNodeBase->SetPosition(NodePosX, NodePosY);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tNode->NodePosX = NodePosX;\n\t\t\t\tNode->NodePosY = NodePosY;\n\t\t\t}\n\t\t}\n\n\t\t// Assign new ID\n\t\tNode->CreateNewGuid();\n\t}\n\n\t// Step 3. Fix Edges and references of Dialogue/Graph nodes\n\t// TODO this is similar to what the compiler does, maybe the compiler is too strict? It should not care what the Dialogues have?\n\tfor (UDialogueGraphNode* GraphNode : GraphNodes)\n\t{\n\t\tUDlgNode* DialogueNode = GraphNode->GetMutableDialogueNode();\n\n\t\tconst TArray<UDialogueGraphNode_Edge*> GraphNodeChildrenEdges = GraphNode->GetChildEdgeNodes();\n\t\tconst int32 GraphNodeChildrenEdgesNum = GraphNodeChildrenEdges.Num();\n\t\tif (GraphNodeChildrenEdgesNum == 0)\n\t\t{\n\t\t\t// There are no links copied, delete the edges from the Dialogue Node.\n\t\t\tDialogueNode->SetNodeChildren({});\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// Fix the dialogue edges\n\t\t\t// Remove node edges to target indicies that were not copied (that do not exist)\n\t\t\tconst TArray<FDlgEdge>& OldNodeEdges = DialogueNode->GetNodeChildren();\n\t\t\tTArray<FDlgEdge> NewNodeEdges;\n\t\t\tfor (const FDlgEdge& OldEdge : OldNodeEdges)\n\t\t\t{\n\t\t\t\t// Node was copied over\n\t\t\t\tif (OldToNewIndexMap.Find(OldEdge.TargetIndex) != nullptr)\n\t\t\t\t{\n\t\t\t\t\tNewNodeEdges.Add(OldEdge);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tDialogueNode->SetNodeChildren(NewNodeEdges);\n\n\t\t\t// Fix graph edges\n\t\t\t// Remap old indices\n\t\t\tfor (int32 ChildIndex = 0; ChildIndex < GraphNodeChildrenEdgesNum; ChildIndex++)\n\t\t\t{\n\t\t\t\tUDialogueGraphNode_Edge* ChildEdge = GraphNodeChildrenEdges[ChildIndex];\n\t\t\t\tconst int32 OldNodeIndex = ChildEdge->GetDialogueEdge().TargetIndex;\n\t\t\t\tconst int32 NewNodeIndex = OldToNewIndexMap.FindChecked(OldNodeIndex);\n\t\t\t\tGraphNode->SetEdgeTargetIndexAt(ChildIndex, NewNodeIndex);\n\t\t\t}\n\t\t}\n\t}\n\n\t// First fix weak references\n\tFDialogueEditorUtilities::RemapOldIndicesWithNewAndUpdateGUID(GraphNodes, OldToNewIndexMap);\n\n\t// Compile\n\tCheckAll();\n\tDialogueBeingEdited->EnableCompileDialogue();\n\tDialogueBeingEdited->CompileDialogueNodesFromGraphNodes();\n\n\t// Notify objects of change\n\tRefreshViewport();\n\tDialogueBeingEdited->PostEditChange();\n\tDialogueBeingEdited->MarkPackageDirty();\n}\n\nbool FDialogueEditor::CanPasteNodes() const\n{\n\tFString ClipboardContent;\n\tFPlatformApplicationMisc::ClipboardPaste(ClipboardContent);\n\n\treturn FEdGraphUtilities::CanImportNodesFromText(DialogueBeingEdited->GetGraph(), ClipboardContent);\n}\n\nvoid FDialogueEditor::OnCommandHideSelectedNodes()\n{\n\tconst TSet<UObject*>& SelectedNodes = GetSelectedNodes();\n\tfor (UObject* Object : SelectedNodes)\n\t{\n\t\tif (UDialogueGraphNode* GraphNode = Cast<UDialogueGraphNode>(Object))\n\t\t{\n\t\t\tif (!GraphNode->IsRootNode())\n\t\t\t{\n\t\t\t\tGraphNode->SetForceHideNode(true);\n\t\t\t}\n\t\t}\n\t}\n}\n\nvoid FDialogueEditor::OnCommandUnHideAllNodes()\n{\n\tUDialogueGraph* Graph = GetDialogueGraph();\n\tfor (UDialogueGraphNode* GraphNode : Graph->GetAllDialogueGraphNodes())\n\t{\n\t\tGraphNode->SetForceHideNode(false);\n\t}\n}\n\nvoid FDialogueEditor::OnCommandDialogueReload() const\n{\n\t// Ignore\n\tif (GetSettings().DialogueTextFormat == EDlgDialogueTextFormat::None)\n\t{\n\t\treturn;\n\t}\n\n\tcheck(DialogueBeingEdited);\n\tconst EAppReturnType::Type Response = FPlatformMisc::MessageBoxExt(EAppMsgType::YesNo,\n\t\tTEXT(\"You are about to overwrite your data in the editor with the data from the text file(.dlg)\"),\n\t\tTEXT(\"Overwrite graph/dialogue data from text file?\"));\n\tif (Response == EAppReturnType::No)\n\t{\n\t\treturn;\n\t}\n\n\t//const FScopedTransaction Transaction(LOCTEXT(\"DialogueEditorReloadFromFile\", \"Dialogue Editor: Reload from file\"));\n\n\t// Opposite of this steps are in the SaveAsset_Execute\n\t// Reload data, text file -> dialogue data\n\tDialogueBeingEdited->ImportFromFile();\n\n\t// Update graph, dialogue data -> graph\n\tDialogueBeingEdited->ClearGraph(); // triggers create default graph nodes\n\tDialogueBeingEdited->MarkPackageDirty();\n}\n\nvoid FDialogueEditor::OnSelectedNodesChanged(const TSet<UObject*>& NewSelection)\n{\n\tTArray<UObject*> ViewSelection;\n\n\tPreviousSelectedNodeObjects.Empty();\n\tif (NewSelection.Num())\n\t{\n\t\tfor (UObject* Selected : NewSelection)\n\t\t{\n\t\t\tPreviousSelectedNodeObjects.Add(Selected);\n\t\t\tViewSelection.Add(Selected);\n\t\t}\n\t}\n\telse\n\t{\n\t\t// Nothing selected, view the properties of this Dialogue.\n\t\tViewSelection.Add(DialogueBeingEdited);\n\t}\n\n\t// View the selected objects\n\tif (DetailsView.IsValid())\n\t{\n\t\tDetailsView->SetObjects(ViewSelection, /*bForceRefresh=*/ true);\n\t}\n}\n\nFActionMenuContent FDialogueEditor::OnCreateGraphActionMenu(UEdGraph* InGraph, const FVector2D& InNodePosition,\n\tconst TArray<UEdGraphPin*>& InDraggedPins, bool bAutoExpand, SGraphEditor::FActionMenuClosed InOnMenuClosed)\n{\n\tconst TSharedRef<SDialogueActionMenu> ActionMenu = SNew(SDialogueActionMenu)\n\t\t.Graph(InGraph)\n\t\t.NewNodePosition(InNodePosition)\n\t\t.DraggedFromPins(InDraggedPins)\n\t\t.AutoExpandActionMenu(bAutoExpand)\n\t\t.OnClosedCallback(InOnMenuClosed)\n\t\t.OnCloseReason(this, &Self::OnGraphActionMenuClosed);\n\n\treturn FActionMenuContent(ActionMenu, ActionMenu->GetFilterTextBox());\n}\n\nvoid FDialogueEditor::OnGraphActionMenuClosed(bool bActionExecuted, bool bGraphPinContext)\n{\n\tif (!bActionExecuted)\n\t{\n\t\t// reset previous drag and drop saved edges.\n\t\tLastTargetGraphEdgeBeforeDrag = nullptr;\n\t}\n}\n\nvoid FDialogueEditor::OnNodeTitleCommitted(const FText& NewText, ETextCommit::Type CommitInfo, UEdGraphNode* NodeBeingChanged) const\n{\n\tif (!IsValid(NodeBeingChanged))\n\t{\n\t\treturn;\n\t}\n\n\t// Rename the node to the new set text.\n\tconst FScopedTransaction Transaction(LOCTEXT(\"RenameNode\", \"Dialogue Editor: Rename Node\"));\n\tverify(NodeBeingChanged->Modify());\n\tNodeBeingChanged->OnRenameNode(NewText.ToString());\n}\n// End of own functions\n//////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n#undef LOCTEXT_NAMESPACE\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystemEditor/Private/DialogueEditor/DialogueEditor.h",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#pragma once\n\n#include \"GraphEditor.h\"\n#include \"EditorUndoClient.h\"\n#include \"Toolkits/AssetEditorToolkit.h\"\n#include \"IDetailsView.h\"\n#include \"Misc/NotifyHook.h\"\n\n#include \"DialogueEditor/Graph/DialogueGraph.h\"\n#include \"DialogueEditor/IDialogueEditor.h\"\n#include \"DialogueEditorUtilities.h\"\n#include \"DlgDialogue.h\"\n#include \"DlgSystemSettings.h\"\n#include \"NYReflectionTypes.h\"\n\nclass IDetailsView;\nclass UDlgDialogue;\nclass SDialoguePalette;\nclass SFindInDialogues;\nclass FTabManager;\n\n//////////////////////////////////////////////////////////////////////////\n// FDialogueEditor\nclass FDialogueEditor : public IDialogueEditor, public FGCObject, public FNotifyHook, public FEditorUndoClient\n{\n\ttypedef FDialogueEditor Self;\n\npublic:\n\tSLATE_BEGIN_ARGS(Self) {}\n\tSLATE_END_ARGS()\n\n\tFDialogueEditor();\n\tvirtual ~FDialogueEditor();\n\n\t//\n\t// IToolkit interface\n\t//\n\n\tvoid RegisterTabSpawners(const TSharedRef<FTabManager>& TabManager) override;\n\tvoid UnregisterTabSpawners(const TSharedRef<FTabManager>& TabManager) override;\n\tFText GetBaseToolkitName() const override;\n\tFText GetToolkitName() const override;\n\tFName GetToolkitFName() const override { return FName(TEXT(\"DialogueEditor\")); }\n\tFText GetToolkitToolTipText() const override { return GetToolTipTextForObject(Cast<UObject>(DialogueBeingEdited)); }\n\tFLinearColor GetWorldCentricTabColorScale() const override { return FLinearColor::White; }\n\tFString GetWorldCentricTabPrefix() const override { return FString(TEXT(\"DialogueEditor\")); }\n\n\t//\n\t// FAssetEditorToolkit interface\n\t//\n\n\t/** @return the documentation location for this editor */\n\tFString GetDocumentationLink() const override { return FString(TEXT(\"Plugins/DlgSystem/DialogueEditor\")); }\n\n\tbool CanSaveAsset() const override { return true; }\n\tbool CanSaveAssetAs() const override { return true; }\n\tvoid SaveAsset_Execute() override;\n\tvoid SaveAssetAs_Execute() override;\n\n\t//\n\t// IAssetEditorInstance interface\n\t//\n\n\tvoid FocusWindow(UObject* ObjectToFocusOn = nullptr) override;\n\n\t//\n\t// FEditorUndoClient interface\n\t//\n\n\t// Signal that client should run any PostUndo code\n\t// @param bSuccess\tIf true than undo succeeded, false if undo failed\n\tvoid PostUndo(bool bSuccess) override;\n\n\t// Signal that client should run any PostRedo code\n\t// @param bSuccess\tIf true than redo succeeded, false if redo failed\n\tvoid PostRedo(bool bSuccess) override;\n\n\t//\n\t// FSerializableObject interface, FGCObject\n\t//\n\n\tvoid AddReferencedObjects(FReferenceCollector& Collector) override\n\t{\n\t\tCollector.AddReferencedObject(DialogueBeingEdited);\n\t}\n\n\t//\n\t// IDialogueEditor interface\n\t//\n\n\t// Get the currently selected set of nodes\n\tTSet<UObject*> GetSelectedNodes() const override\n\t{\n\t\tcheck(GraphEditorView.IsValid());\n\t\treturn GraphEditorView->GetSelectedNodes();\n\t}\n\n\t/**\n\t * Get the bounding area for the currently selected nodes\n\t *\n\t * @param Rect Final output bounding area, including padding\n\t * @param Padding An amount of padding to add to all sides of the bounds\n\t *\n\t * @return false if nothing is selected\n\t */\n\tbool GetBoundsForSelectedNodes(class FSlateRect& Rect, float Padding) const override\n\t{\n\t\treturn GraphEditorView->GetBoundsForSelectedNodes(Rect, Padding);\n\t}\n\n\t// Clears the viewport selection set\n\tvoid ClearViewportSelection() const\n\t{\n\t\tif (GraphEditorView.IsValid())\n\t\t{\n\t\t\tGraphEditorView->ClearSelectionSet();\n\t\t}\n\t}\n\n\t// Refreshes the graph viewport.\n\tvoid RefreshViewport() const\n\t{\n\t\tif (GraphEditorView.IsValid())\n\t\t{\n\t\t\tGraphEditorView->NotifyGraphChanged();\n\t\t}\n\t}\n\n\t// Refreshes the details panel with the Dialogue\n\tvoid RefreshDetailsView(bool bRestorePreviousSelection) override;\n\tvoid Refresh(bool bRestorePreviousSelection) override;\n\tvoid JumpToObject(const UObject* Object) override;\n\n\t//\n\t// Own methods\n\t//\n\n\t// Summons The Search UI\n\tvoid SummonSearchUI(bool bSetFindWithinDialogue, FString NewSearchTerms = FString(), bool bSelectFirstResult = false);\n\n\t// Edits the specified Dialogue. This is called from the TypeActions object.\n\tvoid InitDialogueEditor(\n\t\tEToolkitMode::Type Mode,\n\t\tconst TSharedPtr<IToolkitHost>& InitToolkitHost,\n\t\tUDlgDialogue* InitDialogue\n\t);\n\n\t// Helper method to get directly the Dialogue Graph\n\tUDialogueGraph* GetDialogueGraph() const { return CastChecked<UDialogueGraph>(DialogueBeingEdited->GetGraph()); }\n\n\t// Performs checks on all the nodes in the Dialogue\n\tvoid CheckAll() const;\n\n\t// Gets/Sets the dialogue being edited\n\tUDlgDialogue* GetDialogueBeingEdited()\n\t{\n\t\tcheck(DialogueBeingEdited);\n\t\treturn DialogueBeingEdited;\n\t}\n\tvoid SetDialogueBeingEdited(UDlgDialogue* NewDialogue);\n\n\t// Used only on drag/drop operations of edges.\n\tUDialogueGraphNode_Edge* GetLastTargetGraphEdgeBeforeDrag() const override { return LastTargetGraphEdgeBeforeDrag; }\n\tvoid SetLastTargetGraphEdgeBeforeDrag(UDialogueGraphNode_Edge* InEdge) override { LastTargetGraphEdgeBeforeDrag = InEdge; }\n\nprivate:\n\t//\n\t// FNotifyHook interface\n\t//\n\tvoid NotifyPostChange(const FPropertyChangedEvent& PropertyChangedEvent, FNYProperty* PropertyThatChanged) override;\n\n\t//\n\t// Own methods\n\t//\n\n\t// Creates all internal widgets for the tabs to point at\n\tvoid CreateInternalWidgets();\n\n\t// Create new graph editor widget\n\tTSharedRef<SGraphEditor> CreateGraphEditorWidget();\n\n\t// Bind the commands from the editor. See GraphEditorCommands for more details.\n\tvoid BindEditorCommands();\n\n\t// Generates the submenu fo the primary/secondary button\n\tTSharedRef<SWidget> GeneratePrimarySecondaryEdgesMenu() const;\n\tTSharedRef<SWidget> GenerateExternalURLsMenu() const;\n\n\t// Extend the Menus of the editor\n\tvoid ExtendMenu();\n\n\t// Extends the Top Toolbar\n\tvoid ExtendToolbar();\n\n\t//\n\t// Functions to spawn each tab type.\n\t//\n\n\t// Spawn the details tab where we can see the internal structure of the dialogue.\n\tTSharedRef<SDockTab> SpawnTab_Details(const FSpawnTabArgs& Args) const;\n\n\t// Spawn the main graph canvas where all the nodes live. */\n\tTSharedRef<SDockTab> SpawnTab_GraphCanvas(const FSpawnTabArgs& Args) const;\n\n\t// Spawn the pallete tab view where you can see all the nodes available for the graph.\n\tTSharedRef<SDockTab> SpawnTab_Palette(const FSpawnTabArgs& Args) const;\n\n\t// Spawn the find in Dialogue tab view.\n\tTSharedRef<SDockTab> SpawnTab_FindInDialogue(const FSpawnTabArgs& Args) const;\n\n\t//\n\t// Graph editor commands\n\t//\n\n\t// Called to undo the last action\n\tvoid OnCommandUndoGraphAction() const;\n\n\t// Called to redo the last undone action\n\tvoid OnCommandRedoGraphAction() const;\n\n\t//\n\t// Edit Node commands\n\t//\n\n\t// Converts a speech sequence node to a list of speech node.\n\tvoid OnCommandConvertSpeechSequenceNodeToSpeechNodes() const;\n\n\t// Converts a list of speech nodes to a speech sequence node\n\tvoid OnCommandConvertSpeechNodesToSpeechSequence() const;\n\n\t// Remove the currently selected nodes from editor view\n\tvoid OnCommandDeleteSelectedNodes() const;\n\n\t// Whether we are able to remove the currently selected nodes\n\tbool CanDeleteNodes() const;\n\n\t// Copy the currently selected nodes to the text buffer.\n\tvoid OnCommandCopySelectedNodes() const;\n\n\t// Whether we are able to copy the currently selected nodes.\n\tbool CanCopyNodes() const;\n\n\t// Paste the nodes at the current location\n\tvoid OnCommandPasteNodes();\n\n\t// Paste the nodes at the specified Location.\n\tvoid PasteNodesHere(const FVector2D& Location);\n\n\t// Whether we are able to paste from the clipboard\n\tbool CanPasteNodes() const;\n\n\t// Hide the selected nodes.\n\tvoid OnCommandHideSelectedNodes();\n\n\t// Unhide all nodes.\n\tvoid OnCommandUnHideAllNodes();\n\n\t//\n\t// Toolbar commands\n\t//\n\n\t// Reloads the Dialogue from the file\n\tvoid OnCommandDialogueReload() const;\n\n\t//\n\t// Graph events\n\t//\n\n\t// Called when the selection changes in the GraphEditor\n\tvoid OnSelectedNodesChanged(const TSet<UObject*>& NewSelection);\n\n\t// Called to create context menu when right-clicking on graph\n\tFActionMenuContent OnCreateGraphActionMenu(UEdGraph* InGraph,\n\t\tconst FVector2D& InNodePosition,\n\t\tconst TArray<UEdGraphPin*>& InDraggedPins,\n\t\tbool bAutoExpand,\n\t\tSGraphEditor::FActionMenuClosed InOnMenuClosed);\n\n\t// Called from graph context menus when they close to tell the editor why they closed\n\tvoid OnGraphActionMenuClosed(bool bActionExecuted, bool bGraphPinContext);\n\n\t/**\n\t * Called when a node's title is committed for a rename\n\t *\n\t * @param\tNewText\t\t\t\tNew title text\n\t * @param\tCommitInfo\t\t\tHow text was committed\n\t * @param\tNodeBeingChanged\tThe node being changed\n\t */\n\tvoid OnNodeTitleCommitted(const FText& NewText, ETextCommit::Type CommitInfo, UEdGraphNode* NodeBeingChanged) const;\n\n\t/** Called when the preview text changes */\n//\tvoid OnPreviewTextChanged(const FString& Text);\n//\n//\t/** Called when the selection changes in the GraphEditor */\n//\tvoid OnSelectedNodesChanged(const TSet<class UObject*>& NewSelection);\n\n\tconst UDlgSystemSettings& GetSettings() const { return *Settings; }\n\nprivate:\n\t// The dialogue we are currently editing\n\tUDlgDialogue* DialogueBeingEdited;\n\n\t// The dialogue system settings\n\tUDlgSystemSettings* Settings = nullptr;\n\n\t// Graph Editor\n\tTSharedPtr<SGraphEditor> GraphEditorView;\n\n\t// The custom details view used\n\tTSharedPtr<IDetailsView> DetailsView;\n\n\t// Palette view of dialogue nodes types\n\tTSharedPtr<SDialoguePalette> PaletteView;\n\n\t/** Find results log as well as the search filter */\n\tTSharedPtr<SFindInDialogues> FindResultsView;\n\n\t// Command list for this editor. Synced with FDlgEditorCommands. Aka list of shortcuts supported.\n\tTSharedPtr<FUICommandList> GraphEditorCommands;\n\n\t/** Keep the reference to the target Node Edge before dragging. Only set on output pins from UDialogueGraphNode. */\n\tUDialogueGraphNode_Edge* LastTargetGraphEdgeBeforeDrag = nullptr;\n\n\t// Keep track of the previous selected objects so that we can reverse selection\n\tTArray<TWeakObjectPtr<UObject>> PreviousSelectedNodeObjects;\n\n\t/**\tThe tab ids for all the tabs used */\n\tstatic const FName DetailsTabID;\n\tstatic const FName GraphCanvasTabID;\n\tstatic const FName PaletteTabId;\n\tstatic const FName FindInDialogueTabId;\n};\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystemEditor/Private/DialogueEditor/Graph/DialogueGraph.cpp",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#include \"DialogueGraph.h\"\n\n#include \"GraphEditAction.h\"\n\n#include \"DlgDialogue.h\"\n#include \"DialogueGraphSchema.h\"\n#include \"DialogueEditor/Nodes/DialogueGraphNode_Root.h\"\n#include \"DialogueEditor/Nodes/DialogueGraphNode.h\"\n#include \"DialogueEditor/Nodes/DialogueGraphNode_Edge.h\"\n#include \"DialogueEditor/DialogueCompiler.h\"\n#include \"DlgDialogueEditorAccess.h\"\n\nUDialogueGraph::UDialogueGraph(const FObjectInitializer& ObjectInitializer)\n\t: Super(ObjectInitializer)\n{\n\t// Set the static editor module interface used by all the dialogues in the DlgSystem module to communicate with the editor.\n\tif (!UDlgDialogue::GetDialogueEditorAccess().IsValid())\n\t{\n\t\tUDlgDialogue::SetDialogueEditorAccess(TSharedPtr<IDlgDialogueEditorAccess>(new FDlgDialogueEditorAccess));\n\t}\n}\n\nbool UDialogueGraph::Modify(bool bAlwaysMarkDirty)\n{\n\tif (!CanModify())\n\t{\n\t\treturn false;\n\t}\n\n\tbool bWasSaved = Super::Modify(bAlwaysMarkDirty);\n\t// Transactions do not support arrays?\n\t// See https://answers.unrealengine.com/questions/674286/how-to-undoredo-a-modification-to-an-array.html?sort=oldest\n\t// TODO check out why it does not save the arrays, because it uses the standard serializer that also writes to .uasset\n\n\t// Mark all nodes for modification\n\t// question of space (save them all here) or recompile them after every undo\n\tfor (UDialogueGraphNode_Base* BaseNode : GetAllBaseDialogueGraphNodes())\n\t{\n\t\tbWasSaved = bWasSaved && BaseNode->Modify(bAlwaysMarkDirty);\n\t}\n\n\treturn bWasSaved;\n}\n\nUDialogueGraphNode_Root* UDialogueGraph::GetRootGraphNode() const\n{\n\tTArray<UDialogueGraphNode_Root*> RootNodeList;\n\tGetNodesOfClass<UDialogueGraphNode_Root>(/*out*/ RootNodeList);\n\tcheck(RootNodeList.Num() == 1);\n\treturn RootNodeList[0];\n}\n\nTArray<UDialogueGraphNode_Base*> UDialogueGraph::GetAllBaseDialogueGraphNodes() const\n{\n\tTArray<UDialogueGraphNode_Base*> AllBaseDialogueGraphNodes;\n\tGetNodesOfClass<UDialogueGraphNode_Base>(/*out*/ AllBaseDialogueGraphNodes);\n\treturn AllBaseDialogueGraphNodes;\n}\n\nTArray<UDialogueGraphNode*> UDialogueGraph::GetAllDialogueGraphNodes() const\n{\n\tTArray<UDialogueGraphNode*> AllDialogueGraphNodes;\n\tGetNodesOfClass<UDialogueGraphNode>(/*out*/ AllDialogueGraphNodes);\n\treturn AllDialogueGraphNodes;\n}\n\nTArray<UDialogueGraphNode_Edge*> UDialogueGraph::GetAllEdgeDialogueGraphNodes() const\n{\n\tTArray<UDialogueGraphNode_Edge*> AllEdgeDialogueGraphNodes;\n\tGetNodesOfClass<UDialogueGraphNode_Edge>(/*out*/ AllEdgeDialogueGraphNodes);\n\treturn AllEdgeDialogueGraphNodes;\n}\n\nbool UDialogueGraph::RemoveGraphNode(UEdGraphNode* NodeToRemove)\n{\n\tModify();\n\tconst int32 NumTimesNodeRemoved = Nodes.Remove(NodeToRemove);\n\n\t// This will trigger the compile in the UDialogueGraphSchema::BreakNodeLinks\n\t// NOTE: do not call BreakAllNodeLinks on the node as it does not register properly with the\n\t// undo system\n\tGetSchema()->BreakNodeLinks(*NodeToRemove);\n\n\t// Notify\n\tFEdGraphEditAction RemovalAction;\n\tRemovalAction.Graph = this;\n\tRemovalAction.Action = GRAPHACTION_RemoveNode;\n\tRemovalAction.Nodes.Add(NodeToRemove);\n\tNotifyGraphChanged(RemovalAction);\n\n\treturn NumTimesNodeRemoved > 0;\n}\n\nvoid UDialogueGraph::CreateGraphNodesFromDialogue()\n{\n\t// Assume empty graph\n\tcheck(Nodes.Num() == 0);\n\tUDlgDialogue* Dialogue = GetDialogue();\n\tFDialogueEditorUtilities::CheckAndTryToFixDialogue(Dialogue, false);\n\n\t// Step 1: Create the root (start) node\n\t{\n\t\tFGraphNodeCreator<UDialogueGraphNode_Root> NodeCreator(*this);\n\t\tUDialogueGraphNode_Root* StartGraphNode = NodeCreator.CreateNode();\n\n\t\t// Create two way direction for both Dialogue Node and Graph Node.\n\t\tUDlgNode* StartNode = Dialogue->GetMutableStartNode();\n\t\tcheck(StartNode);\n\n\t\tStartGraphNode->SetDialogueNode(StartNode);\n\t\tDialogue->SetStartNode(StartNode);\n\n\t\t// Finalize creation\n\t\tStartGraphNode->SetPosition(0, 0);\n\t\tNodeCreator.Finalize();\n\t}\n\n\t// Step 2: Create the Graph Nodes for all the Nodes\n\tconst TArray<UDlgNode*>& DialogueNodes = Dialogue->GetNodes();\n\tconst int32 NodesNum = DialogueNodes.Num();\n\tfor (int32 NodeIndex = 0; NodeIndex < NodesNum; NodeIndex++)\n\t{\n\t\tFGraphNodeCreator<UDialogueGraphNode> NodeCreator(*this);\n\t\tUDialogueGraphNode* GraphNode = NodeCreator.CreateNode();\n\n\t\t// Create two way direction for both Dialogue Node and Graph Node.\n\t\tGraphNode->SetDialogueNodeDataChecked(NodeIndex, DialogueNodes[NodeIndex]);\n\n\t\t// Finalize creation\n\t\tGraphNode->SetPosition(0, 0);\n\t\tNodeCreator.Finalize();\n\t}\n}\n\nvoid UDialogueGraph::LinkGraphNodesFromDialogue() const\n{\n\tUDialogueGraphNode_Root* StartNodeGraph = GetRootGraphNode();\n\tUDlgDialogue* Dialogue = GetDialogue();\n\n\t// Assume we have all the nodes created (plus the start node)\n\tcheck(FDialogueEditorUtilities::AreDialogueNodesInSyncWithGraphNodes(Dialogue));\n\n\tconst UDlgNode& StartNodeDialogue = Dialogue->GetStartNode();\n\tconst TArray<UDlgNode*>& NodesDialogue = Dialogue->GetNodes();\n\t// Step 1. Make the root (start) node connections\n\tLinkGraphNodeToChildren(NodesDialogue, StartNodeDialogue, StartNodeGraph);\n\n\t// Step 2: Create all the connections between the rest of the nodes\n\tfor (UDlgNode* DialogueNode : NodesDialogue)\n\t{\n\t\tLinkGraphNodeToChildren(NodesDialogue, *DialogueNode, CastChecked<UDialogueGraphNode>(DialogueNode->GetGraphNode()));\n\t}\n}\n\nvoid UDialogueGraph::LinkGraphNodeToChildren(\n\tconst TArray<UDlgNode*>& NodesDialogue,\n\tconst UDlgNode& NodeDialogue,\n\tUDialogueGraphNode* GraphNode\n) const\n{\n\t// Assume we are starting from scratch, no output connections\n\tGraphNode->GetOutputPin()->BreakAllPinLinks();\n\n//\tUEdGraphPin* OutputPin = GraphNode->GetOutputPin();\n\tconst TArray<FDlgEdge>& NodeEdges = NodeDialogue.GetNodeChildren();\n\tTSet<int32> NodeSeenEdges;\n\tfor (int32 ChildIndex = 0, ChildNum = NodeEdges.Num(); ChildIndex < ChildNum; ChildIndex++)\n\t{\n\t\tconst int32 TargetIndex = NodeEdges[ChildIndex].TargetIndex;\n\t\t// Ignore invalid edges\n\t\tif (TargetIndex == INDEX_NONE)\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Prevent two edges to the same node.\n\t\tif (NodeSeenEdges.Contains(TargetIndex))\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Get the child node and make sure it has the required number of inputs\n\t\tconst UDlgNode& ChildNode = *NodesDialogue[TargetIndex];\n\t\tUDialogueGraphNode* ChildGraphNode = CastChecked<UDialogueGraphNode>(ChildNode.GetGraphNode());\n\n\t\t// Make connection\n\t\tUDialogueGraphNode_Edge* GraphNode_Edge =\n\t\t\tFDialogueEditorUtilities::SpawnGraphNodeFromTemplate<UDialogueGraphNode_Edge>(\n\t\t\t\tGraphNode->GetGraph(), GraphNode->GetDefaultEdgePosition(), false\n\t\t\t);\n\n\t\t// Create proxy connection from output -> input\n\t\tGraphNode_Edge->CreateConnections(GraphNode, ChildGraphNode);\n\t\tNodeSeenEdges.Add(TargetIndex);\n\t}\n\tGraphNode->CheckAll();\n\tGraphNode->ApplyCompilerWarnings();\n}\n\nvoid UDialogueGraph::AutoPositionGraphNodes() const\n{\n\tstatic constexpr bool bIsDirectionVertical = true;\n\tUDialogueGraphNode_Root* RootNode = GetRootGraphNode();\n\tconst TArray<UDialogueGraphNode*> DialogueGraphNodes = GetAllDialogueGraphNodes();\n\tconst UDlgSystemSettings* Settings = GetDefault<UDlgSystemSettings>();\n\n\t// TODO investigate Node->SnapToGrid\n\tFDialogueEditorUtilities::AutoPositionGraphNodes(\n\t\tRootNode,\n\t\tDialogueGraphNodes,\n\t\tSettings->OffsetBetweenColumnsX,\n\t\tSettings->OffsetBetweenRowsY,\n\t\tbIsDirectionVertical\n\t);\n}\n\nvoid UDialogueGraph::RemoveAllNodes()\n{\n\tModify();\n\n\t// Could have used RemoveNode on each node but that is unecessary as that is slow and notifies external objects\n\tNodes.Empty();\n\tcheck(Nodes.Num() == 0);\n}\n\nconst UDialogueGraphSchema* UDialogueGraph::GetDialogueGraphSchema() const\n{\n\treturn GetDefault<UDialogueGraphSchema>(Schema);\n}\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystemEditor/Private/DialogueEditor/Graph/DialogueGraph.h",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#pragma once\n\n#include \"CoreMinimal.h\"\n#include \"EdGraph/EdGraph.h\"\n\n#include \"DlgDialogue.h\"\n\n#include \"DialogueGraph.generated.h\"\n\nclass UDlgNode;\nclass UDialogueGraphNode_Base;\nclass UDialogueGraphNode;\nclass UDialogueGraphNode_Root;\nclass UDialogueGraphNode_Edge;\nclass UDialogueGraphSchema;\n\nUCLASS()\nclass UDialogueGraph : public UEdGraph\n{\n\tGENERATED_BODY()\n\npublic:\n\t// Begin UObject Interface.\n\t/**\n\t * Note that the object will be modified. If we are currently recording into the\n\t * transaction buffer (undo/redo), save a copy of this object into the buffer and\n\t * marks the package as needing to be saved.\n\t *\n\t * @param\tbAlwaysMarkDirty\tif true, marks the package dirty even if we aren't\n\t *\t\t\t\t\t\t\t\tcurrently recording an active undo/redo transaction\n\t * @return true if the object was saved to the transaction buffer\n\t */\n\tbool Modify(bool bAlwaysMarkDirty = true) override;\n\n\t// Begin UEdGraph\n\t/** Remove a node from this graph. Variant of UEdGraph::RemoveNode */\n\tbool RemoveGraphNode(UEdGraphNode* NodeToRemove);\n\n\t// Begin Own methods\n\t/** Gets the DlgDialogue that contains this graph */\n\tUDlgDialogue* GetDialogue() const\n\t{\n\t\t// Unreal engine magic, get the object that owns this graph, that is our Dialogue.\n\t\treturn CastChecked<UDlgDialogue>(GetOuter());\n\t}\n\n\t/** Gets the root graph node of this graph */\n\tUDialogueGraphNode_Root* GetRootGraphNode() const;\n\n\t/** Gets all the graph nodes of this  Graph */\n\tconst TArray<UEdGraphNode*>& GetAllGraphNodes() const { return Nodes;  }\n\n\t/** Gets the all the dialogue graph nodes (that inherit from UDialogueGraphNode_Base). Includes Root node. */\n\tTArray<UDialogueGraphNode_Base*> GetAllBaseDialogueGraphNodes() const;\n\n\t/** Gets the all the dialogue graph nodes (that inherit from UDialogueGraphNode). Includes Root node. */\n\tTArray<UDialogueGraphNode*> GetAllDialogueGraphNodes() const;\n\n\t/** Gets the all the dialogue graph nodes (that inherit from UDialogueGraphNode_Edge). */\n\tTArray<UDialogueGraphNode_Edge*> GetAllEdgeDialogueGraphNodes() const;\n\n\t/** Creates the graph nodes from the Dialogue that contains this graph */\n\tvoid CreateGraphNodesFromDialogue();\n\n\t/** Creates all the links between the graph nodes from the Dialogue nodes */\n\tvoid LinkGraphNodesFromDialogue() const;\n\n\t/** Automatically reposition all the nodes in the graph. */\n\tvoid AutoPositionGraphNodes() const;\n\n\t/** Remove all nodes from the graph. Without notifying anyone. This operation is atomic to the graph */\n\tvoid RemoveAllNodes();\n\n\t/** Helper method to get directly the Dialogue Graph Schema */\n\tconst UDialogueGraphSchema* GetDialogueGraphSchema() const;\n\nprivate:\n\tUDialogueGraph(const FObjectInitializer& ObjectInitializer);\n\n\t// Link the specified node to all it's children\n\tvoid LinkGraphNodeToChildren(\n\t\tconst TArray<UDlgNode*>& NodesDialogue,\n\t\tconst UDlgNode& NodeDialogue,\n\t\tUDialogueGraphNode* NodeGraph\n\t) const;\n};\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystemEditor/Private/DialogueEditor/Graph/DialogueGraphConnectionDrawingPolicy.cpp",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#include \"DialogueGraphConnectionDrawingPolicy.h\"\n\n#include \"Rendering/DrawElements.h\"\n#include \"Framework/Application/SlateApplication.h\"\n\n#include \"DialogueEditor/Nodes/DialogueGraphNode.h\"\n#include \"DialogueEditor/Nodes/DialogueGraphNode_Edge.h\"\n#include \"DialogueEditor/Nodes/SDialogueGraphNode_Edge.h\"\n\n/////////////////////////////////////////////////////\n// FDialogueGraphConnectionDrawingPolicy\nFDialogueGraphConnectionDrawingPolicy::FDialogueGraphConnectionDrawingPolicy(\n\tint32 InBackLayerID,\n\tint32 InFrontLayerID,\n\tfloat ZoomFactor,\n\tconst FSlateRect& InClippingRect,\n\tFSlateWindowElementList& InDrawElements,\n\tUEdGraph* InGraphObj\n) : Super(InBackLayerID, InFrontLayerID, ZoomFactor, InClippingRect, InDrawElements),\n\tGraph(InGraphObj), DialogueSettings(GetDefault<UDlgSystemSettings>())\n{\n}\n\nvoid FDialogueGraphConnectionDrawingPolicy::DetermineWiringStyle(UEdGraphPin* OutputPin, UEdGraphPin* InputPin,\n\t/*inout*/ FConnectionParams& Params)\n{\n\t// Is the connection bidirectional?\n\tParams.bUserFlag1 = false;\n\tParams.AssociatedPin1 = OutputPin;\n\tParams.AssociatedPin2 = InputPin;\n\tParams.WireThickness = DialogueSettings->WireThickness;\n\tParams.bDrawBubbles = DialogueSettings->bWireDrawBubbles;\n\n\tif (InputPin)\n\t{\n\t\tif (const UDialogueGraphNode_Edge* GraphNode_Edge = Cast<UDialogueGraphNode_Edge>(InputPin->GetOwningNode()))\n\t\t{\n\t\t\tParams.WireColor = GraphNode_Edge->GetEdgeColor(HoveredPins.Contains(InputPin));\n\t\t}\n\t}\n\n\tconst bool bDeemphasizeUnhoveredPins = HoveredPins.Num() > 0;\n\tif (bDeemphasizeUnhoveredPins)\n\t{\n\t\tApplyHoverDeemphasis(OutputPin, InputPin, /*inout*/ Params.WireThickness, /*inout*/ Params.WireColor);\n\t}\n}\n\nvoid FDialogueGraphConnectionDrawingPolicy::DetermineLinkGeometry(\n\tFArrangedChildren& ArrangedNodes,\n\tTSharedRef<SWidget>& OutputPinWidget,\n\tUEdGraphPin* OutputPin,\n\tUEdGraphPin* InputPin,\n\t/*out*/ FArrangedWidget*& StartWidgetGeometry,\n\t/*out*/ FArrangedWidget*& EndWidgetGeometry\n)\n{\n\tif (UDialogueGraphNode_Edge* GraphNode_Edge = Cast<UDialogueGraphNode_Edge>(InputPin->GetOwningNode()))\n\t{\n\t\t// Do not determine anything, this way the links won't be drawn\n\t\tif (!GraphNode_Edge->ShouldDrawEdge())\n\t\t\treturn;\n\n\t\t// Find the actual nodes each edge is connected to, and link to those\n\t\t// From Parent to Child, the Edge is just a proxy\n\t\tUDialogueGraphNode* ParentNode = GraphNode_Edge->GetParentNode();\n\t\tUDialogueGraphNode* ChildNode = GraphNode_Edge->GetChildNode();\n\t\tint32* PrevNodeIndex = NodeWidgetMap.Find(ParentNode);\n\t\tint32* NextNodeIndex = NodeWidgetMap.Find(ChildNode);\n\t\tif (PrevNodeIndex != nullptr && NextNodeIndex != nullptr)\n\t\t{\n\t\t\tStartWidgetGeometry = &(ArrangedNodes[*PrevNodeIndex]);\n\t\t\tEndWidgetGeometry = &(ArrangedNodes[*NextNodeIndex]);\n\t\t}\n\t}\n\telse\n\t{\n\t\tcheckNoEntry();\n\t\t//FConnectionDrawingPolicy::DetermineLinkGeometry(ArrangedNodes, OutputPinWidget, OutputPin, InputPin, StartWidgetGeometry, EndWidgetGeometry);\n\t}\n}\n\nvoid FDialogueGraphConnectionDrawingPolicy::DrawSplineWithArrow(\n\tconst FGeometry& StartGeom,\n\tconst FGeometry& EndGeom,\n\tconst FConnectionParams& Params\n)\n{\n\t// Draw the spline and arrow from/to the closest points between the two geometries (nodes)\n\t// Get a reasonable seed point (halfway between the boxes)\n\tconst FVector2D StartCenter = FGeometryHelper::CenterOf(StartGeom);\n\tconst FVector2D EndCenter = FGeometryHelper::CenterOf(EndGeom);\n\tconst FVector2D SeedPoint = (StartCenter + EndCenter) / 2.0f;\n\n\t// Find the (approximate) closest points between the two boxes\n\tconst FVector2D StartAnchorPoint = FGeometryHelper::FindClosestPointOnGeom(StartGeom, SeedPoint);\n\tconst FVector2D EndAnchorPoint = FGeometryHelper::FindClosestPointOnGeom(EndGeom, SeedPoint);\n\n\tDrawSplineWithArrow(StartAnchorPoint, EndAnchorPoint, Params);\n}\n\nvoid FDialogueGraphConnectionDrawingPolicy::DrawSplineWithArrow(const FVector2D& StartPoint, const FVector2D& EndPoint,\n\tconst FConnectionParams& Params)\n{\n\tInternal_DrawLineWithArrow(StartPoint, EndPoint, Params);\n\t// Is the connection bidirectional?\n\tif (Params.bUserFlag1)\n\t{\n\t\tInternal_DrawLineWithArrow(EndPoint, StartPoint, Params);\n\t}\n}\n\nvoid FDialogueGraphConnectionDrawingPolicy::DrawConnection(\n\tint32 LayerId,\n\tconst FVector2D& Start,\n\tconst FVector2D& End,\n\tconst FConnectionParams& Params\n)\n{\n\t// Code mostly from Super::DrawConnection\n\tconst FVector2D& P0 = Start;\n\tconst FVector2D& P1 = End;\n\n\tconst FVector2D SplineTangent = ComputeSplineTangent(P0, P1);\n\tconst FVector2D P0Tangent = Params.StartDirection == EGPD_Output ? SplineTangent : -SplineTangent;\n\tconst FVector2D P1Tangent = Params.EndDirection == EGPD_Input ? SplineTangent : -SplineTangent;\n\n\tif (Settings->bTreatSplinesLikePins)\n\t{\n\t\t// Distance to consider as an overlap\n\t\tconst float QueryDistanceTriggerThresholdSquared = FMath::Square(Settings->SplineHoverTolerance + Params.WireThickness * 0.5f);\n\n\t\t// Distance to pass the bounding box cull test (may want to expand this later on if we want to do 'closest pin' actions that don't require an exact hit)\n\t\tconst float QueryDistanceToBoundingBoxSquared = QueryDistanceTriggerThresholdSquared;\n\n\t\tbool bCloseToSpline = false;\n\t\t{\n\t\t\t// The curve will include the endpoints but can extend out of a tight bounds because of the tangents\n\t\t\t// P0Tangent coefficient maximizes to 4/27 at a=1/3, and P1Tangent minimizes to -4/27 at a=2/3.\n\t\t\tconstexpr float MaximumTangentContribution = 4.0f / 27.0f;\n\t\t\tFBox2D Bounds(ForceInit);\n\n\t\t\tBounds += FVector2D(P0);\n\t\t\tBounds += FVector2D(P0 + MaximumTangentContribution * P0Tangent);\n\t\t\tBounds += FVector2D(P1);\n\t\t\tBounds += FVector2D(P1 - MaximumTangentContribution * P1Tangent);\n\n\t\t\tbCloseToSpline = Bounds.ComputeSquaredDistanceToPoint(LocalMousePosition) < QueryDistanceToBoundingBoxSquared;\n\t\t}\n\n\t\tif (bCloseToSpline)\n\t\t{\n\t\t\t// Find the closest approach to the spline\n\t\t\tFVector2D ClosestPoint(ForceInit);\n\t\t\tfloat ClosestDistanceSquared = FLT_MAX;\n\n\t\t\tconstexpr int32 NumStepsToTest = 16;\n\t\t\tconstexpr float StepInterval = 1.0f / static_cast<float>(NumStepsToTest);\n\t\t\tFVector2D Point1 = FMath::CubicInterp(P0, P0Tangent, P1, P1Tangent, 0.0f);\n\t\t\tfor (float TestAlpha = 0.0f; TestAlpha < 1.0f; TestAlpha += StepInterval)\n\t\t\t{\n\t\t\t\tconst FVector2D Point2 = FMath::CubicInterp(P0, P0Tangent, P1, P1Tangent, TestAlpha + StepInterval);\n\n\t\t\t\tconst FVector2D ClosestPointToSegment = FMath::ClosestPointOnSegment2D(LocalMousePosition, Point1, Point2);\n\t\t\t\tconst float DistanceSquared = (LocalMousePosition - ClosestPointToSegment).SizeSquared();\n\n\t\t\t\tif (DistanceSquared < ClosestDistanceSquared)\n\t\t\t\t{\n\t\t\t\t\tClosestDistanceSquared = DistanceSquared;\n\t\t\t\t\tClosestPoint = ClosestPointToSegment;\n\t\t\t\t}\n\n\t\t\t\tPoint1 = Point2;\n\t\t\t}\n\n\t\t\t// Record the overlap\n\t\t\tif (ClosestDistanceSquared < QueryDistanceTriggerThresholdSquared)\n\t\t\t{\n\t\t\t\tif (ClosestDistanceSquared < SplineOverlapResult.GetDistanceSquared())\n\t\t\t\t{\n\t\t\t\t\tconst float SquaredDistToPin1 = Params.AssociatedPin1 != nullptr ? (P0 - ClosestPoint).SizeSquared() : FLT_MAX;\n\n\t\t\t\t\tfloat SquaredDistToPin2 = FLT_MAX;\n\t\t\t\t\tUEdGraphPin* InputPin = Params.AssociatedPin2;\n\t\t\t\t\t// Can happen when we call DrawPreviewConnector\n\t\t\t\t\tif (InputPin != nullptr)\n\t\t\t\t\t{\n\t\t\t\t\t\t// Must be Edge input pin\n\t\t\t\t\t\tUDialogueGraphNode_Edge* GraphNode_Edge = CastChecked<UDialogueGraphNode_Edge>(Params.AssociatedPin2->GetOwningNode());\n\t\t\t\t\t\tInputPin = GraphNode_Edge->GetChildNode()->GetInputPin();\n\t\t\t\t\t\tSquaredDistToPin2 = (P1 - ClosestPoint).SizeSquared();\n\t\t\t\t\t}\n\n\t\t\t\t\t// The AssociatedPin2 is the Edge pin, which is not displayed, always hover over the current NodePin\n\t\t\t\t\tSplineOverlapResult = FGraphSplineOverlapResult(Params.AssociatedPin1, Params.AssociatedPin1, ClosestDistanceSquared,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSquaredDistToPin1, SquaredDistToPin1);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Draw the spline itself\n\tFSlateDrawElement::MakeDrawSpaceSpline(\n\t\tDrawElementsList,\n\t\tLayerId,\n\t\tP0, P0Tangent,\n\t\tP1, P1Tangent,\n\t\tParams.WireThickness,\n\t\tESlateDrawEffect::None,\n\t\tParams.WireColor\n\t);\n\n\tif (Params.bDrawBubbles || (MidpointImage != nullptr))\n\t{\n\t\t// This table maps distance along curve to alpha\n\t\tFInterpCurve<float> SplineReparamTable;\n\t\tconst float SplineLength = MakeSplineReparamTable(P0, P0Tangent, P1, P1Tangent, SplineReparamTable);\n\n\t\t// Draw bubbles on the spline\n\t\tif (Params.bDrawBubbles)\n\t\t{\n\t\t\tconst float BubbleSpacing = 64.f * ZoomFactor;\n\t\t\tconst float BubbleSpeed = 192.f * ZoomFactor;\n\t\t\tconst FVector2D BubbleSize = BubbleImage->ImageSize * ZoomFactor * 0.1f * Params.WireThickness;\n\n\t\t\tconst float Time = FPlatformTime::Seconds() - GStartTime;\n\t\t\tconst float BubbleOffset = FMath::Fmod(Time * BubbleSpeed, BubbleSpacing);\n\t\t\tconst int32 NumBubbles = FMath::CeilToInt(SplineLength / BubbleSpacing);\n\t\t\tfor (int32 i = 0; i < NumBubbles; ++i)\n\t\t\t{\n\t\t\t\tconst float Distance = (static_cast<float>(i) * BubbleSpacing) + BubbleOffset;\n\t\t\t\tif (Distance < SplineLength)\n\t\t\t\t{\n\t\t\t\t\tconst float Alpha = SplineReparamTable.Eval(Distance, 0.f);\n\t\t\t\t\tFVector2D BubblePos = FMath::CubicInterp(P0, P0Tangent, P1, P1Tangent, Alpha);\n\t\t\t\t\tBubblePos -= (BubbleSize * 0.5f);\n\n\t\t\t\t\tFSlateDrawElement::MakeBox(\n\t\t\t\t\t\tDrawElementsList,\n\t\t\t\t\t\tLayerId,\n\t\t\t\t\t\tFPaintGeometry(BubblePos, BubbleSize, ZoomFactor),\n\t\t\t\t\t\tBubbleImage,\n\t\t\t\t\t\tESlateDrawEffect::None,\n\t\t\t\t\t\tParams.WireColor\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Draw the midpoint image\n\t\tif (MidpointImage != nullptr)\n\t\t{\n\t\t\t// Determine the spline position for the midpoint\n\t\t\tconst float MidpointAlpha = SplineReparamTable.Eval(SplineLength * 0.5f, 0.f);\n\t\t\tconst FVector2D Midpoint = FMath::CubicInterp(P0, P0Tangent, P1, P1Tangent, MidpointAlpha);\n\n\t\t\t// Approximate the slope at the midpoint (to orient the midpoint image to the spline)\n\t\t\tconst FVector2D MidpointPlusE = FMath::CubicInterp(P0, P0Tangent, P1, P1Tangent, MidpointAlpha + KINDA_SMALL_NUMBER);\n\t\t\tconst FVector2D MidpointMinusE = FMath::CubicInterp(P0, P0Tangent, P1, P1Tangent, MidpointAlpha - KINDA_SMALL_NUMBER);\n\t\t\tconst FVector2D SlopeUnnormalized = MidpointPlusE - MidpointMinusE;\n\n\t\t\t// Draw the arrow\n\t\t\tconst FVector2D MidpointDrawPos = Midpoint - MidpointRadius;\n\t\t\tconst float AngleInRadians = SlopeUnnormalized.IsNearlyZero() ? 0.0f : FMath::Atan2(SlopeUnnormalized.Y, SlopeUnnormalized.X);\n\n\t\t\tFSlateDrawElement::MakeRotatedBox(\n\t\t\t\tDrawElementsList,\n\t\t\t\tLayerId,\n\t\t\t\tFPaintGeometry(MidpointDrawPos, MidpointImage->ImageSize * ZoomFactor, ZoomFactor),\n\t\t\t\tMidpointImage,\n\t\t\t\tESlateDrawEffect::None,\n\t\t\t\tAngleInRadians,\n\t\t\t\tTOptional<FVector2D>(),\n\t\t\t\tFSlateDrawElement::RelativeToElement,\n\t\t\t\tParams.WireColor\n\t\t\t);\n\t\t}\n\t}\n}\n\nvoid FDialogueGraphConnectionDrawingPolicy::DrawPreviewConnector(\n\tconst FGeometry& PinGeometry,\n\tconst FVector2D& StartPoint,\n\tconst FVector2D& EndPoint,\n\tUEdGraphPin* Pin\n)\n{\n\tFConnectionParams Params;\n\tDetermineWiringStyle(Pin, nullptr, /*inout*/ Params);\n\n\t// Find closesest point to each geometry, so that we draw from that source, simulates DrawSplineWithArrow\n\tif (Pin->Direction == EGPD_Output)\n\t{\n\t\t// From output pin, closest point on the SourceGeometry (source node) that goes to the EndPoint (destination node)\n\t\tDrawSplineWithArrow(FGeometryHelper::FindClosestPointOnGeom(PinGeometry, EndPoint), EndPoint, Params);\n\t}\n\telse\n\t{\n\t\t// From input pin, should never happen\n\t\tDrawSplineWithArrow(FGeometryHelper::FindClosestPointOnGeom(PinGeometry, StartPoint), StartPoint, Params);\n\t}\n}\n\nFVector2D FDialogueGraphConnectionDrawingPolicy::ComputeSplineTangent(const FVector2D& Start, const FVector2D& End) const\n{\n\t// Draw a straight line\n\tconst FVector2D Delta = End - Start;\n\tconst FVector2D NormDelta = Delta.GetSafeNormal();\n\treturn NormDelta;\n}\n\nvoid FDialogueGraphConnectionDrawingPolicy::Draw(TMap<TSharedRef<SWidget>, FArrangedWidget>& InPinGeometries,\n\tFArrangedChildren& ArrangedNodes)\n{\n\t// Build an acceleration structure to quickly find geometry for the nodes\n\tNodeWidgetMap.Empty();\n\tfor (int32 NodeIndex = 0; NodeIndex < ArrangedNodes.Num(); ++NodeIndex)\n\t{\n\t\tFArrangedWidget& CurWidget = ArrangedNodes[NodeIndex];\n\t\tTSharedRef<SGraphNode> ChildNode = StaticCastSharedRef<SGraphNode>(CurWidget.Widget);\n\t\tNodeWidgetMap.Add(ChildNode->GetNodeObj(), NodeIndex);\n\t}\n\n\t// Now draw\n\tSuper::Draw(InPinGeometries, ArrangedNodes);\n}\n\nvoid FDialogueGraphConnectionDrawingPolicy::Internal_DrawLineWithArrow(\n\tconst FVector2D& StartAnchorPoint,\n\tconst FVector2D& EndAnchorPoint,\n\tconst FConnectionParams& Params\n)\n{\n\tconstexpr float LineSeparationAmount = 4.5f;\n\n\tconst FVector2D DeltaPos = EndAnchorPoint - StartAnchorPoint;\n\tconst FVector2D UnitDelta = DeltaPos.GetSafeNormal();\n\tconst FVector2D Normal = FVector2D(DeltaPos.Y, -DeltaPos.X).GetSafeNormal();\n\n\t// Come up with the final start/end points\n\tconst FVector2D DirectionBias = Normal * LineSeparationAmount;\n\tconst FVector2D LengthBias = ArrowRadius.X * UnitDelta;\n\tconst FVector2D StartPoint = StartAnchorPoint + DirectionBias + LengthBias;\n\tconst FVector2D EndPoint = EndAnchorPoint + DirectionBias - LengthBias;\n\n\t// Draw a line/spline\n\tDrawConnection(WireLayerID, StartPoint, EndPoint, Params);\n\n\t// Draw the arrow\n\tif (ArrowImage)\n\t{\n\t\tconst FVector2D ArrowDrawPos = EndPoint - ArrowRadius;\n\t\tconst float AngleInRadians = FMath::Atan2(DeltaPos.Y, DeltaPos.X);\n\n\t\tFSlateDrawElement::MakeRotatedBox(\n\t\t\tDrawElementsList,\n\t\t\tArrowLayerID,\n\t\t\tFPaintGeometry(ArrowDrawPos, ArrowImage->ImageSize * ZoomFactor, ZoomFactor),\n\t\t\tArrowImage,\n\t\t\tESlateDrawEffect::None,\n\t\t\tAngleInRadians,\n\t\t\tTOptional<FVector2D>(),\n\t\t\tFSlateDrawElement::RelativeToElement,\n\t\t\tParams.WireColor\n\t\t);\n\t}\n}\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystemEditor/Private/DialogueEditor/Graph/DialogueGraphConnectionDrawingPolicy.h",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#pragma once\n\n#include \"Layout/ArrangedWidget.h\"\n#include \"Widgets/SWidget.h\"\n#include \"ConnectionDrawingPolicy.h\"\n\n#include \"DlgSystemSettings.h\"\n\nclass FSlateWindowElementList;\nclass UEdGraph;\n\n// This class draws the connections for an UEdGraph using a Dialogue schema\n// Aka how the wires look and and the flow look.\nclass FDialogueGraphConnectionDrawingPolicy : public FConnectionDrawingPolicy\n{\n\ttypedef FConnectionDrawingPolicy Super;\n\n\t/**\n\t * Call order in SGraphPanel:\n\t * - DrawPreviewConnector\n\t * - SetIncompatiblePinDrawState\n\t *   OR\n\t * - ResetIncompatiblePinDrawState\n\t *\n\t * - Draw\n\t *\t\t- DetermineLinkGeometry\n\t *\t\t- DetermineWiringStyle\n\t *\t\t- DrawSplineWithArrow\n\t *\t\t\t- DrawConnection\n\t */\n\npublic:\n\tFDialogueGraphConnectionDrawingPolicy(\n\t\tint32 InBackLayerID,\n\t\tint32 InFrontLayerID,\n\t\tfloat ZoomFactor,\n\t\tconst FSlateRect& InClippingRect,\n\t\tFSlateWindowElementList& InDrawElements,\n\t\tUEdGraph* InGraphObj\n\t);\n\n\t//\n\t// FConnectionDrawingPolicy interface\n\t//\n\n\t// Determine how the wires looks\n\tvoid DetermineWiringStyle(UEdGraphPin* OutputPin, UEdGraphPin* InputPin, /*inout*/ FConnectionParams& Params) override;\n\n\t// Determinte to what geometries the wires are connected.\n\tvoid DetermineLinkGeometry(\n\t\tFArrangedChildren& ArrangedNodes,\n\t\tTSharedRef<SWidget>& OutputPinWidget,\n\t\tUEdGraphPin* OutputPin,\n\t\tUEdGraphPin* InputPin,\n\t\t/*out*/ FArrangedWidget*& StartWidgetGeometry,\n\t\t/*out*/ FArrangedWidget*& EndWidgetGeometry\n\t) override;\n\n\t// How should we draw the spline and arrow arrow?\n\tvoid DrawSplineWithArrow(const FGeometry& StartGeom, const FGeometry& EndGeom, const FConnectionParams& Params) override;\n\tvoid DrawSplineWithArrow(const FVector2D& StartPoint, const FVector2D& EndPoint, const FConnectionParams& Params) override;\n\n\t// The method that actually draws the spline\n\tvoid DrawConnection(int32 LayerId, const FVector2D& Start, const FVector2D& End, const FConnectionParams& Params) override;\n\n\t// Sometimes the panel draws a preview connector; e.g. when the user is connecting pins\n\tvoid DrawPreviewConnector(const FGeometry& PinGeometry, const FVector2D& StartPoint, const FVector2D& EndPoint, UEdGraphPin* Pin) override;\n\n\t// Compute the tangent of the spline.\n\tFVector2D ComputeSplineTangent(const FVector2D& Start, const FVector2D& End) const override;\n\n\t// Draws the wire\n\tvoid Draw(TMap<TSharedRef<SWidget>, FArrangedWidget>& PinGeometries, FArrangedChildren& ArrangedNodes) override;\n\n\t// End of FConnectionDrawingPolicy interface\n\nprotected:\n\tvoid Internal_DrawLineWithArrow(const FVector2D& StartAnchorPoint, const FVector2D& EndAnchorPoint, const FConnectionParams& Params);\n\nprotected:\n\t// Map for widgets\n\tUEdGraph* Graph = nullptr;\n\n\t// Map for widgets\n\tTMap<UEdGraphNode*, int32> NodeWidgetMap;\n\n\t// Cache the settings\n\tconst UDlgSystemSettings* DialogueSettings = nullptr;\n};\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystemEditor/Private/DialogueEditor/Graph/DialogueGraphSchema.cpp",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#include \"DialogueGraphSchema.h\"\n\n#include \"Framework/MultiBox/MultiBoxBuilder.h\"\n#include \"UObject/UObjectIterator.h\"\n#include \"ScopedTransaction.h\"\n#include \"AssetData.h\"\n#include \"GraphEditorActions.h\"\n\n#if ENGINE_MINOR_VERSION >= 24\n#include \"ToolMenu.h\"\n#endif\n\n#include \"DialogueGraph.h\"\n#include \"DialogueEditor/Nodes/DialogueGraphNode.h\"\n#include \"DialogueEditor/Nodes/DialogueGraphNode_Edge.h\"\n#include \"SchemaActions/NewComment_DialogueGraphSchemaAction.h\"\n#include \"SchemaActions/NewNode_DialogueGraphSchemaAction.h\"\n#include \"SchemaActions/ConvertSpeechNodesToSpeechSequence_DialogueGraphSchemaAction.h\"\n\n#define LOCTEXT_NAMESPACE \"DlgDialogueGraphSchema\"\n\n// Initialize static properties\nconst FName UDialogueGraphSchema::PIN_CATEGORY_Input(TEXT(\"ParentInputs\"));\nconst FName UDialogueGraphSchema::PIN_CATEGORY_Output(TEXT(\"ChildOutputs\"));\n\nconst FText UDialogueGraphSchema::NODE_CATEGORY_Dialogue(LOCTEXT(\"DialogueNodeAction\", \"Dialogue Node\"));\nconst FText UDialogueGraphSchema::NODE_CATEGORY_Graph(LOCTEXT(\"GraphAction\", \"Graph\"));\nconst FText UDialogueGraphSchema::NODE_CATEGORY_Convert(LOCTEXT(\"NodesConvertAction\", \"Convert Node(s)\"));\n\nTArray<TSubclassOf<UDlgNode>> UDialogueGraphSchema::DialogueNodeClasses;\nbool UDialogueGraphSchema::bDialogueNodeClassesInitialized = false;\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// UDialogueGraphSchema\nvoid UDialogueGraphSchema::GetPaletteActions(FGraphActionMenuBuilder& ActionMenuBuilder) const\n{\n\tGetAllDialogueNodeActions(ActionMenuBuilder);\n\tGetCommentAction(ActionMenuBuilder);\n}\n\nbool UDialogueGraphSchema::ConnectionCausesLoop(const UEdGraphPin* InputPin, const UEdGraphPin* OutputPin) const\n{\n\tUDialogueGraphNode_Base* InputNode = CastChecked<UDialogueGraphNode_Base>(InputPin->GetOwningNode());\n\tUDialogueGraphNode_Base* OutputNode = CastChecked<UDialogueGraphNode_Base>(OutputPin->GetOwningNode());\n\n\t// Same Node\n\tif (InputNode == OutputNode)\n\t{\n\t\treturn true;\n\t}\n\n\treturn false;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// Begin EdGraphSchema Interface\nvoid UDialogueGraphSchema::GetGraphContextActions(FGraphContextMenuBuilder& ContextMenuBuilder) const\n{\n\tGetAllDialogueNodeActions(ContextMenuBuilder);\n\tGetConvertActions(ContextMenuBuilder, ContextMenuBuilder.CurrentGraph);\n\tGetCommentAction(ContextMenuBuilder, ContextMenuBuilder.CurrentGraph);\n\n\t// Menu not from a pin, directly right clicked on the graph canvas\n\tif (!ContextMenuBuilder.FromPin)\n\t{\n\t\t// TODO paste nodes here\n\t}\n}\n\n#if ENGINE_MINOR_VERSION >= 24\nvoid UDialogueGraphSchema::GetContextMenuActions(UToolMenu* Menu, UGraphNodeContextMenuContext* Context) const\n{\n\tif (Context->Node && !Context->bIsDebugging)\n\t{\n\t\t// Menu for right clicking on node\n\t\tFToolMenuSection& Section = Menu->AddSection(\"DialogueGraphSchemaNodeActions\", LOCTEXT(\"NodeActionsMenuHeader\", \"Node Actions\"));\n\n\t\t// This action is handled in UDialogueGraphSchema::BreakNodeLinks, and the action is registered in SGraphEditorImpl (not by us)\n\t\tSection.AddMenuEntry(FGraphEditorCommands::Get().BreakNodeLinks);\n\t}\n\n\t// The rest of the menus are implemented in the each nodes GetContextMenuActions method\n\tSuper::GetContextMenuActions(Menu, Context);\n}\n\n#else\n\nvoid UDialogueGraphSchema::GetContextMenuActions(\n\tconst UEdGraph* CurrentGraph,\n\tconst UEdGraphNode* InGraphNode,\n\tconst UEdGraphPin* InGraphPin,\n\tFMenuBuilder* MenuBuilder,\n\tbool bIsDebugging\n) const\n{\n\tif (InGraphNode && !bIsDebugging)\n\t{\n\t\t// Menu for right clicking on node\n\t\tMenuBuilder->BeginSection(\"DialogueGraphSchemaNodeActions\", LOCTEXT(\"NodeActionsMenuHeader\", \"Node Actions\"));\n\t\t{\n\t\t\t// This action is handled in UDialogueGraphSchema::BreakNodeLinks, and the action is registered in SGraphEditorImpl (not by us)\n\t\t\tMenuBuilder->AddMenuEntry(FGraphEditorCommands::Get().BreakNodeLinks);\n\t\t}\n\t\tMenuBuilder->EndSection();\n\t}\n\n\t// The rest of the menus are implemented in the each nodes GetContextMenuActions method\n\tSuper::GetContextMenuActions(CurrentGraph, InGraphNode, InGraphPin, MenuBuilder, bIsDebugging);\n}\n#endif // ENGINE_MINOR_VERSION >= 24\n\nvoid UDialogueGraphSchema::CreateDefaultNodesForGraph(UEdGraph& Graph) const\n{\n\t// This should only be called on empty graphs\n\tcheck(Graph.Nodes.Num() == 0);\n\tUDialogueGraph* DialogueGraph = CastChecked<UDialogueGraph>(&Graph);\n\n\t// Create, link and position nodes\n\tDialogueGraph->CreateGraphNodesFromDialogue();\n\tDialogueGraph->LinkGraphNodesFromDialogue();\n\tDialogueGraph->AutoPositionGraphNodes();\n\n\t// TODO(vampy): Fix editor crash\n\t//SetNodeMetaData(ResultRootNode, FNodeMetadata::DefaultGraphNode);\n}\n\nFPinConnectionResponse UDialogueGraphSchema::MovePinLinks(UEdGraphPin& MoveFromPin, UEdGraphPin& MoveToPin, bool bIsIntermediateMove, bool bNotifyLinkedNodes) const\n{\n\treturn FPinConnectionResponse(CONNECT_RESPONSE_DISALLOW, LOCTEXT(\"ConnectionMovePinLinks\", \"Move Pin Links Not implemented\"));\n}\n\nFPinConnectionResponse UDialogueGraphSchema::CopyPinLinks(UEdGraphPin& CopyFromPin, UEdGraphPin& CopyToPin, bool bIsIntermediateCopy) const\n{\n\treturn FPinConnectionResponse(CONNECT_RESPONSE_DISALLOW, LOCTEXT(\"ConnectionMovePinLinks\", \"Copy Pin Links Not implemented\"));\n}\n\nconst FPinConnectionResponse UDialogueGraphSchema::CanCreateConnection(const UEdGraphPin* PinA, const UEdGraphPin* PinB) const\n{\n\t// Make sure the pins are not on the same node\n\tif (PinA->GetOwningNode() == PinB->GetOwningNode())\n\t{\n\t\treturn FPinConnectionResponse(CONNECT_RESPONSE_DISALLOW, LOCTEXT(\"ConnectionSameNode\", \"Both are on the same node\"));\n\t}\n\n\t// Causes loop\n\tif (ConnectionCausesLoop(PinA, PinB))\n\t{\n\t\treturn FPinConnectionResponse(CONNECT_RESPONSE_DISALLOW, LOCTEXT(\"ConnectionLoop\", \"Connection would cause loop\"));\n\t}\n\n\t// Compare the directions\n\tconst UDialogueGraphNode_Base* SourceNode = CastChecked<UDialogueGraphNode_Base>(PinA->GetOwningNode());\n\tconst UDialogueGraphNode_Base* TargetNode = CastChecked<UDialogueGraphNode_Base>(PinB->GetOwningNode());\n\n\t// Does the source Node accept output connection?\n\tif (!SourceNode->CanHaveOutputConnections())\n\t{\n\t\treturn FPinConnectionResponse(CONNECT_RESPONSE_DISALLOW, TEXT(\"Cannot wire an edge from this node because it does not accept output connection \"));\n\t}\n\n\t// Does the targe Node accept input connection?\n\tif (!TargetNode->CanHaveInputConnections())\n\t{\n\t\treturn FPinConnectionResponse(CONNECT_RESPONSE_DISALLOW, TEXT(\"Cannot wire an edge to this node because it does not accept input connection \"));\n\t}\n\n\t// Only allow one connection from an output (parent node)\n\tif (SourceNode->HasOutputConnectionToNode(TargetNode))\n\t{\n\t\treturn FPinConnectionResponse(CONNECT_RESPONSE_DISALLOW, LOCTEXT(\"ConnectionAlreadyMade\", \"Connection between nodes already made\"));\n\t}\n\n\tconst bool bPinAIsEdge = SourceNode->IsA(UDialogueGraphNode_Edge::StaticClass());\n\tconst bool bPinBIsEdge = TargetNode->IsA(UDialogueGraphNode_Edge::StaticClass());\n\t// Can't connect edges to edges\n\tif (bPinAIsEdge && bPinBIsEdge)\n\t{\n\t\treturn FPinConnectionResponse(CONNECT_RESPONSE_DISALLOW, TEXT(\"Cannot wire an edge to an edge\"));\n\t}\n\n\t// Handle connection from and Edge to a Node OR Node to an Edge\n\t// Edges connections are exclusive so we break them\n\tif (bPinAIsEdge)\n\t{\n\t\treturn FPinConnectionResponse(CONNECT_RESPONSE_BREAK_OTHERS_A, TEXT(\"SHOULD NOT BE VISIBLE\"));\n\t}\n\tif (bPinBIsEdge)\n\t{\n\t\treturn FPinConnectionResponse(CONNECT_RESPONSE_BREAK_OTHERS_B, TEXT(\"SHOULD NOT BE VISIBLE\"));\n\t}\n\n\t// Handle Connection from a Node to a Node\n\t// Create and Edge by the means of conversion\n\tif (!bPinAIsEdge && !bPinBIsEdge)\n\t{\n\t\t// Calls CreateAutomaticConversionNodeAndConnections()\n\t\treturn FPinConnectionResponse(CONNECT_RESPONSE_MAKE_WITH_CONVERSION_NODE, TEXT(\"Create an Edge\"));\n\t}\n\n\treturn FPinConnectionResponse(CONNECT_RESPONSE_MAKE, FText::GetEmpty());\n}\n\nbool UDialogueGraphSchema::TryCreateConnection(UEdGraphPin* PinA, UEdGraphPin* PinB) const\n{\n\t// Happens when connecting pin to itself, seems to be a editor bug\n\tif (PinA->GetOwningNode() == PinB->GetOwningNode())\n\t{\n\t\treturn false;\n\t}\n\n\t// Handle the CONNECT_RESPONSE_BREAK_OTHERS, this should handle all cases, because there is only\n\t// one input pin and that is the only one which will loose it's former parent\n\tUEdGraphPin* FormerParentOutputPin = nullptr;\n\t{\n\t\t// Usually the InputPin is the PinB\n//\t\tconst ECanCreateConnectionResponse Response = CanCreateConnection(PinA, PinB).Response;\n//\t\tif (Response == CONNECT_RESPONSE_BREAK_OTHERS_B || Response == CONNECT_RESPONSE_BREAK_OTHERS_A)\n//\t\t{\n//\t\t\t// Should only happen to edges\n//\t\t\tUEdGraphPin* InputPin = nullptr;\n//\t\t\tUEdGraphPin* OutputPin = nullptr;\n//\t\t\tverify(CategorizePinsByDirection(PinA, PinB, /*out*/ InputPin, /*out*/ OutputPin));\n//\t\t\tcheck(InputPin->GetOwningNode()->IsA(UDialogueGraphNode_Edge::StaticClass()));\n//\t\t\tFormerParentOutputPin = InputPin->LinkedTo[0];\n//\t\t}\n\t}\n\n\t// Mark for undo system, we do not know if there is transaction so just mark without verifying\n\t// This mostly fixes crashing on undo when there is a drag operation\n\tUEdGraph* Graph = PinA->GetOwningNode()->GetGraph();\n\t{\n\t\tPinA->GetOwningNode()->Modify();\n\t\tPinB->GetOwningNode()->Modify();\n\t\tGraph->Modify();\n\t\tFDialogueEditorUtilities::GetDialogueForGraph(Graph)->Modify();\n\t}\n\n\tconst bool bModified = Super::TryCreateConnection(PinA, PinB);\n\tif (bModified)\n\t{\n\t\t// Notify former parent\n\t\tif (FormerParentOutputPin != nullptr)\n\t\t{\n\t\t\tFormerParentOutputPin->GetOwningNode()->PinConnectionListChanged(FormerParentOutputPin);\n\t\t}\n\n\t\tUDialogueGraphNode_Base* NodeB = CastChecked<UDialogueGraphNode_Base>(PinB->GetOwningNode());\n\t\t// Update the internal structure (recompile of the Dialogue Node/Graph Nodes)\n\t\tNodeB->GetDialogue()->CompileDialogueNodesFromGraphNodes();\n\t}\n\n\t// Reset the value\n\tFDialogueEditorUtilities::SetLastTargetGraphEdgeBeforeDrag(Graph, nullptr);\n\n\treturn bModified;\n}\n\nbool UDialogueGraphSchema::CreateAutomaticConversionNodeAndConnections(UEdGraphPin* PinA, UEdGraphPin* PinB) const\n{\n\tUDialogueGraphNode* NodeA = CastChecked<UDialogueGraphNode>(PinA->GetOwningNode());\n\tUDialogueGraphNode* NodeB = CastChecked<UDialogueGraphNode>(PinB->GetOwningNode());\n\tUEdGraph* Graph = NodeA->GetGraph();\n\n\t// NOTE: NodeB does not have a valid position yet so we can't use it\n\tUDialogueGraphNode_Edge* GraphNode_Edge =\n\t\tFDialogueEditorUtilities::SpawnGraphNodeFromTemplate<UDialogueGraphNode_Edge>(\n\t\t\tGraph, NodeA->GetDefaultEdgePosition(), false\n\t\t);\n\n\t// Create proxy connection from output -> input\n\tif (PinA->Direction == EGPD_Output)\n\t{\n\t\tGraphNode_Edge->CreateConnections(NodeA, NodeB);\n\t}\n\telse\n\t{\n\t\tGraphNode_Edge->CreateConnections(NodeB, NodeA);\n\t}\n\n\t// Was this from a modify drag and drop event? copy from the previous node\n\tif (UDialogueGraphNode_Edge* GraphNode_Edge_DragDop = FDialogueEditorUtilities::GetLastTargetGraphEdgeBeforeDrag(Graph))\n\t{\n\t\t// Copy the data from the old node, without the target index\n\t\tFDlgEdge NewEdge = GraphNode_Edge->GetDialogueEdge();\n\t\tconst int32 NewTargetIndex = NewEdge.TargetIndex;\n\n\t\tNewEdge = GraphNode_Edge_DragDop->GetDialogueEdge();\n\t\tNewEdge.TargetIndex = NewTargetIndex;\n\n\t\t// Propagate to Node\n\t\tGraphNode_Edge->SetDialogueEdge(NewEdge);\n\t\tGraphNode_Edge->PostEditChange();\n\t}\n\tGraph->NotifyGraphChanged();\n\n\treturn true;\n}\n\nbool UDialogueGraphSchema::ShouldHidePinDefaultValue(UEdGraphPin* Pin) const\n{\n\treturn true;\n}\n\nvoid UDialogueGraphSchema::BreakNodeLinks(UEdGraphNode& TargetNode) const\n{\n\t// NOTE: The SGraphEditorImpl::BreakNodeLinks that calls this (method) has the transaction declared, so do not make another one here.\n\tUEdGraph* Graph = TargetNode.GetGraph();\n\tUDlgDialogue* Dialogue = FDialogueEditorUtilities::GetDialogueForGraph(Graph);\n\n\t// Mark for undo system\n\tverify(Graph->Modify());\n\tverify(TargetNode.Modify());\n\tverify(Dialogue->Modify());\n\n\tSuper::BreakNodeLinks(TargetNode);\n\n#if DO_CHECK\n\tif (UDialogueGraphNode* GraphNode = Cast<UDialogueGraphNode>(&TargetNode))\n\t{\n\t\tGraphNode->CheckAll();\n\t}\n#endif\n\n\tDialogue->CompileDialogueNodesFromGraphNodes();\n}\n\nvoid UDialogueGraphSchema::BreakPinLinks(UEdGraphPin& TargetPin, bool bSendsNodeNotifcation) const\n{\n\tconst FScopedTransaction Transaction(LOCTEXT(\"GraphEd_BreakPinLinks\", \"Dialogue Editor: Break Pin Links\"));\n\tUEdGraphNode* Node = TargetPin.GetOwningNode();\n\tUEdGraph* Graph = Node->GetGraph();\n\tUDlgDialogue* Dialogue = FDialogueEditorUtilities::GetDialogueForGraph(Graph);\n\n\t// Mark for undo system\n\tverify(Node->Modify());\n\tverify(Graph->Modify());\n\tverify(Dialogue->Modify());\n\t// Modify() is called in BreakLinkTo on the TargetPin\n\n\tSuper::BreakPinLinks(TargetPin, bSendsNodeNotifcation);\n\n#if DO_CHECK\n\tif (UDialogueGraphNode* GraphNode = Cast<UDialogueGraphNode>(TargetPin.GetOwningNode()))\n\t{\n\t\tGraphNode->CheckAll();\n\t}\n#endif\n\n\t// If this would notify the node then we need to compile the Dialogue\n\tif (bSendsNodeNotifcation)\n\t{\n\t\t// Recompile\n\t\tDialogue->CompileDialogueNodesFromGraphNodes();\n\t}\n}\n\nvoid UDialogueGraphSchema::BreakSinglePinLink(UEdGraphPin* SourcePin, UEdGraphPin* TargetPin) const\n{\n\tconst FScopedTransaction Transaction(LOCTEXT(\"GraphEd_BreakSinglePinLink\", \"Dialogue Editor: Break Pin Link\"));\n\t// Modify() is called in BreakLinkTo\n\tSuper::BreakSinglePinLink(SourcePin, TargetPin);\n}\n\nvoid UDialogueGraphSchema::DroppedAssetsOnGraph(const TArray<FAssetData>& Assets, const FVector2D& GraphPosition, UEdGraph* Graph) const\n{\n\n}\n\nvoid UDialogueGraphSchema::DroppedAssetsOnNode(const TArray<FAssetData>& Assets, const FVector2D& GraphPosition, UEdGraphNode* Node) const\n{\n\n}\n// End EdGraphSchema Interface\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// Begin own functions\nvoid UDialogueGraphSchema::BreakLinkTo(UEdGraphPin* FromPin, UEdGraphPin* ToPin, bool bSendsNodeNotifcation) const\n{\n\tconst FScopedTransaction Transaction(LOCTEXT(\"GraphEd_BreakPinLink\", \"Dialogue Editor: Break Pin Link\"));\n\tUEdGraphNode* FromNode = FromPin->GetOwningNode();\n\tUEdGraphNode* ToNode = ToPin->GetOwningNode();\n\tUEdGraph* Graph = FromNode->GetGraph();\n\tUDlgDialogue* Dialogue = FDialogueEditorUtilities::GetDialogueForGraph(Graph);\n\n\t// Mark for undo system\n\tverify(FromNode->Modify());\n\tverify(ToNode->Modify());\n\tverify(Graph->Modify());\n\tverify(Dialogue->Modify());\n\n\t// Break\n\tFromPin->BreakLinkTo(ToPin);\n\n\t// Notify\n\tFromNode->PinConnectionListChanged(FromPin);\n\tToNode->PinConnectionListChanged(ToPin);\n\tif (bSendsNodeNotifcation)\n\t{\n\t\tFromNode->NodeConnectionListChanged();\n\t\tToNode->NodeConnectionListChanged();\n\t}\n\n#if DO_CHECK\n\tif (UDialogueGraphNode* GraphNode = Cast<UDialogueGraphNode>(FromNode))\n\t{\n\t\tGraphNode->CheckAll();\n\t}\n\tif (UDialogueGraphNode* GraphNode = Cast<UDialogueGraphNode>(ToNode))\n\t{\n\t\tGraphNode->CheckAll();\n\t}\n#endif\n\n\t// If this would notify the node then we need to Recompile the Dialogue\n\tif (bSendsNodeNotifcation)\n\t{\n\t\tDialogue->CompileDialogueNodesFromGraphNodes();\n\t}\n}\n\nvoid UDialogueGraphSchema::GetCommentAction(FGraphActionMenuBuilder& ActionMenuBuilder, const UEdGraph* CurrentGraph) const\n{\n\t// Do not allow to spawn a comment when we drag are dragging from a selected pin.\n\tif (ActionMenuBuilder.FromPin)\n\t{\n\t\treturn;\n\t}\n\n\t// The rest of the comment actions are in the UEdGraphSchema::GetContextMenuActions\n\tconst bool bIsManyNodesSelected = CurrentGraph ? GetNodeSelectionCount(CurrentGraph) > 0 : false;\n\tconst FText MenuDescription = bIsManyNodesSelected ?\n\t\tLOCTEXT(\"CreateCommentAction\", \"Create Comment from Selection\") : LOCTEXT(\"AddCommentAction\", \"Add Comment...\");\n\tconst FText ToolTip = LOCTEXT(\"CreateCommentToolTip\", \"Creates a comment.\");\n\tconstexpr int32 Grouping = 1;\n\n\tTSharedPtr<FNewComment_DialogueGraphSchemaAction> NewAction(new FNewComment_DialogueGraphSchemaAction(\n\t\tNODE_CATEGORY_Graph, MenuDescription, ToolTip, Grouping));\n\tActionMenuBuilder.AddAction(NewAction);\n}\n\nvoid UDialogueGraphSchema::GetConvertActions(FGraphActionMenuBuilder& ActionMenuBuilder, const UEdGraph* CurrentGraph) const\n{\n\tif (ActionMenuBuilder.FromPin || !IsValid(CurrentGraph))\n\t{\n\t\treturn;\n\t}\n\n\tconst TSet<UObject*> SelectedNodes = FDialogueEditorUtilities::GetSelectedNodes(CurrentGraph);\n\tint32 Grouping = 1;\n\n\t// Try conversion from speech nodes to a sequence node\n\t{\n\t\tTArray<UDialogueGraphNode*> SelectedGraphNodes;\n\t\tif (FDialogueEditorUtilities::CanConvertSpeechNodesToSpeechSequence(SelectedNodes, SelectedGraphNodes))\n\t\t{\n\t\t\tconst FText MenuDescription =\n\t\t\t\tLOCTEXT(\"ConvertSpeechNodesToSequenceNodeDesc\", \"Converts selected Speech node(s) to a Speech Sequence Node\");\n\t\t\tconst FText ToolTip =\n\t\t\t\tLOCTEXT(\"ConvertSpeechNodesToSequenceNodeToolTip\", \"Converts selected (compresses) linear Speech node(s) to a Speech Sequence Node\");\n\n\t\t\tTSharedPtr<FConvertSpeechNodesToSpeechSequence_DialogueGraphSchemaAction> NewAction(\n\t\t\t\tnew FConvertSpeechNodesToSpeechSequence_DialogueGraphSchemaAction(\n\t\t\t\t\tNODE_CATEGORY_Convert,\n\t\t\t\t\tMenuDescription,\n\t\t\t\t\tToolTip,\n\t\t\t\t\tGrouping++,\n\t\t\t\t\tSelectedGraphNodes\n\t\t\t\t)\n\t\t\t);\n\t\t\tActionMenuBuilder.AddAction(NewAction);\n\t\t}\n\t}\n}\n\nvoid UDialogueGraphSchema::GetAllDialogueNodeActions(FGraphActionMenuBuilder& ActionMenuBuilder) const\n{\n\tInitDialogueNodeClasses();\n\tFText ToolTip, MenuDesc;\n\n\t// when dragging from an input pin\n\tif (ActionMenuBuilder.FromPin == nullptr)\n\t{\n\t\t// Just right clicked on the empty graph\n\t\tToolTip = LOCTEXT(\"NewDialogueNodeTooltip\", \"Adds {Name} to the graph\");\n\t\tMenuDesc = LOCTEXT(\"NewDialogueNodeMenuDescription\", \"{Name}\");\n\t}\n\telse if (ActionMenuBuilder.FromPin->Direction == EGPD_Input)\n\t{\n\t\t// From an input pin\n\t\tToolTip = LOCTEXT(\"NewDialogueNodeTooltip_FromInputPin\", \"Adds {Name} to the graph as a parent to the current node\");\n\t\tMenuDesc = LOCTEXT(\"NewDialogueNodeMenuDescription_FromInputPin\", \"Add {Name} parent\");\n\t}\n\telse\n\t{\n\t\t// From an output pin\n\t\tcheck(ActionMenuBuilder.FromPin->Direction == EGPD_Output);\n\t\tToolTip = LOCTEXT(\"NewDialogueNodeTooltip_FromOutputPin\", \"Adds {Name} to the graph as a child to the current node\");\n\t\tMenuDesc = LOCTEXT(\"NewDialogueNodeMenuDescription_FromOutputPin\", \"Add {Name} child\");\n\t}\n\n\tint32 Grouping = 0;\n\tFFormatNamedArguments Arguments;\n\n\t// Generate menu actions for all the node types\n\tfor (TSubclassOf<UDlgNode> DialogueNodeClass : DialogueNodeClasses)\n\t{\n\t\tconst UDlgNode* DialogueNode = DialogueNodeClass->GetDefaultObject<UDlgNode>();\n\t\tArguments.Add(TEXT(\"Name\"), FText::FromString(DialogueNode->GetNodeTypeString()));\n\n\t\tTSharedPtr<FNewNode_DialogueGraphSchemaAction> Action(new FNewNode_DialogueGraphSchemaAction(\n\t\t\tNODE_CATEGORY_Dialogue, FText::Format(MenuDesc, Arguments), FText::Format(ToolTip, Arguments),\n\t\t\tGrouping++, DialogueNodeClass));\n\t\tActionMenuBuilder.AddAction(Action);\n\t}\n}\n\nvoid UDialogueGraphSchema::InitDialogueNodeClasses()\n{\n\tif (bDialogueNodeClassesInitialized)\n\t{\n\t\treturn;\n\t}\n\n\t// Construct list of non-abstract dialogue node classes.\n\tfor (TObjectIterator<UClass> It; It; ++It)\n\t{\n\t\tif (It->IsChildOf(UDlgNode::StaticClass()) && !It->HasAnyClassFlags(CLASS_Abstract))\n\t\t{\n\t\t\tDialogueNodeClasses.Add(*It);\n\t\t}\n\t}\n\n//\tDialogueNodeClasses.Sort();\n\tbDialogueNodeClassesInitialized = true;\n}\n//~ End own functions\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n#undef LOCTEXT_NAMESPACE\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystemEditor/Private/DialogueEditor/Graph/DialogueGraphSchema.h",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#pragma once\n\n#include \"CoreTypes.h\"\n#include \"EdGraph/EdGraphSchema.h\"\n\n#include \"Nodes/DlgNode.h\"\n#include \"DialogueEditorUtilities.h\"\n#include \"DialogueGraphConnectionDrawingPolicy.h\"\n#include \"SchemaActions/NewComment_DialogueGraphSchemaAction.h\"\n\n#include \"DialogueGraphSchema.generated.h\"\n\nclass UDialogueGraphNode;\nclass UGraphNodeContextMenuContext;\nclass UToolMenu;\nclass FMenuBuilder;\nclass FSlateWindowElementList;\nclass UEdGraph;\n\nUCLASS()\nclass UDialogueGraphSchema : public UEdGraphSchema\n{\n\tGENERATED_BODY()\n\npublic:\n\t/** Helper method to add items valid to the palette list */\n\tvoid GetPaletteActions(FGraphActionMenuBuilder& ActionMenuBuilder) const;\n\n\t/** Check whether connecting these pins would cause a loop */\n\tbool ConnectionCausesLoop(const UEdGraphPin* InputPin, const UEdGraphPin* OutputPin) const;\n\n\t//~ Begin EdGraphSchema Interface\n\t/**\n\t * Get all actions that can be performed when right clicking on a graph or drag-releasing on a graph from a pin\n\t *\n\t * @param [in,out]\tContextMenuBuilder\tThe context (graph, dragged pin, etc...) and output menu builder.\n\t */\n\tvoid GetGraphContextActions(FGraphContextMenuBuilder& ContextMenuBuilder) const override;\n\n\t/**\n\t * Gets actions that should be added to the right-click context menu for a node or pin\n\t * @param\tMenu\t\t\t\tThe menu to append actions to.\n\t * @param\tContext\t\t\t\tThe menu's context.\n\t */\n#if ENGINE_MINOR_VERSION >= 24\n\tvoid GetContextMenuActions(UToolMenu* Menu, UGraphNodeContextMenuContext* Context) const override;\n#else\n\tvoid GetContextMenuActions(\n\t\tconst UEdGraph* CurrentGraph,\n\t\tconst UEdGraphNode* InGraphNode,\n\t\tconst UEdGraphPin* InGraphPin,\n\t\tFMenuBuilder* MenuBuilder,\n\t\tbool bIsDebugging\n\t) const override;\n#endif\n\n\t/**\n\t * Populate new graph with any default nodes\n\t *\n\t * @param\tGraph\t\t\tGraph to add the default nodes to\n\t */\n\tvoid CreateDefaultNodesForGraph(UEdGraph& Graph) const override;\n\n\n\t/** Break links on this pin and create links instead on MoveToPin */\n\tFPinConnectionResponse MovePinLinks(\n\t\tUEdGraphPin& MoveFromPin,\n\t\tUEdGraphPin& MoveToPin,\n\t\tbool bIsIntermediateMove = false,\n\t\tbool bNotifyLinkedNodes = false\n\t) const override;\n\n\t/** Copies pin links from one pin to another without breaking the original links */\n\tFPinConnectionResponse CopyPinLinks(UEdGraphPin& CopyFromPin, UEdGraphPin& CopyToPin, bool bIsIntermediateCopy = false) const override;\n\n\t/**\n\t * Determine if a connection can be created between two pins.\n\t *\n\t * @param\tPinA\tThe first pin.\n\t * @param\tPinB\tThe second pin.\n\t *\n\t * @return\tAn empty string if the connection is legal, otherwise a message describing why the connection would fail.\n\t */\n\tconst FPinConnectionResponse CanCreateConnection(const UEdGraphPin* PinA, const UEdGraphPin* PinB) const override;\n\n\t/**\n\t * Try to make a connection between two pins.\n\t *\n\t * @param\tPinA\tThe first pin.\n\t * @param\tPinB\tThe second pin.\n\t *\n\t * @return\tTrue if a connection was made/broken (graph was modified); false if the connection failed and had no side effects.\n\t */\n\tbool TryCreateConnection(UEdGraphPin* PinA, UEdGraphPin* PinB) const override;\n\n\t/**\n\t * Try to create an automatic cast or other conversion node node to facilitate a connection between two pins.\n\t * It makes the cast node, a connection between A and the cast node, and a connection from the cast node to B.two\n\t * This method is called when a connection is made where CanCreateConnection returned bCanAutoConvert.\n\t *\n\t *\n\t * @param\tPinA\tThe first pin.\n\t * @param\tPinB\tThe second pin.\n\t *\n\t * @return\tTrue if a cast node and connection were made; false if the connection failed and had no side effects.\n\t */\n\tbool CreateAutomaticConversionNodeAndConnections(UEdGraphPin* PinA, UEdGraphPin* PinB) const override;\n\n\t/** If we should disallow viewing and editing of the supplied pin */\n\tbool ShouldHidePinDefaultValue(UEdGraphPin* Pin) const override;\n\n\t/**\n\t * Breaks all links from/to a single node\n\t *\n\t * @param\tTargetNode\tThe node to break links on\n\t */\n\tvoid BreakNodeLinks(UEdGraphNode& TargetNode) const override;\n\n\t/**\n\t * Breaks all links from/to a single pin\n\t *\n\t * @param\tTargetPin\tThe pin to break links on\n\t * @param\tbSendsNodeNotifcation\twhether to send a notification to the node post pin connection change\n\t */\n\tvoid BreakPinLinks(UEdGraphPin& TargetPin, bool bSendsNodeNotifcation) const override;\n\n\t/**\n\t * Breaks the link between two nodes.\n\t *\n\t * @param\tSourcePin\tThe pin where the link begins.\n\t * @param\tTargetPin\tThe pin where the link ends.\n\t */\n\tvoid BreakSinglePinLink(UEdGraphPin* SourcePin, UEdGraphPin* TargetPin) const override;\n\n\t/** Called when asset(s) are dropped onto the specified node */\n\tvoid DroppedAssetsOnGraph(const TArray<FAssetData>& Assets, const FVector2D& GraphPosition, UEdGraph* Graph) const override;\n\n\t/** Called when asset(s) are dropped onto the specified node */\n\tvoid DroppedAssetsOnNode(const TArray<FAssetData>& Assets, const FVector2D& GraphPosition, UEdGraphNode* Node) const override;\n\n\t/**\n\t * Returns the currently selected graph node count\n\t *\n\t * @param\tGraph\t\t\tThe active graph to find the selection count for\n\t */\n\tint32 GetNodeSelectionCount(const UEdGraph* Graph) const override { return FDialogueEditorUtilities::GetSelectedNodes(Graph).Num(); }\n\n\t/**\n\t * When a node is removed, this method determines whether we should remove it immediately or use the old (slower) code path that\n\t * results in all node being recreated:\n\t */\n\tbool ShouldAlwaysPurgeOnModification() const override { return true; }\n\n\t/** Returns schema action to create comment from implemention */\n\tTSharedPtr<FEdGraphSchemaAction> GetCreateCommentAction() const override\n\t{\n\t\treturn TSharedPtr<FEdGraphSchemaAction>(static_cast<FEdGraphSchemaAction*>(new FNewComment_DialogueGraphSchemaAction));\n\t}\n\n\t/* Returns new FConnectionDrawingPolicy from this schema */\n\tFConnectionDrawingPolicy* CreateConnectionDrawingPolicy(\n\t\tint32 InBackLayerID,\n\t\tint32 InFrontLayerID,\n\t\tfloat InZoomFactor,\n\t\tconst FSlateRect& InClippingRect,\n\t\tFSlateWindowElementList& InDrawElements,\n\t\tUEdGraph* InGraphObj\n\t) const override\n\t{\n\t\treturn new FDialogueGraphConnectionDrawingPolicy(InBackLayerID, InFrontLayerID, InZoomFactor, InClippingRect, InDrawElements, InGraphObj);\n\t}\n\t//~ End EdGraphSchema Interface\n\n\t// Begin own functions\n\t/**\n\t * Breaks all links from/to a single pin\n\t *\n\t * @param\tFromPin\t\tThe pin to break links from\n\t * @param\tToPin\t\tThe pin we are breaking links to\n\t * @param\tbSendsNodeNotifcation\twhether to send a notification to the node post pin connection change\n\t */\n\tvoid BreakLinkTo(UEdGraphPin* TargetPin, UEdGraphPin* ToPin, bool bSendsNodeNotifcation) const;\n\nprivate:\n\t//~ Begin own functions\n\t/** Adds action for creating a comment */\n\tvoid GetCommentAction(FGraphActionMenuBuilder& ActionMenuBuilder, const UEdGraph* CurrentGraph = nullptr) const;\n\n\t/** Adds conversion actions for differet nodes. */\n\tvoid GetConvertActions(FGraphActionMenuBuilder& ActionMenuBuilder, const UEdGraph* CurrentGraph) const;\n\n\t/** Adds actions for creating every type of DialogueNode */\n\tvoid GetAllDialogueNodeActions(FGraphActionMenuBuilder& ActionMenuBuilder) const;\n\n\t/** Generates a list of all available UDlgNode classes */\n\tstatic void InitDialogueNodeClasses();\n\npublic:\n\t// Allowed PinType.PinCategory values\n\tstatic const FName PIN_CATEGORY_Input;\n\tstatic const FName PIN_CATEGORY_Output;\n\n\t// Categories for actions\n\tstatic const FText NODE_CATEGORY_Dialogue;\n\tstatic const FText NODE_CATEGORY_Graph;\n\tstatic const FText NODE_CATEGORY_Convert;\n\nprivate:\n\t/** A list of all available UDlgNode classes */\n\tstatic TArray<TSubclassOf<UDlgNode>> DialogueNodeClasses;\n\n\t/** Whether the list of UDlgNode classes has been populated */\n\tstatic bool bDialogueNodeClassesInitialized;\n};\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystemEditor/Private/DialogueEditor/Graph/SchemaActions/ConvertSpeechNodesToSpeechSequence_DialogueGraphSchemaAction.cpp",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#include \"ConvertSpeechNodesToSpeechSequence_DialogueGraphSchemaAction.h\"\n\n#include \"ScopedTransaction.h\"\n\n#include \"NewNode_DialogueGraphSchemaAction.h\"\n#include \"DlgDialogue.h\"\n#include \"DialogueEditorUtilities.h\"\n#include \"Nodes/DlgNode_SpeechSequence.h\"\n#include \"Nodes/DlgNode_Speech.h\"\n#include \"DialogueEditor/Nodes/DialogueGraphNode.h\"\n\n#define LOCTEXT_NAMESPACE \"ConvertSpeechNodesToSpeechSequence_DialogueGraphSchemaAction\"\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// FConvertSpeechNodesToSpeechSequence_DialogueGraphSchemaAction\nUEdGraphNode* FConvertSpeechNodesToSpeechSequence_DialogueGraphSchemaAction::PerformAction(UEdGraph* ParentGraph, UEdGraphPin* FromPin,\n\tconst FVector2D Location, bool bSelectNewNode/* = true*/)\n{\n\t// Should have been stopped in GetConvertActions\n\tcheck(SelectedGraphNodes.Num() > 0);\n\tconst FScopedTransaction Transaction(LOCTEXT(\"DialogueditorConvertSpeechNodesToSpeechSequence\", \"Convert Speech Nodes to a Sequence Node\"));\n\tUDlgDialogue* Dialogue = FDialogueEditorUtilities::GetDialogueForGraph(ParentGraph);\n\n\t// Disable compiling for optimization\n\tDialogue->DisableCompileDialogue();\n\n\t// Step 1. Create the final speech sequence\n\tUDialogueGraphNode* GraphNode_SpeechSequence = FNewNode_DialogueGraphSchemaAction::SpawnGraphNodeWithDialogueNodeFromTemplate<UDialogueGraphNode>(\n\t\t\tParentGraph, UDlgNode_SpeechSequence::StaticClass(), Location, bSelectNewNode);\n\n\t// Step 2. Copy all selected graph nodes into the speech sequence\n\tUDlgNode_SpeechSequence* DialogueNode_SpeechSequence =\n\t\tGraphNode_SpeechSequence->GetMutableDialogueNode<UDlgNode_SpeechSequence>();\n\tTArray<FDlgSpeechSequenceEntry>* SpeechSequence = DialogueNode_SpeechSequence->GetMutableNodeSpeechSequence();\n\tfor (UDialogueGraphNode* GraphNode : SelectedGraphNodes)\n\t{\n\t\tconst UDlgNode_Speech& DialogueNode_Speech = GraphNode->GetDialogueNode<UDlgNode_Speech>();\n\t\tauto SequenceEntry = FDlgSpeechSequenceEntry{};\n\t\tSequenceEntry.Speaker = DialogueNode_Speech.GetNodeParticipantName();\n\t\tSequenceEntry.Text = DialogueNode_Speech.GetNodeText();\n\t\tSequenceEntry.NodeData = DialogueNode_Speech.GetNodeData();\n\t\tSequenceEntry.SpeakerState = DialogueNode_Speech.GetSpeakerState();\n\t\tSequenceEntry.VoiceSoundWave = DialogueNode_Speech.GetNodeVoiceSoundBase();\n\t\tSequenceEntry.VoiceDialogueWave = DialogueNode_Speech.GetNodeVoiceDialogueWave();\n\t\tSequenceEntry.GenericData = DialogueNode_Speech.GetNodeGenericData();\n\n\t\t// Set edge if any\n\t\tconst TArray<FDlgEdge>& Children = DialogueNode_Speech.GetNodeChildren();\n\t\t// Get only the first edge, as there should be only one anyways (besides the last node)\n\t\tif (Children.Num() > 0)\n\t\t{\n\t\t\tSequenceEntry.EdgeText = Children[0].GetUnformattedText();\n\t\t}\n\n\t\tSpeechSequence->Add(SequenceEntry);\n\t}\n\tDialogueNode_SpeechSequence->AutoGenerateInnerEdges();\n\n\t// Step 3. Copy existing connections from the first and last node in the sequence\n\t// Replace connections from parents\n\tconst UDialogueGraphNode* FirstSelectedGraphNode = SelectedGraphNodes[0];\n\tFDialogueEditorUtilities::ReplaceParentConnectionsToNode(FirstSelectedGraphNode, GraphNode_SpeechSequence);\n\n\t// Copy connections from the last node to the speech sequence\n\tconst UDialogueGraphNode* LastSelectedNode = SelectedGraphNodes.Last();\n\tFDialogueEditorUtilities::CopyNodeChildren(LastSelectedNode, GraphNode_SpeechSequence);\n\n\t// Step 4. Remove the nodes, this will break the existing input/output connections of the nodes\n\tfor (UDialogueGraphNode* GraphNode : SelectedGraphNodes)\n\t\tFDialogueEditorUtilities::RemoveNode(GraphNode);\n\n#if DO_CHECK\n\tGraphNode_SpeechSequence->CheckAll();\n\tfor (UDialogueGraphNode* ParentNode : GraphNode_SpeechSequence->GetParentNodes())\n\t{\n\t\tParentNode->CheckAll();\n\t}\n\tfor (UDialogueGraphNode* ChildNode : GraphNode_SpeechSequence->GetChildNodes())\n\t{\n\t\tChildNode->CheckAll();\n\t}\n#endif\n\tDialogue->EnableCompileDialogue();\n\tDialogue->CompileDialogueNodesFromGraphNodes();\n\tDialogue->PostEditChange();\n\tDialogue->MarkPackageDirty();\n\tParentGraph->NotifyGraphChanged();\n\n\treturn GraphNode_SpeechSequence;\n}\n\n#undef LOCTEXT_NAMESPACE\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystemEditor/Private/DialogueEditor/Graph/SchemaActions/ConvertSpeechNodesToSpeechSequence_DialogueGraphSchemaAction.h",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#pragma once\n\n#include \"EdGraph/EdGraphSchema.h\"\n#include \"Templates/SubclassOf.h\"\n\n#include \"ConvertSpeechNodesToSpeechSequence_DialogueGraphSchemaAction.generated.h\"\n\nclass UDialogueGraphNode;\nclass UEdGraph;\n\n/**\n * Action to convert Speech nodes to a Speech Sequence Node.\n * This is the opposite of the FConvertSpeechSequenceNodeToSpeechNodes_DialogueGraphSchemaAction.\n */\nUSTRUCT()\nstruct FConvertSpeechNodesToSpeechSequence_DialogueGraphSchemaAction : public FEdGraphSchemaAction\n{\n\tGENERATED_USTRUCT_BODY();\n\n\tFConvertSpeechNodesToSpeechSequence_DialogueGraphSchemaAction() : FEdGraphSchemaAction() {}\n\tFConvertSpeechNodesToSpeechSequence_DialogueGraphSchemaAction(const TArray<UDialogueGraphNode*>& InSelectedGraphNodes)\n        : FEdGraphSchemaAction(), SelectedGraphNodes(InSelectedGraphNodes) {}\n\n\tFConvertSpeechNodesToSpeechSequence_DialogueGraphSchemaAction(\n\t\tconst FText& InNodeCategory,\n\t\tconst FText& InMenuDesc,\n\t\tconst FText& InToolTip,\n\t\tint32 InGrouping,\n\t\tTArray<UDialogueGraphNode*> InSelectedGraphNodes\n\t) : FEdGraphSchemaAction(InNodeCategory, InMenuDesc, InToolTip, InGrouping), SelectedGraphNodes(InSelectedGraphNodes) {}\n\n\t//~ Begin FEdGraphSchemaAction Interface\n\tUEdGraphNode* PerformAction(UEdGraph* ParentGraph, UEdGraphPin* FromPin, const FVector2D Location, bool bSelectNewNode = true) override;\n\t//~ End FEdGraphSchemaAction Interface\n\nprivate:\n\t// Nodes selected that we are going to convert\n\tTArray<UDialogueGraphNode*> SelectedGraphNodes;\n};\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystemEditor/Private/DialogueEditor/Graph/SchemaActions/ConvertSpeechSequenceNodeToSpeechNodes_DialogueGraphSchemaAction.cpp",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#include \"ConvertSpeechSequenceNodeToSpeechNodes_DialogueGraphSchemaAction.h\"\n\n#include \"ScopedTransaction.h\"\n\n#include \"NewNode_DialogueGraphSchemaAction.h\"\n#include \"DlgDialogue.h\"\n#include \"DialogueEditorUtilities.h\"\n#include \"Nodes/DlgNode_SpeechSequence.h\"\n#include \"Nodes/DlgNode_Speech.h\"\n#include \"DialogueEditor/Nodes/DialogueGraphNode.h\"\n\n#define LOCTEXT_NAMESPACE \"ConvertSpeechSequenceNodeToSpeechNodes_DialogueGraphSchemaAction\"\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// FConvertSpeechSequenceNodeToSpeechNodes_DialogueGraphSchemaAction\nUEdGraphNode* FConvertSpeechSequenceNodeToSpeechNodes_DialogueGraphSchemaAction::PerformAction(UEdGraph* ParentGraph, UEdGraphPin* FromPin,\n\tconst FVector2D Location, bool bSelectNewNode/* = false*/)\n{\n\tcheck(SelectedSpeechSequenceGraphNode);\n\tcheck(SelectedSpeechSequenceGraphNode->IsSpeechSequenceNode());\n\tconst FScopedTransaction Transaction(LOCTEXT(\"DialogueEditoConvertSpeechSequenceNodeToSpeechNodes\", \"Dialogue Editor: Convert Speech Sequence to Speech Nodes\"));\n\n\tUDlgDialogue* Dialogue = FDialogueEditorUtilities::GetDialogueForGraph(ParentGraph);\n\tconst UEdGraphSchema* GraphSchema = ParentGraph->GetSchema();\n\tconst FVector2D PositionOffset(0.f, GetDefault<UDlgSystemSettings>()->OffsetBetweenRowsY);\n\tFVector2D Position = Location;\n\n\tconst UDlgNode_SpeechSequence& SpeechSequence_DialogueNode = SelectedSpeechSequenceGraphNode->GetDialogueNode<UDlgNode_SpeechSequence>();\n\tconst TArray<FDlgSpeechSequenceEntry>& SpeechSequenceEntries = SpeechSequence_DialogueNode.GetNodeSpeechSequence();\n\tcheck(SpeechSequenceEntries.Num() > 0);\n\n\t// Disable compiling for optimization\n\tDialogue->DisableCompileDialogue();\n\n\t// Step 1. Create and position the final speech nodes array\n\tTArray<UDialogueGraphNode*> SpeechNodes;\n\tSpeechNodes.Reserve(SpeechSequenceEntries.Num());\n\tconst int32 NodesNum = SpeechSequenceEntries.Num();\n\tfor (int32 NodeIndex = 0; NodeIndex < NodesNum; NodeIndex++)\n\t{\n\t\tUDialogueGraphNode* Speech_GraphNode =\n\t\t\tFNewNode_DialogueGraphSchemaAction::SpawnGraphNodeWithDialogueNodeFromTemplate<UDialogueGraphNode>(\n\t\t\t\tParentGraph, UDlgNode_Speech::StaticClass(), Position, bSelectNewNode);\n\t\tSpeechNodes.Add(Speech_GraphNode);\n\n\t\t// Advance down\n\t\tPosition += PositionOffset;\n\t}\n\tcheck(SpeechNodes.Num() == SpeechSequenceEntries.Num());\n\n\t// Step 2. Link the nodes to each other and copy the data from the speech sequence\n\tfor (int32 NodeIndex = 0; NodeIndex < NodesNum; NodeIndex++)\n\t{\n\t\tconst FDlgSpeechSequenceEntry& SequenceEntry = SpeechSequenceEntries[NodeIndex];\n\t\tUDialogueGraphNode* Speech_GraphNode = SpeechNodes[NodeIndex];\n\t\tUDlgNode_Speech* Speech_DialogueNode = Speech_GraphNode->GetMutableDialogueNode<UDlgNode_Speech>();\n\n\t\t// Copy data\n\t\tSpeech_DialogueNode->SetNodeParticipantName(SequenceEntry.Speaker);\n\t\tSpeech_DialogueNode->SetNodeText(SequenceEntry.Text);\n\t\tSpeech_DialogueNode->SetNodeData(SequenceEntry.NodeData);\n\t\tSpeech_DialogueNode->SetSpeakerState(SequenceEntry.SpeakerState);\n\t\tSpeech_DialogueNode->SetVoiceSoundBase(SequenceEntry.VoiceSoundWave);\n\t\tSpeech_DialogueNode->SetVoiceDialogueWave(SequenceEntry.VoiceDialogueWave);\n\t\tSpeech_DialogueNode->SetGenericData(SequenceEntry.GenericData);\n\n\t\t// Create edge to next node\n\t\tif (NodeIndex + 1 < NodesNum)\n\t\t{\n\t\t\t// Connect to next node\n\t\t\tUDialogueGraphNode* Speech_NextGraphNode = SpeechNodes[NodeIndex + 1];\n\t\t\tverify(GraphSchema->TryCreateConnection(Speech_GraphNode->GetOutputPin(), Speech_NextGraphNode->GetInputPin()));\n\n\t\t\t// Set the edge in the Dialogue. Should only be an edge/child\n\t\t\tSpeech_GraphNode->SetEdgeTextAt(0, SequenceEntry.EdgeText);\n\t\t}\n\t}\n\n\t// Step 3. Copy existing connection to the first and last node.\n\t// Replace connections from parents\n\tconst UDialogueGraphNode* FirstNode = SpeechNodes[0];\n\tFDialogueEditorUtilities::ReplaceParentConnectionsToNode(SelectedSpeechSequenceGraphNode, FirstNode);\n\n\t// Copy connections to the last Node\n\tUDialogueGraphNode* LastNode = SpeechNodes.Last();\n\tFDialogueEditorUtilities::CopyNodeChildren(SelectedSpeechSequenceGraphNode, LastNode);\n\n\t// Step 4. Remove the speech sequence node\n\tFDialogueEditorUtilities::RemoveNode(SelectedSpeechSequenceGraphNode);\n\n#if DO_CHECK\n\tfor (UDialogueGraphNode* ParentNode : SpeechNodes[0]->GetParentNodes())\n\t{\n\t\tParentNode->CheckAll();\n\t}\n\tfor (const UDialogueGraphNode* GraphNode : SpeechNodes)\n\t{\n\t\tGraphNode->CheckAll();\n\t}\n\tfor (UDialogueGraphNode* ChildNode : SpeechNodes.Last()->GetChildNodes())\n\t{\n\t\tChildNode->CheckAll();\n\t}\n#endif\n\n\tDialogue->EnableCompileDialogue();\n\tDialogue->CompileDialogueNodesFromGraphNodes();\n\tDialogue->PostEditChange();\n\tDialogue->MarkPackageDirty();\n\tParentGraph->NotifyGraphChanged();\n\n\t// Return the reference to the first node\n\treturn SpeechNodes[0];\n}\n\n#undef LOCTEXT_NAMESPACE\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystemEditor/Private/DialogueEditor/Graph/SchemaActions/ConvertSpeechSequenceNodeToSpeechNodes_DialogueGraphSchemaAction.h",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#pragma once\n\n#include \"EdGraph/EdGraphSchema.h\"\n#include \"Templates/SubclassOf.h\"\n\n#include \"ConvertSpeechSequenceNodeToSpeechNodes_DialogueGraphSchemaAction.generated.h\"\n\nclass UDialogueGraphNode;\nclass UEdGraph;\n\n/**\n * Action to convert a Speech Sequence node to a list of Speech nodes.\n * This is the opposite of the FConvertSpeechNodesToSpeechSequence_DialogueGraphSchemaAction.\n */\nUSTRUCT()\nstruct FConvertSpeechSequenceNodeToSpeechNodes_DialogueGraphSchemaAction : public FEdGraphSchemaAction\n{\n\tGENERATED_USTRUCT_BODY();\n\n\tFConvertSpeechSequenceNodeToSpeechNodes_DialogueGraphSchemaAction() : FEdGraphSchemaAction() {}\n\tFConvertSpeechSequenceNodeToSpeechNodes_DialogueGraphSchemaAction(UDialogueGraphNode* InSelectedSpeechSequenceGraphNode)\n\t\t: FEdGraphSchemaAction(), SelectedSpeechSequenceGraphNode(InSelectedSpeechSequenceGraphNode) {}\n\n\tFConvertSpeechSequenceNodeToSpeechNodes_DialogueGraphSchemaAction(\n\t\tconst FText& InNodeCategory,\n\t\tconst FText& InMenuDesc,\n\t\tconst FText& InToolTip,\n\t\tint32 InGrouping,\n\t\tUDialogueGraphNode* InSelectedSpeechSequenceGraphNode\n\t) : FEdGraphSchemaAction(InNodeCategory, InMenuDesc, InToolTip, InGrouping), SelectedSpeechSequenceGraphNode(InSelectedSpeechSequenceGraphNode) {}\n\n\t//~ Begin FEdGraphSchemaAction Interface\n\tUEdGraphNode* PerformAction(UEdGraph* ParentGraph, UEdGraphPin* FromPin, const FVector2D Location, bool bSelectNewNode = false) override;\n\t//~ End FEdGraphSchemaAction Interface\n\nprivate:\n\t// The speech sequence selected\n\tUDialogueGraphNode* SelectedSpeechSequenceGraphNode = nullptr;\n};\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystemEditor/Private/DialogueEditor/Graph/SchemaActions/NewComment_DialogueGraphSchemaAction.cpp",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#include \"NewComment_DialogueGraphSchemaAction.h\"\n\n#include \"EdGraphNode_Comment.h\"\n\n#include \"DialogueEditorUtilities.h\"\n\n#define LOCTEXT_NAMESPACE \"NewComment_DialogueGraphSchemaAction\"\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// FNewComment_DialogueGraphSchemaAction\nUEdGraphNode* FNewComment_DialogueGraphSchemaAction::PerformAction(UEdGraph* ParentGraph, UEdGraphPin* FromPin,\n\tconst FVector2D Location, bool bSelectNewNode/* = true*/)\n{\n\t// Add menu item for creating comment boxes\n\tUEdGraphNode_Comment* CommentTemplate = NewObject<UEdGraphNode_Comment>();\n\n\t// Wrap comment around other nodes, this makes it possible to select other nodes and press the \"C\" key on the keyboard.\n\tFVector2D SpawnLocation = Location;\n\tFSlateRect Bounds;\n\tif (FDialogueEditorUtilities::GetBoundsForSelectedNodes(ParentGraph, Bounds, 50.0f))\n\t{\n\t\tCommentTemplate->SetBounds(Bounds);\n\t\tSpawnLocation.X = CommentTemplate->NodePosX;\n\t\tSpawnLocation.Y = CommentTemplate->NodePosY;\n\t}\n\n\treturn FEdGraphSchemaAction_NewNode::SpawnNodeFromTemplate<UEdGraphNode_Comment>(ParentGraph, CommentTemplate, SpawnLocation, bSelectNewNode);\n}\n\n#undef LOCTEXT_NAMESPACE\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystemEditor/Private/DialogueEditor/Graph/SchemaActions/NewComment_DialogueGraphSchemaAction.h",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#pragma once\n\n#include \"EdGraph/EdGraphSchema.h\"\n#include \"Templates/SubclassOf.h\"\n\n#include \"NewComment_DialogueGraphSchemaAction.generated.h\"\n\nclass UEdGraph;\n\n/** Action to create new comment */\nUSTRUCT()\nstruct FNewComment_DialogueGraphSchemaAction : public FEdGraphSchemaAction\n{\n\tGENERATED_USTRUCT_BODY();\n\n\tFNewComment_DialogueGraphSchemaAction() : FEdGraphSchemaAction() {}\n\tFNewComment_DialogueGraphSchemaAction(const FText& InNodeCategory, const FText& InMenuDesc, const FText& InToolTip, int32 InGrouping)\n\t\t: FEdGraphSchemaAction(InNodeCategory, InMenuDesc, InToolTip, InGrouping) {}\n\n\t//~ Begin FEdGraphSchemaAction Interface\n\tUEdGraphNode* PerformAction(UEdGraph* ParentGraph, UEdGraphPin* FromPin, const FVector2D Location, bool bSelectNewNode = true) override;\n\t//~ End FEdGraphSchemaAction Interface\n};\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystemEditor/Private/DialogueEditor/Graph/SchemaActions/NewNode_DialogueGraphSchemaAction.cpp",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#include \"NewNode_DialogueGraphSchemaAction.h\"\n\n#include \"ScopedTransaction.h\"\n\n#include \"DlgDialogue.h\"\n#include \"DialogueEditor/Nodes/DialogueGraphNode.h\"\n\n#define LOCTEXT_NAMESPACE \"NewNode_DialogueGraphSchemaAction\"\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// FNewNode_DialogueGraphSchemaAction\nUEdGraphNode* FNewNode_DialogueGraphSchemaAction::PerformAction(\n\tUEdGraph* ParentGraph,\n\tUEdGraphPin* FromPin,\n\tconst FVector2D Location,\n\tbool bSelectNewNode/* = true*/\n)\n{\n\tconst FScopedTransaction Transaction(LOCTEXT(\"DialogueditorNewDialgueNode\", \"Dialogue Editor: New Dialogue Node\"));\n\tUDlgDialogue* Dialogue = CastChecked<UDialogueGraph>(ParentGraph)->GetDialogue();\n\n\t// Mark for modification\n\tverify(ParentGraph->Modify());\n\tif (FromPin)\n\t{\n\t\tverify(FromPin->Modify());\n\t}\n\tverify(Dialogue->Modify());\n\n\t// Create node, without needing to compile it\n\tUEdGraphNode* GraphNode = CreateNode(Dialogue, ParentGraph, FromPin, Location, bSelectNewNode);\n\tDialogue->PostEditChange();\n\tDialogue->MarkPackageDirty();\n\tParentGraph->NotifyGraphChanged();\n\n\treturn GraphNode;\n}\n\nUEdGraphNode* FNewNode_DialogueGraphSchemaAction::CreateNode(\n\tUDlgDialogue* Dialogue,\n\tUEdGraph* ParentGraph,\n\tUEdGraphPin* FromPin,\n\tFVector2D Location,\n\tbool bSelectNewNode\n)\n{\n\t// Maximum distance a drag can be off a node edge to require 'push off' from node\n\tstatic constexpr int32 NodeDistance = 60;\n\n\t// Create the dialogue node\n\tauto DialogueNode = Dialogue->ConstructDialogueNode<UDlgNode>(CreateNodeType);\n\n\t// Set the Participant Name\n\tif (FromPin)\n\t{\n\t\tif (UDialogueGraphNode* GraphNode = Cast<UDialogueGraphNode>(FromPin->GetOwningNode()))\n\t\t{\n\t\t\tif (GraphNode->IsRootNode())\n\t\t\t{\n\t\t\t\t// Root Node use the first node from the Array\n\t\t\t\tif (Dialogue->GetNodes().Num() > 0)\n\t\t\t\t{\n\t\t\t\t\tDialogueNode->SetNodeParticipantName(Dialogue->GetNodes()[0]->GetNodeParticipantName());\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t// Use the node from which we spawned this\n\t\t\t\tDialogueNode->SetNodeParticipantName(GraphNode->GetDialogueNode().GetNodeParticipantName());\n\t\t\t}\n\t\t}\n\t}\n\telse\n\t{\n\t\t// Use first Node from the Array\n\t\tif (Dialogue->GetNodes().Num() > 0)\n\t\t{\n\t\t\tDialogueNode->SetNodeParticipantName(Dialogue->GetNodes()[0]->GetNodeParticipantName());\n\t\t}\n\t}\n\n\t// Create the graph node\n\tFGraphNodeCreator<UDialogueGraphNode> NodeCreator(*ParentGraph);\n\tUDialogueGraphNode* GraphNode = NodeCreator.CreateUserInvokedNode(bSelectNewNode);\n\n\t// Link dialogue node <-> graph node\n\tDialogueNode->SetGraphNode(GraphNode);\n\tconst int32 DialogueNodeIndex = Dialogue->AddNode(DialogueNode);\n\tGraphNode->SetDialogueNodeDataChecked(DialogueNodeIndex, DialogueNode);\n\n\t// Finalize graph node creation\n\tNodeCreator.Finalize(); // Calls on the node: CreateNewGuid, PostPlacedNewNode, AllocateDefaultPins\n\tGraphNode->AutowireNewNode(FromPin);\n\n\t// Position graph node\n\t// For input pins, new node will generally overlap node being dragged off\n\t// Work out if we want to visually push away from connected node\n\tint32 XLocation = Location.X;\n\tif (FromPin && FromPin->Direction == EGPD_Input)\n\t{\n\t\tUEdGraphNode* PinNode = FromPin->GetOwningNode();\n\t\tconst float XDelta = FMath::Abs(PinNode->NodePosX - Location.X);\n\n\t\tif (XDelta < NodeDistance)\n\t\t{\n\t\t\t// Set location to edge of current node minus the max move distance\n\t\t\t// to force node to push off from connect node enough to give selection handle\n\t\t\tXLocation = PinNode->NodePosX - NodeDistance;\n\t\t}\n\t}\n\n\tGraphNode->SetPosition(XLocation, Location.Y);\n\t//ResultNode->SnapToGrid(SNAP_GRID);\n\n\treturn CastChecked<UEdGraphNode>(GraphNode);\n}\n\n#undef LOCTEXT_NAMESPACE\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystemEditor/Private/DialogueEditor/Graph/SchemaActions/NewNode_DialogueGraphSchemaAction.h",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#pragma once\n\n#include \"EdGraph/EdGraphSchema.h\"\n#include \"Templates/SubclassOf.h\"\n\n#include \"Nodes/DlgNode.h\"\n\n#include \"NewNode_DialogueGraphSchemaAction.generated.h\"\n\nclass UDialogueGraphNode;\nclass UDlgDialogue;\nclass UEdGraph;\n\n/** Action to add a node to the graph */\nUSTRUCT()\nstruct FNewNode_DialogueGraphSchemaAction : public FEdGraphSchemaAction\n{\nprivate:\n\ttypedef FNewNode_DialogueGraphSchemaAction Self;\n\npublic:\n\tGENERATED_USTRUCT_BODY();\n\n\tFNewNode_DialogueGraphSchemaAction() : FEdGraphSchemaAction() {}\n\tFNewNode_DialogueGraphSchemaAction(\n\t\tconst FText& InNodeCategory,\n\t\tconst FText& InMenuDesc, const FText& InToolTip,\n\t\tint32 InGrouping, TSubclassOf<UDlgNode> InCreateNodeType\n\t) : FEdGraphSchemaAction(InNodeCategory, InMenuDesc, InToolTip, InGrouping), CreateNodeType(InCreateNodeType) {}\n\n\t//~ Begin FEdGraphSchemaAction Interface\n\tUEdGraphNode* PerformAction(UEdGraph* ParentGraph, UEdGraphPin* FromPin, const FVector2D Location, bool bSelectNewNode = true) override;\n\t//~ End FEdGraphSchemaAction Interface\n\n\t// Spawns a new UDialogueGraphNode of type GraphNodeType that must have a valid DialogueNode of TSubclassOf<UDlgNode>\n\ttemplate <typename GraphNodeType>\n\tstatic GraphNodeType* SpawnGraphNodeWithDialogueNodeFromTemplate(\n\t\tUEdGraph* ParentGraph,\n\t\tTSubclassOf<UDlgNode> CreateNodeType,\n\t\tconst FVector2D Location,\n\t\tbool bSelectNewNode = true\n\t)\n\t{\n\t\tSelf Action(FText::GetEmpty(), FText::GetEmpty(), FText::GetEmpty(), 0, CreateNodeType);\n\t\treturn CastChecked<GraphNodeType>(Action.PerformAction(ParentGraph, nullptr, Location, bSelectNewNode));\n\t}\n\nprivate:\n\t/** Creates a new dialogue node from the template */\n\tUEdGraphNode* CreateNode(UDlgDialogue* Dialogue, UEdGraph* ParentGraph, UEdGraphPin* FromPin, FVector2D Location, bool bSelectNewNode);\n\n\t/** Connects new node to output of selected nodes */\n//\tvoid ConnectToSelectedNodes(UDialogueNode* NewNodeclass, UEdGraph* ParentGraph) const;\n\n\t// The node type used for when creating a new node (used by CreateNode)\n\tTSubclassOf<UDlgNode> CreateNodeType;\n};\n\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystemEditor/Private/DialogueEditor/IDialogueEditor.h",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#pragma once\n\n#include \"Toolkits/AssetEditorToolkit.h\"\n\nclass IDialogueEditor : public FAssetEditorToolkit\n{\npublic:\n\t// Get the currently selected set of nodes\n\tvirtual TSet<UObject*> GetSelectedNodes() const = 0;\n\n\t// Get the bounding area for the currently selected nodes\n\t//\n\t// @param Rect Final output bounding area, including padding\n\t// @param Padding An amount of padding to add to all sides of the bounds\n\t//\n\t// @return false if nothing is selected\n\tvirtual bool GetBoundsForSelectedNodes(class FSlateRect& Rect, float Padding) const = 0;\n\n\t// Refreshes the details panel with the Dialogue\n\tvirtual void RefreshDetailsView(bool bRestorePreviousSelection) = 0;\n\n\t// Refresh the viewport and property/details panel.\n\tvirtual void Refresh(bool bRestorePreviousSelection) = 0;\n\n\t// Useful for setting the last target node on drop operations.\n\tvirtual UDialogueGraphNode_Edge* GetLastTargetGraphEdgeBeforeDrag() const = 0;\n\tvirtual void SetLastTargetGraphEdgeBeforeDrag(UDialogueGraphNode_Edge* InEdge) = 0;\n\n\t// Jump selection to the selected object.\n\tvirtual void JumpToObject(const UObject* Object) = 0;\n};\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystemEditor/Private/DialogueEditor/Nodes/DialogueGraphNode.cpp",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#include \"DialogueGraphNode.h\"\n\n#include \"Editor/EditorEngine.h\"\n#include \"Framework/Commands/GenericCommands.h\"\n#include \"EdGraph/EdGraphNode.h\"\n#include \"Engine/Font.h\"\n#include \"Framework/MultiBox/MultiBoxBuilder.h\"\n\n#if ENGINE_MINOR_VERSION >= 24\n#include \"ToolMenu.h\"\n#endif\n\n#include \"DlgSystemEditorModule.h\"\n#include \"DlgDialogue.h\"\n#include \"DialogueGraphNode_Edge.h\"\n#include \"DialogueCommands.h\"\n#include \"DlgSystemSettings.h\"\n\n#define LOCTEXT_NAMESPACE \"DialogueGraphNode\"\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// Begin UObject interface\nvoid UDialogueGraphNode::PostLoad()\n{\n\tSuper::PostLoad();\n\n\t// Fixup any DialogueNode back pointers that may be out of date\n\tif (DialogueNode)\n\t{\n\t\tDialogueNode->SetGraphNode(this);\n\t\tDialogueNode->SetFlags(RF_Transactional);\n\t}\n}\n\nvoid UDialogueGraphNode::PostEditImport()\n{\n\tRegisterListeners();\n\n\t// Make sure this DialogueNode is owned by the Dialogue it's being pasted into.\n\t// The paste can come from another Dialogue\n\tResetDialogueNodeOwner();\n}\n\nvoid UDialogueGraphNode::PostEditChangeProperty(FPropertyChangedEvent& PropertyChangedEvent)\n{\n\tSuper::PostEditChangeProperty(PropertyChangedEvent);\n\tif (!PropertyChangedEvent.Property)\n\t{\n\t\treturn;\n\t}\n\n\tCheckAll();\n\tApplyCompilerWarnings();\n}\n\nvoid UDialogueGraphNode::PostEditChangeChainProperty(struct FPropertyChangedChainEvent& PropertyChangedEvent)\n{\n\tSuper::PostEditChangeChainProperty(PropertyChangedEvent);\n}\n\nbool UDialogueGraphNode::Modify(bool bAlwaysMarkDirty)\n{\n\tif (!CanModify())\n\t{\n\t\treturn false;\n\t}\n\n\tbool bWasModified = Super::Modify(bAlwaysMarkDirty);\n\n\t// Notify the Dialogue structure and the edge nodes of modification\n\tif (DialogueNode)\n\t{\n\t\tbWasModified = bWasModified && DialogueNode->Modify(bAlwaysMarkDirty);\n\t}\n\n\t// Special case when this method is called when the engine is starting\n\tif (HasOutputPin())\n\t{\n\t\t// Can happen when copy pasting nodes\n\t\tconstexpr bool bCheckParent = false;\n\t\tfor (UDialogueGraphNode_Edge* EdgeNode : GetChildEdgeNodes(bCheckParent))\n\t\t{\n\t\t\tbWasModified = bWasModified && EdgeNode->SuperModify();\n\t\t}\n\t}\n\n\treturn bWasModified;\n}\n// End UObject interface\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// Begin UEdGraphNode interface\nFText UDialogueGraphNode::GetNodeTitle(ENodeTitleType::Type TitleType) const\n{\n\tif (NodeIndex == INDEX_NONE)\n\t{\n\t\treturn Super::GetNodeTitle(TitleType);\n\t}\n\n\tconst FString FullString = DialogueNode->GetNodeParticipantName().ToString();\n\t// Display the full title\n\treturn FText::FromString(FullString);\n}\n\nvoid UDialogueGraphNode::PrepareForCopying()\n{\n\tSuper::PrepareForCopying();\n\n\t// Temporarily take ownership of the DialogueNode, so that it is not deleted when cutting\n\tif (DialogueNode)\n\t{\n\t\tDialogueNode->Rename(nullptr, this, REN_DontCreateRedirectors);\n\t}\n}\n\nvoid UDialogueGraphNode::PostCopyNode()\n{\n\tSuper::PostCopyNode();\n\t// Make sure the DialogueNode goes back to being owned by the Dialogue after copying.\n\tResetDialogueNodeOwner();\n}\n\nFString UDialogueGraphNode::GetDocumentationExcerptName() const\n{\n\t// Default the node to searching for an excerpt named for the C++ node class name, including the U prefix.\n\t// This is done so that the excerpt name in the doc file can be found by find-in-files when searching for the full class name.\n//\tUClass* MyClass = DialogueNode != nullptr ? DialogueNode->GetClass() : this->GetClass();\n//\treturn FString::Printf(TEXT(\"%s%s\"), MyClass->GetPrefixCPP(), *MyClass->GetName());\n\treturn \"\";\n}\n\nFText UDialogueGraphNode::GetTooltipText() const\n{\n\tFFormatNamedArguments Args;\n\tArgs.Add(TEXT(\"ParticipantName\"), DialogueNode ? FText::FromName(DialogueNode->GetNodeParticipantName()) : FText::GetEmpty());\n\tArgs.Add(TEXT(\"NodeType\"), DialogueNode ? FText::FromString(DialogueNode->GetNodeTypeString()) : FText::GetEmpty());\n\tArgs.Add(TEXT(\"Description\"), DialogueNode ? FText::FromString(DialogueNode->GetDesc()) : FText::GetEmpty());\n\treturn FText::Format(LOCTEXT(\"GraphNodeTooltip\", \"ParticipantName = {ParticipantName}\\nType = {NodeType}\\n{Description}\"), Args);\n}\n\nvoid UDialogueGraphNode::PinConnectionListChanged(UEdGraphPin* Pin)\n{\n\t// NOTE: GraphNode.OutputPin.LinkedTo are kept in sync with the DialogueNode.Children\n\tcheck(Pin->GetOwningNode() == this);\n\tcheck(DialogueNode->GetNodeOpenChildren_DEPRECATED().Num() == 0);\n\n\t// Input pins are ignored, as they are not reliable source of information, each node should only work with its output pins\n\tif (Pin->Direction == EGPD_Input)\n\t{\n\t\treturn;\n\t}\n\n\t// Handle Output Pin (this node)\n\tcheck(Pin->Direction == EGPD_Output);\n\tconst UEdGraphPin* OutputPin = GetOutputPin();\n\t// Only one Pin, and that pin should be our output pinOutputPin\n\tcheck(Pin == OutputPin);\n\n\tconst int32 DialogueNodeChildrenNum = DialogueNode->GetNodeChildren().Num();\n\tconst int32 GraphNodeChildrenNum = OutputPin->LinkedTo.Num();\n\n\t// Nothing added/removed, maybe something replaced?\n\tif (DialogueNodeChildrenNum == GraphNodeChildrenNum)\n\t{\n#if DO_CHECK\n\t\tconst FDiffNodeEdgeLinkedToPinResult& DiffResult = FindDifferenceBetweenNodeEdgesAndLinkedToPins();\n\t\tcheck(DiffResult.Index == INDEX_NONE);\n\t\tcheck(DiffResult.Type == FDiffNodeEdgeLinkedToPinResult::EDiffType::NO_DIFFERENCE);\n#endif\n\t}\n\t// Some link was added/removed\n\telse if (DialogueNodeChildrenNum < GraphNodeChildrenNum)\n\t{\n\t\t// Output link added, extend the number of children\n\t\t// Not handled here, as everytime we just add at the end of the array.\n\t\t// See UDialogueGraphNode_Edge::CreateConnections\n\t}\n\telse\n\t{\n\t\t// One Output link removed, reduce the number of linked children\n\t\tcheck(DialogueNodeChildrenNum > GraphNodeChildrenNum);\n\t\tif (GraphNodeChildrenNum == 0)\n\t\t{\n\t\t\t// All nodes were removed, node is most likely going to be removed\n\t\t\tDialogueNode->RemoveAllChildren();\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// Only one\n\t\t\tconst FDiffNodeEdgeLinkedToPinResult DiffResult = FindDifferenceBetweenNodeEdgesAndLinkedToPins();\n\t\t\tcheck(DiffResult.Type == FDiffNodeEdgeLinkedToPinResult::EDiffType::LENGTH_MISMATCH_ONE_MORE_EDGE ||\n\t\t\t\tDiffResult.Type == FDiffNodeEdgeLinkedToPinResult::EDiffType::EDGE_NOT_MATCHING_INDEX);\n\t\t\tDialogueNode->RemoveChildAt(DiffResult.Index);\n\t\t}\n\t}\n}\n\n#if ENGINE_MINOR_VERSION >= 24\nvoid UDialogueGraphNode::GetNodeContextMenuActions(UToolMenu* Menu, UGraphNodeContextMenuContext* Context) const\n{\n\t// These actions (commands) are handled and registered in the FDialogueEditor class\n\tif (Context->Node && !Context->bIsDebugging && !IsRootNode())\n\t{\n\t\t// Menu for right clicking on node\n\t\tFToolMenuSection& Section = Menu->AddSection(\"DialogueGraphNode_BaseNodeEditCRUD\");\n\t\tif (IsSpeechSequenceNode())\n\t\t{\n\t\t\tContext.MenuBuilder->AddMenuEntry(FDialogueCommands::Get().ConvertSpeechSequenceNodeToSpeechNodes);\n\t\t}\n\t\tif (IsSpeechNode()\n            && FDialogueEditorUtilities::CanConvertSpeechNodesToSpeechSequence(FDialogueEditorUtilities::GetSelectedNodes(Context.Graph)))\n\t\t{\n\t\t\tContext.MenuBuilder->AddMenuEntry(FDialogueCommands::Get().ConvertSpeechNodesToSpeechSequence);\n\t\t}\n\n\t\tSection.AddMenuEntry(FGenericCommands::Get().Delete);\n//\t\tSection.AddMenuEntry(FGenericCommands::Get().Cut);\n\t\tSection.AddMenuEntry(FGenericCommands::Get().Copy);\n//\t\tSection.AddMenuEntry(FGenericCommands::Get().Duplicate);\n\n\t}\n}\n\n#else\n\nvoid UDialogueGraphNode::GetContextMenuActions(const FGraphNodeContextMenuBuilder& Context) const\n{\n\t// These actions (commands) are handled and registered in the FDialogueEditor class\n\tif (Context.Node && !Context.bIsDebugging && !IsRootNode())\n\t{\n\t\t// Menu for right clicking on node\n\t\tContext.MenuBuilder->BeginSection(\"DialogueGraphNode_BaseNodeEditCRUD\");\n\t\t{\n\t\t\tif (IsSpeechSequenceNode())\n\t\t\t{\n\t\t\t\tContext.MenuBuilder->AddMenuEntry(FDialogueCommands::Get().ConvertSpeechSequenceNodeToSpeechNodes);\n\t\t\t}\n\t\t\tif (IsSpeechNode()\n\t\t\t\t&& FDialogueEditorUtilities::CanConvertSpeechNodesToSpeechSequence(FDialogueEditorUtilities::GetSelectedNodes(Context.Graph)))\n\t\t\t{\n\t\t\t\tContext.MenuBuilder->AddMenuEntry(FDialogueCommands::Get().ConvertSpeechNodesToSpeechSequence);\n\t\t\t}\n\n\t\t\tContext.MenuBuilder->AddMenuEntry(FGenericCommands::Get().Delete);\n//\t\t\tContext.MenuBuilder->AddMenuEntry(FGenericCommands::Get().Cut);\n\t\t\tContext.MenuBuilder->AddMenuEntry(FGenericCommands::Get().Copy);\n//\t\t\tContext.MenuBuilder->AddMenuEntry(FGenericCommands::Get().Duplicate);\n\t\t}\n\t\tContext.MenuBuilder->EndSection();\n\t}\n}\n#endif // ENGINE_MINOR_VERSION >= 24\n\nvoid UDialogueGraphNode::AutowireNewNode(UEdGraphPin* FromPin)\n{\n\t// No context given, simply return\n\tif (FromPin == nullptr)\n\t{\n\t\treturn;\n\t}\n\n\t// FromPin should not belong to this node but to the node that spawned this node.\n\tcheck(FromPin->GetOwningNode() != this);\n\tcheck(FromPin->Direction == EGPD_Output);\n\n\tUEdGraphPin* InputpIn = GetInputPin();\n\tconst UDialogueGraphSchema* Schema = GetDialogueGraphSchema();\n\n\t// auto-connect from dragged pin to first compatible pin on the new node\n\tverify(Schema->TryCreateConnection(FromPin, InputpIn));\n\tFromPin->GetOwningNode()->NodeConnectionListChanged();\n}\n// End UEdGraphNode interface\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// Begin UDialogueGraphNode_Base interface\nFLinearColor UDialogueGraphNode::GetNodeBackgroundColor() const\n{\n\tif (NodeIndex == INDEX_NONE)\n\t{\n\t\treturn FLinearColor::Black;\n\t}\n\n\tconst UDlgSystemSettings* Settings = GetDefault<UDlgSystemSettings>();\n\tif (IsSpeechNode())\n\t{\n\t\tif (IsVirtualParentNode())\n\t\t{\n\t\t\treturn Settings->VirtualParentNodeColor;\n\t\t}\n\n\t\treturn Settings->SpeechNodeColor;\n\t}\n\n\tif (IsSelectorNode())\n\t{\n\t\tif (IsSelectorFirstNode())\n\t\t{\n\t\t\treturn Settings->SelectorFirstNodeColor;\n\t\t}\n\n\t\tif (IsSelectorRandomNode())\n\t\t{\n\t\t\treturn Settings->SelectorRandomNodeColor;\n\t\t}\n\n\t\t// should not reach here, like never\n\t\tcheckNoEntry();\n\t}\n\n\tif (IsSpeechSequenceNode())\n\t{\n\t\treturn Settings->SpeechSequenceNodeColor;\n\t}\n\n\tif (IsEndNode())\n\t{\n\t\treturn Settings->EndNodeColor;\n\t}\n\n\treturn FLinearColor::Black;\n}\n\nbool UDialogueGraphNode::HasOutputConnectionToNode(const UEdGraphNode* TargetNode) const\n{\n\tfor (UDialogueGraphNode* ChildNode : GetChildNodes())\n\t{\n\t\tif (ChildNode == TargetNode)\n\t\t{\n\t\t\treturn true;\n\t\t}\n\t}\n\n\treturn false;;\n}\n\nvoid UDialogueGraphNode::RegisterListeners()\n{\n\tSuper::RegisterListeners();\n\tDialogueNode->OnDialogueNodePropertyChanged.AddUObject(this, &UDialogueGraphNode::OnDialogueNodePropertyChanged);\n}\n// End UDialogueGraphNode_Base interface\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// Begin own functions\nbool UDialogueGraphNode::HasVoicePropertiesSet() const\n{\n\tif (!IsValid(DialogueNode))\n\t{\n\t\treturn false;\n\t}\n\n\t// Try simple node\n\tif (DialogueNode->GetNodeVoiceSoundWave() != nullptr || DialogueNode->GetNodeVoiceDialogueWave() != nullptr)\n\t{\n\t\treturn true;\n\t}\n\n\t// Speech sequence node\n\tif (IsSpeechSequenceNode())\n\t{\n\t\tfor (const FDlgSpeechSequenceEntry Sequence : GetDialogueNode<UDlgNode_SpeechSequence>().GetNodeSpeechSequence())\n\t\t{\n\t\t\tif (Sequence.VoiceSoundWave != nullptr || Sequence.VoiceDialogueWave != nullptr)\n\t\t\t{\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn false;\n}\n\nbool UDialogueGraphNode::HasGenericDataSet() const\n{\n\tif (!IsValid(DialogueNode))\n\t{\n\t\treturn false;\n\t}\n\n\t// Try simple node\n\tif (DialogueNode->GetNodeGenericData() != nullptr)\n\t{\n\t\treturn true;\n\t}\n\n\t// Speech sequence node\n\tif (IsSpeechSequenceNode())\n\t{\n\t\tfor (const FDlgSpeechSequenceEntry Sequence : GetDialogueNode<UDlgNode_SpeechSequence>().GetNodeSpeechSequence())\n\t\t{\n\t\t\tif (Sequence.GenericData != nullptr)\n\t\t\t{\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn false;\n}\n\nvoid UDialogueGraphNode::SetDialogueNodeDataChecked(int32 InIndex, UDlgNode* InNode)\n{\n\tconst UDlgDialogue* Dialogue = GetDialogue();\n\tcheckf(Dialogue->GetNodes()[InIndex] == InNode, TEXT(\"The selected index = %d and with the Node provided does not match the Node from the Dialogue\"), InIndex);\n\n\tSetDialogueNodeIndex(InIndex);\n\tSetDialogueNode(InNode);\n}\n\nint32 UDialogueGraphNode::GetChildEdgeIndexForChildNodeIndex(int32 ChildNodeIndex) const\n{\n\tconst TArray<UDialogueGraphNode_Edge*> GraphNodeEdges = GetChildEdgeNodes();\n\tfor (int32 EdgeIndex = 0; EdgeIndex < GraphNodeEdges.Num(); EdgeIndex++)\n\t{\n\t\tconst UDialogueGraphNode_Edge* GraphEdge = GraphNodeEdges[EdgeIndex];\n\t\tif (!GraphEdge->HasChildNode())\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (GraphEdge->GetChildNode()->GetDialogueNodeIndex() == ChildNodeIndex)\n\t\t{\n\t\t\treturn EdgeIndex;\n\t\t}\n\t}\n\n\treturn INDEX_NONE;\n}\n\nvoid UDialogueGraphNode::SetEdgeTargetIndexAt(int32 EdgeIndex, int32 NewTargetIndex)\n{\n\tcheck(NewTargetIndex > INDEX_NONE);\n\tconst TArray<UDialogueGraphNode_Edge*> GraphNodeEdges = GetChildEdgeNodes();\n\tcheck(DialogueNode->GetNodeChildren().Num() == GraphNodeEdges.Num());\n\tcheck(GraphNodeEdges.IsValidIndex(EdgeIndex));\n\n\tDialogueNode->GetSafeMutableNodeChildAt(EdgeIndex)->TargetIndex = NewTargetIndex;\n\tGraphNodeEdges[EdgeIndex]->SetDialogueEdgeTargetIndex(NewTargetIndex);\n}\n\nvoid UDialogueGraphNode::SetEdgeTextAt(int32 EdgeIndex, const FText& NewText)\n{\n\tconst TArray<UDialogueGraphNode_Edge*> GraphNodeEdges = GetChildEdgeNodes();\n\tcheck(DialogueNode->GetNodeChildren().Num() == GraphNodeEdges.Num());\n\tcheck(GraphNodeEdges.IsValidIndex(EdgeIndex));\n\n\tFDlgEdge* Edge = DialogueNode->GetSafeMutableNodeChildAt(EdgeIndex);\n\tEdge->SetText(NewText);\n\tGraphNodeEdges[EdgeIndex]->SetDialogueEdgeText(NewText);\n}\n\nvoid UDialogueGraphNode::SetEdges(const TArray<FDlgEdge>& InEdges)\n{\n\tconst TArray<UDialogueGraphNode_Edge*> GraphNodeEdges = GetChildEdgeNodes();\n\tcheck(InEdges.Num() == GraphNodeEdges.Num());\n\n\t// Set the edges on the Dialogue\n\tDialogueNode->SetNodeChildren(InEdges);\n\n\t// Set the edges on the edge nodes\n\tfor (int32 EdgeIndex = 0, EdgesNum = InEdges.Num(); EdgeIndex < EdgesNum; EdgeIndex++)\n\t{\n\t\tGraphNodeEdges[EdgeIndex]->SetDialogueEdge(InEdges[EdgeIndex]);\n\t}\n}\n\nvoid UDialogueGraphNode::UpdateEdgesFromDialogueNode()\n{\n\tconst TArray<UDialogueGraphNode_Edge*> GraphNodeEdges = GetChildEdgeNodes();\n\tconst int32 NumEdges = DialogueNode->GetNumNodeChildren();\n\tcheck(NumEdges == GraphNodeEdges.Num());\n\n\tfor (int32 EdgeIndex = 0; EdgeIndex < NumEdges; EdgeIndex++)\n\t{\n\t\tGraphNodeEdges[EdgeIndex]->SetDialogueEdge(DialogueNode->GetNodeChildAt(EdgeIndex));\n\t}\n}\n\nvoid UDialogueGraphNode::ApplyCompilerWarnings()\n{\n\tClearCompilerMessage();\n\n\t// Is Orphan node\n\tif (!IsRootNode() && GetInputPin()->LinkedTo.Num() == 0)\n\t{\n\t\tSetCompilerWarningMessage(TEXT(\"Node has no input connections (orphan). It will not be accessible from anywhere\"));\n\t}\n\telse if (DialogueNode->GetNodeOpenChildren_DEPRECATED().Num() > 0)\n\t{\n\t\t// Has open children :O\n\t\tSetCompilerWarningMessage(TEXT(\"Node has invalid (open) edges in its DialogueNode\"));\n\t}\n}\n\nint32 UDialogueGraphNode::EstimateNodeWidth() const\n{\n\tconstexpr int32 EstimatedCharWidth = 6;\n\t// Check which is bigger, and use that\n\tconst FString NodeTitle = GetNodeTitle(ENodeTitleType::FullTitle).ToString();\n\tconst FString NodeText = DialogueNode->GetNodeText().ToString();\n\n\tint32 Result;\n\tFString ResultFromString;\n\tif (NodeTitle.Len() > NodeText.Len())\n\t{\n\t\tResult = NodeTitle.Len() * EstimatedCharWidth;\n\t\tResultFromString = NodeTitle;\n\t}\n\telse\n\t{\n\t\tResult = NodeText.Len() * EstimatedCharWidth;\n\t\tResultFromString = NodeText;\n\t}\n\n\tif (const UFont* Font = GetDefault<UEditorEngine>()->EditorFont)\n\t{\n\t\tResult = Font->GetStringSize(*ResultFromString);\n\t}\n\n\treturn Result;\n}\n\nvoid UDialogueGraphNode::CheckDialogueNodeIndexMatchesNode() const\n{\n#if DO_CHECK\n\tif (!IsRootNode())\n\t{\n\t\tconst UDlgDialogue* Dialogue = GetDialogue();\n\t\tcheckf(Dialogue->GetNodes()[NodeIndex] == DialogueNode, TEXT(\"The NodeIndex = %d with DialogueNode does not match the Node from the Dialogue at the same index\"), NodeIndex);\n\t}\n#endif\n}\n\nvoid UDialogueGraphNode::CheckDialogueNodeSyncWithGraphNode(bool bStrictCheck) const\n{\n#if DO_CHECK\n\tconst UEdGraphPin* OutputPin = GetOutputPin();\n\tconst TArray<FDlgEdge>& NodeEdges = DialogueNode->GetNodeChildren();\n\tconst int32 EdgesNum = NodeEdges.Num();\n\tconst int32 PinsLinkedToNum = OutputPin->LinkedTo.Num();\n\tcheck(PinsLinkedToNum == GetChildNodes().Num());\n\tcheckf(\n\t\tEdgesNum == PinsLinkedToNum,\n\t\tTEXT(\"The node with OLD index = %d does not have the number of PinsLinkedToNum (%d) equal to the EdgesNum (%d) in it's FDlgNode (DialogueNode)\"),\n\t\tNodeIndex, PinsLinkedToNum, EdgesNum\n\t);\n\n\tconst int32 OpenEdgesNum = DialogueNode->GetNodeOpenChildren_DEPRECATED().Num();\n\tcheckf(\n\t\tOpenEdgesNum == 0,\n\t\tTEXT(\"The node with OLD index = %d has open output pins (%d), this should not be allowed\"),\n\t\tNodeIndex, OpenEdgesNum\n\t);\n\n\tcheckf(\n\t\tDialogueNode->GetGraphNode() == this,\n\t\tTEXT(\"The node with OLD index = %d does not have the DialogueNode.GraphNode == this (graph node)\"),\n\t\tNodeIndex\n\t);\n\n\t// Check if Edges have the same openness as the output pins\n\tif (bStrictCheck)\n\t{\n\t\tfor (int32 EdgeIndex = 0; EdgeIndex < EdgesNum; EdgeIndex++)\n\t\t{\n\t\t\tFString OutMessage;\n\t\t\tconst FDlgEdge& Edge = NodeEdges[EdgeIndex];\n\t\t\tif (!DoesEdgeMatchEdgeIndex(Edge, EdgeIndex, OutMessage))\n\t\t\t{\n\t\t\t\tcheckf(\n\t\t\t\t\tfalse,\n\t\t\t\t\tTEXT(\"The node with OLD index = %d does not have the dialogue edge at index = %d matching the Edge in the GraphNode. Error message = `%s`\"),\n\t\t\t\t\tNodeIndex, EdgeIndex, *OutMessage\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n#endif\n}\n\nTArray<UDialogueGraphNode*> UDialogueGraphNode::GetParentNodes() const\n{\n\t// (input pin) ParentNode (output pin) -> (input pin) EdgeNode aka ParentEdgeConnection (output pin) -> (input pin) ThisNode (output pin)\n\tTArray<UDialogueGraphNode*> ParentNodes;\n\tfor (const UDialogueGraphNode_Edge* ParentEdgeConnection : GetParentEdgeNodes())\n\t{\n\t\tParentNodes.Add(ParentEdgeConnection->GetParentNode());\n\t}\n\n\treturn ParentNodes;\n}\n\nTArray<UDialogueGraphNode*> UDialogueGraphNode::GetChildNodes() const\n{\n\t// (input pin) ThisNode (output pin) -> (input pin) EdgeNode aka ChildEdgeConnection (output pin) -> (input pin) ChildNode (output pin)\n\tTArray<UDialogueGraphNode*> ChildNodes;\n\tfor (const UDialogueGraphNode_Edge* ChildEdgeConnection : GetChildEdgeNodes())\n\t{\n\t\tChildNodes.Add(ChildEdgeConnection->GetChildNode());\n\t}\n\n\treturn ChildNodes;\n}\n\nTArray<UDialogueGraphNode_Edge*> UDialogueGraphNode::GetParentEdgeNodes(bool bCheckChild /*= true*/) const\n{\n\t// (input pin) ParentNode (output pin) -> (input pin) EdgeNode aka ParentEdgeConnection (EdgeOutputPin) -> (input pin) ThisNode (output pin)\n\tTArray<UDialogueGraphNode_Edge*> ParentEdgeNodes;\n\tfor (const UEdGraphPin* EdgeOutputPin : GetInputPin()->LinkedTo)\n\t{\n\t\tUDialogueGraphNode_Edge* ParentEdgeConnection = CastChecked<UDialogueGraphNode_Edge>(EdgeOutputPin->GetOwningNode());\n\n#if DO_CHECK\n\t\tif (bCheckChild)\n\t\t{\n\t\t\tcheck(ParentEdgeConnection->GetChildNode() == this);\n\t\t}\n#endif\n\n\t\tParentEdgeNodes.Add(ParentEdgeConnection);\n\t}\n\n\treturn ParentEdgeNodes;\n}\n\nTArray<UDialogueGraphNode_Edge*> UDialogueGraphNode::GetChildEdgeNodes(bool bCheckParent /*= true*/) const\n{\n\t// (input pin) ThisNode (output pin) -> (EdgeInputPin) EdgeNode aka ChildEdgeConnection (output pin) -> (input pin) ChildNode (output pin)\n\tTArray<UDialogueGraphNode_Edge*> ChildEdgeNodes;\n\tfor (const UEdGraphPin* EdgeInputPin : GetOutputPin()->LinkedTo)\n\t{\n\t\tUDialogueGraphNode_Edge* ChildEdgeConnection = CastChecked<UDialogueGraphNode_Edge>(EdgeInputPin->GetOwningNode());\n\n#if DO_CHECK\n\t\tif (bCheckParent)\n\t\t{\n\t\t\tcheck(ChildEdgeConnection->GetParentNode() == this);\n\t\t}\n#endif\n\n\t\tChildEdgeNodes.Add(ChildEdgeConnection);\n\t}\n\n\treturn ChildEdgeNodes;\n}\n\nbool UDialogueGraphNode::HasChildEdgeNode(const UDialogueGraphNode_Edge* ChildEdgeToFind) const\n{\n\tif (!HasOutputPin())\n\t{\n\t\treturn false;\n\t}\n\n\t// (input pin) ThisNode (output pin) -> (EdgeInputPin) EdgeNode aka ChildEdgeConnection (output pin) -> (input pin) ChildNode (output pin)\n\tfor (const UEdGraphPin* EdgeInputPin : GetOutputPin()->LinkedTo)\n\t{\n\t\tif (const UDialogueGraphNode_Edge* ChildEdgeConnection = Cast<UDialogueGraphNode_Edge>(EdgeInputPin->GetOwningNodeUnchecked()))\n\t\t{\n\t\t\tif (ChildEdgeToFind == ChildEdgeConnection)\n\t\t\t{\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn false;\n}\n\nbool UDialogueGraphNode::HasParentEdgeNode(const UDialogueGraphNode_Edge* ParentEdgeToFind) const\n{\n\tif (!HasInputPin())\n\t{\n\t\treturn false;\n\t}\n\n\t// (input pin) ParentNode (output pin) -> (input pin) EdgeNode aka ParentEdgeConnection (EdgeOutputPin) -> (input pin) ThisNode (output pin)\n\tfor (const UEdGraphPin* EdgeOutputPin : GetInputPin()->LinkedTo)\n\t{\n\t\tif (const UDialogueGraphNode_Edge* ParentEdgeConnection = Cast<UDialogueGraphNode_Edge>(EdgeOutputPin->GetOwningNodeUnchecked()))\n\t\t{\n\t\t\tif (ParentEdgeToFind == ParentEdgeConnection)\n\t\t\t{\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn false;\n}\n\nstruct FCompareNodeXLocation\n{\n\tFORCEINLINE bool operator()(const TPair<UEdGraphPin*, FDlgEdge>& A, const TPair<UEdGraphPin*, FDlgEdge>& B) const\n\t{\n\t\tconst UEdGraphNode* NodeA = A.Key->GetOwningNode();\n\t\tconst UEdGraphNode* NodeB = B.Key->GetOwningNode();\n\t\treturn NodeA->NodePosX != NodeB->NodePosX ? NodeA->NodePosX < NodeB->NodePosX : NodeA->NodePosY < NodeB->NodePosY;\n\t}\n};\n\nvoid UDialogueGraphNode::SortChildrenBasedOnXLocation()\n{\n\t// Holds an array of synced pairs, each pair corresponds to a linked to output pin and corresponding dialogue edge\n\tTArray<TPair<UEdGraphPin*, FDlgEdge>> SyncedArray;\n\n\tUEdGraphPin* OutputPin = GetOutputPin();\n\tconst TArray<UEdGraphPin*> ChildPins = OutputPin->LinkedTo;\n\tconst TArray<FDlgEdge>& ChildDialogueNodeEdges = DialogueNode->GetNodeChildren();\n\tcheck(ChildPins.Num() == ChildDialogueNodeEdges.Num());\n\n\t// Step 1. Construct the synced array\n\tconst int32 ChildrenNum = ChildPins.Num();\n\tSyncedArray.Reserve(ChildrenNum);\n\tfor (int32 ChildIndex = 0; ChildIndex < ChildrenNum; ChildIndex++)\n\t{\n\t\tSyncedArray.Emplace(ChildPins[ChildIndex], ChildDialogueNodeEdges[ChildIndex]);\n\t}\n\n\t// Step 2. Sort the synced array\n\tSyncedArray.Sort(FCompareNodeXLocation());\n\n\t// Step 3. Reconstruct the output pins/edges from the sorted synced array\n\tOutputPin->LinkedTo.Empty();\n\tDialogueNode->RemoveAllChildren();\n\tfor (const TPair<UEdGraphPin*, FDlgEdge>& SyncedPair : SyncedArray)\n\t{\n\t\tOutputPin->LinkedTo.Add(SyncedPair.Key);\n\t\tDialogueNode->AddNodeChild(SyncedPair.Value);\n\t}\n}\n\nvoid UDialogueGraphNode::OnDialogueNodePropertyChanged(const FPropertyChangedEvent& PropertyChangedEvent, int32 EdgeIndexChanged)\n{\n\tif (!PropertyChangedEvent.Property)\n\t{\n\t\treturn;\n\t}\n\n\t// Keep in sync the Edge Graph Node with the modified Edge from the Details Panel of the Parent Node\n\tconst TArray<FDlgEdge>& DialogueEdges = DialogueNode->GetNodeChildren();\n\tif (EdgeIndexChanged != INDEX_NONE)\n\t{\n\t\t// We know what edge changed, update that, most likelye and add/insert/modify\n\t\tconst TArray<UDialogueGraphNode_Edge*> ChildEdgeNodes = GetChildEdgeNodes();\n\t\tcheck(ChildEdgeNodes.IsValidIndex(EdgeIndexChanged))\n\n\t\t// Update the proxy edge node with the new edge\n\t\tChildEdgeNodes[EdgeIndexChanged]->SetDialogueEdge(DialogueEdges[EdgeIndexChanged]);\n\t}\n\telse\n\t{\n\t\t// We do not know that edge, update all, most likely remove\n\t\tconst TArray<UDialogueGraphNode_Edge*> ChildEdgeNodes = GetChildEdgeNodes();\n\t\tfor (int32 EdgeIndex = 0, EdgesNum = ChildEdgeNodes.Num(); EdgeIndex < EdgesNum; EdgeIndex++)\n\t\t{\n\t\t\t// Update the proxy edge node with the new edge\n\t\t\tChildEdgeNodes[EdgeIndex]->SetDialogueEdge(DialogueEdges[EdgeIndex]);\n\t\t}\n\t}\n}\n\nvoid UDialogueGraphNode::ResetDialogueNodeOwner()\n{\n\tif (!DialogueNode)\n\t{\n\t\treturn;\n\t}\n\n\tUDlgDialogue* Dialogue = GetDialogue();\n\n\t// Ensures DialogueNode is owned by the Dialogue\n\tif (DialogueNode->GetOuter() != Dialogue)\n\t{\n\t\tDialogueNode->Rename(nullptr, Dialogue, REN_DontCreateRedirectors);\n\t}\n\n\t// Set up the back pointer for newly created dialogue node nodes\n\tDialogueNode->SetGraphNode(this);\n\tDialogueNode->SetFlags(RF_Transactional);\n}\n\nconst FDiffNodeEdgeLinkedToPinResult UDialogueGraphNode::FindDifferenceBetweenNodeEdgesAndLinkedToPins() const\n{\n\tFDiffNodeEdgeLinkedToPinResult Result;\n\tconst UEdGraphPin* OutputPin = GetOutputPin();\n\tconst TArray<FDlgEdge>& NodeEdges = GetDialogueNode().GetNodeChildren();\n\tconst int32 EdgesNum = NodeEdges.Num();\n\tconst int32 LinkedToNum = OutputPin->LinkedTo.Num();\n\tconst bool bAreLengthsEqual = EdgesNum == LinkedToNum;\n\n\t// If EdgesNum > LinkedToNum, we are finding the (only) edge that is different from the linked pins\n\t// If LinkedToNum > EdgesNum, we are finding the (only) linked pin that is different from the edges\n\tif (!bAreLengthsEqual && FMath::Abs(EdgesNum - LinkedToNum) != 1)\n\t{\n\t\tUE_LOG(LogDlgSystemEditor, Error,\n\t\t\tTEXT(\"FindDifferenceBetweenNodeEdgesAndLinkedToPins: EdgesNum (%d) != LinkedToNum (%d), but function was called in the wrong context\"),\n\t\t\tEdgesNum, LinkedToNum);\n\t\tResult.Type = FDiffNodeEdgeLinkedToPinResult::EDiffType::NOT_SUPPORTED;\n\t\treturn Result;\n\t}\n\n\t// Try to find difference in common areas of both arrays\n\tfor (int32 Index = 0; Index < EdgesNum && Index < LinkedToNum; Index++)\n\t{\n\t\tconst FDlgEdge& Edge = NodeEdges[Index];\n\t\tif (!DoesEdgeMatchEdgeIndex(Edge, Index, Result.Message))\n\t\t{\n\t\t\tResult.Index = Index;\n\t\t\tResult.Type = FDiffNodeEdgeLinkedToPinResult::EDiffType::EDGE_NOT_MATCHING_INDEX;\n\t\t\t// Assume next Edge matches index\n#if DO_CHECK\n\t\t\tif (Index + 1 < EdgesNum && Index + 1 < LinkedToNum)\n\t\t\t{\n\t\t\t\tcheck(DoesEdgeMatchEdgeIndex(NodeEdges[Index + 1], Index, Result.Message));\n\t\t\t}\n#endif\n\n\t\t\treturn Result;\n\t\t}\n\t}\n\n\t// Did not find any result in the common indices area :(\n\tif (!bAreLengthsEqual && Result.Index == INDEX_NONE)\n\t{\n\t\tif (LinkedToNum > EdgesNum)\n\t\t{\n\t\t\t// Because LinkedToNum > EdgesNum, it means that the last edge was removed OR a pin connection was added\n\t\t\tResult.Index = LinkedToNum - 1;\n\t\t\tResult.Type = FDiffNodeEdgeLinkedToPinResult::EDiffType::LENGTH_MISMATCH_ONE_MORE_PIN_CONNECTION;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tcheck(EdgesNum > LinkedToNum);\n\t\t\t// Because EdgesNum > LinkedToNum, it means that the last linked to pin connection was removed OR an edge was added\n\t\t\tResult.Index = EdgesNum - 1;\n\t\t\tResult.Type = FDiffNodeEdgeLinkedToPinResult::EDiffType::LENGTH_MISMATCH_ONE_MORE_EDGE;\n\t\t}\n\t}\n\n\treturn Result;\n}\n\nbool UDialogueGraphNode::DoesEdgeMatchEdgeIndex(const FDlgEdge& Edge, int32 EdgeIndex, FString& OutMessage) const\n{\n\t// (input pin) ThisNode (ThisOutputPin) -> (EdgeInputPin) ChildEdgeConnection (output pin) -> (input pin) ChildNode (output pin)\n\tcheck(Edge.IsValid());\n\tUEdGraphPin* ThisOutputPin = GetOutputPin();\n\tif (!ThisOutputPin->LinkedTo.IsValidIndex(EdgeIndex))\n\t{\n\t\tOutMessage = FString::Printf(TEXT(\"The provided EdgeIndex = %d is not a valid index in the ThisOutputPin->LinkedTo Array\"), EdgeIndex);\n\t\treturn false;\n\t}\n\n\t// Check if Edge.TargetIndex matches the NodeIndex of the ChildNode\n\tconst UEdGraphPin* EdgeInputPin = ThisOutputPin->LinkedTo[EdgeIndex];\n\tcheck(EdgeInputPin->Direction == EGPD_Input);\n\n\t// Walk to child\n\tconst UDialogueGraphNode_Edge* ChildEdgeConnection = CastChecked<UDialogueGraphNode_Edge>(EdgeInputPin->GetOwningNode());\n\tconst UDialogueGraphNode* ChildNode = ChildEdgeConnection->GetChildNode();\n\tcheck(ChildNode != this);\n\n\t// Edge differs :(\n\tif (Edge != ChildEdgeConnection->GetDialogueEdge())\n\t{\n\t\tOutMessage = TEXT(\"The provided Edge does not match the ChildEdgeConnection.Edge\");\n\t\treturn false;\n\t}\n\n\t// Target node Index differs :(\n\tif (Edge.TargetIndex != ChildNode->GetDialogueNodeIndex())\n\t{\n\t\tOutMessage = FString::Printf(\n\t\t\tTEXT(\"The provided Edge.TargetIndex = %d is DIFFERENT from the ChildNode.NodeIndex = %d\"),\n\t\t\tEdge.TargetIndex, ChildNode->GetDialogueNodeIndex()\n\t\t);\n\t\treturn false;\n\t}\n\n\treturn true;\n}\n// End own functions\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n#undef LOCTEXT_NAMESPACE\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystemEditor/Private/DialogueEditor/Nodes/DialogueGraphNode.h",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#pragma once\n\n#include \"CoreTypes.h\"\n#include \"UObject/ObjectMacros.h\"\n\n#include \"Nodes/DlgNode_End.h\"\n#include \"Nodes/DlgNode_Speech.h\"\n#include \"Nodes/DlgNode_Selector.h\"\n#include \"Nodes/DlgNode_SpeechSequence.h\"\n#include \"DialogueGraphNode_Base.h\"\n\n#include \"DialogueGraphNode.generated.h\"\n\nclass UEdGraphPin;\nclass DialogueGraphNode_Edge;\nclass UToolMenu;\nclass UGraphNodeContextMenuContext;\n\n/** Result for a single difference between the Dialogue Node Edges and LinkedTo Array of the output pins */\nstruct FDiffNodeEdgeLinkedToPinResult\n{\n\tenum EDiffType\n\t{\n\t\tNO_DIFFERENCE = 0,\n\n\t\t// A result of DoesEdgeMatchEdgeIndex\n\t\tEDGE_NOT_MATCHING_INDEX,\n\n\t\t// The length of the arrays mismatch, there is one more edge (located at the end) than pin connection\n\t\tLENGTH_MISMATCH_ONE_MORE_EDGE,\n\n\t\t// The length of the arrays mismatch, there is one more pin connection (located at the end) than edges\n\t\tLENGTH_MISMATCH_ONE_MORE_PIN_CONNECTION,\n\n\t\t// Diff type not supported\n\t\tNOT_SUPPORTED\n\t};\n\n\t/** Tells us the type of diff */\n\tEDiffType Type = EDiffType::NO_DIFFERENCE;\n\n\t/**\n\t * Depending on the Type of diff this index can mean diferent things:\n\t * - EDGE_NOT_MATCHING_INDEX\n\t *\t\t- represents the Index number of both arrays that is different\n\t * - LENGTH_MISMATCH_ONE_MORE_EDGE\n\t *\t\t- represents the index (of the one more edge) that does not exist in the LinkedTo array but exists in the Edges array\n\t * - LENGTH_MISMATCH_ONE_MORE_PIN_CONNECTION\n\t *\t\t- represents the index (of the one more pin connection) that does not exist in the Edges array but exists in the LinkedTo array\n\t */\n\tint32 Index = INDEX_NONE;\n\n\t/** Some error message if any. */\n\tFString Message;\n};\n\nUCLASS()\nclass UDialogueGraphNode : public UDialogueGraphNode_Base\n{\n\tGENERATED_BODY()\n\npublic:\n\t//\n\t// Begin UObject Interface.\n\t//\n\n\t/**\n\t * Do any object-specific cleanup required immediately after loading an object,\n\t * and immediately after any undo/redo.\n\t */\n\tvoid PostLoad() override;\n\n\t/**\n\t * Called after importing property values for this object (paste, duplicate or .t3d import)\n\t * Allow the object to perform any cleanup for properties which shouldn't be duplicated or\n\t * are unsupported by the script serialization\n\t */\n\tvoid PostEditImport() override;\n\n\t/**\n\t * Called when a property on this object has been modified externally\n\t *\n\t * @param PropertyChangedEvent the property that was modified\n\t */\n\tvoid PostEditChangeProperty(FPropertyChangedEvent& PropertyChangedEvent) override;\n\n\t/**\n\t * This alternate version of PostEditChange is called when properties inside structs are modified.  The property that was actually modified\n\t * is located at the tail of the list.  The head of the list of the FNYStructProperty member variable that contains the property that was modified.\n\t */\n\tvoid PostEditChangeChainProperty(struct FPropertyChangedChainEvent& PropertyChangedEvent) override;\n\n\t/**\n\t * Note that the object will be modified.  If we are currently recording into the\n\t * transaction buffer (undo/redo), save a copy of this object into the buffer and\n\t * marks the package as needing to be saved.\n\t *\n\t * @param\tbAlwaysMarkDirty\tif true, marks the package dirty even if we aren't\n\t *\t\t\t\t\t\t\t\tcurrently recording an active undo/redo transaction\n\t * @return true if the object was saved to the transaction buffer\n\t */\n\tbool Modify(bool bAlwaysMarkDirty = true) override;\n\n\t//\n\t// Begin UEdGraphNode interface\n\t//\n\n\t/** Gets the name of this node, shown in title bar */\n\tFText GetNodeTitle(ENodeTitleType::Type TitleType) const override;\n\n\t/** Gets the tooltip to display when over the node */\n\tFText GetTooltipText() const override;\n\tFString GetDocumentationExcerptName() const override;\n\n\t/** Whether or not this node can be safely duplicated (via copy/paste, etc...) in the graph. */\n\tbool CanDuplicateNode() const override { return !IsRootNode(); }\n\n\t/** Whether or not this node can be deleted by user action. */\n\tbool CanUserDeleteNode() const override { return !IsRootNode(); }\n\n\t/** Perform any steps necessary prior to copying a node into the paste buffer */\n\tvoid PrepareForCopying() override;\n\n\t/**\n\t * Called when something external to this node has changed the connection list of any of the pins in the node\n\t *   - Different from PinConnectionListChanged as this is called outside of any loops iterating over our pins allowing\n\t *     us to do things like reconstruct the node safely without trashing pins we are already iterating on\n\t *   - Typically called after a user induced action like making a pin connection or a pin break\n\t */\n\tvoid NodeConnectionListChanged() override\n\t{\n\t\tCheckDialogueNodeSyncWithGraphNode(true);\n\t\tApplyCompilerWarnings();\n\t}\n\n\t/** Called when the connection list of one of the pins of this node is changed in the editor */\n\tvoid PinConnectionListChanged(UEdGraphPin* Pin) override;\n\n\t/** Gets a list of actions that can be done to this particular node */\n#if ENGINE_MINOR_VERSION >= 24\n\tvoid GetNodeContextMenuActions(UToolMenu* Menu, UGraphNodeContextMenuContext* Context) const override;\n#else\n\tvoid GetContextMenuActions(const FGraphNodeContextMenuBuilder& Context) const override;\n#endif\n\n\t/**\n\t * Autowire a newly created node.\n\t *\n\t * @param FromPin\tThe source pin that caused the new node to be created (typically a drag-release context menu creation).\n\t */\n\tvoid AutowireNewNode(UEdGraphPin* FromPin) override;\n\n\t// Begin UDialogueGraphNode_Base interface\n\n\t/** Checks whether an input connection can be added to this node */\n\tbool CanHaveInputConnections() const override { return NodeIndex != INDEX_NONE && !IsRootNode(); }\n\n\t/** Checks whether an output connection can be added from this node */\n\tbool CanHaveOutputConnections() const override { return !IsEndNode(); }\n\n\t/** Checks if this node has a output connection to the TargetNode. */\n\tbool HasOutputConnectionToNode(const UEdGraphNode* TargetNode) const override;\n\n\t/** Gets the background color of this node. */\n\tFLinearColor GetNodeBackgroundColor() const override;\n\n\t/** Perform any fixups (deep copies of associated data, etc...) necessary after a node has been copied in the editor. */\n\tvoid PostCopyNode() override;\n\n\t/** Perform all checks */\n\tvoid CheckAll() const override\n\t{\n#if DO_CHECK\n\t\tSuper::CheckAll();\n\t\tcheck(IsDialogueNodeSet());\n\t\tCheckDialogueNodeIndexMatchesNode();\n\t\tCheckDialogueNodeSyncWithGraphNode(true);\n#endif\n\t}\n\n\t/** Is this the undeletable root node */\n\tvirtual bool IsRootNode() const { return false; }\n\n\t//\n\t// Begin own functions\n\t//\n\n\t/** Is this an End Node? */\n\tbool IsEndNode() const { return DialogueNode->IsA<UDlgNode_End>(); }\n\n\t/** Is this a Speech Node? */\n\tbool IsSpeechNode() const { return DialogueNode->IsA<UDlgNode_Speech>(); }\n\n\t/** Is this a virtual parent Node? */\n\tbool IsVirtualParentNode() const\n\t{\n\t\tif (const UDlgNode_Speech* Node = Cast<UDlgNode_Speech>(DialogueNode))\n\t\t{\n\t\t\treturn Node->IsVirtualParent();\n\t\t}\n\n\t\treturn false;\n\t}\n\n\t/** Is this a selector Node? */\n\tbool IsSelectorNode() const { return DialogueNode->IsA<UDlgNode_Selector>(); }\n\n\t/** Is this a selector First Node? */\n\tbool IsSelectorFirstNode() const\n\t{\n\t\tif (const UDlgNode_Selector* Node = Cast<UDlgNode_Selector>(DialogueNode))\n\t\t{\n\t\t\treturn Node->GetSelectorType() == EDlgNodeSelectorType::First;\n\t\t}\n\n\t\treturn false;\n\t}\n\n\t/** Is this a selector Random Node? */\n\tbool IsSelectorRandomNode() const\n\t{\n\t\tif (const UDlgNode_Selector* Node = Cast<UDlgNode_Selector>(DialogueNode))\n\t\t{\n\t\t\treturn Node->GetSelectorType() == EDlgNodeSelectorType::Random;\n\t\t}\n\n\t\treturn false;\n\t}\n\n\t/** Is this a Speech Sequence Node? */\n\tbool IsSpeechSequenceNode() const { return DialogueNode->IsA<UDlgNode_SpeechSequence>(); }\n\n\t/** Does this node has any enter conditions? */\n\tbool HasEnterConditions() const\n\t{\n\t\treturn DialogueNode ? DialogueNode->HasAnyEnterConditions() : false;\n\t}\n\n\t/** Does this node has any enter events? */\n\tbool HasEnterEvents() const\n\t{\n\t\treturn DialogueNode ? DialogueNode->HasAnyEnterEvents() : false;\n\t}\n\n\t/** Does this node has any voice properties set? */\n\tbool HasVoicePropertiesSet() const;\n\n\t/** Does this node has any voice properties set? */\n\tbool HasGenericDataSet() const;\n\n\t/** Gets the node depth in the graph. */\n\tint32 GetNodeDepth() const { return NodeDepth; }\n\n\t/** Sets the new node depth. */\n\tvoid SetNodeDepth(int32 NewNodeDepth) { NodeDepth = NewNodeDepth; }\n\n\t/** Sets the Dialogue Node. */\n\tvirtual void SetDialogueNode(UDlgNode* InNode)\n\t{\n\t\tDialogueNode = InNode;\n\t\tDialogueNode->SetFlags(RF_Transactional);\n\t\tDialogueNode->SetGraphNode(this);\n\t\tRegisterListeners();\n\t}\n\n\t/** Sets the Dialogue node index number, this represents the index from the DlgDialogue.Nodes Array */\n\tvirtual void SetDialogueNodeIndex(int32 InIndex)\n\t{\n\t\tcheck(InIndex > INDEX_NONE);\n\t\tNodeIndex = InIndex;\n\t}\n\n\t// Where should the edges pointing to this node be positioned at\n\t// NOTE: we use this because otherwise the edges don't get rendered\n\tFIntPoint GetDefaultEdgePosition() const { return GetPosition() + FIntPoint(5, 5); }\n\n\n\t/**\n\t * The same SetDialogueNodeIndex and SetDialogueNode only that it sets them both at once and it does some sanity checking\n\t * such as verifying the index is valid in the Dialogue node and that the index corresponds to this InNode.\n\t */\n\tvoid SetDialogueNodeDataChecked(int32 InIndex, UDlgNode* InNode);\n\n\t/** Gets the copy of the DlgNode stored by this graph node */\n\ttemplate <typename DlgNodeType>\n\tconst DlgNodeType& GetDialogueNode() const { return *CastChecked<DlgNodeType>(DialogueNode); }\n\n\t/** Gets the copy of the DlgNode stored by this graph node as a mutable pointer */\n\ttemplate <typename DlgNodeType>\n\tDlgNodeType* GetMutableDialogueNode() { return CastChecked<DlgNodeType>(DialogueNode); }\n\n\t// Specialization for the methods above  (by overloading) for the base type UDlgNode type so that we do not need to cast\n\tconst UDlgNode& GetDialogueNode() const { return *DialogueNode; }\n\tUDlgNode* GetMutableDialogueNode() const { return DialogueNode; }\n\n\t/** Tells us if the Dialogue Node is valid non null. */\n\tbool IsDialogueNodeSet() const { return DialogueNode != nullptr; }\n\n\t/** Gets the Dialogue node index number for the DlgDialogue.Nodes Array */\n\tvirtual int32 GetDialogueNodeIndex() const { return NodeIndex; }\n\n\t/** Gets the edge inside fromGraphNodeEdges for the ChildNodeIndex  */\n\tint32 GetChildEdgeIndexForChildNodeIndex(int32 ChildNodeIndex) const;\n\n\t/** Sets a new TargetIndex for the Edge at location EdgeIndex.  */\n\tvoid SetEdgeTargetIndexAt(int32 EdgeIndex, int32 NewTargetIndex);\n\n\t/** Sets a new Text for the Edge at location EdgeIndex.  */\n\tvoid SetEdgeTextAt(int32 EdgeIndex, const FText& NewText);\n\n\t// Sets all the node children (edges).\n\t// NOTE: USE WITH CAUTION\n\tvoid SetEdges(const TArray<FDlgEdge>& InEdges);\n\n\t// Updates the edges data from the DialogueNode\n\t// NOTE: USE WITH CAUTION\n\tvoid UpdateEdgesFromDialogueNode();\n\n\t/** Checks the node for warnings and applies the compiler warnings messages */\n\tvoid ApplyCompilerWarnings();\n\n\t/** Estimate the width of this Node from the length of its content */\n\tint32 EstimateNodeWidth() const;\n\n\t/** Checks Dialogue.Nodes[NodeIndex] == DialogueNode */\n\tvoid CheckDialogueNodeIndexMatchesNode() const;\n\n\t/** Helper function to check if the DialogueNode.Children matches with the Pins of the graph node */\n\tvoid CheckDialogueNodeSyncWithGraphNode(bool bStrictCheck = false) const;\n\n\t/** Gets the parent nodes that are connected to the input pin. This handles the proxy connection to the UDialogueGraphNode_Edge.  */\n\tTArray<UDialogueGraphNode*> GetParentNodes() const;\n\n\t/** Gets the child nodes that are connected from the output pin. This handles the proxy connection to the UDialogueGraphNode_Edge.  */\n\tTArray<UDialogueGraphNode*> GetChildNodes() const;\n\n\t/** Gets the parent node edges that are connected from the input pin. This returns the proxy edge nodes. To surpass the proxy connection use GetParentNodes. */\n\tTArray<UDialogueGraphNode_Edge*> GetParentEdgeNodes(bool bCheckChild = true) const;\n\n\t/** Gets the child node edges that are connected from the output pin. This returns the proxy edge nodes. To surpass the proxy connection use GetChildNodes. */\n\tTArray<UDialogueGraphNode_Edge*> GetChildEdgeNodes(bool bCheckParent = true) const;\n\n\t/** Does this node have the child edge ChildEdgeToFind? */\n\tbool HasChildEdgeNode(const UDialogueGraphNode_Edge* ChildEdgeToFind) const;\n\n\t/** Does this node has the  parent edge ParentEdgeToFind?  */\n\tbool HasParentEdgeNode(const UDialogueGraphNode_Edge* ParentEdgeToFind) const;\n\n\t/** Rearranges the children (edges, output pin, connections) based on the X location on the graph. */\n\tvoid SortChildrenBasedOnXLocation();\n\n\t/** Should we force hide this node? */\n\tbool GetForceHideNode() const { return bForceHideNode; }\n\n\t/** Forcefully hide/show this node and all edges that are coming into it. */\n\tvoid SetForceHideNode(bool bHide) { bForceHideNode = bHide; }\n\n\t/** Should this node be drawn? */\n\tbool ShouldDrawNode() const { return !bForceHideNode; }\n\n\t/** Helper constants to get the names of some properties. Used by the DlgSystemEditor module. */\n\tstatic FName GetMemberNameDialogueNode() { return GET_MEMBER_NAME_CHECKED(UDialogueGraphNode, DialogueNode); }\n\tstatic FName GetMemberNameNodeIndex() { return GET_MEMBER_NAME_CHECKED(UDialogueGraphNode, NodeIndex); }\n\nprotected:\n\t// Begin UDialogueGraphNode_Base interface\n\t/** Creates the input pin for this node. */\n\tvirtual void CreateInputPin()\n\t{\n\t\tstatic const FName PinName(TEXT(\"Input Pin\"));\n\t\tFCreatePinParams PinParams;\n\t\tPinParams.Index = INDEX_PIN_Input;\n\t\tCreatePin(EGPD_Input, UDialogueGraphSchema::PIN_CATEGORY_Input, PinName, PinParams);\n\t}\n\n\t/** Creates the output pin for this node. */\n\tvirtual void CreateOutputPin()\n\t{\n\t\tstatic const FName PinName(TEXT(\"Output Pin\"));\n\t\tFCreatePinParams PinParams;\n\t\tPinParams.Index = INDEX_PIN_Output;\n\t\tCreatePin(EGPD_Output, UDialogueGraphSchema::PIN_CATEGORY_Output, PinName, PinParams);\n\n\t\t// This enables or disables dragging of the pin from the Node, see SGraphPin::OnPinMouseDown for details\n\t\tGetOutputPin()->bNotConnectable = IsEndNode();\n\t}\n\n\t/** Registers all the listener this class listens to. */\n\tvoid RegisterListeners() override;\n\n\t//\n\t// Begin own functions\n\t//\n\n\t/** This function is called after one of the properties of the DialogueNode are changed.  */\n\tvoid OnDialogueNodePropertyChanged(const FPropertyChangedEvent& PropertyChangedEvent, int32 EdgeIndexChanged);\n\n\t/** Make sure the DialogueNode is owned by the Dialogue */\n\tvoid ResetDialogueNodeOwner();\n\nprivate:\n\t/** Returns the different Edge Index in the DialogueNode.Children that differs from its corresponding OutputPin.LinkedTo. */\n\tconst FDiffNodeEdgeLinkedToPinResult FindDifferenceBetweenNodeEdgesAndLinkedToPins() const;\n\n\t/** Tells us if the Edge matches the Graph Output Connections at the same Index in the OutputPin. They point to the same TargetIndex */\n\tbool DoesEdgeMatchEdgeIndex(const FDlgEdge& Edge, int32 EdgeIndex, FString& OutMessage) const;\n\nprotected:\n\t/** The Dialogue Node this graph node references.  */\n\tUPROPERTY(EditAnywhere, Instanced, Category = DialogueGraphNode, Meta = (ShowOnlyInnerProperties))\n\tUDlgNode* DialogueNode;\n\n\t/** The Dialogue Node index in the Dialogue (array) this represents. This is not relevant for the StartNode. */\n\tUPROPERTY(VisibleAnywhere, Category = DialogueGraphNode)\n\tint32 NodeIndex = INDEX_NONE;\n\n\t// Indicates the distance from the start node. This is only set after the graph is compiled.\n\tUPROPERTY()\n\tint32 NodeDepth = INDEX_NONE;\n\n\t/**\n\t * Forcefully hide this node from the graph.\n\t */\n\tbool bForceHideNode = false;\n};\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystemEditor/Private/DialogueEditor/Nodes/DialogueGraphNode_Base.cpp",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#include \"DialogueGraphNode_Base.h\"\n\n#include \"Logging/TokenizedMessage.h\"\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// Begin UObject interface\nvoid UDialogueGraphNode_Base::PostLoad()\n{\n\tSuper::PostLoad();\n\tRegisterListeners();\n}\n\nvoid UDialogueGraphNode_Base::PostDuplicate(bool bDuplicateForPIE)\n{\n\tSuper::PostDuplicate(bDuplicateForPIE);\n\n\tif (!bDuplicateForPIE)\n\t{\n\t\tCreateNewGuid();\n\t}\n}\n\nvoid UDialogueGraphNode_Base::PostEditImport()\n{\n\tSuper::PostEditImport();\n\tRegisterListeners();\n}\n// End UObject interface\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// Begin UEdGraphNode interface\nvoid UDialogueGraphNode_Base::AllocateDefaultPins()\n{\n\t// Only one input and output pin\n\tcheck(Pins.Num() == 0);\n\tCreateInputPin();\n\tCreateOutputPin();\n\tcheck(Pins.Num() == 2);\n}\n\nvoid UDialogueGraphNode_Base::ReconstructNode()\n{\n\t// Most likely we also need to make sure the new connections are ok\n\tModify();\n\n\t// Clear previously set messages\n\tErrorMsg.Reset();\n\n\t// Break any links to 'orphan' pins\n\tfor (UEdGraphPin* Pin : Pins)\n\t{\n\t\tTArray<UEdGraphPin*>& LinkedToRef = Pin->LinkedTo;\n\t\tfor (UEdGraphPin* OtherPin : LinkedToRef)\n\t\t{\n\t\t\t// If we are linked to a pin that its owner doesn't know about, break that link\n\t\t\tif (!OtherPin->GetOwningNode()->Pins.Contains(OtherPin))\n\t\t\t{\n\t\t\t\tPin->LinkedTo.Remove(OtherPin);\n\t\t\t}\n\t\t}\n\t}\n\n\t// Store the old Input and Output pins\n\tUEdGraphPin* OldInputPin = HasInputPin() ? GetInputPin() : nullptr;\n\tUEdGraphPin* OldOutputPin = HasOutputPin() ? GetOutputPin() : nullptr;\n\n\t// Move the existing pins to a saved array\n\tTArray<UEdGraphPin*> OldPins(Pins);\n\tPins.Empty();\n\n\t// Recreate the new pins\n\tAllocateDefaultPins();\n\n\t// Get new Input and Output pins\n\tUEdGraphPin* NewInputPin = GetInputPin();\n\tUEdGraphPin* NewOutputPin = GetOutputPin();\n\n\t// Copy data from old to new\n\tif (OldInputPin)\n\t{\n\t\tNewInputPin->CopyPersistentDataFromOldPin(*OldInputPin);\n\t\tOldInputPin = nullptr;\n\t}\n\n\tif (OldOutputPin)\n\t{\n\t\tNewOutputPin->CopyPersistentDataFromOldPin(*OldOutputPin);\n\t\tOldOutputPin = nullptr;\n\t}\n\n\t// Throw away the original (old) pins\n\tfor (UEdGraphPin* OldPin : OldPins)\n\t{\n\t\tOldPin->Modify();\n\t\tOldPin->BreakAllPinLinks();\n\t\tDestroyPin(OldPin);\n\t}\n\tOldPins.Empty();\n}\n\n// End UEdGraphNode interface\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// Begin own functions\nUDialogueGraphNode_Base::UDialogueGraphNode_Base(const FObjectInitializer& ObjectInitializer) : Super(ObjectInitializer)\n{\n\tbCanRenameNode = false;\n}\n\nbool UDialogueGraphNode_Base::HasOutputConnectionToNode(const UEdGraphNode* TargetNode) const\n{\n\tfor (UEdGraphPin* ChildInputPin : GetOutputPin()->LinkedTo)\n\t{\n\t\tif (ChildInputPin->GetOwningNode() == TargetNode)\n\t\t{\n\t\t\treturn true;\n\t\t}\n\t}\n\n\treturn false;;\n}\n\nvoid UDialogueGraphNode_Base::ClearCompilerMessage()\n{\n\tbHasCompilerMessage = false;\n\tErrorType = EMessageSeverity::Info;\n\tErrorMsg.Empty();\n}\n\nvoid UDialogueGraphNode_Base::SetCompilerWarningMessage(FString Message)\n{\n\tbHasCompilerMessage = true;\n\tErrorType = EMessageSeverity::Warning;\n\tErrorMsg = Message;\n}\n\nvoid UDialogueGraphNode_Base::RegisterListeners()\n{\n\tGetDialogue()->OnDialoguePropertyChanged.AddUObject(this, &UDialogueGraphNode_Base::OnDialoguePropertyChanged);\n}\n// End own functions\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystemEditor/Private/DialogueEditor/Nodes/DialogueGraphNode_Base.h",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#pragma once\n\n#include \"CoreTypes.h\"\n#include \"UObject/ObjectMacros.h\"\n#include \"EdGraph/EdGraphNode.h\"\n\n#include \"DialogueEditor/Graph/DialogueGraphSchema.h\"\n#include \"DialogueEditor/Graph/DialogueGraph.h\"\n\n#include \"DialogueGraphNode_Base.generated.h\"\n\nclass UEdGraphPin;\nclass UEdGraphSchema;\nclass UDialogueGraphSchema;\n\n/**\n * Represents the base class representation of the dialogue graph nodes.\n * Each dialogue graph node has only one input/output pin. And each pin can be linked to multiple nodes.\n */\nUCLASS(Abstract)\nclass UDialogueGraphNode_Base : public UEdGraphNode\n{\n\tGENERATED_BODY()\n\npublic:\n\t//~ Begin UObject Interface.\n\t/**\n\t * Do any object-specific cleanup required immediately after loading an object,\n\t * and immediately after any undo/redo.\n\t */\n\tvoid PostLoad() override;\n\n\t/**\n\t *  Called after duplication & serialization and before PostLoad. Used to e.g. make sure UStaticMesh's UModel gets copied as well.\n\t *  Note: NOT called on components on actor duplication (alt-drag or copy-paste).  Use PostEditImport as well to cover that case.\n\t */\n\tvoid PostDuplicate(bool bDuplicateForPIE) override;\n\n\t/**\n\t * Called after importing property values for this object (paste, duplicate or .t3d import)\n\t * Allow the object to perform any cleanup for properties which shouldn't be duplicated or\n\t * are unsupported by the script serialization\n\t */\n\tvoid PostEditImport() override;\n\n\t// UEdGraphNode interface.\n\t/**\n\t * A chance to initialize a new node; called just once when a new node is created, before AutowireNewNode or AllocateDefaultPins is called.\n\t * This method is not called when a node is reconstructed, etc...\n\t */\n\tvoid PostPlacedNewNode() override { RegisterListeners(); }\n\n\t/** Allocate default pins for a given node, based only the NodeType, which should already be filled in. */\n\tvoid AllocateDefaultPins() override;\n\n\t/** Refresh the connectors on a node, preserving as many connections as it can. */\n\tvoid ReconstructNode() override;\n\n\t/** Whether or not this node can be safely duplicated (via copy/paste, etc...) in the graph */\n\tbool CanDuplicateNode() const override { return true; }\n\n\t/** Whether or not this node can be deleted by user action */\n\tbool CanUserDeleteNode() const override { return true; }\n\n\t/** Perform any steps necessary prior to copying a node into the paste buffer */\n\tvoid PrepareForCopying() override { Super::PrepareForCopying(); }\n\n\t/** IGNORED. Removes the specified pin from the node, preserving remaining pin ordering. */\n\tvoid RemovePinAt(int32 PinIndex, EEdGraphPinDirection PinDirection) override {}\n\n\t/** Whether or not struct pins belonging to this node should be allowed to be split or not. */\n\tbool CanSplitPin(const UEdGraphPin* Pin) const override { return false; }\n\n\t/** Determine if this node can be created under the specified schema */\n\tbool CanCreateUnderSpecifiedSchema(const UEdGraphSchema* Schema) const override\n\t{\n\t\treturn Schema->IsA(UDialogueGraphSchema::StaticClass());\n\t}\n\n\t/** Returns the link used for external documentation for the graph node. */\n\tFString GetDocumentationLink() const override { return TEXT(\"Shared/DialogueGraphNode\"); }\n\n\t/** Should we show the Palette Icon for this node on the node title */\n\tbool ShowPaletteIconOnNode() const override { return true; }\n\n\t/** Gets the draw color of a node's title bar. */\n\tFLinearColor GetNodeTitleColor() const override { return GetNodeBackgroundColor(); }\n\n\t/** @return Icon to use in menu or on node */\n\tFSlateIcon GetIconAndTint(FLinearColor& OutColor) const override\n\t{\n\t\tstatic const FSlateIcon Icon = FSlateIcon(FEditorStyle::GetStyleSetName(), \"Graph.StateNode.Icon\");\n\t\tOutColor = GetNodeBackgroundColor();\n\t\treturn Icon;\n\t}\n\n\t/////////////////////////////////////////////////////////////////////////////////////////////\n\t// Begin own functions\n\tUDialogueGraphNode_Base(const FObjectInitializer& ObjectInitializer);\n\n\t/** Perform any fixups (deep copies of associated data, etc...) necessary after a node has been copied in the editor. */\n\tvirtual void PostCopyNode() {}\n\n\t/** Checks if this node has a output connection to the TargetNode. */\n\tvirtual bool HasOutputConnectionToNode(const UEdGraphNode* TargetNode) const;\n\n\t/** Checks whether an input connection can be added to this node */\n\tvirtual bool CanHaveInputConnections() const { return true; }\n\n\t/** Checks whether an output connection can be added from this node */\n\tvirtual bool CanHaveOutputConnections() const { return true; }\n\n\t/** Gets the background color of this node. */\n\tvirtual FLinearColor GetNodeBackgroundColor() const { return FLinearColor::Black; }\n\n\t/** Performs all checks */\n\tvirtual void CheckAll() const\n\t{\n#if DO_CHECK\n\t\tGetInputPin();\n\t\tGetOutputPin();\n#endif\n\t}\n\n\t/** Gets the position in the Graph canvas of this node. */\n\tvirtual FIntPoint GetPosition() const { return FIntPoint(NodePosX, NodePosY); }\n\n\t/** Sets the position in the Graph canvas of this node. */\n\tvirtual void SetPosition(int32 X, int32 Y)\n\t{\n\t\tNodePosX = X;\n\t\tNodePosY = Y;\n\t}\n\n\t// Compiler methods\n\t/** Clears the compiler messages on this node. */\n\tvoid ClearCompilerMessage();\n\n\t/** Sets a compiler message of type warning. */\n\tvoid SetCompilerWarningMessage(FString Message);\n\n\t/** Is the Input pin initialized? */\n\tbool HasInputPin() const\n\t{\n\t\treturn Pins.IsValidIndex(INDEX_PIN_Input) && Pins[INDEX_PIN_Input] != nullptr &&\n\t\t\t   Pins[INDEX_PIN_Input]->Direction == EGPD_Input;\n\t}\n\n\t/** Is the Output pin initialized? */\n\tbool HasOutputPin() const\n\t{\n\t\treturn Pins.IsValidIndex(INDEX_PIN_Output) && Pins[INDEX_PIN_Output] != nullptr &&\n\t\t\t   Pins[INDEX_PIN_Output]->Direction == EGPD_Output;\n\t}\n\n\t// @return the input pin for this dialogue Node\n\tUEdGraphPin* GetInputPin() const\n\t{\n\t\tcheck(HasInputPin());\n\t\treturn Pins[INDEX_PIN_Input];\n\t}\n\n\t// @return the output pin for this dialogue Node\n\tUEdGraphPin* GetOutputPin() const\n\t{\n\t\tcheck(HasOutputPin());\n\t\treturn Pins[INDEX_PIN_Output];\n\t}\n\n\t// Helper method to get directly the Dialogue Graph (which is our parent)\n\tUDialogueGraph* GetDialogueGraph() const { return CastChecked<UDialogueGraph>(GetGraph()); }\n\n\t// Helper method to get directly the Dialogue\n\tUDlgDialogue* GetDialogue() const { return GetDialogueGraph()->GetDialogue(); }\n\n\t// TODO fix UEdGraphSchema::BreakSinglePinLink, make it to const\n\t/** Helper method to get directly the Dialogue Graph Schema */\n\tconst UDialogueGraphSchema* GetDialogueGraphSchema() const { return GetDialogueGraph()->GetDialogueGraphSchema(); }\n\n\t/** Widget representing this node if it exists */\n\tTSharedPtr<SGraphNode> GetNodeWidget() const { return DEPRECATED_NodeWidget.Pin(); }\n\nprotected:\n\t// Begin own functions\n\t/** Creates the input pin for this node. */\n\tvirtual void CreateInputPin() { unimplemented(); }\n\n\t/** Creates the output pin for this node. */\n\tvirtual void CreateOutputPin() { unimplemented(); }\n\n\t/** This function is called after one of the properties of the Dialogue are changed.  */\n\tvirtual void OnDialoguePropertyChanged(const FPropertyChangedEvent& PropertyChangedEvent) {}\n\n\t/** Registers all the listener this class listens to. */\n\tvirtual void RegisterListeners();\n\nprotected:\n\t// Constants for the location of the input/output pins in the Pins array\n\tstatic constexpr int32 INDEX_PIN_Input = 0;\n\tstatic constexpr int32 INDEX_PIN_Output = 1;\n};\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystemEditor/Private/DialogueEditor/Nodes/DialogueGraphNode_Edge.cpp",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#include \"DialogueGraphNode_Edge.h\"\n\n#include \"DialogueGraphNode.h\"\n\n#define LOCTEXT_NAMESPACE \"DialogueGraphNode_Edge\"\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// Begin UObject interface\nvoid UDialogueGraphNode_Edge::PostEditChangeProperty(FPropertyChangedEvent& PropertyChangedEvent)\n{\n\tSuper::PostEditChangeProperty(PropertyChangedEvent);\n\n\t// Special case when redoing\n\tif (HasParentNode() && HasChildNode())\n\t{\n\t\t// Always keep in sync with the Edge of the Dialogue Node\n\t\tFDlgEdge* ParentNodeDialogueEdge = GetMutableDialogueEdgeFromParentNode();\n\n\t\t// This happens when we copy and paste sometimes, the parent/child nodes does not have this edge\n\t\t// Most likely caused by duplicate PinIds\n\t\tif ((ParentNodeDialogueEdge == nullptr || DialogueEdge.TargetIndex != ParentNodeDialogueEdge->TargetIndex) &&\n\t\t\t(!GetParentNode()->HasChildEdgeNode(this) || !GetChildNode()->HasParentEdgeNode(this)))\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\t// Node is correct but the data isn't? :O\n\t\tcheck(ParentNodeDialogueEdge);\n\t\tcheck(DialogueEdge.TargetIndex == ParentNodeDialogueEdge->TargetIndex);\n\t\t*ParentNodeDialogueEdge = DialogueEdge;\n\t}\n}\n\nbool UDialogueGraphNode_Edge::Modify(bool bAlwaysMarkDirty)\n{\n\tif (!CanModify())\n\t{\n\t\treturn false;\n\t}\n\n\tbool bWasModified = Super::Modify(bAlwaysMarkDirty);\n\t// Notify the Parent of this Change\n\tif (HasParentNode())\n\t{\n\t\tbWasModified = bWasModified && GetParentNode()->Modify(bAlwaysMarkDirty);\n\t}\n\n\treturn bWasModified;\n}\n// End UObject interface\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// Begin UEdGraphNode interface\nvoid UDialogueGraphNode_Edge::AllocateDefaultPins()\n{\n\tSuper::AllocateDefaultPins();\n\tGetInputPin()->bHidden = true;\n\tGetOutputPin()->bHidden = true;\n}\n\nFText UDialogueGraphNode_Edge::GetNodeTitle(ENodeTitleType::Type TitleType) const\n{\n\treturn LOCTEXT(\"GetNodeTitle\", \"Edge Node Type\");\n}\n\nFText UDialogueGraphNode_Edge::GetTooltipText() const\n{\n\treturn FText::Format(LOCTEXT(\"EdegeXToY\", \"Edge from node {0} to {1}\\nText = {2}\"),\n\t\t\t\t\t\tGetParentNode()->GetDialogueNodeIndex(), GetChildNode()->GetDialogueNodeIndex(),\n\t\t\t\t\t\tDialogueEdge.GetUnformattedText());\n}\n\nvoid UDialogueGraphNode_Edge::PinConnectionListChanged(UEdGraphPin* Pin)\n{\n\tif (Pin->LinkedTo.Num() == 0)\n\t{\n\t\t// (input pin) ParentNode (output pin) -> (EdgeInputPin) ThisNode (EdgeOutputPin) -> (input pin) ChildNode (output pin)\n\t\tif (Pin->Direction == EGPD_Output)\n\t\t{\n\t\t\t// The other pin is input\n\t\t\tUEdGraphPin* InputPin = GetInputPin();\n\n\t\t\t// Try to remove the reference from the parent to this node if there is still a link.\n\t\t\tif (InputPin && InputPin->LinkedTo.Num() > 0)\n\t\t\t{\n\t\t\t\tUDialogueGraphNode* ParentNode = GetParentNode();\n\t\t\t\tconst TArray<UDialogueGraphNode_Edge*> ParentChildEdgeNodes = ParentNode->GetChildEdgeNodes();\n\t\t\t\tconst int32 ParentThisEdgeIndex = ParentChildEdgeNodes.Find(this);\n\t\t\t\tcheck(ParentThisEdgeIndex != INDEX_NONE);\n\t\t\t\tParentNode->GetMutableDialogueNode()->RemoveChildAt(ParentThisEdgeIndex);\n\t\t\t}\n\t\t}\n\n\t\t// Commit suicide; transitions must always have an input and output connection\n\t\tModify();\n\t\tDestroyNode();\n\t\treturn;\n\t}\n\n\t// Modifed one of the pins, most likely a result of CONNECT_RESPONSE_BREAK_OTHERS\n\tconst int32 NewTargetIndex = GetChildNode()->GetDialogueNodeIndex();\n\tif (NewTargetIndex != DialogueEdge.TargetIndex)\n\t{\n\t\t// (input pin) Parent Node (output pin) -> (input pin) ThisEdge Node (output pin) -> (input pin) New ChildNode (output pin)\n\t\t// Find ThisEdge node index, in the array of child edge nodes of the Parent node.\n\t\t// This matches the Edge Index of the Dialogue Edges array we must modify the Target Index of\n\t\tUDialogueGraphNode* ParentNode = GetParentNode();\n\t\tconst TArray<UDialogueGraphNode_Edge*> ParentChildEdgeNodes = ParentNode->GetChildEdgeNodes();\n\t\tconst int32 ParentThisEdgeIndex = ParentChildEdgeNodes.Find(this);\n\t\tcheck(ParentThisEdgeIndex != INDEX_NONE);\n\n\t\t// Change the Parent Edge Target Index\n\t\tUDlgNode* ParentNodeDialogue = ParentNode->GetMutableDialogueNode();\n\t\tcheck(ParentNodeDialogue->GetNodeChildren()[ParentThisEdgeIndex].TargetIndex == DialogueEdge.TargetIndex);\n\t\tParentNodeDialogue->GetSafeMutableNodeChildAt(ParentThisEdgeIndex)->TargetIndex = NewTargetIndex;\n\t\tDialogueEdge.TargetIndex = NewTargetIndex;\n\t}\n}\n\nvoid UDialogueGraphNode_Edge::PostPasteNode()\n{\n\tSuper::PostPasteNode();\n\t// We don't want to paste nodes in that aren't fully linked (edges nodes have fixed pins as they\n\t// really describe the connection between two other nodes). If we find one missing link, get rid of the node.\n\tfor (UEdGraphPin* Pin : Pins)\n\t{\n\t\tif (Pin->LinkedTo.Num() == 0)\n\t\t{\n\t\t\tDestroyNode();\n\t\t\tbreak;\n\t\t}\n\t}\n}\n// End UEdGraphNode interface\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// Begin own functions\nvoid UDialogueGraphNode_Edge::CreateConnections(UDialogueGraphNode* ParentNode, UDialogueGraphNode* ChildNode)\n{\n\tcheck(ParentNode != ChildNode);\n\n\t// (input pin) ParentNode (output pin) -> (input pin) EdgeNode aka ThisNode (output pin) -> (input pin) ChildNode (output pin)\n\tUEdGraphPin* ThisInputPin = GetInputPin();\n\tUEdGraphPin* ThisOutputPin = GetOutputPin();\n\tThisInputPin->Modify();\n\tThisInputPin->LinkedTo.Empty();\n\tThisOutputPin->Modify();\n\tThisOutputPin->LinkedTo.Empty();\n\n\t// Previous (ParentNode) to ThisNode\n\tParentNode->GetOutputPin()->MakeLinkTo(ThisInputPin);\n\n\t// ThisNode to Next (ChildNode)\n\tThisOutputPin->MakeLinkTo(ChildNode->GetInputPin());\n\n\tcheck(ThisInputPin->LinkedTo.Num() == 1);\n\tcheck(ThisOutputPin->LinkedTo.Num() == 1);\n\n\t// Set the Edge\n\tconst FDlgEdge* ParentNodeDialogueEdge = GetMutableDialogueEdgeFromParentNode();\n\tif (ParentNodeDialogueEdge != nullptr)\n\t{\n\t\t// Already exists\n\t\tDialogueEdge = *ParentNodeDialogueEdge;\n\t}\n\telse\n\t{\n\t\t// Add one Edge at the end of the array\n\t\tconst FDlgEdge EdgeToAdd = FDlgEdge(ChildNode->GetDialogueNodeIndex());\n\t\tParentNode->GetMutableDialogueNode()->AddNodeChild(EdgeToAdd);\n\t\tDialogueEdge = EdgeToAdd;\n\t}\n}\n\nFLinearColor UDialogueGraphNode_Edge::GetEdgeColor(bool bIsHovered) const\n{\n\tconst UDlgSystemSettings* Settings = GetDefault<UDlgSystemSettings>();\n\tif (bIsHovered)\n\t{\n\t\treturn Settings->WireHoveredColor;\n\t}\n\n\t// Use color scheme for primary/secondary edges\n\tif (Settings->bShowPrimarySecondaryEdges)\n\t{\n\t\treturn bIsPrimaryEdge ? Settings->WirePrimaryEdgeColor : Settings->WireSecondaryEdgeColor;\n\t}\n\n\t// Wire has conditions\n\tif (HasConditions() && Settings->bShowDifferentColorForConditionWires)\n\t{\n\t\treturn Settings->WireWithConditionsColor;\n\t}\n\n\t// Normal coloring\n\treturn Settings->WireBaseColor;\n}\n\nFDlgEdge* UDialogueGraphNode_Edge::GetMutableDialogueEdgeFromParentNode() const\n{\n\tUDialogueGraphNode* ParentNode = GetParentNode();\n\tconst UDialogueGraphNode* ChildNode = GetChildNode();\n\treturn ParentNode->GetMutableDialogueNode()->GetMutableNodeChildForTargetIndex(ChildNode->GetDialogueNodeIndex());\n}\n// End own functions\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n#undef LOCTEXT_NAMESPACE\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystemEditor/Private/DialogueEditor/Nodes/DialogueGraphNode_Edge.h",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#pragma once\n\n#include \"CoreTypes.h\"\n\n#include \"DialogueGraphNode_Base.h\"\n#include \"DialogueGraphNode.h\"\n\n#include \"DialogueGraphNode_Edge.generated.h\"\n\n\n/**\n * Represents the graph node for edges, corresponds to the runtime FDlgEdge.\n * Allows us to have selectable edges.\n * This class has an additional constraint over the base class UDialogueGraphNode_Base such that the input and output pin\n * have only one connection (aka Pin.LinkedTo.Num() == 1 at all times) otherwise this does not make sense to simulate an Edge.\n */\nUCLASS()\nclass UDialogueGraphNode_Edge : public UDialogueGraphNode_Base\n{\n\tGENERATED_BODY()\n\npublic:\n\t// Begin UObject Interface.\n\t/**\n\t * Called when a property on this object has been modified externally\n\t *\n\t * @param PropertyChangedEvent the property that was modified\n\t */\n\tvoid PostEditChangeProperty(FPropertyChangedEvent& PropertyChangedEvent) override;\n\n\t/**\n\t * Note that the object will be modified. If we are currently recording into the\n\t * transaction buffer (undo/redo), save a copy of this object into the buffer and\n\t * marks the package as needing to be saved.\n\t *\n\t * @param\tbAlwaysMarkDirty\tif true, marks the package dirty even if we aren't\n\t *\t\t\t\t\t\t\t\tcurrently recording an active undo/redo transaction\n\t * @return true if the object was saved to the transaction buffer\n\t */\n\tbool Modify(bool bAlwaysMarkDirty = true) override;\n\n\t/**\n\t * Same as the above method but it only calls the base class.\n\t * Useful to not make an infinite loop when Modify is called from the ParentNode\n\t */\n\tbool SuperModify(bool bAlwaysMarkDirty = true) { return Super::Modify(bAlwaysMarkDirty); }\n\n\t// UEdGraphNode interface.\n\t/** Allocate default pins for a given node, based only the NodeType, which should already be filled in. */\n\tvoid AllocateDefaultPins() override;\n\n\t/** Gets the name of this node, shown in title bar */\n\tFText GetNodeTitle(ENodeTitleType::Type TitleType) const override;\n\n\t/** Gets the tooltip to display when over the node */\n\tFText GetTooltipText() const override;\n\n\t/** Called when the connection list of one of the pins of this node is changed in the editor */\n\tvoid PinConnectionListChanged(UEdGraphPin* Pin) override;\n\n\t/** Perform any fixups (deep copies of associated data, etc...) necessary after a node has been pasted in the editor */\n\tvoid PostPasteNode() override;\n\n\t/** @return Icon to use in menu or on node */\n\tFSlateIcon GetIconAndTint(FLinearColor& OutColor) const override\n\t{\n\t\tstatic const FSlateIcon Icon = FSlateIcon(FEditorStyle::GetStyleSetName(), \"Graph.TransitionNode.Icon\");\n\t\tOutColor = GetNodeBackgroundColor();\n\t\treturn Icon;\n\t}\n\n\t// Begin UDialogueGraphNode_Base interface\n\t/** Gets the background color of this node. */\n\tFLinearColor GetNodeBackgroundColor() const override { return FColorList::White; }\n\n\t// Begin own functions\n\t/** Does this edge have a parent node? */\n\tbool HasParentNode() const\n\t{\n\t\tif (HasInputPin())\n\t\t{\n\t\t\tUEdGraphPin* InputPin = GetInputPin();\n\t\t\treturn InputPin->LinkedTo.Num() == 1 && InputPin->LinkedTo[0] != nullptr &&\n\t\t\t\t   InputPin->LinkedTo[0]->GetOwningNodeUnchecked() != nullptr;\n\t\t}\n\n\t\treturn false;\n\t}\n\n\t/** Does this edge has a child edge? */\n\tbool HasChildNode() const\n\t{\n\t\tif (HasOutputPin())\n\t\t{\n\t\t\tUEdGraphPin* OutputPin = GetOutputPin();\n\t\t\treturn OutputPin->LinkedTo.Num() == 1 && OutputPin->LinkedTo[0] != nullptr &&\n\t\t\t\t   OutputPin->LinkedTo[0]->GetOwningNodeUnchecked() != nullptr;\n\t\t}\n\n\t\treturn false;\n\t}\n\n\t/** Gets the parent node that is connected to the input pin. */\n\tUDialogueGraphNode* GetParentNode() const\n\t{\n\t\tcheck(HasParentNode());\n\t\treturn CastChecked<UDialogueGraphNode>(GetInputPin()->LinkedTo[0]->GetOwningNode());\n\t}\n\n\t/** Gets the child node that is connected from the output pin. */\n\tUDialogueGraphNode* GetChildNode() const\n\t{\n\t\tcheck(HasChildNode());\n\t\treturn CastChecked<UDialogueGraphNode>(GetOutputPin()->LinkedTo[0]->GetOwningNode());\n\t}\n\n\t/** Creates a connection between the two provided nodes */\n\tvoid CreateConnections(UDialogueGraphNode* ParentNode, UDialogueGraphNode* ChildNode);\n\n\t// Begin own function\n\t/** Gets the corresponding Dialogue Edge of this Node as a const. */\n\tconst FDlgEdge& GetDialogueEdge() const { return DialogueEdge; }\n\tFDlgEdge& GetDialogueEdge() { return DialogueEdge; }\n\n\t/** Sets the corresponding Dialogue Edge of this Node. */\n\tvoid SetDialogueEdge(const FDlgEdge& InEdge) { DialogueEdge = InEdge; }\n\n\t/** Sets the DialogueEdge.TargetIndex */\n\tvoid SetDialogueEdgeTargetIndex(int32 InIndex) { DialogueEdge.TargetIndex = InIndex; }\n\n\t/** Sets the DialogueEdge.Text */\n\tvoid SetDialogueEdgeText(const FText& InText)\n\t{\n\t\tDialogueEdge.SetText(InText);\n\t}\n\n\t/** Tells us if this edge has any conditions set. */\n\tbool HasConditions() const { return DialogueEdge.Conditions.Num() > 0; }\n\n\t/** Gets the current edge color. */\n\tFLinearColor GetEdgeColor(bool bIsHovered) const;\n\n\t/** Is this node a primary edge? */\n\tbool IsPrimaryEdge() const { return bIsPrimaryEdge; }\n\n\t/** Sets the primary edge status of this Node. */\n\tvoid SetIsPrimaryEdge(bool bValue) { bIsPrimaryEdge = bValue; }\n\n\t/** Should this edge be drawn? */\n\tbool ShouldDrawEdge() const\n\t{\n\t\t// If The parent or the child is hidden, we also hide this edge no matter the settings\n\t\tif (HasInputPin() && HasOutputPin())\n\t\t{\n\t\t\tif (!GetParentNode()->ShouldDrawNode() || !GetChildNode()->ShouldDrawNode())\n\t\t\t{\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\tconst UDlgSystemSettings* Settings = GetDefault<UDlgSystemSettings>();\n\t\tif (Settings->bShowPrimarySecondaryEdges)\n\t\t{\n\t\t\treturn IsPrimaryEdge() ? Settings->bDrawPrimaryEdges : Settings->bDrawSecondaryEdges;\n\t\t}\n\n\t\treturn true;\n\t}\n\t// End own functions\n\nprotected:\n\t// Begin UDialogueGraphNode_Base interface\n\t/** Creates the input pin for this node. */\n\tvoid CreateInputPin() override\n\t{\n\t\tstatic const FName PinName(TEXT(\"Input\"));\n\t\tstatic const FName CategoryName(TEXT(\"Transition\"));\n\t\tFCreatePinParams PinParams;\n\t\tPinParams.Index = INDEX_PIN_Input;\n\t\tCreatePin(EGPD_Input, CategoryName, PinName, PinParams);\n\t}\n\n\t/** Creates the output pin for this node. */\n\tvoid CreateOutputPin() override\n\t{\n\t\tstatic const FName PinName(TEXT(\"Output\"));\n\t\tstatic const FName CategoryName(TEXT(\"Transition\"));\n\t\tFCreatePinParams PinParams;\n\t\tPinParams.Index = INDEX_PIN_Output;\n\t\tCreatePin(EGPD_Output, CategoryName, PinName, PinParams);\n\t}\n\nprivate:\n\t// Begin own functions\n\t/** Gets the corresponding FDlgEdge that this Node actually represents from the ParentNode */\n\tFDlgEdge* GetMutableDialogueEdgeFromParentNode() const;\n\nprivate:\n\t/** The copy Dialogue Edge corresponding to this graph node. This belongs to the the Node of the Input Pin (GetParentNode) */\n\tUPROPERTY(EditAnywhere, Category = DialogueGraphNode, Meta = (ShowOnlyInnerProperties))\n\tFDlgEdge DialogueEdge;\n\n\t/**\n\t * Is this a primary edge? Aka does this edge lead to a unique path to the ChildNode.\n\t * This is only set after the graph is compiled.\n\t */\n\tUPROPERTY()\n\tbool bIsPrimaryEdge = true;\n};\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystemEditor/Private/DialogueEditor/Nodes/DialogueGraphNode_Root.cpp",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#include \"DialogueGraphNode_Root.h\"\n\n#include \"DialogueGraphNode.h\"\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// Begin UEdGraphNode interface\nvoid UDialogueGraphNode_Root::PinConnectionListChanged(UEdGraphPin* Pin)\n{\n\t// Root node can only have output nodes so any other type should not be supported.\n\tif (Pin->Direction == EGPD_Output)\n\t{\n\t\tSuper::PinConnectionListChanged(Pin);\n\t}\n}\n// End UEdGraphNode interface\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// Begin UDialogueGraphNode_Base interface\nvoid UDialogueGraphNode_Root::OnDialoguePropertyChanged(const FPropertyChangedEvent& PropertyChangedEvent)\n{\n\tif (!PropertyChangedEvent.Property || !PropertyChangedEvent.MemberProperty)\n\t{\n\t\treturn;\n\t}\n\n\t// Only interested in the Dialogue.StartNode\n\tif (PropertyChangedEvent.MemberProperty->GetFName() != UDlgDialogue::GetMemberNameStartNode())\n\t{\n\t\treturn;\n\t}\n\n\t//HandleOnDialoguePropertyChanged(PropertyChangedEvent, GetDialogue()->GetStartNode());\n}\n// End UDialogueGraphNode_Base interface\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystemEditor/Private/DialogueEditor/Nodes/DialogueGraphNode_Root.h",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#pragma once\n\n#include \"CoreTypes.h\"\n\n#include \"DialogueGraphNode.h\"\n\n#include \"DialogueGraphNode_Root.generated.h\"\n\n\nUCLASS()\nclass UDialogueGraphNode_Root : public UDialogueGraphNode\n{\n\tGENERATED_BODY()\n\npublic:\n\t// Begin UEdGraphNode interface\n\t/** Gets the name of this node, shown in title bar */\n\tFText GetNodeTitle(ENodeTitleType::Type TitleType) const override\n\t{\n\t\treturn NSLOCTEXT(\"DialogueGraphNode_Root\", \"RootTitle\", \"Start\");\n\t}\n\n\t/** Gets the tooltip to display when over the node */\n\tFText GetTooltipText() const override\n\t{\n\t\treturn NSLOCTEXT(\"DialogueGraphNode_Root\", \"RootToolTip\", \"The root start node of this graph\");\n\t}\n\n\t/** Called when the connection list of one of the pins of this node is changed in the editor */\n\tvoid PinConnectionListChanged(UEdGraphPin* Pin) override;\n\n\t// Begin UDialogueGraphNode interface\n\tbool IsRootNode() const override { return true; }\n\n\t/** Sets the Dialogue node index number, this represents the index from the DlgDialogue.Nodes Array */\n    void SetDialogueNodeIndex(int32 InIndex) override { NodeIndex = INDEX_NONE; }\n\n\t/** Gets the Dialogue node index number for the DlgDialogue.Nodes Array */\n\tint32 GetDialogueNodeIndex() const override { return INDEX_NONE; }\n\n\t/** Gets the background color of this node. */\n\tFLinearColor GetNodeBackgroundColor() const override { return GetDefault<UDlgSystemSettings>()->RootNodeColor; }\n\nprotected:\n\t// Begin UDialogueGraphNode interface\n\t/** This function is called after one of the properties of the Dialogue are changed. */\n\tvoid OnDialoguePropertyChanged(const FPropertyChangedEvent& PropertyChangedEvent) override;\n};\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystemEditor/Private/DialogueEditor/Nodes/SDialogueGraphNode.cpp",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#include \"SDialogueGraphNode.h\"\n\n#include \"Widgets/Layout/SBox.h\"\n#include \"Widgets/Images/SImage.h\"\n#include \"Widgets/SToolTip.h\"\n#include \"GraphEditorSettings.h\"\n#include \"SCommentBubble.h\"\n#include \"SLevelOfDetailBranchNode.h\"\n#include \"IDocumentation.h\"\n#include \"GraphEditorDragDropAction.h\"\n\n#include \"SDialogueNodeOverlayWidget.h\"\n#include \"SDialogueGraphPin.h\"\n#include \"DialogueStyle.h\"\n\n#define LOCTEXT_NAMESPACE \"DialogueEditor\"\n\n\n/////////////////////////////////////////////////////\n// SDialogueGraphNode\nvoid SDialogueGraphNode::Construct(const FArguments& InArgs, UDialogueGraphNode* InNode)\n{\n\tSuper::Construct(Super::FArguments(), InNode);\n\tDialogueGraphNode = InNode;\n\n\tSetCursor(EMouseCursor::CardinalCross);\n\tUpdateGraphNode();\n}\n\nFReply SDialogueGraphNode::OnDrop(const FGeometry& MyGeometry, const FDragDropEvent& DragDropEvent)\n{\n//\tconst bool bReadOnly = OwnerGraphPanelPtr.IsValid() ? !OwnerGraphPanelPtr.Pin()->IsGraphEditable() : false;\n//\tconst TSharedPtr<FDragDropOperation> Operation = DragDropEvent.GetOperation();\n//\tif (!Operation.IsValid() || bReadOnly)\n//\t\treturn FReply::Unhandled();\n\n\t// Is someone dropping a connection onto this node?\n//\tif (Operation->IsOfType<FGraphEditorDragDropAction>())\n//\t{\n//\t\tTSharedPtr<FGraphEditorDragDropAction> DragConnectionOp = StaticCastSharedPtr<FGraphEditorDragDropAction>(Operation);\n//\t}\n\n\treturn Super::OnDrop(MyGeometry, DragDropEvent);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// Begin SNodePanel::SNode Interface\nTArray<FOverlayWidgetInfo> SDialogueGraphNode::GetOverlayWidgets(bool bSelected, const FVector2D& WidgetSize) const\n{\n\tcheck(IndexOverlayWidget.IsValid());\n\tcheck(ConditionOverlayWidget.IsValid());\n\tcheck(EventOverlayWidget.IsValid());\n\tcheck(VoiceOverlayWidget.IsValid());\n\tcheck(GenericOverlayWidget.IsValid());\n\n\tTArray<FOverlayWidgetInfo> Widgets;\n\tstatic constexpr float DistanceBetweenWidgetsY = 1.5f;\n\tFVector2D OriginRightSide(0.0f, 0.0f);\n\tFVector2D OriginLeftSide(0.0f, 0.0f);\n\n\t// Add Index overlay\n\t{\n\t\t// Position on the right of the node\n\t\tFOverlayWidgetInfo Overlay(IndexOverlayWidget);\n\t\tOverlay.OverlayOffset = FVector2D(WidgetSize.X - IndexOverlayWidget->GetDesiredSize().X / 2.0f, OriginRightSide.Y);\n\t\tWidgets.Add(Overlay);\n\t\tOriginRightSide.Y += IndexOverlayWidget->GetDesiredSize().Y + DistanceBetweenWidgetsY;\n\t}\n\n\t// Add Voice overlay\n\tif (Settings->bShowHasVoiceIcon && DialogueGraphNode->HasVoicePropertiesSet())\n\t{\n\t\t// Position on the right of the node\n\t\tFOverlayWidgetInfo Overlay(VoiceOverlayWidget);\n\t\tOverlay.OverlayOffset = FVector2D(WidgetSize.X - VoiceOverlayWidget->GetDesiredSize().X / 3.0f, OriginRightSide.Y);\n\t\tWidgets.Add(Overlay);\n\t\tOriginRightSide.Y += VoiceOverlayWidget->GetDesiredSize().Y + DistanceBetweenWidgetsY;\n\t}\n\n\t// Add Generic overlay\n\tif (Settings->bShowHasGenericDataIcon && DialogueGraphNode->HasGenericDataSet())\n\t{\n\t\t// Position on the right of the node\n\t\tFOverlayWidgetInfo Overlay(GenericOverlayWidget);\n\t\tOverlay.OverlayOffset = FVector2D(WidgetSize.X - GenericOverlayWidget->GetDesiredSize().X / 3.0f, OriginRightSide.Y);\n\t\tWidgets.Add(Overlay);\n\t\tOriginRightSide.Y += GenericOverlayWidget->GetDesiredSize().Y + DistanceBetweenWidgetsY;\n\t}\n\n\t// Add Condition overlay\n\tif (Settings->bShowHasEnterConditionsIcon && DialogueGraphNode->HasEnterConditions())\n\t{\n\t\t// Position on the left of the node\n\t\tFOverlayWidgetInfo Overlay(ConditionOverlayWidget);\n\t\tOverlay.OverlayOffset = FVector2D(-ConditionOverlayWidget->GetDesiredSize().X / 1.5f, OriginLeftSide.Y);\n\t\tWidgets.Add(Overlay);\n\t\tOriginLeftSide.Y += ConditionOverlayWidget->GetDesiredSize().Y + DistanceBetweenWidgetsY;\n\t}\n\n\t// Add Event overlay\n\tif (Settings->bShowHasEnterEventsIcon && DialogueGraphNode->HasEnterEvents())\n\t{\n\t\t// Position on the left of the node\n\t\tFOverlayWidgetInfo Overlay(EventOverlayWidget);\n\t\tOverlay.OverlayOffset = FVector2D(-EventOverlayWidget->GetDesiredSize().X / 1.5f, OriginLeftSide.Y);\n\t\tWidgets.Add(Overlay);\n\t\tOriginLeftSide.Y += EventOverlayWidget->GetDesiredSize().Y + DistanceBetweenWidgetsY;\n\t}\n\n\treturn Widgets;\n}\n\nvoid SDialogueGraphNode::GetOverlayBrushes(bool bSelected, const FVector2D WidgetSize, TArray<FOverlayBrushInfo>& Brushes) const\n{\n\tSuper::GetOverlayBrushes(bSelected, WidgetSize, Brushes);\n}\n\n// End SNodePanel::SNode Interface\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// Begin SGraphNode interface\nvoid SDialogueGraphNode::UpdateGraphNode()\n{\n\tSuper::UpdateGraphNode();\n\tSetupErrorReporting();\n\n\t// Define other useful variables\n\tconst FMargin NodePadding = 10.0f;\n\n\t// Used in GetOverlayWidgets\n\tIndexOverlayWidget = SNew(SDialogueNodeOverlayWidget)\n\t\t.OverlayBody(\n\t\t\tSNew(STextBlock)\n\t\t\t.Text(this, &Self::GetIndexText)\n\t\t\t.ColorAndOpacity(FLinearColor::White)\n\t\t\t.Font(FEditorStyle::GetFontStyle(\"BTEditor.Graph.BTNode.IndexText\"))\n\t\t)\n\t\t.ToolTipText(this, &Self::GetIndexOverlayTooltipText)\n\t\t.Visibility(this, &Self::GetOverlayWidgetVisibility)\n\t\t.OnHoverStateChanged(this, &Self::OnIndexHoverStateChanged)\n\t\t.OnGetBackgroundColor(this, &Self::GetOverlayWidgetBackgroundColor);\n\n\t// Fit to content\n\tstatic constexpr int WidthOverride = 24;\n\tstatic constexpr int HeightOverride = 24;\n\tConditionOverlayWidget = SNew(SDialogueNodeOverlayWidget)\n\t\t.OverlayBody(\n\t\t\tSNew(SBox)\n\t\t\t.HAlign(HAlign_Fill)\n\t\t\t.VAlign(VAlign_Fill)\n\t\t\t.WidthOverride(WidthOverride)\n\t\t\t.HeightOverride(HeightOverride)\n\t\t\t[\n\t\t\t\tSNew(SImage)\n\t\t\t\t.Image(FDialogueStyle::Get()->GetBrush(FDialogueStyle::PROPERTY_ConditionIcon))\n\t\t\t]\n\t\t)\n\t\t.ToolTipText(this, &Self::GetConditionOverlayTooltipText)\n\t\t.Visibility(this, &Self::GetOverlayWidgetVisibility)\n\t\t.OnGetBackgroundColor(this, &Self::GetOverlayWidgetBackgroundColor);\n\n\tEventOverlayWidget = SNew(SDialogueNodeOverlayWidget)\n\t\t.OverlayBody(\n\t\t\tSNew(SBox)\n\t\t\t.HAlign(HAlign_Fill)\n\t\t\t.VAlign(VAlign_Fill)\n\t\t\t.WidthOverride(WidthOverride)\n\t\t\t.HeightOverride(HeightOverride)\n\t\t\t[\n\t\t\t\tSNew(SImage)\n\t\t\t\t.Image(FDialogueStyle::Get()->GetBrush(FDialogueStyle::PROPERTY_EventIcon))\n\t\t\t]\n\t\t)\n\t\t.ToolTipText(this, &Self::GetEventOverlayTooltipText)\n\t\t.Visibility(this, &Self::GetOverlayWidgetVisibility)\n\t\t.OnGetBackgroundColor(this, &Self::GetOverlayWidgetBackgroundColor);\n\n\tVoiceOverlayWidget = SNew(SDialogueNodeOverlayWidget)\n\t\t.OverlayBody(\n\t\t\tSNew(SBox)\n\t\t\t.HAlign(HAlign_Fill)\n\t\t\t.VAlign(VAlign_Fill)\n\t\t\t.WidthOverride(WidthOverride)\n\t\t\t.HeightOverride(HeightOverride)\n\t\t\t[\n\t\t\t\tSNew(SImage)\n\t\t\t\t.Image(FDialogueStyle::Get()->GetBrush(FDialogueStyle::PROPERTY_VoiceIcon))\n\t\t\t]\n\t\t)\n\t\t.ToolTipText(this, &Self::GetVoiceOverlayTooltipText)\n\t\t.Visibility(this, &Self::GetOverlayWidgetVisibility)\n\t\t.OnGetBackgroundColor(this, &Self::GetOverlayWidgetBackgroundColor);\n\n\tGenericOverlayWidget = SNew(SDialogueNodeOverlayWidget)\n\t\t.OverlayBody(\n\t\t\tSNew(SBox)\n\t\t\t.HAlign(HAlign_Fill)\n\t\t\t.VAlign(VAlign_Fill)\n\t\t\t.WidthOverride(WidthOverride)\n\t\t\t.HeightOverride(HeightOverride)\n\t\t\t[\n\t\t\t\tSNew(SImage)\n\t\t\t\t.Image(FDialogueStyle::Get()->GetBrush(FDialogueStyle::PROPERTY_GenericIcon))\n\t\t\t]\n\t\t)\n\t\t.ToolTipText(this, &Self::GetGenericOverlayTooltipText)\n\t\t.Visibility(this, &Self::GetOverlayWidgetVisibility)\n\t\t.OnGetBackgroundColor(this, &Self::GetOverlayWidgetBackgroundColor);\n\n\t// Set Default tooltip\n\tif (!SWidget::GetToolTip().IsValid())\n\t{\n\t\tTSharedRef<SToolTip> DefaultToolTip = IDocumentation::Get()->CreateToolTip(TAttribute<FText>(this, &Super::GetNodeTooltip), nullptr,\n\t\t\tGraphNode->GetDocumentationLink(), GraphNode->GetDocumentationExcerptName());\n\t\tSetToolTip(DefaultToolTip);\n\t}\n\n\t// Setup content\n\t{\n\t\tContentScale.Bind(this, &Super::GetContentScale);\n\t\tGetOrAddSlot(ENodeZone::Center)\n\t\t\t.HAlign(HAlign_Fill)\n\t\t\t.VAlign(VAlign_Center)\n\t\t\t[\n\t\t\t\tSNew(SBorder)\n\t\t\t\t.BorderImage(FEditorStyle::GetBrush(\"Graph.StateNode.Body\"))\n\t\t\t\t.Padding(0)\n\t\t\t\t.BorderBackgroundColor(Settings->BorderBackgroundColor)\n\t\t\t\t[\n\t\t\t\t\t// PIN AREA, output pin\n\t\t\t\t\tSNew(SOverlay)\n\t\t\t\t\t+SOverlay::Slot()\n\t\t\t\t\t.HAlign(HAlign_Fill)\n\t\t\t\t\t.VAlign(VAlign_Fill)\n\t\t\t\t\t[\n\t\t\t\t\t\tPinsNodeBox.ToSharedRef()\n\t\t\t\t\t]\n\n\t\t\t\t\t// Content/Body area\n\t\t\t\t\t+SOverlay::Slot()\n\t\t\t\t\t.HAlign(HAlign_Center)\n\t\t\t\t\t.VAlign(VAlign_Center)\n\t\t\t\t\t.Padding(NodePadding)\n\t\t\t\t\t[\n\t\t\t\t\t\tGetNodeBodyWidget()\n\t\t\t\t\t]\n\t\t\t\t]\n\t\t\t];\n\t\tCreatePinWidgets();\n\t}\n\n\t// Create comment bubble\n\t{\n\t\tTSharedPtr<SCommentBubble> CommentBubble;\n\t\tconst FSlateColor CommentColor = GetDefault<UGraphEditorSettings>()->DefaultCommentNodeTitleColor;\n\n\t\tSAssignNew(CommentBubble, SCommentBubble)\n\t\t\t.GraphNode(GraphNode)\n\t\t\t.Text(this, &Super::GetNodeComment)\n\t\t\t.OnTextCommitted(this, &Super::OnCommentTextCommitted)\n\t\t\t.OnToggled(this, &Super::OnCommentBubbleToggled)\n\t\t\t.ColorAndOpacity(CommentColor)\n\t\t\t.AllowPinning(true)\n\t\t\t.EnableTitleBarBubble(true)\n\t\t\t.EnableBubbleCtrls(true)\n\t\t\t.GraphLOD(this, &Super::GetCurrentLOD)\n\t\t\t.IsGraphNodeHovered(this, &Super::IsHovered);\n\n\t\t// Add it at the top, right above\n\t\tGetOrAddSlot(ENodeZone::TopCenter)\n\t\t\t.SlotOffset(TAttribute<FVector2D>(CommentBubble.Get(), &SCommentBubble::GetOffset))\n\t\t\t.SlotSize(TAttribute<FVector2D>(CommentBubble.Get(), &SCommentBubble::GetSize))\n\t\t\t.AllowScaling(TAttribute<bool>(CommentBubble.Get(), &SCommentBubble::IsScalingAllowed))\n\t\t\t.VAlign(VAlign_Top)\n\t\t\t[\n\t\t\t\tCommentBubble.ToSharedRef()\n\t\t\t];\n\t}\n}\n// End SGraphNode interface\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// Begin own functions\nTSharedRef<SWidget> SDialogueGraphNode::GetNodeBodyWidget()\n{\n\tif (NodeBodyWidget.IsValid())\n\t{\n\t\treturn NodeBodyWidget.ToSharedRef();\n\t}\n\n\t// Setup a meta tag for this node\n//\tFGraphNodeMetaData TagMeta(TEXT(\"UDialogueGraphNode_Base\"));\n//\tPopulateMetaTag(&TagMeta);\n\n\tNodeBodyWidget =\n\t\tSNew(SBorder)\n\t\t.BorderImage(FEditorStyle::GetBrush(\"BTEditor.Graph.BTNode.Body\"))\n\t\t.BorderBackgroundColor(this, &Self::GetBackgroundColor)\n\t\t.HAlign(HAlign_Center)\n\t\t.VAlign(VAlign_Center)\n\t\t.Padding(1.0f)\n\t\t.Visibility(EVisibility::Visible)\n\t\t[\n\t\t\t// Main Content\n\t\t\tSNew(SVerticalBox)\n\n\t\t\t// Title\n\t\t\t+SVerticalBox::Slot()\n\t\t\t.HAlign(HAlign_Fill)\n\t\t\t.VAlign(VAlign_Fill)\n\t\t\t.AutoHeight()\n\t\t\t[\n\t\t\t\tGetTitleWidget()\n\t\t\t]\n\n\t\t\t// Description\n\t\t\t+SVerticalBox::Slot()\n\t\t\t.HAlign(HAlign_Fill)\n\t\t\t.VAlign(VAlign_Fill)\n\t\t\t.AutoHeight()\n\t\t\t[\n\t\t\t\tGetDescriptionWidget()\n\t\t\t]\n\t\t];\n\n\treturn NodeBodyWidget.ToSharedRef();\n}\n\nTSharedRef<SWidget> SDialogueGraphNode::GetTitleWidget()\n{\n\tif (TitleWidget.IsValid())\n\t{\n\t\treturn TitleWidget.ToSharedRef();\n\t}\n\n\t// Title\n\tTSharedPtr<SNodeTitle> NodeTitleMultipleLines = SNew(SNodeTitle, GraphNode);\n\tTWeakPtr<SNodeTitle> WeakNodeTitle = NodeTitleMultipleLines;\n\tauto GetNodeTitlePlaceholderWidth = [WeakNodeTitle]() -> FOptionalSize\n\t{\n\t\tTSharedPtr<SNodeTitle> NodeTitlePin = WeakNodeTitle.Pin();\n\t\tconst float DesiredWidth = NodeTitlePin.IsValid() ? NodeTitlePin->GetTitleSize().X : 0.0f;\n\t\treturn FMath::Max(75.0f, DesiredWidth);\n\t};\n\tauto GetNodeTitlePlaceholderHeight = [WeakNodeTitle]() -> FOptionalSize\n\t{\n\t\tTSharedPtr<SNodeTitle> NodeTitlePin = WeakNodeTitle.Pin();\n\t\tconst float DesiredHeight = NodeTitlePin.IsValid() ? NodeTitlePin->GetTitleSize().Y : 0.0f;\n\t\treturn FMath::Max(22.0f, DesiredHeight);\n\t};\n\n\t// Icon and tint is set from the node\n\tIconColor = FLinearColor::White; // default\n\tconst FSlateBrush* IconBrush = nullptr;\n\tif (GraphNode->ShowPaletteIconOnNode())\n\t{\n\t\tIconBrush = GraphNode->GetIconAndTint(IconColor).GetIcon();\n\t}\n\n\tTitleWidget = SNew(SHorizontalBox)\n\t\t// Error message and title\n\t\t+SHorizontalBox::Slot()\n\t\t.HAlign(Settings->TitleHorizontalAlignment)\n\t\t.VAlign(VAlign_Top)\n\t\t.AutoWidth()\n\t\t[\n\t\t\tSNew(SHorizontalBox)\n\n\t\t\t// Error message\n\t\t\t+SHorizontalBox::Slot()\n\t\t\t.AutoWidth()\n\t\t\t[\n\t\t\t\t// POPUP ERROR MESSAGE\n\t\t\t\tErrorReporting->AsWidget()\n\t\t\t]\n\n\t\t\t// Title\n\t\t\t+SHorizontalBox::Slot()\n\t\t\t.AutoWidth()\n\t\t\t[\n\t\t\t\tSNew(SLevelOfDetailBranchNode)\n\t\t\t\t.UseLowDetailSlot(this, &Self::UseLowDetailNodeTitles)\n\t\t\t\t.LowDetail()\n\t\t\t\t[\n\t\t\t\t\tSNew(SBox)\n\t\t\t\t\t.WidthOverride_Lambda(GetNodeTitlePlaceholderWidth)\n\t\t\t\t\t.HeightOverride_Lambda(GetNodeTitlePlaceholderHeight)\n\t\t\t\t]\n\t\t\t\t.HighDetail()\n\t\t\t\t[\n\t\t\t\t\tSNew(SHorizontalBox)\n\n\t\t\t\t\t// Icon\n\t\t\t\t\t+SHorizontalBox::Slot()\n\t\t\t\t\t.AutoWidth()\n\t\t\t\t\t[\n\t\t\t\t\t\tSNew(SImage)\n\t\t\t\t\t\t.Image(IconBrush)\n\t\t\t\t\t\t.ColorAndOpacity(this, &Super::GetNodeTitleIconColor)\n\t\t\t\t\t]\n\n\t\t\t\t\t// Title content\n\t\t\t\t\t+SHorizontalBox::Slot()\n\t\t\t\t\t.AutoWidth()\n\t\t\t\t\t[\n\t\t\t\t\t\tSNew(SVerticalBox)\n\n\t\t\t\t\t\t// Display the first line\n\t\t\t\t\t\t+SVerticalBox::Slot()\n\t\t\t\t\t\t.AutoHeight()\n\t\t\t\t\t\t[\n\t\t\t\t\t\t\tSNew(STextBlock)\n\t\t\t\t\t\t\t// See FSlateEditorStyle for styles\n\t\t\t\t\t\t\t.TextStyle(FEditorStyle::Get(), \"Graph.StateNode.NodeTitle\")\n\t\t\t\t\t\t\t// gets always the first line of the title\n\t\t\t\t\t\t\t.Text(NodeTitleMultipleLines.Get(), &SNodeTitle::GetHeadTitle)\n\t\t\t\t\t\t]\n\n\t\t\t\t\t\t// Display the rest of the lines. The usage of SNodeTitle is a lie, the Style argument does not do anything.\n\t\t\t\t\t\t// This only starts dispalying from line 1 (if there is a multi line title)\n\t\t\t\t\t\t+SVerticalBox::Slot()\n\t\t\t\t\t\t.AutoHeight()\n\t\t\t\t\t\t[\n\t\t\t\t\t\t\tNodeTitleMultipleLines.ToSharedRef()\n\t\t\t\t\t\t]\n\t\t\t\t\t]\n\t\t\t\t]\n\t\t\t]\n\t\t];\n\n\treturn TitleWidget.ToSharedRef();\n}\n\nTSharedRef<SWidget> SDialogueGraphNode::GetDescriptionWidget()\n{\n\tif (DescriptionWidget.IsValid())\n\t{\n\t\treturn DescriptionWidget.ToSharedRef();\n\t}\n\n\tif (DialogueGraphNode->IsSpeechSequenceNode())\n\t{\n\t\tTSharedPtr<SVerticalBox> VerticalBox = SNew(SVerticalBox);\n\t\tconst int32 SpechSequnceEntriesNum = GetSpeechSequenceEntries().Num();\n\n\t\tfor (int32 EntryIndex = 0; EntryIndex < SpechSequnceEntriesNum; EntryIndex++)\n\t\t{\n\t\t\tVerticalBox->AddSlot()\n\t\t\t\t.AutoHeight()\n\t\t\t\t[\n\t\t\t\t\t// Black border around each entry\n\t\t\t\t\tSNew(SBorder)\n\t\t\t\t\t.BorderImage(FEditorStyle::GetBrush(\"PlainBorder\"))\n\t\t\t\t\t.BorderBackgroundColor(Settings->BorderBackgroundColor)\n\t\t\t\t\t.Padding(FMargin(0.f, 2.f))\n\t\t\t\t\t[\n\t\t\t\t\t\tSNew(SVerticalBox)\n\n\t\t\t\t\t\t// Speaker/Owner name of entry\n\t\t\t\t\t\t+SVerticalBox::Slot()\n\t\t\t\t\t\t.HAlign(Settings->DescriptionSpeakerHorizontalAlignment)\n\t\t\t\t\t\t.VAlign(VAlign_Center)\n\t\t\t\t\t\t.AutoHeight()\n\t\t\t\t\t\t[\n\t\t\t\t\t\t\tSNew(STextBlock)\n\t\t\t\t\t\t\t.Visibility(this, &Self::GetDescriptionVisibility)\n\t\t\t\t\t\t\t.Text(this, &Self::GetSpeakerForSpeechSequenceEntryAt, EntryIndex)\n\t\t\t\t\t\t\t.TextStyle(FEditorStyle::Get(), \"Graph.Node.NodeTitle\")\n\t\t\t\t\t\t\t.Margin(Settings->DescriptionSpeakerMargin)\n\t\t\t\t\t\t]\n\n\t\t\t\t\t\t// Text for entry\n\t\t\t\t\t\t+SVerticalBox::Slot()\n\t\t\t\t\t\t.AutoHeight()\n\t\t\t\t\t\t[\n\t\t\t\t\t\t\tSNew(STextBlock)\n\t\t\t\t\t\t\t.Visibility(this, &Self::GetDescriptionVisibility)\n\t\t\t\t\t\t\t.Text(this, &Self::GetDescriptionForSpeechSequenceEntryAt, EntryIndex)\n\t\t\t\t\t\t\t.WrapTextAt(Settings->DescriptionWrapTextAt)\n\t\t\t\t\t\t\t.Margin(Settings->DescriptionTextMargin)\n\t\t\t\t\t\t]\n\t\t\t\t\t]\n\t\t\t\t];\n\t\t}\n\t\tDescriptionWidget = VerticalBox;\n\t}\n\telse\n\t{\n\t\tDescriptionWidget = SNew(STextBlock)\n\t\t\t.Visibility(this, &Self::GetDescriptionVisibility)\n\t\t\t.Text(this, &Self::GetDescription)\n\t\t\t.WrapTextAt(Settings->DescriptionWrapTextAt)\n\t\t\t.Margin(Settings->DescriptionTextMargin);\n\t}\n\n\treturn DescriptionWidget.ToSharedRef();\n}\n\nEVisibility SDialogueGraphNode::GetOverlayWidgetVisibility() const\n{\n\t// always hide the index on the root node\n\tif (DialogueGraphNode->IsRootNode())\n\t{\n\t\treturn EVisibility::Hidden;\n\t}\n\n\t// LOD this out once things get too small\n\tTSharedPtr<SGraphPanel> MyOwnerPanel = GetOwnerPanel();\n\treturn !MyOwnerPanel.IsValid() || MyOwnerPanel->GetCurrentLOD() > EGraphRenderingLOD::LowDetail ? EVisibility::Visible : EVisibility::Collapsed;\n}\n\n\nFText SDialogueGraphNode::GetIndexOverlayTooltipText() const\n{\n\treturn LOCTEXT(\"NodeIndexTooltip\", \"Node index: this shows the node index in the Dialogue.Nodes Array\");\n}\n\nFText SDialogueGraphNode::GetConditionOverlayTooltipText() const\n{\n\treturn LOCTEXT(\"NodeConditionTooltip\", \"Node has enter conditions.\\nOnly if these conditions are satisfied the node is entered.\");\n}\n\nFText SDialogueGraphNode::GetEventOverlayTooltipText() const\n{\n\treturn LOCTEXT(\"NodeEventTooltip\", \"Node has enter events.\\nOn node enter this events are executed.\");\n}\n\nFText SDialogueGraphNode::GetVoiceOverlayTooltipText() const\n{\n\treturn LOCTEXT(\"NodeVoiceTooltip\", \"Node has some voice variables set. Either the SoundWave or the DialogueWave.\");\n}\n\nFText SDialogueGraphNode::GetGenericOverlayTooltipText() const\n{\n\treturn LOCTEXT(\"NodeGenericTooltip\", \"Node has the generic data variable set.\");\n}\n\nvoid SDialogueGraphNode::OnIndexHoverStateChanged(bool bHovered)\n{\n\n}\n// End own functions\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n#undef LOCTEXT_NAMESPACE\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystemEditor/Private/DialogueEditor/Nodes/SDialogueGraphNode.h",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#pragma once\n\n#include \"Layout/Visibility.h\"\n#include \"Widgets/DeclarativeSyntaxSupport.h\"\n#include \"Input/Reply.h\"\n#include \"SGraphNode.h\"\n#include \"SGraphPanel.h\"\n\n#include \"DialogueGraphNode.h\"\n#include \"SDialogueGraphNode_Base.h\"\n\nclass SVerticalBox;\n\n/**\n * Widget for UDialogueGraphNode\n */\nclass SDialogueGraphNode : public SDialogueGraphNode_Base\n{\n\ttypedef SDialogueGraphNode_Base Super;\n\ttypedef SDialogueGraphNode Self;\n\npublic:\n\tSLATE_BEGIN_ARGS(Self) {}\n\tSLATE_END_ARGS()\n\n\tvoid Construct(const FArguments& InArgs, UDialogueGraphNode* InNode);\n\n\t// Begin SWidget interface\n\tvoid OnDragEnter(const FGeometry& MyGeometry, const FDragDropEvent& DragDropEvent) override\n\t{\n\t\tSuper::OnDragEnter(MyGeometry, DragDropEvent);\n\t}\n\tvoid OnDragLeave(const FDragDropEvent& DragDropEvent) override\n\t{\n\t\tSuper::OnDragLeave(DragDropEvent);\n\t}\n\n\tFReply OnDragOver(const FGeometry& MyGeometry, const FDragDropEvent& DragDropEvent) override\n\t{\n\t\treturn Super::OnDragOver(MyGeometry, DragDropEvent);\n\t}\n\tFReply OnDrop(const FGeometry& MyGeometry, const FDragDropEvent& DragDropEvent) override;\n\n\tFReply OnMouseButtonDoubleClick(const FGeometry& InMyGeometry, const FPointerEvent& InMouseEvent) override\n\t{\n\t\treturn Super::OnMouseButtonDoubleClick(InMyGeometry, InMouseEvent);\n\t}\n\tFReply OnMouseMove(const FGeometry& SenderGeometry, const FPointerEvent& MouseEvent) override\n\t{\n\t\treturn Super::OnMouseMove(SenderGeometry, MouseEvent);\n\t}\n\t// End of SWidget interface\n\n\t// Begin SNodePanel::SNode Interface\n\n\t/** Populate the widgets array with any overlay widgets to render */\n\tTArray<FOverlayWidgetInfo> GetOverlayWidgets(bool bSelected, const FVector2D& WidgetSize) const override;\n\n\t/** Populate the brushes array with any overlay brushes to render */\n\tvoid GetOverlayBrushes(bool bSelected, const FVector2D WidgetSize, TArray<FOverlayBrushInfo>& Brushes) const override;\n\t// End SNodePanel::SNode Interface\n\n\t// Begin SGraphNode Interface\n\n\t/** Update this GraphNode to match the data that it is observing */\n\tvoid UpdateGraphNode() override;\n\t// End SGraphNode Interface\n\n\t// Begin SDialogueGraphNode_Base Interface\n\tEVisibility GetNodeVisibility() const override\n\t{\n\t\treturn DialogueGraphNode && DialogueGraphNode->ShouldDrawNode() ? EVisibility::Visible : EVisibility::Hidden;\n\t}\n\t// End SDialogueGraphNode_Base Interface\n\nprotected:\n\t//\n\t// SGraphNode Interface\n\t//\n\n\t/** Override this to provide support for an 'expensive' tooltip widget that is only built on demand */\n\tTSharedPtr<SToolTip> GetComplexTooltip() override { return Super::GetComplexTooltip(); }\n\n\t/** Should we use low-detail node titles? Used by UpdateGraphNode() */\n\tbool UseLowDetailNodeTitles() const override\n\t{\n\t\tif (const SGraphPanel* MyOwnerPanel = GetOwnerPanel().Get())\n\t\t{\n\t\t\treturn MyOwnerPanel->GetCurrentLOD() <= EGraphRenderingLOD::LowestDetail;\n\t\t}\n\n\t\treturn false;\n\t}\n\n\t/** Return the desired comment bubble color */\n\tFSlateColor GetCommentColor() const override { return DialogueGraphNode->GetNodeBackgroundColor(); }\n\n\t/* Populate a meta data tag with information about this graph node. sed by UpdateGraphNode() */\n\tvoid PopulateMetaTag(class FGraphNodeMetaData* TagMeta) const override { Super::PopulateMetaTag(TagMeta); }\n\n\t//\n\t// Begin own functions\n\t//\n\n\t/** Gets/Creates the inner node content area. Used by UpdateGraphNode() */\n\tTSharedRef<SWidget> GetNodeBodyWidget();\n\n\t/** Gets the actual title widget to display */\n\tTSharedRef<SWidget> GetTitleWidget();\n\n\t/** Gets the actual description widget to display */\n\tTSharedRef<SWidget> GetDescriptionWidget();\n\n\t// Gets the background color for a node\n\tFSlateColor GetBackgroundColor() const { return DialogueGraphNode->GetNodeBackgroundColor(); }\n\n\t// Gets the main description of this Node.\n\tFText GetDescription() const\n\t{\n\t\tif (DialogueGraphNode && DialogueGraphNode->IsDialogueNodeSet())\n\t\t{\n\t\t\treturn DialogueGraphNode->GetDialogueNode().GetNodeUnformattedText();\n\t\t}\n\n\t\treturn FText::GetEmpty();\n\t}\n\n\t// Gets all speech sequence entries for the Node of type Speech Sequence\n\tconst TArray<FDlgSpeechSequenceEntry>& GetSpeechSequenceEntries() const\n\t{\n\t\treturn DialogueGraphNode->GetDialogueNode<UDlgNode_SpeechSequence>().GetNodeSpeechSequence();\n\t}\n\n\t// Gets the speech sequence description for the entry at index SpeechEntryIndex\n\tFText GetDescriptionForSpeechSequenceEntryAt(int32 SpeechEntryIndex) const\n\t{\n\t\tif (DialogueGraphNode && DialogueGraphNode->IsSpeechSequenceNode())\n\t\t{\n\t\t\treturn GetSpeechSequenceEntries()[SpeechEntryIndex].Text;\n\t\t}\n\n\t\treturn FText::GetEmpty();\n\t}\n\n\t// Gets the speaker (owner) of speech sequence for the entry at index SpeechEntryIndex\n\tFText GetSpeakerForSpeechSequenceEntryAt(int32 SpeechEntryIndex) const\n\t{\n\t\tif (DialogueGraphNode && DialogueGraphNode->IsSpeechSequenceNode())\n\t\t{\n\t\t\treturn FText::FromName(GetSpeechSequenceEntries()[SpeechEntryIndex].Speaker);\n\t\t}\n\n\t\treturn FText::GetEmpty();\n\t}\n\n\t// Gets the visibility of the Description\n\tEVisibility GetDescriptionVisibility() const\n\t{\n\t\t// LOD this out once things get too small\n\t\tTSharedPtr<SGraphPanel> MyOwnerPanel = GetOwnerPanel();\n\t\treturn !MyOwnerPanel.IsValid() || MyOwnerPanel->GetCurrentLOD() > EGraphRenderingLOD::LowDetail ? EVisibility::Visible : EVisibility::Collapsed;\n\t}\n\n\t/** Gets the text to display in the index overlay */\n\tFText GetIndexText() const { return FText::AsNumber(DialogueGraphNode->GetDialogueNodeIndex()); }\n\n\t/** Gets the tooltip for the index overlay */\n\tFText GetIndexOverlayTooltipText() const;\n\n\t/** Gets the tooltip for the condition overelay. */\n\tFText GetConditionOverlayTooltipText() const;\n\n\t/** Gets the tooltip for the event overlay. */\n\tFText GetEventOverlayTooltipText() const;\n\n\t/** Gets the tooltip for the voice overlay. */\n\tFText GetVoiceOverlayTooltipText() const;\n\n\t/** Gets the tooltip for the voice overlay. */\n\tFText GetGenericOverlayTooltipText() const;\n\n\t/** Get the visibility of the overlay widgets. */\n\tEVisibility GetOverlayWidgetVisibility() const;\n\n\t/** Get the background color to display for the widget overlay. This changes on hover state of sibling nodes */\n\tFSlateColor GetOverlayWidgetBackgroundColor(bool bHovered) const\n\t{\n\t\t// Hovered is gray\n\t\treturn bHovered ? Settings->BorderHoveredBackgroundColor : Settings->BorderBackgroundColor;\n\t}\n\n\t/** Handle hover state changing for the index widget - we use this to highlight sibling nodes */\n\tvoid OnIndexHoverStateChanged(bool bHovered);\n\t// End own functions\n\nprotected:\n\t// The dialogue this view represents\n\tUDialogueGraphNode* DialogueGraphNode = nullptr;\n\n\t/** The node body widget, cached here so we can determine its size when we want ot position our overlays */\n\tTSharedPtr<SBorder> NodeBodyWidget;\n\n\t/** The widget that holds the title section */\n\tTSharedPtr<SWidget> TitleWidget;\n\n\t/** The widget that hold the description text */\n\tTSharedPtr<SWidget> DescriptionWidget;\n\n\t/** The widget we use to display the index of the node */\n\tTSharedPtr<SWidget> IndexOverlayWidget;\n\n\t/** The widget we use to display if the node has any enter conditions */\n\tTSharedPtr<SWidget> ConditionOverlayWidget;\n\n\t/** The widget we use to display if the node has any enter events */\n\tTSharedPtr<SWidget> EventOverlayWidget;\n\n\t/** The widget we use to display if the node has voice/sound variables set */\n\tTSharedPtr<SWidget> VoiceOverlayWidget;\n\n\t/** The widget we use to display if the node has the GenericData variable set */\n\tTSharedPtr<SWidget> GenericOverlayWidget;\n};\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystemEditor/Private/DialogueEditor/Nodes/SDialogueGraphNode_Base.cpp",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#include \"SDialogueGraphNode_Base.h\"\n\n#include \"Widgets/Layout/SBox.h\"\n#include \"DialogueGraphNode_Root.h\"\n#include \"IDocumentation.h\"\n#include \"GraphEditorDragDropAction.h\"\n\n#include \"SDialogueGraphPin.h\"\n\n#define LOCTEXT_NAMESPACE \"DialogueEditor\"\n\n\n/////////////////////////////////////////////////////\n// SDialogueGraphNode_Base\nvoid SDialogueGraphNode_Base::Construct(const FArguments& InArgs, UDialogueGraphNode_Base* InNode)\n{\n\tGraphNode = Cast<UEdGraphNode>(InNode);\n\tDialogueGraphNode_Base = InNode;\n\tSettings = GetDefault<UDlgSystemSettings>();\n}\n\nvoid SDialogueGraphNode_Base::CreatePinWidgets()\n{\n\t// Create only one pin, the output one, the rest is handled by FDialogueGraphConnectionDrawingPolicy\n\tUEdGraphPin* OutputPin = DialogueGraphNode_Base->GetOutputPin();\n\tUEdGraphPin* InputPin = DialogueGraphNode_Base->GetInputPin();\n\n\t// Order is important, or something like that.\n\tif (!IsValidPin(InputPin))\n\t{\n\t\treturn;\n\t}\n\n\t//CreateStandardPinWidget(InputPin);\n\n\tif (!IsValidPin(OutputPin))\n\t{\n\t\treturn;\n\t}\n\n\tCreateStandardPinWidget(OutputPin);\n}\n\nvoid SDialogueGraphNode_Base::CreateStandardPinWidget(UEdGraphPin* Pin)\n{\n\tSuper::CreateStandardPinWidget(Pin);\n}\n\nvoid SDialogueGraphNode_Base::UpdateGraphNode()\n{\n\t// Reset variables that are going to be exposed, in case we are refreshing an already setup node.\n\tInputPins.Empty();\n\tOutputPins.Empty();\n\tRightNodeBox.Reset();\n\tLeftNodeBox.Reset();\n\tPinsNodeBox.Reset();\n\tSAssignNew(PinsNodeBox, SVerticalBox);\n\n\t// This Node visibility\n\tSetVisibility(TAttribute<EVisibility>::Create(TAttribute<EVisibility>::FGetter::CreateSP(this, &Self::GetNodeVisibility)));\n}\n\nvoid SDialogueGraphNode_Base::SetOwner(const TSharedRef<SGraphPanel>& OwnerPanel)\n{\n\tcheck(!OwnerGraphPanelPtr.IsValid());\n\tSetParentPanel(OwnerPanel);\n\tOwnerGraphPanelPtr = OwnerPanel;\n\tGraphNode->DEPRECATED_NodeWidget = SharedThis(this);\n\n\t// Once we have an owner, and if hide Unused pins is enabled, we need to remake our pins to drop the hidden ones\n\tif (OwnerGraphPanelPtr.Pin()->GetPinVisibility() != SGraphEditor::Pin_Show && PinsNodeBox.IsValid())\n\t{\n\t\tPinsNodeBox->ClearChildren();\n\t\tCreatePinWidgets();\n\t}\n}\n\nTSharedPtr<SGraphPin> SDialogueGraphNode_Base::CreatePinWidget(UEdGraphPin* Pin) const\n{\n\t// Called by CreateStandardPinWidget\n\treturn SNew(SDialogueGraphPin, Pin);\n}\n\nvoid SDialogueGraphNode_Base::AddPin(const TSharedRef<SGraphPin>& PinToAdd)\n{\n\tPinToAdd->SetOwner(SharedThis(this));\n\tPinsNodeBox->AddSlot()\n\t\t.HAlign(HAlign_Fill)\n\t\t.VAlign(VAlign_Fill)\n\t\t.FillHeight(1.0f)\n\t\t[\n\t\t\tPinToAdd\n\t\t];\n\n\tif (PinToAdd->GetDirection() == EGPD_Output)\n\t{\n\t\tOutputPins.Add(PinToAdd);\n\t}\n\telse\n\t{\n\t\tInputPins.Add(PinToAdd);\n\t}\n}\n// End SGraphNode interface\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n#undef LOCTEXT_NAMESPACE\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystemEditor/Private/DialogueEditor/Nodes/SDialogueGraphNode_Base.h",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#pragma once\n\n#include \"Layout/Visibility.h\"\n#include \"Widgets/DeclarativeSyntaxSupport.h\"\n#include \"SGraphNode.h\"\n#include \"SGraphPanel.h\"\n\n#include \"DialogueGraphNode.h\"\n#include \"DlgSystemSettings.h\"\n\nclass SVerticalBox;\n\n/**\n * Widget for UDialogueGraphNode_Base\n */\nclass SDialogueGraphNode_Base : public SGraphNode\n{\n\ttypedef SGraphNode Super;\n\ttypedef SDialogueGraphNode_Base Self;\n\npublic:\n\tSLATE_BEGIN_ARGS(Self) {}\n\tSLATE_END_ARGS()\n\n\tvoid Construct(const FArguments& InArgs, UDialogueGraphNode_Base* InNode);\n\n\t// Begin SGraphNode Interface\n\t/** Create the widgets for pins on the node */\n\tvoid CreatePinWidgets() override;\n\n\t/** Create a single pin widget */\n\tvoid CreateStandardPinWidget(UEdGraphPin* Pin) override;\n\n\t/** Update this GraphNode to match the data that it is observing */\n\tvoid UpdateGraphNode() override;\n\n\t/** @param OwnerPanel  The GraphPanel that this node belongs to */\n\tvoid SetOwner(const TSharedRef<SGraphPanel>& OwnerPanel) override;\n\t// End SGraphNode Interface\n\n\t// Begin own methods\n\n\t/** Is the current node visible? */\n\tvirtual EVisibility GetNodeVisibility() const { return EVisibility::Visible; }\n\nprotected:\n\t// SGraphNode Interface\n\t/**\n\t * Add a new pin to this graph node. The pin must be newly created.\n\t *\n\t * @param PinToAdd   A new pin to add to this GraphNode.\n\t */\n\tvoid AddPin(const TSharedRef<SGraphPin>& PinToAdd) override;\n\n\t/** Hook that allows derived classes to supply their own SGraphPin derivatives for any pin. Used by CreateStandardPinWidget. */\n\tTSharedPtr<SGraphPin> CreatePinWidget(UEdGraphPin* Pin) const override;\n\nprivate:\n\t/** Tells us if the provided pin is valid.  */\n\tbool IsValidPin(UEdGraphPin* Pin)\n\t{\n\t\treturn ensureMsgf(Pin->GetOuter() == GraphNode,\n\t\t\tTEXT(\"Graph node ('%s' - %s) has an invalid %s pin: '%s'; (with a bad %s outer: '%s'); skiping creation of a widget for this pin.\"),\n\t\t\t*GraphNode->GetNodeTitle(ENodeTitleType::ListView).ToString(),\n\t\t\t*GraphNode->GetPathName(),\n\t\t\tPin->Direction == EEdGraphPinDirection::EGPD_Input ? TEXT(\"input\") : TEXT(\"output\"),\n\t\t\tPin->PinFriendlyName.IsEmpty() ? *Pin->PinName.ToString() : *Pin->PinFriendlyName.ToString(),\n\t\t\tPin->GetOuter() ? *Pin->GetOuter()->GetClass()->GetName() : TEXT(\"UNKNOWN\"),\n\t\t\tPin->GetOuter() ? *Pin->GetOuter()->GetPathName() : TEXT(\"NULL\"));\n\t}\n\nprotected:\n\t// The Base dialogue node this widget represents\n\tUDialogueGraphNode_Base* DialogueGraphNode_Base = nullptr;\n\n\t// Cache the Dialogue settings\n\tconst UDlgSystemSettings* Settings = nullptr;\n\n\t/** The area where output/input pins reside */\n\tTSharedPtr<SVerticalBox> PinsNodeBox;\n};\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystemEditor/Private/DialogueEditor/Nodes/SDialogueGraphNode_Edge.cpp",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#include \"SDialogueGraphNode_Edge.h\"\n\n#include \"IDocumentation.h\"\n#include \"SGraphPanel.h\"\n#include \"Widgets/Images/SImage.h\"\n#include \"Widgets/SToolTip.h\"\n#include \"Widgets/Layout/SBox.h\"\n\n#include \"DialogueGraphNode.h\"\n#include \"SDialogueNodeOverlayWidget.h\"\n#include \"DialogueStyle.h\"\n\n#define LOCTEXT_NAMESPACE \"DialogueEditor\"\n\n/////////////////////////////////////////////////////\n// SDialogueGraphNode_Edge\nvoid SDialogueGraphNode_Edge::Construct(const FArguments& InArgs, UDialogueGraphNode_Edge* InNode)\n{\n\tSuper::Construct(Super::FArguments(), InNode);\n\tDialogueGraphNode_Edge = InNode;\n\n\tUpdateGraphNode();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// Begin SWidget interface\nvoid SDialogueGraphNode_Edge::OnMouseEnter(const FGeometry& MyGeometry, const FPointerEvent& MouseEvent)\n{\n\t// NOTE: adding the OutputPin to the hover set will not work, only the input pin makes the connection\n\t// to be hovered\n\tTSharedPtr<SGraphPanel> GraphPanel = GetOwnerPanel();\n\tGraphPanel->AddPinToHoverSet(DialogueGraphNode_Edge->GetInputPin());\n\tSuper::OnMouseEnter(MyGeometry, MouseEvent);\n}\n\nvoid SDialogueGraphNode_Edge::OnMouseLeave(const FPointerEvent& MouseEvent)\n{\n\tTSharedPtr<SGraphPanel> GraphPanel = GetOwnerPanel();\n\tGraphPanel->RemovePinFromHoverSet(DialogueGraphNode_Edge->GetInputPin());\n\tSuper::OnMouseLeave(MouseEvent);\n}\n// End SWidget interface\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// Begin SNodePanel::SNode Interface\nvoid SDialogueGraphNode_Edge::MoveTo(const FVector2D& NewPosition, FNodeSet& NodeFilter)\n{\n\t// Ignored; position is set by the location of the attached nodes\n\tSuper::MoveTo(NewPosition, NodeFilter);\n}\n\nvoid SDialogueGraphNode_Edge::PerformSecondPassLayout(const TMap<UObject*, TSharedRef<SNode>>& NodeToWidgetLookup) const\n{\n\t// Find the geometry of the nodes we're connecting\n\tFGeometry StartGeom;\n\tFGeometry EndGeom;\n\tstatic constexpr int32 NodeIndex = 0;\n\tstatic constexpr int32 NumberOfEdges = 1;\n\n\t// Get the widgets the input/output node and find the geometries and the node inde and number of edges\n\tUDialogueGraphNode* ParentNode = DialogueGraphNode_Edge->GetParentNode();\n\tUDialogueGraphNode* ChildNode = DialogueGraphNode_Edge->GetChildNode();\n\tconst TSharedRef<SNode>* pPrevNodeWidget = NodeToWidgetLookup.Find(ParentNode);\n\tconst TSharedRef<SNode>* pNextNodeWidget = NodeToWidgetLookup.Find(ChildNode);\n\tif (pPrevNodeWidget != nullptr && pNextNodeWidget != nullptr)\n\t{\n\t\tconst TSharedRef<SNode>& PrevNodeWidget = *pPrevNodeWidget;\n\t\tconst TSharedRef<SNode>& NextNodeWidget = *pNextNodeWidget;\n\n\t\tStartGeom = FGeometry(FVector2D(ParentNode->NodePosX, ParentNode->NodePosY), FVector2D::ZeroVector, PrevNodeWidget->GetDesiredSize(), 1.0f);\n\t\tEndGeom = FGeometry(FVector2D(ChildNode->NodePosX, ChildNode->NodePosY), FVector2D::ZeroVector, NextNodeWidget->GetDesiredSize(), 1.0f);\n\n\t\t// TODO do we need this? seems pointless as we can have only one edge between the same two nodes\n//\t\t// Get the input node graph edges, and filter those that only point to tour outputnode\n//\t\tTArray<UDialogueGraphNode_Edge*> GraphNode_Edges = InputNode->GetGraphNodeEdges();\n//\t\tGraphNode_Edges = GraphNode_Edges.FilterByPredicate([OutputNode](const UDialogueGraphNode_Edge* InEdge) -> bool\n//\t\t{\n//\t\t\treturn InEdge->GetOutputNode() == OutputNode;\n//\t\t});\n//\t\tNodeIndex = GraphNode_Edges.IndexOfByKey(DialogueGraphNode_Edge);\n//\t\tNumberOfEdges = GraphNode_Edges.Num();\n\t}\n\n\t// Position Node\n\tPositionBetweenTwoNodesWithOffset(StartGeom, EndGeom, NodeIndex, NumberOfEdges);\n}\n\nTArray<FOverlayWidgetInfo> SDialogueGraphNode_Edge::GetOverlayWidgets(bool bSelected, const FVector2D& WidgetSize) const\n{\n\t// This is called after PerformSecondPassLayout, so the Edge should be in it's final Position Already\n\tTArray<FOverlayWidgetInfo> Widgets;\n\n\tif (ConditionOverlayWidget.IsValid())\n\t{\n\t\tif (Settings->bShowEdgeHasConditionsIcon && DialogueGraphNode_Edge->HasConditions())\n\t\t{\n\t\t\tFOverlayWidgetInfo Overlay(ConditionOverlayWidget);\n\t\t\t// Position on the top/right of the node\n\t\t\tconst FVector2D& NewDesiredSize = ConditionOverlayWidget->GetDesiredSize();\n\t\t\tOverlay.OverlayOffset = FVector2D(WidgetSize.X - NewDesiredSize.X / 2.0f, -NewDesiredSize.Y / 2.0f);\n\t\t\tWidgets.Add(Overlay);\n\t\t}\n\t}\n\n\treturn Widgets;\n}\n// End SNodePanel::SNode Interface\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// Begin SGraphNode Interface\nvoid SDialogueGraphNode_Edge::UpdateGraphNode()\n{\n\tSuper::UpdateGraphNode();\n\n\t// Fit to content\n\tconstexpr int WidthOverride = 16;\n\tconstexpr int HeightOverride = 16;\n\tConditionOverlayWidget = SNew(SDialogueNodeOverlayWidget)\n\t\t.OverlayBody(\n\t\t\tSNew(SBox)\n\t\t\t.HAlign(HAlign_Fill)\n\t\t\t.VAlign(VAlign_Fill)\n\t\t\t.WidthOverride(WidthOverride)\n\t\t\t.HeightOverride(HeightOverride)\n\t\t\t[\n\t\t\t\tSNew(SImage)\n\t\t\t\t.Image(FDialogueStyle::Get()->GetBrush(FDialogueStyle::PROPERTY_QuestionMarkIcon))\n\t\t\t]\n\t\t)\n\t\t.ToolTipText(this, &Self::GetConditionOverlayTooltipText)\n\t\t.Visibility(this, &Self::GetOverlayWidgetVisibility)\n\t\t.OnGetBackgroundColor(this, &Self::GetOverlayWidgetBackgroundColor);\n\n\t// Set Default tooltip\n\tif (!SWidget::GetToolTip().IsValid())\n\t{\n\t\tconst TSharedRef<SToolTip> DefaultToolTip = IDocumentation::Get()->CreateToolTip(TAttribute<FText>(this, &Super::GetNodeTooltip), nullptr,\n\t\t\tGraphNode->GetDocumentationLink(), GraphNode->GetDocumentationExcerptName());\n\t\tSetToolTip(DefaultToolTip);\n\t}\n\n\tContentScale.Bind(this, &Super::GetContentScale);\n\tGetOrAddSlot(ENodeZone::Center)\n\t\t.HAlign(HAlign_Center)\n\t\t.VAlign(VAlign_Center)\n\t\t[\n\t\t\tSNew(SOverlay)\n\n#if ENGINE_MINOR_VERSION >= 24\n\t\t\t// >= 4.24\n\t\t\t+SOverlay::Slot()\n\t\t\t[\n\t\t\t\tSNew(SImage)\n\t\t\t\t.Image(FEditorStyle::GetBrush(\"Graph.TransitionNode.ColorSpill\"))\n\t\t\t\t.ColorAndOpacity(this, &Self::GetTransitionColor)\n\t\t\t]\n\t\t\t+SOverlay::Slot()\n\t\t\t[\n\t\t\t\tSNew(SImage)\n\t\t\t\t.Image(FEditorStyle::GetBrush(\"Graph.TransitionNode.Icon\"))\n\t\t\t]\n#else\n\t\t\t+SOverlay::Slot()\n\t\t\t[\n\t\t\t\tSNew(SImage)\n\t\t\t\t.Image(FEditorStyle::GetBrush(\"Graph.TransitionNode.Body\"))\n\t\t\t]\n\t\t\t+SOverlay::Slot()\n\t\t\t[\n\t\t\t\tSNew(SImage)\n\t\t\t\t.Image(FEditorStyle::GetBrush(\"Graph.TransitionNode.ColorSpill\"))\n\t\t\t\t.ColorAndOpacity(this, &Self::GetTransitionColor)\n\t\t\t]\n\t\t\t+SOverlay::Slot()\n\t\t\t[\n\t\t\t\tSNew(SImage)\n\t\t\t\t.Image(FEditorStyle::GetBrush(\"Graph.TransitionNode.Icon\"))\n\t\t\t]\n\t\t\t+SOverlay::Slot()\n\t\t\t[\n\t\t\t\tSNew(SImage)\n\t\t\t\t.Image(FEditorStyle::GetBrush(\"Graph.TransitionNode.Gloss\"))\n\t\t\t]\n#endif // ENGINE_MINOR_VERSION >= 24\n\t\t];\n}\n//  End SGraphNode Interface\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// Begin own functions\nvoid SDialogueGraphNode_Edge::PositionBetweenTwoNodesWithOffset(const FGeometry& StartGeom, const FGeometry& EndGeom, int32 NodeIndex, int32 MaxNodes) const\n{\n\tcheck(NodeIndex >= 0);\n\tcheck(MaxNodes > 0);\n\n\t// Get a reasonable seed point (halfway between the boxes)\n\tconst FVector2D StartCenter = FGeometryHelper::CenterOf(StartGeom);\n\tconst FVector2D EndCenter = FGeometryHelper::CenterOf(EndGeom);\n\tconst FVector2D SeedPoint = (StartCenter + EndCenter) / 2.0f;\n\n\t// Find the (approximate) closest points between the two boxes\n\tconst FVector2D StartAnchorPoint = FGeometryHelper::FindClosestPointOnGeom(StartGeom, SeedPoint);\n\tconst FVector2D EndAnchorPoint = FGeometryHelper::FindClosestPointOnGeom(EndGeom, SeedPoint);\n\n\t// Position ourselves halfway along the connecting line between the nodes, elevated away perpendicular to the direction of the line\n\tstatic constexpr float Height = 30.0f;\n\tconst FVector2D DesiredNodeSize = GetDesiredSize();\n\n\tFVector2D DeltaPos(EndAnchorPoint - StartAnchorPoint);\n\tif (DeltaPos.IsNearlyZero())\n\t{\n\t\tDeltaPos = FVector2D(10.0f, 0.0f);\n\t}\n\n\tconst FVector2D Normal = FVector2D(DeltaPos.Y, -DeltaPos.X).GetSafeNormal();\n\tconst FVector2D NewCenter = StartAnchorPoint + (0.5f * DeltaPos) + (Height * Normal);\n\tconst FVector2D DeltaNormal = DeltaPos.GetSafeNormal();\n\n\t// TODO do we need this?\n\t// Calculate node offset in the case of multiple transitions between the same two nodes\n\t// MultiNodeOffset: the offset where 0 is the centre of the transition, -1 is 1 <size of node>\n\t// towards the PrevStateNode and +1 is 1 <size of node> towards the NextStateNode.\n\tstatic constexpr float MultiNodeSpace = 0.2f; // Space between multiple edge nodes (in units of <size of node> )\n\tstatic constexpr float MultiNodeStep = 1.f + MultiNodeSpace; // Step between node centres (Size of node + size of node spacer)\n\n\tconst float MultiNodeStart = -((MaxNodes - 1) * MultiNodeStep) / 2.f;\n\tconst float MultiNodeOffset = MultiNodeStart + (NodeIndex * MultiNodeStep);\n\n\t// Now we need to adjust the new center by the node size, zoom factor and multi node offset\n\tconst FVector2D NewCorner = NewCenter - (0.5f * DesiredNodeSize) + (DeltaNormal * MultiNodeOffset * DesiredNodeSize.Size());\n\n\tGraphNode->NodePosX = NewCorner.X;\n\tGraphNode->NodePosY = NewCorner.Y;\n}\n\nFText SDialogueGraphNode_Edge::GetConditionOverlayTooltipText() const\n{\n\treturn LOCTEXT(\"NodeConditionTooltip\", \"Edge has conditions.\\nOnly if these conditions are satisfied then this edge is considered as an option.\");\n}\n\nEVisibility SDialogueGraphNode_Edge::GetOverlayWidgetVisibility() const\n{\n\t// LOD this out once things get too small\n\tTSharedPtr<SGraphPanel> MyOwnerPanel = GetOwnerPanel();\n\treturn !MyOwnerPanel.IsValid() || MyOwnerPanel->GetCurrentLOD() > EGraphRenderingLOD::LowDetail ? EVisibility::Visible : EVisibility::Collapsed;\n}\n\n// End own functions\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n#undef LOCTEXT_NAMESPACE\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystemEditor/Private/DialogueEditor/Nodes/SDialogueGraphNode_Edge.h",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#pragma once\n\n#include \"Widgets/DeclarativeSyntaxSupport.h\"\n#include \"SGraphNode.h\"\n\n#include \"DialogueGraphNode_Edge.h\"\n#include \"SDialogueGraphNode_Base.h\"\n\n/**\n * Widget for UDialogueGraphNode_Edge\n */\nclass SDialogueGraphNode_Edge : public SDialogueGraphNode_Base\n{\n\ttypedef SDialogueGraphNode_Base Super;\n\ttypedef SDialogueGraphNode_Edge Self;\n\npublic:\n\tSLATE_BEGIN_ARGS(Self) {}\n\tSLATE_END_ARGS()\n\n\tvoid Construct(const FArguments& InArgs, UDialogueGraphNode_Edge* InNode);\n\n\t// Begin SWidget interface\n\n\t/**\n\t * The system will use this event to notify a widget that the cursor has entered it. This event is uses a custom bubble strategy.\n\t *\n\t * @param MyGeometry The Geometry of the widget receiving the event\n\t * @param MouseEvent Information about the input event\n\t */\n\tvoid OnMouseEnter(const FGeometry& MyGeometry, const FPointerEvent& MouseEvent) override;\n\n\t/**\n\t * The system will use this event to notify a widget that the cursor has left it. This event is uses a custom bubble strategy.\n\t *\n\t * @param MouseEvent Information about the input event\n\t */\n\tvoid OnMouseLeave(const FPointerEvent& MouseEvent) override;\n\n\t// End SWidget interface\n\n\t// Begin SNodePanel::SNode Interface\n\n\t/**\n\t * @param NewPosition\tThe Node should be relocated to this position in the graph panel\n\t * @param NodeFilter\t\tSet of nodes to prevent movement on, after moving successfully a node is added to this set.\n\t */\n\tvoid MoveTo(const FVector2D& NewPosition, FNodeSet& NodeFilter) override;\n\n\t/** Returns true if this node is dependent on the location of other nodes (it can only depend on the location of first-pass only nodes) */\n\tbool RequiresSecondPassLayout() const override { return true; }\n\n\t/** Performs second pass layout; only called if RequiresSecondPassLayout returned true */\n\tvoid PerformSecondPassLayout(const TMap<UObject*, TSharedRef<SNode>>& InNodeToWidgetLookup) const override;\n\n\t/** Populate the widgets array with any overlay widgets to render */\n\tTArray<FOverlayWidgetInfo> GetOverlayWidgets(bool bSelected, const FVector2D& WidgetSize) const override;\n\t// End SNodePanel::SNode Interface\n\n\t// Begin SGraphNode Interface\n\t/** Update this GraphNode to match the data that it is observing */\n\tvoid UpdateGraphNode() override;\n\t// End SGraphNode Interface\n\n\t// Begin SDialogueGraphNode_Base Interface\n\tEVisibility GetNodeVisibility() const override\n\t{\n\t\treturn DialogueGraphNode_Edge && DialogueGraphNode_Edge->ShouldDrawEdge() ? EVisibility::Visible : EVisibility::Hidden;\n\t}\n\t// End SDialogueGraphNode_Base Interface\n\n\t// Begin own functions\n\t/** Calculate position for multiple nodes to be placed between a start and end point, by providing this nodes index and max expected nodes */\n\tvoid PositionBetweenTwoNodesWithOffset(const FGeometry& StartGeom, const FGeometry& EndGeom, int32 NodeIndex, int32 MaxNodes) const;\n\n\t/** Gets the transition color of this node and wire. */\n\tFSlateColor GetTransitionColor() const { return DialogueGraphNode_Edge->GetEdgeColor(IsHovered()); }\n\n\t// End own functions\n\nprotected:\n\t/** Gets the tooltip for the condition overlay. */\n\tFText GetConditionOverlayTooltipText() const;\n\n\t/** Get the visibility of the overlay widgets. */\n\tEVisibility GetOverlayWidgetVisibility() const;\n\n\t/** Get the background color to display for the widget overlay. This changes on hover state of sibling nodes */\n\tFSlateColor GetOverlayWidgetBackgroundColor(bool bHovered) const\n\t{\n\t\treturn DialogueGraphNode_Edge->GetEdgeColor(bHovered);\n\t}\n\nprotected:\n\t// The dialogue Edge this widget represents\n\tUDialogueGraphNode_Edge* DialogueGraphNode_Edge = nullptr;\n\n\t/** The widget we use to display if the edge has any conditions */\n\tTSharedPtr<SWidget> ConditionOverlayWidget;\n};\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystemEditor/Private/DialogueEditor/Nodes/SDialogueGraphNode_Root.cpp",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#include \"SDialogueGraphNode_Root.h\"\n\n#include \"DialogueGraphNode_Root.h\"\n\nvoid SDialogueGraphNode_Root::Construct(const FArguments& InArgs, UDialogueGraphNode_Root* InNode)\n{\n\tSuper::Construct(Super::FArguments(), InNode);\n\tDialogueGraphNode_Root = InNode;\n}\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystemEditor/Private/DialogueEditor/Nodes/SDialogueGraphNode_Root.h",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#pragma once\n\n#include \"Widgets/DeclarativeSyntaxSupport.h\"\n\n#include \"SDialogueGraphNode.h\"\n\nclass UDialogueGraphNode_Root;\n\n/**\n * Widget for UDialogueGraphNode_Root\n */\nclass SDialogueGraphNode_Root : public SDialogueGraphNode\n{\n\ttypedef SDialogueGraphNode Super;\npublic:\n\n\tSLATE_BEGIN_ARGS(SDialogueGraphNode_Root) {}\n\tSLATE_END_ARGS()\n\n\tvoid Construct(const FArguments& InArgs, UDialogueGraphNode_Root* InNode);\nprivate:\n\t// The dialogue root this view represents\n\tUDialogueGraphNode_Root* DialogueGraphNode_Root = nullptr;\n};\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystemEditor/Private/DialogueEditor/Nodes/SDialogueGraphPin.cpp",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#include \"SDialogueGraphPin.h\"\n\n#include \"ScopedTransaction.h\"\n#include \"SGraphPanel.h\"\n#include \"SGraphNode.h\"\n#include \"Math/UnitConversion.h\"\n\n#include \"DialogueGraphNode_Edge.h\"\n#include \"DialogueGraphNode.h\"\n\n#define LOCTEXT_NAMESPACE \"SDialogueGraphPin\"\n\n/////////////////////////////////////////////////////\n// SDialogueGraphPin\nvoid SDialogueGraphPin::Construct(const FArguments& InArgs, UEdGraphPin* InPin)\n{\n\tcheck(InPin);\n\tSetCursor(EMouseCursor::Default);\n\tbShowLabel = true;\n\tGraphPinObj = InPin;\n\n\tconst UEdGraphSchema* Schema = GraphPinObj->GetSchema();\n\tcheck(Schema);\n\n\tSBorder::Construct(SBorder::FArguments()\n\t\t.BorderImage(this, &Self::GetPinBorder)\n\t\t.BorderBackgroundColor(this, &Self::GetPinColor)\n\t\t.OnMouseButtonDown(this, &Self::OnPinMouseDown)\n\t\t.Cursor(this, &Self::GetPinCursor)\n\t\t.Padding(FMargin(10.f))\n\t);\n\n\tTAttribute<FText> ToolTipAttribute = TAttribute<FText>::Create(TAttribute<FText>::FGetter::CreateSP(this, &Self::GetTooltipText));\n\tSetToolTipText(ToolTipAttribute);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// Begin SGraphPin Interface\nFReply SDialogueGraphPin::OnPinMouseDown(const FGeometry& SenderGeometry, const FPointerEvent& MouseEvent)\n{\n\tbIsMovingLinks = false;\n\tif (MouseEvent.GetEffectingButton() == EKeys::LeftMouseButton && IsEditingEnabled())\n\t{\n\t\tif (GraphPinObj->LinkedTo.Num() > 0)\n\t\t{\n\t\t\tif (MouseEvent.IsAltDown())\n\t\t\t{\n\t\t\t\treturn OnAltAndLeftMouseButtonDown(SenderGeometry, MouseEvent);\n\t\t\t}\n\n\t\t\tif (MouseEvent.IsControlDown())\n\t\t\t{\n\t\t\t\treturn OnCtrlAndLeftMouseButtonDown(SenderGeometry, MouseEvent);\n\t\t\t}\n\t\t}\n\n\t\t// Regular drag operation, to create new links\n\t\tif (!GraphPinObj->bNotConnectable)\n\t\t{\n\t\t\t// Start a drag-drop on the pin\n\t\t\tTSharedPtr<SGraphNode> ThisOwnerNodeWidget = OwnerNodePtr.Pin();\n\t\t\tif (ensure(ThisOwnerNodeWidget.IsValid()))\n\t\t\t{\n\t\t\t\tTArray<TSharedRef<SGraphPin>> DragPinArray;\n\t\t\t\tDragPinArray.Add(SharedThis(this));\n\t\t\t\treturn FReply::Handled().BeginDragDrop(SpawnPinDragEvent(ThisOwnerNodeWidget->GetOwnerPanel().ToSharedRef(), DragPinArray));\n\t\t\t}\n\n\t\t\treturn FReply::Unhandled();\n\t\t}\n\n\t\t// It's not connectible, but we don't want anything above us to process this left click.\n\t\treturn FReply::Handled();\n\t}\n\treturn FReply::Unhandled();\n}\n// End SGraphPin Interface\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// Begin SWidget interface\nFReply SDialogueGraphPin::OnMouseButtonUp(const FGeometry& MyGeometry, const FPointerEvent& MouseEvent)\n{\n\treturn FReply::Unhandled();\n}\n\nFReply SDialogueGraphPin::OnMouseMove(const FGeometry& MyGeometry, const FPointerEvent& MouseEvent)\n{\n\treturn Super::OnMouseMove(MyGeometry, MouseEvent);\n}\n\nvoid SDialogueGraphPin::OnMouseEnter(const FGeometry& MyGeometry, const FPointerEvent& MouseEvent)\n{\n\tif (!bIsHovered && GraphPinObj && !GraphPinObj->IsPendingKill() && GraphPinObj->GetOuter())\n\t{\n\t\tTSharedPtr<SGraphPanel> OwnerPanelPtr = OwnerNodePtr.Pin()->GetOwnerPanel();\n\t\tcheck(OwnerPanelPtr.IsValid());\n\n\t\t// Will be removed in Super::OnMouseLeave\n\t\t// Add current pin\n\t\tHoverPinSet.Add(GraphPinObj);\n\t\tOwnerPanelPtr->AddPinToHoverSet(GraphPinObj);\n\n\t\tif (GraphPinObj->LinkedTo.Num() > 0)\n\t\t{\n\t\t\t// Pin belongs to an actual node\n\t\t\tif (UDialogueGraphNode* GraphNode = Cast<UDialogueGraphNode>(GraphPinObj->GetOwningNode()))\n\t\t\t{\n\t\t\t\tif (GraphPinObj->Direction == EGPD_Output)\n\t\t\t\t{\n\t\t\t\t\t// output pin mark all\n\t\t\t\t\tfor (UDialogueGraphNode* ChildNode : GraphNode->GetChildNodes())\n\t\t\t\t\t{\n\t\t\t\t\t\tHoverPinSet.Add(ChildNode->GetInputPin());\n\t\t\t\t\t\tOwnerPanelPtr->AddPinToHoverSet(ChildNode->GetInputPin());\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t// input pin\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tSCompoundWidget::OnMouseEnter(MyGeometry, MouseEvent);\n}\n\nvoid SDialogueGraphPin::OnMouseLeave(const FPointerEvent& MouseEvent)\n{\n\tSuper::OnMouseLeave(MouseEvent);\n}\n\n//\n// DRAG AND DROP (DragDrop)\n// Used by the TargetPin\n//\nvoid SDialogueGraphPin::OnDragEnter(const FGeometry& MyGeometry, const FDragDropEvent& DragDropEvent)\n{\n\tSuper::OnDragEnter(MyGeometry, DragDropEvent);\n}\n\nvoid SDialogueGraphPin::OnDragLeave(const FDragDropEvent& DragDropEvent)\n{\n\tSuper::OnDragLeave(DragDropEvent);\n}\n\nFReply SDialogueGraphPin::OnDragOver(const FGeometry& MyGeometry, const FDragDropEvent& DragDropEvent)\n{\n\treturn Super::OnDragOver(MyGeometry, DragDropEvent);\n}\n\nFReply SDialogueGraphPin::OnDrop(const FGeometry& MyGeometry, const FDragDropEvent& DragDropEvent)\n{\n\treturn Super::OnDrop(MyGeometry, DragDropEvent);\n}\n// End SWidget interface\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// Begin own functions\nFReply SDialogueGraphPin::OnAltAndLeftMouseButtonDown(const FGeometry& SenderGeometry, const FPointerEvent& MouseEvent)\n{\n\t// Alt-Left clicking will break that pin, if alt clicking on the wire, otherwise it will break all pins\n\tTSharedPtr<SGraphNode> ThisOwnerNodeWidget = OwnerNodePtr.Pin();\n\tcheck(ThisOwnerNodeWidget.IsValid());\n\tconst UDialogueGraphSchema* Schema = CastChecked<UDialogueGraphSchema>(GraphPinObj->GetSchema());\n\tconst FVector2D& MouseLocation = MouseEvent.GetScreenSpacePosition();\n\n\t// Is the click inside the node?\n\tif (FDialogueEditorUtilities::IsPointInsideGeometry(MouseLocation, ThisOwnerNodeWidget->GetCachedGeometry()))\n\t{\n\t\t// break all links\n\t\tSchema->BreakPinLinks(*GraphPinObj, true);\n\t}\n\telse\n\t{\n\t\t// Find the appropriate pin, if there are multiple children\n\t\tUEdGraphPin* ToPin = GraphPinObj->LinkedTo[0];\n\t\tif (GraphPinObj->LinkedTo.Num() > 1)\n\t\t{\n\t\t\tToPin = GetBestLinkedToPinFromSplineMousePosition(MouseLocation);\n\t\t}\n\n\t\tSchema->BreakLinkTo(GraphPinObj, ToPin, true);\n\t}\n\n\treturn FReply::Handled();\n}\n\nFReply SDialogueGraphPin::OnCtrlAndLeftMouseButtonDown(const FGeometry& SenderGeometry, const FPointerEvent& MouseEvent)\n{\n\t// Control-Left clicking will break all existing connections to a pin\n\t// Note: that for some nodes, this can cause reconstruction. In that case, pins we had previously linked to may now be destroyed.\n\t//       So the break MUST come after the SpawnPinDragEvent(), since that acquires handles from PinArray (the pins need to be\n\t//       around for us to construct valid handles from).\n\tTSharedPtr<SGraphNode> ThisOwnerNodeWidget = OwnerNodePtr.Pin();\n\tcheck(ThisOwnerNodeWidget.IsValid());\n\tTSharedPtr<SGraphPanel> OwnerPanelPtr = ThisOwnerNodeWidget->GetOwnerPanel();\n\tcheck(OwnerPanelPtr.IsValid());\n\n\tTArray<TSharedRef<SGraphPin>> DragPinArray;\n\tDragPinArray.Add(SharedThis(this));\n\n\t// Find the appropriate pin, if there are multiple children\n\tUEdGraphPin* ToPin = GraphPinObj->LinkedTo[0];\n\tif (GraphPinObj->LinkedTo.Num() > 1)\n\t{\n\t\tToPin = GetBestLinkedToPinFromSplineMousePosition(MouseEvent.GetScreenSpacePosition());\n\t}\n\n\t// Start drag operation\n\t// Kill the current connection\n\tif (UDialogueGraphNode_Edge* GraphEdge = Cast<UDialogueGraphNode_Edge>(ToPin->GetOwningNode()))\n\t{\n\t\t// true almost all the times, but just to be sure in the future\n\t\tFDialogueEditorUtilities::SetLastTargetGraphEdgeBeforeDrag(GraphEdge->GetGraph(), GraphEdge);\n\t}\n\n\tconst UDialogueGraphSchema* Schema = CastChecked<UDialogueGraphSchema>(GraphPinObj->GetSchema());\n\tSchema->BreakLinkTo(GraphPinObj, ToPin, true);\n\n\tbIsMovingLinks = true;\n\t// Handled by SGraphPanel::OnDrop\n\treturn FReply::Handled().BeginDragDrop(SpawnPinDragEvent(ThisOwnerNodeWidget->GetOwnerPanel().ToSharedRef(), DragPinArray));\n}\n\nFText SDialogueGraphPin::GetTooltipText() const\n{\n\tFText HoverText = FText::GetEmpty();\n\treturn HoverText;\n\t// TODO find a way to only show this when hovering over the wire but not over the node\n//\tconst UEdGraphNode* GraphNode = GraphPinObj && !GraphPinObj->IsPendingKill() ? GraphPinObj->GetOwningNodeUnchecked() : nullptr;\n//\tif (GraphNode != nullptr)\n//\t{\n//\t\tFString HoverStr;\n//\t\tGraphNode->GetPinHoverText(*GraphPinObj, /*out*/HoverStr);\n//\t\tif (!HoverStr.IsEmpty())\n//\t\t{\n//\t\t\tHoverText = FText::FromString(HoverStr);\n//\t\t}\n//\t}\n//\n//\treturn HoverText;\n}\n\nUEdGraphPin* SDialogueGraphPin::GetBestLinkedToPinFromSplineMousePosition(const FVector2D& MousePosition) const\n{\n\t/*\n\tASSUMPTION: that the MousePosition is on a spline (wire) or near a wire\n\tNotation:\n\t\tM - The position of the mouse Vector (aka MousePosition)\n\t\tP - ThisGraphNode Vector location (aka ThisGraphNodeClosestPosition)\n\t\tC - GraphNode child location (aka ClosestPointOnChild)\n\n\tThe (GraphEdge, GraphNode child) pair with the angle(MC, MP) closest to 180 degrees corresponds to this MousePosition.\n\tBasically this tries to find the edge that has MousePosition on its spline/wire.\n\n\tCrude illustration:\n         ____                   ____\n        |   |         E1        |   |\n        | P |----M------------->| C |\n        |___|                   |___|\n          |\n          | E2\n          |\n         _V__\n        |   |\n        | D |\n        |___|\n\t*/\n\n\tconst UDialogueGraphNode* ThisGraphNode = CastChecked<UDialogueGraphNode>(GraphPinObj->GetOwningNode());\n\tTSharedPtr<SGraphNode> ThisGraphNodeWidget = OwnerNodePtr.Pin();\n\tcheck(ThisGraphNodeWidget.IsValid());\n\n\t// Find P and MP\n\tconst FVector2D ThisGraphNodeClosestPosition = FGeometryHelper::FindClosestPointOnGeom(\n\t\tThisGraphNodeWidget->GetCachedGeometry(),\n\t\tMousePosition\n\t);\n\tconst FVector2D MP = (ThisGraphNodeClosestPosition - MousePosition).GetSafeNormal();\n\n\t// Iterate over all edges, find the best one\n\tconst TArray<UDialogueGraphNode_Edge*> ChildGraphEdges = ThisGraphNode->GetChildEdgeNodes();\n\tint32 BestEdgeIndex = 0;\n\n\t// Dot product is always positive here, because we do not care about direction\n\tfloat BestDotProduct = 0.0f;\n\tconst int32 ChildNum = ChildGraphEdges.Num();\n\tfor (int32 ChildIndex = 0; ChildIndex < ChildNum; ChildIndex++)\n\t{\n\t\tUDialogueGraphNode_Edge* ChildEdge = ChildGraphEdges[ChildIndex];\n\t\tTSharedPtr<SGraphNode> ChildNodeWidget = ChildEdge->GetChildNode()->GetNodeWidget();\n\t\tcheck(ChildNodeWidget.IsValid());\n\n\t\t// Find C (aka ClosestPointOnChild)\n\t\tconst FVector2D ClosestPointOnChild = FGeometryHelper::FindClosestPointOnGeom(ChildNodeWidget->GetCachedGeometry(), MousePosition);\n\n\t\t// Find angle between vectors\n\t\tconst FVector2D MC = (ClosestPointOnChild - MousePosition).GetSafeNormal();\n\t\tconst float DotProduct = FMath::Abs(FVector2D::DotProduct(MC, MP));\n\t\tif (DotProduct > BestDotProduct)\n\t\t{\n\t\t\t// found new angle approaching 180 degrees\n\t\t\tBestDotProduct = DotProduct;\n\t\t\tBestEdgeIndex = ChildIndex;\n\t\t}\n\t}\n\n\treturn GraphPinObj->LinkedTo[BestEdgeIndex];;\n}\n// End own functions\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n\n#undef LOCTEXT_NAMESPACE\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystemEditor/Private/DialogueEditor/Nodes/SDialogueGraphPin.h",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#pragma once\n\n#include \"Widgets/DeclarativeSyntaxSupport.h\"\n#include \"Widgets/SCompoundWidget.h\"\n#include \"SGraphPin.h\"\n\n#include \"DlgSystemSettings.h\"\n#include \"DialogueGraphNode_Edge.h\"\n\n/** Own SGraphPin  custom class, allows us to customize the pins as we like. */\nclass SDialogueGraphPin : public SGraphPin\n{\n\ttypedef SGraphPin Super;\n\ttypedef SDialogueGraphPin Self;\n\npublic:\n\tSLATE_BEGIN_ARGS(Self) {}\n\tSLATE_END_ARGS()\n\n\tvoid Construct(const FArguments& InArgs, UEdGraphPin* InPin);\n\n\t// Begin SGraphPin Interface\n\t/**\n\t * Handle clicking on the pin.\n\t * Note: Used instead of OnMouseButtonDown because this is called by the SGraphPanel, NOT OnMouseButtonDown\n\t */\n\tFReply OnPinMouseDown(const FGeometry& SenderGeometry, const FPointerEvent& MouseEvent) override;\n\n\t// SWidget interface\n\t/**\n\t * The system calls this method to notify the widget that a mouse button was release within it. This event is bubbled.\n\t *\n\t * @param MyGeometry The Geometry of the widget receiving the event\n\t * @param MouseEvent Information about the input event\n\t * @return Whether the event was handled along with possible requests for the system to take action.\n\t*/\n\tFReply OnMouseButtonUp(const FGeometry& MyGeometry, const FPointerEvent& MouseEvent) override;\n\n\t/**\n\t * The system calls this method to notify the widget that a mouse moved within it. This event is bubbled.\n\t *\n\t * @param MyGeometry The Geometry of the widget receiving the event\n\t * @param MouseEvent Information about the input event\n\t * @return Whether the event was handled along with possible requests for the system to take action.\n\t*/\n\tFReply OnMouseMove(const FGeometry& MyGeometry, const FPointerEvent& MouseEvent) override;\n\n\t/**\n\t * The system will use this event to notify a widget that the cursor has entered it. This event is uses a custom bubble strategy.\n\t *\n\t * @param MyGeometry The Geometry of the widget receiving the event\n\t * @param MouseEvent Information about the input event\n\t*/\n\tvoid OnMouseEnter(const FGeometry& MyGeometry, const FPointerEvent& MouseEvent) override;\n\n\t/**\n\t * The system will use this event to notify a widget that the cursor has left it. This event is uses a custom bubble strategy.\n\t *\n\t * @param MouseEvent Information about the input event\n\t */\n\tvoid OnMouseLeave(const FPointerEvent& MouseEvent) override;\n\n\t//\n\t// DRAG AND DROP (DragDrop)\n\t//\n\t/**\n\t * Called during drag and drop when the drag enters a widget.\n\t *\n\t * Enter/Leave events in slate are meant as lightweight notifications.\n\t * So we do not want to capture mouse or set focus in response to these.\n\t * However, OnDragEnter must also support external APIs (e.g. OLE Drag/Drop)\n\t * Those require that we let them know whether we can handle the content\n\t * being dragged OnDragEnter.\n\t *\n\t * The concession is to return a can_handled/cannot_handle\n\t * boolean rather than a full FReply.\n\t *\n\t * @param MyGeometry      The geometry of the widget receiving the event.\n\t * @param DragDropEvent   The drag and drop event.\n\t *\n\t * @return A reply that indicated whether the contents of the DragDropEvent can potentially be processed by this widget.\n\t */\n\tvoid OnDragEnter(const FGeometry& MyGeometry, const FDragDropEvent& DragDropEvent) override;\n\n\t/**\n\t * Called during drag and drop when the drag leaves a widget.\n\t *\n\t * @param DragDropEvent   The drag and drop event.\n\t */\n\tvoid OnDragLeave(const FDragDropEvent& DragDropEvent) override;\n\n\t/**\n\t * Called during drag and drop when the the mouse is being dragged over a widget.\n\t *\n\t * @param MyGeometry      The geometry of the widget receiving the event.\n\t * @param DragDropEvent   The drag and drop event.\n\t * @return A reply that indicated whether this event was handled.\n\t */\n\tFReply OnDragOver(const FGeometry& MyGeometry, const FDragDropEvent& DragDropEvent) override;\n\n\t/**\n\t * Called when the user is dropping something onto a widget; terminates drag and drop.\n\t *\n\t * @param MyGeometry      The geometry of the widget receiving the event.\n\t * @param DragDropEvent   The drag and drop event.\n\t * @return A reply that indicated whether this event was handled.\n\t */\n\tFReply OnDrop(const FGeometry& MyGeometry, const FDragDropEvent& DragDropEvent) override;\n\t// End of SWidget interface\n\nprotected:\n\t// Begin SGraphPin Interface\n\t/** Get the widget we should put into the 'default value' space, shown when nothing connected */\n\tTSharedRef<SWidget>\tGetDefaultValueWidget() override\n\t{\n\t\treturn SNew(STextBlock);\n\t}\n\n\t/** @return The color that we should use to draw this pin */\n\tFSlateColor GetPinColor() const override\n\t{\n\t\tconst UDlgSystemSettings* Settings = GetDefault<UDlgSystemSettings>();\n\t\treturn IsHovered() ? Settings->BorderHoveredBackgroundColor : Settings->BorderBackgroundColor;\n\t}\n\n\t// Begin own functions\n\t/** Handles when the alt button and left mouse is on the pin.  */\n\tFReply OnAltAndLeftMouseButtonDown(const FGeometry& SenderGeometry, const FPointerEvent& MouseEvent);\n\n\t/** Handles when the ctrl button and left mouse is on the pin.  */\n\tFReply OnCtrlAndLeftMouseButtonDown(const FGeometry& SenderGeometry, const FPointerEvent& MouseEvent);\n\n\t/** @return The tooltip to display for this pin */\n\tFText GetTooltipText() const;\n\n\t/** Gets the Index in the current pin LinkeTo array that corresponds to the MousePosition on the wire/spline. */\n\tUEdGraphPin* GetBestLinkedToPinFromSplineMousePosition(const FVector2D& MousePosition) const;\n\n\t/** Gets the pin border */\n\tconst FSlateBrush* GetPinBorder() const\n\t{\n\t\treturn FEditorStyle::GetBrush(TEXT(\"Graph.StateNode.Body\"));\n\t}\n};\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystemEditor/Private/DialogueEditor/Nodes/SDialogueNodeOverlayWidget.cpp",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#include \"SDialogueNodeOverlayWidget.h\"\n\n#include \"Widgets/SOverlay.h\"\n#include \"Widgets/Layout/SBox.h\"\n#include \"Widgets/Layout/SBorder.h\"\n\n#include \"DialogueStyle.h\"\n\n/////////////////////////////////////////////////////\n// SDialogueNodeOverlayWidget\nvoid SDialogueNodeOverlayWidget::Construct(const FArguments& InArgs)\n{\n\tOnHoverStateChangedEvent = InArgs._OnHoverStateChanged;\n\tOnGetBackgroundColorEvent = InArgs._OnGetBackgroundColor;\n\tOverlayBody = InArgs._OverlayBody.Get();\n\n\tconst FSlateBrush* CircleBrush = FDialogueStyle::Get()->GetBrush(FDialogueStyle::PROPERTY_GraphNodeCircleBox);\n\tChildSlot\n\t[\n\t\tSNew(SOverlay)\n\t\t+SOverlay::Slot()\n\t\t.HAlign(HAlign_Fill)\n\t\t.VAlign(VAlign_Fill)\n\t\t[\n\t\t\t// Add a dummy box here to make sure the widget doesnt get smaller than the brush\n\t\t\tSNew(SBox)\n\t\t\t.WidthOverride(CircleBrush->ImageSize.X)\n\t\t\t.HeightOverride(CircleBrush->ImageSize.Y)\n\t\t]\n\n\t\t+SOverlay::Slot()\n\t\t.HAlign(HAlign_Fill)\n\t\t.VAlign(VAlign_Fill)\n\t\t[\n\t\t\tSNew(SBorder)\n\t\t\t.BorderImage(CircleBrush)\n\t\t\t.BorderBackgroundColor(this, &Self::GetBackgroundColor)\n\t\t\t.Padding(FMargin(4.0f))\n\t\t\t.VAlign(VAlign_Center)\n\t\t\t.HAlign(HAlign_Center)\n\t\t\t[\n\t\t\t\tOverlayBody.ToSharedRef()\n\t\t\t]\n\t\t]\n\t];\n}\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystemEditor/Private/DialogueEditor/Nodes/SDialogueNodeOverlayWidget.h",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#pragma once\n\n#include \"Widgets/DeclarativeSyntaxSupport.h\"\n#include \"Widgets/SCompoundWidget.h\"\n\n/** Widget for overlaying another widget besides the node */\nclass SDialogueNodeOverlayWidget : public SCompoundWidget\n{\n\ttypedef SDialogueNodeOverlayWidget Self;\n\npublic:\n\t/** Delegate event fired when the hover state of this widget changes */\n\tDECLARE_DELEGATE_OneParam(FOnHoverStateChanged, bool /* bHovered */);\n\n\t/** Delegate used to receive the background color of the node, depending on hover state and state of other siblings */\n\tDECLARE_DELEGATE_RetVal_OneParam(FSlateColor, FOnGetBackgroundColor, bool /* bHovered */);\n\n\tSLATE_BEGIN_ARGS(SDialogueNodeOverlayWidget) {}\n\t\tSLATE_ATTRIBUTE(TSharedPtr<SWidget>, OverlayBody)\n\n\t\t// Events\n\t\tSLATE_EVENT(FOnHoverStateChanged, OnHoverStateChanged)\n\t\tSLATE_EVENT(FOnGetBackgroundColor, OnGetBackgroundColor)\n\tSLATE_END_ARGS()\n\n\tvoid Construct(const FArguments& InArgs);\n\n\tvoid OnMouseEnter(const FGeometry& MyGeometry, const FPointerEvent& MouseEvent) override\n\t{\n\t\tOnHoverStateChangedEvent.ExecuteIfBound(true);\n\t\tSCompoundWidget::OnMouseEnter(MyGeometry, MouseEvent);\n\t}\n\n\tvoid OnMouseLeave(const FPointerEvent& MouseEvent) override\n\t{\n\t\tOnHoverStateChangedEvent.ExecuteIfBound(false);\n\t\tSCompoundWidget::OnMouseLeave(MouseEvent);\n\t}\n\n\t/** Get the color we use to display the rounded border */\n\tFSlateColor GetBackgroundColor() const\n\t{\n\t\tif (OnGetBackgroundColorEvent.IsBound())\n\t\t\treturn OnGetBackgroundColorEvent.Execute(IsHovered());\n\n\t\treturn FSlateColor::UseForeground();\n\t}\n\nprivate:\n\t/** Delegate event fired when the hover state of this widget changes */\n\tFOnHoverStateChanged OnHoverStateChangedEvent;\n\n\t/** Delegate used to receive the color of the node, depending on hover state and state of other siblings */\n\tFOnGetBackgroundColor OnGetBackgroundColorEvent;\n\n\t/** The OverlayBody used for this widget*/\n\tTSharedPtr<SWidget> OverlayBody;\n};\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystemEditor/Private/DialogueEditor/SDialogueActionMenu.cpp",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#include \"SDialogueActionMenu.h\"\n\n#include \"EdGraph/EdGraph.h\"\n#include \"EditorStyleSet.h\"\n#include \"Framework/Application/SlateApplication.h\"\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// SDialogueActionMenu\nSDialogueActionMenu::~SDialogueActionMenu()\n{\n\tOnClosedCallback.ExecuteIfBound();\n\tOnCloseReasonCallback.ExecuteIfBound(bActionExecuted, DraggedFromPins.Num() > 0);\n}\n\nvoid SDialogueActionMenu::Construct(const FArguments& InArgs)\n{\n\tbActionExecuted = false;\n\tGraph = InArgs._Graph;\n\tDraggedFromPins = InArgs._DraggedFromPins;\n\tNewNodePosition = InArgs._NewNodePosition;\n\tOnClosedCallback = InArgs._OnClosedCallback;\n\tAutoExpandActionMenu = InArgs._AutoExpandActionMenu;\n\tOnCloseReasonCallback = InArgs._OnCloseReason;\n\n\t// Build the widget layout\n\tSBorder::Construct(SBorder::FArguments()\n\t\t.BorderImage(FEditorStyle::GetBrush(\"Menu.Background\"))\n\t\t.Padding(5)\n\t\t[\n\t\t\t// Achieving fixed width by nesting items within a fixed width box.\n\t\t\tSNew(SBox)\n\t\t\t.WidthOverride(400)\n\t\t\t.HeightOverride(400)\n\t\t\t[\n\t\t\t\tSAssignNew(GraphActionMenu, SGraphActionMenu)\n\t\t\t\t.OnActionSelected(this, &Self::OnActionSelected)\n\t\t\t\t.OnCollectAllActions(this, &Self::CollectAllActions)\n\t\t\t\t.AutoExpandActionMenu(AutoExpandActionMenu)\n\t\t\t]\n\t\t]\n\t);\n}\n\nvoid SDialogueActionMenu::CollectAllActions(FGraphActionListBuilderBase& OutAllActions)\n{\n\t// Build up the context object\n\tFGraphContextMenuBuilder ContextMenuBuilder(Graph);\n\tif (DraggedFromPins.Num() > 0)\n\t{\n\t\tContextMenuBuilder.FromPin = DraggedFromPins[0];\n\t}\n\n\t// Determine all possible actions\n\tGraph->GetSchema()->GetGraphContextActions(ContextMenuBuilder);\n\n\t// Copy the added options back to the main list\n\tOutAllActions.Append(ContextMenuBuilder);\n}\n\nvoid SDialogueActionMenu::OnActionSelected(const TArray<TSharedPtr<FEdGraphSchemaAction>>& SelectedAction, ESelectInfo::Type InSelectionType)\n{\n\tif (!IsValid(Graph))\n\t{\n\t\treturn;\n\t}\n\n\tif (InSelectionType == ESelectInfo::OnMouseClick || InSelectionType == ESelectInfo::OnKeyPress || SelectedAction.Num() == 0)\n\t{\n\t\tfor (int32 ActionIndex = 0; ActionIndex < SelectedAction.Num(); ActionIndex++)\n\t\t{\n\t\t\tTSharedPtr<FEdGraphSchemaAction> CurrentAction = SelectedAction[ActionIndex];\n\n\t\t\tif (CurrentAction.IsValid())\n\t\t\t{\n\t\t\t\tif (!bActionExecuted)\n\t\t\t\t{\n\t\t\t\t\tFSlateApplication::Get().DismissAllMenus();\n\t\t\t\t\tbActionExecuted = true;\n\t\t\t\t}\n\n\t\t\t\tCurrentAction->PerformAction(Graph, DraggedFromPins, NewNodePosition);\n\t\t\t}\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystemEditor/Private/DialogueEditor/SDialogueActionMenu.h",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#pragma once\n\n#include \"Widgets/DeclarativeSyntaxSupport.h\"\n#include \"SGraphPalette.h\"\n#include \"GraphEditor.h\"\n#include \"SGraphActionMenu.h\"\n\n//////////////////////////////////////////////////////////////////////////\n/**\n * Widget that appears after right clicking on the graph\n */\nclass SDialogueActionMenu : public SBorder\n{\n\ttypedef SDialogueActionMenu Self;\npublic:\n\t/** Delegate for the OnCloseReason event which is always raised when the SDialogueActionMenu closes */\n\tDECLARE_DELEGATE_TwoParams(FDialogueActionMenuClosedReason, bool /*bActionExecuted*/, bool /*bGraphPinContext*/);\n\n\tSLATE_BEGIN_ARGS(Self)\n\t\t: _Graph(nullptr)\n\t\t, _NewNodePosition(FVector2D::ZeroVector)\n\t\t, _AutoExpandActionMenu(true)\n\t{}\n\n\t\tSLATE_ARGUMENT(UEdGraph*, Graph)\n\t\tSLATE_ARGUMENT(FVector2D, NewNodePosition)\n\t\tSLATE_ARGUMENT(TArray<UEdGraphPin*>, DraggedFromPins)\n\t\tSLATE_ARGUMENT(SGraphEditor::FActionMenuClosed, OnClosedCallback)\n\t\tSLATE_ARGUMENT(bool, AutoExpandActionMenu)\n\t\tSLATE_EVENT(FDialogueActionMenuClosedReason, OnCloseReason)\n\tSLATE_END_ARGS()\n\n\tvoid Construct(const FArguments& InArgs);\n\t~SDialogueActionMenu();\n\n\tTSharedPtr<SEditableTextBox> GetFilterTextBox() const { return GraphActionMenu->GetFilterTextBox(); }\n\nprotected:\n\tvoid OnActionSelected(const TArray<TSharedPtr<FEdGraphSchemaAction>>& SelectedAction, ESelectInfo::Type InSelectionType);\n\n\t/** Callback used to populate all actions list in SGraphActionMenu */\n\tvoid CollectAllActions(FGraphActionListBuilderBase& OutAllActions);\n\nprotected:\n\tUEdGraph* Graph = nullptr;\n\n\t/** The pins this node was dragged from. */\n\tTArray<UEdGraphPin*> DraggedFromPins;\n\n\t/** The position of this new node */\n\tFVector2D NewNodePosition;\n\n\t/** Should expand the new menu? */\n\tbool AutoExpandActionMenu = true;\n\n\t/** Was an action executed? */\n\tbool bActionExecuted = false;\n\n\t// Events for close\n\tSGraphEditor::FActionMenuClosed OnClosedCallback;\n\tFDialogueActionMenuClosedReason OnCloseReasonCallback;\n\n\t// The actual menu\n\tTSharedPtr<SGraphActionMenu> GraphActionMenu;\n};\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystemEditor/Private/DialogueEditor/SDialoguePalette.cpp",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#include \"SDialoguePalette.h\"\n\n#include \"DialogueEditor/Graph/DialogueGraphSchema.h\"\n\nvoid SDialoguePalette::Construct(const FArguments& InArgs)\n{\n\t// Auto expand the palette as there's so few nodes\n\tSGraphPalette::Construct(SGraphPalette::FArguments().AutoExpandActionMenu(true));\n}\n\nvoid SDialoguePalette::CollectAllActions(FGraphActionListBuilderBase& OutAllActions)\n{\n\tconst UDialogueGraphSchema* Schema = GetDefault<UDialogueGraphSchema>();\n\tFGraphActionMenuBuilder ActionMenuBuilder;\n\n\t// Determine all possible actions\n\tSchema->GetPaletteActions(ActionMenuBuilder);\n\tOutAllActions.Append(ActionMenuBuilder);\n}\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystemEditor/Private/DialogueEditor/SDialoguePalette.h",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#pragma once\n\n#include \"Widgets/DeclarativeSyntaxSupport.h\"\n#include \"SGraphPalette.h\"\n\n//////////////////////////////////////////////////////////////////////////\n\nclass SDialoguePalette : public SGraphPalette\n{\npublic:\n\tSLATE_BEGIN_ARGS(SDialoguePalette) {}\n\tSLATE_END_ARGS()\n\n\tvoid Construct(const FArguments& InArgs);\n\nprotected:\n\t/** Callback used to populate all actions list in SGraphActionMenu */\n\tvoid CollectAllActions(FGraphActionListBuilderBase& OutAllActions) override;\n};\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystemEditor/Private/DialogueEditorUtilities.cpp",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#include \"DialogueEditorUtilities.h\"\n\n#include \"Toolkits/IToolkit.h\"\n#include \"Toolkits/ToolkitManager.h\"\n#include \"Templates/Casts.h\"\n#include \"Containers/Queue.h\"\n#include \"EdGraphNode_Comment.h\"\n#include \"FileHelpers.h\"\n#include \"Kismet2/BlueprintEditorUtils.h\"\n#include \"Kismet2/SClassPickerDialog.h\"\n\n#include \"DlgSystemEditorModule.h\"\n#include \"DialogueEditor/IDialogueEditor.h\"\n#include \"DialogueEditor/Nodes/DialogueGraphNode.h\"\n#include \"DialogueEditor/Nodes/DialogueGraphNode_Edge.h\"\n#include \"DlgHelper.h\"\n#include \"DlgManager.h\"\n#include \"Factories/DialogueClassViewerFilters.h\"\n#include \"Kismet2/KismetEditorUtilities.h\"\n#include \"K2Node_Event.h\"\n\n/** Useful for auto positioning */\nstruct NodeWithParentPosition\n{\n\tNodeWithParentPosition() {}\n\tNodeWithParentPosition(UDialogueGraphNode* InNode, const int32 InParentNodeX, const int32 InParentNodeY) :\n\t\tNode(InNode), ParentNodeX(InParentNodeX), ParentNodeY(InParentNodeY) {}\n\n\tUDialogueGraphNode* Node = nullptr;\n\tint32 ParentNodeX = 0;\n\tint32 ParentNodeY = 0;\n};\n\n///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// FDialogueEditorUtilities\nvoid FDialogueEditorUtilities::LoadAllDialoguesAndCheckGUIDs()\n{\n\t//const int32 NumDialoguesBefore = UDlgManager::GetAllDialoguesFromMemory().Num();\n\tconst int32 NumLoadedDialogues = UDlgManager::LoadAllDialoguesIntoMemory(false);\n\t//const int32 NumDialoguesAfter = UDlgManager::GetAllDialoguesFromMemory().Num();\n\t//check(NumDialoguesBefore == NumDialoguesAfter);\n\tUE_LOG(LogDlgSystemEditor, Log, TEXT(\"UDlgManager::LoadAllDialoguesIntoMemory loaded %d Dialogues into Memory\"), NumLoadedDialogues);\n\n\t// Try to fix duplicate GUID\n\t// Can happen for one of the following reasons:\n\t// - duplicated files outside of UE\n\t// - somehow loaded from text files?\n\t// - the universe hates us? +_+\n\tfor (UDlgDialogue* Dialogue : UDlgManager::GetDialoguesWithDuplicateGUIDs())\n\t{\n\t\tUE_LOG(\n\t\t\tLogDlgSystemEditor,\n\t\t\tWarning,\n\t\t\tTEXT(\"Dialogue = `%s`, GUID = `%s` has a Duplicate GUID. Regenerating.\"),\n\t\t\t*Dialogue->GetPathName(), *Dialogue->GetGUID().ToString()\n\t\t)\n\t\tDialogue->RegenerateGUID();\n\t\tDialogue->MarkPackageDirty();\n\t}\n\n\t// Give it another try, Give up :((\n\t// May the math Gods have mercy on us!\n\tfor (const UDlgDialogue* Dialogue : UDlgManager::GetDialoguesWithDuplicateGUIDs())\n\t{\n\t\t// GUID already exists (╯°□°）╯︵ ┻━┻\n\t\t// Does this break the universe?\n\t\tUE_LOG(\n\t\t\tLogDlgSystemEditor,\n\t\t\tError,\n\t\t\tTEXT(\"Dialogue = `%s`, GUID = `%s`\"),\n\t\t\t*Dialogue->GetPathName(), *Dialogue->GetGUID().ToString()\n\t\t)\n\n\t\tUE_LOG(\n\t\t\tLogDlgSystemEditor,\n\t\t\tFatal,\n\t\t\tTEXT(\"(╯°□°）╯︵ ┻━┻ Congrats, you just broke the universe, are you even human? Now please go and proove an NP complete problem.\"\n\t\t\t\t\"The chance of generating two equal random FGuid (picking 4, uint32 numbers) is p = 9.3132257 * 10^(-10) % (or something like this)\")\n\t\t)\n\t}\n}\n\nconst TSet<UObject*> FDialogueEditorUtilities::GetSelectedNodes(const UEdGraph* Graph)\n{\n\tTSharedPtr<IDialogueEditor> DialogueEditor = GetDialogueEditorForGraph(Graph);\n\tif (DialogueEditor.IsValid())\n\t{\n\t\treturn DialogueEditor->GetSelectedNodes();\n\t}\n\n\treturn {};\n}\n\nbool FDialogueEditorUtilities::GetBoundsForSelectedNodes(const UEdGraph* Graph, class FSlateRect& Rect, float Padding)\n{\n\tTSharedPtr<IDialogueEditor> DialogueEditor = GetDialogueEditorForGraph(Graph);\n\tif (DialogueEditor.IsValid())\n\t{\n\t\treturn DialogueEditor->GetBoundsForSelectedNodes(Rect, Padding);\n\t}\n\n\treturn false;\n}\n\nvoid FDialogueEditorUtilities::RefreshDetailsView(const UEdGraph* Graph, bool bRestorePreviousSelection)\n{\n\tTSharedPtr<IDialogueEditor> DialogueEditor = GetDialogueEditorForGraph(Graph);\n\tif (DialogueEditor.IsValid())\n\t{\n\t\tDialogueEditor->RefreshDetailsView(bRestorePreviousSelection);\n\t}\n}\n\nvoid FDialogueEditorUtilities::Refresh(const UEdGraph* Graph, bool bRestorePreviousSelection)\n{\n\tTSharedPtr<IDialogueEditor> DialogueEditor = GetDialogueEditorForGraph(Graph);\n\tif (DialogueEditor.IsValid())\n\t{\n\t\tDialogueEditor->Refresh(bRestorePreviousSelection);\n\t}\n}\n\nUDialogueGraphNode_Edge* FDialogueEditorUtilities::GetLastTargetGraphEdgeBeforeDrag(const UEdGraph* Graph)\n{\n\tTSharedPtr<IDialogueEditor> DialogueEditor = GetDialogueEditorForGraph(Graph);\n\tif (DialogueEditor.IsValid())\n\t{\n\t\treturn DialogueEditor->GetLastTargetGraphEdgeBeforeDrag();\n\t}\n\n\treturn nullptr;\n}\n\nvoid FDialogueEditorUtilities::SetLastTargetGraphEdgeBeforeDrag(const UEdGraph* Graph, UDialogueGraphNode_Edge* InEdge)\n{\n\tTSharedPtr<IDialogueEditor> DialogueEditor = GetDialogueEditorForGraph(Graph);\n\tif (DialogueEditor.IsValid())\n\t{\n\t\tDialogueEditor->SetLastTargetGraphEdgeBeforeDrag(InEdge);\n\t}\n}\n\nTSharedPtr<class IDialogueEditor> FDialogueEditorUtilities::GetDialogueEditorForGraph(const UEdGraph* Graph)\n{\n\t// Find the associated Dialogue\n\tconst UDlgDialogue* Dialogue = GetDialogueForGraph(Graph);\n\tTSharedPtr<IDialogueEditor> DialogueEditor;\n\n\t// This Dialogue has already an asset editor opened\n\tTSharedPtr<IToolkit> FoundAssetEditor = FToolkitManager::Get().FindEditorForAsset(Dialogue);\n\tif (FoundAssetEditor.IsValid())\n\t{\n\t\tDialogueEditor = StaticCastSharedPtr<IDialogueEditor>(FoundAssetEditor);\n\t}\n\n\treturn DialogueEditor;\n}\n\nbool FDialogueEditorUtilities::RemoveNode(UEdGraphNode* NodeToRemove)\n{\n\tif (!IsValid(NodeToRemove))\n\t{\n\t\treturn false;\n\t}\n\n\tUDialogueGraph* Graph = CastChecked<UDialogueGraph>(NodeToRemove->GetGraph());\n\tif (!IsValid(Graph))\n\t{\n\t\treturn false;\n\t}\n\n\t// Transactions should be declared in the code that calls this method\n\tif (!Graph->Modify())\n\t{\n\t\tUE_LOG(LogDlgSystemEditor, Fatal, TEXT(\"FDialogueEditorUtilities::RemoveNode No transaction was declared before calling this method, aborting!\"));\n\t\treturn false;\n\t}\n\tif (!NodeToRemove->Modify())\n\t{\n\t\tUE_LOG(LogDlgSystemEditor, Fatal, TEXT(\"FDialogueEditorUtilities::RemoveNode No transaction was declared before calling this method, aborting!\"));\n\t\treturn false;\n\t}\n\n\treturn Graph->RemoveGraphNode(NodeToRemove);\n}\n\nUEdGraph* FDialogueEditorUtilities::CreateNewGraph(\n\tUObject* ParentScope,\n\tFName GraphName,\n\tTSubclassOf<UEdGraph> GraphClass,\n\tTSubclassOf<UEdGraphSchema> SchemaClass\n)\n{\n\t// Mostly copied from FBlueprintEditorUtils::CreateNewGraph\n\tUEdGraph* NewGraph;\n\tbool bRename = false;\n\n\t// Ensure this name isn't already being used for a graph\n\tif (GraphName != NAME_None)\n\t{\n\t\tUEdGraph* ExistingGraph = FindObject<UEdGraph>(ParentScope, *(GraphName.ToString()));\n\t\tensureMsgf(!ExistingGraph, TEXT(\"Graph %s already exists: %s\"), *GraphName.ToString(), *ExistingGraph->GetFullName());\n\n\t\t// Rename the old graph out of the way; but we have already failed at this point\n\t\tif (ExistingGraph)\n\t\t{\n\t\t\tExistingGraph->Rename(nullptr, ExistingGraph->GetOuter(), REN_DoNotDirty | REN_ForceNoResetLoaders);\n\t\t}\n\n\t\t// Construct new graph with the supplied name\n\t\tNewGraph = NewObject<UEdGraph>(ParentScope, GraphClass, NAME_None, RF_Transactional);\n\t\tbRename = true;\n\t}\n\telse\n\t{\n\t\t// Construct a new graph with a default name\n\t\tNewGraph = NewObject<UEdGraph>(ParentScope, GraphClass, NAME_None, RF_Transactional);\n\t}\n\n\tNewGraph->Schema = SchemaClass;\n\n\t// Now move to where we want it to. Workaround to ensure transaction buffer is correctly utilized\n\tif (bRename)\n\t{\n\t\tNewGraph->Rename(*GraphName.ToString(), ParentScope, REN_DoNotDirty | REN_ForceNoResetLoaders);\n\t}\n\n\treturn NewGraph;\n}\n\nbool FDialogueEditorUtilities::CheckAndTryToFixDialogue(UDlgDialogue* Dialogue, bool bDisplayWarning)\n{\n\tbool bIsDataValid = true;\n#if DO_CHECK\n\tconst TArray<UDlgNode*>& DialogueNodes = Dialogue->GetNodes();\n\t// Do some additional checks to ensure the data is safe, useful in development\n\tauto checkIfMultipleEdgesToSameNode = [DialogueNodes, bDisplayWarning](UDlgNode* Node)\n\t{\n\t\tif (!IsValid(Node))\n\t\t{\n\t\t\treturn true;\n\t\t}\n\n\t\tTSet<int32> NodeEdgesFound;\n\t\tTSet<int32> EdgesToRemove;\n\t\t// Find the duplicate edges\n\t\tconst TArray<FDlgEdge>& NodeChildren = Node->GetNodeChildren();\n\t\tfor (int32 EdgeIndex = 0, EdgesNum = NodeChildren.Num(); EdgeIndex < EdgesNum; EdgeIndex++)\n\t\t{\n\t\t\tconst FDlgEdge& Edge = NodeChildren[EdgeIndex];\n\t\t\tif (Edge.TargetIndex == INDEX_NONE)\n\t\t\t{\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (NodeEdgesFound.Contains(Edge.TargetIndex))\n\t\t\t{\n\t\t\t\t// Mark for deletion\n\t\t\t\tEdgesToRemove.Add(EdgeIndex);\n\n\t\t\t\tif (!bDisplayWarning)\n\t\t\t\t{\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// Find source and destination\n\t\t\t\tconst int32 IndexToNode = Edge.TargetIndex;\n\t\t\t\tint32 IndexFromNode = DialogueNodes.Find(Node);\n\t\t\t\tif (IndexFromNode == INDEX_NONE) // start node\n\t\t\t\t{\n\t\t\t\t\tIndexFromNode = -1;\n\t\t\t\t}\n\n\t\t\t\tconst FString Message = FString::Printf(\n\t\t\t\t\tTEXT(\"Node with index = `%d` connects multiple times to destination Node with index = `%d`. One of the Edges will be removed.\"),\n\t\t\t\t\tIndexFromNode, IndexToNode);\n\t\t\t\tShowMessageBox(EAppMsgType::Ok, Message, TEXT(\"Invalid Dialogue data\"));\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tNodeEdgesFound.Add(Edge.TargetIndex);\n\t\t\t}\n\t\t}\n\n\t\t// Remove if any duplicate edges\n\t\tfor (int32 EdgeIndex : EdgesToRemove)\n\t\t{\n\t\t\tNode->RemoveChildAt(EdgeIndex);\n\t\t}\n\n\t\treturn EdgesToRemove.Num() == 0;\n\t};\n\n\tbIsDataValid = bIsDataValid && checkIfMultipleEdgesToSameNode(Dialogue->GetMutableStartNode());\n\tfor (UDlgNode* Node : DialogueNodes)\n\t{\n\t\tbIsDataValid = bIsDataValid && checkIfMultipleEdgesToSameNode(Node);\n\t}\n\n#endif\n\n\treturn bIsDataValid;\n}\n\nvoid FDialogueEditorUtilities::TryToCreateDefaultGraph(UDlgDialogue* Dialogue, bool bPrompt)\n{\n\t// Clear the graph if the number of nodes differ\n\tif (AreDialogueNodesInSyncWithGraphNodes(Dialogue))\n\t{\n\t\treturn;\n\t}\n\n\t// Simply do the operations without any consent\n\tif (!bPrompt)\n\t{\n\t\t// Always keep in sync with the .dlg (text file).\n\t\tDialogue->InitialSyncWithTextFile();\n\t\tCheckAndTryToFixDialogue(Dialogue);\n\t\tDialogue->ClearGraph();\n\t\treturn;\n\t}\n\n\t// Prompt to the user to initial sync with the text file\n\t{\n\t\tconst EAppReturnType::Type Response = ShowMessageBox(EAppMsgType::YesNo,\n\t\t\tFString::Printf(TEXT(\"Initial sync the Dialogues nodes of `%s` from the text file with the same name?\"), *Dialogue->GetName()),\n\t\t\tTEXT(\"Get Dialogue nodes from the text file\"));\n\n\t\tif (Response == EAppReturnType::Yes)\n\t\t{\n\t\t\tDialogue->InitialSyncWithTextFile();\n\t\t}\n\t}\n\tCheckAndTryToFixDialogue(Dialogue);\n\n\t// Prompt the user and only if he answers yes we clear the graph\n\t{\n\t\tconst int32 NumGraphNodes = CastChecked<UDialogueGraph>(Dialogue->GetGraph())->GetAllDialogueGraphNodes().Num();\n\t\tconst int32 NumDialogueNodes = Dialogue->GetNodes().Num() + 1; // (plus the start node)\n\t\tconst FString Message = FString::Printf(TEXT(\"Dialogue with name = `%s` has number of graph nodes (%d) != number dialogue nodes (%d).\"),\n\t\t\t*Dialogue->GetName(), NumGraphNodes, NumDialogueNodes);\n\t\tconst EAppReturnType::Type Response = ShowMessageBox(EAppMsgType::YesNo,\n\t\t\tFString::Printf(TEXT(\"%s%s\"), *Message, TEXT(\"\\nWould you like to autogenerate the graph nodes from the dialogue nodes?\\n WARNING: Graph nodes will be lost\")),\n\t\t\tTEXT(\"Autogenerate graph nodes from dialogue nodes?\"));\n\n\t\t// This will trigger the CreateDefaultNodesForGraph in the the GraphSchema\n\t\tif (Response == EAppReturnType::Yes)\n\t\t{\n\t\t\tDialogue->ClearGraph();\n\t\t}\n\t}\n}\n\nbool FDialogueEditorUtilities::AreDialogueNodesInSyncWithGraphNodes(const UDlgDialogue* Dialogue)\n{\n\tconst int32 NumGraphNodes = CastChecked<UDialogueGraph>(Dialogue->GetGraph())->GetAllDialogueGraphNodes().Num();\n\tconst int32 NumDialogueNodes = Dialogue->GetNodes().Num() + 1; // (plus the start node)\n\tif (NumGraphNodes == NumDialogueNodes)\n\t{\n\t\treturn true;\n\t}\n\n\treturn false;\n}\n\nUDlgNode* FDialogueEditorUtilities::GetClosestNodeFromGraphNode(UEdGraphNode* GraphNode)\n{\n\tconst UDialogueGraphNode_Base* BaseNode = Cast<UDialogueGraphNode_Base>(GraphNode);\n\tif (!BaseNode)\n\t{\n\t\treturn nullptr;\n\t}\n\n\t// Node\n\tif (const UDialogueGraphNode* Node = Cast<UDialogueGraphNode>(BaseNode))\n\t{\n\t\treturn Node->GetMutableDialogueNode();\n\t}\n\n\t// Edge\n\tif (const UDialogueGraphNode_Edge* EdgeNode = Cast<UDialogueGraphNode_Edge>(BaseNode))\n\t{\n\t\tif (EdgeNode->HasParentNode())\n\t\t\treturn EdgeNode->GetParentNode()->GetMutableDialogueNode();\n\t\tif (EdgeNode->HasChildNode())\n\t\t\treturn EdgeNode->GetChildNode()->GetMutableDialogueNode();\n\t}\n\n\treturn nullptr;\n}\n\nvoid FDialogueEditorUtilities::AutoPositionGraphNodes(\n\tUDialogueGraphNode* RootNode,\n\tconst TArray<UDialogueGraphNode*>& GraphNodes,\n\tint32 OffsetBetweenColumnsX,\n\tint32 OffsetBetweenRowsY,\n\tbool bIsDirectionVertical\n)\n{\n\tTSet<UDialogueGraphNode*> VisitedNodes;\n\tVisitedNodes.Add(RootNode);\n\tTQueue<NodeWithParentPosition> Queue;\n\tverify(Queue.Enqueue(NodeWithParentPosition(RootNode, 0, 0)));\n\n\t// Find first node with children so that we do not get all the graph with orphan nodes\n\t{\n\t\tUDialogueGraphNode* Node = RootNode;\n\t\tint32 Index = 0;\n\t\twhile (Index < GraphNodes.Num() && Node->GetOutputPin()->LinkedTo.Num() == 0)\n\t\t{\n\t\t\tNode = GraphNodes[Index];\n\t\t\tIndex++;\n\t\t}\n\t\tif (Node != RootNode)\n\t\t{\n\t\t\tNodeWithParentPosition ParentPosition;\n\t\t\tif (bIsDirectionVertical)\n\t\t\t{\n\t\t\t\tParentPosition = NodeWithParentPosition(Node, 0, OffsetBetweenRowsY);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tParentPosition = NodeWithParentPosition(Node, OffsetBetweenColumnsX, 0);\n\t\t\t}\n\n\t\t\tverify(Queue.Enqueue(ParentPosition));\n\t\t}\n\t}\n\n\t// Just some BFS\n\twhile (!Queue.IsEmpty())\n\t{\n\t\tNodeWithParentPosition NodeWithPosition;\n\t\tverify(Queue.Dequeue(NodeWithPosition));\n\t\tUDialogueGraphNode* Node = NodeWithPosition.Node;\n\n\t\tif (bIsDirectionVertical)\n\t\t{\n\t\t\t// Position this node at the same level only one row further (down)\n\t\t\tNode->SetPosition(\n\t\t\t\tNodeWithPosition.ParentNodeX,\n\t\t\t\tNodeWithPosition.ParentNodeY + OffsetBetweenRowsY\n\t\t\t);\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// Position this node at the same level only one column further (to the right)\n\t\t\tNode->SetPosition(\n\t\t\t\tNodeWithPosition.ParentNodeX + OffsetBetweenColumnsX,\n\t\t\t\tNodeWithPosition.ParentNodeY\n\t\t\t);\n\t\t}\n\n\t\t// Gather the list of unvisited child nodes, useful for not drawing weird children\n\t\tTArray<UDialogueGraphNode*> ChildNodesUnvisited;\n\t\tfor (UDialogueGraphNode* ChildNode : Node->GetChildNodes())\n\t\t{\n\t\t\t// Prevent double visiting\n\t\t\tif (!VisitedNodes.Contains(ChildNode))\n\t\t\t{\n\t\t\t\tChildNodesUnvisited.Add(ChildNode);\n\t\t\t}\n\t\t}\n\n\t\t// Adjust\n\t\tint32 ChildOffsetPos;\n\t\tif (bIsDirectionVertical)\n\t\t{\n\t\t\t// Adjust for the number of nodes, so that we are left, down by half\n\t\t\tint32 ChildOffsetPosX = Node->NodePosX;\n\t\t\tif (ChildNodesUnvisited.Num() > 1) // only adjust X position if we have more than one child\n\t\t\t{\n\t\t\t\tChildOffsetPosX -= OffsetBetweenColumnsX * ChildNodesUnvisited.Num() / 2;\n\t\t\t}\n\n\t\t\tChildOffsetPos = ChildOffsetPosX;\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// Adjust for the number of nodes, so that we are right above (top) by half\n\t\t\tint32 ChildOffsetPosY = Node->NodePosY;\n\t\t\tif (ChildNodesUnvisited.Num() > 1) // only adjust Y position if we have more than one child\n\t\t\t{\n\t\t\t\tChildOffsetPosY -= OffsetBetweenRowsY * ChildNodesUnvisited.Num() / 2;\n\t\t\t}\n\n\t\t\tChildOffsetPos = ChildOffsetPosY;\n\t\t}\n\n\t\t// Position children\n\t\tfor (int32 ChildIndex = 0, ChildNum = ChildNodesUnvisited.Num(); ChildIndex < ChildNum; ChildIndex++)\n\t\t{\n\t\t\tUDialogueGraphNode* ChildNode = ChildNodesUnvisited[ChildIndex];\n\t\t\tif (bIsDirectionVertical)\n\t\t\t{\n\t\t\t\tChildNode->SetPosition(ChildOffsetPos, Node->NodePosY);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tChildNode->SetPosition(Node->NodePosX, ChildOffsetPos);\n\t\t\t}\n\n\t\t\tVisitedNodes.Add(ChildNode);\n\n\t\t\tNodeWithParentPosition ParentPosition;\n\t\t\tif (bIsDirectionVertical)\n\t\t\t{\n\t\t\t\tParentPosition = NodeWithParentPosition(ChildNode, ChildOffsetPos, Node->NodePosY);\n\t\t\t\tChildOffsetPos += OffsetBetweenColumnsX + ChildNode->EstimateNodeWidth();\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t// Next child on this level will set X aka columns to Node->NodePosX + OffsetBetweenColumnsX\n\t\t\t\t// And Y aka row will be the same as this parent node, so it will be ChildOffsetPosY\n\t\t\t\tParentPosition = NodeWithParentPosition(ChildNode, Node->NodePosX + ChildNode->EstimateNodeWidth() * 1.5, ChildOffsetPos);\n\t\t\t\tChildOffsetPos += OffsetBetweenRowsY;\n\t\t\t}\n\n\t\t\tQueue.Enqueue(ParentPosition);\n\t\t}\n\t}\n\n\t// Fix position of orphans (nodes/node group with no parents)\n\tif (GraphNodes.Num() != VisitedNodes.Num())\n\t{\n\t\tTSet<UDialogueGraphNode*> NodesSet(GraphNodes);\n\t\t// Nodes that are in the graph but not in the visited nodes set\n\t\tTSet<UDialogueGraphNode*> OrphanedNodes = NodesSet.Difference(VisitedNodes);\n\t\tfor (UDialogueGraphNode* Node : OrphanedNodes)\n\t\t{\n\t\t\t// Finds the highest bottom left point\n\t\t\tconst FVector2D NodePos = Node->GetGraph()->GetGoodPlaceForNewNode();\n\t\t\tif (bIsDirectionVertical)\n\t\t\t{\n\t\t\t\tNode->SetPosition(\n\t\t\t\t\tNodePos.X,\n\t\t\t\t\tNodePos.Y + OffsetBetweenRowsY\n\t\t\t\t);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tNode->SetPosition(\n\t\t\t\t\tNodePos.X + OffsetBetweenColumnsX,\n\t\t\t\t\tNodePos.Y\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n}\n\nbool FDialogueEditorUtilities::CanConvertSpeechNodesToSpeechSequence(\n\tconst TSet<UObject*>& SelectedNodes,\n\tTArray<UDialogueGraphNode*>& OutSelectedGraphNodes\n)\n{\n\tOutSelectedGraphNodes.Empty();\n\tif (SelectedNodes.Num() == 0)\n\t{\n\t\treturn false;\n\t}\n\n\t// Helper to return false :(\n\tconst auto returnFailure = [&OutSelectedGraphNodes]() -> bool\n\t{\n\t\tOutSelectedGraphNodes.Empty();\n\t\treturn false;\n\t};\n\n\t// We must make sure that nodes are valid and are in a linear order\n\t// Step 1. Check if selected nodes are valid\n\tfor (UObject* Node : SelectedNodes)\n\t{\n\t\t// Ignore edges\n\t\tif (Node->IsA(UDialogueGraphNode_Edge::StaticClass()))\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Not a graph node, can't convert\n\t\tUDialogueGraphNode* GraphNode = Cast<UDialogueGraphNode>(Node);\n\t\tif (!IsValid(GraphNode))\n\t\t{\n\t\t\treturn returnFailure();\n\t\t}\n\n\t\t// Selected the root node, can't convert\n\t\tif (GraphNode->IsRootNode())\n\t\t{\n\t\t\treturn returnFailure();\n\t\t}\n\n\t\t// Not a speech node, can't convert\n\t\tif (!GraphNode->IsSpeechNode())\n\t\t{\n\t\t\treturn returnFailure();\n\t\t}\n\n\t\tOutSelectedGraphNodes.Add(GraphNode);\n\t}\n\tif (OutSelectedGraphNodes.Num() == 0)\n\t{\n\t\treturn returnFailure();\n\t}\n\n\t// Step 2. Sort in increasing order by the dialogue index.\n\t// This will make sure that the left/top (first) most selected node will be at index 0\n\tOutSelectedGraphNodes.Sort([](const UDialogueGraphNode& LHS, const UDialogueGraphNode& RHS) -> bool\n\t{\n\t\treturn LHS.GetDialogueNodeIndex() < RHS.GetDialogueNodeIndex();\n\t});\n\n\t// Step 3. Check that every node in the sequence is ONLY connected to the next\n\tfor (int32 NodeIndex = 0, NodesNum = OutSelectedGraphNodes.Num(); NodeIndex < NodesNum; NodeIndex++)\n\t{\n\t\tconst bool bIsFirstNode = NodeIndex == 0;\n\t\tconst bool bIsLastNode = NodeIndex == NodesNum - 1;\n\t\tconst UDialogueGraphNode* CurrentGraphNode = OutSelectedGraphNodes[NodeIndex];\n\n\t\t// The first node can have any number of input connections\n\t\tif (!bIsFirstNode)\n\t\t{\n\t\t\t// Check input connections\n\t\t\tconst TArray<UDialogueGraphNode*> ParentNodes = CurrentGraphNode->GetParentNodes();\n\t\t\tif (ParentNodes.Num() > 1)\n\t\t\t{\n\t\t\t\treturn returnFailure();\n\t\t\t}\n\n\t\t\t// Is not connected to the previous node in the selection\n\t\t\tif (ParentNodes.Num() == 1 &&\n\t\t\t\tParentNodes[0] != OutSelectedGraphNodes[NodeIndex - 1])\n\t\t\t{\n\t\t\t\treturn returnFailure();\n\t\t\t}\n\t\t\t// if ParentNodes.Num() == 0, it is valid\n\t\t}\n\n\t\t// The last node can have any number of output pins\n\t\tif (!bIsLastNode)\n\t\t{\n\t\t\t// Check output connections\n\t\t\tconst TArray<UDialogueGraphNode*> ChildNodes = CurrentGraphNode->GetChildNodes();\n\t\t\tif (ChildNodes.Num() > 1)\n\t\t\t{\n\t\t\t\treturn returnFailure();\n\t\t\t}\n\n\t\t\t// Is not connected to the next node in the selection\n\t\t\tif (ChildNodes.Num() == 1 &&\n\t\t\t\tChildNodes[0] != OutSelectedGraphNodes[NodeIndex + 1])\n\t\t\t{\n\t\t\t\treturn returnFailure();\n\t\t\t}\n\t\t\t// if ChildNodes.Num() == 0, it is valid\n\t\t}\n\t\t// We do not care if the node does not have any input/output connections, it is simply an orphan, lets adopt it :)\n\t}\n\n\treturn true;\n}\n\nbool FDialogueEditorUtilities::CanConvertSpeechSequenceNodeToSpeechNodes(const TSet<UObject*>& SelectedNodes)\n{\n\t// Is the node a speech sequence? and has at least one speech sequence inside it\n\tif (SelectedNodes.Num() == 1)\n\t{\n\t\tif (UDialogueGraphNode* SelectedNode = Cast<UDialogueGraphNode>(*FDlgHelper::GetFirstSetElement(SelectedNodes)))\n\t\t{\n\t\t\treturn SelectedNode->IsSpeechSequenceNode() &&\n\t\t\t\t   SelectedNode->GetDialogueNode<UDlgNode_SpeechSequence>().HasSpeechSequences();\n\t\t}\n\t}\n\n\treturn false;\n}\n\nvoid FDialogueEditorUtilities::CloseOtherEditors(UObject* Asset, IAssetEditorInstance* OnlyEditor)\n{\n\tif (!IsValid(Asset) || !GEditor)\n\t{\n\t\treturn;\n\t}\n\n#if ENGINE_MINOR_VERSION >= 24\n\tGEditor->GetEditorSubsystem<UAssetEditorSubsystem>()->CloseOtherEditors(Asset, OnlyEditor);\n#else\n\tFAssetEditorManager::Get().CloseOtherEditors(Asset, OnlyEditor);\n#endif\n}\n\nbool FDialogueEditorUtilities::OpenEditorForAsset(const UObject* Asset)\n{\n\tif (!IsValid(Asset) || !GEditor)\n\t{\n\t\treturn false;\n\t}\n\n#if ENGINE_MINOR_VERSION >= 24\n\treturn GEditor->GetEditorSubsystem<UAssetEditorSubsystem>()->OpenEditorForAsset(const_cast<UObject*>(Asset));\n#else\n\treturn FAssetEditorManager::Get().OpenEditorForAsset(const_cast<UObject*>(Asset));\n#endif\n}\n\nIAssetEditorInstance* FDialogueEditorUtilities::FindEditorForAsset(UObject* Asset, bool bFocusIfOpen)\n{\n\tif (!IsValid(Asset) || !GEditor)\n\t{\n\t\treturn nullptr;\n\t}\n\n#if ENGINE_MINOR_VERSION >= 24\n\treturn GEditor->GetEditorSubsystem<UAssetEditorSubsystem>()->FindEditorForAsset(Asset, bFocusIfOpen);\n#else\n\treturn FAssetEditorManager::Get().FindEditorForAsset(Asset, bFocusIfOpen);\n#endif\n}\n\nbool FDialogueEditorUtilities::OpenEditorAndJumpToGraphNode(const UEdGraphNode* GraphNode, bool bFocusIfOpen /*= false*/)\n{\n\tif (!IsValid(GraphNode))\n\t{\n\t\treturn false;\n\t}\n\n\t// Open if not already.\n\tUDlgDialogue* Dialogue = GetDialogueFromGraphNode(GraphNode);\n\tif (!OpenEditorForAsset(Dialogue))\n\t{\n\t\treturn false;\n\t}\n\n\t// Could still fail focus on the graph node\n\tif (IAssetEditorInstance* EditorInstance = FindEditorForAsset(Dialogue, bFocusIfOpen))\n\t{\n\t\tEditorInstance->FocusWindow(const_cast<UEdGraphNode*>(GraphNode));\n\t\treturn true;\n\t}\n\n\treturn false;\n}\n\nbool FDialogueEditorUtilities::JumpToGraphNode(const UEdGraphNode* GraphNode)\n{\n\tif (!IsValid(GraphNode))\n\t{\n\t\treturn false;\n\t}\n\n\tTSharedPtr<IDialogueEditor> DialogueEditor = GetDialogueEditorForGraph(GraphNode->GetGraph());\n\tif (DialogueEditor.IsValid())\n\t{\n\t\tDialogueEditor->JumpToObject(GraphNode);\n\t\treturn true;\n\t}\n\n\treturn false;\n}\n\nbool FDialogueEditorUtilities::JumpToGraphNodeIndex(const UDlgDialogue* Dialogue, int32 NodeIndex)\n{\n\tif (!Dialogue)\n\t{\n\t\treturn false;\n\t}\n\n\tif (UDlgNode* Node = Dialogue->GetMutableNodeFromIndex(NodeIndex))\n\t{\n\t\treturn JumpToGraphNode(Node->GetGraphNode());\n\t}\n\n\treturn false;\n}\n\n\nvoid FDialogueEditorUtilities::CopyNodeChildren(const UDialogueGraphNode* FromNode, UDialogueGraphNode* ToNode)\n{\n\tcheck(FromNode != ToNode);\n\tconst UEdGraphSchema* GraphSchema = FromNode->GetSchema();\n\tconst TArray<UDialogueGraphNode*> ChildNodes = FromNode->GetChildNodes();\n\tUEdGraphPin* ToNodeOutputPin = ToNode->GetOutputPin();\n\n\t// Remake connections to children for the ToNode\n\t// (input pin) FromNode (output pin) -> (input pin) ChildEdgeConnection (output pin) -> (input pin) ChildNode (output pin)\n\tfor (UDialogueGraphNode* ChildNode : ChildNodes)\n\t{\n\t\tverify(GraphSchema->TryCreateConnection(ToNodeOutputPin, ChildNode->GetInputPin()));\n\t}\n\n\t// Copy the dialogue Data\n\tToNode->SetEdges(FromNode->GetDialogueNode().GetNodeChildren());\n}\n\nvoid FDialogueEditorUtilities::ReplaceParentConnectionsToNode(const UDialogueGraphNode* OldNode, const UDialogueGraphNode* NewNode)\n{\n\tcheck(OldNode != NewNode);\n\tconst UEdGraphSchema* GraphSchema = OldNode->GetSchema();\n\tconst TArray<UDialogueGraphNode_Edge*> ParentEdgeNodes = OldNode->GetParentEdgeNodes();\n\tUEdGraphPin* NewNodeInputPin = NewNode->GetInputPin();\n\n\t// (input pin) ParentNode (output pin) -> (input pin) ParentEdgeConnection (output pin) -> (input pin) NewNode (output pin)\n\tfor (UDialogueGraphNode_Edge* ParentEdgeConnection : ParentEdgeNodes)\n\t{\n\t\t// Replace connection from the edge output pin to the new node\n\t\t// Reparenting logic handled by UDialogueGraphNode_Edge::PinConnectionListChanged\n\t\tverify(GraphSchema->TryCreateConnection(ParentEdgeConnection->GetOutputPin(), NewNodeInputPin));\n\t}\n}\n\nEAppReturnType::Type FDialogueEditorUtilities::ShowMessageBox(EAppMsgType::Type MsgType, const FString& Text, const FString& Caption)\n{\n\tUE_LOG(LogDlgSystemEditor, Warning, TEXT(\"%s\\n%s\"), *Caption, *Text);\n\treturn FPlatformMisc::MessageBoxExt(MsgType, *Text, *Caption);\n}\n\nvoid FDialogueEditorUtilities::RemapOldIndicesWithNewAndUpdateGUID(\n\tconst TArray<UDialogueGraphNode*>& GraphNodes,\n\tconst TMap<int32, int32>& OldToNewIndexMap\n)\n{\n\tif (GraphNodes.Num() == 0)\n\t{\n\t\treturn;\n\t}\n\n\tconst UDlgDialogue* Dialogue = GraphNodes[0]->GetDialogue();\n\tconst TArray<UDlgNode*>& Nodes = Dialogue->GetNodes();\n\n\t// helper function to set the new IntValue on the condition if it exists in the history and it is different\n\tauto UpdateConditionIndex = [&OldToNewIndexMap](FDlgCondition* ModifiedCondition) -> bool\n\t{\n\t\tconst int32* NewIndex = OldToNewIndexMap.Find(ModifiedCondition->IntValue);\n\t\t// Ignore invalid node indices any case\n\t\tif (NewIndex == nullptr)\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\tif (ModifiedCondition->IntValue != *NewIndex)\n\t\t{\n\t\t\tModifiedCondition->IntValue = *NewIndex;\n\t\t\treturn true;\n\t\t}\n\n\t\treturn false;\n\t};\n\n\t// Fix the weak references in the FDlgCondition::IntValue if it is of type WasNodeVisited\n\tfor (UDialogueGraphNode* GraphNode : GraphNodes)\n\t{\n\t\tUDlgNode* DialogueNode = GraphNode->GetMutableDialogueNode();\n\t\tconst TArray<UDialogueGraphNode_Edge*> ChildEdgeNodes = GraphNode->GetChildEdgeNodes();\n\n\t\t// Update Enter condition\n\t\tfor (int32 ConditionIndex = 0, ConditionNum = DialogueNode->GetNodeEnterConditions().Num(); ConditionIndex < ConditionNum; ConditionIndex++)\n\t\t{\n\t\t\tFDlgCondition* EnterCondition = DialogueNode->GetMutableEnterConditionAt(ConditionIndex);\n\t\t\tif (FDlgCondition::HasNodeIndex(EnterCondition->ConditionType))\n\t\t\t{\n\t\t\t\tUpdateConditionIndex(EnterCondition);\n\t\t\t\tEnterCondition->GUID = Nodes[EnterCondition->IntValue]->GetGUID();\n\t\t\t}\n\t\t}\n\n\t\t// Update Edges\n\t\tfor (int32 EdgeIndex = 0, EdgesNum = DialogueNode->GetNodeChildren().Num(); EdgeIndex < EdgesNum; EdgeIndex++)\n\t\t{\n\t\t\tFDlgEdge* DialogueEdge = DialogueNode->GetSafeMutableNodeChildAt(EdgeIndex);\n\n\t\t\tfor (FDlgCondition& Condition : DialogueEdge->Conditions)\n\t\t\t{\n\t\t\t\tif (FDlgCondition::HasNodeIndex(Condition.ConditionType))\n\t\t\t\t{\n\t\t\t\t\tUpdateConditionIndex(&Condition);\n\t\t\t\t\tCondition.GUID = Nodes[Condition.IntValue]->GetGUID();\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Update graph node edge\n\t\t\tChildEdgeNodes[EdgeIndex]->SetDialogueEdge(*DialogueEdge);\n\t\t}\n\n\t\tGraphNode->CheckDialogueNodeSyncWithGraphNode(true);\n\t}\n}\n\nUDlgDialogue* FDialogueEditorUtilities::GetDialogueFromGraphNode(const UEdGraphNode* GraphNode)\n{\n\tif (const UDialogueGraphNode_Base* DialogueBaseNode = Cast<UDialogueGraphNode_Base>(GraphNode))\n\t{\n\t\treturn DialogueBaseNode->GetDialogue();\n\t}\n\n\t// Last change\n\tif (const UDialogueGraph* DialogueGraph = Cast<UDialogueGraph>(GraphNode->GetGraph()))\n\t{\n\t\treturn DialogueGraph->GetDialogue();\n\t}\n\n\treturn nullptr;\n}\n\nbool FDialogueEditorUtilities::SaveAllDialogues()\n{\n\tconst TArray<UDlgDialogue*> Dialogues = UDlgManager::GetAllDialoguesFromMemory();\n\tTArray<UPackage*> PackagesToSave;\n\tconst bool bBatchOnlyInGameDialogues = GetDefault<UDlgSystemSettings>()->bBatchOnlyInGameDialogues;\n\n\tfor (UDlgDialogue* Dialogue : Dialogues)\n\t{\n\t\t// Ignore, not in game directory\n\t\tif (bBatchOnlyInGameDialogues && !Dialogue->IsInProjectDirectory())\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\n\t\tDialogue->MarkPackageDirty();\n\t\tPackagesToSave.Add(Dialogue->GetOutermost());\n\t}\n\n\tstatic constexpr bool bCheckDirty = false;\n\tstatic constexpr bool bPromptToSave = false;\n\treturn FEditorFileUtils::PromptForCheckoutAndSave(PackagesToSave, bCheckDirty, bPromptToSave) == FEditorFileUtils::EPromptReturnCode::PR_Success;\n}\n\nbool FDialogueEditorUtilities::DeleteAllDialoguesTextFiles()\n{\n\tconst TArray<UDlgDialogue*> Dialogues = UDlgManager::GetAllDialoguesFromMemory();\n\tconst bool bBatchOnlyInGameDialogues = GetDefault<UDlgSystemSettings>()->bBatchOnlyInGameDialogues;\n\tfor (const UDlgDialogue* Dialogue : Dialogues)\n\t{\n\t\t// Ignore, not in game directory\n\t\tif (bBatchOnlyInGameDialogues && !Dialogue->IsInProjectDirectory())\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\n\t\tDialogue->DeleteAllTextFiles();\n\t}\n\n\treturn true;\n}\n\nbool FDialogueEditorUtilities::PickChildrenOfClass(const FText& TitleText, UClass*& OutChosenClass, UClass* Class)\n{\n\t// Create filter\n\tTSharedPtr<FDialogueChildrenOfClassFilterViewer> Filter = MakeShareable(new FDialogueChildrenOfClassFilterViewer);\n\tFilter->AllowedChildrenOfClasses.Add(Class);\n\n\t// Fill in options\n\tFClassViewerInitializationOptions Options;\n\tOptions.Mode = EClassViewerMode::ClassPicker;\n\n\tconst UDlgSystemSettings* Settings = GetDefault<UDlgSystemSettings>();\n\tOptions.DisplayMode = Settings->GetUnrealClassPickerDisplayMode();\n\tOptions.ClassFilter = Filter;\n\tOptions.bShowUnloadedBlueprints = true;\n\tOptions.bExpandRootNodes = true;\n\tOptions.NameTypeToDisplay = EClassViewerNameTypeToDisplay::Dynamic;\n\n\treturn SClassPickerDialog::PickClass(TitleText, Options, OutChosenClass, Class);\n}\n\nbool FDialogueEditorUtilities::OpenBlueprintEditor(\n    UBlueprint* Blueprint,\n    EDialogueBlueprintOpenType OpenType,\n    FName FunctionNameToOpen,\n    bool bForceFullEditor,\n\tbool bAddBlueprintFunctionIfItDoesNotExist\n)\n{\n\tif (!Blueprint)\n\t{\n\t\treturn false;\n\t}\n\n\tBlueprint->bForceFullEditor = bForceFullEditor;\n\n\t// Find Function Graph\n\tUObject* ObjectToFocusOn = nullptr;\n\tif (OpenType != EDialogueBlueprintOpenType::None && FunctionNameToOpen != NAME_None)\n\t{\n\t\tUClass* Class = Blueprint->GeneratedClass;\n\t\tcheck(Class);\n\n\t\tif (OpenType == EDialogueBlueprintOpenType::Function)\n\t\t{\n\t\t\tObjectToFocusOn = bAddBlueprintFunctionIfItDoesNotExist\n                ? BlueprintGetOrAddFunction(Blueprint, FunctionNameToOpen, Class)\n                : BlueprintGetFunction(Blueprint, FunctionNameToOpen, Class);\n\t\t}\n\t\telse if (OpenType == EDialogueBlueprintOpenType::Event)\n\t\t{\n\t\t\tObjectToFocusOn = bAddBlueprintFunctionIfItDoesNotExist\n                ? BlueprintGetOrAddEvent(Blueprint, FunctionNameToOpen, Class)\n                : BlueprintGetEvent(Blueprint, FunctionNameToOpen, Class);\n\t\t}\n\t}\n\n\t// Default to the last uber graph\n\tif (ObjectToFocusOn == nullptr)\n\t{\n\t\tObjectToFocusOn = Blueprint->GetLastEditedUberGraph();\n\t}\n\tif (ObjectToFocusOn)\n\t{\n\t\tFKismetEditorUtilities::BringKismetToFocusAttentionOnObject(ObjectToFocusOn);\n\t\treturn true;\n\t}\n\n\treturn OpenEditorForAsset(Blueprint);\n}\n\nUEdGraph* FDialogueEditorUtilities::BlueprintGetOrAddFunction(UBlueprint* Blueprint, FName FunctionName, UClass* FunctionClassSignature)\n{\n\tif (!Blueprint || Blueprint->BlueprintType != BPTYPE_Normal)\n\t{\n\t\treturn nullptr;\n\t}\n\n\t// Find existing function\n\tif (UEdGraph* GraphFunction = BlueprintGetFunction(Blueprint, FunctionName, FunctionClassSignature))\n\t{\n\t\treturn GraphFunction;\n\t}\n\n\t// Create a new function\n\tUEdGraph* NewGraph = FBlueprintEditorUtils::CreateNewGraph(Blueprint, FunctionName, UEdGraph::StaticClass(), UEdGraphSchema_K2::StaticClass());\n\tFBlueprintEditorUtils::AddFunctionGraph(Blueprint, NewGraph, /*bIsUserCreated=*/ false, FunctionClassSignature);\n\tBlueprint->LastEditedDocuments.Add(NewGraph);\n\treturn NewGraph;\n}\n\nUEdGraph* FDialogueEditorUtilities::BlueprintGetFunction(UBlueprint* Blueprint, FName FunctionName, UClass* FunctionClassSignature)\n{\n\tif (!Blueprint || Blueprint->BlueprintType != BPTYPE_Normal)\n\t{\n\t\treturn nullptr;\n\t}\n\n\t// Find existing function\n\tfor (UEdGraph* GraphFunction : Blueprint->FunctionGraphs)\n\t{\n\t\tif (FunctionName == GraphFunction->GetFName())\n\t\t{\n\t\t\treturn GraphFunction;\n\t\t}\n\t}\n\n\t// Find in the implemented Interfaces Graphs\n\tfor (const FBPInterfaceDescription& Interface : Blueprint->ImplementedInterfaces)\n\t{\n\t\tfor (UEdGraph* GraphFunction : Interface.Graphs)\n\t\t{\n\t\t\tif (FunctionName == GraphFunction->GetFName())\n\t\t\t{\n\t\t\t\treturn GraphFunction;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn nullptr;\n}\n\nUK2Node_Event* FDialogueEditorUtilities::BlueprintGetOrAddEvent(UBlueprint* Blueprint, FName EventName, UClass* EventClassSignature)\n{\n\tif (!Blueprint || Blueprint->BlueprintType != BPTYPE_Normal)\n\t{\n\t\treturn nullptr;\n\t}\n\n\t// Find existing event\n\tif (UK2Node_Event* EventNode = BlueprintGetEvent(Blueprint, EventName, EventClassSignature))\n\t{\n\t\treturn EventNode;\n\t}\n\n\t// Create a New Event\n\tif (Blueprint->UbergraphPages.Num())\n\t{\n\t\tint32 NodePositionY = 0;\n\t\tUK2Node_Event* NodeEvent = FKismetEditorUtilities::AddDefaultEventNode(\n\t\t\tBlueprint,\n\t\t\tBlueprint->UbergraphPages[0],\n\t\t\tEventName,\n\t\t\tEventClassSignature,\n\t\t\tNodePositionY\n\t\t);\n\t\tNodeEvent->SetEnabledState(ENodeEnabledState::Enabled);\n\t\tNodeEvent->NodeComment = \"\";\n\t\tNodeEvent->bCommentBubbleVisible = false;\n\t\treturn NodeEvent;\n\t}\n\n\treturn nullptr;\n}\n\nUK2Node_Event* FDialogueEditorUtilities::BlueprintGetEvent(UBlueprint* Blueprint, FName EventName, UClass* EventClassSignature)\n{\n\tif (!Blueprint || Blueprint->BlueprintType != BPTYPE_Normal)\n\t{\n\t\treturn nullptr;\n\t}\n\n\tTArray<UK2Node_Event*> AllEvents;\n\tFBlueprintEditorUtils::GetAllNodesOfClass<UK2Node_Event>(Blueprint, AllEvents);\n\tfor (UK2Node_Event* EventNode : AllEvents)\n\t{\n\t\tif (EventNode->bOverrideFunction && EventNode->EventReference.GetMemberName() == EventName)\n\t\t{\n\t\t\treturn EventNode;\n\t\t}\n\t}\n\n\treturn nullptr;\n}\n\nUEdGraphNode_Comment* FDialogueEditorUtilities::BlueprintAddComment(UBlueprint* Blueprint, const FString& CommentString, FVector2D Location)\n{\n\tif (!Blueprint || Blueprint->BlueprintType != BPTYPE_Normal || Blueprint->UbergraphPages.Num() == 0)\n\t{\n\t\treturn nullptr;\n\t}\n\n\tUEdGraph* Graph = Blueprint->UbergraphPages[0];\n\tTSharedPtr<FEdGraphSchemaAction> Action = Graph->GetSchema()->GetCreateCommentAction();\n\tif (!Action.IsValid())\n\t{\n\t\treturn nullptr;\n\t}\n\n\tUEdGraphNode* GraphNode = Action->PerformAction(Graph, nullptr, Location);\n\tif (UEdGraphNode_Comment* CommentNode = Cast<UEdGraphNode_Comment>(GraphNode))\n\t{\n\t\tCommentNode->NodeComment = CommentString;\n\t\treturn CommentNode;\n\t}\n\n\treturn nullptr;\n}\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystemEditor/Private/DialogueEditorUtilities.h",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#pragma once\n\n#include \"ConnectionDrawingPolicy.h\"\n#include \"PropertyHandle.h\"\n#include \"Toolkits/AssetEditorManager.h\"\n#include \"EdGraphNode_Comment.h\"\n\n#include \"DialogueEditor/Graph/DialogueGraph.h\"\n#include \"Nodes/DlgNode.h\"\n\nenum class EDialogueBlueprintOpenType : uint8\n{\n\tNone = 0,\n    Function,\n    Event\n};\n\n//////////////////////////////////////////////////////////////////////////\n// FDialogueEditorUtilities\n\nclass UDlgDialogue;\nclass UEdGraphSchema;\nclass UDlgNode;\nclass UEdGraph;\nclass FSlateRect;\nclass UK2Node_Event;\n\nclass FDialogueEditorUtilities\n{\npublic:\n\t/** Spawns a GraphNode in the specified ParentGraph and at Location. */\n\ttemplate <typename GraphNodeType>\n\tstatic GraphNodeType* SpawnGraphNodeFromTemplate(UEdGraph* ParentGraph, const FIntPoint& Location, bool bSelectNewNode = true)\n\t{\n\t\tFGraphNodeCreator<GraphNodeType> NodeCreator(*ParentGraph);\n\t\tGraphNodeType* GraphNode = NodeCreator.CreateUserInvokedNode(bSelectNewNode);\n\t\tNodeCreator.Finalize(); // Calls on the node: CreateNewGuid, PostPlacedNewNode, AllocateDefaultPins\n\t\tGraphNode->NodePosX = Location.X;\n\t\tGraphNode->NodePosY = Location.Y;\n\t\tGraphNode->SetFlags(RF_Transactional);\n\n\t\treturn GraphNode;\n\t}\n\n\t// Loads all dialogues into memory and checks the GUIDs for duplicates\n\tstatic void LoadAllDialoguesAndCheckGUIDs();\n\n\t/** Gets the nodes that are currently selected */\n\tstatic const TSet<UObject*> GetSelectedNodes(const UEdGraph* Graph);\n\n\t/** Get the bounding area for the currently selected nodes\n\t *\n\t * @param Graph The Graph we are finding bounds for\n\t * @param Rect Final output bounding area, including padding\n\t * @param Padding An amount of padding to add to all sides of the bounds\n\t *\n\t * @return false if nothing is selected\n\t */\n\tstatic bool GetBoundsForSelectedNodes(const UEdGraph* Graph, FSlateRect& Rect, float Padding = 0.0f);\n\n\t/** Refreshes the details panel for the editor of the specified Graph. */\n\tstatic void RefreshDetailsView(const UEdGraph* Graph, bool bRestorePreviousSelection);\n\n\t// Refresh the viewport and property/details pane\n\tstatic void Refresh(const UEdGraph* Graph, bool bRestorePreviousSelection);\n\n\t/** Useful for setting the last target edge on drap operations. */\n\tstatic UDialogueGraphNode_Edge* GetLastTargetGraphEdgeBeforeDrag(const UEdGraph* Graph);\n\tstatic void SetLastTargetGraphEdgeBeforeDrag(const UEdGraph* Graph, UDialogueGraphNode_Edge* InEdge);\n\n\t/** Helper function to remove the provided node from it's graph. Returns true on success, false otherwise. */\n\tstatic bool RemoveNode(UEdGraphNode* NodeToRemove);\n\n\t/**\n\t * Creates a new empty graph.\n\t *\n\t * @param\tParentScope\t\tThe outer of the new graph (typically a blueprint).\n\t * @param\tGraphName\t\tName of the graph to add.\n\t * @param\tSchemaClass\t\tSchema to use for the new graph.\n\t *\n\t * @return\tnullptr if it fails, else ther new created graph\n\t */\n\tstatic UEdGraph* CreateNewGraph(\n\t\tUObject* ParentScope,\n\t\tFName GraphName,\n\t\tTSubclassOf<UEdGraph> GraphClass,\n\t\tTSubclassOf<UEdGraphSchema> SchemaClass\n\t);\n\n\t/** Helper function that checks if the data is valid in the Dialogue/Graph and tries to fix the data. */\n\tstatic bool CheckAndTryToFixDialogue(UDlgDialogue* Dialogue, bool bDisplayWarning = true);\n\n\t/**\n\t * Tries to create the default graph for the Dialogue if the number of nodes differ from the dialogue data and the graph data\n\t *\n\t * @param Dialogue\t\tThe Dialogue we want to create the default graph for.\n\t * @param bPrompt\t\tIndicates if we should prompt the user for a response.\n\t */\n\tstatic void TryToCreateDefaultGraph(UDlgDialogue* Dialogue, bool bPrompt = true);\n\n\t/** Tells us if the number of dialogue nodes matches with the number of graph nodes (corresponding to dialogues). */\n\tstatic bool AreDialogueNodesInSyncWithGraphNodes(const UDlgDialogue* Dialogue);\n\n\t// Tries to get the closest UDlgNode for a  UEdGraphNode\n\tstatic UDlgNode* GetClosestNodeFromGraphNode(UEdGraphNode* GraphNode);\n\n\t/** Gets the Dialogue from the Graph */\n\tstatic UDlgDialogue* GetDialogueForGraph(const UEdGraph* Graph)\n\t{\n\t\treturn CastChecked<UDialogueGraph>(Graph)->GetDialogue();\n\t}\n\n\t/**\n\t * Automatically reposition all the nodes in the graph.\n\t *\n\t * @param\tRootNode\t\t\t\tThe Node that is considered the node\n\t * @param\tGraphNodes\t\t\t\tThe rest of the graph nodes\n\t * @param\tOffsetBetweenColumnsX   The offset between nodes on the X axis\n\t * @param\tOffsetBetweenRowsY\t\tThe offset between nodes on the Y axis\n\t * @param\tbIsDirectionVertical\tIs direction vertical? If false it is horizontal\n\t */\n\tstatic void AutoPositionGraphNodes(\n\t\tUDialogueGraphNode* RootNode,\n\t\tconst TArray<UDialogueGraphNode*>& GraphNodes,\n\t\tint32 OffsetBetweenColumnsX,\n\t\tint32 OffsetBetweenRowsY,\n\t\tbool bIsDirectionVertical\n\t);\n\n\t/**\n\t * Tells us if the selected nodes can be converted to a speech sequence node.\n\t *\n\t * @param\tSelectedNodes\t\t\tThe selected graph nodes we do the checking on.\n\t * @param\tOutSelectedGraphNodes\tThe result graph nodes if the we can do the conversion.\n\t *\n\t * @return bool\t\tIf true, the selected graph nodes (filtered and sorted) will be in set in the OutSelectedGraphNodes array.\n\t *\t\t\t\t\tIf false, the OutSelectedGraphNodes will be empty\n\t*/\n\tstatic bool CanConvertSpeechNodesToSpeechSequence(\n\t\tconst TSet<UObject*>& SelectedNodes,\n\t\tTArray<UDialogueGraphNode*>& OutSelectedGraphNodes\n\t);\n\n\tstatic bool CanConvertSpeechNodesToSpeechSequence(const TSet<UObject*>& SelectedNodes)\n\t{\n\t\tTArray<UDialogueGraphNode*> OutSelectedGraphNodes;\n\t\treturn CanConvertSpeechNodesToSpeechSequence(SelectedNodes, OutSelectedGraphNodes);\n\t}\n\n\t/**\n\t * Tells us if the selected nodes (should be only one) can be converted from a speech sequence to speech nodes\n\t *\n\t * @param\tSelectedNodes\tThe selected graph nodes we do the checking on.\n\t * @return\tbool\t\t\tIf we can do the conversion\n\t */\n\tstatic bool CanConvertSpeechSequenceNodeToSpeechNodes(const TSet<UObject*>& SelectedNodes);\n\n\t/** Close any editor which is not this one */\n\tstatic void CloseOtherEditors(UObject* Asset, IAssetEditorInstance* OnlyEditor);\n\n\t/**\n\t * Tries to open the editor for the specified asset. Returns true if the asset is opened in an editor.\n\t * If the file is already open in an editor, it will not create another editor window but instead bring it to front\n\t */\n\tstatic bool OpenEditorForAsset(const UObject* Asset);\n\n\t/** Returns the primary editor if one is already open for the specified asset.\n\t * If there is one open and bFocusIfOpen is true, that editor will be brought to the foreground and focused if possible.\n\t */\n\tstatic IAssetEditorInstance* FindEditorForAsset(UObject* Asset, bool bFocusIfOpen);\n\n\t/**\n\t * Tries to open an Dialogue editor for the GraphNode and jumps to it. Returns true if the asset is opened in an editor.\n\t * If the file is already open in an editor, it will not create another editor window but instead bring it to front\n\t */\n\tstatic bool OpenEditorAndJumpToGraphNode(const UEdGraphNode* GraphNode, bool bFocusIfOpen = false);\n\n\t// Just jumps to that graph node without trying to open any Dialogue Editor\n\t// If you want that just call OpenEditorAndJumpToGraphNode\n\tstatic bool JumpToGraphNode(const UEdGraphNode* GraphNode);\n\tstatic bool JumpToGraphNodeIndex(const UDlgDialogue* Dialogue, int32 NodeIndex);\n\n\t/**\n\t * Copy all children of the FromNode to be also the children of ToNode.\n\t *\n\t * @param\tFromNode\tSource Node\n\t * @param\tToNode\t\tDestination Node\n\t */\n\tstatic void CopyNodeChildren(const UDialogueGraphNode* FromNode, UDialogueGraphNode* ToNode);\n\n\t/**\n\t * Replace all connection to the OldNode, so that they point to the NewNode.\n\t * Make all parents of the OldNode point to NewNode instead.\n\t *\n\t * @param\tOldNode\t\tThe old child node that will have its conections from its parents removed and replaced to point to NewNode.\n\t * @param\tNewNode\t\tThe new child node that will have the connections to the parents of OldNode\n\t */\n\tstatic void ReplaceParentConnectionsToNode(const UDialogueGraphNode* OldNode, const UDialogueGraphNode* NewNode);\n\n\t// Wrapper over standard message box that that also logs to the console\n\tstatic EAppReturnType::Type ShowMessageBox(EAppMsgType::Type MsgType, const FString& Text, const FString& Caption);\n\n\t// Returns true if the TestPoint is inside the Geometry.\n\tstatic bool IsPointInsideGeometry(const FVector2D& TestPoint, const FGeometry& Geometry)\n\t{\n\t\tTArray<FVector2D> GeometryPoints;\n\t\tFGeometryHelper::ConvertToPoints(Geometry, GeometryPoints);\n\t\treturn FBox2D(GeometryPoints).IsInside(TestPoint);\n\t}\n\n\t/**\n\t * Replaces all references to old Node indices from the provided GraphNodes with new indices.\n\t * This can happen inside Conditions of type WasNodeVisited and HasSatisfiedChild because the NodeIndex is a weak reference.\n\t * Also sets the correct GUID to nodes that reference the GUID\n\t *\n\t * @param\tGraphNodes\t\t\tThe nodes we are replacing the old references\n\t * @param\tOldToNewIndexMap\tMap that tells us the mapping from old index to new index. Maps from old index -> new index\n\t */\n\tstatic void RemapOldIndicesWithNewAndUpdateGUID(\n\t\tconst TArray<UDialogueGraphNode*>& GraphNodes,\n\t\tconst TMap<int32, int32>& OldToNewIndexMap\n\t);\n\n\t// Gets the Dialogue for the provided UEdGraphNode\n\tstatic UDlgDialogue* GetDialogueFromGraphNode(const UEdGraphNode* GraphNode);\n\n\t// Save all the dialogues.\n\t// @return True on success or false on failure.\n\tstatic bool SaveAllDialogues();\n\n\t// Deletes all teh dialogues text files\n\t// @return True on success or false on failure.\n\tstatic bool DeleteAllDialoguesTextFiles();\n\n\t/***\n\t* Pops up a class picker dialog to choose the class that is a child of the Classprovided.\n\t*\n\t* @param\tTitleText\t\tThe title of the class picker dialog\n\t* @param\tOutChosenClass  The class chosen (if this function returns false, this will be null) by the the user\n\t* @param\tClass\t\t    The children of this class we are displaying and prompting the user to choose from.\n\t*\n\t* @return true if OK was pressed, false otherwise\n\t*/\n\tstatic bool PickChildrenOfClass(const FText& TitleText, UClass*& OutChosenClass, UClass* Class);\n\n\t// Opens the specified Blueprint at the last edited graph by default\n\t// or if the OpenType is set to Function or Event it opens that with the FunctionNameToOpen\n\tstatic bool OpenBlueprintEditor(\n        UBlueprint* Blueprint,\n        EDialogueBlueprintOpenType OpenType = EDialogueBlueprintOpenType::None,\n        FName FunctionNameToOpen = NAME_None,\n        bool bForceFullEditor = true,\n        bool bAddBlueprintFunctionIfItDoesNotExist = false\n    );\n\n\t// Adds the function if it does not exist\n\t// Return the Function Graph of the existing function or the newly created one\n\tstatic UEdGraph* BlueprintGetOrAddFunction(UBlueprint* Blueprint, FName FunctionName, UClass* FunctionClassSignature);\n\n\t// Same as BlueprintGetOrAddFunction but does not add it\n\tstatic UEdGraph* BlueprintGetFunction(UBlueprint* Blueprint, FName FunctionName, UClass* FunctionClassSignature);\n\n\t// Same as BlueprintGetOrAddFunction but only for an overriden event\n\tstatic UK2Node_Event* BlueprintGetOrAddEvent(UBlueprint* Blueprint, FName EventName, UClass* EventClassSignature);\n\n\t// Same as BlueprintGetOrAddEvent but does not add it\n\tstatic UK2Node_Event* BlueprintGetEvent(UBlueprint* Blueprint, FName EventName, UClass* EventClassSignature);\n\n\t// Adds a comment to the Blueprint\n\tstatic UEdGraphNode_Comment* BlueprintAddComment(UBlueprint* Blueprint, const FString& CommentString, FVector2D Location = FVector2D::ZeroVector);\n\nprivate:\n\t// Get the DialogueEditor for given object, if it exists\n\tstatic TSharedPtr<class IDialogueEditor> GetDialogueEditorForGraph(const UEdGraph* Graph);\n\n\tFDialogueEditorUtilities() = delete;\n};\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystemEditor/Private/DialogueSearch/DialogueSearchManager.cpp",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#include \"DialogueSearchManager.h\"\n\n#include \"Widgets/Docking/SDockTab.h\"\n#include \"AssetRegistryModule.h\"\n#include \"DialogueSearchUtilities.h\"\n#include \"WorkspaceMenuStructureModule.h\"\n#include \"WorkspaceMenuStructure.h\"\n#include \"EdGraphNode_Comment.h\"\n\n#include \"DlgSystemEditorModule.h\"\n#include \"DlgDialogue.h\"\n#include \"DlgManager.h\"\n#include \"SFindInDialogues.h\"\n#include \"DialogueEditor/Graph/DialogueGraph.h\"\n#include \"DialogueEditor/Nodes/DialogueGraphNode.h\"\n#include \"DialogueEditor/Nodes/DialogueGraphNode_Edge.h\"\n#include \"DialogueStyle.h\"\n#include \"DlgConstants.h\"\n\n#define LOCTEXT_NAMESPACE \"SDialogueBrowser\"\n\n#if ENGINE_MINOR_VERSION >= 24\n\t#define NY_ARRAY_COUNT UE_ARRAY_COUNT\n#else\n\t#define NY_ARRAY_COUNT ARRAY_COUNT\n#endif\n\nFDialogueSearchManager* FDialogueSearchManager::Instance = nullptr;\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// FDialogueSearchManager\nFDialogueSearchManager* FDialogueSearchManager::Get()\n{\n\tif (Instance == nullptr)\n\t{\n\t\tInstance = new Self();\n\t}\n\n\treturn Instance;\n}\n\nFDialogueSearchManager::FDialogueSearchManager()\n{\n\t// Create the Tab Ids\n\tfor (int32 TabIdx = 0; TabIdx < NY_ARRAY_COUNT(GlobalFindResultsTabIDs); TabIdx++)\n\t{\n\t\tconst FName TabID = FName(*FString::Printf(TEXT(\"GlobalNotYetDialogueFindResults_%02d\"), TabIdx + 1));\n\t\tGlobalFindResultsTabIDs[TabIdx] = TabID;\n\t}\n}\n\nFDialogueSearchManager::~FDialogueSearchManager()\n{\n\tUnInitialize();\n}\n\nbool FDialogueSearchManager::QueryDlgTextArgument(\n\tconst FDialogueSearchFilter& SearchFilter,\n\tconst FDlgTextArgument& InDlgTextArgument,\n\tconst TSharedPtr<FDialogueSearchResult>& OutParentNode,\n\tint32 ArgumentIndex\n)\n{\n\tif (SearchFilter.SearchString.IsEmpty() || !OutParentNode.IsValid())\n\t{\n\t\treturn false;\n\t}\n\tbool bContainsSearchString = false;\n\n\t// Test DisplayString\n\tif (InDlgTextArgument.DisplayString.Contains(SearchFilter.SearchString))\n\t{\n\t\tbContainsSearchString = true;\n\t\tconst FText Category = FText::Format(\n\t\t\tLOCTEXT(\"DlgTextArgumentDisplayString\", \"TextArgument.DisplayString at index = {0}\"),\n\t\t\tFText::AsNumber(ArgumentIndex)\n\t\t);\n\t\tMakeChildTextNode(\n\t\t\tOutParentNode,\n\t\t\tFText::FromString(InDlgTextArgument.DisplayString),\n\t\t\tCategory,\n\t\t\tCategory.ToString()\n\t\t);\n\t}\n\n\t// Test ParticipantName\n\tif (!InDlgTextArgument.ParticipantName.IsNone() &&\n\t\tInDlgTextArgument.ParticipantName.ToString().Contains(SearchFilter.SearchString))\n\t{\n\t\tbContainsSearchString = true;\n\t\tconst FText Category = FText::Format(\n\t\t\tLOCTEXT(\"DlgTextArgumentParticipantName\", \"TextArgument.ParticipantName at index = {0}\"),\n\t\t\tFText::AsNumber(ArgumentIndex)\n\t\t);\n\t\tMakeChildTextNode(\n\t\t\tOutParentNode,\n\t\t\tFText::FromName(InDlgTextArgument.ParticipantName),\n\t\t\tCategory,\n\t\t\tCategory.ToString()\n\t\t);\n\t}\n\n\t// Test VariableName\n\tif (!InDlgTextArgument.VariableName.IsNone() &&\n\t\tInDlgTextArgument.VariableName.ToString().Contains(SearchFilter.SearchString))\n\t{\n\t\tbContainsSearchString = true;\n\t\tconst FText Category = FText::Format(\n\t\t\tLOCTEXT(\"DlgTextArgumentVariableName\", \"TextArgument.VariableName at index = {0}\"),\n\t\t\tFText::AsNumber(ArgumentIndex)\n\t\t);\n\t\tMakeChildTextNode(\n\t\t\tOutParentNode,\n\t\t\tFText::FromName(InDlgTextArgument.VariableName),\n\t\t\tCategory,\n\t\t\tCategory.ToString()\n\t\t);\n\t}\n\n\tif (SearchFilter.bIncludeCustomObjectNames)\n\t{\n\t\t// Test CustomTextArgument\n\t\tFString FoundName;\n\t\tif (FDialogueSearchUtilities::DoesObjectClassNameContainString(InDlgTextArgument.CustomTextArgument, SearchFilter.SearchString, FoundName))\n\t\t{\n\t\t\tbContainsSearchString = true;\n\t\t\tconst FText Category = FText::Format(\n\t\t\t\tLOCTEXT(\"DlgTextArgumentCustomTextArgument\", \"TextArgument.CustomTextArgument at index = {0}\"),\n\t\t\t\tFText::AsNumber(ArgumentIndex)\n\t\t\t);\n\t\t\tMakeChildTextNode(\n\t\t\t\tOutParentNode,\n\t\t\t\tFText::FromString(FoundName),\n\t\t\t\tCategory,\n\t\t\t\tCategory.ToString()\n\t\t\t);\n\t\t}\n\t}\n\n\treturn bContainsSearchString;\n}\n\nbool FDialogueSearchManager::QueryDlgCondition(\n\tconst FDialogueSearchFilter& SearchFilter,\n\tconst FDlgCondition& InDlgCondition,\n\tconst TSharedPtr<FDialogueSearchResult>& OutParentNode,\n\tint32 ConditionIndex,\n\tFName ConditionMemberName\n)\n{\n\tif (SearchFilter.SearchString.IsEmpty() || !OutParentNode.IsValid())\n\t{\n\t\treturn false;\n\t}\n\tbool bContainsSearchString = false;\n\n\t// Test ParticipantName\n\tif (!InDlgCondition.ParticipantName.IsNone() &&\n\t\tInDlgCondition.ParticipantName.ToString().Contains(SearchFilter.SearchString))\n\t{\n\t\tbContainsSearchString = true;\n\t\tconst FText Category = FText::Format(\n\t\t\tLOCTEXT(\"DlgConditionParticipantName\", \"{0}.ParticipantName at index = {1}\"),\n\t\t \t FText::FromName(ConditionMemberName), FText::AsNumber(ConditionIndex)\n\t\t);\n\t\tMakeChildTextNode(\n\t\t\tOutParentNode,\n\t\t\tFText::FromName(InDlgCondition.ParticipantName),\n\t\t\tCategory,\n\t\t\tCategory.ToString()\n\t\t);\n\t}\n\n\t// Test CallBackName\n\tif (!InDlgCondition.CallbackName.IsNone() &&\n\t\tInDlgCondition.CallbackName.ToString().Contains(SearchFilter.SearchString))\n\t{\n\t\tbContainsSearchString = true;\n\t\tconst FText Category = FText::Format(\n\t\t\tLOCTEXT(\"DlgConditionCallbackName\", \"{0}.CallbackName at index = {01}\"),\n\t\t\tFText::FromName(ConditionMemberName), FText::AsNumber(ConditionIndex)\n\t\t);\n\t\tMakeChildTextNode(\n\t\t\tOutParentNode,\n\t\t\tFText::FromName(InDlgCondition.CallbackName),\n\t\t\tCategory,\n\t\t\tCategory.ToString()\n\t\t);\n\t}\n\n\t// Test NameValue\n\tif (!InDlgCondition.NameValue.IsNone() &&\n\t\tInDlgCondition.NameValue.ToString().Contains(SearchFilter.SearchString))\n\t{\n\t\tbContainsSearchString = true;\n\t\tconst FText Category = FText::Format(\n\t\t\tLOCTEXT(\"DlgConditionNameValue\", \"{0}.NameValue at index = {1}\"),\n\t\t\tFText::FromName(ConditionMemberName), FText::AsNumber(ConditionIndex)\n\t\t);\n\t\tMakeChildTextNode(\n\t\t\tOutParentNode,\n\t\t\tFText::FromName(InDlgCondition.NameValue),\n\t\t\tCategory,\n\t\t\tCategory.ToString()\n\t\t);\n\t}\n\n\t// Test OtherParticipantName\n\tif (!InDlgCondition.OtherParticipantName.IsNone() &&\n\t\tInDlgCondition.OtherParticipantName.ToString().Contains(SearchFilter.SearchString))\n\t{\n\t\tbContainsSearchString = true;\n\t\tconst FText Category = FText::Format(\n\t\t\tLOCTEXT(\"DlgConditionOtherParticipantName\", \"{0}.OtherParticipantName at index = {1}\"),\n\t\t\tFText::FromName(ConditionMemberName), FText::AsNumber(ConditionIndex)\n\t\t);\n\t\tMakeChildTextNode(\n\t\t\tOutParentNode,\n\t\t\tFText::FromName(InDlgCondition.OtherParticipantName),\n\t\t\tCategory,\n\t\t\tCategory.ToString()\n\t\t);\n\t}\n\n\t// Test OtherVariableName\n\tif (!InDlgCondition.OtherVariableName.IsNone() &&\n\t\tInDlgCondition.OtherVariableName.ToString().Contains(SearchFilter.SearchString))\n\t{\n\t\tbContainsSearchString = true;\n\t\tconst FText Category = FText::Format(\n\t\t\tLOCTEXT(\"DlgConditionOtherVariableName\", \"{0}.OtherVariableName at index = {1}\"),\n\t\t\tFText::FromName(ConditionMemberName), FText::AsNumber(ConditionIndex)\n\t\t);\n\t\tMakeChildTextNode(\n\t\t\tOutParentNode,\n\t\t\tFText::FromName(InDlgCondition.OtherVariableName),\n\t\t\tCategory,\n\t\t\tCategory.ToString()\n\t\t);\n\t}\n\n\tif (SearchFilter.bIncludeCustomObjectNames)\n\t{\n\t\t// Test Custom Condition\n\t\tFString FoundName;\n\t\tif (FDialogueSearchUtilities::DoesObjectClassNameContainString(InDlgCondition.CustomCondition, SearchFilter.SearchString, FoundName))\n\t\t{\n\t\t\tbContainsSearchString = true;\n\t\t\tconst FText Category = FText::Format(\n\t\t\t\tLOCTEXT(\"DlgConditionCustomCondition\", \"{0}.CustomCondition at index = {1}\"),\n\t\t\t\tFText::FromName(ConditionMemberName), FText::AsNumber(ConditionIndex)\n\t\t\t);\n\t\t\tMakeChildTextNode(\n\t\t\t\tOutParentNode,\n\t\t\t\tFText::FromString(FoundName),\n\t\t\t\tCategory,\n\t\t\t\tCategory.ToString()\n\t\t\t);\n\t\t}\n\t}\n\n\tif (SearchFilter.bIncludeNodeGUID)\n\t{\n\t\t// Test Node GUID\n\t\tFString FoundGUID;\n\t\tif (FDialogueSearchUtilities::DoesGUIDContainString(InDlgCondition.GUID, SearchFilter.SearchString, FoundGUID))\n\t\t{\n\t\t\tbContainsSearchString = true;\n\t\t\tconst FText Category = FText::Format(\n\t\t\t\tLOCTEXT(\"DlgConditioGUID\", \"{0}.GUID at index = {1}\"),\n\t\t\t\tFText::FromName(ConditionMemberName), FText::AsNumber(ConditionIndex)\n\t\t\t);\n\t\t\tMakeChildTextNode(\n\t\t\t\tOutParentNode,\n\t\t\t\tFText::FromString(FoundGUID),\n\t\t\t\tCategory,\n\t\t\t\tCategory.ToString()\n\t\t\t);\n\t\t}\n\t}\n\n\tif (SearchFilter.bIncludeNumericalTypes)\n\t{\n\t\t// Test IntValue\n\t\tconst FString IntValue = FString::FromInt(InDlgCondition.IntValue);\n\t\tif (IntValue.Contains(SearchFilter.SearchString))\n\t\t{\n\t\t\tbContainsSearchString = true;\n\t\t\tconst FText Category = FText::Format(\n\t\t\t\tLOCTEXT(\"DlgConditionIntValue\", \"{0}.IntValue at index = {1}\"),\n\t\t\t\tFText::FromName(ConditionMemberName), FText::AsNumber(ConditionIndex)\n\t\t\t);\n\t\t\tMakeChildTextNode(\n\t\t\t\tOutParentNode,\n\t\t\t\tFText::FromString(IntValue),\n\t\t\t\tCategory,\n\t\t\t\tCategory.ToString()\n\t\t\t);\n\t\t}\n\n\t\t// Test FloatValue\n\t\tconst FString FloatValue = FString::SanitizeFloat(InDlgCondition.FloatValue);\n\t\tif (FloatValue.Contains(SearchFilter.SearchString))\n\t\t{\n\t\t\tbContainsSearchString = true;\n\t\t\tconst FText Category = FText::Format(\n\t\t\t\tLOCTEXT(\"DlgConditionFloatValue\", \"{0}.FloatValue at index = {1}\"),\n\t\t\t\tFText::FromName(ConditionMemberName), FText::AsNumber(ConditionIndex)\n\t\t\t);\n\t\t\tMakeChildTextNode(\n\t\t\t\tOutParentNode,\n\t\t\t\tFText::FromString(FloatValue),\n\t\t\t\tCategory,\n\t\t\t\tCategory.ToString()\n\t\t\t);\n\t\t}\n\t}\n\n\treturn bContainsSearchString;\n}\n\nbool FDialogueSearchManager::QueryDlgEvent(\n\tconst FDialogueSearchFilter& SearchFilter,\n\tconst FDlgEvent& InDlgEvent,\n\tconst TSharedPtr<FDialogueSearchResult>& OutParentNode,\n\tint32 EventIndex,\n\tFName EventMemberName\n)\n{\n\tif (SearchFilter.SearchString.IsEmpty() || !OutParentNode.IsValid())\n\t{\n\t\treturn false;\n\t}\n\tbool bContainsSearchString = false;\n\n\t// Test ParticipantName\n\tif (!InDlgEvent.ParticipantName.IsNone() &&\n\t\tInDlgEvent.ParticipantName.ToString().Contains(SearchFilter.SearchString))\n\t{\n\t\tbContainsSearchString = true;\n\t\tconst FText Category = FText::Format(\n\t\t\tLOCTEXT(\"DlgEventParticipantName\", \"{0}.ParticipantName at index = {1}\"),\n\t\t\tFText::FromName(EventMemberName), FText::AsNumber(EventIndex)\n\t\t);\n\t\tMakeChildTextNode(\n\t\t\tOutParentNode,\n\t\t\tFText::FromName(InDlgEvent.ParticipantName),\n\t\t\tCategory,\n\t\t\tCategory.ToString()\n\t\t);\n\t}\n\n\t// Test EventName\n\tif (!InDlgEvent.EventName.IsNone() &&\n\t\tInDlgEvent.EventName.ToString().Contains(SearchFilter.SearchString))\n\t{\n\t\tbContainsSearchString = true;\n\t\tconst FText Category = FText::Format(\n\t\t\tLOCTEXT(\"DlgEventCallbackName\", \"{0}.EventName at index = {1}\"),\n\t\t\tFText::FromName(EventMemberName), FText::AsNumber(EventIndex)\n\t\t);\n\t\tMakeChildTextNode(\n\t\t\tOutParentNode,\n\t\t\tFText::FromName(InDlgEvent.EventName),\n\t\t\tCategory,\n\t\t\tCategory.ToString()\n\t\t);\n\t}\n\n\t// Test NameValue\n\tif (!InDlgEvent.NameValue.IsNone() &&\n\t\tInDlgEvent.NameValue.ToString().Contains(SearchFilter.SearchString))\n\t{\n\t\tbContainsSearchString = true;\n\t\tconst FText Category = FText::Format(\n\t\t\tLOCTEXT(\"DlgEventNameValue\", \"{0}.NameValue at index = {1}\"),\n\t\t\tFText::FromName(EventMemberName), FText::AsNumber(EventIndex)\n\t\t);\n\t\tMakeChildTextNode(\n\t\t\tOutParentNode,\n\t\t\tFText::FromName(InDlgEvent.NameValue),\n\t\t\tCategory,\n\t\t\tCategory.ToString()\n\t\t);\n\t}\n\n\tif (SearchFilter.bIncludeCustomObjectNames)\n\t{\n\t\tFString FoundName;\n\t\tif (FDialogueSearchUtilities::DoesObjectClassNameContainString(InDlgEvent.CustomEvent, SearchFilter.SearchString, FoundName))\n\t\t{\n\t\t\tbContainsSearchString = true;\n\t\t\tconst FText Category = FText::Format(\n\t\t\t\tLOCTEXT(\"DlgEventCustomEvent\", \"{0}.CustomEvent at index = {1}\"),\n\t\t\t\tFText::FromName(EventMemberName), FText::AsNumber(EventIndex)\n\t\t\t);\n\t\t\tMakeChildTextNode(\n\t\t\t\tOutParentNode,\n\t\t\t\tFText::FromString(FoundName),\n\t\t\t\tCategory,\n\t\t\t\tCategory.ToString()\n\t\t\t);\n\t\t}\n\t}\n\n\tif (SearchFilter.bIncludeNumericalTypes)\n\t{\n\t\t// Test IntValue\n\t\tconst FString IntValue = FString::FromInt(InDlgEvent.IntValue);\n\t\tif (IntValue.Contains(SearchFilter.SearchString))\n\t\t{\n\t\t\tbContainsSearchString = true;\n\t\t\tconst FText Category = FText::Format(\n\t\t\t\tLOCTEXT(\"DlgEventIntValue\", \"{0}.IntValue at index = {1}\"),\n\t\t\t\tFText::FromName(EventMemberName), FText::AsNumber(EventIndex)\n\t\t\t);\n\t\t\tMakeChildTextNode(\n\t\t\t\tOutParentNode,\n\t\t\t\tFText::FromString(IntValue),\n\t\t\t\tCategory,\n\t\t\t\tCategory.ToString()\n\t\t\t);\n\t\t}\n\n\t\t// Test FloatValue\n\t\tconst FString FloatValue = FString::SanitizeFloat(InDlgEvent.FloatValue);\n\t\tif (FloatValue.Contains(SearchFilter.SearchString))\n\t\t{\n\t\t\tbContainsSearchString = true;\n\t\t\tconst FText Category = FText::Format(\n\t\t\t\tLOCTEXT(\"DlgEventFloatValue\", \"{0}.FloatValue at index = {1}\"),\n\t\t\t\tFText::FromName(EventMemberName), FText::AsNumber(EventIndex)\n\t\t\t);\n\t\t\tMakeChildTextNode(\n\t\t\t\tOutParentNode,\n\t\t\t\tFText::FromString(FloatValue),\n\t\t\t\tCategory,\n\t\t\t\tCategory.ToString()\n\t\t\t);\n\t\t}\n\t}\n\n\treturn bContainsSearchString;\n}\n\nbool FDialogueSearchManager::QueryDlgEdge(\n\tconst FDialogueSearchFilter& SearchFilter,\n\tconst FDlgEdge& InDlgEdge,\n\tconst TSharedPtr<FDialogueSearchResult>& OutParentNode\n)\n{\n\tif (SearchFilter.SearchString.IsEmpty() || !OutParentNode.IsValid())\n\t{\n\t\treturn false;\n\t}\n\tbool bContainsSearchString = false;\n\n\t// Test Text\n\tif (InDlgEdge.GetUnformattedText().ToString().Contains(SearchFilter.SearchString))\n\t{\n\t\tbContainsSearchString = true;\n\t\tconst FText Category = LOCTEXT(\"DlgEdgText\", \"Edge.Text\");\n\t\tMakeChildTextNode(\n\t\t\tOutParentNode,\n\t\t\tInDlgEdge.GetUnformattedText(),\n\t\t\tCategory,\n\t\t\tCategory.ToString()\n\t\t);\n\t}\n\t// Test the Node Text Data\n\tif (SearchFilter.bIncludeTextLocalizationData)\n\t{\n\t\tbContainsSearchString = SearchForTextLocalizationData(\n\t\t\tOutParentNode,\n\t\t\tSearchFilter.SearchString,\n\t\t\tInDlgEdge.GetUnformattedText(),\n\t\t\tLOCTEXT(\"EdgeTextNamespaceName_Found\", \"Edge Text Namespace\"), TEXT(\"Edge Text Localization Namespace\"),\n\t\t\tLOCTEXT(\"EdgeTextKey_Found\", \"Edge Text Key\"), TEXT(\"Edge Text Localization Key\")\n\t\t) || bContainsSearchString;\n\t}\n\n\t// Test Condition\n\tfor (int32 Index = 0, Num = InDlgEdge.Conditions.Num(); Index < Num; Index++)\n\t{\n\t\tbContainsSearchString = QueryDlgCondition(\n\t\t\tSearchFilter,\n\t\t\tInDlgEdge.Conditions[Index],\n\t\t\tOutParentNode,\n\t\t\tIndex,\n\t\t\tTEXT(\"Condition\")\n\t\t) || bContainsSearchString;\n\t}\n\n\t// Test SpeakerState\n\tif (!InDlgEdge.SpeakerState.IsNone() &&\n\t\tInDlgEdge.SpeakerState.ToString().Contains(SearchFilter.SearchString))\n\t{\n\t\tbContainsSearchString = true;\n\t\tconst FText Category = LOCTEXT(\"DlgEdgeSpeakerState\", \"Edge.SpeakerState\");\n\t\tMakeChildTextNode(\n\t\t\tOutParentNode,\n\t\t\tFText::FromName(InDlgEdge.SpeakerState),\n\t\t\tCategory,\n\t\t\tCategory.ToString()\n\t\t);\n\t}\n\n\t// Test TextArguments\n\tconst TArray<FDlgTextArgument>&  TextArguments = InDlgEdge.GetTextArguments();\n\tfor (int32 Index = 0, Num = TextArguments.Num(); Index < Num; Index++)\n\t{\n\t\tbContainsSearchString = QueryDlgTextArgument(SearchFilter, TextArguments[Index], OutParentNode, Index) || bContainsSearchString;\n\t}\n\n\treturn bContainsSearchString;\n}\n\nbool FDialogueSearchManager::QueryGraphNode(\n\tconst FDialogueSearchFilter& SearchFilter,\n\tconst UDialogueGraphNode* InGraphNode,\n\tconst TSharedPtr<FDialogueSearchResult>& OutParentNode\n)\n{\n\tif (SearchFilter.SearchString.IsEmpty() || !OutParentNode.IsValid() || !IsValid(InGraphNode))\n\t{\n\t\treturn false;\n\t}\n\n\tbool bContainsSearchString = false;\n\tconst UDlgNode& Node = InGraphNode->GetDialogueNode();\n\tconst int32 NodeIndex = InGraphNode->GetDialogueNodeIndex();\n\tconst FString NodeType = Node.GetNodeTypeString();\n\n\t// Create the GraphNode Node\n\tconst FText DisplayText = FText::Format(\n\t\tLOCTEXT(\"TreeGraphNodeCategory\", \"{0} Node at index {1}\"),\n\t\tFText::FromString(NodeType), FText::AsNumber(NodeIndex)\n\t);\n\tTSharedPtr<FDialogueSearchResult_GraphNode> TreeGraphNode = MakeShared<FDialogueSearchResult_GraphNode>(DisplayText, OutParentNode);\n\tTreeGraphNode->SetCategory(FText::FromString(NodeType));\n\tTreeGraphNode->SetGraphNode(InGraphNode);\n\n\t// Test the NodeIndex\n\tif (SearchFilter.bIncludeIndices && !InGraphNode->IsRootNode())\n\t{\n\t\t// NOTE: We do not create another node, we just use the Node DisplayText as the search node.\n\t\tif (FString::FromInt(NodeIndex).Contains(SearchFilter.SearchString))\n\t\t{\n\t\t\tbContainsSearchString = true;\n\t\t}\n\t}\n\n\t// Test the Node Comment\n\tif (SearchFilter.bIncludeComments)\n\t{\n\t\tif (InGraphNode->NodeComment.Contains(SearchFilter.SearchString))\n\t\t{\n\t\t\tbContainsSearchString = true;\n\t\t\tMakeChildTextNode(\n\t\t\t\tTreeGraphNode,\n\t\t\t\tFText::FromString(InGraphNode->NodeComment),\n\t\t\t\tLOCTEXT(\"NodeCommentKey\", \"Comment on Node\"),\n\t\t\t\tTEXT(\"Comment on Node\")\n\t\t\t);\n\t\t}\n\t}\n\n\t// Test the ParticipantName\n\tif (Node.GetNodeParticipantName().ToString().Contains(SearchFilter.SearchString))\n\t{\n\t\tbContainsSearchString = true;\n\t\tMakeChildTextNode(\n\t\t\tTreeGraphNode,\n\t\t\tFText::FromName(Node.GetNodeParticipantName()),\n\t\t\tLOCTEXT(\"ParticipantNameKey\", \"Participant Name\"),\n\t\t\tTEXT(\"Participant Name\")\n\t\t);\n\t}\n\n\t// Test the Node text\n\tif (Node.GetNodeUnformattedText().ToString().Contains(SearchFilter.SearchString))\n\t{\n\t\tbContainsSearchString = true;\n\t\tMakeChildTextNode(\n\t\t\tTreeGraphNode,\n\t\t\tNode.GetNodeUnformattedText(),\n\t\t\tLOCTEXT(\"DescriptionKey\", \"Text\"),\n\t\t\tTEXT(\"Text\")\n\t\t);\n\t}\n\t// Test the Node Text Data\n\tif (SearchFilter.bIncludeTextLocalizationData)\n\t{\n\t\tbContainsSearchString = SearchForTextLocalizationData(\n\t\t\tTreeGraphNode,\n\t\t\tSearchFilter.SearchString, Node.GetNodeUnformattedText(),\n\t\t\tLOCTEXT(\"TextNamespaceName_Found\", \"Text Namespace\"), TEXT(\"Text Localization Namespace\"),\n\t\t\tLOCTEXT(\"TextKey_Found\", \"Text Key\"), TEXT(\"Text Localization Key\")\n\t\t) || bContainsSearchString;\n\t}\n\n\t// Test the EnterConditions\n\tconst TArray<FDlgCondition>& EnterConditions = Node.GetNodeEnterConditions();\n\tfor (int32 Index = 0, Num = EnterConditions.Num(); Index < Num; Index++)\n\t{\n\t\tbContainsSearchString = QueryDlgCondition(\n\t\t\tSearchFilter,\n\t\t\tEnterConditions[Index],\n\t\t\tTreeGraphNode,\n\t\t\tIndex,\n\t\t\tTEXT(\"EnterCondition\")\n\t\t) || bContainsSearchString;\n\t}\n\n\t// Test the EnterEvents\n\tconst TArray<FDlgEvent>& EnterEvents = Node.GetNodeEnterEvents();\n\tfor (int32 Index = 0, Num = EnterEvents.Num(); Index < Num; Index++)\n\t{\n\t\tbContainsSearchString = QueryDlgEvent(\n\t\t\tSearchFilter,\n\t\t\tEnterEvents[Index],\n\t\t\tTreeGraphNode,\n\t\t\tIndex,\n\t\t\tTEXT(\"EnterEvent\")\n\t\t) || bContainsSearchString;\n\t}\n\n\t// Test SpeakerState\n\tif (!Node.GetSpeakerState().IsNone() &&\n\t\tNode.GetSpeakerState().ToString().Contains(SearchFilter.SearchString))\n\t{\n\t\tbContainsSearchString = true;\n\t\tMakeChildTextNode(\n\t\t\tTreeGraphNode,\n\t\t\tFText::FromName(Node.GetSpeakerState()),\n\t\t\tLOCTEXT(\"SpeakerStateKey\", \"Speaker State\"),\n\t\t\tTEXT(\"Speaker State\")\n\t\t);\n\t}\n\n\t// Test TextArguments\n\tconst TArray<FDlgTextArgument>& TextArguments = Node.GetTextArguments();\n\tfor (int32 Index = 0, Num = TextArguments.Num(); Index < Num; Index++)\n\t{\n\t\tbContainsSearchString = QueryDlgTextArgument(SearchFilter, TextArguments[Index], TreeGraphNode, Index) || bContainsSearchString;\n\t}\n\n\tif (SearchFilter.bIncludeCustomObjectNames)\n\t{\n\t\t// Test Node Data\n\t\tFString FoundName;\n\t\tif (FDialogueSearchUtilities::DoesObjectClassNameContainString(Node.GetNodeData(), SearchFilter.SearchString, FoundName))\n\t\t{\n\t\t\tbContainsSearchString = true;\n\t\t\tMakeChildTextNode(\n\t\t\t\tTreeGraphNode,\n\t\t\t\tFText::FromString(FoundName),\n\t\t\t\tLOCTEXT(\"NodeDataKey\", \"Node Data\"),\n\t\t\t\tTEXT(\"Node Data\")\n\t\t\t);\n\t\t}\n\t}\n\n\tif (SearchFilter.bIncludeNodeGUID)\n\t{\n\t\t// Test Node GUID\n\t\tFString FoundGUID;\n\t\tif (FDialogueSearchUtilities::DoesGUIDContainString(Node.GetGUID(), SearchFilter.SearchString, FoundGUID))\n\t\t{\n\t\t\tbContainsSearchString = true;\n\t\t\tMakeChildTextNode(\n\t\t\t\tTreeGraphNode,\n\t\t\t\tFText::FromString(FoundGUID),\n\t\t\t\tLOCTEXT(\"NodeGUID\", \"Node GUID\"),\n\t\t\t\tTEXT(\"Node GUID\")\n\t\t\t);\n\t\t}\n\t}\n\n\t// Handle Speech sequences\n\tif (const UDlgNode_SpeechSequence* SpeechSequence = Cast<UDlgNode_SpeechSequence>(&Node))\n\t{\n\t\tconst TArray<FDlgSpeechSequenceEntry>& SpeechSequenceArray = SpeechSequence->GetNodeSpeechSequence();\n\t\tfor (int32 Index = 0, Num = SpeechSequenceArray.Num(); Index < Num; Index++)\n\t\t{\n\t\t\tconst FDlgSpeechSequenceEntry& SequenceEntry = SpeechSequenceArray[Index];\n\n\t\t\t// Test Speaker\n\t\t\tif (SequenceEntry.Speaker.ToString().Contains(SearchFilter.SearchString))\n\t\t\t{\n\t\t\t\tbContainsSearchString = true;\n\t\t\t\tconst FText Category = FText::Format(LOCTEXT(\"SequenceEntrySpeaker\", \"SequenceEntry.Speaker at index = {0}\"), FText::AsNumber(Index));\n\t\t\t\tMakeChildTextNode(TreeGraphNode, FText::FromName(SequenceEntry.Speaker), Category, Category.ToString());\n\t\t\t}\n\n\t\t\t// Test Text Description\n\t\t\tconst FText TextCategory = FText::Format(LOCTEXT(\"SequenceEntryText\", \"SequenceEntry.Text at index = {0}\"), FText::AsNumber(Index));\n\t\t\tif (SequenceEntry.Text.ToString().Contains(SearchFilter.SearchString))\n\t\t\t{\n\t\t\t\tbContainsSearchString = true;\n\t\t\t\tMakeChildTextNode(TreeGraphNode, SequenceEntry.Text, TextCategory, TextCategory.ToString());\n\t\t\t}\n\t\t\tif (SearchFilter.bIncludeTextLocalizationData)\n\t\t\t{\n\t\t\t\tconst FText NamespaceCategory = FText::FromString(TEXT(\"Namespace \") + TextCategory.ToString());\n\t\t\t\tconst FText KeyCategory =  FText::FromString(TEXT(\"Key \") + TextCategory.ToString());\n\t\t\t\tbContainsSearchString = SearchForTextLocalizationData(\n\t\t\t\t\tTreeGraphNode,\n\t\t\t\t\tSearchFilter.SearchString, SequenceEntry.Text,\n\t\t\t\t\tNamespaceCategory, NamespaceCategory.ToString(),\n\t\t\t\t\tKeyCategory, KeyCategory.ToString()\n\t\t\t\t) || bContainsSearchString;\n\t\t\t}\n\n\t\t\t// Test EdgeText\n\t\t\tconst FText EdgeTextCategory = FText::Format(LOCTEXT(\"SequenceEntryEdgeText\", \"SequenceEntry.EdgeText at index = {0}\"), FText::AsNumber(Index));\n\t\t\tif (SequenceEntry.EdgeText.ToString().Contains(SearchFilter.SearchString))\n\t\t\t{\n\t\t\t\tbContainsSearchString = true;\n\t\t\t\tMakeChildTextNode(TreeGraphNode, SequenceEntry.EdgeText, EdgeTextCategory, EdgeTextCategory.ToString());\n\t\t\t}\n\t\t\tif (SearchFilter.bIncludeTextLocalizationData)\n\t\t\t{\n\t\t\t\tconst FText NamespaceCategory = FText::FromString(TEXT(\"Namespace \") + EdgeTextCategory.ToString());\n\t\t\t\tconst FText KeyCategory =  FText::FromString(TEXT(\"Key \") + EdgeTextCategory.ToString());\n\t\t\t\tbContainsSearchString = SearchForTextLocalizationData(\n\t\t\t\t\tTreeGraphNode,\n\t\t\t\t\tSearchFilter.SearchString, SequenceEntry.EdgeText,\n\t\t\t\t\tNamespaceCategory, NamespaceCategory.ToString(),\n\t\t\t\t\tKeyCategory, KeyCategory.ToString()\n\t\t\t\t) || bContainsSearchString;\n\t\t\t}\n\n\t\t\t// Test SpeakerState\n\t\t\tif (!SequenceEntry.SpeakerState.IsNone() &&\n\t\t\t\tSequenceEntry.SpeakerState.ToString().Contains(SearchFilter.SearchString))\n\t\t\t{\n\t\t\t\tbContainsSearchString = true;\n\t\t\t\tconst FText Category = FText::Format(LOCTEXT(\"SequenceEntrySpeakerState\", \"SequenceEntry.SpeakerState at index = {0}\"), FText::AsNumber(Index));\n\t\t\t\tMakeChildTextNode(TreeGraphNode, FText::FromName(SequenceEntry.SpeakerState), Category, Category.ToString());\n\t\t\t}\n\t\t}\n\t}\n\n\tif (bContainsSearchString)\n\t{\n\t\tOutParentNode->AddChild(TreeGraphNode);\n\t}\n\n\treturn bContainsSearchString;\n}\n\nbool FDialogueSearchManager::QueryEdgeNode(\n\tconst FDialogueSearchFilter& SearchFilter,\n\tconst UDialogueGraphNode_Edge* InEdgeNode,\n\tconst TSharedPtr<FDialogueSearchResult>& OutParentNode\n)\n{\n\tif (SearchFilter.SearchString.IsEmpty() || !OutParentNode.IsValid() || !IsValid(InEdgeNode))\n\t{\n\t\treturn false;\n\t}\n\tbool bContainsSearchString = false;\n\n\t// Build up the Display Text\n\tint32 FromParent = -1;\n\tint32 ToChild = -1;\n\tif (InEdgeNode->HasParentNode())\n\t{\n\t\tFromParent = InEdgeNode->GetParentNode()->GetDialogueNodeIndex();\n\t}\n\tif (InEdgeNode->HasChildNode())\n\t{\n\t\tToChild = InEdgeNode->GetChildNode()->GetDialogueNodeIndex();\n\t}\n\tconst FText DisplayText = FText::Format(LOCTEXT(\"EdgeNodeDisplaytext\", \"Edge between {0} -> {1}\"),\n\t\tFText::AsNumber(FromParent), FText::AsNumber(ToChild));\n\tTSharedPtr<FDialogueSearchResult_EdgeNode> TreeEdgeNode = MakeShared<FDialogueSearchResult_EdgeNode>(DisplayText, OutParentNode);\n\tTreeEdgeNode->SetCategory(DisplayText);\n\tTreeEdgeNode->SetEdgeNode(InEdgeNode);\n\n\t// Search in the DlgEdge\n\tconst FDlgEdge& DialogueEdge = InEdgeNode->GetDialogueEdge();\n\tbContainsSearchString = QueryDlgEdge(SearchFilter, DialogueEdge, TreeEdgeNode) || bContainsSearchString;\n\n\tif (bContainsSearchString)\n\t{\n\t\tOutParentNode->AddChild(TreeEdgeNode);\n\t}\n\n\treturn bContainsSearchString;\n}\n\nbool FDialogueSearchManager::QueryCommentNode(\n\tconst FDialogueSearchFilter& SearchFilter,\n\tconst UEdGraphNode_Comment* InCommentNode,\n\tconst TSharedPtr<FDialogueSearchResult>& OutParentNode\n)\n{\n\tif (!SearchFilter.bIncludeComments || SearchFilter.SearchString.IsEmpty() || !OutParentNode.IsValid() || !IsValid(InCommentNode))\n\t{\n\t\treturn false;\n\t}\n\n\tif (InCommentNode->NodeComment.Contains(SearchFilter.SearchString))\n\t{\n\t\tconst FText Category = LOCTEXT(\"TreeNodeCommentCategory\", \"Comment Node\");\n\t\tTSharedPtr<FDialogueSearchResult_CommentNode> TreeCommentNode = MakeShared<FDialogueSearchResult_CommentNode>(Category, OutParentNode);\n\t\tTreeCommentNode->SetCategory(Category);\n\t\tTreeCommentNode->SetCommentNode(InCommentNode);\n\n\t\tMakeChildTextNode(\n\t\t\tTreeCommentNode,\n\t\t\tFText::FromString(InCommentNode->NodeComment),\n\t\t\tCategory,\n\t\t\tTEXT(\"\")\n\t\t);\n\n\t\tOutParentNode->AddChild(TreeCommentNode);\n\t\treturn true;\n\t}\n\treturn false;\n}\n\nbool FDialogueSearchManager::QuerySingleDialogue(\n\tconst FDialogueSearchFilter& SearchFilter,\n\tconst UDlgDialogue* InDialogue,\n\tTSharedPtr<FDialogueSearchResult>& OutParentNode\n)\n{\n\tif (SearchFilter.SearchString.IsEmpty() || !OutParentNode.IsValid() || !IsValid(InDialogue))\n\t{\n\t\treturn false;\n\t}\n\n\tconst UDialogueGraph* Graph = CastChecked<UDialogueGraph>(InDialogue->GetGraph());\n\tTSharedPtr<FDialogueSearchResult_DialogueNode> TreeDialogueNode = MakeShared<FDialogueSearchResult_DialogueNode>(\n\t\t\tFText::FromString(InDialogue->GetPathName()), OutParentNode\n\t);\n\tTreeDialogueNode->SetDialogue(InDialogue);\n\n\t// Find in GraphNodes\n\tbool bFoundInDialogue = false;\n\tconst TArray<UEdGraphNode*>& AllGraphNodes = Graph->GetAllGraphNodes();\n\tfor (UEdGraphNode* Node : AllGraphNodes)\n\t{\n\t\tbool bFoundInNode = false;\n\t\tif (UDialogueGraphNode* GraphNode = Cast<UDialogueGraphNode>(Node))\n\t\t{\n\t\t\tbFoundInNode = QueryGraphNode(SearchFilter, GraphNode, TreeDialogueNode);\n\t\t}\n\t\telse if (UDialogueGraphNode_Edge* EdgeNode = Cast<UDialogueGraphNode_Edge>(Node))\n\t\t{\n\t\t\tbFoundInNode = QueryEdgeNode(SearchFilter, EdgeNode, TreeDialogueNode);\n\t\t}\n\t\telse if (UEdGraphNode_Comment* CommentNode = Cast<UEdGraphNode_Comment>(Node))\n\t\t{\n\t\t\tbFoundInNode = QueryCommentNode(SearchFilter, CommentNode, TreeDialogueNode);\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// ignore everything else\n\t\t}\n\n\t\t// Found at least one match in one of the nodes.\n\t\tbFoundInDialogue = bFoundInNode || bFoundInDialogue;\n\t}\n\n\t// Search for GUID\n\tif (SearchFilter.bIncludeDialogueGUID)\n\t{\n\t\tFString FoundGUID;\n\t\tif (FDialogueSearchUtilities::DoesGUIDContainString(InDialogue->GetGUID(), SearchFilter.SearchString, FoundGUID))\n\t\t{\n\t\t\tbFoundInDialogue = true;\n\t\t\tMakeChildTextNode(\n\t\t\t\tTreeDialogueNode,\n\t\t\t\tFText::FromString(FoundGUID),\n\t\t\t\tLOCTEXT(\"DialogueGUID\", \"Dialogue GUID\"),\n\t\t\t\tTEXT(\"Dialogue.GUID\")\n\t\t\t);\n\t\t}\n\t}\n\n\tif (bFoundInDialogue)\n\t{\n\t\tOutParentNode->AddChild(TreeDialogueNode);\n\t}\n\n\treturn bFoundInDialogue;\n}\n\nvoid FDialogueSearchManager::QueryAllDialogues(\n\tconst FDialogueSearchFilter& SearchFilter,\n\tTSharedPtr<FDialogueSearchResult>& OutParentNode\n)\n{\n\t// Iterate over all cached dialogues\n\tfor (auto& Elem : SearchMap)\n\t{\n\t\tconst FDialogueSearchData& SearchData = Elem.Value;\n\t\tif (SearchData.Dialogue.IsValid())\n\t\t{\n\t\t\tQuerySingleDialogue(SearchFilter, SearchData.Dialogue.Get(), OutParentNode);\n\t\t}\n\t}\n}\n\nFText FDialogueSearchManager::GetGlobalFindResultsTabLabel(int32 TabIdx)\n{\n\t// Count the number of opened global Dialogues\n\tint32 NumOpenGlobalFindResultsTabs = 0;\n\tfor (int32 i = GlobalFindResultsWidgets.Num() - 1; i >= 0; --i)\n\t{\n\t\tif (GlobalFindResultsWidgets[i].IsValid())\n\t\t{\n\t\t\tNumOpenGlobalFindResultsTabs++;\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// Invalid :O remove it\n\t\t\tGlobalFindResultsWidgets.RemoveAt(i);\n\t\t}\n\t}\n\n\tif (NumOpenGlobalFindResultsTabs > 1 || TabIdx > 0)\n\t{\n\t\t// Format TabIdx + 1\n\t\treturn FText::Format(\n\t\t\tLOCTEXT(\"GlobalFindResultsTabNameWithIndex\", \"Find in Dialogues {0}\"),\n\t\t\tFText::AsNumber(TabIdx + 1)\n\t\t);\n\t}\n\n\t// No Number\n\treturn LOCTEXT(\"GlobalFindResultsTabName\", \"Find in Dialogues\");\n}\n\nvoid FDialogueSearchManager::CloseGlobalFindResults(const TSharedRef<SFindInDialogues>& FindResults)\n{\n\tfor (TWeakPtr<SFindInDialogues> FindResultsPtr : GlobalFindResultsWidgets)\n\t{\n\t\t// Remove it from the opened find results\n\t\tif (FindResultsPtr.Pin() == FindResults)\n\t\t{\n\t\t\tGlobalFindResultsWidgets.Remove(FindResultsPtr);\n\t\t\tbreak;\n\t\t}\n\t}\n}\n\nTSharedRef<SDockTab> FDialogueSearchManager::SpawnGlobalFindResultsTab(const FSpawnTabArgs& SpawnTabArgs, int32 TabIdx)\n{\n\t// Label is Dynamic depending on the number of global tabs\n\tTAttribute<FText> Label = TAttribute<FText>::Create(\n\t\tTAttribute<FText>::FGetter::CreateRaw(this, &Self::GetGlobalFindResultsTabLabel, TabIdx)\n\t);\n\n\tTSharedRef<SDockTab> NewTab = SNew(SDockTab)\n\t\t.TabRole(ETabRole::NomadTab) // can be docked anywhere\n\t\t.Label(Label)\n\t\t.ToolTipText(LOCTEXT(\"GlobalFindResultsTabTooltip\", \"Search for a string in all Dialogue assets.\"));\n\n\tTSharedRef<SFindInDialogues> FindResults = SNew(SFindInDialogues)\n\t\t.bIsSearchWindow(false)\n\t\t.ContainingTab(NewTab);\n\n\tNewTab->SetContent(FindResults);\n\tGlobalFindResultsWidgets.Add(FindResults);\n\n\treturn NewTab;\n}\n\nTSharedPtr<SFindInDialogues> FDialogueSearchManager::OpenGlobalFindResultsTab()\n{\n\tTSet<FName> OpenGlobalTabIDs;\n\n\t// Check all opened global tabs\n\tfor (TWeakPtr<SFindInDialogues> FindResultsPtr : GlobalFindResultsWidgets)\n\t{\n\t\tTSharedPtr<SFindInDialogues> FindResults = FindResultsPtr.Pin();\n\t\tif (FindResults.IsValid())\n\t\t{\n\t\t\tOpenGlobalTabIDs.Add(FindResults->GetHostTabId());\n\t\t}\n\t}\n\n\t// Find the unopened tab, that we can open\n\tfor (int32 Idx = 0; Idx < NY_ARRAY_COUNT(GlobalFindResultsTabIDs); ++Idx)\n\t{\n\t\tconst FName GlobalTabId = GlobalFindResultsTabIDs[Idx];\n\t\tif (!OpenGlobalTabIDs.Contains(GlobalTabId))\n\t\t{\n\t\t\t// GlobalTabId is not opened, open it now\n\t\t\tTSharedRef<SDockTab> NewTab = FGlobalTabmanager::Get()->InvokeTab(GlobalTabId);\n\t\t\treturn StaticCastSharedRef<SFindInDialogues>(NewTab->GetContent());\n\t\t}\n\t}\n\n\treturn TSharedPtr<SFindInDialogues>();\n}\n\nTSharedPtr<SFindInDialogues> FDialogueSearchManager::GetGlobalFindResults()\n{\n\t// Find opened find tab\n\tTSharedPtr<SFindInDialogues> FindResultsToUse;\n\tfor (TWeakPtr<SFindInDialogues> FindResultsPtr : GlobalFindResultsWidgets)\n\t{\n\t\tTSharedPtr<SFindInDialogues> FindResults = FindResultsPtr.Pin();\n\t\tif (FindResults.IsValid())\n\t\t{\n\t\t\tFindResultsToUse = FindResults;\n\t\t\tbreak;\n\t\t}\n\t}\n\n\tif (FindResultsToUse.IsValid())\n\t{\n\t\t// found invoke it\n\t\tFGlobalTabmanager::Get()->InvokeTab(FindResultsToUse->GetHostTabId());\n\t}\n\telse\n\t{\n\t\t// not found, open a new tab.\n\t\tFindResultsToUse = OpenGlobalFindResultsTab();\n\t}\n\n\treturn FindResultsToUse;\n}\n\nvoid FDialogueSearchManager::EnableGlobalFindResults(TSharedPtr<FWorkspaceItem> ParentTabCategory)\n{\n\tconst TSharedRef<FGlobalTabmanager>& GlobalTabManager = FGlobalTabmanager::Get();\n\n\t// Register the spawners for all global Find Results tabs\n\tconst FSlateIcon GlobalFindResultsIcon(FDialogueStyle::GetStyleSetName(), FDialogueStyle::PROPERTY_DialogueSearch_TabIcon);\n\n\t// Add the menu item\n\tif (!ParentTabCategory.IsValid())\n\t{\n\t\tParentTabCategory = WorkspaceMenu::GetMenuStructure().GetToolsCategory();\n\t}\n\n\tGlobalFindResultsMenuItem = ParentTabCategory->AddGroup(\n\t\tLOCTEXT(\"WorkspaceMenu_GlobalFindResultsCategory\", \"Find in Dialogues\"),\n\t\tLOCTEXT(\"GlobalFindResultsMenuTooltipText\", \"Find references to conditions, events, text and variables in all Dialogues.\"),\n\t\tGlobalFindResultsIcon,\n\t\ttrue\n\t);\n\n\t// Register tab spawners\n\tfor (int32 TabIdx = 0; TabIdx < NY_ARRAY_COUNT(GlobalFindResultsTabIDs); TabIdx++)\n\t{\n\t\tconst FName TabID = GlobalFindResultsTabIDs[TabIdx];\n\n\t\t// Tab not registered yet, good.\n#if ENGINE_MINOR_VERSION >= 23\n\t\tif (!GlobalTabManager->HasTabSpawner(TabID))\n#else\n\t\tif (!GlobalTabManager->CanSpawnTab(TabID))\n#endif\n\t\t{\n\t\t\tconst FText DisplayName = FText::Format(\n\t\t\t\tLOCTEXT(\"GlobalFindResultsDisplayName\", \"Find in Dialogues {0}\"),\n\t\t\t\tFText::AsNumber(TabIdx + 1)\n\t\t\t);\n\t\t\tGlobalTabManager->RegisterNomadTabSpawner(\n\t\t\t\tTabID,\n\t\t\t\tFOnSpawnTab::CreateRaw(this, &Self::SpawnGlobalFindResultsTab, TabIdx))\n\t\t\t\t.SetDisplayName(DisplayName)\n\t\t\t\t.SetIcon(GlobalFindResultsIcon)\n\t\t\t\t.SetGroup(GlobalFindResultsMenuItem.ToSharedRef()\n\t\t\t);\n\t\t}\n\t}\n}\n\nvoid FDialogueSearchManager::DisableGlobalFindResults()\n{\n\tconst TSharedRef<FGlobalTabmanager>& GlobalTabManager = FGlobalTabmanager::Get();\n\n\t// Close all Global Find Results tabs when turning the feature off, since these may not get closed along with the Blueprint Editor contexts above.\n\tfor (TWeakPtr<SFindInDialogues> FindResultsPtr : GlobalFindResultsWidgets)\n\t{\n\t\tTSharedPtr<SFindInDialogues> FindResults = FindResultsPtr.Pin();\n\t\tif (FindResults.IsValid())\n\t\t{\n\t\t\tFindResults->CloseHostTab();\n\t\t}\n\t}\n\tGlobalFindResultsWidgets.Empty();\n\n\t// Unregister tab spawners\n\tfor (int32 TabIdx = 0; TabIdx < NY_ARRAY_COUNT(GlobalFindResultsTabIDs); TabIdx++)\n\t{\n\t\tconst FName TabID = GlobalFindResultsTabIDs[TabIdx];\n\n#if ENGINE_MINOR_VERSION >= 23\n\t\tif (!GlobalTabManager->HasTabSpawner(TabID))\n#else\n\t\tif (!GlobalTabManager->CanSpawnTab(TabID))\n#endif\n\t\t{\n\t\t\tGlobalTabManager->UnregisterNomadTabSpawner(TabID);\n\t\t}\n\t}\n\n\t// Remove the menu item\n\tif (GlobalFindResultsMenuItem.IsValid())\n\t{\n\t\tWorkspaceMenu::GetMenuStructure().GetToolsCategory()->RemoveItem(GlobalFindResultsMenuItem.ToSharedRef());\n\t\tGlobalFindResultsMenuItem.Reset();\n\t}\n}\n\nvoid FDialogueSearchManager::Initialize(TSharedPtr<FWorkspaceItem> ParentTabCategory)\n{\n\t// Must ensure we do not attempt to load the AssetRegistry Module while saving a package, however, if it is loaded already we can safely obtain it\n\tAssetRegistry = &FModuleManager::LoadModuleChecked<FAssetRegistryModule>(NAME_MODULE_AssetRegistry).Get();\n\n\tOnAssetAddedHandle = AssetRegistry->OnAssetAdded().AddRaw(this, &Self::HandleOnAssetAdded);\n\tOnAssetRemovedHandle = AssetRegistry->OnAssetRemoved().AddRaw(this, &Self::HandleOnAssetRemoved);\n\tOnAssetRenamedHandle = AssetRegistry->OnAssetRenamed().AddRaw(this, &Self::HandleOnAssetRenamed);\n\n\tif (AssetRegistry->IsLoadingAssets())\n\t{\n\t\tOnFilesLoadedHandle = AssetRegistry->OnFilesLoaded().AddRaw(this, &Self::HandleOnAssetRegistryFilesLoaded);\n\t}\n\telse\n\t{\n\t\t// Already loaded\n\t\tHandleOnAssetRegistryFilesLoaded();\n\t}\n\tOnAssetLoadedHandle = FCoreUObjectDelegates::OnAssetLoaded.AddRaw(this, &Self::HandleOnAssetLoaded);\n\n\t// Register global find results tabs\n\tEnableGlobalFindResults(ParentTabCategory);\n}\n\nvoid FDialogueSearchManager::UnInitialize()\n{\n\tif (AssetRegistry)\n\t{\n\t\tif (OnAssetAddedHandle.IsValid())\n\t\t{\n\t\t\tAssetRegistry->OnAssetAdded().Remove(OnAssetAddedHandle);\n\t\t\tOnAssetAddedHandle.Reset();\n\t\t}\n\t\tif (OnAssetRemovedHandle.IsValid())\n\t\t{\n\t\t\tAssetRegistry->OnAssetRemoved().Remove(OnAssetRemovedHandle);\n\t\t\tOnAssetRemovedHandle.Reset();\n\t\t}\n\t\tif (OnFilesLoadedHandle.IsValid())\n\t\t{\n\t\t\tAssetRegistry->OnFilesLoaded().Remove(OnFilesLoadedHandle);\n\t\t\tOnFilesLoadedHandle.Reset();\n\t\t}\n\t\tif (OnAssetRenamedHandle.IsValid())\n\t\t{\n\t\t\tAssetRegistry->OnAssetRenamed().Remove(OnAssetRenamedHandle);\n\t\t\tOnAssetRenamedHandle.Reset();\n\t\t}\n\t}\n\n\tif (OnAssetLoadedHandle.IsValid())\n\t{\n\t\tFCoreUObjectDelegates::OnAssetLoaded.Remove(OnAssetLoadedHandle);\n\t\tOnAssetLoadedHandle.Reset();\n\t}\n\n\t// Shut down the global find results tab feature.\n\tDisableGlobalFindResults();\n}\n\nvoid FDialogueSearchManager::BuildCache()\n{\n\t// Difference between this and the UDlgManager::GetAllDialoguesFromMemory is that this loads all Dialogues\n\t// even those that are not loaded into memory.\n\t// TODO this seems slow :(\n\t// AssetRegistryModule = &FModuleManager::LoadModuleChecked<FAssetRegistryModule>(TEXT(\"AssetRegistry\"));\n\t// FARFilter ClassFilter;\n\t// ClassFilter.bRecursiveClasses = true;\n\t// ClassFilter.ClassNames.Add(UDlgDialogue::StaticClass()->GetFName());\n\t// TArray<FAssetData> DialogueAssets;\n\t// AssetRegistryModule->Get().GetAssets(ClassFilter, DialogueAssets);\n\t// for (FAssetData& Asset : DialogueAssets)\n\t// {\n\t// \tHandleOnAssetAdded(Asset);\n\t// }\n\n\t// We already loaded all Dialogues into memory in the StartupModule.\n\tfor (UDlgDialogue* Dialogue : UDlgManager::GetAllDialoguesFromMemory())\n\t{\n\t\tFAssetData AssetData(Dialogue);\n\t\tHandleOnAssetAdded(AssetData);\n\t}\n}\n\nvoid FDialogueSearchManager::HandleOnAssetAdded(const FAssetData& InAssetData)\n{\n\t// Confirm that the Dialogue has not been added already, this can occur during duplication of Dialogues.\n\tFDialogueSearchData* SearchDataPtr = SearchMap.Find(InAssetData.ObjectPath);\n\tif (SearchDataPtr != nullptr)\n\t{\n\t\t// Already exists\n\t\treturn;\n\t}\n\n\t// Ignore other assets\n\tif (InAssetData.GetClass() && !InAssetData.GetClass()->IsChildOf<UDlgDialogue>())\n\t{\n\t\treturn;\n\t}\n\n\t// Load the Dialogue\n\tUDlgDialogue* Dialogue = Cast<UDlgDialogue>(InAssetData.GetAsset());\n\tif (!IsValid(Dialogue))\n\t{\n\t\treturn;\n\t}\n\n\t// Add to the loaded cached map\n\tFDialogueSearchData SearchData;\n\tSearchData.Dialogue = Dialogue;\n\tSearchMap.Add(InAssetData.ObjectPath, MoveTemp(SearchData));\n}\n\nvoid FDialogueSearchManager::HandleOnAssetRemoved(const FAssetData& InAssetData)\n{\n\t// TODO\n}\n\nvoid FDialogueSearchManager::HandleOnAssetRenamed(const FAssetData& InAssetData, const FString& InOldName)\n{\n\t// TODO\n}\n\nvoid FDialogueSearchManager::HandleOnAssetLoaded(UObject* InAsset)\n{\n\n}\n\nvoid FDialogueSearchManager::HandleOnAssetRegistryFilesLoaded()\n{\n\t// TODO Pause search if garbage collecting?\n\tFDialogueEditorUtilities::LoadAllDialoguesAndCheckGUIDs();\n\tif (AssetRegistry)\n\t{\n\t\t// Do an immediate load of the cache to catch any Blueprints that were discovered by the asset registry before we initialized.\n\t\tBuildCache();\n\t}\n}\n\n#undef LOCTEXT_NAMESPACE\n#undef NY_ARRAY_COUNT\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystemEditor/Private/DialogueSearch/DialogueSearchManager.h",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#pragma once\n\n#include \"CoreMinimal.h\"\n#include \"Widgets/Docking/SDockTab.h\"\n\n#include \"DialogueSearchResult.h\"\n\n// The maximum amount of global Dialogue Search windows opened.\nstatic constexpr int32 MAX_GLOBAL_DIALOGUE_SEARCH_RESULTS = 4;\n\nclass SFindInDialogues;\nclass FAssetRegistryModule;\n\nclass FWorkspaceItem;\nclass UDialogueGraphNode;\nclass UDialogueGraphNode_Edge;\nclass UEdGraphNode_Comment;\nclass IAssetRegistry;\nstruct FAssetData;\nstruct FDlgCondition;\nstruct FDlgEvent;\nstruct FDlgEdge;\nstruct FDlgTextArgument;\n\nstruct FDialogueSearchData\n{\n\t/** The Dialogue this search data points to, if available */\n\tTWeakObjectPtr<UDlgDialogue> Dialogue;\n};\n\n/** Singleton manager for handling all Dialogue searches */\nclass FDialogueSearchManager\n{\nprivate:\n\ttypedef FDialogueSearchManager Self;\n\npublic:\n\tstatic Self* Get();\n\n\tFDialogueSearchManager();\n\t~FDialogueSearchManager();\n\n\t/**\n\t * Searches for InSearchString in the InDlgTextArgument. Adds the result as a child in OutParentNode.\n\t * @return True if found anything matching the InSearchString\n\t */\n\tbool QueryDlgTextArgument(\n\t\tconst FDialogueSearchFilter& SearchFilter,\n\t\tconst FDlgTextArgument& InDlgTextArgument,\n\t\tconst TSharedPtr<FDialogueSearchResult>& OutParentNode,\n\t\tint32 ArgumentIndex = INDEX_NONE\n\t);\n\n\t/**\n\t * Searches for InSearchString in the InDlgCondition. Adds the result as a child in OutParentNode.\n\t * @return True if found anything matching the InSearchString\n\t */\n\tbool QueryDlgCondition(\n\t\tconst FDialogueSearchFilter& SearchFilter,\n\t\tconst FDlgCondition& InDlgCondition,\n\t\tconst TSharedPtr<FDialogueSearchResult>& OutParentNode,\n\t\tint32 ConditionIndex = INDEX_NONE,\n\t\tFName ConditionMemberName = TEXT(\"Condition\")\n\t);\n\n\t/**\n\t * Searches for InSearchString in the InDlgEvent. Adds the result as a child in OutParentNode.\n\t * @return True if found anything matching the InSearchString\n\t */\n\tbool QueryDlgEvent(\n\t\tconst FDialogueSearchFilter& SearchFilter,\n\t\tconst FDlgEvent& InDlgEvent,\n\t\tconst TSharedPtr<FDialogueSearchResult>& OutParentNode,\n\t\tint32 EventIndex = INDEX_NONE,\n\t\tFName EventMemberName = TEXT(\"Event\")\n\t);\n\n\t/**\n\t * Searches for InSearchString in the InDlgEdge. Adds the result as a child in OutParentNode.\n\t * @return True if found anything matching the InSearchString\n\t */\n\tbool QueryDlgEdge(\n\t\tconst FDialogueSearchFilter& SearchFilter,\n\t\tconst FDlgEdge& InDlgEdge,\n\t\tconst TSharedPtr<FDialogueSearchResult>& OutParentNode\n\t);\n\n\t/**\n\t * Searches for InSearchString in the InGraphNode. Adds the result as a child in OutParentNode.\n\t * @return True if found anything matching the InSearchString\n\t */\n\tbool QueryGraphNode(\n\t\tconst FDialogueSearchFilter& SearchFilter,\n\t\tconst UDialogueGraphNode* InGraphNode,\n\t\tconst TSharedPtr<FDialogueSearchResult>& OutParentNode\n\t);\n\n\t/**\n\t * Searches for InSearchString in the InEdgeNode. Adds the result as a child in OutParentNode.\n\t * @return True if found anything matching the InSearchString\n\t */\n\tbool QueryEdgeNode(\n\t\tconst FDialogueSearchFilter& SearchFilter,\n\t\tconst UDialogueGraphNode_Edge* InEdgeNode,\n\t\tconst TSharedPtr<FDialogueSearchResult>& OutParentNode\n\t);\n\n\t/**\n\t * Searches for InSearchString in the Comment Node. Adds the result as a child in OutParentNode.\n\t * @return True if found anything matching the InSearchString\n\t */\n\tbool QueryCommentNode(\n\t\tconst FDialogueSearchFilter& SearchFilter,\n\t\tconst UEdGraphNode_Comment* InCommentNode,\n\t\tconst TSharedPtr<FDialogueSearchResult>& OutParentNode\n\t);\n\n\t/**\n\t * Searches for InSearchString in the InDialogue. Adds the result as a child of OutParentNode.\n\t * @return True if found anything matching the InSearchString\n\t */\n\tbool QuerySingleDialogue(\n\t\tconst FDialogueSearchFilter& SearchFilter,\n\t\tconst UDlgDialogue* InDialogue,\n\t\tTSharedPtr<FDialogueSearchResult>& OutParentNode\n\t);\n\n\t// Searches for InSearchString in all Dialogues. Adds the result as children of OutParentNode.\n\tvoid QueryAllDialogues(const FDialogueSearchFilter& SearchFilter, TSharedPtr<FDialogueSearchResult>& OutParentNode);\n\n\t// Determines the global find results tab label\n\tFText GetGlobalFindResultsTabLabel(int32 TabIdx);\n\n\t// Close One of the global find results.\n\tvoid CloseGlobalFindResults(const TSharedRef<SFindInDialogues>& FindResults);\n\n\t// Find or create the global find results widget\n\tTSharedPtr<SFindInDialogues> GetGlobalFindResults();\n\n\t// Enables the global find results tab feature in the Windows Menu.\n\tvoid EnableGlobalFindResults(TSharedPtr<FWorkspaceItem> ParentTabCategory = nullptr);\n\n\t// Disables the global find results tab feature in the Windows Menu.\n\tvoid DisableGlobalFindResults();\n\n\t// Initializes the manager. Should only be called once in the FDlgSystemEditorModule::StartupModule()\n\tvoid Initialize(TSharedPtr<FWorkspaceItem> ParentTabCategory = nullptr);\n\n\t// Uninitializes the manager. Should only be called once in the FDlgSystemEditorModule::ShutdownModule()\n\tvoid UnInitialize();\n\nprivate:\n\t// Helper method to make a Text Node and add it as a child to ParentNode\n\tTSharedPtr<FDialogueSearchResult> MakeChildTextNode(\n\t\tconst TSharedPtr<FDialogueSearchResult>& ParentNode,\n\t\tconst FText& DisplayName, const FText& Category,\n\t\tconst FString& CommentString\n\t)\n\t{\n\t\tTSharedPtr<FDialogueSearchResult> TextNode = MakeShared<FDialogueSearchResult>(DisplayName, ParentNode);\n\t\tTextNode->SetCategory(Category);\n\t\tif (!CommentString.IsEmpty())\n\t\t{\n\t\t\tTextNode->SetCommentString(CommentString);\n\t\t}\n\t\tParentNode->AddChild(TextNode);\n\t\treturn TextNode;\n\t}\n\n\tbool SearchForTextLocalizationData(\n\t\tconst TSharedPtr<FDialogueSearchResult>& ParentNode,\n\t\tconst FString& SearchString,\n\t\tconst FText& Text,\n\t\tconst FText& NamespaceCategory,\n\t\tconst FString& NamespaceCommentString,\n\t\tconst FText& KeyCategory,\n\t\tconst FString& KeyCommentString\n\t)\n\t{\n\t\tstatic const FString DefaultValue = TEXT(\"\");\n\t\tbool bContainsSearchString = false;\n\n\t\tconst FString CurrentFullNamespace = FTextInspector::GetNamespace(Text).Get(DefaultValue);\n\t\tconst FString CurrentKey = FTextInspector::GetKey(Text).Get(DefaultValue);\n\t\tif (CurrentFullNamespace.Contains(SearchString))\n\t\t{\n\t\t\tbContainsSearchString = true;\n\t\t\tMakeChildTextNode(\n\t\t\t\tParentNode,\n\t\t\t\tFText::AsCultureInvariant(CurrentFullNamespace),\n\t\t\t\tNamespaceCategory,\n\t\t\t\tNamespaceCommentString\n\t\t\t);\n\t\t}\n\t\tif (CurrentKey.Contains(SearchString))\n\t\t{\n\t\t\tbContainsSearchString = true;\n\t\t\tMakeChildTextNode(\n\t\t\t\tParentNode,\n\t\t\t\tFText::AsCultureInvariant(CurrentKey),\n\t\t\t\tKeyCategory,\n\t\t\t\tKeyCommentString\n\t\t\t);\n\t\t}\n\n\t\treturn bContainsSearchString;\n\t}\n\n\t// Handler for a request to spawn a new global find results tab\n\tTSharedRef<SDockTab> SpawnGlobalFindResultsTab(const FSpawnTabArgs& SpawnTabArgs, int32 TabIdx);\n\n\t// Creates and opens a new global find results tab. The next one in the available list.\n\tTSharedPtr<SFindInDialogues> OpenGlobalFindResultsTab();\n\n\t// Builds the cache from all available Dialogues assets that the asset registry has discovered at the time of this function. Occurs on startup.\n\tvoid BuildCache();\n\n\t// Callback hook from the Asset Registry when an asset is added\n\tvoid HandleOnAssetAdded(const FAssetData& InAssetData);\n\n\t// Callback hook from the Asset Registry, marks the asset for deletion from the cache\n\tvoid HandleOnAssetRemoved(const FAssetData& InAssetData);\n\n\t// Callback hook from the Asset Registry, marks the asset for deletion from the cache\n\tvoid HandleOnAssetRenamed(const FAssetData& InAssetData, const FString& InOldName);\n\n\t// Callback hook from the Asset Registry when an asset is loaded\n\tvoid HandleOnAssetLoaded(UObject* InAsset);\n\n\t// Callback when the Asset Registry loads all its assets\n\tvoid HandleOnAssetRegistryFilesLoaded();\n\nprivate:\n\tstatic Self* Instance;\n\n\t// Maps the Dialogue path => SearchData.\n\tTMap<FName, FDialogueSearchData> SearchMap;\n\n\t// Because we are unable to query for the module on another thread, cache it for use later\n\tIAssetRegistry* AssetRegistry = nullptr;\n\n\t// The tab identifier/instance name for global find results\n\tFName GlobalFindResultsTabIDs[MAX_GLOBAL_DIALOGUE_SEARCH_RESULTS];\n\n\t// Array of open global find results widgets\n\tTArray<TWeakPtr<SFindInDialogues>> GlobalFindResultsWidgets;\n\n\t// Global Find Results workspace menu item\n\tTSharedPtr<FWorkspaceItem> GlobalFindResultsMenuItem;\n\n\t// Handlers\n\tFDelegateHandle OnAssetAddedHandle;\n\tFDelegateHandle OnAssetRemovedHandle;\n\tFDelegateHandle OnAssetRenamedHandle;\n\tFDelegateHandle OnFilesLoadedHandle;\n\tFDelegateHandle OnAssetLoadedHandle;\n};\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystemEditor/Private/DialogueSearch/DialogueSearchResult.cpp",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#include \"DialogueSearchResult.h\"\n\n#include \"Widgets/Images/SImage.h\"\n#include \"Toolkits/AssetEditorManager.h\"\n\n#include \"DialogueEditorUtilities.h\"\n#include \"DialogueEditor/Nodes/DialogueGraphNode.h\"\n#include \"DialogueEditor/Nodes/DialogueGraphNode_Edge.h\"\n#include \"DialogueStyle.h\"\n\n#define LOCTEXT_NAMESPACE \"DialogueSearchResult\"\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// FDialogueSearchResult\nFDialogueSearchResult::FDialogueSearchResult(const FText& InDisplayText, const TSharedPtr<Self>& InParent)\n\t: Super(InDisplayText, InParent)\n{\n}\n\nTSharedRef<SWidget>\tFDialogueSearchResult::CreateIcon() const\n{\n\tconst FLinearColor IconColor = FLinearColor::White;\n\tconst FSlateBrush* Brush = nullptr;\n\n\treturn SNew(SImage)\n\t\t\t.Image(Brush)\n\t\t\t.ColorAndOpacity(IconColor)\n\t\t\t.ToolTipText(GetCategory());\n}\n\nTWeakObjectPtr<const UDlgDialogue> FDialogueSearchResult::GetParentDialogue() const\n{\n\tif (Parent.IsValid())\n\t{\n\t\treturn Parent.Pin()->GetParentDialogue();\n\t}\n\n\treturn nullptr;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// FDialogueSearchResult_RootNode\nFDialogueSearchResult_RootNode::FDialogueSearchResult_RootNode() :\n\tSuper(FText::FromString(TEXT(\"Display Text should not be visible\")), nullptr)\n{\n\tCategory = FText::FromString(TEXT(\"ROOT NODE SHOULD NOT BE VISIBLE\"));\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// FDialogueSearchResult_DialogueNode\nFDialogueSearchResult_DialogueNode::FDialogueSearchResult_DialogueNode(const FText& InDisplayText, const TSharedPtr<FDialogueSearchResult>& InParent) :\n\tSuper(InDisplayText, InParent)\n{\n\tCategory = LOCTEXT(\"FDialogueSearchResult_DialogueNodeCategory\", \"Dialogue\");\n}\n\nFReply FDialogueSearchResult_DialogueNode::OnClick()\n{\n\tif (Dialogue.IsValid())\n\t{\n\t\treturn FDialogueEditorUtilities::OpenEditorForAsset(Dialogue.Get()) ? FReply::Handled() : FReply::Unhandled();\n\t}\n\n\treturn FReply::Unhandled();\n}\n\nTWeakObjectPtr<const UDlgDialogue> FDialogueSearchResult_DialogueNode::GetParentDialogue() const\n{\n\t// Get the Dialogue from this.\n\tif (Dialogue.IsValid())\n\t{\n\t\treturn Dialogue;\n\t}\n\n\treturn Super::GetParentDialogue();\n}\n\nTSharedRef<SWidget>\tFDialogueSearchResult_DialogueNode::CreateIcon() const\n{\n\tconst FSlateBrush* Brush = FDialogueStyle::Get()->GetBrush(FDialogueStyle::PROPERTY_DlgDialogueClassIcon);\n\n\treturn SNew(SImage)\n\t\t\t.Image(Brush)\n\t\t\t.ColorAndOpacity(FSlateColor::UseForeground())\n\t\t\t.ToolTipText(GetCategory());\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// FDialogueSearchResult_GraphNode\nFDialogueSearchResult_GraphNode::FDialogueSearchResult_GraphNode(const FText& InDisplayText, const TSharedPtr<FDialogueSearchResult>& InParent) :\n\tSuper(InDisplayText, InParent)\n{\n}\n\nFReply FDialogueSearchResult_GraphNode::OnClick()\n{\n\tif (GraphNode.IsValid())\n\t{\n\t\treturn FDialogueEditorUtilities::OpenEditorAndJumpToGraphNode(GraphNode.Get()) ? FReply::Handled() : FReply::Unhandled();\n\t}\n\n\treturn FReply::Unhandled();\n}\n\nTSharedRef<SWidget> FDialogueSearchResult_GraphNode::CreateIcon() const\n{\n\tif (GraphNode.IsValid())\n\t{\n\t\tFLinearColor Color;\n\t\tconst FSlateIcon Icon = GraphNode.Get()->GetIconAndTint(Color);\n\t\treturn SNew(SImage)\n\t\t\t\t.Image(Icon.GetOptionalIcon())\n\t\t\t\t.ColorAndOpacity(Color)\n\t\t\t\t.ToolTipText(GetCategory());\n\t}\n\n\treturn Super::CreateIcon();\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// FDialogueSearchResult_EdgeNode\nFDialogueSearchResult_EdgeNode::FDialogueSearchResult_EdgeNode(const FText& InDisplayText, const TSharedPtr<FDialogueSearchResult>& InParent) :\n\tSuper(InDisplayText, InParent)\n{\n}\n\nFReply FDialogueSearchResult_EdgeNode::OnClick()\n{\n\tif (EdgeNode.IsValid())\n\t{\n\t\treturn FDialogueEditorUtilities::OpenEditorAndJumpToGraphNode(EdgeNode.Get()) ? FReply::Handled() : FReply::Unhandled();\n\t}\n\n\treturn FReply::Unhandled();\n}\n\nTSharedRef<SWidget>\tFDialogueSearchResult_EdgeNode::CreateIcon() const\n{\n\tif (EdgeNode.IsValid())\n\t{\n\t\tFLinearColor Color;\n\t\tconst FSlateIcon Icon = EdgeNode.Get()->GetIconAndTint(Color);\n\t\treturn SNew(SImage)\n\t\t\t\t.Image(Icon.GetOptionalIcon())\n\t\t\t\t.ColorAndOpacity(Color)\n\t\t\t\t.ToolTipText(GetCategory());\n\t}\n\n\treturn Super::CreateIcon();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// FDialogueSearchResult_CommentNode\nFDialogueSearchResult_CommentNode::FDialogueSearchResult_CommentNode(const FText& InDisplayText, const TSharedPtr<FDialogueSearchResult>& InParent) :\n\tSuper(InDisplayText, InParent)\n{\n}\n\nFReply FDialogueSearchResult_CommentNode::OnClick()\n{\n\tif (CommentNode.IsValid())\n\t{\n\t\treturn FDialogueEditorUtilities::OpenEditorAndJumpToGraphNode(CommentNode.Get()) ? FReply::Handled() : FReply::Unhandled();\n\t}\n\n\treturn FReply::Unhandled();\n}\n\nTSharedRef<SWidget>\tFDialogueSearchResult_CommentNode::CreateIcon() const\n{\n\tif (CommentNode.IsValid())\n\t{\n\t\tconst FSlateIcon Icon = FSlateIcon(FDialogueStyle::GetStyleSetName(), FDialogueStyle::PROPERTY_CommentBubbleOn);\n\t\treturn SNew(SImage)\n\t\t\t.Image(Icon.GetIcon())\n\t\t\t.ColorAndOpacity(FColorList::White)\n\t\t\t.ToolTipText(GetCategory());\n\t}\n\n\treturn Super::CreateIcon();\n}\n\n#undef LOCTEXT_NAMESPACE\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystemEditor/Private/DialogueSearch/DialogueSearchResult.h",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#pragma once\n\n#include \"CoreMinimal.h\"\n#include \"Input/Reply.h\"\n\n#include \"DlgDialogue.h\"\n#include \"TreeViewHelpers/DlgTreeViewNode.h\"\n\nclass FDialogueSearchResult;\nclass UDialogueGraphNode;\nclass UDialogueGraphNode_Edge;\nclass UEdGraphNode_Comment;\n\n// Filter used when searching for Dialogue Data\nstruct FDialogueSearchFilter\n{\npublic:\n\tbool IsEmptyFilter() const\n\t{\n\t\treturn SearchString.IsEmpty()\n\t\t\t&& bIncludeIndices == false\n\t\t\t&& bIncludeDialogueGUID == false\n\t\t\t&& bIncludeNodeGUID == false\n\t\t\t&& bIncludeComments == true\n\t\t\t&& bIncludeNumericalTypes == false\n\t\t\t&& bIncludeCustomObjectNames == false;\n\t}\n\npublic:\n\t// Search term that the search items must match\n\tFString SearchString;\n\n\t// Include node/edge indices in search results?\n\tbool bIncludeIndices = false;\n\n\t// Include the Dialogue GUID in search results\n\tbool bIncludeDialogueGUID = false;\n\n\t// Include the Node GUID in search results\n\tbool bIncludeNodeGUID = false;\n\n\t// Include node comments in search results?\n\tbool bIncludeComments = true;\n\n\t// Include numerical data in search results like (int32, floats)?\n\tbool bIncludeNumericalTypes = false;\n\n\t// Include the Text localization data in search results (namespace, key)\n\tbool bIncludeTextLocalizationData = false;\n\n\t// Include the Custom Text Argument/Condition/Event/Node Data object names\n\tbool bIncludeCustomObjectNames = true;\n};\n\n// Base class that matched the search results. When used by itself it is a simple text node.\nclass FDialogueSearchResult : public FDlgTreeViewNode<FDialogueSearchResult>\n{\n\ttypedef FDialogueSearchResult Self;\n\ttypedef FDlgTreeViewNode Super;\n\npublic:\n\tFDialogueSearchResult(const FText& InDisplayText, const TSharedPtr<Self>& InParent);\n\n\t// Create an icon to represent the result\n\tvirtual TSharedRef<SWidget>\tCreateIcon() const;\n\n\t// Gets the Dialogue housing all these search results. Aka the Dialogue this search result belongs to.\n\tvirtual TWeakObjectPtr<const UDlgDialogue> GetParentDialogue() const;\n\n\t// Category:\n\tFText GetCategory() const { return Category; }\n\tvoid SetCategory(const FText& InCategory) { Category = InCategory; }\n\n\t// CommentString\n\tFString GetCommentString() const { return CommentString; }\n\tvoid SetCommentString(const FString& InCommentString) { CommentString = InCommentString; }\n\nprotected:\n\t// The category of this node.\n\tFText Category;\n\n\t// Display text for comment information\n\tFString CommentString;\n};\n\n\n// Root Node, should not be displayed.\nclass FDialogueSearchResult_RootNode : public FDialogueSearchResult\n{\n\ttypedef FDialogueSearchResult Super;\npublic:\n\tFDialogueSearchResult_RootNode();\n};\n\n\n// Tree Node search results that represents the Dialogue.\nclass FDialogueSearchResult_DialogueNode : public FDialogueSearchResult\n{\n\ttypedef FDialogueSearchResult Super;\npublic:\n\tFDialogueSearchResult_DialogueNode(const FText& InDisplayText, const TSharedPtr<FDialogueSearchResult>& InParent);\n\n\tFReply OnClick() override;\n\tTWeakObjectPtr<const UDlgDialogue> GetParentDialogue() const override;\n\tTSharedRef<SWidget>\tCreateIcon() const override;\n\n\t// Dialogue:\n\tvoid SetDialogue(TWeakObjectPtr<const UDlgDialogue> InDialogue) { Dialogue = InDialogue; }\n\nprotected:\n\t// The Dialogue this represents.\n\tTWeakObjectPtr<const UDlgDialogue> Dialogue;\n};\n\n\n// Tree Node result that represents the GraphNode\nclass FDialogueSearchResult_GraphNode : public FDialogueSearchResult\n{\n\ttypedef FDialogueSearchResult Super;\npublic:\n\tFDialogueSearchResult_GraphNode(const FText& InDisplayText, const TSharedPtr<FDialogueSearchResult>& InParent);\n\n\tFReply OnClick() override;\n\tTSharedRef<SWidget> CreateIcon() const override;\n\n\t// GraphNode:\n\tvoid SetGraphNode(TWeakObjectPtr<const UDialogueGraphNode> InGraphNode) { GraphNode = InGraphNode; }\n\nprotected:\n\t// The GraphNode this represents.\n\tTWeakObjectPtr<const UDialogueGraphNode> GraphNode;\n};\n\n\n// Tree Node result that represents the EdgeNode\nclass FDialogueSearchResult_EdgeNode : public FDialogueSearchResult\n{\n\ttypedef FDialogueSearchResult Super;\npublic:\n\tFDialogueSearchResult_EdgeNode(const FText& InDisplayText, const TSharedPtr<FDialogueSearchResult>& InParent);\n\n\tFReply OnClick() override;\n\tTSharedRef<SWidget> CreateIcon() const override;\n\n\t// EdgeNode:\n\tvoid SetEdgeNode(TWeakObjectPtr<const UDialogueGraphNode_Edge> InEdgeNode) { EdgeNode = InEdgeNode; }\n\nprotected:\n\t// The EdgeNode this represents.\n\tTWeakObjectPtr<const UDialogueGraphNode_Edge> EdgeNode;\n};\n\n// Tree Node result that represents the CommentNode\nclass FDialogueSearchResult_CommentNode : public FDialogueSearchResult\n{\n\ttypedef FDialogueSearchResult Super;\npublic:\n\tFDialogueSearchResult_CommentNode(const FText& InDisplayText, const TSharedPtr<FDialogueSearchResult>& InParent);\n\n\tFReply OnClick() override;\n\tTSharedRef<SWidget> CreateIcon() const override;\n\n\t// CommentNode:\n\tvoid SetCommentNode(TWeakObjectPtr<const UEdGraphNode_Comment> InCommentNode) { CommentNode = InCommentNode; }\n\nprotected:\n\t// The EdgeNode this represents.\n\tTWeakObjectPtr<const UEdGraphNode_Comment> CommentNode;\n};\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystemEditor/Private/DialogueSearch/DialogueSearchUtilities.cpp",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#include \"DialogueSearchUtilities.h\"\n\n\n#include \"DlgHelper.h\"\n#include \"DialogueEditor/Graph/DialogueGraph.h\"\n#include \"DialogueEditor/Nodes/DialogueGraphNode.h\"\n#include \"DialogueEditor/Nodes/DialogueGraphNode_Edge.h\"\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// FDialogueSearchUtilities\nTSharedPtr<FDialogueSearchFoundResult> FDialogueSearchUtilities::GetGraphNodesForEventEventName(\n\tFName EventName,\n\tconst UDlgDialogue* Dialogue\n)\n{\n\tTSharedPtr<FDialogueSearchFoundResult> FoundResult = FDialogueSearchFoundResult::Make();\n\n\tconst UDialogueGraph* Graph = CastChecked<UDialogueGraph>(Dialogue->GetGraph());\n\tfor (const UDialogueGraphNode* GraphNode : Graph->GetAllDialogueGraphNodes())\n\t{\n\t\t// Enter events\n\t\tif (IsEventInArray(EventName, EDlgEventType::Event, GraphNode->GetDialogueNode().GetNodeEnterEvents()))\n\t\t{\n\t\t\tFoundResult->GraphNodes.Add(GraphNode);\n\t\t}\n\t}\n\n\treturn FoundResult;\n}\n\nTSharedPtr<FDialogueSearchFoundResult> FDialogueSearchUtilities::GetGraphNodesForCustomEvent(\n\tconst UClass* EventClass,\n\tconst UDlgDialogue* Dialogue\n)\n{\n\tTSharedPtr<FDialogueSearchFoundResult> FoundResult = FDialogueSearchFoundResult::Make();\n\n\tconst UDialogueGraph* Graph = CastChecked<UDialogueGraph>(Dialogue->GetGraph());\n\tfor (const UDialogueGraphNode* GraphNode : Graph->GetAllDialogueGraphNodes())\n\t{\n\t\t// Enter events\n\t\tif (IsCustomEventInArray(EventClass, GraphNode->GetDialogueNode().GetNodeEnterEvents()))\n\t\t{\n\t\t\tFoundResult->GraphNodes.Add(GraphNode);\n\t\t}\n\t}\n\n\treturn FoundResult;\n}\n\nTSharedPtr<FDialogueSearchFoundResult> FDialogueSearchUtilities::GetGraphNodesForConditionEventCallName(\n\tFName ConditionName,\n\tconst UDlgDialogue* Dialogue\n)\n{\n\tTSharedPtr<FDialogueSearchFoundResult> FoundResult = FDialogueSearchFoundResult::Make();\n\n\tconst UDialogueGraph* Graph = CastChecked<UDialogueGraph>(Dialogue->GetGraph());\n\tfor (const UDialogueGraphNode_Base* GraphNodeBase : Graph->GetAllBaseDialogueGraphNodes())\n\t{\n\t\tif (const UDialogueGraphNode* GraphNode = Cast<UDialogueGraphNode>(GraphNodeBase))\n\t\t{\n\t\t\t// Node\n\t\t\t// Node Enter conditions\n\t\t\tif (IsConditionInArray(ConditionName, EDlgConditionType::EventCall,\n\t\t\t\t\t\t\t\t   GraphNode->GetDialogueNode().GetNodeEnterConditions()))\n\t\t\t{\n\t\t\t\tFoundResult->GraphNodes.Add(GraphNode);\n\t\t\t}\n\n\t\t\t// The children are handled by the edges, below\n\t\t}\n\t\telse if (const UDialogueGraphNode_Edge* EdgeNode = Cast<UDialogueGraphNode_Edge>(GraphNodeBase))\n\t\t{\n\t\t\t// Edge\n\t\t\tif (IsConditionInArray(ConditionName, EDlgConditionType::EventCall,\n\t\t\t\t\t\t\t\t   EdgeNode->GetDialogueEdge().Conditions))\n\t\t\t{\n\t\t\t\tFoundResult->EdgeNodes.Add(EdgeNode);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn FoundResult;\n}\n\nTSharedPtr<FDialogueSearchFoundResult> FDialogueSearchUtilities::GetGraphNodesForVariablesOfNameAndType(\n\tFName VariableName,\n\tconst UDlgDialogue* Dialogue,\n\tEDlgEventType EventType,\n\tEDlgConditionType ConditionType\n)\n{\n\tTSharedPtr<FDialogueSearchFoundResult> FoundResult = FDialogueSearchFoundResult::Make();\n\n\tconst UDialogueGraph* Graph = CastChecked<UDialogueGraph>(Dialogue->GetGraph());\n\tfor (const UDialogueGraphNode_Base* GraphNodeBase : Graph->GetAllBaseDialogueGraphNodes())\n\t{\n\t\tif (const UDialogueGraphNode* GraphNode = Cast<UDialogueGraphNode>(GraphNodeBase))\n\t\t{\n\t\t\t// The root node does not have searchable info\n\t\t\tif (GraphNode->IsRootNode())\n\t\t\t{\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Node\n\t\t\tconst UDlgNode& Node = GraphNode->GetDialogueNode();\n\n\t\t\t// Enter events\n\t\t\tif (IsEventInArray(VariableName, EventType, Node.GetNodeEnterEvents()))\n\t\t\t{\n\t\t\t\tFoundResult->GraphNodes.Add(GraphNode);\n\t\t\t}\n\n\t\t\t// Enter conditions\n\t\t\tif (IsConditionInArray(VariableName, ConditionType, Node.GetNodeEnterConditions()))\n\t\t\t{\n\t\t\t\tFoundResult->GraphNodes.Add(GraphNode);\n\t\t\t}\n\n\t\t\t// The children are handled by the edges, below\n\t\t}\n\t\telse if (const UDialogueGraphNode_Edge* EdgeNode = Cast<UDialogueGraphNode_Edge>(GraphNodeBase))\n\t\t{\n\t\t\t// Edge\n\t\t\tif (IsConditionInArray(VariableName, ConditionType,\n\t\t\t\t\t\t\t\t   EdgeNode->GetDialogueEdge().Conditions))\n\t\t\t{\n\t\t\t\tFoundResult->EdgeNodes.Add(EdgeNode);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn FoundResult;\n}\n\n\nvoid FDialogueSearchUtilities::GetGraphNodesForTextArgumentVariable(\n\tFName VariableName,\n\tconst UDlgDialogue* Dialogue,\n\tEDlgTextArgumentType ArgumentType,\n\tTSharedPtr<FDialogueSearchFoundResult>& FoundResult\n)\n{\n\tconst UDialogueGraph* Graph = CastChecked<UDialogueGraph>(Dialogue->GetGraph());\n\tfor (const UDialogueGraphNode_Base* GraphNodeBase : Graph->GetAllBaseDialogueGraphNodes())\n\t{\n\t\tif (const UDialogueGraphNode* GraphNode = Cast<UDialogueGraphNode>(GraphNodeBase))\n\t\t{\n\t\t\t// The root node does not have searchable info\n\t\t\tif (GraphNode->IsRootNode())\n\t\t\t{\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Node\n\t\t\tconst UDlgNode& Node = GraphNode->GetDialogueNode();\n\t\t\tif (IsTextArgumentInArray(VariableName, ArgumentType, Node.GetTextArguments()))\n\t\t\t{\n\t\t\t\tFoundResult->GraphNodes.Add(GraphNode);\n\t\t\t}\n\t\t}\n\t\telse if (const UDialogueGraphNode_Edge* EdgeNode = Cast<UDialogueGraphNode_Edge>(GraphNodeBase))\n\t\t{\n\t\t\t// Edge\n\t\t\tif (IsTextArgumentInArray(VariableName, ArgumentType, EdgeNode->GetDialogueEdge().GetTextArguments()))\n\t\t\t{\n\t\t\t\tFoundResult->EdgeNodes.Add(EdgeNode);\n\t\t\t}\n\t\t}\n\t}\n}\n\nbool FDialogueSearchUtilities::DoesGUIDContainString(const FGuid& GUID, const FString& SearchString, FString& OutGUIDString)\n{\n\tconst FString GUIDToSearchFor = SearchString.TrimStartAndEnd();\n\n\t// Test every possible format\n\tconst TArray<FString> GUIDStrings = {\n\t\tGUID.ToString(EGuidFormats::Digits),\n        GUID.ToString(EGuidFormats::DigitsWithHyphens),\n        GUID.ToString(EGuidFormats::DigitsWithHyphensInBraces),\n        GUID.ToString(EGuidFormats::DigitsWithHyphensInParentheses),\n        GUID.ToString(EGuidFormats::HexValuesInBraces),\n        GUID.ToString(EGuidFormats::UniqueObjectGuid)\n    };\n\tfor (const FString& GUIDString : GUIDStrings)\n\t{\n\t\tif (GUIDString.Contains(GUIDToSearchFor))\n\t\t{\n\t\t\tOutGUIDString = GUIDString;\n\t\t\treturn true;\n\t\t}\n\t}\n\n\treturn false;\n}\n\nbool FDialogueSearchUtilities::DoesObjectClassNameContainString(const UObject* Object, const FString& SearchString, FString& OutNameString)\n{\n\tif (!Object)\n\t{\n\t\treturn false;\n\t}\n\n\tconst FString Name = FDlgHelper::CleanObjectName(Object->GetClass()->GetName());\n\tif (Name.Contains(SearchString))\n\t{\n\t\tOutNameString = Name;\n\t\treturn true;\n\t}\n\n\treturn false;\n}\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystemEditor/Private/DialogueSearch/DialogueSearchUtilities.h",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#pragma once\n\n#include \"CoreMinimal.h\"\n\n#include \"DlgEvent.h\"\n#include \"DlgCondition.h\"\n#include \"DlgTextArgument.h\"\n\n//////////////////////////////////////////////////////////////////////////\n// FDialogueESearchUtilities\n\nclass UDlgDialogue;\nclass UDialogueGraphNode;\nstruct FDlgNode;\nclass UEdGraph;\nclass UDialogueGraphNode_Base;\nclass UDialogueGraphNode_Edge;\n\n// Represents the found result of the search functions.\nstruct FDialogueSearchFoundResult\n{\nprivate:\n\ttypedef FDialogueSearchFoundResult Self;\n\npublic:\n\tstatic TSharedPtr<FDialogueSearchFoundResult> Make() { return MakeShared<Self>(); }\n\npublic:\n\t// Nodes that satisfy the search result.\n\tTArray<TWeakObjectPtr<const UDialogueGraphNode>> GraphNodes;\n\n\t// Edges that satisfy the search result.\n\tTArray<TWeakObjectPtr<const UDialogueGraphNode_Edge>> EdgeNodes;\n};\n\n/**\n * Utilities for search.\n * @brief The FDialogueSearchUtilities class\n */\nclass FDialogueSearchUtilities\n{\npublic:\n\n\t// Gets all the graph nodes that contain the specified EventName (of the EventType Event)\n\tstatic TSharedPtr<FDialogueSearchFoundResult> GetGraphNodesForEventEventName(FName EventName, const UDlgDialogue* Dialogue);\n\n\t// Gets all the graph nodes that contain the custom Event EventClass\n\tstatic TSharedPtr<FDialogueSearchFoundResult> GetGraphNodesForCustomEvent(const UClass* EventClass, const UDlgDialogue* Dialogue);\n\n\n\t/**\n\t * Gets all the graph nodes that contain the specified ConditionName (of the ConditionType EventCall)\n\t * This contains both graph nodes and edges.\n\t */\n\tstatic TSharedPtr<FDialogueSearchFoundResult> GetGraphNodesForConditionEventCallName(FName ConditionName, const UDlgDialogue* Dialogue);\n\n\t/**\n\t * Gets all the graph nodes that contain the specified IntVariableName basic type.\n\t * This contains both graph nodes and edges.\n\t */\n\tstatic TSharedPtr<FDialogueSearchFoundResult> GetGraphNodesForIntVariableName(FName IntVariableName, const UDlgDialogue* Dialogue)\n\t{\n\t\tTSharedPtr<FDialogueSearchFoundResult> FoundResult = GetGraphNodesForVariablesOfNameAndType(\n\t\t\tIntVariableName,\n\t\t\tDialogue,\n\t\t\tEDlgEventType::ModifyInt,\n\t\t\tEDlgConditionType::IntCall\n\t\t);\n\t\tGetGraphNodesForTextArgumentVariable(IntVariableName, Dialogue, EDlgTextArgumentType::DialogueInt, FoundResult);\n\t\treturn FoundResult;\n\t}\n\n\t/**\n\t * Gets all the graph nodes that contain the specified FloatVariableName basic type.\n\t * This contains both graph nodes and edges.\n\t */\n\tstatic TSharedPtr<FDialogueSearchFoundResult> GetGraphNodesForFloatVariableName(FName FloatVariableName, const UDlgDialogue* Dialogue)\n\t{\n\t\tTSharedPtr<FDialogueSearchFoundResult> FoundResult = GetGraphNodesForVariablesOfNameAndType(\n\t\t\tFloatVariableName,\n\t\t\tDialogue,\n\t\t\tEDlgEventType::ModifyFloat,\n\t\t\tEDlgConditionType::FloatCall\n\t\t);\n\t\tGetGraphNodesForTextArgumentVariable(FloatVariableName, Dialogue, EDlgTextArgumentType::DialogueInt, FoundResult);\n\t\treturn FoundResult;\n\t}\n\n\t/**\n\t * Gets all the graph nodes that contain the specified BoolVariableName basic type.\n\t * This contains both graph nodes and edges.\n\t */\n\tstatic TSharedPtr<FDialogueSearchFoundResult> GetGraphNodesForBoolVariableName(FName BoolVariableName, const UDlgDialogue* Dialogue)\n\t{\n\t\treturn GetGraphNodesForVariablesOfNameAndType(\n\t\t\tBoolVariableName,\n\t\t\tDialogue,\n\t\t\tEDlgEventType::ModifyBool,\n\t\t\tEDlgConditionType::BoolCall\n\t\t);\n\t}\n\n\t/**\n\t * Gets all the graph nodes that contain the specified FNameVariableName basic type.\n\t * This contains both graph nodes and edges.\n\t */\n\tstatic TSharedPtr<FDialogueSearchFoundResult> GetGraphNodesForFNameVariableName(FName FNameVariableName, const UDlgDialogue* Dialogue)\n\t{\n\t\treturn GetGraphNodesForVariablesOfNameAndType(\n\t\t\tFNameVariableName,\n\t\t\tDialogue,\n\t\t\tEDlgEventType::ModifyName,\n\t\t\tEDlgConditionType::NameCall\n\t\t);\n\t}\n\n\t/**\n\t * Gets all the graph nodes that contain the specified IntVariableName from the UClass.\n\t * This contains both graph nodes and edges.\n\t */\n\tstatic TSharedPtr<FDialogueSearchFoundResult> GetGraphNodesForClassIntVariableName(FName IntVariableName, const UDlgDialogue* Dialogue)\n\t{\n\t\tTSharedPtr<FDialogueSearchFoundResult> FoundResult = GetGraphNodesForVariablesOfNameAndType(\n\t\t\tIntVariableName,\n\t\t\tDialogue,\n\t\t\tEDlgEventType::ModifyClassIntVariable,\n\t\t\tEDlgConditionType::ClassIntVariable\n\t\t);\n\t\tGetGraphNodesForTextArgumentVariable(IntVariableName, Dialogue, EDlgTextArgumentType::ClassInt, FoundResult);\n\t\treturn FoundResult;\n\t}\n\n\t/**\n\t * Gets all the graph nodes that contain the specified FloatVariableName from the UClass.\n\t * This contains both graph nodes and edges.\n\t */\n\tstatic TSharedPtr<FDialogueSearchFoundResult> GetGraphNodesForClassFloatVariableName(FName FloatVariableName, const UDlgDialogue* Dialogue)\n\t{\n\n\t\tTSharedPtr<FDialogueSearchFoundResult> FoundResult = GetGraphNodesForVariablesOfNameAndType(\n\t\t\tFloatVariableName,\n\t\t\tDialogue,\n\t\t\tEDlgEventType::ModifyClassFloatVariable,\n\t\t\tEDlgConditionType::ClassFloatVariable\n\t\t);\n\t\tGetGraphNodesForTextArgumentVariable(FloatVariableName, Dialogue, EDlgTextArgumentType::ClassFloat, FoundResult);\n\t\treturn FoundResult;\n\t}\n\n\t/**\n\t * Gets all the graph nodes that contain the specified BoolVariableName from the UClass.\n\t * This contains both graph nodes and edges.\n\t */\n\tstatic TSharedPtr<FDialogueSearchFoundResult> GetGraphNodesForClassBoolVariableName(FName BoolVariableName, const UDlgDialogue* Dialogue)\n\t{\n\t\treturn GetGraphNodesForVariablesOfNameAndType(\n\t\t\tBoolVariableName,\n\t\t\tDialogue,\n\t\t\tEDlgEventType::ModifyClassBoolVariable,\n\t\t\tEDlgConditionType::ClassBoolVariable\n\t\t);\n\t}\n\n\t/**\n\t * Gets all the graph nodes that contain the specified FNameVariableName from the UClass.\n\t * This contains both graph nodes and edges.\n\t */\n\tstatic TSharedPtr<FDialogueSearchFoundResult> GetGraphNodesForClassFNameVariableName(FName FNameVariableName, const UDlgDialogue* Dialogue)\n\t{\n\t\treturn GetGraphNodesForVariablesOfNameAndType(\n\t\t\tFNameVariableName,\n\t\t\tDialogue,\n\t\t\tEDlgEventType::ModifyClassNameVariable,\n\t\t\tEDlgConditionType::ClassNameVariable\n\t\t);\n\t}\n\n\t/**\n\t * Gets all the graph nodes that contain the specified FNameVariableName from the UClass.\n\t * This contains both graph nodes and edges.\n\t */\n\tstatic TSharedPtr<FDialogueSearchFoundResult> GetGraphNodesForClassFTextVariableName(FName FTextVariableName, const UDlgDialogue* Dialogue)\n\t{\n\t\tTSharedPtr<FDialogueSearchFoundResult> FoundResult = FDialogueSearchFoundResult::Make();\n\t\tGetGraphNodesForTextArgumentVariable(FTextVariableName, Dialogue, EDlgTextArgumentType::ClassText, FoundResult);\n\t\treturn FoundResult;\n\t}\n\n\t// Does Conditions contain the ConditionName (of type ConditionType)?\n\tstatic bool IsConditionInArray(\n\t\tFName ConditionName,\n\t\tEDlgConditionType ConditionType,\n\t\tconst TArray<FDlgCondition>& Conditions\n\t)\n\t{\n\t\tfor (const FDlgCondition& Condition : Conditions)\n\t\t{\n\t\t\t// Matches the First participant\n\t\t\tif (Condition.CallbackName == ConditionName && Condition.ConditionType == ConditionType)\n\t\t\t{\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\t// Matches the second Participant\n\t\t\tif (Condition.CompareType != EDlgCompare::ToConst && Condition.OtherVariableName == ConditionName)\n\t\t\t{\n\t\t\t\tif (FDlgCondition::IsSameValueType(ConditionType, Condition.ConditionType))\n\t\t\t\t{\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t}\n\n\t// Does Events contain the EventName (of type EventType)?\n\tstatic bool IsEventInArray(FName EventName, EDlgEventType EventType, const TArray<FDlgEvent>& Events)\n\t{\n\t\tfor (const FDlgEvent& Event : Events)\n\t\t{\n\t\t\tif (Event.EventType == EventType && Event.EventName == EventName)\n\t\t\t{\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t}\n\n\t// Does the Events contain a Custom Event of Class EventClass\n\tstatic bool IsCustomEventInArray(const UClass* EventClass,  const TArray<FDlgEvent>& Events)\n\t{\n\t\tfor (const FDlgEvent& Event : Events)\n\t\t{\n\t\t\tif (Event.EventType == EDlgEventType::Custom && Event.CustomEvent && Event.CustomEvent->GetClass() == EventClass)\n\t\t\t{\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t}\n\n\t// Does Events contain the EventName (of type EventType)?\n\tstatic bool IsTextArgumentInArray(FName TextArgumentName, EDlgTextArgumentType TextArgumentType, const TArray<FDlgTextArgument>& TextArguments)\n\t{\n\t\tfor (const FDlgTextArgument& TextArgument : TextArguments)\n\t\t{\n\t\t\tif (TextArgument.Type == TextArgumentType && TextArgument.VariableName == TextArgumentName)\n\t\t\t{\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t}\n\n\t// Does the SearchString exist in the GUID? We test every possible format\n\t// In case of success we return the GUID as a string in OutStringGUID\n\tstatic bool DoesGUIDContainString(const FGuid& GUID, const FString& SearchString, FString& OutGUIDString);\n\n\t// Does the SearchString exist in the GUID Class name?\n\t// In case of success we return the GUID as a string in OutNameString\n\tstatic bool DoesObjectClassNameContainString(const UObject* Object, const FString& SearchString, FString& OutNameString);\n\nprivate:\n\tstatic TSharedPtr<FDialogueSearchFoundResult> GetGraphNodesForVariablesOfNameAndType(\n\t\tFName VariableName,\n\t\tconst UDlgDialogue* Dialogue,\n\t\tEDlgEventType EventType,\n\t\tEDlgConditionType ConditionType\n\t);\n\n\tstatic void GetGraphNodesForTextArgumentVariable(\n\t\tFName VariableName,\n\t\tconst UDlgDialogue* Dialogue,\n\t\tEDlgTextArgumentType ArgumentType,\n\t\tTSharedPtr<FDialogueSearchFoundResult>& FoundResult\n\t);\n};\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystemEditor/Private/DialogueSearch/SFindInDialogues.cpp",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#include \"SFindInDialogues.h\"\n\n#include \"Editor.h\"\n#include \"Widgets/Views/STableRow.h\"\n#include \"Widgets/Input/SSearchBox.h\"\n#include \"Widgets/Input/SComboButton.h\"\n#include \"Widgets/Input/SButton.h\"\n#include \"Widgets/Input/SCheckBox.h\"\n#include \"Framework/MultiBox/MultiBoxBuilder.h\"\n#include \"Framework/Application/SlateApplication.h\"\n#include \"Framework/Commands/GenericCommands.h\"\n\n#include \"DialogueEditor/DialogueEditor.h\"\n#include \"DialogueSearchResult.h\"\n#include \"DialogueSearchManager.h\"\n\n\n#define LOCTEXT_NAMESPACE \"SFindInDialogues\"\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// SFindInDialogues\nvoid SFindInDialogues::Construct(const FArguments& InArgs, const TSharedPtr<FDialogueEditor>& InDialogueEditor)\n{\n\tDialogueEditorPtr = InDialogueEditor;\n\tHostTab = InArgs._ContainingTab;\n\n\tif (HostTab.IsValid())\n\t{\n\t\tHostTab.Pin()->SetOnTabClosed(SDockTab::FOnTabClosedCallback::CreateSP(this, &Self::HandleHostTabClosed));\n\t}\n\n\tif (InArgs._bIsSearchWindow)\n\t{\n\t\t//RegisterCommands();\n\t}\n\n\t// Only search in the current Dialogue\n\tbIsInFindWithinDialogueMode = DialogueEditorPtr.IsValid();\n\n\tconstexpr bool bHostFindInDialoguesInGlobalTab = true;\n\tChildSlot\n\t[\n\t\tSAssignNew(MainVerticalBoxWidget, SVerticalBox)\n\n\t\t// Top bar, search\n\t\t+SVerticalBox::Slot()\n\t\t.AutoHeight()\n\t\t[\n\t\t\tSNew(SHorizontalBox)\n\n\t\t\t// Search field\n\t\t\t+SHorizontalBox::Slot()\n\t\t\t.FillWidth(1)\n\t\t\t[\n\t\t\t\tSAssignNew(SearchTextBoxWidget, SSearchBox)\n\t\t\t\t.HintText(LOCTEXT(\"DialogueSearchHint\", \"Enter function or event name to find references...\"))\n\t\t\t\t.OnTextChanged(this, &Self::HandleSearchTextChanged)\n\t\t\t\t.OnTextCommitted(this, &Self::HandleSearchTextCommitted)\n\t\t\t\t.Visibility(InArgs._bHideSearchBar? EVisibility::Collapsed : EVisibility::Visible)\n\t\t\t]\n\n\t\t\t// Filter Options\n\t\t\t+SHorizontalBox::Slot()\n\t\t\t.AutoWidth()\n\t\t\t.Padding(2.0f, 2.0f)\n\t\t\t[\n\t\t\t\tSNew(SComboButton)\n\t\t\t\t.ComboButtonStyle(FEditorStyle::Get(), \"GenericFilters.ComboButtonStyle\")\n\t\t\t\t.ForegroundColor(FLinearColor::White)\n\t\t\t\t.ContentPadding(0)\n\t\t\t\t.ToolTipText(LOCTEXT(\"Filters_Tooltip\", \"Filter options for the Dialogue Search.\"))\n\t\t\t\t.OnGetMenuContent(this, &Self::FillFilterEntries)\n\t\t\t\t.HasDownArrow(true)\n\t\t\t\t.ContentPadding(FMargin(1, 0))\n\t\t\t\t.ButtonContent()\n\t\t\t\t[\n\t\t\t\t\tSNew(SHorizontalBox)\n\t\t\t\t\t+ SHorizontalBox::Slot()\n\t\t\t\t\t.AutoWidth()\n\t\t\t\t\t[\n\t\t\t\t\t\tSNew(STextBlock)\n\t\t\t\t\t\t.TextStyle(FEditorStyle::Get(), \"GenericFilters.TextStyle\")\n\t\t\t\t\t\t.Font(FEditorStyle::Get().GetFontStyle(\"FontAwesome.9\"))\n\t\t\t\t\t\t.Text(FText::FromString(FString(TEXT(\"\\xf0b0\"))) /*fa-filter*/)\n\t\t\t\t\t]\n\t\t\t\t\t+SHorizontalBox::Slot()\n\t\t\t\t\t.AutoWidth()\n\t\t\t\t\t.Padding(2, 0, 0, 0)\n\t\t\t\t\t[\n\t\t\t\t\t\tSNew(STextBlock)\n\t\t\t\t\t\t.TextStyle(FEditorStyle::Get(), \"GenericFilters.TextStyle\")\n\t\t\t\t\t\t.Text(LOCTEXT(\"Filters\", \"Filters\"))\n\t\t\t\t\t]\n\t\t\t\t]\n\t\t\t]\n\n\t\t\t// Change find mode to global\n\t\t\t+SHorizontalBox::Slot()\n\t\t\t.Padding(4.f, 0.f, 2.f, 0.f)\n\t\t\t.AutoWidth()\n\t\t\t[\n\t\t\t\tSNew(SButton)\n\t\t\t\t.OnClicked(this, &Self::HandleOpenGlobalFindResults)\n\t\t\t\t// Show button if we are in a DialogueEditor\n\t\t\t\t.Visibility(DialogueEditorPtr.IsValid() && bHostFindInDialoguesInGlobalTab ? EVisibility::Visible : EVisibility::Collapsed)\n\t\t\t\t.ToolTipText(LOCTEXT(\"OpenInGlobalFindResultsButtonTooltip\", \"Find in all Dialogues\"))\n\t\t\t\t[\n\t\t\t\t\tSNew(STextBlock)\n\t\t\t\t\t.TextStyle(FEditorStyle::Get(), \"FindResults.FindInBlueprints\")\n\t\t\t\t\t.Text(FText::FromString(FString(TEXT(\"\\xf1e5\"))) /*fa-binoculars*/)\n\t\t\t\t]\n\t\t\t]\n\n\t\t\t// Change find mode to local\n\t\t\t+SHorizontalBox::Slot()\n\t\t\t.Padding(2.f, 0.f)\n\t\t\t.AutoWidth()\n\t\t\t[\n\t\t\t\tSNew(SCheckBox)\n\t\t\t\t.OnCheckStateChanged(this, &Self::HandleFindModeChanged)\n\t\t\t\t.IsChecked(this, &Self::HandleGetFindModeChecked)\n\t\t\t\t.Visibility(InArgs._bHideSearchBar || bHostFindInDialoguesInGlobalTab ? EVisibility::Collapsed : EVisibility::Visible)\n\t\t\t\t[\n\t\t\t\t\tSNew(STextBlock)\n\t\t\t\t\t.Text(LOCTEXT(\"BlueprintSearchModeChange\", \"Find In Current Blueprint Only\"))\n\t\t\t\t]\n\t\t\t]\n\t\t]\n\n\t\t// Results tree\n\t\t+SVerticalBox::Slot()\n\t\t.FillHeight(1.0f)\n\t\t.Padding(0.f, 4.f, 0.f, 0.f)\n\t\t[\n\t\t\tSNew(SBorder)\n\t\t\t.BorderImage(FEditorStyle::GetBrush(\"Menu.Background\"))\n\t\t\t[\n\t\t\t\tSAssignNew(TreeView, STreeView<TSharedPtr<FDialogueSearchResult>>)\n\t\t\t\t.ItemHeight(24)\n\t\t\t\t.TreeItemsSource(&ItemsFound)\n\t\t\t\t.OnGenerateRow(this, &Self::HandleGenerateRow)\n\t\t\t\t.OnGetChildren(this, &Self::HandleGetChildren)\n\t\t\t\t.OnMouseButtonDoubleClick(this, &Self::HandleTreeSelectionDoubleClicked)\n\t\t\t\t.SelectionMode(ESelectionMode::Multi)\n\t\t\t\t.OnContextMenuOpening(this, &Self::HandleContextMenuOpening)\n\t\t\t]\n\t\t]\n\t];\n}\n\nSFindInDialogues::~SFindInDialogues()\n{\n\t// TODO clear all cache for this\n}\n\nvoid SFindInDialogues::FocusForUse(bool bSetFindWithinDialogue, const FDialogueSearchFilter& SearchFilter, bool bSelectFirstResult)\n{\n\t// NOTE: Careful, GeneratePathToWidget can be reentrant in that it can call visibility delegates and such\n\tFWidgetPath FilterTextBoxWidgetPath;\n\tFSlateApplication::Get().GeneratePathToWidgetUnchecked(SearchTextBoxWidget.ToSharedRef(), FilterTextBoxWidgetPath);\n\n\t// Set keyboard focus directly\n\tFSlateApplication::Get().SetKeyboardFocus(FilterTextBoxWidgetPath, EFocusCause::SetDirectly);\n\n\t// Set the filter mode\n\tbIsInFindWithinDialogueMode = bSetFindWithinDialogue;\n\n\t// Set the new search terms\n\tif (!SearchFilter.SearchString.IsEmpty())\n\t{\n\t\tSearchTextBoxWidget->SetText(FText::FromString(SearchFilter.SearchString));\n\t\tMakeSearchQuery(SearchFilter, bIsInFindWithinDialogueMode);\n\n\t\t// Select the first result\n\t\tif (bSelectFirstResult && ItemsFound.Num())\n\t\t{\n\t\t\tauto ItemToFocusOn = ItemsFound[0];\n\n\t\t\t// Focus the deepest child\n\t\t\twhile (ItemToFocusOn->HasChildren())\n\t\t\t{\n\t\t\t\tItemToFocusOn = ItemToFocusOn->GetChildren()[0];\n\t\t\t}\n\t\t\tTreeView->SetSelection(ItemToFocusOn);\n\t\t\tItemToFocusOn->OnClick();\n\t\t}\n\t}\n}\n\nvoid SFindInDialogues::MakeSearchQuery(const FDialogueSearchFilter& SearchFilter, bool bInIsFindWithinDialogue)\n{\n\tSearchTextBoxWidget->SetText(FText::FromString(SearchFilter.SearchString));\n\n\t// Reset the scroll to the top\n\tif (ItemsFound.Num())\n\t{\n\t\tTreeView->RequestScrollIntoView(ItemsFound[0]);\n\t}\n\tItemsFound.Empty();\n\n\t// Nothing to search for :(\n\tif (SearchFilter.SearchString.IsEmpty())\n\t{\n\t\treturn;\n\t}\n\n\tHighlightText = FText::FromString(SearchFilter.SearchString);\n\tRootSearchResult = MakeShared<FDialogueSearchResult_RootNode>();\n\n\t// TODO use threads extend FRunnable\n\tif (bInIsFindWithinDialogue)\n\t{\n\t\t// Local\n\t\tif (DialogueEditorPtr.IsValid())\n\t\t{\n\t\t\tFDialogueSearchManager::Get()\n\t\t\t\t\t->QuerySingleDialogue(SearchFilter, DialogueEditorPtr.Pin()->GetDialogueBeingEdited(), RootSearchResult);\n\n\t\t\t// Do now show the Dialogue in the search results.\n\t\t\tconst TArray<TSharedPtr<FDialogueSearchResult>>& Children = RootSearchResult->GetChildren();\n\t\t\tif (Children.Num() == 1 && Children[0].IsValid())\n\t\t\t{\n\t\t\t\t// Make the root be the first result (aka de dialogue).\n\t\t\t\t// NOTE: we must keep a reference here otherwise it crashes inside the parent reset\n\t\t\t\tTSharedPtr<FDialogueSearchResult> TempChild = Children[0];\n\t\t\t\tRootSearchResult = TempChild;\n\t\t\t\tRootSearchResult->ClearParent();\n\t\t\t}\n\t\t}\n\t}\n\telse\n\t{\n\t\t// Global\n\t\tFDialogueSearchManager::Get()->QueryAllDialogues(SearchFilter, RootSearchResult);\n\t}\n\n\tItemsFound = RootSearchResult->GetChildren();\n\tif (ItemsFound.Num() == 0)\n\t{\n\t\t// Some Items found\n\t\tItemsFound.Add(MakeShared<FDialogueSearchResult>(LOCTEXT(\"DialogueSearchNoResults\", \"No Results found\"), RootSearchResult));\n\t\tHighlightText = FText::GetEmpty();\n\n\t}\n\telse\n\t{\n\t\t// No Items found\n\t\tRootSearchResult->ExpandAllChildren(TreeView);\n\t}\n\n\tTreeView->RequestTreeRefresh();\n}\n\nFName SFindInDialogues::GetHostTabId() const\n{\n\tTSharedPtr<SDockTab> HostTabPtr = HostTab.Pin();\n\tif (HostTabPtr.IsValid())\n\t{\n\t\treturn HostTabPtr->GetLayoutIdentifier().TabType;\n\t}\n\n\treturn NAME_None;\n}\n\nvoid SFindInDialogues::CloseHostTab()\n{\n\tTSharedPtr<SDockTab> HostTabPtr = HostTab.Pin();\n\tif (HostTabPtr.IsValid())\n\t{\n\t\tHostTabPtr->RequestCloseTab();\n\t}\n}\n\nvoid SFindInDialogues::HandleHostTabClosed(TSharedRef<SDockTab> DockTab)\n{\n\tFDialogueSearchManager::Get()->CloseGlobalFindResults(SharedThis(this));\n}\n\nvoid SFindInDialogues::HandleSearchTextChanged(const FText& Text)\n{\n\tCurrentFilter.SearchString = Text.ToString();\n}\n\nvoid SFindInDialogues::HandleSearchTextCommitted(const FText& Text, ETextCommit::Type CommitType)\n{\n\tif (CommitType == ETextCommit::OnEnter)\n\t{\n\t\tCurrentFilter.SearchString = Text.ToString();\n\t\tMakeSearchQuery(CurrentFilter, bIsInFindWithinDialogueMode);\n\t}\n}\n\nFReply SFindInDialogues::HandleOpenGlobalFindResults()\n{\n\tTSharedPtr<SFindInDialogues> GlobalFindResults = FDialogueSearchManager::Get()->GetGlobalFindResults();\n\tif (GlobalFindResults.IsValid())\n\t{\n\t\tGlobalFindResults->FocusForUse(false, CurrentFilter, true);\n\t}\n\n\treturn FReply::Handled();\n}\n\nvoid SFindInDialogues::HandleGetChildren(TSharedPtr<FDialogueSearchResult> InItem, TArray<TSharedPtr<FDialogueSearchResult>>& OutChildren)\n{\n\tOutChildren += InItem->GetChildren();\n}\n\nvoid SFindInDialogues::HandleTreeSelectionDoubleClicked(TSharedPtr<FDialogueSearchResult> Item)\n{\n\tif (Item.IsValid())\n\t{\n\t\tItem->OnClick();\n\t}\n}\n\nTSharedRef<ITableRow> SFindInDialogues::HandleGenerateRow(TSharedPtr<FDialogueSearchResult> InItem, const TSharedRef<STableViewBase>& OwnerTable)\n{\n\t// We have categories if we are searching in multiple Dialogues\n\t// OR the grandparent of this item is not valid (aka root node)\n\tconst bool bIsCategoryWidget = !bIsInFindWithinDialogueMode &&\n\t\t(!InItem->GetParent().IsValid() || (InItem->GetParent().IsValid() && InItem->GetParent().Pin()->IsRoot()));\n\n\t// Category entry\n\tif (bIsCategoryWidget)\n\t{\n\t\treturn SNew(STableRow<TSharedPtr<FDialogueSearchResult>>, OwnerTable)\n\t\t\t[\n\t\t\t\tSNew(SBorder)\n\t\t\t\t.VAlign(VAlign_Center)\n\t\t\t\t.BorderImage(FEditorStyle::GetBrush(\"PropertyWindow.CategoryBackground\"))\n\t\t\t\t.Padding(FMargin(2.0f))\n\t\t\t\t.ForegroundColor(FEditorStyle::GetColor(\"PropertyWindow.CategoryForeground\"))\n\t\t\t\t[\n\t\t\t\t\tSNew(SHorizontalBox)\n\n\t\t\t\t\t// Icon\n\t\t\t\t\t+SHorizontalBox::Slot()\n\t\t\t\t\t.VAlign(VAlign_Center)\n\t\t\t\t\t.AutoWidth()\n\t\t\t\t\t[\n\t\t\t\t\t\tInItem->CreateIcon()\n\t\t\t\t\t]\n\n\t\t\t\t\t// Display text\n\t\t\t\t\t+SHorizontalBox::Slot()\n\t\t\t\t\t.AutoWidth()\n\t\t\t\t\t.VAlign(VAlign_Center)\n\t\t\t\t\t.Padding(2, 0)\n\t\t\t\t\t[\n\t\t\t\t\t\tSNew(STextBlock)\n\t\t\t\t\t\t.Text(InItem.Get(), &FDialogueSearchResult::GetDisplayText)\n\t\t\t\t\t\t.ToolTipText(LOCTEXT(\"DialogueCatSearchToolTip\", \"Dialogue\"))\n\t\t\t\t\t]\n\t\t\t\t]\n\t\t\t];\n\t}\n\n\t// Normal entry\n\tFText CommentText = FText::GetEmpty();\n\tif (!InItem->GetCommentString().IsEmpty())\n\t{\n\t\tFFormatNamedArguments Args;\n\t\tArgs.Add(TEXT(\"Comment\"), FText::FromString(InItem->GetCommentString()));\n\t\tCommentText = FText::Format(LOCTEXT(\"NodeComment\", \"{Comment}\"), Args);\n\t}\n\n\tFFormatNamedArguments Args;\n\tArgs.Add(TEXT(\"Category\"), InItem->GetCategory());\n\tArgs.Add(TEXT(\"DisplayTitle\"), InItem->GetDisplayText());\n\tFText Tooltip = FText::Format(LOCTEXT(\"DialogueResultSearchToolTip\", \"{Category} : {DisplayTitle}\"), Args);\n\n\treturn SNew(STableRow<TSharedPtr<FDialogueSearchResult>>, OwnerTable)\n\t\t[\n\t\t\tSNew(SHorizontalBox)\n\n\t\t\t// Icon\n\t\t\t+SHorizontalBox::Slot()\n\t\t\t.VAlign(VAlign_Center)\n\t\t\t.AutoWidth()\n\t\t\t[\n\t\t\t\tInItem->CreateIcon()\n\t\t\t]\n\n\t\t\t// Display text\n\t\t\t+SHorizontalBox::Slot()\n\t\t\t.AutoWidth()\n\t\t\t.VAlign(VAlign_Center)\n\t\t\t.Padding(2,0)\n\t\t\t[\n\t\t\t\tSNew(STextBlock)\n\t\t\t\t.Text(InItem.Get(), &FDialogueSearchResult::GetDisplayText)\n\t\t\t\t.HighlightText(HighlightText)\n\t\t\t\t.ToolTipText(Tooltip)\n\t\t\t]\n\n\t\t\t// Comment Block\n\t\t\t+SHorizontalBox::Slot()\n\t\t\t.FillWidth(1)\n\t\t\t.HAlign(HAlign_Right)\n\t\t\t.VAlign(VAlign_Center)\n\t\t\t.Padding(2,0)\n\t\t\t[\n\t\t\t\tSNew(STextBlock)\n\t\t\t\t.Text(CommentText)\n\t\t\t\t.ColorAndOpacity(FLinearColor::Yellow)\n\t\t\t]\n\t\t];\n}\n\nTSharedPtr<SWidget> SFindInDialogues::HandleContextMenuOpening()\n{\n\tconst bool bShouldCloseWindowAfterMenuSelection = true;\n\tFMenuBuilder MenuBuilder(bShouldCloseWindowAfterMenuSelection, CommandList);\n\n\tMenuBuilder.BeginSection(\"BasicOperations\");\n\t{\n\t\tMenuBuilder.AddMenuEntry(FGenericCommands::Get().SelectAll);\n\t\tMenuBuilder.AddMenuEntry(FGenericCommands::Get().Copy);\n\t}\n\n\treturn MenuBuilder.MakeWidget();\n}\n\nTSharedRef<SWidget> SFindInDialogues::FillFilterEntries()\n{\n\tFMenuBuilder MenuBuilder(true, nullptr);\n\tMenuBuilder.AddMenuEntry(\n\t\tLOCTEXT(\"IncludeIndices\", \"Include Indices\"),\n\t\tLOCTEXT(\"IncludeIndices_ToolTip\", \"Include indices of nodes/edges in the search result\"),\n\t\tFSlateIcon(),\n\t\tFUIAction(\n\t\t\tFExecuteAction::CreateLambda([this]()\n\t\t\t{\n\t\t\t\tCurrentFilter.bIncludeIndices = !CurrentFilter.bIncludeIndices;\n\t\t\t\tMakeSearchQuery(CurrentFilter, bIsInFindWithinDialogueMode);\n\t\t\t}),\n\t\t\tFCanExecuteAction(),\n\t\t\tFIsActionChecked::CreateLambda([this]() -> bool\n\t\t\t{\n\t\t\t\treturn CurrentFilter.bIncludeIndices;\n\t\t\t})\n\t\t),\n\t\tNAME_None,\n\t\tEUserInterfaceActionType::ToggleButton\n\t);\n\tMenuBuilder.AddMenuEntry(\n\t\tLOCTEXT(\"IncludeDialogueGUID\", \"Include Dialogue GUIDs\"),\n\t\tLOCTEXT(\"IncludeDialogueGUID_ToolTip\", \"Include Dialogue GUIDs in search in the search result\"),\n\t\tFSlateIcon(),\n\t\tFUIAction(\n\t\t\tFExecuteAction::CreateLambda([this]()\n\t\t\t{\n\t\t\t\tCurrentFilter.bIncludeDialogueGUID = !CurrentFilter.bIncludeDialogueGUID;\n\t\t\t\tMakeSearchQuery(CurrentFilter, bIsInFindWithinDialogueMode);\n\t\t\t}),\n\t\t\tFCanExecuteAction(),\n\t\t\tFIsActionChecked::CreateLambda([this]() -> bool\n\t\t\t{\n\t\t\t\treturn CurrentFilter.bIncludeDialogueGUID;\n\t\t\t})\n\t\t),\n\t\tNAME_None,\n\t\tEUserInterfaceActionType::ToggleButton\n\t);\n\tMenuBuilder.AddMenuEntry(\n\t\tLOCTEXT(\"IncludeNodeGUID\", \"Include Node GUIDs\"),\n\t\tLOCTEXT(\"IncludeNodeGUID_ToolTip\", \"Include Node GUIDs in search in the search result\"),\n\t\tFSlateIcon(),\n\t\tFUIAction(\n\t\t\tFExecuteAction::CreateLambda([this]()\n\t\t\t{\n\t\t\t\tCurrentFilter.bIncludeNodeGUID = !CurrentFilter.bIncludeNodeGUID;\n\t\t\t\tMakeSearchQuery(CurrentFilter, bIsInFindWithinDialogueMode);\n\t\t\t}),\n\t\t\tFCanExecuteAction(),\n\t\t\tFIsActionChecked::CreateLambda([this]() -> bool\n\t\t\t{\n\t\t\t\treturn CurrentFilter.bIncludeNodeGUID;\n\t\t\t})\n\t\t),\n\t\tNAME_None,\n\t\tEUserInterfaceActionType::ToggleButton\n\t);\n\tMenuBuilder.AddMenuEntry(\n\t\tLOCTEXT(\"IncludeComments\", \"Include Comments\"),\n\t\tLOCTEXT(\"IncludeComments_ToolTip\", \"Include Comments from nodes and comments on nodes in the search result\"),\n\t\tFSlateIcon(),\n\t\tFUIAction(\n\t\t\tFExecuteAction::CreateLambda([this]()\n\t\t\t{\n\t\t\t\tCurrentFilter.bIncludeComments = !CurrentFilter.bIncludeComments;\n\t\t\t\tMakeSearchQuery(CurrentFilter, bIsInFindWithinDialogueMode);\n\t\t\t}),\n\t\t\tFCanExecuteAction(),\n\t\t\tFIsActionChecked::CreateLambda([this]() -> bool\n\t\t\t{\n\t\t\t\treturn CurrentFilter.bIncludeComments;\n\t\t\t})\n\t\t),\n\t\tNAME_None,\n\t\tEUserInterfaceActionType::ToggleButton\n\t);\n\tMenuBuilder.AddMenuEntry(\n\t\tLOCTEXT(\"IncludeNumericalTypes\", \"Include Integers & Floats\"),\n\t\tLOCTEXT(\"IncludeNumericalTypes_ToolTip\", \"Include int32/floats in search result\"),\n\t\tFSlateIcon(),\n\t\tFUIAction(\n\t\t\tFExecuteAction::CreateLambda([this]()\n\t\t\t{\n\t\t\t\tCurrentFilter.bIncludeNumericalTypes = !CurrentFilter.bIncludeNumericalTypes;\n\t\t\t\tMakeSearchQuery(CurrentFilter, bIsInFindWithinDialogueMode);\n\t\t\t}),\n\t\t\tFCanExecuteAction(),\n\t\t\tFIsActionChecked::CreateLambda([this]() -> bool\n\t\t\t{\n\t\t\t\treturn CurrentFilter.bIncludeNumericalTypes;\n\t\t\t})\n\t\t),\n\t\tNAME_None,\n\t\tEUserInterfaceActionType::ToggleButton\n\t);\n\tMenuBuilder.AddMenuEntry(\n\t\tLOCTEXT(\"IncludeTextLocalizationData\", \"Include Text Localization Data\"),\n\t\tLOCTEXT(\"IncludeTextLocalizationData_ToolTip\", \"Include text localization data in search (key/namespace)\"),\n\t\tFSlateIcon(),\n\t\tFUIAction(\n\t\t\tFExecuteAction::CreateLambda([this]()\n\t\t\t{\n\t\t\t\tCurrentFilter.bIncludeTextLocalizationData = !CurrentFilter.bIncludeTextLocalizationData;\n\t\t\t\tMakeSearchQuery(CurrentFilter, bIsInFindWithinDialogueMode);\n\t\t\t}),\n\t\t\tFCanExecuteAction(),\n\t\t\tFIsActionChecked::CreateLambda([this]() -> bool\n\t\t\t{\n\t\t\t\treturn CurrentFilter.bIncludeTextLocalizationData;\n\t\t\t})\n\t\t),\n\t\tNAME_None,\n\t\tEUserInterfaceActionType::ToggleButton\n\t);\n\tMenuBuilder.AddMenuEntry(\n\t\tLOCTEXT(\"IncludeCustomObjectNames\", \"Include Custom Object Names\"),\n\t\tLOCTEXT(\"IncludeCustomObjectNames_ToolTip\", \"Include the Custom Text Argument/Condition/Event/Node Data object names\"),\n\t\tFSlateIcon(),\n\t\tFUIAction(\n\t\t\tFExecuteAction::CreateLambda([this]()\n\t\t\t{\n\t\t\t\tCurrentFilter.bIncludeCustomObjectNames = !CurrentFilter.bIncludeCustomObjectNames;\n\t\t\t\tMakeSearchQuery(CurrentFilter, bIsInFindWithinDialogueMode);\n\t\t\t}),\n\t\t\tFCanExecuteAction(),\n\t\t\tFIsActionChecked::CreateLambda([this]() -> bool\n\t\t\t{\n\t\t\t\treturn CurrentFilter.bIncludeCustomObjectNames;\n\t\t\t})\n\t\t),\n\t\tNAME_None,\n\t\tEUserInterfaceActionType::ToggleButton\n\t);\n\n\treturn MenuBuilder.MakeWidget();\n}\n\n#undef LOCTEXT_NAMESPACE\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystemEditor/Private/DialogueSearch/SFindInDialogues.h",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#pragma once\n\n#include \"Widgets/DeclarativeSyntaxSupport.h\"\n#include \"Widgets/SCompoundWidget.h\"\n#include \"Widgets/Views/STreeView.h\"\n#include \"Framework/Commands/UICommandList.h\"\n\n#include \"DialogueSearchResult.h\"\n\nclass FDialogueEditor;\nclass SSearchBox;\nclass SDockTab;\n\n/**  Widget for searching across all dialogues or just a single dialogue */\nclass SFindInDialogues : public SCompoundWidget\n{\nprivate:\n\ttypedef SFindInDialogues Self;\n\npublic:\n\tSLATE_BEGIN_ARGS(Self)\n\t\t: _bIsSearchWindow(true)\n\t\t, _bHideSearchBar(false)\n\t\t, _ContainingTab()\n\t{}\n\t\tSLATE_ARGUMENT(bool, bIsSearchWindow)\n\t\tSLATE_ARGUMENT(bool, bHideSearchBar)\n\t\tSLATE_ARGUMENT(TSharedPtr<SDockTab>, ContainingTab)\n\tSLATE_END_ARGS()\n\n\tvoid Construct(const FArguments& InArgs, const TSharedPtr<FDialogueEditor>& InDialogueEditor = nullptr);\n\t~SFindInDialogues();\n\n\t/** Focuses this widget's search box, and changes the mode as well, and optionally the search terms */\n\tvoid FocusForUse(bool bSetFindWithinDialogue, const FDialogueSearchFilter& SearchFilter = FDialogueSearchFilter(), bool bSelectFirstResult = false);\n\n\t/**\n\t * Submits a search query\n\t *\n\t * @param SearchFilter\t\t\t\t\t\tFilter for search\n\t * @param bInIsFindWithinDialogue\t\t\tTRUE if searching within the current Dialogue only\n\t */\n\tvoid MakeSearchQuery(const FDialogueSearchFilter& SearchFilter, bool bInIsFindWithinDialogue);\n\n\t/** If this is a global find results widget, returns the host tab's unique ID. Otherwise, returns NAME_None. */\n\tFName GetHostTabId() const;\n\n\t/** If this is a global find results widget, ask the host tab to close */\n\tvoid CloseHostTab();\n\nprivate:\n\t/** Called when the host tab is closed (if valid) */\n\tvoid HandleHostTabClosed(TSharedRef<SDockTab> DockTab);\n\n\t/** Called when user changes the text they are searching for */\n\tvoid HandleSearchTextChanged(const FText& Text);\n\n\t/** Called when user changes commits text to the search box */\n\tvoid HandleSearchTextCommitted(const FText& Text, ETextCommit::Type CommitType);\n\n\t/** Called when the user clicks the global find results button */\n\tFReply HandleOpenGlobalFindResults();\n\n\t/** Called when the find mode checkbox is hit */\n\tvoid HandleFindModeChanged(ECheckBoxState CheckState)\n\t{\n\t\tbIsInFindWithinDialogueMode = CheckState == ECheckBoxState::Checked;\n\t}\n\n\t/** Called to check what the find mode is for the checkbox */\n\tECheckBoxState HandleGetFindModeChecked() const\n\t{\n\t\treturn bIsInFindWithinDialogueMode ? ECheckBoxState::Checked : ECheckBoxState::Unchecked;\n\t}\n\n\t/* Get the children of a row */\n\tvoid HandleGetChildren(TSharedPtr<FDialogueSearchResult> InItem, TArray<TSharedPtr<FDialogueSearchResult>>& OutChildren);\n\n\t/* Called when user double clicks on a new result */\n\tvoid HandleTreeSelectionDoubleClicked(TSharedPtr<FDialogueSearchResult> Item);\n\n\t/* Called when a new row is being generated */\n\tTSharedRef<ITableRow> HandleGenerateRow(TSharedPtr<FDialogueSearchResult> InItem, const TSharedRef<STableViewBase>& OwnerTable);\n\n\t/** Callback to build the context menu when right clicking in the tree */\n\tTSharedPtr<SWidget> HandleContextMenuOpening();\n\n\t/** Fills in the filter menu. */\n\tTSharedRef<SWidget> FillFilterEntries();\n\nprivate:\n\t/** Pointer back to the Dialogue editor that owns us */\n\tTWeakPtr<FDialogueEditor> DialogueEditorPtr;\n\n\t/* The tree view displays the results */\n\tTSharedPtr<STreeView<TSharedPtr<FDialogueSearchResult>>> TreeView;\n\n\t/** The search text box */\n\tTSharedPtr<SSearchBox> SearchTextBoxWidget;\n\n\t/** Vertical box, used to add and remove widgets dynamically */\n\tTWeakPtr<SVerticalBox> MainVerticalBoxWidget;\n\n\t/** In Find Within Dialogue mode, we need to keep a handle on the root result, because it won't show up in the tree. */\n\tTSharedPtr<FDialogueSearchResult> RootSearchResult;\n\n\t/* This buffer stores the currently displayed results */\n\tTArray<TSharedPtr<FDialogueSearchResult>> ItemsFound;\n\n\t/* The string to highlight in the results */\n\tFText HighlightText;\n\n\t/** The current searach filter */\n\tFDialogueSearchFilter CurrentFilter;\n\n\t/** Should we search within the current Dialogue only (rather than all Dialogues) */\n\tbool bIsInFindWithinDialogueMode;\n\n\t/** Tab hosting this widget. May be invalid. */\n\tTWeakPtr<SDockTab> HostTab;\n\n\t/** Commands handled by this widget */\n\tTSharedPtr<FUICommandList> CommandList;\n};\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystemEditor/Private/DialogueStyle.cpp",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#include \"DialogueStyle.h\"\n\n#include \"Styling/SlateStyle.h\"\n#include \"Interfaces/IPluginManager.h\"\n#include \"Styling/SlateStyleRegistry.h\"\n\n#include \"DlgSystemEditorModule.h\"\n#include \"DlgSystemModule.h\"\n\n// Const icon sizes\nstatic const FVector2D Icon16x16(16.0f, 16.0f);\nstatic const FVector2D Icon20x20(20.0f, 20.0f);\nstatic const FVector2D Icon24x24(24.0f, 24.0f);\nstatic const FVector2D Icon40x40(40.0f, 40.0f);\nstatic const FVector2D Icon64x64(64.0f, 64.0f);\nstatic const FVector2D Icon96x96(96.0f, 96.0f);\n\n\n// What is displayed in the Content Browser\nconst FName FDialogueStyle::PROPERTY_DlgDialogueClassIcon(TEXT(\"ClassIcon.DlgDialogue\"));\nconst FName FDialogueStyle::PROPERTY_DlgDialogueClassThumbnail(TEXT(\"ClassThumbnail.DlgDialogue\"));\nconst FName FDialogueStyle::PROPERTY_DlgEventCustomClassIcon(TEXT(\"ClassIcon.DlgEventCustom\"));\nconst FName FDialogueStyle::PROPERTY_DlgEventCustomClassThumbnail(TEXT(\"ClassThumbnail.DlgEventCustom\"));\nconst FName FDialogueStyle::PROPERTY_DlgConditionCustomClassIcon(TEXT(\"ClassIcon.DlgConditionCustom\"));\nconst FName FDialogueStyle::PROPERTY_DlgConditionCustomClassThumbnail(TEXT(\"ClassThumbnail.DlgConditionCustom\"));\nconst FName FDialogueStyle::PROPERTY_DlgTextArgumentCustomClassIcon(TEXT(\"ClassIcon.DlgTextArgumentCustom\"));\nconst FName FDialogueStyle::PROPERTY_DlgTextArgumentCustomClassThumbnail(TEXT(\"ClassThumbnail.DlgTextArgumentCustom\"));\nconst FName FDialogueStyle::PROPERTY_DlgNodeDataClassIcon(TEXT(\"ClassIcon.DlgNodeData\"));\nconst FName FDialogueStyle::PROPERTY_DlgNodeDataClassThumbnail(TEXT(\"ClassThumbnail.DlgNodeData\"));\n\n\n// Inside the Dialogue Editor Window\nconst FName FDialogueStyle::PROPERTY_GraphNodeCircleBox(TEXT(\"DlgSystemEditor.Graph.Node.Circle\"));\nconst FName FDialogueStyle::PROPERTY_ConditionIcon(TEXT(\"DlgSystemEditor.Condition\"));\nconst FName FDialogueStyle::PROPERTY_EventIcon(TEXT(\"DlgSystemEditor.Event\"));\nconst FName FDialogueStyle::PROPERTY_VoiceIcon(TEXT(\"DlgSystemEditor.Voice\"));\nconst FName FDialogueStyle::PROPERTY_GenericIcon(TEXT(\"DlgSystemEditor.Generic\"));\nconst FName FDialogueStyle::PROPERTY_QuestionMarkIcon(TEXT(\"DlgSystemEditor.QuestionMark\"));\n\n// Tied with FDialogueCommands::DialogueReloadData\nconst FName FDialogueStyle::PROPERTY_ReloadAssetIcon(TEXT(\"DlgSystemEditor.DialogueReloadData\"));\n\n// Tied with FDialogueCommands::ToggleShowPrimarySecondaryEdges\nconst FName FDialogueStyle::PROPERTY_ShowPrimarySecondaryEdgesIcon(TEXT(\"DlgSystemEditor.ToggleShowPrimarySecondaryEdges\"));\n\n// For the Dialogue Browser\nconst FName FDialogueStyle::PROPERTY_OpenAssetIcon(TEXT(\"DlgSystemEditor.OpenAsset\"));\nconst FName FDialogueStyle::PROPERTY_FindAssetIcon(TEXT(\"DlgSystemEditor.FindAsset\"));\nconst FName FDialogueStyle::PROPERTY_DialogueBrowser_TabIcon(TEXT(\"DlgSystemEditor.DialogueBrowser.TabIcon\"));\n\n// Tied with FDialogueCommands::SaveAllDialogues\nconst FName FDialogueStyle::PROPERTY_SaveAllDialoguesIcon(TEXT(\"DlgSystemEditor.SaveAllDialogues\"));\n\n// Tied with FDialogueCommands::DeleteAllDialoguesTextFiles\nconst FName FDialogueStyle::PROPERTY_DeleteAllDialoguesTextFilesIcon(TEXT(\"DlgSystemEditor.DeleteAllDialoguesTextFiles\"));\n\n// Tied with FDialogueCommands::DeleteCurrentDialogueTextFiles\nconst FName FDialogueStyle::PROPERTY_DeleteCurrentDialogueTextFilesIcon(TEXT(\"DlgSystemEditor.DeleteCurrentDialogueTextFiles\"));\n\n// For the Dialogue Search Browser\nconst FName FDialogueStyle::PROPERTY_DialogueSearch_TabIcon(TEXT(\"DlgSystemEditor.DialogueSearch.TabIcon\"));\n\n// For the Dialogue Data Display Window\nconst FName FDialogueStyle::PROPERTY_DialogueDataDisplay_TabIcon(TEXT(\"DlgSystemEditor.DialogueDataDisplay.TabIcon\"));\n\n// Tied with FDialogueCommands::FindInDialogue\nconst FName FDialogueStyle::PROPERTY_FindInDialogueEditorIcon(TEXT(\"DlgSystemEditor.FindInDialogue\"));\n\n// Tied with FDialogueCommands::FindInAllDialogues\nconst FName FDialogueStyle::PROPERTY_FindInAllDialogueEditorIcon(TEXT(\"DlgSystemEditor.FindInAllDialogues\"));\n\n// Tied with FDialogueCommands::OpenDiscord\nconst FName FDialogueStyle::PROPERTY_OpenDiscordIcon(TEXT(\"DlgSystemEditor.OpenDiscord\"));\n\n// Tied with FDialogueCommands::OpenForum\nconst FName FDialogueStyle::PROPERTY_OpenForumIcon(TEXT(\"DlgSystemEditor.OpenForum\"));\n\n// Tied with FDialogueCommands::OpenNotYetPlugins\nconst FName FDialogueStyle::PROPERTY_OpenNotYetPluginsIcon(TEXT(\"DlgSystemEditor.OpenNotYetPlugins\"));\n\n// Tied with FDialogueCommands::OpenMarketplace\nconst FName FDialogueStyle::PROPERTY_OpenMarketplaceIcon(TEXT(\"DlgSystemEditor.OpenMarketplace\"));\n\n// Tied with FDialogueCommands::OpenWiki\nconst FName FDialogueStyle::PROPERTY_OpenWikiIcon(TEXT(\"DlgSystemEditor.OpenWiki\"));\n\n// For FDialogueSearchResult_CommentNode\nconst FName FDialogueStyle::PROPERTY_CommentBubbleOn(TEXT(\"DlgSystemEditor.CommentBubbleOn\"));\n\nconst FName FDialogueStyle::PROPERTY_NotYetLogoIcon(TEXT(\"DlgSystemEditor.NotYetLogo.Icon\"));\n\n// The private ones\nTSharedPtr<FSlateStyleSet> FDialogueStyle::StyleSet = nullptr;\nFString FDialogueStyle::EngineContentRoot = FString();\nFString FDialogueStyle::PluginContentRoot = FString();\n\nvoid FDialogueStyle::Initialize()\n{\n\t// Only register once\n\tif (StyleSet.IsValid())\n\t{\n\t\treturn;\n\t}\n\n\tStyleSet = MakeShared<FSlateStyleSet>(GetStyleSetName());\n\tEngineContentRoot = FPaths::EngineContentDir() / TEXT(\"Editor/Slate\");\n\tTSharedPtr<IPlugin> CurrentPlugin = IPluginManager::Get().FindPlugin(DIALOGUE_SYSTEM_PLUGIN_NAME.ToString());\n\tif (CurrentPlugin.IsValid())\n\t{\n\t\t// Replaces the Engine Content Root (Engine/Editor/Slate) with the plugin content root\n\t\tStyleSet->SetContentRoot(CurrentPlugin->GetContentDir());\n\t\tPluginContentRoot = CurrentPlugin->GetContentDir();\n\t}\n\telse\n\t{\n\t\tUE_LOG(LogDlgSystemEditor, Fatal, TEXT(\"Could not find the Dialogue System Plugin :(\"));\n\t\treturn;\n\t}\n\n\t// Content Browser icons for asset types\n\tStyleSet->Set(\n\t\tPROPERTY_DlgDialogueClassIcon,\n\t\tnew FSlateImageBrush(GetPluginContentPath(\"Icons/DlgDialogue_16x.png\"), Icon16x16)\n\t);\n\tStyleSet->Set(\n\t\tPROPERTY_DlgDialogueClassThumbnail,\n\t\tnew FSlateImageBrush(GetPluginContentPath(\"Icons/DlgDialogue_64x.png\"), Icon64x64)\n\t);\n\tStyleSet->Set(\n\t\tPROPERTY_DlgEventCustomClassIcon,\n\t\tnew FSlateImageBrush(GetPluginContentPath(\"Icons/DlgEventCustom_16x.png\"), Icon16x16)\n\t);\n\tStyleSet->Set(\n\t\tPROPERTY_DlgEventCustomClassThumbnail,\n\t\tnew FSlateImageBrush(GetPluginContentPath(\"Icons/DlgEventCustom_64x.png\"), Icon64x64)\n\t);\n\tStyleSet->Set(\n\t\tPROPERTY_DlgConditionCustomClassIcon,\n\t\tnew FSlateImageBrush(GetPluginContentPath(\"Icons/DlgConditionCustom_16x.png\"), Icon16x16)\n\t);\n\tStyleSet->Set(\n\t\tPROPERTY_DlgConditionCustomClassThumbnail,\n\t\tnew FSlateImageBrush(GetPluginContentPath(\"Icons/DlgConditionCustom_64x.png\"), Icon64x64)\n\t);\n\tStyleSet->Set(\n\t\tPROPERTY_DlgTextArgumentCustomClassIcon,\n\t\tnew FSlateImageBrush(GetPluginContentPath(\"Icons/DlgTextArgumentCustom_16x.png\"), Icon16x16)\n\t);\n\tStyleSet->Set(\n\t\tPROPERTY_DlgTextArgumentCustomClassThumbnail,\n\t\tnew FSlateImageBrush(GetPluginContentPath(\"Icons/DlgTextArgumentCustom_64x.png\"), Icon64x64)\n\t);\n\tStyleSet->Set(\n\t\tPROPERTY_DlgNodeDataClassIcon,\n\t\tnew FSlateImageBrush(GetPluginContentPath(\"Icons/DlgNodeData_16x.png\"), Icon16x16)\n\t);\n\tStyleSet->Set(\n\t\tPROPERTY_DlgNodeDataClassThumbnail,\n\t\tnew FSlateImageBrush(GetPluginContentPath(\"Icons/DlgNodeData_64x.png\"), Icon64x64)\n\t);\n\n\t// Dialogue Search\n\tStyleSet->Set(\n\t\tPROPERTY_FindInDialogueEditorIcon,\n\t\tnew FSlateImageBrush(GetEngineContentPath(\"Icons/icon_Blueprint_Find_40px.png\"), Icon40x40)\n\t);\n\tStyleSet->Set(\n\t\tGetSmallProperty(PROPERTY_FindInDialogueEditorIcon),\n\t\tnew FSlateImageBrush(GetEngineContentPath(\"Icons/icon_Blueprint_Find_40px.png\"), Icon20x20)\n\t);\n\n\tStyleSet->Set(\n\t\tPROPERTY_FindInAllDialogueEditorIcon,\n\t\tnew FSlateImageBrush(GetEngineContentPath(\"Icons/icon_FindInAnyBlueprint_40px.png\"), Icon40x40)\n\t);\n\tStyleSet->Set(\n\t\tGetSmallProperty(PROPERTY_FindInAllDialogueEditorIcon),\n\t\tnew FSlateImageBrush(GetEngineContentPath(\"Icons/icon_FindInAnyBlueprint_40px.png\"), Icon20x20)\n\t);\n\n\tStyleSet->Set(\n\t\tPROPERTY_DialogueSearch_TabIcon,\n\t\tnew FSlateImageBrush(GetEngineContentPath(\"Icons/icon_Genericfinder_16x.png\"), Icon16x16)\n\t);\n\n\t// Level Editor File\n\tStyleSet->Set(\n\t\tPROPERTY_SaveAllDialoguesIcon,\n\t\tnew FSlateImageBrush(GetEngineContentPath(\"Icons/icon_file_saveall_40x.png\"), Icon40x40)\n\t);\n\tStyleSet->Set(\n\t\tPROPERTY_DeleteAllDialoguesTextFilesIcon,\n\t\tnew FSlateImageBrush(GetEngineContentPath(\"Icons/Edit/icon_Edit_Delete_40x.png\"), Icon40x40)\n\t);\n\tStyleSet->Set(\n\t\tPROPERTY_DeleteCurrentDialogueTextFilesIcon,\n\t\tnew FSlateImageBrush(GetEngineContentPath(\"Icons/Edit/icon_Edit_Delete_40x.png\"), Icon40x40)\n\t);\n\n\t// Level Editor Help\n\tStyleSet->Set(\n\t\tPROPERTY_OpenDiscordIcon,\n\t\tnew FSlateImageBrush(GetPluginContentPath(\"Icons/Discord_96x.png\"), Icon96x96)\n\t);\n\tStyleSet->Set(\n\t\tPROPERTY_OpenNotYetPluginsIcon,\n\t\tnew FSlateImageBrush(GetPluginContentPath(\"Icons/NotYet_96x.png\"), Icon96x96)\n\t);\n\tStyleSet->Set(\n\t\tPROPERTY_OpenForumIcon,\n\t\tnew FSlateImageBrush(GetPluginContentPath(\"Icons/Forum_96x.png\"), Icon96x96)\n\t);\n\tStyleSet->Set(\n\t\tPROPERTY_OpenWikiIcon,\n\t\tnew FSlateImageBrush(GetPluginContentPath(\"Icons/Wiki_96x.png\"), Icon96x96)\n\t);\n\tStyleSet->Set(\n\t\tPROPERTY_OpenMarketplaceIcon,\n\t\tnew FSlateImageBrush(GetPluginContentPath(\"Icons/Marketplace_96x.png\"), Icon96x96)\n\t);\n\n\t// Dialogue Browser\n\tStyleSet->Set(\n\t\tPROPERTY_DialogueBrowser_TabIcon,\n\t\tnew FSlateImageBrush(GetEngineContentPath(\"Icons/icon_tab_ContentBrowser_16x.png\"), Icon16x16)\n\t);\n\n\t// Dialogue Data Display\n\tStyleSet->Set(\n\t\tPROPERTY_DialogueDataDisplay_TabIcon,\n\t\tnew FSlateImageBrush(GetEngineContentPath(\"Icons/icon_tab_DebugTools_40x.png\"), Icon16x16)\n\t);\n\n\t// Dialogue Editor Window\n\tStyleSet->Set(\n\t\tPROPERTY_ReloadAssetIcon,\n\t\tnew FSlateImageBrush(GetEngineContentPath(\"Icons/icon_Cascade_RestartInLevel_40x.png\"), Icon40x40)\n\t);\n\tStyleSet->Set(\n\t\tGetSmallProperty(PROPERTY_ReloadAssetIcon),\n\t\tnew FSlateImageBrush(GetEngineContentPath(\"Icons/icon_Refresh_16x.png\"), Icon16x16)\n\t);\n\n\tStyleSet->Set(\n\t\tPROPERTY_ShowPrimarySecondaryEdgesIcon,\n\t\tnew FSlateImageBrush(GetPluginContentPath(\"Icons/Dialogue_ShowPrimarySecondaryEdges_40x.png\"), Icon40x40)\n\t);\n\tStyleSet->Set(\n\t\tGetSmallProperty(PROPERTY_ShowPrimarySecondaryEdgesIcon),\n\t\tnew FSlateImageBrush(GetPluginContentPath(\"Icons/Dialogue_ShowPrimarySecondaryEdges_40x.png\"), Icon16x16)\n\t);\n\n\t// Custom Icon sizes, original image is 128x64, we divide by 1.4\n\tStyleSet->Set(\n\t\tPROPERTY_NotYetLogoIcon,\n\t\tnew FSlateImageBrush(GetPluginContentPath(\"Icons/NotYet_128x_64x.png\"), FVector2D{91.42f, 45.8f})\n\t);\n\tStyleSet->Set(\n\t\tGetSmallProperty(PROPERTY_NotYetLogoIcon),\n\t\tnew FSlateImageBrush(GetPluginContentPath(\"Icons/NotYet_96x.png\"), Icon16x16)\n\t);\n\n\tStyleSet->Set(\n\t\tPROPERTY_ConditionIcon,\n\t\tnew FSlateImageBrush(GetPluginContentPath(\"Icons/Condition_96x.png\"), Icon96x96)\n\t);\n\tStyleSet->Set(\n\t\tPROPERTY_EventIcon,\n\t\tnew FSlateImageBrush(GetPluginContentPath(\"Icons/Event_96x.png\"), Icon96x96)\n\t);\n\tStyleSet->Set(\n\t\tPROPERTY_VoiceIcon,\n\t\tnew FSlateImageBrush(GetPluginContentPath(\"Icons/Speaker_96x.png\"), Icon96x96)\n\t);\n\tStyleSet->Set(\n\t\tPROPERTY_GenericIcon,\n\t\tnew FSlateImageBrush(GetPluginContentPath(\"Icons/Generic_96x.png\"), Icon96x96)\n\t);\n\tStyleSet->Set(\n\t\tPROPERTY_QuestionMarkIcon,\n\t\tnew FSlateImageBrush(GetPluginContentPath(\"Icons/QuestionMark_16x.png\"), Icon16x16)\n\t);\n\tStyleSet->Set(\n\t\tPROPERTY_OpenAssetIcon,\n\t\tnew FSlateImageBrush(GetEngineContentPath(\"Icons/icon_asset_open_16px.png\"), Icon16x16)\n\t);\n\tStyleSet->Set(\n\t\tPROPERTY_FindAssetIcon,\n\t\tnew FSlateImageBrush(GetEngineContentPath(\"Icons/icon_Genericfinder_16x.png\"), Icon16x16)\n\t);\n\tStyleSet->Set(\n\t\tPROPERTY_GraphNodeCircleBox,\n\t\tnew FSlateBoxBrush(\n\t\t\tGetEngineContentPath(\"BehaviorTree/IndexCircle.png\"),\n\t\t\tIcon20x20,\n\t\t\tFMargin(8.0f / 20.0f)\n\t\t)\n\t);\n\tStyleSet->Set(\n\t\tPROPERTY_CommentBubbleOn,\n\t\tnew FSlateImageBrush(\n\t\t\tGetEngineContentPath(\"Icons/icon_Blueprint_CommentBubbleOn_16x.png\"),\n\t\t\tIcon16x16,\n\t\t\tFLinearColor(1.f, 1.f, 1.f, 1.f)\n\t\t)\n\t);\n\n\t// Register the current style\n\tFSlateStyleRegistry::RegisterSlateStyle(*StyleSet.Get());\n}\n\nvoid FDialogueStyle::Shutdown()\n{\n\t// unregister the style\n\tif (!StyleSet.IsValid())\n\t{\n\t\treturn;\n\t}\n\n\tFSlateStyleRegistry::UnRegisterSlateStyle(*StyleSet.Get());\n\tensure(StyleSet.IsUnique());\n\tStyleSet.Reset();\n}\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystemEditor/Private/DialogueStyle.h",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#pragma once\n\n#include \"Styling/SlateStyle.h\"\n\n// how everything looks, fancy stuff\nclass FDialogueStyle\n{\npublic:\n\tstatic void Initialize();\n\n\tstatic void Shutdown();\n\n\tstatic TSharedPtr<ISlateStyle> Get() { return StyleSet; }\n\n\t/** Gets the style name. */\n\tstatic FName GetStyleSetName() { return TEXT(\"DlgSystemStyle\"); }\n\n\t/** Gets the small property name variant */\n\tstatic FName GetSmallProperty(FName PropertyName)\n\t{\n\t\treturn FName(*(PropertyName.ToString() + TEXT(\".Small\")));\n\t}\n\n\t/** Get the RelativePath to the DlgSystem Content Dir */\n\tstatic FString GetPluginContentPath(const FString& RelativePath)\n\t{\n\t\treturn PluginContentRoot / RelativePath;\n\t}\n\n\t/** Get the RelativePath to the Engine Content Dir */\n\tstatic FString GetEngineContentPath(const FString& RelativePath)\n\t{\n\t\treturn EngineContentRoot / RelativePath;\n\t}\n\npublic:\n\tstatic const FName PROPERTY_DlgDialogueClassIcon;\n\tstatic const FName PROPERTY_DlgDialogueClassThumbnail;\n\n\tstatic const FName PROPERTY_DlgEventCustomClassIcon;\n\tstatic const FName PROPERTY_DlgEventCustomClassThumbnail;\n\n\tstatic const FName PROPERTY_DlgConditionCustomClassIcon;\n\tstatic const FName PROPERTY_DlgConditionCustomClassThumbnail;\n\n\tstatic const FName PROPERTY_DlgTextArgumentCustomClassIcon;\n\tstatic const FName PROPERTY_DlgTextArgumentCustomClassThumbnail;\n\n\tstatic const FName PROPERTY_DlgNodeDataClassIcon;\n\tstatic const FName PROPERTY_DlgNodeDataClassThumbnail;\n\n\tstatic const FName PROPERTY_GraphNodeCircleBox;\n\tstatic const FName PROPERTY_ConditionIcon;\n\tstatic const FName PROPERTY_EventIcon;\n\tstatic const FName PROPERTY_VoiceIcon;\n\tstatic const FName PROPERTY_GenericIcon;\n\tstatic const FName PROPERTY_QuestionMarkIcon;\n\n\tstatic const FName PROPERTY_ShowPrimarySecondaryEdgesIcon;\n\tstatic const FName PROPERTY_ReloadAssetIcon;\n\tstatic const FName PROPERTY_OpenAssetIcon;\n\tstatic const FName PROPERTY_FindAssetIcon;\n\n\tstatic const FName PROPERTY_SaveAllDialoguesIcon;\n\tstatic const FName PROPERTY_DeleteAllDialoguesTextFilesIcon;\n\tstatic const FName PROPERTY_DeleteCurrentDialogueTextFilesIcon;\n\tstatic const FName PROPERTY_DialogueSearch_TabIcon;\n\tstatic const FName PROPERTY_DialogueBrowser_TabIcon;\n\tstatic const FName PROPERTY_DialogueDataDisplay_TabIcon;\n\n\tstatic const FName PROPERTY_NotYetLogoIcon;\n\tstatic const FName PROPERTY_OpenDiscordIcon;\n\tstatic const FName PROPERTY_OpenNotYetPluginsIcon;\n\tstatic const FName PROPERTY_OpenForumIcon;\n\tstatic const FName PROPERTY_OpenMarketplaceIcon;\n\tstatic const FName PROPERTY_OpenWikiIcon;\n\n\tstatic const FName PROPERTY_FindInDialogueEditorIcon;\n\tstatic const FName PROPERTY_FindInAllDialogueEditorIcon;\n\n\tstatic const FName PROPERTY_CommentBubbleOn;\n\nprivate:\n\t/** Singleton instance. */\n\tstatic TSharedPtr<FSlateStyleSet> StyleSet;\n\n\t/** Engine content root. */\n\tstatic FString EngineContentRoot;\n\n\t/** DlgSystem Content Root */\n\tstatic FString PluginContentRoot;\n};\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystemEditor/Private/DlgDialogueEditorAccess.cpp",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#include \"DlgDialogueEditorAccess.h\"\n\n#include \"DlgDialogue.h\"\n#include \"DialogueEditor/Graph/DialogueGraph.h\"\n#include \"DialogueEditor/Graph/DialogueGraphSchema.h\"\n#include \"DialogueEditorUtilities.h\"\n#include \"DialogueEditor/Nodes/DialogueGraphNode.h\"\n#include \"DialogueEditor/Nodes/DialogueGraphNode_Edge.h\"\n#include \"DialogueEditor/DialogueCompiler.h\"\n#include \"Nodes/DlgNode.h\"\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// FDlgDialogueEditorAccess\nvoid FDlgDialogueEditorAccess::UpdateGraphNodeEdges(UEdGraphNode* GraphNode)\n{\n\tif (UDialogueGraphNode* DialogueGraphNode = Cast<UDialogueGraphNode>(GraphNode))\n\t{\n\t\tDialogueGraphNode->UpdateEdgesFromDialogueNode();\n\t}\n}\n\nUEdGraph* FDlgDialogueEditorAccess::CreateNewDialogueGraph(UDlgDialogue* Dialogue) const\n{\n\tUDialogueGraph* DialogueGraph = CastChecked<UDialogueGraph>(FDialogueEditorUtilities::CreateNewGraph(Dialogue, NAME_None,\n\t\t\t\t\t\t\t\t\t\tUDialogueGraph::StaticClass(), UDialogueGraphSchema::StaticClass()));\n\tDialogueGraph->bAllowDeletion = false;\n\n\treturn CastChecked<UEdGraph>(DialogueGraph);\n}\n\n/** Compiles the dialogue nodes from the graph nodes. Meaning it transforms the graph data -> (into) dialogue data. */\nvoid FDlgDialogueEditorAccess::CompileDialogueNodesFromGraphNodes(UDlgDialogue* Dialogue) const\n{\n\tFCompilerResultsLog MessageLog;\n\tconst UDlgSystemSettings* Settings = GetDefault<UDlgSystemSettings>();\n\tFDialogueCompilerContext CompilerContext(Dialogue, Settings, MessageLog);\n\tCompilerContext.Compile();\n\t//FDialogueEditorUtilities::RefreshDetailsView(Dialogue->GetGraph(), true);\n}\n\n/** Removes all nodes from the graph. */\nvoid FDlgDialogueEditorAccess::RemoveAllGraphNodes(UDlgDialogue* Dialogue) const\n{\n\tCastChecked<UDialogueGraph>(Dialogue->GetGraph())->RemoveAllNodes();\n\n\t// Clear the references from the Dialogue Nodes\n\tDialogue->GetMutableStartNode()->ClearGraphNode();\n\tconst TArray<UDlgNode*>& Nodes = Dialogue->GetNodes();\n\tconst int32 NodesNum = Nodes.Num();\n\tfor (int32 NodeIndex = 0; NodeIndex < NodesNum; NodeIndex++)\n\t{\n\t\tNodes[NodeIndex]->ClearGraphNode();\n\t}\n}\n\n/** Updates the Dialogue to match the version UseOnlyOneOutputAndInputPin */\nvoid FDlgDialogueEditorAccess::UpdateDialogueToVersion_UseOnlyOneOutputAndInputPin(UDlgDialogue* Dialogue) const\n{\n\tDialogue->DisableCompileDialogue();\n\tUDialogueGraph* DialogueGraph = CastChecked<UDialogueGraph>(Dialogue->GetGraph());\n\tconst TArray<UDialogueGraphNode*> DialogueGraphNodes = DialogueGraph->GetAllDialogueGraphNodes();\n\n\t// Array that maps from Index (in DialogueGraphNodes) => Array of old pins\n\tTArray<TArray<UEdGraphPin*>> OldPinsMap;\n\n\t// Step 1. Copy all of the pins from the graph nodes, and create new input/output pin\n\tfor (int32 GraphNodeIndex = 0, GraphNodesNum = DialogueGraphNodes.Num(); GraphNodeIndex < GraphNodesNum; GraphNodeIndex++)\n\t{\n\t\tUDialogueGraphNode* GraphNode = DialogueGraphNodes[GraphNodeIndex];\n\t\t// Assume we do not have any invalid edges\n\t\tcheck(GraphNode->GetDialogueNode().GetNodeOpenChildren_DEPRECATED().Num() == 0)\n\t\tOldPinsMap.Add(GraphNode->Pins);\n\t\tGraphNode->Pins.Empty();\n\t\t// Creates the new input and output pin\n\t\tGraphNode->AllocateDefaultPins();\n\n\t\t// Clean comment if it is only a digit, from this version there is a nice widget overlay that shows the index ;)\n\t\tif (GraphNode->NodeComment.TrimStartAndEnd().IsNumeric() || GraphNode->IsRootNode())\n\t\t{\n\t\t\tGraphNode->NodeComment.Empty();\n\t\t\tGraphNode->bCommentBubbleVisible = false;\n\t\t}\n\t}\n\n\t// Step 2. Create new links\n\tfor (int32 GraphNodeIndex = 0, GraphNodesNum = DialogueGraphNodes.Num(); GraphNodeIndex < GraphNodesNum; GraphNodeIndex++)\n\t{\n\t\tUDialogueGraphNode* GraphNode = DialogueGraphNodes[GraphNodeIndex];\n\n\t\t// Convert\n\t\tfor (UEdGraphPin* OldPin : OldPinsMap[GraphNodeIndex])\n\t\t{\n\t\t\tif (OldPin->LinkedTo.Num() == 0 || OldPin->Direction == EGPD_Input)\n\t\t\t{\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tcheck(OldPin->LinkedTo.Num() == 1);\n\t\t\tcheck(OldPin->Direction == EGPD_Output);\n\n\t\t\tUDialogueGraphNode* ConnectedNode = CastChecked<UDialogueGraphNode>(OldPin->LinkedTo[0]->GetOwningNode());\n\t\t\t// Make a proxy (selectable) edge graph node\n\t\t\tUDialogueGraphNode_Edge* GraphNode_Edge =\n\t\t\t\tFDialogueEditorUtilities::SpawnGraphNodeFromTemplate<UDialogueGraphNode_Edge>(\n\t\t\t\t\tDialogueGraph, GraphNode->GetDefaultEdgePosition(), false\n\t\t\t\t);\n\t\t\tGraphNode_Edge->CreateConnections(GraphNode, ConnectedNode);\n\t\t}\n\t\tGraphNode->CheckAll();\n\t}\n\tDialogueGraph->AutoPositionGraphNodes();\n\n\t// Cleanup\n\tfor (TArray<UEdGraphPin*> OldPins : OldPinsMap)\n\t{\n\t\tfor (UEdGraphPin* OldPin : OldPins)\n\t\t{\n\t\t\tUDialogueGraphNode::DestroyPin(OldPin);\n\t\t}\n\t}\n\n\tOldPinsMap.Empty();\n\tDialogue->EnableCompileDialogue();\n\tDialogue->MarkPackageDirty();\n}\n\n\nvoid FDlgDialogueEditorAccess::SetNewOuterForObjectFromGraphNode(UObject* Object, UEdGraphNode* GraphNode) const\n{\n\tif (!Object || !GraphNode)\n\t{\n\t\treturn;\n\t}\n\n\tUDlgNode* ClosestNode = FDialogueEditorUtilities::GetClosestNodeFromGraphNode(GraphNode);\n\tif (!ClosestNode)\n\t{\n\t\treturn;\n\t}\n\n\tObject->Rename(nullptr, ClosestNode, REN_DontCreateRedirectors);\n}\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystemEditor/Private/DlgDialogueThumbnailRenderer.cpp",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#include \"DlgDialogueThumbnailRenderer.h\"\n\n#include \"CanvasTypes.h\"\n\n//////////////////////////////////////////////////////////////////////////\n// UPaperTileSetThumbnailRenderer\n\nUDlgDialogueThumbnailRenderer::UDlgDialogueThumbnailRenderer(const FObjectInitializer& ObjectInitializer)\n\t: Super(ObjectInitializer)\n{\n}\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystemEditor/Private/DlgDialogueThumbnailRenderer.h",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#pragma once\n\n#include \"ThumbnailRendering/DefaultSizedThumbnailRenderer.h\"\n\n#include \"DlgDialogueThumbnailRenderer.generated.h\"\n\n// Useful if you want to have fancy thumbnail previews.\nUCLASS()\nclass DLGSYSTEMEDITOR_API UDlgDialogueThumbnailRenderer : public UDefaultSizedThumbnailRenderer\n{\n\tGENERATED_BODY()\n\npublic:\n\tUDlgDialogueThumbnailRenderer(const FObjectInitializer& ObjectInitializer);\n\n\t// UThumbnailRenderer interface\n// #if ENGINE_MINOR_VERSION >= 25\n// \tvoid Draw(UObject* Object, int32 X, int32 Y, uint32 Width, uint32 Height, FRenderTarget* Target, FCanvas* Canvas, bool bAdditionalViewFamily) override;\n// #else\n// \tvoid Draw(UObject* Object, int32 X, int32 Y, uint32 Width, uint32 Height, FRenderTarget* Target, FCanvas* Canvas,) override;\n// #endif\n};\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystemEditor/Private/DlgSystemEditorModule.cpp",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#include \"DlgSystemEditorModule.h\"\n\n#include \"DialogueContentBrowserExtensions.h\"\n#include \"Engine/BlueprintCore.h\"\n#include \"Templates/SharedPointer.h\"\n#include \"AssetRegistryModule.h\"\n#include \"Kismet2/BlueprintEditorUtils.h\"\n#include \"WorkspaceMenuStructureModule.h\"\n#include \"WorkspaceMenuStructure.h\"\n#include \"Widgets/Docking/SDockTab.h\"\n#include \"Framework/MultiBox/MultiBoxExtender.h\"\n#include \"LevelEditor.h\"\n#include \"GenericPlatform/GenericPlatformMisc.h\"\n#include \"Editor.h\"\n#include \"Framework/MultiBox/MultiBoxBuilder.h\"\n#include \"Kismet2/KismetEditorUtilities.h\"\n#include \"K2Node_Event.h\"\n\n\n#include \"Factories/DialogueGraphFactories.h\"\n#include \"AssetTypeActions/AssetTypeActions_DlgDialogue.h\"\n#include \"AssetTypeActions/AssetTypeActions_DlgBlueprintDerived.h\"\n#include \"DialogueCommands.h\"\n#include \"DlgConstants.h\"\n#include \"DialogueEditor/Nodes/DialogueGraphNode.h\"\n#include \"DialogueBrowser/SDialogueBrowser.h\"\n#include \"DialogueSearch/DialogueSearchManager.h\"\n#include \"DialogueEditor/DetailsPanel/Dialogue_Details.h\"\n#include \"DialogueEditor/DetailsPanel/DialogueGraphNode_Details.h\"\n#include \"DialogueEditor/DetailsPanel/DialogueNode_Details.h\"\n#include \"DialogueEditor/DetailsPanel/DialogueEdge_Details.h\"\n#include \"DialogueEditor/DetailsPanel/DialogueCondition_Details.h\"\n#include \"DialogueEditor/DetailsPanel/DialogueEvent_Details.h\"\n#include \"DialogueEditor/DetailsPanel/DialogueTextArgument_Details.h\"\n#include \"DialogueEditor/DetailsPanel/DialogueSpeechSequenceEntry_Details.h\"\n#include \"DlgManager.h\"\n#include \"IDlgSystemModule.h\"\n\n#include \"IO/DlgConfigWriter.h\"\n#include \"IO/DlgConfigParser.h\"\n#include \"Logging/DlgLogger.h\"\n\n#define LOCTEXT_NAMESPACE \"DlgSystemEditor\"\n\n//////////////////////////////////////////////////////////////////////////\nDEFINE_LOG_CATEGORY(LogDlgSystemEditor)\n//////////////////////////////////////////////////////////////////////////\n\n// Just some constants\nstatic const FName DIALOGUE_BROWSER_TAB_ID(\"DialogueBrowser\");\n\nFDlgSystemEditorModule::FDlgSystemEditorModule() : DlgSystemAssetCategoryBit(EAssetTypeCategories::UI)\n{\n}\n\nvoid FDlgSystemEditorModule::StartupModule()\n{\n#if ENGINE_MINOR_VERSION >= 24\n\t// Fix blueprint Nativization https://gitlab.com/NotYetGames/DlgSystem/-/issues/28\n\tconst FString LongName = FPackageName::ConvertToLongScriptPackageName(TEXT(\"DlgSystemEditor\"));\n\tif (UPackage* Package = Cast<UPackage>(StaticFindObjectFast(UPackage::StaticClass(), nullptr, *LongName, false, false)))\n\t{\n\t\tPackage->SetPackageFlags(PKG_EditorOnly);\n\t}\n#endif\n\n\tUE_LOG(LogDlgSystemEditor, Log, TEXT(\"DlgSystemEditorModule: StartupModule\"));\n\tOnPostEngineInitHandle = FCoreDelegates::OnPostEngineInit.AddRaw(this, &Self::HandleOnPostEngineInit);\n\tOnBeginPIEHandle = FEditorDelegates::BeginPIE.AddRaw(this, &Self::HandleOnBeginPIE);\n\tOnPostPIEStartedHandle = FEditorDelegates::PostPIEStarted.AddRaw(this, &Self::HandleOnPostPIEStarted);\n\tOnEndPIEHandle = FEditorDelegates::EndPIE.AddRaw(this, &Self::HandleOnEndPIEHandle);\n\n\t// Listen for when the asset registry has finished discovering files\n\tIAssetRegistry& AssetRegistry = FModuleManager::LoadModuleChecked<FAssetRegistryModule>(NAME_MODULE_AssetRegistry).Get();\n\n\t// Register Blueprint events\n\tFKismetEditorUtilities::RegisterOnBlueprintCreatedCallback(\n\t\tthis,\n\t\tUDlgConditionCustom::StaticClass(),\n\t\tFKismetEditorUtilities::FOnBlueprintCreated::CreateRaw(this, &Self::HandleNewCustomConditionBlueprintCreated)\n\t);\n\tFKismetEditorUtilities::RegisterOnBlueprintCreatedCallback(\n\t\tthis,\n\t\tUDlgTextArgumentCustom::StaticClass(),\n\t\tFKismetEditorUtilities::FOnBlueprintCreated::CreateRaw(this, &Self::HandleNewCustomTextArgumentBlueprintCreated)\n\t);\n\tFKismetEditorUtilities::RegisterOnBlueprintCreatedCallback(\n\t\tthis,\n\t\tUDlgEventCustom::StaticClass(),\n\t\tFKismetEditorUtilities::FOnBlueprintCreated::CreateRaw(this, &Self::HandleNewCustomEventBlueprintCreated)\n\t);\n\tFKismetEditorUtilities::RegisterOnBlueprintCreatedCallback(\n\t\tthis,\n\t\tUDlgNodeData::StaticClass(),\n\t\tFKismetEditorUtilities::FOnBlueprintCreated::CreateRaw(this, &Self::HandleNewNodeDataBlueprintCreated)\n\t);\n\n\t// Register slate style overrides\n\tFDialogueStyle::Initialize();\n\n\t// Register commands\n\tFDialogueCommands::Register();\n\n\t// Register asset types, add the right click submenu\n\tIAssetTools& AssetTools = FModuleManager::LoadModuleChecked<FAssetToolsModule>(NAME_MODULE_AssetTools).Get();\n\n\t// make the DlgSystem be displayed in the filters menu and in the create new menu\n\tDlgSystemAssetCategoryBit = AssetTools.RegisterAdvancedAssetCategory(DIALOGUE_SYSTEM_MENU_CATEGORY_KEY, DIALOGUE_SYSTEM_MENU_CATEGORY_KEY_TEXT);\n\t{\n\t\tauto Action = MakeShared<FAssetTypeActions_DlgDialogue>(DlgSystemAssetCategoryBit);\n\t\tAssetTools.RegisterAssetTypeActions(Action);\n\t\tRegisteredAssetTypeActions.Add(Action);\n\t}\n\t{\n\t\tauto Action = MakeShared<FAssetTypeActions_DlgEventCustom>(DlgSystemAssetCategoryBit);\n\t\tAssetTools.RegisterAssetTypeActions(Action);\n\t\tRegisteredAssetTypeActions.Add(Action);\n\t}\n\t{\n\t\tauto Action = MakeShared<FAssetTypeActions_DlgConditionCustom>(DlgSystemAssetCategoryBit);\n\t\tAssetTools.RegisterAssetTypeActions(Action);\n\t\tRegisteredAssetTypeActions.Add(Action);\n\t}\n\t{\n\t\tauto Action = MakeShared<FAssetTypeActions_DlgTextArgumentCustom>(DlgSystemAssetCategoryBit);\n\t\tAssetTools.RegisterAssetTypeActions(Action);\n\t\tRegisteredAssetTypeActions.Add(Action);\n\t}\n\t{\n\t\tauto Action = MakeShared<FAssetTypeActions_DlgNodeData>(DlgSystemAssetCategoryBit);\n\t\tAssetTools.RegisterAssetTypeActions(Action);\n\t\tRegisteredAssetTypeActions.Add(Action);\n\t}\n\t// {\n\t// \tauto Action = MakeShared<FAssetTypeActions_DlgParticipants>(DlgSystemAssetCategoryBit);\n\t// \tAssetTools.RegisterAssetTypeActions(Action);\n\t// \tRegisteredAssetTypeActions.Add(Action);\n\t// }\n\n\t// Register the details panel customizations\n\t{\n\t\tFPropertyEditorModule& PropertyModule = FModuleManager::LoadModuleChecked<FPropertyEditorModule>(NAME_MODULE_PropertyEditor);\n\n\t\t// For classes:\n\t\t// NOTE Order of these two arrays must match\n\t\tTArray<FOnGetDetailCustomizationInstance> CustomClassLayouts = {\n\t\t\t  FOnGetDetailCustomizationInstance::CreateStatic(&FDialogue_Details::MakeInstance),\n\t\t\t  FOnGetDetailCustomizationInstance::CreateStatic(&FDialogueGraphNode_Details::MakeInstance),\n\t\t\t  FOnGetDetailCustomizationInstance::CreateStatic(&FDialogueNode_Details::MakeInstance)\n\t\t};\n\t\tRegisteredCustomClassLayouts = {\n\t\t\tUDlgDialogue::StaticClass()->GetFName(),\n\t\t\tUDialogueGraphNode::StaticClass()->GetFName(),\n\t\t\tUDlgNode::StaticClass()->GetFName()\n\t\t};\n\t\tfor (int32 i = 0; i < RegisteredCustomClassLayouts.Num(); i++)\n\t\t{\n\t\t\tPropertyModule.RegisterCustomClassLayout(RegisteredCustomClassLayouts[i], CustomClassLayouts[i]);\n\t\t}\n\n\t\t// For structs:\n\t\t// NOTE Order of these two arrays must match\n\t\tTArray<FOnGetPropertyTypeCustomizationInstance> CustomPropertyTypeLayouts = {\n\t\t\tFOnGetPropertyTypeCustomizationInstance::CreateStatic(&FDialogueEdge_Details::MakeInstance),\n\t\t\tFOnGetPropertyTypeCustomizationInstance::CreateStatic(&FDialogueCondition_Details::MakeInstance),\n\t\t\tFOnGetPropertyTypeCustomizationInstance::CreateStatic(&FDialogueEvent_Details::MakeInstance),\n\t\t\tFOnGetPropertyTypeCustomizationInstance::CreateStatic(&FDialogueSpeechSequenceEntry_Details::MakeInstance),\n\t\t\tFOnGetPropertyTypeCustomizationInstance::CreateStatic(&FDialogueTextArgument_Details::MakeInstance)\n\t\t};\n\t\tRegisteredCustomPropertyTypeLayout = {\n\t\t\tFDlgEdge::StaticStruct()->GetFName(),\n\t\t\tFDlgCondition::StaticStruct()->GetFName(),\n\t\t\tFDlgEvent::StaticStruct()->GetFName(),\n\t\t\tFDlgSpeechSequenceEntry::StaticStruct()->GetFName(),\n\t\t\tFDlgTextArgument::StaticStruct()->GetFName()\n\t\t};\n\t\tfor (int32 i = 0; i < RegisteredCustomPropertyTypeLayout.Num(); i++)\n\t\t{\n\t\t\tPropertyModule.RegisterCustomPropertyTypeLayout(RegisteredCustomPropertyTypeLayout[i], CustomPropertyTypeLayouts[i]);\n\t\t}\n\n\t\tPropertyModule.NotifyCustomizationModuleChanged();\n\t}\n\n\t// Register the thumbnail renderers\n//\tUThumbnailManager::Get().RegisterCustomRenderer(UDlgDialogue::StaticClass(), UDlgDialogueThumbnailRenderer::StaticClass());\n\n\t// Create factories\n\tDialogueGraphNodeFactory = MakeShared<FDialogueGraphNodeFactory>();\n\tFEdGraphUtilities::RegisterVisualNodeFactory(DialogueGraphNodeFactory);\n\n\tDialogueGraphPinFactory = MakeShared<FDialogueGraphPinFactory>();\n\tFEdGraphUtilities::RegisterVisualPinFactory(DialogueGraphPinFactory);\n\n\t// Bind Editor commands\n\tLevelMenuEditorCommands = MakeShared<FUICommandList>();\n\tMapActionsForFileMenuExtender(LevelMenuEditorCommands.ToSharedRef());\n\tMapActionsForHelpMenuExtender(LevelMenuEditorCommands.ToSharedRef());\n\n\t// Content Browser extension\n\tFDialogueContentBrowserExtensions::InstallHooks();\n\n\t// Extend menu/toolbar\n\tExtendMenu();\n}\n\nvoid FDlgSystemEditorModule::ShutdownModule()\n{\n\tconst FModuleManager& ModuleManger = FModuleManager::Get();\n\tif (DialogueGraphPinFactory.IsValid())\n\t{\n\t\tFEdGraphUtilities::UnregisterVisualPinFactory(DialogueGraphPinFactory);\n\t}\n\n\tif (DialogueGraphNodeFactory.IsValid())\n\t{\n\t\tFEdGraphUtilities::UnregisterVisualNodeFactory(DialogueGraphNodeFactory);\n\t}\n\n\tif (UObjectInitialized())\n\t{\n\t\t// This function may be called during shutdown to clean up your module.  For modules that support dynamic reloading,\n\t\t// we call this function before unloading the module.\n\t\tFDialogueContentBrowserExtensions::RemoveHooks();\n\t}\n\n\t// Unregister the custom details panel stuff\n\tif (ModuleManger.IsModuleLoaded(NAME_MODULE_PropertyEditor))\n\t{\n\t\tFPropertyEditorModule& PropertyModule = FModuleManager::GetModuleChecked<FPropertyEditorModule>(NAME_MODULE_PropertyEditor);\n\t\tfor (int32 i = 0; i < RegisteredCustomClassLayouts.Num(); i++)\n\t\t{\n\t\t\tPropertyModule.UnregisterCustomClassLayout(RegisteredCustomClassLayouts[i]);\n\t\t}\n\n\t\tfor (int32 i = 0; i < RegisteredCustomPropertyTypeLayout.Num(); i++)\n\t\t{\n\t\t\tPropertyModule.UnregisterCustomPropertyTypeLayout(RegisteredCustomPropertyTypeLayout[i]);\n\t\t}\n\t}\n\tRegisteredCustomClassLayouts.Empty();\n\tRegisteredCustomPropertyTypeLayout.Empty();\n\n\t// Unregister all the asset types that we registered\n\tif (ModuleManger.IsModuleLoaded(NAME_MODULE_AssetTools))\n\t{\n\t\tIAssetTools& AssetTools = FModuleManager::GetModuleChecked<FAssetToolsModule>(NAME_MODULE_AssetTools).Get();\n\t\tfor (auto TypeAction : RegisteredAssetTypeActions)\n\t\t{\n\t\t\tAssetTools.UnregisterAssetTypeActions(TypeAction.ToSharedRef());\n\t\t}\n\t}\n\tRegisteredAssetTypeActions.Empty();\n\n\t// unregister commands\n\tFDialogueCommands::Unregister();\n\n\t// Unregister slate style overrides\n\tFDialogueStyle::Shutdown();\n\n\t// Unregister the Dialogue Browser\n\tFGlobalTabmanager::Get()->UnregisterNomadTabSpawner(DIALOGUE_BROWSER_TAB_ID);\n\n\t// Unregister the Dialogue Search\n\tFDialogueSearchManager::Get()->DisableGlobalFindResults();\n\n\tif (OnBeginPIEHandle.IsValid())\n\t{\n\t\tFEditorDelegates::BeginPIE.Remove(OnBeginPIEHandle);\n\t}\n\tif (OnPostPIEStartedHandle.IsValid())\n\t{\n\t\tFEditorDelegates::PostPIEStarted.Remove(OnPostPIEStartedHandle);\n\t}\n\tif (OnEndPIEHandle.IsValid())\n\t{\n\t\tFEditorDelegates::EndPIE.Remove(OnEndPIEHandle);\n\t}\n\tif (OnPostEngineInitHandle.IsValid())\n\t{\n\t\tFCoreDelegates::OnPostEngineInit.Remove(OnPostEngineInitHandle);\n\t}\n\n\tUE_LOG(LogDlgSystemEditor, Log, TEXT(\"DlgSystemEditorModule: ShutdownModule\"));\n}\n\nvoid FDlgSystemEditorModule::HandleOnSaveAllDialogues()\n{\n\tconst EAppReturnType::Type Response = FPlatformMisc::MessageBoxExt(EAppMsgType::YesNo,\n\t\tTEXT(\"Save all Dialogue assets/files? This will save both the .uasset and the text files depending on the TextFormat from the Dialogue Settings.\"),\n\t\tTEXT(\"Save Dialogues?\")\n\t);\n\tif (Response == EAppReturnType::No)\n\t{\n\t\treturn;\n\t}\n\n\tif (!FDialogueEditorUtilities::SaveAllDialogues())\n\t{\n\t\tUE_LOG(LogDlgSystemEditor, Error, TEXT(\"Failed To save all Dialogues. An error occurred.\"));\n\t}\n}\n\nvoid FDlgSystemEditorModule::HandleOnDeleteAllDialoguesTextFiles()\n{\n\tconst TSet<FString> AllFileExtensions = GetDefault<UDlgSystemSettings>()->GetAllTextFileExtensions();\n\tconst FString StringAllFileExtensions = FString::Join(AllFileExtensions, TEXT(\",\"));\n\tconst FString Text = FString::Printf(\n\t\tTEXT(\"Delete all Dialogues text files? Delete all dialogues text files on the disk with the following extensions: %s\"),\n\t\t*StringAllFileExtensions\n\t);\n\n\tconst EAppReturnType::Type Response = FPlatformMisc::MessageBoxExt(EAppMsgType::YesNo, *Text, TEXT(\"Delete All Dialogues text files?\"));\n\tif (Response == EAppReturnType::No)\n\t{\n\t\treturn;\n\t}\n\n\tif (!FDialogueEditorUtilities::DeleteAllDialoguesTextFiles())\n\t{\n\t\tUE_LOG(LogDlgSystemEditor, Error, TEXT(\"Failed To delete all Dialogues text files. An error occurred.\"));\n\t}\n}\n\n\n\nvoid FDlgSystemEditorModule::HandleOnPostEngineInit()\n{\n\tbIsEngineInitialized = true;\n\tUE_LOG(LogDlgSystemEditor, Log, TEXT(\"DlgSystemEditorModule::HandleOnPostEngineInit\"));\n}\n\nvoid FDlgSystemEditorModule::HandleOnBeginPIE(bool bIsSimulating)\n{\n}\n\nvoid FDlgSystemEditorModule::HandleOnPostPIEStarted(bool bIsSimulating)\n{\n\tconst UDlgSystemSettings* Settings = GetDefault<UDlgSystemSettings>();\n\tif (!Settings)\n\t{\n\t\treturn;\n\t}\n\n\tif (Settings->bClearDialogueHistoryAutomatically)\n\t{\n\t\tFDlgLogger::Get().Debugf(TEXT(\"BeginPIE(bIsSimulating = %d). Clearing Dialogue History\"), bIsSimulating);\n\t\tUDlgManager::ClearDialogueHistory();\n\t}\n\n\tif (Settings->bRegisterDialogueConsoleCommandsAutomatically)\n\t{\n\t\tFDlgLogger::Get().Debugf(TEXT(\"BeginPIE(bIsSimulating = %d). Registering Console commands\"), bIsSimulating);\n\t\tUDlgManager::RegisterDialogueConsoleCommands();\n\t}\n}\n\nvoid FDlgSystemEditorModule::HandleOnEndPIEHandle(bool bIsSimulating)\n{\n\tconst UDlgSystemSettings* Settings = GetDefault<UDlgSystemSettings>();\n\tif (!Settings)\n\t{\n\t\treturn;\n\t}\n\n\tif (Settings->bRegisterDialogueConsoleCommandsAutomatically)\n\t{\n\t\tFDlgLogger::Get().Debugf(TEXT(\"EndPIE(bIsSimulating = %d). Unregistering Console commands\"), bIsSimulating);\n\t\tUDlgManager::UnregisterDialogueConsoleCommands();\n\t}\n}\n\nvoid FDlgSystemEditorModule::HandleNewCustomConditionBlueprintCreated(UBlueprint* Blueprint)\n{\n\tif (!Blueprint || Blueprint->BlueprintType != BPTYPE_Normal)\n\t{\n\t\treturn;\n\t}\n\n\tBlueprint->bForceFullEditor = true;\n\tUEdGraph* FunctionGraph = FDialogueEditorUtilities::BlueprintGetOrAddFunction(\n\t\tBlueprint,\n\t\tGET_FUNCTION_NAME_CHECKED(UDlgConditionCustom, IsConditionMet),\n\t\tUDlgConditionCustom::StaticClass()\n\t);\n\tif (FunctionGraph)\n\t{\n\t\tBlueprint->LastEditedDocuments.Add(FunctionGraph);\n\t}\n}\n\nvoid FDlgSystemEditorModule::HandleNewCustomTextArgumentBlueprintCreated(UBlueprint* Blueprint)\n{\n\tif (!Blueprint || Blueprint->BlueprintType != BPTYPE_Normal)\n\t{\n\t\treturn;\n\t}\n\n\tBlueprint->bForceFullEditor = true;\n\tUEdGraph* FunctionGraph = FDialogueEditorUtilities::BlueprintGetOrAddFunction(\n\t\tBlueprint,\n\t\tGET_FUNCTION_NAME_CHECKED(UDlgTextArgumentCustom, GetText),\n\t\tUDlgTextArgumentCustom::StaticClass()\n\t);\n\tif (FunctionGraph)\n\t{\n\t\tBlueprint->LastEditedDocuments.Add(FunctionGraph);\n\t}\n}\n\nvoid FDlgSystemEditorModule::HandleNewCustomEventBlueprintCreated(UBlueprint* Blueprint)\n{\n\tif (!Blueprint || Blueprint->BlueprintType != BPTYPE_Normal)\n\t{\n\t\treturn;\n\t}\n\n\tBlueprint->bForceFullEditor = true;\n\tUK2Node_Event* EventNode = FDialogueEditorUtilities::BlueprintGetOrAddEvent(\n\t\tBlueprint,\n\t\tGET_FUNCTION_NAME_CHECKED(UDlgEventCustom, EnterEvent),\n\t\tUDlgEventCustom::StaticClass()\n\t);\n\tif (EventNode)\n\t{\n\t\tBlueprint->LastEditedDocuments.Add(EventNode->GetGraph());\n\t}\n}\n\nvoid FDlgSystemEditorModule::HandleNewNodeDataBlueprintCreated(UBlueprint* Blueprint)\n{\n\tif (!Blueprint || Blueprint->BlueprintType != BPTYPE_Normal)\n\t{\n\t\treturn;\n\t}\n\n\tFDialogueEditorUtilities::BlueprintAddComment(Blueprint, TEXT(\"Add you own variables to see them in the Dialogue Editor\"));\n}\n\nvoid FDlgSystemEditorModule::ExtendMenu()\n{\n\t// Running in game mode (standalone game) exit as we can't get the LevelEditorModule.\n\tif (IsRunningGame() || IsRunningCommandlet())\n\t{\n\t\treturn;\n\t}\n\n\t// File and Help Menu Extenders\n\t{\n\t\tconst TSharedRef<FExtender> FileMenuExtender = CreateFileMenuExtender(LevelMenuEditorCommands.ToSharedRef());\n\t\tconst TSharedRef<FExtender> HelpMenuExtender = CreateHelpMenuExtender(LevelMenuEditorCommands.ToSharedRef());\n\n\t\t// Add to the level editor\n\t\tFLevelEditorModule& LevelEditorModule = FModuleManager::LoadModuleChecked<FLevelEditorModule>(NAME_MODULE_LevelEditor);\n\t\tLevelEditorModule.GetMenuExtensibilityManager()->AddExtender(FileMenuExtender);\n\t\tLevelEditorModule.GetMenuExtensibilityManager()->AddExtender(HelpMenuExtender);\n\t}\n\n\t// Window -> Dialogue search, Dialogue Browse, Dialogue Data Display\n\t{\n\t\tToolsDialogueCategory = WorkspaceMenu::GetMenuStructure().GetStructureRoot()\n\t\t\t->AddGroup(\n\t\t\t\tLOCTEXT(\"WorkspaceMenu_DialogueCategory\", \"Dialogue\" ),\n\t\t\t\tFSlateIcon(\n\t\t\t\t\tFDialogueStyle::GetStyleSetName(),\n\t\t\t\t\tFDialogueStyle::PROPERTY_DlgDialogueClassIcon\n\t\t\t\t),\n\t\t\t\tfalse\n\t\t\t);\n\n\t\t// Register the Dialogue Overview Browser\n\t\tFGlobalTabmanager::Get()->RegisterNomadTabSpawner(DIALOGUE_BROWSER_TAB_ID,\n\t\t\tFOnSpawnTab::CreateLambda([this](const FSpawnTabArgs& Args) -> TSharedRef<SDockTab>\n\t\t\t{\n\t\t\t\tconst TSharedRef<SDockTab> DockTab = SNew(SDockTab)\n\t\t\t\t\t.TabRole(ETabRole::NomadTab)\n\t\t\t\t\t[\n\t\t\t\t\t\tSNew(SDialogueBrowser)\n\t\t\t\t\t];\n\t\t\t\treturn DockTab;\n\t\t\t}))\n\t\t\t.SetDisplayName(LOCTEXT(\"DialogueBrowserTabTitle\", \"Dialogue Browser\"))\n\t\t\t.SetTooltipText(LOCTEXT(\"DialogueBrowserTooltipText\", \"Open the Dialogue Overview Browser tab.\"))\n\t\t\t.SetIcon(FSlateIcon(FDialogueStyle::GetStyleSetName(), FDialogueStyle::PROPERTY_DialogueBrowser_TabIcon))\n\t\t\t.SetGroup(ToolsDialogueCategory.ToSharedRef());\n\n\t\t// Register the Dialogue Search\n\t\tFDialogueSearchManager::Get()->Initialize(ToolsDialogueCategory);\n\n\t\t// Register the Dialogue Data Display\n\t\tFTabSpawnerEntry* TabDialogueDataDisplay = IDlgSystemModule::Get().GetDialogueDataDisplaySpawnEntry();\n\t\tTabDialogueDataDisplay->SetGroup(ToolsDialogueCategory.ToSharedRef());\n\t\tTabDialogueDataDisplay->SetIcon(FSlateIcon(FDialogueStyle::GetStyleSetName(), FDialogueStyle::PROPERTY_DialogueDataDisplay_TabIcon));\n\t}\n}\n\nTSharedRef<FExtender> FDlgSystemEditorModule::CreateFileMenuExtender(\n\tTSharedRef<FUICommandList> Commands,\n\tconst TArray<TSharedPtr<FUICommandInfo>>& AdditionalMenuEntries\n)\n{\n\t// Fill after the File->FileLoadAndSave\n\tTSharedRef<FExtender> FileMenuExtender(new FExtender);\n\tFileMenuExtender->AddMenuExtension(\n\t\t\"FileLoadAndSave\",\n\t\tEExtensionHook::After,\n\t\tCommands,\n\t\tFMenuExtensionDelegate::CreateLambda([AdditionalMenuEntries](FMenuBuilder& MenuBuilder)\n\t\t{\n\t\t\t// Save Dialogues\n\t\t\tMenuBuilder.BeginSection(\"Dialogue\", LOCTEXT(\"DialogueMenuKeyCategory\", \"Dialogue\"));\n\t\t\t{\n\t\t\t\tMenuBuilder.AddMenuEntry(FDialogueCommands::Get().SaveAllDialogues);\n\t\t\t\tMenuBuilder.AddMenuEntry(FDialogueCommands::Get().DeleteAllDialoguesTextFiles);\n\t\t\t\tMenuBuilder.AddMenuSeparator();\n\t\t\t\tfor (auto& MenuEntry : AdditionalMenuEntries)\n\t\t\t\t{\n\t\t\t\t\tMenuBuilder.AddMenuEntry(MenuEntry);\n\t\t\t\t}\n\t\t\t}\n\t\t\tMenuBuilder.EndSection();\n\t\t})\n\t);\n\n\treturn FileMenuExtender;\n}\n\nTSharedRef<FExtender> FDlgSystemEditorModule::CreateHelpMenuExtender(TSharedRef<FUICommandList> Commands)\n{\n\t// Fill before the Help->BugReporting\n\t// NOTE: Don't use HelpBrowse as that does not exist in later engine version\n\t// https://gitlab.com/NotYetGames/DlgSystem/-/issues/36\n\tTSharedRef<FExtender> HelpMenuExtender(new FExtender);\n\tHelpMenuExtender->AddMenuExtension(\n\t\t\"BugReporting\",\n\t\tEExtensionHook::Before,\n\t\tCommands,\n\t\tFMenuExtensionDelegate::CreateLambda([](FMenuBuilder& MenuBuilder)\n\t\t{\n\t\t\t// Save Dialogues\n\t\t\tMenuBuilder.BeginSection(\"Dialogue\", LOCTEXT(\"DialogueMenuKeyCategory\", \"Dialogue\"));\n\t\t\t{\n\t\t\t\tMenuBuilder.AddMenuEntry(FDialogueCommands::Get().OpenNotYetPlugins);\n\t\t\t\tMenuBuilder.AddMenuEntry(FDialogueCommands::Get().OpenMarketplace);\n\t\t\t\tMenuBuilder.AddMenuEntry(FDialogueCommands::Get().OpenWiki);\n\t\t\t\tMenuBuilder.AddMenuEntry(FDialogueCommands::Get().OpenDiscord);\n\t\t\t\tMenuBuilder.AddMenuEntry(FDialogueCommands::Get().OpenForum);\n\t\t\t}\n\t\t\tMenuBuilder.EndSection();\n\t\t})\n\t);\n\n\treturn HelpMenuExtender;\n}\n\nvoid FDlgSystemEditorModule::MapActionsForFileMenuExtender(TSharedRef<FUICommandList> Commands)\n{\n\tCommands->MapAction(\n\t\tFDialogueCommands::Get().SaveAllDialogues,\n\t\tFExecuteAction::CreateStatic(&Self::HandleOnSaveAllDialogues)\n\t);\n\tCommands->MapAction(\n\t\tFDialogueCommands::Get().DeleteAllDialoguesTextFiles,\n\t\tFExecuteAction::CreateStatic(&Self::HandleOnDeleteAllDialoguesTextFiles)\n\t);\n}\n\nvoid FDlgSystemEditorModule::MapActionsForHelpMenuExtender(TSharedRef<FUICommandList> Commands)\n{\n\tconst UDlgSystemSettings& Settings = *GetDefault<UDlgSystemSettings>();\n\tCommands->MapAction(\n\t\tFDialogueCommands::Get().OpenNotYetPlugins,\n\t\tFExecuteAction::CreateLambda([&Settings]()\n\t\t{\n\t\t\tFPlatformProcess::LaunchURL(*Settings.URLNotYetPlugins, nullptr, nullptr );\n\t\t})\n\t);\n\tCommands->MapAction(\n\t\tFDialogueCommands::Get().OpenMarketplace,\n\t\tFExecuteAction::CreateLambda([&Settings]()\n\t\t{\n\t\t\tFPlatformProcess::LaunchURL(*Settings.URLMarketplace, nullptr, nullptr );\n\t\t})\n\t);\n\tCommands->MapAction(\n\t\tFDialogueCommands::Get().OpenDiscord,\n\t\tFExecuteAction::CreateLambda([&Settings]()\n\t\t{\n\t\t\tFPlatformProcess::LaunchURL(*Settings.URLDiscord, nullptr, nullptr );\n\t\t})\n\t);\n\tCommands->MapAction(\n\t\tFDialogueCommands::Get().OpenForum,\n\t\tFExecuteAction::CreateLambda([&Settings]()\n\t\t{\n\t\t\tFPlatformProcess::LaunchURL(*Settings.URLForum, nullptr, nullptr );\n\t\t})\n\t);\n\tCommands->MapAction(\n\t\tFDialogueCommands::Get().OpenWiki,\n\t\tFExecuteAction::CreateLambda([&Settings]()\n\t\t{\n\t\t\tFPlatformProcess::LaunchURL(*Settings.URLWiki, nullptr, nullptr );\n\t\t})\n\t);\n}\n\n#undef LOCTEXT_NAMESPACE\n\n//////////////////////////////////////////////////////////////////////////\nIMPLEMENT_MODULE(FDlgSystemEditorModule, DlgSystemEditor)\n//////////////////////////////////////////////////////////////////////////\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystemEditor/Private/Factories/DialogueClassViewerFilters.h",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#pragma once\n\n#include \"ClassViewerFilter.h\"\n\n\n// Filter used in the class picker to only show non abstract children of class\nclass FDialogueChildrenOfClassFilterViewer : public IClassViewerFilter\n{\npublic:\n\t// All children of these classes will be included unless filtered out by another setting.\n\tTSet<const UClass*> AllowedChildrenOfClasses;\n\n\tbool IsClassAllowed(const FClassViewerInitializationOptions& InInitOptions, const UClass* InClass,\n\t\tTSharedRef<FClassViewerFilterFuncs> InFilterFuncs) override\n\t{\n\t\treturn !InClass->HasAnyClassFlags(DisallowedClassFlags)\n\t\t\t&& InFilterFuncs->IfInChildOfClassesSet(AllowedChildrenOfClasses, InClass) != EFilterReturn::Failed;\n\t}\n\n\tbool IsUnloadedClassAllowed(const FClassViewerInitializationOptions& InInitOptions,\n\t\tconst TSharedRef<const IUnloadedBlueprintData > InUnloadedClassData,\n\t\tTSharedRef< FClassViewerFilterFuncs > InFilterFuncs) override\n\t{\n\t\treturn !InUnloadedClassData->HasAnyClassFlags(DisallowedClassFlags)\n\t\t\t&& InFilterFuncs->IfInChildOfClassesSet(AllowedChildrenOfClasses, InUnloadedClassData) != EFilterReturn::Failed;\n\t}\n\nprivate:\n\t// Disallowed class flags.\n\tEClassFlags DisallowedClassFlags = CLASS_Deprecated;\n};\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystemEditor/Private/Factories/DialogueGraphFactories.cpp",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#include \"DialogueGraphFactories.h\"\n\n#include \"K2Node.h\"\n\n#include \"DialogueEditor/Nodes/DialogueGraphNode_Base.h\"\n#include \"DialogueEditor/Nodes/DialogueGraphNode_Edge.h\"\n#include \"DialogueEditor/Nodes/DialogueGraphNode_Root.h\"\n#include \"DialogueEditor/Nodes/SDialogueGraphNode.h\"\n#include \"DialogueEditor/Nodes/SDialogueGraphNode_Root.h\"\n#include \"DialogueEditor/Nodes/SDialogueGraphNode_Edge.h\"\n#include \"DialogueEditor/Nodes/SDialogueGraphPin.h\"\n#include \"BlueprintNodes/DialogueK2Node_Select.h\"\n#include \"BlueprintNodes/SGraphNode_DialogueK2Select.h\"\n#include \"BlueprintNodes/SGraphNode_DialogueK2Switch.h\"\n#include \"BlueprintNodes/DialogueK2Node_SwitchDialogueCallback.h\"\n\nTSharedPtr<class SGraphNode> FDialogueGraphNodeFactory::CreateNode(class UEdGraphNode* InNode) const\n{\n\t// Dialogue Editor Nodes\n\tif (UDialogueGraphNode_Base* DialogueNode_Base = Cast<UDialogueGraphNode_Base>(InNode))\n\t{\n\t\t// Nodes\n\t\tif (UDialogueGraphNode* DialogueNode = Cast<UDialogueGraphNode>(DialogueNode_Base))\n\t\t{\n\t\t\tif (UDialogueGraphNode_Root* DialogueStartNode = Cast<UDialogueGraphNode_Root>(DialogueNode))\n\t\t\t{\n\t\t\t\treturn SNew(SDialogueGraphNode_Root, DialogueStartNode);\n\t\t\t}\n\n\t\t\treturn SNew(SDialogueGraphNode, DialogueNode);\n\t\t}\n\n\t\t// Edge\n\t\tif (UDialogueGraphNode_Edge* DialogueEdge = Cast<UDialogueGraphNode_Edge>(DialogueNode_Base))\n\t\t{\n\t\t\treturn SNew(SDialogueGraphNode_Edge, DialogueEdge);\n\t\t}\n\t}\n\n\t// Blueprint Editor Nodes\n\tif (UK2Node* BlueprintNode_Base = Cast<UK2Node>(InNode))\n\t{\n\t\tif (UDialogueK2Node_Select* BlueprintDialogueSelectNode = Cast<UDialogueK2Node_Select>(BlueprintNode_Base))\n\t\t{\n\t\t\treturn SNew(SGraphNode_DialogueK2Select, BlueprintDialogueSelectNode);\n\t\t}\n\n\t\tif (UDialogueK2Node_SwitchDialogueCallback* BlueprintDialogueSwitchNode = Cast<UDialogueK2Node_SwitchDialogueCallback>(BlueprintNode_Base))\n\t\t{\n\t\t\treturn SNew(SGraphNode_DialogueK2Switch, BlueprintDialogueSwitchNode);\n\t\t}\n\t}\n\n\treturn nullptr;\n}\n\nTSharedPtr<class SGraphPin> FDialogueGraphPinFactory::CreatePin(class UEdGraphPin* Pin) const\n{\n\tif (Pin->GetSchema()->IsA<UDialogueGraphSchema>())\n\t{\n\t\treturn SNew(SDialogueGraphPin, Pin);\n\t}\n\n\treturn nullptr;\n}\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystemEditor/Private/Factories/DialogueGraphFactories.h",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#pragma once\n\n#include \"EdGraphUtilities.h\"\n\n// Factory for creating Dialogue graph nodes\n// WARNING: UEdGraphNode::CreateVisualWidget has priority over this, see FNodeFactory::CreateNodeWidget\nstruct FDialogueGraphNodeFactory : public FGraphPanelNodeFactory\n{\n\tTSharedPtr<class SGraphNode> CreateNode(class UEdGraphNode* InNode) const override;\n};\n\n// Factory  for creating pin widgets\n// This is the highest priority creator, see FNodeFactory::CreatePinWidget\nstruct FDialogueGraphPinFactory : public FGraphPanelPinFactory\n{\npublic:\n\tTSharedPtr<class SGraphPin> CreatePin(class UEdGraphPin* Pin) const override;\n};\n\n// Factory for creating the drawing policy between nodes.\n// Defined in UDialogueGraphSchema::CreateConnectionDrawingPolicy which has priority over FGraphPanelPinConnectionFactory,\n// see FNodeFactory::CreateConnectionPolicy\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystemEditor/Private/Factories/DlgConditionCustomFactory.cpp",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#include \"DlgConditionCustomFactory.h\"\n\n\n#include \"DialogueEditorUtilities.h\"\n#include \"DlgConditionCustom.h\"\n#include \"Kismet2/KismetEditorUtilities.h\"\n#include \"Misc/MessageDialog.h\"\n\n#define LOCTEXT_NAMESPACE \"DlgSystem\"\n\n/////////////////////////////////////////////////////\n// UDlgConditionCustomFactory\nUDlgConditionCustomFactory::UDlgConditionCustomFactory(const FObjectInitializer& ObjectInitializer)\n\t: Super(ObjectInitializer)\n{\n\tbCreateNew = true;\n\n\t// true if the associated editor should be opened after creating a new object.\n\tbEditAfterNew = false;\n\tSupportedClass = UDlgConditionCustom::StaticClass();\n\n\t// Default class\n\tParentClass = SupportedClass;\n}\n\nbool UDlgConditionCustomFactory::ConfigureProperties()\n{\n\tstatic const FText TitleText = FText::FromString(TEXT(\"Pick Parent Class for Custom Condition\"));\n\tParentClass = nullptr;\n\n\tUClass* ChosenClass = nullptr;\n\tconst bool bPressedOk = FDialogueEditorUtilities::PickChildrenOfClass(TitleText, ChosenClass, SupportedClass);\n\tif (bPressedOk)\n\t{\n\t\tParentClass = ChosenClass;\n\t}\n\n\treturn bPressedOk;\n}\n\nUObject* UDlgConditionCustomFactory::FactoryCreateNew(\n\tUClass* Class,\n\tUObject* InParent,\n\tFName Name,\n\tEObjectFlags Flags,\n\tUObject* Context,\n\tFFeedbackContext* Warn\n)\n{\n\t// Something wrong happened\n\tif (ParentClass == nullptr || !FKismetEditorUtilities::CanCreateBlueprintOfClass(ParentClass))\n\t{\n\t\tFFormatNamedArguments Args;\n\t\tArgs.Add(TEXT(\"ClassName\"), ParentClass ? FText::FromString(ParentClass->GetName()) : NSLOCTEXT(\"UnrealEd\", \"Null\", \"(null)\"));\n\t\tFMessageDialog::Open(EAppMsgType::Ok, FText::Format(NSLOCTEXT(\"UnrealEd\", \"CannotCreateBlueprintFromClass\", \"Cannot create a blueprint based on the class '{0}'.\"), Args));\n\t\treturn nullptr;\n\t}\n\n\t// Create\n\treturn FKismetEditorUtilities::CreateBlueprint(\n\t\tParentClass,\n\t\tInParent,\n\t\tName,\n\t\tBPTYPE_Normal,\n\t\tUBlueprint::StaticClass(),\n\t\tUBlueprintGeneratedClass::StaticClass(),\n\t\tNAME_None\n\t);\n}\n\n#undef LOCTEXT_NAMESPACE\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystemEditor/Private/Factories/DlgConditionCustomFactory.h",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#pragma once\n\n#include \"Factories/Factory.h\"\n\n#include \"DlgConditionCustomFactory.generated.h\"\n\nclass UDlgConditionCustom;\n\nUCLASS()\nclass DLGSYSTEMEDITOR_API UDlgConditionCustomFactory : public UFactory\n{\n\tGENERATED_BODY()\n\npublic:\n\tUDlgConditionCustomFactory(const FObjectInitializer& ObjectInitializer);\n\n\t//\n\t// UFactory interface\n\t//\n\n\tbool ConfigureProperties() override;\n\tUObject* FactoryCreateNew(\n\t\tUClass* Class,\n\t\tUObject* InParent,\n\t\tFName Name,\n\t\tEObjectFlags Flags,\n\t\tUObject* Context,\n\t\tFFeedbackContext* Warn\n\t) override;\n\nprivate:\n\t// Holds the template of the class we are building\n\tUPROPERTY()\n\tTSubclassOf<UDlgConditionCustom> ParentClass;\n};\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystemEditor/Private/Factories/DlgDialogueFactory.cpp",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#include \"DlgDialogueFactory.h\"\n\n#include \"DlgDialogue.h\"\n\n#define LOCTEXT_NAMESPACE \"DlgSystem\"\n\n/////////////////////////////////////////////////////\n// UDlgDialogueFactory\nUDlgDialogueFactory::UDlgDialogueFactory(const FObjectInitializer& ObjectInitializer)\n\t: Super(ObjectInitializer)\n{\n\tbCreateNew = true;\n\n\t// true if the associated editor should be opened after creating a new object.\n\tbEditAfterNew = true;\n\tSupportedClass = UDlgDialogue::StaticClass();\n}\n\nUObject* UDlgDialogueFactory::FactoryCreateNew(\n\tUClass* Class,\n\tUObject* InParent,\n\tFName Name,\n\tEObjectFlags Flags,\n\tUObject* Context,\n\tFFeedbackContext* Warn\n)\n{\n\tUDlgDialogue* NewDialogue = NewObject<UDlgDialogue>(InParent, Class, Name, Flags | RF_Transactional);\n\treturn NewDialogue;\n}\n\n#undef LOCTEXT_NAMESPACE\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystemEditor/Private/Factories/DlgDialogueFactory.h",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#pragma once\n\n#include \"Factories/Factory.h\"\n\n#include \"DlgDialogueFactory.generated.h\"\n\n/**\n * Factory for dialogues. Editor does the magic here, without this class,\n * you won't have the right click \"Dialog System\" -> \"Dialogue\"\n */\nUCLASS()\nclass DLGSYSTEMEDITOR_API UDlgDialogueFactory : public UFactory\n{\n\tGENERATED_BODY()\n\npublic:\n\tUDlgDialogueFactory(const FObjectInitializer& ObjectInitializer);\n\n\t//\n\t// UFactory interface\n\t//\n\tUObject* FactoryCreateNew(\n\t\tUClass* Class,\n\t\tUObject* InParent,\n\t\tFName Name,\n\t\tEObjectFlags Flags,\n\t\tUObject* Context,\n\t\tFFeedbackContext* Warn\n\t) override;\n};\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystemEditor/Private/Factories/DlgEventCustomFactory.cpp",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#include \"DlgEventCustomFactory.h\"\n\n#include \"DialogueEditorUtilities.h\"\n#include \"DlgEventCustom.h\"\n#include \"Kismet2/KismetEditorUtilities.h\"\n#include \"Misc/MessageDialog.h\"\n\n#define LOCTEXT_NAMESPACE \"DlgSystem\"\n\n/////////////////////////////////////////////////////\n// UDlgEventCustomFactory\nUDlgEventCustomFactory::UDlgEventCustomFactory(const FObjectInitializer& ObjectInitializer)\n\t: Super(ObjectInitializer)\n{\n\tbCreateNew = true;\n\n\t// true if the associated editor should be opened after creating a new object.\n\tbEditAfterNew = false;\n\tSupportedClass = UDlgEventCustom::StaticClass();\n\n\t// Default class\n\tParentClass = SupportedClass;\n}\n\nbool UDlgEventCustomFactory::ConfigureProperties()\n{\n\tstatic const FText TitleText = FText::FromString(TEXT(\"Pick Parent Class for Custom Event\"));\n\tParentClass = nullptr;\n\n\tUClass* ChosenClass = nullptr;\n\tconst bool bPressedOk = FDialogueEditorUtilities::PickChildrenOfClass(TitleText, ChosenClass, SupportedClass);\n\tif (bPressedOk)\n\t{\n\t\tParentClass = ChosenClass;\n\t}\n\n\treturn bPressedOk;\n}\n\nUObject* UDlgEventCustomFactory::FactoryCreateNew(\n\tUClass* Class,\n\tUObject* InParent,\n\tFName Name,\n\tEObjectFlags Flags,\n\tUObject* Context,\n\tFFeedbackContext* Warn\n)\n{\n\t// Something wrong happened\n\tif (ParentClass == nullptr || !FKismetEditorUtilities::CanCreateBlueprintOfClass(ParentClass))\n\t{\n\t\tFFormatNamedArguments Args;\n\t\tArgs.Add(TEXT(\"ClassName\"), ParentClass ? FText::FromString(ParentClass->GetName()) : NSLOCTEXT(\"UnrealEd\", \"Null\", \"(null)\"));\n\t\tFMessageDialog::Open(EAppMsgType::Ok, FText::Format(NSLOCTEXT(\"UnrealEd\", \"CannotCreateBlueprintFromClass\", \"Cannot create a blueprint based on the class '{0}'.\"), Args));\n\t\treturn nullptr;\n\t}\n\n\t// Create\n\treturn FKismetEditorUtilities::CreateBlueprint(\n\t\tParentClass,\n\t\tInParent,\n\t\tName,\n\t\tBPTYPE_Normal,\n\t\tUBlueprint::StaticClass(),\n\t\tUBlueprintGeneratedClass::StaticClass(),\n\t\tNAME_None\n\t);\n}\n\n#undef LOCTEXT_NAMESPACE\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystemEditor/Private/Factories/DlgEventCustomFactory.h",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#pragma once\n\n#include \"Factories/Factory.h\"\n\n#include \"DlgEventCustomFactory.generated.h\"\n\nclass UDlgEventCustom;\n\nUCLASS()\nclass DLGSYSTEMEDITOR_API UDlgEventCustomFactory : public UFactory\n{\n\tGENERATED_BODY()\n\npublic:\n\tUDlgEventCustomFactory(const FObjectInitializer& ObjectInitializer);\n\n\t//\n\t// UFactory interface\n\t//\n\n\tbool ConfigureProperties() override;\n\tUObject* FactoryCreateNew(\n\t\tUClass* Class,\n\t\tUObject* InParent,\n\t\tFName Name,\n\t\tEObjectFlags Flags,\n\t\tUObject* Context,\n\t\tFFeedbackContext* Warn\n\t) override;\n\nprivate:\n\t// Holds the template of the class we are building\n\tUPROPERTY()\n\tTSubclassOf<UDlgEventCustom> ParentClass;\n};\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystemEditor/Private/Factories/DlgNodeDataFactory.cpp",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#include \"DlgNodeDataFactory.h\"\n\n\n#include \"DialogueEditorUtilities.h\"\n#include \"DlgNodeData.h\"\n#include \"Kismet2/KismetEditorUtilities.h\"\n#include \"Misc/MessageDialog.h\"\n\n#define LOCTEXT_NAMESPACE \"DlgSystem\"\n\n/////////////////////////////////////////////////////\n// UDlgNodeDataFactory\nUDlgNodeDataFactory::UDlgNodeDataFactory(const FObjectInitializer& ObjectInitializer)\n\t: Super(ObjectInitializer)\n{\n\tbCreateNew = true;\n\n\t// true if the associated editor should be opened after creating a new object.\n\tbEditAfterNew = false;\n\tSupportedClass = UDlgNodeData::StaticClass();\n\n\t// Default class\n\tParentClass = SupportedClass;\n}\n\nbool UDlgNodeDataFactory::ConfigureProperties()\n{\n\tstatic const FText TitleText = FText::FromString(TEXT(\"Pick Parent Class for Node Data\"));\n\tParentClass = nullptr;\n\n\tUClass* ChosenClass = nullptr;\n\tconst bool bPressedOk = FDialogueEditorUtilities::PickChildrenOfClass(TitleText, ChosenClass, SupportedClass);\n\tif (bPressedOk)\n\t{\n\t\tParentClass = ChosenClass;\n\t}\n\n\treturn bPressedOk;\n}\n\nUObject* UDlgNodeDataFactory::FactoryCreateNew(\n\tUClass* Class,\n\tUObject* InParent,\n\tFName Name,\n\tEObjectFlags Flags,\n\tUObject* Context,\n\tFFeedbackContext* Warn\n)\n{\n\t// Something wrong happened\n\tif (ParentClass == nullptr || !FKismetEditorUtilities::CanCreateBlueprintOfClass(ParentClass))\n\t{\n\t\tFFormatNamedArguments Args;\n\t\tArgs.Add(TEXT(\"ClassName\"), ParentClass ? FText::FromString(ParentClass->GetName()) : NSLOCTEXT(\"UnrealEd\", \"Null\", \"(null)\"));\n\t\tFMessageDialog::Open(EAppMsgType::Ok, FText::Format(NSLOCTEXT(\"UnrealEd\", \"CannotCreateBlueprintFromClass\", \"Cannot create a blueprint based on the class '{0}'.\"), Args));\n\t\treturn nullptr;\n\t}\n\n\t// Create\n\treturn FKismetEditorUtilities::CreateBlueprint(\n\t\tParentClass,\n\t\tInParent,\n\t\tName,\n\t\tBPTYPE_Normal,\n\t\tUBlueprint::StaticClass(),\n\t\tUBlueprintGeneratedClass::StaticClass(),\n\t\tNAME_None\n\t);\n}\n\n#undef LOCTEXT_NAMESPACE\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystemEditor/Private/Factories/DlgNodeDataFactory.h",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#pragma once\n\n#include \"Factories/Factory.h\"\n\n#include \"DlgNodeDataFactory.generated.h\"\n\nclass UDlgNodeData;\n\nUCLASS()\nclass DLGSYSTEMEDITOR_API UDlgNodeDataFactory : public UFactory\n{\n\tGENERATED_BODY()\n\npublic:\n\tUDlgNodeDataFactory(const FObjectInitializer& ObjectInitializer);\n\n\t//\n\t// UFactory interface\n\t//\n\n\tbool ConfigureProperties() override;\n\tUObject* FactoryCreateNew(\n\t\tUClass* Class,\n\t\tUObject* InParent,\n\t\tFName Name,\n\t\tEObjectFlags Flags,\n\t\tUObject* Context,\n\t\tFFeedbackContext* Warn\n\t) override;\n\nprivate:\n\t// Holds the template of the class we are building\n\tUPROPERTY()\n\tTSubclassOf<UDlgNodeData> ParentClass;\n};\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystemEditor/Private/Factories/DlgTextArgumentCustomFactory.cpp",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#include \"DlgTextArgumentCustomFactory.h\"\n\n\n#include \"DialogueEditorUtilities.h\"\n#include \"DlgTextArgumentCustom.h\"\n#include \"Kismet2/KismetEditorUtilities.h\"\n#include \"Misc/MessageDialog.h\"\n\n#define LOCTEXT_NAMESPACE \"DlgSystem\"\n\n/////////////////////////////////////////////////////\n// UDlgConditionCustomFactory\nUDlgTextArgumentCustomFactory::UDlgTextArgumentCustomFactory(const FObjectInitializer& ObjectInitializer)\n\t: Super(ObjectInitializer)\n{\n\tbCreateNew = true;\n\n\t// true if the associated editor should be opened after creating a new object.\n\tbEditAfterNew = false;\n\tSupportedClass = UDlgTextArgumentCustom::StaticClass();\n\n\t// Default class\n\tParentClass = SupportedClass;\n}\n\nbool UDlgTextArgumentCustomFactory::ConfigureProperties()\n{\n\tstatic const FText TitleText = FText::FromString(TEXT(\"Pick Parent Class for Custom Text Argument\"));\n\tParentClass = nullptr;\n\n\tUClass* ChosenClass = nullptr;\n\tconst bool bPressedOk = FDialogueEditorUtilities::PickChildrenOfClass(TitleText, ChosenClass, SupportedClass);\n\tif (bPressedOk)\n\t{\n\t\tParentClass = ChosenClass;\n\t}\n\n\treturn bPressedOk;\n}\n\nUObject* UDlgTextArgumentCustomFactory::FactoryCreateNew(\n\tUClass* Class,\n\tUObject* InParent,\n\tFName Name,\n\tEObjectFlags Flags,\n\tUObject* Context,\n\tFFeedbackContext* Warn\n)\n{\n\t// Something wrong happened\n\tif (ParentClass == nullptr || !FKismetEditorUtilities::CanCreateBlueprintOfClass(ParentClass))\n\t{\n\t\tFFormatNamedArguments Args;\n\t\tArgs.Add(TEXT(\"ClassName\"), ParentClass ? FText::FromString(ParentClass->GetName()) : NSLOCTEXT(\"UnrealEd\", \"Null\", \"(null)\"));\n\t\tFMessageDialog::Open(EAppMsgType::Ok, FText::Format(NSLOCTEXT(\"UnrealEd\", \"CannotCreateBlueprintFromClass\", \"Cannot create a blueprint based on the class '{0}'.\"), Args));\n\t\treturn nullptr;\n\t}\n\n\t// Create\n\treturn FKismetEditorUtilities::CreateBlueprint(\n\t\tParentClass,\n\t\tInParent,\n\t\tName,\n\t\tBPTYPE_Normal,\n\t\tUBlueprint::StaticClass(),\n\t\tUBlueprintGeneratedClass::StaticClass(),\n\t\tNAME_None\n\t);\n}\n\n#undef LOCTEXT_NAMESPACE\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystemEditor/Private/Factories/DlgTextArgumentCustomFactory.h",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#pragma once\n\n#include \"Factories/Factory.h\"\n\n#include \"DlgTextArgumentCustomFactory.generated.h\"\n\nclass UDlgTextArgumentCustom;\n\nUCLASS()\nclass DLGSYSTEMEDITOR_API UDlgTextArgumentCustomFactory : public UFactory\n{\n\tGENERATED_BODY()\n\npublic:\n\tUDlgTextArgumentCustomFactory(const FObjectInitializer& ObjectInitializer);\n\n\t//\n\t// UFactory interface\n\t//\n\n\tbool ConfigureProperties() override;\n\tUObject* FactoryCreateNew(\n\t\tUClass* Class,\n\t\tUObject* InParent,\n\t\tFName Name,\n\t\tEObjectFlags Flags,\n\t\tUObject* Context,\n\t\tFFeedbackContext* Warn\n\t) override;\n\nprivate:\n\t// Holds the template of the class we are building\n\tUPROPERTY()\n\tTSubclassOf<UDlgTextArgumentCustom> ParentClass;\n};\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystemEditor/Public/DlgDialogueEditorAccess.h",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#pragma once\n\n#include \"IDlgDialogueEditorAccess.h\"\n#include \"DialogueEditorUtilities.h\"\n\n/**\n * Implementation of the interface for dialogue graph interaction between DlgSystem module <-> DlgSystemEditor module.\n * Set in UDialogueGraph constructor for Each Dialogue\n */\nclass DLGSYSTEMEDITOR_API FDlgDialogueEditorAccess : public IDlgDialogueEditorAccess\n{\npublic:\n\tFDlgDialogueEditorAccess() {}\n\t~FDlgDialogueEditorAccess() {}\n\n\tvoid UpdateGraphNodeEdges(UEdGraphNode* GraphNode) override;\n\tUEdGraph* CreateNewDialogueGraph(UDlgDialogue* Dialogue) const override;\n\tvoid CompileDialogueNodesFromGraphNodes(UDlgDialogue* Dialogue) const override;\n\tvoid RemoveAllGraphNodes(UDlgDialogue* Dialogue) const override;\n\tvoid UpdateDialogueToVersion_UseOnlyOneOutputAndInputPin(UDlgDialogue* Dialogue) const override;\n\tvoid SetNewOuterForObjectFromGraphNode(UObject* Object, UEdGraphNode* GraphNode) const override;\n\n\tbool AreDialogueNodesInSyncWithGraphNodes(UDlgDialogue* Dialogue) const override\n\t{\n\t\treturn FDialogueEditorUtilities::AreDialogueNodesInSyncWithGraphNodes(Dialogue);\n\t}\n};\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystemEditor/Public/DlgSystemEditorModule.h",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#pragma once\n\n#include \"IDlgSystemEditorModule.h\"\n#include \"Templates/SharedPointer.h\"\n#include \"AssetTypeCategories.h\"\n#include \"IAssetTypeActions.h\"\n#include \"Framework/Commands/UICommandList.h\"\n#include \"Framework/Docking/WorkspaceItem.h\"\n#include \"Logging/LogMacros.h\"\n\nclass FSpawnTabArgs;\nclass UK2Node;\nclass UDlgDialogue;\nstruct FGraphPanelNodeFactory;\nstruct FGraphPanelPinFactory;\nclass FExtender;\nclass UEdGraph;\n\nDECLARE_LOG_CATEGORY_EXTERN(LogDlgSystemEditor, Verbose, All)\n\n\n// Implementation of the DlgSystemEditor Module\nclass DLGSYSTEMEDITOR_API FDlgSystemEditorModule : public IDlgSystemEditorModule\n{\n\ttypedef FDlgSystemEditorModule Self;\npublic:\n\tFDlgSystemEditorModule();\n\n\t//\n\t// IModuleInterface interface\n\t//\n\n\tvoid StartupModule() override;\n\tvoid ShutdownModule() override;\n\n\tEAssetTypeCategories::Type GetAssetCategory() const override { return DlgSystemAssetCategoryBit; }\n\n\n\t//\n\t// Own functions\n\t//\n\n\t// Create the menu extenders\n\tstatic TSharedRef<FExtender> CreateFileMenuExtender(\n\t\tTSharedRef<FUICommandList> Commands,\n\t\tconst TArray<TSharedPtr<FUICommandInfo>>& AdditionalMenuEntries = {}\n\t);\n\tstatic TSharedRef<FExtender> CreateHelpMenuExtender(TSharedRef<FUICommandList> Commands);\n\tstatic void MapActionsForFileMenuExtender(TSharedRef<FUICommandList> Commands);\n\tstatic void MapActionsForHelpMenuExtender(TSharedRef<FUICommandList> Commands);\n\nprivate:\n\t// Handle clicking on save all dialogues.\n\tstatic void HandleOnSaveAllDialogues();\n\n\t// Handle clicking on delete all dialogues text files.\n\tstatic void HandleOnDeleteAllDialoguesTextFiles();\n\n\t// Handle on post engine init event\n\tvoid HandleOnPostEngineInit();\n\n\t// Handle PIE events\n\tvoid HandleOnBeginPIE(bool bIsSimulating);\n\tvoid HandleOnPostPIEStarted(bool bIsSimulating);\n\tvoid HandleOnEndPIEHandle(bool bIsSimulating);\n\tvoid HandleOnAssetRegistryFilesLoaded();\n\n\t// Handle Blueprint Events\n\tvoid HandleNewCustomConditionBlueprintCreated(UBlueprint* Blueprint);\n\tvoid HandleNewCustomTextArgumentBlueprintCreated(UBlueprint* Blueprint);\n\tvoid HandleNewCustomEventBlueprintCreated(UBlueprint* Blueprint);\n\tvoid HandleNewNodeDataBlueprintCreated(UBlueprint* Blueprint);\n\n\t// Extend the Menus of the editor\n\tvoid ExtendMenu();\n\nprivate:\n\t// The submenu type of the dialog system\n\tEAssetTypeCategories::Type DlgSystemAssetCategoryBit;\n\n\t// All registered asset type actions. Cached here so that we can unregister them during shutdown.\n\tTArray<TSharedPtr<IAssetTypeActions>> RegisteredAssetTypeActions;\n\n\t// All registered custom class layouts for the details panel. Cached here so that we can unregister them during shutdown.\n\tTArray<FName> RegisteredCustomClassLayouts;\n\n\t// All registered custom property layouts for the details panel. Cached here so that we can unregister them during shutdown.\n\tTArray<FName> RegisteredCustomPropertyTypeLayout;\n\n\t// The factory of how the nodes look.\n\tTSharedPtr<FGraphPanelNodeFactory> DialogueGraphNodeFactory;\n\n\t// The factory of how the pins look.\n\tTSharedPtr<FGraphPanelPinFactory> DialogueGraphPinFactory;\n\n\t// Level Editor commands bound from this plugin.\n\tTSharedPtr<FUICommandList> LevelMenuEditorCommands;\n\n\t// The Tools Dialogue category.\n\tTSharedPtr<FWorkspaceItem> ToolsDialogueCategory;\n\n\t// Handlers\n\tFDelegateHandle OnPostEngineInitHandle;\n\tFDelegateHandle OnBeginPIEHandle;\n\tFDelegateHandle OnPostPIEStartedHandle; // after BeginPlay() has been called\n\tFDelegateHandle OnEndPIEHandle;\n\n\t// Flags\n\tbool bIsEngineInitialized = false;\n};\n"
  },
  {
    "path": "Plugins/DlgSystem/Source/DlgSystemEditor/Public/IDlgSystemEditorModule.h",
    "content": "// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.\n#pragma once\n\n#include \"AssetTypeCategories.h\"\n#include \"Modules/ModuleManager.h\"\n#include \"Modules/ModuleInterface.h\"\n\n// The name of the Dialogue System Editor plugin as defined in the .uplugin file\nconst FName DIALOGUE_SYSTEM_EDITOR_PLUGIN_NAME(TEXT(\"DlgSystemEditor\"));\n\n/**\n * Interface for the DlgSystemEditor module.\n */\nclass DLGSYSTEMEDITOR_API IDlgSystemEditorModule : public IModuleInterface\n{\npublic:\n\n\t/**\n\t * Singleton-like access to this module's interface.  This is just for convenience!\n\t * Beware of calling this during the shutdown phase, though.  Your module might have been unloaded already.\n\t *\n\t * @return Returns singleton instance, loading the module on demand if needed\n\t */\n\tstatic IDlgSystemEditorModule& Get()\n\t{\n\t\treturn FModuleManager::LoadModuleChecked<IDlgSystemEditorModule>(DIALOGUE_SYSTEM_EDITOR_PLUGIN_NAME);\n\t}\n\n\t/**\n\t * Checks to see if this module is loaded and ready.  It is only valid to call Get() if IsAvailable() returns true.\n\t *\n\t * @return True if the module is loaded and ready to use\n\t */\n\tstatic bool IsAvailable()\n\t{\n\t\treturn FModuleManager::Get().IsModuleLoaded(DIALOGUE_SYSTEM_EDITOR_PLUGIN_NAME);\n\t}\n\n\t// Returns the Asset Category for this plugin\n\tvirtual EAssetTypeCategories::Type GetAssetCategory() const = 0;\n\npublic:\n\tvirtual ~IDlgSystemEditorModule() {}\n};\n"
  },
  {
    "path": "Plugins/DlgSystem/Tools/DlgSpellcheckJsonHumanText.py",
    "content": "#!/usr/bin/env python3\n# Copyright 2017-2018 Csaba Molnar, Daniel Butum\n\nimport os\nimport json\nimport sys\nimport argparse\nimport subprocess\nimport shlex\nfrom pathlib import Path\n\n# NOTE: This script is standalone does not include any libraries\n\nclass Colors:\n    HEADER = '\\033[95m'\n\n    BLUE = '\\033[0;36m'\n    BLUE_LIGHT = '\\033[1;36m'\n\n    GREEN = '\\033[0;32m'\n    GREEN_LIGHT = '\\033[1;32m'\n\n    YELLOW = '\\033[0;33m'\n    YELLOW_LIGHT = '\\033[1;33m'\n\n    RED = '\\033[0;31m'\n    RED_LIGHT = '\\033[1;31m'\n\n    # No Color\n    END = '\\033[0m'\n\n\ndef print_newlines(nr = 1):\n    if nr > 0:\n        print('\\n' * nr, end='')\n\n\ndef print_reset_color():\n    if sys.stdout.isatty():\n        print(Colors.END)\n\n\ndef _print_internal(color, string, **kwargs):\n    if sys.stdout.isatty():\n        # You're running in a real terminal\n        prefix, suffix = color, Colors.END\n    else:\n        # You're being piped or redirected\n        prefix, suffix = '', ''\n\n    print(prefix + string + suffix, **kwargs)\n\n\ndef print_red(*args, **kwargs):\n    _print_internal(Colors.RED, \" \".join(map(str, args)), **kwargs)\n\n\ndef print_red_light(*args, **kwargs):\n    _print_internal(Colors.RED_LIGHT, \" \".join(map(str, args)), **kwargs)\n\n\ndef print_blue(*args, **kwargs):\n    _print_internal(Colors.BLUE, \" \".join(map(str, args)), **kwargs)\n\n\ndef print_blue_light(*args, **kwargs):\n    _print_internal(Colors.BLUE_LIGHT, \" \".join(map(str, args)), **kwargs)\n\n\ndef print_yellow(*args, **kwargs):\n    _print_internal(Colors.YELLOW, \" \".join(map(str, args)), **kwargs)\n\n\ndef print_yellow_light(*args, **kwargs):\n    _print_internal(Colors.YELLOW_LIGHT, \" \".join(map(str, args)), **kwargs)\n\n\ndef print_green(*args, **kwargs):\n    _print_internal(Colors.GREEN, \" \".join(map(str, args)), **kwargs)\n\n\ndef print_green_light(*args, **kwargs):\n    _print_internal(Colors.GREEN_LIGHT, \" \".join(map(str, args)), **kwargs)\n\n\ndef get_filename_from_path(path, include_extension=True):\n    filename = os.path.basename(str(path))\n    if include_extension:\n        return filename\n\n    file, extension = os.path.splitext(filename)\n    return file\n\n\ndef exit_program(status):\n    sys.exit(status)\n\n\ndef exit_program_error(message=None):\n    if message is not None:\n        print_red(message)\n    exit_program(1)\n\n\ndef exit_program_success():\n    exit_program(0)\n\n\ndef convert_path_to_absolute_if_not_already(path):\n    if not os.path.isabs(path):\n        return os.path.abspath(path)\n\n    return path\n\n\ndef json_parse_file(path):\n    \"\"\"\n    Returns a dictionary\n    \"\"\"\n    try:\n        with open(path) as fh:\n            try:\n                return json.load(fh)\n            except ValueError as e:\n                print_red(\"Can't parse file = `{}`. Error = `{}`\".format(path, e))\n                return None\n    except IOError as e:\n        print_red(\"Can't open file = `{}`. IOError = `{}`\".format(path, e))\n        return None\n\n\ndef json_save_dictionary(path, dictionary):\n    try:\n        with open(path, 'w') as fh:\n            try:\n                json.dump(dictionary, fh, indent=4)\n            except ValueError as e:\n                print_red(\"Can't save file = `{}`. Error = `{}`\".format(path, e))\n                return None\n    except IOError as e:\n        print_red(\"Can't open file = `{}`. IOError = `{}`\".format(path, e))\n\n\nclass DlgEdge:\n    def __init__(self, target_node_index, text):\n        self.target_node_index = target_node_index\n        self.text = text\n\n    def __str__(self):\n        return \"DlgEdge(target_node_index = {}, text = {})\".format(self.target_node_index, self.text)\n\n    def __repr__(self):\n        return str(self)\n\n\nclass DlgInnerEdge:\n    def __init__(self, text, edge_text):\n        self.text = text\n        self.edge_text = edge_text\n\n    def __str__(self):\n        return \"InnerEdge(text = {}, edge_text = {})\".format(self.text, self.edge_text)\n\n    def __repr__(self):\n        return str(self)\n\n\nclass DlgNode:\n    def __init__(self, node_index, text):\n        self.node_index = node_index\n        self.text = text\n        self.edges = []\n\n    def __str__(self):\n        return \"Node(node_index = {}, text = {}, edges =\\n{})\".format(self.node_index, self.text, \"\\n\".join(str(n) for n in self.edges))\n\n    def __repr__(self):\n        return str(self)\n\n\nclass DlgSpeechSequenceNode:\n    def __init__(self, node_index):\n        self.node_index = node_index\n        self.inner_edges = []\n        self.edges = []\n\n\n    def __str__(self):\n        return \"Node(node_index = {}, inner_edges = {}, edges =\\n{})\".format(self.node_index, \"\\n\".join(str(n) for n in self.inner_edges), \"\\n\".join(str(n) for n in self.edges))\n\n    def __repr__(self):\n        return str(self)\n\n\ndef is_path_json_human_text(file_path):\n    if not os.path.isfile(file_path):\n        return False\n\n    path = Path(file_path)\n    if \"\".join(path.suffixes) != \".dlg_human.json\":\n        return False\n\n    # Collect all words in file\n    all_words = set()\n\n\n    return True\n\n\nJSON_KEY_SPEECH_NODES = \"SpeechNodes\"\nJSON_KEY_SPEECH_SEQUENCE_NODES = \"SpeechSequenceNodes\"\nJSON_KEY_NODE_INDEX = \"NodeIndex\"\nJSON_KEY_TEXT = \"Text\"\nJSON_KEY_NODE_EDGES = \"Edges\"\nJSON_KEY_NODE_SEQUENCE = \"Sequence\"\nJSON_KEY_INNER_EDGE_TEXT = \"EdgeText\"\nJSON_KEY_EDGE_TARGET_NODE_INDEX = \"TargetNodeIndex\"\n\n\ndef get_edges_from_node_json(node_json):\n    edges = []\n    if JSON_KEY_NODE_EDGES in node_json:\n        for node_edge in node_json[JSON_KEY_NODE_EDGES]:\n            if JSON_KEY_EDGE_TARGET_NODE_INDEX in node_edge and JSON_KEY_TEXT in node_edge:\n                edge = DlgEdge(node_edge[JSON_KEY_EDGE_TARGET_NODE_INDEX], node_edge[JSON_KEY_TEXT])\n                edges.append(edge)\n\n    return edges\n\ndef get_inner_edges_from_node_json(node_json):\n    inner_edges = []\n    if JSON_KEY_NODE_SEQUENCE in node_json:\n        for node_inner_edge in node_json[JSON_KEY_NODE_SEQUENCE]:\n            if JSON_KEY_TEXT in node_inner_edge and JSON_KEY_INNER_EDGE_TEXT in node_inner_edge:\n                inner_edge = DlgInnerEdge(node_inner_edge[JSON_KEY_TEXT], node_inner_edge[JSON_KEY_INNER_EDGE_TEXT])\n                inner_edges.append(inner_edge)\n\n    return inner_edges\n\ndef run_aspell_on_words(words_list_str):\n    if not words_list_str:\n        return \"\"\n\n    try:\n        # shlex.quote()\n        # list -l en_us\n        # pipe -l en_us --suggest --dont-byte-offsets --dont-guess\n        process = subprocess.run(\"echo \\\"{}\\\" | aspell list -l en_us\".format(words_list_str), check=True, cwd=None, universal_newlines=True, \\\n                              stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)\n    except ValueError as e:\n        exit_program_error(\"ValueError = {}\".format(e))\n    except OSError as e:\n        exit_program_error(\"OSError = {}\".format(e))\n\n    return process.stdout.strip()\n\ndef spellcheck_json_human_text(file_path):\n    print_blue(\"Reading file = `{}`\".format(file_path))\n\n    file_json = json_parse_file(file_path)\n    if not file_json:\n        return\n\n    # Speech nodes\n    speech_nodes = []\n    speech_sequence_node = []\n    if JSON_KEY_SPEECH_NODES in file_json:\n        for node_json in file_json[JSON_KEY_SPEECH_NODES]:\n\n            # Read node\n            if JSON_KEY_NODE_INDEX in node_json and JSON_KEY_TEXT in node_json:\n                node = DlgNode(node_json[JSON_KEY_NODE_INDEX], node_json[JSON_KEY_TEXT])\n                node.edges = get_edges_from_node_json(node_json)\n                speech_nodes.append(node)\n\n\n    # Speech sequence nodes\n    if JSON_KEY_SPEECH_SEQUENCE_NODES in file_json:\n        for node_json in file_json[JSON_KEY_SPEECH_SEQUENCE_NODES]:\n            # Read node\n            if JSON_KEY_NODE_INDEX in node_json and JSON_KEY_NODE_SEQUENCE in node_json:\n                node = DlgSpeechSequenceNode(node_json[JSON_KEY_NODE_INDEX])\n                node.edges = get_edges_from_node_json(node_json)\n                node.inner_edges = get_inner_edges_from_node_json(node_json)\n                speech_sequence_node.append(node)\n\n    # Run spell checker on all words\n    for node in speech_nodes:\n        node_mistakes = run_aspell_on_words(node.text)\n        if node_mistakes:\n            print_yellow(\"Node Index = {}\\n\\tOriginal text = `{}`\\n\\tMistakes = `{}`\\n\".format(node.node_index, node.text, node_mistakes))\n\n        warning_edges = []\n        for edge in node.edges:\n            edge_mistakes = run_aspell_on_words(edge.text)\n            if edge_mistakes:\n                warning_edges.append(\"TargetNodeIndex = {}\\n\\t\\tOriginal text = `{}`\\n\\t\\tMistakes = `{}`\\n\".format(edge.target_node_index, edge.text, edge_mistakes))\n\n        if warning_edges and not node_mistakes:\n            print_yellow(\"Node index = {}\".format(node.node_index))\n\n        for warning in warning_edges:\n            print_yellow(\"\\t\" + warning)\n\n    for node_sequence in speech_sequence_node:\n        warnings_inner_edges = []\n        for index, inner_edge in enumerate(node_sequence.inner_edges):\n            warning = \"InnerEdge Index = {}\\n\".format(index)\n            found_mistake = False\n\n            # Check text\n            text_mistakes = run_aspell_on_words(inner_edge.text)\n            if text_mistakes:\n                found_mistake = True\n                warning = \"\\tOriginal Text = `{}`\\n\\tMistakes = `{}`\\n\".format(inner_edge.text, text_mistakes)\n\n            # Check EdgeText\n            edge_mistakes = run_aspell_on_words(inner_edge.edge_text)\n            if edge_mistakes:\n                found_mistake = True\n                warning = \"\\tOriginal EdgeText = `{}`\\n\\tMistakes = `{}`\\n\".format(inner_edge.edge_text, edge_mistakes)\n\n            if found_mistake:\n                warnings_inner_edges.append(warning)\n\n        warning_edges = []\n        for edge in node_sequence.edges:\n            edge_mistakes = run_aspell_on_words(edge.text)\n            if edge_mistakes:\n                warning_edges.append(\"TargetNodeIndex = {}\\n\\t\\tOriginal text = `{}`\\n\\t\\tMistakes = `{}`\\n\".format(edge.target_node_index, edge.text, edge_mistakes))\n\n        if warning_edges or warnings_inner_edges:\n            print_yellow(\"Speech Sequence Node index = {}\".format(node.node_index))\n\n            for warning in warnings_inner_edges:\n                print_yellow(warning)\n            for warning in warning_edges:\n                print_yellow(\"\\t\" + warning)\n\n\n    print(\"\\n\" + \"-\" * 20)\n\ndef main(directory):\n    print_blue(\"Finding json human text files inside directory = {}\\n\".format(directory))\n\n    # Walk over all files in directory\n    for path, subdirs, files in os.walk(directory):\n        for name in files:\n            full_filename = os.path.join(path, name)\n            if is_path_json_human_text(full_filename):\n                spellcheck_json_human_text(full_filename)\n            else:\n                print_yellow(\"Path = `{}` is not a file or not a valid json human text\".format(full_filename))\n\n\nif __name__ == \"__main__\":\n    parser = argparse.ArgumentParser()\n    parser.add_argument('directory', nargs=\"?\", type=str, help='Directory containing all the json human text files', default=\"DialoguesJsonHumanText/\")\n    args = parser.parse_args()\n\n    if not os.path.isdir(args.directory):\n        exit_program_error(\"`{}` is not directory\".format(args.directory))\n\n    main(args.directory)\n"
  },
  {
    "path": "Plugins/DlgSystem/Tools/DlgTwineToJsonHumanText.py",
    "content": "#!/usr/bin/env python3\n# Copyright 2017-2018 Csaba Molnar, Daniel Butum\n\nimport os\nimport sys\nimport argparse\nimport json\nimport uuid\nimport re\nfrom pprint import pprint\n\nfrom html.parser import HTMLParser\nfrom html.entities import name2codepoint\n\n# NOTE: This script is standalone does not include any libraries\n\nDLG_JSON_HUMAN_EXTENSION = \".dlg_human.json\"\nROOT_NODE_INDEX = -1\n\n\nclass Colors:\n    HEADER = '\\033[95m'\n\n    BLUE = '\\033[0;36m'\n    BLUE_LIGHT = '\\033[1;36m'\n\n    GREEN = '\\033[0;32m'\n    GREEN_LIGHT = '\\033[1;32m'\n\n    YELLOW = '\\033[0;33m'\n    YELLOW_LIGHT = '\\033[1;33m'\n\n    RED = '\\033[0;31m'\n    RED_LIGHT = '\\033[1;31m'\n\n    # No Color\n    END = '\\033[0m'\n\n\ndef print_newlines(nr = 1):\n    if nr > 0:\n        print('\\n' * nr, end='')\n\n\ndef print_reset_color():\n    if sys.stdout.isatty():\n        print(Colors.END)\n\n\ndef _print_internal(color, string, **kwargs):\n    if sys.stdout.isatty():\n        # You're running in a real terminal\n        prefix, suffix = color, Colors.END\n    else:\n        # You're being piped or redirected\n        prefix, suffix = '', ''\n\n    print(prefix + string + suffix, **kwargs)\n\n\ndef print_red(*args, **kwargs):\n    _print_internal(Colors.RED, \" \".join(map(str, args)), **kwargs)\n\n\ndef print_red_light(*args, **kwargs):\n    _print_internal(Colors.RED_LIGHT, \" \".join(map(str, args)), **kwargs)\n\n\ndef print_blue(*args, **kwargs):\n    _print_internal(Colors.BLUE, \" \".join(map(str, args)), **kwargs)\n\n\ndef print_blue_light(*args, **kwargs):\n    _print_internal(Colors.BLUE_LIGHT, \" \".join(map(str, args)), **kwargs)\n\n\ndef print_yellow(*args, **kwargs):\n    _print_internal(Colors.YELLOW, \" \".join(map(str, args)), **kwargs)\n\n\ndef print_yellow_light(*args, **kwargs):\n    _print_internal(Colors.YELLOW_LIGHT, \" \".join(map(str, args)), **kwargs)\n\n\ndef print_green(*args, **kwargs):\n    _print_internal(Colors.GREEN, \" \".join(map(str, args)), **kwargs)\n\n\ndef print_green_light(*args, **kwargs):\n    _print_internal(Colors.GREEN_LIGHT, \" \".join(map(str, args)), **kwargs)\n\n\ndef print_config_value(config_name, config_value):\n    print_blue(\"{} = \".format(config_name), end='')\n    print_blue_light(config_value)\n\n\ndef string_to_int(string):\n    try:\n        return int(string)\n    except ValueError:\n        return None\n\n\nclass TwineNodeTag:\n    NODE_START = \"node-start\"\n    NODE_END = \"node-end\"\n    NODE_VIRTUAL_PARENT = \"node-virtual-parent\"\n    NODE_SPEECH = \"node-speech\"\n    NODE_SPEECH_SEQUENCE = \"node-speech-sequence\"\n    NODE_SELECTOR_FIRST = \"node-selector-first\"\n    NODE_SELECTOR_RANDOM = \"node-selector-random\"\n\n    @classmethod\n    def get_all_tags(cls):\n        return set([cls.NODE_START, cls.NODE_END, cls.NODE_VIRTUAL_PARENT, cls.NODE_SPEECH, cls.NODE_SPEECH_SEQUENCE, cls.NODE_SELECTOR_FIRST, cls.NODE_SELECTOR_RANDOM])\n\n    @classmethod\n    def is_valid_tag(cls, tag):\n        return tag.lower() in cls.get_all_tags()\n\n    @classmethod\n    def has_valid_tags(cls, tags_list):\n        tags_set = set([x.lower() for x in tags_list])\n        common = cls.get_all_tags().intersection(tags_set)\n        return bool(common)\n\n\nclass TwineHelper:\n    REGEX_NAME = r\"(-?\\d+)\\.\\s*(.*)\"\n\n    @classmethod\n    def parse_twine_node_name(cls, raw_name, context_multiple_matches, context_invalid_index, context_invalid_speaker):\n        # Get node index and speaker\n        matches_name = re.finditer(cls.REGEX_NAME, raw_name, re.MULTILINE | re.UNICODE)\n        node_index, speaker = None, None\n        for index, match in enumerate(matches_name):\n            if index > 0:\n                print_yellow(\"{}, got multiple name matches\".format(context_multiple_matches))\n                break\n\n            group_index = match.group(1)\n            if group_index is not None:\n                node_index = string_to_int(group_index.strip())\n            else:\n                print_yellow(\"{}, could not get node index from <node index>. <Speaker>\".format(context_invalid_index))\n\n            group_speaker = match.group(2)\n            if group_index is not None:\n                speaker = group_speaker.strip()\n            else:\n                print_yellow(\"{}, could not get speaker from <node index>. <Speaker>\".format(context_invalid_speaker))\n\n        return node_index, speaker\n\n    @classmethod\n    def clean_text(cls, text):\n        # Use windows line endings\n        return text.strip().replace(\"\\n\", \"\\r\\n\")\n\n\nclass TwineEdgeData:\n    IGNORE_EMPTY_TEXT_FLAG = \"~ignore~\"\n\n    def __init__(self):\n        self.raw_data = None\n        self.raw_text = None\n\n        self.text = None\n        self.target_node_index = None\n        self.owner_node_index = None\n\n    # The edge has empty text\n    def is_empty_edge_text(self):\n        return self.raw_text is None or self.IGNORE_EMPTY_TEXT_FLAG in self.raw_text.lower()\n\n    def parse(self):\n        # TODO make sure there are not multiple of these\n        parts = self.raw_data.split(\"|\")\n        if len(parts) != 2:\n            print_yellow(\"Node Index = {} has an edge with len(parts) = {}. There must be exactly 2. Did you use `|` inside your edge?\".format(self.owner_node_index, len(parts)))\n            return\n\n        # Text\n        self.raw_text = parts[0]\n        if self.is_empty_edge_text():\n            self.text = \"\"\n        else:\n            self.text = TwineHelper.clean_text(self.raw_text)\n\n        # Target nnode index\n        context_parse_name = \"Node Index = {} Edge, parts[1] = `{}`\".format(self.owner_node_index, parts[1])\n        self.target_node_index, ignored_speaker = TwineHelper.parse_twine_node_name(parts[1], context_parse_name, context_parse_name, context_parse_name)\n\n\n    def to_dict(self):\n        if self.text is None or self.target_node_index is None or self.target_node_index < ROOT_NODE_INDEX:\n            print(self.text)\n            print_yellow(\"Node index = {}, Edge invalid = {}. ignoring.\".format(self.owner_node_index, str(self)))\n            return {}\n\n        return {\n            \"TargetNodeIndex\": self.target_node_index,\n            \"Text\": self.text\n        }\n\n    def __str__(self):\n        return \"TwineEdgeData(target_node_index = {}, text = `{}`)\".format(self.target_node_index, self.text)\n\n    def __repr__(self):\n        return str(self)\n\n\nclass TwineInnerEdgeData:\n    REGEX_SPEAKER = r\"``\\s*Speaker\\s*:\\s*``\\s*//(.*)//\"\n    REGEX_TEXT = r\"``\\s*Text\\s*:\\s*``\\s*//(.*)//\"\n    REGEX_EDGE_TEXT = r\"``\\s*EdgeText\\s*:\\s*``\\s*//(.*)//\"\n\n    def __init__(self):\n        self.raw_data = None\n\n        self.speaker = None\n        self.text = None\n        self.edge_text = None\n        self.owner_node_index = None\n\n    def parse(self):\n        # Parse speaker\n        matches_text = re.finditer(self.REGEX_SPEAKER, self.raw_data, re.MULTILINE | re.UNICODE | re.IGNORECASE)\n        for index, match in enumerate(matches_text):\n            if index > 0:\n                print_yellow(\"Node speech sequence Index = {} got multiple matches for Speaker\".format(self.owner_node_index))\n                break\n\n            group = match.group(1)\n            if group is None:\n                print_yellow(\"Node speech sequence Index = {} could not get group 1 that matches ``Speaker:`` //<Name>//\".format(self.owner_node_index))\n                continue\n\n            self.speaker = group.strip()\n\n        # Parse text\n        matches_text = re.finditer(self.REGEX_TEXT, self.raw_data, re.MULTILINE | re.UNICODE | re.IGNORECASE)\n        for index, match in enumerate(matches_text):\n            if index > 0:\n                print_yellow(\"Node speech sequence Index = {} got multiple matches for Text\".format(self.owner_node_index))\n                break\n\n            group = match.group(1)\n            if group is None:\n                print_yellow(\"Node speech sequence Index = {} could not get group 1 that matches ``Text:`` //<text>//\".format(self.owner_node_index))\n                continue\n\n            self.text = TwineHelper.clean_text(group.strip())\n\n        # Parse edge text\n        matches_edge_text = re.finditer(self.REGEX_EDGE_TEXT, self.raw_data, re.MULTILINE | re.UNICODE | re.IGNORECASE)\n        for index, match in enumerate(matches_edge_text):\n            if index > 0:\n                print_yellow(\"Node speech sequence Index = {} got multiple matches for edge text\".format(self.owner_node_index))\n                break\n\n            group = match.group(1)\n            if group is None:\n                print_yellow(\"Node speech sequence Index = {} could not get group 1 that matches ``EdgeText:`` //<edge_text>//\".format(self.owner_node_index))\n                continue\n            self.edge_text = group.strip()\n\n    def to_dict(self):\n        if self.speaker is None or self.raw_data is None or self.text is None or self.edge_text is None:\n            return {}\n\n        return {\n            \"Speaker\": self.speaker,\n            \"Text\": self.text,\n            \"EdgeText\": self.edge_text\n        }\n\n\n    def __str__(self):\n        return \"TwineInnerEdgeData(speaker = {}, text = {}, edge_text = `{}`)\".format(self.speaker, self.text, self.edge_text)\n\n    def __repr__(self):\n        return str(self)\n\n\nclass TwineNodeData:\n    REGEX_EDGES = r\"\\[\\[(.*)\\]\\]\"\n\n    def __init__(self):\n        self.raw_name = None\n        self.raw_data = None\n        self.raw_tags = None\n\n        # Computed from raw data\n        self.node_index = None\n        self.speaker = None\n        self.text = \"\"\n        self.tags = []\n        self.edges = []\n        self.inner_edges = []\n\n    def __get_raw_data_until_edges(self):\n        index_edge_start = self.raw_data.find(\"[[\")\n        if index_edge_start == -1:\n            # take whole string\n            return self.raw_data\n\n        # Until the first\n        return self.raw_data[0:index_edge_start]\n\n    def _parse_text(self):\n        if not self.can_have_text():\n            return\n\n        self.text = TwineHelper.clean_text(self.__get_raw_data_until_edges())\n\n    def _parse_edges(self):\n        # Refuse to parse, because on some nodes we don't care about the edge text\n        if not self.raw_data or not self.can_have_text_on_edges():\n            return None\n\n        matches = re.finditer(self.REGEX_EDGES, self.raw_data, re.MULTILINE | re.UNICODE)\n        for index, match in enumerate(matches):\n            group = match.group(1)\n            if group is None:\n                print_yellow(\"Node Index = {} could not get group 1 that matches [[<edge content>|<edge index>]]\".format(self.node_index))\n                continue\n\n            edge = TwineEdgeData()\n            edge.raw_data = group.strip()\n            edge.owner_node_index = self.node_index\n            edge.parse()\n            self.edges.append(edge)\n\n    # only for speech sequence nodese\n    def _parse_inner_edges(self):\n        if not self.is_node_speech_sequence() or not self.raw_data:\n            return\n\n        raw_text_data = self.__get_raw_data_until_edges().strip()\n        inner_edges_parts = raw_text_data.split(\"---\")\n        if not inner_edges_parts:\n            print_yellow(\"Node Index = {} which is a speech sequence node does not have inner edges\".format(self.node_index))\n            return\n\n        for raw_inner_edge in inner_edges_parts:\n            inner_edge = TwineInnerEdgeData()\n            inner_edge.raw_data = raw_inner_edge.strip()\n            inner_edge.owner_node_index = self.node_index\n            inner_edge.parse()\n            self.inner_edges.append(inner_edge)\n\n    def parse(self):\n        self.tags = [x.lower() for x in  self.raw_tags.strip().split(\" \")]\n\n        # Get node index and speaker\n        context_parse_name = \"Node Name = {}\".format(self.raw_name)\n        self.node_index, self.speaker = TwineHelper.parse_twine_node_name(self.raw_name, context_parse_name, context_parse_name, context_parse_name)\n\n        self._parse_text()\n        if not TwineNodeTag.has_valid_tags(self.tags):\n            print_yellow(\"Node Index = {} does not have any valid tags = {}\".format(self.node_index, self.tags))\n\n        self._parse_edges()\n        self._parse_inner_edges()\n\n    def can_have_text(self):\n        return self.is_node_speech() or self.is_node_virtual_parent()\n\n    def can_have_text_on_edges(self):\n        return self.is_node_start() or self.is_node_speech() or self.is_node_speech_sequence()\n\n    def is_node_start(self):\n        return TwineNodeTag.NODE_START in self.tags\n\n    def is_node_end(self):\n        return TwineNodeTag.NODE_END in self.tags\n\n    def is_node_speech(self):\n        return TwineNodeTag.NODE_SPEECH in self.tags\n\n    def is_node_virtual_parent(self):\n        return TwineNodeTag.NODE_VIRTUAL_PARENT in self.tags\n\n    def is_node_speech_sequence(self):\n        return TwineNodeTag.NODE_SPEECH_SEQUENCE in self.tags\n\n    def is_node_selector(self):\n        return self.is_node_selector_first() or self.is_node_selector_random()\n\n    def is_node_selector_first(self):\n        return TwineNodeTag.NODE_SELECTOR_FIRST in self.tags\n\n    def is_node_selector_random(self):\n        return TwineNodeTag.NODE_SELECTOR_RANDOM in self.tags\n\n    def to_dict(self):\n        if self.node_index is None or self.node_index < ROOT_NODE_INDEX:\n            print_yellow(\"Node Index = {} is invalid ignoring\".format(self.node_index))\n            return {}\n\n        edges = []\n        for edge in self.edges:\n            edges.append(edge.to_dict())\n\n        inner_edges = []\n        for inner_edge in self.inner_edges:\n            inner_edges.append(inner_edge.to_dict())\n\n        if self.is_node_speech_sequence():\n            return {\n                \"NodeIndex\": self.node_index,\n                \"Speaker\": self.speaker,\n                \"Sequence\": inner_edges,\n                \"Edges\": edges\n            }\n\n        if self.can_have_text() or self.is_node_start():\n            return {\n                \"NodeIndex\": self.node_index,\n                \"Speaker\": self.speaker,\n                \"Text\": self.text,\n                \"Edges\": edges\n            }\n\n        return {}\n\n    def __str__(self):\n        return \"TwineNodeData(node_index = {}, speakr = {},  tags = {}, text = `{}`, edges = {})\".format(self.node_index, self.speaker, self.tags, self.text, self.edges)\n\n    def __repr__(self):\n        return str(self)\n\n\nclass TwineDocumentData:\n    def __init__(self):\n        self.raw_guid = None\n\n        self.dialogue_name = None\n        self.dialogue_guid = None\n        self.nodes = []\n\n    def _parse_dialogue_guid(self):\n        # Convert to default Unreal uuid\n        temp_uuid = uuid.UUID(self.raw_guid)\n        self.dialogue_guid = temp_uuid.hex.upper()\n\n    def parse(self):\n        self._parse_dialogue_guid()\n\n    def to_dict(self):\n        if self.dialogue_name is None or self.dialogue_guid is None or not self.nodes:\n            return {}\n\n        speech_nodes = []\n        speech_sequence_nodes = []\n        for node in self.nodes:\n            if node.is_node_speech_sequence():\n                speech_sequence_nodes.append(node.to_dict())\n            elif node.is_node_speech() or node.is_node_virtual_parent() or node.is_node_start():\n                speech_nodes.append(node.to_dict())\n            else:\n                # Ignore\n                pass\n\n        return {\n            \"DialogueName\": self.dialogue_name,\n            \"DialogueGUID\": self.dialogue_guid,\n            \"SpeechNodes\": speech_nodes,\n            \"SpeechSequenceNodes\": speech_sequence_nodes\n        }\n\n    def __str__(self):\n        return \"TwineDocumentData(dialogue_name = {}, dialogue_guid = {}, nodes =\\n{})\".format(self.dialogue_name, self.dialogue_guid, \"\\n\".join(str(n) for n in self.nodes))\n\n    def __repr__(self):\n        return str(self)\n\n\nclass TwineHtmlParser(HTMLParser):\n    HTML_TAG_STORYDATA = \"tw-storydata\"\n    HTML_TAG_PASSAGE_DATA = \"tw-passagedata\"\n\n    HTML_ATTR_NAME = \"name\"\n    HTML_ATTR_TAGS = \"tags\"\n    HTML_ATTR_GUID = \"ifid\"\n\n    def __init__(self):\n        super().__init__()\n        self.document = TwineDocumentData()\n        self.current_tag = None\n        self.current_node = None\n\n    def handle_starttag(self, tag, attrs):\n        # print(\"Start tag:\", tag)\n        self.current_tag = tag\n        if tag == self.HTML_TAG_STORYDATA:\n            # Data about dialogue\n            for attr in attrs:\n                attr_name, attr_value = attr\n                if attr_name == self.HTML_ATTR_NAME:\n                    self.document.dialogue_name = attr_value.strip()\n                elif attr_name == self.HTML_ATTR_GUID:\n                    self.document.raw_guid = attr_value.strip()\n\n        elif tag == self.HTML_TAG_PASSAGE_DATA:\n            # Data about each node\n            self.current_node = TwineNodeData()\n            self.document.nodes.append(self.current_node)\n\n            for attr in attrs:\n                attr_name, attr_value = attr\n                if attr_name == self.HTML_ATTR_NAME:\n                    self.current_node.raw_name = attr_value.strip()\n                elif attr_name == self.HTML_ATTR_TAGS:\n                    self.current_node.raw_tags = attr_value.strip()\n\n    def handle_endtag(self, tag):\n        if tag == self.HTML_TAG_STORYDATA:\n            self.document.parse()\n        elif tag == self.HTML_TAG_PASSAGE_DATA:\n            self.current_node.parse()\n\n        self.current_tag = None\n        self.current_node = None\n        # print(\"End tag  :\", tag)\n\n    def handle_data(self, data):\n        if self.current_tag is None:\n            return\n        if self.current_node is None:\n            return\n\n        if self.current_tag == self.HTML_TAG_PASSAGE_DATA:\n            self.current_node.raw_data = data.strip()\n\n    def handle_comment(self, data):\n        print(\"Comment  :\", data)\n\n    def handle_entityref(self, name):\n        c = chr(name2codepoint[name])\n        print(\"Named ent:\", c)\n\n    def handle_charref(self, name):\n        if name.startswith('x'):\n            c = chr(int(name[1:], 16))\n        else:\n            c = chr(int(name))\n        print(\"Num ent  :\", c)\n\n    def handle_decl(self, data):\n        print(\"Decl     :\", data)\n\n\ndef exit_program(status):\n    sys.exit(status)\n\n\ndef exit_program_error(message=None):\n    if message is not None:\n        print_red(message)\n    exit_program(1)\n\n\ndef exit_program_success():\n    exit_program(0)\n\n\ndef convert_path_to_absolute_if_not_already(path):\n    if not os.path.isabs(path):\n        return os.path.abspath(path)\n\n    return path\n\n\ndef is_path_twine_file(path):\n    if not os.path.isfile(path):\n        return False\n\n    filename = os.path.basename(str(path))\n    file, extension = os.path.splitext(filename)\n\n    if extension != \".html\":\n        return False\n\n    # TODO Maybe parse the contents\n\n    return True\n\n\ndef json_save_dictionary(path, dictionary):\n    try:\n        with open(path, 'w') as fh:\n            try:\n                json.dump(dictionary, fh, indent=4)\n            except ValueError as e:\n                print_red(\"Can't save file = `{}`. Error = `{}`\".format(path, e))\n                return None\n    except IOError as e:\n        print_red(\"Can't open file = `{}`. IOError = `{}`\".format(path, e))\n\n\ndef twine_parse_file(path):\n    \"\"\"\n    Returns a dictionary\n    \"\"\"\n    try:\n        with open(path, 'r', encoding=\"utf8\") as fh:\n            parser = TwineHtmlParser()\n            parser.feed(fh.read())\n            return parser.document\n    except IOError as e:\n        print_red(\"Can't open file = `{}`. IOError = `{}`\".format(path, e))\n        return None\n\n\ndef export_twine_file_dlg_text_json(src_file_path, src_twine_dir_from, dst_json_dir):\n    # Construct subdirectory we need to create our destination file\n    src_dirname, src_filename = os.path.split(src_file_path)\n\n    src_dirname_parts = src_dirname.split(os.sep)\n    dst_dirname = None\n    for index, part in enumerate(src_dirname_parts):\n        if part == src_twine_dir_from:\n            dst_dirname = os.sep.join(src_dirname_parts[index + 1:])\n            break\n\n    if dst_dirname is None:\n        print_yellow(\"Can't find dst_dirname for src_file_path = `{}`\".format(src_file_path))\n        return\n\n    # Ensure dirname exists in destination\n    dst_dirname = os.path.join(dst_json_dir, dst_dirname)\n    if not os.path.exists(dst_dirname):\n        os.makedirs(dst_dirname, exist_ok=True)\n        print_blue(\"Creating directory = `{}`\".format(dst_dirname))\n    if not os.path.isdir(dst_json_dir):\n        print_yellow(\"Path = `{}` is not a directory. Ignoring\".format(dst_dirname))\n        return\n\n    # Parse file\n    print_blue(\"Parsing file = `{}`\".format(src_file_path))\n    twine_document =  twine_parse_file(src_file_path)\n    if twine_document is None:\n        print_yellow(\"Can't parse twine file = `{}`\".format(src_file_path))\n        return\n\n    #print(twine_document)\n    #print(twine_document.to_dict())\n\n    json_human_content = twine_document.to_dict()\n    if not json_human_content:\n        print_yellow(\"Twine file = `{}` is corrupt or invalid. Can't parse any data\".format(src_file_path))\n        return\n\n    # Write  file\n    src_file, src_file_ext = os.path.splitext(src_filename)\n    dst_file_path = os.path.join(dst_dirname, src_file) + DLG_JSON_HUMAN_EXTENSION\n    print_blue(\"Writing file = `{}`\".format(dst_file_path))\n    json_save_dictionary(dst_file_path, json_human_content)\n    print(\"\")\n\n\n\ndef main(src_twine_dir, dst_json_dir):\n    if not os.path.exists(src_twine_dir):\n        exit_program_error(\"src_twine_dir = `{}` does not exist\".format(src_twine_dir))\n    if not os.path.isdir(src_twine_dir):\n        exit_program_error(\"src_twine_dir = `{}` is not a directory\".format(src_twine_dir))\n\n    if not os.path.exists(dst_json_dir):\n        os.makedirs(dst_json_dir, exist_ok=True)\n        print_blue(\"Creating dst_json_dir = `{}`\".format(dst_json_dir))\n    if not os.path.isdir(dst_json_dir):\n        exit_program_error(\"dst_json_dir = `{}` is not a directory\".format(dst_json_dir))\n\n    # Walk over all files in directory\n    src_twine_dir = convert_path_to_absolute_if_not_already(src_twine_dir)\n    dst_json_dir = convert_path_to_absolute_if_not_already(dst_json_dir)\n    print_blue(\"Finding save files in src_twine_dir = {}\\n\".format(src_twine_dir))\n\n    # Directory from where files\n    src_twine_dir_from = os.path.basename(os.path.normpath(src_twine_dir))\n    for path, subdirs, files in os.walk(src_twine_dir):\n        for name in files:\n            full_filename = os.path.join(path, name)\n            if is_path_twine_file(full_filename):\n                export_twine_file_dlg_text_json(full_filename, src_twine_dir_from, dst_json_dir)\n            else:\n                print_yellow(\"Path = `{}` is not a file or a twine file\".format(full_filename))\n\n\nif __name__ == \"__main__\":\n    parser = argparse.ArgumentParser()\n    parser.add_argument('src_twine_dir', nargs='?', type=str, help='Source directory from where we get all the .html twine files', default=\"DialoguesTwine/\")\n    parser.add_argument('dst_json_dir', nargs='?', type=str, help='Destination directory where we store all the .dlg_human.json files',  default=\"DialoguesJsonHumanText/\")\n\n    args = parser.parse_args()\n    main(args.src_twine_dir, args.dst_json_dir)\n"
  },
  {
    "path": "Plugins/FMODStudio/.gitignore",
    "content": ".vscode/\nIntermediate/\n\nBinaries/Win64/UE4Editor*\nBinaries/Win64/UE4-*\n\nBinaries/Win32/UE4Editor*\nBinaries/Win32/UE4-*\n\nBinaries/Linux/UE4Editor*\nBinaries/Linux/libUE4-*\nBinaries/Linux/libUE4Editor*\n"
  },
  {
    "path": "Plugins/FMODStudio/FMODStudio.uplugin",
    "content": "{\n    \"FileVersion\" : 3,\n\n\t\"FriendlyName\" : \"FMOD Studio Integration\",\n\t\"Version\" : 11019,\n\t\"VersionName\" : \"1.10.19\",\n\t\"CreatedBy\" : \"Firelight Technologies\",\n\t\"CreatedByURL\" : \"http://fmod.com\",\n\t\"Description\" : \"FMOD Studio Integration.\",\n\t\"Category\" : \"Audio\",\n\t\"EnabledByDefault\" : true,\n\n\t\"Modules\" :\n\t[\n\t\t{\n\t\t\t\"Name\": \"FMODStudio\",\n\t\t\t\"Type\": \"CookedOnly\",\n\t\t\t\"LoadingPhase\": \"PreLoadingScreen\"\n\t\t},\n\t\t{\n\t\t\t\"Name\": \"FMODStudio\",\n\t\t\t\"Type\": \"Editor\",\n\t\t\t\"LoadingPhase\": \"PreDefault\"\n\t\t},\n\t\t{\n\t\t\t\"Name\" : \"FMODStudioEditor\",\n\t\t\t\"Type\" : \"Editor\"\n\t\t}\n\t],\n\n\t\"CanContainContent\" : true,\n\t\"Installed\" : false\n}\n"
  },
  {
    "path": "Plugins/FMODStudio/README.md",
    "content": "# FMOD UE4 Integration\nSource https://github.com/fmod/ue4integration\n"
  },
  {
    "path": "Plugins/FMODStudio/Source/FMODStudio/Classes/FMODAmbientSound.h",
    "content": "// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2020.\n\n#pragma once\n\n#include \"FMODAudioComponent.h\"\n#include \"FMODAmbientSound.generated.h\"\n\n/** FMOD Ambient Sound.\n*/\nUCLASS(AutoExpandCategories = Audio, ClassGroup = Sounds, hidecategories(Collision, Input))\nclass FMODSTUDIO_API AFMODAmbientSound : public AActor\n{\n    GENERATED_UCLASS_BODY()\npublic:\n    /** The Audio component for this actor */\n    UPROPERTY(Category = Sound, VisibleAnywhere, BlueprintReadOnly, meta = (ExposeFunctionCategories = \"Sound\"))\n    UFMODAudioComponent *AudioComponent;\n\n// Begin AActor interface.\n#if WITH_EDITOR\n    virtual void CheckForErrors() override;\n    virtual bool GetReferencedContentObjects(TArray<UObject *> &Objects) const override;\n#endif\n    // End AActor interface.\n};\n"
  },
  {
    "path": "Plugins/FMODStudio/Source/FMODStudio/Classes/FMODAnimNotifyPlay.h",
    "content": "#pragma once\n\n#include \"Animation/AnimNotifies/AnimNotify.h\"\n#include \"FMODEvent.h\"\n#include \"FMODAnimNotifyPlay.generated.h\"\n\nUCLASS(const, hidecategories = Object, collapsecategories, meta = (DisplayName = \"Play FMOD Event\"))\nclass FMODSTUDIO_API UFMODAnimNotifyPlay : public UAnimNotify\n{\n    GENERATED_BODY()\n\npublic:\n    UFMODAnimNotifyPlay();\n\n    // Being UAnimNotify interface\n    virtual void Notify(USkeletalMeshComponent *MeshComp, UAnimSequenceBase *AnimSeq) override;\n    virtual FString GetNotifyName_Implementation() const override;\n    // End UAnimNotify interface\n\n    // If this sound should follow its owner\n    UPROPERTY(EditAnywhere, Category = \"FMOD Anim Notify\")\n    uint32 bFollow : 1;\n\n    // Socket or bone name to attach sound to\n    UPROPERTY(EditAnywhere, Category = \"FMOD Anim Notify\", meta = (EditCondition = \"bFollow\"))\n    FString AttachName;\n\n    // Sound to Play\n    UPROPERTY(EditAnywhere, Category = \"FMOD Anim Notify\", BlueprintReadWrite)\n    TAssetPtr<class UFMODEvent> Event;\n};\n"
  },
  {
    "path": "Plugins/FMODStudio/Source/FMODStudio/Classes/FMODAsset.h",
    "content": "// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2020.\n\n#pragma once\n\n#include \"Misc/Guid.h\"\n#include \"CoreMinimal.h\"\n#include \"FMODAsset.generated.h\"\n\n/**\n * FMOD Asset.\n */\nUCLASS(BlueprintType)\nclass FMODSTUDIO_API UFMODAsset : public UObject\n{\n    GENERATED_UCLASS_BODY()\n\n    /** The unique Guid, which matches the one exported from FMOD Studio */\n    UPROPERTY()\n    FGuid AssetGuid;\n\n    /** Whether to show in the content window */\n    UPROPERTY()\n    bool bShowAsAsset;\n\n    FString FileName;\n\n    /** Force this to be an asset */\n    virtual bool IsAsset() const override { return bShowAsAsset; }\n\n    /** Get tags to show in content view */\n    virtual void GetAssetRegistryTags(TArray<FAssetRegistryTag> &OutTags) const override;\n};\n"
  },
  {
    "path": "Plugins/FMODStudio/Source/FMODStudio/Classes/FMODAudioComponent.h",
    "content": "// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2020.\n\n#pragma once\n\n#include \"Containers/Map.h\"\n#include \"Runtime/Launch/Resources/Version.h\"\n#include \"Sound/SoundAttenuation.h\"\n#include \"AudioDevice.h\"\n#include \"FMODStudioModule.h\"\n#include \"FMODUtils.h\"\n#include \"FMODAudioComponent.generated.h\"\n\n// Event property\nUENUM()\nnamespace EFMODEventProperty\n{\nenum Type\n{\n    /* Priority to set on low-level channels created by this event instance (-1 to 256). */\n    ChannelPriority,\n    /** Schedule delay to synchronized playback for multiple tracks in DSP clocks, or -1 for default. */\n    ScheduleDelay,\n    /** Schedule look-ahead on the timeline in DSP clocks, or -1 for default. */\n    ScheduleLookahead,\n    /** Override the event's 3D minimum distance, or -1 for default. */\n    MinimumDistance,\n    /** Override the event's 3D maximum distance, or -1 for default. */\n    MaximumDistance,\n    /** Number of options */\n    Count\n};\n}\n\nclass FFMODDynamicParameter : public FDynamicParameter\n{\npublic:\n    FFMODDynamicParameter(float Initial = 0.0f)\n        : FDynamicParameter(Initial)\n    {\n    }\n};\n\n/** Used to store callback info from FMOD thread to our event */\nstruct FTimelineMarkerProperties\n{\n    FString Name;\n    int32 Position;\n};\n\n/** Used to store callback info from FMOD thread to our event */\nstruct FTimelineBeatProperties\n{\n    int32 Bar;\n    int32 Beat;\n    int32 Position;\n    float Tempo;\n    int32 TimeSignatureUpper;\n    int32 TimeSignatureLower;\n};\n\nUSTRUCT(BlueprintType)\nstruct FFMODAttenuationDetails\n{\n    GENERATED_USTRUCT_BODY()\n\n    /** Should we use Attenuation set in Studio or be able to modify in Editor. */\n    UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = \"FMOD|Attenuation\")\n    uint32 bOverrideAttenuation : 1;\n\n    /** Override the event's 3D minimum distance. */\n    UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = \"FMOD|Attenuation\",\n        meta = (ClampMin = \"0.0\", UIMin = \"0.0\", EditCondition = \"bOverrideAttenuation\"))\n    float MinimumDistance;\n\n    /** Override the event's 3D maximum distance. */\n    UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = \"FMOD|Attenuation\",\n        meta = (ClampMin = \"0.0\", UIMin = \"0.0\", EditCondition = \"bOverrideAttenuation\"))\n    float MaximumDistance;\n\n    FFMODAttenuationDetails()\n        : bOverrideAttenuation(false)\n        , MinimumDistance(1.0f)\n        , MaximumDistance(10.0f)\n    {\n    }\n};\n\nUSTRUCT(BlueprintType)\nstruct FFMODOcclusionDetails\n{\n    GENERATED_USTRUCT_BODY()\n\n    /** Enable Occlusion Settings. */\n    UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = \"FMOD|Occlusion\")\n    bool bEnableOcclusion;\n\n    /* Which trace channel to use for audio occlusion checks. */\n    UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = \"FMOD|Occlusion\", meta = (EditCondition = \"bEnableOcclusion\"))\n    TEnumAsByte<enum ECollisionChannel> OcclusionTraceChannel;\n\n    /** The low pass filter frequency (in hertz) to apply if the sound playing in this audio component is occluded. This will override the frequency set in LowPassFilterFrequency. A frequency of 0.0 is the device sample rate and will bypass the filter. */\n    UPROPERTY(\n        EditAnywhere, BlueprintReadWrite, Category = \"FMOD|Occlusion\", meta = (ClampMin = \"0.0\", UIMin = \"0.0\", EditCondition = \"bEnableOcclusion\"))\n    float OcclusionLowPassFilterFrequency;\n\n    /** The amount of volume attenuation to apply to sounds which are occluded. */\n    UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = \"FMOD|Occlusion\",\n        meta = (ClampMin = \"0.0\", UIMin = \"0.0\", ClampMax = \"1.0\", UIMax = \"1.0\", EditCondition = \"bEnableOcclusion\"))\n    float OcclusionVolumeAttenuation;\n\n    /** The amount of time in seconds to interpolate to the target OcclusionLowPassFilterFrequency when a sound is occluded. */\n    UPROPERTY(\n        EditAnywhere, BlueprintReadWrite, Category = \"FMOD|Occlusion\", meta = (ClampMin = \"0.0\", UIMin = \"0.0\", EditCondition = \"bEnableOcclusion\"))\n    float OcclusionInterpolationTime;\n\n    /** Whether or not to enable complex geometry occlusion checks. */\n    UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = \"FMOD|Occlusion\", meta = (EditCondition = \"bEnableOcclusion\"))\n    bool bUseComplexCollisionForOcclusion;\n\n    FFMODOcclusionDetails()\n        : bEnableOcclusion(false)\n        , OcclusionTraceChannel(ECC_Visibility)\n        , OcclusionLowPassFilterFrequency(20000.0f)\n        , OcclusionVolumeAttenuation(1.0f)\n        , OcclusionInterpolationTime(0.1f)\n        , bUseComplexCollisionForOcclusion(false)\n    {\n    }\n};\n\n/** called when an event stops, either because it played to completion or because a Stop() call turned it off early */\nDECLARE_DYNAMIC_MULTICAST_DELEGATE(FOnEventStopped);\n/** called when we reach a named marker on the timeline */\nDECLARE_DYNAMIC_MULTICAST_DELEGATE_TwoParams(FOnTimelineMarker, FString, Name, int32, Position);\n/** called when we reach a beat on the timeline */\nDECLARE_DYNAMIC_MULTICAST_DELEGATE_SixParams(\n    FOnTimelineBeat, int32, Bar, int32, Beat, int32, Position, float, Tempo, int32, TimeSignatureUpper, int32, TimeSignatureLower);\n\nnamespace FMOD\n{\nclass DSP;\nclass Sound;\n\nnamespace Studio\n{\nclass EventDescription;\nclass EventInstance;\n}\n}\n\nstruct FMOD_STUDIO_TIMELINE_MARKER_PROPERTIES;\nstruct FMOD_STUDIO_TIMELINE_BEAT_PROPERTIES;\n\n/**\n * Plays FMOD Studio events.\n */\nUCLASS(Blueprintable, ClassGroup = (Audio, Common), hidecategories = (Object, ActorComponent, Physics, Rendering, Mobility, LOD),\n    ShowCategories = Trigger, meta = (BlueprintSpawnableComponent))\nclass FMODSTUDIO_API UFMODAudioComponent : public USceneComponent\n{\n    GENERATED_UCLASS_BODY()\npublic:\n\n    /** The event asset to use for this sound */\n    UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = FMODAudio)\n    TAssetPtr<class UFMODEvent> Event;\n\n    /** Event parameter cache */\n    UPROPERTY(EditAnywhere, BlueprintReadWrite, SimpleDisplay, Category = FMODAudio)\n    TMap<FName, float> ParameterCache;\n    bool bDefaultParameterValuesCached;\n\n    /** Sound name used for programmer sound.  Will look up the name in any loaded audio table. */\n    UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = FMODAudio)\n    FString ProgrammerSoundName;\n\n    /** Enable timeline callbacks for this sound, so that OnTimelineMarker and OnTimelineBeat can be used */\n    UPROPERTY(EditAnywhere, Category = FMODAudio)\n    uint32 bEnableTimelineCallbacks : 1;\n\n    /** Stored properties to apply next time we create an instance */\n    float StoredProperties[EFMODEventProperty::Count];\n\n    /** Auto destroy this component on completion */\n    UPROPERTY()\n    uint32 bAutoDestroy : 1;\n\n    /** Stop sound when owner is destroyed */\n    UPROPERTY()\n    uint32 bStopWhenOwnerDestroyed : 1;\n\n    /** Whether we apply gain and low-pass based on audio zones. */\n    uint32 bApplyAmbientVolumes : 1;\n\n    /** Whether we apply gain and low-pass based on occlusion directly into the sound. */\n    uint32 bApplyOcclusionDirect : 1;\n\n    /** Whether we apply gain and low-pass based on occlusion onto a parameter. */\n    uint32 bApplyOcclusionParameter : 1;\n\n    /** Whether we have applied the occlusion at least once. */\n    uint32 bHasCheckedOcclusion : 1;\n\n    /** called when an event stops, either because it played to completion or because a Stop() call turned it off early */\n    UPROPERTY(BlueprintAssignable)\n    FOnEventStopped OnEventStopped;\n\n    /** called when we reach a named marker (if bEnableTimelineCallbacks is true) */\n    UPROPERTY(BlueprintAssignable)\n    FOnTimelineMarker OnTimelineMarker;\n\n    /** called when we reach a beat of a tempo (if bEnableTimelineCallbacks is true) */\n    UPROPERTY(BlueprintAssignable)\n    FOnTimelineBeat OnTimelineBeat;\n\n    UFUNCTION(BlueprintCallable, Category = \"Audio|FMOD|Components\")\n    void SetEvent(UFMODEvent *NewEvent);\n\n    /** Start a sound playing on an audio component */\n    UFUNCTION(BlueprintCallable, Category = \"Audio|FMOD|Components\")\n    void Play();\n\n    /** Stop an audio component playing its sound cue, issue any delegates if needed */\n    UFUNCTION(BlueprintCallable, Category = \"Audio|FMOD|Components\")\n    void Stop();\n\n    UFUNCTION(BlueprintCallable, Category = \"Audio|FMOD|Components\")\n    void Release();\n\n    /** Trigger a cue in an event */\n    UFUNCTION(BlueprintCallable, Category = \"Audio|FMOD|Components\")\n    void TriggerCue();\n\n    /** @return true if this component is currently playing an event */\n    UFUNCTION(BlueprintCallable, Category = \"Audio|FMOD|Components\")\n    bool IsPlaying();\n\n    /** Set volume on an audio component */\n    UFUNCTION(BlueprintCallable, Category = \"Audio|FMOD|Components\")\n    void SetVolume(float volume);\n\n    /** Set pitch on an audio component */\n    UFUNCTION(BlueprintCallable, Category = \"Audio|FMOD|Components\")\n    void SetPitch(float pitch);\n\n    /** Pause/Unpause an audio component */\n    UFUNCTION(BlueprintCallable, Category = \"Audio|FMOD|Components\")\n    void SetPaused(bool paused);\n\n    /** Set a parameter into the event */\n    UFUNCTION(BlueprintCallable, Category = \"Audio|FMOD|Components\")\n    void SetParameter(FName Name, float Value);\n\n    /** Get parameter value from the event */\n    UFUNCTION(BlueprintCallable, Category = \"Audio|FMOD|Components\")\n    float GetParameter(FName Name);\n\n    /** Set a parameter into the event */\n    UFUNCTION(BlueprintCallable, Category = \"Audio|FMOD|Components\")\n    void SetProperty(EFMODEventProperty::Type Property, float Value);\n\n    /** Get a property from the event */\n    UFUNCTION(BlueprintCallable, Category = \"Audio|FMOD|Components\")\n    float GetProperty(EFMODEventProperty::Type Property);\n\n    /** Get the event length in milliseconds */\n    UFUNCTION(BlueprintCallable, Category = \"Audio|FMOD|Components\")\n    int32 GetLength() const;\n\n    /** Set the timeline position in milliseconds  */\n    UFUNCTION(BlueprintCallable, Category = \"Audio|FMOD|Components\")\n    void SetTimelinePosition(int32 Time);\n\n    /** Get the timeline position in milliseconds */\n    UFUNCTION(BlueprintCallable, Category = \"Audio|FMOD|Components\")\n    int32 GetTimelinePosition();\n\n    /** Called when the event has finished stopping */\n    void OnPlaybackCompleted();\n\n    /** Update gain and low-pass based on interior volumes */\n    void UpdateInteriorVolumes();\n\n    /** Set the sound name to use for programmer sound.  Will look up the name in any loaded audio table. */\n    UFUNCTION(BlueprintCallable, Category = \"Audio|FMOD|Components\")\n    void SetProgrammerSoundName(FString Value);\n\n    /** Set a programmer sound to use for this audio component.  Lifetime of sound must exceed that of the audio component. */\n    void SetProgrammerSound(FMOD::Sound *Sound);\n\n    /** FMOD Custom Attenuation Details */\n    UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = FMODAudio)\n    struct FFMODAttenuationDetails AttenuationDetails;\n\n    /** FMOD Custom Attenuation Details */\n    UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = FMODAudio)\n    struct FFMODOcclusionDetails OcclusionDetails;\n\n    /** Update attenuation if we have it set */\n    void UpdateAttenuation();\n\n    /** Apply Volume and LPF into event */\n    void ApplyVolumeLPF();\n\n    /** Cache default event parameter values */\n    void CacheDefaultParameterValues();\n\npublic:\n    /** Internal play function which can play events in the editor */\n    void PlayInternal(EFMODSystemContext::Type Context);\n\n    /** Actual Studio instance handle */\n    FMOD::Studio::EventInstance *StudioInstance;\n\n    void EventCallbackAddMarker(struct FMOD_STUDIO_TIMELINE_MARKER_PROPERTIES *props);\n    void EventCallbackAddBeat(struct FMOD_STUDIO_TIMELINE_BEAT_PROPERTIES *props);\n    void EventCallbackCreateProgrammerSound(struct FMOD_STUDIO_PROGRAMMER_SOUND_PROPERTIES *props);\n    void EventCallbackDestroyProgrammerSound(struct FMOD_STUDIO_PROGRAMMER_SOUND_PROPERTIES *props);\n\n// Begin UObject interface.\n#if WITH_EDITOR\n    virtual void PostEditChangeProperty(FPropertyChangedEvent &e) override;\n#endif // WITH_EDITOR\n    virtual void PostLoad() override;\n    virtual FString GetDetailedInfoInternal() const override;\n    // End UObject interface.\n    // Begin USceneComponent Interface\n    virtual void Activate(bool bReset = false) override;\n    virtual void Deactivate() override;\n    virtual void OnUpdateTransform(EUpdateTransformFlags UpdateTransformFlags, ETeleportType Teleport = ETeleportType::None) override;\n    // End USceneComponent Interface\n\nprivate:\n// Begin ActorComponent interface.\n    virtual void OnRegister() override;\n    virtual void OnUnregister() override;\n    virtual void EndPlay(const EEndPlayReason::Type EndPlayReason) override;\n    virtual void TickComponent(float DeltaTime, enum ELevelTick TickType, FActorComponentTickFunction *ThisTickFunction) override;\n// End ActorComponent interface.\n\n#if WITH_EDITORONLY_DATA\n    void UpdateSpriteTexture();\n#endif\n\n    void ReleaseEventCache();\n    void ReleaseEventInstance();\n\n    IFMODStudioModule& GetStudioModule()\n    {\n        if (Module == nullptr)\n        {\n            Module = &IFMODStudioModule::Get();\n        }\n        return *Module;\n    }\n    IFMODStudioModule* Module;\n\n    // Settings for ambient volume effects\n    double InteriorLastUpdateTime;\n    float SourceInteriorVolume;\n    float SourceInteriorLPF;\n    float CurrentInteriorVolume;\n    float CurrentInteriorLPF;\n    float AmbientVolumeMultiplier;\n    float AmbientLPF;\n    float LastLPF;\n    float LastVolume;\n    FFMODDynamicParameter CurrentOcclusionFilterFrequency;\n    FFMODDynamicParameter CurrentOcclusionVolumeAttenuation;\n\n    // Tempo and marker callbacks\n    FCriticalSection CallbackLock;\n    TArray<FTimelineMarkerProperties> CallbackMarkerQueue;\n    TArray<FTimelineBeatProperties> CallbackBeatQueue;\n\n    // Direct assignment of programmer sound from other C++ code\n    FMOD::Sound *ProgrammerSound;\n    FMOD::DSP *LowPass;\n    int LowPassParam;\n\n    int32 EventLength;\n};\n"
  },
  {
    "path": "Plugins/FMODStudio/Source/FMODStudio/Classes/FMODBank.h",
    "content": "// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2020.\n\n#pragma once\n\n#include \"FMODAsset.h\"\n#include \"FMODBank.generated.h\"\n\n/**\n * FMOD Bank Asset.\n */\nUCLASS()\nclass FMODSTUDIO_API UFMODBank : public UFMODAsset\n{\n    GENERATED_UCLASS_BODY()\n\n    /** Get tags to show in content view */\n    virtual void GetAssetRegistryTags(TArray<FAssetRegistryTag> &OutTags) const override;\n\n    /** Descriptive name */\n    virtual FString GetDesc() override;\n};\n"
  },
  {
    "path": "Plugins/FMODStudio/Source/FMODStudio/Classes/FMODBlueprintStatics.h",
    "content": "// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2020.\n\n#pragma once\n\n#include \"FMODAudioComponent.h\"\n#include \"Kismet/BlueprintFunctionLibrary.h\"\n#include \"Containers/UnrealString.h\"\n#include \"Kismet/BlueprintFunctionLibrary.h\"\n#include \"FMODBlueprintStatics.generated.h\"\n\nclass UFMODAudioComponent;\n\nnamespace FMOD\n{\nnamespace Studio\n{\nclass EventDescription;\nclass EventInstance;\n}\n}\n\nclass UFMODAsset;\nclass UFMODEvent;\nclass USceneComponent;\n\nUSTRUCT(BlueprintType)\nstruct FFMODEventInstance\n{\n    GENERATED_USTRUCT_BODY()\n\n    FMOD::Studio::EventInstance *Instance;\n};\n\nUENUM(BlueprintType)\nenum EFMOD_STUDIO_STOP_MODE\n{\n    ALLOWFADEOUT,\n    IMMEDIATE\n};\n\nUCLASS()\nclass FMODSTUDIO_API UFMODBlueprintStatics : public UBlueprintFunctionLibrary\n{\n    GENERATED_UCLASS_BODY()\n\n    /** Plays an event.  This returns an FMOD Event Instance.  The sound does not travel with any actor.\n\t * @param Event - event to play\n\t * @param bAutoPlay - Start the event automatically.\n\t */\n    UFUNCTION(BlueprintCallable, Category = \"Audio|FMOD\",\n        meta = (HidePin = \"WorldContextObject\", DefaultToSelf = \"WorldContextObject\", AdvancedDisplay = \"2\", bAutoPlay = \"true\",\n            UnsafeDuringActorConstruction = \"true\"))\n    static FFMODEventInstance PlayEvent2D(UObject *WorldContextObject, UFMODEvent *Event, bool bAutoPlay);\n\n    /** Plays an event at the given location. This returns an FMOD Event Instance.  The sound does not travel with any actor.\n\t * @param Event - event to play\n\t * @param Location - World position to play event at\n\t * @param bAutoPlay - Start the event automatically.\n\t */\n    UFUNCTION(BlueprintCallable, Category = \"Audio|FMOD\",\n        meta = (HidePin = \"WorldContextObject\", DefaultToSelf = \"WorldContextObject\", AdvancedDisplay = \"2\", bAutoPlay = \"true\",\n            UnsafeDuringActorConstruction = \"true\"))\n    static FFMODEventInstance PlayEventAtLocation(UObject *WorldContextObject, UFMODEvent *Event, const FTransform &Location, bool bAutoPlay);\n\n    /** Plays an event attached to and following the specified component.\n\t * @param Event - event to play\n\t * @param AttachComponent - Component to attach to.\n\t * @param AttachPointName - Optional named point within the AttachComponent to play the sound at\n\t * @param Location - Depending on the value of Location Type this is either a relative offset from the attach component/point or an absolute world position that will be translated to a relative offset\n\t * @param LocationType - Specifies whether Location is a relative offset or an absolute world position\n\t * @param bStopWhenAttachedToDestroyed - Specifies whether the sound should stop playing when the owner of the attach to component is destroyed.\n\t * @param bAutoPlay - Start the event automatically.\n\t * @param bAutoDestroy - Automatically destroy the audio component when the sound is stopped.\n\t */\n    UFUNCTION(BlueprintCallable, Category = \"Audio|FMOD\",\n        meta = (AdvancedDisplay = \"2\", UnsafeDuringActorConstruction = \"true\", bAutoPlay = \"true\", bAutoDestroy = \"true\"))\n    static class UFMODAudioComponent *PlayEventAttached(UFMODEvent *Event, USceneComponent *AttachToComponent, FName AttachPointName,\n        FVector Location, EAttachLocation::Type LocationType, bool bStopWhenAttachedToDestroyed, bool bAutoPlay, bool bAutoDestroy);\n\n    /** Find an asset by name.\n\t * @param EventName - The asset name\n\t */\n    UFUNCTION(BlueprintCallable, Category = \"Audio|FMOD\")\n    static UFMODAsset *FindAssetByName(const FString &Name);\n\n    /** Find an event by name.\n\t * @param EventName - The event name\n\t */\n    UFUNCTION(BlueprintCallable, Category = \"Audio|FMOD\")\n    static UFMODEvent *FindEventByName(const FString &Name);\n\n    /** Loads a bank.\n\t * @param Bank - bank to load\n\t * @param bBlocking - determines whether the bank will load synchronously\n\t * @param bLoadSampleData - determines whether sample data will be preloaded immediately\n\t */\n    UFUNCTION(BlueprintCallable, Category = \"Audio|FMOD\", meta = (UnsafeDuringActorConstruction = \"true\"))\n    static void LoadBank(class UFMODBank *Bank, bool bBlocking, bool bLoadSampleData);\n\n    /** Unloads a bank.\n\t * @param Bank - bank to unload\n\t */\n    UFUNCTION(BlueprintCallable, Category = \"Audio|FMOD\", meta = (UnsafeDuringActorConstruction = \"true\"))\n    static void UnloadBank(class UFMODBank *Bank);\n\n    /** Returns true if a bank is loaded.\n\t* @param Bank - bank to query\n\t*/\n    UFUNCTION(BlueprintCallable, Category = \"Audio|FMOD\", meta = (UnsafeDuringActorConstruction = \"true\"))\n    static bool IsBankLoaded(class UFMODBank *Bank);\n\n    /** Load bank sample data.\n\t * @param Bank - bank to load sample data from\n\t */\n    UFUNCTION(BlueprintCallable, Category = \"Audio|FMOD\", meta = (UnsafeDuringActorConstruction = \"true\"))\n    static void LoadBankSampleData(class UFMODBank *Bank);\n\n    /** Unload bank sample data.\n\t * @param Bank - bank to unload sample data from\n\t */\n    UFUNCTION(BlueprintCallable, Category = \"Audio|FMOD\", meta = (UnsafeDuringActorConstruction = \"true\"))\n    static void UnloadBankSampleData(class UFMODBank *Bank);\n\n    /** Load event sample data.  This can be done ahead of time to avoid loading stalls.\n\t * @param Event - event to load sample data from.\n\t */\n    UFUNCTION(BlueprintCallable, Category = \"Audio|FMOD\",\n        meta = (HidePin = \"WorldContextObject\", DefaultToSelf = \"WorldContextObject\", UnsafeDuringActorConstruction = \"true\"))\n    static void LoadEventSampleData(UObject *WorldContextObject, UFMODEvent *Event);\n\n    /** Unload event sample data.\n\t * @param Event - event to load sample data from.\n\t */\n    UFUNCTION(BlueprintCallable, Category = \"Audio|FMOD\",\n        meta = (HidePin = \"WorldContextObject\", DefaultToSelf = \"WorldContextObject\", UnsafeDuringActorConstruction = \"true\"))\n    static void UnloadEventSampleData(UObject *WorldContextObject, UFMODEvent *Event);\n\n    /** Return a list of all event instances that are playing for this event.\n\t\tBe careful using this function because it is possible to find and alter any playing sound, even ones owned by other audio components.\n\t * @param Event - event to find instances from.\n\t */\n    UFUNCTION(BlueprintCallable, Category = \"Audio|FMOD\",\n        meta = (HidePin = \"WorldContextObject\", DefaultToSelf = \"WorldContextObject\", UnsafeDuringActorConstruction = \"true\"))\n    static TArray<FFMODEventInstance> FindEventInstances(UObject *WorldContextObject, UFMODEvent *Event);\n\n    /** Set volume on a bus\n\t * @param Bus - bus to use\n\t * @param Volume - volume\n\t */\n    UFUNCTION(BlueprintCallable, Category = \"Audio|FMOD|Bus\", meta = (UnsafeDuringActorConstruction = \"true\"))\n    static void BusSetVolume(class UFMODBus *Bus, float Volume);\n\n    /** Pause/Unpause all events going through this bus\n\t * @param Bus - bus to use\n\t * @param bPaused - paused\n\t */\n    UFUNCTION(BlueprintCallable, Category = \"Audio|FMOD|Bus\", meta = (UnsafeDuringActorConstruction = \"true\"))\n    static void BusSetPaused(class UFMODBus *Bus, bool bPaused);\n\n    /** Mute/Unmute this bus\n\t * @param Bus - bus to use\n\t * @param bMute - mute\n\t */\n    UFUNCTION(BlueprintCallable, Category = \"Audio|FMOD|Bus\", meta = (UnsafeDuringActorConstruction = \"true\"))\n    static void BusSetMute(class UFMODBus *Bus, bool bMute);\n\n    /** Stops all EventInstances routed into the bus\n\t * @param Bus - bus to use\n\t * @param stopMode - desired stop mode\n\t */\n    UFUNCTION(BlueprintCallable, Category = \"Audio|FMOD|Bus\", meta = (UnsafeDuringActorConstruction = \"true\"))\n    static void BusStopAllEvents(class UFMODBus *Bus, EFMOD_STUDIO_STOP_MODE stopMode);\n\n    /** Set volume on a VCA\n\t * @param Vca - VCA to use\n\t * @param Volume - volume\n\t */\n    UFUNCTION(BlueprintCallable, Category = \"Audio|FMOD|VCA\", meta = (UnsafeDuringActorConstruction = \"true\"))\n    static void VCASetVolume(class UFMODVCA *Vca, float Volume);\n\n    /** Returns whether this FMOD Event Instance is valid.  The instance will be invalidated when the sound stops.\n\t * @param EventInstance - Event instance\n\t */\n    UFUNCTION(BlueprintCallable, Category = \"Audio|FMOD|EventInstance\", meta = (UnsafeDuringActorConstruction = \"true\"))\n    static bool EventInstanceIsValid(FFMODEventInstance EventInstance);\n\n    /** Set volume on an FMOD Event Instance.\n\t * @param EventInstance - Event instance\n\t * @param Value - Volume to set\n\t */\n    UFUNCTION(BlueprintCallable, Category = \"Audio|FMOD|EventInstance\", meta = (UnsafeDuringActorConstruction = \"true\"))\n    static void EventInstanceSetVolume(FFMODEventInstance EventInstance, float Volume);\n\n    /** Set pitch on an FMOD Event Instance.\n\t * @param EventInstance - Event instance\n\t * @param Value - Volume to set\n\t */\n    UFUNCTION(BlueprintCallable, Category = \"Audio|FMOD|EventInstance\", meta = (UnsafeDuringActorConstruction = \"true\"))\n    static void EventInstanceSetPitch(FFMODEventInstance EventInstance, float Pitch);\n\n    /** Pause/Unpause an FMOD Event Instance.\n\t * @param EventInstance - Event instance\n\t * @param Paused - Whether to pause or unpause\n\t */\n    UFUNCTION(BlueprintCallable, Category = \"Audio|FMOD|EventInstance\", meta = (UnsafeDuringActorConstruction = \"true\"))\n    static void EventInstanceSetPaused(FFMODEventInstance EventInstance, bool Paused);\n\n    /** Set a parameter on an FMOD Event Instance.\n\t * @param EventInstance - Event instance\n\t * @param Name - Name of parameter\n\t * @param Value - Value of parameter\n\t */\n    UFUNCTION(BlueprintCallable, Category = \"Audio|FMOD|EventInstance\", meta = (UnsafeDuringActorConstruction = \"true\"))\n    static void EventInstanceSetParameter(FFMODEventInstance EventInstance, FName Name, float Value);\n\n    /** Get a parameter on an FMOD Event Instance.\n\t * @param EventInstance - Event instance\n\t * @param Name - Name of parameter\n\t */\n    UFUNCTION(BlueprintCallable, Category = \"Audio|FMOD|EventInstance\", meta = (UnsafeDuringActorConstruction = \"true\"))\n    static float EventInstanceGetParameter(FFMODEventInstance EventInstance, FName Name);\n\n    /** Set an FMOD event property on an FMOD Event Instance.\n\t* @param EventInstance - Event instance\n\t* @param Property - Property to set\n\t* @param Value - Value to set\n\t*/\n    UFUNCTION(BlueprintCallable, Category = \"Audio|FMOD|EventInstance\", meta = (UnsafeDuringActorConstruction = \"true\"))\n    static void EventInstanceSetProperty(FFMODEventInstance EventInstance, EFMODEventProperty::Type Property, float Value);\n\n    /** Plays an FMOD Event Instance.\n\t * @param EventInstance - Event instance\n\t */\n    UFUNCTION(BlueprintCallable, Category = \"Audio|FMOD|EventInstance\", meta = (UnsafeDuringActorConstruction = \"true\"))\n    static void EventInstancePlay(FFMODEventInstance EventInstance);\n\n    /** Stop an FMOD Event Instance.\n\t * @param EventInstance - Event instance\n     * @param Release - Whether to release the Event Instance\n\t */\n    UFUNCTION(BlueprintCallable, Category = \"Audio|FMOD|EventInstance\", meta = (UnsafeDuringActorConstruction = \"true\"))\n    static void EventInstanceStop(FFMODEventInstance EventInstance, bool Release = false);\n\n    /** Release an FMOD Event Instance.\n    * @param EventInstance - Event instance\n    */\n    UFUNCTION(BlueprintCallable, Category = \"Audio|FMOD|EventInstance\", meta = (UnsafeDuringActorConstruction = \"true\"))\n    static void EventInstanceRelease(FFMODEventInstance EventInstance);\n\n    /** Trigger a cue on an FMOD Event Instance.\n\t * @param EventInstance - Event instance\n\t */\n    UFUNCTION(BlueprintCallable, Category = \"Audio|FMOD|EventInstance\", meta = (UnsafeDuringActorConstruction = \"true\"))\n    static void EventInstanceTriggerCue(FFMODEventInstance EventInstance);\n\n    /** Set transform on an FMOD Event Instance.\n\t * @param EventInstance - Event instance\n\t * @param Location - Location to place event\n\t */\n    UFUNCTION(BlueprintCallable, Category = \"Audio|FMOD|EventInstance\", meta = (UnsafeDuringActorConstruction = \"true\"))\n    static void EventInstanceSetTransform(FFMODEventInstance EventInstance, const FTransform &Location);\n\n    /** List all output device names.\n\t */\n    UFUNCTION(BlueprintCallable, Category = \"Audio|FMOD\")\n    static TArray<FString> GetOutputDrivers();\n\n    /** Set current output device by name or part of the name.\n\t */\n    UFUNCTION(BlueprintCallable, Category = \"Audio|FMOD\")\n    static void SetOutputDriverByName(FString NewDriverName);\n\n    /** Set current output device by its index from GetOutputDrivers.\n\t */\n    UFUNCTION(BlueprintCallable, Category = \"Audio|FMOD\")\n    static void SetOutputDriverByIndex(int NewDriverIndex);\n\n    /** Suspend the FMOD mixer.  Used when suspending the application.\n\t*/\n    UFUNCTION(BlueprintCallable, Category = \"Audio|FMOD\")\n    static void MixerSuspend();\n\n    /** Resume the FMOD mixer.  Used when resuming the application.\n\t*/\n    UFUNCTION(BlueprintCallable, Category = \"Audio|FMOD\")\n    static void MixerResume();\n};\n"
  },
  {
    "path": "Plugins/FMODStudio/Source/FMODStudio/Classes/FMODBus.h",
    "content": "// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2020.\n\n#pragma once\n\n#include \"FMODAsset.h\"\n#include \"FMODBus.generated.h\"\n\n/**\n * FMOD Bus Asset.\n */\nUCLASS()\nclass FMODSTUDIO_API UFMODBus : public UFMODAsset\n{\n    GENERATED_UCLASS_BODY()\n\n    /** Get tags to show in content view */\n    virtual void GetAssetRegistryTags(TArray<FAssetRegistryTag> &OutTags) const override;\n\n    /** Descriptive name */\n    virtual FString GetDesc() override;\n};\n"
  },
  {
    "path": "Plugins/FMODStudio/Source/FMODStudio/Classes/FMODEvent.h",
    "content": "// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2020.\n\n#pragma once\n\n#include \"FMODAsset.h\"\n#include \"FMODEvent.generated.h\"\n\nstruct FMOD_STUDIO_PARAMETER_DESCRIPTION;\n\n/**\n * FMOD Event Asset.\n */\nUCLASS()\nclass FMODSTUDIO_API UFMODEvent : public UFMODAsset\n{\n    GENERATED_UCLASS_BODY()\n\n    /** Get tags to show in content view */\n    virtual void GetAssetRegistryTags(TArray<FAssetRegistryTag> &OutTags) const override;\n\n    /** Descriptive name */\n    virtual FString GetDesc() override;\n\n    /** Get parameter descriptions for this event */\n    void GetParameterDescriptions(TArray<FMOD_STUDIO_PARAMETER_DESCRIPTION> &Parameters) const;\n};\n"
  },
  {
    "path": "Plugins/FMODStudio/Source/FMODStudio/Classes/FMODSettings.h",
    "content": "// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2020.\n\n#pragma once\n\n#include \"UObject/Class.h\"\n#include \"Engine/EngineTypes.h\"\n#include \"GenericPlatform/GenericPlatform.h\"\n#include \"FMODSettings.generated.h\"\n\nclass Paths;\n\nUENUM()\nenum EFMODLogging\n{\n    LEVEL_NONE = 0,\n    LEVEL_ERROR = 1,\n    LEVEL_WARNING = 2,\n    LEVEL_LOG = 4,\n    TYPE_MEMORY = 100,\n    TYPE_FILE = 200,\n    TYPE_CODEC = 400,\n    TYPE_TRACE = 800,\n    DISPLAY_TIMESTAMPS = 10000,\n    DISPLAY_LINENUMBERS = 20000,\n    DISPLAY_THREAD = 40000\n};\n\nUENUM()\nnamespace EFMODSpeakerMode\n{\nenum Type\n{\n    // The speakers are stereo\n    Stereo,\n    // 5.1 speaker setup\n    Surround_5_1,\n    // 7.1 speaker setup\n    Surround_7_1\n};\n}\n\nUSTRUCT()\nstruct FCustomPoolSizes\n{\n    GENERATED_USTRUCT_BODY()\n\n    /** Default = 0 (Disabled) units in bytes*/\n    UPROPERTY(config, EditAnywhere, Category = InitSettings, meta = (ClampMin = \"0\"))\n    int32 Desktop;\n    /** Default = 0 (Disabled) units in bytes*/\n    UPROPERTY(config, EditAnywhere, Category = InitSettings, meta = (ClampMin = \"0\"))\n    int32 Mobile;\n    /** Default = 0 (Disabled) units in bytes*/\n    UPROPERTY(config, EditAnywhere, Category = InitSettings, meta = (ClampMin = \"0\"))\n    int32 PS4;\n    /** Default = 0 (Disabled) units in bytes*/\n    UPROPERTY(config, EditAnywhere, Category = InitSettings, meta = (ClampMin = \"0\"))\n    int32 Switch;\n    /** Default = 0 (Disabled) units in bytes*/\n    UPROPERTY(config, EditAnywhere, Category = InitSettings, meta = (ClampMin = \"0\"))\n    int32 XboxOne;\n\n    FCustomPoolSizes()\n        : Desktop(0)\n        , Mobile(0)\n        , PS4(0)\n        , Switch(0)\n        , XboxOne(0)\n    {\n    }\n};\n\nUCLASS(config = Engine, defaultconfig)\nclass FMODSTUDIO_API UFMODSettings : public UObject\n{\n    GENERATED_UCLASS_BODY()\n\npublic:\n    /**\n\t * Whether to load all banks at startup.\n\t */\n    UPROPERTY(config, EditAnywhere, Category = Basic)\n    bool bLoadAllBanks;\n\n    /**\n\t * Whether to load all bank sample data into memory at startup.\n\t */\n    UPROPERTY(config, EditAnywhere, Category = Basic)\n    bool bLoadAllSampleData;\n\n    /**\n\t * Enable live update in non-final builds.\n\t */\n    UPROPERTY(config, EditAnywhere, Category = Basic)\n    bool bEnableLiveUpdate;\n\n    /**\n    * Enable live update in Editor for Auditioning. *Requires Restart*\n    */\n    UPROPERTY(Config, EditAnywhere, Category = Basic)\n    bool bEnableEditorLiveUpdate;\n\n    /**\n\t * Path to find your studio bank output directory, relative to Content directory.\n\t */\n    UPROPERTY(config, EditAnywhere, Category = Basic, meta = (RelativeToGameContentDir))\n    FDirectoryPath BankOutputDirectory;\n\n    /** Project Output Format, should match the mode set up for the Studio project. */\n    UPROPERTY(config, EditAnywhere, Category = Basic)\n    TEnumAsByte<EFMODSpeakerMode::Type> OutputFormat;\n\n    /**\n\t * Whether to enable vol0virtual, which means voices with low volume will automatically go virtual to save CPU.\n\t */\n    UPROPERTY(config, EditAnywhere, Category = InitSettings)\n    bool bVol0Virtual;\n\n    /**\n\t * If vol0virtual is enabled, the signal level at which to make channels virtual.\n\t */\n    UPROPERTY(config, EditAnywhere, Category = InitSettings)\n    float Vol0VirtualLevel;\n\n    /**\n\t * Sample rate to use, or 0 to match system rate.\n\t */\n    UPROPERTY(config, EditAnywhere, Category = InitSettings)\n    int32 SampleRate;\n\n    /**\n\t* Whether to match hardware sample rate where reasonable (44.1kHz to 48kHz).\n\t*/\n    UPROPERTY(config, EditAnywhere, Category = InitSettings)\n    bool bMatchHardwareSampleRate;\n\n    /**\n\t * Number of actual software voices that can be used at once.\n\t */\n    UPROPERTY(config, EditAnywhere, Category = InitSettings)\n    int32 RealChannelCount;\n\n    /**\n\t * Total number of voices available that can be either real or virtual.\n\t */\n    UPROPERTY(config, EditAnywhere, Category = InitSettings)\n    int32 TotalChannelCount;\n\n    /**\n\t * DSP mixer buffer length (eg. 512, 1024) or 0 for system default.\n\t * When changing the Buffer Length, Buffer Count also needs to be set.\n\t */\n    UPROPERTY(config, EditAnywhere, Category = InitSettings)\n    int32 DSPBufferLength;\n\n    /**\n\t * DSP mixer buffer count (eg. 2, 4) or 0 for system default.\n\t * When changing the Buffer Count, Buffer Length also needs to be set.\n\t */\n    UPROPERTY(config, EditAnywhere, Category = InitSettings)\n    int32 DSPBufferCount;\n\n    /**\n\t * File buffer size in bytes (2048 by default).\n\t */\n    UPROPERTY(config, EditAnywhere, Category = InitSettings)\n    int32 FileBufferSize;\n\n    /**\n\t * Studio update period in milliseconds, or 0 for default (which means 20ms).\n\t */\n    UPROPERTY(config, EditAnywhere, Category = InitSettings)\n    int32 StudioUpdatePeriod;\n\n    /**\n\t * Output device to choose at system start up, or empty for default.\n\t */\n    UPROPERTY(config, EditAnywhere, Category = InitSettings)\n    FString InitialOutputDriverName;\n\n    /**\n\t * Lock all mixer buses at startup, making sure they are created up front.\n\t */\n    UPROPERTY(config, EditAnywhere, Category = InitSettings)\n    bool bLockAllBuses;\n\n    /** \n     * Use specified memory pool size for platform, units in bytes. Disabled by default.\n     * FMOD may become unstable if the limit is exceeded!\n     */\n    UPROPERTY(config, EditAnywhere, Category = InitSettings)\n    FCustomPoolSizes MemoryPoolSizes;\n\n    /**\n\t * Live update port to use, or 0 for default.\n\t */\n    UPROPERTY(config, EditAnywhere, Category = Advanced, meta = (EditCondition = \"bEnableLiveUpdate\"))\n    int32 LiveUpdatePort;\n\n    /**\n    * Live update port to use while in editor for auditioning. *Requires Restart*\n    */\n    UPROPERTY(config, EditAnywhere, Category = Advanced, meta = (EditCondition = \"bEnableEditorLiveUpdate\"))\n    int32 EditorLiveUpdatePort;\n\n    /**\n\t * Extra plugin files to load.  \n\t * The plugin files should sit alongside the FMOD dynamic libraries in the ThirdParty directory.\n\t */\n    UPROPERTY(config, EditAnywhere, Category = Advanced)\n    TArray<FString> PluginFiles;\n\n    /**\n\t * Directory for content to appear in content window. Be careful changing this!\n\t */\n    UPROPERTY(config, EditAnywhere, Category = Advanced)\n    FString ContentBrowserPrefix;\n\n    /**\n\t * Force platform directory name, or leave empty for automatic (Desktop/Mobile/PS4/XBoxOne)\n\t */\n    UPROPERTY(config, EditAnywhere, Category = Advanced)\n    FString ForcePlatformName;\n\n    /**\n\t * Name of master bank.  The default in Studio is \"Master Bank\".\n\t */\n    UPROPERTY(config, EditAnywhere, Category = Advanced)\n    FString MasterBankName;\n\n    /**\n\t * Skip bank files of the given name.\n\t * Can be used to load all banks except for a certain set, such as localization banks.\n\t */\n    UPROPERTY(config, EditAnywhere, Category = Advanced)\n    FString SkipLoadBankName;\n\n    /**\n\t* Force wav writer output, for debugging only.  Setting this will prevent normal sound output!\n\t*/\n    UPROPERTY(config, EditAnywhere, Category = Advanced)\n    FString WavWriterPath;\n\n    UPROPERTY(config, EditAnywhere, Category = Advanced)\n    TEnumAsByte<EFMODLogging> LoggingLevel;\n\n    /** Is the bank path set up . */\n    bool IsBankPathSet() const { return !BankOutputDirectory.Path.IsEmpty(); }\n\n    /** Get the full bank path.  Uses the game's content directory as a base. */\n    FString GetFullBankPath() const;\n\n    /** Get the master bank path. */\n    FString GetMasterBankPath() const;\n\n    /** Get the master assets bank path. */\n    FString GetMasterAssetsBankPath() const;\n\n    /** Get the master strings bank path. */\n    FString GetMasterStringsBankPath() const;\n\n    /** Get all banks in our bank directory excluding the master and strings bank. */\n    void GetAllBankPaths(TArray<FString> &Paths, bool IncludeMasterBank = false) const;\n\n#if WITH_EDITOR\n    /** Check the settings for any configuration issues. */\n    enum EProblem\n    {\n        Okay,\n        BankPathNotSet,\n        AddedToUFS,\n        NotPackaged,\n        AddedToBoth\n    };\n\n    EProblem Check() const;\n#endif // WITH_EDITOR\n};\n"
  },
  {
    "path": "Plugins/FMODStudio/Source/FMODStudio/Classes/FMODSnapshot.h",
    "content": "// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2020.\n\n#pragma once\n\n#include \"FMODEvent.h\"\n#include \"FMODSnapshot.generated.h\"\n\n/**\n * FMOD Snapshot Asset.\n */\nUCLASS()\nclass FMODSTUDIO_API UFMODSnapshot : public UFMODEvent\n{\n    GENERATED_UCLASS_BODY()\n\n    /** Descriptive name */\n    virtual FString GetDesc() override;\n};\n"
  },
  {
    "path": "Plugins/FMODStudio/Source/FMODStudio/Classes/FMODSnapshotReverb.h",
    "content": "// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2020.\n\n#pragma once\n\n#include \"FMODAsset.h\"\n#include \"Sound/ReverbEffect.h\"\n#include \"FMODSnapshotReverb.generated.h\"\n\n/**\n * FMOD Event Asset.\n */\nUCLASS()\nclass FMODSTUDIO_API UFMODSnapshotReverb : public UReverbEffect\n{\n    GENERATED_UCLASS_BODY()\n\n    /** The unique Guid, which matches the one exported from FMOD Studio */\n    UPROPERTY()\n    FGuid AssetGuid;\n\n    /** Whether to show in the content window */\n    UPROPERTY()\n    bool bShowAsAsset;\n\n    /** Force this to be an asset */\n    virtual bool IsAsset() const override { return bShowAsAsset; }\n\n#if WITH_EDITORONLY_DATA\n    virtual void PostEditChangeProperty(FPropertyChangedEvent &PropertyChangedEvent) override;\n#endif // EDITORONLY_DATA\n};\n"
  },
  {
    "path": "Plugins/FMODStudio/Source/FMODStudio/Classes/FMODVCA.h",
    "content": "// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2020.\n\n#pragma once\n\n#include \"FMODAsset.h\"\n#include \"FMODVCA.generated.h\"\n\n/**\n * FMOD VCA Asset.\n */\nUCLASS()\nclass FMODSTUDIO_API UFMODVCA : public UFMODAsset\n{\n    GENERATED_UCLASS_BODY()\n\n    /** Get tags to show in content view */\n    virtual void GetAssetRegistryTags(TArray<FAssetRegistryTag> &OutTags) const override;\n\n    /** Descriptive name */\n    virtual FString GetDesc() override;\n};\n"
  },
  {
    "path": "Plugins/FMODStudio/Source/FMODStudio/FMODStudio.Build.cs",
    "content": "// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2020.\nusing System.IO;\n\nnamespace UnrealBuildTool.Rules\n{\n    public class FMODStudio : ModuleRules\n    {\n    #if WITH_FORWARDED_MODULE_RULES_CTOR\n        public FMODStudio(ReadOnlyTargetRules Target) : base(Target)\n    #else\n        public FMODStudio(TargetInfo Target)\n    #endif\n        {\n            PCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs;\n            PrivatePCHHeaderFile = \"Private/FMODStudioPrivatePCH.h\";\n\n            bFasterWithoutUnity = false;\n\n            PublicIncludePaths.Add(Path.Combine(ModuleDirectory, \"Public/FMOD\"));\n\n            PrivateIncludePaths.Add(Path.Combine(ModuleDirectory, \"Classes\"));\n\n            PublicDependencyModuleNames.AddRange(\n                new string[]\n                {\n                    \"Core\",\n                    \"CoreUObject\",\n                    \"Engine\",\n                    \"Media\",\n                    \"Projects\"\n                }\n                );\n\n            PrivateDependencyModuleNames.AddRange(\n                new string[]\n                {\n                    \"MovieScene\",\n                    \"MovieSceneTracks\"\n                }\n                );\n\n            if (Target.bBuildEditor == true)\n            {\n                PrivateDependencyModuleNames.Add(\"AssetRegistry\");\n                PrivateDependencyModuleNames.Add(\"UnrealEd\");\n                PrivateDependencyModuleNames.Add(\"Settings\");\n            }\n\n            DynamicallyLoadedModuleNames.AddRange(\n                new string[]\n                {\n                }\n                );\n\n            string configName = \"\";\n\n            if (Target.Configuration != UnrealTargetConfiguration.Shipping)\n            {\n                configName = \"L\";\n                PublicDefinitions.Add(\"FMODSTUDIO_LINK_LOGGING=1\");\n            }\n            else\n            {\n                configName = \"\";\n                PublicDefinitions.Add(\"FMODSTUDIO_LINK_RELEASE=1\");\n            }\n\n            string platformName = Target.Platform.ToString();\n\n            string platformMidName = \"\";\n            string linkExtension = \"\";\n            string dllExtension = \"\";\n            string libPrefix = \"\";\n\n            // ModuleDirectory points to FMODStudio\\source\\FMODStudio, need to get back to binaries directory for our libs\n            string BasePath = System.IO.Path.Combine(ModuleDirectory, \"../../Binaries\", platformName);\n            // Collapse the directory path, otherwise OSX is having issues with plugin paths.\n            BasePath = Utils.CleanDirectorySeparators(BasePath);\n\n            string copyThirdPartyPath = \"\";\n            bool bAddRuntimeDependencies = true;\n            bool bAddDelayLoad = false;\n            bool bShortLinkNames = false;\n            bool bLinkFromBinaries = true;\n\n            // Minimum UE version for Switch 4.15\n            System.Console.WriteLine(\"Target Platform -- \" + Target.Platform.ToString());\n            if (Target.Platform.ToString() == \"Switch\")\n            {\n                linkExtension = \".a\";\n                dllExtension = \".a\";\n                libPrefix = \"lib\";\n                bAddRuntimeDependencies = false;\n            }\n            else if (Target.Platform.ToString() == \"UWP64\")\n            {\n                platformMidName = \"_X64\";\n                linkExtension = \".lib\";\n                dllExtension = \".dll\";\n                bAddDelayLoad = true;\n            }\n            else\n            {\n                switch (Target.Platform)\n                {\n                    case UnrealTargetPlatform.Win32:\n                        linkExtension = \"_vc.lib\";\n                        dllExtension = \".dll\";\n                        bAddDelayLoad = true;\n                        break;\n                    case UnrealTargetPlatform.Win64:\n                        platformMidName = \"64\";\n                        linkExtension = \"_vc.lib\";\n                        dllExtension = \".dll\";\n                        bAddDelayLoad = true;\n                        break;\n                    case UnrealTargetPlatform.Mac:\n                        linkExtension = dllExtension = \".dylib\";\n                        libPrefix = \"lib\";\n                        bLinkFromBinaries = false;\n                        break;\n                    case UnrealTargetPlatform.XboxOne:\n                        linkExtension = \"_vc.lib\";\n                        dllExtension = \".dll\";\n                        copyThirdPartyPath = \"../XBoxOne\"; // XBoxOne still doesn't seem to support plugins with .dlls\n                        bAddDelayLoad = false;\n                        break;\n                    case UnrealTargetPlatform.PS4:\n                        linkExtension = \"_stub.a\";\n                        dllExtension = \".prx\";\n                        libPrefix = \"lib\";\n                        bAddDelayLoad = true;\n                        break;\n                    case UnrealTargetPlatform.Android:\n                        // Don't use an explicit path with the .so, let the architecture dirs be filtered by UBT\n                        PublicLibraryPaths.Add(System.IO.Path.Combine(BasePath, \"armeabi-v7a\"));\n                        PublicLibraryPaths.Add(System.IO.Path.Combine(BasePath, \"arm64-v8a\"));\n                        PublicLibraryPaths.Add(System.IO.Path.Combine(BasePath, \"x86\"));\n                        bAddRuntimeDependencies = false; // Don't use this system\n                        bShortLinkNames = true; // strip off lib and .so\n                        linkExtension = dllExtension = \".so\";\n                        libPrefix = \"lib\";\n                        break;\n                    case UnrealTargetPlatform.IOS:\n                        linkExtension = \"_iphoneos.a\";\n                        libPrefix = \"lib\";\n                        bAddRuntimeDependencies = false;\n                        break;\n                    case UnrealTargetPlatform.Linux:\n                        BasePath = System.IO.Path.Combine(BasePath, \"x86_64\");\n                        linkExtension = \".so\";\n                        dllExtension = \".so\";\n                        libPrefix = \"lib\";\n                        break;\n                    default:\n                        //extName = \".a\";\n                        throw new System.Exception(System.String.Format(\"Unsupported platform {0}\", Target.Platform.ToString()));\n                        //break;\n                }\n            }\n\n            //System.Console.WriteLine(\"FMOD Current path: \" + System.IO.Path.GetFullPath(\".\"));\n            //System.Console.WriteLine(\"FMOD Base path: \" + BasePath);\n\n            PublicLibraryPaths.Add(BasePath);\n\n            string fmodLibName = System.String.Format(\"{0}fmod{1}{2}{3}\", libPrefix, configName, platformMidName, linkExtension);\n            string fmodStudioLibName = System.String.Format(\"{0}fmodstudio{1}{2}{3}\", libPrefix, configName, platformMidName, linkExtension);\n\n            string fmodDllName = System.String.Format(\"{0}fmod{1}{2}{3}\", libPrefix, configName, platformMidName, dllExtension);\n            string fmodStudioDllName = System.String.Format(\"{0}fmodstudio{1}{2}{3}\", libPrefix, configName, platformMidName, dllExtension);\n\n            string fmodLibPath = System.IO.Path.Combine(BasePath, fmodLibName);\n            string fmodStudioLibPath = System.IO.Path.Combine(BasePath, fmodStudioLibName);\n\n            string fmodDllPath = System.IO.Path.Combine(BasePath, fmodDllName);\n            string fmodStudioDllPath = System.IO.Path.Combine(BasePath, fmodStudioDllName);\n\n            System.Collections.Generic.List<string> plugins = GetPlugins(BasePath);\n\n            if (bShortLinkNames)\n            {\n                // For android we have provided the paths to all architectures above\n                // Just provide the name without \"lib\" and without extension\n                PublicAdditionalLibraries.Add(System.String.Format(\"fmod{0}{1}\", configName, platformMidName));\n                PublicAdditionalLibraries.Add(System.String.Format(\"fmodstudio{0}{1}\", configName, platformMidName));\n            }\n            else if (bLinkFromBinaries)\n            {\n                PublicAdditionalLibraries.Add(fmodLibPath);\n                PublicAdditionalLibraries.Add(fmodStudioLibPath);\n            }\n            else\n            {\n                string LibPath = System.IO.Path.Combine(ModuleDirectory, \"../../Libs/Mac/\");\n                PublicAdditionalLibraries.Add(System.String.Format(\"{0}libfmod{1}.dylib\", LibPath, configName));\n                PublicAdditionalLibraries.Add(System.String.Format(\"{0}libfmodStudio{1}.dylib\", LibPath, configName));\n            }\n\n            if (bAddRuntimeDependencies)\n            {\n                RuntimeDependencies.Add(fmodDllPath);\n                RuntimeDependencies.Add(fmodStudioDllPath);\n                foreach (string plugin in plugins)\n                {\n                    string pluginPath = System.IO.Path.Combine(BasePath, plugin + dllExtension);\n                    System.Console.WriteLine(\"Adding reference to FMOD plugin: \" + pluginPath);\n                    RuntimeDependencies.Add(pluginPath);\n                }\n            }\n\n            if (copyThirdPartyPath.Length != 0)\n            {\n                string destPath = System.IO.Path.Combine(Target.UEThirdPartyBinariesDirectory, copyThirdPartyPath);\n                System.IO.Directory.CreateDirectory(destPath);\n\n                string fmodDllDest = System.IO.Path.Combine(destPath, fmodDllName);\n                string fmodStudioDllDest = System.IO.Path.Combine(destPath, fmodStudioDllName);\n\n                CopyFile(fmodDllPath, fmodDllDest);\n                CopyFile(fmodStudioDllPath, fmodStudioDllDest);\n            }\n\n            if (bAddDelayLoad)\n            {\n                PublicDelayLoadDLLs.AddRange(\n                        new string[] {\n                            fmodDllName,\n                            fmodStudioDllName\n                            }\n                        );\n            }\n\n            if (Target.Platform == UnrealTargetPlatform.Android)\n            {\n                string APLName = System.String.Format(\"FMODStudio{0}_APL.xml\", configName);\n                string RelAPLPath = Utils.MakePathRelativeTo(System.IO.Path.Combine(ModuleDirectory, APLName), Target.RelativeEnginePath);\n                System.Console.WriteLine(\"Adding {0}\", RelAPLPath);\n                AdditionalPropertiesForReceipt.Add(\"AndroidPlugin\", RelAPLPath);\n                foreach (string PluginName in System.IO.Directory.GetFiles(BasePath))\n                {\n                    if (PluginName.EndsWith(\"_APL.xml\", System.StringComparison.OrdinalIgnoreCase))\n                    {\n                        string RelPluginPath = Utils.MakePathRelativeTo(PluginName, Target.RelativeEnginePath);\n                        System.Console.WriteLine(\"Adding {0}\", RelPluginPath);\n                        AdditionalPropertiesForReceipt.Add(\"AndroidPlugin\", RelPluginPath);\n                    }\n                }\n            }\n        }\n\n        private void CopyFile(string source, string dest)\n        {\n            //System.Console.WriteLine(\"Copying {0} to {1}\", source, dest);\n            if (System.IO.File.Exists(dest))\n            {\n                System.IO.File.SetAttributes(dest, System.IO.File.GetAttributes(dest) & ~System.IO.FileAttributes.ReadOnly);\n            }\n            try\n            {\n                System.IO.File.Copy(source, dest, true);\n            }\n            catch (System.Exception ex)\n            {\n                System.Console.WriteLine(\"Failed to copy file: {0}\", ex.Message);\n            }\n        }\n\n        private System.Collections.Generic.List<string> GetPlugins(string BasePath)\n        {\n            System.Collections.Generic.List<string> AllPlugins = new System.Collections.Generic.List<string>();\n            string PluginListName = System.IO.Path.Combine(BasePath, \"plugins.txt\");\n            if (System.IO.File.Exists(PluginListName))\n            {\n                try\n                {\n                    foreach (string FullEntry in System.IO.File.ReadAllLines(PluginListName))\n                    {\n                        string Entry = FullEntry.Trim();\n                        if (Entry.Length > 0)\n                        {\n                            AllPlugins.Add(Entry);\n                        }\n                    }\n                }\n                catch (System.Exception ex)\n                {\n                    System.Console.WriteLine(\"Failed to read plugin list file: {0}\", ex.Message);\n                }\n            }\n            return AllPlugins;\n        }\n    }\n}\n"
  },
  {
    "path": "Plugins/FMODStudio/Source/FMODStudio/FMODStudioL_APL.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--GearVR plugin additions-->\n<root xmlns:android=\"http://schemas.android.com/apk/res/android\">\n\t<!-- init section is always evaluated once per architecture -->\n\t<init>\n\t\t<log text=\"FMODStudio APL init (logging build)\"/>\n\t\t<setString result=\"ConfigSuffix\" value=\"L\"/>\n\t</init>\n\n\t<!-- optional additions to proguard -->\n\t<proguardAdditions>\n\t\t<insert>\n\t\t\t-keep class org.fmod.** {\n\t\t\t*;\n\t\t\t}\n\t\t\t-dontwarn org.fmod.**\n\t\t</insert>\n\t</proguardAdditions>\n\n\t<!-- optional files or directories to copy to Intermediate/Android/APK -->\n\t<resourceCopies>\n\t\t<log text=\"FMODStudio APL copying files for $S(Architecture)\"/>\n\t\t<copyFile src=\"$S(PluginDir)/../../Binaries/Android/$S(Architecture)/libfmod$S(ConfigSuffix).so\"\n\t\t\t\t\tdst=\"$S(BuildDir)/libs/$S(Architecture)/libfmod$S(ConfigSuffix).so\" />\n\t\t<copyFile src=\"$S(PluginDir)/../../Binaries/Android/$S(Architecture)/libfmodstudio$S(ConfigSuffix).so\"\n\t\t\t\t\tdst=\"$S(BuildDir)/libs/$S(Architecture)/libfmodstudio$S(ConfigSuffix).so\" />\n\t\t<copyFile src=\"$S(PluginDir)/../../Binaries/Android/fmod.jar\"\n\t\t\t\t\tdst=\"$S(BuildDir)/libs/fmod.jar\" />\n\t</resourceCopies>\n\n\t<!-- optional additions to GameActivity onCreate in GameActivity.java -->\n\t<gameActivityOnCreateAdditions>\n\t\t<insert>\n\t\t// Initialize FMOD Studio jar file\n\t\torg.fmod.FMOD.init(this);\n\t\t</insert>\n\t</gameActivityOnCreateAdditions>\n\n\t<!-- optional additions to GameActivity onDestroy in GameActivity.java -->\n\t<gameActivityOnDestroyAdditions>\n\t\t<insert>\n\t\t// Shutdown FMOD Studio jar file\n\t\torg.fmod.FMOD.close();\n\t\t</insert>\n\t</gameActivityOnDestroyAdditions>\n\n\t<!-- optional libraries to load in GameActivity.java before libUE4.so -->\n\t<soLoadLibrary>\n\t\t<log text=\"FMODStudio APL adding loadLibrary references\"/>\n\t\t<loadLibrary name=\"fmod$S(ConfigSuffix)\" failmsg=\"libfmod$S(ConfigSuffix) not loaded and required!\" />\n\t\t<loadLibrary name=\"fmodstudio$S(ConfigSuffix)\" failmsg=\"libfmodstudio$S(ConfigSuffix) not loaded and required!\" />\n\t</soLoadLibrary>\n</root>\n"
  },
  {
    "path": "Plugins/FMODStudio/Source/FMODStudio/FMODStudio_APL.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--GearVR plugin additions-->\n<root xmlns:android=\"http://schemas.android.com/apk/res/android\">\n\t<!-- init section is always evaluated once per architecture -->\n\t<init>\n\t\t<log text=\"FMODStudio APL init (shipping build)\"/>\n\t\t<setString result=\"ConfigSuffix\" value=\"\"/>\n\t</init>\n\n\t<!-- optional additions to proguard -->\n\t<proguardAdditions>\n\t\t<insert>\n\t\t\t-keep class org.fmod.** {\n\t\t\t*;\n\t\t\t}\n\t\t\t-dontwarn org.fmod.**\n\t\t</insert>\n\t</proguardAdditions>\n\n\t<!-- optional files or directories to copy to Intermediate/Android/APK -->\n\t<resourceCopies>\n\t\t<log text=\"FMODStudio APL copying files for $S(Architecture)\"/>\n\t\t<copyFile src=\"$S(PluginDir)/../../Binaries/Android/$S(Architecture)/libfmod$S(ConfigSuffix).so\"\n\t\t\t\t\tdst=\"$S(BuildDir)/libs/$S(Architecture)/libfmod$S(ConfigSuffix).so\" />\n\t\t<copyFile src=\"$S(PluginDir)/../../Binaries/Android/$S(Architecture)/libfmodstudio$S(ConfigSuffix).so\"\n\t\t\t\t\tdst=\"$S(BuildDir)/libs/$S(Architecture)/libfmodstudio$S(ConfigSuffix).so\" />\n\t\t<copyFile src=\"$S(PluginDir)/../../Binaries/Android/fmod.jar\"\n\t\t\t\t\tdst=\"$S(BuildDir)/libs/fmod.jar\" />\n\t</resourceCopies>\n\n\t<!-- optional additions to GameActivity onCreate in GameActivity.java -->\n\t<gameActivityOnCreateAdditions>\n\t\t<insert>\n\t\t// Initialize FMOD Studio jar file\n\t\torg.fmod.FMOD.init(this);\n\t\t</insert>\n\t</gameActivityOnCreateAdditions>\n\n\t<!-- optional additions to GameActivity onDestroy in GameActivity.java -->\n\t<gameActivityOnDestroyAdditions>\n\t\t<insert>\n\t\t// Shutdown FMOD Studio jar file\n\t\torg.fmod.FMOD.close();\n\t\t</insert>\n\t</gameActivityOnDestroyAdditions>\n\n\t<!-- optional libraries to load in GameActivity.java before libUE4.so -->\n\t<soLoadLibrary>\n\t\t<log text=\"FMODStudio APL adding loadLibrary references\"/>\n\t\t<loadLibrary name=\"fmod$S(ConfigSuffix)\" failmsg=\"libfmod$S(ConfigSuffix) not loaded and required!\" />\n\t\t<loadLibrary name=\"fmodstudio$S(ConfigSuffix)\" failmsg=\"libfmodstudio$S(ConfigSuffix) not loaded and required!\" />\n\t</soLoadLibrary>\n</root>\n"
  },
  {
    "path": "Plugins/FMODStudio/Source/FMODStudio/Private/FMODAmbientSound.cpp",
    "content": "// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2020.\n\n#include \"FMODAmbientSound.h\"\n#include \"FMODEvent.h\"\n#include \"Logging/MessageLog.h\"\n#include \"Misc/UObjectToken.h\"\n#include \"Misc/MapErrors.h\"\n\n#define LOCTEXT_NAMESPACE \"FMODAmbientSound\"\n\nAFMODAmbientSound::AFMODAmbientSound(const FObjectInitializer &ObjectInitializer)\n    : Super(ObjectInitializer)\n{\n    AudioComponent = ObjectInitializer.CreateDefaultSubobject<UFMODAudioComponent>(this, TEXT(\"FMODAudioComponent0\"));\n\n    AudioComponent->bAutoActivate = true;\n    AudioComponent->bStopWhenOwnerDestroyed = true;\n    AudioComponent->Mobility = EComponentMobility::Movable;\n\n    RootComponent = AudioComponent;\n\n    bReplicates = false;\n    bHidden = true;\n    bCanBeDamaged = false;\n}\n\n#if WITH_EDITOR\n\nvoid AFMODAmbientSound::CheckForErrors(void)\n{\n    Super::CheckForErrors();\n\n    if (!AudioComponent)\n    {\n        FFormatNamedArguments Arguments;\n        Arguments.Add(TEXT(\"ActorName\"), FText::FromString(GetName()));\n        FMessageLog(\"MapCheck\")\n            .Warning()\n            ->AddToken(FUObjectToken::Create(this))\n            ->AddToken(FTextToken::Create(FText::Format(\n                LOCTEXT(\"MapCheck_Message_AudioComponentNull\", \"{ActorName} : Ambient sound actor has NULL AudioComponent property - please delete\"),\n                Arguments)))\n            ->AddToken(FMapErrorToken::Create(FMapErrors::AudioComponentNull));\n    }\n    else if (AudioComponent->Event == NULL)\n    {\n        FFormatNamedArguments Arguments;\n        Arguments.Add(TEXT(\"ActorName\"), FText::FromString(GetName()));\n        FMessageLog(\"MapCheck\")\n            .Warning()\n            ->AddToken(FUObjectToken::Create(this))\n            ->AddToken(FTextToken::Create(\n                FText::Format(LOCTEXT(\"MapCheck_Message_EventNull\", \"{ActorName} : Ambient sound actor has NULL Event property\"), Arguments)))\n            ->AddToken(FMapErrorToken::Create(FMapErrors::SoundCueNull));\n    }\n}\n\nbool AFMODAmbientSound::GetReferencedContentObjects(TArray<UObject *> &Objects) const\n{\n    if (IsValid(AudioComponent) && AudioComponent->Event)\n    {\n        Objects.Add(AudioComponent->Event.Get());\n    }\n    return true;\n}\n\n#endif\n\n#undef LOCTEXT_NAMESPACE"
  },
  {
    "path": "Plugins/FMODStudio/Source/FMODStudio/Private/FMODAnimNotifyPlay.cpp",
    "content": "\n#include \"FMODAnimNotifyPlay.h\"\n#include \"FMODBlueprintStatics.h\"\n#include \"Components/SkeletalMeshComponent.h\"\n#include \"Kismet/KismetSystemLibrary.h\"\n\nUFMODAnimNotifyPlay::UFMODAnimNotifyPlay()\n    : Super()\n{\n\n#if WITH_EDITORONLY_DATA\n    NotifyColor = FColor(196, 142, 255, 255);\n#endif // WITH_EDITORONLY_DATA\n}\n\nvoid UFMODAnimNotifyPlay::Notify(USkeletalMeshComponent *MeshComp, UAnimSequenceBase *AnimSeq)\n{\n    if (Event.IsValid())\n    {\n        if (bFollow)\n        {\n            // Play event attached\n            UFMODBlueprintStatics::PlayEventAttached(\n                Event.Get(), MeshComp, *AttachName, FVector(0, 0, 0), EAttachLocation::KeepRelativeOffset, false, true, true);\n        }\n        else\n        {\n            // Play event at location\n            UFMODBlueprintStatics::PlayEventAtLocation(MeshComp, Event.Get(), MeshComp->GetComponentTransform(), true);\n        }\n    }\n}\n\nFString UFMODAnimNotifyPlay::GetNotifyName_Implementation() const\n{\n    if (Event.IsValid())\n    {\n        return (Event.Get())->GetName();\n    }\n    else\n    {\n        return Super::GetNotifyName_Implementation();\n    }\n}"
  },
  {
    "path": "Plugins/FMODStudio/Source/FMODStudio/Private/FMODAsset.cpp",
    "content": "// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2020.\n\n#include \"FMODAsset.h\"\n#include \"FMODStudioModule.h\"\n\nstatic const TCHAR *FMODAssetTypeStrings[] = { TEXT(\"Bank\"), TEXT(\"Event\"), TEXT(\"VCA\"), TEXT(\"Bus\"), TEXT(\"Invalid\") };\n\nUFMODAsset::UFMODAsset(const FObjectInitializer &ObjectInitializer)\n    : Super(ObjectInitializer)\n{\n}\n\n/** Get tags to show in content view */\nvoid UFMODAsset::GetAssetRegistryTags(TArray<FAssetRegistryTag> &OutTags) const\n{\n    Super::GetAssetRegistryTags(OutTags);\n    OutTags.Add(\n        UObject::FAssetRegistryTag(\"Guid\", AssetGuid.ToString(EGuidFormats::DigitsWithHyphensInBraces), UObject::FAssetRegistryTag::TT_Alphabetical));\n}\n"
  },
  {
    "path": "Plugins/FMODStudio/Source/FMODStudio/Private/FMODAssetTable.cpp",
    "content": "// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2020.\n\n#include \"FMODAssetTable.h\"\n#include \"FMODEvent.h\"\n#include \"FMODSnapshot.h\"\n#include \"FMODSnapshotReverb.h\"\n#include \"FMODBank.h\"\n#include \"FMODBus.h\"\n#include \"FMODVCA.h\"\n#include \"FMODUtils.h\"\n#include \"FMODSettings.h\"\n#include \"FMODFileCallbacks.h\"\n#include \"FMODStudioPrivatePCH.h\"\n#include \"fmod_studio.hpp\"\n#include \"UObject/Package.h\"\n\n#if WITH_EDITOR\n#include \"AssetRegistryModule.h\"\n#endif\n\nFFMODAssetTable::FFMODAssetTable()\n    : StudioSystem(nullptr)\n{\n}\n\nFFMODAssetTable::~FFMODAssetTable()\n{\n    Destroy();\n}\n\nvoid FFMODAssetTable::Create()\n{\n    Destroy();\n\n    // Create a sandbox system purely for loading and considering banks\n    verifyfmod(FMOD::Studio::System::create(&StudioSystem));\n    FMOD::System *lowLevelSystem = nullptr;\n    verifyfmod(StudioSystem->getLowLevelSystem(&lowLevelSystem));\n    verifyfmod(lowLevelSystem->setOutput(FMOD_OUTPUTTYPE_NOSOUND));\n    AttachFMODFileSystem(lowLevelSystem, 2048);\n    verifyfmod(\n        StudioSystem->initialize(1, FMOD_STUDIO_INIT_ALLOW_MISSING_PLUGINS | FMOD_STUDIO_INIT_SYNCHRONOUS_UPDATE, FMOD_INIT_MIX_FROM_UPDATE, 0));\n}\n\nvoid FFMODAssetTable::Destroy()\n{\n    if (StudioSystem != nullptr)\n    {\n        verifyfmod(StudioSystem->release());\n    }\n    StudioSystem = nullptr;\n}\n\nUFMODAsset *FFMODAssetTable::FindByName(const FString &Name)\n{\n    TWeakObjectPtr<UFMODAsset> *FoundAsset = FullNameLookup.Find(Name);\n    if (FoundAsset)\n    {\n        return FoundAsset->Get();\n    }\n    return nullptr;\n}\n\nvoid FFMODAssetTable::Refresh()\n{\n    if (StudioSystem == nullptr)\n    {\n        return;\n    }\n\n    const UFMODSettings &Settings = *GetDefault<UFMODSettings>();\n    FString StringPath = Settings.GetMasterStringsBankPath();\n\n    UE_LOG(LogFMOD, Log, TEXT(\"Loading strings bank: %s\"), *StringPath);\n\n    FMOD::Studio::Bank *StudioStringBank;\n    FMOD_RESULT StringResult = StudioSystem->loadBankFile(TCHAR_TO_UTF8(*StringPath), FMOD_STUDIO_LOAD_BANK_NORMAL, &StudioStringBank);\n    if (StringResult == FMOD_OK)\n    {\n        TArray<char> RawBuffer;\n        RawBuffer.SetNum(256); // Initial capacity\n\n        int Count = 0;\n        verifyfmod(StudioStringBank->getStringCount(&Count));\n        for (int StringIdx = 0; StringIdx < Count; ++StringIdx)\n        {\n            FMOD_RESULT Result;\n            FMOD::Studio::ID Guid = { 0 };\n            while (true)\n            {\n                int ActualSize = 0;\n                Result = StudioStringBank->getStringInfo(StringIdx, &Guid, RawBuffer.GetData(), RawBuffer.Num(), &ActualSize);\n                if (Result == FMOD_ERR_TRUNCATED)\n                {\n                    RawBuffer.SetNum(ActualSize);\n                }\n                else\n                {\n                    break;\n                }\n            }\n            verifyfmod(Result);\n            FString AssetName(UTF8_TO_TCHAR(RawBuffer.GetData()));\n            FGuid AssetGuid = FMODUtils::ConvertGuid(Guid);\n            if (!AssetName.IsEmpty())\n            {\n                AddAsset(AssetGuid, AssetName);\n            }\n        }\n        verifyfmod(StudioStringBank->unload());\n        verifyfmod(StudioSystem->update());\n    }\n    else\n    {\n        UE_LOG(LogFMOD, Warning, TEXT(\"Failed to load strings bank: %s\"), *StringPath);\n    }\n}\n\nvoid FFMODAssetTable::AddAsset(const FGuid &AssetGuid, const FString &AssetFullName)\n{\n    FString AssetPath = AssetFullName;\n    FString AssetType = \"\";\n    FString AssetFileName = \"asset\";\n\n    int DelimIndex;\n    if (AssetPath.FindChar(':', DelimIndex))\n    {\n        AssetType = AssetPath.Left(DelimIndex);\n        AssetPath = AssetPath.Right(AssetPath.Len() - DelimIndex - 1);\n    }\n\n    FString FormattedAssetType = \"\";\n    UClass *AssetClass = UFMODAsset::StaticClass();\n    if (AssetType.Equals(TEXT(\"event\")))\n    {\n        FormattedAssetType = TEXT(\"Events\");\n        AssetClass = UFMODEvent::StaticClass();\n    }\n    else if (AssetType.Equals(TEXT(\"snapshot\")))\n    {\n        FormattedAssetType = TEXT(\"Snapshots\");\n        AssetClass = UFMODSnapshot::StaticClass();\n    }\n    else if (AssetType.Equals(TEXT(\"bank\")))\n    {\n        FormattedAssetType = TEXT(\"Banks\");\n        AssetClass = UFMODBank::StaticClass();\n    }\n    else if (AssetType.Equals(TEXT(\"bus\")))\n    {\n        FormattedAssetType = TEXT(\"Buses\");\n        AssetClass = UFMODBus::StaticClass();\n    }\n    else if (AssetType.Equals(TEXT(\"vca\")))\n    {\n        FormattedAssetType = TEXT(\"VCAs\");\n        AssetClass = UFMODVCA::StaticClass();\n    }\n    else\n    {\n        UE_LOG(LogFMOD, Warning, TEXT(\"Unknown asset type: %s\"), *AssetType);\n    }\n\n    if (AssetPath.FindLastChar('/', DelimIndex))\n    {\n        AssetFileName = AssetPath.Right(AssetPath.Len() - DelimIndex - 1);\n        AssetPath = AssetPath.Left(AssetPath.Len() - AssetFileName.Len() - 1);\n    }\n    else\n    {\n        // No path part, all name\n        AssetFileName = AssetPath;\n        AssetPath = TEXT(\"\");\n    }\n\n    if (AssetFileName.IsEmpty() || AssetFileName.Contains(TEXT(\".strings\")))\n    {\n        UE_LOG(LogFMOD, Log, TEXT(\"Skipping asset: %s\"), *AssetFullName);\n        return;\n    }\n\n    AssetPath = AssetPath.Replace(TEXT(\" \"), TEXT(\"_\"));\n    FString AssetShortName = AssetFileName.Replace(TEXT(\" \"), TEXT(\"_\"));\n    AssetShortName = AssetShortName.Replace(TEXT(\".\"), TEXT(\"_\"));\n\n    const UFMODSettings &Settings = *GetDefault<UFMODSettings>();\n\n    FString FolderPath = Settings.ContentBrowserPrefix;\n    FolderPath += FormattedAssetType;\n    FolderPath += AssetPath;\n\n    FString AssetPackagePath = FolderPath + TEXT(\"/\") + AssetShortName;\n\n    FName AssetPackagePathName(*AssetPackagePath);\n\n    TWeakObjectPtr<UFMODAsset> &ExistingNameAsset = NameMap.FindOrAdd(AssetPackagePathName);\n    TWeakObjectPtr<UFMODAsset> &ExistingGuidAsset = GuidMap.FindOrAdd(AssetGuid);\n    TWeakObjectPtr<UFMODAsset> &ExistingFullNameLookupAsset = FullNameLookup.FindOrAdd(AssetFullName);\n\n    UFMODAsset *AssetNameObject = ExistingNameAsset.Get();\n    if (AssetNameObject == nullptr)\n    {\n        UE_LOG(LogFMOD, Log, TEXT(\"Constructing asset: %s\"), *AssetPackagePath);\n\n        EObjectFlags NewObjectFlags = RF_Standalone | RF_Public /* | RF_Transient */;\n        if (IsRunningDedicatedServer())\n        {\n            NewObjectFlags |= RF_MarkAsRootSet;\n        }\n\n        UPackage *NewPackage = CreatePackage(NULL, *AssetPackagePath);\n        if (IsValid(NewPackage))\n        {\n            if (!GEventDrivenLoaderEnabled)\n            {\n                NewPackage->SetPackageFlags(PKG_CompiledIn);\n            }\n\n            AssetNameObject = NewObject<UFMODAsset>(NewPackage, AssetClass, FName(*AssetShortName), NewObjectFlags);\n            AssetNameObject->AssetGuid = AssetGuid;\n            AssetNameObject->bShowAsAsset = true;\n            AssetNameObject->FileName = AssetFileName;\n\n#if WITH_EDITOR\n            FAssetRegistryModule &AssetRegistryModule = FModuleManager::LoadModuleChecked<FAssetRegistryModule>(TEXT(\"AssetRegistry\"));\n            AssetRegistryModule.Get().AddPath(*FolderPath);\n            FAssetRegistryModule::AssetCreated(AssetNameObject);\n#endif\n        }\n        else\n        {\n            UE_LOG(LogFMOD, Warning, TEXT(\"Failed to construct package for asset %s\"), *AssetPackagePath);\n        }\n\n        if (AssetClass == UFMODSnapshot::StaticClass())\n        {\n            FString ReverbFolderPath = Settings.ContentBrowserPrefix;\n            ReverbFolderPath += TEXT(\"Reverbs\");\n            ReverbFolderPath += AssetPath;\n\n            FString ReverbAssetPackagePath = ReverbFolderPath + TEXT(\"/\") + AssetShortName;\n\n            UPackage *ReverbPackage = CreatePackage(NULL, *ReverbAssetPackagePath);\n            if (ReverbPackage)\n            {\n                if (!GEventDrivenLoaderEnabled)\n                {\n                    ReverbPackage->SetPackageFlags(PKG_CompiledIn);\n                }\n                UFMODSnapshotReverb *AssetReverb = NewObject<UFMODSnapshotReverb>(\n                    ReverbPackage, UFMODSnapshotReverb::StaticClass(), FName(*AssetShortName), NewObjectFlags);\n                AssetReverb->AssetGuid = AssetGuid;\n                AssetReverb->bShowAsAsset = true;\n\n#if WITH_EDITOR\n                FAssetRegistryModule &AssetRegistryModule = FModuleManager::LoadModuleChecked<FAssetRegistryModule>(TEXT(\"AssetRegistry\"));\n                AssetRegistryModule.Get().AddPath(*ReverbFolderPath);\n                FAssetRegistryModule::AssetCreated(AssetReverb);\n#endif\n            }\n        }\n    }\n\n    UFMODAsset *AssetGuidObject = ExistingGuidAsset.Get();\n    if (IsValid(AssetGuidObject) && AssetGuidObject != AssetNameObject)\n    {\n        FString OldPath = AssetGuidObject->GetPathName();\n        UE_LOG(LogFMOD, Log, TEXT(\"Hiding old asset '%s'\"), *OldPath);\n\n        // We had an asset with the same guid but it must have been renamed\n        // We just hide the old asset from the asset table\n        AssetGuidObject->bShowAsAsset = false;\n\n#if WITH_EDITOR\n        FAssetRegistryModule::AssetRenamed(AssetNameObject, OldPath);\n#endif\n    }\n\n    ExistingNameAsset = AssetNameObject;\n    ExistingGuidAsset = AssetNameObject;\n    ExistingFullNameLookupAsset = AssetNameObject;\n}\n"
  },
  {
    "path": "Plugins/FMODStudio/Source/FMODStudio/Private/FMODAssetTable.h",
    "content": "// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2020.\n\n#pragma once\n\n#include \"FMODAsset.h\"\n\nnamespace FMOD\n{\nnamespace Studio\n{\nclass System;\n}\n}\n\nclass FFMODAssetTable\n{\npublic:\n    FFMODAssetTable();\n    ~FFMODAssetTable();\n\n    void Create();\n    void Destroy();\n\n    void Refresh();\n\n    UFMODAsset *FindByName(const FString &Name);\n\nprivate:\n    void HandleBanksUpdated();\n    void AddAsset(const FGuid &AssetGuid, const FString &AssetFullName);\n\nprivate:\n    FMOD::Studio::System *StudioSystem;\n    TMap<FGuid, TWeakObjectPtr<UFMODAsset>> GuidMap;\n    TMap<FName, TWeakObjectPtr<UFMODAsset>> NameMap;\n    TMap<FString, TWeakObjectPtr<UFMODAsset>> FullNameLookup;\n};\n"
  },
  {
    "path": "Plugins/FMODStudio/Source/FMODStudio/Private/FMODAudioComponent.cpp",
    "content": "// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2020.\n\n#include \"FMODAudioComponent.h\"\n#include \"FMODStudioModule.h\"\n#include \"FMODUtils.h\"\n#include \"FMODEvent.h\"\n#include \"FMODListener.h\"\n#include \"fmod_studio.hpp\"\n#include \"Misc/App.h\"\n#include \"Misc/Paths.h\"\n#include \"Misc/ScopeLock.h\"\n#include \"FMODStudioPrivatePCH.h\"\n#include \"Components/BillboardComponent.h\"\n#if WITH_EDITORONLY_DATA\n#include \"Engine/Texture2D.h\"\n#endif\n\nUFMODAudioComponent::UFMODAudioComponent(const FObjectInitializer &ObjectInitializer)\n    : Super(ObjectInitializer)\n    , CurrentOcclusionFilterFrequency(MAX_FILTER_FREQUENCY)\n    , CurrentOcclusionVolumeAttenuation(1.0f)\n{\n    bAutoDestroy = false;\n    bAutoActivate = true;\n    bEnableTimelineCallbacks = false; // Default OFF for efficiency\n    bStopWhenOwnerDestroyed = true;\n    bNeverNeedsRenderUpdate = true;\n    bWantsOnUpdateTransform = true;\n#if WITH_EDITORONLY_DATA\n    bVisualizeComponent = true;\n#endif\n    bApplyAmbientVolumes = false;\n    bApplyOcclusionDirect = false;\n    bApplyOcclusionParameter = false;\n    bHasCheckedOcclusion = false;\n    bDefaultParameterValuesCached = false;\n\n    PrimaryComponentTick.bCanEverTick = true;\n    PrimaryComponentTick.TickGroup = TG_PrePhysics;\n    PrimaryComponentTick.bStartWithTickEnabled = false;\n\n    StudioInstance = nullptr;\n    ProgrammerSound = nullptr;\n    LowPass = nullptr;\n    LowPassParam = -1;\n\n    InteriorLastUpdateTime = 0.0;\n    SourceInteriorVolume = 0.0f;\n    SourceInteriorLPF = 0.0f;\n    CurrentInteriorVolume = 0.0f;\n    CurrentInteriorLPF = 0.0f;\n    AmbientVolumeMultiplier = 1.0f;\n    AmbientLPF = MAX_FILTER_FREQUENCY;\n    LastLPF = MAX_FILTER_FREQUENCY;\n    LastVolume = 1.0f;\n    Module = nullptr;\n\n    for (int i = 0; i < EFMODEventProperty::Count; ++i)\n    {\n        StoredProperties[i] = -1.0f;\n    }\n}\n\nFString UFMODAudioComponent::GetDetailedInfoInternal(void) const\n{\n    FString Result;\n\n    if (Event)\n    {\n        Result = Event->GetPathName(NULL);\n    }\n    else\n    {\n        Result = TEXT(\"No_Event\");\n    }\n\n    return Result;\n}\n\nvoid UFMODAudioComponent::OnRegister()\n{\n    Super::OnRegister();\n\n#if WITH_EDITORONLY_DATA\n    if (!bDefaultParameterValuesCached)\n        CacheDefaultParameterValues();\n\n    UpdateSpriteTexture();\n#endif\n\n    if (bIsActive && bAutoActivate)\n    {\n        FMOD_STUDIO_PLAYBACK_STATE state = FMOD_STUDIO_PLAYBACK_STOPPED;\n        StudioInstance->getPlaybackState(&state);\n        if (state == FMOD_STUDIO_PLAYBACK_STOPPED)\n            Play();\n    }\n}\n\n#if WITH_EDITORONLY_DATA\nvoid UFMODAudioComponent::UpdateSpriteTexture()\n{\n    if (SpriteComponent)\n    {\n        if (bAutoActivate)\n        {\n            SpriteComponent->SetSprite(\n                LoadObject<UTexture2D>(NULL, TEXT(\"/Engine/EditorResources/AudioIcons/S_AudioComponent_AutoActivate.S_AudioComponent_AutoActivate\")));\n        }\n        else\n        {\n            SpriteComponent->SetSprite(LoadObject<UTexture2D>(NULL, TEXT(\"/Engine/EditorResources/AudioIcons/S_AudioComponent.S_AudioComponent\")));\n        }\n    }\n}\n#endif\n\n#if WITH_EDITOR\nvoid UFMODAudioComponent::PostEditChangeProperty(FPropertyChangedEvent &e)\n{\n    if (IsPlaying())\n    {\n        Stop();\n        Play();\n    }\n\n    FName PropertyName = (e.Property != NULL) ? e.Property->GetFName() : NAME_None;\n    if (PropertyName == GET_MEMBER_NAME_CHECKED(UFMODAudioComponent, Event) ||\n        (PropertyName == GET_MEMBER_NAME_CHECKED(UFMODAudioComponent, ParameterCache) && ParameterCache.Num() == 0))\n    {\n        ParameterCache.Empty();\n        bDefaultParameterValuesCached = false;\n    }\n\n#if WITH_EDITORONLY_DATA\n    UpdateSpriteTexture();\n#endif\n\n    Super::PostEditChangeProperty(e);\n}\n#endif // WITH_EDITOR\n\nvoid UFMODAudioComponent::OnUpdateTransform(EUpdateTransformFlags UpdateTransformFlags, ETeleportType Teleport)\n{\n    Super::OnUpdateTransform(UpdateTransformFlags, Teleport);\n    if (StudioInstance)\n    {\n        FMOD_3D_ATTRIBUTES attr = { { 0 } };\n        attr.position = FMODUtils::ConvertWorldVector(GetComponentTransform().GetLocation());\n        attr.up = FMODUtils::ConvertUnitVector(GetComponentTransform().GetUnitAxis(EAxis::Z));\n        attr.forward = FMODUtils::ConvertUnitVector(GetComponentTransform().GetUnitAxis(EAxis::X));\n        attr.velocity = FMODUtils::ConvertWorldVector(GetOwner()->GetVelocity());\n\n        StudioInstance->set3DAttributes(&attr);\n\n        UpdateInteriorVolumes();\n        UpdateAttenuation();\n        ApplyVolumeLPF();\n    }\n}\n\n// Taken mostly from ActiveSound.cpp\nvoid UFMODAudioComponent::UpdateInteriorVolumes()\n{\n    if (!GetOwner())\n        return; // May not have owner when previewing animations\n\n    if (!bApplyAmbientVolumes)\n        return;\n\n    // Result of the ambient calculations to apply to the instance\n    float NewAmbientVolumeMultiplier = 1.0f;\n    float NewAmbientHighFrequencyGain = 1.0f;\n\n    FInteriorSettings *Ambient =\n        (FInteriorSettings *)alloca(sizeof(FInteriorSettings)); // FinteriorSetting::FInteriorSettings() isn't exposed (possible UE4 bug???)\n    const FVector &Location = GetOwner()->GetTransform().GetTranslation();\n    AAudioVolume *AudioVolume = GetWorld()->GetAudioSettings(Location, NULL, Ambient);\n\n    const FFMODListener &Listener = GetStudioModule().GetNearestListener(Location);\n    if (InteriorLastUpdateTime < Listener.InteriorStartTime)\n    {\n        SourceInteriorVolume = CurrentInteriorVolume;\n        SourceInteriorLPF = CurrentInteriorLPF;\n        InteriorLastUpdateTime = FApp::GetCurrentTime();\n    }\n\n    bool bAllowSpatialization = true;\n    if (Listener.Volume == AudioVolume || !bAllowSpatialization)\n    {\n        // Ambient and listener in same ambient zone\n        CurrentInteriorVolume = FMath::Lerp(SourceInteriorVolume, 1.0f, Listener.InteriorVolumeInterp);\n        NewAmbientVolumeMultiplier = CurrentInteriorVolume;\n\n        CurrentInteriorLPF = FMath::Lerp(SourceInteriorLPF, MAX_FILTER_FREQUENCY, Listener.InteriorLPFInterp);\n        NewAmbientHighFrequencyGain = CurrentInteriorLPF;\n\n        //UE_LOG(LogFMOD, Verbose, TEXT( \"Ambient in same volume. Volume *= %g LPF *= %g\" ), CurrentInteriorVolume, CurrentInteriorLPF);\n    }\n    else\n    {\n        // Ambient and listener in different ambient zone\n        if (Ambient->bIsWorldSettings)\n        {\n            // The ambient sound is 'outside' - use the listener's exterior volume\n            CurrentInteriorVolume = FMath::Lerp(SourceInteriorVolume, Listener.InteriorSettings.ExteriorVolume, Listener.ExteriorVolumeInterp);\n            NewAmbientVolumeMultiplier = CurrentInteriorVolume;\n\n            CurrentInteriorLPF = FMath::Lerp(SourceInteriorLPF, Listener.InteriorSettings.ExteriorLPF, Listener.ExteriorLPFInterp);\n            NewAmbientHighFrequencyGain = CurrentInteriorLPF;\n\n            //UE_LOG(LogFMOD, Verbose, TEXT( \"Ambient in diff volume, ambient outside. Volume *= %g LPF *= %g\" ), CurrentInteriorVolume, CurrentInteriorLPF);\n        }\n        else\n        {\n            // The ambient sound is 'inside' - use the ambient sound's interior volume multiplied with the listeners exterior volume\n            CurrentInteriorVolume = FMath::Lerp(SourceInteriorVolume, Ambient->InteriorVolume, Listener.InteriorVolumeInterp);\n            CurrentInteriorVolume *= FMath::Lerp(SourceInteriorVolume, Listener.InteriorSettings.ExteriorVolume, Listener.ExteriorVolumeInterp);\n            NewAmbientVolumeMultiplier = CurrentInteriorVolume;\n\n\n            float AmbientLPFValue = FMath::Lerp(SourceInteriorLPF, Ambient->InteriorLPF, Listener.InteriorLPFInterp);\n            float ListenerLPFValue = FMath::Lerp(SourceInteriorLPF, Listener.InteriorSettings.ExteriorLPF, Listener.ExteriorLPFInterp);\n\n            // The current interior LPF value is the less of the LPF due to ambient zone and LPF due to listener settings\n            if (AmbientLPFValue < ListenerLPFValue)\n            {\n                CurrentInteriorLPF = AmbientLPFValue;\n                NewAmbientHighFrequencyGain = AmbientLPFValue;\n            }\n            else\n            {\n                CurrentInteriorLPF = ListenerLPFValue;\n                NewAmbientHighFrequencyGain = ListenerLPFValue;\n            }\n\n            //UE_LOG(LogFMOD, Verbose, TEXT( \"Ambient in diff volume, ambient inside. Volume *= %g LPF *= %g\" ), CurrentInteriorVolume, CurrentInteriorLPF);\n        }\n    }\n\n    AmbientVolumeMultiplier = NewAmbientVolumeMultiplier;\n    AmbientLPF = NewAmbientHighFrequencyGain;\n}\n\nvoid UFMODAudioComponent::UpdateAttenuation()\n{\n    if (!GetOwner())\n        return; // May not have owner when previewing animations\n\n    if (!AttenuationDetails.bOverrideAttenuation && !OcclusionDetails.bEnableOcclusion)\n    {\n        return;\n    }\n\n    if (AttenuationDetails.bOverrideAttenuation)\n    {\n        SetProperty(EFMODEventProperty::MinimumDistance, AttenuationDetails.MinimumDistance);\n        SetProperty(EFMODEventProperty::MaximumDistance, AttenuationDetails.MaximumDistance);\n    }\n\n    // Use occlusion part of settings\n    if (OcclusionDetails.bEnableOcclusion && (bApplyOcclusionDirect || bApplyOcclusionParameter))\n    {\n        static FName NAME_SoundOcclusion = FName(TEXT(\"SoundOcclusion\"));\n        FCollisionQueryParams Params(NAME_SoundOcclusion, OcclusionDetails.bUseComplexCollisionForOcclusion, GetOwner());\n\n        const FVector &Location = GetOwner()->GetTransform().GetTranslation();\n        const FFMODListener &Listener = GetStudioModule().GetNearestListener(Location);\n\n        bool bIsOccluded = GWorld->LineTraceTestByChannel(Location, Listener.Transform.GetLocation(), OcclusionDetails.OcclusionTraceChannel, Params);\n\n        // Apply directly as gain and LPF\n        if (bApplyOcclusionDirect)\n        {\n            float InterpolationTime = bHasCheckedOcclusion ? OcclusionDetails.OcclusionInterpolationTime : 0.0f;\n            if (bIsOccluded)\n            {\n                if (CurrentOcclusionFilterFrequency.GetTargetValue() > OcclusionDetails.OcclusionLowPassFilterFrequency)\n                {\n                    CurrentOcclusionFilterFrequency.Set(OcclusionDetails.OcclusionLowPassFilterFrequency, InterpolationTime);\n                }\n\n                if (CurrentOcclusionVolumeAttenuation.GetTargetValue() > OcclusionDetails.OcclusionVolumeAttenuation)\n                {\n                    CurrentOcclusionVolumeAttenuation.Set(OcclusionDetails.OcclusionVolumeAttenuation, InterpolationTime);\n                }\n            }\n            else\n            {\n                CurrentOcclusionFilterFrequency.Set(MAX_FILTER_FREQUENCY, InterpolationTime);\n                CurrentOcclusionVolumeAttenuation.Set(1.0f, InterpolationTime);\n            }\n\n            CurrentOcclusionFilterFrequency.Update(GWorld->DeltaTimeSeconds);\n            CurrentOcclusionVolumeAttenuation.Update(GWorld->DeltaTimeSeconds);\n        }\n\n        // Apply as a studio parameter\n        if (bApplyOcclusionParameter)\n        {\n            StudioInstance->setParameterValue(\"Occlusion\", bIsOccluded ? 1.0f : 0.0f);\n        }\n\n        bHasCheckedOcclusion = true;\n    }\n}\n\nvoid UFMODAudioComponent::ApplyVolumeLPF()\n{\n    float CurVolume = AmbientVolumeMultiplier * CurrentOcclusionVolumeAttenuation.GetValue();\n    if (CurVolume != LastVolume)\n    {\n        StudioInstance->setVolume(CurVolume);\n        LastVolume = CurVolume;\n    }\n\n    float CurLPF = FMath::Min(AmbientLPF, CurrentOcclusionFilterFrequency.GetValue());\n    if (CurLPF != LastLPF)\n    {\n        if (!LowPass)\n        {\n            FMOD::ChannelGroup *ChanGroup = nullptr;\n            StudioInstance->getChannelGroup(&ChanGroup);\n            if (ChanGroup)\n            {\n                int NumDSP = 0;\n                ChanGroup->getNumDSPs(&NumDSP);\n                for (int Index = 0; Index < NumDSP; ++Index)\n                {\n                    FMOD::DSP *ChanDSP = nullptr;\n                    ChanGroup->getDSP(Index, &ChanDSP);\n                    if (ChanDSP)\n                    {\n                        FMOD_DSP_TYPE DSPType = FMOD_DSP_TYPE_UNKNOWN;\n                        ChanDSP->getType(&DSPType);\n                        if (DSPType == FMOD_DSP_TYPE_LOWPASS)\n                        {\n                            LowPassParam = FMOD_DSP_LOWPASS_CUTOFF;\n                            LowPass = ChanDSP;\n                            break;\n                        }\n                        else if (DSPType == FMOD_DSP_TYPE_LOWPASS_SIMPLE)\n                        {\n                            LowPassParam = FMOD_DSP_LOWPASS_SIMPLE_CUTOFF;\n                            LowPass = ChanDSP;\n                            break;\n                        }\n                        else if (DSPType == FMOD_DSP_TYPE_THREE_EQ)\n                        {\n                            LowPassParam = FMOD_DSP_THREE_EQ_LOWCROSSOVER;\n                            LowPass = ChanDSP;\n                            break;\n                        }\n                        else if (DSPType == FMOD_DSP_TYPE_MULTIBAND_EQ)\n                        {\n                            int a_Filter = -1;\n                            ChanDSP->getParameterInt(FMOD_DSP_MULTIBAND_EQ_A_FILTER, &a_Filter, nullptr, 0);\n                            if (a_Filter == FMOD_DSP_MULTIBAND_EQ_FILTER_LOWPASS_12DB || a_Filter == FMOD_DSP_MULTIBAND_EQ_FILTER_LOWPASS_24DB ||\n                                a_Filter == FMOD_DSP_MULTIBAND_EQ_FILTER_LOWPASS_48DB)\n                            {\n                                LowPassParam = FMOD_DSP_MULTIBAND_EQ_A_FREQUENCY;\n                                LowPass = ChanDSP;\n                                break;\n                            }\n                        }\n                    }\n                }\n            }\n        }\n\n        if (LowPass)\n        {\n            LowPass->setParameterFloat(LowPassParam, CurLPF);\n            LastLPF = CurLPF; // Actually set it!\n        }\n    }\n}\n\nvoid UFMODAudioComponent::CacheDefaultParameterValues()\n{\n    if (Event)\n    {\n        TArray<FMOD_STUDIO_PARAMETER_DESCRIPTION> ParameterDescriptions;\n        Event->GetParameterDescriptions(ParameterDescriptions);\n        for (const FMOD_STUDIO_PARAMETER_DESCRIPTION &ParameterDescription : ParameterDescriptions)\n        {\n            if (!ParameterCache.Find(ParameterDescription.name) && (ParameterDescription.type == FMOD_STUDIO_PARAMETER_GAME_CONTROLLED))\n            {\n                ParameterCache.Add(ParameterDescription.name, ParameterDescription.defaultvalue);\n            }\n        }\n    }\n    bDefaultParameterValuesCached = true;\n}\n\nvoid UFMODAudioComponent::OnUnregister()\n{\n    // Route OnUnregister event.\n    Super::OnUnregister();\n}\n\nvoid UFMODAudioComponent::EndPlay(const EEndPlayReason::Type EndPlayReason)\n{\n    bool shouldStop = false;\n\n    switch (EndPlayReason)\n    {\n        case EEndPlayReason::Destroyed:\n        case EEndPlayReason::RemovedFromWorld:\n        {\n            AActor *Owner = GetOwner();\n            if (!Owner || bStopWhenOwnerDestroyed)\n                shouldStop = true;\n            break;\n        }\n        case EEndPlayReason::EndPlayInEditor:\n        case EEndPlayReason::LevelTransition:\n        case EEndPlayReason::Quit:\n        {\n            shouldStop = true;\n            break;\n        }\n    }\n\n    if (shouldStop)\n    {\n        Stop();\n        OnEventStopped.Broadcast();\n    }\n    Release();\n}\n\nvoid UFMODAudioComponent::TickComponent(float DeltaTime, enum ELevelTick TickType, FActorComponentTickFunction *ThisTickFunction)\n{\n    Super::TickComponent(DeltaTime, TickType, ThisTickFunction);\n\n    if (bIsActive)\n    {\n        if (GetStudioModule().HasListenerMoved())\n        {\n            UpdateInteriorVolumes();\n            UpdateAttenuation();\n            ApplyVolumeLPF();\n        }\n\n        if (bEnableTimelineCallbacks)\n        {\n            TArray<FTimelineMarkerProperties> LocalMarkerQueue;\n            TArray<FTimelineBeatProperties> LocalBeatQueue;\n            {\n                FScopeLock Lock(&CallbackLock);\n                Swap(LocalMarkerQueue, CallbackMarkerQueue);\n                Swap(LocalBeatQueue, CallbackBeatQueue);\n            }\n\n            for (const FTimelineMarkerProperties &EachProps : LocalMarkerQueue)\n            {\n                OnTimelineMarker.Broadcast(EachProps.Name, EachProps.Position);\n            }\n            for (const FTimelineBeatProperties &EachProps : LocalBeatQueue)\n            {\n                OnTimelineBeat.Broadcast(\n                    EachProps.Bar, EachProps.Beat, EachProps.Position, EachProps.Tempo, EachProps.TimeSignatureUpper, EachProps.TimeSignatureLower);\n            }\n        }\n\n        FMOD_STUDIO_PLAYBACK_STATE state = FMOD_STUDIO_PLAYBACK_STOPPED;\n        StudioInstance->getPlaybackState(&state);\n        if (state == FMOD_STUDIO_PLAYBACK_STOPPED)\n        {\n            OnPlaybackCompleted();\n        }\n    }\n}\n\nvoid UFMODAudioComponent::SetEvent(UFMODEvent *NewEvent)\n{\n    const bool bPlay = IsPlaying();\n\n    Stop();\n\n    if (Event != NewEvent)\n    {\n        ReleaseEventCache();\n        Event = NewEvent;\n    }\n\n    if (bPlay)\n    {\n        Play();\n    }\n}\n\nvoid UFMODAudioComponent::PostLoad()\n{\n    Super::PostLoad();\n}\n\nvoid UFMODAudioComponent::Activate(bool bReset)\n{\n    if (bReset || ShouldActivate() == true)\n    {\n        Play();\n    }\n    Super::Activate(true);\n}\n\nvoid UFMODAudioComponent::Deactivate()\n{\n    if (ShouldActivate() == false)\n    {\n        Stop();\n    }\n    Super::Deactivate();\n}\n\nFMOD_RESULT F_CALLBACK UFMODAudioComponent_EventCallback(FMOD_STUDIO_EVENT_CALLBACK_TYPE type, FMOD_STUDIO_EVENTINSTANCE *event, void *parameters)\n{\n    UFMODAudioComponent *Component = nullptr;\n    FMOD::Studio::EventInstance *Instance = (FMOD::Studio::EventInstance *)event;\n    if (Instance->getUserData((void **)&Component) == FMOD_OK && IsValid(Component))\n    {\n        if (type == FMOD_STUDIO_EVENT_CALLBACK_TIMELINE_MARKER && Component->bEnableTimelineCallbacks)\n        {\n            Component->EventCallbackAddMarker((FMOD_STUDIO_TIMELINE_MARKER_PROPERTIES *)parameters);\n        }\n        else if (type == FMOD_STUDIO_EVENT_CALLBACK_TIMELINE_BEAT && Component->bEnableTimelineCallbacks)\n        {\n            Component->EventCallbackAddBeat((FMOD_STUDIO_TIMELINE_BEAT_PROPERTIES *)parameters);\n        }\n        else if (type == FMOD_STUDIO_EVENT_CALLBACK_CREATE_PROGRAMMER_SOUND)\n        {\n            Component->EventCallbackCreateProgrammerSound((FMOD_STUDIO_PROGRAMMER_SOUND_PROPERTIES *)parameters);\n        }\n        else if (type == FMOD_STUDIO_EVENT_CALLBACK_DESTROY_PROGRAMMER_SOUND)\n        {\n            Component->EventCallbackDestroyProgrammerSound((FMOD_STUDIO_PROGRAMMER_SOUND_PROPERTIES *)parameters);\n        }\n    }\n    return FMOD_OK;\n}\n\nvoid UFMODAudioComponent::EventCallbackAddMarker(FMOD_STUDIO_TIMELINE_MARKER_PROPERTIES *props)\n{\n    FScopeLock Lock(&CallbackLock);\n    FTimelineMarkerProperties info;\n    info.Name = props->name;\n    info.Position = props->position;\n    CallbackMarkerQueue.Push(info);\n}\n\nvoid UFMODAudioComponent::EventCallbackAddBeat(FMOD_STUDIO_TIMELINE_BEAT_PROPERTIES *props)\n{\n    FScopeLock Lock(&CallbackLock);\n    FTimelineBeatProperties info;\n    info.Bar = props->bar;\n    info.Beat = props->beat;\n    info.Position = props->position;\n    info.Tempo = props->tempo;\n    info.TimeSignatureUpper = props->timesignatureupper;\n    info.TimeSignatureLower = props->timesignaturelower;\n    CallbackBeatQueue.Push(info);\n}\n\nvoid UFMODAudioComponent::EventCallbackCreateProgrammerSound(FMOD_STUDIO_PROGRAMMER_SOUND_PROPERTIES *props)\n{\n    // Make sure name isn't being changed as we are reading it\n    FString ProgrammerSoundNameCopy;\n    {\n        FScopeLock Lock(&CallbackLock);\n        ProgrammerSoundNameCopy = ProgrammerSoundName;\n    }\n\n    if (ProgrammerSound)\n    {\n        props->sound = (FMOD_SOUND *)ProgrammerSound;\n        props->subsoundIndex = -1;\n    }\n    else if (ProgrammerSoundNameCopy.Len() || strlen(props->name) != 0)\n    {\n        FMOD::Studio::System *System = GetStudioModule().GetStudioSystem(EFMODSystemContext::Max);\n        FMOD::System *LowLevelSystem = nullptr;\n        System->getLowLevelSystem(&LowLevelSystem);\n        FString SoundName = ProgrammerSoundNameCopy.Len() ? ProgrammerSoundNameCopy : UTF8_TO_TCHAR(props->name);\n        FMOD_MODE SoundMode = FMOD_LOOP_NORMAL | FMOD_CREATECOMPRESSEDSAMPLE | FMOD_NONBLOCKING;\n\n        if (SoundName.Contains(TEXT(\".\")))\n        {\n            // Load via file\n            FString SoundPath = SoundName;\n            if (FPaths::IsRelative(SoundPath))\n            {\n                SoundPath = FPaths::ProjectContentDir() / SoundPath;\n            }\n\n            FMOD::Sound *Sound = nullptr;\n            if (LowLevelSystem->createSound(TCHAR_TO_UTF8(*SoundPath), SoundMode, nullptr, &Sound) == FMOD_OK)\n            {\n                UE_LOG(LogFMOD, Verbose, TEXT(\"Creating programmer sound from file '%s'\"), *SoundPath);\n                props->sound = (FMOD_SOUND *)Sound;\n                props->subsoundIndex = -1;\n            }\n            else\n            {\n                UE_LOG(LogFMOD, Warning, TEXT(\"Failed to load programmer sound file '%s'\"), *SoundPath);\n            }\n        }\n        else\n        {\n            // Load via FMOD Studio asset table\n            FMOD_STUDIO_SOUND_INFO SoundInfo = { 0 };\n            FMOD_RESULT Result = System->getSoundInfo(TCHAR_TO_UTF8(*SoundName), &SoundInfo);\n            if (Result == FMOD_OK)\n            {\n                FMOD::Sound *Sound = nullptr;\n                Result = LowLevelSystem->createSound(SoundInfo.name_or_data, SoundMode | SoundInfo.mode, &SoundInfo.exinfo, &Sound);\n                if (Result == FMOD_OK)\n                {\n                    UE_LOG(LogFMOD, Verbose, TEXT(\"Creating programmer sound using audio entry '%s'\"), *SoundName);\n\n                    props->sound = (FMOD_SOUND *)Sound;\n                    props->subsoundIndex = SoundInfo.subsoundindex;\n                }\n                else\n                {\n                    UE_LOG(LogFMOD, Warning, TEXT(\"Failed to load FMOD audio entry '%s'\"), *SoundName);\n                }\n            }\n            else\n            {\n                UE_LOG(LogFMOD, Warning, TEXT(\"Failed to find FMOD audio entry '%s'\"), *SoundName);\n            }\n        }\n    }\n}\n\nvoid UFMODAudioComponent::EventCallbackDestroyProgrammerSound(FMOD_STUDIO_PROGRAMMER_SOUND_PROPERTIES *props)\n{\n    if (props->sound && ProgrammerSound == nullptr)\n    {\n        UE_LOG(LogFMOD, Verbose, TEXT(\"Destroying programmer sound\"));\n        FMOD_RESULT Result = ((FMOD::Sound *)props->sound)->release();\n        verifyfmod(Result);\n    }\n}\n\nvoid UFMODAudioComponent::SetProgrammerSoundName(FString Value)\n{\n    FScopeLock Lock(&CallbackLock);\n    ProgrammerSoundName = Value;\n}\n\nvoid UFMODAudioComponent::SetProgrammerSound(FMOD::Sound *Sound)\n{\n    FScopeLock Lock(&CallbackLock);\n    ProgrammerSound = Sound;\n}\n\nvoid UFMODAudioComponent::Play()\n{\n    PlayInternal(EFMODSystemContext::Max);\n}\n\nvoid UFMODAudioComponent::PlayInternal(EFMODSystemContext::Type Context)\n{\n    Stop();\n\n    bHasCheckedOcclusion = false;\n\n    if (!FMODUtils::IsWorldAudible(GetWorld(), Context == EFMODSystemContext::Editor))\n    {\n        return;\n    }\n\n    UE_LOG(LogFMOD, Verbose, TEXT(\"UFMODAudioComponent %p Play\"), this);\n\n    // Only play events in PIE/game, not when placing them in the editor\n    FMOD::Studio::EventDescription *EventDesc = GetStudioModule().GetEventDescription(Event.Get(), Context);\n    if (EventDesc != nullptr)\n    {\n        EventDesc->getLength(&EventLength);\n        if (!StudioInstance || !StudioInstance->isValid())\n        {\n            FMOD_RESULT result = EventDesc->createInstance(&StudioInstance);\n            if (result != FMOD_OK)\n                return;\n        }\n        // Query the event for some extra info\n        FMOD_STUDIO_USER_PROPERTY UserProp = { 0 };\n        if (EventDesc->getUserProperty(\"Ambient\", &UserProp) == FMOD_OK)\n        {\n            if (UserProp.type == FMOD_STUDIO_USER_PROPERTY_TYPE_FLOAT) // All numbers are stored as float\n            {\n                bApplyAmbientVolumes = (UserProp.floatvalue != 0.0f);\n            }\n        }\n        if (EventDesc->getUserProperty(\"Occlusion\", &UserProp) == FMOD_OK)\n        {\n            if (UserProp.type == FMOD_STUDIO_USER_PROPERTY_TYPE_FLOAT) // All numbers are stored as float\n            {\n                bApplyOcclusionDirect = (UserProp.floatvalue != 0.0f);\n            }\n        }\n        FMOD_STUDIO_PARAMETER_DESCRIPTION paramDesc = {};\n        if (EventDesc->getParameter(\"Occlusion\", &paramDesc) == FMOD_OK)\n        {\n            bApplyOcclusionParameter = true;\n        }\n\n        OnUpdateTransform(EUpdateTransformFlags::SkipPhysicsUpdate);\n        // Set initial parameters\n        for (auto Kvp : ParameterCache)\n        {\n            FMOD_RESULT Result = StudioInstance->setParameterValue(TCHAR_TO_UTF8(*Kvp.Key.ToString()), Kvp.Value);\n            if (Result != FMOD_OK)\n            {\n                UE_LOG(LogFMOD, Warning, TEXT(\"Failed to set initial parameter %s\"), *Kvp.Key.ToString());\n            }\n        }\n        for (int i = 0; i < EFMODEventProperty::Count; ++i)\n        {\n            if (StoredProperties[i] != -1.0f)\n            {\n                FMOD_RESULT Result = StudioInstance->setProperty((FMOD_STUDIO_EVENT_PROPERTY)i, StoredProperties[i]);\n                if (Result != FMOD_OK)\n                {\n                    UE_LOG(LogFMOD, Warning, TEXT(\"Failed to set initial property %d\"), i);\n                }\n            }\n        }\n\n        if (bEnableTimelineCallbacks || !ProgrammerSoundName.IsEmpty())\n        {\n            verifyfmod(StudioInstance->setCallback(UFMODAudioComponent_EventCallback));\n        }\n        verifyfmod(StudioInstance->setUserData(this));\n        verifyfmod(StudioInstance->start());\n        UE_LOG(LogFMOD, Verbose, TEXT(\"Playing component %p\"), this);\n        bIsActive = true;\n        SetComponentTickEnabled(true);\n    }\n}\n\nvoid UFMODAudioComponent::Stop()\n{\n    UE_LOG(LogFMOD, Verbose, TEXT(\"UFMODAudioComponent %p Stop\"), this);\n    if (StudioInstance)\n    {\n        StudioInstance->stop(FMOD_STUDIO_STOP_ALLOWFADEOUT);\n    }\n    InteriorLastUpdateTime = 0.0;\n}\n\nvoid UFMODAudioComponent::Release()\n{\n    ReleaseEventInstance();\n}\n\nvoid UFMODAudioComponent::ReleaseEventCache()\n{\n    ParameterCache.Empty();\n    bDefaultParameterValuesCached = false;\n    ReleaseEventInstance();\n}\n\nvoid UFMODAudioComponent::ReleaseEventInstance()\n{\n    if (StudioInstance)\n    {\n        LowPass = nullptr;\n        StudioInstance->setCallback(nullptr);\n        StudioInstance->release();\n        StudioInstance = nullptr;\n    }\n}\n\nvoid UFMODAudioComponent::TriggerCue()\n{\n    UE_LOG(LogFMOD, Verbose, TEXT(\"UFMODAudioComponent %p TriggerCue\"), this);\n    if (StudioInstance)\n    {\n// Studio only supports a single cue so try to get it\n#if FMOD_VERSION >= 0x00010800\n        StudioInstance->triggerCue();\n#else\n        FMOD::Studio::CueInstance *Cue = nullptr;\n        StudioInstance->getCueByIndex(0, &Cue);\n        if (Cue)\n        {\n            Cue->trigger();\n        }\n#endif\n    }\n}\n\nvoid UFMODAudioComponent::OnPlaybackCompleted()\n{\n    // Mark inactive before calling destroy to avoid recursion\n    UE_LOG(LogFMOD, Verbose, TEXT(\"UFMODAudioComponent %p PlaybackCompleted\"), this);\n    bIsActive = false;\n    SetComponentTickEnabled(false);\n\n    Release();\n\n    // Fire callback after we have cleaned up our instance\n    OnEventStopped.Broadcast();\n\n    // Auto destruction is handled via marking object for deletion.\n    if (bAutoDestroy)\n    {\n        DestroyComponent();\n    }\n}\n\nbool UFMODAudioComponent::IsPlaying(void)\n{\n    return bIsActive;\n}\n\nvoid UFMODAudioComponent::SetVolume(float Volume)\n{\n    if (StudioInstance)\n    {\n        FMOD_RESULT Result = StudioInstance->setVolume(Volume);\n        if (Result != FMOD_OK)\n        {\n            UE_LOG(LogFMOD, Warning, TEXT(\"Failed to set volume\"));\n        }\n    }\n}\n\nvoid UFMODAudioComponent::SetPitch(float Pitch)\n{\n    if (StudioInstance)\n    {\n        FMOD_RESULT Result = StudioInstance->setPitch(Pitch);\n        if (Result != FMOD_OK)\n        {\n            UE_LOG(LogFMOD, Warning, TEXT(\"Failed to set pitch\"));\n        }\n    }\n}\n\nvoid UFMODAudioComponent::SetPaused(bool Paused)\n{\n    if (StudioInstance)\n    {\n        FMOD_RESULT Result = StudioInstance->setPaused(Paused);\n        if (Result != FMOD_OK)\n        {\n            UE_LOG(LogFMOD, Warning, TEXT(\"Failed to pause\"));\n        }\n    }\n}\n\nvoid UFMODAudioComponent::SetParameter(FName Name, float Value)\n{\n    if (StudioInstance)\n    {\n        FMOD_RESULT Result = StudioInstance->setParameterValue(TCHAR_TO_UTF8(*Name.ToString()), Value);\n        if (Result != FMOD_OK)\n        {\n            UE_LOG(LogFMOD, Warning, TEXT(\"Failed to set parameter %s\"), *Name.ToString());\n        }\n    }\n    ParameterCache.FindOrAdd(Name) = Value;\n}\n\nvoid UFMODAudioComponent::SetProperty(EFMODEventProperty::Type Property, float Value)\n{\n    verify(Property < EFMODEventProperty::Count);\n    if (StudioInstance)\n    {\n        FMOD_RESULT Result = StudioInstance->setProperty((FMOD_STUDIO_EVENT_PROPERTY)Property, Value);\n        if (Result != FMOD_OK)\n        {\n            UE_LOG(LogFMOD, Warning, TEXT(\"Failed to set property %d\"), (int)Property);\n        }\n    }\n    StoredProperties[Property] = Value;\n}\n\nfloat UFMODAudioComponent::GetProperty(EFMODEventProperty::Type Property)\n{\n    verify(Property < EFMODEventProperty::Count);\n    float outValue = 0;\n    if (Event)\n    {\n        FMOD_RESULT Result = StudioInstance->getProperty((FMOD_STUDIO_EVENT_PROPERTY)Property, &outValue);\n        if (Result != FMOD_OK)\n        {\n            UE_LOG(LogFMOD, Warning, TEXT(\"Failed to get property %d\"), (int)Property);\n        }\n    }\n    return StoredProperties[Property] = outValue;\n}\n\nint32 UFMODAudioComponent::GetLength() const\n{\n    return EventLength;\n}\n\nvoid UFMODAudioComponent::SetTimelinePosition(int32 Time)\n{\n    if (StudioInstance)\n    {\n        FMOD_RESULT Result = StudioInstance->setTimelinePosition(Time);\n        if (Result != FMOD_OK)\n        {\n            UE_LOG(LogFMOD, Warning, TEXT(\"Failed to set timeline position\"));\n        }\n    }\n}\n\nint32 UFMODAudioComponent::GetTimelinePosition()\n{\n    int Time = 0;\n    if (StudioInstance)\n    {\n        FMOD_RESULT Result = StudioInstance->getTimelinePosition(&Time);\n        if (Result != FMOD_OK)\n        {\n            UE_LOG(LogFMOD, Warning, TEXT(\"Failed to get timeline position\"));\n        }\n    }\n    return Time;\n}\n\nfloat UFMODAudioComponent::GetParameter(FName Name)\n{\n    if (!bDefaultParameterValuesCached)\n    {\n        CacheDefaultParameterValues();\n    }\n\n    float *CachedValue = ParameterCache.Find(Name);\n    float Value = CachedValue ? *CachedValue : 0.0;\n    if (StudioInstance)\n    {\n        FMOD::Studio::ParameterInstance *ParamInst = nullptr;\n        FMOD_RESULT Result = StudioInstance->getParameter(TCHAR_TO_UTF8(*Name.ToString()), &ParamInst);\n        if (Result == FMOD_OK)\n        {\n            float QueryValue;\n            Result = ParamInst->getValue(&QueryValue);\n            if (Result == FMOD_OK)\n            {\n                Value = QueryValue;\n            }\n        }\n        if (Result != FMOD_OK)\n        {\n            UE_LOG(LogFMOD, Warning, TEXT(\"Failed to get parameter %s\"), *Name.ToString());\n        }\n    }\n    return Value;\n}\n"
  },
  {
    "path": "Plugins/FMODStudio/Source/FMODStudio/Private/FMODBank.cpp",
    "content": "// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2020.\n\n#include \"FMODBank.h\"\n#include \"FMODStudioModule.h\"\n\nUFMODBank::UFMODBank(const FObjectInitializer &ObjectInitializer)\n    : Super(ObjectInitializer)\n{\n}\n\n/** Get tags to show in content view */\nvoid UFMODBank::GetAssetRegistryTags(TArray<FAssetRegistryTag> &OutTags) const\n{\n    Super::GetAssetRegistryTags(OutTags);\n}\n\nFString UFMODBank::GetDesc()\n{\n    return FString::Printf(TEXT(\"Bank %s\"), *AssetGuid.ToString(EGuidFormats::DigitsWithHyphensInBraces));\n}\n"
  },
  {
    "path": "Plugins/FMODStudio/Source/FMODStudio/Private/FMODBankUpdateNotifier.cpp",
    "content": "// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2020.\n\n#include \"FMODBankUpdateNotifier.h\"\n#include \"FMODSettings.h\"\n#include \"HAL/FileManager.h\"\n\n#include \"FMODStudioPrivatePCH.h\"\n\nFFMODBankUpdateNotifier::FFMODBankUpdateNotifier()\n    : bUpdateEnabled(true)\n    , NextRefreshTime(FDateTime::MinValue())\n{\n}\n\nvoid FFMODBankUpdateNotifier::SetFilePath(const FString &InPath)\n{\n    FilePath = InPath;\n    NextRefreshTime = FDateTime::MinValue();\n    FileTime = FDateTime::MinValue();\n}\n\nvoid FFMODBankUpdateNotifier::Update()\n{\n    if (bUpdateEnabled)\n    {\n        FDateTime CurTime = FDateTime::UtcNow();\n        if (CurTime >= NextRefreshTime)\n        {\n            NextRefreshTime = CurTime + FTimespan(0, 0, 1);\n            Refresh();\n        }\n    }\n}\n\nvoid FFMODBankUpdateNotifier::EnableUpdate(bool bEnable)\n{\n    bUpdateEnabled = bEnable;\n\n    if (bEnable)\n    {\n        // Refreshing right after update is enabled is not desirable\n        NextRefreshTime = FDateTime::UtcNow() + FTimespan(0, 0, 1);\n    }\n}\n\nvoid FFMODBankUpdateNotifier::Refresh()\n{\n    if (!FilePath.IsEmpty())\n    {\n        const FDateTime NewFileTime = IFileManager::Get().GetTimeStamp(*FilePath);\n        if (NewFileTime != FileTime)\n        {\n            FileTime = NewFileTime;\n            UE_LOG(LogFMOD, Log, TEXT(\"File has changed: %s\"), *FilePath);\n\n            BanksUpdatedEvent.Broadcast();\n        }\n    }\n}\n"
  },
  {
    "path": "Plugins/FMODStudio/Source/FMODStudio/Private/FMODBankUpdateNotifier.h",
    "content": "// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2020.\n\n#pragma once\n\n#include \"Containers/UnrealString.h\"\n#include \"Misc/DateTime.h\"\n#include \"Delegates/Delegate.h\"\n\nclass FFMODBankUpdateNotifier\n{\npublic:\n    FFMODBankUpdateNotifier();\n\n    void SetFilePath(const FString &InPath);\n    void Update();\n\n    void EnableUpdate(bool bEnable);\n\n    FSimpleMulticastDelegate BanksUpdatedEvent;\n\nprivate:\n    void Refresh();\n\n    bool bUpdateEnabled;\n    FString FilePath;\n    FDateTime NextRefreshTime;\n    FDateTime FileTime;\n};\n"
  },
  {
    "path": "Plugins/FMODStudio/Source/FMODStudio/Private/FMODBlueprintStatics.cpp",
    "content": "// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2020.\n\n#include \"FMODBlueprintStatics.h\"\n#include \"FMODAudioComponent.h\"\n#include \"FMODSettings.h\"\n#include \"FMODStudioModule.h\"\n#include \"FMODUtils.h\"\n#include \"FMODBank.h\"\n#include \"FMODEvent.h\"\n#include \"FMODBus.h\"\n#include \"FMODVCA.h\"\n#include \"fmod_studio.hpp\"\n#include \"fmod_errors.h\"\n#include \"FMODStudioPrivatePCH.h\"\n\n/////////////////////////////////////////////////////\n// UFMODBlueprintStatics\n\nUFMODBlueprintStatics::UFMODBlueprintStatics(const FObjectInitializer &ObjectInitializer)\n    : Super(ObjectInitializer)\n{\n}\n\nFFMODEventInstance UFMODBlueprintStatics::PlayEvent2D(UObject *WorldContextObject, class UFMODEvent *Event, bool bAutoPlay)\n{\n    return PlayEventAtLocation(WorldContextObject, Event, FTransform(), bAutoPlay);\n}\n\nFFMODEventInstance UFMODBlueprintStatics::PlayEventAtLocation(\n    UObject *WorldContextObject, class UFMODEvent *Event, const FTransform &Location, bool bAutoPlay)\n{\n    FFMODEventInstance Instance;\n    Instance.Instance = nullptr;\n\n    UWorld* ThisWorld = GEngine->GetWorldFromContextObject(WorldContextObject, EGetWorldErrorMode::ReturnNull);\n    if (ThisWorld != nullptr && FMODUtils::IsWorldAudible(ThisWorld, false) && IsValid(Event))\n    {\n        FMOD::Studio::EventDescription *EventDesc = IFMODStudioModule::Get().GetEventDescription(Event);\n        if (EventDesc != nullptr)\n        {\n            FMOD::Studio::EventInstance *EventInst = nullptr;\n            EventDesc->createInstance(&EventInst);\n            if (EventInst != nullptr)\n            {\n                FMOD_3D_ATTRIBUTES EventAttr = { { 0 } };\n                FMODUtils::Assign(EventAttr, Location);\n                EventInst->set3DAttributes(&EventAttr);\n\n                if (bAutoPlay)\n                {\n                    EventInst->start();\n                    EventInst->release();\n                }\n                Instance.Instance = EventInst;\n            }\n        }\n    }\n    return Instance;\n}\n\nclass UFMODAudioComponent *UFMODBlueprintStatics::PlayEventAttached(class UFMODEvent *Event, class USceneComponent *AttachToComponent,\n    FName AttachPointName, FVector Location, EAttachLocation::Type LocationType, bool bStopWhenAttachedToDestroyed, bool bAutoPlay, bool bAutoDestroy)\n{\n    if (Event == nullptr)\n    {\n        return nullptr;\n    }\n    if (AttachToComponent == nullptr)\n    {\n        UE_LOG(LogFMOD, Warning, TEXT(\"UFMODBlueprintStatics::PlayEventAttached: NULL AttachComponent specified!\"));\n        return nullptr;\n    }\n\n    AActor *Actor = AttachToComponent->GetOwner();\n\n    // Avoid creating component if we're trying to play a sound on an already destroyed actor.\n    if (Actor && Actor->IsPendingKill())\n    {\n        return nullptr;\n    }\n\n    UFMODAudioComponent *AudioComponent;\n    if (Actor)\n    {\n        // Use actor as outer if we have one.\n        AudioComponent = NewObject<UFMODAudioComponent>(Actor);\n    }\n    else\n    {\n        // Let engine pick the outer (transient package).\n        AudioComponent = NewObject<UFMODAudioComponent>();\n    }\n    check(AudioComponent);\n    AudioComponent->Event = Event;\n    AudioComponent->bAutoActivate = false;\n    AudioComponent->bAutoDestroy = bAutoDestroy;\n    AudioComponent->bStopWhenOwnerDestroyed = bStopWhenAttachedToDestroyed;\n#if WITH_EDITORONLY_DATA\n    AudioComponent->bVisualizeComponent = false;\n#endif\n    AudioComponent->RegisterComponentWithWorld(AttachToComponent->GetWorld());\n\n    AudioComponent->AttachToComponent(AttachToComponent, FAttachmentTransformRules::KeepRelativeTransform, AttachPointName);\n    if (LocationType == EAttachLocation::KeepWorldPosition)\n    {\n        AudioComponent->SetWorldLocation(Location);\n    }\n    else\n    {\n        AudioComponent->SetRelativeLocation(Location);\n    }\n\n    if (bAutoPlay)\n    {\n        AudioComponent->Play();\n    }\n    return AudioComponent;\n}\n\nUFMODAsset *UFMODBlueprintStatics::FindAssetByName(const FString &Name)\n{\n    return IFMODStudioModule::Get().FindAssetByName(Name);\n}\n\nUFMODEvent *UFMODBlueprintStatics::FindEventByName(const FString &Name)\n{\n    return IFMODStudioModule::Get().FindEventByName(Name);\n}\n\nvoid UFMODBlueprintStatics::LoadBank(class UFMODBank *Bank, bool bBlocking, bool bLoadSampleData)\n{\n    FMOD::Studio::System *StudioSystem = IFMODStudioModule::Get().GetStudioSystem(EFMODSystemContext::Runtime);\n    if (StudioSystem != nullptr && IsValid(Bank))\n    {\n        UE_LOG(LogFMOD, Log, TEXT(\"LoadBank %s\"), *Bank->FileName);\n\n        const UFMODSettings &Settings = *GetDefault<UFMODSettings>();\n        FString BankPath = Settings.GetFullBankPath() / (Bank->FileName + TEXT(\".bank\"));\n\n        FMOD::Studio::Bank *bank = nullptr;\n        FMOD_STUDIO_LOAD_BANK_FLAGS flags = (bBlocking || bLoadSampleData) ? FMOD_STUDIO_LOAD_BANK_NORMAL : FMOD_STUDIO_LOAD_BANK_NONBLOCKING;\n        FMOD_RESULT result = StudioSystem->loadBankFile(TCHAR_TO_UTF8(*BankPath), flags, &bank);\n        if (result != FMOD_OK)\n        {\n            UE_LOG(LogFMOD, Error, TEXT(\"Failed to load bank %s: %s\"), *Bank->FileName, UTF8_TO_TCHAR(FMOD_ErrorString(result)));\n        }\n        if (result == FMOD_OK)\n        {\n            bank->loadSampleData();\n        }\n    }\n}\n\nvoid UFMODBlueprintStatics::UnloadBank(class UFMODBank *Bank)\n{\n    FMOD::Studio::System *StudioSystem = IFMODStudioModule::Get().GetStudioSystem(EFMODSystemContext::Runtime);\n    if (StudioSystem != nullptr && IsValid(Bank))\n    {\n        UE_LOG(LogFMOD, Log, TEXT(\"UnloadBank %s\"), *Bank->FileName);\n\n        FMOD::Studio::ID guid = FMODUtils::ConvertGuid(Bank->AssetGuid);\n        FMOD::Studio::Bank *bank = nullptr;\n        FMOD_RESULT result = StudioSystem->getBankByID(&guid, &bank);\n        if (result == FMOD_OK && bank != nullptr)\n        {\n            bank->unload();\n        }\n    }\n}\n\nbool UFMODBlueprintStatics::IsBankLoaded(class UFMODBank *Bank)\n{\n    FMOD::Studio::System *StudioSystem = IFMODStudioModule::Get().GetStudioSystem(EFMODSystemContext::Runtime);\n    if (StudioSystem != nullptr && IsValid(Bank))\n    {\n        FMOD::Studio::ID guid = FMODUtils::ConvertGuid(Bank->AssetGuid);\n        FMOD::Studio::Bank *bank = nullptr;\n        FMOD_RESULT result = StudioSystem->getBankByID(&guid, &bank);\n        if (result == FMOD_OK && bank != nullptr)\n        {\n            FMOD_STUDIO_LOADING_STATE loadingState;\n            if (bank->getLoadingState(&loadingState) == FMOD_OK)\n            {\n                return (loadingState == FMOD_STUDIO_LOADING_STATE_LOADED);\n            }\n        }\n    }\n    return false;\n}\n\nvoid UFMODBlueprintStatics::LoadBankSampleData(class UFMODBank *Bank)\n{\n    FMOD::Studio::System *StudioSystem = IFMODStudioModule::Get().GetStudioSystem(EFMODSystemContext::Runtime);\n    if (StudioSystem != nullptr && IsValid(Bank))\n    {\n        FMOD::Studio::ID guid = FMODUtils::ConvertGuid(Bank->AssetGuid);\n        FMOD::Studio::Bank *bank = nullptr;\n        FMOD_RESULT result = StudioSystem->getBankByID(&guid, &bank);\n        if (result == FMOD_OK && bank != nullptr)\n        {\n            bank->loadSampleData();\n        }\n    }\n}\n\nvoid UFMODBlueprintStatics::UnloadBankSampleData(class UFMODBank *Bank)\n{\n    FMOD::Studio::System *StudioSystem = IFMODStudioModule::Get().GetStudioSystem(EFMODSystemContext::Runtime);\n    if (StudioSystem != nullptr && IsValid(Bank))\n    {\n        FMOD::Studio::ID guid = FMODUtils::ConvertGuid(Bank->AssetGuid);\n        FMOD::Studio::Bank *bank = nullptr;\n        FMOD_RESULT result = StudioSystem->getBankByID(&guid, &bank);\n        if (result == FMOD_OK && bank != nullptr)\n        {\n            bank->unloadSampleData();\n        }\n    }\n}\n\nvoid UFMODBlueprintStatics::LoadEventSampleData(UObject *WorldContextObject, class UFMODEvent *Event)\n{\n    if (IsValid(Event))\n    {\n        FMOD::Studio::EventDescription *EventDesc = IFMODStudioModule::Get().GetEventDescription(Event);\n        if (EventDesc != nullptr)\n        {\n            EventDesc->loadSampleData();\n        }\n    }\n}\n\nvoid UFMODBlueprintStatics::UnloadEventSampleData(UObject *WorldContextObject, class UFMODEvent *Event)\n{\n    if (IsValid(Event))\n    {\n        FMOD::Studio::EventDescription *EventDesc = IFMODStudioModule::Get().GetEventDescription(Event);\n        if (EventDesc != nullptr)\n        {\n            EventDesc->unloadSampleData();\n        }\n    }\n}\n\nTArray<FFMODEventInstance> UFMODBlueprintStatics::FindEventInstances(UObject *WorldContextObject, UFMODEvent *Event)\n{\n    TArray<FFMODEventInstance> Instances;\n    if (IsValid(Event))\n    {\n        FMOD::Studio::EventDescription *EventDesc = IFMODStudioModule::Get().GetEventDescription(Event);\n        if (EventDesc != nullptr)\n        {\n            int Capacity = 0;\n            EventDesc->getInstanceCount(&Capacity);\n            if (Capacity > 0)\n            {\n                TArray<FMOD::Studio::EventInstance *> InstancePointers;\n                InstancePointers.SetNum(Capacity, true);\n                int Count = 0;\n                EventDesc->getInstanceList(InstancePointers.GetData(), Capacity, &Count);\n                Instances.SetNum(Count, true);\n                for (int i = 0; i < Count; ++i)\n                {\n                    Instances[i].Instance = InstancePointers[i];\n                }\n            }\n        }\n    }\n    return Instances;\n}\n\nvoid UFMODBlueprintStatics::BusSetVolume(class UFMODBus *Bus, float Volume)\n{\n    FMOD::Studio::System *StudioSystem = IFMODStudioModule::Get().GetStudioSystem(EFMODSystemContext::Runtime);\n    if (StudioSystem != nullptr && IsValid(Bus))\n    {\n        FMOD::Studio::ID guid = FMODUtils::ConvertGuid(Bus->AssetGuid);\n        FMOD::Studio::Bus *bus = nullptr;\n        FMOD_RESULT result = StudioSystem->getBusByID(&guid, &bus);\n        if (result == FMOD_OK && bus != nullptr)\n        {\n            bus->setVolume(Volume);\n        }\n    }\n}\n\nvoid UFMODBlueprintStatics::BusSetPaused(class UFMODBus *Bus, bool bPaused)\n{\n    FMOD::Studio::System *StudioSystem = IFMODStudioModule::Get().GetStudioSystem(EFMODSystemContext::Runtime);\n    if (StudioSystem != nullptr && IsValid(Bus))\n    {\n        FMOD::Studio::ID guid = FMODUtils::ConvertGuid(Bus->AssetGuid);\n        FMOD::Studio::Bus *bus = nullptr;\n        FMOD_RESULT result = StudioSystem->getBusByID(&guid, &bus);\n        if (result == FMOD_OK && bus != nullptr)\n        {\n            bus->setPaused(bPaused);\n        }\n    }\n}\n\nvoid UFMODBlueprintStatics::BusSetMute(class UFMODBus *Bus, bool bMute)\n{\n    FMOD::Studio::System *StudioSystem = IFMODStudioModule::Get().GetStudioSystem(EFMODSystemContext::Runtime);\n    if (StudioSystem != nullptr && IsValid(Bus))\n    {\n        FMOD::Studio::ID guid = FMODUtils::ConvertGuid(Bus->AssetGuid);\n        FMOD::Studio::Bus *bus = nullptr;\n        FMOD_RESULT result = StudioSystem->getBusByID(&guid, &bus);\n        if (result == FMOD_OK && bus != nullptr)\n        {\n            bus->setMute(bMute);\n        }\n    }\n}\n\nvoid UFMODBlueprintStatics::BusStopAllEvents(UFMODBus *Bus, EFMOD_STUDIO_STOP_MODE stopMode)\n{\n    FMOD::Studio::System *StudioSystem = IFMODStudioModule::Get().GetStudioSystem(EFMODSystemContext::Runtime);\n    if (StudioSystem != nullptr && IsValid(Bus))\n    {\n        FMOD::Studio::ID guid = FMODUtils::ConvertGuid(Bus->AssetGuid);\n        FMOD::Studio::Bus *bus = nullptr;\n        FMOD_RESULT result = StudioSystem->getBusByID(&guid, &bus);\n        if (result == FMOD_OK && bus != nullptr)\n        {\n            bus->stopAllEvents((FMOD_STUDIO_STOP_MODE)stopMode);\n        }\n    }\n}\n\nvoid UFMODBlueprintStatics::VCASetVolume(class UFMODVCA *Vca, float Volume)\n{\n    FMOD::Studio::System *StudioSystem = IFMODStudioModule::Get().GetStudioSystem(EFMODSystemContext::Runtime);\n    if (StudioSystem != nullptr && IsValid(Vca))\n    {\n        FMOD::Studio::ID guid = FMODUtils::ConvertGuid(Vca->AssetGuid);\n        FMOD::Studio::VCA *vca = nullptr;\n        FMOD_RESULT result = StudioSystem->getVCAByID(&guid, &vca);\n        if (result == FMOD_OK && vca != nullptr)\n        {\n            vca->setVolume(Volume);\n        }\n    }\n}\n\nbool UFMODBlueprintStatics::EventInstanceIsValid(FFMODEventInstance EventInstance)\n{\n    if (EventInstance.Instance)\n    {\n        return EventInstance.Instance->isValid();\n    }\n    return false;\n}\n\nvoid UFMODBlueprintStatics::EventInstanceSetVolume(FFMODEventInstance EventInstance, float Volume)\n{\n    if (EventInstance.Instance)\n    {\n        FMOD_RESULT Result = EventInstance.Instance->setVolume(Volume);\n        if (Result != FMOD_OK)\n        {\n            UE_LOG(LogFMOD, Warning, TEXT(\"Failed to set event instance volume\"));\n        }\n    }\n}\n\nvoid UFMODBlueprintStatics::EventInstanceSetPitch(FFMODEventInstance EventInstance, float Pitch)\n{\n    if (EventInstance.Instance)\n    {\n        FMOD_RESULT Result = EventInstance.Instance->setPitch(Pitch);\n        if (Result != FMOD_OK)\n        {\n            UE_LOG(LogFMOD, Warning, TEXT(\"Failed to set event instance pitch\"));\n        }\n    }\n}\n\nvoid UFMODBlueprintStatics::EventInstanceSetPaused(FFMODEventInstance EventInstance, bool Paused)\n{\n    if (EventInstance.Instance)\n    {\n        FMOD_RESULT Result = EventInstance.Instance->setPaused(Paused);\n        if (Result != FMOD_OK)\n        {\n            UE_LOG(LogFMOD, Warning, TEXT(\"Failed to pause event instance\"));\n        }\n    }\n}\n\nvoid UFMODBlueprintStatics::EventInstanceSetParameter(FFMODEventInstance EventInstance, FName Name, float Value)\n{\n    if (EventInstance.Instance)\n    {\n        FMOD_RESULT Result = EventInstance.Instance->setParameterValue(TCHAR_TO_UTF8(*Name.ToString()), Value);\n        if (Result != FMOD_OK)\n        {\n            UE_LOG(LogFMOD, Warning, TEXT(\"Failed to set event instance parameter %s\"), *Name.ToString());\n        }\n    }\n}\n\nfloat UFMODBlueprintStatics::EventInstanceGetParameter(FFMODEventInstance EventInstance, FName Name)\n{\n    float Value = 0.0f;\n    if (EventInstance.Instance)\n    {\n        FMOD::Studio::ParameterInstance *ParamInst = nullptr;\n        FMOD_RESULT Result = EventInstance.Instance->getParameter(TCHAR_TO_UTF8(*Name.ToString()), &ParamInst);\n        if (Result == FMOD_OK)\n        {\n            Result = ParamInst->getValue(&Value);\n        }\n        if (Result != FMOD_OK)\n        {\n            UE_LOG(LogFMOD, Warning, TEXT(\"Failed to get event instance parameter %s\"), *Name.ToString());\n        }\n    }\n    return Value;\n}\n\nvoid UFMODBlueprintStatics::EventInstanceSetProperty(FFMODEventInstance EventInstance, EFMODEventProperty::Type Property, float Value)\n{\n    if (EventInstance.Instance)\n    {\n        FMOD_RESULT Result = EventInstance.Instance->setProperty((FMOD_STUDIO_EVENT_PROPERTY)Property, Value);\n\n        if (Result != FMOD_OK)\n        {\n            UE_LOG(LogFMOD, Warning, TEXT(\"Failed to set event instance property type %d to value %f (%s)\"), (int)Property, Value,\n                FMOD_ErrorString(Result));\n        }\n    }\n}\n\nvoid UFMODBlueprintStatics::EventInstancePlay(FFMODEventInstance EventInstance)\n{\n    if (EventInstance.Instance)\n    {\n        FMOD_RESULT Result = EventInstance.Instance->start();\n        if (Result != FMOD_OK)\n        {\n            UE_LOG(LogFMOD, Warning, TEXT(\"Failed to play event instance\"));\n        }\n        // Once we start playing, allow instance to be cleaned up when it finishes\n        EventInstance.Instance->release();\n    }\n}\n\nvoid UFMODBlueprintStatics::EventInstanceStop(FFMODEventInstance EventInstance, bool Release)\n{\n    if (EventInstance.Instance)\n    {\n        FMOD_RESULT Result = EventInstance.Instance->stop(FMOD_STUDIO_STOP_ALLOWFADEOUT);\n        if (Result != FMOD_OK)\n        {\n            UE_LOG(LogFMOD, Warning, TEXT(\"Failed to stop event instance\"));\n        }\n        else\n        {\n            if (Release)\n            {\n                EventInstanceRelease(EventInstance);\n                //EventInstance.Instance->release();\n            }\n        }\n    }\n}\n\nvoid UFMODBlueprintStatics::EventInstanceRelease(FFMODEventInstance EventInstance)\n{\n    if (EventInstance.Instance)\n    {\n        FMOD_RESULT Result = EventInstance.Instance->release();\n        if (Result != FMOD_OK)\n        {\n            UE_LOG(LogFMOD, Warning, TEXT(\"Failed to release event instance\"));\n        }\n    }\n}\n\nvoid UFMODBlueprintStatics::EventInstanceTriggerCue(FFMODEventInstance EventInstance)\n{\n    if (EventInstance.Instance)\n    {\n// Studio only supports a single cue so try to get it\n#if FMOD_VERSION >= 0x00010800\n        EventInstance.Instance->triggerCue();\n#else\n        FMOD::Studio::CueInstance *Cue = nullptr;\n        EventInstance.Instance->getCueByIndex(0, &Cue);\n        if (Cue)\n        {\n            Cue->trigger();\n        }\n#endif\n    }\n}\n\nvoid UFMODBlueprintStatics::EventInstanceSetTransform(FFMODEventInstance EventInstance, const FTransform &Location)\n{\n    if (EventInstance.Instance)\n    {\n        FMOD_3D_ATTRIBUTES attr = { { 0 } };\n        FMODUtils::Assign(attr, Location);\n        FMOD_RESULT Result = EventInstance.Instance->set3DAttributes(&attr);\n        if (Result != FMOD_OK)\n        {\n            UE_LOG(LogFMOD, Warning, TEXT(\"Failed to set transform on event instance\"));\n        }\n    }\n}\n\nTArray<FString> UFMODBlueprintStatics::GetOutputDrivers()\n{\n    TArray<FString> AllNames;\n\n    FMOD::Studio::System *StudioSystem = IFMODStudioModule::Get().GetStudioSystem(EFMODSystemContext::Runtime);\n    if (StudioSystem != nullptr)\n    {\n        FMOD::System *LowLevelSystem = nullptr;\n        verifyfmod(StudioSystem->getLowLevelSystem(&LowLevelSystem));\n\n        int DriverCount = 0;\n        verifyfmod(LowLevelSystem->getNumDrivers(&DriverCount));\n\n        for (int id = 0; id < DriverCount; ++id)\n        {\n            char DriverNameUTF8[256] = {};\n            verifyfmod(LowLevelSystem->getDriverInfo(id, DriverNameUTF8, sizeof(DriverNameUTF8), 0, 0, 0, 0));\n            FString DriverName(UTF8_TO_TCHAR(DriverNameUTF8));\n            AllNames.Add(DriverName);\n        }\n    }\n\n    return AllNames;\n}\n\nvoid UFMODBlueprintStatics::SetOutputDriverByName(FString NewDriverName)\n{\n    FMOD::Studio::System *StudioSystem = IFMODStudioModule::Get().GetStudioSystem(EFMODSystemContext::Runtime);\n    if (StudioSystem != nullptr)\n    {\n        FMOD::System *LowLevelSystem = nullptr;\n        verifyfmod(StudioSystem->getLowLevelSystem(&LowLevelSystem));\n\n        int DriverIndex = -1;\n        int DriverCount = 0;\n        verifyfmod(LowLevelSystem->getNumDrivers(&DriverCount));\n\n        for (int id = 0; id < DriverCount; ++id)\n        {\n            char DriverNameUTF8[256] = {};\n            verifyfmod(LowLevelSystem->getDriverInfo(id, DriverNameUTF8, sizeof(DriverNameUTF8), 0, 0, 0, 0));\n            FString DriverName(UTF8_TO_TCHAR(DriverNameUTF8));\n            UE_LOG(LogFMOD, Log, TEXT(\"Driver %d: %s\"), id, *DriverName);\n            if (DriverName.Contains(NewDriverName))\n            {\n                DriverIndex = id;\n            }\n        }\n\n        if (DriverIndex >= 0)\n        {\n            UE_LOG(LogFMOD, Log, TEXT(\"Selected driver %d\"), DriverIndex);\n            verifyfmod(LowLevelSystem->setDriver(DriverIndex));\n        }\n        else\n        {\n            UE_LOG(LogFMOD, Warning, TEXT(\"Did not find driver of name '%s'\"), *NewDriverName);\n        }\n    }\n}\n\nvoid UFMODBlueprintStatics::SetOutputDriverByIndex(int NewDriverIndex)\n{\n    FMOD::Studio::System *StudioSystem = IFMODStudioModule::Get().GetStudioSystem(EFMODSystemContext::Runtime);\n    if (StudioSystem != nullptr)\n    {\n        FMOD::System *LowLevelSystem = nullptr;\n        verifyfmod(StudioSystem->getLowLevelSystem(&LowLevelSystem));\n\n        int DriverCount = 0;\n        verifyfmod(LowLevelSystem->getNumDrivers(&DriverCount));\n\n        if (NewDriverIndex >= 0 && NewDriverIndex < DriverCount)\n        {\n            UE_LOG(LogFMOD, Log, TEXT(\"Selected driver %d\"), NewDriverIndex);\n            verifyfmod(LowLevelSystem->setDriver(NewDriverIndex));\n        }\n        else\n        {\n            UE_LOG(LogFMOD, Warning, TEXT(\"Driver %d out of range\"), NewDriverIndex);\n        }\n    }\n}\n\nvoid UFMODBlueprintStatics::MixerSuspend()\n{\n    UE_LOG(LogFMOD, Log, TEXT(\"MixerSuspend called\"));\n    FMOD::Studio::System *StudioSystem = IFMODStudioModule::Get().GetStudioSystem(EFMODSystemContext::Runtime);\n    if (StudioSystem != nullptr)\n    {\n        FMOD::System *LowLevelSystem = nullptr;\n        verifyfmod(StudioSystem->getLowLevelSystem(&LowLevelSystem));\n\n        verifyfmod(LowLevelSystem->mixerSuspend());\n    }\n}\n\nvoid UFMODBlueprintStatics::MixerResume()\n{\n    UE_LOG(LogFMOD, Log, TEXT(\"MixerResume called\"));\n    FMOD::Studio::System *StudioSystem = IFMODStudioModule::Get().GetStudioSystem(EFMODSystemContext::Runtime);\n    if (StudioSystem != nullptr)\n    {\n        FMOD::System *LowLevelSystem = nullptr;\n        verifyfmod(StudioSystem->getLowLevelSystem(&LowLevelSystem));\n\n        verifyfmod(LowLevelSystem->mixerResume());\n    }\n}\n"
  },
  {
    "path": "Plugins/FMODStudio/Source/FMODStudio/Private/FMODBus.cpp",
    "content": "// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2020.\n\n#include \"FMODBus.h\"\n#include \"FMODStudioModule.h\"\n\nUFMODBus::UFMODBus(const FObjectInitializer &ObjectInitializer)\n    : Super(ObjectInitializer)\n{\n}\n\n/** Get tags to show in content view */\nvoid UFMODBus::GetAssetRegistryTags(TArray<FAssetRegistryTag> &OutTags) const\n{\n    Super::GetAssetRegistryTags(OutTags);\n}\n\nFString UFMODBus::GetDesc()\n{\n    return FString::Printf(TEXT(\"Bus %s\"), *AssetGuid.ToString(EGuidFormats::DigitsWithHyphensInBraces));\n}\n"
  },
  {
    "path": "Plugins/FMODStudio/Source/FMODStudio/Private/FMODEvent.cpp",
    "content": "// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2020.\n\n#include \"FMODEvent.h\"\n#include \"FMODStudioModule.h\"\n#include \"fmod_studio.hpp\"\n\nUFMODEvent::UFMODEvent(const FObjectInitializer &ObjectInitializer)\n    : Super(ObjectInitializer)\n{\n}\n\n/** Get tags to show in content view */\nvoid UFMODEvent::GetAssetRegistryTags(TArray<FAssetRegistryTag> &OutTags) const\n{\n    Super::GetAssetRegistryTags(OutTags);\n    if (IFMODStudioModule::Get().AreBanksLoaded())\n    {\n        FMOD::Studio::EventDescription *EventDesc = IFMODStudioModule::Get().GetEventDescription(this, EFMODSystemContext::Max);\n\n        bool bOneshot = false;\n        bool bStream = false;\n        bool b3D = false;\n        if (EventDesc)\n        {\n            EventDesc->isOneshot(&bOneshot);\n            EventDesc->isStream(&bStream);\n            EventDesc->is3D(&b3D);\n        }\n\n        OutTags.Add(UObject::FAssetRegistryTag(\"Oneshot\", bOneshot ? TEXT(\"True\") : TEXT(\"False\"), UObject::FAssetRegistryTag::TT_Alphabetical));\n        OutTags.Add(UObject::FAssetRegistryTag(\"Streaming\", bStream ? TEXT(\"True\") : TEXT(\"False\"), UObject::FAssetRegistryTag::TT_Alphabetical));\n        OutTags.Add(UObject::FAssetRegistryTag(\"3D\", b3D ? TEXT(\"True\") : TEXT(\"False\"), UObject::FAssetRegistryTag::TT_Alphabetical));\n    }\n}\n\nFString UFMODEvent::GetDesc()\n{\n    return FString::Printf(TEXT(\"Event %s\"), *AssetGuid.ToString(EGuidFormats::DigitsWithHyphensInBraces));\n}\n\nvoid UFMODEvent::GetParameterDescriptions(TArray<FMOD_STUDIO_PARAMETER_DESCRIPTION> &Parameters) const\n{\n    if (IFMODStudioModule::Get().AreBanksLoaded())\n    {\n        FMOD::Studio::EventDescription *EventDesc = IFMODStudioModule::Get().GetEventDescription(this, EFMODSystemContext::Auditioning);\n\n        if (EventDesc)\n        {\n            int ParameterCount;\n            EventDesc->getParameterCount(&ParameterCount);\n            Parameters.SetNumUninitialized(ParameterCount);\n            for (int ParameterIndex = 0; ParameterIndex < ParameterCount; ++ParameterIndex)\n            {\n                EventDesc->getParameterByIndex(ParameterIndex, &Parameters[ParameterIndex]);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Plugins/FMODStudio/Source/FMODStudio/Private/FMODFileCallbacks.cpp",
    "content": "// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2015.\n\n#include \"FMODFileCallbacks.h\"\n#include \"FMODUtils.h\"\n#include \"HAL/FileManager.h\"\n#include \"GenericPlatform/GenericPlatformProcess.h\"\n#include \"HAL/Runnable.h\"\n#include \"HAL/RunnableThread.h\"\n#include \"Misc/ScopeLock.h\"\n#include \"FMODStudioPrivatePCH.h\"\n\nFMOD_RESULT F_CALLBACK FMODLogCallback(FMOD_DEBUG_FLAGS flags, const char *file, int line, const char *func, const char *message)\n{\n    if (flags & FMOD_DEBUG_LEVEL_ERROR)\n    {\n        UE_LOG(LogFMOD, Error, TEXT(\"%s(%d) - %s\"), UTF8_TO_TCHAR(file), line, UTF8_TO_TCHAR(message));\n    }\n    else if (flags & FMOD_DEBUG_LEVEL_WARNING)\n    {\n        FString Message = UTF8_TO_TCHAR(message);\n        UE_LOG(LogFMOD, Warning, TEXT(\"%s(%d) - %s\"), UTF8_TO_TCHAR(file), line, *Message);\n        if (GIsEditor)\n        {\n            int32 StartIndex = Message.Find(TEXT(\"Missing DSP plugin '\"));\n            if (StartIndex != INDEX_NONE)\n            {\n                int32 Len = FString(TEXT(\"Missing DSP plugin '\")).Len();\n                int32 EndIndex;\n                if (Message.FindLastChar('\\'', EndIndex) && EndIndex != INDEX_NONE && StartIndex + Len < EndIndex)\n                {\n                    FString PluginName = Message.Mid(StartIndex + Len, EndIndex - StartIndex - Len);\n\n                    FModuleManager::GetModuleChecked<IFMODStudioModule>(\"FMODStudio\").AddRequiredPlugin(PluginName);\n                }\n            }\n        }\n    }\n    else if (flags & FMOD_DEBUG_LEVEL_LOG)\n    {\n        UE_LOG(LogFMOD, Log, TEXT(\"%s(%d) - %s\"), UTF8_TO_TCHAR(file), line, UTF8_TO_TCHAR(message));\n    }\n    return FMOD_OK;\n}\n\nclass FFMODFileSystem : public FRunnable\n{\npublic:\n    FFMODFileSystem()\n        : mHandleIn(nullptr)\n        , mName(nullptr)\n        , mFileSize(nullptr)\n        , mHandleOut(nullptr)\n        , mBuffer(nullptr)\n        , mSizeBytes(0)\n        , mBytesRead(nullptr)\n        , mSeekPosition(0)\n        , mCommand(COMMAND_MAX)\n        , mResult(FMOD_OK)\n        , mReferenceCount(0)\n        , mThread(nullptr)\n        , mCommandReadyEvent(nullptr)\n        , mCommandCompleteEvent(nullptr)\n    {\n    }\n\n    static FMOD_RESULT F_CALLBACK OpenCallback(const char *name, unsigned int *filesize, void **handle, void * /*userdata*/);\n    static FMOD_RESULT F_CALLBACK CloseCallback(void *handle, void * /*userdata*/);\n    static FMOD_RESULT F_CALLBACK ReadCallback(void *handle, void *buffer, unsigned int sizebytes, unsigned int *bytesread, void * /*userdata*/);\n    static FMOD_RESULT F_CALLBACK SeekCallback(void *handle, unsigned int pos, void * /*userdata*/);\n\n    static FMOD_RESULT OpenInternal(const char *name, unsigned int *filesize, void **handle);\n    static FMOD_RESULT CloseInternal(void *handle);\n    static FMOD_RESULT ReadInternal(void *handle, void *buffer, unsigned int sizebytes, unsigned int *bytesread);\n    static FMOD_RESULT SeekInternal(void *handle, unsigned int pos);\n\n    void IncrementReferenceCount()\n    {\n        FScopeLock lock(&mCrit);\n\n        ++mReferenceCount;\n\n        if (mReferenceCount == 1)\n        {\n            check(!mThread);\n\n            mCommandReadyEvent = FGenericPlatformProcess::GetSynchEventFromPool();\n            mCommandCompleteEvent = FGenericPlatformProcess::GetSynchEventFromPool();\n            mThread = FRunnableThread::Create(this, TEXT(\"FMOD File Access Coordinator\"));\n        }\n    }\n\n    void DecrementReferenceCount()\n    {\n        FScopeLock lock(&mCrit);\n\n        check(mReferenceCount > 0);\n        check(mThread);\n\n        --mReferenceCount;\n\n        if (mReferenceCount == 0)\n        {\n            verifyfmod(RunCommand(COMMAND_STOP));\n            mThread->WaitForCompletion();\n\n            FGenericPlatformProcess::ReturnSynchEventToPool(mCommandReadyEvent);\n            mCommandReadyEvent = nullptr;\n            FGenericPlatformProcess::ReturnSynchEventToPool(mCommandCompleteEvent);\n            mCommandCompleteEvent = nullptr;\n            delete mThread;\n            mThread = nullptr;\n        }\n    }\n\n    void Attach(FMOD::System *system, int32 fileBufferSize)\n    {\n        check(mThread);\n\n        verifyfmod(system->setFileSystem(OpenCallback, CloseCallback, ReadCallback, SeekCallback, 0, 0, fileBufferSize));\n    }\n\n    uint32 Run() override\n    {\n        bool stopRequested = false;\n\n        while (!stopRequested)\n        {\n            mCommandReadyEvent->Wait();\n\n            switch (mCommand)\n            {\n                case COMMAND_OPEN:\n                    mResult = OpenInternal(mName, mFileSize, mHandleOut);\n                    break;\n                case COMMAND_CLOSE:\n                    mResult = CloseInternal(mHandleIn);\n                    break;\n                case COMMAND_READ:\n                    mResult = ReadInternal(mHandleIn, mBuffer, mSizeBytes, mBytesRead);\n                    break;\n                case COMMAND_SEEK:\n                    mResult = SeekInternal(mHandleIn, mSeekPosition);\n                    break;\n                case COMMAND_STOP:\n                    stopRequested = true;\n                    mResult = FMOD_OK;\n                    break;\n            }\n\n            mCommandCompleteEvent->Trigger();\n        }\n\n        return 0;\n    }\n\nprivate:\n    enum Command\n    {\n        COMMAND_OPEN,\n        COMMAND_CLOSE,\n        COMMAND_READ,\n        COMMAND_SEEK,\n        COMMAND_STOP,\n        COMMAND_MAX,\n    };\n\n    FMOD_RESULT RunCommand(Command command)\n    {\n        check(mThread);\n\n        mCommand = command;\n        mCommandReadyEvent->Trigger();\n        mCommandCompleteEvent->Wait();\n\n        return mResult;\n    }\n\n    // Parameter for Close, Seek and Read\n    void *mHandleIn;\n\n    // Parameters for Open\n    const char *mName;\n    unsigned int *mFileSize;\n    void **mHandleOut;\n\n    // Parameters for Read\n    void *mBuffer;\n    unsigned int mSizeBytes;\n    unsigned int *mBytesRead;\n\n    // Parameter for Seek\n    unsigned int mSeekPosition;\n\n    Command mCommand;\n    FMOD_RESULT mResult;\n\n    int mReferenceCount;\n    FRunnableThread *mThread;\n    FEvent *mCommandReadyEvent;\n    FEvent *mCommandCompleteEvent;\n\n    FCriticalSection mCrit;\n};\n\nstatic FFMODFileSystem gFileSystem;\n\nFMOD_RESULT F_CALLBACK FFMODFileSystem::OpenCallback(const char *name, unsigned int *filesize, void **handle, void * /*userdata*/)\n{\n    FScopeLock lock(&gFileSystem.mCrit);\n    gFileSystem.mName = name;\n    gFileSystem.mFileSize = filesize;\n    gFileSystem.mHandleOut = handle;\n\n    return gFileSystem.RunCommand(COMMAND_OPEN);\n}\n\nFMOD_RESULT FFMODFileSystem::OpenInternal(const char *name, unsigned int *filesize, void **handle)\n{\n    if (name)\n    {\n        FArchive *Archive = IFileManager::Get().CreateFileReader(UTF8_TO_TCHAR(name));\n        UE_LOG(LogFMOD, Verbose, TEXT(\"FFMODFileSystem::OpenInternal opening '%s' returned archive %p\"), UTF8_TO_TCHAR(name), Archive);\n        if (!Archive)\n        {\n            return FMOD_ERR_FILE_NOTFOUND;\n        }\n        *filesize = Archive->TotalSize();\n        *handle = Archive;\n        UE_LOG(LogFMOD, Verbose, TEXT(\"  TotalSize = %d\"), *filesize);\n    }\n\n    return FMOD_OK;\n}\n\nFMOD_RESULT F_CALLBACK FFMODFileSystem::CloseCallback(void *handle, void * /*userdata*/)\n{\n    FScopeLock lock(&gFileSystem.mCrit);\n    gFileSystem.mHandleIn = handle;\n\n    return gFileSystem.RunCommand(COMMAND_CLOSE);\n}\n\nFMOD_RESULT FFMODFileSystem::CloseInternal(void *handle)\n{\n    if (!handle)\n    {\n        return FMOD_ERR_INVALID_PARAM;\n    }\n\n    FArchive *Archive = (FArchive *)handle;\n    UE_LOG(LogFMOD, Verbose, TEXT(\"FFMODFileSystem::CloseCallback closing archive %p\"), Archive);\n    delete Archive;\n\n    return FMOD_OK;\n}\n\nFMOD_RESULT F_CALLBACK FFMODFileSystem::ReadCallback(void *handle, void *buffer, unsigned int sizebytes, unsigned int *bytesread, void * /*userdata*/)\n{\n    FScopeLock lock(&gFileSystem.mCrit);\n    gFileSystem.mHandleIn = handle;\n    gFileSystem.mBuffer = buffer;\n    gFileSystem.mSizeBytes = sizebytes;\n    gFileSystem.mBytesRead = bytesread;\n\n    return gFileSystem.RunCommand(COMMAND_READ);\n}\n\nFMOD_RESULT FFMODFileSystem::ReadInternal(void *handle, void *buffer, unsigned int sizebytes, unsigned int *bytesread)\n{\n    if (!handle)\n    {\n        return FMOD_ERR_INVALID_PARAM;\n    }\n\n    if (bytesread)\n    {\n        FArchive *Archive = (FArchive *)handle;\n\n        int64 BytesLeft = Archive->TotalSize() - Archive->Tell();\n        int64 ReadAmount = FMath::Min((int64)sizebytes, BytesLeft);\n\n        Archive->Serialize(buffer, ReadAmount);\n        *bytesread = (unsigned int)ReadAmount;\n        if (ReadAmount < (int64)sizebytes)\n        {\n            UE_LOG(LogFMOD, Verbose, TEXT(\" -> EOF \"));\n            return FMOD_ERR_FILE_EOF;\n        }\n    }\n\n    return FMOD_OK;\n}\n\nFMOD_RESULT F_CALLBACK FFMODFileSystem::SeekCallback(void *handle, unsigned int pos, void * /*userdata*/)\n{\n    FScopeLock lock(&gFileSystem.mCrit);\n    gFileSystem.mHandleIn = handle;\n    gFileSystem.mSeekPosition = pos;\n\n    return gFileSystem.RunCommand(COMMAND_SEEK);\n}\n\nFMOD_RESULT FFMODFileSystem::SeekInternal(void *handle, unsigned int pos)\n{\n    if (!handle)\n    {\n        return FMOD_ERR_INVALID_PARAM;\n    }\n\n    FArchive *Archive = (FArchive *)handle;\n    Archive->Seek(pos);\n\n    return FMOD_OK;\n}\n\nvoid AcquireFMODFileSystem()\n{\n    gFileSystem.IncrementReferenceCount();\n}\n\nvoid ReleaseFMODFileSystem()\n{\n    gFileSystem.DecrementReferenceCount();\n}\n\nvoid AttachFMODFileSystem(FMOD::System *system, int32 fileBufferSize)\n{\n    gFileSystem.Attach(system, fileBufferSize);\n}\n"
  },
  {
    "path": "Plugins/FMODStudio/Source/FMODStudio/Private/FMODFileCallbacks.h",
    "content": "// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2020.\n\n#pragma once\n\n#include \"fmod.hpp\"\n#include \"GenericPlatform/GenericPlatform.h\"\n\nFMOD_RESULT F_CALLBACK FMODLogCallback(FMOD_DEBUG_FLAGS flags, const char *file, int line, const char *func, const char *message);\n\nvoid AcquireFMODFileSystem();\nvoid ReleaseFMODFileSystem();\nvoid AttachFMODFileSystem(FMOD::System *system, FGenericPlatformTypes::int32 fileBufferSize);\n"
  },
  {
    "path": "Plugins/FMODStudio/Source/FMODStudio/Private/FMODListener.cpp",
    "content": "// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2020.\n\n#include \"FMODListener.h\"\n#include \"Misc/App.h\"\n#include \"Sound/AudioVolume.h\"\n\nfloat FFMODListener::Interpolate(const double EndTime)\n{\n    if (FApp::GetCurrentTime() < InteriorStartTime)\n    {\n        return (0.0f);\n    }\n\n    if (FApp::GetCurrentTime() >= EndTime)\n    {\n        return (1.0f);\n    }\n\n    float InterpValue = (float)((FApp::GetCurrentTime() - InteriorStartTime) / (EndTime - InteriorStartTime));\n    return (InterpValue);\n}\n\nvoid FFMODListener::UpdateCurrentInteriorSettings()\n{\n    // Store the interpolation value, not the actual value\n    InteriorVolumeInterp = Interpolate(InteriorEndTime);\n    ExteriorVolumeInterp = Interpolate(ExteriorEndTime);\n    InteriorLPFInterp = Interpolate(InteriorLPFEndTime);\n    ExteriorLPFInterp = Interpolate(ExteriorLPFEndTime);\n}\n\nvoid FFMODListener::ApplyInteriorSettings(class AAudioVolume *InVolume, const FInteriorSettings &Settings)\n{\n    if (InteriorSettings != Settings)\n    {\n        // Use previous/ current interpolation time if we're transitioning to the default worldsettings zone.\n        InteriorStartTime = FApp::GetCurrentTime();\n        InteriorEndTime = InteriorStartTime + (Settings.bIsWorldSettings ? InteriorSettings.InteriorTime : Settings.InteriorTime);\n        ExteriorEndTime = InteriorStartTime + (Settings.bIsWorldSettings ? InteriorSettings.ExteriorTime : Settings.ExteriorTime);\n        InteriorLPFEndTime = InteriorStartTime + (Settings.bIsWorldSettings ? InteriorSettings.InteriorLPFTime : Settings.InteriorLPFTime);\n        ExteriorLPFEndTime = InteriorStartTime + (Settings.bIsWorldSettings ? InteriorSettings.ExteriorLPFTime : Settings.ExteriorLPFTime);\n\n        InteriorSettings = Settings;\n    }\n    Volume = InVolume;\n}\n\nFFMODInteriorSettings::FFMODInteriorSettings()\n    : bIsWorldSettings(false)\n    , ExteriorVolume(1.0f)\n    , ExteriorTime(0.5f)\n    , ExteriorLPF(MAX_FILTER_FREQUENCY)\n    , ExteriorLPFTime(0.5f)\n    , InteriorVolume(1.0f)\n    , InteriorTime(0.5f)\n    , InteriorLPF(MAX_FILTER_FREQUENCY)\n    , InteriorLPFTime(0.5f)\n{\n}\n\nbool FFMODInteriorSettings::operator==(const FInteriorSettings &Other) const\n{\n    return (this->bIsWorldSettings == Other.bIsWorldSettings) && (this->ExteriorVolume == Other.ExteriorVolume) &&\n           (this->ExteriorTime == Other.ExteriorTime) && (this->ExteriorLPF == Other.ExteriorLPF) &&\n           (this->ExteriorLPFTime == Other.ExteriorLPFTime) && (this->InteriorVolume == Other.InteriorVolume) &&\n           (this->InteriorTime == Other.InteriorTime) && (this->InteriorLPF == Other.InteriorLPF) && (this->InteriorLPFTime == Other.InteriorLPFTime);\n}\nbool FFMODInteriorSettings::operator!=(const FInteriorSettings &Other) const\n{\n    return !(*this == Other);\n}\n\nFFMODInteriorSettings &FFMODInteriorSettings::operator=(FInteriorSettings Other)\n{\n    bIsWorldSettings = Other.bIsWorldSettings;\n    ExteriorVolume = Other.ExteriorVolume;\n    ExteriorTime = Other.ExteriorTime;\n    ExteriorLPF = Other.ExteriorLPF;\n    ExteriorLPFTime = Other.ExteriorLPFTime;\n    InteriorVolume = Other.InteriorVolume;\n    InteriorTime = Other.InteriorTime;\n    InteriorLPF = Other.InteriorLPF;\n    InteriorLPFTime = Other.InteriorLPFTime;\n    return *this;\n}"
  },
  {
    "path": "Plugins/FMODStudio/Source/FMODStudio/Private/FMODListener.h",
    "content": "// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2020.\n\n#pragma once\n\n#include \"GenericPlatform/GenericPlatform.h\"\n#include \"UObject/Object.h\"\n#include \"Math/Vector.h\"\n\nstruct FInteriorSettings;\n\n/** Struct encapsulating settings for interior areas. */\nstruct FFMODInteriorSettings\n{\n    uint32 bIsWorldSettings : 1;\n    float ExteriorVolume;\n    float ExteriorTime;\n    float ExteriorLPF;\n    float ExteriorLPFTime;\n    float InteriorVolume;\n    float InteriorTime;\n    float InteriorLPF;\n    float InteriorLPFTime;\n\n    FFMODInteriorSettings();\n    bool operator==(const FInteriorSettings &Other) const;\n    bool operator!=(const FInteriorSettings &Other) const;\n    FFMODInteriorSettings &operator=(FInteriorSettings Other);\n};\n\n/** A direct copy of FListener (which doesn't have external linkage, unfortunately) **/\nstruct FFMODListener\n{\n    FTransform Transform;\n    FVector Velocity;\n\n    struct FFMODInteriorSettings InteriorSettings;\n    /** The volume the listener resides in */\n    class AAudioVolume *Volume;\n\n    /** The times of interior volumes fading in and out */\n    double InteriorStartTime;\n    double InteriorEndTime;\n    double ExteriorEndTime;\n    double InteriorLPFEndTime;\n    double ExteriorLPFEndTime;\n    float InteriorVolumeInterp;\n    float InteriorLPFInterp;\n    float ExteriorVolumeInterp;\n    float ExteriorLPFInterp;\n\n    FVector GetUp() const { return Transform.GetUnitAxis(EAxis::Z); }\n    FVector GetFront() const { return Transform.GetUnitAxis(EAxis::Y); }\n    FVector GetRight() const { return Transform.GetUnitAxis(EAxis::X); }\n\n    /**\n\t * Works out the interp value between source and end\n\t */\n    float Interpolate(const double EndTime);\n\n    /**\n\t * Gets the current state of the interior settings for the listener\n\t */\n    void UpdateCurrentInteriorSettings();\n\n    /** \n\t * Apply the interior settings to ambient sounds\n\t */\n    void ApplyInteriorSettings(class AAudioVolume *Volume, const FInteriorSettings &Settings);\n\n    FFMODListener()\n        : Transform(FTransform::Identity)\n        , Velocity(ForceInit)\n        , Volume(NULL)\n        , InteriorStartTime(0.0)\n        , InteriorEndTime(0.0)\n        , ExteriorEndTime(0.0)\n        , InteriorLPFEndTime(0.0)\n        , ExteriorLPFEndTime(0.0)\n        , InteriorVolumeInterp(0.f)\n        , InteriorLPFInterp(0.f)\n        , ExteriorVolumeInterp(0.f)\n        , ExteriorLPFInterp(0.f)\n    {\n    }\n};\n"
  },
  {
    "path": "Plugins/FMODStudio/Source/FMODStudio/Private/FMODPlatformLoadDll_Generic.h",
    "content": "// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2020.\n#pragma once\n\nvoid *FMODPlatformLoadDll(const TCHAR *LibToLoad)\n{\n    return FPlatformProcess::GetDllHandle(LibToLoad);\n}\n\nFMOD_RESULT FMODPlatformSystemSetup()\n{\n    return FMOD_OK;\n}"
  },
  {
    "path": "Plugins/FMODStudio/Source/FMODStudio/Private/FMODPlatformLoadDll_Switch.h",
    "content": "// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2020.\n#pragma once\n\n#include \"fmod_nx.h\"\n\nvoid *FMODPlatformLoadDll(const TCHAR *LibToLoad)\n{\n    return FPlatformProcess::GetDllHandle(LibToLoad);\n}\n\nFMOD_RESULT FMODPlatformSystemSetup()\n{\n    FMOD_NX_THREADAFFINITY Affinity = { 0 };\n    Affinity.mixer = FMOD_THREAD_CORE1;\n    Affinity.studioUpdate = FMOD_THREAD_CORE0;\n    Affinity.studioLoadBank = FMOD_THREAD_CORE0;\n    Affinity.studioLoadSample = FMOD_THREAD_CORE0;\n    return FMOD_NX_SetThreadAffinity(&Affinity);\n}\n"
  },
  {
    "path": "Plugins/FMODStudio/Source/FMODStudio/Private/FMODPlatformLoadDll_XBoxOne.h",
    "content": "// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2020.\n#pragma once\n\n#include \"fmoddurango.h\"\n\nvoid *FMODPlatformLoadDll(const TCHAR *LibToLoad)\n{\n    return LoadLibrary(LibToLoad);\n}\n\nFMOD_RESULT FMODPlatformSystemSetup()\n{\n    FMOD_DURANGO_THREADAFFINITY Affinity = { 0 };\n    Affinity.mixer = FMOD_THREAD_CORE4;\n    Affinity.studioUpdate = FMOD_THREAD_CORE5;\n    Affinity.studioLoadBank = FMOD_THREAD_CORE5;\n    Affinity.studioLoadSample = FMOD_THREAD_CORE5;\n    return FMOD_Durango_SetThreadAffinity(&Affinity);\n}\n"
  },
  {
    "path": "Plugins/FMODStudio/Source/FMODStudio/Private/FMODSettings.cpp",
    "content": "// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2020.\n\n#include \"FMODSettings.h\"\n#include \"HAL/FileManager.h\"\n#include \"Misc/Paths.h\"\n\n#if WITH_EDITOR\n#include \"Settings/ProjectPackagingSettings.h\"\n#endif\n\n//////////////////////////////////////////////////////////////////////////\n// UPaperRuntimeSettings\n\nUFMODSettings::UFMODSettings(const FObjectInitializer &ObjectInitializer)\n    : Super(ObjectInitializer)\n{\n    MasterBankName = TEXT(\"Master Bank\");\n    BankOutputDirectory.Path = TEXT(\"FMOD\");\n    OutputFormat = EFMODSpeakerMode::Surround_5_1;\n    ContentBrowserPrefix = TEXT(\"/Game/FMOD/\");\n    bLoadAllBanks = true;\n    bLoadAllSampleData = false;\n    bEnableLiveUpdate = true;\n    bVol0Virtual = true;\n    Vol0VirtualLevel = 0.0001f;\n    RealChannelCount = 64;\n    TotalChannelCount = 512;\n    DSPBufferLength = 0;\n    DSPBufferCount = 0;\n    FileBufferSize = 2048;\n    StudioUpdatePeriod = 0;\n    LiveUpdatePort = 9264;\n    EditorLiveUpdatePort = 9265;\n    bMatchHardwareSampleRate = true;\n    bLockAllBuses = false;\n}\n\nFString UFMODSettings::GetFullBankPath() const\n{\n    FString FullPath = BankOutputDirectory.Path;\n    if (FPaths::IsRelative(FullPath))\n    {\n        FullPath = FPaths::ProjectContentDir() / FullPath;\n    }\n\n    if (ForcePlatformName == TEXT(\".\"))\n    {\n        // Leave path without subdirectory\n    }\n    else if (!ForcePlatformName.IsEmpty())\n    {\n        FullPath = FullPath / ForcePlatformName;\n    }\n    else\n    {\n#if PLATFORM_IOS || PLATFORM_ANDROID\n        FString PlatformName = \"Mobile\";\n#elif PLATFORM_PS4\n        FString PlatformName = \"PS4\";\n#elif PLATFORM_XBOXONE\n        FString PlatformName = \"XboxOne\";\n#elif PLATFORM_SWITCH\n        FString PlatformName = \"Switch\";\n#else\n        FString PlatformName = \"Desktop\";\n#endif\n        FullPath = FullPath / PlatformName;\n    }\n    return FullPath;\n}\n\nFString UFMODSettings::GetMasterBankPath() const\n{\n    return GetFullBankPath() / (MasterBankName + TEXT(\".bank\"));\n}\n\nFString UFMODSettings::GetMasterAssetsBankPath() const\n{\n    return GetFullBankPath() / (MasterBankName + TEXT(\".assets.bank\"));\n}\n\nFString UFMODSettings::GetMasterStringsBankPath() const\n{\n    return GetFullBankPath() / (MasterBankName + TEXT(\".strings.bank\"));\n}\n\nvoid UFMODSettings::GetAllBankPaths(TArray<FString> &Paths, bool IncludeMasterBank) const\n{\n    FString BankDir = GetFullBankPath();\n    FString SearchDir = BankDir / FString(TEXT(\"*\"));\n\n    TArray<FString> AllFiles;\n    IFileManager::Get().FindFiles(AllFiles, *SearchDir, true, false);\n    for (FString &CurFile : AllFiles)\n    {\n        if (CurFile.EndsWith(\".bank\"))\n        {\n            bool IsMaster = (CurFile == MasterBankName + TEXT(\".bank\") || CurFile == MasterBankName + TEXT(\".assets.bank\") ||\n                             CurFile == MasterBankName + TEXT(\".strings.bank\"));\n            if (IncludeMasterBank || !IsMaster)\n            {\n                Paths.Push(BankDir / CurFile);\n            }\n        }\n    }\n}\n\n#if WITH_EDITOR\nUFMODSettings::EProblem UFMODSettings::Check() const\n{\n    if (!IsBankPathSet())\n    {\n        return BankPathNotSet;\n    }\n\n    UProjectPackagingSettings* PackagingSettings = Cast<UProjectPackagingSettings>(UProjectPackagingSettings::StaticClass()->GetDefaultObject());\n    bool bAddedToNonUFS = false;\n    bool bAddedToUFS = false;\n\n    for (int i = 0; i < PackagingSettings->DirectoriesToAlwaysStageAsNonUFS.Num(); ++i)\n    {\n        if (PackagingSettings->DirectoriesToAlwaysStageAsNonUFS[i].Path.StartsWith(BankOutputDirectory.Path))\n        {\n            bAddedToNonUFS = true;\n            break;\n        }\n    }\n\n    for (int i = 0; i < PackagingSettings->DirectoriesToAlwaysStageAsUFS.Num(); ++i)\n    {\n        if (PackagingSettings->DirectoriesToAlwaysStageAsUFS[i].Path.StartsWith(BankOutputDirectory.Path))\n        {\n            bAddedToUFS = true;\n            break;\n        }\n    }\n\n    if (bAddedToUFS && bAddedToNonUFS)\n    {\n        return AddedToBoth;\n    }\n\n    if (bAddedToUFS)\n    {\n        return AddedToUFS;\n    }\n \n    if (!bAddedToNonUFS)\n    {\n        return NotPackaged;\n    }\n\n    return Okay;\n}\n#endif // WITH_EDITOR\n"
  },
  {
    "path": "Plugins/FMODStudio/Source/FMODStudio/Private/FMODSnapshot.cpp",
    "content": "// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2020.\n\n#include \"FMODSnapshot.h\"\n#include \"FMODStudioModule.h\"\n\nUFMODSnapshot::UFMODSnapshot(const FObjectInitializer &ObjectInitializer)\n    : Super(ObjectInitializer)\n{\n}\n\nFString UFMODSnapshot::GetDesc()\n{\n    return FString::Printf(TEXT(\"Snapshot %s\"), *AssetGuid.ToString(EGuidFormats::DigitsWithHyphensInBraces));\n}\n"
  },
  {
    "path": "Plugins/FMODStudio/Source/FMODStudio/Private/FMODSnapshotReverb.cpp",
    "content": "// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2020.\n\n#include \"FMODSnapshotReverb.h\"\n\nUFMODSnapshotReverb::UFMODSnapshotReverb(const FObjectInitializer &ObjectInitializer)\n    : Super(ObjectInitializer)\n{\n}\n\n#if WITH_EDITORONLY_DATA\nvoid UFMODSnapshotReverb::PostEditChangeProperty(FPropertyChangedEvent &PropertyChangedEvent)\n{\n}\n#endif // EDITORONLY_DATA"
  },
  {
    "path": "Plugins/FMODStudio/Source/FMODStudio/Private/FMODStudioModule.cpp",
    "content": "// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2020.\n\n#include \"FMODStudioModule.h\"\n#include \"FMODSettings.h\"\n#include \"FMODAudioComponent.h\"\n#include \"FMODBlueprintStatics.h\"\n#include \"FMODAssetTable.h\"\n#include \"FMODFileCallbacks.h\"\n#include \"FMODBankUpdateNotifier.h\"\n#include \"FMODUtils.h\"\n#include \"FMODEvent.h\"\n#include \"FMODListener.h\"\n#include \"FMODSnapshotReverb.h\"\n\n#include \"Async/Async.h\"\n#include \"Interfaces/IPluginManager.h\"\n#include \"Misc/App.h\"\n#include \"Misc/CommandLine.h\"\n#include \"Misc/CoreDelegates.h\"\n//#include \"Engine/Engine.h\"\n#include \"Engine/GameViewportClient.h\"\n#include \"GameFramework/PlayerController.h\"\n#include \"Containers/Ticker.h\"\n#include \"Misc/Paths.h\"\n#include \"Runtime/Media/Public/IMediaClock.h\"\n#include \"Runtime/Media/Public/IMediaClockSink.h\"\n#include \"Runtime/Media/Public/IMediaModule.h\"\n#include \"TimerManager.h\"\n\n#include \"fmod_studio.hpp\"\n#include \"fmod_errors.h\"\n#include \"FMODStudioPrivatePCH.h\"\n\n#if PLATFORM_PS4\n#include \"FMODPlatformLoadDll_PS4.h\"\n#elif PLATFORM_XBOXONE\n#include \"FMODPlatformLoadDll_XBoxOne.h\"\n#elif PLATFORM_SWITCH\n#include \"FMODPlatformLoadDll_Switch.h\"\n#else\n#include \"FMODPlatformLoadDll_Generic.h\"\n#endif\n\n#define LOCTEXT_NAMESPACE \"FMODStudio\"\n\nDEFINE_LOG_CATEGORY(LogFMOD);\n\nDECLARE_STATS_GROUP(TEXT(\"FMOD\"), STATGROUP_FMOD, STATCAT_Advanced);\nDECLARE_FLOAT_COUNTER_STAT(TEXT(\"FMOD CPU - Mixer\"), STAT_FMOD_CPUMixer, STATGROUP_FMOD);\nDECLARE_FLOAT_COUNTER_STAT(TEXT(\"FMOD CPU - Studio\"), STAT_FMOD_CPUStudio, STATGROUP_FMOD);\nDECLARE_MEMORY_STAT(TEXT(\"FMOD Memory - Current\"), STAT_FMOD_Current_Memory, STATGROUP_FMOD);\nDECLARE_MEMORY_STAT(TEXT(\"FMOD Memory - Max\"), STAT_FMOD_Max_Memory, STATGROUP_FMOD);\nDECLARE_DWORD_COUNTER_STAT(TEXT(\"FMOD Channels - Total\"), STAT_FMOD_Total_Channels, STATGROUP_FMOD);\nDECLARE_DWORD_COUNTER_STAT(TEXT(\"FMOD Channels - Real\"), STAT_FMOD_Real_Channels, STATGROUP_FMOD);\n\nconst TCHAR *FMODSystemContextNames[EFMODSystemContext::Max] = {\n    TEXT(\"Auditioning\"), TEXT(\"Runtime\"), TEXT(\"Editor\"),\n};\n\nvoid *F_CALLBACK FMODMemoryAlloc(unsigned int size, FMOD_MEMORY_TYPE type, const char *sourcestr)\n{\n    return FMemory::Malloc(size);\n}\nvoid *F_CALLBACK FMODMemoryRealloc(void *ptr, unsigned int size, FMOD_MEMORY_TYPE type, const char *sourcestr)\n{\n    return FMemory::Realloc(ptr, size);\n}\nvoid F_CALLBACK FMODMemoryFree(void *ptr, FMOD_MEMORY_TYPE type, const char *sourcestr)\n{\n    FMemory::Free(ptr);\n}\n\nstruct FFMODSnapshotEntry\n{\n    FFMODSnapshotEntry(UFMODSnapshotReverb *InSnapshot = nullptr, FMOD::Studio::EventInstance *InInstance = nullptr)\n        : Snapshot(InSnapshot)\n        , Instance(InInstance)\n        , StartTime(0.0)\n        , FadeDuration(0.0f)\n        , FadeIntensityStart(0.0f)\n        , FadeIntensityEnd(0.0f)\n    {\n    }\n\n    float CurrentIntensity() const\n    {\n        double CurrentTime = FApp::GetCurrentTime();\n        if (StartTime + FadeDuration <= CurrentTime)\n        {\n            return FadeIntensityEnd;\n        }\n        else\n        {\n            float Factor = (CurrentTime - StartTime) / FadeDuration;\n            return FMath::Lerp<float>(FadeIntensityStart, FadeIntensityEnd, Factor);\n        }\n    }\n\n    void FadeTo(float Target, float Duration)\n    {\n        float StartIntensity = CurrentIntensity();\n\n        StartTime = FApp::GetCurrentTime();\n        FadeDuration = Duration;\n        FadeIntensityStart = StartIntensity;\n        FadeIntensityEnd = Target;\n    }\n\n    UFMODSnapshotReverb *Snapshot;\n    FMOD::Studio::EventInstance *Instance;\n    double StartTime;\n    float FadeDuration;\n    float FadeIntensityStart;\n    float FadeIntensityEnd;\n};\n\nclass FFMODStudioSystemClockSink : public IMediaClockSink\n{\npublic:\n    DECLARE_DELEGATE_RetVal(void, FUpdateListenerPosition);\n\n    FFMODStudioSystemClockSink(FMOD::Studio::System *SystemIn)\n        : System(SystemIn)\n        , LastResult(FMOD_OK)\n    {\n    }\n\n    virtual void TickRender(FTimespan DeltaTime, FTimespan Timecode) override\n    {\n        if (System)\n        {\n            if (UpdateListenerPosition.IsBound())\n            {\n                UpdateListenerPosition.Execute();\n            }\n\n            LastResult = System->update();\n        }\n    }\n\n    void SetUpdateListenerPositionDelegate(FUpdateListenerPosition UpdateListenerPositionIn) { UpdateListenerPosition = UpdateListenerPositionIn; }\n\n    void OnDestroyStudioSystem() { System = nullptr; }\n\n    FMOD::Studio::System *System;\n    FMOD_RESULT LastResult;\n    FUpdateListenerPosition UpdateListenerPosition;\n};\n\nclass FFMODStudioModule : public IFMODStudioModule\n{\npublic:\n    /** IModuleInterface implementation */\n    FFMODStudioModule()\n        : AuditioningInstance(nullptr)\n        , ListenerCount(1)\n        , bSimulating(false)\n        , bIsInPIE(false)\n        , bUseSound(true)\n        , bListenerMoved(true)\n\t\t, bAllowLiveUpdate(WITH_EDITOR)\n        , bBanksLoaded(false)\n        , LowLevelLibHandle(nullptr)\n        , StudioLibHandle(nullptr)\n        , bMixerPaused(false)\n        , MemPool(nullptr)\n    {\n        for (int i = 0; i < EFMODSystemContext::Max; ++i)\n        {\n            StudioSystem[i] = nullptr;\n        }\n    }\n\n    void HandleApplicationWillDeactivate()\n    {\n        AsyncTask(ENamedThreads::GameThread, [&]() { SetSystemPaused(true); });\n    }\n    void HandleApplicationHasReactivated()\n    {\n        AsyncTask(ENamedThreads::GameThread, [&]() { SetSystemPaused(false); });\n    }\n\n    virtual void StartupModule() override;\n    virtual void PostLoadCallback() override;\n    virtual void ShutdownModule() override;\n\n    FString GetDllPath(const TCHAR *ShortName, bool bExplicitPath, bool bUseLibPrefix);\n    void *LoadDll(const TCHAR *ShortName);\n\n    bool LoadLibraries();\n\n    void LoadBanks(EFMODSystemContext::Type Type);\n\n    /** Called when a newer version of the bank files was detected */\n    void HandleBanksUpdated();\n\n    void CreateStudioSystem(EFMODSystemContext::Type Type);\n    void DestroyStudioSystem(EFMODSystemContext::Type Type);\n\n    bool Tick(float DeltaTime);\n\n    void UpdateViewportPosition();\n\n    virtual FMOD::Studio::System *GetStudioSystem(EFMODSystemContext::Type Context) override;\n    virtual FMOD::Studio::EventDescription *GetEventDescription(const UFMODEvent *Event, EFMODSystemContext::Type Type) override;\n    virtual FMOD::Studio::EventInstance *CreateAuditioningInstance(const UFMODEvent *Event) override;\n    virtual void StopAuditioningInstance() override;\n\n    virtual void SetListenerPosition(int ListenerIndex, UWorld *World, const FTransform &ListenerTransform, float DeltaSeconds) override;\n    virtual void FinishSetListenerPosition(int ListenerCount, float DeltaSeconds) override;\n\n    virtual const FFMODListener &GetNearestListener(const FVector &Location) override;\n\n    virtual bool HasListenerMoved() override;\n\n    virtual void RefreshSettings();\n\n    virtual void SetSystemPaused(bool paused) override;\n\n    virtual void SetInPIE(bool bInPIE, bool simulating) override;\n\n    virtual UFMODAsset *FindAssetByName(const FString &Name) override;\n    virtual UFMODEvent *FindEventByName(const FString &Name) override;\n\n    FSimpleMulticastDelegate BanksReloadedDelegate;\n    virtual FSimpleMulticastDelegate &BanksReloadedEvent() override { return BanksReloadedDelegate; }\n\n    virtual TArray<FString> GetFailedBankLoads(EFMODSystemContext::Type Context) override { return FailedBankLoads[Context]; }\n\n    virtual TArray<FString> GetRequiredPlugins() override { return RequiredPlugins; }\n\n    virtual void AddRequiredPlugin(const FString &Plugin)\n    {\n        if (!RequiredPlugins.Contains(Plugin))\n        {\n            RequiredPlugins.Add(Plugin);\n        }\n    }\n\n    virtual bool UseSound() override { return bUseSound; }\n\n    virtual bool LoadPlugin(EFMODSystemContext::Type Context, const TCHAR *ShortName) override;\n\n    virtual void LogError(int result, const char *function) override;\n\n    virtual bool AreBanksLoaded() override;\n\n    void ResetInterpolation();\n\n    /** The studio system handle. */\n    FMOD::Studio::System *StudioSystem[EFMODSystemContext::Max];\n    FMOD::Studio::EventInstance *AuditioningInstance;\n\n    /** The delegate to be invoked when this profiler manager ticks. */\n    FTickerDelegate OnTick;\n\n    /** IMediaClockSink wrappers for Studio Systems */\n    TSharedPtr<FFMODStudioSystemClockSink, ESPMode::ThreadSafe> ClockSinks[EFMODSystemContext::Max];\n\n    /** Handle for registered TickDelegate. */\n    FDelegateHandle TickDelegateHandle;\n\n    /** Table of assets with name and guid */\n    FFMODAssetTable AssetTable;\n\n    /** Periodically checks for updates of the strings.bank file */\n    FFMODBankUpdateNotifier BankUpdateNotifier;\n\n    /** List of failed bank files */\n    TArray<FString> FailedBankLoads[EFMODSystemContext::Max];\n\n    /** List of required plugins we found when loading banks. */\n    TArray<FString> RequiredPlugins;\n\n/** Listener information */\n#if FMOD_VERSION >= 0x00010600\n    static const int MAX_LISTENERS = FMOD_MAX_LISTENERS;\n#else\n    static const int MAX_LISTENERS = 1;\n#endif\n    FFMODListener Listeners[MAX_LISTENERS];\n    int ListenerCount;\n\n    /** Current snapshot applied via reverb zones*/\n    TArray<FFMODSnapshotEntry> ReverbSnapshots;\n\n    /** True if simulating */\n    bool bSimulating;\n\n    /** True if in PIE */\n    bool bIsInPIE;\n\n    /** True if we want sound enabled */\n    bool bUseSound;\n\n    /** True if we the listener has moved and may have changed audio settings*/\n    bool bListenerMoved;\n\n    /** True if we allow live update */\n    bool bAllowLiveUpdate;\n\n    bool bBanksLoaded;\n\n    /** Dynamic library */\n    FString BaseLibPath;\n    void *LowLevelLibHandle;\n    void *StudioLibHandle;\n\n    /** True if the mixer has been paused by application deactivation */\n    bool bMixerPaused;\n\n    /** You can also supply a pool of memory for FMOD to work with and it will do so with no extra calls to malloc or free. */\n    void *MemPool;\n\n    bool bLoadAllSampleData;\n};\n\nIMPLEMENT_MODULE(FFMODStudioModule, FMODStudio)\n\nvoid FFMODStudioModule::LogError(int result, const char *function)\n{\n    FString ErrorStr(ANSI_TO_TCHAR(FMOD_ErrorString((FMOD_RESULT)result)));\n    FString FunctionStr(ANSI_TO_TCHAR(function));\n    UE_LOG(LogFMOD, Error, TEXT(\"'%s' returned '%s'\"), *FunctionStr, *ErrorStr);\n}\n\nbool FFMODStudioModule::LoadPlugin(EFMODSystemContext::Type Context, const TCHAR *ShortName)\n{\n    UE_LOG(LogFMOD, Log, TEXT(\"Loading plugin '%s'\"), ShortName);\n\n    static const int ATTEMPT_COUNT = 2;\n    static const TCHAR *AttemptPrefixes[ATTEMPT_COUNT] = {\n        TEXT(\"\"),\n#if PLATFORM_64BITS\n        TEXT(\"64\")\n#else\n        TEXT(\"32\")\n#endif\n    };\n\n    FMOD::System *LowLevelSystem = nullptr;\n    verifyfmod(StudioSystem[Context]->getLowLevelSystem(&LowLevelSystem));\n\n    FMOD_RESULT PluginLoadResult;\n\n    for (int useLib = 0; useLib < 2; ++useLib)\n    {\n        for (int attempt = 0; attempt < 2; ++attempt)\n        {\n            // Try to load combinations of 64/32 suffix and lib prefix for relevant platforms\n            FString AttemptName = FString(ShortName) + AttemptPrefixes[attempt];\n            FString PluginPath = GetDllPath(*AttemptName, true, useLib != 0);\n\n            UE_LOG(LogFMOD, Log, TEXT(\"Trying to load plugin file at location: %s\"), *PluginPath);\n\n#if defined(PLATFORM_UWP) && PLATFORM_UWP\n            FPaths::MakePathRelativeTo(PluginPath, *(FPaths::RootDir() + TEXT(\"/\")));\n#endif\n\n            unsigned int Handle = 0;\n            PluginLoadResult = LowLevelSystem->loadPlugin(TCHAR_TO_UTF8(*PluginPath), &Handle, 0);\n            if (PluginLoadResult == FMOD_OK)\n            {\n                UE_LOG(LogFMOD, Log, TEXT(\"Loaded plugin %s\"), ShortName);\n                return true;\n            }\n        }\n    }\n    UE_LOG(LogFMOD, Error, TEXT(\"Failed to load plugin '%s', sounds may not play\"), ShortName);\n    return false;\n}\n\nvoid *FFMODStudioModule::LoadDll(const TCHAR *ShortName)\n{\n    FString LibPath = GetDllPath(ShortName, false, true);\n\n    void *Handle = nullptr;\n    UE_LOG(LogFMOD, Log, TEXT(\"FFMODStudioModule::LoadDll: Loading %s\"), *LibPath);\n    // Unfortunately Unreal's platform loading code hasn't been implemented on all platforms so we wrap it\n    Handle = FMODPlatformLoadDll(*LibPath);\n#if WITH_EDITOR\n    if (!Handle && !FApp::IsUnattended())\n    {\n        FString Message = TEXT(\"Couldn't load FMOD DLL \") + LibPath;\n        FPlatformMisc::MessageBoxExt(EAppMsgType::Ok, *Message, TEXT(\"Error\"));\n    }\n#endif\n    if (!Handle)\n    {\n        UE_LOG(LogFMOD, Error, TEXT(\"Failed to load FMOD DLL '%s', FMOD sounds will not play!\"), *LibPath);\n    }\n    return Handle;\n}\n\nFString FFMODStudioModule::GetDllPath(const TCHAR *ShortName, bool bExplicitPath, bool bUseLibPrefix)\n{\n    const TCHAR *LibPrefixName = (bUseLibPrefix ? TEXT(\"lib\") : TEXT(\"\"));\n#if PLATFORM_MAC\n    return FString::Printf(TEXT(\"%s/Mac/%s%s.dylib\"), *BaseLibPath, LibPrefixName, ShortName);\n#elif PLATFORM_PS4\n    const TCHAR *DirPrefix = (bExplicitPath ? TEXT(\"/app0/prx/\") : TEXT(\"\"));\n    return FString::Printf(TEXT(\"%s%s%s.prx\"), DirPrefix, LibPrefixName, ShortName);\n#elif PLATFORM_XBOXONE\n    return FString::Printf(TEXT(\"%s/XBoxOne/%s.dll\"), *BaseLibPath, ShortName);\n#elif PLATFORM_ANDROID\n    return FString::Printf(TEXT(\"%s%s.so\"), LibPrefixName, ShortName);\n#elif PLATFORM_LINUX\n    return FString::Printf(TEXT(\"%s%s.so\"), LibPrefixName, ShortName);\n#elif PLATFORM_WINDOWS\n#if PLATFORM_64BITS\n    return FString::Printf(TEXT(\"%s/Win64/%s.dll\"), *BaseLibPath, ShortName);\n#else\n    return FString::Printf(TEXT(\"%s/Win32/%s.dll\"), *BaseLibPath, ShortName);\n#endif\n#elif defined(PLATFORM_UWP) && PLATFORM_UWP\n    return FString::Printf(TEXT(\"%s/UWP64/%s.dll\"), *BaseLibPath, ShortName);\n#else\n    UE_LOG(LogFMOD, Error, TEXT(\"Unsupported platform for dynamic libs\"));\n    return \"\";\n#endif\n}\n\nbool FFMODStudioModule::LoadLibraries()\n{\n#if PLATFORM_IOS || PLATFORM_ANDROID || PLATFORM_LINUX || PLATFORM_MAC || PLATFORM_SWITCH\n    return true; // Nothing to do on those platforms\n#elif PLATFORM_HTML5\n    UE_LOG(LogFMOD, Error, TEXT(\"FMOD Studio not supported on HTML5\"));\n    return false; // Explicitly don't support this\n#else\n    UE_LOG(LogFMOD, Verbose, TEXT(\"FFMODStudioModule::LoadLibraries\"));\n\n#if defined(FMODSTUDIO_LINK_DEBUG)\n    FString ConfigName = TEXT(\"D\");\n#elif defined(FMODSTUDIO_LINK_LOGGING)\n    FString ConfigName = TEXT(\"L\");\n#elif defined(FMODSTUDIO_LINK_RELEASE)\n    FString ConfigName = TEXT(\"\");\n#else\n#error FMODSTUDIO_LINK not defined\n#endif\n\n#if PLATFORM_WINDOWS && PLATFORM_64BITS\n    ConfigName += TEXT(\"64\");\n#elif defined(PLATFORM_UWP) && PLATFORM_UWP\n    ConfigName += TEXT(\"_X64\");\n#endif\n\n    FString LowLevelName = FString(TEXT(\"fmod\")) + ConfigName;\n    FString StudioName = FString(TEXT(\"fmodstudio\")) + ConfigName;\n    LowLevelLibHandle = LoadDll(*LowLevelName);\n    StudioLibHandle = LoadDll(*StudioName);\n    return (LowLevelLibHandle != nullptr && StudioLibHandle != nullptr);\n#endif\n}\n\nvoid FFMODStudioModule::StartupModule()\n{\n    UE_LOG(LogFMOD, Log, TEXT(\"FFMODStudioModule startup\"));\n    BaseLibPath = IPluginManager::Get().FindPlugin(TEXT(\"FMODStudio\"))->GetBaseDir() + TEXT(\"/Binaries\");\n    UE_LOG(LogFMOD, Log, TEXT(\" Lib path = '%s'\"), *BaseLibPath);\n\n    if (FParse::Param(FCommandLine::Get(), TEXT(\"nosound\")) || FApp::IsBenchmarking() || IsRunningDedicatedServer() || IsRunningCommandlet())\n    {\n        bUseSound = false;\n    }\n\n    if (FParse::Param(FCommandLine::Get(), TEXT(\"noliveupdate\")))\n    {\n        bAllowLiveUpdate = false;\n    }\n\n    if (LoadLibraries())\n    {\n        verifyfmod(FMOD::Debug_Initialize(FMOD_DEBUG_LEVEL_WARNING, FMOD_DEBUG_MODE_CALLBACK, FMODLogCallback));\n\n        const UFMODSettings &Settings = *GetDefault<UFMODSettings>();\n#if PLATFORM_IOS || PLATFORM_ANDROID\n        int size = Settings.MemoryPoolSizes.Mobile;\n#elif PLATFORM_PS4\n        int size = Settings.MemoryPoolSizes.PS4;\n#elif PLATFORM_XBOXONE\n        int size = Settings.MemoryPoolSizes.XboxOne;\n#elif PLATFORM_SWITCH\n        int size = Settings.MemoryPoolSizes.Switch;\n#else\n        int size = Settings.MemoryPoolSizes.Desktop;\n#endif\n        if (!GIsEditor && size > 0)\n        {\n            MemPool = FMemory::Malloc(size);\n            verifyfmod(FMOD::Memory_Initialize(MemPool, size, nullptr, nullptr, nullptr));\n        }\n        else\n        {\n            verifyfmod(FMOD::Memory_Initialize(0, 0, FMODMemoryAlloc, FMODMemoryRealloc, FMODMemoryFree));\n        }\n\n        verifyfmod(FMODPlatformSystemSetup());\n\n        AcquireFMODFileSystem();\n\n        // Create sandbox system just for asset loading\n        AssetTable.Create();\n        RefreshSettings();\n\n        if (GIsEditor)\n        {\n            CreateStudioSystem(EFMODSystemContext::Auditioning);\n            CreateStudioSystem(EFMODSystemContext::Editor);\n        }\n        else\n        {\n            AssetTable.Destroy(); // Don't need this copy around since we don't hot reload\n\n            SetInPIE(true, false);\n        }\n    }\n\n    OnTick = FTickerDelegate::CreateRaw(this, &FFMODStudioModule::Tick);\n    TickDelegateHandle = FTicker::GetCoreTicker().AddTicker(OnTick);\n\n    if (GIsEditor)\n    {\n        BankUpdateNotifier.BanksUpdatedEvent.AddRaw(this, &FFMODStudioModule::HandleBanksUpdated);\n    }\n}\n\ninline FMOD_SPEAKERMODE ConvertSpeakerMode(EFMODSpeakerMode::Type Mode)\n{\n    switch (Mode)\n    {\n        case EFMODSpeakerMode::Stereo:\n            return FMOD_SPEAKERMODE_STEREO;\n        case EFMODSpeakerMode::Surround_5_1:\n            return FMOD_SPEAKERMODE_5POINT1;\n        case EFMODSpeakerMode::Surround_7_1:\n            return FMOD_SPEAKERMODE_7POINT1;\n        default:\n            check(0);\n            return FMOD_SPEAKERMODE_DEFAULT;\n    };\n}\n\nvoid FFMODStudioModule::CreateStudioSystem(EFMODSystemContext::Type Type)\n{\n    DestroyStudioSystem(Type);\n    if (!bUseSound)\n    {\n        return;\n    }\n\n    UE_LOG(LogFMOD, Verbose, TEXT(\"CreateStudioSystem for context %s\"), FMODSystemContextNames[Type]);\n\n    const UFMODSettings &Settings = *GetDefault<UFMODSettings>();\n    bLoadAllSampleData = Settings.bLoadAllSampleData;\n\n    FMOD_SPEAKERMODE OutputMode = ConvertSpeakerMode(Settings.OutputFormat);\n    FMOD_STUDIO_INITFLAGS StudioInitFlags = FMOD_STUDIO_INIT_NORMAL;\n    FMOD_INITFLAGS InitFlags = FMOD_INIT_NORMAL;\n\n#if (defined(FMODSTUDIO_LINK_DEBUG) || defined(FMODSTUDIO_LINK_LOGGING))\n    bool liveUpdateEnabledForType = ((Type == EFMODSystemContext::Auditioning) && Settings.bEnableEditorLiveUpdate) ||\n                                    ((Type == EFMODSystemContext::Runtime) && Settings.bEnableLiveUpdate);\n    if (liveUpdateEnabledForType && bAllowLiveUpdate)\n    {\n        UE_LOG(LogFMOD, Verbose, TEXT(\"Enabling live update\"));\n        StudioInitFlags |= FMOD_STUDIO_INIT_LIVEUPDATE;\n    }\n#endif\n    if (Type == EFMODSystemContext::Auditioning || Type == EFMODSystemContext::Editor)\n    {\n        StudioInitFlags |= FMOD_STUDIO_INIT_ALLOW_MISSING_PLUGINS;\n    }\n\n    verifyfmod(FMOD::Studio::System::create(&StudioSystem[Type]));\n    FMOD::System *lowLevelSystem = nullptr;\n    verifyfmod(StudioSystem[Type]->getLowLevelSystem(&lowLevelSystem));\n\n    int DriverIndex = 0;\n    if (!Settings.InitialOutputDriverName.IsEmpty())\n    {\n        int DriverCount = 0;\n        verifyfmod(lowLevelSystem->getNumDrivers(&DriverCount));\n        for (int id = 0; id < DriverCount; ++id)\n        {\n            char DriverNameUTF8[256] = {};\n            verifyfmod(lowLevelSystem->getDriverInfo(id, DriverNameUTF8, sizeof(DriverNameUTF8), 0, 0, 0, 0));\n            FString DriverName(UTF8_TO_TCHAR(DriverNameUTF8));\n            UE_LOG(LogFMOD, Log, TEXT(\"Driver %d: %s\"), id, *DriverName);\n            if (DriverName.Contains(Settings.InitialOutputDriverName))\n            {\n                UE_LOG(LogFMOD, Log, TEXT(\"Selected driver %d\"), id);\n                DriverIndex = id;\n            }\n        }\n        verifyfmod(lowLevelSystem->setDriver(DriverIndex));\n    }\n\n    FTCHARToUTF8 WavWriterDestUTF8(*Settings.WavWriterPath);\n    void *InitData = nullptr;\n    if (Type == EFMODSystemContext::Runtime && Settings.WavWriterPath.Len() > 0)\n    {\n        UE_LOG(LogFMOD, Log, TEXT(\"Running with Wav Writer: %s\"), *Settings.WavWriterPath);\n        verifyfmod(lowLevelSystem->setOutput(FMOD_OUTPUTTYPE_WAVWRITER));\n        InitData = (void *)WavWriterDestUTF8.Get();\n    }\n\n    int SampleRate = Settings.SampleRate;\n    if (Settings.bMatchHardwareSampleRate)\n    {\n        int DefaultSampleRate = 0;\n        verifyfmod(lowLevelSystem->getSoftwareFormat(&DefaultSampleRate, 0, 0));\n        int SystemSampleRate = 0;\n        verifyfmod(lowLevelSystem->getDriverInfo(DriverIndex, nullptr, 0, nullptr, &SystemSampleRate, nullptr, nullptr));\n        UE_LOG(LogFMOD, Log, TEXT(\"Default sample rate = %d\"), DefaultSampleRate);\n        UE_LOG(LogFMOD, Log, TEXT(\"System sample rate = %d\"), SystemSampleRate);\n        if (DefaultSampleRate >= 44100 && DefaultSampleRate <= 48000 && SystemSampleRate >= 44100 && SystemSampleRate <= 48000)\n        {\n            UE_LOG(LogFMOD, Log, TEXT(\"Matching system sample rate %d\"), SystemSampleRate);\n            SampleRate = SystemSampleRate;\n        }\n    }\n\n    verifyfmod(lowLevelSystem->setSoftwareFormat(SampleRate, OutputMode, 0));\n    verifyfmod(lowLevelSystem->setSoftwareChannels(Settings.RealChannelCount));\n    AttachFMODFileSystem(lowLevelSystem, Settings.FileBufferSize);\n\n    if (Settings.DSPBufferLength > 0 && Settings.DSPBufferCount > 0)\n    {\n        verifyfmod(lowLevelSystem->setDSPBufferSize(Settings.DSPBufferLength, Settings.DSPBufferCount));\n    }\n\n    FMOD_ADVANCEDSETTINGS advSettings = { 0 };\n    advSettings.cbSize = sizeof(FMOD_ADVANCEDSETTINGS);\n    if (Settings.bVol0Virtual)\n    {\n        advSettings.vol0virtualvol = Settings.Vol0VirtualLevel;\n        InitFlags |= FMOD_INIT_VOL0_BECOMES_VIRTUAL;\n    }\n#if PLATFORM_IOS || PLATFORM_ANDROID || PLATFORM_SWITCH\n    advSettings.maxFADPCMCodecs = Settings.RealChannelCount;\n#elif PLATFORM_PS4\n    advSettings.maxAT9Codecs = Settings.RealChannelCount;\n#elif PLATFORM_XBOXONE\n    advSettings.maxXMACodecs = Settings.RealChannelCount;\n#else\n    advSettings.maxVorbisCodecs = Settings.RealChannelCount;\n#endif\n    if (Type == EFMODSystemContext::Runtime)\n    {\n        advSettings.profilePort = Settings.LiveUpdatePort;\n    }\n    else if (Type == EFMODSystemContext::Auditioning)\n    {\n        advSettings.profilePort = Settings.EditorLiveUpdatePort;\n    }\n    advSettings.randomSeed = FMath::Rand();\n    verifyfmod(lowLevelSystem->setAdvancedSettings(&advSettings));\n\n    FMOD_STUDIO_ADVANCEDSETTINGS advStudioSettings = { 0 };\n    advStudioSettings.cbsize = sizeof(advStudioSettings);\n    advStudioSettings.studioupdateperiod = Settings.StudioUpdatePeriod;\n    verifyfmod(StudioSystem[Type]->setAdvancedSettings(&advStudioSettings));\n\n    verifyfmod(StudioSystem[Type]->initialize(Settings.TotalChannelCount, StudioInitFlags, InitFlags, InitData));\n\n    for (FString PluginName : Settings.PluginFiles)\n    {\n        if (!PluginName.IsEmpty())\n            LoadPlugin(Type, *PluginName);\n    }\n\n    if (Type == EFMODSystemContext::Runtime)\n    {\n        // Add interrupt callbacks for Mobile\n        FCoreDelegates::ApplicationWillDeactivateDelegate.AddRaw(this, &FFMODStudioModule::HandleApplicationWillDeactivate);\n        FCoreDelegates::ApplicationHasReactivatedDelegate.AddRaw(this, &FFMODStudioModule::HandleApplicationHasReactivated);\n    }\n\n    IMediaModule *MediaModule = FModuleManager::LoadModulePtr<IMediaModule>(\"Media\");\n\n    if (MediaModule != nullptr)\n    {\n        ClockSinks[Type] = MakeShared<FFMODStudioSystemClockSink, ESPMode::ThreadSafe>(StudioSystem[Type]);\n\n        if (Type == EFMODSystemContext::Runtime)\n        {\n            ClockSinks[Type]->SetUpdateListenerPositionDelegate(FTimerDelegate::CreateRaw(this, &FFMODStudioModule::UpdateViewportPosition));\n        }\n\n        MediaModule->GetClock().AddSink(ClockSinks[Type].ToSharedRef());\n    }\n}\n\nvoid FFMODStudioModule::DestroyStudioSystem(EFMODSystemContext::Type Type)\n{\n    UE_LOG(LogFMOD, Verbose, TEXT(\"DestroyStudioSystem for context %s\"), FMODSystemContextNames[Type]);\n\n    if (ClockSinks[Type].IsValid())\n    {\n        // Calling through the shared ptr enforces thread safety with the media clock\n        ClockSinks[Type]->OnDestroyStudioSystem();\n\n        IMediaModule *MediaModule = FModuleManager::LoadModulePtr<IMediaModule>(\"Media\");\n\n        if (MediaModule != nullptr)\n        {\n            MediaModule->GetClock().RemoveSink(ClockSinks[Type].ToSharedRef());\n        }\n\n        ClockSinks[Type].Reset();\n    }\n\n    // Unload all events and banks to remove warning spam when using split banks\n    if (StudioSystem[Type] && bLoadAllSampleData)\n    {\n        int bankCount;\n        verifyfmod(StudioSystem[Type]->getBankCount(&bankCount));\n        if (bankCount > 0)\n        {\n            TArray<FMOD::Studio::Bank *> bankArray;\n            TArray<FMOD::Studio::EventDescription *> eventArray;\n            TArray<FMOD::Studio::EventInstance *> instanceArray;\n\n            bankArray.SetNumUninitialized(bankCount, false);\n            verifyfmod(StudioSystem[Type]->getBankList(bankArray.GetData(), bankCount, &bankCount));\n            for (int i = 0; i < bankCount; i++)\n            {\n                int eventCount;\n                verifyfmod(bankArray[i]->getEventCount(&eventCount));\n                if (eventCount > 0)\n                {\n                    eventArray.SetNumUninitialized(eventCount, false);\n                    verifyfmod(bankArray[i]->getEventList(eventArray.GetData(), eventCount, &eventCount));\n                    for (int j = 0; j < eventCount; j++)\n                    {\n                        int instanceCount;\n                        verifyfmod(eventArray[j]->getInstanceCount(&instanceCount));\n                        if (instanceCount > 0)\n                        {\n                            instanceArray.SetNumUninitialized(instanceCount, false);\n                            verifyfmod(eventArray[j]->getInstanceList(instanceArray.GetData(), instanceCount, &instanceCount));\n                            for (int k = 0; k < instanceCount; k++)\n                            {\n                                verifyfmod(instanceArray[k]->stop(FMOD_STUDIO_STOP_IMMEDIATE));\n                                verifyfmod(instanceArray[k]->release());\n                            }\n                        }\n                    }\n                }\n            }\n\n            for (int i = 0; i < bankCount; i++)\n            {\n                FMOD_STUDIO_LOADING_STATE state;\n                bankArray[i]->getSampleLoadingState(&state);\n                if (state == FMOD_STUDIO_LOADING_STATE_LOADED)\n                {\n                    verifyfmod(bankArray[i]->unloadSampleData());\n                }\n            }\n        }\n    }\n\n    if (StudioSystem[Type])\n    {\n        verifyfmod(StudioSystem[Type]->release());\n        StudioSystem[Type] = nullptr;\n    }\n}\n\nbool FFMODStudioModule::Tick(float DeltaTime)\n{\n    if (GIsEditor)\n    {\n        BankUpdateNotifier.Update();\n    }\n\n    if (ClockSinks[EFMODSystemContext::Auditioning].IsValid())\n    {\n        verifyfmod(ClockSinks[EFMODSystemContext::Auditioning]->LastResult);\n    }\n    if (ClockSinks[EFMODSystemContext::Runtime].IsValid())\n    {\n        FMOD_STUDIO_CPU_USAGE Usage = {};\n        StudioSystem[EFMODSystemContext::Runtime]->getCPUUsage(&Usage);\n        SET_FLOAT_STAT(STAT_FMOD_CPUMixer, Usage.dspusage);\n        SET_FLOAT_STAT(STAT_FMOD_CPUStudio, Usage.studiousage);\n\n        int currentAlloc, maxAlloc;\n        FMOD::Memory_GetStats(&currentAlloc, &maxAlloc, false);\n        SET_MEMORY_STAT(STAT_FMOD_Current_Memory, currentAlloc);\n        SET_MEMORY_STAT(STAT_FMOD_Max_Memory, maxAlloc);\n\n        int channels, realChannels;\n        FMOD::System *lowlevel;\n        StudioSystem[EFMODSystemContext::Runtime]->getLowLevelSystem(&lowlevel);\n        lowlevel->getChannelsPlaying(&channels, &realChannels);\n        SET_DWORD_STAT(STAT_FMOD_Real_Channels, realChannels);\n        SET_DWORD_STAT(STAT_FMOD_Total_Channels, channels);\n\n        verifyfmod(ClockSinks[EFMODSystemContext::Runtime]->LastResult);\n    }\n    if (ClockSinks[EFMODSystemContext::Editor].IsValid())\n    {\n        verifyfmod(ClockSinks[EFMODSystemContext::Editor]->LastResult);\n    }\n    return true;\n}\n\nvoid FFMODStudioModule::UpdateViewportPosition()\n{\n    if (bSimulating)\n    {\n        return;\n    }\n    int ListenerIndex = 0;\n\n    UWorld *ViewportWorld = nullptr;\n    if (GEngine && GEngine->GameViewport)\n    {\n        ViewportWorld = GEngine->GameViewport->GetWorld();\n    }\n\n    bool bCameraCut = false; // Not sure how to get View->bCameraCut from here\n    float DeltaSeconds = ((bCameraCut || !ViewportWorld) ? 0.f : ViewportWorld->GetDeltaSeconds());\n\n    bListenerMoved = false;\n\n    if (IsValid(ViewportWorld))\n    {\n        for (FConstPlayerControllerIterator Iterator = ViewportWorld->GetPlayerControllerIterator(); Iterator; ++Iterator)\n        {\n            APlayerController *PlayerController = Iterator->Get();\n            if (PlayerController)\n            {\n                ULocalPlayer *LocalPlayer = PlayerController->GetLocalPlayer();\n                if (LocalPlayer)\n                {\n                    FVector Location;\n                    FVector ProjFront;\n                    FVector ProjRight;\n                    PlayerController->GetAudioListenerPosition(/*out*/ Location, /*out*/ ProjFront, /*out*/ ProjRight);\n                    FVector ProjUp = FVector::CrossProduct(ProjFront, ProjRight);\n\n                    FTransform ListenerTransform(FRotationMatrix::MakeFromXY(ProjFront, ProjRight));\n                    ListenerTransform.SetTranslation(Location);\n                    ListenerTransform.NormalizeRotation();\n\n                    SetListenerPosition(ListenerIndex, ViewportWorld, ListenerTransform, DeltaSeconds);\n\n                    ListenerIndex++;\n                }\n            }\n        }\n        FinishSetListenerPosition(ListenerIndex, DeltaSeconds);\n    }\n}\n\nbool FFMODStudioModule::HasListenerMoved()\n{\n    return bListenerMoved;\n}\n\nvoid FFMODStudioModule::ResetInterpolation()\n{\n    for (FFMODListener &Listener : Listeners)\n    {\n        Listener = FFMODListener();\n    }\n}\n\nconst FFMODListener &FFMODStudioModule::GetNearestListener(const FVector &Location)\n{\n    float BestDistSq = FLT_MAX;\n    int BestListener = 0;\n    for (int i = 0; i < ListenerCount; ++i)\n    {\n        const float DistSq = FVector::DistSquared(Location, Listeners[i].Transform.GetTranslation());\n        if (DistSq < BestDistSq)\n        {\n            BestListener = i;\n            BestDistSq = DistSq;\n        }\n    }\n    return Listeners[BestListener];\n}\n\n// Partially copied from FAudioDevice::SetListener\nvoid FFMODStudioModule::SetListenerPosition(int ListenerIndex, UWorld *World, const FTransform &ListenerTransform, float DeltaSeconds)\n{\n    FMOD::Studio::System *System = IFMODStudioModule::Get().GetStudioSystem(EFMODSystemContext::Runtime);\n    if (System && ListenerIndex < MAX_LISTENERS)\n    {\n        FVector ListenerPos = ListenerTransform.GetTranslation();\n\n        FInteriorSettings *InteriorSettings =\n            (FInteriorSettings *)alloca(sizeof(FInteriorSettings)); // FinteriorSetting::FInteriorSettings() isn't exposed (possible UE4 bug???)\n        AAudioVolume *Volume = World->GetAudioSettings(ListenerPos, NULL, InteriorSettings);\n\n        Listeners[ListenerIndex].Velocity =\n            DeltaSeconds > 0.f ? (ListenerTransform.GetTranslation() - Listeners[ListenerIndex].Transform.GetTranslation()) / DeltaSeconds :\n                                 FVector::ZeroVector;\n\n        Listeners[ListenerIndex].Transform = ListenerTransform;\n\n        Listeners[ListenerIndex].ApplyInteriorSettings(Volume, *InteriorSettings);\n\n        // We are using a direct copy of the inbuilt transforms but the directions come out wrong.\n        // Several of the audio functions use GetFront() for right, so we do the same here.\n        const FVector Up = Listeners[ListenerIndex].GetUp();\n        const FVector Right = Listeners[ListenerIndex].GetFront();\n        const FVector Forward = Right ^ Up;\n\n        FMOD_3D_ATTRIBUTES Attributes = { { 0 } };\n        Attributes.position = FMODUtils::ConvertWorldVector(ListenerPos);\n        Attributes.forward = FMODUtils::ConvertUnitVector(Forward);\n        Attributes.up = FMODUtils::ConvertUnitVector(Up);\n        Attributes.velocity = FMODUtils::ConvertWorldVector(Listeners[ListenerIndex].Velocity);\n\n#if FMOD_VERSION >= 0x00010600\n        // Expand number of listeners dynamically\n        if (ListenerIndex >= ListenerCount)\n        {\n            Listeners[ListenerIndex] = FFMODListener();\n            ListenerCount = ListenerIndex + 1;\n            verifyfmod(System->setNumListeners(ListenerCount));\n        }\n        verifyfmod(System->setListenerAttributes(ListenerIndex, &Attributes));\n#else\n        verifyfmod(System->setListenerAttributes(&Attributes));\n#endif\n\n        bListenerMoved = true;\n    }\n}\n\nvoid FFMODStudioModule::FinishSetListenerPosition(int NumListeners, float DeltaSeconds)\n{\n    FMOD::Studio::System *System = IFMODStudioModule::Get().GetStudioSystem(EFMODSystemContext::Runtime);\n    if (!System || NumListeners < 1)\n    {\n        return;\n    }\n\n    if (System && NumListeners < ListenerCount)\n    {\n        ListenerCount = NumListeners;\n#if FMOD_VERSION >= 0x00010600\n        verifyfmod(System->setNumListeners(ListenerCount));\n#endif\n    }\n\n    for (int i = 0; i < ListenerCount; ++i)\n    {\n        Listeners[i].UpdateCurrentInteriorSettings();\n    }\n\n    // Apply a reverb snapshot from the listener position(s)\n    AAudioVolume *BestVolume = nullptr;\n    for (int i = 0; i < ListenerCount; ++i)\n    {\n        AAudioVolume *CandidateVolume = Listeners[i].Volume;\n\n        if (BestVolume == nullptr || (IsValid(CandidateVolume) && IsValid(BestVolume) && CandidateVolume->GetPriority() > BestVolume->GetPriority()))\n        {\n            BestVolume = CandidateVolume;\n        }\n    }\n    UFMODSnapshotReverb *NewSnapshot = nullptr;\n\n    if (IsValid(BestVolume) && BestVolume->GetReverbSettings().bApplyReverb)\n    {\n        NewSnapshot = Cast<UFMODSnapshotReverb>(BestVolume->GetReverbSettings().ReverbEffect);\n    }\n\n    if (NewSnapshot != nullptr)\n    {\n        FString NewSnapshotName = FMODUtils::LookupNameFromGuid(System, NewSnapshot->AssetGuid);\n        UE_LOG(LogFMOD, Verbose, TEXT(\"Starting new snapshot '%s'\"), *NewSnapshotName);\n\n        // Try to steal old entry\n        FFMODSnapshotEntry SnapshotEntry;\n        int SnapshotEntryIndex = -1;\n        for (int i = 0; i < ReverbSnapshots.Num(); ++i)\n        {\n            if (ReverbSnapshots[i].Snapshot == NewSnapshot)\n            {\n                UE_LOG(LogFMOD, Verbose, TEXT(\"Re-using old entry with intensity %f\"), ReverbSnapshots[i].CurrentIntensity());\n                SnapshotEntryIndex = i;\n                break;\n            }\n        }\n        // Create new instance\n        if (SnapshotEntryIndex == -1)\n        {\n            UE_LOG(LogFMOD, Verbose, TEXT(\"Creating new instance\"));\n\n            FMOD::Studio::ID Guid = FMODUtils::ConvertGuid(NewSnapshot->AssetGuid);\n            FMOD::Studio::EventInstance *NewInstance = nullptr;\n            FMOD::Studio::EventDescription *EventDesc = nullptr;\n            System->getEventByID(&Guid, &EventDesc);\n            if (EventDesc)\n            {\n                EventDesc->createInstance(&NewInstance);\n                if (NewInstance)\n                {\n                    NewInstance->setParameterValue(\"Intensity\", 0.0f);\n                    NewInstance->start();\n                }\n            }\n\n            SnapshotEntryIndex = ReverbSnapshots.Num();\n            ReverbSnapshots.Push(FFMODSnapshotEntry(NewSnapshot, NewInstance));\n        }\n        // Fade up\n        if (ReverbSnapshots[SnapshotEntryIndex].FadeIntensityEnd == 0.0f)\n        {\n            ReverbSnapshots[SnapshotEntryIndex].FadeTo(BestVolume->GetReverbSettings().Volume, BestVolume->GetReverbSettings().FadeTime);\n        }\n    }\n    // Fade out all other entries\n    for (int i = 0; i < ReverbSnapshots.Num(); ++i)\n    {\n        UE_LOG(LogFMOD, Verbose, TEXT(\"Ramping intensity (%f,%f) -> %f\"), ReverbSnapshots[i].FadeIntensityStart, ReverbSnapshots[i].FadeIntensityEnd,\n            ReverbSnapshots[i].CurrentIntensity());\n        ReverbSnapshots[i].Instance->setParameterValue(\"Intensity\", 100.0f * ReverbSnapshots[i].CurrentIntensity());\n\n        if (ReverbSnapshots[i].Snapshot != NewSnapshot)\n        {\n            // Start fading out if needed\n            if (ReverbSnapshots[i].FadeIntensityEnd != 0.0f)\n            {\n                ReverbSnapshots[i].FadeTo(0.0f, ReverbSnapshots[i].FadeDuration);\n            }\n            // Finish fading out and remove\n            else if (ReverbSnapshots[i].CurrentIntensity() == 0.0f)\n            {\n                UE_LOG(LogFMOD, Verbose, TEXT(\"Removing snapshot\"));\n\n                ReverbSnapshots[i].Instance->stop(FMOD_STUDIO_STOP_ALLOWFADEOUT);\n                ReverbSnapshots[i].Instance->release();\n                ReverbSnapshots.RemoveAt(i);\n                --i; // removed entry, redo current index for next one\n            }\n        }\n    }\n}\n\nvoid FFMODStudioModule::RefreshSettings()\n{\n    AssetTable.Refresh();\n    if (GIsEditor)\n    {\n        const UFMODSettings &Settings = *GetDefault<UFMODSettings>();\n        BankUpdateNotifier.SetFilePath(Settings.GetMasterStringsBankPath());\n    }\n}\n\nvoid FFMODStudioModule::SetInPIE(bool bInPIE, bool simulating)\n{\n    bIsInPIE = bInPIE;\n    bSimulating = simulating;\n    bListenerMoved = true;\n    ResetInterpolation();\n\n    if (GIsEditor)\n    {\n        BankUpdateNotifier.EnableUpdate(!bInPIE);\n    }\n\n    FMOD_DEBUG_FLAGS flags;\n\n    if (bInPIE)\n    {\n        if (StudioSystem[EFMODSystemContext::Auditioning])\n        {\n            // We currently don't tear down auditioning system but we do stop the playing event.\n            if (AuditioningInstance)\n            {\n                AuditioningInstance->stop(FMOD_STUDIO_STOP_IMMEDIATE);\n                AuditioningInstance = nullptr;\n            }\n            // Also make sure banks are finishing loading so they aren't grabbing file handles.\n            StudioSystem[EFMODSystemContext::Auditioning]->flushCommands();\n        }\n\n        // TODO: Stop sounds for the Editor system? What should happen if the user previews a sequence with transport\n        // controls then starts a PIE session? What does happen?\n\n        UE_LOG(LogFMOD, Log, TEXT(\"Creating runtime Studio System\"));\n        ListenerCount = 1;\n        CreateStudioSystem(EFMODSystemContext::Runtime);\n\n        UE_LOG(LogFMOD, Log, TEXT(\"Loading Banks\"));\n        LoadBanks(EFMODSystemContext::Runtime);\n\n        const UFMODSettings &Settings = *GetDefault<UFMODSettings>();\n        flags = Settings.LoggingLevel;\n    }\n    else\n    {\n        ReverbSnapshots.Reset();\n        DestroyStudioSystem(EFMODSystemContext::Runtime);\n        flags = FMOD_DEBUG_LEVEL_WARNING;\n    }\n\n    verifyfmod(FMOD::Debug_Initialize(flags, FMOD_DEBUG_MODE_CALLBACK, FMODLogCallback));\n\n}\n\nUFMODAsset *FFMODStudioModule::FindAssetByName(const FString &Name)\n{\n    return AssetTable.FindByName(Name);\n}\n\nUFMODEvent *FFMODStudioModule::FindEventByName(const FString &Name)\n{\n    UFMODAsset *Asset = AssetTable.FindByName(Name);\n    return Cast<UFMODEvent>(Asset);\n}\n\nvoid FFMODStudioModule::SetSystemPaused(bool paused)\n{\n    if (StudioSystem[EFMODSystemContext::Runtime])\n    {\n        if (bMixerPaused != paused)\n        {\n            FMOD::System *LowLevelSystem = nullptr;\n            verifyfmod(StudioSystem[EFMODSystemContext::Runtime]->getLowLevelSystem(&LowLevelSystem));\n\n            // Resume mixer before making calls for Android in particular\n            if (!paused)\n            {\n                LowLevelSystem->mixerResume();\n            }\n\n            FMOD::ChannelGroup *MasterChannelGroup = nullptr;\n            verifyfmod(LowLevelSystem->getMasterChannelGroup(&MasterChannelGroup));\n            verifyfmod(MasterChannelGroup->setPaused(paused));\n\n            if (paused)\n            {\n                LowLevelSystem->mixerSuspend();\n            }\n        }\n\n        bMixerPaused = paused;\n    }\n}\n\nvoid FFMODStudioModule::PostLoadCallback()\n{\n}\n\nvoid FFMODStudioModule::ShutdownModule()\n{\n    UE_LOG(LogFMOD, Verbose, TEXT(\"FFMODStudioModule shutdown\"));\n\n    DestroyStudioSystem(EFMODSystemContext::Auditioning);\n    DestroyStudioSystem(EFMODSystemContext::Runtime);\n    DestroyStudioSystem(EFMODSystemContext::Editor);\n\n    ReleaseFMODFileSystem();\n\n    if (MemPool)\n        FMemory::Free(MemPool);\n\n    if (GIsEditor)\n    {\n        BankUpdateNotifier.BanksUpdatedEvent.RemoveAll(this);\n    }\n\n    if (UObjectInitialized())\n    {\n        // Unregister tick function.\n        FTicker::GetCoreTicker().RemoveTicker(TickDelegateHandle);\n    }\n\n    UE_LOG(LogFMOD, Verbose, TEXT(\"FFMODStudioModule unloading dynamic libraries\"));\n    if (StudioLibHandle)\n    {\n        FPlatformProcess::FreeDllHandle(StudioLibHandle);\n        StudioLibHandle = nullptr;\n    }\n    if (LowLevelLibHandle)\n    {\n        FPlatformProcess::FreeDllHandle(LowLevelLibHandle);\n        LowLevelLibHandle = nullptr;\n    }\n    UE_LOG(LogFMOD, Verbose, TEXT(\"FFMODStudioModule finished unloading\"));\n}\n\nstruct NamedBankEntry\n{\n    NamedBankEntry()\n        : Bank(nullptr)\n    {\n    }\n    NamedBankEntry(const FString &InName, FMOD::Studio::Bank *InBank, FMOD_RESULT InResult)\n        : Name(InName)\n        , Bank(InBank)\n        , Result(InResult)\n    {\n    }\n\n    FString Name;\n    FMOD::Studio::Bank *Bank;\n    FMOD_RESULT Result;\n};\n\nbool FFMODStudioModule::AreBanksLoaded()\n{\n    return bBanksLoaded;\n}\n\nvoid FFMODStudioModule::LoadBanks(EFMODSystemContext::Type Type)\n{\n    const UFMODSettings &Settings = *GetDefault<UFMODSettings>();\n\n    FailedBankLoads[Type].Reset();\n    if (Type == EFMODSystemContext::Auditioning || Type == EFMODSystemContext::Editor)\n    {\n        RequiredPlugins.Reset();\n    }\n\n    if (StudioSystem[Type] != nullptr && Settings.IsBankPathSet())\n    {\n        UE_LOG(LogFMOD, Verbose, TEXT(\"LoadBanks for context %s\"), FMODSystemContextNames[Type]);\n\n        /*\n\t\t\tQueue up all banks to load asynchronously then wait at the end.\n\t\t*/\n        bool bLoadAllBanks = ((Type == EFMODSystemContext::Auditioning) || (Type == EFMODSystemContext::Editor) || Settings.bLoadAllBanks);\n        bool bLoadSampleData = ((Type == EFMODSystemContext::Runtime) && Settings.bLoadAllSampleData);\n        bool bLockAllBuses = ((Type == EFMODSystemContext::Runtime) && Settings.bLockAllBuses);\n        FMOD_STUDIO_LOAD_BANK_FLAGS BankFlags = (bLockAllBuses ? FMOD_STUDIO_LOAD_BANK_NORMAL : FMOD_STUDIO_LOAD_BANK_NONBLOCKING);\n\n        // Always load the master bank at startup\n        FString MasterBankPath = Settings.GetMasterBankPath();\n        UE_LOG(LogFMOD, Verbose, TEXT(\"Loading master bank: %s\"), *MasterBankPath);\n\n        TArray<NamedBankEntry> BankEntries;\n\n        FMOD::Studio::Bank *MasterBank = nullptr;\n        FMOD_RESULT Result;\n        Result = StudioSystem[Type]->loadBankFile(TCHAR_TO_UTF8(*MasterBankPath), BankFlags, &MasterBank);\n        BankEntries.Add(NamedBankEntry(MasterBankPath, MasterBank, Result));\n\n        if (Result == FMOD_OK)\n        {\n            FMOD::Studio::Bank *MasterAssetsBank = nullptr;\n            FString MasterAssetsBankPath = Settings.GetMasterAssetsBankPath();\n            if (FPaths::FileExists(MasterAssetsBankPath))\n            {\n                Result = StudioSystem[Type]->loadBankFile(TCHAR_TO_UTF8(*MasterAssetsBankPath), BankFlags, &MasterAssetsBank);\n                BankEntries.Add(NamedBankEntry(MasterAssetsBankPath, MasterAssetsBank, Result));\n            }\n        }\n\n        if (Result == FMOD_OK)\n        {\n            // Auditioning needs string bank to get back full paths from events\n            // Runtime could do without it, but if we load it we can look up guids to names which is helpful\n            {\n                FString StringsBankPath = Settings.GetMasterStringsBankPath();\n                UE_LOG(LogFMOD, Verbose, TEXT(\"Loading strings bank: %s\"), *StringsBankPath);\n                FMOD::Studio::Bank *StringsBank = nullptr;\n                Result = StudioSystem[Type]->loadBankFile(TCHAR_TO_UTF8(*StringsBankPath), BankFlags, &StringsBank);\n                BankEntries.Add(NamedBankEntry(StringsBankPath, StringsBank, Result));\n            }\n\n            // Optionally load all banks in the directory\n            if (bLoadAllBanks)\n            {\n                UE_LOG(LogFMOD, Verbose, TEXT(\"Loading all banks\"));\n                TArray<FString> BankFiles;\n                Settings.GetAllBankPaths(BankFiles);\n                for (const FString &OtherFile : BankFiles)\n                {\n                    if (Settings.SkipLoadBankName.Len() && OtherFile.Contains(Settings.SkipLoadBankName))\n                    {\n                        UE_LOG(LogFMOD, Log, TEXT(\"Skipping bank: %s\"), *OtherFile);\n                        continue;\n                    }\n                    UE_LOG(LogFMOD, Log, TEXT(\"Loading bank: %s\"), *OtherFile);\n\n                    FMOD::Studio::Bank *OtherBank;\n                    Result = StudioSystem[Type]->loadBankFile(TCHAR_TO_UTF8(*OtherFile), BankFlags, &OtherBank);\n                    BankEntries.Add(NamedBankEntry(OtherFile, OtherBank, Result));\n                }\n            }\n\n            // Optionally lock all buses to make sure they are created\n            if (Settings.bLockAllBuses)\n            {\n                UE_LOG(LogFMOD, Verbose, TEXT(\"Locking all buses\"));\n                int BusCount = 0;\n                verifyfmod(MasterBank->getBusCount(&BusCount));\n                if (BusCount != 0)\n                {\n                    TArray<FMOD::Studio::Bus *> BusList;\n                    BusList.AddZeroed(BusCount);\n                    verifyfmod(MasterBank->getBusList(BusList.GetData(), BusCount, &BusCount));\n                    BusList.SetNum(BusCount);\n                    for (int BusIdx = 0; BusIdx < BusCount; ++BusIdx)\n                    {\n                        verifyfmod(BusList[BusIdx]->lockChannelGroup());\n                    }\n                }\n            }\n        }\n\n        // Wait for all banks to load.\n        StudioSystem[Type]->flushCommands();\n\n        for (NamedBankEntry &Entry : BankEntries)\n        {\n            if (Entry.Result == FMOD_OK)\n            {\n                FMOD_STUDIO_LOADING_STATE BankLoadingState = FMOD_STUDIO_LOADING_STATE_ERROR;\n                Entry.Result = Entry.Bank->getLoadingState(&BankLoadingState);\n                if (BankLoadingState == FMOD_STUDIO_LOADING_STATE_ERROR)\n                {\n                    Entry.Bank->unload();\n                    Entry.Bank = nullptr;\n                }\n                else if (bLoadSampleData)\n                {\n                    verifyfmod(Entry.Bank->loadSampleData());\n                }\n            }\n            if (Entry.Bank == nullptr || Entry.Result != FMOD_OK)\n            {\n                FString ErrorMessage;\n                if (!FPaths::FileExists(Entry.Name))\n                {\n                    ErrorMessage = \"File does not exist\";\n                }\n                else\n                {\n                    ErrorMessage = UTF8_TO_TCHAR(FMOD_ErrorString(Entry.Result));\n                }\n                UE_LOG(LogFMOD, Warning, TEXT(\"Failed to bank: %s (%s)\"), *Entry.Name, *ErrorMessage);\n                FailedBankLoads[Type].Add(FString::Printf(TEXT(\"%s (%s)\"), *FPaths::GetBaseFilename(Entry.Name), *ErrorMessage));\n            }\n        }\n    }\n\n    bBanksLoaded = true;\n}\n\nvoid FFMODStudioModule::HandleBanksUpdated()\n{\n    UE_LOG(LogFMOD, Verbose, TEXT(\"Refreshing auditioning system\"));\n\n    DestroyStudioSystem(EFMODSystemContext::Auditioning);\n\n    AssetTable.Refresh();\n\n    CreateStudioSystem(EFMODSystemContext::Auditioning);\n    LoadBanks(EFMODSystemContext::Auditioning);\n\n    DestroyStudioSystem(EFMODSystemContext::Editor);\n    CreateStudioSystem(EFMODSystemContext::Editor);\n    LoadBanks(EFMODSystemContext::Editor);\n\n    BanksReloadedDelegate.Broadcast();\n}\n\nFMOD::Studio::System *FFMODStudioModule::GetStudioSystem(EFMODSystemContext::Type Context)\n{\n    if (Context == EFMODSystemContext::Max)\n    {\n        Context = (bIsInPIE ? EFMODSystemContext::Runtime : EFMODSystemContext::Auditioning);\n    }\n    return StudioSystem[Context];\n}\n\nFMOD::Studio::EventDescription *FFMODStudioModule::GetEventDescription(const UFMODEvent *Event, EFMODSystemContext::Type Context)\n{\n    if (Context == EFMODSystemContext::Max)\n    {\n        Context = (bIsInPIE ? EFMODSystemContext::Runtime : EFMODSystemContext::Auditioning);\n    }\n    if (StudioSystem[Context] != nullptr && IsValid(Event) && Event->AssetGuid.IsValid())\n    {\n        FMOD::Studio::ID Guid = FMODUtils::ConvertGuid(Event->AssetGuid);\n        FMOD::Studio::EventDescription *EventDesc = nullptr;\n        StudioSystem[Context]->getEventByID(&Guid, &EventDesc);\n        return EventDesc;\n    }\n    return nullptr;\n}\n\nFMOD::Studio::EventInstance *FFMODStudioModule::CreateAuditioningInstance(const UFMODEvent *Event)\n{\n    StopAuditioningInstance();\n    if (IsValid(Event))\n    {\n        FMOD::Studio::EventDescription *EventDesc = GetEventDescription(Event, EFMODSystemContext::Auditioning);\n        if (EventDesc)\n        {\n            FMOD_RESULT Result = EventDesc->createInstance(&AuditioningInstance);\n            if (Result == FMOD_OK)\n            {\n                return AuditioningInstance;\n            }\n        }\n    }\n    return nullptr;\n}\n\nvoid FFMODStudioModule::StopAuditioningInstance()\n{\n    if (AuditioningInstance)\n    {\n        // Don't bother checking for errors just in case auditioning is already shutting down\n        AuditioningInstance->stop(FMOD_STUDIO_STOP_ALLOWFADEOUT);\n        AuditioningInstance->release();\n        AuditioningInstance = nullptr;\n    }\n}\n\n#undef LOCTEXT_NAMESPACE\n"
  },
  {
    "path": "Plugins/FMODStudio/Source/FMODStudio/Private/FMODStudioPrivatePCH.h",
    "content": "// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2020.\n#pragma once\n\n#include \"CoreMinimal.h\"\n#include \"UObject/NoExportTypes.h\"\n#include \"Components/SceneComponent.h\"\n#include \"Runtime/Launch/Resources/Version.h\"\n#if WITH_EDITOR\n//#include \"UnrealEd.h\"\n#endif\nDECLARE_LOG_CATEGORY_EXTERN(LogFMOD, Log, All);\n"
  },
  {
    "path": "Plugins/FMODStudio/Source/FMODStudio/Private/FMODVCA.cpp",
    "content": "// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2020.\n\n#include \"FMODVCA.h\"\n#include \"FMODStudioModule.h\"\n\nUFMODVCA::UFMODVCA(const FObjectInitializer &ObjectInitializer)\n    : Super(ObjectInitializer)\n{\n}\n\n/** Get tags to show in content view */\nvoid UFMODVCA::GetAssetRegistryTags(TArray<FAssetRegistryTag> &OutTags) const\n{\n    Super::GetAssetRegistryTags(OutTags);\n}\n\nFString UFMODVCA::GetDesc()\n{\n    return FString::Printf(TEXT(\"VCA %s\"), *AssetGuid.ToString(EGuidFormats::DigitsWithHyphensInBraces));\n}\n"
  },
  {
    "path": "Plugins/FMODStudio/Source/FMODStudio/Private/Sequencer/FMODEventControlSection.cpp",
    "content": "// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2020.\n\n#include \"FMODEventControlSection.h\"\n#include \"FMODEventControlSectionTemplate.h\"\n#include \"Channels/MovieSceneChannelProxy.h\"\n#include \"UObject/SequencerObjectVersion.h\"\n#include \"UObject/Package.h\"\n\nFFMODEventControlChannel::FFMODEventControlChannel()\n{\n    SetEnum(FindObject<UEnum>(ANY_PACKAGE, TEXT(\"EFMODEventControlKey\")));\n}\n\nUFMODEventControlSection::UFMODEventControlSection(const FObjectInitializer &ObjectInitializer)\n    : Super(ObjectInitializer)\n{\n    SetRange(TRange<FFrameNumber>::All());\n\n    int32 LinkerCustomVersion = GetLinkerCustomVersion(FSequencerObjectVersion::GUID);\n    EMovieSceneCompletionMode CompletionMode;\n\n    if (LinkerCustomVersion < FSequencerObjectVersion::WhenFinishedDefaultsToRestoreState)\n    {\n        CompletionMode = EMovieSceneCompletionMode::KeepState;\n    }\n    else if (LinkerCustomVersion < FSequencerObjectVersion::WhenFinishedDefaultsToProjectDefault)\n    {\n        CompletionMode = EMovieSceneCompletionMode::RestoreState;\n    }\n    else\n    {\n        CompletionMode = EMovieSceneCompletionMode::ProjectDefault;\n    }\n\n#if WITH_EDITOR\n\n    ChannelProxy = MakeShared<FMovieSceneChannelProxy>(ControlKeys, FMovieSceneChannelMetaData(), TMovieSceneExternalValue<uint8>());\n\n#else\n\n    ChannelProxy = MakeShared<FMovieSceneChannelProxy>(ControlKeys);\n\n#endif\n}\n\nFMovieSceneEvalTemplatePtr UFMODEventControlSection::GenerateTemplate() const\n{\n    return FFMODEventControlSectionTemplate(*this);\n}\n"
  },
  {
    "path": "Plugins/FMODStudio/Source/FMODStudio/Private/Sequencer/FMODEventControlSection.h",
    "content": "// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2020.\n\n#pragma once\n\n#include \"CoreMinimal.h\"\n#include \"UObject/ObjectMacros.h\"\n#include \"Curves/KeyHandle.h\"\n#include \"MovieSceneClipboard.h\"\n#include \"MovieSceneSection.h\"\n#include \"Channels/MovieSceneByteChannel.h\"\n#include \"FMODEventControlSection.generated.h\"\n\n/** Defines the types of FMOD event control keys. */\nUENUM()\nenum class EFMODEventControlKey : uint8\n{\n    Stop = 0,\n    Play = 1\n};\n\nUSTRUCT()\nstruct FFMODEventControlChannel : public FMovieSceneByteChannel\n{\n    GENERATED_BODY()\n\n    FFMODEventControlChannel();\n};\n\ntemplate <>\nstruct TStructOpsTypeTraits<FFMODEventControlChannel> : public TStructOpsTypeTraitsBase2<FFMODEventControlChannel>\n{\n    enum\n    {\n        WithStructuredSerializeFromMismatchedTag = true\n    };\n};\n\ntemplate <>\nstruct TMovieSceneChannelTraits<FFMODEventControlChannel> : TMovieSceneChannelTraitsBase<FFMODEventControlChannel>\n{\n    enum\n    {\n        SupportsDefaults = false\n    };\n\n#if WITH_EDITOR\n\n    /** Byte channels can have external values (ie, they can get their values from external objects for UI purposes) */\n    typedef TMovieSceneExternalValue<uint8> ExtendedEditorDataType;\n\n#endif\n};\n\n/** FMOD Event control section */\nUCLASS(MinimalAPI)\nclass UFMODEventControlSection : public UMovieSceneSection\n{\n    GENERATED_UCLASS_BODY()\n\npublic:\n    /** Channel containing the event control keys */\n    UPROPERTY()\n    FFMODEventControlChannel ControlKeys;\n\nprotected:\n    //~ UMovieSceneSection interface\n    virtual FMovieSceneEvalTemplatePtr GenerateTemplate() const override;\n};\n\ninline void AssignValue(FFMODEventControlChannel *InChannel, FKeyHandle InKeyHandle, EFMODEventControlKey InValue)\n{\n    TMovieSceneChannelData<uint8> ChannelData = InChannel->GetData();\n    int32 ValueIndex = ChannelData.GetIndex(InKeyHandle);\n\n    if (ValueIndex != INDEX_NONE)\n    {\n        ChannelData.GetValues()[ValueIndex] = (uint8)InValue;\n    }\n}\n\ninline bool EvaluateChannel(const FFMODEventControlChannel *InChannel, FFrameTime InTime, EFMODEventControlKey &OutValue)\n{\n    uint8 RawValue = 0;\n    if (InChannel->Evaluate(InTime, RawValue))\n    {\n        OutValue = (EFMODEventControlKey)RawValue;\n        return true;\n    }\n    return false;\n}\n"
  },
  {
    "path": "Plugins/FMODStudio/Source/FMODStudio/Private/Sequencer/FMODEventControlSectionTemplate.cpp",
    "content": "// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2020.\n\n#include \"FMODEventControlSectionTemplate.h\"\n#include \"FMODAmbientSound.h\"\n#include \"FMODAudioComponent.h\"\n#include \"Evaluation/MovieSceneEvaluation.h\"\n#include \"IMovieScenePlayer.h\"\n\nstruct FPlayingToken : IMovieScenePreAnimatedToken\n{\n    FPlayingToken(UObject &InObject)\n    {\n        bPlaying = false;\n\n        if (UFMODAudioComponent *AudioComponent = Cast<UFMODAudioComponent>(&InObject))\n        {\n            if (IsValid(AudioComponent))\n            {\n                bPlaying = AudioComponent->IsPlaying();\n            }\n        }\n    }\n\n    virtual void RestoreState(UObject &Object, IMovieScenePlayer &Player) override\n    {\n        UFMODAudioComponent *AudioComponent = CastChecked<UFMODAudioComponent>(&Object);\n\n        if (AudioComponent)\n        {\n            if (bPlaying)\n            {\n                AudioComponent->Play();\n            }\n            else\n            {\n                AudioComponent->Stop();\n            }\n        }\n    }\n\nprivate:\n    bool bPlaying;\n};\n\nstruct FPlayingTokenProducer : IMovieScenePreAnimatedTokenProducer\n{\n    static FMovieSceneAnimTypeID GetAnimTypeID() { return TMovieSceneAnimTypeID<FPlayingTokenProducer>(); }\n\nprivate:\n    virtual IMovieScenePreAnimatedTokenPtr CacheExistingState(UObject &Object) const override { return FPlayingToken(Object); }\n};\n\nstruct FFMODEventKeyState : IPersistentEvaluationData\n{\n    FKeyHandle LastKeyHandle;\n    FKeyHandle InvalidKeyHandle;\n};\n\nstruct FFMODEventControlExecutionToken : IMovieSceneExecutionToken\n{\n    FFMODEventControlExecutionToken(EFMODEventControlKey InEventControlKey, FFrameTime InKeyTime)\n        : EventControlKey(InEventControlKey)\n        , KeyTime(InKeyTime)\n    {\n    }\n\n    /** Execute this token, operating on all objects referenced by 'Operand' */\n    virtual void Execute(const FMovieSceneContext &Context, const FMovieSceneEvaluationOperand &Operand, FPersistentEvaluationData &PersistentData,\n        IMovieScenePlayer &Player)\n    {\n        for (TWeakObjectPtr<> &WeakObject : Player.FindBoundObjects(Operand))\n        {\n            UFMODAudioComponent *AudioComponent = Cast<UFMODAudioComponent>(WeakObject.Get());\n\n            if (!AudioComponent)\n            {\n                AFMODAmbientSound *AmbientSound = Cast<AFMODAmbientSound>(WeakObject.Get());\n                AudioComponent = AmbientSound ? AmbientSound->AudioComponent : nullptr;\n            }\n\n            if (IsValid(AudioComponent))\n            {\n                Player.SavePreAnimatedState(*AudioComponent, FPlayingTokenProducer::GetAnimTypeID(), FPlayingTokenProducer());\n\n                if (EventControlKey == EFMODEventControlKey::Play)\n                {\n                    if (AudioComponent->IsPlaying())\n                    {\n                        AudioComponent->Stop();\n                    }\n\n                    EFMODSystemContext::Type SystemContext =\n                        (GWorld && GWorld->WorldType == EWorldType::Editor) ? EFMODSystemContext::Editor : EFMODSystemContext::Runtime;\n                    AudioComponent->PlayInternal(SystemContext);\n                }\n                else if (EventControlKey == EFMODEventControlKey::Stop)\n                {\n                    AudioComponent->Stop();\n                }\n            }\n        }\n    }\n\n    EFMODEventControlKey EventControlKey;\n    FFrameTime KeyTime;\n};\n\nFFMODEventControlSectionTemplate::FFMODEventControlSectionTemplate(const UFMODEventControlSection &Section)\n    : ControlKeys(Section.ControlKeys)\n{\n}\n\nvoid FFMODEventControlSectionTemplate::Evaluate(const FMovieSceneEvaluationOperand &Operand, const FMovieSceneContext &Context,\n    const FPersistentEvaluationData &PersistentData, FMovieSceneExecutionTokens &ExecutionTokens) const\n{\n    const bool bPlaying = Context.IsSilent() == false && Context.GetDirection() == EPlayDirection::Forwards &&\n                          Context.GetRange().Size<FFrameTime>() >= FFrameTime(0) && Context.GetStatus() == EMovieScenePlayerStatus::Playing;\n\n    if (!bPlaying)\n    {\n        ExecutionTokens.Add(FFMODEventControlExecutionToken(EFMODEventControlKey::Stop, FFrameTime(0)));\n    }\n    else\n    {\n        TRange<FFrameNumber> PlaybackRange = Context.GetFrameNumberRange();\n        TMovieSceneChannelData<const uint8> ChannelData = ControlKeys.GetData();\n\n        // Find the index of the key handle that exists before this time\n        TArrayView<const FFrameNumber> Times = ChannelData.GetTimes();\n        TArrayView<const uint8> Values = ChannelData.GetValues();\n\n        const int32 LastKeyIndex = Algo::UpperBound(Times, PlaybackRange.GetUpperBoundValue()) - 1;\n        if (LastKeyIndex >= 0 && PlaybackRange.Contains(Times[LastKeyIndex]))\n        {\n            FFMODEventControlExecutionToken NewToken((EFMODEventControlKey)Values[LastKeyIndex], Times[LastKeyIndex]);\n            ExecutionTokens.Add(MoveTemp(NewToken));\n        }\n    }\n}\n"
  },
  {
    "path": "Plugins/FMODStudio/Source/FMODStudio/Private/Sequencer/FMODEventControlSectionTemplate.h",
    "content": "// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2020.\n\n#pragma once\n\n#include \"CoreMinimal.h\"\n#include \"UObject/ObjectMacros.h\"\n#include \"Evaluation/MovieSceneEvalTemplate.h\"\n#include \"FMODEventControlSection.h\"\n#include \"FMODEventControlSectionTemplate.generated.h\"\n\nUSTRUCT()\nstruct FFMODEventControlSectionTemplate : public FMovieSceneEvalTemplate\n{\n    GENERATED_BODY()\n\n    FFMODEventControlSectionTemplate() {}\n    FFMODEventControlSectionTemplate(const UFMODEventControlSection &Section);\n\n    UPROPERTY()\n    FFMODEventControlChannel ControlKeys;\n\nprivate:\n    virtual UScriptStruct &GetScriptStructImpl() const override { return *StaticStruct(); }\n    virtual void Evaluate(const FMovieSceneEvaluationOperand &Operand, const FMovieSceneContext &Context,\n        const FPersistentEvaluationData &PersistentData, FMovieSceneExecutionTokens &ExecutionTokens) const override;\n};\n"
  },
  {
    "path": "Plugins/FMODStudio/Source/FMODStudio/Private/Sequencer/FMODEventControlTrack.cpp",
    "content": "// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2020.\n\n#include \"FMODEventControlTrack.h\"\n#include \"FMODEventControlSection.h\"\n#include \"IMovieScenePlayer.h\"\n#include \"FMODEventControlSectionTemplate.h\"\n#include \"MovieSceneCommonHelpers.h\"\n\n#define LOCTEXT_NAMESPACE \"FMODEventControlTrack\"\n\nUFMODEventControlTrack::UFMODEventControlTrack(const FObjectInitializer &ObjectInitializer)\n    : Super(ObjectInitializer)\n{\n#if WITH_EDITORONLY_DATA\n    TrackTint = FColor(255, 255, 255, 160);\n#endif\n}\n\nconst TArray<UMovieSceneSection *> &UFMODEventControlTrack::GetAllSections() const\n{\n    return ControlSections;\n}\n\nvoid UFMODEventControlTrack::RemoveAllAnimationData()\n{\n    // do nothing\n}\n\nbool UFMODEventControlTrack::HasSection(const UMovieSceneSection &Section) const\n{\n    return ControlSections.Contains(&Section);\n}\n\nvoid UFMODEventControlTrack::AddSection(UMovieSceneSection &Section)\n{\n    ControlSections.Add(&Section);\n}\n\nvoid UFMODEventControlTrack::RemoveSection(UMovieSceneSection &Section)\n{\n    ControlSections.Remove(&Section);\n}\n\nbool UFMODEventControlTrack::IsEmpty() const\n{\n    return ControlSections.Num() == 0;\n}\n\nvoid UFMODEventControlTrack::AddNewSection(FFrameNumber SectionTime)\n{\n    if (MovieSceneHelpers::FindSectionAtTime(ControlSections, SectionTime) == nullptr)\n    {\n        UFMODEventControlSection *NewSection = Cast<UFMODEventControlSection>(CreateNewSection());\n        ControlSections.Add(NewSection);\n    }\n}\n\nUMovieSceneSection *UFMODEventControlTrack::CreateNewSection()\n{\n    return NewObject<UFMODEventControlSection>(this);\n}\n\n#if WITH_EDITORONLY_DATA\nFText UFMODEventControlTrack::GetDefaultDisplayName() const\n{\n    return LOCTEXT(\"DisplayName\", \"FMOD Event\");\n}\n#endif\n\n#undef LOCTEXT_NAMESPACE\n"
  },
  {
    "path": "Plugins/FMODStudio/Source/FMODStudio/Private/Sequencer/FMODEventControlTrack.h",
    "content": "// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2020.\n\n#pragma once\n\n#include \"CoreMinimal.h\"\n#include \"UObject/ObjectMacros.h\"\n#include \"MovieSceneNameableTrack.h\"\n#include \"FMODEventControlTrack.generated.h\"\n\n/** Handles control of an FMOD Event */\nUCLASS(MinimalAPI)\nclass UFMODEventControlTrack : public UMovieSceneNameableTrack\n{\n    GENERATED_UCLASS_BODY()\n\npublic:\n    virtual TArray<UMovieSceneSection *> GetAllControlSections() const { return ControlSections; }\n\npublic:\n    // Begin UMovieSceneTrack interface\n    virtual void RemoveAllAnimationData() override;\n    virtual bool HasSection(const UMovieSceneSection &Section) const override;\n    virtual void AddSection(UMovieSceneSection &Section) override;\n    virtual void RemoveSection(UMovieSceneSection &Section) override;\n    virtual bool IsEmpty() const override;\n    virtual const TArray<UMovieSceneSection *> &GetAllSections() const override;\n    virtual void AddNewSection(FFrameNumber SectionTime);\n    virtual UMovieSceneSection *CreateNewSection() override;\n// End UMovieSceneTrack interface\n\n#if WITH_EDITORONLY_DATA\n    virtual FText GetDefaultDisplayName() const override;\n#endif\n\nprivate:\n    /** List of all event control sections. */\n    UPROPERTY()\n    TArray<UMovieSceneSection *> ControlSections;\n};\n"
  },
  {
    "path": "Plugins/FMODStudio/Source/FMODStudio/Private/Sequencer/FMODEventParameterSectionTemplate.cpp",
    "content": "// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2017.\n\n#include \"FMODEventParameterSectionTemplate.h\"\n#include \"FMODAmbientSound.h\"\n#include \"FMODEvent.h\"\n#include \"FMODEventParameterTrack.h\"\n#include \"IMovieScenePlayer.h\"\n#include \"fmod_studio.hpp\"\n\nstruct FFMODEventParameterPreAnimatedToken : IMovieScenePreAnimatedToken\n{\n    FFMODEventParameterPreAnimatedToken() {}\n\n    FFMODEventParameterPreAnimatedToken(FFMODEventParameterPreAnimatedToken &&) = default;\n    FFMODEventParameterPreAnimatedToken &operator=(FFMODEventParameterPreAnimatedToken &&) = default;\n\n    virtual void RestoreState(UObject &Object, IMovieScenePlayer &Player) override\n    {\n        UFMODAudioComponent *AudioComponent = CastChecked<UFMODAudioComponent>(&Object);\n\n        if (IsValid(AudioComponent))\n        {\n            for (FScalarParameterNameAndValue &Value : Values)\n            {\n                AudioComponent->SetParameter(Value.ParameterName, Value.Value);\n            }\n        }\n    }\n\n    TArray<FScalarParameterNameAndValue> Values;\n};\n\nstruct FFMODEventParameterPreAnimatedTokenProducer : IMovieScenePreAnimatedTokenProducer\n{\n    virtual IMovieScenePreAnimatedTokenPtr CacheExistingState(UObject &Object) const override\n    {\n        UFMODAudioComponent *AudioComponent = CastChecked<UFMODAudioComponent>(&Object);\n\n        FFMODEventParameterPreAnimatedToken Token;\n\n        if (IsValid(AudioComponent) && AudioComponent->Event)\n        {\n            TArray<FMOD_STUDIO_PARAMETER_DESCRIPTION> ParameterDescriptions;\n            AudioComponent->Event->GetParameterDescriptions(ParameterDescriptions);\n\n            for (const FMOD_STUDIO_PARAMETER_DESCRIPTION &ParameterDescription : ParameterDescriptions)\n            {\n                float Value = AudioComponent->GetParameter(ParameterDescription.name);\n                Token.Values.Add(FScalarParameterNameAndValue(ParameterDescription.name, Value));\n            }\n        }\n\n        return MoveTemp(Token);\n    }\n};\n\nstruct FFMODEventParameterExecutionToken : IMovieSceneExecutionToken\n{\n    FFMODEventParameterExecutionToken() = default;\n\n    FFMODEventParameterExecutionToken(FFMODEventParameterExecutionToken &&) = default;\n    FFMODEventParameterExecutionToken &operator=(FFMODEventParameterExecutionToken &&) = default;\n\n    // Non-copyable\n    FFMODEventParameterExecutionToken(const FFMODEventParameterExecutionToken &) = delete;\n    FFMODEventParameterExecutionToken &operator=(const FFMODEventParameterExecutionToken &) = delete;\n\n    virtual void Execute(const FMovieSceneContext &Context, const FMovieSceneEvaluationOperand &Operand, FPersistentEvaluationData &PersistentData,\n        IMovieScenePlayer &Player)\n    {\n        for (TWeakObjectPtr<> &WeakObject : Player.FindBoundObjects(Operand))\n        {\n            UFMODAudioComponent *AudioComponent = Cast<UFMODAudioComponent>(WeakObject.Get());\n\n            if (!AudioComponent)\n            {\n                AFMODAmbientSound *AmbientSound = Cast<AFMODAmbientSound>(WeakObject.Get());\n                AudioComponent = AmbientSound ? AmbientSound->AudioComponent : nullptr;\n            }\n\n            if (IsValid(AudioComponent))\n            {\n                Player.SavePreAnimatedState(\n                    *AudioComponent, TMovieSceneAnimTypeID<FFMODEventParameterExecutionToken>(), FFMODEventParameterPreAnimatedTokenProducer());\n\n                for (const FScalarParameterNameAndValue &NameAndValue : Values.ScalarValues)\n                {\n                    AudioComponent->SetParameter(NameAndValue.ParameterName, NameAndValue.Value);\n                }\n            }\n        }\n    }\n\n    FEvaluatedParameterSectionValues Values;\n};\n\nFFMODEventParameterSectionTemplate::FFMODEventParameterSectionTemplate(\n    const UMovieSceneParameterSection &Section, const UFMODEventParameterTrack &Track)\n    : FMovieSceneParameterSectionTemplate(Section)\n{\n}\n\nvoid FFMODEventParameterSectionTemplate::Evaluate(const FMovieSceneEvaluationOperand &Operand, const FMovieSceneContext &Context,\n    const FPersistentEvaluationData &PersistentData, FMovieSceneExecutionTokens &ExecutionTokens) const\n{\n    FFMODEventParameterExecutionToken ExecutionToken;\n    EvaluateCurves(Context, ExecutionToken.Values);\n    ExecutionTokens.Add(MoveTemp(ExecutionToken));\n}\n"
  },
  {
    "path": "Plugins/FMODStudio/Source/FMODStudio/Private/Sequencer/FMODEventParameterSectionTemplate.h",
    "content": "// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2020.\n\n#pragma once\n\n#include \"CoreMinimal.h\"\n#include \"UObject/ObjectMacros.h\"\n#include \"Evaluation/MovieSceneParameterTemplate.h\"\n#include \"FMODEventParameterSectionTemplate.generated.h\"\n\nclass UFMODEventParameterTrack;\n\nUSTRUCT()\nstruct FFMODEventParameterSectionTemplate : public FMovieSceneParameterSectionTemplate\n{\n    GENERATED_BODY()\n\n    FFMODEventParameterSectionTemplate() {}\n    FFMODEventParameterSectionTemplate(const UMovieSceneParameterSection &Section, const UFMODEventParameterTrack &Track);\n\nprivate:\n    virtual UScriptStruct &GetScriptStructImpl() const override { return *StaticStruct(); }\n    virtual void Evaluate(const FMovieSceneEvaluationOperand &Operand, const FMovieSceneContext &Context,\n        const FPersistentEvaluationData &PersistentData, FMovieSceneExecutionTokens &ExecutionTokens) const override;\n};\n"
  },
  {
    "path": "Plugins/FMODStudio/Source/FMODStudio/Private/Sequencer/FMODEventParameterTrack.cpp",
    "content": "// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2020.\n\n#include \"FMODEventParameterTrack.h\"\n#include \"FMODEventParameterSectionTemplate.h\"\n#include \"IMovieScenePlayer.h\"\n#include \"MovieSceneCommonHelpers.h\"\n\n#define LOCTEXT_NAMESPACE \"FMODEventParameterTrack\"\n\nUFMODEventParameterTrack::UFMODEventParameterTrack(const FObjectInitializer &ObjectInitializer)\n    : Super(ObjectInitializer)\n{\n#if WITH_EDITORONLY_DATA\n    TrackTint = FColor(0, 170, 255, 65);\n#endif\n}\n\nFMovieSceneEvalTemplatePtr UFMODEventParameterTrack::CreateTemplateForSection(const UMovieSceneSection &InSection) const\n{\n    return FFMODEventParameterSectionTemplate(*CastChecked<UMovieSceneParameterSection>(&InSection), *this);\n}\n\nUMovieSceneSection *UFMODEventParameterTrack::CreateNewSection()\n{\n    return NewObject<UMovieSceneParameterSection>(this, UMovieSceneParameterSection::StaticClass(), NAME_None, RF_Transactional);\n}\n\nvoid UFMODEventParameterTrack::RemoveAllAnimationData()\n{\n    Sections.Empty();\n}\n\nbool UFMODEventParameterTrack::HasSection(const UMovieSceneSection &Section) const\n{\n    return Sections.Contains(&Section);\n}\n\nvoid UFMODEventParameterTrack::AddSection(UMovieSceneSection &Section)\n{\n    Sections.Add(&Section);\n}\n\nvoid UFMODEventParameterTrack::RemoveSection(UMovieSceneSection &Section)\n{\n    Sections.Remove(&Section);\n}\n\nbool UFMODEventParameterTrack::IsEmpty() const\n{\n    return Sections.Num() == 0;\n}\n\nconst TArray<UMovieSceneSection *> &UFMODEventParameterTrack::GetAllSections() const\n{\n    return Sections;\n}\n\n#if WITH_EDITORONLY_DATA\nFText UFMODEventParameterTrack::GetDefaultDisplayName() const\n{\n    return LOCTEXT(\"DisplayName\", \"FMOD Event Parameter\");\n}\n#endif\n\nvoid UFMODEventParameterTrack::AddParameterKey(FName ParameterName, FFrameNumber Time, float Value)\n{\n    UMovieSceneParameterSection *NearestSection = Cast<UMovieSceneParameterSection>(MovieSceneHelpers::FindNearestSectionAtTime(Sections, Time));\n    if (NearestSection == nullptr)\n    {\n        NearestSection = Cast<UMovieSceneParameterSection>(CreateNewSection());\n        NearestSection->SetRange(TRange<FFrameNumber>::Inclusive(Time, Time));\n        Sections.Add(NearestSection);\n    }\n    NearestSection->AddScalarParameterKey(ParameterName, Time, Value);\n}\n\n#undef LOCTEXT_NAMESPACE\n"
  },
  {
    "path": "Plugins/FMODStudio/Source/FMODStudio/Private/Sequencer/FMODEventParameterTrack.h",
    "content": "// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2020.\n\n#pragma once\n\n#include \"CoreMinimal.h\"\n#include \"UObject/ObjectMacros.h\"\n#include \"Sections/MovieSceneParameterSection.h\"\n#include \"MovieSceneNameableTrack.h\"\n#include \"FMODEventParameterTrack.generated.h\"\n\n/** Handles manipulation of event parameters in a movie scene. */\nUCLASS(MinimalAPI)\nclass UFMODEventParameterTrack : public UMovieSceneNameableTrack\n{\n    GENERATED_UCLASS_BODY()\n\npublic:\n    // Begin UMovieSceneTrack interface\n    virtual FMovieSceneEvalTemplatePtr CreateTemplateForSection(const UMovieSceneSection &InSection) const override;\n    virtual UMovieSceneSection *CreateNewSection() override;\n    virtual void RemoveAllAnimationData() override;\n    virtual bool HasSection(const UMovieSceneSection &Section) const override;\n    virtual void AddSection(UMovieSceneSection &Section) override;\n    virtual void RemoveSection(UMovieSceneSection &Section) override;\n    virtual bool IsEmpty() const override;\n    virtual const TArray<UMovieSceneSection *> &GetAllSections() const override;\n// End UMovieSceneTrack interface\n\n#if WITH_EDITORONLY_DATA\n    virtual FText GetDefaultDisplayName() const override;\n#endif\n\npublic:\n    /** Adds a (scalar) event parameter key to the track. */\n    void FMODSTUDIO_API AddParameterKey(FName ParameterName, FFrameNumber Time, float Value);\n\nprivate:\n    /** The sections owned by this track. */\n    UPROPERTY()\n    TArray<UMovieSceneSection *> Sections;\n};\n"
  },
  {
    "path": "Plugins/FMODStudio/Source/FMODStudio/Public/FMOD/fmod.h",
    "content": "/*$ preserve start $*/\n\n/* ======================================================================================== */\n/* FMOD Studio Low Level API - C header file.                                               */\n/* Copyright (c), Firelight Technologies Pty, Ltd. 2012-2020.                               */\n/*                                                                                          */\n/* Use this header in conjunction with fmod_common.h (which contains all the constants /    */\n/* callbacks) to develop using C interface.                                                 */\n/* ======================================================================================== */\n\n#ifndef _FMOD_H\n#define _FMOD_H\n\n#include \"fmod_common.h\"\n\n/* ========================================================================================== */\n/* FUNCTION PROTOTYPES                                                                        */\n/* ========================================================================================== */\n\n#ifdef __cplusplus\nextern \"C\" \n{\n#endif\n\n/*\n    FMOD global system functions (optional).\n*/\n\nFMOD_RESULT F_API FMOD_Memory_Initialize           (void *poolmem, int poollen, FMOD_MEMORY_ALLOC_CALLBACK useralloc, FMOD_MEMORY_REALLOC_CALLBACK userrealloc, FMOD_MEMORY_FREE_CALLBACK userfree, FMOD_MEMORY_TYPE memtypeflags);\nFMOD_RESULT F_API FMOD_Memory_GetStats             (int *currentalloced, int *maxalloced, FMOD_BOOL blocking);\nFMOD_RESULT F_API FMOD_Debug_Initialize            (FMOD_DEBUG_FLAGS flags, FMOD_DEBUG_MODE mode, FMOD_DEBUG_CALLBACK callback, const char *filename);\nFMOD_RESULT F_API FMOD_File_SetDiskBusy            (int busy);\nFMOD_RESULT F_API FMOD_File_GetDiskBusy            (int *busy);\n\n/*\n    FMOD System factory functions.  Use this to create an FMOD System Instance.  below you will see FMOD_System_Init/Close to get started.\n*/\n\nFMOD_RESULT F_API FMOD_System_Create               (FMOD_SYSTEM **system); \nFMOD_RESULT F_API FMOD_System_Release              (FMOD_SYSTEM *system); \n\n/*$ preserve end $*/\n\n/*\n    'System' API\n*/\n\n/*\n     Setup functions.\n*/\n\nFMOD_RESULT F_API FMOD_System_SetOutput                 (FMOD_SYSTEM *system, FMOD_OUTPUTTYPE output);\nFMOD_RESULT F_API FMOD_System_GetOutput                 (FMOD_SYSTEM *system, FMOD_OUTPUTTYPE *output);\nFMOD_RESULT F_API FMOD_System_GetNumDrivers             (FMOD_SYSTEM *system, int *numdrivers);\nFMOD_RESULT F_API FMOD_System_GetDriverInfo             (FMOD_SYSTEM *system, int id, char *name, int namelen, FMOD_GUID *guid, int *systemrate, FMOD_SPEAKERMODE *speakermode, int *speakermodechannels);\nFMOD_RESULT F_API FMOD_System_SetDriver                 (FMOD_SYSTEM *system, int driver);\nFMOD_RESULT F_API FMOD_System_GetDriver                 (FMOD_SYSTEM *system, int *driver);\nFMOD_RESULT F_API FMOD_System_SetSoftwareChannels       (FMOD_SYSTEM *system, int numsoftwarechannels);\nFMOD_RESULT F_API FMOD_System_GetSoftwareChannels       (FMOD_SYSTEM *system, int *numsoftwarechannels);\nFMOD_RESULT F_API FMOD_System_SetSoftwareFormat         (FMOD_SYSTEM *system, int samplerate, FMOD_SPEAKERMODE speakermode, int numrawspeakers);\nFMOD_RESULT F_API FMOD_System_GetSoftwareFormat         (FMOD_SYSTEM *system, int *samplerate, FMOD_SPEAKERMODE *speakermode, int *numrawspeakers);\nFMOD_RESULT F_API FMOD_System_SetDSPBufferSize          (FMOD_SYSTEM *system, unsigned int bufferlength, int numbuffers);\nFMOD_RESULT F_API FMOD_System_GetDSPBufferSize          (FMOD_SYSTEM *system, unsigned int *bufferlength, int *numbuffers);\nFMOD_RESULT F_API FMOD_System_SetFileSystem             (FMOD_SYSTEM *system, FMOD_FILE_OPEN_CALLBACK useropen, FMOD_FILE_CLOSE_CALLBACK userclose, FMOD_FILE_READ_CALLBACK userread, FMOD_FILE_SEEK_CALLBACK userseek, FMOD_FILE_ASYNCREAD_CALLBACK userasyncread, FMOD_FILE_ASYNCCANCEL_CALLBACK userasynccancel, int blockalign);\nFMOD_RESULT F_API FMOD_System_AttachFileSystem          (FMOD_SYSTEM *system, FMOD_FILE_OPEN_CALLBACK useropen, FMOD_FILE_CLOSE_CALLBACK userclose, FMOD_FILE_READ_CALLBACK userread, FMOD_FILE_SEEK_CALLBACK userseek);\nFMOD_RESULT F_API FMOD_System_SetAdvancedSettings       (FMOD_SYSTEM *system, FMOD_ADVANCEDSETTINGS *settings);\nFMOD_RESULT F_API FMOD_System_GetAdvancedSettings       (FMOD_SYSTEM *system, FMOD_ADVANCEDSETTINGS *settings);\nFMOD_RESULT F_API FMOD_System_SetCallback               (FMOD_SYSTEM *system, FMOD_SYSTEM_CALLBACK callback, FMOD_SYSTEM_CALLBACK_TYPE callbackmask);\n\n/*\n     Plug-in support.\n*/\n\nFMOD_RESULT F_API FMOD_System_SetPluginPath             (FMOD_SYSTEM *system, const char *path);\nFMOD_RESULT F_API FMOD_System_LoadPlugin                (FMOD_SYSTEM *system, const char *filename, unsigned int *handle, unsigned int priority);\nFMOD_RESULT F_API FMOD_System_UnloadPlugin              (FMOD_SYSTEM *system, unsigned int handle);\nFMOD_RESULT F_API FMOD_System_GetNumNestedPlugins       (FMOD_SYSTEM *system, unsigned int handle, int *count);\nFMOD_RESULT F_API FMOD_System_GetNestedPlugin           (FMOD_SYSTEM *system, unsigned int handle, int index, unsigned int *nestedhandle);\nFMOD_RESULT F_API FMOD_System_GetNumPlugins             (FMOD_SYSTEM *system, FMOD_PLUGINTYPE plugintype, int *numplugins);\nFMOD_RESULT F_API FMOD_System_GetPluginHandle           (FMOD_SYSTEM *system, FMOD_PLUGINTYPE plugintype, int index, unsigned int *handle);\nFMOD_RESULT F_API FMOD_System_GetPluginInfo             (FMOD_SYSTEM *system, unsigned int handle, FMOD_PLUGINTYPE *plugintype, char *name, int namelen, unsigned int *version);\nFMOD_RESULT F_API FMOD_System_SetOutputByPlugin         (FMOD_SYSTEM *system, unsigned int handle);\nFMOD_RESULT F_API FMOD_System_GetOutputByPlugin         (FMOD_SYSTEM *system, unsigned int *handle);\nFMOD_RESULT F_API FMOD_System_CreateDSPByPlugin         (FMOD_SYSTEM *system, unsigned int handle, FMOD_DSP **dsp);\nFMOD_RESULT F_API FMOD_System_GetDSPInfoByPlugin        (FMOD_SYSTEM *system, unsigned int handle, const FMOD_DSP_DESCRIPTION **description);\nFMOD_RESULT F_API FMOD_System_RegisterCodec             (FMOD_SYSTEM *system, FMOD_CODEC_DESCRIPTION *description, unsigned int *handle, unsigned int priority);\nFMOD_RESULT F_API FMOD_System_RegisterDSP               (FMOD_SYSTEM *system, const FMOD_DSP_DESCRIPTION *description, unsigned int *handle);\nFMOD_RESULT F_API FMOD_System_RegisterOutput            (FMOD_SYSTEM *system, const FMOD_OUTPUT_DESCRIPTION *description, unsigned int *handle);\n\n/*\n     Init/Close.\n*/\n\nFMOD_RESULT F_API FMOD_System_Init                      (FMOD_SYSTEM *system, int maxchannels, FMOD_INITFLAGS flags, void *extradriverdata);\nFMOD_RESULT F_API FMOD_System_Close                     (FMOD_SYSTEM *system);\n\n/*\n     General post-init system functions.\n*/\n\nFMOD_RESULT F_API FMOD_System_Update                    (FMOD_SYSTEM *system);\n\nFMOD_RESULT F_API FMOD_System_SetSpeakerPosition        (FMOD_SYSTEM *system, FMOD_SPEAKER speaker, float x, float y, FMOD_BOOL active);\nFMOD_RESULT F_API FMOD_System_GetSpeakerPosition        (FMOD_SYSTEM *system, FMOD_SPEAKER speaker, float *x, float *y, FMOD_BOOL *active);\nFMOD_RESULT F_API FMOD_System_SetStreamBufferSize       (FMOD_SYSTEM *system, unsigned int filebuffersize, FMOD_TIMEUNIT filebuffersizetype);\nFMOD_RESULT F_API FMOD_System_GetStreamBufferSize       (FMOD_SYSTEM *system, unsigned int *filebuffersize, FMOD_TIMEUNIT *filebuffersizetype);\nFMOD_RESULT F_API FMOD_System_Set3DSettings             (FMOD_SYSTEM *system, float dopplerscale, float distancefactor, float rolloffscale);\nFMOD_RESULT F_API FMOD_System_Get3DSettings             (FMOD_SYSTEM *system, float *dopplerscale, float *distancefactor, float *rolloffscale);\nFMOD_RESULT F_API FMOD_System_Set3DNumListeners         (FMOD_SYSTEM *system, int numlisteners);\nFMOD_RESULT F_API FMOD_System_Get3DNumListeners         (FMOD_SYSTEM *system, int *numlisteners);\nFMOD_RESULT F_API FMOD_System_Set3DListenerAttributes   (FMOD_SYSTEM *system, int listener, const FMOD_VECTOR *pos, const FMOD_VECTOR *vel, const FMOD_VECTOR *forward, const FMOD_VECTOR *up);\nFMOD_RESULT F_API FMOD_System_Get3DListenerAttributes   (FMOD_SYSTEM *system, int listener, FMOD_VECTOR *pos, FMOD_VECTOR *vel, FMOD_VECTOR *forward, FMOD_VECTOR *up);\nFMOD_RESULT F_API FMOD_System_Set3DRolloffCallback      (FMOD_SYSTEM *system, FMOD_3D_ROLLOFF_CALLBACK callback);\nFMOD_RESULT F_API FMOD_System_MixerSuspend              (FMOD_SYSTEM *system);\nFMOD_RESULT F_API FMOD_System_MixerResume               (FMOD_SYSTEM *system);\nFMOD_RESULT F_API FMOD_System_GetDefaultMixMatrix       (FMOD_SYSTEM *system, FMOD_SPEAKERMODE sourcespeakermode, FMOD_SPEAKERMODE targetspeakermode, float *matrix, int matrixhop);\nFMOD_RESULT F_API FMOD_System_GetSpeakerModeChannels    (FMOD_SYSTEM *system, FMOD_SPEAKERMODE mode, int *channels);\n\n/*\n     System information functions.\n*/\n\nFMOD_RESULT F_API FMOD_System_GetVersion                (FMOD_SYSTEM *system, unsigned int *version);\nFMOD_RESULT F_API FMOD_System_GetOutputHandle           (FMOD_SYSTEM *system, void **handle);\nFMOD_RESULT F_API FMOD_System_GetChannelsPlaying        (FMOD_SYSTEM *system, int *channels, int *realchannels);\nFMOD_RESULT F_API FMOD_System_GetCPUUsage               (FMOD_SYSTEM *system, float *dsp, float *stream, float *geometry, float *update, float *total);\nFMOD_RESULT F_API FMOD_System_GetFileUsage              (FMOD_SYSTEM *system, long long *sampleBytesRead, long long *streamBytesRead, long long *otherBytesRead);\nFMOD_RESULT F_API FMOD_System_GetSoundRAM               (FMOD_SYSTEM *system, int *currentalloced, int *maxalloced, int *total);\n\n/*\n     Sound/DSP/Channel/FX creation and retrieval.\n*/\n\nFMOD_RESULT F_API FMOD_System_CreateSound               (FMOD_SYSTEM *system, const char *name_or_data, FMOD_MODE mode, FMOD_CREATESOUNDEXINFO *exinfo, FMOD_SOUND **sound);\nFMOD_RESULT F_API FMOD_System_CreateStream              (FMOD_SYSTEM *system, const char *name_or_data, FMOD_MODE mode, FMOD_CREATESOUNDEXINFO *exinfo, FMOD_SOUND **sound);\nFMOD_RESULT F_API FMOD_System_CreateDSP                 (FMOD_SYSTEM *system, const FMOD_DSP_DESCRIPTION *description, FMOD_DSP **dsp);\nFMOD_RESULT F_API FMOD_System_CreateDSPByType           (FMOD_SYSTEM *system, FMOD_DSP_TYPE type, FMOD_DSP **dsp);\nFMOD_RESULT F_API FMOD_System_CreateChannelGroup        (FMOD_SYSTEM *system, const char *name, FMOD_CHANNELGROUP **channelgroup);\nFMOD_RESULT F_API FMOD_System_CreateSoundGroup          (FMOD_SYSTEM *system, const char *name, FMOD_SOUNDGROUP **soundgroup);\nFMOD_RESULT F_API FMOD_System_CreateReverb3D            (FMOD_SYSTEM *system, FMOD_REVERB3D **reverb);\n\nFMOD_RESULT F_API FMOD_System_PlaySound                 (FMOD_SYSTEM *system, FMOD_SOUND *sound, FMOD_CHANNELGROUP *channelgroup, FMOD_BOOL paused, FMOD_CHANNEL **channel);\nFMOD_RESULT F_API FMOD_System_PlayDSP                   (FMOD_SYSTEM *system, FMOD_DSP *dsp, FMOD_CHANNELGROUP *channelgroup, FMOD_BOOL paused, FMOD_CHANNEL **channel);\nFMOD_RESULT F_API FMOD_System_GetChannel                (FMOD_SYSTEM *system, int channelid, FMOD_CHANNEL **channel);\nFMOD_RESULT F_API FMOD_System_GetMasterChannelGroup     (FMOD_SYSTEM *system, FMOD_CHANNELGROUP **channelgroup);\nFMOD_RESULT F_API FMOD_System_GetMasterSoundGroup       (FMOD_SYSTEM *system, FMOD_SOUNDGROUP **soundgroup);\n\n/*\n     Routing to ports.\n*/\n\nFMOD_RESULT F_API FMOD_System_AttachChannelGroupToPort  (FMOD_SYSTEM *system, FMOD_PORT_TYPE portType, FMOD_PORT_INDEX portIndex, FMOD_CHANNELGROUP *channelgroup, FMOD_BOOL passThru);\nFMOD_RESULT F_API FMOD_System_DetachChannelGroupFromPort(FMOD_SYSTEM *system, FMOD_CHANNELGROUP *channelgroup);\n\n/*\n     Reverb API.\n*/\n\nFMOD_RESULT F_API FMOD_System_SetReverbProperties       (FMOD_SYSTEM *system, int instance, const FMOD_REVERB_PROPERTIES *prop);\nFMOD_RESULT F_API FMOD_System_GetReverbProperties       (FMOD_SYSTEM *system, int instance, FMOD_REVERB_PROPERTIES *prop);\n\n/*\n     System level DSP functionality.\n*/\n\nFMOD_RESULT F_API FMOD_System_LockDSP                   (FMOD_SYSTEM *system);\nFMOD_RESULT F_API FMOD_System_UnlockDSP                 (FMOD_SYSTEM *system);\n\n/*\n     Recording API.\n*/\n\nFMOD_RESULT F_API FMOD_System_GetRecordNumDrivers       (FMOD_SYSTEM *system, int *numdrivers, int *numconnected);\nFMOD_RESULT F_API FMOD_System_GetRecordDriverInfo       (FMOD_SYSTEM *system, int id, char *name, int namelen, FMOD_GUID *guid, int *systemrate, FMOD_SPEAKERMODE *speakermode, int *speakermodechannels, FMOD_DRIVER_STATE *state);\nFMOD_RESULT F_API FMOD_System_GetRecordPosition         (FMOD_SYSTEM *system, int id, unsigned int *position);\nFMOD_RESULT F_API FMOD_System_RecordStart               (FMOD_SYSTEM *system, int id, FMOD_SOUND *sound, FMOD_BOOL loop);\nFMOD_RESULT F_API FMOD_System_RecordStop                (FMOD_SYSTEM *system, int id);\nFMOD_RESULT F_API FMOD_System_IsRecording               (FMOD_SYSTEM *system, int id, FMOD_BOOL *recording);\n\n/*\n     Geometry API.\n*/\n\nFMOD_RESULT F_API FMOD_System_CreateGeometry            (FMOD_SYSTEM *system, int maxpolygons, int maxvertices, FMOD_GEOMETRY **geometry);\nFMOD_RESULT F_API FMOD_System_SetGeometrySettings       (FMOD_SYSTEM *system, float maxworldsize);\nFMOD_RESULT F_API FMOD_System_GetGeometrySettings       (FMOD_SYSTEM *system, float *maxworldsize);\nFMOD_RESULT F_API FMOD_System_LoadGeometry              (FMOD_SYSTEM *system, const void *data, int datasize, FMOD_GEOMETRY **geometry);\nFMOD_RESULT F_API FMOD_System_GetGeometryOcclusion      (FMOD_SYSTEM *system, const FMOD_VECTOR *listener, const FMOD_VECTOR *source, float *direct, float *reverb);\n\n/*\n     Network functions.\n*/\n\nFMOD_RESULT F_API FMOD_System_SetNetworkProxy           (FMOD_SYSTEM *system, const char *proxy);\nFMOD_RESULT F_API FMOD_System_GetNetworkProxy           (FMOD_SYSTEM *system, char *proxy, int proxylen);\nFMOD_RESULT F_API FMOD_System_SetNetworkTimeout         (FMOD_SYSTEM *system, int timeout);\nFMOD_RESULT F_API FMOD_System_GetNetworkTimeout         (FMOD_SYSTEM *system, int *timeout);\n\n/*\n     Userdata set/get.\n*/\n\nFMOD_RESULT F_API FMOD_System_SetUserData               (FMOD_SYSTEM *system, void *userdata);\nFMOD_RESULT F_API FMOD_System_GetUserData               (FMOD_SYSTEM *system, void **userdata);\n\n/*\n    'Sound' API\n*/\n\nFMOD_RESULT F_API FMOD_Sound_Release                    (FMOD_SOUND *sound);\nFMOD_RESULT F_API FMOD_Sound_GetSystemObject            (FMOD_SOUND *sound, FMOD_SYSTEM **system);\n\n/*\n     Standard sound manipulation functions.\n*/\n\nFMOD_RESULT F_API FMOD_Sound_Lock                       (FMOD_SOUND *sound, unsigned int offset, unsigned int length, void **ptr1, void **ptr2, unsigned int *len1, unsigned int *len2);\nFMOD_RESULT F_API FMOD_Sound_Unlock                     (FMOD_SOUND *sound, void *ptr1, void *ptr2, unsigned int len1, unsigned int len2);\nFMOD_RESULT F_API FMOD_Sound_SetDefaults                (FMOD_SOUND *sound, float frequency, int priority);\nFMOD_RESULT F_API FMOD_Sound_GetDefaults                (FMOD_SOUND *sound, float *frequency, int *priority);\nFMOD_RESULT F_API FMOD_Sound_Set3DMinMaxDistance        (FMOD_SOUND *sound, float min, float max);\nFMOD_RESULT F_API FMOD_Sound_Get3DMinMaxDistance        (FMOD_SOUND *sound, float *min, float *max);\nFMOD_RESULT F_API FMOD_Sound_Set3DConeSettings          (FMOD_SOUND *sound, float insideconeangle, float outsideconeangle, float outsidevolume);\nFMOD_RESULT F_API FMOD_Sound_Get3DConeSettings          (FMOD_SOUND *sound, float *insideconeangle, float *outsideconeangle, float *outsidevolume);\nFMOD_RESULT F_API FMOD_Sound_Set3DCustomRolloff         (FMOD_SOUND *sound, FMOD_VECTOR *points, int numpoints);\nFMOD_RESULT F_API FMOD_Sound_Get3DCustomRolloff         (FMOD_SOUND *sound, FMOD_VECTOR **points, int *numpoints);\nFMOD_RESULT F_API FMOD_Sound_GetSubSound                (FMOD_SOUND *sound, int index, FMOD_SOUND **subsound);\nFMOD_RESULT F_API FMOD_Sound_GetSubSoundParent          (FMOD_SOUND *sound, FMOD_SOUND **parentsound);\nFMOD_RESULT F_API FMOD_Sound_GetName                    (FMOD_SOUND *sound, char *name, int namelen);\nFMOD_RESULT F_API FMOD_Sound_GetLength                  (FMOD_SOUND *sound, unsigned int *length, FMOD_TIMEUNIT lengthtype);\nFMOD_RESULT F_API FMOD_Sound_GetFormat                  (FMOD_SOUND *sound, FMOD_SOUND_TYPE *type, FMOD_SOUND_FORMAT *format, int *channels, int *bits);\nFMOD_RESULT F_API FMOD_Sound_GetNumSubSounds            (FMOD_SOUND *sound, int *numsubsounds);\nFMOD_RESULT F_API FMOD_Sound_GetNumTags                 (FMOD_SOUND *sound, int *numtags, int *numtagsupdated);\nFMOD_RESULT F_API FMOD_Sound_GetTag                     (FMOD_SOUND *sound, const char *name, int index, FMOD_TAG *tag);\nFMOD_RESULT F_API FMOD_Sound_GetOpenState               (FMOD_SOUND *sound, FMOD_OPENSTATE *openstate, unsigned int *percentbuffered, FMOD_BOOL *starving, FMOD_BOOL *diskbusy);\nFMOD_RESULT F_API FMOD_Sound_ReadData                   (FMOD_SOUND *sound, void *buffer, unsigned int length, unsigned int *read);\nFMOD_RESULT F_API FMOD_Sound_SeekData                   (FMOD_SOUND *sound, unsigned int pcm);\n\nFMOD_RESULT F_API FMOD_Sound_SetSoundGroup              (FMOD_SOUND *sound, FMOD_SOUNDGROUP *soundgroup);\nFMOD_RESULT F_API FMOD_Sound_GetSoundGroup              (FMOD_SOUND *sound, FMOD_SOUNDGROUP **soundgroup);\n\n/*\n     Synchronization point API.  These points can come from markers embedded in wav files, and can also generate channel callbacks.\n*/\n\nFMOD_RESULT F_API FMOD_Sound_GetNumSyncPoints           (FMOD_SOUND *sound, int *numsyncpoints);\nFMOD_RESULT F_API FMOD_Sound_GetSyncPoint               (FMOD_SOUND *sound, int index, FMOD_SYNCPOINT **point);\nFMOD_RESULT F_API FMOD_Sound_GetSyncPointInfo           (FMOD_SOUND *sound, FMOD_SYNCPOINT *point, char *name, int namelen, unsigned int *offset, FMOD_TIMEUNIT offsettype);\nFMOD_RESULT F_API FMOD_Sound_AddSyncPoint               (FMOD_SOUND *sound, unsigned int offset, FMOD_TIMEUNIT offsettype, const char *name, FMOD_SYNCPOINT **point);\nFMOD_RESULT F_API FMOD_Sound_DeleteSyncPoint            (FMOD_SOUND *sound, FMOD_SYNCPOINT *point);\n\n/*\n     Functions also in Channel class but here they are the 'default' to save having to change it in Channel all the time.\n*/\n\nFMOD_RESULT F_API FMOD_Sound_SetMode                    (FMOD_SOUND *sound, FMOD_MODE mode);\nFMOD_RESULT F_API FMOD_Sound_GetMode                    (FMOD_SOUND *sound, FMOD_MODE *mode);\nFMOD_RESULT F_API FMOD_Sound_SetLoopCount               (FMOD_SOUND *sound, int loopcount);\nFMOD_RESULT F_API FMOD_Sound_GetLoopCount               (FMOD_SOUND *sound, int *loopcount);\nFMOD_RESULT F_API FMOD_Sound_SetLoopPoints              (FMOD_SOUND *sound, unsigned int loopstart, FMOD_TIMEUNIT loopstarttype, unsigned int loopend, FMOD_TIMEUNIT loopendtype);\nFMOD_RESULT F_API FMOD_Sound_GetLoopPoints              (FMOD_SOUND *sound, unsigned int *loopstart, FMOD_TIMEUNIT loopstarttype, unsigned int *loopend, FMOD_TIMEUNIT loopendtype);\n\n/*\n     For MOD/S3M/XM/IT/MID sequenced formats only.\n*/\n\nFMOD_RESULT F_API FMOD_Sound_GetMusicNumChannels        (FMOD_SOUND *sound, int *numchannels);\nFMOD_RESULT F_API FMOD_Sound_SetMusicChannelVolume      (FMOD_SOUND *sound, int channel, float volume);\nFMOD_RESULT F_API FMOD_Sound_GetMusicChannelVolume      (FMOD_SOUND *sound, int channel, float *volume);\nFMOD_RESULT F_API FMOD_Sound_SetMusicSpeed              (FMOD_SOUND *sound, float speed);\nFMOD_RESULT F_API FMOD_Sound_GetMusicSpeed              (FMOD_SOUND *sound, float *speed);\n\n/*\n     Userdata set/get.\n*/\n\nFMOD_RESULT F_API FMOD_Sound_SetUserData                (FMOD_SOUND *sound, void *userdata);\nFMOD_RESULT F_API FMOD_Sound_GetUserData                (FMOD_SOUND *sound, void **userdata);\n\n/*\n    'Channel' API\n*/\n\nFMOD_RESULT F_API FMOD_Channel_GetSystemObject          (FMOD_CHANNEL *channel, FMOD_SYSTEM **system);\n\n/*\n     General control functionality for Channels and ChannelGroups.\n*/\n\nFMOD_RESULT F_API FMOD_Channel_Stop                     (FMOD_CHANNEL *channel);\nFMOD_RESULT F_API FMOD_Channel_SetPaused                (FMOD_CHANNEL *channel, FMOD_BOOL paused);\nFMOD_RESULT F_API FMOD_Channel_GetPaused                (FMOD_CHANNEL *channel, FMOD_BOOL *paused);\nFMOD_RESULT F_API FMOD_Channel_SetVolume                (FMOD_CHANNEL *channel, float volume);\nFMOD_RESULT F_API FMOD_Channel_GetVolume                (FMOD_CHANNEL *channel, float *volume);\nFMOD_RESULT F_API FMOD_Channel_SetVolumeRamp            (FMOD_CHANNEL *channel, FMOD_BOOL ramp);\nFMOD_RESULT F_API FMOD_Channel_GetVolumeRamp            (FMOD_CHANNEL *channel, FMOD_BOOL *ramp);\nFMOD_RESULT F_API FMOD_Channel_GetAudibility            (FMOD_CHANNEL *channel, float *audibility);\nFMOD_RESULT F_API FMOD_Channel_SetPitch                 (FMOD_CHANNEL *channel, float pitch);\nFMOD_RESULT F_API FMOD_Channel_GetPitch                 (FMOD_CHANNEL *channel, float *pitch);\nFMOD_RESULT F_API FMOD_Channel_SetMute                  (FMOD_CHANNEL *channel, FMOD_BOOL mute);\nFMOD_RESULT F_API FMOD_Channel_GetMute                  (FMOD_CHANNEL *channel, FMOD_BOOL *mute);\nFMOD_RESULT F_API FMOD_Channel_SetReverbProperties      (FMOD_CHANNEL *channel, int instance, float wet);\nFMOD_RESULT F_API FMOD_Channel_GetReverbProperties      (FMOD_CHANNEL *channel, int instance, float *wet);\nFMOD_RESULT F_API FMOD_Channel_SetLowPassGain           (FMOD_CHANNEL *channel, float gain);\nFMOD_RESULT F_API FMOD_Channel_GetLowPassGain           (FMOD_CHANNEL *channel, float *gain);\nFMOD_RESULT F_API FMOD_Channel_SetMode                  (FMOD_CHANNEL *channel, FMOD_MODE mode);\nFMOD_RESULT F_API FMOD_Channel_GetMode                  (FMOD_CHANNEL *channel, FMOD_MODE *mode);\nFMOD_RESULT F_API FMOD_Channel_SetCallback              (FMOD_CHANNEL *channel, FMOD_CHANNELCONTROL_CALLBACK callback);\nFMOD_RESULT F_API FMOD_Channel_IsPlaying                (FMOD_CHANNEL *channel, FMOD_BOOL *isplaying);\n\n/*\n     Note all 'set' functions alter a final matrix, this is why the only get function is getMixMatrix, to avoid other get functions returning incorrect/obsolete values.\n*/\n\nFMOD_RESULT F_API FMOD_Channel_SetPan                   (FMOD_CHANNEL *channel, float pan);\nFMOD_RESULT F_API FMOD_Channel_SetMixLevelsOutput       (FMOD_CHANNEL *channel, float frontleft, float frontright, float center, float lfe, float surroundleft, float surroundright, float backleft, float backright);\nFMOD_RESULT F_API FMOD_Channel_SetMixLevelsInput        (FMOD_CHANNEL *channel, float *levels, int numlevels);\nFMOD_RESULT F_API FMOD_Channel_SetMixMatrix             (FMOD_CHANNEL *channel, float *matrix, int outchannels, int inchannels, int inchannel_hop);\nFMOD_RESULT F_API FMOD_Channel_GetMixMatrix             (FMOD_CHANNEL *channel, float *matrix, int *outchannels, int *inchannels, int inchannel_hop);\n\n/*\n     Clock based functionality.\n*/\n\nFMOD_RESULT F_API FMOD_Channel_GetDSPClock              (FMOD_CHANNEL *channel, unsigned long long *dspclock, unsigned long long *parentclock);\nFMOD_RESULT F_API FMOD_Channel_SetDelay                 (FMOD_CHANNEL *channel, unsigned long long dspclock_start, unsigned long long dspclock_end, FMOD_BOOL stopchannels);\nFMOD_RESULT F_API FMOD_Channel_GetDelay                 (FMOD_CHANNEL *channel, unsigned long long *dspclock_start, unsigned long long *dspclock_end, FMOD_BOOL *stopchannels);\nFMOD_RESULT F_API FMOD_Channel_AddFadePoint             (FMOD_CHANNEL *channel, unsigned long long dspclock, float volume);\nFMOD_RESULT F_API FMOD_Channel_SetFadePointRamp         (FMOD_CHANNEL *channel, unsigned long long dspclock, float volume);\nFMOD_RESULT F_API FMOD_Channel_RemoveFadePoints         (FMOD_CHANNEL *channel, unsigned long long dspclock_start, unsigned long long dspclock_end);\nFMOD_RESULT F_API FMOD_Channel_GetFadePoints            (FMOD_CHANNEL *channel, unsigned int *numpoints, unsigned long long *point_dspclock, float *point_volume);\n\n/*\n     DSP effects.\n*/\n\nFMOD_RESULT F_API FMOD_Channel_GetDSP                   (FMOD_CHANNEL *channel, int index, FMOD_DSP **dsp);\nFMOD_RESULT F_API FMOD_Channel_AddDSP                   (FMOD_CHANNEL *channel, int index, FMOD_DSP *dsp);\nFMOD_RESULT F_API FMOD_Channel_RemoveDSP                (FMOD_CHANNEL *channel, FMOD_DSP *dsp);\nFMOD_RESULT F_API FMOD_Channel_GetNumDSPs               (FMOD_CHANNEL *channel, int *numdsps);\nFMOD_RESULT F_API FMOD_Channel_SetDSPIndex              (FMOD_CHANNEL *channel, FMOD_DSP *dsp, int index);\nFMOD_RESULT F_API FMOD_Channel_GetDSPIndex              (FMOD_CHANNEL *channel, FMOD_DSP *dsp, int *index);\n\n/*\n     3D functionality.\n*/\n\nFMOD_RESULT F_API FMOD_Channel_Set3DAttributes          (FMOD_CHANNEL *channel, const FMOD_VECTOR *pos, const FMOD_VECTOR *vel, const FMOD_VECTOR *alt_pan_pos);\nFMOD_RESULT F_API FMOD_Channel_Get3DAttributes          (FMOD_CHANNEL *channel, FMOD_VECTOR *pos, FMOD_VECTOR *vel, FMOD_VECTOR *alt_pan_pos);\nFMOD_RESULT F_API FMOD_Channel_Set3DMinMaxDistance      (FMOD_CHANNEL *channel, float mindistance, float maxdistance);\nFMOD_RESULT F_API FMOD_Channel_Get3DMinMaxDistance      (FMOD_CHANNEL *channel, float *mindistance, float *maxdistance);\nFMOD_RESULT F_API FMOD_Channel_Set3DConeSettings        (FMOD_CHANNEL *channel, float insideconeangle, float outsideconeangle, float outsidevolume);\nFMOD_RESULT F_API FMOD_Channel_Get3DConeSettings        (FMOD_CHANNEL *channel, float *insideconeangle, float *outsideconeangle, float *outsidevolume);\nFMOD_RESULT F_API FMOD_Channel_Set3DConeOrientation     (FMOD_CHANNEL *channel, FMOD_VECTOR *orientation);\nFMOD_RESULT F_API FMOD_Channel_Get3DConeOrientation     (FMOD_CHANNEL *channel, FMOD_VECTOR *orientation);\nFMOD_RESULT F_API FMOD_Channel_Set3DCustomRolloff       (FMOD_CHANNEL *channel, FMOD_VECTOR *points, int numpoints);\nFMOD_RESULT F_API FMOD_Channel_Get3DCustomRolloff       (FMOD_CHANNEL *channel, FMOD_VECTOR **points, int *numpoints);\nFMOD_RESULT F_API FMOD_Channel_Set3DOcclusion           (FMOD_CHANNEL *channel, float directocclusion, float reverbocclusion);\nFMOD_RESULT F_API FMOD_Channel_Get3DOcclusion           (FMOD_CHANNEL *channel, float *directocclusion, float *reverbocclusion);\nFMOD_RESULT F_API FMOD_Channel_Set3DSpread              (FMOD_CHANNEL *channel, float angle);\nFMOD_RESULT F_API FMOD_Channel_Get3DSpread              (FMOD_CHANNEL *channel, float *angle);\nFMOD_RESULT F_API FMOD_Channel_Set3DLevel               (FMOD_CHANNEL *channel, float level);\nFMOD_RESULT F_API FMOD_Channel_Get3DLevel               (FMOD_CHANNEL *channel, float *level);\nFMOD_RESULT F_API FMOD_Channel_Set3DDopplerLevel        (FMOD_CHANNEL *channel, float level);\nFMOD_RESULT F_API FMOD_Channel_Get3DDopplerLevel        (FMOD_CHANNEL *channel, float *level);\nFMOD_RESULT F_API FMOD_Channel_Set3DDistanceFilter      (FMOD_CHANNEL *channel, FMOD_BOOL custom, float customLevel, float centerFreq);\nFMOD_RESULT F_API FMOD_Channel_Get3DDistanceFilter      (FMOD_CHANNEL *channel, FMOD_BOOL *custom, float *customLevel, float *centerFreq);\n\n/*\n     Userdata set/get.\n*/\n\nFMOD_RESULT F_API FMOD_Channel_SetUserData              (FMOD_CHANNEL *channel, void *userdata);\nFMOD_RESULT F_API FMOD_Channel_GetUserData              (FMOD_CHANNEL *channel, void **userdata);\n\n/*\n     Channel specific control functionality.\n*/\n\nFMOD_RESULT F_API FMOD_Channel_SetFrequency             (FMOD_CHANNEL *channel, float frequency);\nFMOD_RESULT F_API FMOD_Channel_GetFrequency             (FMOD_CHANNEL *channel, float *frequency);\nFMOD_RESULT F_API FMOD_Channel_SetPriority              (FMOD_CHANNEL *channel, int priority);\nFMOD_RESULT F_API FMOD_Channel_GetPriority              (FMOD_CHANNEL *channel, int *priority);\nFMOD_RESULT F_API FMOD_Channel_SetPosition              (FMOD_CHANNEL *channel, unsigned int position, FMOD_TIMEUNIT postype);\nFMOD_RESULT F_API FMOD_Channel_GetPosition              (FMOD_CHANNEL *channel, unsigned int *position, FMOD_TIMEUNIT postype);\nFMOD_RESULT F_API FMOD_Channel_SetChannelGroup          (FMOD_CHANNEL *channel, FMOD_CHANNELGROUP *channelgroup);\nFMOD_RESULT F_API FMOD_Channel_GetChannelGroup          (FMOD_CHANNEL *channel, FMOD_CHANNELGROUP **channelgroup);\nFMOD_RESULT F_API FMOD_Channel_SetLoopCount             (FMOD_CHANNEL *channel, int loopcount);\nFMOD_RESULT F_API FMOD_Channel_GetLoopCount             (FMOD_CHANNEL *channel, int *loopcount);\nFMOD_RESULT F_API FMOD_Channel_SetLoopPoints            (FMOD_CHANNEL *channel, unsigned int loopstart, FMOD_TIMEUNIT loopstarttype, unsigned int loopend, FMOD_TIMEUNIT loopendtype);\nFMOD_RESULT F_API FMOD_Channel_GetLoopPoints            (FMOD_CHANNEL *channel, unsigned int *loopstart, FMOD_TIMEUNIT loopstarttype, unsigned int *loopend, FMOD_TIMEUNIT loopendtype);\n\n/*\n     Information only functions.\n*/\n\nFMOD_RESULT F_API FMOD_Channel_IsVirtual                (FMOD_CHANNEL *channel, FMOD_BOOL *isvirtual);\nFMOD_RESULT F_API FMOD_Channel_GetCurrentSound          (FMOD_CHANNEL *channel, FMOD_SOUND **sound);\nFMOD_RESULT F_API FMOD_Channel_GetIndex                 (FMOD_CHANNEL *channel, int *index);\n\n/*\n    'ChannelGroup' API\n*/\n\nFMOD_RESULT F_API FMOD_ChannelGroup_GetSystemObject     (FMOD_CHANNELGROUP *channelgroup, FMOD_SYSTEM **system);\n\n/*\n     General control functionality for Channels and ChannelGroups.\n*/\n\nFMOD_RESULT F_API FMOD_ChannelGroup_Stop                (FMOD_CHANNELGROUP *channelgroup);\nFMOD_RESULT F_API FMOD_ChannelGroup_SetPaused           (FMOD_CHANNELGROUP *channelgroup, FMOD_BOOL paused);\nFMOD_RESULT F_API FMOD_ChannelGroup_GetPaused           (FMOD_CHANNELGROUP *channelgroup, FMOD_BOOL *paused);\nFMOD_RESULT F_API FMOD_ChannelGroup_SetVolume           (FMOD_CHANNELGROUP *channelgroup, float volume);\nFMOD_RESULT F_API FMOD_ChannelGroup_GetVolume           (FMOD_CHANNELGROUP *channelgroup, float *volume);\nFMOD_RESULT F_API FMOD_ChannelGroup_SetVolumeRamp       (FMOD_CHANNELGROUP *channelgroup, FMOD_BOOL ramp);\nFMOD_RESULT F_API FMOD_ChannelGroup_GetVolumeRamp       (FMOD_CHANNELGROUP *channelgroup, FMOD_BOOL *ramp);\nFMOD_RESULT F_API FMOD_ChannelGroup_GetAudibility       (FMOD_CHANNELGROUP *channelgroup, float *audibility);\nFMOD_RESULT F_API FMOD_ChannelGroup_SetPitch            (FMOD_CHANNELGROUP *channelgroup, float pitch);\nFMOD_RESULT F_API FMOD_ChannelGroup_GetPitch            (FMOD_CHANNELGROUP *channelgroup, float *pitch);\nFMOD_RESULT F_API FMOD_ChannelGroup_SetMute             (FMOD_CHANNELGROUP *channelgroup, FMOD_BOOL mute);\nFMOD_RESULT F_API FMOD_ChannelGroup_GetMute             (FMOD_CHANNELGROUP *channelgroup, FMOD_BOOL *mute);\nFMOD_RESULT F_API FMOD_ChannelGroup_SetReverbProperties (FMOD_CHANNELGROUP *channelgroup, int instance, float wet);\nFMOD_RESULT F_API FMOD_ChannelGroup_GetReverbProperties (FMOD_CHANNELGROUP *channelgroup, int instance, float *wet);\nFMOD_RESULT F_API FMOD_ChannelGroup_SetLowPassGain      (FMOD_CHANNELGROUP *channelgroup, float gain);\nFMOD_RESULT F_API FMOD_ChannelGroup_GetLowPassGain      (FMOD_CHANNELGROUP *channelgroup, float *gain);\nFMOD_RESULT F_API FMOD_ChannelGroup_SetMode             (FMOD_CHANNELGROUP *channelgroup, FMOD_MODE mode);\nFMOD_RESULT F_API FMOD_ChannelGroup_GetMode             (FMOD_CHANNELGROUP *channelgroup, FMOD_MODE *mode);\nFMOD_RESULT F_API FMOD_ChannelGroup_SetCallback         (FMOD_CHANNELGROUP *channelgroup, FMOD_CHANNELCONTROL_CALLBACK callback);\nFMOD_RESULT F_API FMOD_ChannelGroup_IsPlaying           (FMOD_CHANNELGROUP *channelgroup, FMOD_BOOL *isplaying);\n\n/*\n     Note all 'set' functions alter a final matrix, this is why the only get function is getMixMatrix, to avoid other get functions returning incorrect/obsolete values.\n*/\n\nFMOD_RESULT F_API FMOD_ChannelGroup_SetPan              (FMOD_CHANNELGROUP *channelgroup, float pan);\nFMOD_RESULT F_API FMOD_ChannelGroup_SetMixLevelsOutput  (FMOD_CHANNELGROUP *channelgroup, float frontleft, float frontright, float center, float lfe, float surroundleft, float surroundright, float backleft, float backright);\nFMOD_RESULT F_API FMOD_ChannelGroup_SetMixLevelsInput   (FMOD_CHANNELGROUP *channelgroup, float *levels, int numlevels);\nFMOD_RESULT F_API FMOD_ChannelGroup_SetMixMatrix        (FMOD_CHANNELGROUP *channelgroup, float *matrix, int outchannels, int inchannels, int inchannel_hop);\nFMOD_RESULT F_API FMOD_ChannelGroup_GetMixMatrix        (FMOD_CHANNELGROUP *channelgroup, float *matrix, int *outchannels, int *inchannels, int inchannel_hop);\n\n/*\n     Clock based functionality.\n*/\n\nFMOD_RESULT F_API FMOD_ChannelGroup_GetDSPClock         (FMOD_CHANNELGROUP *channelgroup, unsigned long long *dspclock, unsigned long long *parentclock);\nFMOD_RESULT F_API FMOD_ChannelGroup_SetDelay            (FMOD_CHANNELGROUP *channelgroup, unsigned long long dspclock_start, unsigned long long dspclock_end, FMOD_BOOL stopchannels);\nFMOD_RESULT F_API FMOD_ChannelGroup_GetDelay            (FMOD_CHANNELGROUP *channelgroup, unsigned long long *dspclock_start, unsigned long long *dspclock_end, FMOD_BOOL *stopchannels);\nFMOD_RESULT F_API FMOD_ChannelGroup_AddFadePoint        (FMOD_CHANNELGROUP *channelgroup, unsigned long long dspclock, float volume);\nFMOD_RESULT F_API FMOD_ChannelGroup_SetFadePointRamp    (FMOD_CHANNELGROUP *channelgroup, unsigned long long dspclock, float volume);\nFMOD_RESULT F_API FMOD_ChannelGroup_RemoveFadePoints    (FMOD_CHANNELGROUP *channelgroup, unsigned long long dspclock_start, unsigned long long dspclock_end);\nFMOD_RESULT F_API FMOD_ChannelGroup_GetFadePoints       (FMOD_CHANNELGROUP *channelgroup, unsigned int *numpoints, unsigned long long *point_dspclock, float *point_volume);\n\n/*\n     DSP effects.\n*/\n\nFMOD_RESULT F_API FMOD_ChannelGroup_GetDSP              (FMOD_CHANNELGROUP *channelgroup, int index, FMOD_DSP **dsp);\nFMOD_RESULT F_API FMOD_ChannelGroup_AddDSP              (FMOD_CHANNELGROUP *channelgroup, int index, FMOD_DSP *dsp);\nFMOD_RESULT F_API FMOD_ChannelGroup_RemoveDSP           (FMOD_CHANNELGROUP *channelgroup, FMOD_DSP *dsp);\nFMOD_RESULT F_API FMOD_ChannelGroup_GetNumDSPs          (FMOD_CHANNELGROUP *channelgroup, int *numdsps);\nFMOD_RESULT F_API FMOD_ChannelGroup_SetDSPIndex         (FMOD_CHANNELGROUP *channelgroup, FMOD_DSP *dsp, int index);\nFMOD_RESULT F_API FMOD_ChannelGroup_GetDSPIndex         (FMOD_CHANNELGROUP *channelgroup, FMOD_DSP *dsp, int *index);\n\n/*\n     3D functionality.\n*/\n\nFMOD_RESULT F_API FMOD_ChannelGroup_Set3DAttributes     (FMOD_CHANNELGROUP *channelgroup, const FMOD_VECTOR *pos, const FMOD_VECTOR *vel, const FMOD_VECTOR *alt_pan_pos);\nFMOD_RESULT F_API FMOD_ChannelGroup_Get3DAttributes     (FMOD_CHANNELGROUP *channelgroup, FMOD_VECTOR *pos, FMOD_VECTOR *vel, FMOD_VECTOR *alt_pan_pos);\nFMOD_RESULT F_API FMOD_ChannelGroup_Set3DMinMaxDistance (FMOD_CHANNELGROUP *channelgroup, float mindistance, float maxdistance);\nFMOD_RESULT F_API FMOD_ChannelGroup_Get3DMinMaxDistance (FMOD_CHANNELGROUP *channelgroup, float *mindistance, float *maxdistance);\nFMOD_RESULT F_API FMOD_ChannelGroup_Set3DConeSettings   (FMOD_CHANNELGROUP *channelgroup, float insideconeangle, float outsideconeangle, float outsidevolume);\nFMOD_RESULT F_API FMOD_ChannelGroup_Get3DConeSettings   (FMOD_CHANNELGROUP *channelgroup, float *insideconeangle, float *outsideconeangle, float *outsidevolume);\nFMOD_RESULT F_API FMOD_ChannelGroup_Set3DConeOrientation(FMOD_CHANNELGROUP *channelgroup, FMOD_VECTOR *orientation);\nFMOD_RESULT F_API FMOD_ChannelGroup_Get3DConeOrientation(FMOD_CHANNELGROUP *channelgroup, FMOD_VECTOR *orientation);\nFMOD_RESULT F_API FMOD_ChannelGroup_Set3DCustomRolloff  (FMOD_CHANNELGROUP *channelgroup, FMOD_VECTOR *points, int numpoints);\nFMOD_RESULT F_API FMOD_ChannelGroup_Get3DCustomRolloff  (FMOD_CHANNELGROUP *channelgroup, FMOD_VECTOR **points, int *numpoints);\nFMOD_RESULT F_API FMOD_ChannelGroup_Set3DOcclusion      (FMOD_CHANNELGROUP *channelgroup, float directocclusion, float reverbocclusion);\nFMOD_RESULT F_API FMOD_ChannelGroup_Get3DOcclusion      (FMOD_CHANNELGROUP *channelgroup, float *directocclusion, float *reverbocclusion);\nFMOD_RESULT F_API FMOD_ChannelGroup_Set3DSpread         (FMOD_CHANNELGROUP *channelgroup, float angle);\nFMOD_RESULT F_API FMOD_ChannelGroup_Get3DSpread         (FMOD_CHANNELGROUP *channelgroup, float *angle);\nFMOD_RESULT F_API FMOD_ChannelGroup_Set3DLevel          (FMOD_CHANNELGROUP *channelgroup, float level);\nFMOD_RESULT F_API FMOD_ChannelGroup_Get3DLevel          (FMOD_CHANNELGROUP *channelgroup, float *level);\nFMOD_RESULT F_API FMOD_ChannelGroup_Set3DDopplerLevel   (FMOD_CHANNELGROUP *channelgroup, float level);\nFMOD_RESULT F_API FMOD_ChannelGroup_Get3DDopplerLevel   (FMOD_CHANNELGROUP *channelgroup, float *level);\nFMOD_RESULT F_API FMOD_ChannelGroup_Set3DDistanceFilter (FMOD_CHANNELGROUP *channelgroup, FMOD_BOOL custom, float customLevel, float centerFreq);\nFMOD_RESULT F_API FMOD_ChannelGroup_Get3DDistanceFilter (FMOD_CHANNELGROUP *channelgroup, FMOD_BOOL *custom, float *customLevel, float *centerFreq);\n\n/*\n     Userdata set/get.\n*/\n\nFMOD_RESULT F_API FMOD_ChannelGroup_SetUserData         (FMOD_CHANNELGROUP *channelgroup, void *userdata);\nFMOD_RESULT F_API FMOD_ChannelGroup_GetUserData         (FMOD_CHANNELGROUP *channelgroup, void **userdata);\n\nFMOD_RESULT F_API FMOD_ChannelGroup_Release             (FMOD_CHANNELGROUP *channelgroup);\n\n/*\n     Nested channel groups.\n*/\n\nFMOD_RESULT F_API FMOD_ChannelGroup_AddGroup            (FMOD_CHANNELGROUP *channelgroup, FMOD_CHANNELGROUP *group, FMOD_BOOL propagatedspclock, FMOD_DSPCONNECTION **connection);\nFMOD_RESULT F_API FMOD_ChannelGroup_GetNumGroups        (FMOD_CHANNELGROUP *channelgroup, int *numgroups);\nFMOD_RESULT F_API FMOD_ChannelGroup_GetGroup            (FMOD_CHANNELGROUP *channelgroup, int index, FMOD_CHANNELGROUP **group);\nFMOD_RESULT F_API FMOD_ChannelGroup_GetParentGroup      (FMOD_CHANNELGROUP *channelgroup, FMOD_CHANNELGROUP **group);\n\n/*\n     Information only functions.\n*/\n\nFMOD_RESULT F_API FMOD_ChannelGroup_GetName             (FMOD_CHANNELGROUP *channelgroup, char *name, int namelen);\nFMOD_RESULT F_API FMOD_ChannelGroup_GetNumChannels      (FMOD_CHANNELGROUP *channelgroup, int *numchannels);\nFMOD_RESULT F_API FMOD_ChannelGroup_GetChannel          (FMOD_CHANNELGROUP *channelgroup, int index, FMOD_CHANNEL **channel);\n\n/*\n    'SoundGroup' API\n*/\n\nFMOD_RESULT F_API FMOD_SoundGroup_Release               (FMOD_SOUNDGROUP *soundgroup);\nFMOD_RESULT F_API FMOD_SoundGroup_GetSystemObject       (FMOD_SOUNDGROUP *soundgroup, FMOD_SYSTEM **system);\n\n/*\n     SoundGroup control functions.\n*/\n\nFMOD_RESULT F_API FMOD_SoundGroup_SetMaxAudible         (FMOD_SOUNDGROUP *soundgroup, int maxaudible);\nFMOD_RESULT F_API FMOD_SoundGroup_GetMaxAudible         (FMOD_SOUNDGROUP *soundgroup, int *maxaudible);\nFMOD_RESULT F_API FMOD_SoundGroup_SetMaxAudibleBehavior (FMOD_SOUNDGROUP *soundgroup, FMOD_SOUNDGROUP_BEHAVIOR behavior);\nFMOD_RESULT F_API FMOD_SoundGroup_GetMaxAudibleBehavior (FMOD_SOUNDGROUP *soundgroup, FMOD_SOUNDGROUP_BEHAVIOR *behavior);\nFMOD_RESULT F_API FMOD_SoundGroup_SetMuteFadeSpeed      (FMOD_SOUNDGROUP *soundgroup, float speed);\nFMOD_RESULT F_API FMOD_SoundGroup_GetMuteFadeSpeed      (FMOD_SOUNDGROUP *soundgroup, float *speed);\nFMOD_RESULT F_API FMOD_SoundGroup_SetVolume             (FMOD_SOUNDGROUP *soundgroup, float volume);\nFMOD_RESULT F_API FMOD_SoundGroup_GetVolume             (FMOD_SOUNDGROUP *soundgroup, float *volume);\nFMOD_RESULT F_API FMOD_SoundGroup_Stop                  (FMOD_SOUNDGROUP *soundgroup);\n\n/*\n     Information only functions.\n*/\n\nFMOD_RESULT F_API FMOD_SoundGroup_GetName               (FMOD_SOUNDGROUP *soundgroup, char *name, int namelen);\nFMOD_RESULT F_API FMOD_SoundGroup_GetNumSounds          (FMOD_SOUNDGROUP *soundgroup, int *numsounds);\nFMOD_RESULT F_API FMOD_SoundGroup_GetSound              (FMOD_SOUNDGROUP *soundgroup, int index, FMOD_SOUND **sound);\nFMOD_RESULT F_API FMOD_SoundGroup_GetNumPlaying         (FMOD_SOUNDGROUP *soundgroup, int *numplaying);\n\n/*\n     Userdata set/get.\n*/\n\nFMOD_RESULT F_API FMOD_SoundGroup_SetUserData           (FMOD_SOUNDGROUP *soundgroup, void *userdata);\nFMOD_RESULT F_API FMOD_SoundGroup_GetUserData           (FMOD_SOUNDGROUP *soundgroup, void **userdata);\n\n/*\n    'DSP' API\n*/\n\nFMOD_RESULT F_API FMOD_DSP_Release                      (FMOD_DSP *dsp);\nFMOD_RESULT F_API FMOD_DSP_GetSystemObject              (FMOD_DSP *dsp, FMOD_SYSTEM **system);\n\n/*\n     Connection / disconnection / input and output enumeration.\n*/\n\nFMOD_RESULT F_API FMOD_DSP_AddInput                     (FMOD_DSP *dsp, FMOD_DSP *input, FMOD_DSPCONNECTION **connection, FMOD_DSPCONNECTION_TYPE type);\nFMOD_RESULT F_API FMOD_DSP_DisconnectFrom               (FMOD_DSP *dsp, FMOD_DSP *target, FMOD_DSPCONNECTION *connection);\nFMOD_RESULT F_API FMOD_DSP_DisconnectAll                (FMOD_DSP *dsp, FMOD_BOOL inputs, FMOD_BOOL outputs);\nFMOD_RESULT F_API FMOD_DSP_GetNumInputs                 (FMOD_DSP *dsp, int *numinputs);\nFMOD_RESULT F_API FMOD_DSP_GetNumOutputs                (FMOD_DSP *dsp, int *numoutputs);\nFMOD_RESULT F_API FMOD_DSP_GetInput                     (FMOD_DSP *dsp, int index, FMOD_DSP **input, FMOD_DSPCONNECTION **inputconnection);\nFMOD_RESULT F_API FMOD_DSP_GetOutput                    (FMOD_DSP *dsp, int index, FMOD_DSP **output, FMOD_DSPCONNECTION **outputconnection);\n\n/*\n     DSP unit control.\n*/\n\nFMOD_RESULT F_API FMOD_DSP_SetActive                    (FMOD_DSP *dsp, FMOD_BOOL active);\nFMOD_RESULT F_API FMOD_DSP_GetActive                    (FMOD_DSP *dsp, FMOD_BOOL *active);\nFMOD_RESULT F_API FMOD_DSP_SetBypass                    (FMOD_DSP *dsp, FMOD_BOOL bypass);\nFMOD_RESULT F_API FMOD_DSP_GetBypass                    (FMOD_DSP *dsp, FMOD_BOOL *bypass);\nFMOD_RESULT F_API FMOD_DSP_SetWetDryMix                 (FMOD_DSP *dsp, float prewet, float postwet, float dry);\nFMOD_RESULT F_API FMOD_DSP_GetWetDryMix                 (FMOD_DSP *dsp, float *prewet, float *postwet, float *dry);\nFMOD_RESULT F_API FMOD_DSP_SetChannelFormat             (FMOD_DSP *dsp, FMOD_CHANNELMASK channelmask, int numchannels, FMOD_SPEAKERMODE source_speakermode);\nFMOD_RESULT F_API FMOD_DSP_GetChannelFormat             (FMOD_DSP *dsp, FMOD_CHANNELMASK *channelmask, int *numchannels, FMOD_SPEAKERMODE *source_speakermode);\nFMOD_RESULT F_API FMOD_DSP_GetOutputChannelFormat       (FMOD_DSP *dsp, FMOD_CHANNELMASK inmask, int inchannels, FMOD_SPEAKERMODE inspeakermode, FMOD_CHANNELMASK *outmask, int *outchannels, FMOD_SPEAKERMODE *outspeakermode);\nFMOD_RESULT F_API FMOD_DSP_Reset                        (FMOD_DSP *dsp);\n\n/*\n     DSP parameter control.\n*/\n\nFMOD_RESULT F_API FMOD_DSP_SetParameterFloat            (FMOD_DSP *dsp, int index, float value);\nFMOD_RESULT F_API FMOD_DSP_SetParameterInt              (FMOD_DSP *dsp, int index, int value);\nFMOD_RESULT F_API FMOD_DSP_SetParameterBool             (FMOD_DSP *dsp, int index, FMOD_BOOL value);\nFMOD_RESULT F_API FMOD_DSP_SetParameterData             (FMOD_DSP *dsp, int index, void *data, unsigned int length);\nFMOD_RESULT F_API FMOD_DSP_GetParameterFloat            (FMOD_DSP *dsp, int index, float *value, char *valuestr, int valuestrlen);\nFMOD_RESULT F_API FMOD_DSP_GetParameterInt              (FMOD_DSP *dsp, int index, int *value, char *valuestr, int valuestrlen);\nFMOD_RESULT F_API FMOD_DSP_GetParameterBool             (FMOD_DSP *dsp, int index, FMOD_BOOL *value, char *valuestr, int valuestrlen);\nFMOD_RESULT F_API FMOD_DSP_GetParameterData             (FMOD_DSP *dsp, int index, void **data, unsigned int *length, char *valuestr, int valuestrlen);\nFMOD_RESULT F_API FMOD_DSP_GetNumParameters             (FMOD_DSP *dsp, int *numparams);\nFMOD_RESULT F_API FMOD_DSP_GetParameterInfo             (FMOD_DSP *dsp, int index, FMOD_DSP_PARAMETER_DESC **desc);\nFMOD_RESULT F_API FMOD_DSP_GetDataParameterIndex        (FMOD_DSP *dsp, int datatype, int *index);\nFMOD_RESULT F_API FMOD_DSP_ShowConfigDialog             (FMOD_DSP *dsp, void *hwnd, FMOD_BOOL show);\n\n/*\n     DSP attributes.\n*/\n\nFMOD_RESULT F_API FMOD_DSP_GetInfo                      (FMOD_DSP *dsp, char *name, unsigned int *version, int *channels, int *configwidth, int *configheight);\nFMOD_RESULT F_API FMOD_DSP_GetType                      (FMOD_DSP *dsp, FMOD_DSP_TYPE *type);\nFMOD_RESULT F_API FMOD_DSP_GetIdle                      (FMOD_DSP *dsp, FMOD_BOOL *idle);\n\n/*\n     Userdata set/get.\n*/\n\nFMOD_RESULT F_API FMOD_DSP_SetUserData                  (FMOD_DSP *dsp, void *userdata);\nFMOD_RESULT F_API FMOD_DSP_GetUserData                  (FMOD_DSP *dsp, void **userdata);\n\n/*\n     Metering.\n*/\n\nFMOD_RESULT F_API FMOD_DSP_SetMeteringEnabled           (FMOD_DSP *dsp, FMOD_BOOL inputEnabled, FMOD_BOOL outputEnabled);\nFMOD_RESULT F_API FMOD_DSP_GetMeteringEnabled           (FMOD_DSP *dsp, FMOD_BOOL *inputEnabled, FMOD_BOOL *outputEnabled);\nFMOD_RESULT F_API FMOD_DSP_GetMeteringInfo              (FMOD_DSP *dsp, FMOD_DSP_METERING_INFO *inputInfo, FMOD_DSP_METERING_INFO *outputInfo);\nFMOD_RESULT F_API FMOD_DSP_GetCPUUsage                  (FMOD_DSP *dsp, unsigned int *exclusive, unsigned int *inclusive);\n\n/*\n    'DSPConnection' API\n*/\n\nFMOD_RESULT F_API FMOD_DSPConnection_GetInput           (FMOD_DSPCONNECTION *dspconnection, FMOD_DSP **input);\nFMOD_RESULT F_API FMOD_DSPConnection_GetOutput          (FMOD_DSPCONNECTION *dspconnection, FMOD_DSP **output);\nFMOD_RESULT F_API FMOD_DSPConnection_SetMix             (FMOD_DSPCONNECTION *dspconnection, float volume);\nFMOD_RESULT F_API FMOD_DSPConnection_GetMix             (FMOD_DSPCONNECTION *dspconnection, float *volume);\nFMOD_RESULT F_API FMOD_DSPConnection_SetMixMatrix       (FMOD_DSPCONNECTION *dspconnection, float *matrix, int outchannels, int inchannels, int inchannel_hop);\nFMOD_RESULT F_API FMOD_DSPConnection_GetMixMatrix       (FMOD_DSPCONNECTION *dspconnection, float *matrix, int *outchannels, int *inchannels, int inchannel_hop);\nFMOD_RESULT F_API FMOD_DSPConnection_GetType            (FMOD_DSPCONNECTION *dspconnection, FMOD_DSPCONNECTION_TYPE *type);\n\n/*\n     Userdata set/get.\n*/\n\nFMOD_RESULT F_API FMOD_DSPConnection_SetUserData        (FMOD_DSPCONNECTION *dspconnection, void *userdata);\nFMOD_RESULT F_API FMOD_DSPConnection_GetUserData        (FMOD_DSPCONNECTION *dspconnection, void **userdata);\n\n/*\n    'Geometry' API\n*/\n\nFMOD_RESULT F_API FMOD_Geometry_Release                 (FMOD_GEOMETRY *geometry);\n\n/*\n     Polygon manipulation.\n*/\n\nFMOD_RESULT F_API FMOD_Geometry_AddPolygon              (FMOD_GEOMETRY *geometry, float directocclusion, float reverbocclusion, FMOD_BOOL doublesided, int numvertices, const FMOD_VECTOR *vertices, int *polygonindex);\nFMOD_RESULT F_API FMOD_Geometry_GetNumPolygons          (FMOD_GEOMETRY *geometry, int *numpolygons);\nFMOD_RESULT F_API FMOD_Geometry_GetMaxPolygons          (FMOD_GEOMETRY *geometry, int *maxpolygons, int *maxvertices);\nFMOD_RESULT F_API FMOD_Geometry_GetPolygonNumVertices   (FMOD_GEOMETRY *geometry, int index, int *numvertices);\nFMOD_RESULT F_API FMOD_Geometry_SetPolygonVertex        (FMOD_GEOMETRY *geometry, int index, int vertexindex, const FMOD_VECTOR *vertex);\nFMOD_RESULT F_API FMOD_Geometry_GetPolygonVertex        (FMOD_GEOMETRY *geometry, int index, int vertexindex, FMOD_VECTOR *vertex);\nFMOD_RESULT F_API FMOD_Geometry_SetPolygonAttributes    (FMOD_GEOMETRY *geometry, int index, float directocclusion, float reverbocclusion, FMOD_BOOL doublesided);\nFMOD_RESULT F_API FMOD_Geometry_GetPolygonAttributes    (FMOD_GEOMETRY *geometry, int index, float *directocclusion, float *reverbocclusion, FMOD_BOOL *doublesided);\n\n/*\n     Object manipulation.\n*/\n\nFMOD_RESULT F_API FMOD_Geometry_SetActive               (FMOD_GEOMETRY *geometry, FMOD_BOOL active);\nFMOD_RESULT F_API FMOD_Geometry_GetActive               (FMOD_GEOMETRY *geometry, FMOD_BOOL *active);\nFMOD_RESULT F_API FMOD_Geometry_SetRotation             (FMOD_GEOMETRY *geometry, const FMOD_VECTOR *forward, const FMOD_VECTOR *up);\nFMOD_RESULT F_API FMOD_Geometry_GetRotation             (FMOD_GEOMETRY *geometry, FMOD_VECTOR *forward, FMOD_VECTOR *up);\nFMOD_RESULT F_API FMOD_Geometry_SetPosition             (FMOD_GEOMETRY *geometry, const FMOD_VECTOR *position);\nFMOD_RESULT F_API FMOD_Geometry_GetPosition             (FMOD_GEOMETRY *geometry, FMOD_VECTOR *position);\nFMOD_RESULT F_API FMOD_Geometry_SetScale                (FMOD_GEOMETRY *geometry, const FMOD_VECTOR *scale);\nFMOD_RESULT F_API FMOD_Geometry_GetScale                (FMOD_GEOMETRY *geometry, FMOD_VECTOR *scale);\nFMOD_RESULT F_API FMOD_Geometry_Save                    (FMOD_GEOMETRY *geometry, void *data, int *datasize);\n\n/*\n     Userdata set/get.\n*/\n\nFMOD_RESULT F_API FMOD_Geometry_SetUserData             (FMOD_GEOMETRY *geometry, void *userdata);\nFMOD_RESULT F_API FMOD_Geometry_GetUserData             (FMOD_GEOMETRY *geometry, void **userdata);\n\n/*\n    'Reverb3D' API\n*/\n\nFMOD_RESULT F_API FMOD_Reverb3D_Release                 (FMOD_REVERB3D *reverb3d);\n\n/*\n     Reverb manipulation.\n*/\n\nFMOD_RESULT F_API FMOD_Reverb3D_Set3DAttributes         (FMOD_REVERB3D *reverb3d, const FMOD_VECTOR *position, float mindistance, float maxdistance);\nFMOD_RESULT F_API FMOD_Reverb3D_Get3DAttributes         (FMOD_REVERB3D *reverb3d, FMOD_VECTOR *position, float *mindistance, float *maxdistance);\nFMOD_RESULT F_API FMOD_Reverb3D_SetProperties           (FMOD_REVERB3D *reverb3d, const FMOD_REVERB_PROPERTIES *properties);\nFMOD_RESULT F_API FMOD_Reverb3D_GetProperties           (FMOD_REVERB3D *reverb3d, FMOD_REVERB_PROPERTIES *properties);\nFMOD_RESULT F_API FMOD_Reverb3D_SetActive               (FMOD_REVERB3D *reverb3d, FMOD_BOOL active);\nFMOD_RESULT F_API FMOD_Reverb3D_GetActive               (FMOD_REVERB3D *reverb3d, FMOD_BOOL *active);\n\n/*\n     Userdata set/get.\n*/\n\nFMOD_RESULT F_API FMOD_Reverb3D_SetUserData             (FMOD_REVERB3D *reverb3d, void *userdata);\nFMOD_RESULT F_API FMOD_Reverb3D_GetUserData             (FMOD_REVERB3D *reverb3d, void **userdata);\n\n/*$ preserve start $*/\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* _FMOD_H */\n\n/*$ preserve end $*/\n"
  },
  {
    "path": "Plugins/FMODStudio/Source/FMODStudio/Public/FMOD/fmod.hpp",
    "content": "/* ========================================================================================== */\n/* FMOD Studio - C++ header file. Copyright (c), Firelight Technologies Pty, Ltd. 2004-2020.  */\n/*                                                                                            */\n/* Use this header in conjunction with fmod_common.h (which contains all the constants /      */\n/* callbacks) to develop using C++ classes.                                                   */\n/* ========================================================================================== */\n\n#ifndef _FMOD_HPP\n#define _FMOD_HPP\n\n#include \"fmod_common.h\"\n#include \"fmod.h\"\n\n/*\n    Constant and defines\n*/\n\n/*\n    FMOD Namespace\n*/\nnamespace FMOD\n{\n    class System;\n    class Sound;\n    class ChannelControl;\n    class Channel;\n    class ChannelGroup;\n    class SoundGroup;\n    class DSP;\n    class DSPConnection;\n    class Geometry;\n    class Reverb3D;\n\n    /*\n        FMOD global system functions (optional).\n    */\n    inline FMOD_RESULT Memory_Initialize    (void *poolmem, int poollen, FMOD_MEMORY_ALLOC_CALLBACK useralloc, FMOD_MEMORY_REALLOC_CALLBACK userrealloc, FMOD_MEMORY_FREE_CALLBACK userfree, FMOD_MEMORY_TYPE memtypeflags = FMOD_MEMORY_ALL) { return FMOD_Memory_Initialize(poolmem, poollen, useralloc, userrealloc, userfree, memtypeflags); }\n    inline FMOD_RESULT Memory_GetStats      (int *currentalloced, int *maxalloced, bool blocking = true) { return FMOD_Memory_GetStats(currentalloced, maxalloced, blocking); }\n    inline FMOD_RESULT Debug_Initialize     (FMOD_DEBUG_FLAGS flags, FMOD_DEBUG_MODE mode = FMOD_DEBUG_MODE_TTY, FMOD_DEBUG_CALLBACK callback = 0, const char *filename = 0) { return FMOD_Debug_Initialize(flags, mode, callback, filename); }\n    inline FMOD_RESULT File_SetDiskBusy     (int busy) { return FMOD_File_SetDiskBusy(busy); }\n    inline FMOD_RESULT File_GetDiskBusy     (int *busy) { return FMOD_File_GetDiskBusy(busy); }\n\n    /*\n        FMOD System factory functions.\n    */\n    inline FMOD_RESULT System_Create        (System **system) { return FMOD_System_Create((FMOD_SYSTEM **)system); }\n\n    /*\n       'System' API\n    */\n    class System\n    {\n      private:\n\n        // Constructor made private so user cannot statically instance a System class.  System_Create must be used.\n        System();\n        System(const System &);\n\n      public:\n\n        FMOD_RESULT F_API release                 ();\n\n        // Setup functions.\n        FMOD_RESULT F_API setOutput               (FMOD_OUTPUTTYPE output);\n        FMOD_RESULT F_API getOutput               (FMOD_OUTPUTTYPE *output);\n        FMOD_RESULT F_API getNumDrivers           (int *numdrivers);\n        FMOD_RESULT F_API getDriverInfo           (int id, char *name, int namelen, FMOD_GUID *guid, int *systemrate, FMOD_SPEAKERMODE *speakermode, int *speakermodechannels);\n        FMOD_RESULT F_API setDriver               (int driver);\n        FMOD_RESULT F_API getDriver               (int *driver);\n        FMOD_RESULT F_API setSoftwareChannels     (int numsoftwarechannels);\n        FMOD_RESULT F_API getSoftwareChannels     (int *numsoftwarechannels);\n        FMOD_RESULT F_API setSoftwareFormat       (int samplerate, FMOD_SPEAKERMODE speakermode, int numrawspeakers);\n        FMOD_RESULT F_API getSoftwareFormat       (int *samplerate, FMOD_SPEAKERMODE *speakermode, int *numrawspeakers);\n        FMOD_RESULT F_API setDSPBufferSize        (unsigned int bufferlength, int numbuffers);\n        FMOD_RESULT F_API getDSPBufferSize        (unsigned int *bufferlength, int *numbuffers);\n        FMOD_RESULT F_API setFileSystem           (FMOD_FILE_OPEN_CALLBACK useropen, FMOD_FILE_CLOSE_CALLBACK userclose, FMOD_FILE_READ_CALLBACK userread, FMOD_FILE_SEEK_CALLBACK userseek, FMOD_FILE_ASYNCREAD_CALLBACK userasyncread, FMOD_FILE_ASYNCCANCEL_CALLBACK userasynccancel, int blockalign);\n        FMOD_RESULT F_API attachFileSystem        (FMOD_FILE_OPEN_CALLBACK useropen, FMOD_FILE_CLOSE_CALLBACK userclose, FMOD_FILE_READ_CALLBACK userread, FMOD_FILE_SEEK_CALLBACK userseek);\n        FMOD_RESULT F_API setAdvancedSettings     (FMOD_ADVANCEDSETTINGS *settings);\n        FMOD_RESULT F_API getAdvancedSettings     (FMOD_ADVANCEDSETTINGS *settings);\n        FMOD_RESULT F_API setCallback             (FMOD_SYSTEM_CALLBACK callback, FMOD_SYSTEM_CALLBACK_TYPE callbackmask = FMOD_SYSTEM_CALLBACK_ALL);\n\n        // Plug-in support.\n        FMOD_RESULT F_API setPluginPath           (const char *path);\n        FMOD_RESULT F_API loadPlugin              (const char *filename, unsigned int *handle, unsigned int priority = 0);\n        FMOD_RESULT F_API unloadPlugin            (unsigned int handle);\n        FMOD_RESULT F_API getNumNestedPlugins     (unsigned int handle, int *count);\n        FMOD_RESULT F_API getNestedPlugin         (unsigned int handle, int index, unsigned int *nestedhandle);\n        FMOD_RESULT F_API getNumPlugins           (FMOD_PLUGINTYPE plugintype, int *numplugins);\n        FMOD_RESULT F_API getPluginHandle         (FMOD_PLUGINTYPE plugintype, int index, unsigned int *handle);\n        FMOD_RESULT F_API getPluginInfo           (unsigned int handle, FMOD_PLUGINTYPE *plugintype, char *name, int namelen, unsigned int *version);\n        FMOD_RESULT F_API setOutputByPlugin       (unsigned int handle);\n        FMOD_RESULT F_API getOutputByPlugin       (unsigned int *handle);\n        FMOD_RESULT F_API createDSPByPlugin       (unsigned int handle, DSP **dsp);\n        FMOD_RESULT F_API getDSPInfoByPlugin      (unsigned int handle, const FMOD_DSP_DESCRIPTION **description);\n        FMOD_RESULT F_API registerCodec           (FMOD_CODEC_DESCRIPTION *description, unsigned int *handle, unsigned int priority = 0);\n        FMOD_RESULT F_API registerDSP             (const FMOD_DSP_DESCRIPTION *description, unsigned int *handle);\n        FMOD_RESULT F_API registerOutput          (const FMOD_OUTPUT_DESCRIPTION *description, unsigned int *handle);\n\n        // Init/Close.\n        FMOD_RESULT F_API init                    (int maxchannels, FMOD_INITFLAGS flags, void *extradriverdata);\n        FMOD_RESULT F_API close                   ();\n\n        // General post-init system functions.\n        FMOD_RESULT F_API update                  ();        /* IMPORTANT! CALL THIS ONCE PER FRAME! */\n\n        FMOD_RESULT F_API setSpeakerPosition      (FMOD_SPEAKER speaker, float x, float y, bool active);\n        FMOD_RESULT F_API getSpeakerPosition      (FMOD_SPEAKER speaker, float *x, float *y, bool *active);\n        FMOD_RESULT F_API setStreamBufferSize     (unsigned int filebuffersize, FMOD_TIMEUNIT filebuffersizetype);\n        FMOD_RESULT F_API getStreamBufferSize     (unsigned int *filebuffersize, FMOD_TIMEUNIT *filebuffersizetype);\n        FMOD_RESULT F_API set3DSettings           (float dopplerscale, float distancefactor, float rolloffscale);\n        FMOD_RESULT F_API get3DSettings           (float *dopplerscale, float *distancefactor, float *rolloffscale);\n        FMOD_RESULT F_API set3DNumListeners       (int numlisteners);\n        FMOD_RESULT F_API get3DNumListeners       (int *numlisteners);\n        FMOD_RESULT F_API set3DListenerAttributes (int listener, const FMOD_VECTOR *pos, const FMOD_VECTOR *vel, const FMOD_VECTOR *forward, const FMOD_VECTOR *up);\n        FMOD_RESULT F_API get3DListenerAttributes (int listener, FMOD_VECTOR *pos, FMOD_VECTOR *vel, FMOD_VECTOR *forward, FMOD_VECTOR *up);\n        FMOD_RESULT F_API set3DRolloffCallback    (FMOD_3D_ROLLOFF_CALLBACK callback);\n        FMOD_RESULT F_API mixerSuspend            ();\n        FMOD_RESULT F_API mixerResume             ();\n        FMOD_RESULT F_API getDefaultMixMatrix     (FMOD_SPEAKERMODE sourcespeakermode, FMOD_SPEAKERMODE targetspeakermode, float *matrix, int matrixhop);\n        FMOD_RESULT F_API getSpeakerModeChannels  (FMOD_SPEAKERMODE mode, int *channels);\n\n        // System information functions.\n        FMOD_RESULT F_API getVersion              (unsigned int *version);\n        FMOD_RESULT F_API getOutputHandle         (void **handle);\n        FMOD_RESULT F_API getChannelsPlaying      (int *channels, int *realchannels = 0);\n        FMOD_RESULT F_API getCPUUsage             (float *dsp, float *stream, float *geometry, float *update, float *total);\n        FMOD_RESULT F_API getFileUsage            (long long *sampleBytesRead, long long *streamBytesRead, long long *otherBytesRead);\n        FMOD_RESULT F_API getSoundRAM             (int *currentalloced, int *maxalloced, int *total);\n\n        // Sound/DSP/Channel/FX creation and retrieval.\n        FMOD_RESULT F_API createSound             (const char *name_or_data, FMOD_MODE mode, FMOD_CREATESOUNDEXINFO *exinfo, Sound **sound);\n        FMOD_RESULT F_API createStream            (const char *name_or_data, FMOD_MODE mode, FMOD_CREATESOUNDEXINFO *exinfo, Sound **sound);\n        FMOD_RESULT F_API createDSP               (const FMOD_DSP_DESCRIPTION *description, DSP **dsp);\n        FMOD_RESULT F_API createDSPByType         (FMOD_DSP_TYPE type, DSP **dsp);\n        FMOD_RESULT F_API createChannelGroup      (const char *name, ChannelGroup **channelgroup);\n        FMOD_RESULT F_API createSoundGroup        (const char *name, SoundGroup **soundgroup);\n        FMOD_RESULT F_API createReverb3D          (Reverb3D **reverb);\n\n        FMOD_RESULT F_API playSound               (Sound *sound, ChannelGroup *channelgroup, bool paused, Channel **channel);\n        FMOD_RESULT F_API playDSP                 (DSP *dsp, ChannelGroup *channelgroup, bool paused, Channel **channel);\n        FMOD_RESULT F_API getChannel              (int channelid, Channel **channel);\n        FMOD_RESULT F_API getMasterChannelGroup   (ChannelGroup **channelgroup);\n        FMOD_RESULT F_API getMasterSoundGroup     (SoundGroup **soundgroup);\n\n        // Routing to ports.\n        FMOD_RESULT F_API attachChannelGroupToPort   (FMOD_PORT_TYPE portType, FMOD_PORT_INDEX portIndex, ChannelGroup *channelgroup, bool passThru = false);\n        FMOD_RESULT F_API detachChannelGroupFromPort (ChannelGroup *channelgroup);\n\n        // Reverb API.\n        FMOD_RESULT F_API setReverbProperties     (int instance, const FMOD_REVERB_PROPERTIES *prop);\n        FMOD_RESULT F_API getReverbProperties     (int instance, FMOD_REVERB_PROPERTIES *prop);\n\n        // System level DSP functionality.\n        FMOD_RESULT F_API lockDSP                 ();\n        FMOD_RESULT F_API unlockDSP               ();\n\n        // Recording API.\n        FMOD_RESULT F_API getRecordNumDrivers     (int *numdrivers, int *numconnected);\n        FMOD_RESULT F_API getRecordDriverInfo     (int id, char *name, int namelen, FMOD_GUID *guid, int *systemrate, FMOD_SPEAKERMODE *speakermode, int *speakermodechannels, FMOD_DRIVER_STATE *state);\n        FMOD_RESULT F_API getRecordPosition       (int id, unsigned int *position);\n        FMOD_RESULT F_API recordStart             (int id, Sound *sound, bool loop);\n        FMOD_RESULT F_API recordStop              (int id);\n        FMOD_RESULT F_API isRecording             (int id, bool *recording);\n\n        // Geometry API.\n        FMOD_RESULT F_API createGeometry          (int maxpolygons, int maxvertices, Geometry **geometry);\n        FMOD_RESULT F_API setGeometrySettings     (float maxworldsize);\n        FMOD_RESULT F_API getGeometrySettings     (float *maxworldsize);\n        FMOD_RESULT F_API loadGeometry            (const void *data, int datasize, Geometry **geometry);\n        FMOD_RESULT F_API getGeometryOcclusion    (const FMOD_VECTOR *listener, const FMOD_VECTOR *source, float *direct, float *reverb);\n\n        // Network functions.\n        FMOD_RESULT F_API setNetworkProxy         (const char *proxy);\n        FMOD_RESULT F_API getNetworkProxy         (char *proxy, int proxylen);\n        FMOD_RESULT F_API setNetworkTimeout       (int timeout);\n        FMOD_RESULT F_API getNetworkTimeout       (int *timeout);\n\n        // Userdata set/get.\n        FMOD_RESULT F_API setUserData             (void *userdata);\n        FMOD_RESULT F_API getUserData             (void **userdata);\n    };\n\n    /*\n        'Sound' API\n    */\n    class Sound\n    {\n      private:\n\n        // Constructor made private so user cannot statically instance a Sound class.  Appropriate Sound creation or retrieval function must be used.\n        Sound();\n        Sound(const Sound &);\n\n      public:\n\n        FMOD_RESULT F_API release                ();\n        FMOD_RESULT F_API getSystemObject        (System **system);\n\n        // Standard sound manipulation functions.\n        FMOD_RESULT F_API lock                   (unsigned int offset, unsigned int length, void **ptr1, void **ptr2, unsigned int *len1, unsigned int *len2);\n        FMOD_RESULT F_API unlock                 (void *ptr1, void *ptr2, unsigned int len1, unsigned int len2);\n        FMOD_RESULT F_API setDefaults            (float frequency, int priority);\n        FMOD_RESULT F_API getDefaults            (float *frequency, int *priority);\n        FMOD_RESULT F_API set3DMinMaxDistance    (float min, float max);\n        FMOD_RESULT F_API get3DMinMaxDistance    (float *min, float *max);\n        FMOD_RESULT F_API set3DConeSettings      (float insideconeangle, float outsideconeangle, float outsidevolume);\n        FMOD_RESULT F_API get3DConeSettings      (float *insideconeangle, float *outsideconeangle, float *outsidevolume);\n        FMOD_RESULT F_API set3DCustomRolloff     (FMOD_VECTOR *points, int numpoints);\n        FMOD_RESULT F_API get3DCustomRolloff     (FMOD_VECTOR **points, int *numpoints);\n        FMOD_RESULT F_API getSubSound            (int index, Sound **subsound);\n        FMOD_RESULT F_API getSubSoundParent      (Sound **parentsound);\n        FMOD_RESULT F_API getName                (char *name, int namelen);\n        FMOD_RESULT F_API getLength              (unsigned int *length, FMOD_TIMEUNIT lengthtype);\n        FMOD_RESULT F_API getFormat              (FMOD_SOUND_TYPE *type, FMOD_SOUND_FORMAT *format, int *channels, int *bits);\n        FMOD_RESULT F_API getNumSubSounds        (int *numsubsounds);\n        FMOD_RESULT F_API getNumTags             (int *numtags, int *numtagsupdated);\n        FMOD_RESULT F_API getTag                 (const char *name, int index, FMOD_TAG *tag);\n        FMOD_RESULT F_API getOpenState           (FMOD_OPENSTATE *openstate, unsigned int *percentbuffered, bool *starving, bool *diskbusy);\n        FMOD_RESULT F_API readData               (void *buffer, unsigned int length, unsigned int *read);\n        FMOD_RESULT F_API seekData               (unsigned int pcm);\n\n        FMOD_RESULT F_API setSoundGroup          (SoundGroup *soundgroup);\n        FMOD_RESULT F_API getSoundGroup          (SoundGroup **soundgroup);\n\n        // Synchronization point API.  These points can come from markers embedded in wav files, and can also generate channel callbacks.\n        FMOD_RESULT F_API getNumSyncPoints       (int *numsyncpoints);\n        FMOD_RESULT F_API getSyncPoint           (int index, FMOD_SYNCPOINT **point);\n        FMOD_RESULT F_API getSyncPointInfo       (FMOD_SYNCPOINT *point, char *name, int namelen, unsigned int *offset, FMOD_TIMEUNIT offsettype);\n        FMOD_RESULT F_API addSyncPoint           (unsigned int offset, FMOD_TIMEUNIT offsettype, const char *name, FMOD_SYNCPOINT **point);\n        FMOD_RESULT F_API deleteSyncPoint        (FMOD_SYNCPOINT *point);\n\n        // Functions also in Channel class but here they are the 'default' to save having to change it in Channel all the time.\n        FMOD_RESULT F_API setMode                (FMOD_MODE mode);\n        FMOD_RESULT F_API getMode                (FMOD_MODE *mode);\n        FMOD_RESULT F_API setLoopCount           (int loopcount);\n        FMOD_RESULT F_API getLoopCount           (int *loopcount);\n        FMOD_RESULT F_API setLoopPoints          (unsigned int loopstart, FMOD_TIMEUNIT loopstarttype, unsigned int loopend, FMOD_TIMEUNIT loopendtype);\n        FMOD_RESULT F_API getLoopPoints          (unsigned int *loopstart, FMOD_TIMEUNIT loopstarttype, unsigned int *loopend, FMOD_TIMEUNIT loopendtype);\n\n        // For MOD/S3M/XM/IT/MID sequenced formats only.\n        FMOD_RESULT F_API getMusicNumChannels    (int *numchannels);\n        FMOD_RESULT F_API setMusicChannelVolume  (int channel, float volume);\n        FMOD_RESULT F_API getMusicChannelVolume  (int channel, float *volume);\n        FMOD_RESULT F_API setMusicSpeed          (float speed);\n        FMOD_RESULT F_API getMusicSpeed          (float *speed);\n\n        // Userdata set/get.\n        FMOD_RESULT F_API setUserData            (void *userdata);\n        FMOD_RESULT F_API getUserData            (void **userdata);\n    };\n\n\n    /*\n        'ChannelControl API'.   This is a base class for Channel and ChannelGroup so they can share the same functionality.  This cannot be used or instansiated explicitly.\n    */\n    class ChannelControl\n    {\n      private:\n\n        // Constructor made private so user cannot statically instance a Control class.\n        ChannelControl();\n        ChannelControl(const ChannelControl &);\n\n      public:\n\n        FMOD_RESULT F_API getSystemObject        (System **system);\n\n        // General control functionality for Channels and ChannelGroups.\n        FMOD_RESULT F_API stop                   ();\n        FMOD_RESULT F_API setPaused              (bool paused);\n        FMOD_RESULT F_API getPaused              (bool *paused);\n        FMOD_RESULT F_API setVolume              (float volume);\n        FMOD_RESULT F_API getVolume              (float *volume);\n        FMOD_RESULT F_API setVolumeRamp          (bool ramp);\n        FMOD_RESULT F_API getVolumeRamp          (bool *ramp);\n        FMOD_RESULT F_API getAudibility          (float *audibility);\n        FMOD_RESULT F_API setPitch               (float pitch);\n        FMOD_RESULT F_API getPitch               (float *pitch);\n        FMOD_RESULT F_API setMute                (bool mute);\n        FMOD_RESULT F_API getMute                (bool *mute);\n        FMOD_RESULT F_API setReverbProperties    (int instance, float wet);\n        FMOD_RESULT F_API getReverbProperties    (int instance, float *wet);\n        FMOD_RESULT F_API setLowPassGain         (float gain);\n        FMOD_RESULT F_API getLowPassGain         (float *gain);\n        FMOD_RESULT F_API setMode                (FMOD_MODE mode);\n        FMOD_RESULT F_API getMode                (FMOD_MODE *mode);\n        FMOD_RESULT F_API setCallback            (FMOD_CHANNELCONTROL_CALLBACK callback);\n        FMOD_RESULT F_API isPlaying              (bool *isplaying);\n\n        // Panning and level adjustment.\n        // Note all 'set' functions alter a final matrix, this is why the only get function is getMixMatrix, to avoid other get functions returning incorrect/obsolete values.\n        FMOD_RESULT F_API setPan                 (float pan);\n        FMOD_RESULT F_API setMixLevelsOutput     (float frontleft, float frontright, float center, float lfe, float surroundleft, float surroundright, float backleft, float backright);\n        FMOD_RESULT F_API setMixLevelsInput      (float *levels, int numlevels);\n        FMOD_RESULT F_API setMixMatrix           (float *matrix, int outchannels, int inchannels, int inchannel_hop = 0);\n        FMOD_RESULT F_API getMixMatrix           (float *matrix, int *outchannels, int *inchannels, int inchannel_hop = 0);\n\n        // Clock based functionality.\n        FMOD_RESULT F_API getDSPClock            (unsigned long long *dspclock, unsigned long long *parentclock);\n        FMOD_RESULT F_API setDelay               (unsigned long long dspclock_start, unsigned long long dspclock_end, bool stopchannels = true);\n        FMOD_RESULT F_API getDelay               (unsigned long long *dspclock_start, unsigned long long *dspclock_end, bool *stopchannels = 0);\n        FMOD_RESULT F_API addFadePoint           (unsigned long long dspclock, float volume);\n        FMOD_RESULT F_API setFadePointRamp       (unsigned long long dspclock, float volume);\n        FMOD_RESULT F_API removeFadePoints       (unsigned long long dspclock_start, unsigned long long dspclock_end);\n        FMOD_RESULT F_API getFadePoints          (unsigned int *numpoints, unsigned long long *point_dspclock, float *point_volume);\n\n        // DSP effects.\n        FMOD_RESULT F_API getDSP                 (int index, DSP **dsp);\n        FMOD_RESULT F_API addDSP                 (int index, DSP *dsp);\n        FMOD_RESULT F_API removeDSP              (DSP *dsp);\n        FMOD_RESULT F_API getNumDSPs             (int *numdsps);\n        FMOD_RESULT F_API setDSPIndex            (DSP *dsp, int index);\n        FMOD_RESULT F_API getDSPIndex            (DSP *dsp, int *index);\n\n        // 3D functionality.\n        FMOD_RESULT F_API set3DAttributes        (const FMOD_VECTOR *pos, const FMOD_VECTOR *vel, const FMOD_VECTOR *alt_pan_pos = 0);\n        FMOD_RESULT F_API get3DAttributes        (FMOD_VECTOR *pos, FMOD_VECTOR *vel, FMOD_VECTOR *alt_pan_pos = 0);\n        FMOD_RESULT F_API set3DMinMaxDistance    (float mindistance, float maxdistance);\n        FMOD_RESULT F_API get3DMinMaxDistance    (float *mindistance, float *maxdistance);\n        FMOD_RESULT F_API set3DConeSettings      (float insideconeangle, float outsideconeangle, float outsidevolume);\n        FMOD_RESULT F_API get3DConeSettings      (float *insideconeangle, float *outsideconeangle, float *outsidevolume);\n        FMOD_RESULT F_API set3DConeOrientation   (FMOD_VECTOR *orientation);\n        FMOD_RESULT F_API get3DConeOrientation   (FMOD_VECTOR *orientation);\n        FMOD_RESULT F_API set3DCustomRolloff     (FMOD_VECTOR *points, int numpoints);\n        FMOD_RESULT F_API get3DCustomRolloff     (FMOD_VECTOR **points, int *numpoints);\n        FMOD_RESULT F_API set3DOcclusion         (float directocclusion, float reverbocclusion);\n        FMOD_RESULT F_API get3DOcclusion         (float *directocclusion, float *reverbocclusion);\n        FMOD_RESULT F_API set3DSpread            (float angle);\n        FMOD_RESULT F_API get3DSpread            (float *angle);\n        FMOD_RESULT F_API set3DLevel             (float level);\n        FMOD_RESULT F_API get3DLevel             (float *level);\n        FMOD_RESULT F_API set3DDopplerLevel      (float level);\n        FMOD_RESULT F_API get3DDopplerLevel      (float *level);\n        FMOD_RESULT F_API set3DDistanceFilter    (bool custom, float customLevel, float centerFreq);\n        FMOD_RESULT F_API get3DDistanceFilter    (bool *custom, float *customLevel, float *centerFreq);\n\n        // Userdata set/get.\n        FMOD_RESULT F_API setUserData            (void *userdata);\n        FMOD_RESULT F_API getUserData            (void **userdata);\n    };\n\n    /*\n        'Channel' API.\n    */\n    class Channel : public ChannelControl\n    {\n      private:\n\n        // Constructor made private so user cannot statically instance a Channel class.  Appropriate Channel creation or retrieval function must be used.\n        Channel();\n        Channel(const Channel &);\n\n      public:\n\n        // Channel specific control functionality.\n        FMOD_RESULT F_API setFrequency           (float frequency);\n        FMOD_RESULT F_API getFrequency           (float *frequency);\n        FMOD_RESULT F_API setPriority            (int priority);\n        FMOD_RESULT F_API getPriority            (int *priority);\n        FMOD_RESULT F_API setPosition            (unsigned int position, FMOD_TIMEUNIT postype);\n        FMOD_RESULT F_API getPosition            (unsigned int *position, FMOD_TIMEUNIT postype);\n        FMOD_RESULT F_API setChannelGroup        (ChannelGroup *channelgroup);\n        FMOD_RESULT F_API getChannelGroup        (ChannelGroup **channelgroup);\n        FMOD_RESULT F_API setLoopCount           (int loopcount);\n        FMOD_RESULT F_API getLoopCount           (int *loopcount);\n        FMOD_RESULT F_API setLoopPoints          (unsigned int loopstart, FMOD_TIMEUNIT loopstarttype, unsigned int loopend, FMOD_TIMEUNIT loopendtype);\n        FMOD_RESULT F_API getLoopPoints          (unsigned int *loopstart, FMOD_TIMEUNIT loopstarttype, unsigned int *loopend, FMOD_TIMEUNIT loopendtype);\n\n        // Information only functions.\n        FMOD_RESULT F_API isVirtual              (bool *isvirtual);\n        FMOD_RESULT F_API getCurrentSound        (Sound **sound);\n        FMOD_RESULT F_API getIndex               (int *index);\n    };\n\n    /*\n        'ChannelGroup' API\n    */\n    class ChannelGroup : public ChannelControl\n    {\n      private:\n\n        // Constructor made private so user cannot statically instance a ChannelGroup class.  Appropriate ChannelGroup creation or retrieval function must be used.\n        ChannelGroup();\n        ChannelGroup(const ChannelGroup &);\n\n      public:\n\n        FMOD_RESULT F_API release                 ();\n\n        // Nested channel groups.\n        FMOD_RESULT F_API addGroup                (ChannelGroup *group, bool propagatedspclock = true, DSPConnection **connection = 0);\n        FMOD_RESULT F_API getNumGroups            (int *numgroups);\n        FMOD_RESULT F_API getGroup                (int index, ChannelGroup **group);\n        FMOD_RESULT F_API getParentGroup          (ChannelGroup **group);\n\n        // Information only functions.\n        FMOD_RESULT F_API getName                 (char *name, int namelen);\n        FMOD_RESULT F_API getNumChannels          (int *numchannels);\n        FMOD_RESULT F_API getChannel              (int index, Channel **channel);\n    };\n\n    /*\n        'SoundGroup' API\n    */\n    class SoundGroup\n    {\n      private:\n\n        // Constructor made private so user cannot statically instance a SoundGroup class.  Appropriate SoundGroup creation or retrieval function must be used.\n        SoundGroup();\n        SoundGroup(const SoundGroup &);\n\n      public:\n\n        FMOD_RESULT F_API release                ();\n        FMOD_RESULT F_API getSystemObject        (System **system);\n\n        // SoundGroup control functions.\n        FMOD_RESULT F_API setMaxAudible          (int maxaudible);\n        FMOD_RESULT F_API getMaxAudible          (int *maxaudible);\n        FMOD_RESULT F_API setMaxAudibleBehavior  (FMOD_SOUNDGROUP_BEHAVIOR behavior);\n        FMOD_RESULT F_API getMaxAudibleBehavior  (FMOD_SOUNDGROUP_BEHAVIOR *behavior);\n        FMOD_RESULT F_API setMuteFadeSpeed       (float speed);\n        FMOD_RESULT F_API getMuteFadeSpeed       (float *speed);\n        FMOD_RESULT F_API setVolume              (float volume);\n        FMOD_RESULT F_API getVolume              (float *volume);\n        FMOD_RESULT F_API stop                   ();\n\n        // Information only functions.\n        FMOD_RESULT F_API getName                (char *name, int namelen);\n        FMOD_RESULT F_API getNumSounds           (int *numsounds);\n        FMOD_RESULT F_API getSound               (int index, Sound **sound);\n        FMOD_RESULT F_API getNumPlaying          (int *numplaying);\n\n        // Userdata set/get.\n        FMOD_RESULT F_API setUserData            (void *userdata);\n        FMOD_RESULT F_API getUserData            (void **userdata);\n    };\n\n    /*\n        'DSP' API\n    */\n    class DSP\n    {\n      private:\n\n        // Constructor made private so user cannot statically instance a DSP class.  Appropriate DSP creation or retrieval function must be used.\n        DSP();\n        DSP(const DSP &);\n\n      public:\n\n        FMOD_RESULT F_API release                ();\n        FMOD_RESULT F_API getSystemObject        (System **system);\n\n        // Connection / disconnection / input and output enumeration.\n        FMOD_RESULT F_API addInput               (DSP *input, DSPConnection **connection = 0, FMOD_DSPCONNECTION_TYPE type = FMOD_DSPCONNECTION_TYPE_STANDARD);\n        FMOD_RESULT F_API disconnectFrom         (DSP *target, DSPConnection *connection = 0);\n        FMOD_RESULT F_API disconnectAll          (bool inputs, bool outputs);\n        FMOD_RESULT F_API getNumInputs           (int *numinputs);\n        FMOD_RESULT F_API getNumOutputs          (int *numoutputs);\n        FMOD_RESULT F_API getInput               (int index, DSP **input, DSPConnection **inputconnection);\n        FMOD_RESULT F_API getOutput              (int index, DSP **output, DSPConnection **outputconnection);\n\n        // DSP unit control.\n        FMOD_RESULT F_API setActive              (bool active);\n        FMOD_RESULT F_API getActive              (bool *active);\n        FMOD_RESULT F_API setBypass              (bool bypass);\n        FMOD_RESULT F_API getBypass              (bool *bypass);\n        FMOD_RESULT F_API setWetDryMix           (float prewet, float postwet, float dry);\n        FMOD_RESULT F_API getWetDryMix           (float *prewet, float *postwet, float *dry);\n        FMOD_RESULT F_API setChannelFormat       (FMOD_CHANNELMASK channelmask, int numchannels, FMOD_SPEAKERMODE source_speakermode);\n        FMOD_RESULT F_API getChannelFormat       (FMOD_CHANNELMASK *channelmask, int *numchannels, FMOD_SPEAKERMODE *source_speakermode);\n        FMOD_RESULT F_API getOutputChannelFormat (FMOD_CHANNELMASK inmask, int inchannels, FMOD_SPEAKERMODE inspeakermode, FMOD_CHANNELMASK *outmask, int *outchannels, FMOD_SPEAKERMODE *outspeakermode);\n        FMOD_RESULT F_API reset                  ();\n\n        // DSP parameter control.\n        FMOD_RESULT F_API setParameterFloat      (int index, float value);\n        FMOD_RESULT F_API setParameterInt        (int index, int value);\n        FMOD_RESULT F_API setParameterBool       (int index, bool value);\n        FMOD_RESULT F_API setParameterData       (int index, void *data, unsigned int length);\n        FMOD_RESULT F_API getParameterFloat      (int index, float *value, char *valuestr, int valuestrlen);\n        FMOD_RESULT F_API getParameterInt        (int index, int *value, char *valuestr, int valuestrlen);\n        FMOD_RESULT F_API getParameterBool       (int index, bool *value, char *valuestr, int valuestrlen);\n        FMOD_RESULT F_API getParameterData       (int index, void **data, unsigned int *length, char *valuestr, int valuestrlen);\n        FMOD_RESULT F_API getNumParameters       (int *numparams);\n        FMOD_RESULT F_API getParameterInfo       (int index, FMOD_DSP_PARAMETER_DESC **desc);\n        FMOD_RESULT F_API getDataParameterIndex  (int datatype, int *index);\n        FMOD_RESULT F_API showConfigDialog       (void *hwnd, bool show);\n\n        // DSP attributes.\n        FMOD_RESULT F_API getInfo                (char *name, unsigned int *version, int *channels, int *configwidth, int *configheight);\n        FMOD_RESULT F_API getType                (FMOD_DSP_TYPE *type);\n        FMOD_RESULT F_API getIdle                (bool *idle);\n\n        // Userdata set/get.\n        FMOD_RESULT F_API setUserData            (void *userdata);\n        FMOD_RESULT F_API getUserData            (void **userdata);\n\n        // Metering.\n        FMOD_RESULT F_API setMeteringEnabled     (bool inputEnabled, bool outputEnabled);\n        FMOD_RESULT F_API getMeteringEnabled     (bool *inputEnabled, bool *outputEnabled);\n        FMOD_RESULT F_API getMeteringInfo        (FMOD_DSP_METERING_INFO *inputInfo, FMOD_DSP_METERING_INFO *outputInfo);\n        FMOD_RESULT F_API getCPUUsage            (unsigned int *exclusive, unsigned int *inclusive);\n    };\n\n\n    /*\n        'DSPConnection' API\n    */\n    class DSPConnection\n    {\n      private:\n\n        // Constructor made private so user cannot statically instance a DSPConnection class.  Appropriate DSPConnection creation or retrieval function must be used.\n        DSPConnection();\n        DSPConnection(const DSPConnection &);\n\n      public:\n\n        FMOD_RESULT F_API getInput              (DSP **input);\n        FMOD_RESULT F_API getOutput             (DSP **output);\n        FMOD_RESULT F_API setMix                (float volume);\n        FMOD_RESULT F_API getMix                (float *volume);\n        FMOD_RESULT F_API setMixMatrix          (float *matrix, int outchannels, int inchannels, int inchannel_hop = 0);\n        FMOD_RESULT F_API getMixMatrix          (float *matrix, int *outchannels, int *inchannels, int inchannel_hop = 0);\n        FMOD_RESULT F_API getType               (FMOD_DSPCONNECTION_TYPE *type);\n\n        // Userdata set/get.\n        FMOD_RESULT F_API setUserData           (void *userdata);\n        FMOD_RESULT F_API getUserData           (void **userdata);\n    };\n\n\n    /*\n        'Geometry' API\n    */\n    class Geometry\n    {\n      private:\n\n        // Constructor made private so user cannot statically instance a Geometry class.  Appropriate Geometry creation or retrieval function must be used.\n        Geometry();\n        Geometry(const Geometry &);\n\n      public:\n\n        FMOD_RESULT F_API release                ();\n\n        // Polygon manipulation.\n        FMOD_RESULT F_API addPolygon             (float directocclusion, float reverbocclusion, bool doublesided, int numvertices, const FMOD_VECTOR *vertices, int *polygonindex);\n        FMOD_RESULT F_API getNumPolygons         (int *numpolygons);\n        FMOD_RESULT F_API getMaxPolygons         (int *maxpolygons, int *maxvertices);\n        FMOD_RESULT F_API getPolygonNumVertices  (int index, int *numvertices);\n        FMOD_RESULT F_API setPolygonVertex       (int index, int vertexindex, const FMOD_VECTOR *vertex);\n        FMOD_RESULT F_API getPolygonVertex       (int index, int vertexindex, FMOD_VECTOR *vertex);\n        FMOD_RESULT F_API setPolygonAttributes   (int index, float directocclusion, float reverbocclusion, bool doublesided);\n        FMOD_RESULT F_API getPolygonAttributes   (int index, float *directocclusion, float *reverbocclusion, bool *doublesided);\n\n        // Object manipulation.\n        FMOD_RESULT F_API setActive              (bool active);\n        FMOD_RESULT F_API getActive              (bool *active);\n        FMOD_RESULT F_API setRotation            (const FMOD_VECTOR *forward, const FMOD_VECTOR *up);\n        FMOD_RESULT F_API getRotation            (FMOD_VECTOR *forward, FMOD_VECTOR *up);\n        FMOD_RESULT F_API setPosition            (const FMOD_VECTOR *position);\n        FMOD_RESULT F_API getPosition            (FMOD_VECTOR *position);\n        FMOD_RESULT F_API setScale               (const FMOD_VECTOR *scale);\n        FMOD_RESULT F_API getScale               (FMOD_VECTOR *scale);\n        FMOD_RESULT F_API save                   (void *data, int *datasize);\n\n        // Userdata set/get.\n        FMOD_RESULT F_API setUserData            (void *userdata);\n        FMOD_RESULT F_API getUserData            (void **userdata);\n    };\n\n\n    /*\n        'Reverb' API\n    */\n    class Reverb3D\n    {\n      private:\n\n        // Constructor made private so user cannot statically instance a Reverb3D class.  Appropriate Reverb creation or retrieval function must be used.\n        Reverb3D();\n        Reverb3D(const Reverb3D &);\n\n      public:\n\n        FMOD_RESULT F_API release                ();\n\n        // Reverb manipulation.\n        FMOD_RESULT F_API set3DAttributes        (const FMOD_VECTOR *position, float mindistance, float maxdistance);\n        FMOD_RESULT F_API get3DAttributes        (FMOD_VECTOR *position, float *mindistance,float *maxdistance);\n        FMOD_RESULT F_API setProperties          (const FMOD_REVERB_PROPERTIES *properties);\n        FMOD_RESULT F_API getProperties          (FMOD_REVERB_PROPERTIES *properties);\n        FMOD_RESULT F_API setActive              (bool active);\n        FMOD_RESULT F_API getActive              (bool *active);\n\n        // Userdata set/get.\n        FMOD_RESULT F_API setUserData            (void *userdata);\n        FMOD_RESULT F_API getUserData            (void **userdata);\n    };\n}\n\n#endif\n"
  },
  {
    "path": "Plugins/FMODStudio/Source/FMODStudio/Public/FMOD/fmod_codec.h",
    "content": "/* ======================================================================================================== */\n/* FMOD Studio - codec development header file. Copyright (c), Firelight Technologies Pty, Ltd. 2004-2020.  */\n/*                                                                                                          */\n/* Use this header if you are wanting to develop your own file format plugin to use with                    */\n/* FMOD's codec system.  With this header you can make your own fileformat plugin that FMOD                 */\n/* can register and use.  See the documentation and examples on how to make a working plugin.               */\n/*                                                                                                          */\n/* ======================================================================================================== */\n\n#ifndef _FMOD_CODEC_H\n#define _FMOD_CODEC_H\n\ntypedef struct FMOD_CODEC_STATE FMOD_CODEC_STATE;\ntypedef struct FMOD_CODEC_WAVEFORMAT FMOD_CODEC_WAVEFORMAT;\n\n/*\n    Codec callbacks\n*/ \ntypedef FMOD_RESULT (F_CALLBACK *FMOD_CODEC_OPEN_CALLBACK)         (FMOD_CODEC_STATE *codec_state, FMOD_MODE usermode, FMOD_CREATESOUNDEXINFO *userexinfo);\ntypedef FMOD_RESULT (F_CALLBACK *FMOD_CODEC_CLOSE_CALLBACK)        (FMOD_CODEC_STATE *codec_state);\ntypedef FMOD_RESULT (F_CALLBACK *FMOD_CODEC_READ_CALLBACK)         (FMOD_CODEC_STATE *codec_state, void *buffer, unsigned int samples_in, unsigned int *samples_out);\ntypedef FMOD_RESULT (F_CALLBACK *FMOD_CODEC_GETLENGTH_CALLBACK)    (FMOD_CODEC_STATE *codec_state, unsigned int *length, FMOD_TIMEUNIT lengthtype);\ntypedef FMOD_RESULT (F_CALLBACK *FMOD_CODEC_SETPOSITION_CALLBACK)  (FMOD_CODEC_STATE *codec_state, int subsound, unsigned int position, FMOD_TIMEUNIT postype);\ntypedef FMOD_RESULT (F_CALLBACK *FMOD_CODEC_GETPOSITION_CALLBACK)  (FMOD_CODEC_STATE *codec_state, unsigned int *position, FMOD_TIMEUNIT postype);\ntypedef FMOD_RESULT (F_CALLBACK *FMOD_CODEC_SOUNDCREATE_CALLBACK)  (FMOD_CODEC_STATE *codec_state, int subsound, FMOD_SOUND *sound);\ntypedef FMOD_RESULT (F_CALLBACK *FMOD_CODEC_METADATA_CALLBACK)     (FMOD_CODEC_STATE *codec_state, FMOD_TAGTYPE tagtype, char *name, void *data, unsigned int datalen, FMOD_TAGDATATYPE datatype, int unique);\ntypedef FMOD_RESULT (F_CALLBACK *FMOD_CODEC_GETWAVEFORMAT_CALLBACK)(FMOD_CODEC_STATE *codec_state, int index, FMOD_CODEC_WAVEFORMAT *waveformat);\n\n\n/*\n[STRUCTURE] \n[\n    [DESCRIPTION]\n    When creating a codec, declare one of these and provide the relevant callbacks and name for FMOD to use when it opens and reads a file.\n\n    [REMARKS]\n    Members marked with [r] mean the variable is modified by FMOD and is for reading purposes only.  Do not change this value.<br>\n    Members marked with [w] mean the variable can be written to.  The user can set the value.<br>\n\n    [SEE_ALSO]\n    FMOD_CODEC_STATE\n    FMOD_CODEC_WAVEFORMAT\n]\n*/\ntypedef struct FMOD_CODEC_DESCRIPTION\n{\n    const char                       *name;            /* [w] Name of the codec. */\n    unsigned int                      version;         /* [w] Plugin writer's version number. */\n    int                               defaultasstream; /* [w] Tells FMOD to open the file as a stream when calling System::createSound, and not a static sample.  Should normally be 0 (FALSE), because generally the user wants to decode the file into memory when using System::createSound.   Mainly used for formats that decode for a very long time, or could use large amounts of memory when decoded.  Usually sequenced formats such as mod/s3m/xm/it/midi fall into this category.   It is mainly to stop users that don't know what they're doing from getting FMOD_ERR_MEMORY returned from createSound when they should have in fact called System::createStream or used FMOD_CREATESTREAM in System::createSound. */\n    FMOD_TIMEUNIT                     timeunits;       /* [w] When setposition codec is called, only these time formats will be passed to the codec. Use bitwise OR to accumulate different types. */\n    FMOD_CODEC_OPEN_CALLBACK          open;            /* [w] Open callback for the codec for when FMOD tries to open a sound using this codec. */\n    FMOD_CODEC_CLOSE_CALLBACK         close;           /* [w] Close callback for the codec for when FMOD tries to close a sound using this codec.  */\n    FMOD_CODEC_READ_CALLBACK          read;            /* [w] Read callback for the codec for when FMOD tries to read some data from the file to the destination format (specified in the open callback). */\n    FMOD_CODEC_GETLENGTH_CALLBACK     getlength;       /* [w] Callback to return the length of the song in whatever format required when Sound::getLength is called. */\n    FMOD_CODEC_SETPOSITION_CALLBACK   setposition;     /* [w] Seek callback for the codec for when FMOD tries to seek within the file with Channel::setPosition. */\n    FMOD_CODEC_GETPOSITION_CALLBACK   getposition;     /* [w] Tell callback for the codec for when FMOD tries to get the current position within the with Channel::getPosition. */\n    FMOD_CODEC_SOUNDCREATE_CALLBACK   soundcreate;     /* [w] Sound creation callback for the codec when FMOD finishes creating the sound.  (So the codec can set more parameters for the related created sound, ie loop points/mode or 3D attributes etc). */\n    FMOD_CODEC_GETWAVEFORMAT_CALLBACK getwaveformat;   /* [w] Callback to tell FMOD about the waveformat of a particular subsound.  This is to save memory, rather than saving 1000 FMOD_CODEC_WAVEFORMAT structures in the codec, the codec might have a more optimal way of storing this information. */\n} FMOD_CODEC_DESCRIPTION;\n\n\n/*\n[STRUCTURE] \n[\n    [DESCRIPTION]\n    Set these values marked to tell fmod what sort of sound to create when the codec open callback is called.<br>\n    The format, channels, frequency and lengthpcm tell FMOD what sort of sound buffer to create when you initialize your code. <br>\n    If you wrote an MP3 codec that decoded to stereo 16bit integer PCM for a 44khz sound, you would specify FMOD_SOUND_FORMAT_PCM16, and channels would be equal to 2, and frequency would be 44100.<br>\n\n    [REMARKS]\n    Members marked with [r] mean the variable is modified by FMOD and is for reading purposes only.  Do not change this value.<br>\n    Members marked with [w] mean the variable can be written to.  The user can set the value.<br>\n    <br>\n    1.07 Note.  'blockalign' member which was in bytes has been removed.   'pcmblocksize' is now the replacement, and is measured in PCM samples only, not bytes.  This is purely to support buffering \n    internal to FMOD for codecs that are not sample accurate.\n    <br>\n    Note: When registering a codec, format, channels, frequency and lengthpcm must be supplied, otherwise there will be an error.<br>\n    This structure is optional if FMOD_CODEC_GETWAVEFORMAT_CALLBACK is specified.<br>\n    An array of these structures may be needed if FMOD_CODEC_STATE::numsubsounds is larger than 1.\n    \n    \n    [SEE_ALSO]\n    FMOD_CODEC_STATE\n    FMOD_SOUND_FORMAT\n    FMOD_MODE\n    FMOD_CHANNELMASK\n    FMOD_CHANNELORDER\n    FMOD_CODEC_WAVEFORMAT_VERSION\n]\n*/\nstruct FMOD_CODEC_WAVEFORMAT\n{\n    const char*        name;          /* [w] Name of sound.  Optional. If used, the codec must own the lifetime of the string memory until the codec is destroyed. */\n    FMOD_SOUND_FORMAT  format;        /* [w] Format for (decompressed) codec output, ie FMOD_SOUND_FORMAT_PCM8, FMOD_SOUND_FORMAT_PCM16.  Mandantory - Must be supplied. */\n    int                channels;      /* [w] Number of channels used by codec, ie mono = 1, stereo = 2.  Mandantory - Must be supplied.  */\n    int                frequency;     /* [w] Default frequency in hz of the codec, ie 44100.  Mandantory - Must be supplied.  */\n    unsigned int       lengthbytes;   /* [w] Length in bytes of the source data.  Used for FMOD_TIMEUNIT_RAWBYTES.  Optional. Default = 0. */\n    unsigned int       lengthpcm;     /* [w] Length in decompressed, PCM samples of the file, ie length in seconds * frequency.  Used for Sound::getLength and for memory allocation of static decompressed sample data.  Mandantory - Must be supplied. */\n    unsigned int       pcmblocksize;  /* [w] Minimum, optimal number of decompressed PCM samples codec can handle.  0 or 1 = no buffering.  Anything higher means FMOD will allocate a PCM buffer of this size to read in chunks.  The codec read callback will be called in multiples of this value.  Optional.  */\n    int                loopstart;     /* [w] Loopstart in decompressed, PCM samples of file. Optional. Default = 0. */\n    int                loopend;       /* [w] Loopend in decompressed, PCM samples of file. Optional. Default = 0. */\n    FMOD_MODE          mode;          /* [w] Mode to determine whether the sound should by default load as looping, non looping, 2d or 3d.  Optional. Default = FMOD_DEFAULT. */\n    FMOD_CHANNELMASK   channelmask;   /* [w] Defined channel bitmask to describe which speakers the channels in the codec map to, in order of channel count.  See fmod_common.h.  Optional. Leave at 0 to map to the speaker layout defined in FMOD_SPEAKER. */\n    FMOD_CHANNELORDER  channelorder;  /* [w] Defined channel order type, to describe where each sound channel should pan for the number of channels specified.  See fmod_common.h.  Optional.  Leave at 0 to play in default speaker order. */\n    float              peakvolume;    /* [w] Peak volume of sound. Optional. Default = 0 if not used. */\n};\n\n\n/*\n[DEFINE] \n[\n    [NAME]\n    FMOD_CODEC_WAVEFORMAT_VERSION\n\n    [DESCRIPTION]\n    Version number of FMOD_CODEC_WAVEFORMAT structure.  Should be set into FMOD_CODEC_STATE in the FMOD_CODEC_OPEN_CALLBACK.\n\n    [REMARKS]\n    Use this for binary compatibility and for future expansion.\n\n    [SEE_ALSO]\n    FMOD_CODEC_STATE\n    FMOD_CODEC_DESCRIPTION\n    FMOD_CODEC_OPEN_CALLBACK\n]\n*/\n#define FMOD_CODEC_WAVEFORMAT_VERSION 3\n/* [DEFINE_END] */\n\n\n/*\n[STRUCTURE] \n[\n    [DESCRIPTION]\n    Codec plugin structure that is passed into each callback.<br>\n    <br>\n    Optionally set the numsubsounds and waveformat members when called in FMOD_CODEC_OPEN_CALLBACK to tell fmod what sort of sound to create.<br>\n\n    [REMARKS]\n    Members marked with [r] mean the variable is modified by FMOD and is for reading purposes only.  Do not change this value.<br>\n    Members marked with [w] mean the variable can be written to.  The user can set the value.<br>\n    <br>\n    'numsubsounds' should be 0 if the file is a normal single sound stream or sound.  Examples of this would be .WAV, .WMA, .MP3, .AIFF.<br>\n    'numsubsounds' should be 1+ if the file is a container format, and does not contain wav data itself.  Examples of these types would be FSB (contains multiple sounds), DLS (contain instruments).<br>\n    The waveformat value should point to an arrays of information based on how many subsounds are in the format.  If the number of subsounds is 0 then it should point to 1 waveformat, the same as if the number of subsounds was 1.  If subsounds was 100 for example, there should be a pointer to an array of 100 waveformat structures.<br>\n    <br>\n    The waveformat pointer is optional and could be 0, if using FMOD_CODEC_GETWAVEFORMAT_CALLBACK is preferred.<br>\n    <br>\n    When a sound has 1 or more subsounds, the caller must play the individual sounds specified by first obtaining the subsound with Sound::getSubSound.\n    \n    [SEE_ALSO]\n    FMOD_CODEC_WAVEFORMAT\n    FMOD_FILE_READ_CALLBACK\n    FMOD_FILE_SEEK_CALLBACK\n    FMOD_CODEC_METADATA_CALLBACK\n    Sound::getSubSound\n    Sound::getNumSubSounds\n    FMOD_CODEC_WAVEFORMAT_VERSION\n]\n*/\nstruct FMOD_CODEC_STATE\n{\n    int                          numsubsounds;      /* [w] Number of 'subsounds' in this sound.  Anything other than 0 makes it a 'container' format (ie DLS/FSB etc which contain 1 or more subsounds).  For most normal, single sound codec such as WAV/AIFF/MP3, this should be 0 as they are not a container for subsounds, they are the sound by itself. */\n    FMOD_CODEC_WAVEFORMAT       *waveformat;        /* [w] Pointer to an array of format structures containing information about each sample.  Can be 0 or NULL if FMOD_CODEC_GETWAVEFORMAT_CALLBACK callback is preferred.  The number of entries here must equal the number of subsounds defined in the subsound parameter. If numsubsounds = 0 then there should be 1 instance of this structure. */\n    void                        *plugindata;        /* [w] Plugin writer created data the codec author wants to attach to this object. */\n                                               \n    void                        *filehandle;        /* [r] This will return an internal FMOD file handle to use with the callbacks provided.  */\n    unsigned int                 filesize;          /* [r] This will contain the size of the file in bytes. */\n    FMOD_FILE_READ_CALLBACK      fileread;          /* [r] This will return a callable FMOD file function to use from codec. */\n    FMOD_FILE_SEEK_CALLBACK      fileseek;          /* [r] This will return a callable FMOD file function to use from codec.  */\n    FMOD_CODEC_METADATA_CALLBACK metadata;          /* [r] This will return a callable FMOD metadata function to use from codec.  */\n\n    int                          waveformatversion; /* [w] Must be set to FMOD_CODEC_WAVEFORMAT_VERSION in the FMOD_CODEC_OPEN_CALLBACK. */\n};\n\n#endif\n\n\n"
  },
  {
    "path": "Plugins/FMODStudio/Source/FMODStudio/Public/FMOD/fmod_common.h",
    "content": "/*$ preserve start $*/\n\n/* ================================================================================================== */\n/* FMOD Studio - Common C/C++ header file. Copyright (c), Firelight Technologies Pty, Ltd. 2004-2020. */\n/*                                                                                                    */\n/* This header is included by fmod.hpp (C++ interface) and fmod.h (C interface) therefore is the      */\n/* base header for all FMOD headers.                                                                  */\n/* ================================================================================================== */\n\n#ifndef _FMOD_COMMON_H\n#define _FMOD_COMMON_H\n\n/*\n    FMOD version number.  Check this against FMOD::System::getVersion.\n    0xaaaabbcc -> aaaa = major version number.  bb = minor version number.  cc = development version number.\n*/\n\n#define FMOD_VERSION    0x00011019\n\n/*\n    Compiler specific settings.\n*/\n\n#if defined(_WIN32) || defined(__CYGWIN__)\n    #define F_CALL __stdcall\n#elif defined(__ANDROID__) && defined(__arm__) && !defined(__LP64__) && !defined(__clang__)\n    #define F_CALL __attribute__((pcs(\"aapcs\")))\n#else\n    #define F_CALL\n#endif\n\n#if defined(_WIN32) || defined(__CYGWIN__) || defined(__ORBIS__) || defined(__psp2__)\n    #define F_EXPORT __declspec(dllexport)\n#elif defined(__APPLE__) || defined(__ANDROID__) || defined(__linux__) || defined(F_USE_ATTRIBUTE)\n    #define F_EXPORT __attribute__((visibility(\"default\")))\n#else\n    #define F_EXPORT\n#endif\n\n#ifdef DLL_EXPORTS\n    #define F_API F_EXPORT F_CALL\n#else\n    #define F_API F_CALL\n#endif\n\n#define F_CALLBACK F_CALL\n\n/*\n    FMOD types.\n*/\n\ntypedef int                        FMOD_BOOL;\ntypedef struct FMOD_SYSTEM         FMOD_SYSTEM;\ntypedef struct FMOD_SOUND          FMOD_SOUND;\ntypedef struct FMOD_CHANNELCONTROL FMOD_CHANNELCONTROL;\ntypedef struct FMOD_CHANNEL        FMOD_CHANNEL;\ntypedef struct FMOD_CHANNELGROUP   FMOD_CHANNELGROUP;\ntypedef struct FMOD_SOUNDGROUP     FMOD_SOUNDGROUP;\ntypedef struct FMOD_REVERB3D       FMOD_REVERB3D;\ntypedef struct FMOD_DSP            FMOD_DSP;\ntypedef struct FMOD_DSPCONNECTION  FMOD_DSPCONNECTION;\ntypedef struct FMOD_POLYGON        FMOD_POLYGON;\ntypedef struct FMOD_GEOMETRY       FMOD_GEOMETRY;\ntypedef struct FMOD_SYNCPOINT      FMOD_SYNCPOINT;\ntypedef struct FMOD_ASYNCREADINFO  FMOD_ASYNCREADINFO;\ntypedef unsigned int               FMOD_MODE;\ntypedef unsigned int               FMOD_TIMEUNIT;\ntypedef unsigned int               FMOD_INITFLAGS;\ntypedef unsigned int               FMOD_DEBUG_FLAGS;\ntypedef unsigned int               FMOD_MEMORY_TYPE;\ntypedef unsigned int               FMOD_SYSTEM_CALLBACK_TYPE;\ntypedef unsigned int               FMOD_CHANNELMASK;\ntypedef unsigned int               FMOD_DRIVER_STATE;\ntypedef unsigned int               FMOD_PORT_TYPE;\ntypedef unsigned long long         FMOD_PORT_INDEX;\n\n/*$ fmod result start $*/\n/*\n[ENUM]\n[\n    [DESCRIPTION]   \n    error codes.  Returned from every function.\n\n    [REMARKS]\n\n    [SEE_ALSO]      \n]\n*/\ntypedef enum FMOD_RESULT\n{\n    FMOD_OK,                        /* No errors. */\n    FMOD_ERR_BADCOMMAND,            /* Tried to call a function on a data type that does not allow this type of functionality (ie calling Sound::lock on a streaming sound). */\n    FMOD_ERR_CHANNEL_ALLOC,         /* Error trying to allocate a channel. */\n    FMOD_ERR_CHANNEL_STOLEN,        /* The specified channel has been reused to play another sound. */\n    FMOD_ERR_DMA,                   /* DMA Failure.  See debug output for more information. */\n    FMOD_ERR_DSP_CONNECTION,        /* DSP connection error.  Connection possibly caused a cyclic dependency or connected dsps with incompatible buffer counts. */\n    FMOD_ERR_DSP_DONTPROCESS,       /* DSP return code from a DSP process query callback.  Tells mixer not to call the process callback and therefore not consume CPU.  Use this to optimize the DSP graph. */\n    FMOD_ERR_DSP_FORMAT,            /* DSP Format error.  A DSP unit may have attempted to connect to this network with the wrong format, or a matrix may have been set with the wrong size if the target unit has a specified channel map. */\n    FMOD_ERR_DSP_INUSE,             /* DSP is already in the mixer's DSP network. It must be removed before being reinserted or released. */\n    FMOD_ERR_DSP_NOTFOUND,          /* DSP connection error.  Couldn't find the DSP unit specified. */\n    FMOD_ERR_DSP_RESERVED,          /* DSP operation error.  Cannot perform operation on this DSP as it is reserved by the system. */\n    FMOD_ERR_DSP_SILENCE,           /* DSP return code from a DSP process query callback.  Tells mixer silence would be produced from read, so go idle and not consume CPU.  Use this to optimize the DSP graph. */\n    FMOD_ERR_DSP_TYPE,              /* DSP operation cannot be performed on a DSP of this type. */\n    FMOD_ERR_FILE_BAD,              /* Error loading file. */\n    FMOD_ERR_FILE_COULDNOTSEEK,     /* Couldn't perform seek operation.  This is a limitation of the medium (ie netstreams) or the file format. */\n    FMOD_ERR_FILE_DISKEJECTED,      /* Media was ejected while reading. */\n    FMOD_ERR_FILE_EOF,              /* End of file unexpectedly reached while trying to read essential data (truncated?). */\n    FMOD_ERR_FILE_ENDOFDATA,        /* End of current chunk reached while trying to read data. */\n    FMOD_ERR_FILE_NOTFOUND,         /* File not found. */\n    FMOD_ERR_FORMAT,                /* Unsupported file or audio format. */\n    FMOD_ERR_HEADER_MISMATCH,       /* There is a version mismatch between the FMOD header and either the FMOD Studio library or the FMOD Low Level library. */\n    FMOD_ERR_HTTP,                  /* A HTTP error occurred. This is a catch-all for HTTP errors not listed elsewhere. */\n    FMOD_ERR_HTTP_ACCESS,           /* The specified resource requires authentication or is forbidden. */\n    FMOD_ERR_HTTP_PROXY_AUTH,       /* Proxy authentication is required to access the specified resource. */\n    FMOD_ERR_HTTP_SERVER_ERROR,     /* A HTTP server error occurred. */\n    FMOD_ERR_HTTP_TIMEOUT,          /* The HTTP request timed out. */\n    FMOD_ERR_INITIALIZATION,        /* FMOD was not initialized correctly to support this function. */\n    FMOD_ERR_INITIALIZED,           /* Cannot call this command after System::init. */\n    FMOD_ERR_INTERNAL,              /* An error occurred that wasn't supposed to.  Contact support. */\n    FMOD_ERR_INVALID_FLOAT,         /* Value passed in was a NaN, Inf or denormalized float. */\n    FMOD_ERR_INVALID_HANDLE,        /* An invalid object handle was used. */\n    FMOD_ERR_INVALID_PARAM,         /* An invalid parameter was passed to this function. */\n    FMOD_ERR_INVALID_POSITION,      /* An invalid seek position was passed to this function. */\n    FMOD_ERR_INVALID_SPEAKER,       /* An invalid speaker was passed to this function based on the current speaker mode. */\n    FMOD_ERR_INVALID_SYNCPOINT,     /* The syncpoint did not come from this sound handle. */\n    FMOD_ERR_INVALID_THREAD,        /* Tried to call a function on a thread that is not supported. */\n    FMOD_ERR_INVALID_VECTOR,        /* The vectors passed in are not unit length, or perpendicular. */\n    FMOD_ERR_MAXAUDIBLE,            /* Reached maximum audible playback count for this sound's soundgroup. */\n    FMOD_ERR_MEMORY,                /* Not enough memory or resources. */\n    FMOD_ERR_MEMORY_CANTPOINT,      /* Can't use FMOD_OPENMEMORY_POINT on non PCM source data, or non mp3/xma/adpcm data if FMOD_CREATECOMPRESSEDSAMPLE was used. */\n    FMOD_ERR_NEEDS3D,               /* Tried to call a command on a 2d sound when the command was meant for 3d sound. */\n    FMOD_ERR_NEEDSHARDWARE,         /* Tried to use a feature that requires hardware support. */\n    FMOD_ERR_NET_CONNECT,           /* Couldn't connect to the specified host. */\n    FMOD_ERR_NET_SOCKET_ERROR,      /* A socket error occurred.  This is a catch-all for socket-related errors not listed elsewhere. */\n    FMOD_ERR_NET_URL,               /* The specified URL couldn't be resolved. */\n    FMOD_ERR_NET_WOULD_BLOCK,       /* Operation on a non-blocking socket could not complete immediately. */\n    FMOD_ERR_NOTREADY,              /* Operation could not be performed because specified sound/DSP connection is not ready. */\n    FMOD_ERR_OUTPUT_ALLOCATED,      /* Error initializing output device, but more specifically, the output device is already in use and cannot be reused. */\n    FMOD_ERR_OUTPUT_CREATEBUFFER,   /* Error creating hardware sound buffer. */\n    FMOD_ERR_OUTPUT_DRIVERCALL,     /* A call to a standard soundcard driver failed, which could possibly mean a bug in the driver or resources were missing or exhausted. */\n    FMOD_ERR_OUTPUT_FORMAT,         /* Soundcard does not support the specified format. */\n    FMOD_ERR_OUTPUT_INIT,           /* Error initializing output device. */\n    FMOD_ERR_OUTPUT_NODRIVERS,      /* The output device has no drivers installed.  If pre-init, FMOD_OUTPUT_NOSOUND is selected as the output mode.  If post-init, the function just fails. */\n    FMOD_ERR_PLUGIN,                /* An unspecified error has been returned from a plugin. */\n    FMOD_ERR_PLUGIN_MISSING,        /* A requested output, dsp unit type or codec was not available. */\n    FMOD_ERR_PLUGIN_RESOURCE,       /* A resource that the plugin requires cannot be found. (ie the DLS file for MIDI playback) */\n    FMOD_ERR_PLUGIN_VERSION,        /* A plugin was built with an unsupported SDK version. */\n    FMOD_ERR_RECORD,                /* An error occurred trying to initialize the recording device. */\n    FMOD_ERR_REVERB_CHANNELGROUP,   /* Reverb properties cannot be set on this channel because a parent channelgroup owns the reverb connection. */\n    FMOD_ERR_REVERB_INSTANCE,       /* Specified instance in FMOD_REVERB_PROPERTIES couldn't be set. Most likely because it is an invalid instance number or the reverb doesn't exist. */\n    FMOD_ERR_SUBSOUNDS,             /* The error occurred because the sound referenced contains subsounds when it shouldn't have, or it doesn't contain subsounds when it should have.  The operation may also not be able to be performed on a parent sound. */\n    FMOD_ERR_SUBSOUND_ALLOCATED,    /* This subsound is already being used by another sound, you cannot have more than one parent to a sound.  Null out the other parent's entry first. */\n    FMOD_ERR_SUBSOUND_CANTMOVE,     /* Shared subsounds cannot be replaced or moved from their parent stream, such as when the parent stream is an FSB file. */\n    FMOD_ERR_TAGNOTFOUND,           /* The specified tag could not be found or there are no tags. */\n    FMOD_ERR_TOOMANYCHANNELS,       /* The sound created exceeds the allowable input channel count.  This can be increased using the 'maxinputchannels' parameter in System::setSoftwareFormat. */\n    FMOD_ERR_TRUNCATED,             /* The retrieved string is too long to fit in the supplied buffer and has been truncated. */\n    FMOD_ERR_UNIMPLEMENTED,         /* Something in FMOD hasn't been implemented when it should be! contact support! */\n    FMOD_ERR_UNINITIALIZED,         /* This command failed because System::init or System::setDriver was not called. */\n    FMOD_ERR_UNSUPPORTED,           /* A command issued was not supported by this object.  Possibly a plugin without certain callbacks specified. */\n    FMOD_ERR_VERSION,               /* The version number of this file format is not supported. */\n    FMOD_ERR_EVENT_ALREADY_LOADED,  /* The specified bank has already been loaded. */\n    FMOD_ERR_EVENT_LIVEUPDATE_BUSY, /* The live update connection failed due to the game already being connected. */\n    FMOD_ERR_EVENT_LIVEUPDATE_MISMATCH, /* The live update connection failed due to the game data being out of sync with the tool. */\n    FMOD_ERR_EVENT_LIVEUPDATE_TIMEOUT, /* The live update connection timed out. */\n    FMOD_ERR_EVENT_NOTFOUND,        /* The requested event, bus or vca could not be found. */\n    FMOD_ERR_STUDIO_UNINITIALIZED,  /* The Studio::System object is not yet initialized. */\n    FMOD_ERR_STUDIO_NOT_LOADED,     /* The specified resource is not loaded, so it can't be unloaded. */\n    FMOD_ERR_INVALID_STRING,        /* An invalid string was passed to this function. */\n    FMOD_ERR_ALREADY_LOCKED,        /* The specified resource is already locked. */\n    FMOD_ERR_NOT_LOCKED,            /* The specified resource is not locked, so it can't be unlocked. */\n    FMOD_ERR_RECORD_DISCONNECTED,   /* The specified recording driver has been disconnected. */\n    FMOD_ERR_TOOMANYSAMPLES,        /* The length provided exceeds the allowable limit. */\n\n    FMOD_RESULT_FORCEINT = 65536    /* Makes sure this enum is signed 32bit. */\n} FMOD_RESULT;\n/*$ fmod result end $*/\n\n\n/*\n[ENUM] \n[\n    [DESCRIPTION]   \n    Used to distinguish if a FMOD_CHANNELCONTROL parameter is actually a channel or a channelgroup.\n\n    [REMARKS]\n    Cast the FMOD_CHANNELCONTROL to an FMOD_CHANNEL/FMOD::Channel, or FMOD_CHANNELGROUP/FMOD::ChannelGroup if specific functionality is needed for either class.\n    Otherwise use as FMOD_CHANNELCONTROL/FMOD::ChannelControl and use that API.\n\n    [SEE_ALSO]      \n    Channel::setCallback\n    ChannelGroup::setCallback\n]\n*/\ntypedef enum FMOD_CHANNELCONTROL_TYPE\n{\n    FMOD_CHANNELCONTROL_CHANNEL,\n    FMOD_CHANNELCONTROL_CHANNELGROUP,\n\n    FMOD_CHANNELCONTROL_FORCEINT = 65536    /* Makes sure this enum is signed 32bit. */\n} FMOD_CHANNELCONTROL_TYPE;\n\n\n/*\n[STRUCTURE] \n[\n    [DESCRIPTION]   \n    Structure describing a point in 3D space.\n\n    [REMARKS]\n    FMOD uses a left handed coordinate system by default.<br>\n    To use a right handed coordinate system specify FMOD_INIT_3D_RIGHTHANDED from FMOD_INITFLAGS in System::init.\n\n    [SEE_ALSO]      \n    System::set3DListenerAttributes\n    System::get3DListenerAttributes\n    Channel::set3DAttributes\n    Channel::get3DAttributes\n    Channel::set3DCustomRolloff\n    Channel::get3DCustomRolloff\n    Sound::set3DCustomRolloff\n    Sound::get3DCustomRolloff\n    Geometry::addPolygon\n    Geometry::setPolygonVertex\n    Geometry::getPolygonVertex\n    Geometry::setRotation\n    Geometry::getRotation\n    Geometry::setPosition\n    Geometry::getPosition\n    Geometry::setScale\n    Geometry::getScale\n    FMOD_INITFLAGS\n]\n*/\ntypedef struct FMOD_VECTOR\n{\n    float x;        /* X coordinate in 3D space. */\n    float y;        /* Y coordinate in 3D space. */\n    float z;        /* Z coordinate in 3D space. */\n} FMOD_VECTOR;\n\n\n/*\n[STRUCTURE] \n[\n    [DESCRIPTION]   \n    Structure describing a position, velocity and orientation.\n\n    [REMARKS]\n    Attributes should use your chosen coordinate system, see [3D sounds](overview/3dsound.html) for more information.\n\n    [SEE_ALSO]\n    FMOD_VECTOR\n    FMOD_DSP_PARAMETER_3DATTRIBUTES\n]\n*/\ntypedef struct FMOD_3D_ATTRIBUTES\n{\n    FMOD_VECTOR position;       /* The position of the object in world space, measured in distance units.  */\n    FMOD_VECTOR velocity;       /* The velocity of the object measured in distance units **per second**.  */\n    FMOD_VECTOR forward;        /* The forwards orientation of the object.  This vector must be of unit length (1.0) and perpendicular to the up vector. */\n    FMOD_VECTOR up;             /* The upwards orientation of the object.  This vector must be of unit length (1.0) and perpendicular to the forward vector. */\n} FMOD_3D_ATTRIBUTES;\n\n\n/*\n[STRUCTURE] \n[\n    [DESCRIPTION]   \n    Structure describing a globally unique identifier.\n\n    [REMARKS]\n\n    [SEE_ALSO]      \n    System::getDriverInfo\n]\n*/\ntypedef struct FMOD_GUID\n{\n    unsigned int   Data1;       /* Specifies the first 8 hexadecimal digits of the GUID */\n    unsigned short Data2;       /* Specifies the first group of 4 hexadecimal digits.   */\n    unsigned short Data3;       /* Specifies the second group of 4 hexadecimal digits.  */\n    unsigned char  Data4[8];    /* Array of 8 bytes. The first 2 bytes contain the third group of 4 hexadecimal digits. The remaining 6 bytes contain the final 12 hexadecimal digits. */\n} FMOD_GUID;\n\ntypedef void (F_CALLBACK *FMOD_FILE_ASYNCDONE_FUNC)           (FMOD_ASYNCREADINFO *info, FMOD_RESULT result);\n\n/*\n[STRUCTURE] \n[\n    [DESCRIPTION]\n    Structure that is passed into FMOD_FILE_ASYNCREAD_CALLBACK.  Use the information in this structure to perform\n\n    [REMARKS]\n    Members marked with [r] mean the variable is modified by FMOD and is for reading purposes only.  Do not change this value.<br>\n    Members marked with [w] mean the variable can be written to.  The user can set the value.<br>\n    <br>\n    Instructions: write to 'buffer', and 'bytesread' <b>BEFORE</b> calling 'done'.<br>  \n    As soon as done is called, FMOD will asynchronously continue internally using the data provided in this structure.<br>\n    <br>\n    Set result in the 'done' function pointer to the result expected from a normal file read callback.<br>\n    If the read was successful, set it to FMOD_OK.<br>\n    If it read some data but hit the end of the file, set it to FMOD_ERR_FILE_EOF.<br>\n    If a bad error occurred, return FMOD_ERR_FILE_BAD<br>\n    If a disk was ejected, return FMOD_ERR_FILE_DISKEJECTED.<br>\n\n    [SEE_ALSO]\n    FMOD_FILE_ASYNCREAD_CALLBACK\n    FMOD_FILE_ASYNCCANCEL_CALLBACK\n    FMOD_FILE_ASYNCDONE_FUNC\n]\n*/\nstruct FMOD_ASYNCREADINFO\n{\n    void                     *handle;    /* [r] The file handle that was filled out in the open callback. */\n    unsigned int              offset;    /* [r] Seek position, make sure you read from this file offset. */\n    unsigned int              sizebytes; /* [r] how many bytes requested for read. */\n    int                       priority;  /* [r] 0 = low importance.  100 = extremely important (ie 'must read now or stuttering may occur') */\n\n    void                     *userdata;  /* [r/w] User data pointer specific to this request.  Initially 0, can be ignored or set by the user.  Not related to the file's main userdata member.  */\n\n    void                     *buffer;    /* [w] Buffer to read file data into. */\n    unsigned int              bytesread; /* [w] Fill this in before setting result code to tell FMOD how many bytes were read. */\n\n    FMOD_FILE_ASYNCDONE_FUNC  done;      /* [r] FMOD file system wake up function.  Call this when user file read is finished.  Pass result of file read as a parameter. */\n};\n\n\n/*\n[ENUM]\n[\n    [DESCRIPTION]   \n    These output types are used with System::setOutput / System::getOutput, to choose which output method to use.\n  \n    [REMARKS]\n    To pass information to the driver when initializing fmod use the *extradriverdata* parameter in System::init for the following reasons.\n\n    - FMOD_OUTPUTTYPE_WAVWRITER     - extradriverdata is a pointer to a char * file name that the wav writer will output to.\n    - FMOD_OUTPUTTYPE_WAVWRITER_NRT - extradriverdata is a pointer to a char * file name that the wav writer will output to.\n    - FMOD_OUTPUTTYPE_DSOUND        - extradriverdata is cast to a HWND type, so that FMOD can set the focus on the audio for a particular window.\n    - FMOD_OUTPUTTYPE_PS3           - extradriverdata is a pointer to a FMOD_PS3_EXTRADRIVERDATA struct. This can be found in fmodps3.h.\n    - FMOD_OUTPUTTYPE_XAUDIO        - (Xbox360) extradriverdata is a pointer to a FMOD_360_EXTRADRIVERDATA struct. This can be found in fmodxbox360.h.\n\n    Currently these are the only FMOD drivers that take extra information.  Other unknown plugins may have different requirements.\n\n    Note! If FMOD_OUTPUTTYPE_WAVWRITER_NRT or FMOD_OUTPUTTYPE_NOSOUND_NRT are used, and if the System::update function is being called\n    very quickly (ie for a non realtime decode) it may be being called too quickly for the FMOD streamer thread to respond to.\n    The result will be a skipping/stuttering output in the captured audio.\n\n    To remedy this, disable the FMOD streamer thread, and use FMOD_INIT_STREAM_FROM_UPDATE to avoid skipping in the output stream,\n    as it will lock the mixer and the streamer together in the same thread.\n\n    [SEE_ALSO]\n    System::setOutput\n    System::getOutput\n    System::init\n    System::update\n]\n*/\ntypedef enum FMOD_OUTPUTTYPE\n{\n    FMOD_OUTPUTTYPE_AUTODETECT,      /* Picks the best output mode for the platform. This is the default. */\n\n    FMOD_OUTPUTTYPE_UNKNOWN,         /* All - 3rd party plugin, unknown. This is for use with System::getOutput only. */\n    FMOD_OUTPUTTYPE_NOSOUND,         /* All - Perform all mixing but discard the final output. */\n    FMOD_OUTPUTTYPE_WAVWRITER,       /* All - Writes output to a .wav file. */\n    FMOD_OUTPUTTYPE_NOSOUND_NRT,     /* All - Non-realtime version of FMOD_OUTPUTTYPE_NOSOUND. User can drive mixer with System::update at whatever rate they want. */\n    FMOD_OUTPUTTYPE_WAVWRITER_NRT,   /* All - Non-realtime version of FMOD_OUTPUTTYPE_WAVWRITER. User can drive mixer with System::update at whatever rate they want. */\n\n    FMOD_OUTPUTTYPE_DSOUND,          /* Win                  - Direct Sound.                        (Default on Windows XP and below) */\n    FMOD_OUTPUTTYPE_WINMM,           /* Win                  - Windows Multimedia. */\n    FMOD_OUTPUTTYPE_WASAPI,          /* Win/WinStore/XboxOne - Windows Audio Session API.           (Default on Windows Vista and above, Xbox One and Windows Store Applications) */\n    FMOD_OUTPUTTYPE_ASIO,            /* Win                  - Low latency ASIO 2.0. */\n    FMOD_OUTPUTTYPE_PULSEAUDIO,      /* Linux                - Pulse Audio.                         (Default on Linux if available) */\n    FMOD_OUTPUTTYPE_ALSA,            /* Linux                - Advanced Linux Sound Architecture.   (Default on Linux if PulseAudio isn't available) */\n    FMOD_OUTPUTTYPE_COREAUDIO,       /* Mac/iOS              - Core Audio.                          (Default on Mac and iOS) */\n    FMOD_OUTPUTTYPE_XAUDIO,          /* Xbox 360             - XAudio.                              (Default on Xbox 360) */\n    FMOD_OUTPUTTYPE_PS3,             /* PS3                  - Audio Out.                           (Default on PS3) */\n    FMOD_OUTPUTTYPE_AUDIOTRACK,      /* Android              - Java Audio Track.                    (Default on Android 2.2 and below) */\n    FMOD_OUTPUTTYPE_OPENSL,          /* Android              - OpenSL ES.                           (Default on Android 2.3 and above) */\n    FMOD_OUTPUTTYPE_WIIU,            /* Wii U                - AX.                                  (Default on Wii U) */\n    FMOD_OUTPUTTYPE_AUDIOOUT,        /* PS4/PSVita           - Audio Out.                           (Default on PS4 and PS Vita) */\n    FMOD_OUTPUTTYPE_AUDIO3D,         /* PS4                  - Audio3D. */\n    FMOD_OUTPUTTYPE_ATMOS,           /* Win                  - Dolby Atmos (WASAPI). */\n    FMOD_OUTPUTTYPE_WEBAUDIO,        /* Web Browser          - JavaScript webaudio output.          (Default on JavaScript) */\n    FMOD_OUTPUTTYPE_NNAUDIO,         /* NX                   - NX nn::audio.                        (Default on NX) */\n    FMOD_OUTPUTTYPE_WINSONIC,        /* Win10 / XboxOne      - Windows Sonic. */\n\n    FMOD_OUTPUTTYPE_MAX,             /* Maximum number of output types supported. */\n    FMOD_OUTPUTTYPE_FORCEINT = 65536 /* Makes sure this enum is signed 32bit. */\n} FMOD_OUTPUTTYPE;\n\n\n/*\n[ENUM]\n[\n    [DESCRIPTION]\n    Specify the destination of log output when using the logging version of FMOD.\n\n    [REMARKS]\n    TTY destination can vary depending on platform, common examples include the\n    Visual Studio / Xcode output window, stderr and LogCat.\n\n    [SEE_ALSO]\n    FMOD_Debug_Initialize\n]\n*/\ntypedef enum FMOD_DEBUG_MODE\n{\n    FMOD_DEBUG_MODE_TTY,             /* Default log location per platform, i.e. Visual Studio output window, stderr, LogCat, etc */\n    FMOD_DEBUG_MODE_FILE,            /* Write log to specified file path */\n    FMOD_DEBUG_MODE_CALLBACK,        /* Call specified callback with log information */\n\n    FMOD_DEBUG_MODE_FORCEINT = 65536 /* Makes sure this enum is signed 32bit. */\n} FMOD_DEBUG_MODE;\n\n\n/*\n[DEFINE]\n[\n    [NAME]\n    FMOD_DEBUG_FLAGS\n\n    [DESCRIPTION]\n    Specify the requested information to be output when using the logging version of FMOD.\n\n    [REMARKS]\n\n    [SEE_ALSO]\n    FMOD_Debug_Initialize\n]\n*/\n#define FMOD_DEBUG_LEVEL_NONE           0x00000000    /* Disable all messages */\n#define FMOD_DEBUG_LEVEL_ERROR          0x00000001    /* Enable only error messages. */\n#define FMOD_DEBUG_LEVEL_WARNING        0x00000002    /* Enable warning and error messages. */\n#define FMOD_DEBUG_LEVEL_LOG            0x00000004    /* Enable informational, warning and error messages (default). */\n#define FMOD_DEBUG_TYPE_MEMORY          0x00000100    /* Verbose logging for memory operations, only use this if you are debugging a memory related issue. */\n#define FMOD_DEBUG_TYPE_FILE            0x00000200    /* Verbose logging for file access, only use this if you are debugging a file related issue. */\n#define FMOD_DEBUG_TYPE_CODEC           0x00000400    /* Verbose logging for codec initialization, only use this if you are debugging a codec related issue. */\n#define FMOD_DEBUG_TYPE_TRACE           0x00000800    /* Verbose logging for internal errors, use this for tracking the origin of error codes. */\n#define FMOD_DEBUG_DISPLAY_TIMESTAMPS   0x00010000    /* Display the time stamp of the log message in milliseconds. */\n#define FMOD_DEBUG_DISPLAY_LINENUMBERS  0x00020000    /* Display the source code file and line number for where the message originated. */\n#define FMOD_DEBUG_DISPLAY_THREAD       0x00040000    /* Display the thread ID of the calling function that generated the message. */\n/* [DEFINE_END] */\n\n\n/*\n[DEFINE] \n[\n    [NAME]\n    FMOD_MEMORY_TYPE\n\n    [DESCRIPTION]   \n    Bit fields for memory allocation type being passed into FMOD memory callbacks.\n\n    [REMARKS]\n    Remember this is a bitfield.  You may get more than 1 bit set (ie physical + persistent) so do not simply switch on the types!  You must check each bit individually or clear out the bits that you do not want within the callback.<br>\n    Bits can be excluded if you want during Memory_Initialize so that you never get them.\n\n    [SEE_ALSO]\n    FMOD_MEMORY_ALLOC_CALLBACK\n    FMOD_MEMORY_REALLOC_CALLBACK\n    FMOD_MEMORY_FREE_CALLBACK\n    Memory_Initialize\n]\n*/\n#define FMOD_MEMORY_NORMAL             0x00000000       /* Standard memory. */\n#define FMOD_MEMORY_STREAM_FILE        0x00000001       /* Stream file buffer, size controllable with System::setStreamBufferSize. */\n#define FMOD_MEMORY_STREAM_DECODE      0x00000002       /* Stream decode buffer, size controllable with FMOD_CREATESOUNDEXINFO::decodebuffersize. */\n#define FMOD_MEMORY_SAMPLEDATA         0x00000004       /* Sample data buffer.  Raw audio data, usually PCM/MPEG/ADPCM/XMA data. */\n#define FMOD_MEMORY_DSP_BUFFER         0x00000008       /* DSP memory block allocated when more than 1 output exists on a DSP node. */\n#define FMOD_MEMORY_PLUGIN             0x00000010       /* Memory allocated by a third party plugin. */\n#define FMOD_MEMORY_XBOX360_PHYSICAL   0x00100000       /* Requires XPhysicalAlloc / XPhysicalFree. */\n#define FMOD_MEMORY_PERSISTENT         0x00200000       /* Persistent memory. Memory will be freed when System::release is called. */\n#define FMOD_MEMORY_SECONDARY          0x00400000       /* Secondary memory. Allocation should be in secondary memory. For example RSX on the PS3. */\n#define FMOD_MEMORY_ALL                0xFFFFFFFF\n/* [DEFINE_END] */\n\n\n/*\n[ENUM]\n[\n    [DESCRIPTION]   \n    These are speaker types defined for use with the System::setSoftwareFormat command.\n\n    [REMARKS]\n    Note below the phrase 'sound channels' is used.  These are the subchannels inside a sound, they are not related and \n    have nothing to do with the FMOD class \"Channel\".<br>\n    For example a mono sound has 1 sound channel, a stereo sound has 2 sound channels, and an AC3 or 6 channel wav file have 6 \"sound channels\".<br>\n    <br>\n    FMOD_SPEAKERMODE_RAW<br>\n    ---------------------<br>\n    This mode is for output devices that are not specifically mono/stereo/quad/surround/5.1 or 7.1, but are multichannel.<br>\n    <li>Use System::setSoftwareFormat to specify the number of speakers you want to address, otherwise it will default to 2 (stereo).<br>\n    <li>Sound channels map to speakers sequentially, so a mono sound maps to output speaker 0, stereo sound maps to output speaker 0 & 1.<br>\n    <li>The user assumes knowledge of the speaker order.  FMOD_SPEAKER enumerations may not apply, so raw channel indices should be used.<br>\n    <li>Multichannel sounds map input channels to output channels 1:1. <br>\n    <li>Speaker levels must be manually set with Channel::setMixMatrix.<br>\n    <li>Channel::setPan and Channel::setMixLevelsOutput do not work.<br>\n    <br>\n    FMOD_SPEAKERMODE_MONO<br>\n    ---------------------<br>\n    This mode is for a 1 speaker arrangement.<br>\n    <li>Panning does not work in this speaker mode.<br>\n    <li>Mono, stereo and multichannel sounds have each sound channel played on the one speaker at unity.<br>\n    <li>Mix behavior for multichannel sounds can be set with Channel::setMixMatrix.<br>\n    <br>\n    FMOD_SPEAKERMODE_STEREO<br>\n    -----------------------<br>\n    This mode is for 2 speaker arrangements that have a left and right speaker.<br>\n    <li>Mono sounds default to an even distribution between left and right.  They can be panned with Channel::setPan.<br>\n    <li>Stereo sounds default to the middle, or full left in the left speaker and full right in the right speaker.  They can be cross faded with Channel::setPan.<br>\n    <li>Multichannel sounds have each sound channel played on each speaker at unity.<br>\n    <li>Mix behavior for multichannel sounds can be set with Channel::setMixMatrix.<br>\n    <br>\n    FMOD_SPEAKERMODE_QUAD<br>\n    ------------------------<br>\n    This mode is for 4 speaker arrangements that have a front left, front right, surround left and a surround right speaker.<br>\n    <li>Mono sounds default to an even distribution between front left and front right.  They can be panned with Channel::setPan.<br>\n    <li>Stereo sounds default to the left sound channel played on the front left, and the right sound channel played on the front right.  They can be cross faded with Channel::setPan.<br>\n    <li>Multichannel sounds default to all of their sound channels being played on each speaker in order of input.<br>\n    <li>Mix behavior for multichannel sounds can be set with Channel::setMixMatrix.<br>\n    <br>\n    FMOD_SPEAKERMODE_SURROUND<br>\n    ------------------------<br>\n    This mode is for 5 speaker arrangements that have a left/right/center/surround left/surround right.<br>\n    <li>Mono sounds default to the center speaker.  They can be panned with Channel::setPan.<br>\n    <li>Stereo sounds default to the left sound channel played on the front left, and the right sound channel played on the front right.  They can be cross faded with Channel::setPan.<br>\n    <li>Multichannel sounds default to all of their sound channels being played on each speaker in order of input.  \n    <li>Mix behavior for multichannel sounds can be set with Channel::setMixMatrix.<br>\n    <br>\n    FMOD_SPEAKERMODE_5POINT1<br>\n    ---------------------------------------------------------<br>\n    This mode is for 5.1 speaker arrangements that have a left/right/center/surround left/surround right and a subwoofer speaker.<br>\n    <li>Mono sounds default to the center speaker.  They can be panned with Channel::setPan.<br>\n    <li>Stereo sounds default to the left sound channel played on the front left, and the right sound channel played on the front right.  They can be cross faded with Channel::setPan.<br>\n    <li>Multichannel sounds default to all of their sound channels being played on each speaker in order of input.  \n    <li>Mix behavior for multichannel sounds can be set with Channel::setMixMatrix.<br>\n    <br>\n    FMOD_SPEAKERMODE_7POINT1<br>\n    ------------------------<br>\n    This mode is for 7.1 speaker arrangements that have a left/right/center/surround left/surround right/rear left/rear right \n    and a subwoofer speaker.<br>\n    <li>Mono sounds default to the center speaker.  They can be panned with Channel::setPan.<br>\n    <li>Stereo sounds default to the left sound channel played on the front left, and the right sound channel played on the front right.  They can be cross faded with Channel::setPan.<br>\n    <li>Multichannel sounds default to all of their sound channels being played on each speaker in order of input.  \n    <li>Mix behavior for multichannel sounds can be set with Channel::setMixMatrix.<br>\n    <br>\n\n    [SEE_ALSO]\n    System::setSoftwareFormat\n    System::getSoftwareFormat\n    DSP::setChannelFormat\n]\n*/\ntypedef enum FMOD_SPEAKERMODE\n{\n    FMOD_SPEAKERMODE_DEFAULT,          /* Default speaker mode for the chosen output mode which will resolve after System::init. */\n    FMOD_SPEAKERMODE_RAW,              /* Assume there is no special mapping from a given channel to a speaker, channels map 1:1 in order. Use System::setSoftwareFormat to specify the speaker count. */\n    FMOD_SPEAKERMODE_MONO,             /*  1 speaker setup (monaural). */\n    FMOD_SPEAKERMODE_STEREO,           /*  2 speaker setup (stereo) front left, front right. */\n    FMOD_SPEAKERMODE_QUAD,             /*  4 speaker setup (4.0)    front left, front right, surround left, surround right. */\n    FMOD_SPEAKERMODE_SURROUND,         /*  5 speaker setup (5.0)    front left, front right, center, surround left, surround right. */\n    FMOD_SPEAKERMODE_5POINT1,          /*  6 speaker setup (5.1)    front left, front right, center, low frequency, surround left, surround right. */\n    FMOD_SPEAKERMODE_7POINT1,          /*  8 speaker setup (7.1)    front left, front right, center, low frequency, surround left, surround right, back left, back right. */\n    FMOD_SPEAKERMODE_7POINT1POINT4,    /* 12 speaker setup (7.1.4)  front left, front right, center, low frequency, surround left, surround right, back left, back right, top front left, top front right, top back left, top back right. */\n    \n    FMOD_SPEAKERMODE_MAX,              /* Maximum number of speaker modes supported. */\n    FMOD_SPEAKERMODE_FORCEINT = 65536  /* Makes sure this enum is signed 32bit. */\n} FMOD_SPEAKERMODE;\n\n\n/*\n[DEFINE]\n[\n    [NAME]\n    FMOD_MAX_CHANNEL_WIDTH\n\n    [DESCRIPTION]   \n    The maximum number of channels per frame of audio supported by audio files, buffers, connections and DSPs. <br>\n\n    [REMARKS]\n\n    [SEE_ALSO]\n    FMOD_CHANNELORDER\n    FMOD_CREATESOUNDEXINFO\n    System::setSoftwareFormat\n    System::getDefaultMixMatrix\n    ChannelControl::setMixMatrix\n    ChannelControl::getMixMatrix\n    FMOD::DSP::setChannelFormat\n]\n*/\n#define FMOD_MAX_CHANNEL_WIDTH 32\n/* [DEFINE_END] */\n\n\n/*\n[DEFINE]\n[\n    [NAME]\n    FMOD_MAX_SYSTEMS\n\n    [DESCRIPTION]\n    The maximum number of FMOD::System objects allowed.\n\n    [REMARKS]\n\n    [SEE_ALSO]\n    System_Create\n]\n*/\n#define FMOD_MAX_SYSTEMS 8\n/* [DEFINE_END] */\n\n\n/*\n[DEFINE]\n[\n    [NAME]\n    FMOD_MAX_LISTENERS\n\n    [DESCRIPTION]\n    The maximum number of listeners supported.\n\n    [REMARKS]\n\n    [SEE_ALSO]\n    System::set3DNumListeners\n    System::set3DListenerAttributes\n    System::get3DListenerAttributes\n]\n*/\n#define FMOD_MAX_LISTENERS 8\n/* [DEFINE_END] */\n\n\n/*\n[ENUM]\n[\n    [DESCRIPTION]\n    Assigns an enumeration for a speaker index.\n\n    [REMARKS]\n\n    [SEE_ALSO]\n    System::setSpeakerPosition\n    System::getSpeakerPosition\n]\n*/\ntypedef enum FMOD_SPEAKER\n{\n    FMOD_SPEAKER_FRONT_LEFT,        /* The front left speaker */\n    FMOD_SPEAKER_FRONT_RIGHT,       /* The front right speaker */\n    FMOD_SPEAKER_FRONT_CENTER,      /* The front center speaker */\n    FMOD_SPEAKER_LOW_FREQUENCY,     /* The LFE or 'subwoofer' speaker */\n    FMOD_SPEAKER_SURROUND_LEFT,     /* The surround left (usually to the side) speaker */\n    FMOD_SPEAKER_SURROUND_RIGHT,    /* The surround right (usually to the side) speaker */\n    FMOD_SPEAKER_BACK_LEFT,         /* The back left speaker */\n    FMOD_SPEAKER_BACK_RIGHT,        /* The back right speaker */\n    FMOD_SPEAKER_TOP_FRONT_LEFT,    /* The top front left speaker */\n    FMOD_SPEAKER_TOP_FRONT_RIGHT,   /* The top front right speaker */\n    FMOD_SPEAKER_TOP_BACK_LEFT,     /* The top back left speaker */\n    FMOD_SPEAKER_TOP_BACK_RIGHT,    /* The top back right speaker */\n\n    FMOD_SPEAKER_MAX,               /* Maximum number of speaker types supported. */\n    FMOD_SPEAKER_FORCEINT = 65536   /* Makes sure this enum is signed 32bit. */\n} FMOD_SPEAKER;\n\n\n/*\n[DEFINE]\n[\n    [NAME]\n    FMOD_CHANNELMASK\n\n    [DESCRIPTION]   \n    These are bitfields to describe for a certain number of channels in a signal, which channels are being represented.<br>\n    For example, a signal could be 1 channel, but contain the LFE channel only.<br>\n\n    [REMARKS]\n    FMOD_CHANNELMASK_BACK_CENTER is not represented as an output speaker in fmod - but it is encountered in input formats and is down or upmixed appropriately to the nearest speakers.<br>\n\n    [SEE_ALSO]\n    DSP::setChannelFormat\n    DSP::getChannelFormat\n    FMOD_SPEAKERMODE\n]\n*/\n#define FMOD_CHANNELMASK_FRONT_LEFT             0x00000001\n#define FMOD_CHANNELMASK_FRONT_RIGHT            0x00000002\n#define FMOD_CHANNELMASK_FRONT_CENTER           0x00000004\n#define FMOD_CHANNELMASK_LOW_FREQUENCY          0x00000008\n#define FMOD_CHANNELMASK_SURROUND_LEFT          0x00000010\n#define FMOD_CHANNELMASK_SURROUND_RIGHT         0x00000020\n#define FMOD_CHANNELMASK_BACK_LEFT              0x00000040\n#define FMOD_CHANNELMASK_BACK_RIGHT             0x00000080\n#define FMOD_CHANNELMASK_BACK_CENTER            0x00000100\n\n#define FMOD_CHANNELMASK_MONO                    (FMOD_CHANNELMASK_FRONT_LEFT)\n#define FMOD_CHANNELMASK_STEREO                  (FMOD_CHANNELMASK_FRONT_LEFT | FMOD_CHANNELMASK_FRONT_RIGHT)\n#define FMOD_CHANNELMASK_LRC                     (FMOD_CHANNELMASK_FRONT_LEFT | FMOD_CHANNELMASK_FRONT_RIGHT | FMOD_CHANNELMASK_FRONT_CENTER)\n#define FMOD_CHANNELMASK_QUAD                    (FMOD_CHANNELMASK_FRONT_LEFT | FMOD_CHANNELMASK_FRONT_RIGHT | FMOD_CHANNELMASK_SURROUND_LEFT | FMOD_CHANNELMASK_SURROUND_RIGHT)\n#define FMOD_CHANNELMASK_SURROUND                (FMOD_CHANNELMASK_FRONT_LEFT | FMOD_CHANNELMASK_FRONT_RIGHT | FMOD_CHANNELMASK_FRONT_CENTER | FMOD_CHANNELMASK_SURROUND_LEFT | FMOD_CHANNELMASK_SURROUND_RIGHT)\n#define FMOD_CHANNELMASK_5POINT1                 (FMOD_CHANNELMASK_FRONT_LEFT | FMOD_CHANNELMASK_FRONT_RIGHT | FMOD_CHANNELMASK_FRONT_CENTER | FMOD_CHANNELMASK_LOW_FREQUENCY | FMOD_CHANNELMASK_SURROUND_LEFT | FMOD_CHANNELMASK_SURROUND_RIGHT)\n#define FMOD_CHANNELMASK_5POINT1_REARS           (FMOD_CHANNELMASK_FRONT_LEFT | FMOD_CHANNELMASK_FRONT_RIGHT | FMOD_CHANNELMASK_FRONT_CENTER | FMOD_CHANNELMASK_LOW_FREQUENCY | FMOD_CHANNELMASK_BACK_LEFT | FMOD_CHANNELMASK_BACK_RIGHT)\n#define FMOD_CHANNELMASK_7POINT0                 (FMOD_CHANNELMASK_FRONT_LEFT | FMOD_CHANNELMASK_FRONT_RIGHT | FMOD_CHANNELMASK_FRONT_CENTER | FMOD_CHANNELMASK_SURROUND_LEFT | FMOD_CHANNELMASK_SURROUND_RIGHT | FMOD_CHANNELMASK_BACK_LEFT | FMOD_CHANNELMASK_BACK_RIGHT)\n#define FMOD_CHANNELMASK_7POINT1                 (FMOD_CHANNELMASK_FRONT_LEFT | FMOD_CHANNELMASK_FRONT_RIGHT | FMOD_CHANNELMASK_FRONT_CENTER | FMOD_CHANNELMASK_LOW_FREQUENCY | FMOD_CHANNELMASK_SURROUND_LEFT | FMOD_CHANNELMASK_SURROUND_RIGHT | FMOD_CHANNELMASK_BACK_LEFT | FMOD_CHANNELMASK_BACK_RIGHT)\n/* [DEFINE_END] */\n\n/*\n[ENUM]\n[\n    [DESCRIPTION]\n    When creating a multichannel sound, FMOD will pan them to their default speaker locations, for example a 6 channel sound will default to one channel per 5.1 output speaker.<br>\n    Another example is a stereo sound.  It will default to left = front left, right = front right.<br>\n    <br>\n    This is for sounds that are not 'default'.  For example you might have a sound that is 6 channels but actually made up of 3 stereo pairs, that should all be located in front left, front right only.\n\n    [REMARKS]\n\n    [SEE_ALSO]\n    FMOD_CREATESOUNDEXINFO\n    FMOD_MAX_CHANNEL_WIDTH\n]\n*/\ntypedef enum FMOD_CHANNELORDER\n{\n    FMOD_CHANNELORDER_DEFAULT,              /* Left, Right, Center, LFE, Surround Left, Surround Right, Back Left, Back Right (see FMOD_SPEAKER enumeration)   */\n    FMOD_CHANNELORDER_WAVEFORMAT,           /* Left, Right, Center, LFE, Back Left, Back Right, Surround Left, Surround Right (as per Microsoft .wav WAVEFORMAT structure master order) */\n    FMOD_CHANNELORDER_PROTOOLS,             /* Left, Center, Right, Surround Left, Surround Right, LFE */\n    FMOD_CHANNELORDER_ALLMONO,              /* Mono, Mono, Mono, Mono, Mono, Mono, ... (each channel all the way up to FMOD_MAX_CHANNEL_WIDTH channels are treated as if they were mono) */\n    FMOD_CHANNELORDER_ALLSTEREO,            /* Left, Right, Left, Right, Left, Right, ... (each pair of channels is treated as stereo all the way up to FMOD_MAX_CHANNEL_WIDTH channels) */\n    FMOD_CHANNELORDER_ALSA,                 /* Left, Right, Surround Left, Surround Right, Center, LFE (as per Linux ALSA channel order) */\n\n    FMOD_CHANNELORDER_MAX,                  /* Maximum number of channel orderings supported. */\n    FMOD_CHANNELORDER_FORCEINT = 65536      /* Makes sure this enum is signed 32bit. */\n} FMOD_CHANNELORDER;\n\n\n/*\n[ENUM]\n[\n    [DESCRIPTION]   \n    These are plugin types defined for use with the System::getNumPlugins, \n    System::getPluginInfo and System::unloadPlugin functions.\n\n    [REMARKS]\n\n    [SEE_ALSO]\n    System::getNumPlugins\n    System::getPluginInfo\n    System::unloadPlugin\n]\n*/\ntypedef enum FMOD_PLUGINTYPE\n{\n    FMOD_PLUGINTYPE_OUTPUT,          /* The plugin type is an output module.  FMOD mixed audio will play through one of these devices */\n    FMOD_PLUGINTYPE_CODEC,           /* The plugin type is a file format codec.  FMOD will use these codecs to load file formats for playback. */\n    FMOD_PLUGINTYPE_DSP,             /* The plugin type is a DSP unit.  FMOD will use these plugins as part of its DSP network to apply effects to output or generate sound in realtime. */\n\n    FMOD_PLUGINTYPE_MAX,             /* Maximum number of plugin types supported. */\n    FMOD_PLUGINTYPE_FORCEINT = 65536 /* Makes sure this enum is signed 32bit. */\n} FMOD_PLUGINTYPE;\n\n/*\n[STRUCTURE]\n[\n    [DESCRIPTION]\n    Used to support lists of plugins within the one file.\n\n    [REMARKS]\n    The description field is either a pointer to FMOD_DSP_DESCRIPTION, FMOD_OUTPUT_DESCRIPTION, FMOD_CODEC_DESCRIPTION.\n\n    This structure is returned from a plugin as a pointer to a list where the last entry has FMOD_PLUGINTYPE_MAX and\n    a null description pointer.\n\n    [SEE_ALSO]\n    System::getNumNestedPlugins\n    System::getNestedPlugin\n]\n*/\ntypedef struct FMOD_PLUGINLIST\n{\n    FMOD_PLUGINTYPE   type;         /* The plugin type */\n    void*             description;  /* One of FMOD_DSP_DESCRIPTION, FMOD_OUTPUT_DESCRIPTION, FMOD_CODEC_DESCRIPTION */\n} FMOD_PLUGINLIST;\n\n\n/*\n[DEFINE]\n[\n    [NAME]\n    FMOD_INITFLAGS\n\n    [DESCRIPTION]   \n    Initialization flags.  Use them with System::init in the *flags* parameter to change various behavior.  \n\n    [REMARKS]\n    Use System::setAdvancedSettings to adjust settings for some of the features that are enabled by these flags.\n\n    [SEE_ALSO]\n    System::init\n    System::update \n    System::setAdvancedSettings\n    Channel::set3DOcclusion\n]\n*/\n#define FMOD_INIT_NORMAL                     0x00000000 /* Initialize normally */\n#define FMOD_INIT_STREAM_FROM_UPDATE         0x00000001 /* No stream thread is created internally.  Streams are driven from System::update.  Mainly used with non-realtime outputs. */\n#define FMOD_INIT_MIX_FROM_UPDATE            0x00000002 /* No mixer thread is created internally. Mixing is driven from System::update. Only applies to polling based output modes such as FMOD_OUTPUTTYPE_NOSOUND, FMOD_OUTPUTTYPE_WAVWRITER, FMOD_OUTPUTTYPE_DSOUND, FMOD_OUTPUTTYPE_WINMM,FMOD_OUTPUTTYPE_XAUDIO. */\n#define FMOD_INIT_3D_RIGHTHANDED             0x00000004 /* 3D calculations will be performed in right-handed coordinates. */\n#define FMOD_INIT_CHANNEL_LOWPASS            0x00000100 /* Enables usage of Channel::setLowPassGain,  Channel::set3DOcclusion, or automatic usage by the Geometry API.  All voices will add a software lowpass filter effect into the DSP chain which is idle unless one of the previous functions/features are used. */\n#define FMOD_INIT_CHANNEL_DISTANCEFILTER     0x00000200 /* All FMOD_3D based voices will add a software lowpass and highpass filter effect into the DSP chain which will act as a distance-automated bandpass filter. Use System::setAdvancedSettings to adjust the center frequency. */\n#define FMOD_INIT_PROFILE_ENABLE             0x00010000 /* Enable TCP/IP based host which allows FMOD Designer or FMOD Profiler to connect to it, and view memory, CPU and the DSP network graph in real-time. */\n#define FMOD_INIT_VOL0_BECOMES_VIRTUAL       0x00020000 /* Any sounds that are 0 volume will go virtual and not be processed except for having their positions updated virtually.  Use System::setAdvancedSettings to adjust what volume besides zero to switch to virtual at. */\n#define FMOD_INIT_GEOMETRY_USECLOSEST        0x00040000 /* With the geometry engine, only process the closest polygon rather than accumulating all polygons the sound to listener line intersects. */\n#define FMOD_INIT_PREFER_DOLBY_DOWNMIX       0x00080000 /* When using FMOD_SPEAKERMODE_5POINT1 with a stereo output device, use the Dolby Pro Logic II downmix algorithm instead of the SRS Circle Surround algorithm. */\n#define FMOD_INIT_THREAD_UNSAFE              0x00100000 /* Disables thread safety for API calls. Only use this if FMOD low level is being called from a single thread, and if Studio API is not being used! */\n#define FMOD_INIT_PROFILE_METER_ALL          0x00200000 /* Slower, but adds level metering for every single DSP unit in the graph.  Use DSP::setMeteringEnabled to turn meters off individually. */\n#define FMOD_INIT_DISABLE_SRS_HIGHPASSFILTER 0x00400000 /* Using FMOD_SPEAKERMODE_5POINT1 with a stereo output device will enable the SRS Circle Surround downmixer. By default the SRS downmixer applies a high pass filter with a cutoff frequency of 80Hz. Use this flag to diable the high pass fitler, or use FMOD_INIT_PREFER_DOLBY_DOWNMIX to use the Dolby Pro Logic II downmix algorithm instead. */\n/* [DEFINE_END] */\n\n\n/*\n[ENUM]\n[\n    [DESCRIPTION]   \n    These definitions describe the type of song being played.\n\n    [REMARKS]\n\n    [SEE_ALSO]      \n    Sound::getFormat\n]\n*/\ntypedef enum FMOD_SOUND_TYPE\n{\n    FMOD_SOUND_TYPE_UNKNOWN,         /* 3rd party / unknown plugin format. */\n    FMOD_SOUND_TYPE_AIFF,            /* AIFF. */\n    FMOD_SOUND_TYPE_ASF,             /* Microsoft Advanced Systems Format (ie WMA/ASF/WMV). */\n    FMOD_SOUND_TYPE_DLS,             /* Sound font / downloadable sound bank. */\n    FMOD_SOUND_TYPE_FLAC,            /* FLAC lossless codec. */\n    FMOD_SOUND_TYPE_FSB,             /* FMOD Sample Bank. */\n    FMOD_SOUND_TYPE_IT,              /* Impulse Tracker. */\n    FMOD_SOUND_TYPE_MIDI,            /* MIDI. */\n    FMOD_SOUND_TYPE_MOD,             /* Protracker / Fasttracker MOD. */\n    FMOD_SOUND_TYPE_MPEG,            /* MP2/MP3 MPEG. */\n    FMOD_SOUND_TYPE_OGGVORBIS,       /* Ogg vorbis. */\n    FMOD_SOUND_TYPE_PLAYLIST,        /* Information only from ASX/PLS/M3U/WAX playlists */\n    FMOD_SOUND_TYPE_RAW,             /* Raw PCM data. */\n    FMOD_SOUND_TYPE_S3M,             /* ScreamTracker 3. */\n    FMOD_SOUND_TYPE_USER,            /* User created sound. */\n    FMOD_SOUND_TYPE_WAV,             /* Microsoft WAV. */\n    FMOD_SOUND_TYPE_XM,              /* FastTracker 2 XM. */\n    FMOD_SOUND_TYPE_XMA,             /* Xbox360 XMA */\n    FMOD_SOUND_TYPE_AUDIOQUEUE,      /* iPhone hardware decoder, supports AAC, ALAC and MP3. */\n    FMOD_SOUND_TYPE_AT9,             /* PS4 / PSVita ATRAC 9 format */\n    FMOD_SOUND_TYPE_VORBIS,          /* Vorbis */\n    FMOD_SOUND_TYPE_MEDIA_FOUNDATION,/* Windows Store Application built in system codecs */\n    FMOD_SOUND_TYPE_MEDIACODEC,      /* Android MediaCodec */\n    FMOD_SOUND_TYPE_FADPCM,          /* FMOD Adaptive Differential Pulse Code Modulation */\n\n    FMOD_SOUND_TYPE_MAX,             /* Maximum number of sound types supported. */\n    FMOD_SOUND_TYPE_FORCEINT = 65536 /* Makes sure this enum is signed 32bit. */\n} FMOD_SOUND_TYPE;\n\n\n/*\n[ENUM]\n[\n    [DESCRIPTION]   \n    These definitions describe the native format of the hardware or software buffer that will be used.\n\n    [REMARKS]\n    This is the format the native hardware or software buffer will be or is created in.\n\n    [SEE_ALSO]\n    System::createSound\n    Sound::getFormat\n]\n*/\ntypedef enum FMOD_SOUND_FORMAT\n{\n    FMOD_SOUND_FORMAT_NONE,             /* Unitialized / unknown. */\n    FMOD_SOUND_FORMAT_PCM8,             /* 8bit integer PCM data. */\n    FMOD_SOUND_FORMAT_PCM16,            /* 16bit integer PCM data. */\n    FMOD_SOUND_FORMAT_PCM24,            /* 24bit integer PCM data. */\n    FMOD_SOUND_FORMAT_PCM32,            /* 32bit integer PCM data. */\n    FMOD_SOUND_FORMAT_PCMFLOAT,         /* 32bit floating point PCM data. */\n    FMOD_SOUND_FORMAT_BITSTREAM,        /* Sound data is in its native compressed format. */\n\n    FMOD_SOUND_FORMAT_MAX,              /* Maximum number of sound formats supported. */   \n    FMOD_SOUND_FORMAT_FORCEINT = 65536  /* Makes sure this enum is signed 32bit. */\n} FMOD_SOUND_FORMAT;\n\n\n/*\n[DEFINE]\n[\n    [NAME] \n    FMOD_MODE\n\n    [DESCRIPTION]   \n    Sound description bitfields, bitwise OR them together for loading and describing sounds.\n\n    [REMARKS]\n    By default a sound will open as a static sound that is decompressed fully into memory to PCM. (ie equivalent of FMOD_CREATESAMPLE)<br>\n    To have a sound stream instead, use FMOD_CREATESTREAM, or use the wrapper function System::createStream.<br>\n    Some opening modes (ie FMOD_OPENUSER, FMOD_OPENMEMORY, FMOD_OPENMEMORY_POINT, FMOD_OPENRAW) will need extra information.<br>\n    This can be provided using the FMOD_CREATESOUNDEXINFO structure.\n    <br>\n    Specifying FMOD_OPENMEMORY_POINT will POINT to your memory rather allocating its own sound buffers and duplicating it internally.<br>\n    <b><u>This means you cannot free the memory while FMOD is using it, until after Sound::release is called.</b></u>\n    With FMOD_OPENMEMORY_POINT, for PCM formats, only WAV, FSB, and RAW are supported.  For compressed formats, only those formats supported by FMOD_CREATECOMPRESSEDSAMPLE are supported.<br>\n    With FMOD_OPENMEMORY_POINT and FMOD_OPENRAW or PCM, if using them together, note that you must pad the data on each side by 16 bytes.  This is so fmod can modify the ends of the data for looping/interpolation/mixing purposes.  If a wav file, you will need to insert silence, and then reset loop points to stop the playback from playing that silence.<br>\n    <br>\n    <b>Xbox 360 memory</b> On Xbox 360 Specifying FMOD_OPENMEMORY_POINT to a virtual memory address will cause FMOD_ERR_INVALID_ADDRESS\n    to be returned.  Use physical memory only for this functionality.<br>\n    <br>\n    FMOD_LOWMEM is used on a sound if you want to minimize the memory overhead, by having FMOD not allocate memory for certain \n    features that are not likely to be used in a game environment.  These are :<br>\n    1. Sound::getName functionality is removed.  256 bytes per sound is saved.<br>\n\n    [SEE_ALSO]\n    System::createSound\n    System::createStream\n    Sound::setMode\n    Sound::getMode\n    Channel::setMode\n    Channel::getMode\n    Sound::set3DCustomRolloff\n    Channel::set3DCustomRolloff\n    Sound::getOpenState\n]\n*/\n#define FMOD_DEFAULT                   0x00000000  /* Default for all modes listed below. FMOD_LOOP_OFF, FMOD_2D, FMOD_3D_WORLDRELATIVE, FMOD_3D_INVERSEROLLOFF */\n#define FMOD_LOOP_OFF                  0x00000001  /* For non looping sounds. (DEFAULT).  Overrides FMOD_LOOP_NORMAL / FMOD_LOOP_BIDI. */\n#define FMOD_LOOP_NORMAL               0x00000002  /* For forward looping sounds. */\n#define FMOD_LOOP_BIDI                 0x00000004  /* For bidirectional looping sounds. (only works on software mixed static sounds). */\n#define FMOD_2D                        0x00000008  /* Ignores any 3d processing. (DEFAULT). */\n#define FMOD_3D                        0x00000010  /* Makes the sound positionable in 3D.  Overrides FMOD_2D. */\n#define FMOD_CREATESTREAM              0x00000080  /* Decompress at runtime, streaming from the source provided (ie from disk).  Overrides FMOD_CREATESAMPLE and FMOD_CREATECOMPRESSEDSAMPLE.  Note a stream can only be played once at a time due to a stream only having 1 stream buffer and file handle.  Open multiple streams to have them play concurrently. */\n#define FMOD_CREATESAMPLE              0x00000100  /* Decompress at loadtime, decompressing or decoding whole file into memory as the target sample format (ie PCM).  Fastest for playback and most flexible.  */\n#define FMOD_CREATECOMPRESSEDSAMPLE    0x00000200  /* Load MP2/MP3/FADPCM/IMAADPCM/Vorbis/AT9 or XMA into memory and leave it compressed.  Vorbis/AT9/FADPCM encoding only supported in the .FSB container format.  During playback the FMOD software mixer will decode it in realtime as a 'compressed sample'.  Overrides FMOD_CREATESAMPLE.  If the sound data is not one of the supported formats, it will behave as if it was created with FMOD_CREATESAMPLE and decode the sound into PCM. */\n#define FMOD_OPENUSER                  0x00000400  /* Opens a user created static sample or stream. Use FMOD_CREATESOUNDEXINFO to specify format, defaultfrequency, numchannels, and optionally a read callback.  If a user created 'sample' is created with no read callback, the sample will be empty.  Use Sound::lock and Sound::unlock to place sound data into the sound if this is the case. */\n#define FMOD_OPENMEMORY                0x00000800  /* \"name_or_data\" will be interpreted as a pointer to memory instead of filename for creating sounds.  Use FMOD_CREATESOUNDEXINFO to specify length.  If used with FMOD_CREATESAMPLE or FMOD_CREATECOMPRESSEDSAMPLE, FMOD duplicates the memory into its own buffers.  Your own buffer can be freed after open.  If used with FMOD_CREATESTREAM, FMOD will stream out of the buffer whose pointer you passed in.  In this case, your own buffer should not be freed until you have finished with and released the stream.*/\n#define FMOD_OPENMEMORY_POINT          0x10000000  /* \"name_or_data\" will be interpreted as a pointer to memory instead of filename for creating sounds.  Use FMOD_CREATESOUNDEXINFO to specify length.  This differs to FMOD_OPENMEMORY in that it uses the memory as is, without duplicating the memory into its own buffers.  Cannot be freed after open, only after Sound::release.   Will not work if the data is compressed and FMOD_CREATECOMPRESSEDSAMPLE is not used. */\n#define FMOD_OPENRAW                   0x00001000  /* Will ignore file format and treat as raw pcm.  Use FMOD_CREATESOUNDEXINFO to specify format.  Requires at least defaultfrequency, numchannels and format to be specified before it will open.  Must be little endian data. */\n#define FMOD_OPENONLY                  0x00002000  /* Just open the file, dont prebuffer or read.  Good for fast opens for info, or when sound::readData is to be used. */\n#define FMOD_ACCURATETIME              0x00004000  /* For System::createSound - for accurate Sound::getLength/Channel::setPosition on VBR MP3, and MOD/S3M/XM/IT/MIDI files.  Scans file first, so takes longer to open. FMOD_OPENONLY does not affect this. */\n#define FMOD_MPEGSEARCH                0x00008000  /* For corrupted / bad MP3 files.  This will search all the way through the file until it hits a valid MPEG header.  Normally only searches for 4k. */\n#define FMOD_NONBLOCKING               0x00010000  /* For opening sounds and getting streamed subsounds (seeking) asyncronously.  Use Sound::getOpenState to poll the state of the sound as it opens or retrieves the subsound in the background. */\n#define FMOD_UNIQUE                    0x00020000  /* Unique sound, can only be played one at a time */\n#define FMOD_3D_HEADRELATIVE           0x00040000  /* Make the sound's position, velocity and orientation relative to the listener. */\n#define FMOD_3D_WORLDRELATIVE          0x00080000  /* Make the sound's position, velocity and orientation absolute (relative to the world). (DEFAULT) */\n#define FMOD_3D_INVERSEROLLOFF         0x00100000  /* This sound will follow the inverse rolloff model where mindistance = full volume, maxdistance = where sound stops attenuating, and rolloff is fixed according to the global rolloff factor.  (DEFAULT) */\n#define FMOD_3D_LINEARROLLOFF          0x00200000  /* This sound will follow a linear rolloff model where mindistance = full volume, maxdistance = silence. */\n#define FMOD_3D_LINEARSQUAREROLLOFF    0x00400000  /* This sound will follow a linear-square rolloff model where mindistance = full volume, maxdistance = silence. */\n#define FMOD_3D_INVERSETAPEREDROLLOFF  0x00800000  /* This sound will follow the inverse rolloff model at distances close to mindistance and a linear-square rolloff close to maxdistance. */\n#define FMOD_3D_CUSTOMROLLOFF          0x04000000  /* This sound will follow a rolloff model defined by Sound::set3DCustomRolloff / Channel::set3DCustomRolloff.  */\n#define FMOD_3D_IGNOREGEOMETRY         0x40000000  /* Is not affect by geometry occlusion.  If not specified in Sound::setMode, or Channel::setMode, the flag is cleared and it is affected by geometry again. */\n/* Unused                              0x01000000  Used to be FMOD_UNICODE */\n#define FMOD_IGNORETAGS                0x02000000  /* Skips id3v2/asf/etc tag checks when opening a sound, to reduce seek/read overhead when opening files (helps with CD performance). */\n#define FMOD_LOWMEM                    0x08000000  /* Removes some features from samples to give a lower memory overhead, like Sound::getName.  See remarks. */\n#define FMOD_LOADSECONDARYRAM          0x20000000  /* Load sound into the secondary RAM of supported platform. On PS3, sounds will be loaded into RSX/VRAM. */\n#define FMOD_VIRTUAL_PLAYFROMSTART     0x80000000  /* For sounds that start virtual (due to being quiet or low importance), instead of swapping back to audible, and playing at the correct offset according to time, this flag makes the sound play from the start. */\n/* [DEFINE_END] */\n\n\n/*\n[ENUM]\n[\n    [DESCRIPTION]   \n    These values describe what state a sound is in after FMOD_NONBLOCKING has been used to open it.\n\n    [REMARKS]\n    With streams, if you are using FMOD_NONBLOCKING, note that if the user calls Sound::getSubSound, a stream will go into FMOD_OPENSTATE_SEEKING state and sound related commands will return FMOD_ERR_NOTREADY.<br>\n    With streams, if you are using FMOD_NONBLOCKING, note that if the user calls Channel::getPosition, a stream will go into FMOD_OPENSTATE_SETPOSITION state and sound related commands will return FMOD_ERR_NOTREADY.<br>\n\n    [SEE_ALSO]\n    Sound::getOpenState\n    FMOD_MODE\n]\n*/\ntypedef enum FMOD_OPENSTATE\n{\n    FMOD_OPENSTATE_READY = 0,       /* Opened and ready to play. */\n    FMOD_OPENSTATE_LOADING,         /* Initial load in progress. */\n    FMOD_OPENSTATE_ERROR,           /* Failed to open - file not found, out of memory etc.  See return value of Sound::getOpenState for what happened. */\n    FMOD_OPENSTATE_CONNECTING,      /* Connecting to remote host (internet sounds only). */\n    FMOD_OPENSTATE_BUFFERING,       /* Buffering data. */\n    FMOD_OPENSTATE_SEEKING,         /* Seeking to subsound and re-flushing stream buffer. */\n    FMOD_OPENSTATE_PLAYING,         /* Ready and playing, but not possible to release at this time without stalling the main thread. */\n    FMOD_OPENSTATE_SETPOSITION,     /* Seeking within a stream to a different position. */\n\n    FMOD_OPENSTATE_MAX,             /* Maximum number of open state types. */\n    FMOD_OPENSTATE_FORCEINT = 65536 /* Makes sure this enum is signed 32bit. */\n} FMOD_OPENSTATE;\n\n\n/*\n[ENUM]\n[\n    [DESCRIPTION]   \n    These values are used with SoundGroup::setMaxAudibleBehavior to determine what happens when more sounds \n    are played than are specified with SoundGroup::setMaxAudible.\n\n    [REMARKS]\n    When using FMOD_SOUNDGROUP_BEHAVIOR_MUTE, SoundGroup::setMuteFadeSpeed can be used to stop a sudden transition.  \n    Instead, the time specified will be used to cross fade between the sounds that go silent and the ones that become audible.\n\n    [SEE_ALSO]      \n    SoundGroup::setMaxAudibleBehavior\n    SoundGroup::getMaxAudibleBehavior\n    SoundGroup::setMaxAudible\n    SoundGroup::getMaxAudible\n    SoundGroup::setMuteFadeSpeed\n    SoundGroup::getMuteFadeSpeed\n]\n*/\ntypedef enum FMOD_SOUNDGROUP_BEHAVIOR\n{\n    FMOD_SOUNDGROUP_BEHAVIOR_FAIL,              /* Any sound played that puts the sound count over the SoundGroup::setMaxAudible setting, will simply fail during System::playSound. */\n    FMOD_SOUNDGROUP_BEHAVIOR_MUTE,              /* Any sound played that puts the sound count over the SoundGroup::setMaxAudible setting, will be silent, then if another sound in the group stops the sound that was silent before becomes audible again. */\n    FMOD_SOUNDGROUP_BEHAVIOR_STEALLOWEST,       /* Any sound played that puts the sound count over the SoundGroup::setMaxAudible setting, will steal the quietest / least important sound playing in the group. */\n\n    FMOD_SOUNDGROUP_BEHAVIOR_MAX,               /* Maximum number of sound group behaviors. */\n    FMOD_SOUNDGROUP_BEHAVIOR_FORCEINT = 65536   /* Makes sure this enum is signed 32bit. */\n} FMOD_SOUNDGROUP_BEHAVIOR;\n\n\n/*\n[ENUM]\n[\n    [DESCRIPTION]   \n    These callback types are used with Channel::setCallback.\n\n    [REMARKS]\n    Each callback has commanddata parameters passed as int unique to the type of callback.<br>\n    See reference to FMOD_CHANNELCONTROL_CALLBACK to determine what they might mean for each type of callback.<br>\n    <br>\n    <b>Note!</b>  Currently the user must call System::update for these callbacks to trigger!\n\n    [SEE_ALSO]      \n    Channel::setCallback\n    ChannelGroup::setCallback\n    FMOD_CHANNELCONTROL_CALLBACK\n    System::update\n]\n*/\ntypedef enum FMOD_CHANNELCONTROL_CALLBACK_TYPE\n{\n    FMOD_CHANNELCONTROL_CALLBACK_END,                  /* Called when a sound ends. */\n    FMOD_CHANNELCONTROL_CALLBACK_VIRTUALVOICE,         /* Called when a voice is swapped out or swapped in. */\n    FMOD_CHANNELCONTROL_CALLBACK_SYNCPOINT,            /* Called when a syncpoint is encountered.  Can be from wav file markers. */\n    FMOD_CHANNELCONTROL_CALLBACK_OCCLUSION,            /* Called when the channel has its geometry occlusion value calculated.  Can be used to clamp or change the value. */\n\n    FMOD_CHANNELCONTROL_CALLBACK_MAX,                  /* Maximum number of callback types supported. */\n    FMOD_CHANNELCONTROL_CALLBACK_FORCEINT = 65536      /* Makes sure this enum is signed 32bit. */\n} FMOD_CHANNELCONTROL_CALLBACK_TYPE;\n\n\n/*\n[ENUM]\n[\n    [DESCRIPTION]   \n    These enums denote special types of node within a DSP chain.\n\n    [REMARKS]\n    By default there is 1 fader for a ChannelGroup or Channel, and it is the head.\n\n    [SEE_ALSO]\n    Channel::getDSP\n    ChannelGroup::getDSP\n    ChannelControl::getNumDSPs\n    ChannelControl::setDSPIndex\n]\n*/\ntypedef enum FMOD_CHANNELCONTROL_DSP_INDEX\n{\n    FMOD_CHANNELCONTROL_DSP_HEAD = -1,          /* Head of the DSP chain.   Equivalent of index 0. */\n    FMOD_CHANNELCONTROL_DSP_FADER = -2,         /* Built in fader DSP. */\n    FMOD_CHANNELCONTROL_DSP_TAIL = -3,          /* Tail of the DSP chain.  Equivalent of the number of dsps minus 1. */\n\n    FMOD_CHANNELCONTROL_DSP_FORCEINT = 65536    /* Makes sure this enum is signed 32bit. */\n} FMOD_CHANNELCONTROL_DSP_INDEX;\n\n/*\n[ENUM] \n[\n    [DESCRIPTION]   \n    Used to distinguish the instance type passed into FMOD_ERROR_CALLBACK.\n\n    [REMARKS]\n    Cast the instance of FMOD_ERROR_CALLBACK to the appropriate class indicated by this enum.\n\n    [SEE_ALSO]      \n]\n*/\ntypedef enum FMOD_ERRORCALLBACK_INSTANCETYPE\n{\n    FMOD_ERRORCALLBACK_INSTANCETYPE_NONE,\n    FMOD_ERRORCALLBACK_INSTANCETYPE_SYSTEM,\n    FMOD_ERRORCALLBACK_INSTANCETYPE_CHANNEL,\n    FMOD_ERRORCALLBACK_INSTANCETYPE_CHANNELGROUP,\n    FMOD_ERRORCALLBACK_INSTANCETYPE_CHANNELCONTROL,\n    FMOD_ERRORCALLBACK_INSTANCETYPE_SOUND,\n    FMOD_ERRORCALLBACK_INSTANCETYPE_SOUNDGROUP,\n    FMOD_ERRORCALLBACK_INSTANCETYPE_DSP,\n    FMOD_ERRORCALLBACK_INSTANCETYPE_DSPCONNECTION,\n    FMOD_ERRORCALLBACK_INSTANCETYPE_GEOMETRY,\n    FMOD_ERRORCALLBACK_INSTANCETYPE_REVERB3D,\n    FMOD_ERRORCALLBACK_INSTANCETYPE_STUDIO_SYSTEM,\n    FMOD_ERRORCALLBACK_INSTANCETYPE_STUDIO_EVENTDESCRIPTION,\n    FMOD_ERRORCALLBACK_INSTANCETYPE_STUDIO_EVENTINSTANCE,\n    FMOD_ERRORCALLBACK_INSTANCETYPE_STUDIO_PARAMETERINSTANCE,\n    FMOD_ERRORCALLBACK_INSTANCETYPE_STUDIO_BUS,\n    FMOD_ERRORCALLBACK_INSTANCETYPE_STUDIO_VCA,\n    FMOD_ERRORCALLBACK_INSTANCETYPE_STUDIO_BANK,\n    FMOD_ERRORCALLBACK_INSTANCETYPE_STUDIO_COMMANDREPLAY,\n\n    FMOD_ERRORCALLBACK_INSTANCETYPE_FORCEINT = 65536    /* Makes sure this enum is signed 32bit. */\n} FMOD_ERRORCALLBACK_INSTANCETYPE;\n\n/*\n[STRUCTURE] \n[\n    [DESCRIPTION]\n    Structure that is passed into FMOD_SYSTEM_CALLBACK for the FMOD_SYSTEM_CALLBACK_ERROR callback type.\n\n    [REMARKS]\n    The instance pointer will be a type corresponding to the instanceType enum.\n\n    [SEE_ALSO]\n    FMOD_ERRORCALLBACK_INSTANCETYPE\n]\n*/\ntypedef struct FMOD_ERRORCALLBACK_INFO\n{\n    FMOD_RESULT                      result;                     /* Error code result */\n    FMOD_ERRORCALLBACK_INSTANCETYPE  instancetype;               /* Type of instance the error occurred on */\n    void                            *instance;                   /* Instance pointer */\n    const char                      *functionname;               /* Function that the error occurred on */\n    const char                      *functionparams;             /* Function parameters that the error ocurred on */\n} FMOD_ERRORCALLBACK_INFO;\n\n/*\n[DEFINE]\n[\n    [NAME]\n    FMOD_SYSTEM_CALLBACK_TYPE\n\n    [DESCRIPTION]   \n    These callback types are used with System::setCallback.\n\n    [REMARKS]\n    Each callback has commanddata parameters passed as void* unique to the type of callback.<br>\n    See reference to FMOD_SYSTEM_CALLBACK to determine what they might mean for each type of callback.<br>\n    <br>\n    <b>Note!</b> Using FMOD_SYSTEM_CALLBACK_DEVICELISTCHANGED (Windows only) will disable any automated device ejection/insertion handling by FMOD.  Use this callback to control the behaviour yourself.<br>\n    <br>\n    <b>Note!</b> Using FMOD_SYSTEM_CALLBACK_DEVICELISTCHANGED (on Mac only) requires the application to be running an event loop which will allow external changes to device list to be detected by FMOD.<br>\n    <br>\n    <b>Note!</b> The 'system' object pointer will be null for FMOD_SYSTEM_CALLBACK_MEMORYALLOCATIONFAILED callback.\n\n    [SEE_ALSO]      \n    System::setCallback\n    System::update\n    DSP::addInput\n]\n*/\n#define FMOD_SYSTEM_CALLBACK_DEVICELISTCHANGED      0x00000001  /* Called from System::update when the enumerated list of devices has changed. */\n#define FMOD_SYSTEM_CALLBACK_DEVICELOST             0x00000002  /* Called from System::update when an output device has been lost due to control panel parameter changes and FMOD cannot automatically recover. */\n#define FMOD_SYSTEM_CALLBACK_MEMORYALLOCATIONFAILED 0x00000004  /* Called directly when a memory allocation fails somewhere in FMOD.  (NOTE - 'system' will be NULL in this callback type.)*/\n#define FMOD_SYSTEM_CALLBACK_THREADCREATED          0x00000008  /* Called directly when a thread is created. */\n#define FMOD_SYSTEM_CALLBACK_BADDSPCONNECTION       0x00000010  /* Called when a bad connection was made with DSP::addInput. Usually called from mixer thread because that is where the connections are made.  */\n#define FMOD_SYSTEM_CALLBACK_PREMIX                 0x00000020  /* Called each tick before a mix update happens. */\n#define FMOD_SYSTEM_CALLBACK_POSTMIX                0x00000040  /* Called each tick after a mix update happens. */\n#define FMOD_SYSTEM_CALLBACK_ERROR                  0x00000080  /* Called when each API function returns an error code, including delayed async functions. */\n#define FMOD_SYSTEM_CALLBACK_MIDMIX                 0x00000100  /* Called each tick in mix update after clocks have been updated before the main mix occurs. */\n#define FMOD_SYSTEM_CALLBACK_THREADDESTROYED        0x00000200  /* Called directly when a thread is destroyed. */\n#define FMOD_SYSTEM_CALLBACK_PREUPDATE              0x00000400  /* Called at start of System::update function. */\n#define FMOD_SYSTEM_CALLBACK_POSTUPDATE             0x00000800  /* Called at end of System::update function. */\n#define FMOD_SYSTEM_CALLBACK_RECORDLISTCHANGED      0x00001000  /* Called from System::update when the enumerated list of recording devices has changed. */\n#define FMOD_SYSTEM_CALLBACK_ALL                    0xFFFFFFFF  /* Pass this mask to System::setCallback to receive all callback types. */\n\n/* [DEFINE_END] */\n\n\n/* \n    FMOD Callbacks\n*/\ntypedef FMOD_RESULT (F_CALLBACK *FMOD_DEBUG_CALLBACK)           (FMOD_DEBUG_FLAGS flags, const char *file, int line, const char *func, const char *message);\n\ntypedef FMOD_RESULT (F_CALLBACK *FMOD_SYSTEM_CALLBACK)          (FMOD_SYSTEM *system, FMOD_SYSTEM_CALLBACK_TYPE type, void *commanddata1, void *commanddata2, void *userdata);\n\ntypedef FMOD_RESULT (F_CALLBACK *FMOD_CHANNELCONTROL_CALLBACK)  (FMOD_CHANNELCONTROL *channelcontrol, FMOD_CHANNELCONTROL_TYPE controltype, FMOD_CHANNELCONTROL_CALLBACK_TYPE callbacktype, void *commanddata1, void *commanddata2);\n\ntypedef FMOD_RESULT (F_CALLBACK *FMOD_SOUND_NONBLOCK_CALLBACK)  (FMOD_SOUND *sound, FMOD_RESULT result);\ntypedef FMOD_RESULT (F_CALLBACK *FMOD_SOUND_PCMREAD_CALLBACK)   (FMOD_SOUND *sound, void *data, unsigned int datalen);\ntypedef FMOD_RESULT (F_CALLBACK *FMOD_SOUND_PCMSETPOS_CALLBACK) (FMOD_SOUND *sound, int subsound, unsigned int position, FMOD_TIMEUNIT postype);\n\ntypedef FMOD_RESULT (F_CALLBACK *FMOD_FILE_OPEN_CALLBACK)       (const char *name, unsigned int *filesize, void **handle, void *userdata);\ntypedef FMOD_RESULT (F_CALLBACK *FMOD_FILE_CLOSE_CALLBACK)      (void *handle, void *userdata);\ntypedef FMOD_RESULT (F_CALLBACK *FMOD_FILE_READ_CALLBACK)       (void *handle, void *buffer, unsigned int sizebytes, unsigned int *bytesread, void *userdata);\ntypedef FMOD_RESULT (F_CALLBACK *FMOD_FILE_SEEK_CALLBACK)       (void *handle, unsigned int pos, void *userdata);\ntypedef FMOD_RESULT (F_CALLBACK *FMOD_FILE_ASYNCREAD_CALLBACK)  (FMOD_ASYNCREADINFO *info, void *userdata);\ntypedef FMOD_RESULT (F_CALLBACK *FMOD_FILE_ASYNCCANCEL_CALLBACK)(FMOD_ASYNCREADINFO *info, void *userdata);\n\ntypedef void *      (F_CALLBACK *FMOD_MEMORY_ALLOC_CALLBACK)    (unsigned int size, FMOD_MEMORY_TYPE type, const char *sourcestr);\ntypedef void *      (F_CALLBACK *FMOD_MEMORY_REALLOC_CALLBACK)  (void *ptr, unsigned int size, FMOD_MEMORY_TYPE type, const char *sourcestr);\ntypedef void        (F_CALLBACK *FMOD_MEMORY_FREE_CALLBACK)     (void *ptr, FMOD_MEMORY_TYPE type, const char *sourcestr);\n\ntypedef float       (F_CALLBACK *FMOD_3D_ROLLOFF_CALLBACK)      (FMOD_CHANNELCONTROL *channelcontrol, float distance);\n\n\n\n\n/*\n[ENUM]\n[\n    [DESCRIPTION]   \n    List of interpolation types that the FMOD Studio software mixer supports.  \n\n    [REMARKS]\n    The default resampler type is FMOD_DSP_RESAMPLER_LINEAR.<br>\n    Use System::setAdvancedSettings and the resamplerMethod member to tell FMOD the resampling quality you require for sample rate conversion during sound playback.\n\n    [SEE_ALSO]      \n    System::setAdvancedSettings\n    System::setAdvancedSettings\n    FMOD_ADVANCEDSETINGS\n]\n*/\ntypedef enum FMOD_DSP_RESAMPLER\n{\n    FMOD_DSP_RESAMPLER_DEFAULT,         /* Default interpolation method.  Currently equal to FMOD_DSP_RESAMPLER_LINEAR. */\n    FMOD_DSP_RESAMPLER_NOINTERP,        /* No interpolation.  High frequency aliasing hiss will be audible depending on the sample rate of the sound. */\n    FMOD_DSP_RESAMPLER_LINEAR,          /* Linear interpolation (default method).  Fast and good quality, causes very slight lowpass effect on low frequency sounds. */\n    FMOD_DSP_RESAMPLER_CUBIC,           /* Cubic interpolation.  Slower than linear interpolation but better quality. */\n    FMOD_DSP_RESAMPLER_SPLINE,          /* 5 point spline interpolation.  Slowest resampling method but best quality. */\n\n    FMOD_DSP_RESAMPLER_MAX,             /* Maximum number of resample methods supported. */\n    FMOD_DSP_RESAMPLER_FORCEINT = 65536 /* Makes sure this enum is signed 32bit. */\n} FMOD_DSP_RESAMPLER;\n\n\n/*\n[ENUM]\n[\n    [DESCRIPTION]   \n    List of connection types between 2 DSP nodes.\n\n    [REMARKS]\n    FMOD_DSP_CONNECTION_TYPE_STANDARD<br>\n    ----------------------------------<br>\n    Default DSPConnection type.  Audio is mixed from the input to the output DSP's audible buffer, meaning it will be part of the audible signal.  A standard connection will execute its input DSP if it has not been executed before.<br>\n    <br>\n    FMOD_DSP_CONNECTION_TYPE_SIDECHAIN<br>\n    ----------------------------------<br>\n    Sidechain DSPConnection type.  Audio is mixed from the input to the output DSP's sidechain buffer, meaning it will NOT be part of the audible signal.  A sidechain connection will execute its input DSP if it has not been executed before.<br>\n    The purpose of the seperate sidechain buffer in a DSP, is so that the DSP effect can privately access for analysis purposes.  An example of use in this case, could be a compressor which analyzes the signal, to control its own effect parameters (ie a compression level or gain).<br>\n    <br>\n    For the effect developer, to accept sidechain data, the sidechain data will appear in the FMOD_DSP_STATE struct which is passed into the read callback of a DSP unit.<br>\n    FMOD_DSP_STATE::sidechaindata and FMOD_DSP::sidechainchannels will hold the mixed result of any sidechain data flowing into it.<br>\n    <br>\n    FMOD_DSP_CONNECTION_TYPE_SEND<br>\n    -----------------------------<br>\n    Send DSPConnection type.  Audio is mixed from the input to the output DSP's audible buffer, meaning it will be part of the audible signal.  A send connection will NOT execute its input DSP if it has not been executed before.<br>\n    A send connection will only read what exists at the input's buffer at the time of executing the output DSP unit (which can be considered the 'return')<br>\n    <br>\n    FMOD_DSP_CONNECTION_TYPE_SEND_SIDECHAIN<br>\n    ---------------------------------------<br>\n    Send sidechain DSPConnection type.  Audio is mixed from the input to the output DSP's sidechain buffer, meaning it will NOT be part of the audible signal.  A send sidechain connection will NOT execute its input DSP if it has not been executed before.<br>\n    A send sidechain connection will only read what exists at the input's buffer at the time of executing the output DSP unit (which can be considered the 'sidechain return').\n    <br>\n    For the effect developer, to accept sidechain data, the sidechain data will appear in the FMOD_DSP_STATE struct which is passed into the read callback of a DSP unit.<br>\n    FMOD_DSP_STATE::sidechaindata and FMOD_DSP::sidechainchannels will hold the mixed result of any sidechain data flowing into it.\n\n    [SEE_ALSO]      \n    DSP::addInput\n    DSPConnection::getType\n]\n*/\ntypedef enum FMOD_DSPCONNECTION_TYPE\n{\n    FMOD_DSPCONNECTION_TYPE_STANDARD,          /* Default connection type.         Audio is mixed from the input to the output DSP's audible buffer.  */\n    FMOD_DSPCONNECTION_TYPE_SIDECHAIN,         /* Sidechain connection type.       Audio is mixed from the input to the output DSP's sidechain buffer.  */\n    FMOD_DSPCONNECTION_TYPE_SEND,              /* Send connection type.            Audio is mixed from the input to the output DSP's audible buffer, but the input is NOT executed, only copied from.  A standard connection or sidechain needs to make an input execute to generate data. */\n    FMOD_DSPCONNECTION_TYPE_SEND_SIDECHAIN,    /* Send sidechain connection type.  Audio is mixed from the input to the output DSP's sidechain buffer, but the input is NOT executed, only copied from.  A standard connection or sidechain needs to make an input execute to generate data. */\n\n    FMOD_DSPCONNECTION_TYPE_MAX,               /* Maximum number of DSP connection types supported. */\n    FMOD_DSPCONNECTION_TYPE_FORCEINT = 65536   /* Makes sure this enum is signed 32bit. */\n} FMOD_DSPCONNECTION_TYPE;\n\n\n/*\n[ENUM]\n[\n    [DESCRIPTION]   \n    List of tag types that could be stored within a sound.  These include id3 tags, metadata from netstreams and vorbis/asf data.\n\n    [REMARKS]\n    FMOD_TAGTYPE_MIDI remarks.  A midi file contains 16 channels.  Not all of them are used, or in order.  Use the tag 'Channel mask' \n    and 'Number of channels' to find the channels used, to use with Sound::setMusicChannelVolume / Sound::getMusicChannelVolume.\n    For example if the mask is 1001b, there are 2 channels, and channel 0 and channel 3 are the 2 channels used with the above functions.\n\n    [SEE_ALSO]      \n    Sound::getTag\n    FMOD_TAGDATATYPE\n    FMOD_TAG\n]\n*/\ntypedef enum FMOD_TAGTYPE\n{\n    FMOD_TAGTYPE_UNKNOWN = 0,\n    FMOD_TAGTYPE_ID3V1,\n    FMOD_TAGTYPE_ID3V2,\n    FMOD_TAGTYPE_VORBISCOMMENT,\n    FMOD_TAGTYPE_SHOUTCAST,\n    FMOD_TAGTYPE_ICECAST,\n    FMOD_TAGTYPE_ASF,\n    FMOD_TAGTYPE_MIDI,\n    FMOD_TAGTYPE_PLAYLIST,\n    FMOD_TAGTYPE_FMOD,\n    FMOD_TAGTYPE_USER,\n\n    FMOD_TAGTYPE_MAX,               /* Maximum number of tag types supported. */\n    FMOD_TAGTYPE_FORCEINT = 65536   /* Makes sure this enum is signed 32bit. */\n} FMOD_TAGTYPE;\n\n\n/*\n[ENUM]\n[\n    [DESCRIPTION]   \n    List of data types that can be returned by Sound::getTag\n\n    [REMARKS]\n    See FMOD_TAG structure for tag length in bytes.\n\n    [SEE_ALSO]      \n    Sound::getTag\n    FMOD_TAGTYPE\n    FMOD_TAG\n]\n*/\ntypedef enum FMOD_TAGDATATYPE\n{\n    FMOD_TAGDATATYPE_BINARY = 0,        /* Raw binary data. see FMOD_TAG structure for length of data in bytes. */\n    FMOD_TAGDATATYPE_INT,               /* Integer - Note this integer could be 8bit / 16bit / 32bit / 64bit.  See FMOD_TAG structure for integer size (1 vs 2 vs 4 vs 8 bytes). */\n    FMOD_TAGDATATYPE_FLOAT,             /* IEEE floating point number.  See FMOD_TAG structure to confirm if the float data is 32bit or 64bit (4 vs 8 bytes). */\n    FMOD_TAGDATATYPE_STRING,            /* 8bit ASCII char string.  See FMOD_TAG structure for string length in bytes. */\n    FMOD_TAGDATATYPE_STRING_UTF16,      /* 16bit UTF string. Assume little endian byte order.  See FMOD_TAG structure for string length in bytes.*/\n    FMOD_TAGDATATYPE_STRING_UTF16BE,    /* 16bit UTF string  Big endian byte order.  See FMOD_TAG structure for string length in bytes.*/\n    FMOD_TAGDATATYPE_STRING_UTF8,       /* 8 bit UTF string. See FMOD_TAG structure for string length in bytes. */\n    FMOD_TAGDATATYPE_CDTOC,             /* Obsolute / unused. */\n\n    FMOD_TAGDATATYPE_MAX,               /* Maximum number of tag datatypes supported. */\n    FMOD_TAGDATATYPE_FORCEINT = 65536   /* Makes sure this enum is signed 32bit. */\n} FMOD_TAGDATATYPE;\n\n\n/*\n[STRUCTURE] \n[\n    [DESCRIPTION]   \n    Structure describing a piece of tag data.\n\n    [REMARKS]\n    Members marked with [r] mean the variable is modified by FMOD and is for reading purposes only.  Do not change this value.<br>\n    Members marked with [w] mean the variable can be written to.  The user can set the value.<br>\n\n    [SEE_ALSO]      \n    Sound::getTag\n    FMOD_TAGTYPE\n    FMOD_TAGDATATYPE\n]\n*/\ntypedef struct FMOD_TAG\n{\n    FMOD_TAGTYPE      type;         /* [r] The type of this tag. */\n    FMOD_TAGDATATYPE  datatype;     /* [r] The type of data that this tag contains */\n    char             *name;         /* [r] The name of this tag i.e. \"TITLE\", \"ARTIST\" etc. */\n    void             *data;         /* [r] Pointer to the tag data - its format is determined by the datatype member */\n    unsigned int      datalen;      /* [r] Length of the data contained in this tag, in bytes. */\n    FMOD_BOOL         updated;      /* [r] True if this tag has been updated since last being accessed with Sound::getTag */\n} FMOD_TAG;\n\n\n/*\n[DEFINE]\n[\n    [NAME]\n    FMOD_TIMEUNIT\n\n    [DESCRIPTION]   \n    List of time types that can be returned by Sound::getLength and used with Channel::setPosition or Channel::getPosition.\n\n    [REMARKS]\n\n    [SEE_ALSO]      \n    Sound::getLength\n    Channel::setPosition\n    Channel::getPosition\n]\n*/\n#define FMOD_TIMEUNIT_MS                0x00000001  /* Milliseconds. */\n#define FMOD_TIMEUNIT_PCM               0x00000002  /* PCM samples, related to milliseconds * samplerate / 1000. */\n#define FMOD_TIMEUNIT_PCMBYTES          0x00000004  /* Bytes, related to PCM samples * channels * datawidth (ie 16bit = 2 bytes). */\n#define FMOD_TIMEUNIT_RAWBYTES          0x00000008  /* Raw file bytes of (compressed) sound data (does not include headers).  Only used by Sound::getLength and Channel::getPosition. */\n#define FMOD_TIMEUNIT_PCMFRACTION       0x00000010  /* Fractions of 1 PCM sample.  Unsigned int range 0 to 0xFFFFFFFF.  Used for sub-sample granularity for DSP purposes. */\n#define FMOD_TIMEUNIT_MODORDER          0x00000100  /* MOD/S3M/XM/IT.  Order in a sequenced module format.  Use Sound::getFormat to determine the PCM format being decoded to. */\n#define FMOD_TIMEUNIT_MODROW            0x00000200  /* MOD/S3M/XM/IT.  Current row in a sequenced module format.  Cannot use with Channel::setPosition.  Sound::getLength will return the number of rows in the currently playing or seeked to pattern. */\n#define FMOD_TIMEUNIT_MODPATTERN        0x00000400  /* MOD/S3M/XM/IT.  Current pattern in a sequenced module format.  Cannot use with Channel::setPosition.  Sound::getLength will return the number of patterns in the song and Channel::getPosition will return the currently playing pattern. */\n/* [DEFINE_END] */\n\n/*\n[DEFINE]\n[\n    [NAME]\n    FMOD_PORT_INDEX\n\n    [DESCRIPTION]       \n\n    [REMARKS]  \n\n    [SEE_ALSO]      \n    System::AttachChannelGroupToPort\n]\n*/\n#define FMOD_PORT_INDEX_NONE 0xFFFFFFFFFFFFFFFF /* Use when a port index is not required */\n/* [DEFINE_END] */\n\n\n/*\n[STRUCTURE] \n[\n    [DESCRIPTION]\n    Use this structure with System::createSound when more control is needed over loading.\n    The possible reasons to use this with System::createSound are:\n\n    - Loading a file from memory.\n    - Loading a file from within another larger (possibly wad/pak) file, by giving the loader an offset and length.\n    - To create a user created / non file based sound.\n    - To specify a starting subsound to seek to within a multi-sample sounds (ie FSB/DLS) when created as a stream.\n    - To specify which subsounds to load for multi-sample sounds (ie FSB/DLS) so that memory is saved and only a subset is actually loaded/read from disk.\n    - To specify 'piggyback' read and seek callbacks for capture of sound data as fmod reads and decodes it.  Useful for ripping decoded PCM data from sounds as they are loaded / played.\n    - To specify a MIDI DLS sample set file to load when opening a MIDI file.\n\n    See below on what members to fill for each of the above types of sound you want to create.\n\n    [REMARKS]\n    This structure is optional!  Specify 0 or NULL in System::createSound if you don't need it!\n\n    <u>Loading a file from memory.</u>\n\n    - Create the sound using the FMOD_OPENMEMORY flag.\n    - Mandatory.  Specify 'length' for the size of the memory block in bytes.\n    - Other flags are optional.\n\n    <u>Loading a file from within another larger (possibly wad/pak) file, by giving the loader an offset and length.</u>\n\n    - Mandatory.  Specify 'fileoffset' and 'length'.\n    - Other flags are optional.\n\n    <u>To create a user created / non file based sound.</u>\n\n    - Create the sound using the FMOD_OPENUSER flag.\n    - Mandatory.  Specify 'defaultfrequency, 'numchannels' and 'format'.\n    - Other flags are optional.\n\n    <u>To specify a starting subsound to seek to and flush with, within a multi-sample stream (ie FSB/DLS).</u>\n\n    - Mandatory.  Specify 'initialsubsound'.\n\n    <u>To specify which subsounds to load for multi-sample sounds (ie FSB/DLS) so that memory is saved and only a subset is actually loaded/read from disk.</u>\n\n    - Mandatory.  Specify 'inclusionlist' and 'inclusionlistnum'.\n\n    <u>To specify 'piggyback' read and seek callbacks for capture of sound data as fmod reads and decodes it.  Useful for ripping decoded PCM data from sounds as they are loaded / played.</u>\n\n    - Mandatory.  Specify 'pcmreadcallback' and 'pcmseekcallback'.\n\n    <u>To specify a MIDI DLS sample set file to load when opening a MIDI file.</u>\n\n    - Mandatory.  Specify 'dlsname'.\n\n    Setting the 'decodebuffersize' is for cpu intensive codecs that may be causing stuttering, not file intensive codecs (ie those from CD or netstreams) which are normally \n    altered with System::setStreamBufferSize.  As an example of cpu intensive codecs, an mp3 file will take more cpu to decode than a PCM wav file.\n\n    If you have a stuttering effect, then it is using more cpu than the decode buffer playback rate can keep up with.  Increasing the decode buffersize will most likely solve this problem.\n\n    FSB codec.  If inclusionlist and numsubsounds are used together, this will trigger a special mode where subsounds are shuffled down to save memory.  (useful for large FSB \n    files where you only want to load 1 sound).  There will be no gaps, ie no null subsounds.  As an example, if there are 10,000 subsounds and there is an inclusionlist with only 1 entry, \n    and numsubsounds = 1, then subsound 0 will be that entry, and there will only be the memory allocated for 1 subsound.  Previously there would still be 10,000 subsound pointers and other\n    associated codec entries allocated along with it multiplied by 10,000.\n\n    Members marked with [r] mean the variable is modified by FMOD and is for reading purposes only.  Do not change this value.<br>\n    Members marked with [w] mean the variable can be written to.  The user can set the value.\n\n    [SEE_ALSO]\n    System::createSound\n    System::setStreamBufferSize\n    FMOD_MODE\n    FMOD_SOUND_FORMAT\n    FMOD_SOUND_TYPE\n    FMOD_CHANNELMASK\n    FMOD_CHANNELORDER\n    FMOD_MAX_CHANNEL_WIDTH\n]\n*/\ntypedef struct FMOD_CREATESOUNDEXINFO\n{\n    int                            cbsize;             /* [w]   Size of this structure.  This is used so the structure can be expanded in the future and still work on older versions of FMOD Studio. */\n    unsigned int                   length;             /* [w]   Optional. Specify 0 to ignore. Number of bytes to load starting at 'fileoffset', or size of sound to create (if FMOD_OPENUSER is used).  Required if loading from memory.  If 0 is specified, then it will use the size of the file (unless loading from memory then an error will be returned). */\n    unsigned int                   fileoffset;         /* [w]   Optional. Specify 0 to ignore. Offset from start of the file to start loading from.  This is useful for loading files from inside big data files. */\n    int                            numchannels;        /* [w]   Optional. Specify 0 to ignore. Number of channels in a sound mandatory if FMOD_OPENUSER or FMOD_OPENRAW is used.  Can be specified up to FMOD_MAX_CHANNEL_WIDTH. */\n    int                            defaultfrequency;   /* [w]   Optional. Specify 0 to ignore. Default frequency of sound in Hz, mandatory if FMOD_OPENUSER or FMOD_OPENRAW is used.  Other formats use the frequency determined by the file format. */\n    FMOD_SOUND_FORMAT              format;             /* [w]   Optional. Specify 0 or FMOD_SOUND_FORMAT_NONE to ignore. Format of the sound, mandatory if FMOD_OPENUSER or FMOD_OPENRAW is used.  Other formats use the format determined by the file format.   */\n    unsigned int                   decodebuffersize;   /* [w]   Optional. Specify 0 to ignore. For streams.  This determines the size of the double buffer (in PCM samples) that a stream uses.  Use this for user created streams if you want to determine the size of the callback buffer passed to you.  Specify 0 to use FMOD's default size which is currently equivalent to 400ms of the sound format created/loaded. */\n    int                            initialsubsound;    /* [w]   Optional. Specify 0 to ignore. In a multi-sample file format such as .FSB/.DLS, specify the initial subsound to seek to, only if FMOD_CREATESTREAM is used. */\n    int                            numsubsounds;       /* [w]   Optional. Specify 0 to ignore or have no subsounds.  In a sound created with FMOD_OPENUSER, specify the number of subsounds that are accessable with Sound::getSubSound.  If not created with FMOD_OPENUSER, this will limit the number of subsounds loaded within a multi-subsound file.  If using FSB, then if FMOD_CREATESOUNDEXINFO::inclusionlist is used, this will shuffle subsounds down so that there are not any gaps.  It will mean that the indices of the sounds will be different. */\n    int                           *inclusionlist;      /* [w]   Optional. Specify 0 to ignore. In a multi-sample format such as .FSB/.DLS it may be desirable to specify only a subset of sounds to be loaded out of the whole file.  This is an array of subsound indices to load into memory when created. A single subsound index can be encoded in-place by setting inclusionlistnum to 0, setting the low bit of inclusionlist to 1 and OR the index into inclusionlist shifted left by 1 (optional advanced technique to avoid pointing to additional memory). */\n    int                            inclusionlistnum;   /* [w]   Optional. Specify 0 to ignore. This is the number of integers contained within the inclusionlist array. */\n    FMOD_SOUND_PCMREAD_CALLBACK    pcmreadcallback;    /* [w]   Optional. Specify 0 to ignore. Callback to 'piggyback' on FMOD's read functions and accept or even write PCM data while FMOD is opening the sound.  Used for user sounds created with FMOD_OPENUSER or for capturing decoded data as FMOD reads it. */\n    FMOD_SOUND_PCMSETPOS_CALLBACK  pcmsetposcallback;  /* [w]   Optional. Specify 0 to ignore. Callback for when the user calls a seeking function such as Channel::setTime or Channel::setPosition within a multi-sample sound, and for when it is opened.*/\n    FMOD_SOUND_NONBLOCK_CALLBACK   nonblockcallback;   /* [w]   Optional. Specify 0 to ignore. Callback for successful completion, or error while loading a sound that used the FMOD_NONBLOCKING flag.  Also called duing seeking, when setPosition is called or a stream is restarted. */\n    const char                    *dlsname;            /* [w]   Optional. Specify 0 to ignore. Filename for a DLS sample set when loading a MIDI file. If not specified, on Windows it will attempt to open /windows/system32/drivers/gm.dls or /windows/system32/drivers/etc/gm.dls, on Mac it will attempt to load /System/Library/Components/CoreAudio.component/Contents/Resources/gs_instruments.dls, otherwise the MIDI will fail to open. Current DLS support is for level 1 of the specification. */\n    const char                    *encryptionkey;      /* [w]   Optional. Specify 0 to ignore. Key for encrypted FSB file.  Without this key an encrypted FSB file will not load. */\n    int                            maxpolyphony;       /* [w]   Optional. Specify 0 to ignore. For sequenced formats with dynamic channel allocation such as .MID and .IT, this specifies the maximum voice count allowed while playing.  .IT defaults to 64.  .MID defaults to 32. */\n    void                          *userdata;           /* [w]   Optional. Specify 0 to ignore. This is user data to be attached to the sound during creation.  Access via Sound::getUserData.  Note: This is not passed to FMOD_FILE_OPEN_CALLBACK - use fileuserdata for that. */\n    FMOD_SOUND_TYPE                suggestedsoundtype; /* [w]   Optional. Specify 0 or FMOD_SOUND_TYPE_UNKNOWN to ignore.  Instead of scanning all codec types, use this to speed up loading by making it jump straight to this codec. */\n    FMOD_FILE_OPEN_CALLBACK        fileuseropen;       /* [w]   Optional. Specify 0 to ignore. Callback for opening this file. */\n    FMOD_FILE_CLOSE_CALLBACK       fileuserclose;      /* [w]   Optional. Specify 0 to ignore. Callback for closing this file. */\n    FMOD_FILE_READ_CALLBACK        fileuserread;       /* [w]   Optional. Specify 0 to ignore. Callback for reading from this file. */\n    FMOD_FILE_SEEK_CALLBACK        fileuserseek;       /* [w]   Optional. Specify 0 to ignore. Callback for seeking within this file. */\n    FMOD_FILE_ASYNCREAD_CALLBACK   fileuserasyncread;  /* [w]   Optional. Specify 0 to ignore. Callback for seeking within this file. */\n    FMOD_FILE_ASYNCCANCEL_CALLBACK fileuserasynccancel;/* [w]   Optional. Specify 0 to ignore. Callback for seeking within this file. */\n    void                          *fileuserdata;       /* [w]   Optional. Specify 0 to ignore. User data to be passed into the file callbacks. */\n    int                            filebuffersize;     /* [w]   Optional. Specify 0 to ignore. Buffer size for reading the file, -1 to disable buffering, or 0 for system default. */\n    FMOD_CHANNELORDER              channelorder;       /* [w]   Optional. Specify 0 to ignore. Use this to differ the way fmod maps multichannel sounds to speakers.  See FMOD_CHANNELORDER for more. */\n    FMOD_CHANNELMASK               channelmask;        /* [w]   Optional. Specify 0 to ignore. Use this to specify which channels map to which speakers.  See FMOD_CHANNELMASK for more. */\n    FMOD_SOUNDGROUP               *initialsoundgroup;  /* [w]   Optional. Specify 0 to ignore. Specify a sound group if required, to put sound in as it is created. */\n    unsigned int                   initialseekposition;/* [w]   Optional. Specify 0 to ignore. For streams. Specify an initial position to seek the stream to. */\n    FMOD_TIMEUNIT                  initialseekpostype; /* [w]   Optional. Specify 0 to ignore. For streams. Specify the time unit for the position set in initialseekposition. */\n    int                            ignoresetfilesystem;/* [w]   Optional. Specify 0 to ignore. Set to 1 to use fmod's built in file system. Ignores setFileSystem callbacks and also FMOD_CREATESOUNEXINFO file callbacks.  Useful for specific cases where you don't want to use your own file system but want to use fmod's file system (ie net streaming). */\n    unsigned int                   audioqueuepolicy;   /* [w]   Optional. Specify 0 or FMOD_AUDIOQUEUE_CODECPOLICY_DEFAULT to ignore. Policy used to determine whether hardware or software is used for decoding, see FMOD_AUDIOQUEUE_CODECPOLICY for options (iOS >= 3.0 required, otherwise only hardware is available) */ \n    unsigned int                   minmidigranularity; /* [w]   Optional. Specify 0 to ignore. Allows you to set a minimum desired MIDI mixer granularity. Values smaller than 512 give greater than default accuracy at the cost of more CPU and vice versa. Specify 0 for default (512 samples). */\n    int                            nonblockthreadid;   /* [w]   Optional. Specify 0 to ignore. Specifies a thread index to execute non blocking load on.  Allows for up to 5 threads to be used for loading at once.  This is to avoid one load blocking another.  Maximum value = 4. */\n    FMOD_GUID                     *fsbguid;            /* [r/w] Optional. Specify 0 to ignore. Allows you to provide the GUID lookup for cached FSB header info. Once loaded the GUID will be written back to the pointer. This is to avoid seeking and reading the FSB header. */\n} FMOD_CREATESOUNDEXINFO;\n\n\n/*\n[DEFINE]\n[\n    [NAME]\n    FMOD_REVERB_MAXINSTANCES\n\n    [DESCRIPTION]\n    The maximum number of global/physical reverb instances.\n\n    [REMARKS]\n    Each instance of a physical reverb is an instance of a FMOD_DSP_SFXREVERB dsp in the mix graph.\n    This is unrelated to the number of possible Reverb3D objects, which is unlimited.\n\n    [SEE_ALSO]\n    ChannelControl::setReverbProperties\n    ChannelControl::setReverbProperties\n    System::setReverbProperties\n    System::getReverbProperties\n]\n*/\n#define FMOD_REVERB_MAXINSTANCES 4\n/* [DEFINE_END] */\n\n\n/*\n[STRUCTURE] \n[\n    [DESCRIPTION]\n    Structure defining a reverb environment.\n\n    [REMARKS]\n    Note the default reverb properties are the same as the FMOD_PRESET_GENERIC preset.\n\n    All members are read/write [r/w], written to by FMOD when queried with System::getReverbProperties and read by FMOD when set with System::setReverbProperties.\n\n    [SEE_ALSO]\n    System::setReverbProperties\n    System::getReverbProperties\n    FMOD_REVERB_PRESETS\n]\n*/\ntypedef struct FMOD_REVERB_PROPERTIES\n{                            /*       MIN    MAX     DEFAULT DESCRIPTION */\n    float DecayTime;         /* [r/w] 0.0    20000.0 1500.0  Reverberation decay time (ms)                                             */\n    float EarlyDelay;        /* [r/w] 0.0    300.0   7.0     Initial reflection delay time (ms)                                        */\n    float LateDelay;         /* [r/w] 0.0    100     11.0    Late reverberation delay time relative to initial reflection (ms)         */\n    float HFReference;       /* [r/w] 20.0   20000.0 5000    Reference high frequency (Hz)                                             */\n    float HFDecayRatio;      /* [r/w] 10.0   100.0   50.0    High-frequency to mid-frequency decay time ratio (%)                      */\n    float Diffusion;         /* [r/w] 0.0    100.0   100.0   Value that controls the echo density in the late reverberation decay (%)  */\n    float Density;           /* [r/w] 0.0    100.0   100.0   Value that controls the modal density in the late reverberation decay (%) */\n    float LowShelfFrequency; /* [r/w] 20.0   1000.0  250.0   Reference low frequency (Hz)                                              */\n    float LowShelfGain;      /* [r/w] -36.0  12.0    0.0     Relative room effect level at low frequencies (dB)                        */\n    float HighCut;           /* [r/w] 20.0   20000.0 20000.0 Relative room effect level at high frequencies (Hz)                       */\n    float EarlyLateMix;      /* [r/w] 0.0    100.0   50.0    Early reflections level relative to room effect (%)                       */\n    float WetLevel;          /* [r/w] -80.0  20.0    -6.0    Room effect level at mid frequencies (dB)                                 */\n} FMOD_REVERB_PROPERTIES;\n\n\n/*\n[DEFINE] \n[\n    [NAME] \n    FMOD_REVERB_PRESETS\n\n    [DESCRIPTION]\n    Sets of predefined reverb properties used to initialize an FMOD_REVERB_PROPERTIES structure statically.\n\n    i.e. FMOD_REVERB_PROPERTIES prop = FMOD_PRESET_GENERIC;\n\n    [REMARKS]\n\n    [SEE_ALSO]\n    System::setReverbProperties\n    System::getReverbProperties\n]\n*/\n/*                                      Decay     LateDly    HFDecay    Densty   LoGain    E/L-Mix\n                                             EarlyDly    HFRef     Diffus   LoFreq     HiCut      WetLvl */\n#define FMOD_PRESET_OFF              {  1000,    7,  11, 5000, 100, 100, 100, 250, 0,    20,  96, -80.0f } /* Off / disabled */\n#define FMOD_PRESET_GENERIC          {  1500,    7,  11, 5000,  83, 100, 100, 250, 0, 14500,  96,  -8.0f } /* Generic / default */\n#define FMOD_PRESET_PADDEDCELL       {   170,    1,   2, 5000,  10, 100, 100, 250, 0,   160,  84,  -7.8f } /* Padded cell */\n#define FMOD_PRESET_ROOM             {   400,    2,   3, 5000,  83, 100, 100, 250, 0,  6050,  88,  -9.4f } /* Room */\n#define FMOD_PRESET_BATHROOM         {  1500,    7,  11, 5000,  54, 100,  60, 250, 0,  2900,  83,   0.5f } /* Bathroom */\n#define FMOD_PRESET_LIVINGROOM       {   500,    3,   4, 5000,  10, 100, 100, 250, 0,   160,  58, -19.0f } /* Living room */\n#define FMOD_PRESET_STONEROOM        {  2300,   12,  17, 5000,  64, 100, 100, 250, 0,  7800,  71,  -8.5f } /* Stone room */\n#define FMOD_PRESET_AUDITORIUM       {  4300,   20,  30, 5000,  59, 100, 100, 250, 0,  5850,  64, -11.7f } /* Auditorium */\n#define FMOD_PRESET_CONCERTHALL      {  3900,   20,  29, 5000,  70, 100, 100, 250, 0,  5650,  80,  -9.8f } /* Convert hall */\n#define FMOD_PRESET_CAVE             {  2900,   15,  22, 5000, 100, 100, 100, 250, 0, 20000,  59, -11.3f } /* Cave */\n#define FMOD_PRESET_ARENA            {  7200,   20,  30, 5000,  33, 100, 100, 250, 0,  4500,  80,  -9.6f } /* Arena */\n#define FMOD_PRESET_HANGAR           { 10000,   20,  30, 5000,  23, 100, 100, 250, 0,  3400,  72,  -7.4f } /* Hangar */\n#define FMOD_PRESET_CARPETTEDHALLWAY {   300,    2,  30, 5000,  10, 100, 100, 250, 0,   500,  56, -24.0f } /* Carpeted hallway */\n#define FMOD_PRESET_HALLWAY          {  1500,    7,  11, 5000,  59, 100, 100, 250, 0,  7800,  87,  -5.5f } /* Hallway */\n#define FMOD_PRESET_STONECORRIDOR    {   270,   13,  20, 5000,  79, 100, 100, 250, 0,  9000,  86,  -6.0f } /* Stone corridor */\n#define FMOD_PRESET_ALLEY            {  1500,    7,  11, 5000,  86, 100, 100, 250, 0,  8300,  80,  -9.8f } /* Alley */\n#define FMOD_PRESET_FOREST           {  1500,  162,  88, 5000,  54,  79, 100, 250, 0,   760,  94, -12.3f } /* Forest */\n#define FMOD_PRESET_CITY             {  1500,    7,  11, 5000,  67,  50, 100, 250, 0,  4050,  66, -26.0f } /* City */\n#define FMOD_PRESET_MOUNTAINS        {  1500,  300, 100, 5000,  21,  27, 100, 250, 0,  1220,  82, -24.0f } /* Mountains */\n#define FMOD_PRESET_QUARRY           {  1500,   61,  25, 5000,  83, 100, 100, 250, 0,  3400, 100,  -5.0f } /* Quarry */\n#define FMOD_PRESET_PLAIN            {  1500,  179, 100, 5000,  50,  21, 100, 250, 0,  1670,  65, -28.0f } /* Plain */\n#define FMOD_PRESET_PARKINGLOT       {  1700,    8,  12, 5000, 100, 100, 100, 250, 0, 20000,  56, -19.5f } /* Parking lot */\n#define FMOD_PRESET_SEWERPIPE        {  2800,   14,  21, 5000,  14,  80,  60, 250, 0,  3400,  66,   1.2f } /* Sewer pipe */\n#define FMOD_PRESET_UNDERWATER       {  1500,    7,  11, 5000,  10, 100, 100, 250, 0,   500,  92,   7.0f } /* Underwater */\n/* [DEFINE_END] */\n\n\n/*\n[STRUCTURE] \n[\n    [DESCRIPTION]\n    Settings for advanced features like configuring memory and cpu usage for the FMOD_CREATECOMPRESSEDSAMPLE feature.\n\n    [REMARKS]\n    maxMPEGCodecs / maxADPCMCodecs / maxXMACodecs will determine the maximum cpu usage of playing realtime samples.  Use this to lower potential excess cpu usage and also control memory usage.<br>\n    <br>\n    maxPCMCodecs is for use with PS3 only. It will determine the maximum number of PCM voices that can be played at once. This includes streams of any format and all sounds created\n    *without* the FMOD_CREATECOMPRESSEDSAMPLE flag.\n    <br>\n    Memory will be allocated for codecs 'up front' (during System::init) if these values are specified as non zero.  If any are zero, it allocates memory for the codec whenever a file of the type in question is loaded.  So if maxMPEGCodecs is 0 for example, it will allocate memory for the mpeg codecs the first time an mp3 is loaded or an mp3 based .FSB file is loaded.<br>\n    <br>\n    Due to inefficient encoding techniques on certain .wav based ADPCM files, FMOD can can need an extra 29720 bytes per codec.  This means for lowest memory consumption.  Use FSB as it uses an optimal/small ADPCM block size.<br>\n    <br>\n    Members marked with [r] mean the variable is modified by FMOD and is for reading purposes only.  Do not change this value.<br>\n    Members marked with [w] mean the variable can be written to.  The user can set the value.<br>\n    Members marked with [r/w] are either read or write depending on if you are using System::setAdvancedSettings (w) or System::getAdvancedSettings (r).\n\n    [SEE_ALSO]\n    System::setAdvancedSettings\n    System::getAdvancedSettings\n    System::init\n    FMOD_MODE\n]\n*/\ntypedef struct FMOD_ADVANCEDSETTINGS\n{                       \n    int                 cbSize;                     /* [w]   Size of this structure.  Use sizeof(FMOD_ADVANCEDSETTINGS)  NOTE: This must be set before calling System::getAdvancedSettings or System::setAdvancedSettings! */\n    int                 maxMPEGCodecs;              /* [r/w] Optional. Specify 0 to ignore. For use with FMOD_CREATECOMPRESSEDSAMPLE only.  MPEG   codecs consume 22,216 bytes per instance and this number will determine how many MPEG   channels can be played simultaneously. Default = 32. */\n    int                 maxADPCMCodecs;             /* [r/w] Optional. Specify 0 to ignore. For use with FMOD_CREATECOMPRESSEDSAMPLE only.  ADPCM  codecs consume  2,480 bytes per instance and this number will determine how many ADPCM  channels can be played simultaneously. Default = 32. */\n    int                 maxXMACodecs;               /* [r/w] Optional. Specify 0 to ignore. For use with FMOD_CREATECOMPRESSEDSAMPLE only.  XMA    codecs consume  6,263 bytes per instance and this number will determine how many XMA    channels can be played simultaneously. Default = 32. */\n    int                 maxVorbisCodecs;            /* [r/w] Optional. Specify 0 to ignore. For use with FMOD_CREATECOMPRESSEDSAMPLE only.  Vorbis codecs consume 16,512 bytes per instance and this number will determine how many Vorbis channels can be played simultaneously. Default = 32. */    \n    int                 maxAT9Codecs;               /* [r/w] Optional. Specify 0 to ignore. For use with FMOD_CREATECOMPRESSEDSAMPLE only.  AT9    codecs consume 20,664 bytes per instance and this number will determine how many AT9    channels can be played simultaneously. Default = 32. */    \n    int                 maxFADPCMCodecs;            /* [r/w] Optional. Specify 0 to ignore. For use with FMOD_CREATECOMPRESSEDSAMPLE only.  FADPCM codecs consume  2,232 bytes per instance and this number will determine how many FADPCM channels can be played simultaneously. Default = 32. */\n    int                 maxPCMCodecs;               /* [r/w] Optional. Specify 0 to ignore. For use with PS3 only.                          PCM    codecs consume  2,536 bytes per instance and this number will determine how many streams and PCM voices can be played simultaneously. Default = 32. */\n    int                 ASIONumChannels;            /* [r/w] Optional. Specify 0 to ignore. Number of channels available on the ASIO device. */\n    char              **ASIOChannelList;            /* [r/w] Optional. Specify 0 to ignore. Pointer to an array of strings (number of entries defined by ASIONumChannels) with ASIO channel names. */\n    FMOD_SPEAKER       *ASIOSpeakerList;            /* [r/w] Optional. Specify 0 to ignore. Pointer to a list of speakers that the ASIO channels map to.  This can be called after System::init to remap ASIO output. */\n    float               HRTFMinAngle;               /* [r/w] Unsupported.  Deprecated API feature. */\n    float               HRTFMaxAngle;               /* [r/w] Unsupported.  Deprecated API feature. */\n    float               HRTFFreq;                   /* [r/w] Unsupported.  Deprecated API feature. */\n    float               vol0virtualvol;             /* [r/w] Optional. Specify 0 to ignore. For use with FMOD_INIT_VOL0_BECOMES_VIRTUAL.  If this flag is used, and the volume is below this, then the sound will become virtual.  Use this value to raise the threshold to a different point where a sound goes virtual. */\n    unsigned int        defaultDecodeBufferSize;    /* [r/w] Optional. Specify 0 to ignore. For streams. This determines the default size of the double buffer (in milliseconds) that a stream uses.  Default = 400ms */\n    unsigned short      profilePort;                /* [r/w] Optional. Specify 0 to ignore. For use with FMOD_INIT_PROFILE_ENABLE.  Specify the port to listen on for connections by the profiler application. */\n    unsigned int        geometryMaxFadeTime;        /* [r/w] Optional. Specify 0 to ignore. The maximum time in miliseconds it takes for a channel to fade to the new level when its occlusion changes. */\n    float               distanceFilterCenterFreq;   /* [r/w] Optional. Specify 0 to ignore. For use with FMOD_INIT_CHANNEL_DISTANCEFILTER.  The default center frequency in Hz for the distance filtering effect. Default = 1500.0. */\n    int                 reverb3Dinstance;           /* [r/w] Optional. Specify 0 to ignore. Out of 0 to 3, 3d reverb spheres will create a phyical reverb unit on this instance slot.  See FMOD_REVERB_PROPERTIES. */\n    int                 DSPBufferPoolSize;          /* [r/w] Optional. Specify 0 to ignore. Number of buffers in DSP buffer pool.  Each buffer will be DSPBlockSize * sizeof(float) * SpeakerModeChannelCount.  ie 7.1 @ 1024 DSP block size = 8 * 1024 * 4 = 32kb.  Default = 8. */\n    unsigned int        stackSizeStream;            /* [r/w] Optional. Specify 0 to ignore. Specify the stack size for the FMOD Stream thread in bytes.  Useful for custom codecs that use excess stack.  Default 49,152 (48kb) */\n    unsigned int        stackSizeNonBlocking;       /* [r/w] Optional. Specify 0 to ignore. Specify the stack size for the FMOD_NONBLOCKING loading thread.  Useful for custom codecs that use excess stack.  Default 65,536 (64kb) */\n    unsigned int        stackSizeMixer;             /* [r/w] Optional. Specify 0 to ignore. Specify the stack size for the FMOD mixer thread.  Useful for custom dsps that use excess stack.  Default 49,152 (48kb) */\n    FMOD_DSP_RESAMPLER  resamplerMethod;            /* [r/w] Optional. Specify 0 to ignore. Resampling method used with fmod's software mixer.  See FMOD_DSP_RESAMPLER for details on methods. */\n    unsigned int        commandQueueSize;           /* [r/w] Optional. Specify 0 to ignore. Specify the command queue size for thread safe processing.  Default 2048 (2kb) */\n    unsigned int        randomSeed;                 /* [r/w] Optional. Specify 0 to ignore. Seed value that FMOD will use to initialize its internal random number generators. */\n} FMOD_ADVANCEDSETTINGS;\n\n\n/*\n[DEFINE] \n[\n    [NAME] \n    FMOD_DRIVER_STATE\n\n    [DESCRIPTION]\n    Flags that provide additional information about a particular driver.\n\n    [REMARKS]\n\n    [SEE_ALSO]\n    System::getRecordDriverInfo\n]\n*/\n#define FMOD_DRIVER_STATE_CONNECTED 0x00000001  /* Device is currently plugged in. */\n#define FMOD_DRIVER_STATE_DEFAULT   0x00000002  /* Device is the users preferred choice. */\n/* [DEFINE_END] */\n\n\n/*$ preserve start $*/\n\n#include \"fmod_codec.h\"\n#include \"fmod_dsp.h\"\n#include \"fmod_output.h\"\n\n#endif\n\n/*$ preserve end $*/\n"
  },
  {
    "path": "Plugins/FMODStudio/Source/FMODStudio/Public/FMOD/fmod_dsp.h",
    "content": "/* ========================================================================================== */\n/* FMOD Studio - DSP header file. Copyright (c), Firelight Technologies Pty, Ltd. 2004-2020.  */\n/*                                                                                            */\n/* Use this header if you are interested in delving deeper into the FMOD software mixing /    */\n/* DSP engine.                                                                                */\n/* Also use this header if you are wanting to develop your own DSP plugin to use with FMOD's  */\n/* dsp system.  With this header you can make your own DSP plugin that FMOD can               */\n/* register and use.  See the documentation and examples on how to make a working plugin.     */\n/*                                                                                            */\n/* ========================================================================================== */\n\n#ifndef _FMOD_DSP_H\n#define _FMOD_DSP_H\n\n#include \"fmod_dsp_effects.h\"\n\ntypedef struct FMOD_DSP_STATE FMOD_DSP_STATE;\n\n/*\n[STRUCTURE] \n[\n    [DESCRIPTION]\n    Structure for FMOD_DSP_PROCESS_CALLBACK input and output buffers.\n\n    [REMARKS]\n    Members marked with [r] mean the variable is modified by FMOD and is for reading purposes only.  Do not change this value.<br>\n    Members marked with [w] mean the variable can be written to.  The user can set the value.<br>\n\n    [SEE_ALSO]    \n    FMOD_DSP_DESCRIPTION\n]\n*/\ntypedef struct FMOD_DSP_BUFFER_ARRAY\n{\n    int                numbuffers;              /* [r/w] number of buffers */\n    int               *buffernumchannels;       /* [r/w] array of number of channels for each buffer */\n    FMOD_CHANNELMASK  *bufferchannelmask;       /* [r/w] array of channel masks for each buffer */\n    float            **buffers;                 /* [r/w] array of buffers */\n    FMOD_SPEAKERMODE   speakermode;             /* [r/w] speaker mode for all buffers in the array */\n} FMOD_DSP_BUFFER_ARRAY;\n\n\n/*\n[ENUM]\n[\n    [DESCRIPTION]\n    Operation type for FMOD_DSP_PROCESS_CALLBACK.\n\n    [REMARKS]\n    A process callback will be called twice per mix for a DSP unit.  Once with the FMOD_DSP_PROCESS_QUERY command, then conditionally, FMOD_DSP_PROCESS_PERFORM.<br>\n    FMOD_DSP_PROCESS_QUERY is to be handled only by filling out the outputarray information, and returning a relevant return code.<br>\n    It should not really do any logic besides checking and returning one of the following codes:<br>\n    - FMOD_OK - Meaning yes, it should execute the dsp process function with FMOD_DSP_PROCESS_PERFORM<br>\n    - FMOD_ERR_DSP_DONTPROCESS - Meaning no, it should skip the process function and not call it with FMOD_DSP_PROCESS_PERFORM.<br>\n    - FMOD_ERR_DSP_SILENCE - Meaning no, it should skip the process function and not call it with FMOD_DSP_PROCESS_PERFORM, AND, tell the signal chain to follow that it is now idle, so that no more processing happens down the chain.<br>\n    If audio is to be processed, 'outbufferarray' must be filled with the expected output format, channel count and mask.  Mask can be 0.<br>\n    <br>\n    FMOD_DSP_PROCESS_PROCESS  is to be handled by reading the data from the input, processing it, and writing it to the output.  Always write to the output buffer and fill it fully to avoid unpredictable audio output.<br>\n    Always return FMOD_OK, the return value is ignored from the process stage.\n\n    [SEE_ALSO]\n    FMOD_DSP_DESCRIPTION\n]\n*/\ntypedef enum\n{\n    FMOD_DSP_PROCESS_PERFORM,                   /* Process the incoming audio in 'inbufferarray' and output to 'outbufferarray'. */\n    FMOD_DSP_PROCESS_QUERY                      /* The DSP is being queried for the expected output format and whether it needs to process audio or should be bypassed.  The function should return FMOD_OK, or FMOD_ERR_DSP_DONTPROCESS or FMOD_ERR_DSP_SILENCE if audio can pass through unprocessed. See remarks for more.  If audio is to be processed, 'outbufferarray' must be filled with the expected output format, channel count and mask. */\n} FMOD_DSP_PROCESS_OPERATION;\n\n\n/*\n[STRUCTURE] \n[\n    [DESCRIPTION]\n    Complex number structure used for holding FFT frequency domain-data for FMOD_FFTREAL and FMOD_IFFTREAL DSP functions.\n\n    [REMARKS]\n\n    [SEE_ALSO]    \n    FMOD_DSP_STATE_FUNCTIONS\n    FMOD_DSP_STATE_DFT_FUNCTIONS\n]\n*/\ntypedef struct FMOD_COMPLEX\n{\n    float real; /* Real component */\n    float imag; /* Imaginary component */\n} FMOD_COMPLEX;\n\n\n/*\n[ENUM]\n[\n    [DESCRIPTION]\n    Flags for the FMOD_DSP_PAN_SUMSURROUNDMATRIX_FUNC function.\n\n    [REMARKS]\n    This functionality is experimental, please contact support@fmod.org for more information.\n\n    [SEE_ALSO]\n    FMOD_DSP_STATE_PAN_FUNCTIONS\n]\n*/\ntypedef enum FMOD_DSP_PAN_SURROUND_FLAGS\n{\n    FMOD_DSP_PAN_SURROUND_DEFAULT = 0,\n    FMOD_DSP_PAN_SURROUND_ROTATION_NOT_BIASED = 1,\n\n    FMOD_DSP_PAN_SURROUND_FLAGS_FORCEINT = 65536     /* Makes sure this enum is signed 32bit. */\n} FMOD_DSP_PAN_SURROUND_FLAGS;\n\n\n/*\n    FMOD_DSP_DESCRIPTION callbacks\n*/\ntypedef FMOD_RESULT (F_CALL *FMOD_DSP_CREATE_CALLBACK)                    (FMOD_DSP_STATE *dsp_state);\ntypedef FMOD_RESULT (F_CALL *FMOD_DSP_RELEASE_CALLBACK)                   (FMOD_DSP_STATE *dsp_state);\ntypedef FMOD_RESULT (F_CALL *FMOD_DSP_RESET_CALLBACK)                     (FMOD_DSP_STATE *dsp_state);\ntypedef FMOD_RESULT (F_CALL *FMOD_DSP_READ_CALLBACK)                      (FMOD_DSP_STATE *dsp_state, float *inbuffer, float *outbuffer, unsigned int length, int inchannels, int *outchannels);\ntypedef FMOD_RESULT (F_CALL *FMOD_DSP_PROCESS_CALLBACK)                   (FMOD_DSP_STATE *dsp_state, unsigned int length, const FMOD_DSP_BUFFER_ARRAY *inbufferarray, FMOD_DSP_BUFFER_ARRAY *outbufferarray, FMOD_BOOL inputsidle, FMOD_DSP_PROCESS_OPERATION op);\ntypedef FMOD_RESULT (F_CALL *FMOD_DSP_SETPOSITION_CALLBACK)               (FMOD_DSP_STATE *dsp_state, unsigned int pos);\ntypedef FMOD_RESULT (F_CALL *FMOD_DSP_SHOULDIPROCESS_CALLBACK)            (FMOD_DSP_STATE *dsp_state, FMOD_BOOL inputsidle, unsigned int length, FMOD_CHANNELMASK inmask, int inchannels, FMOD_SPEAKERMODE speakermode);\n\ntypedef FMOD_RESULT (F_CALL *FMOD_DSP_SETPARAM_FLOAT_CALLBACK)            (FMOD_DSP_STATE *dsp_state, int index, float value);\ntypedef FMOD_RESULT (F_CALL *FMOD_DSP_SETPARAM_INT_CALLBACK)              (FMOD_DSP_STATE *dsp_state, int index, int value);\ntypedef FMOD_RESULT (F_CALL *FMOD_DSP_SETPARAM_BOOL_CALLBACK)             (FMOD_DSP_STATE *dsp_state, int index, FMOD_BOOL value);\ntypedef FMOD_RESULT (F_CALL *FMOD_DSP_SETPARAM_DATA_CALLBACK)             (FMOD_DSP_STATE *dsp_state, int index, void *data, unsigned int length);\ntypedef FMOD_RESULT (F_CALL *FMOD_DSP_GETPARAM_FLOAT_CALLBACK)            (FMOD_DSP_STATE *dsp_state, int index, float *value, char *valuestr);\ntypedef FMOD_RESULT (F_CALL *FMOD_DSP_GETPARAM_INT_CALLBACK)              (FMOD_DSP_STATE *dsp_state, int index, int *value, char *valuestr);\ntypedef FMOD_RESULT (F_CALL *FMOD_DSP_GETPARAM_BOOL_CALLBACK)             (FMOD_DSP_STATE *dsp_state, int index, FMOD_BOOL *value, char *valuestr);\ntypedef FMOD_RESULT (F_CALL *FMOD_DSP_GETPARAM_DATA_CALLBACK)             (FMOD_DSP_STATE *dsp_state, int index, void **data, unsigned int *length, char *valuestr);\n\ntypedef FMOD_RESULT (F_CALL *FMOD_DSP_SYSTEM_REGISTER_CALLBACK)           (FMOD_DSP_STATE *dsp_state);\ntypedef FMOD_RESULT (F_CALL *FMOD_DSP_SYSTEM_DEREGISTER_CALLBACK)         (FMOD_DSP_STATE *dsp_state);\ntypedef FMOD_RESULT (F_CALL *FMOD_DSP_SYSTEM_MIX_CALLBACK)                (FMOD_DSP_STATE *dsp_state, int stage);\n\n\n/*\n    FMOD_DSP_STATE functions\n*/\ntypedef void *      (F_CALL *FMOD_DSP_ALLOC_FUNC)                         (unsigned int size, FMOD_MEMORY_TYPE type, const char *sourcestr);\ntypedef void *      (F_CALL *FMOD_DSP_REALLOC_FUNC)                       (void *ptr, unsigned int size, FMOD_MEMORY_TYPE type, const char *sourcestr);\ntypedef void        (F_CALL *FMOD_DSP_FREE_FUNC)                          (void *ptr, FMOD_MEMORY_TYPE type, const char *sourcestr);\ntypedef void        (F_CALL *FMOD_DSP_LOG_FUNC)                           (FMOD_DEBUG_FLAGS level, const char *file, int line, const char *function, const char *string, ...);\ntypedef FMOD_RESULT (F_CALL *FMOD_DSP_GETSAMPLERATE_FUNC)                 (FMOD_DSP_STATE *dsp_state, int *rate);\ntypedef FMOD_RESULT (F_CALL *FMOD_DSP_GETBLOCKSIZE_FUNC)                  (FMOD_DSP_STATE *dsp_state, unsigned int *blocksize);\ntypedef FMOD_RESULT (F_CALL *FMOD_DSP_GETSPEAKERMODE_FUNC)                (FMOD_DSP_STATE *dsp_state, FMOD_SPEAKERMODE *speakermode_mixer, FMOD_SPEAKERMODE *speakermode_output);\ntypedef FMOD_RESULT (F_CALL *FMOD_DSP_GETCLOCK_FUNC)                      (FMOD_DSP_STATE *dsp_state, unsigned long long *clock, unsigned int *offset, unsigned int *length);\ntypedef FMOD_RESULT (F_CALL *FMOD_DSP_GETLISTENERATTRIBUTES_FUNC)         (FMOD_DSP_STATE *dsp_state, int *numlisteners, FMOD_3D_ATTRIBUTES *attributes);\ntypedef FMOD_RESULT (F_CALL *FMOD_DSP_GETUSERDATA_FUNC)                   (FMOD_DSP_STATE *dsp_state, void **userdata);\n\ntypedef FMOD_RESULT (F_CALL *FMOD_DSP_DFT_FFTREAL_FUNC)                   (FMOD_DSP_STATE *dsp_state, int size, const float *signal, FMOD_COMPLEX* dft, const float *window, int signalhop);\ntypedef FMOD_RESULT (F_CALL *FMOD_DSP_DFT_IFFTREAL_FUNC)                  (FMOD_DSP_STATE *dsp_state, int size, const FMOD_COMPLEX *dft, float* signal, const float *window, int signalhop);\n\ntypedef FMOD_RESULT (F_CALL *FMOD_DSP_PAN_SUMMONOMATRIX_FUNC)             (FMOD_DSP_STATE *dsp_state, FMOD_SPEAKERMODE sourceSpeakerMode, float lowFrequencyGain, float overallGain, float *matrix);\ntypedef FMOD_RESULT (F_CALL *FMOD_DSP_PAN_SUMSTEREOMATRIX_FUNC)           (FMOD_DSP_STATE *dsp_state, FMOD_SPEAKERMODE sourceSpeakerMode, float pan, float lowFrequencyGain, float overallGain, int matrixHop, float *matrix);\ntypedef FMOD_RESULT (F_CALL *FMOD_DSP_PAN_SUMSURROUNDMATRIX_FUNC)         (FMOD_DSP_STATE *dsp_state, FMOD_SPEAKERMODE sourceSpeakerMode, FMOD_SPEAKERMODE targetSpeakerMode, float direction, float extent, float rotation, float lowFrequencyGain, float overallGain, int matrixHop, float *matrix, FMOD_DSP_PAN_SURROUND_FLAGS flags);\ntypedef FMOD_RESULT (F_CALL *FMOD_DSP_PAN_SUMMONOTOSURROUNDMATRIX_FUNC)   (FMOD_DSP_STATE *dsp_state, FMOD_SPEAKERMODE targetSpeakerMode, float direction, float extent, float lowFrequencyGain, float overallGain, int matrixHop, float *matrix);\ntypedef FMOD_RESULT (F_CALL *FMOD_DSP_PAN_SUMSTEREOTOSURROUNDMATRIX_FUNC) (FMOD_DSP_STATE *dsp_state, FMOD_SPEAKERMODE targetSpeakerMode, float direction, float extent, float rotation, float lowFrequencyGain, float overallGain, int matrixHop, float *matrix);\ntypedef FMOD_RESULT (F_CALL *FMOD_DSP_PAN_GETROLLOFFGAIN_FUNC)            (FMOD_DSP_STATE *dsp_state, FMOD_DSP_PAN_3D_ROLLOFF_TYPE rolloff, float distance, float mindistance, float maxdistance, float *gain);\n\n\n/*\n[DEFINE]\n[\n    [NAME]\n    FMOD_DSP_GETPARAM_VALUESTR_LENGTH\n    \n    [DESCRIPTION]\n    Length in bytes of the buffer pointed to by the valuestr argument of FMOD_DSP_GETPARAM_XXXX_CALLBACK functions.\n    \n    [REMARKS]\n    DSP plugins should not copy more than this number of bytes into the buffer or memory corruption will occur.\n    \n    [SEE_ALSO]\n    FMOD_DSP_GETPARAM_FLOAT_CALLBACK\n    FMOD_DSP_GETPARAM_INT_CALLBACK\n    FMOD_DSP_GETPARAM_BOOL_CALLBACK\n    FMOD_DSP_GETPARAM_DATA_CALLBACK\n]\n*/\n#define FMOD_DSP_GETPARAM_VALUESTR_LENGTH 32\n/* [DEFINE_END] */\n\n/*\n[ENUM]\n[\n    [DESCRIPTION]   \n    DSP parameter types.\n\n    [REMARKS]\n\n    [SEE_ALSO]\n    FMOD_DSP_PARAMETER_DESC\n]\n*/\ntypedef enum\n{\n    FMOD_DSP_PARAMETER_TYPE_FLOAT,              /* FMOD_DSP_PARAMETER_DESC will use the FMOD_DSP_PARAMETER_DESC_FLOAT. */\n    FMOD_DSP_PARAMETER_TYPE_INT,                /* FMOD_DSP_PARAMETER_DESC will use the FMOD_DSP_PARAMETER_DESC_INT. */\n    FMOD_DSP_PARAMETER_TYPE_BOOL,               /* FMOD_DSP_PARAMETER_DESC will use the FMOD_DSP_PARAMETER_DESC_BOOL. */\n    FMOD_DSP_PARAMETER_TYPE_DATA,               /* FMOD_DSP_PARAMETER_DESC will use the FMOD_DSP_PARAMETER_DESC_DATA. */\n\n    FMOD_DSP_PARAMETER_TYPE_MAX,                /* Maximum number of DSP parameter types. */\n    FMOD_DSP_PARAMETER_TYPE_FORCEINT = 65536    /* Makes sure this enum is signed 32bit. */\n} FMOD_DSP_PARAMETER_TYPE;\n\n\n/*\n[ENUM]\n[\n    [DESCRIPTION]   \n    DSP float parameter mappings. These determine how values are mapped across dials and automation curves.\n\n    [REMARKS]\n    FMOD_DSP_PARAMETER_FLOAT_MAPPING_TYPE_AUTO generates a mapping based on range and units. For example, if the units are in Hertz and the range is with-in the audio spectrum, a Bark scale will be chosen. Logarithmic scales may also be generated for ranges above zero spanning several orders of magnitude.\n\n    [SEE_ALSO]\n    FMOD_DSP_PARAMETER_FLOAT_MAPPING\n]\n*/\ntypedef enum\n{\n    FMOD_DSP_PARAMETER_FLOAT_MAPPING_TYPE_LINEAR,               /* Values mapped linearly across range. */\n    FMOD_DSP_PARAMETER_FLOAT_MAPPING_TYPE_AUTO,                 /* A mapping is automatically chosen based on range and units.  See remarks. */\n    FMOD_DSP_PARAMETER_FLOAT_MAPPING_TYPE_PIECEWISE_LINEAR,     /* Values mapped in a piecewise linear fashion defined by FMOD_DSP_PARAMETER_FLOAT_MAPPING_PIECEWISE_LINEAR. */\n\n    FMOD_DSP_PARAMETER_FLOAT_MAPPING_TYPE_FORCEINT = 65536      /* Makes sure this enum is signed 32bit. */\n} FMOD_DSP_PARAMETER_FLOAT_MAPPING_TYPE;\n\n/*\n[STRUCTURE] \n[\n    [DESCRIPTION]\n    Structure to define a piecewise linear mapping.\n\n    [REMARKS]\n    Members marked with [r] mean the variable is modified by FMOD and is for reading purposes only.  Do not change this value.<br>\n    Members marked with [w] mean the variable can be written to.  The user can set the value.<br>\n\n    [SEE_ALSO]    \n    FMOD_DSP_PARAMETER_FLOAT_MAPPING_TYPE\n    FMOD_DSP_PARAMETER_FLOAT_MAPPING\n]\n*/\ntypedef struct FMOD_DSP_PARAMETER_FLOAT_MAPPING_PIECEWISE_LINEAR\n{\n    int numpoints;                              /* [w] The number of <position, value> pairs in the piecewise mapping (at least 2). */\n    float *pointparamvalues;                    /* [w] The values in the parameter's units for each point */\n    float *pointpositions;                      /* [w] The positions along the control's scale (e.g. dial angle) corresponding to each parameter value.  The range of this scale is arbitrary and all positions will be relative to the minimum and maximum values (e.g. [0,1,3] is equivalent to [1,2,4] and [2,4,8]).  If this array is zero, pointparamvalues will be distributed with equal spacing. */\n} FMOD_DSP_PARAMETER_FLOAT_MAPPING_PIECEWISE_LINEAR;\n\n\n/*\n[STRUCTURE] \n[\n    [DESCRIPTION]\n    Structure to define a mapping for a DSP unit's float parameter.\n\n    [REMARKS]\n    Members marked with [r] mean the variable is modified by FMOD and is for reading purposes only.  Do not change this value.<br>\n    Members marked with [w] mean the variable can be written to.  The user can set the value.<br>\n\n    [SEE_ALSO]    \n    FMOD_DSP_PARAMETER_FLOAT_MAPPING_TYPE\n    FMOD_DSP_PARAMETER_FLOAT_MAPPING_PIECEWISE_LINEAR\n    FMOD_DSP_PARAMETER_DESC_FLOAT\n]\n*/\ntypedef struct FMOD_DSP_PARAMETER_FLOAT_MAPPING\n{\n    FMOD_DSP_PARAMETER_FLOAT_MAPPING_TYPE type;\n    FMOD_DSP_PARAMETER_FLOAT_MAPPING_PIECEWISE_LINEAR piecewiselinearmapping; /* [w] Only required for FMOD_DSP_PARAMETER_FLOAT_MAPPING_TYPE_PIECEWISE_LINEAR type mapping. */\n} FMOD_DSP_PARAMETER_FLOAT_MAPPING;\n\n\n/*\n[STRUCTURE] \n[\n    [DESCRIPTION]\n    Structure to define a float parameter for a DSP unit.\n\n    [REMARKS]\n    Members marked with [r] mean the variable is modified by FMOD and is for reading purposes only.  Do not change this value.<br>\n    Members marked with [w] mean the variable can be written to.  The user can set the value.<br>\n\n    [SEE_ALSO]    \n    System::createDSP\n    DSP::setParameterFloat\n    DSP::getParameterFloat\n    FMOD_DSP_PARAMETER_DESC\n    FMOD_DSP_PARAMETER_FLOAT_MAPPING\n]\n*/\ntypedef struct FMOD_DSP_PARAMETER_DESC_FLOAT\n{\n    float                     min;                      /* [w] Minimum parameter value. */\n    float                     max;                      /* [w] Maximum parameter value. */\n    float                     defaultval;               /* [w] Default parameter value. */\n    FMOD_DSP_PARAMETER_FLOAT_MAPPING mapping;           /* [w] How the values are distributed across dials and automation curves (e.g. linearly, exponentially etc). */\n} FMOD_DSP_PARAMETER_DESC_FLOAT;\n\n\n/*\n[STRUCTURE] \n[\n    [DESCRIPTION]\n    Structure to define a int parameter for a DSP unit.\n\n    [REMARKS]\n    Members marked with [r] mean the variable is modified by FMOD and is for reading purposes only.  Do not change this value.<br>\n    Members marked with [w] mean the variable can be written to.  The user can set the value.<br>\n\n    [SEE_ALSO]    \n    System::createDSP\n    DSP::setParameterInt\n    DSP::getParameterInt\n    FMOD_DSP_PARAMETER_DESC\n]\n*/\ntypedef struct FMOD_DSP_PARAMETER_DESC_INT\n{\n    int                       min;                      /* [w] Minimum parameter value. */\n    int                       max;                      /* [w] Maximum parameter value. */\n    int                       defaultval;               /* [w] Default parameter value. */\n    FMOD_BOOL                 goestoinf;                /* [w] Whether the last value represents infiniy. */\n    const char* const*        valuenames;               /* [w] Names for each value.  There should be as many strings as there are possible values (max - min + 1).  Optional. */\n} FMOD_DSP_PARAMETER_DESC_INT;\n\n\n/*\n[STRUCTURE] \n[\n    [DESCRIPTION]\n    Structure to define a boolean parameter for a DSP unit.\n\n    [REMARKS]\n    Members marked with [r] mean the variable is modified by FMOD and is for reading purposes only.  Do not change this value.<br>\n    Members marked with [w] mean the variable can be written to.  The user can set the value.<br>\n\n    [SEE_ALSO]    \n    System::createDSP\n    DSP::setParameterBool\n    DSP::getParameterBool\n    FMOD_DSP_PARAMETER_DESC\n]\n*/\ntypedef struct FMOD_DSP_PARAMETER_DESC_BOOL\n{\n    FMOD_BOOL                 defaultval;               /* [w] Default parameter value. */\n    const char* const*        valuenames;               /* [w] Names for false and true, respectively.  There should be two strings.  Optional. */\n} FMOD_DSP_PARAMETER_DESC_BOOL;\n\n\n/*\n[STRUCTURE] \n[\n    [DESCRIPTION]\n    Structure to define a data parameter for a DSP unit.  Use 0 or above for custom types.  This parameter will be treated specially by the system if set to one of the FMOD_DSP_PARAMETER_DATA_TYPE values.\n\n    [REMARKS]\n    Members marked with [r] mean the variable is modified by FMOD and is for reading purposes only.  Do not change this value.<br>\n    Members marked with [w] mean the variable can be written to.  The user can set the value.<br>\n\n    [SEE_ALSO]    \n    System::createDSP\n    DSP::setParameterData\n    DSP::getParameterData\n    FMOD_DSP_PARAMETER_DATA_TYPE\n    FMOD_DSP_PARAMETER_DESC\n]\n*/\ntypedef struct FMOD_DSP_PARAMETER_DESC_DATA\n{\n    int                       datatype;                 /* [w] The type of data for this parameter.  Use 0 or above for custom types or set to one of the FMOD_DSP_PARAMETER_DATA_TYPE values. */\n} FMOD_DSP_PARAMETER_DESC_DATA;\n\n\n/*\n[STRUCTURE] \n[\n    [DESCRIPTION]\n    Base Structure for DSP parameter descriptions.\n\n    [REMARKS]\n    Members marked with [r] mean the variable is modified by FMOD and is for reading purposes only.  Do not change this value.<br>\n    Members marked with [w] mean the variable can be written to.  The user can set the value.<br>\n\n    [SEE_ALSO]    \n    System::createDSP\n    DSP::setParameterFloat\n    DSP::getParameterFloat\n    DSP::setParameterInt\n    DSP::getParameterInt\n    DSP::setParameterBool\n    DSP::getParameterBool\n    DSP::setParameterData\n    DSP::getParameterData\n    FMOD_DSP_PARAMETER_DESC_FLOAT\n    FMOD_DSP_PARAMETER_DESC_INT\n    FMOD_DSP_PARAMETER_DESC_BOOL\n    FMOD_DSP_PARAMETER_DESC_DATA\n    FMOD_DSP_PARAMETER_DATA_TYPE\n]\n*/\ntypedef struct FMOD_DSP_PARAMETER_DESC\n{\n    FMOD_DSP_PARAMETER_TYPE   type;                 /* [w] Type of this parameter. */\n    char                      name[16];             /* [w] Name of the parameter to be displayed (ie \"Cutoff frequency\"). */\n    char                      label[16];            /* [w] Short string to be put next to value to denote the unit type (ie \"hz\"). */\n    const char               *description;          /* [w] Description of the parameter to be displayed as a help item / tooltip for this parameter. */\n\n    union\n    {\n        FMOD_DSP_PARAMETER_DESC_FLOAT   floatdesc;  /* [w] Struct containing information about the parameter in floating point format.  Use when type is FMOD_DSP_PARAMETER_TYPE_FLOAT. */\n        FMOD_DSP_PARAMETER_DESC_INT     intdesc;    /* [w] Struct containing information about the parameter in integer format.  Use when type is FMOD_DSP_PARAMETER_TYPE_INT. */\n        FMOD_DSP_PARAMETER_DESC_BOOL    booldesc;   /* [w] Struct containing information about the parameter in boolean format.  Use when type is FMOD_DSP_PARAMETER_TYPE_BOOL. */\n        FMOD_DSP_PARAMETER_DESC_DATA    datadesc;   /* [w] Struct containing information about the parameter in data format.  Use when type is FMOD_DSP_PARAMETER_TYPE_DATA. */\n    };\n} FMOD_DSP_PARAMETER_DESC;\n\n\n/*\n[ENUM]\n[\n    [DESCRIPTION]   \n    Built-in types for the 'datatype' member of FMOD_DSP_PARAMETER_DESC_DATA.  Data parameters of type other than FMOD_DSP_PARAMETER_DATA_TYPE_USER will be treated specially by the system. \n\n    [REMARKS]\n\n    [SEE_ALSO]\n    FMOD_DSP_PARAMETER_DESC_DATA\n    FMOD_DSP_PARAMETER_OVERALLGAIN\n    FMOD_DSP_PARAMETER_3DATTRIBUTES\n    FMOD_DSP_PARAMETER_3DATTRIBUTES_MULTI\n    FMOD_DSP_PARAMETER_SIDECHAIN\n    DSP::getParameterData\n    DSP::setParameterData\n]\n*/\ntypedef enum\n{\n    FMOD_DSP_PARAMETER_DATA_TYPE_USER = 0,                  /* The default data type.  All user data types should be 0 or above. */\n    FMOD_DSP_PARAMETER_DATA_TYPE_OVERALLGAIN = -1,          /* The data type for FMOD_DSP_PARAMETER_OVERALLGAIN parameters.  There should a maximum of one per DSP. */\n    FMOD_DSP_PARAMETER_DATA_TYPE_3DATTRIBUTES = -2,         /* The data type for FMOD_DSP_PARAMETER_3DATTRIBUTES parameters.  There should a maximum of one per DSP. */\n    FMOD_DSP_PARAMETER_DATA_TYPE_SIDECHAIN = -3,            /* The data type for FMOD_DSP_PARAMETER_SIDECHAIN parameters.  There should a maximum of one per DSP. */\n    FMOD_DSP_PARAMETER_DATA_TYPE_FFT = -4,                  /* The data type for FMOD_DSP_PARAMETER_FFT parameters.  There should a maximum of one per DSP. */\n    FMOD_DSP_PARAMETER_DATA_TYPE_3DATTRIBUTES_MULTI = -5,   /* The data type for FMOD_DSP_PARAMETER_3DATTRIBUTES_MULTI parameters.  There should a maximum of one per DSP. */\n} FMOD_DSP_PARAMETER_DATA_TYPE;\n\n\n/*\n[STRUCTURE] \n[\n    [DESCRIPTION]\n    Structure for data parameters of type FMOD_DSP_PARAMETER_DATA_TYPE_OVERALLGAIN.\n    A parameter of this type is used in effects that affect the overgain of the signal in a predictable way.\n    This parameter is read by the system to determine the effect's gain for voice virtualization.\n\n    [REMARKS]\n    Members marked with [r] mean the variable is modified by FMOD and is for reading purposes only.  Do not change this value.<br>\n    Members marked with [w] mean the variable can be written to.  The user can set the value.<br>\n\n    [SEE_ALSO]    \n    FMOD_DSP_PARAMETER_DATA_TYPE\n    FMOD_DSP_PARAMETER_DESC\n]\n*/\ntypedef struct FMOD_DSP_PARAMETER_OVERALLGAIN\n{\n    float linear_gain;                                  /* [r] The overall linear gain of the effect on the direct signal path */\n    float linear_gain_additive;                         /* [r] Additive gain, for parallel signal paths */\n} FMOD_DSP_PARAMETER_OVERALLGAIN;\n\n\n/*\n[STRUCTURE] \n[\n    [DESCRIPTION]\n    Structure for data parameters of type FMOD_DSP_PARAMETER_DATA_TYPE_3DATTRIBUTES.\n    \n    A parameter of this type is used in effects that respond to a 3D position.\n\n    [REMARKS]\n    The FMOD::Studio::System will set this parameter automatically if an FMOD::Studio::EventInstance position\n    changes, however if using the low level FMOD::System you must set this DSP parameter explicitly.\n\n    Attributes must use a coordinate system with the positive Y axis being up and the positive X axis being\n    right. FMOD will convert passed in coordinates to left-handed for the plugin if the System was initialized\n    with the FMOD_INIT_3D_RIGHTHANDED flag.\n\n    Members marked with [r] mean the variable is modified by FMOD and is for reading purposes only.  Do not change this value.<br>\n    Members marked with [w] mean the variable can be written to.  The user can set the value.<br>\n\n    [SEE_ALSO]    \n    FMOD_DSP_PARAMETER_DATA_TYPE\n    FMOD_DSP_PARAMETER_DESC\n]\n*/\ntypedef struct FMOD_DSP_PARAMETER_3DATTRIBUTES\n{\n    FMOD_3D_ATTRIBUTES relative;                        /* [w] The position of the sound relative to the listener. */\n    FMOD_3D_ATTRIBUTES absolute;                        /* [w] The position of the sound in world coordinates. */\n} FMOD_DSP_PARAMETER_3DATTRIBUTES;\n\n\n/*\n[STRUCTURE] \n[\n    [DESCRIPTION]\n    Structure for data parameters of type FMOD_DSP_PARAMETER_DATA_TYPE_3DATTRIBUTES_MULTI.\n\n    A parameter of this type is used in effects that respond to a 3D position and support multiple listeners.\n\n    [REMARKS]\n    The FMOD::Studio::System will set this parameter automatically if an FMOD::Studio::EventInstance position\n    changes, however if using the low level FMOD::System you must set this DSP parameter explicitly.\n\n    Attributes must use a coordinate system with the positive Y axis being up and the positive X axis being\n    right. FMOD will convert passed in coordinates to left-handed for the plugin if the System was initialized\n    with the FMOD_INIT_3D_RIGHTHANDED flag.\n\n    Members marked with [r] mean the variable is modified by FMOD and is for reading purposes only.  Do not change this value.<br>\n    Members marked with [w] mean the variable can be written to.  The user can set the value.<br>\n\n    [SEE_ALSO]    \n    FMOD_DSP_PARAMETER_DATA_TYPE\n    FMOD_DSP_PARAMETER_DESC\n]\n*/\ntypedef struct FMOD_DSP_PARAMETER_3DATTRIBUTES_MULTI\n{\n    int                numlisteners;                    /* [w] The number of listeners. */\n    FMOD_3D_ATTRIBUTES relative[FMOD_MAX_LISTENERS];    /* [w] The position of the sound relative to the listeners. */\n    float              weight[FMOD_MAX_LISTENERS];      /* [w] The weighting of the listeners where 0 means listener has no contribution and 1 means full contribution. */\n    FMOD_3D_ATTRIBUTES absolute;                        /* [w] The position of the sound in world coordinates. */\n} FMOD_DSP_PARAMETER_3DATTRIBUTES_MULTI;\n\n\n/*\n[STRUCTURE] \n[\n    [DESCRIPTION]\n    Structure for data parameters of type FMOD_DSP_PARAMETER_DATA_TYPE_SIDECHAIN.\n    A parameter of this type is declared for effects which support sidechaining.\n\n    [REMARKS]\n    Members marked with [r] mean the variable is modified by FMOD and is for reading purposes only.  Do not change this value.<br>\n    Members marked with [w] mean the variable can be written to.  The user can set the value.<br>\n\n    [SEE_ALSO]    \n    FMOD_DSP_PARAMETER_DATA_TYPE\n    FMOD_DSP_PARAMETER_DESC\n]\n*/\ntypedef struct FMOD_DSP_PARAMETER_SIDECHAIN\n{\n    FMOD_BOOL sidechainenable;                               /* [r/w] Whether sidechains are enabled. */\n} FMOD_DSP_PARAMETER_SIDECHAIN;\n\n\n/*\n[STRUCTURE] \n[\n    [DESCRIPTION]\n    Structure for data parameters of type FMOD_DSP_PARAMETER_DATA_TYPE_FFT.\n    A parameter of this type is declared for the FMOD_DSP_TYPE_FFT effect.\n\n    [REMARKS]\n    Members marked with [r] mean the variable is modified by FMOD and is for reading purposes only.  Do not change this value.<br>\n    Members marked with [w] mean the variable can be written to.  The user can set the value.<br>\n    <br>\n    Notes on the spectrum data member.  Values inside the float buffer are typically between 0 and 1.0.<br>\n    Each top level array represents one PCM channel of data.<br>\n    Address data as spectrum[channel][bin].  A bin is 1 fft window entry.<br>\n    Only read/display half of the buffer typically for analysis as the 2nd half is usually the same data reversed due to the nature of the way FFT works.<br>\n\n    [SEE_ALSO]    \n    FMOD_DSP_PARAMETER_DATA_TYPE\n    FMOD_DSP_PARAMETER_DESC\n    FMOD_DSP_PARAMETER_DATA_TYPE_FFT\n    FMOD_DSP_TYPE\n    FMOD_DSP_FFT\n]\n*/\ntypedef struct FMOD_DSP_PARAMETER_FFT\n{\n    int     length;                                    /* [r] Number of entries in this spectrum window.   Divide this by the output rate to get the hz per entry. */\n    int     numchannels;                               /* [r] Number of channels in spectrum. */\n    float  *spectrum[32];                              /* [r] Per channel spectrum arrays.  See remarks for more. */\n} FMOD_DSP_PARAMETER_FFT;\n\n\n/*\n    Helpers for declaring parameters in custom DSPSs\n*/\n#define FMOD_DSP_INIT_PARAMDESC_FLOAT(_paramstruct, _name, _label, _description, _min, _max, _defaultval) \\\n    memset(&(_paramstruct), 0, sizeof(_paramstruct)); \\\n    (_paramstruct).type         = FMOD_DSP_PARAMETER_TYPE_FLOAT; \\\n    strncpy((_paramstruct).name,  _name,  15); \\\n    strncpy((_paramstruct).label, _label, 15); \\\n    (_paramstruct).description  = _description; \\\n    (_paramstruct).floatdesc.min          = _min; \\\n    (_paramstruct).floatdesc.max          = _max; \\\n    (_paramstruct).floatdesc.defaultval   = _defaultval; \\\n    (_paramstruct).floatdesc.mapping.type = FMOD_DSP_PARAMETER_FLOAT_MAPPING_TYPE_AUTO;\n\n#define FMOD_DSP_INIT_PARAMDESC_FLOAT_WITH_MAPPING(_paramstruct, _name, _label, _description, _defaultval, _values, _positions); \\\n    memset(&(_paramstruct), 0, sizeof(_paramstruct)); \\\n    (_paramstruct).type         = FMOD_DSP_PARAMETER_TYPE_FLOAT; \\\n    strncpy((_paramstruct).name,  _name , 15); \\\n    strncpy((_paramstruct).label, _label, 15); \\\n    (_paramstruct).description  = _description; \\\n    (_paramstruct).floatdesc.min          = _values[0]; \\\n    (_paramstruct).floatdesc.max          = _values[sizeof(_values) / sizeof(float) - 1]; \\\n    (_paramstruct).floatdesc.defaultval   = _defaultval; \\\n    (_paramstruct).floatdesc.mapping.type = FMOD_DSP_PARAMETER_FLOAT_MAPPING_TYPE_PIECEWISE_LINEAR; \\\n    (_paramstruct).floatdesc.mapping.piecewiselinearmapping.numpoints = sizeof(_values) / sizeof(float); \\\n    (_paramstruct).floatdesc.mapping.piecewiselinearmapping.pointparamvalues = _values; \\\n    (_paramstruct).floatdesc.mapping.piecewiselinearmapping.pointpositions = _positions;\n\n#define FMOD_DSP_INIT_PARAMDESC_INT(_paramstruct, _name, _label, _description, _min, _max, _defaultval, _goestoinf, _valuenames) \\\n    memset(&(_paramstruct), 0, sizeof(_paramstruct)); \\\n    (_paramstruct).type         = FMOD_DSP_PARAMETER_TYPE_INT; \\\n    strncpy((_paramstruct).name,  _name , 15); \\\n    strncpy((_paramstruct).label, _label, 15); \\\n    (_paramstruct).description  = _description; \\\n    (_paramstruct).intdesc.min          = _min; \\\n    (_paramstruct).intdesc.max          = _max; \\\n    (_paramstruct).intdesc.defaultval   = _defaultval; \\\n    (_paramstruct).intdesc.goestoinf    = _goestoinf; \\\n    (_paramstruct).intdesc.valuenames   = _valuenames;\n\n#define FMOD_DSP_INIT_PARAMDESC_INT_ENUMERATED(_paramstruct, _name, _label, _description, _defaultval, _valuenames) \\\n    memset(&(_paramstruct), 0, sizeof(_paramstruct)); \\\n    (_paramstruct).type         = FMOD_DSP_PARAMETER_TYPE_INT; \\\n    strncpy((_paramstruct).name,  _name , 15); \\\n    strncpy((_paramstruct).label, _label, 15); \\\n    (_paramstruct).description  = _description; \\\n    (_paramstruct).intdesc.min          = 0; \\\n    (_paramstruct).intdesc.max          = sizeof(_valuenames) / sizeof(char*) - 1; \\\n    (_paramstruct).intdesc.defaultval   = _defaultval; \\\n    (_paramstruct).intdesc.goestoinf    = false; \\\n    (_paramstruct).intdesc.valuenames   = _valuenames;\n\n#define FMOD_DSP_INIT_PARAMDESC_BOOL(_paramstruct, _name, _label, _description, _defaultval, _valuenames) \\\n    memset(&(_paramstruct), 0, sizeof(_paramstruct)); \\\n    (_paramstruct).type         = FMOD_DSP_PARAMETER_TYPE_BOOL; \\\n    strncpy((_paramstruct).name,  _name , 15); \\\n    strncpy((_paramstruct).label, _label, 15); \\\n    (_paramstruct).description  = _description; \\\n    (_paramstruct).booldesc.defaultval   = _defaultval; \\\n    (_paramstruct).booldesc.valuenames   = _valuenames;\n\n#define FMOD_DSP_INIT_PARAMDESC_DATA(_paramstruct, _name, _label, _description, _datatype) \\\n    memset(&(_paramstruct), 0, sizeof(_paramstruct)); \\\n    (_paramstruct).type         = FMOD_DSP_PARAMETER_TYPE_DATA; \\\n    strncpy((_paramstruct).name,  _name , 15); \\\n    strncpy((_paramstruct).label, _label, 15); \\\n    (_paramstruct).description  = _description; \\\n    (_paramstruct).datadesc.datatype     = _datatype;\n\n#define FMOD_PLUGIN_SDK_VERSION 110\n\n/*\n[STRUCTURE] \n[\n    [DESCRIPTION]\n    When creating a DSP unit, declare one of these and provide the relevant callbacks and name for FMOD to use when it creates and uses a DSP unit of this type.\n\n    [REMARKS]\n    Members marked with [r] mean the variable is modified by FMOD and is for reading purposes only.  Do not change this value.<br>\n    Members marked with [w] mean the variable can be written to.  The user can set the value.<br>\n    <br>\n    There are 2 different ways to change a parameter in this architecture.<br>\n    One is to use DSP::setParameterFloat / DSP::setParameterInt / DSP::setParameterBool / DSP::setParameterData.  This is platform independant and is dynamic, so new unknown plugins can have their parameters enumerated and used.<br>\n    The other is to use DSP::showConfigDialog.  This is platform specific and requires a GUI, and will display a dialog box to configure the plugin.<br>\n\n    [SEE_ALSO]    \n    System::createDSP\n    DSP::setParameterFloat\n    DSP::setParameterInt\n    DSP::setParameterBool\n    DSP::setParameterData\n    FMOD_DSP_STATE\n    FMOD_DSP_CREATE_CALLBACK\n    FMOD_DSP_RELEASE_CALLBACK\n    FMOD_DSP_RESET_CALLBACK\n    FMOD_DSP_READ_CALLBACK\n    FMOD_DSP_PROCESS_CALLBACK\n    FMOD_DSP_SETPOSITION_CALLBACK\n    FMOD_DSP_PARAMETER_DESC\n    FMOD_DSP_SETPARAM_FLOAT_CALLBACK\n    FMOD_DSP_SETPARAM_INT_CALLBACK\n    FMOD_DSP_SETPARAM_BOOL_CALLBACK\n    FMOD_DSP_SETPARAM_DATA_CALLBACK\n    FMOD_DSP_GETPARAM_FLOAT_CALLBACK\n    FMOD_DSP_GETPARAM_INT_CALLBACK\n    FMOD_DSP_GETPARAM_BOOL_CALLBACK\n    FMOD_DSP_GETPARAM_DATA_CALLBACK\n    FMOD_DSP_SHOULDIPROCESS_CALLBACK\n    FMOD_DSP_SYSTEM_REGISTER_CALLBACK\n    FMOD_DSP_SYSTEM_DEREGISTER_CALLBACK\n    FMOD_DSP_SYSTEM_MIX_CALLBACK\n]\n*/\ntypedef struct FMOD_DSP_DESCRIPTION\n{\n    unsigned int                        pluginsdkversion;   /* [w] The plugin SDK version this plugin is built for.  Set to this to FMOD_PLUGIN_SDK_VERSION defined above. */\n    char                                name[32];           /* [w] The identifier of the DSP. This will also be used as the name of DSP and shouldn't change between versions. */\n    unsigned int                        version;            /* [w] Plugin writer's version number. */\n    int                                 numinputbuffers;    /* [w] Number of input buffers to process.  Use 0 for DSPs that only generate sound and 1 for effects that process incoming sound. */\n    int                                 numoutputbuffers;   /* [w] Number of audio output buffers.  Only one output buffer is currently supported. */\n    FMOD_DSP_CREATE_CALLBACK            create;             /* [w] Create callback.  This is called when DSP unit is created.  Can be null. */\n    FMOD_DSP_RELEASE_CALLBACK           release;            /* [w] Release callback.  This is called just before the unit is freed so the user can do any cleanup needed for the unit.  Can be null. */\n    FMOD_DSP_RESET_CALLBACK             reset;              /* [w] Reset callback.  This is called by the user to reset any history buffers that may need resetting for a filter, when it is to be used or re-used for the first time to its initial clean state.  Use to avoid clicks or artifacts. */\n    FMOD_DSP_READ_CALLBACK              read;               /* [w] Read callback.  Processing is done here.  Can be null. */\n    FMOD_DSP_PROCESS_CALLBACK           process;            /* [w] Process callback.  Can be specified instead of the read callback if any channel format changes occur between input and output.  This also replaces shouldiprocess and should return an error if the effect is to be bypassed.  Can be null. */\n    FMOD_DSP_SETPOSITION_CALLBACK       setposition;        /* [w] Set position callback.  This is called if the unit wants to update its position info but not process data, or reset a cursor position internally if it is reading data from a certain source.  Can be null. */\n\n    int                                 numparameters;      /* [w] Number of parameters used in this filter.  The user finds this with DSP::getNumParameters */\n    FMOD_DSP_PARAMETER_DESC           **paramdesc;          /* [w] Variable number of parameter structures. */\n    FMOD_DSP_SETPARAM_FLOAT_CALLBACK    setparameterfloat;  /* [w] This is called when the user calls DSP::setParameterFloat. Can be null. */\n    FMOD_DSP_SETPARAM_INT_CALLBACK      setparameterint;    /* [w] This is called when the user calls DSP::setParameterInt.   Can be null. */\n    FMOD_DSP_SETPARAM_BOOL_CALLBACK     setparameterbool;   /* [w] This is called when the user calls DSP::setParameterBool.  Can be null. */\n    FMOD_DSP_SETPARAM_DATA_CALLBACK     setparameterdata;   /* [w] This is called when the user calls DSP::setParameterData.  Can be null. */\n    FMOD_DSP_GETPARAM_FLOAT_CALLBACK    getparameterfloat;  /* [w] This is called when the user calls DSP::getParameterFloat. Can be null. */\n    FMOD_DSP_GETPARAM_INT_CALLBACK      getparameterint;    /* [w] This is called when the user calls DSP::getParameterInt.   Can be null. */\n    FMOD_DSP_GETPARAM_BOOL_CALLBACK     getparameterbool;   /* [w] This is called when the user calls DSP::getParameterBool.  Can be null. */\n    FMOD_DSP_GETPARAM_DATA_CALLBACK     getparameterdata;   /* [w] This is called when the user calls DSP::getParameterData.  Can be null. */\n    FMOD_DSP_SHOULDIPROCESS_CALLBACK    shouldiprocess;     /* [w] This is called before processing.  You can detect if inputs are idle and return FMOD_OK to process, or any other error code to avoid processing the effect.  Use a count down timer to allow effect tails to process before idling! */\n    void                               *userdata;           /* [w] Optional. Specify 0 to ignore. This is user data to be attached to the DSP unit during creation.  Access via FMOD_DSP_STATE_FUNCTIONS::getuserdata. */\n\n    FMOD_DSP_SYSTEM_REGISTER_CALLBACK   sys_register;       /* [w] Register callback.  This is called when DSP unit is loaded/registered.  Useful for 'global'/per system object init for plugin.  Can be null. */\n    FMOD_DSP_SYSTEM_DEREGISTER_CALLBACK sys_deregister;     /* [w] Deregister callback.  This is called when DSP unit is unloaded/deregistered.  Useful as 'global'/per system object shutdown for plugin.  Can be null. */\n    FMOD_DSP_SYSTEM_MIX_CALLBACK        sys_mix;            /* [w] System mix stage callback.  This is called when the mixer starts to execute or is just finishing executing.  Useful for 'global'/per system object once a mix update calls for a plugin.  Can be null. */\n\n} FMOD_DSP_DESCRIPTION;\n\n\n/*\n[STRUCTURE] \n[\n    [DESCRIPTION]\n    Struct containing DFT functions to enable a plugin to perform optimized time-frequency domain conversion.\n\n    [REMARKS]\n    Members marked with [r] mean read only for the developer, read/write for the FMOD system.\n\n    Members marked with [w] mean read/write for the developer, read only for the FMOD system.\n\n    [SEE_ALSO]\n    FMOD_DSP_STATE_FUNCTIONS\n]\n*/\ntypedef struct FMOD_DSP_STATE_DFT_FUNCTIONS\n{\n    FMOD_DSP_DFT_FFTREAL_FUNC  fftreal;        /* [r] Function for performing an FFT on a real signal. */\n    FMOD_DSP_DFT_IFFTREAL_FUNC inversefftreal; /* [r] Function for performing an inverse FFT to get a real signal. */\n} FMOD_DSP_STATE_DFT_FUNCTIONS;\n\n\n/*\n[STRUCTURE] \n[\n    [DESCRIPTION]\n    Struct containing panning helper functions for spatialization plugins.\n\n    [REMARKS]\n    These are experimental, please contact support@fmod.org for more information.\n\n    Members marked with [r] mean read only for the developer, read/write for the FMOD system.\n\n    Members marked with [w] mean read/write for the developer, read only for the FMOD system.\n\n    [SEE_ALSO]\n    FMOD_DSP_STATE_FUNCTIONS\n    FMOD_DSP_PAN_SURROUND_FLAGS\n]\n*/\ntypedef struct FMOD_DSP_STATE_PAN_FUNCTIONS\n{\n    FMOD_DSP_PAN_SUMMONOMATRIX_FUNC             summonomatrix;             /* [r] TBD. */\n    FMOD_DSP_PAN_SUMSTEREOMATRIX_FUNC           sumstereomatrix;           /* [r] TBD. */\n    FMOD_DSP_PAN_SUMSURROUNDMATRIX_FUNC         sumsurroundmatrix;         /* [r] TBD. */\n    FMOD_DSP_PAN_SUMMONOTOSURROUNDMATRIX_FUNC   summonotosurroundmatrix;   /* [r] TBD. */\n    FMOD_DSP_PAN_SUMSTEREOTOSURROUNDMATRIX_FUNC sumstereotosurroundmatrix; /* [r] TBD. */\n    FMOD_DSP_PAN_GETROLLOFFGAIN_FUNC            getrolloffgain;            /* [r] TBD. */\n} FMOD_DSP_STATE_PAN_FUNCTIONS;\n\n\n/*\n[STRUCTURE] \n[\n    [DESCRIPTION]\n    Struct containing functions to give plugin developers the ability to query system state, access system level functionality and helpers.\n\n    [REMARKS]\n    Members marked with [r] mean read only for the developer, read/write for the FMOD system.\n\n    Members marked with [w] mean read/write for the developer, read only for the FMOD system.\n\n    [SEE_ALSO]\n    FMOD_DSP_STATE\n    FMOD_DSP_STATE_DFT_FUNCTIONS\n    FMOD_DSP_STATE_PAN_FUNCTIONS\n]\n*/\ntypedef struct FMOD_DSP_STATE_FUNCTIONS\n{\n    FMOD_DSP_ALLOC_FUNC                 alloc;                  /* [r] Function to allocate memory using the FMOD memory system. */\n    FMOD_DSP_REALLOC_FUNC               realloc;                /* [r] Function to reallocate memory using the FMOD memory system. */\n    FMOD_DSP_FREE_FUNC                  free;                   /* [r] Function to free memory allocated with FMOD_DSP_ALLOC_FUNC. */\n    FMOD_DSP_GETSAMPLERATE_FUNC         getsamplerate;          /* [r] Function to query the system sample rate. */\n    FMOD_DSP_GETBLOCKSIZE_FUNC          getblocksize;           /* [r] Function to query the system block size, DSPs will be requested to process blocks of varying length up to this size. */\n    FMOD_DSP_STATE_DFT_FUNCTIONS       *dft;                    /* [r] Struct containing DFT functions to enable a plugin to perform optimized time-frequency domain conversion. */\n    FMOD_DSP_STATE_PAN_FUNCTIONS       *pan;                    /* [r] Struct containing panning helper functions for spatialization plugins. */\n    FMOD_DSP_GETSPEAKERMODE_FUNC        getspeakermode;         /* [r] Function to query the system speaker modes.  One is the mixer's default speaker mode, the other is the output mode the system is downmixing or upmixing to.*/\n    FMOD_DSP_GETCLOCK_FUNC              getclock;               /* [r] Function to get the clock of the current DSP, as well as the subset of the input buffer that contains the signal. */\n    FMOD_DSP_GETLISTENERATTRIBUTES_FUNC getlistenerattributes;  /* [r] Callback for getting the absolute listener attributes set via the API (returned as left-handed coordinates). */\n    FMOD_DSP_LOG_FUNC                   log;                    /* [r] Function to write to the FMOD logging system. */\n    FMOD_DSP_GETUSERDATA_FUNC           getuserdata;            /* [r] Function to get the user data attached to this DSP. See FMOD_DSP_DESCRIPTION::userdata. */\n} FMOD_DSP_STATE_FUNCTIONS;\n\n\n/*\n[STRUCTURE] \n[\n    [DESCRIPTION]\n    DSP plugin structure that is passed into each callback.\n\n    [REMARKS]\n    Members marked with [r] mean the variable is modified by FMOD and is for reading purposes only.  Do not change this value.<br>\n    Members marked with [w] mean the variable can be written to.  The user can set the value.<br>\n    <br>\n    'systemobject' is an integer that relates to the System object that created the DSP or registered the DSP plugin.  If only 1 System object is created then it should be 0.  A second object would be 1 and so on.\n    FMOD_DSP_STATE_FUNCTIONS::getsamplerate/getblocksize/getspeakermode could return different results so it could be relevant to plugin developers to monitor which object is being used.\n\n    [SEE_ALSO]\n    FMOD_DSP_DESCRIPTION\n    FMOD_DSP_STATE_FUNCTIONS\n]\n*/\nstruct FMOD_DSP_STATE\n{\n    void                     *instance;            /* [r] Internal instance pointer, should not be used or written to. */\n    void                     *plugindata;          /* [w] Plugin writer created data the output author wants to attach to this object. */\n    FMOD_CHANNELMASK          channelmask;         /* [r] Specifies which speakers the DSP effect is active on */\n    FMOD_SPEAKERMODE          source_speakermode;  /* [r] Specifies which speaker mode the signal originated for information purposes, ie in case panning needs to be done differently. */\n    float                    *sidechaindata;       /* [r] The mixed result of all incoming sidechains is stored at this pointer address. */\n    int                       sidechainchannels;   /* [r] The number of channels of pcm data stored within the sidechain buffer. */\n    FMOD_DSP_STATE_FUNCTIONS *functions;           /* [r] Struct containing functions to give plugin developers the ability to query system state, access system level functionality and helpers. */\n    int                       systemobject;        /* [r] FMOD::System object index, relating to the System object that created this DSP. */\n};\n\n\n/*\n    Macro helpers for accessing FMOD_DSP_STATE_FUNCTIONS\n*/\n#define FMOD_DSP_ALLOC(_state, _size) \\\n    (_state)->functions->alloc(_size, FMOD_MEMORY_NORMAL, __FILE__)\n#define FMOD_DSP_REALLOC(_state, _ptr, _size) \\\n    (_state)->functions->realloc(_ptr, _size, FMOD_MEMORY_NORMAL, __FILE__)\n#define FMOD_DSP_FREE(_state, _ptr) \\\n    (_state)->functions->free(_ptr, FMOD_MEMORY_NORMAL, __FILE__)\n#define FMOD_DSP_LOG(_state, _level, _location, _format, ...) \\\n    (_state)->functions->log(_level, __FILE__, __LINE__, _location, _format, __VA_ARGS__)\n#define FMOD_DSP_GETSAMPLERATE(_state, _rate) \\\n    (_state)->functions->getsamplerate(_state, _rate)\n#define FMOD_DSP_GETBLOCKSIZE(_state, _blocksize) \\\n    (_state)->functions->getblocksize(_state, _blocksize)\n#define FMOD_DSP_GETSPEAKERMODE(_state, _speakermodemix, _speakermodeout) \\\n    (_state)->functions->getspeakermode(_state, _speakermodemix, _speakermodeout)\n#define FMOD_DSP_GETCLOCK(_state, _clock, _offset, _length) \\\n    (_state)->functions->getclock(_state, _clock, _offset, _length)\n#define FMOD_DSP_GETLISTENERATTRIBUTES(_state, _numlisteners, _attributes) \\\n    (_state)->functions->getlistenerattributes(_state, _numlisteners, _attributes)\n#define FMOD_DSP_GETUSERDATA(_state, _userdata) \\\n    (_state)->functions->getuserdata(_state, _userdata)\n#define FMOD_DSP_DFT_FFTREAL(_state, _size, _signal, _dft, _window, _signalhop) \\\n    (_state)->functions->dft->fftreal(_state, _size, _signal, _dft, _window, _signalhop)\n#define FMOD_DSP_DFT_IFFTREAL(_state, _size, _dft, _signal, _window, _signalhop) \\\n    (_state)->functions->dft->inversefftreal(_state, _size, _dft, _signal, _window, _signalhop)\n#define FMOD_DSP_PAN_SUMMONOMATRIX(_state, _sourcespeakermode, _lowfrequencygain, _overallgain, _matrix) \\\n    (_state)->functions->pan->summonomatrix(_state, _sourcespeakermode, _lowfrequencygain, _overallgain, _matrix)\n#define FMOD_DSP_PAN_SUMSTEREOMATRIX(_state, _sourcespeakermode, _pan, _lowfrequencygain, _overallgain, _matrixhop, _matrix) \\\n    (_state)->functions->pan->sumstereomatrix(_state, _sourcespeakermode, _pan, _lowfrequencygain, _overallgain, _matrixhop, _matrix)\n#define FMOD_DSP_PAN_SUMSURROUNDMATRIX(_state, _sourcespeakermode, _targetspeakermode, _direction, _extent, _rotation, _lowfrequencygain, _overallgain, _matrixhop, _matrix, _flags) \\\n    (_state)->functions->pan->sumsurroundmatrix(_state, _sourcespeakermode, _targetspeakermode, _direction, _extent, _rotation, _lowfrequencygain, _overallgain, _matrixhop, _matrix, _flags)\n#define FMOD_DSP_PAN_SUMMONOTOSURROUNDMATRIX(_state, _targetspeakermode, _direction, _extent, _lowfrequencygain, _overallgain, _matrixhop, _matrix) \\\n    (_state)->functions->pan->summonotosurroundmatrix(_state, _targetspeakermode, _direction, _extent, _lowfrequencygain, _overallgain, _matrixhop, _matrix)\n#define FMOD_DSP_PAN_SUMSTEREOTOSURROUNDMATRIX(_state, _targetspeakermode, _direction, _extent, _rotation, _lowfrequencygain, _overallgain, matrixhop, _matrix) \\\n    (_state)->functions->pan->sumstereotosurroundmatrix(_state, _targetspeakermode, _direction, _extent, _rotation, _lowfrequencygain, _overallgain, matrixhop, _matrix)\n#define FMOD_DSP_PAN_GETROLLOFFGAIN(_state, _rolloff, _distance, _mindistance, _maxdistance, _gain) \\\n    (_state)->functions->pan->getrolloffgain(_state, _rolloff, _distance, _mindistance, _maxdistance, _gain)\n\n\n/*\n[STRUCTURE] \n[\n    [DESCRIPTION]\n    DSP metering info used for retrieving metering info with DSP::getMeteringInfo\n\n    [REMARKS]\n    Members marked with [r] mean the variable is modified by FMOD and is for reading purposes only.  Do not change this value.<br>\n    Members marked with [w] mean the variable can be written to.  The user can set the value.<br>\n\n    [SEE_ALSO]\n    FMOD_SPEAKER\n    DSP::getMeteringInfo\n]\n*/\ntypedef struct FMOD_DSP_METERING_INFO\n{\n    int   numsamples;       /* [r] The number of samples considered for this metering info. */\n    float peaklevel[32];    /* [r] The peak level per channel. */\n    float rmslevel[32];     /* [r] The rms level per channel. */\n    short numchannels;      /* [r] Number of channels. */\n} FMOD_DSP_METERING_INFO;\n\n#endif\n\n"
  },
  {
    "path": "Plugins/FMODStudio/Source/FMODStudio/Public/FMOD/fmod_dsp_effects.h",
    "content": "/* ========================================================================================== */\n/* FMOD Studio - Built-in effects header file.                                                */\n/* Copyright (c), Firelight Technologies Pty, Ltd. 2004-2020.                                 */\n/*                                                                                            */\n/* In this header you can find parameter structures for FMOD system registered DSP effects    */\n/* and generators.                                                                            */\n/*                                                                                            */\n/* ========================================================================================== */\n\n#ifndef _FMOD_DSP_EFFECTS_H\n#define _FMOD_DSP_EFFECTS_H\n\n/*\n[ENUM]\n[\n    [DESCRIPTION]\n    These definitions can be used for creating FMOD defined special effects or DSP units.\n\n    [REMARKS]\n    To get them to be active, first create the unit, then add it somewhere into the DSP network, \n    either at the front of the network near the soundcard unit to affect the global output\n    (by using System::getDSPHead), or on a single channel (using Channel::getDSPHead).\n\n    [SEE_ALSO]\n    System::createDSPByType\n]\n*/\ntypedef enum\n{\n    FMOD_DSP_TYPE_UNKNOWN,            /* This unit was created via a non FMOD plugin so has an unknown purpose. */\n    FMOD_DSP_TYPE_MIXER,              /* This unit does nothing but take inputs and mix them together then feed the result to the soundcard unit. */\n    FMOD_DSP_TYPE_OSCILLATOR,         /* This unit generates sine/square/saw/triangle or noise tones. */\n    FMOD_DSP_TYPE_LOWPASS,            /* This unit filters sound using a high quality, resonant lowpass filter algorithm but consumes more CPU time. Deprecated and will be removed in a future release (see FMOD_DSP_LOWPASS remarks for alternatives). */\n    FMOD_DSP_TYPE_ITLOWPASS,          /* This unit filters sound using a resonant lowpass filter algorithm that is used in Impulse Tracker, but with limited cutoff range (0 to 8060hz). */\n    FMOD_DSP_TYPE_HIGHPASS,           /* This unit filters sound using a resonant highpass filter algorithm. Deprecated and will be removed in a future release (see FMOD_DSP_HIGHPASS remarks for alternatives). */\n    FMOD_DSP_TYPE_ECHO,               /* This unit produces an echo on the sound and fades out at the desired rate. */\n    FMOD_DSP_TYPE_FADER,              /* This unit pans and scales the volume of a unit. */\n    FMOD_DSP_TYPE_FLANGE,             /* This unit produces a flange effect on the sound. */\n    FMOD_DSP_TYPE_DISTORTION,         /* This unit distorts the sound. */\n    FMOD_DSP_TYPE_NORMALIZE,          /* This unit normalizes or amplifies the sound to a certain level. */\n    FMOD_DSP_TYPE_LIMITER,            /* This unit limits the sound to a certain level. */\n    FMOD_DSP_TYPE_PARAMEQ,            /* This unit attenuates or amplifies a selected frequency range. Deprecated and will be removed in a future release (see FMOD_DSP_PARAMEQ remarks for alternatives). */\n    FMOD_DSP_TYPE_PITCHSHIFT,         /* This unit bends the pitch of a sound without changing the speed of playback. */\n    FMOD_DSP_TYPE_CHORUS,             /* This unit produces a chorus effect on the sound. */\n    FMOD_DSP_TYPE_VSTPLUGIN,          /* This unit allows the use of Steinberg VST plugins */\n    FMOD_DSP_TYPE_WINAMPPLUGIN,       /* This unit allows the use of Nullsoft Winamp plugins */\n    FMOD_DSP_TYPE_ITECHO,             /* This unit produces an echo on the sound and fades out at the desired rate as is used in Impulse Tracker. */\n    FMOD_DSP_TYPE_COMPRESSOR,         /* This unit implements dynamic compression (linked/unlinked multichannel, wideband) */\n    FMOD_DSP_TYPE_SFXREVERB,          /* This unit implements SFX reverb */\n    FMOD_DSP_TYPE_LOWPASS_SIMPLE,     /* This unit filters sound using a simple lowpass with no resonance, but has flexible cutoff and is fast. Deprecated and will be removed in a future release (see FMOD_DSP_LOWPASS_SIMPLE remarks for alternatives). */\n    FMOD_DSP_TYPE_DELAY,              /* This unit produces different delays on individual channels of the sound. */\n    FMOD_DSP_TYPE_TREMOLO,            /* This unit produces a tremolo / chopper effect on the sound. */\n    FMOD_DSP_TYPE_LADSPAPLUGIN,       /* Unsupported / Deprecated. */\n    FMOD_DSP_TYPE_SEND,               /* This unit sends a copy of the signal to a return DSP anywhere in the DSP tree. */\n    FMOD_DSP_TYPE_RETURN,             /* This unit receives signals from a number of send DSPs. */\n    FMOD_DSP_TYPE_HIGHPASS_SIMPLE,    /* This unit filters sound using a simple highpass with no resonance, but has flexible cutoff and is fast. Deprecated and will be removed in a future release (see FMOD_DSP_HIGHPASS_SIMPLE remarks for alternatives). */\n    FMOD_DSP_TYPE_PAN,                /* This unit pans the signal, possibly upmixing or downmixing as well. */\n    FMOD_DSP_TYPE_THREE_EQ,           /* This unit is a three-band equalizer. */\n    FMOD_DSP_TYPE_FFT,                /* This unit simply analyzes the signal and provides spectrum information back through getParameter. */\n    FMOD_DSP_TYPE_LOUDNESS_METER,     /* This unit analyzes the loudness and true peak of the signal. */\n    FMOD_DSP_TYPE_ENVELOPEFOLLOWER,   /* This unit tracks the envelope of the input/sidechain signal. Deprecated and will be removed in a future release. */\n    FMOD_DSP_TYPE_CONVOLUTIONREVERB,  /* This unit implements convolution reverb. */\n    FMOD_DSP_TYPE_CHANNELMIX,         /* This unit provides per signal channel gain, and output channel mapping to allow 1 multichannel signal made up of many groups of signals to map to a single output signal. */\n    FMOD_DSP_TYPE_TRANSCEIVER,        /* This unit 'sends' and 'receives' from a selection of up to 32 different slots.  It is like a send/return but it uses global slots rather than returns as the destination.  It also has other features.  Multiple transceivers can receive from a single channel, or multiple transceivers can send to a single channel, or a combination of both. */\n    FMOD_DSP_TYPE_OBJECTPAN,          /* This unit sends the signal to a 3d object encoder like Dolby Atmos.   Supports a subset of the FMOD_DSP_TYPE_PAN parameters. */\n    FMOD_DSP_TYPE_MULTIBAND_EQ,       /* This unit is a flexible five band parametric equalizer. */\n\n    FMOD_DSP_TYPE_MAX,                /* Maximum number of pre-defined DSP types. */\n    FMOD_DSP_TYPE_FORCEINT = 65536    /* Makes sure this enum is signed 32bit. */\n} FMOD_DSP_TYPE;\n\n/*\n    ===================================================================================================\n\n    FMOD built in effect parameters.  \n    Use DSP::setParameter with these enums for the 'index' parameter.\n\n    ===================================================================================================\n*/\n\n/*\n[ENUM]\n[\n    [DESCRIPTION]\n    Parameter types for the FMOD_DSP_TYPE_OSCILLATOR filter.\n\n    [REMARKS]\n\n    [SEE_ALSO]\n    DSP::setParameterFloat\n    DSP::setParameterInt\n    DSP::getParameterFloat\n    DSP::getParameterInt\n    FMOD_DSP_TYPE\n]\n*/\ntypedef enum\n{\n    FMOD_DSP_OSCILLATOR_TYPE,   /* (Type:int) - Waveform type.  0 = sine.  1 = square. 2 = sawup. 3 = sawdown. 4 = triangle. 5 = noise.  */\n    FMOD_DSP_OSCILLATOR_RATE    /* (Type:float) - Frequency of the sinewave in hz.  1.0 to 22000.0.  Default = 220.0. */\n} FMOD_DSP_OSCILLATOR;\n\n\n/*\n[ENUM]\n[\n    [DESCRIPTION]\n    Parameter types for the FMOD_DSP_TYPE_LOWPASS filter.\n\n    [REMARKS]\n    Deprecated and will be removed in a future release, to emulate with FMOD_DSP_TYPE_MULTIBAND_EQ:\n\n        // Configure a single band (band A) as a lowpass (all other bands default to off).\n        // 24dB rolloff to approximate the old effect curve.\n        // Cutoff frequency can be used the same as with the old effect.\n        // Resonance can be applied by setting the 'Q' value of the new effect.\n        FMOD_DSP_SetParameterInt(multiband, FMOD_DSP_MULTIBAND_EQ_A_FILTER, FMOD_DSP_MULTIBAND_EQ_FILTER_LOWPASS_24DB);\n        FMOD_DSP_SetParameterFloat(multiband, FMOD_DSP_MULTIBAND_EQ_A_FREQUENCY, frequency);\n        FMOD_DSP_SetParameterFloat(multiband, FMOD_DSP_MULTIBAND_EQ_A_Q, resonance);\n\n    [SEE_ALSO]\n    DSP::setParameterFloat\n    DSP::getParameterFloat\n    FMOD_DSP_TYPE\n]\n*/\ntypedef enum\n{\n    FMOD_DSP_LOWPASS_CUTOFF,    /* (Type:float) - Lowpass cutoff frequency in hz.   10.0 to 22000.0.  Default = 5000.0. */\n    FMOD_DSP_LOWPASS_RESONANCE  /* (Type:float) - Lowpass resonance Q value. 1.0 to 10.0.  Default = 1.0. */\n} FMOD_DSP_LOWPASS;\n\n\n/*\n[ENUM]\n[\n    [DESCRIPTION]\n    Parameter types for the FMOD_DSP_TYPE_ITLOWPASS filter.<br>\n    This is different to the default FMOD_DSP_TYPE_ITLOWPASS filter in that it uses a different quality algorithm and is \n    the filter used to produce the correct sounding playback in .IT files.<br> \n    FMOD Studio's .IT playback uses this filter.<br>\n\n    [REMARKS]\n    Note! This filter actually has a limited cutoff frequency below the specified maximum, due to its limited design, \n    so for a more  open range filter use FMOD_DSP_LOWPASS or if you don't mind not having resonance, \n    FMOD_DSP_LOWPASS_SIMPLE.<br>\n    The effective maximum cutoff is about 8060hz.\n\n    [SEE_ALSO]\n    DSP::setParameterFloat\n    DSP::getParameterFloat\n    FMOD_DSP_TYPE\n]\n*/\ntypedef enum\n{\n    FMOD_DSP_ITLOWPASS_CUTOFF,    /* (Type:float) - Lowpass cutoff frequency in hz.  1.0 to 22000.0.  Default = 5000.0/ */\n    FMOD_DSP_ITLOWPASS_RESONANCE  /* (Type:float) - Lowpass resonance Q value.  0.0 to 127.0.  Default = 1.0. */\n} FMOD_DSP_ITLOWPASS;\n\n\n/*\n[ENUM]\n[\n    [DESCRIPTION]\n    Parameter types for the FMOD_DSP_TYPE_HIGHPASS filter.\n\n    [REMARKS]\n    Deprecated and will be removed in a future release, to emulate with FMOD_DSP_TYPE_MULTIBAND_EQ:\n\n        // Configure a single band (band A) as a highpass (all other bands default to off).\n        // 12dB rolloff to approximate the old effect curve.\n        // Cutoff frequency can be used the same as with the old effect.\n        // Resonance can be applied by setting the 'Q' value of the new effect.\n        FMOD_DSP_SetParameterInt(multiband, FMOD_DSP_MULTIBAND_EQ_A_FILTER, FMOD_DSP_MULTIBAND_EQ_FILTER_HIGHPASS_12DB);\n        FMOD_DSP_SetParameterFloat(multiband, FMOD_DSP_MULTIBAND_EQ_A_FREQUENCY, frequency);\n        FMOD_DSP_SetParameterFloat(multiband, FMOD_DSP_MULTIBAND_EQ_A_Q, resonance);\n\n    [SEE_ALSO]\n    DSP::setParameterFloat\n    DSP::getParameterFloat\n    FMOD_DSP_TYPE\n]\n*/\ntypedef enum\n{\n    FMOD_DSP_HIGHPASS_CUTOFF,    /* (Type:float) - Highpass cutoff frequency in hz.  1.0 to output 22000.0.  Default = 5000.0. */\n    FMOD_DSP_HIGHPASS_RESONANCE  /* (Type:float) - Highpass resonance Q value.  1.0 to 10.0.  Default = 1.0. */\n} FMOD_DSP_HIGHPASS;\n\n\n/*\n[ENUM]\n[\n    [DESCRIPTION]\n    Parameter types for the FMOD_DSP_TYPE_ECHO filter.\n\n    [REMARKS]\n    Note.  Every time the delay is changed, the plugin re-allocates the echo buffer.  This means the echo will dissapear at that time while it refills its new buffer.<br>\n    Larger echo delays result in larger amounts of memory allocated.<br>\n\n    [SEE_ALSO]\n    DSP::setParameterFloat\n    DSP::getParameterFloat\n    FMOD_DSP_TYPE\n]\n*/\ntypedef enum\n{\n    FMOD_DSP_ECHO_DELAY,       /* (Type:float) - Echo delay in ms.  10  to 5000.  Default = 500. */\n    FMOD_DSP_ECHO_FEEDBACK,    /* (Type:float) - Echo decay per delay.  0 to 100.  100.0 = No decay, 0.0 = total decay (ie simple 1 line delay).  Default = 50.0. */\n    FMOD_DSP_ECHO_DRYLEVEL,    /* (Type:float) - Original sound volume in dB.  -80.0 to 10.0.  Default = 0. */\n    FMOD_DSP_ECHO_WETLEVEL     /* (Type:float) - Volume of echo signal to pass to output in dB.  -80.0 to 10.0.  Default = 0. */\n} FMOD_DSP_ECHO;\n\n\n/*\n[ENUM]\n[\n    [DESCRIPTION]\n    Parameter types for the FMOD_DSP_TYPE_FADER filter.\n\n    [REMARKS]\n\n    [SEE_ALSO]\n    DSP::setParameterFloat\n    DSP::getParameterFloat\n    FMOD_DSP_TYPE\n]\n*/\ntypedef enum FMOD_DSP_FADER\n{\n    FMOD_DSP_FADER_GAIN,            /* (Type:float) - Signal gain in dB. -80.0 to 10.0. Default = 0.0. */\n    FMOD_DSP_FADER_OVERALL_GAIN,    /* (Type:data)  - Overall gain. For information only, not set by user. Data of type FMOD_DSP_PARAMETER_DATA_TYPE_OVERALLGAIN to provide to FMOD, to allow FMOD to know the DSP is scaling the signal for virtualization purposes. */\n} FMOD_DSP_FADER;\n\n\n/*\n[ENUM]\n[\n    [DESCRIPTION]\n    Parameter types for the FMOD_DSP_TYPE_FLANGE filter.\n\n    [REMARKS]\n    Flange is an effect where the signal is played twice at the same time, and one copy slides back and forth creating a whooshing or flanging effect.<br>\n    As there are 2 copies of the same signal, by default each signal is given 50% mix, so that the total is not louder than the original unaffected signal.<br>\n    <br>\n    Flange depth is a percentage of a 10ms shift from the original signal.  Anything above 10ms is not considered flange because to the ear it begins to 'echo' so 10ms is the highest value possible.<br>\n\n    [SEE_ALSO]\n    DSP::setParameterFloat\n    DSP::getParameterFloat\n    FMOD_DSP_TYPE\n]\n*/\ntypedef enum\n{\n    FMOD_DSP_FLANGE_MIX,         /* (Type:float) - Percentage of wet signal in mix.  0 to 100. Default = 50. */\n    FMOD_DSP_FLANGE_DEPTH,       /* (Type:float) - Flange depth (percentage of 40ms delay).  0.01 to 1.0.  Default = 1.0. */\n    FMOD_DSP_FLANGE_RATE         /* (Type:float) - Flange speed in hz.  0.0 to 20.0.  Default = 0.1. */\n} FMOD_DSP_FLANGE;\n\n\n/*\n[ENUM]\n[\n    [DESCRIPTION]\n    Parameter types for the FMOD_DSP_TYPE_DISTORTION filter.\n\n    [REMARKS]\n\n    [SEE_ALSO]\n    DSP::setParameterFloat\n    DSP::getParameterFloat\n    FMOD_DSP_TYPE\n]\n*/\ntypedef enum\n{\n    FMOD_DSP_DISTORTION_LEVEL    /* (Type:float) - Distortion value.  0.0 to 1.0.  Default = 0.5. */\n} FMOD_DSP_DISTORTION;\n\n\n/*\n[ENUM]\n[\n    [DESCRIPTION]\n    Parameter types for the FMOD_DSP_TYPE_NORMALIZE filter.\n\n    [REMARKS]\n    Normalize amplifies the sound based on the maximum peaks within the signal.<br>\n    For example if the maximum peaks in the signal were 50% of the bandwidth, it would scale the whole sound by 2.<br>\n    The lower threshold value makes the normalizer ignores peaks below a certain point, to avoid over-amplification if a loud signal suddenly came in, and also to avoid amplifying to maximum things like background hiss.<br>\n    <br>\n    Because FMOD is a realtime audio processor, it doesn't have the luxury of knowing the peak for the whole sound (ie it can't see into the future), so it has to process data as it comes in.<br>\n    To avoid very sudden changes in volume level based on small samples of new data, fmod fades towards the desired amplification which makes for smooth gain control.  The fadetime parameter can control this.<br>\n\n    [SEE_ALSO]\n    DSP::setParameterFloat\n    DSP::getParameterFloat\n    FMOD_DSP_TYPE\n]\n*/\ntypedef enum\n{\n    FMOD_DSP_NORMALIZE_FADETIME,    /* (Type:float) - Time to ramp the silence to full in ms.  0.0 to 20000.0. Default = 5000.0. */\n    FMOD_DSP_NORMALIZE_THRESHHOLD,  /* (Type:float) - Lower volume range threshold to ignore.  0.0 to 1.0.  Default = 0.1.  Raise higher to stop amplification of very quiet signals. */\n    FMOD_DSP_NORMALIZE_MAXAMP       /* (Type:float) - Maximum amplification allowed.  1.0 to 100000.0.  Default = 20.0.  1.0 = no amplifaction, higher values allow more boost. */\n} FMOD_DSP_NORMALIZE;\n\n\n/*\n[ENUM]\n[\n    [DESCRIPTION]\n    Parameter types for the FMOD_DSP_TYPE_LIMITER filter.\n\n    [REMARKS]\n\n    [SEE_ALSO]\n    DSP::setParameterFloat\n    DSP::getParameterFloat\n    FMOD_DSP_TYPE\n]\n*/\ntypedef enum\n{\n    FMOD_DSP_LIMITER_RELEASETIME,   /* (Type:float) - Time to ramp the silence to full in ms.  1.0 to 1000.0. Default = 10.0. */\n    FMOD_DSP_LIMITER_CEILING,       /* (Type:float) - Maximum level of the output signal in dB.  -12.0 to 0.0.  Default = 0.0. */\n    FMOD_DSP_LIMITER_MAXIMIZERGAIN, /* (Type:float) - Maximum amplification allowed in dB.  0.0 to 12.0.  Default = 0.0. 0.0 = no amplifaction, higher values allow more boost. */\n    FMOD_DSP_LIMITER_MODE,          /* (Type:float) - Channel processing mode. 0 or 1. Default = 0. 0 = Independent (limiter per channel), 1 = Linked. */\n} FMOD_DSP_LIMITER;\n\n\n/*\n[ENUM]\n[\n    [DESCRIPTION]\n    Parameter types for the FMOD_DSP_TYPE_PARAMEQ filter.\n\n    [REMARKS]\n    Deprecated and will be removed in a future release, to emulate with FMOD_DSP_TYPE_MULTIBAND_EQ:\n\n        // Configure a single band (band A) as a peaking EQ (all other bands default to off).\n        // Center frequency can be used as with the old effect.\n        // Bandwidth can be applied by setting the 'Q' value of the new effect.\n        // Gain at the center frequency can be used the same as with the old effect.\n        FMOD_DSP_SetParameterInt(multiband, FMOD_DSP_MULTIBAND_EQ_A_FILTER, FMOD_DSP_MULTIBAND_EQ_FILTER_PEAKING);\n        FMOD_DSP_SetParameterFloat(multiband, FMOD_DSP_MULTIBAND_EQ_A_FREQUENCY, center);\n        FMOD_DSP_SetParameterFloat(multiband, FMOD_DSP_MULTIBAND_EQ_A_Q, bandwidth);\n        FMOD_DSP_SetParameterFloat(multiband, FMOD_DSP_MULTIBAND_EQ_A_GAIN, gain);\n\n    Parametric EQ is a single band peaking EQ filter that attenuates or amplifies a selected frequency and its neighbouring frequencies.\n\n    When a frequency has its gain set to 1.0, the sound will be unaffected and represents the original signal exactly.\n\n    [SEE_ALSO]\n    DSP::setParameterFloat\n    DSP::getParameterFloat\n    FMOD_DSP_TYPE\n]\n*/\ntypedef enum\n{\n    FMOD_DSP_PARAMEQ_CENTER,     /* (Type:float) - Frequency center.  20.0 to 22000.0.  Default = 8000.0. */\n    FMOD_DSP_PARAMEQ_BANDWIDTH,  /* (Type:float) - Octave range around the center frequency to filter.  0.2 to 5.0.  Default = 1.0. */\n    FMOD_DSP_PARAMEQ_GAIN        /* (Type:float) - Frequency Gain in dB.  -30 to 30.  Default = 0.  */\n} FMOD_DSP_PARAMEQ;\n\n\n/*\n[ENUM]\n[\n    [DESCRIPTION]\n    Parameter types for the FMOD_DSP_TYPE_MULTIBAND_EQ filter.\n\n    [REMARKS]\n    Flexible five band parametric equalizer.\n\n    [SEE_ALSO]\n    DSP::setParameterInt\n    DSP::getParameterInt\n    DSP::setParameterFloat\n    DSP::getParameterFloat\n    FMOD_DSP_TYPE\n]\n*/\ntypedef enum FMOD_DSP_MULTIBAND_EQ\n{\n    FMOD_DSP_MULTIBAND_EQ_A_FILTER,    /* (Type:int)   - Band A: FMOD_DSP_MULTIBAND_EQ_FILTER_TYPE used to interpret the behavior of the remaining parameters. Default = FMOD_DSP_MULTIBAND_EQ_FILTER_LOWPASS_12DB */\n    FMOD_DSP_MULTIBAND_EQ_A_FREQUENCY, /* (Type:float) - Band A: Significant frequency in Hz, cutoff [low/high pass, low/high shelf], center [notch, peaking, band-pass], phase transition point [all-pass]. 20 to 22000. Default = 8000. */\n    FMOD_DSP_MULTIBAND_EQ_A_Q,         /* (Type:float) - Band A: Quality factor, resonance [low/high pass], bandwidth [notch, peaking, band-pass], phase transition sharpness [all-pass], unused [low/high shelf]. 0.1 to 10.0. Default = 0.707. */\n    FMOD_DSP_MULTIBAND_EQ_A_GAIN,      /* (Type:float) - Band A: Boost or attenuation in dB [peaking, high/low shelf only]. -30 to 30. Default = 0. */\n    FMOD_DSP_MULTIBAND_EQ_B_FILTER,    /* (Type:int)   - Band B: See Band A. Default = FMOD_DSP_MULTIBAND_EQ_FILTER_DISABLED */\n    FMOD_DSP_MULTIBAND_EQ_B_FREQUENCY, /* (Type:float) - Band B: See Band A */\n    FMOD_DSP_MULTIBAND_EQ_B_Q,         /* (Type:float) - Band B: See Band A */\n    FMOD_DSP_MULTIBAND_EQ_B_GAIN,      /* (Type:float) - Band B: See Band A */\n    FMOD_DSP_MULTIBAND_EQ_C_FILTER,    /* (Type:int)   - Band C: See Band A. Default = FMOD_DSP_MULTIBAND_EQ_FILTER_DISABLED */\n    FMOD_DSP_MULTIBAND_EQ_C_FREQUENCY, /* (Type:float) - Band C: See Band A. */\n    FMOD_DSP_MULTIBAND_EQ_C_Q,         /* (Type:float) - Band C: See Band A. */\n    FMOD_DSP_MULTIBAND_EQ_C_GAIN,      /* (Type:float) - Band C: See Band A. */\n    FMOD_DSP_MULTIBAND_EQ_D_FILTER,    /* (Type:int)   - Band D: See Band A. Default = FMOD_DSP_MULTIBAND_EQ_FILTER_DISABLED */\n    FMOD_DSP_MULTIBAND_EQ_D_FREQUENCY, /* (Type:float) - Band D: See Band A. */\n    FMOD_DSP_MULTIBAND_EQ_D_Q,         /* (Type:float) - Band D: See Band A. */\n    FMOD_DSP_MULTIBAND_EQ_D_GAIN,      /* (Type:float) - Band D: See Band A. */\n    FMOD_DSP_MULTIBAND_EQ_E_FILTER,    /* (Type:int)   - Band E: See Band A. Default = FMOD_DSP_MULTIBAND_EQ_FILTER_DISABLED */\n    FMOD_DSP_MULTIBAND_EQ_E_FREQUENCY, /* (Type:float) - Band E: See Band A. */\n    FMOD_DSP_MULTIBAND_EQ_E_Q,         /* (Type:float) - Band E: See Band A. */\n    FMOD_DSP_MULTIBAND_EQ_E_GAIN,      /* (Type:float) - Band E: See Band A. */\n} FMOD_DSP_MULTIBAND_EQ;\n\n\n/*\n[ENUM]\n[\n    [DESCRIPTION]\n    Filter types for FMOD_DSP_MULTIBAND_EQ.\n\n    [REMARKS]\n\n    [SEE_ALSO]\n    FMOD_DSP_MULTIBAND_EQ\n]\n*/\ntypedef enum FMOD_DSP_MULTIBAND_EQ_FILTER_TYPE\n{\n    FMOD_DSP_MULTIBAND_EQ_FILTER_DISABLED,       /* Disabled filter, no processing. */\n    FMOD_DSP_MULTIBAND_EQ_FILTER_LOWPASS_12DB,   /* Resonant low-pass filter, attenuates frequencies (12dB per octave) above a given point (with specificed resonance) while allowing the rest to pass. */\n    FMOD_DSP_MULTIBAND_EQ_FILTER_LOWPASS_24DB,   /* Resonant low-pass filter, attenuates frequencies (24dB per octave) above a given point (with specificed resonance) while allowing the rest to pass. */\n    FMOD_DSP_MULTIBAND_EQ_FILTER_LOWPASS_48DB,   /* Resonant low-pass filter, attenuates frequencies (48dB per octave) above a given point (with specificed resonance) while allowing the rest to pass. */\n    FMOD_DSP_MULTIBAND_EQ_FILTER_HIGHPASS_12DB,  /* Resonant low-pass filter, attenuates frequencies (12dB per octave) below a given point (with specificed resonance) while allowing the rest to pass. */\n    FMOD_DSP_MULTIBAND_EQ_FILTER_HIGHPASS_24DB,  /* Resonant low-pass filter, attenuates frequencies (24dB per octave) below a given point (with specificed resonance) while allowing the rest to pass. */\n    FMOD_DSP_MULTIBAND_EQ_FILTER_HIGHPASS_48DB,  /* Resonant low-pass filter, attenuates frequencies (48dB per octave) below a given point (with specificed resonance) while allowing the rest to pass. */\n    FMOD_DSP_MULTIBAND_EQ_FILTER_LOWSHELF,       /* Low-shelf filter, boosts or attenuates frequencies (with specified gain) below a given point while allowing the rest to pass. */\n    FMOD_DSP_MULTIBAND_EQ_FILTER_HIGHSHELF,      /* High-shelf filter, boosts or attenuates frequencies (with specified gain) above a given point while allowing the rest to pass. */\n    FMOD_DSP_MULTIBAND_EQ_FILTER_PEAKING,        /* Peaking filter, boosts or attenuates frequencies (with specified gain) at a given point (with specificed bandwidth) while allowing the rest to pass. */\n    FMOD_DSP_MULTIBAND_EQ_FILTER_BANDPASS,       /* Band-pass filter, allows frequencies at a given point (with specificed bandwidth) to pass while attenuating frequencies outside this range. */\n    FMOD_DSP_MULTIBAND_EQ_FILTER_NOTCH,          /* Notch or band-reject filter, attenuates frequencies at a given point (with specificed bandwidth) while allowing frequencies outside this range to pass. */\n    FMOD_DSP_MULTIBAND_EQ_FILTER_ALLPASS,        /* All-pass filter, allows all frequencies to pass, but changes the phase response at a given point (with specified sharpness). */\n} FMOD_DSP_MULTIBAND_EQ_FILTER_TYPE;\n\n\n/*\n[ENUM]\n[\n    [DESCRIPTION]\n    Parameter types for the FMOD_DSP_TYPE_PITCHSHIFT filter.\n\n    [REMARKS]\n    This pitch shifting unit can be used to change the pitch of a sound without speeding it up or slowing it down.<br>\n    It can also be used for time stretching or scaling, for example if the pitch was doubled, and the frequency of the sound was halved, the pitch of the sound would sound correct but it would be twice as slow.<br>\n    <br>\n    <b>Warning!</b> This filter is very computationally expensive!  Similar to a vocoder, it requires several overlapping FFT and IFFT's to produce smooth output, and can require around 440mhz for 1 stereo 48khz signal using the default settings.<br>\n    Reducing the signal to mono will half the cpu usage.<br>\n    Reducing this will lower audio quality, but what settings to use are largely dependant on the sound being played.  A noisy polyphonic signal will need higher fft size compared to a speaking voice for example.<br>\n    <br>\n    This pitch shifter is based on the pitch shifter code at http://www.dspdimension.com, written by Stephan M. Bernsee.<br>\n    The original code is COPYRIGHT 1999-2003 Stephan M. Bernsee <smb@dspdimension.com>.<br>\n    <br>\n    '<i>maxchannels</i>' dictates the amount of memory allocated.  By default, the maxchannels value is 0.  If FMOD is set to stereo, the pitch shift unit will allocate enough memory for 2 channels.  If it is 5.1, it will allocate enough memory for a 6 channel pitch shift, etc.<br>\n    If the pitch shift effect is only ever applied to the global mix (ie it was added with ChannelGroup::addDSP), then 0 is the value to set as it will be enough to handle all speaker modes.<br>\n    When the pitch shift is added to a channel (ie Channel::addDSP) then the channel count that comes in could be anything from 1 to 8 possibly.  It is only in this case where you might want to increase the channel count above the output's channel count.<br>\n    If a channel pitch shift is set to a lower number than the sound's channel count that is coming in, it will not pitch shift the sound.<br>\n    <br>\n    <b>NOTE!</b> Not supported on PlayStation 3.<br>\n\n    [SEE_ALSO]\n    DSP::setParameterFloat\n    DSP::getParameterFloat\n    ChannelGroup::addDSP\n    FMOD_DSP_TYPE\n]\n*/\ntypedef enum\n{\n    FMOD_DSP_PITCHSHIFT_PITCH,       /* (Type:float) - Pitch value.  0.5 to 2.0.  Default = 1.0. 0.5 = one octave down, 2.0 = one octave up.  1.0 does not change the pitch. */\n    FMOD_DSP_PITCHSHIFT_FFTSIZE,     /* (Type:float) - FFT window size.  256, 512, 1024, 2048, 4096.  Default = 1024.  Increase this to reduce 'smearing'.  This effect is a warbling sound similar to when an mp3 is encoded at very low bitrates. */\n    FMOD_DSP_PITCHSHIFT_OVERLAP,     /* (Type:float) - Removed.  Do not use.  FMOD now uses 4 overlaps and cannot be changed. */\n    FMOD_DSP_PITCHSHIFT_MAXCHANNELS  /* (Type:float) - Maximum channels supported.  0 to 16.  0 = same as fmod's default output polyphony, 1 = mono, 2 = stereo etc.  See remarks for more.  Default = 0.  It is suggested to leave at 0! */\n} FMOD_DSP_PITCHSHIFT;\n\n\n/*\n[ENUM]\n[\n    [DESCRIPTION]\n    Parameter types for the FMOD_DSP_TYPE_CHORUS filter.\n\n    [REMARKS]\n    Chorus is an effect where the sound is more 'spacious' due to 1 to 3 versions of the sound being played along side the original signal but with the pitch of each copy modulating on a sine wave.<br>\n\n    [SEE_ALSO]\n    DSP::setParameterFloat\n    DSP::getParameterFloat\n    FMOD_DSP_TYPE\n]\n*/\ntypedef enum\n{\n    FMOD_DSP_CHORUS_MIX,      /* (Type:float) - Volume of original signal to pass to output.  0.0 to 100.0. Default = 50.0. */\n    FMOD_DSP_CHORUS_RATE,     /* (Type:float) - Chorus modulation rate in Hz.  0.0 to 20.0.  Default = 0.8 Hz. */\n    FMOD_DSP_CHORUS_DEPTH,    /* (Type:float) - Chorus modulation depth.  0.0 to 100.0.  Default = 3.0. */\n} FMOD_DSP_CHORUS;\n\n\n/*\n[ENUM]\n[\n    [DESCRIPTION]\n    Parameter types for the FMOD_DSP_TYPE_ITECHO filter.<br>\n    This is effectively a software based echo filter that emulates the DirectX DMO echo effect.  Impulse tracker files can support this, and FMOD will produce the effect on ANY platform, not just those that support DirectX effects!<br>\n\n    [REMARKS]\n    Note.  Every time the delay is changed, the plugin re-allocates the echo buffer.  This means the echo will dissapear at that time while it refills its new buffer.<br>\n    Larger echo delays result in larger amounts of memory allocated.<br>\n    <br>\n    As this is a stereo filter made mainly for IT playback, it is targeted for stereo signals.<br>\n    With mono signals only the FMOD_DSP_ITECHO_LEFTDELAY is used.<br>\n    For multichannel signals (>2) there will be no echo on those channels.<br>\n\n    [SEE_ALSO]\n    DSP::setParameterFloat\n    DSP::getParameterFloat\n    FMOD_DSP_TYPE\n]\n*/\ntypedef enum\n{\n    FMOD_DSP_ITECHO_WETDRYMIX,      /* (Type:float) - Ratio of wet (processed) signal to dry (unprocessed) signal. Must be in the range from 0.0 through 100.0 (all wet).  Default = 50. */\n    FMOD_DSP_ITECHO_FEEDBACK,       /* (Type:float) - Percentage of output fed back into input, in the range from 0.0 through 100.0.  Default = 50. */\n    FMOD_DSP_ITECHO_LEFTDELAY,      /* (Type:float) - Delay for left channel, in milliseconds, in the range from 1.0 through 2000.0.  Default = 500 ms. */\n    FMOD_DSP_ITECHO_RIGHTDELAY,     /* (Type:float) - Delay for right channel, in milliseconds, in the range from 1.0 through 2000.0.  Default = 500 ms. */\n    FMOD_DSP_ITECHO_PANDELAY        /* (Type:float) - Value that specifies whether to swap left and right delays with each successive echo.  Ranges from 0.0 (equivalent to FALSE) to 1.0 (equivalent to TRUE), meaning no swap.  Default = 0.  CURRENTLY NOT SUPPORTED. */\n} FMOD_DSP_ITECHO;\n\n/*\n[ENUM]\n[\n    [DESCRIPTION]\n    Parameter types for the FMOD_DSP_TYPE_COMPRESSOR unit.\n    This is a multichannel software limiter that is uniform across the whole spectrum.\n\n    [REMARKS]\n    The limiter is not guaranteed to catch every peak above the threshold level,\n    because it cannot apply gain reduction instantaneously - the time delay is\n    determined by the attack time. However setting the attack time too short will\n    distort the sound, so it is a compromise. High level peaks can be avoided by\n    using a short attack time - but not too short, and setting the threshold a few\n    decibels below the critical level.\n    <br>\n\n    [SEE_ALSO]\n    DSP::setParameterFloat\n    DSP::getParameterFloat\n    DSP::setParameterBool\n    DSP::getParameterBool\n    FMOD_DSP_TYPE\n]\n*/\ntypedef enum\n{\n    FMOD_DSP_COMPRESSOR_THRESHOLD,    /* (Type:float) - Threshold level (dB) in the range from -80 through 0.  Default = 0. */ \n    FMOD_DSP_COMPRESSOR_RATIO,        /* (Type:float) - Compression Ratio (dB/dB) in the range from 1 to 50.  Default = 2.5. */ \n    FMOD_DSP_COMPRESSOR_ATTACK,       /* (Type:float) - Attack time (milliseconds), in the range from 0.1 through 1000. Default value is 20. */\n    FMOD_DSP_COMPRESSOR_RELEASE,      /* (Type:float) - Release time (milliseconds), in the range from 10 through 5000. Default value is 100 */\n    FMOD_DSP_COMPRESSOR_GAINMAKEUP,   /* (Type:float) - Make-up gain (dB) applied after limiting, in the range from 0 through 30.  Default = 0. */\n    FMOD_DSP_COMPRESSOR_USESIDECHAIN, /* (Type:data)  - Data of type FMOD_DSP_PARAMETER_SIDECHAIN. Whether to analyse the sidechain signal instead of the input signal. Default is { false } */\n    FMOD_DSP_COMPRESSOR_LINKED        /* (Type:bool)  - FALSE = Independent (compressor per channel), TRUE = Linked.  Default = TRUE. */\n} FMOD_DSP_COMPRESSOR;\n\n/*\n[ENUM]\n[\n    [DESCRIPTION]\n    Parameter types for the FMOD_DSP_TYPE_SFXREVERB unit.<br>\n    \n    [REMARKS]\n    This is a high quality I3DL2 based reverb.<br>\n    On top of the I3DL2 property set, \"Dry Level\" is also included to allow the dry mix to be changed.<br>\n    <br>\n    These properties can be set with presets in FMOD_REVERB_PRESETS.\n\n    [SEE_ALSO]\n    DSP::setParameterFloat\n    DSP::getParameterFloat\n    FMOD_DSP_TYPE\n    FMOD_REVERB_PRESETS\n]\n*/\ntypedef enum\n{\n    FMOD_DSP_SFXREVERB_DECAYTIME,           /* (Type:float) - Decay Time       : Reverberation decay time at low-frequencies in milliseconds.  Ranges from 100.0 to 20000.0. Default is 1500. */\n    FMOD_DSP_SFXREVERB_EARLYDELAY,          /* (Type:float) - Early Delay      : Delay time of first reflection in milliseconds.  Ranges from 0.0 to 300.0.  Default is 20. */\n    FMOD_DSP_SFXREVERB_LATEDELAY,           /* (Type:float) - Reverb Delay     : Late reverberation delay time relative to first reflection in milliseconds.  Ranges from 0.0 to 100.0.  Default is 40. */\n    FMOD_DSP_SFXREVERB_HFREFERENCE,         /* (Type:float) - HF Reference     : Reference frequency for high-frequency decay in Hz.  Ranges from 20.0 to 20000.0. Default is 5000. */\n    FMOD_DSP_SFXREVERB_HFDECAYRATIO,        /* (Type:float) - Decay HF Ratio   : High-frequency decay time relative to decay time in percent.  Ranges from 10.0 to 100.0. Default is 50. */\n    FMOD_DSP_SFXREVERB_DIFFUSION,           /* (Type:float) - Diffusion        : Reverberation diffusion (echo density) in percent.  Ranges from 0.0 to 100.0.  Default is 100. */\n    FMOD_DSP_SFXREVERB_DENSITY,             /* (Type:float) - Density          : Reverberation density (modal density) in percent.  Ranges from 0.0 to 100.0.  Default is 100. */\n    FMOD_DSP_SFXREVERB_LOWSHELFFREQUENCY,   /* (Type:float) - Low Shelf Frequency : Transition frequency of low-shelf filter in Hz.  Ranges from 20.0 to 1000.0. Default is 250. */\n    FMOD_DSP_SFXREVERB_LOWSHELFGAIN,        /* (Type:float) - Low Shelf Gain   : Gain of low-shelf filter in dB.  Ranges from -36.0 to 12.0.  Default is 0. */\n    FMOD_DSP_SFXREVERB_HIGHCUT,             /* (Type:float) - High Cut         : Cutoff frequency of low-pass filter in Hz.  Ranges from 20.0 to 20000.0. Default is 20000. */\n    FMOD_DSP_SFXREVERB_EARLYLATEMIX,        /* (Type:float) - Early/Late Mix   : Blend ratio of late reverb to early reflections in percent.  Ranges from 0.0 to 100.0.  Default is 50. */\n    FMOD_DSP_SFXREVERB_WETLEVEL,            /* (Type:float) - Wet Level        : Reverb signal level in dB.  Ranges from -80.0 to 20.0.  Default is -6. */\n    FMOD_DSP_SFXREVERB_DRYLEVEL             /* (Type:float) - Dry Level        : Dry signal level in dB.  Ranges from -80.0 to 20.0.  Default is 0. */\n} FMOD_DSP_SFXREVERB;\n\n/*\n[ENUM]\n[\n    [DESCRIPTION]\n    Parameter types for the FMOD_DSP_TYPE_LOWPASS_SIMPLE filter.\n\n    [REMARKS]\n    Deprecated and will be removed in a future release, to emulate with FMOD_DSP_TYPE_MULTIBAND_EQ:\n\n        //  Configure a single band (band A) as a lowpass (all other bands default to off).\n        //  12dB rolloff to approximate the old effect curve.\n        //  Cutoff frequency can be used the same as with the old effect.\n        //  Resonance / 'Q' should remain at default 0.707.\n        FMOD_DSP_SetParameterInt(multiband, FMOD_DSP_MULTIBAND_EQ_A_FILTER, FMOD_DSP_MULTIBAND_EQ_FILTER_LOWPASS_12DB);\n        FMOD_DSP_SetParameterFloat(multiband, FMOD_DSP_MULTIBAND_EQ_A_FREQUENCY, frequency);\n\n    This is a very simple low pass filter, based on two single-pole RC time-constant modules.\n\n    The emphasis is on speed rather than accuracy, so this should not be used for task requiring critical filtering.\n\n    [SEE_ALSO]\n    DSP::setParameterFloat\n    DSP::getParameterFloat\n    FMOD_DSP_TYPE\n]\n*/\ntypedef enum\n{\n    FMOD_DSP_LOWPASS_SIMPLE_CUTOFF     /* (Type:float) - Lowpass cutoff frequency in hz.  10.0 to 22000.0.  Default = 5000.0 */\n} FMOD_DSP_LOWPASS_SIMPLE;\n\n\n/*\n[ENUM]\n[\n    [DESCRIPTION]\n    Parameter types for the FMOD_DSP_TYPE_DELAY filter.\n\n    [REMARKS]\n    Note.  Every time MaxDelay is changed, the plugin re-allocates the delay buffer.  This means the delay will dissapear at that time while it refills its new buffer.<br>\n    A larger MaxDelay results in larger amounts of memory allocated.<br>\n    Channel delays above MaxDelay will be clipped to MaxDelay and the delay buffer will not be resized.<br>\n    <br>\n    <b>NOTE!</b> Not supported on PlayStation 3.\n\n    [SEE_ALSO]\n    DSP::setParameterFloat\n    DSP::getParameterFloat\n    FMOD_DSP_TYPE\n]\n*/\ntypedef enum\n{\n    FMOD_DSP_DELAY_CH0,      /* (Type:float) - Channel  #0 Delay in ms.  0  to 10000.  Default = 0. */\n    FMOD_DSP_DELAY_CH1,      /* (Type:float) - Channel  #1 Delay in ms.  0  to 10000.  Default = 0. */\n    FMOD_DSP_DELAY_CH2,      /* (Type:float) - Channel  #2 Delay in ms.  0  to 10000.  Default = 0. */\n    FMOD_DSP_DELAY_CH3,      /* (Type:float) - Channel  #3 Delay in ms.  0  to 10000.  Default = 0. */\n    FMOD_DSP_DELAY_CH4,      /* (Type:float) - Channel  #4 Delay in ms.  0  to 10000.  Default = 0. */\n    FMOD_DSP_DELAY_CH5,      /* (Type:float) - Channel  #5 Delay in ms.  0  to 10000.  Default = 0. */\n    FMOD_DSP_DELAY_CH6,      /* (Type:float) - Channel  #6 Delay in ms.  0  to 10000.  Default = 0. */\n    FMOD_DSP_DELAY_CH7,      /* (Type:float) - Channel  #7 Delay in ms.  0  to 10000.  Default = 0. */\n    FMOD_DSP_DELAY_CH8,      /* (Type:float) - Channel  #8 Delay in ms.  0  to 10000.  Default = 0. */\n    FMOD_DSP_DELAY_CH9,      /* (Type:float) - Channel  #9 Delay in ms.  0  to 10000.  Default = 0. */\n    FMOD_DSP_DELAY_CH10,     /* (Type:float) - Channel #10 Delay in ms.  0  to 10000.  Default = 0. */\n    FMOD_DSP_DELAY_CH11,     /* (Type:float) - Channel #11 Delay in ms.  0  to 10000.  Default = 0. */\n    FMOD_DSP_DELAY_CH12,     /* (Type:float) - Channel #12 Delay in ms.  0  to 10000.  Default = 0. */\n    FMOD_DSP_DELAY_CH13,     /* (Type:float) - Channel #13 Delay in ms.  0  to 10000.  Default = 0. */\n    FMOD_DSP_DELAY_CH14,     /* (Type:float) - Channel #14 Delay in ms.  0  to 10000.  Default = 0. */\n    FMOD_DSP_DELAY_CH15,     /* (Type:float) - Channel #15 Delay in ms.  0  to 10000.  Default = 0. */\n    FMOD_DSP_DELAY_MAXDELAY  /* (Type:float) - Maximum delay in ms.      0  to 10000.  Default = 10. */\n} FMOD_DSP_DELAY;\n\n\n/*\n[ENUM]\n[\n    [DESCRIPTION]\n    Parameter types for the FMOD_DSP_TYPE_TREMOLO filter.\n\n    [REMARKS]\n    The tremolo effect varies the amplitude of a sound. Depending on the settings, this unit can produce a tremolo, chopper or auto-pan effect.<br>\n    <br>\n    The shape of the LFO (low freq. oscillator) can morphed between sine, triangle and sawtooth waves using the FMOD_DSP_TREMOLO_SHAPE and FMOD_DSP_TREMOLO_SKEW parameters.<br>\n    FMOD_DSP_TREMOLO_DUTY and FMOD_DSP_TREMOLO_SQUARE are useful for a chopper-type effect where the first controls the on-time duration and second controls the flatness of the envelope.<br>\n    FMOD_DSP_TREMOLO_SPREAD varies the LFO phase between channels to get an auto-pan effect. This works best with a sine shape LFO.<br>\n    The LFO can be synchronized using the FMOD_DSP_TREMOLO_PHASE parameter which sets its instantaneous phase.<br>\n\n    [SEE_ALSO]\n    DSP::setParameterFloat\n    DSP::getParameterFloat\n    FMOD_DSP_TYPE\n]\n*/\ntypedef enum\n{\n    FMOD_DSP_TREMOLO_FREQUENCY,     /* (Type:float) - LFO frequency in Hz.  0.1 to 20.  Default = 5. */\n    FMOD_DSP_TREMOLO_DEPTH,         /* (Type:float) - Tremolo depth.  0 to 1.  Default = 1. */\n    FMOD_DSP_TREMOLO_SHAPE,         /* (Type:float) - LFO shape morph between triangle and sine.  0 to 1.  Default = 0. */\n    FMOD_DSP_TREMOLO_SKEW,          /* (Type:float) - Time-skewing of LFO cycle.  -1 to 1.  Default = 0. */\n    FMOD_DSP_TREMOLO_DUTY,          /* (Type:float) - LFO on-time.  0 to 1.  Default = 0.5. */\n    FMOD_DSP_TREMOLO_SQUARE,        /* (Type:float) - Flatness of the LFO shape.  0 to 1.  Default = 0. */\n    FMOD_DSP_TREMOLO_PHASE,         /* (Type:float) - Instantaneous LFO phase.  0 to 1.  Default = 0. */\n    FMOD_DSP_TREMOLO_SPREAD         /* (Type:float) - Rotation / auto-pan effect.  -1 to 1.  Default = 0. */\n} FMOD_DSP_TREMOLO;\n\n\n/*\n[ENUM]\n[\n    [DESCRIPTION]\n    Parameter types for the FMOD_DSP_TYPE_SEND DSP.\n\n    [REMARKS]\n\n    [SEE_ALSO]\n    DSP::setParameterInt\n    DSP::getParameterInt\n    DSP::setParameterFloat\n    DSP::getParameterFloat\n    FMOD_DSP_TYPE\n]\n*/\ntypedef enum\n{\n    FMOD_DSP_SEND_RETURNID,     /* (Type:int) - ID of the Return DSP this send is connected to (integer values only). -1 indicates no connected Return DSP. Default = -1. */\n    FMOD_DSP_SEND_LEVEL,        /* (Type:float) - Send level. 0.0 to 1.0. Default = 1.0 */\n} FMOD_DSP_SEND;\n\n\n/*\n[ENUM]\n[\n    [DESCRIPTION]\n    Parameter types for the FMOD_DSP_TYPE_RETURN DSP.\n\n    [REMARKS]\n\n    [SEE_ALSO]\n    DSP::setParameterInt\n    DSP::getParameterInt\n    FMOD_DSP_TYPE\n]\n*/\ntypedef enum\n{\n    FMOD_DSP_RETURN_ID,                /* (Type:int) - [r]   ID of this Return DSP. Read-only.  Default = -1. */\n    FMOD_DSP_RETURN_INPUT_SPEAKER_MODE /* (Type:int) - [r/w] Input speaker mode of this return.  Default = FMOD_SPEAKERMODE_DEFAULT. */\n} FMOD_DSP_RETURN;\n\n\n/*\n[ENUM]\n[\n    [DESCRIPTION]\n    Parameter types for the FMOD_DSP_TYPE_HIGHPASS_SIMPLE filter.\n\n    [REMARKS]\n    Deprecated and will be removed in a future release, to emulate with FMOD_DSP_TYPE_MULTIBAND_EQ:\n\n        // Configure a single band (band A) as a highpass (all other bands default to off).\n        // 12dB rolloff to approximate the old effect curve.\n        // Cutoff frequency can be used the same as with the old effect.\n        // Resonance / 'Q' should remain at default 0.707.\n        FMOD_DSP_SetParameterInt(multiband, FMOD_DSP_MULTIBAND_EQ_A_FILTER, FMOD_DSP_MULTIBAND_EQ_FILTER_HIGHPASS_12DB);\n        FMOD_DSP_SetParameterFloat(multiband, FMOD_DSP_MULTIBAND_EQ_A_FREQUENCY, frequency);\n\n    This is a very simple single-order high pass filter.\n\n    The emphasis is on speed rather than accuracy, so this should not be used for task requiring critical filtering.\n\n    [SEE_ALSO]\n    DSP::setParameterFloat\n    DSP::getParameterFloat\n    FMOD_DSP_TYPE\n]\n*/\ntypedef enum\n{\n    FMOD_DSP_HIGHPASS_SIMPLE_CUTOFF     /* (Type:float) - Highpass cutoff frequency in hz.  10.0 to 22000.0.  Default = 1000.0 */\n} FMOD_DSP_HIGHPASS_SIMPLE;\n\n\n/*\n[ENUM]\n[\n    [DESCRIPTION]\n    Parameter values for the FMOD_DSP_PAN_2D_STEREO_MODE parameter of the FMOD_DSP_TYPE_PAN DSP.\n\n    [REMARKS]\n\n    [SEE_ALSO]\n    FMOD_DSP_PAN\n]\n*/\ntypedef enum\n{\n    FMOD_DSP_PAN_2D_STEREO_MODE_DISTRIBUTED,     /* The parts of a stereo sound are spread around desination speakers based on FMOD_DSP_PAN_2D_EXTENT / FMOD_DSP_PAN_2D_DIRECTION */\n    FMOD_DSP_PAN_2D_STEREO_MODE_DISCRETE         /* The L/R parts of a stereo sound are rotated around a circle based on FMOD_DSP_PAN_2D_STEREO_AXIS / FMOD_DSP_PAN_2D_STEREO_SEPARATION. */\n} FMOD_DSP_PAN_2D_STEREO_MODE_TYPE;\n\n\n/*\n[ENUM]\n[\n    [DESCRIPTION]\n    Parameter values for the FMOD_DSP_PAN_MODE parameter of the FMOD_DSP_TYPE_PAN DSP.\n\n    [REMARKS]\n\n    [SEE_ALSO]\n    FMOD_DSP_PAN\n]\n*/\ntypedef enum\n{\n    FMOD_DSP_PAN_MODE_MONO,\n    FMOD_DSP_PAN_MODE_STEREO,\n    FMOD_DSP_PAN_MODE_SURROUND\n} FMOD_DSP_PAN_MODE_TYPE;\n\n\n/*\n[ENUM]\n[\n    [DESCRIPTION]\n    Parameter values for the FMOD_DSP_PAN_3D_ROLLOFF parameter of the FMOD_DSP_TYPE_PAN DSP.\n\n    [REMARKS]\n\n    [SEE_ALSO]\n    FMOD_DSP_PAN\n]\n*/\ntypedef enum\n{\n    FMOD_DSP_PAN_3D_ROLLOFF_LINEARSQUARED,\n    FMOD_DSP_PAN_3D_ROLLOFF_LINEAR,\n    FMOD_DSP_PAN_3D_ROLLOFF_INVERSE,\n    FMOD_DSP_PAN_3D_ROLLOFF_INVERSETAPERED,\n    FMOD_DSP_PAN_3D_ROLLOFF_CUSTOM\n} FMOD_DSP_PAN_3D_ROLLOFF_TYPE;\n\n\n/*\n[ENUM]\n[\n    [DESCRIPTION]\n    Parameter values for the FMOD_DSP_PAN_3D_EXTENT_MODE parameter of the FMOD_DSP_TYPE_PAN DSP.\n\n    [REMARKS]\n\n    [SEE_ALSO]\n    FMOD_DSP_PAN\n]\n*/\ntypedef enum\n{\n    FMOD_DSP_PAN_3D_EXTENT_MODE_AUTO,\n    FMOD_DSP_PAN_3D_EXTENT_MODE_USER,\n    FMOD_DSP_PAN_3D_EXTENT_MODE_OFF\n} FMOD_DSP_PAN_3D_EXTENT_MODE_TYPE;\n\n\n/*\n[ENUM]\n[\n    [DESCRIPTION]\n    Parameter types for the FMOD_DSP_TYPE_PAN DSP.\n\n    [REMARKS]\n    FMOD_DSP_PAN_3D_PAN_BLEND controls the percentage of the effect supplied by FMOD_DSP_PAN_2D_DIRECTION and FMOD_DSP_PAN_2D_EXTENT.\n\n    For FMOD_DSP_PAN_3D_POSITION, the following members in the FMOD_DSP_PARAMETER_3DATTRIBUTES_MULTI struct should be non zero.\n    - numlisteners                   - This is typically 1, can be up to 8.  Typically more than 1 is only used for split screen purposes.  The FMOD Panner will average angles and produce the best compromise for panning and attenuation.\n    - relative[listenernum].position - This is the delta between the listener position and the sound position.  Typically the listener position is subtracted from the sound position.\n    - relative[listenernum].forward  - This is the sound's forward vector.  Optional, set to 0,0,1 if not needed.  This is only relevant for more than mono sounds in 3D, that are spread amongst the destination speakers at the time of panning.   \n                                       If the sound rotates then the L/R part of a stereo sound will rotate amongst its destination speakers.\n                                       If the sound has moved and pinpointed into a single speaker, rotation of the sound will have no effect as at that point the channels are collapsed into a single point.\n\n    For FMOD_DSP_PAN_2D_STEREO_MODE, when it is set to FMOD_DSP_PAN_2D_STEREO_MODE_DISCRETE, only FMOD_DSP_PAN_2D_STEREO_SEPARATION and FMOD_DSP_PAN_2D_STEREO_AXIS are used.\n    When it is set to FMOD_DSP_PAN_2D_STEREO_MODE_DISTRIBUTED, then standard FMOD_DSP_PAN_2D_DIRECTION/FMOD_DSP_PAN_2D_EXTENT parameters are used.\n\n    [SEE_ALSO]\n    DSP::setParameterFloat\n    DSP::getParameterFloat\n    DSP::setParameterInt\n    DSP::getParameterInt\n    DSP::setParameterData\n    DSP::getParameterData\n    FMOD_DSP_TYPE\n]\n*/\ntypedef enum\n{\n    FMOD_DSP_PAN_MODE,                          /* (Type:int)   - Panner mode.               FMOD_DSP_PAN_MODE_MONO for mono down-mix, FMOD_DSP_PAN_MODE_STEREO for stereo panning or FMOD_DSP_PAN_MODE_SURROUND for surround panning.  Default = FMOD_DSP_PAN_MODE_SURROUND */\n    FMOD_DSP_PAN_2D_STEREO_POSITION,            /* (Type:float) - 2D Stereo pan position.    -100.0 to 100.0.  Default = 0.0. */\n    FMOD_DSP_PAN_2D_DIRECTION,                  /* (Type:float) - 2D Surround pan direction. Direction from center point of panning circle. -180.0 (degrees) to 180.0 (degrees).  0 = front center, -180 or +180 = rear speakers center point. Default = 0.0. */\n    FMOD_DSP_PAN_2D_EXTENT,                     /* (Type:float) - 2D Surround pan extent.    Distance from center point of panning circle.  0.0 (degrees) to 360.0 (degrees).  Default = 360.0. */\n    FMOD_DSP_PAN_2D_ROTATION,                   /* (Type:float) - 2D Surround pan rotation.  -180.0 (degrees) to 180.0 (degrees).  Default = 0.0. */\n    FMOD_DSP_PAN_2D_LFE_LEVEL,                  /* (Type:float) - 2D Surround pan LFE level. 2D LFE level in dB.  -80.0 (db) to 20.0 (db).  Default = 0.0. */\n    FMOD_DSP_PAN_2D_STEREO_MODE,                /* (Type:int)   - Stereo-To-Surround Mode.   FMOD_DSP_PAN_2D_STEREO_MODE_DISTRIBUTED to FMOD_DSP_PAN_2D_STEREO_MODE_DISCRETE.  Default = FMOD_DSP_PAN_2D_STEREO_MODE_DISCRETE.*/\n    FMOD_DSP_PAN_2D_STEREO_SEPARATION,          /* (Type:float) - Stereo-To-Surround Stereo  For FMOD_DSP_PAN_2D_STEREO_MODE_DISCRETE mode.  Separation/width of L/R parts of stereo sound. -180.0 (degrees) to +180.0 (degrees).  Default = 60.0. */\n    FMOD_DSP_PAN_2D_STEREO_AXIS,                /* (Type:float) - Stereo-To-Surround Stereo  For FMOD_DSP_PAN_2D_STEREO_MODE_DISCRETE mode.  Axis/rotation of L/R parts of stereo sound. -180.0 (degrees) to +180.0 (degrees).  Default = 0.0. */\n    FMOD_DSP_PAN_ENABLED_SPEAKERS,              /* (Type:int)   - Speakers Enabled.          Bitmask for each speaker from 0 to 32 to be considered by panner.  Use to disable speakers from being panned to.  0 to 0xFFF.  Default = 0xFFF (All on).  */\n    FMOD_DSP_PAN_3D_POSITION,                   /* (Type:data)  - 3D Position.               Data of type FMOD_DSP_PARAMETER_3DATTRIBUTES_MULTI.  See remarks on what to fill out. */\n    FMOD_DSP_PAN_3D_ROLLOFF,                    /* (Type:int)   - 3D Rolloff.                FMOD_DSP_PAN_3D_ROLLOFF_LINEARSQUARED to FMOD_DSP_PAN_3D_ROLLOFF_CUSTOM.  Default = FMOD_DSP_PAN_3D_ROLLOFF_LINEARSQUARED. */\n    FMOD_DSP_PAN_3D_MIN_DISTANCE,               /* (Type:float) - 3D Min Distance.           0.0 to 1e+18f.  Default = 1.0. */\n    FMOD_DSP_PAN_3D_MAX_DISTANCE,               /* (Type:float) - 3D Max Distance.           0.0 to 1e+18f.  Default = 20.0. */\n    FMOD_DSP_PAN_3D_EXTENT_MODE,                /* (Type:int)   - 3D Extent Mode.            FMOD_DSP_PAN_3D_EXTENT_MODE_AUTO to FMOD_DSP_PAN_3D_EXTENT_MODE_OFF.  Default = FMOD_DSP_PAN_3D_EXTENT_MODE_AUTO. */\n    FMOD_DSP_PAN_3D_SOUND_SIZE,                 /* (Type:float) - 3D Sound Size.             0.0 to 1e+18f.  Default = 0.0. */\n    FMOD_DSP_PAN_3D_MIN_EXTENT,                 /* (Type:float) - 3D Min Extent.             0.0 (degrees) to 360.0 (degrees).  Default = 0.0. */\n    FMOD_DSP_PAN_3D_PAN_BLEND,                  /* (Type:float) - 3D Pan Blend.              0.0 (fully 2D) to 1.0 (fully 3D).  Default = 0.0. */\n    FMOD_DSP_PAN_LFE_UPMIX_ENABLED,             /* (Type:int)   - LFE Upmix Enabled.         Determines whether non-LFE source channels should mix to the LFE or leave it alone.  0 (off) to 1 (on).  Default = 0 (off). */\n    FMOD_DSP_PAN_OVERALL_GAIN,                  /* (Type:data)  - Overall gain.              For information only, not set by user.  Data of type FMOD_DSP_PARAMETER_DATA_TYPE_OVERALLGAIN to provide to FMOD, to allow FMOD to know the DSP is scaling the signal for virtualization purposes. */\n    FMOD_DSP_PAN_SURROUND_SPEAKER_MODE,         /* (Type:int)   - Surround speaker mode.     Target speaker mode for surround panning.  Default = FMOD_SPEAKERMODE_DEFAULT. */\n    FMOD_DSP_PAN_2D_HEIGHT_BLEND,               /* (Type:float) - 2D Height blend.           When the input or FMOD_DSP_PAN_SURROUND_SPEAKER_MODE has height speakers, control the blend between ground and height. -1.0 (push top speakers to ground), 0.0 (preserve top / ground separation), 1.0 (push ground speakers to top). Default = 0.0. */\n} FMOD_DSP_PAN;\n\n\n/*\n[ENUM]\n[\n    [DESCRIPTION]\n    Parameter values for the FMOD_DSP_THREE_EQ_CROSSOVERSLOPE parameter of the FMOD_DSP_TYPE_THREE_EQ DSP.\n\n    [REMARKS]\n\n    [SEE_ALSO]\n    FMOD_DSP_THREE_EQ\n]\n*/\ntypedef enum\n{\n    FMOD_DSP_THREE_EQ_CROSSOVERSLOPE_12DB,\n    FMOD_DSP_THREE_EQ_CROSSOVERSLOPE_24DB,\n    FMOD_DSP_THREE_EQ_CROSSOVERSLOPE_48DB\n} FMOD_DSP_THREE_EQ_CROSSOVERSLOPE_TYPE;\n\n\n/*\n[ENUM]\n[\n    [DESCRIPTION]\n    Parameter types for the FMOD_DSP_TYPE_THREE_EQ filter.\n\n    [REMARKS]\n\n    [SEE_ALSO]\n    DSP::setParameterFloat\n    DSP::getParameterFloat\n    DSP::setParameterInt\n    DSP::getParameterInt\n    FMOD_DSP_TYPE\n    FMOD_DSP_THREE_EQ_CROSSOVERSLOPE_TYPE\n]\n*/\ntypedef enum\n{\n    FMOD_DSP_THREE_EQ_LOWGAIN,       /* (Type:float) - Low frequency gain in dB.  -80.0 to 10.0.  Default = 0. */\n    FMOD_DSP_THREE_EQ_MIDGAIN,       /* (Type:float) - Mid frequency gain in dB.  -80.0 to 10.0.  Default = 0. */\n    FMOD_DSP_THREE_EQ_HIGHGAIN,      /* (Type:float) - High frequency gain in dB.  -80.0 to 10.0.  Default = 0. */\n    FMOD_DSP_THREE_EQ_LOWCROSSOVER,  /* (Type:float) - Low-to-mid crossover frequency in Hz.  10.0 to 22000.0.  Default = 400.0. */\n    FMOD_DSP_THREE_EQ_HIGHCROSSOVER, /* (Type:float) - Mid-to-high crossover frequency in Hz.  10.0 to 22000.0.  Default = 4000.0. */\n    FMOD_DSP_THREE_EQ_CROSSOVERSLOPE /* (Type:int)   - Crossover Slope.  0 = 12dB/Octave, 1 = 24dB/Octave, 2 = 48dB/Octave.  Default = 1 (24dB/Octave). */\n} FMOD_DSP_THREE_EQ;\n\n\n/*\n[ENUM]\n[\n    [DESCRIPTION]\n    List of windowing methods for the FMOD_DSP_TYPE_FFT unit.  Used in spectrum analysis to reduce leakage / transient signals intefering with the analysis.<br>\n    This is a problem with analysis of continuous signals that only have a small portion of the signal sample (the fft window size).<br>\n    Windowing the signal with a curve or triangle tapers the sides of the fft window to help alleviate this problem.\n\n    [REMARKS]\n    Cyclic signals such as a sine wave that repeat their cycle in a multiple of the window size do not need windowing.<br>\n    I.e. If the sine wave repeats every 1024, 512, 256 etc samples and the FMOD fft window is 1024, then the signal would not need windowing.<br>\n    Not windowing is the same as FMOD_DSP_FFT_WINDOW_RECT, which is the default.<br>\n    If the cycle of the signal (ie the sine wave) is not a multiple of the window size, it will cause frequency abnormalities, so a different windowing method is needed.<br>\n    <exclude>\n    <br>\n    FMOD_DSP_FFT_WINDOW_RECT.<br>\n    <img src=\"..\\static\\overview\\rectangle.gif\"></img><br>\n    <br>\n    FMOD_DSP_FFT_WINDOW_TRIANGLE.<br>\n    <img src=\"..\\static\\overview\\triangle.gif\"></img><br>\n    <br>\n    FMOD_DSP_FFT_WINDOW_HAMMING.<br>\n    <img src=\"..\\static\\overview\\hamming.gif\"></img><br>\n    <br>\n    FMOD_DSP_FFT_WINDOW_HANNING.<br>\n    <img src=\"..\\static\\overview\\hanning.gif\"></img><br>\n    <br>\n    FMOD_DSP_FFT_WINDOW_BLACKMAN.<br>\n    <img src=\"..\\static\\overview\\blackman.gif\"></img><br>\n    <br>\n    FMOD_DSP_FFT_WINDOW_BLACKMANHARRIS.<br>\n    <img src=\"..\\static\\overview\\blackmanharris.gif\"></img>\n    </exclude>\n    \n    [SEE_ALSO]\n    FMOD_DSP_FFT\n]\n*/\ntypedef enum\n{\n    FMOD_DSP_FFT_WINDOW_RECT,            /* w[n] = 1.0                                                                                            */\n    FMOD_DSP_FFT_WINDOW_TRIANGLE,        /* w[n] = TRI(2n/N)                                                                                      */\n    FMOD_DSP_FFT_WINDOW_HAMMING,         /* w[n] = 0.54 - (0.46 * COS(n/N) )                                                                      */\n    FMOD_DSP_FFT_WINDOW_HANNING,         /* w[n] = 0.5 *  (1.0  - COS(n/N) )                                                                      */\n    FMOD_DSP_FFT_WINDOW_BLACKMAN,        /* w[n] = 0.42 - (0.5  * COS(n/N) ) + (0.08 * COS(2.0 * n/N) )                                           */\n    FMOD_DSP_FFT_WINDOW_BLACKMANHARRIS   /* w[n] = 0.35875 - (0.48829 * COS(1.0 * n/N)) + (0.14128 * COS(2.0 * n/N)) - (0.01168 * COS(3.0 * n/N)) */\n} FMOD_DSP_FFT_WINDOW;\n\n\n/*\n[ENUM]\n[\n    [DESCRIPTION]\n    Parameter types for the FMOD_DSP_TYPE_FFT dsp effect.\n\n    [REMARKS]\n    Set the attributes for the spectrum analysis with FMOD_DSP_FFT_WINDOWSIZE and FMOD_DSP_FFT_WINDOWTYPE, and retrieve the results with FMOD_DSP_FFT_SPECTRUM and FMOD_DSP_FFT_DOMINANT_FREQ.\n    FMOD_DSP_FFT_SPECTRUM stores its data in the FMOD_DSP_PARAMETER_DATA_TYPE_FFT.  You will need to cast to this structure to get the right data.\n\n    [SEE_ALSO]\n    DSP::setParameterFloat\n    DSP::getParameterFloat\n    DSP::setParameterInt\n    DSP::getParameterInt\n    DSP::setParameterData\n    DSP::getParameterData\n    FMOD_DSP_TYPE\n    FMOD_DSP_FFT_WINDOW\n]\n*/\ntypedef enum\n{\n    FMOD_DSP_FFT_WINDOWSIZE,            /*  (Type:int)   - [r/w] Must be a power of 2 between 128 and 16384.  128, 256, 512, 1024, 2048, 4096, 8192, 16384 are accepted.  Default = 2048. */\n    FMOD_DSP_FFT_WINDOWTYPE,            /*  (Type:int)   - [r/w] Refer to FMOD_DSP_FFT_WINDOW enumeration.  Default = FMOD_DSP_FFT_WINDOW_HAMMING. */\n    FMOD_DSP_FFT_SPECTRUMDATA,          /*  (Type:data)  - [r]   Returns the current spectrum values between 0 and 1 for each 'fft bin'.  Cast data to FMOD_DSP_PARAMETER_DATA_TYPE_FFT.  Divide the niquist rate by the window size to get the hz value per entry. */\n    FMOD_DSP_FFT_DOMINANT_FREQ          /*  (Type:float) - [r]   Returns the dominant frequencies for each channel. */\n} FMOD_DSP_FFT;\n\n\n/*\n[ENUM]\n[  \n    [DESCRIPTION]\n    Deprecated and will be removed in a future release.\n\n    Parameter types for the FMOD_DSP_TYPE_ENVELOPEFOLLOWER unit.\n    This is a simple envelope follower for tracking the signal level.<br>\n\n    [REMARKS]\n    Deprecated and will be removed in a future release.\n\n    This unit does not affect the incoming signal.\n    <br>\n\n    [SEE_ALSO]\n    DSP::setParameterFloat\n    DSP::getParameterFloat\n    DSP::setParameterData\n    DSP::getParameterData\n    FMOD_DSP_TYPE\n]\n*/\ntypedef enum\n{\n    FMOD_DSP_ENVELOPEFOLLOWER_ATTACK,      /* (Type:float) [r/w] - Attack time (milliseconds), in the range from 0.1 through 1000.  Default = 20. */\n    FMOD_DSP_ENVELOPEFOLLOWER_RELEASE,     /* (Type:float) [r/w] - Release time (milliseconds), in the range from 10 through 5000.  Default = 100 */\n    FMOD_DSP_ENVELOPEFOLLOWER_ENVELOPE,    /* (Type:float) [r]   - Current value of the envelope, in the range 0 to 1. Read-only. */\n    FMOD_DSP_ENVELOPEFOLLOWER_USESIDECHAIN /* (Type:data)  [r/w] - Data of type FMOD_DSP_PARAMETER_SIDECHAIN. Whether to analyse the sidechain signal instead of the input signal. Default is { false } */\n} FMOD_DSP_ENVELOPEFOLLOWER;\n\n/*\n[ENUM]\n[\n    [DESCRIPTION]\n    Parameter types for the FMOD_DSP_TYPE_CONVOLUTIONREVERB filter.\n\n    [REMARKS]\n    Convolution Reverb reverb IR.<br>\n\n    [SEE_ALSO]\n    DSP::setParameterFloat\n    DSP::getParameterFloat\n    DSP::setParameterData\n    DSP::getParameterData\n    FMOD_DSP_TYPE\n]\n*/\ntypedef enum\n{\n    FMOD_DSP_CONVOLUTION_REVERB_PARAM_IR,       /* (Type:data)  - [w]   Array of signed 16-bit (short) PCM data to be used as reverb IR.  First member of the array should be a 16 bit value (short) which specifies the number of channels.  Array looks like [index 0=numchannels][index 1+ = raw 16 bit PCM data].  Data is copied internally so source can be freed. */\n    FMOD_DSP_CONVOLUTION_REVERB_PARAM_WET,      /* (Type:float) - [r/w] Volume of echo signal to pass to output in dB.  -80.0 to 10.0.  Default = 0. */\n    FMOD_DSP_CONVOLUTION_REVERB_PARAM_DRY,      /* (Type:float) - [r/w] Original sound volume in dB.  -80.0 to 10.0.  Default = 0. */\n    FMOD_DSP_CONVOLUTION_REVERB_PARAM_LINKED    /* (Type:bool)  - [r/w] Linked - channels are mixed together before processing through the reverb.  Default = TRUE. */\n} FMOD_DSP_CONVOLUTION_REVERB;\n\n/*\n[ENUM]\n[\n    [DESCRIPTION]\n    Parameter types for the FMOD_DSP_CHANNELMIX_OUTPUTGROUPING parameter for FMOD_DSP_TYPE_CHANNELMIX effect.\n\n    [REMARKS]\n\n    [SEE_ALSO]\n    DSP::setParameterInt\n    DSP::getParameterInt\n    FMOD_DSP_TYPE\n]\n*/\ntypedef enum\n{\n    FMOD_DSP_CHANNELMIX_OUTPUT_DEFAULT,         /*  Output channel count = input channel count.  Mapping: See FMOD_SPEAKER enumeration. */\n    FMOD_DSP_CHANNELMIX_OUTPUT_ALLMONO,         /*  Output channel count = 1.  Mapping: Mono, Mono, Mono, Mono, Mono, Mono, ... (each channel all the way up to FMOD_MAX_CHANNEL_WIDTH channels are treated as if they were mono) */\n    FMOD_DSP_CHANNELMIX_OUTPUT_ALLSTEREO,       /*  Output channel count = 2.  Mapping: Left, Right, Left, Right, Left, Right, ... (each pair of channels is treated as stereo all the way up to FMOD_MAX_CHANNEL_WIDTH channels) */\n    FMOD_DSP_CHANNELMIX_OUTPUT_ALLQUAD,         /*  Output channel count = 4.  Mapping: Repeating pattern of Front Left, Front Right, Surround Left, Surround Right. */\n    FMOD_DSP_CHANNELMIX_OUTPUT_ALL5POINT1,      /*  Output channel count = 6.  Mapping: Repeating pattern of Front Left, Front Right, Center, LFE, Surround Left, Surround Right. */\n    FMOD_DSP_CHANNELMIX_OUTPUT_ALL7POINT1,      /*  Output channel count = 8.  Mapping: Repeating pattern of Front Left, Front Right, Center, LFE, Surround Left, Surround Right, Back Left, Back Right.  */\n    FMOD_DSP_CHANNELMIX_OUTPUT_ALLLFE,          /*  Output channel count = 6.  Mapping: Repeating pattern of LFE in a 5.1 output signal.  */\n    FMOD_DSP_CHANNELMIX_OUTPUT_ALL7POINT1POINT4 /*  Output channel count = 12. Mapping: Repeating pattern of Front Left, Front Right, Center, LFE, Surround Left, Surround Right, Back Left, Back Right, Top Front Left, Top Front Right, Top Back Left, Top Back Right.  */\n} FMOD_DSP_CHANNELMIX_OUTPUT;\n\n/*\n[ENUM]\n[\n    [DESCRIPTION]\n    Parameter types for the FMOD_DSP_TYPE_CHANNELMIX filter.\n\n    [REMARKS]\n    For FMOD_DSP_CHANNELMIX_OUTPUTGROUPING, this value will set the output speaker format for the DSP, and also map the incoming channels to the \n    outgoing channels in a round-robin fashion.  Use this for example play a 32 channel input signal as if it were a repeating group of output signals.\n    Ie.\n    FMOD_DSP_CHANNELMIX_OUTPUT_ALLMONO    = all incoming channels are mixed to a mono output.\n    FMOD_DSP_CHANNELMIX_OUTPUT_ALLSTEREO  = all incoming channels are mixed to a stereo output, ie even incoming channels 0,2,4,6,etc are mixed to left, and odd incoming channels 1,3,5,7,etc are mixed to right.\n    FMOD_DSP_CHANNELMIX_OUTPUT_ALL5POINT1 = all incoming channels are mixed to a 5.1 output.  If there are less than 6 coming in, it will just fill the first n channels in the 6 output channels.   \n                                            If there are more, then it will repeat the input pattern to the output like it did with the stereo case, ie 12 incoming channels are mapped as 0-5 mixed to the \n                                            5.1 output and 6 to 11 mapped to the 5.1 output.\n    FMOD_DSP_CHANNELMIX_OUTPUT_ALLLFE     = all incoming channels are mixed to a 5.1 output but via the LFE channel only.\n\n    [SEE_ALSO]\n    DSP::setParameterInt\n    DSP::getParameterInt\n    DSP::setParameterFloat\n    DSP::getParameterFloat\n    FMOD_DSP_TYPE\n]\n*/\ntypedef enum\n{\n    FMOD_DSP_CHANNELMIX_OUTPUTGROUPING,     /* (Type:int)   - Refer to FMOD_DSP_CHANNELMIX_OUTPUT enumeration.  Default = FMOD_DSP_CHANNELMIX_OUTPUT_DEFAULT.  See remarks. */\n    FMOD_DSP_CHANNELMIX_GAIN_CH0,           /* (Type:float) - Input channel #0  gain in dB. -80.0 to 10.0.  Default = 0. */\n    FMOD_DSP_CHANNELMIX_GAIN_CH1,           /* (Type:float) - Input channel #1  gain in dB. -80.0 to 10.0.  Default = 0. */\n    FMOD_DSP_CHANNELMIX_GAIN_CH2,           /* (Type:float) - Input channel #2  gain in dB. -80.0 to 10.0.  Default = 0. */\n    FMOD_DSP_CHANNELMIX_GAIN_CH3,           /* (Type:float) - Input channel #3  gain in dB. -80.0 to 10.0.  Default = 0. */\n    FMOD_DSP_CHANNELMIX_GAIN_CH4,           /* (Type:float) - Input channel #4  gain in dB. -80.0 to 10.0.  Default = 0. */\n    FMOD_DSP_CHANNELMIX_GAIN_CH5,           /* (Type:float) - Input channel #5  gain in dB. -80.0 to 10.0.  Default = 0. */\n    FMOD_DSP_CHANNELMIX_GAIN_CH6,           /* (Type:float) - Input channel #6  gain in dB. -80.0 to 10.0.  Default = 0. */\n    FMOD_DSP_CHANNELMIX_GAIN_CH7,           /* (Type:float) - Input channel #7  gain in dB. -80.0 to 10.0.  Default = 0. */\n    FMOD_DSP_CHANNELMIX_GAIN_CH8,           /* (Type:float) - Input channel #8  gain in dB. -80.0 to 10.0.  Default = 0. */\n    FMOD_DSP_CHANNELMIX_GAIN_CH9,           /* (Type:float) - Input channel #9  gain in dB. -80.0 to 10.0.  Default = 0. */\n    FMOD_DSP_CHANNELMIX_GAIN_CH10,          /* (Type:float) - Input channel #10 gain in dB. -80.0 to 10.0.  Default = 0. */\n    FMOD_DSP_CHANNELMIX_GAIN_CH11,          /* (Type:float) - Input channel #11 gain in dB. -80.0 to 10.0.  Default = 0. */\n    FMOD_DSP_CHANNELMIX_GAIN_CH12,          /* (Type:float) - Input channel #12 gain in dB. -80.0 to 10.0.  Default = 0. */\n    FMOD_DSP_CHANNELMIX_GAIN_CH13,          /* (Type:float) - Input channel #13 gain in dB. -80.0 to 10.0.  Default = 0. */\n    FMOD_DSP_CHANNELMIX_GAIN_CH14,          /* (Type:float) - Input channel #14 gain in dB. -80.0 to 10.0.  Default = 0. */\n    FMOD_DSP_CHANNELMIX_GAIN_CH15,          /* (Type:float) - Input channel #15 gain in dB. -80.0 to 10.0.  Default = 0. */\n    FMOD_DSP_CHANNELMIX_GAIN_CH16,          /* (Type:float) - Input channel #16 gain in dB. -80.0 to 10.0.  Default = 0. */\n    FMOD_DSP_CHANNELMIX_GAIN_CH17,          /* (Type:float) - Input channel #17 gain in dB. -80.0 to 10.0.  Default = 0. */\n    FMOD_DSP_CHANNELMIX_GAIN_CH18,          /* (Type:float) - Input channel #18 gain in dB. -80.0 to 10.0.  Default = 0. */\n    FMOD_DSP_CHANNELMIX_GAIN_CH19,          /* (Type:float) - Input channel #19 gain in dB. -80.0 to 10.0.  Default = 0. */\n    FMOD_DSP_CHANNELMIX_GAIN_CH20,          /* (Type:float) - Input channel #20 gain in dB. -80.0 to 10.0.  Default = 0. */\n    FMOD_DSP_CHANNELMIX_GAIN_CH21,          /* (Type:float) - Input channel #21 gain in dB. -80.0 to 10.0.  Default = 0. */\n    FMOD_DSP_CHANNELMIX_GAIN_CH22,          /* (Type:float) - Input channel #22 gain in dB. -80.0 to 10.0.  Default = 0. */\n    FMOD_DSP_CHANNELMIX_GAIN_CH23,          /* (Type:float) - Input channel #23 gain in dB. -80.0 to 10.0.  Default = 0. */\n    FMOD_DSP_CHANNELMIX_GAIN_CH24,          /* (Type:float) - Input channel #24 gain in dB. -80.0 to 10.0.  Default = 0. */\n    FMOD_DSP_CHANNELMIX_GAIN_CH25,          /* (Type:float) - Input channel #25 gain in dB. -80.0 to 10.0.  Default = 0. */\n    FMOD_DSP_CHANNELMIX_GAIN_CH26,          /* (Type:float) - Input channel #26 gain in dB. -80.0 to 10.0.  Default = 0. */\n    FMOD_DSP_CHANNELMIX_GAIN_CH27,          /* (Type:float) - Input channel #27 gain in dB. -80.0 to 10.0.  Default = 0. */\n    FMOD_DSP_CHANNELMIX_GAIN_CH28,          /* (Type:float) - Input channel #28 gain in dB. -80.0 to 10.0.  Default = 0. */\n    FMOD_DSP_CHANNELMIX_GAIN_CH29,          /* (Type:float) - Input channel #29 gain in dB. -80.0 to 10.0.  Default = 0. */\n    FMOD_DSP_CHANNELMIX_GAIN_CH30,          /* (Type:float) - Input channel #30 gain in dB. -80.0 to 10.0.  Default = 0. */\n    FMOD_DSP_CHANNELMIX_GAIN_CH31,          /* (Type:float) - Input channel #31 gain in dB. -80.0 to 10.0.  Default = 0. */\n    FMOD_DSP_CHANNELMIX_OUTPUT_CH0,         /* (Type:int)   - Input channel #0  Output channel.   0 to 31.  Default = 0. */\n    FMOD_DSP_CHANNELMIX_OUTPUT_CH1,         /* (Type:int)   - Input channel #1  Output channel.   0 to 31.  Default = 1. */\n    FMOD_DSP_CHANNELMIX_OUTPUT_CH2,         /* (Type:int)   - Input channel #2  Output channel.   0 to 31.  Default = 2. */\n    FMOD_DSP_CHANNELMIX_OUTPUT_CH3,         /* (Type:int)   - Input channel #3  Output channel.   0 to 31.  Default = 3. */\n    FMOD_DSP_CHANNELMIX_OUTPUT_CH4,         /* (Type:int)   - Input channel #4  Output channel.   0 to 31.  Default = 4. */\n    FMOD_DSP_CHANNELMIX_OUTPUT_CH5,         /* (Type:int)   - Input channel #5  Output channel.   0 to 31.  Default = 5. */\n    FMOD_DSP_CHANNELMIX_OUTPUT_CH6,         /* (Type:int)   - Input channel #6  Output channel.   0 to 31.  Default = 6. */\n    FMOD_DSP_CHANNELMIX_OUTPUT_CH7,         /* (Type:int)   - Input channel #7  Output channel.   0 to 31.  Default = 7. */\n    FMOD_DSP_CHANNELMIX_OUTPUT_CH8,         /* (Type:int)   - Input channel #8  Output channel.   0 to 31.  Default = 8. */\n    FMOD_DSP_CHANNELMIX_OUTPUT_CH9,         /* (Type:int)   - Input channel #9  Output channel.   0 to 31.  Default = 9. */\n    FMOD_DSP_CHANNELMIX_OUTPUT_CH10,        /* (Type:int)   - Input channel #10 Output channel.   0 to 31.  Default = 10. */\n    FMOD_DSP_CHANNELMIX_OUTPUT_CH11,        /* (Type:int)   - Input channel #11 Output channel.   0 to 31.  Default = 11. */\n    FMOD_DSP_CHANNELMIX_OUTPUT_CH12,        /* (Type:int)   - Input channel #12 Output channel.   0 to 31.  Default = 12. */\n    FMOD_DSP_CHANNELMIX_OUTPUT_CH13,        /* (Type:int)   - Input channel #13 Output channel.   0 to 31.  Default = 13. */\n    FMOD_DSP_CHANNELMIX_OUTPUT_CH14,        /* (Type:int)   - Input channel #14 Output channel.   0 to 31.  Default = 14. */\n    FMOD_DSP_CHANNELMIX_OUTPUT_CH15,        /* (Type:int)   - Input channel #15 Output channel.   0 to 31.  Default = 15. */\n    FMOD_DSP_CHANNELMIX_OUTPUT_CH16,        /* (Type:int)   - Input channel #16 Output channel.   0 to 31.  Default = 16. */\n    FMOD_DSP_CHANNELMIX_OUTPUT_CH17,        /* (Type:int)   - Input channel #17 Output channel.   0 to 31.  Default = 17. */\n    FMOD_DSP_CHANNELMIX_OUTPUT_CH18,        /* (Type:int)   - Input channel #18 Output channel.   0 to 31.  Default = 18. */\n    FMOD_DSP_CHANNELMIX_OUTPUT_CH19,        /* (Type:int)   - Input channel #19 Output channel.   0 to 31.  Default = 19. */\n    FMOD_DSP_CHANNELMIX_OUTPUT_CH20,        /* (Type:int)   - Input channel #20 Output channel.   0 to 31.  Default = 20. */\n    FMOD_DSP_CHANNELMIX_OUTPUT_CH21,        /* (Type:int)   - Input channel #21 Output channel.   0 to 31.  Default = 21. */\n    FMOD_DSP_CHANNELMIX_OUTPUT_CH22,        /* (Type:int)   - Input channel #22 Output channel.   0 to 31.  Default = 22. */\n    FMOD_DSP_CHANNELMIX_OUTPUT_CH23,        /* (Type:int)   - Input channel #23 Output channel.   0 to 31.  Default = 23. */\n    FMOD_DSP_CHANNELMIX_OUTPUT_CH24,        /* (Type:int)   - Input channel #24 Output channel.   0 to 31.  Default = 24. */\n    FMOD_DSP_CHANNELMIX_OUTPUT_CH25,        /* (Type:int)   - Input channel #25 Output channel.   0 to 31.  Default = 25. */\n    FMOD_DSP_CHANNELMIX_OUTPUT_CH26,        /* (Type:int)   - Input channel #26 Output channel.   0 to 31.  Default = 26. */\n    FMOD_DSP_CHANNELMIX_OUTPUT_CH27,        /* (Type:int)   - Input channel #27 Output channel.   0 to 31.  Default = 27. */\n    FMOD_DSP_CHANNELMIX_OUTPUT_CH28,        /* (Type:int)   - Input channel #28 Output channel.   0 to 31.  Default = 28. */\n    FMOD_DSP_CHANNELMIX_OUTPUT_CH29,        /* (Type:int)   - Input channel #29 Output channel.   0 to 31.  Default = 29. */\n    FMOD_DSP_CHANNELMIX_OUTPUT_CH30,        /* (Type:int)   - Input channel #30 Output channel.   0 to 31.  Default = 30. */\n    FMOD_DSP_CHANNELMIX_OUTPUT_CH31         /* (Type:int)   - Input channel #31 Output channel.   0 to 31.  Default = 31. */\n} FMOD_DSP_CHANNELMIX;\n\n/*\n[ENUM]\n[\n    [DESCRIPTION]\n    Parameter types for the FMOD_DSP_TRANSCEIVER_SPEAKERMODE parameter for FMOD_DSP_TYPE_TRANSCEIVER effect.\n\n    [REMARKS]\n    The speaker mode of a transceiver buffer (of which there are up to 32 of) is determined automatically depending on the signal flowing through the transceiver effect, or it can be forced.\n    Use a smaller fixed speaker mode buffer to save memory.\n\n    Only relevant for transmitter dsps, as they control the format of the transceiver channel's buffer.\n\n    If multiple transceivers transmit to a single buffer in different speaker modes, it will allocate memory for each speaker mode.   This uses more memory than a single speaker mode.\n    If there are multiple receivers reading from a channel with multiple speaker modes, it will read them all and mix them together.\n\n    If the system's speaker mode is stereo or mono, it will not create a 3rd buffer, it will just use the mono/stereo speaker mode buffer.\n\n    [SEE_ALSO]\n    DSP::setParameterInt\n    DSP::getParameterInt\n    FMOD_DSP_TYPE\n]\n*/\ntypedef enum\n{\n    FMOD_DSP_TRANSCEIVER_SPEAKERMODE_AUTO = -1,     /* A transmitter will use whatever signal channel count coming in to the transmitter, to determine which speaker mode is allocated for the transceiver channel. */\n    FMOD_DSP_TRANSCEIVER_SPEAKERMODE_MONO = 0,      /* A transmitter will always downmix to a mono channel buffer. */\n    FMOD_DSP_TRANSCEIVER_SPEAKERMODE_STEREO,        /* A transmitter will always upmix or downmix to a stereo channel buffer. */\n    FMOD_DSP_TRANSCEIVER_SPEAKERMODE_SURROUND,      /* A transmitter will always upmix or downmix to a surround channel buffer.   Surround is the speaker mode of the system above stereo, so could be quad/surround/5.1/7.1. */\n} FMOD_DSP_TRANSCEIVER_SPEAKERMODE;\n\n\n/*\n[ENUM]\n[\n    [DESCRIPTION]\n    Parameter types for the FMOD_DSP_TYPE_TRANSCEIVER filter.\n\n    [REMARKS]\n    The transceiver only transmits and receives to a global array of 32 channels.   The transceiver can be set to receiver mode (like a return) and can receive the signal at a variable gain (FMOD_DSP_TRANSCEIVER_GAIN).\n    The transceiver can also be set to transmit to a chnnel (like a send) and can transmit the signal with a variable gain (FMOD_DSP_TRANSCEIVER_GAIN).\n    \n    The FMOD_DSP_TRANSCEIVER_TRANSMITSPEAKERMODE is only applicable to the transmission format, not the receive format.   This means this parameter is ignored in 'receive mode'.  This allows receivers to receive at\n    the speaker mode of the user's choice.   Receiving from a mono channel, is cheaper than receiving from a surround channel for example.\n    The 3 speaker modes FMOD_DSP_TRANSCEIVER_SPEAKERMODE_MONO, FMOD_DSP_TRANSCEIVER_SPEAKERMODE_STEREO, FMOD_DSP_TRANSCEIVER_SPEAKERMODE_SURROUND are stored as seperate buffers in memory for a tranmitter channel.\n    To save memory, use 1 common speaker mode for a transmitter.\n\n    The transceiver is double buffered to avoid desyncing of transmitters and receivers.   This means there will be a 1 block delay on a receiver, compared to the data sent from a transmitter.\n\n    Multiple transmitters sending to the same channel will be mixed together.\n\n    [SEE_ALSO]\n    DSP::setParameterFloat\n    DSP::getParameterFloat\n    DSP::setParameterInt\n    DSP::getParameterInt\n    DSP::setParameterBool\n    DSP::getParameterBool\n    FMOD_DSP_TYPE\n]\n*/\ntypedef enum\n{\n    FMOD_DSP_TRANSCEIVER_TRANSMIT,            /* (Type:bool)  - [r/w] - FALSE = Transceiver is a 'receiver' (like a return) and accepts data from a channel.  TRUE = Transceiver is a 'transmitter' (like a send).  Default = FALSE. */\n    FMOD_DSP_TRANSCEIVER_GAIN,                /* (Type:float) - [r/w] - Gain to receive or transmit at in dB.  -80.0 to 10.0.  Default = 0. */\n    FMOD_DSP_TRANSCEIVER_CHANNEL,             /* (Type:int)   - [r/w] - Integer to select current global slot, shared by all Transceivers, that can be transmitted to or received from.  0 to 31.  Default = 0.*/\n    FMOD_DSP_TRANSCEIVER_TRANSMITSPEAKERMODE  /* (Type:int)   - [r/w] - Speaker mode (transmitter mode only).  Specifies either 0 (Auto) Default = 0.*/\n} FMOD_DSP_TRANSCEIVER;\n\n\n/*\n[ENUM]\n[\n    [DESCRIPTION]\n    Parameter types for the FMOD_DSP_TYPE_OBJECTPAN DSP.  3D Object panners are meant for hardware 3d object systems like Dolby Atmos or Sony Morpheus.\n    These object panners take input in, and send it to the 7.1 bed, but do not send the signal further down the DSP chain (the output of the dsp is silence).\n\n    [REMARKS]\n\n    [SEE_ALSO]\n    DSP::setParameterFloat\n    DSP::getParameterFloat\n    DSP::setParameterInt\n    DSP::getParameterInt\n    DSP::setParameterData\n    DSP::getParameterData\n    FMOD_DSP_TYPE\n]\n*/\ntypedef enum\n{\n    FMOD_DSP_OBJECTPAN_3D_POSITION,                   /* (Type:data)  - 3D Position.               data of type FMOD_DSP_PARAMETER_3DATTRIBUTES_MULTI */\n    FMOD_DSP_OBJECTPAN_3D_ROLLOFF,                    /* (Type:int)   - 3D Rolloff.                FMOD_DSP_PAN_3D_ROLLOFF_LINEARSQUARED to FMOD_DSP_PAN_3D_ROLLOFF_CUSTOM.  Default = FMOD_DSP_PAN_3D_ROLLOFF_LINEARSQUARED. */\n    FMOD_DSP_OBJECTPAN_3D_MIN_DISTANCE,               /* (Type:float) - 3D Min Distance.           0.0 to 1e+18f.  Default = 1.0. */\n    FMOD_DSP_OBJECTPAN_3D_MAX_DISTANCE,               /* (Type:float) - 3D Max Distance.           0.0 to 1e+18f.  Default = 20.0. */\n    FMOD_DSP_OBJECTPAN_3D_EXTENT_MODE,                /* (Type:int)   - 3D Extent Mode.            FMOD_DSP_PAN_3D_EXTENT_MODE_AUTO to FMOD_DSP_PAN_3D_EXTENT_MODE_OFF.  Default = FMOD_DSP_PAN_3D_EXTENT_MODE_AUTO. */\n    FMOD_DSP_OBJECTPAN_3D_SOUND_SIZE,                 /* (Type:float) - 3D Sound Size.             0.0 to 1e+18f.  Default = 0.0. */\n    FMOD_DSP_OBJECTPAN_3D_MIN_EXTENT,                 /* (Type:float) - 3D Min Extent.             0.0 (degrees) to 360.0 (degrees).  Default = 0.0. */\n    FMOD_DSP_OBJECTPAN_OVERALL_GAIN,                  /* (Type:data)  - Overall gain.              For information only, not set by user.  Data of type FMOD_DSP_PARAMETER_DATA_TYPE_OVERALLGAIN to provide to FMOD, to allow FMOD to know the DSP is scaling the signal for virtualization purposes. */\n    FMOD_DSP_OBJECTPAN_OUTPUTGAIN                     /* (Type:float) - Output gain level.         0.0 to 1.0 linear scale.  For the user to scale the output of the object panner's signal. */\n} FMOD_DSP_OBJECTPAN;\n\n#endif\n\n"
  },
  {
    "path": "Plugins/FMODStudio/Source/FMODStudio/Public/FMOD/fmod_errors.h",
    "content": "/*$ preserve start $*/\n\n/* ================================================================================================== */\n/* FMOD Studio - Error string header file. Copyright (c), Firelight Technologies Pty, Ltd. 2004-2020. */\n/*                                                                                                    */\n/* Use this header if you want to store or display a string version / english explanation of          */\n/* the FMOD error codes.                                                                              */\n/*                                                                                                    */\n/* ================================================================================================== */\n\n#ifndef _FMOD_ERRORS_H\n#define _FMOD_ERRORS_H\n\n#include \"fmod.h\"\n\n#ifdef __GNUC__ \nstatic const char *FMOD_ErrorString(FMOD_RESULT errcode) __attribute__((unused));\n#endif\n\nstatic const char *FMOD_ErrorString(FMOD_RESULT errcode)\n{\n    switch (errcode)\n    {\n/*$ preserve end $*/\n        case FMOD_OK:                            return \"No errors.\";\n        case FMOD_ERR_BADCOMMAND:                return \"Tried to call a function on a data type that does not allow this type of functionality (ie calling Sound::lock on a streaming sound).\";\n        case FMOD_ERR_CHANNEL_ALLOC:             return \"Error trying to allocate a channel.\";\n        case FMOD_ERR_CHANNEL_STOLEN:            return \"The specified channel has been reused to play another sound.\";\n        case FMOD_ERR_DMA:                       return \"DMA Failure.  See debug output for more information.\";\n        case FMOD_ERR_DSP_CONNECTION:            return \"DSP connection error.  Connection possibly caused a cyclic dependency or connected dsps with incompatible buffer counts.\";\n        case FMOD_ERR_DSP_DONTPROCESS:           return \"DSP return code from a DSP process query callback.  Tells mixer not to call the process callback and therefore not consume CPU.  Use this to optimize the DSP graph.\";\n        case FMOD_ERR_DSP_FORMAT:                return \"DSP Format error.  A DSP unit may have attempted to connect to this network with the wrong format, or a matrix may have been set with the wrong size if the target unit has a specified channel map.\";\n        case FMOD_ERR_DSP_INUSE:                 return \"DSP is already in the mixer's DSP network. It must be removed before being reinserted or released.\";\n        case FMOD_ERR_DSP_NOTFOUND:              return \"DSP connection error.  Couldn't find the DSP unit specified.\";\n        case FMOD_ERR_DSP_RESERVED:              return \"DSP operation error.  Cannot perform operation on this DSP as it is reserved by the system.\";\n        case FMOD_ERR_DSP_SILENCE:               return \"DSP return code from a DSP process query callback.  Tells mixer silence would be produced from read, so go idle and not consume CPU.  Use this to optimize the DSP graph.\";\n        case FMOD_ERR_DSP_TYPE:                  return \"DSP operation cannot be performed on a DSP of this type.\";\n        case FMOD_ERR_FILE_BAD:                  return \"Error loading file.\";\n        case FMOD_ERR_FILE_COULDNOTSEEK:         return \"Couldn't perform seek operation.  This is a limitation of the medium (ie netstreams) or the file format.\";\n        case FMOD_ERR_FILE_DISKEJECTED:          return \"Media was ejected while reading.\";\n        case FMOD_ERR_FILE_EOF:                  return \"End of file unexpectedly reached while trying to read essential data (truncated?).\";\n        case FMOD_ERR_FILE_ENDOFDATA:            return \"End of current chunk reached while trying to read data.\";\n        case FMOD_ERR_FILE_NOTFOUND:             return \"File not found.\";\n        case FMOD_ERR_FORMAT:                    return \"Unsupported file or audio format.\";\n        case FMOD_ERR_HEADER_MISMATCH:           return \"There is a version mismatch between the FMOD header and either the FMOD Studio library or the FMOD Low Level library.\";\n        case FMOD_ERR_HTTP:                      return \"A HTTP error occurred. This is a catch-all for HTTP errors not listed elsewhere.\";\n        case FMOD_ERR_HTTP_ACCESS:               return \"The specified resource requires authentication or is forbidden.\";\n        case FMOD_ERR_HTTP_PROXY_AUTH:           return \"Proxy authentication is required to access the specified resource.\";\n        case FMOD_ERR_HTTP_SERVER_ERROR:         return \"A HTTP server error occurred.\";\n        case FMOD_ERR_HTTP_TIMEOUT:              return \"The HTTP request timed out.\";\n        case FMOD_ERR_INITIALIZATION:            return \"FMOD was not initialized correctly to support this function.\";\n        case FMOD_ERR_INITIALIZED:               return \"Cannot call this command after System::init.\";\n        case FMOD_ERR_INTERNAL:                  return \"An error occurred that wasn't supposed to.  Contact support.\";\n        case FMOD_ERR_INVALID_FLOAT:             return \"Value passed in was a NaN, Inf or denormalized float.\";\n        case FMOD_ERR_INVALID_HANDLE:            return \"An invalid object handle was used.\";\n        case FMOD_ERR_INVALID_PARAM:             return \"An invalid parameter was passed to this function.\";\n        case FMOD_ERR_INVALID_POSITION:          return \"An invalid seek position was passed to this function.\";\n        case FMOD_ERR_INVALID_SPEAKER:           return \"An invalid speaker was passed to this function based on the current speaker mode.\";\n        case FMOD_ERR_INVALID_SYNCPOINT:         return \"The syncpoint did not come from this sound handle.\";\n        case FMOD_ERR_INVALID_THREAD:            return \"Tried to call a function on a thread that is not supported.\";\n        case FMOD_ERR_INVALID_VECTOR:            return \"The vectors passed in are not unit length, or perpendicular.\";\n        case FMOD_ERR_MAXAUDIBLE:                return \"Reached maximum audible playback count for this sound's soundgroup.\";\n        case FMOD_ERR_MEMORY:                    return \"Not enough memory or resources.\";\n        case FMOD_ERR_MEMORY_CANTPOINT:          return \"Can't use FMOD_OPENMEMORY_POINT on non PCM source data, or non mp3/xma/adpcm data if FMOD_CREATECOMPRESSEDSAMPLE was used.\";\n        case FMOD_ERR_NEEDS3D:                   return \"Tried to call a command on a 2d sound when the command was meant for 3d sound.\";\n        case FMOD_ERR_NEEDSHARDWARE:             return \"Tried to use a feature that requires hardware support.\";\n        case FMOD_ERR_NET_CONNECT:               return \"Couldn't connect to the specified host.\";\n        case FMOD_ERR_NET_SOCKET_ERROR:          return \"A socket error occurred.  This is a catch-all for socket-related errors not listed elsewhere.\";\n        case FMOD_ERR_NET_URL:                   return \"The specified URL couldn't be resolved.\";\n        case FMOD_ERR_NET_WOULD_BLOCK:           return \"Operation on a non-blocking socket could not complete immediately.\";\n        case FMOD_ERR_NOTREADY:                  return \"Operation could not be performed because specified sound/DSP connection is not ready.\";\n        case FMOD_ERR_OUTPUT_ALLOCATED:          return \"Error initializing output device, but more specifically, the output device is already in use and cannot be reused.\";\n        case FMOD_ERR_OUTPUT_CREATEBUFFER:       return \"Error creating hardware sound buffer.\";\n        case FMOD_ERR_OUTPUT_DRIVERCALL:         return \"A call to a standard soundcard driver failed, which could possibly mean a bug in the driver or resources were missing or exhausted.\";\n        case FMOD_ERR_OUTPUT_FORMAT:             return \"Soundcard does not support the specified format.\";\n        case FMOD_ERR_OUTPUT_INIT:               return \"Error initializing output device.\";\n        case FMOD_ERR_OUTPUT_NODRIVERS:          return \"The output device has no drivers installed.  If pre-init, FMOD_OUTPUT_NOSOUND is selected as the output mode.  If post-init, the function just fails.\";\n        case FMOD_ERR_PLUGIN:                    return \"An unspecified error has been returned from a plugin.\";\n        case FMOD_ERR_PLUGIN_MISSING:            return \"A requested output, dsp unit type or codec was not available.\";\n        case FMOD_ERR_PLUGIN_RESOURCE:           return \"A resource that the plugin requires cannot be found. (ie the DLS file for MIDI playback)\";\n        case FMOD_ERR_PLUGIN_VERSION:            return \"A plugin was built with an unsupported SDK version.\";\n        case FMOD_ERR_RECORD:                    return \"An error occurred trying to initialize the recording device.\";\n        case FMOD_ERR_REVERB_CHANNELGROUP:       return \"Reverb properties cannot be set on this channel because a parent channelgroup owns the reverb connection.\";\n        case FMOD_ERR_REVERB_INSTANCE:           return \"Specified instance in FMOD_REVERB_PROPERTIES couldn't be set. Most likely because it is an invalid instance number or the reverb doesn't exist.\";\n        case FMOD_ERR_SUBSOUNDS:                 return \"The error occurred because the sound referenced contains subsounds when it shouldn't have, or it doesn't contain subsounds when it should have.  The operation may also not be able to be performed on a parent sound.\";\n        case FMOD_ERR_SUBSOUND_ALLOCATED:        return \"This subsound is already being used by another sound, you cannot have more than one parent to a sound.  Null out the other parent's entry first.\";\n        case FMOD_ERR_SUBSOUND_CANTMOVE:         return \"Shared subsounds cannot be replaced or moved from their parent stream, such as when the parent stream is an FSB file.\";\n        case FMOD_ERR_TAGNOTFOUND:               return \"The specified tag could not be found or there are no tags.\";\n        case FMOD_ERR_TOOMANYCHANNELS:           return \"The sound created exceeds the allowable input channel count.  This can be increased using the 'maxinputchannels' parameter in System::setSoftwareFormat.\";\n        case FMOD_ERR_TRUNCATED:                 return \"The retrieved string is too long to fit in the supplied buffer and has been truncated.\";\n        case FMOD_ERR_UNIMPLEMENTED:             return \"Something in FMOD hasn't been implemented when it should be! contact support!\";\n        case FMOD_ERR_UNINITIALIZED:             return \"This command failed because System::init or System::setDriver was not called.\";\n        case FMOD_ERR_UNSUPPORTED:               return \"A command issued was not supported by this object.  Possibly a plugin without certain callbacks specified.\";\n        case FMOD_ERR_VERSION:                   return \"The version number of this file format is not supported.\";\n        case FMOD_ERR_EVENT_ALREADY_LOADED:      return \"The specified bank has already been loaded.\";\n        case FMOD_ERR_EVENT_LIVEUPDATE_BUSY:     return \"The live update connection failed due to the game already being connected.\";\n        case FMOD_ERR_EVENT_LIVEUPDATE_MISMATCH: return \"The live update connection failed due to the game data being out of sync with the tool.\";\n        case FMOD_ERR_EVENT_LIVEUPDATE_TIMEOUT:  return \"The live update connection timed out.\";\n        case FMOD_ERR_EVENT_NOTFOUND:            return \"The requested event, bus or vca could not be found.\";\n        case FMOD_ERR_STUDIO_UNINITIALIZED:      return \"The Studio::System object is not yet initialized.\";\n        case FMOD_ERR_STUDIO_NOT_LOADED:         return \"The specified resource is not loaded, so it can't be unloaded.\";\n        case FMOD_ERR_INVALID_STRING:            return \"An invalid string was passed to this function.\";\n        case FMOD_ERR_ALREADY_LOCKED:            return \"The specified resource is already locked.\";\n        case FMOD_ERR_NOT_LOCKED:                return \"The specified resource is not locked, so it can't be unlocked.\";\n        case FMOD_ERR_RECORD_DISCONNECTED:       return \"The specified recording driver has been disconnected.\";\n        case FMOD_ERR_TOOMANYSAMPLES:            return \"The length provided exceeds the allowable limit.\";\n        default :                                return \"Unknown error.\";\n/*$ preserve start $*/\n    };\n}\n\n#endif\n/*$ preserve end $*/\n"
  },
  {
    "path": "Plugins/FMODStudio/Source/FMODStudio/Public/FMOD/fmod_nx.h",
    "content": "#ifndef _FMOD_NX_H\n#define _FMOD_NX_H\n\n#include \"fmod.h\"\n\n/*\n[ENUM] \n[\n    [DESCRIPTION]\n    Cores available for thread assignment.\n\n    [REMARKS]\n\n    [SEE_ALSO]\n    FMOD_NX_THREADAFFINITY\n]\n*/\ntypedef enum FMOD_THREAD\n{\n    FMOD_THREAD_DEFAULT = 0,        /* Use default thread assignment. */\n    FMOD_THREAD_CORE0   = 1 << 0,\n    FMOD_THREAD_CORE1   = 1 << 1,\n    FMOD_THREAD_CORE2   = 1 << 2,   /* Default for all threads. */\n} FMOD_THREAD;\n\n\n/*\n[STRUCTURE]\n[\n    [DESCRIPTION]\n    Mapping of cores to threads.\n\n    [REMARKS]\n\n    [SEE_ALSO]\n    FMOD_THREAD\n    FMOD_NX_SetThreadAffinity\n]\n*/\ntypedef struct FMOD_NX_THREADAFFINITY\n{\n    unsigned int mixer;              /* Software mixer thread. */\n    unsigned int stream;             /* Stream thread. */\n    unsigned int nonblocking;        /* Asynchronous sound loading thread. */\n    unsigned int file;               /* File thread. */\n    unsigned int geometry;           /* Geometry processing thread. */\n    unsigned int profiler;           /* Profiler thread. */\n    unsigned int studioUpdate;       /* Studio update thread. */\n    unsigned int studioLoadBank;     /* Studio bank loading thread. */\n    unsigned int studioLoadSample;   /* Studio sample loading thread. */\n} FMOD_NX_THREADAFFINITY;\n\n\n/*\n[API]\n[\n    [DESCRIPTION]\n    Control which core particular FMOD threads are created on.\n\n    [PARAMETERS]\n    'affinity'    Pointer to a structure that describes the affinity for each thread.\n\n    [REMARKS]\n    Call before System::init or affinity values will not apply.\n\n    [SEE_ALSO]\n    FMOD_NX_THREADAFFINITY\n]\n*/\nextern \"C\" FMOD_RESULT F_API FMOD_NX_SetThreadAffinity(FMOD_NX_THREADAFFINITY *affinity);\n\n\n/*\n[API]\n[\n    [DESCRIPTION]\n    Select between nn::htcs (host-target communications) and nn::socket for socket implementation.\n\n    Both nn:socket and nn:htcs support communication with FMOD Profiler and FMOD Studio.\n\n    Net streaming audio is only supported by nn::socket.\n\n    [PARAMETERS]\n    'enabled'   Use HTCS for socket communication. Default = FALSE.\n\n    [REMARKS]\n    Call before System::init or selection will not apply.\n\n    HTCS is only available in the logging version of FMOD.\n\n    [SEE_ALSO]\n]\n*/\nextern \"C\" FMOD_RESULT F_API FMOD_NX_SetHTCSEnabled(FMOD_BOOL enabled);\n\n#endif  /* _FMOD_NX_H */\n"
  },
  {
    "path": "Plugins/FMODStudio/Source/FMODStudio/Public/FMOD/fmod_output.h",
    "content": "/* ======================================================================================================== */\n/* FMOD Studio - output development header file. Copyright (c), Firelight Technologies Pty, Ltd. 2004-2020. */\n/*                                                                                                          */\n/* Use this header if you are wanting to develop your own output plugin to use with                         */\n/* FMOD's output system.  With this header you can make your own output plugin that FMOD                    */\n/* can register and use.  See the documentation and examples on how to make a working plugin.               */\n/*                                                                                                          */\n/* ======================================================================================================== */\n\n#ifndef _FMOD_OUTPUT_H\n#define _FMOD_OUTPUT_H\n\n#define FMOD_OUTPUT_PLUGIN_VERSION 3\n\ntypedef struct FMOD_OUTPUT_STATE        FMOD_OUTPUT_STATE;\ntypedef struct FMOD_OUTPUT_OBJECT3DINFO FMOD_OUTPUT_OBJECT3DINFO;\n\n/*\n    FMOD_OUTPUT_DESCRIPTION callbacks\n*/ \ntypedef FMOD_RESULT (F_CALL *FMOD_OUTPUT_GETNUMDRIVERS_CALLBACK)    (FMOD_OUTPUT_STATE *output_state, int *numdrivers);\ntypedef FMOD_RESULT (F_CALL *FMOD_OUTPUT_GETDRIVERINFO_CALLBACK)    (FMOD_OUTPUT_STATE *output_state, int id, char *name, int namelen, FMOD_GUID *guid, int *systemrate, FMOD_SPEAKERMODE *speakermode, int *speakermodechannels);\ntypedef FMOD_RESULT (F_CALL *FMOD_OUTPUT_INIT_CALLBACK)             (FMOD_OUTPUT_STATE *output_state, int selecteddriver, FMOD_INITFLAGS flags, int *outputrate, FMOD_SPEAKERMODE *speakermode, int *speakermodechannels, FMOD_SOUND_FORMAT *outputformat, int dspbufferlength, int dspnumbuffers, void *extradriverdata);\ntypedef FMOD_RESULT (F_CALL *FMOD_OUTPUT_START_CALLBACK)            (FMOD_OUTPUT_STATE *output_state);\ntypedef FMOD_RESULT (F_CALL *FMOD_OUTPUT_STOP_CALLBACK)             (FMOD_OUTPUT_STATE *output_state);\ntypedef FMOD_RESULT (F_CALL *FMOD_OUTPUT_CLOSE_CALLBACK)            (FMOD_OUTPUT_STATE *output_state);\ntypedef FMOD_RESULT (F_CALL *FMOD_OUTPUT_UPDATE_CALLBACK)           (FMOD_OUTPUT_STATE *output_state);\ntypedef FMOD_RESULT (F_CALL *FMOD_OUTPUT_GETHANDLE_CALLBACK)        (FMOD_OUTPUT_STATE *output_state, void **handle);\ntypedef FMOD_RESULT (F_CALL *FMOD_OUTPUT_GETPOSITION_CALLBACK)      (FMOD_OUTPUT_STATE *output_state, unsigned int *pcm);\ntypedef FMOD_RESULT (F_CALL *FMOD_OUTPUT_LOCK_CALLBACK)             (FMOD_OUTPUT_STATE *output_state, unsigned int offset, unsigned int length, void **ptr1, void **ptr2, unsigned int *len1, unsigned int *len2);\ntypedef FMOD_RESULT (F_CALL *FMOD_OUTPUT_UNLOCK_CALLBACK)           (FMOD_OUTPUT_STATE *output_state, void *ptr1, void *ptr2, unsigned int len1, unsigned int len2);\ntypedef FMOD_RESULT (F_CALL *FMOD_OUTPUT_MIXER_CALLBACK)            (FMOD_OUTPUT_STATE *output_state);\n\ntypedef FMOD_RESULT (F_CALL *FMOD_OUTPUT_OBJECT3DGETINFO_CALLBACK)  (FMOD_OUTPUT_STATE *output_state, int *maxhardwareobjects);\ntypedef FMOD_RESULT (F_CALL *FMOD_OUTPUT_OBJECT3DALLOC_CALLBACK)    (FMOD_OUTPUT_STATE *output_state, void **object3d);\ntypedef FMOD_RESULT (F_CALL *FMOD_OUTPUT_OBJECT3DFREE_CALLBACK)     (FMOD_OUTPUT_STATE *output_state, void *object3d);\ntypedef FMOD_RESULT (F_CALL *FMOD_OUTPUT_OBJECT3DUPDATE_CALLBACK)   (FMOD_OUTPUT_STATE *output_state, void *object3d, const FMOD_OUTPUT_OBJECT3DINFO *info);\n\ntypedef FMOD_RESULT (F_CALL *FMOD_OUTPUT_OPENPORT_CALLBACK)         (FMOD_OUTPUT_STATE *output_state, FMOD_PORT_TYPE portType, FMOD_PORT_INDEX portIndex, int *portId, int *portRate, int *portChannels, FMOD_SOUND_FORMAT *portFormat);\ntypedef FMOD_RESULT (F_CALL *FMOD_OUTPUT_CLOSEPORT_CALLBACK)        (FMOD_OUTPUT_STATE *output_state, int portId);\n\n\n/*\n    FMOD_OUTPUT_STATE functions\n*/\ntypedef FMOD_RESULT (F_CALL *FMOD_OUTPUT_READFROMMIXER_FUNC)        (FMOD_OUTPUT_STATE *output_state, void *buffer, unsigned int length);\ntypedef FMOD_RESULT (F_CALL *FMOD_OUTPUT_COPYPORT_FUNC)             (FMOD_OUTPUT_STATE *output_state, int portId, void *buffer, unsigned int length);\ntypedef FMOD_RESULT (F_CALL *FMOD_OUTPUT_REQUESTRESET_FUNC)         (FMOD_OUTPUT_STATE *output_state);\ntypedef void *      (F_CALL *FMOD_OUTPUT_ALLOC_FUNC)                (unsigned int size, unsigned int align, const char *file, int line);\ntypedef void        (F_CALL *FMOD_OUTPUT_FREE_FUNC)                 (void *ptr, const char *file, int line);\ntypedef void        (F_CALL *FMOD_OUTPUT_LOG_FUNC)                  (FMOD_DEBUG_FLAGS level, const char *file, int line, const char *function, const char *string, ...);\n\n\n/*\n[STRUCTURE]\n[\n    [DESCRIPTION]\n    When creating an output, declare one of these and provide the relevant callbacks and name for FMOD to use when it creates and uses an output of this type.\n\n    [REMARKS]\n    There are several methods for driving the FMOD mixer to service the audio hardware.\n\n    * Polled: if the audio hardware must be polled regularly set 'polling' to TRUE, FMOD will create a mixer thread that calls back via FMOD_OUTPUT_GETPOSITION_CALLBACK. Once an entire block of samples have played FMOD will call FMOD_OUTPUT_LOCK_CALLBACK to allow you to provide a destination pointer to write the next mix.\n    * Callback: if the audio hardware provides a callback where you must provide a buffer of samples then set 'polling' to FALSE and directly call FMOD_OUTPUT_READFROMMIXER.\n    * Synchronization: if the audio hardware provides a synchronization primitive to wait on then set 'polling' to FALSE and give a FMOD_OUTPUT_MIXER_CALLBACK pointer. FMOD will create a mixer thread and call you repeatedly once FMOD_OUTPUT_START_CALLBACK has finished, you must wait on your primitive in this callback and upon wake call FMOD_OUTPUT_READFROMMIXER.\n    * Non-realtime: if you are writing a file or driving a non-realtime output call FMOD_OUTPUT_READFROMMIXER from FMOD_OUTPUT_UPDATE_CALLBACK.\n\n    Callbacks marked with 'user thread' will be called in response to the user of the FMOD low level API, in the case of the Studio runtime API, the user is the Studio Update thread.\n\n    Members marked with [r] mean read only for the developer, read/write for the FMOD system.\n\n    Members marked with [w] mean read/write for the developer, read only for the FMOD system.\n\n    [SEE_ALSO]\n    FMOD_OUTPUT_STATE\n    FMOD_OUTPUT_GETNUMDRIVERS_CALLBACK\n    FMOD_OUTPUT_GETDRIVERINFO_CALLBACK\n    FMOD_OUTPUT_INIT_CALLBACK\n    FMOD_OUTPUT_START_CALLBACK\n    FMOD_OUTPUT_STOP_CALLBACK\n    FMOD_OUTPUT_CLOSE_CALLBACK\n    FMOD_OUTPUT_UPDATE_CALLBACK\n    FMOD_OUTPUT_GETHANDLE_CALLBACK\n    FMOD_OUTPUT_GETPOSITION_CALLBACK\n    FMOD_OUTPUT_LOCK_CALLBACK\n    FMOD_OUTPUT_UNLOCK_CALLBACK\n    FMOD_OUTPUT_MIXER_CALLBACK\n    FMOD_OUTPUT_OBJECT3DGETINFO_CALLBACK\n    FMOD_OUTPUT_OBJECT3DALLOC_CALLBACK\n    FMOD_OUTPUT_OBJECT3DFREE_CALLBACK\n    FMOD_OUTPUT_OBJECT3DUPDATE_CALLBACK\n]\n*/\ntypedef struct FMOD_OUTPUT_DESCRIPTION\n{\n    unsigned int                            apiversion;         /* [w] The output plugin API version this plugin is built for. Set to this to FMOD_OUTPUT_PLUGIN_VERSION. */\n    const char                             *name;               /* [w] Name of the output plugin. */\n    unsigned int                            version;            /* [w] Version of the output plugin. */\n    int                                     polling;            /* [w] If TRUE (non-zero) a mixer thread is created that calls FMOD_OUTPUT_GETPOSITION_CALLBACK / FMOD_OUTPUT_LOCK_CALLBACK / FMOD_OUTPUT_UNLOCK_CALLBACK to drive the mixer. If FALSE (zero) you must call FMOD_OUTPUT_READFROMMIXER to drive the mixer yourself. */\n    FMOD_OUTPUT_GETNUMDRIVERS_CALLBACK      getnumdrivers;      /* [w] Required user thread callback to provide the number of attached sound devices. Called from System::getNumDrivers. */\n    FMOD_OUTPUT_GETDRIVERINFO_CALLBACK      getdriverinfo;      /* [w] Required user thread callback to provide information about a particular sound device. Called from System::getDriverInfo. */\n    FMOD_OUTPUT_INIT_CALLBACK               init;               /* [w] Required user thread callback to allocate resources and provide information about hardware capabilities. Called from System::init. */\n    FMOD_OUTPUT_START_CALLBACK              start;              /* [w] Optional user thread callback just before mixing should begin, calls to FMOD_OUTPUT_GETPOSITION_CALLBACK / FMOD_OUTPUT_LOCK_CALLBACK / FMOD_OUTPUT_UNLOCK_CALLBACK / FMOD_OUTPUT_MIXER_CALLBACK will start, you may call FMOD_OUTPUT_READFROMMIXER after this point. Called from System::init. */\n    FMOD_OUTPUT_STOP_CALLBACK               stop;               /* [w] Optional user thread callback just after mixing has finished, calls to FMOD_OUTPUT_GETPOSITION_CALLBACK / FMOD_OUTPUT_LOCK_CALLBACK / FMOD_OUTPUT_UNLOCK_CALLBACK / FMOD_OUTPUT_MIXER_CALLBACK have stopped, you may not call FMOD_OUTPUT_READFROMMIXER after this point. Called from System::close. */\n    FMOD_OUTPUT_CLOSE_CALLBACK              close;              /* [w] Required user thread callback to clean up resources allocated during FMOD_OUTPUT_INIT_CALLBACK. Called from System::init and System::close. */\n    FMOD_OUTPUT_UPDATE_CALLBACK             update;             /* [w] Optional user thread callback once per frame to update internal state. Called from System::update. */\n    FMOD_OUTPUT_GETHANDLE_CALLBACK          gethandle;          /* [w] Optional user thread callback to provide a pointer to the internal device object used to share with other audio systems. Called from System::getOutputHandle. */\n    FMOD_OUTPUT_GETPOSITION_CALLBACK        getposition;        /* [w] Required mixer thread callback (if 'polling' is TRUE) to provide the hardware playback position in the output ring buffer. Called before a mix. */\n    FMOD_OUTPUT_LOCK_CALLBACK               lock;               /* [w] Required mixer thread callback (if 'polling' is TRUE) to provide a pointer the mixer can write to for the next block of audio data. Called before a mix. */\n    FMOD_OUTPUT_UNLOCK_CALLBACK             unlock;             /* [w] Optional mixer thread callback (if 'polling' is TRUE) to signify the mixer has finished writing to the pointer from FMOD_OUTPUT_LOCK_CALLBACK. Called after a mix. */\n    FMOD_OUTPUT_MIXER_CALLBACK              mixer;              /* [w] Optional mixer thread callback (if 'polling' is FALSE) called repeatedly to give a thread for waiting on an audio hardware synchronization primitive (see remarks for details). Ensure you have a reasonable timeout (~200ms) on your synchronization primitive and allow this callback to return once per wakeup to avoid deadlocks. */\n    FMOD_OUTPUT_OBJECT3DGETINFO_CALLBACK    object3dgetinfo;    /* [w] Optional mixer thread callback to provide information about the capabilities of 3D object hardware. Called during a mix. */\n    FMOD_OUTPUT_OBJECT3DALLOC_CALLBACK      object3dalloc;      /* [w] Optional mixer thread callback to reserve a hardware resources for a single 3D object. Called during a mix. */\n    FMOD_OUTPUT_OBJECT3DFREE_CALLBACK       object3dfree;       /* [w] Optional mixer thread callback to release a hardware resource previously acquired with FMOD_OUTPUT_OBJECT3DALLOC_CALLBACK. Called during a mix. */\n    FMOD_OUTPUT_OBJECT3DUPDATE_CALLBACK     object3dupdate;     /* [w] Optional mixer thread callback once for every acquired 3D object every mix to provide 3D information and buffered audio. Called during a mix. */\n    FMOD_OUTPUT_OPENPORT_CALLBACK           openport;           /* [w] Optional main thread callback to open an auxiliary output port on the device. */\n    FMOD_OUTPUT_CLOSEPORT_CALLBACK          closeport;          /* [w] Optional main thread callback to close an auxiliary output port on the device. */\n} FMOD_OUTPUT_DESCRIPTION;\n\n\n/*\n[STRUCTURE]\n[\n    [DESCRIPTION]\n    Output object state passed into every callback provides access to plugin developers data and system functionality.\n\n    [REMARKS]\n    Members marked with [r] mean read only for the developer, read/write for the FMOD system.\n    Members marked with [w] mean read/write for the developer, read only for the FMOD system.\n\n    [SEE_ALSO]\n    FMOD_OUTPUT_DESCRIPTION\n]\n*/\nstruct FMOD_OUTPUT_STATE\n{\n    void                            *plugindata;     /* [w] Pointer used to store any plugin specific state so it's available in all callbacks. */\n    FMOD_OUTPUT_READFROMMIXER_FUNC   readfrommixer;  /* [r] Function to execute the mixer producing a buffer of audio. Used to control when the mix occurs manually as an alternative to FMOD_OUTPUT_DESCRIPTION::polling == TRUE. */\n    FMOD_OUTPUT_ALLOC_FUNC           alloc;          /* [r] Function to allocate memory using the FMOD memory system. */\n    FMOD_OUTPUT_FREE_FUNC            free;           /* [r] Function to free memory allocated with FMOD_OUTPUT_ALLOC. */\n    FMOD_OUTPUT_LOG_FUNC             log;            /* [r] Function to write to the FMOD logging system. */\n    FMOD_OUTPUT_COPYPORT_FUNC        copyport;       /* [r] Function to copy the output from the mixer for the given auxiliary port. */\n    FMOD_OUTPUT_REQUESTRESET_FUNC    requestreset;   /* [r] Function to request the output plugin be shutdown then restarted during the next System::update. */\n};\n\n\n/*\n[STRUCTURE]\n[\n    [DESCRIPTION]\n    This structure is passed to the plugin via FMOD_OUTPUT_OBJECT3DUPDATE_CALLBACK, so that whatever object based panning solution available can position it in the speakers correctly.\n    Object based panning is a 3D panning solution that sends a mono only signal to a hardware device, such as Dolby Atmos or other similar panning solutions.\n\n    [REMARKS]\n    FMOD does not attenuate the buffer, but provides a 'gain' parameter that the user must use to scale the buffer by.  Rather than pre-attenuating the buffer, the plugin developer\n    can access untouched data for other purposes, like reverb sending for example.\n    The 'gain' parameter is based on the user's 3D custom rolloff model.  \n    \n    Members marked with [r] mean read only for the developer, read/write for the FMOD system.\n    Members marked with [w] mean read/write for the developer, read only for the FMOD system.\n\n    [SEE_ALSO]\n    FMOD_OUTPUT_OBJECT3DUPDATE_CALLBACK\n]\n*/\nstruct FMOD_OUTPUT_OBJECT3DINFO\n{\n    float          *buffer;         /* [r] Mono PCM floating point buffer. This buffer needs to be scaled by the gain value to get distance attenuation.  */\n    unsigned int    bufferlength;   /* [r] Length in PCM samples of buffer. */\n    FMOD_VECTOR     position;       /* [r] Vector relative between object and listener. */\n    float           gain;           /* [r] 0.0 to 1.0 - 1 = 'buffer' is not attenuated, 0 = 'buffer' is fully attenuated. */\n    float           spread;         /* [r] 0 - 360 degrees.  0 = point source, 360 = sound is spread around all speakers */\n    float           priority;       /* [r] 0.0 to 1.0 - 0 = most important, 1 = least important. Based on height and distance (height is more important). */\n};\n\n\n/*\n    Macro helpers for accessing FMOD_OUTPUT_STATE functions\n*/\n#define FMOD_OUTPUT_READFROMMIXER(_state, _buffer, _length) \\\n    (_state)->readfrommixer(_state, _buffer, _length)\n#define FMOD_OUTPUT_ALLOC(_state, _size, _align) \\\n    (_state)->alloc(_size, _align, __FILE__, __LINE__)\n#define FMOD_OUTPUT_FREE(_state, _ptr) \\\n    (_state)->free(_ptr, __FILE__, __LINE__)\n#define FMOD_OUTPUT_LOG(_state, _level, _location, _format, ...) \\\n    (_state)->log(_level, __FILE__, __LINE__, _location, _format, __VA_ARGS__)\n#define FMOD_OUTPUT_COPYPORT(_state, _id, _buffer, _length) \\\n    (_state)->copyport(_state, _id, _buffer, _length)\n#define FMOD_OUTPUT_REQUESTRESET(_state) \\\n    (_state)->requestreset(_state)\n\n#endif /* _FMOD_OUTPUT_H */\n"
  },
  {
    "path": "Plugins/FMODStudio/Source/FMODStudio/Public/FMOD/fmod_studio.h",
    "content": "/*$ preserve start $*/\n\n/*\n    fmod_studio.h - FMOD Studio API\n    Copyright (c), Firelight Technologies Pty, Ltd. 2020.\n\n    This header defines the C API. If you are programming in C++ use fmod_studio.hpp.\n*/\n\n#ifndef FMOD_STUDIO_H\n#define FMOD_STUDIO_H\n\n#include \"fmod_studio_common.h\"\n\n#ifdef __cplusplus\nextern \"C\" \n{\n#endif\n\n/*\n    Global\n*/\nFMOD_RESULT F_API FMOD_Studio_ParseID(const char *idstring, FMOD_GUID *id);\nFMOD_RESULT F_API FMOD_Studio_System_Create(FMOD_STUDIO_SYSTEM **system, unsigned int headerversion);\n\n/*$ preserve end $*/\n\n/*\n    System\n*/\nFMOD_BOOL   F_API FMOD_Studio_System_IsValid(FMOD_STUDIO_SYSTEM *system);\nFMOD_RESULT F_API FMOD_Studio_System_SetAdvancedSettings(FMOD_STUDIO_SYSTEM *system, FMOD_STUDIO_ADVANCEDSETTINGS *settings);\nFMOD_RESULT F_API FMOD_Studio_System_GetAdvancedSettings(FMOD_STUDIO_SYSTEM *system, FMOD_STUDIO_ADVANCEDSETTINGS *settings);\nFMOD_RESULT F_API FMOD_Studio_System_Initialize(FMOD_STUDIO_SYSTEM *system, int maxchannels, FMOD_STUDIO_INITFLAGS studioflags, FMOD_INITFLAGS flags, void *extradriverdata);\nFMOD_RESULT F_API FMOD_Studio_System_Release(FMOD_STUDIO_SYSTEM *system);\nFMOD_RESULT F_API FMOD_Studio_System_Update(FMOD_STUDIO_SYSTEM *system);\nFMOD_RESULT F_API FMOD_Studio_System_GetLowLevelSystem(FMOD_STUDIO_SYSTEM *system, FMOD_SYSTEM **lowlevelsystem);\nFMOD_RESULT F_API FMOD_Studio_System_GetEvent(FMOD_STUDIO_SYSTEM *system, const char *pathOrID, FMOD_STUDIO_EVENTDESCRIPTION **event);\nFMOD_RESULT F_API FMOD_Studio_System_GetBus(FMOD_STUDIO_SYSTEM *system, const char *pathOrID, FMOD_STUDIO_BUS **bus);\nFMOD_RESULT F_API FMOD_Studio_System_GetVCA(FMOD_STUDIO_SYSTEM *system, const char *pathOrID, FMOD_STUDIO_VCA **vca);\nFMOD_RESULT F_API FMOD_Studio_System_GetBank(FMOD_STUDIO_SYSTEM *system, const char *pathOrID, FMOD_STUDIO_BANK **bank);\nFMOD_RESULT F_API FMOD_Studio_System_GetEventByID(FMOD_STUDIO_SYSTEM *system, const FMOD_GUID *id, FMOD_STUDIO_EVENTDESCRIPTION **event);\nFMOD_RESULT F_API FMOD_Studio_System_GetBusByID(FMOD_STUDIO_SYSTEM *system, const FMOD_GUID *id, FMOD_STUDIO_BUS **bus);\nFMOD_RESULT F_API FMOD_Studio_System_GetVCAByID(FMOD_STUDIO_SYSTEM *system, const FMOD_GUID *id, FMOD_STUDIO_VCA **vca);\nFMOD_RESULT F_API FMOD_Studio_System_GetBankByID(FMOD_STUDIO_SYSTEM *system, const FMOD_GUID *id, FMOD_STUDIO_BANK **bank);\nFMOD_RESULT F_API FMOD_Studio_System_GetSoundInfo(FMOD_STUDIO_SYSTEM *system, const char *key, FMOD_STUDIO_SOUND_INFO *info);\nFMOD_RESULT F_API FMOD_Studio_System_LookupID(FMOD_STUDIO_SYSTEM *system, const char *path, FMOD_GUID *id);\nFMOD_RESULT F_API FMOD_Studio_System_LookupPath(FMOD_STUDIO_SYSTEM *system, const FMOD_GUID *id, char *path, int size, int *retrieved);\nFMOD_RESULT F_API FMOD_Studio_System_GetNumListeners(FMOD_STUDIO_SYSTEM *system, int *numlisteners);\nFMOD_RESULT F_API FMOD_Studio_System_SetNumListeners(FMOD_STUDIO_SYSTEM *system, int numlisteners);\nFMOD_RESULT F_API FMOD_Studio_System_GetListenerAttributes(FMOD_STUDIO_SYSTEM *system, int index, FMOD_3D_ATTRIBUTES *attributes);\nFMOD_RESULT F_API FMOD_Studio_System_SetListenerAttributes(FMOD_STUDIO_SYSTEM *system, int index, FMOD_3D_ATTRIBUTES *attributes);\nFMOD_RESULT F_API FMOD_Studio_System_GetListenerWeight(FMOD_STUDIO_SYSTEM *system, int index, float *weight);\nFMOD_RESULT F_API FMOD_Studio_System_SetListenerWeight(FMOD_STUDIO_SYSTEM *system, int index, float weight);\nFMOD_RESULT F_API FMOD_Studio_System_LoadBankFile(FMOD_STUDIO_SYSTEM *system, const char *filename, FMOD_STUDIO_LOAD_BANK_FLAGS flags, FMOD_STUDIO_BANK **bank);\nFMOD_RESULT F_API FMOD_Studio_System_LoadBankMemory(FMOD_STUDIO_SYSTEM *system, const char *buffer, int length, FMOD_STUDIO_LOAD_MEMORY_MODE mode, FMOD_STUDIO_LOAD_BANK_FLAGS flags, FMOD_STUDIO_BANK **bank);\nFMOD_RESULT F_API FMOD_Studio_System_LoadBankCustom(FMOD_STUDIO_SYSTEM *system, const FMOD_STUDIO_BANK_INFO *info, FMOD_STUDIO_LOAD_BANK_FLAGS flags, FMOD_STUDIO_BANK **bank);\nFMOD_RESULT F_API FMOD_Studio_System_RegisterPlugin(FMOD_STUDIO_SYSTEM *system, const FMOD_DSP_DESCRIPTION *description);\nFMOD_RESULT F_API FMOD_Studio_System_UnregisterPlugin(FMOD_STUDIO_SYSTEM *system, const char *name);\nFMOD_RESULT F_API FMOD_Studio_System_UnloadAll(FMOD_STUDIO_SYSTEM *system);\nFMOD_RESULT F_API FMOD_Studio_System_FlushCommands(FMOD_STUDIO_SYSTEM *system);\nFMOD_RESULT F_API FMOD_Studio_System_FlushSampleLoading(FMOD_STUDIO_SYSTEM *system);\nFMOD_RESULT F_API FMOD_Studio_System_StartCommandCapture(FMOD_STUDIO_SYSTEM *system, const char *filename, FMOD_STUDIO_COMMANDCAPTURE_FLAGS flags);\nFMOD_RESULT F_API FMOD_Studio_System_StopCommandCapture(FMOD_STUDIO_SYSTEM *system);\nFMOD_RESULT F_API FMOD_Studio_System_LoadCommandReplay(FMOD_STUDIO_SYSTEM *system, const char *filename, FMOD_STUDIO_COMMANDREPLAY_FLAGS flags, FMOD_STUDIO_COMMANDREPLAY **replay);\nFMOD_RESULT F_API FMOD_Studio_System_GetBankCount(FMOD_STUDIO_SYSTEM *system, int *count);\nFMOD_RESULT F_API FMOD_Studio_System_GetBankList(FMOD_STUDIO_SYSTEM *system, FMOD_STUDIO_BANK **array, int capacity, int *count);\nFMOD_RESULT F_API FMOD_Studio_System_GetCPUUsage(FMOD_STUDIO_SYSTEM *system, FMOD_STUDIO_CPU_USAGE *usage);\nFMOD_RESULT F_API FMOD_Studio_System_GetBufferUsage(FMOD_STUDIO_SYSTEM *system, FMOD_STUDIO_BUFFER_USAGE *usage);\nFMOD_RESULT F_API FMOD_Studio_System_ResetBufferUsage(FMOD_STUDIO_SYSTEM *system);\nFMOD_RESULT F_API FMOD_Studio_System_SetCallback(FMOD_STUDIO_SYSTEM *system, FMOD_STUDIO_SYSTEM_CALLBACK callback, FMOD_STUDIO_SYSTEM_CALLBACK_TYPE callbackmask);\nFMOD_RESULT F_API FMOD_Studio_System_SetUserData(FMOD_STUDIO_SYSTEM *system, void *userdata);\nFMOD_RESULT F_API FMOD_Studio_System_GetUserData(FMOD_STUDIO_SYSTEM *system, void **userdata);\n\n/*\n    EventDescription\n*/\nFMOD_BOOL   F_API FMOD_Studio_EventDescription_IsValid(FMOD_STUDIO_EVENTDESCRIPTION *eventdescription);\nFMOD_RESULT F_API FMOD_Studio_EventDescription_GetID(FMOD_STUDIO_EVENTDESCRIPTION *eventdescription, FMOD_GUID *id);\nFMOD_RESULT F_API FMOD_Studio_EventDescription_GetPath(FMOD_STUDIO_EVENTDESCRIPTION *eventdescription, char *path, int size, int *retrieved);\nFMOD_RESULT F_API FMOD_Studio_EventDescription_GetParameterCount(FMOD_STUDIO_EVENTDESCRIPTION *eventdescription, int *count);\nFMOD_RESULT F_API FMOD_Studio_EventDescription_GetParameterByIndex(FMOD_STUDIO_EVENTDESCRIPTION *eventdescription, int index, FMOD_STUDIO_PARAMETER_DESCRIPTION *parameter);\nFMOD_RESULT F_API FMOD_Studio_EventDescription_GetParameter(FMOD_STUDIO_EVENTDESCRIPTION *eventdescription, const char *name, FMOD_STUDIO_PARAMETER_DESCRIPTION *parameter);\nFMOD_RESULT F_API FMOD_Studio_EventDescription_GetUserPropertyCount(FMOD_STUDIO_EVENTDESCRIPTION *eventdescription, int *count);\nFMOD_RESULT F_API FMOD_Studio_EventDescription_GetUserPropertyByIndex(FMOD_STUDIO_EVENTDESCRIPTION *eventdescription, int index, FMOD_STUDIO_USER_PROPERTY *property);\nFMOD_RESULT F_API FMOD_Studio_EventDescription_GetUserProperty(FMOD_STUDIO_EVENTDESCRIPTION *eventdescription, const char *name, FMOD_STUDIO_USER_PROPERTY *property);\nFMOD_RESULT F_API FMOD_Studio_EventDescription_GetLength(FMOD_STUDIO_EVENTDESCRIPTION *eventdescription, int *length);\nFMOD_RESULT F_API FMOD_Studio_EventDescription_GetMinimumDistance(FMOD_STUDIO_EVENTDESCRIPTION *eventdescription, float *distance);\nFMOD_RESULT F_API FMOD_Studio_EventDescription_GetMaximumDistance(FMOD_STUDIO_EVENTDESCRIPTION *eventdescription, float *distance);\nFMOD_RESULT F_API FMOD_Studio_EventDescription_GetSoundSize(FMOD_STUDIO_EVENTDESCRIPTION *eventdescription, float *size);\nFMOD_RESULT F_API FMOD_Studio_EventDescription_IsSnapshot(FMOD_STUDIO_EVENTDESCRIPTION *eventdescription, FMOD_BOOL *snapshot);\nFMOD_RESULT F_API FMOD_Studio_EventDescription_IsOneshot(FMOD_STUDIO_EVENTDESCRIPTION *eventdescription, FMOD_BOOL *oneshot);\nFMOD_RESULT F_API FMOD_Studio_EventDescription_IsStream(FMOD_STUDIO_EVENTDESCRIPTION *eventdescription, FMOD_BOOL *isStream);\nFMOD_RESULT F_API FMOD_Studio_EventDescription_Is3D(FMOD_STUDIO_EVENTDESCRIPTION *eventdescription, FMOD_BOOL *is3D);\nFMOD_RESULT F_API FMOD_Studio_EventDescription_HasCue(FMOD_STUDIO_EVENTDESCRIPTION *eventdescription, FMOD_BOOL *cue);\nFMOD_RESULT F_API FMOD_Studio_EventDescription_CreateInstance(FMOD_STUDIO_EVENTDESCRIPTION *eventdescription, FMOD_STUDIO_EVENTINSTANCE **instance);\nFMOD_RESULT F_API FMOD_Studio_EventDescription_GetInstanceCount(FMOD_STUDIO_EVENTDESCRIPTION *eventdescription, int *count);\nFMOD_RESULT F_API FMOD_Studio_EventDescription_GetInstanceList(FMOD_STUDIO_EVENTDESCRIPTION *eventdescription, FMOD_STUDIO_EVENTINSTANCE **array, int capacity, int *count);\nFMOD_RESULT F_API FMOD_Studio_EventDescription_LoadSampleData(FMOD_STUDIO_EVENTDESCRIPTION *eventDesc);\nFMOD_RESULT F_API FMOD_Studio_EventDescription_UnloadSampleData(FMOD_STUDIO_EVENTDESCRIPTION *eventDesc);\nFMOD_RESULT F_API FMOD_Studio_EventDescription_GetSampleLoadingState(FMOD_STUDIO_EVENTDESCRIPTION *eventDesc, FMOD_STUDIO_LOADING_STATE *state);\nFMOD_RESULT F_API FMOD_Studio_EventDescription_ReleaseAllInstances(FMOD_STUDIO_EVENTDESCRIPTION *eventdescription);\nFMOD_RESULT F_API FMOD_Studio_EventDescription_SetCallback(FMOD_STUDIO_EVENTDESCRIPTION *eventdescription, FMOD_STUDIO_EVENT_CALLBACK callback, FMOD_STUDIO_EVENT_CALLBACK_TYPE callbackmask);\nFMOD_RESULT F_API FMOD_Studio_EventDescription_GetUserData(FMOD_STUDIO_EVENTDESCRIPTION *eventdescription, void **userdata);\nFMOD_RESULT F_API FMOD_Studio_EventDescription_SetUserData(FMOD_STUDIO_EVENTDESCRIPTION *eventdescription, void *userdata);   \n\n/*\n    EventInstance\n*/\nFMOD_BOOL   F_API FMOD_Studio_EventInstance_IsValid(FMOD_STUDIO_EVENTINSTANCE *eventinstance);\nFMOD_RESULT F_API FMOD_Studio_EventInstance_GetDescription(FMOD_STUDIO_EVENTINSTANCE *eventinstance, FMOD_STUDIO_EVENTDESCRIPTION **description);\nFMOD_RESULT F_API FMOD_Studio_EventInstance_GetVolume(FMOD_STUDIO_EVENTINSTANCE *eventinstance, float *volume, float *finalvolume);\nFMOD_RESULT F_API FMOD_Studio_EventInstance_SetVolume(FMOD_STUDIO_EVENTINSTANCE *eventinstance, float volume);\nFMOD_RESULT F_API FMOD_Studio_EventInstance_GetPitch(FMOD_STUDIO_EVENTINSTANCE *eventinstance, float *pitch, float *finalpitch);\nFMOD_RESULT F_API FMOD_Studio_EventInstance_SetPitch(FMOD_STUDIO_EVENTINSTANCE *eventinstance, float pitch);\nFMOD_RESULT F_API FMOD_Studio_EventInstance_Get3DAttributes(FMOD_STUDIO_EVENTINSTANCE *eventinstance, FMOD_3D_ATTRIBUTES *attributes);\nFMOD_RESULT F_API FMOD_Studio_EventInstance_Set3DAttributes(FMOD_STUDIO_EVENTINSTANCE *eventinstance, FMOD_3D_ATTRIBUTES *attributes);\nFMOD_RESULT F_API FMOD_Studio_EventInstance_GetListenerMask(FMOD_STUDIO_EVENTINSTANCE *eventinstance, unsigned int *mask);\nFMOD_RESULT F_API FMOD_Studio_EventInstance_SetListenerMask(FMOD_STUDIO_EVENTINSTANCE *eventinstance, unsigned int mask);\nFMOD_RESULT F_API FMOD_Studio_EventInstance_GetProperty(FMOD_STUDIO_EVENTINSTANCE *eventinstance, FMOD_STUDIO_EVENT_PROPERTY index, float *value);\nFMOD_RESULT F_API FMOD_Studio_EventInstance_SetProperty(FMOD_STUDIO_EVENTINSTANCE *eventinstance, FMOD_STUDIO_EVENT_PROPERTY index, float value);\nFMOD_RESULT F_API FMOD_Studio_EventInstance_GetReverbLevel(FMOD_STUDIO_EVENTINSTANCE *eventinstance, int index, float *level);\nFMOD_RESULT F_API FMOD_Studio_EventInstance_SetReverbLevel(FMOD_STUDIO_EVENTINSTANCE *eventinstance, int index, float level);\nFMOD_RESULT F_API FMOD_Studio_EventInstance_GetPaused(FMOD_STUDIO_EVENTINSTANCE *eventinstance, FMOD_BOOL *paused);\nFMOD_RESULT F_API FMOD_Studio_EventInstance_SetPaused(FMOD_STUDIO_EVENTINSTANCE *eventinstance, FMOD_BOOL paused);\nFMOD_RESULT F_API FMOD_Studio_EventInstance_Start(FMOD_STUDIO_EVENTINSTANCE *eventinstance);\nFMOD_RESULT F_API FMOD_Studio_EventInstance_Stop(FMOD_STUDIO_EVENTINSTANCE *eventinstance, FMOD_STUDIO_STOP_MODE mode);\nFMOD_RESULT F_API FMOD_Studio_EventInstance_GetTimelinePosition(FMOD_STUDIO_EVENTINSTANCE *eventinstance, int *position);\nFMOD_RESULT F_API FMOD_Studio_EventInstance_SetTimelinePosition(FMOD_STUDIO_EVENTINSTANCE *eventinstance, int position);\nFMOD_RESULT F_API FMOD_Studio_EventInstance_GetPlaybackState(FMOD_STUDIO_EVENTINSTANCE *eventinstance, FMOD_STUDIO_PLAYBACK_STATE *state);\nFMOD_RESULT F_API FMOD_Studio_EventInstance_GetChannelGroup(FMOD_STUDIO_EVENTINSTANCE *eventinstance, FMOD_CHANNELGROUP **group);\nFMOD_RESULT F_API FMOD_Studio_EventInstance_Release(FMOD_STUDIO_EVENTINSTANCE *eventinstance);\nFMOD_RESULT F_API FMOD_Studio_EventInstance_IsVirtual(FMOD_STUDIO_EVENTINSTANCE *eventinstance, FMOD_BOOL *virtualstate);\nFMOD_RESULT F_API FMOD_Studio_EventInstance_GetParameter(FMOD_STUDIO_EVENTINSTANCE *eventinstance, const char *name, FMOD_STUDIO_PARAMETERINSTANCE **parameter);\nFMOD_RESULT F_API FMOD_Studio_EventInstance_GetParameterByIndex(FMOD_STUDIO_EVENTINSTANCE *eventinstance, int index, FMOD_STUDIO_PARAMETERINSTANCE **parameter);\nFMOD_RESULT F_API FMOD_Studio_EventInstance_GetParameterCount(FMOD_STUDIO_EVENTINSTANCE *eventinstance, int *count);\nFMOD_RESULT F_API FMOD_Studio_EventInstance_GetParameterValue(FMOD_STUDIO_EVENTINSTANCE *eventinstance, const char *name, float *value, float *finalvalue);\nFMOD_RESULT F_API FMOD_Studio_EventInstance_SetParameterValue(FMOD_STUDIO_EVENTINSTANCE *eventinstance, const char *name, float value);\nFMOD_RESULT F_API FMOD_Studio_EventInstance_GetParameterValueByIndex(FMOD_STUDIO_EVENTINSTANCE *eventinstance, int index, float *value, float *finalvalue);\nFMOD_RESULT F_API FMOD_Studio_EventInstance_SetParameterValueByIndex(FMOD_STUDIO_EVENTINSTANCE *eventinstance, int index, float value);\nFMOD_RESULT F_API FMOD_Studio_EventInstance_SetParameterValuesByIndices(FMOD_STUDIO_EVENTINSTANCE *eventinstance, int *indices, float *values, int count);\nFMOD_RESULT F_API FMOD_Studio_EventInstance_TriggerCue(FMOD_STUDIO_EVENTINSTANCE *eventinstance);\nFMOD_RESULT F_API FMOD_Studio_EventInstance_SetCallback(FMOD_STUDIO_EVENTINSTANCE *eventinstance, FMOD_STUDIO_EVENT_CALLBACK callback, FMOD_STUDIO_EVENT_CALLBACK_TYPE callbackmask);\nFMOD_RESULT F_API FMOD_Studio_EventInstance_GetUserData(FMOD_STUDIO_EVENTINSTANCE *eventinstance, void **userdata);\nFMOD_RESULT F_API FMOD_Studio_EventInstance_SetUserData(FMOD_STUDIO_EVENTINSTANCE *eventinstance, void *userdata);\n\n/*\n    ParameterInstance\n*/\nFMOD_BOOL   F_API FMOD_Studio_ParameterInstance_IsValid(FMOD_STUDIO_PARAMETERINSTANCE *parameterinstance);\nFMOD_RESULT F_API FMOD_Studio_ParameterInstance_GetDescription(FMOD_STUDIO_PARAMETERINSTANCE *parameterinstance, FMOD_STUDIO_PARAMETER_DESCRIPTION *description);\nFMOD_RESULT F_API FMOD_Studio_ParameterInstance_GetValue(FMOD_STUDIO_PARAMETERINSTANCE *parameterinstance, float *value);\nFMOD_RESULT F_API FMOD_Studio_ParameterInstance_SetValue(FMOD_STUDIO_PARAMETERINSTANCE *parameterinstance, float value);\n\n/*\n    Bus\n*/\nFMOD_BOOL   F_API FMOD_Studio_Bus_IsValid(FMOD_STUDIO_BUS *bus);\nFMOD_RESULT F_API FMOD_Studio_Bus_GetID(FMOD_STUDIO_BUS *bus, FMOD_GUID *id);\nFMOD_RESULT F_API FMOD_Studio_Bus_GetPath(FMOD_STUDIO_BUS *bus, char *path, int size, int *retrieved);\nFMOD_RESULT F_API FMOD_Studio_Bus_GetVolume(FMOD_STUDIO_BUS *bus, float *volume, float *finalvolume);\nFMOD_RESULT F_API FMOD_Studio_Bus_SetVolume(FMOD_STUDIO_BUS *bus, float volume);\nFMOD_RESULT F_API FMOD_Studio_Bus_GetPaused(FMOD_STUDIO_BUS *bus, FMOD_BOOL *paused);\nFMOD_RESULT F_API FMOD_Studio_Bus_SetPaused(FMOD_STUDIO_BUS *bus, FMOD_BOOL paused);\nFMOD_RESULT F_API FMOD_Studio_Bus_GetMute(FMOD_STUDIO_BUS *bus, FMOD_BOOL *mute);\nFMOD_RESULT F_API FMOD_Studio_Bus_SetMute(FMOD_STUDIO_BUS *bus, FMOD_BOOL mute);\nFMOD_RESULT F_API FMOD_Studio_Bus_StopAllEvents(FMOD_STUDIO_BUS *bus, FMOD_STUDIO_STOP_MODE mode);\nFMOD_RESULT F_API FMOD_Studio_Bus_LockChannelGroup(FMOD_STUDIO_BUS *bus);\nFMOD_RESULT F_API FMOD_Studio_Bus_UnlockChannelGroup(FMOD_STUDIO_BUS *bus);\nFMOD_RESULT F_API FMOD_Studio_Bus_GetChannelGroup(FMOD_STUDIO_BUS *bus, FMOD_CHANNELGROUP **group);\n\n/*\n    VCA\n*/\nFMOD_BOOL   F_API FMOD_Studio_VCA_IsValid(FMOD_STUDIO_VCA *vca);\nFMOD_RESULT F_API FMOD_Studio_VCA_GetID(FMOD_STUDIO_VCA *vca, FMOD_GUID *id);\nFMOD_RESULT F_API FMOD_Studio_VCA_GetPath(FMOD_STUDIO_VCA *vca, char *path, int size, int *retrieved);\nFMOD_RESULT F_API FMOD_Studio_VCA_GetVolume(FMOD_STUDIO_VCA *vca, float *volume, float *finalvolume);\nFMOD_RESULT F_API FMOD_Studio_VCA_SetVolume(FMOD_STUDIO_VCA *vca, float volume);\n\n/*\n    Bank\n*/\nFMOD_BOOL   F_API FMOD_Studio_Bank_IsValid(FMOD_STUDIO_BANK *bank);\nFMOD_RESULT F_API FMOD_Studio_Bank_GetID(FMOD_STUDIO_BANK *bank, FMOD_GUID *id);\nFMOD_RESULT F_API FMOD_Studio_Bank_GetPath(FMOD_STUDIO_BANK *bank, char *path, int size, int *retrieved);\nFMOD_RESULT F_API FMOD_Studio_Bank_Unload(FMOD_STUDIO_BANK *bank);\nFMOD_RESULT F_API FMOD_Studio_Bank_LoadSampleData(FMOD_STUDIO_BANK *bank);\nFMOD_RESULT F_API FMOD_Studio_Bank_UnloadSampleData(FMOD_STUDIO_BANK *bank);\nFMOD_RESULT F_API FMOD_Studio_Bank_GetLoadingState(FMOD_STUDIO_BANK *bank, FMOD_STUDIO_LOADING_STATE *state);\nFMOD_RESULT F_API FMOD_Studio_Bank_GetSampleLoadingState(FMOD_STUDIO_BANK *bank, FMOD_STUDIO_LOADING_STATE *state);\nFMOD_RESULT F_API FMOD_Studio_Bank_GetStringCount(FMOD_STUDIO_BANK *bank, int *count);\nFMOD_RESULT F_API FMOD_Studio_Bank_GetStringInfo(FMOD_STUDIO_BANK *bank, int index, FMOD_GUID *id, char *path, int size, int *retrieved);\nFMOD_RESULT F_API FMOD_Studio_Bank_GetEventCount(FMOD_STUDIO_BANK *bank, int *count);\nFMOD_RESULT F_API FMOD_Studio_Bank_GetEventList(FMOD_STUDIO_BANK *bank, FMOD_STUDIO_EVENTDESCRIPTION **array, int capacity, int *count);\nFMOD_RESULT F_API FMOD_Studio_Bank_GetBusCount(FMOD_STUDIO_BANK *bank, int *count);\nFMOD_RESULT F_API FMOD_Studio_Bank_GetBusList(FMOD_STUDIO_BANK *bank, FMOD_STUDIO_BUS **array, int capacity, int *count);\nFMOD_RESULT F_API FMOD_Studio_Bank_GetVCACount(FMOD_STUDIO_BANK *bank, int *count);\nFMOD_RESULT F_API FMOD_Studio_Bank_GetVCAList(FMOD_STUDIO_BANK *bank, FMOD_STUDIO_VCA **array, int capacity, int *count);\nFMOD_RESULT F_API FMOD_Studio_Bank_GetUserData(FMOD_STUDIO_BANK *bank, void **userdata);\nFMOD_RESULT F_API FMOD_Studio_Bank_SetUserData(FMOD_STUDIO_BANK *bank, void *userData);\n\n/*\n    Command playback information\n*/\nFMOD_BOOL   F_API FMOD_Studio_CommandReplay_IsValid(FMOD_STUDIO_COMMANDREPLAY *replay);\nFMOD_RESULT F_API FMOD_Studio_CommandReplay_GetSystem(FMOD_STUDIO_COMMANDREPLAY *replay, FMOD_STUDIO_SYSTEM **system);\nFMOD_RESULT F_API FMOD_Studio_CommandReplay_GetLength(FMOD_STUDIO_COMMANDREPLAY *replay, float *length);\nFMOD_RESULT F_API FMOD_Studio_CommandReplay_GetCommandCount(FMOD_STUDIO_COMMANDREPLAY *replay, int *count);\nFMOD_RESULT F_API FMOD_Studio_CommandReplay_GetCommandInfo(FMOD_STUDIO_COMMANDREPLAY *replay, int commandindex, FMOD_STUDIO_COMMAND_INFO *info);\nFMOD_RESULT F_API FMOD_Studio_CommandReplay_GetCommandString(FMOD_STUDIO_COMMANDREPLAY *replay, int commandindex, char *description, int capacity);\nFMOD_RESULT F_API FMOD_Studio_CommandReplay_GetCommandAtTime(FMOD_STUDIO_COMMANDREPLAY *replay, float time, int *commandindex);\nFMOD_RESULT F_API FMOD_Studio_CommandReplay_SetBankPath(FMOD_STUDIO_COMMANDREPLAY *replay, const char *bankPath);\nFMOD_RESULT F_API FMOD_Studio_CommandReplay_Start(FMOD_STUDIO_COMMANDREPLAY *replay);\nFMOD_RESULT F_API FMOD_Studio_CommandReplay_Stop(FMOD_STUDIO_COMMANDREPLAY *replay);\nFMOD_RESULT F_API FMOD_Studio_CommandReplay_SeekToTime(FMOD_STUDIO_COMMANDREPLAY *replay, float time);\nFMOD_RESULT F_API FMOD_Studio_CommandReplay_SeekToCommand(FMOD_STUDIO_COMMANDREPLAY *replay, int commandindex);\nFMOD_RESULT F_API FMOD_Studio_CommandReplay_GetPaused(FMOD_STUDIO_COMMANDREPLAY *replay, FMOD_BOOL *paused);\nFMOD_RESULT F_API FMOD_Studio_CommandReplay_SetPaused(FMOD_STUDIO_COMMANDREPLAY *replay, FMOD_BOOL paused);\nFMOD_RESULT F_API FMOD_Studio_CommandReplay_GetPlaybackState(FMOD_STUDIO_COMMANDREPLAY *replay, FMOD_STUDIO_PLAYBACK_STATE *state);\nFMOD_RESULT F_API FMOD_Studio_CommandReplay_GetCurrentCommand(FMOD_STUDIO_COMMANDREPLAY *replay, int *commandindex, float *currenttime);\nFMOD_RESULT F_API FMOD_Studio_CommandReplay_Release(FMOD_STUDIO_COMMANDREPLAY *replay);\nFMOD_RESULT F_API FMOD_Studio_CommandReplay_SetFrameCallback(FMOD_STUDIO_COMMANDREPLAY *replay, FMOD_STUDIO_COMMANDREPLAY_FRAME_CALLBACK callback);\nFMOD_RESULT F_API FMOD_Studio_CommandReplay_SetLoadBankCallback(FMOD_STUDIO_COMMANDREPLAY *replay, FMOD_STUDIO_COMMANDREPLAY_LOAD_BANK_CALLBACK callback);\nFMOD_RESULT F_API FMOD_Studio_CommandReplay_SetCreateInstanceCallback(FMOD_STUDIO_COMMANDREPLAY *replay, FMOD_STUDIO_COMMANDREPLAY_CREATE_INSTANCE_CALLBACK callback);\nFMOD_RESULT F_API FMOD_Studio_CommandReplay_GetUserData(FMOD_STUDIO_COMMANDREPLAY *replay, void **userdata);\nFMOD_RESULT F_API FMOD_Studio_CommandReplay_SetUserData(FMOD_STUDIO_COMMANDREPLAY *replay, void *userdata);\n\n/*$ preserve start $*/\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* FMOD_STUDIO_H */\n\n/*$ preserve end $*/\n"
  },
  {
    "path": "Plugins/FMODStudio/Source/FMODStudio/Public/FMOD/fmod_studio.hpp",
    "content": "/*\n    fmod_studio.hpp - FMOD Studio API\n    Copyright (c), Firelight Technologies Pty, Ltd. 2020.\n\n    This header defines the C++ API. If you are programming in C use fmod_studio.h.\n*/\n\n#ifndef FMOD_STUDIO_HPP\n#define FMOD_STUDIO_HPP\n\n#include \"fmod_studio_common.h\"\n#include \"fmod_studio.h\"\n\n#include \"fmod.hpp\"\n\nnamespace FMOD\n{\n\nnamespace Studio\n{\n    typedef FMOD_GUID ID; // Deprecated. Please use FMOD_GUID type.\n\n    class System;\n    class EventDescription;\n    class EventInstance;\n    class ParameterInstance;\n    class Bus;\n    class VCA;\n    class Bank;\n    class CommandReplay;\n\n    inline FMOD_RESULT parseID(const char *idstring, FMOD_GUID *id) { return FMOD_Studio_ParseID(idstring, id); }\n\n    class System\n    {\n    private:\n        // Constructor made private so user cannot statically instance a System class. System::create must be used.\n        System();\n        System(const System &);\n\n    public:\n        static FMOD_RESULT F_API create(System **system, unsigned int headerversion = FMOD_VERSION);\n        FMOD_RESULT F_API setAdvancedSettings(FMOD_STUDIO_ADVANCEDSETTINGS *settings);\n        FMOD_RESULT F_API getAdvancedSettings(FMOD_STUDIO_ADVANCEDSETTINGS *settings);\n        FMOD_RESULT F_API initialize(int maxchannels, FMOD_STUDIO_INITFLAGS studioflags, FMOD_INITFLAGS flags, void *extradriverdata);\n        FMOD_RESULT F_API release();\n\n        // Handle validity\n        bool F_API isValid() const;\n\n        // Update processing\n        FMOD_RESULT F_API update();\n        FMOD_RESULT F_API flushCommands();\n        FMOD_RESULT F_API flushSampleLoading();\n\n        // Low-level API access\n        FMOD_RESULT F_API getLowLevelSystem(FMOD::System **system) const;\n\n        // Asset retrieval\n        FMOD_RESULT F_API getEvent(const char *path, EventDescription **event) const;\n        FMOD_RESULT F_API getBus(const char *path, Bus **bus) const;\n        FMOD_RESULT F_API getVCA(const char *path, VCA **vca) const;\n        FMOD_RESULT F_API getBank(const char *path, Bank **bank) const;\n        FMOD_RESULT F_API getEventByID(const FMOD_GUID *id, EventDescription **event) const;\n        FMOD_RESULT F_API getBusByID(const FMOD_GUID *id, Bus **bus) const;\n        FMOD_RESULT F_API getVCAByID(const FMOD_GUID *id, VCA **vca) const;\n        FMOD_RESULT F_API getBankByID(const FMOD_GUID *id, Bank **bank) const;\n        FMOD_RESULT F_API getSoundInfo(const char *key, FMOD_STUDIO_SOUND_INFO *info) const;\n\n        // Path lookup\n        FMOD_RESULT F_API lookupID(const char *path, FMOD_GUID *id) const;\n        FMOD_RESULT F_API lookupPath(const FMOD_GUID *id, char *path, int size, int *retrieved) const;\n\n        // Listener control\n        FMOD_RESULT F_API getNumListeners(int *numlisteners);\n        FMOD_RESULT F_API setNumListeners(int numlisteners);\n        FMOD_RESULT F_API getListenerAttributes(int listener, FMOD_3D_ATTRIBUTES *attributes) const;\n        FMOD_RESULT F_API setListenerAttributes(int listener, const FMOD_3D_ATTRIBUTES *attributes);\n        FMOD_RESULT F_API getListenerWeight(int listener, float *weight);\n        FMOD_RESULT F_API setListenerWeight(int listener, float weight);\n\n        // Bank control\n        FMOD_RESULT F_API loadBankFile(const char *filename, FMOD_STUDIO_LOAD_BANK_FLAGS flags, Bank **bank);\n        FMOD_RESULT F_API loadBankMemory(const char *buffer, int length, FMOD_STUDIO_LOAD_MEMORY_MODE mode, FMOD_STUDIO_LOAD_BANK_FLAGS flags, Bank **bank);\n        FMOD_RESULT F_API loadBankCustom(const FMOD_STUDIO_BANK_INFO *info, FMOD_STUDIO_LOAD_BANK_FLAGS flags, Bank **bank);\n        FMOD_RESULT F_API unloadAll();\n\n        // General functionality\n        FMOD_RESULT F_API getCPUUsage(FMOD_STUDIO_CPU_USAGE *usage) const;\n        FMOD_RESULT F_API getBufferUsage(FMOD_STUDIO_BUFFER_USAGE *usage) const;\n        FMOD_RESULT F_API resetBufferUsage();\n        FMOD_RESULT F_API registerPlugin(const FMOD_DSP_DESCRIPTION *description);\n        FMOD_RESULT F_API unregisterPlugin(const char *name);\n\n        // Enumeration\n        FMOD_RESULT F_API getBankCount(int *count) const;\n        FMOD_RESULT F_API getBankList(Bank **array, int capacity, int *count) const;\n\n        // Command capture and replay\n        FMOD_RESULT F_API startCommandCapture(const char *filename, FMOD_STUDIO_COMMANDCAPTURE_FLAGS flags);\n        FMOD_RESULT F_API stopCommandCapture();\n        FMOD_RESULT F_API loadCommandReplay(const char *filename, FMOD_STUDIO_COMMANDREPLAY_FLAGS flags, CommandReplay **playback);\n\n        // Callbacks\n        FMOD_RESULT F_API setCallback(FMOD_STUDIO_SYSTEM_CALLBACK callback, FMOD_STUDIO_SYSTEM_CALLBACK_TYPE callbackmask = FMOD_STUDIO_SYSTEM_CALLBACK_ALL);\n        FMOD_RESULT F_API getUserData(void **userdata) const;\n        FMOD_RESULT F_API setUserData(void *userdata);\n\n    };\n\n    class EventDescription\n    {\n    private:\n        // Constructor made private so user cannot statically instance the class.\n        EventDescription();\n        EventDescription(const EventDescription &);\n\n    public:\n        // Handle validity\n        bool F_API isValid() const;\n\n        // Property access\n        FMOD_RESULT F_API getID(FMOD_GUID *id) const;\n        FMOD_RESULT F_API getPath(char *path, int size, int *retrieved) const;\n        FMOD_RESULT F_API getParameterCount(int *count) const;\n        FMOD_RESULT F_API getParameterByIndex(int index, FMOD_STUDIO_PARAMETER_DESCRIPTION *parameter) const;\n        FMOD_RESULT F_API getParameter(const char *name, FMOD_STUDIO_PARAMETER_DESCRIPTION *parameter) const;\n        FMOD_RESULT F_API getUserPropertyCount(int *count) const;\n        FMOD_RESULT F_API getUserPropertyByIndex(int index, FMOD_STUDIO_USER_PROPERTY *property) const;\n        FMOD_RESULT F_API getUserProperty(const char *name, FMOD_STUDIO_USER_PROPERTY *property) const;\n        FMOD_RESULT F_API getLength(int *length) const;\n        FMOD_RESULT F_API getMinimumDistance(float *distance) const;\n        FMOD_RESULT F_API getMaximumDistance(float *distance) const;\n        FMOD_RESULT F_API getSoundSize(float *size) const;\n\n        FMOD_RESULT F_API isSnapshot(bool *snapshot) const;\n        FMOD_RESULT F_API isOneshot(bool *oneshot) const;\n        FMOD_RESULT F_API isStream(bool *stream) const;\n        FMOD_RESULT F_API is3D(bool *is3d) const;\n        FMOD_RESULT F_API hasCue(bool *cue) const;\n\n        // Playback control\n        FMOD_RESULT F_API createInstance(EventInstance **instance) const;\n        FMOD_RESULT F_API getInstanceCount(int *count) const;\n        FMOD_RESULT F_API getInstanceList(EventInstance **array, int capacity, int *count) const;\n\n        // Sample data loading control\n        FMOD_RESULT F_API loadSampleData();\n        FMOD_RESULT F_API unloadSampleData();\n        FMOD_RESULT F_API getSampleLoadingState(FMOD_STUDIO_LOADING_STATE *state) const;\n\n        // Convenience functions\n        FMOD_RESULT F_API releaseAllInstances();\n\n        // Callbacks\n        FMOD_RESULT F_API setCallback(FMOD_STUDIO_EVENT_CALLBACK callback, FMOD_STUDIO_EVENT_CALLBACK_TYPE callbackmask = FMOD_STUDIO_EVENT_CALLBACK_ALL);\n        FMOD_RESULT F_API getUserData(void **userdata) const;\n        FMOD_RESULT F_API setUserData(void *userdata);\n    };\n\n    class EventInstance\n    {\n    private:\n        // Constructor made private so user cannot statically instance the class.\n        EventInstance();\n        EventInstance(const EventInstance &);\n\n    public:\n        // Handle validity\n        bool F_API isValid() const;\n\n        // Property access\n        FMOD_RESULT F_API getDescription(EventDescription **description) const;\n\n        // Playback control\n        FMOD_RESULT F_API getVolume(float *volume, float *finalvolume = 0) const;\n        FMOD_RESULT F_API setVolume(float volume);\n\n        FMOD_RESULT F_API getPitch(float *pitch, float *finalpitch = 0) const;\n        FMOD_RESULT F_API setPitch(float pitch);\n\n        FMOD_RESULT F_API get3DAttributes(FMOD_3D_ATTRIBUTES *attributes) const;\n        FMOD_RESULT F_API set3DAttributes(const FMOD_3D_ATTRIBUTES *attributes);\n\n        FMOD_RESULT F_API getListenerMask(unsigned int *mask) const;\n        FMOD_RESULT F_API setListenerMask(unsigned int mask);\n\n        FMOD_RESULT F_API getProperty(FMOD_STUDIO_EVENT_PROPERTY index, float *value) const;\n        FMOD_RESULT F_API setProperty(FMOD_STUDIO_EVENT_PROPERTY index, float value);\n\n        FMOD_RESULT F_API getReverbLevel(int index, float *level) const;\n        FMOD_RESULT F_API setReverbLevel(int index, float level);\n\n        FMOD_RESULT F_API getPaused(bool *paused) const;\n        FMOD_RESULT F_API setPaused(bool paused);\n\n        FMOD_RESULT F_API start();\n        FMOD_RESULT F_API stop(FMOD_STUDIO_STOP_MODE mode);\n\n        FMOD_RESULT F_API getTimelinePosition(int *position) const;\n        FMOD_RESULT F_API setTimelinePosition(int position);\n\n        FMOD_RESULT F_API getPlaybackState(FMOD_STUDIO_PLAYBACK_STATE *state) const;\n\n        FMOD_RESULT F_API getChannelGroup(ChannelGroup **group) const;\n\n        FMOD_RESULT F_API release();\n\n        FMOD_RESULT F_API isVirtual(bool *virtualstate) const;\n\n        FMOD_RESULT F_API getParameterValue(const char *name, float *value, float *finalvalue = 0);\n        FMOD_RESULT F_API setParameterValue(const char *name, float value);\n\n        FMOD_RESULT F_API getParameterValueByIndex(int index, float *value, float *finalvalue = 0);\n        FMOD_RESULT F_API setParameterValueByIndex(int index, float value);\n        FMOD_RESULT F_API setParameterValuesByIndices(int *indices, float *values, int count);\n\n        // Deprecated - please use getParameterValue, setParameterValue, getParameterValueByIndex and setParameterValueByIndex instead\n        FMOD_RESULT F_API getParameter(const char *name, ParameterInstance **parameter) const;\n        FMOD_RESULT F_API getParameterByIndex(int index, ParameterInstance **parameter) const;\n        FMOD_RESULT F_API getParameterCount(int *count) const;\n\n        FMOD_RESULT F_API triggerCue();\n\n        // Callbacks\n        FMOD_RESULT F_API setCallback(FMOD_STUDIO_EVENT_CALLBACK callback, FMOD_STUDIO_EVENT_CALLBACK_TYPE callbackmask = FMOD_STUDIO_EVENT_CALLBACK_ALL);\n        FMOD_RESULT F_API getUserData(void **userdata) const;\n        FMOD_RESULT F_API setUserData(void *userdata);\n    };\n\n    // Deprecated\n    class ParameterInstance\n    {\n    private:\n        // Constructor made private so user cannot statically instance the class.\n        ParameterInstance();\n        ParameterInstance(const ParameterInstance &);\n\n    public:\n        // Handle validity\n        bool F_API isValid() const;\n\n        // Property access\n        FMOD_RESULT F_API getDescription(FMOD_STUDIO_PARAMETER_DESCRIPTION *description) const;\n\n        // Playback control\n        FMOD_RESULT F_API getValue(float *value) const;\n        FMOD_RESULT F_API setValue(float value);\n    };\n\n    class Bus\n    {\n    private:\n        // Constructor made private so user cannot statically instance the class.\n        Bus();\n        Bus(const Bus &);\n\n    public:\n        // Handle validity\n        bool F_API isValid() const;\n\n        // Property access\n        FMOD_RESULT F_API getID(FMOD_GUID *id) const;\n        FMOD_RESULT F_API getPath(char *path, int size, int *retrieved) const;\n\n        // Playback control\n        FMOD_RESULT F_API getVolume(float *volume, float *finalvolume = 0) const;\n        FMOD_RESULT F_API setVolume(float volume);\n\n        FMOD_RESULT F_API getPaused(bool *paused) const;\n        FMOD_RESULT F_API setPaused(bool paused);\n\n        FMOD_RESULT F_API getMute(bool *mute) const;\n        FMOD_RESULT F_API setMute(bool mute);\n\n        FMOD_RESULT F_API stopAllEvents(FMOD_STUDIO_STOP_MODE mode);\n\n        // Low-level API access\n        FMOD_RESULT F_API lockChannelGroup();\n        FMOD_RESULT F_API unlockChannelGroup();\n        FMOD_RESULT F_API getChannelGroup(FMOD::ChannelGroup **channelgroup) const;\n    };\n\n    class VCA\n    {\n    private:\n        // Constructor made private so user cannot statically instance the class.\n        VCA();\n        VCA(const VCA &);\n\n    public:\n        // Handle validity\n        bool F_API isValid() const;\n\n        // Property access\n        FMOD_RESULT F_API getID(FMOD_GUID *id) const;\n        FMOD_RESULT F_API getPath(char *path, int size, int *retrieved) const;\n\n        // Playback control\n        FMOD_RESULT F_API getVolume(float *volume, float *finalvolume = 0) const;\n        FMOD_RESULT F_API setVolume(float volume);\n    };\n\n    class Bank\n    {\n    private:\n        // Constructor made private so user cannot statically instance the class.\n        Bank();\n        Bank(const Bank &);\n\n    public:\n        // Handle validity\n        bool F_API isValid() const;\n\n        // Property access\n        FMOD_RESULT F_API getID(FMOD_GUID *id) const;\n        FMOD_RESULT F_API getPath(char *path, int size, int *retrieved) const;\n\n        // Loading control\n        FMOD_RESULT F_API unload();\n        FMOD_RESULT F_API loadSampleData();\n        FMOD_RESULT F_API unloadSampleData();\n\n        FMOD_RESULT F_API getLoadingState(FMOD_STUDIO_LOADING_STATE *state) const;\n        FMOD_RESULT F_API getSampleLoadingState(FMOD_STUDIO_LOADING_STATE *state) const;\n\n        // Enumeration\n        FMOD_RESULT F_API getStringCount(int *count) const;\n        FMOD_RESULT F_API getStringInfo(int index, FMOD_GUID *id, char *path, int size, int *retrieved) const;\n        FMOD_RESULT F_API getEventCount(int *count) const;\n        FMOD_RESULT F_API getEventList(EventDescription **array, int capacity, int *count) const;\n        FMOD_RESULT F_API getBusCount(int *count) const;\n        FMOD_RESULT F_API getBusList(Bus **array, int capacity, int *count) const;\n        FMOD_RESULT F_API getVCACount(int *count) const;\n        FMOD_RESULT F_API getVCAList(VCA **array, int capacity, int *count) const;\n\n        FMOD_RESULT F_API getUserData(void **userdata) const;\n        FMOD_RESULT F_API setUserData(void *userdata);\n    };\n\n    class CommandReplay\n    {\n    private:\n        // Constructor made private so user cannot statically instance the class.\n        CommandReplay();\n        CommandReplay(const CommandReplay &);\n\n    public:\n        // Handle validity\n        bool F_API isValid() const;\n\n        // Information query\n        FMOD_RESULT F_API getSystem(System **system) const;\n        FMOD_RESULT F_API getLength(float *length) const;\n\n        FMOD_RESULT F_API getCommandCount(int *count) const;\n        FMOD_RESULT F_API getCommandInfo(int commandindex, FMOD_STUDIO_COMMAND_INFO *info) const;\n        FMOD_RESULT F_API getCommandString(int commandindex, char *buffer, int length) const;\n        FMOD_RESULT F_API getCommandAtTime(float time, int *commandindex) const;\n\n        // Playback\n        FMOD_RESULT F_API setBankPath(const char *bankPath);\n        FMOD_RESULT F_API start();\n        FMOD_RESULT F_API stop();\n        FMOD_RESULT F_API seekToTime(float time);\n        FMOD_RESULT F_API seekToCommand(int commandindex);\n        FMOD_RESULT F_API getPaused(bool *paused) const;\n        FMOD_RESULT F_API setPaused(bool paused);\n        FMOD_RESULT F_API getPlaybackState(FMOD_STUDIO_PLAYBACK_STATE *state) const;\n        FMOD_RESULT F_API getCurrentCommand(int *commandindex, float *currenttime) const;\n\n        // Release\n        FMOD_RESULT F_API release();\n\n        // Callbacks\n        FMOD_RESULT F_API setFrameCallback(FMOD_STUDIO_COMMANDREPLAY_FRAME_CALLBACK callback);\n        FMOD_RESULT F_API setLoadBankCallback(FMOD_STUDIO_COMMANDREPLAY_LOAD_BANK_CALLBACK callback);\n        FMOD_RESULT F_API setCreateInstanceCallback(FMOD_STUDIO_COMMANDREPLAY_CREATE_INSTANCE_CALLBACK callback);\n\n        FMOD_RESULT F_API getUserData(void **userdata) const;\n        FMOD_RESULT F_API setUserData(void *userdata);\n    };\n\n} // namespace Studio\n\n} // namespace FMOD\n\n#endif //FMOD_STUDIO_HPP\n"
  },
  {
    "path": "Plugins/FMODStudio/Source/FMODStudio/Public/FMOD/fmod_studio_common.h",
    "content": "/*\n    fmod_studio_common.h\n    Copyright (c), Firelight Technologies Pty, Ltd. 2020.\n\n    This header defines common enumerations, structs and callbacks that are shared between the C and C++ interfaces.\n*/\n\n#ifndef FMOD_STUDIO_COMMON_H\n#define FMOD_STUDIO_COMMON_H\n\n#include \"fmod.h\"\n\n\n/*\n    FMOD Studio types.\n*/\n\ntypedef struct FMOD_STUDIO_SYSTEM FMOD_STUDIO_SYSTEM;\ntypedef struct FMOD_STUDIO_EVENTDESCRIPTION FMOD_STUDIO_EVENTDESCRIPTION;\ntypedef struct FMOD_STUDIO_EVENTINSTANCE FMOD_STUDIO_EVENTINSTANCE;\ntypedef struct FMOD_STUDIO_PARAMETERINSTANCE FMOD_STUDIO_PARAMETERINSTANCE;\ntypedef struct FMOD_STUDIO_BUS FMOD_STUDIO_BUS;\ntypedef struct FMOD_STUDIO_VCA FMOD_STUDIO_VCA;\ntypedef struct FMOD_STUDIO_BANK FMOD_STUDIO_BANK;\ntypedef struct FMOD_STUDIO_COMMANDREPLAY FMOD_STUDIO_COMMANDREPLAY;\n\n\n/*\n[DEFINE]\n[\n    [NAME]\n    FMOD_STUDIO_INITFLAGS\n\n    [DESCRIPTION]\n    Studio System initialization flags.\n    Use them with Studio::System::initialize in the *studioflags* parameter to change various behavior.\n\n    [REMARKS]\n\n    [SEE_ALSO]\n    Studio::System::initialize\n]\n*/\n#define FMOD_STUDIO_INIT_NORMAL                     0x00000000  /* Initialize normally. */\n#define FMOD_STUDIO_INIT_LIVEUPDATE                 0x00000001  /* Enable live update. */\n#define FMOD_STUDIO_INIT_ALLOW_MISSING_PLUGINS      0x00000002  /* Load banks even if they reference plugins that have not been loaded. */\n#define FMOD_STUDIO_INIT_SYNCHRONOUS_UPDATE         0x00000004  /* Disable asynchronous processing and perform all processing on the calling thread instead. */\n#define FMOD_STUDIO_INIT_DEFERRED_CALLBACKS         0x00000008  /* Defer timeline callbacks until the main update. See Studio::EventInstance::setCallback for more information. */\n#define FMOD_STUDIO_INIT_LOAD_FROM_UPDATE           0x00000010  /* No additional threads are created for bank and resource loading.  Loading is driven from Studio::System::update.  Mainly used in non-realtime situations. */\n/* [DEFINE_END] */\n\ntypedef unsigned int FMOD_STUDIO_INITFLAGS;\n\n\n/*\n[ENUM]\n[\n    [DESCRIPTION]\n    These values describe the loading status of various objects.\n\n    [REMARKS]\n    Calling Studio::System::loadBankFile, Studio::System::loadBankMemory or Studio::System::loadBankCustom\n    will trigger loading of metadata from the bank.\n\n    Calling Studio::EventDescription::loadSampleData, Studio::EventDescription::createInstance\n    or Studio::Bank::loadSampleData may trigger asynchronous loading of sample data.\n\n    [SEE_ALSO]\n    Studio::EventDescription::getSampleLoadingState\n    Studio::Bank::getLoadingState\n    Studio::Bank::getSampleLoadingState\n]\n*/\ntypedef enum FMOD_STUDIO_LOADING_STATE\n{\n    FMOD_STUDIO_LOADING_STATE_UNLOADING,        /* Currently unloading. */\n    FMOD_STUDIO_LOADING_STATE_UNLOADED,         /* Not loaded. */\n    FMOD_STUDIO_LOADING_STATE_LOADING,          /* Loading in progress. */\n    FMOD_STUDIO_LOADING_STATE_LOADED,           /* Loaded and ready to play. */\n    FMOD_STUDIO_LOADING_STATE_ERROR,            /* Failed to load and is now in error state. */\n\n    FMOD_STUDIO_LOADING_STATE_FORCEINT = 65536  /* Makes sure this enum is signed 32bit. */\n} FMOD_STUDIO_LOADING_STATE;\n\n\n/*\n[ENUM]\n[\n    [DESCRIPTION]\n    Specifies how to use the memory buffer passed to Studio::System::loadBankMemory.\n\n    [REMARKS]\n\n    [SEE_ALSO]\n    Studio::System::loadBankMemory\n    Studio::Bank::unload\n]\n*/\ntypedef enum FMOD_STUDIO_LOAD_MEMORY_MODE\n{\n    FMOD_STUDIO_LOAD_MEMORY,                    /* Duplicates the memory into its own buffers, memory can be freed after Studio::System::loadBankMemory returns. */\n    FMOD_STUDIO_LOAD_MEMORY_POINT,              /* Copies the memory pointer without duplicating the memory into its own buffers, memory can be freed after receiving a FMOD_STUDIO_SYSTEM_CALLBACK_BANK_UNLOAD callback. */\n\n    FMOD_STUDIO_LOAD_MEMORY_FORCEINT = 65536    /* Makes sure this enum is signed 32bit. */\n} FMOD_STUDIO_LOAD_MEMORY_MODE;\n\n/*\n[DEFINE]\n[\n    [NAME]\n    FMOD_STUDIO_LOAD_MEMORY_ALIGNMENT\n\n    [DESCRIPTION]\n    The required alignment of the buffer for Studio::System::loadBankMemory when using FMOD_STUDIO_LOAD_MEMORY_POINT.\n\n    [REMARKS]\n\n    [SEE_ALSO]\n    Studio::System::loadBankMemory\n    FMOD_STUDIO_LOAD_MEMORY_MODE\n]\n*/\n#define FMOD_STUDIO_LOAD_MEMORY_ALIGNMENT 32\n/* [DEFINE_END] */\n\n/*\n[ENUM]\n[\n    [DESCRIPTION]\n    Describes the type of a parameter.\n\n    [REMARKS]\n    There are two primary types of parameters: game controlled and automatic.\n    Game controlled parameters receive their value from the API using\n    Studio::EventInstance::setParameterValue. Automatic parameters are updated inside\n    FMOD based on the positional information of the event and listener.\n\n    **Horizontal angle** means the angle between vectors projected onto the\n    listener's XZ plane (for the EVENT_ORIENTATION and DIRECTION parameters)\n    or the global XZ plane (for the LISTENER_ORIENTATION parameter).\n\n    [SEE_ALSO]\n    FMOD_STUDIO_PARAMETER_DESCRIPTION\n    Studio::EventInstance::setParameterValue\n    Studio::EventInstance::set3DAttributes\n    Studio::System::setListenerAttributes\n]\n*/\ntypedef enum FMOD_STUDIO_PARAMETER_TYPE\n{\n    FMOD_STUDIO_PARAMETER_GAME_CONTROLLED,                  /* Controlled via the API using Studio::EventInstance::setParameterValue. */\n    FMOD_STUDIO_PARAMETER_AUTOMATIC_DISTANCE,               /* Distance between the event and the listener. */\n    FMOD_STUDIO_PARAMETER_AUTOMATIC_EVENT_CONE_ANGLE,       /* Angle between the event's forward vector and the vector pointing from the event to the listener (0 to 180 degrees). */\n    FMOD_STUDIO_PARAMETER_AUTOMATIC_EVENT_ORIENTATION,      /* Horizontal angle between the event's forward vector and listener's forward vector (-180 to 180 degrees). */\n    FMOD_STUDIO_PARAMETER_AUTOMATIC_DIRECTION,              /* Horizontal angle between the listener's forward vector and the vector pointing from the listener to the event (-180 to 180 degrees). */\n    FMOD_STUDIO_PARAMETER_AUTOMATIC_ELEVATION,              /* Angle between the listener's XZ plane and the vector pointing from the listener to the event (-90 to 90 degrees). */\n    FMOD_STUDIO_PARAMETER_AUTOMATIC_LISTENER_ORIENTATION,   /* Horizontal angle between the listener's forward vector and the global positive Z axis (-180 to 180 degrees). */\n\n    FMOD_STUDIO_PARAMETER_MAX,                              /* Maximum number of parameter types supported. */\n    FMOD_STUDIO_PARAMETER_FORCEINT = 65536                  /* Makes sure this enum is signed 32bit. */\n} FMOD_STUDIO_PARAMETER_TYPE;\n\n\n/*\n[STRUCTURE]\n[\n    [DESCRIPTION]\n    Information for loading a bank with Studio::System::loadBankCustom.\n\n    [REMARKS]\n\n    [SEE_ALSO]\n    Studio::System::loadBankCustom\n]\n*/\ntypedef struct FMOD_STUDIO_BANK_INFO\n{\n    int                      size;                  /* The size of this struct (for binary compatibility) */\n    void                    *userdata;              /* User data to be passed to the file callbacks */\n    int                      userdatalength;        /* If this is non-zero, userdata will be copied internally */\n    FMOD_FILE_OPEN_CALLBACK  opencallback;          /* Callback for opening this file. */\n    FMOD_FILE_CLOSE_CALLBACK closecallback;         /* Callback for closing this file. */\n    FMOD_FILE_READ_CALLBACK  readcallback;          /* Callback for reading from this file. */\n    FMOD_FILE_SEEK_CALLBACK  seekcallback;          /* Callback for seeking within this file. */\n} FMOD_STUDIO_BANK_INFO;\n\n\n/*\n[STRUCTURE]\n[\n    [DESCRIPTION]\n    Structure describing an event parameter.\n\n    [REMARKS]\n\n    [SEE_ALSO]\n    Studio::EventDescription::getParameter\n    FMOD_STUDIO_PARAMETER_TYPE\n]\n*/\ntypedef struct FMOD_STUDIO_PARAMETER_DESCRIPTION\n{\n    const char                 *name;               /* Name of the parameter. */\n    int                         index;              /* Index of parameter */\n    float                       minimum;            /* Minimum parameter value. */\n    float                       maximum;            /* Maximum parameter value. */\n    float                       defaultvalue;       /* Default value */\n    FMOD_STUDIO_PARAMETER_TYPE  type;               /* Type of the parameter */\n} FMOD_STUDIO_PARAMETER_DESCRIPTION;\n\n\n/*\n[ENUM]\n[\n    [DESCRIPTION]\n    These definitions describe a user property's type.\n\n    [REMARKS]\n\n    [SEE_ALSO]\n    FMOD_STUDIO_USER_PROPERTY\n]\n*/\ntypedef enum FMOD_STUDIO_USER_PROPERTY_TYPE\n{\n    FMOD_STUDIO_USER_PROPERTY_TYPE_INTEGER,         /* Integer property */\n    FMOD_STUDIO_USER_PROPERTY_TYPE_BOOLEAN,         /* Boolean property */\n    FMOD_STUDIO_USER_PROPERTY_TYPE_FLOAT,           /* Float property */\n    FMOD_STUDIO_USER_PROPERTY_TYPE_STRING,          /* String property */\n\n    FMOD_STUDIO_USER_PROPERTY_TYPE_FORCEINT = 65536 /* Makes sure this enum is signed 32bit. */\n} FMOD_STUDIO_USER_PROPERTY_TYPE;\n\n\n/*\n[ENUM]\n[\n    [DESCRIPTION]\n    These definitions describe built-in event properties.\n\n    [REMARKS]\n    For FMOD_STUDIO_EVENT_PROPERTY_CHANNELPRIORITY, a value of -1 uses the priority\n    set in FMOD Studio, while other values override it. This property uses the same\n    system as Channel::setPriority; this means lower values are higher priority\n    (i.e. 0 is the highest priority while 256 is the lowest).\n\n    [SEE_ALSO]\n    Studio::EventInstance::getProperty\n    Studio::EventInstance::setProperty\n]\n*/\ntypedef enum FMOD_STUDIO_EVENT_PROPERTY\n{\n    FMOD_STUDIO_EVENT_PROPERTY_CHANNELPRIORITY,     /* Priority to set on low-level channels created by this event instance (-1 to 256). */\n    FMOD_STUDIO_EVENT_PROPERTY_SCHEDULE_DELAY,      /* Schedule delay to synchronized playback for multiple tracks in DSP clocks, or -1 for default. */\n    FMOD_STUDIO_EVENT_PROPERTY_SCHEDULE_LOOKAHEAD,  /* Schedule look-ahead on the timeline in DSP clocks, or -1 for default. */\n    FMOD_STUDIO_EVENT_PROPERTY_MINIMUM_DISTANCE,    /* Override the event's 3D minimum distance, or -1 for default. */\n    FMOD_STUDIO_EVENT_PROPERTY_MAXIMUM_DISTANCE,    /* Override the event's 3D maximum distance, or -1 for default. */\n    FMOD_STUDIO_EVENT_PROPERTY_MAX,                 /* Maximum number of event properties supported. */\n\n    FMOD_STUDIO_EVENT_PROPERTY_FORCEINT = 65536     /* Makes sure this enum is signed 32bit. */\n} FMOD_STUDIO_EVENT_PROPERTY;\n\n\n/*\n[STRUCTURE]\n[\n    [DESCRIPTION]\n    Structure describing a user property.\n\n    [REMARKS]\n\n    [SEE_ALSO]\n    Studio::EventDescription::getUserProperty\n]\n*/\ntypedef struct FMOD_STUDIO_USER_PROPERTY\n{\n    const char                     *name;           /* Name of the user property. */\n    FMOD_STUDIO_USER_PROPERTY_TYPE  type;           /* Type of the user property. Use this to select one of the following values. */\n\n    union\n    {\n        int                         intvalue;       /* Value of the user property. Only valid when type is FMOD_STUDIO_USER_PROPERTY_TYPE_INTEGER. */\n        FMOD_BOOL                   boolvalue;      /* Value of the user property. Only valid when type is FMOD_STUDIO_USER_PROPERTY_TYPE_BOOLEAN. */\n        float                       floatvalue;     /* Value of the user property. Only valid when type is FMOD_STUDIO_USER_PROPERTY_TYPE_FLOAT. */\n        const char                 *stringvalue;    /* Value of the user property. Only valid when type is FMOD_STUDIO_USER_PROPERTY_TYPE_STRING. */\n    };\n} FMOD_STUDIO_USER_PROPERTY;\n\n\n/*\n[DEFINE]\n[\n    [NAME]\n    FMOD_STUDIO_SYSTEM_CALLBACK_TYPE\n\n    [DESCRIPTION]\n    These callback types are used with Studio::System::setCallback.\n\n    [REMARKS]\n\n    [SEE_ALSO]\n    FMOD_STUDIO_SYSTEM_CALLBACK\n    Studio::System::setCallback\n]\n*/\n#define FMOD_STUDIO_SYSTEM_CALLBACK_PREUPDATE       0x00000001  /* Called at the start of the main Studio update.  For async mode this will be on its own thread. */\n#define FMOD_STUDIO_SYSTEM_CALLBACK_POSTUPDATE      0x00000002  /* Called at the end of the main Studio update.  For async mode this will be on its own thread. */\n#define FMOD_STUDIO_SYSTEM_CALLBACK_BANK_UNLOAD     0x00000004  /* Called when bank has just been unloaded, after all resources are freed. CommandData will be the bank handle.*/\n#define FMOD_STUDIO_SYSTEM_CALLBACK_ALL             0xFFFFFFFF  /* Pass this mask to Studio::System::setCallback to receive all callback types. */\n/* [DEFINE_END] */\n\ntypedef unsigned int FMOD_STUDIO_SYSTEM_CALLBACK_TYPE;\n\n\n/*\n[DEFINE]\n[\n    [NAME]\n    FMOD_STUDIO_EVENT_CALLBACK_TYPE\n\n    [DESCRIPTION]\n    These callback types are used with FMOD_STUDIO_EVENT_CALLBACK.\n\n    [REMARKS]\n    The data passed to the event callback function in the *parameters* argument varies based on the callback type.\n\n    FMOD_STUDIO_EVENT_CALLBACK_STARTING is called when:\n\n     * Studio::EventInstance::start has been called on an event which was not already playing.  The event will\n       remain in this state until its sample data has been loaded.  If the event could not be started due to\n       polyphony, then FMOD_STUDIO_EVENT_CALLBACK_START_FAILED will be called instead.\n\n    FMOD_STUDIO_EVENT_CALLBACK_STARTED is called when:\n\n     * The event has commenced playing.  Normally this callback will be issued immediately\n       after FMOD_STUDIO_EVENT_CALLBACK_STARTING, but may be delayed until sample data has loaded.\n\n    FMOD_STUDIO_EVENT_CALLBACK_RESTARTED is called when:\n\n     * Studio::EventInstance::start has been called on an event which was already playing.\n\n    FMOD_STUDIO_EVENT_CALLBACK_STOPPED is called when:\n\n     * The event has stopped due to Studio::EventInstance::stop being called with FMOD_STUDIO_STOP_IMMEDIATE.\n     * The event has finished fading out after Studio::EventInstance::stop was called with FMOD_STUDIO_STOP_ALLOWFADEOUT.\n     * The event has stopped naturally by reaching the end of the timeline, and no further sounds can be triggered due to\n       parameter changes.\n\n    FMOD_STUDIO_EVENT_CALLBACK_START_FAILED is called when:\n\n     * Studio::EventInstance::start has been called but the polyphony settings did not allow the event to start.  In \n       this case none of FMOD_STUDIO_EVENT_CALLBACK_STARTING, FMOD_STUDIO_EVENT_CALLBACK_STARTED and FMOD_STUDIO_EVENT_CALLBACK_STOPPED \n       will not be called.\n\n    FMOD_STUDIO_EVENT_CALLBACK_CREATE_PROGRAMMER_SOUND is called when:\n\n    * A programmer sound is about to play. FMOD expects the callback to provide an FMOD::Sound object for it to use.\n\n    FMOD_STUDIO_EVENT_CALLBACK_DESTROY_PROGRAMMER_SOUND is called when:\n\n    * A programmer sound has stopped playing. At this point it is safe to release the FMOD::Sound object that was used.\n\n    [SEE_ALSO]\n    Studio::EventDescription::setCallback\n    Studio::EventInstance::setCallback\n    FMOD_STUDIO_EVENT_CALLBACK\n]\n*/\n#define FMOD_STUDIO_EVENT_CALLBACK_CREATED                  0x00000001  /* Called when an instance is fully created. Parameters = unused. */\n#define FMOD_STUDIO_EVENT_CALLBACK_DESTROYED                0x00000002  /* Called when an instance is just about to be destroyed. Parameters = unused. */\n#define FMOD_STUDIO_EVENT_CALLBACK_STARTING                 0x00000004  /* Called when an instance is preparing to start. Parameters = unused. */\n#define FMOD_STUDIO_EVENT_CALLBACK_STARTED                  0x00000008  /* Called when an instance starts playing. Parameters = unused. */\n#define FMOD_STUDIO_EVENT_CALLBACK_RESTARTED                0x00000010  /* Called when an instance is restarted. Parameters = unused. */\n#define FMOD_STUDIO_EVENT_CALLBACK_STOPPED                  0x00000020  /* Called when an instance stops. Parameters = unused. */\n#define FMOD_STUDIO_EVENT_CALLBACK_START_FAILED             0x00000040  /* Called when an instance did not start, e.g. due to polyphony. Parameters = unused. */\n#define FMOD_STUDIO_EVENT_CALLBACK_CREATE_PROGRAMMER_SOUND  0x00000080  /* Called when a programmer sound needs to be created in order to play a programmer instrument. Parameters = FMOD_STUDIO_PROGRAMMER_SOUND_PROPERTIES. */\n#define FMOD_STUDIO_EVENT_CALLBACK_DESTROY_PROGRAMMER_SOUND 0x00000100  /* Called when a programmer sound needs to be destroyed. Parameters = FMOD_STUDIO_PROGRAMMER_SOUND_PROPERTIES. */\n#define FMOD_STUDIO_EVENT_CALLBACK_PLUGIN_CREATED           0x00000200  /* Called when a DSP plugin instance has just been created. Parameters = FMOD_STUDIO_PLUGIN_INSTANCE_PROPERTIES. */\n#define FMOD_STUDIO_EVENT_CALLBACK_PLUGIN_DESTROYED         0x00000400  /* Called when a DSP plugin instance is about to be destroyed. Parameters = FMOD_STUDIO_PLUGIN_INSTANCE_PROPERTIES. */\n#define FMOD_STUDIO_EVENT_CALLBACK_TIMELINE_MARKER          0x00000800  /* Called when the timeline passes a named marker.  Parameters = FMOD_STUDIO_TIMELINE_MARKER_PROPERTIES. */\n#define FMOD_STUDIO_EVENT_CALLBACK_TIMELINE_BEAT            0x00001000  /* Called when the timeline hits a beat in a tempo section.  Parameters = FMOD_STUDIO_TIMELINE_BEAT_PROPERTIES. */\n#define FMOD_STUDIO_EVENT_CALLBACK_SOUND_PLAYED             0x00002000  /* Called when the event plays a sound.  Parameters = FMOD::Sound. */\n#define FMOD_STUDIO_EVENT_CALLBACK_SOUND_STOPPED            0x00004000  /* Called when the event finishes playing a sound.  Parameters = FMOD::Sound. */\n#define FMOD_STUDIO_EVENT_CALLBACK_REAL_TO_VIRTUAL          0x00008000  /* Called when the event becomes virtual.  Parameters = unused. */\n#define FMOD_STUDIO_EVENT_CALLBACK_VIRTUAL_TO_REAL          0x00010000  /* Called when the event becomes real.  Parameters = unused. */\n#define FMOD_STUDIO_EVENT_CALLBACK_ALL                      0xFFFFFFFF  /* Pass this mask to Studio::EventDescription::setCallback or Studio::EventInstance::setCallback to receive all callback types. */\n/* [DEFINE_END] */\n\ntypedef unsigned int FMOD_STUDIO_EVENT_CALLBACK_TYPE;\n\n/*\n[STRUCTURE]\n[\n    [DESCRIPTION]\n    This structure holds information about a programmer sound.\n\n    [REMARKS]\n    This data is passed to the event callback function when type is FMOD_STUDIO_EVENT_CALLBACK_CREATE_PROGRAMMER_SOUND\n    or FMOD_STUDIO_EVENT_CALLBACK_DESTROY_PROGRAMMER_SOUND.\n\n    The provided sound should be created with the FMOD_LOOP_NORMAL mode bit set. FMOD will set this bit internally if\n    it is not set, possibly incurring a slight performance penalty.\n\n    To support non-blocking loading of FSB subsounds, you can specify the subsound you want to use by setting the\n    subsoundIndex field. This will cause FMOD to wait until the provided sound is ready and then get the specified\n    subsound from it.\n\n    [SEE_ALSO]\n    FMOD_STUDIO_EVENT_CALLBACK\n    FMOD_STUDIO_SOUND_INFO\n    Studio::EventDescription::setCallback\n    Studio::EventInstance::setCallback\n    Studio::System::getSoundInfo\n]\n*/\ntypedef struct FMOD_STUDIO_PROGRAMMER_SOUND_PROPERTIES\n{\n    const char  *name;                              /* The name of the programmer instrument (set in FMOD Studio). */\n    FMOD_SOUND  *sound;                             /* The programmer-created sound. This should be filled in by the create callback, and cleaned up by the destroy callback. The provided sound should be created with the FMOD_LOOP_NORMAL mode bit set. This can be cast to/from FMOD::Sound* type. */\n    int          subsoundIndex;                     /* The index of the subsound to use. This should be filled in by the create callback, or set to -1 if the provided sound should be used directly. Defaults to -1. */\n} FMOD_STUDIO_PROGRAMMER_SOUND_PROPERTIES;\n\n\n/*\n[STRUCTURE]\n[\n    [DESCRIPTION]\n    This structure holds information about a DSP plugin instance.\n\n    [REMARKS]\n    This data is passed to the event callback function when type is FMOD_STUDIO_EVENT_CALLBACK_PLUGIN_CREATED\n    or FMOD_STUDIO_EVENT_CALLBACK_PLUGIN_DESTROYED.\n\n    [SEE_ALSO]\n    FMOD_STUDIO_EVENT_CALLBACK\n    Studio::EventDescription::setCallback\n    Studio::EventInstance::setCallback\n]\n*/\ntypedef struct FMOD_STUDIO_PLUGIN_INSTANCE_PROPERTIES\n{\n    const char *name;                           /* The name of the plugin effect or sound (set in FMOD Studio). */\n    FMOD_DSP   *dsp;                            /* The DSP plugin instance. This can be cast to FMOD::DSP* type. */\n} FMOD_STUDIO_PLUGIN_INSTANCE_PROPERTIES;\n\n/*\n[STRUCTURE]\n[\n    [DESCRIPTION]\n    This structure holds information about a marker on the timeline.\n\n    [REMARKS]\n    This data is passed to the event callback function when type is FMOD_STUDIO_EVENT_CALLBACK_TIMELINE_MARKER.\n\n    [SEE_ALSO]\n    FMOD_STUDIO_EVENT_CALLBACK\n    Studio::EventDescription::setCallback\n    Studio::EventInstance::setCallback\n]\n*/\ntypedef struct FMOD_STUDIO_TIMELINE_MARKER_PROPERTIES\n{\n    const char *name;                           /* The marker name */\n    int         position;                       /* The position of the marker on the timeline in milliseconds. */\n} FMOD_STUDIO_TIMELINE_MARKER_PROPERTIES;\n\n/*\n[STRUCTURE]\n[\n    [DESCRIPTION]\n    This structure holds information about a beat on the timeline.\n\n    [REMARKS]\n    This data is passed to the event callback function when type is FMOD_STUDIO_EVENT_CALLBACK_TIMELINE_BEAT.\n\n    [SEE_ALSO]\n    FMOD_STUDIO_EVENT_CALLBACK\n    Studio::EventDescription::setCallback\n    Studio::EventInstance::setCallback\n]\n*/\ntypedef struct FMOD_STUDIO_TIMELINE_BEAT_PROPERTIES\n{\n    int     bar;                                /* The bar number (starting from 1). */\n    int     beat;                               /* The beat number within the bar (starting from 1). */\n    int     position;                           /* The position of the beat on the timeline in milliseconds. */\n    float   tempo;                              /* The current tempo in beats per minute. */\n    int     timesignatureupper;                 /* The current time signature upper number (beats per bar). */\n    int     timesignaturelower;                 /* The current time signature lower number (beat unit). */\n} FMOD_STUDIO_TIMELINE_BEAT_PROPERTIES;\n\n/*\n[ENUM]\n[\n    [DESCRIPTION]\n    These values describe the playback state of an event instance.\n\n    [REMARKS]\n\n    [SEE_ALSO]\n    Studio::EventInstance::getPlaybackState\n    Studio::EventInstance::start\n    Studio::EventInstance::stop\n    FMOD_STUDIO_EVENT_CALLBACK_TYPE\n]\n*/\ntypedef enum FMOD_STUDIO_PLAYBACK_STATE\n{\n    FMOD_STUDIO_PLAYBACK_PLAYING,               /* Currently playing. */\n    FMOD_STUDIO_PLAYBACK_SUSTAINING,            /* The timeline cursor is paused on a sustain point. */\n    FMOD_STUDIO_PLAYBACK_STOPPED,               /* Not playing. */\n    FMOD_STUDIO_PLAYBACK_STARTING,              /* Start has been called but the instance is not fully started yet. */\n    FMOD_STUDIO_PLAYBACK_STOPPING,              /* Stop has been called but the instance is not fully stopped yet. */\n\n    FMOD_STUDIO_PLAYBACK_FORCEINT = 65536       /* Makes sure this enum is signed 32bit. */\n} FMOD_STUDIO_PLAYBACK_STATE;\n\n\n/*\n[ENUM]\n[\n    [DESCRIPTION]\n    Controls how to stop playback of an event instance.\n\n    [REMARKS]\n\n    [SEE_ALSO]\n    Studio::EventInstance::stop\n    Studio::Bus::stopAllEvents\n]\n*/\ntypedef enum FMOD_STUDIO_STOP_MODE\n{\n    FMOD_STUDIO_STOP_ALLOWFADEOUT,              /* Allows AHDSR modulators to complete their release, and DSP effect tails to play out. */\n    FMOD_STUDIO_STOP_IMMEDIATE,                 /* Stops the event instance immediately. */\n\n    FMOD_STUDIO_STOP_FORCEINT = 65536           /* Makes sure this enum is signed 32bit. */\n} FMOD_STUDIO_STOP_MODE;\n\n\n/*\n[DEFINE]\n[\n    [NAME]\n    FMOD_STUDIO_LOAD_BANK_FLAGS\n\n    [DESCRIPTION]\n    Flags passed into Studio loadBank commands to control bank load behaviour.\n\n    [REMARKS]\n\n    [SEE_ALSO]\n    Studio::System::loadBankFile\n    Studio::System::loadBankMemory\n    Studio::System::loadBankCustom\n]\n*/\n#define FMOD_STUDIO_LOAD_BANK_NORMAL                0x00000000         /* Standard behaviour. */\n#define FMOD_STUDIO_LOAD_BANK_NONBLOCKING           0x00000001         /* Bank loading occurs asynchronously rather than occurring immediately. */\n#define FMOD_STUDIO_LOAD_BANK_DECOMPRESS_SAMPLES    0x00000002         /* Force samples to decompress into memory when they are loaded, rather than staying compressed. */\n/* [DEFINE_END] */\n\ntypedef unsigned int FMOD_STUDIO_LOAD_BANK_FLAGS;\n\n\n/*\n[STRUCTURE]\n[\n    [DESCRIPTION]\n    Settings for advanced features like configuring memory and cpu usage.\n\n    [REMARKS]\n    Members marked with [r] mean the variable is modified by FMOD and is for reading purposes only.  Do not change this value.<br>\n    Members marked with [w] mean the variable can be written to.  The user can set the value.<br>\n    Members marked with [r/w] are either read or write depending on if you are using System::setAdvancedSettings (w) or System::getAdvancedSettings (r).\n\n    [SEE_ALSO]\n    Studio::System::setAdvancedSettings\n    Studio::System::getAdvancedSettings\n    FMOD_MODE\n]\n*/\ntypedef struct FMOD_STUDIO_ADVANCEDSETTINGS\n{\n    int             cbsize;                     /* [w]   Size of this structure.  Use sizeof(FMOD_STUDIO_ADVANCEDSETTINGS)  NOTE: This must be set before calling Studio::System::getAdvancedSettings or Studio::System::setAdvancedSettings! */\n    unsigned int    commandqueuesize;           /* [r/w] Optional. Specify 0 to ignore. Specify the command queue size for studio async processing.  Default 32kB. */\n    unsigned int    handleinitialsize;          /* [r/w] Optional. Specify 0 to ignore. Specify the initial size to allocate for handles.  Memory for handles will grow as needed in pages. Default 8192 * sizeof(void*) */\n    int             studioupdateperiod;         /* [r/w] Optional. Specify 0 to ignore. Specify the update period of Studio when in async mode, in milliseconds.  Will be quantised to the nearest multiple of mixer duration.  Default is 20ms. */\n    int             idlesampledatapoolsize;     /* [r/w] Optional. Specify 0 to ignore. Specify the amount of sample data to keep in memory when no longer used, to avoid repeated disk IO.  Use -1 to disable.  Default is 256kB. */\n    unsigned int    streamingscheduledelay;     /* [r/w] Optional. Specify 0 to ignore. Specify the schedule delay for streams, in samples.  Lower values can reduce latency when scheduling events containing streams but may cause scheduling issues if too small. Default is 8192 samples. */\n} FMOD_STUDIO_ADVANCEDSETTINGS;\n\n\n/*\n[STRUCTURE]\n[\n    [DESCRIPTION]\n    Performance information for FMOD Studio and low level systems.\n\n    [REMARKS]\n\n    [SEE_ALSO]\n    Studio::System::getCPUUsage\n]\n*/\ntypedef struct FMOD_STUDIO_CPU_USAGE\n{\n    float           dspusage;                   /* Returns the % CPU time taken by DSP processing on the low level mixer thread. */\n    float           streamusage;                /* Returns the % CPU time taken by stream processing on the low level stream thread. */\n    float           geometryusage;              /* Returns the % CPU time taken by geometry processing on the low level geometry thread. */\n    float           updateusage;                /* Returns the % CPU time taken by low level update, called as part of the studio update. */\n    float           studiousage;                /* Returns the % CPU time taken by studio update, called from the studio thread. Does not include low level update time. */\n} FMOD_STUDIO_CPU_USAGE;\n\n\n/*\n[STRUCTURE]\n[\n    [DESCRIPTION]\n    Information for a single buffer in FMOD Studio.\n\n    [REMARKS]\n\n    [SEE_ALSO]\n    FMOD_STUDIO_BUFFER_USAGE\n]\n*/\ntypedef struct FMOD_STUDIO_BUFFER_INFO\n{\n    int             currentusage;               /* Current buffer usage in bytes. */\n    int             peakusage;                  /* Peak buffer usage in bytes. */\n    int             capacity;                   /* Buffer capacity in bytes. */\n    int             stallcount;                 /* Cumulative number of stalls due to buffer overflow. */\n    float           stalltime;                  /* Cumulative amount of time stalled due to buffer overflow, in seconds. */\n} FMOD_STUDIO_BUFFER_INFO;\n\n\n/*\n[STRUCTURE]\n[\n    [DESCRIPTION]\n    Information for FMOD Studio buffer usage.\n\n    [REMARKS]\n\n    [SEE_ALSO]\n    Studio::System::getBufferUsage\n    Studio::System::resetBufferUsage\n    FMOD_STUDIO_BUFFER_INFO\n]\n*/\ntypedef struct FMOD_STUDIO_BUFFER_USAGE\n{\n    FMOD_STUDIO_BUFFER_INFO studiocommandqueue; /* Information for the Studio Async Command buffer, controlled by FMOD_STUDIO_ADVANCEDSETTINGS commandQueueSize. */\n    FMOD_STUDIO_BUFFER_INFO studiohandle;       /* Information for the Studio handle table, controlled by FMOD_STUDIO_ADVANCEDSETTINGS handleInitialSize. */\n} FMOD_STUDIO_BUFFER_USAGE;\n\n\n/*\n[STRUCTURE]\n[\n    [DESCRIPTION]\n    Information for loading a sound from a sound table.\n\n    [REMARKS]\n    The name_or_data member points into FMOD internal memory, which will become\n    invalid if the sound table bank is unloaded.\n\n    If mode flags such as FMOD_CREATESTREAM, FMOD_CREATECOMPRESSEDSAMPLE or FMOD_NONBLOCKING are required,\n    it is up to the user to OR them together when calling System::createSound.\n\n    [SEE_ALSO]\n    Studio::System::getSoundInfo\n    System::createSound\n]\n*/\ntypedef struct FMOD_STUDIO_SOUND_INFO\n{\n    const char             *name_or_data;       /* The filename or memory buffer that contains the sound. */\n    FMOD_MODE               mode;               /* Mode flags required for loading the sound. */\n    FMOD_CREATESOUNDEXINFO  exinfo;             /* Extra information required for loading the sound. */\n    int                     subsoundindex;      /* Subsound index for loading the sound. */\n} FMOD_STUDIO_SOUND_INFO;\n\n\n/*\n[DEFINE]\n[\n    [NAME]\n    FMOD_STUDIO_COMMANDCAPTURE_FLAGS\n\n    [DESCRIPTION]\n    Flags passed into Studio::System::startCommandCapture.\n\n    [REMARKS]\n\n    [SEE_ALSO]\n    Studio::System::startCommandCapture\n]\n*/\n#define FMOD_STUDIO_COMMANDCAPTURE_NORMAL                      0x00000000       /* Standard behaviour. */\n#define FMOD_STUDIO_COMMANDCAPTURE_FILEFLUSH                   0x00000001       /* Call file flush on every command. */\n#define FMOD_STUDIO_COMMANDCAPTURE_SKIP_INITIAL_STATE          0x00000002       /* Normally the initial state of banks and instances is captured, unless this flag is set. */\n/* [DEFINE_END] */\n\ntypedef unsigned int FMOD_STUDIO_COMMANDCAPTURE_FLAGS;\n\n\n/*\n[DEFINE]\n[\n    [NAME]\n    FMOD_STUDIO_COMMANDREPLAY_FLAGS\n\n    [DESCRIPTION]\n    Flags passed into Studio::System::loadCommandReplay.\n\n    [REMARKS]\n\n    [SEE_ALSO]\n    Studio::System::loadCommandReplay\n]\n*/\n#define FMOD_STUDIO_COMMANDREPLAY_NORMAL               0x00000000       /* Standard behaviour. */\n#define FMOD_STUDIO_COMMANDREPLAY_SKIP_CLEANUP         0x00000001       /* Normally the playback will release any created resources when it stops, unless this flag is set. */\n#define FMOD_STUDIO_COMMANDREPLAY_FAST_FORWARD         0x00000002       /* Play back at maximum speed, ignoring the timing of the original replay. */\n#define FMOD_STUDIO_COMMANDREPLAY_SKIP_BANK_LOAD       0x00000004       /* Skip commands related to bank loading. */\n/* [DEFINE_END] */\n\ntypedef unsigned int FMOD_STUDIO_COMMANDREPLAY_FLAGS;\n\n\n/*\n[ENUM]\n[\n    [DESCRIPTION]\n    Used to distinguish the types used in command replays.\n\n    [REMARKS]\n\n    [SEE_ALSO]\n]\n*/\ntypedef enum FMOD_STUDIO_INSTANCETYPE\n{\n    FMOD_STUDIO_INSTANCETYPE_NONE,\n    FMOD_STUDIO_INSTANCETYPE_SYSTEM,\n    FMOD_STUDIO_INSTANCETYPE_EVENTDESCRIPTION,\n    FMOD_STUDIO_INSTANCETYPE_EVENTINSTANCE,\n    FMOD_STUDIO_INSTANCETYPE_PARAMETERINSTANCE,\n    FMOD_STUDIO_INSTANCETYPE_BUS,\n    FMOD_STUDIO_INSTANCETYPE_VCA,\n    FMOD_STUDIO_INSTANCETYPE_BANK,\n    FMOD_STUDIO_INSTANCETYPE_COMMANDREPLAY,\n\n    FMOD_STUDIO_INSTANCETYPE_FORCEINT = 65536    /* Makes sure this enum is signed 32bit. */\n} FMOD_STUDIO_INSTANCETYPE;\n\n\n/*\n[STRUCTURE]\n[\n    [DESCRIPTION]\n    Information about a single command in a command replay file.\n\n    [REMARKS]\n    This information has metadata about the command at the given index.  Note that the handle fields are\n    from the recorded session, and will no longer correspond to any actual object type in the current\n    system.\n\n    [SEE_ALSO]\n    Studio::CommandReplay::getCommandInfo\n]\n*/\ntypedef struct FMOD_STUDIO_COMMAND_INFO\n{\n    const char                 *commandname;        /* The full name of the API function for this command. */\n    int                         parentcommandindex; /* For commands that operate on an instance, this is the command that created the instance. */\n    int                         framenumber;        /* The frame the command belongs to. */\n    float                       frametime;          /* The playback time at which this command will be executed. */\n    FMOD_STUDIO_INSTANCETYPE    instancetype;       /* The type of object that this command uses as an instance. */\n    FMOD_STUDIO_INSTANCETYPE    outputtype;         /* The type of object that this command outputs, if any. */\n    unsigned int                instancehandle;     /* The original handle value of the instance.  This will no longer correspond to any actual object in playback. */\n    unsigned int                outputhandle;       /* The original handle value of the command output.  This will no longer correspond to any actual object in playback. */\n} FMOD_STUDIO_COMMAND_INFO;\n\n\n/*\n    FMOD Studio callbacks.\n*/\ntypedef FMOD_RESULT (F_CALLBACK *FMOD_STUDIO_SYSTEM_CALLBACK)                           (FMOD_STUDIO_SYSTEM *system, FMOD_STUDIO_SYSTEM_CALLBACK_TYPE type, void *commanddata, void *userdata);\ntypedef FMOD_RESULT (F_CALLBACK *FMOD_STUDIO_EVENT_CALLBACK)                            (FMOD_STUDIO_EVENT_CALLBACK_TYPE type, FMOD_STUDIO_EVENTINSTANCE *event, void *parameters);\ntypedef FMOD_RESULT (F_CALLBACK *FMOD_STUDIO_COMMANDREPLAY_FRAME_CALLBACK)              (FMOD_STUDIO_COMMANDREPLAY *replay, int commandIndex, float currentTime, void *userdata);\ntypedef FMOD_RESULT (F_CALLBACK *FMOD_STUDIO_COMMANDREPLAY_LOAD_BANK_CALLBACK)          (FMOD_STUDIO_COMMANDREPLAY *replay, int commandIndex, const FMOD_GUID *bankGuid, const char *bankFilename, FMOD_STUDIO_LOAD_BANK_FLAGS flags, FMOD_STUDIO_BANK **bank, void *userdata);\ntypedef FMOD_RESULT (F_CALLBACK *FMOD_STUDIO_COMMANDREPLAY_CREATE_INSTANCE_CALLBACK)    (FMOD_STUDIO_COMMANDREPLAY *replay, int commandIndex, FMOD_STUDIO_EVENTDESCRIPTION *eventDescription, FMOD_STUDIO_EVENTINSTANCE **instance, void *userdata);\n\n#endif // FMOD_STUDIO_COMMON_H\n"
  },
  {
    "path": "Plugins/FMODStudio/Source/FMODStudio/Public/FMOD/fmoddurango.h",
    "content": "#pragma once\n\nstruct ID3D12Device;\n\n/*\n[ENUM]\n[\n    [DESCRIPTION]\n    Cores available for mapping threads onto.\n\n    [REMARKS]\n\n    [SEE_ALSO]\n    FMOD_DURANGO_THREADAFFINITY\n]\n*/\ntypedef enum FMOD_THREAD\n{\n    FMOD_THREAD_DEFAULT = 0,        /* Use default thread assignment. */\n    FMOD_THREAD_CORE0   = 1 << 0,\n    FMOD_THREAD_CORE1   = 1 << 1,\n    FMOD_THREAD_CORE2   = 1 << 2,   /* Default for all threads. */\n    FMOD_THREAD_CORE3   = 1 << 3,\n    FMOD_THREAD_CORE4   = 1 << 4,\n    FMOD_THREAD_CORE5   = 1 << 5,\n    FMOD_THREAD_CORE6   = 1 << 6,\n} FMOD_THREAD;\n\n\n/*\n[ENUM]\n[\n    [DESCRIPTION]\n    Port types avaliable for routing audio.\n\n    [REMARKS]\n\n    [SEE_ALSO]\n    System::AttachChannelGroupToPort\n    FMOD_PORT_TYPE\n]\n*/\ntypedef enum FMOD_DURANGO_PORT_TYPE\n{\n    FMOD_DURANGO_PORT_TYPE_MUSIC,    /* Background music (ignored by GameDVR and ducked by user music), pass FMOD_PORT_INDEX_NONE as port index */\n} FMOD_DURANGO_PORT_TYPE;\n\n\n/*\n[STRUCTURE]\n[\n    [DESCRIPTION]\n    Mapping of cores to threads.\n\n    [REMARKS]\n\n    [SEE_ALSO]\n    FMOD_THREAD\n    FMOD_Durango_SetThreadAffinity\n]\n*/\ntypedef struct FMOD_DURANGO_THREADAFFINITY\n{\n    unsigned int mixer;             /* Software mixer (including mmdevapi.dll) thread. Cannot be assigned to FMOD_THREAD_CORE6. */\n    unsigned int stream;            /* Stream thread. */\n    unsigned int nonblocking;       /* Asynchronous sound loading thread. */\n    unsigned int file;              /* File thread. */\n    unsigned int geometry;          /* Geometry processing thread. */\n    unsigned int profiler;          /* Profiler threads. */\n    unsigned int studioUpdate;      /* Studio update thread. */\n    unsigned int studioLoadBank;    /* Studio bank loading thread. */\n    unsigned int studioLoadSample;  /* Studio sample loading thread. */\n} FMOD_DURANGO_THREADAFFINITY;\n\n\n/*\n[API]\n[\n    [DESCRIPTION]\n    Control which core particular FMOD threads are created on.\n\n    [PARAMETERS]\n    'affinity'    Pointer to a structure that describes the affinity for each thread.\n\n    [REMARKS]\n    Call before System::init or affinity values will not apply.\n\n    [SEE_ALSO]\n    FMOD_DURANGO_THREADAFFINITY\n]\n*/\nextern \"C\" FMOD_RESULT F_API FMOD_Durango_SetThreadAffinity(FMOD_DURANGO_THREADAFFINITY *affinity);\n\n\n/*\n[API]\n[\n    [DESCRIPTION]\n    Provide FMOD with the application's D3D12 device so it can allocate resources and\n    offload processing to the GPU.\n\n    [PARAMETERS]\n    'device'        The application's device.\n    'pipe'          TBA\n    'queue'         TBA\n    'garlicMem'     TBA\n    'garlicMemSize' TBA\n    'onionMem'      TBA\n    'onionMemSize'  TBA\n\n    [REMARKS]\n\n    [SEE_ALSO]\n    FMOD_Durango_ReleaseComputeDevice\n]\n*/\nextern \"C\" FMOD_RESULT F_API FMOD_Durango_SetComputeDevice(ID3D12Device *device, int pipe, int queue, void* garlicMem, int garlicMemSize, void* onionMem, int onionMemSize);\n\n\n/*\n[API]\n[\n    [DESCRIPTION]\n    Release all GPU compute resources and no longer offload processing.\n\n    [PARAMETERS]\n\n    [REMARKS]\n\n    [SEE_ALSO]\n    FMOD_Durango_SetComputeDevice\n]\n*/\nextern \"C\" FMOD_RESULT F_API FMOD_Durango_ReleaseComputeDevice();\n"
  },
  {
    "path": "Plugins/FMODStudio/Source/FMODStudio/Public/FMODStudioModule.h",
    "content": "// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2020.\n\n#pragma once\n\n#include \"Modules/ModuleManager.h\"\n\nnamespace FMOD\n{\nnamespace Studio\n{\nclass System;\nclass EventDescription;\nclass EventInstance;\n}\n}\n\nclass UFMODAsset;\nclass UFMODEvent;\nclass UWorld;\nclass AAudioVolume;\nstruct FInteriorSettings;\nstruct FFMODListener; // Currently only for private use, we don't export this type\n\n// Which FMOD Studio system to use\nnamespace EFMODSystemContext\n{\nenum Type\n{\n    // For use auditioning sounds within the editor\n    Auditioning,\n\n    // For use in PIE and in-game\n    Runtime,\n\n    // For use when playing events in an editor world (e.g. previewing a level sequence)\n    Editor,\n\n    // Max number of types\n    Max\n};\n}\n\n/**\n * The public interface to this module\n */\nclass IFMODStudioModule : public IModuleInterface\n{\npublic:\n    /**\n\t * Singleton-like access to this module's interface.  This is just for convenience!\n\t * Beware of calling this during the shutdown phase, though.  Your module might have been unloaded already.\n\t *\n\t * @return Returns singleton instance, loading the module on demand if needed\n\t */\n    static inline IFMODStudioModule &Get() { return FModuleManager::LoadModuleChecked<IFMODStudioModule>(\"FMODStudio\"); }\n\n    /**\n\t * Checks to see if this module is loaded and ready.  It is only valid to call Get() if IsAvailable() returns true.\n\t *\n\t * @return True if the module is loaded and ready to use\n\t */\n    static inline bool IsAvailable() { return FModuleManager::Get().IsModuleLoaded(\"FMODStudio\"); }\n\n    /**\n\t * Get a pointer to the runtime studio system (only valid in-game or in PIE)\n\t */\n    virtual FMOD::Studio::System *GetStudioSystem(EFMODSystemContext::Type Context) = 0;\n\n    /**\n\t * Set system paused (for PIE pause)\n\t */\n    virtual void SetSystemPaused(bool paused) = 0;\n\n    /**\n\t * Called when user changes any studio settings\n\t */\n    virtual void RefreshSettings() = 0;\n\n    /**\n\t * Called when we enter of leave PIE mode\n\t */\n    virtual void SetInPIE(bool bInPIE, bool bSimulating) = 0;\n\n    /**\n\t * Look up an asset given its name\n\t */\n    virtual UFMODAsset *FindAssetByName(const FString &Name) = 0;\n\n    /**\n\t * Look up an event given its name\n\t */\n    virtual UFMODEvent *FindEventByName(const FString &Name) = 0;\n\n    /**\n\t * Get an event description.\n\t * The system type can control which Studio system to use, or leave it as System_Max for it to choose automatically.\n\t */\n    virtual FMOD::Studio::EventDescription *GetEventDescription(\n        const UFMODEvent *Event, EFMODSystemContext::Type Context = EFMODSystemContext::Max) = 0;\n\n    /**\n\t * Create a single auditioning instance using the auditioning system\n\t */\n    virtual FMOD::Studio::EventInstance *CreateAuditioningInstance(const UFMODEvent *Event) = 0;\n\n    /**\n\t * Stop any auditioning instance\n\t */\n    virtual void StopAuditioningInstance() = 0;\n\n    /**\n\t * Return whether the listener(s) have moved\n\t */\n    virtual bool HasListenerMoved() = 0;\n\n    /**\n\t * Called to change the listener position for editor mode\n\t */\n    virtual void SetListenerPosition(int ListenerIndex, UWorld *World, const FTransform &ListenerTransform, float DeltaSeconds) = 0;\n\n    /**\n\t * Called to change the listener position for editor mode\n\t */\n    virtual void FinishSetListenerPosition(int NumListeners, float DeltaSeconds) = 0;\n\n    /**\n\t * Return the audio settings for the listener nearest the given location\n\t */\n    virtual const FFMODListener &GetNearestListener(const FVector &Location) = 0;\n\n    /** This event is fired after all banks were reloaded */\n    virtual FSimpleMulticastDelegate &BanksReloadedEvent() = 0;\n\n    /** Return a list of banks that failed to load due to an error */\n    virtual TArray<FString> GetFailedBankLoads(EFMODSystemContext::Type Context) = 0;\n\n    /** Return a list of plugins that appear to be needed  */\n    virtual TArray<FString> GetRequiredPlugins() = 0;\n\n    /** Register a plugin that is required */\n    virtual void AddRequiredPlugin(const FString &Plugin) = 0;\n\n    /** Returns whether sound is enabled for the game */\n    virtual bool UseSound() = 0;\n\n    /** Attempts to load a plugin by name */\n    virtual bool LoadPlugin(EFMODSystemContext::Type Context, const TCHAR *ShortName) = 0;\n\n    /** Log a FMOD error */\n    virtual void LogError(int result, const char *function) = 0;\n\n    /** Returns if the banks have been loaded */\n    virtual bool AreBanksLoaded() = 0;\n};\n"
  },
  {
    "path": "Plugins/FMODStudio/Source/FMODStudio/Public/FMODUtils.h",
    "content": "// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2020.\n\n#pragma once\n\n#include \"fmod_studio.hpp\"\n#include \"fmod.hpp\"\n\n#include \"Runtime/Launch/Resources/Version.h\"\n#include \"Engine/Engine.h\"\n\n#include \"FMODStudioModule.h\"\n\n#define verifyfmod(fn)                         \\\n    {                                          \\\n        FMOD_RESULT _result = (fn);            \\\n        if (_result != FMOD_OK)                \\\n        {                                      \\\n            FMODUtils::LogError(_result, #fn); \\\n        }                                      \\\n    }\n\nnamespace FMODUtils\n{\n\n// Unreal defines 1 unit == 1cm, so convert to metres for Studio automatically\n#define FMOD_VECTOR_SCALE_DEFAULT 0.01f\n\n// Just call into module\ninline void LogError(FMOD_RESULT result, const char *function)\n{\n    IFMODStudioModule::Get().LogError(result, function);\n}\n\ninline void Assign(FMOD_VECTOR &Dest, const FVector &Src)\n{\n    Dest.x = Src.X;\n    Dest.y = Src.Y;\n    Dest.z = Src.Z;\n}\n\ninline FMOD_VECTOR ConvertWorldVector(const FVector &Src)\n{\n    static FMatrix UE4toFMOD(FVector(0.0f, 0.0f, FMOD_VECTOR_SCALE_DEFAULT), FVector(FMOD_VECTOR_SCALE_DEFAULT, 0.0f, 0.0f),\n        FVector(0.0f, FMOD_VECTOR_SCALE_DEFAULT, 0.0f), FVector::ZeroVector);\n\n    FMOD_VECTOR Dest;\n    Assign(Dest, UE4toFMOD.TransformPosition(Src));\n    return Dest;\n}\n\ninline FMOD_VECTOR ConvertUnitVector(const FVector &Src)\n{\n    static FMatrix UE4toFMOD(FVector(0.0f, 0.0f, 1.0f), FVector(1.0f, 0.0f, 0.0f), FVector(0.0f, 1.0f, 0.0f), FVector::ZeroVector);\n\n    FMOD_VECTOR Dest;\n    Assign(Dest, UE4toFMOD.TransformVector(Src));\n    return Dest;\n}\n\ninline void Assign(FMOD_3D_ATTRIBUTES &Dest, const FTransform &Src)\n{\n    Dest.position = ConvertWorldVector(Src.GetTranslation());\n    Dest.forward = ConvertUnitVector(Src.GetUnitAxis(EAxis::X));\n    Dest.up = ConvertUnitVector(Src.GetUnitAxis(EAxis::Z));\n}\n\ninline float DistanceToUEScale(float FMODDistance)\n{\n    return FMODDistance / FMOD_VECTOR_SCALE_DEFAULT;\n}\n\ninline bool IsWorldAudible(UWorld *World, bool AllowInEditor)\n{\n    if (GEngine && IFMODStudioModule::Get().UseSound())\n    {\n        if (!IsValid(World))\n        {\n            return true;\n        }\n\n        if (World->bAllowAudioPlayback && World->GetNetMode() != NM_DedicatedServer)\n        {\n            EWorldType::Type previewEnum;\n            previewEnum = EWorldType::EditorPreview;\n            if (World->IsGameWorld() || World->WorldType == previewEnum || (AllowInEditor && World->WorldType == EWorldType::Editor))\n            {\n                return true;\n            }\n        }\n    }\n    return false;\n}\n\ninline FMOD::Studio::ID ConvertGuid(const FGuid &UnrealGuid)\n{\n    // Unreal doesn't follow the usual windows GUID format, instead it parses\n    // them as 4 integers\n    FMOD::Studio::ID StudioGuid;\n    FMemory::Memcpy(&StudioGuid, &UnrealGuid, sizeof(StudioGuid));\n    Swap(StudioGuid.Data2, StudioGuid.Data3);\n    Swap(StudioGuid.Data4[0], StudioGuid.Data4[3]);\n    Swap(StudioGuid.Data4[1], StudioGuid.Data4[2]);\n    Swap(StudioGuid.Data4[4], StudioGuid.Data4[7]);\n    Swap(StudioGuid.Data4[5], StudioGuid.Data4[6]);\n    return StudioGuid;\n}\n\ninline FGuid ConvertGuid(const FMOD::Studio::ID &StudioGuid)\n{\n    // Unreal doesn't follow the usual windows GUID format, instead it parses\n    // them as 4 integers\n    FMOD::Studio::ID CopiedGuid;\n    FMemory::Memcpy(&CopiedGuid, &StudioGuid, sizeof(StudioGuid));\n    Swap(CopiedGuid.Data2, CopiedGuid.Data3);\n    Swap(CopiedGuid.Data4[0], CopiedGuid.Data4[3]);\n    Swap(CopiedGuid.Data4[1], CopiedGuid.Data4[2]);\n    Swap(CopiedGuid.Data4[4], CopiedGuid.Data4[7]);\n    Swap(CopiedGuid.Data4[5], CopiedGuid.Data4[6]);\n    FGuid UnrealGuid;\n    FMemory::Memcpy(&UnrealGuid, &CopiedGuid, sizeof(CopiedGuid));\n    return UnrealGuid;\n}\n\ntemplate <class StudioType>\ninline FGuid GetID(StudioType *Instance)\n{\n    FMOD::Studio::ID StudioID = { 0 };\n    verifyfmod(Instance->getID(&StudioID));\n    return FMODUtils::ConvertGuid(StudioID);\n}\n\ntemplate <class StudioType>\ninline FString GetPath(StudioType *Instance)\n{\n    int ActualSize = 128; // Start with expected enough space\n    TArray<char> RawBuffer;\n    FMOD_RESULT Result;\n    do\n    {\n        RawBuffer.SetNum(ActualSize);\n        Result = Instance->getPath(RawBuffer.GetData(), ActualSize, &ActualSize);\n    } while (Result == FMOD_ERR_TRUNCATED);\n\n    if (Result == FMOD_OK)\n    {\n        return FString(UTF8_TO_TCHAR(RawBuffer.GetData()));\n    }\n    else\n    {\n        return FString();\n    }\n}\n\ninline FString LookupNameFromGuid(FMOD::Studio::System *StudioSystem, const FMOD::Studio::ID &Guid)\n{\n    int ActualSize = 128; // Start with expected enough space\n    TArray<char> RawBuffer;\n    FMOD_RESULT Result;\n    do\n    {\n        RawBuffer.SetNum(ActualSize);\n        Result = StudioSystem->lookupPath(&Guid, RawBuffer.GetData(), ActualSize, &ActualSize);\n    } while (Result == FMOD_ERR_TRUNCATED);\n\n    if (Result == FMOD_OK)\n    {\n        return FString(UTF8_TO_TCHAR(RawBuffer.GetData()));\n    }\n    else\n    {\n        return FString();\n    }\n}\n\ninline FString LookupNameFromGuid(FMOD::Studio::System *StudioSystem, const FGuid &Guid)\n{\n    return LookupNameFromGuid(StudioSystem, ConvertGuid(Guid));\n}\n\ninline FString ParameterTypeToString(FMOD_STUDIO_PARAMETER_TYPE Type)\n{\n    switch (Type)\n    {\n        case FMOD_STUDIO_PARAMETER_GAME_CONTROLLED:\n            return FString(\"Game Controlled\");\n        case FMOD_STUDIO_PARAMETER_AUTOMATIC_DISTANCE:\n            return FString(\"Distance (Auto)\");\n        case FMOD_STUDIO_PARAMETER_AUTOMATIC_EVENT_CONE_ANGLE:\n            return FString(\"Event Cone Angle (Auto)\");\n        case FMOD_STUDIO_PARAMETER_AUTOMATIC_EVENT_ORIENTATION:\n            return FString(\"Event Orientation (Auto)\");\n        case FMOD_STUDIO_PARAMETER_AUTOMATIC_DIRECTION:\n            return FString(\"Direction (Auto)\");\n        case FMOD_STUDIO_PARAMETER_AUTOMATIC_ELEVATION:\n            return FString(\"Elevation (Auto)\");\n        case FMOD_STUDIO_PARAMETER_AUTOMATIC_LISTENER_ORIENTATION:\n            return FString(\"Listener Orientation (Auto)\");\n    }\n\n    return FString();\n}\n}"
  },
  {
    "path": "Plugins/FMODStudio/Source/FMODStudioEditor/Classes/FMODAmbientSoundActorFactory.h",
    "content": "// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2020.\n\n#pragma once\n\n#include \"ActorFactories/ActorFactory.h\"\n#include \"FMODAmbientSoundActorFactory.generated.h\"\n\n/** FMOD Ambient Sound Actor Factory.\n*/\nUCLASS(MinimalAPI, config = Editor, collapsecategories, hidecategories = Object)\nclass UFMODAmbientSoundActorFactory : public UActorFactory\n{\n    GENERATED_UCLASS_BODY()\n\n    // Begin UActorFactory Interface\n    virtual void PostSpawnActor(UObject *Asset, AActor *NewActor) override;\n    virtual void PostCreateBlueprint(UObject *Asset, AActor *CDO) override;\n    virtual bool CanCreateActorFrom(const FAssetData &AssetData, FText &OutErrorMsg) override;\n    virtual UObject *GetAssetFromActorInstance(AActor *ActorInstance) override;\n    // End UActorFactory Interface\n};\n"
  },
  {
    "path": "Plugins/FMODStudio/Source/FMODStudioEditor/FMODStudioEditor.Build.cs",
    "content": "// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2020.\nusing System.IO;\n\nnamespace UnrealBuildTool.Rules\n{\n    public class FMODStudioEditor : ModuleRules\n    {\n    #if WITH_FORWARDED_MODULE_RULES_CTOR\n        public FMODStudioEditor(ReadOnlyTargetRules Target) : base(Target)\n    #else\n        public FMODStudioEditor(TargetInfo Target)\n    #endif\n        {\n            PCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs;\n            PrivatePCHHeaderFile = \"Private/FMODStudioEditorPrivatePCH.h\";\n\n            bFasterWithoutUnity = false;\n\n            PrivateIncludePaths.AddRange(\n                new string[] {\n                    \"FMODStudio/Private\",\n                    \"FMODStudio/Public/FMOD\",\n                    Path.Combine(ModuleDirectory, \"Classes\")\n                }\n                );\n\n            PublicDependencyModuleNames.AddRange(\n                new string[]\n                {\n                    \"Core\",\n                    \"CoreUObject\",\n                    \"Engine\",\n                    \"FMODStudio\",\n                    \"InputCore\",\n                    \"UnrealEd\",\n                    \"Sequencer\"\n                }\n                );\n\n            PrivateDependencyModuleNames.AddRange(\n                new string[]\n                {\n                    \"Slate\",\n                    \"SlateCore\",\n                    \"Settings\",\n                    \"EditorStyle\",\n                    \"LevelEditor\",\n                    \"AssetTools\",\n                    \"AssetRegistry\",\n                    \"PropertyEditor\",\n                    \"WorkspaceMenuStructure\",\n                    \"Sockets\",\n                    \"LevelSequence\",\n                    \"MainFrame\",\n                    \"MovieScene\",\n                    \"MovieSceneTracks\",\n                    \"MovieSceneTools\"\n                }\n                );\n        }\n    }\n}\n"
  },
  {
    "path": "Plugins/FMODStudio/Source/FMODStudioEditor/Private/AssetTypeActions_FMODEvent.cpp",
    "content": "// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2020.\n\n#include \"AssetTypeActions_FMODEvent.h\"\n#include \"AssetTypeActions_Base.h\"\n#include \"FMODEventEditor.h\"\n#include \"FMODEvent.h\"\n#include \"FMODUtils.h\"\n#include \"FMODStudioModule.h\"\n#include \"FMODStudioEditorModule.h\"\n#include \"UnrealEd/Public/Editor.h\"\n#include \"Framework/MultiBox/MultiBoxBuilder.h\"\n#include \"EditorStyle/Public/EditorStyleSet.h\"\n\n#define LOCTEXT_NAMESPACE \"AssetTypeActions\"\n\nFAssetTypeActions_FMODEvent::FAssetTypeActions_FMODEvent()\n    : CurrentPreviewEventInstance(nullptr)\n{\n    BeginPIEDelegateHandle = FEditorDelegates::BeginPIE.AddRaw(this, &FAssetTypeActions_FMODEvent::HandleBeginPIE);\n    IFMODStudioModule::Get().BanksReloadedEvent().AddRaw(this, &FAssetTypeActions_FMODEvent::HandleBanksReloaded);\n}\n\nFAssetTypeActions_FMODEvent::~FAssetTypeActions_FMODEvent()\n{\n    FEditorDelegates::BeginPIE.Remove(BeginPIEDelegateHandle);\n    IFMODStudioModule::Get().BanksReloadedEvent().RemoveAll(this);\n    IFMODStudioModule::Get().StopAuditioningInstance();\n}\n\nUClass *FAssetTypeActions_FMODEvent::GetSupportedClass() const\n{\n    return UFMODEvent::StaticClass();\n}\n\nvoid FAssetTypeActions_FMODEvent::GetActions(const TArray<UObject *> &InObjects, FMenuBuilder &MenuBuilder)\n{\n    auto Events = GetTypedWeakObjectPtrs<UFMODEvent>(InObjects);\n\n    MenuBuilder.AddMenuEntry(LOCTEXT(\"FMODEvent_Play\", \"Play\"), LOCTEXT(\"FMODEvent_PlayTooltip\", \"Plays the selected FMOD event.\"),\n        FSlateIcon(FEditorStyle::GetStyleSetName(), \"MediaAsset.AssetActions.Play\"),\n        FUIAction(FExecuteAction::CreateSP(this, &FAssetTypeActions_FMODEvent::ExecutePlay, Events),\n            FCanExecuteAction::CreateSP(this, &FAssetTypeActions_FMODEvent::CanExecutePlayCommand, Events)));\n\n    MenuBuilder.AddMenuEntry(LOCTEXT(\"FMODEvent_Stop\", \"Stop\"), LOCTEXT(\"FMODEvent_StopTooltip\", \"Stops the currently playing FMOD event.\"),\n        FSlateIcon(FEditorStyle::GetStyleSetName(), \"MediaAsset.AssetActions.Stop\"),\n        FUIAction(FExecuteAction::CreateSP(this, &FAssetTypeActions_FMODEvent::ExecuteStop, Events), FCanExecuteAction()));\n}\n\nvoid FAssetTypeActions_FMODEvent::OpenAssetEditor(const TArray<UObject *> &InObjects, TSharedPtr<IToolkitHost> EditWithinLevelEditor)\n{\n    EToolkitMode::Type Mode = EditWithinLevelEditor.IsValid() ? EToolkitMode::WorldCentric : EToolkitMode::Standalone;\n\n    for (auto ObjIt = InObjects.CreateConstIterator(); ObjIt; ++ObjIt)\n    {\n        auto Event = Cast<UFMODEvent>(*ObjIt);\n        if (IsValid(Event))\n        {\n            TSharedRef<FFMODEventEditor> NewFMODEventEditor(new FFMODEventEditor());\n            NewFMODEventEditor->InitFMODEventEditor(Mode, EditWithinLevelEditor, Event);\n        }\n    }\n}\n\nbool FAssetTypeActions_FMODEvent::CanExecutePlayCommand(TArray<TWeakObjectPtr<UFMODEvent>> Objects) const\n{\n    return Objects.Num() == 1;\n}\n\nvoid FAssetTypeActions_FMODEvent::AssetsActivated(const TArray<UObject *> &InObjects, EAssetTypeActivationMethod::Type ActivationType)\n{\n    if (ActivationType == EAssetTypeActivationMethod::Previewed)\n    {\n        for (auto ObjIt = InObjects.CreateConstIterator(); ObjIt; ++ObjIt)\n        {\n            UFMODEvent *Event = Cast<UFMODEvent>(*ObjIt);\n            if (IsValid(Event))\n            {\n                // Only play the first valid event\n                PlayEvent(Event);\n                break;\n            }\n        }\n    }\n    else\n    {\n        FAssetTypeActions_Base::AssetsActivated(InObjects, ActivationType);\n    }\n}\n\nvoid FAssetTypeActions_FMODEvent::ExecuteEdit(TArray<TWeakObjectPtr<UFMODEvent>> Objects)\n{\n    for (auto ObjIt = Objects.CreateConstIterator(); ObjIt; ++ObjIt)\n    {\n        auto Object = (*ObjIt).Get();\n        if (IsValid(Object))\n        {\n            FAssetEditorManager::Get().OpenEditorForAsset(Object);\n        }\n    }\n}\n\nvoid FAssetTypeActions_FMODEvent::ExecutePlay(TArray<TWeakObjectPtr<UFMODEvent>> Objects)\n{\n    for (auto ObjIt = Objects.CreateConstIterator(); ObjIt; ++ObjIt)\n    {\n        UFMODEvent *Event = (*ObjIt).Get();\n        if (IsValid(Event))\n        {\n            // Only play the first valid event\n            PlayEvent(Event);\n            break;\n        }\n    }\n}\n\nvoid FAssetTypeActions_FMODEvent::ExecuteStop(TArray<TWeakObjectPtr<UFMODEvent>> Objects)\n{\n    IFMODStudioModule::Get().StopAuditioningInstance();\n}\n\nvoid FAssetTypeActions_FMODEvent::PlayEvent(UFMODEvent *Event)\n{\n    if (IsValid(Event))\n    {\n        CurrentPreviewEventInstance = IFMODStudioModule::Get().CreateAuditioningInstance(Event);\n        if (CurrentPreviewEventInstance != nullptr)\n        {\n            CurrentPreviewEventInstance->start();\n        }\n    }\n}\n\nvoid FAssetTypeActions_FMODEvent::HandleBeginPIE(bool bSimulating)\n{\n    // Studio module will handle its own auditioning, just clear the handle\n    CurrentPreviewEventInstance = nullptr;\n}\n\nvoid FAssetTypeActions_FMODEvent::HandleBanksReloaded()\n{\n    // Studio module will handle its own auditioning, just clear the handle\n    CurrentPreviewEventInstance = nullptr;\n}\n\n#undef LOCTEXT_NAMESPACE\n"
  },
  {
    "path": "Plugins/FMODStudio/Source/FMODStudioEditor/Private/AssetTypeActions_FMODEvent.h",
    "content": "// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2020.\n\n#pragma once\n\n#include \"AssetTypeActions_Base.h\"\n\nnamespace FMOD\n{\nnamespace Studio\n{\nclass EventInstance;\n}\n}\n\nclass UFMODEvent;\n\nclass FAssetTypeActions_FMODEvent : public FAssetTypeActions_Base\n{\npublic:\n    FAssetTypeActions_FMODEvent();\n    ~FAssetTypeActions_FMODEvent();\n\n    // IAssetTypeActions Implementation\n    virtual FText GetName() const override { return NSLOCTEXT(\"AssetTypeActions\", \"AssetTypeActions_FMODEvent\", \"FMOD Event\"); }\n    virtual FColor GetTypeColor() const override { return FColor(0, 175, 255); }\n    virtual UClass *GetSupportedClass() const override;\n    virtual bool HasActions(const TArray<UObject *> &InObjects) const override { return true; }\n    virtual void GetActions(const TArray<UObject *> &InObjects, FMenuBuilder &MenuBuilder) override;\n    virtual void AssetsActivated(const TArray<UObject *> &InObjects, EAssetTypeActivationMethod::Type ActivationType) override;\n    virtual void OpenAssetEditor(\n        const TArray<UObject *> &InObjects, TSharedPtr<class IToolkitHost> EditWithinLevelEditor = TSharedPtr<IToolkitHost>()) override;\n    virtual bool CanFilter() override { return false; }\n    virtual uint32 GetCategories() override { return EAssetTypeCategories::Sounds; }\n\nprivate:\n    /** Returns true if only one event is selected to play */\n    bool CanExecutePlayCommand(TArray<TWeakObjectPtr<UFMODEvent>> Objects) const;\n\n    /** Handler for when Edit is selected */\n    void ExecuteEdit(TArray<TWeakObjectPtr<UFMODEvent>> Objects);\n\n    /** Handler for when Play is selected */\n    void ExecutePlay(TArray<TWeakObjectPtr<UFMODEvent>> Objects);\n\n    /** Handler for when Stop is selected */\n    void ExecuteStop(TArray<TWeakObjectPtr<UFMODEvent>> Objects);\n\n    /** Plays the event */\n    void PlayEvent(UFMODEvent *Event);\n\n    void HandleBeginPIE(bool bSimulating);\n    void HandleBanksReloaded();\n\n    FMOD::Studio::EventInstance *CurrentPreviewEventInstance;\n    FDelegateHandle BeginPIEDelegateHandle;\n};\n"
  },
  {
    "path": "Plugins/FMODStudio/Source/FMODStudioEditor/Private/FMODAmbientSoundActorFactory.cpp",
    "content": "// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2020.\n\n#include \"FMODAmbientSoundActorFactory.h\"\n#include \"FMODStudioEditorPrivatePCH.h\"\n#include \"FMODAmbientSound.h\"\n#include \"FMODEvent.h\"\n#include \"AssetRegistry/Public/AssetData.h\"\n#include \"Editor/EditorEngine.h\"\n\nUFMODAmbientSoundActorFactory::UFMODAmbientSoundActorFactory(const FObjectInitializer &ObjectInitializer)\n    : Super(ObjectInitializer)\n{\n    DisplayName = NSLOCTEXT(\"FMOD\", \"FMODAmbientSoundDisplayName\", \"FMOD Ambient Sound\");\n    NewActorClass = AFMODAmbientSound::StaticClass();\n}\n\nbool UFMODAmbientSoundActorFactory::CanCreateActorFrom(const FAssetData &AssetData, FText &OutErrorMsg)\n{\n    //We allow creating AAmbientSounds without an existing sound asset\n    if (UActorFactory::CanCreateActorFrom(AssetData, OutErrorMsg))\n    {\n        return true;\n    }\n\n    if (AssetData.IsValid() && !AssetData.GetClass()->IsChildOf(UFMODEvent::StaticClass()))\n    {\n        OutErrorMsg = NSLOCTEXT(\"FMOD\", \"CanCreateActorFrom_NoFMODEventAsset\", \"A valid FMOD Event asset must be specified.\");\n        return false;\n    }\n\n    return true;\n}\n\nvoid UFMODAmbientSoundActorFactory::PostSpawnActor(UObject *Asset, AActor *NewActor)\n{\n    UFMODEvent *Event = Cast<UFMODEvent>(Asset);\n\n    if (Event != NULL)\n    {\n        AFMODAmbientSound *NewSound = CastChecked<AFMODAmbientSound>(NewActor);\n        FActorLabelUtilities::SetActorLabelUnique(NewSound, Event->GetName());\n        NewSound->AudioComponent->Event = Event;\n    }\n}\n\nUObject *UFMODAmbientSoundActorFactory::GetAssetFromActorInstance(AActor *Instance)\n{\n    check(Instance->IsA(NewActorClass));\n    AFMODAmbientSound *SoundActor = CastChecked<AFMODAmbientSound>(Instance);\n\n    check(SoundActor->AudioComponent);\n    return SoundActor->AudioComponent->Event.Get();\n}\n\nvoid UFMODAmbientSoundActorFactory::PostCreateBlueprint(UObject *Asset, AActor *CDO)\n{\n    if (Asset != NULL && CDO != NULL)\n    {\n        UFMODEvent *Event = Cast<UFMODEvent>(Asset);\n\n        if (Event != NULL)\n        {\n            AFMODAmbientSound *NewSound = CastChecked<AFMODAmbientSound>(CDO);\n            NewSound->AudioComponent->Event = Event;\n        }\n    }\n}"
  },
  {
    "path": "Plugins/FMODStudio/Source/FMODStudioEditor/Private/FMODAssetBroker.h",
    "content": "// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2020.\n\n#pragma once\n\n#include \"ComponentAssetBroker.h\"\n#include \"FMODEvent.h\"\n\n//////////////////////////////////////////////////////////////////////////\n// FFMODAssetBroker\n\nclass FFMODAssetBroker : public IComponentAssetBroker\n{\npublic:\n    UClass *GetSupportedAssetClass() override { return UFMODEvent::StaticClass(); }\n\n    virtual bool AssignAssetToComponent(UActorComponent *InComponent, UObject *InAsset) override\n    {\n        if (UFMODAudioComponent *AudioComp = Cast<UFMODAudioComponent>(InComponent))\n        {\n            UFMODEvent *Event = Cast<UFMODEvent>(InAsset);\n\n            if ((Event != NULL) || (InAsset == NULL))\n            {\n                AudioComp->Event = Event;\n                return true;\n            }\n        }\n        return false;\n    }\n\n    virtual UObject *GetAssetFromComponent(UActorComponent *InComponent) override\n    {\n        if (UFMODAudioComponent *AudioComp = Cast<UFMODAudioComponent>(InComponent))\n        {\n            return AudioComp->Event.Get();\n        }\n        return NULL;\n    }\n};\n"
  },
  {
    "path": "Plugins/FMODStudio/Source/FMODStudioEditor/Private/FMODAudioComponentDetails.cpp",
    "content": "// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2020.\n\n#include \"FMODAudioComponentDetails.h\"\n#include \"Toolkits/AssetEditorManager.h\"\n#include \"FMODAmbientSound.h\"\n#include \"FMODStudioModule.h\"\n#include \"FMODEvent.h\"\n#include \"fmod_studio.hpp\"\n#include \"Widgets/Input/SButton.h\"\n#include \"PropertyEditor/Public/DetailLayoutBuilder.h\"\n#include \"PropertyEditor/Public/DetailCategoryBuilder.h\"\n\n#define LOCTEXT_NAMESPACE \"FMODStudio\"\n\nTSharedRef<IDetailCustomization> FFMODAudioComponentDetails::MakeInstance()\n{\n    return MakeShareable(new FFMODAudioComponentDetails);\n}\n\nvoid FFMODAudioComponentDetails::CustomizeDetails(IDetailLayoutBuilder &DetailBuilder)\n{\n    const TArray<TWeakObjectPtr<UObject>> &SelectedObjects = DetailBuilder.GetSelectedObjects();\n\n    for (int32 ObjectIndex = 0; !AudioComponent.IsValid() && ObjectIndex < SelectedObjects.Num(); ++ObjectIndex)\n    {\n        const TWeakObjectPtr<UObject> &CurrentObject = SelectedObjects[ObjectIndex];\n        if (CurrentObject.Get()->GetClass()->IsChildOf(UFMODAudioComponent::StaticClass()))\n        {\n            AudioComponent = Cast<UFMODAudioComponent>(CurrentObject.Get());\n        }\n        else\n        {\n            AudioComponent = Cast<AActor>(CurrentObject.Get())->FindComponentByClass<UFMODAudioComponent>();\n        }\n    }\n\n    DetailBuilder.EditCategory(TEXT(\"FMODAudio\"))\n        .AddCustomRow(\n            FText::GetEmpty())[SNew(SVerticalBox) +\n                               SVerticalBox::Slot()\n                                   .Padding(0, 2.0f, 0, 0)\n                                   .FillHeight(1.0f)\n                                   .VAlign(\n                                       VAlign_Center)[SNew(SHorizontalBox) +\n                                                      SHorizontalBox::Slot()\n                                                          .AutoWidth()\n                                                          .Padding(2.0f, 0.0f)\n                                                          .VAlign(VAlign_Center)\n                                                          .HAlign(HAlign_Left)[SNew(SButton)\n                                                                                   .VAlign(VAlign_Center)\n                                                                                   .OnClicked(this, &FFMODAudioComponentDetails::OnEditSoundClicked)\n                                                                                   .Text(LOCTEXT(\"View Details\", \"Details\"))] +\n                                                      SHorizontalBox::Slot()\n                                                          .AutoWidth()\n                                                          .Padding(2.0f, 0.0f)\n                                                          .VAlign(VAlign_Center)\n                                                          .HAlign(HAlign_Left)[SNew(SButton)\n                                                                                   .VAlign(VAlign_Center)\n                                                                                   .OnClicked(this, &FFMODAudioComponentDetails::OnPlaySoundClicked)\n                                                                                   .Text(LOCTEXT(\"Play FMOD Event\", \"Play\"))] +\n                                                      SHorizontalBox::Slot()\n                                                          .AutoWidth()\n                                                          .Padding(2.0f, 0.0f)\n                                                          .VAlign(VAlign_Center)\n                                                          .HAlign(HAlign_Left)[SNew(SButton)\n                                                                                   .VAlign(VAlign_Center)\n                                                                                   .OnClicked(this, &FFMODAudioComponentDetails::OnStopSoundClicked)\n                                                                                   .Text(LOCTEXT(\"Stop FMOD Event\", \"Stop\"))]]];\n}\n\nFReply FFMODAudioComponentDetails::OnEditSoundClicked()\n{\n    if (AudioComponent.IsValid())\n    {\n        UFMODEvent *Event = AudioComponent.Get()->Event.Get();\n        if (Event)\n        {\n            FAssetEditorManager::Get().OpenEditorForAsset(Event);\n        }\n    }\n\n    return FReply::Handled();\n}\n\nFReply FFMODAudioComponentDetails::OnPlaySoundClicked()\n{\n    if (AudioComponent.IsValid())\n    {\n        UFMODEvent *Event = AudioComponent.Get()->Event.Get();\n        if (IsValid(Event))\n        {\n            FMOD::Studio::EventInstance *Instance = IFMODStudioModule::Get().CreateAuditioningInstance(Event);\n            if (Instance)\n            {\n                for (auto param : AudioComponent->ParameterCache)\n                {\n                    Instance->setParameterValue(TCHAR_TO_UTF8(*param.Key.ToString()), param.Value);\n                }\n                Instance->start();\n            }\n        }\n    }\n\n    return FReply::Handled();\n}\n\nFReply FFMODAudioComponentDetails::OnStopSoundClicked()\n{\n    IFMODStudioModule::Get().StopAuditioningInstance();\n\n    return FReply::Handled();\n}\n\n#undef LOCTEXT_NAMESPACE\n"
  },
  {
    "path": "Plugins/FMODStudio/Source/FMODStudioEditor/Private/FMODAudioComponentDetails.h",
    "content": "// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2020.\n\n#pragma once\n\n//#include \"PropertyEditing.h\"\n#include \"PropertyCustomizationHelpers.h\"\n#include \"PropertyEditor/Public/IDetailCustomization.h\"\n\nclass FFMODAudioComponentDetails : public IDetailCustomization\n{\npublic:\n    /** Makes a new instance of this detail layout class for a specific detail view requesting it */\n    static TSharedRef<IDetailCustomization> MakeInstance();\n\nprivate:\n    /** IDetailCustomization interface */\n    virtual void CustomizeDetails(IDetailLayoutBuilder &DetailBuilder) override;\n\n    FReply OnEditSoundClicked();\n    FReply OnPlaySoundClicked();\n    FReply OnStopSoundClicked();\n\n    TWeakObjectPtr<class UFMODAudioComponent> AudioComponent;\n};"
  },
  {
    "path": "Plugins/FMODStudio/Source/FMODStudioEditor/Private/FMODAudioComponentVisualizer.cpp",
    "content": "// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2020.\n\n#include \"FMODAudioComponentVisualizer.h\"\n#include \"FMODAudioComponent.h\"\n#include \"FMODUtils.h\"\n#include \"FMODEvent.h\"\n#include \"fmod_studio.hpp\"\n#include \"Engine/Public/SceneView.h\"\n#include \"Engine/Public/SceneManagement.h\"\n\nvoid FFMODAudioComponentVisualizer::DrawVisualization(const UActorComponent *Component, const FSceneView *View, FPrimitiveDrawInterface *PDI)\n{\n    if (View->Family->EngineShowFlags.AudioRadius)\n    {\n        const UFMODAudioComponent *AudioComp = Cast<const UFMODAudioComponent>(Component);\n        if (IsValid(AudioComp) && AudioComp->Event.IsValid())\n        {\n            FMOD::Studio::EventDescription *EventDesc =\n                IFMODStudioModule::Get().GetEventDescription(AudioComp->Event.Get(), EFMODSystemContext::Auditioning);\n            if (EventDesc != nullptr)\n            {\n                bool bIs3D = false;\n                EventDesc->is3D(&bIs3D);\n                if (bIs3D)\n                {\n                    const FColor AudioOuterRadiusColor(255, 153, 0);\n                    const FColor AudioInnerRadiusColor(216, 130, 0);\n\n                    const FTransform &Transform = AudioComp->GetComponentTransform();\n\n                    float MinDistance = 0.0f;\n                    float MaxDistance = 0.0f;\n                    if (AudioComp->AttenuationDetails.bOverrideAttenuation)\n                    {\n                        MinDistance = AudioComp->AttenuationDetails.MinimumDistance;\n                        MaxDistance = AudioComp->AttenuationDetails.MaximumDistance;\n                    }\n                    else\n                    {\n                        EventDesc->getMinimumDistance(&MinDistance);\n                        EventDesc->getMaximumDistance(&MaxDistance);\n                    }\n                    MinDistance = FMODUtils::DistanceToUEScale(MinDistance);\n                    MaxDistance = FMODUtils::DistanceToUEScale(MaxDistance);\n\n                    DrawWireSphereAutoSides(PDI, Transform.GetTranslation(), AudioOuterRadiusColor, MinDistance, SDPG_World);\n                    if (MaxDistance != MinDistance)\n                    {\n                        DrawWireSphereAutoSides(PDI, Transform.GetTranslation(), AudioInnerRadiusColor, MaxDistance, SDPG_World);\n                    }\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Plugins/FMODStudio/Source/FMODStudioEditor/Private/FMODAudioComponentVisualizer.h",
    "content": "// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2020.\n\n#pragma once\n\n#include \"ComponentVisualizer.h\"\n\nclass FFMODAudioComponentVisualizer : public FComponentVisualizer\n{\npublic:\n    // Begin FComponentVisualizer interface\n    virtual void DrawVisualization(const UActorComponent *Component, const FSceneView *View, FPrimitiveDrawInterface *PDI) override;\n    // End FComponentVisualizer interface\n};\n"
  },
  {
    "path": "Plugins/FMODStudio/Source/FMODStudioEditor/Private/FMODEventEditor.cpp",
    "content": "// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2020.\n\n#include \"FMODEventEditor.h\"\n#include \"FMODEvent.h\"\n#include \"FMODStudioModule.h\"\n#include \"FMODUtils.h\"\n#include \"SFMODEventEditorPanel.h\"\n#include \"Widgets/Docking/SDockTab.h\"\n//#include \"WorkspaceMenuStructureModule.h\"\n#include \"fmod_studio.hpp\"\n#include \"UnrealEd/Public/Editor.h\"\n\n#define LOCTEXT_NAMESPACE \"FMODEventEditor\"\n\nDEFINE_LOG_CATEGORY_STATIC(LogFMODEventEditor, Log, All);\n\nconst FName FFMODEventEditor::EventEditorTabId(TEXT(\"FFMODEventEditor_EventView\"));\nconst FName FFMODEventEditor::FMODEventEditorAppIdentifier(TEXT(\"FMODEventEditorApp\"));\n\nvoid FFMODEventEditor::RegisterTabSpawners(const TSharedRef<class FTabManager> &NewTabManager)\n{\n    WorkspaceMenuCategory = NewTabManager->AddLocalWorkspaceMenuCategory(LOCTEXT(\"WorkspaceMenu_FMODEventEditor\", \"FMOD Event Editor\"));\n    auto WorkspaceMenuCategoryRef = WorkspaceMenuCategory.ToSharedRef();\n\n    FAssetEditorToolkit::RegisterTabSpawners(NewTabManager);\n\n    NewTabManager->RegisterTabSpawner(EventEditorTabId, FOnSpawnTab::CreateSP(this, &FFMODEventEditor::SpawnTab_EventEditor))\n        .SetDisplayName(LOCTEXT(\"EventTab\", \"FMOD Event\"))\n        .SetGroup(WorkspaceMenuCategoryRef);\n}\n\nvoid FFMODEventEditor::UnregisterTabSpawners(const TSharedRef<class FTabManager> &NewTabManager)\n{\n    FAssetEditorToolkit::UnregisterTabSpawners(NewTabManager);\n\n    NewTabManager->UnregisterTabSpawner(EventEditorTabId);\n}\n\nFFMODEventEditor::FFMODEventEditor()\n    : CurrentPreviewEventInstance(nullptr)\n{\n    IFMODStudioModule::Get().BanksReloadedEvent().AddRaw(this, &FFMODEventEditor::HandleBanksReloaded);\n    BeginPIEDelegateHandle = FEditorDelegates::BeginPIE.AddRaw(this, &FFMODEventEditor::HandleBeginPIE);\n}\n\nFFMODEventEditor::~FFMODEventEditor()\n{\n    IFMODStudioModule::Get().BanksReloadedEvent().RemoveAll(this);\n    FEditorDelegates::BeginPIE.Remove(BeginPIEDelegateHandle);\n\n    CurrentPreviewEventInstance = nullptr;\n}\n\nUFMODEvent *FFMODEventEditor::GetEditedEvent() const\n{\n    return EditedEvent;\n}\n\nFMOD::Studio::EventDescription *FFMODEventEditor::GetEventDescription() const\n{\n    return IFMODStudioModule::Get().GetEventDescription(EditedEvent, EFMODSystemContext::Auditioning);\n}\n\nvoid FFMODEventEditor::PlayEvent()\n{\n    CurrentPreviewEventInstance = IFMODStudioModule::Get().CreateAuditioningInstance(EditedEvent);\n    if (CurrentPreviewEventInstance != nullptr)\n    {\n        for (int32 ParamIdx = 0; ParamIdx < ParameterValues.Num(); ParamIdx++)\n        {\n            CurrentPreviewEventInstance->setParameterValueByIndex(ParamIdx, ParameterValues[ParamIdx]);\n        }\n\n        CurrentPreviewEventInstance->start();\n    }\n}\n\nvoid FFMODEventEditor::PauseEvent()\n{\n    if (CurrentPreviewEventInstance != nullptr)\n    {\n        bool bIsPaused = false;\n        CurrentPreviewEventInstance->getPaused(&bIsPaused);\n        CurrentPreviewEventInstance->setPaused(!bIsPaused);\n    }\n}\n\nvoid FFMODEventEditor::StopEvent()\n{\n    IFMODStudioModule::Get().StopAuditioningInstance();\n}\n\nvoid FFMODEventEditor::SetParameterValue(int32 ParameterIdx, float Value)\n{\n    ParameterValues[ParameterIdx] = Value;\n\n    if (CurrentPreviewEventInstance != nullptr)\n    {\n        CurrentPreviewEventInstance->setParameterValueByIndex(ParameterIdx, Value);\n    }\n}\n\nTArray<float> &FFMODEventEditor::GetParameterValues()\n{\n    return ParameterValues;\n}\n\nvoid FFMODEventEditor::InitFMODEventEditor(const EToolkitMode::Type Mode, const TSharedPtr<class IToolkitHost> &InitToolkitHost, UFMODEvent *Event)\n{\n    if (IsValid(Event))\n    {\n        EditedEvent = Event;\n\n        TSharedRef<FTabManager::FLayout> StandaloneDefaultLayout =\n            FTabManager::NewLayout(\"Standalone_FMODEventEditor_Layout\")\n                ->AddArea(FTabManager::NewPrimaryArea()\n                              ->SetOrientation(Orient_Vertical)\n                              ->Split(FTabManager::NewStack()->AddTab(EventEditorTabId, ETabState::OpenedTab)->SetHideTabWell(true)));\n\n        const bool bCreateDefaultStandaloneMenu = true;\n        const bool bCreateDefaultToolbar = false;\n        FAssetEditorToolkit::InitAssetEditor(Mode, InitToolkitHost, FFMODEventEditor::FMODEventEditorAppIdentifier, StandaloneDefaultLayout,\n            bCreateDefaultStandaloneMenu, bCreateDefaultToolbar, Event);\n    }\n}\n\nFName FFMODEventEditor::GetToolkitFName() const\n{\n    return FName(\"FMODEventEditor\");\n}\n\nFText FFMODEventEditor::GetBaseToolkitName() const\n{\n    return LOCTEXT(\"ToolkitName\", \"FMOD Event Editor\");\n}\n\nFString FFMODEventEditor::GetWorldCentricTabPrefix() const\n{\n    return LOCTEXT(\"WorldCentricTabPrefix\", \"FMOD Event \").ToString();\n}\n\nFLinearColor FFMODEventEditor::GetWorldCentricTabColorScale() const\n{\n    return FLinearColor(0.0f, 0.0f, 0.5f, 0.5f);\n}\n\nvoid FFMODEventEditor::CreateInternalWidgets()\n{\n    FMODEventEditorPanel = SNew(SFMODEventEditorPanel).FMODEventEditor(SharedThis(this));\n}\n\nTSharedRef<SDockTab> FFMODEventEditor::SpawnTab_EventEditor(const FSpawnTabArgs &Args)\n{\n    check(Args.GetTabId().TabType == EventEditorTabId);\n\n    CreateInternalWidgets();\n\n    return SAssignNew(OwnerTab, SDockTab)\n        .Label(LOCTEXT(\"EventEditorTitle\", \"FMOD Event\"))\n        .TabColorScale(GetTabColorScale())[FMODEventEditorPanel.ToSharedRef()];\n}\n\nvoid FFMODEventEditor::HandleBanksReloaded()\n{\n    CurrentPreviewEventInstance = nullptr;\n\n    CreateInternalWidgets();\n\n    if (OwnerTab.IsValid())\n    {\n        OwnerTab->SetContent(FMODEventEditorPanel.ToSharedRef());\n    }\n}\n\nvoid FFMODEventEditor::HandleBeginPIE(bool bSimulating)\n{\n    CurrentPreviewEventInstance = nullptr;\n}\n\n#undef LOCTEXT_NAMESPACE\n"
  },
  {
    "path": "Plugins/FMODStudio/Source/FMODStudioEditor/Private/FMODEventEditor.h",
    "content": "// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2020.\n\n#pragma once\n\n#include \"Toolkits/AssetEditorToolkit.h\"\n#include \"fmod_studio_common.h\"\n\nnamespace FMOD\n{\nnamespace Studio\n{\nclass EventDescription;\nclass EventInstance;\n}\n}\n\nclass FFMODEventEditor : public FAssetEditorToolkit\n{\npublic:\n    virtual void RegisterTabSpawners(const TSharedRef<class FTabManager> &NewTabManager) override;\n    virtual void UnregisterTabSpawners(const TSharedRef<class FTabManager> &NewTabManager) override;\n\n    /**\n\t* Edits the specified event\n\t*\n\t* @param\tMode\t\t\t\t\tAsset editing mode for this editor (standalone or world-centric)\n\t* @param\tInitToolkitHost\t\t\tWhen Mode is WorldCentric, this is the level editor instance to spawn this editor within\n\t* @param\tEvent\t\t\t\t\tThe event to edit\n\t*/\n    void InitFMODEventEditor(const EToolkitMode::Type Mode, const TSharedPtr<class IToolkitHost> &InitToolkitHost, class UFMODEvent *Event);\n\n    /** Constructor */\n    FFMODEventEditor();\n\n    /** Destructor */\n    virtual ~FFMODEventEditor();\n\n    UFMODEvent *GetEditedEvent() const;\n    FMOD::Studio::EventDescription *GetEventDescription() const;\n    void PlayEvent();\n    void PauseEvent();\n    void StopEvent();\n    void SetParameterValue(int32 ParameterIdx, float Value);\n    TArray<float> &GetParameterValues();\n\n    /** IToolkit interface */\n    virtual FName GetToolkitFName() const override;\n    virtual FText GetBaseToolkitName() const override;\n    virtual FString GetWorldCentricTabPrefix() const override;\n    virtual FLinearColor GetWorldCentricTabColorScale() const override;\n\n    TArray<float> ParameterValues;\n\nprivate:\n    FMOD::Studio::EventInstance *CurrentPreviewEventInstance;\n\n    void HandlePreBanksReloaded();\n    void HandleBanksReloaded();\n    void HandleBeginPIE(bool bSimulating);\n\n    /** Creates all internal widgets for the tabs to point at */\n    void CreateInternalWidgets();\n\n    /**\tSpawns the tab with the FMOD event inside */\n    TSharedRef<SDockTab> SpawnTab_EventEditor(const FSpawnTabArgs &Args);\n\n    TSharedPtr<class SFMODEventEditorPanel> FMODEventEditorPanel;\n    TSharedPtr<SDockTab> OwnerTab;\n\n    /**\tThe tab id for the event editor tab */\n    static const FName EventEditorTabId;\n\n    /** FMOD event editor app identifier string */\n    static const FName FMODEventEditorAppIdentifier;\n\n    class UFMODEvent *EditedEvent;\n\n    FDelegateHandle BeginPIEDelegateHandle;\n};\n"
  },
  {
    "path": "Plugins/FMODStudio/Source/FMODStudioEditor/Private/FMODSettingsCustomization.cpp",
    "content": "// Copyright (c), Firelight Technologies Pty, Ltd. 2020.\n\n#include \"FMODSettingsCustomization.h\"\n\n#include \"DetailCategoryBuilder.h\"\n#include \"DetailLayoutBuilder.h\"\n#include \"DetailWidgetRow.h\"\n#include \"FMODSettings.h\"\n#include \"IDetailPropertyRow.h\"\n#include \"Settings/ProjectPackagingSettings.h\"\n#include \"Styling/SlateColor.h\"\n#include \"Widgets/DeclarativeSyntaxSupport.h\"\n#include \"Widgets/SWidget.h\"\n#include \"Widgets/SCompoundWidget.h\"\n#include \"Widgets/SBoxPanel.h\"\n#include \"Widgets/Layout/SBorder.h\"\n#include \"Widgets/Layout/SWidgetSwitcher.h\"\n#include \"Widgets/Images/SImage.h\"\n#include \"Widgets/Text/STextBlock.h\"\n#include \"Widgets/Input/SButton.h\"\n\n#define LOCTEXT_NAMESPACE \"FMODSettings\"\n\nclass SSettingsMessage : public SCompoundWidget\n{\n    SLATE_BEGIN_ARGS(SSettingsMessage)\n    {}\n\n    // Called when the Setup button is clicked\n    SLATE_EVENT(FSimpleDelegate, OnSetupClicked)\n\n    SLATE_END_ARGS()\n\npublic:\n    void Construct(const FArguments& InArgs)\n    {\n        TSharedRef<SWidget> SettingsOkayWidget = MakeRow(\n            \"SettingsEditor.GoodIcon\",\n            LOCTEXT(\"SettingsOkayText\", \"FMOD Settings are valid, run the Validate FMOD command to perform additional checking.\"),\n            FText()\n        );\n\n        TSharedRef<SWidget> NoContentDirWidget = MakeRow(\n            \"SettingsEditor.WarningIcon\",\n            LOCTEXT(\"NoContentDirText\", \"Bank Output Directory directory has not been set.\"),\n            FText()\n        );\n\n        TSharedRef<SWidget> NotPackagedWidget = MakeRow(\n            \"SettingsEditor.WarningIcon\",\n            LOCTEXT(\"NotPackagedText\",\n                \"Bank Output Directory has not been added to the \\\"Additional Non-Asset Directories to Copy\\\" list.\"\n            ),\n            LOCTEXT(\"AddToNonUFS\", \"Add\")\n        );\n\n        TSharedRef<SWidget> AddedToUFSWidget = MakeRow(\n            \"SettingsEditor.WarningIcon\",\n            LOCTEXT(\"AddedToUFSText\", \n                \"Bank Output Directory has been added to the \\\"Additional Non-Asset Directories to Package\\\" list. \"\n                \"It is recommended to move FMOD to the \\\"Additional Non-Asset Directories to Copy\\\" list.\"\n            ),\n            LOCTEXT(\"MoveToNonUFS\", \"Move\")\n        );\n\n        TSharedRef<SWidget> AddedToBothWidget = MakeRow(\n            \"SettingsEditor.WarningIcon\",\n            LOCTEXT(\"AddedToBothText\",\n                \"Bank Output Directory has been added to the \\\"Additional Non-Asset Directories to Package\\\" list. \"\n                \"It is recommended to remove FMOD from the \\\"Additional Non-Asset Directories to Package\\\" list.\"\n            ),\n            LOCTEXT(\"RemoveFromUFS\", \"Remove\")\n        );\n\n        ChildSlot\n            [\n                SNew(SBorder)\n                .BorderBackgroundColor(this, &SSettingsMessage::GetBorderColor)\n                .BorderImage(FEditorStyle::GetBrush(\"ToolPanel.LightGroupBorder\"))\n                .Padding(8.0f)\n                [\n                    SNew(SWidgetSwitcher)\n                    .WidgetIndex(this, &SSettingsMessage::GetSetupStateAsInt)\n\n                    + SWidgetSwitcher::Slot()\n                    [\n                        SettingsOkayWidget\n                    ]\n\n                    + SWidgetSwitcher::Slot()\n                    [\n                        NoContentDirWidget\n                    ]\n\n                    + SWidgetSwitcher::Slot()\n                    [\n                        AddedToUFSWidget\n                    ]\n\n                    + SWidgetSwitcher::Slot()\n                    [\n                        NotPackagedWidget\n                    ]\n\n                    + SWidgetSwitcher::Slot()\n                    [\n                        AddedToBothWidget\n                    ]\n                ]\n            ];\n\n        UpdateState();\n    }\n\n    void Tick(const FGeometry& AllottedGeometry, const double InCurrentTime, const float InDeltaTime)\n    {\n        UpdateState();\n    }\n\nprivate:\n    FSlateColor GetBorderColor() const\n    {\n        if (SettingsState == UFMODSettings::Okay)\n        {\n            return FLinearColor::Green;\n        }\n        else\n        {\n            return FLinearColor(0.8f, 0, 0);\n        }\n    }\n\n    TSharedRef<SWidget> MakeRow(FName IconName, FText Message, FText ButtonMessage)\n    {\n        TSharedRef<SHorizontalBox> Result = SNew(SHorizontalBox)\n\n            // Status icon\n            + SHorizontalBox::Slot().AutoWidth().VAlign(VAlign_Center)[SNew(SImage).Image(FEditorStyle::GetBrush(IconName))]\n\n            // Notice\n            + SHorizontalBox::Slot()\n            .FillWidth(1.0f)\n            .Padding(16.0f, 0.0f)\n            .VAlign(VAlign_Center)[\n                SNew(STextBlock)\n                .ColorAndOpacity(FLinearColor::White)\n                .ShadowColorAndOpacity(FLinearColor::Black)\n                .ShadowOffset(FVector2D::UnitVector)\n                .AutoWrapText(true)\n                .Text(Message)\n            ];\n\n        if (!ButtonMessage.IsEmpty())\n        {\n            Result->AddSlot()\n                .AutoWidth()\n                .VAlign(VAlign_Center)\n                [\n                    SNew(SButton)\n                    .OnClicked(this, &SSettingsMessage::OnButtonPressed)\n                    .Text(ButtonMessage)\n                ];\n        }\n\n        return Result;\n    }\n\n    FReply OnButtonPressed()\n    {\n        const UFMODSettings& Settings = *GetDefault<UFMODSettings>();\n        UProjectPackagingSettings* PackagingSettings = Cast<UProjectPackagingSettings>(UProjectPackagingSettings::StaticClass()->GetDefaultObject());\n        bool UpdateConfigFile = false;\n\n        if (SettingsState == UFMODSettings::AddedToUFS || SettingsState == UFMODSettings::AddedToBoth)\n        {\n            // Remove from non-asset directories to package list\n            for (int i = 0; i < PackagingSettings->DirectoriesToAlwaysStageAsUFS.Num(); ++i)\n            {\n                if (PackagingSettings->DirectoriesToAlwaysStageAsUFS[i].Path.StartsWith(Settings.BankOutputDirectory.Path))\n                {\n                    PackagingSettings->DirectoriesToAlwaysStageAsUFS.RemoveAt(i);\n                    UpdateConfigFile = true;\n                    break;\n                }\n            }\n        }\n\n        if (SettingsState == UFMODSettings::AddedToUFS || SettingsState == UFMODSettings::NotPackaged)\n        {\n            // Add to non-asset directories to copy list\n            PackagingSettings->DirectoriesToAlwaysStageAsNonUFS.Add(Settings.BankOutputDirectory);\n            UpdateConfigFile = true;\n        }\n\n        if (UpdateConfigFile)\n        {\n            PackagingSettings->UpdateDefaultConfigFile();\n        }\n\n        UpdateState();\n        return FReply::Handled();\n    }\n\n    int32 GetSetupStateAsInt() const\n    {\n        return (int32)SettingsState;\n    }\n\n    void UpdateState()\n    {\n        const UFMODSettings& Settings = *GetDefault<UFMODSettings>();\n        SettingsState = Settings.Check();\n    }\n\nprivate:\n    UFMODSettings::EProblem SettingsState;\n};\n\nTSharedRef<IDetailCustomization> FFMODSettingsCustomization::MakeInstance()\n{\n    return MakeShareable(new FFMODSettingsCustomization);\n}\n\nFFMODSettingsCustomization::FFMODSettingsCustomization()\n{\n}\n\nvoid FFMODSettingsCustomization::CustomizeDetails(IDetailLayoutBuilder &DetailLayout)\n{\n    IDetailCategoryBuilder &PackagingCategory = DetailLayout.EditCategory(TEXT(\"Basic\"));\n    TSharedRef<SSettingsMessage> PlatformSetupMessage = SNew(SSettingsMessage);\n    PackagingCategory.AddCustomRow(LOCTEXT(\"Warning\", \"Warning\"), false).WholeRowWidget[PlatformSetupMessage];\n}\n\n#undef LOCTEXT_NAMESPACE\n"
  },
  {
    "path": "Plugins/FMODStudio/Source/FMODStudioEditor/Private/FMODSettingsCustomization.h",
    "content": "// Copyright (c), Firelight Technologies Pty, Ltd. 2020.\n\n#pragma once\n\n#include \"CoreMinimal.h\"\n#include \"Misc/Attribute.h\"\n#include \"Input/Reply.h\"\n#include \"IDetailCustomization.h\"\n#include \"PropertyHandle.h\"\n\nclass IDetailLayoutBuilder;\n\nclass FFMODSettingsCustomization : public IDetailCustomization\n{\npublic:\n    // Makes a new instance of this detail layout class for a specific detail view requesting it\n    static TSharedRef<IDetailCustomization> MakeInstance();\n\n    // IDetailCustomization interface\n    virtual void CustomizeDetails(IDetailLayoutBuilder& DetailLayout) override;\n    // End of IDetailCustomization interface\n\nprivate:\n    FFMODSettingsCustomization();\n};\n"
  },
  {
    "path": "Plugins/FMODStudio/Source/FMODStudioEditor/Private/FMODStudioEditorModule.cpp",
    "content": "// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2020.\n\n#include \"FMODStudioEditorModule.h\"\n#include \"FMODStudioModule.h\"\n#include \"FMODStudioStyle.h\"\n#include \"FMODAudioComponent.h\"\n#include \"FMODAssetBroker.h\"\n#include \"FMODSettings.h\"\n#include \"FMODUtils.h\"\n\n#include \"FMODEventEditor.h\"\n#include \"FMODAudioComponentVisualizer.h\"\n#include \"FMODAudioComponentDetails.h\"\n#include \"FMODSettingsCustomization.h\"\n#include \"Sequencer/FMODChannelEditors.h\"\n#include \"Sequencer/FMODEventControlSection.h\"\n#include \"Sequencer/FMODEventControlTrackEditor.h\"\n#include \"Sequencer/FMODEventParameterTrackEditor.h\"\n#include \"AssetTypeActions_FMODEvent.h\"\n\n#include \"UnrealEd/Public/AssetSelection.h\"\n#include \"Slate/Public/Framework/Notifications/NotificationManager.h\"\n#include \"Slate/Public/Widgets/Notifications/SNotificationList.h\"\n#include \"Developer/Settings/Public/ISettingsModule.h\"\n#include \"Developer/Settings/Public/ISettingsSection.h\"\n#include \"UnrealEd/Public/Editor.h\"\n#include \"Slate/SceneViewport.h\"\n#include \"LevelEditor/Public/LevelEditor.h\"\n#include \"Sockets/Public/SocketSubsystem.h\"\n#include \"Sockets/Public/Sockets.h\"\n#include \"Sockets/Public/IPAddress.h\"\n#include \"UnrealEd/Public/FileHelpers.h\"\n#include \"Sequencer/Public/ISequencerModule.h\"\n#include \"Sequencer/Public/SequencerChannelInterface.h\"\n#include \"MovieSceneTools/Public/ClipboardTypes.h\"\n#include \"Engine/Public/DebugRenderSceneProxy.h\"\n#include \"Engine/Classes/Debug/DebugDrawService.h\"\n#include \"Settings/ProjectPackagingSettings.h\"\n#include \"UnrealEdGlobals.h\"\n#include \"UnrealEd/Public/LevelEditorViewport.h\"\n#include \"ActorFactories/ActorFactory.h\"\n#include \"Engine/Canvas.h\"\n#include \"Editor/UnrealEdEngine.h\"\n#include \"Slate/Public/Framework/MultiBox/MultiBoxBuilder.h\"\n#include \"Misc/MessageDialog.h\"\n#include \"HAL/FileManager.h\"\n#include \"Interfaces/IMainFrameModule.h\"\n\n#include \"fmod_studio.hpp\"\n\n#define LOCTEXT_NAMESPACE \"FMODStudio\"\n\nDEFINE_LOG_CATEGORY(LogFMOD);\n\nclass FFMODStudioLink\n{\npublic:\n    FFMODStudioLink()\n        : SocketSubsystem(nullptr)\n        , Socket(nullptr)\n    {\n        SocketSubsystem = ISocketSubsystem::Get(PLATFORM_SOCKETSUBSYSTEM);\n    }\n\n    ~FFMODStudioLink() { Disconnect(); }\n\n    bool Connect()\n    {\n        if (!SocketSubsystem)\n            return false;\n\n        Disconnect();\n        Socket = SocketSubsystem->CreateSocket(NAME_Stream, TEXT(\"FMOD Studio Connection\"), false);\n\n        TSharedRef<FInternetAddr> Addr = SocketSubsystem->CreateInternetAddr();\n        bool Valid = false;\n        Addr->SetIp(TEXT(\"127.0.0.1\"), Valid);\n        if (!Valid)\n            return false;\n\n        Addr->SetPort(3663);\n        return Socket->Connect(*Addr);\n    }\n\n    void Disconnect()\n    {\n        if (SocketSubsystem && Socket)\n        {\n            SocketSubsystem->DestroySocket(Socket);\n            Socket = nullptr;\n        }\n    }\n\n    bool Execute(const TCHAR *Message, FString &OutMessage)\n    {\n        OutMessage = TEXT(\"\");\n        if (!Socket)\n        {\n            return false;\n        }\n\n        UE_LOG(LogFMOD, Log, TEXT(\"Sent studio message: %s\"), Message);\n\n        FTCHARToUTF8 MessageChars(Message);\n        int32 BytesSent = 0;\n        if (!Socket->Send((const uint8 *)MessageChars.Get(), MessageChars.Length(), BytesSent))\n        {\n            return false;\n        }\n\n        while (1)\n        {\n            FString BackMessage;\n            if (!ReadMessage(BackMessage))\n            {\n                return false;\n            }\n            UE_LOG(LogFMOD, Log, TEXT(\"Received studio message: %s\"), *BackMessage);\n            if (BackMessage.StartsWith(TEXT(\"out(): \")))\n            {\n                OutMessage = BackMessage.Mid(7).TrimEnd();\n                break;\n            }\n            else\n            {\n                // Keep going\n            }\n        }\n        return true;\n    }\n\nprivate:\n    bool ReadMessage(FString &OutMessage)\n    {\n        while (1)\n        {\n            for (int32 i = 0; i < ReceivedMessage.Num(); ++i)\n            {\n                if (ReceivedMessage[i] == '\\0')\n                {\n                    OutMessage = FString(UTF8_TO_TCHAR(ReceivedMessage.GetData()));\n                    ReceivedMessage.RemoveAt(0, i + 1);\n                    return true;\n                }\n            }\n\n            int32 ExtraSpace = 64;\n            int32 CurrentSize = ReceivedMessage.Num();\n            ReceivedMessage.SetNum(CurrentSize + ExtraSpace);\n            int32 ActualRead = 0;\n            if (!Socket->Wait(ESocketWaitConditions::WaitForRead, FTimespan::FromSeconds(10)))\n            {\n                return false;\n            }\n            else if (!Socket->Recv((uint8 *)ReceivedMessage.GetData() + CurrentSize, ExtraSpace, ActualRead))\n            {\n                return false;\n            }\n            ReceivedMessage.SetNum(CurrentSize + ActualRead);\n        }\n    }\n\n    ISocketSubsystem *SocketSubsystem;\n    FSocket *Socket;\n    TArray<char> ReceivedMessage;\n};\n\nclass FFMODStudioEditorModule : public IFMODStudioEditorModule\n{\npublic:\n    /** IModuleInterface implementation */\n    FFMODStudioEditorModule()\n        : bSimulating(false)\n        , bIsInPIE(false)\n        , bRegisteredComponentVisualizers(false)\n        , bRunningTest(false)\n        , TestDelay(0.0f)\n        , TestStep(0)\n    {\n    }\n\n    virtual void StartupModule() override;\n    virtual void PostLoadCallback() override;\n    virtual void ShutdownModule() override;\n\n    bool HandleSettingsSaved();\n\n    /** Called after all banks were reloaded by the studio module */\n    void HandleBanksReloaded();\n\n    /** Show notification */\n    void ShowNotification(const FText &Text, SNotificationItem::ECompletionState State);\n\n    void BeginPIE(bool simulating);\n    void EndPIE(bool simulating);\n    void PausePIE(bool simulating);\n    void ResumePIE(bool simulating);\n\n    void ViewportDraw(UCanvas *Canvas, APlayerController *);\n\n    bool Tick(float DeltaTime);\n\n    /** Add extensions to menu */\n    void AddHelpMenuExtension(FMenuBuilder &MenuBuilder);\n    void AddFileMenuExtension(FMenuBuilder &MenuBuilder);\n\n    /** Show FMOD version */\n    void ShowVersion();\n    /** Open CHM */\n    void OpenCHM();\n    /** Open web page to online docs */\n    void OpenOnlineDocs();\n    /** Open Video tutorials page */\n    void OpenVideoTutorials();\n    /** Set Studio build path */\n    void ValidateFMOD();\n\n    /** Reload banks */\n    void ReloadBanks();\n\n    /** Callback for the main frame finishing load */\n    void OnMainFrameLoaded(TSharedPtr<SWindow> InRootWindow, bool bIsNewProjectWindow);\n\n    /** Callbacks for bad settings notification buttons */\n    void OnBadSettingsPopupSettingsClicked();\n    void OnBadSettingsPopupDismissClicked();\n\n    void TickTest(float DeltaTime);\n\n    TArray<FName> RegisteredComponentClassNames;\n    void RegisterComponentVisualizer(FName ComponentClassName, TSharedPtr<FComponentVisualizer> Visualizer);\n\n    /** The delegate to be invoked when this profiler manager ticks. */\n    FTickerDelegate OnTick;\n\n    /** Handle for registered delegates. */\n    FDelegateHandle TickDelegateHandle;\n    FDelegateHandle BeginPIEDelegateHandle;\n    FDelegateHandle EndPIEDelegateHandle;\n    FDelegateHandle PausePIEDelegateHandle;\n    FDelegateHandle ResumePIEDelegateHandle;\n    FDelegateHandle HandleBanksReloadedDelegateHandle;\n    FDelegateHandle FMODControlTrackEditorCreateTrackEditorHandle;\n    FDelegateHandle FMODParamTrackEditorCreateTrackEditorHandle;\n\n    /** Hook for drawing viewport */\n    FDebugDrawDelegate ViewportDrawingDelegate;\n    FDelegateHandle ViewportDrawingDelegateHandle;\n\n    TSharedPtr<IComponentAssetBroker> AssetBroker;\n\n    /** The extender to pass to the level editor to extend it's window menu */\n    TSharedPtr<FExtender> MainMenuExtender;\n\n    /** Asset type actions for events (edit, play, stop) */\n    TSharedPtr<FAssetTypeActions_FMODEvent> FMODEventAssetTypeActions;\n\n    ISettingsSectionPtr SettingsSection;\n\n    /** Notification popup that settings are bad */\n    TWeakPtr<SNotificationItem> BadSettingsNotification;\n\n    bool bSimulating;\n    bool bIsInPIE;\n    bool bRegisteredComponentVisualizers;\n    bool bRunningTest;\n    float TestDelay;\n    int TestStep;\n};\n\nIMPLEMENT_MODULE(FFMODStudioEditorModule, FMODStudioEditor)\n\nvoid FFMODStudioEditorModule::StartupModule()\n{\n    UE_LOG(LogFMOD, Log, TEXT(\"FFMODStudioEditorModule startup\"));\n\n    AssetBroker = MakeShareable(new FFMODAssetBroker);\n    FComponentAssetBrokerage::RegisterBroker(AssetBroker, UFMODAudioComponent::StaticClass(), true, true);\n\n    if (ISettingsModule *SettingsModule = FModuleManager::GetModulePtr<ISettingsModule>(\"Settings\"))\n    {\n        SettingsSection = SettingsModule->RegisterSettings(\"Project\", \"Plugins\", \"FMODStudio\", LOCTEXT(\"FMODStudioSettingsName\", \"FMOD Studio\"),\n            LOCTEXT(\"FMODStudioDescription\", \"Configure the FMOD Studio plugin\"), GetMutableDefault<UFMODSettings>());\n\n        if (SettingsSection.IsValid())\n        {\n            SettingsSection->OnModified().BindRaw(this, &FFMODStudioEditorModule::HandleSettingsSaved);\n        }\n    }\n\n    // Register with the sequencer module that we provide auto-key handlers.\n    ISequencerModule &SequencerModule = FModuleManager::Get().LoadModuleChecked<ISequencerModule>(\"Sequencer\");\n    FMODControlTrackEditorCreateTrackEditorHandle =\n        SequencerModule.RegisterTrackEditor(FOnCreateTrackEditor::CreateStatic(&FFMODEventControlTrackEditor::CreateTrackEditor));\n    FMODParamTrackEditorCreateTrackEditorHandle =\n        SequencerModule.RegisterTrackEditor(FOnCreateTrackEditor::CreateStatic(&FFMODEventParameterTrackEditor::CreateTrackEditor));\n    SequencerModule.RegisterChannelInterface<FFMODEventControlChannel>();\n\n    // Register the details customizations\n    {\n        FPropertyEditorModule &PropertyModule = FModuleManager::LoadModuleChecked<FPropertyEditorModule>(\"PropertyEditor\");\n\n        PropertyModule.RegisterCustomClassLayout(\n            UFMODSettings::StaticClass()->GetFName(),\n            FOnGetDetailCustomizationInstance::CreateStatic(&FFMODSettingsCustomization::MakeInstance)\n        );\n\n        PropertyModule.RegisterCustomClassLayout(\n            \"FMODAudioComponent\", FOnGetDetailCustomizationInstance::CreateStatic(&FFMODAudioComponentDetails::MakeInstance));\n        PropertyModule.NotifyCustomizationModuleChanged();\n    }\n\n    // Need to load the editor module since it gets created after us, and we can't re-order ourselves otherwise our asset registration stops working!\n    // It only works if we are running the editor, not a commandlet\n    if (!IsRunningCommandlet())\n    {\n        MainMenuExtender = MakeShareable(new FExtender);\n        MainMenuExtender->AddMenuExtension(\n            \"HelpBrowse\", EExtensionHook::After, NULL, FMenuExtensionDelegate::CreateRaw(this, &FFMODStudioEditorModule::AddHelpMenuExtension));\n        MainMenuExtender->AddMenuExtension(\n            \"FileLoadAndSave\", EExtensionHook::After, NULL, FMenuExtensionDelegate::CreateRaw(this, &FFMODStudioEditorModule::AddFileMenuExtension));\n\n        FLevelEditorModule *LevelEditor = FModuleManager::LoadModulePtr<FLevelEditorModule>(TEXT(\"LevelEditor\"));\n        if (LevelEditor)\n        {\n            LevelEditor->GetMenuExtensibilityManager()->AddExtender(MainMenuExtender);\n        }\n    }\n\n    // Register AssetTypeActions\n    IAssetTools &AssetTools = FModuleManager::GetModuleChecked<FAssetToolsModule>(\"AssetTools\").Get();\n\n    FMODEventAssetTypeActions = MakeShareable(new FAssetTypeActions_FMODEvent);\n    AssetTools.RegisterAssetTypeActions(FMODEventAssetTypeActions.ToSharedRef());\n\n    // Register slate style overrides\n    FFMODStudioStyle::Initialize();\n\n    BeginPIEDelegateHandle = FEditorDelegates::BeginPIE.AddRaw(this, &FFMODStudioEditorModule::BeginPIE);\n    EndPIEDelegateHandle = FEditorDelegates::EndPIE.AddRaw(this, &FFMODStudioEditorModule::EndPIE);\n    PausePIEDelegateHandle = FEditorDelegates::PausePIE.AddRaw(this, &FFMODStudioEditorModule::PausePIE);\n    ResumePIEDelegateHandle = FEditorDelegates::ResumePIE.AddRaw(this, &FFMODStudioEditorModule::ResumePIE);\n\n    ViewportDrawingDelegate = FDebugDrawDelegate::CreateRaw(this, &FFMODStudioEditorModule::ViewportDraw);\n    ViewportDrawingDelegateHandle = UDebugDrawService::Register(TEXT(\"Editor\"), ViewportDrawingDelegate);\n\n    OnTick = FTickerDelegate::CreateRaw(this, &FFMODStudioEditorModule::Tick);\n    TickDelegateHandle = FTicker::GetCoreTicker().AddTicker(OnTick);\n\n    // This module is loaded after FMODStudioModule\n    HandleBanksReloadedDelegateHandle = IFMODStudioModule::Get().BanksReloadedEvent().AddRaw(this, &FFMODStudioEditorModule::HandleBanksReloaded);\n\n    if (FParse::Param(FCommandLine::Get(), TEXT(\"fmodtest\")))\n    {\n        bRunningTest = true;\n    }\n\n    // Register a callback to validate settings on startup\n    IMainFrameModule& MainFrameModule = FModuleManager::LoadModuleChecked<IMainFrameModule>(TEXT(\"MainFrame\"));\n    MainFrameModule.OnMainFrameCreationFinished().AddRaw(this, &FFMODStudioEditorModule::OnMainFrameLoaded);\n}\n\nvoid FFMODStudioEditorModule::AddHelpMenuExtension(FMenuBuilder &MenuBuilder)\n{\n    MenuBuilder.BeginSection(\"FMODHelp\", LOCTEXT(\"FMODHelpLabel\", \"FMOD Help\"));\n    MenuBuilder.AddMenuEntry(LOCTEXT(\"FMODVersionMenuEntryTitle\", \"About FMOD Studio\"),\n        LOCTEXT(\"FMODVersionMenuEntryToolTip\", \"Shows the informationa about FMOD Studio.\"), FSlateIcon(),\n        FUIAction(FExecuteAction::CreateRaw(this, &FFMODStudioEditorModule::ShowVersion)));\n\n#if PLATFORM_WINDOWS\n    MenuBuilder.AddMenuEntry(LOCTEXT(\"FMODHelpCHMTitle\", \"FMOD Documentation...\"),\n        LOCTEXT(\"FMODHelpCHMToolTip\", \"Opens the local FMOD documentation.\"),\n        FSlateIcon(FEditorStyle::GetStyleSetName(), \"LevelEditor.BrowseAPIReference\"),\n        FUIAction(FExecuteAction::CreateRaw(this, &FFMODStudioEditorModule::OpenCHM)));\n#endif\n\n    MenuBuilder.AddMenuEntry(LOCTEXT(\"FMODHelpOnlineTitle\", \"FMOD Online Documentation...\"),\n        LOCTEXT(\"FMODHelpOnlineToolTip\", \"Go to the online FMOD documentation.\"),\n        FSlateIcon(FEditorStyle::GetStyleSetName(), \"LevelEditor.BrowseDocumentation\"),\n        FUIAction(FExecuteAction::CreateRaw(this, &FFMODStudioEditorModule::OpenOnlineDocs)));\n\n    MenuBuilder.AddMenuEntry(LOCTEXT(\"FMODHelpVideosTitle\", \"FMOD Tutorial Videos...\"),\n        LOCTEXT(\"FMODHelpVideosToolTip\", \"Go to the online FMOD tutorial videos.\"),\n        FSlateIcon(FEditorStyle::GetStyleSetName(), \"LevelEditor.Tutorials\"),\n        FUIAction(FExecuteAction::CreateRaw(this, &FFMODStudioEditorModule::OpenVideoTutorials)));\n\n    MenuBuilder.AddMenuEntry(LOCTEXT(\"FMODSetStudioBuildTitle\", \"Validate FMOD\"),\n        LOCTEXT(\"FMODSetStudioBuildToolTip\", \"Verifies that FMOD and FMOD Studio are working as expected.\"), FSlateIcon(),\n        FUIAction(FExecuteAction::CreateRaw(this, &FFMODStudioEditorModule::ValidateFMOD)));\n\n    MenuBuilder.EndSection();\n}\n\nvoid FFMODStudioEditorModule::AddFileMenuExtension(FMenuBuilder &MenuBuilder)\n{\n    MenuBuilder.BeginSection(\"FMODFile\", LOCTEXT(\"FMODFileLabel\", \"FMOD\"));\n    MenuBuilder.AddMenuEntry(LOCTEXT(\"FMODFileMenuEntryTitle\", \"Reload Banks\"),\n        LOCTEXT(\"FMODFileMenuEntryToolTip\", \"Force a manual reload of all FMOD Studio banks.\"), FSlateIcon(),\n        FUIAction(FExecuteAction::CreateRaw(this, &FFMODStudioEditorModule::ReloadBanks)));\n    MenuBuilder.EndSection();\n}\n\nint DLLVersionToInt(unsigned int FullVersion, unsigned int offset)\n{\n    return (((((FullVersion) >> ((offset) + 0)) & 0xF) * 1) + ((((FullVersion) >> ((offset) + 4)) & 0xF) * 10));\n}\nvoid VersionToArray(unsigned int FullVersion, unsigned int *outVersion)\n{\n    outVersion[0] = DLLVersionToInt(FullVersion, 16);\n    outVersion[1] = DLLVersionToInt(FullVersion, 8);\n    outVersion[2] = DLLVersionToInt(FullVersion, 0);\n}\nvoid GetDLLVersion(unsigned int *outVersion)\n{\n    // Just grab it from the audition context which is always valid\n    unsigned int DLLVersion = 0;\n    FMOD::Studio::System *StudioSystem = IFMODStudioModule::Get().GetStudioSystem(EFMODSystemContext::Auditioning);\n    if (StudioSystem)\n    {\n        FMOD::System *LowLevelSystem = nullptr;\n        if (StudioSystem->getLowLevelSystem(&LowLevelSystem) == FMOD_OK)\n        {\n            LowLevelSystem->getVersion(&DLLVersion);\n        }\n    }\n    return VersionToArray(DLLVersion, outVersion);\n}\nFString VersionToString(unsigned int *FullVersion)\n{\n    return FString::Printf(TEXT(\"%d.%02d.%02d\"), FullVersion[0], FullVersion[1], FullVersion[2]);\n}\n\nvoid FFMODStudioEditorModule::ShowVersion()\n{\n    unsigned int HeaderVersion[3];\n    unsigned int DLLVersion[3];\n    VersionToArray(FMOD_VERSION, HeaderVersion);\n    GetDLLVersion(DLLVersion);\n\n    FText VersionMessage = FText::Format(LOCTEXT(\"FMODStudio_About\",\n                                             \"FMOD Studio\\n\\nBuilt Version: {0}\\nDLL Version: {1}\\n\\nCopyright \\u00A9 Firelight Technologies Pty \"\n                                             \"Ltd.\\n\\nSee LICENSE.TXT for additional license information.\"),\n        FText::FromString(VersionToString(HeaderVersion)), FText::FromString(VersionToString(DLLVersion)));\n    FMessageDialog::Open(EAppMsgType::Ok, VersionMessage);\n}\n\nvoid FFMODStudioEditorModule::OpenCHM()\n{\n    FString APIPath = FPaths::Combine(*FPaths::EngineDir(), TEXT(\"Plugins/FMODStudio/Docs/FMOD UE4 Integration.chm\"));\n    if (IFileManager::Get().FileSize(*APIPath) != INDEX_NONE)\n    {\n        FString AbsoluteAPIPath = IFileManager::Get().ConvertToAbsolutePathForExternalAppForRead(*APIPath);\n        FPlatformProcess::LaunchFileInDefaultExternalApplication(*AbsoluteAPIPath);\n    }\n    else\n    {\n        FMessageDialog::Open(EAppMsgType::Ok,\n            NSLOCTEXT(\"Documentation\", \"CannotFindFMODIntegration\", \"Cannot open FMOD Studio Integration CHM reference; help file not found.\"));\n    }\n}\n\nvoid FFMODStudioEditorModule::OpenOnlineDocs()\n{\n    FPlatformProcess::LaunchFileInDefaultExternalApplication(\n        TEXT(\"https://www.fmod.com/resources/documentation-api?version=1.10&page=content/generated/engine_ue4/overview.html\"));\n}\n\nvoid FFMODStudioEditorModule::OpenVideoTutorials()\n{\n    FPlatformProcess::LaunchFileInDefaultExternalApplication(TEXT(\"http://www.youtube.com/user/FMODTV\"));\n}\n\nvoid FFMODStudioEditorModule::ValidateFMOD()\n{\n    int ProblemsFound = 0;\n\n    FFMODStudioLink StudioLink;\n    bool Connected = StudioLink.Connect();\n    if (!Connected)\n    {\n        if (EAppReturnType::No ==\n            FMessageDialog::Open(EAppMsgType::YesNo,\n                LOCTEXT(\"SetStudioBuildStudioNotRunning\",\n                    \"FMODStudio does not appear to be running.  Only some validation will occur.  Do you want to continue anyway?\")))\n        {\n            return;\n        }\n    }\n    unsigned int HeaderVersion[3];\n    unsigned int DLLVersion[3];\n    VersionToArray(FMOD_VERSION, HeaderVersion);\n    GetDLLVersion(DLLVersion);\n    unsigned int StudioVersion[3];\n    if (Connected)\n    {\n        FString StudioVersionString;\n        if (StudioLink.Execute(TEXT(\"studio.version\"), StudioVersionString))\n        {\n            // We expect something like \"Version xx.yy.zz, 32/64, Some build number\"\n            UE_LOG(LogFMOD, Log, TEXT(\"Received studio version: %s\"), *StudioVersionString);\n            TArray<FString> VersionParts;\n            if (StudioVersionString.StartsWith(TEXT(\"Version \")) && StudioVersionString.ParseIntoArray(VersionParts, TEXT(\",\")) >= 1)\n            {\n                TArray<FString> VersionFields;\n                VersionParts[0].RightChop(8).ParseIntoArray(VersionFields, TEXT(\".\"));\n                if (VersionFields.Num() == 3)\n                {\n                    StudioVersion[0] = FCString::Atoi(*VersionFields[0]);\n                    StudioVersion[1] = FCString::Atoi(*VersionFields[1]);\n                    StudioVersion[2] = FCString::Atoi(*VersionFields[2]);\n                }\n            }\n        }\n    }\n    if (HeaderVersion[0] != DLLVersion[0] || HeaderVersion[1] != DLLVersion[1])\n    {\n        FText VersionMessage = FText::Format(LOCTEXT(\"SetStudioBuildStudio_Status\",\n                                                 \"The FMOD DLL version is different to the version the integration was built against.  This may \"\n                                                 \"cause problems running the game.\\nBuilt Version: {0}\\nDLL Version: {1}\\n\"),\n            FText::FromString(VersionToString(HeaderVersion)), FText::FromString(VersionToString(DLLVersion)));\n        FMessageDialog::Open(EAppMsgType::Ok, VersionMessage);\n        ProblemsFound++;\n    }\n    if (StudioVersion[0] != DLLVersion[0] || StudioVersion[1] != DLLVersion[1])\n    {\n        FText VersionMessage =\n            FText::Format(LOCTEXT(\"SetStudioBuildStudio_Version\",\n                              \"The Studio tool is different to the version the integration was built against.  The integration may not be able to \"\n                              \"load the banks that the tool builds.\\n\\nBuilt Version: {0}\\nDLL Version: {1}\\nStudio Version: {2}\\n\\nWe recommend \"\n                              \"using the Studio tool that matches the integration.\\n\\nDo you want to continue with the validation?\"),\n                FText::FromString(VersionToString(HeaderVersion)), FText::FromString(VersionToString(DLLVersion)),\n                FText::FromString(VersionToString(StudioVersion)));\n        if (EAppReturnType::No == FMessageDialog::Open(EAppMsgType::YesNo, VersionMessage))\n        {\n            return;\n        }\n        ProblemsFound++;\n    }\n\n    const UFMODSettings &Settings = *GetDefault<UFMODSettings>();\n    FString FullBankPath = Settings.BankOutputDirectory.Path;\n    if (FPaths::IsRelative(FullBankPath))\n    {\n        FullBankPath = FPaths::ProjectContentDir() / FullBankPath;\n    }\n    FString PlatformBankPath = Settings.GetFullBankPath();\n    FullBankPath = FPaths::ConvertRelativePathToFull(FullBankPath);\n    PlatformBankPath = FPaths::ConvertRelativePathToFull(PlatformBankPath);\n\n    if (Connected)\n    {\n        // File path was added in FMOD Studio 1.07.00\n        FString StudioProjectPath;\n        FString StudioProjectDir;\n        if (StudioVersion[0] >= 1 && StudioVersion[1] >= 7)\n        {\n            StudioLink.Execute(TEXT(\"studio.project.filePath\"), StudioProjectPath);\n            if (StudioProjectPath.IsEmpty() || StudioProjectPath == TEXT(\"undefined\"))\n            {\n                FMessageDialog::Open(EAppMsgType::Ok,\n                    LOCTEXT(\"SetStudioBuildStudio_NewProject\",\n                        \"FMOD Studio has an empty project.  Please go to FMOD Studio, and press Save to create your new project.\"));\n                // Just try to save anyway\n                FString Result;\n                StudioLink.Execute(TEXT(\"studio.project.save()\"), Result);\n            }\n            StudioLink.Execute(TEXT(\"studio.project.filePath\"), StudioProjectPath);\n            if (StudioProjectPath != TEXT(\"undefined\"))\n            {\n                StudioProjectDir = FPaths::GetPath(StudioProjectPath);\n            }\n        }\n\n        FString StudioPathString;\n        StudioLink.Execute(TEXT(\"studio.project.workspace.builtBanksOutputDirectory\"), StudioPathString);\n        if (StudioPathString == TEXT(\"undefined\"))\n        {\n            StudioPathString = TEXT(\"\");\n        }\n\n        FString CanonicalBankPath = FullBankPath;\n        FPaths::CollapseRelativeDirectories(CanonicalBankPath);\n        FPaths::NormalizeDirectoryName(CanonicalBankPath);\n        FPaths::RemoveDuplicateSlashes(CanonicalBankPath);\n        FPaths::NormalizeDirectoryName(CanonicalBankPath);\n\n        FString CanonicalStudioPath = StudioPathString;\n        if (FPaths::IsRelative(CanonicalStudioPath) && !StudioProjectDir.IsEmpty() && !StudioPathString.IsEmpty())\n        {\n            CanonicalStudioPath = FPaths::Combine(*StudioProjectDir, *CanonicalStudioPath);\n        }\n        FPaths::CollapseRelativeDirectories(CanonicalStudioPath);\n        FPaths::NormalizeDirectoryName(CanonicalStudioPath);\n        FPaths::RemoveDuplicateSlashes(CanonicalStudioPath);\n        FPaths::NormalizeDirectoryName(CanonicalStudioPath);\n        if (!FPaths::IsSamePath(CanonicalBankPath, CanonicalStudioPath))\n        {\n            FString BankPathToSet = FullBankPath;\n            // Extra logic - if we have put the studio project inside the game project, then make it relative\n            if (!StudioProjectDir.IsEmpty())\n            {\n                FString GameBaseDir = FPaths::ConvertRelativePathToFull(FPaths::ProjectDir());\n                FString BankPathFromGameProject = FullBankPath;\n                FString StudioProjectFromGameProject = StudioProjectDir;\n                if (FPaths::MakePathRelativeTo(BankPathFromGameProject, *GameBaseDir) && !BankPathFromGameProject.Contains(TEXT(\"..\")) &&\n                    FPaths::MakePathRelativeTo(StudioProjectFromGameProject, *GameBaseDir) && !StudioProjectFromGameProject.Contains(TEXT(\"..\")))\n                {\n                    FPaths::MakePathRelativeTo(BankPathToSet, *(StudioProjectDir + TEXT(\"/\")));\n                }\n            }\n            ProblemsFound++;\n\n            FText AskMessage = FText::Format(LOCTEXT(\"SetStudioBuildStudio_Ask\",\n                                                 \"FMOD Studio build path should be set up.\\n\\nCurrent Studio build path: {0}\\nNew build path: \"\n                                                 \"{1}\\n\\nDo you want to fix up the project now?\"),\n                FText::FromString(StudioPathString), FText::FromString(BankPathToSet));\n            if (EAppReturnType::Yes == FMessageDialog::Open(EAppMsgType::YesNo, AskMessage))\n            {\n                FString Result;\n                StudioLink.Execute(*FString::Printf(TEXT(\"studio.project.workspace.builtBanksOutputDirectory = \\\"%s\\\";\"), *BankPathToSet), Result);\n                StudioLink.Execute(TEXT(\"studio.project.workspace.builtBanksOutputDirectory\"), Result);\n                if (Result != BankPathToSet)\n                {\n                    FMessageDialog::Open(EAppMsgType::Ok,\n                        LOCTEXT(\"SetStudioBuildStudio_Save\",\n                            \"Failed to set bank directory.  Please go to FMOD Studio, and set the bank path in FMOD Studio project settings.\"));\n                }\n                FMessageDialog::Open(\n                    EAppMsgType::Ok, LOCTEXT(\"SetStudioBuildStudio_Save\", \"Please go to FMOD Studio, save your project and build banks.\"));\n                // Just try to do it again anyway\n                StudioLink.Execute(TEXT(\"studio.project.save()\"), Result);\n                StudioLink.Execute(TEXT(\"studio.project.build()\"), Result);\n                // Pretend settings have changed which will force a reload\n                IFMODStudioModule::Get().RefreshSettings();\n            }\n        }\n    }\n    bool bAnyBankFiles = false;\n    // Check bank path\n    if (!FPaths::DirectoryExists(FullBankPath) || !FPaths::DirectoryExists(PlatformBankPath))\n    {\n        FText DirMessage = FText::Format(LOCTEXT(\"SetStudioBuildStudio_Dir\",\n                                             \"The FMOD Content directory does not exist.  Please make sure FMOD Studio is exporting banks into the \"\n                                             \"correct location.\\n\\nBanks should be exported to: {0}\\nBanks files should exist in: {1}\\n\"),\n            FText::FromString(FullBankPath), FText::FromString(PlatformBankPath));\n        FMessageDialog::Open(EAppMsgType::Ok, DirMessage);\n        ProblemsFound++;\n    }\n    else\n    {\n        TArray<FString> BankFiles;\n        Settings.GetAllBankPaths(BankFiles, true);\n        if (BankFiles.Num() != 0)\n        {\n            bAnyBankFiles = true;\n        }\n        else\n        {\n            FText EmptyBankDirMessage =\n                FText::Format(LOCTEXT(\"SetStudioBuildStudio_EmptyBankDir\",\n                                  \"The FMOD Content directory does not have any bank files in them.  Please make sure FMOD Studio is exporting banks \"\n                                  \"into the correct location.\\n\\nBanks should be exported to: {0}\\nBanks files should exist in: {1}\\n\"),\n                    FText::FromString(FullBankPath), FText::FromString(PlatformBankPath));\n            FMessageDialog::Open(EAppMsgType::Ok, EmptyBankDirMessage);\n            ProblemsFound++;\n        }\n    }\n    // Look for banks that may have failed to load\n    if (bAnyBankFiles)\n    {\n        FMOD::Studio::System *StudioSystem = IFMODStudioModule::Get().GetStudioSystem(EFMODSystemContext::Auditioning);\n        int BankCount = 0;\n        StudioSystem->getBankCount(&BankCount);\n        TArray<FString> FailedBanks = IFMODStudioModule::Get().GetFailedBankLoads(EFMODSystemContext::Auditioning);\n        if (BankCount == 0 || FailedBanks.Num() != 0)\n        {\n            FString CombinedBanks;\n            for (auto Bank : FailedBanks)\n            {\n                CombinedBanks += Bank;\n                CombinedBanks += TEXT(\"\\n\");\n            }\n            FText BankLoadMessage;\n            if (BankCount == 0 && FailedBanks.Num() == 0)\n            {\n                BankLoadMessage = LOCTEXT(\"SetStudioBuildStudio_BankLoad\", \"Failed to load banks\\n\");\n            }\n            else if (BankCount == 0)\n            {\n                BankLoadMessage =\n                    FText::Format(LOCTEXT(\"SetStudioBuildStudio_BankLoad\", \"Failed to load banks:\\n{0}\\n\"), FText::FromString(CombinedBanks));\n            }\n            else\n            {\n                BankLoadMessage =\n                    FText::Format(LOCTEXT(\"SetStudioBuildStudio_BankLoad\", \"Some banks failed to load:\\n{0}\\n\"), FText::FromString(CombinedBanks));\n            }\n            FMessageDialog::Open(EAppMsgType::Ok, BankLoadMessage);\n            ProblemsFound++;\n        }\n        else\n        {\n            int TotalEventCount = 0;\n            TArray<FMOD::Studio::Bank *> Banks;\n            Banks.SetNum(BankCount);\n            StudioSystem->getBankList(Banks.GetData(), BankCount, &BankCount);\n            for (FMOD::Studio::Bank *Bank : Banks)\n            {\n                int EventCount = 0;\n                Bank->getEventCount(&EventCount);\n                TotalEventCount += EventCount;\n            }\n            if (TotalEventCount == 0)\n            {\n                FMessageDialog::Open(EAppMsgType::Ok,\n                    LOCTEXT(\"SetStudioBuildStudio_NoEvents\",\n                        \"Banks have been loaded but they didn't have any events in them.  Please make sure you have added some events to banks.\"));\n                ProblemsFound++;\n            }\n        }\n    }\n\n    // Look for required plugins that have not been registered\n    TArray<FString> RequiredPlugins = IFMODStudioModule::Get().GetRequiredPlugins();\n    if (RequiredPlugins.Num() != 0 && Settings.PluginFiles.Num() == 0)\n    {\n        FString CombinedPlugins;\n        for (auto Name : RequiredPlugins)\n        {\n            CombinedPlugins += Name;\n            CombinedPlugins += TEXT(\"\\n\");\n        }\n        FText PluginMessage =\n            FText::Format(LOCTEXT(\"SetStudioBuildStudio_Plugins\",\n                              \"The banks require the following plugins, but no plugin filenames are listed in the settings:\\n{0}\\n\"),\n                FText::FromString(CombinedPlugins));\n        FMessageDialog::Open(EAppMsgType::Ok, PluginMessage);\n        ProblemsFound++;\n    }\n\n    // Look for FMOD in packaging settings\n    UProjectPackagingSettings *PackagingSettings = Cast<UProjectPackagingSettings>(UProjectPackagingSettings::StaticClass()->GetDefaultObject());\n    bool bPackagingFound = false;\n\n    for (int i = 0; i < PackagingSettings->DirectoriesToAlwaysStageAsNonUFS.Num(); ++i)\n    {\n        // We allow subdirectory references, such as \"FMOD/Mobile\"\n        if (PackagingSettings->DirectoriesToAlwaysStageAsNonUFS[i].Path.StartsWith(Settings.BankOutputDirectory.Path))\n        {\n            bPackagingFound = true;\n            break;\n        }\n    }\n\n    int OldPackagingIndex = -1;\n\n    for (int i = 0; i < PackagingSettings->DirectoriesToAlwaysStageAsUFS.Num(); ++i)\n    {\n        if (PackagingSettings->DirectoriesToAlwaysStageAsUFS[i].Path.StartsWith(Settings.BankOutputDirectory.Path))\n        {\n            OldPackagingIndex = i;\n            break;\n        }\n    }\n\n    if (OldPackagingIndex >= 0)\n    {\n        ProblemsFound++;\n\n        FText message = bPackagingFound ?\n            LOCTEXT(\"PackagingFMOD_Both\",\n                \"FMOD has been added to both the \\\"Additional Non-Asset Directories to Copy\\\" and the \\\"Additional Non-Asset Directories to Package\\\" \"\n                \"lists. It is recommended to remove FMOD from the \\\"Additional Non-Asset Directories to Package\\\" list.\\n\\n\"\n                \"Do you want to remove it now?\") :\n            LOCTEXT(\"PackagingFMOD_AskMove\",\n                \"FMOD has been added to the \\\"Additional Non-Asset Directories to Package\\\" list. \"\n                \"Packaging FMOD content may lead to deadlocks at runtime. \"\n                \"It is recommended to move FMOD to the \\\"Additional Non-Asset Directories to Copy\\\" list.\\n\\n\"\n                \"Do you want to move it now?\");\n\n        if (EAppReturnType::Yes == FMessageDialog::Open(EAppMsgType::YesNo, message))\n        {\n            PackagingSettings->DirectoriesToAlwaysStageAsUFS.RemoveAt(OldPackagingIndex);\n\n            if (!bPackagingFound)\n            {\n                PackagingSettings->DirectoriesToAlwaysStageAsNonUFS.Add(Settings.BankOutputDirectory);\n            }\n\n            PackagingSettings->UpdateDefaultConfigFile();\n        }\n    }\n    else if (!bPackagingFound)\n    {\n        ProblemsFound++;\n\n        FText message = LOCTEXT(\"PackagingFMOD_Ask\",\n            \"FMOD has not been added to the \\\"Additional Non-Asset Directories to Copy\\\" list.\\n\\nDo you want add it now?\");\n\n        if (EAppReturnType::Yes == FMessageDialog::Open(EAppMsgType::YesNo, message))\n        {\n            PackagingSettings->DirectoriesToAlwaysStageAsNonUFS.Add(Settings.BankOutputDirectory);\n            PackagingSettings->UpdateDefaultConfigFile();\n        }\n    }\n\n    // Summary\n    if (ProblemsFound)\n    {\n        FMessageDialog::Open(EAppMsgType::Ok, LOCTEXT(\"SetStudioBuildStudio_FinishedBad\", \"Finished validation.\\n\"));\n    }\n    else\n    {\n        FMessageDialog::Open(EAppMsgType::Ok, LOCTEXT(\"SetStudioBuildStudio_FinishedGood\", \"Finished validation.  No problems detected.\\n\"));\n    }\n}\n\nvoid FFMODStudioEditorModule::ReloadBanks()\n{\n    // Pretend settings have changed which will force a reload\n    IFMODStudioModule::Get().RefreshSettings();\n}\n\nvoid FFMODStudioEditorModule::OnMainFrameLoaded(TSharedPtr<SWindow> InRootWindow, bool bIsNewProjectWindow)\n{\n    // Show a popup notification that allows the user to fix bad settings\n    const UFMODSettings& Settings = *GetDefault<UFMODSettings>();\n\n    if (Settings.Check() != UFMODSettings::Okay)\n    {\n        FNotificationInfo Info(LOCTEXT(\"BadSettingsPopupTitle\", \"FMOD Settings Problem Detected\"));\n        Info.bFireAndForget = false;\n        Info.bUseLargeFont = true;\n        Info.bUseThrobber = false;\n        Info.FadeOutDuration = 0.5f;\n        Info.ButtonDetails.Add(FNotificationButtonInfo(LOCTEXT(\"BadSettingsPopupSettings\", \"Settings...\"),\n            LOCTEXT(\"BadSettingsPopupSettingsTT\", \"Open the settings editor\"),\n            FSimpleDelegate::CreateRaw(this, &FFMODStudioEditorModule::OnBadSettingsPopupSettingsClicked)));\n        Info.ButtonDetails.Add(FNotificationButtonInfo(LOCTEXT(\"BadSettingsPopupDismiss\", \"Dismiss\"),\n            LOCTEXT(\"BadSettingsPopupDismissTT\", \"Dismiss this notification\"),\n            FSimpleDelegate::CreateRaw(this, &FFMODStudioEditorModule::OnBadSettingsPopupDismissClicked)));\n\n        BadSettingsNotification = FSlateNotificationManager::Get().AddNotification(Info);\n        BadSettingsNotification.Pin()->SetCompletionState(SNotificationItem::CS_Pending);\n    }\n}\n\nvoid FFMODStudioEditorModule::OnBadSettingsPopupSettingsClicked()\n{\n    if (ISettingsModule* SettingsModule = FModuleManager::GetModulePtr<ISettingsModule>(\"Settings\"))\n    {\n        SettingsModule->ShowViewer(\"Project\", \"Plugins\", \"FMODStudio\");\n    }\n\n    BadSettingsNotification.Pin()->ExpireAndFadeout();\n}\n\nvoid FFMODStudioEditorModule::OnBadSettingsPopupDismissClicked()\n{\n    BadSettingsNotification.Pin()->ExpireAndFadeout();\n}\n\nbool FFMODStudioEditorModule::Tick(float DeltaTime)\n{\n    if (!bRegisteredComponentVisualizers && GUnrealEd != nullptr)\n    {\n        // Register component visualizers (GUnrealED is required for this, but not initialized before this module loads, so we have to wait until GUnrealEd is available)\n        RegisterComponentVisualizer(UFMODAudioComponent::StaticClass()->GetFName(), MakeShareable(new FFMODAudioComponentVisualizer));\n\n        bRegisteredComponentVisualizers = true;\n    }\n\n    if (bRunningTest)\n    {\n        TickTest(DeltaTime);\n    }\n\n    // Update listener position for Editor sound system\n    FMOD::Studio::System *StudioSystem = IFMODStudioModule::Get().GetStudioSystem(EFMODSystemContext::Editor);\n    if (StudioSystem)\n    {\n        if (GCurrentLevelEditingViewportClient)\n        {\n            const FVector &ViewLocation = GCurrentLevelEditingViewportClient->GetViewLocation();\n            FMatrix CameraToWorld = FRotationMatrix::Make(GCurrentLevelEditingViewportClient->GetViewRotation());\n            FVector Up = CameraToWorld.GetUnitAxis(EAxis::Z);\n            FVector Forward = CameraToWorld.GetUnitAxis(EAxis::X);\n\n            FMOD_3D_ATTRIBUTES Attributes = { { 0 } };\n            Attributes.position = FMODUtils::ConvertWorldVector(ViewLocation);\n            Attributes.forward = FMODUtils::ConvertUnitVector(Forward);\n            Attributes.up = FMODUtils::ConvertUnitVector(Up);\n\n            verifyfmod(StudioSystem->setListenerAttributes(0, &Attributes));\n        }\n    }\n\n    return true;\n}\n\nvoid FFMODStudioEditorModule::TickTest(float DeltaTime)\n{\n    TestDelay -= DeltaTime;\n    if (TestDelay > 0.0f)\n    {\n        return; // Still waiting\n    }\n\n    // Default time to next step\n    TestDelay = 1.0f;\n    TestStep++;\n\n    UE_LOG(LogFMOD, Log, TEXT(\"Test step %d\"), TestStep);\n\n    switch (TestStep)\n    {\n        case 1:\n        {\n            // Spawn event in level\n            FString EventPath;\n            if (FParse::Value(FCommandLine::Get(), TEXT(\"spawnevent=\"), EventPath))\n            {\n                UFMODEvent *FoundEvent = IFMODStudioModule::Get().FindEventByName(EventPath);\n                if (FoundEvent)\n                {\n                    UActorFactory *ActorFactory = FActorFactoryAssetProxy::GetFactoryForAssetObject(FoundEvent);\n                    if (ActorFactory)\n                    {\n                        AActor *NewActor = ActorFactory->CreateActor(FoundEvent, GWorld->GetCurrentLevel(), FTransform());\n                        UE_LOG(LogFMOD, Log, TEXT(\"Placing '%s' in world: New actor %p\"), *EventPath, NewActor);\n                    }\n                    else\n                    {\n                        UE_LOG(LogFMOD, Error, TEXT(\"Failed to find factory for event: '%s'\"), *EventPath);\n                    }\n                }\n                else\n                {\n                    UE_LOG(LogFMOD, Error, TEXT(\"Failed to find event: '%s'\"), *EventPath);\n                }\n            }\n            break;\n        }\n        case 2:\n        {\n            // Save FMOD directory to package\n            UProjectPackagingSettings *PackagingSettings =\n                Cast<UProjectPackagingSettings>(UProjectPackagingSettings::StaticClass()->GetDefaultObject());\n            const UFMODSettings &Settings = *GetDefault<UFMODSettings>();\n            PackagingSettings->DirectoriesToAlwaysStageAsNonUFS.Add(Settings.BankOutputDirectory);\n            PackagingSettings->UpdateDefaultConfigFile();\n            break;\n        }\n        case 3:\n        {\n            // Save map\n            FEditorFileUtils::SaveDirtyPackages(false, true, false, true, false, false);\n            break;\n        }\n        case 4:\n        {\n            // Begin PIE\n            UWorld *EditorWorld = GEditor->GetEditorWorldContext().World();\n            GEditor->PlayInEditor(EditorWorld, false);\n            break;\n        }\n        case 5:\n        {\n            // Extra delay\n            TestDelay = 10.0f;\n            break;\n        }\n        case 6:\n        {\n            // Finish test\n            GIsRequestingExit = true;\n            break;\n        }\n    }\n}\n\nvoid FFMODStudioEditorModule::BeginPIE(bool simulating)\n{\n    UE_LOG(LogFMOD, Verbose, TEXT(\"FFMODStudioEditorModule BeginPIE: %d\"), simulating);\n    bSimulating = simulating;\n    bIsInPIE = true;\n    IFMODStudioModule::Get().SetInPIE(true, simulating);\n}\n\nvoid FFMODStudioEditorModule::EndPIE(bool simulating)\n{\n    UE_LOG(LogFMOD, Verbose, TEXT(\"FFMODStudioEditorModule EndPIE: %d\"), simulating);\n    bSimulating = false;\n    bIsInPIE = false;\n    IFMODStudioModule::Get().SetInPIE(false, simulating);\n}\n\nvoid FFMODStudioEditorModule::PausePIE(bool simulating)\n{\n    UE_LOG(LogFMOD, Verbose, TEXT(\"FFMODStudioEditorModule PausePIE%d\"));\n    IFMODStudioModule::Get().SetSystemPaused(true);\n}\n\nvoid FFMODStudioEditorModule::ResumePIE(bool simulating)\n{\n    UE_LOG(LogFMOD, Verbose, TEXT(\"FFMODStudioEditorModule ResumePIE\"));\n    IFMODStudioModule::Get().SetSystemPaused(false);\n}\n\nvoid FFMODStudioEditorModule::PostLoadCallback()\n{\n    UE_LOG(LogFMOD, Verbose, TEXT(\"FFMODStudioEditorModule PostLoadCallback\"));\n}\n\nvoid FFMODStudioEditorModule::ViewportDraw(UCanvas *Canvas, APlayerController *)\n{\n    // Only want to update based on viewport in simulate mode.\n    // In PIE/game, we update from the player controller instead.\n    if (!bSimulating)\n    {\n        return;\n    }\n\n    const FSceneView *View = Canvas->SceneView;\n\n    if (View->Drawer == GCurrentLevelEditingViewportClient)\n    {\n        UWorld *World = GCurrentLevelEditingViewportClient->GetWorld();\n        const FVector &ViewLocation = GCurrentLevelEditingViewportClient->GetViewLocation();\n\n        FMatrix CameraToWorld = View->ViewMatrices.GetViewMatrix().InverseFast();\n        FVector ProjUp = CameraToWorld.TransformVector(FVector(0, 1000, 0));\n        FVector ProjRight = CameraToWorld.TransformVector(FVector(1000, 0, 0));\n\n        FTransform ListenerTransform(FRotationMatrix::MakeFromZY(ProjUp, ProjRight));\n        ListenerTransform.SetTranslation(ViewLocation);\n        ListenerTransform.NormalizeRotation();\n\n        IFMODStudioModule::Get().SetListenerPosition(0, World, ListenerTransform, 0.0f);\n        IFMODStudioModule::Get().FinishSetListenerPosition(1, 0.0f);\n    }\n}\n\nvoid FFMODStudioEditorModule::ShutdownModule()\n{\n    UE_LOG(LogFMOD, Verbose, TEXT(\"FFMODStudioEditorModule shutdown\"));\n\n    if (UObjectInitialized())\n    {\n        // Unregister tick function.\n        FTicker::GetCoreTicker().RemoveTicker(TickDelegateHandle);\n\n        FEditorDelegates::BeginPIE.Remove(BeginPIEDelegateHandle);\n        FEditorDelegates::EndPIE.Remove(EndPIEDelegateHandle);\n        FEditorDelegates::PausePIE.Remove(PausePIEDelegateHandle);\n        FEditorDelegates::ResumePIE.Remove(ResumePIEDelegateHandle);\n\n        if (ViewportDrawingDelegate.IsBound())\n        {\n            UDebugDrawService::Unregister(ViewportDrawingDelegateHandle);\n        }\n\n        FComponentAssetBrokerage::UnregisterBroker(AssetBroker);\n\n        if (MainMenuExtender.IsValid())\n        {\n            FLevelEditorModule *LevelEditorModule = FModuleManager::GetModulePtr<FLevelEditorModule>(\"LevelEditor\");\n            if (LevelEditorModule)\n            {\n                LevelEditorModule->GetMenuExtensibilityManager()->RemoveExtender(MainMenuExtender);\n            }\n        }\n    }\n\n    if (ISettingsModule *SettingsModule = FModuleManager::GetModulePtr<ISettingsModule>(\"Settings\"))\n    {\n        SettingsModule->UnregisterSettings(\"Project\", \"Plugins\", \"FMODStudio\");\n    }\n\n    // Unregister AssetTypeActions\n    if (FModuleManager::Get().IsModuleLoaded(\"AssetTools\"))\n    {\n        IAssetTools &AssetTools = FModuleManager::GetModuleChecked<FAssetToolsModule>(\"AssetTools\").Get();\n\n        AssetTools.UnregisterAssetTypeActions(FMODEventAssetTypeActions.ToSharedRef());\n    }\n\n    // Unregister component visualizers\n    if (GUnrealEd != nullptr)\n    {\n        // Iterate over all class names we registered for\n        for (FName ClassName : RegisteredComponentClassNames)\n        {\n            GUnrealEd->UnregisterComponentVisualizer(ClassName);\n        }\n    }\n\n    // Unregister sequencer track creation delegates\n    ISequencerModule *SequencerModule = FModuleManager::GetModulePtr<ISequencerModule>(\"Sequencer\");\n    if (SequencerModule != nullptr)\n    {\n        SequencerModule->UnRegisterTrackEditor(FMODControlTrackEditorCreateTrackEditorHandle);\n        SequencerModule->UnRegisterTrackEditor(FMODParamTrackEditorCreateTrackEditorHandle);\n    }\n    IFMODStudioModule::Get().BanksReloadedEvent().Remove(HandleBanksReloadedDelegateHandle);\n}\n\nbool FFMODStudioEditorModule::HandleSettingsSaved()\n{\n    IFMODStudioModule::Get().RefreshSettings();\n\n    return true;\n}\n\nvoid FFMODStudioEditorModule::HandleBanksReloaded()\n{\n    // Show a reload notification\n    TArray<FString> FailedBanks = IFMODStudioModule::Get().GetFailedBankLoads(EFMODSystemContext::Auditioning);\n    FText Message;\n    SNotificationItem::ECompletionState State;\n    if (FailedBanks.Num() == 0)\n    {\n        Message = LOCTEXT(\"FMODBanksReloaded\", \"Reloaded FMOD Banks\\n\");\n        State = SNotificationItem::CS_Success;\n    }\n    else\n    {\n        FString CombinedMessage = \"Problem loading FMOD Banks:\";\n        for (auto Entry : FailedBanks)\n        {\n            CombinedMessage += TEXT(\"\\n\");\n            CombinedMessage += Entry;\n\n            UE_LOG(LogFMOD, Warning, TEXT(\"Problem loading FMOD Bank: %s\"), *Entry);\n        }\n\n        Message = FText::Format(LOCTEXT(\"FMODBanksReloaded\", \"{0}\"), FText::FromString(CombinedMessage));\n        State = SNotificationItem::CS_Fail;\n    }\n    ShowNotification(Message, State);\n}\n\nvoid FFMODStudioEditorModule::ShowNotification(const FText &Text, SNotificationItem::ECompletionState State)\n{\n    FNotificationInfo Info(Text);\n    Info.Image = FEditorStyle::GetBrush(TEXT(\"NoBrush\"));\n    Info.FadeInDuration = 0.1f;\n    Info.FadeOutDuration = 0.5f;\n    Info.ExpireDuration = State == SNotificationItem::CS_Fail ? 6.0f : 1.5f;\n    Info.bUseThrobber = false;\n    Info.bUseSuccessFailIcons = true;\n    Info.bUseLargeFont = true;\n    Info.bFireAndForget = false;\n    Info.bAllowThrottleWhenFrameRateIsLow = false;\n    auto NotificationItem = FSlateNotificationManager::Get().AddNotification(Info);\n    NotificationItem->SetCompletionState(State);\n    NotificationItem->ExpireAndFadeout();\n\n    if (GCurrentLevelEditingViewportClient)\n    {\n        // Refresh any 3d event visualization\n        GCurrentLevelEditingViewportClient->bNeedsRedraw = true;\n    }\n}\n\nvoid FFMODStudioEditorModule::RegisterComponentVisualizer(FName ComponentClassName, TSharedPtr<FComponentVisualizer> Visualizer)\n{\n    if (GUnrealEd != nullptr)\n    {\n        GUnrealEd->RegisterComponentVisualizer(ComponentClassName, Visualizer);\n    }\n\n    RegisteredComponentClassNames.Add(ComponentClassName);\n\n    if (Visualizer.IsValid())\n    {\n        Visualizer->OnRegister();\n    }\n}\n\n#undef LOCTEXT_NAMESPACE\n"
  },
  {
    "path": "Plugins/FMODStudio/Source/FMODStudioEditor/Private/FMODStudioEditorPrivatePCH.h",
    "content": "// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2020.\n#pragma once\n\n//#include \"Runtime/Engine/Public/Engine.h\"\n#include \"Runtime/Engine/Classes/Components/SceneComponent.h\"\n#include \"Runtime/Engine/Classes/Camera/CameraComponent.h\"\n#include \"Runtime/Engine/Classes/Curves/IntegralCurve.h\"\n#include \"Runtime/Engine/Classes/Curves/NameCurve.h\"\n#include \"Runtime/Engine/Classes/Curves/RichCurve.h\"\n#include \"Runtime/MovieScene/Public/MovieScene.h\"\n#include \"Runtime/MovieScene/Public/KeyParams.h\"\n//#include \"Runtime/Slate/Public/SlateBasics.h\"\n\n#include \"Editor/Sequencer/Public/ISectionLayoutBuilder.h\"\n#include \"Editor/Sequencer/Public/ISequencerSection.h\"\n#include \"Editor/Sequencer/Public/MovieSceneTrackEditor.h\"\n#include \"Runtime/MovieScene/Public/MovieSceneCommonHelpers.h\"\n#include \"Runtime/MovieScene/Public/MovieSceneSection.h\"\n#include \"Editor/UnrealEd/Public/ScopedTransaction.h\"\n//#include \"Editor/UnrealEd/Public/UnrealEd.h\"\n\nDECLARE_LOG_CATEGORY_EXTERN(LogFMOD, Log, All);"
  },
  {
    "path": "Plugins/FMODStudio/Source/FMODStudioEditor/Private/FMODStudioStyle.cpp",
    "content": "// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2020.\n\n#include \"FMODStudioStyle.h\"\n#include \"EditorStyle/Public/Interfaces/IEditorStyleModule.h\"\n//#include \"EditorStyle/Public/EditorStyleSet.h\"\n#include \"Modules/ModuleManager.h\"\n\n#define IMAGE_BRUSH(RelativePath, ...) FSlateImageBrush(Style.RootToContentDir(RelativePath, TEXT(\".png\")), __VA_ARGS__)\n#define BOX_BRUSH(RelativePath, ...) FSlateBoxBrush(Style.RootToContentDir(RelativePath, TEXT(\".png\")), __VA_ARGS__)\n\n//////////////////////////////////////////////////////////////////////////\n// FFMODStudioStyle\n\nTSharedPtr<FSlateStyleSet> FFMODStudioStyle::StyleInstance = NULL;\n\nvoid FFMODStudioStyle::Initialize()\n{\n    if (!StyleInstance.IsValid())\n    {\n        StyleInstance = Create();\n    }\n\n    SetStyle(StyleInstance.ToSharedRef());\n}\n\nvoid FFMODStudioStyle::Shutdown()\n{\n    ResetToDefault();\n    ensure(StyleInstance.IsUnique());\n    StyleInstance.Reset();\n}\n\nTSharedRef<FSlateStyleSet> FFMODStudioStyle::Create()\n{\n    IEditorStyleModule &EditorStyle = FModuleManager::LoadModuleChecked<IEditorStyleModule>(TEXT(\"EditorStyle\"));\n    TSharedRef<FSlateStyleSet> StyleRef = EditorStyle.CreateEditorStyleInstance();\n    FSlateStyleSet &Style = StyleRef.Get();\n\n    const FVector2D Icon20x20(20.0f, 20.0f);\n    const FVector2D Icon40x40(40.0f, 40.0f);\n\n    Style.Set(\"ClassIcon.FMODAmbientSound\", new IMAGE_BRUSH(\"Icons/AssetIcons/AmbientSound_16x\", FVector2D(16.0f, 16.0f)));\n    Style.Set(\"ClassThumbnail.FMODAmbientSound\", new IMAGE_BRUSH(\"Icons/AssetIcons/AmbientSound_64x\", FVector2D(64.0f, 64.0f)));\n\n    Style.Set(\"ClassIcon.FMODAudioComponent\", new IMAGE_BRUSH(\"Icons/ActorIcons/SoundActor_16x\", FVector2D(16.0f, 16.0f)));\n    //Style.Set( \"ClassThumbnail.FMODAudioComponent\", new IMAGE_BRUSH( \"Icons/ActorIcons/SoundActor_64x\",  FVector2D(64.0f, 64.0f) ) );\n\n    Style.Set(\"ClassIcon.FMODAsset\", new IMAGE_BRUSH(\"Icons/ActorIcons/SoundActor_16x\", FVector2D(16.0f, 16.0f)));\n    //Style.Set( \"ClassThumbnail.FMODAsset\", new IMAGE_BRUSH( \"Icons/ActorIcons/SoundActor_64x\", FVector2D(64.0f, 64.0f)  ) );\n\n    return StyleRef;\n}\n\n//////////////////////////////////////////////////////////////////////////\n\n#undef IMAGE_BRUSH\n"
  },
  {
    "path": "Plugins/FMODStudio/Source/FMODStudioEditor/Private/FMODStudioStyle.h",
    "content": "// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2020.\n\n#pragma once\n#include \"SlateCore/Public/Styling/SlateStyle.h\"\n#include \"EditorStyle/Public/EditorStyleSet.h\"\n\nclass FFMODStudioStyle : public FEditorStyle\n{\npublic:\n    static void Initialize();\n\n    static void Shutdown();\n\nprivate:\n    static TSharedRef<class FSlateStyleSet> Create();\n\nprivate:\n    static TSharedPtr<class FSlateStyleSet> StyleInstance;\n\nprivate:\n    FFMODStudioStyle() {}\n};\n"
  },
  {
    "path": "Plugins/FMODStudio/Source/FMODStudioEditor/Private/SFMODEventEditorPanel.cpp",
    "content": "// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2020.\n\n#include \"SFMODEventEditorPanel.h\"\n#include \"FMODStudioModule.h\"\n#include \"FMODUtils.h\"\n#include \"Input/Reply.h\"\n#include \"Widgets/Input/SNumericEntryBox.h\"\n#include \"Widgets/Layout/SExpandableArea.h\"\n#include \"EditorStyle/Public/EditorStyleSet.h\"\n#include \"Widgets/Input/SButton.h\"\n#include \"Widgets/Layout/SScrollBox.h\"\n#include \"fmod_studio.hpp\"\n\n#define LOCTEXT_NAMESPACE \"FMODEventEditor\"\n\nSFMODEventEditorPanel::~SFMODEventEditorPanel()\n{\n}\n\nvoid SFMODEventEditorPanel::Construct(const FArguments &InArgs)\n{\n    FMODEventEditorPtr = InArgs._FMODEventEditor;\n\n    FMOD::Studio::EventDescription *EventDescription = FMODEventEditorPtr.Pin()->GetEventDescription();\n\n    TSharedRef<SBorder> ToolbarBorder = ConstructToolbar(EventDescription);\n    TSharedRef<SExpandableArea> InfoArea = ConstructInfo(EventDescription);\n    TSharedRef<SExpandableArea> ParametersArea = ConstructParameters(EventDescription);\n    TSharedRef<SExpandableArea> UserPropertiesArea = ConstructUserProperties(EventDescription);\n\n    TSharedRef<SVerticalBox> ChildWidget = SNew(SVerticalBox) + SVerticalBox::Slot().AutoHeight().Padding(0.0f, 3.0f)[InfoArea] +\n                                           SVerticalBox::Slot().AutoHeight().Padding(0.0f, 3.0f)[ParametersArea] +\n                                           SVerticalBox::Slot().AutoHeight().Padding(0.0f, 3.0f)[UserPropertiesArea];\n\n    ChildSlot[SNew(SVerticalBox) + SVerticalBox::Slot().AutoHeight().Padding(0.0f, 3.0f)[ToolbarBorder] +\n              SVerticalBox::Slot().FillHeight(\n                  1.0f)[SNew(SScrollBox) +\n                        SScrollBox::Slot().Padding(0.0f)[SNew(SVerticalBox) + SVerticalBox::Slot().AutoHeight().Padding(0.0f)[ChildWidget]]]];\n}\n\nTSharedRef<SBorder> SFMODEventEditorPanel::ConstructToolbar(FMOD::Studio::EventDescription *EventDescription)\n{\n    float MinDistance = 0.0f;\n    float MaxDistance = 0.0f;\n    int32 EventLengthMS = 0;\n    bool bIsOneshot = false, bIsStream = false, bIs3D = false;\n    if (EventDescription != nullptr)\n    {\n        EventDescription->getMinimumDistance(&MinDistance);\n        EventDescription->getMaximumDistance(&MaxDistance);\n        EventDescription->getLength(&EventLengthMS);\n        EventDescription->isOneshot(&bIsOneshot);\n        EventDescription->isStream(&bIsStream);\n        EventDescription->is3D(&bIs3D);\n    }\n\n    const FTimespan EventLength = FTimespan::FromMilliseconds((double)EventLengthMS);\n    const FString EventLengthString =\n        EventLength.GetHours() <= 0 ? EventLength.ToString(TEXT(\"%m:%s.%f\")) : EventLength.ToString(TEXT(\"%h:%m:%s.%f\"));\n\n    const FText RadiusText =\n        FText::Format(LOCTEXT(\"RadiusFormat\", \"Distance Attenuation: {0}m to {1}m\"), FText::AsNumber(MinDistance), FText::AsNumber(MaxDistance));\n    const FText LengthText = FText::Format(LOCTEXT(\"LengthFormat\", \"Length: {0}\"), FText::FromString(EventLengthString));\n\n    FText EventInfoText;\n    if (bIs3D && bIsOneshot)\n    {\n        EventInfoText = FText::Format(LOCTEXT(\"RadiusLengthFormat\", \"{0}  -  {1}\"), RadiusText, LengthText);\n    }\n    else if (!bIs3D && bIsOneshot)\n    {\n        EventInfoText = LengthText;\n    }\n    else if (bIs3D && !bIsOneshot)\n    {\n        EventInfoText = RadiusText;\n    }\n\n    return SNew(SBorder)\n        .BorderImage(FEditorStyle::Get().GetBrush(\"ToolPanel.GroupBorder\"))\n        .Padding(6.0f)\n        .Content()[SNew(SHorizontalBox) +\n                   SHorizontalBox::Slot()\n                       .AutoWidth()\n                       .Padding(0.0f, 0.0f, 2.0f, 0.0f)\n                       .VAlign(VAlign_Center)\n                       .HAlign(HAlign_Left)[SNew(SButton)\n                                                .VAlign(VAlign_Center)\n                                                .Text(LOCTEXT(\"Play\", \"Play\"))\n                                                .ContentPadding(4)\n                                                .OnClicked(this, &SFMODEventEditorPanel::OnClickedPlay)] +\n                   SHorizontalBox::Slot()\n                       .AutoWidth()\n                       .Padding(2.0f, 0.0f)\n                       .VAlign(VAlign_Center)\n                       .HAlign(HAlign_Left)\n                           [SNew(SButton).Text(LOCTEXT(\"Pause\", \"Pause\")).ContentPadding(4).OnClicked(this, &SFMODEventEditorPanel::OnClickedPause)] +\n                   SHorizontalBox::Slot()\n                       .AutoWidth()\n                       .Padding(2.0f, 0.0f)\n                       .VAlign(VAlign_Center)\n                       .HAlign(HAlign_Left)[SNew(SButton)\n                                                .VAlign(VAlign_Center)\n                                                .Text(LOCTEXT(\"Stop\", \"Stop\"))\n                                                .ContentPadding(4)\n                                                .OnClicked(this, &SFMODEventEditorPanel::OnClickedStop)] +\n                   SHorizontalBox::Slot()\n                       .FillWidth(1.0f)\n                       .Padding(2.0f, 0.0f)\n                       .VAlign(VAlign_Center)\n                       .HAlign(HAlign_Right)[SNew(STextBlock).Text(EventInfoText)]];\n}\n\nvoid AddTextField(TSharedRef<SVerticalBox> &InfoBox, const TCHAR *Name, const FText &Value)\n{\n    InfoBox->AddSlot().Padding(\n        4.0f, 3.0f)[SNew(SHorizontalBox) + SHorizontalBox::Slot().FillWidth(0.3f)[SNew(STextBlock).Text(FText::FromString(Name))] +\n                    SHorizontalBox::Slot()[SNew(SEditableText).Text(Value).IsReadOnly(true)]];\n}\n\nvoid AddBoolField(TSharedRef<SVerticalBox> &InfoBox, const TCHAR *Name, bool bValue)\n{\n    AddTextField(InfoBox, Name, bValue ? LOCTEXT(\"True\", \"True\") : LOCTEXT(\"False\", \"False\"));\n}\n\nvoid AddFloatField(TSharedRef<SVerticalBox> &InfoBox, const TCHAR *Name, float Value)\n{\n    AddTextField(InfoBox, Name, FText::AsNumber(Value));\n}\n\nTSharedRef<SExpandableArea> MakeBox(TSharedRef<SVerticalBox> &InfoBox, const FText &Value)\n{\n    return SNew(SExpandableArea)\n        .AreaTitle(Value)\n        .InitiallyCollapsed(false)\n        .BodyContent()[SNew(SBorder).BorderImage(FCoreStyle::Get().GetBrush(\"NoBorder\")).Padding(4.0f).Content()[InfoBox]];\n}\n\nTSharedRef<SExpandableArea> SFMODEventEditorPanel::ConstructInfo(FMOD::Studio::EventDescription *EventDescription)\n{\n    TSharedRef<SVerticalBox> InfoBox = SNew(SVerticalBox);\n\n    if (EventDescription != nullptr)\n    {\n        FString EventPath = FMODUtils::GetPath(EventDescription);\n        FGuid Guid = FMODUtils::GetID(EventDescription);\n\n        int Length = 0.0f;\n        float MinDist = 0.0f;\n        float MaxDist = 0.0f;\n        EventDescription->getLength(&Length);\n        EventDescription->getMinimumDistance(&MinDist);\n        EventDescription->getMaximumDistance(&MaxDist);\n\n        bool bOneShot = false;\n        bool bStream = false;\n        bool b3D = false;\n        EventDescription->isOneshot(&bOneShot);\n        EventDescription->isStream(&bStream);\n        EventDescription->is3D(&b3D);\n\n        AddTextField(InfoBox, TEXT(\"Path\"), FText::FromString(EventPath));\n        AddTextField(InfoBox, TEXT(\"Guid\"), FText::FromString(Guid.ToString(EGuidFormats::DigitsWithHyphensInBraces)));\n        AddBoolField(InfoBox, TEXT(\"OneShot\"), bOneShot);\n        AddBoolField(InfoBox, TEXT(\"Streaming\"), bStream);\n        AddBoolField(InfoBox, TEXT(\"3D\"), b3D);\n\n        AddFloatField(InfoBox, TEXT(\"Length\"), static_cast<float>(Length));\n        if (b3D)\n        {\n            AddFloatField(InfoBox, TEXT(\"Min Dist\"), MinDist);\n            AddFloatField(InfoBox, TEXT(\"Max Dist\"), MaxDist);\n        }\n    }\n\n    return MakeBox(InfoBox, LOCTEXT(\"EventInfo\", \"Event Info\"));\n}\n\nTSharedRef<SExpandableArea> SFMODEventEditorPanel::ConstructParameters(FMOD::Studio::EventDescription *EventDescription)\n{\n    auto EventEditor = FMODEventEditorPtr.Pin();\n    TSharedRef<SVerticalBox> ParametersBox = SNew(SVerticalBox);\n\n    FNumberFormattingOptions Options;\n    Options.MinimumFractionalDigits = 1;\n\n    if (EventDescription != nullptr)\n    {\n        int32 ParameterCount;\n        EventDescription->getParameterCount(&ParameterCount);\n        for (int32 ParamIdx = 0; ParamIdx < ParameterCount; ParamIdx++)\n        {\n            FMOD_STUDIO_PARAMETER_DESCRIPTION Parameter;\n            EventDescription->getParameterByIndex(ParamIdx, &Parameter);\n\n            EventEditor->GetParameterValues().Add(Parameter.minimum);\n\n            const FString ParameterName = Parameter.type == FMOD_STUDIO_PARAMETER_GAME_CONTROLLED ? FString(UTF8_TO_TCHAR(Parameter.name)) :\n                                                                                                    FMODUtils::ParameterTypeToString(Parameter.type);\n            const FText ToolTipText = FText::Format(LOCTEXT(\"ParameterTooltipFormat\", \"{0} (Min Value: {1} - Max Value: {2})\"),\n                FText::FromString(ParameterName), FText::AsNumber(Parameter.minimum, &Options), FText::AsNumber(Parameter.maximum, &Options));\n\n            ParametersBox->AddSlot().Padding(4.0f,\n                2.0f)[SNew(SHorizontalBox).ToolTipText(ToolTipText) +\n                      SHorizontalBox::Slot().FillWidth(0.3f)[SNew(STextBlock).Text(FText::FromString(ParameterName))] +\n                      SHorizontalBox::Slot().MaxWidth(200.0f)[SNew(SNumericEntryBox<float>)\n                                                                  .Value(this, &SFMODEventEditorPanel::GetParameterValue, ParamIdx)\n                                                                  .OnValueChanged(this, &SFMODEventEditorPanel::OnParameterValueChanged, ParamIdx)\n                                                                  .AllowSpin(true)\n                                                                  .MinValue(Parameter.minimum)\n                                                                  .MaxValue(Parameter.maximum)\n                                                                  .MinSliderValue(Parameter.minimum)\n                                                                  .MaxSliderValue(Parameter.maximum)\n                                                                  .Delta(0.01f)]];\n        }\n    }\n\n    return MakeBox(ParametersBox, LOCTEXT(\"EventParameters\", \"Event Parameters\"));\n}\n\nTSharedRef<SExpandableArea> SFMODEventEditorPanel::ConstructUserProperties(FMOD::Studio::EventDescription *EventDescription)\n{\n    TSharedRef<SVerticalBox> UserPropertiesBox = SNew(SVerticalBox);\n\n    if (EventDescription != nullptr)\n    {\n        int32 UserPropertyCount;\n        EventDescription->getUserPropertyCount(&UserPropertyCount);\n        for (int32 PropertyIdx = 0; PropertyIdx < UserPropertyCount; PropertyIdx++)\n        {\n            FMOD_STUDIO_USER_PROPERTY UserProperty;\n            EventDescription->getUserPropertyByIndex(PropertyIdx, &UserProperty);\n\n            FText PropertyText;\n            switch (UserProperty.type)\n            {\n                case FMOD_STUDIO_USER_PROPERTY_TYPE_INTEGER:\n                    PropertyText = FText::AsNumber(UserProperty.intvalue);\n                    break;\n                case FMOD_STUDIO_USER_PROPERTY_TYPE_BOOLEAN:\n                    PropertyText = UserProperty.boolvalue ? LOCTEXT(\"True\", \"True\") : LOCTEXT(\"False\", \"False\");\n                    break;\n                case FMOD_STUDIO_USER_PROPERTY_TYPE_FLOAT:\n                    PropertyText = FText::AsNumber(UserProperty.floatvalue);\n                    break;\n                case FMOD_STUDIO_USER_PROPERTY_TYPE_STRING:\n                    PropertyText = FText::FromString(UTF8_TO_TCHAR(UserProperty.stringvalue));\n                    break;\n            }\n\n            FString UserName(UTF8_TO_TCHAR(UserProperty.name));\n            AddTextField(UserPropertiesBox, *UserName, PropertyText);\n        }\n    }\n\n    return MakeBox(UserPropertiesBox, LOCTEXT(\"EventUserProperties\", \"Event User Properties\"));\n}\n\nFReply SFMODEventEditorPanel::OnClickedPlay()\n{\n    FMODEventEditorPtr.Pin()->PlayEvent();\n    return FReply::Handled();\n}\n\nFReply SFMODEventEditorPanel::OnClickedStop()\n{\n    FMODEventEditorPtr.Pin()->StopEvent();\n    return FReply::Handled();\n}\n\nFReply SFMODEventEditorPanel::OnClickedPause()\n{\n    FMODEventEditorPtr.Pin()->PauseEvent();\n    return FReply::Handled();\n}\n\nvoid SFMODEventEditorPanel::OnParameterValueChanged(float NewValue, int32 ParameterIdx)\n{\n    FMODEventEditorPtr.Pin()->SetParameterValue(ParameterIdx, NewValue);\n}\n\nTOptional<float> SFMODEventEditorPanel::GetParameterValue(int32 ParameterIdx) const\n{\n    return FMODEventEditorPtr.Pin()->GetParameterValues()[ParameterIdx];\n}\n\n#undef LOC_NAMESPACE\n"
  },
  {
    "path": "Plugins/FMODStudio/Source/FMODStudioEditor/Private/SFMODEventEditorPanel.h",
    "content": "// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2020.\n\n#pragma once\n\n#include \"FMODEventEditor.h\"\n\nnamespace FMOD\n{\nnamespace Studio\n{\nclass EventDescription;\n}\n}\n\nclass SFMODEventEditorPanel : public SCompoundWidget\n{\npublic:\n    SLATE_BEGIN_ARGS(SFMODEventEditorPanel) {}\n    SLATE_ARGUMENT(TWeakPtr<FFMODEventEditor>, FMODEventEditor)\n    SLATE_END_ARGS()\n\n    ~SFMODEventEditorPanel();\n\n    /** SCompoundWidget interface */\n    void Construct(const FArguments &InArgs);\n\nprivate:\n    TSharedRef<SBorder> ConstructToolbar(FMOD::Studio::EventDescription *EventDescription);\n    TSharedRef<SExpandableArea> ConstructInfo(FMOD::Studio::EventDescription *EventDescription);\n    TSharedRef<SExpandableArea> ConstructParameters(FMOD::Studio::EventDescription *EventDescription);\n    TSharedRef<SExpandableArea> ConstructUserProperties(FMOD::Studio::EventDescription *EventDescription);\n\n    /** Editor that owns this panel */\n    TWeakPtr<FFMODEventEditor> FMODEventEditorPtr;\n\n    FReply OnClickedPlay();\n    FReply OnClickedStop();\n    FReply OnClickedPause();\n\n    TOptional<float> GetParameterValue(int32 ParameterIdx) const;\n    void OnParameterValueChanged(float NewValue, int32 ParameterIdx);\n};\n"
  },
  {
    "path": "Plugins/FMODStudio/Source/FMODStudioEditor/Private/Sequencer/FMODChannelEditors.cpp",
    "content": "// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2020.\n\n#include \"Sequencer/FMODChannelEditors.h\"\n#include \"ISequencerChannelInterface.h\"\n#include \"Widgets/DeclarativeSyntaxSupport.h\"\n#include \"Widgets/SCompoundWidget.h\"\n#include \"MovieSceneTimeHelpers.h\"\n#include \"MovieSceneToolHelpers.h\"\n#include \"ScopedTransaction.h\"\n#include \"EditorStyleSet.h\"\n\nclass SFMODEventControlKeyEditor : public SCompoundWidget\n{\npublic:\n    SLATE_BEGIN_ARGS(SFMODEventControlKeyEditor) {}\n    SLATE_END_ARGS();\n\n    void Construct(const FArguments &InArgs, TMovieSceneChannelHandle<FMovieSceneByteChannel> InChannelHandle,\n        TWeakObjectPtr<UMovieSceneSection> InWeakSection, TWeakPtr<ISequencer> InWeakSequencer, UEnum *InEnum)\n    {\n        ChannelHandle = InChannelHandle;\n        WeakSection = InWeakSection;\n        WeakSequencer = InWeakSequencer;\n\n        ChildSlot[MovieSceneToolHelpers::MakeEnumComboBox(InEnum,\n            TAttribute<int32>::Create(TAttribute<int32>::FGetter::CreateSP(this, &SFMODEventControlKeyEditor::OnGetCurrentValueAsInt)),\n            FOnEnumSelectionChanged::CreateSP(this, &SFMODEventControlKeyEditor::OnChangeKey))];\n    }\n\nprivate:\n    int32 OnGetCurrentValueAsInt() const\n    {\n        using namespace MovieScene;\n\n        FMovieSceneByteChannel *Channel = ChannelHandle.Get();\n        ISequencer *Sequencer = WeakSequencer.Pin().Get();\n        UMovieSceneSection *OwningSection = WeakSection.Get();\n        uint8 Result = 0;\n\n        if (Channel && Sequencer && OwningSection)\n        {\n            const FFrameTime CurrentTime = MovieScene::ClampToDiscreteRange(Sequencer->GetLocalTime().Time, OwningSection->GetRange());\n            EvaluateChannel(Channel, CurrentTime, Result);\n        }\n\n        return Result;\n    }\n\n    void SetValue(uint8 InValue)\n    {\n        using namespace MovieScene;\n        using namespace Sequencer;\n\n        UMovieSceneSection *OwningSection = WeakSection.Get();\n        if (!OwningSection)\n        {\n            return;\n        }\n\n        OwningSection->SetFlags(RF_Transactional);\n\n        FMovieSceneByteChannel *Channel = ChannelHandle.Get();\n        ISequencer *Sequencer = WeakSequencer.Pin().Get();\n\n        if (!OwningSection->TryModify() || !Channel || !Sequencer)\n        {\n            return;\n        }\n\n        const FFrameNumber CurrentTime = Sequencer->GetLocalTime().Time.FloorToFrame();\n        const bool bAutoSetTrackDefaults = Sequencer->GetAutoSetTrackDefaults();\n\n        EMovieSceneKeyInterpolation Interpolation = Sequencer->GetKeyInterpolation();\n\n        TArray<FKeyHandle> KeysAtCurrentTime;\n        Channel->GetKeys(TRange<FFrameNumber>(CurrentTime), nullptr, &KeysAtCurrentTime);\n\n        if (KeysAtCurrentTime.Num() > 0)\n        {\n            AssignValue(Channel, KeysAtCurrentTime[0], InValue);\n        }\n        else\n        {\n            const bool bHasAnyKeys = Channel->GetNumKeys() != 0;\n\n            if (bHasAnyKeys || bAutoSetTrackDefaults == false)\n            {\n                // When auto setting track defaults are disabled, add a key even when it's empty so that the changed\n                // value is saved and is propagated to the property.\n                AddKeyToChannel(Channel, CurrentTime, InValue, Interpolation);\n            }\n\n            if (bHasAnyKeys)\n            {\n                TRange<FFrameNumber> KeyRange = TRange<FFrameNumber>(CurrentTime);\n                TRange<FFrameNumber> SectionRange = OwningSection->GetRange();\n\n                if (!SectionRange.Contains(KeyRange))\n                {\n                    OwningSection->SetRange(TRange<FFrameNumber>::Hull(KeyRange, SectionRange));\n                }\n            }\n        }\n\n        // Always update the default value when auto-set default values is enabled so that the last changes\n        // are always saved to the track.\n        if (bAutoSetTrackDefaults)\n        {\n            SetChannelDefault(Channel, InValue);\n        }\n    }\n\n    void OnChangeKey(int32 Selection, ESelectInfo::Type SelectionType)\n    {\n        FScopedTransaction Transaction(FText::FromString(\"Set FMOD Event Control Key Value\"));\n        SetValue(Selection);\n        if (ISequencer *Sequencer = WeakSequencer.Pin().Get())\n        {\n            Sequencer->NotifyMovieSceneDataChanged(EMovieSceneDataChangeType::TrackValueChangedRefreshImmediately);\n        }\n    }\n\n    TMovieSceneChannelHandle<FMovieSceneByteChannel> ChannelHandle;\n    TWeakObjectPtr<UMovieSceneSection> WeakSection;\n    TWeakPtr<ISequencer> WeakSequencer;\n};\n\nbool CanCreateKeyEditor(const FMovieSceneByteChannel *Channel)\n{\n    return true;\n}\n\nTSharedRef<SWidget> CreateKeyEditor(const TMovieSceneChannelHandle<FMovieSceneByteChannel> &Channel, UMovieSceneSection *Section,\n    const FGuid &InObjectBindingID, TWeakPtr<FTrackInstancePropertyBindings> PropertyBindings, TWeakPtr<ISequencer> InSequencer)\n{\n    const FMovieSceneByteChannel *RawChannel = Channel.Get();\n\n    if (!RawChannel)\n    {\n        return SNullWidget::NullWidget;\n    }\n\n    UEnum *Enum = RawChannel->GetEnum();\n    return SNew(SFMODEventControlKeyEditor, Channel, Section, InSequencer, Enum);\n}\n\nTSharedPtr<FStructOnScope> GetKeyStruct(const TMovieSceneChannelHandle<FFMODEventControlChannel> &ChannelHandle, FKeyHandle InHandle)\n{\n    FFMODEventControlChannel *Channel = ChannelHandle.Get();\n    if (!Channel)\n    {\n        return nullptr;\n    }\n\n    TMovieSceneChannelData<uint8> ChannelData = Channel->GetData();\n    const int32 KeyIndex = ChannelData.GetIndex(InHandle);\n\n    if (KeyIndex == INDEX_NONE)\n    {\n        return nullptr;\n    }\n\n    TSharedPtr<FStructOnScope> KeyStruct = MakeShared<FStructOnScope>(FFMODEventControlKeyStruct::StaticStruct());\n    FFMODEventControlKeyStruct *Struct = reinterpret_cast<FFMODEventControlKeyStruct *>(KeyStruct->GetStructMemory());\n\n    Struct->Time = ChannelData.GetTimes()[KeyIndex];\n    Struct->Value = (EFMODEventControlKey)ChannelData.GetValues()[KeyIndex];\n\n    Struct->KeyStructInterop.Add(FMovieSceneChannelValueHelper(ChannelHandle, &Struct->Value, MakeTuple(InHandle, Struct->Time)));\n    return KeyStruct;\n}\n\nvoid DrawKeys(FFMODEventControlChannel *Channel, TArrayView<const FKeyHandle> InKeyHandles, TArrayView<FKeyDrawParams> OutKeyDrawParams)\n{\n    static const FName KeyLeftBrushName(\"Sequencer.KeyLeft\");\n    static const FName KeyRightBrushName(\"Sequencer.KeyRight\");\n    static const FName KeyDiamondBrushName(\"Sequencer.KeyDiamond\");\n\n    const FSlateBrush *LeftKeyBrush = FEditorStyle::GetBrush(KeyLeftBrushName);\n    const FSlateBrush *RightKeyBrush = FEditorStyle::GetBrush(KeyRightBrushName);\n    const FSlateBrush *DiamondBrush = FEditorStyle::GetBrush(KeyDiamondBrushName);\n\n    TMovieSceneChannelData<uint8> ChannelData = Channel->GetData();\n\n    for (int32 Index = 0; Index < InKeyHandles.Num(); ++Index)\n    {\n        FKeyHandle Handle = InKeyHandles[Index];\n\n        FKeyDrawParams Params;\n        Params.BorderBrush = Params.FillBrush = DiamondBrush;\n\n        const int32 KeyIndex = ChannelData.GetIndex(Handle);\n        if (KeyIndex != INDEX_NONE)\n        {\n            const EFMODEventControlKey Value = (EFMODEventControlKey)ChannelData.GetValues()[KeyIndex];\n            if (Value == EFMODEventControlKey::Play)\n            {\n                Params.BorderBrush = Params.FillBrush = LeftKeyBrush;\n                Params.FillOffset = FVector2D(-1.0f, 1.0f);\n            }\n            else if (Value == EFMODEventControlKey::Stop)\n            {\n                Params.BorderBrush = Params.FillBrush = RightKeyBrush;\n                Params.FillOffset = FVector2D(1.0f, 1.0f);\n            }\n        }\n\n        OutKeyDrawParams[Index] = Params;\n    }\n}\n"
  },
  {
    "path": "Plugins/FMODStudio/Source/FMODStudioEditor/Private/Sequencer/FMODChannelEditors.h",
    "content": "#pragma once\n\n#include \"CoreTypes.h\"\n#include \"Templates/SharedPointer.h\"\n#include \"Containers/Array.h\"\n#include \"UObject/ObjectMacros.h\"\n#include \"UObject/Class.h\"\n\n#include \"MovieSceneKeyStruct.h\"\n#include \"SequencerChannelTraits.h\"\n#include \"Channels/MovieSceneChannelHandle.h\"\n#include \"Channels/MovieSceneByteChannel.h\"\n#include \"Sequencer/FMODEventControlSection.h\"\n\n#include \"FMODChannelEditors.generated.h\"\n\n/** Key editor overrides */\nbool CanCreateKeyEditor(const FMovieSceneByteChannel *Channel);\nTSharedRef<SWidget> CreateKeyEditor(const TMovieSceneChannelHandle<FMovieSceneByteChannel> &Channel, UMovieSceneSection *Section,\n    const FGuid &InObjectBindingID, TWeakPtr<FTrackInstancePropertyBindings> PropertyBindings, TWeakPtr<ISequencer> InSequencer);\n\n/** KeyStruct overrides */\nTSharedPtr<FStructOnScope> GetKeyStruct(const TMovieSceneChannelHandle<FFMODEventControlChannel> &Channel, FKeyHandle InHandle);\n\n/** Key drawing overrides */\nvoid DrawKeys(FFMODEventControlChannel *Channel, TArrayView<const FKeyHandle> InKeyHandles, TArrayView<FKeyDrawParams> OutKeyDrawParams);\n\nUSTRUCT()\nstruct FFMODEventControlKeyStruct : public FMovieSceneKeyTimeStruct\n{\n    GENERATED_BODY();\n\n    UPROPERTY(EditAnywhere, Category = \"Key\")\n    EFMODEventControlKey Value;\n};\ntemplate <>\nstruct TStructOpsTypeTraits<FFMODEventControlKeyStruct> : public TStructOpsTypeTraitsBase2<FFMODEventControlKeyStruct>\n{\n    enum\n    {\n        WithCopy = false\n    };\n};\n"
  },
  {
    "path": "Plugins/FMODStudio/Source/FMODStudioEditor/Private/Sequencer/FMODEventControlTrackEditor.cpp",
    "content": "// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2020.\n\n#include \"FMODEventControlTrackEditor.h\"\n#include \"Rendering/DrawElements.h\"\n#include \"Framework/MultiBox/MultiBoxBuilder.h\"\n#include \"Curves/IntegralCurve.h\"\n#include \"SequencerSectionPainter.h\"\n#include \"EditorStyleSet.h\"\n#include \"Editor/UnrealEdEngine.h\"\n#include \"Sequencer/FMODEventControlSection.h\"\n#include \"Sequencer/FMODEventControlTrack.h\"\n#include \"ISectionLayoutBuilder.h\"\n#include \"FMODAmbientSound.h\"\n#include \"CommonMovieSceneTools.h\"\n#include \"Channels/MovieSceneChannelProxy.h\"\n#include \"Channels/MovieSceneChannelEditorData.h\"\n\n#define LOCTEXT_NAMESPACE \"FFMODEventControlTrackEditor\"\n\nFFMODEventControlSection::FFMODEventControlSection(UMovieSceneSection &InSection, TSharedRef<ISequencer> InOwningSequencer)\n    : Section(InSection)\n    , OwningSequencerPtr(InOwningSequencer)\n{\n}\n\nUMovieSceneSection *FFMODEventControlSection::GetSectionObject()\n{\n    return &Section;\n}\n\nfloat FFMODEventControlSection::GetSectionHeight() const\n{\n    static const float SectionHeight = 20.f;\n    return SectionHeight;\n}\n\nint32 FFMODEventControlSection::OnPaintSection(FSequencerSectionPainter &InPainter) const\n{\n    TSharedPtr<ISequencer> OwningSequencer = OwningSequencerPtr.Pin();\n\n    if (!OwningSequencer.IsValid())\n    {\n        return InPainter.LayerId + 1;\n    }\n\n    const ESlateDrawEffect DrawEffects = InPainter.bParentEnabled ? ESlateDrawEffect::None : ESlateDrawEffect::DisabledEffect;\n    const FTimeToPixel &TimeToPixelConverter = InPainter.GetTimeConverter();\n\n    FLinearColor TrackColor;\n\n    // TODO: Set / clip stop time based on event length\n    UFMODEventControlSection *ControlSection = Cast<UFMODEventControlSection>(&Section);\n    if (IsValid(ControlSection))\n    {\n        UFMODEventControlTrack *ParentTrack = Cast<UFMODEventControlTrack>(ControlSection->GetOuter());\n        if (IsValid(ParentTrack))\n        {\n            TrackColor = ParentTrack->GetColorTint();\n        }\n    }\n\n    // TODO: This should only draw the visible ranges.\n    TArray<TRange<float>> DrawRanges;\n    TOptional<float> CurrentRangeStart;\n\n    if (ControlSection != nullptr)\n    {\n        TMovieSceneChannelData<const uint8> ChannelData = ControlSection->ControlKeys.GetData();\n        TArrayView<const FFrameNumber> Times = ChannelData.GetTimes();\n        TArrayView<const uint8> Values = ChannelData.GetValues();\n\n        for (int32 Index = 0; Index < Times.Num(); ++Index)\n        {\n            const double Time = Times[Index] / TimeToPixelConverter.GetTickResolution();\n            const EFMODEventControlKey Value = (EFMODEventControlKey)Values[Index];\n\n            if (Value == EFMODEventControlKey::Play)\n            {\n                if (CurrentRangeStart.IsSet() == false)\n                {\n                    CurrentRangeStart = Time;\n                }\n            }\n            if (Value == EFMODEventControlKey::Stop)\n            {\n                if (CurrentRangeStart.IsSet())\n                {\n                    DrawRanges.Add(TRange<float>(CurrentRangeStart.GetValue(), Time));\n                    CurrentRangeStart.Reset();\n                }\n            }\n        }\n    }\n\n    if (CurrentRangeStart.IsSet())\n    {\n        DrawRanges.Add(TRange<float>(CurrentRangeStart.GetValue(), OwningSequencer->GetViewRange().GetUpperBoundValue()));\n    }\n\n    for (const TRange<float> &DrawRange : DrawRanges)\n    {\n        float XOffset = TimeToPixelConverter.SecondsToPixel(DrawRange.GetLowerBoundValue());\n        float XSize = TimeToPixelConverter.SecondsToPixel(DrawRange.GetUpperBoundValue()) - XOffset;\n        FSlateDrawElement::MakeBox(InPainter.DrawElements, InPainter.LayerId,\n            InPainter.SectionGeometry.ToPaintGeometry(\n                FVector2D(XOffset, (InPainter.SectionGeometry.GetLocalSize().Y - SequencerSectionConstants::KeySize.Y) / 2),\n                FVector2D(XSize, SequencerSectionConstants::KeySize.Y)),\n            FEditorStyle::GetBrush(\"Sequencer.Section.Background\"), DrawEffects);\n        FSlateDrawElement::MakeBox(InPainter.DrawElements, InPainter.LayerId,\n            InPainter.SectionGeometry.ToPaintGeometry(\n                FVector2D(XOffset, (InPainter.SectionGeometry.GetLocalSize().Y - SequencerSectionConstants::KeySize.Y) / 2),\n                FVector2D(XSize, SequencerSectionConstants::KeySize.Y)),\n            FEditorStyle::GetBrush(\"Sequencer.Section.BackgroundTint\"), DrawEffects, TrackColor);\n    }\n\n    return InPainter.LayerId + 1;\n}\n\nFFMODEventControlTrackEditor::FFMODEventControlTrackEditor(TSharedRef<ISequencer> InSequencer)\n    : FMovieSceneTrackEditor(InSequencer)\n{\n}\n\nTSharedRef<ISequencerTrackEditor> FFMODEventControlTrackEditor::CreateTrackEditor(TSharedRef<ISequencer> InSequencer)\n{\n    return MakeShareable(new FFMODEventControlTrackEditor(InSequencer));\n}\n\nbool FFMODEventControlTrackEditor::SupportsType(TSubclassOf<UMovieSceneTrack> Type) const\n{\n    return Type == UFMODEventControlTrack::StaticClass();\n}\n\nTSharedRef<ISequencerSection> FFMODEventControlTrackEditor::MakeSectionInterface(\n    UMovieSceneSection &SectionObject, UMovieSceneTrack &Track, FGuid ObjectBinding)\n{\n    check(SupportsType(SectionObject.GetOuter()->GetClass()));\n    const TSharedPtr<ISequencer> OwningSequencer = GetSequencer();\n    return MakeShareable(new FFMODEventControlSection(SectionObject, OwningSequencer.ToSharedRef()));\n}\n\nvoid FFMODEventControlTrackEditor::BuildObjectBindingTrackMenu(FMenuBuilder &MenuBuilder, const FGuid &ObjectBinding, const UClass *ObjectClass)\n{\n    if (ObjectClass->IsChildOf(AFMODAmbientSound::StaticClass()) || ObjectClass->IsChildOf(UFMODAudioComponent::StaticClass()))\n    {\n        const TSharedPtr<ISequencer> ParentSequencer = GetSequencer();\n\n        MenuBuilder.AddMenuEntry(LOCTEXT(\"AddFMODEventControlTrack\", \"FMOD Event Control Track\"),\n            LOCTEXT(\"FMODEventControlTooltip\", \"Adds a track for controlling FMOD event.\"), FSlateIcon(),\n            FUIAction(FExecuteAction::CreateSP(this, &FFMODEventControlTrackEditor::AddControlKey, ObjectBinding)));\n    }\n}\n\nvoid FFMODEventControlTrackEditor::AddControlKey(const FGuid ObjectGuid)\n{\n    TSharedPtr<ISequencer> SequencerPtr = GetSequencer();\n    UObject *Object = SequencerPtr.IsValid() ? SequencerPtr->FindSpawnedObjectOrTemplate(ObjectGuid) : nullptr;\n\n    if (IsValid(Object))\n    {\n        AnimatablePropertyChanged(FOnKeyProperty::CreateRaw(this, &FFMODEventControlTrackEditor::AddKeyInternal, Object));\n    }\n}\n\nFKeyPropertyResult FFMODEventControlTrackEditor::AddKeyInternal(FFrameNumber KeyTime, UObject *Object)\n{\n    FKeyPropertyResult KeyPropertyResult;\n\n    FFindOrCreateHandleResult HandleResult = FindOrCreateHandleToObject(Object);\n    FGuid ObjectHandle = HandleResult.Handle;\n    KeyPropertyResult.bHandleCreated |= HandleResult.bWasCreated;\n\n    if (ObjectHandle.IsValid())\n    {\n        FFindOrCreateTrackResult TrackResult = FindOrCreateTrackForObject(ObjectHandle, UFMODEventControlTrack::StaticClass());\n        UMovieSceneTrack *Track = TrackResult.Track;\n        KeyPropertyResult.bTrackCreated |= TrackResult.bWasCreated;\n\n        if (KeyPropertyResult.bTrackCreated && ensure(Track))\n        {\n            UFMODEventControlTrack *EventTrack = Cast<UFMODEventControlTrack>(Track);\n            EventTrack->AddNewSection(KeyTime);\n            EventTrack->SetDisplayName(LOCTEXT(\"TrackName\", \"FMOD Event\"));\n        }\n    }\n\n    return KeyPropertyResult;\n}\n\n#undef LOCTEXT_NAMESPACE\n"
  },
  {
    "path": "Plugins/FMODStudio/Source/FMODStudioEditor/Private/Sequencer/FMODEventControlTrackEditor.h",
    "content": "// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2020.\n\n#pragma once\n\n#include \"CoreMinimal.h\"\n#include \"Misc/Guid.h\"\n#include \"Templates/SubclassOf.h\"\n#include \"Curves/KeyHandle.h\"\n#include \"ISequencer.h\"\n#include \"MovieSceneTrack.h\"\n#include \"ISequencerSection.h\"\n#include \"ISequencerTrackEditor.h\"\n#include \"MovieSceneTrackEditor.h\"\n\nclass FMenuBuilder;\nclass FSequencerSectionPainter;\n\n/** FMOD Event control track */\nclass FFMODEventControlTrackEditor : public FMovieSceneTrackEditor\n{\npublic:\n    FFMODEventControlTrackEditor(TSharedRef<ISequencer> InSequencer);\n\n    static TSharedRef<ISequencerTrackEditor> CreateTrackEditor(TSharedRef<ISequencer> OwningSequencer);\n\n    void AddControlKey(const FGuid ObjectGuid);\n\n    // Begin ISequencerTrackEditor interface\n    virtual void BuildObjectBindingTrackMenu(FMenuBuilder &MenuBuilder, const FGuid &ObjectBinding, const UClass *ObjectClass) override;\n    virtual TSharedRef<ISequencerSection> MakeSectionInterface(\n        UMovieSceneSection &SectionObject, UMovieSceneTrack &Track, FGuid ObjectBinding) override;\n    virtual bool SupportsType(TSubclassOf<UMovieSceneTrack> Type) const override;\n    // End ISequencerTrackEditor interface\n\nprivate:\n    /** Delegate for AnimatablePropertyChanged in AddKey. */\n    virtual FKeyPropertyResult AddKeyInternal(FFrameNumber KeyTime, UObject *Object);\n};\n\n/** Class for event control sections. */\nclass FFMODEventControlSection : public ISequencerSection, public TSharedFromThis<FFMODEventControlSection>\n{\npublic:\n    FFMODEventControlSection(UMovieSceneSection &InSection, TSharedRef<ISequencer> InOwningSequencer);\n\n    // Begin ISequencerSection interface\n    virtual UMovieSceneSection *GetSectionObject() override;\n    virtual float GetSectionHeight() const override;\n    virtual int32 OnPaintSection(FSequencerSectionPainter &InPainter) const override;\n    virtual bool SectionIsResizable() const override { return false; }\n    // End ISequencerSection interface\n\nprivate:\n    /** The section we are visualizing. */\n    UMovieSceneSection &Section;\n\n    /** The sequencer that owns this section */\n    TWeakPtr<ISequencer> OwningSequencerPtr;\n};\n"
  },
  {
    "path": "Plugins/FMODStudio/Source/FMODStudioEditor/Private/Sequencer/FMODEventParameterTrackEditor.cpp",
    "content": "// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2020.\n\n#include \"FMODEventParameterTrackEditor.h\"\n#include \"FMODAmbientSound.h\"\n#include \"FMODEvent.h\"\n#include \"FMODStudioModule.h\"\n#include \"Framework/MultiBox/MultiBoxBuilder.h\"\n#include \"Sequencer/FMODEventParameterTrack.h\"\n#include \"Sections/MovieSceneParameterSection.h\"\n#include \"Sequencer/FMODParameterSection.h\"\n#include \"SequencerUtilities.h\"\n#include \"fmod_studio.hpp\"\n\n#define LOCTEXT_NAMESPACE \"FMODEeventParameterTrackEditor\"\n\nFName FFMODEventParameterTrackEditor::TrackName(\"FMODEventParameter\");\n\nFFMODEventParameterTrackEditor::FFMODEventParameterTrackEditor(TSharedRef<ISequencer> InSequencer)\n    : FMovieSceneTrackEditor(InSequencer)\n{\n}\n\nTSharedRef<ISequencerTrackEditor> FFMODEventParameterTrackEditor::CreateTrackEditor(TSharedRef<ISequencer> OwningSequencer)\n{\n    return MakeShareable(new FFMODEventParameterTrackEditor(OwningSequencer));\n}\n\nTSharedRef<ISequencerSection> FFMODEventParameterTrackEditor::MakeSectionInterface(\n    UMovieSceneSection &SectionObject, UMovieSceneTrack &Track, FGuid ObjectBinding)\n{\n    UMovieSceneParameterSection *ParameterSection = Cast<UMovieSceneParameterSection>(&SectionObject);\n    checkf(ParameterSection != nullptr, TEXT(\"Unsupported section type.\"));\n    return MakeShareable(new FFMODParameterSection(*ParameterSection));\n}\n\nTSharedPtr<SWidget> FFMODEventParameterTrackEditor::BuildOutlinerEditWidget(\n    const FGuid &ObjectBinding, UMovieSceneTrack *Track, const FBuildEditWidgetParams &Params)\n{\n    UFMODEventParameterTrack *EventParameterTrack = Cast<UFMODEventParameterTrack>(Track);\n\n    // Create a container edit box\n    return FSequencerUtilities::MakeAddButton(LOCTEXT(\"ParameterText\", \"Parameter\"),\n        FOnGetContent::CreateSP(this, &FFMODEventParameterTrackEditor::OnGetAddParameterMenuContent, ObjectBinding, EventParameterTrack),\n        Params.NodeIsHovered,\n        GetSequencer());\n}\n\nvoid FFMODEventParameterTrackEditor::BuildObjectBindingTrackMenu(FMenuBuilder &MenuBuilder, const FGuid &ObjectBinding, const UClass *ObjectClass)\n{\n    if (ObjectClass->IsChildOf(AFMODAmbientSound::StaticClass()) || ObjectClass->IsChildOf(UFMODAudioComponent::StaticClass()))\n    {\n        const TSharedPtr<ISequencer> ParentSequencer = GetSequencer();\n\n        MenuBuilder.AddMenuEntry(LOCTEXT(\"AddFMODParameterTrack\", \"FMOD Event Parameter Track\"),\n            LOCTEXT(\"AddFMODParameterTrackTooltip\", \"Adds a track for controlling FMOD event parameter values.\"), FSlateIcon(),\n            FUIAction(FExecuteAction::CreateSP(this, &FFMODEventParameterTrackEditor::AddEventParameterTrack, ObjectBinding),\n                FCanExecuteAction::CreateSP(this, &FFMODEventParameterTrackEditor::CanAddEventParameterTrack, ObjectBinding)));\n    }\n}\n\nbool FFMODEventParameterTrackEditor::SupportsType(TSubclassOf<UMovieSceneTrack> Type) const\n{\n    return Type == UFMODEventParameterTrack::StaticClass();\n}\n\nTSharedRef<SWidget> FFMODEventParameterTrackEditor::OnGetAddParameterMenuContent(FGuid ObjectBinding, UFMODEventParameterTrack *EventParameterTrack)\n{\n    TSharedPtr<ISequencer> SequencerPtr = GetSequencer();\n    AFMODAmbientSound *Sound = SequencerPtr.IsValid() ? Cast<AFMODAmbientSound>(SequencerPtr->FindSpawnedObjectOrTemplate(ObjectBinding)) : nullptr;\n    UFMODAudioComponent *AudioComponent;\n\n    if (IsValid(Sound))\n    {\n        AudioComponent = Sound->AudioComponent;\n    }\n    else\n    {\n        AudioComponent = SequencerPtr.IsValid() ? Cast<UFMODAudioComponent>(SequencerPtr->FindSpawnedObjectOrTemplate(ObjectBinding)) : nullptr;\n    }\n    return BuildParameterMenu(ObjectBinding, EventParameterTrack, AudioComponent);\n}\n\nTSharedRef<SWidget> FFMODEventParameterTrackEditor::BuildParameterMenu(\n    FGuid ObjectBinding, UFMODEventParameterTrack *EventParameterTrack, UFMODAudioComponent *AudioComponent)\n{\n    FMenuBuilder AddParameterMenuBuilder(true, nullptr);\n\n    if (IsValid(AudioComponent) && AudioComponent->Event.IsValid())\n    {\n        TArray<FParameterNameAndAction> ParameterNamesAndActions;\n        TArray<FMOD_STUDIO_PARAMETER_DESCRIPTION> ParameterDescriptions;\n        AudioComponent->Event->GetParameterDescriptions(ParameterDescriptions);\n\n        for (FMOD_STUDIO_PARAMETER_DESCRIPTION &ParameterDescription : ParameterDescriptions)\n        {\n            FName ParameterName(ParameterDescription.name);\n            FExecuteAction InitAction =\n                FExecuteAction::CreateSP(this, &FFMODEventParameterTrackEditor::AddParameter, ObjectBinding, EventParameterTrack, ParameterName);\n            FUIAction AddParameterMenuAction(InitAction);\n            FParameterNameAndAction NameAndAction(ParameterName, AddParameterMenuAction);\n            ParameterNamesAndActions.Add(NameAndAction);\n        }\n\n        // Sort and generate menu.\n        ParameterNamesAndActions.Sort();\n        for (FParameterNameAndAction NameAndAction : ParameterNamesAndActions)\n        {\n            AddParameterMenuBuilder.AddMenuEntry(FText::FromName(NameAndAction.ParameterName), FText(), FSlateIcon(), NameAndAction.Action);\n        }\n    }\n    return AddParameterMenuBuilder.MakeWidget();\n}\n\nbool FFMODEventParameterTrackEditor::CanAddEventParameterTrack(FGuid ObjectBinding)\n{\n    return GetSequencer()->GetFocusedMovieSceneSequence()->GetMovieScene()->FindTrack(\n               UFMODEventParameterTrack::StaticClass(), ObjectBinding, TrackName) == nullptr;\n}\n\nvoid FFMODEventParameterTrackEditor::AddEventParameterTrack(FGuid ObjectBinding)\n{\n    FindOrCreateTrackForObject(ObjectBinding, UFMODEventParameterTrack::StaticClass(), TrackName, true);\n    GetSequencer()->NotifyMovieSceneDataChanged(EMovieSceneDataChangeType::MovieSceneStructureItemAdded);\n}\n\nvoid FFMODEventParameterTrackEditor::AddParameter(FGuid ObjectBinding, UFMODEventParameterTrack *EventParameterTrack, FName ParameterName)\n{\n    UMovieSceneSequence *MovieSceneSequence = GetMovieSceneSequence();\n    FFrameNumber KeyTime = GetTimeForKey();\n\n    for (TWeakObjectPtr<> Object : GetSequencer()->FindObjectsInCurrentSequence(ObjectBinding))\n    {\n        AFMODAmbientSound *Sound = Cast<AFMODAmbientSound>(Object.Get());\n        UFMODAudioComponent *AudioComponent = nullptr;\n\n        if (IsValid(Sound))\n        {\n            AudioComponent = Sound->AudioComponent;\n        }\n        else\n        {\n            AudioComponent = Cast<UFMODAudioComponent>(Object.Get());\n        }\n\n        if (IsValid(AudioComponent))\n        {\n            float Value = AudioComponent->GetParameter(ParameterName);\n            const FScopedTransaction Transaction(LOCTEXT(\"AddEventParameter\", \"Add event parameter\"));\n            EventParameterTrack->Modify();\n            EventParameterTrack->AddParameterKey(ParameterName, KeyTime, Value);\n        }\n    }\n    GetSequencer()->NotifyMovieSceneDataChanged(EMovieSceneDataChangeType::MovieSceneStructureItemAdded);\n}\n\n#undef LOCTEXT_NAMESPACE\n"
  },
  {
    "path": "Plugins/FMODStudio/Source/FMODStudioEditor/Private/Sequencer/FMODEventParameterTrackEditor.h",
    "content": "// Taken from ParticleParameterTrackEditor\n\n#pragma once\n#include \"CoreMinimal.h\"\n#include \"Misc/Guid.h\"\n#include \"Templates/SubclassOf.h\"\n#include \"Widgets/SWidget.h\"\n#include \"ISequencer.h\"\n#include \"MovieSceneTrack.h\"\n#include \"ISequencerSection.h\"\n#include \"Framework/Commands/UIAction.h\"\n#include \"ISequencerTrackEditor.h\"\n#include \"MovieSceneTrackEditor.h\"\n\nclass FMenuBuilder;\nclass UFMODEventParameterTrack;\nclass UFMODAudioComponent;\nstruct FMOD_STUDIO_PARAMETER_DESCRIPTION;\n\n/**\n * Track editor for material parameters.\n */\nclass FFMODEventParameterTrackEditor : public FMovieSceneTrackEditor\n{\npublic:\n    /** Constructor. */\n    FFMODEventParameterTrackEditor(TSharedRef<ISequencer> InSequencer);\n\n    /** Virtual destructor. */\n    virtual ~FFMODEventParameterTrackEditor() {}\n\n    /**\n    * Creates an instance of this class.  Called by a sequencer.\n    *\n    * @param OwningSequencer The sequencer instance to be used by this tool.\n    * @return The new instance of this class.\n    */\n    static TSharedRef<ISequencerTrackEditor> CreateTrackEditor(TSharedRef<ISequencer> OwningSequencer);\n\n    // ISequencerTrackEditor interface\n\n    virtual TSharedPtr<SWidget> BuildOutlinerEditWidget(\n        const FGuid &ObjectBinding, UMovieSceneTrack *Track, const FBuildEditWidgetParams &Params) override;\n    virtual TSharedRef<ISequencerSection> MakeSectionInterface(\n        UMovieSceneSection &SectionObject, UMovieSceneTrack &Track, FGuid ObjectBinding) override;\n    virtual bool SupportsType(TSubclassOf<UMovieSceneTrack> Type) const override;\n\nprivate:\n    static FName TrackName;\n\n    // Struct used for building the parameter menu.\n    struct FParameterNameAndAction\n    {\n        FName ParameterName;\n        FUIAction Action;\n\n        FParameterNameAndAction(FName InParameterName, FUIAction InAction)\n        {\n            ParameterName = InParameterName;\n            Action = InAction;\n        }\n\n        bool operator<(FParameterNameAndAction const &Other) const { return ParameterName < Other.ParameterName; }\n    };\n\n    void BuildObjectBindingTrackMenu(FMenuBuilder &MenuBuilder, const FGuid &ObjectBinding, const UClass *ObjectClass);\n\n    /** Provides the contents of the add parameter menu. */\n    TSharedRef<SWidget> OnGetAddParameterMenuContent(FGuid ObjectBinding, UFMODEventParameterTrack *EventParameterTrack);\n    TSharedRef<SWidget> BuildParameterMenu(FGuid ObjectBinding, UFMODEventParameterTrack *EventParameterTrack, UFMODAudioComponent *AudioComponent);\n\n    bool CanAddEventParameterTrack(FGuid ObjectBinding);\n    void AddEventParameterTrack(FGuid ObjectBinding);\n\n    /** Adds an event parameter and initial key to a track. */\n    void AddParameter(FGuid ObjectBinding, UFMODEventParameterTrack *EventParameterTrack, FName ParameterName);\n};\n"
  },
  {
    "path": "Plugins/FMODStudio/Source/FMODStudioEditor/Private/Sequencer/FMODParameterSection.cpp",
    "content": "// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2020.\n\n#include \"FMODParameterSection.h\"\n#include \"ISectionLayoutBuilder.h\"\n#include \"ScopedTransaction.h\"\n#include \"Sections/MovieSceneParameterSection.h\"\n\n#define LOCTEXT_NAMESPACE \"FMODParameterSection\"\n\nbool FFMODParameterSection::RequestDeleteKeyArea(const TArray<FName> &KeyAreaNamePath)\n{\n    if (KeyAreaNamePath.Num() == 1)\n    {\n        const FScopedTransaction Transaction(LOCTEXT(\"DeleteEventParameter\", \"Delete event parameter\"));\n        UMovieSceneParameterSection *ParameterSection = Cast<UMovieSceneParameterSection>(WeakSection.Get());\n        if (ParameterSection->TryModify())\n        {\n            return ParameterSection->RemoveScalarParameter(KeyAreaNamePath[0]);\n        }\n    }\n\n    return true;\n}\n\n#undef LOCTEXT_NAMESPACE\n"
  },
  {
    "path": "Plugins/FMODStudio/Source/FMODStudioEditor/Private/Sequencer/FMODParameterSection.h",
    "content": "// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2020.\n\n#pragma once\n\n#include \"ISequencerSection.h\"\n\nclass UMovieSceneSection;\n\n/** A movie scene section for Event parameters. */\nclass FFMODParameterSection : public FSequencerSection\n{\npublic:\n    FFMODParameterSection(UMovieSceneSection &InSectionObject)\n        : FSequencerSection(InSectionObject)\n    {\n    }\n\n    // Begin ISequencerSection interface\n    virtual bool RequestDeleteKeyArea(const TArray<FName> &KeyAreaNamePath) override;\n    // End ISequencerSection interface\n};"
  },
  {
    "path": "Plugins/FMODStudio/Source/FMODStudioEditor/Public/FMODStudioEditorModule.h",
    "content": "// Copyright (c), Firelight Technologies Pty, Ltd. 2012-2020.\n\n#pragma once\n\n#include \"Modules/ModuleManager.h\"\n\n/**\n * The public interface to this module\n */\nclass IFMODStudioEditorModule : public IModuleInterface\n{\n\npublic:\n    /**\n\t * Singleton-like access to this module's interface.  This is just for convenience!\n\t * Beware of calling this during the shutdown phase, though.  Your module might have been unloaded already.\n\t *\n\t * @return Returns singleton instance, loading the module on demand if needed\n\t */\n    static inline IFMODStudioEditorModule &Get() { return FModuleManager::LoadModuleChecked<IFMODStudioEditorModule>(\"FMODStudioEditor\"); }\n\n    /**\n\t * Checks to see if this module is loaded and ready.  It is only valid to call Get() if IsAvailable() returns true.\n\t *\n\t * @return True if the module is loaded and ready to use\n\t */\n    static inline bool IsAvailable() { return FModuleManager::Get().IsModuleLoaded(\"FMODStudioEditor\"); }\n};\n"
  },
  {
    "path": "Plugins/GameAnalytics/.gitignore",
    "content": "!Source/ThirdParty/lib/linux/libGameAnalytics.a\n!Source/ThirdParty/lib/win32/GameAnalytics.lib\n!Source/ThirdParty/lib/win64/GameAnalytics.lib\nBinaries/\nIntermediate/"
  },
  {
    "path": "Plugins/GameAnalytics/Config/FilterPlugin.ini",
    "content": "[FilterPlugin]\n/Build/..."
  },
  {
    "path": "Plugins/GameAnalytics/GameAnalytics.uplugin",
    "content": "{\n    \"FileVersion\" : 3,\n\n    \"FriendlyName\" : \"GameAnalytics\",\n    \"Version\" : 1,\n    \"VersionName\" : \"3.0.3\",\n    \"CreatedBy\" : \"GameAnalytics\",\n    \"CreatedByURL\" : \"http://gameanalytics.com\",\n    \"EngineVersion\" : \"4.22.0\",\n    \"MarketplaceURL\" : \"com.epicgames.launcher://ue/marketplace/content/d070c3fab7b74c08bab3a89c9cbf4490\",\n    \"Description\" : \"GameAnalytics is a free analytics platform that helps game developers understand their players' behaviour by delivering relevant insights.\",\n    \"Category\" : \"Analytics\",\n\t\"EnabledByDefault\": false,\n    \"Modules\" :\n    [\n        {\n            \"Name\" : \"GameAnalytics\",\n            \"Type\" : \"Runtime\",\n            \"LoadingPhase\" : \"PreDefault\",\n            \"WhitelistPlatforms\" : [ \"Android\", \"IOS\", \"Mac\", \"Win32\", \"Win64\", \"HTML5\", \"Linux\" ]\n        },\n        {\n            \"Name\" : \"GameAnalyticsEditor\",\n            \"Type\" : \"Developer\",\n            \"LoadingPhase\" : \"PreDefault\"\n        }\n    ]\n}\n"
  },
  {
    "path": "Plugins/GameAnalytics/README.md",
    "content": "# GameAnalytics\n\nModified CPP SDK: https://github.com/vampy/GA-SDK-CPP\n\nModified UNREAL SDK: https://github.com/vampy/GA-SDK-UNREAL\n\n\nCopied manually from https://github.com/GameAnalytics/GA-SDK-UNREAL\nbecause it is the latest version and also on linux we do not have a marketplace.\n\n## Documentation\n1. https://gameanalytics.com/docs/unreal4-sdk\n2. https://gameanalytics.com/docs/\n\n\n## Build\n\nNOTE: use the modified CPP SDK, otherwise the build/link will fail.\n\nWindows:\n```sh\n./build.sh -n -t win64-vc140-static\n./build.sh -n -t win32-vc140-static\n\nOR\n\n./build_win_py2.sh -n -t win64-vc140-static\n./build_win_py2.sh -n -t win32-vc140-static\n```\n\nLinux:\n```sh\n./build.sh -n -t linux-x64-clang-static\n```\n"
  },
  {
    "path": "Plugins/GameAnalytics/Source/GameAnalytics/GA-SDK-CPP/GADevice.h",
    "content": "//\n// GA-SDK-CPP\n// Copyright 2018 GameAnalytics C++ SDK. All rights reserved.\n//\n\n#pragma once\n\n#include <string>\n\nnamespace gameanalytics\n{\n    namespace device\n    {\n        class GADevice\n        {\n        public:\n            static void setSdkGameEngineVersion(const std::string& sdkGameEngineVersion);\n            static const std::string getGameEngineVersion();\n            static void setGameEngineVersion(const std::string& gameEngineVersion);\n            static void setConnectionType(const std::string& connectionType);\n            static const std::string getConnectionType();\n            static const std::string getRelevantSdkVersion();\n            static const std::string getBuildPlatform();\n            static const std::string getOSVersion();\n            static void setDeviceModel(const std::string& deviceModel);\n            static const std::string getDeviceModel();\n            static void setDeviceManufacturer(const std::string& deviceManufacturer);\n            static const std::string getDeviceManufacturer();\n            static void setWritablePath(const std::string& writablePath);\n            static const std::string getWritablePath();\n            static void UpdateConnectionType();\n        };\n    }\n}\n"
  },
  {
    "path": "Plugins/GameAnalytics/Source/GameAnalytics/GA-SDK-CPP/GAEvents.h",
    "content": "//\n// GA-SDK-CPP\n// Copyright 2018 GameAnalytics C++ SDK. All rights reserved.\n//\n\n#pragma once\n\n#include <string>\n#include \"Foundation/GASingleton.h\"\n#include \"GameAnalytics.h\"\n\nnamespace gameanalytics\n{\n    namespace events\n    {\n        class GAEvents : public GASingleton<GAEvents>\n        {\n         public:\n            GAEvents();\n\n            static void stopEventQueue();\n            static void ensureEventQueueIsRunning();\n            static void addSessionStartEvent();\n            static void addSessionEndEvent();\n\n            static double GetEventsPollIntervalSeconds();\n            static void SetEventsPollIntervalSeconds(double NewInterval);\n        };\n    }\n}\n"
  },
  {
    "path": "Plugins/GameAnalytics/Source/GameAnalytics/GA-SDK-CPP/GALogger.h",
    "content": "//\n// GA-SDK-CPP\n// Copyright 2018 GameAnalytics C++ SDK. All rights reserved.\n//\n\n#pragma once\n\n#include \"Foundation/GASingleton.h\"\n#include <string>\n#include <memory>\n\n\nnamespace gameanalytics\n{\n    namespace logging\n    {\n        enum EGALoggerMessageType\n        {\n            Error = 0,\n            Warning = 1,\n            Info = 2,\n            Debug = 3\n        };\n\n        class GALogger : public GASingleton<GALogger>\n        {\n         public:\n            GALogger();\n\n            // set debug enabled (client)\n            static void setInfoLog(bool enabled);\n            static void setVerboseInfoLog(bool enabled);\n\n            // Debug (w/e always shows, d only shows during SDK development, i shows when client has set debugEnabled to YES)\n            static void  w(const std::string& format);//const char* format, ...);\n            static void  e(const std::string& format);//const char* format, ...);\n            static void  d(const std::string& format);//const char* format, ...);\n            static void  i(const std::string& format);//const char* format, ...);\n            static void ii(const std::string& format);//const char* format, ...);\n\n            void sendNotificationMessage(const std::string& message, EGALoggerMessageType type);\n\n            static void customInitializeLog();\n            static void addCustomLogStream(std::ostream& os);\n        };\n    }\n}\n"
  },
  {
    "path": "Plugins/GameAnalytics/Source/GameAnalytics/GA-SDK-CPP/GAState.h",
    "content": "//\n// GA-SDK-CPP\n// Copyright 2018 GameAnalytics C++ SDK. All rights reserved.\n//\n\n#pragma once\n\n#include <vector>\n#include <string>\n#include <map>\n\n#include \"Foundation/GASingleton.h\"\n#include \"GameAnalytics.h\"\n\nnamespace gameanalytics\n{\n    namespace state\n    {\n        // TODO(nikolaj): needed? remove.. if not\n        // typedef void(*Callback) ();\n\n        class GAState : public GASingleton<GAState>\n        {\n         public:\n            static void setUserId(const std::string& id);\n            static const std::string getIdentifier();\n            static bool isInitialized();\n            static int getSessionNum();\n            static int getTransactionNum();\n            static const std::string getSessionId();\n            static const std::string getCurrentCustomDimension01();\n            static const std::string getCurrentCustomDimension02();\n            static const std::string getCurrentCustomDimension03();\n            static const std::string getGameKey();\n            static const std::string getGameSecret();\n            static void setAvailableCustomDimensions01(const std::vector<std::string>& dimensions);\n            static void setAvailableCustomDimensions02(const std::vector<std::string>& dimensions);\n            static void setAvailableCustomDimensions03(const std::vector<std::string>& dimensions);\n            static void setAvailableResourceCurrencies(const std::vector<std::string>& availableResourceCurrencies);\n            static void setAvailableResourceItemTypes(const std::vector<std::string>& availableResourceItemTypes);\n            static void setBuild(const std::string& build);\n            static bool isEnabled();\n            static void setCustomDimension01(const std::string& dimension);\n            static void setCustomDimension02(const std::string& dimension);\n            static void setCustomDimension03(const std::string& dimension);\n            static void setFacebookId(const std::string& facebookId);\n            static void incrementSessionNum();\n            static void incrementTransactionNum();\n            static void incrementProgressionTries(const std::string& progression);\n            static int getProgressionTries(const std::string& progression);\n            static void clearProgressionTries(const std::string& progression);\n            static bool hasAvailableCustomDimensions01(const std::string& dimension1);\n            static bool hasAvailableCustomDimensions02(const std::string& dimension2);\n            static bool hasAvailableCustomDimensions03(const std::string& dimension3);\n            static bool hasAvailableResourceCurrency(const std::string& currency);\n            static bool hasAvailableResourceItemType(const std::string& itemType);\n            static void endSessionAndStopQueue(bool endThread);\n            static void resumeSessionAndStartQueue();\n            static void internalInitialize();\n            static void setManualSessionHandling(bool flag);\n            static bool useManualSessionHandling();\n            static bool sessionIsStarted();\n        };\n    }\n}\n"
  },
  {
    "path": "Plugins/GameAnalytics/Source/GameAnalytics/GA-SDK-CPP/GAThreading.h",
    "content": "//\n// GA-SDK-CPP\n// Copyright 2018 GameAnalytics C++ SDK. All rights reserved.\n//\n\n#pragma once\n\n\n#include <functional>\n#include <vector>\n#include <chrono>\n#include <memory>\n\nnamespace gameanalytics\n{\n    namespace threading\n    {\n        class GAThreading\n        {\n         public:\n            typedef std::function<void()> Block;\n            static void performTaskOnGAThread(const Block& taskBlock);\n\n            // timers\n            static void endThread();\n\n            // Does this have any jobs left to process?\n            static bool HasJobs();\n\n            static bool IsThreadRunning();\n\n            static double GetThreadWaitSeconds();\n            static void SetThreadWaitSeconds(double NewInterval);\n        };\n    }\n}\n"
  },
  {
    "path": "Plugins/GameAnalytics/Source/GameAnalytics/GA-SDK-CPP/GameAnalytics.h",
    "content": "//\n// GA-SDK-CPP\n// Copyright 2015 CppWrapper. All rights reserved.\n//\n\n#pragma once\n\n#include <string>\n#include <vector>\n\n#if PLATFORM_LINUX\nusing STRING = const char*;\nusing RETURN_STRING = const char*;\n#else\nusing STRING = const std::string&;\nusing RETURN_STRING = std::string;\n#endif\n\nnamespace gameanalytics\n{\n\n    /*!\n     @enum\n     @discussion\n     This enum is used to specify flow in resource events\n     @constant GAResourceFlowTypeSource\n     Used when adding to a resource currency\n     @constant GAResourceFlowTypeSink\n     Used when subtracting from a resource currency\n     */\n    enum EGAResourceFlowType\n    {\n        Source = 1,\n        Sink = 2\n    };\n\n    /*!\n     @enum\n     @discussion\n     his enum is used to specify status for progression event\n     @constant GAProgressionStatusStart\n     User started progression\n     @constant GAProgressionStatusComplete\n     User succesfully ended a progression\n     @constant GAProgressionStatusFail\n     User failed a progression\n     */\n    enum EGAProgressionStatus\n    {\n        Start = 1,\n        Complete = 2,\n        Fail = 3\n    };\n\n    /*!\n     @enum\n     @discussion\n     his enum is used to specify severity of an error event\n     @constant GAErrorSeverityDebug\n     @constant GAErrorSeverityInfo\n     @constant GAErrorSeverityWarning\n     @constant GAErrorSeverityError\n     @constant GAErrorSeverityCritical\n     */\n    enum EGAErrorSeverity\n    {\n        Debug = 1,\n        Info = 2,\n        Warning = 3,\n        Error = 4,\n        Critical = 5\n    };\n\n    enum EGAGender\n    {\n        Male = 1,\n        Female = 2\n    };\n\n    class GameAnalytics\n    {\n     public:\n        // configure calls should be used before initialize\n        static void configureAvailableCustomDimensions01(const std::vector<std::string>& customDimensions);\n        static void configureAvailableCustomDimensions01(STRING customDimensions);\n        static void configureAvailableCustomDimensions02(const std::vector<std::string>& customDimensions);\n        static void configureAvailableCustomDimensions02(STRING customDimensions);\n        static void configureAvailableCustomDimensions03(const std::vector<std::string>& customDimensions);\n        static void configureAvailableCustomDimensions03(STRING customDimensions);\n        static void configureAvailableResourceCurrencies(const std::vector<std::string>& resourceCurrencies);\n        static void configureAvailableResourceCurrencies(STRING resourceCurrencies);\n        static void configureAvailableResourceItemTypes(const std::vector<std::string>& resourceItemTypes);\n        static void configureAvailableResourceItemTypes(STRING resourceCurrencies);\n        static void configureBuild(STRING build);\n        static void configureWritablePath(STRING writablePath);\n        static void configureDeviceModel(STRING deviceModel);\n        static void configureDeviceManufacturer(STRING deviceManufacturer);\n\n        // the version of SDK code used in an engine. Used for sdk_version field.\n        // !! if set then it will override the SdkWrapperVersion.\n        // example \"unity 4.6.9\"\n        static void configureSdkGameEngineVersion(STRING sdkGameEngineVersion);\n        // the version of the game engine (if used and version is available)\n        static void configureGameEngineVersion(STRING engineVersion);\n\n        static void configureUserId(STRING uId);\n\n        // initialize - starting SDK (need configuration before starting)\n        static void initialize(STRING gameKey, STRING gameSecret);\n\n        // add events\n        static void addBusinessEvent(STRING currency, int amount, STRING itemType, STRING itemId, STRING cartType);\n\n        static void addResourceEvent(EGAResourceFlowType flowType, STRING currency, float amount, STRING itemType, STRING itemId);\n\n        static void addProgressionEvent(EGAProgressionStatus progressionStatus, STRING progression01, STRING progression02, STRING progression03);\n\n        static void addProgressionEvent(EGAProgressionStatus progressionStatus, STRING progression01, STRING progression02, STRING progression03, int score);\n\n        static void addDesignEvent(STRING eventId);\n        static void addDesignEvent(STRING eventId, double value);\n        static void addErrorEvent(EGAErrorSeverity severity, STRING message);\n\n        // set calls can be changed at any time (pre- and post-initialize)\n        // some calls only work after a configure is called (setCustomDimension)\n        static void setEnabledInfoLog(bool flag);\n        static void setEnabledVerboseLog(bool flag);\n        static void setEnabledManualSessionHandling(bool flag);\n        static void setCustomDimension01(STRING dimension01);\n        static void setCustomDimension02(STRING dimension02);\n        static void setCustomDimension03(STRING dimension03);\n        static void setFacebookId(STRING facebookId);\n        static void setGender(EGAGender gender);\n        static void setBirthYear(int birthYear);\n\n        static void startSession();\n        static void endSession();\n\n        static RETURN_STRING getCommandCenterValueAsString(STRING key);\n        static RETURN_STRING getCommandCenterValueAsString(STRING key, STRING defaultValue);\n        static bool isCommandCenterReady();\n        static RETURN_STRING getConfigurationsContentAsString();\n\n        // game state changes\n        // will affect how session is started / ended\n        static void onResume();\n        static void onSuspend();\n        static void onQuit();\n\n     private:\n        static bool isSdkReady(bool needsInitialized);\n        static bool isSdkReady(bool needsInitialized, bool warn);\n        static bool isSdkReady(bool needsInitialized, bool warn, std::string message);\n    };\n} // namespace gameanalytics\n"
  },
  {
    "path": "Plugins/GameAnalytics/Source/GameAnalytics/GameAnalytics.Build.cs",
    "content": "using UnrealBuildTool;\nusing System.IO;\nusing System;\nusing Tools.DotNETCommon;\n\nnamespace UnrealBuildTool.Rules\n{\n    public class GameAnalytics : ModuleRules\n    {\n#if WITH_FORWARDED_MODULE_RULES_CTOR\n        public GameAnalytics(ReadOnlyTargetRules Target) : base(Target)\n#else\n        public GameAnalytics(TargetInfo Target)\n#endif\n        {\n            PCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs;\n\n            var GameAnalyticsPath = Path.GetFullPath(Path.Combine(ModuleDirectory, \"../ThirdParty/\" ));\n            var libPath = Path.Combine(GameAnalyticsPath, \"lib\");\n\n            // Test plugin analytics in editor mode\n            PublicDefinitions.Add(\"TEST_NON_EDITOR_PLUGIN_ANALYTICS_MODE=0\");\n\n            switch (Target.Platform)\n            {\n                case UnrealTargetPlatform.Win64:\n                    PublicAdditionalLibraries.Add(Path.Combine(libPath, \"win64\", \"GameAnalytics.lib\"));\n                    PrivateDependencyModuleNames.AddRange(new string[] {  \"OpenSSL\", \"libcurl\" });\n                    break;\n\n                case UnrealTargetPlatform.Win32:\n                    PublicAdditionalLibraries.Add(Path.Combine(libPath, \"win32\", \"GameAnalytics.lib\"));\n                    PrivateDependencyModuleNames.AddRange(new string[] {  \"OpenSSL\", \"libcurl\" });\n                    break;\n\n                case UnrealTargetPlatform.Android:\n                    PrivateDependencyModuleNames.Add(\"Launch\");\n                    PrivateIncludePaths.Add(Path.Combine(ModuleDirectory, \"Private/Android\"));\n                    break;\n\n                case UnrealTargetPlatform.Mac:\n                    PublicAdditionalLibraries.Add(Path.Combine(libPath, \"osx\", \"libGameAnalytics.a\"));\n                    PublicAdditionalLibraries.Add(\"curl\");\n                    PublicFrameworks.AddRange(\n                        new string[] {\n                            \"CoreFoundation\",\n                            \"Foundation\",\n                            \"CoreServices\"\n                        }\n                    );\n                    PrivateDependencyModuleNames.AddRange(new string[] { \"OpenSSL\" });\n                    break;\n\n                case UnrealTargetPlatform.Linux:\n                    LoadLibrary(Path.Combine(libPath, \"linux\"), \"libGameAnalytics.a\");\n                    //PublicAdditionalLibraries.Add(Path.Combine(libPath, \"linux\", \"libGameAnalytics.a\"));\n                    //RuntimeDependencies.Add(Path.Combine(libPath, \"linux\", \"libGameAnalytics.a\"));\n                    PrivateDependencyModuleNames.AddRange(new string[] { \"OpenSSL\", \"libcurl\" });\n                    break;\n\n                case UnrealTargetPlatform.IOS:\n                    PublicAdditionalLibraries.Add(Path.Combine(libPath, \"ios\", \"libGameAnalytics.a\"));\n                    PrivateIncludePaths.Add(Path.Combine(ModuleDirectory, \"Private/IOS\"));\n                    PublicFrameworks.AddRange(\n                        new string[] {\n                            \"AdSupport\",\n                            \"SystemConfiguration\"\n                        }\n                    );\n\n                    PublicAdditionalLibraries.AddRange(\n                        new string[] {\n                            \"sqlite3\",\n                            \"z\",\n                            \"c++\"\n                    });\n                    break;\n\n                case UnrealTargetPlatform.HTML5:\n                    if (Target.Architecture != \"-win32\")\n                    {\n                        PublicAdditionalLibraries.Add(Path.Combine(libPath, \"html5\", \"GameAnalytics.jspre\"));\n                        PublicAdditionalLibraries.Add(Path.Combine(libPath, \"html5\", \"GameAnalyticsUnreal.js\"));\n                    }\n                    break;\n\n                case UnrealTargetPlatform.XboxOne:\n                case UnrealTargetPlatform.PS4:\n                default:\n                    throw new NotImplementedException(\"This target platform is not configured for GameAnalytics SDK: \" + Target.Platform.ToString());\n            }\n\n            PublicDependencyModuleNames.AddRange(\n                new string[]\n                {\n                    \"Core\",\n                    \"CoreUObject\",\n                    \"Engine\",\n                    // ... add other public dependencies that you statically link with here ...\n                }\n            );\n\n            PrivateIncludePaths.Add(Path.GetFullPath(Path.Combine(ModuleDirectory, \"Private\")));\n            PrivateIncludePaths.Add(Path.GetFullPath(Path.Combine(ModuleDirectory, \"Public\")));\n            PublicIncludePaths.Add(Path.GetFullPath(Path.Combine(ModuleDirectory, \"Public\")));\n\n\n            PrivateDependencyModuleNames.AddRange(\n                new string[]\n                {\n                    \"Analytics\",\n                    \"Engine\"\n                }\n            );\n\n            if (Target.Platform == UnrealTargetPlatform.HTML5)\n            {\n                PrivateDependencyModuleNames.AddRange(\n                    new string[]\n                    {\n                        \"Json\"\n                    }\n                );\n\n                PublicIncludePathModuleNames.AddRange(\n                    new string[]\n                    {\n                        \"Json\"\n                    }\n                );\n            }\n\n            PublicIncludePathModuleNames.AddRange(\n                new string[]\n                {\n                    \"Analytics\",\n                    \"Engine\"\n                }\n            );\n\n            if (Target.Platform == UnrealTargetPlatform.Android)\n            {\n                AdditionalPropertiesForReceipt.Add(\"AndroidPlugin\", Path.Combine(ModuleDirectory, \"GameAnalytics_APL.xml\"));\n            }\n        }\n\n        // From https://github.com/shadowmint/ue4-static-plugin/blob/master/Source/TestPlugin/TestPlugin.Build.cs\n        /**\n         * Helper to setup an arbitrary library in the given library folder\n         * @param build_path Absolute build path, eg. /home/.../3rdparty/mylib/build\n         * @param library_name Short library name, eg. libmylib.a, mylib.lib, etc.\n         */\n        private void LoadLibrary(string build_path, string library_name)\n        {\n            // Get the build path\n            if (!Directory.Exists(build_path))\n            {\n                Fail(\"Invalid build path: \" + build_path + \" (Did you build the 3rdparty module already?)\");\n            }\n\n            string full_library_path = Path.Combine(build_path, library_name);\n            if (!File.Exists(full_library_path))\n            {\n                Fail(\"Unable to locate any build library: \" + full_library_path);\n            }\n\n            // Found a library; add it to the dependencies list\n            PublicAdditionalLibraries.Add(full_library_path);\n            Trace(\"Added static library: {0}\", full_library_path);\n        }\n\n        /**\n         * Print out a build message\n         * Why error? Well, the UE masks all other errors. *shrug*\n         */\n        private void Trace(string msg)\n        {\n            Log.TraceInformation(\"GameAnalytics: \" + msg);\n        }\n\n        /** Trace helper */\n        private void Trace(string format, params object[] args)\n        {\n            Trace(string.Format(format, args));\n        }\n\n        /** Raise an error */\n        private void Fail(string message)\n        {\n            Trace(message);\n            throw new Exception(message);\n        }\n    }\n}\n"
  },
  {
    "path": "Plugins/GameAnalytics/Source/GameAnalytics/GameAnalytics_APL.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--GameAnalytics plugin additions-->\n<root xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <!-- init section is always evaluated once per architecture -->\n    <init>\n        <log text=\"GameAnalitics init\"/>\n    </init>\n\n    <!-- optional additions to proguard -->\n    <proguardAdditions>\n        <insert>\n-keep class com.gameanalytics.sdk.** { *; }\n-keep class android.net.** { *; }\n-dontwarn android.net.**\n        </insert>\n    </proguardAdditions>\n\n    <!-- optional files or directories to copy to Intermediate/Android/APK -->\n    <resourceCopies>\n        <copyFile src=\"$S(PluginDir)/GA-SDK-ANDROID/lib/gameanalytics.jar\" dst=\"$S(BuildDir)/libs/gameanalytics.jar\" />\n    </resourceCopies>\n\n    <!-- optional updates applied to AndroidManifest.xml -->\n    <androidManifestUpdates>\n        <addPermission android:name=\"android.permission.INTERNET\"/>\n        <addPermission android:name=\"android.permission.ACCESS_NETWORK_STATE\"/>\n        <addPermission android:name=\"android.permission.READ_EXTERNAL_STORAGE\"/>\n    </androidManifestUpdates>\n</root>\n"
  },
  {
    "path": "Plugins/GameAnalytics/Source/GameAnalytics/Private/GameAnalytics.cpp",
    "content": "#include \"GameAnalytics.h\"\n#include \"UEGameAnalytics.h\"\n\n#if PLATFORM_IOS\n#include \"../GA-SDK-IOS/GameAnalyticsCpp.h\"\n#elif PLATFORM_ANDROID\n#include \"../GA-SDK-ANDROID/GameAnalyticsJNI.h\"\n#elif PLATFORM_MAC || PLATFORM_WINDOWS || PLATFORM_LINUX\n#if PLATFORM_LINUX\n#include \"Json.h\"\n#endif\n#include \"../GA-SDK-CPP/GameAnalytics.h\"\n#include \"../GA-SDK-CPP/GAState.h\"\n#include \"../GA-SDK-CPP/GAThreading.h\"\n#include \"../GA-SDK-CPP/GALogger.h\"\n#include \"../GA-SDK-CPP/GADevice.h\"\n#include \"../GA-SDK-CPP/GAEvents.h\"\n#include \"Dom/JsonValue.h\"\n#include \"Serialization/JsonSerializer.h\"\n#elif PLATFORM_HTML5\n#include \"Json.h\"\n#include \"../GA-SDK-HTML5/GameAnalytics.h\"\n#endif\n\nUGameAnalytics::UGameAnalytics(const FObjectInitializer& ObjectInitializer) : Super(ObjectInitializer)\n{\n}\n\nvoid UGameAnalytics::configureAvailableCustomDimensions01(const std::vector<std::string>& list)\n{\n#if WITH_EDITOR && !TEST_NON_EDITOR_PLUGIN_ANALYTICS_MODE\n\t// Empty\n#elif PLATFORM_IOS\n    GameAnalyticsCpp::configureAvailableCustomDimensions01(list);\n#elif PLATFORM_ANDROID\n    gameanalytics::jni_configureAvailableCustomDimensions01(list);\n#elif PLATFORM_LINUX\n    TArray<TSharedPtr<FJsonValue>> array;\n    for (std::string s : list)\n    {\n        TSharedRef<FJsonValueString> JsonValueString = MakeShareable(new FJsonValueString(ANSI_TO_TCHAR(s.c_str())));\n        array.Add(JsonValueString);\n    }\n    FString arrayString;\n    TSharedRef<TJsonWriter<>> Writer = TJsonWriterFactory<>::Create(&arrayString);\n    FJsonSerializer::Serialize(array, Writer);\n    gameanalytics::GameAnalytics::configureAvailableCustomDimensions01(TCHAR_TO_ANSI(*arrayString));\n#elif PLATFORM_MAC || PLATFORM_WINDOWS\n    gameanalytics::GameAnalytics::configureAvailableCustomDimensions01(list);\n#elif PLATFORM_HTML5\n    TArray<TSharedPtr<FJsonValue>> array;\n    for (std::string s : list)\n    {\n        TSharedRef<FJsonValueString> JsonValueString = MakeShareable(new FJsonValueString(ANSI_TO_TCHAR(s.c_str())));\n        array.Add(JsonValueString);\n    }\n    FString arrayString;\n    TSharedRef<TJsonWriter<>> Writer = TJsonWriterFactory<>::Create(&arrayString);\n    FJsonSerializer::Serialize(array, Writer);\n    js_configureAvailableCustomDimensions01(TCHAR_TO_ANSI(*arrayString));\n#endif\n}\n\nvoid UGameAnalytics::configureAvailableCustomDimensions02(const std::vector<std::string>& list)\n{\n#if WITH_EDITOR && !TEST_NON_EDITOR_PLUGIN_ANALYTICS_MODE\n\t// Empty\n#elif PLATFORM_IOS\n    GameAnalyticsCpp::configureAvailableCustomDimensions02(list);\n#elif PLATFORM_ANDROID\n    gameanalytics::jni_configureAvailableCustomDimensions02(list);\n#elif PLATFORM_LINUX\n    TArray<TSharedPtr<FJsonValue>> array;\n    for (std::string s : list)\n    {\n        TSharedRef<FJsonValueString> JsonValueString = MakeShareable(new FJsonValueString(ANSI_TO_TCHAR(s.c_str())));\n        array.Add(JsonValueString);\n    }\n    FString arrayString;\n    TSharedRef<TJsonWriter<>> Writer = TJsonWriterFactory<>::Create(&arrayString);\n    FJsonSerializer::Serialize(array, Writer);\n    gameanalytics::GameAnalytics::configureAvailableCustomDimensions02(TCHAR_TO_ANSI(*arrayString));\n#elif PLATFORM_MAC || PLATFORM_WINDOWS\n    gameanalytics::GameAnalytics::configureAvailableCustomDimensions02(list);\n#elif PLATFORM_HTML5\n    TArray<TSharedPtr<FJsonValue>> array;\n    for (std::string s : list)\n    {\n        TSharedRef<FJsonValueString> JsonValueString = MakeShareable(new FJsonValueString(ANSI_TO_TCHAR(s.c_str())));\n        array.Add(JsonValueString);\n    }\n    FString arrayString;\n    TSharedRef<TJsonWriter<>> Writer = TJsonWriterFactory<>::Create(&arrayString);\n    FJsonSerializer::Serialize(array, Writer);\n    js_configureAvailableCustomDimensions02(TCHAR_TO_ANSI(*arrayString));\n#endif\n}\n\nvoid UGameAnalytics::configureAvailableCustomDimensions03(const std::vector<std::string>& list)\n{\n#if WITH_EDITOR && !TEST_NON_EDITOR_PLUGIN_ANALYTICS_MODE\n\t// Empty\n#elif PLATFORM_IOS\n    GameAnalyticsCpp::configureAvailableCustomDimensions03(list);\n#elif PLATFORM_ANDROID\n    gameanalytics::jni_configureAvailableCustomDimensions03(list);\n#elif PLATFORM_LINUX\n    TArray<TSharedPtr<FJsonValue>> array;\n    for (std::string s : list)\n    {\n        TSharedRef<FJsonValueString> JsonValueString = MakeShareable(new FJsonValueString(ANSI_TO_TCHAR(s.c_str())));\n        array.Add(JsonValueString);\n    }\n    FString arrayString;\n    TSharedRef<TJsonWriter<>> Writer = TJsonWriterFactory<>::Create(&arrayString);\n    FJsonSerializer::Serialize(array, Writer);\n    gameanalytics::GameAnalytics::configureAvailableCustomDimensions03(TCHAR_TO_ANSI(*arrayString));\n#elif PLATFORM_MAC || PLATFORM_WINDOWS\n    gameanalytics::GameAnalytics::configureAvailableCustomDimensions03(list);\n#elif PLATFORM_HTML5\n    TArray<TSharedPtr<FJsonValue>> array;\n    for (std::string s : list)\n    {\n        TSharedRef<FJsonValueString> JsonValueString = MakeShareable(new FJsonValueString(ANSI_TO_TCHAR(s.c_str())));\n        array.Add(JsonValueString);\n    }\n    FString arrayString;\n    TSharedRef<TJsonWriter<>> Writer = TJsonWriterFactory<>::Create(&arrayString);\n    FJsonSerializer::Serialize(array, Writer);\n    js_configureAvailableCustomDimensions03(TCHAR_TO_ANSI(*arrayString));\n#endif\n}\n\nvoid UGameAnalytics::configureAvailableResourceCurrencies(const std::vector<std::string>& list)\n{\n#if WITH_EDITOR && !TEST_NON_EDITOR_PLUGIN_ANALYTICS_MODE\n\t// Empty\n#elif PLATFORM_IOS\n    GameAnalyticsCpp::configureAvailableResourceCurrencies(list);\n#elif PLATFORM_ANDROID\n    gameanalytics::jni_configureAvailableResourceCurrencies(list);\n#elif PLATFORM_LINUX\n    TArray<TSharedPtr<FJsonValue>> array;\n    for (std::string s : list)\n    {\n        TSharedRef<FJsonValueString> JsonValueString = MakeShareable(new FJsonValueString(ANSI_TO_TCHAR(s.c_str())));\n        array.Add(JsonValueString);\n    }\n    FString arrayString;\n    TSharedRef<TJsonWriter<>> Writer = TJsonWriterFactory<>::Create(&arrayString);\n    FJsonSerializer::Serialize(array, Writer);\n    gameanalytics::GameAnalytics::configureAvailableResourceCurrencies(TCHAR_TO_ANSI(*arrayString));\n#elif PLATFORM_MAC || PLATFORM_WINDOWS\n    gameanalytics::GameAnalytics::configureAvailableResourceCurrencies(list);\n#elif PLATFORM_HTML5\n    TArray<TSharedPtr<FJsonValue>> array;\n    for (std::string s : list)\n    {\n        TSharedRef<FJsonValueString> JsonValueString = MakeShareable(new FJsonValueString(ANSI_TO_TCHAR(s.c_str())));\n        array.Add(JsonValueString);\n    }\n    FString arrayString;\n    TSharedRef<TJsonWriter<>> Writer = TJsonWriterFactory<>::Create(&arrayString);\n    FJsonSerializer::Serialize(array, Writer);\n    js_configureAvailableResourceCurrencies(TCHAR_TO_ANSI(*arrayString));\n#endif\n}\n\nvoid UGameAnalytics::configureAvailableResourceItemTypes(const std::vector<std::string>& list)\n{\n#if WITH_EDITOR && !TEST_NON_EDITOR_PLUGIN_ANALYTICS_MODE\n\t// Empty\n#elif PLATFORM_IOS\n    GameAnalyticsCpp::configureAvailableResourceItemTypes(list);\n#elif PLATFORM_ANDROID\n    gameanalytics::jni_configureAvailableResourceItemTypes(list);\n#elif PLATFORM_LINUX\n    TArray<TSharedPtr<FJsonValue>> array;\n    for (std::string s : list)\n    {\n        TSharedRef<FJsonValueString> JsonValueString = MakeShareable(new FJsonValueString(ANSI_TO_TCHAR(s.c_str())));\n        array.Add(JsonValueString);\n    }\n    FString arrayString;\n    TSharedRef<TJsonWriter<>> Writer = TJsonWriterFactory<>::Create(&arrayString);\n    FJsonSerializer::Serialize(array, Writer);\n    gameanalytics::GameAnalytics::configureAvailableResourceItemTypes(TCHAR_TO_ANSI(*arrayString));\n#elif PLATFORM_MAC || PLATFORM_WINDOWS\n    gameanalytics::GameAnalytics::configureAvailableResourceItemTypes(list);\n#elif PLATFORM_HTML5\n    TArray<TSharedPtr<FJsonValue>> array;\n    for (std::string s : list)\n    {\n        TSharedRef<FJsonValueString> JsonValueString = MakeShareable(new FJsonValueString(ANSI_TO_TCHAR(s.c_str())));\n        array.Add(JsonValueString);\n    }\n    FString arrayString;\n    TSharedRef<TJsonWriter<>> Writer = TJsonWriterFactory<>::Create(&arrayString);\n    FJsonSerializer::Serialize(array, Writer);\n    js_configureAvailableResourceItemTypes(TCHAR_TO_ANSI(*arrayString));\n#endif\n}\n\nvoid UGameAnalytics::configureBuild(const char *build)\n{\n#if WITH_EDITOR && !TEST_NON_EDITOR_PLUGIN_ANALYTICS_MODE\n\t// Empty\n#elif PLATFORM_IOS\n    GameAnalyticsCpp::configureBuild(build);\n#elif PLATFORM_ANDROID\n    gameanalytics::jni_configureBuild(build);\n#elif PLATFORM_MAC || PLATFORM_WINDOWS || PLATFORM_LINUX\n    gameanalytics::GameAnalytics::configureBuild(build);\n#elif PLATFORM_HTML5\n    js_configureBuild(build);\n#endif\n}\n\nvoid UGameAnalytics::configureUserId(const char *userId)\n{\n#if WITH_EDITOR && !TEST_NON_EDITOR_PLUGIN_ANALYTICS_MODE\n\t// Empty\n#elif PLATFORM_IOS\n    GameAnalyticsCpp::configureUserId(userId);\n#elif PLATFORM_ANDROID\n    gameanalytics::jni_configureUserId(userId);\n#elif PLATFORM_MAC || PLATFORM_WINDOWS || PLATFORM_LINUX\n    gameanalytics::GameAnalytics::configureUserId(userId);\n#elif PLATFORM_HTML5\n    js_configureUserId(userId);\n#endif\n}\n\nvoid UGameAnalytics::configureSdkGameEngineVersion(const char *gameEngineSdkVersion)\n{\n#if WITH_EDITOR && !TEST_NON_EDITOR_PLUGIN_ANALYTICS_MODE\n\t// Empty\n#elif PLATFORM_IOS\n    GameAnalyticsCpp::configureSdkGameEngineVersion(gameEngineSdkVersion);\n#elif PLATFORM_ANDROID\n    gameanalytics::jni_configureSdkGameEngineVersion(gameEngineSdkVersion);\n#elif PLATFORM_MAC || PLATFORM_WINDOWS || PLATFORM_LINUX\n    gameanalytics::GameAnalytics::configureSdkGameEngineVersion(gameEngineSdkVersion);\n#elif PLATFORM_HTML5\n    js_configureSdkGameEngineVersion(gameEngineSdkVersion);\n#endif\n}\n\nvoid UGameAnalytics::configureGameEngineVersion(const char *gameEngineVersion)\n{\n#if WITH_EDITOR && !TEST_NON_EDITOR_PLUGIN_ANALYTICS_MODE\n\t// Empty\n#elif PLATFORM_IOS\n    GameAnalyticsCpp::configureGameEngineVersion(gameEngineVersion);\n#elif PLATFORM_ANDROID\n    gameanalytics::jni_configureGameEngineVersion(gameEngineVersion);\n#elif PLATFORM_MAC || PLATFORM_WINDOWS || PLATFORM_LINUX\n    gameanalytics::GameAnalytics::configureGameEngineVersion(gameEngineVersion);\n#elif PLATFORM_HTML5\n    js_configureGameEngineVersion(gameEngineVersion);\n#endif\n}\n\nvoid UGameAnalytics::configureWritablePath(const char *writablePath)\n{\n#if WITH_EDITOR && !TEST_NON_EDITOR_PLUGIN_ANALYTICS_MODE\n\t// Empty\n#else\n\tgameanalytics::GameAnalytics::configureWritablePath(writablePath);\n#endif\n}\n\nvoid UGameAnalytics::initialize(const char *gameKey, const char *gameSecret)\n{\n#if WITH_EDITOR && !TEST_NON_EDITOR_PLUGIN_ANALYTICS_MODE\n\t// Empty\n#elif PLATFORM_IOS\n    GameAnalyticsCpp::initialize(gameKey, gameSecret);\n#elif PLATFORM_ANDROID\n    gameanalytics::jni_initialize(gameKey, gameSecret);\n#elif PLATFORM_MAC || PLATFORM_WINDOWS || PLATFORM_LINUX\n    gameanalytics::GameAnalytics::initialize(gameKey, gameSecret);\n#elif PLATFORM_HTML5\n    js_initialize(gameKey, gameSecret);\n#endif\n}\n\n#if PLATFORM_IOS\nvoid UGameAnalytics::addBusinessEvent(const char *currency, int amount, const char *itemType, const char *itemId, const char *cartType, const char *receipt)\n{\n#if !WITH_EDITOR\n    GameAnalyticsCpp::addBusinessEvent(currency, amount, itemType, itemId, cartType, receipt, \"\");\n#endif\n}\n\nvoid UGameAnalytics::addBusinessEventAndAutoFetchReceipt(const char *currency, int amount, const char *itemType, const char *itemId, const char *cartType)\n{\n#if !WITH_EDITOR || TEST_NON_EDITOR_PLUGIN_ANALYTICS_MODE\n    GameAnalyticsCpp::addBusinessEventAndAutoFetchReceipt(currency, amount, itemType, itemId, cartType, \"\");\n#endif\n}\n#elif PLATFORM_ANDROID\nvoid UGameAnalytics::addBusinessEvent(const char *currency, int amount, const char *itemType, const char *itemId, const char *cartType, const char *receipt, const char *signature)\n{\n#if !WITH_EDITOR || TEST_NON_EDITOR_PLUGIN_ANALYTICS_MODE\n    gameanalytics::jni_addBusinessEventWithReceipt(currency, amount, itemType, itemId, cartType, receipt, \"google_play\", signature, \"\");\n#endif\n}\n#endif\n\nvoid UGameAnalytics::addBusinessEvent(const char *currency, int amount, const char *itemType, const char *itemId, const char *cartType)\n{\n#if WITH_EDITOR && !TEST_NON_EDITOR_PLUGIN_ANALYTICS_MODE\n\t// Empty\n#elif PLATFORM_IOS\n    GameAnalyticsCpp::addBusinessEvent(currency, amount, itemType, itemId, cartType, NULL, \"\");\n#elif PLATFORM_ANDROID\n    gameanalytics::jni_addBusinessEvent(currency, amount, itemType, itemId, cartType, \"\");\n#elif PLATFORM_MAC || PLATFORM_WINDOWS || PLATFORM_LINUX\n    gameanalytics::GameAnalytics::addBusinessEvent(currency, amount, itemType, itemId, cartType/*, \"\"*/);\n#elif PLATFORM_HTML5\n    js_addBusinessEvent(currency, amount, itemType, itemId, cartType, \"\");\n#endif\n}\n\nvoid UGameAnalytics::addResourceEvent(EGAResourceFlowType flowType, const char *currency, float amount, const char *itemType, const char *itemId)\n{\n#if WITH_EDITOR && !TEST_NON_EDITOR_PLUGIN_ANALYTICS_MODE\n\t// Empty\n#elif PLATFORM_IOS\n    GameAnalyticsCpp::addResourceEvent((int)flowType, currency, amount, itemType, itemId, \"\");\n#elif PLATFORM_ANDROID\n    gameanalytics::jni_addResourceEvent((int)flowType, currency, amount, itemType, itemId, \"\");\n#elif PLATFORM_MAC || PLATFORM_WINDOWS || PLATFORM_LINUX\n    gameanalytics::GameAnalytics::addResourceEvent((gameanalytics::EGAResourceFlowType)((int)flowType), currency, amount, itemType, itemId/*, \"\"*/);\n#elif PLATFORM_HTML5\n    js_addResourceEvent((int)flowType, currency, amount, itemType, itemId, \"\");\n#endif\n}\n\nvoid UGameAnalytics::addProgressionEvent(EGAProgressionStatus progressionStatus, const char *progression01)\n{\n#if PLATFORM_IOS\n    addProgressionEvent(progressionStatus, progression01, (const char *)NULL, (const char *)NULL);\n#else\n    addProgressionEvent(progressionStatus, progression01, \"\", \"\");\n#endif\n}\n\nvoid UGameAnalytics::addProgressionEvent(EGAProgressionStatus progressionStatus, const char *progression01, int score)\n{\n#if PLATFORM_IOS\n    addProgressionEvent(progressionStatus, progression01, (const char *)NULL, (const char *)NULL, score);\n#else\n    addProgressionEvent(progressionStatus, progression01, \"\", \"\", score);\n#endif\n}\n\nvoid UGameAnalytics::addProgressionEvent(EGAProgressionStatus progressionStatus, const char *progression01, const char *progression02)\n{\n#if PLATFORM_IOS\n    addProgressionEvent(progressionStatus, progression01, progression02, (const char *)NULL);\n#else\n    addProgressionEvent(progressionStatus, progression01, progression02, \"\");\n#endif\n}\n\nvoid UGameAnalytics::addProgressionEvent(EGAProgressionStatus progressionStatus, const char *progression01, const char *progression02, int score)\n{\n#if PLATFORM_IOS\n    addProgressionEvent(progressionStatus, progression01, progression02, (const char *)NULL, score);\n#else\n    addProgressionEvent(progressionStatus, progression01, progression02, \"\", score);\n#endif\n}\n\nvoid UGameAnalytics::addProgressionEvent(EGAProgressionStatus progressionStatus, const char *progression01, const char *progression02, const char *progression03)\n{\n#if WITH_EDITOR && !TEST_NON_EDITOR_PLUGIN_ANALYTICS_MODE\n\t// Empty\n#elif PLATFORM_IOS\n    GameAnalyticsCpp::addProgressionEvent((int)progressionStatus, progression01, progression02, progression03, \"\");\n#elif PLATFORM_ANDROID\n    gameanalytics::jni_addProgressionEvent((int)progressionStatus, progression01, progression02, progression03, \"\");\n#elif PLATFORM_MAC || PLATFORM_WINDOWS || PLATFORM_LINUX\n    gameanalytics::GameAnalytics::addProgressionEvent((gameanalytics::EGAProgressionStatus)((int)progressionStatus), progression01, progression02, progression03/*, \"\"*/);\n#elif PLATFORM_HTML5\n    js_addProgressionEvent((int)progressionStatus, progression01, progression02, progression03, \"\");\n#endif\n}\n\nvoid UGameAnalytics::addProgressionEvent(EGAProgressionStatus progressionStatus, const char *progression01, const char *progression02, const char *progression03, int score)\n{\n#if WITH_EDITOR && !TEST_NON_EDITOR_PLUGIN_ANALYTICS_MODE\n\t// Empty\n#elif PLATFORM_IOS\n    GameAnalyticsCpp::addProgressionEventWithScore((int)progressionStatus, progression01, progression02, progression03, score, \"\");\n#elif PLATFORM_ANDROID\n    gameanalytics::jni_addProgressionEventWithScore((int)progressionStatus, progression01, progression02, progression03, score, \"\");\n#elif PLATFORM_MAC || PLATFORM_WINDOWS || PLATFORM_LINUX\n    gameanalytics::GameAnalytics::addProgressionEvent((gameanalytics::EGAProgressionStatus)((int)progressionStatus), progression01, progression02, progression03, score/*, \"\"*/);\n#elif PLATFORM_HTML5\n    js_addProgressionEventWithScore((int)progressionStatus, progression01, progression02, progression03, score, \"\");\n#endif\n}\n\nvoid UGameAnalytics::addDesignEvent(const char *eventId)\n{\n#if WITH_EDITOR && !TEST_NON_EDITOR_PLUGIN_ANALYTICS_MODE\n\t// Empty\n#elif PLATFORM_IOS\n    GameAnalyticsCpp::addDesignEvent(eventId, \"\");\n#elif PLATFORM_ANDROID\n    gameanalytics::jni_addDesignEvent(eventId, \"\");\n#elif PLATFORM_MAC || PLATFORM_WINDOWS || PLATFORM_LINUX\n    gameanalytics::GameAnalytics::addDesignEvent(eventId/*, \"\"*/);\n#elif PLATFORM_HTML5\n    js_addDesignEvent(eventId, \"\");\n#endif\n}\n\nvoid UGameAnalytics::addDesignEvent(const char *eventId, float value)\n{\n#if WITH_EDITOR && !TEST_NON_EDITOR_PLUGIN_ANALYTICS_MODE\n\t// Empty\n#elif PLATFORM_IOS\n    GameAnalyticsCpp::addDesignEventWithValue(eventId, value, \"\");\n#elif PLATFORM_ANDROID\n    gameanalytics::jni_addDesignEventWithValue(eventId, value, \"\");\n#elif PLATFORM_MAC || PLATFORM_WINDOWS || PLATFORM_LINUX\n    gameanalytics::GameAnalytics::addDesignEvent(eventId, value/*, \"\"*/);\n#elif PLATFORM_HTML5\n    js_addDesignEventWithValue(eventId, value, \"\");\n#endif\n}\n\nvoid UGameAnalytics::addErrorEvent(EGAErrorSeverity severity, const char *message)\n{\n#if WITH_EDITOR && !TEST_NON_EDITOR_PLUGIN_ANALYTICS_MODE\n\t// Empty\n#elif PLATFORM_IOS\n    GameAnalyticsCpp::addErrorEvent((int)severity, message, \"\");\n#elif PLATFORM_ANDROID\n    gameanalytics::jni_addErrorEvent((int)severity, message, \"\");\n#elif PLATFORM_MAC || PLATFORM_WINDOWS || PLATFORM_LINUX\n    gameanalytics::GameAnalytics::addErrorEvent((gameanalytics::EGAErrorSeverity)((int)severity), message/*, \"\"*/);\n#elif PLATFORM_HTML5\n    js_addErrorEvent((int)severity, message, \"\");\n#endif\n}\n\nvoid UGameAnalytics::setEnabledInfoLog(bool flag)\n{\n#if WITH_EDITOR && !TEST_NON_EDITOR_PLUGIN_ANALYTICS_MODE\n\t// Empty\n#elif PLATFORM_IOS\n    GameAnalyticsCpp::setEnabledInfoLog(flag);\n#elif PLATFORM_ANDROID\n    gameanalytics::jni_setEnabledInfoLog(flag);\n#elif PLATFORM_MAC || PLATFORM_WINDOWS || PLATFORM_LINUX\n    gameanalytics::GameAnalytics::setEnabledInfoLog(flag);\n#elif PLATFORM_HTML5\n    js_setEnabledInfoLog(flag);\n#endif\n}\n\nvoid UGameAnalytics::setEnabledVerboseLog(bool flag)\n{\n#if WITH_EDITOR && !TEST_NON_EDITOR_PLUGIN_ANALYTICS_MODE\n\t// Empty\n#elif PLATFORM_IOS\n    GameAnalyticsCpp::setEnabledVerboseLog(flag);\n#elif PLATFORM_ANDROID\n    gameanalytics::jni_setEnabledVerboseLog(flag);\n#elif PLATFORM_MAC || PLATFORM_WINDOWS || PLATFORM_LINUX\n    gameanalytics::GameAnalytics::setEnabledVerboseLog(flag);\n#elif PLATFORM_HTML5\n    js_setEnabledVerboseLog(flag);\n#endif\n}\n\nvoid UGameAnalytics::setEnabledManualSessionHandling(bool flag)\n{\n#if WITH_EDITOR && !TEST_NON_EDITOR_PLUGIN_ANALYTICS_MODE\n\t// Empty\n#elif PLATFORM_IOS\n    GameAnalyticsCpp::setEnabledManualSessionHandling(flag);\n#elif PLATFORM_ANDROID\n    gameanalytics::jni_setEnabledManualSessionHandling(flag);\n#elif PLATFORM_MAC || PLATFORM_WINDOWS || PLATFORM_LINUX\n    gameanalytics::GameAnalytics::setEnabledManualSessionHandling(flag);\n#elif PLATFORM_HTML5\n    js_setManualSessionHandling(flag);\n#endif\n}\n\nvoid UGameAnalytics::setCustomDimension01(const char *customDimension)\n{\n#if WITH_EDITOR && !TEST_NON_EDITOR_PLUGIN_ANALYTICS_MODE\n\t// Empty\n#elif PLATFORM_IOS\n    GameAnalyticsCpp::setCustomDimension01(customDimension);\n#elif PLATFORM_ANDROID\n    gameanalytics::jni_setCustomDimension01(customDimension);\n#elif PLATFORM_MAC || PLATFORM_WINDOWS || PLATFORM_LINUX\n    gameanalytics::GameAnalytics::setCustomDimension01(customDimension);\n#elif PLATFORM_HTML5\n    js_setCustomDimension01(customDimension);\n#endif\n}\n\nvoid UGameAnalytics::setCustomDimension02(const char *customDimension)\n{\n#if WITH_EDITOR && !TEST_NON_EDITOR_PLUGIN_ANALYTICS_MODE\n\t// Empty\n#elif PLATFORM_IOS\n    GameAnalyticsCpp::setCustomDimension02(customDimension);\n#elif PLATFORM_ANDROID\n    gameanalytics::jni_setCustomDimension02(customDimension);\n#elif PLATFORM_MAC || PLATFORM_WINDOWS || PLATFORM_LINUX\n    gameanalytics::GameAnalytics::setCustomDimension02(customDimension);\n#elif PLATFORM_HTML5\n    js_setCustomDimension02(customDimension);\n#endif\n}\n\nvoid UGameAnalytics::setCustomDimension03(const char *customDimension)\n{\n#if WITH_EDITOR && !TEST_NON_EDITOR_PLUGIN_ANALYTICS_MODE\n\t// Empty\n#elif PLATFORM_IOS\n    GameAnalyticsCpp::setCustomDimension03(customDimension);\n#elif PLATFORM_ANDROID\n    gameanalytics::jni_setCustomDimension03(customDimension);\n#elif PLATFORM_MAC || PLATFORM_WINDOWS || PLATFORM_LINUX\n    gameanalytics::GameAnalytics::setCustomDimension03(customDimension);\n#elif PLATFORM_HTML5\n    js_setCustomDimension03(customDimension);\n#endif\n}\n\nvoid UGameAnalytics::setFacebookId(const char *facebookId)\n{\n#if WITH_EDITOR && !TEST_NON_EDITOR_PLUGIN_ANALYTICS_MODE\n\t// Empty\n#elif PLATFORM_IOS\n    GameAnalyticsCpp::setFacebookId(facebookId);\n#elif PLATFORM_ANDROID\n    gameanalytics::jni_setFacebookId(facebookId);\n#elif PLATFORM_MAC || PLATFORM_WINDOWS || PLATFORM_LINUX\n    gameanalytics::GameAnalytics::setFacebookId(facebookId);\n#elif PLATFORM_HTML5\n    js_setFacebookId(facebookId);\n#endif\n}\n\nvoid UGameAnalytics::setGender(EGAGender gender)\n{\n    switch(gender)\n    {\n        case EGAGender::male:\n        {\n#if WITH_EDITOR && !TEST_NON_EDITOR_PLUGIN_ANALYTICS_MODE\n\t\t\t// Empty\n#elif PLATFORM_IOS\n        \tGameAnalyticsCpp::setGender(\"male\");\n#elif PLATFORM_ANDROID\n        \tgameanalytics::jni_setGender((int)gender);\n#elif PLATFORM_MAC || PLATFORM_WINDOWS || PLATFORM_LINUX\n            gameanalytics::GameAnalytics::setGender((gameanalytics::EGAGender)((int)gender));\n#elif PLATFORM_HTML5\n            js_setGender((int)gender);\n#endif\n        }\n        break;\n\n        case EGAGender::female:\n        {\n#if WITH_EDITOR && !TEST_NON_EDITOR_PLUGIN_ANALYTICS_MODE\n\t\t\t// Empty\n#elif PLATFORM_IOS\n        \tGameAnalyticsCpp::setGender(\"female\");\n#elif PLATFORM_ANDROID\n        \tgameanalytics::jni_setGender((int)gender);\n#elif PLATFORM_MAC || PLATFORM_WINDOWS || PLATFORM_LINUX\n            gameanalytics::GameAnalytics::setGender((gameanalytics::EGAGender)((int)gender));\n#elif PLATFORM_HTML5\n            js_setGender((int)gender);\n#endif\n        }\n        break;\n    }\n}\n\nvoid UGameAnalytics::setBirthYear(int birthYear)\n{\n#if WITH_EDITOR && !TEST_NON_EDITOR_PLUGIN_ANALYTICS_MODE\n\t// Empty\n#elif PLATFORM_IOS\n    GameAnalyticsCpp::setBirthYear(birthYear);\n#elif PLATFORM_ANDROID\n    gameanalytics::jni_setBirthYear(birthYear);\n#elif PLATFORM_MAC || PLATFORM_WINDOWS || PLATFORM_LINUX\n    gameanalytics::GameAnalytics::setBirthYear(birthYear);\n#elif PLATFORM_HTML5\n    js_setBirthYear(birthYear);\n#endif\n}\n\nvoid UGameAnalytics::startSession()\n{\n#if WITH_EDITOR && !TEST_NON_EDITOR_PLUGIN_ANALYTICS_MODE\n\t// Empty\n#elif PLATFORM_IOS\n    GameAnalyticsCpp::startSession();\n#elif PLATFORM_ANDROID\n    gameanalytics::jni_startSession();\n#elif PLATFORM_MAC || PLATFORM_WINDOWS || PLATFORM_LINUX\n    gameanalytics::GameAnalytics::startSession();\n#elif PLATFORM_HTML5\n    js_startSession();\n#endif\n}\n\nvoid UGameAnalytics::endSession()\n{\n#if WITH_EDITOR && !TEST_NON_EDITOR_PLUGIN_ANALYTICS_MODE\n\t// Empty\n#elif PLATFORM_IOS\n    GameAnalyticsCpp::endSession();\n#elif PLATFORM_ANDROID\n    gameanalytics::jni_endSession();\n#elif PLATFORM_MAC || PLATFORM_WINDOWS || PLATFORM_LINUX\n    gameanalytics::GameAnalytics::endSession();\n#elif PLATFORM_HTML5\n    js_endSession();\n#endif\n}\n\nvoid UGameAnalytics::logGAStateInfo(const TCHAR* Context)\n{\n#if WITH_EDITOR && !TEST_NON_EDITOR_PLUGIN_ANALYTICS_MODE\n\t// Empty\n#else\n\t// Must be on the same thread so that we can log in the proper order\n\tUE_LOG(LogGameAnalyticsAnalytics, Verbose, TEXT(\"Called UGameAnalytics::logGAStateInfo (outside of thread) with Context = `%s`\"), Context);\n\tgameanalytics::threading::GAThreading::performTaskOnGAThread([Context]()\n\t{\n\t\tconst bool bIsInitialized = gameanalytics::state::GAState::isInitialized();\n\t\tconst bool bIsEnabled = gameanalytics::state::GAState::isEnabled();\n\t\tconst bool bIsSessionStarted = gameanalytics::state::GAState::sessionIsStarted();\n\t\tconst double MainThreadWaitInSeconds = gameanalytics::threading::GAThreading::GetThreadWaitSeconds();\n\t\tconst double ProcessEventsIntervalInSeconds = gameanalytics::events::GAEvents::GetEventsPollIntervalSeconds();\n\t\tUE_LOG(LogGameAnalyticsAnalytics, Verbose, TEXT(\"%s\"), Context);\n\t\tUE_LOG(LogGameAnalyticsAnalytics,\n\t\t\tVerbose,\n\t\t\tTEXT(\"UGameAnalytics::logGAStateInfo: GAState::isInitialized = %d, GAState::isEnabled = %d, GAState::sessionIsStarted = %d, MainThreadWaitInSeconds = %f, ProcessEventsIntervalInSeconds = %f \"),\n\t\t\tbIsInitialized, bIsEnabled, bIsSessionStarted, MainThreadWaitInSeconds, ProcessEventsIntervalInSeconds);\n\t\tUE_LOG(LogGameAnalyticsAnalytics, Verbose, TEXT(\"\"));\n\t});\n#endif\n}\n\nvoid UGameAnalytics::setThreadAndEventTimers(double ThreadWaitSeconds, double ThreadProcessEventsSeconds)\n{\n#if WITH_EDITOR && !TEST_NON_EDITOR_PLUGIN_ANALYTICS_MODE\n\t// Empty\n#else\n\tgameanalytics::threading::GAThreading::SetThreadWaitSeconds(ThreadWaitSeconds);\n\tgameanalytics::events::GAEvents::SetEventsPollIntervalSeconds(ThreadProcessEventsSeconds);\n#endif\n}\n\nvoid UGameAnalytics::waitUntilJobsAreDone()\n{\n#if WITH_EDITOR && !TEST_NON_EDITOR_PLUGIN_ANALYTICS_MODE\n\t// Empty\n#else\n\twhile (gameanalytics::threading::GAThreading::HasJobs())\n\t{\n\t\tif (!gameanalytics::threading::GAThreading::IsThreadRunning())\n\t\t{\n\t\t\t// Thread isn't even running anymore, what are you waiting for? get outta here kid\n\t\t\tbreak;\n\t\t}\n\t\tFPlatformProcess::Sleep(0.25f);\n\t}\n#endif\n}\n\nconst char* UGameAnalytics::getCommandCenterValueAsString(const char *key)\n{\n#if WITH_EDITOR\n    return \"\";\n#elif PLATFORM_IOS\n    return GameAnalyticsCpp::getCommandCenterValueAsString(key);\n#elif PLATFORM_ANDROID\n    return gameanalytics::jni_getCommandCenterValueAsString(key);\n#elif PLATFORM_LINUX\n    return gameanalytics::GameAnalytics::getCommandCenterValueAsString(key);\n#elif PLATFORM_MAC || PLATFORM_WINDOWS\n    return gameanalytics::GameAnalytics::getCommandCenterValueAsString(key).c_str();\n#elif PLATFORM_HTML5\n    return js_getCommandCenterValueAsString(key);\n#endif\n}\n\nconst char* UGameAnalytics::getCommandCenterValueAsString(const char *key, const char *defaultValue)\n{\n#if WITH_EDITOR && !TEST_NON_EDITOR_PLUGIN_ANALYTICS_MODE\n    return \"\";\n#elif PLATFORM_IOS\n    return GameAnalyticsCpp::getCommandCenterValueAsString(key, defaultValue);\n#elif PLATFORM_ANDROID\n    return gameanalytics::jni_getCommandCenterValueAsStringWithDefaultValue(key, defaultValue);\n#elif PLATFORM_LINUX\n    return gameanalytics::GameAnalytics::getCommandCenterValueAsString(key, defaultValue);\n#elif PLATFORM_MAC || PLATFORM_WINDOWS\n    return gameanalytics::GameAnalytics::getCommandCenterValueAsString(key, defaultValue).c_str();\n#elif PLATFORM_HTML5\n    return js_getCommandCenterValueAsStringWithDefaultValue(key, defaultValue);\n#endif\n}\n\nbool UGameAnalytics::isCommandCenterReady()\n{\n#if WITH_EDITOR && !TEST_NON_EDITOR_PLUGIN_ANALYTICS_MODE\n    return false;\n#elif PLATFORM_IOS\n    return GameAnalyticsCpp::isCommandCenterReady();\n#elif PLATFORM_ANDROID\n    return gameanalytics::jni_isCommandCenterReady();\n#elif PLATFORM_MAC || PLATFORM_WINDOWS || PLATFORM_LINUX\n    return gameanalytics::GameAnalytics::isCommandCenterReady();\n#elif PLATFORM_HTML5\n    return js_isCommandCenterReady();\n#endif\n}\n\nconst char* UGameAnalytics::getConfigurationsContentAsString()\n{\n#if WITH_EDITOR && !TEST_NON_EDITOR_PLUGIN_ANALYTICS_MODE\n    return \"\";\n#elif PLATFORM_IOS\n    return GameAnalyticsCpp::getConfigurationsContentAsString();\n#elif PLATFORM_ANDROID\n    return gameanalytics::jni_getConfigurationsContentAsString();\n#elif PLATFORM_LINUX\n    return gameanalytics::GameAnalytics::getConfigurationsContentAsString();\n#elif PLATFORM_MAC || PLATFORM_WINDOWS\n    return gameanalytics::GameAnalytics::getConfigurationsContentAsString().c_str();\n#elif PLATFORM_HTML5\n    return js_getConfigurationsContentAsString();\n#endif\n}\n\n// Blueprint functions\n\nvoid UGameAnalytics::AddBusinessEventIOS(const FString& Currency, int Amount, const FString& ItemType, const FString& ItemId, const FString& CartType, const FString& Receipt/*, const char *fields*/)\n{\n#if PLATFORM_IOS\n    addBusinessEvent(TCHAR_TO_ANSI(*Currency), Amount, TCHAR_TO_ANSI(*ItemType), TCHAR_TO_ANSI(*ItemId), TCHAR_TO_ANSI(*CartType), TCHAR_TO_ANSI(*Receipt));\n#endif\n}\n\nvoid UGameAnalytics::AddBusinessEventAndAutoFetchReceipt(const FString& Currency, int Amount, const FString& ItemType, const FString& ItemId, const FString& CartType/*, const char *fields*/)\n{\n#if PLATFORM_IOS\n    addBusinessEventAndAutoFetchReceipt(TCHAR_TO_ANSI(*Currency), Amount, TCHAR_TO_ANSI(*ItemType), TCHAR_TO_ANSI(*ItemId), TCHAR_TO_ANSI(*CartType));\n#endif\n}\n\nvoid UGameAnalytics::AddBusinessEventAndroid(const FString& Currency, int Amount, const FString& ItemType, const FString& ItemId, const FString& CartType, const FString& Receipt, const FString& Signature/*, const char *fields*/)\n{\n#if PLATFORM_ANDROID\n    addBusinessEvent(TCHAR_TO_ANSI(*Currency), Amount, TCHAR_TO_ANSI(*ItemType), TCHAR_TO_ANSI(*ItemId), TCHAR_TO_ANSI(*CartType), TCHAR_TO_ANSI(*Receipt), TCHAR_TO_ANSI(*Signature));\n#endif\n}\n\nvoid UGameAnalytics::AddBusinessEvent(const FString& Currency, int Amount, const FString& ItemType, const FString& ItemId, const FString& CartType/*, const char *fields*/)\n{\n    addBusinessEvent(TCHAR_TO_ANSI(*Currency), Amount, TCHAR_TO_ANSI(*ItemType), TCHAR_TO_ANSI(*ItemId), TCHAR_TO_ANSI(*CartType));\n}\n\nvoid UGameAnalytics::AddResourceEvent(EGAResourceFlowType FlowType, const FString& Currency, float Amount, const FString& ItemType, const FString& ItemId/*, const char *fields*/)\n{\n    addResourceEvent(FlowType, TCHAR_TO_ANSI(*Currency), Amount, TCHAR_TO_ANSI(*ItemType), TCHAR_TO_ANSI(*ItemId));\n}\n\nvoid UGameAnalytics::AddProgressionEventWithOne(EGAProgressionStatus ProgressionStatus, const FString& Progression01/*, const char *fields*/)\n{\n    addProgressionEvent(ProgressionStatus, TCHAR_TO_ANSI(*Progression01));\n}\n\nvoid UGameAnalytics::AddProgressionEventWithOneAndScore(EGAProgressionStatus ProgressionStatus, const FString& Progression01, int Score/*, const char *fields*/)\n{\n    addProgressionEvent(ProgressionStatus, TCHAR_TO_ANSI(*Progression01), Score);\n}\n\nvoid UGameAnalytics::AddProgressionEventWithOneAndTwo(EGAProgressionStatus ProgressionStatus, const FString& Progression01, const FString& Progression02/*, const char *fields*/)\n{\n    addProgressionEvent(ProgressionStatus, TCHAR_TO_ANSI(*Progression01), TCHAR_TO_ANSI(*Progression02));\n}\n\nvoid UGameAnalytics::AddProgressionEventWithOneTwoAndScore(EGAProgressionStatus ProgressionStatus, const FString& Progression01, const FString& Progression02, int Score/*, const char *fields*/)\n{\n    addProgressionEvent(ProgressionStatus, TCHAR_TO_ANSI(*Progression01), TCHAR_TO_ANSI(*Progression02), Score);\n}\n\nvoid UGameAnalytics::AddProgressionEventWithOneTwoAndThree(EGAProgressionStatus ProgressionStatus, const FString& Progression01, const FString& Progression02, const FString& Progression03/*, const char *fields*/)\n{\n    addProgressionEvent(ProgressionStatus, TCHAR_TO_ANSI(*Progression01), TCHAR_TO_ANSI(*Progression02), TCHAR_TO_ANSI(*Progression03));\n}\n\nvoid UGameAnalytics::AddProgressionEvenWithOneTwoThreeAndScore(EGAProgressionStatus ProgressionStatus, const FString& Progression01, const FString& Progression02, const FString& Progression03, int Score/*, const char *fields*/)\n{\n    addProgressionEvent(ProgressionStatus, TCHAR_TO_ANSI(*Progression01), TCHAR_TO_ANSI(*Progression02), TCHAR_TO_ANSI(*Progression03), Score);\n}\n\nvoid UGameAnalytics::AddDesignEvent(const FString& EventId/*, const char *fields*/)\n{\n    addDesignEvent(TCHAR_TO_ANSI(*EventId));\n}\n\nvoid UGameAnalytics::AddDesignEventWithValue(const FString& EventId, float Value/*, const char *fields*/)\n{\n    addDesignEvent(TCHAR_TO_ANSI(*EventId), Value);\n}\n\nvoid UGameAnalytics::AddErrorEvent(EGAErrorSeverity Severity, const FString& Message/*, const char *fields*/)\n{\n    addErrorEvent(Severity, TCHAR_TO_ANSI(*Message));\n}\n\nvoid UGameAnalytics::SetCustomDimension01(const FString& CustomDimension)\n{\n    setCustomDimension01(TCHAR_TO_ANSI(*CustomDimension));\n}\n\nvoid UGameAnalytics::SetCustomDimension02(const FString& CustomDimension)\n{\n    setCustomDimension02(TCHAR_TO_ANSI(*CustomDimension));\n}\n\nvoid UGameAnalytics::SetCustomDimension03(const FString& CustomDimension)\n{\n    setCustomDimension03(TCHAR_TO_ANSI(*CustomDimension));\n}\n\nvoid UGameAnalytics::SetFacebookId(const FString& FacebookId)\n{\n    setFacebookId(TCHAR_TO_ANSI(*FacebookId));\n}\n\nvoid UGameAnalytics::SetGender(EGAGender Gender)\n{\n    setGender(Gender);\n}\n\nvoid UGameAnalytics::SetBirthYear(int BirthYear)\n{\n    setBirthYear(BirthYear);\n}\n\nFString UGameAnalytics::GetCommandCenterValueAsString(const FString& Key)\n{\n\treturn FString(getCommandCenterValueAsString(TCHAR_TO_ANSI(*Key)));\n}\n\nFString UGameAnalytics::GetCommandCenterValueAsStringWithDefaultValue(const FString& Key, const FString& DefaultValue)\n{\n\treturn FString(getCommandCenterValueAsString(TCHAR_TO_ANSI(*Key), TCHAR_TO_ANSI(*DefaultValue)));\n}\n\nbool UGameAnalytics::IsCommandCenterReady()\n{\n\treturn isCommandCenterReady();\n}\n\nFString UGameAnalytics::GetConfigurationsContentAsString()\n{\n\treturn FString(getConfigurationsContentAsString());\n}\n"
  },
  {
    "path": "Plugins/GameAnalytics/Source/GameAnalytics/Private/GameAnalyticsProvider.h",
    "content": "// Copyright 1998-2015 Epic Games, Inc. All Rights Reserved.\n\n#pragma once\n\n#include \"EngineMinimal.h\"\n#include \"CoreMinimal.h\"\n#include \"UObject/UObjectGlobals.h\"\n#include \"UObject/Class.h\"\n#include \"UObject/Package.h\"\n#include \"Interfaces/IAnalyticsProviderModule.h\"\n\nclass FAnalyticsProviderGameAnalytics :\n\tpublic IAnalyticsProvider\n{\n\t/** Path where analytics files are saved out */\n\tFString AnalyticsFilePath;\n\t/** Tracks whether we need to start the session or restart it */\n\tbool bHasSessionStarted;\n\t/** Whether an event was written before or not */\n\tbool bHasWrittenFirstEvent;\n\t/** Id representing the user the analytics are recording for */\n\tFString UserId;\n\t/** Unique Id representing the session the analytics are recording for */\n\tFString SessionId;\n\t/** Holds the Age if set */\n\tint32 Age;\n\n\n\t/** Settings for GameAnalytics, loaded from project configuration files */\n\tFAnalyticsGameAnalytics::FGameAnalyticsProjectSettings ProjectSettings;\n\npublic:\n\tFAnalyticsProviderGameAnalytics();\n\tvirtual ~FAnalyticsProviderGameAnalytics();\n\n\tvirtual bool StartSession(const TArray<FAnalyticsEventAttribute>& Attributes) override;\n\tvirtual void EndSession() override;\n\tvirtual void FlushEvents() override;\n\n\tvirtual void SetUserID(const FString& InUserID) override;\n\tvirtual FString GetUserID() const override;\n\n\tvirtual FString GetSessionID() const override;\n\tvirtual bool SetSessionID(const FString& InSessionID) override;\n\n\tvirtual void RecordEvent(const FString& EventName, const TArray<FAnalyticsEventAttribute>& Attributes) override;\n\n\tvirtual void SetGender(const FString& InGender) ;\n\tvirtual void SetAge(const int32 InAge) ;\n\n    virtual void RecordItemPurchase(const FString& ItemId, const FString& Currency, int PerItemCost, int ItemQuantity);\n\tvirtual void RecordItemPurchase(const FString& ItemId, int ItemQuantity, const TArray<FAnalyticsEventAttribute>& Attributes);\n    virtual void RecordCurrencyPurchase(const FString& GameCurrencyType, int GameCurrencyAmount, const FString& RealCurrencyType, float RealMoneyCost, const FString& PaymentProvider);\n    virtual void RecordCurrencyPurchase(const FString& GameCurrencyType, int GameCurrencyAmount);\n\tvirtual void RecordCurrencyPurchase(const FString& GameCurrencyType, int GameCurrencyAmount, const TArray<FAnalyticsEventAttribute>& Attributes);\n    virtual void RecordCurrencyGiven(const FString& GameCurrencyType, int GameCurrencyAmount);\n\tvirtual void RecordCurrencyGiven(const FString& GameCurrencyType, int GameCurrencyAmount, const TArray<FAnalyticsEventAttribute>& Attributes);\n    virtual void RecordError(const FString& Error);\n\tvirtual void RecordError(const FString& Error, const TArray<FAnalyticsEventAttribute>& Attributes);\n    virtual void RecordProgress(const FString& ProgressType, const FString& ProgressHierarchy);\n    virtual void RecordProgress(const FString& ProgressType, const FString& ProgressHierarchy, const TArray<FAnalyticsEventAttribute>& Attributes);\n    virtual void RecordProgress(const FString& ProgressType, const TArray<FString>& ProgressHierarchy, const TArray<FAnalyticsEventAttribute>& Attributes);\n\n    template <typename EnumType>\n    static FORCEINLINE EnumType GetEnumValueFromString(const FString& EnumName, const FString& String)\n    {\n        UEnum* Enum = FindObject<UEnum>(ANY_PACKAGE, *EnumName, true);\n        if(!Enum)\n        {\n            return EnumType(0);\n        }\n#if ENGINE_MAJOR_VERSION >= 4 && ENGINE_MINOR_VERSION >= 16\n#if ENGINE_MAJOR_VERSION >= 4 && ENGINE_MINOR_VERSION >= 18\n        return (EnumType)Enum->GetIndexByName(FName(*String), EGetByNameFlags::CaseSensitive);\n#else\n        return (EnumType)Enum->GetIndexByName(FName(*String), true);\n#endif\n#else\n        return (EnumType)Enum->FindEnumIndex(FName(*String));\n#endif\n    }\n};\n"
  },
  {
    "path": "Plugins/GameAnalytics/Source/GameAnalytics/Private/UEGameAnalytics.cpp",
    "content": "#include \"UEGameAnalytics.h\"\n#include \"Misc/ConfigCacheIni.h\"\n#include \"Interfaces/IAnalyticsProvider.h\"\n#include \"GameAnalyticsProvider.h\"\n#include \"GameAnalytics.h\"\n#if PLATFORM_MAC || PLATFORM_WINDOWS || PLATFORM_LINUX\n#if PLATFORM_WINDOWS\n#include \"Windows/AllowWindowsPlatformTypes.h\"\n#endif\n#include \"../GA-SDK-CPP/GameAnalytics.h\"\n#elif PLATFORM_HTML5\n#include \"../GA-SDK-HTML5/GameAnalytics.h\"\n#endif\n\n#include \"Misc/ConfigCacheIni.h\"\n#include \"Misc/EngineVersion.h\"\n\n#define GA_VERSION TEXT(\"3.0.6\")\n\nDEFINE_LOG_CATEGORY(LogGameAnalyticsAnalytics)\n\nIMPLEMENT_MODULE(FAnalyticsGameAnalytics, GameAnalytics)\n\nFGameAnalyticsBuildOverride FAnalyticsGameAnalytics::BuildOverride;\n\nvoid FAnalyticsGameAnalytics::StartupModule()\n{\n    UE_LOG(LogGameAnalyticsAnalytics, Display, TEXT(\"FAnalyticsGameAnalytics Constructor\"));\n    GameAnalyticsProvider = MakeShareable(new FAnalyticsProviderGameAnalytics());\n}\n\nvoid FAnalyticsGameAnalytics::ShutdownModule()\n{\n    if (GameAnalyticsProvider.IsValid())\n    {\n        UE_LOG(LogGameAnalyticsAnalytics, Display, TEXT(\"FAnalyticsGameAnalytics Destructor\"));\n        GameAnalyticsProvider->EndSession();\n    }\n}\n\n#if ENGINE_MAJOR_VERSION >= 4 && ENGINE_MINOR_VERSION >= 13\nTSharedPtr<IAnalyticsProvider> FAnalyticsGameAnalytics::CreateAnalyticsProvider(const FAnalyticsProviderConfigurationDelegate& GetConfigValue) const\n{\n    return GameAnalyticsProvider;\n}\n#else\nTSharedPtr<IAnalyticsProvider> FAnalyticsGameAnalytics::CreateAnalyticsProvider(const FAnalytics::FProviderConfigurationDelegate& GetConfigValue) const\n{\n    return GameAnalyticsProvider;\n}\n#endif\n\n\nFAnalyticsGameAnalytics::FGameAnalyticsProjectSettings FAnalyticsGameAnalytics::LoadProjectSettings()\n{\n    FGameAnalyticsProjectSettings Settings;\n    if (!GConfig)\n    {\n        return Settings;\n    }\n\n\tconst FString Section = TEXT(\"/Script/GameAnalyticsEditor.GameAnalyticsProjectSettings\");\n    const bool bUseBuildOverride = BuildOverride.IsBound();\n\n\t// Windows\n    if (!GConfig->GetString(*Section, TEXT(\"AndroidGameKey\"), Settings.AndroidGameKey, GetIniName()))\n    {\n        Settings.AndroidGameKey = \"\";\n    }\n    if (!GConfig->GetString(*Section, TEXT(\"AndroidSecretKey\"), Settings.AndroidSecretKey, GetIniName()))\n    {\n        Settings.AndroidSecretKey = \"\";\n    }\n    if (!bUseBuildOverride && !GConfig->GetString(*Section, TEXT(\"AndroidBuild\"), Settings.AndroidBuild, GetIniName()))\n    {\n        Settings.AndroidBuild = \"0.1\";\n    }\n\n\t// IOS\n    if (!GConfig->GetString(*Section, TEXT(\"IosGameKey\"), Settings.IosGameKey, GetIniName()))\n    {\n        Settings.IosGameKey = \"\";\n    }\n    if (!GConfig->GetString(*Section, TEXT(\"IosSecretKey\"), Settings.IosSecretKey, GetIniName()))\n    {\n        Settings.IosSecretKey = \"\";\n    }\n    if (!bUseBuildOverride && !GConfig->GetString(*Section, TEXT(\"IosBuild\"), Settings.IosBuild, GetIniName()))\n    {\n        Settings.IosBuild = \"0.1\";\n    }\n\n\t// Mac\n    if (!GConfig->GetString(*Section, TEXT(\"MacGameKey\"), Settings.MacGameKey, GetIniName()))\n    {\n        Settings.MacGameKey = \"\";\n    }\n    if (!GConfig->GetString(*Section, TEXT(\"MacSecretKey\"), Settings.MacSecretKey, GetIniName()))\n    {\n        Settings.MacSecretKey = \"\";\n    }\n    if (!bUseBuildOverride && !GConfig->GetString(*Section, TEXT(\"MacBuild\"), Settings.MacBuild, GetIniName()))\n    {\n        Settings.MacBuild = \"0.1\";\n    }\n\n\t// Windows\n    if (!GConfig->GetString(*Section, TEXT(\"WindowsGameKey\"), Settings.WindowsGameKey, GetIniName()))\n    {\n        Settings.WindowsGameKey = \"\";\n    }\n    if (!GConfig->GetString(*Section, TEXT(\"WindowsSecretKey\"), Settings.WindowsSecretKey, GetIniName()))\n    {\n        Settings.WindowsSecretKey = \"\";\n    }\n    if (!bUseBuildOverride && !GConfig->GetString(*Section, TEXT(\"WindowsBuild\"), Settings.WindowsBuild, GetIniName()))\n    {\n        Settings.WindowsBuild = \"0.1\";\n    }\n\n\t// Linux\n    if (!GConfig->GetString(*Section, TEXT(\"LinuxGameKey\"), Settings.LinuxGameKey, GetIniName()))\n    {\n        Settings.LinuxGameKey = \"\";\n    }\n    if (!GConfig->GetString(*Section, TEXT(\"LinuxSecretKey\"), Settings.LinuxSecretKey, GetIniName()))\n    {\n        Settings.LinuxSecretKey = \"\";\n    }\n    if (!bUseBuildOverride && !GConfig->GetString(*Section, TEXT(\"LinuxBuild\"), Settings.LinuxBuild, GetIniName()))\n    {\n        Settings.LinuxBuild = \"0.1\";\n    }\n\n\t// HTML5\n    if (!GConfig->GetString(*Section, TEXT(\"Html5GameKey\"), Settings.Html5GameKey, GetIniName()))\n    {\n        Settings.Html5GameKey = \"\";\n    }\n    if (!GConfig->GetString(*Section, TEXT(\"Html5SecretKey\"), Settings.Html5SecretKey, GetIniName()))\n    {\n        Settings.Html5SecretKey = \"\";\n    }\n    if (!bUseBuildOverride && !GConfig->GetString(*Section, TEXT(\"Html5Build\"), Settings.Html5Build, GetIniName()))\n    {\n        Settings.Html5Build = \"0.1\";\n    }\n\n    // Overridden by the game, same version for everyone\n    if (bUseBuildOverride)\n    {\n        const FString& BuildVersion = BuildOverride.Execute();\n        Settings.AndroidBuild = BuildVersion;\n        Settings.IosBuild = BuildVersion;\n        Settings.MacBuild = BuildVersion;\n        Settings.WindowsBuild = BuildVersion;\n        Settings.LinuxBuild = BuildVersion;\n        Settings.Html5Build = BuildVersion;\n    }\n\n    if (!GConfig->GetBool(*Section, TEXT(\"UseManualSessionHandling\"), Settings.UseManualSessionHandling, GetIniName()))\n    {\n        Settings.UseManualSessionHandling = false;\n    }\n\n\t// InfoLogBuild\n\tif (FParse::Param(FCommandLine::Get(), TEXT(\"GAInfoLogBuild\")))\n\t{\n\t\tSettings.InfoLogBuild = true;\n\t}\n\telse if (FParse::Param(FCommandLine::Get(), TEXT(\"GANoInfoLogBuild\")))\n\t{\n\t\tSettings.InfoLogBuild = false;\n\t}\n    else if (!GConfig->GetBool(*Section, TEXT(\"InfoLogBuild\"), Settings.InfoLogBuild, GetIniName()))\n    {\n        Settings.InfoLogBuild = true;\n    }\n\n\t// VerboseLogBuild\n\tif (FParse::Param(FCommandLine::Get(), TEXT(\"GAVerboseLogBuild\")))\n\t{\n\t\tSettings.VerboseLogBuild = true;\n\t}\n\telse if (FParse::Param(FCommandLine::Get(), TEXT(\"GANoVerboseLogBuild\")))\n\t{\n\t\tSettings.VerboseLogBuild = false;\n\t}\n\telse if (!GConfig->GetBool(*Section, TEXT(\"VerboseLogBuild\"), Settings.VerboseLogBuild, GetIniName()))\n    {\n        Settings.VerboseLogBuild = false;\n    }\n\n    GConfig->GetArray(*Section, TEXT(\"+CustomDimensions01\"), Settings.CustomDimensions01, GetIniName());\n    GConfig->GetArray(*Section, TEXT(\"+CustomDimensions02\"), Settings.CustomDimensions02, GetIniName());\n    GConfig->GetArray(*Section, TEXT(\"+CustomDimensions03\"), Settings.CustomDimensions03, GetIniName());\n    GConfig->GetArray(*Section, TEXT(\"+ResourceCurrencies\"), Settings.ResourceCurrencies, GetIniName());\n    GConfig->GetArray(*Section, TEXT(\"+ResourceItemTypes\"), Settings.ResourceItemTypes, GetIniName());\n\n    return Settings;\n}\n\n\n#if !UE_BUILD_SHIPPING\n/**\n* Verifies that the event name matches GameAnalytics's 32 char limit and warns if it doesn't\n*/\ninline void CheckEventNameLen(const FString& EventName)\n{\n    const int32 Length = EventName.Len();\n    if (Length > 32)\n    {\n        UE_LOG(LogGameAnalyticsAnalytics, Warning, TEXT(\"GameAnalytics event name is too long: %s and will be truncated by GameAnalytics. 32 character max limit.\"), *EventName);\n    }\n    else if (Length == 0)\n    {\n        UE_LOG(LogGameAnalyticsAnalytics, Warning, TEXT(\"GameAnalytics event name is empty!\"));\n    }\n}\n\n#define WarnIfEventNameIsWrongLength(x) CheckEventNameLen(x)\n#else\n// Have these compile out\n#define WarnIfEventNameIsWrongLength(x)\n#endif\n\n\n\n// Provider\nFAnalyticsProviderGameAnalytics::FAnalyticsProviderGameAnalytics() :\n    bHasSessionStarted(false),\n    bHasWrittenFirstEvent(false),\n    Age(0)\n{\n#if ENGINE_MAJOR_VERSION >= 4 && ENGINE_MINOR_VERSION >= 18\n    AnalyticsFilePath = FPaths::ProjectSavedDir() + TEXT(\"Analytics/\");\n#else\n    AnalyticsFilePath = FPaths::GameSavedDir() + TEXT(\"Analytics/\");\n#endif\n#if ENGINE_MAJOR_VERSION >= 4 && ENGINE_MINOR_VERSION >= 15\n    UserId = FPlatformMisc::GetDeviceId();\n#else\n    UserId = FPlatformMisc::GetUniqueDeviceId();\n#endif\n}\n\nFAnalyticsProviderGameAnalytics::~FAnalyticsProviderGameAnalytics()\n{\n    //UE_LOG(LogGameAnalyticsAnalytics, Display, TEXT(\"FAnalyticsGameAnalytics ~FAnalyticsProviderGameAnalytics\"));\n    if (bHasSessionStarted)\n    {\n#if WITH_EDITOR && !TEST_NON_EDITOR_PLUGIN_ANALYTICS_MODE\n        // Empty\n#elif PLATFORM_MAC || PLATFORM_WINDOWS || PLATFORM_LINUX\n        gameanalytics::GameAnalytics::onQuit();\n#else\n\t\tEndSession();\n#endif\n\t}\n}\n\nbool FAnalyticsProviderGameAnalytics::StartSession(const TArray<FAnalyticsEventAttribute>& Attributes)\n{\n    //UGameAnalytics::logGAStateInfo(TEXT(\"FAnalyticsProviderGameAnalytics::StartSession\"));\n    if (!bHasSessionStarted)\n    {\n        UE_LOG(LogGameAnalyticsAnalytics, Verbose, TEXT(\"TEST_NON_EDITOR_PLUGIN_ANALYTICS_MODE = %d\"), TEST_NON_EDITOR_PLUGIN_ANALYTICS_MODE);\n#if WITH_EDITOR && TEST_NON_EDITOR_PLUGIN_ANALYTICS_MODE\n        UGameAnalytics::setThreadAndEventTimers(0.1, 0.05);\n#endif\n        ProjectSettings = FAnalyticsGameAnalytics::LoadProjectSettings();\n\n#if WITH_EDITOR && !TEST_NON_EDITOR_PLUGIN_ANALYTICS_MODE\n\t// Empty\n#elif PLATFORM_MAC || PLATFORM_WINDOWS || PLATFORM_LINUX\n#if ENGINE_MAJOR_VERSION >= 4 && ENGINE_MINOR_VERSION >= 18\n        UGameAnalytics::configureWritablePath(TCHAR_TO_ANSI(*FPaths::ProjectSavedDir()));\n#else\n        UGameAnalytics::configureWritablePath(TCHAR_TO_ANSI(*FPaths::GameSavedDir()));\n#endif\n#endif\n\n        ////// Enable log\n        UGameAnalytics::setEnabledInfoLog(ProjectSettings.InfoLogBuild);\n        UGameAnalytics::setEnabledVerboseLog(ProjectSettings.VerboseLogBuild);\n\n        ////// Configure engine version\n        const FString EngineVersionString = FString::Printf(TEXT(\"unreal %d.%d.%d\"), FEngineVersion::Current().GetMajor(), FEngineVersion::Current().GetMinor(), FEngineVersion::Current().GetPatch());\n        UE_LOG(LogGameAnalyticsAnalytics, Verbose, TEXT(\"EngineVersionString = %s\"), *EngineVersionString);\n\t\tUGameAnalytics::configureGameEngineVersion(TCHAR_TO_ANSI(*EngineVersionString));\n\n        const FString SdkVersionString = FString::Printf(TEXT(\"unreal %s\"), GA_VERSION);\n        UE_LOG(LogGameAnalyticsAnalytics, Verbose, TEXT(\"SdkVersionString = %s\"), *SdkVersionString);\n        UGameAnalytics::configureSdkGameEngineVersion(TCHAR_TO_ANSI(*SdkVersionString));\n\n        //// Configure build version\n        FString BuildString;\n#if PLATFORM_IOS\n        BuildString = ProjectSettings.IosBuild;\n#elif PLATFORM_ANDROID\n        BuildString = ProjectSettings.AndroidBuild;\n#elif PLATFORM_MAC\n        BuildString = ProjectSettings.MacBuild;\n#elif PLATFORM_WINDOWS\n        BuildString = ProjectSettings.WindowsBuild;\n#elif PLATFORM_LINUX\n        BuildString = ProjectSettings.LinuxBuild;\n#elif PLATFORM_HTML5\n        BuildString = ProjectSettings.Html5Build;\n#endif\n        UE_LOG(LogGameAnalyticsAnalytics, Verbose, TEXT(\"BuildString = %s\"), *BuildString);\n        UGameAnalytics::configureBuild(TCHAR_TO_ANSI(*BuildString));\n\n        ////// Configure available virtual currencies and item types\n        if (ProjectSettings.ResourceCurrencies.Num() > 0)\n        {\n            std::vector<std::string> currencies;\n            for (const FString& currency : ProjectSettings.ResourceCurrencies)\n            {\n                currencies.push_back(TCHAR_TO_ANSI(*currency));\n            }\n            UGameAnalytics::configureAvailableResourceCurrencies(currencies);\n        }\n\n        if (ProjectSettings.ResourceItemTypes.Num() > 0)\n        {\n            std::vector<std::string> resourceItem;\n            for (const FString& item : ProjectSettings.ResourceItemTypes)\n            {\n                resourceItem.push_back(TCHAR_TO_ANSI(*item));\n            }\n            UGameAnalytics::configureAvailableResourceItemTypes(resourceItem);\n        }\n\n        // Configure available custom dimensions\n        if (ProjectSettings.CustomDimensions01.Num() > 0)\n        {\n            std::vector<std::string> customDimension01;\n            for (const FString& dimension01 : ProjectSettings.CustomDimensions01)\n            {\n                customDimension01.push_back(TCHAR_TO_ANSI(*dimension01));\n            }\n            UGameAnalytics::configureAvailableCustomDimensions01(customDimension01);\n        }\n\n        if (ProjectSettings.CustomDimensions02.Num() > 0)\n        {\n            std::vector<std::string> customDimension02;\n            for (const FString& dimension02 : ProjectSettings.CustomDimensions02)\n            {\n                customDimension02.push_back(TCHAR_TO_ANSI(*dimension02));\n            }\n            UGameAnalytics::configureAvailableCustomDimensions02(customDimension02);\n        }\n\n        if (ProjectSettings.CustomDimensions03.Num() > 0)\n        {\n            std::vector<std::string> customDimension03;\n            for (const FString& dimension03 : ProjectSettings.CustomDimensions03)\n            {\n                customDimension03.push_back(TCHAR_TO_ANSI(*dimension03));\n            }\n            UGameAnalytics::configureAvailableCustomDimensions03(customDimension03);\n        }\n\n        if(ProjectSettings.UseManualSessionHandling)\n        {\n            UGameAnalytics::setEnabledManualSessionHandling(ProjectSettings.UseManualSessionHandling);\n        }\n\n        const int32 AttrCount = Attributes.Num();\n        FString gameKey;\n        FString secretKey;\n        if (AttrCount > 0)\n        {\n            // Load from user supplied arguments\n            for (auto Attr : Attributes)\n            {\n#if PLATFORM_IOS\n                if (Attr.AttrName == TEXT(\"ios_gameKey\"))\n                {\n                    gameKey = Attr.ToString();\n                }\n                else if (Attr.AttrName == TEXT(\"ios_secretKey\"))\n                {\n                    secretKey = Attr.ToString();\n                }\n#elif PLATFORM_ANDROID\n                if (Attr.AttrName == TEXT(\"android_gameKey\"))\n                {\n                    gameKey = Attr.ToString();\n                }\n                else if (Attr.AttrName == TEXT(\"android_secretKey\"))\n                {\n                    secretKey = Attr.ToString();\n                }\n#elif PLATFORM_MAC\n                if (Attr.AttrName == TEXT(\"mac_gameKey\"))\n                {\n                    gameKey = Attr.ToString();\n                }\n                else if (Attr.AttrName == TEXT(\"mac_secretKey\"))\n                {\n                    secretKey = Attr.ToString();\n                }\n#elif PLATFORM_WINDOWS\n                if (Attr.AttrName == TEXT(\"windows_gameKey\"))\n                {\n                    gameKey = Attr.ToString();\n                }\n                else if (Attr.AttrName == TEXT(\"windows_secretKey\"))\n                {\n                    secretKey = Attr.ToString();\n                }\n#elif PLATFORM_LINUX\n                if (Attr.AttrName == TEXT(\"linux_gameKey\"))\n                {\n                    gameKey = Attr.ToString();\n                }\n                else if (Attr.AttrName == TEXT(\"linux_secretKey\"))\n                {\n                    secretKey = Attr.ToString();\n                }\n#elif PLATFORM_HTML5\n                if (Attr.AttrName == TEXT(\"html5_gameKey\"))\n                {\n                    gameKey = Attr.ToString();\n                }\n                else if (Attr.AttrName == TEXT(\"html5_secretKey\"))\n                {\n                    secretKey = Attr.ToString();\n                }\n#endif\n            }\n        }\n        else\n        {\n            // Load from project settings\n#if PLATFORM_IOS\n            gameKey = ProjectSettings.IosGameKey;\n            secretKey = ProjectSettings.IosSecretKey;\n#elif PLATFORM_ANDROID\n            gameKey = ProjectSettings.AndroidGameKey;\n            secretKey = ProjectSettings.AndroidSecretKey;\n#elif PLATFORM_MAC\n            gameKey = ProjectSettings.MacGameKey;\n            secretKey = ProjectSettings.MacSecretKey;\n#elif PLATFORM_WINDOWS\n            gameKey = ProjectSettings.WindowsGameKey;\n            secretKey = ProjectSettings.WindowsSecretKey;\n#elif PLATFORM_LINUX\n            gameKey = ProjectSettings.LinuxGameKey;\n            secretKey = ProjectSettings.LinuxSecretKey;\n#elif PLATFORM_HTML5\n            gameKey = ProjectSettings.Html5GameKey;\n            secretKey = ProjectSettings.Html5SecretKey;\n#endif\n        }\n\n        ////// Initialize (also calls startNewSession)\n        UGameAnalytics::initialize(TCHAR_TO_ANSI(*gameKey), TCHAR_TO_ANSI(*secretKey));\n        //UGameAnalytics::logGAStateInfo(TEXT(\"FAnalyticsProviderGameAnalytics::StartSession AFTER UGameAnalytics::initialize\"));\n        bHasSessionStarted = true;\n\n    }\n    else if (ProjectSettings.UseManualSessionHandling)\n    {\n        UGameAnalytics::startSession();\n    }\n\n    return bHasSessionStarted;\n}\n\nvoid FAnalyticsProviderGameAnalytics::EndSession()\n{\n    if (bHasSessionStarted)\n    {\n        //UGameAnalytics::logGAStateInfo(TEXT(\"FAnalyticsProviderGameAnalytics::EndSession\"));\n        if(ProjectSettings.UseManualSessionHandling)\n        {\n            UGameAnalytics::endSession();\n        }\n        else\n        {\n#if WITH_EDITOR && !TEST_NON_EDITOR_PLUGIN_ANALYTICS_MODE\n            // Empty\n#elif PLATFORM_MAC || PLATFORM_WINDOWS || PLATFORM_LINUX\n            gameanalytics::GameAnalytics::onSuspend();\n#elif PLATFORM_HTML5\n            js_onStop();\n#else\n            UE_LOG(LogGameAnalyticsAnalytics, Warning, TEXT(\"FAnalyticsProviderGameAnalytics::EndSession ignored.\"));\n#endif\n        }\n    }\n\n#if WITH_EDITOR && TEST_NON_EDITOR_PLUGIN_ANALYTICS_MODE\n    UE_LOG(LogGameAnalyticsAnalytics, Verbose, TEXT(\"waitUntilJobsAreDone\"));\n    UGameAnalytics::waitUntilJobsAreDone();\n#endif\n}\n\nvoid FAnalyticsProviderGameAnalytics::FlushEvents()\n{\n    UE_LOG(LogGameAnalyticsAnalytics, Warning, TEXT(\"FAnalyticsProviderGameAnalytics::FlushEvents ignored.\"));\n}\n\nvoid FAnalyticsProviderGameAnalytics::SetUserID(const FString& InUserID)\n{\n    if(!bHasSessionStarted)\n    {\n        UE_LOG(LogGameAnalyticsAnalytics, Display, TEXT(\"GameAnalytics::SetCustomId('%s')\"), *InUserID);\n        UGameAnalytics::configureUserId(TCHAR_TO_ANSI(*InUserID));\n        UserId = InUserID;\n    }\n    else\n    {\n        UE_LOG(LogGameAnalyticsAnalytics, Warning, TEXT(\"FAnalyticsProviderGameAnalytics::SetCustomId Custom id can only be set when SDK is not initialized.\"));\n    }\n}\n\nFString FAnalyticsProviderGameAnalytics::GetUserID() const\n{\n    return UserId;\n}\n\nFString FAnalyticsProviderGameAnalytics::GetSessionID() const\n{\n    UE_LOG(LogGameAnalyticsAnalytics, Warning, TEXT(\"FAnalyticsProviderGameAnalytics::GetSessionID ignored.\"));\n    return SessionId;\n}\n\nbool FAnalyticsProviderGameAnalytics::SetSessionID(const FString& InSessionID)\n{\n    UE_LOG(LogGameAnalyticsAnalytics, Warning, TEXT(\"FAnalyticsProviderGameAnalytics::SetSessionID ignored.\"));\n    return !bHasSessionStarted;\n}\n\nvoid FAnalyticsProviderGameAnalytics::RecordEvent(const FString& EventName, const TArray<FAnalyticsEventAttribute>& Attributes)\n{\n    const int32 AttrCount = Attributes.Num();\n    if (AttrCount > 0)\n    {\n        // Send an event for each attribute\n        for (auto Attr : Attributes)\n        {\n            if (Attr.AttrName == TEXT(\"custom1\"))\n            {\n                UGameAnalytics::setCustomDimension01(TCHAR_TO_ANSI(*Attr.ToString()));\n            }\n            else if (Attr.AttrName == TEXT(\"custom2\"))\n            {\n                UGameAnalytics::setCustomDimension02(TCHAR_TO_ANSI(*Attr.ToString()));\n            }\n            else if (Attr.AttrName == TEXT(\"custom3\"))\n            {\n                UGameAnalytics::setCustomDimension03(TCHAR_TO_ANSI(*Attr.ToString()));\n            }\n            else if (Attr.AttrName == TEXT(\"facebook\"))\n            {\n                UGameAnalytics::setFacebookId(TCHAR_TO_ANSI(*Attr.ToString()));\n            }\n            else\n            {\n                float AttrValue = FCString::Atof(*Attr.ToString());\n                UGameAnalytics::addDesignEvent(TCHAR_TO_ANSI(*Attr.AttrName), AttrValue);\n            }\n        }\n    }\n    else if (EventName.Len() > 0)\n    {\n        // Send an event without value\n        UGameAnalytics::addDesignEvent(TCHAR_TO_ANSI(*EventName));\n    }\n}\n\nvoid FAnalyticsProviderGameAnalytics::SetAge(int InAge)\n{\n    UGameAnalytics::setBirthYear(InAge);\n}\n\nvoid FAnalyticsProviderGameAnalytics::SetGender(const FString& InGender)\n{\n    EGAGender gender = GetEnumValueFromString<EGAGender>(\"EGAGender\", InGender.ToLower());\n\n    if (gender == EGAGender(0))\n    {\n        UE_LOG(LogGameAnalyticsAnalytics, Warning, TEXT(\"SetGender: Error value must be either male or female.\"));\n        return;\n    }\n\n    UGameAnalytics::setGender(gender);\n}\n\nvoid FAnalyticsProviderGameAnalytics::RecordError(const FString& Error)\n{\n    UE_LOG(LogGameAnalyticsAnalytics, Display, TEXT(\"GameAnalytics::RecordError(const FString& Error) - ignoring call\"));\n}\n\nvoid FAnalyticsProviderGameAnalytics::RecordError(const FString& Error, const TArray<FAnalyticsEventAttribute>& Attributes)\n{\n    EGAErrorSeverity ErrorSeverity = GetEnumValueFromString<EGAErrorSeverity>(\"EGAErrorSeverity\", Error.ToLower());\n\n    if (ErrorSeverity == EGAErrorSeverity(0))\n    {\n        UE_LOG(LogGameAnalyticsAnalytics, Warning, TEXT(\"RecordError: Error value must be either debug, info, warning, error, critical. Error=%s\"), *Error);\n        return;\n    }\n\n    const int32 AttrCount = Attributes.Num();\n    if (AttrCount > 0)\n    {\n        for (auto Attr : Attributes)\n        {\n            if (Attr.AttrName == TEXT(\"message\"))\n            {\n                UGameAnalytics::addErrorEvent(ErrorSeverity, TCHAR_TO_ANSI(*Attr.ToString()));\n            }\n        }\n    }\n    else\n    {\n        UE_LOG(LogGameAnalyticsAnalytics, Warning, TEXT(\"FAnalyticsProviderGameAnalytics::RecordError wrong usage, for correct usage see: https://github.com/GameAnalytics/GA-SDK-UNREAL/wiki/Error%20Event\"));\n    }\n}\n\nvoid FAnalyticsProviderGameAnalytics::RecordProgress(const FString& ProgressType, const FString& ProgressHierarchy)\n{\n    EGAProgressionStatus ProgressionStatus = GetEnumValueFromString<EGAProgressionStatus>(\"EGAProgressionStatus\", ProgressType.ToLower());\n\n    if (ProgressionStatus == EGAProgressionStatus(0))\n    {\n        UE_LOG(LogGameAnalyticsAnalytics, Warning, TEXT(\"RecordProgress: ProgressType value must be either start, complete or fail. ProgressType=%s\"), *ProgressType);\n        return;\n    }\n\n    UGameAnalytics::addProgressionEvent(ProgressionStatus, TCHAR_TO_ANSI(*ProgressHierarchy));\n}\n\nvoid FAnalyticsProviderGameAnalytics::RecordProgress(const FString& ProgressType, const FString& ProgressHierarchy, const TArray<FAnalyticsEventAttribute>& Attributes)\n{\n    EGAProgressionStatus ProgressionStatus = GetEnumValueFromString<EGAProgressionStatus>(\"EGAProgressionStatus\", ProgressType.ToLower());\n\n    if (ProgressionStatus == EGAProgressionStatus(0))\n    {\n        UE_LOG(LogGameAnalyticsAnalytics, Warning, TEXT(\"RecordProgress: ProgressType value must be either start, complete or fail. ProgressType=%s\"), *ProgressType);\n        return;\n    }\n\n    bool useValue = false;\n\n    for (auto Attr : Attributes)\n    {\n        if (Attr.AttrName == TEXT(\"value\"))\n        {\n            int32 value = FCString::Atoi(*Attr.ToString());\n            useValue = true;\n\n            UGameAnalytics::addProgressionEvent(ProgressionStatus, TCHAR_TO_ANSI(*ProgressHierarchy), value);\n            break;\n        }\n    }\n\n    if (!useValue)\n    {\n        UGameAnalytics::addProgressionEvent(ProgressionStatus, TCHAR_TO_ANSI(*ProgressHierarchy));\n    }\n}\n\nvoid FAnalyticsProviderGameAnalytics::RecordProgress(const FString& ProgressType, const TArray<FString>& ProgressHierarchy, const TArray<FAnalyticsEventAttribute>& Attributes)\n{\n    EGAProgressionStatus ProgressionStatus = GetEnumValueFromString<EGAProgressionStatus>(\"EGAProgressionStatus\", ProgressType.ToLower());\n\n    if (ProgressionStatus == EGAProgressionStatus(0))\n    {\n        UE_LOG(LogGameAnalyticsAnalytics, Warning, TEXT(\"RecordProgress: ProgressType value must be either start, complete or fail. ProgressType=%s\"), *ProgressType);\n        return;\n    }\n\n    const int32 ProgressHierarchyCount = ProgressHierarchy.Num();\n    if(ProgressHierarchyCount > 0)\n    {\n        bool useValue = false;\n\n        for (auto Attr : Attributes)\n        {\n            UE_LOG(LogGameAnalyticsAnalytics, Warning, TEXT(\"RecordProgress: Attributes. AttrName=%s\"), *Attr.AttrName);\n            if (Attr.AttrName == TEXT(\"value\"))\n            {\n                int32 value = FCString::Atoi(*Attr.ToString());\n                useValue = true;\n\n                if (ProgressHierarchyCount > 2)\n                {\n                    UGameAnalytics::addProgressionEvent(ProgressionStatus, TCHAR_TO_ANSI(*ProgressHierarchy[0]), TCHAR_TO_ANSI(*ProgressHierarchy[1]), TCHAR_TO_ANSI(*ProgressHierarchy[2]), value);\n                }\n                else if (ProgressHierarchyCount > 1)\n                {\n                    UGameAnalytics::addProgressionEvent(ProgressionStatus, TCHAR_TO_ANSI(*ProgressHierarchy[0]), TCHAR_TO_ANSI(*ProgressHierarchy[1]), value);\n                }\n                else\n                {\n                    UGameAnalytics::addProgressionEvent(ProgressionStatus, TCHAR_TO_ANSI(*ProgressHierarchy[0]), value);\n                }\n                break;\n            }\n        }\n\n        if (ProgressHierarchyCount > 2)\n        {\n            if(!useValue)\n            {\n                UGameAnalytics::addProgressionEvent(ProgressionStatus, TCHAR_TO_ANSI(*ProgressHierarchy[0]), TCHAR_TO_ANSI(*ProgressHierarchy[1]), TCHAR_TO_ANSI(*ProgressHierarchy[2]));\n            }\n        }\n        else if (ProgressHierarchyCount > 1)\n        {\n            if(!useValue)\n            {\n                UGameAnalytics::addProgressionEvent(ProgressionStatus, TCHAR_TO_ANSI(*ProgressHierarchy[0]), TCHAR_TO_ANSI(*ProgressHierarchy[1]));\n            }\n        }\n        else\n        {\n            if(!useValue)\n            {\n                UGameAnalytics::addProgressionEvent(ProgressionStatus, TCHAR_TO_ANSI(*ProgressHierarchy[0]));\n            }\n        }\n    }\n    else\n    {\n        UE_LOG(LogGameAnalyticsAnalytics, Warning, TEXT(\"FAnalyticsProviderGameAnalytics::RecordProgress wrong usage, for correct usage see: https://github.com/GameAnalytics/GA-SDK-UNREAL/wiki/Progression%20Event\"));\n    }\n}\n\nvoid FAnalyticsProviderGameAnalytics::RecordItemPurchase(const FString& ItemId, const FString& Currency, int PerItemCost, int ItemQuantity)\n{\n    UE_LOG(LogGameAnalyticsAnalytics, Warning, TEXT(\"FAnalyticsProviderGameAnalytics::RecordItemPurchase(const FString& ItemId, const FString& Currency, int PerItemCost, int ItemQuantity) ignored. Instead use: FAnalyticsProviderGameAnalytics::RecordItemPurchase(const FString& ItemId, int ItemQuantity, const TArray<FAnalyticsEventAttribute>& Attributes)\"));\n}\n\nvoid FAnalyticsProviderGameAnalytics::RecordItemPurchase(const FString& ItemId, int ItemQuantity, const TArray<FAnalyticsEventAttribute>& Attributes)\n{\n    EGAResourceFlowType FlowType = EGAResourceFlowType::source;\n    FString Currency;\n    FString ItemType;\n\n    const int32 AttrCount = Attributes.Num();\n    if (AttrCount > 0)\n    {\n        for (auto Attr : Attributes)\n        {\n            if (Attr.AttrName == TEXT(\"flowType\"))\n            {\n                FlowType = GetEnumValueFromString<EGAResourceFlowType>(\"EGAResourceFlowType\", Attr.ToString().ToLower());\n\n                if (FlowType == EGAResourceFlowType(0))\n                {\n                    UE_LOG(LogGameAnalyticsAnalytics, Warning, TEXT(\"RecordItemPurchaseError: FlowType value must be either sink or source. flowType=%s\"), *Attr.ToString());\n                    return;\n                }\n            }\n            else if (Attr.AttrName == TEXT(\"currency\"))\n            {\n                Currency = Attr.ToString();\n            }\n            else if (Attr.AttrName == TEXT(\"itemType\"))\n            {\n                ItemType = Attr.ToString();\n            }\n        }\n\n        if (!Currency.IsEmpty() && !ItemType.IsEmpty())\n        {\n            UGameAnalytics::addResourceEvent(FlowType, TCHAR_TO_ANSI(*Currency), ItemQuantity, TCHAR_TO_ANSI(*ItemType), TCHAR_TO_ANSI(*ItemId));\n        }\n        else\n        {\n            UE_LOG(LogGameAnalyticsAnalytics, Warning, TEXT(\"FAnalyticsProviderGameAnalytics::RecordItemPurchase wrong usage, for correct usage see: https://github.com/GameAnalytics/GA-SDK-UNREAL/wiki/Resource%20Event\"));\n        }\n    }\n    else\n    {\n        UE_LOG(LogGameAnalyticsAnalytics, Warning, TEXT(\"FAnalyticsProviderGameAnalytics::RecordItemPurchase wrong usage, for correct usage see: https://github.com/GameAnalytics/GA-SDK-UNREAL/wiki/Resource%20Event\"));\n    }\n}\n\nvoid FAnalyticsProviderGameAnalytics::RecordCurrencyPurchase(const FString& GameCurrencyType, int GameCurrencyAmount, const FString& RealCurrencyType, float RealMoneyCost, const FString& PaymentProvider)\n{\n    UE_LOG(LogGameAnalyticsAnalytics, Display, TEXT(\"FAnalyticsProviderGameAnalytics::RecordCurrencyPurchase(const FString& GameCurrencyType, int GameCurrencyAmount, const FString& RealCurrencyType, float RealMoneyCost, const FString& PaymentProvider) - ignoring call. Instead use: FAnalyticsProviderGameAnalytics::RecordCurrencyPurchase(const FString& GameCurrencyType, int GameCurrencyAmount, const TArray<FAnalyticsEventAttribute>& Attributes)\"));\n}\n\nvoid FAnalyticsProviderGameAnalytics::RecordCurrencyPurchase(const FString& GameCurrencyType, int GameCurrencyAmount)\n{\n    UE_LOG(LogGameAnalyticsAnalytics, Display, TEXT(\"FAnalyticsProviderGameAnalytics::RecordCurrencyPurchase(const FString& GameCurrencyType, int GameCurrencyAmount) - ignoring call. Instead use: FAnalyticsProviderGameAnalytics::RecordCurrencyPurchase(const FString& GameCurrencyType, int GameCurrencyAmount, const TArray<FAnalyticsEventAttribute>& Attributes)\"));\n}\n\nvoid FAnalyticsProviderGameAnalytics::RecordCurrencyPurchase(const FString& GameCurrencyType, int GameCurrencyAmount, const TArray<FAnalyticsEventAttribute>& Attributes)\n{\n    FString ItemType;\n    FString ItemId;\n    FString CartType;\n    FString Receipt;\n    FString Signature;\n    bool AutoFetchReceipt = false;\n\n    const int32 AttrCount = Attributes.Num();\n    if (AttrCount > 0)\n    {\n        for (auto Attr : Attributes)\n        {\n            FString AttrString = Attr.AttrName;\n\n            if (Attr.AttrName == TEXT(\"itemType\"))\n            {\n                ItemType = Attr.ToString();\n            }\n            else if (Attr.AttrName == TEXT(\"itemId\"))\n            {\n                ItemId = Attr.ToString();\n            }\n            else if (Attr.AttrName == TEXT(\"cartType\"))\n            {\n                CartType = Attr.ToString();\n            }\n            else if (Attr.AttrName == TEXT(\"receipt\"))\n            {\n                Receipt = Attr.ToString();\n            }\n            else if (Attr.AttrName == TEXT(\"autoFetchReceipt\"))\n            {\n                if (Attr.ToString().ToBool())\n                {\n                    AutoFetchReceipt = true;\n                }\n            }\n            else if (Attr.AttrName == TEXT(\"signature\"))\n            {\n                Signature = Attr.ToString();\n            }\n        }\n\n        if (!ItemType.IsEmpty() && !ItemId.IsEmpty() && !CartType.IsEmpty())\n        {\n#if PLATFORM_ANDROID\n            if (!Receipt.IsEmpty() && !Signature.IsEmpty())\n            {\n                UGameAnalytics::addBusinessEvent(TCHAR_TO_ANSI(*GameCurrencyType), GameCurrencyAmount, TCHAR_TO_ANSI(*ItemType), TCHAR_TO_ANSI(*ItemId), TCHAR_TO_ANSI(*CartType), TCHAR_TO_ANSI(*Receipt), TCHAR_TO_ANSI(*Signature));\n            }\n            else\n            {\n                UGameAnalytics::addBusinessEvent(TCHAR_TO_ANSI(*GameCurrencyType), GameCurrencyAmount, TCHAR_TO_ANSI(*ItemType), TCHAR_TO_ANSI(*ItemId), TCHAR_TO_ANSI(*CartType));\n            }\n#elif PLATFORM_IOS\n            if (!Receipt.IsEmpty())\n            {\n                UGameAnalytics::addBusinessEvent(TCHAR_TO_ANSI(*GameCurrencyType), GameCurrencyAmount, TCHAR_TO_ANSI(*ItemType), TCHAR_TO_ANSI(*ItemId), TCHAR_TO_ANSI(*CartType), TCHAR_TO_ANSI(*Receipt));\n            }\n            else\n            {\n                if(AutoFetchReceipt)\n                {\n                    UGameAnalytics::addBusinessEventAndAutoFetchReceipt(TCHAR_TO_ANSI(*GameCurrencyType), GameCurrencyAmount, TCHAR_TO_ANSI(*ItemType), TCHAR_TO_ANSI(*ItemId), TCHAR_TO_ANSI(*CartType));\n                }\n                else\n                {\n                    UGameAnalytics::addBusinessEvent(TCHAR_TO_ANSI(*GameCurrencyType), GameCurrencyAmount, TCHAR_TO_ANSI(*ItemType), TCHAR_TO_ANSI(*ItemId), TCHAR_TO_ANSI(*CartType));\n                }\n            }\n#elif PLATFORM_MAC || PLATFORM_WINDOWS || PLATFORM_LINUX || PLATFORM_HTML5\n            UGameAnalytics::addBusinessEvent(TCHAR_TO_ANSI(*GameCurrencyType), GameCurrencyAmount, TCHAR_TO_ANSI(*ItemType), TCHAR_TO_ANSI(*ItemId), TCHAR_TO_ANSI(*CartType));\n#endif\n        }\n        else\n        {\n            UE_LOG(LogGameAnalyticsAnalytics, Warning, TEXT(\"FAnalyticsProviderGameAnalytics::RecordCurrencyPurchase wrong usage, for correct usage see: https://github.com/GameAnalytics/GA-SDK-UNREAL/wiki/Business%20Event\"));\n        }\n    }\n    else\n    {\n        UE_LOG(LogGameAnalyticsAnalytics, Warning, TEXT(\"FAnalyticsProviderGameAnalytics::RecordCurrencyPurchase wrong usage, for correct usage see: https://github.com/GameAnalytics/GA-SDK-UNREAL/wiki/Business%20Event\"));\n    }\n}\n\nvoid FAnalyticsProviderGameAnalytics::RecordCurrencyGiven(const FString& GameCurrencyType, int GameCurrencyAmount)\n{\n    UE_LOG(LogGameAnalyticsAnalytics, Display, TEXT(\"GameAnalytics::RecordCurrencyGiven - ignoring call\"));\n}\n\nvoid FAnalyticsProviderGameAnalytics::RecordCurrencyGiven(const FString& GameCurrencyType, int GameCurrencyAmount, const TArray<FAnalyticsEventAttribute>& Attributes)\n{\n    UE_LOG(LogGameAnalyticsAnalytics, Display, TEXT(\"GameAnalytics::RecordCurrencyGiven - ignoring call\"));\n}\n"
  },
  {
    "path": "Plugins/GameAnalytics/Source/GameAnalytics/Public/Foundation/GASingleton.h",
    "content": "#pragma once\n\n#include <memory>\n#include <mutex>\n\n/*!\n\tTemplate class, that implements the sharedInstance/setSharedInstance idom.\n\n\tT mus be default constructable.\n\n\tUsage:\n\n\tclass C : GASingleton<C> {};\n\n\tC::sharedInstance();\n\n\tTODO: maybe we should lock the instance holder?\n*/\ntemplate <class T>\nclass GASingleton\n{\n\tpublic:\n\t\tstatic T* sharedInstance()\n\t\t{\n\n\t\t\t{\n\t\t\t\tstatic std::mutex instanceMutex;\n\t\t\t\tstd::lock_guard<std::mutex> lock(instanceMutex);\n\t\t\t\t\n\t\t\t\tif (!getInstanceHolder())\n\t\t\t\t\tgetInstanceHolder().reset(new T());\n\t\t\t}\n\t\t\treturn getInstanceHolder().get();\n\t\t\t\n\t\t}\n\n\t\tstatic void setSharedInstance(T* instance)\n\t\t{\n\t\t\tgetInstanceHolder.reset(instance);\n\t\t}\n\tprivate:\n\t\tstatic std::unique_ptr<T>& getInstanceHolder()\n\t\t{\n\t\t\tstatic std::unique_ptr<T> instance_;\n\t\t\treturn instance_;\n\t\t}\n};\n"
  },
  {
    "path": "Plugins/GameAnalytics/Source/GameAnalytics/Public/GameAnalytics.h",
    "content": "//\n//  GameAnalytics.h\n//  GA-SDK-IOS\n//\n//  Copyright (c) 2015 GameAnalytics. All rights reserved.\n//\n\n#pragma once\n\n#include <string>\n#include <vector>\n\n#include \"UObject/Object.h\"\n#include \"GameAnalytics.generated.h\"\n\n\nUENUM()\nenum class EGAResourceFlowType : uint8\n{\n    undefined = 0,\n    source = 1,\n    sink = 2\n};\n\nUENUM()\nenum class EGAProgressionStatus : uint8\n{\n    undefined = 0,\n    start = 1,\n    complete = 2,\n    fail = 3\n};\n\nUENUM()\nenum class EGAErrorSeverity : uint8\n{\n    undefined = 0,\n    debug = 1,\n    info = 2,\n    warning = 3,\n    error = 4,\n    critical = 5\n};\n\nUENUM()\nenum class EGAGender : uint8\n{\n    undefined = 0,\n    male = 1,\n    female = 2\n};\n\n\nUCLASS()\nclass GAMEANALYTICS_API UGameAnalytics : public UObject\n{\n    GENERATED_UCLASS_BODY()\n\npublic:\n\n    static void configureAvailableCustomDimensions01(const std::vector<std::string>& list);\n    static void configureAvailableCustomDimensions02(const std::vector<std::string>& list);\n    static void configureAvailableCustomDimensions03(const std::vector<std::string>& list);\n\n    static void configureAvailableResourceCurrencies(const std::vector<std::string>& list);\n    static void configureAvailableResourceItemTypes(const std::vector<std::string>& list);\n\n    static void configureBuild(const char *build);\n    static void configureUserId(const char *userId);\n    static void configureSdkGameEngineVersion(const char *gameEngineSdkVersion);\n    static void configureGameEngineVersion(const char *gameEngineVersion);\n    static void configureWritablePath(const char *writablePath);\n    static void initialize(const char *gameKey, const char *gameSecret);\n\n#if PLATFORM_IOS\n    static void addBusinessEvent(const char *currency, int amount, const char *itemType, const char *itemId, const char *cartType, const char *receipt/*, const char *fields*/);\n    static void addBusinessEventAndAutoFetchReceipt(const char *currency, int amount, const char *itemType, const char *itemId, const char *cartType/*, const char *fields*/);\n#elif PLATFORM_ANDROID\n    static void addBusinessEvent(const char *currency, int amount, const char *itemType, const char *itemId, const char *cartType, const char *receipt, const char *signature/*, const char *fields*/);\n#endif\n\n    static void addBusinessEvent(const char *currency, int amount, const char *itemType, const char *itemId, const char *cartType/*, const char *fields*/);\n    static void addResourceEvent(EGAResourceFlowType flowType, const char *currency, float amount, const char *itemType, const char *itemId/*, const char *fields*/);\n    static void addProgressionEvent(EGAProgressionStatus progressionStatus, const char *progression01/*, const char *fields*/);\n    static void addProgressionEvent(EGAProgressionStatus progressionStatus, const char *progression01, int score/*, const char *fields*/);\n    static void addProgressionEvent(EGAProgressionStatus progressionStatus, const char *progression01, const char *progression02/*, const char *fields*/);\n    static void addProgressionEvent(EGAProgressionStatus progressionStatus, const char *progression01, const char *progression02, int score/*, const char *fields*/);\n    static void addProgressionEvent(EGAProgressionStatus progressionStatus, const char *progression01, const char *progression02, const char *progression03/*, const char *fields*/);\n    static void addProgressionEvent(EGAProgressionStatus progressionStatus, const char *progression01, const char *progression02, const char *progression03, int score/*, const char *fields*/);\n    static void addDesignEvent(const char *eventId/*, const char *fields*/);\n    static void addDesignEvent(const char *eventId, float value/*, const char *fields*/);\n    static void addErrorEvent(EGAErrorSeverity severity, const char *message/*, const char *fields*/);\n\n    static void setEnabledInfoLog(bool flag);\n    static void setEnabledVerboseLog(bool flag);\n    static void setEnabledManualSessionHandling(bool flag);\n    static void setCustomDimension01(const char *customDimension);\n    static void setCustomDimension02(const char *customDimension);\n    static void setCustomDimension03(const char *customDimension);\n    static void setFacebookId(const char *facebookId);\n    static void setGender(EGAGender gender);\n    static void setBirthYear(int birthYear);\n\n    static void startSession();\n    static void endSession();\n\n    static const char* getCommandCenterValueAsString(const char *key);\n    static const char* getCommandCenterValueAsString(const char *key, const char *defaultValue);\n    static bool isCommandCenterReady();\n    static const char* getConfigurationsContentAsString();\n\n    // Own methods\n    static void logGAStateInfo(const TCHAR* Context);\n\n    static void setThreadAndEventTimers(double ThreadWaitSeconds, double ThreadProcessEventsSeconds);\n    static void waitUntilJobsAreDone(); // obviously blocking\n\n\n    // Bluprint functions\n\n    // ONLY FOR IOS\n    UFUNCTION(BlueprintCallable, Category = \"GameAnalytics\")\n    static void AddBusinessEventIOS(const FString& Currency, int Amount, const FString& ItemType, const FString& ItemId, const FString& CartType, const FString& Receipt/*, const char *fields*/);\n\n    // ONLY FOR IOS\n    UFUNCTION(BlueprintCallable, Category = \"GameAnalytics\")\n    static void AddBusinessEventAndAutoFetchReceipt(const FString& Currency, int Amount, const FString& ItemType, const FString& ItemId, const FString& CartType/*, const char *fields*/);\n\n    // ONLY FOR ANDROID\n    UFUNCTION(BlueprintCallable, Category = \"GameAnalytics\")\n    static void AddBusinessEventAndroid(const FString& Currency, int Amount, const FString& ItemType, const FString& ItemId, const FString& CartType, const FString& Receipt, const FString& Signature/*, const char *fields*/);\n\n    UFUNCTION(BlueprintCallable, Category = \"GameAnalytics\")\n    static void AddBusinessEvent(const FString& Currency, int Amount, const FString& ItemType, const FString& ItemId, const FString& CartType/*, const char *fields*/);\n\n    UFUNCTION(BlueprintCallable, Category = \"GameAnalytics\")\n    static void AddResourceEvent(EGAResourceFlowType FlowType, const FString& Currency, float Amount, const FString& ItemType, const FString& ItemId/*, const char *fields*/);\n\n    UFUNCTION(BlueprintCallable, Category = \"GameAnalytics\")\n    static void AddProgressionEventWithOne(EGAProgressionStatus ProgressionStatus, const FString& Progression01/*, const char *fields*/);\n\n    UFUNCTION(BlueprintCallable, Category = \"GameAnalytics\")\n    static void AddProgressionEventWithOneAndScore(EGAProgressionStatus ProgressionStatus, const FString& Progression01, int Score/*, const char *fields*/);\n\n    UFUNCTION(BlueprintCallable, Category = \"GameAnalytics\")\n    static void AddProgressionEventWithOneAndTwo(EGAProgressionStatus ProgressionStatus, const FString& Progression01, const FString& Progression02/*, const char *fields*/);\n\n    UFUNCTION(BlueprintCallable, Category = \"GameAnalytics\")\n    static void AddProgressionEventWithOneTwoAndScore(EGAProgressionStatus ProgressionStatus, const FString& Progression01, const FString& Progression02, int Score/*, const char *fields*/);\n\n    UFUNCTION(BlueprintCallable, Category = \"GameAnalytics\")\n    static void AddProgressionEventWithOneTwoAndThree(EGAProgressionStatus ProgressionStatus, const FString& Progression01, const FString& Progression02, const FString& Progression03/*, const char *fields*/);\n\n    UFUNCTION(BlueprintCallable, Category = \"GameAnalytics\")\n    static void AddProgressionEvenWithOneTwoThreeAndScore(EGAProgressionStatus ProgressionStatus, const FString& Progression01, const FString& Progression02, const FString& Progression03, int Score/*, const char *fields*/);\n\n    UFUNCTION(BlueprintCallable, Category = \"GameAnalytics\")\n    static void AddDesignEvent(const FString& EventId/*, const char *fields*/);\n\n    UFUNCTION(BlueprintCallable, Category = \"GameAnalytics\")\n    static void AddDesignEventWithValue(const FString& EventId, float Value/*, const char *fields*/);\n\n    UFUNCTION(BlueprintCallable, Category = \"GameAnalytics\")\n    static void AddErrorEvent(EGAErrorSeverity Severity, const FString& Message/*, const char *fields*/);\n\n    UFUNCTION(BlueprintCallable, Category = \"GameAnalytics\")\n    static void SetCustomDimension01(const FString& CustomDimension);\n\n    UFUNCTION(BlueprintCallable, Category = \"GameAnalytics\")\n    static void SetCustomDimension02(const FString& CustomDimension);\n\n    UFUNCTION(BlueprintCallable, Category = \"GameAnalytics\")\n    static void SetCustomDimension03(const FString& CustomDimension);\n\n    UFUNCTION(BlueprintCallable, Category = \"GameAnalytics\")\n    static void SetFacebookId(const FString& FacebookId);\n\n    UFUNCTION(BlueprintCallable, Category = \"GameAnalytics\")\n    static void SetGender(EGAGender Gender);\n\n    UFUNCTION(BlueprintCallable, Category = \"GameAnalytics\")\n    static void SetBirthYear(int BirthYear);\n\n    UFUNCTION(BlueprintCallable, Category = \"GameAnalytics\")\n    static FString GetCommandCenterValueAsString(const FString& Key);\n\n    UFUNCTION(BlueprintCallable, Category = \"GameAnalytics\")\n    static FString GetCommandCenterValueAsStringWithDefaultValue(const FString& Key, const FString& DefaultValue);\n\n    UFUNCTION(BlueprintCallable, Category = \"GameAnalytics\")\n    static bool IsCommandCenterReady();\n\n    UFUNCTION(BlueprintCallable, Category = \"GameAnalytics\")\n    static FString GetConfigurationsContentAsString();\n};\n"
  },
  {
    "path": "Plugins/GameAnalytics/Source/GameAnalytics/Public/UEGameAnalytics.h",
    "content": "// Copyright 1998-2015 Epic Games, Inc. All Rights Reserved.\n\n#pragma once\n\n#include \"Interfaces/IAnalyticsProviderModule.h\"\n#include \"CoreMinimal.h\"\n#include \"Misc/Paths.h\"\n#include \"Runtime/Launch/Resources/Version.h\"\n#if ENGINE_MAJOR_VERSION >= 4 && ENGINE_MINOR_VERSION >= 15\n#include \"Modules/ModuleManager.h\"\n#endif\n\nDECLARE_DELEGATE_RetVal(const FString&, FGameAnalyticsBuildOverride);\n\nDECLARE_LOG_CATEGORY_EXTERN(LogGameAnalyticsAnalytics, All, All)\n\nclass IAnalyticsProvider;\n\n/**\n * The public interface to this module\n */\nclass GAMEANALYTICS_API FAnalyticsGameAnalytics :\n    public IAnalyticsProviderModule\n{\n    /** Singleton for analytics */\n    TSharedPtr<IAnalyticsProvider> GameAnalyticsProvider;\n\n    //--------------------------------------------------------------------------\n    // Module functionality\n    //--------------------------------------------------------------------------\npublic:\n\n    /**\n     * Singleton-like access to this module's interface.  This is just for convenience!\n     * Beware of calling this during the shutdown phase, though.  Your module might have been unloaded already.\n     *\n     * @return Returns singleton instance, loading the module on demand if needed\n     */\n    static inline FAnalyticsGameAnalytics& Get()\n    {\n        return FModuleManager::LoadModuleChecked<FAnalyticsGameAnalytics>(\"GameAnalytics\");\n    }\n\n    //--------------------------------------------------------------------------\n    // provider factory functions\n    //--------------------------------------------------------------------------\npublic:\n    /**\n     * IAnalyticsProviderModule interface.\n     * Creates the analytics provider given a configuration delegate.\n     * The keys required exactly match the field names in the Config object.\n     */\n\n#if ENGINE_MAJOR_VERSION >= 4 && ENGINE_MINOR_VERSION >= 13\n    virtual TSharedPtr<IAnalyticsProvider> CreateAnalyticsProvider(const FAnalyticsProviderConfigurationDelegate& GetConfigValue) const override;\n#else\n    virtual TSharedPtr<IAnalyticsProvider> CreateAnalyticsProvider(const FAnalytics::FProviderConfigurationDelegate& GetConfigValue) const override;\n#endif\n\n    static FGameAnalyticsBuildOverride& GetBuildOverride() { return BuildOverride;  }\n\n    struct FGameAnalyticsProjectSettings\n    {\n        FString IosGameKey;\n        FString IosSecretKey;\n        FString IosBuild;\n        FString AndroidGameKey;\n        FString AndroidSecretKey;\n        FString AndroidBuild;\n        FString MacGameKey;\n        FString MacSecretKey;\n        FString MacBuild;\n        FString WindowsGameKey;\n        FString WindowsSecretKey;\n        FString WindowsBuild;\n        FString LinuxGameKey;\n        FString LinuxSecretKey;\n        FString LinuxBuild;\n        FString Html5GameKey;\n        FString Html5SecretKey;\n        FString Html5Build;\n        TArray<FString> CustomDimensions01;\n        TArray<FString> CustomDimensions02;\n        TArray<FString> CustomDimensions03;\n        TArray<FString> ResourceCurrencies;\n        TArray<FString> ResourceItemTypes;\n        bool UseManualSessionHandling;\n        bool SubmitErrors;\n        bool SubmitAverageFPS;\n        bool SubmitCriticalFPS;\n        bool InfoLogEditor;\n        bool InfoLogBuild;\n        bool VerboseLogBuild;\n    };\n\n    static FGameAnalyticsProjectSettings LoadProjectSettings();\n\n\nprivate:\n    virtual void StartupModule() override;\n    virtual void ShutdownModule() override;\n\n    static FORCEINLINE FString GetIniName() { return FString::Printf(TEXT(\"%sDefaultEngine.ini\"), *FPaths::SourceConfigDir()); }\n\nprivate:\n    // If this is set, it will use the value that was overridden for all platforms\n    static FGameAnalyticsBuildOverride BuildOverride;\n};\n"
  },
  {
    "path": "Plugins/GameAnalytics/Source/GameAnalyticsEditor/GameAnalyticsEditor.Build.cs",
    "content": "// Copyright 1998-2014 Epic Games, Inc. All Rights Reserved.\n\nnamespace UnrealBuildTool.Rules\n{\n    public class GameAnalyticsEditor : ModuleRules\n    {\n#if WITH_FORWARDED_MODULE_RULES_CTOR\n        public GameAnalyticsEditor(ReadOnlyTargetRules Target) : base(Target)\n#else\n        public GameAnalyticsEditor(TargetInfo Target)\n#endif\n        {\n            PCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs;\n\n            PrivateDependencyModuleNames.AddRange(\n                new string[]\n                {\n                    \"Core\",\n                    \"CoreUObject\",\n                    \"Engine\",\n                    \"RenderCore\",\n                    \"RHI\",\n                    \"Slate\",\n                    \"SlateCore\",\n                    \"EditorStyle\",\n                    \"EditorWidgets\",\n                    \"DesktopWidgets\",\n                    \"PropertyEditor\",\n                    \"SharedSettingsWidgets\",\n                    \"SourceControl\",\n                    \"UnrealEd\",\n                    \"Http\",\n                    \"Json\",\n                    \"JsonUtilities\",\n\t\t\t\t\t\"InputCore\"\n                }\n            );\n\n            DynamicallyLoadedModuleNames.AddRange(\n                new string[]\n                {\n                    \"Settings\"\n                }\n            );\n\n            PublicIncludePathModuleNames.AddRange(\n                new string[]\n                {\n                    \"Settings\"\n                }\n            );\n        }\n    }\n}"
  },
  {
    "path": "Plugins/GameAnalytics/Source/GameAnalyticsEditor/Private/GameAnalyticsEditor.cpp",
    "content": "#include \"GameAnalyticsEditor.h\"\n\n#include \"GameAnalyticsTargetSettingsCustomization.h\"\n\n#include \"Modules/ModuleInterface.h\"\n#include \"ISettingsModule.h\"\n#include \"Modules/ModuleManager.h\"\n\n#include \"GameAnalyticsProjectSettings.h\"\n\n#define LOCTEXT_NAMESPACE \"GameAnalyticsPlugin\"\n\nvoid FGameAnalyticsEditor::StartupModule()\n{\n    // register settings detail panel customization\n    FPropertyEditorModule& PropertyModule = FModuleManager::LoadModuleChecked<FPropertyEditorModule>(\"PropertyEditor\");\n    PropertyModule.RegisterCustomClassLayout(\n                                             UGameAnalyticsProjectSettings::StaticClass()->GetFName(),\n                                             FOnGetDetailCustomizationInstance::CreateStatic(&FGameAnalyticsTargetSettingsCustomization::MakeInstance)\n                                             );\n\n    PropertyModule.NotifyCustomizationModuleChanged();\n\n    ISettingsModule* SettingsModule = FModuleManager::GetModulePtr<ISettingsModule>(\"Settings\");\n    if( SettingsModule != nullptr )\n    {\n        SettingsModule->RegisterSettings(\n                                         \"Project\", \"Plugins\", \"GameAnalytics\",\n                                         LOCTEXT( \"GameAnalyticsSettingsName\", \"GameAnalytics\" ),\n                                         LOCTEXT( \"GameAnalyticsSettingsDescription\", \"GameAnalytics settings\" ),\n                                         GetMutableDefault< UGameAnalyticsProjectSettings >() );\n    }\n}\n\nvoid FGameAnalyticsEditor::ShutdownModule()\n{\n    ISettingsModule* SettingsModule = FModuleManager::GetModulePtr<ISettingsModule>(\"Settings\");\n    if( SettingsModule != nullptr )\n    {\n        SettingsModule->UnregisterSettings( \"Project\", \"Plugins\", \"GameAnalytics\" );\n    }\n}\n\nIMPLEMENT_MODULE(FGameAnalyticsEditor, GameAnalyticsEditor)\n\n#undef LOCTEXT_NAMESPACE\n"
  },
  {
    "path": "Plugins/GameAnalytics/Source/GameAnalyticsEditor/Private/GameAnalyticsProjectSettings.cpp",
    "content": "// Copyright 1998-2015 Epic Games, Inc. All Rights Reserved.\n\n#include \"GameAnalyticsProjectSettings.h\"\n#include \"GameAnalyticsEditor.h\"\n\n\nUGameAnalyticsProjectSettings::UGameAnalyticsProjectSettings( const FObjectInitializer& ObjectInitializer )\n: Super( ObjectInitializer )\n{\n}"
  },
  {
    "path": "Plugins/GameAnalytics/Source/GameAnalyticsEditor/Private/GameAnalyticsTargetSettingsCustomization.cpp",
    "content": "// Copyright 1998-2015 Epic Games, Inc. All Rights Reserved.\n\n#include \"GameAnalyticsTargetSettingsCustomization.h\"\n#include \"Framework/Text/SlateHyperlinkRun.h\"\n#include \"Framework/MultiBox/MultiBoxBuilder.h\"\n#include \"Widgets/Input/SButton.h\"\n#include \"Widgets/Text/SRichTextBlock.h\"\n#include \"Widgets/Input/SEditableTextBox.h\"\n#include \"DetailLayoutBuilder.h\"\n#include \"DetailCategoryBuilder.h\"\n#include \"PropertyEditing.h\"\n\n#include \"ObjectEditorUtils.h\"\n#include \"IDocumentation.h\"\n#include \"Misc/OutputDevice.h\"\n\n#include \"Json.h\"\n\n#define LOCTEXT_NAMESPACE \"GameAnalyticsTargetSettingsCustomization\"\n\nstatic void OnBrowserLinkClicked(const FSlateHyperlinkRun::FMetadata& Metadata)\n{\n\tconst FString* URL = Metadata.Find(TEXT(\"href\"));\n\n\tif (URL)\n\t{\n\t\tFPlatformProcess::LaunchURL(**URL, nullptr, nullptr);\n\t}\n}\n\nclass HttpCaller\n{\npublic:\n\tvoid Close();\n\tvoid CreateAccountHttp();\n\tvoid OnCreateAccountResponseReceived(FHttpRequestPtr Request, FHttpResponsePtr Response, bool bWasSuccessful);\n\n\tvoid LoginHttp(FName Email, FName Password);\n\tvoid OnLoginResponseReceived(FHttpRequestPtr Request, FHttpResponsePtr Response, bool bWasSuccessful);\n\n\tvoid GetUserDataHttp(FString Token);\n\tvoid OnGetUserDataResponseReceived(FHttpRequestPtr Request, FHttpResponsePtr Response, bool bWasSuccessful);\n\nprivate:\n\tFHttpModule* Http;\n\tbool bIsBusy;\n};\n\nvoid HttpCaller::Close()\n{\n\n}\n\n\n//////////////////////////////////////////////////////////////////////////\n// FGameAnalyticsTargetSettingsCustomization\nnamespace FGameAnalyticsTargetSettingsCustomizationConstants\n{\n\tconst FText DisabledTip = LOCTEXT(\"GitHubSourceRequiredToolTip\", \"This requires GitHub source.\");\n}\n\nTSharedRef<IDetailCustomization> FGameAnalyticsTargetSettingsCustomization::MakeInstance()\n{\n\treturn MakeShareable(new FGameAnalyticsTargetSettingsCustomization);\n}\n\n/*FGameAnalyticsTargetSettingsCustomization::FGameAnalyticsTargetSettingsCustomization()\n{\n}*/\n\nvoid FGameAnalyticsTargetSettingsCustomization::CustomizeDetails(IDetailLayoutBuilder& DetailLayout)\n{\n\tSavedLayoutBuilder = &DetailLayout;\n\n\tIDetailCategoryBuilder& SetupCategory = DetailLayout.EditCategory(TEXT(\"Account\"), FText::GetEmpty(), ECategoryPriority::Variable);\n\tIDetailCategoryBuilder& IosCategory = DetailLayout.EditCategory(TEXT(\"IosSetup\"), FText::GetEmpty(), ECategoryPriority::Variable);\n\tIDetailCategoryBuilder& AndroidCategory = DetailLayout.EditCategory(TEXT(\"AndroidSetup\"), FText::GetEmpty(), ECategoryPriority::Variable);\n    IDetailCategoryBuilder& MacCategory = DetailLayout.EditCategory(TEXT(\"MacSetup\"), FText::GetEmpty(), ECategoryPriority::Variable);\n\tIDetailCategoryBuilder& WindowsCategory = DetailLayout.EditCategory(TEXT(\"WindowsSetup\"), FText::GetEmpty(), ECategoryPriority::Variable);\n    IDetailCategoryBuilder& LinuxCategory = DetailLayout.EditCategory(TEXT(\"LinuxSetup\"), FText::GetEmpty(), ECategoryPriority::Variable);\n    IDetailCategoryBuilder& Html5Category = DetailLayout.EditCategory(TEXT(\"Html5Setup\"), FText::GetEmpty(), ECategoryPriority::Variable);\n\n\tconst FText StudioMenuStringIos = FGameAnalyticsTargetSettingsCustomization::getInstance().SelectedStudioIos.Name.IsEmpty() ? LOCTEXT(\"StudioMenu\", \"Select Studio\") : FText::FromString(FGameAnalyticsTargetSettingsCustomization::getInstance().SelectedStudioIos.Name);\n\tconst FText GameMenuStringIos = FGameAnalyticsTargetSettingsCustomization::getInstance().SelectedGameIos.Name.IsEmpty() ? LOCTEXT(\"GameMenu\", \"Select Game\") : FText::FromString(FGameAnalyticsTargetSettingsCustomization::getInstance().SelectedGameIos.Name);\n\tconst FText StudioMenuStringAndroid = FGameAnalyticsTargetSettingsCustomization::getInstance().SelectedStudioAndroid.Name.IsEmpty() ? LOCTEXT(\"StudioMenu\", \"Select Studio\") : FText::FromString(FGameAnalyticsTargetSettingsCustomization::getInstance().SelectedStudioAndroid.Name);\n\tconst FText GameMenuStringAndroid = FGameAnalyticsTargetSettingsCustomization::getInstance().SelectedGameAndroid.Name.IsEmpty() ? LOCTEXT(\"GameMenu\", \"Select Game\") : FText::FromString(FGameAnalyticsTargetSettingsCustomization::getInstance().SelectedGameAndroid.Name);\n    const FText StudioMenuStringMac = FGameAnalyticsTargetSettingsCustomization::getInstance().SelectedStudioMac.Name.IsEmpty() ? LOCTEXT(\"StudioMenu\", \"Select Studio\") : FText::FromString(FGameAnalyticsTargetSettingsCustomization::getInstance().SelectedStudioMac.Name);\n    const FText GameMenuStringMac = FGameAnalyticsTargetSettingsCustomization::getInstance().SelectedGameMac.Name.IsEmpty() ? LOCTEXT(\"GameMenu\", \"Select Game\") : FText::FromString(FGameAnalyticsTargetSettingsCustomization::getInstance().SelectedGameMac.Name);\n\tconst FText StudioMenuStringWindows = FGameAnalyticsTargetSettingsCustomization::getInstance().SelectedStudioWindows.Name.IsEmpty() ? LOCTEXT(\"StudioMenu\", \"Select Studio\") : FText::FromString(FGameAnalyticsTargetSettingsCustomization::getInstance().SelectedStudioWindows.Name);\n    const FText GameMenuStringWindows = FGameAnalyticsTargetSettingsCustomization::getInstance().SelectedGameWindows.Name.IsEmpty() ? LOCTEXT(\"GameMenu\", \"Select Game\") : FText::FromString(FGameAnalyticsTargetSettingsCustomization::getInstance().SelectedGameWindows.Name);\n    const FText StudioMenuStringLinux = FGameAnalyticsTargetSettingsCustomization::getInstance().SelectedStudioLinux.Name.IsEmpty() ? LOCTEXT(\"StudioMenu\", \"Select Studio\") : FText::FromString(FGameAnalyticsTargetSettingsCustomization::getInstance().SelectedStudioLinux.Name);\n    const FText GameMenuStringLinux = FGameAnalyticsTargetSettingsCustomization::getInstance().SelectedGameLinux.Name.IsEmpty() ? LOCTEXT(\"GameMenu\", \"Select Game\") : FText::FromString(FGameAnalyticsTargetSettingsCustomization::getInstance().SelectedGameLinux.Name);\n    const FText StudioMenuStringHtml5 = FGameAnalyticsTargetSettingsCustomization::getInstance().SelectedStudioHtml5.Name.IsEmpty() ? LOCTEXT(\"StudioMenu\", \"Select Studio\") : FText::FromString(FGameAnalyticsTargetSettingsCustomization::getInstance().SelectedStudioHtml5.Name);\n    const FText GameMenuStringHtml5 = FGameAnalyticsTargetSettingsCustomization::getInstance().SelectedGameHtml5.Name.IsEmpty() ? LOCTEXT(\"GameMenu\", \"Select Game\") : FText::FromString(FGameAnalyticsTargetSettingsCustomization::getInstance().SelectedGameHtml5.Name);\n\tconst FText PlatformMenuString = LOCTEXT(\"PlatformMenu\", \"Select Platform\");\n\n\tSetupCategory.AddCustomRow(LOCTEXT(\"DocumentationInfo\", \"Documentation Info\"), false)\n\t\t.WholeRowWidget\n\t\t[\n\t\t\tSNew(SBorder)\n\t\t\t.Padding(1)\n\t\t\t[\n\t\t\t\tSNew(SHorizontalBox)\n\t\t\t\t+ SHorizontalBox::Slot()\n\t\t\t\t.Padding(FMargin(10, 10, 10, 10))\n\t\t\t\t.FillWidth(1.0f)\n\t\t\t\t[\n\t\t\t\t\tSNew(SRichTextBlock)\n\t\t\t\t\t.Text(LOCTEXT(\"DocumentationInfoMessage\", \"<a id=\\\"browser\\\" href=\\\"http://support.gameanalytics.com\\\" style=\\\"HoverOnlyHyperlink\\\">View the GameAnalytics Unreal documentation here.</> Please login to your GameAnalytics account to automatically retrieve game and secret keys. If you don?t have an account yet, <a id=\\\"browser\\\" href=\\\"https://go.gameanalytics.com/signup\\\" style=\\\"HoverOnlyHyperlink\\\">please sign up to create your account.</>\"))\n\t\t\t\t\t.TextStyle(FEditorStyle::Get(), \"MessageLog\")\n\t\t\t\t\t.DecoratorStyleSet(&FEditorStyle::Get())\n\t\t\t\t\t.AutoWrapText(true)\n\t\t\t\t\t+ SRichTextBlock::HyperlinkDecorator(TEXT(\"browser\"), FSlateHyperlinkRun::FOnClick::CreateStatic(&OnBrowserLinkClicked))\n\t\t\t\t]\n\t\t\t]\n\t\t];\n\n    FString tempUserName = \"\";\n    GConfig->GetString(TEXT(\"/Script/GameAnalyticsEditor.GameAnalyticsProjectSettings\"), TEXT(\"Username\"), tempUserName, GetIniName());\n    Username = FName(*tempUserName);\n\n\tSetupCategory.AddCustomRow(LOCTEXT(\"LoginUserName\", \"Login User Name\"), false)\n\t\t.NameContent()\n\t\t[\n\t\t\tSNew(SHorizontalBox)\n\t\t\t+ SHorizontalBox::Slot()\n\t\t\t.Padding(FMargin(0, 1, 0, 1))\n\t\t\t.FillWidth(1.0f)\n\t\t\t[\n\t\t\t\tSNew(STextBlock)\n\t\t\t\t.Text(LOCTEXT(\"UserNameLabel\", \"User Name\"))\n\t\t\t\t.Font(DetailLayout.GetDetailFont())\n\t\t\t]\n\t\t]\n\t.ValueContent()\n\t\t[\n\t\t\tSNew(SHorizontalBox)\n\t\t\t+ SHorizontalBox::Slot()\n\t\t\t[\n\t\t\t\tSNew(SEditableTextBox)\n\t\t\t\t.Text(FText::FromString(tempUserName))\n\t\t\t\t.ToolTipText(LOCTEXT(\"UserName_Tooltip\", \"Your GameAnalytics account user name.\"))\n\t\t\t\t.OnTextCommitted(this, &FGameAnalyticsTargetSettingsCustomization::UsernameEntered)\n\t\t\t\t.OnTextChanged(this, &FGameAnalyticsTargetSettingsCustomization::UsernameChanged)\n\t\t\t]\n\t\t];\n\n\tSetupCategory.AddCustomRow(LOCTEXT(\"LoginPassword\", \"Login Password\"), false)\n\t\t.NameContent()\n\t\t[\n\t\t\tSNew(SHorizontalBox)\n\t\t\t+ SHorizontalBox::Slot()\n\t\t\t.Padding(FMargin(0, 1, 0, 1))\n\t\t\t.FillWidth(1.0f)\n\t\t\t[\n\t\t\t\tSNew(STextBlock)\n\t\t\t\t.Text(LOCTEXT(\"PasswordLabel\", \"Password\"))\n\t\t\t\t.Font(DetailLayout.GetDetailFont())\n\t\t\t]\n\t\t]\n\t.ValueContent()\n\t\t[\n\t\t\tSNew(SHorizontalBox)\n\t\t\t+ SHorizontalBox::Slot()\n\t\t\t[\n\t\t\t\tSNew(SEditableTextBox)\n\t\t\t\t.Text(LOCTEXT(\"Password\", \"\"))\n\t\t\t\t.ToolTipText(LOCTEXT(\"Password_Tooltip\", \"Your GameAnalytics account password.\"))\n\t\t\t\t.IsPassword(true)\n\t\t\t\t.OnTextCommitted(this, &FGameAnalyticsTargetSettingsCustomization::PasswordEntered)\n\t\t\t\t.OnTextChanged(this, &FGameAnalyticsTargetSettingsCustomization::PasswordChanged)\n\t\t\t]\n\t\t];\n\n\tSetupCategory.AddCustomRow(LOCTEXT(\"LoginButtonRow\", \"Login Button\"), false)\n\t\t.NameContent()\n\t\t[\n\t\t\tSNew(SHorizontalBox)\n\t\t\t+ SHorizontalBox::Slot()\n\t\t\t.Padding(FMargin(0, 1, 0, 1))\n\t\t\t.FillWidth(1.0f)\n\t\t\t[\n\t\t\t\tSNew(STextBlock)\n\t\t\t\t.Text(LOCTEXT(\"LoginButtonLabel\", \"Login\"))\n\t\t\t\t.Font(DetailLayout.GetDetailFont())\n\t\t\t]\n\t\t]\n\t.ValueContent()\n\t\t[\n\t\t\tSNew(SHorizontalBox)\n\t\t\t+ SHorizontalBox::Slot()\n\t\t\t.AutoWidth()\n\t\t\t[\n\t\t\t\tSNew(SButton)\n\t\t\t\t.Text(LOCTEXT(\"LoginButton\", \"Login\"))\n\t\t\t\t.ToolTipText(LOCTEXT(\"LoginButton_Tooltip\", \"Login with your GameAnalytics account and password.\"))\n\t\t\t\t.OnClicked(this, &FGameAnalyticsTargetSettingsCustomization::Login)\n\t\t\t]\n\t\t];\n\n\t//if (FGameAnalyticsTargetSettingsCustomization::getInstance().StudiosAndGames.Num() > 0)\n\t//{\n\tIosCategory.AddCustomRow(LOCTEXT(\"StudiosRow\", \"Studios\"), false)\n\t\t.NameContent()\n\t\t[\n\t\t\tSNew(SHorizontalBox)\n\t\t\t+ SHorizontalBox::Slot()\n\t\t\t.Padding(FMargin(0, 1, 0, 1))\n\t\t\t.FillWidth(1.0f)\n\t\t\t[\n\t\t\t\tSNew(STextBlock)\n\t\t\t\t.Text(LOCTEXT(\"StudiosLabel\", \"Select Studio\"))\n\t\t\t\t.Font(DetailLayout.GetDetailFont())\n\t\t\t]\n\t\t]\n\t.ValueContent()\n\t\t[\n\t\t\tSNew(SHorizontalBox)\n\t\t\t+ SHorizontalBox::Slot()\n\t\t\t.FillWidth(1.0f)\n\t\t\t[\n\t\t\t\tSNew(SComboButton)\n\t\t\t\t//.VAlign(VAlign_Center)\n\t\t\t\t.ToolTipText(LOCTEXT(\"SelectStudioTooltip\", \"Studio\"))\n\t\t\t\t.OnGetMenuContent(this, &FGameAnalyticsTargetSettingsCustomization::UpdateStudiosIos)\n\t\t\t\t.ButtonContent()\n\t\t\t\t[\n\t\t\t\t\tSNew(STextBlock)\n\t\t\t\t\t.Text(StudioMenuStringIos)\n\t\t\t\t\t.Font(IDetailLayoutBuilder::GetDetailFont())\n\t\t\t\t]\n\t\t\t\t.MenuContent()\n\t\t\t\t\t[\n\t\t\t\t\t\tSNew(STextBlock)\n\t\t\t\t\t\t.Text(LOCTEXT(\"LoginToSelectStudioLabel\", \"Login To Select Studio.\"))\n\t\t\t\t\t\t.Font(DetailLayout.GetDetailFont())\n\t\t\t\t\t]\n\t\t\t]\n\t\t];\n\t//}\n\n\tif (!FGameAnalyticsTargetSettingsCustomization::getInstance().SelectedStudioIos.Name.IsEmpty())\n\t{\n\t\tIosCategory.AddCustomRow(LOCTEXT(\"GamesRow\", \"Games\"), false)\n\t\t\t.NameContent()\n\t\t\t[\n\t\t\t\tSNew(SHorizontalBox)\n\t\t\t\t+ SHorizontalBox::Slot()\n\t\t\t\t.Padding(FMargin(0, 1, 0, 1))\n\t\t\t\t.FillWidth(1.0f)\n\t\t\t\t[\n\t\t\t\t\tSNew(STextBlock)\n\t\t\t\t\t.Text(LOCTEXT(\"GamesLabel\", \"Select Game\"))\n\t\t\t\t\t.Font(DetailLayout.GetDetailFont())\n\t\t\t\t]\n\t\t\t]\n\t\t.ValueContent()\n\t\t\t[\n\t\t\t\tSNew(SHorizontalBox)\n\t\t\t\t+ SHorizontalBox::Slot()\n\t\t\t\t.FillWidth(1.0f)\n\t\t\t\t[\n\t\t\t\t\tSNew(SComboButton)\n\t\t\t\t\t.VAlign(VAlign_Center)\n\t\t\t\t\t.ToolTipText(LOCTEXT(\"SelectGameTooltip\", \"Game\"))\n\t\t\t\t\t.OnGetMenuContent(this, &FGameAnalyticsTargetSettingsCustomization::UpdateGamesIos)\n\t\t\t\t\t.ButtonContent()\n\t\t\t\t\t[\n\t\t\t\t\t\tSNew(STextBlock)\n\t\t\t\t\t\t.Text(GameMenuStringIos)\n\t\t\t\t\t\t.Font(IDetailLayoutBuilder::GetDetailFont())\n\t\t\t\t\t]\n\t\t\t\t\t.MenuContent()\n\t\t\t\t\t\t[\n\t\t\t\t\t\t\tSNew(STextBlock)\n\t\t\t\t\t\t\t.Text(LOCTEXT(\"LoginToSelectGameLabel\", \"Please select a Studio.\"))\n\t\t\t\t\t\t\t.Font(DetailLayout.GetDetailFont())\n\t\t\t\t\t\t]\n\t\t\t\t]\n\t\t\t];\n\t}\n\n\t//if (FGameAnalyticsTargetSettingsCustomization::getInstance().StudiosAndGames.Num() > 0)\n\t{\n\tAndroidCategory.AddCustomRow(LOCTEXT(\"StudiosRow\", \"Studios\"), false)\n\t\t.NameContent()\n\t\t[\n\t\t\tSNew(SHorizontalBox)\n\t\t\t+ SHorizontalBox::Slot()\n\t\t\t.Padding(FMargin(0, 1, 0, 1))\n\t\t\t.FillWidth(1.0f)\n\t\t\t[\n\t\t\t\tSNew(STextBlock)\n\t\t\t\t.Text(LOCTEXT(\"StudiosLabel\", \"Select Studio\"))\n\t\t\t\t.Font(DetailLayout.GetDetailFont())\n\t\t\t]\n\t\t]\n\t.ValueContent()\n\t\t[\n\t\t\tSNew(SHorizontalBox)\n\t\t\t+ SHorizontalBox::Slot()\n\t\t\t.FillWidth(1.0f)\n\t\t\t[\n\t\t\t\tSNew(SComboButton)\n\t\t\t\t//.VAlign(VAlign_Center)\n\t\t\t\t.ToolTipText(LOCTEXT(\"SelectStudioTooltip\", \"Studio\"))\n\t\t\t\t.OnGetMenuContent(this, &FGameAnalyticsTargetSettingsCustomization::UpdateStudiosAndroid)\n\t\t\t\t.ButtonContent()\n\t\t\t\t[\n\t\t\t\t\tSNew(STextBlock)\n\t\t\t\t\t.Text(StudioMenuStringAndroid)\n\t\t\t\t\t.Font(IDetailLayoutBuilder::GetDetailFont())\n\t\t\t\t]\n\t\t\t\t.MenuContent()\n\t\t\t\t\t[\n\t\t\t\t\t\tSNew(STextBlock)\n\t\t\t\t\t\t.Text(LOCTEXT(\"LoginToSelectStudioLabel\", \"Login To Select Studio.\"))\n\t\t\t\t\t\t.Font(DetailLayout.GetDetailFont())\n\t\t\t\t\t]\n\t\t\t]\n\t\t];\n\t}\n\n\tif (!FGameAnalyticsTargetSettingsCustomization::getInstance().SelectedStudioAndroid.Name.IsEmpty())\n\t{\n\t\tAndroidCategory.AddCustomRow(LOCTEXT(\"GamesRow\", \"Games\"), false)\n\t\t\t.NameContent()\n\t\t\t[\n\t\t\t\tSNew(SHorizontalBox)\n\t\t\t\t+ SHorizontalBox::Slot()\n\t\t\t\t.Padding(FMargin(0, 1, 0, 1))\n\t\t\t\t.FillWidth(1.0f)\n\t\t\t\t[\n\t\t\t\t\tSNew(STextBlock)\n\t\t\t\t\t.Text(LOCTEXT(\"GamesLabel\", \"Select Game\"))\n\t\t\t\t\t.Font(DetailLayout.GetDetailFont())\n\t\t\t\t]\n\t\t\t]\n\t\t.ValueContent()\n\t\t\t[\n\t\t\t\tSNew(SHorizontalBox)\n\t\t\t\t+ SHorizontalBox::Slot()\n\t\t\t\t.FillWidth(1.0f)\n\t\t\t\t[\n\t\t\t\t\tSNew(SComboButton)\n\t\t\t\t\t.VAlign(VAlign_Center)\n\t\t\t\t\t.ToolTipText(LOCTEXT(\"SelectGameTooltip\", \"Game\"))\n\t\t\t\t\t.OnGetMenuContent(this, &FGameAnalyticsTargetSettingsCustomization::UpdateGamesAndroid)\n\t\t\t\t\t.ButtonContent()\n\t\t\t\t\t[\n\t\t\t\t\t\tSNew(STextBlock)\n\t\t\t\t\t\t.Text(GameMenuStringAndroid)\n\t\t\t\t\t\t.Font(IDetailLayoutBuilder::GetDetailFont())\n\t\t\t\t\t]\n\t\t\t\t\t.MenuContent()\n\t\t\t\t\t\t[\n\t\t\t\t\t\t\tSNew(STextBlock)\n\t\t\t\t\t\t\t.Text(LOCTEXT(\"LoginToSelectGameLabel\", \"Please select a Studio.\"))\n\t\t\t\t\t\t\t.Font(DetailLayout.GetDetailFont())\n\t\t\t\t\t\t]\n\t\t\t\t]\n\t\t\t];\n\t}\n\n    //if (FGameAnalyticsTargetSettingsCustomization::getInstance().StudiosAndGames.Num() > 0)\n    {\n        MacCategory.AddCustomRow(LOCTEXT(\"StudiosRow\", \"Studios\"), false)\n            .NameContent()\n            [\n                SNew(SHorizontalBox)\n                + SHorizontalBox::Slot()\n                .Padding(FMargin(0, 1, 0, 1))\n                .FillWidth(1.0f)\n                [\n                    SNew(STextBlock)\n                    .Text(LOCTEXT(\"StudiosLabel\", \"Select Studio\"))\n                    .Font(DetailLayout.GetDetailFont())\n                ]\n             ]\n        .ValueContent()\n            [\n                SNew(SHorizontalBox)\n                + SHorizontalBox::Slot()\n                .FillWidth(1.0f)\n                [\n                    SNew(SComboButton)\n                    //.VAlign(VAlign_Center)\n                    .ToolTipText(LOCTEXT(\"SelectStudioTooltip\", \"Studio\"))\n                    .OnGetMenuContent(this, &FGameAnalyticsTargetSettingsCustomization::UpdateStudiosMac)\n                    .ButtonContent()\n                    [\n                        SNew(STextBlock)\n                        .Text(StudioMenuStringMac)\n                        .Font(IDetailLayoutBuilder::GetDetailFont())\n                    ]\n                    .MenuContent()\n                        [\n                            SNew(STextBlock)\n                            .Text(LOCTEXT(\"LoginToSelectStudioLabel\", \"Login To Select Studio.\"))\n                            .Font(DetailLayout.GetDetailFont())\n                        ]\n                ]\n             ];\n    }\n\n    if (!FGameAnalyticsTargetSettingsCustomization::getInstance().SelectedStudioMac.Name.IsEmpty())\n    {\n        MacCategory.AddCustomRow(LOCTEXT(\"GamesRow\", \"Games\"), false)\n            .NameContent()\n            [\n                SNew(SHorizontalBox)\n                + SHorizontalBox::Slot()\n                .Padding(FMargin(0, 1, 0, 1))\n                .FillWidth(1.0f)\n                [\n                    SNew(STextBlock)\n                    .Text(LOCTEXT(\"GamesLabel\", \"Select Game\"))\n                    .Font(DetailLayout.GetDetailFont())\n                ]\n            ]\n        .ValueContent()\n            [\n                SNew(SHorizontalBox)\n                + SHorizontalBox::Slot()\n                .FillWidth(1.0f)\n                [\n                    SNew(SComboButton)\n                    .VAlign(VAlign_Center)\n                    .ToolTipText(LOCTEXT(\"SelectGameTooltip\", \"Game\"))\n                    .OnGetMenuContent(this, &FGameAnalyticsTargetSettingsCustomization::UpdateGamesMac)\n                    .ButtonContent()\n                    [\n                        SNew(STextBlock)\n                        .Text(GameMenuStringMac)\n                        .Font(IDetailLayoutBuilder::GetDetailFont())\n                    ]\n                    .MenuContent()\n                    [\n                        SNew(STextBlock)\n                        .Text(LOCTEXT(\"LoginToSelectGameLabel\", \"Please select a Studio.\"))\n                        .Font(DetailLayout.GetDetailFont())\n                    ]\n                ]\n            ];\n    }\n\n\t//if (FGameAnalyticsTargetSettingsCustomization::getInstance().StudiosAndGames.Num() > 0)\n    {\n        WindowsCategory.AddCustomRow(LOCTEXT(\"StudiosRow\", \"Studios\"), false)\n            .NameContent()\n            [\n                SNew(SHorizontalBox)\n                + SHorizontalBox::Slot()\n                .Padding(FMargin(0, 1, 0, 1))\n                .FillWidth(1.0f)\n                [\n                    SNew(STextBlock)\n                    .Text(LOCTEXT(\"StudiosLabel\", \"Select Studio\"))\n                    .Font(DetailLayout.GetDetailFont())\n                ]\n             ]\n        .ValueContent()\n            [\n                SNew(SHorizontalBox)\n                + SHorizontalBox::Slot()\n                .FillWidth(1.0f)\n                [\n                    SNew(SComboButton)\n                    //.VAlign(VAlign_Center)\n                    .ToolTipText(LOCTEXT(\"SelectStudioTooltip\", \"Studio\"))\n                    .OnGetMenuContent(this, &FGameAnalyticsTargetSettingsCustomization::UpdateStudiosWindows)\n                    .ButtonContent()\n                    [\n                        SNew(STextBlock)\n                        .Text(StudioMenuStringWindows)\n                        .Font(IDetailLayoutBuilder::GetDetailFont())\n                    ]\n                    .MenuContent()\n                        [\n                            SNew(STextBlock)\n                            .Text(LOCTEXT(\"LoginToSelectStudioLabel\", \"Login To Select Studio.\"))\n                            .Font(DetailLayout.GetDetailFont())\n                        ]\n                ]\n             ];\n    }\n\n    if (!FGameAnalyticsTargetSettingsCustomization::getInstance().SelectedStudioWindows.Name.IsEmpty())\n    {\n        WindowsCategory.AddCustomRow(LOCTEXT(\"GamesRow\", \"Games\"), false)\n            .NameContent()\n            [\n                SNew(SHorizontalBox)\n                + SHorizontalBox::Slot()\n                .Padding(FMargin(0, 1, 0, 1))\n                .FillWidth(1.0f)\n                [\n                    SNew(STextBlock)\n                    .Text(LOCTEXT(\"GamesLabel\", \"Select Game\"))\n                    .Font(DetailLayout.GetDetailFont())\n                ]\n            ]\n        .ValueContent()\n            [\n                SNew(SHorizontalBox)\n                + SHorizontalBox::Slot()\n                .FillWidth(1.0f)\n                [\n                    SNew(SComboButton)\n                    .VAlign(VAlign_Center)\n                    .ToolTipText(LOCTEXT(\"SelectGameTooltip\", \"Game\"))\n                    .OnGetMenuContent(this, &FGameAnalyticsTargetSettingsCustomization::UpdateGamesWindows)\n                    .ButtonContent()\n                    [\n                        SNew(STextBlock)\n                        .Text(GameMenuStringWindows)\n                        .Font(IDetailLayoutBuilder::GetDetailFont())\n                    ]\n                    .MenuContent()\n                    [\n                        SNew(STextBlock)\n                        .Text(LOCTEXT(\"LoginToSelectGameLabel\", \"Please select a Studio.\"))\n                        .Font(DetailLayout.GetDetailFont())\n                    ]\n                ]\n            ];\n    }\n\n    //if (FGameAnalyticsTargetSettingsCustomization::getInstance().StudiosAndGames.Num() > 0)\n    {\n        LinuxCategory.AddCustomRow(LOCTEXT(\"StudiosRow\", \"Studios\"), false)\n            .NameContent()\n            [\n                SNew(SHorizontalBox)\n                + SHorizontalBox::Slot()\n            .Padding(FMargin(0, 1, 0, 1))\n            .FillWidth(1.0f)\n            [\n                SNew(STextBlock)\n                .Text(LOCTEXT(\"StudiosLabel\", \"Select Studio\"))\n            .Font(DetailLayout.GetDetailFont())\n            ]\n            ]\n        .ValueContent()\n            [\n                SNew(SHorizontalBox)\n                + SHorizontalBox::Slot()\n            .FillWidth(1.0f)\n            [\n                SNew(SComboButton)\n                //.VAlign(VAlign_Center)\n            .ToolTipText(LOCTEXT(\"SelectStudioTooltip\", \"Studio\"))\n            .OnGetMenuContent(this, &FGameAnalyticsTargetSettingsCustomization::UpdateStudiosLinux)\n            .ButtonContent()\n            [\n                SNew(STextBlock)\n                .Text(StudioMenuStringLinux)\n            .Font(IDetailLayoutBuilder::GetDetailFont())\n            ]\n        .MenuContent()\n            [\n                SNew(STextBlock)\n                .Text(LOCTEXT(\"LoginToSelectStudioLabel\", \"Login To Select Studio.\"))\n            .Font(DetailLayout.GetDetailFont())\n            ]\n            ]\n            ];\n    }\n\n    if (!FGameAnalyticsTargetSettingsCustomization::getInstance().SelectedStudioLinux.Name.IsEmpty())\n    {\n        LinuxCategory.AddCustomRow(LOCTEXT(\"GamesRow\", \"Games\"), false)\n            .NameContent()\n            [\n                SNew(SHorizontalBox)\n                + SHorizontalBox::Slot()\n            .Padding(FMargin(0, 1, 0, 1))\n            .FillWidth(1.0f)\n            [\n                SNew(STextBlock)\n                .Text(LOCTEXT(\"GamesLabel\", \"Select Game\"))\n            .Font(DetailLayout.GetDetailFont())\n            ]\n            ]\n        .ValueContent()\n            [\n                SNew(SHorizontalBox)\n                + SHorizontalBox::Slot()\n            .FillWidth(1.0f)\n            [\n                SNew(SComboButton)\n                .VAlign(VAlign_Center)\n            .ToolTipText(LOCTEXT(\"SelectGameTooltip\", \"Game\"))\n            .OnGetMenuContent(this, &FGameAnalyticsTargetSettingsCustomization::UpdateGamesLinux)\n            .ButtonContent()\n            [\n                SNew(STextBlock)\n                .Text(GameMenuStringLinux)\n            .Font(IDetailLayoutBuilder::GetDetailFont())\n            ]\n        .MenuContent()\n            [\n                SNew(STextBlock)\n                .Text(LOCTEXT(\"LoginToSelectGameLabel\", \"Please select a Studio.\"))\n            .Font(DetailLayout.GetDetailFont())\n            ]\n            ]\n            ];\n    }\n\n    //if (FGameAnalyticsTargetSettingsCustomization::getInstance().StudiosAndGames.Num() > 0)\n    {\n        Html5Category.AddCustomRow(LOCTEXT(\"StudiosRow\", \"Studios\"), false)\n            .NameContent()\n            [\n                SNew(SHorizontalBox)\n                + SHorizontalBox::Slot()\n            .Padding(FMargin(0, 1, 0, 1))\n            .FillWidth(1.0f)\n            [\n                SNew(STextBlock)\n                .Text(LOCTEXT(\"StudiosLabel\", \"Select Studio\"))\n            .Font(DetailLayout.GetDetailFont())\n            ]\n            ]\n        .ValueContent()\n            [\n                SNew(SHorizontalBox)\n                + SHorizontalBox::Slot()\n            .FillWidth(1.0f)\n            [\n                SNew(SComboButton)\n                //.VAlign(VAlign_Center)\n            .ToolTipText(LOCTEXT(\"SelectStudioTooltip\", \"Studio\"))\n            .OnGetMenuContent(this, &FGameAnalyticsTargetSettingsCustomization::UpdateStudiosHtml5)\n            .ButtonContent()\n            [\n                SNew(STextBlock)\n                .Text(StudioMenuStringHtml5)\n            .Font(IDetailLayoutBuilder::GetDetailFont())\n            ]\n        .MenuContent()\n            [\n                SNew(STextBlock)\n                .Text(LOCTEXT(\"LoginToSelectStudioLabel\", \"Login To Select Studio.\"))\n            .Font(DetailLayout.GetDetailFont())\n            ]\n            ]\n            ];\n    }\n\n    if (!FGameAnalyticsTargetSettingsCustomization::getInstance().SelectedStudioHtml5.Name.IsEmpty())\n    {\n        Html5Category.AddCustomRow(LOCTEXT(\"GamesRow\", \"Games\"), false)\n            .NameContent()\n            [\n                SNew(SHorizontalBox)\n                + SHorizontalBox::Slot()\n            .Padding(FMargin(0, 1, 0, 1))\n            .FillWidth(1.0f)\n            [\n                SNew(STextBlock)\n                .Text(LOCTEXT(\"GamesLabel\", \"Select Game\"))\n            .Font(DetailLayout.GetDetailFont())\n            ]\n            ]\n        .ValueContent()\n            [\n                SNew(SHorizontalBox)\n                + SHorizontalBox::Slot()\n            .FillWidth(1.0f)\n            [\n                SNew(SComboButton)\n                .VAlign(VAlign_Center)\n            .ToolTipText(LOCTEXT(\"SelectGameTooltip\", \"Game\"))\n            .OnGetMenuContent(this, &FGameAnalyticsTargetSettingsCustomization::UpdateGamesHtml5)\n            .ButtonContent()\n            [\n                SNew(STextBlock)\n                .Text(GameMenuStringHtml5)\n            .Font(IDetailLayoutBuilder::GetDetailFont())\n            ]\n        .MenuContent()\n            [\n                SNew(STextBlock)\n                .Text(LOCTEXT(\"LoginToSelectGameLabel\", \"Please select a Studio.\"))\n            .Font(DetailLayout.GetDetailFont())\n            ]\n            ]\n            ];\n    }\n}\n\nTSharedRef<SWidget> FGameAnalyticsTargetSettingsCustomization::UpdateGamesIos() const\n{\n\tFMenuBuilder GameMenuBuilder(true, NULL);\n\t{\n\t\tGameMenuBuilder.BeginSection(\"Games\");\n\t\t{\n\t\t\tfor (auto& g : FGameAnalyticsTargetSettingsCustomization::getInstance().SelectedStudioIos.Games)\n\t\t\t{\n\t\t\t\tGameMenuBuilder.AddMenuEntry(FText::FromString(g.Name), FText::GetEmpty(), FSlateIcon(), FUIAction(FExecuteAction::CreateSP(this, &FGameAnalyticsTargetSettingsCustomization::OnGameMenuItemClickedIos, g)), NAME_None);\n\t\t\t}\n\t\t}\n\t\tGameMenuBuilder.EndSection();\n\t}\n\n\treturn GameMenuBuilder.MakeWidget();\n}\n\nTSharedRef<SWidget> FGameAnalyticsTargetSettingsCustomization::UpdateGamesAndroid() const\n{\n\tFMenuBuilder GameMenuBuilder(true, NULL);\n\t{\n\t\tGameMenuBuilder.BeginSection(\"Games\");\n\t\t{\n\t\t\tfor (auto& g : FGameAnalyticsTargetSettingsCustomization::getInstance().SelectedStudioAndroid.Games)\n\t\t\t{\n\t\t\t\tGameMenuBuilder.AddMenuEntry(FText::FromString(g.Name), FText::GetEmpty(), FSlateIcon(), FUIAction(FExecuteAction::CreateSP(this, &FGameAnalyticsTargetSettingsCustomization::OnGameMenuItemClickedAndroid, g)), NAME_None);\n\t\t\t}\n\t\t}\n\t\tGameMenuBuilder.EndSection();\n\t}\n\n\treturn GameMenuBuilder.MakeWidget();\n}\n\nTSharedRef<SWidget> FGameAnalyticsTargetSettingsCustomization::UpdateGamesMac() const\n{\n    FMenuBuilder GameMenuBuilder(true, NULL);\n    {\n        GameMenuBuilder.BeginSection(\"Games\");\n        {\n            for (auto& g : FGameAnalyticsTargetSettingsCustomization::getInstance().SelectedStudioMac.Games)\n            {\n                GameMenuBuilder.AddMenuEntry(FText::FromString(g.Name), FText::GetEmpty(), FSlateIcon(), FUIAction(FExecuteAction::CreateSP(this, &FGameAnalyticsTargetSettingsCustomization::OnGameMenuItemClickedMac, g)), NAME_None);\n            }\n        }\n        GameMenuBuilder.EndSection();\n    }\n\n    return GameMenuBuilder.MakeWidget();\n}\n\nTSharedRef<SWidget> FGameAnalyticsTargetSettingsCustomization::UpdateGamesWindows() const\n{\n    FMenuBuilder GameMenuBuilder(true, NULL);\n    {\n        GameMenuBuilder.BeginSection(\"Games\");\n        {\n            for (auto& g : FGameAnalyticsTargetSettingsCustomization::getInstance().SelectedStudioWindows.Games)\n            {\n                GameMenuBuilder.AddMenuEntry(FText::FromString(g.Name), FText::GetEmpty(), FSlateIcon(), FUIAction(FExecuteAction::CreateSP(this, &FGameAnalyticsTargetSettingsCustomization::OnGameMenuItemClickedWindows, g)), NAME_None);\n            }\n        }\n        GameMenuBuilder.EndSection();\n    }\n\n    return GameMenuBuilder.MakeWidget();\n}\n\nTSharedRef<SWidget> FGameAnalyticsTargetSettingsCustomization::UpdateGamesLinux() const\n{\n    FMenuBuilder GameMenuBuilder(true, NULL);\n    {\n        GameMenuBuilder.BeginSection(\"Games\");\n        {\n            for (auto& g : FGameAnalyticsTargetSettingsCustomization::getInstance().SelectedStudioLinux.Games)\n            {\n                GameMenuBuilder.AddMenuEntry(FText::FromString(g.Name), FText::GetEmpty(), FSlateIcon(), FUIAction(FExecuteAction::CreateSP(this, &FGameAnalyticsTargetSettingsCustomization::OnGameMenuItemClickedLinux, g)), NAME_None);\n            }\n        }\n        GameMenuBuilder.EndSection();\n    }\n\n    return GameMenuBuilder.MakeWidget();\n}\n\nTSharedRef<SWidget> FGameAnalyticsTargetSettingsCustomization::UpdateGamesHtml5() const\n{\n    FMenuBuilder GameMenuBuilder(true, NULL);\n    {\n        GameMenuBuilder.BeginSection(\"Games\");\n        {\n            for (auto& g : FGameAnalyticsTargetSettingsCustomization::getInstance().SelectedStudioHtml5.Games)\n            {\n                GameMenuBuilder.AddMenuEntry(FText::FromString(g.Name), FText::GetEmpty(), FSlateIcon(), FUIAction(FExecuteAction::CreateSP(this, &FGameAnalyticsTargetSettingsCustomization::OnGameMenuItemClickedHtml5, g)), NAME_None);\n            }\n        }\n        GameMenuBuilder.EndSection();\n    }\n\n    return GameMenuBuilder.MakeWidget();\n}\n\n\nvoid FGameAnalyticsTargetSettingsCustomization::OnGameMenuItemClickedIos(FGameAnalyticsTargetSettingsCustomization::GAME GameItem)\n{\n\tFGameAnalyticsTargetSettingsCustomization::getInstance().SelectedGameIos = GameItem;\n\n\tUE_LOG(LogTemp, Warning, TEXT(\"Game selected: %s\"), *GameItem.Name);\n\n\tif (!GConfig) return;\n\n\tUGameAnalyticsProjectSettings* GameAnalyticsProjectSettings = GetMutableDefault< UGameAnalyticsProjectSettings >();\n\n\tif (FGameAnalyticsTargetSettingsCustomization::getInstance().SelectedGameIos.GameKey == GameAnalyticsProjectSettings->AndroidGameKey ||\n        FGameAnalyticsTargetSettingsCustomization::getInstance().SelectedGameIos.GameKey == GameAnalyticsProjectSettings->MacGameKey ||\n\t\tFGameAnalyticsTargetSettingsCustomization::getInstance().SelectedGameIos.GameKey == GameAnalyticsProjectSettings->WindowsGameKey ||\n        FGameAnalyticsTargetSettingsCustomization::getInstance().SelectedGameIos.GameKey == GameAnalyticsProjectSettings->LinuxGameKey ||\n        FGameAnalyticsTargetSettingsCustomization::getInstance().SelectedGameIos.GameKey == GameAnalyticsProjectSettings->Html5GameKey)\n\t{\n\t\tUE_LOG(LogTemp, Warning, TEXT(\"This game's keys are already in used. You cannot use the same keys for different platforms.\"));\n\t\treturn;\n\t}\n\n\tFString GameAnalyticsSection = \"/Script/GameAnalyticsEditor.GameAnalyticsProjectSettings\";\n\n\tGConfig->SetString(*GameAnalyticsSection, TEXT(\"IosGameKey\"), *(FGameAnalyticsTargetSettingsCustomization::getInstance().SelectedGameIos.GameKey), GetIniName());\n\tGConfig->SetString(*GameAnalyticsSection, TEXT(\"IosSecretKey\"), *(FGameAnalyticsTargetSettingsCustomization::getInstance().SelectedGameIos.SecretKey), GetIniName());\n\n\tGConfig->Flush(false, GetIniName());\n\n\tUE_LOG(LogTemp, Warning, TEXT(\"Platform selected: iOS, Game Key Saved: %s\"), *(FGameAnalyticsTargetSettingsCustomization::getInstance().SelectedGameIos.GameKey));\n\tUE_LOG(LogTemp, Warning, TEXT(\"Saved at: %s\"), *GetIniName());\n\n\tGameAnalyticsProjectSettings->ReloadConfig(NULL, *GetIniName(), UE4::LCPF_None, NULL);\n\n\tSavedLayoutBuilder->ForceRefreshDetails();\n}\n\nvoid FGameAnalyticsTargetSettingsCustomization::OnGameMenuItemClickedAndroid(FGameAnalyticsTargetSettingsCustomization::GAME GameItem)\n{\n\tFGameAnalyticsTargetSettingsCustomization::getInstance().SelectedGameAndroid = GameItem;\n\n\tUE_LOG(LogTemp, Warning, TEXT(\"Game selected: %s\"), *GameItem.Name);\n\n\tif (!GConfig) return;\n\n\tUGameAnalyticsProjectSettings* GameAnalyticsProjectSettings = GetMutableDefault< UGameAnalyticsProjectSettings >();\n\n\tif (FGameAnalyticsTargetSettingsCustomization::getInstance().SelectedGameAndroid.GameKey == GameAnalyticsProjectSettings->IosGameKey ||\n        FGameAnalyticsTargetSettingsCustomization::getInstance().SelectedGameAndroid.GameKey == GameAnalyticsProjectSettings->MacGameKey ||\n\t\tFGameAnalyticsTargetSettingsCustomization::getInstance().SelectedGameAndroid.GameKey == GameAnalyticsProjectSettings->WindowsGameKey ||\n        FGameAnalyticsTargetSettingsCustomization::getInstance().SelectedGameAndroid.GameKey == GameAnalyticsProjectSettings->LinuxGameKey ||\n        FGameAnalyticsTargetSettingsCustomization::getInstance().SelectedGameAndroid.GameKey == GameAnalyticsProjectSettings->Html5GameKey)\n\t{\n\t\tUE_LOG(LogTemp, Warning, TEXT(\"This game's keys are already in used. You cannot use the same keys for different platforms.\"));\n\t\treturn;\n\t}\n\n\tFString GameAnalyticsSection = \"/Script/GameAnalyticsEditor.GameAnalyticsProjectSettings\";\n\n\tGConfig->SetString(*GameAnalyticsSection, TEXT(\"AndroidGameKey\"), *(FGameAnalyticsTargetSettingsCustomization::getInstance().SelectedGameAndroid.GameKey), GetIniName());\n\n\tGConfig->SetString(*GameAnalyticsSection, TEXT(\"AndroidSecretKey\"), *(FGameAnalyticsTargetSettingsCustomization::getInstance().SelectedGameAndroid.SecretKey), GetIniName());\n\n\tGConfig->Flush(false, GetIniName());\n\n\tUE_LOG(LogTemp, Warning, TEXT(\"Platform selected: Android, Game Key Saved: %s\"), *(FGameAnalyticsTargetSettingsCustomization::getInstance().SelectedGameAndroid.GameKey));\n\tUE_LOG(LogTemp, Warning, TEXT(\"Saved at: %s\"), *GetIniName());\n\n\tGameAnalyticsProjectSettings->ReloadConfig(NULL, *GetIniName(), UE4::LCPF_None, NULL);\n\n\tSavedLayoutBuilder->ForceRefreshDetails();\n}\n\nvoid FGameAnalyticsTargetSettingsCustomization::OnGameMenuItemClickedMac(FGameAnalyticsTargetSettingsCustomization::GAME GameItem)\n{\n    FGameAnalyticsTargetSettingsCustomization::getInstance().SelectedGameMac = GameItem;\n\n    UE_LOG(LogTemp, Warning, TEXT(\"Game selected: %s\"), *GameItem.Name);\n\n    if (!GConfig) return;\n\n    UGameAnalyticsProjectSettings* GameAnalyticsProjectSettings = GetMutableDefault< UGameAnalyticsProjectSettings >();\n\n    if (FGameAnalyticsTargetSettingsCustomization::getInstance().SelectedGameMac.GameKey == GameAnalyticsProjectSettings->IosGameKey ||\n        FGameAnalyticsTargetSettingsCustomization::getInstance().SelectedGameMac.GameKey == GameAnalyticsProjectSettings->AndroidGameKey ||\n\t\tFGameAnalyticsTargetSettingsCustomization::getInstance().SelectedGameMac.GameKey == GameAnalyticsProjectSettings->WindowsGameKey ||\n        FGameAnalyticsTargetSettingsCustomization::getInstance().SelectedGameMac.GameKey == GameAnalyticsProjectSettings->LinuxGameKey ||\n        FGameAnalyticsTargetSettingsCustomization::getInstance().SelectedGameMac.GameKey == GameAnalyticsProjectSettings->Html5GameKey)\n    {\n        UE_LOG(LogTemp, Warning, TEXT(\"This game's keys are already in used. You cannot use the same keys for different platforms.\"));\n        return;\n    }\n\n    FString GameAnalyticsSection = \"/Script/GameAnalyticsEditor.GameAnalyticsProjectSettings\";\n\n    GConfig->SetString(*GameAnalyticsSection, TEXT(\"MacGameKey\"), *(FGameAnalyticsTargetSettingsCustomization::getInstance().SelectedGameMac.GameKey), GetIniName());\n\n    GConfig->SetString(*GameAnalyticsSection, TEXT(\"MacSecretKey\"), *(FGameAnalyticsTargetSettingsCustomization::getInstance().SelectedGameMac.SecretKey), GetIniName());\n\n    GConfig->Flush(false, GetIniName());\n\n    UE_LOG(LogTemp, Warning, TEXT(\"Platform selected: Mac, Game Key Saved: %s\"), *(FGameAnalyticsTargetSettingsCustomization::getInstance().SelectedGameMac.GameKey));\n    UE_LOG(LogTemp, Warning, TEXT(\"Saved at: %s\"), *GetIniName());\n\n    GameAnalyticsProjectSettings->ReloadConfig(NULL, *GetIniName(), UE4::LCPF_None, NULL);\n\n    SavedLayoutBuilder->ForceRefreshDetails();\n}\n\nvoid FGameAnalyticsTargetSettingsCustomization::OnGameMenuItemClickedWindows(FGameAnalyticsTargetSettingsCustomization::GAME GameItem)\n{\n    FGameAnalyticsTargetSettingsCustomization::getInstance().SelectedGameWindows = GameItem;\n\n    UE_LOG(LogTemp, Warning, TEXT(\"Game selected: %s\"), *GameItem.Name);\n\n    if (!GConfig) return;\n\n    UGameAnalyticsProjectSettings* GameAnalyticsProjectSettings = GetMutableDefault< UGameAnalyticsProjectSettings >();\n\n    if (FGameAnalyticsTargetSettingsCustomization::getInstance().SelectedGameWindows.GameKey == GameAnalyticsProjectSettings->IosGameKey ||\n        FGameAnalyticsTargetSettingsCustomization::getInstance().SelectedGameWindows.GameKey == GameAnalyticsProjectSettings->AndroidGameKey ||\n\t\tFGameAnalyticsTargetSettingsCustomization::getInstance().SelectedGameWindows.GameKey == GameAnalyticsProjectSettings->MacGameKey ||\n        FGameAnalyticsTargetSettingsCustomization::getInstance().SelectedGameWindows.GameKey == GameAnalyticsProjectSettings->LinuxGameKey ||\n        FGameAnalyticsTargetSettingsCustomization::getInstance().SelectedGameWindows.GameKey == GameAnalyticsProjectSettings->Html5GameKey)\n    {\n        UE_LOG(LogTemp, Warning, TEXT(\"This game's keys are already in used. You cannot use the same keys for different platforms.\"));\n        return;\n    }\n\n    FString GameAnalyticsSection = \"/Script/GameAnalyticsEditor.GameAnalyticsProjectSettings\";\n\n    GConfig->SetString(*GameAnalyticsSection, TEXT(\"WindowsGameKey\"), *(FGameAnalyticsTargetSettingsCustomization::getInstance().SelectedGameWindows.GameKey), GetIniName());\n\n    GConfig->SetString(*GameAnalyticsSection, TEXT(\"WindowsSecretKey\"), *(FGameAnalyticsTargetSettingsCustomization::getInstance().SelectedGameWindows.SecretKey), GetIniName());\n\n    GConfig->Flush(false, GetIniName());\n\n    UE_LOG(LogTemp, Warning, TEXT(\"Platform selected: Windows, Game Key Saved: %s\"), *(FGameAnalyticsTargetSettingsCustomization::getInstance().SelectedGameWindows.GameKey));\n    UE_LOG(LogTemp, Warning, TEXT(\"Saved at: %s\"), *GetIniName());\n\n    GameAnalyticsProjectSettings->ReloadConfig(NULL, *GetIniName(), UE4::LCPF_None, NULL);\n\n    SavedLayoutBuilder->ForceRefreshDetails();\n}\n\nvoid FGameAnalyticsTargetSettingsCustomization::OnGameMenuItemClickedLinux(FGameAnalyticsTargetSettingsCustomization::GAME GameItem)\n{\n    FGameAnalyticsTargetSettingsCustomization::getInstance().SelectedGameLinux = GameItem;\n\n    UE_LOG(LogTemp, Warning, TEXT(\"Game selected: %s\"), *GameItem.Name);\n\n    if (!GConfig) return;\n\n    UGameAnalyticsProjectSettings* GameAnalyticsProjectSettings = GetMutableDefault< UGameAnalyticsProjectSettings >();\n\n    if (FGameAnalyticsTargetSettingsCustomization::getInstance().SelectedGameLinux.GameKey == GameAnalyticsProjectSettings->IosGameKey ||\n        FGameAnalyticsTargetSettingsCustomization::getInstance().SelectedGameLinux.GameKey == GameAnalyticsProjectSettings->AndroidGameKey ||\n        FGameAnalyticsTargetSettingsCustomization::getInstance().SelectedGameLinux.GameKey == GameAnalyticsProjectSettings->MacGameKey ||\n        FGameAnalyticsTargetSettingsCustomization::getInstance().SelectedGameLinux.GameKey == GameAnalyticsProjectSettings->WindowsGameKey ||\n        FGameAnalyticsTargetSettingsCustomization::getInstance().SelectedGameLinux.GameKey == GameAnalyticsProjectSettings->Html5GameKey)\n    {\n        UE_LOG(LogTemp, Warning, TEXT(\"This game's keys are already in used. You cannot use the same keys for different platforms.\"));\n        return;\n    }\n\n    FString GameAnalyticsSection = \"/Script/GameAnalyticsEditor.GameAnalyticsProjectSettings\";\n\n    GConfig->SetString(*GameAnalyticsSection, TEXT(\"LinuxGameKey\"), *(FGameAnalyticsTargetSettingsCustomization::getInstance().SelectedGameLinux.GameKey), GetIniName());\n\n    GConfig->SetString(*GameAnalyticsSection, TEXT(\"LinuxSecretKey\"), *(FGameAnalyticsTargetSettingsCustomization::getInstance().SelectedGameLinux.SecretKey), GetIniName());\n\n    GConfig->Flush(false, GetIniName());\n\n    UE_LOG(LogTemp, Warning, TEXT(\"Platform selected: Linux, Game Key Saved: %s\"), *(FGameAnalyticsTargetSettingsCustomization::getInstance().SelectedGameLinux.GameKey));\n    UE_LOG(LogTemp, Warning, TEXT(\"Saved at: %s\"), *GetIniName());\n\n    GameAnalyticsProjectSettings->ReloadConfig(NULL, *GetIniName(), UE4::LCPF_None, NULL);\n\n    SavedLayoutBuilder->ForceRefreshDetails();\n}\n\nvoid FGameAnalyticsTargetSettingsCustomization::OnGameMenuItemClickedHtml5(FGameAnalyticsTargetSettingsCustomization::GAME GameItem)\n{\n    FGameAnalyticsTargetSettingsCustomization::getInstance().SelectedGameHtml5 = GameItem;\n\n    UE_LOG(LogTemp, Warning, TEXT(\"Game selected: %s\"), *GameItem.Name);\n\n    if (!GConfig) return;\n\n    UGameAnalyticsProjectSettings* GameAnalyticsProjectSettings = GetMutableDefault< UGameAnalyticsProjectSettings >();\n\n    if (FGameAnalyticsTargetSettingsCustomization::getInstance().SelectedGameHtml5.GameKey == GameAnalyticsProjectSettings->IosGameKey ||\n        FGameAnalyticsTargetSettingsCustomization::getInstance().SelectedGameHtml5.GameKey == GameAnalyticsProjectSettings->AndroidGameKey ||\n        FGameAnalyticsTargetSettingsCustomization::getInstance().SelectedGameHtml5.GameKey == GameAnalyticsProjectSettings->MacGameKey ||\n        FGameAnalyticsTargetSettingsCustomization::getInstance().SelectedGameHtml5.GameKey == GameAnalyticsProjectSettings->LinuxGameKey ||\n        FGameAnalyticsTargetSettingsCustomization::getInstance().SelectedGameHtml5.GameKey == GameAnalyticsProjectSettings->WindowsGameKey)\n    {\n        UE_LOG(LogTemp, Warning, TEXT(\"This game's keys are already in used. You cannot use the same keys for different platforms.\"));\n        return;\n    }\n\n    FString GameAnalyticsSection = \"/Script/GameAnalyticsEditor.GameAnalyticsProjectSettings\";\n\n    GConfig->SetString(*GameAnalyticsSection, TEXT(\"Html5GameKey\"), *(FGameAnalyticsTargetSettingsCustomization::getInstance().SelectedGameHtml5.GameKey), GetIniName());\n\n    GConfig->SetString(*GameAnalyticsSection, TEXT(\"Html5SecretKey\"), *(FGameAnalyticsTargetSettingsCustomization::getInstance().SelectedGameHtml5.SecretKey), GetIniName());\n\n    GConfig->Flush(false, GetIniName());\n\n    UE_LOG(LogTemp, Warning, TEXT(\"Platform selected: Html5, Game Key Saved: %s\"), *(FGameAnalyticsTargetSettingsCustomization::getInstance().SelectedGameHtml5.GameKey));\n    UE_LOG(LogTemp, Warning, TEXT(\"Saved at: %s\"), *GetIniName());\n\n    GameAnalyticsProjectSettings->ReloadConfig(NULL, *GetIniName(), UE4::LCPF_None, NULL);\n\n    SavedLayoutBuilder->ForceRefreshDetails();\n}\n\nTSharedRef<SWidget> FGameAnalyticsTargetSettingsCustomization::UpdateStudiosIos() const\n{\n\tFMenuBuilder StudioMenuBuilder(true, NULL);\n\t{\n\t\tStudioMenuBuilder.BeginSection(\"Studios\");\n\t\t{\n\t\t\tfor (auto& s : FGameAnalyticsTargetSettingsCustomization::getInstance().StudiosAndGames)\n\t\t\t{\n\t\t\t\tStudioMenuBuilder.AddMenuEntry(FText::FromString(s.Name), FText::GetEmpty(), FSlateIcon(), FUIAction(FExecuteAction::CreateSP(this, &FGameAnalyticsTargetSettingsCustomization::OnStudioMenuItemClickedIos, s)), NAME_None);\n\t\t\t}\n\t\t}\n\t\tStudioMenuBuilder.EndSection();\n\t}\n\n\treturn StudioMenuBuilder.MakeWidget();\n}\n\nTSharedRef<SWidget> FGameAnalyticsTargetSettingsCustomization::UpdateStudiosAndroid() const\n{\n\tFMenuBuilder StudioMenuBuilder(true, NULL);\n\t{\n\t\tStudioMenuBuilder.BeginSection(\"Studios\");\n\t\t{\n\t\t\tfor (auto& s : FGameAnalyticsTargetSettingsCustomization::getInstance().StudiosAndGames)\n\t\t\t{\n\t\t\t\tStudioMenuBuilder.AddMenuEntry(FText::FromString(s.Name), FText::GetEmpty(), FSlateIcon(), FUIAction(FExecuteAction::CreateSP(this, &FGameAnalyticsTargetSettingsCustomization::OnStudioMenuItemClickedAndroid, s)), NAME_None);\n\t\t\t}\n\t\t}\n\t\tStudioMenuBuilder.EndSection();\n\t}\n\n\treturn StudioMenuBuilder.MakeWidget();\n}\n\nTSharedRef<SWidget> FGameAnalyticsTargetSettingsCustomization::UpdateStudiosMac() const\n{\n    FMenuBuilder StudioMenuBuilder(true, NULL);\n    {\n        StudioMenuBuilder.BeginSection(\"Studios\");\n        {\n            for (auto& s : FGameAnalyticsTargetSettingsCustomization::getInstance().StudiosAndGames)\n            {\n                StudioMenuBuilder.AddMenuEntry(FText::FromString(s.Name), FText::GetEmpty(), FSlateIcon(), FUIAction(FExecuteAction::CreateSP(this, &FGameAnalyticsTargetSettingsCustomization::OnStudioMenuItemClickedMac, s)), NAME_None);\n            }\n        }\n        StudioMenuBuilder.EndSection();\n    }\n\n    return StudioMenuBuilder.MakeWidget();\n}\n\nTSharedRef<SWidget> FGameAnalyticsTargetSettingsCustomization::UpdateStudiosWindows() const\n{\n    FMenuBuilder StudioMenuBuilder(true, NULL);\n    {\n        StudioMenuBuilder.BeginSection(\"Studios\");\n        {\n            for (auto& s : FGameAnalyticsTargetSettingsCustomization::getInstance().StudiosAndGames)\n            {\n                StudioMenuBuilder.AddMenuEntry(FText::FromString(s.Name), FText::GetEmpty(), FSlateIcon(), FUIAction(FExecuteAction::CreateSP(this, &FGameAnalyticsTargetSettingsCustomization::OnStudioMenuItemClickedWindows, s)), NAME_None);\n            }\n        }\n        StudioMenuBuilder.EndSection();\n    }\n\n    return StudioMenuBuilder.MakeWidget();\n}\n\nTSharedRef<SWidget> FGameAnalyticsTargetSettingsCustomization::UpdateStudiosLinux() const\n{\n    FMenuBuilder StudioMenuBuilder(true, NULL);\n    {\n        StudioMenuBuilder.BeginSection(\"Studios\");\n        {\n            for (auto& s : FGameAnalyticsTargetSettingsCustomization::getInstance().StudiosAndGames)\n            {\n                StudioMenuBuilder.AddMenuEntry(FText::FromString(s.Name), FText::GetEmpty(), FSlateIcon(), FUIAction(FExecuteAction::CreateSP(this, &FGameAnalyticsTargetSettingsCustomization::OnStudioMenuItemClickedLinux, s)), NAME_None);\n            }\n        }\n        StudioMenuBuilder.EndSection();\n    }\n\n    return StudioMenuBuilder.MakeWidget();\n}\n\nTSharedRef<SWidget> FGameAnalyticsTargetSettingsCustomization::UpdateStudiosHtml5() const\n{\n    FMenuBuilder StudioMenuBuilder(true, NULL);\n    {\n        StudioMenuBuilder.BeginSection(\"Studios\");\n        {\n            for (auto& s : FGameAnalyticsTargetSettingsCustomization::getInstance().StudiosAndGames)\n            {\n                StudioMenuBuilder.AddMenuEntry(FText::FromString(s.Name), FText::GetEmpty(), FSlateIcon(), FUIAction(FExecuteAction::CreateSP(this, &FGameAnalyticsTargetSettingsCustomization::OnStudioMenuItemClickedHtml5, s)), NAME_None);\n            }\n        }\n        StudioMenuBuilder.EndSection();\n    }\n\n    return StudioMenuBuilder.MakeWidget();\n}\n\nvoid FGameAnalyticsTargetSettingsCustomization::OnStudioMenuItemClickedIos(FGameAnalyticsTargetSettingsCustomization::STUDIO StudioItem)\n{\n\tFGameAnalyticsTargetSettingsCustomization::getInstance().SelectedStudioIos = StudioItem;\n\n\tFGameAnalyticsTargetSettingsCustomization::GAME Game;\n\tFGameAnalyticsTargetSettingsCustomization::getInstance().SelectedGameIos = Game;\n\n\tUE_LOG(LogTemp, Warning, TEXT(\"iOS Studio selected: %s\"), *StudioItem.Name);\n\n\tSavedLayoutBuilder->ForceRefreshDetails();\n}\n\nvoid FGameAnalyticsTargetSettingsCustomization::OnStudioMenuItemClickedAndroid(FGameAnalyticsTargetSettingsCustomization::STUDIO StudioItem)\n{\n\tFGameAnalyticsTargetSettingsCustomization::getInstance().SelectedStudioAndroid = StudioItem;\n\n\tFGameAnalyticsTargetSettingsCustomization::GAME Game;\n\tFGameAnalyticsTargetSettingsCustomization::getInstance().SelectedGameAndroid = Game;\n\n\tUE_LOG(LogTemp, Warning, TEXT(\"Android Studio selected: %s\"), *StudioItem.Name);\n\n\tSavedLayoutBuilder->ForceRefreshDetails();\n}\n\nvoid FGameAnalyticsTargetSettingsCustomization::OnStudioMenuItemClickedMac(FGameAnalyticsTargetSettingsCustomization::STUDIO StudioItem)\n{\n    FGameAnalyticsTargetSettingsCustomization::getInstance().SelectedStudioMac = StudioItem;\n\n    FGameAnalyticsTargetSettingsCustomization::GAME Game;\n    FGameAnalyticsTargetSettingsCustomization::getInstance().SelectedGameMac = Game;\n\n    UE_LOG(LogTemp, Warning, TEXT(\"Mac Studio selected: %s\"), *StudioItem.Name);\n\n    SavedLayoutBuilder->ForceRefreshDetails();\n}\n\nvoid FGameAnalyticsTargetSettingsCustomization::OnStudioMenuItemClickedWindows(FGameAnalyticsTargetSettingsCustomization::STUDIO StudioItem)\n{\n    FGameAnalyticsTargetSettingsCustomization::getInstance().SelectedStudioWindows = StudioItem;\n\n    FGameAnalyticsTargetSettingsCustomization::GAME Game;\n    FGameAnalyticsTargetSettingsCustomization::getInstance().SelectedGameWindows = Game;\n\n    UE_LOG(LogTemp, Warning, TEXT(\"Windows Studio selected: %s\"), *StudioItem.Name);\n\n    SavedLayoutBuilder->ForceRefreshDetails();\n}\n\nvoid FGameAnalyticsTargetSettingsCustomization::OnStudioMenuItemClickedLinux(FGameAnalyticsTargetSettingsCustomization::STUDIO StudioItem)\n{\n    FGameAnalyticsTargetSettingsCustomization::getInstance().SelectedStudioLinux = StudioItem;\n\n    FGameAnalyticsTargetSettingsCustomization::GAME Game;\n    FGameAnalyticsTargetSettingsCustomization::getInstance().SelectedGameLinux = Game;\n\n    UE_LOG(LogTemp, Warning, TEXT(\"Linux Studio selected: %s\"), *StudioItem.Name);\n\n    SavedLayoutBuilder->ForceRefreshDetails();\n}\n\nvoid FGameAnalyticsTargetSettingsCustomization::OnStudioMenuItemClickedHtml5(FGameAnalyticsTargetSettingsCustomization::STUDIO StudioItem)\n{\n    FGameAnalyticsTargetSettingsCustomization::getInstance().SelectedStudioHtml5 = StudioItem;\n\n    FGameAnalyticsTargetSettingsCustomization::GAME Game;\n    FGameAnalyticsTargetSettingsCustomization::getInstance().SelectedGameHtml5 = Game;\n\n    UE_LOG(LogTemp, Warning, TEXT(\"Html5 Studio selected: %s\"), *StudioItem.Name);\n\n    SavedLayoutBuilder->ForceRefreshDetails();\n}\n\nvoid FGameAnalyticsTargetSettingsCustomization::FillStudiosString(TArray<STUDIO> StudioList)\n{\n\tStudiosAndGames = StudioList;\n\n\t//UE_LOG(LogTemp, Warning, TEXT(\"Studio length: %i\"), StudioList.Num());\n\t//UE_LOG(LogTemp, Warning, TEXT(\"Studio and games length: %i\"), StudiosAndGames.Num());\n}\n\nvoid FGameAnalyticsTargetSettingsCustomization::UsernameChanged(const FText& NewText)\n{\n\tUsernameEntered(NewText, ETextCommit::Default);\n}\n\nvoid FGameAnalyticsTargetSettingsCustomization::UsernameEntered(const FText& NewText, ETextCommit::Type CommitInfo)\n{\n\t{\n\t\tFName NewName = FName(*NewText.ToString());\n\t\t// we should accept NAME_None, that will invalidate \"accpet\" button\n\t\tif (NewName != Username)\n\t\t{\n\t\t\tUsername = NewName;\n\n            UGameAnalyticsProjectSettings* GameAnalyticsProjectSettings = GetMutableDefault< UGameAnalyticsProjectSettings >();\n            FString GameAnalyticsSection = \"/Script/GameAnalyticsEditor.GameAnalyticsProjectSettings\";\n\n            GConfig->SetString(*GameAnalyticsSection, TEXT(\"Username\"), *(Username.ToString()), GetIniName());\n\n            GConfig->Flush(false, GetIniName());\n\n            GameAnalyticsProjectSettings->ReloadConfig(NULL, *GetIniName(), UE4::LCPF_None, NULL);\n\t\t}\n\t}\n}\n\nvoid FGameAnalyticsTargetSettingsCustomization::PasswordChanged(const FText& NewText)\n{\n\tPasswordEntered(NewText, ETextCommit::Default);\n}\n\nvoid FGameAnalyticsTargetSettingsCustomization::PasswordEntered(const FText& NewText, ETextCommit::Type CommitInfo)\n{\n\t{\n\t\tFName NewName = FName(*NewText.ToString());\n\t\t// we should accept NAME_None, that will invalidate \"accpet\" button\n\t\tif (NewName != Password)\n\t\t{\n\t\t\tPassword = NewName;\n\t\t}\n\t}\n}\n\nFReply FGameAnalyticsTargetSettingsCustomization::Login()\n{\n\tHttpCaller* Caller = new HttpCaller();\n\tCaller->LoginHttp(Username, Password);\n\n\treturn FReply::Handled();\n}\n\nvoid HttpCaller::LoginHttp(FName Email, FName Password)\n{\n\tif (!Http)\n\t{\n\t\tHttp = &FHttpModule::Get();\n\t}\n\n\tif (bIsBusy) return;\n\tif (!Http) return;\n\tif (!Http->IsHttpEnabled()) return;\n\n\tbIsBusy = true;\n\n\t//~~~~~~~~~~~~~~~~~~~~~~\n\n\tTSharedRef < IHttpRequest > Request = Http->CreateRequest();\n\n\t/**\n\t* Instantiates a new Http request for the current platform\n\t*\n\t* @return new Http request instance\n\t*/\n\t//virtual TSharedRef CreateRequest();\n\t//~~~~~~~~~~~~~~~\n\n    FString content = \"{\\\"email\\\":\\\"\" + Email.ToString() + \"\\\", \\\"password\\\":\\\"\" + Password.ToString() + \"\\\"}\";\n\n    UE_LOG(LogTemp, Display, TEXT(\"%s\"), *content);\n\n\tRequest->SetVerb(\"POST\");\n\tRequest->SetURL(\"https://userapi.gameanalytics.com/ext/v1/token\");\n\tRequest->SetContentAsString(content);\n\tRequest->SetHeader(\"User-Agent\", \"GameAnalyticsLinkClient/1.0\");\n\tRequest->SetHeader(\"Content-Type\", \"application/x-www-form-urlencoded\");\n\tRequest->SetHeader(\"X-Caller\", \"UnrealEditor\");\n\tRequest->SetHeader(\"X-Caller-Version\", \"1.0.0\"); // Todo : get unreal editor version\n\tRequest->SetHeader(\"X-Caller-Platform\", \"Windows\"); // Todo: get development platform\n\n\tRequest->OnProcessRequestComplete().BindRaw(this, &HttpCaller::OnLoginResponseReceived);\n\n\tif (!Request->ProcessRequest())\n\t{\n\t\tUE_LOG(LogTemp, Warning, TEXT(\"Unable to process HTTP Request!\"));\n\t}\n\n\treturn;\n}\n\nvoid HttpCaller::OnLoginResponseReceived(FHttpRequestPtr Request, FHttpResponsePtr Response, bool bWasSuccessful)\n{\n\tbIsBusy = false;\n\n\tFString MessageBody = \"\";\n\n\t// If HTTP fails client-side, this will still be called but with a NULL shared pointer!\n\tif (!Response.IsValid())\n\t{\n\t\tMessageBody = \"Error: Unable to process HTTP Request!\";\n\t}\n\telse if (EHttpResponseCodes::IsOk(Response->GetResponseCode()))\n\t{\n\t\tMessageBody = Response->GetContentAsString();\n\n\t\tTSharedPtr<FJsonObject> JsonObject;\n\t\tTSharedRef< TJsonReader<TCHAR> > JsonReader = TJsonReaderFactory<TCHAR>::Create(MessageBody);\n\n\t\tif (FJsonSerializer::Deserialize(JsonReader, JsonObject))\n\t\t{\n\t\t\tTArray<TSharedPtr<FJsonValue>> Errors = JsonObject->GetArrayField(TEXT(\"errors\"));\n\n\t\t\tif (Errors.Num() == 0)\n\t\t\t{\n\t\t\t\tTArray<TSharedPtr<FJsonValue>> Results = JsonObject->GetArrayField(TEXT(\"results\"));\n\n\t\t\t\tTSharedPtr<FJsonObject> JsonResults = Results[0]->AsObject();\n\n\t\t\t\tFString Token = JsonResults->GetStringField(TEXT(\"token\"));\n\n\t\t\t\tGetUserDataHttp(Token);\n\n                FMessageDialog::Open(EAppMsgType::Ok, FText::FromString(TEXT(\"Login successful.\\nPlease select your studio below.\")));\n\t\t\t}\n            else\n            {\n                FString errorMessage = \"Login failed:\\n\";\n                for(int i = 0; i < Errors.Num(); ++i)\n                {\n                    TSharedPtr<FJsonObject> JsonResults = Errors[i]->AsObject();\n                    FString msg = JsonResults->GetStringField(TEXT(\"msg\"));\n                    errorMessage += msg + \"\\n\";\n                }\n                FMessageDialog::Open(EAppMsgType::Ok, FText::FromString(errorMessage));\n            }\n\t\t}\n\t}\n\telse\n\t{\n\t\tMessageBody = Response->GetContentAsString();\n\n        TSharedPtr<FJsonObject> JsonObject;\n        TSharedRef< TJsonReader<TCHAR> > JsonReader = TJsonReaderFactory<TCHAR>::Create(MessageBody);\n\n\n        if (FJsonSerializer::Deserialize(JsonReader, JsonObject))\n        {\n            TArray<TSharedPtr<FJsonValue>> Errors = JsonObject->GetArrayField(TEXT(\"errors\"));\n\n            FString errorMessage = \"Login failed:\\n\";\n            for(int i = 0; i < Errors.Num(); ++i)\n            {\n                TSharedPtr<FJsonObject> JsonResults = Errors[i]->AsObject();\n                FString msg = JsonResults->GetStringField(TEXT(\"msg\"));\n                errorMessage += msg + \"\\n\";\n            }\n            FMessageDialog::Open(EAppMsgType::Ok, FText::FromString(errorMessage));\n        }\n        else\n        {\n            FMessageDialog::Open(EAppMsgType::Ok, FText::FromString(TEXT(\"Login failed:\\n\" + MessageBody)));\n        }\n\t}\n\n\t//UE_LOG(LogTemp, Warning, TEXT(\"%s\"), *MessageBody);\n}\n\nvoid HttpCaller::GetUserDataHttp(FString Token)\n{\n\t//UE_LOG(LogTemp, Warning, TEXT(\"START GETUSERDATA!\"));\n\n\tif (!Http)\n\t{\n\t\tHttp = &FHttpModule::Get();\n\t}\n\n\tif (bIsBusy) return;\n\tif (!Http) return;\n\tif (!Http->IsHttpEnabled()) return;\n\n\tbIsBusy = true;\n\n\t//~~~~~~~~~~~~~~~~~~~~~~\n\n\tTSharedRef < IHttpRequest > Request = Http->CreateRequest();\n\n\t/**\n\t* Instantiates a new Http request for the current platform\n\t*\n\t* @return new Http request instance\n\t*/\n\t//virtual TSharedRef CreateRequest();\n\t//~~~~~~~~~~~~~~~\n\n\tRequest->SetVerb(\"GET\");\n\tRequest->SetURL(\"https://userapi.gameanalytics.com/ext/v1/user\");\n\tRequest->SetHeader(\"User-Agent\", \"GameAnalyticsLinkClient/1.0\");\n\tRequest->SetHeader(\"Content-Type\", \"application/x-www-form-urlencoded\");\n\tRequest->SetHeader(\"X-Authorization\", Token);\n\tRequest->SetHeader(\"X-Caller\", \"UnrealEditor\");\n\tRequest->SetHeader(\"X-Caller-Version\", \"1.0.0\"); // Todo : get unreal editor version\n\tRequest->SetHeader(\"X-Caller-Platform\", \"Windows\"); // Todo: get development platform\n\n\tRequest->OnProcessRequestComplete().BindRaw(this, &HttpCaller::OnGetUserDataResponseReceived);\n\n\tif (!Request->ProcessRequest())\n\t{\n\t\tUE_LOG(LogTemp, Warning, TEXT(\"Unable to process HTTP Request!\"));\n\t}\n\n\t//UE_LOG(LogTemp, Warning, TEXT(\"END GETUSERDATA!\"));\n\n\treturn;\n}\n\nvoid HttpCaller::OnGetUserDataResponseReceived(FHttpRequestPtr Request, FHttpResponsePtr Response, bool bWasSuccessful)\n{\n\tbIsBusy = false;\n\n\tFString MessageBody = \"\";\n\n\t// If HTTP fails client-side, this will still be called but with a NULL shared pointer!\n\tif (!Response.IsValid())\n\t{\n\t\tMessageBody = \"Error: Unable to process HTTP Request!\";\n\t}\n\telse if (EHttpResponseCodes::IsOk(Response->GetResponseCode()))\n\t{\n\t\tMessageBody = Response->GetContentAsString();\n\n\t\tTSharedPtr<FJsonObject> JsonObject;\n\t\tTSharedRef< TJsonReader<TCHAR> > JsonReader = TJsonReaderFactory<TCHAR>::Create(MessageBody);\n\n\t\tif (FJsonSerializer::Deserialize(JsonReader, JsonObject))\n\t\t{\n\t\t\tTArray<TSharedPtr<FJsonValue>> Errors = JsonObject->GetArrayField(TEXT(\"errors\"));\n\n\t\t\tif (Errors.Num() == 0)\n\t\t\t{\n\t\t\t\tTArray<TSharedPtr<FJsonValue>> Results = JsonObject->GetArrayField(TEXT(\"results\"));\n\n\t\t\t\tTSharedPtr<FJsonObject> JsonResults = Results[0]->AsObject();\n\n\t\t\t\tTArray<TSharedPtr<FJsonValue>> Studios = JsonResults->GetArrayField(TEXT(\"studios\"));\n\n\t\t\t\tTArray<FGameAnalyticsTargetSettingsCustomization::STUDIO> StudioList;\n\n\t\t\t\tfor (int i = 0; i < Studios.Num(); i++)\n\t\t\t\t{\n\t\t\t\t\tTSharedPtr<FJsonObject> JsonStudio = Studios[i]->AsObject();\n\n\t\t\t\t\tFString StudioName = JsonStudio->GetStringField(TEXT(\"name\"));\n\n\t\t\t\t\tFGameAnalyticsTargetSettingsCustomization::STUDIO Studio;\n\t\t\t\t\tStudio.Name = JsonStudio->GetStringField(TEXT(\"name\"));\n\t\t\t\t\tStudio.Id = (int)JsonStudio->GetNumberField(TEXT(\"id\"));\n\n\t\t\t\t\tTArray<TSharedPtr<FJsonValue>> Games = JsonStudio->GetArrayField(TEXT(\"games\"));\n\n\t\t\t\t\tfor (int u = 0; u < Games.Num(); u++)\n\t\t\t\t\t{\n\t\t\t\t\t\tTSharedPtr<FJsonObject> JsonGame = Games[u]->AsObject();\n\n\t\t\t\t\t\tFGameAnalyticsTargetSettingsCustomization::GAME Game;\n\t\t\t\t\t\tGame.Name = JsonGame->GetStringField(TEXT(\"name\"));\n\t\t\t\t\t\tGame.Id = (int)JsonGame->GetNumberField(TEXT(\"id\"));\n\t\t\t\t\t\tGame.GameKey = JsonGame->GetStringField(TEXT(\"key\"));\n\t\t\t\t\t\tGame.SecretKey = JsonGame->GetStringField(TEXT(\"secret\"));\n\n\t\t\t\t\t\tStudio.Games.Add(Game);\n\t\t\t\t\t}\n\n\t\t\t\t\tStudioList.Add(Studio);\n\t\t\t\t}\n\n\t\t\t\tFGameAnalyticsTargetSettingsCustomization::getInstance().FillStudiosString(StudioList);\n\t\t\t}\n\t\t}\n\t}\n\telse\n\t{\n\t\tMessageBody = Response->GetContentAsString();\n\t}\n\n\t//UE_LOG(LogTemp, Warning, TEXT(\"%s\"), *MessageBody);\n}\n\n//////////////////////////////////////////////////////////////////////////\n\n#undef LOCTEXT_NAMESPACE\n"
  },
  {
    "path": "Plugins/GameAnalytics/Source/GameAnalyticsEditor/Private/GameAnalyticsTargetSettingsCustomization.h",
    "content": "// Copyright 1998-2015 Epic Games, Inc. All Rights Reserved.\n\n#pragma once\n\n#include \"CoreMinimal.h\"\n#include \"Widgets/Input/SComboBox.h\"\n#include \"PropertyEditorModule.h\"\n#include \"GameAnalyticsProjectSettings.h\"\n#include \"IDetailCustomization.h\"\n\n#include \"Http.h\"\n\n//////////////////////////////////////////////////////////////////////////\n// FAndroidTargetSettingsCustomization\n\nclass FGameAnalyticsTargetSettingsCustomization : public IDetailCustomization\n{\npublic:\n\n\tstruct GAME {\n\t\tFString Name;\n\t\tint Id;\n\t\tFString GameKey;\n\t\tFString SecretKey;\n\t};\n\n\tstruct STUDIO {\n\t\tFString Name;\n\t\tint Id;\n\t\tTArray<GAME> Games;\n\n\t\t/*STUDIO (FString aName, int aId, TArray<GAME> aGames) :\n\t\tName(aName), Id(aId), Games(aGames)\n\t\t{\n\t\t}*/\n\t};\n\n\t// Makes a new instance of this detail layout class for a specific detail view requesting it\n\tstatic TSharedRef<IDetailCustomization> MakeInstance();\n\n\t// IDetailCustomization interface\n\tvirtual void CustomizeDetails(IDetailLayoutBuilder& DetailLayout) override;\n\t// End of IDetailCustomization interface\n\n\tvoid UsernameEntered(const FText& NewText, ETextCommit::Type CommitInfo);\n\tvoid UsernameChanged(const FText& NewText);\n\n\tvoid PasswordEntered(const FText& NewText, ETextCommit::Type CommitInfo);\n\tvoid PasswordChanged(const FText& NewText);\n\n\tvoid FillStudiosString(TArray<STUDIO> StudioList);\n\tTSharedRef<SWidget> HandleStudiosComboBoxGenerateWidget(TSharedPtr<FString> StringItem);\n\tvoid HandleStudiosComboBoxSelectionChanged(TSharedPtr<FString> StringItem, ESelectInfo::Type SelectInfo);\n\tFText HandleStudiosComboBoxContentText() const;\n\n\tvoid OpenStudioAndGameSelector();\n\n\tvoid OnStudioMenuItemClickedIos(FGameAnalyticsTargetSettingsCustomization::STUDIO StudioItem);\n\tvoid OnGameMenuItemClickedIos(FGameAnalyticsTargetSettingsCustomization::GAME GameItem);\n\tvoid OnStudioMenuItemClickedAndroid(FGameAnalyticsTargetSettingsCustomization::STUDIO StudioItem);\n\tvoid OnGameMenuItemClickedAndroid(FGameAnalyticsTargetSettingsCustomization::GAME GameItem);\n    void OnStudioMenuItemClickedMac(FGameAnalyticsTargetSettingsCustomization::STUDIO StudioItem);\n    void OnGameMenuItemClickedMac(FGameAnalyticsTargetSettingsCustomization::GAME GameItem);\n\tvoid OnStudioMenuItemClickedWindows(FGameAnalyticsTargetSettingsCustomization::STUDIO StudioItem);\n    void OnGameMenuItemClickedWindows(FGameAnalyticsTargetSettingsCustomization::GAME GameItem);\n    void OnStudioMenuItemClickedLinux(FGameAnalyticsTargetSettingsCustomization::STUDIO StudioItem);\n    void OnGameMenuItemClickedLinux(FGameAnalyticsTargetSettingsCustomization::GAME GameItem);\n    void OnStudioMenuItemClickedHtml5(FGameAnalyticsTargetSettingsCustomization::STUDIO StudioItem);\n    void OnGameMenuItemClickedHtml5(FGameAnalyticsTargetSettingsCustomization::GAME GameItem);\n\npublic:\n\tstatic FGameAnalyticsTargetSettingsCustomization& getInstance()\n\t{\n\t\tstatic FGameAnalyticsTargetSettingsCustomization instance;  // Guaranteed to be destroyed.\n\t\t// Instantiated on first use.\n\t\treturn instance;\n\t}\n\n\tTArray<STUDIO> StudiosAndGames;\n\tSTUDIO SelectedStudioIos;\n\tGAME SelectedGameIos;\n\tSTUDIO SelectedStudioAndroid;\n\tGAME SelectedGameAndroid;\n    STUDIO SelectedStudioMac;\n    GAME SelectedGameMac;\n\tSTUDIO SelectedStudioWindows;\n    GAME SelectedGameWindows;\n    STUDIO SelectedStudioLinux;\n    GAME SelectedGameLinux;\n    STUDIO SelectedStudioHtml5;\n    GAME SelectedGameHtml5;\n\nprivate:\n\tFGameAnalyticsTargetSettingsCustomization() {};\n\n\tFGameAnalyticsTargetSettingsCustomization(FGameAnalyticsTargetSettingsCustomization const&) = delete;\n\tvoid operator=(FGameAnalyticsTargetSettingsCustomization const&) = delete;\n\n\tFReply OpenSetupWizard();\n\tFReply Login();\n\tTSharedRef<SWidget> UpdateStudiosIos() const;\n\tTSharedRef<SWidget> UpdateGamesIos() const;\n\tTSharedRef<SWidget> UpdateStudiosAndroid() const;\n\tTSharedRef<SWidget> UpdateGamesAndroid() const;\n    TSharedRef<SWidget> UpdateStudiosMac() const;\n    TSharedRef<SWidget> UpdateGamesMac() const;\n\tTSharedRef<SWidget> UpdateStudiosWindows() const;\n    TSharedRef<SWidget> UpdateGamesWindows() const;\n    TSharedRef<SWidget> UpdateStudiosLinux() const;\n    TSharedRef<SWidget> UpdateGamesLinux() const;\n    TSharedRef<SWidget> UpdateStudiosHtml5() const;\n    TSharedRef<SWidget> UpdateGamesHtml5() const;\n\n    FORCEINLINE FString GetIniName() const { return FString::Printf(TEXT(\"%sDefaultEngine.ini\"), *FPaths::SourceConfigDir()); }\n\nprivate:\n\tIDetailLayoutBuilder* SavedLayoutBuilder;\n\n\tFHttpModule* Http;\n\tbool bIsBusy;\n\n\tFName Username;\n\tFName Password;\n\n\tTSharedPtr<SComboBox< TSharedPtr<FString> >>\t\tStudiosComboBox;\n\tTArray< TSharedPtr<FString> >\t\t\t\t\t\tStudiosComboBoxString;\n};\n"
  },
  {
    "path": "Plugins/GameAnalytics/Source/GameAnalyticsEditor/Public/GameAnalyticsEditor.h",
    "content": "// Copyright 1998-2014 Epic Games, Inc. All Rights Reserved.\n\n#pragma once\n\n#include \"Modules/ModuleManager.h\"\n\n/**\n* The public interface to this module\n*/\nclass FGameAnalyticsEditor : public IModuleInterface\n{\n/*public:\n\n    static inline FGameAnalyticsEditor& Get()\n    {\n        return FModuleManager::LoadModuleChecked< FGameAnalyticsEditor >(\"GameAnalyticsEditor\");\n    }*/\n\npublic:\n    /** IModuleInterface implementation */\n    void StartupModule();\n    void ShutdownModule();\n};\n"
  },
  {
    "path": "Plugins/GameAnalytics/Source/GameAnalyticsEditor/Public/GameAnalyticsProjectSettings.h",
    "content": "// Copyright 1998-2015 Epic Games, Inc. All Rights Reserved.\n#pragma once\n\n#include \"GameAnalyticsProjectSettings.generated.h\"\n\nUCLASS(config=Engine, defaultconfig)\nclass UGameAnalyticsProjectSettings : public UObject\n{\n    GENERATED_UCLASS_BODY()\n\npublic:\n\n    // Game Key\n    UPROPERTY(Config, EditAnywhere, Category=IosSetup, Meta=(ToolTip=\"Your GameAnalytics iOS Game Key - copy/paste from the GA website or log in to autofill it.\"))\n    FString IosGameKey;\n\n    // Secret Key\n    UPROPERTY(Config, EditAnywhere, Category=IosSetup, Meta=(ToolTip=\"Your GameAnalytics iOS Secret Key - copy/paste from the GA website or log in to autofill it.\"))\n\tFString IosSecretKey;\n\n\t// Build\n\tUPROPERTY(Config, EditAnywhere, Category = IosSetup, Meta=(ToolTip=\"The current version of the iOS game. Updating the build name for each test version of the game will allow you to filter by build when viewing your data on the GA website.\"))\n\tFString IosBuild = \"0.1\";\n\n    // Game Key\n    UPROPERTY(Config, EditAnywhere, Category=AndroidSetup, Meta=(ToolTip=\"Your GameAnalytics Android Game Key - copy/paste from the GA website or log in to autofill it.\"))\n    FString AndroidGameKey;\n\n    // Secret Key\n    UPROPERTY(Config, EditAnywhere, Category=AndroidSetup, Meta=(ToolTip=\"Your GameAnalytics Android Secret Key - copy/paste from the GA website or log in to autofill it.\"))\n    FString AndroidSecretKey;\n\n\t// Build\n\tUPROPERTY(Config, EditAnywhere, Category = AndroidSetup, Meta=(ToolTip=\"The current version of the game. Updating the build name for each test version of the game will allow you to filter by build when viewing your data on the GA website.\"))\n\tFString AndroidBuild = \"0.1\";\n\n    // Game Key\n    UPROPERTY(Config, EditAnywhere, Category=MacSetup, Meta=(ToolTip=\"Your GameAnalytics Mac Game Key - copy/paste from the GA website or log in to autofill it.\"))\n    FString MacGameKey;\n\n    // Secret Key\n    UPROPERTY(Config, EditAnywhere, Category=MacSetup, Meta=(ToolTip=\"Your GameAnalytics Mac Secret Key - copy/paste from the GA website or log in to autofill it.\"))\n    FString MacSecretKey;\n\n    // Build\n    UPROPERTY(Config, EditAnywhere, Category = MacSetup, Meta=(ToolTip=\"The current version of the Mac game. Updating the build name for each test version of the game will allow you to filter by build when viewing your data on the GA website.\"))\n    FString MacBuild = \"0.1\";\n\n\t// Game Key\n    UPROPERTY(Config, EditAnywhere, Category=WindowsSetup, Meta=(ToolTip=\"Your GameAnalytics Windows Game Key - copy/paste from the GA website or log in to autofill it.\"))\n    FString WindowsGameKey;\n\n    // Secret Key\n    UPROPERTY(Config, EditAnywhere, Category=WindowsSetup, Meta=(ToolTip=\"Your GameAnalytics Windows Secret Key - copy/paste from the GA website or log in to autofill it.\"))\n    FString WindowsSecretKey;\n\n    // Build\n    UPROPERTY(Config, EditAnywhere, Category = WindowsSetup, Meta=(ToolTip=\"The current version of the Windows game. Updating the build name for each test version of the game will allow you to filter by build when viewing your data on the GA website.\"))\n    FString WindowsBuild = \"0.1\";\n\n    // Game Key\n    UPROPERTY(Config, EditAnywhere, Category = LinuxSetup, Meta = (ToolTip = \"Your GameAnalytics Linux Game Key - copy/paste from the GA website or log in to autofill it.\"))\n        FString LinuxGameKey;\n\n    // Secret Key\n    UPROPERTY(Config, EditAnywhere, Category = LinuxSetup, Meta = (ToolTip = \"Your GameAnalytics Linux Secret Key - copy/paste from the GA website or log in to autofill it.\"))\n        FString LinuxSecretKey;\n\n    // Build\n    UPROPERTY(Config, EditAnywhere, Category = LinuxSetup, Meta = (ToolTip = \"The current version of the Linux game. Updating the build name for each test version of the game will allow you to filter by build when viewing your data on the GA website.\"))\n        FString LinuxBuild = \"0.1\";\n\n    // Game Key\n    UPROPERTY(Config, EditAnywhere, Category = Html5Setup, Meta = (ToolTip = \"Your GameAnalytics HTML5 Game Key - copy/paste from the GA website or log in to autofill it.\"))\n    FString Html5GameKey;\n\n    // Secret Key\n    UPROPERTY(Config, EditAnywhere, Category = Html5Setup, Meta = (ToolTip = \"Your GameAnalytics HTML5 Secret Key - copy/paste from the GA website or log in to autofill it.\"))\n    FString Html5SecretKey;\n\n    // Build\n    UPROPERTY(Config, EditAnywhere, Category = Html5Setup, Meta = (ToolTip = \"The current version of the HTML5 game. Updating the build name for each test version of the game will allow you to filter by build when viewing your data on the GA website.\"))\n    FString Html5Build = \"0.1\";\n\n    // Custom Dimensions 01\n    UPROPERTY(Config, EditAnywhere, Category=CustomDimensions, Meta=(ToolTip=\"List of custom dimensions 01.\"))\n    TArray<FString> CustomDimensions01;\n\n    // Custom Dimensions 02\n    UPROPERTY(Config, EditAnywhere, Category=CustomDimensions, Meta=(ToolTip=\"List of custom dimensions 02.\"))\n    TArray<FString> CustomDimensions02;\n\n    // Custom Dimensions 03\n    UPROPERTY(Config, EditAnywhere, Category=CustomDimensions, Meta=(ToolTip=\"List of custom dimensions 03.\"))\n    TArray<FString> CustomDimensions03;\n\n    // Resource Currencies\n    UPROPERTY(Config, EditAnywhere, Category=ResourceTypes, Meta=(ToolTip=\"List of Resource Currencies.\"))\n    TArray<FString> ResourceCurrencies;\n\n    // Resource Item Types\n    UPROPERTY(Config, EditAnywhere, Category=ResourceTypes, Meta=(ToolTip=\"List of Resource Item Types.\"))\n    TArray<FString> ResourceItemTypes;\n\n    // Use custom id\n    UPROPERTY(Config, EditAnywhere, Category=Advanced, Meta=(ToolTip=\"Use manual session handling. Manually choose when to end and start a new session. Note initializing of the SDK will automatically start the first session.\"))\n    bool UseManualSessionHandling = false;\n\n    // Submit Errors\n    //UPROPERTY(Config, EditAnywhere, Category=Advanced)\n    //bool SubmitErrors = true;\n\n    // Submit Average Frames Per Second\n    //UPROPERTY(Config, EditAnywhere, Category=Advanced)\n    //bool SubmitAverageFPS = true;\n\n    // Submit Critical Frames Per Second\n    //UPROPERTY(Config, EditAnywhere, Category=Advanced)\n    //bool SubmitCriticalFPS = true;\n\n    // Info Log Editor\n    //UPROPERTY(Config, EditAnywhere, Category=Debug)\n    //bool InfoLogEditor = true;\n\n    // Info Log Build\n    UPROPERTY(Config, EditAnywhere, Category=Debug, Meta=(ToolTip=\"Show info messages from GA in builds (f.x. Xcode for iOS).\"))\n    bool InfoLogBuild = true;\n\n    // Verbose Log Build\n    UPROPERTY(Config, EditAnywhere, Category=Debug, Meta=(ToolTip=\"Show full info messages from GA in builds (f.x. Xcode for iOS). Noet that this option includes long JSON messages sent to the server.\"))\n    bool VerboseLogBuild = false;\n};\n"
  },
  {
    "path": "Plugins/GameAnalytics/open_default_ga_dir.bat",
    "content": "explorer.exe %localappdata%\\GameAnalytics\n"
  },
  {
    "path": "Plugins/GameAnalytics/open_default_ga_dir.sh",
    "content": "#!/bin/bash\n\nxdg-open \"$HOME/.GameAnalytics/\"\n"
  },
  {
    "path": "Plugins/NotYetLoadingScreen/.gitignore",
    "content": "Binaries/\nIntermediate/"
  },
  {
    "path": "Plugins/NotYetLoadingScreen/Config/FilterPlugin.ini",
    "content": "[FilterPlugin]\n; This section lists additional files which will be packaged along with your plugin. Paths should be listed relative to the root plugin directory, and\n; may include \"...\", \"*\", and \"?\" wildcards to match directories, files, and individual characters respectively.\n;\n; Examples:\n;    /README.txt\n;    /Extras/...\n;    /Binaries/ThirdParty/*.dll\n"
  },
  {
    "path": "Plugins/NotYetLoadingScreen/NotYetLoadingScreen.uplugin",
    "content": "{\n  \"FileVersion\": 3,\n\n  \"Version\": 1,\n  \"VersionName\": \"1.0\",\n  \"FriendlyName\": \"Loading Screen\",\n  \"Description\": \"A simple loading screen plug-in.\",\n  \"Category\": \"Loading\",\n  \"CreatedBy\": \"Epic Games, Inc.\",\n  \"CreatedByURL\": \"https://www.epicgames.com\",\n  \"DocsURL\": \"https://github.com/ue4plugins/LoadingScreen\",\n  \"SupportURL\": \"https://github.com/ue4plugins/LoadingScreen/issues\",\n  \"EngineVersion\": \"4.22.0\",\n  \"EnabledByDefault\": false,\n  \"CanContainContent\": true,\n  \"Modules\": [\n    {\n      \"Name\": \"NotYetLoadingScreen\",\n      \"Type\": \"Runtime\",\n      \"LoadingPhase\": \"PreLoadingScreen\",\n\t  \"WhitelistPlatforms\": [\"Win64\", \"Win32\", \"Linux\", \"XboxOne\", \"Switch\"]\n    }\n  ]\n}\n"
  },
  {
    "path": "Plugins/NotYetLoadingScreen/README.md",
    "content": "# LoadingScreen\n\nUnreal Engine 4 plug-in that adds a simplified layer on top of the loading screen system\nto make it easier to add a loading screen.\n\n![Screenshot](Docs/screenshot.png)\n\n\n## About\n\nThe LoadingScreen plug-in implements a module that allows you to configure a simple\nLoading Screen system in the engine.  To goal is to make it more customizable over \ntime to avoid needing to write a new loading screen manually.\n\n\n## Supported Platforms\n\nThis plug-in was last built against **Unreal Engine 4.16**. It works on all platforms (probably).\n\n\n## Dependencies\n\nThis plug-in requires Visual Studio and either a C++ code project or a the full\nUnreal Engine 4 source code from GitHub. If you are new to programming in UE4,\nplease see the official [Programming Guide](https://docs.unrealengine.com/latest/INT/Programming/index.html)! \n\n\n## Usage\n\nYou can use this plug-in as a project plug-in, or an Engine plug-in.\n\nIf you use it as a project plug-in, clone this repository into your project's\n*/Plugins* directory and compile your game in Visual Studio. A C++ code project\nis required for this to work.\n\nIf you use it as an Engine plug-in, clone this repository into the\n*/Engine/Plugins/Media* directory and compile your game. Full Unreal Engine 4\nsource code from GitHub (4.12 or higher) is required for this.\n\nAfter compiling the plug-in, you have to **enable it** in Unreal Editor's\nplug-in browser.\n\n![plugin](Docs/plugins.png)\n\n\n## Support\n\n**Note: This plugin is not supported by Epic Games.**\n\nPlease [file an issue](https://github.com/nickdarnell/LoadingScreen/issues),\nsubmit a [pull request](https://github.com/nickdarnell/LoadingScreen/pulls?q=is%3Aopen+is%3Apr)\nor hit me up on twitter [@NickDarnell](https://twitter.com/NickDarnell)\n\n\n## References\n\n* [Introduction to UE4 Plugins](https://wiki.unrealengine.com/An_Introduction_to_UE4_Plugins)\n"
  },
  {
    "path": "Plugins/NotYetLoadingScreen/Source/NotYetLoadingScreen/NotYetLoadingScreen.Build.cs",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\nusing System;\nusing System.IO;\nusing UnrealBuildTool;\n\n\npublic class NotYetLoadingScreen : ModuleRules\n{\n\n\n\t//\n\t// DEBUG\n\t//\n\n\n\tpublic NotYetLoadingScreen(ReadOnlyTargetRules Target)\n\t\t: base(Target)\n\t{\n\t\tConsole.WriteLine(\"Using NotYetLoadingScreen.Build.cs\");\n\n\t\tPCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs;\n\t\tbEnforceIWYU = true;\n\n\t\tPublicIncludePaths.AddRange(\n\t\t\tnew string[] {\n\t\t\t\tPath.Combine(ModuleDirectory, \"Public\")\n\t\t\t\t// ... add public include paths required here ...\n\t\t\t});\n\n\n\t\tPrivateIncludePaths.AddRange(\n\t\t\tnew string[] {\n\t\t\t\tPath.Combine(ModuleDirectory, \"Private\")\n\t\t\t\t// ... add other private include paths required here ...\n\t\t\t});\n\n\t\tPublicDependencyModuleNames.AddRange(\n\t\t\tnew string[]\n\t\t\t{\n\t\t\t\t\"Core\",\n\t\t\t\t\"CoreUObject\",\n\t\t\t\t\"MoviePlayer\",\n\t\t\t\t\"Slate\",\n\t\t\t\t\"SlateCore\",\n\t\t\t\t\"InputCore\",\n\t\t\t\t\"RenderCore\",\n\t\t\t\t\"Engine\",\n\t\t\t\t\"RHI\"\n\t\t\t});\n\n\t\tif (Target.bBuildEditor == true)\n\t\t{\n\t\t\tPrivateDependencyModuleNames.Add(\"UnrealEd\");\n\t\t}\n\n\t\t// DEBUG FLAGS\n\t}\n\n\tstatic string BoolToIntString(bool value)\n\t{\n\t\treturn value ? \"1\" : \"0\";\n\t}\n}\n"
  },
  {
    "path": "Plugins/NotYetLoadingScreen/Source/NotYetLoadingScreen/Private/NYLoadingScreenInstance.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#include \"NYLoadingScreenInstance.h\"\n#include \"Rendering/SlateRenderer.h\"\n#include \"Framework/Application/SlateApplication.h\"\n#include \"Widgets/Layout/SBorder.h\"\n#include \"Widgets/Layout//SDPIScaler.h\"\n#include \"Engine/Engine.h\"\n#include \"Engine/GameViewportClient.h\"\n#include \"Widgets/SVirtualWindow.h\"\n#include \"MoviePlayer.h\"\n\n#include \"Widgets/SNYSimpleLoadingScreen.h\"\n#include \"Widgets/SNYLoadingScreenDefaultBorder.h\"\n#include \"Widgets/SWeakWidget.h\"\n#include \"Containers/Ticker.h\"\n\n#if WITH_EDITOR\n#include \"Editor.h\"\n#endif // WITH_EDITOR\n\nDEFINE_LOG_CATEGORY_STATIC(LogNYLoadingScreenInstance, All, All);\n\n\n// Only enable movie player for some platform\n//#define NY_USE_UNREAL_LOADING_SCREEN (PLATFORM_WINDOWS || PLATFORM_LINUX || PLATFORM_SWITCH || PLATFORM_XBOX_ONE)\n#define NY_USE_UNREAL_LOADING_SCREEN 1\n\nTSharedPtr<FNYLoadingScreenInstance> FNYLoadingScreenInstance::Instance = nullptr;\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nTSharedPtr<FNYLoadingScreenInstance> FNYLoadingScreenInstance::Get()\n{\n\tif (!Instance.IsValid())\n\t\tCreate();\n\n\treturn Instance;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFNYLoadingScreenInstance::FNYLoadingScreenInstance()\n{\n\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFNYLoadingScreenInstance::~FNYLoadingScreenInstance()\n{\n\tif (bInitialized)\n\t{\n\t\t// This should not happen if initialize was called correctly.  This is a fallback to ensure that the movie player rendering tickable gets unregistered on the rendering thread correctly\n\t\t//Shutdown();\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FNYLoadingScreenInstance::Initialize()\n{\n\tif (bInitialized)\n\t{\n\t\tUE_LOG(LogNYLoadingScreenInstance, Warning, TEXT(\"Initialize: already initializeed\"));\n\t\treturn;\n\t}\n\n\tif (IsRunningDedicatedServer() || IsRunningCommandlet())\n\t{\n\t\tUE_LOG(LogNYLoadingScreenInstance, Warning, TEXT(\"Initialize: Can't, running in wrong context\"));\n\t\treturn;\n\t}\n\n\tFSlateRenderer* Renderer = FSlateApplication::Get().GetRenderer();\n\tif (!Renderer)\n\t{\n\t\tUE_LOG(LogNYLoadingScreenInstance, Warning, TEXT(\"Initialize: Can't get FSlateRenderer\"));\n\t\treturn;\n\t}\n\n\tUE_LOG(LogNYLoadingScreenInstance, Log, TEXT(\"Initialize\"));\n\tGetMutableDefault<UNYLoadingScreenSettings>()->GetWorldTransitionScreen().AsyncLoad();\n\tbInitialized = true;\n\n\t// Listen to core events\n\tFCoreUObjectDelegates::PreLoadMap.AddRaw(this, &Self::OnPreLoadMap);\n\tFCoreUObjectDelegates::PostLoadMapWithWorld.AddRaw(this, &Self::OnPostLoadMap);\n\tFCoreDelegates::OnPreExit.AddRaw(this, &Self::OnPreExit);\n\n#if WITH_EDITOR\n\tFEditorDelegates::EndPIE.AddLambda([this](bool bIsSimulating)\n\t{\n\t\t// Reset the viewport because it will be invalid anyways\n\t\tWidgetPtrGameViewport.Reset();\n\t});\n#endif // WITH_EDITOR\n\n\t// Listen to Movie player events\n#if NY_USE_UNREAL_LOADING_SCREEN\n\tif (IsMoviePlayerEnabled())\n\t{\n\t\tIGameMoviePlayer* MoviePlayer = GetSafeMoviePlayer();\n\n\t\tif (bAutoShowLoadingScreen)\n\t\t{\n\t\t\tDelegatePrepareLoadingScreen = MoviePlayer->OnPrepareLoadingScreen().AddRaw(this, &Self::HandleMoviePrepareLoadingScreen);\n\t\t}\n\n\t\tMoviePlayer->OnMoviePlaybackStarted().AddRaw(this, &Self::HandleMoviePlaybackStarted);\n\t\tMoviePlayer->OnMoviePlaybackFinished().AddRaw(this, &Self::HandleMoviePlaybackFinished);\n\t\tMoviePlayer->OnMovieClipFinished().AddRaw(this, &Self::HandleMovieClipFinished);\n\t}\n\telse\n\t{\n#if  WITH_EDITOR\n\t\tUE_LOG(LogNYLoadingScreenInstance, Log, TEXT(\"Initialize: Movie player is not enabled!\"));\n#else\n\t\tUE_LOG(LogNYLoadingScreenInstance, Warning, TEXT(\"Initialize: Movie player is not enabled!\"));\n#endif\n\t}\n#endif // NY_USE_UNREAL_LOADING_SCREEN\n\n\t// Prepare the startup screen, the PrepareLoadingScreen callback won't be called\n\t// if we've already explicitly setup the loading screen.\n\t// TODO: this seems to be useless if we load directly in the MainMenuLevel\n\t//if (Settings->bHasStartupScreen)\n\t//{\n\t\t//BeginLoadingScreen(Settings->StartupScreen);\n\t//}\n\n\t//\n\t// Create UI\n\t//\n\n\t// Create widgets\n\tWidgetLoadingScreenRootContainer =\n\t\tSNew(SNYLoadingScreenDefaultBorder)\n\t\t.OnKeyDown(this, &Self::OnLoadingScreenKeyDown)\n\t\t[\n\t\t\t//SNew(SOverlay)\n\t\t\t//+SOverlay::Slot()\n\t\t\t//[\n\t\t\t\t//SAssignNew(UserWidgetDPIScaler, SDPIScaler)\n\t\t\t\t//[\n\t\t\t\t\tSAssignNew(WidgetLoadingScreenContainer, SBorder)\n\t\t\t\t\t.BorderImage(FCoreStyle::Get().GetBrush(TEXT(\"NoBorder\")))\n\t\t\t\t\t.Padding(0)\n\t\t\t\t//]\n\t\t\t//]\n\t\t];\n\n\tRedrawLoadingScreenWidget();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FNYLoadingScreenInstance::RedrawLoadingScreenWidget()\n{\n\t// Reset and start again\n\t// WidgetLoadingScreen.Reset();\n\t// SAssignNew(WidgetLoadingScreen, SNYSimpleLoadingScreen, ScreenDescription);\n\n\tconst FNYLoadingScreenDescription& ScreenDescription = GetMutableDefault<UNYLoadingScreenSettings>()->GetWorldTransitionScreen();\n\tif (WidgetLoadingScreen.IsValid())\n\t{\n\t\tWidgetLoadingScreen->SetWaitForAnyKeyInput(bWaitForAnyKeyInput);\n\t\tWidgetLoadingScreen->Redraw(ScreenDescription);\n\t}\n\telse\n\t{\n\t\tSAssignNew(WidgetLoadingScreen, SNYSimpleLoadingScreen, ScreenDescription);\n\t\tWidgetLoadingScreen->SetWaitForAnyKeyInput(bWaitForAnyKeyInput);\n\t}\n\n\tWidgetLoadingScreenContainer->SetContent(WidgetLoadingScreen.ToSharedRef());\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FNYLoadingScreenInstance::TestShowWidget()\n{\n\tRedrawLoadingScreenWidget();\n\tAddSlateWidgetToGameViewport();\n\tWidgetLoadingScreenRootContainer->SetVisibility(EVisibility::Visible);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FNYLoadingScreenInstance::TestHideWidget()\n{\n\tWidgetLoadingScreenRootContainer->SetVisibility(EVisibility::Hidden);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FNYLoadingScreenInstance::Shutdown()\n{\n\tUE_LOG(LogNYLoadingScreenInstance, Verbose, TEXT(\"Shutdown\"));\n\n\t//HideLoadingScreen();\n\tbInitialized = false;\n\tbIsMoviePlaying = false;\n\tbIsTransitioningWorlds = false;\n\tbWaitForAnyKeyInput = false;\n\tbGotAnyKeyInput = false;\n\n\tWidgetLoadingScreenRootContainer.Reset();\n\tWidgetLoadingScreenContainer.Reset();\n\tWidgetDPIScaler.Reset();\n\tWidgetLoadingScreen.Reset();\n\tWidgetPtrGameViewport.Reset();\n\n\tFCoreDelegates::OnPreExit.RemoveAll(this);\n\tFCoreUObjectDelegates::PreLoadMap.RemoveAll(this);\n\tFCoreUObjectDelegates::PostLoadMapWithWorld.RemoveAll(this);\n\n\t// Clear movie listeners\n#if NY_USE_UNREAL_LOADING_SCREEN\n\tIGameMoviePlayer* MoviePlayer = GetSafeMoviePlayer();\n\tMoviePlayer->OnPrepareLoadingScreen().RemoveAll(this);\n\tMoviePlayer->OnMoviePlaybackStarted().RemoveAll(this);\n\tMoviePlayer->OnMoviePlaybackFinished().RemoveAll(this);\n\tMoviePlayer->OnMovieClipFinished().RemoveAll(this);\n#endif\n\n\tDelegatePrepareLoadingScreen.Reset();\n\n\tDestroy();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUGameViewportClient* FNYLoadingScreenInstance::GetGameViewportClient() const\n{\n\tif (!GEngine)\n\t\treturn nullptr;\n\n\treturn GEngine->GameViewport;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool FNYLoadingScreenInstance::Tick(float DeltaTime)\n{\n\t// Focus this widget to get input\n#if !WITH_EDITOR\n\tif (bWaitForAnyKeyInput)\n\t{\n\t\tif (!IsThisFocused())\n\t\t\tFocusThis();\n\t}\n#endif // !WITH_EDITOR\n\n\treturn true;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool FNYLoadingScreenInstance::IsThisFocused() const\n{\n\tif (!WidgetLoadingScreenRootContainer.IsValid())\n\t\treturn false;\n\n\tTSharedPtr<SWidget> FocusedWidget = FSlateApplication::Get().GetUserFocusedWidget(0);\n\treturn FocusedWidget == WidgetLoadingScreenRootContainer;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FNYLoadingScreenInstance::FocusThis()\n{\n\tif (!bWaitForAnyKeyInput)\n\t\treturn;\n\n\tif (!WidgetLoadingScreenRootContainer.IsValid())\n\t\treturn;\n\n\t// NOTE: this is only for singleplayer games with one player\n\tif (IsThisFocused())\n\t{\n\t\t// Similar\n\t\tUE_LOG(LogNYLoadingScreenInstance, Warning, TEXT(\"FocusThis: We already have this widget focused. Ignoring.\"));\n\t\treturn;\n\t}\n\t// TODO animation\n\n\tPreviousFocusedWidget = FSlateApplication::Get().GetUserFocusedWidget(0);\n\n\tUE_LOG(\n\t\tLogNYLoadingScreenInstance,\n\t\tVerbose,\n\t\tTEXT(\"FocusThis: PreviousFocusedWidget = %s\"),\n\t\tPreviousFocusedWidget.IsValid() ? *PreviousFocusedWidget->ToString() : TEXT(\"nullptr\")\n\t);\n\tFSlateApplication::Get().SetAllUserFocus(WidgetLoadingScreenRootContainer);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FNYLoadingScreenInstance::FocusReturnToUser()\n{\n\t//UGameEngine* GameEngine = Cast<UGameEngine>(GEngine);\n\t//if (GameEngine && !GIsRequestingExit)\n\t//{\n\t//\tGameEngine->SwitchGameWindowToUseGameViewport();\n\t//}\n\n\tif (PreviousFocusedWidget.IsValid())\n\t{\n\t\tFSlateApplication::Get().SetAllUserFocus(PreviousFocusedWidget);\n\t}\n\telse\n\t{\n\t\tUE_LOG(LogNYLoadingScreenInstance, Log, TEXT(\"FocusReturnToUser: PreviousFocusedWidget is invalid, nothing to return to\"));\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool FNYLoadingScreenInstance::ShowLoadingScreen(bool bInPlayUntilStopped, float InPlayTime)\n{\n\t// TOOD use this bPlayUntilStopped\n\tbPlayUntilStopped = bInPlayUntilStopped;\n\tPlayTime = InPlayTime;\n\n\tverify(bInitialized);\n\tUE_LOG(LogNYLoadingScreenInstance, Verbose, TEXT(\"ShowLoadingScreen\"));\n\tif (WidgetDPIScaler.IsValid())\n\t{\n\t\tWidgetDPIScaler->SetDPIScale(GetViewportDPIScale());\n\t}\n\n\t// Start movie if not already\n\t//ShowMovieLoadingScreen();\n\tShowSlateLoadingScreen();\n\n\tbGotAnyKeyInput = false;\n\tSetWaitForAnyKeyInput(false, false);\n\n\treturn true;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool FNYLoadingScreenInstance::HideLoadingScreen()\n{\n\tUE_LOG(LogNYLoadingScreenInstance, Verbose, TEXT(\"HideLoadingScreen (bUserCalledStart = %d)\"), bUserCalledShow);\n\tif (!CanHideLoadingScreen())\n\t{\n\t\tUE_LOG(LogNYLoadingScreenInstance, Warning, TEXT(\"HideLoadingScreen: Can't get hide loading screen because we are waiting for user input. See SetWaitForAnyKeyInput.\"));\n\t\treturn false;\n\t}\n\n\t// Hide Movie and slate\n#if NY_USE_UNREAL_LOADING_SCREEN\n\tHideMovieLoadingScreen();\n#endif\n\tHideSlateLoadingScreen();\n\n\t// Focus Return back to viewport\n\tFocusReturnToUser();\n\n\tbUserCalledShow = false;\n\tbGotAnyKeyInput = false;\n\tSetWaitForAnyKeyInput(false, false);\n\n\treturn true;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FNYLoadingScreenInstance::OnPreLoadMap(const FString& LevelName)\n{\n\tUE_LOG(LogNYLoadingScreenInstance, Verbose, TEXT(\"OnPreLoadMap: Map = %s\"), *LevelName);\n\tbIsTransitioningWorlds = true;\n\n\t// NOTE: not needed here if we don't use our own slate implementation\n\tif (bAutoShowLoadingScreen)\n\t{\n\t\tUE_LOG(LogNYLoadingScreenInstance, Verbose, TEXT(\"OnPreLoadMap: ShowLoadingScreen()\"), *LevelName);\n\t\tShowLoadingScreen();\n\t\tbUserCalledShow = false;\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FNYLoadingScreenInstance::OnPostLoadMap(UWorld* LoadedWorld)\n{\n\tUE_LOG(LogNYLoadingScreenInstance, Verbose, TEXT(\"OnPostLoadMap: Map = %s\"), *LoadedWorld->GetMapName());\n\tbIsTransitioningWorlds = false;\n\n\t// Most likely we are in editor, anyways finish loading\n#if NY_USE_UNREAL_LOADING_SCREEN\n\tif (!HasMoviePlayer())\n\t{\n\t\tFinishMoviePlaying();\n\t}\n#endif\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FNYLoadingScreenInstance::OnPreExit()\n{\n\tShutdown();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFReply FNYLoadingScreenInstance::OnLoadingScreenKeyDown(const FGeometry& Geometry, const FKeyEvent& KeyEvent)\n{\n\t//UE_LOG(LogNYLoadingScreenInstance, Verbose, TEXT(\"OnLoadingScreenKeyDown: Key = %s\"), *KeyEvent.GetKey().GetFName().ToString());\n\t// Stop alt tab bug\n\tconst bool bIsBlacklistedKey = KeyEvent.GetKey() == EKeys::LeftAlt;\n\tif (bIsBlacklistedKey || bIsMoviePlaying || bIsTransitioningWorlds || !IsLoadingScreenVisible() || !IsThisFocused())\n\t\treturn FReply::Handled();\n\n\tif (bWaitForAnyKeyInput)\n\t{\n\t\tbGotAnyKeyInput = true;\n\t}\n\n\treturn FReply::Handled();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FNYLoadingScreenInstance::SetWaitForAnyKeyInput(bool bInValue, bool bFocus)\n{\n\tif (bWaitForAnyKeyInput == bInValue)\n\t\treturn;\n\n\tbWaitForAnyKeyInput = bInValue;\n\tWidgetLoadingScreen->SetWaitForAnyKeyInput(bWaitForAnyKeyInput);\n\n\t// Focus our widget so what we accept input\n\tif (bFocus)\n\t\tFocusThis();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FNYLoadingScreenInstance::SetWaitForAnyKeyInputData(TSoftObjectPtr<UTexture2D> Image, FText Title, FText Description)\n{\n\tUNYLoadingScreenSettings* Settings = GetMutableDefault<UNYLoadingScreenSettings>();\n\t// TODO: if it is a reference here we must switch back the image\n\tFNYLoadingScreenDescription ScreenDescription = Settings->GetWorldTransitionScreen();\n\n\t// Replace first image\n\tif (ScreenDescription.Images.Num()/* && Image.IsValid()*/) // no is valid check cause maybe it is not loaded yet\n\t\tScreenDescription.Images[0].Image = Image;\n\n\tScreenDescription.Loading.TitleText.Text = Title;\n\tScreenDescription.Loading.DescriptionText.Text = Description;\n\tScreenDescription.AsyncLoad();\n\t// Settings->SaveConfig();\n\tWidgetLoadingScreen->Redraw(ScreenDescription);\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FNYLoadingScreenInstance::UpdateLoadingScreenTip(FText Tip)\n{\n\tUNYLoadingScreenSettings* Settings = GetMutableDefault<UNYLoadingScreenSettings>();\n\tFNYLoadingScreenDescription ScreenDescription = Settings->GetWorldTransitionScreen();\n\n\tScreenDescription.Loading.LoadingText.NormalText.Text = Tip;\n\t\n\tScreenDescription.AsyncLoad();\n\tWidgetLoadingScreen->Redraw(ScreenDescription);\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool FNYLoadingScreenInstance::CanHideLoadingScreen() const\n{\n\treturn bWaitForAnyKeyInput ? bGotAnyKeyInput : true;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FNYLoadingScreenInstance::SetAutoShowLoadingScreen(bool bInValue)\n{\n#if NY_USE_UNREAL_LOADING_SCREEN\n\t// TODO do we need this?\n\tcheckNoEntry();\n\tbAutoShowLoadingScreen = bInValue;\n\tif (!HasMoviePlayer())\n\t\treturn;\n\n\tif (bAutoShowLoadingScreen)\n\t{\n\t\t// Register\n\t\tif (!DelegatePrepareLoadingScreen.IsValid())\n\t\t{\n\t\t\tDelegatePrepareLoadingScreen = GetSafeMoviePlayer()->OnPrepareLoadingScreen().AddRaw(this, &Self::HandleMoviePrepareLoadingScreen);\n\t\t}\n\t}\n\telse\n\t{\n\t\t// Unregister\n\t\tGetSafeMoviePlayer()->OnPrepareLoadingScreen().Remove(DelegatePrepareLoadingScreen);\n\t\tDelegatePrepareLoadingScreen.Reset();\n\t}\n#endif\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool FNYLoadingScreenInstance::IsSlateLoadingScreenVisible() const\n{\n\treturn WidgetLoadingScreenRootContainer.IsValid() ? WidgetLoadingScreenRootContainer->GetVisibility() == EVisibility::Visible : false;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool FNYLoadingScreenInstance::ShowSlateLoadingScreen()\n{\n\tUE_LOG(LogNYLoadingScreenInstance, Log, TEXT(\"ShowSlateLoadingScreen\"));\n\tif (IsSlateLoadingScreenVisible())\n\t{\n\t\tUE_LOG(LogNYLoadingScreenInstance, Log, TEXT(\"ShowSlateLoadingScreen: Loading screen already showing. Ignoring\"));\n\t\treturn true;\n\t}\n\n\tAddSlateWidgetToGameViewport();\n\tWidgetLoadingScreenRootContainer->SetVisibility(EVisibility::Visible);\n\n\treturn true;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool FNYLoadingScreenInstance::AddSlateWidgetToGameViewport()\n{\n\tUGameViewportClient* GameViewport = GetGameViewportClient();\n\tif (!GameViewport)\n\t{\n\t\tUE_LOG(LogNYLoadingScreenInstance, Warning, TEXT(\"AddSlateWidgetToGameViewport: Can't get GameViewportClient\"));\n\t\treturn false;\n\t}\n\n\t// Add it for the first time\n\t// NOTE: in editor builds this also gets reset on PIE end\n\t// NOTE: if we don't reset it the focus won't work anymore\n\t// TODO: find out why the fucking gameviewport changes? This Reset is here so that we fix the focus issues\n\tRedrawLoadingScreenWidget();\n\tWidgetPtrGameViewport.Reset();\n\t// if (!WidgetPtrGameViewport.IsValid())\n\t{\n\t\t// NOTE: Don't ever remove the widget from the game viewport otherwise we can't focus it\n\t\tWidgetPtrGameViewport = SNew(SWeakWidget)\n\t\t\t.PossiblyNullContent(WidgetLoadingScreenRootContainer.ToSharedRef());\n\t\tGameViewport->AddViewportWidgetContent(WidgetPtrGameViewport.ToSharedRef(), 9999999);\n\t}\n\n\treturn true;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool FNYLoadingScreenInstance::HideSlateLoadingScreen()\n{\n\tUE_LOG(LogNYLoadingScreenInstance, Log, TEXT(\"HideSlateLoadingScreen\"));\n\tif (!IsSlateLoadingScreenVisible())\n\t{\n\t\tUE_LOG(LogNYLoadingScreenInstance, Warning, TEXT(\"HideSlateLoadingScreen: Loading screen is not showing\"));\n\t\treturn false;\n\t}\n\n\t// Own loading screen\n\tWidgetLoadingScreenRootContainer->SetVisibility(EVisibility::Hidden);\n\treturn true;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool FNYLoadingScreenInstance::ShowMovieLoadingScreen()\n{\n#if NY_USE_UNREAL_LOADING_SCREEN\n\tUE_LOG(LogNYLoadingScreenInstance, Log, TEXT(\"ShowMovieLoadingScreen\"));\n\tif (!HasMoviePlayer() || bIsMoviePlaying || bIsTransitioningWorlds)\n\t\treturn false;\n\n\t// Setup loading screen first\n\tSetupMovieLoadingScreen();\n\treturn GetSafeMoviePlayer()->PlayMovie();\n#else\n\treturn false;\n#endif\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool FNYLoadingScreenInstance::HideMovieLoadingScreen()\n{\n#if NY_USE_UNREAL_LOADING_SCREEN\n\tUE_LOG(LogNYLoadingScreenInstance, Log, TEXT(\"HideMovieLoadingScreen\"));\n\tif (!HasMoviePlayer() || !bIsMoviePlaying || bIsTransitioningWorlds)\n\t\treturn false;\n\n\tGetSafeMoviePlayer()->StopMovie();\n\tGetSafeMoviePlayer()->SetupLoadingScreen(FLoadingScreenAttributes{});\n\treturn true;\n#else\n\treturn false;\n#endif\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool FNYLoadingScreenInstance::IsMovieLoadingScreenVisible() const\n{\n\tif (!HasMoviePlayer())\n\t\treturn false;\n\n\treturn bIsMoviePlaying;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FNYLoadingScreenInstance::SetupMovieLoadingScreen()\n{\n#if NY_USE_UNREAL_LOADING_SCREEN\n\tUE_LOG(LogNYLoadingScreenInstance, Log, TEXT(\"SetupMovieLoadingScreen\"));\n\tFLoadingScreenAttributes LoadingScreen;\n\tif (bUserCalledShow)\n\t{\n\t\tLoadingScreen.bAutoCompleteWhenLoadingCompletes = true; // !bPlayUntilStopped;\n\t\tLoadingScreen.bMoviesAreSkippable = false;\n\t\tLoadingScreen.bWaitForManualStop = false; // bPlayUntilStopped;\n\t\tLoadingScreen.MinimumLoadingScreenDisplayTime = PlayTime;\n\n\t\t// This may causes a crash if is set to true\n\t\tLoadingScreen.bAllowEngineTick = false; // bPlayUntilStopped;\n\t}\n\telse\n\t{\n\t\t// Automatic\n\t\tLoadingScreen.bAutoCompleteWhenLoadingCompletes = true;\n\t\tLoadingScreen.MinimumLoadingScreenDisplayTime = 1.f;\n\t}\n\tLoadingScreen.bAllowInEarlyStartup = false;\n\tLoadingScreen.WidgetLoadingScreen = WidgetLoadingScreenRootContainer; // SNullWidget::NullWidget;\n\n\tif (!LoadingScreen.IsValid())\n\t{\n\t\tUE_LOG(LogNYLoadingScreenInstance, Warning, TEXT(\"SetupMovieLoadingScreen: We don't have any valid FLoadingScreenAttributes attributes, configure it properly!\"));\n\t}\n\n\tGetSafeMoviePlayer()->SetupLoadingScreen(LoadingScreen);\n#endif // NY_USE_UNREAL_LOADING_SCREEN\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nIGameMoviePlayer* FNYLoadingScreenInstance::GetSafeMoviePlayer() const\n{\n\tIGameMoviePlayer* MoviePlayer = GetMoviePlayer();\n\tverify(MoviePlayer);\n\treturn MoviePlayer;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool FNYLoadingScreenInstance::HasMoviePlayer() const\n{\n\treturn GetMoviePlayer() != nullptr && IsMoviePlayerEnabled();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FNYLoadingScreenInstance::HandleMoviePrepareLoadingScreen()\n{\n\tUE_LOG(LogNYLoadingScreenInstance, Log, TEXT(\"HandleMoviePrepareLoadingScreen\"));\n\tSetupMovieLoadingScreen();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FNYLoadingScreenInstance::HandleMoviePlaybackStarted()\n{\n\tUE_LOG(LogNYLoadingScreenInstance, Log, TEXT(\"HandleMoviePlaybackStarted\"));\n\tbIsMoviePlaying = true;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FNYLoadingScreenInstance::HandleMoviePlaybackFinished()\n{\n\tUE_LOG(LogNYLoadingScreenInstance, Log, TEXT(\"HandleMoviePlaybackFinished\"));\n\tbIsMoviePlaying = false;\n\tFinishMoviePlaying();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FNYLoadingScreenInstance::FinishMoviePlaying()\n{\n\t// Show loading screen after map transition\n\tif (IsSlateLoadingScreenVisible())\n\t{\n\t\tif (bUserCalledShow)\n\t\t{\n\t\t\tUE_LOG(LogNYLoadingScreenInstance, Log, TEXT(\"FinishMoviePlaying: Showing loading screen again because user did not finish the loading.\"));\n\t\t\tShowLoadingScreen();\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// Hide our own implementation because it start was called automatically\n\t\t\tUE_LOG(LogNYLoadingScreenInstance, Log, TEXT(\"FinishMoviePlaying: Hiding loading screen again because the movie loading screen finished\"));\n\t\t\tHideLoadingScreen();\n\t\t}\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FNYLoadingScreenInstance::HandleMovieClipFinished(const FString& MovieName)\n{\n\tUE_LOG(LogNYLoadingScreenInstance, Log, TEXT(\"HandleMovieClipFinished: MovieName = %s\"), *MovieName);\n}\n\n#undef NY_USE_UNREAL_LOADING_SCREEN\n"
  },
  {
    "path": "Plugins/NotYetLoadingScreen/Source/NotYetLoadingScreen/Private/NYLoadingScreenInstance.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#pragma once\n\n#include \"CoreMinimal.h\"\n#include \"NYLoadingScreenSettings.h\"\n#include \"INYLoadingScreenInstance.h\"\n#include \"Containers/Ticker.h\"\n\nclass UGameViewportClient;\nclass SVirtualWindow;\nclass SWidget;\nclass SDPIScaler;\nclass SBorder;\nclass SNYSimpleLoadingScreen;\nclass IGameMoviePlayer;\n\n// Class created out of frustration because all loading screen tutorials online are retarded\n// And FDefaultGameMoviePlayer is not much better\n// TODO maybe add one day movie support\nclass NOTYETLOADINGSCREEN_API FNYLoadingScreenInstance : public INYLoadingScreenInstance, public TSharedFromThis<FNYLoadingScreenInstance>, public FTickerObjectBase\n{\n\ttypedef FNYLoadingScreenInstance Self;\npublic:\n\tstatic TSharedPtr<FNYLoadingScreenInstance> Get();\n\tvirtual ~FNYLoadingScreenInstance();\n\n\t// INYLoadingScreenInstance interface\n\tvoid SetWaitForAnyKeyInput(bool bInValue, bool bFocus = true) override;\n\tbool IsWaitForAnyKeyInput() const override { return bWaitForAnyKeyInput; }\n\tvoid SetWaitForAnyKeyInputData(TSoftObjectPtr<UTexture2D> Image, FText Title, FText Description) override;\n\n\tvoid UpdateLoadingScreenTip(FText Tip) override;\n\n\tbool CanHideLoadingScreen() const override;\n\tvoid SetAutoShowLoadingScreen(bool bInValue) override;\n\tbool ShowLoadingScreen(bool bInPlayUntilStopped = true, float InPlayTime = -1.f) override;\n\tbool HideLoadingScreen() override;\n\tbool IsLoadingScreenVisible() const override  { return IsSlateLoadingScreenVisible() || IsMovieLoadingScreenVisible(); }\n\tvoid RedrawLoadingScreenWidget() override;\n\n\tvoid TestShowWidget() override;\n\tvoid TestHideWidget() override;\n\n\tvoid Initialize();\n\nprotected:\n\tstatic void Create()\n\t{\n\t\tcheck(IsInGameThread() && !IsInSlateThread());\n\t\tcheck(!Instance.IsValid());\n\t\tInstance = MakeShareable(new Self);\n\t}\n\tstatic void Destroy()\n\t{\n\t\tcheck(IsInGameThread() && !IsInSlateThread());\n\t\tInstance.Reset();\n\t}\n\tFNYLoadingScreenInstance();\n\n\tbool Tick(float DeltaTime) override;\n\n\tbool IsThisFocused() const;\n\tvoid FocusThis();\n\tvoid FocusReturnToUser();\n\n\tvoid Shutdown();\n\tUGameViewportClient* GetGameViewportClient() const;\n\tfloat GetViewportDPIScale() const { return 1.f; }\n\n\t// FCoreUObjectDelegates\n\tvoid OnPreLoadMap(const FString& LevelName);\n\tvoid OnPostLoadMap(UWorld* LoadedWorld);\n\tvoid OnPreExit();\n\n\t/** Callback for clicking on the viewport */\n\tFReply OnLoadingScreenKeyDown(const FGeometry& Geometry, const FKeyEvent& KeyEvent);\n\n\t// Slate methods\n\tbool IsSlateLoadingScreenVisible() const;\n\tbool ShowSlateLoadingScreen();\n\tbool AddSlateWidgetToGameViewport();\n\tbool HideSlateLoadingScreen();\n\n\t// IGameMoviePlayer methods\n\tbool ShowMovieLoadingScreen();\n\tbool HideMovieLoadingScreen();\n\tbool IsMovieLoadingScreenVisible() const;\n\tvoid SetupMovieLoadingScreen();\n\tIGameMoviePlayer* GetSafeMoviePlayer() const;\n\tbool HasMoviePlayer() const;\n\n\t/** Called before playing a movie if the loading screen has not been prepared. */\n\tvoid HandleMoviePrepareLoadingScreen();\n\n\t/* Callback for when the LoadingScreen setup above in WidgetLoadingScreen is displayed **/\n\tvoid HandleMoviePlaybackStarted();\n\tvoid HandleMoviePlaybackFinished();\n\tvoid FinishMoviePlaying();\n\tvoid HandleMovieClipFinished(const FString& MovieName);\n\nprotected:\n\t// Was Initialized called\n\tbool bInitialized = false;\n\n\t//\n\t// User provided values\n\t//\n\n\t// Automatically show loading screen on world transition\n\tbool bAutoShowLoadingScreen = true;\n\n\t// Wait for movie playing screen\n\tbool bPlayUntilStopped = true;\n\n\t// How much to play?\n\tfloat PlayTime = -1.f;\n\n\t// Are we waiting for the user to press an input button before we can hide loading screen\n\tbool bWaitForAnyKeyInput = false;\n\n\t// User has initiated the show/hide\n\tbool bUserCalledShow = false;\n\n\t// Is the movie playing?\n\tbool bIsMoviePlaying = false;\n\n\t// Are we moving between worlds?\n\tbool bIsTransitioningWorlds = false;\n\n\t// Got something\n\tbool bGotAnyKeyInput = false;\n\n\t// Remember what the user had focused before\n\tTSharedPtr<SWidget> PreviousFocusedWidget = nullptr;\n\n\t// Delegates\n\tFDelegateHandle DelegatePrepareLoadingScreen;\n\n\t// The widget which includes all contents of the loading screen, widgets and movie player and all\n\tTSharedPtr<SWidget> WidgetLoadingScreenRootContainer = nullptr;\n\n\t// Keep a reference just to remove it\n\tTSharedPtr<SWidget> WidgetPtrGameViewport = nullptr;\n\n\t// DPIScaler parented to the UserWidgetHolder to ensure correct scaling\n\tTSharedPtr<SDPIScaler> WidgetDPIScaler = nullptr;\n\n\t// Container around WidgetLoadingScreen\n\tTSharedPtr<SBorder> WidgetLoadingScreenContainer = nullptr;\n\n\t// Hold our widget\n\tTSharedPtr<SNYSimpleLoadingScreen> WidgetLoadingScreen = nullptr;\n\n\t// Singleton handle\n\tstatic TSharedPtr<FNYLoadingScreenInstance> Instance;\n};\n"
  },
  {
    "path": "Plugins/NotYetLoadingScreen/Source/NotYetLoadingScreen/Private/NYLoadingScreenModule.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#include \"NYLoadingScreenModule.h\"\n#include \"NYLoadingScreenInstance.h\"\n#include \"HAL/IConsoleManager.h\"\n\n#define LOCTEXT_NAMESPACE \"LoadingScreen\"\n\nIMPLEMENT_MODULE(FNYLoadingScreenModule, NotYetLoadingScreen)\n\nDEFINE_LOG_CATEGORY(LogNYLoadingScreen)\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFNYLoadingScreenModule::FNYLoadingScreenModule()\n{\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FNYLoadingScreenModule::StartupModule()\n{\n\tUE_LOG(LogNYLoadingScreen, Log, TEXT(\"StartupModule\"));\n\tif (IsRunningDedicatedServer() || !FSlateApplication::IsInitialized() || IsRunningCommandlet())\n\t{\n\t\treturn;\n\t}\n\n\t// Load for cooker reference\n\t// const UNYLoadingScreenSettings* Settings = GetDefault<UNYLoadingScreenSettings>();\n\t//TryToLoadImages(Settings->StartupScreen);\n\n\tFNYLoadingScreenInstance::Get()->Initialize();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FNYLoadingScreenModule::ShutdownModule()\n{\n\tUE_LOG(LogNYLoadingScreen, Log, TEXT(\"ShutdownModule\"));\n\tUnregisterConsoleCommands();\n\n\tfor (auto& Handle : AssetHandlesPool)\n\t{\n\t\tif (Handle.IsValid())\n\t\t{\n\t\t\tHandle->ReleaseHandle();\n\t\t}\n\n\t}\n\tAssetHandlesPool.Empty();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nTSharedPtr<INYLoadingScreenInstance> FNYLoadingScreenModule::GetInstance() const\n{\n\treturn FNYLoadingScreenInstance::Get();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FNYLoadingScreenModule::RegisterConsoleCommands(AActor* InReferenceActor)\n{\n\t// Unregister first to prevent double register of commands\n\tUnregisterConsoleCommands();\n\n\tReferenceActor = InReferenceActor;\n\tIConsoleManager& ConsoleManager = IConsoleManager::Get();\n\n\n\tConsoleCommands.Add(\n\t\tConsoleManager.RegisterConsoleCommand(\n\t\t\tTEXT(\"NYLoadingScreen.TestShow\"),\n\t\t\tTEXT(\"Test show the loading widget\"),\n\t\t\tFConsoleCommandDelegate::CreateLambda([this]()\n\t\t\t{\n\t\t\t\tGetInstance()->TestShowWidget();\n\t\t\t}),\n\t\t\tECVF_Default\n\t\t)\n\t);\n\n\tConsoleCommands.Add(\n\t\tConsoleManager.RegisterConsoleCommand(\n\t\t\tTEXT(\"NYLoadingScreen.TestHide\"),\n\t\t\tTEXT(\"Test hide the loading widget\"),\n\t\t\tFConsoleCommandDelegate::CreateLambda([this]()\n\t\t\t{\n\t\t\t\tGetInstance()->TestHideWidget();\n\t\t\t}),\n\t\t\tECVF_Default\n\t\t)\n\t);\n\n\tConsoleCommands.Add(\n\t\tConsoleManager.RegisterConsoleCommand(\n\t\t\tTEXT(\"NYLoadingScreen.ToggleWaitForAnyKeyInput\"),\n\t\t\tTEXT(\"Test hide the loading widget\"),\n\t\t\tFConsoleCommandDelegate::CreateLambda([this]()\n\t\t\t{\n\t\t\t\tTSharedPtr<INYLoadingScreenInstance> Instance = GetInstance();\n\t\t\t\tInstance->SetWaitForAnyKeyInput(!Instance->IsWaitForAnyKeyInput());\n\t\t\t}),\n\t\t\tECVF_Default\n\t\t)\n\t);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FNYLoadingScreenModule::UnregisterConsoleCommands()\n{\n\tReferenceActor = nullptr;\n\tfor (IConsoleCommand* Comand : ConsoleCommands)\n\t{\n\t\tIConsoleManager::Get().UnregisterConsoleObject(Comand);\n\t}\n\tConsoleCommands.Empty();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FNYLoadingScreenModule::RequestAsyncLoad(const FSoftObjectPath& Reference)\n{\n\tstatic constexpr bool bManageActiveHandle = true;\n\tif (Reference.IsValid())\n\t{\n\t\tAssetHandlesPool.Add(\n\t\t\tAssetLoader.RequestAsyncLoad(Reference, FStreamableDelegate(), FStreamableManager::AsyncLoadHighPriority, bManageActiveHandle)\n\t\t);\n\t}\n}\n\n#undef LOCTEXT_NAMESPACE\n"
  },
  {
    "path": "Plugins/NotYetLoadingScreen/Source/NotYetLoadingScreen/Private/NYLoadingScreenModule.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#include \"INYLoadingScreenModule.h\"\n#include \"NYLoadingScreenSettings.h\"\n#include \"Framework/Application/SlateApplication.h\"\n#include \"Engine/StreamableManager.h\"\n\nDECLARE_LOG_CATEGORY_EXTERN(LogNYLoadingScreen, All, All);\n\n\nclass FNYLoadingScreenModule : public INYLoadingScreenModule\n{\n\ttypedef FNYLoadingScreenModule Self;\npublic:\n\tFNYLoadingScreenModule();\n\n\t/** IModuleInterface implementation */\n\tvoid StartupModule() override;\n\tvoid ShutdownModule() override;\n\tbool IsGameModule() const override\n\t{\n\t\treturn true;\n\t}\n\n\t/** INYLoadingScreenModule implementation */\n\tTSharedPtr<INYLoadingScreenInstance> GetInstance() const override;\n\n\tvoid RegisterConsoleCommands(AActor* InReferenceActor = nullptr) override;\n\tvoid UnregisterConsoleCommands() override;\n\tvoid RequestAsyncLoad(const FSoftObjectPath& Reference) override;\n\nprotected:\n\t// Streaming stuff\n\t// https://wiki.unrealengine.com/TAssetPtr_and_Asynchronous_Asset_Loading\n\tFStreamableManager AssetLoader;\n\tTArray<TSharedPtr<FStreamableHandle>> AssetHandlesPool;\n\n\t/** Holds the console commands for this Module */\n\tTArray<IConsoleCommand*> ConsoleCommands;\n\n\t/** Reference Actor used to get the UWorld. */\n\tAActor* ReferenceActor = nullptr;\n};\n"
  },
  {
    "path": "Plugins/NotYetLoadingScreen/Source/NotYetLoadingScreen/Private/NYLoadingScreenSettings.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#include \"NYLoadingScreenSettings.h\"\n#include \"UObject/ConstructorHelpers.h\"\n#include \"Engine/Font.h\"\n#include \"INYLoadingScreenModule.h\"\n\n#define LOCTEXT_NAMESPACE \"LoadingScreen\"\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFNYLoadingScreenLoadingText::FNYLoadingScreenLoadingText()\n{\n\tNormalText.Text = LOCTEXT(\"Loading\", \"LOADING\");\n\tWaitForAnyKeyText.Text = LOCTEXT(\"PressAnyKey\", \"Press any key to continue...\");\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FNYLoadingScreenBackgroundImage::AsyncLoad() const\n{\n\tif (!bUseRandomBackgroundImages)\n\t\treturn;\n\n\tauto& Module = INYLoadingScreenModule::Get();\n\tfor (const FSoftObjectPath& Ref : BackgroundRandomImages)\n\t{\n\t\tModule.RequestAsyncLoad(Ref);\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FNYLoadingScreenImageInfo::AsyncLoad() const\n{\n\tauto& Module = INYLoadingScreenModule::Get();\n\tModule.RequestAsyncLoad(Image.ToSoftObjectPath());\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FNYLoadingScreenLoadingImage::AsyncLoad() const\n{\n\tauto& Module = INYLoadingScreenModule::Get();\n\tif (bUseSpinningImage)\n\t{\n\t\tModule.RequestAsyncLoad(SpinningImage.ToSoftObjectPath());\n\t}\n\tif (bUseThrobber)\n\t{\n\t\tModule.RequestAsyncLoad(ThrobberPieceImage.ToSoftObjectPath());\n\t}\n\tif (bUseMaterial)\n\t{\n\t\tModule.RequestAsyncLoad(Material);\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nTSharedRef<STextBlock> FNYLoadingScreenText::NewTextBlock(const TAttribute<EVisibility>& Visibility) const\n{\n\treturn SNew(STextBlock)\n\t\t.Text(Text)\n\t\t.Visibility(Visibility)\n\t\t.Font(Font)\n\t\t.Justification(Justification)\n\t\t.AutoWrapText(bAutoWrap)\n\t\t.MinDesiredWidth(MinDesiredWidth)\n\t\t.WrapTextAt(WrapTextAt);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FNYLoadingScreenLoading::AsyncLoad() const\n{\n\tTitleContainer.AsyncLoad();\n\tTitleText.AsyncLoad();\n\n\tDescriptionContainer.AsyncLoad();\n\tDescriptionText.AsyncLoad();\n\n\tLoadingContainer.AsyncLoad();\n\tLoadingText.AsyncLoad();\n\tLoadingImage.AsyncLoad();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FNYLoadingScreenDescription::AsyncLoad() const\n{\n\tfor (const FNYLoadingScreenImageInfo& Img : Images)\n\t{\n\t\tImg.AsyncLoad();\n\t}\n\n\tBackground.AsyncLoad();\n\tLoading.AsyncLoad();\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUNYLoadingScreenSettings::UNYLoadingScreenSettings(const FObjectInitializer& Initializer)\n\t: Super(Initializer)\n{\n\tif (!IsRunningDedicatedServer())\n\t{\n\t\t// static ConstructorHelpers::FObjectFinder<UFont> RobotoFontObj(TEXT(\"/Engine/EngineFonts/Roboto\"));\n\t\t// Font = FSlateFontInfo(RobotoFontObj.Object, 20, FName(\"Normal\"));\n\t\t// LoadingFont = FSlateFontInfo(RobotoFontObj.Object, 32, FName(\"Bold\"));\n\t\t// AnyKeyFont = FSlateFontInfo(RobotoFontObj.Object, 32, FName(\"Bold\"));\n\t}\n}\n\nvoid UNYLoadingScreenSettings::PostInitProperties()\n{\n\tSuper::PostInitProperties();\n\n\t// Override\n\tif (IsOverrideEventPeriod() && WorldTransitionScreen.Images.IsValidIndex(0))\n\t{\n\t\tWorldTransitionScreen.Images[0].Image = GetOverrideImage();\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFNYLoadingScreenDescription& UNYLoadingScreenSettings::GetWorldTransitionScreen()\n{\n\t// NOTE: this basically breaks saving at runtime\n\t// static bool bInitialized = false;\n\t// if (!bInitialized)\n\t// {\n\t// \tWorldTransitionScreen.Images = WorldTransitionImages;\n\t// \tWorldTransitionScreen.Loading = WorldTransitionLoading;\n\t// \tWorldTransitionScreen.Background = WorldTransitionBackground;\n\t// \tWorldTransitionScreen.Tips = WorldTransitionTips;\n\t//\n\t// \tbInitialized = true;\n\t// }\n\n\treturn WorldTransitionScreen;\n}\n\n\n#undef LOCTEXT_NAMESPACE\n"
  },
  {
    "path": "Plugins/NotYetLoadingScreen/Source/NotYetLoadingScreen/Private/Widgets/SNYLoadingScreenDefaultBorder.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#pragma once\n\n#include \"CoreMinimal.h\"\n\n\nclass SNYLoadingScreenDefaultBorder : public SBorder\n{\n\ttypedef SBorder Super;\npublic:\n\n\tSLATE_BEGIN_ARGS(SNYLoadingScreenDefaultBorder)\n\t\t: _OnKeyDown()\n\t{}\n\n\t\tSLATE_EVENT(FPointerEventHandler, OnMouseButtonDown)\n\t\tSLATE_EVENT(FOnKeyDown, OnKeyDown)\n\t\tSLATE_DEFAULT_SLOT(FArguments, Content)\n\n\tSLATE_END_ARGS()\n\n\t/**\n\t* Construct this widget\n\t*\n\t* @param\tInArgs\tThe declaration data for this widget\n\t*/\n\tvoid Construct(const FArguments& InArgs)\n\t{\n\t\tOnKeyDownHandler = InArgs._OnKeyDown;\n\t\tbCanSupportFocus = true;\n\n\t\tSBorder::Construct(SBorder::FArguments()\n\t\t\t.BorderImage(FCoreStyle::Get().GetBrush(TEXT(\"BlackBrush\")))\n\t\t\t.OnMouseButtonDown(InArgs._OnMouseButtonDown)\n\t\t\t.Padding(0)[InArgs._Content.Widget]);\n\n\t}\n\n\t/**\n\t* Set the handler to be invoked when the user presses a key.\n\t*\n\t* @param InHandler   Method to execute when the user presses a key\n\t*/\n\tvoid SetOnOnKeyDown(const FOnKeyDown& InHandler)\n\t{\n\t\tOnKeyDownHandler = InHandler;\n\t}\n\n\t/**\n\t* Overrides SWidget::OnKeyDown()\n\t* executes OnKeyDownHandler if it is bound\n\t*/\n\tFReply OnKeyDown(const FGeometry& MyGeometry, const FKeyEvent& InKeyEvent) override\n\t{\n\t\tif (OnKeyDownHandler.IsBound())\n\t\t{\n\t\t\t// If a handler is assigned, call it.\n\t\t\treturn OnKeyDownHandler.Execute(MyGeometry, InKeyEvent);\n\t\t}\n\t\treturn SBorder::OnKeyDown(MyGeometry, InKeyEvent);\n\t}\n\n\t/**\n\t* Overrides SWidget::SupportsKeyboardFocus()\n\t* Must support keyboard focus to accept OnKeyDown events\n\t*/\n\tbool SupportsKeyboardFocus() const override\n\t{\n\t\treturn true;\n\t}\n\n\t/**\n\t * Called when focus is given to this widget.  This event does not bubble.\n\t *\n\t * @param MyGeometry The Geometry of the widget receiving the event\n\t * @param  InFocusEvent  The FocusEvent\n\t * @return  Returns whether the event was handled, along with other possible actions\n\t */\n\tFReply OnFocusReceived(const FGeometry& MyGeometry, const FFocusEvent& InFocusEvent) override\n\t{\n\t\treturn FReply::Handled();\n\t}\n\n\t/**\n\t * Called when this widget loses focus.  This event does not bubble.\n\t *\n\t * @param InFocusEvent The FocusEvent\n\t */\n\tvoid OnFocusLost(const FFocusEvent& InFocusEvent) override\n\t{\n\t\tSuper::OnFocusLost(InFocusEvent);\n\t}\n\n\t/** Called whenever a focus path is changing on all the widgets within the old and new focus paths */\n\tvoid OnFocusChanging(const FWeakWidgetPath& PreviousFocusPath, const FWidgetPath& NewWidgetPath, const FFocusEvent& InFocusEvent) override\n\t{\n\t\tSuper::OnFocusChanging(PreviousFocusPath, NewWidgetPath, InFocusEvent);\n\t}\n\nprotected:\n\tFOnKeyDown OnKeyDownHandler;\n};\n"
  },
  {
    "path": "Plugins/NotYetLoadingScreen/Source/NotYetLoadingScreen/Private/Widgets/SNYSimpleLoadingScreen.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#include \"SNYSimpleLoadingScreen.h\"\n\n#include \"Widgets/Layout/SScaleBox.h\"\n#include \"Widgets/Images/SImage.h\"\n#include \"Widgets/Layout/SSpacer.h\"\n#include \"Widgets/SOverlay.h\"\n#include \"Widgets/SBoxPanel.h\"\n#include \"Widgets/Text/STextBlock.h\"\n#include \"Widgets/Layout/SBorder.h\"\n#include \"Widgets/Layout/SSafeZone.h\"\n#include \"Widgets/Images/SThrobber.h\"\n#include \"Widgets/Layout/SDPIScaler.h\"\n#include \"Engine/Texture2D.h\"\n#include \"Engine/UserInterfaceSettings.h\"\n#include \"Widgets/Layout/SConstraintCanvas.h\"\n#include \"Materials/MaterialInterface.h\"\n#include \"Widgets/Images/SSpinningImage.h\"\n\n#define LOCTEXT_NAMESPACE \"LoadingScreen\"\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// SSimpleLoadingScreen\nvoid SNYSimpleLoadingScreen::Construct(const FArguments& InArgs, const FNYLoadingScreenDescription& InScreenDescription)\n{\n\tSAssignNew(WidgetRootOverlay, SOverlay);\n\tRedraw(InScreenDescription);\n\tChildSlot\n\t[\n\t\tWidgetRootOverlay.ToSharedRef()\n\t];\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid SNYSimpleLoadingScreen::Redraw(const FNYLoadingScreenDescription& InScreenDescription)\n{\n\tScreenDescription = InScreenDescription;\n\tWidgetRootOverlay->ClearChildren();\n\tUpdateAttributes();\n\n\t// Add Game tips\n\t// TSharedRef<SWidget> TipWidget = SNullWidget::NullWidget;\n\t// FNYLoadingScreenTips TipsInfo = InScreenDescription.Tips;\n\t// if (TipsInfo.Tips.Num() > 0)\n\t// {\n\t// \tconst int32 TipIndex = FMath::RandRange(0, TipsInfo.Tips.Num() - 1);\n\t//\n\t// \tTipWidget = SNew(STextBlock)\n\t// \t\t.WrapTextAt(TipsInfo.WrapAt)\n\t// \t\t.Font(TipsInfo.Font)\n\t// \t\t.Text(TipsInfo.Tips[TipIndex]);\n\t// }\n\n\t// Bottom default, TODO modify\n\t//WidgetRootOverlay->AddSlot()\n\t//.HAlign(HAlign_Fill)\n\t//.VAlign(VAlign_Bottom)\n\t//[\n\t//\tSNew(SBorder)\n\t//\t.HAlign(HAlign_Fill)\n\t//\t.VAlign(VAlign_Fill)\n\t//\t.BorderBackgroundColor(FLinearColor(0, 0, 0, 0.75))\n\t//\t.BorderImage(FCoreStyle::Get().GetBrush(\"WhiteBrush\"))\n\t//\t[\n\t//\t\tSNew(SSafeZone)\n\t//\t\t.HAlign(HAlign_Fill)\n\t//\t\t.VAlign(VAlign_Bottom)\n\t//\t\t.IsTitleSafe(true)\n\t//\t\t[\n\t//\t\t\tSNew(SDPIScaler)\n\t//\t\t\t.DPIScale(this, &SNYSimpleLoadingScreen::GetDPIScale)\n\t//\t\t\t[\n\t//\t\t\t\tSNew(SHorizontalBox)\n\n\t\t\t\t\t// Circular throbber\n\t\t\t\t\t// TODO replace this\n\t\t\t\t\t//+SHorizontalBox::Slot()\n\t\t\t\t\t//.Padding(FMargin(25, 0.0f, 0, 0))\n\t\t\t\t\t//.VAlign(VAlign_Center)\n\t\t\t\t\t//.AutoWidth()\n\t\t\t\t\t//[\n\t\t\t\t\t//\tSNew(SCircularThrobber)\n\t\t\t\t\t//\t// Convert font size to pixels, pixel_size = point_size * resolution / 72, then half it to get radius\n\t\t\t\t\t//\t.Radius((FontLoading.Size * 96.0f/72.0f) / 2.0f)\n\t\t\t\t\t//]\n\n\t\t\t\t\t//// Loading text\n\t\t\t\t\t//+SHorizontalBox::Slot()\n\t\t\t\t\t//.Padding(FMargin(40.0f, 0.0f, 0, 0))\n\t\t\t\t\t//.AutoWidth()\n\t\t\t\t\t//.VAlign(VAlign_Center)\n\t\t\t\t\t//[\n\t\t\t\t\t//\tSNew(STextBlock)\n\t\t\t\t\t//\t.Text(InScreenDescription.LoadingText)\n\t\t\t\t\t//\t.Font(LoadingFont)\n\t\t\t\t\t//]\n\n\t\t\t\t\t//// Game tips\n\t\t\t\t\t//+SHorizontalBox::Slot()\n\t\t\t\t\t//.FillWidth(1)\n\t\t\t\t\t//.HAlign(HAlign_Fill)\n\t\t\t\t\t//[\n\t\t\t\t\t//\tSNew(SSpacer)\n\t\t\t\t\t//\t.Size(FVector2D(1.0f, 1.0f))\n\t\t\t\t\t//]\n\n\t\t\t\t\t//+SHorizontalBox::Slot()\n\t\t\t\t\t//.AutoWidth()\n\t\t\t\t\t//.HAlign(HAlign_Right)\n\t\t\t\t\t//.VAlign(VAlign_Center)\n\t\t\t\t\t//.Padding(FMargin(10.0f))\n\t\t\t\t\t//[\n\t\t\t\t\t//\tTipWidget\n\t\t\t\t\t//]\n\t//\t\t\t]\n\t//\t\t]\n\t//\t]\n\t//];\n\n\n\t// Draw Widgets\n\tAddBackgroundImageToRoot();\n\n\tSAssignNew(WidgetMainCanvasPanel, SConstraintCanvas);\n\tRedrawWidgetMainCanvasPanel();\n\n\t//\n\t// WidgetMainCanvasPanel\n\t//\n\tWidgetRootOverlay->AddSlot()\n\t.HAlign(HAlign_Fill)\n\t.VAlign(VAlign_Fill)\n\t[\n\t\t//SNew(SBorder)\n\t\t//.HAlign(HAlign_Fill)\n\t\t//.VAlign(VAlign_Fill)\n\t\t//.Padding(0.f)\n\t\t//[\n\t\t\t//SNew(SSafeZone)\n\t\t\t//.HAlign(HAlign_Fill)\n\t\t\t//.VAlign(VAlign_Fill)\n\t\t\t//.IsTitleSafe(true)\n\t\t\t//[\n\t\t\t\tSNew(SDPIScaler)\n\t\t\t\t.DPIScale(this, &SNYSimpleLoadingScreen::GetDPIScale)\n\t\t\t\t[\n\t\t\t\t\tWidgetMainCanvasPanel.ToSharedRef()\n\t\t\t\t]\n\t\t\t//]\n\t\t//]\n\t];\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid SNYSimpleLoadingScreen::RedrawWidgetMainCanvasPanel()\n{\n\tWidgetMainCanvasPanel->ClearChildren();\n\n\t// Add Images\n\tfor (const FNYLoadingScreenImageInfo& Info : ScreenDescription.Images)\n\t{\n\t\tTSharedPtr<FNYLoadingScreenBrush> Brush = CreateBrushFromImageInfo(Info);\n\t\tAddImageWidgetToMainCanvasPanel(Brush, Info);\n\t\tBrushesImages.Add(Brush);\n\t}\n\n\t// Add loading text and image\n\tAddLoadingWidgets(ScreenDescription.Loading);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid SNYSimpleLoadingScreen::AddBackgroundImageToRoot()\n{\n\tconst FNYLoadingScreenBackgroundImage& BackgroundInfo = ScreenDescription.Background;\n\tif (BackgroundInfo.bUseRandomBackgroundImages && BackgroundInfo.BackgroundRandomImages.Num() > 0)\n\t{\n\t\t// Add background image\n\t\tconst int32 ImageIndex = FMath::RandRange(0, BackgroundInfo.BackgroundRandomImages.Num() - 1);\n\t\tBrushBackground = CreateBrushFromAssetReference(BackgroundInfo.BackgroundRandomImages[ImageIndex]);\n\t\tif (BrushBackground.IsValid())\n\t\t{\n\t\t\tWidgetRootOverlay->AddSlot()\n\t\t\t\t.HAlign(HAlign_Fill)\n\t\t\t\t.VAlign(VAlign_Fill)\n\t\t\t\t[\n\t\t\t\t\tSNew(SScaleBox)\n\t\t\t\t\t.Stretch(BackgroundInfo.BackgroundRandomImagesStretch)\n\t\t\t\t\t[\n\t\t\t\t\t\tSNew(SImage)\n\t\t\t\t\t\t.Image(BrushBackground->GetSlateBrush())\n\t\t\t\t\t]\n\t\t\t\t];\n\t\t}\n\t}\n\telse\n\t{\n\t\t// FallBack\n\t\tWidgetRootOverlay->AddSlot()\n\t\t\t.HAlign(HAlign_Fill)\n\t\t\t.VAlign(VAlign_Fill)\n\t\t\t[\n\t\t\t\tSNew(SImage)\n\t\t\t\t.Image(nullptr)\n\t\t\t\t.ColorAndOpacity(BackgroundInfo.BackgroundFallbackColor)\n\t\t\t];\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid SNYSimpleLoadingScreen::AddLoadingWidgets(const FNYLoadingScreenLoading& Info)\n{\n\t// Set auto size if no size is set\n\tbool bLoadingContainerAutoSize = Info.LoadingContainer.AutoSize();\n\tFOptionalSize LoadingImageWidthOverride;\n\tFOptionalSize LoadingImageHeightOverride;\n\tif (Info.LoadingImage.Size.Equals(FVector2D::ZeroVector))\n\t{\n\t\tbLoadingContainerAutoSize = true;\n\t}\n\telse\n\t{\n\t\tLoadingImageWidthOverride = Info.LoadingImage.Size.X;\n\t\tLoadingImageHeightOverride = Info.LoadingImage.Size.Y;\n\t}\n\n\t// Handle different image types\n\tTSharedPtr<SWidget> WidgetImage = SNullWidget::NullWidget;\n\n\t// Set the correct image type\n\tif (Info.LoadingImage.bUseThrobber)\n\t{\n\t\t// Use Throbber\n\t\tBrushLoadingAnimation = CreateBrushFromAssetReference(Info.LoadingImage.ThrobberPieceImage.ToSoftObjectPath());\n\t\tif (BrushLoadingAnimation.IsValid())\n\t\t{\n\t\t\tif (Info.LoadingImage.bThrobberSpin)\n\t\t\t{\n\t\t\t\tWidgetImage = SNew(SCircularThrobber)\n\t\t\t\t\t.PieceImage(BrushLoadingAnimation->GetSlateBrush())\n\t\t\t\t\t.NumPieces(Info.LoadingImage.ThrobberNumImagePieces)\n\t\t\t\t\t.Period(Info.LoadingImage.ThrobberPeriod)\n\t\t\t\t\t.Radius(Info.LoadingText.NormalText.Font.Size * 96.0f / 72.0f);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tWidgetImage = SNew(SThrobber)\n\t\t\t\t\t.PieceImage(BrushLoadingAnimation->GetSlateBrush())\n\t\t\t\t\t.NumPieces(Info.LoadingImage.ThrobberNumImagePieces)\n\t\t\t\t\t.Animate(SThrobber::All);\n\t\t\t}\n\t\t}\n\t}\n\telse if (Info.LoadingImage.bUseSpinningImage)\n\t{\n\t\t// Use Image\n\t\tBrushLoadingAnimation = CreateBrushFromAssetReference(Info.LoadingImage.SpinningImage.ToSoftObjectPath());\n\t\tif (BrushLoadingAnimation.IsValid())\n\t\t{\n\t\t\tWidgetImage = SNew(SSpinningImage)\n\t\t\t\t.Image(BrushLoadingAnimation->GetSlateBrush())\n\t\t\t\t.Period(1.f);\n\t\t}\n\t}\n\telse if (Info.LoadingImage.bUseMaterial)\n\t{\n\t\t// Use Material\n\t\tBrushLoadingAnimation = MakeBrushFromMaterial(Info.LoadingImage.Material, Info.LoadingImage.Size);\n\t\tif (BrushLoadingAnimation.IsValid())\n\t\t{\n\t\t\tWidgetImage = SNew(SImage)\n\t\t\t\t.Image(BrushLoadingAnimation->GetSlateBrush());\n\t\t}\n\t}\n\n\t// Default image, nothing else is good\n\tif (!BrushLoadingAnimation.IsValid())\n\t{\n\t\tWidgetImage = SNew(SCircularThrobber)\n\t\t\t.Radius(Info.LoadingText.NormalText.Font.Size * 96.0f / 72.0f);\n\t}\n\n\tWidgetMainCanvasPanel->AddSlot()\n\t\t.Anchors(Info.LoadingContainer.Anchors)\n\t\t.Alignment(Info.LoadingContainer.Alignment)\n\t\t.AutoSize(bLoadingContainerAutoSize)\n\t\t.Offset(Info.LoadingContainer.GetMargin())\n\t\t[\n\t\t\tSNew(SOverlay)\n\n\t\t\t+SOverlay::Slot()\n\t\t\t.HAlign(Info.LoadingContainer.SlotHorizontalAlignment)\n\t\t\t.VAlign(Info.LoadingContainer.SlotVerticalAlignment)\n\t\t\t[\n\t\t\t\tSNew(SHorizontalBox)\n\n\t\t\t\t// Loading Text\n\t\t\t\t+SHorizontalBox::Slot()\n\t\t\t\t.HAlign(HAlign_Center)\n\t\t\t\t.VAlign(VAlign_Center)\n\t\t\t\t.Padding(Info.LoadingText.NormalText.Padding)\n\t\t\t\t.AutoWidth()\n\t\t\t\t[\n\t\t\t\t\tSNew(SOverlay)\n\n\t\t\t\t\t// Normal loading text\n\t\t\t\t\t+SOverlay::Slot()\n\t\t\t\t\t[\n\t\t\t\t\t\tInfo.LoadingText.NormalText.NewTextBlock(AttributeVisibleNormal)\n\t\t\t\t\t]\n\n\t\t\t\t\t// Wait for any key to continue text\n\t\t\t\t\t+SOverlay::Slot()\n\t\t\t\t\t[\n\t\t\t\t\t\tInfo.LoadingText.WaitForAnyKeyText.NewTextBlock(AttributeVisibleWaitForAnyKey)\n\t\t\t\t\t]\n\t\t\t\t]\n\n\t\t\t\t// Image loading\n\t\t\t\t+SHorizontalBox::Slot()\n\t\t\t\t.HAlign(HAlign_Center)\n\t\t\t\t.VAlign(VAlign_Center)\n\t\t\t\t.Padding(Info.LoadingImage.Padding)\n\t\t\t\t[\n\t\t\t\t\tSAssignNew(WidgetLoadingImage, SBox)\n\t\t\t\t\t.HAlign(HAlign_Fill)\n\t\t\t\t\t.VAlign(VAlign_Fill)\n\t\t\t\t\t.Visibility_Lambda([this]()\n\t\t\t\t\t{\n\t\t\t\t\t\treturn bWaitForAnyKeyInput ? EVisibility::Collapsed : EVisibility::Visible;\n\t\t\t\t\t})\n\t\t\t\t\t.WidthOverride(LoadingImageWidthOverride)\n\t\t\t\t\t.HeightOverride(LoadingImageHeightOverride)\n\t\t\t\t\t[\n\t\t\t\t\t\tWidgetImage.ToSharedRef()\n\t\t\t\t\t]\n\t\t\t\t]\n\t\t\t]\n\t\t];\n\n\n\t// Title Text\n\tWidgetMainCanvasPanel->AddSlot()\n\t\t.Anchors(Info.TitleContainer.Anchors)\n\t\t.Alignment(Info.TitleContainer.Alignment)\n\t\t.AutoSize(Info.TitleContainer.AutoSize())\n\t\t.Offset(Info.TitleContainer.GetMargin())\n\t\t[\n\t\t\tInfo.TitleText.NewTextBlock(AttributeVisibleWaitForAnyKey)\n\t\t];\n\n\n\t// Description Text\n\tWidgetMainCanvasPanel->AddSlot()\n\t\t.Anchors(Info.DescriptionContainer.Anchors)\n\t\t.Alignment(Info.DescriptionContainer.Alignment)\n\t\t.AutoSize(Info.DescriptionContainer.AutoSize())\n\t\t.Offset(Info.DescriptionContainer.GetMargin())\n\t\t[\n\t\t\tInfo.DescriptionText.NewTextBlock(AttributeVisibleWaitForAnyKey)\n\t\t];\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid SNYSimpleLoadingScreen::AddImageWidgetToMainCanvasPanel(TSharedPtr<FNYLoadingScreenBrush> Brush, const FNYLoadingScreenImageInfo& Info)\n{\n\tif (!Brush.IsValid())\n\t{\n\t\treturn;\n\t}\n\n\t// Set auto size if no size is set\n\tbool bAutoSize = false;\n\tif (Info.Size.Equals(FVector2D::ZeroVector))\n\t{\n\t\tbAutoSize = true;\n\t}\n\n\t// Set position\n\tFMargin Offset{ 0 };\n\tOffset.Left = Info.Position.X;\n\tOffset.Top = Info.Position.Y;\n\n\t// Set Size\n\tOffset.Right = Info.Size.X;\n\tOffset.Bottom = Info.Size.Y;\n\n\tWidgetMainCanvasPanel->AddSlot()\n\t\t.Anchors(Info.Anchors)\n\t\t.Alignment(Info.Alignment)\n\t\t.AutoSize(bAutoSize)\n\t\t.Offset(Offset)\n\t\t.ZOrder(Info.ZOrder)\n\t\t[\n\t\t\tSNew(SImage)\n\t\t\t.Image(Brush->GetSlateBrush())\n\t\t];\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nTSharedPtr<FNYLoadingScreenBrush> SNYSimpleLoadingScreen::MakeBrushFromMaterial(const FSoftObjectPath& MaterialAsset, FVector2D ImageSize)\n{\n\tUObject* MaterialObject = MaterialAsset.ResolveObject();\n\tif (UMaterialInterface* MaterialInterface = Cast<UMaterialInterface>(MaterialObject))\n\t{\n\t\treturn FDeferredCleanupSlateBrush::CreateBrush(MaterialInterface, ImageSize);\n\t}\n\n\treturn nullptr;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nTSharedPtr<FNYLoadingScreenBrush> SNYSimpleLoadingScreen::CreateBrushFromImageInfo(const FNYLoadingScreenImageInfo& Info)\n{\n\treturn CreateBrushFromAssetReference(Info.Image.ToSoftObjectPath());\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nTSharedPtr<FNYLoadingScreenBrush> SNYSimpleLoadingScreen::CreateBrushFromAssetReference(const FSoftObjectPath& ImageAsset)\n{\n\tUObject* ImageObject = ImageAsset.ResolveObject();\n\tif (ImageObject == nullptr)\n\t{\n\t\tImageObject = ImageAsset.TryLoad();\n\t}\n\tif (UTexture2D* LoadingImage = Cast<UTexture2D>(ImageObject))\n\t{\n\t\tconst auto Size = FVector2D(LoadingImage->GetSizeX(), LoadingImage->GetSizeY());\n\t\treturn FDeferredCleanupSlateBrush::CreateBrush(LoadingImage, Size);\n\t}\n\n\treturn nullptr;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid SNYSimpleLoadingScreen::UpdateAttributes()\n{\n\tAttributeVisibleNormal.Set(bWaitForAnyKeyInput ? EVisibility::Hidden : EVisibility::Visible);\n\tAttributeVisibleWaitForAnyKey.Set(bWaitForAnyKeyInput ? EVisibility::Visible : EVisibility::Hidden);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid SNYSimpleLoadingScreen::SetWaitForAnyKeyInput(bool bInValue)\n{\n\tbWaitForAnyKeyInput = bInValue;\n\tUpdateAttributes();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nfloat SNYSimpleLoadingScreen::GetDPIScale() const\n{\n\tconst FVector2D& DrawSize = GetCachedGeometry().ToPaintGeometry().GetLocalSize();\n\tconst FIntPoint Size((int32)DrawSize.X, (int32)DrawSize.Y);\n\treturn GetDefault<UUserInterfaceSettings>()->GetDPIScaleBasedOnSize(Size);\n}\n\n#undef LOCTEXT_NAMESPACE\n"
  },
  {
    "path": "Plugins/NotYetLoadingScreen/Source/NotYetLoadingScreen/Private/Widgets/SNYSimpleLoadingScreen.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#pragma once\n\n#include \"Widgets/SCompoundWidget.h\"\n#include \"NYLoadingScreenSettings.h\"\n\n#include \"Styling/SlateBrush.h\"\n#include \"Slate/DeferredCleanupSlateBrush.h\"\n\n\nclass SOverlay;\nclass SConstraintCanvas;\nclass SBox;\nclass STextBlock;\n\n\n//\n// Special brush to prevent garbage collection\n// NOTE can't use FSlateDynamicImageBrush in loading screen because of bug\n//\n// struct FNYLoadingScreenBrushImplementation : public FSlateDynamicImageBrush, public FGCObject\n// {\n// \tFNYLoadingScreenBrushImplementation(class UTexture2D* InTexture, const FVector2D& InImageSize, const FName InImagePath)\n// \t\t: FSlateDynamicImageBrush(InTexture, InImageSize, InImagePath)\n// \t{\n// \t}\n//\n// \tvirtual void AddReferencedObjects(FReferenceCollector& Collector) override\n// \t{\n// \t\tUObject* Object = GetResourceObject();\n// \t\tif (Object)\n// \t\t{\n// \t\t\tCollector.AddReferencedObject(Object);\n// \t\t}\n// \t}\n//\n// \t// GetSlateBrush\n// };\n\ntypedef FDeferredCleanupSlateBrush FNYLoadingScreenBrush;\n\nclass SNYSimpleLoadingScreen : public SCompoundWidget\n{\n\ttypedef SNYSimpleLoadingScreen Self;\npublic:\n\tSLATE_BEGIN_ARGS(SNYSimpleLoadingScreen) {}\n\tSLATE_END_ARGS()\n\n\tvoid Construct(const FArguments& InArgs, const FNYLoadingScreenDescription& InScreenDescription);\n\tvoid Redraw(const FNYLoadingScreenDescription& InScreenDescription);\n\tvoid SetWaitForAnyKeyInput(bool bInValue);\n\nprivate:\n\tvoid UpdateAttributes();\n\tFText GetLoadingText() const;\n\tfloat GetDPIScale() const;\n\tTSharedPtr<FNYLoadingScreenBrush> CreateBrushFromImageInfo(const FNYLoadingScreenImageInfo& Info);\n\tTSharedPtr<FNYLoadingScreenBrush> CreateBrushFromAssetReference(const FSoftObjectPath& ImageAsset);\n\n\tTSharedPtr<FNYLoadingScreenBrush> MakeBrushFromMaterial(const FSoftObjectPath& MaterialAsset, FVector2D ImageSize);\n\n\tvoid RedrawWidgetMainCanvasPanel();\n\tvoid AddBackgroundImageToRoot();\n\tvoid AddLoadingWidgets(const FNYLoadingScreenLoading& Info);\n\tvoid AddImageWidgetToMainCanvasPanel(TSharedPtr<FNYLoadingScreenBrush> Brush, const FNYLoadingScreenImageInfo& Info);\n\nprivate:\n\t// Widgets\n\tTSharedPtr<FNYLoadingScreenBrush> BrushBackground = nullptr;\n\tTSharedPtr<FNYLoadingScreenBrush> BrushLoadingAnimation = nullptr;\n\n\tTArray<TSharedPtr<FNYLoadingScreenBrush>> BrushesImages;\n\n\tTSharedPtr<SConstraintCanvas> WidgetMainCanvasPanel = nullptr;\n\tTSharedPtr<SOverlay> WidgetRootOverlay = nullptr;\n\tTSharedPtr<SBox> WidgetLoadingImage;\n\n\tFNYLoadingScreenDescription ScreenDescription;\n\n\tTAttribute<EVisibility> AttributeVisibleNormal;\n\tTAttribute<EVisibility> AttributeVisibleWaitForAnyKey;\n\n\tbool bWaitForAnyKeyInput = false;\n};\n"
  },
  {
    "path": "Plugins/NotYetLoadingScreen/Source/NotYetLoadingScreen/Public/INYLoadingScreenInstance.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#pragma once\n#include \"CoreMinimal.h\"\n\nclass UTexture2D;\n\n/**\n * The public interface to this module\n */\nclass NOTYETLOADINGSCREEN_API INYLoadingScreenInstance\n{\npublic:\n\tvirtual ~INYLoadingScreenInstance() {}\n\t\n\tvirtual void SetAutoShowLoadingScreen(bool bInValue) = 0;\n\tvirtual void SetWaitForAnyKeyInput(bool bInValue, bool bFocus = true) = 0;\n\tvirtual bool IsWaitForAnyKeyInput() const = 0;\n\tvirtual void SetWaitForAnyKeyInputData(TSoftObjectPtr<UTexture2D> Image, FText Title, FText Description) = 0;\n\n\tvirtual void UpdateLoadingScreenTip(FText Tip) = 0;\n\n\t// This can fail is you set SetWaitForAnyKeyInput(true) but no input was received\n\tvirtual bool CanHideLoadingScreen() const = 0;\n\n\tvirtual bool ShowLoadingScreen(bool bPlayUntilStopped = true, float PlayTime = -1.f) = 0;\n\tvirtual bool HideLoadingScreen() = 0;\n\tvirtual bool IsLoadingScreenVisible() const = 0;\n\tvirtual void RedrawLoadingScreenWidget() = 0;\n\n\tvirtual void TestShowWidget() = 0;\n\tvirtual void TestHideWidget() = 0;\n};\n"
  },
  {
    "path": "Plugins/NotYetLoadingScreen/Source/NotYetLoadingScreen/Public/INYLoadingScreenModule.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#pragma once\n\n#include \"Modules/ModuleManager.h\"\n#include \"INYLoadingScreenInstance.h\"\n#include \"Templates/SharedPointer.h\"\n\nclass AActor;\n\n/**\n * The public interface to this module\n */\nclass NOTYETLOADINGSCREEN_API INYLoadingScreenModule : public IModuleInterface\n{\n\npublic:\n\n\t/**\n\t * Singleton-like access to this module's interface.  This is just for convenience!\n\t * Beware of calling this during the shutdown phase, though.  Your module might have been unloaded already.\n\t *\n\t * @return Returns singleton instance, loading the module on demand if needed\n\t */\n\tstatic INYLoadingScreenModule& Get()\n\t{\n\t\treturn FModuleManager::LoadModuleChecked<INYLoadingScreenModule>(\"NotYetLoadingScreen\");\n\t}\n\n\t/**\n\t * Checks to see if this module is loaded and ready.  It is only valid to call Get() if IsAvailable() returns true.\n\t *\n\t * @return True if the module is loaded and ready to use\n\t */\n\tstatic bool IsAvailable()\n\t{\n\t\treturn FModuleManager::Get().IsModuleLoaded(\"NotYetLoadingScreen\");\n\t}\n\n\tvirtual void RequestAsyncLoad(const FSoftObjectPath& Reference) = 0;\n\npublic:\n\t// Manually start/stop\n\tvirtual TSharedPtr<INYLoadingScreenInstance> GetInstance() const = 0;\n\n\tvirtual void RegisterConsoleCommands(AActor* InReferenceActor = nullptr) = 0;\n\tvirtual void UnregisterConsoleCommands() = 0;\n};\n"
  },
  {
    "path": "Plugins/NotYetLoadingScreen/Source/NotYetLoadingScreen/Public/NYLoadingScreenSettings.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#pragma once\n\n#include \"CoreMinimal.h\"\n#include \"Fonts/SlateFontInfo.h\"\n#include \"Widgets/Layout/SScaleBox.h\"\n#include \"MoviePlayer.h\"\n#include \"Engine/DeveloperSettings.h\"\n#include \"Widgets/Layout/Anchors.h\"\n#include \"Framework/Text/TextLayout.h\"\n#include \"Widgets/Text/STextBlock.h\"\n\n#include \"NYLoadingScreenSettings.generated.h\"\n\nclass UTexture2D;\n\nUSTRUCT(BlueprintType)\nstruct NOTYETLOADINGSCREEN_API FNYLoadingScreenBackgroundImage\n{\n\tGENERATED_USTRUCT_BODY()\npublic:\n\tvoid AsyncLoad() const;\n\npublic:\n\t// If we should use BackgroundRandomImages\n\tUPROPERTY(Config, EditAnywhere, Category = Background)\n\tbool bUseRandomBackgroundImages = false;\n\n\t/** The texture display while in the loading screen on top of the movie. */\n\tUPROPERTY(Config, EditAnywhere, BlueprintReadWrite, Category = Background, meta = (AllowedClasses = \"Texture2D\"))\n\tTArray<FSoftObjectPath> BackgroundRandomImages;\n\n\t/** The scaling type to apply to images. */\n\tUPROPERTY(Config, EditAnywhere, BlueprintReadWrite, Category = Background)\n\tTEnumAsByte<EStretch::Type> BackgroundRandomImagesStretch = EStretch::ScaleToFit;\n\n\t// Fallback color for the background if we don't use anything else\n\tUPROPERTY(Config, EditAnywhere, BlueprintReadWrite, Category = Background)\n\tFLinearColor BackgroundFallbackColor = FLinearColor::Black;\n};\n\n\nUSTRUCT(BlueprintType)\nstruct NOTYETLOADINGSCREEN_API FNYLoadingScreenMovieInfo\n{\n\tGENERATED_USTRUCT_BODY()\npublic:\n\tvoid AsyncLoad() const {}\n\npublic:\n\t/** If true, movies can be skipped by clicking the loading screen as long as loading is done. */\n\tUPROPERTY(Config, EditAnywhere, BlueprintReadWrite, Category=Movies)\n\tbool bMoviesAreSkippable = false;\n\n\t/** If true, movie playback continues until Stop is called. */\n\tUPROPERTY(Config, EditAnywhere, BlueprintReadWrite, Category=Movies)\n\tbool bWaitForManualStop = false;\n\n\t/** Should we just play back, loop, etc.  NOTE: if playback type is MT_LoadingLoop, then MoviePlayer will auto complete when in the last movie and load finishes regardless of bAutoCompleteWhenLoadingCompletes */\n\tUPROPERTY(Config, EditAnywhere, BlueprintReadWrite, Category= Movies)\n\tTEnumAsByte<EMoviePlaybackType> PlaybackType;\n\n\t/** The movie paths local to the game's Content/Movies/ directory without extension. */\n\tUPROPERTY(Config, EditAnywhere, BlueprintReadWrite, Category=Movies)\n\tTArray<FString> MoviePaths;\n};\n\n\nUSTRUCT(BlueprintType)\nstruct NOTYETLOADINGSCREEN_API FNYLoadingScreenImageInfo\n{\n\tGENERATED_USTRUCT_BODY()\npublic:\n\tvoid AsyncLoad() const;\n\npublic:\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Image)\n\tTSoftObjectPtr<UTexture2D> Image;\n\n\t// By default it will be top left corner\n\tUPROPERTY(Config, EditAnywhere, BlueprintReadWrite, Category = Image)\n\tFAnchors Anchors;\n\n\t// If zero it will size to content automatically\n\tUPROPERTY(Config, EditAnywhere, BlueprintReadWrite, Category = Image)\n\tFVector2D Size = FVector2D::ZeroVector;\n\n\tUPROPERTY(Config, EditAnywhere, BlueprintReadWrite, Category = Image)\n\tFVector2D Position = FVector2D::ZeroVector;\n\n\tUPROPERTY(Config, EditAnywhere, BlueprintReadWrite, Category = Image)\n\tFVector2D Alignment{ 0.5f, 0.5f };\n\n\tUPROPERTY(Config, EditAnywhere, BlueprintReadWrite, Category = Image)\n\tint32 ZOrder = 0;\n};\n\n\nUSTRUCT(BlueprintType)\nstruct NOTYETLOADINGSCREEN_API FNYLoadingScreenLoadingImage\n{\n\tGENERATED_USTRUCT_BODY()\npublic:\n\tvoid AsyncLoad() const;\n\npublic:\n\t// If zero it will size to content automatically\n\tUPROPERTY(Config, EditAnywhere, BlueprintReadWrite, Category = Image)\n\tFVector2D Size{180.f, 180.f};\n\n\tUPROPERTY(Config, EditAnywhere, BlueprintReadWrite, Category = Image)\n\tFMargin Padding{0.f, -18.f, 0.f, 0.f};\n\n\n\t// If true will use SpinningImage\n\tUPROPERTY(Config, EditAnywhere, BlueprintReadWrite, Category = SpinningImage)\n\tbool bUseSpinningImage = true;\n\n\t// Only used if bUseSpinningImage = true\n\tUPROPERTY(Config, EditAnywhere, BlueprintReadWrite, Category = SpinningImage)\n\tTSoftObjectPtr<UTexture2D> SpinningImage;\n\n\n\t// If true will use ThrobberPieceImage\n\tUPROPERTY(Config, EditAnywhere, BlueprintReadWrite, Category = Throbber)\n\tbool bUseThrobber = false;\n\n\t// To spin the image in a circular motion?\n\t// Only used if bUseThrobber = true\n\tUPROPERTY(Config, EditAnywhere, BlueprintReadWrite, Category = Throbber)\n\tbool bThrobberSpin = true;\n\n\t// Only used if bUseThrobber = true\n\tUPROPERTY(Config, EditAnywhere, BlueprintReadWrite, Category = Throbber)\n\tTSoftObjectPtr<UTexture2D> ThrobberPieceImage;\n\n\t// Number of pieces to use\n\t// Only used if bUseThrobber = true\n\tUPROPERTY(Config, EditAnywhere, BlueprintReadWrite, Category = Throbber)\n\tint32 ThrobberNumImagePieces = 6;\n\n\tUPROPERTY(Config, EditAnywhere, BlueprintReadWrite, Category = Throbber)\n\tfloat ThrobberPeriod = 1.5f;\n\n\n\t// If True will use Material as the loading image\n\tUPROPERTY(Config, EditAnywhere, BlueprintReadWrite, Category = Material)\n\tbool bUseMaterial = false;\n\n\t// Animated image or material\n\t// Only used if bUseMaterial = true\n\tUPROPERTY(Config, EditAnywhere, BlueprintReadWrite, Category = Material, meta = (AllowedClasses = \"Texture2D UMaterialInterface\"))\n\tFSoftObjectPath Material;\n};\n\n// Info for a slot inside SConstraintCanvas\nUSTRUCT(BlueprintType)\nstruct NOTYETLOADINGSCREEN_API FNYLoadingScreenContainer\n{\n\tGENERATED_USTRUCT_BODY()\npublic:\n\tvoid AsyncLoad() const {}\n\npublic:\n\tbool AutoSize() const { return Size.Equals(FVector2D::ZeroVector);  }\n\tFMargin GetMargin() const\n\t{\n\t\tFMargin Margin{ 0 };\n\t\tMargin.Left = Position.X;\n\t\tMargin.Top = Position.Y;\n\n\t\t// Set Size\n\t\tMargin.Right = Size.X;\n\t\tMargin.Bottom = Size.Y;\n\n\t\treturn Margin;\n\t}\n\n\t// By default extend to the bottom screen\n\tUPROPERTY(Config, EditAnywhere, BlueprintReadWrite, Category = Container)\n\tFAnchors Anchors{0.f, 1.f, 1.f, 1.f};\n\n\t// If zero it will size to content automatically\n\tUPROPERTY(Config, EditAnywhere, BlueprintReadWrite, Category = Container)\n\tFVector2D Size = FVector2D::ZeroVector;\n\n\tUPROPERTY(Config, EditAnywhere, BlueprintReadWrite, Category = Container)\n\tFVector2D Position{0.f, -200.f};\n\n\tUPROPERTY(Config, EditAnywhere, BlueprintReadWrite, Category = Container)\n\tFVector2D Alignment = FVector2D::ZeroVector;\n\n\t// Only used in some cases\n\tUPROPERTY(Config, EditAnywhere, BlueprintReadWrite, Category = Container)\n\tTEnumAsByte<EHorizontalAlignment> SlotHorizontalAlignment = EHorizontalAlignment::HAlign_Center;\n\tUPROPERTY(Config, EditAnywhere, BlueprintReadWrite, Category = Container)\n\tTEnumAsByte<EVerticalAlignment> SlotVerticalAlignment = EVerticalAlignment::VAlign_Center;\n};\n\n\n// Info for STextBlock\nUSTRUCT(BlueprintType)\nstruct NOTYETLOADINGSCREEN_API FNYLoadingScreenText\n{\n\tGENERATED_USTRUCT_BODY()\npublic:\n\tvoid AsyncLoad() const {}\n\n\t// From the properties of this struct\n\tTSharedRef<STextBlock> NewTextBlock(const TAttribute<EVisibility>& Visibility) const;\n\npublic:\n\tUPROPERTY(Config, EditAnywhere, BlueprintReadWrite, Category = Text)\n\tFText Text;\n\n\tUPROPERTY(Config, EditAnywhere, BlueprintReadWrite, Category = Text)\n\tFMargin Padding{0.f, 0.f, 30.f, 0.f};\n\n\tUPROPERTY(Config, EditAnywhere, BlueprintReadWrite, Category = Text)\n\tFSlateFontInfo Font;\n\n\t// Whether to wrap text automatically based on the widget's computed horizontal space.  IMPORTANT: Using automatic wrapping can result\n\t// in visual artifacts, as the the wrapped size will computed be at least one frame late!  Consider using WrapTextAt instead.  The initial\n\t// desired size will not be clamped.  This works best in cases where the text block's size is not affecting other widget's layout.\n\tUPROPERTY(Config, EditAnywhere, BlueprintReadWrite, Category = Text)\n\tbool bAutoWrap = true;\n\n\t// Whether text wraps onto a new line when it's length exceeds this width; if this value is zero or negative, no wrapping occurs.\n\tUPROPERTY(Config, EditAnywhere, BlueprintReadWrite, Category = Text)\n\tfloat WrapTextAt = 0;\n\n\t// How the text should be aligned with the margin.\n\tUPROPERTY(Config, EditAnywhere, BlueprintReadWrite, Category = Text)\n\tTEnumAsByte<ETextJustify::Type> Justification = ETextJustify::Center;\n\n\tUPROPERTY(Config, EditAnywhere, BlueprintReadWrite, Category = Text)\n\tfloat MinDesiredWidth = 0;\n};\n\nUSTRUCT(BlueprintType)\nstruct NOTYETLOADINGSCREEN_API FNYLoadingScreenLoadingText\n{\n\tGENERATED_USTRUCT_BODY()\npublic:\n\tFNYLoadingScreenLoadingText();\n\tvoid AsyncLoad() const {}\n\npublic:\n\tUPROPERTY(Config, EditAnywhere, BlueprintReadWrite, Category = Text)\n\tFNYLoadingScreenText NormalText;\n\n\tUPROPERTY(Config, EditAnywhere, BlueprintReadWrite, Category = Text)\n\tFNYLoadingScreenText WaitForAnyKeyText;\n};\n\nUSTRUCT(BlueprintType)\nstruct NOTYETLOADINGSCREEN_API FNYLoadingScreenLoading\n{\n\tGENERATED_USTRUCT_BODY()\npublic:\n\tvoid AsyncLoad() const;\n\npublic:\n\tUPROPERTY(Config, EditAnywhere, BlueprintReadWrite, Category = Text)\n\tFNYLoadingScreenContainer TitleContainer;\n\tUPROPERTY(Config, EditAnywhere, BlueprintReadWrite, Category = Text)\n\tFNYLoadingScreenText TitleText;\n\n\tUPROPERTY(Config, EditAnywhere, BlueprintReadWrite, Category = Text)\n\tFNYLoadingScreenContainer DescriptionContainer;\n\tUPROPERTY(Config, EditAnywhere, BlueprintReadWrite, Category = Text)\n\tFNYLoadingScreenText DescriptionText;\n\n\t// Information about the container of the loading screen text + loading image\n\tUPROPERTY(Config, EditAnywhere, BlueprintReadWrite, Category = Container)\n\tFNYLoadingScreenContainer LoadingContainer;\n\tUPROPERTY(Config, EditAnywhere, BlueprintReadWrite, Category = Text)\n\tFNYLoadingScreenLoadingText LoadingText;\n\tUPROPERTY(Config, EditAnywhere, BlueprintReadWrite, Category = Image)\n\tFNYLoadingScreenLoadingImage LoadingImage;\n};\n\n\nUSTRUCT(BlueprintType)\nstruct NOTYETLOADINGSCREEN_API FNYLoadingScreenTips\n{\n\tGENERATED_USTRUCT_BODY()\npublic:\n\t// The font to display the tips in.\n\tUPROPERTY(Config, EditAnywhere, BlueprintReadWrite, Category = Fonts)\n\tFSlateFontInfo Font;\n\n\t/** The size of the tip before it's wrapped to the next line. */\n\tUPROPERTY(Config, EditAnywhere, BlueprintReadWrite, Category = Advice)\n\tfloat WrapAt = 1000.0f;\n\n\t/** The tips to display on the load screen. */\n\tUPROPERTY(Config, EditAnywhere, BlueprintReadWrite, Category = Advice)\n\tTArray<FText> Tips;\n};\n\n\nUSTRUCT(BlueprintType)\nstruct NOTYETLOADINGSCREEN_API FNYLoadingScreenDescription\n{\n\tGENERATED_USTRUCT_BODY()\n\npublic:\n\tFNYLoadingScreenDescription() {}\n\tvoid AsyncLoad() const;\n\n\t/** The minimum time that a loading screen should be opened for, -1 if there is no minimum time. */\n\t//UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Loading)\n\t//float MinimumLoadingScreenDisplayTime = -1;\n\n\t/** If true, the loading screen will disappear as soon as loading is done. */\n\t//UPROPERTY(EditAnywhere, BlueprintReadWrite, Category=Loading)\n\t//bool bAutoCompleteWhenLoadingCompletes = true;\n\n\t//UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Movies)\n\t//bool bShowMovies = false;\n\n\t//UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Movies)\n\t//FNYLoadingScreenMovieInfo MovieInfo;\n\n\t/**  Should we show the images/tips/loading text?  Generally you'll want to set this to false if you just want to show a movie. */\n\t//UPROPERTY(EditAnywhere, BlueprintReadWrite, Category=Display)\n\t//bool bShowUIOverlay = true;\n\n\t// All the images to display\n\tUPROPERTY(Config, EditAnywhere, BlueprintReadWrite, Category = Images)\n\tTArray<FNYLoadingScreenImageInfo> Images;\n\n\t// Text displayed beside the animated icon\n\tUPROPERTY(Config, EditAnywhere, BlueprintReadWrite, Category = Loading)\n\tFNYLoadingScreenLoading Loading;\n\n\tUPROPERTY(Config, EditAnywhere, BlueprintReadWrite, Category = Background)\n\tFNYLoadingScreenBackgroundImage Background;\n\n\tUPROPERTY(Config, EditAnywhere, BlueprintReadWrite, Category = Tips)\n\tFNYLoadingScreenTips Tips;\n};\n\n// Assume the date is in the same year, so we only care about the month, day, hour\nUSTRUCT(BlueprintType)\nstruct NOTYETLOADINGSCREEN_API FNYLoadingScreenDateSameYear\n{\n\tGENERATED_USTRUCT_BODY()\n\npublic:\n\tUPROPERTY(Config, EditAnywhere, BlueprintReadWrite, Category = LoadingScreenOverrideEvent, meta = (ClampMin = \"1\", ClampMax = \"12\", UIMin = \"1\", UIMax = \"12\"))\n\tint32 Month = 1;\n\n\tUPROPERTY(Config, EditAnywhere, BlueprintReadWrite, Category = LoadingScreenOverrideEvent, meta = (ClampMin = \"1\", ClampMax = \"31\", UIMin = \"1\", UIMax = \"31\"))\n\tint32 Day = 1;\n\n\tUPROPERTY(Config, EditAnywhere, BlueprintReadWrite, Category = LoadingScreenOverrideEvent, meta = (ClampMin = \"0\", ClampMax = \"23\", UIMin = \"0\", UIMax = \"23\"))\n\tint32 Hour = 0;\n\n\tUPROPERTY(Config, EditAnywhere, BlueprintReadWrite, Category = LoadingScreenOverrideEvent, meta = (ClampMin = \"0\", ClampMax = \"59\", UIMin = \"0\", UIMax = \"59\"))\n\tint32 Minute = 0;\n};\n\n// Halloween, Christmas, etc events\nUSTRUCT(BlueprintType)\nstruct NOTYETLOADINGSCREEN_API FNYLoadingScreenOverrideEvent\n{\n\tGENERATED_USTRUCT_BODY()\n\npublic:\n\t// This will replace the first image from FNYLoadingScreenDescription.Images[0].Image\n\tUPROPERTY(Config, EditAnywhere, BlueprintReadWrite, Category = LoadingScreenOverrideEvent)\n\tTSoftObjectPtr<UTexture2D> Image;\n\n\t// The date when this custom event starts, inclusive\n\tUPROPERTY(Config, EditAnywhere, BlueprintReadWrite, Category = LoadingScreenOverrideEvent)\n\tFNYLoadingScreenDateSameYear StartDate;\n\n\t// The date when this custom event starts, exclusive\n\tUPROPERTY(Config, EditAnywhere, BlueprintReadWrite, Category = LoadingScreenOverrideEvent)\n\tFNYLoadingScreenDateSameYear EndDate;\n\npublic:\n\t// Is the current time in the specified event period\n\tbool IsOverridePeriod() const\n\t{\n\t\t// We use the same year as the current time\n\t\treturn IsDateTimeInOverridePeriod(FDateTime::Now());\n\t}\n\n\tbool IsDateTimeInOverridePeriod(const FDateTime& DateTime) const\n\t{\n\t\tconst int32 CurrentYear = DateTime.GetYear();\n\t\tconst FDateTime StartDateTime = FDateTime(CurrentYear, StartDate.Month, StartDate.Day, StartDate.Hour);\n\t\tconst FDateTime EndDateTime = FDateTime(CurrentYear, EndDate.Month, EndDate.Day, EndDate.Hour);\n\n\t\treturn DateTime >= StartDateTime && DateTime < EndDateTime;\n\t}\n};\n\n\n/**\n * Settings for the simple loading screen plugin.\n */\nUCLASS(config = NYLoadingScreenSettings, DefaultConfig, meta = (DisplayName = \"Loading Screen\"))\nclass NOTYETLOADINGSCREEN_API UNYLoadingScreenSettings : public UDeveloperSettings\n{\n\tGENERATED_BODY()\n\npublic:\n\tUNYLoadingScreenSettings(const FObjectInitializer& Initializer);\n\n\tvoid PostInitProperties() override;\n\n\t//\n\t// UDeveloperSettings interface\n\t//\n\n\t/** Gets the settings container name for the settings, either Project or Editor */\n\tFName GetContainerName() const override { return \"Project\"; }\n\t/** Gets the category for the settings, some high level grouping like, Editor, Engine, Game...etc. */\n\tFName GetCategoryName() const override { return \"Game\"; };\n\t/** The unique name for your section of settings, uses the class's FName. */\n\t// FName GetSectionName() const override { return \"NY Loading Screen\"; };\n\n\t//\n\t// Own Methods\n\t//\n\n\tFNYLoadingScreenDescription& GetWorldTransitionScreen();\n\n\tbool IsHalloweenEventPeriod() const\n\t{\n\t\treturn HalloweenOverrideEvent.IsOverridePeriod();\n\t}\n\tbool IsDateTimeInHalloweenEventPeriod(const FDateTime& DateTime) const\n\t{\n\t\treturn HalloweenOverrideEvent.IsDateTimeInOverridePeriod(DateTime);\n\t}\n\tTSoftObjectPtr<UTexture2D> GetOverrideImage() const\n\t{\n\t\tif (IsHalloweenEventPeriod())\n\t\t{\n\t\t\treturn HalloweenOverrideEvent.Image;\n\t\t}\n\n\t\treturn nullptr;\n\t}\n\n\tbool IsOverrideEventPeriod() const\n\t{\n\t\treturn IsHalloweenEventPeriod();\n\t}\n\n\nprotected:\n\t// Use StartupScreen on startup\n\t//UPROPERTY(config, EditAnywhere, Category = Screens)\n\t//bool bHasStartupScreen = false;\n\n\t/** The startup screen for the project. */\n\t//UPROPERTY(config, EditAnywhere, Category = Screens)\n\t//FNYLoadingScreenDescription StartupScreen;\n\n\t/** The default load screen between maps. */\n\tUPROPERTY(Config, EditAnywhere, Category = Screen)\n\tFNYLoadingScreenDescription WorldTransitionScreen;\n\n\tUPROPERTY(Config, EditAnywhere, Category = OverrideEvents)\n\tFNYLoadingScreenOverrideEvent HalloweenOverrideEvent;\n\n\t//\n\t// NOTE: We moved the variables from FNYLoadingScreenDescription here so that it is easier to read in the config file\n\t//\n\n\t// UPROPERTY(Config, EditAnywhere, Category = Images, meta = (DisplayName = \"Images\"))\n\t// TArray<FNYLoadingScreenImageInfo> WorldTransitionImages;\n\t//\n\t// // Text displayed beside the animated icon\n\t// UPROPERTY(Config, EditAnywhere, Category = Loading, meta = (DisplayName = \"Loading\"))\n\t// FNYLoadingScreenLoading WorldTransitionLoading;\n\t//\n\t// UPROPERTY(Config, EditAnywhere, Category = Background, meta = (DisplayName = \"Background\"))\n\t// FNYLoadingScreenBackgroundImage WorldTransitionBackground;\n\t//\n\t// UPROPERTY(Config, EditAnywhere, Category = Tips, meta = (DisplayName = \"Tips\"))\n\t// FNYLoadingScreenTips WorldTransitionTips;\n};\n"
  },
  {
    "path": "Plugins/NotYetSteam/.gitignore",
    "content": "## Inspired from https://github.com/github/gitignore/blob/master/UnrealEngine.gitignore\n# Visual Studio user specific files\n\n!Source/ThirdParty/NotYetSteamLibrary/Win64/steam_api64.dll\n!Source/ThirdParty/NotYetSteamLibrary/Win64/steam_api64.lib\n\n!Source/ThirdParty/NotYetSteamLibrary/Win32/steam_api.dll\n!Source/ThirdParty/NotYetSteamLibrary/Win32/steam_api.lib\n\n!Source/ThirdParty/NotYetSteamLibrary/Linux/libsteam_api.so\n"
  },
  {
    "path": "Plugins/NotYetSteam/NotYetSteam.uplugin",
    "content": "{\n\t\"FileVersion\": 3,\n\t\"Version\": 1,\n\t\"VersionName\": \"1.0\",\n\t\"FriendlyName\": \"NotYetSteam\",\n\t\"Description\": \"\",\n\t\"Category\": \"Other\",\n\t\"CreatedBy\": \"\",\n\t\"CreatedByURL\": \"\",\n\t\"DocsURL\": \"\",\n\t\"MarketplaceURL\": \"\",\n\t\"SupportURL\": \"\",\n\t\"CanContainContent\": true,\n\t\"IsBetaVersion\": false,\n\t\"Installed\": false,\n\t\"EnabledByDefault\": false,\n\t\"Modules\": [\n\t\t{\n\t\t\t\"Name\": \"NotYetSteam\",\n\t\t\t\"Type\": \"Developer\",\n\t\t\t\"LoadingPhase\": \"PreDefault\",\n\t\t\t\"WhitelistPlatforms\": [\"Win64\", \"Win32\", \"Linux\"]\n\t\t}\n\t],\n\t\"Plugins\": [\n\t\t{\n\t\t\t\"Name\": \"OnlineSubsystem\",\n\t\t\t\"Enabled\": true\n\t\t},\n\t\t{\n\t\t\t\"Name\": \"OnlineSubsystemUtils\",\n\t\t\t\"Enabled\": true\n\t\t},\n\t\t{\n\t\t\t\"Name\": \"OnlineSubsystemSteam\",\n\t\t\t\"Enabled\": true\n\t\t}\n\t]\n}\n"
  },
  {
    "path": "Plugins/NotYetSteam/README.md",
    "content": "# NotYetSteam\n\nThis was created because Unreal Engine is retarded for not updating the steam\nSDK.\n"
  },
  {
    "path": "Plugins/NotYetSteam/Source/NotYetSteam/NotYetSteam.Build.cs",
    "content": "// Copyright (c) Daniel Butum. All Rights Reserved.\n\nusing System;\nusing System.IO;\nusing UnrealBuildTool;\n\npublic class NotYetSteam : ModuleRules\n{\n\tpublic NotYetSteam(ReadOnlyTargetRules Target) : base(Target)\n\t{\n\t\tConsole.WriteLine(\"Using NotYetSteam.Build.cs\");\n\t\tPCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs;\n\t\tbEnforceIWYU = true;\n\t\t//MinFilesUsingPrecompiledHeaderOverride = 1;\n\t\t//bFasterWithoutUnity = true;\n\n\t\t// Steam\n\t\tconst string SteamVersion = \"Steamv139\";\n\t\tbool bSteamSDKFound = Directory.Exists(Target.UEThirdPartySourceDirectory + \"Steamworks/\" + SteamVersion) == true;\n\t\tPublicDefinitions.Add(\"STEAMSDK_FOUND=\" + (bSteamSDKFound ? \"1\" : \"0\"));\n\t\tPublicDefinitions.Add(\"STEAM_SDK_ROOT_PATH=TEXT(\\\"Binaries/ThirdParty/Steamworks\\\")\");\n\n\t\t//PublicDefinitions.Add(\"STEAM_SDK_VER=TEXT(\\\"1.39\\\")\");\n\t\t//PublicDefinitions.Add(\"STEAM_SDK_VER_PATH=TEXT(\\\"Steam\" + SteamVersion + \"\\\")\");\n\n\t\tPublicIncludePaths.AddRange(\n\t\t\tnew string[] {\n\t\t\t\t// ... add public include paths required here ...\n\t\t\t\tPath.Combine(ModuleDirectory, \"Public\")\n\t\t\t}\n\t\t);\n\n\n\t\tPrivateIncludePaths.AddRange(\n\t\t\tnew string[] {\n\t\t\t\t// ... add other private include paths required here ...\n\t\t\t\tPath.Combine(ModuleDirectory, \"Private\")\n\t\t\t}\n\t\t);\n\n\t\tPublicDependencyModuleNames.AddRange(\n\t\t\tnew string[]\n\t\t\t{\n\t\t\t\t\"Core\",\n\t\t\t\t\"CoreUObject\",\n\t\t\t\t\"Engine\",\n\t\t\t\t\"Projects\",\n\n\t\t\t\t// General online modules\n\t\t\t\t\"OnlineSubsystem\",\n\t\t\t\t\"OnlineSubsystemUtils\"//,\n\t\t\t\t//\"OnlineSubsystemSteam\"\n\t\t\t\t// ... add other public dependencies that you statically link with here ...\n\t\t\t}\n\t\t);\n\n\t\tPublicDependencyModuleNames.Add(\"Steamworks\");\n\t\tPublicIncludePathModuleNames.Add(\"Steamworks\");\n\t\t//AddEngineThirdPartyPrivateStaticDependencies(Target, \"Steamworks\");\n\n\t\tDynamicallyLoadedModuleNames.Add(\"OnlineSubsystemSteam\");\n\t}\n}\n"
  },
  {
    "path": "Plugins/NotYetSteam/Source/NotYetSteam/Private/INYSteamSubsystem.cpp",
    "content": "// Copyright (c) Daniel Butum. All Rights Reserved.\n\n#include \"INYSteamSubsystem.h\"\n#include \"OnlineSubsystem.h\"\n\nconst FName INYSteamSubsystem::SubsystemName{TEXT(\"Steam\")};\n\nbool INYSteamSubsystem::IsEnabledByConfigOrCLI()\n{\n\treturn IOnlineSubsystem::IsEnabled(SubsystemName);\n}\n\nIOnlineSubsystem* INYSteamSubsystem::GetUnrealSteamSubsystem()\n{\n\treturn IOnlineSubsystem::Get(SubsystemName);\n}\n"
  },
  {
    "path": "Plugins/NotYetSteam/Source/NotYetSteam/Private/Interfaces/NYSteamExternalUI.cpp",
    "content": "// Copyright (c) Daniel Butum. All Rights Reserved.\n\n#include \"Interfaces/NYSteamExternalUI.h\"\n#include \"INYSteamSubsystem.h\"\n#include \"NYSteamAPI_Internal.h\"\n\n\nFNYSteamExternalUI::FNYSteamExternalUI(INYSteamSubsystem* InSubsystem)\n\t: SteamSubsystem(InSubsystem)\n{\n\tcheck(SteamSubsystem);\n}\n\n\nbool FNYSteamExternalUI::ActivateGameOverlayToWebPage(const FString& URL)\n{\n\tISteamFriends* Friends = SteamFriends();\n\tif (!Friends)\n\t{\n\t\treturn false;\n\t}\n\n\tif (URL.StartsWith(TEXT(\"https://\")) || URL.StartsWith(TEXT(\"http://\")))\n\t{\n\t\tFriends->ActivateGameOverlayToWebPage(TCHAR_TO_UTF8(*URL));\n\t}\n\telse\n\t{\n\t\t// Defaults to https\n\t\tFriends->ActivateGameOverlayToWebPage(TCHAR_TO_UTF8(*FString::Printf(TEXT(\"https://%s\"), *URL)));\n\t}\n\n\treturn true;\n}\n\nbool FNYSteamExternalUI::IsOverlayEnabled() const\n{\n\tISteamUtils* Utils = SteamUtils();\n\tif (!Utils)\n\t{\n\t\treturn false;\n\t}\n\n\treturn Utils->IsOverlayEnabled();\n}\n\nbool FNYSteamExternalUI::ShowFriendsUI()\n{\n\tISteamFriends* Friends = SteamFriends();\n\tif (!Friends)\n\t{\n\t\treturn false;\n\t}\n\n\tFriends->ActivateGameOverlay(\"friends\");\n\treturn true;\n}\n\nbool FNYSteamExternalUI::ShowAchievementsUI()\n{\n\tISteamFriends* Friends = SteamFriends();\n\tif (!Friends)\n\t{\n\t\treturn false;\n\t}\n\n\tFriends->ActivateGameOverlay(\"achievements\");\n\treturn true;\n}\n\nbool FNYSteamExternalUI::ActivateGameOverlayToStore(uint32 AppId, bool bAddToCart, bool bShowCart)\n{\n\tif (AppId == 0)\n\t{\n\t\treturn false;\n\t}\n\tISteamFriends* Friends = SteamFriends();\n\tif (!Friends)\n\t{\n\t\treturn false;\n\t}\n\n\tEOverlayToStoreFlag Flag = k_EOverlayToStoreFlag_None;\n\tif (bAddToCart)\n\t{\n\t\tFlag = bShowCart ? k_EOverlayToStoreFlag_AddToCartAndShow : k_EOverlayToStoreFlag_AddToCart;\n\t}\n\n\tFriends->ActivateGameOverlayToStore(AppId, Flag);\n\treturn true;\n}\n"
  },
  {
    "path": "Plugins/NotYetSteam/Source/NotYetSteam/Private/Interfaces/NYSteamPresence.cpp",
    "content": "// Copyright (c) Daniel Butum. All Rights Reserved.\n\n#include \"Interfaces/NYSteamPresence.h\"\n#include \"NYSteamAPI_Internal.h\"\n#include \"NYSteamHelper.h\"\n\nDEFINE_LOG_CATEGORY_STATIC(LogNYSteamPresence, All, All)\n\n\nFNYSteamPresence::FNYSteamPresence(INYSteamSubsystem* InSubsystem)\n\t: SteamSubsystem(InSubsystem)\n{\n\tcheck(SteamSubsystem);\n}\n\nbool FNYSteamPresence::ClearRichPresence(const FUniqueNetId& PlayerId)\n{\n\tif (!UNYSteamHelper::IsCurrentUser(PlayerId))\n\t{\n\t\tUE_LOG(LogNYSteamPresence, Warning, TEXT(\"ClearRichPresence: Not current steam user\"));\n\t\treturn false;\n\t}\n\n\tISteamFriends* SteamFriendsPtr = SteamFriends();\n\tif (!SteamFriendsPtr)\n\t{\n\t\tUE_LOG(LogNYSteamPresence, Warning, TEXT(\"ClearRichPresence: Can't get ISteamFriends\"));\n\t\treturn false;\n\t}\n\n\tSteamFriendsPtr->ClearRichPresence();\n\treturn true;\n}\n\nbool FNYSteamPresence::SetRichPresenceStatus(const FUniqueNetId& PlayerId, const FString& Message)\n{\n\tstatic const FString StatusKey = TEXT(\"status\");\n\tif (!UNYSteamHelper::IsCurrentUser(PlayerId))\n\t{\n\t\tUE_LOG(LogNYSteamPresence, Warning, TEXT(\"ClearPresence: Not current steam user\"));\n\t\treturn false;\n\t}\n\n\tif (!SetSteamRichPresence(StatusKey, Message))\n\t{\n\t\treturn false;\n\t}\n\n\treturn true;\n}\n\nbool FNYSteamPresence::SetRichPresenceSteamDisplay(const FUniqueNetId& PlayerId, const FName Token, const TMap<FString, FText>& Substitutions)\n{\n\t// Docs: https://partner.steamgames.com/doc/api/ISteamFriends#richpresencelocalization\n\tstatic const FString SteamDisplayKey = TEXT(\"steam_display\");\n\tif (!UNYSteamHelper::IsCurrentUser(PlayerId))\n\t{\n\t\tUE_LOG(LogNYSteamPresence, Warning, TEXT(\"SetRichPresenceSteamDisplay: Not current steam user\"));\n\t\treturn false;\n\t}\n\n\tconst FString TokenString = Token.ToString();\n\tif (TokenString.Len() < 2)\n\t{\n\t\tUE_LOG(LogNYSteamPresence, Warning, TEXT(\"SetRichPresenceSteamDisplay: Token = %s is too short\"), *TokenString);\n\t\treturn false;\n\t}\n\tif (!TokenString.StartsWith(TEXT(\"#\")))\n\t{\n\t\tUE_LOG(LogNYSteamPresence, Warning, TEXT(\"SetRichPresenceSteamDisplay: Token = %s is not a valid token. Valid tokens look like this: #token, #name\"), *TokenString);\n\t\treturn false;\n\t}\n\n\t// Set token\n\tif (!SetSteamRichPresence(SteamDisplayKey, TokenString))\n\t{\n\t\treturn false;\n\t}\n\n\t// Use substitutions\n\tfor (const auto& Pair : Substitutions)\n\t{\n\t\tSetSteamRichPresence(Pair.Key, Pair.Value.ToString());\n\t}\n\n\treturn true;\n}\n\nbool FNYSteamPresence::SetSteamRichPresence(const FString& Key, const FString& Value)\n{\n\t// Docs: https://partner.steamgames.com/doc/api/ISteamFriends#SetRichPresence\n\tISteamFriends* SteamFriendsPtr = SteamFriends();\n\tif (!SteamFriendsPtr)\n\t{\n\t\tUE_LOG(LogNYSteamPresence, Warning, TEXT(\"SetSteamRichPresence: Can't get ISteamFriends\"));\n\t\treturn false;\n\t}\n\n\tif (!SteamFriendsPtr->SetRichPresence(TCHAR_TO_UTF8(*Key), TCHAR_TO_UTF8(*Value)))\n\t{\n\t\tif (Key.Len() == 0)\n\t\t{\n\t\t\tUE_LOG(\n\t\t\t\tLogNYSteamPresence,\n\t\t\t\tWarning,\n\t\t\t\tTEXT(\"SetSteamRichPresence: Cannot push rich presence for Key = %s, Value = %s. Because Key  empty\"),\n\t\t\t\t*Key, *Value\n\t\t\t);\n\t\t}\n\t\telse if (Key.Len() >= k_cchMaxRichPresenceKeyLength)\n\t\t{\n\t\t\tUE_LOG(LogNYSteamPresence,\n\t\t\t\tWarning,\n\t\t\t\tTEXT(\"SetSteamRichPresence: Cannot push rich presence for Key = %s, Value = %s. Because Key is too long (%d)\"),\n\t\t\t\t*Key, *Value, Key.Len()\n\t\t\t);\n\t\t}\n\t\telse if (Value.Len() >= k_cchMaxRichPresenceValueLength)\n\t\t{\n\t\t\tUE_LOG(LogNYSteamPresence,\n\t\t\t\tWarning,\n\t\t\t\tTEXT(\"SetSteamRichPresence: Cannot push rich presence for Key = %s, Value = %s. Because Value is too long (%d)\"),\n\t\t\t\t*Key, *Value, Value.Len()\n\t\t\t);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tUE_LOG(LogNYSteamPresence,\n\t\t\t\tWarning,\n\t\t\t\tTEXT(\"SetSteamRichPresence: Cannot push rich presence for Key = %s, Value = %s. Most likely because The user has reached the maximum amount of rich presence keys as defined by k_cchMaxRichPresenceKeys(%d). Call ClearPresence!!\"),\n\t\t\t\t*Key, *Value, k_cchMaxRichPresenceKeys\n\t\t\t);\n\t\t}\n\n\t\treturn false;\n\t}\n\n\treturn true;\n}\n"
  },
  {
    "path": "Plugins/NotYetSteam/Source/NotYetSteam/Private/Interfaces/NYSteamStatsAndAchievements.cpp",
    "content": "// Copyright (c) Daniel Butum. All Rights Reserved.\n\n#include \"Interfaces/NYSteamStatsAndAchievements.h\"\n\n#include \"Misc/ConfigCacheIni.h\"\n#include \"NYSteamAPI_Internal.h\"\n#include \"NYSteamHelper.h\"\n\nDEFINE_LOG_CATEGORY_STATIC(LogNYSteamAchievements, All, All)\n\n\nFNYSteamAchievementsConfigReader::FNYSteamAchievementsConfigReader()\n\t: IniName(GEngineIni)\n\t, SectionName(TEXT(\"OnlineSubsystemSteam\"))\n{\n}\n\n// Returns empty string if couldn't read\nFString FNYSteamAchievementsConfigReader::GetKey(const FString& KeyName)\n{\n\tFString Result;\n\tif (!GConfig->GetString(*SectionName, *KeyName, Result, IniName))\n\t{\n\t\treturn TEXT(\"\");\t// could just return Result, but being explicit is better\n\t}\n\treturn Result;\n}\n\nbool FNYSteamAchievementsConfigReader::ReadAchievements(TArray<FNYUnrealSteamAchievementConfig> & OutArray)\n{\n\tOutArray.Empty();\n\tint NumAchievements = 0;\n\n\tfor (;; ++NumAchievements)\n\t{\n\t\tconst FString Name = GetKey(FString::Printf(TEXT(\"Achievement_%d_Id\"), NumAchievements));\n\t\tif (Name.IsEmpty())\n\t\t{\n\t\t\tbreak;\n\t\t}\n\n\t\tFNYUnrealSteamAchievementConfig NewAch{ Name };\n\t\tOutArray.Add(NewAch);\n\t}\n\n\treturn NumAchievements > 0;\n}\n\n\n\nFNYSteamStatsAndAchievements::FNYSteamStatsAndAchievements(INYSteamSubsystem* InSubsystem)\n\t: SteamSubsystem(InSubsystem)\n{\n\tcheck(SteamSubsystem);\n\n\tRequestCurrentStats();\n}\n\nvoid FNYSteamStatsAndAchievements::OnUserStatsReceived(FNYSteamUserStatsReceived_Result Result)\n{\n\tif (Result.bIsCurrentUser)\n\t{\n\t\tbStatsReceivedValid = Result.bSuccess;\n\t}\n\n\tUserStatsReceivedEvent.Broadcast(Result);\n}\n\nvoid FNYSteamStatsAndAchievements::OnUserStatsStored(FNYSteamUserStatsStored_Result Result)\n{\n\tUserStatsStoredEvent.Broadcast(Result);\n}\n\nvoid FNYSteamStatsAndAchievements::OnUserStatsUnloaded(FNYSteamUserStatsUnloaded_Result Result)\n{\n\tUserStatsUnloadedEvent.Broadcast(Result);\n}\n\nvoid FNYSteamStatsAndAchievements::OnUserAchievementStored(FNYSteamUserAchievementStored_Result Result)\n{\n\tUserAchievementStoredEvent.Broadcast(Result);\n}\n\nbool FNYSteamStatsAndAchievements::UnlockAchievement(FName AchievementName)\n{\n\tconst FString ThisContext = FString::Printf(\n\t\tTEXT(\"UnlockAchievement(AchievementName = %s)\"),\n\t\t*AchievementName.ToString()\n\t);\n\n\tUE_LOG(LogNYSteamAchievements, Log, TEXT(\"%s\"), *ThisContext);\n\tif (!bStatsReceivedValid)\n\t{\n\t\tUE_LOG(LogNYSteamAchievements, Error, TEXT(\"%s: bStatsReceivedValid = false\"), *ThisContext);\n\t\treturn false;\n\t}\n\tISteamUserStats* UserStats = SteamUserStats();\n\tif (!UserStats)\n\t{\n\t\tUE_LOG(LogNYSteamAchievements, Error, TEXT(\"%s: Can't get ISteamUserStats\"), *ThisContext);\n\t\treturn false;\n\t}\n\n\tconst bool bStatus = UserStats->SetAchievement(TCHAR_TO_UTF8(*AchievementName.ToString()));\n\n\t// TODO: maybe trigger this for the next tick?\n\treturn bStatus && StoreStats();\n}\n\nbool FNYSteamStatsAndAchievements::ResetAllAchievements()\n{\n\tif (!bStatsReceivedValid)\n\t{\n\t\tUE_LOG(LogNYSteamAchievements, Error, TEXT(\"ResetAllAchievements: bStatsReceivedValid = false\"));\n\t\treturn false;\n\t}\n\n\treturn ResetAllStats(true);\n}\n\nbool FNYSteamStatsAndAchievements::ResetAchievement(FName AchievementName, bool bStoreStats)\n{\n\tconst FString ThisContext = FString::Printf(\n\t\tTEXT(\"ResetAchievement(Name = %s, bStoreStats = %d)\"),\n\t\t*AchievementName.ToString(), bStoreStats\n\t);\n\tif (!bStatsReceivedValid)\n\t{\n\t\tUE_LOG(LogNYSteamAchievements, Error, TEXT(\"%s: bStatsReceivedValid = false\"), *ThisContext);\n\t\treturn false;\n\t}\n\tISteamUserStats* UserStats = SteamUserStats();\n\tif (!UserStats)\n\t{\n\t\tUE_LOG(LogNYSteamAchievements, Error, TEXT(\"%s: Can't get ISteamUserStats\"), *ThisContext);\n\t\treturn false;\n\t}\n\n\tif (UserStats->ClearAchievement(TCHAR_TO_UTF8(*AchievementName.ToString())))\n\t{\n\t\tif (bStoreStats)\n\t\t{\n\t\t\tStoreStats();\n\t\t}\n\n\t\treturn true;\n\t}\n\n\treturn false;\n}\n\nbool FNYSteamStatsAndAchievements::IsAchievementUnlocked(const FName AchievementName) const\n{\n\tconst FString ThisContext = FString::Printf(TEXT(\"IsAchievementUnlocked(Name = %s)\"), *AchievementName.ToString());\n\tif (!bStatsReceivedValid)\n\t{\n\t\tUE_LOG(LogNYSteamAchievements, Error, TEXT(\"%s: bStatsReceivedValid = false\"), *ThisContext);\n\t\treturn false;\n\t}\n\tISteamUserStats* UserStats = SteamUserStats();\n\tif (!UserStats)\n\t{\n\t\tUE_LOG(LogNYSteamAchievements, Error, TEXT(\"%s: Can't get ISteamUserStats\"),  *ThisContext);\n\t\treturn false;\n\t}\n\n\tbool bUnlocked = false;\n\tif (UserStats->GetAchievement(TCHAR_TO_UTF8(*AchievementName.ToString()), &bUnlocked))\n\t{\n\t\treturn bUnlocked;\n\t}\n\n\treturn false;\n}\n\nbool FNYSteamStatsAndAchievements::GetAchievementUnlockTime(FName AchievementName, FDateTime& OutUnlockTime) const\n{\n\tOutUnlockTime = {};\n\tconst FString ThisContext = FString::Printf(TEXT(\"GetAchievementUnlockTime(AchievementName = %s)\"), *AchievementName.ToString());\n\tif (!bStatsReceivedValid)\n\t{\n\t\tUE_LOG(LogNYSteamAchievements, Error, TEXT(\"%s: bStatsReceivedValid = false\"), *ThisContext);\n\t\treturn false;\n\t}\n\tISteamUserStats* UserStats = SteamUserStats();\n\tif (!UserStats)\n\t{\n\t\tUE_LOG(LogNYSteamAchievements, Error, TEXT(\"%s: Can't get ISteamUserStats\"), *ThisContext);\n\t\treturn false;\n\t}\n\n\tbool bUnlocked = false;\n\tuint32 UnlockUnixTime = 0;\n\tif (!UserStats->GetAchievementAndUnlockTime(TCHAR_TO_UTF8(*AchievementName.ToString()), &bUnlocked, &UnlockUnixTime))\n\t{\n\t\tUE_LOG(LogNYSteamAchievements, Error, TEXT(\"%s: Failed call to GetAchievementAndUnlockTime\"), *ThisContext);\n\t\treturn false;\n\t}\n\n\t// Not unlocked can't have unix timestamp\n\tif (!bUnlocked)\n\t{\n\t\treturn false;\n\t}\n\n\tOutUnlockTime = FDateTime::FromUnixTimestamp(UnlockUnixTime);\n\treturn true;\n}\n\nbool FNYSteamStatsAndAchievements::GetAchievementTitle(FName AchievementName, FText& OutTitle) const\n{\n\tFString Value;\n\tconst bool bStatus = InternalGetAchievementDisplayAttribute(AchievementName, TEXT(\"name\"), Value);\n\tOutTitle = FText::FromString(Value);\n\treturn bStatus;\n}\n\nbool FNYSteamStatsAndAchievements::GetAchievementDescription(FName AchievementName, FText& OutDescription) const\n{\n\tFString Value;\n\tconst bool bStatus = InternalGetAchievementDisplayAttribute(AchievementName, TEXT(\"desc\"), Value);\n\tOutDescription = FText::FromString(Value);\n\treturn bStatus;\n}\n\nbool FNYSteamStatsAndAchievements::IsAchievementHidden(FName AchievementName) const\n{\n\tFString Value;\n\tconst bool bStatus = InternalGetAchievementDisplayAttribute(AchievementName, TEXT(\"hidden\"), Value);\n\treturn bStatus && Value == TEXT(\"1\");\n}\n\nbool FNYSteamStatsAndAchievements::ShowAchievementProgress(FName AchievementName, int32 CurrentProgress, int32 MaxProgress) const\n{\n\tISteamUserStats* UserStats = SteamUserStats();\n\tif (!UserStats)\n\t{\n\t\tUE_LOG(LogNYSteamAchievements, Error, TEXT(\"ShowAchievementProgress: Can't get ISteamUserStats\"));\n\t\treturn false;\n\t}\n\n\treturn UserStats->IndicateAchievementProgress(TCHAR_TO_UTF8(*AchievementName.ToString()), CurrentProgress, MaxProgress);\n}\n\nbool FNYSteamStatsAndAchievements::RequestUserStats(const FUniqueNetId& PlayerId)\n{\n\tISteamUserStats* UserStats = SteamUserStats();\n\tif (!UserStats)\n\t{\n\t\tUE_LOG(LogNYSteamAchievements, Error, TEXT(\"RequestUserStats: Can't get ISteamUserStats\"));\n\t\treturn false;\n\t}\n\n\t// TODO? FOnlineAsyncTaskSteamGetAchievements\n\tconst FNYSteamUniqueNetId UserID{PlayerId};\n\tUserStats->RequestUserStats(UserID);\n\n\treturn true;\n}\n\nbool FNYSteamStatsAndAchievements::RequestCurrentStats()\n{\n\tif (bStatsReceivedValid)\n\t{\n\t\tUE_LOG(LogNYSteamAchievements, Log, TEXT(\"RequestCurrentStats: Stats already received\"))\n\t\tFNYSteamUserStatsReceived_Result Result;\n\t\tResult.bSuccess = true;\n\t\tUserStatsReceivedEvent.Broadcast(Result);\n\t\treturn true;\n\t}\n\n\tISteamUserStats* UserStats = SteamUserStats();\n\tif (!UserStats)\n\t{\n\t\tUE_LOG(LogNYSteamAchievements, Error, TEXT(\"RequestCurrentStats: Can't get ISteamUserStats\"));\n\t\treturn false;\n\t}\n\n\treturn UserStats->RequestCurrentStats();\n}\n\nbool FNYSteamStatsAndAchievements::StoreStats()\n{\n\tISteamUserStats* UserStats = SteamUserStats();\n\tif (!UserStats)\n\t{\n\t\tUE_LOG(LogNYSteamAchievements, Error, TEXT(\"StoreStats: Can't get ISteamUserStats\"));\n\t\treturn false;\n\t}\n\n\treturn UserStats->StoreStats();\n}\n\nbool FNYSteamStatsAndAchievements::SetIntStat(FName StatName, int32 Data)\n{\n\tconst FString ThisContext = FString::Printf(TEXT(\"SetIntStat(StatName = %s, Data = %d)\"), *StatName.ToString(), Data);\n\tif (!bStatsReceivedValid)\n\t{\n\t\tUE_LOG(LogNYSteamAchievements, Error, TEXT(\"%s: bStatsReceivedValid = false\"), *ThisContext);\n\t\treturn false;\n\t}\n\tISteamUserStats* UserStats = SteamUserStats();\n\tif (!UserStats)\n\t{\n\t\tUE_LOG(LogNYSteamAchievements, Error, TEXT(\"%s: Can't get ISteamUserStats\"), *ThisContext);\n\t\treturn false;\n\t}\n\n\treturn UserStats->SetStat(TCHAR_TO_UTF8(*StatName.ToString()), Data);\n}\n\nbool FNYSteamStatsAndAchievements::SetFloatStat(FName StatName, float Data)\n{\n\tconst FString ThisContext = FString::Printf(TEXT(\"SetFloatStat(StatName = %s, Data = %f)\"), *StatName.ToString(), Data);\n\tif (!bStatsReceivedValid)\n\t{\n\t\tUE_LOG(LogNYSteamAchievements, Error, TEXT(\"%s: bStatsReceivedValid = false\"), *ThisContext);\n\t\treturn false;\n\t}\n\tISteamUserStats* UserStats = SteamUserStats();\n\tif (!UserStats)\n\t{\n\t\tUE_LOG(LogNYSteamAchievements, Error, TEXT(\"%s: Can't get ISteamUserStats\"), *ThisContext);\n\t\treturn false;\n\t}\n\n\treturn UserStats->SetStat(TCHAR_TO_UTF8(*StatName.ToString()), Data);\n}\n\nbool FNYSteamStatsAndAchievements::ResetAllStats(bool bAchievementsToo)\n{\n\tISteamUserStats* UserStats = SteamUserStats();\n\tif (!UserStats)\n\t{\n\t\tUE_LOG(LogNYSteamAchievements, Error, TEXT(\"ResetAllStats: Can't get ISteamUserStats\"));\n\t\treturn false;\n\t}\n\n\t// NOTE: this calls StoreStats()\n\treturn UserStats->ResetAllStats(bAchievementsToo);\n}\n\nbool FNYSteamStatsAndAchievements::GetIntStat(FName StatName, int32& OutData)\n{\n\tconst FString ThisContext = FString::Printf(TEXT(\"GetIntStat(StatName = %s)\"), *StatName.ToString());\n\tif (!bStatsReceivedValid)\n\t{\n\t\tUE_LOG(LogNYSteamAchievements, Error, TEXT(\"%s: bStatsReceivedValid = false\"), *ThisContext);\n\t\treturn false;\n\t}\n\tISteamUserStats* UserStats = SteamUserStats();\n\tif (!UserStats)\n\t{\n\t\tUE_LOG(LogNYSteamAchievements, Error, TEXT(\"%s: Can't get ISteamUserStats\"), *ThisContext);\n\t\treturn false;\n\t}\n\n\treturn UserStats->GetStat(TCHAR_TO_UTF8(*StatName.ToString()), &OutData);\n}\n\nbool FNYSteamStatsAndAchievements::GetFloatStat(FName StatName, float& OutData)\n{\n\tconst FString ThisContext = FString::Printf(TEXT(\"GetFloatStat(StatName = %s)\"), *StatName.ToString());\n\tif (!bStatsReceivedValid)\n\t{\n\t\tUE_LOG(LogNYSteamAchievements, Error, TEXT(\"%s: bStatsReceivedValid = false\"), *ThisContext);\n\t\treturn false;\n\t}\n\tISteamUserStats* UserStats = SteamUserStats();\n\tif (!UserStats)\n\t{\n\t\tUE_LOG(LogNYSteamAchievements, Error, TEXT(\"%s: Can't get ISteamUserStats\"), *ThisContext);\n\t\treturn false;\n\t}\n\n\treturn UserStats->GetStat(TCHAR_TO_UTF8(*StatName.ToString()), &OutData);\n}\n\nbool FNYSteamStatsAndAchievements::InternalGetAchievementDisplayAttribute(FName AchievementName, const FString& Key, FString& OutValue) const\n{\n\tconst FString ThisContext = FString::Printf(\n\t\tTEXT(\"InternalGetAchievementDisplayAttribute(Name = %s, Key = %s)\"),\n\t\t*AchievementName.ToString(), *Key\n\t);\n\tif (!bStatsReceivedValid)\n\t{\n\t\tUE_LOG(LogNYSteamAchievements, Error, TEXT(\"%s: bStatsReceivedValid = false\"), *ThisContext);\n\t\treturn false;\n\t}\n\tISteamUserStats* UserStats = SteamUserStats();\n\tif (!UserStats)\n\t{\n\t\tUE_LOG(LogNYSteamAchievements, Error, TEXT(\"%s: Can't get ISteamUserStats\"), *ThisContext);\n\t\treturn false;\n\t}\n\n\tconst char* Value = UserStats->GetAchievementDisplayAttribute(TCHAR_TO_UTF8(*AchievementName.ToString()), TCHAR_TO_UTF8(*Key));\n\tOutValue = UTF8_TO_TCHAR(Value);\n\n\treturn false;\n}\n"
  },
  {
    "path": "Plugins/NotYetSteam/Source/NotYetSteam/Private/NYSteamAsyncEvents.h",
    "content": "// Copyright (c) Daniel Butum. All Rights Reserved.\n\n#pragma once\n\n#include \"CoreMinimal.h\"\n#include \"UObject/CoreOnline.h\"\n#include \"Templates/SharedPointer.h\"\n#include \"OnlineAsyncTaskManager.h\"\n#include \"NYSteamSubsystem.h\"\n#include \"NYSteamUniqueNetId.h\"\n#include \"NYSteamResult.h\"\n#include \"Interfaces/NYSteamStatsAndAchievements.h\"\n\n#include \"NYSteamAPI_Internal.h\"\n\n// For https://partner.steamgames.com/doc/api/ISteamUserStats#UserStatsStored_t\nclass FNYSteamAsyncStatsStoredEvent : public FOnlineAsyncEvent<FNYSteamSubsystem>\n{\n\ttypedef FOnlineAsyncEvent Super;\n\nprivate:\n\tconst FNYSteamUniqueNetId UserID;\n\tUserStatsStored_t CallbackResult;\n\n\t/** Hidden on purpose */\n\tFNYSteamAsyncStatsStoredEvent() :\n\t\tSuper(nullptr),\n\t\tUserID(0),\n\t\tCallbackResult{0}\n\t{\n\t}\n\npublic:\n\tFNYSteamAsyncStatsStoredEvent(FNYSteamSubsystem* InSubsystem, const FNYSteamUniqueNetId& InUserId, const UserStatsStored_t& InResult) :\n\t\tSuper(InSubsystem),\n\t\tUserID(InUserId),\n\t\tCallbackResult(InResult)\n\t{\n\t}\n\n\tvirtual ~FNYSteamAsyncStatsStoredEvent() {}\n\n\tFString ToString() const override\n\t{\n\t\treturn FString::Printf(\n\t\t\tTEXT(\"FNYSteamAsyncStatsStoredEvent bWasSuccessful: %d User: %s Result: %s\"),\n\t\t\tFNYSteamResultHelper::IsResultSuccess(CallbackResult.m_eResult),\n\t\t\t*UserID.ToDebugString(), *FNYSteamResultHelper::ResultToString(CallbackResult.m_eResult)\n\t\t);\n\t}\n\n\tvoid Finalize() override\n\t{\n\t\tSuper::Finalize();\n\t}\n\tvoid TriggerDelegates() override\n\t{\n\t\tSuper::TriggerDelegates();\n\n\t\tFNYSteamUserStatsStored_Result Result;\n\t\tResult.bSuccess = FNYSteamResultHelper::IsResultSuccess(CallbackResult.m_eResult);\n\n\t\tINYSteamStatsAndAchievementsPtr StatsAndAchievements =\n\t\t\tStaticCastSharedPtr<FNYSteamStatsAndAchievements>(Subsystem->GetStatsAndAchievements());\n\t\tStatsAndAchievements->OnUserStatsStored(Result);\n\t}\n};\n\n// For https://partner.steamgames.com/doc/api/ISteamUserStats#UserStatsReceived_t\nclass FNYSteamAsyncStatsReceivedEvent : public FOnlineAsyncEvent<FNYSteamSubsystem>\n{\n\ttypedef FOnlineAsyncEvent Super;\n\nprivate:\n\tconst FNYSteamUniqueNetId UserID;\n\tUserStatsReceived_t CallbackResult;\n\n\t/** Hidden on purpose */\n\tFNYSteamAsyncStatsReceivedEvent() :\n\t\tUserID(0),\n\t\tCallbackResult{0}\n\t{}\n\npublic:\n\tFNYSteamAsyncStatsReceivedEvent(FNYSteamSubsystem* InSubsystem, const FNYSteamUniqueNetId& InUserId, const UserStatsReceived_t& InResult) :\n\t\tFOnlineAsyncEvent(InSubsystem),\n\t\tUserID(InUserId),\n\t\tCallbackResult(InResult)\n\t{\n\t}\n\tvirtual ~FNYSteamAsyncStatsReceivedEvent() {}\n\n\t/**\n\t *\tGet a human readable description of task\n\t */\n\tFString ToString() const override\n\t{\n\t\treturn FString::Printf(\n\t\t\tTEXT(\"FNYSteamAsyncStatsReceivedEvent bWasSuccessful: %d User: %s Result: %s\"),\n\t\t\tFNYSteamResultHelper::IsResultSuccess(CallbackResult.m_eResult),\n\t\t\t*UserID.ToDebugString(), *FNYSteamResultHelper::ResultToString(CallbackResult.m_eResult)\n\t\t);\n\t}\n\n\tvoid Finalize() override\n\t{\n\t\tSuper::Finalize();\n\t}\n\tvoid TriggerDelegates() override\n\t{\n\t\tSuper::TriggerDelegates();\n\n\t\tFNYSteamUserStatsReceived_Result Result;\n\t\tResult.UserID = CallbackResult.m_steamIDUser.ConvertToUint64();\n\t\tResult.bSuccess = FNYSteamResultHelper::IsResultSuccess(CallbackResult.m_eResult);\n\t\tResult.bIsCurrentUser = UNYSteamHelper::IsCurrentUser(Result.UserID);\n\n\t\tINYSteamStatsAndAchievementsPtr StatsAndAchievements =\n\t\t\tStaticCastSharedPtr<FNYSteamStatsAndAchievements>(Subsystem->GetStatsAndAchievements());\n\t\tStatsAndAchievements->OnUserStatsReceived(Result);\n\t}\n};\n\n\n// For https://partner.steamgames.com/doc/api/ISteamUserStats#UserStatsUnloaded_t\nclass FNYSteamAsyncStatsUnloadedEvent : public FOnlineAsyncEvent<FNYSteamSubsystem>\n{\n\ttypedef FOnlineAsyncEvent Super;\n\nprivate:\n\tconst FNYSteamUniqueNetId UserID;\n\tUserStatsUnloaded_t CallbackResult;\n\n\t/** Hidden on purpose */\n\tFNYSteamAsyncStatsUnloadedEvent() :\n\t\tSuper(nullptr),\n\t\tUserID(0)\n\t{\n\t\tCallbackResult.m_steamIDUser.SetFromUint64(0);\n\t}\n\npublic:\n\tFNYSteamAsyncStatsUnloadedEvent(FNYSteamSubsystem* InSubsystem, const FNYSteamUniqueNetId& InUserId, const UserStatsUnloaded_t& InResult) :\n\t\tSuper(InSubsystem),\n\t\tUserID(InUserId),\n\t\tCallbackResult(InResult)\n\t{\n\t}\n\tvirtual ~FNYSteamAsyncStatsUnloadedEvent() {}\n\n\tFString ToString() const override\n\t{\n\t\treturn FString::Printf(\n\t\t\tTEXT(\"FNYSteamAsyncStatsUnloadedEvent User: %s\"),\n\t\t\t*UserID.ToDebugString()\n\t\t);\n\t}\n\n\tvoid Finalize() override\n\t{\n\t\tSuper::Finalize();\n\t}\n\tvoid TriggerDelegates() override\n\t{\n\t\tSuper::TriggerDelegates();\n\n\t\tFNYSteamUserStatsUnloaded_Result Result;\n\t\tResult.bSuccess = true;\n\t\tResult.UserID = CallbackResult.m_steamIDUser.ConvertToUint64();\n\t\tResult.bIsCurrentUser = UNYSteamHelper::IsCurrentUser(Result.UserID);\n\n\t\tINYSteamStatsAndAchievementsPtr StatsAndAchievements =\n\t\t\tStaticCastSharedPtr<FNYSteamStatsAndAchievements>(Subsystem->GetStatsAndAchievements());\n\t\tStatsAndAchievements->OnUserStatsUnloaded(Result);\n\t}\n};\n\n\n// For https://partner.steamgames.com/doc/api/ISteamUserStats#UserAchievementStored_t\nclass FNYSteamAsyncAchievementStoredEvent : public FOnlineAsyncEvent<FNYSteamSubsystem>\n{\n\ttypedef FOnlineAsyncEvent Super;\n\nprivate:\n\tUserAchievementStored_t CallbackResult;\n\tFNYSteamUserAchievementStored_Result Result;\n\n\t/** Hidden on purpose */\n\tFNYSteamAsyncAchievementStoredEvent() :\n\t\tSuper(nullptr)\n\t{\n\t}\n\npublic:\n\tFNYSteamAsyncAchievementStoredEvent(FNYSteamSubsystem* InSubsystem, const UserAchievementStored_t& InResult) :\n\t\tSuper(InSubsystem),\n\t\tCallbackResult(InResult)\n\t{\n\t\tResult.bSuccess = true;\n\t\tResult.AchievementName = *FString(UTF8_TO_TCHAR(CallbackResult.m_rgchAchievementName));\n\t\tResult.CurrentProgress = CallbackResult.m_nCurProgress;\n\t\tResult.MaxProgress = CallbackResult.m_nMaxProgress;\n\t}\n\n\tvirtual ~FNYSteamAsyncAchievementStoredEvent() {}\n\n\tFString ToString() const override\n\t{\n\t\treturn FString::Printf(\n\t\t\tTEXT(\"FNYSteamAsyncAchievementStoredEvent AchievementName = %s, CurrentProgress = %d, MaxProgress = %d\"),\n\t\t\t*Result.AchievementName.ToString(), Result.CurrentProgress, Result.MaxProgress\n\t\t);\n\t}\n\n\tvoid Finalize() override\n\t{\n\t\tSuper::Finalize();\n\t}\n\tvoid TriggerDelegates() override\n\t{\n\t\tSuper::TriggerDelegates();\n\n\t\tINYSteamStatsAndAchievementsPtr StatsAndAchievements =\n\t\t\tStaticCastSharedPtr<FNYSteamStatsAndAchievements>(Subsystem->GetStatsAndAchievements());\n\t\tStatsAndAchievements->OnUserAchievementStored(Result);\n\t}\n};\n"
  },
  {
    "path": "Plugins/NotYetSteam/Source/NotYetSteam/Private/NYSteamAsyncTaskManager.cpp",
    "content": "// Copyright (c) Daniel Butum. All Rights Reserved.\n\n#include \"NYSteamAsyncTaskManager.h\"\n#include \"NYSteamSubsystem.h\"\n#include \"NYSteamHelper.h\"\n#include \"NYSteamResult.h\"\n#include \"NYSteamAsyncEvents.h\"\n\nvoid FNYSteamAsyncTaskManager::OnlineTick()\n{\n\t// NOTE: this is done by the FOnlineAsyncTaskManagerSteam::OnlineTick()\n\tcheck(SteamSubsystem);\n\tcheck(FPlatformTLS::GetCurrentThreadId() == OnlineThreadId);\n\n\t// if (SteamSubsystem->IsSteamClientAvailable())\n\t// {\n\t// \tSteamAPI_RunCallbacks();\n\t// }\n\n\t// if (SteamSubsystem->IsSteamServerAvailable())\n\t// {\n\t// \tSteamGameServer_RunCallbacks();\n\t// }\n}\n\n\nvoid FNYSteamAsyncTaskManager::OnUserStatsStored(UserStatsStored_t* CallbackData)\n{\n\t// NOTE: not on the game thread\n\t// Wrong game?\n\tif (!UNYSteamHelper::IsCurrentGame(CallbackData->m_nGameID))\n\t{\n\t\tUE_LOG(LogNYSteamSubsystem, Warning, TEXT(\"OnUserStatsStored: but for wrong game. Ignoring\"));\n\t\treturn;\n\t}\n\tUE_LOG(LogNYSteamSubsystem, Verbose, TEXT(\"OnUserStatsStored\"));\n\n\t// Validate\n\tconst FNYSteamUniqueNetId UserID = UNYSteamHelper::GetSteamUserId();\n\tif (!FNYSteamResultHelper::IsResultSuccess(CallbackData->m_eResult))\n\t{\n\t\tUE_LOG(\n\t\t\tLogNYSteamSubsystem,\n\t\t\tError,\n\t\t\tTEXT(\"OnUserStatsStored: Error = %s\"),\n\t\t\t*FNYSteamResultHelper::ResultToString(CallbackData->m_eResult)\n\t\t);\n\t\tif (CallbackData->m_eResult == k_EResultFail)\n\t\t{\n\t\t\tUE_LOG(\n\t\t\t\tLogNYSteamSubsystem,\n\t\t\t\tError,\n\t\t\t\tTEXT(\"Invalid stats data set, stats have been reverted to state prior to last write.\")\n\t\t\t);\n\t\t}\n\t\tif (CallbackData->m_eResult == k_EResultInvalidParam)\n\t\t{\n\t\t\tUE_LOG(\n\t\t\t\tLogNYSteamSubsystem,\n\t\t\t\tError,\n\t\t\t\tTEXT(\"One or more stats we set broke a constraint. Invalid stats data set, stats have been reverted to state prior to last write.\")\n\t\t\t);\n\t\t}\n\t}\n\n\t// Fire event\n\tauto* NewEvent = new FNYSteamAsyncStatsStoredEvent(SteamSubsystem, UserID, *CallbackData);\n\tUE_LOG(LogNYSteamSubsystem, Verbose, TEXT(\"%s\"), *NewEvent->ToString());\n\tAddToOutQueue(NewEvent);\n}\n\nvoid FNYSteamAsyncTaskManager::OnUserStatsReceived(UserStatsReceived_t* CallbackData)\n{\n\t// NOTE: not on the game thread\n\t// Wrong game?\n\tif (!UNYSteamHelper::IsCurrentGame(CallbackData->m_nGameID))\n\t{\n\t\tUE_LOG(LogNYSteamSubsystem, Warning, TEXT(\"OnUserStatsReceived: but for wrong game. Ignoring\"));\n\t\treturn;\n\t}\n\tUE_LOG(LogNYSteamSubsystem, Verbose, TEXT(\"OnUserStatsReceived\"));\n\n\t// Validate\n\tconst FNYSteamUniqueNetId UserID{CallbackData->m_steamIDUser};\n\tif (!FNYSteamResultHelper::IsResultSuccess(CallbackData->m_eResult))\n\t{\n\t\tUE_LOG(\n\t\t\tLogNYSteamSubsystem,\n\t\t\tError,\n\t\t\tTEXT(\"Failed to obtain steam user stats, user: %s error: %s\"),\n\t\t\t*UserID.ToDebugString(), *FNYSteamResultHelper::ResultToString(CallbackData->m_eResult)\n\t\t);\n\t\tif (CallbackData->m_eResult == k_EResultFail)\n\t\t{\n\t\t\tUE_LOG(\n\t\t\t\tLogNYSteamSubsystem,\n\t\t\t\tError,\n\t\t\t\tTEXT(\"OnUserStatsReceived: Failed to obtain steam user stats, user: %s has no stats entries\"),\n\t\t\t\t*UserID.ToDebugString()\n\t\t\t);\n\t\t}\n\t}\n\n\t// Fire Event\n\tauto* NewEvent = new FNYSteamAsyncStatsReceivedEvent(SteamSubsystem, UserID, *CallbackData);\n\tUE_LOG(LogNYSteamSubsystem, Verbose, TEXT(\"%s\"), *NewEvent->ToString());\n\tAddToOutQueue(NewEvent);\n}\n\nvoid FNYSteamAsyncTaskManager::OnUserStatsUnloaded(UserStatsUnloaded_t* CallbackData)\n{\n\t// NOTE: not on the game thread\n\tUE_LOG(LogNYSteamSubsystem, Verbose, TEXT(\"OnUserStatsUnloaded\"));\n\n\t// Fire Event\n\tconst FNYSteamUniqueNetId UserID{CallbackData->m_steamIDUser};\n\tauto* NewEvent = new FNYSteamAsyncStatsUnloadedEvent(SteamSubsystem, UserID, *CallbackData);\n\tUE_LOG(LogNYSteamSubsystem, Verbose, TEXT(\"%s\"), *NewEvent->ToString());\n\tAddToOutQueue(NewEvent);\n}\n\nvoid FNYSteamAsyncTaskManager::OnUserAchievementStored(UserAchievementStored_t* CallbackData)\n{\n\t// NOTE: not on the game thread\n\t// Wrong game?\n\tif (!UNYSteamHelper::IsCurrentGame(CallbackData->m_nGameID))\n\t{\n\t\tUE_LOG(LogNYSteamSubsystem, Warning, TEXT(\"OnUserAchievementStored: but for wrong game. Ignoring\"));\n\t\treturn;\n\t}\n\tUE_LOG(LogNYSteamSubsystem, Verbose, TEXT(\"OnUserAchievementStored\"));\n\n\t// Fire Event\n\tauto* NewEvent = new FNYSteamAsyncAchievementStoredEvent(SteamSubsystem, *CallbackData);\n\tUE_LOG(LogNYSteamSubsystem, Verbose, TEXT(\"%s\"), *NewEvent->ToString());\n\tAddToOutQueue(NewEvent);\n\n}\n"
  },
  {
    "path": "Plugins/NotYetSteam/Source/NotYetSteam/Private/NYSteamAsyncTaskManager.h",
    "content": "// Copyright (c) Daniel Butum. All Rights Reserved.\n\n#pragma once\n\n#include \"CoreMinimal.h\"\n#include \"OnlineAsyncTaskManager.h\"\n\n#include \"NYSteamAPI_Internal.h\"\n\nclass FNYSteamSubsystem;\n\nclass FNYSteamAsyncTaskManager : public FOnlineAsyncTaskManager\n{\n\ttypedef FNYSteamAsyncTaskManager ThisClass;\npublic:\n\tFNYSteamAsyncTaskManager(FNYSteamSubsystem* InSteamSubsystem) :\n\t\tOnUserStatsStoredCallback(this, &ThisClass::OnUserStatsStored),\n\t\tOnUserStatsReceivedCallback(this, &ThisClass::OnUserStatsReceived),\n\t\tOnUserStatsUnloadedCallback(this, &ThisClass::OnUserStatsUnloaded),\n\t\tOnUserAchievementStoredCallback(this, &ThisClass::OnUserAchievementStored),\n\t\tSteamSubsystem(InSteamSubsystem)\n\t{}\n\n\t~FNYSteamAsyncTaskManager()\n\t{\n\t}\n\n\t// FOnlineAsyncTaskManager\n\tvirtual void OnlineTick() override;\n\nprotected:\n\n\t//\n\t// Create Steam callback\n\t//\n\n\t// Result of a request to store the user stats.\n\tSTEAM_CALLBACK(ThisClass, OnUserStatsStored, UserStatsStored_t, OnUserStatsStoredCallback);\n\n\t// Called when the latest stats and achievements for a specific user (including the local user) have been received from the server.\n\tSTEAM_CALLBACK(ThisClass, OnUserStatsReceived, UserStatsReceived_t, OnUserStatsReceivedCallback);\n\n\t// Callback indicating that a user's stats have been unloaded.\n\tSTEAM_CALLBACK(ThisClass, OnUserStatsUnloaded, UserStatsUnloaded_t, OnUserStatsUnloadedCallback);\n\n\t// Result of a request to store the achievements on the server, or an \"indicate progress\" call.\n\tSTEAM_CALLBACK(ThisClass, OnUserAchievementStored, UserAchievementStored_t, OnUserAchievementStoredCallback);\n\n\t// Cached reference to the main online subsystem\n\tFNYSteamSubsystem* SteamSubsystem = nullptr;\n};\n"
  },
  {
    "path": "Plugins/NotYetSteam/Source/NotYetSteam/Private/NYSteamHelper.cpp",
    "content": "// Copyright (c) Daniel Butum. All Rights Reserved.\n\n// Copyright 2019 Daniel Butum\n\n#include \"NYSteamHelper.h\"\n\n#include \"NYSteamAPI_Internal.h\"\n#include \"INotYetSteamModule.h\"\n\nDEFINE_LOG_CATEGORY_STATIC(LogNYSteamHelper, All, All)\n\nbool UNYSteamHelper::Initialize(int32 AppId, bool bRequireRelaunch)\n{\n\tINYSteamSubsystemPtr Steam = INotYetSteamModule::Get().GetSteamSubsystem();\n\tif (!Steam.IsValid())\n\t{\n\t\tUE_LOG(LogNYSteamHelper, Error, TEXT(\"Initialize: INYSteamSubsystemPtr is not valid\"));\n\t\treturn false;\n\t}\n\n\tif (bRequireRelaunch && Steam->RestartAppIfNecessary(AppId))\n\t{\n\t\treturn false;\n\t}\n\n\treturn Steam->Initialize();\n\n\t// if (!SteamAPI_Init())\n\t// {\n\t// \tUE_LOG(LogNYSteamHelper, Warning, TEXT(\"Steam failed to initialize (SteamAPI_Init() failed)\"));\n\t// \treturn false;\n\t// }\n\n\t// ISteamController* Controller = SteamController();\n\t// if (!Controller)\n\t// {\n\t// \tUE_LOG(LogNYSteamHelper, Warning, TEXT(\"Failed to get SteamController()\"));\n\t// \treturn false;\n\t// }\n\n\t// // TODO: why it crashes here?\n\t// // Tried:\n\t// // 1. Removing the steam dll from the engine\n\t// // 2. Replacing the dll from the engine with the updated one\n\t// // 3. Renaming our dll to notyet_steam.dll and using that\n\t// // Apparently UE does not like we have our own steam library version :(\n\t// if (!SteamController()->Init())\n\t// {\n\t// \tUE_LOG(LogNYSteamHelper, Warning, TEXT(\"Failed SteamController()->Init()\"));\n\t// \treturn false;\n\t// }\n\n\t// UE_LOG(LogNYSteamHelper, Log, TEXT(\"Initialized Steam SDK\"));\n}\n\nbool UNYSteamHelper::IsCurrentUser(uint64 UserID)\n{\n\tif (!SteamUser())\n\t{\n\t\treturn false;\n\t}\n\n\treturn GetCSteamID() == UserID;\n}\n\nbool UNYSteamHelper::IsCurrentUser(const FUniqueNetId& UserID)\n{\n\tif (!SteamUser())\n\t{\n\t\treturn false;\n\t}\n\n\t// NOTE: we do not need this as this assumes we can't ever be in offline mode\n\t//if (!User->BLoggedOn())\n\t//{\n\t//\treturn false;\n\t//}\n\n\tconst CSteamID SteamId = ConvertUniqueNetIdToUInt64(UserID);\n\treturn GetCSteamID() == SteamId;\n}\n\nbool UNYSteamHelper::IsCurrentGame(uint64 GameID)\n{\n\tif (!SteamUser())\n\t{\n\t\treturn false;\n\t}\n\n\treturn GameID == GetCGameID().ToUint64();\n}\n\nCSteamID UNYSteamHelper::GetCSteamID()\n{\n\tISteamUser* User = SteamUser();\n\tif (!User)\n\t{\n\t\treturn k_steamIDNil;\n\t}\n\n\treturn User->GetSteamID();\n}\n\nuint32 UNYSteamHelper::GetAppIDAsUInt32()\n{\n\tISteamUtils* Utils = SteamUtils();\n\tif (!Utils)\n\t{\n\t\treturn 0;\n\t}\n\n\treturn Utils->GetAppID();\n}\n\nFString UNYSteamHelper::GetDllAPI64Sha1Sum()\n{\n\tINYSteamSubsystemPtr Steam = INotYetSteamModule::Get().GetSteamSubsystem();\n\tif (!Steam.IsValid())\n\t{\n\t\treturn TEXT(\"\");\n\t}\n\n\treturn Steam->GetDllAPI64Sha1Sum();\n}\n\nFString UNYSteamHelper::GetCurrentGameLanguage()\n{\n\tISteamApps* Apps = SteamApps();\n\tif (!Apps)\n\t{\n\t\treturn TEXT(\"\");\n\t}\n\n\treturn FString(ANSI_TO_TCHAR(Apps->GetCurrentGameLanguage()));\n}\n"
  },
  {
    "path": "Plugins/NotYetSteam/Source/NotYetSteam/Private/NYSteamResult.cpp",
    "content": "// Copyright (c) Daniel Butum. All Rights Reserved.\n\n#include \"NYSteamResult.h\"\n\n\nFString FNYSteamResultHelper::ResultToString(EResult Result)\n{\n\t// https://partner.steamgames.com/doc/api/steam_api#EResult\n\tFString ReturnVal;\n\n\t#define SteamResultCase(Value, Desc) \\\n\t\tcase Value: ReturnVal = FString::Printf(TEXT(\"'%i' %s (%s)\"), static_cast<int32>(Value), TEXT(#Value), Desc); break;\n\n\tswitch (Result)\n\t{\n\tSteamResultCase(k_EResultOK,\t\t\t\t\t\t\t\tTEXT(\"success\"));\n\tSteamResultCase(k_EResultFail,\t\t\t\t\t\t\t\tTEXT(\"failure\"));\n\tSteamResultCase(k_EResultNoConnection,\t\t\t\t\t\tTEXT(\"no connection\"));\n\tSteamResultCase(k_EResultInvalidPassword,\t\t\t\t\tTEXT(\"invalid password/ticket\"));\n\tSteamResultCase(k_EResultLoggedInElsewhere,\t\t\t\t\tTEXT(\"same user logged in elsewhere\"));\n\tSteamResultCase(k_EResultInvalidProtocolVer,\t\t\t\tTEXT(\"incorrect protocol version\"));\n\tSteamResultCase(k_EResultInvalidParam,\t\t\t\t\t\tTEXT(\"a parameter is incorrect\"));\n\tSteamResultCase(k_EResultFileNotFound,\t\t\t\t\t\tTEXT(\"file not found\"));\n\tSteamResultCase(k_EResultBusy,\t\t\t\t\t\t\t\tTEXT(\"called method busy, no action taken\"));\n\tSteamResultCase(k_EResultInvalidState,\t\t\t\t\t\tTEXT(\"called object in invalid state\"));\n\tSteamResultCase(k_EResultInvalidName,\t\t\t\t\t\tTEXT(\"invalid name\"));\n\tSteamResultCase(k_EResultInvalidEmail,\t\t\t\t\t\tTEXT(\"invalid email\"));\n\tSteamResultCase(k_EResultDuplicateName,\t\t\t\t\t\tTEXT(\"duplicate name\"));\n\tSteamResultCase(k_EResultAccessDenied,\t\t\t\t\t\tTEXT(\"access denied\"));\n\tSteamResultCase(k_EResultTimeout,\t\t\t\t\t\t\tTEXT(\"operation timed out\"));\n\tSteamResultCase(k_EResultBanned,\t\t\t\t\t\t\tTEXT(\"VAC banned\"));\n\tSteamResultCase(k_EResultAccountNotFound,\t\t\t\t\tTEXT(\"account not found\"));\n\tSteamResultCase(k_EResultInvalidSteamID,\t\t\t\t\tTEXT(\"steamid invalid\"));\n\tSteamResultCase(k_EResultServiceUnavailable,\t\t\t\tTEXT(\"requested service currently unavailable\"));\n\tSteamResultCase(k_EResultNotLoggedOn,\t\t\t\t\t\tTEXT(\"user is not logged on\"));\n\tSteamResultCase(k_EResultPending,\t\t\t\t\t\t\tTEXT(\"request is pending - may be in process, or waiting on third party\"));\n\tSteamResultCase(k_EResultEncryptionFailure,\t\t\t\t\tTEXT(\"encryption or decryption failed\"));\n\tSteamResultCase(k_EResultInsufficientPrivilege,\t\t\t\tTEXT(\"insufficient privilege\"));\n\tSteamResultCase(k_EResultLimitExceeded,\t\t\t\t\t\tTEXT(\"limit exceeded\"));\n\tSteamResultCase(k_EResultRevoked,\t\t\t\t\t\t\tTEXT(\"access revoked\"));\n\tSteamResultCase(k_EResultExpired,\t\t\t\t\t\t\tTEXT(\"license or guest pass expired\"));\n\tSteamResultCase(k_EResultAlreadyRedeemed,\t\t\t\t\tTEXT(\"guest pass already redeemed\"));\n\tSteamResultCase(k_EResultDuplicateRequest,\t\t\t\t\tTEXT(\"duplicate request, already occurred, ignoring\"));\n\tSteamResultCase(k_EResultAlreadyOwned,\t\t\t\t\t\tTEXT(\"already owned\"));\n\tSteamResultCase(k_EResultIPNotFound,\t\t\t\t\t\tTEXT(\"IP address not found\"));\n\tSteamResultCase(k_EResultPersistFailed,\t\t\t\t\t\tTEXT(\"failed to write change to data store\"));\n\tSteamResultCase(k_EResultLockingFailed,\t\t\t\t\t\tTEXT(\"failed to acquire access lock for operation\"));\n\tSteamResultCase(k_EResultLogonSessionReplaced,\t\t\t\tTEXT(\"???\"));\n\tSteamResultCase(k_EResultConnectFailed,\t\t\t\t\t\tTEXT(\"???\"));\n\tSteamResultCase(k_EResultHandshakeFailed,\t\t\t\t\tTEXT(\"???\"));\n\tSteamResultCase(k_EResultIOFailure,\t\t\t\t\t\t\tTEXT(\"input/output failure\"));\n\tSteamResultCase(k_EResultRemoteDisconnect,\t\t\t\t\tTEXT(\"???\"));\n\tSteamResultCase(k_EResultShoppingCartNotFound,\t\t\t\tTEXT(\"failed to find shopping cart requested\"));\n\tSteamResultCase(k_EResultBlocked,\t\t\t\t\t\t\tTEXT(\"blocked\"));\n\tSteamResultCase(k_EResultIgnored,\t\t\t\t\t\t\tTEXT(\"ignored\"));\n\tSteamResultCase(k_EResultNoMatch,\t\t\t\t\t\t\tTEXT(\"nothing matching request found\"));\n\tSteamResultCase(k_EResultAccountDisabled,\t\t\t\t\tTEXT(\"???\"));\n\tSteamResultCase(k_EResultServiceReadOnly,\t\t\t\t\tTEXT(\"service not accepting content changes right now\"));\n\tSteamResultCase(k_EResultAccountNotFeatured,\t\t\t\tTEXT(\"???\"));\n\tSteamResultCase(k_EResultAdministratorOK,\t\t\t\t\tTEXT(\"allowed to take this action, but only because requester is admin\"));\n\tSteamResultCase(k_EResultContentVersion,\t\t\t\t\tTEXT(\"version mismatch in transmitted content\"));\n\tSteamResultCase(k_EResultTryAnotherCM,\t\t\t\t\t\tTEXT(\"???\"));\n\tSteamResultCase(k_EResultPasswordRequiredToKickSession,\t\tTEXT(\"you are already logged in elsewhere, this cached credential login has failed.\"));\n\tSteamResultCase(k_EResultAlreadyLoggedInElsewhere,\t\t\tTEXT(\"already logged in elsewhere, must wait\"));\n\tSteamResultCase(k_EResultSuspended,\t\t\t\t\t\t\tTEXT(\"operation suspended/paused\"));\n\tSteamResultCase(k_EResultCancelled,\t\t\t\t\t\t\tTEXT(\"operation cancelled\"));\n\tSteamResultCase(k_EResultDataCorruption,\t\t\t\t\tTEXT(\"operation cancelled due to corrupt data\"));\n\tSteamResultCase(k_EResultDiskFull,\t\t\t\t\t\t\tTEXT(\"operation cancelled due to lack of disk space\"));\n\tSteamResultCase(k_EResultRemoteCallFailed,\t\t\t\t\tTEXT(\"remote call or IPC call failed\"));\n\tSteamResultCase(k_EResultPasswordUnset,\t\t\t\t\t\tTEXT(\"password not verified, as it's unset serverside\"));\n\tSteamResultCase(k_EResultExternalAccountUnlinked,\t\t\tTEXT(\"external account not linked to a steam account\"));\n\tSteamResultCase(k_EResultPSNTicketInvalid,\t\t\t\t\tTEXT(\"PSN ticket invalid\"));\n\tSteamResultCase(k_EResultExternalAccountAlreadyLinked,\t\tTEXT(\"external account linked to other account\"));\n\tSteamResultCase(k_EResultRemoteFileConflict,\t\t\t\tTEXT(\"sync cannot resume, conflict between local and remote files\"));\n\tSteamResultCase(k_EResultIllegalPassword,\t\t\t\t\tTEXT(\"requested password not legal\"));\n\tSteamResultCase(k_EResultSameAsPreviousValue,\t\t\t\tTEXT(\"new value same as old\"));\n\tSteamResultCase(k_EResultAccountLogonDenied,\t\t\t\tTEXT(\"account login denied due to 2nd factor auth failure\"));\n\tSteamResultCase(k_EResultCannotUseOldPassword,\t\t\t\tTEXT(\"requested password not legal\"));\n\tSteamResultCase(k_EResultInvalidLoginAuthCode,\t\t\t\tTEXT(\"account login denied, invalid auth code\"));\n\tSteamResultCase(k_EResultAccountLogonDeniedNoMail,\t\t\tTEXT(\"account login denied due to 2nd factor auth failure\"));\n\tSteamResultCase(k_EResultHardwareNotCapableOfIPT,\t\t\tTEXT(\"???\"));\n\tSteamResultCase(k_EResultIPTInitError,\t\t\t\t\t\tTEXT(\"???\"));\n\tSteamResultCase(k_EResultParentalControlRestricted,\t\t\tTEXT(\"operation failed due to parental controls\"));\n\tSteamResultCase(k_EResultFacebookQueryError,\t\t\t\tTEXT(\"facebook query returned error\"));\n\tSteamResultCase(k_EResultExpiredLoginAuthCode,\t\t\t\tTEXT(\"account login denied, expired auth code\"));\n\tSteamResultCase(k_EResultIPLoginRestrictionFailed,\t\t\tTEXT(\"???\"));\n\tSteamResultCase(k_EResultAccountLockedDown,\t\t\t\t\tTEXT(\"???\"));\n\tSteamResultCase(k_EResultAccountLogonDeniedVerifiedEmailRequired,\tTEXT(\"???\"));\n\tSteamResultCase(k_EResultNoMatchingURL,\t\t\t\t\t\tTEXT(\"no matching URL\"));\n\n\tdefault:\n\t\tReturnVal = FString::Printf(TEXT(\"Unknown EResult result: %i (check Steam SDK)\"), (int32)Result);\n\t\tbreak;\n\t}\n\n\t#undef SteamResultCase\n\n\treturn ReturnVal;\n}\n"
  },
  {
    "path": "Plugins/NotYetSteam/Source/NotYetSteam/Private/NYSteamSubsystem.cpp",
    "content": "// Copyright (c) Daniel Butum. All Rights Reserved.\n\n#include \"NYSteamSubsystem.h\"\n\n\n\n#include \"HAL/RunnableThread.h\"\n#include \"CoreGlobals.h\"\n#include \"Misc/ConfigCacheIni.h\"\n#include \"Misc/SecureHash.h\"\n\n#include \"Interfaces/NYSteamStatsAndAchievements.h\"\n#include \"Interfaces/NYSteamPresence.h\"\n#include \"Interfaces/NYSteamExternalUI.h\"\n#include \"NYSteamAsyncTaskManager.h\"\n#include \"NYSteamHelper.h\"\n#include \"Misc/FileHelper.h\"\n\n#if PLATFORM_WINDOWS\n#include \"Windows/AllowWindowsPlatformTypes.h\"\n#include <libloaderapi.h>\n#include <minwindef.h>\n#include \"Windows/HideWindowsPlatformTypes.h\"\n#endif\n\nDEFINE_LOG_CATEGORY(LogNYSteamSubsystem)\n\nbool FNYSteamSubsystem::Initialize()\n{\n\t// Already initialized\n\tif (AsyncTaskManagerRunnable != nullptr)\n\t{\n\t\treturn true;\n\t}\n\n\tUE_LOG(LogNYSteamSubsystem, Log, TEXT(\"Initialize\"));\n\n\tUnrealSteamSubsystem = GetUnrealSteamSubsystem();\n\tif (!UnrealSteamSubsystem)\n\t{\n\t\tUE_LOG(LogNYSteamSubsystem, Error, TEXT(\"Initialize: failed to get Unreal Steam Subsystem\"));\n\t\treturn false;\n\t}\n\n\tUnrealSteamSubsystem->Init();\n\n\t// Try to init steam subsystem\n\t// if (!IsEnabled())\n\t// {\n\t// \tUE_LOG(LogNYSteamSubsystem, Warning, TEXT(\"Initialize: Steam is not Initialized !IsEnabled(). Trying to Init it ourselfs\"));\n\t// \tif (UnrealSteamSubsystem && !UnrealSteamSubsystem->Init())\n\t// \t{\n\t// \t\tUE_LOG(LogNYSteamSubsystem, Error, TEXT(\"Initialize: Failed !UnrealSteamSubsystem->Init()\"));\n\t// \t\tUnrealSteamSubsystem = nullptr;\n\t// \t\treturn false;\n\t// \t}\n\t// }\n\n\t// Should be valid here\n\t// if (!IsEnabled())\n\t// {\n\t// \tUE_LOG(LogNYSteamSubsystem, Error, TEXT(\"Initialize: Steam is not Initialized after the second try\"));\n\t// \treturn false;\n\t// }\n\n\t// We can initialize here the thread and interfaces\n\tAsyncTaskManagerRunnable = new FNYSteamAsyncTaskManager(this);\n\tcheck(AsyncTaskManagerRunnable);\n\tconst FString InstanceName = TEXT(\"NotYet\");\n\tAsyncTaskThread = FRunnableThread::Create(AsyncTaskManagerRunnable, *FString::Printf(TEXT(\"NYSteamAsyncTaskThread %s\"), *InstanceName), 128 * 1024, TPri_Normal);\n\tcheck(AsyncTaskThread);\n\tUE_LOG(LogNYSteamSubsystem, Verbose, TEXT(\"Created thread (ID:%d).\"), AsyncTaskThread->GetThreadID());\n\n\tStatsAndAchievementsInterface = MakeShareable(new FNYSteamStatsAndAchievements(this));\n\tPresenceInterface = MakeShareable(new FNYSteamPresence(this));\n\tExternalUIInterface = MakeShareable(new FNYSteamExternalUI(this));\n\n\treturn true;\n}\n\nbool FNYSteamSubsystem::RestartAppIfNecessary(int32 AppId) const\n{\n#if WITH_EDITOR\n\treturn false;\n#endif\n\n\t// Check if we need to relaunch\n\t// This should have worked inside the Engine but epic programmers are super incompetent\n\tif (!GConfig)\n\t\treturn false;\n\n\t// Compiled time so what we don't make  it too easy on crackers, at least 5 minutes of work ;)\n\t// GConfig->GetInt(TEXT(\"OnlineSubsystemSteam\"), TEXT(\"SteamDevAppId\"), RelaunchAppId, GEngineIni);\n\t// GConfig->GetBool(TEXT(\"OnlineSubsystemSteam\"), TEXT(\"bRelaunchInSteam\"), bRequireRelaunch, GEngineIni);\n\tif (AppId != 0 && SteamAPI_RestartAppIfNecessary(AppId))\n\t{\n\t\tif (FPlatformProperties::IsGameOnly() || FPlatformProperties::IsServerOnly())\n\t\t{\n\t\t\tUE_LOG(LogNYSteamSubsystem, Log, TEXT(\"Game restarting within Steam client, exiting\"));\n\t\t\tFPlatformMisc::RequestExit(false);\n\t\t\treturn true;\n\t\t}\n\t}\n\n\treturn false;\n}\n\nFString FNYSteamSubsystem::GetDllAPI64Sha1Sum() const\n{\n\tFString HashString;\n\tvoid* DllHandle = InternalGetDllAPI64Sha1Sum(HashString);\n\tFPlatformProcess::FreeDllHandle(DllHandle);\n\treturn HashString;\n}\n\nvoid* FNYSteamSubsystem::InternalGetDllAPI64Sha1Sum(FString& HashString)\n{\n\tvoid* DllHandle = nullptr;\n#if PLATFORM_WINDOWS\n\tDllHandle = FPlatformProcess::GetDllHandle(TEXT(\"steam_api64\"));\n\tHMODULE SteamDllHandle = (HMODULE)DllHandle;\n\tif (!SteamDllHandle)\n\t{\n\t\treturn DllHandle;\n\t}\n\n\t// Get full path\n\tTCHAR Path[MAX_PATH];\n\tif (GetModuleFileName(SteamDllHandle, Path, sizeof(Path)) == 0)\n\t{\n\t\treturn DllHandle;\n\t}\n\n\t// UE_LOG(LogNYSteamSubsystem, Log, TEXT(\"DLL Path: = %s\"), Path);\n\n\t// FString PathStr(Path);\n\t// Load the data of the dll\n\tTArray<uint8> Data;\n\tif (!FFileHelper::LoadFileToArray(Data, Path))\n\t{\n\t\treturn DllHandle;\n\t}\n\n\t// Calculate Raw SHA1 sum\n\tstatic constexpr uint32 HashLength = 20;\n\tuint8 HashArray[HashLength];\n\tFSHA1::HashBuffer(Data.GetData(), Data.Num(), HashArray);\n\tGetHashString(HashArray, HashLength, HashString);\n#endif\n\n\treturn DllHandle;\n}\n\nbool FNYSteamSubsystem::Shutdown()\n{\n\t//if (IsEnabled())\n\t//{\n\t//\tUnrealSteamSubsystem->Shutdown();\n\t//}\n\tUnrealSteamSubsystem = nullptr;\n\n\tif (StatsAndAchievementsInterface.IsValid())\n\t{\n\t\tStatsAndAchievementsInterface = nullptr;\n\t}\n\tif (PresenceInterface.IsValid())\n\t{\n\t\tPresenceInterface = nullptr;\n\t}\n\tif (ExternalUIInterface.IsValid())\n\t{\n\t\tExternalUIInterface = nullptr;\n\t}\n\n\tif (AsyncTaskThread)\n\t{\n\t\tdelete AsyncTaskThread;\n\t\tAsyncTaskThread = nullptr;\n\t}\n\n\tif (AsyncTaskManagerRunnable)\n\t{\n\t\tdelete AsyncTaskManagerRunnable;\n\t\tAsyncTaskManagerRunnable = nullptr;\n\t}\n\n\treturn true;\n}\n\nbool FNYSteamSubsystem::IsEnabled() const\n{\n\treturn UnrealSteamSubsystem && UnrealSteamSubsystem->IsEnabled();;\n}\n\nFString FNYSteamSubsystem::GetCurrentGameLanguage() const\n{\n\treturn UNYSteamHelper::GetCurrentGameLanguage();\n}\n\nFString FNYSteamSubsystem::GetAppIDAsString() const\n{\n\treturn UNYSteamHelper::GetAppIDAsString();\n}\n\nuint32 FNYSteamSubsystem::GetAppIDAsUInt32() const\n{\n\treturn UNYSteamHelper::GetAppIDAsUInt32();\n}\n\n\n// void FNYSteamSubsystem::QueueAsyncTask(FOnlineAsyncTask* AsyncTask)\n// {\n// \tcheck(AsyncTaskManagerRunnable);\n// \tAsyncTaskManagerRunnable->AddToInQueue(AsyncTask);\n// }\n\n// void FNYSteamSubsystem::QueueAsyncOutgoingItem(FOnlineAsyncItem* AsyncItem)\n// {\n// \tcheck(AsyncTaskManagerRunnable);\n// \tAsyncTaskManagerRunnable->AddToOutQueue(AsyncItem);\n// }\n\nbool FNYSteamSubsystem::Tick(float DeltaTime)\n{\n\tif (!IsEnabled())\n\t{\n\t\treturn true;\n\t}\n\n\tInitialize();\n\tif (AsyncTaskManagerRunnable)\n\t{\n\t\tAsyncTaskManagerRunnable->GameTick();\n\t}\n\n\treturn true;\n}\n\nvoid FNYSteamSubsystem::GetHashString(uint8* HashArray, uint32 HashLength, FString& OutString)\n{\n\tfor (uint32 Idx = 0; Idx < HashLength; Idx++)\n\t{\n\t\tOutString += FString::Printf(TEXT(\"%02x\"), HashArray[Idx]);\n\t}\n}\n"
  },
  {
    "path": "Plugins/NotYetSteam/Source/NotYetSteam/Private/NYSteamSubsystem.h",
    "content": "// Copyright (c) Daniel Butum. All Rights Reserved.\n\n#pragma once\n\n#include \"CoreMinimal.h\"\n#include \"Containers/Ticker.h\"\n\n#include \"INYSteamSubsystem.h\"\n\nclass FOnlineAsyncTask;\nclass FOnlineAsyncItem;\nclass FNYSteamAsyncTaskManager;\nclass FRunnableThread;\n\nDECLARE_LOG_CATEGORY_EXTERN(LogNYSteamSubsystem, All, All)\n\nclass FNYSteamSubsystem : public INYSteamSubsystem, public FTickerObjectBase\n{\n\ttypedef FNYSteamSubsystem Self;\npublic:\n\tFNYSteamSubsystem() {}\n\tvirtual ~FNYSteamSubsystem() {}\n\n\t// INYSteamSubsystem interface\n\tbool Initialize() override;\n\tbool Shutdown() override;\n\tbool IsEnabled() const override;\n\tbool RestartAppIfNecessary(int32 AppId) const override;\n\tFString GetDllAPI64Sha1Sum() const override;\n\n\tINYSteamStatsAndAchievementsPtr GetStatsAndAchievements() const override { return StatsAndAchievementsInterface;  }\n\tINYSteamPresencePtr GetPresence() const override { return PresenceInterface; }\n\tINYSteamExternalUIPtr GetExternalUI() const override { return ExternalUIInterface; }\n\n\tFString GetCurrentGameLanguage() const override;\n\tFString GetAppIDAsString() const override;\n\tuint32 GetAppIDAsUInt32() const override;\n\nprotected:\n \tbool Tick(float DeltaTime) override;\n\n\tstatic void* InternalGetDllAPI64Sha1Sum(FString& HashString);\n\tstatic void GetHashString(uint8* HashArray, uint32 HashLength, FString& OutString);\n\n\t//\n\t//\tAdd an async task onto the task queue for processing\n\t// @param AsyncTask - new heap allocated task to process on the async task thread\n\t//\n\t// void QueueAsyncTask(FOnlineAsyncTask* AsyncTask);\n\n\t//\n\t//\tAdd an async task onto the outgoing task queue for processing\n\t// @param AsyncItem - new heap allocated task to process on the async task thread\n\t//\n\t// void QueueAsyncOutgoingItem(FOnlineAsyncItem* AsyncItem);\n\nprotected:\n\t// Task and thread reference\n\tFNYSteamAsyncTaskManager* AsyncTaskManagerRunnable = nullptr;\n\tFRunnableThread* AsyncTaskThread = nullptr;\n\n\t// Unreal version\n\tIOnlineSubsystem* UnrealSteamSubsystem = nullptr;\n\n\t// Interfaces\n\tINYSteamStatsAndAchievementsPtr StatsAndAchievementsInterface = nullptr;\n\tINYSteamPresencePtr PresenceInterface = nullptr;\n\tINYSteamExternalUIPtr ExternalUIInterface = nullptr;\n};\n"
  },
  {
    "path": "Plugins/NotYetSteam/Source/NotYetSteam/Private/NotYetSteamModule.cpp",
    "content": "// Copyright (c) Daniel Butum. All Rights Reserved.\n\n#include \"NotYetSteamModule.h\"\n#include \"Core.h\"\n#include \"Modules/ModuleManager.h\"\n\n#include \"UObject/UObjectBase.h\"\n#include \"NYSteamSubsystem.h\"\n#include \"Templates/SharedPointer.h\"\n\n// From \"OnlineSubsystemSteamModule.h\"\n// Only allow steam on desktop platforms\n#define LOADING_STEAM_CLIENT_LIBRARY_DYNAMICALLY\t(PLATFORM_WINDOWS || PLATFORM_MAC || PLATFORM_LINUX)\n#define LOADING_STEAM_SERVER_LIBRARY_DYNAMICALLY\t((PLATFORM_WINDOWS && PLATFORM_32BITS) || (PLATFORM_LINUX && !IS_MONOLITHIC) || PLATFORM_MAC)\n#define LOADING_STEAM_LIBRARIES_DYNAMICALLY\t\t\t(LOADING_STEAM_CLIENT_LIBRARY_DYNAMICALLY || LOADING_STEAM_SERVER_LIBRARY_DYNAMICALLY)\n\n\nDEFINE_LOG_CATEGORY_STATIC(LogNotYetSteamModule, All, All)\n\n#define LOCTEXT_NAMESPACE \"FNotYetSteamModule\"\n\nvoid FNotYetSteamModule::StartupModule()\n{\n\tUE_LOG(LogNotYetSteamModule, Log, TEXT(\"StartupModule\"));\n\tif (bInitializeAtStartup)\n\t{\n\t\tUE_LOG(LogNotYetSteamModule, Log, TEXT(\"StartupModule: bInitializeAtStartup=true calling Initialize\"));\n\t\tInitialize();\n\t}\n}\n\nvoid FNotYetSteamModule::ShutdownModule()\n{\n\t// This function may be called during shutdown to clean up your module.  For modules that support dynamic reloading,\n\t// we call this function before unloading the module.\n\n\tif (SteamSubsystem.IsValid())\n\t{\n\t\tSteamSubsystem->Shutdown();\n\t\tSteamSubsystem.Reset();\n\t}\n\n#if LOADING_STEAM_LIBRARIES_DYNAMICALLY\n\t// Free the dll handle\n\tif (SteamClientLibraryHandle)\n\t{\n\t\tFPlatformProcess::FreeDllHandle(SteamClientLibraryHandle);\n\t\tSteamClientLibraryHandle = nullptr;\n\t}\n#endif\t//LOADING_STEAM_LIBRARIES_DYNAMICALLY\n\n\tUE_LOG(LogNotYetSteamModule, Log, TEXT(\"ShutdownModule\"));\n}\n\nvoid FNotYetSteamModule::Initialize()\n{\n\tif (SteamSubsystem.IsValid())\n\t{\n\t\tUE_LOG(LogNotYetSteamModule, Log, TEXT(\"Initialize: SteamSubsystem already initialized\"));\n\t\treturn;\n\t}\n\n\tSteamSubsystem = MakeShared<FNYSteamSubsystem, ESPMode::ThreadSafe>();\n\n\t// TOOD: remove this after we get rid of retarded unreal steam implementation\n\t// https://docs.unrealengine.com/en-US/Programming/Development/Tools/ConsoleManager/index.html\n#if !UE_BUILD_SHIPPING\n\tstatic const auto CVar = IConsoleManager::Get().FindConsoleVariable(TEXT(\"OSS.SteamInitServerOnClient\"));\n\tCVar->Set(0);\n#endif\n\n\t// if (AreSteamDllsLoaded())\n\t// {\n\t// \tUE_LOG(LogNotYetSteamModule, Warning, TEXT(\"Initialize: Steam DLLs are not loaded\"));\n\t// \treturn;\n\t// }\n\n\tLoadSteamModules();\n\tif (SteamClientLibraryHandle)\n\t{\n\t\tUE_LOG(LogNotYetSteamModule, Log, TEXT(\"Initialize: Loaded Steam SDK\"));\n\t}\n\telse\n\t{\n\t\tUE_LOG(LogNotYetSteamModule, Error, TEXT(\"Initialize: Failed to use own Steam third party library\"));\n\t}\n}\n\nbool FNotYetSteamModule::AreSteamDllsLoaded() const\n{\n\t// We assume it is statically linked on desktop and false otherwise (consoles)\n\tbool bLoadedClientDll = PLATFORM_DESKTOP;\n\n\t// Dynamicly linked\n#if LOADING_STEAM_LIBRARIES_DYNAMICALLY\n\tbLoadedClientDll = SteamClientLibraryHandle != nullptr;\n#endif\n\n\treturn bLoadedClientDll;\n}\n\nvoid FNotYetSteamModule::LoadSteamModules()\n{\n\tconst FString RootSteamPath = GetDllPath();\n\tUE_LOG(LogNotYetSteamModule, Log, TEXT(\"LogNotYetSteamModule::LoadDll Loading From %s\"), *RootSteamPath);\n\n\tFString SteamClientLibraryPath = TEXT(\"STEAM NOT SUPPORTED\");\n#if PLATFORM_WINDOWS\n\n\t#if PLATFORM_64BITS\n\t\tSteamClientLibraryPath = RootSteamPath + \"steam_api64.dll\";\n\t#else\n\t\tSteamClientLibraryPath = RootSteamPath + \"steam_api.dll\";\n\t#endif // PLATFORM_64BITS\n\n#elif PLATFORM_LINUX\n\tSteamClientLibraryPath = RootSteamPath + \"libsteam_api.so\";\n#endif\t// PLATFORM_WINDOWS\n\n\n#if LOADING_STEAM_LIBRARIES_DYNAMICALLY\n\tFPlatformProcess::PushDllDirectory(*RootSteamPath);\n\tSteamClientLibraryHandle = FPlatformProcess::GetDllHandle(*SteamClientLibraryPath);\n\tif (!SteamClientLibraryHandle)\n\t{\n\t\tconst FString Message = TEXT(\"Couldn't load Steam DLL = \") + SteamClientLibraryPath;\n\t\tFPlatformMisc::MessageBoxExt(EAppMsgType::Ok, *Message, TEXT(\"Error\"));\n\t\tUE_LOG(LogNotYetSteamModule, Error, TEXT(\"Failed to load Steam DLL = '%s'!\"), *SteamClientLibraryPath);\n\t}\n\tFPlatformProcess::PopDllDirectory(*RootSteamPath);\n#else\n\tUE_LOG(LogNotYetSteamModule, Warning, TEXT(\"Steam library = %s, should either be linked explicitly or this platform does not support steam.\"), *SteamClientLibraryPath);\n#endif // LOADING_STEAM_LIBRARIES_DYNAMICALLY\n}\n\nFString FNotYetSteamModule::GetDllPath()\n{\n\t//STEAM_SDK_ROOT_PATH\n\tconst FString BasePath = FPaths::EngineDir() / STEAM_SDK_ROOT_PATH / STEAM_SDK_VER_PATH;\n#if PLATFORM_WINDOWS\n\n\t#if PLATFORM_64BITS\n\t\treturn BasePath / TEXT(\"Win64/\");\n\t#else\n\t\treturn BasePath / TEXT(\"Win32/\");\n\t#endif\t//PLATFORM_64BITS\n\n#elif PLATFORM_LINUX\n\n\t#if PLATFORM_64BITS\n\t\treturn BasePath / TEXT(\"x86_64-unknown-linux-gnu/\");\n\t#else\n\t\treturn BasePath / TEXT(\"i686-unknown-linux-gnu/\");\n\t#endif\t//PLATFORM_64BITS\n\n#else\n\treturn FString();\n#endif\t//PLATFORM_WINDOWS\n}\n\n#undef LOCTEXT_NAMESPACE\n\nIMPLEMENT_MODULE(FNotYetSteamModule, NotYetSteam)\n"
  },
  {
    "path": "Plugins/NotYetSteam/Source/NotYetSteam/Private/NotYetSteamModule.h",
    "content": "// Copyright (c) Daniel Butum. All Rights Reserved.\n\n#pragma once\n\n#include \"INotYetSteamModule.h\"\n#include \"Containers/Ticker.h\"\n\nclass FNotYetSteamModule : public INotYetSteamModule\n{\n\ttypedef FNotYetSteamModule Self;\npublic:\n\n\t/** IModuleInterface implementation */\n\tvirtual void StartupModule() override;\n\tvirtual void ShutdownModule() override;\n\n\tvoid Initialize() override;\n\tbool AreSteamDllsLoaded() const override;\n\tINYSteamSubsystemPtr GetSteamSubsystem() const override { return SteamSubsystem; }\n\nprivate:\n    void LoadSteamModules();\n    FString GetDllPath();\n\nprivate:\n\t// Make this false and call Initialize yourself\n\t// TODO remove this name and Initialize as this is confusing\n\tstatic constexpr bool bInitializeAtStartup = true;\n\n\t/** Handle to the client steam dll */\n\tvoid* SteamClientLibraryHandle = nullptr;\n\n\t// Our own Steam subsystem\n\tINYSteamSubsystemPtr SteamSubsystem = nullptr;\n};\n"
  },
  {
    "path": "Plugins/NotYetSteam/Source/NotYetSteam/Public/INYSteamSubsystem.h",
    "content": "// Copyright (c) Daniel Butum. All Rights Reserved.\n\n#pragma once\n\n#include \"CoreMinimal.h\"\n#include \"OnlineSubsystem.h\"\n\n#include \"Interfaces/NYSteamPresence.h\"\n#include \"Interfaces/NYSteamStatsAndAchievements.h\"\n#include \"Interfaces/NYSteamExternalUI.h\"\n\n\n\n/**\n *\tOnlineSubsystem - Copied from IOnlineSubsystem\n */\nclass NOTYETSTEAM_API INYSteamSubsystem\n{\npublic:\n\tINYSteamSubsystem() {}\n\tvirtual ~INYSteamSubsystem() {}\n\n\t/**\n\t * Determine if the subsystem for a given interface is enabled by config and command line\n\t * @return true if the subsystem is enabled by config\n\t */\n\tstatic bool IsEnabledByConfigOrCLI();\n\n\t// Gets the steam subsystem from unreal\n\tstatic IOnlineSubsystem* GetUnrealSteamSubsystem();\n\n\tvirtual bool Initialize() = 0;\n\tvirtual bool Shutdown() = 0;\n\tvirtual bool IsEnabled() const = 0;\n\tvirtual FString GetAppIDAsString() const = 0;\n\tvirtual uint32 GetAppIDAsUInt32() const = 0;\n\tvirtual FString GetCurrentGameLanguage() const = 0;\n\n\tvirtual FString GetDllAPI64Sha1Sum() const = 0;\n\n\t// Checks if your executable was launched through Steam and relaunches it through Steam if it wasn't.\n\t// https://partner.steamgames.com/doc/api/steam_api#SteamAPI_RestartAppIfNecessary\n\tvirtual bool RestartAppIfNecessary(int32 AppId) const = 0;\n\n\t/**\n\t * Get the interface for accessing online achievements\n\t * @return Interface pointer for the appropriate online achievements service\n\t */\n\tvirtual INYSteamStatsAndAchievementsPtr GetStatsAndAchievements() const = 0;\n\n\t/**\n\t * Get the interface for managing rich presence information\n\t * @return Interface pointer for the appropriate online user service\n\t */\n\tvirtual INYSteamPresencePtr GetPresence() const = 0;\n\n\t/**\n\t * Get the interface for accessing the external UIs of a service\n\t * @return Interface pointer for the appropriate external UI service\n\t */\n\tvirtual INYSteamExternalUIPtr GetExternalUI() const = 0;\n\nprotected:\n\tstatic const FName SubsystemName;\n};\n\ntypedef TSharedPtr<INYSteamSubsystem, ESPMode::ThreadSafe> INYSteamSubsystemPtr;\n"
  },
  {
    "path": "Plugins/NotYetSteam/Source/NotYetSteam/Public/INotYetSteamModule.h",
    "content": "// Copyright (c) Daniel Butum. All Rights Reserved.\n\n#pragma once\n\n#include \"Modules/ModuleManager.h\"\n#include \"Modules/ModuleInterface.h\"\n#include \"INYSteamSubsystem.h\"\n\nconst FName NOT_YET_STEAM_PLUGIN_NAME(TEXT(\"NotYetSteam\"));\n\n\n/**\n * The public interface to this module\n */\nclass NOTYETSTEAM_API INotYetSteamModule : public IModuleInterface\n{\npublic:\n\t/**\n\t * Singleton-like access to this module's interface.  This is just for convenience!\n\t * Beware of calling this during the shutdown phase, though.  Your module might have been unloaded already.\n\t *\n\t * @return Returns singleton instance, loading the module on demand if needed\n\t */\n\tstatic INotYetSteamModule& Get()\n\t{\n\t\treturn FModuleManager::LoadModuleChecked<INotYetSteamModule>(NOT_YET_STEAM_PLUGIN_NAME);\n\t}\n\n\t/**\n\t * Loads the module into memory if it can\n\t */\n\tstatic bool LoadModule()\n\t{\n\t\tif (IsAvailable())\n\t\t{\n\t\t\treturn true;\n\t\t}\n\n\t\tEModuleLoadResult FailureReason;\n\t\tIModuleInterface* Result = FModuleManager::Get().LoadModuleWithFailureReason(NOT_YET_STEAM_PLUGIN_NAME, FailureReason);\n\t\tif (Result == nullptr || !IsAvailable())\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\treturn true;\n\t}\n\n\t/**\n\t * Checks to see if this module is loaded and ready.  It is only valid to call Get() if IsAvailable() returns true.\n\t *\n\t * @return True if the module is loaded and ready to use\n\t */\n\tstatic bool IsAvailable()\n\t{\n\t\treturn FModuleManager::Get().IsModuleLoaded(NOT_YET_STEAM_PLUGIN_NAME);\n\t}\n\n\tstatic const FString& GetSteamVersion()\n\t{\n#ifndef STEAM_SDK_VER\n#error \"STEAM_SDK_VER from SteamWorks plugin not defined :(\"\n#endif // !NOT_YET_STEAM_SDK_VERSION\n\n\t\tstatic const FString Version(STEAM_SDK_VER);\n\t\treturn Version;\n\t}\n\npublic:\n\tvirtual ~INotYetSteamModule() {}\n\n\tvirtual INYSteamSubsystemPtr GetSteamSubsystem() const = 0;\n\tvirtual bool AreSteamDllsLoaded() const = 0;\n\tvirtual void Initialize() = 0;\n};\n"
  },
  {
    "path": "Plugins/NotYetSteam/Source/NotYetSteam/Public/Interfaces/NYSteamExternalUI.h",
    "content": "// Copyright (c) Daniel Butum. All Rights Reserved.\n\n#pragma once\n\n#include \"CoreMinimal.h\"\n\nclass INYSteamSubsystem;\n\n\n// Own wrapper around FOnlineExternalUISteam\n// https://partner.steamgames.com/doc/api/ISteamFriends#ActivateGameOverlay\nclass NOTYETSTEAM_API FNYSteamExternalUI\n{\npublic:\n\tFNYSteamExternalUI(INYSteamSubsystem* InSubsystem);\n\tvirtual ~FNYSteamExternalUI() {}\n\n\tvirtual bool IsOverlayEnabled() const;\n\tvirtual bool ShowAchievementsUI();\n\tvirtual bool ShowFriendsUI();\n\n\tvirtual bool ActivateGameOverlayToWebPage(const FString& URL);\n\tvirtual bool ActivateGameOverlayToStore(uint32 AppId, bool bAddToCart = false, bool bShowCart = false);\n\nprivate:\n\t/** Reference to the owning subsystem */\n\tINYSteamSubsystem* SteamSubsystem = nullptr;\n};\n\ntypedef TSharedPtr<FNYSteamExternalUI, ESPMode::ThreadSafe> INYSteamExternalUIPtr;\n"
  },
  {
    "path": "Plugins/NotYetSteam/Source/NotYetSteam/Public/Interfaces/NYSteamPresence.h",
    "content": "// Copyright (c) Daniel Butum. All Rights Reserved.\n\n#pragma once\n\n#include \"CoreMinimal.h\"\n#include \"UObject/CoreOnline.h\"\n\nclass INYSteamSubsystem;\n\n\n// https://partner.steamgames.com/doc/api/ISteamFriends#SetRichPresence\n// FOnlineUserPresenceSteam\nclass NOTYETSTEAM_API FNYSteamPresence\n{\npublic:\n\tFNYSteamPresence(INYSteamSubsystem* InSubsystem);\n\tvirtual ~FNYSteamPresence() {}\n\n\t// Clears the rich presence\n\tvirtual bool ClearRichPresence(const FUniqueNetId& PlayerId);\n\n\t// Helper that only sets the presence key for \"status\"\n\t// will show up in the 'view game info' dialog in the Steam friends list.\n\t// NOTE: you need to call clear rich presence before calling this yourself\n\tvirtual bool SetRichPresenceStatus(const FUniqueNetId& PlayerId, const FString& Message);\n\n\t// Helper that allows you to set the \"steam_display\" key\n\t// Token names begin a # and can contain any alphanumeric character and underscores.\n\t// If steam_display is not set to a valid localization tag, then rich presence will not be displayed in the Steam client.\n\tvirtual bool SetRichPresenceSteamDisplay(const FUniqueNetId& PlayerId, const FName Token, const TMap<FString, FText>& Substitutions);\n\nprotected:\n\tbool SetSteamRichPresence(const FString& Key, const FString& Value);\n\nprotected:\n\t// Reference to the owning subsystem\n\tINYSteamSubsystem* SteamSubsystem = nullptr;\n};\n\ntypedef TSharedPtr<FNYSteamPresence, ESPMode::ThreadSafe> INYSteamPresencePtr;\n"
  },
  {
    "path": "Plugins/NotYetSteam/Source/NotYetSteam/Public/Interfaces/NYSteamStatsAndAchievements.h",
    "content": "// Copyright (c) Daniel Butum. All Rights Reserved.\n\n#pragma once\n\n#include \"CoreMinimal.h\"\n#include \"OnlineStats.h\"\n#include \"UObject/CoreOnline.h\"\n\n#include \"Interfaces/OnlineAchievementsInterface.h\"\n#include \"NYSteamResult.h\"\n\nclass INYSteamSubsystem;\n\n// https://partner.steamgames.com/doc/api/ISteamUserStats#UserAchievementStored_t\n\n// Called when the latest stats and achievements for a specific user (including the local user) have been received from the server.\nDECLARE_MULTICAST_DELEGATE_OneParam(FNYOnUserStatsReceivedEvent, FNYSteamUserStatsReceived_Result);\n\n// Result of a request to store the user stats.\nDECLARE_MULTICAST_DELEGATE_OneParam(FNYOnUserStatsStoredEvent, FNYSteamUserStatsStored_Result);\n\n// Callback indicating that a user's stats have been unloaded.\nDECLARE_MULTICAST_DELEGATE_OneParam(FNYOnUserStatsUnloadedEvent, FNYSteamUserStatsUnloaded_Result);\n\n// Result of a request to store the achievements on the server, or an \"indicate progress\" call.\n// If both m_nCurProgress and m_nMaxProgress are zero, that means the achievement has been fully unlocked.\nDECLARE_MULTICAST_DELEGATE_OneParam(FNYOnUserAchievementStoredEvent, FNYSteamUserAchievementStored_Result);\n\n\n/** Structure describing a Steam achievement */\nstruct FNYUnrealSteamAchievementConfig\n{\npublic:\n\tFNYUnrealSteamAchievementConfig(const FString& InRawString) : Name(*InRawString) {}\n\n\t/** Returns debugging string to print out achievement info */\n\tFString ToDebugString() const\n\t{\n\t\treturn FString::Printf(TEXT(\"Achievement:{%s}\"), *Name.ToString());\n\t}\n\npublic:\n\t// The Name of the achievement\n\tFName Name;\n};\n\n/**\n * A helper class for configuring achievements in ini\n */\nstruct FNYSteamAchievementsConfigReader\n{\n\npublic:\n\t/**\n\t * Create a config using the default values:\n\t * IniName - GEngineIni\n\t */\n\tFNYSteamAchievementsConfigReader();\n\n\t/** Returns empty string if couldn't read */\n\tFString GetKey(const FString& KeyName);\n\tbool ReadAchievements(TArray<FNYUnrealSteamAchievementConfig>& OutArray);\n\npublic:\n\t/** Ini file name to find the config values */\n\tFString IniName;\n\n\t/** Section name for Steam */\n\tFString SectionName;\n};\n\n//\n// Also handles Steam stats\n// NOTE: all methods that do not have the PlayerId parameter assumes they call the current user\nclass NOTYETSTEAM_API FNYSteamStatsAndAchievements\n{\n\ttypedef FNYSteamStatsAndAchievements ThisClass;\n\npublic:\n\tFNYSteamStatsAndAchievements(INYSteamSubsystem* InSubsystem);\n\tvirtual ~FNYSteamStatsAndAchievements() {}\n\n\n\t// What we identify the current user by\n\t// virtual void SetCurrentUserID(const FUniqueNetId& PlayerId);\n\n\t//\n\t// Achievements\n\t//\n\n\tvirtual bool UnlockAchievement(FName AchievementName);\n\n\t// NOTE: Dangerous, use with care\n\tvirtual bool ResetAllAchievements();\n\tvirtual bool ResetAchievement(FName AchievementName, bool bStoreStats = true);\n\n\t// Tells if an Achievement was unlocked\n\tvirtual bool IsAchievementUnlocked(FName AchievementName) const;\n\n\t// Gets the time the achievement was unlocked, if it was not unlocked then this returns false\n\tvirtual bool GetAchievementUnlockTime(FName AchievementName, FDateTime& OutUnlockTime) const;\n\tvirtual bool GetAchievementTitle(FName AchievementName, FText& OutTitle) const;\n\tvirtual bool GetAchievementDescription(FName AchievementName, FText& OutDescription) const;\n\tvirtual bool IsAchievementHidden(FName AchievementName) const;\n\n\t// Gets all the achievements read from the config file\n\tvirtual bool GetAllAchievementNamesFromUnrealConfig(TArray<FName>& OutArray) const\n\t{\n\t\tOutArray = {};\n\t\tfor (const auto& Config : UnrealConfigAchievements)\n\t\t{\n\t\t\tOutArray.Add(Config.Name);\n\t\t}\n\n\t\treturn OutArray.Num() > 0;\n\t}\n\n\t// Shows the user a pop-up notification with the current progress of an achievement.\n\tvirtual bool ShowAchievementProgress(FName AchievementName, int32 CurrentProgress, int32 MaxProgress) const;\n\n\n\t//\n\t// Stats\n\t//\n\n\t// Set to true after either RequestUserStats or RequestCurrentStats\n\tvirtual bool HasValidStatsReceived() const { return bStatsReceivedValid; }\n\n\t// Async request\n\tvirtual bool RequestUserStats(const FUniqueNetId& PlayerId);\n\tvirtual bool RequestCurrentStats();\n\n\n\n\t// Store stats, this function is async\n\t// https://partner.steamgames.com/doc/api/ISteamUserStats#StoreStats\n\tvirtual bool StoreStats();\n\n\t// https://partner.steamgames.com/doc/api/ISteamUserStats#SetStat\n\tvirtual bool SetIntStat(FName StatName, int32 Data);\n\tvirtual bool SetFloatStat(FName StatName, float Data);\n\tvirtual bool GetIntStat(FName StatName, int32& OutData);\n\tvirtual bool GetFloatStat(FName StatName, float& OutData);\n\n\t// NOTE: Dangerous, you should resync your stats after this\n\tvirtual bool ResetAllStats(bool bAchievementsToo = false);\n\n\t//\n\t// Events\n\t//\n\n\tvirtual FNYOnUserStatsReceivedEvent& OnUserStatsReceived() { return UserStatsReceivedEvent; }\n\tvirtual FNYOnUserStatsStoredEvent& OnUserStatsStored() { return UserStatsStoredEvent; };\n\tvirtual FNYOnUserStatsUnloadedEvent& OnUserStatsUnloaded() { return UserStatsUnloadedEvent; };\n\tvirtual FNYOnUserAchievementStoredEvent& OnUserAchievementStored() { return UserAchievementStoredEvent; };\n\n\t// Callback handles\n\tvoid OnUserStatsReceived(FNYSteamUserStatsReceived_Result Result);\n\tvoid OnUserStatsStored(FNYSteamUserStatsStored_Result Result);\n\tvoid OnUserStatsUnloaded(FNYSteamUserStatsUnloaded_Result Result);\n\tvoid OnUserAchievementStored(FNYSteamUserAchievementStored_Result Result);\n\nprotected:\n\t// Calls SteamUserStats()->GetAchievementDisplayAttribute\n\t// See https://partner.steamgames.com/doc/api/ISteamUserStats#GetAchievementDisplayAttribute\n\tbool InternalGetAchievementDisplayAttribute(FName AchievementName, const FString& Key, FString& OutValue) const;\n\nprotected:\n\t/** Reference to the owning subsystem */\n\tINYSteamSubsystem* SteamSubsystem = nullptr;\n\n\t// Achievements configured in the config (not player-specific)\n\tTArray<FNYUnrealSteamAchievementConfig> UnrealConfigAchievements;\n\n\t//\n\t// bool bRequestedStats = false;\n\n\t// Did we receive user stats and achievements from steam?\n\t// NOTE: for multiple players we need multiple of these\n\tbool bStatsReceivedValid = false;\n\n\t//\n\t// Events\n\t//\n\n\tFNYOnUserStatsReceivedEvent UserStatsReceivedEvent;\n\tFNYOnUserStatsStoredEvent UserStatsStoredEvent;\n\tFNYOnUserStatsUnloadedEvent UserStatsUnloadedEvent;\n\tFNYOnUserAchievementStoredEvent UserAchievementStoredEvent;\n};\n\ntypedef TSharedPtr<FNYSteamStatsAndAchievements, ESPMode::ThreadSafe> INYSteamStatsAndAchievementsPtr;\n"
  },
  {
    "path": "Plugins/NotYetSteam/Source/NotYetSteam/Public/NYSteamAPI_Internal.h",
    "content": "// Copyright (c) Daniel Butum. All Rights Reserved.\n\n#pragma once\n\n#include \"CoreMinimal.h\"\n\n#pragma push_macro(\"ARRAY_COUNT\")\n#undef ARRAY_COUNT\n\n#if STEAMSDK_FOUND == 0\n#error Steam SDK not located.  Expected to be found in Engine/Source/ThirdParty/Steamworks/{SteamVersion}\n#endif\n\nTHIRD_PARTY_INCLUDES_START\n\n#include \"steam/steam_api.h\"\n\nTHIRD_PARTY_INCLUDES_END\n\n#pragma pop_macro(\"ARRAY_COUNT\")\n"
  },
  {
    "path": "Plugins/NotYetSteam/Source/NotYetSteam/Public/NYSteamHelper.h",
    "content": "// Copyright (c) Daniel Butum. All Rights Reserved.\n\n#pragma once\n\n#include \"CoreMinimal.h\"\n#include \"Kismet/BlueprintFunctionLibrary.h\"\n#include \"UObject/CoreOnline.h\"\n\n#include \"NYSteamUniqueNetId.h\"\n\n#include \"NYSteamHelper.generated.h\"\n\n//\n// NOTE: all functions without a player id/user id assumes the local current user (usually 0)\n// And it assumes the running app\nUCLASS()\nclass NOTYETSTEAM_API UNYSteamHelper : public UBlueprintFunctionLibrary\n{\n\tGENERATED_BODY()\npublic:\n\tstatic bool Initialize(int32 AppId, bool bRequireRelaunch);\n\n\tFORCEINLINE static uint64 ConvertUniqueNetIdToUInt64(const FUniqueNetId& PlayerId)\n\t{\n\t\treturn *reinterpret_cast<const uint64*>(PlayerId.GetBytes());\n\t}\n\n\tstatic bool IsCurrentUser(uint64 UserID);\n\tstatic bool IsCurrentUser(const FUniqueNetId& UserID);\n\tstatic bool IsCurrentGame(uint64 GameID);\n\n\t// Of the current running app\n\tstatic CSteamID GetCSteamID();\n\tstatic CGameID GetCGameID() { return CGameID(GetAppIDAsUInt32()); }\n\n\tstatic FNYSteamUniqueNetId GetSteamUserId() { return FNYSteamUniqueNetId(GetCSteamID()); }\n\tstatic FString GetAppIDAsString() { return FString::Printf(TEXT(\"%d\"), GetAppIDAsUInt32()); }\n\tstatic uint32 GetAppIDAsUInt32();\n\n\tstatic FString GetDllAPI64Sha1Sum();\n\n\t// Assumes local User 0\n\tstatic FString GetCurrentGameLanguage();\n};\n"
  },
  {
    "path": "Plugins/NotYetSteam/Source/NotYetSteam/Public/NYSteamResult.h",
    "content": "// Copyright (c) Daniel Butum. All Rights Reserved.\n\n#pragma once\n\n#include \"CoreMinimal.h\"\n#include \"UObject/CoreOnline.h\"\n#include \"NYSteamAPI_Internal.h\"\n\n#include \"NYSteamResult.generated.h\"\n\n\n// https://partner.steamgames.com/doc/api/ISteamUserStats#UserStatsStored_t\n// NOTE: always current user\nUSTRUCT()\nstruct NOTYETSTEAM_API FNYSteamUserStatsStored_Result\n{\n\tGENERATED_USTRUCT_BODY()\n\npublic:\n\tUPROPERTY()\n\tbool bSuccess = false;\n};\n\n\n// https://partner.steamgames.com/doc/api/ISteamUserStats#UserStatsUnloaded_t\nUSTRUCT()\nstruct NOTYETSTEAM_API FNYSteamUserStatsUnloaded_Result\n{\n\tGENERATED_USTRUCT_BODY()\n\npublic:\n\tUPROPERTY()\n\tbool bSuccess = false;\n\n\tUPROPERTY()\n\tbool bIsCurrentUser = false;\n\n\tuint64 UserID = 0;\n};\n\n\n// https://partner.steamgames.com/doc/api/ISteamUserStats#UserStatsReceived_t\nUSTRUCT()\nstruct NOTYETSTEAM_API FNYSteamUserStatsReceived_Result\n{\n\tGENERATED_USTRUCT_BODY()\n\npublic:\n\tUPROPERTY()\n\tbool bSuccess = false;\n\n\tUPROPERTY()\n\tbool bIsCurrentUser = false;\n\n\tuint64 UserID = 0;\n};\n\n// https://partner.steamgames.com/doc/api/ISteamUserStats#UserAchievementStored_t\n// NOTE: always current user\nUSTRUCT()\nstruct NOTYETSTEAM_API FNYSteamUserAchievementStored_Result\n{\n\tGENERATED_USTRUCT_BODY()\n\npublic:\n\tbool IsUnlocked() const\n\t{\n\t\treturn CurrentProgress == 0 && MaxProgress == 0;\n\t}\n\npublic:\n\tUPROPERTY()\n\tbool bSuccess = false;\n\n\tUPROPERTY()\n\tFName AchievementName;\n\n\tUPROPERTY()\n\tuint32 CurrentProgress = 0;\n\n\tUPROPERTY()\n\tuint32 MaxProgress = 0;\n};\n\nstruct NOTYETSTEAM_API FNYSteamResultHelper\n{\n\t// Takes a Steam EResult value, and converts it into a string (with extra debug info)\n\tstatic FString ResultToString(EResult Result);\n\n\tstatic bool IsResultSuccess(EResult Result)\n\t{\n\t\treturn Result == k_EResultOK;\n\t}\n};\n"
  },
  {
    "path": "Plugins/NotYetSteam/Source/NotYetSteam/Public/NYSteamUniqueNetId.h",
    "content": "// Copyright (c) Daniel Butum. All Rights Reserved.\n\n#pragma once\n\n#include \"CoreMinimal.h\"\n#include \"UObject/CoreOnline.h\"\n#include \"OnlineSubsystemTypes.h\"\n#include \"IPAddress.h\"\n\n#include \"NYSteamAPI_Internal.h\"\n\n/**\n * Steam specific implementation of the unique net id\n */\nclass NOTYETSTEAM_API FNYSteamUniqueNetId : public FUniqueNetId\n{\nprotected:\n\t// Holds the net id for a player\n\tuint64 UniqueNetId = 0;\n\npublic:\n\tFNYSteamUniqueNetId()\n\t{\n\t}\n\n\t/**\n\t * Copy Constructor\n\t *\n\t * @param Src the id to copy\n\t */\n\tFNYSteamUniqueNetId(const FNYSteamUniqueNetId& Src) :\n\t\tUniqueNetId(Src.UniqueNetId)\n\t{\n\t}\n\tFNYSteamUniqueNetId(FNYSteamUniqueNetId&& Src) :\n\t\tUniqueNetId(Src.UniqueNetId)\n\t{\n\t}\n\n\t/**\n\t * Constructs this object with the specified net id\n\t *\n\t * @param InUniqueNetId the id to set ours to\n\t */\n\texplicit FNYSteamUniqueNetId(uint64 InUniqueNetId) :\n\t\tUniqueNetId(InUniqueNetId)\n\t{\n\t}\n\n\t/**\n\t * Constructs this object with the steam id\n\t *\n\t * @param InUniqueNetId the id to set ours to\n\t */\n\texplicit FNYSteamUniqueNetId(CSteamID InSteamId) :\n\t\tUniqueNetId(InSteamId.ConvertToUint64())\n\t{\n\t}\n\n\t/**\n\t * Constructs this object with the specified net id\n\t *\n\t * @param String textual representation of an id\n\t */\n\texplicit FNYSteamUniqueNetId(const FString& Str) :\n\t\tUniqueNetId(FCString::Atoi64(*Str))\n\t{\n\t}\n\n\n\t/**\n\t * Constructs this object with the specified net id\n\t *\n\t * @param InUniqueNetId the id to set ours to (assumed to be FNYSteamUniqueNetId in fact)\n\t */\n\texplicit FNYSteamUniqueNetId(const FUniqueNetId& InUniqueNetId) :\n\t\tUniqueNetId(*(uint64*)InUniqueNetId.GetBytes())\n\t{\n\t}\n\n\tvirtual FName GetType() const override\n\t{\n\t\treturn STEAM_SUBSYSTEM;\n\t}\n\n\t/**\n\t * Get the raw byte representation of this net id\n\t * This data is platform dependent and shouldn't be manipulated directly\n\t *\n\t * @return byte array of size GetSize()\n\t */\n\tvirtual const uint8* GetBytes() const override\n\t{\n\t\treturn (uint8*)&UniqueNetId;\n\t}\n\n\t/**\n\t * Get the size of the id\n\t *\n\t * @return size in bytes of the id representation\n\t */\n\tvirtual int32 GetSize() const override\n\t{\n\t\treturn sizeof(uint64);\n\t}\n\n\t/**\n\t * Check the validity of the id\n\t *\n\t * @return true if this is a well formed ID, false otherwise\n\t */\n\tvirtual bool IsValid() const override\n\t{\n\t\treturn UniqueNetId != 0 && CSteamID(UniqueNetId).IsValid();\n\t}\n\n\t/**\n\t * Platform specific conversion to string representation of data\n\t *\n\t * @return data in string form\n\t */\n\tvirtual FString ToString() const override\n\t{\n\t\treturn FString::Printf(TEXT(\"%llu\"), UniqueNetId);\n\t}\n\n\t/**\n\t * Get a human readable representation of the net id\n\t * Shouldn't be used for anything other than logging/debugging\n\t *\n\t * @return id in string form\n\t */\n\tvirtual FString ToDebugString() const override\n\t{\n\t\tCSteamID SteamID(UniqueNetId);\n\n\t\tconst FString UniqueNetIdStr = FString::Printf(TEXT(\"[0x%llX]\"), UniqueNetId);\n\t\tif (SteamID.IsLobby())\n\t\t{\n\t\t\treturn TEXT(\"Lobby\") + OSS_UNIQUEID_REDACT(*this, UniqueNetIdStr);\n\t\t}\n\t\telse if (SteamID.BAnonGameServerAccount())\n\t\t{\n\t\t\treturn TEXT(\"Server\") + OSS_UNIQUEID_REDACT(*this, UniqueNetIdStr);\n\t\t}\n\t\telse if (SteamID.IsValid())\n\t\t{\n\t\t\tconst FString NickName(SteamFriends() ? UTF8_TO_TCHAR(SteamFriends()->GetFriendPersonaName(UniqueNetId)) : TEXT(\"UNKNOWN\"));\n\t\t\treturn FString::Printf(TEXT(\"%s [0x%llX]\"), *NickName, *OSS_UNIQUEID_REDACT(*this, UniqueNetIdStr));\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn TEXT(\"INVALID\") + OSS_UNIQUEID_REDACT(*this, UniqueNetIdStr);\n\t\t}\n\t}\n\n\t/** Needed for TMap::GetTypeHash() */\n\tfriend uint32 GetTypeHash(const FNYSteamUniqueNetId& A)\n\t{\n\t\treturn GetTypeHash(A.UniqueNetId);\n\t}\n\n\t/** global static instance of invalid (zero) id */\n\tstatic TSharedRef<FNYSteamUniqueNetId> EmptyID()\n\t{\n\t\treturn MakeShared<FNYSteamUniqueNetId>(0);\n\t}\n\n\tuint64 AsUInt64() const { return UniqueNetId; }\n\n\t/** Convenience cast to CSteamID */\n\toperator CSteamID()\n\t{\n\t\treturn UniqueNetId;\n\t}\n\n\t/** Convenience cast to CSteamID */\n \toperator const CSteamID() const\n \t{\n \t\treturn UniqueNetId;\n \t}\n\n\n\t/** Convenience cast to CSteamID pointer */\n\toperator CSteamID*()\n\t{\n\t\treturn (CSteamID*)&UniqueNetId;\n\t}\n\n\t/** Convenience cast to CSteamID pointer */\n\toperator const CSteamID*() const\n\t{\n\t\treturn (const CSteamID*)&UniqueNetId;\n\t}\n\n\tfriend FArchive& operator<<(FArchive& Ar, FNYSteamUniqueNetId& UserId)\n\t{\n\t\treturn Ar << UserId.UniqueNetId;\n\t}\n};\n"
  },
  {
    "path": "README.md",
    "content": "# [WarriOrb](http://warriorb.com/) source code\n\nWarriOrb is a hardcore action platformer where you play as a demon who is trapped in an unlikely body. The game mixes the difficulty and level design of Dark Souls with an unique ball-based platforming mechanics.\n\n![Panorama](https://user-images.githubusercontent.com/1269608/110971201-3b033900-8363-11eb-80ef-c98ff6442cf0.jpg)\n\n## Links\n### [🎆 Website](https://www.warriorb.com/)\n#### [Steam](https://store.steampowered.com/app/790360/WarriOrb/)\n#### [Xbox](https://www.microsoft.com/p/warriorb/9nw7s5lbk0b7)\n#### [Switch](https://www.nintendo.com/games/detail/warriorb-switch/)\n\n### [🎥 Trailer](https://www.youtube.com/watch?v=NdifbjaOQf8)\n\n### [🔧 Unreal Plugins](https://www.unrealengine.com/marketplace/en-US/profile/Not+Yet)\n#### [Dialogue System Plugin (Open Source)](https://github.com/NotYetGames/DlgSystem)\n\n### [💬 Discord](https://discord.gg/NotYet)\n\n## About\n\nWarriOrb is an action platformer where you play as a mighty demon trapped in an unlikely body! Make your way through the ravaged world to regain your freedom and sanity – meeting demons, giants, mutants and all sorts of magical and crazy creatures along the way.\n\nKey Features:\n- Trapped in a Ball: Explore a tragic story of loss and desperation hidden behind a comic tale.\n- Sweet Freedom: Run, jump, bounce and roll your way to freedom!\n- Platforming Skills: It feels like everything is out to get you … - You got that right! Challenge your skills and reflexes against the deadliest of traps.\n- Think, Think, Think: Solve challenging puzzles in between traps!\n- Get Social: The world is ending! Chat with friendly and unfriendly fellows along the way about it.\n\n![WarriOrb fithing monsters](https://user-images.githubusercontent.com/1269608/110970459-73564780-8362-11eb-8ce1-aa880362cbd9.jpg)\n\n\n## Source code\n- NOTE: the MIT License only applies to the code in this repository and does not include the actual commercial WarriOrb game or assets.\n- This repository **only contains the code** but **NO Assets** and some missing plugins.\n\t- So you can't build easily from this source code.\n- This source code is only for educational purposes.\n- All of the [🔧 Not Yet: Unreal Plugins](https://www.unrealengine.com/marketplace/en-US/profile/Not+Yet) were developed while working on WarriOrb\n\t- Only the [💬 Not Yet: Dialogue System Plugin](https://github.com/NotYetGames/DlgSystem) is free and open source.\n\n## Building\n\nWe provide these sources for our customers, and as a reference for Unreal Engine developers. **You won't be able to run the game from this repository alone**, as the game contents are not included. Building from source is only useful if you want to replace the game executable with your modifications.\n\n### Required dependencies\n\nYou will need the following tools to build WarriOrb from the source code:\n- **[Unreal Engine 4](https://www.unrealengine.com/)** as the game engine.  You will need to sign up and download the Epic Games launcher. In the launcher library for Unreal Engine, install version **4.22**.\n- [Setup Visual Studio 2017 for Unreal Engine](https://docs.unrealengine.com/en-US/Programming/Development/VisualStudioSetup/index.html) - You can download Visual Studio 2017 Community edition from [here](https://visualstudio.microsoft.com/vs/older-downloads/)\n  - or after you sign in, directly from [this link](https://my.visualstudio.com/Downloads?q=visual%20studio%202017&wt.mc_id=o~msft~vscom~older-downloads) as Microsoft makes it hard to download VS 2017 (for some reason).\n- [Download the **FMOD** plugin (version 1.10.19)](https://www.fmod.com/download) for UE 4.22 and copy the libs Binaries from it, inside `Plugins/FMODStudio/Binaries` directory.\n  - You should copy `FMODStudio/Binaries` (after downloading and unzipping) to `Plugins/FMODStudio/Binaries`\n\n### Build\n\n\n#### 1. Run UnrealBuildTool\n\nThe Build command looks like this:\n```sh\n<engine_install_path>/Engine/Binaries/DotNET/UnrealBuildTool.exe <project_name><target_type> <platform> <build_type> -project=<uproject_absolute_file_path> -progress\n```\n\nTo build just the Game for Windows 64 run for example:\n```sh\n\"c:/dev/UE/UE_4.22/Engine/Binaries/DotNET/UnrealBuildTool.exe\" Warriorb Win64 Development -project=\"C:/dev/WarriOrb/Warriorb.uproject\" -progress\n```\n\nNOTE: If you want clean the project before you build, just add the `-clean` flag.\n\nFor example:\n```sh\n\"c:/dev/UE/UE_4.22/Engine/Binaries/DotNET/UnrealBuildTool.exe\" Warriorb Win64 Development -project=\"C:/dev/WarriOrb/Warriorb.uproject\" -progress -clean\n```\n\nNOTE: You can also build the game by opening the `.sln` file in Visual Studio 2017 and building the `Development Game` target.\n\n#### 2. Copy Binaries\n\nThe resulting binaries and debug files will be generated inside `Binaries/Win64/` and can replace the equivalent files in your existing game folder (located at `<install_path>/Warriorb/Binaries/Win64/`)\n\n### Run\n\n#### 1. Unarchive pak\n\nThe game has the Content inside a `.pak` file which is just an archive. You need to unarchive it with the `UnrealPak` utility.\n\nThe pak command utility can be found here:\n```sh\n<engine_install_path>/Engine/Binaries/Win64/UnrealPak.exe\n```\n\nThe pak file can be located here:\n```sh\n<install_path>/Warriorb/Content/Paks/Warriorb-WindowsNoEditor.pak\n```\n\nExtract the pak file:\n```sh\n<engine_install_path>/Engine/Binaries/Win64/UnrealPak.exe <install_path>/Warriorb/Content/Paks/Warriorb-WindowsNoEditor.pak -Extract <install_path>\n```\n\nNOTE: All paths must be absolute otherwise this won't work.\n\nFor Example:\n```sh\n\"c:/dev/UE/UE_4.22/Engine/Binaries/Win64/UnrealPak.exe\" \"C:/Program Files (x86)/Steam/steamapps/common/WarriOrb/Warriorb/Content/Paks/Warriorb-WindowsNoEditor.pak\" -Extract \"C:/Program Files (x86)/Steam/steamapps/common/WarriOrb/\"\n```\n#### 2. Rename paks folder\n\nThis is required so that the executable only reads the unarchived files but not the archive itself.\n\nRename the `<install_path>/Warriorb/Content/Paks/` directory to something like `<install_path>/Warriorb/Content/_OLD_Paks/`\n\n#### 3. Disable `AuraSDKPlugin`\n\nOpen the `<install_path>/Warriorb/Warriorb.uproject` file and set the `Enabled` field for the `AuraSDKPlugin` plugin to `false`.\n\nThe section should look like this:\n```json\n{\n\t\"Name\": \"AuraSDKPlugin\",\n\t\"Enabled\": false\n}\n```\n\n#### 4. Run the game\nNow you can run the game with the modified executable you built above.\n\n`<install_path>/Warriorb/Binaries/Win64/Warriorb.exe`\n\nOr just the launcher executable in the root directory which calls the above path:\n`<install_path>/Warriorb.exe`\n"
  },
  {
    "path": "Source/SOrb/Anim/SoAnimNode_SetBoneWorldPos.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#include \"SoAnimNode_SetBoneWorldPos.h\"\n// #include \"Animation/AnimTypes.h\"\n #include \"AnimationRuntime.h\"\n#include \"Animation/AnimNodeBase.h\"\n#include \"Animation/AnimInstanceProxy.h\"\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFSoAnimNode_SetBoneWorldPos::FSoAnimNode_SetBoneWorldPos()\n{\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSoAnimNode_SetBoneWorldPos::GatherDebugData(FNodeDebugData& DebugData)\n{\n\tFString DebugLine = DebugData.GetNodeName(this);\n\n\tDebugLine += \"(\";\n\tAddDebugNodeData(DebugLine);\n\tDebugLine += FString::Printf(TEXT(\" IKBone: %s)\"), *IKBone.BoneName.ToString());\n\tDebugData.AddDebugItem(DebugLine);\n\n\tComponentPose.GatherDebugData(DebugData);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSoAnimNode_SetBoneWorldPos::EvaluateSkeletalControl_AnyThread(FComponentSpacePoseContext& Output, TArray<FBoneTransform>& OutBoneTransforms)\n{\n\t// SCOPE_CYCLE_COUNTER(STAT_TwoBoneIK_Eval);\n\n\tcheck(OutBoneTransforms.Num() == 0);\n\n\tconst FBoneContainer& BoneContainer = Output.Pose.GetPose().GetBoneContainer();\n\n\t// Get indices of the lower and upper limb bones and check validity.\n\tbool bInvalidIndex = false;\n\n\tFCompactPoseBoneIndex IKBoneCompactPoseIndex = IKBone.GetCompactPoseIndex(BoneContainer);\n\n\n\t// Get Local Space transforms for our bones. We do this first in case they already are local.\n\t// As right after we get them in component space. (And that does the auto conversion).\n\t// We might save one transform by doing local first...\n\tconst FTransform EndBoneLocalTransform = Output.Pose.GetLocalSpaceTransform(IKBoneCompactPoseIndex);\n\t// Now get those in component space...\n\tFTransform EndBoneCSTransform = Output.Pose.GetComponentSpaceTransform(IKBoneCompactPoseIndex);\n\n\t// Transform EffectorLocation from EffectorLocationSpace to ComponentSpace.\n\tFTransform TargetTransform(BoneLocation);\n\tFTransform ComponentTransform = Output.AnimInstanceProxy->GetComponentTransform();\n\tFAnimationRuntime::ConvertBoneSpaceTransformToCS(ComponentTransform, Output.Pose, TargetTransform, FCompactPoseBoneIndex{ INDEX_NONE }, EBoneControlSpace::BCS_WorldSpace);\n\n\t// This is our reach goal.\n\tFVector DesiredPos = TargetTransform.GetTranslation();\n\n\tEndBoneCSTransform.SetTranslation(DesiredPos);\n\tOutBoneTransforms.Add(FBoneTransform(IKBoneCompactPoseIndex, EndBoneCSTransform));\n\n\t// Make sure we have correct number of bones\n\tcheck(OutBoneTransforms.Num() == 1);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool FSoAnimNode_SetBoneWorldPos::IsValidToEvaluate(const USkeleton* Skeleton, const FBoneContainer& RequiredBones)\n{\n\t// if both bones are valid\n\treturn IKBone.IsValidToEvaluate(RequiredBones);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSoAnimNode_SetBoneWorldPos::InitializeBoneReferences(const FBoneContainer& RequiredBones)\n{\n\tIKBone.Initialize(RequiredBones);\n}\n"
  },
  {
    "path": "Source/SOrb/Anim/SoAnimNode_SetBoneWorldPos.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#pragma once\n#include \"BoneControllers/AnimNode_SkeletalControlBase.h\"\n#include \"SoAnimNode_SetBoneWorldPos.generated.h\"\n\n/**\n *\n */\nUSTRUCT()\nstruct SORB_API FSoAnimNode_SetBoneWorldPos : public FAnimNode_SkeletalControlBase\n{\n\tGENERATED_USTRUCT_BODY()\n\n\t/** Name of bone to control. **/\n\tUPROPERTY(EditAnywhere)\n\tFBoneReference IKBone;\n\n\t/** Target Location to reach. */\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (PinShownByDefault))\n\tFVector BoneLocation{EForceInit::ForceInitToZero};\n\n\tFSoAnimNode_SetBoneWorldPos();\n\n\t// FAnimNode_Base interface\n\tvirtual void GatherDebugData(FNodeDebugData& DebugData) override;\n\t// End of FAnimNode_Base interface\n\n\t// FAnimNode_SkeletalControlBase interface\n\tvirtual void EvaluateSkeletalControl_AnyThread(FComponentSpacePoseContext& Output, TArray<FBoneTransform>& OutBoneTransforms) override;\n\tvirtual bool IsValidToEvaluate(const USkeleton* Skeleton, const FBoneContainer& RequiredBones) override;\n\t// End of FAnimNode_SkeletalControlBase interface\n\nprivate:\n\t// FAnimNode_SkeletalControlBase interface\n\tvirtual void InitializeBoneReferences(const FBoneContainer& RequiredBones) override;\n\t// End of FAnimNode_SkeletalControlBase interface\n};\n"
  },
  {
    "path": "Source/SOrb/Anim/SoAnimNotify_CharStrikeSound.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#include \"SoAnimNotify_CharStrikeSound.h\"\n\n#include \"FMODEvent.h\"\n#include \"Components/SkeletalMeshComponent.h\"\n#include \"Kismet/KismetSystemLibrary.h\"\n\n#include \"Character/SoCharacter.h\"\n#include \"Character/SoPlayerCharacterSheet.h\"\n#include \"Basic/SoAudioManager.h\"\n\nUSoAnimNotify_CharStrikeSound::USoAnimNotify_CharStrikeSound()\n\t: Super()\n{\n\n#if WITH_EDITORONLY_DATA\n\tNotifyColor = FColor(127, 255, 127, 255);\n#endif // WITH_EDITORONLY_DATA\n}\n\nvoid USoAnimNotify_CharStrikeSound::Notify(USkeletalMeshComponent *MeshComp, UAnimSequenceBase *AnimSeq)\n{\n\tTAssetPtr<UFMODEvent> Event = EventNormal;\n\n\tif (EventQuick.IsValid())\n\t{\n\t\tif (ASoCharacter* SoCharacter = Cast<ASoCharacter>(MeshComp->GetOwner()))\n\t\t\tif (USoPlayerCharacterSheet* PCS = SoCharacter->GetPlayerCharacterSheet())\n\t\t\t\tif (PCS->GetAttackSpeedMultiplier() > 1.0f)\n\t\t\t\t\tEvent = EventQuick;\n\n#if WITH_EDITORONLY_DATA\n\t\tif (bTestQuickSound)\n\t\t\tEvent = EventQuick;\n#endif // WITH_EDITORONLY_DATA\n\t}\n\n\tif (Event.IsValid())\n\t{\n\t\tif (bFollow)\n\t\t{\n\t\t\t// Play event attached\n\t\t\tUSoAudioManager::PlaySoundAttached(\n\t\t\t\tEvent.Get(),\n\t\t\t\tMeshComp,\n\t\t\t\t*AttachName,\n\t\t\t\tFVector(0, 0, 0),\n\t\t\t\tEAttachLocation::KeepRelativeOffset\n\t\t\t);\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// Play event at location\n\t\t\tUSoAudioManager::PlaySoundAtLocation(\n\t\t\t\tMeshComp,\n\t\t\t\tEvent.Get(),\n\t\t\t\tMeshComp->GetComponentTransform()\n\t\t\t);\n\t\t}\n\t}\n}\n\nFString USoAnimNotify_CharStrikeSound::GetNotifyName_Implementation() const\n{\n\tif (EventNormal.IsValid())\n\t{\n\t\treturn (EventNormal.Get())->GetName();\n\t}\n\n\treturn Super::GetNotifyName_Implementation();\n}\n"
  },
  {
    "path": "Source/SOrb/Anim/SoAnimNotify_CharStrikeSound.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#pragma once\n\n#include \"Animation/AnimNotifies/AnimNotify.h\"\n#include \"SoAnimNotify_CharStrikeSound.generated.h\"\n\nclass UFMODEvent;\n\nUCLASS(const, hidecategories = Object, collapsecategories, meta = (DisplayName = \"Play So Strike Sound\"))\nclass SORB_API USoAnimNotify_CharStrikeSound : public UAnimNotify\n{\n\tGENERATED_BODY()\n\npublic:\n\tUSoAnimNotify_CharStrikeSound();\n\n\t// Being UAnimNotify interface\n\tvirtual void Notify(USkeletalMeshComponent *MeshComp, UAnimSequenceBase *AnimSeq) override;\n\tvirtual FString GetNotifyName_Implementation() const override;\n\t// End UAnimNotify interface\n\n\t// If this sound should follow its owner\n\tUPROPERTY(EditAnywhere, Category = \"So Anim Notify\")\n\tuint32 bFollow : 1;\n\n\t// Socket or bone name to attach sound to\n\tUPROPERTY(EditAnywhere, Category = \"So Anim Notify\", meta = (EditCondition = \"bFollow\"))\n\tFString AttachName;\n\n\t// Sound to Play\n\tUPROPERTY(EditAnywhere, Category = \"So Anim Notify\", BlueprintReadWrite)\n\tTAssetPtr<UFMODEvent> EventNormal;\n\n\t// Sound to Play if the character has a speed boost\n\tUPROPERTY(EditAnywhere, Category = \"So Anim Notify\", BlueprintReadWrite)\n\tTAssetPtr<UFMODEvent> EventQuick;\n\n#if WITH_EDITORONLY_DATA\n\t/** Color of Notify in editor */\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = AnimNotify)\n\tbool bTestQuickSound = false;\n#endif // WITH_EDITORONLY_DATA\n};\n"
  },
  {
    "path": "Source/SOrb/Anim/SoAnimNotify_EnemyVoice.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#include \"SoAnimNotify_EnemyVoice.h\"\n\n#include \"Components/SkeletalMeshComponent.h\"\n#include \"Kismet/KismetSystemLibrary.h\"\n\n#include \"FMODEvent.h\"\n\n#include \"Enemy/SoEnemyVoiceManager.h\"\n#include \"Settings/SoGameSettings.h\"\n#include \"Basic/SoAudioManager.h\"\n\n\nUSoAnimNotify_EnemyVoice::USoAnimNotify_EnemyVoice()\n\t: Super()\n{\n\n#if WITH_EDITORONLY_DATA\n\tNotifyColor = FColor(127, 255, 127, 255);\n#endif // WITH_EDITORONLY_DATA\n}\n\nvoid USoAnimNotify_EnemyVoice::Notify(USkeletalMeshComponent* MeshComp, UAnimSequenceBase* AnimSeq)\n{\n\tif (Event.IsValid())\n\t{\n\t\tif (USoEnemyVoiceManager* VoiceManager = USoEnemyVoiceManager::GetInstance(MeshComp))\n\t\t{\n\t\t\tif (AActor* Owner = Cast<AActor>(MeshComp->GetOwner()))\n\t\t\t{\n\t\t\t\tVoiceManager->PlayEnemyVoice(Owner, Event.Get(), VoiceType);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\t// Voice gibberish disabled by settings\n\t\tif (USoGameSettings::Get().IsVoiceGibberishMuted())\n\t\t\treturn;\n\n\t\tUSoAudioManager::PlaySoundAttached(\n\t\t\tEvent.Get(),\n\t\t\tMeshComp,\n\t\t\tNAME_None,\n\t\t\tFVector(0, 0, 0),\n\t\t\tEAttachLocation::KeepRelativeOffset\n\t\t);\n\t}\n}\n\nFString USoAnimNotify_EnemyVoice::GetNotifyName_Implementation() const\n{\n\tif (Event.IsValid())\n\t{\n\t\treturn (Event.Get())->GetName();\n\t}\n\n\treturn Super::GetNotifyName_Implementation();\n}\n"
  },
  {
    "path": "Source/SOrb/Anim/SoAnimNotify_EnemyVoice.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#pragma once\n\n#include \"Animation/AnimNotifies/AnimNotify.h\"\n#include \"CharacterBase/SoVoiceUser.h\"\n\n#include \"SoAnimNotify_EnemyVoice.generated.h\"\n\nclass UFMODEvent;\n\nUCLASS(const, hidecategories = Object, collapsecategories, meta = (DisplayName = \"Play Enemy Voice\"))\nclass SORB_API USoAnimNotify_EnemyVoice : public UAnimNotify\n{\n\tGENERATED_BODY()\n\npublic:\n\tUSoAnimNotify_EnemyVoice();\n\n\t// Being UAnimNotify interface\n\tvirtual void Notify(USkeletalMeshComponent *MeshComp, UAnimSequenceBase *AnimSeq) override;\n\tvirtual FString GetNotifyName_Implementation() const override;\n\t// End UAnimNotify interface\n\n\t/** The event to play */\n\tUPROPERTY(EditAnywhere, Category = \"So Anim Notify\", BlueprintReadWrite)\n\tTAssetPtr<UFMODEvent> Event;\n\n\tUPROPERTY(EditAnywhere, Category = \"So Anim Notify\", BlueprintReadWrite)\n\tESoVoiceType VoiceType = ESoVoiceType::SoVoiceTypeAttack;\n};\n"
  },
  {
    "path": "Source/SOrb/Anim/SoAnimNotify_EnemyVoiceClassBased.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#include \"SoAnimNotify_EnemyVoiceClassBased.h\"\n\n#include \"FMODEvent.h\"\n#include \"Components/SkeletalMeshComponent.h\"\n#include \"Kismet/KismetSystemLibrary.h\"\n\n#include \"Enemy/SoEnemy.h\"\n#include \"Enemy/SoEnemyVoiceManager.h\"\n#include \"Settings/SoGameSettings.h\"\n#include \"Basic/SoAudioManager.h\"\n\n\nUSoAnimNotify_EnemyVoiceClassBased::USoAnimNotify_EnemyVoiceClassBased()\n\t: Super()\n{\n\n#if WITH_EDITORONLY_DATA\n\tNotifyColor = FColor(127, 255, 127, 255);\n#endif // WITH_EDITORONLY_DATA\n}\n\nvoid USoAnimNotify_EnemyVoiceClassBased::Notify(USkeletalMeshComponent* MeshComp, UAnimSequenceBase* AnimSeq)\n{\n\tUObject* Owner = MeshComp->GetOwner();\n\tconst UClass* OwnerClass = Owner != nullptr ? Owner->GetClass() : nullptr;\n\n\tint32 SelectedIndex = 0;\n\tif (Owner != nullptr && OwnerClass != nullptr)\n\t{\n\t\tSelectedIndex = -1;\n\t\tfor (int32 i = 0; i < Events.Num(); ++i)\n\t\t{\n\t\t\tif (Events[i].EnemyClass == Owner->GetClass())\n\t\t\t{\n\t\t\t\tSelectedIndex = i;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tif (SelectedIndex == -1)\n\t\t{\n\t\t\treturn;\n\t\t}\n\t}\n\n\tif (Events.IsValidIndex(SelectedIndex))\n\t{\n\t\tTAssetPtr<UFMODEvent> Event = Events[SelectedIndex].Event;\n\t\tif (Event.IsValid())\n\t\t{\n\t\t\tif (USoEnemyVoiceManager* VoiceManager = USoEnemyVoiceManager::GetInstance(MeshComp))\n\t\t\t{\n\t\t\t\tif (AActor* ActorOwner = Cast<AActor>(Owner))\n\t\t\t\t{\n\t\t\t\t\tVoiceManager->PlayEnemyVoice(ActorOwner, Event.Get(), VoiceType);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Voice gibberish disabled by settings\n\t\t\tif (USoGameSettings::Get().IsVoiceGibberishMuted())\n\t\t\t\treturn;\n\n\t\t\tUSoAudioManager::PlaySoundAttached(\n\t\t\t\tEvent.Get(),\n\t\t\t\tMeshComp,\n\t\t\t\tNAME_None,\n\t\t\t\tFVector(0, 0, 0),\n\t\t\t\tEAttachLocation::KeepRelativeOffset\n\t\t\t);\n\t\t}\n\t}\n}\n\nFString USoAnimNotify_EnemyVoiceClassBased::GetNotifyName_Implementation() const\n{\n\treturn FString(\"[EVC]\");\n}\n"
  },
  {
    "path": "Source/SOrb/Anim/SoAnimNotify_EnemyVoiceClassBased.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#pragma once\n\n#include \"Animation/AnimNotifies/AnimNotify.h\"\n#include \"Templates/SubclassOf.h\"\n#include \"CharacterBase/SoVoiceUser.h\"\n\n#include \"SoAnimNotify_EnemyVoiceClassBased.generated.h\"\n\nclass ASoEnemy;\nclass UFMODEvent;\n\nUSTRUCT(BlueprintType, Blueprintable)\nstruct FSoEventForClass\n{\n\tGENERATED_USTRUCT_BODY()\n\npublic:\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite)\n\tTSubclassOf<ASoEnemy> EnemyClass;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite)\n\tTAssetPtr<UFMODEvent> Event;\n};\n\n\n\nUCLASS(const, hidecategories = Object, collapsecategories, meta = (DisplayName = \"Play Enemy Voice (Class)\"))\nclass SORB_API USoAnimNotify_EnemyVoiceClassBased : public UAnimNotify\n{\n\tGENERATED_BODY()\n\npublic:\n\tUSoAnimNotify_EnemyVoiceClassBased();\n\n\t// Being UAnimNotify interface\n\tvirtual void Notify(USkeletalMeshComponent *MeshComp, UAnimSequenceBase *AnimSeq) override;\n\tvirtual FString GetNotifyName_Implementation() const override;\n\t// End UAnimNotify interface\n\n\t/** The event to play */\n\tUPROPERTY(EditAnywhere, Category = \"So Anim Notify\", BlueprintReadWrite)\n\tTArray<FSoEventForClass> Events;\n\n\tUPROPERTY(EditAnywhere, Category = \"So Anim Notify\", BlueprintReadWrite)\n\tESoVoiceType VoiceType = ESoVoiceType::SoVoiceTypeAttack;\n};\n"
  },
  {
    "path": "Source/SOrb/Anim/SoAnimNotify_EnemyVoiceRandom.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#include \"SoAnimNotify_EnemyVoiceRandom.h\"\n\n#include \"FMODEvent.h\"\n#include \"Components/SkeletalMeshComponent.h\"\n#include \"Kismet/KismetSystemLibrary.h\"\n\n#include \"Enemy/SoEnemyVoiceManager.h\"\n#include \"Settings/SoGameSettings.h\"\n#include \"Basic/SoAudioManager.h\"\n\n\nUSoAnimNotify_EnemyVoiceRandom::USoAnimNotify_EnemyVoiceRandom()\n\t: Super()\n{\n\n#if WITH_EDITORONLY_DATA\n\tNotifyColor = FColor(127, 255, 127, 255);\n#endif // WITH_EDITORONLY_DATA\n}\n\nvoid USoAnimNotify_EnemyVoiceRandom::Notify(USkeletalMeshComponent* MeshComp, UAnimSequenceBase* AnimSeq)\n{\n\tif (Events.Num() == 0)\n\t{\n\t\treturn;\n\t}\n\n\tTAssetPtr<UFMODEvent> Event = Events[FMath::RandRange(0, Events.Num() - 1)];\n\tif (Event.IsValid())\n\t{\n\n\t\tif (USoEnemyVoiceManager* VoiceManager = USoEnemyVoiceManager::GetInstance(MeshComp))\n\t\t{\n\t\t\tif (AActor* Owner = Cast<AActor>(MeshComp->GetOwner()))\n\t\t\t{\n\t\t\t\tVoiceManager->PlayEnemyVoice(Owner, Event.Get(), VoiceType);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\t// Voice gibberish disabled by settings\n\t\tif (USoGameSettings::Get().IsVoiceGibberishMuted())\n\t\t\treturn;\n\n\t\tUSoAudioManager::PlaySoundAttached(\n\t\t\tEvent.Get(),\n\t\t\tMeshComp,\n\t\t\tNAME_None,\n\t\t\tFVector(0, 0, 0),\n\t\t\tEAttachLocation::KeepRelativeOffset\n\t\t);\n\t}\n}\n\nFString USoAnimNotify_EnemyVoiceRandom::GetNotifyName_Implementation() const\n{\n\tif (Events.Num() > 0 && Events[0].IsValid())\n\t{\n\t\treturn FString(\"[\") + (Events[0].Get())->GetName() + \", ...]\";\n\t}\n\n\treturn Super::GetNotifyName_Implementation();\n}\n"
  },
  {
    "path": "Source/SOrb/Anim/SoAnimNotify_EnemyVoiceRandom.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#pragma once\n\n#include \"Animation/AnimNotifies/AnimNotify.h\"\n#include \"CharacterBase/SoVoiceUser.h\"\n#include \"SoAnimNotify_EnemyVoiceRandom.generated.h\"\n\nclass UFMODEvent;\n\nUCLASS(const, hidecategories = Object, collapsecategories, meta = (DisplayName = \"Play Random Enemy Voice\"))\nclass SORB_API USoAnimNotify_EnemyVoiceRandom : public UAnimNotify\n{\n\tGENERATED_BODY()\n\npublic:\n\tUSoAnimNotify_EnemyVoiceRandom();\n\n\t// Being UAnimNotify interface\n\tvirtual void Notify(USkeletalMeshComponent *MeshComp, UAnimSequenceBase *AnimSeq) override;\n\tvirtual FString GetNotifyName_Implementation() const override;\n\t// End UAnimNotify interface\n\n\t/** The event to play */\n\tUPROPERTY(EditAnywhere, Category = \"So Anim Notify\", BlueprintReadWrite)\n\tTArray<TAssetPtr<UFMODEvent>> Events;\n\n\tUPROPERTY(EditAnywhere, Category = \"So Anim Notify\", BlueprintReadWrite)\n\tESoVoiceType VoiceType = ESoVoiceType::SoVoiceTypeAttack;\n};\n"
  },
  {
    "path": "Source/SOrb/Anim/SoAnimNotify_EnemyVoiceRandomClassBased.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#include \"SoAnimNotify_EnemyVoiceRandomClassBased.h\"\n\n#include \"FMODEvent.h\"\n#include \"Components/SkeletalMeshComponent.h\"\n#include \"Kismet/KismetSystemLibrary.h\"\n\n#include \"Enemy/SoEnemy.h\"\n#include \"Enemy/SoEnemyVoiceManager.h\"\n#include \"Settings/SoGameSettings.h\"\n#include \"Basic/SoAudioManager.h\"\n\n\nUSoAnimNotify_EnemyVoiceRandomClassBased::USoAnimNotify_EnemyVoiceRandomClassBased()\n\t: Super()\n{\n\n#if WITH_EDITORONLY_DATA\n\tNotifyColor = FColor(127, 255, 127, 255);\n#endif // WITH_EDITORONLY_DATA\n}\n\nvoid USoAnimNotify_EnemyVoiceRandomClassBased::Notify(USkeletalMeshComponent* MeshComp, UAnimSequenceBase* AnimSeq)\n{\n\tUObject* Owner = MeshComp->GetOwner();\n\tconst UClass* OwnerClass = Owner != nullptr ? Owner->GetClass() : nullptr;\n\n\tint32 SelectedIndex = 0;\n\tif (Owner != nullptr && OwnerClass != nullptr)\n\t{\n\t\tSelectedIndex = -1;\n\t\tfor (int32 i = 0; i < Events.Num(); ++i)\n\t\t{\n\t\t\tif (Events[i].EnemyClass == Owner->GetClass() && Events[i].Events.Num() > 0)\n\t\t\t{\n\t\t\t\tSelectedIndex = i;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tif (SelectedIndex == -1)\n\t\t{\n\t\t\treturn;\n\t\t}\n\t}\n\n\tif (Events.IsValidIndex(SelectedIndex) && Events[SelectedIndex].Events.Num() > 0)\n\t{\n\t\tTAssetPtr<UFMODEvent> Event = Events[SelectedIndex].Events[FMath::RandRange(0, Events[SelectedIndex].Events.Num() - 1)];\n\t\tif (Event.IsValid())\n\t\t{\n\t\t\tif (USoEnemyVoiceManager* VoiceManager = USoEnemyVoiceManager::GetInstance(MeshComp))\n\t\t\t{\n\t\t\t\tif (AActor* ActorOwner = Cast<AActor>(Owner))\n\t\t\t\t{\n\t\t\t\t\tVoiceManager->PlayEnemyVoice(ActorOwner, Event.Get(), VoiceType);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Voice gibberish disabled by settings\n\t\t\tif (USoGameSettings::Get().IsVoiceGibberishMuted())\n\t\t\t\treturn;\n\n\t\t\tUSoAudioManager::PlaySoundAttached(\n\t\t\t\tEvent.Get(),\n\t\t\t\tMeshComp,\n\t\t\t\tNAME_None,\n\t\t\t\tFVector(0, 0, 0),\n\t\t\t\tEAttachLocation::KeepRelativeOffset\n\t\t\t);\n\t\t}\n\t}\n}\n\nFString USoAnimNotify_EnemyVoiceRandomClassBased::GetNotifyName_Implementation() const\n{\n\treturn FString(\"[EVRC]\");\n}\n"
  },
  {
    "path": "Source/SOrb/Anim/SoAnimNotify_EnemyVoiceRandomClassBased.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#pragma once\n\n#include \"Animation/AnimNotifies/AnimNotify.h\"\n#include \"Templates/SubclassOf.h\"\n#include \"CharacterBase/SoVoiceUser.h\"\n\n#include \"SoAnimNotify_EnemyVoiceRandomClassBased.generated.h\"\n\nclass ASoEnemy;\nclass UFMODEvent;\n\nUSTRUCT(BlueprintType, Blueprintable)\nstruct FSoEventsForClass\n{\n\tGENERATED_USTRUCT_BODY()\n\npublic:\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite)\n\tTSubclassOf<ASoEnemy> EnemyClass;\n\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite)\n\tTArray<TAssetPtr<UFMODEvent>> Events;\n};\n\n\n\nUCLASS(const, hidecategories = Object, collapsecategories, meta = (DisplayName = \"Play Random Enemy Voice (Class)\"))\nclass SORB_API USoAnimNotify_EnemyVoiceRandomClassBased : public UAnimNotify\n{\n\tGENERATED_BODY()\n\npublic:\n\tUSoAnimNotify_EnemyVoiceRandomClassBased();\n\n\t// Being UAnimNotify interface\n\tvirtual void Notify(USkeletalMeshComponent *MeshComp, UAnimSequenceBase *AnimSeq) override;\n\tvirtual FString GetNotifyName_Implementation() const override;\n\t// End UAnimNotify interface\n\n\t/** The event to play */\n\tUPROPERTY(EditAnywhere, Category = \"So Anim Notify\", BlueprintReadWrite)\n\tTArray<FSoEventsForClass> Events;\n\n\tUPROPERTY(EditAnywhere, Category = \"So Anim Notify\", BlueprintReadWrite)\n\tESoVoiceType VoiceType = ESoVoiceType::SoVoiceTypeAttack;\n};\n"
  },
  {
    "path": "Source/SOrb/Basic/Helpers/SoDateTimeHelper.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#include \"SoDateTimeHelper.h\"\n#include \"Engine/Engine.h\"\n#include \"Settings/SoGameSettings.h\"\n\n#define LOCTEXT_NAMESPACE \"DateTimeHelper\"\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFText USoDateTimeHelper::GetTextFromMonth(int32 Month)\n{\n\tconst EMonthOfYear MonthType = static_cast<EMonthOfYear>(Month);\n\tswitch (MonthType)\n\t{\n\t\tcase EMonthOfYear::January:\t\treturn LOCTEXT(\"MonthJanuary\", \"January\");\n\t\tcase EMonthOfYear::February:\treturn LOCTEXT(\"MonthFebruary\", \"February\");\n\t\tcase EMonthOfYear::March:\t\treturn LOCTEXT(\"MonthMarch\", \"March\");\n\t\tcase EMonthOfYear::April:\t\treturn LOCTEXT(\"MonthApril\", \"April\");\n\t\tcase EMonthOfYear::May:\t\t\treturn LOCTEXT(\"MonthMay\", \"May\");\n\t\tcase EMonthOfYear::June:\t\treturn LOCTEXT(\"MonthJune\", \"June\");\n\t\tcase EMonthOfYear::July:\t\treturn LOCTEXT(\"MonthJuly\", \"July\");\n\t\tcase EMonthOfYear::August:\t\treturn LOCTEXT(\"MonthAugust\", \"August\");\n\t\tcase EMonthOfYear::September:\treturn LOCTEXT(\"MonthSeptember\", \"September\");\n\t\tcase EMonthOfYear::October:\t\treturn LOCTEXT(\"MonthOctober\", \"October\");\n\t\tcase EMonthOfYear::November:\treturn LOCTEXT(\"MonthNovember\", \"November\");\n\t\tdefault:\n\t\tcase EMonthOfYear::December:\treturn LOCTEXT(\"MonthDecember\", \"December\");\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFText USoDateTimeHelper::GetTextFromSeconds(int32 Seconds, bool bShowEmptyHour)\n{\n\tstatic FNumberFormattingOptions NumberFormattingOptions;\n\tNumberFormattingOptions.MinimumIntegralDigits = 2;\n\n\tint32 NormalizedHours = 0;\n\tint32 NormalizedMinutes = 0;\n\tint32 NormalizedSeconds = 0;\n\tNormalizeSeconds(Seconds, NormalizedHours, NormalizedMinutes, NormalizedSeconds);\n\n\tFFormatNamedArguments Arguments;\n\tArguments.Add(TEXT(\"Hours\"), FText::AsNumber(NormalizedHours, &NumberFormattingOptions));\n\tArguments.Add(TEXT(\"Minutes\"), FText::AsNumber(NormalizedMinutes, &NumberFormattingOptions));\n\tArguments.Add(TEXT(\"Seconds\"), FText::AsNumber(NormalizedSeconds, &NumberFormattingOptions));\n\n\tif (!bShowEmptyHour && NormalizedHours == 0)\n\t{\n\t\treturn FText::Format(LOCTEXT(\"SecondsToTime\", \"{Minutes}:{Seconds}\"), Arguments);\n\t}\n\n\treturn FText::Format(LOCTEXT(\"SecondsToTimeMinusSeconds\", \"{Hours}:{Minutes}:{Seconds}\"), Arguments);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nfloat USoDateTimeHelper::NormalizeTime(float Time)\n{\n\treturn Time * USoGameSettings::Get().GetGameSpeed();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nfloat USoDateTimeHelper::DenormalizeTime(float Time)\n{\n\treturn Time / USoGameSettings::Get().GetGameSpeed();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nfloat USoDateTimeHelper::GetWorldDeltaSeconds(const UObject* WorldContextObject)\n{\n\tif (!GEngine)\n\t\treturn 0.f;\n\n\tconst UWorld* World = GEngine->GetWorldFromContextObject(WorldContextObject, EGetWorldErrorMode::LogAndReturnNull);\n\treturn World ? World->GetDeltaSeconds() : 0.f;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nfloat USoDateTimeHelper::GetWorldTimeSeconds(const UObject* WorldContextObject)\n{\n\tif (!GEngine)\n\t\treturn 0.f;\n\n\tconst UWorld* World = GEngine->GetWorldFromContextObject(WorldContextObject, EGetWorldErrorMode::LogAndReturnNull);\n\treturn World ? World->GetTimeSeconds() : 0.f;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nfloat USoDateTimeHelper::GetWorldUnpausedTimeSeconds(const UObject* WorldContextObject)\n{\n\tif (!GEngine)\n\t\treturn 0.f;\n\n\tconst UWorld* World = GEngine->GetWorldFromContextObject(WorldContextObject, EGetWorldErrorMode::LogAndReturnNull);\n\treturn World ? World->GetUnpausedTimeSeconds() : 0.f;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nfloat USoDateTimeHelper::GetWorldRealTimeSeconds(const UObject* WorldContextObject)\n{\n\tif (!GEngine)\n\t\treturn 0.f;\n\n\tconst UWorld* World = GEngine->GetWorldFromContextObject(WorldContextObject, EGetWorldErrorMode::LogAndReturnNull);\n\treturn World ? World->GetRealTimeSeconds() : 0.f;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nfloat USoDateTimeHelper::GetWorldAudioTimeSeconds(const UObject* WorldContextObject)\n{\n\tif (!GEngine)\n\t\treturn 0.f;\n\n\tconst UWorld* World = GEngine->GetWorldFromContextObject(WorldContextObject, EGetWorldErrorMode::LogAndReturnNull);\n\treturn World ? World->GetAudioTimeSeconds() : 0.f;\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nfloat USoDateTimeHelper::GetWorldTimeSinceSeconds(const UObject* WorldContextObject, float Time)\n{\n\treturn GetWorldTimeSeconds(WorldContextObject) - Time;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nfloat USoDateTimeHelper::GetWorldRealTimeSinceSeconds(const UObject* WorldContextObject, float Time)\n{\n\treturn GetWorldRealTimeSeconds(WorldContextObject) - Time;\n}\n\n#undef LOCTEXT_NAMESPACE\n"
  },
  {
    "path": "Source/SOrb/Basic/Helpers/SoDateTimeHelper.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#pragma once\n\n#include \"CoreMinimal.h\"\n#include \"Kismet/BlueprintFunctionLibrary.h\"\n#include \"Misc/App.h\"\n\n#include \"SoDateTimeHelper.generated.h\"\n\n// Helper class for Date and time related things\nUCLASS()\nclass SORB_API USoDateTimeHelper : public UBlueprintFunctionLibrary\n{\n\tGENERATED_BODY()\n\npublic:\n\t// Converts UtcDateTime from UTC time (UTC+0) to local time.\n\tUFUNCTION(BlueprintPure, Category = \">DateTime\")\n\tstatic FORCEINLINE FDateTime ConvertUTCTimeToLocalTime(FDateTime UTCDateTime)\n\t{\n\t\t// Shift to the local time.\n\t\tUTCDateTime += GetTimeZoneAsTimespan();\n\t\treturn UTCDateTime;\n\t}\n\n\t// Converts LocalDateTime from the local time zone to the UTC+0 time\n\t// NOTE: This assumes that LocalDateTime is the same local time as this machine.\n\tUFUNCTION(BlueprintPure, Category = \">DateTime\")\n\tstatic FORCEINLINE FDateTime ConvertLocalTimeToUTCTime(FDateTime LocalDateTime)\n\t{\n\t\t// Unshift to UTC+0 time\n\t\tLocalDateTime -= GetTimeZoneAsTimespan();\n\t\treturn LocalDateTime;\n\t}\n\n\t/** Gets the formated Text from the month number, where January is the first month, Month = 1  */\n\tUFUNCTION(BlueprintPure, Category = \">DateTime\")\n\tstatic FText GetTextFromMonth(int32 Month);\n\n\t/**\n\t * Gets the current time zone as a FTimespan.\n\t * NOTE: this should have pretty good precision up to seconds.\n\t * The hours should be the timezone difference we want.\n\t * Should be:\n\t * + for TimeZone > 0\n\t * - for TimeZone < 0\n\t */\n\tUFUNCTION(BlueprintPure, Category = \">DateTime\")\n\tstatic FORCEINLINE FTimespan GetTimeZoneAsTimespan()\n\t{\n\t\treturn FDateTime::Now() - FDateTime::UtcNow();\n\t}\n\n\t// Shortcut for the GetTimeZoneAsTimespan\n\tUFUNCTION(BlueprintPure, Category = \">DateTime\")\n\tstatic FORCEINLINE int32 GetTimeZoneAsInt()\n\t{\n\t\treturn GetTimeZoneAsTimespan().GetHours();\n\t}\n\n\t// Does as it says\n\tstatic FORCEINLINE float SecondsToMinutes(float Seconds) { return Seconds / 60.f; }\n\tstatic FORCEINLINE float SecondsToMinutes(int32 Seconds) { return static_cast<float>(Seconds) / 60.f; }\n\n\t/**\n\t * Converts an X amount of seconds into hours, minutes and seconds.\n\t * Normalizes the seconds so that they can be put on a clock.\n\t * OutHours - [0, infinity)\n\t * OutSeconds - [0, 60)\n\t * OutMinutes - [0, 60)\n\t */\n\tstatic FORCEINLINE void NormalizeSeconds(int32 Seconds, int32& OutHours, int32& OutMinutes, int32& OutSeconds)\n\t{\n\t\tOutSeconds = Seconds % 60;\n\t\t// Only interested in the minutes of hours, not the total absolute minutes value\n\t\tOutMinutes = (Seconds % 3600) / 60;\n\t\tOutHours = Seconds / 3600;\n\t}\n\n\t// BP version\n\tUFUNCTION(BlueprintPure, Category = \">DateTime\")\n\tstatic void NormalizeSecondsBP(int32 Seconds, int32& OutHours, int32& OutMinutes, int32& OutSeconds)\n\t{\n\t\tNormalizeSeconds(Seconds, OutHours, OutMinutes, OutSeconds);\n\t}\n\n\t/**\n\t * Format Seconds to to a human readable format: Hours:Minutes[:Seconds]\n\t */\n\tUFUNCTION(BlueprintPure, Category = \">DateTime\")\n\tstatic FText GetTextFromSeconds(int32 Seconds, bool bShowEmptyHour = true);\n\n\t// Helper for GetTextFromIntSeconds, truncates seconds towards 0\n\tUFUNCTION(BlueprintPure, Category = \">DateTime\")\n\tstatic FORCEINLINE FText GetTextFromFloatSeconds(const float Seconds, const bool bShowEmptyHour = true)\n\t{\n\t\treturn GetTextFromSeconds(FMath::TruncToInt(Seconds), bShowEmptyHour);\n\t}\n\n\t// This is just GetAverageMS() / 1000.f\n\tUFUNCTION(BlueprintPure, Category = \">Stats\")\n\tstatic float GetAverageFPS()\n\t{\n\t\textern ENGINE_API float GAverageFPS;\n\t\treturn GAverageFPS;\n\t}\n\n\tUFUNCTION(BlueprintPure, Category = \">Stats\")\n\tstatic float GetAverageMS()\n\t{\n\t\textern ENGINE_API float GAverageMS;\n\t\treturn GAverageMS;\n\t}\n\n\t// Gets the Time but normalized to the current game speed (time dilation)\n\tUFUNCTION(BlueprintPure, Category = \">Time\")\n\tstatic float NormalizeTime(float Time);\n\n\tUFUNCTION(BlueprintPure, Category = \">Time\")\n\tstatic float DenormalizeTime(float Time);\n\n\t// Gets app time delta in seconds (this is real time)\n\t// IS stopped when game pauses\n\t// NOT dilated/clamped\n\tUFUNCTION(BlueprintPure, Category = \">Time\")\n\tstatic float GetDeltaSeconds() { return static_cast<float>(GetDeltaSecondsDouble()); }\n\tstatic double GetDeltaSecondsDouble() { return FApp::GetDeltaTime(); }\n\n\t// Returns the world frame delta time in seconds\n\t// IS adjusted by time dilation\n\tUFUNCTION(BlueprintPure, Category = \">Time\", meta = (WorldContext=\"WorldContextObject\"))\n\tstatic float GetWorldDeltaSeconds(const UObject* WorldContextObject);\n\n\t// Returns time in seconds since world was brought up for play\n\t// IS stopped when game pauses\n\t// IS dilated/clamped\n\tUFUNCTION(BlueprintPure, Category=\">Time\", meta=(WorldContext=\"WorldContextObject\"))\n\tstatic float GetWorldTimeSeconds(const UObject* WorldContextObject);\n\n\t// Returns time in seconds since world was brought up for play\n\t// NOT stopped when game pauses\n\t// IS dilated/clamped\n\tUFUNCTION(BlueprintPure, Category=\">Time\", meta=(WorldContext=\"WorldContextObject\"))\n\tstatic float GetWorldUnpausedTimeSeconds(const UObject* WorldContextObject);\n\n\t// Returns time in seconds since world was brought up for play\n\t// NOT stopped when game pauses\n\t// NOT dilated/clamped\n\tUFUNCTION(BlueprintPure, Category=\">Time\", meta=(WorldContext=\"WorldContextObject\"))\n\tstatic float GetWorldRealTimeSeconds(const UObject* WorldContextObject);\n\n\t// Returns time in seconds since world was brought up for play\n\t// IS stopped when game pauses\n\t// NOT dilated/clamped\n\tUFUNCTION(BlueprintPure, Category=\">Time\", meta=(WorldContext=\"WorldContextObject\"))\n\tstatic float GetWorldAudioTimeSeconds(const UObject* WorldContextObject);\n\n\t// Helper for getting the time since a certain time.\n\t// This is just GetWorldTimeSeconds() - Time.\n\t// Time should be:\n\t// - IS stopped when game pauses\n\t// - IS dilated/clamped\n\tUFUNCTION(BlueprintPure, Category=\">Time\", meta=(WorldContext=\"WorldContextObject\"))\n\tstatic float GetWorldTimeSinceSeconds(const UObject* WorldContextObject, float Time);\n\n\n\t// Helper for getting the time since a certain time.\n\t// This is just GetWorldRealTimeSeconds() - Time.\n\t// Time should be:\n\t// - NOT stopped when game pauses\n\t// - NOT dilated/clamped\n\tUFUNCTION(BlueprintPure, Category=\">Time\", meta=(WorldContext=\"WorldContextObject\"))\n\tstatic float GetWorldRealTimeSinceSeconds(const UObject* WorldContextObject, float Time);\n};\n"
  },
  {
    "path": "Source/SOrb/Basic/Helpers/SoMathHelper.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#include \"SoMathHelper.h\"\n#include <cmath>\n\n#include \"EngineUtils.h\"\n#include \"DrawDebugHelpers.h\"\n#include \"Components/SceneCaptureComponent2D.h\"\n#include \"Engine/TextureRenderTarget2D.h\"\n\n#include \"SplineLogic/SoSpline.h\"\n#include \"SplineLogic/SoSplinePoint.h\"\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nuint64 USoMathHelper::TruncDoubleToUint64(const double Number)\n{\n\treturn static_cast<uint64>(std::trunc(Number));\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoMathHelper::AreActorsClose(AActor* First, AActor* Second, float MaxDistance)\n{\n\treturn First != nullptr &&\n\t\t   Second != nullptr &&\n\t\t   ((First->GetActorLocation() - Second->GetActorLocation()).SizeSquared() < MaxDistance * MaxDistance);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFRotator USoMathHelper::InterpolateRotation(FRotator A, FRotator B, float T, ESoInterpolationMethod Method)\n{\n\tfor (int32 i = 0; i < 3; ++i)\n\t{\n\t\tif (fabs((&A.Yaw)[i] - (&B.Yaw)[i]) > 180.0f)\n\t\t{\n\t\t\tif ((&A.Yaw)[i] < (&B.Yaw)[i])\n\t\t\t\t(&A.Yaw)[i] += 360;\n\t\t\telse\n\t\t\t\t(&B.Yaw)[i] += 360;\n\t\t}\n\t}\n\n\treturn Interpolate(A, B, T, Method);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFVector USoMathHelper::InterpolateVector(const FVector& A, const FVector& B, float T, ESoInterpolationMethod Method)\n{\n\treturn Interpolate(A, B, T, Method);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFVector USoMathHelper::GetProjectedNormal(const FVector& PlaneDirVector, const FVector& Normal)\n{\n\tFVector PlaneNormal = PlaneDirVector.CrossProduct(PlaneDirVector, FVector(0.f, 0.f, 1.f));\n\tPlaneNormal.Normalize();\n\treturn FVector::VectorPlaneProject(Normal, PlaneNormal).GetSafeNormal();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFVector USoMathHelper::GetSlideVector(const FVector& Delta, float Time, const FVector& Normal, const FHitResult& Hit)\n{\n\tFVector PlaneNormal = Delta.CrossProduct(Delta, FVector(0.f, 0.f, 1.f));\n\tPlaneNormal.Normalize();\n\tconst FVector ProjectedNormal = FVector::VectorPlaneProject(Normal, PlaneNormal).GetSafeNormal();\n\n\treturn FVector::VectorPlaneProject(Delta, ProjectedNormal) * Time;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nfloat USoMathHelper::CalculateAngle(const FSoSplinePoint& SplinePoint, const FVector& V1, const FVector& V2)\n{\n\tconst FVector PlaneNormal = SplinePoint.GetPlaneNormal();\n\tconst FVector ProjectedV1 = FVector::VectorPlaneProject(V1, PlaneNormal).GetSafeNormal();\n\tconst FVector ProjectedV2 = FVector::VectorPlaneProject(V2, PlaneNormal).GetSafeNormal();\n\n\tconst float Angle = FMath::Acos(FVector::DotProduct(ProjectedV1, ProjectedV2));\n\tconst int32 Sign = FMath::Sign(FVector::DotProduct(PlaneNormal, FVector::CrossProduct(ProjectedV1, ProjectedV2)));\n\treturn Angle * Sign;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nfloat USoMathHelper::CalculateAngle(const FVector2D& V1, const FVector2D& V2)\n{\n\tconst FVector2D V1N = V1.GetSafeNormal();\n\tconst FVector2D V2N = V2.GetSafeNormal();\n\treturn FMath::Atan2(V2N.Y, V2N.X) - FMath::Atan2(V1N.Y, V1N.X);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFVector USoMathHelper::CalcRangeAttackVelocity(\n\tconst FVector& StartPos,\n\tconst FSoSplinePoint& StartLocation,\n\tconst FVector& TargetPos,\n\tconst FSoSplinePoint& TargetLocation,\n\tfloat BulletVelocity,\n\tfloat GravityScale,\n\tint32 PreferredDiscriminantSign)\n{\n\tFVector Velocity = FVector(0.0f, 0.0f, 0.0f);\n\tconst bool bOk = CalcRangeAttackInternal(\n\t\tnullptr,\n\t\tStartPos,\n\t\tStartLocation,\n\t\tTargetPos,\n\t\tTargetLocation,\n\t\t{},\n\t\tBulletVelocity,\n\t\tGravityScale,\n\t\t0,\n\t\tPreferredDiscriminantSign,\n\t\tVelocity\n\t);\n\tif (bOk)\n\t\treturn Velocity;\n\n\treturn FVector(0.0f, 0.0f, 0.0f);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoMathHelper::CheckRangeAttack(\n\tconst UWorld* World,\n\tconst FVector& StartPos,\n\tconst FSoSplinePoint& StartLocation,\n\tconst FVector& TargetPos,\n\tconst FSoSplinePoint& TargetLocation,\n\tconst TArray<const AActor*>& ActorsToIgnore,\n\tfloat BulletVelocity,\n\tfloat GravityScale,\n\tint32 Precision,\n\tint32 PreferredDiscriminantSign\n)\n{\n\tFVector Velocity = FVector(0.0f, 0.0f, 0.0f);\n\treturn CalcRangeAttackInternal(\n\t\tWorld,\n\t\tStartPos,\n\t\tStartLocation,\n\t\tTargetPos,\n\t\tTargetLocation,\n\t\tActorsToIgnore,\n\t\tBulletVelocity,\n\t\tGravityScale,\n\t\tPrecision,\n\t\tPreferredDiscriminantSign,\n\t\tVelocity\n\t);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFVector USoMathHelper::CalcRangeAttackVelocity(\n\tconst FVector& StartPos,\n\tconst FVector& TargetPos,\n\tfloat BulletVelocity,\n\tfloat GravityScale,\n\tint32 PreferredDiscriminantSign\n)\n{\n\tFVector Velocity = FVector(0.0f, 0.0f, 0.0f);\n\tCalcRangeAttackInternal(nullptr, StartPos, TargetPos, {}, BulletVelocity, GravityScale, 0, PreferredDiscriminantSign, Velocity);\n\treturn Velocity;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoMathHelper::CheckRangeAttack(\n\tconst UWorld* World,\n\tconst FVector& StartPos,\n\tconst FVector& TargetPos,\n\tconst TArray<const AActor*>& ActorsToIgnore,\n\tfloat BulletVelocity,\n\tfloat GravityScale,\n\tint32 Precision,\n\tint32 PreferredDiscriminantSign\n)\n{\n\tFVector Velocity = FVector(0.0f, 0.0f, 0.0f);\n\treturn CalcRangeAttackInternal(World, StartPos, TargetPos, ActorsToIgnore, BulletVelocity, GravityScale, Precision, PreferredDiscriminantSign, Velocity);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoMathHelper::CalcRangeAttackInternal(\n\tconst UWorld* World,\n\tconst FVector& StartPos,\n\tconst FSoSplinePoint& StartLocation,\n\tconst FVector& TargetPos,\n\tconst FSoSplinePoint& TargetLocation,\n\tconst TArray<const AActor*>& ActorsToIgnore,\n\tfloat BulletVelocity,\n\tfloat GravityScale,\n\tint32 Precision,\n\tint32 PreferredDiscrimintantSign,\n\tFVector& OutVelocity\n)\n{\n\t// http://gamedev.stackexchange.com/questions/53552/how-can-i-find-a-projectiles-launch-angle\n\t// https://en.wikipedia.org/wiki/Trajectory_of_a_projectile#Angle_required_to_hit_coordinate_.28x.2Cy.29\n\n\tconst float v = BulletVelocity;\n\tconst float g = 1000 * GravityScale;\n\n\tconst float Difference = StartLocation.GetDistanceFromSplinePoint(TargetLocation);\n\tconst int32 Dir = -FMath::Sign(Difference);\n\t// distance along spline\n\tconst float x = FMath::Abs(Difference);\n\t// target height delta\n\tconst float y = TargetPos.Z - StartPos.Z;\n\n\tFVector2D Velocity;\n\tif (fabs(GravityScale) < KINDA_SMALL_NUMBER)\n\t{\n\t\t// trivial case, but idk why the rest of the magic does not handle this properly\n\t\tVelocity = FVector2D(x, y).GetSafeNormal() * BulletVelocity;\n\t}\n\telse\n\t{\n\t\tif (x > BIG_NUMBER / 2.0f)\n\t\t\treturn false;\n\n\t\tconst float Discriminant = (v*v*v*v) - g * (g * x * x + 2 * y * v * v);\n\t\tif (Discriminant < -KINDA_SMALL_NUMBER)\n\t\t\treturn false;\n\n\t\tif (Discriminant < KINDA_SMALL_NUMBER)\n\t\t\tVelocity = FVector2D(g * x, v * v).GetSafeNormal() * BulletVelocity;\n\t\telse\n\t\t\tVelocity = FVector2D(g * x, v * v + PreferredDiscrimintantSign * FMath::Sqrt(Discriminant)).GetSafeNormal() * BulletVelocity;\n\t}\n\n\tOutVelocity = StartLocation.GetDirection() * Velocity.X * Dir;\n\tOutVelocity.Z = Velocity.Y;\n\n\tFVector LastWorldPoint = StartPos;\n\tfor (int32 i = 1; i <= Precision && World != nullptr; ++i)\n\t{\n\t\tconst float xt = i * (x / static_cast<float>(Precision));\n\t\tconst float t = xt / Velocity.X;\n\t\tconst float yt = Velocity.Y * t - g / 2.0f * t * t;\n\n\t\tFVector ActualWorldPoint = (StartLocation + Dir * xt);\n\t\tActualWorldPoint.Z = StartPos.Z + yt;\n\n\t\tFCollisionObjectQueryParams ObjectQueryParams;\n\t\tObjectQueryParams.AddObjectTypesToQuery(ECC_WorldStatic);\n\t\tObjectQueryParams.AddObjectTypesToQuery(ECC_WorldDynamic);\n\t\tObjectQueryParams.AddObjectTypesToQuery(ECC_Pawn);\n\t\tFCollisionQueryParams QueryParams;\n\t\tfor (auto* Actor : ActorsToIgnore)\n\t\t\t\tQueryParams.AddIgnoredActor(Actor);\n\n\t\tconst bool bHit = World->LineTraceTestByObjectType(LastWorldPoint, ActualWorldPoint, ObjectQueryParams, QueryParams);\n\n\t\t// const FColor DebugColor = bHit ? FColor(255, 0, 0) : FColor(0, 255, 0);\n\t\t// DrawDebugLine(World, LastWorldPoint, ActualWorldPoint, DebugColor, false, 1.0f, 0, 12.333);\n\n\t\tif (bHit)\n\t\t\treturn false;\n\n\t\tLastWorldPoint = ActualWorldPoint;\n\t}\n\n\treturn true;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoMathHelper::CalcRangeAttackInternal(\n\tconst UWorld* World,\n\tconst FVector& StartPos,\n\tconst FVector& TargetPos,\n\tconst TArray<const AActor*>& ActorsToIgnore,\n\tfloat BulletVelocity,\n\tfloat GravityScale,\n\tint32 Precision,\n\tint32 PreferredDiscrimintantSign,\n\tFVector& OutVelocity\n)\n{\n\t// http://gamedev.stackexchange.com/questions/53552/how-can-i-find-a-projectiles-launch-angle\n\t// https://en.wikipedia.org/wiki/Trajectory_of_a_projectile#Angle_required_to_hit_coordinate_.28x.2Cy.29\n\n\tconst float v = BulletVelocity;\n\tconst float g = 1000 * GravityScale;\n\n\tconst FVector SourceToTarget = (TargetPos - StartPos);\n\n\t// horizontal distance\n\tconst float x = (TargetPos - StartPos).Size2D();\n\t// target height delta\n\tconst float y = TargetPos.Z - StartPos.Z;\n\n\tconst float Discriminant = (v*v*v*v) - g * (g * x * x + 2 * y * v * v);\n\tif (Discriminant < -KINDA_SMALL_NUMBER)\n\t\treturn false;\n\n\tFVector2D Velocity;\n\tif (Discriminant < KINDA_SMALL_NUMBER)\n\t\tVelocity = FVector2D(g * x, v * v).GetSafeNormal() * BulletVelocity;\n\telse\n\t\tVelocity = FVector2D(g * x, v * v + PreferredDiscrimintantSign * FMath::Sqrt(Discriminant)).GetSafeNormal() * BulletVelocity;\n\n\tconst FVector Dir = FVector(SourceToTarget.X, SourceToTarget.Y, 0.0f).GetSafeNormal();\n\tOutVelocity = Dir * Velocity.X;\n\tOutVelocity.Z = Velocity.Y;\n\n\tFVector LastWorldPoint = StartPos;\n\tfor (int32 i = 1; i <= Precision && World != nullptr; ++i)\n\t{\n\t\tconst float xt = i * (x / static_cast<float>(Precision));\n\t\tconst float t = xt / Velocity.X;\n\t\tconst float yt = Velocity.Y * t - g / 2.0f * t * t;\n\n\t\tFVector ActualWorldPoint = (StartPos + Dir * xt);\n\t\tActualWorldPoint.Z = StartPos.Z + yt;\n\n\t\tFCollisionObjectQueryParams ObjectQueryParams;\n\t\tObjectQueryParams.AddObjectTypesToQuery(ECC_WorldStatic);\n\t\tObjectQueryParams.AddObjectTypesToQuery(ECC_WorldDynamic);\n\t\tObjectQueryParams.AddObjectTypesToQuery(ECC_Pawn);\n\t\tFCollisionQueryParams QuaryParams;\n\t\tfor (auto* Actor : ActorsToIgnore)\n\t\t\t\tQuaryParams.AddIgnoredActor(Actor);\n\n\t\tconst bool bHit = World->LineTraceTestByObjectType(LastWorldPoint, ActualWorldPoint, ObjectQueryParams, QuaryParams);\n\n\t\t// const FColor DebugColor = bHit ? FColor(255, 0, 0) : FColor(0, 255, 0);\n\t\t// DrawDebugLine(World, LastWorldPoint, ActualWorldPoint, DebugColor, false, 1.0f, 0, 12.333);\n\n\t\tif (bHit)\n\t\t\treturn false;\n\n\t\tLastWorldPoint = ActualWorldPoint;\n\t}\n\n\treturn true;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nfloat USoMathHelper::ClampYaw(float AngleCenter, float MaxDistance, float AngleToClamp)\n{\n\t// force both angle to be in [0-360]\n\tAngleCenter = FMath::Fmod(AngleCenter + 360.0f, 360.0f);\n\tAngleToClamp = FMath::Fmod(AngleToClamp + 360.0f, 360.0f);\n\n\tconst float MinAngle = AngleCenter - MaxDistance;\n\tconst float MaxAngle = AngleCenter + MaxDistance;\n\n\t// nothing to done if it is already in the interval\n\tif (AngleToClamp >= MinAngle && AngleToClamp <= MaxAngle)\n\t\treturn AngleToClamp;\n\n\t// clamp to closest border, both direction is checked\n\tconst float PossibleTargets[4] = {\n\t\tMinAngle,\n\t\tMinAngle + 360 * (MinAngle > AngleToClamp ? -1 : 1),\n\t\tMaxAngle,\n\t\tMaxAngle + 360 * (MaxAngle > AngleToClamp ? -1 : 1)\n\t};\n\n\tfloat SelectedDistance = fabs(AngleToClamp - MinAngle);\n\tint32 SelectedIndex = 0;\n\tfor (int32 i = 1; i < 4; ++i)\n\t{\n\t\tconst float ActualDistance = fabs(AngleToClamp - PossibleTargets[i]);\n\t\tif (ActualDistance < SelectedDistance)\n\t\t{\n\t\t\tSelectedDistance = ActualDistance;\n\t\t\tSelectedIndex = i;\n\t\t}\n\t}\n\n\treturn PossibleTargets[SelectedIndex];\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFVector USoMathHelper::CalculateCurrentPositionAndSteepnessOnParabol(\n\tfloat Percent,\n\tconst FVector2D& SourceToTarget,\n\tfloat MiddlePointPercentX,\n\tfloat MiddleZ\n)\n{\n\t// https://www.desmos.com/calculator/lac2i0bgum\n\t// X1, Y1 = 0,0\n\t// X2, Y2 = SourceToTarget.X, SourceToTarget.Y\n\t// X3, Y3 = SourceToTarget.X / 2, MiddleZ\n\n\t// f(x) = aX^2 + bx + c\n\n\t// A1 = -X1^2 + X2^2\n\t// B1 = -X1 + X2\n\t// D1 = -Y1 + Y2\n\t// A2 = -X2^2 + X3^2\n\t// B2 = -X2 + X3\n\t// D2 = -Y2 + Y3\n\t// BMultiplier = - (B2/B1)\n\t// A3 = BMultiplier * A1 + A2\n\t// D3 = BMultiplier * D1 + D2\n\n\t// a = D3/A3\n\t// b = (D1 -A1*a/)B1\n\t// c = y1 - aX1^2 - bX1\n\n\tconst float X3 = SourceToTarget.X * MiddlePointPercentX;\n\n\tconst float A1 = SourceToTarget.X * SourceToTarget.X;\n\tconst float B1 = SourceToTarget.X;\n\tconst float D1 = SourceToTarget.Y;\n\tconst float A2 = -SourceToTarget.X * SourceToTarget.X + X3 * X3;\n\tconst float B2 = -SourceToTarget.X + X3;\n\tconst float D2 = -SourceToTarget.Y + MiddleZ;\n\tconst float BMultiplier = -(B2 / B1);\n\tconst float A3 = BMultiplier * A1 + A2;\n\tconst float D3 = BMultiplier * D1 + D2;\n\n\tconst float a = D3 / A3;\n\tconst float b = (D1 - A1 * a) / B1;\n\t// const float c = 0;\n\n\tconst float x = SourceToTarget.X * Percent;\n\tconst float y = a * x * x + b * x;\n\n\t// derivative: m = 2ax + b\n\t// y = mx + b\n\tconst float m = 2 * a * x + b;\n\t// const FVector2D Dir0 = FVector2D(0.0f, b);\n\t// const FVector2D Dir1 = FVector2D(1.0f, m + b);\n\t// const FVector2D Direction = (Dir1 - Dir0).GetSafeNormal();\n\treturn FVector(x, y, FVector2D(1.0f, m).GetSafeNormal().Y);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// Copied from imageplatecomponent.cpp\nFMatrix CalculateProjectionMatrix(const FMinimalViewInfo& MinimalView)\n{\n\tFMatrix ProjectionMatrix;\n\n\tif (MinimalView.ProjectionMode == ECameraProjectionMode::Orthographic)\n\t{\n\t\tconst float YScale = 1.0f / MinimalView.AspectRatio;\n\n\t\tconst float HalfOrthoWidth = MinimalView.OrthoWidth / 2.0f;\n\t\tconst float ScaledOrthoHeight = MinimalView.OrthoWidth / 2.0f * YScale;\n\n\t\tconst float NearPlane = MinimalView.OrthoNearClipPlane;\n\t\tconst float FarPlane = MinimalView.OrthoFarClipPlane;\n\n\t\tconst float ZScale = 1.0f / (FarPlane - NearPlane);\n\t\tconst float ZOffset = -NearPlane;\n\n\t\tProjectionMatrix = FReversedZOrthoMatrix(\n\t\t\tHalfOrthoWidth,\n\t\t\tScaledOrthoHeight,\n\t\t\tZScale,\n\t\t\tZOffset\n\t\t);\n\t}\n\telse\n\t{\n\t\t// Avoid divide by zero in the projection matrix calculation by clamping FOV\n\t\tProjectionMatrix = FReversedZPerspectiveMatrix(\n\t\t\tFMath::Max(0.001f, MinimalView.FOV) * (float)PI / 360.0f,\n\t\t\tMinimalView.AspectRatio,\n\t\t\t1.0f,\n\t\t\tGNearClippingPlane\n\t\t);\n\t}\n\n\tif (!MinimalView.OffCenterProjectionOffset.IsZero())\n\t{\n\t\tconst float Left = -1.0f + MinimalView.OffCenterProjectionOffset.X;\n\t\tconst float Right = Left + 2.0f;\n\t\tconst float Bottom = -1.0f + MinimalView.OffCenterProjectionOffset.Y;\n\t\tconst float Top = Bottom + 2.0f;\n\t\tProjectionMatrix.M[2][0] = (Left + Right) / (Left - Right);\n\t\tProjectionMatrix.M[2][1] = (Bottom + Top) / (Bottom - Top);\n\t}\n\n\treturn ProjectionMatrix;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoMathHelper::CalculateVectorsForShadowTransform(USceneCaptureComponent2D* SceneCaptureComponent, FLinearColor& OutRow0, FLinearColor& OutRow1)\n{\n\tFMinimalViewInfo MinimalViewInfo;\n\n\tif (!SceneCaptureComponent)\n\t\treturn;\n\n\tMinimalViewInfo.Location = SceneCaptureComponent->GetComponentLocation();\n\tMinimalViewInfo.Rotation = SceneCaptureComponent->GetComponentRotation();\n\n\tMinimalViewInfo.FOV = SceneCaptureComponent->FOVAngle;\n\tMinimalViewInfo.AspectRatio = SceneCaptureComponent->TextureTarget ? float(SceneCaptureComponent->TextureTarget->SizeX) / SceneCaptureComponent->TextureTarget->SizeY : 1.f;\n\tMinimalViewInfo.bConstrainAspectRatio = false;\n\tMinimalViewInfo.ProjectionMode = SceneCaptureComponent->ProjectionType;\n\tMinimalViewInfo.OrthoWidth = SceneCaptureComponent->OrthoWidth;\n\n\tconst FMatrix ViewRotationMatrix = FInverseRotationMatrix(\n\t\tMinimalViewInfo.Rotation) * FMatrix(FPlane(0, 0, 1, 0),\n\t\tFPlane(1, 0, 0, 0),\n\t\tFPlane(0, 1, 0, 0),\n\t\tFPlane(0, 0, 0, 1)\n\t);\n\n\tFMatrix ProjectionMatrix;\n\tif (SceneCaptureComponent && SceneCaptureComponent->bUseCustomProjectionMatrix)\n\t\tProjectionMatrix = AdjustProjectionMatrixForRHI(SceneCaptureComponent->CustomProjectionMatrix);\n\telse\n\t\tProjectionMatrix = AdjustProjectionMatrixForRHI(CalculateProjectionMatrix(MinimalViewInfo));\n\n\tconst FMatrix ViewMatrix = FTranslationMatrix(-MinimalViewInfo.Location) * ViewRotationMatrix;\n\n\tconst FMatrix Matrix = (ViewMatrix * ProjectionMatrix).GetTransposed();\n\tOutRow0 = FLinearColor(Matrix.M[0][0], Matrix.M[0][1], Matrix.M[0][2], Matrix.M[0][3]);\n\tOutRow1 = FLinearColor(Matrix.M[1][0], Matrix.M[1][1], Matrix.M[1][2], Matrix.M[1][3]);\n}\n"
  },
  {
    "path": "Source/SOrb/Basic/Helpers/SoMathHelper.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#pragma once\n#include \"Kismet/BlueprintFunctionLibrary.h\"\n#include \"SoMathHelper.generated.h\"\n\nstruct FHitResult;\nstruct FSoSplinePoint;\nclass USceneCaptureComponent2D;\n\nUENUM()\nenum class ESoInterpolationMethod : uint8\n{\n\t// https://codeplea.com/simple-interpolation\n\n\tEIM_Linear\t\t\tUMETA(DisplayName = \"Linear\"),\n\tEIM_Cosine\t\t\tUMETA(DisplayName = \"Cosine\"),\n\tEIM_SmoothStep\t\tUMETA(DisplayName = \"SmoothStep\"),\n\tEIM_Acceleration\tUMETA(DisplayName = \"Acceleration\"),\n\tEIM_Deceleration\tUMETA(DisplayName = \"Deceleration\"),\n\n\tEIM_NumOf\t\t\tUMETA(Hidden)\n};\n\nUCLASS()\nclass SORB_API USoMathHelper : public UBlueprintFunctionLibrary\n{\n\tGENERATED_BODY()\n\npublic:\n\n\tUFUNCTION(BlueprintPure, Category = Math)\n\tstatic bool AreActorsClose(AActor* First, AActor* Second, float MaxDistance);\n\n\n\t/**\n\t * Make Number wrap around MaxNumber aka be in the range [0, MaxNumber)\n\t * This function is basically the same as Number % MaxNumber but it also\n\t * works with negative numbers.\n\t *\n\t * @param Number\n\t * @param MaxNumber\t\tThe length  we are trying to wrap around\n\t * @return the valid index with values in range [0, MaxNumber)\n\t */\n\tUFUNCTION(BlueprintPure, Category = Math)\n\tstatic FORCEINLINE int32 WrapIndexAround(int32 Number, int32 MaxNumber)\n\t{\n\t\treturn (MaxNumber + (Number % MaxNumber)) % MaxNumber;\n\t}\n\n\t// Is Number in [Start, End]\n\tstatic FORCEINLINE bool IsInClosedInterval(float Number, float Start, float End)\n\t{\n\t\t// First check if near the bounds then check if in range\n\t\treturn FMath::IsNearlyEqual(Number, Start, KINDA_SMALL_NUMBER)\n\t\t\t|| FMath::IsNearlyEqual(Number, End, KINDA_SMALL_NUMBER)\n\t\t\t|| (Number > Start && Number < End);\n\t}\n\n\tstatic uint64 TruncDoubleToUint64(double Number);\n\n\t// Converts from bytes to megabytes (base 2)\n\ttemplate <typename Type>\n\tstatic FORCEINLINE float BytesToMegaBytes(Type Bytes)\n\t{\n\t\t// 2^20\n\t\tstatic const float BytesInAMegaByte = FGenericPlatformMath::Pow(2.f, 20.f);\n\t\treturn static_cast<float>(Bytes) / BytesInAMegaByte;\n\t}\n\n\t// 64 bits specialization\n\ttemplate <uint64>\n\tstatic FORCEINLINE double BytesToMegaBytes(uint64 Bytes)\n\t{\n\t\tstatic const double BytesInAMegaByte = FGenericPlatformMath::Pow(2.f, 20.f);\n\t\treturn static_cast<double>(Bytes) / BytesInAMegaByte;\n\t}\n\ttemplate <int64>\n\tstatic FORCEINLINE double BytesToMegaBytes(int64 Bytes)\n\t{\n\t\tstatic const double BytesInAMegaByte = FGenericPlatformMath::Pow(2.f, 20.f);\n\t\treturn static_cast<double>(Bytes) / BytesInAMegaByte;\n\t}\n\n\t// Converts from KiloByte to megabytes (base 2)\n\ttemplate <typename Type>\n\tstatic FORCEINLINE float KiloBytesToMegaBytes(Type KiloBytes)\n\t{\n\t\t// 2^10\n\t\tstatic const float KiloBytesInAMegaByte = FGenericPlatformMath::Pow(2.f, 10.f);\n\t\treturn static_cast<float>(KiloBytes) / KiloBytesInAMegaByte;\n\t}\n\n\t/** Vector.Rotation() for blueprint */\n\tUFUNCTION(BlueprintPure, Category = Math)\n\tstatic FORCEINLINE FRotator VectorToRotation(const FVector& Vector)\n\t{\n\t\treturn Vector.Rotation();\n\t}\n\n\tUFUNCTION(BlueprintPure, Category = Math)\n\tstatic FORCEINLINE float InterpolateSmoothStep(float A, float B, float T)\n\t{\n\t\tconst float Param = T * T * (3 - 2 * T);\n\t\treturn A + Param * (B - A);\n\t}\n\n\tUFUNCTION(BlueprintPure, Category = Math)\n\tstatic FORCEINLINE float InterpolateAcceleration(float A, float B, float T)\n\t{\n\t\tconst float Param = T * T;\n\t\treturn A + Param * (B - A);\n\t}\n\n\tUFUNCTION(BlueprintPure, Category = Math)\n\tstatic FORCEINLINE float InterpolateDeceleration(float A, float B, float T)\n\t{\n\t\tconst float Param = 1 - (1 - T) * (1 - T);\n\t\treturn A + Param * (B - A);\n\t}\n\n\ttemplate <typename Type>\n\tstatic Type InterpolateSmoothStep(Type A, Type B, float T)\n\t{\n\t\tconst float Param = T * T * (3 - 2 * T);\n\t\treturn A + Param * (B - A);\n\t}\n\n\ttemplate <typename Type>\n\tstatic Type InterpolateCosine(Type A, Type B, float T)\n\t{\n\t\tconst float Param = -FMath::Cos(PI * T) / 2.0f + 0.5f;\n\t\treturn A + Param * (B - A);\n\t}\n\n\ttemplate <typename Type>\n\tstatic Type InterpolateAcceleration(Type A, Type B, float T)\n\t{\n\t\tconst float Param = T * T;\n\t\treturn A + Param * (B - A);\n\t}\n\n\ttemplate <typename Type>\n\tstatic Type InterpolateDeceleration(Type A, Type B, float T)\n\t{\n\t\tconst float Param = 1 - (1 - T) * (1 - T);\n\t\treturn A + Param * (B - A);\n\t}\n\n\ttemplate <typename Type>\n\tstatic Type Interpolate(const Type& A, const Type& B, float T, ESoInterpolationMethod Method)\n\t{\n\t\tswitch (Method)\n\t\t{\n\t\t\tcase ESoInterpolationMethod::EIM_Cosine:\n\t\t\t\treturn InterpolateCosine(A, B, T);\n\n\t\t\tcase ESoInterpolationMethod::EIM_SmoothStep:\n\t\t\t\treturn InterpolateSmoothStep(A, B, T);\n\n\t\t\tcase ESoInterpolationMethod::EIM_Acceleration:\n\t\t\t\treturn InterpolateAcceleration(A, B, T);\n\n\t\t\tcase ESoInterpolationMethod::EIM_Deceleration:\n\t\t\t\treturn InterpolateDeceleration(A, B, T);\n\n\t\t\tcase ESoInterpolationMethod::EIM_NumOf:\n\t\t\tcase ESoInterpolationMethod::EIM_Linear:\n\t\t\tdefault:\n\t\t\t\treturn B * T + A * (1.0f - T);\n\t\t}\n\t}\n\n\tUFUNCTION(BlueprintPure)\n\tstatic FRotator InterpolateRotation(FRotator A, FRotator B, float T, ESoInterpolationMethod Method);\n\n\tUFUNCTION(BlueprintPure)\n\tstatic FVector InterpolateVector(const FVector& A, const FVector& B, float T, ESoInterpolationMethod Method);\n\n\t/** Works in radian, returns shortest distance between angles */\n\tFORCEINLINE static float ShortAngleDist(float Angle0, float Angle1)\n\t{\n\t\tstatic constexpr float Max = PI * 2;\n\t\tconst float Delta = FMath::Fmod(Angle1 - Angle0, Max);\n\t\treturn FMath::Fmod(2 * Delta, Max) - Delta;\n\t}\n\n\t/** Remaps Number from CurrentInputValue from range [InputMin, InputMax) to [OutputMin, OutputMax) */\n\tFORCEINLINE static int32 RemapRange(int32 CurrentInputValue, int32 InputMin, int32 InputMax, int32 OutputMin, int32 OutputMax)\n\t{\n\t\treturn OutputMin + (CurrentInputValue - InputMin) * (OutputMax - OutputMin) / (InputMax - InputMin);\n\t}\n\n\t// originally they were only in charmovement but I guess they were required elsewhere too\n\tstatic FVector GetProjectedNormal(const FVector& PlaneDirVector, const FVector& Normal);\n\tstatic FVector GetSlideVector(const FVector& Delta, float Time, const FVector& Normal, const FHitResult& Hit);\n\n\t// calculate the angle between the projected V1 and V2, the projection plane is defined by the spline point\n\tstatic float CalculateAngle(const FSoSplinePoint& SplinePoint, const FVector& V1, const FVector& V2);\n\n\tstatic float CalculateAngle(const FVector2D& V1, const FVector2D& V2);\n\n\t/**\n\t*  Calculates the velocity with size \"BulletVelocity\" to throw something along spline from source to target\n\t*  Works along spline\n\t*  Returns nullvector if the target is unreachable with the given speed & gravity\n\t*  Precision num: amount of raycasts\n\t*/\n\tstatic FVector CalcRangeAttackVelocity(\n\t\tconst FVector& StartPos,\n\t\tconst FSoSplinePoint& StartLocation,\n\t\tconst FVector& TargetPos,\n\t\tconst FSoSplinePoint& TargetLocation,\n\t\tfloat BulletVelocity,\n\t\tfloat GravityScale,\n\t\tint32 PreferredDiscriminantSign\n\t);\n\n\t/**\n\t*  Checks if a projectile could hit target from source moving along the spline\n\t*  Works along spline\n\t*  Precision num: amount of raycasts\n\t*  Return value: true if it would hit the target\n\t*/\n\tstatic bool CheckRangeAttack(\n\t\tconst UWorld* World,\n\t\tconst FVector& StartPos,\n\t\tconst FSoSplinePoint& StartLocation,\n\t\tconst FVector& TargetPos,\n\t\tconst FSoSplinePoint& TargetLocation,\n\t\tconst TArray<const AActor*>& ActorsToIgnore,\n\t\tfloat BulletVelocity,\n\t\tfloat GravityScale,\n\t\tint32 Precision,\n\t\tint32 PreferredDiscriminantSign\n\t);\n\n\t/**\n\t*  Calculates the velocity with size \"BulletVelocity\" to throw something along spline from source to target\n\t*  Returns nullvector if the target is unreachable with the given speed & gravity\n\t*  Precision num: amount of raycasts\n\t*/\n\tUFUNCTION(BlueprintPure)\n\tstatic FVector CalcRangeAttackVelocity(\n\t\tconst FVector& StartPos,\n\t\tconst FVector& TargetPos,\n\t\tfloat BulletVelocity,\n\t\tfloat GravityScale,\n\t\tint32 PreferredDiscriminantSign\n\t);\n\n\t/**\n\t*  Checks if a projectile could hit target from source moving along the spline\n\t*  Precision num: amount of raycasts\n\t*  Return value: true if it would hit the target\n\t*/\n\tstatic bool CheckRangeAttack(\n\t\tconst UWorld* World,\n\t\tconst FVector& StartPos,\n\t\tconst FVector& TargetPos,\n\t\tconst TArray<const AActor*>& ActorsToIgnore,\n\t\tfloat BulletVelocity,\n\t\tfloat GravityScale,\n\t\tint32 Precision,\n\t\tint32 PreferredDiscriminantSign\n\t);\n\n\t/**\n\t *  Clamps AngleCenter to interval [ AngleCenter - MaxDistance, AngleCenter + MaxDistance ]\n\t */\n\tUFUNCTION(BlueprintPure, Category = Math)\n\tstatic float ClampYaw(float AngleCenter, float MaxDistance, float AngleToClamp);\n\n\t// X,Y: positon, Z: Steepness\n\tUFUNCTION(BlueprintPure, Category = Math)\n\tstatic FVector CalculateCurrentPositionAndSteepnessOnParabol(float Percent, const FVector2D& SourceToTarget, float MiddlePointPercentX, float MiddleZ);\n\n\n\tstatic void CalculateVectorsForShadowTransform(USceneCaptureComponent2D* CaptureComponent, FLinearColor& OutRow0, FLinearColor& OutRow1);\n\nprivate:\n\t/**\n\t*  Calculates velocity for range attack + checks hit if Precision > 0\n\t*  Works along spline\n\t*  Precision: amount of raycasts - 0: no hit check\n\t*  Return value: true if it would hit the target\n\t*/\n\tstatic bool CalcRangeAttackInternal(\n\t\tconst UWorld* World,\n\t\tconst FVector& StartPos,\n\t\tconst FSoSplinePoint& StartLocation,\n\t\tconst FVector& TargetPos,\n\t\tconst FSoSplinePoint& TargetLocation,\n\t\tconst TArray<const AActor*>& ActorsToIgnore,\n\t\tfloat BulletVelocity,\n\t\tfloat GravityScale,\n\t\tint32 Precision,\n\t\tint32 PreferredDiscrimintantSign,\n\t\tFVector& OutVelocity\n\t);\n\n\t/**\n\t*  Calculates velocity for range attack + checks hit if Precision > 0\n\t*  Precision: amount of raycasts - 0: no hit check\n\t*  Return value: true if it would hit the target\n\t*/\n\tstatic bool CalcRangeAttackInternal(\n\t\tconst UWorld* World,\n\t\tconst FVector& StartPos,\n\t\tconst FVector& TargetPos,\n\t\tconst TArray<const AActor*>& ActorsToIgnore,\n\t\tfloat BulletVelocity,\n\t\tfloat GravityScale,\n\t\tint32 Precision,\n\t\tint32 PreferredDiscrimintantSign,\n\t\tFVector& OutVelocity\n\t);\n\n};\n"
  },
  {
    "path": "Source/SOrb/Basic/Helpers/SoPlatformHelper.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#include \"SoPlatformHelper.h\"\n\n#include \"Kismet/KismetSystemLibrary.h\"\n#include \"RHI.h\"\n#include \"Framework/Application/SlateApplication.h\"\n#include \"HAL/PlatformFilemanager.h\"\n#include \"Engine/World.h\"\n#include \"GenericPlatform/GenericApplication.h\"\n#include \"Engine/Engine.h\"\n#include \"Engine/LocalPlayer.h\"\n#include \"Slate/SceneViewport.h\"\n#include \"HAL/PlatformApplicationMisc.h\"\n#include \"Misc/FileHelper.h\"\n#include \"UObject/UObjectIterator.h\"\n#include \"GameFramework/PlayerController.h\"\n#include \"GameFramework/WorldSettings.h\"\n#include \"Misc/EngineVersion.h\"\n#include \"AssetRegistryModule.h\"\n\n#include \"Settings/SoDisplaySettingsTypes.h\"\n#include \"Settings/SoGameSettings.h\"\n#include \"Basic/Helpers/SoMathHelper.h\"\n#include \"Basic/Helpers/SoStaticHelper.h\"\n#include \"SoStringHelper.h\"\n#include \"Basic/SoGameSingleton.h\"\n#include \"Character/SoPlayerController.h\"\n#include \"HAL/FileManagerGeneric.h\"\n\n#if PLATFORM_WINDOWS\n#include \"Windows/WindowsApplication.h\"\n#endif // PLATFORM_WINDOWS\n\n#if PLATFORM_XBOXONE\n#include \"XboxOne/XboxOneApplication.h\"\n#include \"XboxOne/XboxOneMisc.h\"\n#endif // PLATFORM_XBOXONE\n\n#if WARRIORB_WITH_SDL2\n#include \"NYSDL2_GamepadHelper.h\"\n#endif // WARRIORB_WITH_SDL2\n\n#if WARRIORB_WITH_STEAM\n#include \"NYSteamHelper.h\"\n#include \"INotYetSteamModule.h\"\n#endif\n\nstatic const FName AssetRegistryName(TEXT(\"AssetRegistry\"));\n\nDEFINE_LOG_CATEGORY_STATIC(LogSoPlatformHelper, All, All)\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFString FSoEngineInfo::ToString() const\n{\n\treturn FString::Printf(\n\t\tTEXT(\"Engine:\\n\")\n\t\tTEXT(\"\\tDepotName = `%s`\\n\")\n\t\tTEXT(\"\\tEngineVersion = `%s`\"),\n\t\t*DepotName, *EngineVersion);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFString FSoOperatingSystemInfo::ToString() const\n{\n\treturn FString::Printf(\n\t\tTEXT(\"OperatingSystem:\\n\")\n\t\tTEXT(\"\\tOSVersion = `%s`\\n\")\n\t\tTEXT(\"\\tOSMajor = `%s`, OSMinor = `%s`\\n\")\n\t\tTEXT(\"\\tbIs64Bits = %d\"),\n\t\t*OSVersion, *OSMajor, *OSMinor, bIs64Bits);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFString FSoCPUInfo::ToString() const\n{\n\treturn FString::Printf(\n\t\tTEXT(\"CPU:\\n\")\n\t\tTEXT(\"\\tCPUPhysicalCores = %d, CPULogicalCores = %d\\n\")\n\t\tTEXT(\"\\tCPUVendor = `%s`, CPUBrand = `%s`\\n\")\n\t\tTEXT(\"\\tCPUInfo = %u\"),\n\t\tCPUPhysicalCores, CPULogicalCores, *CPUVendor, *CPUBrand, CPUInfo);\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFString FSoGPUInfo::ToString() const\n{\n\treturn FString::Printf(\n\t\tTEXT(\"GPU:\\n\")\n\t\tTEXT(\"\\tGPUVendorID = %u, GPUDeviceID = %u\\n\")\n\t\tTEXT(\"\\tGPUDeviceRevision = %u\\n\")\n\t\tTEXT(\"\\tDesktopGPUAdapter = `%s`\\n\")\n\t\tTEXT(\"\\tRenderingGPUAdapter = `%s`\\n\")\n\t\tTEXT(\"\\tAdapterInternalDriverVersion = `%s`, AdapterUserDriverVersion = `%s`, AdapterDriverDate = `%s`\"),\n\t\tGPUVendorID, GPUDeviceID, GPUDeviceRevision, *DesktopGPUAdapter,\n\t\t*RenderingGPUAdapter, *AdapterInternalDriverVersion, *AdapterUserDriverVersion,\n\t\t*AdapterDriverDate);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFString FSoPlatformMemoryInfo::ToString() const\n{\n\treturn FString::Printf(\n\t\tTEXT(\"Memory:\\n\")\n\t\tTEXT(\"\\tRAMAvailablePhysical = %llu MB\\n\")\n\t\tTEXT(\"\\tRAMAvailableVirtual = %llu MB\\n\")\n\t\tTEXT(\"\\tRAMUsedPhysical = %llu MB\\n\")\n\t\tTEXT(\"\\tRAMPeakUsedPhysical = %llu MB\\n\")\n\t\tTEXT(\"\\tRAMUsedVirtual = %llu MB\\n\")\n\t\tTEXT(\"\\tRAMPeakUsedVirtual = %llu MB\\n\")\n\t\tTEXT(\"\\tGPUTextureMemory = %llu MB\\n\")\n\t\tTEXT(\"\\tGPURenderTargetMemory = %llu MB\\n\")\n\t\tTEXT(\"\\tGPUPoolSizeVRAMPercentage = %d %%\"),\n\t\tUSoMathHelper::TruncDoubleToUint64(RAMAvailablePhysicalMB), USoMathHelper::TruncDoubleToUint64(RAMAvailableVirtualMB), USoMathHelper::TruncDoubleToUint64(RAMUsedPhysicalMB),\n\t\tUSoMathHelper::TruncDoubleToUint64(RAMPeakUsedPhysicalMB), USoMathHelper::TruncDoubleToUint64(RAMUsedVirtualMB), USoMathHelper::TruncDoubleToUint64(RAMPeakUsedVirtualMB),\n\t\tUSoMathHelper::TruncDoubleToUint64(GPUTextureMemoryMB), USoMathHelper::TruncDoubleToUint64(GPURenderTargetMemoryMB), GPUPoolSizeVRAMPercentage);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoPlatformHelper::PrintErrorToAll(const UObject* WorldContextObject, const FString& Message)\n{\n\tUE_LOG(LogSoPlatformHelper, Error, TEXT(\"%s\"), *Message);\n\tPrintToConsole(WorldContextObject, Message);\n\tPrintToScreen(Message, 10.f, FColor::Red);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoPlatformHelper::PrintToAll(const UObject* WorldContextObject, const FString& Message)\n{\n\tUE_LOG(LogSoPlatformHelper, Log, TEXT(\"%s\"), *Message);\n\tPrintToConsole(WorldContextObject, Message);\n\tPrintToScreen(Message, 10.f, FColor::White);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoPlatformHelper::PrintToConsole(const UObject* WorldContextObject, const FString& Message)\n{\n\tif (APlayerController* PlayerController = USoStaticHelper::GetPlayerController(WorldContextObject))\n\t\tPlayerController->ClientMessage(Message);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoPlatformHelper::PrintToScreen(const FString& Message, float TimeToDisplaySeconds, FColor DisplayColor)\n{\n\tif (!GEngine)\n\t{\n\t\tUE_LOG(LogSoPlatformHelper, Error, TEXT(\"PrintToScreen: GEngine == nullptr\"));\n\t\treturn;\n\t}\n\n\tconst bool bPreviousValue = GAreScreenMessagesEnabled;\n\tGAreScreenMessagesEnabled = true;\n\tGEngine->AddOnScreenDebugMessage(-1, TimeToDisplaySeconds, DisplayColor, Message);\n\tGAreScreenMessagesEnabled = bPreviousValue;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoPlatformHelper::LaunchURL(const FString& URL, bool bCopyURLToClipboard)\n{\n\tif (!URL.IsEmpty() && bCopyURLToClipboard)\n\t\tFPlatformApplicationMisc::ClipboardCopy(*URL);\n\n\tif (URL.IsEmpty() || !FPlatformProcess::CanLaunchURL(*URL))\n\t{\n\t\tUE_LOG(\n\t\t\tLogSoPlatformHelper,\n\t\t\tWarning,\n\t\t\tTEXT(\"Can not launch URL = `%s`. Either because the URL is empty or the platform can not launch it\"),\n\t\t\t*URL\n\t\t);\n\t\treturn false;\n\t}\n\n\tFString Error;\n\tFPlatformProcess::LaunchURL(*URL, nullptr, &Error);\n\tif (!Error.IsEmpty())\n\t{\n\t\tUE_LOG(\n\t\t\tLogSoPlatformHelper,\n\t\t\tWarning,\n\t\t\tTEXT(\"Error happened while launching URL = `%s`, Error = `%s`\"),\n\t\t\t*URL, *Error\n\t\t);\n\t\treturn false;\n\t}\n\n\treturn true;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoPlatformHelper::ExploreFolder(const FString& FolderPath)\n{\n\tif (FolderPath.IsEmpty())\n\t\treturn false;\n\n#if PLATFORM_DESKTOP\n\tFPlatformProcess::ExploreFolder(*FolderPath);\n\treturn true;\n#else\n\t// consoles most likely, ignore\n\treturn false;\n#endif\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoPlatformHelper::DisableVerifyGC(bool bCheckForCommandLineOverrides)\n{\n\t// Already disabled, nothing to do\n\tif (!GShouldVerifyGCAssumptions)\n\t{\n\t\tUE_LOG(LogSoPlatformHelper, Verbose, TEXT(\"DisableVerifyGC: GShouldVerifyGCAssumptions IS ALREADY false\"));\n\t\treturn;\n\t}\n\n\t// Is set by the command line flags, ignore, as the user command line has higher precedence\n\tif (bCheckForCommandLineOverrides)\n\t{\n\t\tif (FParse::Param(FCommandLine::Get(), TEXT(\"VERIFYGC\"))\n\t\t || FParse::Param(FCommandLine::Get(), TEXT(\"NOVERIFYGC\")))\n\t\t {\n\t\t\tUE_LOG(\n\t\t\t\tLogSoPlatformHelper,\n\t\t\t\tVerbose,\n\t\t\t\tTEXT(\"DisableVerifyGC: Ignoring because command line flags were specified: -VERIFYGC or -NOVERIFYGC\")\n\t\t\t);\n\t\t\treturn;\n\t\t }\n\t}\n\n\tUE_LOG(LogSoPlatformHelper, Log, TEXT(\"DisableVerifyGC: GShouldVerifyGCAssumptions = 0\"));\n\tGShouldVerifyGCAssumptions = false;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoPlatformHelper::SetIsAILoggingEnabled(bool bEnabled, bool bCheckForCommandLineOverrides)\n{\n\tif (!GEngine)\n\t{\n\t\tUE_LOG(LogSoPlatformHelper, Error, TEXT(\"SetIsAILoggingEnabledEnabled: Can't get valid GEngine\"));\n\t\treturn;\n\t}\n\n\t// Nothing to do\n\tconst bool bIsAILoggingEnabled = !GEngine->bDisableAILogging;\n\tif (bIsAILoggingEnabled == bEnabled)\n\t{\n\t\tUE_LOG(\n\t\t\tLogSoPlatformHelper,\n\t\t\tVerbose,\n\t\t\tTEXT(\"SetIsAILoggingEnabled: GEngine->bDisableAILogging IS ALREADY %d\"),\n\t\t\t!bIsAILoggingEnabled\n\t\t);\n\t}\n\n\t// Is set by the command line flags, ignore, as the user command line has higher precedence\n\tif (bCheckForCommandLineOverrides)\n\t{\n\t\tif (FParse::Param(FCommandLine::Get(), TEXT(\"noailogging\"))\n\t\t || FParse::Param(FCommandLine::Get(), TEXT(\"enableailogging\")))\n\t\t {\n\t\t\tUE_LOG(\n\t\t\t\tLogSoPlatformHelper,\n\t\t\t\tVerbose,\n\t\t\t\tTEXT(\"SetIsAILoggingEnabled: Ignoring because command line flags were specified: -noailogging or -enableailogging\")\n\t\t\t);\n\t\t\treturn;\n\t\t }\n\t}\n\n\tconst bool bNewValue = !bEnabled;\n\tUE_LOG(LogSoPlatformHelper, Log, TEXT(\"SetIsAILoggingEnabled: GEngine->bDisableAILogging = %d\"), bNewValue);\n\tGEngine->bDisableAILogging = bNewValue;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoPlatformHelper::SetAreScreenMessagesEnabled(bool bEnabled, bool bCheckForCommandLineOverrides)\n{\n\t/**\n\t*\tGlobal value indicating on-screen warnings/message should be displayed.\n\t*\tDisabled via console command \"DISABLEALLSCREENMESSAGES\"\n\t*\tEnabled via console command \"ENABLEALLSCREENMESSAGES\"\n\t*\tToggled via console command \"TOGGLEALLSCREENMESSAGES\"\n\t*/\n\n\t// Nothing to do\n\tif (GAreScreenMessagesEnabled == bEnabled)\n\t{\n\t\tUE_LOG(\n\t\t\tLogSoPlatformHelper,\n\t\t\tVerbose,\n\t\t\tTEXT(\"SetAreScreenMessagesEnabled: GAreScreenMessagesEnabled IS ALREADY %d\"),\n\t\t\tbEnabled\n\t\t);\n\t\treturn;\n\t}\n\n\t// Is set by the command line flags, ignore, as the user command line has higher precedence\n\tif (bCheckForCommandLineOverrides && FParse::Param(FCommandLine::Get(),TEXT(\"NOSCREENMESSAGES\")))\n\t{\n\t\tUE_LOG(\n\t\t\tLogSoPlatformHelper,\n\t\t\tVerbose,\n\t\t\tTEXT(\"SetAreScreenMessagesEnabled: Ignoring because command line flag was specified: -NOSCREENMESSAGES\")\n\t\t);\n\t}\n\n\tUE_LOG(LogSoPlatformHelper, Log, TEXT(\"SetAreScreenMessagesEnabled: GAreScreenMessagesEnabled = %d\"), GAreScreenMessagesEnabled);\n\tGAreScreenMessagesEnabled = bEnabled;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoPlatformHelper::SetIsMouseEnabled(const UObject* WorldContextObject, bool bEnabled)\n{\n\tASoPlayerController* PlayerController = ASoPlayerController::GetInstance(WorldContextObject);\n\tif (!PlayerController)\n\t{\n\t\tUE_LOG(LogSoPlatformHelper, Error, TEXT(\"SetIsMouseEnabled: Can't get valid ASoPlayerController\"));\n\t\treturn;\n\t}\n\n\tPlayerController->SetIsMouseEnabled(bEnabled);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoPlatformHelper::SetIsMouseAllowed(const UObject* WorldContextObject, bool bAllowed)\n{\n\tASoPlayerController* PlayerController = ASoPlayerController::GetInstance(WorldContextObject);\n\tif (!PlayerController)\n\t{\n\t\tUE_LOG(LogSoPlatformHelper, Error, TEXT(\"SetIsMouseAllowed: Can't get valid ASoPlayerController\"));\n\t\treturn;\n\t}\n\n\tPlayerController->SetIsMouseAllowed(bAllowed);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoPlatformHelper::IsMouseAllowed(const UObject* WorldContextObject)\n{\n\tASoPlayerController* PlayerController = ASoPlayerController::GetInstance(WorldContextObject);\n\tif (!PlayerController)\n\t{\n\t\tUE_LOG(LogSoPlatformHelper, Error, TEXT(\"IsMouseAllowed: Can't get valid ASoPlayerController\"));\n\t\treturn false;\n\t}\n\n\treturn PlayerController->IsMouseAllowed();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoPlatformHelper::MoveGameToDefaultMonitor()\n{\n#if PLATFORM_DESKTOP\n\tauto* GameSettings = USoGameSettings::GetInstance();\n\tif (!GameSettings)\n\t{\n\t\tUE_LOG(LogSoPlatformHelper, Error, TEXT(\"MoveGameToDefaultMonitor: GameSettings == nullptr\"));\n\t\treturn;\n\t}\n\n\t// Start on the main display by default\n\tint32 MonitorNumber = 0;\n\tFParse::Value(FCommandLine::Get(), TEXT(\"monitor=\"), MonitorNumber);\n\n\tUE_LOG(LogSoPlatformHelper, Log, TEXT(\"Using MonitorNumber = %d\"), MonitorNumber);\n\tFMonitorInfo MonitorInfo;\n\tif (GameSettings->MoveToMonitor(MonitorNumber, MonitorInfo))\n\t{\n\t\tUE_LOG(\n\t\t\tLogSoPlatformHelper,\n\t\t\tLog,\n\t\t\tTEXT(\"Moved to MonitorNumber = %d, Name = `%s`, ID = `%s`, NativeWidth = %d, NativeHeight = %d, bIsPrimary = %d\"),\n\t\t\tMonitorNumber, *MonitorInfo.Name, *MonitorInfo.ID, MonitorInfo.NativeWidth, MonitorInfo.NativeHeight, MonitorInfo.bIsPrimary\n\t\t);\n\t}\n\telse\n\t{\n\t\tUE_LOG(LogSoPlatformHelper, Error, TEXT(\"FAILED to Move to MonitorNumber = %d\"), MonitorNumber);\n\t}\n#endif // PLATFORM_DESKTOP\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoPlatformHelper::GetSupportedFullscreenResolutions(TArray<FSoDisplayResolution>& OutResolutions)\n{\n\tTArray<FIntPoint> SupportedResolutions;\n\tif (!UKismetSystemLibrary::GetSupportedFullscreenResolutions(SupportedResolutions))\n\t\treturn false;\n\n\tfor (const FIntPoint& SupportedResolution : SupportedResolutions)\n\t\tOutResolutions.Emplace(SupportedResolution);\n\n\treturn true;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoPlatformHelper::GetConvenientWindowedResolutions(TArray<FSoDisplayResolution>& OutResolutions)\n{\n\tTArray<FIntPoint> SupportedResolutions;\n\tif (!UKismetSystemLibrary::GetConvenientWindowedResolutions(SupportedResolutions))\n\t\treturn false;\n\n\tfor (const FIntPoint& SupportedResolution : SupportedResolutions)\n\t\tOutResolutions.Emplace(SupportedResolution);\n\n\treturn true;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoPlatformHelper::GetDisplaysRefreshRates(TSet<int32>& OutRefreshRates)\n{\n\tFScreenResolutionArray SupportedResolutions;\n\tif (RHIGetAvailableResolutions(SupportedResolutions, false))\n\t\tfor (const FScreenResolutionRHI& Resolution : SupportedResolutions)\n\t\t\tOutRefreshRates.Add(Resolution.RefreshRate);\n\n\treturn SupportedResolutions.Num() > 0;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoPlatformHelper::GetDisplaysMetrics(FDisplayMetrics& OutDisplayMetrics)\n{\n\tif (FSlateApplication::IsInitialized())\n\t{\n\t\tFSlateApplication::Get().GetInitialDisplayMetrics(OutDisplayMetrics);\n\t\treturn true;\n\t}\n\tif (FApp::CanEverRender())\n\t{\n\t\tFDisplayMetrics::RebuildDisplayMetrics(OutDisplayMetrics);\n\t\treturn true;\n\t}\n\n\tUE_LOG(LogSoPlatformHelper, Error, TEXT(\"GetDisplaysMetrics: Can't get valid FDisplayMetrics\"));\n\treturn false;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFAudioDevice* USoPlatformHelper::GetAudioDevice(const UObject* WorldContextObject)\n{\n\tif (!GEngine)\n\t{\n\t\tUE_LOG(LogSoPlatformHelper, Error, TEXT(\"GetAudioDevice: GEngine == nullptr\"));\n\t\treturn nullptr;\n\t}\n\tif (!GEngine->UseSound())\n\t{\n\t\tUE_LOG(LogSoPlatformHelper, Error, TEXT(\"GetAudioDevice: GEngine does not use sound or it AudioDeviceManager is not initialized :O\"));\n\t\treturn nullptr;\n\t}\n\n\tUWorld* ThisWorld = GEngine->GetWorldFromContextObject(WorldContextObject, EGetWorldErrorMode::LogAndReturnNull);\n\tif (!IsValid(ThisWorld))\n\t{\n\t\tUE_LOG(LogSoPlatformHelper, Error, TEXT(\"GetAudioDevice: UWorld == nullptr\"));\n\t\treturn nullptr;\n\t}\n\tif (!ThisWorld->bAllowAudioPlayback)\n\t{\n\t\tUE_LOG(LogSoPlatformHelper, Error, TEXT(\"GetAudioDevice: UWorld.bAllowAudioPlayback = false\"));\n\t\treturn nullptr;\n\t}\n\n\treturn ThisWorld->GetAudioDevice();\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoPlatformHelper::CreateDirectoryRecursively(const FString& FolderPath)\n{\n\t// Makes sure it is a directory, gets the directory path\n\tconst FString CreateFolder = FPaths::GetPath(FolderPath);\n\treturn FPlatformFileManager::Get().GetPlatformFile().CreateDirectoryTree(*CreateFolder);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoPlatformHelper::QuitGame(const UObject* WorldContextObject)\n{\n\tUE_LOG(LogSoPlatformHelper, Log, TEXT(\"QuitGame\"));\n#if WITH_EDITOR\n\t// NOTE: the console command this seems to be for all platforms, consoles too\n\t// Console command is used inside UGameEngine::Exec. and ULocalPlayer::Exec\n\tif (APlayerController* PlayerController = USoStaticHelper::GetPlayerController(WorldContextObject))\n\t{\n\t\tPlayerController->ConsoleCommand(TEXT(\"quit\"));\n\t}\n\telse\n\t{\n\t\tUE_LOG(LogSoPlatformHelper, Error, TEXT(\"QuitGame: APlayerController == nullptr\"));\n\t}\n#else\n\tFPlatformMisc::RequestExit(false);\n#endif\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoPlatformHelper::IsGameInForeground(UObject* WorldContextObject)\n{\n//#if WITH_EDITOR\n\tif (!GEngine)\n\t\treturn false;\n\n\tUWorld* ThisWorld = GEngine->GetWorldFromContextObject(WorldContextObject, EGetWorldErrorMode::LogAndReturnNull);\n\tif (!ThisWorld)\n\t{\n\t\t// Find world\n\t\tfor (TObjectIterator<AActor> Itr; Itr; ++Itr)\n\t\t{\n\t\t\tThisWorld = Itr->GetWorld();\n\t\t\tif (ThisWorld && ThisWorld->WorldType != EWorldType::EditorPreview  &&\n\t\t\t\tThisWorld->WorldType != EWorldType::Editor)\n\t\t\t{\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\t// Reset :(\n\t\t\tThisWorld = nullptr;\n\t\t}\n\t}\n\n\t// Find the first viewport of the first window and see if it is in foreground\n\t// TODO if this is the correct way on all platforms\n\tif (ThisWorld)\n\t\tif (const ULocalPlayer* LocalPlayer = ThisWorld->GetFirstLocalPlayerFromController())\n\t\t\tif (const UGameViewportClient* ViewportClient = LocalPlayer->ViewportClient)\n\t\t\t\tif (const FSceneViewport* Viewport = LocalPlayer->ViewportClient->GetGameViewport())\n\t\t\t\t\treturn Viewport->IsForegroundWindow();\n\n\t// last chance\n\treturn FPlatformApplicationMisc::IsThisApplicationForeground();\n//#else\n//\t// Can't use this in editor builds as it will just reference the Editor\n//\treturn FPlatformApplicationMisc::IsThisApplicationForeground();\n//#endif\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoPlatformHelper::SetGamePaused(const UObject* WorldContextObject, bool bPaused)\n{\n\tUE_LOG(LogSoPlatformHelper, Log, TEXT(\"SetGamePaused: bPaused = %d\"), bPaused);\n\n\t// Sets the Pause in the GameMode/World\n\tif (APlayerController* PlayerController = USoStaticHelper::GetPlayerController(WorldContextObject))\n\t\treturn PlayerController->SetPause(bPaused);\n\n\tUE_LOG(LogSoPlatformHelper, Error, TEXT(\"SetGamePaused: APlayerController == nullptr\"));\n\treturn false;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoPlatformHelper::IsGamePaused(const UObject* WorldContextObject)\n{\n\tif (!GEngine)\n\t{\n\t\tUE_LOG(LogSoPlatformHelper, Error, TEXT(\"IsGamePaused: GEngine == nullptr\"));\n\t\treturn false;\n\t}\n\n\tif (const UWorld* World = GEngine->GetWorldFromContextObject(WorldContextObject, EGetWorldErrorMode::LogAndReturnNull))\n\t\treturn World->IsPaused();\n\n\treturn false;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoPlatformHelper::SetGlobalTimeDilation(const UObject* WorldContextObject, float TimeDilation)\n{\n\tif (!GEngine)\n\t{\n\t\tUE_LOG(LogSoPlatformHelper, Error, TEXT(\"SetGlobalTimeDilation: GEngine == nullptr\"));\n\t\treturn;\n\t}\n\n\tUWorld* World = GEngine->GetWorldFromContextObject(WorldContextObject, EGetWorldErrorMode::LogAndReturnNull);\n\tif (!World)\n\t{\n\t\tUE_LOG(LogSoPlatformHelper, Error, TEXT(\"SetGlobalTimeDilation: UWorld == nullptr\"));\n\t\treturn;\n\t}\n\n\tAWorldSettings* WorldSettings = World->GetWorldSettings();\n\tif (!WorldSettings)\n\t{\n\t\tUE_LOG(LogSoPlatformHelper, Error, TEXT(\"SetGlobalTimeDilation: AWorldSettings == nullptr\"));\n\t\treturn;\n\t}\n\n\t// Values are the same, ignore\n\tif (FMath::IsNearlyEqual(WorldSettings->TimeDilation, TimeDilation))\n\t\treturn;\n\n\tconst float ActualTimeDilation = WorldSettings->SetTimeDilation(TimeDilation);\n\tif (FMath::IsNearlyEqual(TimeDilation, ActualTimeDilation))\n\t{\n\t\tUE_LOG(LogSoPlatformHelper, Log, TEXT(\"SetGlobalTimeDilation: TimeDilation = %f\"), TimeDilation);\n\t}\n\telse\n\t{\n\t\tUE_LOG(\n\t\t\tLogSoPlatformHelper,\n\t\t\tWarning,\n\t\t\tTEXT(\"Time Dilation must be between %f and %f. Clamped value to that range.\"),\n\t\t\tWorldSettings->MinGlobalTimeDilation, WorldSettings->MaxGlobalTimeDilation\n\t\t);\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nfloat USoPlatformHelper::GetGlobalTimeDilation(const UObject* WorldContextObject)\n{\n\tif (!GEngine)\n\t{\n\t\tUE_LOG(LogSoPlatformHelper, Error, TEXT(\"GetGlobalTimeDilation: GEngine == nullptr\"));\n\t\treturn Default;\n\t}\n\n\tif (const UWorld* World = GEngine->GetWorldFromContextObject(WorldContextObject, EGetWorldErrorMode::LogAndReturnNull))\n\t\tif (const AWorldSettings* WorldSettings = World->GetWorldSettings())\n\t\t\treturn WorldSettings->TimeDilation;\n\n\treturn USoGameSettings::DefaultGameSpeed;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoPlatformHelper::AreAllGameWindowsHidden()\n{\n\tstatic auto IsWindowHidden = [](TSharedRef<SWindow> Window)\n\t{\n\t\treturn Window->IsWindowMinimized() || !Window->IsVisible();\n\t};\n\n\t// Check all modals, DlgDataDisplay\n\tconst TArray<TSharedRef<SWindow>> AllWindows = FSlateApplication::Get().GetInteractiveTopLevelWindows();\n\tbool bAllHidden = true;\n\tfor (const TSharedRef<SWindow>& Window : AllWindows)\n\t{\n\t\tif (!IsWindowHidden(Window))\n\t\t{\n\t\t\tbAllHidden = false;\n\t\t\tbreak;\n\t\t}\n\t}\n\n\t// Check top level\n\tTSharedPtr<SWindow> MainWindow = FSlateApplication::Get().GetActiveTopLevelWindow();\n\tconst bool bIsMainWindowHidden = MainWindow.IsValid() ? IsWindowHidden(MainWindow.ToSharedRef()) : false;\n\n\treturn bAllHidden && bIsMainWindowHidden;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nconst FSoEngineInfo& USoPlatformHelper::GetUnrealEngineInfo()\n{\n\tstatic const FEngineVersion& EngineVersion = FEngineVersion::Current();\n\tstatic const FSoEngineInfo EngineInfo = { EngineVersion.GetBranch(), EngineVersion.ToString() };\n\treturn EngineInfo;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// Tries opening and parsing the specified release file in /etc to find information about the distro used.\nbool ReadEtcReleaseFile(const FString& FilePath, FString& OutOSVersion)\n{\n\tif (FilePath.IsEmpty())\n\t\treturn false;\n\n\tTArray<FString> FileLines;\n\tif (!FFileHelper::LoadFileToStringArray(FileLines, *FilePath))\n\t\treturn false;\n\n\tFString Name, VersionID;\n\tfor (const FString& Line : FileLines)\n\t{\n\t\tif (Line.IsEmpty())\n\t\t\tcontinue;\n\n\t\tTArray<FString> LineParts;\n\t\tif (Line.ParseIntoArray(LineParts, TEXT(\"=\"), true) != 2)\n\t\t\tcontinue;\n\n\t\tif (LineParts[0] == TEXT(\"NAME\"))\n\t\t\tName = LineParts[1].Replace(TEXT(\"\\\"\"), TEXT(\"\"));\n\t\telse if (LineParts[0] == TEXT(\"VERSION_ID\"))\n\t\t\tVersionID = LineParts[1].Replace(TEXT(\"\\\"\"), TEXT(\"\"));\n\t}\n\n\tif (!Name.IsEmpty() && !VersionID.IsEmpty())\n\t{\n\t\tOutOSVersion = Name + \" \" + VersionID;\n\t\treturn true;\n\t}\n\n\treturn false;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFSoOperatingSystemInfo USoPlatformHelper::GetOperatingSystemInfo()\n{\n\tFSoOperatingSystemInfo Info;\n\n\t// NOTE: Linux special support was added because it does not have support from the engine\n#if PLATFORM_LINUX\n\tstruct utsname UnameData;\n\tif (uname(&UnameData) == 0)\n\t{\n\t\tconst FString sysname(UTF8_TO_TCHAR(UnameData.sysname));\n\t\tconst FString version(UTF8_TO_TCHAR(UnameData.version));\n\n\t\t/// Ignore data after \"-\", since it could identify a system (self compiled kernels).\n\t\tFString release(UTF8_TO_TCHAR(UnameData.release));\n\t\tTArray<FString> ReleaseParts;\n\t\tif (release.ParseIntoArray(ReleaseParts, TEXT(\"-\"), true) > 0)\n\t\t\trelease = ReleaseParts[0];\n\n\n\t\tInfo.OSMajor = sysname + \" \" + release;\n\t\tInfo.OSMinor = version;\n\t}\n\n\t// Fill OSVersion from https://www.freedesktop.org/software/systemd/man/os-release.html\n\t// First try the standard /etc/os-release. Then check for older versions\n\t// Could check for older versions, but meh\n\t// https://github.com/supertuxkart/stk-code/blob/master/src/config/hardware_stats.cpp#L172\n\tif (!ReadEtcReleaseFile(TEXT(\"/etc/os-release\"), Info.OSVersion))\n\t\tReadEtcReleaseFile(TEXT(\"/etc/redhat-release\"), Info.OSVersion);\n\n\tif (Info.OSVersion.IsEmpty())\n\t{\n\t\tInfo.OSVersion = TEXT(\"Linux unknown\");\n\t}\n#else\n\tFPlatformMisc::GetOSVersions(Info.OSMajor, Info.OSMinor);\n\tInfo.OSVersion = FPlatformMisc::GetOSVersion();\n#endif\n\n\tInfo.bIs64Bits = FPlatformMisc::Is64bitOperatingSystem();\n\treturn Info;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFString USoPlatformHelper::ToStringPlatformContext()\n{\n\t// Add Info about the system\n\tconst FSoEngineInfo& EngineInfo = GetUnrealEngineInfo();\n\tconst FSoOperatingSystemInfo OSInfo = GetOperatingSystemInfo();\n\tconst FSoCPUInfo CPUInfo = GetCPUInfo();\n\tconst FSoGPUInfo GPUInfo = GetGPUInfo();\n\tconst FSoPlatformMemoryInfo MemoryInfo = GetMemoryInfo();\n\n\tFString StringGameSettings = TEXT(\"COULD NOT RETRIEVE GAME SETTINGS\");\n\tif (const auto* GameSettings = USoGameSettings::GetInstance())\n\t\tStringGameSettings = GameSettings->ToString();\n\n\tconst FString CommandLine = FCommandLine::IsInitialized() ? FCommandLine::GetOriginalForLogging() : TEXT(\"\");\n\tconst FString Output = FString::Printf(\n\t\tTEXT(\"GAME Build version = %s, Branch = %s, Commit = %s\\n\")\n\t\tTEXT(\"GameRootPath = %s\"),\n\t\tTEXT(\"UserName = `%s`\\n\")\n\t\tTEXT(\"DefaultLocale = `%s`\\n\")\n\t\tTEXT(\"CommandLine = `%s`\\n\")\n\t\tTEXT(\"\\n%s\\n\") TEXT(\"\\n%s\\n\")\n\t\tTEXT(\"\\n%s\\n\") TEXT(\"\\n%s\\n\")\n\t\tTEXT(\"\\n%s\\n\") TEXT(\"\\n%s\\n\")\n\t\tTEXT(\"\\n%s\\n\"),\n\t\t*GetGameBuildVersion(), *GetGameBuildBranch(), *GetGameBuildCommit(),\n\t\t*GetGameRootPath(),\n\t\tFPlatformProcess::UserName(),\n\t\t*FPlatformMisc::GetDefaultLocale(),\n\t\t*CommandLine,\n\t\t*USoPlatformHelper::ToStringCompileFlags(), *EngineInfo.ToString(),\n\t\t*OSInfo.ToString(), *CPUInfo.ToString(),\n\t\t*GPUInfo.ToString(), *MemoryInfo.ToString(),\n\t\t*StringGameSettings\n\t);\n\n\treturn Output;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoPlatformHelper::WarnIfGPUIsBlacklisted()\n{\n#if PLATFORM_DESKTOP\n\tconst bool bNoGPUBlacklistBox = FParse::Param(FCommandLine::Get(), TEXT(\"NoGPUBlacklistBox\"));\n\n\tconst FSoGPUInfo GPUInfo = GetGPUInfo();\n\tFString BlacklistedGPUName;\n\n\t// NOTE: don't use the DesktopGPUAdapter because on dual graphics this will be false positive\n\tif (USoGameSingleton::IsBlacklistedGPUName(GPUInfo.RenderingGPUAdapter))\n\t{\n\t\tBlacklistedGPUName = GPUInfo.RenderingGPUAdapter;\n\t}\n\tif (!BlacklistedGPUName.IsEmpty())\n\t{\n\t\tconst FString Message = FString::Printf(\n\t\t\tTEXT(\"Your GPU = %s is not supported because it is under the minimum requirements.\\n\\nSome things might not work!\\n\\nHere be dragons!!!\"),\n\t\t\t*BlacklistedGPUName\n\t\t);\n\n\t\tUE_LOG(LogSoPlatformHelper, Warning, TEXT(\"%s\"), *Message);\n\n\t\t// Do not display message because if user said not to display it or if we are in steam big picture mode\n\t\tif (!bNoGPUBlacklistBox && !IsSteamBigPicture())\n\t\t\tFPlatformMisc::MessageBoxExt(EAppMsgType::Ok, *Message, TEXT(\"Your GPU is not supported!!!\"));\n\t}\n#endif // PLATFORM_DESKTOP\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFSoCPUInfo USoPlatformHelper::GetCPUInfo()\n{\n\tFSoCPUInfo Info;\n\tInfo.CPUPhysicalCores = FPlatformMisc::NumberOfCores();\n\tInfo.CPULogicalCores = FPlatformMisc::NumberOfCoresIncludingHyperthreads();\n\tInfo.CPUVendor = FPlatformMisc::GetCPUVendor();\n\tInfo.CPUBrand = FPlatformMisc::GetCPUBrand();\n\tInfo.CPUInfo = FPlatformMisc::GetCPUInfo();\n\treturn Info;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFSoGPUInfo USoPlatformHelper::GetGPUInfo()\n{\n\tFSoGPUInfo Info;\n\tInfo.GPUVendorID = GRHIVendorId;\n\tInfo.GPUDeviceID = GRHIDeviceId;\n\tInfo.GPUDeviceRevision = GRHIDeviceRevision;\n\tInfo.DesktopGPUAdapter = FPlatformMisc::GetPrimaryGPUBrand();\n\tInfo.RenderingGPUAdapter = GRHIAdapterName;\n\tInfo.AdapterInternalDriverVersion = GRHIAdapterInternalDriverVersion;\n\tInfo.AdapterUserDriverVersion = GRHIAdapterUserDriverVersion;\n\tInfo.AdapterDriverDate = GRHIAdapterDriverDate;\n\treturn Info;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFSoPlatformMemoryInfo USoPlatformHelper::GetMemoryInfo()\n{\n\tFSoPlatformMemoryInfo Info;\n\tconst FPlatformMemoryStats RAMStats = FPlatformMemory::GetStats();\n\tInfo.RAMAvailablePhysicalMB = USoMathHelper::BytesToMegaBytes(RAMStats.AvailablePhysical);\n\tInfo.RAMAvailableVirtualMB = USoMathHelper::BytesToMegaBytes(RAMStats.AvailableVirtual);\n\tInfo.RAMUsedPhysicalMB = USoMathHelper::BytesToMegaBytes(RAMStats.UsedPhysical);\n\tInfo.RAMPeakUsedPhysicalMB = USoMathHelper::BytesToMegaBytes(RAMStats.PeakUsedPhysical);\n\tInfo.RAMUsedVirtualMB = USoMathHelper::BytesToMegaBytes(RAMStats.UsedVirtual);\n\tInfo.RAMPeakUsedVirtualMB = USoMathHelper::BytesToMegaBytes(RAMStats.PeakUsedVirtual);\n\n\tInfo.GPUTextureMemoryMB = USoMathHelper::KiloBytesToMegaBytes(GCurrentTextureMemorySize);\n\tInfo.GPURenderTargetMemoryMB = USoMathHelper::KiloBytesToMegaBytes(GCurrentRendertargetMemorySize);\n\tInfo.GPUPoolSizeVRAMPercentage = GPoolSizeVRAMPercentage;\n\n\treturn Info;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoPlatformHelper::HasFixedResolution()\n{\n\treturn FPlatformProperties::HasFixedResolution();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoPlatformHelper::HasFixedVSync()\n{\n\tif (!GConfig)\n\t\treturn false;\n\n\t// See UGameUserSettings::ApplyNonResolutionSettings\n\t// Basically this means that if you have in ConfigSection of your Engine.ini (and its overrides) r.VSync=<value> you can't override it at runtime\n\t// Also because ECVF_SetBySystemSettingsIni > ECVF_SetByGameSetting for the VSync console variable\n\tconst FString ConfigSection = GIsEditor ? TEXT(\"SystemSettingsEditor\") : TEXT(\"SystemSettings\");\n\n\tint32 VSyncValue = 0;\n\treturn GConfig->GetInt(*ConfigSection, TEXT(\"r.Vsync\"), VSyncValue, GEngineIni);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoPlatformHelper::SupportsWindowedMode()\n{\n\treturn FPlatformProperties::SupportsWindowedMode();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoPlatformHelper::SupportsQuit()\n{\n\treturn FPlatformProperties::SupportsQuit();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFString USoPlatformHelper::GetPlatformName()\n{\n\treturn FPlatformProperties::IniPlatformName();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoPlatformHelper::HasWeakHardware()\n{\n\treturn HasFixedWeakHardware() || USoGameSettings::Get().IsWeakHardwareOptimizationForced();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nESoXboxOneConsoleType USoPlatformHelper::GetXboxOneConsoleType()\n{\n#if PLATFORM_XBOXONE\n\tswitch (FXboxOneMisc::GetConsoleType())\n\t{\n\tcase EXboxOneConsoleType::XboxOne:\n\t\treturn ESoXboxOneConsoleType::XboxOne;\n\tcase EXboxOneConsoleType::XboxOneS:\n\t\treturn ESoXboxOneConsoleType::XboxOneS;\n\tcase EXboxOneConsoleType::Scorpio:\n\t\treturn ESoXboxOneConsoleType::XboxOneX;\n\tdefault:\n\t\treturn ESoXboxOneConsoleType::Invalid;\n\t}\n#endif // PLATFORM_XBOXONE\n\n\treturn ESoXboxOneConsoleType::Invalid;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nconst FString& USoPlatformHelper::ToStringCompileFlags()\n{\n\tstatic const FString Output = FString::Printf(\n\t\tTEXT(\"Compiled flags:\\n\")\n\t\tTEXT(\"\\tWARRIORB_NON_EDITOR_TEST = %d, WARRIORB_NON_EDITOR_COLLECT_ANALYTICS_TEST = %d\\n\")\n\t\tTEXT(\"\\tWITH_EDITOR = %d, WARRIORB_WITH_EDITOR = %d\\n\")\n\n\t\tTEXT(\"\\tWARRIORB_WITH_ANALYTICS = %d, WARRIORB_WITH_GAMEANALYTICS = %d, WARRIORB_COLLECT_ANALYTICS = %d\\n\")\n\t\tTEXT(\"\\tWARRIORB_WITH_ONLINE = %d, WARRIORB_DEMO = %d\\n\")\n\t\tTEXT(\"\\tWARRIORB_WITH_STEAM = %d, WARRIORB_STEAM_APP_ID = %d, WARRIORB_RELAUNCH_IN_STEAM = %d\\n\")\n\t\tTEXT(\"\\tWARRIORB_WITH_DISCORD = %d, WARRIORB_DISCORD_CLIENT_ID = %lld\\n\")\n\t\tTEXT(\"\\tWARRIORB_WITH_SDL2 = %d, WARRIORB_USE_ASUS_AURA_SDK = %d\\n\")\n\n\t\tTEXT(\"\\tWARRIORB_USE_CHARACTER_SHADOW = %d, WARRIORB_USE_UNREAL_SAVE_SYSTEM = %d, WARRIORB_USE_ARROW_PRESET_AS_DEFAULT = %d, WARRIORB_ALLOW_CONSOLE_CHEATS_DEFAULT = %d\\n\")\n\t\tTEXT(\"\\tWARRIORB_WITH_VIDEO_DEMO = %d, WARRIORB_WITH_VIDEO_INTRO= = %d\\n\")\n\n\t\tTEXT(\"\\tALLOW_DEBUG_FILES = %d, ALLOW_CONSOLE = %d, NO_LOGGING = %d\\n\")\n\t\tTEXT(\"\\tSTATS = %d, FORCE_USE_STATS = %d\\n\")\n\t\tTEXT(\"\\tDO_CHECK = %d, USE_LOGGING_IN_SHIPPING = %d, USE_CHECKS_IN_SHIPPING= %d, ALLOW_CONSOLE_IN_SHIPPING = %d\\n\"),\n\n\t\tWARRIORB_NON_EDITOR_TEST, WARRIORB_NON_EDITOR_COLLECT_ANALYTICS_TEST,\n\t\tWITH_EDITOR, WARRIORB_WITH_EDITOR,\n\n\t\tWARRIORB_WITH_ANALYTICS, WARRIORB_WITH_GAMEANALYTICS, WARRIORB_COLLECT_ANALYTICS,\n\t\tWARRIORB_WITH_ONLINE, WARRIORB_DEMO,\n\t\tWARRIORB_WITH_STEAM, GetSteamAppID(WARRIORB_DEMO), WARRIORB_RELAUNCH_IN_STEAM,\n\t\tWARRIORB_WITH_DISCORD, GetDiscordClientID(WARRIORB_DEMO),\n\t\tWARRIORB_WITH_SDL2, WARRIORB_USE_ASUS_AURA_SDK,\n\n\t\tWARRIORB_USE_CHARACTER_SHADOW, WARRIORB_USE_UNREAL_SAVE_SYSTEM, WARRIORB_USE_ARROW_PRESET_AS_DEFAULT, WARRIORB_ALLOW_CONSOLE_CHEATS_DEFAULT,\n\t\tWARRIORB_WITH_VIDEO_DEMO, WARRIORB_WITH_VIDEO_INTRO,\n\n\t\tALLOW_DEBUG_FILES, ALLOW_CONSOLE, NO_LOGGING,\n\t\tSTATS, FORCE_USE_STATS,\n\t\tDO_CHECK, USE_LOGGING_IN_SHIPPING, USE_CHECKS_IN_SHIPPING, ALLOW_CONSOLE_IN_SHIPPING\n\t);\n\treturn Output;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nconst FString& USoPlatformHelper::GetGameBuildVersion()\n{\n#ifndef WARRIORB_BUILD_VERSION\n#error \"WARRIORB_BUILD_VERSION is not set in the SOrb.Build.cs file\"\n#endif // !WARRIORB_BUILD_VERSION\n\n\tstatic const FString BuildVersion(TEXT(WARRIORB_BUILD_VERSION));\n#if WITH_EDITOR\n\tstatic FString FinalBuildVersion = BuildVersion + TEXT(\" Editor\");\n#else\n\tstatic FString FinalBuildVersion = BuildVersion;\n#endif\n\n\treturn FinalBuildVersion;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nconst FString& USoPlatformHelper::GetGameBuildBranch()\n{\n#ifndef WARRIORB_BUILD_BRANCH\n#error \"WARRIORB_BUILD_BRANCH is not set in the SOrb.Build.cs file\"\n#endif // !WARRIORB_BUILD_BRANCH\n\n\tstatic const FString BuildBranch(TEXT(WARRIORB_BUILD_BRANCH));\n\treturn BuildBranch;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nconst FString& USoPlatformHelper::GetGameBuildCommit()\n{\n#ifndef WARRIORB_BUILD_COMMIT\n#error \"WARRIORB_BUILD_COMMIT is not set in the SOrb.Build.cs file\"\n#endif // !WARRIORB_BUILD_COMMIT\n\n\tstatic const FString BuildCommit(TEXT(WARRIORB_BUILD_COMMIT));\n\treturn BuildCommit;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFString USoPlatformHelper::GetGameBuildAll()\n{\n\treturn FString::Printf(TEXT(\"%s - %s (%s)\"), *GetGameBuildVersion(), *GetGameBuildCommit(), *GetGameBuildBranch());\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoPlatformHelper::InitializedSteam()\n{\n#if WARRIORB_WITH_STEAM\n\treturn UNYSteamHelper::Initialize(GetSteamAppID(IsDemo()), WARRIORB_RELAUNCH_IN_STEAM);\n#else\n\treturn false;\n#endif\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFString USoPlatformHelper::GetCurrentSteamAppID()\n{\n#if WARRIORB_WITH_STEAM\n\tINYSteamSubsystemPtr Subsystem = INotYetSteamModule::Get().GetSteamSubsystem();\n\tif (Subsystem.IsValid())\n\t\treturn Subsystem->GetAppIDAsString();\n\n\treturn TEXT(\"STEAM NOT OPENED\");\n#else\n\treturn TEXT(\"DISABLED\");\n#endif\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFString USoPlatformHelper::GetSteamCurrentGameLanguage()\n{\n#if WARRIORB_WITH_STEAM\n\tINYSteamSubsystemPtr Subsystem = INotYetSteamModule::Get().GetSteamSubsystem();\n\tif (Subsystem.IsValid())\n\t\treturn Subsystem->GetCurrentGameLanguage();\n\n\treturn TEXT(\"\");\n#else\n\treturn TEXT(\"DISABLED\");\n#endif\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoPlatformHelper::IsSteamInitialized()\n{\n#if WARRIORB_WITH_STEAM\n\tINYSteamSubsystemPtr Subsystem = INotYetSteamModule::Get().GetSteamSubsystem();\n\tif (Subsystem.IsValid())\n\t\treturn Subsystem->IsEnabled();\n#endif\n\treturn false;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoPlatformHelper::OpenSteamOverlayToStore(uint32 AppID, bool bAddToCart, bool bShowCart)\n{\n#if WARRIORB_WITH_STEAM\n\tINYSteamSubsystemPtr Subsystem = INotYetSteamModule::Get().GetSteamSubsystem();\n\tif (Subsystem.IsValid())\n\t\treturn Subsystem->GetExternalUI()->ActivateGameOverlayToStore(AppID, bAddToCart, bShowCart);\n#endif\n\treturn false;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoPlatformHelper::IsSteamBigPicture()\n{\n\t// https://partner.steamgames.com/doc/features/steam_controller/getting_started_for_devs\n\treturn FPlatformMisc::GetEnvironmentVariable(TEXT(\"SteamTenfoot\")).Len() > 0;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFString USoPlatformHelper::GetGameRootPath()\n{\n\t{\n\t\tconst FString BaseDirPath = FPlatformProcess::BaseDir();\n\t\tconst FString EnginePath = BaseDirPath / TEXT(\"../../../Engine/Binaries/\");\n\t\tif (FPaths::DirectoryExists(EnginePath))\n\t\t{\n\t\t\tFString GameRootPath = BaseDirPath / TEXT(\"../../../\");\n\t\t\tFPaths::CollapseRelativeDirectories(GameRootPath);\n\t\t\treturn GameRootPath;\n\t\t}\n\t}\n\n\t// UE_LOG(LogSoPlatformHelper, Error, TEXT(\"GetPackagedGameRootPath: BaseDirPath = %s ||  LaunchDirPath = %s\"), *BaseDirPath, *LaunchDirPath);\n\t//\n\t// // Ran the launcher binary\n\t// const FString LaunchDirPath = FPaths::LaunchDir();\n\t//\n\t// // Ran directly the binary\n\t// if (FPaths::DirectoryExists(LaunchDirPath / TEXT(\"../../../Engine/Binaries/\")))\n\t// \treturn LaunchDirPath / TEXT(\"../../../\");\n\t//\n\t// // In root already\n\t// if (FPaths::DirectoryExists(LaunchDirPath / TEXT(\"Engine/Binaries/\")))\n\t// \treturn LaunchDirPath;\n\n\treturn TEXT(\"\");\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoPlatformHelper::IsSteamBuildPirated()\n{\n\t// Cache\n\tstatic bool bIsSet = false;\n\tstatic bool bIsPirated = false;\n\tif (bIsSet)\n\t\treturn bIsPirated;\n\n#if WARRIORB_STEAM_CHECK_IF_LIBRARY_CHECKSUM_MATCHES\n\tbool bPathIsPirated = false;\n\tbool bHashIsPirated = false;\n\n\t// Try path\n\tconst FString EngineSteamWorksPath = GetGameRootPath() / TEXT(\"Engine/Binaries/ThirdParty/Steamworks/Steamv139/Win64/\");\n\tif (FPaths::DirectoryExists(EngineSteamWorksPath))\n\t{\n\t\t// UE_LOG(LogSoPlatformHelper, Log, TEXT(\"IsSteamBuildPirated: EngineSteamWorksPath = %s\"), *EngineSteamWorksPath);\n\t\tTArray<FString> Files;\n\t\tFFileManagerGeneric::Get().FindFiles(Files, *EngineSteamWorksPath, nullptr);\n\t\tfor (int32 Index = 0; Index < Files.Num(); Index++)\n\t\t{\n\t\t\t//UE_LOG(LogSoPlatformHelper, Log, TEXT(\"IsSteamBuildPirated: File = %s\"), *Files[Index]);\n\t\t\tif (Files[Index].Equals(TEXT(\"steam_api64.cdx\"), ESearchCase::IgnoreCase))\n\t\t\t{\n\t\t\t\tbPathIsPirated = true;\n\t\t\t}\n\t\t\tif (Files[Index].Equals(TEXT(\"steam_emu.ini\"), ESearchCase::IgnoreCase))\n\t\t\t{\n\t\t\t\tbPathIsPirated = true;\n\t\t\t}\n\t\t}\n\n\t\t// This does not work because they hook some shit onto us\n\t\t// if (FPaths::FileExists(EngineSteamWorksPath / TEXT(\"steam_api64.cdx\")))\n\t\t// {\n\t\t// \tUE_LOG(LogSoPlatformHelper, Log, TEXT(\"IsSteamBuildPirated: steam_api64.cdx\"));\n\t\t// \tbPathIsPirated = true;\n\t\t// }\n\t\t// else if (FPaths::FileExists(EngineSteamWorksPath / TEXT(\"steam_emu.ini\")))\n\t\t// {\n\t\t// \tUE_LOG(LogSoPlatformHelper, Log, TEXT(\"IsSteamBuildPirated: steam_emu.ini\"));\n\t\t// \tbPathIsPirated = true;\n\t\t// }\n\t}\n\n\t// Try Hash\n\tstatic const FString SteamLibraryWindowsAPI64Sha1Sum(TEXT(WARRIORB_STEAM_LIBRARY_WINDOWS_API64_SHA1_SUM));\n\tif (!SteamLibraryWindowsAPI64Sha1Sum.IsEmpty())\n\t{\n\t\tconst FString CurrentHashSum = UNYSteamHelper::GetDllAPI64Sha1Sum();\n\t\tif (!CurrentHashSum.IsEmpty())\n\t\t{\n\t\t\t//UE_LOG(LogSoPlatformHelper, Log, TEXT(\"IsSteamBuildPirated: CurrentHashSum = %s\"), *CurrentHashSum);\n\t\t\tbHashIsPirated = !SteamLibraryWindowsAPI64Sha1Sum.Equals(CurrentHashSum, ESearchCase::IgnoreCase);\n\t\t}\n\t}\n\n\tbIsSet = true;\n\tbIsPirated = bPathIsPirated || bHashIsPirated;\n#else\n\tbIsSet = true;\n\tbIsPirated = false;\n#endif\n\n\treturn bIsPirated;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoPlatformHelper::PrintAllAssets()\n{\n\tFAssetRegistryModule& AssetRegistryModule = FModuleManager::LoadModuleChecked<FAssetRegistryModule>(AssetRegistryName);\n\tTArray<FAssetData> Assets;\n\n\tAssetRegistryModule.Get().GetAllAssets(Assets, false);\n\n\tGLog->Log(TEXT(\"\\n\\nAllAssets:\\n\\n\"));\n\tfor (const FAssetData& Asset : Assets)\n\t{\n\t\tGLog->Logf(TEXT(\"%s\"), *Asset.ObjectPath.ToString());\n\t}\n\tGLog->Log(TEXT(\"\\n\\nEND AllAssets\\n\\n\"));\n\tGLog->Flush();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoPlatformHelper::PrintAllAssetsMaps()\n{\n\tFAssetRegistryModule& AssetRegistryModule = FModuleManager::LoadModuleChecked<FAssetRegistryModule>(AssetRegistryName);\n\tTArray<FAssetData> Assets;\n\n\tAssetRegistryModule.Get().GetAssetsByClass(UWorld::StaticClass()->GetFName(), Assets, true);\n\n\tGLog->Log(TEXT(\"\\n\\nMaps AllAssets:\\n\\n\"));\n\tfor (const FAssetData& Asset : Assets)\n\t{\n\t\tGLog->Logf(TEXT(\"%s\"), *Asset.ObjectPath.ToString());\n\t}\n\tGLog->Log(TEXT(\"\\n\\nEND Maps AllAssets\\n\\n\"));\n\tGLog->Flush();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFString USoPlatformHelper::GetFirstGamepadName()\n{\n#if WARRIORB_WITH_SDL2\n\t// If only one and remapping software running we can be sure this is the one?\n\t// Maybe this is not such a great idea what if the user has an xbox controller connected but the remapping software is runningn\n\tif (NumGamepads() == 1 && UNYSDL2_GamepadHelper::IsPS4RemapperRunning())\n\t{\n\t\treturn TEXT(\"PS4 Remapping software running\");\n\t}\n\n\treturn UNYSDL2_GamepadHelper::GetFirstGamepadName();\n#else\n\treturn GetGamepadName(INDEX_NONE);\n#endif // WARRIORB_WITH_SDL2\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFString USoPlatformHelper::GetGamepadName(int32 JoystickIndex)\n{\n#if WARRIORB_WITH_SDL2\n\t// If only one and remapping software running we can be sure this is the one?\n\t// Maybe this is not such a great idea what if the user has an xbox controller connected but the remapping software is runningn\n\tif (NumGamepads() == 1 && UNYSDL2_GamepadHelper::IsPS4RemapperRunning())\n\t{\n\t\treturn TEXT(\"PS4 Remapping software running\");\n\t}\n\n\treturn UNYSDL2_GamepadHelper::GetGamepadName(JoystickIndex);\n#elif PLATFORM_XBOXONE\n\treturn TEXT(\"XboxOne Controller\");\n#elif PLATFORM_SWITCH\n\treturn TEXT(\"Switch Controller\");\n#else\n\treturn TEXT(\"Unknown\");\n#endif // WARRIORB_WITH_SDL2\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nESoGamepadLayoutType USoPlatformHelper::GetGamepadLayoutTypeFromName(const FString& GamepadName)\n{\n\tif (GamepadName.Contains(TEXT(\"PS3\")) || GamepadName.Contains(TEXT(\"PS4\")))\n\t{\n\t\treturn ESoGamepadLayoutType::PlayStation;\n\t}\n\tif (GamepadName.Contains(TEXT(\"Switch\")))\n\t{\n\t\treturn ESoGamepadLayoutType::Switch;\n\t}\n\n\treturn ESoGamepadLayoutType::Xbox;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFString USoPlatformHelper::GamepadLayoutToString(ESoGamepadLayoutType Layout)\n{\n\tFString EnumValue;\n\tUSoStringHelper::ConvertEnumToString<ESoGamepadLayoutType>(TEXT(\"ESoGamepadLayoutType\"), Layout, false, EnumValue);\n\treturn EnumValue;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoPlatformHelper::IsJoystickIndexAGamepad(int32 JoystickIndex)\n{\n#if WARRIORB_WITH_SDL2\n\treturn UNYSDL2_GamepadHelper::IsJoystickIndexAGamepad(JoystickIndex);\n#else\n\t// NOTE: this ignores the input\n\treturn FSlateApplication::Get().IsGamepadAttached();\n#endif // WARRIORB_WITH_SDL2\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nint32 USoPlatformHelper::NumGamepads()\n{\n#if WARRIORB_WITH_SDL2\n\treturn UNYSDL2_GamepadHelper::NumGamepads();\n#else\n\t// NOTE: always reports either 0 or 1\n\treturn FSlateApplication::Get().IsGamepadAttached();\n#endif // WARRIORB_WITH_SDL2\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoPlatformHelper::PlayCameraShake(\n\tconst UObject* WorldContextObject, TSubclassOf<UCameraShake> Shake,\n\tfloat Scale, ECameraAnimPlaySpace::Type PlaySpace, FRotator UserPlaySpaceRot)\n{\n\tAPlayerController* PlayerController = USoStaticHelper::GetPlayerController(WorldContextObject);\n\tif (!PlayerController)\n\t\treturn;\n\n\tPlayerController->ClientPlayCameraShake(Shake, Scale, PlaySpace,UserPlaySpaceRot);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoPlatformHelper::PlayForceFeedback(\n\tconst UObject* WorldContextObject, UForceFeedbackEffect* ForceFeedbackEffect,\n\tFName Tag, bool bLooping, bool bIgnoreTimeDilation, bool bPlayWhilePaused)\n{\n\tif (!ForceFeedbackEffect)\n\t{\n\t\tUE_LOG(LogSoPlatformHelper, Error, TEXT(\"PlayForceFeedback: ForceFeedbackEffect == nullptr\"));\n\t\treturn;\n\t}\n\n\t// Disabled by settings\n\tif (!USoGameSettings::Get().IsVibrationEnabled())\n\t\treturn;\n\n\tAPlayerController* PlayerController = USoStaticHelper::GetPlayerController(WorldContextObject);\n\tif (!PlayerController)\n\t\treturn;\n\n\tFForceFeedbackParameters Params;\n\tParams.Tag = Tag;\n\tParams.bLooping = bLooping;\n\tParams.bIgnoreTimeDilation = bIgnoreTimeDilation;\n\tParams.bPlayWhilePaused = bPlayWhilePaused;\n\tPlayerController->ClientPlayForceFeedback(ForceFeedbackEffect, Params);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoPlatformHelper::SetForceFeedbackScale(const UObject* WorldContextObject, float NewValue)\n{\n\tAPlayerController* PlayerController = USoStaticHelper::GetPlayerController(WorldContextObject);\n\tif (!PlayerController)\n\t{\n\t\tUE_LOG(LogSoPlatformHelper, Error, TEXT(\"SetForceFeedbackScale: PlayerController == nullptr\"));\n\t\treturn;\n\t}\n\n\t// Values are the same, ignore\n\tif (FMath::IsNearlyEqual(PlayerController->ForceFeedbackScale, NewValue))\n\t\treturn;\n\n\tPlayerController->ForceFeedbackScale = NewValue;\n\tUE_LOG(LogSoPlatformHelper, Log, TEXT(\"SetForceFeedbackScale: NewValue = %f\"), PlayerController->ForceFeedbackScale);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nfloat USoPlatformHelper::GetForceFeedbackScale(const UObject* WorldContextObject)\n{\n\tAPlayerController* PlayerController = USoStaticHelper::GetPlayerController(WorldContextObject);\n\tif (!PlayerController)\n\t{\n\t\tUE_LOG(LogSoPlatformHelper, Error, TEXT(\"GetForceFeedbackScale: PlayerController == nullptr\"));\n\t\treturn USoGameSettings::DefaultVibrationScale;\n\t}\n\n\treturn PlayerController->ForceFeedbackScale;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoPlatformHelper::SetDisplayGamma(float NewGamma)\n{\n\tif (!GEngine)\n\t{\n\t\tUE_LOG(LogSoPlatformHelper, Error, TEXT(\"SetDisplayGamma: GEngine == nullptr\"));\n\t\treturn;\n\t}\n\n\t// Values are the same, ignore\n\tif (FMath::IsNearlyEqual(GEngine->DisplayGamma, NewGamma))\n\t\treturn;\n\n\tGEngine->DisplayGamma = NewGamma;\n\tUE_LOG(LogSoPlatformHelper, Log, TEXT(\"SetDisplayGamma: NewGamma = %f\"), GEngine->DisplayGamma);\n}\n\n/////////////////////////////////////////SetForceFeedbackScale///////////////////////////////////////////////////////////////////////////////\nfloat USoPlatformHelper::GetDisplayGamma()\n{\n\tif (!GEngine)\n\t{\n\t\tUE_LOG(LogSoPlatformHelper, Error, TEXT(\"GetDisplayGamma: GEngine == nullptr\"));\n\t\treturn USoGameSettings::DefaultBrightness;\n\t}\n\n\treturn GEngine->GetDisplayGamma();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nESoInputDeviceType USoPlatformHelper::GetHardcodedGamepadType()\n{\n#if PLATFORM_XBOXONE\n\treturn ESoInputDeviceType::Gamepad_Xbox;\n#elif PLATFORM_SWITCH\n\treturn ESoInputDeviceType::Gamepad_Switch;\n#elif PLATFORM_PS4\n\treturn ESoInputDeviceType::Gamepad_PlayStation;\n#else\n\treturn ESoInputDeviceType::Keyboard;\n#endif\n}\n\n#if PLATFORM_WINDOWS\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nTSharedPtr<FWindowsApplication> USoPlatformHelper::GetWindowsApplication()\n{\n\tif (FSlateApplication::IsInitialized())\n\t{\n\t\tTSharedPtr<GenericApplication> GenericApp = FSlateApplication::Get().GetPlatformApplication();\n\t\tif (GenericApp.IsValid())\n\t\t{\n\t\t\treturn StaticCastSharedPtr<FWindowsApplication>(GenericApp);\n\t\t}\n\t}\n\n\treturn nullptr;\n}\n\n#endif // PLATFORM_WINDOWS\n"
  },
  {
    "path": "Source/SOrb/Basic/Helpers/SoPlatformHelper.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#pragma once\n\n#include \"CoreMinimal.h\"\n#include \"Kismet/BlueprintFunctionLibrary.h\"\n#include \"Camera/CameraTypes.h\"\n\n#include \"SoPlatformHelper.generated.h\"\n\nstruct FDisplayMetrics;\nstruct FSoDisplayResolution;\nclass FAudioDevice;\nclass FWindowsApplication;\nclass IOnlineSubsystem;\nenum class ESoInputDeviceType : uint8;\nclass UForceFeedbackEffect;\nclass UCameraShake;\n\n// Information about the current engine version\nUSTRUCT(BlueprintType)\nstruct FSoEngineInfo\n{\n\tGENERATED_USTRUCT_BODY()\npublic:\n\tFString ToString() const;\n\npublic:\n\t/** The depot name, indicate where the executables and symbols are stored. */\n\tUPROPERTY(BlueprintReadOnly)\n\tFString DepotName;\n\n\t/** Product version, based on FEngineVersion. */\n\tUPROPERTY(BlueprintReadOnly)\n\tFString EngineVersion;\n};\n\n\n// Information about the current OS\nUSTRUCT(BlueprintType)\nstruct FSoOperatingSystemInfo\n{\n\tGENERATED_USTRUCT_BODY()\npublic:\n\tFString ToString() const;\n\npublic:\n\tUPROPERTY(BlueprintReadOnly)\n\tFString OSMajor;\n\n\tUPROPERTY(BlueprintReadOnly)\n\tFString OSMinor;\n\n\tUPROPERTY(BlueprintReadOnly)\n\tFString OSVersion;\n\n\tUPROPERTY(BlueprintReadOnly)\n\tbool bIs64Bits = false;\n};\n\n\n// Information about the current CPU\nUSTRUCT(BlueprintType)\nstruct FSoCPUInfo\n{\n\tGENERATED_USTRUCT_BODY()\npublic:\n\tFString ToString() const;\n\npublic:\n\t// Does not include hyper threading\n\tUPROPERTY(BlueprintReadOnly)\n\tint32 CPUPhysicalCores = 0;\n\n\t// Includes hyper threading\n\tUPROPERTY(BlueprintReadOnly)\n\tint32 CPULogicalCores = 0;\n\n\tUPROPERTY(BlueprintReadOnly)\n\tFString CPUVendor;\n\n\tUPROPERTY(BlueprintReadOnly)\n\tFString CPUBrand;\n\n\t/**\n\t * On x86(-64) platforms, uses cpuid instruction to get the CPU signature\n\t *\n\t *\tBits 0-3\tStepping ID\n\t *\tBits 4-7\tModel\n\t *\tBits 8-11\tFamily\n\t *\tBits 12-13\tProcessor type (Intel) / Reserved (AMD)\n\t *\tBits 14-15\tReserved\n\t *\tBits 16-19\tExtended model\n\t *\tBits 20-27\tExtended family\n\t *\tBits 28-31\tReserved\n\t */\n\tuint32 CPUInfo = 0;\n};\n\n\n// Information about the current CPU\nUSTRUCT(BlueprintType)\nstruct FSoGPUInfo\n{\n\tGENERATED_USTRUCT_BODY()\npublic:\n\tFString ToString() const;\n\npublic:\n\t// DirectX VendorId, 0 if not set\n\tuint32 GPUVendorID = 0;\n\n\tuint32 GPUDeviceID = 0;\n\n\tuint32 GPUDeviceRevision = 0;\n\n\t// e.g. \"NVIDIA GeForce GTX 680\" or \"AMD Radeon R9 200 / HD 7900 Series\"\n\tUPROPERTY(BlueprintReadOnly)\n\tFString DesktopGPUAdapter;\n\n\t// e.g. \"NVIDIA GeForce GTX 680\" or \"AMD Radeon R9 200 / HD 7900 Series\"\n\tUPROPERTY(BlueprintReadOnly)\n\tFString RenderingGPUAdapter;\n\n\t// e.g. \"15.200.1062.1004\"(AMD)\n\t// e.g. \"9.18.13.4788\"(NVIDIA) first number is Windows version (e.g. 7:Vista, 6:XP, 4:Me, 9:Win8(1), 10:Win7), last 5 have the UserDriver version encoded\n\t// also called technical version number (https://wiki.mozilla.org/Blocklisting/Blocked_Graphics_Drivers)\n\tUPROPERTY(BlueprintReadOnly)\n\tFString AdapterInternalDriverVersion;\n\n\t// e.g. \"Catalyst 15.7.1\"(AMD) or \"Crimson 15.7.1\"(AMD) or \"347.88\"(NVIDIA)\n\t// also called commercial version number (https://wiki.mozilla.org/Blocklisting/Blocked_Graphics_Drivers)\n\tUPROPERTY(BlueprintReadOnly)\n\tFString AdapterUserDriverVersion;\n\n\t// e.g. 3-13-2015\n\tUPROPERTY(BlueprintReadOnly)\n\tFString AdapterDriverDate;\n};\n\n\n// Information about the RAM and GPU memory\nUSTRUCT(BlueprintType)\nstruct FSoPlatformMemoryInfo\n{\n\tGENERATED_USTRUCT_BODY()\npublic:\n\tFString ToString() const;\n\npublic:\n\t/** The amount of physical memory currently available, in MegaBytes. */\n\tdouble RAMAvailablePhysicalMB = 0.f;\n\n\t/** The amount of virtual memory currently available, in MegaBytes. */\n\tdouble RAMAvailableVirtualMB = 0.f;\n\n\t/** The amount of physical memory used by the process, in MegaBytes. */\n\tdouble RAMUsedPhysicalMB = 0.f;\n\n\t/** The peak amount of physical memory used by the process, in MegaBytes. */\n\tdouble RAMPeakUsedPhysicalMB = 0.f;\n\n\t/** Total amount of virtual memory used by the process, in MegaBytes. */\n\tdouble RAMUsedVirtualMB = 0.f;\n\n\t/** The peak amount of virtual memory used by the process, in MegaBytes. */\n\tdouble RAMPeakUsedVirtualMB = 0.f;\n\n\t/** Amount of memory allocated by textures. In MegaBytes. */\n\tdouble GPUTextureMemoryMB = 0.f;\n\n\t/** Amount of memory allocated by rendertargets. In MegaBytes. */\n\tdouble GPURenderTargetMemoryMB = 0.f;\n\n\t/** In percent. If non-zero, the texture pool size is a percentage of GTotalGraphicsMemory. */\n\tUPROPERTY(BlueprintReadOnly)\n\tint32 GPUPoolSizeVRAMPercentage = 0;\n};\n\n// Corresponds to the one in XboxOneMisc.h\nUENUM(BlueprintType)\nenum class ESoXboxOneConsoleType : uint8\n{\n\tInvalid,\n\tXboxOne\t\tUMETA(DisplayName = \"Xbox One\"),\n\tXboxOneS \tUMETA(DisplayName = \"Xbox One S\"),\n\tXboxOneX \tUMETA(DisplayName = \"Xbox One X (Scorpio)\")\n};\n\n\nUENUM(BlueprintType)\nenum class ESoGamepadLayoutType : uint8\n{\n\tXbox = 0\t\tUMETA(DisplayName = \"Xbox\"),\n\tPlayStation\t\tUMETA(DisplayName = \"PlayStation\"),\n\tSwitch\t\t\tUMETA(DisplayName = \"Nintendo Switch\"),\n\n\tNum\t\t\t\tUMETA(Hidden)\n};\n\n\nUCLASS()\nclass SORB_API USoPlatformHelper : public UBlueprintFunctionLibrary\n{\n\tGENERATED_BODY()\npublic:\n\t// Prints error to all outputs possible\n\tstatic void PrintErrorToAll(const UObject* WorldContextObject, const FString& Message);\n\tstatic void PrintToAll(const UObject* WorldContextObject, const FString& Message);\n\n\t// Prints the message to the developer console\n\tstatic void PrintToConsole(const UObject* WorldContextObject, const FString& Message);\n\n\t// Prints the message to the screen for TimeToDisplaySeconds\n\tstatic void PrintToScreen(const FString& Message, float TimeToDisplaySeconds = 5.f, FColor DisplayColor = FColor::White);\n\n\t// Safer version of LaunchURL\n\t// Opens the specified URL in the platform's web browser of choice\n\tUFUNCTION(BlueprintCallable, Category = \">Platform\")\n\tstatic bool LaunchURL(const FString& URL, bool bCopyURLToClipboard = true);\n\n\t// Safe version of ExploreFolder\n\tUFUNCTION(BlueprintCallable, Category = \">Platform\")\n\tstatic bool ExploreFolder(const FString& FolderPath);\n\n\t// By default in non shipping and non editor builds GC verify is on\n\t// https://answers.unrealengine.com/questions/177892/game-hitches-gc-mark-time.html\n\t// We disable it by default if no command line flags are given\n\tstatic void DisableVerifyGC(bool bCheckForCommandLineOverrides = true);\n\n\t//\n\t// Disables/Enables all AI Logging\n\t// determines whether AI logging should be processed or not\n\t//\n\n\tstatic void SetIsAILoggingEnabled(bool bEnabled, bool bCheckForCommandLineOverrides);\n\tstatic void DisableAILogging(bool bCheckForCommandLineOverrides = true)\n\t{\n\t\tSetIsAILoggingEnabled(false, bCheckForCommandLineOverrides);\n\t}\n\tstatic void EnableAILogging(bool bCheckForCommandLineOverrides = true)\n\t{\n\t\tSetIsAILoggingEnabled(true, bCheckForCommandLineOverrides);\n\t}\n\n\t//\n\t// Disables/Enables all screen messages\n\t//\n\n\tstatic void SetAreScreenMessagesEnabled(bool bEnabled, bool bCheckForCommandLineOverrides);\n\tstatic void DisableScreenMessages(bool bCheckForCommandLineOverrides = true)\n\t{\n\t\tSetAreScreenMessagesEnabled(false, bCheckForCommandLineOverrides);\n\t}\n\tstatic void EnableScreenMessages(bool bCheckForCommandLineOverrides = true)\n\t{\n\t\tSetAreScreenMessagesEnabled(true, bCheckForCommandLineOverrides);\n\t}\n\n\t//\n\t// Disables/Enables Mouse support\n\t//\n\n\tstatic void SetIsMouseEnabled(const UObject* WorldContextObject, bool bEnabled);\n\tstatic void SetIsMouseAllowed(const UObject* WorldContextObject, bool bAllowed);\n\n\tUFUNCTION(BlueprintPure, Category = \">Mouse\", meta = (WorldContext = \"WorldContextObject\"))\n\tstatic bool IsMouseAllowed(const UObject* WorldContextObject);\n\n\tUFUNCTION(BlueprintCallable, Category = \">Mouse\", meta = (WorldContext = \"WorldContextObject\"))\n\tstatic void DisallowMouse(const UObject* WorldContextObject)\n\t{\n\t\tSetIsMouseAllowed(WorldContextObject, false);\n\t}\n\n\tUFUNCTION(BlueprintCallable, Category = \">Mouse\", meta = (WorldContext = \"WorldContextObject\"))\n\tstatic void AllowMouse(const UObject* WorldContextObject)\n\t{\n\t\tSetIsMouseAllowed(WorldContextObject, true);\n\t}\n\n\t//\n\t// Screen/Game\n\t//\n\n\t// Moves the game window to the default screen of the user\n\tstatic void MoveGameToDefaultMonitor();\n\n\t/**\n\t * Gets the list of support fullscreen resolutions.\n\t * @return true if successfully queried the device for available resolutions.\n\t */\n\tstatic bool GetSupportedFullscreenResolutions(TArray<FSoDisplayResolution>& OutResolutions);\n\n\t/**\n\t * Gets the list of windowed resolutions which are convenient for the current primary display size.\n\t * @return true if successfully queried the device for available resolutions.\n\t */\n\tstatic bool GetConvenientWindowedResolutions(TArray<FSoDisplayResolution>& OutResolutions);\n\n\t// Gets the refresh of all the displays as a set of ints\n\tstatic bool GetDisplaysRefreshRates(TSet<int32>& OutRefreshRates);\n\n\t// Gets info about all the displays\n\tstatic bool GetDisplaysMetrics(FDisplayMetrics& OutDisplayMetrics);\n\n\t/** Gets the AudioDevice from the world if it supports audio and it has an audio device. */\n\tstatic FAudioDevice* GetAudioDevice(const UObject* WorldContextObject);\n\n\t/**\n\t * Creates the folders for this FolderPath.\n\t * Can be a RootDirectory/Directory or RootDirectory/Directory/Somefile.txt\n\t * in Both cases it will create the RootDirectory/Directory path\n\t */\n\tstatic bool CreateDirectoryRecursively(const FString& FolderPath);\n\n\t// What it says, quits the game\n\tstatic void QuitGame(const UObject* WorldContextObject = nullptr);\n\n\t// Is the game in background?\n\tstatic bool IsGameInBackground(UObject* WorldContextObject = nullptr) { return !IsGameInForeground(WorldContextObject); }\n\n\t// Is the game in foreground, aka focused\n\tstatic bool IsGameInForeground(UObject* WorldContextObject = nullptr);\n\n\t// Sets the pause state of the game\n\tstatic bool SetGamePaused(const UObject* WorldContextObject, bool bPaused);\n\n\t// Returns the game's paused state\n\tstatic bool IsGamePaused(const UObject* WorldContextObject);\n\n\t// Sets the global time dilation\n\tstatic void SetGlobalTimeDilation(const UObject* WorldContextObject, float TimeDilation);\n\n\t// Gets the global time dilation\n\tstatic float GetGlobalTimeDilation(const UObject* WorldContextObject);\n\n\t// Are all game windows hidden?\n\tstatic bool AreAllGameWindowsHidden();\n\n\t// Gets the Unreal Engine version information\n\tstatic const FSoEngineInfo& GetUnrealEngineInfo();\n\n\t// Gets information about the operating system\n\tstatic FSoOperatingSystemInfo GetOperatingSystemInfo();\n\n\t//\n\t// Platform\n\t//\n\n\t// Helper method, to get all the info about the game that is not character related\n\tstatic FString ToStringPlatformContext();\n\n\t// Your GPU sucks\n\tstatic void WarnIfGPUIsBlacklisted();\n\n\t// Gets information about the CPU\n\tstatic FSoCPUInfo GetCPUInfo();\n\n\t// Gets information about the CPU\n\tstatic FSoGPUInfo GetGPUInfo();\n\n\t// Gets information about the memory\n\tstatic FSoPlatformMemoryInfo GetMemoryInfo();\n\n\t// Gets whether user settings should override the resolution or not\n\tstatic bool HasFixedResolution();\n\n\t// Gets whether user settings should override the VSync or not\n\t// Usually only true in editor and consoles (xbox, ps4, switch)\n\tstatic bool HasFixedVSync();\n\n\t// Gets whether this platform supports windowed mode rendering.\n\tstatic bool SupportsWindowedMode();\n\n\t// Whether the platform allows an application to quit to the OS\n\t// Apparently only false on Switch\n\tstatic bool SupportsQuit();\n\n\t// Returns the root of the packaged game\n\tstatic FString GetGameRootPath();\n\n\t/**\n\t * Returns the string name of the current platform, to perform different behavior based on platform.\n\t * (Platform names include Windows, Mac, IOS, Android, PS4, Switch, XboxOne, HTML5, Linux)\n\t */\n\tstatic FString GetPlatformName();\n\n\t// The platform has shit hardware\n\tUFUNCTION(BlueprintPure, Category = \">Platform\", DisplayName = \"Does Platform Has Weak Hardware\")\n\tstatic bool HasWeakHardware();\n\n\t// Some consoles has fixed\n\tstatic bool HasFixedWeakHardware()\n\t{\n\t\treturn IsSwitch()\n\t\t\t|| IsXboxOneConsoleType()\n\t\t\t|| IsXboxOneSConsoleType();\n\t}\n\n\tUFUNCTION(BlueprintPure, Category = \">Platform\", DisplayName = \"Is Platform Switch\")\n\tstatic bool IsSwitch() { return PLATFORM_SWITCH; }\n\n\tUFUNCTION(BlueprintPure, Category = \">Platform\", DisplayName = \"Is Platform Xbox One\")\n\tstatic bool IsXboxOne() { return PLATFORM_XBOXONE; }\n\n\tUFUNCTION(BlueprintPure, Category = \">Platform\", DisplayName = \"Is Platform Xbox One && Console == Xbox One\")\n\tstatic bool IsXboxOneConsoleType() { return GetXboxOneConsoleType() == ESoXboxOneConsoleType::XboxOne; }\n\n\tUFUNCTION(BlueprintPure, Category = \">Platform\", DisplayName = \"Is Platform Xbox One && Console == Xbox One S\")\n\tstatic bool IsXboxOneSConsoleType() { return GetXboxOneConsoleType() == ESoXboxOneConsoleType::XboxOneS; }\n\n\tUFUNCTION(BlueprintPure, Category = \">Platform\", DisplayName = \"Is Platform Xbox One && Console == Xbox One X\")\n\tstatic bool IsXboxOneXConsoleType() { return GetXboxOneConsoleType() == ESoXboxOneConsoleType::XboxOneX; }\n\n\tUFUNCTION(BlueprintPure, Category = \">Platform\")\n\tstatic ESoXboxOneConsoleType GetXboxOneConsoleType();\n\n\tUFUNCTION(BlueprintPure, Category = \">Platform\", DisplayName = \"Is Platform Linux\")\n\tstatic bool IsLinux() { return PLATFORM_LINUX; }\n\n\tUFUNCTION(BlueprintPure, Category = \">Platform\", DisplayName = \"Is Platform Windows\")\n\tstatic bool IsWindows() { return PLATFORM_WINDOWS; }\n\n\tUFUNCTION(BlueprintPure, Category = \">Platform\", DisplayName = \"Is Platform Mac\")\n\tstatic bool IsMac() { return PLATFORM_MAC; }\n\n\t//\n\t// Build\n\t//\n\n\t// Helper method to get the string of some compiled options like WITH_EDITOr and such, WITH_STATS\n\tstatic const FString& ToStringCompileFlags();\n\n\t// Gets the build version of this game (Warriorb) duh.\n\tUFUNCTION(BlueprintPure, Category = \">Build\")\n\tstatic const FString& GetGameBuildVersion();\n\n\t// Gets git branch\n\tUFUNCTION(BlueprintPure, Category = \">Build\")\n\tstatic const FString& GetGameBuildBranch();\n\n\t// Gets git commit hash\n\tUFUNCTION(BlueprintPure, Category = \">Build\")\n\tstatic const FString& GetGameBuildCommit();\n\n\t// Format: BuildVersion - BuildCommit BuildBanch\n\tUFUNCTION(BlueprintPure, Category = \">Build\")\n\tstatic FString GetGameBuildAll();\n\n\tUFUNCTION(BlueprintPure, Category = \">Build\")\n\tstatic bool IsDemo() { return WARRIORB_DEMO; }\n\n\t// The opposite of IsDemo\n\tUFUNCTION(BlueprintPure, Category = \">Build\")\n\tstatic bool IsNormalGame() { return !IsDemo(); }\n\n\t//\n\t// Steam\n\t//\n\n\tUFUNCTION(BlueprintPure, Category = \">Build\")\n\tstatic bool IsWithSteam() { return WARRIORB_WITH_STEAM; }\n\n\tstatic bool InitializedSteam();\n\n\t// NOTE: this returns a string in the format specified here https://partner.steamgames.com/doc/store/localization#8\n\tstatic FString GetSteamCurrentGameLanguage();\n\n\t// Queries current app\n\tstatic FString GetCurrentSteamAppID();\n\n\tUFUNCTION(BlueprintPure, Category = \">Steam\")\n\tstatic int32 GetSteamAppID(bool bDemo)\n\t{\n\t\treturn bDemo ? WARRIORB_STEAM_DEMO_APP_ID : WARRIORB_STEAM_APP_ID;\n\t}\n\n\tstatic bool IsSteamInitialized();\n\n\tstatic bool OpenSteamOverlayToStore(uint32 AppID, bool bAddToCart = false, bool bShowCart = false);\n\n\t// Seems kinda stupid because if you have the controller connected and you launch the game from the NON big\n\t// picture interface this will still report as true\n\tstatic bool IsSteamBigPicture();\n\n\t// NOTE: only works on windows and if the check is enabled\n\tUFUNCTION(BlueprintPure, Category = \">Steam\")\n\tstatic bool IsSteamBuildPirated();\n\n\t//\n\t// Discord\n\t//\n\n\tstatic int64 GetDiscordClientID(bool bDemo)\n\t{\n\t\treturn bDemo ? WARRIORB_DISCORD_DEMO_CLIENT_ID : WARRIORB_DISCORD_CLIENT_ID;\n\t}\n\n\t//\n\t// Assets\n\t//\n\n\tUFUNCTION(Exec)\n\tstatic void PrintAllAssets();\n\n\tUFUNCTION(Exec)\n\tstatic void PrintAllAssetsMaps();\n\n\t//\n\t// Keyboard\n\t//\n\n\tUFUNCTION(BlueprintPure, Category = \">AuraSDK\")\n\tstatic bool UseAsusAuraSDK() { return PLATFORM_WINDOWS && WARRIORB_USE_ASUS_AURA_SDK; }\n\n\t//\n\t// Camera\n\t//\n\n\t/**\n\t * Play Camera Shake\n\t * @param Shake - Camera shake animation to play\n\t * @param Scale - Scalar defining how \"intense\" to play the anim\n\t * @param PlaySpace - Which coordinate system to play the shake in (used for CameraAnims within the shake).\n\t * @param UserPlaySpaceRot - Matrix used when PlaySpace = CAPS_UserDefined\n\t */\n\tUFUNCTION(BlueprintCallable, Category=\">Camera\", meta = (WorldContext = \"WorldContextObject\"))\n\tstatic void PlayCameraShake(\n\t\tconst UObject* WorldContextObject,\n\t\tTSubclassOf<UCameraShake> Shake,\n\t\tfloat Scale = 1.f,\n\t\tECameraAnimPlaySpace::Type PlaySpace = ECameraAnimPlaySpace::CameraLocal,\n\t\tFRotator UserPlaySpaceRot = FRotator::ZeroRotator\n\t);\n\n\n\t//\n\t// Gamepad\n\t//\n\n\tstatic bool IsAnyGamepadConnected() { return NumGamepads() > 0; }\n\tstatic FString GetFirstGamepadName();\n\tstatic FString GetGamepadName(int32 JoystickIndex);\n\tstatic ESoGamepadLayoutType GetGamepadLayoutTypeFromName(const FString& GamepadName);\n\tstatic FString GamepadLayoutToString(ESoGamepadLayoutType Layout);\n\tstatic bool IsJoystickIndexAGamepad(int32 JoystickIndex);\n\tstatic int32 NumGamepads();\n\n\t// Does the current platform has a hard coded game controller\n\tstatic bool HasHardcodedGamepad()\n\t{\n\t\treturn PLATFORM_XBOXONE || PLATFORM_SWITCH || PLATFORM_PS4;\n\t}\n\n\t// Get the hard coded game controller type\n\tstatic ESoInputDeviceType GetHardcodedGamepadType();\n\n\t// Should we use the UI for console?\n\tUFUNCTION(BlueprintPure, Category = \">Platform\")\n\tstatic bool IsConsole()\n\t{\n\t\treturn PLATFORM_XBOXONE || PLATFORM_SWITCH || PLATFORM_PS4 || WARRIORB_CONSOLE_TEST;\n\t}\n\n\tUFUNCTION(BlueprintPure, Category = \">Platform\")\n\tstatic bool CanHaveKeyboard()\n\t{\n\t\tif (WARRIORB_NO_KEYBOARD_TEST)\n\t\t\treturn false;\n\n\t\treturn PLATFORM_DESKTOP || PLATFORM_XBOXONE;\n\t}\n\n\t//\n\t// Gamepad force feedback (aka vibration)\n\t//\n\n\t/**\n\t * Play a force feedback pattern on the player's controller\n\t * @param\tForceFeedbackEffect\t\tThe force feedback pattern to play\n\t * @param\tbLooping\t\t\t\tWhether the pattern should be played repeatedly or be a single one shot\n\t * @param\tbIgnoreTimeDilation\t\tWhether the pattern should ignore time dilation\n\t * @param\tbPlayWhilePaused\t\tWhether the pattern should continue to play while the game is paused\n\t * @param\tTag\t\t\t\t\t\tA tag that allows stopping of an effect.  If another effect with this Tag is playing, it will be stopped and replaced\n\t */\n\tUFUNCTION(BlueprintCallable, Category = \">Gamepad|ForceFeedback\", meta = (WorldContext = \"WorldContextObject\"))\n\tstatic void PlayForceFeedback(\n\t\tconst UObject* WorldContextObject,\n\t\tUForceFeedbackEffect* ForceFeedbackEffect,\n\t\tFName Tag = NAME_None,\n\t\tbool bLooping = false,\n\t\tbool bIgnoreTimeDilation = false,\n\t\tbool bPlayWhilePaused = false\n\t);\n\n\tstatic void SetForceFeedbackScale(const UObject* WorldContextObject, float NewValue);\n\tstatic float GetForceFeedbackScale(const UObject* WorldContextObject);\n\n\t//\n\t// Display Gamma\n\t//\n\n\tstatic void SetDisplayGamma(float NewGamma);\n\tstatic float GetDisplayGamma();\n\n\t//\n\t// OS specific\n\t//\n\n#if PLATFORM_WINDOWS\n\tstatic TSharedPtr<FWindowsApplication> GetWindowsApplication();\n#endif\n};\n"
  },
  {
    "path": "Source/SOrb/Basic/Helpers/SoStaticHelper.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#include \"SoStaticHelper.h\"\n\n#include \"EngineUtils.h\"\n#if WITH_EDITOR\n#include \"Editor.h\"\n#endif\n#include \"Components/SplineComponent.h\"\n#include \"Animation/AnimSequenceBase.h\"\n#include \"Animation/WidgetAnimation.h\"\n#include \"Misc/Paths.h\"\n#include \"Engine/EngineTypes.h\"\n\n#include \"DlgSystem/Public/IO/DlgConfigWriter.h\"\n#include \"DlgSystem/Public/DlgContext.h\"\n\n#include \"Basic/SoCollisionChannels.h\"\n#include \"Basic/SoGameMode.h\"\n#include \"Levels/SoLevelManager.h\"\n#include \"Character/SoCharacter.h\"\n#include \"SplineLogic/SoSplineWalker.h\"\n#include \"SplineLogic/SoSplinePointPtr.h\"\n#include \"Enemy/SoEnemy.h\"\n#include \"CharacterBase/SoCharacterMovementComponent.h\"\n#include \"Enemy/SoEnemySpawner.h\"\n#include \"Levels/SoLevelHelper.h\"\n#include \"Components/SkeletalMeshComponent.h\"\n#include \"Components/BoxComponent.h\"\n#include \"Basic/SoAudioManager.h\"\n#include <cwctype>\n\n#if WITH_EDITOR\n#include \"Engine/HLODProxy.h\"\n#endif\n\nconst FName USoStaticHelper::NameGold = FName(\"Gold\");\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nASoGameMode* USoStaticHelper::GetSoGameMode(const UObject* WorldContextObject)\n{\n\treturn ASoGameMode::GetInstance(WorldContextObject);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nASoGameMode* USoStaticHelper::GetSoGameModeFromContext(const UObject* Context)\n{\n\treturn GetSoGameMode(Context);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFSoTimerManager& USoStaticHelper::GetSoTimerManager(const UObject* WorldContextObject)\n{\n\treturn ASoGameMode::Get(WorldContextObject).GetTimerManager();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFName USoStaticHelper::GetNameFromActor(const UObject* WorldContextObject, FString PreFix)\n{\n\tif (WorldContextObject == nullptr)\n\t\treturn NAME_None;\n\n\tif (PreFix.Len() == 0)\n\t\treturn WorldContextObject->GetFName();\n\n\treturn FName(*(PreFix + WorldContextObject->GetName()));\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoStaticHelper::IsActorInPlay(const UObject* WorldContextObject)\n{\n\tif (const AActor* Actor = Cast<AActor>(WorldContextObject))\n\t\treturn Actor->HasActorBegunPlay();\n\n\treturn false;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nAPlayerController* USoStaticHelper::GetPlayerController(const UObject* WorldContextObject)\n{\n\tif (!GEngine || !WorldContextObject)\n\t\treturn nullptr;\n\n\tif (UWorld* World = GEngine->GetWorldFromContextObject(WorldContextObject, EGetWorldErrorMode::LogAndReturnNull))\n\t\treturn World->GetFirstPlayerController();\n\n\treturn nullptr;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nAActor* USoStaticHelper::GetPlayerCharacterAsActor(const UObject* WorldContextObject)\n{\n\tif (APlayerController* PlayerController = GetPlayerController(WorldContextObject))\n\t\treturn Cast<AActor>(PlayerController->GetPawn());\n\n\treturn nullptr;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nASoCharacter* USoStaticHelper::GetPlayerCharacterAsSoCharacter(const UObject* WorldContextObject)\n{\n\tif (APlayerController* PlayerController = GetPlayerController(WorldContextObject))\n\t\treturn Cast<ASoCharacter>(PlayerController->GetPawn());\n\n\treturn nullptr;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nASoCharacterBase* USoStaticHelper::GetPlayerCharacterAsSoCharacterBase(const UObject* WorldContextObject)\n{\n\tif (APlayerController* PlayerController = GetPlayerController(WorldContextObject))\n\t\treturn Cast<ASoCharacterBase>(PlayerController->GetPawn());\n\n\treturn nullptr;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nAActor* USoStaticHelper::GetPlayerCharacterAsNullptr(const UObject* WorldContextObject)\n{\n\t// good luck with this one\n\treturn nullptr;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nASoEnemy* USoStaticHelper::GetClosestEnemyToLocation(const UObject* WorldContextObject, const FVector& WorldLocation, float MaxDistance, bool bPreferFlying)\n{\n\tASoEnemy* Closest = nullptr;\n\tconst float MaxDistancePow2 = MaxDistance * MaxDistance;\n\tfloat BestDistancePow2 = MaxDistancePow2;\n\tbool bBestFlying = false;\n\tfor (TActorIterator<ASoEnemy> Itr(WorldContextObject->GetWorld()); Itr; ++Itr)\n\t{\n\t\tASoEnemy* Enemy = *Itr;\n\t\tif (Enemy != nullptr && !Enemy->IsPendingKill() && Enemy->IsAlive() && !Enemy->IsInAnotherDimension())\n\t\t{\n\t\t\tconst FName BoneName = Enemy->GetBoneToTarget();\n\t\t\tconst FVector TargetLocation = BoneName == NAME_None ? Enemy->GetActorLocation() : Enemy->GetMesh()->GetSocketLocation(BoneName);\n\n\t\t\tconst float DistancePow2 = (TargetLocation - WorldLocation).SizeSquared();\n\t\t\tif (bPreferFlying && DistancePow2 < MaxDistancePow2)\n\t\t\t{\n\t\t\t\tconst bool bFlying = Enemy->GetSoMovement()->DefaultLandMovementMode == EMovementMode::MOVE_Flying;\n\t\t\t\tif (bBestFlying == bFlying)\n\t\t\t\t{\n\t\t\t\t\tif (DistancePow2 < BestDistancePow2)\n\t\t\t\t\t{\n\t\t\t\t\t\tBestDistancePow2 = DistancePow2;\n\t\t\t\t\t\tClosest = Enemy;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tif (bFlying)\n\t\t\t\t\t{\n\t\t\t\t\t\tbBestFlying = true;\n\t\t\t\t\t\tBestDistancePow2 = DistancePow2;\n\t\t\t\t\t\tClosest = Enemy;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif (DistancePow2 < BestDistancePow2)\n\t\t\t\t{\n\t\t\t\t\tBestDistancePow2 = DistancePow2;\n\t\t\t\t\tClosest = Enemy;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn Closest;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nASoEnemy* USoStaticHelper::GetClosestEnemyInDirection(const UObject* WorldContextObject,\n\t\t\t\t\t\t\t\t\t\t\t\t\t  const FVector& WorldLocation,\n\t\t\t\t\t\t\t\t\t\t\t\t\t  float MaxDistance,\n\t\t\t\t\t\t\t\t\t\t\t\t\t  const FVector& Direction,\n\t\t\t\t\t\t\t\t\t\t\t\t\t  bool bOnlyMovable)\n{\n\tASoEnemy* Closest = nullptr;\n\tconst float MaxDistancePow2 = MaxDistance * MaxDistance;\n\tfloat BestDistancePow2 = MaxDistancePow2;\n\tfor (TActorIterator<ASoEnemy> Itr(WorldContextObject->GetWorld()); Itr; ++Itr)\n\t{\n\t\tASoEnemy* Enemy = *Itr;\n\t\tif (Enemy != nullptr && !Enemy->IsPendingKill() && Enemy->IsAlive() && (!bOnlyMovable || Enemy->CanBeMovedByPlayer()))\n\t\t{\n\t\t\tconst FName BoneName = Enemy->GetBoneToTarget();\n\t\t\tconst FVector TargetLocation = BoneName == NAME_None ? Enemy->GetActorLocation() : Enemy->GetMesh()->GetSocketLocation(BoneName);\n\n\t\t\tFVector SourceToTarget = TargetLocation - WorldLocation;\n\t\t\tconst float DistancePow2 = SourceToTarget.SizeSquared();\n\t\t\tif (DistancePow2 < BestDistancePow2)\n\t\t\t{\n\t\t\t\tSourceToTarget.Z = 0.0f;\n\t\t\t\tif ((Direction | SourceToTarget.GetSafeNormal()) >= 0.0f)\n\t\t\t\t{\n\t\t\t\t\tBestDistancePow2 = DistancePow2;\n\t\t\t\t\tClosest = Enemy;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn Closest;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoStaticHelper::GetEnemiesInRadius(const UObject* WorldContextObject, const FVector& WorldLocation, float Radius, TArray<ASoEnemy*>& Enemies)\n{\n\tASoEnemy* Closest = nullptr;\n\tconst float MaxDistancePow2 = Radius * Radius;\n\tfor (TActorIterator<ASoEnemy> Itr(WorldContextObject->GetWorld()); Itr; ++Itr)\n\t{\n\t\tASoEnemy* Enemy = *Itr;\n\t\tif (Enemy != nullptr && !Enemy->IsPendingKill() && Enemy->IsAlive() && !Enemy->IsSoPaused())\n\t\t{\n\t\t\tconst FName BoneName = Enemy->GetBoneToTarget();\n\t\t\tconst FVector TargetLocation = BoneName == NAME_None ? Enemy->GetActorLocation() : Enemy->GetMesh()->GetSocketLocation(BoneName);\n\t\t\tconst float DistancePow2 = (TargetLocation - WorldLocation).SizeSquared();\n\t\t\tif (DistancePow2 < MaxDistancePow2)\n\t\t\t\tEnemies.Add(Enemy);\n\t\t}\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoStaticHelper::GetPointOnBoxTopClosestToBone(FVector& OutLocation, const TArray<FName>& BoneList, USkeletalMeshComponent* Mesh, UBoxComponent* Box, float MaxAcceptedOffset)\n{\n\tif (Mesh == nullptr || Box == nullptr)\n\t\treturn false;\n\n\tconst FVector BoxCenter = Box->GetComponentLocation();\n\tconst FVector ScaledBoxExtend = Box->GetScaledBoxExtent();\n\n\tconst float ZLevel = BoxCenter.Z + ScaledBoxExtend.Z;\n\n\tconst FVector BoxForwardVector = Box->GetForwardVector();\n\tconst FVector BoxRightVector = Box->GetRightVector();\n\n\tconst FVector2D A = -FVector2D(BoxForwardVector) * ScaledBoxExtend.X - FVector2D(BoxRightVector) * ScaledBoxExtend.Y;\n\tconst FVector2D B = FVector2D(BoxForwardVector) * ScaledBoxExtend.X - FVector2D(BoxRightVector) * ScaledBoxExtend.Y;\n\t// const FVector2D C = FVector2D(BoxForwardVector) * ScaledBoxExtend.X + FVector2D(BoxRightVector) * ScaledBoxExtend.Y;\n\tconst FVector2D D = -FVector2D(BoxForwardVector) * ScaledBoxExtend.X + FVector2D(BoxRightVector) * ScaledBoxExtend.Y;\n\n\tconst FVector2D AB = B - A;\n\tconst FVector2D AD = D - A;\n\n\tFVector BestWorldLocation = BoxCenter;\n\tfloat BestDistance = BIG_NUMBER;\n\n\tfor (const FName Bone : BoneList)\n\t{\n\t\tconst FVector WorldLocation = Mesh->GetSocketLocation(Bone);\n\t\tconst FVector TranslatedWorldLocation = WorldLocation - BoxCenter;\n\t\tconst FVector2D TranslatedWorldLocation2D = FVector2D(TranslatedWorldLocation);\n\t\tconst FVector2D AM = TranslatedWorldLocation2D - A;\n\n\t\t// https://math.stackexchange.com/questions/190111/how-to-check-if-a-point-is-inside-a-rectangle/190373#190373\n\t\tconst float AMDotAB = AM | AB;\n\t\tconst float AMDotAD = AM | AB;\n\t\t// check if it is inside the rectangle\n\t\tif ((AMDotAB > 0.0f && AMDotAB < (AB | AB)) && (AMDotAD > 0.0f) && AMDotAD < (AD | AD))\n\t\t{\n\t\t\tconst float DistanceZ = fabs(WorldLocation.Z - ZLevel);\n\t\t\tif (DistanceZ < BestDistance)\n\t\t\t{\n\t\t\t\tBestDistance = DistanceZ;\n\t\t\t\tBestWorldLocation = WorldLocation;\n\t\t\t}\n\t\t}\n\t}\n\n\tif (BestDistance < MaxAcceptedOffset)\n\t{\n\t\tOutLocation = BestWorldLocation;\n\t\tOutLocation.Z = ZLevel;\n\t\treturn true;\n\t}\n\n\treturn false;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFSoSplinePoint USoStaticHelper::GetPlayerSplineLocation(const UObject* WorldContextObject)\n{\n\t// maybe simulation\n\tif (AActor* Player = USoStaticHelper::GetPlayerCharacterAsActor(WorldContextObject))\n\t\treturn ISoSplineWalker::Execute_GetSplineLocationI(Player);\n\n\treturn FSoSplinePoint();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFName USoStaticHelper::GetEnemyOverlapDamageImmunityName()\n{\n\tstatic FName EnemyOverlapDamageImmunityName = FName(\"EnemyOverlapDamageImmunity\");\n\treturn EnemyOverlapDamageImmunityName;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFName USoStaticHelper::GetLillianFormName()\n{\n\tstatic FName LillianFormName = FName(\"bLillianFormReached\");\n\treturn LillianFormName;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFName USoStaticHelper::GetForceNoEnvMusicName()\n{\n\tstatic FName ForceNoEnvMusicName = FName(\"bForceNoEnvMusic\");\n\treturn ForceNoEnvMusicName;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nESoDmgType USoStaticHelper::GetDmgTypeFromDmg(const FSoDmg& Dmg)\n{\n\treturn Dmg.GetType();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoStaticHelper::CheckAndClaimLevelsInSplineLocation(const FSoSplinePoint& SplinePoint)\n{\n\tif (!SplinePoint.IsValid(true))\n\t\treturn false;\n\n\tbool bLoaded;\n\treturn FSoLevelManager::Get().ClaimSplineLocation(SplinePoint, bLoaded);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nfloat USoStaticHelper::CalcDialogueDisplayTime(const UDlgContext* Context)\n{\n\tensure(Context);\n\tconst int32 Length = Context->GetActiveNodeText().ToString().Len();\n\treturn FMath::Max(Length / 50.0f * 3.0f, 3.0f);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFName USoStaticHelper::GenerateNameFromAssetPath(UObject* Object)\n{\n\tif (Object == nullptr)\n\t\treturn NAME_None;\n\n\tconst FString FileName = Object->GetPathName();\n\n\t// get rid of the filename.extension from the end\n\tint32 End = FileName.Len() - 1;\n\twhile (End > 0 && FileName[End] != '.')\n\t\tEnd -= 1;\n\n\t// get rid of the game/ from the begining\n\tint32 Start = End;\n\twhile (Start > 0 && FileName[Start - 1] != '/')\n\t\tStart -= 1;\n\n\tif (End == 0 || Start >= End)\n\t\treturn NAME_None;\n\n\treturn FName(*FileName.Mid(Start, End - Start));\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nfloat USoStaticHelper::GetScaledAnimLength(UAnimSequenceBase* AnimSequenceBase)\n{\n\tif (AnimSequenceBase == nullptr)\n\t\treturn 0.f;\n\n\treturn AnimSequenceBase->SequenceLength / AnimSequenceBase->RateScale;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoStaticHelper::BuildAnimationMap(UObject* Widget, TMap<FName, UWidgetAnimation*>& AnimationMap)\n{\n\tAnimationMap.Empty();\n\n\tUProperty* Property = Widget->GetClass()->PropertyLink;\n\twhile (Property != nullptr)\n\t{\n\t\tif (Property->GetClass() == UObjectProperty::StaticClass())\n\t\t{\n\t\t\tUObjectProperty* ObjectProperty = Cast<UObjectProperty>(Property);\n\n\t\t\tif (ObjectProperty->PropertyClass == UWidgetAnimation::StaticClass())\n\t\t\t{\n\t\t\t\tUObject* Object = ObjectProperty->GetObjectPropertyValue_InContainer(Widget);\n\t\t\t\tUWidgetAnimation* WidgetAnimation = Cast<UWidgetAnimation>(Object);\n\n\t\t\t\tif (WidgetAnimation != nullptr)\n\t\t\t\t\tAnimationMap.Add(WidgetAnimation->GetMovieScene()->GetFName(), WidgetAnimation);\n\t\t\t}\n\t\t}\n\n\t\tProperty = Property->PropertyLinkNext;\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoStaticHelper::SetSceneComponentMobility(USceneComponent* SceneComponent, EComponentMobility::Type Mobility)\n{\n\tif (SceneComponent != nullptr)\n\t\tSceneComponent->SetMobility(Mobility);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nfloat USoStaticHelper::GetLastRenderTimeOnScreen(UPrimitiveComponent* PrimitiveComponent)\n{\n\treturn PrimitiveComponent->LastRenderTimeOnScreen;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoStaticHelper::WasPrimitiveRenderedOnScreenRecently(UPrimitiveComponent* PrimitiveComponent, float Recently)\n{\n\treturn (PrimitiveComponent->GetWorld()->GetTimeSeconds() - PrimitiveComponent->LastRenderTimeOnScreen) < Recently;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFName USoStaticHelper::GetBoneNameFromBodyIndex(USkeletalMeshComponent* SkeletalMeshComponent, int32 BodyIndex)\n{\n\tif (SkeletalMeshComponent != nullptr && SkeletalMeshComponent->Bodies.IsValidIndex(BodyIndex))\n\t\treturn SkeletalMeshComponent->GetBoneName(SkeletalMeshComponent->Bodies[BodyIndex]->InstanceBoneIndex);\n\n\treturn NAME_None;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoStaticHelper::DamageOverlappedMortals(UPrimitiveComponent* PrimitiveComponent,\n\t\t\t\t\t\t\t\t\t\t\t  const FSoDmg& Damage,\n\t\t\t\t\t\t\t\t\t\t\t  const FSoHitReactDesc& HitReactDesc)\n{\n\tif (PrimitiveComponent == nullptr)\n\t\treturn;\n\n\tconst ECollisionEnabled::Type OldState = PrimitiveComponent->GetCollisionEnabled();\n\n\tPrimitiveComponent->SetCollisionEnabled(ECollisionEnabled::QueryOnly);\n\tconst FComponentQueryParams Param = FComponentQueryParams::DefaultComponentQueryParams;\n\tTArray<struct FOverlapResult> OutOverlaps;\n\tPrimitiveComponent->ComponentOverlapMulti(\tOutOverlaps,\n\t\t\t\t\t\t\t\t\t\t\t\tPrimitiveComponent->GetWorld(),\n\t\t\t\t\t\t\t\t\t\t\t\tPrimitiveComponent->GetComponentLocation(),\n\t\t\t\t\t\t\t\t\t\t\t\tPrimitiveComponent->GetComponentTransform().GetRotation(),\n\t\t\t\t\t\t\t\t\t\t\t\tECC_Weapon,\n\t\t\t\t\t\t\t\t\t\t\t\tParam,\n\t\t\t\t\t\t\t\t\t\t\t\tFCollisionObjectQueryParams::DefaultObjectQueryParam);\n\tPrimitiveComponent->SetCollisionEnabled(OldState);\n\n\tTMap<AActor*, FSoHitReactDesc> HitList;\n\n\tfor (const FOverlapResult& Overlap : OutOverlaps)\n\t\tif (UPrimitiveComponent* Component = Overlap.Component.Get())\n\t\t{\n\t\t\tAActor* Actor = Overlap.Actor.Get();\n\t\t\tif (Actor->GetClass()->ImplementsInterface(USoMortal::StaticClass()))\n\t\t\t{\n\t\t\t\tFSoHitReactDesc* HitParamPtr = HitList.Find(Actor);\n\t\t\t\tif (HitParamPtr == nullptr)\n\t\t\t\t{\n\t\t\t\t\tHitParamPtr = &HitList.Add(Actor);\n\t\t\t\t\t*HitParamPtr = HitReactDesc;\n\t\t\t\t}\n\t\t\t\tHitParamPtr->AssociatedBones.Add(USoStaticHelper::GetBoneNameFromBodyIndex(Cast<USkeletalMeshComponent>(Overlap.Component.Get()), Overlap.ItemIndex));\n\t\t\t}\n\t\t}\n\n\tfor (const auto& Pair : HitList)\n\t\tISoMortal::Execute_CauseDmg(Pair.Key, Damage, Pair.Value);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFVector USoStaticHelper::GetClosestPointOnMesh(USkeletalMeshComponent* Mesh, const FVector& SourceLocation)\n{\n\tFVector MinLocation = FVector(0.0f, 0.0f, 0.0f);\n\tfloat MinDist = BIG_NUMBER;\n\n\tTArray<FName> BoneNames;\n\tMesh->GetBoneNames(BoneNames);\n\n\tfor (const FName BoneName : BoneNames)\n\t{\n\t\tFVector Value;\n\t\tconst float Dist = Mesh->GetClosestPointOnCollision(SourceLocation, Value, BoneName);\n\t\tif (Dist > 0.0f && Dist < MinDist)\n\t\t{\n\t\t\tMinDist = Dist;\n\t\t\tMinLocation = Value;\n\t\t}\n\t}\n\n\treturn MinLocation;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoStaticHelper::ClearAndInvalidateTimer(AActor* Actor, FTimerHandle& Handle)\n{\n\tif (Handle.IsValid())\n\t{\n\t\tUWorld* World = GEngine->GetWorldFromContextObject(Actor, EGetWorldErrorMode::LogAndReturnNull);\n\t\tif (World)\n\t\t{\n\t\t\tWorld->GetTimerManager().ClearTimer(Handle);\n\t\t}\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoStaticHelper::CallMarkPackageDirtyOnObject(const UObject* Object)\n{\n\tif (Object != nullptr)\n\t\tObject->MarkPackageDirty();\n}\n\n\n#if WITH_EDITOR\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoStaticHelper::AddActorAndMeshToHLODProxy(UObject* Proxy, ALODActor* InLODActor, UStaticMesh* InStaticMesh)\n{\n\tif (Proxy != nullptr && InLODActor != nullptr && InStaticMesh != nullptr)\n\t\tif (UHLODProxy* HLODProxy = Cast<UHLODProxy>(Proxy))\n\t\t{\n\t\t\tHLODProxy->AddMesh(InLODActor, InStaticMesh, InLODActor->GetKey());\n\t\t}\n}\n#endif\n"
  },
  {
    "path": "Source/SOrb/Basic/Helpers/SoStaticHelper.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#pragma once\n#include \"Kismet/BlueprintFunctionLibrary.h\"\n#include \"MeshMaterialShaderType.h\"\n\n#include \"CharacterBase/SoIMortalTypes.h\"\n#include \"SplineLogic/SoSplinePoint.h\"\n\n#include \"SoStaticHelper.generated.h\"\n\nclass UBoxComponent;\nclass UDlgContext;\nclass APlayerController;\nclass USkeletalMeshComponent;\nclass ASoGameMode;\nclass FSoTimerManager;\nclass ASoCharacter;\nclass ASoCharacterBase;\nclass UAnimSequenceBase;\nclass UWidgetAnimation;\nclass USceneComponent;\nclass UPrimitiveComponent;\nclass ASoEnemy;\nclass ALODActor;\nclass UStaticMesh;\nstruct FHitResult;\n\n/**\n *\n */\nUCLASS()\nclass SORB_API USoStaticHelper : public UBlueprintFunctionLibrary\n{\n\tGENERATED_BODY()\n\npublic:\n\n\t// warning: player 0 is returned always, as this code was written for a singleplayer game\n\n\tUFUNCTION(BlueprintPure, Category = \"SoStaticHelper\", meta = (WorldContext = \"WorldContextObject\"))\n\tstatic ASoGameMode* GetSoGameMode(const UObject* WorldContextObject);\n\n\tUFUNCTION(BlueprintPure, Category = \"SoStaticHelper\")\n\tstatic ASoGameMode* GetSoGameModeFromContext(const UObject* Context);\n\n\tstatic FSoTimerManager& GetSoTimerManager(const UObject* WorldContextObject);\n\n\tUFUNCTION(BlueprintPure, Category = \"SoStaticHelper\", meta = (WorldContext = \"WorldContextObject\"))\n\tstatic FName GetNameFromActor(const UObject* WorldContextObject, FString PreFix);\n\n\tUFUNCTION(BlueprintPure, meta = (WorldContext = \"WorldContextObject\"))\n\tstatic bool IsActorInPlay(const UObject* WorldContextObject);\n\n\n\t// Only the first, this is a single player game after all\n\tUFUNCTION(BlueprintPure, Category = \"SoStaticHelper\", meta = (WorldContext = \"WorldContextObject\"))\n\tstatic APlayerController* GetPlayerController(const UObject* WorldContextObject);\n\n\tUFUNCTION(BlueprintPure, Category = \"SoStaticHelper\", meta = (WorldContext = \"WorldContextObject\"))\n\tstatic AActor* GetPlayerCharacterAsActor(const UObject* WorldContextObject);\n\n\tUFUNCTION(BlueprintPure, Category = \"SoStaticHelper\", meta = (WorldContext = \"WorldContextObject\"))\n\tstatic ASoCharacter* GetPlayerCharacterAsSoCharacter(const UObject* WorldContextObject);\n\n\tUFUNCTION(BlueprintPure, Category = \"SoStaticHelper\", meta = (WorldContext = \"WorldContextObject\"))\n\tstatic ASoCharacterBase* GetPlayerCharacterAsSoCharacterBase(const UObject* WorldContextObject);\n\n\tUFUNCTION(BlueprintPure, Category = \"SoStaticHelper\", meta = (WorldContext = \"WorldContextObject\"))\n\tstatic AActor* GetPlayerCharacterAsNullptr(const UObject* WorldContextObject);\n\n\t// meta = (WorldContext = \"WorldContextObject\")\n\tUFUNCTION(BlueprintPure, Category = \"SoStaticHelper\")\n\tstatic ASoEnemy* GetClosestEnemyToLocation(const UObject* WorldContextObject, const FVector& WorldLocation, float MaxDistance, bool bPreferFlying);\n\n\tUFUNCTION(BlueprintPure, Category = \"SoStaticHelper\")\n\tstatic ASoEnemy* GetClosestEnemyInDirection(const UObject* WorldContextObject,\n\t\t\t\t\t\t\t\t\t\t\t\tconst FVector& WorldLocation,\n\t\t\t\t\t\t\t\t\t\t\t\tfloat MaxDistance,\n\t\t\t\t\t\t\t\t\t\t\t\tconst FVector& Direction,\n\t\t\t\t\t\t\t\t\t\t\t\tbool bOnlyMovable);\n\n\tUFUNCTION(BlueprintPure, Category = \"SoStaticHelper\")\n\tstatic void GetEnemiesInRadius(const UObject* WorldContextObject, const FVector& WorldLocation, float Radius, TArray<ASoEnemy*>& Enemies);\n\n\tUFUNCTION(BlueprintPure, Category = \"SoStaticHelper\")\n\tstatic bool GetPointOnBoxTopClosestToBone(FVector& OutLocation, const TArray<FName>& BoneList, USkeletalMeshComponent* Mesh, UBoxComponent* Box, float MaxAcceptedOffset = 100.0f);\n\n\n\tUFUNCTION(BlueprintPure, Category = \"SoStaticHelper\", meta = (WorldContext = \"WorldContextObject\"))\n\tstatic FSoSplinePoint GetPlayerSplineLocation(const UObject* WorldContextObject);\n\n\tUFUNCTION(BlueprintPure, Category = \"SoStaticHelper\")\n\tstatic FName GetEnemyOverlapDamageImmunityName();\n\n\tUFUNCTION(BlueprintPure, Category = \"SoStaticHelper\")\n\tstatic FName GetLillianFormName();\n\n\tUFUNCTION(BlueprintPure, Category = \"SoStaticHelper\")\n\tstatic FName GetForceNoEnvMusicName();\n\n\n\tUFUNCTION(BlueprintPure, Category = \"Health\")\n\tstatic ESoDmgType GetDmgTypeFromDmg(const FSoDmg& Dmg);\n\n\n\tUFUNCTION(BlueprintCallable, Category = \"SplinePoint\")\n\tstatic bool CheckAndClaimLevelsInSplineLocation(const FSoSplinePoint& SplinePoint);\n\n\tUFUNCTION(BlueprintPure, Category = \"SplinePoint\")\n\tstatic float GetScaledAnimLength(UAnimSequenceBase* AnimSequenceBase);\n\n\tstatic void BuildAnimationMap(UObject* Widget, TMap<FName, UWidgetAnimation*>& AnimationMap);\n\n\tUFUNCTION(BlueprintCallable, Category = \"SplinePoint\")\n\tstatic void SetSceneComponentMobility(USceneComponent* SceneComponent, EComponentMobility::Type Mobility);\n\n\tUFUNCTION(BlueprintCallable, Category = \"SplinePoint\")\n\tstatic float GetLastRenderTimeOnScreen(UPrimitiveComponent* PrimitiveComponent);\n\n\tUFUNCTION(BlueprintPure, Category = \"SplinePoint\")\n\tstatic bool WasPrimitiveRenderedOnScreenRecently(UPrimitiveComponent* PrimitiveComponent, float Recently = 0.1f);\n\n\t/** Temp solution for voice acting based dialogues */\n\tstatic float CalcDialogueDisplayTime(const UDlgContext* Context);\n\n\t// Get the Name of the asset from it's path\n\tstatic FName GenerateNameFromAssetPath(UObject* Object);\n\n\tUFUNCTION(BlueprintPure, Category = \"SkeletalMesh\")\n\tstatic FName GetBoneNameFromBodyIndex(USkeletalMeshComponent* SkeletalMeshComponent, int32 BodyIndex);\n\n\tUFUNCTION(BlueprintCallable, Category = \"Damage\")\n\tstatic void DamageOverlappedMortals(UPrimitiveComponent* PrimitiveComponent,\n\t\t\t\t\t\t\t\t\t\tconst FSoDmg& Damage,\n\t\t\t\t\t\t\t\t\t\tconst FSoHitReactDesc& HitReactDesc);\n\n\tUFUNCTION(BlueprintCallable, Category = MeshHelper)\n\tstatic FVector GetClosestPointOnMesh(USkeletalMeshComponent* Mesh,\n\t\t\t\t\t\t\t\t\t\t const FVector& SourceLocation);\n\n\tUFUNCTION(BlueprintCallable, Category = ObjectHelper)\n\tstatic void ClearAndInvalidateTimer(AActor* Actor, UPARAM(ref)FTimerHandle& Handle);\n\n\tUFUNCTION(BlueprintCallable, Category = ObjectHelper)\n\tstatic void CallMarkPackageDirtyOnObject(const UObject* Object);\n\n#if WITH_EDITOR\n\tUFUNCTION(BlueprintCallable, Category = EditorHelper)\n\tstatic void AddActorAndMeshToHLODProxy(UObject* Proxy, ALODActor* InLODActor, UStaticMesh* InStaticMesh);\n#endif\n\npublic:\n\t/** Names: */\n\tstatic const FName NameGold;\n};\n"
  },
  {
    "path": "Source/SOrb/Basic/Helpers/SoStringHelper.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#include \"SoStringHelper.h\"\n\n#include \"Misc/AES.h\"\n#include \"Misc/SecureHash.h\"\n#include \"Misc/Base64.h\"\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFString USoStringHelper::RepeatString(const FString& StringToRepeat, int32 RepeatCount, const FString& StringBetween)\n{\n\tif (RepeatCount == 0)\n\t\treturn \"\";\n\n\tFString ReturnString = StringToRepeat;\n\tfor (int32 i = 1; i < RepeatCount; ++i)\n\t\tReturnString += StringBetween + StringToRepeat;\n\n\treturn ReturnString;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFString USoStringHelper::CapitalizeEachWordFromString(const FString& OriginalString)\n{\n\tif (OriginalString.Len() == 0)\n\t\treturn OriginalString;\n\n\tTArray<FString> WordsArray;\n\tif (OriginalString.ParseIntoArray(WordsArray, TEXT(\" \"), true) == 0)\n\t\treturn OriginalString;\n\n\tfor (auto& Word : WordsArray)\n\t{\n\t\tif (Word.Len() >= 1)\n\t\t{\n\t\t\tWord[0] = FChar::ToUpper(Word[0]);\n\t\t}\n\t}\n\n\treturn FString::Join(WordsArray, TEXT(\" \"));\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFString USoStringHelper::AES256Encrypt(FString InputString, FString Key)\n{\n\t// Check inputs\n\tif (InputString.IsEmpty()) return \"\";  //empty string? do nothing\n\tif (Key.IsEmpty()) return \"\";\n\n\t// To split correctly final result of decryption from trash symbols\n\tFString SplitSymbol = \"EL@$@!\";\n\tInputString.Append(SplitSymbol);\n\n\t// We need at least 32 symbols key\n\tKey = FMD5::HashAnsiString(*Key);\n\tconst TCHAR* KeyTCHAR = Key.GetCharArray().GetData();\n\n\t// Calculate blob size and create blob\n\tuint32 Size =  InputString.Len();\n\tSize = Size + (FAES::AESBlockSize - (Size % FAES::AESBlockSize));\n\tuint8* Blob = new uint8[Size];\n\n\t// Convert string to bytes and encrypt\n\tif (StringToBytes(InputString, Blob, Size))\n\t{\n\t\tFAES::EncryptData(Blob, Size, TCHAR_TO_ANSI(KeyTCHAR));\n\t\tInputString = FString::FromHexBlob(Blob, Size);\n\n\t\tdelete[] Blob;\n\t\treturn InputString;\n\t}\n\n\tdelete[] Blob;\n\treturn TEXT(\"\");\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFString USoStringHelper::AES256Decrypt(FString InputString, FString Key)\n{\n\t// Check inputs\n\tif (InputString.IsEmpty()) return \"\";\n\tif (Key.IsEmpty()) return \"\";\n\n\t// To split correctly final result of decryption from trash symbols\n\tFString SplitSymbol = \"EL@$@!\";\n\n\t// We need at least 32 symbols key\n\tKey = FMD5::HashAnsiString(*Key);\n\tconst TCHAR* KeyTCHAR = Key.GetCharArray().GetData();\n\n\t// Calculate blob size and create blob\n\tuint32 Size =  InputString.Len();\n\tSize = Size + (FAES::AESBlockSize - (Size % FAES::AESBlockSize));\n\tuint8* Blob = new uint8[Size];\n\n\t// Convert string to bytes and decrypt\n\tif (FString::ToHexBlob(InputString, Blob, Size))\n\t{\n\t\tFAES::DecryptData(Blob, Size, TCHAR_TO_ANSI(KeyTCHAR));\n\t\tInputString = BytesToString(Blob, Size);\n\n\t\t// Split required data from trash\n\t\tFString LeftData;\n\t\tFString RightData;\n\t\tInputString.Split(SplitSymbol, &LeftData, &RightData, ESearchCase::CaseSensitive, ESearchDir::FromStart);\n\t\tInputString = LeftData;\n\n\t\tdelete[] Blob;\n\t\treturn InputString;\n\t}\n\n\tdelete[] Blob;\n\treturn \"\";\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFString USoStringHelper::GetObjectBaseName(const UObject* Object)\n{\n\tif (!IsValid(Object))\n\t\treturn TEXT(\"\");\n\n\n\tconst UPackage* Package = Object->GetOutermost();\n\tif (!Package)\n\t\treturn TEXT(\"\");\n\t\n\tconst FString PathName = Package->GetName();\n\tconst bool bRemovePath = true;\n\treturn FPaths::GetBaseFilename(PathName, bRemovePath);\n}"
  },
  {
    "path": "Source/SOrb/Basic/Helpers/SoStringHelper.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#pragma once\n#include \"Kismet/BlueprintFunctionLibrary.h\"\n#include \"MeshMaterialShaderType.h\"\n#include \"Misc/SecureHash.h\"\n\n#include \"Items/SoItemTypes.h\"\n#include \"CharacterBase/SoIMortalTypes.h\"\n#include \"Settings/SoAudioSettingsTypes.h\"\n\n#include \"SoStringHelper.generated.h\"\n\n\n\n/**\n *\n */\nUCLASS()\nclass SORB_API USoStringHelper : public UBlueprintFunctionLibrary\n{\n\tGENERATED_BODY()\n\npublic:\n\n\tUFUNCTION(BlueprintPure, Category = StringHelper)\n\tstatic FString RepeatString(const FString& StringToRepeat, int32 RepeatCount, const FString& StringBetween);\n\n\tUFUNCTION(BlueprintPure, Category = StringHelper)\n\tstatic FString CapitalizeEachWordFromString(const FString& OriginalString);\n\n\t// From: https://kelheor.space/2018/11/12/how-to-encrypt-data-with-aes-256-in-ue4/\n\tUFUNCTION(BlueprintCallable, Category = \"AES256\")\n\tstatic FString AES256Encrypt(FString InputString, FString Key);\n\tUFUNCTION(BlueprintCallable, Category = \"AES256\")\n\tstatic FString AES256Decrypt(FString InputString, FString Key);\n\n\t// Gets the user ObjectName as it appears in the content browser\n\t// Works for blueprints and UMG widgets\n\t// And NOT Default_WidgetName_C_0\n\t// And NOT Default_WidgetName_BP_C_0\n\tstatic FString GetObjectBaseName(const UObject* Object);\n\n\ttemplate<typename TEnum>\n\tstatic bool ConvertEnumToString(const FString& EnumName, TEnum EnumValue, bool bWithNameSpace, FString& OutEnumValue)\n\t{\n\t\tconst UEnum* EnumPtr = FindObject<UEnum>(ANY_PACKAGE, *EnumName, true);\n\t\tif (!EnumPtr)\n\t\t{\n\t\t\tOutEnumValue = FString::Printf(TEXT(\"INVALID EnumName = `%s`\"), *EnumName);\n\t\t\treturn false;\n\t\t}\n\n\t\tOutEnumValue = bWithNameSpace ? EnumPtr->GetNameByIndex(static_cast<int32>(EnumValue)).ToString()\n\t\t\t\t\t\t\t\t\t  : EnumPtr->GetNameStringByIndex(static_cast<int32>(EnumValue));\n\t\treturn true;\n\t}\n\n\ttemplate<typename TEnum>\n\tstatic bool ConvertStringToEnum(const FString& String, const FString& EnumName, TEnum& OutEnumValue)\n\t{\n\t\tconst UEnum* EnumPtr = FindObject<UEnum>(ANY_PACKAGE, *EnumName, true);\n\t\tif (!EnumPtr)\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\tconst int32 Index = EnumPtr->GetIndexByNameString(String);\n\t\tOutEnumValue = static_cast<TEnum>(Index);\n\t\treturn true;\n\t}\n\n\ttemplate<typename TEnum>\n\tstatic bool ConvertFNameToEnum(FName Name, const FString& EnumName, TEnum& OutEnumValue)\n\t{\n\t\tconst UEnum* EnumPtr = FindObject<UEnum>(ANY_PACKAGE, *EnumName, true);\n\t\tif (!EnumPtr)\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\tconst int32 Index = EnumPtr->GetIndexByName(Name);\n\t\tOutEnumValue = static_cast<TEnum>(Index);\n\t\treturn true;\n\t}\n\n\t// GetEnumValueAsString for ESoItemType (NOTE: this removes the namespace and prefix)\n\tstatic FString ItemTypeToFriendlyString(ESoItemType ItemType)\n\t{\n\t\tFString EnumValue;\n\t\tif (ConvertEnumToString<ESoItemType>(TEXT(\"ESoItemType\"), ItemType, false, EnumValue))\n\t\t\treturn EnumValue.Mid(4);\n\n\t\treturn EnumValue;\n\t}\n\n\t// GetEnumValueAsString for ESoDamageType (NOTE: this removes the namespace and prefix)\n\tstatic FString DamageTypeToFriendlyString(ESoDmgType DamageType)\n\t{\n\t\tFString EnumValue;\n\t\tif (ConvertEnumToString<ESoDmgType>(TEXT(\"ESoDmgType\"), DamageType, false, EnumValue))\n\t\t\treturn EnumValue.Mid(4);\n\n\t\treturn EnumValue;\n\t}\n\n\tstatic FString SFXToString(const ESoSFX Type)\n\t{\n\t\tFString EnumValue;\n\t\tif (ConvertEnumToString<ESoSFX>(TEXT(\"ESoSFX\"), Type, false, EnumValue))\n\t\t\treturn EnumValue;\n\n\t\treturn EnumValue;\n\t}\n\n\t// NOTE: potential dangerous\n\tstatic FName FTextToFName(const FText& Text)\n\t{\n\t\treturn FName(*Text.ToString());\n\t}\n\n\t//\n\t// SHA1\n\t//\n\n\ttemplate<class DataType>\n\tstatic void UpdateSHA1_Data(FSHA1& HashState, const DataType& Data)\n\t{\n\t\tHashState.Update(reinterpret_cast<const uint8*>(&Data), sizeof(DataType));\n\t}\n\n\ttemplate<class ElementType>\n\tstatic void UpdateSHA1_ArrayOfUObjects(FSHA1& HashState, const TArray<ElementType*>& Array)\n\t{\n\t\t// Use the pathname for the hash\n\t\tfor (const auto* Elem : Array)\n\t\t{\n\t\t\tUpdateSHA1_UObject(HashState, Elem);\n\t\t}\n\t}\n\n\ttemplate<class ElementType>\n\tstatic void UpdateSHA1_Array(FSHA1& HashState, const TArray<ElementType>& Array)\n\t{\n\t\t// Use the pathname for the hash\n\t\tHashState.Update(reinterpret_cast<const uint8*>(Array.GetData()), Array.Num() * Array.GetTypeSize());\n\t}\n\n\tFORCEINLINE static void UpdateSHA1_UObject(FSHA1& HashState, const UObject* Object)\n\t{\n\t\tif (IsValid(Object))\n\t\t{\n\t\t\tUpdateSHA1_String(HashState, Object->GetPathName());\n\t\t}\n\t}\n\tFORCEINLINE static void UpdateSHA1_UInt8(FSHA1& HashState, uint8 Number)\n\t{\n\t\tUpdateSHA1_Data(HashState, Number);\n\t\t// HashState.Update(&Number, sizeof(Number));\n\t}\n\tFORCEINLINE static void UpdateSHA1_Int32(FSHA1& HashState, int32 Number)\n\t{\n\t\tUpdateSHA1_Data(HashState, Number);\n\t\t// HashState.Update(reinterpret_cast<const uint8*>(&Number), sizeof(Number));\n\t}\n\tFORCEINLINE static void UpdateSHA1_Float(FSHA1& HashState, float Number)\n\t{\n\t\tUpdateSHA1_Data(HashState, Number);\n\t\t// UpdateSHA1_Int32(HashState, FMath::RoundToInt(Number));\n\t}\n\tFORCEINLINE static void UpdateSHA1_Bool(FSHA1& HashState, bool bBoolean)\n\t{\n\t\tUpdateSHA1_Int32(HashState, static_cast<int32>(bBoolean));\n\t}\n\tFORCEINLINE static void UpdateSHA1_Name(FSHA1& HashState, FName Name)\n\t{\n\t\tUpdateSHA1_String(HashState, Name.ToString());\n\t}\n\tFORCEINLINE static void UpdateSHA1_String(FSHA1& HashState, const FString& String)\n\t{\n\t\tHashState.UpdateWithString(*String, String.Len());\n\t}\n};\n"
  },
  {
    "path": "Source/SOrb/Basic/SoAudioManager.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#include \"SoAudioManager.h\"\n\n#include \"TimerManager.h\"\n#include \"Kismet/GameplayStatics.h\"\n\n#include \"FMODEvent.h\"\n#include \"FMODBus.h\"\n#include \"FMODBlueprintStatics.h\"\n#include \"FMODVCA.h\"\n#include \"fmod_errors.h\"\n\n#include \"SoGameInstance.h\"\n#include \"SoGameSingleton.h\"\n#include \"Basic/Helpers/SoMathHelper.h\"\n#include \"Basic/Helpers/SoStaticHelper.h\"\n#include \"SplineLogic/SoPlayerSpline.h\"\n#include \"Character/SoCharacter.h\"\n#include \"Enemy/SoEnemy.h\"\n#include \"Helpers/SoDateTimeHelper.h\"\n\nDEFINE_LOG_CATEGORY_STATIC(LogSoAudioManager, All, All)\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUSoAudioManager::USoAudioManager(const FObjectInitializer& ObjectInitializer) : Super(ObjectInitializer)\n{\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUSoAudioManager::~USoAudioManager()\n{\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoAudioManager::Initialize()\n{\n\t// Should be set in Blueprint\n\tensure(USoGameSingleton::Get().MenuMusicPtr.Get() != nullptr);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoAudioManager::Tick(float DeltaSeconds)\n{\n\t// Set volumes for the blend\n\tfor (FSoVCABlend* Blend : USoGameSingleton::Get().VCA_BlendArray)\n\t{\n\t\tif (!FMath::IsNearlyEqual(Blend->Target, Blend->Counter, KINDA_SMALL_NUMBER))\n\t\t{\n\t\t\tconst float Speed = (1.0f - Blend->MinValue) * DeltaSeconds / Blend->BlendDuration * (Blend->Target > Blend->Counter ? 1 : -1);\n\t\t\tBlend->Counter += Speed;\n\t\t\tBlend->Counter = FMath::Clamp(Blend->Counter, Blend->MinValue, 1.0f);\n\n\t\t\tSetVolume(Blend->VCAPtr.Get(), Blend->Counter);\n\t\t}\n\t}\n\n\tif (MusicEventInstance != nullptr)\n\t{\n\t\tFMOD_STUDIO_PLAYBACK_STATE state = FMOD_STUDIO_PLAYBACK_STOPPED;\n\t\tMusicEventInstance->getPlaybackState(&state);\n\t\tif (state == FMOD_STUDIO_PLAYBACK_STOPPED)\n\t\t{\n\t\t\tMusicEventInstance->release();\n\t\t\tMusicEventInstance = nullptr;\n\n\t\t\tMusicRestartCounter = FMath::RandRange(MinWaitBeforeMusicRestart, MaxWaitBeforeMusicRestart);\n\t\t\t// UE_LOG(LogTemp, Warning, TEXT(\"Music stopped, wait time is %f\"), MusicRestartCounter);\n\t\t}\n\t}\n\telse if (PlayedMusic != nullptr)\n\t{\n\t\tMusicRestartCounter -= DeltaSeconds;\n\t\tif (MusicRestartCounter < 0.0f)\n\t\t{\n\t\t\t// UE_LOG(LogTemp, Warning, TEXT(\"Music wait time is out, it is started again!\"));\n\t\t\tMusicEventInstance = StartEventInstance2D(PlayedMusic);\n\t\t}\n\t}\n\n\t// Change playback speed\n\tif (!FMath::IsNearlyEqual(TargetPlaybackSpeed, SourcePlaybackSpeed))\n\t{\n\t\tPlaybackSpeedCounter = FMath::Min(PlaybackSpeedCounter + DeltaSeconds, 1.0f);\n\t\tfloat PlaybackSpeed = USoMathHelper::InterpolateSmoothStep(\n\t\t\tSourcePlaybackSpeed,\n\t\t\tTargetPlaybackSpeed,\n\t\t\tFMath::Clamp(PlaybackSpeedCounter / PlaybackSpeedChangeDuration, 0.0f, 1.0f)\n\t\t);\n\n\t\t// We are near our target\n\t\tif (FMath::IsNearlyEqual(TargetPlaybackSpeed, PlaybackSpeedCounter, KINDA_SMALL_NUMBER))\n\t\t{\n\t\t\tSourcePlaybackSpeed = TargetPlaybackSpeed;\n\t\t\tPlaybackSpeed = TargetPlaybackSpeed;\n\t\t}\n\n\t\tconst bool bPlaybackSpeedChanged = SetPlaybackSpeedOnAllChannels(PlaybackSpeed);\n\t\tif (bPlaybackSpeedChanged)\n\t\t\tOnPlaybackSpeedChanged.Broadcast(PlaybackSpeed);\n\t}\n\n\t// Update times for 2D sounds effects\n\tfor (auto& Elem : Sounds2DTimeSinceLastUsedMap)\n\t\tElem.Value += DeltaSeconds;\n\n\tUpdateAmbientParams();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoAudioManager::Shutdown()\n{\n\tif (MusicEventInstance != nullptr)\n\t{\n\t\tMusicEventInstance->stop(FMOD_STUDIO_STOP_IMMEDIATE);\n\t\tMusicEventInstance->release();\n\t\tMusicEventInstance = nullptr;\n\t}\n\tPlayedMusic = nullptr;\n\tSounds2DTimeSinceLastUsedMap.Empty();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUSoAudioManager* USoAudioManager::GetInstance(const UObject* WorldContextObject)\n{\n\treturn USoGameInstance::Get(WorldContextObject).GetAudioManager();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoAudioManager::RegisterAmbient(UObject* WorldContextObject, const TArray<UFMODEvent*>& Events, bool bAdd)\n{\n\tauto& AudioManager = Get(WorldContextObject);\n\tfor (UFMODEvent* Event : Events)\n\t{\n\t\tint32 Index = 0;\n\t\tfor (; Index < AudioManager.AmbientRequests.Num(); ++Index)\n\t\t\tif (AudioManager.AmbientRequests[Index].Event == Event)\n\t\t\t\tbreak;\n\n\t\tif (!AudioManager.AmbientRequests.IsValidIndex(Index))\n\t\t{\n\t\t\tif (bAdd)\n\t\t\t{\n\t\t\t\tFSoAmbientEntry& Entry = AudioManager.AmbientRequests.Add_GetRef({});\n\t\t\t\tEntry.Event = Event;\n\t\t\t\tEntry.RequestCount = 1;\n\t\t\t\tEntry.Instance = PlaySound2D(WorldContextObject, Event);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tUE_LOG(LogSoAudioManager, Warning, TEXT(\"USoAudioManager::RegisterAmbient Failed to decrease ambient count: no such entry?!\"));\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tAudioManager.AmbientRequests[Index].RequestCount += bAdd ? 1 : -1;\n\t\t\tif (!AudioManager.bAmbientFreeze && AudioManager.AmbientRequests[Index].RequestCount == 0)\n\t\t\t{\n\t\t\t\tUFMODBlueprintStatics::EventInstanceStop(AudioManager.AmbientRequests[Index].Instance);\n\t\t\t\tAudioManager.AmbientRequests.RemoveAtSwap(Index);\n\t\t\t}\n\t\t}\n\t}\n\n\tif (bAdd)\n\t\tAudioManager.UpdateAmbientParams();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoAudioManager::SetAmbientFreeze(bool bFreeze)\n{\n\tbAmbientFreeze = bFreeze;\n\n\tif (!bAmbientFreeze)\n\t{\n\t\tfor (int32 i = AmbientRequests.Num() - 1; i >= 0; --i)\n\t\t{\n\t\t\tif (AmbientRequests[i].RequestCount <= 0)\n\t\t\t{\n\t\t\t\tUFMODBlueprintStatics::EventInstanceStop(AmbientRequests[i].Instance);\n\t\t\t\tAmbientRequests.RemoveAtSwap(i);\n\t\t\t}\n\t\t}\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoAudioManager::IsComponentPlaying(UFMODAudioComponent* Component)\n{\n\tif (Component != nullptr)\n\t\treturn Component->IsPlaying();\n\n\treturn false;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoAudioManager::PlayComponentIfNotPlaying(UFMODAudioComponent* Component)\n{\n\tif (Component != nullptr && !Component->IsPlaying())\n\t\tComponent->Play();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFFMODEventInstance USoAudioManager::PlaySound2D(UObject* WorldContextObject, UFMODEvent* Event, bool bAutoPlay)\n{\n\tstatic FFMODEventInstance EmptyInstance;\n\tEmptyInstance.Instance = nullptr;\n\tif (Event == nullptr || WorldContextObject == nullptr)\n\t{\n\t\tif (WorldContextObject)\n\t\t{\n\t\t\tUE_LOG(LogSoAudioManager, Warning, TEXT(\"USoAudioManager::PlaySound2D(Context = %s) Empty Event\"), *WorldContextObject->GetPathName());\n\t\t}\n\t\telse\n\t\t{\n\t\t\tUE_LOG(LogSoAudioManager, Warning, TEXT(\"USoAudioManager::PlaySound2D Empty Event AND Context\"));\n\t\t}\n\n\t\treturn EmptyInstance;\n\t}\n\n\t// Protect against UI spamming the same sound\n\t// auto& AudioManager = Get(WorldContextObject);\n\t// static constexpr float SpamSecondsThreshold = 0.1f;\n\t// const uint32 Key = Event->GetUniqueID();\n\t// if (AudioManager.Sounds2DTimeSinceLastUsedMap.Contains(Key))\n\t// {\n\t// \t// Abort as the spam threshold was not surpassed\n\t// \tconst float LastUsed = AudioManager.Sounds2DTimeSinceLastUsedMap.FindChecked(Key);\n\t// \tif (LastUsed < SpamSecondsThreshold)\n\t// \t\treturn EmptyInstance;\n\t// }\n\t//\n\t// // Reset\n\t// AudioManager.Sounds2DTimeSinceLastUsedMap.Add(Key, 0.f);\n\n\t//UE_LOG(LogSoAudioManager, Verbose, TEXT(\"PlaySound2D: Context = %s, EventName = %s\"), *WorldContextObject->GetPathName(), *Event->GetPathName());\n\treturn PlaySoundAtLocation(WorldContextObject, Event, FTransform(), bAutoPlay);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFFMODEventInstance USoAudioManager::PlaySoundAtLocation(UObject* WorldContextObject, UFMODEvent* Event, const FTransform& Location, bool bAutoPlay)\n{\n\tstatic FFMODEventInstance EmptyInstance;\n\tEmptyInstance.Instance = nullptr;\n\tif (Event == nullptr || WorldContextObject == nullptr)\n\t\treturn EmptyInstance;\n\n\treturn UFMODBlueprintStatics::PlayEventAtLocation(WorldContextObject, Event, Location, bAutoPlay);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUFMODAudioComponent* USoAudioManager::PlaySoundAttached(\n\tUFMODEvent* Event,\n\tUSceneComponent* AttachToComponent,\n\tFName AttachPointName,\n\tFVector Location,\n\tEAttachLocation::Type LocationType,\n\tbool bStopWhenAttachedToDestroyed,\n\tbool bAutoPlay,\n\tbool bAutoDestroy\n)\n{\n\treturn UFMODBlueprintStatics::PlayEventAttached(Event, AttachToComponent, AttachPointName, Location, LocationType, bStopWhenAttachedToDestroyed, bAutoPlay, bAutoDestroy);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoAudioManager::IsSoundInstanceValid(FFMODEventInstance SoundInstance)\n{\n\tif (SoundInstance.Instance)\n\t\treturn SoundInstance.Instance->isValid();\n\n\treturn false;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoAudioManager::SoundInstancePlay(FFMODEventInstance SoundInstance)\n{\n\tif (!SoundInstance.Instance)\n\t\treturn;\n\n\tconst FMOD_RESULT Result = SoundInstance.Instance->start();\n\tLOG_IF_FMOD_ERROR(Result);\n\tif (Result != FMOD_OK)\n\t{\n\t\tUE_LOG(LogSoAudioManager, Warning, TEXT(\"USoAudioManager::SoundInstancePlay Failed to play event instance\"));\n\t}\n\n\t// Once we start playing, allow instance to be cleaned up when it finishes\n\tSoundInstance.Instance->release();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoAudioManager::SoundInstanceStop(FFMODEventInstance SoundInstance, bool Release)\n{\n\tif (!IsSoundInstanceValid(SoundInstance))\n\t\treturn false;\n\n\tconst FMOD_RESULT Result = SoundInstance.Instance->stop(FMOD_STUDIO_STOP_ALLOWFADEOUT);\n\tLOG_IF_FMOD_ERROR(Result);\n\tif (Result != FMOD_OK)\n\t{\n\t\tUE_LOG(LogSoAudioManager, Warning, TEXT(\"USoAudioManager::SoundInstanceStop Failed to stop event instance\"));\n\t\treturn false;\n\t}\n\n\tif (Release)\n\t\tSoundInstanceRelease(SoundInstance);\n\n\treturn true;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoAudioManager::SoundInstancePause(FFMODEventInstance SoundInstance, bool bPaused)\n{\n\tif (!IsSoundInstanceValid(SoundInstance))\n\t\treturn false;\n\n\tconst FMOD_RESULT Result = SoundInstance.Instance->setPaused(bPaused);\n\tLOG_IF_FMOD_ERROR(Result);\n\tif (Result != FMOD_OK)\n\t{\n\t\tUE_LOG(LogSoAudioManager, Warning, TEXT(\"USoAudioManager::SoundInstancePause Failed to pause or resume event instance\"));\n\t\treturn false;\n\t}\n\n\treturn true;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoAudioManager::SoundInstanceRelease(FFMODEventInstance SoundInstance)\n{\n\tif (!SoundInstance.Instance)\n\t\treturn;\n\n\tconst FMOD_RESULT Result = SoundInstance.Instance->release();\n\tLOG_IF_FMOD_ERROR(Result);\n\tif (Result != FMOD_OK)\n\t{\n\t\tUE_LOG(LogSoAudioManager, Warning, TEXT(\"Failed to release event instance\"));\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nfloat USoAudioManager::GetSoundLengthSeconds(UFMODEvent* Event)\n{\n\tif (Event != nullptr)\n\t{\n\t\tFMOD::Studio::EventDescription* EventDesc = IFMODStudioModule::Get().GetEventDescription(Event, EFMODSystemContext::Type::Runtime);\n\t\tif (EventDesc != nullptr)\n\t\t{\n\t\t\tint32 EventLength;\n\t\t\tLOG_IF_FMOD_ERROR(EventDesc->getLength(&EventLength));\n\t\t\treturn static_cast<float>(EventLength) / 1000.0f;\n\t\t}\n\t}\n\treturn 0.0f;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUFMODEvent* USoAudioManager::SelectHitReactSFX(AActor* Mortal, const FSoHitReactDesc& HitReact, UFMODEvent* SFX, UFMODEvent* SFXOnDeath, UFMODEvent* SFXEnemy)\n{\n\tif (ASoEnemy* SoEnemy = Cast<ASoEnemy>(Mortal))\n\t\treturn SFXEnemy;\n\n\tif (SFXOnDeath == nullptr)\n\t\treturn SFX;\n\n\tASoCharacter* SoCharacter = Cast<ASoCharacter>(Mortal);\n\tif (HitReact.HitReact == ESoHitReactType::EHR_BreakIntoPieces ||\n\t\tHitReact.HitReact == ESoHitReactType::EHR_FallToDeath ||\n\t\tSoCharacter == nullptr)\n\t{\n\t\treturn SFXOnDeath;\n\t}\n\n\tconst bool bAlive = SoCharacter->GetActivity() != EActivity::EA_Dead;\n\tif (!bAlive)\n\t\treturn SFXOnDeath;\n\n\tstatic const FName TimeName = FName(\"TimeName\");\n\tconst float LastSFXPlayTime = IDlgDialogueParticipant::Execute_GetFloatValue(SoCharacter, TimeName);\n\tconst float CurrentTime = Mortal->GetWorld()->GetTimeSeconds();\n\tconst float ThresholdSeconds = LastSFXPlayTime + USoDateTimeHelper::NormalizeTime(0.2f);\n\tif (ThresholdSeconds > CurrentTime)\n\t\treturn SFXOnDeath;\n\n\tIDlgDialogueParticipant::Execute_ModifyFloatValue(SoCharacter, TimeName, false, CurrentTime);\n\treturn SFX;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoAudioManager::PlayHitReactSFX(\n\tUObject* WorldContextObject,\n\tAActor* Mortal,\n\tconst FTransform& WorldTransform,\n\tconst FSoHitReactDesc& HitReact,\n\tUFMODEvent* SFX,\n\tUFMODEvent* SFX2D,\n\tUFMODEvent* SFXOnDeath,\n\tUFMODEvent* SFXEnemy\n)\n{\n\tif (ASoEnemy* SoEnemy = Cast<ASoEnemy>(Mortal))\n\t{\n\t\tif (SFXEnemy != nullptr)\n\t\t\tPlaySoundAtLocation(WorldContextObject, SFXEnemy, WorldTransform);\n\n\t\treturn;\n\t}\n\n\tASoCharacter* SoCharacter = Cast<ASoCharacter>(Mortal);\n\tif (SoCharacter == nullptr)\n\t{\n\t\treturn;\n\t}\n\n\tstatic const FName TimeName = FName(\"TimeName\");\n\tconst float LastSFXPlayTime = IDlgDialogueParticipant::Execute_GetFloatValue(SoCharacter, TimeName);\n\tconst float CurrentTime = Mortal->GetWorld()->GetTimeSeconds();\n\tconst float ThresholdSeconds = LastSFXPlayTime + USoDateTimeHelper::NormalizeTime(0.2f);\n\tif (SFXOnDeath != nullptr &&\n\t\t(HitReact.HitReact == ESoHitReactType::EHR_BreakIntoPieces ||\n\t\tHitReact.HitReact == ESoHitReactType::EHR_FallToDeath ||\n\t\tSoCharacter == nullptr ||\n\t\tSoCharacter->GetActivity() == EActivity::EA_Dead ||\n\t\t ThresholdSeconds > CurrentTime))\n\t{\n\t\tPlaySoundAtLocation(WorldContextObject, SFXOnDeath, WorldTransform);\n\t\treturn;\n\t}\n\n\tIDlgDialogueParticipant::Execute_ModifyFloatValue(SoCharacter, TimeName, false, CurrentTime);\n\n\tif (SFX != nullptr)\n\t\tPlaySoundAtLocation(WorldContextObject, SFX, WorldTransform);\n\n\tif (SFX2D != nullptr)\n\t\tPlaySoundAtLocation(WorldContextObject, SFX2D, WorldTransform);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoAudioManager::SetVolume(UFMODVCA* AssetVCA, float Volume)\n{\n\tif (!AssetVCA)\n\t\treturn false;\n\n\tFMOD::Studio::System* StudioSystem = IFMODStudioModule::Get().GetStudioSystem(EFMODSystemContext::Runtime);\n\tif (!StudioSystem)\n\t\treturn false;\n\n\tFMOD::Studio::ID GUID = FMODUtils::ConvertGuid(AssetVCA->AssetGuid);\n\tFMOD::Studio::VCA* VCA = nullptr;\n\tconst FMOD_RESULT Result = StudioSystem->getVCAByID(&GUID, &VCA);\n\tLOG_IF_FMOD_ERROR(Result);\n\tif (Result != FMOD_OK || VCA == nullptr)\n\t\treturn false;\n\n\treturn VCA->setVolume(Volume) == FMOD_OK;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoAudioManager::GetVolume(UFMODVCA* AssetVCA, float& OutVolume)\n{\n\tif (!AssetVCA)\n\t\treturn false;\n\n\tFMOD::Studio::System* StudioSystem = IFMODStudioModule::Get().GetStudioSystem(EFMODSystemContext::Runtime);\n\tif (!StudioSystem)\n\t\treturn false;\n\n\tFMOD::Studio::ID GUID = FMODUtils::ConvertGuid(AssetVCA->AssetGuid);\n\tFMOD::Studio::VCA* VCA = nullptr;\n\tconst FMOD_RESULT Result = StudioSystem->getVCAByID(&GUID, &VCA);\n\tLOG_IF_FMOD_ERROR(Result);\n\tif (Result != FMOD_OK || VCA == nullptr)\n\t\treturn false;\n\n\tfloat Volume = 0.f;\n\tfloat FinalVolume = 0.f;\n\tif (VCA->getVolume(&Volume, &FinalVolume) == FMOD_OK)\n\t{\n\t\tOutVolume = Volume;\n\t\treturn true;\n\t}\n\n\treturn false;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoAudioManager::MuteAudio()\n{\n\tSetVolume(USoGameSingleton::Get().VCA_MutePtr.Get(), 0.0f);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoAudioManager::UnMuteAudio()\n{\n\tSetVolume(USoGameSingleton::Get().VCA_MutePtr.Get(), 1.0f);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoAudioManager::IsAudioMuted()\n{\n\tfloat VolumeMute = 1.f;\n\tGetVolume(USoGameSingleton::Get().VCA_MutePtr.Get(), VolumeMute);\n\treturn FMath::IsNearlyEqual(VolumeMute, 0.f);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoAudioManager::SetVolumeMaster(float Volume)\n{\n\tSetVolume(USoGameSingleton::Get().VCA_MasterPtr.Get(), Volume);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoAudioManager::SetVolumeMusic(float Volume)\n{\n\tSetVolume(USoGameSingleton::Get().VCA_MusicPtr.Get(), Volume);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoAudioManager::SetVolumeSFX(float Volume)\n{\n\tSetVolume(USoGameSingleton::Get().VCA_SFXPtr.Get(), Volume);\n\tSetVolume(USoGameSingleton::Get().VCA_UIPtr.Get(), Volume);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nfloat USoAudioManager::GetVolumeMaster()\n{\n\tfloat Volume = 0.f;\n\tGetVolume(USoGameSingleton::Get().VCA_MasterPtr.Get(), Volume);\n\treturn Volume;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nfloat USoAudioManager::GetVolumeMusic()\n{\n\tfloat Volume = 0.f;\n\tGetVolume(USoGameSingleton::Get().VCA_MusicPtr.Get(), Volume);\n\treturn Volume;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nfloat USoAudioManager::GetVolumeSFX()\n{\n\tfloat Volume = 0.f;\n\tGetVolume(USoGameSingleton::Get().VCA_SFXPtr.Get(), Volume);\n\treturn Volume;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoAudioManager::SetPausedMenuBuses(bool bOpened)\n{\n\tUSoGameSingleton::Get().VCA_Menu.Target = bOpened ? 0.0f : 1.0f;\n\tfor (const TSoftObjectPtr<UFMODBus> BusPtr : USoGameSingleton::Get().MenuBusesToPauseArrayPtr)\n\t\tif (UFMODBus* Bus = BusPtr.Get())\n\t\t\tUFMODBlueprintStatics::BusSetPaused(Bus, bOpened);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoAudioManager::LogFMODError(FMOD_RESULT Result, const char* Function)\n{\n\tconst FString ErrorStr(ANSI_TO_TCHAR(FMOD_ErrorString(Result)));\n\tconst FString FunctionStr(ANSI_TO_TCHAR(Function));\n\tUE_LOG(LogSoAudioManager, Error, TEXT(\"%s had an FMOD Error Message = `%s`\"), *FunctionStr, *ErrorStr);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoAudioManager::SetMusic(UFMODEvent* NewMusic, bool bInSkipRequestDelay, float StartDelay)\n{\n\tMusicStartDelay = StartDelay;\n\tbSkipRequestDelay = bInSkipRequestDelay;\n\n\tif (NewMusic == nullptr)\n\t\treturn;\n\n\t// We are loading\n\tif (bLoadingScreenMode)\n\t{\n\t\t// Cache for when we finish loading screen\n\t\tMusicToPlayNext = NewMusic;\n\t\treturn;\n\t}\n\n\tswitch (MusicPlayerState)\n\t{\n\t\tcase ESoMusicPlayerState::Default:\n\t\t\tensure(MusicToPlayNext == nullptr);\n\n\t\t\t// Music is already playing, ignore\n\t\t\tif (NewMusic == PlayedMusic)\n\t\t\t\tbreak;\n\n\t\t\tif (PlayedMusic == nullptr)\n\t\t\t{\n\t\t\t\tensure(MusicEventInstance == nullptr);\n\n\t\t\t\t// Nothing is playing, play it now\n\t\t\t\tPlayedMusic = NewMusic;\n\t\t\t\tMusicEventInstance = StartEventInstance2D(NewMusic);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t// Something else is playing, wait for request threshold before playing\n\t\t\t\tMusicToPlayNext = NewMusic;\n\t\t\t\tMusicPlayerState = ESoMusicPlayerState::WaitForRequestThreshold;\n\t\t\t\tif (bSkipRequestDelay)\n\t\t\t\t{\n\t\t\t\t\tOnRequestThresholdOver();\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tif (UWorld* World = GetWorld())\n\t\t\t\t\t\tWorld->GetTimerManager().SetTimer(\n\t\t\t\t\t\t\tMusicTimeHandle,\n\t\t\t\t\t\t\tthis,\n\t\t\t\t\t\t\t&ThisClass::OnRequestThresholdOver,\n\t\t\t\t\t\t\tGetRequestAcceptThreshold()\n\t\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase ESoMusicPlayerState::WaitForRequestThreshold:\n\t\t\tif (PlayedMusic == NewMusic)\n\t\t\t{\n\t\t\t\t// Cancel previous play music request as we are playing the right sound\n\t\t\t\tMusicToPlayNext = nullptr;\n\t\t\t\tMusicPlayerState = ESoMusicPlayerState::Default;\n\t\t\t\tif (UWorld* World = GetWorld())\n\t\t\t\t\tWorld->GetTimerManager().ClearTimer(MusicTimeHandle);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t// Fade this music next instead of what was previously set\n\t\t\t\tMusicToPlayNext = NewMusic;\n\t\t\t\tif (bSkipRequestDelay)\n\t\t\t\t{\n\t\t\t\t\tif (UWorld* World = GetWorld())\n\t\t\t\t\t\tWorld->GetTimerManager().ClearTimer(MusicTimeHandle);\n\n\t\t\t\t\tOnRequestThresholdOver();\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase ESoMusicPlayerState::WaitForFadeOut:\n\t\t\t// Fade this music next instead of what was previously set\n\t\t\tMusicToPlayNext = NewMusic;\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tbreak;\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoAudioManager::FadeOutActiveMusic()\n{\n\tif (MusicEventInstance != nullptr)\n\t{\n\t\tMusicEventInstance->stop(FMOD_STUDIO_STOP_ALLOWFADEOUT);\n\t\tMusicEventInstance->release();\n\t\tMusicEventInstance = nullptr;\n\t\tPlayedMusic = nullptr;\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoAudioManager::StartLoadingScreenMode(UFMODEvent* LoadingScreenMusic)\n{\n\tif (bLoadingScreenMode == true && LoadingScreenMusic == PlayedMusic)\n\t\treturn;\n\n\t// Instant everything\n\tSetMusic(LoadingScreenMusic, true, 0.f);\n\tbLoadingScreenMode = true;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoAudioManager::StopLoadingScreenMode()\n{\n\tUFMODEvent* MusicToPlay = MusicToPlayNext;\n\tMusicToPlayNext = nullptr;\n\tbLoadingScreenMode = false;\n\tSetMusic(MusicToPlay, bSkipRequestDelay, GetMusicStartDelay());\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoAudioManager::OnRequestThresholdOver()\n{\n\tensure(MusicPlayerState == ESoMusicPlayerState::WaitForRequestThreshold);\n\tensure(MusicToPlayNext != nullptr);\n\tensure(MusicToPlayNext != PlayedMusic);\n\n\t// Fade out music\n\tMusicPlayerState = ESoMusicPlayerState::WaitForFadeOut;\n\tconst bool bIsInstant = FMath::IsNearlyZero(MusicStartDelay) || MusicStartDelay < 0.f;\n\n\tif (MusicEventInstance != nullptr)\n\t{\n\t\tMusicEventInstance->stop(bIsInstant ? FMOD_STUDIO_STOP_IMMEDIATE : FMOD_STUDIO_STOP_ALLOWFADEOUT);\n\t\tMusicEventInstance->release();\n\t\tMusicEventInstance = nullptr;\n\t}\n\n\tif (bIsInstant)\n\t{\n\t\t// Instant\n\t\tOnFadeOutFinished();\n\t}\n\telse\n\t{\n\t\t// Wait\n\t\tif (UWorld* World = GetWorld())\n\t\t{\n\t\t\tWorld->GetTimerManager().SetTimer(\n\t\t\t\tMusicTimeHandle,\n\t\t\t\tthis,\n\t\t\t\t&ThisClass::OnFadeOutFinished,\n\t\t\t\tGetMusicStartDelay()\n\t\t\t);\n\t\t\tPlayedMusic = nullptr;\n\t\t}\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoAudioManager::OnFadeOutFinished()\n{\n\tensure(MusicPlayerState == ESoMusicPlayerState::WaitForFadeOut && MusicToPlayNext != nullptr);\n\tensure(MusicEventInstance == nullptr);\n\tPlayedMusic = MusicToPlayNext;\n\tMusicToPlayNext = nullptr;\n\n\tif (PlayedMusic != nullptr)\n\t{\n\t\tMusicEventInstance = StartEventInstance2D(PlayedMusic);\n\n\t\tif (MusicEventInstance == nullptr)\n\t\t\tPlayedMusic = nullptr;\n\t}\n\n\tMusicPlayerState = ESoMusicPlayerState::Default;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFMOD::Studio::EventInstance* USoAudioManager::StartEventInstance2D(UFMODEvent* EventToPlay)\n{\n\tFMOD::Studio::EventInstance* Instance = nullptr;\n\n\tUWorld* ThisWorld = GEngine->GetWorldFromContextObject(this, EGetWorldErrorMode::LogAndReturnNull);\n\tif (!ThisWorld)\n\t\treturn nullptr;\n\n\tif (FMODUtils::IsWorldAudible(ThisWorld, false))\n\t{\n\t\tFMOD::Studio::EventDescription* EventDesc = IFMODStudioModule::Get().GetEventDescription(EventToPlay);\n\t\tif (EventDesc != nullptr)\n\t\t{\n\t\t\tEventDesc->createInstance(&Instance);\n\t\t\tif (Instance != nullptr)\n\t\t\t{\n\t\t\t\tFMOD_3D_ATTRIBUTES EventAttr = { { 0 } };\n\t\t\t\tFMODUtils::Assign(EventAttr, FTransform());\n\t\t\t\tInstance->set3DAttributes(&EventAttr);\n\t\t\t\tInstance->start();\n\t\t\t}\n\t\t}\n\t}\n\n\treturn Instance;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoAudioManager::CanChangePlaybackSpeedOnChannel(FMOD::Channel* Channel) const\n{\n\tif (!Channel)\n\t\treturn false;\n\n\tFMOD::Studio::System* StudioSystem = IFMODStudioModule::Get().GetStudioSystem(EFMODSystemContext::Runtime);\n\tif (!StudioSystem)\n\t\treturn false;\n\n\t// Find the parent channel group\n\tFMOD::ChannelGroup* ChannelGroup = nullptr;\n\tif (Channel->getChannelGroup(&ChannelGroup) != FMOD_OK || ChannelGroup == nullptr)\n\t\treturn false;\n\n\tif (MusicEventInstance)\n\t{\n\t\tFMOD::ChannelGroup* MusicChannelGroup = nullptr;\n\t\tLOG_IF_FMOD_ERROR(MusicEventInstance->getChannelGroup(&MusicChannelGroup));\n\t\tfor (FMOD::ChannelGroup* Group = ChannelGroup; Group != nullptr && MusicChannelGroup != nullptr; Group->getParentGroup(&Group))\n\t\t\tif (MusicChannelGroup == Group)\n\t\t\t\treturn false;\n\t}\n\n\t// Is the channel group in our ignored list?\n\tfor (TSoftObjectPtr<UFMODBus> BusPtr : PlaybackSpeedIgnoreList)\n\t{\n\t\tUFMODBus* Bus = BusPtr.Get();\n\t\tif (!IsValid(Bus))\n\t\t\tcontinue;\n\n\t\tFMOD::Studio::ID GUID = FMODUtils::ConvertGuid(Bus->AssetGuid);\n\t\tFMOD::Studio::Bus* InternalBus = nullptr;\n\t\tconst FMOD_RESULT Result = StudioSystem->getBusByID(&GUID, &InternalBus);\n\t\tLOG_IF_FMOD_ERROR(Result);\n\t\tif (Result != FMOD_OK || InternalBus == nullptr)\n\t\t\tcontinue;\n\n\t\tFMOD::ChannelGroup* BusChannelGroup;\n\t\tif (InternalBus->getChannelGroup(&BusChannelGroup) != FMOD_OK)\n\t\t\tcontinue;\n\n\t\t// Find the channel group that matches\n\t\tTSet<FMOD::ChannelGroup*> AlreadyIn;\n\t\tfor (FMOD::ChannelGroup* Group = ChannelGroup; Group != nullptr && !AlreadyIn.Contains(Group); Group->getParentGroup(&Group))\n\t\t{\n\t\t\tif (Group == BusChannelGroup)\n\t\t\t\treturn false;\n\n\t\t\tAlreadyIn.Add(Group);\n\t\t}\n\t}\n\n\treturn true;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoAudioManager::SetPlaybackSpeedOnChannel(FMOD::Channel* Channel, float PlaybackSpeed)\n{\n\tif (!Channel)\n\t\treturn false;\n\n\t//\n\t// OLD method\n\t//\n\n\tFMOD::Sound* Sound = nullptr;\n\tChannel->getCurrentSound(&Sound);\n\tif (!Sound)\n\t\treturn false;\n\n\tint32 Priority;\n\tfloat Frequency;\n\tconst FMOD_RESULT Result = Sound->getDefaults(&Frequency, &Priority);\n\tLOG_IF_FMOD_ERROR(Result);\n\tif (Result == FMOD_OK)\n\t{\n\t\tLOG_IF_FMOD_ERROR(Channel->setFrequency(Frequency * PlaybackSpeed));\n\t\treturn true;\n\t}\n\n\treturn false;\n\n\t//\n\t// NEW method\n\t//\n\n\t// // Reference Getting Started with C++ Audio programming for Game Development page 51\n\t// // https://qa.fmod.com/t/timestretch-in-realtime-with-fmod-dsp-type-pitchshift/13731\n\t//\n\t// FMOD::Studio::System* StudioSystem = IFMODStudioModule::Get().GetStudioSystem(EFMODSystemContext::Runtime);\n\t// if (!StudioSystem)\n\t// \treturn false;\n\t//\n\t// FMOD::System* System = nullptr;\n\t// StudioSystem->getLowLevelSystem(&System);\n\t// if (!System)\n\t// \treturn false;\n\t//\n\t// // Modify frequency which changes both speed and pitch\n\t// float Frequency = 0.f;\n\t//\n\t// // NOTE: if we get get frequency from the channel we can't know the defaults\n\t// // If we modify the Speed to 0.5\n\t// // The next time we get we get the frequency it will be wrong one\n\t// // Channel->getFrequency(&Frequency);\n\t// // Channel->setFrequency(Frequency * PlaybackSpeed);\n\t//\n\t// // Get default frequency from the current sound\n\t// {\n\t// \tFMOD::Sound* Sound = nullptr;\n\t// \tChannel->getCurrentSound(&Sound);\n\t// \tif (!Sound)\n\t// \t\treturn false;\n\t//\n\t// \tint32 Priority = 0;\n\t// \tconst FMOD_RESULT Result = Sound->getDefaults(&Frequency, &Priority);\n\t// \tLOG_IF_FMOD_ERROR(Result);\n\t// \tif (Result != FMOD_OK)\n\t// \t\treturn false;\n\t// }\n\t//\n\t// // Set new Frequency\n\t// {\n\t// \t// System->lockDSP();\n\t// \tconst FMOD_RESULT Result = Channel->setFrequency(Frequency * PlaybackSpeed);\n\t// \tLOG_IF_FMOD_ERROR(Result);\n\t// \tif (Result != FMOD_OK)\n\t// \t{\n\t// \t\tSystem->unlockDSP();\n\t// \t\treturn false;\n\t// \t}\n\t// \t// System->unlockDSP();\n\t// }\n\t//\n\t// if (FMath::IsNearlyEqual(PlaybackSpeed, 1.f))\n\t// {\n\t// \t// Speed is back to normal, just remove the DSP effect\n\t// \tFMOD::DSP* dsp = nullptr;\n\t// \tLOG_IF_FMOD_ERROR(Channel->getDSP(0, &dsp));\n\t// \tif (!dsp)\n\t// \t\treturn false;\n\t//\n\t// \tLOG_IF_FMOD_ERROR(Channel->removeDSP(dsp));\n\t// }\n\t// else\n\t// {\n\t// \t// Create a pitch shift DSP to get pitch back to normal by applying the inverse amount\n\t// \tFMOD::DSP* dsp = nullptr;\n\t// \t// System->lockDSP();\n\t//\n\t// \t// Try to get the currently DSP effect\n\t// \tif (Channel->getDSP(0, &dsp) != FMOD_OK)\n\t// \t{\n\t// \t\t// Create it\n\t// \t\tLOG_IF_FMOD_ERROR(System->createDSPByType(FMOD_DSP_TYPE_PITCHSHIFT, &dsp));\n\t//\n\t// \t\t// Add it\n\t// \t\tLOG_IF_FMOD_ERROR(Channel->addDSP(0, dsp));\n\t// \t}\n\t// \tif (!dsp)\n\t// \t{\n\t// \t\t//System->unlockDSP();\n\t// \t\treturn false;\n\t// \t}\n\t//\n\t// \tLOG_IF_FMOD_ERROR(dsp->setParameterFloat(FMOD_DSP_PITCHSHIFT_PITCH, 1.0f / PlaybackSpeed));\n\t// \t//LOG_IF_FMOD_ERROR(dsp->setParameterFloat(FMOD_DSP_PITCHSHIFT_FFTSIZE, 1024.f));\n\t// \t//System->unlockDSP();\n\t// }\n\t//\n\t// return true;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoAudioManager::SetPlaybackSpeedOnChannelGroupChannels(FMOD::ChannelGroup* ChannelGroup, float PlaybackSpeed)\n{\n\tif (!ChannelGroup)\n\t\treturn false;\n\n\t// Count number of channels\n\tFMOD::Channel* Channel = nullptr;\n\tint32 ChannelCount = 0;\n\tChannelGroup->getNumChannels(&ChannelCount);\n\n\t// Change speed on each channel\n\tbool bPlaybackSpeedChanged = false;\n\tfor (int32 i = 0; i < ChannelCount; ++i)\n\t{\n\t\tChannelGroup->getChannel(i, &Channel);\n\t\tif (SetPlaybackSpeedOnChannel(Channel, PlaybackSpeed))\n\t\t\tbPlaybackSpeedChanged = true;\n\t}\n\n\treturn bPlaybackSpeedChanged;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoAudioManager::SetPlaybackSpeedOnChannelGroup(FMOD::ChannelGroup* ChannelGroup, float PlaybackSpeed)\n{\n\t// Change speed of all all channels of this group\n\tbool bPlaybackSpeedChanged = false;\n\tif (SetPlaybackSpeedOnChannelGroupChannels(ChannelGroup, PlaybackSpeed))\n\t\tbPlaybackSpeedChanged = true;\n\n\t// Count number of groups\n\tint32 NestedCount = 0;\n\tChannelGroup->getNumGroups(&NestedCount);\n\n\t// Change speed of all child nested groups\n\tfor (int32 i = 0; i < NestedCount; ++i)\n\t{\n\t\tFMOD::ChannelGroup* Nested;\n\t\tChannelGroup->getGroup(i, &Nested);\n\t\tif (!Nested)\n\t\t\tcontinue;\n\n\t\tif (SetPlaybackSpeedOnChannelGroup(Nested, PlaybackSpeed))\n\t\t\tbPlaybackSpeedChanged = true;\n\t}\n\n\treturn bPlaybackSpeedChanged;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoAudioManager::SetPlaybackSpeedOnAllChannels(float PlaybackSpeed)\n{\n\tFMOD::Studio::System* StudioSystem = IFMODStudioModule::Get().GetStudioSystem(EFMODSystemContext::Runtime);\n\tif (!StudioSystem)\n\t\treturn false;\n\n\tFMOD::System* System = nullptr;\n\tStudioSystem->getLowLevelSystem(&System);\n\tif (!System)\n\t\treturn false;\n\n\tbool bPlaybackSpeedChanged = false;\n\tFMOD::Channel* Channel = nullptr;\n\tfor (int32 i = 0; System->getChannel(i, &Channel) == FMOD_OK && Channel != nullptr; ++i)\n\t{\n\t\tif (CanChangePlaybackSpeedOnChannel(Channel) || FMath::IsNearlyEqual(PlaybackSpeed, 1.f))\n\t\t{\n\t\t\tif (SetPlaybackSpeedOnChannel(Channel, PlaybackSpeed))\n\t\t\t\tbPlaybackSpeedChanged = true;\n\t\t}\n\t}\n\n\treturn bPlaybackSpeedChanged;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoAudioManager::SetPlaybackSpeedOnBus(UFMODBus* Bus, float PlaybackSpeed)\n{\n\tFMOD::Studio::System* StudioSystem = IFMODStudioModule::Get().GetStudioSystem(EFMODSystemContext::Runtime);\n\tif (StudioSystem == nullptr)\n\t\treturn false;\n\n\tFMOD::Studio::ID Guid = FMODUtils::ConvertGuid(Bus->AssetGuid);\n\tFMOD::Studio::Bus* InternalBus = nullptr;\n\tconst FMOD_RESULT Result = StudioSystem->getBusByID(&Guid, &InternalBus);\n\tLOG_IF_FMOD_ERROR(Result);\n\tif (InternalBus == nullptr || Result != FMOD_OK)\n\t\treturn false;\n\n\tFMOD::ChannelGroup* BusChannelGroup;\n\tif (InternalBus->getChannelGroup(&BusChannelGroup) == FMOD_OK)\n\t{\n\t\treturn SetPlaybackSpeedOnChannelGroup(BusChannelGroup, PlaybackSpeed);\n\t}\n\n\treturn false;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoAudioManager::UpdateAmbientParams()\n{\n\tAActor* PlayerActor = USoStaticHelper::GetPlayerCharacterAsActor(this);\n\tif (PlayerActor == nullptr)\n\t\treturn;\n\n\tconst FSoSplinePoint PlayerSplinePoint = USoStaticHelper::GetPlayerSplineLocation(this);\n\tconst ASoPlayerSpline* PlayerSpline = Cast<ASoPlayerSpline>(PlayerSplinePoint.GetSpline());\n\n\tif (PlayerSpline == nullptr)\n\t\treturn;\n\n\tauto ApplySingle = [this](const TArray<FSoAmbientParameter>& Params)\n\t{\n\t\tfor (const FSoAmbientParameter& Param : Params)\n\t\t{\n\t\t\tfor (FSoAmbientEntry& Entry : AmbientRequests)\n\t\t\t{\n\t\t\t\tif (Entry.Instance.Instance != nullptr)\n\t\t\t\t{\n\t\t\t\t\tEntry.Instance.Instance->setParameterValue(TCHAR_TO_UTF8(*Param.ParameterName.ToString()), Param.ParameterValue);\n\t\t\t\t\tif (bPrintAmbientLog)\n\t\t\t\t\t\tUE_LOG(LogSoAudioManager, Log, TEXT(\"Single applied: %s (%f)\"), *Param.ParameterName.ToString(), Param.ParameterValue);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n\n\tconst float PlayerSplineDistance = PlayerSplinePoint.GetDistance();\n\n\tconst TArray<FSoAmbientControlPoint>& ControlPoints = PlayerSpline->GetAmbientControlPoints();\n\n\tif (ControlPoints.Num() == 0)\n\t\treturn;\n\n\t// search the index of the first control point with greater spline distance\n\tint32 Index = 0;\n\tfor (; ControlPoints.IsValidIndex(Index) && ControlPoints[Index].DistanceOnSpline < PlayerSplineDistance; ++Index);\n\n\tif (!ControlPoints.IsValidIndex(Index))\n\t{\n\t\tApplySingle(ControlPoints.Last(0).Parameters);\n\t\treturn;\n\t}\n\n\tif (Index == 0)\n\t{\n\t\tApplySingle(ControlPoints[0].Parameters);\n\t\treturn;\n\t}\n\n\tconst FSoAmbientControlPoint& Param0 = ControlPoints[Index - 1];\n\tconst FSoAmbientControlPoint& Param1 = ControlPoints[Index];\n\n\tconst FVector PlayerLocation = PlayerActor->GetActorLocation();\n\tconst FVector2D BA = FVector2D(Param1.Location - Param0.Location);\n\n\tconst FVector2D P = FVector2D(PlayerLocation);\n\n\tconst FVector2D PA = P - FVector2D(Param0.Location);\n\tconst FVector2D BA_Normalized = BA.GetSafeNormal();\n\n\tconst float PAProjectedSize = (PA | BA_Normalized);\n\tconst FVector2D PAProjected = BA_Normalized * PAProjectedSize;\n\n\tconst FVector Projected = FVector((FVector2D(Param0.Location) + PAProjected), PlayerLocation.Z);\n\t// DrawDebugLine(GetWorld(), FVector(FVector2D(Param1.Location), PlayerLocation.Z), Projected, FColor::Blue);\n\t// DrawDebugLine(GetWorld(), FVector(FVector2D(Param0.Location), PlayerLocation.Z), Projected, FColor::Green);\n\t// DrawDebugLine(GetWorld(), PlayerLocation, Projected, FColor::Red);\n\n\t// same direction, B is closer\n\tif (PAProjectedSize < 0.0f)\n\t{\n\t\tApplySingle(Param1.Parameters);\n\t\treturn;\n\t}\n\n\tconst float ABSize = BA.Size();\n\n\t// same direction, B is closer\n\tif (PAProjectedSize > ABSize)\n\t{\n\t\tApplySingle(Param0.Parameters);\n\t\treturn;\n\t}\n\n\tconst float SecondWeight = PAProjectedSize / ABSize;\n\tconst float FirstWeight = 1.0f - SecondWeight;\n\n\tauto GetValueFromParams = [](const TArray<FSoAmbientParameter>& Params, FName ParamName, float& OutValue) -> bool\n\t{\n\t\tfor (auto& Param : Params)\n\t\t\tif (Param.ParameterName == ParamName)\n\t\t\t{\n\t\t\t\tOutValue = Param.ParameterValue;\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\treturn false;\n\t};\n\n\t// add all from first\n\tTArray<FSoAmbientParameter> MergedParams;\n\tfor (const FSoAmbientParameter& Param : Param0.Parameters)\n\t{\n\t\tFSoAmbientParameter& NewParam = MergedParams.Add_GetRef(Param);\n\n\t\tfloat OtherParam = 0.0f;\n\t\tif (GetValueFromParams(Param1.Parameters, Param.ParameterName, OtherParam))\n\t\t\tNewParam.ParameterValue = Param.ParameterValue * FirstWeight + OtherParam * SecondWeight;\n\t}\n\n\t// add from second which is only in second\n\tfor (const FSoAmbientParameter& Param : Param1.Parameters)\n\t{\n\t\tfloat OtherParam = 0.0f;\n\t\tif (!GetValueFromParams(Param1.Parameters, Param.ParameterName, OtherParam))\n\t\t\tMergedParams.Add(Param);\n\t}\n\n\tfor (FSoAmbientEntry& Entry : AmbientRequests)\n\t{\n\t\tif (Entry.Instance.Instance != nullptr)\n\t\t{\n\t\t\tfor (const FSoAmbientParameter& Param : MergedParams)\n\t\t\t{\n\t\t\t\tEntry.Instance.Instance->setParameterValue(TCHAR_TO_UTF8(*(Param.ParameterName.ToString())), Param.ParameterValue);\n\t\t\t\tif (bPrintAmbientLog)\n\t\t\t\t\tUE_LOG(LogSoAudioManager, Log, TEXT(\"Mixed applied: %s (%f)\"), *Param.ParameterName.ToString(), Param.ParameterValue);\n\t\t\t}\n\t\t}\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nfloat USoAudioManager::GetRequestAcceptThreshold() const\n{\n\treturn USoDateTimeHelper::NormalizeTime(RequestAcceptThreshold);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nfloat USoAudioManager::GetMusicStartDelay() const\n{\n\treturn USoDateTimeHelper::NormalizeTime(MusicStartDelay);\n}\n"
  },
  {
    "path": "Source/SOrb/Basic/SoAudioManager.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#pragma once\n\n#include \"UObject/Object.h\"\n#include \"FMODBlueprintStatics.h\"\n\n#include \"CharacterBase/SoIMortalTypes.h\"\n\n#include \"SoAudioManager.generated.h\"\n\n\nDECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FSoPlaybackSpeedChanged, float, NewPlaybackSpeed);\n\nclass UFMODEvent;\nclass UFMODVCA;\nclass UFMODBus;\n\nnamespace FMOD\n{\n\tclass Channel;\n}\n\nnamespace FMOD\n{\n\tnamespace Studio\n\t{\n\t\tclass EventInstance;\n\t}\n}\n\nUENUM()\nenum class ESoMusicPlayerState : uint8\n{\n\t// Single track is playing or none\n\tDefault = 0,\n\n\t// A new track is requested to be played, but we wait a few sec before actually starting to play it to avoid starting/stopping music all the time\n\tWaitForRequestThreshold,\n\n\t// Fade out is requested on the old track, once it's done we start a new one with fade\n\tWaitForFadeOut\n};\n\nUSTRUCT()\nstruct FSoAmbientEntry\n{\n\tGENERATED_USTRUCT_BODY()\npublic:\n\n\tUPROPERTY()\n\tUFMODEvent* Event = nullptr;\n\n\tUPROPERTY()\n\tFFMODEventInstance Instance;\n\n\tint32 RequestCount = 0;\n};\n\n#define LOG_IF_FMOD_ERROR(_ResultCall)                               \\\n\t{                                                                \\\n\t\tconst FMOD_RESULT _Result = _ResultCall;                     \\\n\t\tif (_Result != FMOD_OK)                                      \\\n\t\t{                                                            \\\n\t\t\tUSoAudioManager::LogFMODError(_Result, __FUNCTION__);    \\\n\t\t}                                                            \\\n\t}\n\n\nUCLASS(Blueprintable, BlueprintType)\nclass SORB_API USoAudioManager : public UObject\n{\n\tGENERATED_BODY()\npublic:\n\tUSoAudioManager(const FObjectInitializer& ObjectInitializer);\n\t~USoAudioManager();\n\n\tvoid Initialize();\n\n\t// Simulate tick\n\tvoid Tick(float DeltaSeconds);\n\tvoid Shutdown();\n\n\tUFUNCTION(BlueprintPure, DisplayName = \"Get So Audio Manager\", Category = \">Audio\", meta = (WorldContext = \"WorldContextObject\"))\n\tstatic USoAudioManager* GetInstance(const UObject* WorldContextObject);\n\tstatic USoAudioManager& Get(const UObject* WorldContextObject)\n\t{\n\t\tcheck(IsValid(WorldContextObject));\n\t\tauto* Instance = GetInstance(WorldContextObject);\n\t\tcheck(IsValid(Instance));\n\t\treturn *Instance;\n\t}\n\n\tUFUNCTION(BlueprintPure, DisplayName = \"Get So Audio Manager From Object\", Category = \">Audio\")\n\tstatic USoAudioManager* GetInstanceFromObject(const UObject* Object) { return GetInstance(Object); }\n\n\t// Adds/removes ambient request\n\tUFUNCTION(BlueprintCallable, meta = (WorldContext = \"WorldContextObject\"))\n\tstatic void RegisterAmbient(UObject* WorldContextObject, const TArray<UFMODEvent*>& Events, bool bAdd);\n\n\t// Enables/disables stopping/starting sfx based on requests\n\tUFUNCTION(BlueprintCallable, Category = \">Audio|FMOD\")\n\tvoid SetAmbientFreeze(bool bFreeze);\n\n\tUFUNCTION(BlueprintPure, Category = \">Audio|FMOD\")\n\tstatic bool IsComponentPlaying(UFMODAudioComponent* Component);\n\n\tUFUNCTION(BlueprintCallable, Category = \">Audio|FMOD\")\n\tstatic void PlayComponentIfNotPlaying(UFMODAudioComponent* Component);\n\n\t/**\n\t * Plays an event.  This returns an FMOD Event Instance. The sound does not travel with any actor.\n\t * NOTE: Proxy method for UFMODBlueprintStatics::PlayEvent2D\n\t *\n\t * @param Event - event to play\n\t * @param bAutoPlay - Start the event automatically.\n\t */\n\tUFUNCTION(BlueprintCallable, Category = \">Audio|FMOD\",\n\t\tmeta = (HidePin = \"WorldContextObject\", DefaultToSelf = \"WorldContextObject\", AdvancedDisplay = \"2\", UnsafeDuringActorConstruction = \"true\"))\n\tstatic FFMODEventInstance PlaySound2D(UObject* WorldContextObject, UFMODEvent* Event, bool bAutoPlay = true);\n\n\t/**\n\t * Plays an event at the given location. This returns an FMOD Event Instance.  The sound does not travel with any actor.\n\t * NOTE: Proxy method for UFMODBlueprintStatics::PlayEventAtLocation\n\t *\n\t * @param Event - event to play\n\t * @param Location - World position to play event at\n\t * @param bAutoPlay - Start the event automatically.\n\t */\n\tUFUNCTION(BlueprintCallable, Category = \">Audio|FMOD\",\n\t\tmeta = (HidePin = \"WorldContextObject\", DefaultToSelf = \"WorldContextObject\", AdvancedDisplay = \"2\",  UnsafeDuringActorConstruction = \"true\"))\n\tstatic FFMODEventInstance PlaySoundAtLocation(UObject* WorldContextObject, UFMODEvent* Event, const FTransform& Location, bool bAutoPlay = true);\n\n\t/**\n\t * Plays an event attached to and following the specified component.\n\t * NOTE: Proxy method for UFMODBlueprintStatics::PlayEventAttached\n\t *\n\t * @param Event - event to play\n\t * @param AttachComponent - Component to attach to.\n\t * @param AttachPointName - Optional named point within the AttachComponent to play the sound at\n\t * @param Location - Depending on the value of Location Type this is either a relative offset from the attach component/point or an absolute world position that will be translated to a relative offset\n\t * @param LocationType - Specifies whether Location is a relative offset or an absolute world position\n\t * @param bStopWhenAttachedToDestroyed - Specifies whether the sound should stop playing when the owner of the attach to component is destroyed.\n\t * @param bAutoPlay - Start the event automatically.\n\t * @param bAutoDestroy - Automatically destroy the audio component when the sound is stopped.\n\t */\n\tUFUNCTION(BlueprintCallable, Category = \">Audio|FMOD\", meta = (AdvancedDisplay = \"2\", UnsafeDuringActorConstruction = \"true\"))\n\tstatic UFMODAudioComponent* PlaySoundAttached(\n\t\tUFMODEvent* Event,\n\t\tUSceneComponent* AttachToComponent,\n\t\tFName AttachPointName,\n\t\tFVector Location,\n\t\tEAttachLocation::Type LocationType,\n\t\tbool bStopWhenAttachedToDestroyed = false,\n\t\tbool bAutoPlay = true,\n\t\tbool bAutoDestroy = true\n\t);\n\n\n\t/**\n\t * Returns whether this FMOD Event Instance is valid.  The instance will be invalidated when the sound stops.\n\t * NOTE: Reimplementation UFMODBlueprintStatics::EventInstanceIsValid\n\t *\n\t * @param EventInstance - Event instance\n\t */\n\tUFUNCTION(BlueprintPure, Category = \">Audio|FMOD|SoundInstance\", meta = (UnsafeDuringActorConstruction = \"true\"))\n\tstatic bool IsSoundInstanceValid(FFMODEventInstance SoundInstance);\n\n\t/**\n\t * Plays an FMOD Event Instance.\n\t * NOTE: Reimplementation UFMODBlueprintStatics::EventInstancePlay\n\t *\n\t * @param EventInstance - Event instance\n\t */\n\tUFUNCTION(BlueprintCallable, Category = \">Audio|FMOD|SoundInstance\", meta = (UnsafeDuringActorConstruction = \"true\"))\n\tstatic void SoundInstancePlay(FFMODEventInstance SoundInstance);\n\n\t/**\n\t * Stop an FMOD Event Instance.\n\t * NOTE: Reimplementation UFMODBlueprintStatics::EventInstanceStop\n\t *\n\t * @param EventInstance - Event instance\n\t * @param Release - Whether to release the Event Instance\n\t */\n\tUFUNCTION(BlueprintCallable, Category = \">Audio|FMOD|SoundInstance\", meta = (UnsafeDuringActorConstruction = \"true\"))\n\tstatic bool SoundInstanceStop(FFMODEventInstance SoundInstance, bool Release = false);\n\n\t/**\n\t * Pause/resume an FMOD Event Instance.\n\t *\n\t * @param EventInstance - Event instance\n\t * @param bPaused - Whether to pause or resume the event\n\t */\n\tUFUNCTION(BlueprintCallable, Category = \">Audio|FMOD|SoundInstance\", meta = (UnsafeDuringActorConstruction = \"true\"))\n\tstatic bool SoundInstancePause(FFMODEventInstance SoundInstance, bool bPaused);\n\n\t/**\n\t * Release an FMOD Event Instance.\n\t * NOTE: Reimplementation UFMODBlueprintStatics::EventInstanceRelease\n\t *\n\t * @param EventInstance - Event instance\n\t */\n\tUFUNCTION(BlueprintCallable, Category = \">Audio|FMOD|SoundInstance\", meta = (UnsafeDuringActorConstruction = \"true\"))\n\tstatic void SoundInstanceRelease(FFMODEventInstance SoundInstance);\n\n\t// returns with the length of the sound event in seconds\n\tUFUNCTION(BlueprintCallable, Category = \">Audio|FMOD\")\n\tstatic float GetSoundLengthSeconds(UFMODEvent* Sound);\n\n\tUFUNCTION(BlueprintPure, Category = \">Audio|FMOD|HitReact\")\n\tstatic UFMODEvent* SelectHitReactSFX(\n\t\tAActor* Mortal,\n\t\tconst FSoHitReactDesc& HitReact,\n\t\tUFMODEvent* SFX,\n\t\tUFMODEvent* SFXOnDeath,\n\t\tUFMODEvent* SFXEnemy\n\t);\n\n\tUFUNCTION(BlueprintCallable, Category = \">Audio|FMOD|HitReact\", meta = (HidePin = \"WorldContextObject\", DefaultToSelf = \"WorldContextObject\"))\n\tstatic void PlayHitReactSFX(\n\t\tUObject* WorldContextObject,\n\t\tAActor* Mortal,\n\t\tconst FTransform& WorldTransform,\n\t\tconst FSoHitReactDesc& HitReact,\n\t\tUFMODEvent* SFX,\n\t\tUFMODEvent* SFX2D,\n\t\tUFMODEvent* SFXOnDeath,\n\t\tUFMODEvent* SFXEnemy\n\t);\n\n\t// VCA: player volume controller\n\tstatic bool SetVolume(UFMODVCA* VCA, float Volume);\n\tstatic bool GetVolume(UFMODVCA* VCA, float& OutVolume);\n\n\t// Mute state\n\tstatic void MuteAudio();\n\tstatic void UnMuteAudio();\n\tstatic bool IsAudioMuted();\n\n\t// Sets the volume for the different sound classes, note the volume is usually normalized in the value [0.f, 1.f] but it can go higher  or lower\n\t// Buy why do you need to do that?\n\tstatic void SetVolumeMaster(float Volume);\n\tstatic void SetVolumeMusic(float Volume);\n\tstatic void SetVolumeSFX(float Volume);\n\n\t// Gets the volume of the different sound classes from their volume sound mixer override\n\tstatic float GetVolumeMaster();\n\tstatic float GetVolumeMusic();\n\tstatic float GetVolumeSFX();\n\n\t// Pause/Unpause all menu buses\n\tstatic void SetPausedMenuBuses(bool bOpened);\n\n\tstatic void LogFMODError(FMOD_RESULT Result, const char* Function);\n\n\t/**\n\t * Sets the new played music\n\t * if bSkipRequestDelay is true, old music fade out starts and the new music is started after StartDelay time\n\t * if bSkipRequestDelay is false, RequestAcceptThreshold time is waited before the process starts, meanwhile the music can change again\n\t */\n\tvoid SetMusic(UFMODEvent* NewMusic, bool bSkipRequestDelay, float StartDelay = 0.5f);\n\n\t// fade out time is hardcoded to events right now (0.5s)\n\tvoid FadeOutActiveMusic();\n\n\tvoid StartLoadingScreenMode(UFMODEvent* LoadingScreenMusic);\n\tvoid StopLoadingScreenMode();\n\tconst UFMODEvent* GetCurrentlyPlayingMusic() const { return PlayedMusic;  }\n\n\tvoid SetMusicRestartParams(float MinWaitTime, float MaxWaitTime)\n\t{\n\t\tMinWaitBeforeMusicRestart = MinWaitTime;\n\t\tMaxWaitBeforeMusicRestart = MaxWaitTime;\n\t}\n\n\tvoid SetPlaybackSpeedIgnoreList(const TArray<TSoftObjectPtr<UFMODBus>>& BusList)\n\t{\n\t\tPlaybackSpeedIgnoreList = BusList;\n\t}\n\n\tUFUNCTION(BlueprintCallable)\n\tbool SetPlaybackSpeedOnBus(UFMODBus* Bus, float PlaybackSpeed);\n\n\tUFUNCTION(BlueprintCallable)\n\tvoid SetPlaybackSpeed(float Speed, float ChangeTime)\n\t{\n\t\tSourcePlaybackSpeed = TargetPlaybackSpeed;\n\t\tTargetPlaybackSpeed = Speed;\n\t\tPlaybackSpeedCounter = 0.0f;\n\t\tPlaybackSpeedChangeDuration = ChangeTime;\n\t}\n\n\tvoid TogglePrintAmbientLog()\n\t{\n\t\tbPrintAmbientLog = !bPrintAmbientLog;\n\t}\n\n\tfloat GetRequestAcceptThreshold() const;\n\tfloat GetMusicStartDelay() const;\n\nprotected:\n\n\tUFUNCTION()\n\tvoid OnRequestThresholdOver();\n\n\tUFUNCTION()\n\tvoid OnFadeOutFinished();\n\n\t// Starts the event instance without releasing the pointer it returns with\n\tFMOD::Studio::EventInstance* StartEventInstance2D(UFMODEvent* EventToPlay);\n\n\tstatic bool SetPlaybackSpeedOnChannel(FMOD::Channel* Channel, float PlaybackSpeed);\n\tstatic bool SetPlaybackSpeedOnChannelGroupChannels(FMOD::ChannelGroup* ChannelGroup, float PlaybackSpeed);\n\tstatic bool SetPlaybackSpeedOnChannelGroup(FMOD::ChannelGroup* ChannelGroup, float PlaybackSpeed);\n\tbool SetPlaybackSpeedOnAllChannels(float PlaybackSpeed);\n\tbool CanChangePlaybackSpeedOnChannel(FMOD::Channel* Channel) const;\n\n\tvoid UpdateAmbientParams();\n\nprotected:\n\n\t//\n\t// Audio\n\t//\n\n\tFMOD::Studio::EventInstance* MusicEventInstance = nullptr;\n\n\t// Currently played music\n\tUPROPERTY()\n\tUFMODEvent* PlayedMusic = nullptr;\n\n\t// Music to play next\n\tUPROPERTY()\n\tUFMODEvent* MusicToPlayNext = nullptr;\n\n\tUPROPERTY(EditAnywhere, Category = Music)\n\tfloat MusicStartDelay = 0.5f;\n\n\t// New music is only started after x time on request, change can be interrupted if it is resetted to default\n\tUPROPERTY(EditAnywhere, Category = Music)\n\tfloat RequestAcceptThreshold = 3.0f;\n\n\t// Map from sound unique identifier => seconds time since last used\n\tUPROPERTY()\n\tTMap<uint32, float> Sounds2DTimeSinceLastUsedMap;\n\n\t// Current state of the play music transition\n\tUPROPERTY()\n\tESoMusicPlayerState MusicPlayerState = ESoMusicPlayerState::Default;\n\n\t// Time handle to trigger fade out\n\tUPROPERTY()\n\tFTimerHandle MusicTimeHandle;\n\n\t// Last set by  SetMusic\n\tUPROPERTY()\n\tbool bSkipRequestDelay = false;\n\n\t// Special mode\n\tUPROPERTY()\n\tbool bLoadingScreenMode = false;\n\n\tUPROPERTY()\n\tTArray<FSoAmbientEntry> AmbientRequests;\n\n\tbool bAmbientFreeze = false;\n\n\tfloat MusicRestartCounter = -1.0f;\n\tfloat MaxWaitBeforeMusicRestart = 0.f;\n\tfloat MinWaitBeforeMusicRestart = 0.f;\n\n\tbool bPrintAmbientLog = false;\n\n\t// For changing playback speed\n\tfloat SourcePlaybackSpeed = 1.0f;\n\tfloat TargetPlaybackSpeed = 1.0f;\n\n\tfloat PlaybackSpeedCounter = 0.f;\n\tfloat PlaybackSpeedChangeDuration = 0.f;\n\n\tUPROPERTY()\n\tTArray<TSoftObjectPtr<UFMODBus>> PlaybackSpeedIgnoreList;\n\n\tUPROPERTY(BlueprintAssignable)\n\tFSoPlaybackSpeedChanged OnPlaybackSpeedChanged;\n};\n"
  },
  {
    "path": "Source/SOrb/Basic/SoBlueprintTypes.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#pragma once\n\n#include \"CoreMinimal.h\"\n#include \"SoBlueprintTypes.generated.h\"\n\n// Because I don't trust in BP structs\nclass UMaterialInstance;\n\n\n/**\n * used to overwrite materials inside spline meshes\n */\nUSTRUCT(BlueprintType, Blueprintable)\nstruct FSoMaterialSlotOverride\n{\n\tGENERATED_USTRUCT_BODY()\npublic:\n\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere)\n\tint32 MeshIndex;\n\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere)\n\tint32 MaterialSlotIndex;\n\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere)\n\tUMaterialInstance* Material;\n};\n\n\n\nUSTRUCT(BlueprintType, Blueprintable)\nstruct FSoMovementOverrideEntry\n{\n\tGENERATED_USTRUCT_BODY()\n\npublic:\n\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere)\n\tfloat MovementSpeed;\n\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere)\n\tfloat Duration;\n};\n"
  },
  {
    "path": "Source/SOrb/Basic/SoCheatManager.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#include \"SoCheatManager.h\"\n#include \"Basic/SoGameInstance.h\"\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoCheatManager::AllowCheats() const\n{\n\tif (const auto* GameInstance = USoGameInstance::GetInstance(this))\n\t\treturn GameInstance->AllowCheats();\n\n\treturn false;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoCheatManager::IsAllowCheatsPasswordValid(const FString& UserPassword)\n{\n#ifndef WARRIORB_PASSWORD_ENABLE_CONSOLE_CHEATS\n#error \"WARRIORB_PASSWORD_ENABLE_CONSOLE_CHEATS is not set in the SOrb.Build.cs file\"\n#endif // !WARRIORB_BUILD_VERSION\n\tstatic const FString CheatsPassword(TEXT(WARRIORB_PASSWORD_ENABLE_CONSOLE_CHEATS));\n\treturn CheatsPassword.Equals(UserPassword, ESearchCase::CaseSensitive);\n}\n"
  },
  {
    "path": "Source/SOrb/Basic/SoCheatManager.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#pragma once\n#include \"CoreMinimal.h\"\n\n#include \"GameFramework/CheatManager.h\"\n\n#include \"SoCheatManager.generated.h\"\n\nclass AActor;\nclass APawn;\n\nUCLASS()\nclass USoCheatManager : public UCheatManager\n{\n\tGENERATED_BODY()\n\npublic:\n\n\t//\n\t// UCheatManager interface\n\t//\n\n\tvoid Fly() override\n\t{\n\t\tif (AllowEngineCheats())\n\t\t\tSuper::Fly();\n\t}\n\tvoid Walk() override\n\t{\n\t\tif (AllowEngineCheats())\n\t\t\tSuper::Walk();\n\t}\n\tvoid Ghost() override\n\t{\n\t\tif (AllowEngineCheats())\n\t\t\tSuper::Ghost();\n\t}\n\tvoid God() override\n\t{\n\t\tif (AllowEngineCheats())\n\t\t\tSuper::God();\n\t}\n\tvoid DamageTarget(float DamageAmount) override\n\t{\n\t\tif (AllowEngineCheats())\n\t\t\tSuper::DamageTarget(DamageAmount);\n\t}\n\tvoid DestroyTarget() override\n\t{\n\t\tif (AllowEngineCheats())\n\t\t\tSuper::DestroyTarget();\n\t}\n\tvoid DestroyAll(TSubclassOf<AActor> aClass) override\n\t{\n\t\tif (AllowEngineCheats())\n\t\t\tSuper::DestroyAll(aClass);\n\t}\n\tvoid DestroyAllPawnsExceptTarget() override\n\t{\n\t\tif (AllowEngineCheats())\n\t\t\tSuper::DestroyAllPawnsExceptTarget();\n\t}\n\tvoid DestroyPawns(TSubclassOf<APawn> aClass) override\n\t{\n\t\tif (AllowEngineCheats())\n\t\t\tSuper::DestroyPawns(aClass);\n\t}\n\tvoid Summon(const FString& ClassName) override\n\t{\n\t\tif (AllowEngineCheats())\n\t\t\tSuper::Summon(ClassName);\n\t}\n\tvoid PlayersOnly() override\n\t{\n\t\tif (AllowEngineCheats())\n\t\t\tSuper::PlayersOnly();\n\t}\n\tvoid Teleport() override\n\t{\n\t\tif (AllowEngineCheats())\n\t\t\tSuper::Teleport();\n\t}\n\n\n\t//\n\t// Own methods\n\t//\n\n\tbool AllowCheats() const;\n\tbool AllowEngineCheats() const { return true; }\n\n\t// Matches WARRIORB_PASSWORD_ENABLE_CONSOLE_CHEATS?\n\tstatic bool IsAllowCheatsPasswordValid(const FString& UserPassword);\n};\n"
  },
  {
    "path": "Source/SOrb/Basic/SoCollisionChannels.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#pragma once\n\n#include \"Engine/EngineTypes.h\"\n\n// Proper alias the collision channels\nstatic constexpr ECollisionChannel ECC_Projectile = ECollisionChannel::ECC_GameTraceChannel1;\nstatic constexpr ECollisionChannel ECC_CharacterLogic = ECollisionChannel::ECC_GameTraceChannel2;\nstatic constexpr ECollisionChannel ECC_SplineMoverLogic = ECollisionChannel::ECC_GameTraceChannel3;\nstatic constexpr ECollisionChannel ECC_Weapon = ECollisionChannel::ECC_GameTraceChannel4;\nstatic constexpr ECollisionChannel ECC_Hide = ECollisionChannel::ECC_GameTraceChannel5;\nstatic constexpr ECollisionChannel ECC_TriggerProjectile = ECollisionChannel::ECC_GameTraceChannel6;\nstatic constexpr ECollisionChannel ECC_TestStone = ECollisionChannel::ECC_GameTraceChannel7;\nstatic constexpr ECollisionChannel ECC_PawnOverlapChar = ECollisionChannel::ECC_GameTraceChannel8;\n"
  },
  {
    "path": "Source/SOrb/Basic/SoConsoleCommands.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#include \"SoConsoleCommands.h\"\n#include \"Components/SplineComponent.h\"\n#include \"HAL/IConsoleManager.h\"\n#include \"EngineUtils.h\"\n#include \"Kismet/GameplayStatics.h\"\n#include \"RenderCore/Public/RendererInterface.h\"\n#include \"EngineModule.h\"\n#include \"Components/SkeletalMeshComponent.h\"\n\n#include \"DlgManager.h\"\n\n#include \"CharacterBase/SoMortal.h\"\n#include \"Basic/Helpers/SoStaticHelper.h\"\n#include \"Basic/SoGameInstance.h\"\n#include \"Basic/SoGameMode.h\"\n#include \"SplineLogic/SoPlayerSpline.h\"\n#include \"Character/SoCharacter.h\"\n#include \"Character/SoCharStates/SoADead.h\"\n#include \"Character/SoCharStates/SoAStrike.h\"\n#include \"Character/SoCharStates/SoADefault.h\"\n#include \"Character/SoCharStates/SoATeleport.h\"\n#include \"Character/SoCharStates/SoALillian.h\"\n#include \"Character/SoCharStates/SoAInUI.h\"\n#include \"Character/SoPlayerCharacterSheet.h\"\n#include \"CharacterBase/SoCombatComponent.h\"\n#include \"CharacterBase/SoCharacterMovementComponent.h\"\n#include \"Items/ItemTemplates/SoQuestItemTemplate.h\"\n#include \"Items/ItemTemplates/SoItemTemplateQuestBook.h\"\n#include \"Items/ItemTemplates/SoItemTemplateJewelry.h\"\n#include \"Items/ItemTemplates/SoUsableItemTemplate.h\"\n#include \"Items/ItemTemplates/SoItemTemplateShard.h\"\n#include \"Items/ItemTemplates/SoWeaponTemplate.h\"\n#include \"Items/ItemTemplates/SoItemTemplateRuneStone.h\"\n#include \"Enemy/SoEnemy.h\"\n#include \"SplineLogic/SoLocationRegistry.h\"\n#include \"SplineLogic/SoPrecomputedVisibility.h\"\n#include \"Levels/SoLevelHelper.h\"\n#include \"Items/SoInventoryComponent.h\"\n#include \"Items/SoItem.h\"\n#include \"Settings/SoGameSettings.h\"\n#include \"Levels/SoLevelManager.h\"\n#include \"Online/Achievements/SoAchievementManager.h\"\n#include \"Basic/SoAudioManager.h\"\n#include \"Character/SoPlayerController.h\"\n#include \"Basic/SoGameSingleton.h\"\n#include \"SaveFiles/SoWorldState.h\"\n\n#if WARRIORB_WITH_STEAM\n#include \"NYSteamHelper.h\"\n#include \"INotYetSteamModule.h\"\n#endif // WARRIORB_WITH_STEAM\n\n#include \"Online/SoOnlineHelper.h\"\n#include \"Helpers/SoPlatformHelper.h\"\n#include \"Items/SoItemHelper.h\"\n#include \"Settings/Input/SoInputHelper.h\"\n#include \"HAL/PlatformOutputDevices.h\"\n#include \"Levels/SoEpisodeLevelTypes.h\"\n\nDEFINE_LOG_CATEGORY_STATIC(LogSoConsoleCommands, All, All)\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSoSplineConsoleCommand::PerformTeleportToSpline(const TArray<FString>& Args)\n{\n\tif (!IsValid())\n\t\treturn;\n\n\tASoCharacter* Character = USoStaticHelper::GetPlayerCharacterAsSoCharacter(Spline->GetWorld());\n\tif (Character == nullptr)\n\t\treturn;\n\n\tfloat Distance = 0.0f;\n\tif (Args.Num() > 0)\n\t\tDistance = FMath::Clamp(FCString::Atof(*Args[0]), 0.0f, Spline->GetSplineComponent()->GetSplineLength());\n\n\tfloat ZValue = Spline->GetActorLocation().Z;\n\tif (Args.Num() > 1)\n\t\tZValue += FMath::Clamp(FCString::Atof(*Args[1]), -100000.0f, 100000.0f);\n\n\tconst FSoSplinePoint Point{ Spline.Get(), Distance };\n\n\t// Wait for all levels to load.\n\t// SoLevelManager::Get().ClaimSplineLocation(Point);\n\t// while (SoLevelManager::IsAnyLevelLoading(Spline->GetWorld()));\n\n\tCharacter->SoATeleport->SetupTeleport(Point, ZValue, false, false);\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// FSoConsoleCommandSetCharVariable\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nconst FString FSoConsoleCommandSetCharVariable::CommandNames[static_cast<int32>(ESoCharVariableCommand::ECVC_NumOf)] =\n{\n\t\"SO.SetInt\",\t\t// ECVC_SetInt,\n\t\"SO.SetFloat\",\t\t// ECVC_SetFloat,\n\t\"SO.SetBool\",\t\t// ECVC_SetBool,\n\t\"SO.SetName\",\t\t// ECVC_SetName,\n};\n\nconst FString FSoConsoleCommandSetCharVariable::HelperTexts[static_cast<int32>(ESoCharVariableCommand::ECVC_NumOf)] =\n{\n\t\"Sets an int variable (SoPlayerCharacterSheet)\",\n\t\"Sets a float variable (SoPlayerCharacterSheet)\",\n\t\"Sets a bool variable (SoPlayerCharacterSheet)\",\n\t\"Sets a name variable (SoPlayerCharacterSheet)\",\n};\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFSoConsoleCommandSetCharVariable::FSoConsoleCommandSetCharVariable(TWeakObjectPtr<AActor> Reference,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t   ESoCharVariableCommand Cmd,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t   FName Variable) :\n\tReferenceActor(Reference),\n\tCommand(Cmd),\n\tVariableName(Variable)\n{\n\tCommandName = CommandNames[static_cast<int32>(Cmd)] + \".\" + Variable.ToString();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFSoConsoleCommandSetCharVariable::FSoConsoleCommandSetCharVariable(TWeakObjectPtr<AActor> Reference,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t   ESoCharVariableCommand Cmd) :\n\tReferenceActor(Reference),\n\tCommand(Cmd),\n\tbVariableNameIsStringParam(true)\n{\n\tCommandName = CommandNames[static_cast<int32>(Cmd)];\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSoConsoleCommandSetCharVariable::ChangeCharVariable(const TArray<FString>& Args)\n{\n\tif (!ReferenceActor.IsValid())\n\t\treturn;\n\n\tASoCharacter* Char = USoStaticHelper::GetPlayerCharacterAsSoCharacter(ReferenceActor.Get());\n\tif (Char == nullptr)\n\t\treturn;\n\n\tUSoPlayerCharacterSheet* SoSheet = Char->GetPlayerCharacterSheet();\n\tif (SoSheet == nullptr)\n\t\treturn;\n\n\tconst int32 ValueIndex = bVariableNameIsStringParam ? 1 : 0;\n\tif (bVariableNameIsStringParam)\n\t{\n\t\tif (Args.Num() == 0)\n\t\t{\n\t\t\tUE_LOG(LogSoConsoleCommands, Warning, TEXT(\"Failed to execute command: missing argument(s)!\"));\n\t\t\treturn;\n\t\t}\n\t\tVariableName = FName(*Args[0]);\n\t}\n\n\tswitch (Command)\n\t{\n\tcase ESoCharVariableCommand::ECVC_SetInt:\n\t\t\tSoSheet->SetIntValue(VariableName, Args.IsValidIndex(ValueIndex) ? FCString::Atoi(*Args[ValueIndex]) : 0);\n\t\t\tbreak;\n\n\tcase ESoCharVariableCommand::ECVC_SetFloat:\n\t\t\tSoSheet->SetFloatValue(VariableName, Args.IsValidIndex(ValueIndex) ? FCString::Atof(*Args[ValueIndex]) : 0.0f);\n\t\t\tbreak;\n\n\tcase ESoCharVariableCommand::ECVC_SetName:\n\t\t\tSoSheet->SetNameValue(VariableName, Args.IsValidIndex(ValueIndex) ? FName(*Args[ValueIndex]) : NAME_None);\n\t\t\tbreak;\n\n\tcase ESoCharVariableCommand::ECVC_SetBool:\n\t\t\tSoSheet->SetBoolValue(VariableName, Args.IsValidIndex(ValueIndex) ? FCString::ToBool(*Args[ValueIndex]) : true);\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tbreak;\n\t}\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// FSoConsoleCommandAchievement\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nconst FString FSoConsoleCommandAchievement::CommandNames[static_cast<int32>(ESoConsoleCommandAchievementType::NumOf)] =\n{\n\t\"SO.Achievements.Unlock\",\n\t\"SO.Achievements.Reset\",\n\t\"SO.Achievements.Show\",\n\t\"SO.Achievements.SetProgress\"\n};\n\nconst FString FSoConsoleCommandAchievement::HelperTexts[static_cast<int32>(ESoConsoleCommandAchievementType::NumOf)] =\n{\n\t\"Mark the achievement as achieved\",\n\t\"Reset the achievement aka lock it (Only works in non shipping)\",\n\t\"Shows the user a pop-up notification with the current progress of an achievement.\",\n\t\"Sets the progress of this achievement (NOTE: only works for achievemnts that have progress)\"\n};\n\nFSoConsoleCommandAchievement::FSoConsoleCommandAchievement(TWeakObjectPtr<AActor> Reference, FName InAchievementName, ESoConsoleCommandAchievementType InCommand)\n\t: ReferenceActor(Reference),\n\tCommand(InCommand),\n\tAchievementName(InAchievementName)\n{\n\tCommandName = CommandNames[static_cast<int32>(Command)] + \".\" + AchievementName.ToString();\n}\n\n\nvoid FSoConsoleCommandAchievement::HandleCommand(const TArray<FString>& Args)\n{\n\tif (!ReferenceActor.IsValid())\n\t\treturn;\n\n\tconst auto& GameInstance = USoGameInstance::Get(ReferenceActor.Get());\n\tUSoAchievementManager* AchievementManager = GameInstance.GetAchievementManager();\n\tif (!AchievementManager)\n\t\treturn;\n\n\tif (!AchievementManager->IsUserIDValid())\n\t\treturn;\n\n\tfloat ArgProgress = INDEX_NONE;\n\tif (Args.Num() > 0)\n\t\tArgProgress = FMath::Abs(FCString::Atof(*Args[0]));\n\n\tswitch (Command)\n\t{\n\tcase ESoConsoleCommandAchievementType::Unlock:\n\t\tAchievementManager->UnlockAchievement(ReferenceActor.Get(), AchievementName);\n\t\tbreak;\n\tcase ESoConsoleCommandAchievementType::Reset:\n\t\tAchievementManager->ResetAchievement(ReferenceActor.Get(), AchievementName);\n\t\tbreak;\n\tcase ESoConsoleCommandAchievementType::Show:\n\t\tAchievementManager->ShowAchievementProgress(AchievementName);\n\t\tbreak;\n\tcase ESoConsoleCommandAchievementType::SetProgress:\n\t\tif (ArgProgress > INDEX_NONE)\n\t\t{\n\t\t\tcheckNoEntry();\n\t\t\t// if (AchievementManager->IsProgressAchievement(AchievementName))\n\t\t\t// {\n\t\t\t// \tAchievementManager->SetAchievementProgressForName(AchievementName, ArgProgress);\n\t\t\t// }\n\t\t\t// else\n\t\t\t// {\n\t\t\t// \tconst FString Message = FString::Printf(TEXT(\"Achievement = %s is not a progress achievement. Use Unlock instead\"), *AchievementName.ToString());\n\t\t\t// \tUSoPlatformHelper::PrintToConsole(ReferenceActor.Get(), Message);\n\t\t\t// \tUE_LOG(LogSoConsoleCommands, Warning, TEXT(\"%s\"), *Message);\n\t\t\t// }\n\t\t}\n\t\telse\n\t\t{\n\t\t\tconst FString Message = TEXT(\"ArgProgress is not set\");\n\t\t\tUSoPlatformHelper::PrintToConsole(ReferenceActor.Get(), Message);\n\t\t\tUE_LOG(LogSoConsoleCommands, Warning, TEXT(\"%s\"), *Message);\n\t\t}\n\t\tbreak;\n\tdefault:\n\t\tbreak;\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// FSoConsoleCommands\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSoConsoleCommands::RegisterAllCommands(AActor* OwnerActor)\n{\n\t// Clear previous state\n\tUnRegisterAllCommands();\n\n\tReferenceActor = OwnerActor;\n\tIConsoleManager& ConsoleManager = IConsoleManager::Get();\n\n\t// Load all dialogues/items into memory\n\tUDlgManager::LoadAllDialoguesIntoMemory();\n\tUSoItemHelper::LoadAllItemsIntoMemory();\n\n\tRegisterPrintCommands();\n\tRegisterInputCommands();\n\tRegisterSettingCommands();\n\tRegisterAchievementCommands();\n\tRegisterSteamCommands();\n\tRegisterTeleportCommands();\n\tRegisterDialogueCommands();\n\tRegisterCharacterAndItemCommands();\n\n\tConsoleObjects.Add(ConsoleManager.RegisterConsoleCommand(\n\t\tTEXT(\"SO.Crash.Check\"),\n\t\tTEXT(\"Claims and loads all Levels\"),\n\t\tFConsoleCommandWithArgsDelegate::CreateLambda([this](const TArray<FString>& Args)\n\t\t{\n\t\t\tcheckf(false, TEXT(\"Crashing because of console command\"));\n\t\t}), ECVF_Default)\n\t);\n\n\tConsoleObjects.Add(ConsoleManager.RegisterConsoleCommand(\n\t\tTEXT(\"SO.ClaimAndLoadAllLevels\"),\n\t\tTEXT(\"Claims and loads all Levels\"),\n\t\tFConsoleCommandWithArgsDelegate::CreateLambda([this](const TArray<FString>& Args)\n\t\t{\n\t\t\tFSoLevelManager::Get().ClaimAndLoadAllLevels(ReferenceActor.Get()->GetWorld());\n\t\t}), ECVF_Default)\n\t);\n\n\tConsoleObjects.Add(ConsoleManager.RegisterConsoleCommand(\n\t\tTEXT(\"SO.StartOutro\"),\n\t\tTEXT(\"Guess What\"),\n\t\tFConsoleCommandWithArgsDelegate::CreateRaw(this, &FSoConsoleCommands::StartOutro), ECVF_Default));\n\n\tConsoleObjects.Add(ConsoleManager.RegisterConsoleCommand(\n\t\tTEXT(\"SO.ToggleUI\"),\n\t\tTEXT(\"Enables/Disables ingame UI\"),\n\t\tFConsoleCommandWithArgsDelegate::CreateRaw(this, &FSoConsoleCommands::ToggleUI), ECVF_Default));\n\n\tConsoleObjects.Add(ConsoleManager.RegisterConsoleCommand(\n\t\tTEXT(\"SO.ToggleHitLines\"),\n\t\tTEXT(\"Enables/Disables debug visualizations of hit lines\"),\n\t\tFConsoleCommandWithArgsDelegate::CreateRaw(this, &FSoConsoleCommands::ToggleDisplayHitLines), ECVF_Default));\n\n\tConsoleObjects.Add(ConsoleManager.RegisterConsoleCommand(\n\t\tTEXT(\"SO.ToggleQuickSaveLoad\"),\n\t\tTEXT(\"Enables/Disables the quick save/;pad\"),\n\t\tFConsoleCommandWithArgsDelegate::CreateRaw(this, &FSoConsoleCommands::ToggleQuickSaveLoad), ECVF_Default));\n\n\tConsoleObjects.Add(ConsoleManager.RegisterConsoleCommand(\n\t\tTEXT(\"SO.ToggleEnemyCoverTraces\"),\n\t\tTEXT(\"Enables/Disables debug visualizations of cover traces\"),\n\t\tFConsoleCommandWithArgsDelegate::CreateRaw(this, &FSoConsoleCommands::ToggleDisplayEnemyCoverTraces), ECVF_Default));\n\n\tConsoleObjects.Add(ConsoleManager.RegisterConsoleCommand(\n\t\tTEXT(\"SO.ToggleSkipDialogues\"),\n\t\tTEXT(\"Enables/Disables dialogue fast forward mode\"),\n\t\tFConsoleCommandWithArgsDelegate::CreateRaw(this, &FSoConsoleCommands::ToggleDialogueDebugSkip), ECVF_Default));\n\n\tConsoleObjects.Add(ConsoleManager.RegisterConsoleCommand(\n\t\tTEXT(\"SO.ToggleAmbientLog\"),\n\t\tTEXT(\"Enables/Disables ambient log\"),\n\t\tFConsoleCommandWithArgsDelegate::CreateRaw(this, &FSoConsoleCommands::ToggleAmbientLog), ECVF_Default));\n\n\tConsoleObjects.Add(ConsoleManager.RegisterConsoleCommand(\n\t\tTEXT(\"SO.ToggleLateWallJump\"),\n\t\tTEXT(\"Enables/Disables easier WallJumps\"),\n\t\tFConsoleCommandWithArgsDelegate::CreateRaw(this, &FSoConsoleCommands::ToggleLateWallJump), ECVF_Default));\n\n\tConsoleObjects.Add(ConsoleManager.RegisterConsoleCommand(\n\t\tTEXT(\"SO.SetLateWallJumpInterval\"),\n\t\tTEXT(\"Sets the time interval player can still walljump after hitting the wall\"),\n\t\tFConsoleCommandWithArgsDelegate::CreateRaw(this, &FSoConsoleCommands::SetLateWallJumpInterval), ECVF_Default));\n\n\tIConsoleManager::Get().CallAllConsoleVariableSinks();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool FSoConsoleCommands::AllowCheats() const\n{\n\tif (const auto* GameInstance = USoGameInstance::GetInstance(ReferenceActor.Get()))\n\t\treturn GameInstance->AllowCheats();\n\n\treturn false;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSoConsoleCommands::PrintBoolToConsole(bool bValue)\n{\n\tif (!ReferenceActor.IsValid())\n\t\treturn;\n\n\tUSoPlatformHelper::PrintToConsole(ReferenceActor.Get(), FString::Printf(TEXT(\"%s\"), bValue ? TEXT(\"True\") : TEXT(\"False\")));\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSoConsoleCommands::RegisterPrintCommands()\n{\n\tIConsoleManager& ConsoleManager = IConsoleManager::Get();\n\tConsoleObjects.Add(ConsoleManager.RegisterConsoleCommand(\n\t\tTEXT(\"SO.Print.GameInstanceState\"),\n\t\tTEXT(\"Prints USoGameInstance::State\"),\n\t\tFConsoleCommandWithArgsDelegate::CreateLambda([this](const TArray<FString>& Args)\n\t\t{\n\t\t\tconst FString Message = FString::Printf(TEXT(\"USoGameInstance::State = %s\"), *USoGameInstance::Get(ReferenceActor.Get()).GetCurrentStateAsString());\n\t\t\tUSoPlatformHelper::PrintToAll(ReferenceActor.Get(), Message);\n\t\t}), ECVF_Default)\n\t);\n\n\tConsoleObjects.Add(ConsoleManager.RegisterConsoleCommand(\n\t\tTEXT(\"SO.Print.LogPath\"),\n\t\tTEXT(\"Prints the log path\"),\n\t\tFConsoleCommandWithArgsDelegate::CreateLambda([this](const TArray<FString>& Args)\n\t\t{\n\t\t\tconst FString Path = FPaths::ConvertRelativePathToFull(FPlatformOutputDevices::GetAbsoluteLogFilename());\n\t\t\tconst FString Message = FString::Printf(TEXT(\"LogPath = %s\"), *Path);\n\t\t\tUSoPlatformHelper::PrintToAll(ReferenceActor.Get(), Message);\n\t\t}), ECVF_Default)\n\t);\n\n\tConsoleObjects.Add(ConsoleManager.RegisterConsoleCommand(\n\t\tTEXT(\"SO.Print.EngineVersion\"),\n\t\tTEXT(\"Prints engine version\"),\n\t\tFConsoleCommandWithArgsDelegate::CreateLambda([this](const TArray<FString>& Args)\n\t\t{\n\t\t\tconst FString Message = FString::Printf(\n\t\t\t\tTEXT(\"GPackageFileUE4Version = %d, GPackageFileLicenseeUE4Version = %d, Engine = %s\"),\n\t\t\t\tGPackageFileUE4Version, GPackageFileLicenseeUE4Version, *FEngineVersion::Current().ToString()\n\t\t\t);\n\t\t\tUSoPlatformHelper::PrintToAll(ReferenceActor.Get(), Message);\n\t\t}), ECVF_Default)\n\t);\n\n\tConsoleObjects.Add(ConsoleManager.RegisterConsoleCommand(\n\t\tTEXT(\"SO.Print.LoadingLevels\"),\n\t\tTEXT(\"Prints All Loading Levels\"),\n\t\tFConsoleCommandWithArgsDelegate::CreateLambda([this](const TArray<FString>& Args)\n\t\t{\n\t\t\tTArray<FName> LoadingLevelNames;\n\t\t\tif (USoLevelHelper::GetAllLevelsThatAreLoading(ReferenceActor.Get(), LoadingLevelNames))\n\t\t\t{\n\t\t\t\tUSoPlatformHelper::PrintToAll(ReferenceActor.Get(), TEXT(\"Levels Loading:\"));\n\t\t\t\tfor (const FName LevelName : LoadingLevelNames)\n\t\t\t\t{\n\t\t\t\t\tUSoPlatformHelper::PrintToAll(ReferenceActor.Get(), FString::Printf(TEXT(\"\\t%s\"), *LevelName.ToString()));\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tUSoPlatformHelper::PrintToAll(ReferenceActor.Get(), TEXT(\"No Levels are loading\"));\n\t\t\t}\n\n\t\t}), ECVF_Default)\n\t);\n\n\tConsoleObjects.Add(ConsoleManager.RegisterConsoleCommand(\n\t\tTEXT(\"SO.Print.VisibleLevels\"),\n\t\tTEXT(\"Prints All Visible Levels\"),\n\t\tFConsoleCommandWithArgsDelegate::CreateLambda([this](const TArray<FString>& Args)\n\t\t{\n\t\t\tTArray<FName> VisibleLevelNames;\n\t\t\tif (USoLevelHelper::GetAllVisibleLevels(ReferenceActor.Get(), VisibleLevelNames))\n\t\t\t{\n\t\t\t\tUSoPlatformHelper::PrintToAll(ReferenceActor.Get(), TEXT(\"Levels Visible:\"));\n\t\t\t\tfor (const FName LevelName : VisibleLevelNames)\n\t\t\t\t{\n\t\t\t\t\tUSoPlatformHelper::PrintToAll(ReferenceActor.Get(), FString::Printf(TEXT(\"\\t%s\"), *LevelName.ToString()));\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tUSoPlatformHelper::PrintToAll(ReferenceActor.Get(), TEXT(\"No Levels are visible\"));\n\t\t\t}\n\n\t\t}), ECVF_Default)\n\t);\n\n\tConsoleObjects.Add(ConsoleManager.RegisterConsoleCommand(\n\t\tTEXT(\"SO.Print.PlatformContext\"),\n\t\tTEXT(\"Prints the info about the current platform\"),\n\t\tFConsoleCommandWithArgsDelegate::CreateLambda([this](const TArray<FString>& Args)\n\t\t{\n\t\t\tconst FString PlatformInfo = USoPlatformHelper::ToStringPlatformContext();\n\t\t\tUSoPlatformHelper::PrintToAll(ReferenceActor.Get(), PlatformInfo);\n\t\t}), ECVF_Default)\n\t);\n\n\tConsoleObjects.Add(ConsoleManager.RegisterConsoleCommand(\n\t\tTEXT(\"SO.Print.IsGameStarted\"),\n\t\tTEXT(\"Prints GameInstance.IsGameStarted\"),\n\t\tFConsoleCommandWithArgsDelegate::CreateLambda([this](const TArray<FString>& Args)\n\t\t{\n\t\t\tconst FString Output = FString::Printf(TEXT(\"IsGameStarted=%d\"), USoGameInstance::Get(ReferenceActor.Get()).IsGameStarted());\n\t\t\tUSoPlatformHelper::PrintToAll(ReferenceActor.Get(), Output);\n\t\t}), ECVF_Default)\n\t);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSoConsoleCommands::RegisterInputCommands()\n{\n\tIConsoleManager& ConsoleManager = IConsoleManager::Get();\n\n\t// EnableForcedDeviceType\n\tfor (int32 DeviceTypeIndex = static_cast<int32>(ESoInputDeviceType::Keyboard);\n\t\tDeviceTypeIndex < static_cast<int32>(ESoInputDeviceType::Num); DeviceTypeIndex++)\n\t{\n\t\tconst ESoInputDeviceType DeviceType = static_cast<ESoInputDeviceType>(DeviceTypeIndex);\n\n\t\tconst FString CommandName = TEXT(\"SO.Input.EnableForcedDeviceType.\") + USoInputHelper::DeviceTypeToFriendlyString(DeviceType);\n\t\tConsoleObjects.Add(ConsoleManager.RegisterConsoleCommand(\n\t\t\t*CommandName,\n\t\t\tTEXT(\"Forces the device type to be displayed\"),\n\t\t\tFConsoleCommandWithArgsDelegate::CreateRaw(this, &FSoConsoleCommands::InputForceDeviceType, DeviceType), ECVF_Default));\n\t}\n\n\t// DisableForcedDeviceType\n\tConsoleObjects.Add(ConsoleManager.RegisterConsoleCommand(\n\t\tTEXT(\"SO.Input.DisableForcedDeviceType\"),\n\t\tTEXT(\"Disables the forced device type\"),\n\t\tFConsoleCommandWithArgsDelegate::CreateLambda([this](const TArray<FString>& Args)\n\t\t{\n\t\t\tif (ASoPlayerController * SoController = ASoPlayerController::GetInstance(ReferenceActor.Get()))\n\t\t\t\tSoController->DisableForcedDeviceType();\n\n\t\t}), ECVF_Default)\n\t);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSoConsoleCommands::RegisterSettingCommands()\n{\n\tIConsoleManager& ConsoleManager = IConsoleManager::Get();\n\t// Demo commands\n\tConsoleObjects.Add(ConsoleManager.RegisterConsoleCommand(\n\t\tTEXT(\"SO.Demo.Video.ToggleDisableMainMenu\"),\n\t\tTEXT(\"Disables/Enables the main menu\"),\n\t\tFConsoleCommandWithArgsDelegate::CreateLambda([this](const TArray<FString>& Args)\n\t\t{\n\t\t\tauto& Settings = USoGameSettings::Get();\n\t\t\tSettings.SetIsVideoDemoDisableMenu(!Settings.CanVideoDemoDisableMenu());\n\t\t\tSettings.ApplySettings(false);\n\t\t\tPrintBoolToConsole(Settings.CanVideoDemoDisableMenu());\n\t\t}), ECVF_Default)\n\t);\n\n\tConsoleObjects.Add(ConsoleManager.RegisterConsoleCommand(\n\t\tTEXT(\"SO.Settings.TogglePauseGameGameOnIdle\"),\n\t\tTEXT(\"Enables/Disables Pause on Idle \"),\n\t\tFConsoleCommandWithArgsDelegate::CreateLambda([this](const TArray<FString>& Args)\n\t\t{\n\t\t\tauto& Settings = USoGameSettings::Get();\n\t\t\tSettings.SetPauseGameOnIdle(!Settings.CanPauseGameOnIdle());\n\t\t\tSettings.ApplySettings(false);\n\t\t\tPrintBoolToConsole(Settings.CanPauseGameOnIdle());\n\t\t}), ECVF_Default)\n\t);\n\n\tConsoleObjects.Add(ConsoleManager.RegisterConsoleCommand(\n\t\tTEXT(\"SO.Settings.TogglePauseGameWhenUnfocused\"),\n\t\tTEXT(\"Enables/Disables Pause when game is unfocused \"),\n\t\tFConsoleCommandWithArgsDelegate::CreateLambda([this](const TArray<FString>& Args)\n\t\t{\n\t\t\tauto& Settings = USoGameSettings::Get();\n\t\t\tSettings.SetPauseGameWhenUnfocused(!Settings.CanPauseGameWhenUnfocused());\n\t\t\tSettings.ApplySettings(false);\n\t\t\tPrintBoolToConsole(Settings.CanPauseGameWhenUnfocused());\n\t\t}), ECVF_Default)\n\t);\n\n\tConsoleObjects.Add(ConsoleManager.RegisterConsoleCommand(\n\t\tTEXT(\"SO.Settings.ToggleCustomMapsEnabled\"),\n\t\tTEXT(\"Enables/Disables custom maps support\"),\n\t\tFConsoleCommandWithArgsDelegate::CreateLambda([this](const TArray<FString>& Args)\n\t\t{\n\t\t\tauto& Settings = USoGameSettings::Get();\n\t\t\tSettings.SetAreCustomMapsEnabled(!Settings.AreCustomMapsEnabled());\n\t\t\tSettings.ApplySettings(false);\n\t\t\tPrintBoolToConsole(Settings.AreCustomMapsEnabled());\n\t\t}), ECVF_Default)\n\t);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSoConsoleCommands::RegisterAchievementCommands()\n{\n\tif (!AllowCheats())\n\t\treturn;\n\n\tIConsoleManager& ConsoleManager = IConsoleManager::Get();\n#if !UE_BUILD_SHIPPING\n\tConsoleObjects.Add(ConsoleManager.RegisterConsoleCommand(\n\t\tTEXT(\"SO.Achievements.ResetAll\"),\n\t\tTEXT(\"Resets all achievements (NOTE: Only works in non shipping mode)\"),\n\t\tFConsoleCommandWithArgsDelegate::CreateLambda([this](const TArray<FString>& Args)\n\t\t{\n\t\t\tif (USoAchievementManager* Manager = USoGameInstance::Get(ReferenceActor.Get()).GetAchievementManager())\n\t\t\t{\n\t\t\t\tManager->ResetAchievements();\n\t\t\t\tUSoStaticHelper::GetPlayerCharacterAsSoCharacter(ReferenceActor.Get())->RemoveBoolsWithPrefix(\"A_\");\n\t\t\t}\n\t\t}), ECVF_Default)\n\t);\n#endif // !UE_BUILD_SHIPPING\n\n\tConsoleObjects.Add(ConsoleManager.RegisterConsoleCommand(\n\t\tTEXT(\"SO.Achievements.PrintAll\"),\n\t\tTEXT(\"Print All Achievements\"),\n\t\tFConsoleCommandWithArgsDelegate::CreateLambda([this](const TArray<FString>& Args)\n\t\t{\n\t\t\tUSoPlatformHelper::PrintToConsole(ReferenceActor.Get(), TEXT(\"Achievements\"));\n\t\t\tfor (const FName AchievementName : FSoAchievement::GetAllAchievementNames())\n\t\t\t{\n\t\t\t\tUSoPlatformHelper::PrintToConsole(ReferenceActor.Get(), AchievementName.ToString());\n\t\t\t}\n\t\t}), ECVF_Default)\n\t);\n\n\n\tfor (const FName AchievementName : FSoAchievement::GetAllAchievementNames())\n\t{\n\t\tAchievementCommands.Add({ ReferenceActor, AchievementName, ESoConsoleCommandAchievementType::Unlock });\n\t\tAchievementCommands.Add({ ReferenceActor, AchievementName, ESoConsoleCommandAchievementType::Show });\n\t\t// AchievementCommands.Add({ ReferenceActor, AchievementName, ESoConsoleCommandAchievementType::SetProgress });\n#if !UE_BUILD_SHIPPING\n\t\tAchievementCommands.Add({ ReferenceActor, AchievementName, ESoConsoleCommandAchievementType::Reset });\n#endif // !UE_BUILD_SHIPPING\n\t}\n\n\tfor (const FSoConsoleCommandAchievement& Cmd : AchievementCommands)\n\t{\n\t\tConsoleObjects.Add(ConsoleManager.RegisterConsoleCommand(\n\t\t\t*Cmd.GetCommandName(),\n\t\t\t*Cmd.GetCommandHelperText(),\n\t\t\tFConsoleCommandWithArgsDelegate::CreateRaw(&Cmd, &FSoConsoleCommandAchievement::HandleCommand), ECVF_Default));\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSoConsoleCommands::RegisterSteamCommands()\n{\n#if WARRIORB_WITH_STEAM\n\tIConsoleManager& ConsoleManager = IConsoleManager::Get();\n\n\tConsoleObjects.Add(ConsoleManager.RegisterConsoleCommand(\n\t\tTEXT(\"SO.Steam.ShowFriendsUI\"),\n\t\tTEXT(\"Shows the friends UI\"),\n\t\tFConsoleCommandWithArgsDelegate::CreateLambda([this](const TArray<FString>& Args)\n\t\t{\n\t\t\tINYSteamSubsystemPtr Steam = INotYetSteamModule::Get().GetSteamSubsystem();\n\t\t\tif (Steam.IsValid())\n\t\t\t{\n\t\t\t\tSteam->GetExternalUI()->ShowFriendsUI();\n\t\t\t}\n\n\t\t}), ECVF_Default)\n\t);\n\tConsoleObjects.Add(ConsoleManager.RegisterConsoleCommand(\n\t\tTEXT(\"SO.Steam.ShowAchievementsUI\"),\n\t\tTEXT(\"Shows the Achievements UI\"),\n\t\tFConsoleCommandWithArgsDelegate::CreateLambda([this](const TArray<FString>& Args)\n\t\t{\n\t\t\tINYSteamSubsystemPtr Steam = INotYetSteamModule::Get().GetSteamSubsystem();\n\t\t\tif (Steam.IsValid())\n\t\t\t{\n\t\t\t\tSteam->GetExternalUI()->ShowAchievementsUI();\n\t\t\t}\n\n\t\t}), ECVF_Default)\n\t);\n\n\tConsoleObjects.Add(ConsoleManager.RegisterConsoleCommand(\n\t\tTEXT(\"SO.Steam.SetRichPresenceStatus\"),\n\t\tTEXT(\"Sets the rich presence with a custom <message>\"),\n\t\tFConsoleCommandWithArgsDelegate::CreateLambda([this](const TArray<FString>& Args)\n\t\t{\n\t\t\tif (Args.Num() == 0)\n\t\t\t{\n\t\t\t\tUSoPlatformHelper::PrintToConsole(ReferenceActor.Get(), TEXT(\"No arguments given\"));\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tTSharedPtr<const FUniqueNetId> UserID = USoOnlineHelper::GetUniqueNetIDFromObject(ReferenceActor.Get());\n\t\t\tconst FString& Message = Args[0];\n\n\t\t\tINYSteamSubsystemPtr Steam = INotYetSteamModule::Get().GetSteamSubsystem();\n\t\t\tif (Steam.IsValid())\n\t\t\t{\n\t\t\t\tSteam->GetPresence()->SetRichPresenceStatus(*UserID, Message);\n\t\t\t}\n\t\t}), ECVF_Default)\n\t);\n\n#endif // WARRIORB_WITH_STEAM\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSoConsoleCommands::RegisterTeleportCommands()\n{\n\tif (!AllowCheats())\n\t\treturn;\n\n\tIConsoleManager& ConsoleManager = IConsoleManager::Get();\n\n\t// Spline Teleport Commands\n\tfor (TActorIterator<ASoPlayerSpline> ActorItr(ReferenceActor.Get()->GetWorld()); ActorItr; ++ActorItr)\n\t\tSplineCommands.Add({ *ActorItr });\n\n\t// Teleport to spline\n\tfor (FSoSplineConsoleCommand& Command : SplineCommands)\n\t{\n\t\tconst FString CommandName = FString(\"SO.T.\") + Command.GetSpline()->GetName();\n\t\tconst FString HelpText = TEXT(\"Player character jumps to selected spline. Optional parameters: Distance, ZValue\");\n\t\tConsoleObjects.Add(ConsoleManager.RegisterConsoleCommand(\n\t\t\t*CommandName,\n\t\t\t*HelpText,\n\t\t\tFConsoleCommandWithArgsDelegate::CreateRaw(&Command, &FSoSplineConsoleCommand::PerformTeleportToSpline), ECVF_Default));\n\t}\n\n\t// Teleport to Chapter\n\tif (ReferenceActor.IsValid())\n\t{\n\t\tconst FName CurrentChapterName = USoLevelHelper::GetChapterNameFromObject(ReferenceActor.Get());\n\t\tconst TArray<FSoChapterMapParams>& AllChapters = USoLevelHelper::GetAllChaptersData();\n\n\n\t\tfor (const auto& Chapter : AllChapters)\n\t\t{\n\t\t\tconst FName ChapterName = Chapter.GetMapName();\n\n\t\t\t// Ignore current\n\t\t\tif (CurrentChapterName == ChapterName)\n\t\t\t\tcontinue;\n\n\t\t\tconst FString CommandName = TEXT(\"SO.TeleportToChapter.\") + ChapterName.ToString();\n\t\t\tConsoleObjects.Add(\n\t\t\t\tConsoleManager.RegisterConsoleCommand(\n\t\t\t\t\t*CommandName,\n\t\t\t\t\tTEXT(\"Teleports to the selected chapter on the default checkpoint\"),\n\t\t\t\t\tFConsoleCommandWithArgsDelegate::CreateRaw(this, &FSoConsoleCommands::TeleportToChapter, ChapterName),\n\t\t\t\t\tECVF_Default\n\t\t\t\t)\n\t\t\t);\n\t\t}\n\t}\n\n\t// Teleport to Episode\n\tif (ReferenceActor.IsValid())\n\t{\n\t\tconst FName CurrentEpisodeName = USoLevelHelper::GetEpisodeNameFromObject(ReferenceActor.Get());\n\t\tconst TArray<FSoEpisodeMapParams>& AllEpisodes = USoLevelHelper::GetAllEpisodesData();\n\n\t\tfor (const auto& Episode : AllEpisodes)\n\t\t{\n\t\t\tconst FName EpisodeName = Episode.GetMapName();\n\n\t\t\t// Ignore current\n\t\t\tif (CurrentEpisodeName == EpisodeName)\n\t\t\t\tcontinue;\n\n\t\t\tconst FString CommandName = TEXT(\"SO.TeleportToEpisode.\") + EpisodeName.ToString();\n\t\t\tConsoleObjects.Add(\n\t\t\t\tConsoleManager.RegisterConsoleCommand(\n\t\t\t\t\t*CommandName,\n\t\t\t\t\tTEXT(\"Teleports to the selected episode\"),\n\t\t\t\t\tFConsoleCommandWithArgsDelegate::CreateRaw(this, &FSoConsoleCommands::TeleportToEpisode, EpisodeName),\n\t\t\t\t\tECVF_Default\n\t\t\t\t)\n\t\t\t);\n\t\t}\n\t}\n\n\t// Teleport to checkpoint\n\tif (const ASoLocationRegistry* LocationRegistry = ASoLocationRegistry::GetInstance(ReferenceActor.Get()))\n\t{\n\t\tfor (const auto& Elem : LocationRegistry->GetAllCheckpoints())\n\t\t{\n\t\t\tconst FName CheckpointFName = Elem.Key;\n\t\t\tconst FString CommandName = TEXT(\"SO.TeleportToCheckpoint.\") + (CheckpointFName == NAME_None ? FString(\"DefaultStart\") : CheckpointFName.ToString());\n\t\t\tConsoleObjects.Add(ConsoleManager.RegisterConsoleCommand(\n\t\t\t\t*CommandName,\n\t\t\t\tTEXT(\"Teleport the selected checkpoint\"),\n\t\t\t\tFConsoleCommandWithArgsDelegate::CreateRaw(this, &FSoConsoleCommands::TeleportToCheckpoint, CheckpointFName), ECVF_Default));\n\t\t}\n\t}\n\n\t// Teleport to main menu\n\tConsoleObjects.Add(ConsoleManager.RegisterConsoleCommand(\n\t\tTEXT(\"SO.TeleportToMainMenu\"),\n\t\tTEXT(\"Teleports to the main menu level\"),\n\t\tFConsoleCommandWithArgsDelegate::CreateRaw(this, &FSoConsoleCommands::TeleportToMainMenu), ECVF_Default));\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSoConsoleCommands::RegisterDialogueCommands()\n{\n\tif (!AllowCheats())\n\t\treturn;\n\n\tIConsoleManager& ConsoleManager = IConsoleManager::Get();\n\n\t// Character story data commands\n\tASoCharacter* Char = USoStaticHelper::GetPlayerCharacterAsSoCharacter(ReferenceActor.Get());\n\tif (Char == nullptr)\n\t\treturn;\n\n\tTArray<FName> Names;\n\tconst FName CharName = IDlgDialogueParticipant::Execute_GetParticipantName(Char);\n\n\t// Integers\n\tUDlgManager::GetAllDialoguesIntNames(CharName, Names);\n\tfor (const auto Name : Names)\n\t\tCharVariableCommands.Add({ ReferenceActor, ESoCharVariableCommand::ECVC_SetInt, Name });\n\n\t// Floats\n\tNames.Empty();\n\tUDlgManager::GetAllDialoguesFloatNames(CharName, Names);\n\n\tfor (const auto Name : Names)\n\t\tCharVariableCommands.Add({ ReferenceActor, ESoCharVariableCommand::ECVC_SetFloat, Name });\n\n\t// bool\n\tNames.Empty();\n\tUDlgManager::GetAllDialoguesBoolNames(CharName, Names);\n\n\tfor (const auto Name : Names)\n\t\tCharVariableCommands.Add({ ReferenceActor, ESoCharVariableCommand::ECVC_SetBool, Name });\n\n\t// default ones - they expect the variable name as parameter\n\tCharVariableCommands.Add({ ReferenceActor, ESoCharVariableCommand::ECVC_SetInt });\n\tCharVariableCommands.Add({ ReferenceActor, ESoCharVariableCommand::ECVC_SetFloat });\n\tCharVariableCommands.Add({ ReferenceActor, ESoCharVariableCommand::ECVC_SetBool });\n\n\tfor (const FSoConsoleCommandSetCharVariable& Cmd : CharVariableCommands)\n\t{\n\t\tConsoleObjects.Add(ConsoleManager.RegisterConsoleCommand(\n\t\t\t*Cmd.GetCommandName(),\n\t\t\t*Cmd.GetCommandHelperText(),\n\t\t\tFConsoleCommandWithArgsDelegate::CreateRaw(&Cmd, &FSoConsoleCommandSetCharVariable::ChangeCharVariable), ECVF_Default));\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool FSoConsoleCommands::IsSpeedRunCompetitionMode()\n{\n\tstatic bool bValue = FParse::Param(FCommandLine::Get(), TEXT(\"SpeedRunCompetition\"));\n\treturn bValue;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSoConsoleCommands::RegisterCharacterAndItemCommands()\n{\n\tif (!AllowCheats())\n\t\treturn;\n\n\tIConsoleManager& ConsoleManager = IConsoleManager::Get();\n\n\tConsoleObjects.Add(ConsoleManager.RegisterConsoleCommand(\n\t\tTEXT(\"SO.SetHP\"),\n\t\tTEXT(\"Modifies both the max and the current HP of the character. Params: amount (int)\"),\n\t\tFConsoleCommandWithArgsDelegate::CreateRaw(this, &FSoConsoleCommands::SetHp), ECVF_Default));\n\n\tConsoleObjects.Add(ConsoleManager.RegisterConsoleCommand(\n\t\tTEXT(\"SO.SetSpellsCapacity\"),\n\t\tTEXT(\"Set the spells capacity of the player. Params: amount (int)\"),\n\t\tFConsoleCommandWithArgsDelegate::CreateRaw(this, &FSoConsoleCommands::SetSpellCapacity), ECVF_Default));\n\n\tConsoleObjects.Add(ConsoleManager.RegisterConsoleCommand(\n\t\tTEXT(\"SO.Resurrect\"),\n\t\tTEXT(\"Guess what\"),\n\t\tFConsoleCommandWithArgsDelegate::CreateRaw(this, &FSoConsoleCommands::Resurrect), ECVF_Default));\n\n\tConsoleObjects.Add(ConsoleManager.RegisterConsoleCommand(\n\t\tTEXT(\"SO.Rest\"),\n\t\tTEXT(\"Opens rest panel, restores character values\"),\n\t\tFConsoleCommandWithArgsDelegate::CreateRaw(this, &FSoConsoleCommands::Rest), ECVF_Default));\n\n\tConsoleObjects.Add(ConsoleManager.RegisterConsoleCommand(\n\t\tTEXT(\"SO.Kill\"),\n\t\tTEXT(\"All ASoEnemy instance gets a kill signal\"),\n\t\tFConsoleCommandWithArgsDelegate::CreateRaw(this, &FSoConsoleCommands::KillAllEnemy), ECVF_Default));\n\n\tConsoleObjects.Add(ConsoleManager.RegisterConsoleCommand(\n\t\tTEXT(\"SO.AddAll\"),\n\t\tTEXT(\"Shortcut for all add commands. SO.Add*\"),\n\t\tFConsoleCommandWithArgsDelegate::CreateRaw(this, &FSoConsoleCommands::AddAllToCharacter), ECVF_Default));\n\n\tConsoleObjects.Add(ConsoleManager.RegisterConsoleCommand(\n\t\tTEXT(\"SO.AddKeys\"),\n\t\tTEXT(\"Adds all key to inventory\"),\n\t\tFConsoleCommandWithArgsDelegate::CreateRaw(this, &FSoConsoleCommands::AddAllKeyToCharacter), ECVF_Default));\n\n\tConsoleObjects.Add(ConsoleManager.RegisterConsoleCommand(\n\t\tTEXT(\"SO.AddQuestItems\"),\n\t\tTEXT(\"Adds all quest items to inventory\"),\n\t\tFConsoleCommandWithArgsDelegate::CreateRaw(this, &FSoConsoleCommands::AddAllQuestItemToCharacter), ECVF_Default));\n\n\tConsoleObjects.Add(ConsoleManager.RegisterConsoleCommand(\n\t\tTEXT(\"SO.AddWeapons\"),\n\t\tTEXT(\"Adds all weapons to inventory\"),\n\t\tFConsoleCommandWithArgsDelegate::CreateRaw(this, &FSoConsoleCommands::AddAllWeaponToCharacter), ECVF_Default));\n\n\tConsoleObjects.Add(ConsoleManager.RegisterConsoleCommand(\n\t\tTEXT(\"SO.AddShards\"),\n\t\tTEXT(\"Adds all clothes to inventory\"),\n\t\tFConsoleCommandWithArgsDelegate::CreateRaw(this, &FSoConsoleCommands::AddAllShardToCharacter), ECVF_Default));\n\n\tConsoleObjects.Add(ConsoleManager.RegisterConsoleCommand(\n\t\tTEXT(\"SO.AddJewel\"),\n\t\tTEXT(\"Adds all Jewelry to inventory\"),\n\t\tFConsoleCommandWithArgsDelegate::CreateRaw(this, &FSoConsoleCommands::AddAllJewelryToCharacter), ECVF_Default));\n\n\tConsoleObjects.Add(ConsoleManager.RegisterConsoleCommand(\n\t\tTEXT(\"SO.AddUsables\"),\n\t\tTEXT(\"Adds all usable items to inventory\"),\n\t\tFConsoleCommandWithArgsDelegate::CreateRaw(this, &FSoConsoleCommands::AddAllUsableItemToCharacter), ECVF_Default));\n\n\tConsoleObjects.Add(ConsoleManager.RegisterConsoleCommand(\n\t\tTEXT(\"SO.AddRuneStones\"),\n\t\tTEXT(\"Adds all RuneStones to inventory\"),\n\t\tFConsoleCommandWithArgsDelegate::CreateRaw(this, &FSoConsoleCommands::AddAllRuneStonesToCharacter), ECVF_Default));\n\n\tConsoleObjects.Add(ConsoleManager.RegisterConsoleCommand(\n\t\tTEXT(\"SO.EquipAllSpells\"),\n\t\tTEXT(\"Equips all spells it can\"),\n\t\tFConsoleCommandWithArgsDelegate::CreateRaw(this, &FSoConsoleCommands::EquipAllSpells), ECVF_Default));\n\n\tConsoleObjects.Add(ConsoleManager.RegisterConsoleCommand(\n\t\tTEXT(\"SO.ReloadAIConfig\"),\n\t\tTEXT(\"Guess what\"),\n\t\tFConsoleCommandWithArgsDelegate::CreateRaw(this, &FSoConsoleCommands::ReloadAIConfig), ECVF_Default));\n\n\tConsoleObjects.Add(ConsoleManager.RegisterConsoleCommand(\n\t\tTEXT(\"SO.SetGameSpeedMultiplier\"),\n\t\tTEXT(\"Guess what\"),\n\t\tFConsoleCommandWithArgsDelegate::CreateRaw(this, &FSoConsoleCommands::SetGameSpeedMultiplier), ECVF_Default));\n\n\tConsoleObjects.Add(ConsoleManager.RegisterConsoleCommand(\n\t\tTEXT(\"SO.SetAudioListenerLerpValue\"),\n\t\tTEXT(\"Guess what\"),\n\t\tFConsoleCommandWithArgsDelegate::CreateRaw(this, &FSoConsoleCommands::SetListenerLerpValue), ECVF_Default));\n\n\tConsoleObjects.Add(ConsoleManager.RegisterConsoleCommand(\n\t\tTEXT(\"SO.ToggleSoVisibilityQuery\"),\n\t\tTEXT(\"Guess what\"),\n\t\tFConsoleCommandWithArgsDelegate::CreateRaw(this, &FSoConsoleCommands::TestVisibilityQuery), ECVF_Default));\n\n\tConsoleObjects.Add(ConsoleManager.RegisterConsoleCommand(\n\t\tTEXT(\"SO.SetDifficulty\"),\n\t\tTEXT(\"Guess what\"),\n\t\tFConsoleCommandWithArgsDelegate::CreateRaw(this, &FSoConsoleCommands::SetDifficulty), ECVF_Default));\n\n\tConsoleObjects.Add(ConsoleManager.RegisterConsoleCommand(\n\t\tTEXT(\"SO.AddBonusHealth\"),\n\t\tTEXT(\"Guess what\"),\n\t\tFConsoleCommandWithArgsDelegate::CreateRaw(this, &FSoConsoleCommands::AddBonusHealth), ECVF_Default));\n\n\tConsoleObjects.Add(ConsoleManager.RegisterConsoleCommand(\n\t\tTEXT(\"SO.ClearBonusHealth\"),\n\t\tTEXT(\"Guess what\"),\n\t\tFConsoleCommandWithArgsDelegate::CreateRaw(this, &FSoConsoleCommands::ClearBonusHealth), ECVF_Default));\n\n\tConsoleObjects.Add(ConsoleManager.RegisterConsoleCommand(\n\t\tTEXT(\"SO.ToggleLillian\"),\n\t\tTEXT(\"Guess what\"),\n\t\tFConsoleCommandWithArgsDelegate::CreateRaw(this, &FSoConsoleCommands::ToggleLillian), ECVF_Default));\n\n\tConsoleObjects.Add(ConsoleManager.RegisterConsoleCommand(\n\t\tTEXT(\"SO.ToggleDmgCheat\"),\n\t\tTEXT(\"Guess what\"),\n\t\tFConsoleCommandWithArgsDelegate::CreateRaw(this, &FSoConsoleCommands::ToggleDmgCheat), ECVF_Default));\n\n\tConsoleObjects.Add(ConsoleManager.RegisterConsoleCommand(\n\t\tTEXT(\"SO.ToggleGodMode\"),\n\t\tTEXT(\"Guess what\"),\n\t\tFConsoleCommandWithArgsDelegate::CreateRaw(this, &FSoConsoleCommands::ToggleGodMode), ECVF_Default));\n\n\tConsoleObjects.Add(ConsoleManager.RegisterConsoleCommand(\n\t\tTEXT(\"SO.ToggleFlyMode\"),\n\t\tTEXT(\"Guess what\"),\n\t\tFConsoleCommandWithArgsDelegate::CreateRaw(this, &FSoConsoleCommands::ToggleFlyMode), ECVF_Default));\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSoConsoleCommands::UnRegisterAllCommands()\n{\n\t// remove objects - they are released in UnregisterConsoleObject\n\tfor (IConsoleObject* Object : ConsoleObjects)\n\t\tIConsoleManager::Get().UnregisterConsoleObject(Object);\n\n\tConsoleObjects.Empty();\n\tSplineCommands.Empty();\n\tCharVariableCommands.Empty();\n\tAchievementCommands.Empty();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSoConsoleCommands::AddAllToCharacter(const TArray<FString>& Args)\n{\n\tAddAllKeyToCharacter(Args);\n\tAddAllQuestItemToCharacter(Args);\n\tAddAllUsableItemToCharacter(Args);\n\tAddAllWeaponToCharacter(Args);\n\tAddAllShardToCharacter(Args);\n\tAddAllJewelryToCharacter(Args);\n\tAddAllRuneStonesToCharacter(Args);\n\tEquipAllSpells(Args);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSoConsoleCommands::AddAllKeyToCharacter(const TArray<FString>& Args)\n{\n\tif (!AllowCheats())\n\t\treturn;\n\n\tif (!ReferenceActor.IsValid())\n\t\treturn;\n\n\tASoCharacter* Character = USoStaticHelper::GetPlayerCharacterAsSoCharacter(ReferenceActor->GetWorld());\n\n\tif (Character == nullptr)\n\t\treturn;\n\n\tfor (TObjectIterator<USoQuestItemTemplate> Itr; Itr; ++Itr)\n\t\tif ((*Itr) != nullptr && (*Itr)->QuestItemType == ESoQuestItemType::EQIT_Key)\n\t\t{\n\t\t\tFSoItem Item;\n\t\t\tItem.Template = *Itr;\n\t\t\tCharacter->AddItem(Item, false);\n\t\t}\n\tUE_LOG(LogSoConsoleCommands, Display, TEXT(\"All keys added to inventory!\"));\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool FSoConsoleCommands::AddItems(UClass* ClassFilter)\n{\n\tif (!ReferenceActor.IsValid())\n\t\treturn false;\n\n\tASoCharacter* Character = USoStaticHelper::GetPlayerCharacterAsSoCharacter(ReferenceActor->GetWorld());\n\n\tif (Character == nullptr)\n\t\treturn false;\n\n\tfor (TObjectIterator<USoItemTemplate> Itr; Itr; ++Itr)\n\t\tif ((*Itr)->GetClass() == ClassFilter)\n\t\t{\n\t\t\tFSoItem Item;\n\t\t\tItem.Template = *Itr;\n\t\t\tif (Item.Template->IsStackable())\n\t\t\t\tItem.Amount = Item.Template->GetMaxStackNum();\n\t\t\tCharacter->AddItem(Item, false);\n\t\t}\n\n\tUE_LOG(LogSoConsoleCommands, Display, TEXT(\"Items from class %s added to inventory!\"), *ClassFilter->GetName());\n\treturn true;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSoConsoleCommands::TeleportToCheckpoint(const TArray<FString>& Args, const FName CheckPointName)\n{\n\tif (!ReferenceActor.IsValid())\n\t\treturn;\n\n\tif (ASoCharacter* Character = USoStaticHelper::GetPlayerCharacterAsSoCharacter(ReferenceActor.Get()))\n\t\tCharacter->TeleportToCheckpointName(CheckPointName);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSoConsoleCommands::InputForceDeviceType(const TArray<FString>& Args, const ESoInputDeviceType DeviceType)\n{\n\tif (!ReferenceActor.IsValid())\n\t\treturn;\n\n\tif (ASoPlayerController * SoController = ASoPlayerController::GetInstance(ReferenceActor.Get()))\n\t\tSoController->EnableForcedDeviceType(DeviceType);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSoConsoleCommands::TeleportToChapter(const TArray<FString>& Args, FName ChapterName)\n{\n\tif (!ReferenceActor.IsValid())\n\t\treturn;\n\n\tif (!USoLevelHelper::IsValidChapterName(ChapterName))\n\t\treturn;\n\n\tUSoGameInstance::Get(ReferenceActor.Get()).TeleportToChapter(ChapterName, NAME_None, true);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSoConsoleCommands::TeleportToEpisode(const TArray<FString>& Args, FName EpisodeName)\n{\n\tif (!ReferenceActor.IsValid())\n\t\treturn;\n\n\tif (!USoLevelHelper::IsValidEpisodeName(EpisodeName))\n\t\treturn;\n\n\tUSoGameInstance::Get(ReferenceActor.Get()).TeleportToEpisode(EpisodeName, true);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSoConsoleCommands::TeleportToMainMenu(const TArray<FString>& Args)\n{\n\tif (!ReferenceActor.IsValid())\n\t\treturn;\n\n\tUSoGameInstance::Get(ReferenceActor.Get()).TeleportToMainMenu(true);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSoConsoleCommands::AddAllQuestItemToCharacter(const TArray<FString>& Args)\n{\n\tAddItems(USoQuestItemTemplate::StaticClass());\n\tAddItems(USoItemTemplateQuestBook::StaticClass());\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSoConsoleCommands::AddAllJewelryToCharacter(const TArray<FString>& Args)\n{\n\tAddItems(USoItemTemplateJewelry::StaticClass());\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSoConsoleCommands::AddAllRuneStonesToCharacter(const TArray<FString>& Args)\n{\n\tAddItems(USoItemTemplateRuneStone::StaticClass());\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSoConsoleCommands::AddAllUsableItemToCharacter(const TArray<FString>& Args)\n{\n\tAddItems(USoUsableItemTemplate::StaticClass());\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSoConsoleCommands::AddAllWeaponToCharacter(const TArray<FString>& Args)\n{\n\tAddItems(USoWeaponTemplate::StaticClass());\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSoConsoleCommands::AddAllShardToCharacter(const TArray<FString>& Args)\n{\n\tAddItems(USoItemTemplateShard::StaticClass());\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSoConsoleCommands::SetHp(const TArray<FString>& Args)\n{\n\tASoCharacter* Character = USoStaticHelper::GetPlayerCharacterAsSoCharacter(ReferenceActor->GetWorld());\n\tif (Character == nullptr)\n\t\treturn;\n\n\tconst int32 Value = Args.Num() > 0 ? FCString::Atoi(*Args[0]) : 100;\n\tCharacter->GetPlayerCharacterSheet()->SetMaxHealth(Value);\n\tCharacter->GetPlayerCharacterSheet()->SetHealth(Value);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSoConsoleCommands::SetSpellCapacity(const TArray<FString>& Args)\n{\n\tASoCharacter* Character = USoStaticHelper::GetPlayerCharacterAsSoCharacter(ReferenceActor->GetWorld());\n\tif (Character == nullptr)\n\t\treturn;\n\n\tconst int32 Value = Args.Num() > 0 ? FCString::Atoi(*Args[0]) : 100;\n\tCharacter->SetSpellsCapacity(Value);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSoConsoleCommands::EquipAllSpells(const TArray<FString>& Args)\n{\n\tASoCharacter* Character = USoStaticHelper::GetPlayerCharacterAsSoCharacter(ReferenceActor->GetWorld());\n\tif (Character == nullptr)\n\t\treturn;\n\n\tCharacter->SetSpellsCapacity(100);\n\n\t// Iterate over items list\n\t// TODO do bounds checking on spells amount\n\tTArray<FSoItem> EquippedRuneStones = Character->GetPlayerCharacterSheet()->GetEquippedSpells();\n\tconst TArray<FSoItem>& ItemList = Character->GetInventory()->GetItemList();\n\tfor (const FSoItem& Item : ItemList)\n\t{\n\t\tif (EquippedRuneStones.Num() >= 7)\n\t\t\tbreak;\n\n\t\tif (USoItemTemplateRuneStone* RuneStone = Cast<USoItemTemplateRuneStone>(Item.Template))\n\t\t{\n\t\t\tbool bAdded = false;\n\t\t\tfor (FSoItem& EquippedRuneStone : EquippedRuneStones)\n\t\t\t{\n\t\t\t\tif (EquippedRuneStone.Template == RuneStone)\n\t\t\t\t{\n\t\t\t\t\tbAdded = true;\n\t\t\t\t\tEquippedRuneStone.Amount += 1;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (!bAdded)\n\t\t\t{\n\t\t\t\tFSoItem Stone;\n\t\t\t\tStone.Amount = 1;\n\t\t\t\tStone.Template = RuneStone;\n\t\t\t\tEquippedRuneStones.Add(Stone);\n\t\t\t}\n\t\t}\n\t}\n\tCharacter->GetPlayerCharacterSheet()->SetEquippedSpells(EquippedRuneStones);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSoConsoleCommands::Resurrect(const TArray<FString>& Args)\n{\n\tASoCharacter* Character = USoStaticHelper::GetPlayerCharacterAsSoCharacter(ReferenceActor->GetWorld());\n\tCharacter->SoActivity->SwitchActivity(Character->SoADead);\n\tCharacter->Revive(false);\n\tCharacter->SoActivity->SwitchActivity(Character->SoADefault);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSoConsoleCommands::Rest(const TArray<FString>& Args)\n{\n\tASoCharacter* Character = USoStaticHelper::GetPlayerCharacterAsSoCharacter(ReferenceActor->GetWorld());\n\tCharacter->SoAInUI->OpenRestPanel();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSoConsoleCommands::KillAllEnemy(const TArray<FString>& Args)\n{\n\tif (ReferenceActor != nullptr && ReferenceActor->GetWorld() != nullptr)\n\t{\n\t\tfor (TActorIterator<ASoEnemy> ActorItr(ReferenceActor->GetWorld()); ActorItr; ++ActorItr)\n\t\t\tISoMortal::Execute_Kill(*ActorItr, true);\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSoConsoleCommands::StartOutro(const TArray<FString>& Args)\n{\n\tASoCharacter* Character = USoStaticHelper::GetPlayerCharacterAsSoCharacter(ReferenceActor->GetWorld());\n\tCharacter->SoAInUI->StartEndGamePanel();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSoConsoleCommands::ToggleUI(const TArray<FString>& Args)\n{\n\tif (!ReferenceActor.IsValid())\n\t\treturn;\n\n\tASoCharacter* Character = USoStaticHelper::GetPlayerCharacterAsSoCharacter(ReferenceActor->GetWorld());\n\n\tif (Character == nullptr)\n\t\treturn;\n\n\tCharacter->OnToggleUI().Broadcast();\n\n\t// TODO: hide UI\n\t// Character->HandleUICommand(ESoUICommand::EUC_ToggleUI, Character);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSoConsoleCommands::ToggleDisplayHitLines(const TArray<FString>& Args)\n{\n\tUSoCombatComponent::bDisplayDebugHitLines = !USoCombatComponent::bDisplayDebugHitLines;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSoConsoleCommands::ToggleQuickSaveLoad(const TArray<FString>& Args)\n{\n\tASoCharacter::bEnableQuickSaveLoad = !ASoCharacter::bEnableQuickSaveLoad;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSoConsoleCommands::ToggleDisplayEnemyCoverTraces(const TArray<FString>& Args)\n{\n\tASoEnemy::bDisplayMeleeHitTraceLines = !ASoEnemy::bDisplayMeleeHitTraceLines;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSoConsoleCommands::ToggleDialogueDebugSkip(const TArray<FString>& Args)\n{\n\tif (ASoCharacter* Character = USoStaticHelper::GetPlayerCharacterAsSoCharacter(ReferenceActor->GetWorld()))\n\t\tCharacter->bDebugSkipDialogues = !Character->bDebugSkipDialogues;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSoConsoleCommands::ToggleAmbientLog(const TArray<FString>& Args)\n{\n\tUSoAudioManager::Get(ReferenceActor.Get()).TogglePrintAmbientLog();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSoConsoleCommands::ToggleLateWallJump(const TArray<FString>& Args)\n{\n\tif (ASoCharacter* Character = USoStaticHelper::GetPlayerCharacterAsSoCharacter(ReferenceActor->GetWorld()))\n\t\tCharacter->GetSoMovement()->ToggleAllowLateWallJump();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSoConsoleCommands::SetLateWallJumpInterval(const TArray<FString>& Args)\n{\n\tif (Args.Num() < 1)\n\t\treturn;\n\n\tif (ASoCharacter* Character = USoStaticHelper::GetPlayerCharacterAsSoCharacter(ReferenceActor->GetWorld()))\n\t\tCharacter->GetSoMovement()->SetLateWallJumpInterval(FCString::Atof(*Args[0]));\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSoConsoleCommands::ReloadAIConfig(const TArray<FString>& Args)\n{\n\tUSoGameInstance::Get(ReferenceActor.Get()).ClearConfigData();\n\n\tfor (TActorIterator<ASoEnemy> ActorItr(ReferenceActor->GetWorld()); ActorItr; ++ActorItr)\n\t\t(*ActorItr)->ReloadScripts();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSoConsoleCommands::SetGameSpeedMultiplier(const TArray<FString>& Args)\n{\n\tif (Args.Num() < 1)\n\t\treturn;\n\n\tUSoGameSettings::Get().SetGameSpeed(FCString::Atof(*Args[0]));\n\tUSoGameSettings::Get().ApplyGameSettings(true);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSoConsoleCommands::SetListenerLerpValue(const TArray<FString>& Args)\n{\n\tif (Args.Num() < 1)\n\t\treturn;\n\n\tconst float Value = FCString::Atof(*Args[0]);\n\tif (ASoPlayerController* PlayerController = Cast<ASoPlayerController>(USoStaticHelper::GetPlayerController(ReferenceActor.Get())))\n\t\tPlayerController->SetListenerLerpValue(Value);\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSoConsoleCommands::TestVisibilityQuery(const TArray<FString>& Args)\n{\n\tstatic bool bSet = false;\n\tstatic SoCustomCulling CustomCulling;\n\n\tif (bSet)\n\t{\n\t\tGetRendererModule().UnregisterCustomCullingImpl(&CustomCulling);\n\t\tbSet = false;\n\t}\n\telse\n\t{\n\t\tGetRendererModule().RegisterCustomCullingImpl(&CustomCulling);\n\t\tbSet = true;\n\t}\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSoConsoleCommands::SetDifficulty(const TArray<FString>& Args)\n{\n\tif (Args.Num() < 1)\n\t\treturn;\n\n\tconst int32 Value = FCString::Atoi(*Args[0]);\n\n\tif (Value >= 0 && Value < static_cast<int32>(ESoDifficulty::NumOf))\n\t{\n\t\tconst ESoDifficulty Difficulty = static_cast<ESoDifficulty>(Value);\n\t\tFSoWorldState::Get().SetGameDifficulty(Difficulty);\n\n\t\tif (ASoCharacter* Character = USoStaticHelper::GetPlayerCharacterAsSoCharacter(ReferenceActor->GetWorld()))\n\t\t{\n\t\t\tCharacter->GetPlayerCharacterSheet()->OnDifficultyChanged(Difficulty);\n\t\t\tCharacter->Revive(false);\n\t\t}\n\n\t\tswitch (Difficulty)\n\t\t{\n\t\t\tcase ESoDifficulty::Sane:\n\t\t\t\tUE_LOG(LogTemp, Warning, TEXT(\"Game Difficulty Changed To: Sane\"));\n\t\t\t\tbreak;\n\n\t\t\tcase ESoDifficulty::Intended:\n\t\t\t\tUE_LOG(LogTemp, Warning, TEXT(\"Game Difficulty Changed To: Intended\"));\n\t\t\t\tbreak;\n\n\t\t\tcase ESoDifficulty::Insane:\n\t\t\t\tUE_LOG(LogTemp, Warning, TEXT(\"Game Difficulty Changed To: Insane\"));\n\t\t\t\tbreak;\n\t\t}\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSoConsoleCommands::AddBonusHealth(const TArray<FString>& Args)\n{\n\tFSoDmg BonusHealth;\n\tBonusHealth.Physical = Args.Num() > 0 ? FCString::Atof(*Args[0]) : 0.0f;\n\tBonusHealth.Magical = Args.Num() > 1 ? FCString::Atof(*Args[1]) : 0.0f;\n\tif (ASoCharacter* Character = USoStaticHelper::GetPlayerCharacterAsSoCharacter(ReferenceActor->GetWorld()))\n\t{\n\t\tCharacter->GetPlayerCharacterSheet()->AddBonusHealth(BonusHealth);\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSoConsoleCommands::ClearBonusHealth(const TArray<FString>& Args)\n{\n\tif (ASoCharacter* Character = USoStaticHelper::GetPlayerCharacterAsSoCharacter(ReferenceActor->GetWorld()))\n\t{\n\t\tCharacter->GetPlayerCharacterSheet()->ClearBonusHealth();\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSoConsoleCommands::ToggleLillian(const TArray<FString>& Args)\n{\n\tif (ASoCharacter* Character = USoStaticHelper::GetPlayerCharacterAsSoCharacter(ReferenceActor->GetWorld()))\n\t{\n\t\tif (Cast<USoALillian>(Character->SoActivity) != nullptr)\n\t\t{\n\t\t\tCharacter->SoActivity->SwitchActivity(Character->SoADefault);\n\t\t\tCharacter->GetPlayerCharacterSheet()->SetBoolValue(USoStaticHelper::GetLillianFormName(), false);\n\t\t\tCharacter->ChangeUIVisibility.Broadcast(true);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tCharacter->SoActivity->SwitchActivity(Character->SoALillian);\n\t\t\tCharacter->GetPlayerCharacterSheet()->SetBoolValue(USoStaticHelper::GetLillianFormName(), true);\n\t\t\tCharacter->ChangeUIVisibility.Broadcast(true);\n\t\t}\n\t}\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSoConsoleCommands::ToggleDmgCheat(const TArray<FString>& Args)\n{\n\tif (ASoCharacter* Character = USoStaticHelper::GetPlayerCharacterAsSoCharacter(ReferenceActor->GetWorld()))\n\t\tCharacter->SoAStrike->ToggleDmgCheat();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSoConsoleCommands::ToggleGodMode(const TArray<FString>& Args)\n{\n\tif (ASoCharacter* Character = USoStaticHelper::GetPlayerCharacterAsSoCharacter(ReferenceActor->GetWorld()))\n\t\tCharacter->bGodMode = !Character->bGodMode;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSoConsoleCommands::ToggleFlyMode(const TArray<FString>& Args)\n{\n\tif (ASoCharacter* Character = USoStaticHelper::GetPlayerCharacterAsSoCharacter(ReferenceActor->GetWorld()))\n\t{\n\t\tCharacter->bFlyCheatOn = !Character->bFlyCheatOn;\n\t\tCharacter->SoActivity->OnSuperModeChange(Character->bFlyCheatOn);\n\t}\n}\n"
  },
  {
    "path": "Source/SOrb/Basic/SoConsoleCommands.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#pragma once\n#include \"CoreMinimal.h\"\n\n#include \"SplineLogic/SoPlayerSpline.h\"\n#include \"Levels/SoLevelTypes.h\"\n\nclass FSoSplineConsoleCommand\n{\npublic:\n\n\tFSoSplineConsoleCommand(TWeakObjectPtr<ASoPlayerSpline> InSpline) { Spline = InSpline; }\n\n\tvoid PerformTeleportToSpline(const TArray<FString>& Args);\n\n\tbool IsValid() const { return Spline.IsValid(); }\n\tconst TWeakObjectPtr<ASoPlayerSpline> GetSpline() const { return Spline; }\n\nprivate:\n\tTWeakObjectPtr<ASoPlayerSpline> Spline;\n};\n\n\nenum class ESoCharVariableCommand : uint8\n{\n\tECVC_SetInt = 0,\n\tECVC_SetFloat,\n\tECVC_SetBool,\n\tECVC_SetName,\n\n\tECVC_NumOf\n};\n\nclass FSoConsoleCommandSetCharVariable\n{\npublic:\n\n\t// used when the variable name is part of the console command (for auto complete)\n\tFSoConsoleCommandSetCharVariable(TWeakObjectPtr<AActor> Reference,\n\t\t\t\t\t\t\t\t\t ESoCharVariableCommand Cmd,\n\t\t\t\t\t\t\t\t\t FName Variable);\n\n\t// used when the variable name is console param too\n\tFSoConsoleCommandSetCharVariable(TWeakObjectPtr<AActor> Reference,\n\t\t\t\t\t\t\t\t\t ESoCharVariableCommand Cmd);\n\n\tvoid ChangeCharVariable(const TArray<FString>& Args);\n\n\tconst FString& GetCommandName() const { return CommandName; }\n\tconst FString& GetCommandHelperText() const { return  HelperTexts[static_cast<int32>(Command)]; }\n\nprivate:\n\tstatic const FString CommandNames[static_cast<int32>(ESoCharVariableCommand::ECVC_NumOf)];\n\tstatic const FString HelperTexts[static_cast<int32>(ESoCharVariableCommand::ECVC_NumOf)];\n\n\tTWeakObjectPtr<AActor> ReferenceActor;\n\tESoCharVariableCommand Command = ESoCharVariableCommand::ECVC_SetInt;\n\n\tFName VariableName;\n\tFString CommandName;\n\tbool bVariableNameIsStringParam = false;\n};\n\nenum class ESoConsoleCommandAchievementType : uint8\n{\n\tUnlock = 0,\n\tReset,\n\tShow,\n\tSetProgress,\n\n\tNumOf\n};\n\n\nclass FSoConsoleCommandAchievement\n{\npublic:\n\tFSoConsoleCommandAchievement(TWeakObjectPtr<AActor> Reference, FName InAchievementName, ESoConsoleCommandAchievementType InCommand);\n\n\tconst FString& GetCommandName() const { return CommandName; }\n\tconst FString& GetCommandHelperText() const { return  HelperTexts[static_cast<int32>(Command)]; }\n\n\tvoid HandleCommand(const TArray<FString>& Args);\n\nprivate:\n\tstatic const FString CommandNames[static_cast<int32>(ESoConsoleCommandAchievementType::NumOf)];\n\tstatic const FString HelperTexts[static_cast<int32>(ESoConsoleCommandAchievementType::NumOf)];\n\n\tTWeakObjectPtr<AActor> ReferenceActor;\n\tESoConsoleCommandAchievementType Command = ESoConsoleCommandAchievementType::Unlock;\n\tFString CommandName;\n\n\tFName AchievementName;\n};\n\n\nclass FSoConsoleCommands\n{\npublic:\n\t// Register all the console commands\n\tvoid RegisterAllCommands(AActor* OwnerActor);\n\n\t// Unregister all the console commands and clears the cache.\n\tvoid UnRegisterAllCommands();\n\n\tbool AllowCheats() const;\n\tvoid ReloadCommands()\n\t{\n\t\tif (ReferenceActor.IsValid())\n\t\t\tRegisterAllCommands(ReferenceActor.Get());\n\t}\n\n\tstatic bool IsSpeedRunCompetitionMode();\n\nprivate:\n\tvoid PrintBoolToConsole(bool bValue);\n\n\tvoid RegisterPrintCommands();\n\tvoid RegisterInputCommands();\n\tvoid RegisterSettingCommands();\n\tvoid RegisterAchievementCommands();\n\tvoid RegisterSteamCommands();\n\tvoid RegisterTeleportCommands();\n\tvoid RegisterDialogueCommands();\n\tvoid RegisterCharacterAndItemCommands();\n\n\t// Handle console commands\n\tvoid AddAllToCharacter(const TArray<FString>& Args);\n\tvoid AddAllKeyToCharacter(const TArray<FString>& Args);\n\tvoid AddAllQuestItemToCharacter(const TArray<FString>& Args);\n\tvoid AddAllUsableItemToCharacter(const TArray<FString>& Args);\n\tvoid AddAllWeaponToCharacter(const TArray<FString>& Args);\n\tvoid AddAllShardToCharacter(const TArray<FString>& Args);\n\tvoid AddAllJewelryToCharacter(const TArray<FString>& Args);\n\tvoid AddAllRuneStonesToCharacter(const TArray<FString>& Args);\n\tbool AddItems(UClass* ClassFilter);\n\n\tvoid InputForceDeviceType(const TArray<FString>& Args, const ESoInputDeviceType DeviceType);\n\n\tvoid TeleportToCheckpoint(const TArray<FString>& Args, const FName CheckPointName);\n\tvoid TeleportToEpisode(const TArray<FString>& Args, FName EpisodeName);\n\tvoid TeleportToChapter(const TArray<FString>& Args, FName ChapterName);\n\tvoid TeleportToMainMenu(const TArray<FString>& Args);\n\n\tvoid SetHp(const TArray<FString>& Args);\n\tvoid SetSpellCapacity(const TArray<FString>& Args);\n\tvoid EquipAllSpells(const TArray<FString>& Args);\n\n\tvoid Rest(const TArray<FString>& Args);\n\tvoid Resurrect(const TArray<FString>& Args);\n\tvoid KillAllEnemy(const TArray<FString>& Args);\n\tvoid StartOutro(const TArray<FString>& Args);\n\n\tvoid ToggleUI(const TArray<FString>& Args);\n\tvoid ToggleDisplayHitLines(const TArray<FString>& Args);\n\tvoid ToggleQuickSaveLoad(const TArray<FString>& Args);\n\tvoid ToggleDisplayEnemyCoverTraces(const TArray<FString>& Args);\n\tvoid ToggleDialogueDebugSkip(const TArray<FString>& Args);\n\tvoid ToggleAmbientLog(const TArray<FString>& Args);\n\n\tvoid ToggleLateWallJump(const TArray<FString>& Args);\n\tvoid SetLateWallJumpInterval(const TArray<FString>& Args);\n\n\tvoid ReloadAIConfig(const TArray<FString>& Args);\n\n\tvoid SetGameSpeedMultiplier(const TArray<FString>& Args);\n\tvoid SetListenerLerpValue(const TArray<FString>& Args);\n\n\tvoid TestVisibilityQuery(const TArray<FString>& Args);\n\n\tvoid SetDifficulty(const TArray<FString>& Args);\n\n\tvoid AddBonusHealth(const TArray<FString>& Args);\n\tvoid ClearBonusHealth(const TArray<FString>& Args);\n\n\tvoid ToggleLillian(const TArray<FString>& Args);\n\n\tvoid ToggleDmgCheat(const TArray<FString>& Args);\n\n\tvoid ToggleGodMode(const TArray<FString>& Args);\n\tvoid ToggleFlyMode(const TArray<FString>& Args);\n\nprivate:\n\t// Used to get the UWorld.\n\tTWeakObjectPtr<AActor> ReferenceActor;\n\n\tTArray<IConsoleObject*> ConsoleObjects;\n\tTArray<FSoSplineConsoleCommand> SplineCommands;\n\n\tTArray<FSoConsoleCommandSetCharVariable> CharVariableCommands;\n\n\tTArray<FSoConsoleCommandAchievement> AchievementCommands;\n};\n"
  },
  {
    "path": "Source/SOrb/Basic/SoCrashHandler.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#include \"SoCrashHandler.h\"\n\n#include \"Misc/CoreDelegates.h\"\n#include \"HAL/ExceptionHandling.h\"\n#include \"HAL/ThreadHeartBeat.h\"\n#include \"GenericPlatform/GenericPlatformStackWalk.h\"\n#include \"HAL/PlatformStackWalk.h\"\n\n#include \"SoGameInstance.h\"\n#include \"Character/SoCharacter.h\"\n#include \"SplineLogic/SoPlayerSpline.h\"\n#include \"SplineLogic/SoSplineWalker.h\"\n#include \"Helpers/SoPlatformHelper.h\"\n#include \"Levels/SoLevelHelper.h\"\n#include \"Online/Analytics/SoAnalytics.h\"\n#include \"Basic/Helpers/SoStaticHelper.h\"\n#include \"SoGameSingleton.h\"\n\n\nDEFINE_LOG_CATEGORY_STATIC(LogSoCrashHandler, All, All)\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSoCrashHandler::Initialize(USoGameInstance* Instance)\n{\n\tUE_LOG(LogSoCrashHandler, Log, TEXT(\"Initialize\"));\n\n\tcheck(Instance);\n\tGameInstance = Instance;\n\n\t// Listen for crashes\n\t// TODO: Maybe use FGenericPlatformMisc:::SetCrashHandler\n\tFCoreDelegates::OnHandleSystemError.AddRaw(this, &Self::HandleOnCrash);\n\tFCoreDelegates::OnHandleSystemEnsure.AddRaw(this, &Self::HandleOnCrashFromEnsure);\n\tFCoreDelegates::OnShutdownAfterError.AddRaw(this, &Self::HandleOnShutdownAfterCrash, false);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSoCrashHandler::Shutdown()\n{\n\tFCoreDelegates::OnHandleSystemError.RemoveAll(this);\n\tFCoreDelegates::OnHandleSystemEnsure.RemoveAll(this);\n\tFCoreDelegates::OnShutdownAfterError.RemoveAll(this);\n\tUE_LOG(LogSoCrashHandler, Log, TEXT(\"Shutdown\"));\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSoCrashHandler::AddContextToCrashErrorMessage()\n{\n\tif (GameInstance == nullptr)\n\t\treturn;\n\n\t// Add Info about the system\n\tCrashErrorMessage += USoPlatformHelper::ToStringPlatformContext();\n\n\t// Game Crash context contains information about the location of the player\n\tFString Message;\n\tconst FName ChapterName = USoLevelHelper::GetChapterNameFromObject(GameInstance);\n\tFVector CharacterWorldLocation(INDEX_NONE);\n\tFName LevelName;\n\tFString SplineName;\n\tint32 SplineDistance = INDEX_NONE;\n\n\t// TODO: Crash in crash? :Sweat:\n\tif (ASoCharacter* Character = USoStaticHelper::GetPlayerCharacterAsSoCharacter(GameInstance))\n\t{\n\t\tCharacterWorldLocation = Character->GetActorLocation();\n\t\tLevelName = USoLevelHelper::GetLevelNameFromActor(Character);\n\t\tconst FSoSplinePoint SplineLocation = ISoSplineWalker::Execute_GetSplineLocationI(Character);\n\t\tSplineDistance = SplineLocation.GetDistance();\n\n\t\tif (SplineLocation.IsValid(false))\n\t\t\tMessage = TEXT(\"SplineLocation is valid.\");\n\t\telse\n\t\t\tMessage = TEXT(\"SplineLocation is not valid.\");\n\n\t\tconst ASoPlayerSpline* Spline = Cast<ASoPlayerSpline>(SplineLocation.GetSpline());\n\t\tif (Spline)\n\t\t\tSplineName = Spline->GetSplineName();\n\t\telse\n\t\t\tSplineName = TEXT(\"Spline is NOT valid\");\n\t}\n\telse\n\t{\n\t\tMessage = TEXT(\"Could NOT get Character\");\n\t}\n\n\tCrashErrorMessage += FString::Printf(\n\t\tTEXT(\"Game CONTEXT:\\n\")\n\t\tTEXT(\"\\tMessage = `%s`\\n\")\n\t\tTEXT(\"\\tChapterName = `%s`\\n\")\n\t\tTEXT(\"\\tLevelName = `%s`\\n\")\n\t\tTEXT(\"\\tSplineName = `%s`\\n\")\n\t\tTEXT(\"\\tSplineDistance = %d\\n\")\n\t\tTEXT(\"\\tCharacterWorldLocation: %s\\n\")\n\t\tTEXT(\"\\n\"),\n\t\t*Message, *ChapterName.ToString(), *LevelName.ToString(), *SplineName, SplineDistance, *CharacterWorldLocation.ToString());\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSoCrashHandler::HandleOnCrashFromEnsure()\n{\n\t// DISABLED, as we don't care that much about ensures/checks\n\treturn;\n\n\tif (GameInstance == nullptr)\n\t\treturn;\n\n\t// A crash happened because an ensure() failed\n\tCrashErrorMessage = TEXT(\"- Crash happened from an ensure() -\\n\");\n\tAddContextToCrashErrorMessage();\n\n\t// Do the stack trace manually. Append to GErrorHist\n\tif (!FPlatformMisc::IsDebuggerPresent())\n\t{\n\t\t// Adapted from FDebug::EnsureFailed\n\t\t// No debugger attached, so generate a call stack and submit a crash report\n\t\t// Walk the stack and dump it to the allocated memory.\n\t\tconst SIZE_T StackTraceSize = 65535;\n\t\tANSICHAR* StackTrace = (ANSICHAR*)FMemory::SystemMalloc(StackTraceSize);\n\t\tif (StackTrace != nullptr)\n\t\t{\n\t\t\t// Stop checking heartbeat for this thread. Ensure can take a lot of time (when stackwalking)\n\t\t\t// Thread heartbeat will be resumed the next time this thread calls FThreadHeartBeat::Get().HeartBeat();\n\t\t\t// The reason why we don't call HeartBeat() at the end of this function is that maybe this thread\n\t\t\t// Never had a heartbeat checked and may not be sending heartbeats at all which would later lead to a false positives when detecting hangs.\n\t\t\tFThreadHeartBeat::Get().KillHeartBeat();\n\t\t\tFGameThreadHitchHeartBeat::Get().FrameStart(true);\n\n\t\t\tStackTrace[0] = 0;\n\t\t\tFPlatformStackWalk::StackWalkAndDumpEx(StackTrace, StackTraceSize, 0, FGenericPlatformStackWalk::EStackWalkFlags::FlagsUsedWhenHandlingEnsure);\n\n\t\t\t// Append the stack trace\n\t\t\tFCString::Strncat(GErrorHist, ANSI_TO_TCHAR(StackTrace), ARRAY_COUNT(GErrorHist) - 1);\n\t\t\tFMemory::SystemFree(StackTrace);\n\t\t}\n\t}\n\n\t// Manually call it because otherwise the ensure assertion does not crash/usually\n\tHandleOnShutdownAfterCrash(true);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSoCrashHandler::HandleOnCrash()\n{\n\tif (GameInstance == nullptr)\n\t\treturn;\n\n\t// We know a crash happened, unexpected\n\tCrashErrorMessage = TEXT(\"- Crash happened from unknown -\\n\");\n\tAddContextToCrashErrorMessage();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSoCrashHandler::HandleOnShutdownAfterCrash(const bool bFromEnsure)\n{\n\tif (GameInstance == nullptr)\n\t\treturn;\n\tif (bSentCrashReport)\n\t\treturn;\n\n\t// Some of these should be filled with some usable info.\n\t// GErrorHist\n\t// GErrorExceptionDescription\n\t// GErrorMessage\n\tCrashErrorMessage += TEXT(\"Crash CONTEXT:\\n\");\n\tCrashErrorMessage += FString::Printf(TEXT(\"GCrashType = %d\\n\"), GetCrashType());\n\tCrashErrorMessage += FString::Printf(TEXT(\"GErrorHist = \\n%s\\n\"), GErrorHist);\n\tCrashErrorMessage += FString::Printf(TEXT(\"GErrorExceptionDescription = \\n%s\\n\"), GErrorExceptionDescription);\n\t//CrashErrorMessage += FString::Printf(TEXT(\"GErrorMessage = \\n%s\"), GErrorMessage);\n\n\t// Only register game thread crashes\n\tconst bool bIsInGameThread = IsInGameThread();\n\tif (USoAnalytics* Analytics = GameInstance->GetAnalytics())\n\t{\n\t\tif (bIsInGameThread)\n\t\t{\n\t\t\tAnalytics->RecordErrorEvent(ESoAnalyticsErrorType::EAE_Critical, CrashErrorMessage);\n\t\t\tAnalytics->FlushEventsAndWait(true);\n\t\t}\n\n\t\t// Also log to the file\n\t\tUE_LOG(LogSoCrashHandler, Error, LINE_TERMINATOR LINE_TERMINATOR TEXT(\"=== USoGameInstance CRASH HANDLE ===\") LINE_TERMINATOR TEXT(\"%s\"), *CrashErrorMessage);\n\t\tif (GLog)\n\t\t\tGLog->PanicFlushThreadedLogs();\n\t}\n\n\tif (!bFromEnsure)\n\t{\n\t\tbSentCrashReport = true;\n\t}\n\tCrashErrorMessage.Empty();\n\n\tif (bIsInGameThread)\n\t\tOpenCrashFeedbackBrowserAndExplorer();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSoCrashHandler::OpenCrashFeedbackBrowserAndExplorer()\n{\n\t// DISABLED as we just send the data to a third party\n\treturn;\n\n\t// Don't open anything if we are at conference running a video demo\n#if !WARRIORB_WITH_EDITOR && !WARRIORB_WITH_VIDEO_DEMO\n\n\tFString FeedbackURL;\n\tif (USoPlatformHelper::IsDemo())\n\t{\n\t\tif (WARRIORB_WITH_STEAM)\n\t\t\tFeedbackURL = USoGameSingleton::Get().FeedbackURLDemoSteam;\n\t\telse\n\t\t\tFeedbackURL = USoGameSingleton::Get().FeedbackURLDemo;\n\t}\n\telse\n\t{\n\t\t// Main Game\n\t\tif (WARRIORB_WITH_STEAM)\n\t\t\tFeedbackURL = USoGameSingleton::Get().FeedbackURLDemoSteam;\n\t\telse\n\t\t\tFeedbackURL = USoGameSingleton::Get().FeedbackURL;\n\t}\n\n\tUSoPlatformHelper::LaunchURL(FeedbackURL, true);\n\n\t// Open Warriorb/ Folder\n\tstatic const FString ProjectDir = FPaths::ConvertRelativePathToFull(FPaths::ProjectDir());\n\tUSoPlatformHelper::ExploreFolder(ProjectDir);\n#endif\n}\n"
  },
  {
    "path": "Source/SOrb/Basic/SoCrashHandler.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#pragma once\n\n#include \"CoreMinimal.h\"\n\n#include \"SoCrashHandler.generated.h\"\n\nclass USoGameInstance;\n\n// Handle crashing\n// Also see:\n// - https://docs.sentry.io/platforms/native/ue4/\n// - https://forum.sentry.io/t/unreal-engine-crash-reporter-cant-get-it-to-work/7643\nUSTRUCT()\nstruct FSoCrashHandler\n{\n\tGENERATED_USTRUCT_BODY()\n\ttypedef FSoCrashHandler Self;\npublic:\n\tvoid Initialize(USoGameInstance* Instance);\n\tvoid Shutdown();\n\nprotected:\n\t// Adds the current player context to the crash error message\n\tvoid AddContextToCrashErrorMessage();\n\n\t// an ensure has occurred\n\tvoid HandleOnCrashFromEnsure();\n\n\t// error (crash) has occurred\n\tvoid HandleOnCrash();\n\n\t// After sent to server.\n\tvoid HandleOnShutdownAfterCrash(const bool bFromEnsure);\n\n\t// Opens up a google doc + the folder we need\n\tvoid OpenCrashFeedbackBrowserAndExplorer();\n\nprotected:\n\t// Used when we are crashing\n\tbool bSentCrashReport = false;\n\tFString CrashErrorMessage;\n\n\t// Backwards reference to the game instance, our owner\n\tUSoGameInstance* GameInstance = nullptr;\n};\n"
  },
  {
    "path": "Source/SOrb/Basic/SoDialogueParticipant.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#include \"SoDialogueParticipant.h\"\n\nFSoDialogueParticipantData FSoDialogueParticipantData::InvalidValue;\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUSoDialogueParticipant::USoDialogueParticipant(const FObjectInitializer& PCIP)\n\t: Super(PCIP)\n{\n}\n"
  },
  {
    "path": "Source/SOrb/Basic/SoDialogueParticipant.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#pragma once\n\n#include \"UObject/Interface.h\"\n#include \"SoDialogueParticipant.generated.h\"\n\nclass UTexture2D;\nclass UFMODEvent;\n\n/** Struct containing all the UI relevant dialogue parameters */\nUSTRUCT(BlueprintType)\nstruct FSoDialogueParticipantData\n{\n\tGENERATED_USTRUCT_BODY()\npublic:\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = DialogueUIData)\n\tFName ParticipantName;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = DialogueUIData)\n\tFText ParticipantDisplayName;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = DialogueUIData)\n\tint32 PositionIndex = 0;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = DialogueUIData)\n\tFName FadeInAnimName;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = DialogueUIData)\n\tFName FadeOutAnimName;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = DialogueUIData)\n\tfloat TextBoxY = 0.f;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = DialogueUIData)\n\tFVector2D FloorPosition;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = DialogueUIData)\n\tUTexture2D* ParticipantIcon = nullptr;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = DialogueUIData)\n\tUTexture2D* FloorImage = nullptr;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = DialogueUIData)\n\tUTexture2D* NameTextBackground = nullptr;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = DialogueUIData)\n\tUTexture2D* TextBoxBackground = nullptr;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = DialogueUIData)\n\tUFMODEvent* Music = nullptr;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = DialogueUIData)\n\tfloat PrevMusicFadeDuration = 0.2f;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = DialogueUIData)\n\tbool bKeepMusicAfterDialogue = false;\n\npublic:\n\n\tstatic FSoDialogueParticipantData InvalidValue;\n};\n\n\n/**\n *\n */\nUINTERFACE(meta = (CannotImplementInterfaceInBlueprint))\nclass SORB_API USoDialogueParticipant : public UInterface\n{\n\tGENERATED_UINTERFACE_BODY()\n};\n\n/**\n *   C++ only interface to get dialogue data\n *   All Dialogue participants must implement it\n *   To call the function simply use Cast<ISoDialogueParticipant>(Object)->GetParticipantData(), no Execute_ function is generated\n */\nclass SORB_API ISoDialogueParticipant\n{\n\tGENERATED_IINTERFACE_BODY()\n\n\tUFUNCTION(BlueprintCallable, Category = WaitWhat)\n\tvirtual const FSoDialogueParticipantData& GetParticipantData() const { return FSoDialogueParticipantData::InvalidValue; }\n};\n"
  },
  {
    "path": "Source/SOrb/Basic/SoDifficulty.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#pragma once\n#include \"CoreMinimal.h\"\n\n#include \"SoDifficulty.generated.h\"\n\n\n////////////////////////////////////////////////////////////////////////////////////////\nUENUM(BlueprintType)\nenum class ESoDifficulty : uint8\n{\n\t/** Soulkeeper can be resummoned without being picked up first */\n\tSane\t\t\tUMETA(DisplayName = \"Sane\"),\n\n\t/** Soulkeeper can not be summoned if it is already placed */\n\tIntended\t\tUMETA(DisplayName = \"Intended\"),\n\n\t/** Soulkeeper is for the mediocre... I mean normal people */\n\tInsane\t\t\tUMETA(DisplayName = \"Insane\"),\n\n\tNumOf\t\t\tUMETA(Hidden)\n};\n\n"
  },
  {
    "path": "Source/SOrb/Basic/SoEventHandler.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#include \"SoEventHandler.h\"\n\n#include \"Basic/SoGameMode.h\"\n#include \"Basic/Helpers/SoStaticHelper.h\"\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoEventHandlerHelper::SubscribeToSoPostLoad(UObject* WorldContextObject)\n{\n\tif (auto* GameMode = ASoGameMode::GetInstance(WorldContextObject))\n\t\tGameMode->SubscribeToSoPostLoad(WorldContextObject);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoEventHandlerHelper::UnsubscribeFromSoPostLoad(UObject* WorldContextObject)\n{\n\tif (auto* GameMode = ASoGameMode::GetInstance(WorldContextObject))\n\t\tGameMode->UnsubscribeFromSoPostLoad(WorldContextObject);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoEventHandlerHelper::SubscribeToPlayerRematerialize(UObject* WorldContextObject)\n{\n\tif (auto* GameMode = ASoGameMode::GetInstance(WorldContextObject))\n\t\tGameMode->SubscribeToPlayerRematerialize(WorldContextObject);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoEventHandlerHelper::UnsubscribeFromPlayerRematerialize(UObject* WorldContextObject)\n{\n\tif (auto* GameMode = ASoGameMode::GetInstance(WorldContextObject))\n\t\tGameMode->UnsubscribeFromPlayerRematerialize(WorldContextObject);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoEventHandlerHelper::SubscribeToPlayerRespawn(UObject* WorldContextObject)\n{\n\tif (auto* GameMode = ASoGameMode::GetInstance(WorldContextObject))\n\t\tGameMode->SubscribeToPlayerRespawn(WorldContextObject);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoEventHandlerHelper::UnsubscribeFromPlayerRespawn(UObject* WorldContextObject)\n{\n\tif (auto* GameMode = ASoGameMode::GetInstance(WorldContextObject))\n\t\tGameMode->UnsubscribeFromPlayerRespawn(WorldContextObject);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoEventHandlerHelper::SubscribeWhitelistedSplines(UObject* WorldContextObject, const TArray<TAssetPtr<ASoSpline>>& WhitelistedSplines)\n{\n\tif (auto* GameMode = ASoGameMode::GetInstance(WorldContextObject))\n\t\tGameMode->SubscribeWhitelistedSplines(WorldContextObject, WhitelistedSplines);\n}\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoEventHandlerHelper::UnsubscribeWhitelistedSplines(UObject* WorldContextObject)\n{\n\tif (auto* GameMode = ASoGameMode::GetInstance(WorldContextObject))\n\t\tGameMode->UnsubscribeWhitelistedSplines(WorldContextObject);\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUSoEventHandler::USoEventHandler(const FObjectInitializer& PCIP)\n\t: Super(PCIP)\n{\n}\n"
  },
  {
    "path": "Source/SOrb/Basic/SoEventHandler.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#pragma once\n#include \"UObject/Interface.h\"\n#include \"Kismet/BlueprintFunctionLibrary.h\"\n#include \"SoEventHandler.generated.h\"\n\nclass ASoSpline;\n\n/**\n *  Helper functions because UInterface can't have static functions\n *  UObjects passed as parameter must implement the ISoEventHandler interface!\n */\nUCLASS()\nclass SORB_API USoEventHandlerHelper : public UBlueprintFunctionLibrary\n{\n\tGENERATED_BODY()\n\npublic:\n\t/** Subscribes to post load and calls HandleSoPostLoad() on the subscribed actor */\n\tUFUNCTION(BlueprintCallable, Category = SoPostLoad, meta = (WorldContext = \"WorldContextObject\"))\n\tstatic void SubscribeToSoPostLoad(UObject* WorldContextObject);\n\n\t/** Unsubscribes from post load, should be called when the actor is removed from level / destroyed */\n\tUFUNCTION(BlueprintCallable, Category = SoPostLoad, meta = (WorldContext = \"WorldContextObject\"))\n\tstatic void UnsubscribeFromSoPostLoad(UObject* WorldContextObject);\n\n\n\t/** Registers caller to the list so HandlePlayerRematerialize() will be called on it. Is not called on subscribe */\n\tUFUNCTION(BlueprintCallable, Category = SoPostLoad, meta = (WorldContext = \"WorldContextObject\"))\n\tstatic void SubscribeToPlayerRematerialize(UObject* WorldContextObject);\n\n\tUFUNCTION(BlueprintCallable, Category = SoPostLoad, meta = (WorldContext = \"WorldContextObject\"))\n\tstatic void UnsubscribeFromPlayerRematerialize(UObject* WorldContextObject);\n\n\n\t/** Registers caller to the list so HandlePlayerRematerialize() will be called on it. Is not called on subscribe */\n\tUFUNCTION(BlueprintCallable, Category = SoPostLoad, meta = (WorldContext = \"WorldContextObject\"))\n\tstatic void SubscribeToPlayerRespawn(UObject* WorldContextObject);\n\n\tUFUNCTION(BlueprintCallable, Category = SoPostLoad, meta = (WorldContext = \"WorldContextObject\"))\n\tstatic void UnsubscribeFromPlayerRespawn(UObject* WorldContextObject);\n\n\n\t/**\n\t *  Registers USoEventHandler implementers and notifies them based on area checks on player spline change\n\t *  If the character is in whitelisted area right now the HandleWhitelistedSplinesEntered() is called immediately\n\t */\n\tUFUNCTION(BlueprintCallable, Category = SoPostLoad, meta = (WorldContext = \"WorldContextObject\"))\n\tstatic void SubscribeWhitelistedSplines(UObject* WorldContextObject, const TArray<TAssetPtr<ASoSpline>>& WhitelistedSplines);\n\n\t/** Expected not to be called during spline change callback */\n\tUFUNCTION(BlueprintCallable, Category = SoPostLoad, meta = (WorldContext = \"WorldContextObject\"))\n\tstatic void UnsubscribeWhitelistedSplines(UObject* WorldContextObject);\n};\n\n\n/** Just unreal interface thing */\nUINTERFACE()\nclass SORB_API USoEventHandler : public UInterface\n{\n\tGENERATED_UINTERFACE_BODY()\n};\n\n\nclass SORB_API ISoEventHandler\n{\n\tGENERATED_IINTERFACE_BODY()\n\n\t/** Called on each actor after a save file is loaded */\n\tUFUNCTION(BlueprintNativeEvent, BlueprintCallable, Category = SoPostLoadHandler)\n\tvoid HandleSoPostLoad();\n\n\t/**\n\t *  Called if registered in case of the following events:\n\t *\t\t- Player died and respawned near Checkpoint/Soulkeeper\n\t *\t\t- Player interacted with a Soulkeeper and regained HP (the world has to be reset in this case, same way as if he would have died)\n\t *\t\t- Player performed a BreakIntoPeaces/FallIntoDeath HitReact and respawned near a rematerialize point\n\t *\t\t\t(Some traps must be reset in this case, or they are ruined / could be skipped)\n\t */\n\tUFUNCTION(BlueprintNativeEvent, BlueprintCallable, Category = SoPostLoadHandler)\n\tvoid HandlePlayerRematerialize();\n\n\t/**\n\t *  Called if registered in case of the following events:\n\t *\t\t- Player died and respawned near Checkpoint/Soulkeeper\n\t */\n\tUFUNCTION(BlueprintNativeEvent, BlueprintCallable, Category = SoPostLoadHandler)\n\tvoid HandlePlayerRespawn();\n\n\n\n\tUFUNCTION(BlueprintNativeEvent, BlueprintCallable, Category = SoPostLoadHandler)\n\tvoid HandleWhitelistedSplinesEntered();\n\n\tUFUNCTION(BlueprintNativeEvent, BlueprintCallable, Category = SoPostLoadHandler)\n\tvoid HandleWhitelistedSplinesLeft();\n};\n"
  },
  {
    "path": "Source/SOrb/Basic/SoEventHelperComponent.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#include \"SoEventHelperComponent.h\"\n#include \"Basic/Helpers/SoStaticHelper.h\"\n#include \"SplineLogic/SoSpline.h\"\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUSoEventHelperComponent::USoEventHelperComponent()\n{\n\tPrimaryComponentTick.bCanEverTick = false;\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoEventHelperComponent::BeginPlay()\n{\n\tSuper::BeginPlay();\n\n\tif (bHandleSoPostLoad)\n\t\tUSoEventHandlerHelper::SubscribeToSoPostLoad(this);\n\tif (bHandlePlayerRematerialize)\n\t\tUSoEventHandlerHelper::SubscribeToPlayerRematerialize(this);\n\tif (bHandlePlayerRespawn)\n\t\tUSoEventHandlerHelper::SubscribeToPlayerRespawn(this);\n\tif (bHandleWhitelistedSplines && WhitelistedSplines.Num() > 0)\n\t{\n\t\tbool bInWhiteListed = false;\n\t\tUSoEventHandlerHelper::SubscribeWhitelistedSplines(this, WhitelistedSplines);\n\t\tif (ASoSpline* PlayerSpline = USoStaticHelper::GetPlayerSplineLocation(this).GetSpline())\n\t\t\tfor (TAssetPtr<ASoSpline>& AssetPtr : WhitelistedSplines)\n\t\t\t\tif (AssetPtr.Get() == PlayerSpline)\n\t\t\t\t{\n\t\t\t\t\tbInWhiteListed = true;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\tif (bInWhiteListed)\n\t\t\tOnWhitelistedSplinesEntered.Broadcast();\n\t\telse\n\t\t\tOnWhitelistedSplinesLeft.Broadcast();\n\t}\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoEventHelperComponent::EndPlay(const EEndPlayReason::Type EndPlayReason)\n{\n\tif (bHandleSoPostLoad)\n\t\tUSoEventHandlerHelper::UnsubscribeFromSoPostLoad(this);\n\tif (bHandlePlayerRematerialize)\n\t\tUSoEventHandlerHelper::UnsubscribeFromPlayerRematerialize(this);\n\tif (bHandlePlayerRespawn)\n\t\tUSoEventHandlerHelper::UnsubscribeFromPlayerRespawn(this);\n\tif (bHandleWhitelistedSplines)\n\t\tUSoEventHandlerHelper::UnsubscribeWhitelistedSplines(this);\n\n\tSuper::EndPlay(EndPlayReason);\n}\n"
  },
  {
    "path": "Source/SOrb/Basic/SoEventHelperComponent.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#pragma once\n\n#include \"CoreMinimal.h\"\n#include \"Components/ActorComponent.h\"\n\n#include \"SoEventHandler.h\"\n\n#include \"SoEventHelperComponent.generated.h\"\n\nDECLARE_DYNAMIC_MULTICAST_DELEGATE(FSoEventHelperSignature);\n\n\n/**\n *  Helper class implementing SoEventHandler interface, and doing the subscriptions/unsubscriptions based on bools\n *  Subscribed events are handled via firing an event\n */\nUCLASS(ClassGroup=(Custom), meta=(BlueprintSpawnableComponent))\nclass SORB_API USoEventHelperComponent : public UActorComponent, public ISoEventHandler\n{\n\tGENERATED_BODY()\n\npublic:\n\t// Sets default values for this component's properties\n\tUSoEventHelperComponent();\n\n\tFORCEINLINE virtual void HandlePlayerRespawn_Implementation() override\t\t\t\t{ OnPlayerRespawn.Broadcast();\t\t\t\t}\n\tFORCEINLINE virtual void HandleSoPostLoad_Implementation() override\t\t\t\t\t{ OnSoPostLoad.Broadcast();\t\t\t\t\t}\n\tFORCEINLINE virtual void HandlePlayerRematerialize_Implementation() override\t\t{ OnPlayerRematerialize.Broadcast();\t\t}\n\n\t// maybe TODO\n\tFORCEINLINE virtual void HandleWhitelistedSplinesEntered_Implementation() override\t{ OnWhitelistedSplinesEntered.Broadcast();\t}\n\tFORCEINLINE virtual void HandleWhitelistedSplinesLeft_Implementation() override\t\t{ OnWhitelistedSplinesLeft.Broadcast();\t\t}\n\n\nprotected:\n\t// Called when the game starts\n\tvirtual void BeginPlay() override;\n\tvirtual void EndPlay(const EEndPlayReason::Type EndPlayReason) override;\n\npublic:\n\n\tUPROPERTY(BlueprintAssignable, Category = EventHelper)\n\tFSoEventHelperSignature OnSoPostLoad;\n\n\tUPROPERTY(BlueprintAssignable, Category = EventHelper)\n\tFSoEventHelperSignature OnPlayerRematerialize;\n\n\tUPROPERTY(BlueprintAssignable, Category = EventHelper)\n\tFSoEventHelperSignature OnPlayerRespawn;\n\n\tUPROPERTY(BlueprintAssignable, Category = EventHelper)\n\tFSoEventHelperSignature OnWhitelistedSplinesEntered;\n\n\tUPROPERTY(BlueprintAssignable, Category = EventHelper)\n\tFSoEventHelperSignature OnWhitelistedSplinesLeft;\n\nprotected:\n\n\t/** ONLY MODIFY THESE IN ACTOR'S CONSTRUCTION SCRIPT - the should not change once BeginPlay() is called */\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = EventHelper)\n\tbool bHandleSoPostLoad;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = EventHelper)\n\tbool bHandlePlayerRematerialize;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = EventHelper)\n\tbool bHandlePlayerRespawn;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = EventHelper)\n\tbool bHandleWhitelistedSplines;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = EventHelper)\n\tTArray<TAssetPtr<ASoSpline>> WhitelistedSplines;\n};\n"
  },
  {
    "path": "Source/SOrb/Basic/SoGameEngine.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#include \"SoGameEngine.h\"\n\n#include \"Basic/SoGameMode.h\"\n#include \"Basic/SoGameSingleton.h\"\n#include \"Basic/SoGameInstance.h\"\n#include \"Settings/SoGameSettings.h\"\n#include \"Misc/FileHelper.h\"\n\nDEFINE_LOG_CATEGORY_STATIC(LogSoGameEngine, All, All)\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUSoGameEngine::USoGameEngine(const FObjectInitializer& ObjectInitializer)\n\t: Super(ObjectInitializer)\n{\n\n}\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoGameEngine::Init(IEngineLoop* InEngineLoop)\n{\n\t// FString String;\n\t// FFileHelper::LoadFileToString(String, TEXT(\"U:\\\\Warriorb\\\\Config\\\\Test.ini\"));\n\t// const TCHAR* StrPtr = *String;\n\t// bool bIsPureANSII = SoIsPureAnsi(StrPtr);\n\n\tSuper::Init(InEngineLoop);\n\tUE_LOG(LogSoGameEngine, Log, TEXT(\"Init\"));\n\n\tif (FParse::Param(FCommandLine::Get(), TEXT(\"AssetsPrintAll\")))\n\t\tUSoPlatformHelper::PrintAllAssets();\n\tif (FParse::Param(FCommandLine::Get(), TEXT(\"AssetsPrintAllMaps\")))\n\t\tUSoPlatformHelper::PrintAllAssetsMaps();\n\n\t// Check if GPU is in blacklist\n\t//USoPlatformHelper::WarnIfGPUIsBlacklisted();\n\n\t// Move to particular monitor\n\tUSoPlatformHelper::MoveGameToDefaultMonitor();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoGameEngine::Start()\n{\n\t// Start GameInstance\n\tUE_LOG(LogSoGameEngine, Log, TEXT(\"Start\"));\n\tSuper::Start();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoGameEngine::PreExit()\n{\n\tUE_LOG(LogSoGameEngine, Log, TEXT(\"PreExit\"));\n\n\t// Save the current slot on shutdown\n#if !WARRIORB_WITH_EDITOR\n\t// Find Current Game world\n\tbool bFoundAtLeastOneWorld = false;\n\tfor (int32 WorldIndex = 0; WorldIndex < WorldList.Num(); ++WorldIndex)\n\t{\n\t\tUWorld* const World = WorldList[WorldIndex].World();\n\t\t// Invalid world or not a game world\n\t\tif (World == nullptr || !World->IsGameWorld())\n\t\t\tcontinue;\n\n\t\tif (USoGameInstance* SoGameInstance = USoGameInstance::GetInstance(World))\n\t\t{\n\t\t\tbFoundAtLeastOneWorld = true;\n\t\t\tSoGameInstance->SaveGameForCurrentState();\n\t\t}\n\t\telse\n\t\t{\n\t\t\tUE_LOG(LogSoGameEngine, Error, TEXT(\"USoGameEngine::PreExit Found a valid Game World but could not get the ASOrbGameMode\"));\n\t\t}\n\t}\n\n\tif (bFoundAtLeastOneWorld)\n\t{\n\t\tUE_LOG(LogSoGameEngine, Verbose, TEXT(\"USoGameEngine::PreExit Found a valid Game World.\"));\n\t}\n\telse\n\t{\n\t\tUE_LOG(LogSoGameEngine, Error, TEXT(\"USoGameEngine::PreExit Could not find any valid Game World\"));\n\t}\n#endif\n\n\t// NOTE: This destroys all the worlds so we must call it at the end.\n\tSuper::PreExit();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoGameEngine::WorldAdded(UWorld* World)\n{\n\tSuper::WorldAdded(World);\n\tUE_LOG(LogSoGameEngine, Log, TEXT(\"WorldAdded\"));\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoGameEngine::WorldDestroyed(UWorld* InWorld)\n{\n\tSuper::WorldDestroyed(InWorld);\n\tUE_LOG(LogSoGameEngine, Log, TEXT(\"WorldDestroyed\"));\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoGameEngine::OnLostFocusPause(bool EnablePause)\n{\n\t//ensure(false);\n\tSuper::OnLostFocusPause(EnablePause);\n}\n"
  },
  {
    "path": "Source/SOrb/Basic/SoGameEngine.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#pragma once\n\n#include \"Engine/GameEngine.h\"\n#include \"SoGameEngine.generated.h\"\n\n\n/**\n * Custom Game Engine functionality.\n * For Editor engine functionality see USoGameEditorEngine\n */\nUCLASS()\nclass USoGameEngine : public UGameEngine\n{\n\tGENERATED_BODY()\npublic:\n\tUSoGameEngine(const FObjectInitializer& ObjectInitializer);\n\n\t// UEngine interface\n\n\tvoid Init(IEngineLoop* InEngineLoop) override;\n\tvoid Start() override;\n\tvoid PreExit() override;\n\tvoid WorldAdded(UWorld* World) override;\n\tvoid WorldDestroyed(UWorld* InWorld) override;\n\n\t// NOTE: seems to be not used by anybody\n\tvoid OnLostFocusPause(bool EnablePause) override;\n};\n"
  },
  {
    "path": "Source/SOrb/Basic/SoGameInstance.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#include \"SoGameInstance.h\"\n\n#include \"EngineUtils.h\"\n#include \"Misc/CoreDelegates.h\"\n#include \"Engine/Engine.h\"\n#include \"Engine/StaticMeshActor.h\"\n#include \"TimerManager.h\"\n#include \"Misc/Paths.h\"\n#include \"Kismet/GameplayStatics.h\"\n#include \"MediaPlayer.h\"\n#include \"MediaTexture.h\"\n#include \"LevelSequenceActor.h\"\n#include \"Components/StaticMeshComponent.h\"\n\n#if WARRIORB_WITH_ONLINE\n#include \"OnlineSubsystem.h\"\n#endif\n\n#include \"UI/Menu/SoUIMenuMain.h\"\n\n#include \"Enemy/EActions/SoEAction.h\"\n#include \"Enemy/SoEnemyVoiceManager.h\"\n\n#include \"Settings/Input/SoInputHelper.h\"\n#include \"Settings/SoGameSettings.h\"\n\n#include \"Character/SoCharacter.h\"\n#include \"Character/SoCharStates/SoAWaitForActivitySwitch.h\"\n#include \"Character/SoCharStates/SoATeleport.h\"\n#include \"Character/SoPlayerController.h\"\n#include \"Character/SoPlayerProgress.h\"\n\n#include \"Levels/SoLevelHelper.h\"\n#include \"Levels/SoLevelManager.h\"\n\n#include \"Basic/SoAudioManager.h\"\n#include \"Basic/Helpers/SoStaticHelper.h\"\n#include \"Basic/Helpers/SoPlatformHelper.h\"\n#include \"Basic/Helpers/SoStringHelper.h\"\n#include \"Basic/SoCheatManager.h\"\n\n#include \"Effects/SoEffectBase.h\"\n#include \"Basic/SoGameMode.h\"\n#include \"SaveFiles/SoWorldState.h\"\n#include \"SoGameViewportClient.h\"\n#include \"Projectiles/SoProjectile.h\"\n\n#include \"Online/Analytics/SoAnalytics.h\"\n#include \"Online/Analytics/SoAnalyticsComponent.h\"\n#include \"Online/Achievements/SoAchievementManager.h\"\n#include \"Online/SoOnlineHelper.h\"\n\n\n#include \"SoLocalization.h\"\n\n#if WARRIORB_WITH_VIDEO_DEMO\n#include \"UI/General/SoUIVideoPlayer.h\"\n#include \"MediaPlayer.h\"\n#include \"MediaTexture.h\"\n#include \"FileMediaSource.h\"\n#endif // WARRIORB_WITH_VIDEO_DEMO\n\n#include \"FMODEvent.h\"\n#include \"FMODBus.h\"\n#include \"FMODVCA.h\"\n\n#include \"INYLoadingScreenModule.h\"\n#include \"SoGameSingleton.h\"\n#include \"SplineLogic/SoMarker.h\"\n\n#if WARRIORB_WITH_DISCORD\n#include \"DiscordHelper.h\"\n#endif // WARRIORB_WITH_DISCORD\n\n\nDEFINE_LOG_CATEGORY_STATIC(LogSoGameInstance, All, All)\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUSoGameInstance::USoGameInstance(const FObjectInitializer& ObjectInitializer) : Super(ObjectInitializer)\n{\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUSoGameInstance::~USoGameInstance()\n{\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoGameInstance::Init()\n{\n\tUE_LOG(LogSoGameInstance, Log, TEXT(\"Init\"));\n\n\t// Crashing\n\tCrashHandler.Initialize(this);\n\n\t// Disable some stupid stuff\n#if !WARRIORB_WITH_EDITOR\n\tUSoPlatformHelper::DisableScreenMessages();\n#endif\n\tUSoPlatformHelper::DisableVerifyGC();\n\tUSoPlatformHelper::DisableAILogging();\n\n\t// Must update the runtime data if we are playing in Editor\n// #if WITH_EDITOR\n\t// USoGameSingleton::Get().UpdateRuntimeStreamData();\n// #endif\n\n\tLoadingScreenInstance = INYLoadingScreenModule::Get().GetInstance();\n\n\t// Log stuff about the game\n\tUE_LOG(LogSoGameInstance, Log, TEXT(\"%s\"), *USoPlatformHelper::ToStringPlatformContext());\n\n\t// Command line overrides\n\t{\n\t\tFString CheatsPassword;\n\t\tif (FParse::Value(FCommandLine::Get(), TEXT(\"CheatsPassword=\"), CheatsPassword))\n\t\t{\n\t\t\tUE_LOG(LogSoGameInstance, Verbose, TEXT(\"CommandlineOverride: CheatsPassword = `%s`\"), *CheatsPassword);\n\n\t\t\tif (USoCheatManager::IsAllowCheatsPasswordValid(CheatsPassword))\n\t\t\t{\n\t\t\t\tUE_LOG(LogSoGameInstance, Log, TEXT(\"Enabling cheats because of command line override\"));\n\t\t\t\tSetAllowCheats(true);\n\t\t\t}\n\t\t}\n\t}\n\n\tSuper::Init();\n\n\t// Game settings\n\tUSoGameSettings::Get().SetWorldContextObject(this);\n\n\t// Check if we are in steam\n#if WARRIORB_WITH_STEAM\n\tUSoPlatformHelper::InitializedSteam();\n\tif (USoPlatformHelper::IsSteamInitialized())\n\t{\n\t\tUE_LOG(LogSoGameInstance, Log, TEXT(\"Steam is initialized\"));\n\t\tUE_LOG(\n\t\t\tLogSoGameInstance,\n\t\t\tLog,\n\t\t\tTEXT(\"AppId = %s, Language = %s, IsSteamBigPicture = %d\"),\n\t\t\t*USoPlatformHelper::GetCurrentSteamAppID(), *USoPlatformHelper::GetSteamCurrentGameLanguage(), USoPlatformHelper::IsSteamBigPicture()\n\t\t);\n\t}\n\telse\n\t{\n\t\tUE_LOG(LogSoGameInstance, Warning, TEXT(\"Steam is NOT initialized\"));\n\t}\n\t//UE_LOG(LogSoGameInstance, Log, TEXT(\"IsSteamBuildPirated = %d\"), USoPlatformHelper::IsSteamBuildPirated());\n#endif // WARRIORB_WITH_STEAM\n\n#if WARRIORB_WITH_DISCORD\n\tUDiscordHelper::Initialize(USoPlatformHelper::GetDiscordClientID(USoPlatformHelper::IsDemo()));\n\n\tUDiscordHelper::UpdatePlayActivity(TEXT(\"State\"), TEXT(\"Details\"));\n\n\t#if WARRIORB_WITH_STEAM\n\tUDiscordHelper::RegisterSteam(USoPlatformHelper::GetSteamAppID(USoPlatformHelper::IsDemo()));\n\t#endif // WARRIORB_WITH_STEAM\n\n#endif // WARRIORB_WITH_DISCORD\n\n\t// Speed run competition\n\tif (FSoConsoleCommands::IsSpeedRunCompetitionMode())\n\t{\n\t\tUE_LOG(LogSoGameInstance, Log, TEXT(\"SpeedRunCompetitionMode Enabled\"));\n\t}\n\n\t// NOTE: do not init audio here because it is too early in the loading\n\t// NOTE: do not init achievements here because the PlayerController is not loaded yet\n\tInitializeAnalytics();\n\n\t// TODO: focus receive/lost does not also work on linux\n\t// Listen for gamepad/controller changes. TODO: does not seem to be on linux\n\tFCoreDelegates::OnControllerConnectionChange.AddUObject(this, &ThisClass::HandleOnGamepadConnectionChange);\n\t//FCoreDelegates::OnControllerPairingChange.AddUObject(this, &ThisClass::HandleOnGamepadPariringChange);\n\t// NOTE: FCoreDelegates::OnControllerPairingChange seems to not used\n\tFCoreUObjectDelegates::PreLoadMap.AddUObject(this, &ThisClass::OnPreLoadMap);\n\tFCoreUObjectDelegates::PostLoadMapWithWorld.AddUObject(this, &ThisClass::OnPostLoadMapWithWorld);\n\n\tif (USoPlatformHelper::IsDemo())\n\t{\n\t\tUseSavesForDemo();\n\t}\n\n#if WARRIORB_WITH_ONLINE\n\tif (USoPlatformHelper::IsXboxOne())\n\t{\n\t\tif (const auto OnlineSub = IOnlineSubsystem::Get())\n\t\t{\n\t\t\tconst auto IdentityInterface = OnlineSub->GetIdentityInterface();\n\t\t\tif (IdentityInterface.IsValid())\n\t\t\t{\n\t\t\t\tIdentityInterface->AddOnControllerPairingChangedDelegate_Handle(FOnControllerPairingChangedDelegate::CreateUObject(this, &USoGameInstance::HandleControllerPairingChanged));\n\n\t\t\t\tfor (int i = 0; i < MAX_LOCAL_PLAYERS; ++i)\n\t\t\t\t{\n\t\t\t\t\tIdentityInterface->AddOnLoginStatusChangedDelegate_Handle(i, FOnLoginStatusChangedDelegate::CreateUObject(this, &USoGameInstance::HandleUserLoginChanged));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n#endif\n\n\tApplicationWillDeactivateDelegate = FCoreDelegates::ApplicationWillDeactivateDelegate.AddUObject(this, &ThisClass::HandleApplicationWillDeactivate);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoGameInstance::Shutdown()\n{\n\tif (ApplicationWillDeactivateDelegate.IsValid())\n\t{\n\t\tFCoreDelegates::ApplicationWillDeactivateDelegate.Remove(ApplicationWillDeactivateDelegate);\n\t\tApplicationWillDeactivateDelegate.Reset();\n\t}\n\n\tUE_LOG(LogSoGameInstance, Log, TEXT(\"Shutdown\"));\n\tFCoreDelegates::OnControllerConnectionChange.RemoveAll(this);\n\tCrashHandler.Shutdown();\n\n\tShutdownAudio();\n\tShutdownAnalytics();\n\n\tFCoreUObjectDelegates::PreLoadMap.RemoveAll(this);\n\tFCoreUObjectDelegates::PostLoadMapWithWorld.RemoveAll(this);\n\tLoadingScreenInstance.Reset();\n\tSuper::Shutdown();\n\t// NOTE: Do not save here as the World is already destroyed (nullptr)\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoGameInstance::StartGameInstance()\n{\n\t// TODO do not load default map here, load the current player chapter name\n\n\t// NOTE: this is only called in non editor builds\n\tSuper::StartGameInstance();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoGameInstance::OnPreLoadMap(const FString& MapName)\n{\n\tUE_LOG(LogSoGameInstance, Verbose, TEXT(\"OnPreLoadMap MapName = `%s`\"), *MapName);\n\tbIsTransitioningWorlds = true;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoGameInstance::OnPostLoadMapWithWorld(UWorld* InLoadedWorld)\n{\n\tUE_LOG(LogSoGameInstance, Verbose, TEXT(\"OnPostLoadMapWithWorld MapName = `%s`\"), *InLoadedWorld->GetMapName());\n\tbIsTransitioningWorlds = false;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoGameInstance::HandleOpenCommand(const TCHAR* Cmd, FOutputDevice& Ar, UWorld* InWorld)\n{\n\treturn Super::HandleOpenCommand(Cmd, Ar, InWorld);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoGameInstance::LoadComplete(float LoadTime, const FString& MapName)\n{\n\t// NOTE: This seems to be called after GameMode::StartPlay and every actor BeginPlay\n\tSuper::LoadComplete(LoadTime, MapName);\n\tUE_LOG(LogSoGameInstance, Verbose, TEXT(\"LoadComplete: Loaded MapName = `%s` in LoadTime = %f\"), *MapName, LoadTime);\n\n\t// Reopen menu and pause game\n\tbool bNewMapLoaded = false;\n\tif (State == ESoGameInstanceState::LoadingChapter)\n\t{\n\t\tState = ESoGameInstanceState::LoadingChapterCompleted;\n\t\tbNewMapLoaded = true;\n\t\tLoadGameForCurrentChapter(false);\n\t}\n\telse if (State == ESoGameInstanceState::LoadingEpisode)\n\t{\n\t\tState = ESoGameInstanceState::LoadingEpisodeCompleted;\n\t\tbNewMapLoaded = true;\n\t\tLoadGameForCurrentEpisode(false);\n\t}\n\telse if (State == ESoGameInstanceState::LoadingMenu)\n\t{\n\t\tState = ESoGameInstanceState::LoadingMenuCompleted;\n\t\tbNewMapLoaded = true;\n\t}\n\n\tif (bNewMapLoaded)\n\t\tShowLoadingScreen();\n\n\t// Open main menu again because the game is not started yet\n\tOpenMenuInstant();\n\t// PauseGame(!IsGameStarted());\n\tInitializeAudio();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUSoGameInstance* USoGameInstance::GetInstance(const UObject* WorldContextObject)\n{\n\tif (!GEngine || !WorldContextObject)\n\t\treturn nullptr;\n\n\tif (UWorld* World = GEngine->GetWorldFromContextObject(WorldContextObject, EGetWorldErrorMode::LogAndReturnNull))\n\t\treturn Cast<USoGameInstance>(World->GetGameInstance());\n\n\treturn nullptr;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoGameInstance::AllowCheats() const\n{\n\t// Always allow cheats in editor (PIE now supports networking)\n\treturn GIsEditor || bAllowCheats;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoGameInstance::SetAllowCheats(bool bAllow)\n{\n\tbAllowCheats = true;\n\tif (auto* GameMode = ASoGameMode::GetInstance(this))\n\t\tGameMode->ReloadConsoleCommands();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoGameInstance::BeforeGameModeStartPlay()\n{\n\t// Init the audio system before applying settings\n\tInitializeAudio();\n\n\t// Figure out the current level\n\tSetStateToCurrentLevelType();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoGameInstance::AfterGameModeStartPlay()\n{\n\tInitializeAchievements();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoGameInstance::BeforeGameModeEndPlay()\n{\n\tShutdownAchievements();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoGameInstance::OnLoadingCompleted()\n{\n\tif (bWasDeactivatedDuringLoading)\n\t{\n\t\tbWasDeactivatedDuringLoading = false;\n\t\tPauseGame(true, false);\n\t}\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoGameInstance::Tick(float DeltaSeconds)\n{\n\tif (State == ESoGameInstanceState::LoadingChapterCompleted)\n\t{\n\t\tif (!SafeUpdateLoadingScreen(DeltaSeconds, IsGameStarted()))\n\t\t{\n\t\t\tUE_LOG(LogSoGameInstance, Log, TEXT(\"Loading new chapter map finished\"));\n\t\t\tState = ESoGameInstanceState::Default;\n\t\t\tVerifyStateMatchesCurrentLevelType();\n\t\t\tOnLoadingCompleted();\n\t\t}\n\t}\n\telse if (State == ESoGameInstanceState::LoadingEpisodeCompleted)\n\t{\n\t\tif (!SafeUpdateLoadingScreen(DeltaSeconds, true))\n\t\t{\n\t\t\tUE_LOG(LogSoGameInstance, Log, TEXT(\"Loading new episode map finished\"));\n\t\t\tState = ESoGameInstanceState::PlayingEpisode;\n\t\t\tVerifyStateMatchesCurrentLevelType();\n\t\t\tOnLoadingCompleted();\n\t\t}\n\t}\n\telse if (State == ESoGameInstanceState::LoadingMenuCompleted)\n\t{\n\t\tif (!SafeUpdateLoadingScreen(DeltaSeconds, false))\n\t\t{\n\t\t\tUE_LOG(LogSoGameInstance, Log, TEXT(\"Loading menu level finished\"));\n\t\t\tState = ESoGameInstanceState::InMainMenu;\n\t\t\tbWasDeactivatedDuringLoading = false;\n\t\t}\n\t}\n\n\tif (AudioManager)\n\t\tAudioManager->Tick(DeltaSeconds);\n\n\tif (AchievementManager)\n\t\tAchievementManager->Tick(DeltaSeconds);\n\n\t// Loading Screen\n\tif (EnterSequenceTimer > 0.0f)\n\t{\n\t\tEnterSequenceTimer -= DeltaSeconds;\n\t\tif (EnterSequenceTimer <= 0.0f)\n\t\t{\n\t\t\tEnterSequenceTimer = -1.0f;\n\t\t\tStartEnterSequence();\n\t\t}\n\t}\n\n#if WARRIORB_WITH_DISCORD\n\tUDiscordHelper::RunCallbacks();\n#endif\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoGameInstance::StaticMeshHideRequest(AStaticMeshActor* StaticMeshActor, bool bHide)\n{\n\tif (StaticMeshActor == nullptr)\n\t\treturn;\n\n\tfor (int32 i = 0; i < StaticMeshHideRequests.Num(); ++i)\n\t{\n\t\tif (StaticMeshHideRequests[i].Actor == StaticMeshActor)\n\t\t{\n\t\t\tStaticMeshHideRequests[i].RequestCount += bHide ? 1 : -1;\n\t\t\tif (StaticMeshHideRequests[i].RequestCount <= 0)\n\t\t\t{\n\t\t\t\tStaticMeshHideRequests.RemoveAtSwap(i);\n\t\t\t\tStaticMeshActor->GetStaticMeshComponent()->SetVisibility(true);\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\t}\n\n\tif (bHide)\n\t{\n\t\tFSoHideRequests& Request = StaticMeshHideRequests.Add_GetRef({});\n\t\tRequest.Actor = StaticMeshActor;\n\t\tRequest.RequestCount = 1;\n\t\tStaticMeshActor->GetStaticMeshComponent()->SetVisibility(false);\n\t}\n}\n\n#if WARRIORB_WITH_ONLINE\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoGameInstance::HandleLoginUIClosed(TSharedPtr<const FUniqueNetId> UniqueId, const int ControllerIndex, const struct FOnlineError& Error)\n{\n\tUE_LOG(LogTemp, Warning, TEXT(\"HandleLoginUIClosed: UniqueId: %s ControllerIndex: %d\"), *UniqueId->ToString(), ControllerIndex);\n\n\tAPlayerController* PC = USoStaticHelper::GetPlayerController(this);\n\n\tif (PC == nullptr || PC->GetLocalPlayer() == nullptr)\n\t\treturn;\n\n\tFUniqueNetIdRepl CurrentNetID = PC->GetLocalPlayer()->GetUniqueNetIdFromCachedControllerId();\n\tUE_LOG(LogTemp, Warning, TEXT(\"Current UniqueId: %s\"), *(CurrentNetID.IsValid() ? CurrentNetID->ToString() : FString(\"INVALID\")));\n\n\t// no switch\n\tif (!UniqueId.IsValid() || !(*UniqueId).IsValid())\n\t{\n\t\treturn;\n\t}\n\n\tif (PC->GetLocalPlayer()->GetUniqueNetIdFromCachedControllerId() != UniqueId)\n\t{\n\t\tif (USoOnlineHelper::bWaitForFirstControllerInput)\n\t\t{\n\t\t\tUSoOnlineHelper::DestroyLocalPlayers(FindLocalPlayerFromUniqueNetId(UniqueId));\n\t\t\tUSoOnlineHelper::bWaitForFirstControllerInput = false;\n\t\t}\n\n\t\tPC->GetLocalPlayer()->SetControllerId(ControllerIndex);\n\t\tFSoWorldState::Get().SetUserIndex(ControllerIndex);\n\t\tFSoWorldState::Get().ReloadGameMetaData();\n\t\t// CachedControllerNetID = UniqueId;\n\t\t// SetBeforeMenuShownOnce(false);\n\t\tTeleportToMainMenu(false, true);\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoGameInstance::HandleUserLoginChanged(int32 GameUserIndex, ELoginStatus::Type PreviousLoginStatus, ELoginStatus::Type LoginStatus, const FUniqueNetId& UserId)\n{\n\tconst bool bSignedOut = (LoginStatus != ELoginStatus::LoggedIn);\n\tUE_LOG(LogOnline, Log, TEXT(\"HandleUserLoginChanged: bSignedOut: %i\"), (int)bSignedOut);\n\n\tif (!bSignedOut)\n\t\treturn;\n\n\tif (LocalPlayers.Num() > 1)\n\t{\n\t\tUE_LOG(LogOnline, Log, TEXT(\"HandleUserLoginChanged: login screen - ignored\"));\n\t\treturn;\n\t}\n\n\tif (LocalPlayers.Num() == 0)\n\t\treturn;\n\n\tFUniqueNetIdRepl OtherUniqueNetId = LocalPlayers[0]->GetPreferredUniqueNetId();\n\tif (OtherUniqueNetId.IsValid() &&\n\t\t*OtherUniqueNetId == UserId)\n\t{\n\t\tif (!IsLoadingMenu())\n\t\t{\n\t\t\tFSoWorldState::Get().SetUserIndex(-1);\n\t\t\tSetBeforeMenuShownOnce(false);\n\t\t\tTeleportToMainMenu(false, true);\n\t\t}\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoGameInstance::HandleControllerPairingChanged(int GameUserIndex, const FUniqueNetId& PreviousUser, const FUniqueNetId& NewUser)\n{\n\tUE_LOG(LogOnlineGame, Log, TEXT(\"USoGameInstance::HandleControllerPairingChanged GameUserIndex %d PreviousUser '%s' NewUser '%s'\"),\n\t\tGameUserIndex, *PreviousUser.ToString(), *NewUser.ToString());\n\n\tif ( PreviousUser.IsValid() && !NewUser.IsValid() )\n\t{\n\t\treturn;\n\t}\n\n\tif ( !PreviousUser.IsValid() && NewUser.IsValid() )\n\t{\n\t\treturn;\n\t}\n\n\t// Find the local player currently being controlled by this controller\n\tULocalPlayer * ControlledLocalPlayer\t= FindLocalPlayerFromControllerId( GameUserIndex );\n\n\t// See if the newly assigned profile is in our local player list\n\tULocalPlayer * NewLocalPlayer\t\t\t= FindLocalPlayerFromUniqueNetId( NewUser );\n\n\t// If the local player being controlled is not the target of the pairing change, then give them a chance\n\t// to continue controlling the old player with this controller\n\tif ( ControlledLocalPlayer != nullptr && ControlledLocalPlayer != NewLocalPlayer )\n\t{\n\t\tif (const auto OnlineSub = IOnlineSubsystem::Get())\n\t\t{\n\t\t\tconst auto IdentityInterface = OnlineSub->GetIdentityInterface();\n\t\t\tcheck(IdentityInterface.IsValid());\n\n\t\t\t// does not seem to work because the netid is controllerid related and everything gets confusing and meh\n\t\t\t// let's just return to the menu\n\n\t\t\t//for (int32 i = 0; i < MAX_LOCAL_PLAYERS; ++i)\n\t\t\t//{\n\t\t\t//\tTSharedPtr<const FUniqueNetId> PlayerID = IdentityInterface->GetUniquePlayerId(i);\n\t\t\t//\tif (PlayerID.IsValid() && *PlayerID == NewUser)\n\t\t\t//\t{\n\t\t\t//\t\tUSoStaticHelper::GetPlayerController(this)->GetLocalPlayer()->SetControllerId(i);\n\t\t\t//\t\treturn;\n\t\t\t//\t}\n\t\t\t//}\n\n\t\t\tFSoWorldState::Get().SetUserIndex(-1);\n\t\t\tSetBeforeMenuShownOnce(false);\n\t\t\tTeleportToMainMenu(false, true);\n\t\t}\n\t}\n}\n#endif\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoGameInstance::HandleApplicationWillDeactivate()\n{\n\tif (IsLoading())\n\t{\n\t\tbWasDeactivatedDuringLoading = true;\n\t}\n\tPauseGame(true);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoGameInstance::UseSavesForDemo()\n{\n\tFSoWorldState::Get().UseForEpisode(0, USoLevelHelper::GetDemoMapName());\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoGameInstance::LoadGameForDemo(bool bNewGame)\n{\n\t// Demo Game\n\treturn LoadGameForEpisode(USoLevelHelper::GetDemoMapName(), bNewGame);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoGameInstance::LoadGameFromCurrentState(bool bNewGame)\n{\n\tif (USoPlatformHelper::IsDemo())\n\t{\n\t\tLoadGameForDemo(bNewGame);\n\t}\n\telse\n\t{\n\t\t// Normal game\n\t\tif (IsChapter() || IsBrowsingMenu())\n\t\t{\n\t\t\t// Chapter\n#if !WARRIORB_WITH_EDITOR\n\t\t\t// Load the default save game in non editor builds (also loads the metadata)\n\t\t\tLoadGameForCurrentChapter(bNewGame);\n#endif\n\t\t}\n\t\telse if (IsEpisode())\n\t\t{\n\t\t\t// Episode\n\t\t\tLoadGameForCurrentEpisode(bNewGame);\n\t\t}\n\t}\n\n\tbIsSavingOrLoading = false;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoGameInstance::SaveGameForCurrentState(bool bForce)\n{\n#if !WARRIORB_WITH_EDITOR\n\tif (IsChapter())\n\t{\n\t\t// Chapter\n\t\tSaveGameForCurrentChapter(bForce);\n\t}\n\telse if (IsEpisode())\n\t{\n\t\t// Episode\n\t\tSaveGameForCurrentEpisode(bForce);\n\t}\n#endif\n\tbIsSavingOrLoading = false;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoGameInstance::CanSaveGame(FString& OutMessage) const\n{\n\tif (bIsSavingOrLoading)\n\t{\n\t\tOutMessage = TEXT(\" bIsSavingOrLoading = true. Ignoring.\");\n\t\treturn false;\n\t}\n\tif (!IsGameStarted())\n\t{\n\t\tOutMessage = TEXT(\"Game is NOT started. Ignoring.\");\n\t}\n\n\tif (ASoCharacter* Char = USoStaticHelper::GetPlayerCharacterAsSoCharacter(this))\n\t{\n\t\tif (!Char->IsSaveAllowed())\n\t\t{\n\t\t\tOutMessage = TEXT(\"Character is not allowing use to save. Ignoring.\");\n\t\t\treturn false;\n\t\t}\n\t}\n\n\treturn true;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoGameInstance::SaveGameForCurrentChapter(bool bForce)\n{\n\treturn SaveGameForChapter(FSoWorldState::Get().GetSlotIndex(), bForce);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoGameInstance::SaveGameForCurrentEpisode(bool bForce)\n{\n\treturn SaveGameForEpisode(FSoWorldState::Get().GetEpisodeName(), bForce);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoGameInstance::SaveGameForChapter(int32 SlotIndex, bool bForce)\n{\n\t{\n\t\tFString WarningMessage;\n\t\tif (!bForce && !CanSaveGame(WarningMessage))\n\t\t{\n\t\t\tUE_LOG(LogSoGameInstance, Warning, TEXT(\"SaveGameForChapter - %s\"), *WarningMessage);\n\t\t\treturn false;\n\t\t}\n\t}\n\n\t// Must make sure we are in a chapter\n\tif (!IsChapter())\n\t{\n\t\tUE_LOG(LogSoGameInstance, Warning, TEXT(\"SaveGameForChapter - !IsChapter(). Ignoring.\"));\n\t\treturn false;\n\t}\n\n\tOnSaveToSlot.Broadcast();\n\n\t// Save\n\tbIsSavingOrLoading = true;\n\tFSoWorldState::Get().UseForChapter(SlotIndex);\n\tASoGameMode::Get(this).TriggerPreSaveGame();\n\tconst ESoSaveStatus ReturnStatus = FSoWorldState::Get().SaveGame();\n\tbIsSavingOrLoading = false;\n\n\tif (FSoWorldState::IsSaveStatusSuccessful(ReturnStatus))\n\t\treturn true;\n\n\tFSoWorldState::LogSaveStatusIfError(\n\t\tReturnStatus,\n\t\tFString::Printf(TEXT(\"USoGameInstance::SaveGameForChapter, SlotIndex = %d\"), SlotIndex)\n\t);\n\treturn false;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoGameInstance::SaveGameForEpisode(FName EpisodeName, bool bForce)\n{\n\t{\n\t\tFString WarningMessage;\n\t\tif (!bForce && !CanSaveGame(WarningMessage))\n\t\t{\n\t\t\tUE_LOG(LogSoGameInstance, Warning, TEXT(\"SaveGameForEpisode - %s\"), *WarningMessage);\n\t\t\treturn false;\n\t\t}\n\t}\n\n\t// Make sure we are in an episode\n\tif (!IsEpisode())\n\t{\n\t\tUE_LOG(LogSoGameInstance, Warning, TEXT(\"SaveGameForEpisode - !IsEpisode() || !IsGameStarted(). Ignoring.\"));\n\t\treturn false;\n\t}\n\tif (!USoLevelHelper::IsValidEpisodeName(EpisodeName))\n\t{\n\t\tUE_LOG(LogSoGameInstance, Error, TEXT(\"SaveGameForEpisode - EpisodeName = %s does NOT exist\"), *EpisodeName.ToString());\n\t\treturn false;\n\t}\n\n\t// Save\n\tbIsSavingOrLoading = true;\n\tFSoWorldState::Get().UseForEpisode(0, EpisodeName);\n\tASoGameMode::Get(this).TriggerPreSaveGame();\n\tconst ESoSaveStatus ReturnStatus = FSoWorldState::Get().SaveGame();\n\tbIsSavingOrLoading = false;\n\n\tif (FSoWorldState::IsSaveStatusSuccessful(ReturnStatus))\n\t\treturn true;\n\n\tFSoWorldState::LogSaveStatusIfError(\n\t\tReturnStatus,\n\t\tFString::Printf(TEXT(\"USoGameInstance::SaveGameForEpisode, EpisodeName = %s\"), *EpisodeName.ToString())\n\t);\n\treturn false;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoGameInstance::LoadGameForCurrentChapter(bool bNewGame)\n{\n\tUE_LOG(LogSoGameInstance, Verbose, TEXT(\"LoadGame\"));\n\tif (bIsSavingOrLoading)\n\t{\n\t\tUE_LOG(LogSoGameInstance, Warning, TEXT(\"LoadGame - bIsSavingOrLoading = true. Ignoring.\"));\n\t\treturn false;\n\t}\n\n\tconst auto& WorldState = FSoWorldState::Get();\n\treturn LoadGameForChapter(WorldState.GetSlotIndex(), bNewGame);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoGameInstance::LoadGameForCurrentEpisode(bool bNewGame)\n{\n\tUE_LOG(LogSoGameInstance, Verbose, TEXT(\"LoadGameForCurrentEpisode\"));\n\tif (bIsSavingOrLoading)\n\t{\n\t\tUE_LOG(LogSoGameInstance, Warning, TEXT(\"LoadGameForCurrentEpisode - bIsSavingOrLoading = true. Ignoring.\"));\n\t\treturn false;\n\t}\n\n\treturn LoadGameForEpisode(FSoWorldState::Get().GetEpisodeName(), bNewGame);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoGameInstance::LoadGameForChapter(int32 SlotIndex, bool bNewGame, ESoDifficulty DifficultyForNewGame)\n{\n\tFString ThisContext = FString::Printf(\n\t\tTEXT(\"LoadGameForChapter(SlotIndex = %d bNewGame = %d)\"),\n\t\tSlotIndex, bNewGame\n\t);\n\tUE_LOG(LogSoGameInstance, Log, TEXT(\"%s\"), *ThisContext);\n\n\t// Check Name\n\tif (bIsSavingOrLoading)\n\t{\n\t\tUE_LOG(LogSoGameInstance, Warning, TEXT(\"%s - bIsSavingOrLoading = true. Ignoring.\"), *ThisContext);\n\t\treturn false;\n\t}\n\n\t// Mark as started\n\tSetGameStarted(true);\n\n\t// Save current world state first\n\tif (IsPlaying())\n\t\tSaveGameForCurrentState();\n\n\t// Load game world state\n\tbIsSavingOrLoading = true;\n\tFSoWorldState::Get().UseForChapter(SlotIndex);\n\tif (bNewGame)\n\t{\n\t\t// New\n\t\tFSoWorldState::Get().ResetToDefault(DifficultyForNewGame);\n\t\tFSoWorldState::Get().SaveGame();\n\t}\n\telse\n\t{\n\t\t// Existing\n\t\tconst ESoSaveStatus ReturnStatus = FSoWorldState::Get().LoadGame();\n\t\tif (!FSoWorldState::IsSaveStatusSuccessful(ReturnStatus))\n\t\t{\n\t\t\tbIsSavingOrLoading = false;\n\t\t\tFSoWorldState::LogSaveStatusIfError(ReturnStatus,ThisContext);\n\t\t\treturn false;\n\t\t}\n\t}\n\n\t// Set ChapterName and checkpoint from the save\n\t// TODO: make customizable?\n\tconst FName ChapterName = FSoWorldState::Get().GetMapName();\n\tconst FName CheckpointName = FSoWorldState::Get().GetCheckpointLocation();\n\tThisContext = FString::Printf(\n\t\tTEXT(\"LoadGameForChapter(SlotIndex = %d, ChapterName = %s, CheckpointName = %s, bNewGame = %d)\"),\n\t\tSlotIndex, *ChapterName.ToString(), *CheckpointName.ToString(), bNewGame\n\t);\n\tif (!USoLevelHelper::IsValidChapterName(ChapterName))\n\t{\n\t\t// Fail this time\n\t\tUE_LOG(LogSoGameInstance, Error, TEXT(\"%s - ChapterName does NOT exist\"), *ThisContext);\n\t\treturn false;\n\t}\n\n#if !WARRIORB_WITH_EDITOR\n\t// If loaded chapter is different we must teleport to that chapter before anything else.\n\tconst FName CurrentChapterName = USoLevelHelper::GetChapterNameFromObject(this);\n\t// if (!USoLevelHelper::IsValidChapterName(CurrentChapterName) || CurrentChapterName != ChapterName)\n\tif (State != ESoGameInstanceState::LoadingChapterCompleted)\n\t{\n\t\t// UE_LOG(\n\t\t// \tLogSoGameInstance,\n\t\t// \tLog,\n\t\t// \tTEXT(\"%s - CurrentChapterName (%s) != ChapterName (%s). Teleporting to new chapter\"),\n\t\t// \t*ThisContext, *CurrentChapterName.ToString(), *ChapterName.ToString()\n\t\t// );\n\n\t\tbIsSavingOrLoading = false;\n\t\tif (!TeleportToChapter(ChapterName, CheckpointName, false))\n\t\t{\n\t\t\tUE_LOG(LogSoGameInstance, Error, TEXT(\"%s - Could not teleport to ChapterName\"), *ThisContext);\n\t\t\treturn false;\n\t\t}\n\n\t\treturn true;\n\t}\n#endif\n\n\t// We are in the same chapter\n\tUE_LOG(LogSoGameInstance, Log, TEXT(\"%s - We are in the same chapter.\"), *ThisContext);\n\tStartEnterSequenceFromSameLevel();\n\tASoGameMode::Get(this).TriggerPostLoadGame();\n\n\tSetGameStarted(true);\n\tbIsSavingOrLoading = false;\n\n\treturn true;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoGameInstance::LoadGameForEpisode(FName EpisodeName, bool bNewGame)\n{\n\tconst FString ThisContext = FString::Printf(\n\t\tTEXT(\"LoadGameForEpisode(EpisodeName = %s, bNewGame = %d)\"),\n\t\t*EpisodeName.ToString(), bNewGame\n\t);\n\tUE_LOG(LogSoGameInstance, Log, TEXT(\"%s\"), *ThisContext);\n\n\t// Check Name\n\tif (bIsSavingOrLoading)\n\t{\n\t\tUE_LOG(LogSoGameInstance, Warning, TEXT(\"%s - bIsSavingOrLoading = true. Ignoring.\"), *ThisContext);\n\t\treturn false;\n\t}\n\tif (!USoLevelHelper::IsValidEpisodeName(EpisodeName))\n\t{\n\t\tUE_LOG(LogSoGameInstance, Error, TEXT(\"%s - EpisodeName does NOT exist\"), *ThisContext);\n\t\treturn false;\n\t}\n\n\t// Mark as started\n\tSetGameStarted(true);\n\n\t// Save current world state first\n\tif (IsPlaying())\n\t\tSaveGameForCurrentState();\n\n\t// Load new game world state\n\tbIsSavingOrLoading = true;\n\tFSoWorldState::Get().UseForEpisode(0, EpisodeName);\n\tif (bNewGame)\n\t{\n\t\t// New\n\t\tFSoWorldState::Get().ResetToDefault();\n\t\tFSoWorldState::Get().SaveGame();\n\t}\n\telse\n\t{\n\t\t// Existing\n\t\tconst ESoSaveStatus ReturnStatus = FSoWorldState::Get().LoadGame();\n\t\tif (!FSoWorldState::IsSaveStatusSuccessful(ReturnStatus))\n\t\t{\n\t\t\tbIsSavingOrLoading = false;\n\t\t\tFSoWorldState::LogSaveStatusIfError(ReturnStatus,ThisContext);\n\t\t\treturn false;\n\t\t}\n\t}\n\n\t// If loaded episode is different we must teleport to that episode before anything else.\n\tconst FName CurrentEpisodeName = USoLevelHelper::GetEpisodeNameFromObject(this);\n\tif (!USoLevelHelper::IsValidEpisodeName(CurrentEpisodeName) || CurrentEpisodeName != EpisodeName)\n\t{\n\t\tUE_LOG(\n\t\t\tLogSoGameInstance,\n\t\t\tLog,\n\t\t\tTEXT(\"%s - CurrentMapName (%s) != EpisodeName (%s). Teleporting to new episode\"),\n\t\t\t*ThisContext, *CurrentEpisodeName.ToString(), *EpisodeName.ToString()\n\t\t);\n\n\t\tbIsSavingOrLoading = false;\n\t\tif (!TeleportToEpisode(EpisodeName, false))\n\t\t{\n\t\t\tUE_LOG(LogSoGameInstance, Error, TEXT(\"%s - Could not teleport to EpisodeName\"), *ThisContext);\n\t\t\treturn false;\n\t\t}\n\n\t\treturn true;\n\t}\n\n\t// We return here after we are teleported into the right episode. See LoadComplete()\n\t// We are in the same episode\n\tUE_LOG(LogSoGameInstance, Log, TEXT(\"%s - We are in the same episode.\"), *ThisContext);\n\tStartEnterSequenceFromSameLevel();\n\tASoGameMode::Get(this).TriggerPostLoadGame();\n\n\tbIsSavingOrLoading = false;\n\treturn false;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoGameInstance::TeleportToChapter(FName ChapterName, FName CheckpointName, bool bSave)\n{\n\tconst FString ThisContext = FString::Printf(\n\t\tTEXT(\"TeleportToChapter(ChapterName = %s, CheckpointName = %s, bSave = %d)\"),\n\t\t*ChapterName.ToString(), *CheckpointName.ToString(), bSave\n\t);\n\tUE_LOG(LogSoGameInstance, Log, TEXT(\"%s\"), *ThisContext);\n\n\t// Check Name\n\tUWorld* World = GetWorld();\n\tif (World == nullptr)\n\t{\n\t\tUE_LOG(LogSoGameInstance, Error, TEXT(\"%s - World is null\"), *ThisContext);\n\t\treturn false;\n\t}\n\tif (!USoLevelHelper::IsValidChapterName(ChapterName))\n\t{\n\t\tUE_LOG(LogSoGameInstance, Error, TEXT(\"%s - ChapterName is Invalid\"), *ThisContext);\n\t\treturn false;\n\t}\n\n\t// We are already in the same chapter, ignore\n\t// const FName CurrentChapterName = USoLevelHelper::GetChapterNameFromObject(this);\n\t// if (ChapterName == CurrentChapterName)\n\t// {\n\t// \tUE_LOG(\n\t// \t\tLogSoGameInstance,\n\t// \t\tWarning,\n\t// \t\tTEXT(\"%s - CurrentChapterName (%s) == ChapterName (%s). Ignoring\"),\n\t// \t\t*ThisContext, *CurrentChapterName.ToString(), *ChapterName.ToString()\n\t// \t);\n\t// \t// TODO: teleport to checkpoint?\n\t// \treturn false;\n\t// }\n\n\tLastLoadedMapName = ChapterName;\n\tif (!ShowLoadingScreen())\n\t{\n\t\tUE_LOG(LogSoGameInstance, Error, TEXT(\"%s - Can't open loading screen\"), *ThisContext);\n\t\treturn false;\n\t}\n\tif (!PauseGame(false, false))\n\t\tUE_LOG(LogSoGameInstance, Log, TEXT(\"%s - Could not pause game\"), *ThisContext);\n\n\t// Save current world state first then clear the old data\n\tif (bSave && IsPlaying())\n\t{\n\t\tSaveGameForCurrentState(true);\n\t\t// NOTE: we can't clear the data here\n\t}\n\n\t// Teleport to Chapter Level\n\tverify(!IsLoading());\n\tState = ESoGameInstanceState::LoadingChapter;\n\n\t// NOTE: this does not affect any actors\n\t// Set chapter name and default checkpoint\n\tFSoWorldState::Get().UseForChapter(FSoWorldState::Get().GetSlotIndex());\n#if !WARRIORB_WITH_EDITOR\n\tFSoWorldState::Get().LoadGame();\n#endif\n\tFSoWorldState::Get().SetMapName(ChapterName);\n\tFSoWorldState::Get().SetCheckpointLocation(CheckpointName);\n#if !WARRIORB_WITH_EDITOR\n\tFSoWorldState::Get().SaveGame();\n#endif\n\n\tconst bool bReturnStatus = FSoLevelManager::Get().TeleportToChapter(this, ChapterName);\n\tif (bReturnStatus)\n\t{\n\t\tSetGameStarted(true);\n\t}\n\telse\n\t{\n\t\tResetState();\n\t\tResetEpisode();\n\t}\n\n\treturn bReturnStatus;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoGameInstance::TeleportToEpisode(FName EpisodeName, bool bSave)\n{\n\tconst FString ThisContext = FString::Printf(\n\t\tTEXT(\"TeleportToEpisode(EpisodeName = %s, bSave = %d)\"),\n\t\t*EpisodeName.ToString(), bSave\n\t);\n\tUE_LOG(LogSoGameInstance, Log, TEXT(\"%s\"), *ThisContext);\n\n\t// Check Name\n\tUWorld* World = GetWorld();\n\tif (World == nullptr)\n\t{\n\t\tUE_LOG(LogSoGameInstance, Error, TEXT(\"%s - World is null\"), *ThisContext);\n\t\treturn false;\n\t}\n\tif (!USoLevelHelper::IsValidEpisodeName(EpisodeName))\n\t{\n\t\tUE_LOG(LogSoGameInstance, Error, TEXT(\"%s - EpisodeName is Invalid\"), *ThisContext);\n\t\treturn false;\n\t}\n\n\t// We area already in the same episode ignore\n\tconst FName CurrentEpisodeName = USoLevelHelper::GetEpisodeNameFromObject(this);\n\tif (CurrentEpisodeName == EpisodeName)\n\t{\n\t\tUE_LOG(\n\t\t\tLogSoGameInstance,\n\t\t\tWarning,\n\t\t\tTEXT(\"%s - EpisodeName (%s) == EpisodeName (%s). Ignoring\"),\n\t\t\t*ThisContext, *CurrentEpisodeName.ToString(), *EpisodeName.ToString()\n\t\t);\n\t\treturn false;\n\t}\n\n\tLastLoadedMapName = EpisodeName;\n\tif (!ShowLoadingScreen())\n\t{\n\t\tUE_LOG(LogSoGameInstance, Error, TEXT(\"%s - Can't open loading screen\"), *ThisContext);\n\t\treturn false;\n\t}\n\tif (!PauseGame(false, false))\n\t\tUE_LOG(LogSoGameInstance, Log, TEXT(\"%s - Could not pause game\"), *ThisContext);\n\n\t// Save current world state first then clear the old data\n\tif (bSave && IsPlaying())\n\t{\n\t\tSaveGameForCurrentState();\n\t\tFSoWorldState::Get().ResetToDefault();\n\t}\n\n\t// Teleport to Episode level\n\tverify(!IsLoading());\n\tState = ESoGameInstanceState::LoadingEpisode;\n\n\tFSoWorldState::Get().UseForEpisode(0, EpisodeName);\n\n\tconst bool bReturnStatus = FSoLevelManager::Get().TeleportToEpisode(this, EpisodeName);\n\tif (bReturnStatus)\n\t{\n\t\tSetGameStarted(true);\n\t}\n\telse\n\t{\n\t\tResetState();\n\t\tResetEpisode();\n\t}\n\n\treturn bReturnStatus;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoGameInstance::TeleportToMainMenu(bool bSave, bool bForceReloadIfAlreadyIn)\n{\n\tUE_LOG(LogSoGameInstance, Verbose, TEXT(\"TeleportToMainMenu\"));\n\n\tif (!bForceReloadIfAlreadyIn && IsBrowsingMenu())\n\t{\n\t\tUE_LOG(LogSoGameInstance, Warning, TEXT(\"TeleportToMainMenu - We are already in the menu level\"));\n\t\treturn false;\n\t}\n\tLastLoadedMapName = NAME_None;\n\tif (State == ESoGameInstanceState::LoadingChapterCompleted ||\n\t\tState == ESoGameInstanceState::LoadingEpisodeCompleted)\n\t{\n\t\tif (LoadingScreenInstance->IsLoadingScreenVisible())\n\t\t{\n\t\t\tLoadingScreenInstance->SetWaitForAnyKeyInput(false);\n\t\t\tLoadingScreenInstance->HideLoadingScreen();\n\t\t\tbWasDeactivatedDuringLoading = false;\n\t\t}\n\t}\n\tif (!ShowLoadingScreen())\n\t{\n\t\tUE_LOG(LogSoGameInstance, Error, TEXT(\"TeleportToChapter - Can't open chapters loading screen\"));\n\t\treturn false;\n\t}\n\tif (!PauseGame(false, false))\n\t\tUE_LOG(LogSoGameInstance, Warning, TEXT(\"TeleportToChapter -  Could not pause game\"));\n\n\t// Save current world state first then clear the old data\n\tif (bSave && IsPlaying())\n\t{\n\t\tSaveGameForCurrentState();\n\t\tFSoWorldState::Get().ResetToDefault();\n\t}\n\n\t// Teleport to menu\n\t// verify(!IsLoading()); // is possible now\n\tState = ESoGameInstanceState::LoadingMenu;\n\tconst bool bReturnStatus = FSoLevelManager::Get().TeleportToMainMenuLevel(this);\n\tif (bReturnStatus)\n\t{\n\t\t// Like a new start\n\t\tSetGameStarted(false);\n\t}\n\telse\n\t{\n\t\tResetState();\n\t}\n\n\treturn bReturnStatus;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoGameInstance::ClearConfigData()\n{\n\tActionLists.Empty();\n\tStrikeMaps.Empty();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoGameInstance::ReinitializeActionList(FName ListName, UObject* Outer, TArray<USoEAction*>& OutActions)\n{\n\tOutActions.Empty();\n\n\t// We are in menu, ignore\n\tif (IsMenu())\n\t\treturn;\n\n\t// not yet loaded, let's load it\n\tFDlgConfigParser* ActionParser = ActionLists.Find(ListName);\n\tif (ActionParser == nullptr)\n\t{\n\t\tconst FString Path = FPaths::ProjectContentDir() + TEXT(\"SO/AIConfig/ActionLists/\") + ListName.ToString() + \".sc\";\n\t\tActionParser = &ActionLists.Add(ListName, FDlgConfigParser{ Path,\"So\" });\n\t}\n\n\tif (ActionParser != nullptr)\n\t{\n\t\tActionParser->ResetParser();\n\n\t\tif (ActionParser->IsValidFile())\n\t\t{\n\t\t\tFSoEActions Actions;\n\t\t\tActionParser->ReadProperty(FSoEActions::StaticStruct(), &Actions, this); // duplicate object was shallow copy, easiest way to do this is to initialize from text for everyone :(\n\t\t\tOutActions = Actions.Array;\n\t\t}\n\t\telse\n\t\t\tUE_LOG(LogSoGameInstance, Warning, TEXT(\"Failed to read action list %s - (.sc file is missing or empty)\"), *ListName.ToString());\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoGameInstance::ReinitializeStrikeMap(FName MapName, TMap<FName, FSoStrike>& StrikeMap)\n{\n\tStrikeMap.Empty();\n\n\t// We are in menu, ignore\n\tif (IsMenu())\n\t\treturn;\n\n\t// not yet loaded, let's load it - TODO: maybe preload in BeginPlay()???\n\tFSoEStrikes* StrikesPtr = StrikeMaps.Find(MapName);\n\tif (StrikesPtr == nullptr)\n\t{\n\t\tconst FString Path = FPaths::ProjectContentDir() + TEXT(\"SO/AIConfig/StrikeMaps/\") + MapName.ToString() + \".sc\";\n\t\tFDlgConfigParser Parser(Path, \"So\");\n\t\tif (Parser.IsValidFile())\n\t\t{\n\t\t\tFSoEStrikes& Strikes = StrikeMaps.Add(MapName);\n\t\t\tParser.ReadProperty(FSoEStrikes::StaticStruct(), &Strikes, nullptr);\n\t\t\tStrikesPtr = &Strikes;\n\t\t}\n\t\telse\n\t\t\tUE_LOG(LogSoGameInstance, Warning, TEXT(\"Failed to find strike %s - (.sc file is missing or empty)\"), *MapName.ToString());\n\t}\n\n\tif (StrikesPtr != nullptr)\n\t\tStrikeMap = StrikesPtr->StrikeMap;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUSoEffectBase* USoGameInstance::ClaimEffect(TSubclassOf<USoEffectBase> Class)\n{\n\tUSoEffectBase* Effect = ClaimObject(EffectPool, Class);\n\treturn Effect == nullptr ? NewObject<USoEffectBase>(this, Class) : Effect;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nASoProjectile* USoGameInstance::ClaimProjectile(TSubclassOf<ASoProjectile> Class)\n{\n\tASoProjectile* Projectile = ClaimObject(ProjectilePool, Class);\n\tif (Projectile == nullptr)\n\t\tProjectile = Cast<ASoProjectile>(GetWorld()->SpawnActor(Class));\n\n\treturn Projectile;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoGameInstance::ClearObjectPools()\n{\n\tProjectilePool.Empty();\n\tEffectPool.Empty();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoGameInstance::ReturnEffect(USoEffectBase* Effect) { ReturnObject(EffectPool, Effect); }\nvoid USoGameInstance::ReturnProjectile(ASoProjectile* Projectile) { ReturnObject(ProjectilePool, Projectile); }\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoGameInstance::InitializeAnalytics()\n{\n\tif (AnalyticsInstance != nullptr)\n\t\treturn;\n\n\tconst auto& GameSettings = USoGameSettings::Get();\n\tconst bool bCollectGameAnalytics = GameSettings.CanCollectGameAnalytics();\n\tconst bool bWaitForAnalyticsToSend = GameSettings.CanWaitForAnalyticsToSend();\n\tdouble PollWaitSeconds = 2.0;\n\tdouble PollProcessEventsSeconds = 8.0;\n\tGameSettings.GetAnalyticsPollTimers(PollWaitSeconds, PollProcessEventsSeconds);\n\n\tAnalyticsInstance = NewObject<USoAnalytics>(this);\n\tAnalyticsInstance->StartSession(bCollectGameAnalytics, bWaitForAnalyticsToSend, PollWaitSeconds, PollProcessEventsSeconds);\n\n\t// TODO make this triggerable from the game settings\n\t// if (ASoCharacter* SoCharacter = USoStaticHelper::GetPlayerCharacterAsSoCharacter(this))\n\t// \tif (USoAnalyticsComponent* Analytics = SoCharacter->GetAnalyticsComponent())\n\t// \t\tAnalytics->SetCanCollectAnalytics(bCollectGameAnalytics);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoGameInstance::ShutdownAnalytics()\n{\n\tif (AnalyticsInstance)\n\t\tAnalyticsInstance->EndSession();\n\n\tAnalyticsInstance = nullptr;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUSoAnalytics* USoGameInstance::GetAnalytics()\n{\n\tInitializeAnalytics();\n\treturn AnalyticsInstance;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoGameInstance::InitializeAchievements()\n{\n\t// Skip if already initialized\n\tif (AchievementManager && AchievementManager->IsInitialized())\n\t\treturn true;\n\n\tif (AchievementManager == nullptr)\n\t\tAchievementManager = NewObject<USoAchievementManager>(this);\n\n\tif (APlayerController* Controller = USoStaticHelper::GetPlayerController(this))\n\t{\n\t\treturn AchievementManager->Initialize(Controller);\n\t}\n\telse\n\t{\n\t\tUE_LOG(LogSoGameInstance, Error, TEXT(\"InitializeAchievements Can't get PlayerController. Most likely you called this too early and the World is not initialized\"));\n\t}\n\n\treturn false;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoGameInstance::ShutdownAchievements()\n{\n\tif (AchievementManager != nullptr)\n\t{\n\t\tAchievementManager->Shutdown();\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUSoAchievementManager* USoGameInstance::GetAchievementManager() const\n{\n\treturn AchievementManager;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUSoAudioManager* USoGameInstance::GetAudioManager()\n{\n\tif (AudioManager == nullptr)\n\t\tInitializeAudio();\n\n\tensure(AudioManager != nullptr);\n\treturn AudioManager;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUSoEnemyVoiceManager* USoGameInstance::GetEnemyVoiceManager()\n{\n\tif (EnemyVoiceManager == nullptr)\n\t{\n\t\tUE_LOG(LogSoGameInstance, Log, TEXT(\"Initialize EnemyVoiceManager\"));\n\t\tEnemyVoiceManager = NewObject<USoEnemyVoiceManager>(this);\n\t}\n\n\treturn EnemyVoiceManager;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoGameInstance::InitializeAudio()\n{\n\tif (AudioManager == nullptr)\n\t{\n\t\tUE_LOG(LogSoGameInstance, Log, TEXT(\"Initialize Audio\"));\n\t\tAudioManager = NewObject<USoAudioManager>(this);\n\t\tverify(AudioManager != nullptr);\n\t\tAudioManager->Initialize();\n\t\tAudioManager->SetMusic(USoGameSingleton::Get().MenuMusicPtr.Get(), true);\n\t\tAudioManager->SetMusicRestartParams(\n\t\t\tUSoGameSingleton::Get().MinWaitBeforeMusicRestart,\n\t\t\tUSoGameSingleton::Get().MaxWaitBeforeMusicRestart\n\t\t);\n\t\tAudioManager->SetPlaybackSpeedIgnoreList(USoGameSingleton::Get().BusesToIgnoreForSpeedChangeArrayPtr);\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoGameInstance::ShutdownAudio()\n{\n\tif (AudioManager != nullptr)\n\t{\n\t\tAudioManager->Shutdown();\n\t\tAudioManager = nullptr;\n\t\tUE_LOG(LogSoGameInstance, Log, TEXT(\"Shutdown Audio\"));\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoGameInstance::HandleOnGamepadConnectionChange(bool bConnected, FPlatformUserId UserID, int32 GamepadID)\n{\n\tUE_LOG(\n\t\tLogSoGameInstance,\n\t\tLog,\n\t\tTEXT(\"Gamepad connection status changed:\") LINE_TERMINATOR\n\t\tTEXT(\"\\tbConnected = %d\") LINE_TERMINATOR\n\t\tTEXT(\"\\tUserID = %d\") LINE_TERMINATOR\n\t\tTEXT(\"\\tGamepadID = %d\") LINE_TERMINATOR,\n\t\tbConnected, UserID, GamepadID\n\t);\n\n\tif (IsPlaying() && !bConnected)\n\t{\n\t\tUE_LOG(LogSoGameInstance, Log, TEXT(\"Pausing game because controller disconnected\"));\n\t\tPauseGame(true, false);\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoGameInstance::HandleOnGamepadPariringChange(int32 ControllerIndex, FPlatformUserId NewUserPlatformId, FPlatformUserId OldUserPlatformId)\n{\n\t// NOTE: this seems to be not used\n\t//UE_LOG(LogSoGameInstance, Log,\n\t//\tTEXT(\"Gamepad pairging changed:\") LINE_TERMINATOR\n\t//\tTEXT(\"\\tControllerIndex = %d\") LINE_TERMINATOR\n\t//\tTEXT(\"\\tNewUserPlatformId = %d\") LINE_TERMINATOR\n\t//\tTEXT(\"\\tOldUserPlatformId = %d\") LINE_TERMINATOR\n\t//\tTEXT(\"\\tFirstControllerName = %s\") LINE_TERMINATOR,\n\t//\tControllerIndex, NewUserPlatformId, OldUserPlatformId, *USoPlatformHelper::GetFirstGamepadName());\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoGameInstance::CanHaveSoulKeeper() const\n{\n\tif (IsEpisode())\n\t{\n\t\tFSoEpisodeMapParams EpisodeData;\n\t\tif (USoLevelHelper::GetEpisodeData(USoLevelHelper::GetEpisodeNameFromObject(this), EpisodeData))\n\t\t{\n\t\t\treturn EpisodeData.bCanHaveSoulKeeper;\n\t\t}\n\n\t\treturn false;\n\t}\n\n\treturn true;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoGameInstance::CanContinueGame() const\n{\n\treturn IsGameStarted() || FSoWorldState::Get().DoesSaveExist();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoGameInstance::SetGameStarted(bool bStarted)\n{\n\t// Can't start in menu level\n\tif (bStarted && IsMenu())\n\t{\n\t\tUE_LOG(LogSoGameInstance, Warning, TEXT(\"Could not SetGameStarted = %d. We are in the menu level. Ignoring.\"), bStarted);\n\t\treturn;\n\t}\n\tif (bGameStarted == bStarted)\n\t\treturn;\n\n\tbGameStarted = bStarted;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoGameInstance::OpenMenuInstant()\n{\n\tif (ASoCharacter* Character = USoStaticHelper::GetPlayerCharacterAsSoCharacter(this))\n\t\tif (USoUIMenuMain* MainMenu = Character->GetUIMainMenu())\n\t\t\tMainMenu->InstantOpen(true);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoGameInstance::PauseGame(bool bOpenMainMenu, bool bForce)\n{\n\t// If we are forcing the pause game then we do not care if the game is paused or not\n\t//if (!bForce && !bGameStarted)\n\t//\treturn false;\n\tif (!bForce && USoPlatformHelper::IsGamePaused(this))\n\t\treturn false;\n\n\treturn SetGamePaused(bOpenMainMenu, true);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoGameInstance::ResumeGame(bool bCloseMainMenu, bool bForce)\n{\n\tif (!bForce && !USoPlatformHelper::IsGamePaused(this))\n\t\treturn false;\n\n\t// Reset to settings values\n\tUSoGameSettings::Get().ApplyGameSettings(true);\n\treturn SetGamePaused(bCloseMainMenu, false);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoGameInstance::SetGamePaused(bool bToggleMenu, bool bPause)\n{\n\t// Only if different\n\tif (USoPlatformHelper::IsGamePaused(this) != bPause)\n\t{\n\t\tif (!USoPlatformHelper::SetGamePaused(this, bPause))\n\t\t{\n\t\t\tUE_LOG(LogSoGameInstance, Warning, TEXT(\"Could not SetGamePaused = %s\"), bPause ? TEXT(\"true\") : TEXT(\"false\"));\n\t\t\treturn false;\n\t\t}\n\t}\n\n\t// Bring up the menu\n\tif (bToggleMenu)\n\t{\n\t\tif (ASoCharacter* Character = USoStaticHelper::GetPlayerCharacterAsSoCharacter(this))\n\t\t{\n\t\t\tif (USoUIMenuMain* MainMenu = Character->GetUIMainMenu())\n\t\t\t{\n\t\t\t\tMainMenu->InstantOpen(bPause);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t}\n\n\treturn true;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoGameInstance::ResetEpisode()\n{\n\t// TODO: maybe first valid episode? wth do we need this?\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFString USoGameInstance::GameInstanceStateToString(ESoGameInstanceState InstanceState)\n{\n\tFString EnumValue;\n\tif (USoStringHelper::ConvertEnumToString<ESoGameInstanceState>(TEXT(\"ESoGameInstanceState\"), InstanceState, false, EnumValue))\n\t\treturn EnumValue;\n\n\treturn EnumValue;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoGameInstance::SetGameViewportClient(USoGameViewportClient* GameViewportClient)\n{\n\tViewport = GameViewportClient;\n\tif (Viewport == nullptr)\n\t{\n\t\tUE_LOG(LogSoGameInstance, Warning, TEXT(\"Could not set GameViewportClient\"));\n\t}\n\telse\n\t{\n\t\tViewport->OnFadingChanged.AddUObject(this, &ThisClass::OnViewportClientFadingChanged);\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoGameInstance::ShowLoadingScreen()\n{\n\tUE_LOG(LogSoGameInstance, Verbose, TEXT(\"ShowLoadingScreen\"));\n\tverify(LoadingScreenInstance.IsValid());\n\n\tconst bool bWasHidden = !LoadingScreenInstance->IsLoadingScreenVisible();\n\n\t// first time it was visible, play music\n\tif (bWasHidden)\n\t{\n\t\t// TODO: fix the fadein by waiting for it?\n\t\t//if (Viewport)\n\t\t\t//Viewport->FadeIn(0.5f);\n\n\t\tStartLoadingScreenMusic();\n\n\t\tif (const ASoCharacter* SoCharacter = USoStaticHelper::GetPlayerCharacterAsSoCharacter(this))\n\t\t\tSoCharacter->OnMainLoadingScreenShow.Broadcast();\n\t}\n\n\tif (!LoadingScreenInstance->ShowLoadingScreen())\n\t{\n\t\tUE_LOG(LogSoGameInstance, Error, TEXT(\"ShowLoadingScreen: Can't show loading screen for some reason\"));\n\t\treturn false;\n\t}\n\n\tif (bWasHidden)\n\t{\n\t\t// update loading screen tip\n\t\tFSoLevelEnterParams EnterParams;\n\t\tif (USoLevelHelper::GetMapEnterParams(LastLoadedMapName, EnterParams))\n\t\t{\n\t\t\tTArray<FText>& LoadingTexts = EnterParams.RandomLoadingScreenTexts.Num() > 0 ? EnterParams.RandomLoadingScreenTexts : USoGameSingleton::Get().GeneralLoadingScreenTexts;\n\t\t\tFText Tip;\n\t\t\tif (LoadingTexts.Num() > 0)\n\t\t\t{\n\t\t\t\tTip = LoadingTexts[FMath::RandHelper(LoadingTexts.Num())];\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tTip = FROM_STRING_TABLE_UI(\"input_left\");\n\t\t\t}\n\n\t\t\tLoadingScreenInstance->UpdateLoadingScreenTip(Tip);\n\t\t}\n\t}\n\n\treturn true;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoGameInstance::HideLoadingScreen()\n{\n\tUE_LOG(LogSoGameInstance, Verbose, TEXT(\"HideLoadingScreen\"));\n\tverify(LoadingScreenInstance.IsValid());\n\n\tLoadingScreenInstance->HideLoadingScreen();\n\tStopLoadingScreenMusic();\n\tFocusGameUI();\n\n\tif (Viewport)\n\t\tViewport->FadeOut(0.5f);\n\n\treturn true;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoGameInstance::IsLoadingScreenVisible() const\n{\n\treturn LoadingScreenInstance.IsValid() && LoadingScreenInstance->IsLoadingScreenVisible();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoGameInstance::SafeUpdateLoadingScreen(float DeltaSeconds, bool bResumeGame)\n{\n\t// Open chapter loading screen if not already\n\tif (!IsLoadingScreenVisible())\n\t{\n\t\tUE_LOG(LogSoGameInstance, Warning, TEXT(\"SafeUpdateLoadingScreen: Loading screen is not open. Reopening it.\"));\n\t\tShowLoadingScreen();\n\t}\n\n\t// Finished loading\n\tif (!TickLoadingScreen(DeltaSeconds))\n\t{\n\t\tUE_LOG(LogSoGameInstance, Verbose, TEXT(\"SafeUpdateLoadingScreen: Finished loading. Hiding loading screen.\"));\n\t\tHideLoadingScreen();\n\n\t\t// Only resume when the game was started\n\t\tif (bResumeGame)\n\t\t\tResumeGame(true, true);\n\n\t\treturn false;\n\t}\n\n\treturn true;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoGameInstance::TickLoadingScreen(float DeltaSeconds)\n{\n\tstatic float DeltaSecondsCounter = 0;\n\tDeltaSecondsCounter += DeltaSeconds;\n\n\t/** TODO: explain if works */\n\tconst FSoSplinePoint PlayerSplineLoc = USoStaticHelper::GetPlayerSplineLocation(this);\n\tconst bool bCheckedClaimedLevelsOnly = PlayerSplineLoc.GetSpline() != nullptr;\n\tbool bAllLoaded;\n\tconst bool bCanClaimSplineLocation = FSoLevelManager::Get().ClaimSplineLocation(PlayerSplineLoc, bAllLoaded);\n\n\t// No level is still loading OR the claimed spline has all the levels we need loaded\n\tconst bool bGameDone = (bCheckedClaimedLevelsOnly && bCanClaimSplineLocation) || !USoLevelHelper::IsAnyLevelLoading(this);\n\n\t// Wait for input\n\tif (bGameDone)\n\t{\n\t\tconst FName MapName = USoLevelHelper::GetMapNameFromObject(this);\n\t\tconst FString MapNameString = MapName.ToString();\n\t\tconst bool bHasEnterSequence = CanPlayEnterSequenceForMap(MapName);\n\t\tif (bHasEnterSequence != LoadingScreenInstance->IsWaitForAnyKeyInput())\n\t\t{\n\t\t\t// Changed\n\t\t\tLoadingScreenInstance->SetWaitForAnyKeyInput(bHasEnterSequence);\n\n\t\t\t// Set Data\n\t\t\tif (bHasEnterSequence)\n\t\t\t{\n\t\t\t\tTSoftObjectPtr<UTexture2D> Image;\n\t\t\t\tFText Title;\n\t\t\t\tFText Description;\n\t\t\t\tUSoLevelHelper::GetMapImageTitleDescription(\n\t\t\t\t\tMapName,\n\t\t\t\t\tImage, Title, Description\n\t\t\t\t);\n\t\t\t\tLoadingScreenInstance->SetWaitForAnyKeyInputData(Image, Title, Description);\n\t\t\t}\n\t\t}\n\t}\n\n\tif (bGameDone && LoadingScreenInstance->CanHideLoadingScreen() && State != ESoGameInstanceState::LoadingMenu)\n\t{\n\t\t// Reset time since last input as we are loading\n\t\tif (DeltaSecondsCounter > 1.f)\n\t\t{\n\t\t\tResetTimeSinceLastInput();\n\t\t\tDeltaSecondsCounter = 0.f;\n\t\t}\n\n\t\tSetupEnterSequence();\n\n\t\treturn false;\n\t}\n\n\tResetTimeSinceLastInput();\n\treturn true;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoGameInstance::DidEnterSequencePlayForMap(FName MapName) const\n{\n\tconst ASoCharacter* SoCharacter = USoStaticHelper::GetPlayerCharacterAsSoCharacter(this);\n\tif (!SoCharacter)\n\t\treturn false;\n\n\treturn IDlgDialogueParticipant::Execute_GetBoolValue(SoCharacter, MapName);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoGameInstance::SetMapAlreadyEnteredOnce(FName MapName, bool bValue)\n{\n\tASoCharacter* SoCharacter = USoStaticHelper::GetPlayerCharacterAsSoCharacter(this);\n\tif (!SoCharacter)\n\t\treturn;\n\n\tIDlgDialogueParticipant::Execute_ModifyBoolValue(SoCharacter, MapName, bValue);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoGameInstance::CanPlayEnterSequenceForMap(FName MapName) const\n{\n\treturn IsMapEnteredTheFirstTime(MapName) && HasEnterSequenceData(MapName);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoGameInstance::IsMapEnteredTheFirstTime(FName MapName) const\n{\n\treturn\n\t\t!DidEnterSequencePlayForMap(MapName) &&\n\t\tFSoWorldState::Get().IsCheckpointLocationDefault();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoGameInstance::GetEnterSequenceData(FName MapName, ALevelSequenceActor*& OutLevelSequenceActor, AActor*& OutLevelEnterCamera, FSoLevelEnterParams& OutEnterParams)\n{\n\tif (!USoLevelHelper::GetMapEnterParams(MapName, OutEnterParams))\n\t\treturn false;\n\n\t// Get the data from the chapter params\n\tOutLevelSequenceActor = OutEnterParams.Sequence.Get();\n\tOutLevelEnterCamera = OutEnterParams.Camera.Get();\n\n\treturn IsValid(OutLevelSequenceActor) && IsValid(OutLevelEnterCamera);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoGameInstance::HasEnterSequenceData(FName MapName) const\n{\n\tFSoLevelEnterParams Params;\n\tif (!USoLevelHelper::GetMapEnterParams(MapName, Params))\n\t\treturn false;\n\n\treturn Params.Sequence.IsValid() && Params.Camera.IsValid();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoGameInstance::SetupEnterSequence()\n{\n\tbShouldStartLevelEnterSequence = false;\n\tASoCharacter* SoCharacter = USoStaticHelper::GetPlayerCharacterAsSoCharacter(this);\n\tif (!SoCharacter)\n\t\treturn;\n\n\tconst FName MapName = USoLevelHelper::GetMapNameFromObject(this);\n\n\t// Does not have any start sequence\n\tif (!IsMapEnteredTheFirstTime(MapName))\n\t\treturn;\n\n\t// Mark start sequence as played\n\tSetMapAlreadyEnteredOnce(MapName, true);\n\n\t// Get the data for the enter sequence\n\tFSoLevelEnterParams LevelEnterParams;\n\tALevelSequenceActor* LevelSequenceActor = nullptr;\n\tAActor* LevelEnterCamera = nullptr;\n\tconst bool bHasEnterData = GetEnterSequenceData(MapName, LevelSequenceActor, LevelEnterCamera, LevelEnterParams);\n\n\t// Init stuff so level sequence happens after teleport\n\tif (bHasEnterData)\n\t{\n\t\tbShouldStartLevelEnterSequence = true;\n\t\tSoCharacter->SetCameraFadeOutBlocked(true);\n\n\t\t// TODO this is a map name actually\n\t\tOnMapStart.Broadcast(MapName, LevelEnterParams.DisplayTextOnBlackFadeDuringFirstMapStart);\n\t\tSoCharacter->ChangeUIVisibility.Broadcast(false);\n\t\tSoCharacter->FadeFromBlackInstant.Broadcast();\n\n\t\tEnterSequenceTimer = 4.0f;\n\t\tSoCharacter->GetPlayerProgress()->StopGatheringPlayerData();\n\t}\n\telse\n\t{\n\t\tSoCharacter->ChangeUIVisibility.Broadcast(false);\n\t\tOnMapStart.Broadcast(MapName, LevelEnterParams.DisplayTextOnBlackFadeDuringFirstMapStart);\n\t\tSoCharacter->FadeFromBlackInstant.Broadcast();\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoGameInstance::StartEnterSequence()\n{\n\tASoCharacter* SoCharacter = USoStaticHelper::GetPlayerCharacterAsSoCharacter(this);\n\tif (!SoCharacter || !bShouldStartLevelEnterSequence)\n\t{\n\t\treturn;\n\t}\n\n\t// Get the data for the enter sequence\n\tconst FName MapName = USoLevelHelper::GetMapNameFromObject(this);\n\tFSoLevelEnterParams LevelEnterParams;\n\tALevelSequenceActor* LevelSequenceActor = nullptr;\n\tAActor* LevelEnterCamera = nullptr;\n\tconst bool bHasEnterData = GetEnterSequenceData(MapName, LevelSequenceActor, LevelEnterCamera, LevelEnterParams);\n\n\t// Init stuff so level sequence happens after teleport\n\tif (bHasEnterData && LevelSequenceActor->SequencePlayer)\n\t{\n\t\tLevelSequenceActor->SequencePlayer->JumpToSeconds(0.0f);\n\t\tLevelSequenceActor->SequencePlayer->Play();\n\t\tSoCharacter->FadeFromBlackInstant.Broadcast();\n\t\tASoMarker* TelTargetAfterSequence = LevelEnterParams.TeleportAfterCutscene.Get();\n\t\tSoCharacter->SoASoAWaitForActivitySwitch->Enter(\n\t\t\tLevelSequenceActor,\n\t\t\tLevelEnterCamera,\n\t\t\tLevelEnterParams.Animation,\n\t\t\tTelTargetAfterSequence,\n\t\t\tTelTargetAfterSequence == nullptr,\n\t\t\ttrue\n\t\t);\n\n\t\tSoCharacter->GetPlayerProgress()->StopGatheringPlayerData();\n\n\t\tif (LevelEnterParams.HideCharacterTime > 0.0f)\n\t\t{\n\t\t\tSoCharacter->HideCharacterBP(true);\n\t\t\tGetWorld()->GetTimerManager().SetTimer(\n\t\t\t\tSoCharacter->ShowCharacterTimer,\n\t\t\t\tSoCharacter,\n\t\t\t\t&ASoCharacter::ShowCharacter,\n\t\t\t\tLevelEnterParams.HideCharacterTime\n\t\t\t);\n\t\t}\n\t}\n\n\tSoCharacter->SetCameraFadeOutBlocked(false);\n\tbShouldStartLevelEnterSequence = false;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoGameInstance::StartEnterSequenceFromSameLevel()\n{\n\t// SoOwner->GetSoMovement()->GetSplineLocation().GetSpline() != nullptr\n\tif (!IsPlaying())\n\t\treturn;\n\n\tASoCharacter* SoCharacter = USoStaticHelper::GetPlayerCharacterAsSoCharacter(this);\n\tif (!SoCharacter)\n\t\treturn;\n\n\tconst FName MapName = USoLevelHelper::GetMapNameFromObject(this);\n\tif (!CanPlayEnterSequenceForMap(MapName))\n\t\treturn;\n\n\tFSoLevelEnterParams LevelEnterParams;\n\tUSoLevelHelper::GetMapEnterParams(MapName, LevelEnterParams);\n\n\tALevelSequenceActor* LevelSequenceActor = nullptr;\n\tAActor* LevelEnterCamera = nullptr;\n\n\tif (LevelEnterParams.Sequence.IsValid())\n\t\tLevelSequenceActor = LevelEnterParams.Sequence.Get();\n\n\tif (LevelEnterParams.Camera.IsValid())\n\t\tLevelEnterCamera = LevelEnterParams.Camera.Get();\n\n\t// init stuff so level sequence happens after teleport\n\tif (LevelSequenceActor != nullptr && LevelEnterCamera != nullptr)\n\t{\n\t\tSetMapAlreadyEnteredOnce(MapName, true);\n\t\tSoCharacter->SoATeleport->SetSequence(\n\t\t\tLevelSequenceActor,\n\t\t\tLevelEnterCamera,\n\t\t\tLevelEnterParams.Animation,\n\t\t\tLevelEnterParams.HideCharacterTime,\n\t\t\tLevelEnterParams.TeleportAfterCutscene.Get()\n\t\t);\n\n\t\tSoCharacter->GetPlayerProgress()->StopGatheringPlayerData();\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoGameInstance::OnViewportClientFadingChanged(bool bIsFading)\n{\n\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoGameInstance::ResetTimeSinceLastInput()\n{\n\tif (ASoPlayerController* Controller = ASoPlayerController::GetInstance(this))\n\t\tController->ResetTimeSinceLastInput();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoGameInstance::OnGameViewportFocusLost()\n{\n\tif (USoPlatformHelper::IsGameInForeground(this))\n\t{\n\t\tUE_LOG(LogSoGameInstance, Verbose, TEXT(\"OnGameViewportFocusLost: Ignoring because game window is NOT in background\"));\n\t\treturn;\n\t}\n\n\tUE_LOG(LogSoGameInstance, Log, TEXT(\"Focus LOST\"));\n#if !WARRIORB_WITH_EDITOR\n\tif (!IsLoadingScreenVisible() && USoGameSettings::Get().CanPauseGameWhenUnfocused())\n\t{\n\t\tUE_LOG(LogSoGameInstance, Log, TEXT(\"Pausing game because window is in background\"));\n\t\tPauseGame(true, true);\n\t}\n#endif\n\n\t// Try to mute when in background\n\t// TODO: maybe use FApp::GetUnfocusedVolumeMultiplier/SetUnfocusedVolumeMultiplier\n\tif (!USoAudioManager::IsAudioMuted() && !IsVideoLooping())\n\t{\n\t\tif (USoGameSettings::Get().IsAudioMutedWhenUnfocused())\n\t\t{\n\t\t\tbAudioMutedBecauseOfLostFocus = true;\n\t\t\tUSoAudioManager::MuteAudio();\n\t\t}\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoGameInstance::OnGameViewportFocusReceived()\n{\n\tif (USoPlatformHelper::IsGameInBackground(this))\n\t{\n\t\tUE_LOG(LogSoGameInstance, Verbose, TEXT(\"OnGameViewportFocusReceived: Ignoring because game windows is NOT in foreground\"));\n\t\treturn;\n\t}\n\n\tUE_LOG(LogSoGameInstance, Log, TEXT(\"Focus RECEIVED\"));\n\t// Sanity check\n\t// Sometimes the game is paused but the main menu is closed???\n\t// BUG: if I press continue then I alt tab quickly, the game stays paused but the main menu is not on screen but visibility and bOpen are true\n\t//if (USoPlatformHelper::IsGamePaused(this) && !IsMainMenuOpened())\n\t\t//OpenMainMenu();\n\n\tif (bAudioMutedBecauseOfLostFocus)\n\t{\n\t\tbAudioMutedBecauseOfLostFocus = false;\n\t\tUSoAudioManager::UnMuteAudio();\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoGameInstance::IsMainMenuOpened() const\n{\n\tif (ASoCharacter* Character = USoStaticHelper::GetPlayerCharacterAsSoCharacter(this))\n\t\treturn Character->IsMainMenuOpened();\n\n\treturn false;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoGameInstance::OpenMainMenu() const\n{\n\tif (ASoCharacter* Character = USoStaticHelper::GetPlayerCharacterAsSoCharacter(this))\n\t\tif (USoUIMenuMain* MainMenu = Character->GetUIMainMenu())\n\t\t\tMainMenu->InstantOpen(true);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoGameInstance::FocusGameUI()\n{\n\t//UGameEngine* GameEngine = Cast<UGameEngine>(GEngine);\n\n\t// Don't switch the window on game shutdown\n\t//if (GameEngine && !GIsRequestingExit)\n\t//{\n\t//\tGameEngine->SwitchGameWindowToUseGameViewport();\n\t//}\n\n\t//FSlateApplication::Get().SetAllUserFocusToGameViewport();\n\t//if (ASoCharacter* Character = USoStaticHelper::GetPlayerCharacterAsSoCharacter(this))\n\t//{\n\t//\tif (USoUISystem* UI = Character->GetUISystem())\n\t//\t{\n\t//\t\tFSlateApplication::Get().SetAllUserFocus(UI->TakeWidget());\n\t//\t}\n\t//}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoGameInstance::StartVideoLoopPlayback()\n{\n#if WARRIORB_WITH_VIDEO_DEMO\n\tASoCharacter* Character = USoStaticHelper::GetPlayerCharacterAsSoCharacter(this);\n\tif (!Character)\n\t{\n\t\tUE_LOG(LogSoGameInstance, Error, TEXT(\"StartVideoLoopPlayback: ASoCharacter is nullptr. Aborting\"));\n\t\treturn;\n\t}\n\n\tUSoUIVideoPlayer* VideoPlayer = Character->GetUIVideoPlayer();\n\tif (!VideoPlayer)\n\t{\n\t\tUE_LOG(LogSoGameInstance, Error, TEXT(\"StartVideoLoopPlayback: VideoPlayer is nullptr. Aborting\"));\n\t\treturn;\n\t}\n\n\tPreviousState = State;\n\tState = ESoGameInstanceState::PlayingVideoLoop;\n\tPauseGame(false, true);\n\tif (!IsAudioMuted())\n\t{\n\t\tbAudioMutedBecauseOfVideoPlayback = true;\n\t\tMuteAudio();\n\t}\n\n\tVideoPlayer->SetVideoTextureSource(USoGameSingleton::Get().VideoMediaTexturePtr.Get());\n\tVideoPlayer->SetVideoMediaPlayer(USoGameSingleton::Get().VideoMediaPlayerPtr.Get());\n\tVideoPlayer->SetVideoMediaSource(USoGameSingleton::Get().DemoMediaSourcePtr.Get());\n\tVideoPlayer->StartVideo();\n#endif // WARRIORB_WITH_VIDEO_DEMO\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoGameInstance::StopVideoLoopPlayback()\n{\n#if WARRIORB_WITH_VIDEO_DEMO\n\tif (!IsVideoLooping())\n\t\treturn;\n\n\tASoCharacter* Character = USoStaticHelper::GetPlayerCharacterAsSoCharacter(this);\n\tif (!Character)\n\t{\n\t\tUE_LOG(LogSoGameInstance, Error, TEXT(\"StopVideoLoopPlayback: ASoCharacter is nullptr. Aborting\"));\n\t\treturn;\n\t}\n\n\tUSoUIVideoPlayer* VideoPlayer = Character->GetUIVideoPlayer();\n\tif (!VideoPlayer)\n\t{\n\t\tUE_LOG(LogSoGameInstance, Error, TEXT(\"StopVideoLoopPlayback: VideoPlayer is nullptr. Aborting\"));\n\t\treturn;\n\t}\n\n\tState = PreviousState;\n\tVideoPlayer->StopVideo();\n\n\tResumeGame(false, true);\n\tif (bAudioMutedBecauseOfVideoPlayback)\n\t{\n\t\tbAudioMutedBecauseOfVideoPlayback = false;\n\t\tUnMuteAudio();\n\t}\n#endif // WARRIORB_WITH_VIDEO_DEMO\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoGameInstance::StartLoadingScreenMusic()\n{\n\tInitializeAudio();\n\tif (AudioManager)\n\t\tAudioManager->StartLoadingScreenMode(USoGameSingleton::Get().LoadingMusicPtr.Get());\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoGameInstance::StopLoadingScreenMusic()\n{\n\tInitializeAudio();\n\tif (AudioManager)\n\t{\n\t\tAudioManager->StopLoadingScreenMode();\n\t\tif (ASoCharacter* Char = USoStaticHelper::GetPlayerCharacterAsSoCharacter(this))\n\t\t\tChar->UpdateMusic(true);\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoGameInstance::OnMenuStateChange(bool bOpened)\n{\n\tUSoAudioManager::SetPausedMenuBuses(bOpened);\n\tOnMenuStateChanged.Broadcast(bOpened);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoGameInstance::OnDialogueStateChange(bool bOpened)\n{\n\tUSoGameSingleton::Get().VCA_AmbientDialogue.Target = bOpened ? 0.0f : 1.0f;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoGameInstance::VerifyStateMatchesCurrentLevelType()\n{\n\tswitch (State)\n\t{\n\tcase ESoGameInstanceState::Default:\n\tcase ESoGameInstanceState::LoadingChapter:\n\tcase ESoGameInstanceState::LoadingChapterCompleted:\n\t\tif (!USoLevelHelper::IsInChapterLevel(this))\n\t\t{\n\t\t\tUE_LOG(LogSoGameInstance, Error, TEXT(\"VerifyStateMatchesCurrentLevelType State is Chapter but Current Level is = %s\"), *USoLevelHelper::GetMapNameStringFromObject(this));\n\t\t}\n\t\tbreak;\n\n\tcase ESoGameInstanceState::PlayingEpisode:\n\tcase ESoGameInstanceState::LoadingEpisode:\n\tcase ESoGameInstanceState::LoadingEpisodeCompleted:\n\t\tif (!USoLevelHelper::IsInEpisodeLevel(this))\n\t\t{\n\t\t\tUE_LOG(LogSoGameInstance, Error, TEXT(\"VerifyStateMatchesCurrentLevelType State is Episode but Current Level is = %s\"), *USoLevelHelper::GetMapNameStringFromObject(this));\n\t\t}\n\t\tbreak;\n\n\tcase ESoGameInstanceState::InMainMenu:\n\tcase ESoGameInstanceState::LoadingMenu:\n\tcase ESoGameInstanceState::LoadingMenuCompleted:\n\t\tif (!USoLevelHelper::IsInMenuLevel(this))\n\t\t{\n\t\t\tUE_LOG(LogSoGameInstance, Error, TEXT(\"VerifyStateMatchesCurrentLevelType State is Menu but Current Level is = %s\"), *USoLevelHelper::GetMapNameStringFromObject(this));\n\t\t}\n\t\tbreak;\n\n\tdefault:\n\t\tbreak;\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoGameInstance::SetStateToCurrentLevelType()\n{\n\tif (IsLoading())\n\t{\n\t\tUE_LOG(LogSoGameInstance, Warning, TEXT(\"SetStateToCurrentLevelType can't set state because we are loading.\"));\n\t\treturn;\n\t}\n\n\t// We started in editor or by some magic the game started this way\n\tif (USoLevelHelper::IsInEpisodeLevel(this))\n\t{\n\t\tUE_LOG(LogSoGameInstance, Log, TEXT(\"SetStateToCurrentLevelType detected we are in a Episode level\"));\n\t\tState = ESoGameInstanceState::PlayingEpisode;\n\t}\n\telse if (USoLevelHelper::IsInChapterLevel(this))\n\t{\n\t\tUE_LOG(LogSoGameInstance, Log, TEXT(\"SetStateToCurrentLevelType detected we are in a Chapter level\"));\n\t\tState = ESoGameInstanceState::Default;\n\t}\n\telse if (USoLevelHelper::IsInMenuLevel(this))\n\t{\n\t\tUE_LOG(LogSoGameInstance, Log, TEXT(\"SetStateToCurrentLevelType detected we are in a Menu level\"));\n\t\tState = ESoGameInstanceState::InMainMenu;\n\t}\n\telse\n\t{\n\t\tif (USoPlatformHelper::IsGamePaused(this)) // && IsMainMenuOpened())\n\t\t{\n\t\t\tUE_LOG(LogSoGameInstance, Log, TEXT(\"SetStateToCurrentLevelType Game is Paused and Main Menu is open. Assuming main menu level!\"));\n\t\t\tState = ESoGameInstanceState::InMainMenu;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tUE_LOG(LogSoGameInstance, Warning, TEXT(\"SetStateToCurrentLevelType could not detect any level, what could it be?\"));\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "Source/SOrb/Basic/SoGameInstance.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#pragma once\n\n#include \"Engine/GameInstance.h\"\n\n#if WARRIORB_WITH_ONLINE\n#include \"GameFramework/OnlineReplStructs.h\"\n#include \"OnlineSubsystemTypes.h\"\n#endif\n\n// DlgConfigParser\n#include \"IO/DlgConfigParser.h\"\n\n// FSoCrashHandler\n#include \"SoCrashHandler.h\"\n\n// Enums/Structs\n#include \"Enemy/SoEnemyDataTypes.h\"\n#include \"Levels/SoLevelTypes.h\"\n#include \"Basic/SoDifficulty.h\"\n#include \"Effects/SoEffectBase.h\"\n\n// Loading screen instance\n#include \"INYLoadingScreenInstance.h\"\n\n#include \"SoGameInstance.generated.h\"\n\n\nDECLARE_DYNAMIC_MULTICAST_DELEGATE(FSoSaveNotify);\n\nDECLARE_DYNAMIC_MULTICAST_DELEGATE_TwoParams(FSoMapStartEvent, FName, MapName, FText, DisplayText);\n\nDECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FSoMenuStateChange, bool, bOpend);\n\n\nclass UFMODEvent;\nclass ASoCharacter;\nclass USoUILoadingScreen;\nclass UFMODVCA;\nclass USoAudioManager;\nclass USoAchievementManager;\nclass USoGameViewportClient;\nclass AStaticMeshActor;\nclass USoEAction;\nclass UFMODBus;\nclass USoEnemyVoiceManager;\nclass ASoProjectile;\nclass USoAnalytics;\n\n// Array wrappers for pools:\n\nUSTRUCT(BlueprintType)\nstruct FSoEffectInstanceArray\n{\n\tGENERATED_USTRUCT_BODY()\npublic:\n\tUPROPERTY()\n\tTArray<USoEffectBase*> Instances;\n};\n\nUSTRUCT(BlueprintType, Blueprintable)\nstruct FSoProjectileArray\n{\n\tGENERATED_USTRUCT_BODY()\npublic:\n\tUPROPERTY()\n\tTArray<ASoProjectile*> Instances;\n};\n\nUSTRUCT(BlueprintType, Blueprintable)\nstruct FSoHideRequests\n{\n\tGENERATED_USTRUCT_BODY()\npublic:\n\tUPROPERTY()\n\tAStaticMeshActor* Actor = nullptr;\n\n\tUPROPERTY()\n\tint32 RequestCount = 0;\n};\n\n\nUENUM()\nenum class ESoGameInstanceState : uint8\n{\n\t// Chapter\n\t// Default, usual game play in a chapter\n\tDefault = 0,\n\n\t// Demo\n\tPlayingVideoLoop,\n\n\tLoadingChapter,\n\tLoadingChapterCompleted,\n\n\t// Episode\n\tPlayingEpisode,\n\tLoadingEpisode,\n\tLoadingEpisodeCompleted,\n\n\t// Menu level\n\tInMainMenu,\n\tLoadingMenu,\n\tLoadingMenuCompleted\n};\n\n\n\nUCLASS(Blueprintable, BlueprintType, HideCategories = (Navigation), AutoCollapseCategories = (Performance, Clipping, Interaction, Input))\nclass SORB_API USoGameInstance : public UGameInstance\n{\n\tGENERATED_BODY()\npublic:\n\tUSoGameInstance(const FObjectInitializer& ObjectInitializer);\n\t~USoGameInstance();\n\n\t// UGameInstance Implementation\n\tvoid Init() override;\n\tvoid Shutdown() override;\n\tvoid StartGameInstance() override;\n\tbool HandleOpenCommand(const TCHAR* Cmd, FOutputDevice& Ar, UWorld* InWorld) override;\n\tvoid LoadComplete(float LoadTime, const FString& MapName) override;\n\n\t//\n\t// Own Methods\n\t//\n\n\tUFUNCTION(BlueprintPure, DisplayName = \"Get So Game Instance\", meta = (WorldContext = \"WorldContextObject\"))\n\tstatic USoGameInstance* GetInstance(const UObject* WorldContextObject);\n\tstatic USoGameInstance& Get(const UObject* WorldContextObject)\n\t{\n\t\tcheck(IsValid(WorldContextObject));\n\t\tauto* Instance = GetInstance(WorldContextObject);\n\t\tcheck(IsValid(Instance));\n\t\treturn *Instance;\n\t}\n\n\tbool AllowCheats() const;\n\tvoid SetAllowCheats(bool bAllow);\n\n\t// Custom Start play, is only called in game mode\n\tvoid BeforeGameModeStartPlay();\n\tvoid AfterGameModeStartPlay();\n\tvoid BeforeGameModeEndPlay();\n\n\t// Custom tick for game instance, only ticks in game mode (when a world is set)\n\tvoid Tick(float DeltaSeconds);\n\n\tUFUNCTION(BlueprintCallable)\n\tvoid StaticMeshHideRequest(AStaticMeshActor* StaticMeshActor, bool bHide);\n\n\t//\n\t// Online\n\t//\n#if WARRIORB_WITH_ONLINE\n\tvoid HandleLoginUIClosed(TSharedPtr<const class FUniqueNetId> UniqueId, const int ControllerIndex, const struct FOnlineError& Error);\n\tvoid HandleUserLoginChanged(int32 GameUserIndex, ELoginStatus::Type PreviousLoginStatus, ELoginStatus::Type LoginStatus, const FUniqueNetId& UserId);\n\tvoid HandleControllerPairingChanged(int GameUserIndex, const FUniqueNetId& PreviousUser, const FUniqueNetId& NewUser);\n#endif\n\tvoid HandleApplicationWillDeactivate();\n\n\t//\n\t// Load/Save the chapter/episode\n\t//\n\tbool CanSaveGame(FString& OutMessage) const;\n\n\tbool SaveGameForCurrentChapter(bool bForce = false);\n\tbool SaveGameForCurrentEpisode(bool bForce = false);\n\tbool SaveGameForChapter(int32 SlotIndex, bool bForce = false);\n\tbool SaveGameForEpisode(FName EpisodeName, bool bForce = false);\n\n\tUFUNCTION(BlueprintCallable, Category = \">Level\")\n\tvoid SaveGameForCurrentState(bool bForce = false);\n\n\t// Only used with the demo\n\tvoid UseSavesForDemo();\n\tbool LoadGameForDemo(bool bNewGame);\n\n\t// NOTE: all of these save the game if it playing a game\n\tbool LoadGameForCurrentChapter(bool bNewGame);\n\tbool LoadGameForCurrentEpisode(bool bNewGame);\n\tbool LoadGameForChapter(int32 SlotIndex, bool bNewGame, ESoDifficulty DifficultyForNewGame = ESoDifficulty::Intended);\n\tbool LoadGameForEpisode(FName EpisodeName, bool bNewGame);\n\n\t// Loads game from current state\n\tvoid LoadGameFromCurrentState(bool bNewGame);\n\n\t//\n\t// Teleport\n\t//\n\n\t/**\n\t * Move/Teleport character to the new chapter map\n\t * NOTE: by moving to the new level everything in the actors is reset\n\t * And a new World is set. Only USoGameInstance has the variables still set\n\t */\n\tUFUNCTION(BlueprintCallable, Category = \">Level\")\n\tbool TeleportToChapter(FName ChapterName, FName CheckpointName, bool bSave);\n\n\t// Move/Teleport character to the new episode. If it is already the current map it just ignore it and teleports to the checkpoint\n\tUFUNCTION(BlueprintCallable, Category = \">Level\")\n\tbool TeleportToEpisode(FName EpisodeName, bool bSave);\n\n\t// Teleport to main menu level\n\tUFUNCTION(BlueprintCallable, Category = \">Level\")\n\tbool TeleportToMainMenu(bool bSave, bool bForceReloadIfAlreadyIn = false);\n\n\t//\n\t// Analytics\n\t//\n\n\t/** Initializes/Shutdown the Analytics system */\n\tvoid InitializeAnalytics();\n\tvoid ShutdownAnalytics();\n\n\t// Gets the Analytics singleton\n\tUSoAnalytics* GetAnalytics();\n\n\t//\n\t// Achievements\n\t//\n\n\t/** Initializes/Shutdown the Achievement system */\n\tbool InitializeAchievements();\n\tvoid ShutdownAchievements();\n\n\tUSoAchievementManager* GetAchievementManager() const;\n\n\t//\n\t// Audio\n\t//\n\n\tUSoAudioManager* GetAudioManager();\n\tUSoEnemyVoiceManager* GetEnemyVoiceManager();\n\n\t/** Initializes/Shutdown the Audio system */\n\tvoid InitializeAudio();\n\tvoid ShutdownAudio();\n\n\t//\n\t// Other\n\t//\n\n\t/** has to be called in BeginPlay() cause PIE mode */\n\tvoid ClearConfigData();\n\n\t/**\n\t * Called to get an action set based on name - a template is stored in ActionSets map so it is read from config only once\n\t * @PARAM ListName: list identifier, also used in filename (file is located in \"So/AiConfig/ActionLists/\" + ListName.ToString() + \".sc\")\n\t * @PARAM Outer: should be the owner of the array - used to as outer when the new actions are constructed\n\t */\n\tvoid ReinitializeActionList(FName ListName, UObject* Outer, TArray<USoEAction*>& OutActions);\n\n\t/**\n\t * Called to initialize a strike map - a template is stored in ActionSets map so it is read from config only once\n\t * @PARAM MapName: list identifier, also used in filename (file is located in \"So/AiConfig/StrikeMaps/\" + ListName.ToString() + \".sc\")\n\t * @PARAM StrikeMap: (Out), array, cleared and filled based on the associated data\n\t */\n\tvoid ReinitializeStrikeMap(FName MapName, TMap<FName, FSoStrike>& StrikeMap);\n\n\tUSoEffectBase* ClaimEffect(TSubclassOf<USoEffectBase> Class);\n\tASoProjectile* ClaimProjectile(TSubclassOf<ASoProjectile> Class);\n\n\tvoid ClearObjectPools();\n\tvoid ReturnEffect(USoEffectBase* Effect);\n\tvoid ReturnProjectile(ASoProjectile* Projectile);\n\n\n\t// Is game started at least once? This is false initially but if the player presses continue or loads any save slot it will be true.\n\tbool IsGameStarted() const { return bGameStarted; }\n\tvoid SetGameStarted(bool bStarted);\n\n\tvoid OpenMenuInstant();\n\n\t// Resumes/Pauses the game and brings up the UI menu\n\tUFUNCTION(BlueprintCallable, Category = \">Pause\")\n\tbool PauseGame(bool bOpenMainMenu = false, bool bForce = false);\n\n\tUFUNCTION(BlueprintCallable, Category = \">Pause\")\n\tbool ResumeGame(bool bCloseMainMenu = false, bool bForce = false);\n\n\t// bBeforeMenuShownOnce:\n\tvoid SetBeforeMenuShownOnce(const bool bValue) { bBeforeMenuShownOnce = bValue; }\n\tbool IsBeforeMenuShownOnce() const { return bBeforeMenuShownOnce; }\n\n\t// State actions\n\tstatic FString GameInstanceStateToString(ESoGameInstanceState InstanceState);\n\tFString GetCurrentStateAsString() const { return GameInstanceStateToString(State); }\n\n\t// Should we show the button? Depending on the current state if in episode or story act\n\tbool CanHaveSoulKeeper() const;\n\n\t// Can we continue the current game?\n\tbool CanContinueGame() const;\n\n\t// Loading\n\tFORCEINLINE bool IsLoading() const { return IsLoadingChapter() || IsLoadingEpisode() || IsLoadingMenu(); }\n\tFORCEINLINE bool IsPlaying() const { return IsPlayingChapter() || IsPlayingEpisode(); }\n\n\tUFUNCTION(BlueprintPure, Category = \">LoadingScreen\")\n\tbool IsLoadingScreenVisible() const;\n\n\tbool ShouldStartLevelEnterSequence() const { return bShouldStartLevelEnterSequence; }\n\n\t// Episode\n\tFORCEINLINE bool IsEpisode() const { return IsLoadingEpisode() || IsPlayingEpisode();  }\n\tbool IsPlayingEpisode() const\n\t{\n\t\treturn State == ESoGameInstanceState::PlayingEpisode;\n\t}\n\tFORCEINLINE bool IsLoadingEpisode() const\n\t{\n\t\treturn State == ESoGameInstanceState::LoadingEpisode || State == ESoGameInstanceState::LoadingEpisodeCompleted;\n\t}\n\n\t// Chapter\n\tFORCEINLINE bool IsChapter() const { return IsLoadingChapter() || IsPlayingChapter(); }\n\tFORCEINLINE bool IsPlayingChapter() const { return State == ESoGameInstanceState::Default; }\n\tFORCEINLINE bool IsLoadingChapter() const\n\t{\n\t\treturn State == ESoGameInstanceState::LoadingChapter || State == ESoGameInstanceState::LoadingChapterCompleted;\n\t}\n\n\t// Menu\n\tFORCEINLINE bool IsMenu() const { return IsBrowsingMenu() || IsLoadingMenu(); }\n\tFORCEINLINE bool IsBrowsingMenu() const { return State == ESoGameInstanceState::InMainMenu; }\n\tFORCEINLINE bool IsLoadingMenu() const\n\t{\n\t\treturn State == ESoGameInstanceState::LoadingMenu || State == ESoGameInstanceState::LoadingMenuCompleted;\n\t}\n\n\tFORCEINLINE bool IsVideoLooping() const\n\t{\n\t\treturn State == ESoGameInstanceState::PlayingVideoLoop;\n\t}\n\n\t// Called from the USoGameViewportClient\n\tvoid OnGameViewportFocusLost();\n\tvoid OnGameViewportFocusReceived();\n\n\t// Video\n\tvoid StartVideoLoopPlayback();\n\tvoid StopVideoLoopPlayback();\n\n\t// Tries to query the game settings, returns true by default.\n\tbool IsSavingOrLoading() const { return bIsSavingOrLoading; }\n\n\tvoid StartLoadingScreenMusic();\n\tvoid StopLoadingScreenMusic();\n\n\tUFUNCTION(BlueprintCallable, Category = Dlg)\n\tvoid OnDialogueStateChange(bool bOpened);\n\n\tvoid OnMenuStateChange(bool bOpened);\n\n\t// Tries to set the State to Match the current level type\n\tvoid SetStateToCurrentLevelType();\n\n\tvoid SetGameViewportClient(USoGameViewportClient* GameViewportClient);\n\nprotected:\n\tUFUNCTION()\n\tvoid OnPreLoadMap(const FString& MapName);\n\n\tUFUNCTION()\n\tvoid OnPostLoadMapWithWorld(UWorld* InLoadedWorld);\n\n\tbool SetGamePaused(bool bToggleMenu, bool bPause);\n\tFORCEINLINE void ResetState()\n\t{\n\t\tState = ESoGameInstanceState::Default;\n\t\tSetStateToCurrentLevelType();\n\t}\n\tvoid ResetEpisode();\n\n\t//\n\t// Loading Screen\n\t//\n\n\tbool ShowLoadingScreen();\n\tbool HideLoadingScreen();\n\n\t// return -> false means that the loading screen was closed.\n\tbool SafeUpdateLoadingScreen(float DeltaSeconds, bool bResumeGame);\n\tbool TickLoadingScreen(float DeltaSeconds);\n\n\tbool DidEnterSequencePlayForMap(FName MapName) const;\n\tvoid SetMapAlreadyEnteredOnce(FName MapName, bool bValue);\n\tbool CanPlayEnterSequenceForMap(FName MapName) const;\n\tbool IsMapEnteredTheFirstTime(FName MapName) const;\n\tbool GetEnterSequenceData(FName MapName, ALevelSequenceActor*& OutLevelSequenceActor, AActor*& OutLevelEnterCamera, FSoLevelEnterParams& OutEnterParams);\n\tbool HasEnterSequenceData(FName MapName) const;\n\n\tUFUNCTION(BlueprintCallable)\n\tvoid SetupEnterSequence();\n\tvoid StartEnterSequence();\n\n\t// Variant that only works if we are playing\n\tvoid StartEnterSequenceFromSameLevel();\n\n\t//\n\t// UI\n\t//\n\n\tUFUNCTION()\n\tvoid OnViewportClientFadingChanged(bool bIsFading);\n\n\tbool IsMainMenuOpened() const;\n\tvoid OpenMainMenu() const;\n\tvoid FocusGameUI();\n\n\tvoid OnLoadingCompleted();\n\n\t//\n\t// Other\n\t//\n\n\t// Helper\n\tvoid ResetTimeSinceLastInput();\n\n\t// Callback when controllers disconnected / reconnected\n\tvoid HandleOnGamepadConnectionChange(bool bConnected, FPlatformUserId UserID, int32 GamepadID);\n\tvoid HandleOnGamepadPariringChange(int32 ControllerIndex, FPlatformUserId NewUserPlatformId, FPlatformUserId OldUserPlatformId);\n\n\t/** Either gets an object from the pool or constructs one if there is none */\n\ttemplate <typename ObjectType, typename CacheMapType>\n\tObjectType* ClaimObject(CacheMapType& Cache, TSubclassOf<ObjectType> Class);\n\n\t/** Objects acquired by ClaimEffect should be returned to pool via this function */\n\ttemplate <typename ObjectType, typename CacheMapType>\n\tvoid ReturnObject(CacheMapType& Cache, ObjectType* Object);\n\n\t// Checks if the current state matches the world\n\tvoid VerifyStateMatchesCurrentLevelType();\n\nprotected:\n\n\t//\n\t// AI configs\n\t//\n\n\tTMap<FName, FDlgConfigParser> ActionLists;\n\n\tUPROPERTY()\n\tTMap<FName, FSoEStrikes> StrikeMaps;\n\n\n\t//\n\t// Object pools/Objects\n\t//\n\n\tUPROPERTY()\n\tTArray<FSoHideRequests> StaticMeshHideRequests;\n\n\tUPROPERTY()\n\tTMap<TSubclassOf<USoEffectBase>, FSoEffectInstanceArray> EffectPool;\n\n\tUPROPERTY()\n\tTMap<TSubclassOf<ASoProjectile>, FSoProjectileArray> ProjectilePool;\n\n\n\t//\n\t// Audio\n\t//\n\n\tUPROPERTY()\n\tUSoAudioManager* AudioManager = nullptr;\n\n\tUPROPERTY()\n\tUSoEnemyVoiceManager* EnemyVoiceManager = nullptr;\n\n\t// Volumes\n\tfloat VolumeMaster = 1.0f;\n\tfloat VolumeSFX = 1.0f;\n\tfloat VolumeMusic = 1.0f;\n\n\tUPROPERTY()\n\tbool bAudioMutedBecauseOfLostFocus = false;\n\n\tUPROPERTY()\n\tbool bAudioMutedBecauseOfVideoPlayback = false;\n\n\n\t//\n\t// UI\n\t//\n\n\tUSoGameViewportClient* Viewport = nullptr;\n\n\tTSharedPtr<INYLoadingScreenInstance> LoadingScreenInstance = nullptr;\n\n\tUPROPERTY(BlueprintReadOnly)\n\tbool bShouldStartLevelEnterSequence = false;\n\n\tUPROPERTY(BlueprintReadOnly)\n\tfloat EnterSequenceTimer = -1.0f;\n\n\t// For BeforeMainMenu\n\tUPROPERTY()\n\tbool bBeforeMenuShownOnce = false;\n\n\t//\n\t// Achievements\n\t//\n\tUPROPERTY()\n\tUSoAchievementManager* AchievementManager = nullptr;\n\n\n\t//\n\t// Analytics\n\t//\n\n\tUPROPERTY()\n\tUSoAnalytics* AnalyticsInstance = nullptr;\n\n\n\t//\n\t// Other\n\t//\n\n\t// Used for demo video playback, do we need it anywhere else?\n\tUPROPERTY()\n\tESoGameInstanceState PreviousState = ESoGameInstanceState::Default;\n\n\tUPROPERTY()\n\tESoGameInstanceState State = ESoGameInstanceState::Default;\n\n\t// True if the game was started, by started it means the player can move in the game:\n\t// Pressed continue, loaded save, started new game, started in editor.\n\t// Set by UI.\n\tUPROPERTY(BlueprintReadOnly, Category = \">State\")\n\tbool bGameStarted = false;\n\n\n\t// Is a saving or loading operation in progress? Flag created so that save/load are mutually exclusive\n\tUPROPERTY(BlueprintReadOnly, Category = \">State\")\n\tbool bIsSavingOrLoading = false;\n\n\tUPROPERTY(BlueprintAssignable, Category = \">Events\")\n\tFSoSaveNotify OnSaveToSlot;\n\n\tUPROPERTY(BlueprintAssignable, Category = \">Events\")\n\tFSoMapStartEvent OnMapStart;\n\n\tUPROPERTY(BlueprintAssignable, Category = \">Events\")\n\tFSoMenuStateChange OnMenuStateChanged;\n\n\t// Custom crash handler, on the stack seems to be the safest\n\tUPROPERTY()\n\tFSoCrashHandler CrashHandler;\n\n\t// Are we moving between worlds?\n\tbool bIsTransitioningWorlds = false;\n\tFName LastLoadedMapName = NAME_None;\n\n\tFDelegateHandle ApplicationWillDeactivateDelegate;\n\n\tbool bWasDeactivatedDuringLoading = false;\n\n\t//\n\t// Cheats\n\t//\n\n\t// Value user configurable\n\tbool bAllowCheats = WARRIORB_ALLOW_CONSOLE_CHEATS_DEFAULT;\n};\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\ntemplate <typename ObjectType, typename CacheMapType>\nObjectType* USoGameInstance::ClaimObject(CacheMapType& Cache, TSubclassOf<ObjectType> Class)\n{\n\tauto* ArrayPtr = Cache.Find(Class);\n\tif (ArrayPtr == nullptr)\n\t\tCache.Add(Class);\n\telse if (ArrayPtr->Instances.Num() != 0)\n\t\treturn ArrayPtr->Instances.Pop();\n\n\treturn nullptr;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\ntemplate <typename ObjectType, typename CacheMapType>\nvoid USoGameInstance::ReturnObject(CacheMapType& Cache, ObjectType* Object)\n{\n\tauto* ArrayPtr = Cache.Find(Object->GetClass());\n\tif (ArrayPtr != nullptr)\n\t\tArrayPtr->Instances.Push(Object);\n\telse\n\t\tCache.Add(Object->GetClass(), { { Object } });\n}\n"
  },
  {
    "path": "Source/SOrb/Basic/SoGameMode.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#include \"SoGameMode.h\"\n#include \"EngineUtils.h\"\n#include \"SplineLogic/SoEditorGameInterface.h\"\n#include \"Basic/Helpers/SoStaticHelper.h\"\n#include \"TimerManager.h\"\n\n#include \"DlgDialogueParticipant.h\"\n#include \"DlgMemory.h\"\n#include \"IDlgSystemModule.h\"\n#include \"IO/DlgConfigParser.h\"\n\n#include \"Online/Analytics/SoAnalyticsHelper.h\"\n\n#include \"HAL/IConsoleManager.h\"\n#include \"Basic/SoEventHandler.h\"\n#include \"Basic/SoGameInstance.h\"\n#include \"Settings/SoGameSettings.h\"\n#include \"Character/SoCharacter.h\"\n#include \"Character/SoPlayerController.h\"\n#include \"Enemy/SoEnemy.h\"\n#include \"Enemy/SoEnemyHelper.h\"\n#include \"Character/SoCharStates/SoAInUI.h\"\n#include \"SplineLogic/SoSplineWalker.h\"\n#include \"Basic/SoTimerManager.h\"\n\n#if WITH_EDITOR\n#include \"Editor/UnrealEd/Public/UnrealEdGlobals.h\"\n#include \"Editor/UnrealEdEngine.h\"\n#endif // WITH_EDITOR\n\n#include \"SaveFiles/SoWorldState.h\"\n#include \"Levels/SoLevelHelper.h\"\n#include \"Levels/SoLevelManager.h\"\n#include \"Online/SoOnlineHelper.h\"\n#include \"INYLoadingScreenModule.h\"\n#include \"Helpers/SoDateTimeHelper.h\"\n\nDEFINE_LOG_CATEGORY_STATIC(LogSoGameMode, All, All);\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nASoGameMode::ASoGameMode()\n{\n\tSoTimerManager = new FSoTimerManager{};\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nASoGameMode::~ASoGameMode()\n{\n\tdelete SoTimerManager;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nASoGameMode* ASoGameMode::GetInstance(const UObject* WorldContextObject)\n{\n\tif (!GEngine || !WorldContextObject)\n\t\treturn nullptr;\n\n\tif (UWorld* World = GEngine->GetWorldFromContextObject(WorldContextObject, EGetWorldErrorMode::LogAndReturnNull))\n\t\treturn Cast<ASoGameMode>(World->GetAuthGameMode());\n\n\treturn nullptr;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nASoCharacter* ASoGameMode::GetSoCharacter()\n{\n\tif (!IsValid(CachedSoCharacter))\n\t{\n\t\tCachedSoCharacter = USoStaticHelper::GetPlayerCharacterAsSoCharacter(this);\n\t}\n\treturn CachedSoCharacter;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoGameMode::StartPlay()\n{\n\tUE_LOG(LogSoGameMode, Log, TEXT(\"StartPlay\"));\n\n\t// Level unloading in the same frame\n\tif (auto CVar = IConsoleManager::Get().FindConsoleVariable(TEXT(\"s.UnregisterComponentsTimeLimit\")))\n\t{\n\t\tCVar->Set(-1.0f);\n\t}\n\n\tPrimaryActorTick.bCanEverTick = true;\n\tPrimaryActorTick.TickGroup = TG_PostPhysics;\n\n\t// Cleanup\n\tauto& WorldState = FSoWorldState::Get();\n#if WITH_EDITOR\n\t// Refresh, useful for Editor mode mostly\n\tWorldState.ResetToDefault();\n#endif\n\n\t// Reset for PIE mode, New Level opened\n\t// has to be called before the BeginPlay() calls!\n\tFSoLevelManager::Get().Empty();\n\tFDlgMemory::GetInstance()->Empty();\n\n\t// Init cloud saves\n\tTSharedPtr<const FUniqueNetId> UserID = USoOnlineHelper::GetUniqueNetIDFromObject(this);\n\tWorldState.GetCloudSavesManager().Initiallize(UserID);\n\n\t// GameInstance\n\tGameInstance = USoGameInstance::GetInstance(this);\n\tverify(GameInstance);\n\tGameInstance->BeforeGameModeStartPlay();\n\n\t// Init Settings\n\tauto& Settings = USoGameSettings::Get();\n#if WITH_EDITOR\n\tSettings.BeforeGameModeStartPlay();\n#else\n\tstatic bool bWasMenuLoadedAlready = false;\n\tif (GameInstance->IsMenu() && !bWasMenuLoadedAlready)\n\t{\n\t\tbWasMenuLoadedAlready = true;\n\t\tSettings.BeforeGameModeStartPlay();\n\t}\n#endif\n\n\t// Set backup of saves.\n\tWorldState.SetAutoBackupDeletedSaves(Settings.IsAutoBackupDeletedSavesEnabled());\n\tWorldState.SetAutoBackupBeforeSave(Settings.IsAutoBackupBeforeSaveEnabled());\n\n\t// Init enemy groups\n\tif (!GameInstance->IsMenu())\n\t{\n\t\tFDlgConfigParser ConfigParser(\"So\");\n\t\tConfigParser.InitializeParser(FSoEditorGameInterface::GetEnemyGroupDataConfigPath(GetWorld()));\n\t\tConfigParser.ReadAllProperty(FSoEnemyGroups::StaticStruct(), &EnemyGroupInitData);\n\t\tEnemyGroupActualValues = EnemyGroupInitData;\n\t\tDestroyedEnemies.Empty();\n\t}\n\n\t// BEFORE BeginPlays()!!!\n\tif (ASoCharacter* Character = GetSoCharacter())\n\t{\n\t\tCharacter->OnPlayerRematerialized.AddDynamic(this, &ThisClass::OnPlayerRematerialize);\n\t\tCharacter->OnPlayerRespawn.AddDynamic(this, &ThisClass::OnPlayerRespawn);\n\t\tCharacter->OnPlayerSplineChanged.AddDynamic(this, &ThisClass::OnPlayerSplineChanged);\n\t}\n\n\t// call BeginPlay()-s on each actor\n\tSuper::StartPlay();\n\n\t// called *after* the splines had their begin play call\n\tFSoEditorGameInterface::LoadCameraData(GetWorld());\n\n\t// Register plugin console commands\n\tif (IDlgSystemModule::IsAvailable())\n\t{\n\t\tIDlgSystemModule::Get().RegisterConsoleCommands(this);\n\t}\n\telse\n\t{\n\t\tUE_LOG(LogSoGameMode, Error, TEXT(\"DlgSystemModule is not Available\"));\n\t}\n\tif (INYLoadingScreenModule::IsAvailable())\n\t{\n\t\tINYLoadingScreenModule::Get().RegisterConsoleCommands(this);\n\t}\n\telse\n\t{\n\t\tUE_LOG(LogSoGameMode, Error, TEXT(\"NYLoadingScreenModule is not Available\"));\n\t}\n\n\t// Register game console commands\n\tConsoleCommands.RegisterAllCommands(this);\n\n\tGameInstance->AfterGameModeStartPlay();\n\n\tOnPostBeginPlay.Broadcast();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoGameMode::Tick(float DeltaSeconds)\n{\n\tSuper::Tick(DeltaSeconds);\n\n\t// Tick game instance\n\tGameInstance->Tick(DeltaSeconds);\n\n\tif (ASoCharacter* Character = GetSoCharacter())\n\t{\n\t\tconst auto& Settings = USoGameSettings::Get();\n\t\tconst float IdleTimeSecondsBeforeGamePause = Settings.GetIdleTimeSecondsBeforeGamePause();\n\t\tconst bool bPauseGameOnIdle = Settings.CanPauseGameOnIdle();\n\t\tconst bool bVideoDemoStartVideoOnIdle = Settings.CanVideoDemoStartVideoOnIdle();\n\t\tconst float VideoDemoIdleTimeSecondsStartVideo = Settings.GetVideoDemoIdleTimeSecondsStartVideo();\n\n\t\t// Pause game if the user is idle\n#if !WARRIORB_WITH_EDITOR\n\t\tif (GameInstance->IsGameStarted() &&\n\t\t\tbPauseGameOnIdle &&\n\t\t\t!GameInstance->IsLoading() &&\n\t\t\tIdleTimeSecondsBeforeGamePause > KINDA_SMALL_NUMBER &&\n\t\t\tCharacter->CanPauseOnIdle())\n\t\t{\n\t\t\tconst float IdleTimeSeconds = Character->GetSoPlayerController()->GetTimeSecondsSinceLastInput();\n\t\t\tif (IdleTimeSeconds > IdleTimeSecondsBeforeGamePause)\n\t\t\t{\n\t\t\t\tUE_LOG(LogSoGameMode, Log, TEXT(\"Pausing game because it was idle for more than %f seconds\"), IdleTimeSecondsBeforeGamePause);\n\n\t\t\t\t// should reset idle time\n\t\t\t\tGameInstance->PauseGame(true);\n\t\t\t}\n\t\t}\n#endif // !WARRIORB_WITH_EDITOR\n\n\t\t// Demo idle video loop\n#if WARRIORB_WITH_VIDEO_DEMO\n\t\tif (bVideoDemoStartVideoOnIdle && VideoDemoIdleTimeSecondsStartVideo > KINDA_SMALL_NUMBER && !GameInstance->IsVideoLoopingState())\n\t\t{\n\t\t\tconst float IdleTimeSeconds = Character->GetSoPlayerController()->GetTimeSecondsSinceLastInput();\n\t\t\tif (IdleTimeSeconds > VideoDemoIdleTimeSecondsStartVideo)\n\t\t\t{\n\t\t\t\tUE_LOG(LogSoGameMode, Log, TEXT(\"Demo: Starting video loop because of idle for about %f seconds\"), VideoDemoIdleTimeSecondsStartVideo);\n\t\t\t\tCharacter->StartVideoLoopPlayback();\n\t\t\t}\n\t\t}\n#endif // WARRIORB_WITH_VIDEO_DEMO\n\n\t\t// Update Levels\n\t\tconst FSoSplinePoint PlayerSplineLocation = ISoSplineWalker::Execute_GetSplineLocationI(Character);\n\t\tFSoLevelManager::Get().Update(PlayerSplineLocation, DeltaSeconds);\n\n\t\tconst EActivity CharActivity = Character->GetActivity();\n\t\tif (bShouldEnterGroupDefeated && CharActivity != EActivity::EA_Dead &&\n\t\t\t\t\t\t\t\t\t\t CharActivity != EActivity::EA_FallToDeath &&\n\t\t\t\t\t\t\t\t\t\t CharActivity != EActivity::EA_HitReact &&\n\t\t\t\t\t\t\t\t\t\t CharActivity != EActivity::EA_Teleport)\n\t\t{\n\t\t\tbShouldEnterGroupDefeated = false;\n\t\t\tCharacter->SoAInUI->Enter(this, GroupDestroyedUIClass, true);\n\t\t}\n\t}\n\telse\n\t{\n\t\t// Character not present yet, load all\n\t\tFSoLevelManager::Get().ClaimAndLoadAllLevels(GetWorld());\n\t}\n\n\t// Stop executing everything beyond this point if the playworld is paused\n#if WITH_EDITOR\n\tif (GUnrealEd && GUnrealEd->PlayWorld && GUnrealEd->PlayWorld->bDebugPauseExecution)\n\t{\n\t\treturn;\n\t}\n#endif\n\n\tif (!IsPaused())\n\t{\n\t\tSoTimerManager->Tick(DeltaSeconds);\n\n\t\tfor (const FSoFlyingEnemyPositionRules& Rule : FlyingEnemyPositionRules)\n\t\t\tUSoEnemyHelper::ForceDistanceOnFlyingEnemies(this, Rule.FlyingEnemyClass, Rule.MinDistance, Rule.MaxCorrectionSpeed * DeltaSeconds);\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoGameMode::EndPlay(const EEndPlayReason::Type EndPlayReason)\n{\n\tUE_LOG(LogSoGameMode, Log, TEXT(\"EndPlay\"));\n\n\tFSoWorldState::Get().GetCloudSavesManager().Shutdown();\n\tGameInstance->BeforeGameModeEndPlay();\n\n\tGetWorld()->GetTimerManager().ClearTimer(EnemyGroupDestroyedNotificationTimer);\n\n\tif (ASoCharacter* Character = GetSoCharacter())\n\t{\n\t\tCharacter->OnPlayerRematerialized.RemoveDynamic(this, &ThisClass::OnPlayerRematerialize);\n\t\tCharacter->OnPlayerRespawn.RemoveDynamic(this, &ThisClass::OnPlayerRespawn);\n\t\tCharacter->OnPlayerSplineChanged.RemoveDynamic(this, &ThisClass::OnPlayerSplineChanged);\n\t}\n\n\tCachedSoCharacter = nullptr;\n\tGameInstance->ClearObjectPools();\n\n\tSuper::EndPlay(EndPlayReason);\n\n\t// Unregister all the console commands\n\tif (IDlgSystemModule::IsAvailable())\n\t{\n\t\tIDlgSystemModule::Get().UnregisterConsoleCommands();\n\t}\n\n\tConsoleCommands.UnRegisterAllCommands();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool ASoGameMode::AllowCheats(APlayerController* Controller)\n{\n\treturn GameInstance && GameInstance->AllowCheats();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFSoTimerManager& ASoGameMode::GetTimerManager() const\n{\n\treturn *SoTimerManager;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoGameMode::PreSaveGame() const\n{\n\tUE_LOG(LogSoGameMode, Log, TEXT(\"PreSaveGame\"));\n\n\t// Notify subscribers that they need to save their stuff right now\n\tOnPreSave.Broadcast();\n\n\t// Dialogue history\n\tFSoWorldState::Get().SetDlgHistory(FDlgMemory::GetInstance()->GetHistoryMaps());\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoGameMode::PostLoadGame()\n{\n\tUE_LOG(LogSoGameMode, Log, TEXT(\"PostLoadGame\"));\n\tGetWorld()->GetTimerManager().ClearTimer(EnemyGroupDestroyedNotificationTimer);\n\n\tEnemyGroupActualValues = EnemyGroupInitData;\n\tDestroyedEnemies.Empty();\n\n\t// Dialogue history\n\tFDlgMemory::GetInstance()->SetHistoryMap(FSoWorldState::Get().GetDlgHistory());\n\n\t// Notify listeners we loaded something\n\t// 1. The OnPostLoad listeners\n\t// 2. The uobjects that implement the ISoEventHandler and were subscribed\n\tOnPostLoad.Broadcast();\n\tfor (UObject* EventHandler : PostLoadHandlers)\n\t\tif (EventHandler != nullptr)\n\t\t\tISoEventHandler::Execute_HandleSoPostLoad(EventHandler);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoGameMode::OnEnemyDestroyed(ASoEnemy* Enemy, FName Group, FVector WorldLocation)\n{\n\tif (!ensure(Enemy))\n\t{\n\t\tUE_LOG(LogSoGameMode, Warning, TEXT(\"ASoGameMode::OnEnemyDestroyed called with invalid enemy!\"));\n\t\treturn;\n\t}\n\n\tOnEnemyDied.Broadcast(Enemy);\n\n\tif (Group == NAME_None)\n\t{\n\t\treturn;\n\t}\n\n\tif (FSoEnemyArray* ArrayPtr = EnemiesAlive.Find(Group))\n\t{\n\t\tif (ArrayPtr->Enemies.RemoveSwap(Enemy) != 1)\n\t\t\tUE_LOG(LogSoGameMode, Warning, TEXT(\"EnemiesAlive does not contain exactly one enemy from the destroyed one (%s / %s)\"), *Enemy->GetName(), *Group.ToString());\n\t}\n\n\tint32* ValuePtr = EnemyGroupActualValues.EnemyGroupMap.Find(Group);\n\tif (ValuePtr == nullptr)\n\t{\n\t\tUE_LOG(LogSoGameMode, Warning, TEXT(\"ASoGameMode::OnEnemyDestroyed called with %s, but the map does not contain it!\"), *Group.ToString());\n\t\treturn;\n\t}\n\n\tif (!ensure(*ValuePtr > 0))\n\t\treturn;\n\n\n\t// count destroyed enemies per class\n\tbool bAlreadyKilledOneLikeThis = false;\n\tFSoEnemyCounts* Counts = DestroyedEnemies.Find(Group);\n\tif (Counts == nullptr)\n\t\tCounts = &DestroyedEnemies.Add(Group, {});\n\n\tfor (FSoEnemyCount& EnemyCount : Counts->Counts)\n\t\tif (EnemyCount.Class == Enemy->GetClass())\n\t\t{\n\t\t\tbAlreadyKilledOneLikeThis = true;\n\t\t\tEnemyCount.Count += 1;\n\t\t\tif (Enemy->IsPlacedInLevel())\n\t\t\t\tEnemyCount.PlacedInLevelCount += 1;\n\t\t}\n\n\tif (!bAlreadyKilledOneLikeThis)\n\t{\n\t\tCounts->Counts.Add({ Enemy->GetClass(), 1, Enemy->IsPlacedInLevel() ? 1 : 0 });\n\t}\n\n\n\n\t(*ValuePtr) = (*ValuePtr) - 1;\n\tUE_LOG(LogSoGameMode, Display, TEXT(\"Enemy group %s: %d left\"), *Group.ToString(), *ValuePtr);\n\tif ((*ValuePtr) == 0)\n\t{\n\t\tUE_LOG(LogSoGameMode, Display, TEXT(\"Enemy group %s cleared\"), *Group.ToString());\n\t\tIDlgDialogueParticipant::Execute_ModifyBoolValue(USoStaticHelper::GetPlayerCharacterAsActor(this), Group, true);\n\t\tUSoAnalyticsHelper::RecordGameplayMilestone(this, Group, true);\n\n\t\tOnEnemyGroupDefeated.Broadcast(Group);\n\n\t\tLastDestroyedGroupName = Group;\n\t\tfloat Delay = 2.0f;\n\t\tif (float* DelayOverridePtr = EnemyGroupDefeatedDelayOverride.Find(LastDestroyedGroupName))\n\t\t\tDelay = *DelayOverridePtr;\n\t\tGetWorld()->GetTimerManager().SetTimer(\n\t\t\tEnemyGroupDestroyedNotificationTimer,\n\t\t\tthis,\n\t\t\t&ThisClass::OnGroupDestroyed,\n\t\t\tUSoDateTimeHelper::NormalizeTime(Delay),\n\t\t\tfalse\n\t\t);\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoGameMode::IncreaseEnemyCountInGroup(FName Group, int32 Num)\n{\n\tif (Group == NAME_None)\n\t\treturn;\n\n\tint32* ValuePtr = EnemyGroupActualValues.EnemyGroupMap.Find(Group);\n\tif (ValuePtr == nullptr)\n\t{\n\t\tUE_LOG(LogSoGameMode, Warning, TEXT(\"ASoGameMode::IncreaseEnemyCountInGroup called with %s, but the map does not contain it!\"), *Group.ToString());\n\t\treturn;\n\t}\n\n\t(*ValuePtr) = (*ValuePtr) + Num;\n\n\t// we assume here that all dynamically spawned ones are regenerated\n\t// placed in level ones are just frozen, so the ones already killed won't respawn\n\t// the spawner respawns everyone on reenter\n\tif (FSoEnemyCounts* EnemyCounts = DestroyedEnemies.Find(Group))\n\t{\n\t\tfor (FSoEnemyCount& EnemyCount : EnemyCounts->Counts)\n\t\t\tEnemyCount.Count = EnemyCount.PlacedInLevelCount;\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoGameMode::RegisterEnemy(ASoEnemy* Enemy, FName Group)\n{\n\tif (Group == NAME_None || Enemy == nullptr)\n\t{\n\t\treturn;\n\t}\n\n\tFSoEnemyArray* ArrayPtr = EnemiesAlive.Find(Group);\n\tif (ArrayPtr == nullptr)\n\t\tArrayPtr = &EnemiesAlive.Add(Group);\n\n\tArrayPtr->Enemies.AddUnique(Enemy);\n\tEnemies.AddUnique(Enemy);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoGameMode::UnregisterEnemy(ASoEnemy* Enemy, FName Group)\n{\n\tif (Group == NAME_None || Enemy == nullptr)\n\t{\n\t\treturn;\n\t}\n\n\tFSoEnemyArray* ArrayPtr = EnemiesAlive.Find(Group);\n\tif (ArrayPtr != nullptr)\n\t\tArrayPtr->Enemies.RemoveSwap(Enemy);\n\n\tEnemies.RemoveSwap(Enemy);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nconst TArray<ASoEnemy*>& ASoGameMode::GetEnemiesFromGroup(FName Group)\n{\n\tstatic TArray<ASoEnemy*> EmptyArray;\n\n\tif (FSoEnemyArray* ArrayPtr = EnemiesAlive.Find(Group))\n\t\treturn ArrayPtr->Enemies;\n\n\treturn EmptyArray;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoGameMode::OverrideGroupDefeatedDelay(FName GroupName, float OverrideTime)\n{\n\tEnemyGroupDefeatedDelayOverride.Add(GroupName, OverrideTime);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoGameMode::OnGroupDestroyed()\n{\n\tif (ASoCharacter* Character = GetSoCharacter())\n\t{\n\t\tconst EActivity CharActivity = Character->GetActivity();\n\t\tif (CharActivity != EActivity::EA_Dead &&\n\t\t\tCharActivity != EActivity::EA_FallToDeath &&\n\t\t\tCharActivity != EActivity::EA_HitReact &&\n\t\t\tCharActivity != EActivity::EA_Teleport)\n\t\t{\n\t\t\tCharacter->SoAInUI->Enter(this, GroupDestroyedUIClass, true);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tbShouldEnterGroupDefeated = true;\n\t\t}\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool ASoGameMode::IsEnemyGroupStillActive(FName Group) const\n{\n\tif (Group == NAME_None)\n\t\treturn true;\n\n\tAActor* Character = USoStaticHelper::GetPlayerCharacterAsActor(this);\n\treturn Character == nullptr || !IDlgDialogueParticipant::Execute_GetBoolValue(Character, Group);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoGameMode::SubscribeToSoPostLoad(UObject* Object)\n{\n\tif (Object == nullptr)\n\t\treturn;\n\n\tif (Object->GetClass()->ImplementsInterface(USoEventHandler::StaticClass()))\n\t{\n\t\tPostLoadHandlers.AddUnique(Object);\n\t\t// called immediately because the state might be changed already\n\t\tISoEventHandler::Execute_HandleSoPostLoad(Object);\n\t}\n\telse\n\t\tUE_LOG(LogSoGameMode, Warning, TEXT(\"SubscribeToSoPostLoad failed: %s does not implement the USoEventHandler interface!\"), *Object->GetName());\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoGameMode::UnsubscribeFromSoPostLoad(UObject* Object)\n{\n\tPostLoadHandlers.RemoveSwap(Object);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoGameMode::SubscribeToPlayerRematerialize(UObject* Object)\n{\n\tif (Object == nullptr)\n\t\treturn;\n\n\tif (Object->GetClass()->ImplementsInterface(USoEventHandler::StaticClass()))\n\t\tPlayerRematerializedHandlers.AddUnique(Object);\n\telse\n\t\tUE_LOG(LogSoGameMode, Warning, TEXT(\"SubscribeToPlayerRematerialize failed: %s does not implement the USoEventHandler interface!\"), *Object->GetName());\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoGameMode::UnsubscribeFromPlayerRematerialize(UObject* Object)\n{\n\tif (Object == nullptr)\n\t\treturn;\n\n\tif (bPlayerRematerializedHandlersArrayBlock)\n\t\tPlayerRematerializedUnsubscribeRequests.Add(Object);\n\telse\n\t\tPlayerRematerializedHandlers.RemoveSingleSwap(Object);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoGameMode::SubscribeToPlayerRespawn(UObject* Object)\n{\n\tif (Object == nullptr)\n\t\treturn;\n\n\tif (Object->GetClass()->ImplementsInterface(USoEventHandler::StaticClass()))\n\t\tPlayerRespawnHandlers.AddUnique(Object);\n\telse\n\t\tUE_LOG(LogSoGameMode, Warning, TEXT(\"SubscribeToPlayerRespawn failed: %s does not implement the USoEventHandler interface!\"), *Object->GetName());\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoGameMode::UnsubscribeFromPlayerRespawn(UObject* Object)\n{\n\tif (bPlayerRespawnHandlersArrayBlock)\n\t\tPlayerRespawnUnsubscribeRequests.Add(Object);\n\telse\n\t\tPlayerRespawnHandlers.RemoveSingleSwap(Object);\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoGameMode::SubscribeWhitelistedSplines(UObject* Object, const TArray<TAssetPtr<ASoSpline>>& WhitelistedSplines)\n{\n\tif (Object == nullptr)\n\t\treturn;\n\n\tverify(bSplineChangedNotificationsInProgress == false);\n\n\tif (Object->GetClass()->ImplementsInterface(USoEventHandler::StaticClass()))\n\t{\n\t\tFSoSplineArray& SplineArray = SplineGroupChangedHandlers.Add(Object, {});\n\t\tfor (auto SplinePtr : WhitelistedSplines)\n\t\t\tif (ASoSpline* Spline = SplinePtr.Get())\n\t\t\t\tSplineArray.Splines.Add(Spline);\n\n\t\tif (ASoCharacter* Character = GetSoCharacter())\n\t\t{\n\t\t\tconst FSoSplinePoint PlayerSplineLocation = ISoSplineWalker::Execute_GetSplineLocationI(Character);\n\t\t\tif (WhitelistedSplines.Contains(PlayerSplineLocation.GetSpline()))\n\t\t\t\tISoEventHandler::Execute_HandleWhitelistedSplinesEntered(Object);\n\t\t}\n\t}\n\telse\n\t\tUE_LOG(LogSoGameMode, Warning, TEXT(\"SubscribeWhitelistedSplines failed: %s does not implement the USoEventHandler interface!\"), *Object->GetName());\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoGameMode::UnsubscribeWhitelistedSplines(UObject* Object)\n{\n\tverify(bSplineChangedNotificationsInProgress == false);\n\tSplineGroupChangedHandlers.Remove(Object);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoGameMode::DisplayDamageText(const FVector& HitLocation, int32 DmgAmount, bool bPhysical, bool bOnPlayer, bool bCritical)\n{\n\tif (USoGameSettings::Get().IsDisplayDamageTextsEnabled())\n\t\tOnDisplayDamageText.Broadcast(HitLocation, DmgAmount, bPhysical, bOnPlayer, bCritical);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoGameMode::DisplayText(const FVector& Location, ESoDisplayText DisplayText)\n{\n\tif (USoGameSettings::Get().IsDisplayDamageTextsEnabled())\n\t\tOnDisplayText.Broadcast(Location, DisplayText);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nTArray<FSoEnemyCount>& ASoGameMode::GetDestroyedEnemyCount(FName Group)\n{\n\tif (FSoEnemyCounts* Count = DestroyedEnemies.Find(Group))\n\t{\n\t\treturn Count->Counts;\n\t}\n\n\tstatic TArray<FSoEnemyCount> Empty;\n\treturn Empty;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nint32 ASoGameMode::CalculateDestroyedEnemyCount(FName Group)\n{\n\tint32 Count = 0;\n\tif (FSoEnemyCounts* EnemyCounts = DestroyedEnemies.Find(Group))\n\t{\n\t\tfor (FSoEnemyCount& EnemyCount : EnemyCounts->Counts)\n\t\t\tCount += EnemyCount.Count;\n\t}\n\n\treturn Count;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoGameMode::OnPlayerRematerialize()\n{\n\tbPlayerRematerializedHandlersArrayBlock = true;\n\n\tfor (UObject* EventHandler : PlayerRematerializedHandlers)\n\t\tif (EventHandler != nullptr)\n\t\t\tISoEventHandler::Execute_HandlePlayerRematerialize(EventHandler);\n\n\tfor (UObject* EventHandler : PlayerRematerializedUnsubscribeRequests)\n\t\tPlayerRematerializedHandlers.RemoveSingleSwap(EventHandler);\n\tPlayerRematerializedUnsubscribeRequests.Empty();\n\n\tbPlayerRematerializedHandlersArrayBlock = false;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoGameMode::OnPlayerRespawn()\n{\n\tEnemyGroupActualValues = EnemyGroupInitData;\n\tDestroyedEnemies.Empty();\n\n\tbPlayerRespawnHandlersArrayBlock = true;\n\n\tfor (UObject* EventHandler : PlayerRespawnHandlers)\n\t\tif (EventHandler != nullptr)\n\t\t\tISoEventHandler::Execute_HandlePlayerRespawn(EventHandler);\n\n\tfor (UObject* EventHandler : PlayerRespawnUnsubscribeRequests)\n\t\tPlayerRespawnHandlers.RemoveSingleSwap(EventHandler);\n\tPlayerRespawnUnsubscribeRequests.Empty();\n\n\tbPlayerRespawnHandlersArrayBlock = false;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoGameMode::OnPlayerSplineChanged(const ASoSpline* OldSpline, const ASoSpline* NewSpline)\n{\n\tbSplineChangedNotificationsInProgress = true;\n\tfor (auto& Pair : SplineGroupChangedHandlers)\n\t{\n\t\tconst bool bWasIn = Pair.Value.Splines.Contains(OldSpline);\n\t\tconst bool bIsIn = Pair.Value.Splines.Contains(NewSpline);\n\t\tif (bWasIn != bIsIn)\n\t\t{\n\t\t\tif (bWasIn)\n\t\t\t\tISoEventHandler::Execute_HandleWhitelistedSplinesLeft(Pair.Key);\n\t\t\telse\n\t\t\t\tISoEventHandler::Execute_HandleWhitelistedSplinesEntered(Pair.Key);\n\t\t}\n\t}\n\tbSplineChangedNotificationsInProgress = false;\n}\n"
  },
  {
    "path": "Source/SOrb/Basic/SoGameMode.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#pragma once\n#include \"GameFramework/GameModeBase.h\"\n\n#include \"Delegates/DelegateCombinations.h\"\n#include \"Basic/SoConsoleCommands.h\"\n#include \"Effects/SoEffectBase.h\"\n\n#include \"SoGameMode.generated.h\"\n\nclass ASoEnemy;\nclass USoGameInstance;\nclass ASoCharacter;\nclass ASoSpline;\nclass FSoTimerManager;\nclass UDlgDialogue;\nclass USoInGameUIActivity;\n\nDECLARE_DYNAMIC_MULTICAST_DELEGATE_FourParams(FOnDialogueLineAdded, const UTexture2D*, Icon, bool, bLeftSide, const FText&, Text, float, Duration);\n\nDECLARE_DYNAMIC_MULTICAST_DELEGATE_FiveParams(FOnDisplayDamageText, const FVector&, WorldPosition, int32, Amount, bool, bPhysical, bool, bOnPlayer, bool, bCritical);\n\nDECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOnEnemyDied, ASoEnemy*, Enemy);\nDECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOnGroupDefeated, FName, GroupName);\n\nDECLARE_DYNAMIC_MULTICAST_DELEGATE(FSoGameStateChange);\n\nDECLARE_DYNAMIC_MULTICAST_DELEGATE_TwoParams(FOnDisplayText, const FVector&, WorldPosition, ESoDisplayText, DisplayText);\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUSTRUCT(BlueprintType)\nstruct FSoEnemyGroups\n{\n\tGENERATED_USTRUCT_BODY()\npublic:\n\n\tUPROPERTY()\n\tTMap<FName, int32> EnemyGroupMap;\n};\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUSTRUCT(BlueprintType)\nstruct FSoEnemyArray\n{\n\tGENERATED_USTRUCT_BODY()\npublic:\n\n\tUPROPERTY()\n\tTArray<ASoEnemy*> Enemies;\n};\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUSTRUCT(BlueprintType)\nstruct FSoEnemyCount\n{\n\tGENERATED_USTRUCT_BODY()\npublic:\n\n\tUPROPERTY(BlueprintReadWrite)\n\tTSubclassOf<ASoEnemy> Class;\n\n\tUPROPERTY(BlueprintReadWrite)\n\tint32 Count;\n\n\tUPROPERTY(BlueprintReadWrite)\n\tint32 PlacedInLevelCount;\n};\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUSTRUCT(BlueprintType)\nstruct FSoEnemyCounts\n{\n\tGENERATED_USTRUCT_BODY()\npublic:\n\n\tUPROPERTY(BlueprintReadWrite)\n\tTArray<FSoEnemyCount> Counts;\n};\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUSTRUCT(BlueprintType)\nstruct FSoSplineArray\n{\n\tGENERATED_USTRUCT_BODY()\npublic:\n\n\tUPROPERTY()\n\tTArray<ASoSpline*> Splines;\n};\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUSTRUCT(BlueprintType)\nstruct FSoFlyingEnemyPositionRules\n{\n\tGENERATED_USTRUCT_BODY()\npublic:\n\n\tUPROPERTY(EditAnywhere)\n\tTSubclassOf<ASoEnemy> FlyingEnemyClass;\n\n\tUPROPERTY(EditAnywhere)\n\tfloat MinDistance;\n\n\tUPROPERTY(EditAnywhere)\n\tfloat MaxCorrectionSpeed;\n};\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n/**\n * 1.) Loads camera data, ticks LevelManger\n * 2.) Has data for dialogue UI (monologues and wizard-player conversations), controls it via implementable events\n * 3.) handles Save/Load, fires PreSave, PostLoad events\n */\nUCLASS()\nclass SORB_API ASoGameMode : public AGameModeBase\n{\n\tGENERATED_BODY()\n\npublic:\n\tASoGameMode();\n\tvirtual ~ASoGameMode();\n\n\tUFUNCTION(BlueprintPure, DisplayName = \"Get So Game Mode\", meta = (WorldContext = \"WorldContextObject\"))\n\tstatic ASoGameMode* GetInstance(const UObject* WorldContextObject);\n\tstatic ASoGameMode& Get(const UObject* WorldContextObject)\n\t{\n\t\tcheck(IsValid(WorldContextObject));\n\t\tauto* Instance = GetInstance(WorldContextObject);\n\t\tcheck(IsValid(Instance));\n\t\treturn *Instance;\n\t}\n\n\t//\n\t// AGameModeBase interface\n\t//\n\n\tvoid StartPlay() override;\n\tvoid Tick(float DeltaSeconds) override;\n\tvoid EndPlay(const EEndPlayReason::Type EndPlayReason) override;\n\tbool AllowCheats(APlayerController* Controller) override;\n\n\n\t//\n\t// Own methods\n\t//\n\n\tvoid ReloadConsoleCommands() { ConsoleCommands.ReloadCommands(); }\n\n\tFSoTimerManager& GetTimerManager() const;\n\n\tUFUNCTION(BlueprintCallable, Category = EnemyGroup)\n\tvoid OnEnemyDestroyed(ASoEnemy* Enemy, FName Group, FVector WorldLocation);\n\n\tvoid IncreaseEnemyCountInGroup(FName Group, int32 Num);\n\n\tvoid RegisterEnemy(ASoEnemy* Enemy, FName Group);\n\tvoid UnregisterEnemy(ASoEnemy* Enemy, FName Group);\n\n\tconst TArray<ASoEnemy*>& GetEnemiesFromGroup(FName Group);\n\tFORCEINLINE const TArray<ASoEnemy*>& GetEnemies() { return Enemies; }\n\n\tUFUNCTION(BlueprintPure, Category = EnemyGroup)\n\tbool IsEnemyGroupStillActive(FName Group) const;\n\n\t/** Registers USoEventHandler implementers and notifies them on reload. One call is immediately fired to match the initial state*/\n\tvoid SubscribeToSoPostLoad(UObject* Object);\n\tvoid UnsubscribeFromSoPostLoad(UObject* Object);\n\n\t/** Registers USoEventHandler implementers and notifies them on player rematerialize. Check the interface for more information */\n\tvoid SubscribeToPlayerRematerialize(UObject* Object);\n\tvoid UnsubscribeFromPlayerRematerialize(UObject* Object);\n\n\t/** Registers USoEventHandler implementers and notifies them on player respawn. Check the interface for more information */\n\tvoid SubscribeToPlayerRespawn(UObject* Object);\n\tvoid UnsubscribeFromPlayerRespawn(UObject* Object);\n\n\t/**\n\t *  Registers USoEventHandler implementers and notifies them and handles area checks on player spline change.\n\t *  Registers USoEventHandler implementers and notifies them based on area checks on player spline change\n\t */\n\tvoid SubscribeWhitelistedSplines(UObject* Object, const TArray<TAssetPtr<ASoSpline>>& WhitelistedSplines);\n\tvoid UnsubscribeWhitelistedSplines(UObject* Object);\n\n\n\tvoid ResetGroupData() { EnemyGroupActualValues = EnemyGroupInitData; }\n\n\tvoid DisplayDamageText(const FVector& HitLocation, int32 DmgAmount, bool bPhysical, bool bOnPlayer, bool bCritical = false);\n\n\tUFUNCTION(BlueprintCallable)\n\tvoid DisplayText(const FVector& Location, ESoDisplayText DisplayText);\n\n\tUFUNCTION(BlueprintPure)\n\tTArray<FSoEnemyCount>& GetDestroyedEnemyCount(FName Group);\n\n\tUFUNCTION(BlueprintPure)\n\tint32 CalculateDestroyedEnemyCount(FName Group);\n\n\tUFUNCTION()\n\tvoid OnPlayerRematerialize();\n\n\tUFUNCTION()\n\tvoid OnPlayerRespawn();\n\n\tUFUNCTION()\n\tvoid OnPlayerSplineChanged(const ASoSpline* OldSpline, const ASoSpline* NewSpline);\n\n\tvoid OverrideGroupDefeatedDelay(FName GroupName, float OverrideTime);\n\n\tUFUNCTION()\n\tvoid OnGroupDestroyed();\n\n\tFORCEINLINE void TriggerPreSaveGame() { PreSaveGame(); }\n\tFORCEINLINE void TriggerPostLoadGame() { PostLoadGame(); }\n\n\tvoid ClearWizardDialogueAfterGroupDefeated() { WizardDialogueAfterGroupDefeated = nullptr; }\n\tASoCharacter* GetSoCharacter();\n\nprotected:\n\tvoid PreSaveGame() const;\n\tvoid PostLoadGame();\n\npublic:\n\tUPROPERTY(BlueprintAssignable)\n\tFOnDialogueLineAdded OnDialogueLineAdded;\n\n\tUPROPERTY(BlueprintAssignable)\n\tFOnDisplayDamageText OnDisplayDamageText;\n\n\tUPROPERTY(BlueprintAssignable)\n\tFOnDisplayText OnDisplayText;\n\n\tUPROPERTY(BlueprintAssignable)\n\tFOnEnemyDied OnEnemyDied;\n\n\tUPROPERTY(BlueprintAssignable)\n\tFOnGroupDefeated OnEnemyGroupDefeated;\n\n\t/** called before the world state is saved to disc */\n\tUPROPERTY(BlueprintAssignable)\n\tFSoGameStateChange OnPreSave;\n\n\t/** called after the world state is reloaded from disc */\n\tUPROPERTY(BlueprintAssignable)\n\tFSoGameStateChange OnPostLoad;\n\n\t/** Called after all BeginPlay() calls */\n\tUPROPERTY(BlueprintAssignable)\n\tFSoGameStateChange OnPostBeginPlay;\n\n\t/** List of actors implementing SoPostLoadHandler interface, alternative (BP friendly) way to handle reload */\n\tUPROPERTY()\n\tTArray<UObject*> PostLoadHandlers;\n\n\tUPROPERTY()\n\tTArray<UObject*> PlayerRematerializedHandlers;\n\n\tUPROPERTY()\n\tTArray<UObject*> PlayerRematerializedUnsubscribeRequests;\n\n\tUPROPERTY()\n\tTArray<UObject*> PlayerRespawnHandlers;\n\n\tUPROPERTY()\n\tTArray<UObject*> PlayerRespawnUnsubscribeRequests;\n\n\tUPROPERTY()\n\tTMap<UObject*, FSoSplineArray> SplineGroupChangedHandlers;\n\nprotected:\n\tFSoConsoleCommands ConsoleCommands;\n\n\tUPROPERTY(EditAnywhere)\n\tUTexture2D* WarriorbIcon = nullptr;\n\n\tUPROPERTY(EditAnywhere)\n\tUTexture2D* WizardIcon = nullptr;\n\n\t// Cached game instance\n\tUPROPERTY()\n\tUSoGameInstance* GameInstance = nullptr;\n\n\t// Cached Game Character\n\tUPROPERTY()\n\tASoCharacter* CachedSoCharacter = nullptr;\n\n\t/** used to stop the array from being modified while it is iterated */\n\tbool bPlayerRematerializedHandlersArrayBlock = false;\n\n\tbool bPlayerRespawnHandlersArrayBlock = false;\n\n\tFSoTimerManager* SoTimerManager = nullptr;\n\n\n\t/** Read from config, max member count for each enemy group */\n\tFSoEnemyGroups EnemyGroupInitData;\n\n\t/**\n\t *  Actual amount of not yet killed enemies. Once a group reaches 0 it won't respawn anymore.\n\t *  Reinitialized from EnemyGroupInitData each time the character rematerializes\n\t */\n\tFSoEnemyGroups EnemyGroupActualValues;\n\n\n\t/** Enemies are registered here per group */\n\tUPROPERTY(BlueprintReadOnly)\n\tTMap<FName, FSoEnemyArray> EnemiesAlive;\n\n\tUPROPERTY(BlueprintReadOnly)\n\tTArray<ASoEnemy*> Enemies;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadOnly)\n\tTMap<FName, float> EnemyGroupDefeatedDelayOverride;\n\n\tUPROPERTY(BlueprintReadOnly)\n\tFName LastDestroyedGroupName;\n\n\t/** Stores the destroyed enemy counts for the group defeated window */\n\tUPROPERTY(BlueprintReadOnly)\n\tTMap<FName, FSoEnemyCounts> DestroyedEnemies;\n\n\tFTimerHandle EnemyGroupDestroyedNotificationTimer;\n\n\tUPROPERTY(EditAnywhere)\n\tTSubclassOf<USoInGameUIActivity> GroupDestroyedUIClass;\n\n\tbool bSplineChangedNotificationsInProgress = false;\n\n\tUPROPERTY(EditAnywhere, Category = AIHelper)\n\tTArray<FSoFlyingEnemyPositionRules> FlyingEnemyPositionRules;\n\n\tbool bShouldEnterGroupDefeated = false;\n\n\tUPROPERTY(BlueprintReadWrite)\n\tUDlgDialogue* WizardDialogueAfterGroupDefeated = nullptr;\n\n\tfloat GroupDefeatedDelayOverride = -1.0f;\n};\n"
  },
  {
    "path": "Source/SOrb/Basic/SoGameSingleton.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#include \"SoGameSingleton.h\"\n\n#include \"EngineUtils.h\"\n#include \"Engine/Engine.h\"\n#include \"Engine/Texture2D.h\"\n#include \"Particles/ParticleSystem.h\"\n#include \"PhysicalMaterials/PhysicalMaterial.h\"\n\n#if WITH_EDITOR\n#include \"Editor.h\"\n#endif\n\n#if WARRIORB_WITH_VIDEO_DEMO\n#include \"MediaPlayer.h\"\n#include \"MediaTexture.h\"\n#include \"FileMediaSource.h\"\n#endif // WARRIORB_WITH_VIDEO_DEMO\n\n#include \"IO/DlgConfigParser.h\"\n\n#include \"FMODEvent.h\"\n#include \"FMODBus.h\"\n#include \"FMODVCA.h\"\n\n#include \"Basic/Helpers/SoStaticHelper.h\"\n#include \"Basic/Helpers/SoStringHelper.h\"\n#include \"Basic/SoGameMode.h\"\n#include \"Effects/SoEffectBase.h\"\n#include \"Settings/SoGameSettings.h\"\n#include \"Settings/Input/SoInputHelper.h\"\n#include \"SplineLogic/SoEditorGameInterface.h\"\n\n\nDEFINE_LOG_CATEGORY_STATIC(LogSoSingleton, All, All);\n\n// https://stackoverflow.com/questions/27490858/how-can-you-compare-two-character-strings-statically-at-compile-time/27491087#27491087\nconstexpr bool strings_equal(char const * a, char const * b) {\n\treturn *a == *b && (*a == '\\0' || strings_equal(a + 1, b + 1));\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUSoGameSingleton::USoGameSingleton(const FObjectInitializer& ObjectInitializer)\n{\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUSoGameSingleton::~USoGameSingleton()\n{\n}\n\n\n#if WITH_EDITOR\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoGameSingleton::PostEditChangeProperty(FPropertyChangedEvent& PropertyChangedEvent)\n{\n\tSuper::PostEditChangeProperty(PropertyChangedEvent);\n\n\tconst FName PropertyName = PropertyChangedEvent.Property != nullptr ? PropertyChangedEvent.Property->GetFName() : NAME_None;\n\tconst FName MemberPropertyName = PropertyChangedEvent.MemberProperty != nullptr ? PropertyChangedEvent.MemberProperty->GetFName() : NAME_None;\n\n\t// Regenerate DependentLevelMap\n\t// if (PropertyName == GET_MEMBER_NAME_CHECKED(ThisClass, DependentLevels))\n\t// {\n\t// \tDependentLevelMap.Empty();\n\t//\n\t// \tfor (FSoDependentLevelDesc& DependentDesc : DependentLevels)\n\t// \t{\n\t// \t\t// Key\n\t// \t\tconst FName Name = FName(*DependentDesc.Level.GetAssetName());\n\t//\n\t// \t\t// Value\n\t// \t\tTArray<FName> List;\n\t// \t\tfor (const FSoftObjectPath& Ref : DependentDesc.ClaimedLevels)\n\t// \t\t\tif (Ref.IsValid())\n\t// \t\t\t\tList.Add(FName(*Ref.GetAssetName()));\n\t//\n\t// \t\tif (DependentLevelMap.Contains(Name))\n\t// \t\t\tDependentDesc.Level = FSoftObjectPath(\"\");\n\t// \t\telse\n\t// \t\t\tDependentLevelMap.Add(Name, FSoDependentLevels{ List });\n\t// \t}\n\t// }\n\n\tif (PropertyName == GET_MEMBER_NAME_CHECKED(ThisClass, InputKeyboardTexturesMap))\n\t\tUpdateRuntimeInputKeyboardTextureMap();\n\n\tif (PropertyName == GET_MEMBER_NAME_CHECKED(ThisClass, InputGamepadTexturesMap))\n\t\tUpdateRuntimeInputGamepadTextureMap();\n\n\tUpdateEnemyData();\n}\n#endif // WITH_EDITOR\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoGameSingleton::PostInitProperties()\n{\n\tSuper::PostInitProperties();\n\n\tif (!HasAnyFlags(RF_ClassDefaultObject | RF_NeedLoad))\n\t{\n\t\tUE_LOG(LogSoSingleton, Log, TEXT(\"PostInitProperties: UpdateRuntimeData\"));\n\t\tUpdateRuntimeTextData();\n\t\tUpdateRuntimeStreamData();\n\t\tUpdateRuntimeInputKeyboardTextureMap();\n\t\tUpdateRuntimeInputGamepadTextureMap();\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUSoGameSingleton* USoGameSingleton::GetInstance()\n{\n\tif (!GEngine)\n\t\treturn nullptr;\n\n\tUSoGameSingleton* Instance = Cast<USoGameSingleton>(GEngine->GameSingleton);\n#if WITH_EDITOR\n\tif (Instance == nullptr)\n\t{\n\t\tUE_LOG(LogSoSingleton, Error, TEXT(\"Set the game singleton class to USoGameSingleton in \\\n\t\t\t\t\t\t\t\t\t\t\tProject Settings->Engine->General(Show advanced stuff has to be checked\"));\n\t}\n#endif // WITH_EDITOR\n\n\treturn Instance;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// const FSoDependentLevels* USoGameSingleton::GetDependentLevels(FName ClaimedLevelName)\n// {\n// \tconst USoGameSingleton* Singleton = GetInstance();\n// \tif (!Singleton)\n// \t\treturn nullptr;\n//\n// \treturn Singleton->DependentLevelMap.Find(ClaimedLevelName);\n// }\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFName USoGameSingleton::GetDefaultSkyPresetFromSplineName(const FString& SplineName, bool bStartSide)\n{\n\tFString PreTag = \"\";\n\tif (!bStartSide && SplineName.Len() > 6 && SplineName.Mid(2, 2).Equals(\"To\"))\n\t\tPreTag = SplineName.Mid(4, 2);\n\telse\n\t\tPreTag = SplineName.Left(2);\n\n\tconst FSoLevelParams* DataPtr = Get().LevelDataForTags.Find(PreTag);\n\tif (DataPtr != nullptr)\n\t\treturn DataPtr->SkyPresetName;\n\n\treturn NAME_None;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFText USoGameSingleton::GetTextForInputActionName(const FName ActionName)\n{\n\tif (ActionName != NAME_None)\n\t\treturn FSoInputActionName::GetTextForActionName(ActionName);\n\n\treturn FText::GetEmpty();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFText USoGameSingleton::GetTextForInputActionNameType(ESoInputActionNameType ActionNameType)\n{\n\tconst FName ActionName = FSoInputActionName::ActionNameTypeToActionName(ActionNameType);\n\treturn GetTextForInputActionName(ActionName);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUTexture2D* USoGameSingleton::GetIconForUICommand(ESoUICommand Command, ESoInputDeviceType DeviceType, const FSoInputUICommandPriorities& Priority)\n{\n\tUTexture2D* FoundIcon = nullptr;\n\tconst auto& GameSettings = USoGameSettings::Get();\n\tconst FName ActionName = FSoInputActionName::UICommandToActionName(Command);\n\tif (ActionName != NAME_None)\n\t{\n\t\t// Query input settings to find out the key used\n\t\tif (DeviceType == ESoInputDeviceType::Keyboard)\n\t\t{\n\t\t\t// keyboard\n\t\t\tconst TArray<FInputActionKeyMapping> ActionMappings = GameSettings.GetKeyboardInputActionMappingsForActionName(ActionName, false);\n\t\t\tconst int32 ActionIndex = ActionMappings.IsValidIndex(Priority.KeyboardPriority) ? Priority.KeyboardPriority : 0;\n\n\t\t\tif (ActionMappings.IsValidIndex(ActionIndex))\n\t\t\t{\n\t\t\t\tconst FInputActionKeyMapping KeyMapping = ActionMappings[ActionIndex];\n\t\t\t\tFSoInputKeyboardKeyTextures Textures;\n\t\t\t\tif (GetKeyboardKeyTexturesFromInputActionKeyMapping(KeyMapping, Textures))\n\t\t\t\t\tFoundIcon = Textures.GetTexture(true);\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// gamepad\n\t\t\tconst TArray<FInputActionKeyMapping> ActionMappings = GameSettings.GetGamepadInputActionMappingsForActionName(ActionName, false);\n\t\t\tconst int32 ActionIndex = ActionMappings.IsValidIndex(Priority.GamepadPriority) ? Priority.GamepadPriority : 0;\n\n\t\t\tif (ActionMappings.IsValidIndex(ActionIndex))\n\t\t\t{\n\t\t\t\tconst FInputActionKeyMapping KeyMapping = ActionMappings[ActionIndex];\n\t\t\t\tFSoInputGamepadKeyTextures Textures;\n\t\t\t\tif (GetGamepadKeyTexturesFromInputActionKeyMapping(KeyMapping, false, Textures))\n\t\t\t\t\tFoundIcon = Textures.GetTextureForDeviceType(DeviceType);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn FoundIcon != nullptr ? FoundIcon : Get().InputInvalidIconPtr.Get();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUTexture2D* USoGameSingleton::GetIconForInputActionNameType(ESoInputActionNameType ActionNameType, ESoInputDeviceType DeviceType, bool bPressed)\n{\n\tconst FName ActionName = FSoInputActionName::ActionNameTypeToActionName(ActionNameType);\n\tif (ActionName == NAME_None)\n\t{\n\t\tUE_LOG(LogSoSingleton,\n\t\t\tError,\n\t\t\tTEXT(\"GetIconForInputActionNameType could not get ActionName != NAME_None and valid GameSettings for ActionNameType = %d\"),\n\t\t\tstatic_cast<int32>(ActionNameType));\n\t}\n\n\treturn GetIconForInputActionName(ActionName, DeviceType, bPressed);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUTexture2D* USoGameSingleton::GetIconForInputActionName(FName ActionName, ESoInputDeviceType DeviceType, bool bPressed)\n{\n\tUTexture2D* FoundIcon = nullptr;\n\tconst auto& GameSettings = USoGameSettings::Get();\n\n\t// Query input settings to find out the key used\n\tif (ActionName != NAME_None)\n\t{\n\t\tFInputActionKeyMapping KeyMapping;\n\t\tif (DeviceType == ESoInputDeviceType::Keyboard)\n\t\t{\n\t\t\t// keyboard\n\t\t\tconst TArray<FInputActionKeyMapping> ActionMappings = GameSettings.GetKeyboardInputActionMappingsForActionName(ActionName, false);\n\t\t\tif (USoInputHelper::GetFirstInputActionKeyMapping(ActionMappings, KeyMapping))\n\t\t\t{\n\t\t\t\tFSoInputKeyboardKeyTextures Textures;\n\t\t\t\tif (GetKeyboardKeyTexturesFromInputActionKeyMapping(KeyMapping, Textures))\n\t\t\t\t\tFoundIcon = Textures.GetTexture(bPressed);\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// gamepad\n\t\t\tconst TArray<FInputActionKeyMapping> ActionMappings = GameSettings.GetGamepadInputActionMappingsForActionName(ActionName, false);\n\t\t\tif (USoInputHelper::GetFirstInputActionKeyMapping(ActionMappings, KeyMapping))\n\t\t\t{\n\t\t\t\tFSoInputGamepadKeyTextures Textures;\n\t\t\t\tif (GetGamepadKeyTexturesFromInputActionKeyMapping(KeyMapping, bPressed, Textures))\n\t\t\t\t\tFoundIcon = Textures.GetTextureForDeviceType(DeviceType);\n\t\t\t}\n\t\t}\n\t}\n\n\tif (FoundIcon == nullptr)\n\t{\n\t\tUE_LOG(LogSoSingleton,\n\t\t\tWarning,\n\t\t\tTEXT(\"GetIconForInputActionNameType could not find a valid icon for ActionName = `%s` and DeviceType = %d\"),\n\t\t\t*ActionName.ToString(), static_cast<int32>(DeviceType));\n\t\treturn Get().InputInvalidIconPtr.Get();\n\t}\n\n\treturn FoundIcon;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUTexture2D* USoGameSingleton::GetIconForInputKey(FKey Key, ESoInputDeviceType DeviceType, bool bPressed)\n{\n\tif (!Key.IsValid())\n\t\treturn nullptr;\n\n\treturn GetIconForInputKeyName(Key.GetFName(), DeviceType, bPressed);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUTexture2D* USoGameSingleton::GetIconForInputKeyName(FName KeyName, ESoInputDeviceType DeviceType, bool bPressed)\n{\n\tUTexture2D* FoundIcon = nullptr;\n\tif (KeyName != NAME_None)\n\t{\n\t\tif (DeviceType == ESoInputDeviceType::Keyboard)\n\t\t{\n\t\t\t// keyboard\n\t\t\tFSoInputKeyboardKeyTextures Textures;\n\t\t\tif (GetKeyboardKeyTexturesFromKeyName(KeyName, Textures))\n\t\t\t\tFoundIcon = Textures.GetTexture(bPressed);\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// gamepad\n\t\t\tFSoInputGamepadKeyTextures Textures;\n\t\t\tif (GetGamepadKeyTexturesFromKeyName(KeyName, bPressed, Textures))\n\t\t\t\tFoundIcon = Textures.GetTextureForDeviceType(DeviceType);\n\t\t}\n\t}\n\n\treturn FoundIcon;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUTexture2D* USoGameSingleton::GetIconForDamageType(ESoDmgType DamageType)\n{\n\tconst auto& Singleton = Get();\n\treturn Singleton.DamageTypesTexturesMapPtr.Contains(DamageType) ? Singleton.DamageTypesTexturesMapPtr.Find(DamageType)->Get() : nullptr;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoGameSingleton::GetKeyboardKeyTexturesFromKeyName(FName KeyName, FSoInputKeyboardKeyTextures& OutTextures)\n{\n\tif (const FSoInputKeyboardKeyTextures* Textures = Get().InputKeyboardTexturesMap.Find(KeyName))\n\t{\n\t\tOutTextures = *Textures;\n\t\treturn true;\n\t}\n\treturn false;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoGameSingleton::GetGamepadKeyTexturesFromKeyName(FName KeyName, bool bSpecialHighlight, FSoInputGamepadKeyTextures& OutTexture)\n{\n\tconst auto& Singleton = Get();\n\n\t// Highlight\n\tif (bSpecialHighlight)\n\t{\n\t\tif (const FSoInputGamepadKeyTextures * Texture = Singleton.HighlightedGamepadTexturesMap.Find(KeyName))\n\t\t{\n\t\t\tOutTexture = *Texture;\n\t\t\treturn true;\n\t\t}\n\t}\n\n\t// Normal\n\tif (const FSoInputGamepadKeyTextures * Texture = Singleton.InputGamepadTexturesMap.Find(KeyName))\n\t{\n\t\tOutTexture = *Texture;\n\t\treturn true;\n\t}\n\n\treturn false;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoGameSingleton::GetEnemyGroupDescription(const UObject* WorldContextObject, FName InName, FSoEnemyGroupDesc& OutDesc)\n{\n\tif (WorldContextObject == nullptr)\n\t\treturn false;\n\n\tconst auto& Singleton = Get();\n\tconst FName MapName = WorldContextObject->GetWorld()->GetFName();\n\tconst FSoEnemyGroupDescList* CurrentMapDescriptions = Singleton.EnemiesDescriptionPerMap.Find(MapName);\n\tif (CurrentMapDescriptions == nullptr)\n\t\treturn false;\n\n\tconst FSoEnemyGroupDesc* GroupDescription = CurrentMapDescriptions->GroupDefeatedTexts.Find(InName);\n\tif (GroupDescription == nullptr)\n\t\treturn false;\n\n\tOutDesc = *GroupDescription;\n\treturn true;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nconst FLinearColor& USoGameSingleton::GetColorForDamageType(ESoDmgType DmgType, bool bAgainstEnemy)\n{\n\tconst auto& Singleton = Get();\n\tif (bAgainstEnemy)\n\t{\n\t\tif (DmgType == ESoDmgType::Physical)\n\t\t\treturn Singleton.DamageColorPhysical;\n\n\t\treturn Singleton.DamageColorMagic;\n\t}\n\n\tconst FLinearColor* Color = Singleton.DamageTypeColors.Find(DmgType);\n\tif (Color != nullptr)\n\t\treturn *Color;\n\n\treturn FLinearColor::White;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nconst FLinearColor& USoGameSingleton::GetColorForItemRarity(int32 RarityValue)\n{\n\tconst auto& Singleton = Get();\n\tif (Singleton.ItemRarityColors.IsValidIndex(RarityValue))\n\t\treturn Singleton.ItemRarityColors[RarityValue];\n\n\treturn FLinearColor::White;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUTexture2D* USoGameSingleton::GetBackgroundIconForItemType(ESoItemType ItemType)\n{\n\tconst auto& Singleton = Get();\n\tif (Singleton.ItemBackgroundColorsMapPtr.Contains(ItemType))\n\t\treturn Singleton.ItemBackgroundColorsMapPtr.Find(ItemType)->Get();\n\n\treturn nullptr;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUFMODEvent* USoGameSingleton::GetSFX(ESoSFX SFX)\n{\n\tconst auto& Singleton = Get();\n\tif (Singleton.SFXMapPtr.Contains(SFX))\n\t\treturn Singleton.SFXMapPtr.Find(SFX)->Get();\n\n\tUE_LOG(LogSoSingleton, Warning, TEXT(\"GetSFX: SFX = %s does not exist\"), *USoStringHelper::SFXToString(SFX));\n\treturn nullptr;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nconst FText& USoGameSingleton::GetEnemyVoiceText(UFMODEvent* Voice)\n{\n\tfor (const FSoVoiceEntryRandomText& Entry : Get().VoiceTextsArrayRandom)\n\t\tif (Entry.EventPtr == Voice && Entry.Texts.Num() > 0)\n\t\t{\n\t\t\treturn Entry.Texts[FMath::RandHelper(Entry.Texts.Num())];\n\t\t}\n\n\tfor (const FSoVoiceEntry& Entry : Get().VoiceTextsArray)\n\t\tif (Entry.EventPtr == Voice)\n\t\t\treturn Entry.Text;\n\n\treturn FText::GetEmpty();\n}\n\n//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUFMODEvent* USoGameSingleton::GetWallHitSFXFromPhysicalMaterial(UPhysicalMaterial* PhysicalMaterial)\n{\n\tconst auto& Singleton = Get();\n\tif (Singleton.WallHitSFXMapPtr.Contains(PhysicalMaterial))\n\t\treturn Singleton.WallHitSFXMapPtr.Find(PhysicalMaterial)->Get();\n\n\treturn Singleton.WallHitSFXInvalidPtr.Get();\n}\n\n//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUParticleSystem* USoGameSingleton::GetWallHitVFXFromPhysicalMaterial(UPhysicalMaterial* PhysicalMaterial)\n{\n\tconst auto& Singleton = Get();\n\tif (Singleton.WallHitVFXMapPtr.Contains(PhysicalMaterial))\n\t\treturn Singleton.WallHitVFXMapPtr.Find(PhysicalMaterial)->Get();\n\n\treturn Singleton.WallHitVFXInvalidPtr.Get();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoGameSingleton::UpdateRuntimeTextData()\n{\n#define LOCTEXT_NAMESPACE \"ItemsCommon\"\n\tItemTypeTexts.SetNum(static_cast<int32>(ESoItemType::EIT_MAX) + 1);\n\tItemTypeTexts[static_cast<int32>(ESoItemType::EIT_Shard)] = LOCTEXT(\"shard\", \"Shard\");\n\tItemTypeTexts[static_cast<int32>(ESoItemType::EIT_UsableItem)] = LOCTEXT(\"usable\", \"Usable\");\n\tItemTypeTexts[static_cast<int32>(ESoItemType::EIT_QuestItem)] = LOCTEXT(\"QuestItem\", \"Quest Item\");\n\tItemTypeTexts[static_cast<int32>(ESoItemType::EIT_MemoryStone)] = LOCTEXT(\"MemoryStone\", \"Memory Stone\");\n\tItemTypeTexts[static_cast<int32>(ESoItemType::EIT_Key)] = LOCTEXT(\"key\", \"Key\");\n\tItemTypeTexts[static_cast<int32>(ESoItemType::EIT_RuneStone)] = LOCTEXT(\"RuneStone\", \"Runestone\");\n\tItemTypeTexts[static_cast<int32>(ESoItemType::EIT_Weapon)] = LOCTEXT(\"weapon\", \"Weapon\");\n\tItemTypeTexts[static_cast<int32>(ESoItemType::EIT_Jewelry)] = LOCTEXT(\"jewelry\", \"Valuable\");\n\n\tShardTypeTexts.SetNum(static_cast<int32>(ESoShardType::NumOf) + 1);\n\tShardTypeTexts[static_cast<int32>(ESoShardType::Defensive)] = LOCTEXT(\"defensive\", \"Shard of Protection\");\n\tShardTypeTexts[static_cast<int32>(ESoShardType::Offensive)] = LOCTEXT(\"offensive\", \"Shard of Justice\");\n\tShardTypeTexts[static_cast<int32>(ESoShardType::Special)] = LOCTEXT(\"special\", \"Shard of Wonder\");\n\tShardTypeTexts[static_cast<int32>(ESoShardType::NumOf)] = LOCTEXT(\"invalid_shard_max\", \"Invalid\");\n\n\tWeaponTypeTexts.SetNum(static_cast<int32>(ESoWeaponType::EWT_MAX) + 1);\n\tWeaponTypeTexts[static_cast<int32>(ESoWeaponType::EWT_OneHanded)] = LOCTEXT(\"onehanded\", \"One-Handed Weapon\");\n\tWeaponTypeTexts[static_cast<int32>(ESoWeaponType::EWT_TwoHanded)] = LOCTEXT(\"twohanded\", \"Two-Handed Weapon\");\n\tWeaponTypeTexts[static_cast<int32>(ESoWeaponType::EWT_DualWield)] = LOCTEXT(\"dualwield\", \"Dual Wield Weapon\");\n\tWeaponTypeTexts[static_cast<int32>(ESoWeaponType::EWT_MAX)] = LOCTEXT(\"invalid_weapon_max\", \"Invalid Weapon\");\n\n\tUsableTypeTexts.SetNum(static_cast<int32>(ESoUsableItemType::EUIT_MAX) + 1);\n\tUsableTypeTexts[static_cast<int32>(ESoUsableItemType::EUIT_Potion)] = LOCTEXT(\"potion\", \"Something to drink\");\n\tUsableTypeTexts[static_cast<int32>(ESoUsableItemType::EUIT_Throwable)] = LOCTEXT(\"throwable\", \"Something to throw\");\n\tUsableTypeTexts[static_cast<int32>(ESoUsableItemType::EUIT_Spell)] = LOCTEXT(\"spell\", \"Something to cast with\");\n\tUsableTypeTexts[static_cast<int32>(ESoUsableItemType::EUIT_Crossbow)] = LOCTEXT(\"crossbow\", \"Something to shoot with\");\n\n\tQuestItemTypeTexts.SetNum(static_cast<int32>(ESoQuestItemType::EQIT_MAX) + 1);\n\tQuestItemTypeTexts[static_cast<int32>(ESoQuestItemType::EQIT_Key)] = LOCTEXT(\"something_unlock\", \"Something to unlock with\");\n\tQuestItemTypeTexts[static_cast<int32>(ESoQuestItemType::EQIT_KeyLikeItem)] = LOCTEXT(\"keylikeitem\", \"Something interesting\");\n\tQuestItemTypeTexts[static_cast<int32>(ESoQuestItemType::EQIT_Item)] = LOCTEXT(\"item\", \"Something interesting\");\n\tQuestItemTypeTexts[static_cast<int32>(ESoQuestItemType::EQIT_MemoryStone)] = LOCTEXT(\"MemoryStone\", \"Memory Stone\");\n\tQuestItemTypeTexts[static_cast<int32>(ESoQuestItemType::EQIT_Book)] = LOCTEXT(\"book\", \"Something to read\");\n\n\tItemParamTexts.SetNum(static_cast<int32>(ESoItemParam::EIP_MAX) + 1);\n\tItemParamTexts[static_cast<int32>(ESoItemParam::EIP_AttackSpeed)] = LOCTEXT(\"speed\", \"Attack Speed\");\n\tItemParamTexts[static_cast<int32>(ESoItemParam::EIP_Health)] = LOCTEXT(\"health\", \"Health\");\n\tItemParamTexts[static_cast<int32>(ESoItemParam::EIP_SpellCapacityCost)] = LOCTEXT(\"spellcapacitycost\", \"Capacity Cost\");\n\tItemParamTexts[static_cast<int32>(ESoItemParam::EIP_SpellUsageCount)] = LOCTEXT(\"spellusagecount\", \"Charge\");\n\tItemParamTexts[static_cast<int32>(ESoItemParam::EIP_Cooldown)] = LOCTEXT(\"cooldown\", \"Cooldown\");\n#undef LOCTEXT_NAMESPACE\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoGameSingleton::UpdateEnemyDataForCurrentMap()\n{\n#if WITH_EDITOR\n\tif (GEditor == nullptr)\n\t\treturn;\n\n\tconst FString Path = FSoEditorGameInterface::GetEnemyGroupDataConfigPath(GEditor->GetEditorWorldContext().World());\n\tif (!FPaths::FileExists(Path))\n\t{\n\t\treturn;\n\t}\n\n\t// Read config for current map\n\tFSoEnemyGroups GroupData;\n\tFDlgConfigParser ConfigParser(\"So\");\n\tConfigParser.InitializeParser(Path);\n\tConfigParser.ReadAllProperty(FSoEnemyGroups::StaticStruct(), &GroupData);\n\n\tconst FName MapName = GEditor->GetEditorWorldContext().World()->GetFName();\n\tFSoEnemyGroupDescList* CurrentMapDescriptions = EnemiesDescriptionPerMap.Find(MapName);\n\tif (CurrentMapDescriptions == nullptr)\n\t\tCurrentMapDescriptions = &EnemiesDescriptionPerMap.Add(MapName);\n\n\t// 1. Iterate through enemy groups, add missing entries or move them back from trash\n\tfor (const auto& Pair : GroupData.EnemyGroupMap)\n\t{\n\t\tconst FName EnemyGroupName = Pair.Key;\n\n\t\t// Already contains the group name, continue\n\t\tif (CurrentMapDescriptions->GroupDefeatedTexts.Contains(EnemyGroupName))\n\t\t\tcontinue;\n\n\t\t// Does not contains the Group Name\n\t\tauto* Unmatched = CurrentMapDescriptions->GroupDefeatedTexts_Unmatched.Find(EnemyGroupName);\n\t\tif (Unmatched != nullptr)\n\t\t{\n\t\t\t// Has an unmatched text, copy it to to the matched ones and delete it from unmatched\n\t\t\tCurrentMapDescriptions->GroupDefeatedTexts.Add(Pair.Key, *Unmatched);\n\t\t\tCurrentMapDescriptions->GroupDefeatedTexts_Unmatched.Remove(EnemyGroupName);\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// Add it to matched\n\t\t\tCurrentMapDescriptions->GroupDefeatedTexts.Add(EnemyGroupName);\n\t\t}\n\t}\n\n\t// 2. Iterate through data, move obsolete entries to trash, update text namespaces and keys\n\tTArray<FName> NamesToRemove;\n\tfor (auto& Pair : CurrentMapDescriptions->GroupDefeatedTexts)\n\t{\n\t\tauto* EnemyNumPtr = GroupData.EnemyGroupMap.Find(Pair.Key);\n\t\tif (EnemyNumPtr == nullptr)\n\t\t{\n\t\t\tCurrentMapDescriptions->GroupDefeatedTexts_Unmatched.Add(Pair.Key, Pair.Value);\n\t\t\tNamesToRemove.Add(Pair.Key);\n\t\t}\n\t}\n\tfor (auto Name : NamesToRemove)\n\t\tCurrentMapDescriptions->GroupDefeatedTexts.Remove(Name);\n\n#endif // WITH_EDITOR\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoGameSingleton::UpdateEnemyData()\n{\n\tUpdateEnemyDataForCurrentMap();\n\tstatic const FString TextNamespace(TEXT(\"EnemyGroupData\"));\n\n\t// Update Namespace and key\n\tfor (auto& MapKeyValue : EnemiesDescriptionPerMap)\n\t{\n\t\tconst FName MapName = MapKeyValue.Key;\n\t\tFSoEnemyGroupDescList& Descriptions =  MapKeyValue.Value;\n\t\tfor (auto& GroupKeyValue : Descriptions.GroupDefeatedTexts)\n\t\t{\n\t\t\tconst FName GroupName = GroupKeyValue.Key;\n\t\t\tauto& GroupDescription = GroupKeyValue.Value;\n\t\t\tGroupDescription.DisplayName = FInternationalization::ForUseOnlyByLocMacroAndGraphNodeTextLiterals_CreateText(\n\t\t\t\t*GroupDescription.DisplayName.ToString(),\n\t\t\t\t*TextNamespace,\n\t\t\t\t*(MapName.ToString() + \"_\" + GroupName.ToString()  + \"_name\")\n\t\t\t);\n\t\t\tGroupDescription.Description = FInternationalization::ForUseOnlyByLocMacroAndGraphNodeTextLiterals_CreateText(\n\t\t\t\t*GroupDescription.Description.ToString(),\n\t\t\t\t*TextNamespace,\n\t\t\t\t*(MapName.ToString() + \"_\" + GroupName.ToString()  + \"_desc\")\n\t\t\t);\n\t\t}\n\n\t\t// Make the unmatched texts unlocalizable\n\t\tfor (auto& GroupKeyValue : Descriptions.GroupDefeatedTexts_Unmatched)\n\t\t{\n\t\t\tauto& GroupDescription = GroupKeyValue.Value;\n\t\t\tGroupDescription.DisplayName = FText::AsCultureInvariant(GroupDescription.DisplayName);\n\t\t\tGroupDescription.Description = FText::AsCultureInvariant(GroupDescription.Description);\n\t\t}\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoGameSingleton::UpdateRuntimeStreamData()\n{\n\t// Load the values from the reference into something that is garbage collected\n\t// References:\n\t// - https://jdelezenne.github.io/Codex/UE4/Assets%20Streaming.html\n\t// - https://docs.unrealengine.com/en-US/Programming/Assets/AsyncLoading/index.html\n\tPersistentObjects.Empty();\n\n\t// NOTE: could bManageActiveHandle = True and keep the handles alive instead of keeping the UObject :thinking:\n\n\t// LevelsWeatherVFXArray\n\t{\n\t\tTArray<FSoftObjectPath> ObjectPathsToStream;\n\t\tfor (const auto& Value : LevelsWeatherVFXArray)\n\t\t{\n\t\t\tObjectPathsToStream.Add(Value.ParticlesPtr.ToSoftObjectPath());\n\t\t}\n\t\tStreamableManager.RequestAsyncLoad(ObjectPathsToStream, [this]()\n\t\t{\n\t\t\tfor (const auto& Value : LevelsWeatherVFXArray)\n\t\t\t{\n\t\t\t\tAddToPersistentObjects(Value.ParticlesPtr.Get());\n\t\t\t}\n\t\t});\n\t}\n\n\tRequestAsyncLoadMapValues(ItemBackgroundColorsMapPtr);\n\tRequestAsyncLoadMapValues(DamageTypesTexturesMapPtr);\n\tRequestAsyncLoadValue(InputInvalidIconPtr);\n\n\t//\n\t// SFX & Audio\n\t//\n\n\t// SFXMapPtr\n\tRequestAsyncLoadMapValues(SFXMapPtr);\n\n\t// VoiceTextsArray\n\t{\n\t\tTArray<FSoftObjectPath> ObjectPathsToStream;\n\t\tfor (const auto& Value : VoiceTextsArray)\n\t\t{\n\t\t\tObjectPathsToStream.Add(Value.EventPtr.ToSoftObjectPath());\n\t\t}\n\t\tStreamableManager.RequestAsyncLoad(ObjectPathsToStream, [this]()\n\t\t{\n\t\t\tfor (const auto& Value : VoiceTextsArray)\n\t\t\t{\n\t\t\t\tif (Value.EventPtr.Get() != nullptr)\n\t\t\t\t\tAddToPersistentObjects(Value.EventPtr.Get());\n\t\t\t\telse\n\t\t\t\t\tUE_LOG(LogSoSingleton, Error, TEXT(\"Invalid Object in USoGameSingleton::VoiceTextsArray\"));\n\t\t\t}\n\t\t});\n\t}\n\tRequestAsyncLoadValue(WallHitSFXInvalidPtr);\n\tRequestAsyncLoadMapKeysAndValues(WallHitSFXMapPtr);\n\tRequestAsyncLoadValue(MenuMusicPtr);\n\tRequestAsyncLoadValue(LoadingMusicPtr);\n\tRequestAsyncLoadValue(VCA_MasterPtr);\n\tRequestAsyncLoadValue(VCA_SFXPtr);\n\tRequestAsyncLoadValue(VCA_UIPtr);\n\tRequestAsyncLoadValue(VCA_MusicPtr);\n\tRequestAsyncLoadValue(VCA_MutePtr);\n\tRequestAsyncLoadArray(MenuBusesToPauseArrayPtr);\n\tRequestAsyncLoadArray(BusesToIgnoreForSpeedChangeArrayPtr);\n\n\t// VCA_Menu and VCA_AmbientDialogue\n\tVCA_BlendArray.SetNum(2);\n\tVCA_BlendArray[0] = &VCA_Menu;\n\tVCA_BlendArray[1] = &VCA_AmbientDialogue;\n\t{\n\t\tTArray<FSoftObjectPath> ObjectPathsToStream;\n\t\tfor (const auto& Value : VCA_BlendArray)\n\t\t{\n\t\t\tObjectPathsToStream.Add(Value->VCAPtr.ToSoftObjectPath());\n\t\t}\n\t\tStreamableManager.RequestAsyncLoad(ObjectPathsToStream, [this]()\n\t\t{\n\t\t\tfor (const auto& Value : VCA_BlendArray)\n\t\t\t{\n\t\t\t\tAddToPersistentObjects(Value->VCAPtr.Get());\n\t\t\t}\n\t\t});\n\t}\n\n\t//\n\t// WallHit\n\t//\n\n\tRequestAsyncLoadValue(WallHitVFXInvalidPtr);\n\tRequestAsyncLoadMapKeysAndValues(WallHitVFXMapPtr);\n\n\t//\n\t// Media player\n\t//\n\n#if WARRIORB_WITH_VIDEO_DEMO\n\tRequestAsyncLoadValue(DemoMediaSourcePtr);\n\tRequestAsyncLoadValue(VideoMediaPlayerPtr);\n\tRequestAsyncLoadValue(VideoMediaTexturePtr);\n#endif // WARRIORB_WITH_VIDEO_DEMO\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\ntemplate <typename ValueType>\nvoid USoGameSingleton::RequestAsyncLoadValue(const TSoftObjectPtr<ValueType>& Value)\n{\n\tconst FSoftObjectPath ValuePath = Value.ToSoftObjectPath();\n\tif (!ValuePath.IsValid())\n\t\treturn;\n\n\tStreamableManager.RequestAsyncLoad(ValuePath, [this, ValuePath]()\n\t{\n\t\tAddToPersistentObjects(ValuePath.ResolveObject());\n\t});\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\ntemplate <typename ValueType>\nvoid USoGameSingleton::RequestAsyncLoadArray(const TArray<TSoftObjectPtr<ValueType>>& Array)\n{\n\tTArray<FSoftObjectPath> ObjectPathsToStream;\n\tfor (const auto& Value : Array)\n\t{\n\t\tconst FSoftObjectPath ValuePath = Value.ToSoftObjectPath();\n\t\tif (ValuePath.IsValid())\n\t\t\tObjectPathsToStream.Add(ValuePath);\n\t}\n\tStreamableManager.RequestAsyncLoad(ObjectPathsToStream, [this, ObjectPathsToStream]()\n\t{\n\t\tfor (const auto& Path : ObjectPathsToStream)\n\t\t{\n\t\t\tAddToPersistentObjects(Path.ResolveObject());\n\t\t}\n\t});\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\ntemplate <typename KeyType, typename ValueType>\nvoid USoGameSingleton::RequestAsyncLoadMapValues(const TMap<KeyType, TSoftObjectPtr<ValueType>>& Map)\n{\n\tTArray<FSoftObjectPath> ObjectPathsToStream;\n\tfor (const auto& KeyValue : Map)\n\t{\n\t\tconst FSoftObjectPath ValuePath = KeyValue.Value.ToSoftObjectPath();\n\t\tif (ValuePath.IsValid())\n\t\t\tObjectPathsToStream.Add(ValuePath);\n\t}\n\n\tStreamableManager.RequestAsyncLoad(ObjectPathsToStream, [this, ObjectPathsToStream]()\n\t{\n\t\tfor (const auto& Path : ObjectPathsToStream)\n\t\t{\n\t\t\tAddToPersistentObjects(Path.ResolveObject());\n\t\t}\n\t});\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\ntemplate <typename KeyType, typename ValueType>\nvoid USoGameSingleton::RequestAsyncLoadMapKeysAndValues(const TMap<TSoftObjectPtr<KeyType>, TSoftObjectPtr<ValueType>>& Map)\n{\n\tTArray<FSoftObjectPath> ObjectPathsToStream;\n\tfor (const auto& KeyValue : Map)\n\t{\n\t\tconst FSoftObjectPath KeyPath = KeyValue.Key.ToSoftObjectPath();\n\t\tconst FSoftObjectPath ValuePath = KeyValue.Value.ToSoftObjectPath();\n\n\t\tif (KeyPath.IsValid())\n\t\t\tObjectPathsToStream.Add(KeyPath);\n\t\tif (ValuePath.IsValid())\n\t\t\tObjectPathsToStream.Add(ValuePath);\n\t}\n\tStreamableManager.RequestAsyncLoad(ObjectPathsToStream, [this, ObjectPathsToStream]()\n\t{\n\t\tfor (const auto& Path : ObjectPathsToStream)\n\t\t{\n\t\t\tAddToPersistentObjects(Path.ResolveObject());\n\t\t}\n\t});\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoGameSingleton::UpdateRuntimeInputKeyboardTextureMap()\n{\n\t// Collect current\n\tTMap<FName, FSoInputKeyboardKeyTextures> NewMap;\n\tconst TArray<FKey>& KeyboardKeys = FSoInputKey::GetAllKeyboardKeys();\n\tcheck(KeyboardKeys.Num() > 0);\n\n\tfor (const FKey Key : KeyboardKeys)\n\t{\n\t\tFSoInputKeyboardKeyTextures Temp;\n\t\tNewMap.Add(Key.GetFName(), Temp);\n\t}\n\n\t// Restore mappings to the user set ones\n\tfor (auto& Elem : InputKeyboardTexturesMap)\n\t{\n\t\tif (NewMap.Contains(Elem.Key))\n\t\t{\n\t\t\tNewMap.FindChecked(Elem.Key) = Elem.Value;\n\t\t}\n\t}\n\n\t// Update\n\tInputKeyboardTexturesMap = NewMap;\n\tcheck(InputKeyboardTexturesMap.Num() > 0);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoGameSingleton::UpdateRuntimeInputGamepadTextureMap()\n{\n\t// Collect current\n\tTMap<FName, FSoInputGamepadKeyTextures> NewMap;\n\tconst TArray<FKey>& GamepadKeys = FSoInputKey::GetAllGamepadKeys();\n\tcheck(GamepadKeys.Num() > 0)\n\n\tfor (const FKey Key : GamepadKeys)\n\t{\n\t\tFSoInputGamepadKeyTextures Temp;\n\t\tNewMap.Add(Key.GetFName(), Temp);\n\t}\n\n\t// Restore Mappings to the user set one\n\tfor (const auto& Elem : InputGamepadTexturesMap)\n\t\tif (NewMap.Contains(Elem.Key))\n\t\t\tNewMap.FindChecked(Elem.Key) = Elem.Value;\n\n\t// Update\n\tInputGamepadTexturesMap = NewMap;\n\tcheck(InputGamepadTexturesMap.Num() > 0);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoGameSingleton::IsBlacklistedGPUName(const FString& Name)\n{\n\tfor (const FString& BlacklistedName : Get().BlacklistedGPUNames)\n\t{\n\t\tif (Name.Contains(BlacklistedName))\n\t\t{\n\t\t\treturn true;\n\t\t}\n\t}\n\n\treturn false;\n}\n"
  },
  {
    "path": "Source/SOrb/Basic/SoGameSingleton.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#pragma once\n\n#include \"CoreMinimal.h\"\n#include \"Engine/DeveloperSettings.h\"\n#include \"Engine/StreamableManager.h\"\n\n#include \"Items/SoItemTypes.h\"\n#include \"UI/General/SoUITypes.h\"\n\n#include \"Settings/Input/SoInputSettingsTypes.h\"\n#include \"Settings/SoAudioSettingsTypes.h\"\n#include \"Settings/Input/SoInputNames.h\"\n#include \"Levels/SoLevelTypes.h\"\n#include \"SaveFiles/SoWorldStateTable.h\"\n#include \"Levels/SoEpisodeLevelTypes.h\"\n\n#include \"SoGameSingleton.generated.h\"\n\nclass UFMODEvent;\nclass UParticleSystem;\nclass UPhysicalMaterial;\nclass UFileMediaSource;\nclass UMediaSource;\nclass UMediaPlayer;\nclass UMediaTexture;\nclass UFMODVCA;\nclass UFMODBus;\nclass UTexture2D;\nclass ITargetPlatform;\n\nUSTRUCT(BlueprintType, Blueprintable)\nstruct FSoVCABlend\n{\n\tGENERATED_USTRUCT_BODY()\npublic:\n\tUPROPERTY(EditAnywhere, meta = (DisplayName = \"VCA\"))\n\tTSoftObjectPtr<UFMODVCA> VCAPtr;\n\n\tUPROPERTY(EditAnywhere)\n\tfloat BlendDuration = 1.5f;\n\n\tUPROPERTY(EditAnywhere, meta = (ClampMin = \"0\", ClampMax = \"1\"))\n\tfloat MinValue = 0.0f;\n\n\tUPROPERTY()\n\tfloat Target = 1.0f;\n\n\tUPROPERTY()\n\tfloat Counter = 1.0f;\n};\n\nUSTRUCT(BlueprintType, Blueprintable)\nstruct FSoCharacterProgressInfo\n{\n\tGENERATED_USTRUCT_BODY()\n\npublic:\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere)\n\tFText DisplayText;\n\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere)\n\tUTexture2D* Image;\n};\n\nUSTRUCT(BlueprintType, Blueprintable)\nstruct FSoEnemyGroupDesc\n{\n\tGENERATED_USTRUCT_BODY()\n\npublic:\n\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere)\n\tFText DisplayName;\n\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere, Meta = (MultiLine = true))\n\tFText Description;\n};\n\nUSTRUCT(BlueprintType, Blueprintable)\nstruct FSoEnemyGroupDescList\n{\n\tGENERATED_USTRUCT_BODY()\n\npublic:\n\t// Key: is the group name\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere)\n\tTMap<FName, FSoEnemyGroupDesc> GroupDefeatedTexts;\n\n\t// used but not used anymore, maybe we will use them later\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere)\n\tTMap<FName, FSoEnemyGroupDesc> GroupDefeatedTexts_Unmatched;\n};\n\n\nUSTRUCT(BlueprintType, Blueprintable)\nstruct FSoNameArray\n{\n\tGENERATED_USTRUCT_BODY()\npublic:\n\tUPROPERTY(EditAnywhere)\n\tTArray<FName> Names;\n};\n\n\nUSTRUCT(BlueprintType, Blueprintable)\nstruct FSoVideoSubtitle\n{\n\tGENERATED_USTRUCT_BODY()\npublic:\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite)\n\tFText Text;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite)\n\tfloat StartTime;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite)\n\tfloat EndTime;\n};\n\n\n\nUCLASS(Config = SoGameSingleton, DefaultConfig, Blueprintable, BlueprintType, meta = (DisplayName = \"Warriorb Singleton\"))\nclass SORB_API USoGameSingleton : public UDeveloperSettings\n{\n\tGENERATED_BODY()\n\npublic:\n\tUSoGameSingleton(const FObjectInitializer& ObjectInitializer);\n\t~USoGameSingleton();\n\n\t// UDeveloperSettings interface\n\t/** Gets the settings container name for the settings, either Project or Editor */\n\tFName GetContainerName() const override { return TEXT(\"Project\"); }\n\t/** Gets the category for the settings, some high level grouping like, Editor, Engine, Game...etc. */\n\tFName GetCategoryName() const override { return TEXT(\"Game\"); };\n\t/** The unique name for your section of settings, uses the class's FName. */\n\tFName GetSectionName() const override { return TEXT(\"Warriorb Singleton\"); };\n\n#if WITH_EDITOR\n\t/** Gets the description for the section, uses the classes ToolTip by default. */\n\tFText GetSectionDescription() const override\n\t{\n\t\treturn FText::FromString(TEXT(\"Configure the custom singleton settings\"));\n\t}\n\n\t/** Whether or not this class supports auto registration or if the settings have a custom setup */\n\tbool SupportsAutoRegistration() const override { return true; }\n\n\t// UObject interface\n\tvoid PostEditChangeProperty(FPropertyChangedEvent& PropertyChangedEvent) override;\n#endif  // WITH_EDITOR\n\n\tvoid PostInitProperties() override;\n\n\t// NOTE: postload is useless for the singleton\n\t//void PostLoad() override;\n\n\tUFUNCTION(BlueprintPure, DisplayName = \"Get So Game Singleton\", Category = GameSingleton)\n\tstatic USoGameSingleton* GetInstance();\n\tstatic USoGameSingleton& Get()\n\t{\n\t\tauto* Instance = GetInstance();\n\t\tcheck(IsValid(Instance));\n\t\treturn *Instance;\n\t}\n\n\t// Saves\n\tstatic FSoStateTable& GetStateTable() { return Get().StateTable; }\n\n\t//\n\t// Levels\n\t//\n\n\t// Gets all the levels that depend ClaimedLevelName\n\t// static const FSoDependentLevels* GetDependentLevels(FName ClaimedLevelName);\n\n\t/** return the name of the preset for the level for the pretag, or NAME_None if there isn't any */\n\tstatic FName GetDefaultSkyPresetFromSplineName(const FString& SplineName, bool bStartSide);\n\n\t//\n\t// Localization\n\t//\n\n\tUFUNCTION(BlueprintPure, Category = Localization)\n\tstatic const FText& GetTextForItemType(ESoItemType ItemType)\n\t{\n\t\treturn Get().ItemTypeTexts[static_cast<int32>(ItemType)];\n\t}\n\n\tUFUNCTION(BlueprintPure, Category = Localization)\n\tstatic const FText& GetTextForShardType(ESoShardType ShardType)\n\t{\n\t\treturn Get().ShardTypeTexts[static_cast<int32>(ShardType)];\n\t}\n\n\tUFUNCTION(BlueprintPure, Category = Localization)\n\tstatic const FText& GetTextForWeaponType(ESoWeaponType WeaponType)\n\t{\n\t\treturn Get().WeaponTypeTexts[static_cast<int32>(WeaponType)];\n\t}\n\n\tUFUNCTION(BlueprintPure, Category = Localization)\n\tstatic const FText& GetTextForUsableType(ESoUsableItemType UsableType)\n\t{\n\t\treturn Get().UsableTypeTexts[static_cast<int32>(UsableType)];\n\t}\n\n\tUFUNCTION(BlueprintPure, Category = Localization)\n\tstatic const FText& GetTextForQuestItemType(ESoQuestItemType QuestItemType)\n\t{\n\t\treturn Get().QuestItemTypeTexts[static_cast<int32>(QuestItemType)];\n\t}\n\n\tUFUNCTION(BlueprintPure, Category = Localization)\n\tstatic const FText& GetTextForItemParamType(ESoItemParam ParamType)\n\t{\n\t\treturn Get().ItemParamTexts[static_cast<int32>(ParamType)];\n\t}\n\n\tUFUNCTION(BlueprintPure, Category = Localization)\n\tstatic FText GetTextForInputActionName(FName ActionName);\n\n\tUFUNCTION(BlueprintPure, Category = Localization)\n\tstatic FText GetTextForInputActionNameType(ESoInputActionNameType ActionNameType);\n\n\t//\n\t// Icons\n\t//\n\n\tUFUNCTION(BlueprintPure, Category = Icons)\n\tstatic UTexture2D* GetIconForUICommand(ESoUICommand Command, ESoInputDeviceType DeviceType, const FSoInputUICommandPriorities& Priority);\n\n\tUFUNCTION(BlueprintPure, Category = Icons)\n\tstatic UTexture2D* GetIconForInputActionNameType(ESoInputActionNameType ActionNameType, ESoInputDeviceType DeviceType, bool bPressed = true);\n\n\tUFUNCTION(BlueprintPure, Category = Icons)\n\tstatic UTexture2D* GetIconForInputActionName(FName ActionName, ESoInputDeviceType DeviceType, bool bPressed = true);\n\n\tUFUNCTION(BlueprintPure, Category = Icons)\n\tstatic UTexture2D* GetIconForInputKey(FKey Key, ESoInputDeviceType DeviceType, bool bPressed = true);\n\n\tUFUNCTION(BlueprintPure, Category = Icons)\n\tstatic UTexture2D* GetIconForInputKeyName(FName KeyName, ESoInputDeviceType DeviceType, bool bPressed = true);\n\n\tUFUNCTION(BlueprintPure, Category = Icons)\n\tstatic UTexture2D* GetIconForDamageType(ESoDmgType DamageType);\n\n\t// The default size for UI icons\n\tUFUNCTION(BlueprintPure, Category = Icons)\n\tstatic FORCEINLINE int32 GetDefaultWidthOrHeightForUIIcons(ESoInputDeviceType DeviceType)\n\t{\n\t\treturn DeviceType == ESoInputDeviceType::Keyboard ? KeyboardDefaultIconSize : KeyboardDefaultIconSize * GamepadIconsMultiplier;\n\t}\n\n\t// Gets the proper size for the width or height depending on the device type\n\tUFUNCTION(BlueprintPure, Category = Icons)\n\tstatic FORCEINLINE int32 GetWidthOrHeightForUIIcons(ESoInputDeviceType DeviceType, int32 KeyboardIconWidthOrHeight)\n\t{\n\t\treturn DeviceType == ESoInputDeviceType::Keyboard ? KeyboardIconWidthOrHeight : KeyboardIconWidthOrHeight * GamepadIconsMultiplier;\n\t}\n\n\t// Vector variant\n\tUFUNCTION(BlueprintPure, Category = Icons)\n\tstatic FORCEINLINE FVector2D GetDefaultVectorWidthHeightForUIIcons(ESoInputDeviceType DeviceType)\n\t{\n\t\tconst int32 WidthHeight = GetDefaultWidthOrHeightForUIIcons(DeviceType);\n\t\treturn FVector2D(WidthHeight, WidthHeight);\n\t}\n\n\t// Vector variant\n\tUFUNCTION(BlueprintPure, Category = Icons)\n\tstatic FORCEINLINE FVector2D GetVectorWidthHeightForUIIcons(ESoInputDeviceType DeviceType, FVector2D KeyboardIconSize)\n\t{\n\t\treturn DeviceType == ESoInputDeviceType::Keyboard ?\n\t\t\tKeyboardIconSize :\n\t\t\tFVector2D(\n\t\t\t\tGetWidthOrHeightForUIIcons(DeviceType, FMath::TruncToInt(KeyboardIconSize.X)),\n\t\t\t\tGetWidthOrHeightForUIIcons(DeviceType, FMath::TruncToInt(KeyboardIconSize.Y)));\n\t}\n\n\n\tUFUNCTION(BlueprintPure, Category = UIIcons)\n\tstatic bool GetKeyboardKeyTexturesFromInputActionKeyMapping(const FInputActionKeyMapping& Mapping, FSoInputKeyboardKeyTextures& OutTextures)\n\t{\n\t\treturn GetKeyboardKeyTexturesFromKeyName(Mapping.Key.GetFName(), OutTextures);\n\t}\n\n\tUFUNCTION(BlueprintPure, Category = UIIcons)\n\tstatic bool GetKeyboardKeyTexturesFromKeyName(FName KeyName, FSoInputKeyboardKeyTextures& OutTextures);\n\n\tUFUNCTION(BlueprintPure, Category = UIIcons)\n\tstatic bool GetGamepadKeyTexturesFromInputActionKeyMapping(const FInputActionKeyMapping& Mapping, bool bSpecialHighlight, FSoInputGamepadKeyTextures& OutTexture)\n\t{\n\t\treturn GetGamepadKeyTexturesFromKeyName(Mapping.Key.GetFName(), bSpecialHighlight, OutTexture);\n\t}\n\n\tUFUNCTION(BlueprintPure, Category = UIIcons)\n\tstatic bool GetGamepadKeyTexturesFromKeyName(FName KeyName, bool bSpecialHighlight, FSoInputGamepadKeyTextures& OutTexture);\n\n\t//\n\t// Enemy\n\t//\n\n\tUFUNCTION(BlueprintPure, Category = Enemy, meta = (WorldContext = \"WorldContextObject\"))\n\tstatic bool GetEnemyGroupDescription(const UObject* WorldContextObject, FName InName, FSoEnemyGroupDesc& OutDesc);\n\n\t//\n\t// Color\n\t//\n\n\tUFUNCTION(BlueprintPure, Category = Color)\n\tstatic const FLinearColor& GetColorForDamageType(ESoDmgType DmgType, bool bAgainstEnemy = false);\n\n\tUFUNCTION(BlueprintPure, Category = Color)\n\tstatic const FLinearColor& GetColorForItemRarity(int32 RarityValue);\n\n\tUFUNCTION(BlueprintPure, Category = Color)\n\tstatic UTexture2D* GetBackgroundIconForItemType(ESoItemType ItemType);\n\n\t//\n\t// SFX & VFX\n\t//\n\n\tUFUNCTION(BlueprintPure, Category = SFX)\n\tstatic UFMODEvent* GetSFX(ESoSFX SFX);\n\n\tUFUNCTION(BlueprintPure, Category = SFX)\n\tstatic const FText& GetEnemyVoiceText(UFMODEvent* Voice);\n\n\tUFUNCTION(BlueprintPure, Category = SFX)\n\tstatic UFMODEvent* GetWallHitSFXFromPhysicalMaterial(UPhysicalMaterial* PhysicalMaterial);\n\n\tUFUNCTION(BlueprintPure, Category = SFX)\n\tstatic UParticleSystem* GetWallHitVFXFromPhysicalMaterial(UPhysicalMaterial* PhysicalMaterial);\n\n\t//\n\t// Hardware\n\t//\n\tstatic bool IsBlacklistedGPUName(const FString& Name);\n\n\n\t// Load streamables\n\n\ttemplate <typename ValueType>\n\tvoid RequestAsyncLoadValue(const TSoftObjectPtr<ValueType>& Value);\n\ttemplate <typename ValueType>\n\tvoid RequestAsyncLoadArray(const TArray<TSoftObjectPtr<ValueType>>& Array);\n\ttemplate <typename KeyType, typename ValueType>\n\tvoid RequestAsyncLoadMapValues(const TMap<KeyType, TSoftObjectPtr<ValueType>>& Map);\n\ttemplate <typename KeyType, typename ValueType>\n\tvoid RequestAsyncLoadMapKeysAndValues(const TMap<TSoftObjectPtr<KeyType>, TSoftObjectPtr<ValueType>>& Map);\n\nprotected:\n\t//\n\t// Internal methods to update and persistent objects\n\t//\n\n\t// Update the texts\n\tvoid UpdateRuntimeTextData();\n\n\tvoid UpdateEnemyDataForCurrentMap();\n\tvoid UpdateEnemyData();\n\n\t// Streams the data the singleton always needs to have loaded\n\tvoid UpdateRuntimeStreamData();\n\n\t// Fill missing InputKeyboardTexturesMap\n\tvoid UpdateRuntimeInputKeyboardTextureMap();\n\n\t// Fill missing InputGamepadTexturesMap\n\tvoid UpdateRuntimeInputGamepadTextureMap();\n\n\tvoid AddToPersistentObjects(UObject* Object)\n\t{\n\t\tcheck(IsValid(Object));\n\t\tPersistentObjects.Add(Object);\n\t}\n\nprotected:\n\tstatic constexpr int32 KeyboardDefaultIconSize = 48;\n\tstatic constexpr float GamepadIconsMultiplier = 1.25f;\n\npublic:\n\t// A native class for managing streaming assets in and keeping them in memory.\n\tFStreamableManager StreamableManager;\n\n\tUPROPERTY(VisibleAnywhere, Category = Runtime, AdvancedDisplay)\n\tFSoStateTable StateTable;\n\n\t// For Garbage Collection\n\tUPROPERTY(VisibleAnywhere, Category = Runtime, AdvancedDisplay)\n\tTArray<UObject*> PersistentObjects;\n\n\t//\n\t//  Levels\n\t//\n\n\t/**\n\t * Key: Tag: AA, TL, AG, etc\n\t * Value: The level pointer and params\n\t */\n\tUPROPERTY(EditAnywhere, Config, Category = LevelDesign, meta = (AllowedClasses = \"World\"))\n\tTMap<FString, FSoLevelParams> LevelDataForTags;\n\n\t// What weather effect in which level name\n\tUPROPERTY(EditAnywhere, Config, Category = LevelDesign, meta = (DisplayName = \"Levels Weather VFX\"))\n\tTArray<FSoLevelWeatherVFX> LevelsWeatherVFXArray;\n\n\t// The main menu level that is loaded on startup\n\tUPROPERTY(EditAnywhere, Config, Category = LevelDesign, meta = (AllowedClasses = \"World\"))\n\tFSoftObjectPath MainMenuLevel;\n\n\t// NOTE: Not used\n\t// Defined by the user so that we can fill the DependentLevelMap\n\t// UPROPERTY(EditAnywhere, Config, Category = LevelDesign, meta = (AllowedClasses = \"World\"))\n\t// TArray<FSoDependentLevelDesc> DependentLevels;\n\n\t// NOTE: Not used\n\t/**\n\t * Key: claimed level name\n\t * Value: list of dependent levels, they are all active if claimed level is active\n\t * Filled from DependentLevels.\n\t * Also O(1) access.\n\t */\n\t// UPROPERTY(VisibleAnywhere, Config, Category = LevelDesign)\n\t// TMap<FName, FSoDependentLevels> DependentLevelMap;\n\n\tUPROPERTY(EditAnywhere, Config, Category = Chapter, meta = (AllowedClasses = \"World\"))\n\tFSoftObjectPath FirstChapterLevel;\n\n\tUPROPERTY(EditAnywhere, Config, Category = Chapter, meta = (AllowedClasses = \"World\"))\n\tFSoftObjectPath LastChapterLevel;\n\n\t// Contains data about each chapter\n\tUPROPERTY(EditAnywhere, Config, Category = Chapter)\n\tTArray<FSoChapterMapParams> ChaptersArray;\n\n\n\t/**\n\t *  Each key is a level name\n\t *  The array is a list of levels to unload when the key Level loads\n\t */\n\tUPROPERTY(EditAnywhere, Config, Category = Chapter, meta = (AllowedClasses = \"World\"))\n\tTMap<FName, FSoNameArray> LevelUnloadMapForSwitch;\n\n\n\n\t// Contains all the episodes data\n\tUPROPERTY(EditAnywhere, Config, Category = Episode, meta = (DisplayName = \"Episodes\"))\n\tTArray<FSoEpisodeMapParams> EpisodesArray;\n\n\t// Used for the demo\n\tUPROPERTY(EditAnywhere, Config, Category = Episode, meta = (AllowedClasses = \"World\"))\n\tFSoftObjectPath DemoEpisodeLevel;\n\n\n\t//\n\t// Progress\n\t//\n\n\t// Contains data related to player progress in main game\n\tUPROPERTY(EditAnywhere, Config, Category = Progress)\n\tTMap<FName, FSoCharacterProgressInfo> CharacterProgressInfo;\n\n\t//\n\t// Enemy\n\t//\n\n\n\t// Key: The map name\n\t// Value: Texts for that enemies map\n\tUPROPERTY(EditAnywhere, Config, Category = Enemy)\n\tTMap<FName, FSoEnemyGroupDescList> EnemiesDescriptionPerMap;\n\n\t//\n\t// Color and damage textures\n\t//\n\n\t// Used when NOT bAgainstEnemy\n\tUPROPERTY(EditAnywhere, Config, Category = Color)\n\tTMap<ESoDmgType, FLinearColor> DamageTypeColors;\n\n\t// Used bAgainstEnemy\n\tUPROPERTY(EditAnywhere, Config, Category = Color)\n\tFLinearColor DamageColorPhysical;\n\n\t// Used bAgainstEnemy\n\tUPROPERTY(EditAnywhere, Config, Category = Color)\n\tFLinearColor DamageColorMagic;\n\n\tUPROPERTY(EditAnywhere, Config, Category = Color)\n\tTArray<FLinearColor> ItemRarityColors;\n\n\tUPROPERTY(EditAnywhere, Config, Category = Color, meta = (DisplayName = \"Item Background Colors\"))\n\tTMap<ESoItemType, TSoftObjectPtr<UTexture2D>> ItemBackgroundColorsMapPtr;\n\n\t// Maps from the damage type to the texture\n\tUPROPERTY(EditAnywhere, Config, Category = Damage, meta = (DisplayName = \"Damage Types Textures\"))\n\tTMap<ESoDmgType, TSoftObjectPtr<UTexture2D>> DamageTypesTexturesMapPtr;\n\n\n\t//\n\t//  Icons\n\t//\n\n\t// The icon to use when all else fails, can't find it most likely\n\tUPROPERTY(EditAnywhere, Config, Category = Input, meta = (DisplayName = \"Input Invalid Icon\"))\n\tTSoftObjectPtr<UTexture2D> InputInvalidIconPtr;\n\n\t/**\n\t * Holds all the keyboard keys texture mappings\n\t * Key: FKey::Name\n\t * Value: Texture for this key if any\n\t */\n\tUPROPERTY(EditAnywhere, Config, Category = Input, meta = (DisplayName = \"Input Keyboard Textures\"))\n\tTMap<FName, FSoInputKeyboardKeyTextures> InputKeyboardTexturesMap;\n\n\t/**\n\t * Holds all the gamepad buttons/keys texture mappings for all variants\n\t * Key: FKey::Name\n\t * Value: All the available textures for this gamepad key if any\n\t */\n\tUPROPERTY(EditAnywhere, Config, Category = Input, meta = (DisplayName = \"Input Gamepad Textures\"))\n\tTMap<FName, FSoInputGamepadKeyTextures> InputGamepadTexturesMap;\n\n\t/**\n\t *  Holds extra, special highlighted images for some controller button which are used\n\t *  if both pressed and unpressed state must be visualized (decals)\n\t */\n\tUPROPERTY(EditAnywhere, Config, Category = Input, meta = (DisplayName = \"Highlighted Gamepad Textures\"))\n\tTMap<FName, FSoInputGamepadKeyTextures> HighlightedGamepadTexturesMap;\n\n\n\t//\n\t//  Texts\n\t//\n\n\tUPROPERTY(EditAnywhere, Config, Category = Loading, AdvancedDisplay)\n\tTArray<FText> GeneralLoadingScreenTexts;\n\n\tUPROPERTY(VisibleAnywhere, Category = Runtime, AdvancedDisplay)\n\tTArray<FText> ItemTypeTexts;\n\n\tUPROPERTY(VisibleAnywhere, Category = Runtime, AdvancedDisplay)\n\tTArray<FText> ShardTypeTexts;\n\n\tUPROPERTY(VisibleAnywhere, Category = Runtime, AdvancedDisplay)\n\tTArray<FText> WeaponTypeTexts;\n\n\tUPROPERTY(VisibleAnywhere, Category = Runtime, AdvancedDisplay)\n\tTArray<FText> UsableTypeTexts;\n\n\tUPROPERTY(VisibleAnywhere, Category = Runtime, AdvancedDisplay)\n\tTArray<FText> QuestItemTypeTexts;\n\n\tUPROPERTY(VisibleAnywhere, Category = Runtime, AdvancedDisplay)\n\tTArray<FText> ItemParamTexts;\n\n\n\t//\n\t// SFX & Audio\n\t//\n\n\tUPROPERTY(EditAnywhere, Config, Category = Audio, meta = (DisplayName = \"SFX\"))\n\tTMap<ESoSFX, TSoftObjectPtr<UFMODEvent>> SFXMapPtr;\n\n\t//TMap<UFMODEvent*, FText> EnemyVoiceTextMap;\n\n\tUPROPERTY(EditAnywhere, Config, Category = Audio, meta = (DisplayName = \"Voice Texts\"))\n\tTArray<FSoVoiceEntry> VoiceTextsArray;\n\n\tUPROPERTY(EditAnywhere, Config, Category = Audio, meta = (DisplayName = \"Voice Texts (Random)\"))\n\tTArray<FSoVoiceEntryRandomText> VoiceTextsArrayRandom;\n\n\tUPROPERTY(EditAnywhere, Config, Category = Audio, meta = (DisplayName = \"Wall Hit SFX Invalid\"))\n\tTSoftObjectPtr<UFMODEvent> WallHitSFXInvalidPtr;\n\n\tUPROPERTY(EditAnywhere, Config, Category = Audio, meta = (DisplayName = \"Wall Hits SFX\"))\n\tTMap<TSoftObjectPtr<UPhysicalMaterial>, TSoftObjectPtr<UFMODEvent>> WallHitSFXMapPtr;\n\n\tUPROPERTY(EditAnywhere, Config, Category = Audio, meta = (DisplayName = \"Menu Music\"))\n\tTSoftObjectPtr<UFMODEvent> MenuMusicPtr;\n\n\tUPROPERTY(EditAnywhere, Config, Category = Audio, meta = (DisplayName = \"Loading Music\"))\n\tTSoftObjectPtr<UFMODEvent> LoadingMusicPtr;\n\n\tUPROPERTY(EditAnywhere, Config, Category = Audio, meta = (DisplayName = \"VCA Master\"))\n\tTSoftObjectPtr<UFMODVCA> VCA_MasterPtr;\n\n\tUPROPERTY(EditAnywhere, Config, Category = Audio, meta = (DisplayName = \"VCA SFX\"))\n\tTSoftObjectPtr<UFMODVCA> VCA_SFXPtr;\n\n\tUPROPERTY(EditAnywhere, Config, Category = Audio, meta = (DisplayName = \"VCA UI SFX\"))\n\tTSoftObjectPtr<UFMODVCA> VCA_UIPtr;\n\n\tUPROPERTY(EditAnywhere, Config, Category = Audio, meta = (DisplayName = \"VCA Music\"))\n\tTSoftObjectPtr<UFMODVCA> VCA_MusicPtr;\n\n\tUPROPERTY(EditAnywhere, Config, Category = Audio, meta = (DisplayName = \"VCA Mute\"))\n\tTSoftObjectPtr<UFMODVCA> VCA_MutePtr;\n\n\tUPROPERTY(EditAnywhere, Config, Category = Audio,  meta = (DisplayName = \"Menu Buses To Pause\"))\n\tTArray<TSoftObjectPtr<UFMODBus>> MenuBusesToPauseArrayPtr;\n\n\tUPROPERTY(EditAnywhere, Config, Category = Audio, meta = (DisplayName = \"VCA Menu\"))\n\tFSoVCABlend VCA_Menu;\n\n\tUPROPERTY(EditAnywhere, Config, Category = Audio, meta = (DisplayName = \"VCA Amb Dialogue\"))\n\tFSoVCABlend VCA_AmbientDialogue;\n\n\t// VCAMenu and VCA_AmbientDialogue\n\tTArray<FSoVCABlend*> VCA_BlendArray;\n\n\tUPROPERTY(EditAnywhere, Config, Category = Audio)\n\tfloat MinWaitBeforeMusicRestart = 30.0f;\n\n\tUPROPERTY(EditAnywhere, Config, Category = Audio)\n\tfloat MaxWaitBeforeMusicRestart = 45.0f;\n\n\tUPROPERTY(EditAnywhere, Config, Category = Audio, meta = (DisplayName = \"Buses To Ignore For Speed Change\"))\n\tTArray<TSoftObjectPtr<UFMODBus>> BusesToIgnoreForSpeedChangeArrayPtr;\n\n\t//\n\t// WallHit\n\t//\n\n\tUPROPERTY(EditAnywhere, Config, Category = Particles, meta = (DisplayName = \"Wall Hit VFX Invalid\"))\n\tTSoftObjectPtr<UParticleSystem> WallHitVFXInvalidPtr;\n\n\tUPROPERTY(EditAnywhere, Config, Category = Particles, meta = (DisplayName = \"Wall Hit VFX\"))\n\tTMap<TSoftObjectPtr<UPhysicalMaterial>, TSoftObjectPtr<UParticleSystem>> WallHitVFXMapPtr;\n\n\t//\n\t// Media player\n\t//\n\n\tUPROPERTY(EditAnywhere, Config, Category = VideoPlayer, meta = (DisplayName = \"Video Media Player\"))\n\tTSoftObjectPtr<UMediaPlayer> VideoMediaPlayerPtr;\n\n\tUPROPERTY(EditAnywhere, Config, Category = VideoPlayer, meta = (DisplayName = \"Video Media Texture\"))\n\tTSoftObjectPtr<UMediaTexture> VideoMediaTexturePtr;\n\n\tUPROPERTY(EditAnywhere, Config, Category = VideoPlayer, meta = (DisplayName = \"Demo Media Source\"))\n\tTSoftObjectPtr<UMediaSource> DemoMediaSourcePtr;\n\n\tUPROPERTY(EditAnywhere, Config, Category = VideoPlayer, meta = (DisplayName = \"Intro Media Source\"))\n\tTSoftObjectPtr<UMediaSource> IntroMediaSourcePtr;\n\n\tUPROPERTY(EditAnywhere, Config, Category = VideoPlayer, meta = (DisplayName = \"Intro Subtitle\"))\n\tTArray<FSoVideoSubtitle> IntroSubs;\n\n\tUPROPERTY(EditAnywhere, Config, Category = VideoPlayer, meta = (DisplayName = \"Intro sounds\"))\n\tTSoftObjectPtr<UFMODEvent> IntroSounds;\n\n\t//\n\t// Crash\n\t//\n\n\t// Non Steam\n\tUPROPERTY(EditAnywhere, Config, Category = Crash)\n\tFString FeedbackURL;\n\n\t// Steam\n\tUPROPERTY(EditAnywhere, Config, Category = Crash)\n\tFString FeedbackURLSteam;\n\n\t// Demo non Steam\n\tUPROPERTY(EditAnywhere, Config, Category = Crash)\n\tFString FeedbackURLDemo;\n\n\t// Demo Steam\n\tUPROPERTY(EditAnywhere, Config, Category = Crash)\n\tFString FeedbackURLDemoSteam;\n\n\t//\n\t// Hadware\n\t//\n\n\t// List of GPUs that are not allowed\n\tUPROPERTY(EditAnywhere, Config, Category = Hadware)\n\tTArray<FString> BlacklistedGPUNames;\n\n\t//\n\t// OLD DATA\n\t//\n\n\t// UPROPERTY(VisibleAnywhere, Category = Runtime, AdvancedDisplay)\n\t// TMap<FName, UParticleSystem*> LevelWeatherVFXMap;\n\t// UPROPERTY(VisibleAnywhere, Category = Runtime, AdvancedDisplay)\n\t// TMap<ESoItemType, UTexture2D*> ItemBackgroundColorsMap;\n\t// UPROPERTY(VisibleAnywhere, Category = Runtime, AdvancedDisplay)\n\t// TMap<ESoDamageType, UTexture2D*> DamageTypesTexturesMap;\n\t// UPROPERTY(VisibleAnywhere, Category = Runtime, AdvancedDisplay)\n\t// UTexture2D* InputInvalidIcon = nullptr;\n\t// UPROPERTY(VisibleAnywhere, Category = Runtime, AdvancedDisplay)\n\t// TMap<ESoSFX, UFMODEvent*> SFXMap;\n\t// UPROPERTY(VisibleAnywhere, Category = Runtime, AdvancedDisplay)\n\t// UFMODEvent* WallHitSFXInvalid;\n\t// UPROPERTY(VisibleAnywhere, Category = Runtime, AdvancedDisplay)\n\t// TMap<UPhysicalMaterial*, UFMODEvent*> WallHitSFXMap;\n\t// UPROPERTY(VisibleAnywhere, Category = Runtime, AdvancedDisplay)\n\t// UParticleSystem* WallHitVFXInvalid;\n\t// UPROPERTY(VisibleAnywhere, Category = Runtime, AdvancedDisplay)\n\t// TMap<UPhysicalMaterial*, UParticleSystem*> WallHitVFXMap;\n};\n"
  },
  {
    "path": "Source/SOrb/Basic/SoGameViewportClient.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#include \"SoGameViewportClient.h\"\n\n#include \"SoGameInstance.h\"\n#include \"Engine/Canvas.h\"\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoGameViewportClient::Init(struct FWorldContext& WorldContext, UGameInstance* OwningGameInstance, bool bCreateNewAudioDevice)\n{\n\tSuper::Init(WorldContext, OwningGameInstance, bCreateNewAudioDevice);\n\tif (USoGameInstance* SoGameInstance = GetSoGameInstance())\n\t\tSoGameInstance->SetGameViewportClient(this);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoGameViewportClient::Tick(float DeltaTime)\n{\n\tSuper::Tick(DeltaTime);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoGameViewportClient::LostFocus(FViewport* InViewport)\n{\n\tSuper::LostFocus(InViewport);\n\tif (USoGameInstance* SoGameInstance = GetSoGameInstance())\n\t\tSoGameInstance->OnGameViewportFocusLost();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoGameViewportClient::ReceivedFocus(FViewport* InViewport)\n{\n\tSuper::ReceivedFocus(InViewport);\n\tif (USoGameInstance* SoGameInstance = GetSoGameInstance())\n\t\tSoGameInstance->OnGameViewportFocusReceived();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFString USoGameViewportClient::ConsoleCommand(const FString& Command)\n{\n\treturn Super::ConsoleCommand(Command);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoGameViewportClient::PostRender(UCanvas* Canvas)\n{\n\tSuper::PostRender(Canvas);\n\n\t// Fade if requested, you could use the same DrawScreenFade method from any canvas such as the HUD\n\tif (bIsFading)\n\t{\n\t\tDrawScreenFade(Canvas);\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUSoGameInstance* USoGameViewportClient::GetSoGameInstance()\n{\n\treturn Cast<USoGameInstance>(GameInstance);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUSoGameViewportClient* USoGameViewportClient::GetInstance()\n{\n\tif (!GEngine)\n\t\treturn nullptr;\n\n\treturn Cast<USoGameViewportClient>(GEngine->GameViewport);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoGameViewportClient::SetIsFading(bool bValue)\n{\n\tbIsFading = bValue;\n\tOnFadingChanged.Broadcast(bIsFading);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoGameViewportClient::ClearFade()\n{\n\tSetIsFading(false);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoGameViewportClient::Fade(float Duration, bool bInToBlack)\n{\n\tif (!World)\n\t\treturn;\n\n\tSetIsFading(true);\n\tbToBlack = bInToBlack;\n\tFadeDuration = Duration;\n\tFadeStartTime = World->GetRealTimeSeconds();\n\tcheck(!(FadeStartTime < 0.f));\n\tcheck(FadeDuration > 0.f);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoGameViewportClient::DrawScreenFade(UCanvas* Canvas)\n{\n\tif (!bIsFading)\n\t\treturn;\n\n\tif (!World)\n\t\treturn;\n\n\tconst float Time = World->GetRealTimeSeconds();\n\tif (Time < FadeStartTime)\n\t{\n\t\t// Most likely these two are from different worlds, reset timer to now\n\t\t// This would cause a bug when transitioning to the main menu level\n\t\tFadeStartTime = Time;\n\t}\n\tcheck(Time >= FadeStartTime);\n\n\t// Make sure that we stay black in a fade to black\n\tconst float Alpha = FMath::Clamp((Time - FadeStartTime) / FadeDuration, 0.f, 1.f);\n\tif (FMath::IsNearlyEqual(Alpha, 1.f) && !bToBlack)\n\t{\n\t\t// Finished fading\n\t\tSetIsFading(false);\n\t}\n\telse\n\t{\n\t\tconst FColor OldColor = Canvas->DrawColor;\n\t\tFLinearColor FadeColor = FLinearColor::Black;\n\t\tFadeColor.A = bToBlack ? Alpha : 1 - Alpha;\n\t\tCanvas->DrawColor = FadeColor.ToFColor(true);\n\t\tCanvas->DrawTile(Canvas->DefaultTexture, 0, 0, Canvas->ClipX, Canvas->ClipY, 0, 0, Canvas->DefaultTexture->GetSizeX(), Canvas->DefaultTexture->GetSizeY());\n\t\tCanvas->DrawColor = OldColor;\n\t}\n}\n"
  },
  {
    "path": "Source/SOrb/Basic/SoGameViewportClient.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#pragma once\n\n #include \"Engine/GameViewportClient.h\"\n #include \"SoGameViewportClient.generated.h\"\n\nclass USoGameInstance;\n\n\n\n UCLASS()\nclass SORB_API USoGameViewportClient : public UGameViewportClient\n {\n\t GENERATED_BODY()\n public:\n\n\t// UGameViewportClient Interface\n\tvoid Init(struct FWorldContext& WorldContext, UGameInstance* OwningGameInstance, bool bCreateNewAudioDevice = true) override;\n\tvoid LostFocus(FViewport* InViewport) override;\n\tvoid ReceivedFocus(FViewport* InViewport) override;\n\tFString ConsoleCommand(const FString& Command) override;\n\tvoid Tick(float DeltaTime) override;\n\tvoid PostRender(UCanvas* Canvas) override;\n\n\tvoid FadeIn(float Duration) { Fade(Duration, true); }\n\tvoid FadeOut(float Duration) { Fade(Duration, false); }\n\tbool IsFading() const { return bIsFading; }\n\n\tstatic USoGameViewportClient* GetInstance();\n\n\t/** Clear fading state */\n\tvoid ClearFade();\n\npublic:\n\tDECLARE_EVENT_OneParam(USoGameViewportClient, FSoGameViewportFadingDelegate, bool)\n\tFSoGameViewportFadingDelegate OnFadingChanged;\n\nprotected:\n\t// Own methods\n\tUSoGameInstance* GetSoGameInstance();\n\n\t/** Used for Fade to and from black */\n\tvoid Fade(float Duration, bool bInToBlack);\n\n\t/** Does the actual screen fading */\n\tvoid DrawScreenFade(UCanvas* Canvas);\n\n\tvoid SetIsFading(bool bValue);\n\nprotected:\n\t// Values used by our screen fading\n\tbool bIsFading = false;\n\tbool bToBlack = false; // Fading to black will be applied even if alpha is 1\n\tfloat FadeAlpha = 0.f;\n\tfloat FadeStartTime = 0.f;\n\tfloat FadeDuration = 0.f;\n};\n"
  },
  {
    "path": "Source/SOrb/Basic/SoTimerManager.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n\n#include \"SoTimerManager.h\"\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSoTimerManager::Tick(float DeltaSeconds)\n{\n\t// addition to the array is possible during iteration!\n\n\tbCurrentlyInTick = true;\n\tconst int32 TimerCount = Timers.Num();\n\tfor (int32 i = TimerCount - 1; i >= 0; --i)\n\t{\n\t\tTimers[i].RemainingTime -= DeltaSeconds;\n\t\tif (Timers[i].RemainingTime <= 0.0f)\n\t\t{\n\t\t\tRestFrameTime = fabs(Timers[i].RemainingTime);\n\t\t\tTimers[i].Delegate.Execute();\n\t\t\tTimers.RemoveAtSwap(i);\n\t\t}\n\t}\n\tRestFrameTime = 0.0f;\n\tbCurrentlyInTick = false;\n\n\t// process clear requests which were executed during the timer executions\n\tfor (int32 TimerToRemove : TimersToRemoveCache)\n\t\tClearTimer(TimerToRemove);\n\tTimersToRemoveCache.Empty();\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nint32 FSoTimerManager::InternalSetTimer(FSoTimer const& InDelegate, float Duration, UObject* Object)\n{\n\tif (InDelegate.RemainingTime < 0.0f)\n\t\treturn -1;\n\n\tDuration -= RestFrameTime;\n\n\tif (float* ExtraTime = InstantTimeMap.Find(Object))\n\t{\n\t\tif (*ExtraTime <= Duration)\n\t\t{\n\t\t\tDuration -= *ExtraTime;\n\t\t\tInstantTimeMap.Remove(Object);\n\t\t}\n\t\telse\n\t\t{\n\t\t\t*ExtraTime -= Duration;\n\t\t\tInDelegate.Delegate.Execute();\n\t\t\treturn -1;\n\t\t}\n\t}\n\n\n\tif (Duration < 0.0f)\n\t{\n\t\tRestFrameTime = fabs(Duration);\n\t\tInDelegate.Delegate.Execute();\n\t\treturn -1;\n\t}\n\t\n\tTimers.Add(InDelegate);\n\tTimers.Last(0).RemainingTime = Duration;\n\tTimers.Last(0).ID = NextTimerID;\n\tNextTimerID = FMath::Max(NextTimerID + 1, 0);\n\treturn Timers.Last(0).ID;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nint32 FSoTimerManager::ClearTimer(int32 TimerID)\n{\n\tif (bCurrentlyInTick)\n\t\tTimersToRemoveCache.Add(TimerID);\n\telse\n\t{\n\t\tfor (int32 i = 0; i < Timers.Num(); ++i)\n\t\t\tif (Timers[i].ID == TimerID)\n\t\t\t{\n\t\t\t\tTimers.RemoveAtSwap(i);\n\t\t\t\treturn -1;\n\t\t\t}\n\t}\n\n\treturn -1;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSoTimerManager::SetExtraTime(UObject* Object, float Time)\n{\n\tif (float* ExtraTime = InstantTimeMap.Find(Object))\n\t\t*ExtraTime = Time;\n\telse\n\t\tInstantTimeMap.Add(Object, Time);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nfloat FSoTimerManager::GetExtraTime(UObject* Object) const\n{\n\tif (const float* ExtraTime = InstantTimeMap.Find(Object))\n\t\treturn *ExtraTime;\n\n\treturn -1.0f;\n}\n"
  },
  {
    "path": "Source/SOrb/Basic/SoTimerManager.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#pragma once\n\n#include \"CoreMinimal.h\"\n#include \"Engine/EngineTypes.h\"\n\nDECLARE_DELEGATE(FSoTimerDelegate);\n\nstruct FSoTimer\n{\npublic:\n\n\t/** ID which can be used to remove this timer */\n\tint32 ID = -1;\n\t/** Time this timer has left before it is fired */\n\tfloat RemainingTime = 0.0f;\n\t/** Called when the RemainingTime is over */\n\tFSoTimerDelegate Delegate;\n\n\tFSoTimer(const FSoTimerDelegate& InDelegate) : Delegate(InDelegate) {};\n};\n\n\n/** \n *  Use if the exact frame time matters when you create a new timer after an old timer is executed\n *  Firing order inside a single frame is not granted to be chronological\n *  If we run out of positive int32 IDs we simply restart the counting from 0\n */\nclass FSoTimerManager : public FNoncopyable\n{\n\npublic:\n\n\t/** Ticks the timer manager, should only be called if the game isn't paused */\n\tvoid Tick(float DeltaSeconds);\n\n\t/** Sets timer, returns with timer ID */\n\ttemplate< class UserClass >\n\tFORCEINLINE int32 SetTimer(UserClass* InObj, typename FSoTimerDelegate::TUObjectMethodDelegate< UserClass >::FMethodPtr InTimerMethod, float Duration)\n\t{\n\t\treturn InternalSetTimer(FSoTimer(FSoTimerDelegate::CreateUObject(InObj, InTimerMethod)), Duration, InObj);\n\t}\n\n\t/** Sets timer, returns with timer ID */\n\ttemplate< class UserClass >\n\tFORCEINLINE int32 SetTimer(UserClass* InObj, typename FSoTimerDelegate::TUObjectMethodDelegate_Const< UserClass >::FMethodPtr InTimerMethod, float Duration)\n\t{\n\t\treturn InternalSetTimer(FSoTimer(FSoTimerDelegate::CreateUObject(InObj, InTimerMethod)), Duration, InObj);\n\t}\n\n\t/** Clears the timer with TimerID if there is any, returns with -1 */\n\tint32 ClearTimer(int32 TimerID);\n\n\tvoid SetExtraTime(UObject* Object, float Time);\n\tfloat GetExtraTime(UObject* Object) const;\n\nprivate:\n\n\tint32 InternalSetTimer(FSoTimer const& InDelegate, float Duration, UObject* Object);\n\nprivate:\n\n\t/** used to know what to subtract on newly added timers if it happens inside a frame while the timers are updated */\n\tfloat RestFrameTime = 0.0f;\n\n\t/** Active timers */\n\tTArray<FSoTimer> Timers;\n\n\t/** Timers cached here if they wanna be removed during timer manager Tick() */\n\tTArray<int32> TimersToRemoveCache;\n\n\tint32 NextTimerID = 0;\n\n\tbool bCurrentlyInTick = false;\n\n\t/** Time stored for some object to be used instantly */\n\tTMap<UObject*, float> InstantTimeMap;\n};\n\n"
  },
  {
    "path": "Source/SOrb/Character/SoBounceSFXOverrideBox.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n\n#include \"SoBounceSFXOverrideBox.h\"\n\nASoBounceSFXOverrideBox::ASoBounceSFXOverrideBox(const FObjectInitializer& ObjectInitializer)\n{\n\tSFXBounceVariants.SetNum(5);\n}\n\nUFMODEvent* ASoBounceSFXOverrideBox::GetBounceSFX(int32 Index)\n{\n\treturn SFXBounceVariants.IsValidIndex(Index) ? SFXBounceVariants[Index] : nullptr;\n}\n"
  },
  {
    "path": "Source/SOrb/Character/SoBounceSFXOverrideBox.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#pragma once\n\n#include \"CoreMinimal.h\"\n#include \"Engine/TriggerBox.h\"\n#include \"SoBounceSFXOverrideBox.generated.h\"\n\nclass UFMODEvent;\n\n/**\n *\n */\nUCLASS()\nclass SORB_API ASoBounceSFXOverrideBox : public ATriggerBox\n{\n\tGENERATED_BODY()\n\npublic:\n\n\tASoBounceSFXOverrideBox(const FObjectInitializer& ObjectInitializer);\n\tUFMODEvent* GetBounceSFX(int32 Index);\n\nprotected:\n\n\tUPROPERTY(EditFixedSize, EditAnywhere, Category = SFX)\n\tTArray<UFMODEvent*> SFXBounceVariants;\n};\n"
  },
  {
    "path": "Source/SOrb/Character/SoCharStates/SoAAiming.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#include \"SoAAiming.h\"\n\n#include \"Components/SkeletalMeshComponent.h\"\n\n#include \"SoADefault.h\"\n#include \"CharacterBase/SoCharacterMovementComponent.h\"\n#include \"Character/SoCharacter.h\"\n#include \"Character/SoPlayerCharacterSheet.h\"\n#include \"Items/SoItem.h\"\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// set base flags\nUSoAAiming::USoAAiming() :\n\tUSoActivity(EActivity::EA_Aiming)\n{\n}\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoAAiming::OnEnter(USoActivity* OldActivity)\n{\n\tUSoActivity::OnEnter(OldActivity);\n\n\t// Orb->SoCrossbow->SetVisibility(true);\n}\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoAAiming::OnExit(USoActivity* NewActivity)\n{\n\tUSoActivity::OnExit(NewActivity);\n\n\t// Orb->SoCrossbow->SetVisibility(false);\n\n\t// ??? TODO\n\t// bLeftMouseBtnPressed = false;\n}\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n//\nvoid USoAAiming::Tick(float DeltaSeconds)\n{\n\tUSoActivity::Tick(DeltaSeconds);\n\n\t// TODO: update code (hand removed)\n\n\t// const FVector HandVecBeforeProjection = Orb->Hand->GetActorLocation() - Orb->GetMesh()->GetBoneLocation(FName(\"DEF_shoulder_R\"), EBoneSpaces::WorldSpace);\n\n\t// temp fix:\n\tconst FVector HandVecBeforeProjection = Orb->GetActorForwardVector();\n\n\tconst FVector Direction = FVector(FVector2D(Orb->SoMovement->GetSplineLocation().GetDirection()), 0).GetSafeNormal();\n\tconst int DirModifier = (FVector2D(Direction) | FVector2D(HandVecBeforeProjection).GetSafeNormal()) > 0 ? 1 : -1;\n\t// has to be projected, because the socket isn't in the spline's plane\n\tconst FVector HandVec = FVector::VectorPlaneProject(HandVecBeforeProjection, FVector::CrossProduct(Direction, FVector(0, 0, 1)));\n\n\tconst float CosA = FVector::DotProduct(HandVec.GetSafeNormal(), FVector(0, 0, 1));\n\tconst bool bBehind = (FVector2D(Orb->GetActorForwardVector()) | FVector2D(Direction * DirModifier)) < 0;\n\n\n\tif (bBehind)\n\t\tOrb->DynamicAnimValue = FMath::Acos(CosA) / (2 * PI);\n\telse\n\t\tOrb->DynamicAnimValue = 1.0f - FMath::Acos(CosA) / (2 * PI);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoAAiming::StrikePressed()\n{\n\tFSoItem& Item = Orb->GetPlayerCharacterSheet()->GetEquippedItem(ESoItemSlot::EIS_Item0);\n\tif (Item.Template != nullptr && Item.Amount > 0)\n\t{\n\t\t//USoUsableItemTemplate* UsableTempalte = Cast<USoUsableItemTemplate>(Item.Template);\n\t\t//if (UsableTempalte != nullptr && UsableTempalte->ProjectileClass)\n\t\t//{\n\t\t//\tconst FSoSplinePoint CharSplineLocation = ISoSplineWalker::Execute_GetSplineLocationI(Orb);\n\t\t//\tconst FVector CrossbowHeadPos = Orb->SoCrossbow->GetSocketLocation(\"BulletStartPos\");\n\t\t//\t// let's try to find the spline point near the crossbow end\n\t\t//\tconst int32 SplineDir = CharSplineLocation.GetDirectionModifierFromVector(Orb->GetActorForwardVector());\n\t\t//\tconst FSoSplinePoint BulletStartSplineLocation = CharSplineLocation.GetEstimatedSplineLocation(CrossbowHeadPos, SplineDir * 300.0f);\n\t\t//\tconst FVector BulletStartPos = USoSplineHelper::GetWorldLocationFromSplinePointZ(BulletStartSplineLocation, CrossbowHeadPos.Z);\n\t\t//\tFVector BulletDirection = BulletStartSplineLocation.GetDirectionFromVector(Orb->GetActorForwardVector());\n\t\t//\tBulletDirection.Z = 0;\n\t\t//\n\t\t//\tASoBullet* Projectile = Orb->GetWorld()->SpawnActor<ASoBullet>(UsableTempalte->ProjectileClass, BulletStartPos, BulletDirection.Rotation());\n\t\t//\t// TODO: bullet velocity?!\n\t\t//\tProjectile->FireOnSplineNew(BulletStartSplineLocation, 600 * BulletDirection);\n\t\t//\n\t\t//\tItem.Amount -= 1;\n\t\t//\tOrb->GetPlayerCharacterSheet()->UpdateSlot(ESoItemSlot::EIS_Item0);\n\t\t//}\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoAAiming::RightBtnPressed()\n{\n\tSwitchActivity(Orb->SoADefault);\n}\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoAAiming::TakeWeaponAway()\n{\n\tSwitchActivity(Orb->SoADefault);\n}\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoAAiming::UseItemFromSlot0()\n{\n\t// TODO: switch to armed state?\n\tSwitchActivity(Orb->SoADefault);\n}\n"
  },
  {
    "path": "Source/SOrb/Character/SoCharStates/SoAAiming.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#pragma once\n\n\n#include \"SoActivity.h\"\n#include \"SoAAiming.generated.h\"\n\n\nUCLASS()\nclass SORB_API USoAAiming : public USoActivity\n{\n\n\tGENERATED_BODY()\n\npublic:\n\n\tUSoAAiming();\n\n\tvirtual void Tick(float DeltaSeconds) override;\n\n\tvirtual void UseItemFromSlot0() override;\n\n\tvirtual void TakeWeaponAway() override;\n\tvirtual void RightBtnPressed() override;\n\tvirtual void StrikePressed() override;\n\n\tvirtual void ToggleWeapons() override {};\n\nprotected:\n\n\tvirtual void OnEnter(USoActivity* OldActivity) override;\n\tvirtual void OnExit(USoActivity* NewActivity) override;\n\t\n\tvirtual bool CanBeInterrupted(EActivity DesiredState = EActivity::EA_Max) const override { return true; }\n\n};\n\n"
  },
  {
    "path": "Source/SOrb/Character/SoCharStates/SoACameraEdit.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#include \"SoACameraEdit.h\"\n\n#include \"Components/SplineComponent.h\"\n#include \"DrawDebugHelpers.h\"\n\n#include \"SoADefault.h\"\n#include \"CharacterBase/SoCharacterMovementComponent.h\"\n#include \"Character/SoCharacter.h\"\n#include \"SplineLogic/SoEditorGameInterface.h\"\n#include \"SplineLogic/SoPlayerSpline.h\"\n#include \"Components/InputComponent.h\"\n\n#if WITH_EDITOR\n#include \"Editor.h\"\n#endif\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// set base flags\nUSoACameraEdit::USoACameraEdit() :\n\tUSoActivity(EActivity::EA_CameraEdit)\n{\n\tPresets.Add({ \"Down12\", { { 1200, 0.0f, -10.0f, 100.0f, FVector{ 0.0f, 0.0f, 300.0f } },\n\t\t\t\t\t\t\t  { 1200, 0.0f, -10.0f, 100.0f, FVector{ 0.0f, 0.0f, 300.0f } },\n\t\t\t\t\t\t\t  { 1200, 0.0f, -15.0f, 100.0f, FVector{ 0.0f, 0.0f, 250.0f } },\n\t\t\t\t\t\t\t  { 1200, 0.0f, -10.0f, 100.0f, FVector{ -500, 0.0f, 300.0f } },\n\t\t\t\t\t\t\t  { 1200, 0.0f, -10.0f, 100.0f, FVector{  500, 0.0f, 300.0f } },\n\t} });\n\n\tPresets.Add({ \"Down13\", { { 1300, 0.0f, -10.0f, 100.0f, FVector{ 0.0f, 0.0f, 300.0f } },\n\t\t\t\t\t\t\t  { 1300, 0.0f, -10.0f, 100.0f, FVector{ 0.0f, 0.0f, 300.0f } },\n\t\t\t\t\t\t\t  { 1300, 0.0f, -15.0f, 100.0f, FVector{ 0.0f, 0.0f, 250.0f } },\n\t\t\t\t\t\t\t  { 1300, 0.0f, -10.0f, 100.0f, FVector{ -500, 0.0f, 300.0f } },\n\t\t\t\t\t\t\t  { 1300, 0.0f, -10.0f, 100.0f, FVector{  500, 0.0f, 300.0f } },\n\t} });\n\n\tPresets.Add({ \"Mid12\", { { 1200, 0.0f, -20.0f, 100.0f, FVector{ 0.0f, 0.0f, 0.0f } },\n\t\t\t\t\t\t\t { 1200, 0.0f, -15.0f, 100.0f, FVector{ 0.0f, 0.0f, 0.0f } },\n\t\t\t\t\t\t\t { 1200, 0.0f, -10.0f, 100.0f, FVector{ 0.0f, 0.0f, 0.0f } },\n\t\t\t\t\t\t\t { 1200, 0.0f, -10.0f, 100.0f, FVector{ -500, 0.0f, 300.0f } },\n\t\t\t\t\t\t\t { 1200, 0.0f, -10.0f, 100.0f, FVector{ 500, 0.0f, 300.0f } }\n\t} });\n\n\tPresets.Add({ \"Mid15\", { { 1500, 0.0f, -20.0f, 100.0f, FVector{ 0.0f, 0.0f, 0.0f } },\n\t\t\t\t\t\t\t { 1500, 0.0f, -15.0f, 100.0f, FVector{ 0.0f, 0.0f, 0.0f } },\n\t\t\t\t\t\t\t { 1500, 0.0f, -10.0f, 100.0f, FVector{ 0.0f, 0.0f, 0.0f } },\n\t\t\t\t\t\t\t { 1500, 0.0f, -10.0f, 100.0f, FVector{ -500, 0.0f, 300.0f } },\n\t\t\t\t\t\t\t { 1500, 0.0f, -10.0f, 100.0f, FVector{ 500, 0.0f, 300.0f } }\n\t} });\n\n\tPresets.Add({ \"Up12\", { { 1200, 0.0f, -20.0f, 100.0f, FVector{ 0.0f, 0.0f, -250.0f } },\n\t\t\t\t\t\t\t{ 1200, 0.0f, -10.0f, 100.0f, FVector{ 0.0f, 0.0f, -250.0f } },\n\t\t\t\t\t\t\t{ 1200, 0.0f, -10.0f, 100.0f, FVector{ 0.0f, 0.0f, -300.0f } },\n\t\t\t\t\t\t\t{ 1200, 0.0f, -10.0f, 100.0f, FVector{ -500, 0.0f, -250.0f } },\n\t\t\t\t\t\t\t{ 1200, 0.0f, -10.0f, 100.0f, FVector{ 500, 0.0f, -250.0f } }\n\t} });\n\n\tPresets.Add({ \"Up15\", { { 1500, 0.0f, -20.0f, 100.0f, FVector{ 0.0f, 0.0f, -250.0f } },\n\t\t\t\t\t\t\t{ 1500, 0.0f, -10.0f, 100.0f, FVector{ 0.0f, 0.0f, -250.0f } },\n\t\t\t\t\t\t\t{ 1500, 0.0f, -10.0f, 100.0f, FVector{ 0.0f, 0.0f, -300.0f } },\n\t\t\t\t\t\t\t{ 1500, 0.0f, -10.0f, 100.0f, FVector{ -500, 0.0f, -250.0f } },\n\t\t\t\t\t\t\t{ 1500, 0.0f, -10.0f, 100.0f, FVector{ 500, 0.0f, -250.0f } }\n\t} });\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoACameraEdit::OnEnter(USoActivity* OldActivity)\n{\n\tUSoActivity::OnEnter(OldActivity);\n\tOrb->SetEditorWidgetVisibility(ESoEditorUI::EEUI_Camera, true);\n\n\tif (bSuperMode)\n\t\tOnSuperModeChange(true);\n}\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoACameraEdit::OnExit(USoActivity* NewActivity)\n{\n\tUSoActivity::OnExit(NewActivity);\n\tOrb->SetEditorWidgetVisibility(ESoEditorUI::EEUI_Camera, false);\n\n\tif (bSuperMode)\n\t\tOnSuperModeChange(false);\n}\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// Tack\nvoid USoACameraEdit::Tick(float DeltaSeconds)\n{\n\tUSoActivity::Tick(DeltaSeconds);\n\n\tif (bSuperMode)\n\t\tSuperModeTick(DeltaSeconds);\n\n\tFSoSplinePoint SplineLocation = Orb->SoMovement->GetSplineLocation();\n\tASoPlayerSpline* PlayerSpline = Cast<ASoPlayerSpline>(SplineLocation.GetSpline());\n\tif (PlayerSpline == nullptr)\n\t\treturn;\n\tauto& CamKeys = PlayerSpline->GetCamNodeList().CamKeys;\n\t// Orb->GetClosestCamIndex() calls this->GetClosestCamIndex(), weird\n\tconst int32 ClosestIndex = Orb->GetClosestCamIndex();\n\tfor (int32 i = 0; i < CamKeys.Num(); ++i)\n\t{\n\t\tFVector Loc = PlayerSpline->GetSplineComponent()->GetWorldLocationAtDistanceAlongSpline(CamKeys[i].Distance);\n\t\tLoc.Z = Orb->GetActorLocation().Z + 100;\n\t\tDrawDebugPoint(GetWorld(), Loc, 10.0f, i == ClosestIndex ? FColor(125, 0, 0) : FColor(0, 125, 0));\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoACameraEdit::UpdateCamera(float DeltaSeconds)\n{\n\tSuper::UpdateCamera(DeltaSeconds);\n\n\tFSoSplinePoint SplineLocation = Orb->SoMovement->GetSplineLocation();\n\tASoPlayerSpline* PlayerSpline = Cast<ASoPlayerSpline>(SplineLocation.GetSpline());\n\tif (PlayerSpline == nullptr)\n\t\treturn;\n\tauto& CamKeys = PlayerSpline->GetCamNodeList().CamKeys;\n\n\tconst FSoCamKeyNode InterpolatedNode = Orb->GetInterpolatedCamData();\n\tbPresetUsed = false;\n\t// update preset\n\tfor (int32 i = 0; i < Presets.Num(); ++i)\n\t\tfor (int32 j = 0; j < Presets[i].Variants.Num(); ++j)\n\t\t\tif (InterpolatedNode.CompareParams(Presets[i].Variants[j]))\n\t\t\t{\n\t\t\t\tbPresetUsed = true;\n\t\t\t\tActivePreset = i;\n\t\t\t\tActivePresetSubType = j;\n\t\t\t}\n\n\tif (bOnCamKeyPosition)\n\t{\n\t\tif (Orb->ActiveCamKey >= CamKeys.Num())\n\t\t\tbOnCamKeyPosition = false;\n\t\telse\n\t\t{\n\t\t\t// let's check if we moved away from key position\n\t\t\tconst FVector Loc = CamKeys[Orb->ActiveCamKey].SplinePoint;\n\n\t\t\tif (FVector2D::Distance(FVector2D(Loc), FVector2D(Orb->GetActorLocation())) > 2 * KINDA_SMALL_NUMBER)\n\t\t\t\tbOnCamKeyPosition = false;\n\t\t}\n\t}\n\n\tif (!bOnCamKeyPosition)\n\t\treturn;\n\n\tconst float DeltaX = Orb->InputComponent->GetAxisValue(\"MouseX\");\n\tconst float DeltaY = Orb->InputComponent->GetAxisValue(\"MouseY\");\n\n\tauto& CamKey = CamKeys[Orb->ActiveCamKey];\n\n\t// update camera edit\n\tif (Orb->bLeftMouseBtnPressed)\n\t{\n\t\tif (Orb->bCtrlPressed)\n\t\t\tCamKey.DeltaYaw += DeltaX * DeltaSeconds * 100;\n\t\telse\n\t\t\tCamKey.DeltaOffset += FVector(DeltaX * DeltaSeconds * 300, 0, 0);\n\t}\n\n\tif (Orb->bRightMouseBtnPressed)\n\t{\n\t\tif (Orb->bCtrlPressed)\n\t\t\tCamKey.DeltaPitch += DeltaY * DeltaSeconds * 100;\n\t\telse\n\t\t\tCamKey.DeltaOffset += FVector(0, 0, DeltaY * 300 * DeltaSeconds);\n\t}\n\n\tif (Orb->bMiddleMousePressed)\n\t\tCamKey.ArmLength -= DeltaY * DeltaSeconds * 400;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoACameraEdit::InteractKeyPressed(bool bPrimary)\n{\n\tif (bPrimary)\n\t\tbCamEditHintVisible = !bCamEditHintVisible;\n\telse\n\t{\n\t\tif (!bOnCamKeyPosition)\n\t\t\treturn;\n\n\t\tFSoSplinePoint SplineLocation = Orb->SoMovement->GetSplineLocation();\n\t\tASoPlayerSpline* PlayerSpline = Cast<ASoPlayerSpline>(SplineLocation.GetSpline());\n\t\tauto& CamKeys = PlayerSpline->GetCamNodeList().CamKeys;\n\n\t\tif (!CamKeys.IsValidIndex(Orb->ActiveCamKey))\n\t\t\treturn;\n\n\t\tif (bPresetUsed && Presets.Num() != 0)\n\t\t\tActivePreset = (ActivePreset + 1) % Presets.Num();\n\n\t\tActivePresetSubType = FMath::Clamp(ActivePresetSubType, 0, Presets[ActivePreset].Variants.Num() - 1);\n\n\t\tCamKeys[Orb->ActiveCamKey].CopyParams(Presets[ActivePreset].Variants[ActivePresetSubType], false);\n\t}\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoACameraEdit::DebugFeature()\n{\n\tif (!bOnCamKeyPosition)\n\t\treturn;\n\n\tFSoSplinePoint SplineLocation = Orb->SoMovement->GetSplineLocation();\n\tASoPlayerSpline* PlayerSpline = Cast<ASoPlayerSpline>(SplineLocation.GetSpline());\n\tauto& CamKeys = PlayerSpline->GetCamNodeList().CamKeys;\n\n\tif (!CamKeys.IsValidIndex(Orb->ActiveCamKey))\n\t\treturn;\n\n\tif (bPresetUsed && Presets.IsValidIndex(ActivePreset))\n\t\tActivePresetSubType = (ActivePresetSubType + 1) % Presets[ActivePreset].Variants.Num();\n\n\tCamKeys[Orb->ActiveCamKey].CopyParams(Presets[ActivePreset].Variants[ActivePresetSubType], false);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nfloat USoACameraEdit::GetPrevCamKeyNodeSplineDistance() const\n{\n\tASoPlayerSpline* PlayerSpline = Cast<ASoPlayerSpline>(ISoSplineWalker::Execute_GetSplineLocationI(Orb).GetSpline());\n\tif (PlayerSpline == nullptr)\n\t\treturn 0.0f;\n\n\tconst auto& CamKeys = PlayerSpline->GetCamNodeList().CamKeys;\n\n\tif (bOnCamKeyPosition)\n\t{\n\t\tif (Orb->ActiveCamKey > 0)\n\t\t\treturn CamKeys[Orb->ActiveCamKey - 1].SplinePoint.GetDistance();\n\t\treturn 0.0f;\n\t}\n\treturn CamKeys[Orb->ActiveCamKey].SplinePoint.GetDistance();\n}\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nfloat USoACameraEdit::GetNextCamKeyNodeSplineDistance() const\n{\n\tASoPlayerSpline* PlayerSpline = Cast<ASoPlayerSpline>(ISoSplineWalker::Execute_GetSplineLocationI(Orb).GetSpline());\n\tif (PlayerSpline == nullptr)\n\t\treturn 0.0f;\n\n\tconst auto& CamKeys = PlayerSpline->GetCamNodeList().CamKeys;\n\n\tif (Orb->ActiveCamKey + 1 < CamKeys.Num())\n\t\treturn CamKeys[Orb->ActiveCamKey + 1].SplinePoint.GetDistance();\n\treturn 0.0f;\n}\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nint32 USoACameraEdit::GetClosestCamIndex() const\n{\n\tASoPlayerSpline* PlayerSpline = Cast<ASoPlayerSpline>(ISoSplineWalker::Execute_GetSplineLocationI(Orb).GetSpline());\n\tif (PlayerSpline == nullptr)\n\t\treturn -1;\n\n\tconst auto& CamKeys = PlayerSpline->GetCamNodeList().CamKeys;\n\n\tfloat PrevDist = BIG_NUMBER;\n\tfloat NextDist = BIG_NUMBER;\n\tint32 PrevIx = -1;\n\tint32 NextIx = -1;\n\tif (bOnCamKeyPosition)\n\t\treturn Orb->ActiveCamKey;\n\n\tPrevIx = Orb->ActiveCamKey;\n\tPrevDist = CamKeys[FMath::Clamp(PrevIx, 0, CamKeys.Num() - 1)].SplinePoint.GetDistance();\n\n\tif (Orb->ActiveCamKey + 1 < CamKeys.Num())\n\t{\n\t\tNextIx = Orb->ActiveCamKey + 1;\n\t\tNextDist = CamKeys[NextIx].SplinePoint.GetDistance();\n\t}\n\n\tconst float Dist = ISoSplineWalker::Execute_GetSplineLocationI(Orb).GetDistance();\n\tif (fabs(Dist - PrevDist) > fabs(Dist - NextDist))\n\t\treturn NextIx;\n\treturn PrevIx;\n}\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoACameraEdit::SaveEditedData()\n{\n\tFSoEditorGameInterface::SaveCameraData(Orb->GetWorld());\n\n#if WITH_EDITOR\n\t// reload file in editor world to apply changes\n\tUWorld* EditorWorld = GEditor->GetEditorWorldContext().World();\n\tFSoEditorGameInterface::LoadCameraData(EditorWorld);\n\tUPackage* Package = EditorWorld->GetOutermost();\n\tif (Package != nullptr && !Package->IsDirty())\n\t\tPackage->SetDirtyFlag(true);\n#endif\n}\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoACameraEdit::LoadEditedData()\n{\n\tFSoEditorGameInterface::LoadCameraData(Orb->GetWorld());\n}\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoACameraEdit::CreateKey()\n{\n\tif (!bOnCamKeyPosition)\n\t{\n\t\tFSoSplinePoint SplineLocation = Orb->SoMovement->GetSplineLocation();\n\t\tASoPlayerSpline* PlayerSpline = Cast<ASoPlayerSpline>(SplineLocation.GetSpline());\n\t\tPlayerSpline->GetCamNodeList().CreateNewCamKey(SplineLocation, Orb->ActiveCamKey);\n\t}\n}\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoACameraEdit::MoveClosestKeyHere()\n{\n\tif (bOnCamKeyPosition)\n\t\treturn;\n\n\tFSoSplinePoint SplineLocation = Orb->SoMovement->GetSplineLocation();\n\tASoPlayerSpline* PlayerSpline = Cast<ASoPlayerSpline>(SplineLocation.GetSpline());\n\n\tif (PlayerSpline == nullptr)\n\t\treturn;\n\n\tauto& CamKeys = PlayerSpline->GetCamNodeList().CamKeys;\n\n\tif (Orb->ActiveCamKey == CamKeys.Num() - 1)\n\t\treturn;\n\n\tconst float PrevDist = CamKeys[Orb->ActiveCamKey].SplinePoint.GetDistance();\n\tconst float NextDist = CamKeys[Orb->ActiveCamKey + 1].SplinePoint.GetDistance();\n\tconst float Dist = SplineLocation.GetDistance();\n\n\tif (fabs(Dist - PrevDist) < fabs(Dist - NextDist))\n\t{\n\t\tif (Orb->ActiveCamKey != 0)\n\t\t{\n\t\t\tCamKeys[Orb->ActiveCamKey].SplinePoint = SplineLocation;\n\t\t\tCamKeys[Orb->ActiveCamKey].Distance = SplineLocation.GetDistance();\n\t\t\tbOnCamKeyPosition = true;\n\t\t}\n\t}\n\telse\n\t{\n\t\tif (Orb->ActiveCamKey < CamKeys.Num() - 2)\n\t\t{\n\t\t\tCamKeys[Orb->ActiveCamKey + 1].SplinePoint = SplineLocation;\n\t\t\tCamKeys[Orb->ActiveCamKey + 1].Distance = SplineLocation.GetDistance();\n\t\t\tOrb->ActiveCamKey += 1;\n\t\t\tbOnCamKeyPosition = true;\n\t\t}\n\t}\n}\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// removes KeyNode (first and last is immune)\nvoid USoACameraEdit::DeleteActiveKeyNode()\n{\n\tif (!bOnCamKeyPosition || Orb->ActiveCamKey == 0)\n\t\treturn;\n\n\tFSoSplinePoint SplineLocation = Orb->SoMovement->GetSplineLocation();\n\tASoPlayerSpline* PlayerSpline = Cast<ASoPlayerSpline>(SplineLocation.GetSpline());\n\tauto& CamKeys = PlayerSpline->GetCamNodeList().CamKeys;\n\n\tif (Orb->ActiveCamKey == CamKeys.Num() - 1)\n\t\treturn;\n\n\tCamKeys.RemoveAt(Orb->ActiveCamKey, 1);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoACameraEdit::CopyActiveKeyData()\n{\n\tif (!bOnCamKeyPosition)\n\t\treturn;\n\n\tconst FSoSplinePoint SplineLocation = Orb->SoMovement->GetSplineLocation();\n\tconst ASoPlayerSpline* PlayerSpline = Cast<ASoPlayerSpline>(SplineLocation.GetSpline());\n\tconst auto& CamKeys = PlayerSpline->GetCamNodeList().CamKeys;\n\n\tNodeCopy.CopyParams(CamKeys[Orb->ActiveCamKey], true);\n\tbNodeCopyInitialized = true;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoACameraEdit::PasteToActiveKeyData()\n{\n\tif ((!bOnCamKeyPosition) || (!bNodeCopyInitialized))\n\t\treturn;\n\n\tFSoSplinePoint SplineLocation = Orb->SoMovement->GetSplineLocation();\n\tASoPlayerSpline* PlayerSpline = Cast<ASoPlayerSpline>(SplineLocation.GetSpline());\n\tauto& CamKeys = PlayerSpline->GetCamNodeList().CamKeys;\n\n\tCamKeys[Orb->ActiveCamKey].CopyParams(NodeCopy, false);\n\tbNodeCopyInitialized = true;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoACameraEdit::JumpToNextKey()\n{\n\tconst FSoSplinePoint SplineLocation = Orb->SoMovement->GetSplineLocation();\n\n\tconst ASoPlayerSpline* PlayerSpline = Cast<ASoPlayerSpline>(SplineLocation.GetSpline());\n\tconst auto& CamKeys = PlayerSpline->GetCamNodeList().CamKeys;\n\tOrb->ActiveCamKey = FMath::Min(Orb->ActiveCamKey + 1, CamKeys.Num() - 1);\n\n\tconst FSoSplinePoint CamLocation = CamKeys[Orb->ActiveCamKey].SplinePoint;\n\n\tOrb->SetPositionOnSplineSP(CamLocation, Orb->GetActorLocation().Z, false, false);\n\tbOnCamKeyPosition = true;\n}\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoACameraEdit::JumpToPrevKey()\n{\n\tif (bOnCamKeyPosition)\n\t\tOrb->ActiveCamKey = FMath::Max(Orb->ActiveCamKey - 1, 0);\n\n\tconst FSoSplinePoint SplineLocation = Orb->SoMovement->GetSplineLocation();\n\tconst ASoPlayerSpline* PlayerSpline = Cast<ASoPlayerSpline>(SplineLocation.GetSpline());\n\tconst FSoSplinePoint CamLocation = PlayerSpline->GetCamNodeList().CamKeys[Orb->ActiveCamKey].SplinePoint;\n\n\tOrb->SetPositionOnSplineSP(CamLocation, Orb->GetActorLocation().Z, false, false);\n\tbOnCamKeyPosition = true;\n}\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoACameraEdit::SpecialEditButtonPressed(int32 Index)\n{\n\tauto SplineLocation = Orb->SoMovement->GetSplineLocation();\n\tASoPlayerSpline* PlayerSpline = Cast<ASoPlayerSpline>(SplineLocation.GetSpline());\n\tauto& CamKey = PlayerSpline->GetCamNodeList().CamKeys[Orb->ActiveCamKey];\n\n\tif (Index == 0)\n\t\tCamKey.bUseSplineOnInterpolation = !CamKey.bUseSplineOnInterpolation;\n\telse\n\t{\n\t\tint32 NewValue = (static_cast<int32>(CamKey.InterpolationMethod) + 1) % static_cast<int32>(ESoCamInterpolationMethod::ECIM_NumOf);\n\t\tCamKey.InterpolationMethod = static_cast<ESoCamInterpolationMethod>(NewValue);\n\t}\n}\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoACameraEdit::SuperEditModePressed()\n{\n\tbSuperMode = !bSuperMode;\n\tif (Orb->SoActivity == this)\n\t\tOnSuperModeChange(bSuperMode);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoACameraEdit::ToggleWeapons()\n{\n\t// secret speed mode\n\tMovementSpeed = MovementSpeed > 2000 ? 500 : 4000;\n}\n"
  },
  {
    "path": "Source/SOrb/Character/SoCharStates/SoACameraEdit.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#pragma once\n\n#include \"SoActivity.h\"\n#include \"SplineLogic/SoCameraData.h\"\n#include \"SoACameraEdit.generated.h\"\n\nUSTRUCT(BlueprintType)\nstruct FSoCamKeyPreset\n{\n\tGENERATED_USTRUCT_BODY()\npublic:\n\n\tUPROPERTY(BlueprintReadOnly)\n\tFString Name;\n\n\tUPROPERTY(BlueprintReadOnly)\n\tTArray<FSoCamKeyNode> Variants;\n};\n\nUCLASS()\nclass SORB_API USoACameraEdit : public USoActivity\n{\n\n\tGENERATED_BODY()\n\npublic:\n\n\tUSoACameraEdit();\n\n\tvirtual void Tick(float DeltaSeconds) override;\n\tvirtual void UpdateCamera(float DeltaSeconds) override;\n\n\t// show/hide help text\n\tvirtual void InteractKeyPressed(bool bPrimaryKey) override;\n\t// switch preset subtype\n\tvirtual void DebugFeature() override;\n\n\t// save/load from file\n\tvoid SaveEditedData() override;\n\tvoid LoadEditedData() override;\n\t// add/move/remove key node\n\tvoid CreateKey() override;\n\tvoid MoveClosestKeyHere() override;\n\tvoid DeleteActiveKeyNode() override;\n\t// modify the edge property (KeyNode 0 modifies the behavior between KeyNode 0..1, KeyNode N doesn't do anything)\n\t// if the interpolation is spline based, it calculates with the interpolated spline position, otherwise it interpolates linearly between the two KeyNode\n\tvoid SpecialEditButtonPressed(int32 Index) override;\n\n\tvirtual void CopyActiveKeyData() override;\n\tvirtual void PasteToActiveKeyData() override;\n\n\t// teleport the character into the KeyNode position\n\tvoid JumpToNextKey() override;\n\tvoid JumpToPrevKey() override;\n\n\tvirtual void ToggleWeapons() override;\n\n\tvirtual void SuperEditModePressed() override;\n\n\t// get data for gui\n\tUFUNCTION(BlueprintCallable, Category = Camera)\n\tfloat GetPrevCamKeyNodeSplineDistance() const;\n\n\tUFUNCTION(BlueprintCallable, Category = Camera)\n\tfloat GetNextCamKeyNodeSplineDistance() const;\n\n\tint32 GetClosestCamIndex() const;\n\n\tvirtual bool OnDmgTaken(const FSoDmg& Damage, const FSoHitReactDesc& HitReactDesc) override { return true; }\n\nprotected:\n\n\tvirtual void OnEnter(USoActivity* OldActivity) override;\n\tvirtual void OnExit(USoActivity* NewActivity) override;\n\t\n\tvirtual bool ShouldUpdateMeshFade() const override { return false; }\n\nprotected:\n\n\tUPROPERTY(BlueprintReadOnly, Category = Camera)\n\tbool bOnCamKeyPosition = false;\n\n\tUPROPERTY(BlueprintReadOnly, Category = Camera)\n\tbool bCamEditHintVisible = false;\n\n\t// <Presets>\n\tUPROPERTY(BlueprintReadOnly, Category = Camera)\n\tbool bPresetUsed = false;\n\n\tUPROPERTY(BlueprintReadOnly, Category = Camera)\n\tint32 ActivePreset = 0;\n\n\tUPROPERTY(BlueprintReadOnly, Category = Camera)\n\tint32 ActivePresetSubType = 0;\n\n\tUPROPERTY(BlueprintReadOnly, Category = Camera)\n\tTArray<FSoCamKeyPreset> Presets;\n\t// </Presets>\n\n\n\t// protection from everything + the ability to fly\n\tbool bSuperMode = true;\n\n\tFSoCamKeyNode NodeCopy;\n\tbool bNodeCopyInitialized = false;\n};\n\n"
  },
  {
    "path": "Source/SOrb/Character/SoCharStates/SoACarry.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#include \"SoACarry.h\"\n\n#include \"EngineMinimal.h\" // ANY_PACKAGE enum search\n\n#include \"FMODEvent.h\"\n\n#include \"SoADefault.h\"\n#include \"Interactables/SoCarryable.h\"\n#include \"Interactables/SoInteractableActor.h\"\n#include \"Character/SoCharacter.h\"\n#include \"CharacterBase/SoCharacterMovementComponent.h\"\n#include \"Basic/SoAudioManager.h\"\n\nDEFINE_LOG_CATEGORY_STATIC(LogSoACarry, All, All);\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// set base flags\nUSoACarry::USoACarry() :\n\tUSoActivity(EActivity::EA_Carrying)\n{\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoACarry::OnEnter(USoActivity* OldActivity)\n{\n\tUSoActivity::OnEnter(OldActivity);\n\tOrb->OnInteractionLabelChanged.Broadcast();\n\n\tbCanDrop = false;\n\n\tFAttachmentTransformRules Rules = FAttachmentTransformRules::SnapToTargetNotIncludingScale;\n\tRules.RotationRule = EAttachmentRule::KeepWorld;\n\tOrb->CarriedStuff->AttachToComponent(Orb->GetMesh(), Rules, FName(\"Item\"));\n\tUSoAudioManager::PlaySoundAtLocation(Orb, Orb->SFXCarryStart, FTransform(Orb->GetActorTransform()));\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoACarry::OnExit(USoActivity* NewActivity)\n{\n\tUSoActivity::OnExit(NewActivity);\n\n\tOrb->bShowInteractionTip = true;\n\n\tif (NewActivity != Orb->SoACarryDrop)\n\t{\n\t\tOrb->CarriedStuff->ForceDrop();\n\t\tOrb->CarriedStuff = nullptr;\n\t}\n\n\tOrb->OnInteractionLabelChanged.Broadcast();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoACarry::Tick(float DeltaSeconds)\n{\n\tif (Orb->CarriedStuff != nullptr)\n\t{\n\t\tbCanDrop = CanDrop();\n\t\tif (bCanDrop != Orb->bShowInteractionTip)\n\t\t{\n\t\t\tOrb->bShowInteractionTip = bCanDrop;\n\t\t\tOrb->OnInteractionLabelChanged.Broadcast();\n\t\t}\n\t}\n\n\tSuper::Tick(DeltaSeconds);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// let's drop some junk\nvoid USoACarry::OnInteract(AActor* Interactable)\n{\n\tif (bCanDrop)\n\t{\n\t\tSwitchActivity(Orb->SoACarryDrop);\n\t\tISoInteractable::Execute_Interact(Orb->CarriedStuff, Orb);\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// let's drop some junk\nvoid USoACarry::StrikePressed()\n{\n\tif (bCanDrop)\n\t{\n\t\tSwitchActivity(Orb->SoACarryDrop);\n\t\tISoInteractable::Execute_Interact(Orb->CarriedStuff, Orb);\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoACarry::CanDrop() const\n{\n\tconst FVector Start = Orb->GetActorLocation() + Orb->GetActorForwardVector() * 96;\n\tconst FVector End = Start + Orb->GetActorForwardVector();\n\n\tFCollisionQueryParams TraceParams;\n\tTraceParams.AddIgnoredActor(Orb);\n\tTraceParams.AddIgnoredActor(Orb->CarriedStuff);\n\n\tstatic const FName BlockAllName = FName(\"BlockAllDynamic\");\n\n\tFHitResult HitResult;\n\tFCollisionShape Shape;\n\tShape.SetBox({ 20,20,20 });\n\treturn (!GetWorld()->SweepSingleByProfile(HitResult,\n\t\t\t\t\t\t\t\t\t\t\t  Start,\n\t\t\t\t\t\t\t\t\t\t\t  End,\n\t\t\t\t\t\t\t\t\t\t\t  FQuat::Identity,\n\t\t\t\t\t\t\t\t\t\t\t  BlockAllName,\n\t\t\t\t\t\t\t\t\t\t\t  Shape,\n\t\t\t\t\t\t\t\t\t\t\t  TraceParams));\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoACarry::OnTeleportRequest()\n{\n\tSwitchActivity(Orb->SoADefault);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoACarry::CanInteract() const\n{\n\t// should be always true but whatever\n\treturn Orb->Interactables.Num() > 0;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// set base flags\nUSoACarryDrop::USoACarryDrop() :\n\tUSoActivity(EActivity::EA_DropCarryable)\n{\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoACarryDrop::OnEnter(USoActivity* OldActivity)\n{\n\tUSoActivity::OnEnter(OldActivity);\n\tOrb->OnInteractionLabelChanged.Broadcast();\n\n\tDirectionSign = 1.0f;\n\tCounter = 0.0f;\n\tUSoAudioManager::PlaySoundAtLocation(Orb, Orb->SFXCarryStop, FTransform(Orb->GetActorTransform()));\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoACarryDrop::OnExit(USoActivity* NewActivity)\n{\n\tUSoActivity::OnExit(NewActivity);\n\n\tif (NewActivity != Orb->SoACarry)\n\t{\n\t\tconst FVector Pos = Orb->GetMesh()->GetComponentTransform().TransformPosition(FVector(0.0f, 106.54f, 47.3f));\n\t\tOrb->CarriedStuff->SetActorLocation(Pos);\n\t\tOrb->CarriedStuff->Dropped(!Orb->SoMovement->IsMovingOnGround() && Orb->GetVelocity().Z > -100.0f);\n\t\tOrb->CarriedStuff = nullptr;\n\t}\n\telse\n\t\tOrb->CarriedStuff->CancelDrop();\n\n\tOrb->OnInteractionLabelChanged.Broadcast();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoACarryDrop::Tick(float DeltaSeconds)\n{\n\t// UE_LOG(LogTemp, Warning, TEXT(\"Old Counter: %f DirectionSign: %f DeltaSeconds %f\"), Counter, DirectionSign, DeltaSeconds);\n\tCounter += DeltaSeconds * DirectionSign;\n\tif (Counter >= Duration)\n\t\tSwitchActivity(Orb->SoADefault);\n\telse if (Counter < 0.0f)\n\t\tSwitchActivity(Orb->SoACarry);\n\n\tSuper::Tick(DeltaSeconds);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoACarryDrop::OnAnimEvent(EAnimEvents Event)\n{\n\tconst UEnum* EnumPtr = FindObject<UEnum>(ANY_PACKAGE, TEXT(\"EAnimEvents\"), true);\n\tconst FString EnumName = EnumPtr ? EnumPtr->GetNameStringByIndex(static_cast<int32>(Event)) : \"Invalid EAnimEvents Value\";\n\tUE_LOG(LogSoACarry, Warning, TEXT(\"USoACarryDrop::OnAnimEvent animation event: %s\"), *EnumName);\n\n\tif (Event == EAnimEvents::EAE_OnReleaseCarriedStuffInterrupted)\n\t\tDirectionSign = -1.0f;\n\telse\n\t\tUSoActivity::OnAnimEvent(Event);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoACarryDrop::OnTeleportRequest()\n{\n\tSwitchActivity(Orb->SoADefault);\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n//USoACarryPickUp::USoACarryPickUp() :\n//\tUSoActivity(EActivity::EA_PickUpCarryable)\n//{\n//}\n\n// ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// void USoACarryPickUp::OnEnter(USoActivity* OldActivity)\n// {\n// \tif (Orb->CarriedStuff != nullptr)\n// \t{\n// \t\tconst FVector ObjectLocation = Orb->CarriedStuff->GetActorLocation();\n// \t\tconst FVector CharLocation = Orb->GetActorLocation();\n// \n// \t\tconst FVector CharToObjectDir = (ObjectLocation - CharLocation).GetSafeNormal();\n// \t\tconst FVector CharForward = Orb->GetActorForwardVector();\n// \n// \t\tif ((CharToObjectDir | CharForward) < 0)\n// \t\t{\n// \t\t\tOrb->SetActorRotation((-CharForward).Rotation());\n// \t\t\tUpdateCamera(0.0f);\n// \t\t}\n// \t}\n// \n// \tUSoActivity::OnEnter(OldActivity);\n// \tOrb->OnInteractionLabelChanged.Broadcast();\n// \tCounter = 0.0f;\n// \tUSoAudioManager::PlaySoundAtLocation(Orb, Orb->SFXCarryStart, FTransform(Orb->GetActorTransform()));\n// }\n// \n// ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// void USoACarryPickUp::OnExit(USoActivity* NewActivity)\n// {\n// \tUSoActivity::OnExit(NewActivity);\n// \n// \tif (NewActivity != Orb->SoACarry && NewActivity != Orb->SoACarryDrop)\n// \t{\n// \t\tOrb->CarriedStuff->ForceDrop();\n// \t\tOrb->CarriedStuff = nullptr;\n// \t}\n// \tOrb->OnInteractionLabelChanged.Broadcast();\n// }\n// \n// ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// void USoACarryPickUp::Tick(float DeltaSeconds)\n// {\n// \tconst float NewCounter = Counter + DeltaSeconds;\n// \n// \tif (PickedUpTime > Counter && PickedUpTime <= NewCounter && Orb->CarriedStuff != nullptr)\n// \t{\n// \t\tFAttachmentTransformRules Rules = FAttachmentTransformRules::SnapToTargetNotIncludingScale;\n// \t\tRules.RotationRule = EAttachmentRule::KeepWorld;\n// \t\tOrb->CarriedStuff->AttachToComponent(Orb->GetMesh(), Rules, FName(\"Item\"));\n// \t}\n// \n// \tif (NewCounter >= Duration)\n// \t\tSwitchActivity(Orb->SoACarry);\n// \telse\n// \t\tCounter = NewCounter;\n// \n// \tSuper::Tick(DeltaSeconds);\n// }\n// \n// ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// void USoACarryPickUp::OnTeleportRequest()\n// {\n// \tSwitchActivity(Orb->SoADefault);\n// }\n"
  },
  {
    "path": "Source/SOrb/Character/SoCharStates/SoACarry.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#pragma once\n\n#include \"SoActivity.h\"\n#include \"SoACarry.generated.h\"\n\n// TODO: maybe a single class instead of this 3 different?!\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUCLASS()\nclass SORB_API USoACarry : public USoActivity\n{\n\tGENERATED_BODY()\npublic:\n\n\tUSoACarry();\n\n\tvirtual void Tick(float DeltaSeconds) override;\n\n\t// let's drop the junk we just carried\n\tvirtual void OnInteract(AActor* Interactable) override;\n\tvirtual void StrikePressed() override;\n\n\tvirtual void OnTeleportRequest() override;\n\n\tvirtual bool ShouldDecreaseCollision() const override { return false; }\n\t\n\tvirtual bool CanInteract() const override;\n\nprotected:\n\n\tvirtual void OnEnter(USoActivity* OldActivity) override;\n\tvirtual void OnExit(USoActivity* NewActivity) override;\n\n\n\tvoid TryToDrop();\n\tbool CanDrop() const;\n\n\tbool bCanDrop = false;\n};\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUCLASS()\nclass SORB_API USoACarryDrop : public USoActivity\n{\n\tGENERATED_BODY()\npublic:\n\n\tUSoACarryDrop();\n\n\tvirtual void Tick(float DeltaSeconds) override;\n\n\tvirtual void OnAnimEvent(EAnimEvents Event) override;\n\n\tvirtual void JumpPressed() override {};\n\tvirtual void Move(float Value) override {};\n\n\tvirtual void InteractKeyPressed(bool bPrimary) {};\n\n\tvirtual void OnTeleportRequest() override;\n\n\tvirtual bool ShouldDecreaseCollision() const override { return false; }\n\nprotected:\n\tvirtual void OnEnter(USoActivity* OldActivity) override;\n\tvirtual void OnExit(USoActivity* NewActivity) override;\n\nprotected:\n\t\n\tUPROPERTY(BlueprintReadOnly)\n\tfloat Duration = 0.1f;\n\n\tUPROPERTY(BlueprintReadOnly)\n\tfloat Counter = 0.0f;\n\n\tfloat DirectionSign = 1.0f;\n};\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n//UCLASS()\n//class SORB_API USoACarryPickUp : public USoActivity\n//{\n//\tGENERATED_BODY()\n//public:\n//\n//\tUSoACarryPickUp();\n//\n//\tvirtual void Tick(float DeltaSeconds) override;\n//\n//\tvirtual void JumpPressed() override {};\n//\tvirtual void Move(float Value) override {};\n//\n//\tvirtual void InteractKeyPressed(bool bPrimary) {};\n//\n//\tvirtual void OnTeleportRequest() override;\n//\n//\tvirtual bool ShouldDecreaseCollision() const override { return false; }\n//\n//protected:\n//\tvirtual void OnEnter(USoActivity* OldActivity) override;\n//\tvirtual void OnExit(USoActivity* NewActivity) override;\n//\n//\tUPROPERTY(BlueprintReadOnly)\n//\tfloat Duration = 0.8f;\n//\n//\tfloat PickedUpTime = 0.0f;\n//\t// float PickedUpTime = 0.5f;\n//\n//\tUPROPERTY(BlueprintReadOnly)\n//\tfloat Counter = 0.0f;\n//};\n"
  },
  {
    "path": "Source/SOrb/Character/SoCharStates/SoACharShadowEdit.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#include \"SoACharShadowEdit.h\"\n#include \"EngineUtils.h\"\n#include \"DrawDebugHelpers.h\"\n#include \"Components/SceneCaptureComponent2D.h\"\n\n#include \"SoADefault.h\"\n#include \"Character/SoCharacter.h\"\n#include \"CharacterBase/SoCharacterMovementComponent.h\"\n#include \"SplineLogic/SoPlayerSpline.h\"\n#include \"Components/InputComponent.h\"\n\n#if WITH_EDITOR\n#include \"Editor.h\"\n#endif\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// set base flags\nUSoACharShadowEdit::USoACharShadowEdit() :\n\tUSoActivity(EActivity::EA_CharShadowEdit)\n{\n}\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoACharShadowEdit::OnEnter(USoActivity* OldActivity)\n{\n\tUSoActivity::OnEnter(OldActivity);\n\tOrb->SetEditorWidgetVisibility(ESoEditorUI::EEUI_CharShadow, true);\n\n\tif (bSuperMode)\n\t\tOnSuperModeChange(true);\n}\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoACharShadowEdit::OnExit(USoActivity* NewActivity)\n{\n\tUSoActivity::OnExit(NewActivity);\n\tOrb->SetEditorWidgetVisibility(ESoEditorUI::EEUI_CharShadow, false);\n\n\tif (bSuperMode)\n\t\tOnSuperModeChange(false);\n}\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoACharShadowEdit::Tick(float DeltaSeconds)\n{\n\tUSoActivity::Tick(DeltaSeconds);\n\n\tif (bSuperMode)\n\t\tSuperModeTick(DeltaSeconds);\n\n\tif (!bOnKeyPosition)\n\t\treturn;\n\n\tFSoSplinePoint SplineLocation = Orb->SoMovement->GetSplineLocation();\n\tASoPlayerSpline* PlayerSpline = Cast<ASoPlayerSpline>(SplineLocation.GetSpline());\n\tif (PlayerSpline == nullptr)\n\t\treturn;\n\n\tconst float Distance = SplineLocation.GetDistance();\n\n\tFSoCharShadowNodeList& CharShadowKeys = PlayerSpline->GetCharShadowControlPoints();\n\n\tconst int32 Index = CharShadowKeys.GetClosestIndex(Distance);\n\tif (CharShadowKeys.Keys.IsValidIndex(Index))\n\t{\n\t\tif (fabs(CharShadowKeys.Keys[Index].Distance - Distance) > KINDA_SMALL_NUMBER)\n\t\t\tbOnKeyPosition = false;\n\t}\n\telse\n\t\tbOnKeyPosition = false;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoACharShadowEdit::UpdateCharMaterials(float DeltaSeconds)\n{\n\tSuper::UpdateCharMaterials(DeltaSeconds);\n#if WARRIORB_USE_CHARACTER_SHADOW\n\tDrawDebugLine(Orb->GetWorld(), Orb->GetActorLocation(), Orb->SoScreenCapture->GetComponentLocation(), FColor::Emerald, false, 0.2f);\n#endif // WARRIORB_USE_CHARACTER_SHADOW\n\n\tFSoSplinePoint SplineLocation = Orb->SoMovement->GetSplineLocation();\n\tASoPlayerSpline* PlayerSpline = Cast<ASoPlayerSpline>(SplineLocation.GetSpline());\n\tif (PlayerSpline == nullptr)\n\t\treturn;\n\tauto& Keys = PlayerSpline->GetCharShadowControlPoints().Keys;\n\tif (bOnKeyPosition)\n\t\tif (!Keys.IsValidIndex(Orb->ActiveShadowKey) || fabs(Keys[Orb->ActiveShadowKey].Distance - SplineLocation.GetDistance()) > KINDA_SMALL_NUMBER)\n\t\t\tbOnKeyPosition = false;\n\n\tif (!bOnKeyPosition)\n\t\treturn;\n\n\tconst float DeltaX = Orb->InputComponent->GetAxisValue(\"MouseX\");\n\tconst float DeltaY = Orb->InputComponent->GetAxisValue(\"MouseY\");\n\n\tauto& Key = Keys[Orb->ActiveShadowKey];\n\n\tif (Orb->bLeftMouseBtnPressed)\n\t\tKey.Azimuth = FMath::Fmod(Key.Azimuth + DeltaX * DeltaSeconds + 2 * PI, 2 * PI);\n\n\tif (Orb->bRightMouseBtnPressed)\n\t\tKey.Elevation = FMath::Clamp(Key.Elevation + DeltaY * DeltaSeconds, -PI / 2.0f, PI / 2.0f);\n\n\tif (Orb->bMiddleMousePressed)\n\t\tKey.Strength = FMath::Clamp(Key.Strength + DeltaY * DeltaSeconds, 0.0f, 2.0f);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoACharShadowEdit::InteractKeyPressed(bool bPrimaryKey)\n{\n\tbEditHintVisible = !bEditHintVisible;\n}\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoACharShadowEdit::SaveEditedData()\n{\n#if WITH_EDITOR\n\t// overrides the editor world data from the game world data\n\tTMap<FString, ASoPlayerSpline*> GameSplineMap;\n\tfor (TActorIterator<ASoPlayerSpline> ActorItr(Orb->GetWorld()); ActorItr; ++ActorItr)\n\t\tGameSplineMap.Add((*ActorItr)->GetSplineName(), *ActorItr);\n\n\t// reload file in editor world to apply changes\n\tUWorld* EditorWorld = GEditor->GetEditorWorldContext().World();\n\n\tfor (TActorIterator<ASoPlayerSpline> ActorItr(EditorWorld); ActorItr; ++ActorItr)\n\t{\n\t\tASoPlayerSpline*const* SplinePtrPtr = GameSplineMap.Find((*ActorItr)->GetSplineName());\n\t\tif (SplinePtrPtr == nullptr)\n\t\t\tUE_LOG(LogTemp, Warning, TEXT(\"Spline %s found in editor, does not exist in game - that shouldn't be possible!\"), *(*ActorItr)->GetSplineName())\n\t\telse\n\t\t\t(*ActorItr)->GetCharShadowControlPoints() = (*SplinePtrPtr)->GetCharShadowControlPoints();\n\t}\n\n\tUPackage* Package = EditorWorld->GetOutermost();\n\tif (Package != nullptr && !Package->IsDirty())\n\t\tPackage->SetDirtyFlag(true);\n#endif\n}\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoACharShadowEdit::LoadEditedData()\n{\n\t// no reload here\n\t// user could just leave the game and reenter if he/she/it wants to cancel sky editing\n}\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoACharShadowEdit::CreateKey()\n{\n\tif (!bOnKeyPosition)\n\t{\n\t\tFSoSplinePoint SplineLocation = Orb->SoMovement->GetSplineLocation();\n\t\tASoPlayerSpline* PlayerSpline = Cast<ASoPlayerSpline>(SplineLocation.GetSpline());\n\t\tOrb->ActiveShadowKey = PlayerSpline->GetCharShadowControlPoints().CreateNewKey(SplineLocation.GetDistance(), 0);\n\t\tbOnKeyPosition = true;\n\t}\n}\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoACharShadowEdit::MoveClosestKeyHere()\n{\n\tif (bOnKeyPosition)\n\t\treturn;\n\n\tFSoSplinePoint SplineLocation = Orb->SoMovement->GetSplineLocation();\n\tASoPlayerSpline* PlayerSpline = Cast<ASoPlayerSpline>(SplineLocation.GetSpline());\n\tconst float Distance = SplineLocation.GetDistance();\n\n\tif (PlayerSpline == nullptr)\n\t\treturn;\n\n\tFSoCharShadowNodeList& KeyNodes = PlayerSpline->GetCharShadowControlPoints();\n\n\tif (KeyNodes.Keys.Num() == 0)\n\t\treturn;\n\n\tconst int32 PreIndex = KeyNodes.GetPrevIndex(Distance);\n\tconst int32 PostIndex = KeyNodes.GetNextIndex(Distance);\n\n\tint32 Index = PostIndex;\n\tif (fabs(Distance - KeyNodes.Keys[PreIndex].Distance) < fabs(Distance - KeyNodes.Keys[PostIndex].Distance))\n\t\tIndex = PreIndex;\n\n\tKeyNodes.Keys[Index].Distance = Distance;\n\tbOnKeyPosition = true;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// removes KeyNode\nvoid USoACharShadowEdit::DeleteActiveKeyNode()\n{\n\tif (!bOnKeyPosition)\n\t\treturn;\n\n\tFSoSplinePoint SplineLocation = Orb->SoMovement->GetSplineLocation();\n\tASoPlayerSpline* PlayerSpline = Cast<ASoPlayerSpline>(SplineLocation.GetSpline());\n\tconst float Distance = SplineLocation.GetDistance();\n\n\tif (PlayerSpline == nullptr)\n\t\treturn;\n\n\tFSoCharShadowNodeList& ShadowKeys = PlayerSpline->GetCharShadowControlPoints();\n\tconst int32 Index = ShadowKeys.GetClosestIndex(Distance);\n\n\tif (ShadowKeys.Keys.IsValidIndex(Index))\n\t\tShadowKeys.Keys.RemoveAt(Index);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoACharShadowEdit::CopyActiveKeyData()\n{\n\tif (!bOnKeyPosition)\n\t\treturn;\n\n\tFSoSplinePoint SplineLocation = Orb->SoMovement->GetSplineLocation();\n\tASoPlayerSpline* PlayerSpline = Cast<ASoPlayerSpline>(SplineLocation.GetSpline());\n\tif (PlayerSpline == nullptr)\n\t\treturn;\n\n\tFSoCharShadowNodeList& ShadowKeys = PlayerSpline->GetCharShadowControlPoints();\n\tconst int32 Index = ShadowKeys.GetClosestIndex(SplineLocation.GetDistance());\n\tif (ShadowKeys.Keys.IsValidIndex(Index))\n\t{\n\t\tNodeCopy = ShadowKeys.Keys[Index];\n\t\tbNodeCopyInitialized = true;\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoACharShadowEdit::PasteToActiveKeyData()\n{\n\tif (!bOnKeyPosition || !bNodeCopyInitialized)\n\t\treturn;\n\n\tFSoSplinePoint SplineLocation = Orb->SoMovement->GetSplineLocation();\n\tASoPlayerSpline* PlayerSpline = Cast<ASoPlayerSpline>(SplineLocation.GetSpline());\n\tif (PlayerSpline == nullptr)\n\t\treturn;\n\n\tFSoCharShadowNodeList& ShadowKeys = PlayerSpline->GetCharShadowControlPoints();\n\tconst int32 Index = ShadowKeys.GetClosestIndex(SplineLocation.GetDistance());\n\tif (ShadowKeys.Keys.IsValidIndex(Index))\n\t{\n\t\tconst float Distance = ShadowKeys.Keys[Index].Distance;\n\t\tShadowKeys.Keys[Index] = NodeCopy;\n\t\tShadowKeys.Keys[Index].Distance = Distance;\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoACharShadowEdit::JumpToNextKey()\n{\n\tconst FSoSplinePoint SplineLocation = Orb->SoMovement->GetSplineLocation();\n\tconst ASoPlayerSpline* PlayerSpline = Cast<ASoPlayerSpline>(SplineLocation.GetSpline());\n\tif (PlayerSpline == nullptr)\n\t\treturn;\n\n\tconst FSoCharShadowNodeList& ShadowKeys = PlayerSpline->GetCharShadowControlPoints();\n\n\tint32 Index = 0;\n\tif (bOnKeyPosition)\n\t\tIndex = ShadowKeys.GetClosestIndex(SplineLocation.GetDistance()) + 1;\n\telse\n\t\tIndex = ShadowKeys.GetNextIndex(SplineLocation.GetDistance());\n\n\tif (ShadowKeys.Keys.IsValidIndex(Index))\n\t{\n\t\tFSoSplinePoint KeyPoint = SplineLocation;\n\t\tKeyPoint.SetDistance(ShadowKeys.Keys[Index].Distance);\n\t\tOrb->SetPositionOnSplineSP(KeyPoint, Orb->GetActorLocation().Z, false, false);\n\t\tbOnKeyPosition = true;\n\t}\n\n\tOrb->ActiveShadowKey = Index;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoACharShadowEdit::JumpToPrevKey()\n{\n\tconst FSoSplinePoint SplineLocation = Orb->SoMovement->GetSplineLocation();\n\tconst ASoPlayerSpline* PlayerSpline = Cast<ASoPlayerSpline>(SplineLocation.GetSpline());\n\tif (PlayerSpline == nullptr)\n\t\treturn;\n\n\tconst FSoCharShadowNodeList& ShadowKeys = PlayerSpline->GetCharShadowControlPoints();\n\n\tint32 Index = 0;\n\tif (bOnKeyPosition)\n\t\tIndex = ShadowKeys.GetClosestIndex(SplineLocation.GetDistance()) - 1;\n\telse\n\t\tIndex = ShadowKeys.GetPrevIndex(SplineLocation.GetDistance());\n\n\tif (ShadowKeys.Keys.IsValidIndex(Index))\n\t{\n\t\tFSoSplinePoint KeyPoint = SplineLocation;\n\t\tKeyPoint.SetDistance(ShadowKeys.Keys[Index].Distance);\n\t\tOrb->SetPositionOnSplineSP(KeyPoint, Orb->GetActorLocation().Z, false, false);\n\t\tbOnKeyPosition = true;\n\t}\n\n\tOrb->ActiveShadowKey = Index;\n}\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoACharShadowEdit::SuperEditModePressed()\n{\n\tbSuperMode = !bSuperMode;\n\tif (Orb->SoActivity == this)\n\t\tOnSuperModeChange(bSuperMode);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFSoCharShadowKeyNode USoACharShadowEdit::GetInterpolatedKey() const\n{\n\tconst FSoSplinePoint SplineLocation = Orb->SoMovement->GetSplineLocation();\n\tconst ASoPlayerSpline* PlayerSpline = Cast<ASoPlayerSpline>(SplineLocation.GetSpline());\n\tif (PlayerSpline == nullptr)\n\t\treturn FSoCharShadowKeyNode::GetInvalidKey();\n\n\tconst FSoCharShadowNodeList& ShadowKeys = PlayerSpline->GetCharShadowControlPoints();\n\n\tif (bOnKeyPosition && ShadowKeys.Keys.IsValidIndex(Orb->ActiveShadowKey))\n\t\treturn ShadowKeys.Keys[Orb->ActiveShadowKey];\n\n\tint32 Key = Orb->ActiveShadowKey;\n\treturn ShadowKeys.GetInterpolated(SplineLocation.GetDistance(), Key);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nconst FSoCharShadowKeyNode& USoACharShadowEdit::GetPrevKeyNodeData() const\n{\n\tconst FSoSplinePoint SplineLocation = Orb->SoMovement->GetSplineLocation();\n\tconst ASoPlayerSpline* PlayerSpline = Cast<ASoPlayerSpline>(SplineLocation.GetSpline());\n\tif (PlayerSpline == nullptr)\n\t\treturn FSoCharShadowKeyNode::GetInvalidKey();\n\n\tconst FSoCharShadowNodeList& ShadowKeys = PlayerSpline->GetCharShadowControlPoints();\n\tconst int32 NodeIndex = ShadowKeys.GetPrevIndex(SplineLocation.GetDistance());\n\n\tif (ShadowKeys.Keys.IsValidIndex(NodeIndex))\n\t\treturn ShadowKeys.Keys[NodeIndex];\n\n\treturn FSoCharShadowKeyNode::GetInvalidKey();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nconst FSoCharShadowKeyNode& USoACharShadowEdit::GetNextKeyNodeData() const\n{\n\tconst FSoSplinePoint SplineLocation = Orb->SoMovement->GetSplineLocation();\n\tconst ASoPlayerSpline* PlayerSpline = Cast<ASoPlayerSpline>(SplineLocation.GetSpline());\n\tif (PlayerSpline == nullptr)\n\t\treturn FSoCharShadowKeyNode::GetInvalidKey();\n\n\tconst FSoCharShadowNodeList& ShadowKeys = PlayerSpline->GetCharShadowControlPoints();\n\tconst int32 NodeIndex = ShadowKeys.GetNextIndex(SplineLocation.GetDistance());\n\n\tif (ShadowKeys.Keys.IsValidIndex(NodeIndex))\n\t\treturn ShadowKeys.Keys[NodeIndex];\n\n\treturn FSoCharShadowKeyNode::GetInvalidKey();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nint32 USoACharShadowEdit::GetNodeCount() const\n{\n\tconst FSoSplinePoint SplineLocation = Orb->SoMovement->GetSplineLocation();\n\tconst ASoPlayerSpline* PlayerSpline = Cast<ASoPlayerSpline>(SplineLocation.GetSpline());\n\tif (PlayerSpline == nullptr)\n\t\treturn 0;\n\n\treturn PlayerSpline->GetCharShadowControlPoints().Keys.Num();\n}\n"
  },
  {
    "path": "Source/SOrb/Character/SoCharStates/SoACharShadowEdit.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#pragma once\n\n#include \"SoActivity.h\"\n#include \"SplineLogic/SoCharShadowData.h\"\n#include \"SoACharShadowEdit.generated.h\"\n\n\nUCLASS()\nclass SORB_API USoACharShadowEdit : public USoActivity\n{\n\n\tGENERATED_BODY()\n\npublic:\n\n\tUSoACharShadowEdit();\n\n\tvirtual void Tick(float DeltaSeconds) override;\t\n\tvirtual void UpdateCharMaterials(float DeltaSeconds) override;\n\n\t// show/hide help text\n\tvirtual void InteractKeyPressed(bool bPrimaryKey) override;\n\t\n\t// save/load from file\n\tvoid SaveEditedData() override;\n\tvoid LoadEditedData() override;\n\t// add/move/remove key node\n\tvoid CreateKey() override;\n\tvoid MoveClosestKeyHere() override;\n\tvoid DeleteActiveKeyNode() override;\n\n\tvirtual void CopyActiveKeyData() override;\n\tvirtual void PasteToActiveKeyData() override;\n\n\t// teleport the character into the KeyNode position\n\tvoid JumpToNextKey() override;\n\tvoid JumpToPrevKey() override;\n\n\tvirtual void ToggleWeapons() override {};\n\n\tvirtual void SuperEditModePressed() override;\n\n\t// get data for gui\n\tUFUNCTION(BlueprintCallable, Category = UIInfo)\n\tbool IsOnKey() const { return bOnKeyPosition; }\n\n\tUFUNCTION(BlueprintCallable, Category = UIInfo)\n\tFSoCharShadowKeyNode GetInterpolatedKey() const;\n\n\tUFUNCTION(BlueprintCallable, Category = UIInfo)\n\tconst FSoCharShadowKeyNode& GetPrevKeyNodeData() const;\n\n\tUFUNCTION(BlueprintCallable, Category = UIInfo)\n\tconst FSoCharShadowKeyNode& GetNextKeyNodeData() const;\n\n\tUFUNCTION(BlueprintCallable, Category = UIInfo)\n\tint32 GetNodeCount() const;\n\nprotected:\n\n\tvirtual void OnEnter(USoActivity* OldActivity) override;\n\tvirtual void OnExit(USoActivity* NewActivity) override;\n\nprotected:\n\n\tUPROPERTY(BlueprintReadOnly, Category = Sky)\n\tbool bOnKeyPosition = false;\n\n\tUPROPERTY(BlueprintReadOnly, Category = Sky)\n\tbool bEditHintVisible = false;\n\n\t// protection from everything + the ability to fly\n\tbool bSuperMode = false;\n\n\tFSoCharShadowKeyNode NodeCopy;\n\tbool bNodeCopyInitialized = false;\n};\n\n"
  },
  {
    "path": "Source/SOrb/Character/SoCharStates/SoADead.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#include \"SoADead.h\"\n\n#include \"TimerManager.h\"\n#include \"Components/SkeletalMeshComponent.h\"\n#include \"Particles/ParticleSystemComponent.h\"\n\n#include \"CharacterBase/SoCharacterMovementComponent.h\"\n#include \"Character/SoCharacter.h\"\n#include \"Character/SoSpringArmComponent.h\"\n#include \"Character/SoCharStates/SoATeleport.h\"\n#include \"Character/SoPlayerCharacterSheet.h\"\n#include \"Basic/SoGameMode.h\"\n#include \"Basic/SoGameInstance.h\"\n#include \"Basic/Helpers/SoDateTimeHelper.h\"\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// set base flags\nUSoADead::USoADead() :\n\tUSoActivity(EActivity::EA_Dead)\n{\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoADead::OnEnter(USoActivity* OldActivity)\n{\n\tUSoActivity::OnEnter(OldActivity);\n\n\t// Died :(\n\t// update is needed before we can save the values, because if the character is rotating in air right now they may be wrong\n\t// would be nicer to get the values from the function or simply calculate them, but this works perfectly and less work so why not\n\tUSoActivity::UpdateCamera(0.0f);\n\tSavedCamRotation = Orb->CameraBoom->GetComponentRotation();\n\tSavedCamWorldLocation = Orb->CameraBoom->GetComponentLocation();\n\n\tSetDisabledState();\n\tOrb->SoBreak->Activate(true);\n\n\tOrb->OnMortalDeath.Broadcast();\n\n\tOrb->OnDeathBP(bWithSoulkeeper);\n\tbBanTimeOver = false;\n\n\tfor (int32 i = 0; i < Orb->Cooldowns.Num(); ++i)\n\t\tOrb->CooldownEnded.Broadcast(i, -1.0f, Orb->Cooldowns[i].Object);\n\tOrb->Cooldowns.Empty();\n\n\tCounter = 0.0f;\n\n\tbRevived = false;\n\tbTryToRespawn = false;\n\n\t// Save game\n\tOrb->AutoSave(60.0f);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoADead::Tick(float DeltaSeconds)\n{\n\tif (Counter < GetInputBanTime())\n\t{\n\t\tCounter += DeltaSeconds;\n\t\tif (Counter >= GetInputBanTime())\n\t\t\tbBanTimeOver = true;\n\t}\n\n\tif (bTryToRespawn)\n\t{\n\t\tbRevived = true;\n\t\tOrb->Revive(bWithSoulkeeper, true, bWouldLeaveSpline);\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoADead::InteractKeyPressed(bool bPrimary)\n{\n\tif (bBanTimeOver)\n\t{\n\t\tif (bPrimary)\n\t\t{\n\t\t\tif (ASoPlayerSpline* PlayerSpline = Cast<ASoPlayerSpline>(Orb->SoMovement->GetSplineLocation().GetSpline()))\n\t\t\t\tif (PlayerSpline->GetResPointOverride(true))\n\t\t\t\t{\n\t\t\t\t\tbWouldLeaveSpline = true;\n\t\t\t\t\tbTryToRespawn = true;\n\t\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tbWouldLeaveSpline = false;\n\t\t\tbTryToRespawn = true;\n\t\t}\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoADead::OnExit(USoActivity* NewActivity)\n{\n\tUSoActivity::OnExit(NewActivity);\n\n\tif (NewActivity != Orb->SoATeleport)\n\t{\n\t\tSetEnabledState();\n\t\t// must be some cheat, e.g. switch to super edit mode\n\t\tif (!bRevived)\n\t\t\tOrb->OnRespawn(false);\n\t}\n}\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoADead::UpdateCamera(float DeltaSeconds)\n{\n\tOrb->CameraBoom->SetWorldLocation(SavedCamWorldLocation);\n\tOrb->CameraBoom->SetWorldRotation(SavedCamRotation);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoADead::OverrideCameraData(const FRotator& Rotation, const FVector& Location)\n{\n\tSavedCamWorldLocation = Location;\n\tSavedCamRotation = Rotation;\n\tUpdateCamera(0.0f);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nfloat USoADead::GetInputBanTime() const\n{\n\treturn USoDateTimeHelper::NormalizeTime(InputBanTime);\n}\n"
  },
  {
    "path": "Source/SOrb/Character/SoCharStates/SoADead.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#pragma once\n\n#include \"SoActivity.h\"\n#include \"SoADead.generated.h\"\n\nUCLASS()\nclass SORB_API USoADead : public USoActivity\n{\n\n\tGENERATED_BODY()\n\npublic:\n\n\tUSoADead();\n\n\tvirtual void Tick(float DeltaSeconds) override;\n\n\tvoid SetProperties(bool bWithSK) { bWithSoulkeeper = bWithSK; }\n\n\tvirtual void UseItemFromSlot0() override {};\n\tvirtual void InteractKeyPressed(bool bPrimary) override;\n\n\tvirtual bool DecreaseHealth(const FSoDmg& Damage) override { return false; }\n\tvirtual bool OnDmgTaken(const FSoDmg& Damage, const FSoHitReactDesc& HitReactDesc) override { return false; }\n\n\tvirtual void OnDeath() override {}\n\n\t// input\n\tvirtual void JumpPressed() override {};\n\tvirtual void Move(float Value) override {};\n\tvirtual void ToggleWeapons() override {};\n\n\tvirtual void HandleCollision() override {};\n\tvirtual void OnBaseChanged(AActor* ActualMovementBase) override {};\n\n\tvoid OverrideCameraData(const FRotator& Rotation, const FVector& Location);\n\n\tvirtual bool CanBeInterrupted(EActivity DesiredState = EActivity::EA_Max) const override { return DesiredState == EActivity::EA_Teleport; }\n\n\tvirtual void UpdateCamera(float DeltaSeconds) override;\n\n\tUFUNCTION(BlueprintPure, Category = \">Time\")\n\tfloat GetInputBanTime() const;\n\nprotected:\n\tvirtual void OnEnter(USoActivity* OldActivity) override;\n\tvirtual void OnExit(USoActivity* NewActivity) override;\n\n\n\tvirtual bool ShouldUpdateMeshFade() const override { return false; }\n\nprotected:\n\n\tFRotator SavedCamRotation;\n\tFVector SavedCamWorldLocation;\n\n\tbool bWithSoulkeeper = false;\n\n\tbool bBanTimeOver = false;\n\n\tUPROPERTY(EditAnywhere, Category = \">Time\")\n\tfloat InputBanTime = 0.2f;\n\n\tUPROPERTY(BlueprintReadOnly)\n\tfloat Counter = 0.0f;\n\n\tbool bRevived = false;\n\n\tbool bTryToRespawn = false;\n\tbool bWouldLeaveSpline = false;\n};\n"
  },
  {
    "path": "Source/SOrb/Character/SoCharStates/SoADefault.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#include \"SoADefault.h\"\n#include \"Kismet/GameplayStatics.h\"\n\n#include \"Character/SoCharacter.h\"\n#include \"Basic/SoAudioManager.h\"\n#include \"Character/SoWizard.h\"\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUSoADefault::USoADefault() :\n\tUSoActivity(EActivity::EA_Default)\n{\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoADefault::OnLanded()\n{\n\tUSoAudioManager::PlaySoundAtLocation(Orb, Orb->SFXFLegLand, FTransform(Orb->GetActorTransform()));\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoADefault::Tick(float DeltaSeconds)\n{\n\tSuper::Tick(DeltaSeconds);\n\n\tif (Orb->InterruptedWizardDialogue != nullptr)\n\t\tOrb->SoWizard->ResumeDialogueWithPlayer();\n}\n"
  },
  {
    "path": "Source/SOrb/Character/SoCharStates/SoADefault.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#pragma once\n\n#include \"SoActivity.h\"\n#include \"SoADefault.generated.h\"\n\n\nUCLASS()\nclass SORB_API USoADefault : public USoActivity\n{\n\tGENERATED_BODY()\npublic:\n\tUSoADefault();\n\n\tvirtual void Tick(float DeltaSeconds) override;\n\nprotected:\n\n\tvirtual bool CanBeInterrupted(EActivity DesiredState = EActivity::EA_Max) const override { return true; }\n\n\tvirtual bool CanJumpFromAir() const override { return true; }\n\tvirtual void OnLanded() override;\n\n\tfriend class ASoCharacter;\n};\n"
  },
  {
    "path": "Source/SOrb/Character/SoCharStates/SoAHitReact.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#include \"SoAHitReact.h\"\n\n#include \"Components/CapsuleComponent.h\"\n#include \"Components/SkeletalMeshComponent.h\"\n#include \"TimerManager.h\"\n#include \"Kismet/GameplayStatics.h\"\n#include \"Components/StaticMeshComponent.h\"\n#include \"Engine/StaticMeshActor.h\"\n#include \"Particles/ParticleSystemComponent.h\"\n\n#include \"SoADead.h\"\n#include \"SoARoll.h\"\n#include \"CharacterBase/SoCharacterMovementComponent.h\"\n#include \"Character/SoCharacter.h\"\n#include \"Character/SoSpringArmComponent.h\"\n#include \"Character/SoPlayerCharacterSheet.h\"\n#include \"Basic/SoAudioManager.h\"\n#include \"Basic/SoGameMode.h\"\n\nconst float HitReactVelocity = 600.f;\nconst float HitReactVelocityZ = 300.f;\n\nDEFINE_LOG_CATEGORY_STATIC(LogSoAHitReact, All, All);\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// set base flags\nUSoAHitReact::USoAHitReact() :\n\tUSoActivity(EActivity::EA_HitReact)\n{\n\tLookDirection = ESoLookDirection::ELD_Frozen;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoAHitReact::OnEnter(USoActivity* OldActivity)\n{\n\tif (CanBeArmedState())\n\t\tbArmed = OldActivity->IsArmedState();\n\n\tUSoActivity::OnEnter(OldActivity);\n\n\tbReturnToArmed = OldActivity->IsArmedState();\n\tCurrentTime = 0.0f;\n\n\tif (HitReactType == ESoHitReactType::EHR_FallToDeath)\n\t\tOrb->GetCapsuleComponent()->SetCollisionProfileName(DisabledCollisionProfileName);\n\n\tOrb->bFreezeOrientationUntilLand = true;\n\n\t// stop hit trails\n\tfor (auto& Trail : Orb->WeaponTrailMeshFadeList)\n\t{\n\t\tstatic const FName SlideValueName = FName(\"Slide\");\n\t\tTrail.Mesh->GetStaticMeshComponent()->SetScalarParameterValueOnMaterials(SlideValueName, 1.0f);\n\n\t\tTrail.Mesh->GetStaticMeshComponent()->SetVisibility(false);\n\t\tTrail.Mesh->DetachFromActor(FDetachmentTransformRules::KeepWorldTransform);\n\t\tOrb->WeaponTrailMeshes.Add(Trail.Mesh);\n\t}\n\tOrb->WeaponTrailMeshFadeList.Empty();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoAHitReact::OnExit(USoActivity* NewActivity)\n{\n\tswitch (HitReactType)\n\t{\n\t\tcase ESoHitReactType::EHR_FallToDeath:\n\t\t\tOrb->GetCapsuleComponent()->SetCollisionProfileName(EnabledCollisionProfileName);\n\t\tcase ESoHitReactType::EHR_BreakIntoPieces:\n\t\t\tOrb->SoMovement->StopMovementImmediately();\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tbreak;\n\t}\n\n\tUSoActivity::OnExit(NewActivity);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoAHitReact::Tick(float DeltaSeconds)\n{\n\tUSoActivity::Tick(DeltaSeconds);\n\n\t// Orb->DynamicAnimValue = (bMoveToLookDir ? 2.0f : -2.0f) * (Orb->SoMovement->Velocity.Size2D() / Orb->SoMovement->MaxWalkSpeed);\n\tUpdateRollAnimDynamicValue();\n\n\tCurrentTime += DeltaSeconds;\n\tif (CurrentTime > Duration)\n\t{\n\t\t// switch to death, only legit if we fall to death\n\t\tif (!Orb->SoCharacterSheet->IsAlive())\n\t\t{\n\t\t\tif (HitReactType != ESoHitReactType::EHR_FallToDeath)\n\t\t\t\tUE_LOG(LogSoAHitReact, Error, TEXT(\"End of hitreact, the character is dead but he should not be?! (%d\"), static_cast<int32>(HitReactType));\n\n\t\t\tUSoActivity::OnDeath();\n\t\t\tOrb->SoADead->OverrideCameraData(SavedCamRotation, SavedCamWorldLocation);\n\t\t\treturn;\n\t\t}\n\n\t\t// these hitreacts require respawn at splinepoint attached to the damage dealer\n\t\tif (HitReactType == ESoHitReactType::EHR_BreakIntoPieces || HitReactType == ESoHitReactType::EHR_FallToDeath)\n\t\t{\n\t\t\tif (StoredSplineLocation.IsValid())\n\t\t\t{\n\t\t\t\tif (Orb->IsSoulkeeperActive())\n\t\t\t\t{\n\t\t\t\t\tconst FSoSplinePoint& OrbSplinePoint = Orb->SoMovement->GetSplineLocation();\n\t\t\t\t\t// use soulkeeper if that is closer and placed\n\t\t\t\t\tconst FVector2D DistanceRematPoint = FVector2D(OrbSplinePoint - StoredSplineLocation,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t   Orb->GetActorLocation().Z - StoredSplineLocation.GetReferenceZ());\n\t\t\t\t\tconst FVector2D DistanceSoulkeeper = FVector2D(OrbSplinePoint - Orb->ResLocation, Orb->GetActorLocation().Z - Orb->ResLocationZValue);\n\t\t\t\t\tif (DistanceSoulkeeper.SizeSquared() < DistanceRematPoint.SizeSquared())\n\t\t\t\t\t{\n\t\t\t\t\t\tStoredSplineLocation = Orb->ResLocation;\n\t\t\t\t\t\tStoredSplineLocation.SetReferenceActor(nullptr);\n\t\t\t\t\t\tStoredSplineLocation.SetReferenceZ(Orb->ResLocationZValue);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tOrb->OnPlayerRematerialized.Broadcast();\n\t\t\t\tOrb->SetPositionOnSplineSP(StoredSplineLocation, StoredSplineLocation.GetReferenceZ());\n\t\t\t\tif (HitReactType == ESoHitReactType::EHR_BreakIntoPieces)\n\t\t\t\t{\n\t\t\t\t\tOrb->OnRematerialized();\n\t\t\t\t\tSetEnabledState();\n\t\t\t\t\tOrb->MovementStopMultiplier = 0;\n\t\t\t\t}\n\t\t\t\tOrb->SoQuickTeleportPost->Activate(true);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tUE_LOG(LogSoAHitReact, Error, TEXT(\"Character should be respawned but the respawn point isn't setup properly?!\"));\n\t\t\t\tUSoActivity::OnDeath();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tSwitchToRelevantState(false);\n\t\t}\n\n\t\tSwitchToRelevantState(true);\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoAHitReact::OnDmgTaken(const FSoDmg& Damage, const FSoHitReactDesc& HitReactDesc)\n{\n\tswitch (HitReactType)\n\t{\n\t\tcase ESoHitReactType::EHR_FallToDeath:\n\t\tcase ESoHitReactType::EHR_BreakIntoPieces:\n\t\t\treturn true;\n\n\t\tdefault:\n\t\t\treturn USoActivity::OnDmgTaken(Damage, HitReactDesc);\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoAHitReact::DecreaseHealth(const FSoDmg& Damage)\n{\n\treturn Orb->SoCharacterSheet->IsAlive();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoAHitReact::Activate(const FSoHitReactDesc& Desc, bool bAliveIfPossible)\n{\n\tStoredSplineLocation.Invalidate();\n\n\t// if char is hitreacting only certain type can be overriden by some type\n\t// the reason for this is not to fall through respawn based damage boxes while being in other hitreact\n\tif (Orb->SoActivity == this)\n\t{\n\t\tif (HitReactType == ESoHitReactType::EHR_FallToDeath || HitReactType == ESoHitReactType::EHR_BreakIntoPieces)\n\t\t\treturn true;\n\n\t\tif (Desc.HitReact != ESoHitReactType::EHR_FallToDeath && Desc.HitReact != ESoHitReactType::EHR_BreakIntoPieces)\n\t\t\treturn true;\n\t}\n\n\tif (!bAliveIfPossible && Desc.HitReact != ESoHitReactType::EHR_FallToDeath)\n\t{\n\t\tUSoAudioManager::PlaySoundAtLocation(Orb, Orb->SFXFBreakIntoPieces, Orb->GetActorTransform());\n\t\tOnDeath();\n\t\treturn false;\n\t}\n\n\tOrb->OnDamageTaken.Broadcast();\n\n\tbShouldPlayAnim = false;\n\tHitReactType = Desc.HitReact;\n\tbArmed = false;\n\n\tif (HitReactType != ESoHitReactType::EHR_FallToDeath && HitReactType != ESoHitReactType::EHR_BreakIntoPieces)\n\t{\n\t\tif (Orb->MaterialAnimations.Num() > 0)\n\t\t\tOrb->MaterialAnimations[0].Counter = 0.0f;\n\t\tOrb->OnDisplayVisualEffect(ESoVisualEffect::EVE_Damaged);\n\t}\n\tswitch (Desc.HitReact)\n\t{\n\t\tcase ESoHitReactType::EHR_JumpAwayLight:\n\n\t\t\tbForceStayInTime = true;\n\t\t\tOrb->gTimerManager->SetTimer(ForceAnimInTimer, this, &USoAHitReact::OnForceHitReactAnimTimeOver, JumpAwayTime, false);\n\n\t\tcase ESoHitReactType::EHR_JumpAway:\n\t\t{\n\t\t\tDuration = (HitReactType == ESoHitReactType::EHR_JumpAway) ? JumpAwayTime : JumpAwayTimeLight;\n\t\t\tbShouldPlayAnim = true;\n\t\t\tint32 DirModifier = Desc.OutDir;\n\t\t\tif (Desc.OutDir == 0 && Desc.AssociatedActor != nullptr)\n\t\t\t{\n\t\t\t\tconst FVector Dir = (Orb->GetActorLocation() - Desc.AssociatedActor->GetActorLocation()).GetSafeNormal();\n\t\t\t\tDirModifier = (FVector2D(Orb->SoMovement->GetSplineLocation().GetDirection()) | FVector2D(Dir)) > 0 ? 1 : -1;\n\t\t\t}\n\n\t\t\tconst FVector VelocityDir = Orb->SoMovement->GetSplineLocation().GetDirection() * DirModifier;\n\t\t\tOrb->SoMovement->Velocity = VelocityDir * HitReactVelocity;\n\t\t\tOrb->SoMovement->Velocity.Z = HitReactVelocityZ;\n\t\t\tOrb->SoMovement->SetMovementMode(MOVE_Falling);\n\t\t\tOrb->SoActivity->SwitchActivity(Orb->SoAHitReact);\n\n\t\t\tbMoveToLookDir = FVector::DotProduct(VelocityDir, Orb->GetActorForwardVector()) > 0;\n\t\t}\n\t\tbreak;\n\n\t\tcase ESoHitReactType::EHR_Pushed:\n\t\t{\n\t\t\tbShouldPlayAnim = true;\n\t\t\tDuration = Desc.PushDesc.StunDuration > 0.0f ? Desc.PushDesc.StunDuration : PushedStunTime;\n\t\t\tOrb->SoActivity->SwitchActivity(Orb->SoAHitReact);\n\t\t\tconst FVector Dir = (Orb->GetActorLocation() - Desc.AssociatedActor->GetActorLocation()).GetSafeNormal();\n\t\t\tconst int32 DirModifier = (FVector2D(Orb->SoMovement->GetSplineLocation().GetDirection()) | FVector2D(Dir)) > 0 ? 1 : -1;\n\t\t\tconst float VerticalVelocity = Orb->SoMovement->IsMovingOnGround() ? FMath::Abs(Desc.PushDesc.VerticalVelocity) : Desc.PushDesc.VerticalVelocity;\n\t\t\tOrb->SoMovement->Push(FVector2D(Desc.PushDesc.HorizontalVelocity * DirModifier, VerticalVelocity));\n\t\t}\n\t\tbreak;\n\n\t\tcase ESoHitReactType::EHR_BreakIntoPieces:\n\t\t{\n\t\t\tbool bHandled = false;\n\t\t\tif (Desc.AssociatedActor != nullptr && Desc.AssociatedActor->GetClass()->ImplementsInterface(USoSplineWalker::StaticClass()))\n\t\t\t{\n\t\t\t\tconst FSoSplinePoint RespawnPoint = ISoSplineWalker::Execute_GetSplineLocationI(Desc.AssociatedActor);\n\t\t\t\tif (RespawnPoint.IsValid())\n\t\t\t\t{\n\t\t\t\t\tOrb->OnBreakIntoPieces();\n\t\t\t\t\tOrb->SoBreak->Activate(true);\n\t\t\t\t\tbHandled = true;\n\t\t\t\t\tSaveCamValues();\n\t\t\t\t\tSetDisabledState();\n\t\t\t\t\tDuration = BreakIntoPiecesTime;\n\t\t\t\t\tStoredSplineLocation = RespawnPoint;\n\t\t\t\t\tOrb->SoActivity->SwitchActivity(Orb->SoAHitReact);\n\t\t\t\t}\n\t\t\t}\n\t\t\tUSoAudioManager::PlaySoundAtLocation(Orb, Orb->SFXFBreakIntoPieces, Orb->GetActorTransform());\n\t\t\tif (!bHandled)\n\t\t\t{\n\t\t\t\tif (Desc.AssociatedActor != nullptr)\n\t\t\t\t\tUE_LOG(LogSoAHitReact, Error, TEXT(\"Failed to respawn - Associated Actor %s does not implement USoSplineWalker interface!!!\"), *Desc.AssociatedActor->GetName())\n\t\t\t\telse\n\t\t\t\t\tUE_LOG(LogSoAHitReact, Error, TEXT(\"Failed to respawn - no respawn point defined\"));\n\t\t\t\tOnDeath();\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t\tbreak;\n\n\t\tcase ESoHitReactType::EHR_FallToDeath:\n\t\t{\n\t\t\tDuration = FallToDeathTime;\n\t\t\tSaveCamValues();\n\t\t\tif (Desc.AssociatedActor != nullptr && Desc.AssociatedActor->GetClass()->ImplementsInterface(USoSplineWalker::StaticClass()))\n\t\t\t\tStoredSplineLocation = ISoSplineWalker::Execute_GetSplineLocationI(Desc.AssociatedActor);\n\n\t\t\tOrb->SoActivity->SwitchActivity(Orb->SoAHitReact);\n\t\t\tUSoAudioManager::PlaySoundAtLocation(Orb, Orb->SFXFFallToDeath, Orb->GetActorTransform());\n\t\t}\n\t\tbreak;\n\n\t\tdefault:\n\t\t\tbreak;\n\t}\n\n\treturn true;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoAHitReact::SaveCamValues()\n{\n\t// update is needed before we can save the values, because if the character is rotating in air right now they may be wrong\n\t// would be nicer to get the values from the function or simply calculate them, but this works perfectly and less work so why not\n\tUSoActivity::UpdateCamera(0.0f);\n\tSavedCamRotation = Orb->CameraBoom->GetComponentRotation();\n\tSavedCamWorldLocation = Orb->CameraBoom->GetComponentLocation();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoAHitReact::ShouldBounceOnHit(float& OutStepUpHitVelocity, float& OutBounceDamping, const FHitResult* HitResult) const\n{\n\tif (HitResult != nullptr && HitResult->GetActor() != nullptr && HitResult->GetActor()->ActorHasTag(NoBounceSurface))\n\t\treturn false;\n\n\tOutStepUpHitVelocity = Orb->GetRollJumpHeight(0) / 2.f;\n\tOutBounceDamping = 0.6;\n\treturn true;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoAHitReact::OnPreLanded(const FHitResult& Hit)\n{\n\tif (Orb->SoMovement->Velocity.Z < -KINDA_SMALL_NUMBER)\n\t{\n\t\tOrb->SoMovement->Velocity.Z *= -1;\n\t\tOrb->OnRollHitBP(Hit.ImpactPoint, Hit.ImpactNormal, false);\n\t\treturn false;\n\t}\n\treturn true;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoAHitReact::OnBounce(bool bWallJump, float NewStoredMoveValue, const FVector& HitPoint, const FVector& HitNormal)\n{\n\tOrb->SpawnBounceEffects(bWallJump, HitPoint);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoAHitReact::UpdateCamera(float DeltaSeconds)\n{\n\tif (HitReactType == ESoHitReactType::EHR_BreakIntoPieces ||\n\t\tHitReactType == ESoHitReactType::EHR_FallToDeath)\n\t{\n\t\tOrb->CameraBoom->SetWorldLocation(SavedCamWorldLocation);\n\t\tOrb->CameraBoom->SetWorldRotation(SavedCamRotation);\n\t}\n\telse\n\t\tUSoActivity::UpdateCamera(DeltaSeconds);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoAHitReact::CanBeArmedState() const\n{\n\treturn HitReactType != ESoHitReactType::EHR_BreakIntoPieces;\n}\n"
  },
  {
    "path": "Source/SOrb/Character/SoCharStates/SoAHitReact.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#pragma once\n\n#include \"SoActivity.h\"\n#include \"SplineLogic/SoSplinePoint.h\"\n#include \"SoAHitReact.generated.h\"\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUCLASS()\nclass SORB_API USoAHitReact : public USoActivity\n{\n\tGENERATED_BODY()\npublic:\n\tUSoAHitReact();\n\n\t/**\n\t *  Called when HitReact is not active, may or may not switch to HitReact state!!!\n\t *  bAliveIfPossible: if the character's hit point count is still greater than 0\n\t *  \n\t *\t@return: if false we had to die\n\t */ \n\tbool Activate(const FSoHitReactDesc& Desc, bool bAliveIfPossible);\n\n\tvirtual void Tick(float DeltaSeconds) override;\n\n\tvirtual bool OnDmgTaken(const FSoDmg& Damage, const FSoHitReactDesc& HitReactDesc) override;\n\tvirtual bool DecreaseHealth(const FSoDmg& Damage) override;\n\n\t// time to... stop copy pasting comments\n\tvirtual bool OnPreLanded(const FHitResult& Hit) override;\n\t// input\n\tvirtual void JumpPressed() override {};\n\tvirtual void Move(float Value) override {};\n\n\t\n\tvirtual bool BlocksTeleportRequest() const override { return true; }\n\n\tvirtual bool ShouldBounceOnHit(float& OutStepUpHitVelocity, float& OutBounceDamping, const FHitResult* HitResult) const override;\n\tvirtual void OnBounce(bool bWallJump, float NewStoredMoveValue, const FVector& HitPoint, const FVector& HitNormal) override;\n\t\n\tvoid SetDuration(float InDuration);\n\n\tUFUNCTION()\n\tvoid OnForceHitReactAnimTimeOver() { bForceStayInTime = false; }\n\nprotected:\n\tvirtual void OnEnter(USoActivity* OldActivity) override;\n\tvirtual void OnExit(USoActivity* NewActivity) override;\n\n\tvirtual void UpdateCamera(float DeltaSeconds) override;\n\n\tvirtual bool CanBeArmedState() const;\n\n\tvoid SaveCamValues();\n\n\tUPROPERTY(EditAnywhere)\n\tfloat BreakIntoPiecesTime = 0.8f;\n\n\tUPROPERTY(EditAnywhere)\n\tfloat FallToDeathTime = 1.0f;\n\n\tUPROPERTY(EditAnywhere)\n\tfloat PushedStunTime = 0.4f;\n\n\tUPROPERTY(EditAnywhere)\n\tfloat JumpAwayTime = 0.4f;\n\n\tUPROPERTY(EditAnywhere)\n\tfloat JumpAwayTimeLight = 0.1f;\n\n\t/** whether movement and face direction is the same or opposite */\n\tUPROPERTY(BlueprintReadOnly)\n\tbool bMoveToLookDir;\n\n\n\tbool bReturnToArmed;\n\tfloat Duration;\n\tfloat CurrentTime;\n\n\tESoHitReactType HitReactType;\n\n\tUPROPERTY(BlueprintReadOnly)\n\tbool bShouldPlayAnim;\n\n\tUPROPERTY(BlueprintReadOnly)\n\tbool bForceStayInTime = false;\n\n\tFSoSplinePoint StoredSplineLocation;\n\n\tFRotator SavedCamRotation;\n\tFVector SavedCamWorldLocation;\n\n\tFTimerHandle ForceAnimInTimer;\n};\ninline void USoAHitReact::SetDuration(float InDuration) { Duration = InDuration; }\n"
  },
  {
    "path": "Source/SOrb/Character/SoCharStates/SoAInUI.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#include \"SoAInUI.h\"\n\n#include \"DlgManager.h\"\n#include \"DlgContext.h\"\n#include \"DlgDialogue.h\"\n\n#include \"SoADefault.h\"\n#include \"SoARoll.h\"\n\n#include \"Character/SoWizard.h\"\n#include \"Character/SoPlayerCharacterSheet.h\"\n#include \"Character/SoCharacter.h\"\n#include \"CharacterBase/SoCharacterMovementComponent.h\"\n#include \"Basic/Helpers/SoPlatformHelper.h\"\n#include \"UI/InGame/Spells/SoUISpellCastSwitch.h\"\n#include \"Basic/SoGameInstance.h\"\n#include \"Settings/SoGameSettings.h\"\n#include \"Settings/Input/SoInputHelper.h\"\n\nDEFINE_LOG_CATEGORY_STATIC(LogSoAInUI, All, All);\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// set base flags\nUSoAInUI::USoAInUI() :\n\tUSoActivity(EActivity::EA_InUI)\n{\n}\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoAInUI::OnEnter(USoActivity* OldActivity)\n{\n\tif (OldActivity != nullptr)\n\t{\n\t\tbLastCollisionWasDecreased = OldActivity->ShouldDecreaseCollision();\n\t\tbArmed = OldActivity->IsArmedState();\n\t}\n\n\tSuper::OnEnter(OldActivity);\n\n\tif (!bRollAllowed)\n\t\tOrb->bRollPressed = false;\n\n\tOrb->bLockForwardVecPressed = false;\n\tOrb->bUmbrellaPressed = false;\n\tOrb->bMiddleMousePressed = false;\n\tOrb->bCtrlPressed = false;\n\tOrb->bLeftMouseBtnPressed = false;\n\tOrb->bRightMouseBtnPressed = false;\n\n\tOrb->bShowInteractionTip = false;\n\tOrb->OnInteractionLabelChanged.Broadcast();\n\n\tbDialogueWasLast = ActiveUIActivity != nullptr && ActiveUIActivity->GetClass() == DialoguePanelClass;\n\tbArmAllowed = true;\n\tif (ActiveUIActivity != nullptr)\n\t{\n\t\tbArmAllowed = ActiveUIActivity->IsArmedStateAllowedOnLeave();\n\t\tbArmed = bArmed && bArmAllowed;\n\t}\n\n\tif (bDialogueWasLast || ActiveUIActivity->GetClass() == RestClass)\n\t{\n\t\tSave();\n\t}\n\n\tOrb->SetGameInputBlockedByUI(USoInputHelper::IsLastInputFromGamepad(this));\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoAInUI::OnExit(USoActivity* NewActivity)\n{\n\tif (ActiveUIActivity != nullptr)\n\t{\n\t\tActiveUIActivity->SetInGameActivityEnabled(nullptr, false);\n\n\t\tif (ActiveUIActivity->ShouldHideUIElements())\n\t\t\tOrb->ChangeUIVisibility.Broadcast(true);\n\t}\n\telse\n\t\tOrb->ChangeUIVisibility.Broadcast(true);\n\n\tif (bDialogueWasLast)\n\t\tSave();\n\n\tActiveUIActivity = nullptr;\n\n\tSuper::OnExit(NewActivity);\n\n\tOrb->bShowInteractionTip = true;\n\tOrb->OnInteractionLabelChanged.Broadcast();\n\n\tOrb->SetGameInputBlockedByUI(false);\n\tbRollAllowed = false;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoAInUI::OnPostExit(USoActivity* NewActivity)\n{\n\tOnUILeft.Broadcast();\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoAInUI::Tick(float DeltaSeconds)\n{\n\tSuper::Tick(DeltaSeconds);\n\n\tif (InputBlockCounter > -1.0f)\n\t\tInputBlockCounter -= DeltaSeconds;\n\n\tif (ActiveUIActivity == nullptr || !ActiveUIActivity->Update(DeltaSeconds))\n\t{\n\t\tif (LastIngameActivity != nullptr)\n\t\t\tEnter(nullptr, LastIngameActivity->GetClass());\n\t\telse if (ActivityToEnterAfterLeave != nullptr)\n\t\t{\n\t\t\tSwitchActivity(ActivityToEnterAfterLeave);\n\t\t\tActivityToEnterAfterLeave = nullptr;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif (bRollAllowed && Orb->bRollPressed)\n\t\t\t\tSwitchActivity(Orb->SoARoll);\n\t\t\telse\n\t\t\t\tSwitchToRelevantState(bArmAllowed);\n\t\t}\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoAInUI::HandleUICommand(FKey Key, ESoUICommand Command)\n{\n\t//UE_LOG(LogSoCharActivity, Warning, TEXT(\"USoAInUI::HandleUICommand Key = %s, Command = %s\"), *Key.GetFName().ToString(), *FSoInputActionName::UICommandToActionName(Command).ToString());\n\n\tif (!CanHandleUICommand(Command) || InputBlockCounter > 0.0f)\n\t\treturn;\n\n\tbool bHandleInMainMenu = Orb->IsMainMenuOpened();\n\tif (!bHandleInMainMenu)\n\t{\n\t\t// ignore time dilation if the game speed is boosted for debug\n\t\tif (USoPlatformHelper::IsGamePaused(Orb) ||\n\t\t\t(USoGameSettings::Get().IsTemporaryGameSpeedChanged() && USoGameSettings::Get().GetTemporaryGameSpeed() < 1.0f))\n\t\t{\n\t\t\t// Only works if activity works in paused game or dilated time\n\t\t\tif (ActiveUIActivity &&\n\t\t\t\t(ActiveUIActivity->IsActiveInPausedGame() || ActiveUIActivity->IsActiveInDilatedTime(USoGameSettings::Get().GetGameSpeed())))\n\t\t\t{\n\t\t\t\tbHandleInMainMenu = !ActiveUIActivity->HandleCommand(Command);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tbHandleInMainMenu = true;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// Running\n\t\t\tbHandleInMainMenu = ActiveUIActivity == nullptr || !ActiveUIActivity->HandleCommand(Command);\n\t\t}\n\t}\n\n\t// Let the Menu Handle it\n\tif (bHandleInMainMenu)\n\t\tForwardCommandToMainMenu(Command);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoAInUI::IsSaveAllowed() const\n{\n\tif (ActiveUIActivity == nullptr)\n\t\treturn true;\n\n\treturn ActiveUIActivity->GetClass() != DialoguePanelClass || bForceAllowSave;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoAInUI::ToggleCharacterPanels()\n{\n\tif (Orb->IsMainMenuOpened())\n\t\treturn;\n\n\t// if it was already open let's just close it\n\tif (ActiveUIActivity != nullptr && ActiveUIActivity->GetClass() == CharacterPanelsClass)\n\t\tSwitchToRelevantState(bArmAllowed);\n\telse if (Orb->SoActivity != this && Orb->SoActivity->CanOpenCharacterPanels())\n\t\tEnter(nullptr, CharacterPanelsClass);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoAInUI::ToggleSpells(bool bQuickSelectionMode)\n{\n\tif (Orb->IsMainMenuOpened())\n\t\treturn;\n\n\t// Only if not current state\n\tif (ActiveUIActivity == nullptr && Orb->GetPlayerCharacterSheet()->CanUseSpells())\n\t{\n\t\tUSoUISpellCastSwitch* CastSwitch = Cast<USoUISpellCastSwitch>(GetInGameUIActivity(SpellCastSwitchClass));\n\t\tif (!CastSwitch)\n\t\t\treturn;\n\n\t\tCastSwitch->SetQuickSelectionMode(bQuickSelectionMode);\n\t\tif (!CastSwitch->CanBeOpened())\n\t\t{\n\t\t\t//UE_LOG(LogTemp, Warning, TEXT(\"Can't open USoUISpellCastSwitch yet\"));\n\t\t\treturn;\n\t\t}\n\n\t\tbRollAllowed = true;\n\t\tStartSpellCastSwitch();\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoAInUI::IsSpellCastSwitchOpen() const\n{\n\tif (USoInGameUIActivity* UIActivity = GetInGameUIActivity(SpellCastSwitchClass))\n\t\treturn UIActivity->IsOpened();\n\n\treturn false;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoAInUI::Enter(UObject* Source, const TSubclassOf<USoInGameUIActivity>& UIActivityClass, bool bForceOpen)\n{\n\tUSoInGameUIActivity* UIActivity = GetInGameUIActivity(UIActivityClass);\n\tif (UIActivity == nullptr)\n\t{\n\t\tUE_LOG(LogSoAInUI, Warning, TEXT(\"Failed to enter to UI Activity: activity object is not setup correctly\"))\n\t\treturn false;\n\t}\n\n\tif (Orb->SoActivity != nullptr && (Orb->SoActivity->CanBeInterrupted(EActivity::EA_InUI) || bForceOpen))\n\t{\n\t\tbool bUIIsHidden = false;\n\t\t// Hide previous activity\n\t\tif (Orb->SoActivity == this && ActiveUIActivity != nullptr)\n\t\t{\n\t\t\tif (!ActiveUIActivity->ShouldKeepMusicFromPreviousUIActivity())\n\t\t\t\tOrb->UpdateMusic(true);\n\t\t\tActiveUIActivity->SetInGameActivityEnabled(UIActivity, false);\n\n\t\t\tbUIIsHidden = ActiveUIActivity->ShouldHideUIElements();\n\t\t}\n\n\t\tif (ActiveUIActivity == Source && ActiveUIActivity != nullptr)\n\t\t\tLastIngameActivity = ActiveUIActivity;\n\t\telse\n\t\t\tLastIngameActivity = nullptr;\n\n\t\t// Switch to the new activity\n\t\tActiveUIActivity = UIActivity;\n\t\tOrb->SoActivity->SwitchActivity(this);\n\t\tActiveUIActivity->SetInGameActivityEnabled(Source, true);\n\n\t\tif (ActiveUIActivity->ShouldHideUIElements())\n\t\t\tOrb->ChangeUIVisibility.Broadcast(false);\n\t\telse if (bUIIsHidden)\n\t\t\tOrb->ChangeUIVisibility.Broadcast(true);\n\n\t\treturn true;\n\t}\n\n\treturn false;\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoAInUI::StartDialogue(UDlgDialogue* Dialogue, const TArray<UObject*>& Participants, bool bForced)\n{\n\tif ((!bForced && !Orb->SoActivity->CanBeInterrupted(EActivity::EA_InUI)) ||\n\t\tDialogue == nullptr)\n\t\treturn false;\n\n\tTArray<UObject*> ParticipantList = Participants;\n\n\tif (Orb->SoWizard != nullptr && Dialogue->HasParticipant(IDlgDialogueParticipant::Execute_GetParticipantName(Orb->SoWizard)))\n\t\tParticipantList.Add(Orb->SoWizard);\n\n\tUSoInGameUIActivity** UIActivity = InGameActivities.Find(DialoguePanelClass);\n\tif (UIActivity != nullptr && (*UIActivity) != nullptr && Dialogue->HasParticipant(IDlgDialogueParticipant::Execute_GetParticipantName(*UIActivity)))\n\t\tParticipantList.Add(*UIActivity);\n\n\tParticipantList.Add(Orb);\n\n\tUDlgContext* DlgContext = UDlgManager::StartDialogue(Dialogue, ParticipantList);\n\tif (DlgContext != nullptr)\n\t{\n\t\tEnter(DlgContext, DialoguePanelClass, bForced);\n\t\treturn true;\n\t}\n\n\treturn false;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoAInUI::StartDialogue2(UDlgDialogue* Dialogue, UObject* Participant, bool bForced)\n{\n\tTArray<UObject*> Participants;\n\tParticipants.Add(Participant);\n\tStartDialogue(Dialogue, Participants, bForced);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoAInUI::RegisterInGameActivity(USoInGameUIActivity* InGameActivity)\n{\n\tif (InGameActivity == nullptr)\n\t\treturn;\n\n\tif (InGameActivities.Find(InGameActivity->GetClass()) != nullptr)\n\t\tUE_LOG(LogSoAInUI, Warning, TEXT(\"Failed to register ingame activity: class %s already registered!\"), *InGameActivity->GetClass()->GetName());\n\n\tInGameActivities.Add(InGameActivity->GetClass(), InGameActivity);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoAInUI::UnregisterInGameActivity(USoInGameUIActivity* InGameActivity)\n{\n\tif (InGameActivity == nullptr)\n\t\treturn;\n\n\tUSoInGameUIActivity** UIActivity = InGameActivities.Find(InGameActivity->GetClass());\n\n\tif (UIActivity == nullptr || (*UIActivity) != InGameActivity)\n\t\tUE_LOG(LogSoAInUI, Warning, TEXT(\"Failed to unregister ingame activity: class %s not found or the object does not match!\"), *InGameActivity->GetClass()->GetName())\n\telse\n\t\tInGameActivities.Remove(InGameActivity->GetClass());\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUSoInGameUIActivity* USoAInUI::GetInGameUIActivity(const TSubclassOf<USoInGameUIActivity>& Class) const\n{\n\tUSoInGameUIActivity* const* UIActivity = InGameActivities.Find(Class);\n\tif (UIActivity == nullptr)\n\t\treturn nullptr;\n\n\treturn *UIActivity;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoAInUI::IsInDialogue() const\n{\n\tif (ActiveUIActivity != nullptr)\n\t{\n\t\treturn (ActiveUIActivity->GetClass() == DialoguePanelClass ||\n\t\t\t(Orb->SoWizard != nullptr && Orb->SoWizard->GetWizardDialogueUIActivityClass() == ActiveUIActivity->GetClass()));\n\t}\n\n\treturn false;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoAInUI::Save()\n{\n\tbForceAllowSave = true;\n\tOrb->AutoSave(60.0f);\n\tbForceAllowSave = false;\n}\n"
  },
  {
    "path": "Source/SOrb/Character/SoCharStates/SoAInUI.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#pragma once\n\n#include \"SoActivity.h\"\n#include \"UI/InGame/SoUIGameActivity.h\"\n\n#include \"SoAInUI.generated.h\"\n\nDECLARE_DYNAMIC_MULTICAST_DELEGATE(FSoUIStateNotify);\n\nclass USoInGameUIActivity;\nclass UDlgDialogue;\n\n/** character is too busy browsing his inventory so he can't do anything else */\nUCLASS()\nclass SORB_API USoAInUI : public USoActivity\n{\n\tGENERATED_BODY()\n\npublic:\n\n\tUSoAInUI();\n\n\tvirtual void Tick(float DeltaSeconds) override;\n\n\t// can't do anything while beeing way too busy reading my epic item descriptions\n\tvirtual void Move(float Value) override {};\n\tvirtual void StrikePressed() override {};\n\tvirtual void RightBtnPressed() override {};\n\tvirtual void JumpPressed() override {};\n\tvirtual void RollPressed() override {};\n\tvirtual void UseItemFromSlot0() override {};\n\tvirtual void ToggleSpells(bool bQuickSelectionMode) override;\n\n\tvirtual void InteractKeyPressed(bool bPrimary) override {};\n\n\tvirtual void HandleUICommand(FKey Key, ESoUICommand Command) override;\n\n\tvirtual bool ShouldDecreaseCollision() const override { return bLastCollisionWasDecreased; }\n\n\tvirtual bool CanBeInterrupted(EActivity DesiredState = EActivity::EA_Max) const override { return true; }\n\tvirtual void TakeWeaponAway() override {};\n\n\tvirtual bool BlocksTeleportRequest() const override { return true; }\n\tvirtual bool IsSaveAllowed() const override;\n\n\t/**\n\t *  Function may called when it is not the active UI activity\n\t *  @Param Source: object, can be nullptr or e.g. the chest the character loots\n\t *  @Param UIActivityClass: class of the handler UMGWidget\n\t */\n\tUFUNCTION(BlueprintCallable, Category = UI)\n\tbool Enter(UObject* Source, const TSubclassOf<USoInGameUIActivity>& UIActivityClass, bool bForceOpen = false);\n\n\t/** More BP friendly version, old one stays because idk if the removed & would cause problems or not in BP */\n\tUFUNCTION(BlueprintCallable, Category = UI)\n\tbool EnterBP(UObject* Source, const TSubclassOf<USoInGameUIActivity> UIActivityClass) { return Enter(Source, UIActivityClass); }\n\n\t/** Tries to start the dialogue, send the context to UI control and activate this activity */\n\tUFUNCTION(BlueprintCallable, Category = UI)\n\tbool StartDialogue(UDlgDialogue* Dialogue, const TArray<UObject*>& Participants, bool bForced = false);\n\n\t/** Tries to start the dialogue, send the context to UI control and activate this activity */\n\tUFUNCTION(BlueprintCallable, Category = UI)\n\tvoid StartDialogue2(UDlgDialogue* Dialogue, UObject* Participant, bool bForced = false);\n\n\tUFUNCTION(BlueprintCallable, Category = UI)\n\tvoid ToggleCharacterPanels();\n\n\tUFUNCTION(BlueprintCallable, Category = UI)\n\tvoid RegisterInGameActivity(USoInGameUIActivity* InGameActivity);\n\n\tUFUNCTION(BlueprintCallable, Category = UI)\n\tvoid UnregisterInGameActivity(USoInGameUIActivity* InGameActivity);\n\n\tvoid StartSpellCastSwitch() { Enter(nullptr, SpellCastSwitchClass); }\n\n\tbool IsSpellCastSwitchOpen() const;\n\n\tUFUNCTION(BlueprintCallable, Category = UI)\n\tvoid StartEndGamePanel() { Enter(nullptr, EndGameClass); }\n\n\tUFUNCTION(BlueprintCallable, Category = UI)\n\tvoid OpenRestPanel() { Enter(nullptr, RestClass); }\n\n\t// true for Wizard Dialogue and full screen dialogue (not for Lillian dialogue tho)\n\tbool IsInDialogue() const;\n\n\n\tvirtual bool CanPauseOnIdle() const { return false; }\n\nprotected:\n\n\tvirtual void OnEnter(USoActivity* OldActivity) override;\n\tvirtual void OnExit(USoActivity* NewActivity) override;\n\tvirtual void OnPostExit(USoActivity* NewActivity) override;\n\n\t// Gets the game activity from the class\n\tUSoInGameUIActivity* GetInGameUIActivity(const TSubclassOf<USoInGameUIActivity>& Class) const;\n\n\tvirtual bool CanBeArmedState() const override { return true; }\n\n\tvoid Save();\n\npublic:\n\n\tUPROPERTY(BlueprintAssignable)\n\tFSoUIStateNotify OnUILeft;\n\nprotected:\n\n\tUPROPERTY()\n\tUSoInGameUIActivity* ActiveUIActivity = nullptr;\n\n\tUPROPERTY(VisibleAnywhere, BlueprintReadOnly)\n\tTMap<TSubclassOf<USoInGameUIActivity>, USoInGameUIActivity*> InGameActivities;\n\n\tbool bLastCollisionWasDecreased = false;\n\n\tUPROPERTY(EditAnywhere)\n\tTSubclassOf<USoInGameUIActivity> CharacterPanelsClass;\n\n\tUPROPERTY(EditAnywhere)\n\tTSubclassOf<USoInGameUIActivity> SpellCastSwitchClass;\n\n\tUPROPERTY(EditAnywhere)\n\tTSubclassOf<USoInGameUIActivity> RestClass;\n\n\tUPROPERTY(EditAnywhere)\n\tTSubclassOf<USoInGameUIActivity> DialoguePanelClass;\n\n\tUPROPERTY(EditAnywhere)\n\tTSubclassOf<USoInGameUIActivity> EndGameClass;\n\n\t// used to store the ui activity, but only if we want to return to it after the new one is closed\n\t// to do that the source has to be the current UI activity in Enter()\n\tUPROPERTY(BlueprintReadWrite)\n\tUSoInGameUIActivity* LastIngameActivity;\n\n\tbool bDialogueWasLast = false;\n\n\tUPROPERTY(BlueprintReadWrite)\n\tUSoActivity* ActivityToEnterAfterLeave = nullptr;\n\n\tbool bArmAllowed = true;\n\n\tUPROPERTY(BlueprintReadWrite)\n\tfloat InputBlockCounter = -1.0f;\n\n\tbool bForceAllowSave = false;\n\n\tbool bRollAllowed = false;\n};\n"
  },
  {
    "path": "Source/SOrb/Character/SoCharStates/SoAInteractWithEnvironment.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#include \"SoAInteractWithEnvironment.h\"\n#include \"Animation/AnimSequenceBase.h\"\n#include \"Character/SoCharacter.h\"\n#include \"CharacterBase/SoCharacterMovementComponent.h\"\n#include \"SoAInUI.h\"\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// set base flags\nUSoAInteractWithEnvironment::USoAInteractWithEnvironment() :\n\tUSoActivity(EActivity::EA_InteractWithEnvironment)\n{\n\tLookDirection = ESoLookDirection::ELD_Frozen;\n}\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoAInteractWithEnvironment::OnEnter(USoActivity* OldActivity)\n{\n\tUSoActivity::OnEnter(OldActivity);\n\n\tif (Anim != nullptr)\n\t\tCounter = Anim->SequenceLength / Anim->RateScale;\n\n\tbCanBeInterrputed = false;\n\tOrb->SoMovement->SetRootMotionDesc({true, true, 1.0f});\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoAInteractWithEnvironment::OnExit(USoActivity* NewActivity)\n{\n\tUSoActivity::OnExit(NewActivity);\n\t// Anim = nullptr;\n\tCounter = -1.0f;\n\tOrb->SoMovement->ClearRootMotionDesc();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoAInteractWithEnvironment::Tick(float DeltaSeconds)\n{\n\tUSoActivity::Tick(DeltaSeconds);\n\n\tCounter -= DeltaSeconds;\n\n\tif (Anim == nullptr || Counter < CounterTarget)\n\t{\n\t\tbCanBeInterrputed = true;\n\t\tif (UISource == nullptr || !Orb->SoAInUI->Enter(UISource, UIActivityClass))\n\t\t\tSwitchToRelevantState(true);\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoAInteractWithEnvironment::Enter(UAnimSequenceBase* AnimToPlay,\n\t\t\t\t\t\t\t\t\t\tconst TSubclassOf<USoInGameUIActivity> InUIActivityClass,\n\t\t\t\t\t\t\t\t\t\tUObject* InUISource,\n\t\t\t\t\t\t\t\t\t\tfloat InCounterTarget,\n\t\t\t\t\t\t\t\t\t\tbool bInUseAnimBlendIn)\n{\n\tUISource = InUISource;\n\tUIActivityClass = InUIActivityClass;\n\tCounterTarget = InCounterTarget;\n\tbUseAnimBlendIn = bInUseAnimBlendIn;\n\n\tif (AnimToPlay != nullptr && Orb != nullptr && Orb->SoActivity != nullptr && Orb->SoActivity->CanBeInterrupted(EActivity::EA_InteractWithEnvironment))\n\t{\n\t\tAnim = AnimToPlay;\n\t\tOrb->SoActivity->SwitchActivity(this);\n\t\treturn true;\n\t}\n\n\treturn false;\n}\n"
  },
  {
    "path": "Source/SOrb/Character/SoCharStates/SoAInteractWithEnvironment.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#pragma once\n\n#include \"SoActivity.h\"\n\n#include \"SoAInteractWithEnvironment.generated.h\"\n\nclass USoInGameUIActivity;\nclass UAnimSequenceBase;\n\n/** character is too busy browsing his inventory so he can't do anything else */\nUCLASS()\nclass SORB_API USoAInteractWithEnvironment : public USoActivity\n{\n\tGENERATED_BODY()\n\npublic:\n\n\tUSoAInteractWithEnvironment();\n\n\tvirtual void Tick(float DeltaSeconds) override;\n\n\tvirtual void Move(float Value) override {};\n\tvirtual void StrikePressed() override {};\n\tvirtual void RightBtnPressed() override {};\n\tvirtual void JumpPressed() override {};\n\tvirtual void RollPressed() override {};\n\tvirtual void ToggleWeapons() override {};\n\tvirtual void ToggleItems() override {};\n\tvirtual void UseItemFromSlot0() override {};\n\n\tvirtual void InteractKeyPressed(bool bPrimary) override {};\n\n\tvirtual bool CanBeInterrupted(EActivity DesiredState = EActivity::EA_Max) const override { return bCanBeInterrputed; }\n\n\t/** if UISource is not nullptr UIActivityClass will be entered via SoAInUI */\n\tUFUNCTION(BlueprintCallable, Category = Interact)\n\tbool Enter(UAnimSequenceBase* AnimToPlay,\n\t\t\t   const TSubclassOf<USoInGameUIActivity> InUIActivityClass,\n\t\t\t   UObject* InUISource = nullptr,\n\t\t\t   float InCounterTarget = 0.0f,\n\t\t\t   bool bInUseAnimBlendIn = true);\n\nprotected:\n\n\tvirtual void OnEnter(USoActivity* OldActivity) override;\n\tvirtual void OnExit(USoActivity* NewActivity) override;\n\n\tfloat Counter = -1.0f;\n\n\tfloat CounterTarget = 0.0f;\n\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere)\n\tUAnimSequenceBase* Anim = nullptr;\n\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere)\n\tbool bUseAnimBlendIn = true;\n\n\n\t/** data to use after animation with UI if set */\n\tUPROPERTY()\n\tUObject* UISource = nullptr;\n\n\t/** UI to use after animation if set */\n\tUPROPERTY()\n\tTSubclassOf<USoInGameUIActivity> UIActivityClass;\n\n\tbool bCanBeInterrputed = false;\n};\n"
  },
  {
    "path": "Source/SOrb/Character/SoCharStates/SoAItemUsage.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#include \"SoAItemUsage.h\"\n#include \"Components/SkeletalMeshComponent.h\"\n#include \"Kismet/GameplayStatics.h\"\n\n#include \"CharacterBase/SoCharacterMovementComponent.h\"\n#include \"Character/SoCharacter.h\"\n#include \"Character/SoPlayerCharacterSheet.h\"\n#include \"Items/ItemTemplates/SoUsableItemTemplate.h\"\n#include \"Items/SoItem.h\"\n#include \"Basic/Helpers/SoStaticHelper.h\"\n#include \"Basic/SoAudioManager.h\"\n#include \"Projectiles/SoProjectileSpawnerComponent.h\"\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUSoAItemUsage::USoAItemUsage() :\n\tUSoActivity(EActivity::EA_ItemUsage)\n{\n\tLookDirection = ESoLookDirection::ELD_Frozen;\n\tJumpType = ESoJumpType::EJT_BounceIfPressed;\n}\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoAItemUsage::OnEnter(USoActivity* OldActivity)\n{\n\tconst FSoItem& Item = Orb->GetPlayerCharacterSheet()->GetEquippedItem(ESoItemSlot::EIS_Item0);\n\tconst USoUsableItemTemplate* UsableTemplate = Cast<const USoUsableItemTemplate>(Item.Template);\n\tif (UsableTemplate == nullptr)\n\t{\n\t\tUE_LOG(LogSoItem, Error, TEXT(\"Tried to use item but the item in the slot is not usable!\"));\n\t\treturn;\n\t}\n\n\tUsableType = UsableTemplate->UsableType;\n\n\tbPingState = !bPingState;\n\tUAnimSequenceBase** AnimPtrTarget = bPingState ? &PingAnimation : &PongAnimation;\n\tUAnimSequenceBase** AnimPtr = Animations.Find(UsableType);\n\tif (AnimPtr != nullptr)\n\t\t(*AnimPtrTarget) = *AnimPtr;\n\n\tif (AnimPtr == nullptr || *AnimPtr == nullptr)\n\t{\n\t\tUE_LOG(LogSoItem, Error, TEXT(\"USoAItemUsage::OnEnter: AnimPtr for Item = `%s` is nullptr (could not be found)\"), *UsableTemplate->GetPathName());\n\t\tCounter = 0.f;\n\t}\n\telse\n\t{\n\t\tCounter = USoStaticHelper::GetScaledAnimLength(*AnimPtr);\n\t}\n\n\tMeshShowThreshold = -1.0f;\n\tswitch (UsableType)\n\t{\n\t\tcase ESoUsableItemType::EUIT_Throwable:\n\t\t\tMeshShowThreshold = Counter - 0.3f;\n\t\tcase ESoUsableItemType::EUIT_Potion:\n\t\t\tbreak;\n\n\t\tcase ESoUsableItemType::EUIT_Hammer:\n\t\t\tMeshShowThreshold = Counter - 0.3f;\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tbreak;\n\t}\n\n\tUSoActivity::OnEnter(OldActivity);\n\n\tOrb->SoItemMesh->SetStaticMesh(UsableTemplate->GetStaticMesh());\n\tbCanBeUsed = Item.Amount > 0;\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoAItemUsage::OnExit(USoActivity* NewActivity)\n{\n\tUSoActivity::OnExit(NewActivity);\n\tOrb->SoItemMesh->SetVisibility(false);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoAItemUsage::Tick(float DeltaSeconds)\n{\n\tSuper::Tick(DeltaSeconds);\n\n\tCounter -= DeltaSeconds;\n\n\tif (Counter < MeshShowThreshold)\n\t{\n\t\tOrb->SoItemMesh->SetVisibility(true);\n\t\tMeshShowThreshold = -1.0f;\n\t}\n\n\tif (Counter < 0.0f)\n\t\treturn SwitchToRelevantState(true);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoAItemUsage::OnAnimEvent(EAnimEvents Event)\n{\n\tif (Event == EAnimEvents::EAE_OnItemLaunched)\n\t{\n\t\tFSoItem& Item = Orb->GetPlayerCharacterSheet()->GetEquippedItem(ESoItemSlot::EIS_Item0);\n\t\tUSoUsableItemTemplate* UsableTemplate = Cast<USoUsableItemTemplate>(Item.Template);\n\t\tif (UsableTemplate != nullptr)\n\t\t{\n\t\t\tUSoAudioManager::PlaySoundAtLocation(Orb, UsableTemplate->SFXOnUse, Orb->GetActorTransform());\n\n\t\t\tswitch (UsableType)\n\t\t\t{\n\t\t\t\tcase ESoUsableItemType::EUIT_Potion:\n\n\t\t\t\t\tif (bCanBeUsed)\n\t\t\t\t\t{\n\t\t\t\t\t\tOrb->GetPlayerCharacterSheet()->ApplyPotionEffects(UsableTemplate);\n\t\t\t\t\t\tOrb->GetPlayerCharacterSheet()->DecreaseItemCountOnSlot(ESoItemSlot::EIS_Item0);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase ESoUsableItemType::EUIT_Throwable:\n\t\t\t\t\tif (bCanBeUsed && UsableTemplate->ProjectileType != nullptr)\n\t\t\t\t\t{\n\t\t\t\t\t\tOrb->SoItemMesh->SetVisibility(false);\n\n\t\t\t\t\t\tconst FVector StartPos = Orb->GetActorLocation();\n\t\t\t\t\t\tconst FVector EndPos = Orb->ProjectileSpawner->GetComponentLocation();\n\n\t\t\t\t\t\tFCollisionQueryParams TraceParams;\n\t\t\t\t\t\tTraceParams.AddIgnoredActor(Orb);\n\t\t\t\t\t\tFHitResult Hit;\n\t\t\t\t\t\tstatic const FName ProfileName = FName(\"BlockAllDynamic\");\n\t\t\t\t\t\t// check trace so character can't throw items through walls\n\t\t\t\t\t\tif (!GetWorld()->LineTraceSingleByProfile(Hit, StartPos, EndPos, ProfileName, TraceParams))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tOrb->GetPlayerCharacterSheet()->DecreaseItemCountOnSlot(ESoItemSlot::EIS_Item0);\n\n\t\t\t\t\t\t\tOrb->ProjectileSpawner->SetProjectileClass(UsableTemplate->ProjectileType);\n\t\t\t\t\t\t\tOrb->ProjectileSpawner->SpawnProjectile();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\tdefault:\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\telse\n\t\tUSoActivity::OnAnimEvent(Event);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoAItemUsage::UseItemFromSlot0()\n{\n\tif (UsableType == ESoUsableItemType::EUIT_Hammer)\n\t\tSwitchToRelevantState(true);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoAItemUsage::Move(float Value)\n{\n\tif (UsableType == ESoUsableItemType::EUIT_Throwable && !Orb->SoMovement->IsMovingOnGround())\n\t\tSuper::Move(Value);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoAItemUsage::ShouldBounceOnHit(float& OutStepUpHitVelocity, float& OutBounceDamping, const FHitResult* HitResult) const\n{\n\tif (HitResult != nullptr && HitResult->GetActor() != nullptr && HitResult->GetActor()->ActorHasTag(NoBounceSurface))\n\t\treturn false;\n\n\tif (Orb->bRollPressed)\n\t{\n\t\tOutStepUpHitVelocity = Orb->GetRollJumpHeight(0) / 2.f;\n\t\tOutBounceDamping = DefaultBounceDampening;\n\t\treturn true;\n\t}\n\n\treturn false;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoAItemUsage::OnBounce(bool bWallJump, float NewStoredMoveValue, const FVector& HitPoint, const FVector& HitNormal)\n{\n\tif (fabs(NewStoredMoveValue) > KINDA_SMALL_NUMBER)\n\t{\n\t\tOrb->ForcedMovementCounter = bWallJump ? Orb->GetForcedToMoveTimeAfterWallJump() : Orb->GetForcedToMoveTimeAfterHit();\n\t\tOrb->ForcedMovementValue = NewStoredMoveValue;\n\t}\n\n\tOrb->SpawnBounceEffects(bWallJump, HitPoint);\n}\n"
  },
  {
    "path": "Source/SOrb/Character/SoCharStates/SoAItemUsage.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#pragma once\n\n#include \"SoActivity.h\"\n#include \"SoAItemUsage.generated.h\"\n\nUCLASS()\nclass SORB_API USoAItemUsage : public USoActivity\n{\n\tGENERATED_BODY()\n\npublic:\n\n\tUSoAItemUsage ();\n\n\tvirtual void Tick(float DeltaSeconds) override;\n\n\tvirtual void OnAnimEvent(EAnimEvents Event) override;\n\n\tvirtual void JumpPressed() override {};\n\tvirtual void Move(float Value) override;\n\n\tvirtual void ToggleItems() override {};\n\tvirtual void UseItemFromSlot0() override;\n\n\tvirtual bool ShouldBounceOnHit(float& OutStepUpHitVelocity, float& OutBounceDamping, const FHitResult* HitResult) const override;\n\tvirtual void OnBounce(bool bWallJump, float NewStoredMoveValue, const FVector& HitPoint, const FVector& HitNormal) override;\n\nprotected:\n\n\tvirtual void OnEnter(USoActivity* OldActivity) override;\n\tvirtual void OnExit(USoActivity* NewActivity) override;\n\n\tvirtual bool CanBeInterrupted(EActivity DesiredState = EActivity::EA_Max) const override { return false; }\n\n\n\tUSoActivity* StoredActivity;\n\n\tUPROPERTY(BlueprintReadOnly)\n\tESoUsableItemType UsableType;\n\n\tUPROPERTY(BlueprintReadOnly)\n\tbool bCanBeUsed;\n\n\n\tUPROPERTY(BlueprintReadOnly)\n\tUAnimSequenceBase* PingAnimation;\n\n\tUPROPERTY(BlueprintReadOnly)\n\tUAnimSequenceBase* PongAnimation;\n\n\tUPROPERTY(BlueprintReadOnly)\n\tbool bPingState;\n\n\tUPROPERTY(EditAnywhere)\n\tTMap<ESoUsableItemType, UAnimSequenceBase*> Animations;\n\n\tfloat Counter = 0.0f;\n\tfloat MeshShowThreshold;\n};\n\n"
  },
  {
    "path": "Source/SOrb/Character/SoCharStates/SoALeverPush.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#include \"SoALeverPush.h\"\n\n#include \"EngineMinimal.h\" // ANY_PACKAGE enum search\n\n#include \"SoADefault.h\"\n#include \"Interactables/SoInteractableActor.h\"\n#include \"Character/SoCharacter.h\"\n#include \"Basic/Helpers/SoDateTimeHelper.h\"\n#include \"SoAWait.h\"\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// set base flags\nUSoALeverPush::USoALeverPush() :\n\tUSoActivity(EActivity::EA_LeverPush)\n{\n\tLookDirection = ESoLookDirection::ELD_Frozen;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoALeverPush::OnEnter(USoActivity* OldActivity)\n{\n\tbIsFinished = false;\n\tUSoActivity::OnEnter(OldActivity);\n\tOrb->OnInteractionLabelChanged.Broadcast();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoALeverPush::OnExit(USoActivity* NewActivity)\n{\n\tbIsFinished = true;\n\tUSoActivity::OnExit(NewActivity);\n\tOrb->OnInteractionLabelChanged.Broadcast();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoALeverPush::Tick(float DeltaSeconds)\n{\n\tUSoActivity::Tick(DeltaSeconds);\n\n\tconst float PushedDelta = Orb->InputComponent->GetAxisValue(\"Move\") * LeverData.PushDirection * (Orb->bRotatedCamera ? -1 : 1);\n\tconst float Delta = LeverData.bForcePull ? 1.0f : PushedDelta;\n\tLeverData.ActualValue = FMath::Clamp(LeverData.ActualValue + Delta * LeverData.Speed * USoDateTimeHelper::DenormalizeTime(DeltaSeconds), 0.0f, 1.0f);\n\tOrb->DynamicAnimValue = LeverData.ActualValue;\n\n\tif (LeverData.bForcePull && (fabs(LeverData.TargetValue - LeverData.ActualValue) < KINDA_SMALL_NUMBER))\n\t{\n\t\tSwitchActivity(Orb->SoADefault);\n\t\tif (LeverData.WaitAfterLeverPull > 0.0f)\n\t\t\tOrb->SoAWait->Enter(LeverData.WaitAfterLeverPull);\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoALeverPush::DecreaseHealth(const FSoDmg& Damage)\n{\n\tSwitchActivity(Orb->SoADefault);\n\treturn USoActivity::DecreaseHealth(Damage);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoALeverPush::InteractKeyPressed(bool bPrimary)\n{\n\tif (!LeverData.bForcePull)\n\t\tSwitchActivity(Orb->SoADefault);\n}\n"
  },
  {
    "path": "Source/SOrb/Character/SoCharStates/SoALeverPush.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#pragma once\n\n#include \"SoActivity.h\"\n#include \"SoALeverPush.generated.h\"\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUCLASS()\nclass SORB_API USoALeverPush : public USoActivity\n{\n\tGENERATED_BODY()\npublic:\n\n\tUSoALeverPush();\n\n\tvirtual void Tick(float DeltaSeconds) override;\n\n\tvirtual bool DecreaseHealth(const FSoDmg& Damage) override;\n\n\tvirtual void InteractKeyPressed(bool bPrimary) override;\n\n\tvirtual void JumpPressed() override {};\n\tvirtual void Move(float Value) override {};\n\t\n\tvoid SetLeverData(FSoLeverData InLeverData);\n\n\tconst FSoLeverData& GetLeverData() const;\n\n\tbool IsFinished() const;\n\nprotected:\n\n\tvirtual void OnEnter(USoActivity* OldActivity) override;\n\tvirtual void OnExit(USoActivity* NewActivity) override;\n\nprotected:\n\n\tUPROPERTY(BlueprintReadWrite, Category = Movement)\n\tFSoLeverData LeverData;\n\n\tUPROPERTY(BlueprintReadWrite, Category = Movement)\n\tfloat WaitAfterLeverPull = -1;\n\n\tbool bIsFinished = false;\n};\ninline void USoALeverPush::SetLeverData(FSoLeverData InLeverData) { LeverData = InLeverData; }\ninline const FSoLeverData& USoALeverPush::GetLeverData() const { return LeverData; }\ninline bool USoALeverPush::IsFinished() const { return bIsFinished; }\n"
  },
  {
    "path": "Source/SOrb/Character/SoCharStates/SoALillian.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#include \"SoALillian.h\"\n#include \"Components/SkeletalMeshComponent.h\"\n#include \"Components/StaticMeshComponent.h\"\n#include \"Particles/ParticleSystemComponent.h\"\n\n\n#include \"Character/SoCharacter.h\"\n#include \"Character/SoPlayerCharacterSheet.h\"\n#include \"Interactables/SoInteractable.h\"\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUSoALillian::USoALillian() :\n\tUSoActivity(EActivity::EA_Lillian)\n{\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoALillian::OnEnter(USoActivity* OldActivity)\n{\n\tSuper::OnEnter(OldActivity);\n\n\tOrb->GetMesh()->SetVisibility(false);\n\tOrb->LillianMesh->SetVisibility(true);\n\tOrb->LillianMesh->SetComponentTickEnabled(true);\n\tOrb->LillianMesh->bNoSkeletonUpdate = false;\n\n\tOrb->SoNewSmoke->SetVisibility(false);\n\tOrb->SoNewLights->SetVisibility(false);\n\tOrb->SoGlowSphere->SetVisibility(false);\n\n\tOrb->SoSword->SetVisibility(false, true);\n\tOrb->SoOffHandWeapon->SetVisibility(false, true);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoALillian::OnExit(USoActivity* NewActivity)\n{\n\tSuper::OnExit(NewActivity);\n\n\tif (NewActivity->GetID() != EActivity::EA_InUI &&\n\t\tNewActivity->GetID() != EActivity::EA_Teleport&&\n\t\tNewActivity->GetID() != EActivity::EA_WaitForActivitySwitch)\n\t{\n\t\tOrb->GetMesh()->SetVisibility(true);\n\t\tOrb->LillianMesh->SetVisibility(false);\n\t\tOrb->LillianMesh->SetComponentTickEnabled(false);\n\t\tOrb->LillianMesh->bNoSkeletonUpdate = true;\n\n\t\tOrb->SoNewSmoke->SetVisibility(true);\n\t\tOrb->SoNewLights->SetVisibility(true);\n\t\tOrb->SoGlowSphere->SetVisibility(true);\n\n\t\tOrb->SelectWeapon(Orb->SoPlayerCharacterSheet->GetEquippedItem(ESoItemSlot::EIS_Weapon0));\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoALillian::OnInteract(AActor* Interactable)\n{\n\tif (Interactable != nullptr)\n\t\tISoInteractable::Execute_Interact(Interactable, Orb);\n}"
  },
  {
    "path": "Source/SOrb/Character/SoCharStates/SoALillian.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#pragma once\n\n#include \"SoActivity.h\"\n#include \"SoALillian.generated.h\"\n\n\nUCLASS()\nclass SORB_API USoALillian : public USoActivity\n{\n\tGENERATED_BODY()\npublic:\n\tUSoALillian();\n\nprotected:\n\n\tvirtual void OnEnter(USoActivity* OldActivity) override;\n\tvirtual void OnExit(USoActivity* NewActivity) override;\n\n\tvirtual void OnInteract(AActor* Interactable) override;\n\n\tvirtual bool CanBeInterrupted(EActivity DesiredState = EActivity::EA_Max) const override { return DesiredState == EActivity::EA_InUI ||\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t  DesiredState == EActivity::EA_Teleport; }\n\tvirtual bool CanOpenCharacterPanels() const { return false; }\n\tvirtual bool CanJumpFromAir() const override { return false; }\n\n\n\tvirtual void UseItemFromSlot0() override {};\n\tvirtual bool DecreaseHealth(const FSoDmg& Damage) override { return true; }\n\tvirtual bool OnDmgTaken(const FSoDmg& Damage, const FSoHitReactDesc& HitReactDesc) override { return true; }\n\tvirtual void OnDeath() override {}\n\t\n\t// input\n\tvirtual void JumpPressed() override {};\n\tvirtual void ToggleWeapons() override {};\n\n\tvirtual void HandleCollision() override { IncreaseCollisionSize(); };\n\tvirtual void OnBaseChanged(AActor* ActualMovementBase) override {};\n\n\n\tfriend class ASoCharacter;\n};\n"
  },
  {
    "path": "Source/SOrb/Character/SoCharStates/SoARoll.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#include \"SoARoll.h\"\n\n#include \"TimerManager.h\"\n#include \"Kismet/GameplayStatics.h\"\n\n#include \"Character/SoCharacter.h\"\n#include \"Character/SoCharStates/SoAHitReact.h\"\n#include \"Character/SoPlayerCharacterSheet.h\"\n#include \"CharacterBase/SoCharacterMovementComponent.h\"\n#include \"Basic/SoAudioManager.h\"\n#include \"Items/ItemTemplates/SoWeaponTemplate.h\"\n\n#include \"SoADefault.h\"\n#include \"Basic/Helpers/SoDateTimeHelper.h\"\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// set base flags\nUSoARoll::USoARoll() :\n\tUSoActivity(EActivity::EA_Rolling)\n{\n\tJumpType = ESoJumpType::EJT_Bounce;\n\tLookDirection = ESoLookDirection::ELD_Frozen;\n}\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// this is a useless comment, just like most of them\nvoid USoARoll::OnEnter(USoActivity* OldActivity)\n{\n\tUSoActivity::OnEnter(OldActivity);\n\tUpdateRollAnimDynamicValue();\n\n\tif (Orb->SoMovement->IsMovingOnGround())\n\t{\n\t\tauto* EventVariant = Orb->GetVelocity().SizeSquared() > 100 ? Orb->SFXRollEnter : Orb->SFXRollEnterNoMovement;\n\t\tUSoAudioManager::PlaySoundAtLocation(Orb, EventVariant, Orb->GetActorTransform());\n\t}\n\n\tbInverseRollAnim = false;\n\tif (OldActivity != nullptr && OldActivity->IsArmedState())\n\t{\n\t\tconst FSoItem& Weapon = Orb->GetPlayerCharacterSheet()->GetEquippedItem(ESoItemSlot::EIS_Weapon0);\n\t\tif (USoWeaponTemplate* WeaponTemplate = Cast<USoWeaponTemplate>(Weapon.Template))\n\t\t\tbInverseRollAnim = WeaponTemplate->GetInverseRollAnimsIfArmed();\n\t}\n\n\tOrb->CurrentSmokeColor = Orb->SmokeColorRoll;\n\tOrb->CurrentGlowSphereColor = Orb->GlowSphereColorRoll;\n\tOrb->RefreshDefaultKeyMovementLights();\n\n\t// Apply Momentum for jump for a time interval\n\tconst float TimeSinceJump = Orb->GetWorld()->GetTimeSeconds() - Orb->StoredTimeOnJump;\n\tif (FMath::Abs(Orb->StoredMovementInputDirOnJump) > KINDA_SMALL_NUMBER &&\n\t\tTimeSinceJump > 0.1f && TimeSinceJump < 0.5f)\n\t{\n\t\tMaxVelocityBoostCounter = TimeSinceJump - 0.1f;\n\t\tOrb->SoMovement->MaxWalkSpeed = 2 * MovementSpeed - Orb->SoADefault->GetMovementSpeed();\n\t}\n\telse\n\t{\n\t\tMaxVelocityBoostCounter = -1.0f;\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoARoll::OnExit(USoActivity* NewActivity)\n{\n\tClearMaxSpeedBoost();\n\n\t// update orientation based on input, for e.g. strike\n\tif (Orb->LastInputDirection.SizeSquared() > KINDA_SMALL_NUMBER)\n\t{\n\t\tOrb->SetActorRotation(Orb->LastInputDirection.Rotation());\n\t\tUpdateCamera(0.01f);\n\t}\n\n\tif (Orb->RollSFX->IsActive())\n\t\tOrb->RollSFX->Deactivate();\n\n\tif (Orb->SoMovement->IsMovingOnGround())\n\t{\n\t\tauto* EventVariant = Orb->GetVelocity().SizeSquared() > 100 ? Orb->SFXRollLeave : Orb->SFXRollLeaveNoMovement;\n\t\tUSoAudioManager::PlaySoundAtLocation(Orb, EventVariant, Orb->GetActorTransform());\n\t}\n\n \tUSoActivity::OnExit(NewActivity);\n\tbInverseRollAnim = false;\n\n\tOrb->CurrentSmokeColor = Orb->SmokeColorDefault;\n\tOrb->CurrentGlowSphereColor = Orb->GlowSphereColorDefault;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoARoll::OnPostExit(USoActivity* NewActivity)\n{\n\tSuper::OnPostExit(NewActivity);\n\tOrb->RefreshDefaultKeyMovementLights();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// set base flags\nvoid USoARoll::Tick(float DeltaSeconds)\n{\n\tUSoActivity::Tick(DeltaSeconds);\n\n\tif (MaxVelocityBoostCounter > 0.0f)\n\t{\n\t\tMaxVelocityBoostCounter -= DeltaSeconds;\n\t\tif (MaxVelocityBoostCounter < 0.0f)\n\t\t{\n\t\t\tClearMaxSpeedBoost();\n\t\t}\n\t}\n\n\tUpdateRollAnimDynamicValue();\n\n\tif (Orb->SoMovement->IsMovingOnGround() && Orb->GetVelocity().SizeSquared() > 100 * 100)\n\t{\n\t\tif (!Orb->RollSFX->IsActive())\n\t\t\tOrb->RollSFX->Activate(true);\n\t}\n\telse\n\t{\n\t\tif (Orb->RollSFX->IsActive())\n\t\t\tOrb->RollSFX->Deactivate();\n\t}\n\n\t// most likely we couldn't leave roll mode when we released the button... let's try again\n\t// calling CanBeInterrupted can end up causing dmg to the character\n\tif (!Orb->bRollPressed && CanBeInterrupted())\n\t\t// || (Orb->bUmbrellaPressed && Orb->SoMovement->MovementMode == EMovementMode::MOVE_Falling))\n\t\tSwitchToRelevantState(true);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoARoll::JumpPressed()\n{\n\tif (!Orb->SoMovement->TryLateWallJump())\n\t\tSuper::JumpPressed();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoARoll::ClearMaxSpeedBoost()\n{\n\tMaxVelocityBoostCounter = -1.0f;\n\tOrb->SoMovement->MaxWalkSpeed = MovementSpeed;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoARoll::ShouldBounceOnHit(float& OutStepUpHitVelocity, float& OutBounceDamping, const FHitResult* HitResult) const\n{\n\tif (HitResult != nullptr && HitResult->GetActor() != nullptr && HitResult->GetActor()->ActorHasTag(NoBounceSurface))\n\t\treturn false;\n\n\tOutStepUpHitVelocity = Orb->GetRollJumpHeight(0) / 2.f;\n\tOutBounceDamping = DefaultBounceDampening;\n\treturn true;\n}\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoARoll::OnBounce(bool bWallJump, float NewStoredMoveValue, const FVector& HitPoint, const FVector& HitNormal)\n{\n\tClearMaxSpeedBoost();\n\n\tif (fabs(NewStoredMoveValue) > KINDA_SMALL_NUMBER)\n\t{\n\t\tOrb->ForcedMovementCounter = bWallJump ? Orb->GetForcedToMoveTimeAfterWallJump() : Orb->GetForcedToMoveTimeAfterHit();\n\t\tOrb->ForcedMovementValue = NewStoredMoveValue;\n\t\tif (bWallJump)\n\t\t{\n\t\t\tLastWallJumpTime = Orb->GetWorld()->GetTimeSeconds();\n\t\t\tif (Orb->bFloatingActive)\n\t\t\t{\n\t\t\t\tOrb->bUmbrellaPressed = false;\n\t\t\t\tStopFloating();\n\t\t\t}\n\t\t}\n\t}\n\tOrb->SpawnBounceEffects(bWallJump, HitPoint);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoARoll::CanBeInterrupted(EActivity DesiredState) const\n{\n\tconst float CurrentTime = Orb->GetWorld()->GetTimeSeconds();\n\tconst float ThresholdSeconds = LastWallJumpTime + Orb->GetForcedToMoveTimeAfterWallJump();\n\n\t// allow this for item usage so wall jump + test stone works :thinking:\n\tif (ThresholdSeconds > CurrentTime && DesiredState != EActivity::EA_ItemUsage)\n\t\treturn false;\n\n\t// if we are falling collision has to be decreased anyway\n\tif (Orb->SoMovement->MovementMode == EMovementMode::MOVE_Falling ||\n\t\tDesiredState == EActivity::EA_Teleport)\n\t\treturn true;\n\n\tAActor* Base = APawn::GetMovementBaseActor(Orb);\n\n\t// //  SEEMS like we don't need this\n\t// if (Base != nullptr && Base->ActorHasTag(RollOnlySurface))\n\t// \treturn false;\n\n\treturn Orb->CanIncreaseCollision();\n}\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoARoll::OnPushed(const FVector& DeltaMovement, float DeltaSeconds, bool bStuck, AActor* RematerializeLocation, int32 DamageAmountIfStuck, bool bForceDamage)\n{\n\tUSoActivity::OnPushed(DeltaMovement, DeltaSeconds, bStuck, RematerializeLocation, DamageAmountIfStuck, bForceDamage);\n\n\tif (Orb->SoActivity == this)\n\t{\n\t\tconst float OwnerZVelocity = Orb->GetVelocity().Z;\n\t\tconst float BaseZVelocity = DeltaMovement.Z / DeltaSeconds;\n\t\tif (OwnerZVelocity < -5.0f && BaseZVelocity > 5.0f)\n\t\t{\n\t\t\tFHitResult HitResult;\n\t\t\tOrb->AddActorWorldOffset(FVector(0.0f, 0.0f, -5.0f), true, &HitResult);\n\t\t\tif (HitResult.bBlockingHit)\n\t\t\t{\n\t\t\t\tOnPreLandedBounce(HitResult);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t// WTH?!\n\t\t\t\tOrb->SoMovement->SetMovementMode(EMovementMode::MOVE_Falling);\n\t\t\t\tOrb->SoMovement->Velocity.Z = BaseZVelocity - OwnerZVelocity * DefaultBounceDampening;\n\t\t\t}\n\t\t\tOrb->SetBase(nullptr);\n\t\t}\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoARoll::OnJumped()\n{\n\tOrb->OnInteractionLabelChanged.Broadcast();\n}\n"
  },
  {
    "path": "Source/SOrb/Character/SoCharStates/SoARoll.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#pragma once\n\n#include \"SoActivity.h\"\n#include \"SoARoll.generated.h\"\n\n\nUCLASS()\nclass SORB_API USoARoll : public USoActivity\n{\n\tGENERATED_BODY()\npublic:\n\n\tUSoARoll();\n\n\tvirtual void Tick(float DeltaSeconds) override;\n\n\t// how about no?!\n\tvirtual void IncreaseCollisionSize() override {};\n\n\t// don't you say\n\tvirtual void RollPressed() override {};\n\n\t// yep!\n\n\tvirtual void JumpPressed() override;\n\n\tvirtual bool ShouldBounceOnHit(float& OutStepUpHitVelocity, float& OutBounceDamping, const FHitResult* HitResult) const override;\n\tvirtual void OnBounce(bool bWallJump, float NewStoredMoveValue, const FVector& HitPoint, const FVector& HitNormal) override;\n\t\n\tvirtual void OnPushed(const FVector& DeltaMovement, float DeltaSeconds, bool bStuck, AActor* RematerializeLocation, int32 DamageAmountIfStuck, bool bForceDamage) override;\n\n\tvirtual bool ShouldDecreaseCollision() const override { return true; }\n\t\nprotected:\n\n\t// check cpp for comment\n\tvirtual void OnEnter(USoActivity* OldActivity) override;\n\tvirtual void OnExit(USoActivity* NewActivity) override;\n\tvirtual void OnPostExit(USoActivity* NewActivity) override;\n\t// if user input can force the state to change\n\tvirtual bool CanBeInterrupted(EActivity DesiredState = EActivity::EA_Max) const override;\n\t\n\tvirtual void OnJumped() override;\n\n\tvoid ClearMaxSpeedBoost();\n\n\tUPROPERTY(BlueprintReadOnly)\n\tbool bInverseRollAnim = false;\n\n\tfloat LastWallJumpTime = -1.0f;\n\tfloat MaxVelocityBoostCounter = -1.0f;\n};\n"
  },
  {
    "path": "Source/SOrb/Character/SoCharStates/SoASkyControlEdit.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#include \"SoASkyControlEdit.h\"\n#include \"EngineUtils.h\"\n\n#include \"SoADefault.h\"\n#include \"Character/SoCharacter.h\"\n#include \"CharacterBase/SoCharacterMovementComponent.h\"\n#include \"SplineLogic/SoPlayerSpline.h\"\n#include \"Basic/Helpers/SoMathHelper.h\"\n\n#if WITH_EDITOR\n#include \"Editor.h\"\n#endif\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// set base flags\nUSoASkyControlEdit::USoASkyControlEdit() :\n\tUSoActivity(EActivity::EA_SkyEdit)\n{\n}\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoASkyControlEdit::OnEnter(USoActivity* OldActivity)\n{\n\tUSoActivity::OnEnter(OldActivity);\n\tOrb->SetEditorWidgetVisibility(ESoEditorUI::EEUI_Sky, true);\n\n\tif (bSuperMode)\n\t\tOnSuperModeChange(true);\n}\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoASkyControlEdit::OnExit(USoActivity* NewActivity)\n{\n\tUSoActivity::OnExit(NewActivity);\n\tOrb->SetEditorWidgetVisibility(ESoEditorUI::EEUI_Sky, false);\n\n\tif (bSuperMode)\n\t\tOnSuperModeChange(false);\n}\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// Tack\nvoid USoASkyControlEdit::Tick(float DeltaSeconds)\n{\n\tUSoActivity::Tick(DeltaSeconds);\n\n\tif (bSuperMode)\n\t\tSuperModeTick(DeltaSeconds);\n\n\tif (!bOnKeyPosition)\n\t\treturn;\n\n\tFSoSplinePoint SplineLocation = Orb->SoMovement->GetSplineLocation();\n\tASoPlayerSpline* PlayerSpline = Cast<ASoPlayerSpline>(SplineLocation.GetSpline());\n\tif (PlayerSpline == nullptr)\n\t\treturn;\n\n\tconst float Distance = SplineLocation.GetDistance();\n\tFSoSkyControlPoints& SkyPoints = PlayerSpline->GetSkyControlPoints();\n\tconst int32 Index = SkyPoints.GetClosestIndex(Distance);\n\tif (SkyPoints.ControlPoints.IsValidIndex(Index))\n\t{\n\t\tif (fabs(SkyPoints.ControlPoints[Index].Distance - Distance) > KINDA_SMALL_NUMBER)\n\t\t\tbOnKeyPosition = false;\n\t}\n\telse\n\t\tbOnKeyPosition = false;\n}\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoASkyControlEdit::SpecialEditButtonPressed(int32 Index)\n{\n\tif (PresetNames.Num() == 0)\n\t\treturn;\n\n\t// switch sky texture\n\tif (bOnKeyPosition)\n\t{\n\t\tFSoSplinePoint SplineLocation = Orb->SoMovement->GetSplineLocation();\n\t\tASoPlayerSpline* PlayerSpline = Cast<ASoPlayerSpline>(SplineLocation.GetSpline());\n\t\tif (PlayerSpline == nullptr)\n\t\t\treturn;\n\n\t\tFSoSkyControlPoints& SkyPoints = PlayerSpline->GetSkyControlPoints();\n\t\tconst int32 ClosestIndex = SkyPoints.GetClosestIndex(SplineLocation.GetDistance());\n\n\t\tint32 PresetIndex = 0;\n\t\tfor (int32 i = 0; i < PresetNames.Num(); ++i)\n\t\t\tif (PresetNames[i] == SkyPoints.ControlPoints[ClosestIndex].Preset)\n\t\t\t{\n\t\t\t\tPresetIndex = i;\n\t\t\t\tbreak;\n\t\t\t}\n\t\tPresetIndex = USoMathHelper::WrapIndexAround(PresetIndex + (Orb->bCtrlPressed ? -1 : 1), PresetNames.Num());\n\t\tSkyPoints.ControlPoints[ClosestIndex].Preset = PresetNames[PresetIndex];\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoASkyControlEdit::InteractKeyPressed(bool bPrimaryKey)\n{\n\tbEditHintVisible = !bEditHintVisible;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoASkyControlEdit::SaveEditedData()\n{\n\t// overrides the editor world data from the game world data\n\n\tTMap<FString, ASoPlayerSpline*> GameSplineMap;\n\tfor (TActorIterator<ASoPlayerSpline> ActorItr(Orb->GetWorld()); ActorItr; ++ActorItr)\n\t\tGameSplineMap.Add((*ActorItr)->GetSplineName(), *ActorItr);\n\n#if WITH_EDITOR\n\t// reload file in editor world to apply changes\n\tUWorld* EditorWorld = GEditor->GetEditorWorldContext().World();\n\n\tfor (TActorIterator<ASoPlayerSpline> ActorItr(EditorWorld); ActorItr; ++ActorItr)\n\t{\n\t\tASoPlayerSpline*const* SplinePtrPtr = GameSplineMap.Find((*ActorItr)->GetSplineName());\n\t\tif (SplinePtrPtr == nullptr)\n\t\t{\n\t\t\tUE_LOG(LogTemp, Warning, TEXT(\"Spline %s found in editor, does not exist in game - that shouldn't be possible!\"), *(*ActorItr)->GetSplineName());\n\t\t}\n\t\telse\n\t\t\t(*ActorItr)->GetSkyControlPoints() = (*SplinePtrPtr)->GetSkyControlPoints();\n\t}\n\n\tUPackage* Package = EditorWorld->GetOutermost();\n\tif (Package != nullptr && !Package->IsDirty())\n\t\tPackage->SetDirtyFlag(true);\n#endif\n\n}\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoASkyControlEdit::LoadEditedData()\n{\n\t// no reload here\n\t// user could just leave the game and reenter if he/she/it wants to cancel sky editing\n}\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoASkyControlEdit::CreateKey()\n{\n\tif (!bOnKeyPosition)\n\t{\n\t\tFSoSplinePoint SplineLocation = Orb->SoMovement->GetSplineLocation();\n\t\tASoPlayerSpline* PlayerSpline = Cast<ASoPlayerSpline>(SplineLocation.GetSpline());\n\t\tPlayerSpline->GetSkyControlPoints().CreateNewPoint(SplineLocation.GetDistance());\n\t\tbOnKeyPosition = true;\n\t}\n}\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoASkyControlEdit::MoveClosestKeyHere()\n{\n\tif (bOnKeyPosition)\n\t\treturn;\n\n\tFSoSplinePoint SplineLocation = Orb->SoMovement->GetSplineLocation();\n\tASoPlayerSpline* PlayerSpline = Cast<ASoPlayerSpline>(SplineLocation.GetSpline());\n\tconst float Distance = SplineLocation.GetDistance();\n\n\tif (PlayerSpline == nullptr)\n\t\treturn;\n\n\tFSoSkyControlPoints& SkyPoints = PlayerSpline->GetSkyControlPoints();\n\n\tif (SkyPoints.ControlPoints.Num() == 0)\n\t\treturn;\n\n\tconst int32 PreIndex = SkyPoints.GetPrevIndex(Distance);\n\tconst int32 PostIndex = SkyPoints.GetNextIndex(Distance);\n\n\tint32 Index = PostIndex;\n\tif (fabs(Distance - SkyPoints.ControlPoints[PreIndex].Distance) < fabs(Distance - SkyPoints.ControlPoints[PostIndex].Distance))\n\t\tIndex = PreIndex;\n\n\tif (Index == 0 || Index == SkyPoints.ControlPoints.Num() - 1)\n\t\treturn;\n\n\tSkyPoints.ControlPoints[Index].Distance = Distance;\n\tbOnKeyPosition = true;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// removes KeyNode (first and last is immune)\nvoid USoASkyControlEdit::DeleteActiveKeyNode()\n{\n\tif (!bOnKeyPosition)\n\t\treturn;\n\n\tFSoSplinePoint SplineLocation = Orb->SoMovement->GetSplineLocation();\n\tASoPlayerSpline* PlayerSpline = Cast<ASoPlayerSpline>(SplineLocation.GetSpline());\n\tconst float Distance = SplineLocation.GetDistance();\n\n\tif (PlayerSpline == nullptr)\n\t\treturn;\n\n\tFSoSkyControlPoints& SkyPoints = PlayerSpline->GetSkyControlPoints();\n\tconst int32 Index = SkyPoints.GetClosestIndex(Distance);\n\n\t// return type could be -1\n\t// first and last point can't be removed\n\t// if handles both cases\n\tif (Index > 0 && Index < SkyPoints.ControlPoints.Num() - 1)\n\t\tSkyPoints.ControlPoints.RemoveAt(Index);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoASkyControlEdit::CopyActiveKeyData()\n{\n\tif (!bOnKeyPosition)\n\t\treturn;\n\n\tFSoSplinePoint SplineLocation = Orb->SoMovement->GetSplineLocation();\n\tASoPlayerSpline* PlayerSpline = Cast<ASoPlayerSpline>(SplineLocation.GetSpline());\n\tif (PlayerSpline == nullptr)\n\t\treturn;\n\n\tFSoSkyControlPoints& SkyPoints = PlayerSpline->GetSkyControlPoints();\n\tconst int32 Index = SkyPoints.GetClosestIndex(SplineLocation.GetDistance());\n\tif (SkyPoints.ControlPoints.IsValidIndex(Index))\n\t{\n\t\tNodeCopy = SkyPoints.ControlPoints[Index];\n\t\tbNodeCopyInitialized = true;\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoASkyControlEdit::PasteToActiveKeyData()\n{\n\tif (!bOnKeyPosition || (!bNodeCopyInitialized))\n\t\treturn;\n\n\tFSoSplinePoint SplineLocation = Orb->SoMovement->GetSplineLocation();\n\tASoPlayerSpline* PlayerSpline = Cast<ASoPlayerSpline>(SplineLocation.GetSpline());\n\tif (PlayerSpline == nullptr)\n\t\treturn;\n\n\tFSoSkyControlPoints& SkyPoints = PlayerSpline->GetSkyControlPoints();\n\tconst int32 Index = SkyPoints.GetClosestIndex(SplineLocation.GetDistance());\n\tif (SkyPoints.ControlPoints.IsValidIndex(Index))\n\t{\n\t\tconst float Distance = SkyPoints.ControlPoints[Index].Distance;\n\t\tSkyPoints.ControlPoints[Index] = NodeCopy;\n\t\tSkyPoints.ControlPoints[Index].Distance = Distance;\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoASkyControlEdit::JumpToNextKey()\n{\n\tconst FSoSplinePoint SplineLocation = Orb->SoMovement->GetSplineLocation();\n\tconst ASoPlayerSpline* PlayerSpline = Cast<ASoPlayerSpline>(SplineLocation.GetSpline());\n\tif (PlayerSpline == nullptr)\n\t\treturn;\n\n\tconst FSoSkyControlPoints& SkyPoints = PlayerSpline->GetSkyControlPoints();\n\n\tint32 Index = 0;\n\tif (bOnKeyPosition)\n\t\tIndex = SkyPoints.GetClosestIndex(SplineLocation.GetDistance()) + 1;\n\telse\n\t\tIndex = SkyPoints.GetNextIndex(SplineLocation.GetDistance());\n\n\tif (SkyPoints.ControlPoints.IsValidIndex(Index))\n\t{\n\t\tFSoSplinePoint KeyPoint = SplineLocation;\n\t\tKeyPoint.SetDistance(SkyPoints.ControlPoints[Index].Distance);\n\t\tOrb->SetPositionOnSplineSP(KeyPoint, Orb->GetActorLocation().Z, false, false);\n\t\tbOnKeyPosition = true;\n\t}\n}\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoASkyControlEdit::JumpToPrevKey()\n{\n\tconst FSoSplinePoint SplineLocation = Orb->SoMovement->GetSplineLocation();\n\tconst ASoPlayerSpline* PlayerSpline = Cast<ASoPlayerSpline>(SplineLocation.GetSpline());\n\tif (PlayerSpline == nullptr)\n\t\treturn;\n\n\tconst FSoSkyControlPoints& SkyPoints = PlayerSpline->GetSkyControlPoints();\n\n\tint32 Index = 0;\n\tif (bOnKeyPosition)\n\t\tIndex = SkyPoints.GetClosestIndex(SplineLocation.GetDistance()) - 1;\n\telse\n\t\tIndex = SkyPoints.GetPrevIndex(SplineLocation.GetDistance());\n\n\tif (SkyPoints.ControlPoints.IsValidIndex(Index))\n\t{\n\t\tFSoSplinePoint KeyPoint = SplineLocation;\n\t\tKeyPoint.SetDistance(SkyPoints.ControlPoints[Index].Distance);\n\t\tOrb->SetPositionOnSplineSP(KeyPoint, Orb->GetActorLocation().Z, false, false);\n\t\tbOnKeyPosition = true;\n\t}\n}\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoASkyControlEdit::SuperEditModePressed()\n{\n\tbSuperMode = !bSuperMode;\n\tif (Orb->SoActivity == this)\n\t\tOnSuperModeChange(bSuperMode);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoASkyControlEdit::IsOnKey(bool& bOnKey, int32& NodeIndex, FName& Preset) const\n{\n\tbOnKey = bOnKeyPosition;\n\n\tconst FSoSplinePoint SplineLocation = Orb->SoMovement->GetSplineLocation();\n\tconst ASoPlayerSpline* PlayerSpline = Cast<ASoPlayerSpline>(SplineLocation.GetSpline());\n\tif (PlayerSpline == nullptr)\n\t\treturn;\n\tconst FSoSkyControlPoints& SkyPoints = PlayerSpline->GetSkyControlPoints();\n\tNodeIndex = SkyPoints.GetClosestIndex(SplineLocation.GetDistance());\n\n\tif (SkyPoints.ControlPoints.IsValidIndex(NodeIndex))\n\t\tPreset = SkyPoints.ControlPoints[NodeIndex].Preset;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoASkyControlEdit::GetPrevKeyNodeData(FName& Preset, float& Percent, float& Distance) const\n{\n\tconst FSoSplinePoint SplineLocation = Orb->SoMovement->GetSplineLocation();\n\tconst ASoPlayerSpline* PlayerSpline = Cast<ASoPlayerSpline>(SplineLocation.GetSpline());\n\tif (PlayerSpline == nullptr)\n\t\treturn;\n\tconst FSoSkyControlPoints& SkyPoints = PlayerSpline->GetSkyControlPoints();\n\tconst int32 NodeIndex = SkyPoints.GetPrevIndex(SplineLocation.GetDistance());\n\n\tif (SkyPoints.ControlPoints.IsValidIndex(NodeIndex))\n\t{\n\t\tPreset = SkyPoints.ControlPoints[NodeIndex].Preset;\n\t\tDistance = fabs(SkyPoints.ControlPoints[NodeIndex].Distance - SplineLocation.GetDistance());\n\t\tPercent = 1.0f - SkyPoints.GetInterpolated(SplineLocation).SecondWeight;\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoASkyControlEdit::GetNextKeyNodeData(FName& Preset, float& Percent, float& Distance) const\n{\n\tconst FSoSplinePoint SplineLocation = Orb->SoMovement->GetSplineLocation();\n\tconst ASoPlayerSpline* PlayerSpline = Cast<ASoPlayerSpline>(SplineLocation.GetSpline());\n\tif (PlayerSpline == nullptr)\n\t\treturn;\n\tconst FSoSkyControlPoints& SkyPoints = PlayerSpline->GetSkyControlPoints();\n\tconst int32 NodeIndex = SkyPoints.GetNextIndex(SplineLocation.GetDistance());\n\n\tif (SkyPoints.ControlPoints.IsValidIndex(NodeIndex))\n\t{\n\t\tPreset = SkyPoints.ControlPoints[NodeIndex].Preset;\n\t\tDistance = fabs(SkyPoints.ControlPoints[NodeIndex].Distance - SplineLocation.GetDistance());\n\t\tPercent = SkyPoints.GetInterpolated(SplineLocation).SecondWeight;\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nint32 USoASkyControlEdit::GetNodeCount() const\n{\n\tconst FSoSplinePoint SplineLocation = Orb->SoMovement->GetSplineLocation();\n\tconst ASoPlayerSpline* PlayerSpline = Cast<ASoPlayerSpline>(SplineLocation.GetSpline());\n\tif (PlayerSpline == nullptr)\n\t\treturn 0;\n\n\treturn PlayerSpline->GetSkyControlPoints().ControlPoints.Num();\n}\n"
  },
  {
    "path": "Source/SOrb/Character/SoCharStates/SoASkyControlEdit.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#pragma once\n\n#include \"SoActivity.h\"\n#include \"SplineLogic/SoSkyControlData.h\"\n#include \"SoASkyControlEdit.generated.h\"\n\n\nUCLASS()\nclass SORB_API USoASkyControlEdit : public USoActivity\n{\n\n\tGENERATED_BODY()\n\npublic:\n\n\tUSoASkyControlEdit();\n\n\tvoid InitializePresets(const TArray<FName>& InPresetNames) { PresetNames = InPresetNames; }\n\t\n\tvirtual void Tick(float DeltaSeconds) override;\t\n\t// show/hide help text\n\tvirtual void InteractKeyPressed(bool bPrimaryKey) override;\n\n\t// save/load from file\n\tvoid SaveEditedData() override;\n\tvoid LoadEditedData() override;\n\t// add/move/remove key node\n\tvoid CreateKey() override;\n\tvoid MoveClosestKeyHere() override;\n\tvoid DeleteActiveKeyNode() override;\n\n\tvirtual void CopyActiveKeyData() override;\n\tvirtual void PasteToActiveKeyData() override;\n\n\t// teleport the character into the KeyNode position\n\tvoid JumpToNextKey() override;\n\tvoid JumpToPrevKey() override;\n\n\tvirtual void ToggleWeapons() override {};\n\n\t// switches preset\n\tvirtual void SpecialEditButtonPressed(int32 Index) override;\n\n\tvirtual void SuperEditModePressed() override;\n\n\t// get data for gui\n\tUFUNCTION(BlueprintCallable, Category = UIInfo)\n\tvoid IsOnKey(bool& bOnKey, int32& NodeIndex, FName& Preset) const;\n\n\tUFUNCTION(BlueprintCallable, Category = UIInfo)\n\tvoid GetPrevKeyNodeData(FName& Preset, float& Percent, float& Distance) const;\n\n\tUFUNCTION(BlueprintCallable, Category = UIInfo)\n\tvoid GetNextKeyNodeData(FName& Preset, float& Percent, float& Distance) const;\n\n\tUFUNCTION(BlueprintCallable, Category = UIInfo)\n\tint32 GetNodeCount() const;\n\nprotected:\n\n\tvirtual void OnEnter(USoActivity* OldActivity) override;\n\tvirtual void OnExit(USoActivity* NewActivity) override;\n\nprotected:\n\n\tUPROPERTY(BlueprintReadOnly, Category = Sky)\n\tbool bOnKeyPosition = false;\n\n\tUPROPERTY(BlueprintReadOnly, Category = Sky)\n\tbool bEditHintVisible = false;\n\n\tUPROPERTY(BlueprintReadOnly, VisibleAnywhere, Category = Sky)\n\tTArray<FName> PresetNames;\n\n\t// protection from everything + the ability to fly\n\tbool bSuperMode = false;\n\n\tFSoSkyControlPoint NodeCopy;\n\tbool bNodeCopyInitialized = false;\n};\n\n"
  },
  {
    "path": "Source/SOrb/Character/SoCharStates/SoASlide.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#include \"SoASlide.h\"\n\n#include \"Particles/ParticleSystemComponent.h\"\n#include \"TimerManager.h\"\n\n#include \"FMODAudioComponent.h\"\n\n#include \"SoADefault.h\"\n#include \"Character/SoCharacter.h\"\n#include \"CharacterBase/SoCharacterMovementComponent.h\"\n#include \"Basic/SoAudioManager.h\"\n\nconst FName SoCharSFXSlideParamName = FName(\"slide_speed\");\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUSoASlide::USoASlide() :\n\tUSoActivity(EActivity::EA_Sliding)\n{\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoASlide::Tick(float DeltaSeconds)\n{\n\tUSoActivity::Tick(DeltaSeconds);\n\tOrb->SoMovement->MaxWalkSpeed = Orb->bRollPressed ? CrouchSpeed : MovementSpeed;\n\tOrb->SlideSFX->SetParameter(SoCharSFXSlideParamName, Orb->bRollPressed ? 1.0f : 0.0f);\n\n\tif (bRollWasPressed != Orb->bRollPressed)\n\t{\n\t\tbRollWasPressed = Orb->bRollPressed;\n\t\tUSoAudioManager::PlaySoundAtLocation(Orb, bRollWasPressed ? Orb->SFXSlideCrouchStart : Orb->SFXSlideCrouchEnd, Orb->GetActorTransform());\n\t\tOrb->RefreshDefaultKeyMovementLights();\n\t}\n\n\tif (bWasInAir != Orb->SoMovement->IsMovingOnGround())\n\t{\n\t\tbWasInAir = !bWasInAir;\n\t\tif (bWasInAir)\n\t\t\tOrb->SlideSFX->Activate();\n\t\telse\n\t\t\tOrb->SlideSFX->Deactivate();\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoASlide::HandleCollision()\n{\n\tif (Orb->bRollPressed)\n\t{\n\t\tif (!Orb->IsCollisionDecreased())\n\t\t\tOrb->DecreaseCollisionSize();\n\t}\n\telse\n\t{\n\t\tif (Orb->IsCollisionDecreased())\n\t\t\tOrb->IncreaseCollisionSize();\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoASlide::OnEnter(USoActivity* OldActivity)\n{\n\tUSoActivity::OnEnter(OldActivity);\n\tHandleCollision();\n\n\tOrb->CapsuleBottomVFX->SetTemplate(Orb->VFXSlide);\n\tOrb->CapsuleBottomVFX->Activate();\n\n\tOrb->SlideSFX->Activate(true);\n\tOrb->SlideSFX->SetParameter(SoCharSFXSlideParamName, Orb->bRollPressed ? 1.0f : 0.0f);\n\tbRollWasPressed = Orb->bRollPressed;\n\tbWasInAir = false;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoASlide::OnExit(USoActivity* NewActivity)\n{\n\tOrb->SoMovement->SetMovementMode(EMovementMode::MOVE_Falling);\n\tUSoActivity::OnExit(NewActivity);\n\tOrb->CapsuleBottomVFX->Deactivate();\n\tOrb->SlideSFX->Deactivate();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoASlide::OnBaseChanged(AActor* ActualMovementBase)\n{\n\tif (ActualMovementBase != nullptr)\n\t{\n\t\tif (!(ActualMovementBase->ActorHasTag(SlipperyPosTag) || ActualMovementBase->ActorHasTag(SlipperyNegTag)))\n\t\t\tSwitchActivity(Orb->SoADefault);\n\t}\n}\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoASlide::JumpPressed()\n{\n\tOrb->SoMovement->Velocity.Z += Orb->bRollPressed ? CrouchJumpVelocity : Orb->SoMovement->JumpZVelocity;\n\tSwitchActivity(Orb->SoADefault);\n\n\tOrb->ForcedMovementCounter = JumpControlBanTime;\n\tOrb->ForcedMovementValue = DirModifier;\n\t// USoAudioManager::PlaySoundAtLocation(Orb, Orb->SFXSlideJump, Orb->GetActorTransform());\n\tOrb->JumpSFX->SetEvent(Orb->SFXSlideJump);\n\tOrb->JumpSFX->Play();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoASlide::Move(float Value)\n{\n\tconst FVector MovDir = Orb->SoMovement->GetDirection();\n\tOrb->AddMovementInput(MovDir, 1.0f * DirModifier);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoASlide::CanBeInterrupted(EActivity DesiredState) const\n{\n\treturn bAllowStrikeInSlide && DesiredState == EActivity::EA_Striking;\n}\n"
  },
  {
    "path": "Source/SOrb/Character/SoCharStates/SoASlide.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#pragma once\n\n#include \"SoActivity.h\"\n#include \"SoASlide.generated.h\"\n\n\nUCLASS()\nclass SORB_API USoASlide : public USoActivity\n{\n\tGENERATED_BODY()\npublic:\n\tUSoASlide();\n\n\tvirtual void Tick(float DeltaSeconds) override;\n\t\n\tvirtual void OnEnter(USoActivity* OldActivity) override;\n\tvirtual void OnExit(USoActivity* NewActivity) override;\n\n\tvirtual void OnBaseChanged(AActor* ActualMovementBase) override;\n\n\t// inputs\n\tvirtual void JumpPressed() override;\n\tvirtual void Move(float Value) override;\n\n\tvirtual void HandleCollision() override;\n\n\tvirtual bool CanBeInterrupted(EActivity DesiredState = EActivity::EA_Max) const override;\n\nprotected:\n\n\tUPROPERTY(EditAnywhere)\n\tfloat CrouchSpeed = 1000;\n\n\tUPROPERTY(EditAnywhere)\n\tfloat CrouchJumpVelocity = 300;\n\n\tUPROPERTY(EditAnywhere)\n\tfloat JumpControlBanTime = 1.0f;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite)\n\tbool bAllowStrikeInSlide = false;\n\n\tfloat DirModifier = 1.0f;\n\n\tbool bRollWasPressed = false;\n\tbool bWasInAir = false;\n\n\tfriend class ASoCharacter;\n\tfriend class USoActivity;\n};\n"
  },
  {
    "path": "Source/SOrb/Character/SoCharStates/SoAStrike.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#include \"SoAStrike.h\"\n\n#include \"TimerManager.h\"\n#include \"Components/SkeletalMeshComponent.h\"\n#include \"Components/CapsuleComponent.h\"\n#include \"Engine/StaticMeshActor.h\"\n#include \"Kismet/GameplayStatics.h\"\n// #include \"DrawDebugHelpers.h\"\n\n#include \"SoASlide.h\"\n#include \"CharacterBase/SoCharacterMovementComponent.h\"\n#include \"Character/SoCharacter.h\"\n#include \"Character/SoPlayerCharacterSheet.h\"\n#include \"Character/SoCharacterStrike.h\"\n#include \"Character/SoCharStates/SoAWeaponInArm.h\"\n#include \"Projectiles/SoProjectileSpawnerComponent.h\"\n#include \"Items/SoItem.h\"\n#include \"Items/ItemTemplates/SoWeaponTemplate.h\"\n#include \"Basic/SoAudioManager.h\"\n#include \"Basic/SoGameSingleton.h\"\n#include \"Basic/SoGameMode.h\"\n#include \"Enemy/SoEnemy.h\"\n#include \"Items/SoItemHelper.h\"\n#include \"Basic/Helpers/SoStaticHelper.h\"\n#include \"Basic/Helpers/SoDateTimeHelper.h\"\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// set base flags\nUSoAStrike::USoAStrike() :\n\tUSoActivity(EActivity::EA_Striking)\n{\n\tLookDirection = ESoLookDirection::ELD_Frozen;\n\tbArmed = true;\n\tbStaminaReg = false;\n\tJumpType = ESoJumpType::EJT_BounceIfPressed;\n}\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoAStrike::OnEnter(USoActivity* OldActivity)\n{\n\tconst FSoItem& Item = Orb->SoPlayerCharacterSheet->GetEquippedItem(ESoItemSlot::EIS_Weapon0);\n\tUSoActivity::OnEnter(OldActivity);\n\tOrb->ApplyStaticEffects(Item, true);\n\n\tStrike();\n}\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoAStrike::OnExit(USoActivity* NewActivity)\n{\n\tUSoActivity::OnExit(NewActivity);\n\n\tif (!NewActivity->IsArmedState())\n\t\tOrb->OnArmedStateLeft();\n\n\tOrb->SoMovement->ClearRootMotionDesc();\n\tOrb->gTimerManager->ClearTimer(StrikePressedRecentlyTimer);\n\n\tbIsInStrike = false;\n\tStrikeComboChainIndex = -1;\n\n\tconst FSoItem& Item = Orb->SoPlayerCharacterSheet->GetEquippedItem(ESoItemSlot::EIS_Weapon0);\n\tOrb->ApplyStaticEffects(Item, false);\n\n\tOrb->SoMovement->GravityScale = 2.0f;\n\n\tif (AppliedEffect != ESoStatusEffect::ESE_NumOf)\n\t{\n\t\tISoMortal::Execute_OnStatusEffectChanged(Orb, AppliedEffect, false);\n\t\tAppliedEffect = ESoStatusEffect::ESE_NumOf;\n\t}\n\tbSpawnedCanNotSFX = false;\n\n\tActiveTrailMesh = nullptr;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoAStrike::Move(float Value)\n{\n\tUSoActivity::Move(bFreezeInAir ? 0.0f : Value);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoAStrike::Tick(float DeltaSeconds)\n{\n\tUSoActivity::Tick(DeltaSeconds);\n\n\tconst float CorrectedDeltaSeconds = DeltaSeconds * AttackSpeedMultiplier;\n\n\t// update strike\n\tconst float OldTime = StrikeCounter;\n\tStrikeCounter -= CorrectedDeltaSeconds;\n\n\tif (bWaitBeforeStrike)\n\t{\n\t\t// if (Orb->bRollPressed)\n\t\t// \tRollPressed();\n\t\t// else\n\t\tif (StrikeCounter < 0.0f)\n\t\t{\n\t\t\tbWaitBeforeStrike = false;\n\t\t\tStrikeComboChainIndex -= 1;\n\t\t\tStrike();\n\t\t}\n\n\t\treturn;\n\t}\n\n\tconst float PassedTime = StrikeCounterStart - StrikeCounter;\n\tconst float OldPassedTime = StrikeCounterStart - OldTime;\n\tif (ActiveStrikeData != nullptr)\n\t{\n\t\tfor (int32 i = 0; i < ActiveStrikeData->StrikeList.Num(); ++i)\n\t\t{\n\t\t\tconst FSoStrikeEntry& StrikeData = ActiveStrikeData->StrikeList[i];\n\n\t\t\tif (OldPassedTime <= StrikeData.TrailDelay && PassedTime > StrikeData.TrailDelay)\n\t\t\t\tApplyTrail(StrikeData, i == 0);\n\n\t\t\t// if (OldPassedTime <= StrikeData.StrikeDelay && PassedTime > StrikeData.StrikeDelay)\n\t\t\tif ((OldPassedTime >= StrikeData.StrikeDelay && OldPassedTime <= StrikeData.StrikeDelay + StrikeData.StrikeDmgDuration) ||\n\t\t\t\t(PassedTime >= StrikeData.StrikeDelay && PassedTime <= StrikeData.StrikeDelay + StrikeData.StrikeDmgDuration))\n\t\t\t{\n\t\t\t\tensure(TrailMeshes.IsValidIndex(i));\n\t\t\t\tApplyDamage(StrikeData, TrailMeshes[i], ActiveStrikeData->IgnoreWallHitBellowZThreshold, i);\n\n\t\t\t\tif (ActiveStrikeData->bForceGroundAnimsOnBlendOut)\n\t\t\t\t\tOrb->bForceGroundAnims = true;\n\t\t\t}\n\t\t}\n\n\t\tfor (const FSoJump& Jump : ActiveStrikeData->Jumps)\n\t\t\tif (OldPassedTime <= Jump.Time && PassedTime > Jump.Time)\n\t\t\t{\n\t\t\t\tOrb->SoMovement->Velocity.Z = Jump.Velocity;\n\t\t\t\tOrb->SoMovement->SetMovementMode(MOVE_Falling);\n\t\t\t}\n\n\t\t// NOT USED right now\n\t\t// for (const FSoHorizontalMovement& Movement : ActiveStrikeData->HorizontalMovements)\n\t\t// {\n\t\t// \tif (OldPassedTime <= Movement.StartTime && PassedTime > Movement.StartTime)\n\t\t// \t{\n\t\t// \t\tOrb->SoMovement->MaxWalkSpeed = Movement.Velocity;\n\t\t// \t\tconst float OldVelocityZ = Orb->SoMovement->Velocity.Z;\n\t\t// \t\tOrb->SoMovement->Velocity = Orb->GetActorForwardVector() * Movement.Velocity;\n\t\t// \t\tOrb->SoMovement->Velocity.Z = OldVelocityZ;\n\t\t//\n\t\t// \t\tOrb->ForcedMovementCounter = Movement.EndTime - Movement.StartTime;\n\t\t// \t\tOrb->ForcedMovementValue = Orb->SoMovement->GetSplineLocation().GetDirectionModifierFromVector(Orb->SoMovement->Velocity);\n\t\t// \t}\n\t\t//\n\t\t// \tif (OldPassedTime <= Movement.EndTime && PassedTime > Movement.EndTime)\n\t\t// \t{\n\t\t// \t\tOrb->SoMovement->MaxWalkSpeed = MovementSpeed;\n\t\t// \t\tOrb->ForcedMovementCounter = -1.0f; // just in case\n\t\t// \t\tOrb->LastInputDirection = Orb->GetActorForwardVector();\n\t\t// \t}\n\t\t// }\n\n\t\tif (ActiveStrikeData->ProjectileClass != nullptr && OldPassedTime <= ActiveStrikeData->RangeAttackDelay && PassedTime > ActiveStrikeData->RangeAttackDelay)\n\t\t{\n\t\t\tFSoSplinePoint SplinePoint = Orb->SoMovement->GetSplineLocation();\n\t\t\tSplinePoint += SplinePoint.GetDirectionModifierFromVector(Orb->GetActorForwardVector()) * 100;\n\t\t\tOrb->WeaponProjectileSpawner->SpawnFromProjectileOnSpline(ActiveStrikeData->ProjectileClass,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t  SplinePoint.ToVector(Orb->GetActorLocation().Z),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t  Orb->GetActorRotation(),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t  SplinePoint);\n\t\t\tif (ActiveStrikeData->WeaponToHideIndex == 0)\n\t\t\t\tOrb->ForceHideWeapon(ActiveStrikeData->WeaponHideDuration, true);\n\t\t\telse if (ActiveStrikeData->WeaponToHideIndex == 1)\n\t\t\t\tOrb->ForceHideWeapon(ActiveStrikeData->WeaponHideDuration, false);\n\t\t}\n\t}\n\n\tif (StrikeCounter < ActiveBlendOutTime)\n\t{\n\t\tOrb->SoMovement->GravityScale = 2.0f;\n\t\tbIsInStrike = false;\n\t\tif (Orb->bRollPressed)\n\t\t{\n\t\t\tOnStrikeChainFinished(ActiveBlendOutTime - FMath::Max(StrikeCounter, 0.0f));\n\t\t\tRollPressed();\n\t\t\treturn;\n\t\t}\n\t\tif (bStrikePressedRecently)\n\t\t{\n\t\t\tconst FSoItem& Item = Orb->GetPlayerCharacterSheet()->GetEquippedItem(ESoItemSlot::EIS_Weapon0);\n\t\t\tUSoWeaponTemplate* WeaponTemplate = Cast<USoWeaponTemplate>(Item.Template);\n\t\t\tif (WeaponTemplate != nullptr)\n\t\t\t{\n\t\t\t\tconst bool bStrikeSwitch = Orb->bSpecialStrikeWasRequestedLast != bSpecialStrikeWasExecutedLast;\n\t\t\t\tconst bool bActiveStrikeHasMore = WeaponTemplate->IsValidStrikeIndex(StrikeComboChainIndex + 1, bSpecialStrikeWasExecutedLast);\n\n\t\t\t\tif (!bStrikeSwitch &&\n\t\t\t\t\t(bActiveStrikeHasMore || !HasStrikeCooldown(bSpecialStrikeWasExecutedLast)))\n\t\t\t\t{\n\t\t\t\t\tif (!bActiveStrikeHasMore)\n\t\t\t\t\t\tStrikeComboChainIndex = -1;\n\n\t\t\t\t\tStrike();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (bStrikeSwitch)\n\t\t\t\t{\n\t\t\t\t\tif (CanStrike(Orb->bSpecialStrikeWasRequestedLast, !bSpawnedCanNotSFX))\n\t\t\t\t\t{\n\t\t\t\t\t\tOnStrikeChainFinished(ActiveBlendOutTime - FMath::Max(StrikeCounter, 0.0f));\n\t\t\t\t\t\tStrikeComboChainIndex = -1;\n\t\t\t\t\t\tStrike();\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tbSpawnedCanNotSFX = true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (StrikeCounter < 0.0f)\n\t\t{\n\t\t\tOnStrikeChainFinished(ActiveBlendOutTime);\n\t\t\tif (LastActivity == Orb->SoASlide && Orb->SoMovement->IsMovingOnGround())\n\t\t\t\tSwitchActivity(Orb->SoASlide);\n\t\t\telse\n\t\t\t\tSwitchActivity(Orb->SoAWeaponInArm);\n\t\t}\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoAStrike::Strike()\n{\n\tActiveTrailMesh = nullptr;\n\n\tif (Orb->bFreezeOrientationUntilLand)\n\t\tOrb->bFreezeOrientationUntilLand = false;\n\n\tbStrikePressedRecently = false;\n\tStrikeComboChainIndex += 1;\n\tbStrikeA = !bStrikeA;\n\tbWaitBeforeStrike = false;\n\n\tComponentsAlreadyHitA.Empty();\n\tComponentsAlreadyHitB.Empty();\n\n\tconst FSoItem& Item = Orb->GetPlayerCharacterSheet()->GetEquippedItem(ESoItemSlot::EIS_Weapon0);\n\tUSoWeaponTemplate* WeaponTemplate = Cast<USoWeaponTemplate>(Item.Template);\n\tif (WeaponTemplate == nullptr || !WeaponTemplate->IsValidStrikeIndex(StrikeComboChainIndex, Orb->bSpecialStrikeWasRequestedLast))\n\t{\n\t\tSwitchActivity(Orb->SoAWeaponInArm);\n\t\treturn;\n\t}\n\n\tActiveAutoAimDistance = WeaponTemplate->GetAutoAimDistance();\n\tUSoCharacterStrike* Strike = WeaponTemplate->GetStrike(Orb->bSpecialStrikeWasRequestedLast);\n\n\tconst FSoCharacterStrikeData& StrikeData = Strike->GetStrikeData(StrikeComboChainIndex);\n\tbStrikeBlendIn = StrikeData.bBlendIn;\n\n\t// if weapon is force hidden and this strike does not throw weapon or it wants to throw the weapon which is hidden then display that weapon\n\tif (Orb->bForceHideLeftWeapon || Orb->bForceHideRightWeapon)\n\t{\n\t\tif (StrikeData.ProjectileClass == nullptr ||\n\t\t\t((Orb->bForceHideLeftWeapon && StrikeData.WeaponToHideIndex == 1) ||\n\t\t\t (Orb->bForceHideRightWeapon && StrikeData.WeaponToHideIndex == 0)))\n\t\t\tOrb->ClearForceHideWeapon();\n\t}\n\n\n\tif (StrikeData.bRequiresJump)\n\t{\n\t\tconst bool bMovingOnGround = Orb->GetCharacterMovement()->IsMovingOnGround();\n\t\tconst float TimeSinceLastJump = Orb->GetWorld()->GetTimeSeconds() - Orb->LastJumpTime;\n\t\tconst float Delay = StrikeData.bStartWithLand ? 0.5f : 0.2f;\n\t\tif (bMovingOnGround || TimeSinceLastJump < Delay)\n\t\t{\n\t\t\tJumpPressed();\n\t\t\tbWaitBeforeStrike = true;\n\t\t\tStrikeCounter = bMovingOnGround ? Delay : Delay - TimeSinceLastJump;\n\t\t\tbIsInStrike = false;\n\t\t\treturn;\n\t\t}\n\t}\n\n\tOrb->SelectWeapon(Item);\n\n\t// UE_LOG(LogTemp, Warning, TEXT(\"Strike %d\"), StrikeIndex);\n\tAttackSpeedMultiplier = Orb->SoPlayerCharacterSheet->GetAttackSpeedMultiplier();\n\n\t// fill data for animation blueprint\n\tFSoStrikeAnimData& AnimData = bStrikeA ? AnimDataA : AnimDataB;\n\tAnimData.Anim = StrikeData.AnimSequenceNew;\n\tAnimData.AnimEndBlend = StrikeData.AnimEndingSequenceRight;\n\tAnimData.AnimEndBlendLeft = StrikeData.AnimEndingSequenceLeft;\n\tif (AnimData.Anim != nullptr)\n\t{\n\t\tAnimData.AnimPlayRate = (AnimData.Anim->GetPlayLength() / StrikeData.AnimDuration) * AttackSpeedMultiplier;\n\t\tStrikeCounter = StrikeData.AnimDuration + StrikeData.AnimEndDuration;\n\t\tStrikeCounterStart = StrikeCounter;\n\t\tActiveBlendOutTime = StrikeData.AnimEndDuration;\n\t}\n\telse\n\t{\n\t\tSwitchActivity(Orb->SoAWeaponInArm);\n\t\treturn;\n\t}\n\n\tif (AnimData.AnimEndBlend != nullptr)\n\t\tAnimData.AnimEndBlendPlayRate = (AnimData.AnimEndBlend->GetPlayLength() / StrikeData.AnimEndDuration) * AttackSpeedMultiplier;\n\n\tbIsInStrike = true;\n\n\t// update orientation\n\tif (StrikeData.ProjectileClass != nullptr || !AutoAim())\n\t{\n\t\tconst float MovementAxisValue = Orb->GetMovementXAxisValue();\n\t\tconst FVector MovDir = Orb->SoMovement->GetDirection() * MovementAxisValue * ((Orb->SavedCamMovModifier != 0) ? Orb->SavedCamMovModifier : 1);\n\t\tif (fabs(MovementAxisValue) > KINDA_SMALL_NUMBER)\n\t\t{\n\t\t\tif ((MovDir.GetSafeNormal() | Orb->GetActorForwardVector()) < 0.0f)\n\t\t\t{\n\t\t\t\tOrb->SetActorRotation(MovDir.Rotation());\n\t\t\t\tUpdateCamera(0.01f);\n\t\t\t\tOrb->StoredForwardVector = Orb->GetActorForwardVector();\n\t\t\t}\n\t\t}\n\t}\n\n\n\tFSoRootMotionDesc RootMotionDesc = StrikeData.RootMotionDesc;\n\tif (RootMotionDesc.bVerticalRootMotionEnabled && StrikeData.bStopVerticalRootMotionNearApex && !Orb->SoMovement->IsMovingOnGround())\n\t\tRootMotionDesc.bVerticalRootMotionEnabled = false;\n\n\tOrb->SoMovement->SetRootMotionDesc(RootMotionDesc);\n\n\tRangeAttackCounter = 0.0f;\n\tActiveStrikeData = &StrikeData;\n\tActiveWeaponTemplate = WeaponTemplate;\n\n\tbSpecialStrikeWasExecutedLast = Orb->bSpecialStrikeWasRequestedLast;\n\n\tTrailMeshes.Empty(StrikeData.StrikeList.Num());\n\n\tbFreezeInAir = StrikeData.bFreezeInAir && !Orb->SoMovement->IsMovingOnGround();\n\tOrb->SoMovement->GravityScale = bFreezeInAir ? 0.0f : 2.0f;\n\tif (bFreezeInAir)\n\t\tOrb->SoMovement->Velocity = FVector(0.0f, 0.0f, 0.0f);\n\n\tconst ESoStatusEffect NewAppliedEffect = Strike->GetStatusEffect();\n\n\tif (NewAppliedEffect != AppliedEffect && NewAppliedEffect != ESoStatusEffect::ESE_NumOf)\n\t{\n\t\tISoMortal::Execute_OnStatusEffectChanged(Orb, AppliedEffect, false);\n\t\tAppliedEffect = NewAppliedEffect;\n\t\tif (AppliedEffect != ESoStatusEffect::ESE_NumOf)\n\t\t\tISoMortal::Execute_OnStatusEffectChanged(Orb, AppliedEffect, true);\n\t}\n\n\tbSpawnedCanNotSFX = false;\n\n\tif (StrikeData.bStartWithLand && !Orb->SoMovement->IsMovingOnGround())\n\t\tForceLand();\n\telse\n\t\tLandingAmount = -1.0f;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoAStrike::ForceLand()\n{\n\tconst FVector Start = Orb->GetActorLocation();\n\tconst FVector ToEnd = -FVector(0.f, 0.f, 1000);\n\n\tFCollisionQueryParams TraceParams;\n\tTraceParams.AddIgnoredActor(Orb);\n\tstatic const FName PawnName = FName(\"Pawn\");\n\n\tFHitResult HitData(ForceInit);\n\tif (GetWorld()->SweepSingleByProfile(HitData,\n\t\t\t\t\t\t\t\t\t Start,\n\t\t\t\t\t\t\t\t\t Start + ToEnd,\n\t\t\t\t\t\t\t\t\t Orb->GetCapsuleComponent()->GetComponentQuat(),\n\t\t\t\t\t\t\t\t\t PawnName,\n\t\t\t\t\t\t\t\t\t Orb->GetCapsuleComponent()->GetCollisionShape(),\n\t\t\t\t\t\t\t\t\t TraceParams))\n\t{\n\t\tLandingAmount = -ToEnd.Z * HitData.Time;\n\t\tOrb->SetActorLocation(Start + HitData.Time * ToEnd, true);\n\t\tOrb->SoMovement->Velocity = FVector(0.0f, 0.0f, 0.0f);\n\t\tOrb->JumpPressedRecentlyTimeOver();\n\n\t\tif (!AutoAim() && Orb->LastInputDirection.SizeSquared() > KINDA_SMALL_NUMBER)\n\t\t{\n\t\t\tOrb->SetActorRotation(Orb->LastInputDirection.Rotation());\n\t\t\tUpdateCamera(0.01f);\n\t\t}\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoAStrike::OnStrikeChainFinished(float BlendTimeToSubtractFromCounter)\n{\n\tUSoCharacterStrike* CharacterStrike = nullptr;\n\tif (ActiveWeaponTemplate != nullptr)\n\t\tCharacterStrike = ActiveWeaponTemplate->GetStrike(bSpecialStrikeWasExecutedLast);\n\n\tif (CharacterStrike != nullptr)\n\t{\n\t\tconst float Cooldown = CharacterStrike->GetCooldownTime();\n\t\tif (Cooldown > 0.0f)\n\t\t\tOrb->AddCooldown(CharacterStrike, Cooldown - BlendTimeToSubtractFromCounter, CharacterStrike->CanCountDownInAir_Implementation());\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoAStrike::ApplyTrail(const struct FSoStrikeEntry& StrikeData, bool bAllowTurn)\n{\n\tAutoAim();\n\n\tUSkeletalMeshComponent* CharMesh = Orb->GetMesh();\n\tAStaticMeshActor* StaticMeshActor = nullptr;\n\tif (Orb->WeaponTrailMeshes.Num() == 0)\n\t{\n\t\tStaticMeshActor = Orb->GetWorld()->SpawnActor<AStaticMeshActor>(AStaticMeshActor::StaticClass(), CharMesh->GetComponentTransform());\n\t\tStaticMeshActor->SetMobility(EComponentMobility::Movable);\n\t}\n\telse\n\t{\n\t\tStaticMeshActor = Orb->WeaponTrailMeshes.Pop();\n\t\tStaticMeshActor->GetStaticMeshComponent()->SetVisibility(true);\n\t\tStaticMeshActor->SetActorTransform(CharMesh->GetComponentTransform());\n\t\t// DrawDebugSphere(Orb->GetWorld(), CharMesh->GetComponentTransform().GetLocation(), 16.0f, 32, FColor::Red, true, 100.0f);\n\t}\n\tUStaticMeshComponent* TrailComponent = StaticMeshActor->GetStaticMeshComponent();\n\tTrailComponent->SetCollisionEnabled(ECollisionEnabled::NoCollision);\n\tTrailComponent->SetStaticMesh(StrikeData.TrailMesh);\n\tTrailComponent->SetTranslucentSortPriority(StrikeData.TranslucencySortPriority);\n\tif (StrikeData.bAttachToCharacter)\n\t{\n\t\tStaticMeshActor->AttachToComponent(Orb->GetMesh(), FAttachmentTransformRules::KeepWorldTransform);\n\t\tStaticMeshActor->GetRootComponent()->bAbsoluteRotation = true;\n\t}\n\telse\n\t\tStaticMeshActor->DetachFromActor(FDetachmentTransformRules::KeepWorldTransform);\n\tStaticMeshActor->SetActorRotation(CharMesh->GetComponentRotation()); // no idea why but it has to be called :/\n\n\tOrb->WeaponTrailMeshFadeList.Add({StaticMeshActor, StrikeData.TrailDisplayTime, StrikeData.TrailDisplayTime });\n\tActiveTrailMesh = StaticMeshActor;\n\n\tstatic const FName SlideValueName = FName(\"Slide\");\n\tTrailComponent->SetScalarParameterValueOnMaterials(SlideValueName, 0.0f);\n\tstatic const FName ColorValueName = FName(\"Color\");\n\tstatic const FName AnimValueName = FName(\"AnimLight\");\n\tif (ActiveWeaponTemplate != nullptr)\n\t{\n\t\tFVector TrailColor = FVector(ActiveWeaponTemplate->GetTrailColor());\n\t\tFVector TrailAnimLight = FVector(ActiveWeaponTemplate->GetTrailAnimLight());\n\n\t\tfor (const FSoWeaponBoost& WeaponBoost : Orb->WeaponBoosts)\n\t\t\tif (WeaponBoost.WeaponTemplate == ActiveWeaponTemplate)\n\t\t\t{\n\t\t\t\tTrailColor = FVector(WeaponBoost.TrailColor);\n\t\t\t\tTrailAnimLight = FVector(WeaponBoost.TrailAnimLight);\n\t\t\t}\n\t\tTrailComponent->SetVectorParameterValueOnMaterials(ColorValueName, TrailColor);\n\t\tTrailComponent->SetVectorParameterValueOnMaterials(AnimValueName, TrailAnimLight);\n\t}\n\tTrailMeshes.Push(TrailComponent);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoAStrike::ApplyDamage(const struct FSoStrikeEntry& StrikeData, UStaticMeshComponent* TrailComponent, float WallHitThreshold, int32 StrikeIndex)\n{\n\tif (TrailComponent == nullptr)\n\t\treturn;\n\n\tauto& ComponentsAlreadyHit = StrikeIndex == 0 ? ComponentsAlreadyHitA : ComponentsAlreadyHitB;\n\n\tTrailComponent->SetCollisionEnabled(ECollisionEnabled::QueryOnly);\n\n\tFComponentQueryParams Param = FComponentQueryParams::DefaultComponentQueryParams;\n\tParam.AddIgnoredActor(Orb);\n\tParam.bIgnoreTouches = true;\n\tTArray<struct FOverlapResult> OutOverlaps;\n\tTrailComponent->ComponentOverlapMulti(\tOutOverlaps,\n\t\t\t\t\t\t\t\t\t\t\tOrb->GetWorld(),\n\t\t\t\t\t\t\t\t\t\t\tTrailComponent->GetComponentLocation(),\n\t\t\t\t\t\t\t\t\t\t\tTrailComponent->GetComponentTransform().GetRotation(),\n\t\t\t\t\t\t\t\t\t\t\tECollisionChannel::ECC_PhysicsBody,\n\t\t\t\t\t\t\t\t\t\t\tParam,\n\t\t\t\t\t\t\t\t\t\t\tFCollisionObjectQueryParams::DefaultObjectQueryParam);\n\tTrailComponent->SetCollisionEnabled(ECollisionEnabled::NoCollision);\n\n\tconst FVector AttackSourceLocation = Orb->GetMesh()->GetSocketLocation(FName(\"ItemAttachPoint\"));\n\n\tTMap<AActor*, FSoMeleeHitParam> HitList;\n\tTSet<UPrimitiveComponent*> EnvironmentHits;\n\n\tfor (const FOverlapResult& Overlap : OutOverlaps)\n\t{\n\t\tif (UPrimitiveComponent* Component = Overlap.Component.Get())\n\t\t{\n\t\t\tif (ComponentsAlreadyHit.Contains(Component))\n\t\t\t\tcontinue;\n\n\t\t\tComponentsAlreadyHit.Add(Component);\n\t\t\tauto SpawnEnvironmentHitVFX = [this, &EnvironmentHits, Component, &AttackSourceLocation, &Overlap, &WallHitThreshold](bool bIgnoreWallHitThreshold)\n\t\t\t{\n\t\t\t\tif (!EnvironmentHits.Contains(Component) &&\n\t\t\t\t\t(Component->GetCollisionObjectType() == ECollisionChannel::ECC_WorldStatic ||\n\t\t\t\t\t\tComponent->GetCollisionObjectType() == ECollisionChannel::ECC_WorldDynamic))\n\t\t\t\t{\n\t\t\t\t\tFVector HitLocation;\n\t\t\t\t\tconst FName BoneName = USoStaticHelper::GetBoneNameFromBodyIndex(Cast<USkeletalMeshComponent>(Component), Overlap.ItemIndex);\n\t\t\t\t\tconst float Distance = Component->GetClosestPointOnCollision(AttackSourceLocation, HitLocation, BoneName);\n\t\t\t\t\tif (Distance > KINDA_SMALL_NUMBER)\n\t\t\t\t\t{\n\t\t\t\t\t\tEnvironmentHits.Add(Component);\n\t\t\t\t\t\tif (bIgnoreWallHitThreshold || (AttackSourceLocation.Z + WallHitThreshold < HitLocation.Z))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tFHitResult Hit;\n\t\t\t\t\t\t\tComponent->LineTraceComponent(Hit,\n\t\t\t\t\t\t\t\tAttackSourceLocation,\n\t\t\t\t\t\t\t\tAttackSourceLocation + (HitLocation - AttackSourceLocation) * 2,\n\t\t\t\t\t\t\t\tFCollisionQueryParams::DefaultQueryParam);\n\n\t\t\t\t\t\t\tUPhysicalMaterial* PhyMat = Hit.PhysMaterial.Get();\n\n\t\t\t\t\t\t\tif (PhyMat == nullptr)\n\t\t\t\t\t\t\t\tPhyMat = Component->BodyInstance.GetSimplePhysicalMaterial();\n\n\t\t\t\t\t\t\t//DrawDebugLine(Orb->GetWorld(), AttackSourceLocation,\n\t\t\t\t\t\t\t//\tAttackSourceLocation + (HitLocation - AttackSourceLocation) * 2,\n\t\t\t\t\t\t\t//\tFColor::Red, false, 1.0f, 0, 12.333);\n\n\t\t\t\t\t\t\tUParticleSystem* WallHitVFX = USoGameSingleton::GetWallHitVFXFromPhysicalMaterial(PhyMat);\n\t\t\t\t\t\t\tUGameplayStatics::SpawnEmitterAtLocation(Orb->GetWorld(), WallHitVFX, HitLocation, FRotator::ZeroRotator, true);\n\n\t\t\t\t\t\t\tUFMODEvent* WallHitSFX = USoGameSingleton::GetWallHitSFXFromPhysicalMaterial(PhyMat);\n\t\t\t\t\t\t\tUSoAudioManager::PlaySoundAtLocation(Orb, WallHitSFX, FTransform(HitLocation));\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tAActor* Actor = Overlap.Actor.Get();\n\t\t\tif (Actor->GetClass()->ImplementsInterface(USoMortal::StaticClass()))\n\t\t\t{\n\t\t\t\t// only hit mortals if the component's collision is ECC_PhysicsBody\n\t\t\t\tif ((Component->GetCollisionObjectType() == ECollisionChannel::ECC_PhysicsBody || Actor->ActorHasTag(\"PlayerCanHitAnyComponent\")) &&\n\t\t\t\t\tISoMortal::Execute_IsAlive(Actor))\n\t\t\t\t{\n\t\t\t\t\tFSoMeleeHitParam* HitParamPtr = HitList.Find(Actor);\n\t\t\t\t\tif (HitParamPtr == nullptr)\n\t\t\t\t\t{\n\n\t\t\t\t\t\tconst bool bCritical = FMath::RandRange(0.0f, 1.0f) < Orb->SoPlayerCharacterSheet->GetCriticalHitChance();\n\t\t\t\t\t\tconst float CriticalMultiplier = bCritical ? ActiveWeaponTemplate->GetCriticalMultiplier() : 1.0f;\n\n\t\t\t\t\t\tHitParamPtr = &HitList.Add(Actor);\n\t\t\t\t\t\tHitParamPtr->Dmg = ActiveWeaponTemplate->GetDmg(bSpecialStrikeWasExecutedLast) *\n\t\t\t\t\t\t\t\t\t\t\t(FMath::Clamp(4.0f * LandingAmount / 1000.0f, 1.0f, 10.0f) * CriticalMultiplier) *\n\t\t\t\t\t\t\t\t\t\t\tOrb->SoPlayerCharacterSheet->GetDamageModifiers();\n\n\t\t\t\t\t\tfor (const FSoWeaponBoost& WeaponBoost : Orb->WeaponBoosts)\n\t\t\t\t\t\t\tif (WeaponBoost.WeaponTemplate == ActiveWeaponTemplate)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tHitParamPtr->Dmg += WeaponBoost.BonusDamage;\n\t\t\t\t\t\t\t\tHitParamPtr->ImpactFX = WeaponBoost.ImpactFX;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (bDmgBoostCheat)\n\t\t\t\t\t\t\tHitParamPtr->Dmg *= 1000;\n\n\t\t\t\t\t\tHitParamPtr->bBlockable = false;\n\t\t\t\t\t\tHitParamPtr->bCritical = bCritical;\n\t\t\t\t\t\tHitParamPtr->HitReactDesc.AssociatedActor = Orb;\n\t\t\t\t\t\tHitParamPtr->HitReactDesc.Irresistibility = ActiveWeaponTemplate->GetInterruptModifier() + 1;\n\t\t\t\t\t\tHitParamPtr->Effects = StrikeData.HitEffects;\n\t\t\t\t\t}\n\t\t\t\t\tHitParamPtr->HitReactDesc.AssociatedBones.Add(USoStaticHelper::GetBoneNameFromBodyIndex(Cast<USkeletalMeshComponent>(Overlap.Component.Get()),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tOverlap.ItemIndex));\n\t\t\t\t}\n\t\t\t\telse if (Component->ComponentHasTag(FName(\"SpawnVFXOnHit\")))\n\t\t\t\t\tSpawnEnvironmentHitVFX(true);\n\t\t\t}\n\t\t\telse\n\t\t\t\tSpawnEnvironmentHitVFX(false);\n\t\t}\n\t}\n\tfor (const auto& Pair : HitList)\n\t{\n\t\tOrb->OnMeleeHit.Broadcast(Pair.Key, Pair.Value);\n\t\tISoMortal::Execute_MeleeHit(Pair.Key, Pair.Value);\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoAStrike::StrikePressed()\n{\n\t//if (bStrikePressedRecently == true)\n\t//\tbBanStrikeCauseSpamming = true;\n\tbStrikePressedRecently = true;\n\tOrb->gTimerManager->SetTimer(\n\t\tStrikePressedRecentlyTimer,\n\t\tthis, &ThisClass::StrikePressedRecentlyTimeOver,\n\t\tGetStrikePressedRecentlyTimeOffset(),\n\t\tfalse\n\t);\n}\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\ninline void USoAStrike::StrikePressedRecentlyTimeOver()\n{\n\tbStrikePressedRecently = false;\n\tbBanStrikeCauseSpamming = false;\n}\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoAStrike::OnBlocked()\n{\n\t// SwitchActivity(Orb->SoAWeaponInArm);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoAStrike::CanBeInterrupted(EActivity DesiredState) const\n{\n\treturn (!bIsInStrike) && (!bWaitBeforeStrike);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoAStrike::OnLanded()\n{\n\tUSoAudioManager::PlaySoundAtLocation(Orb, Orb->SFXArmedLand, FTransform(Orb->GetActorTransform()));\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoAStrike::CanStrike(bool bSpecial, bool bSpawnSFXIfNot)\n{\n\tconst FSoItem& Item = Orb->SoPlayerCharacterSheet->GetEquippedItem(ESoItemSlot::EIS_Weapon0);\n\tif (USoWeaponTemplate* WeaponTemplate = Cast<USoWeaponTemplate>(Item.Template))\n\t{\n\t\tUSoCharacterStrike* Strike = WeaponTemplate->GetStrike(bSpecial);\n\t\tif (Strike != nullptr)\n\t\t{\n\t\t\tfor (int32 i = 0; i < Orb->Cooldowns.Num(); ++i)\n\t\t\t\tif (Orb->Cooldowns[i].Object == Strike)\n\t\t\t\t{\n\t\t\t\t\tOrb->CooldownBlocksEvent.Broadcast(i, Orb->Cooldowns[i].Counter, Orb->Cooldowns[i].Object);\n\t\t\t\t\tif (bSpawnSFXIfNot)\n\t\t\t\t\t\tUSoAudioManager::PlaySoundAtLocation(Orb, Orb->SFXFCanNot, {});\n\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\treturn true;\n\t\t}\n\t}\n\n\treturn false;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoAStrike::HasStrikeCooldown(bool bSpecial) const\n{\n\tconst FSoItem& Item = Orb->SoPlayerCharacterSheet->GetEquippedItem(ESoItemSlot::EIS_Weapon0);\n\tif (USoWeaponTemplate* WeaponTemplate = Cast<USoWeaponTemplate>(Item.Template))\n\t{\n\t\tUSoCharacterStrike* Strike = WeaponTemplate->GetStrike(bSpecial);\n\t\treturn (Strike == nullptr || Strike->GetCooldownTime() > 0.0f);\n\t}\n\n\treturn true;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoAStrike::UnhideWeapon()\n{\n\tOrb->SoSword->SetVisibility(true);\n\tconst FSoItem& Item = Orb->SoPlayerCharacterSheet->GetEquippedItem(ESoItemSlot::EIS_Weapon0);\n\tif (USoWeaponTemplate* Template = Cast<USoWeaponTemplate>(Item.Template))\n\t\tif (Template->GetWeaponType() == ESoWeaponType::EWT_DualWield)\n\t\t\tOrb->SoOffHandWeapon->SetVisibility(true, true);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoAStrike::AutoAim()\n{\n\tconst FVector CharLocation = Orb->GetActorLocation();\n\tTArray<ASoEnemy*> EnemiesClose;\n\n\tfor (ASoEnemy* Enemy : ASoGameMode::Get(Orb).GetEnemies())\n\t\tif (Enemy->IsAlive() &&\n\t\t\tEnemy->IsAutoAimSupported() &&\n\t\t\t(CharLocation - Enemy->GetActorLocation()).SizeSquared() < ActiveAutoAimDistance * ActiveAutoAimDistance)\n\t\t\tEnemiesClose.Add(Enemy);\n\n\tif (EnemiesClose.Num() == 0)\n\t{\n\t\tif (WouldHitMortals())\n\t\t\treturn true;\n\n\t\tOrb->SetActorRotation((-Orb->GetActorForwardVector()).Rotation());\n\t\tif (ActiveTrailMesh)\n\t\t\tActiveTrailMesh->SetActorRotation(Orb->GetMesh()->GetComponentRotation());\n\t\tif (WouldHitMortals())\n\t\t{\n\t\t\tUpdateCamera(0.01f);\n\t\t\tOrb->StoredForwardVector = Orb->GetActorForwardVector();\n\t\t\tOrb->LastInputDirection = Orb->GetActorForwardVector();\n\n\t\t\t// UE_LOG(LogTemp, Warning, TEXT(\"Rotated cause would hit mortal!\"));\n\t\t\treturn true;\n\t\t}\n\n\t\tOrb->SetActorRotation((-Orb->GetActorForwardVector()).Rotation());\n\t\tif (ActiveTrailMesh)\n\t\t\tActiveTrailMesh->SetActorRotation(Orb->GetMesh()->GetComponentRotation());\n\n\t\treturn false;\n\t}\n\n\tconst bool bWouldHitMortals = WouldHitMortals();\n\tbool bAnyEnemyBehind = false;\n\tfor (ASoEnemy* Enemy : EnemiesClose)\n\t{\n\t\tconst FVector FaceDir = (Enemy->GetActorLocation() - CharLocation).GetSafeNormal();\n\t\tif ((FaceDir | Orb->GetActorForwardVector()) > 0.0f)\n\t\t{\n\t\t\tif (bWouldHitMortals)\n\t\t\t\treturn true;\n\t\t}\n\t\telse\n\t\t\tbAnyEnemyBehind = true;\n\t}\n\n\tif (bAnyEnemyBehind)\n\t{\n\t\tconst FVector FaceDir = Orb->SoMovement->GetSplineLocation().GetDirectionFromVector(EnemiesClose[0]->GetActorLocation() - CharLocation);\n\t\tif ((FaceDir | Orb->GetActorForwardVector()) < 0.0f)\n\t\t{\n\t\t\tOrb->SetActorRotation(FaceDir.Rotation());\n\t\t\tUpdateCamera(0.01f);\n\t\t\tOrb->StoredForwardVector = Orb->GetActorForwardVector();\n\t\t\tOrb->LastInputDirection = Orb->GetActorForwardVector();\n\t\t}\n\n\t\treturn true;\n\t}\n\n\treturn false;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoAStrike::WouldHitMortals()\n{\n\tif (ActiveTrailMesh == nullptr)\n\t{\n\t\tUSkeletalMeshComponent* CharMesh = Orb->GetMesh();\n\t\tif (Orb->WeaponTrailMeshes.Num() == 0)\n\t\t{\n\t\t\tActiveTrailMesh = Orb->GetWorld()->SpawnActor<AStaticMeshActor>(AStaticMeshActor::StaticClass(), CharMesh->GetComponentTransform());\n\t\t\tActiveTrailMesh->SetMobility(EComponentMobility::Movable);\n\t\t\tActiveTrailMesh->GetStaticMeshComponent()->SetVisibility(false);\n\t\t\tOrb->WeaponTrailMeshes.Push(ActiveTrailMesh);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tActiveTrailMesh = Orb->WeaponTrailMeshes.Last();\n\t\t\tActiveTrailMesh->SetActorTransform(CharMesh->GetComponentTransform());\n\t\t}\n\t\tUStaticMeshComponent* TrailComponent = ActiveTrailMesh->GetStaticMeshComponent();\n\t\tTrailComponent->SetCollisionEnabled(ECollisionEnabled::NoCollision);\n\t\tif (ActiveStrikeData != nullptr && ActiveStrikeData->StrikeList.Num() > 0)\n\t\t{\n\t\t\tTrailComponent->SetStaticMesh(ActiveStrikeData->StrikeList[0].TrailMesh);\n\t\t\tif (ActiveStrikeData->StrikeList[0].bAttachToCharacter)\n\t\t\t{\n\t\t\t\tActiveTrailMesh->AttachToComponent(Orb->GetMesh(), FAttachmentTransformRules::KeepWorldTransform);\n\t\t\t\tActiveTrailMesh->GetRootComponent()->bAbsoluteRotation = true;\n\t\t\t}\n\t\t}\n\t\tActiveTrailMesh->SetActorRotation(CharMesh->GetComponentRotation());\n\t}\n\n\tUStaticMeshComponent* ActiveTrailComponent = ActiveTrailMesh->GetStaticMeshComponent();\n\n\tActiveTrailComponent->SetCollisionEnabled(ECollisionEnabled::QueryOnly);\n\n\tFComponentQueryParams Param = FComponentQueryParams::DefaultComponentQueryParams;\n\tParam.AddIgnoredActor(Orb);\n\tParam.bIgnoreTouches = true;\n\tTArray<struct FOverlapResult> OutOverlaps;\n\tActiveTrailComponent->ComponentOverlapMulti(OutOverlaps,\n\t\t\t\t\t\t\t\t\t\t  Orb->GetWorld(),\n\t\t\t\t\t\t\t\t\t\t  ActiveTrailComponent->GetComponentLocation(),\n\t\t\t\t\t\t\t\t\t\t  ActiveTrailComponent->GetComponentTransform().GetRotation(),\n\t\t\t\t\t\t\t\t\t\t  ECollisionChannel::ECC_PhysicsBody,\n\t\t\t\t\t\t\t\t\t\t  Param,\n\t\t\t\t\t\t\t\t\t\t  FCollisionObjectQueryParams::DefaultObjectQueryParam);\n\tActiveTrailComponent->SetCollisionEnabled(ECollisionEnabled::NoCollision);\n\n\tfor (const FOverlapResult& Overlap : OutOverlaps)\n\t{\n\t\tif (UPrimitiveComponent* Component = Overlap.Component.Get())\n\t\t{\n\t\t\tAActor* Actor = Overlap.Actor.Get();\n\t\t\tif ((Component->GetCollisionObjectType() == ECollisionChannel::ECC_PhysicsBody || Cast<ASoProjectile>(Actor) != nullptr) &&\n\t\t\t\tActor->GetClass()->ImplementsInterface(USoMortal::StaticClass()) &&\n\t\t\t\tISoMortal::Execute_IsAlive(Actor))\n\t\t\t{\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn false;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nfloat USoAStrike::GetStrikePressedRecentlyTimeOffset() const\n{\n\treturn USoDateTimeHelper::NormalizeTime(StrikePressedRecentlyTimeOffset);\n}\n"
  },
  {
    "path": "Source/SOrb/Character/SoCharStates/SoAStrike.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#pragma once\n#include \"Animation/AnimSequenceBase.h\"\n#include \"SoActivity.h\"\n#include \"SoAStrike.generated.h\"\n\nclass USoWeaponTemplate;\nclass AStaticMeshActor;\n\n/**\n * Dynamic data for animation blueprint\n */\nUSTRUCT(BlueprintType, Blueprintable)\nstruct FSoStrikeAnimData\n{\n\tGENERATED_USTRUCT_BODY()\npublic:\n\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere)\n\tUAnimSequenceBase* Anim = nullptr;\n\n\t/** may be nullptr, animation state is skipped then, but we have a 0.2 sec blend time */\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere)\n\tUAnimSequenceBase* AnimEndBlend = nullptr;\n\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere)\n\tUAnimSequenceBase* AnimEndBlendLeft = nullptr;\n\n\t/** play rates are calculated from strike duration so the animation is aligned to the logic */\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere)\n\tfloat AnimPlayRate;\n\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere)\n\tfloat AnimEndBlendPlayRate;\n};\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUCLASS()\nclass SORB_API USoAStrike : public USoActivity\n{\n\tGENERATED_BODY()\npublic:\n\tUSoAStrike();\n\n\tvirtual void Tick(float DeltaSeconds) override;\n\n\tvirtual void StrikePressed() override;\n\n\tvirtual void OnBlocked() override;\n\n\tvirtual void ToggleWeapons() override {};\n\n\tvirtual bool CanBeInterrupted(EActivity DesiredState = EActivity::EA_Max) const override;\n\n\tvirtual void OnLanded() override;\n\n\tvirtual void TakeWeaponAway() override {};\n\n\t// checks if there is an equipped weapon with a valid strike which isn't waiting for cooldown\n\t// if strile fails cause of cooldown cannot sound is played\n\tbool CanStrike(bool bSpecial, bool bSpawnSFXIfNot = true);\n\n\t// checks if the given strike has cooldown at all (not just an active one)\n\tbool HasStrikeCooldown(bool bSpecial) const;\n\n\tvoid ToggleDmgCheat() { bDmgBoostCheat = !bDmgBoostCheat; }\n\n\tfloat GetStrikePressedRecentlyTimeOffset() const;\n\nprotected:\n\n\tvirtual void OnEnter(USoActivity* OldActivity) override;\n\tvirtual void OnExit(USoActivity* NewActivity) override;\n\n\tvirtual void Move(float Value) override;\n\n\tvoid Strike();\n\n\tvoid ForceLand();\n\n\tvoid OnStrikeChainFinished(float BlendTimeToSubtractFromCounter);\n\n\tvoid ApplyTrail(const struct FSoStrikeEntry& StrikeData, bool bAllowTurn);\n\tvoid ApplyDamage(const struct FSoStrikeEntry& StrikeData, UStaticMeshComponent* TrailComponent, float WallHitThreshold, int32 StrikeIndex);\n\n\t// used by the mechanism which stops the user from using combos via spamming lmb\n\tvoid StrikePressedRecentlyTimeOver();\n\n\tvoid UnhideWeapon();\n\n\tbool AutoAim();\n\n\tbool WouldHitMortals();\n\n\nprotected:\n\n\tbool bStrikePressedRecently = false;\n\tbool bBanStrikeCauseSpamming = false;\n\tfloat StrikePressedRecentlyTimeOffset = 0.5;\n\tFTimerHandle StrikePressedRecentlyTimer;\n\n\t/** damn it's too late to write sane comments */\n\tint32 StrikeComboChainIndex = -1;\n\n\n\t/** used for double buffering and stuff for animation system, 0th, 2th, 4th etc. anims are StrikeA, others are not */\n\tUPROPERTY(BlueprintReadOnly)\n\tbool bStrikeA = true;\n\n\tUPROPERTY(BlueprintReadOnly)\n\tbool bStrikeBlendIn = true;\n\n\t/** strike in progress if true, blending out or state not active otherwise  */\n\tUPROPERTY(BlueprintReadOnly)\n\tbool bIsInStrike = false;\n\n\t/** two different data used in ping-pong style for the animation system to work correctly */\n\tUPROPERTY(BlueprintReadOnly)\n\tFSoStrikeAnimData AnimDataA;\n\n\tUPROPERTY(BlueprintReadOnly)\n\tFSoStrikeAnimData AnimDataB;\n\n\tbool bSpecialStrikeWasExecutedLast = false;\n\n\tfloat StrikeCounter = -1.0f;\n\tfloat StrikeCounterStart;\n\tfloat ActiveBlendOutTime;\n\n\tfloat AttackSpeedMultiplier = 1.0f;\n\n\tconst struct FSoCharacterStrikeData* ActiveStrikeData = nullptr;\n\n\tUPROPERTY()\n\tTArray<UStaticMeshComponent*> TrailMeshes;\n\n\tUPROPERTY()\n\tconst USoWeaponTemplate* ActiveWeaponTemplate = nullptr;\n\n\tfloat RangeAttackCounter = 0.0f;\n\tbool bWaitBeforeStrike = false;\n\n\tfloat MovementOverride = 0.0f;\n\n\tfriend class USoAWeaponInArm;\n\n\tbool bFreezeInAir = false;\n\tESoStatusEffect AppliedEffect = ESoStatusEffect::ESE_NumOf;\n\tfloat LandingAmount = -1.0f;\n\n\tbool bSpawnedCanNotSFX = false;\n\tfloat ActiveAutoAimDistance = 400.0f;\n\n\tUPROPERTY()\n\tAStaticMeshActor* ActiveTrailMesh = nullptr;\n\n\n\t// only max 2 strike is used atm, this should be array if there would be more\n\tUPROPERTY()\n\tTArray<UPrimitiveComponent*> ComponentsAlreadyHitA;\n\n\tUPROPERTY()\n\tTArray<UPrimitiveComponent*> ComponentsAlreadyHitB;\n\n\tbool bDmgBoostCheat = false;\n};\n"
  },
  {
    "path": "Source/SOrb/Character/SoCharStates/SoASwing.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#include \"SoASwing.h\"\n\n#include \"Components/CapsuleComponent.h\"\n#include \"Components/SkeletalMeshComponent.h\"\n\n#include \"SoADefault.h\"\n\n#include \"Character/SoCharacter.h\"\n#include \"Objects/SoSwingCenter.h\"\n#include \"CharacterBase/SoCharacterMovementComponent.h\"\n#include \"Basic/SoAudioManager.h\"\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// set base flags\nUSoASwing::USoASwing() :\n\tUSoActivity(EActivity::EA_Swinging)\n{\n\tLookDirection = ESoLookDirection::ELD_Frozen;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoASwing::OnEnter(USoActivity* OldActivity)\n{\n\tUSoActivity::OnEnter(OldActivity);\n\n\tcheck(Orb->SwingCenters.Num() > 0);\n\n\t// try to grab closest pole\n\n\tconst FVector OwnerLocation = Orb->GetActorLocation();\n\tint32 Index = 0;\n\tconst FVector SwingCenterLoc0 = Orb->SwingCenters[0]->GetActorLocation();\n\tfloat Distance = (SwingCenterLoc0 - OwnerLocation).SizeSquared();\n\n\tbool bInvalid = SwingCenterLoc0.Z < OwnerLocation.Z;\n\tfor (int32 i = 1; i < Orb->SwingCenters.Num(); ++i)\n\t{\n\t\tconst FVector SwingCenterLoc = Orb->SwingCenters[i]->GetActorLocation();\n\t\tconst float Dist = (SwingCenterLoc - OwnerLocation).SizeSquared();\n\t\tif ((Dist < Distance || bInvalid) && SwingCenterLoc.Z > OwnerLocation.Z)\n\t\t{\n\t\t\tbInvalid = false;\n\t\t\tDistance = Dist;\n\t\t\tIndex = i;\n\t\t}\n\t}\n\n\tOrb->SoMovement->StartSwinging(Orb->SwingCenters[Index]->GetSwingCenter(), SwingInputForce);\n\n\tbLeftHanded = !bLeftHanded;\n\tbForward = -Orb->SoMovement->GetSplineLocation().GetDirectionModifierFromVector(Orb->GetActorForwardVector()) > 0;\n\n\t//if (bForward)\n\t//\tUE_LOG(LogTemp, Warning, TEXT(\"Forward\"))\n\t//else\n\t//\tUE_LOG(LogTemp, Warning, TEXT(\"Backwards\"));\n\n\tOrb->CurrentSmokeColor = Orb->SmokeColorSwing;\n\tOrb->CurrentGlowSphereColor = Orb->GlowSphereColorSwing;\n\n\tUSoAudioManager::PlaySoundAtLocation(Orb, Orb->SFXSwing, Orb->GetActorTransform());\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoASwing::OnExit(USoActivity* NewActivity)\n{\n\tUSoActivity::OnExit(NewActivity);\n\tOrb->SoMovement->SetMovementMode(EMovementMode::MOVE_Falling);\n\n\tOrb->CurrentSmokeColor = Orb->SmokeColorDefault;\n\tOrb->CurrentGlowSphereColor = Orb->GlowSphereColorDefault;\n\n\tUSoAudioManager::PlaySoundAtLocation(Orb, Orb->SFXSwingEnd, Orb->GetActorTransform());\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// set base flags\nvoid USoASwing::Tick(float DeltaSeconds)\n{\n\tUSoActivity::Tick(DeltaSeconds);\n\tOrb->SoMovement->AddSwingDelta(-Orb->GetMovementYAxisValue() * 100.0f * DeltaSeconds);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n//void USoASwing::Move(float Value)\n//{\n//\t// const FVector MovDir = Orb->SoMovement->GetDirection();\n//\t// Orb->SoMovement->SetSwingInput(MovDir * Value);\n//}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoASwing::JumpPressed()\n{\n\tOrb->SoMovement->Velocity.Z = SwingLeaverJumpVelocity;\n\tSwitchActivity(Orb->SoADefault);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoASwing::OnTeleportRequest()\n{\n\tSwitchActivity(Orb->SoADefault);\n}"
  },
  {
    "path": "Source/SOrb/Character/SoCharStates/SoASwing.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#pragma once\n\n#include \"SoActivity.h\"\n#include \"SoASwing.generated.h\"\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUCLASS()\nclass SORB_API USoASwing : public USoActivity\n{\n\tGENERATED_BODY()\npublic:\n\n\tUSoASwing();\n\n\tvirtual void Tick(float DeltaSeconds) override;\n\n\t// inputs\n\tvirtual void JumpPressed() override;\n\t// virtual void Move (float Value) override;\n\n\tvirtual void OnTeleportRequest() override;\n\n\t// bad idea, don't override this: mesh would not be inside the capsule\n\t// virtual bool ShouldDecreaseCollision() const override { return true; }\n\nprotected:\n\n\tvirtual void OnEnter(USoActivity* OldActivity) override;\n\tvirtual void OnExit(USoActivity* NewActivity) override;\n\nprotected:\n\n\tUPROPERTY(EditAnywhere, BlueprintReadOnly, Category = MovementConstValue)\n\tfloat SwingInputForce = 700.f;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadOnly, Category = MovementConstValue)\n\tfloat SwingLeaverJumpVelocity = 1000.f;\n\n\tUPROPERTY(BlueprintReadOnly, Category = SwingAnimData)\n\tbool bForward;\n\n\tUPROPERTY(BlueprintReadOnly, Category = SwingAnimData)\n\tbool bLeftHanded = true;\n\n\tfriend class USoCharacterMovementComponent;\n};\n\n"
  },
  {
    "path": "Source/SOrb/Character/SoCharStates/SoATeleport.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#include \"SoATeleport.h\"\n\n#include \"Components/CapsuleComponent.h\"\n#include \"Components/SkeletalMeshComponent.h\"\n#include \"Kismet/GameplayStatics.h\"\n#include \"Runtime/LevelSequence/Public/LevelSequenceActor.h\"\n#include \"Engine/World.h\"\n#include \"TimerManager.h\"\n#include \"Particles/ParticleSystemComponent.h\"\n\n#include \"SoADefault.h\"\n#include \"SoAWaitForActivitySwitch.h\"\n#include \"Character/SoCharacter.h\"\n#include \"Character/SoSpringArmComponent.h\"\n#include \"Character/SoCharStates/SoADead.h\"\n#include \"Character/SoCharStates/SoAHitReact.h\"\n#include \"Character/SoCharStates/SoAWeaponInArm.h\"\n#include \"Basic/Helpers/SoStaticHelper.h\"\n#include \"Basic/SoAudioManager.h\"\n#include \"Basic/SoGameMode.h\"\n#include \"CharacterBase/SoCharacterMovementComponent.h\"\n#include \"SplineLogic/SoPlayerSpline.h\"\n#include \"Levels/SoLevelHelper.h\"\n#include \"Levels/SoLevelManager.h\"\n#include \"Basic/SoGameInstance.h\"\n#include \"Enemy/SoEnemy.h\"\n\nDEFINE_LOG_CATEGORY_STATIC(LogSoATeleport, All, All);\n\n\n// used for music and screen fade\nconst float FadeOutTimeDuringTeleport = 0.5f;\nconst float FadeInTimeDuringTeleport = 0.5f;\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUSoATeleport::USoATeleport() :\n\tUSoActivity(EActivity::EA_Teleport)\n{\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoATeleport::OnEnter(USoActivity* OldActivity)\n{\n\t// before onenter because it is used for collision\n\tbArmed = OldActivity->IsArmedState();\n\n\tUSoActivity::OnEnter(OldActivity);\n\tbRevive = (OldActivity == Orb->SoADead);\n\n\tif (TeleportState != ESoATeleportState::EATS_QuickTeleportPre)\n\t{\n\t\tif (bHide)\n\t\t\tOrb->HideCharacterBP(true);\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoATeleport::OnExit(USoActivity* NewActivity)\n{\n\tUSoActivity::OnExit(NewActivity);\n\tOrb->SetCameraLagEnabled(true);\n\n\tif (TeleportState == ESoATeleportState::EATS_QuickTeleportPost ||\n\t\tTeleportState == ESoATeleportState::EATS_QuickTeleportPre)\n\t{\n\t\tTeleportState = ESoATeleportState::EATS_Done;\n\t\tOrb->ShowCharacterBP(true);\n\t\tUSoAudioManager::Get(Orb).SetAmbientFreeze(false);\n\n\t\treturn;\n\t}\n\n\tif (TeleportState != ESoATeleportState::EATS_Done)\n\t{\n\t\tif (!Orb->bCameraFadeOutBlocked)\n\t\t{\n\t\t\t// APlayerCameraManager* CamManager = Orb->GetPlayerController()->PlayerCameraManager;\n\t\t\t// CamManager->StartCameraFade(1.0f, 0.0f, FadeInTimeDuringTeleport, FLinearColor(0.0f, 0.0f, 0.0f, 1.0f), false, true);\n\t\t\tOrb->FadeFromBlack.Broadcast();\n\t\t}\n\n\t\tif (TeleportState != ESoATeleportState::EATS_Faded && bRevive)\n\t\t\tSetEnabledState();\n\t}\n\n\tLevelSequenceActor = nullptr;\n\tCameraActor = nullptr;\n\tAnimation = nullptr;\n\tTeleportTargetAfterSequence = nullptr;\n\n\t// cause of different lights in different levels\n\n\t// TEMP FIX:\n#if WARRIORB_WITH_EDITOR\n\tUGameplayStatics::GetPlayerController(Orb, 0)->ConsoleCommand(\"EnableAllScreenMessages\");\n#endif\n\n\tRestoreTextureMemoryPool();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoATeleport::SetupTeleport(const FSoSplinePoint& SplineTarget,\n\t\t\t\t\t\t\t\t float ZTarget,\n\t\t\t\t\t\t\t\t bool bForceFade,\n\t\t\t\t\t\t\t\t bool bLookBackwards,\n\t\t\t\t\t\t\t\t bool bHideDuringTeleport,\n\t\t\t\t\t\t\t\t bool bCamAlreadyOutFaded)\n{\n\tif (Orb != nullptr && Orb->SoActivity != nullptr && Orb->SoActivity->CanBeInterrupted(EActivity::EA_Teleport))\n\t{\n\t\tconst bool bAllLevelLoaded = USoLevelHelper::AreLevelsAtSplineLocationLoaded(SplineTarget);\n\n\t\tStoredOldSpline = Cast<ASoPlayerSpline>(Orb->SoMovement->GetSplineLocation().GetSpline());\n\t\tStoredNewSpline = Cast<ASoPlayerSpline>(SplineTarget.GetSpline());\n\n\t\tif (StoredNewSpline == nullptr)\n\t\t{\n\t\t\tUE_LOG(LogSoATeleport, Error, TEXT(\"Failed to teleport: invalid spline target location!\"));\n\t\t\treturn true;\n\t\t}\n\n\t\tbLevelSwitchHappened = true;\n\t\tif (StoredOldSpline != nullptr)\n\t\t{\n\t\t\tconst auto& OldClaims = StoredOldSpline->GetLevelClaims();\n\t\t\tconst auto& NewClaims = StoredNewSpline->GetLevelClaims();\n\t\t\tbLevelSwitchHappened = (OldClaims.Num() > 0 && NewClaims.Num() > 0 && OldClaims[0].LevelName != NewClaims[0].LevelName);\n\t\t}\n\n\t\tif (bForceFade || !bAllLevelLoaded || bLevelSwitchHappened)\n\t\t{\n\t\t\t// fade\n\t\t\tStoredSplineTarget = SplineTarget;\n\t\t\tStoredZTarget = ZTarget;\n\t\t\tbStoredLookBackwards = bLookBackwards;\n\n\t\t\tbMusicSwitchInProgress = StoredOldSpline == nullptr || StoredOldSpline->GetMusic() != StoredNewSpline->GetMusic();\n\t\t\tif (bMusicSwitchInProgress)\n\t\t\t\tUSoAudioManager::Get(Orb).FadeOutActiveMusic(/*FadeOutTimeDuringTeleport*/);\n\n\t\t\tAPlayerCameraManager* CamManager = Orb->GetPlayerController()->PlayerCameraManager;\n\t\t\tconst auto& GameInstance = USoGameInstance::Get(Orb);\n\t\t\tif (bCamAlreadyOutFaded || GameInstance.IsLoadingEpisode() || GameInstance.IsLoadingChapter())\n\t\t\t{\n\t\t\t\tStartWaitForLevel();\n\t\t\t\t// CamManager->StartCameraFade(1.0f, 1.0f, 0.01f, FLinearColor(0.0f, 0.0f, 0.0f, 1.0f), false, true);\n\t\t\t\t// CamManager->SetManualCameraFade(1.0f, FLinearColor(0.0f, 0.0f, 0.0f, 1.0f), false);\n\t\t\t\tOrb->FadeToBlackInstant.Broadcast();\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tTeleportState = ESoATeleportState::EATS_FadeOut;\n\t\t\t\tif (!Orb->bCameraFadeOutBlocked)\n\t\t\t\t{\n\t\t\t\t\t// CamManager->StartCameraFade(0.0f, 1.0f, FadeOutTimeDuringTeleport, FLinearColor(0.0f, 0.0f, 0.0f, 1.0f), false, true);\n\t\t\t\t\tOrb->FadeToBlack.Broadcast();\n\t\t\t\t}\n\t\t\t\tCounter = FadeOutTimeDuringTeleport;\n\t\t\t\tOrb->OnLevelSwitchStart.Broadcast();\n\t\t\t}\n\n\t\t\tbHide = bHideDuringTeleport;\n\t\t\tOrb->SoActivity->SwitchActivity(this);\n\t\t\treturn false;\n\t\t}\n\n\t\tTeleportState = ESoATeleportState::EATS_QuickTeleportPre;\n\t\tif (Orb->SoActivity != Orb->SoADead)\n\t\t\tOrb->SoQuickTeleportPre->Activate(true);\n\n\t\tOrb->SoActivity->SwitchActivity(this);\n\n\t\tStoredSplineTarget = SplineTarget;\n\t\tStoredZTarget = ZTarget;\n\t\tbStoredLookBackwards = bLookBackwards;\n\t\tCounter = Orb->QuickTeleportPreTime;\n\n\t\treturn false;\n\t}\n\treturn true;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoATeleport::SetupQuickTeleport(const FSoSplinePoint& SplineTarget,\n\t\t\t\t\t\t\t\t\t  float ZTarget,\n\t\t\t\t\t\t\t\t\t  bool bLookBackwards)\n{\n\tif (Orb != nullptr && SplineTarget.IsValid(false))\n\t{\n\t\tbool bAllLevelLoaded = false;\n\t\tconst bool bAllLevelVisible = FSoLevelManager::Get().ClaimSplineLocation(SplineTarget, bAllLevelLoaded);\n\n\t\tStoredOldSpline = Cast<ASoPlayerSpline>(Orb->SoMovement->GetSplineLocation().GetSpline());\n\t\tStoredNewSpline = Cast<ASoPlayerSpline>(SplineTarget.GetSpline());\n\t\tbool bLevelSwitch = true;\n\t\tif (StoredOldSpline != nullptr)\n\t\t{\n\t\t\tconst auto& OldClaims = StoredOldSpline->GetLevelClaims();\n\t\t\tconst auto& NewClaims = StoredNewSpline->GetLevelClaims();\n\t\t\tbLevelSwitch = (OldClaims.Num() > 0 && NewClaims.Num() > 0 && OldClaims[0].LevelName != NewClaims[0].LevelName);\n\t\t}\n\n\t\tif (!bAllLevelVisible || bLevelSwitch)\n\t\t\treturn false;\n\n\t\tconst FVector OldLocation = Orb->GetActorLocation();\n\t\tUSoAudioManager::Get(Orb).SetAmbientFreeze(true);\n\t\t// instant\n\t\tOrb->SetPositionOnSplineSP(SplineTarget, ZTarget, true, false, bLookBackwards);\n\t\tUSoAudioManager::Get(Orb).SetAmbientFreeze(false);\n\n\t\tOrb->OnPostQuickTravelBP(OldLocation);\n\n\t\treturn true;\n\t}\n\treturn false;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoATeleport::CanSwapPlayerWithSplineWalker(float MaxDistance)\n{\n\tif (Orb == nullptr || !ISoMortal::Execute_IsAlive(Orb))\n\t\treturn false;\n\t//DrawDebugLine(Orb->GetWorld(),\n\t//\t\t\t  Orb->GetActorLocation(),\n\t//\t\t\t  Orb->GetActorLocation() + GetCharRelevantDirection() * 700,\n\t//\t\t\t  FColor(255, 0, 0),\n\t//\t\t\t  false, -1, 0, 12.333);\n\n\treturn USoStaticHelper::GetClosestEnemyInDirection(Orb, Orb->GetActorLocation(), MaxDistance, GetCharRelevantDirection(), true) != nullptr ||\n\t\t   USoStaticHelper::GetClosestEnemyInDirection(Orb, Orb->GetActorLocation(), MaxDistance, -GetCharRelevantDirection(), true) != nullptr;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nASoEnemy* USoATeleport::SwapPlayerWithSplineWalker(float MaxDistance, UParticleSystem* SwapVFX)\n{\n\tif (Orb == nullptr || !ISoMortal::Execute_IsAlive(Orb))\n\t\treturn nullptr;\n\n\tASoEnemy* Target = USoStaticHelper::GetClosestEnemyInDirection(Orb, Orb->GetActorLocation(), MaxDistance, GetCharRelevantDirection(), true);\n\tif (Target == nullptr)\n\t\tTarget = USoStaticHelper::GetClosestEnemyInDirection(Orb, Orb->GetActorLocation(), MaxDistance, -GetCharRelevantDirection(), true);\n\n\tif (Target != nullptr)\n\t{\n\t\tFVector OldCharLocation = Orb->GetActorLocation();\n\t\tif (SwapVFX != nullptr)\n\t\t{\n\t\t\tUGameplayStatics::SpawnEmitterAtLocation(Orb,\n\t\t\t\t\t\t\t\t\t\t\t\t\t SwapVFX,\n\t\t\t\t\t\t\t\t\t\t\t\t\t OldCharLocation - FVector(0.0f, 0.0f, Orb->GetCapsuleComponent()->GetScaledCapsuleHalfHeight()),\n\t\t\t\t\t\t\t\t\t\t\t\t\t FRotator::ZeroRotator,\n\t\t\t\t\t\t\t\t\t\t\t\t\t FVector(1.f),\n\t\t\t\t\t\t\t\t\t\t\t\t\t true,\n\t\t\t\t\t\t\t\t\t\t\t\t\t EPSCPoolMethod::AutoRelease);\n\t\t\tUGameplayStatics::SpawnEmitterAtLocation(Orb, SwapVFX, Target->GetFloorLocation(), FRotator::ZeroRotator, FVector(1.f), true, EPSCPoolMethod::AutoRelease);\n\t\t}\n\n\t\tconst FSoSplinePoint OldCharSplineLocation = Orb->GetSoMovement()->GetSplineLocation();\n\t\tOrb->SoActivity->SwitchActivity(Orb->SoADefault);\n\t\tconst FVector OldVelocity = Orb->SoMovement->Velocity;\n\t\tSetDisabledState();\n\n\n\t\tconst FSoSplinePoint NewSplineLocation = ISoSplineWalker::Execute_GetSplineLocationI(Target);\n\n\t\tconst FVector OldEnemyLocation = Target->GetActorLocation();\n\t\tOrb->SetActorLocation(OldEnemyLocation);\n\t\tISoSplineWalker::Execute_SetSplineLocation(Orb, NewSplineLocation, true);\n\n\t\tif (Target->ShouldKeepZLocationOnSwap())\n\t\t\tOldCharLocation.Z = OldEnemyLocation.Z;\n\n\t\tTarget->SetActorLocation(OldCharLocation);\n\t\tISoSplineWalker::Execute_SetSplineLocation(Target, OldCharSplineLocation, true);\n\t\tTarget->Stun(0.3f, ESoStatusEffect::ESE_Stun);\n\n\t\tSetEnabledState();\n\t\t// fix enable/disable state \"sideeffects\"\n\t\tOrb->SoMovement->Velocity = OldVelocity;\n\t\tOrb->MovementStopMultiplier = 1;\n\n\t\treturn Target;\n\t}\n\n\treturn nullptr;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nASoEnemy* USoATeleport::TeleportBehindSplineWalker(float MaxDistance, UParticleSystem* VFX, float Distance)\n{\n\tif (Orb == nullptr || !ISoMortal::Execute_IsAlive(Orb))\n\t\treturn nullptr;\n\n\tASoEnemy* Target = USoStaticHelper::GetClosestEnemyInDirection(Orb, Orb->GetActorLocation(), MaxDistance, GetCharRelevantDirection(), true);\n\tif (Target == nullptr)\n\t\tTarget = USoStaticHelper::GetClosestEnemyInDirection(Orb, Orb->GetActorLocation(), MaxDistance, -GetCharRelevantDirection(), true);\n\n\tif (Target != nullptr)\n\t{\n\t\tauto SpawnVfx = [VFX, this]()\n\t\t{\n\t\t\tif (VFX != nullptr)\n\t\t{\n\t\t\tUGameplayStatics::SpawnEmitterAtLocation(Orb,\n\t\t\t\t\t\t\t\t\t\t\t\t\t VFX,\n\t\t\t\t\t\t\t\t\t\t\t\t\t Orb->GetActorLocation() - FVector(0.0f, 0.0f, Orb->GetCapsuleComponent()->GetScaledCapsuleHalfHeight()),\n\t\t\t\t\t\t\t\t\t\t\t\t\t FRotator::ZeroRotator,\n\t\t\t\t\t\t\t\t\t\t\t\t\t FVector(1.f),\n\t\t\t\t\t\t\t\t\t\t\t\t\t true,\n\t\t\t\t\t\t\t\t\t\t\t\t\t EPSCPoolMethod::AutoRelease);\n\t\t}\n\t\t};\n\n\t\tSpawnVfx();\n\n\t\tOrb->SoActivity->SwitchActivity(Orb->SoADefault);\n\t\t// const FVector OldVelocity = Orb->SoMovement->Velocity;\n\t\tSetDisabledState();\n\n\t\tconst FVector TargetLoc = Target->GetActorLocation();\n\n\t\tconst FVector NewDirectionVector = (Orb->GetActorLocation() - TargetLoc).GetSafeNormal();\n\t\tFSoSplinePoint NewSplineLocation = ISoSplineWalker::Execute_GetSplineLocationI(Target);\n\t\tNewSplineLocation += NewSplineLocation.GetDirectionModifierFromVector(-NewDirectionVector) * (Target->GetCapsuleComponent()->GetScaledCapsuleRadius() + Distance);\n\n\t\tconst FVector NewCharLoc = FVector(NewSplineLocation, TargetLoc.Z);\n\t\tOrb->SetActorLocation(NewCharLoc);\n\t\tISoSplineWalker::Execute_SetSplineLocation(Orb, NewSplineLocation, true);\n\n\t\tOrb->SetActorRotation(NewSplineLocation.GetDirectionFromVector(TargetLoc - NewCharLoc).Rotation());\n\n\t\tSetEnabledState();\n\t\t// fix enable/disable state \"sideeffects\"\n\t\t// Orb->SoMovement->Velocity = OldVelocity;\n\t\tOrb->MovementStopMultiplier = 1;\n\n\t\tSpawnVfx();\n\n\t\treturn Target;\n\t}\n\n\treturn nullptr;\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFVector USoATeleport::GetCharRelevantDirection() const\n{\n\tFVector DirVector = Orb->LastVelocityDirection;\n\tif (DirVector.SizeSquared2D() < KINDA_SMALL_NUMBER)\n\t\tDirVector = Orb->GetActorForwardVector();\n\n\treturn DirVector;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoATeleport::CanTeleportBehindClosestEnemy(float MaxDistance)\n{\n\tif (Orb == nullptr || !ISoMortal::Execute_IsAlive(Orb))\n\t\treturn false;\n\n\treturn USoStaticHelper::GetClosestEnemyInDirection(Orb, Orb->GetActorLocation(), MaxDistance, Orb->GetActorForwardVector(), false) != nullptr;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoATeleport::TeleportBehindClosestEnemy(float MaxDistance)\n{\n\tif (Orb == nullptr || !ISoMortal::Execute_IsAlive(Orb))\n\t\treturn;\n\n\tif (ASoEnemy* Target = USoStaticHelper::GetClosestEnemyInDirection(Orb, Orb->GetActorLocation(), MaxDistance, Orb->GetActorForwardVector(), false))\n\t{\n\t\tOrb->SoActivity->SwitchActivity(Orb->SoADefault);\n\t\tSetDisabledState();\n\n\t\tconst FVector OldCharLocation = Orb->GetActorLocation();\n\t\tconst FVector TargetLocation = Target->GetActorLocation();\n\t\tconst FVector NewDirectionVector = (OldCharLocation - TargetLocation).GetSafeNormal();\n\n\t\tFSoSplinePoint NewSplineLocation = ISoSplineWalker::Execute_GetSplineLocationI(Target);\n\t\tNewSplineLocation += NewSplineLocation.GetDirectionModifierFromVector(-NewDirectionVector) * (Target->GetCapsuleComponent()->GetScaledCapsuleRadius() + 20.0f);\n\t\tOrb->SetPositionOnSplineSP(NewSplineLocation,\n\t\t\t\t\t\t\t\t   Target->GetActorLocation().Z,\n\t\t\t\t\t\t\t\t   true,\n\t\t\t\t\t\t\t\t   false,\n\t\t\t\t\t\t\t\t   NewSplineLocation.GetDirectionModifierFromVector(NewDirectionVector) < 0);\n\t\tSetEnabledState();\n\t}\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoATeleport::Tick(float DeltaSeconds)\n{\n\tswitch (TeleportState)\n\t{\n\t\tcase ESoATeleportState::EATS_FadeOut:\n\t\t\tCounter -= DeltaSeconds;\n\t\t\tif (Counter < KINDA_SMALL_NUMBER)\n\t\t\t{\n\t\t\t\tStartWaitForLevel();\n\t\t\t\tif (bArmed)\n\t\t\t\t{\n\t\t\t\t\tbArmed = false;\n\t\t\t\t\tOrb->OnArmedStateLeft();\n\t\t\t\t}\n\t\t\t\tif (bResetCameraViewAfterPortal)\n\t\t\t\t{\n\t\t\t\t\tbResetCameraViewAfterPortal = true;\n\t\t\t\t\tUSoStaticHelper::GetPlayerController(Orb)->SetViewTarget(Orb);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t\tbreak;\n\n\t\tcase ESoATeleportState::EATS_WaitForLevelToBeVisible:\n\t\t\tUpdateWaitForLevel();\n\t\t\tbreak;\n\n\t\tcase ESoATeleportState::EATS_Faded:\n\t\t\t// wait 4 frame for camera to update properly\n\t\t\tFrameCounter -= 1;\n\t\t\tif (FrameCounter < 0 && !USoLevelHelper::IsAnyLevelVisible(Orb, LevelsToHide))\n\t\t\t{\n\t\t\t\tif (LevelSequenceActor == nullptr)\n\t\t\t\t\tLevelSequenceActor = LevelSequenceActorPtr.Get();\n\t\t\t\tLevelSequenceActorPtr = nullptr;\n\n\t\t\t\tCounter = FadeInTimeDuringTeleport;\n\t\t\t\tif (LevelSequenceActor != nullptr || Animation != nullptr)\n\t\t\t\t{\n\t\t\t\t\tTeleportState = ESoATeleportState::EATS_Done;\n\t\t\t\t\tif (LevelSequenceActor != nullptr)\n\t\t\t\t\t{\n\t\t\t\t\t\tLevelSequenceActor->SequencePlayer->JumpToSeconds(0.0f);\n\t\t\t\t\t\tLevelSequenceActor->SequencePlayer->Play();\n\t\t\t\t\t\tOrb->FadeFromBlackInstant.Broadcast();\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\t// APlayerCameraManager* CamManager = Orb->GetPlayerController()->PlayerCameraManager;\n\t\t\t\t\t\t// CamManager->StartCameraFade(1.0f, 0.0f, FadeInTimeDuringTeleport, FLinearColor(0.0f, 0.0f, 0.0f, 1.0f), false, true);\n\t\t\t\t\t\tOrb->FadeFromBlack.Broadcast();\n\t\t\t\t\t}\n\t\t\t\t\tOrb->SoASoAWaitForActivitySwitch->Enter(LevelSequenceActor, CameraActor, Animation, TeleportTargetAfterSequence, true);\n\n\t\t\t\t\tif (CharacterHideTimeDuringSequence > 0.0f)\n\t\t\t\t\t{\n\t\t\t\t\t\tOrb->HideCharacterBP(true);\n\t\t\t\t\t\tGetWorld()->GetTimerManager().SetTimer(Orb->ShowCharacterTimer, Orb, &ASoCharacter::ShowCharacter, CharacterHideTimeDuringSequence);\n\n\t\t\t\t\t\tCharacterHideTimeDuringSequence = -1.0f;\n\t\t\t\t\t}\n\n\t\t\t\t\tLevelSequenceActor = nullptr;\n\t\t\t\t\tCameraActor = nullptr;\n\t\t\t\t\tAnimation = nullptr;\n\t\t\t\t\tTeleportTargetAfterSequence = nullptr;\n\n\t\t\t\t\tif (bLevelSwitchHappened)\n\t\t\t\t\t\tASoGameMode::Get(Orb).ResetGroupData();\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tTeleportState = ESoATeleportState::EATS_FadeIn;\n\t\t\t\t\tif (!Orb->bCameraFadeOutBlocked)\n\t\t\t\t\t{\n\t\t\t\t\t\t// APlayerCameraManager* CamManager = Orb->GetPlayerController()->PlayerCameraManager;\n\t\t\t\t\t\t// CamManager->StartCameraFade(1.0f, 0.0f, FadeInTimeDuringTeleport, FLinearColor(0.0f, 0.0f, 0.0f, 1.0f), false, true);\n\t\t\t\t\t\tOrb->FadeFromBlack.Broadcast();\n\n\t\t\t\t\t\tif (ParticleAfterPortal != nullptr)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tUGameplayStatics::SpawnEmitterAtLocation(Orb->GetWorld(), ParticleAfterPortal, Orb->GetActorLocation(), FRotator::ZeroRotator, true);\n\t\t\t\t\t\t\tParticleAfterPortal = nullptr;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase ESoATeleportState::EATS_FadeIn:\n\t\t\tCounter -= DeltaSeconds;\n\n\t\t\t// if done: wait for one frame before exit for camera to be updated properly\n\t\t\tif (Counter < KINDA_SMALL_NUMBER)\n\t\t\t\tTeleportState = ESoATeleportState::EATS_Done;\n\t\t\tbreak;\n\n\t\tcase ESoATeleportState::EATS_Done:\n\t\t\tSwitchToRelevantState(false);\n\t\t\tif (bLevelSwitchHappened)\n\t\t\t{\n\t\t\t\tASoGameMode::Get(Orb).ResetGroupData();\n\t\t\t\tOrb->OnAreaChanged.Broadcast(StoredOldSpline, StoredNewSpline);\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase ESoATeleportState::EATS_QuickTeleportPre:\n\t\t\tCounter -= DeltaSeconds;\n\t\t\tif (Counter < 0.0f)\n\t\t\t{\n\t\t\t\tUSoAudioManager::Get(Orb).SetAmbientFreeze(true);\n\n\t\t\t\tif (bRevive)\n\t\t\t\t{\n\t\t\t\t\tOrb->SetPositionOnSplineSP(StoredSplineTarget, StoredZTarget, false, false, bStoredLookBackwards);\n\t\t\t\t\tSetEnabledState();\n\t\t\t\t}\n\t\t\t\tOrb->SetPositionOnSplineSP(StoredSplineTarget, StoredZTarget, true, false, bStoredLookBackwards);\n\n\t\t\t\tif (bRevive)\n\t\t\t\t{\n\t\t\t\t\t(Orb->bLastRespawnWasSK ? Orb->SoResVFX : Orb->SoResCPVFX)->Activate(true);\n\t\t\t\t\t(Orb->bLastRespawnWasSK ? Orb->SoResSFX : Orb->SoResCPSFX)->Activate(true);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t\tOrb->SoQuickTeleportPost->Activate(true);\n\n\t\t\t\tif (Orb->SoActivity == this)\n\t\t\t\t{\n\t\t\t\t\tCounter = Orb->QuickTeleportPostTime + Counter;\n\t\t\t\t\tTeleportState = ESoATeleportState::EATS_QuickTeleportPost;\n\t\t\t\t\tOrb->HideCharacterBP(true);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase ESoATeleportState::EATS_QuickTeleportPost:\n\t\t\tCounter -= DeltaSeconds;\n\t\t\tif (Counter < 0.0f)\n\t\t\t{\n\t\t\t\tOrb->ShowCharacterBP(true);\n\t\t\t\tUSoAudioManager::Get(Orb).SetAmbientFreeze(false);\n\n\t\t\t\tif (LastActivity == Orb->SoADead ||\n\t\t\t\t\t(LastActivity == Orb->SoASoAWaitForActivitySwitch && LastActivity->CanBeInterrupted(EActivity::EA_Teleport)) ||\n\t\t\t\t\tLastActivity == Orb->SoAWeaponInArm)\n\t\t\t\t\tSwitchActivity(Orb->SoADefault);\n\t\t\t\telse\n\t\t\t\t\tSwitchToRelevantState(true);\n\t\t\t}\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tbreak;\n\t}\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoATeleport::UpdateCamera(float DeltaSeconds)\n{\n\tif (TeleportState == ESoATeleportState::EATS_QuickTeleportPre && bRevive)\n\t{\n\t\tOrb->SoADead->UpdateCamera(DeltaSeconds);\n\t}\n\telse if (TeleportState == ESoATeleportState::EATS_FadeOut ||\n\t\tTeleportState == ESoATeleportState::EATS_QuickTeleportPre ||\n\t\tTeleportState == ESoATeleportState::EATS_QuickTeleportPost)\n\t{\n\t\tSuper::UpdateCamera(DeltaSeconds);\n\t}\n\telse\n\t{\n\t\tOrb->LastLandZ = Orb->GetActorLocation().Z - Orb->GetCapsuleComponent()->GetScaledCapsuleHalfHeight();\n\t\tSuper::UpdateCamera(100.0f);\n\t\tOrb->CameraBoom->ForceUpdate();\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoATeleport::ShouldDecreaseCollision() const\n{\n\treturn bArmed || USoActivity::ShouldDecreaseCollision();\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoATeleport::StartWaitForLevel()\n{\n\tTeleportState = ESoATeleportState::EATS_WaitForLevelToBeVisible;\n\tbool bAllLoaded = false;\n\tFSoLevelManager::Get().ClaimSplineLocation(StoredSplineTarget, bAllLoaded);\n\tOrb->OnWaitForLevelShowStart.Broadcast(!bAllLoaded);\n\tif (!bAllLoaded)\n\t\tReduceTextureMemoryPool();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoATeleport::UpdateWaitForLevel()\n{\n\tbool bAllLoaded = false;\n\tif (!FSoLevelManager::Get().ClaimSplineLocation(StoredSplineTarget, bAllLoaded))\n\t\treturn;\n\n\tOrb->OnWaitForLevelShowEnd.Broadcast();\n\tRestoreTextureMemoryPool();\n\n\tTeleportState = ESoATeleportState::EATS_Faded;\n\tFrameCounter = 4;\n\n\tif (bHide)\n\t\tOrb->ShowCharacterBP(true);\n\n\tif (bMusicSwitchInProgress)\n\t{\n\t\tUSoAudioManager::Get(Orb).SetMusic(StoredNewSpline->GetMusic(), true);\n\t}\n\n\tTArray<FSoLevelClaim> OldClaims;\n\tif (StoredOldSpline != nullptr)\n\t\tOldClaims = StoredOldSpline->GetLevelClaims();\n\tconst auto& NewClaims = StoredNewSpline->GetLevelClaims();\n\n\tif (!bLevelSwitchHappened)\n\t\tUSoAudioManager::Get(Orb).SetAmbientFreeze(true);\n\n\tOrb->SetPositionOnSplineSP(StoredSplineTarget, StoredZTarget, true, false, bStoredLookBackwards);\n\n\tif (!bLevelSwitchHappened)\n\t\tUSoAudioManager::Get(Orb).SetAmbientFreeze(false);\n\n\tOrb->SetCameraLagEnabled(false);\n\n\tOrb->bUseSavedCameraBoomZ = false;\n\tOrb->bSavedCameraBoomZUpdateBlock = false;\n\tOrb->SavedCameraBoomZCounter = 0.0f;\n\tOrb->CameraUnfreezeCounter = 0.0f;\n\tOrb->CameraXDeltaCurrent = 0.0f;\n\tOrb->CameraXDeltaCounter = 0.0f;\n\n\tUpdateCamera(1.0f);\n\n\tif (bRevive)\n\t{\n\t\tSetEnabledState();\n\t\t// again cause of collision and stuff\n\t\tOrb->SetPositionOnSplineSP(StoredSplineTarget, StoredZTarget, true, false, bStoredLookBackwards);\n\n\t\t(Orb->bLastRespawnWasSK ? Orb->SoResVFX : Orb->SoResCPVFX)->Activate(true);\n\t\t(Orb->bLastRespawnWasSK ? Orb->SoResSFX : Orb->SoResCPSFX)->Activate(true);\n\t}\n\n\n\t// forced hide levels, cause they might overlap :( :( :(\n\tLevelsToHide.Empty();\n\tfor (auto& Claim : OldClaims)\n\t\tLevelsToHide.Add(Claim.LevelName);\n\n\tfor (auto& Claim : NewClaims)\n\t\tLevelsToHide.Remove(Claim.LevelName);\n\n\tfor (auto& LevelName : LevelsToHide)\n\t\tFSoLevelManager::Get().HideActiveLevel(Orb, LevelName);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoATeleport::ReduceTextureMemoryPool()\n{\n#if PLATFORM_SWITCH\n\tif (!bTexturePoolReduced)\n\t{\n\t\tUGameplayStatics::GetPlayerController(Orb, 0)->ConsoleCommand(\"r.Streaming.PoolSize 600\", true);\n\t\tbTexturePoolReduced = true;\n\t}\n#endif\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoATeleport::RestoreTextureMemoryPool()\n{\n#if PLATFORM_SWITCH\n\tif (bTexturePoolReduced)\n\t{\n\t\tUGameplayStatics::GetPlayerController(Orb, 0)->ConsoleCommand(\"r.Streaming.PoolSize 1200\", true);\n\t\tbTexturePoolReduced = false;\n\t}\n#endif\n}\n"
  },
  {
    "path": "Source/SOrb/Character/SoCharStates/SoATeleport.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#pragma once\n\n#include \"SoActivity.h\"\n#include \"SplineLogic/SoSplinePoint.h\"\n#include \"SoATeleport.generated.h\"\n\nclass ALevelSequenceActor;\nclass UAnimSequenceBase;\nclass ASoMarker;\nclass ASoPlayerSpline;\nclass ASoEnemy;\n\nUENUM(BlueprintType)\nenum class ESoATeleportState : uint8\n{\n\tEATS_FadeOut,\n\tEATS_Faded,\n\tEATS_FadeIn,\n\tEATS_WaitForLevelToBeVisible,\n\n\tEATS_QuickTeleportPre,\n\tEATS_QuickTeleportPost,\n\n\tEATS_Done\n};\n\nUCLASS()\nclass SORB_API USoATeleport : public USoActivity\n{\n\tGENERATED_BODY()\n\npublic:\n\n\tUSoATeleport();\n\n\tvirtual void Tick(float DeltaSeconds) override;\n\n\t// input\n\tvirtual void JumpPressed() override {};\n\tvirtual void Move(float Value) override {};\n\tvirtual void ToggleWeapons() override {};\n\n\t/** true: already teleported, false: teleport state is used */\n\tUFUNCTION(BlueprintCallable, Category = SoCharacter)\n\tbool SetupTeleport(const FSoSplinePoint& SplineTarget,\n\t\t\t\t\t   float ZTarget,\n\t\t\t\t\t   bool bForceFade,\n\t\t\t\t\t   bool bLookBackwards,\n\t\t\t\t\t   bool bHideDuringTeleport = false,\n\t\t\t\t\t   bool bCamAlreadyOutFaded = false);\n\n\t/** tries to teleport the character without activity change, only works if there is no level change involved. Return true on success */\n\tUFUNCTION(BlueprintCallable, Category = SoCharacter)\n\tbool SetupQuickTeleport(const FSoSplinePoint& SplineTarget,\n\t\t\t\t\t\t\tfloat ZTarget,\n\t\t\t\t\t\t\tbool bLookBackwards);\n\n\tFORCEINLINE void SetSequence(ALevelSequenceActor* InLevelSequenceActor,\n\t\t\t\t\t\t\t\t AActor* InCameraActor,\n\t\t\t\t\t\t\t\t UAnimSequenceBase* InAnimation,\n\t\t\t\t\t\t\t\t float CharHideTime = -1.0f,\n\t\t\t\t\t\t\t\t ASoMarker* TelTargetAfterSequence = nullptr)\n\t{\n\t\tLevelSequenceActor = InLevelSequenceActor;\n\t\tCameraActor = InCameraActor;\n\t\tAnimation = InAnimation;\n\t\tCharacterHideTimeDuringSequence = CharHideTime;\n\t\tTeleportTargetAfterSequence = TelTargetAfterSequence;\n\t}\n\n\tFORCEINLINE void ClearSequence()\n\t{\n\t\tLevelSequenceActor = nullptr;\n\t\tCameraActor = nullptr;\n\t\tAnimation = nullptr;\n\t}\n\n\tUFUNCTION(BlueprintPure, Category = \"SoCharacter\")\n\tbool CanSwapPlayerWithSplineWalker(float MaxDistance);\n\n\tUFUNCTION(BlueprintCallable, Category = \"SoCharacter\")\n\tASoEnemy* SwapPlayerWithSplineWalker(float MaxDistance, UParticleSystem* SwapVFX);\n\n\tUFUNCTION(BlueprintCallable, Category = \"SoCharacter\")\n\tASoEnemy* TeleportBehindSplineWalker(float MaxDistance, UParticleSystem* VFX, float Distance = 100.0f);\n\n\n\tUFUNCTION(BlueprintPure, Category = \"SoCharacter\")\n\tbool CanTeleportBehindClosestEnemy(float MaxDistance);\n\n\tUFUNCTION(BlueprintCallable, Category = \"SoCharacter\")\n\tvoid TeleportBehindClosestEnemy(float MaxDistance);\n\n\n\tvirtual bool CanInteract() const override { return false; }\n\n\tvoid SetResetCameraViewAfterPortal() { bResetCameraViewAfterPortal = true; }\n\n\t// switch only memory hack\n\tvoid ReduceTextureMemoryPool();\n\tvoid RestoreTextureMemoryPool();\n\nprotected:\n\n\tvirtual void OnEnter(USoActivity* OldActivity) override;\n\tvirtual void OnExit(USoActivity* NewActivity) override;\n\n\tvirtual bool CanBeInterrupted(EActivity DesiredState = EActivity::EA_Max) const override { return false; }\n\n\tvirtual bool DecreaseHealth(const FSoDmg& Damage) override { return true; }\n\n\tUFUNCTION(BlueprintPure, Category = UI)\n\tbool ShouldHideGameOverUI() const { return TeleportState != ESoATeleportState::EATS_FadeOut; }\n\n\tvirtual void UpdateCamera(float DeltaSeconds) override;\n\n\tvirtual bool CanBeArmedState() const override { return true; }\n\tvirtual bool ShouldDecreaseCollision() const;\n\n\tFVector GetCharRelevantDirection() const;\n\n\tvoid StartWaitForLevel();\n\tvoid UpdateWaitForLevel();\n\nprotected:\n\tESoATeleportState TeleportState;\n\n\tUPROPERTY(BlueprintReadOnly)\n\tFSoSplinePoint StoredSplineTarget;\n\n\tfloat StoredZTarget;\n\tbool bStoredLookBackwards;\n\tbool bMusicSwitchInProgress;\n\n\tfloat Counter;\n\tbool bRevive;\n\n\tint32 FrameCounter = -1;\n\tTSet<FName> LevelsToHide;\n\n\tbool bHide;\n\n\tbool bLevelSwitchHappened = false;\n\n\tUPROPERTY(BlueprintReadWrite)\n\tALevelSequenceActor* LevelSequenceActor = nullptr;\n\n\tUPROPERTY(BlueprintReadWrite)\n\tTSoftObjectPtr<ALevelSequenceActor> LevelSequenceActorPtr;\n\n\tUPROPERTY(BlueprintReadWrite)\n\tASoMarker* TeleportTargetAfterSequence = nullptr;\n\n\tUPROPERTY(BlueprintReadWrite)\n\tAActor* CameraActor = nullptr;\n\n\t/** if set it is triggered on the character location when the fade in starts */\n\tUPROPERTY(BlueprintReadWrite)\n\tUParticleSystem* ParticleAfterPortal = nullptr;\n\n\tUPROPERTY(BlueprintReadWrite)\n\tUAnimSequenceBase* Animation = nullptr;\n\n\tfloat CharacterHideTimeDuringSequence = -1.0f;\n\n\tUPROPERTY(BlueprintReadWrite)\n\tbool bResetCameraViewAfterPortal = false;\n\n\tUPROPERTY()\n\tconst ASoPlayerSpline* StoredOldSpline;\n\n\tUPROPERTY()\n\tconst ASoPlayerSpline* StoredNewSpline;\n\n#if PLATFORM_SWITCH\n\tbool bTexturePoolReduced = false;\n#endif\n};\n"
  },
  {
    "path": "Source/SOrb/Character/SoCharStates/SoAWait.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#include \"SoAWait.h\"\n#include \"Character/SoCharacter.h\"\n#include \"SoAInUI.h\"\n#include \"SoAWeaponInArm.h\"\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// set base flags\nUSoAWait::USoAWait() :\n\tUSoActivity(EActivity::EA_Wait)\n{\n\tLookDirection = ESoLookDirection::ELD_Frozen;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoAWait::Tick(float DeltaSeconds)\n{\n\tUSoActivity::Tick(DeltaSeconds);\n\n\tCounter -= DeltaSeconds;\n\tif (Counter < 0.0f)\n\t{\n\t\tif (bArmed)\n\t\t\tSwitchActivity(Orb->SoAWeaponInArm);\n\t\telse\n\t\t\tSwitchToRelevantState(true);\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoAWait::Enter(float Duration, bool bInArmed)\n{\n\tOrb->SoActivity->SwitchActivity(this);\n\tCounter = Duration;\n\tbArmed = bInArmed;\n}\n"
  },
  {
    "path": "Source/SOrb/Character/SoCharStates/SoAWait.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#pragma once\n\n#include \"SoActivity.h\"\n\n#include \"SoAWait.generated.h\"\n\n\nUCLASS()\nclass SORB_API USoAWait : public USoActivity\n{\n\tGENERATED_BODY()\n\npublic:\n\n\tUSoAWait();\n\n\tvirtual void Tick(float DeltaSeconds) override;\n\n\tvirtual void Move(float Value) override {};\n\tvirtual void StrikePressed() override {};\n\tvirtual void RightBtnPressed() override {};\n\tvirtual void JumpPressed() override {};\n\tvirtual void RollPressed() override {};\n\tvirtual void ToggleWeapons() override {};\n\tvirtual void ToggleItems() override {};\n\tvirtual void UseItemFromSlot0() override {};\n\n\tvirtual void InteractKeyPressed(bool bPrimary) override {};\n\n\tvirtual bool CanBeInterrupted(EActivity DesiredState = EActivity::EA_Max) const override { return false; }\n\n\tUFUNCTION(BlueprintCallable, Category = Wait)\n\tvoid Enter(float Duration, bool bInArmed = false);\n\nprotected:\n\n\tUPROPERTY(BlueprintReadWrite)\n\tfloat Counter = -1.0f;\n};\n"
  },
  {
    "path": "Source/SOrb/Character/SoCharStates/SoAWaitForActivitySwitch.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#include \"SoAWaitForActivitySwitch.h\"\n\n#include \"Runtime/LevelSequence/Public/LevelSequenceActor.h\"\n\n#include \"SoADefault.h\"\n#include \"Animation/AnimSequenceBase.h\"\n#include \"Character/SoCharacter.h\"\n#include \"Character/SoPlayerProgress.h\"\n#include \"SoAInUI.h\"\n#include \"SplineLogic/SoMarker.h\"\n#include \"SoATeleport.h\"\n#include \"CharacterBase/SoCharacterMovementComponent.h\"\n#include \"SplineLogic/SoPlayerSpline.h\"\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUSoASoAWaitForActivitySwitch::USoASoAWaitForActivitySwitch() :\n\tUSoActivity(EActivity::EA_WaitForActivitySwitch)\n{\n\tLookDirection = ESoLookDirection::ELD_Frozen;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoASoAWaitForActivitySwitch::OnEnter(USoActivity* OldActivity)\n{\n\tSuper::OnEnter(OldActivity);\n\n\tAnimationToPlay = nullptr;\n\tLevelSequenceActor = nullptr;\n\tCameraActor = nullptr;\n\tif (bHideUI)\n\t\tOrb->ChangeUIVisibility.Broadcast(false);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoASoAWaitForActivitySwitch::OnExit(USoActivity* NewActivity)\n{\n\tSuper::OnExit(NewActivity);\n\n\tOrb->bShowInteractionTip = true;\n\tOrb->OnInteractionLabelChanged.Broadcast();\n\n\tif (bTriggerAreaChangeAfterSequence)\n\t{\n\t\tOrb->OnAreaChanged.Broadcast(nullptr, Cast<ASoPlayerSpline>(Orb->SoMovement->GetSplineLocation().GetSpline()));\n\t\tbTriggerAreaChangeAfterSequence = false;\n\t}\n\n\tif (bHideUI)\n\t\tOrb->ChangeUIVisibility.Broadcast(true);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoASoAWaitForActivitySwitch::Enter(EActivity InActivityToWaitFor, bool bForce, bool bInArmed)\n{\n\tbHideUI = false;\n\tbTriggerAreaChangeAfterSequence = false;\n\tActivityToWaitFor = InActivityToWaitFor;\n\tif (bForce || Orb->SoActivity->CanBeInterrupted(EActivity::EA_WaitForActivitySwitch))\n\t{\n\t\tbArmed = bInArmed;\n\n\t\tOrb->SoActivity->SwitchActivity(this);\n\t\treturn true;\n\t}\n\n\treturn false;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoASoAWaitForActivitySwitch::Enter(ALevelSequenceActor* SequenceActor,\n\t\t\t\t\t\t\t\t\t\t AActor* InCameraActor,\n\t\t\t\t\t\t\t\t\t\t UAnimSequenceBase* AnimToPlay,\n\t\t\t\t\t\t\t\t\t\t ASoMarker* TelTargetAfterSequence,\n\t\t\t\t\t\t\t\t\t\t bool bInTriggerAreaChangeAfterSequence,\n\t\t\t\t\t\t\t\t\t\t bool bInHideUI)\n{\n\tbHideUI = bInHideUI;\n\tActivityToWaitFor = TelTargetAfterSequence == nullptr ? EActivity::EA_Max : EActivity::EA_Teleport;\n\tOrb->SoActivity->SwitchActivity(this);\n\n\tLevelSequenceActor = SequenceActor;\n\tTeleportAfterSequence = TelTargetAfterSequence;\n\tCameraActor = InCameraActor;\n\tCounter = 0.2f;\n\tOrb->bShowInteractionTip = false;\n\tOrb->OnInteractionLabelChanged.Broadcast();\n\tAnimationToPlay = AnimToPlay;\n\tbPingAnimation = !bPingAnimation;\n\n\tbAnimationFinished = false;\n\tbTriggerAreaChangeAfterSequence = bInTriggerAreaChangeAfterSequence;\n\n\treturn true;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoASoAWaitForActivitySwitch::Tick(float DeltaSeconds)\n{\n\tSuper::Tick(DeltaSeconds);\n\n\tif (Counter > 0.0f)\n\t{\n\t\tCounter -= DeltaSeconds;\n\t\tif (Counter <= 0.0f && CameraActor != nullptr)\n\t\t\tOrb->GetPlayerController()->SetViewTarget(CameraActor);\n\t}\n\n\tif (LevelSequenceActor != nullptr && !LevelSequenceActor->SequencePlayer->IsPlaying())\n\t{\n\t\tOrb->GetPlayerProgress()->StartGatheringPlayerData();\n\t\tLevelSequenceActor = nullptr;\n\t\tif (TeleportAfterSequence != nullptr)\n\t\t{\n\t\t\tOrb->GetPlayerController()->SetViewTarget(Orb);\n\t\t\tOrb->SoATeleport->SetSequence(nullptr, nullptr, AnimationToPlay);\n\t\t\tOrb->SoATeleport->SetupTeleport(TeleportAfterSequence->GetSplineLocation(), TeleportAfterSequence->GetActorLocation().Z, true, false, false, true);\n\t\t\treturn;\n\t\t}\n\n\t\tOrb->GetPlayerController()->SetViewTargetWithBlend(Orb, 1.5f, EViewTargetBlendFunction::VTBlend_EaseInOut, 2);\n\n\t\t// APlayerCameraManager* CamManager = Orb->GetPlayerController()->PlayerCameraManager;\n\t\t// CamManager->SetManualCameraFade(0.0f, FLinearColor(0.0f, 0.0f, 0.0f, 1.0f), false);\n\t\t// CamManager->StopCameraFade();\n\t\tOrb->FadeFromBlackInstant.Broadcast();\n\n\t\tOrb->bShowInteractionTip = true;\n\t\tOrb->OnInteractionLabelChanged.Broadcast();\n\n\t\tif (AnimationToPlay == nullptr)\n\t\t\tSwitchActivity(Orb->SoADefault);\n\t}\n\telse\n\t\tif (LevelSequenceActor == nullptr && bAnimationFinished)\n\t\t{\n\t\t\tbAnimationFinished = false;\n\t\t\tSwitchActivity(Orb->SoADefault);\n\t\t}\n}\n"
  },
  {
    "path": "Source/SOrb/Character/SoCharStates/SoAWaitForActivitySwitch.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#pragma once\n\n#include \"SoActivity.h\"\n\n#include \"SoAWaitForActivitySwitch.generated.h\"\n\nclass ALevelSequenceActor;\nclass ASoMarker;\n\nUCLASS()\nclass SORB_API USoASoAWaitForActivitySwitch : public USoActivity\n{\n\tGENERATED_BODY()\n\npublic:\n\n\tUSoASoAWaitForActivitySwitch();\n\n\tvirtual void Tick(float DeltaSeconds) override;\n\n\tvirtual void Move(float Value) override {}\n\tvirtual void StrikePressed() override {}\n\tvirtual void RightBtnPressed() override {}\n\tvirtual void JumpPressed() override {}\n\tvirtual void RollPressed() override {}\n\tvirtual void ToggleWeapons() override {}\n\tvirtual void ToggleItems() override {}\n\tvirtual void UseItemFromSlot0() override {}\n\n\tvirtual void InteractKeyPressed(bool bPrimary) override {}\n\n\tFORCEINLINE virtual bool CanBeInterrupted(EActivity DesiredState = EActivity::EA_Max) const override\n\t{\n\t\treturn\t((ActivityToWaitFor == EActivity::EA_Max && DesiredState != EActivity::EA_InUI) ||\n\t\t\t\t  ActivityToWaitFor == DesiredState);\n\t}\n\n\t/** if UISource is not nullptr UIActivityClass will be entered via SoAInUI */\n\tUFUNCTION(BlueprintCallable, Category = Interact)\n\tbool Enter(EActivity InActivityToWaitFor, bool bForce, bool bInArmed = false);\n\n\tbool Enter(ALevelSequenceActor* SequenceActor,\n\t\t\t   AActor* InCameraActor,\n\t\t\t   UAnimSequenceBase* AnimToPlay,\n\t\t\t   ASoMarker* TelTargetAfterSequence,\n\t\t\t   bool bInTriggerAreaChangeAfterSequence,\n\t\t\t   bool bInHideUI = false);\n\nprotected:\n\n\tvirtual void OnEnter(USoActivity* OldActivity) override;\n\tvirtual void OnExit(USoActivity* NewActivity) override;\n\nprotected:\n\n\tUPROPERTY(BlueprintReadWrite)\n\tEActivity ActivityToWaitFor;\n\n\tUPROPERTY()\n\tALevelSequenceActor* LevelSequenceActor;\n\n\tUPROPERTY()\n\tASoMarker* TeleportAfterSequence = nullptr;\n\n\tUPROPERTY()\n\tAActor* CameraActor;\n\n\t/** reseted from bp on playback end */\n\tUPROPERTY(BlueprintReadWrite)\n\tUAnimSequenceBase* AnimationToPlay = nullptr;\n\n\tfloat Counter = -1.0f;\n\n\tUPROPERTY(BlueprintReadWrite)\n\tbool bAnimationFinished = false;\n\n\tUPROPERTY(BlueprintReadWrite)\n\tbool bPingAnimation = true;\n\n\tbool bTriggerAreaChangeAfterSequence = false;\n\n\tbool bHideUI = false;\n};\n"
  },
  {
    "path": "Source/SOrb/Character/SoCharStates/SoAWeaponInArm.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#include \"SoAWeaponInArm.h\"\n\n#include \"Components/CapsuleComponent.h\"\n\n#include \"CharacterBase/SoCharacterMovementComponent.h\"\n#include \"Character/SoCharacter.h\"\n#include \"Character/SoPlayerCharacterSheet.h\"\n#include \"Character/SoWizard.h\"\n#include \"Items/SoItem.h\"\n#include \"Items/ItemTemplates/SoWeaponTemplate.h\"\n#include \"Basic/SoAudioManager.h\"\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// set base flags\nUSoAWeaponInArm::USoAWeaponInArm() :\n\tUSoActivity(EActivity::EA_WeaponInArm)\n{\n\tLookDirection = ESoLookDirection::ELD_Input;\n\tbArmed = true;\n\t// bBounceJumps = true;\n}\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoAWeaponInArm::OnEnter(USoActivity* OldActivity)\n{\n\tUSoActivity::OnEnter(OldActivity);\n\n\tRefreshWeapon();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoAWeaponInArm::Tick(float DeltaSeconds)\n{\n\tbLowerArms = true;\n\n\tconst FVector CapsuleHalfZOffset = FVector(0.0f, 0.0f, Orb->GetCapsuleComponent()->GetScaledCapsuleHalfHeight());\n\tconst FVector Start = Orb->GetActorLocation() + CapsuleHalfZOffset;\n\tconst FVector End = Start + CapsuleHalfZOffset * 2;\n\n\tFCollisionQueryParams QuaryParams;\n\tQuaryParams.AddIgnoredActor(Orb);\n\tbLowerArms = (Orb->GetWorld()->LineTraceTestByChannel(Start, End, ECollisionChannel::ECC_WorldDynamic, QuaryParams));\n\n\tif (Orb->InterruptedWizardDialogue != nullptr)\n\t\tOrb->SoWizard->ResumeDialogueWithPlayer();\n\n\tSuper::Tick(DeltaSeconds);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoAWeaponInArm::OnExit(USoActivity* NewActivity)\n{\n\tUSoActivity::OnExit(NewActivity);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoAWeaponInArm::RefreshWeapon()\n{\n\tconst FSoItem& Item = Orb->GetPlayerCharacterSheet()->GetEquippedItem(ESoItemSlot::EIS_Weapon0);\n\tconst USoWeaponTemplate* WeaponTemplate = Cast<const USoWeaponTemplate>(Item.Template);\n\tif (WeaponTemplate == nullptr)\n\t\treturn;\n\n\tOrb->SelectWeapon(Item);\n\tActiveWeaponType = WeaponTemplate->GetWeaponType();\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoAWeaponInArm::ToggleWeapons()\n{\n\tSuper::ToggleWeapons();\n\tRefreshWeapon();\n}\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoAWeaponInArm::CanBeInterrupted(EActivity DesiredState) const\n{\n\treturn true;\n\t//return DesiredState == EActivity::EA_ShieldMode ||\n\t//\t   DesiredState == EActivity::EA_ItemThrow ||\n\t//\t   DesiredState == EActivity::EA_ItemUsage;\n}\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// Player don't wanna fight anymore\nvoid USoAWeaponInArm::TakeWeaponAway()\n{\n\tif (Orb->bForceWeaponOn)\n\t\treturn;\n\n\tSwitchToRelevantState(false);\n\tUSoAudioManager::PlaySoundAtLocation(this, Orb->SFXArmedStop, Orb->GetActorTransform(), true);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoAWeaponInArm::OnLanded()\n{\n\tUSoAudioManager::PlaySoundAtLocation(Orb, Orb->SFXArmedLand, FTransform(Orb->GetActorTransform()));\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoAWeaponInArm::StartFloating()\n{\n\tSuper::StartFloating();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoAWeaponInArm::StopFloating()\n{\n\tSuper::StopFloating();\n\tRefreshWeapon();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n"
  },
  {
    "path": "Source/SOrb/Character/SoCharStates/SoAWeaponInArm.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#pragma once\n\n#include \"SoActivity.h\"\n#include \"Items/SoItemTypes.h\"\n#include \"SoAWeaponInArm.generated.h\"\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUCLASS()\nclass SORB_API USoAWeaponInArm : public USoActivity\n{\n\tGENERATED_BODY()\npublic:\n\tUSoAWeaponInArm();\n\n\n\tvirtual void Tick(float DeltaSeconds) override;\n\n\n\tvirtual void TakeWeaponAway() override;\n\tvirtual void ToggleWeapons() override;\n\n\tUFUNCTION(BlueprintPure, Category = \"General\")\n\tESoWeaponType GetActiveWeaponType() const { return ActiveWeaponType; }\n\n\tvirtual void OnLanded() override;\n\n\n\tvirtual void StartFloating() override;;\n\tvirtual void StopFloating() override;;\n\n\tUFUNCTION(BlueprintCallable)\n\tvoid RefreshWeapon();\n\nprotected:\n\n\tESoWeaponType ActiveWeaponType;\n\n\tvirtual void OnEnter(USoActivity* OldActivity) override;\n\tvirtual void OnExit(USoActivity* NewActivity) override;\n\n\tvirtual bool CanBeInterrupted(EActivity DesiredState = EActivity::EA_Max) const override;\n\tvirtual bool CanJumpFromAir() const override { return true; }\n\n\t/** set to true if stance must be modified cause of environment */\n\tUPROPERTY(BlueprintReadOnly)\n\tbool bLowerArms = false;\n};\n"
  },
  {
    "path": "Source/SOrb/Character/SoCharStates/SoActivity.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#include \"SoActivity.h\"\n\n#include \"Components/CapsuleComponent.h\"\n#include \"Components/SkeletalMeshComponent.h\"\n#include \"Components/SceneCaptureComponent2D.h\"\n#include \"TimerManager.h\"\n#include \"UObject/Package.h\"\n#include \"UObject/UObjectGlobals.h\"\n#include \"UObject/ObjectMacros.h\"\n#include \"Engine/PostProcessVolume.h\"\n#include \"Materials/MaterialInstanceDynamic.h\"\n#include \"Kismet/GameplayStatics.h\"\n#include \"Particles/ParticleSystemComponent.h\"\n#include \"Camera/CameraComponent.h\"\n#include \"GameFramework/PlayerController.h\"\n\n// #include \"DrawDebugHelpers.h\"\n\n#include \"Character/SoCharacter.h\"\n#include \"Character/SoSpringArmComponent.h\"\n#include \"Character/SoPlayerCharacterSheet.h\"\n#include \"Character/SoPlayerProgress.h\"\n\n#include \"Character/SoCharStates/SoADefault.h\"\n#include \"Character/SoCharStates/SoAWait.h\"\n#include \"Character/SoCharStates/SoASwing.h\"\n#include \"Character/SoCharStates/SoASlide.h\"\n#include \"Character/SoCharStates/SoADead.h\"\n#include \"Character/SoCharStates/SoAHitReact.h\"\n#include \"Character/SoCharStates/SoAInUI.h\"\n#include \"Character/SoCharStates/SoActivity.h\"\n#include \"Character/SoCharStates/SoAStrike.h\"\n#include \"Character/SoCharStates/SoAItemUsage.h\"\n#include \"Character/SoCharStates/SoAAiming.h\"\n#include \"Character/SoCharStates/SoAWeaponInArm.h\"\n#include \"Character/SoCharStates/SoARoll.h\"\n#include \"Character/SoCharStates/SoALeverPush.h\"\n#include \"Character/SoCharStates/SoASkyControlEdit.h\"\n#include \"Character/SoCharStates/SoACameraEdit.h\"\n#include \"Character/SoCharStates/SoARoll.h\"\n#include \"Character/SoCharStates/SoACharShadowEdit.h\"\n#include \"Character/SoCharStates/SoALillian.h\"\n#include \"Character/SoCharStates/SoATeleport.h\"\n\n#include \"Items/ItemTemplates/SoUsableItemTemplate.h\"\n#include \"Items/ItemTemplates/SoWeaponTemplate.h\"\n\n#include \"Interactables/SoInteractable.h\"\n#include \"Interactables/SoInteractableActor.h\"\n\n#include \"Enemy/SoEnemyHelper.h\"\n\n#include \"UI/SoUISystem.h\"\n#include \"UI/General/SoUITypes.h\"\n#include \"UI/Menu/SoUIMenuMain.h\"\n\n#include \"Levels/SoLevelHelper.h\"\n#include \"Basic/SoGameInstance.h\"\n#include \"Basic/Helpers/SoMathHelper.h\"\n#include \"Basic/Helpers/SoStaticHelper.h\"\n#include \"Basic/SoAudioManager.h\"\n#include \"Basic/Helpers/SoDateTimeHelper.h\"\n#include \"CharacterBase/SoCharacterMovementComponent.h\"\n#include \"SplineLogic/SoPlayerSpline.h\"\n#include \"Settings/SoGameSettings.h\"\n\n#include \"Logic/SoTriggerable.h\"\n\n#include \"SaveFiles/SoWorldState.h\"\n\n#if WITH_EDITOR\n#include \"Editor/UnrealEd/Public/UnrealEdGlobals.h\"\n#include \"Editor/UnrealEdEngine.h\"\n#endif\n\nDEFINE_LOG_CATEGORY_STATIC(LogSoCharActivity, Log, All);\n\n\nconst FName USoActivity::TrampolineTag = FName(\"Trampoline\");\nconst FName USoActivity::SlipperyPosTag = FName(\"SlipperyPos\");\nconst FName USoActivity::SlipperyNegTag = FName(\"SlipperyNeg\");\nconst FName USoActivity::RollOnlySurface = FName(\"RollOnly\");\nconst FName USoActivity::NoWallJumpSurface = FName(\"NoWallJump\");\nconst FName USoActivity::NoBounceSurface = FName(\"NoBounce\");\nconst FName USoActivity::TriggerOnStand = FName(\"TriggerOnStand\");\n\nconst FName USoActivity::EnabledCollisionProfileName = FName(\"SoPlayerCharacter\");\nconst FName USoActivity::DisabledCollisionProfileName = FName(\"SoPlayerCharacterDisabled\");\n\nconst float JumpPressedRecentlyTimeOffset = 0.3f;\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoActivity::PostInitProperties()\n{\n\tSuper::PostInitProperties();\n\n\tif (!HasAnyFlags(RF_ClassDefaultObject | RF_NeedLoad))\n\t{\n\t\tOrb = Cast<ASoCharacter>(GetOuter());\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// Called on old activity\nvoid USoActivity::SwitchActivity(USoActivity* NewActivity)\n{\n\tif (NewActivity == this)\n\t\treturn;\n\n\t// if it is nullptr the point is to leave the current state most likely\n\tif (NewActivity == nullptr)\n\t\tNewActivity = Orb->SoADefault;\n\n#if WITH_EDITOR\n\tif (NewActivity->Orb == nullptr)\n\t{\n\t\tUE_LOG(LogSoCharActivity, Error, TEXT(\"USoActivity::SwitchActivity failed: NewActivity->Orb is nullptr. It should be initialized in SoCharacter::PreInitializeComponents!\"));\n\t\treturn;\n\t}\n#endif\n\n\tUSoActivity* OldActivity = Orb->SoActivity;\n\tbool bCouldInteract = false;\n\tif (OldActivity != nullptr)\n\t{\n\t\tbCouldInteract = OldActivity->CanInteract();\n\t\tOldActivity->OnExit(NewActivity);\n\t}\n\tOrb->SoActivity = NewActivity;\n\tNewActivity->OnEnter(this);\n\tNewActivity->LastActivity = this;\n\n\tif (bCouldInteract != Orb->SoActivity->CanInteract())\n\t\tOrb->OnInteractionLabelChanged.Broadcast();\n\n\tif (OldActivity != nullptr)\n\t\tOldActivity->OnPostExit(NewActivity);\n\n\tif (OldActivity == nullptr ||\n\t\tOldActivity->bCanHaveDefaultKeyLights != NewActivity->bCanHaveDefaultKeyLights)\n\t\tOrb->RefreshDefaultKeyLights();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// check some common problem based on flags\nvoid USoActivity::OnEnter(USoActivity* OldActivity)\n{\n//#if WITH_EDITOR\n//\tconst UEnum* EnumPtr = FindObject<UEnum>(ANY_PACKAGE, TEXT(\"EActivity\"), true);\n//\tconst FString EnumName = EnumPtr ? EnumPtr->GetNameStringByIndex(static_cast<int32>(ID)) : \"Invalid ID\";\n//\tUE_LOG(LogSoCharActivity, Display, TEXT(\"Activity entered: %s\"), *EnumName);\n//#endif\n\n\tswitch (LookDirection)\n\t{\n\t\tcase ESoLookDirection::ELD_Movement:\n\t\t\tOrb->SoMovement->bOrientRotationToMovement = !Orb->bLockForwardVecPressed;\n\t\t\tbreak;\n\t\tcase ESoLookDirection::ELD_Frozen:\n\t\t\tOrb->StoredForwardVector = Orb->GetActorForwardVector();\n\t\tdefault:\n\t\t\tbreak;\n\t}\n\n\tOrb->SoMovement->JumpZVelocity = JumpZVelocity;\n\tOrb->SoMovement->MaxWalkSpeed = MovementSpeed;\n\n\tHandleCollision();\n\n\t// Leg jump could influence the ActiveRollJumpHeight\n\tif (JumpType == ESoJumpType::EJT_Bounce || (JumpType == ESoJumpType::EJT_BounceIfPressed && Orb->bRollPressed))\n\t\tOrb->SoMovement->JumpZVelocity = Orb->GetActiveRollJumpHeight();\n}\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// we shall meet again\nvoid USoActivity::OnExit(USoActivity* NewActivity)\n{\n\tif (IsArmedState() &&\n\t\t!(NewActivity->IsArmedState() || NewActivity->CanBeArmedState()))\n\t\tOrb->OnArmedStateLeft();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// Called every frame\nvoid USoActivity::Tick(float DeltaSeconds)\n{\n\t// 1. handle collision size\n\tHandleCollision();\n\n\t// 2. clear jump&roll assist if necessary\n\tif (FMath::Abs(Orb->StoredMovementInputDirOnJump - Orb->GetMovementXAxisValue()) > KINDA_SMALL_NUMBER)\n\t{\n\t\tOrb->StoredMovementInputDirOnJump = -1.0f;\n\t\tOrb->StoredTimeOnJump = -1.0f;\n\t}\n\n\t// 3. fix orientation\n\tUpdateOrientation();\n\n\t// 4. some input based state change\n\tUpdateFloating();\n\n\tif (Orb->bRollPressed/* && !Orb->bFloatingActive*/)\n\t\tRollPressed();\n\n\n\t// 5. check for idle\n\tconst FVector ActualPosition = Orb->GetActorLocation();\n\tif (FVector::DistSquared(ActualPosition, Orb->SavedPosition) > KINDA_SMALL_NUMBER)\n\t{\n\t\tOrb->IdleTime = 0.f;\n\t\tOrb->SavedPosition = ActualPosition;\n\t}\n\telse\n\t{\n\t\tOrb->IdleTime += DeltaSeconds;\n\t\t//if (Orb->IdleTime > Orb->GetMaxIdleTime())\n\t\t//{\n\t\t//\tOrb->IdleTime = 0.0f;\n\t\t//\tOrb->PauseGame();\n\t\t//}\n\t}\n\n\n\t// 6. update interaction if necessary\n\tif (Orb->SwingCenters.Num() > 0)\n\t\tOrb->OnInteractionLabelChanged.Broadcast();\n\n\n\tif (Orb->SoMovement->MovementMode == EMovementMode::MOVE_Falling)\n\t{\n\t\t// check if we have to raise our hands\n\t\tconst FVector Start = Orb->GetActorLocation();\n\t\tconst FVector End = Start - FVector(0.0f, 0.0f, 100.0f);\n\t\tFCollisionQueryParams QuaryParams;\n\t\tQuaryParams.AddIgnoredActor(Orb);\n\t\tQuaryParams.bIgnoreTouches = true;\n\t\tFCollisionResponseParams ResponseParams;\n\t\tOrb->bAlmostLanded = Orb->GetWorld()->LineTraceTestByChannel(Start, End, ECollisionChannel::ECC_WorldDynamic, QuaryParams);\n\n\t\t// if (Orb->bAlmostLanded)\n\t\t// \tDrawDebugLine(GetWorld(), Start, End, FColor::Red);\n\t\t// else\n\t\t// \tDrawDebugLine(GetWorld(), Start, End, FColor::Blue);\n\t}\n\telse\n\t\tOrb->bAlmostLanded = false;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoActivity::ShouldDecreaseCollision() const\n{\n\treturn !Orb->SoMovement->IsMovingOnGround();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoActivity::HandleCollision()\n{\n\tif (ShouldDecreaseCollision())\n\t\tOrb->DecreaseCollisionSize();\n\telse\n\t{\n\t\tif (Orb->bCollisionAlreadyDecreased)\n\t\t{\n\t\t\tif (Orb->CanIncreaseCollision())\n\t\t\t\tOrb->IncreaseCollisionSize();\n\t\t\telse\n\t\t\t\tif (Orb->SoActivity != Orb->SoAHitReact &&\n\t\t\t\t\tOrb->SoActivity != Orb->SoADead &&\n\t\t\t\t\tOrb->SoActivity != Orb->SoATeleport)\n\t\t\t\t{\n\t\t\t\t\tSwitchActivity(Orb->SoARoll);\n\t\t\t\t}\n\t\t}\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoActivity::CanEscapeToMenu(FKey Key, ESoUICommand Command) const\n{\n\tif (Command != ESoUICommand::EUC_MainMenuBack)\n\t\treturn true;\n\n\t// Don't allow escape from face button\n\tif (!Orb->IsMainMenuOpened())\n\t{\n\t\tconst FName KeyName = Key.GetFName();\n\t\tif (FSoInputKey::IsGamepadFaceButton(KeyName))\n\t\t\treturn false;\n\n\t\t// Always disable main menu?\n\t\tif (WARRIORB_WITH_VIDEO_DEMO)\n\t\t\tif (USoGameSettings::Get().CanVideoDemoDisableMenu())\n\t\t\t\treturn false;\n\t}\n\n\treturn true;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoActivity::IsInMultipleGamepadCommandsWhitelist(ESoUICommand Command) const\n{\n\tstatic const TSet<ESoUICommand> WhitelistGamepadCommands = {\n\t\t// Back conflict\n\t\tESoUICommand::EUC_MainMenuBack, ESoUICommand::EUC_ActionBack,\n\n\t\t// Back conflict\n\t\tESoUICommand::EUC_MainMenuEnter,\n\n\t\t// Can have both buttons pressed\n\t\tESoUICommand::EUC_SpellSelect, ESoUICommand::EUC_SpellSelectAndCast\n\t};\n\treturn WhitelistGamepadCommands.Contains(Command);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoActivity::CanHandleUICommand(ESoUICommand Command) const\n{\n\t// Ignore duplicate UI command, can happen because some UI commands can be duplicate\n\tif (Orb && Orb->UIInputPressedCommands.Num() > 0)\n\t{\n\t\tif (Orb->DeviceType != ESoInputDeviceType::Keyboard)\n\t\t{\n\t\t\t// Gamepad, Ignore multiple UI commands (except whitelist)\n\t\t\tif (Orb->UIInputPressedCommands.Num() >= 2 && !IsInMultipleGamepadCommandsWhitelist(Command))\n\t\t\t\treturn false;\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// Keyboard, allow multiple button presses that conflict\n\t\t\tconst TSet<ESoUICommand>& ConflictingCommands = FSoInputActionName::GetUICommandsThatConflictWith(Command);\n\t\t\tif (ConflictingCommands.Num() > 0)\n\t\t\t\treturn Orb->UIInputPressedCommands.Intersect(ConflictingCommands).Num() == 0;\n\t\t}\n\t}\n\n\treturn true;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoActivity::ForwardCommandToMainMenu(ESoUICommand Command)\n{\n\t// default implementation: pass command to main menu\n\tif (USoUIMenuMain* MenuMain = Orb->GetUIMainMenu())\n\t{\n\t\tISoUIEventHandler::Execute_OnUICommand(MenuMain, Command);\n\t\treturn;\n\t}\n\n\tUE_LOG(LogSoCharActivity, Error, TEXT(\"Failed to handle UI command: improper UI setup!\"));\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoActivity::HandleUICommand(FKey Key, ESoUICommand Command)\n{\n\tUE_LOG(LogSoCharActivity, Verbose, TEXT(\"HandleUICommand Key = %s, Command = %s\"), *Key.GetFName().ToString(), *FSoInputActionName::UICommandToActionName(Command).ToString());\n\n\tif (!CanHandleUICommand(Command))\n\t\treturn;\n\n\tif (!CanEscapeToMenu(Key, Command))\n\t\treturn;\n\n\tForwardCommandToMainMenu(Command);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoActivity::UpdateCamera(float DeltaSeconds)\n{\n\t// Data from Camera Key Positions\n\tconst FSoSplinePoint& SplineLocation = Orb->SoMovement->GetSplineLocation();\n\n\tif (!SplineLocation.IsValid()) return;\n\n\tconst float Distance = SplineLocation.GetDistance();\n\tconst ASoPlayerSpline* PlayerSpline = Cast<ASoPlayerSpline>(SplineLocation.GetSpline());\n#if WITH_EDITOR\n\tif (PlayerSpline == nullptr)\n\t{\n\t\tUE_LOG(LogSoCharActivity, Error, TEXT(\"Invalid spline at ASoCharacter::UpdateCamera! Is the player on a PlayerSpline?\"));\n\t\treturn;\n\t}\n#endif\n\n\t// update camera z override\n\tif (Orb->bUseSavedCameraBoomZ && fabs(Orb->SavedCameraBoomZ - Orb->SavedCameraBoomZTarget) > KINDA_SMALL_NUMBER)\n\t{\n\t\tOrb->SavedCameraBoomZCounter = FMath::Max(Orb->SavedCameraBoomZCounter - DeltaSeconds, 0.0f);\n\t\tOrb->SavedCameraBoomZ = USoMathHelper::InterpolateSmoothStep(Orb->SavedCameraBoomZSource,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t Orb->SavedCameraBoomZTarget,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t 1.0f - Orb->SavedCameraBoomZCounter / Orb->SavedCameraBoomZBlendTime);\n\t}\n\n\t// update applied camera x delta\n\tOrb->CameraXDeltaCounter = FMath::Max(Orb->CameraXDeltaCounter - DeltaSeconds, 0.0f);\n\tOrb->CameraXDeltaCurrent = USoMathHelper::InterpolateSmoothStep(Orb->CameraXDeltaSource,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tOrb->CameraXDeltaTarget,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t1.0f - Orb->CameraXDeltaCounter / Orb->CameraXDeltaBlendTime);\n\n\n\n\tOrb->SkyControlValue = PlayerSpline->GetSkyControlPoints().GetInterpolated(SplineLocation);\n\tconst FSoCamNodeList& SplineCamData = PlayerSpline->GetCamNodeList();\n\tFSoCamKeyNode PointCamData = SplineCamData.GetInterpolatedCamData(Distance, Orb->ActiveCamKey);\n\tOrb->CameraBoom->TargetArmLength = PointCamData.ArmLength;\n\n\tif (PlayerSpline->GetRotateCameraWith180Yaw())\n\t{\n\t\tPointCamData.DeltaYaw += 180.0f;\n\t\tPointCamData.Rotation.Yaw += 180.0f;\n\t}\n\n\tOrb->bRotatedCamera = PointCamData.DeltaYaw > 90 || PointCamData.DeltaYaw < -90;\n\n\t// Z offset from movement\n\tif (Orb->SoMovement->MovementMode == EMovementMode::MOVE_Walking || Orb->SoMovement->IsFallVelocityOverriden())\n\t\tOrb->LastLandZ = Orb->GetActorLocation().Z - Orb->GetCapsuleComponent()->GetScaledCapsuleHalfHeight();\n\n\t// horizontal offset from movement\n\t// if (GetVelocity().Size2D() > KINDA_SMALL_NUMBER)\n\t{\n\t\t// int NewDir = (FVector2D(SplineLocation.GetDirection() /** SplineLocation.GetOrientation()*/) | FVector2D(GetVelocity()).GetSafeNormal()) > 0 ? 1 : -1;\n\n\t\tconst int NewDir = (FVector2D(SplineLocation.GetDirection() /** SplineLocation.GetOrientation()*/) | FVector2D(Orb->GetActorForwardVector())) > 0 ? 1 : -1;\n\n\t\t// TODO: to decide if we need instant swap or slow\n\t\tOrb->HorizontalOffset = (NewDir != Orb->MovDir) ? -Orb->HorizontalOffset\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t: FMath::FInterpTo(Orb->HorizontalOffset, PointCamData.MaxHorizontalOffset, DeltaSeconds, 1.0f);\n\n\t\tOrb->MovDir = NewDir;\n\t}\n\n\tconst float NewDist = Orb->GetActorLocation().Z - Orb->GetCapsuleComponent()->GetScaledCapsuleHalfHeight();\n\n\tconst float MaxZDistanceUpp = 10;\n\tconst float MaxZDistanceDown = -300;\n\n\tfloat NewRelativeZ = NewDist + FMath::Clamp(Orb->LastLandZ - NewDist, MaxZDistanceDown, MaxZDistanceUpp);\n\tif (Orb->bUseCamMinZValue)\n\t\tNewRelativeZ = FMath::Max(NewRelativeZ, Orb->MinCamZValue - PointCamData.Position.Z);\n\tif (Orb->bUseCamMaxZValue)\n\t\tNewRelativeZ = FMath::Min(NewRelativeZ, Orb->MaxCamZValue - PointCamData.Position.Z);\n\n\t/*if (fabs(NewRelativeZ - SavedCamRelative) > 5.f)*/\n\tOrb->SavedCamRelative = NewRelativeZ;\n\n\tconst FVector RelativeComponent = FVector(Orb->HorizontalOffset + Orb->CameraXDeltaCurrent * Orb->MovDir, 0.f, Orb->SavedCamRelative) +\n\t\t\t\t\t\t\t\t\t  PointCamData.DeltaOffset * FVector(Orb->MovDir, Orb->MovDir, 1.0f);\n\n\tOrb->CameraBoom->SetWorldLocation(PointCamData.Position);\n\tOrb->CameraBoom->SetWorldRotation(PointCamData.Rotation);\n\n\tif (Orb->bUseSavedCameraBoomZ || Orb->CameraUnfreezeCounter > 0.0f)\n\t{\n\t\tconst float LerpValue = Orb->CameraUnfreezeCounter / Orb->CameraUnfreezeTime;\n\t\tOrb->CameraBoom->AddRelativeLocation(FVector(RelativeComponent.X,\n\t\t\t\t\t\t\t\t\t\t\t\t\t RelativeComponent.Y,\n\t\t\t\t\t\t\t\t\t\t\t\t\t FMath::Lerp(RelativeComponent.Z, Orb->SavedCameraBoomZ, LerpValue)));\n\t}\n\telse\n\t{\n\t\tOrb->CameraBoom->AddRelativeLocation(RelativeComponent);\n\t\tOrb->SavedCameraBoomZ = RelativeComponent.Z;\n\t}\n\n\tif (Orb->SavedCamMovModifier == 0)\n\t\tOrb->SavedCamMovModifier = ((FVector2D(Orb->SideViewCameraComponent->GetRightVector()) | FVector2D(SplineLocation.GetDirection())) < 0) ? 1 : -1;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoActivity::UpdateCharMaterials(float DeltaSeconds)\n{\n\tbool bEnabled = false;\n\n\tconst FSoSplinePoint& SplineLocation = Orb->SoMovement->GetSplineLocation();\n\tif (const ASoPlayerSpline* PlayerSpline = Cast<ASoPlayerSpline>(SplineLocation.GetSpline()))\n\t{\n\t\tstatic const FName EmissiveName = FName(\"EmissiveStrength\");\n\n\t\t// 1. Emissive Strength\n\t\tconst float EmissiveValue = PlayerSpline->ShouldUseCharacterEmissiveStrength() ? PlayerSpline->GetCharacterEmissiveStrength() : 0.3f;\n\t\tOrb->GetMesh()->SetScalarParameterValueOnMaterials(EmissiveName, EmissiveValue);\n\n\t\t// 2. shadow post process\n#if WARRIORB_USE_CHARACTER_SHADOW\n\t\tconst FSoCharShadowNodeList& NodeList = PlayerSpline->GetCharShadowControlPoints();\n\t\tconst FSoCharShadowKeyNode ShadowNode = NodeList.GetInterpolated(SplineLocation.GetDistance(), Orb->ActiveShadowKey);\n\n\t\tif (ShadowNode.Strength > KINDA_SMALL_NUMBER)\n\t\t{\n\t\t\tbEnabled = true;\n\n\t\t\tif (!Orb->bShadowWasEnabled)\n\t\t\t{\n\t\t\t\tOrb->SoScreenCapture->Activate();\n\t\t\t\tOrb->bShadowWasEnabled = true;\n\t\t\t\tif (Orb->LevelPostProcessVolume != nullptr)\n\t\t\t\t\tOrb->LevelPostProcessVolume->Settings.WeightedBlendables.Array.Add(FWeightedBlendable(1.0f, Orb->ShadowMaterialPostProcessDynamic));\n\t\t\t}\n\n\t\t\tstatic const FName Transform0Name = FName(\"ShadowViewProjMatrix0\");\n\t\t\tstatic const FName Transform1Name = FName(\"ShadowViewProjMatrix1\");\n\t\t\tstatic const FName LightPosName = FName(\"LightPos\");\n\t\t\tstatic const FName CharPosName = FName(\"CharPos\");\n\t\t\tstatic const FName ShadowStrengthName = FName(\"Strength\");\n\n\t\t\t// https://math.stackexchange.com/questions/1150232/finding-the-unit-direction-vector-given-azimuth-and-elevation\n\n\t\t\tconst FVector DirVector = FVector(FMath::Sin(ShadowNode.Azimuth) * FMath::Cos(ShadowNode.Elevation),\n\t\t\t\t\t\t\t\t\t\t\t  FMath::Cos(ShadowNode.Azimuth) * FMath::Cos(ShadowNode.Elevation),\n\t\t\t\t\t\t\t\t\t\t\t  FMath::Sin(ShadowNode.Elevation)).GetSafeNormal();\n\t\t\tOrb->SoScreenCapture->SetWorldLocation(Orb->GetActorLocation() - DirVector * 10000);\n\t\t\tOrb->SoScreenCapture->SetWorldRotation(DirVector.Rotation());\n\n\t\t\tFLinearColor TransformRow0;\n\t\t\tFLinearColor TransformRow1;\n\t\t\tUSoMathHelper::CalculateVectorsForShadowTransform(Orb->SoScreenCapture, TransformRow0, TransformRow1);\n\n\t\t\tOrb->ShadowMaterialPostProcessDynamic->SetVectorParameterValue(Transform0Name, TransformRow0);\n\t\t\tOrb->ShadowMaterialPostProcessDynamic->SetVectorParameterValue(Transform1Name, TransformRow1);\n\n\t\t\tOrb->ShadowMaterialPostProcessDynamic->SetVectorParameterValue(LightPosName, Orb->SoScreenCapture->GetComponentLocation());\n\t\t\tOrb->ShadowMaterialPostProcessDynamic->SetVectorParameterValue(CharPosName, Orb->GetActorLocation());\n\n\t\t\tOrb->ShadowMaterialPostProcessDynamic->SetScalarParameterValue(ShadowStrengthName, ShadowNode.Strength);\n\t\t}\n#endif // WARRIORB_USE_CHARACTER_SHADOW\n\t}\n\n#if WARRIORB_USE_CHARACTER_SHADOW\n\tif (!bEnabled && Orb->bShadowWasEnabled)\n\t{\n\t\tOrb->bShadowWasEnabled = false;\n\t\tif (Orb->LevelPostProcessVolume != nullptr)\n\t\t\tOrb->LevelPostProcessVolume->Settings.WeightedBlendables.Array.Empty();\n\t\tOrb->SoScreenCapture->Deactivate();\n\t}\n#endif // WARRIORB_USE_CHARACTER_SHADOW\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoActivity::UpdateFloating()\n{\n\tconst bool bOnGround = Orb->SoMovement->IsMovingOnGround();\n\tif (Orb->bUmbrellaPressed &&\n\t\t!bOnGround &&\n\t\t!Orb->bFloatingActive &&\n\t\tOrb->GetPlayerCharacterSheet()->GetBoolValue(Orb->UmbrellaName))\n\t{\n\t\tStartFloating();\n\t}\n\telse if (Orb->bFloatingActive && (!Orb->bUmbrellaPressed || bOnGround))\n\t{\n\t\tStopFloating();\n\t}\n\n\tif (Orb->bFloatingActive)\n\t\tUpdateRollAnimDynamicValue(0.5f);\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoActivity::OnAnimEvent(EAnimEvents Event)\n{\n\tswitch (Event)\n\t{\n\t\tcase EAnimEvents::EAE_ClearRootMotion:\n\t\t\tOrb->SoMovement->ClearRootMotionDesc();\n\t\t\t// UE_LOG(LogTemp, Warning, TEXT(\"EAE_ClearRootMotion\"));\n\t\t\tbreak;\n\n\t\tcase EAnimEvents::EAE_ShowItemMesh:\n\t\t\tOrb->SoItemMesh->SetVisibility(true);\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t{\n\t\t\tconst UEnum* EnumPtr = FindObject<UEnum>(ANY_PACKAGE, TEXT(\"EAnimEvents\"), true);\n\t\t\tconst FString EnumName = EnumPtr ? EnumPtr->GetNameStringByIndex(static_cast<int32>(Event)) : \"Invalid EAnimEvents Value\";\n\t\t\tUE_LOG(LogSoCharActivity, Warning, TEXT(\"Unhandeld animation event: %s\"), *EnumName);\n\t\t}\n\t\tbreak;\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoActivity::UpdateOrientation(bool bPushedOnSpline)\n{\n\tswitch (LookDirection)\n\t{\n\t\tcase ESoLookDirection::ELD_Frozen:\n\t\t\t// update forward vector\n\t\t\tOrb->StoredForwardVector = Orb->SoMovement->GetSplineLocation().GetDirectionFromVector(Orb->StoredForwardVector);\n\t\t\tOrb->SetActorRotation(Orb->StoredForwardVector.Rotation());\n\t\t\tbreak;\n\n\t\tcase ESoLookDirection::ELD_Input:\n\t\t\tif (Orb->LastInputDirection.SizeSquared() > KINDA_SMALL_NUMBER)\n\t\t\t\tOrb->SetActorRotation(Orb->LastInputDirection.Rotation());\n\t\t\tbreak;\n\n\t\tcase ESoLookDirection::ELD_Movement:\n\n\t\t\tif (Orb->bFreezeOrientationUntilLand)\n\t\t\t{\n\t\t\t\tOrb->StoredForwardVector = Orb->SoMovement->GetSplineLocation().GetDirectionFromVector(Orb->StoredForwardVector);\n\t\t\t\tOrb->SetActorRotation(Orb->StoredForwardVector.Rotation());\n\n\t\t\t\tif (Orb->SoMovement->IsMovingOnGround())\n\t\t\t\t\tOrb->bFreezeOrientationUntilLand = false;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif (Orb->bLockForwardVecPressed)\n\t\t\t\t\tOrb->SetActorRotation(Orb->SoMovement->GetSplineLocation().GetDirectionFromVector(Orb->GetActorForwardVector()).Rotation());\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tif (bPushedOnSpline)\n\t\t\t\t\t{\n\t\t\t\t\t\tOrb->SetActorRotation(Orb->SoMovement->GetSplineLocation().GetDirectionFromVector(Orb->GetActorForwardVector()).Rotation());\n\t\t\t\t\t\t// two because worst case we need two, depends on the update order\n\t\t\t\t\t\tbWasPushedThisFrame = true;\n\t\t\t\t\t\tOrb->SoMovement->bOrientRotationToMovement = false;\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\t// normal frame update\n\t\t\t\t\t\tif (bWasPushedThisFrame)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tbWasPushedThisFrame = false;\n\t\t\t\t\t\t\tOrb->SoMovement->bOrientRotationToMovement = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tbreak;\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoActivity::IncreaseCollisionSize()\n{\n\tif (!Orb->bCollisionAlreadyDecreased)\n\t\treturn;\n\n\tOrb->bCollisionAlreadyDecreased = false;\n\n\tconst FVector MeshOffset = FVector(0, 0, Orb->DecreasedHeight - Orb->NormalHeight);\n\n\t// collision is disabled temporary so we don't trigger traps we don't actually collide when the capsule is modified\n\t// note to self: this was a terrible solution, the character ended up leaving/entering areas when the collision size was changed\n\t// I just tried to swap the AddLocalTransform and the SetCapsuleHalfHeight calls now and removed this crap, let's see if it prevents the issues\n\t// Orb->GetCapsuleComponent()->SetCollisionEnabled(ECollisionEnabled::NoCollision);\n\n\tOrb->GetMesh()->AddLocalTransform(FTransform(MeshOffset));\n\tOrb->SoNewLights->AddLocalTransform(FTransform(MeshOffset));\n\n\tOrb->GetCapsuleComponent()->AddLocalTransform(FTransform(-MeshOffset));\n\tOrb->GetCapsuleComponent()->SetCapsuleHalfHeight(Orb->NormalHeight);\n\tOrb->GetCapsuleComponent()->SetMassOverrideInKg(NAME_None, Orb->Mass);\n\n\tOrb->CapsuleBottomVFX->SetRelativeLocation(FVector(0.0f, 0.0f, -Orb->NormalHeight));\n\t// Orb->GetCapsuleComponent()->SetCollisionEnabled(ECollisionEnabled::QueryAndPhysics);\n}\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoActivity::OnPreLanded(const FHitResult& Hit)\n{\n\tOrb->StoredTimeOnJump = -1.0f;\n\n\tif (Orb->bFloatingActive)\n\t{\n\t\tStopFloating();\n\t}\n\n\tif (JumpType == ESoJumpType::EJT_Bounce || (JumpType == ESoJumpType::EJT_BounceIfPressed && Orb->bRollPressed))\n\t{\n\t\tClearCooldownInAirFlags();\n\t\treturn OnPreLandedBounce(Hit);\n\t}\n\n\tOrb->SetRollJumpLevel(0);\n\n\tAActor* HitActor = Hit.GetActor();\n\n\tif (HitActor != nullptr && (HitActor->ActorHasTag(SlipperyNegTag) || HitActor->ActorHasTag(SlipperyPosTag)))\n\t\treturn true;\n\n\t// only allow jump from land if there is enough place to increase collision, otherwise we might stuck because the character falls back\n\t// before the jump time recently variable is reset\n\tif ((Orb->bJumpPressedRecently && !Orb->bBanJumpCauseSpamming && (Orb->CanIncreaseCollision() || !Orb->bCollisionAlreadyDecreased)) ||\n\t\t(HitActor != nullptr && HitActor->ActorHasTag(TrampolineTag)))\n\t{\n\t\tOrb->SoMovement->MovementMode = EMovementMode::MOVE_Walking; // walk so we can jump\n\t\tOrb->gTimerManager->ClearTimer(Orb->JumpPressedRecentlyTimer);\n\t\tOrb->JumpPressedRecentlyTimeOver();\n\n\t\tClearCooldownInAirFlags();\n\t\tJumpPressed();\n\t\t// USoAudioManager::PlaySoundAtLocation(Orb, Orb->SFXFLegJump, Orb->GetActorTransform());\n\t\tOrb->JumpSFX->SetEvent(Orb->SFXFLegJump);\n\t\tOrb->JumpSFX->Play();\n\t\tOrb->OnLandJump.Broadcast();\n\t\tif (HitActor == nullptr || !HitActor->ActorHasTag(TrampolineTag))\n\t\t\tUGameplayStatics::SpawnEmitterAtLocation(Orb->GetWorld(), Orb->VFXBounceLarge, Hit.ImpactPoint, FRotator::ZeroRotator, true);\n\t\treturn false;\n\t}\n\treturn true;\n}\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoActivity::OnPreLandedBounce(const FHitResult& Hit)\n{\n\tAActor* HitActor = Hit.GetActor();\n\tfloat BaseActorVelocity = 0.0f;\n\tif (HitActor != nullptr)\n\t{\n\t\tif (HitActor->ActorHasTag(SlipperyNegTag) || HitActor->ActorHasTag(SlipperyPosTag))\n\t\t\treturn true;\n\n\t\tBaseActorVelocity = HitActor->GetVelocity().Z;\n\t}\n\n\t// super isn't called for a reason: SetRollJumpLevel(0); shouldn't happen here\n\tOrb->OnRollHitBP(Hit.ImpactPoint, Hit.ImpactNormal, false);\n\n\tconst float DefaultJumpBack = -Orb->SoMovement->Velocity.Z * DefaultBounceDampening;\n\n\t// maybe we jumped up with the biggest bounce jump, but then moved to a platform and didn't fall that much\n\t// big jump after that would look stupid\n\t// it is relative to base cause otherwise character could not bounce on a platform which moves up with const speed\n\twhile (Orb->ActiveRollJumpLevel > 0 && BaseActorVelocity + 10.f - Orb->SoMovement->Velocity.Z < Orb->RollJumpLevels[Orb->ActiveRollJumpLevel])\n\t\tOrb->ActiveRollJumpLevel -= 1;\n\n\t// same but in the other direction: if we just walked down a platform but then did a huge fall we should bounce up to infinity and beyond\n\twhile (Orb->ActiveRollJumpLevel < Orb->RollJumpLevels.Num() - 1 && BaseActorVelocity - 100.0f - Orb->SoMovement->Velocity.Z > Orb->RollJumpLevels[Orb->ActiveRollJumpLevel])\n\t\tOrb->ActiveRollJumpLevel += 1;\n\n\tconst bool bIncreaseJumpHight = Orb->bJumpPressedRecently && !Orb->bBanJumpCauseSpamming;\n\tOrb->bJumpPressedRecently = false;\n\n\t// UE_LOG(LogTemp, Warning, TEXT(\"Orb->ActiveRollJumpLevel before: %d\"), Orb->ActiveRollJumpLevel);\n\n\tif (!bIncreaseJumpHight)\n\t{\n\t\tOrb->LastMissedBounceTime = Orb->GetWorld()->GetTimeSeconds();\n\t\tOrb->MissedBounceLevel = FMath::Clamp(Orb->ActiveRollJumpLevel + 1, 0, Orb->RollJumpLevels.Num() - 1);\n\t\tOrb->MissedBounceLocationZ = Orb->GetActorLocation().Z;\n\t}\n\n\tfloat NewJumpVelocity = DefaultJumpBack;\n\tif (Orb->ActiveRollJumpLevel != 0 || bIncreaseJumpHight)\n\t{\n\t\tNewJumpVelocity = Orb->ModifyRollJumpLevel(bIncreaseJumpHight ? 1 : -1);\n\n\t\t// Achievement in main game: walljump and max bounce done before max bounce is explained with the tutorial decal\n\t\tif (USoPlatformHelper::IsNormalGame())\n\t\t{\n\t\t\tif (bIncreaseJumpHight && Orb->ActiveRollJumpLevel == Orb->RollJumpLevels.Num() - 1 && !Orb->SoPlayerCharacterSheet->GetBoolValue(Orb->MaxBounceDoneName))\n\t\t\t{\n\t\t\t\tOrb->SoPlayerCharacterSheet->SetBoolValue(Orb->MaxBounceDoneName, true);\n\t\t\t\tOrb->CheckSelfTrainedAchievement();\n\t\t\t}\n\t\t}\n\t}\n\n\tOrb->JumpPressedRecentlyTimeOver();\n\n\tif (DefaultJumpBack > NewJumpVelocity)\n\t{\n\t\tfloat NextLevel = Orb->ModifyRollJumpLevel(1);\n\t\twhile (NextLevel < DefaultJumpBack)\n\t\t{\n\t\t\tNextLevel = Orb->ModifyRollJumpLevel(1);\n\t\t\tif (Orb->RollJumpLevels.Num() == Orb->ActiveRollJumpLevel + 1)\n\t\t\t\tbreak;\n\t\t}\n\t\tNewJumpVelocity = DefaultJumpBack;\n\t}\n\n\t// UE_LOG(LogTemp, Warning, TEXT(\"Orb->ActiveRollJumpLevel after: %d\"), Orb->ActiveRollJumpLevel);\n\n\tconst bool bForceJumpSurface = HitActor != nullptr && HitActor->ActorHasTag(TrampolineTag);\n\n\t// check forced bounce\n\tif (bForceJumpSurface)\n\t\tNewJumpVelocity = FMath::Max(NewJumpVelocity, Orb->GetRollJumpHeight(0));\n\n\t// apply base velocity\n\tNewJumpVelocity += BaseActorVelocity;\n\n\t// UE_LOG(LogTemp, Warning, TEXT(\"NewJumpVelocity: %f\"), NewJumpVelocity);\n\tOrb->SoMovement->JumpZVelocity = NewJumpVelocity;\n\n \tif (Orb->SoMovement->JumpZVelocity - 10.f > Orb->GetRollJumpHeight(0) / 2.f)\n\t{\n\t\tconst FVector GroundLocation = Orb->GetActorLocation() - FVector(0.0f, 0.0f, Orb->GetCapsuleComponent()->GetScaledCapsuleHalfHeight());\n\t\tif (fabs(Orb->LastLandZ - GroundLocation.Z) > 10.f)\n\t\t\tOrb->LastLandZ = GroundLocation.Z;\n\n\t\tOrb->bBanJumpCauseSpamming = false;\n\t\tOrb->SoMovement->Velocity.Z = Orb->SoMovement->JumpZVelocity;\n\t\t// UE_LOG(LogTemp, Warning, TEXT(\"Orb land seconds: %f\"), Orb->GetWorld()->GetRealTimeSeconds());\n\n\t\t// Play bounce sound\n\t\tconst int32 Index = FMath::Clamp(Orb->ActiveRollJumpLevel + 1, 0, Orb->RollJumpPitches.Num() - 1);\n\t\tUSoAudioManager::PlaySoundAtLocation(Orb, Orb->GetBounceSFX(Index), Orb->GetActorTransform());\n\n\t\tif (!bForceJumpSurface)\n\t\t\tUGameplayStatics::SpawnEmitterAtLocation(Orb->GetWorld(), Orb->ActiveRollJumpLevel > 0 ? Orb->VFXBounceLarge : Orb->VFXBounceSmall,\n\t\t\t\t\t\t\t\t\t\t\t\t\t GroundLocation,\n\t\t\t\t\t\t\t\t\t\t\t\t\t FRotator::ZeroRotator,\n\t\t\t\t\t\t\t\t\t\t\t\t\t true);\n\n\t\treturn false;\n\t}\n\n\t// Play sound but also prevents spam\n\t// Delays for GetSoundTimeDelayStopSpam()\n\tconst float CurrentTime = Orb->GetWorld()->GetTimeSeconds();\n\tif (CurrentTime - PreLandedBounceGroundTimeSinceLastSoundPlayed > Orb->GetSoundTimeDelayStopSpam())\n\t{\n\t\tif (Orb->SFXBounceVariants[0] != nullptr)\n\t\t\tUSoAudioManager::PlaySoundAtLocation(Orb, Orb->GetBounceSFX(0), Orb->GetActorTransform());\n\t\tPreLandedBounceGroundTimeSinceLastSoundPlayed = CurrentTime;\n\t}\n\n\tOrb->SoMovement->JumpZVelocity = Orb->SetRollJumpLevel(0);\n\treturn true;\n}\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoActivity::OnBaseChanged(AActor* ActualMovementBase)\n{\n\tif (ActualMovementBase != nullptr)\n\t{\n\t\tconst bool bPosSlide = ActualMovementBase->ActorHasTag(SlipperyPosTag);\n\t\tconst bool bNegSlide = ActualMovementBase->ActorHasTag(SlipperyNegTag);\n\t\tif (bPosSlide || bNegSlide)\n\t\t{\n\t\t\tOrb->SoASlide->DirModifier = bPosSlide ? 1 : -1;\n\t\t\tSwitchActivity(Orb->SoASlide);\n\t\t}\n\t\t//else\n\t\t//{\n\t\t//  SEEMS like we don't need this\n\t\t//\tif (ActualMovementBase->ActorHasTag(RollOnlySurface))\n\t\t//\t\tSwitchActivity(Orb->SoARoll);\n\t\t//}\n\n\t\tif (ActualMovementBase->ActorHasTag(TriggerOnStand))\n\t\t{\n\t\t\tUSoTriggerHelper::TriggerActor(ActualMovementBase, 1);\n\t\t}\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoActivity::DecreaseHealth(const FSoDmg& Damage)\n{\n\tif (Damage.Physical < KINDA_SMALL_NUMBER && Damage.Magical < KINDA_SMALL_NUMBER)\n\t\treturn true;\n\n\tconst FSoDmg AppliedDmg = Orb->SoCharacterSheet->GetReducedDmg(Damage);\n\tUSoEnemyHelper::DisplayDamageText(Orb, AppliedDmg, Orb->GetActorLocation(), Orb->GetActorForwardVector(), false, false, true);\n\n\tOrb->SoPlayerProgress->OnHpLost(AppliedDmg);\n\treturn Orb->SoCharacterSheet->ApplyDmg(Damage);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoActivity::OnDeath()\n{\n\tconst bool bSoulKeeperActive = Orb->ResRuneVisualActor != nullptr && Orb->ResRuneVisualActor->IsActive();\n\tOrb->GetPlayerProgress()->OnDeath(bSoulKeeperActive);\n\tOrb->SoADead->SetProperties(bSoulKeeperActive);\n\tSwitchActivity(Orb->SoADead);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// Called every frame\nvoid USoActivity::Move(float Value)\n{\n\tif (Orb->bForceForwardRun)\n\t{\n\t\tValue = -1.0f;\n\t}\n\telse\n\t{\n\t\tif (Orb->MovementStopMultiplier == 0 && FMath::IsNearlyZero(Value, KINDA_SMALL_NUMBER))\n\t\t\tOrb->MovementStopMultiplier = 1;\n\n\t\tif (Orb->SavedCamMovModifier != 0)\n\t\t\tValue *= Orb->SavedCamMovModifier;\n\n\t\t// forced movement is camera independent, thus it is \"applied\" after the camera thing\n\t\tif (Orb->ForcedMovementCounter > KINDA_SMALL_NUMBER)\n\t\t\tValue = Orb->ForcedMovementValue;\n\n\t\tValue *= Orb->MovementStopMultiplier;\n\t}\n\n\tif (!FMath::IsNearlyZero(Value, KINDA_SMALL_NUMBER))\n\t{\n\t\tconst FVector MovDir = Orb->SoMovement->GetDirection();\n\t\tOrb->LastInputDirection = MovDir * Value;\n\t\tOrb->AddMovementInput(MovDir, Value);\n\t}\n}\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoActivity::StrikePressed()\n{\n\tif (Orb->SoAStrike->CanStrike(Orb->bSpecialStrikeWasRequestedLast) && CanBeInterrupted(EActivity::EA_Striking))\n\t\tSwitchActivity(Orb->SoAStrike);\n}\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoActivity::RightBtnPressed()\n{\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// Player wanna fly away - he can't\nvoid USoActivity::JumpPressed()\n{\n\t// check if swing is possible\n \tif (Orb->CouldSwing())\n\t{\n\t\tSwitchActivity(Orb->SoASwing);\n\t\treturn;\n\t}\n\n\t// Double Jump Power\n\tif (Orb->SoMovement->MovementMode == EMovementMode::MOVE_Falling &&\n\t\t!Orb->bAirJumpedSinceLastLand &&\n\t\tCanJumpFromAir() &&\n\t\tOrb->SoPlayerCharacterSheet->GetBoolValue(Orb->DoubleJumpName))\n\t{\n\t\tOrb->bAirJumpedSinceLastLand = true;\n\n\t\tfloat Value = Orb->GetMovementXAxisValue();\n\t\tif (Orb->SavedCamMovModifier != 0)\n\t\t\tValue *= Orb->SavedCamMovModifier;\n\t\tOrb->SoMovement->Velocity = Orb->SoMovement->GetDirection() * Value * MovementSpeed * 1.5;\n\t\tOrb->SoMovement->Velocity.Z = JumpZVelocity * ((fabs(Value) > KINDA_SMALL_NUMBER) ? 1.0f : 1.1f);\n\t\treturn;\n\t}\n\n\tif (Orb->bJumpPressedRecently == true)\n\t\tOrb->bBanJumpCauseSpamming = true;\n\n\n\t// Late bounce\n\t// Pressed jump right after landing\n\tconst float CurrentTime = Orb->GetWorld()->GetTimeSeconds();\n\tif (Orb->SoMovement->Velocity.Z > KINDA_SMALL_NUMBER &&\n\t\tOrb->SoMovement->IsFalling() &&\n\t\tCurrentTime - Orb->LastMissedBounceTime < Orb->GetLateBounceThreshold())\n\t{\n\t\t// only if enabled\n\t\tconst auto& GameSettings = USoGameSettings::Get();\n\t\tif ((GameSettings.GetBounceModeType() == ESoBounceModeType::Always) ||\n\t\t\t(GameSettings.GetBounceModeType() == ESoBounceModeType::OnEasy && FSoWorldState::Get().GetGameDifficulty() == ESoDifficulty::Sane))\n\t\t{\n\t\t\tOrb->SetRollJumpLevel(Orb->MissedBounceLevel);\n\t\t\tconst float DesiredOriginalVelocity = Orb->GetActiveRollJumpHeight();\n\n\t\t\tconst float TargetZ = Orb->MissedBounceLocationZ + (DesiredOriginalVelocity * DesiredOriginalVelocity) / (-2 * Orb->SoMovement->GetGravityZ());\n\t\t\tconst float DeltaZ = TargetZ - Orb->GetActorLocation().Z;\n\t\t\tconst float DesiredVelocityZ = FMath::Sqrt((-2 * Orb->SoMovement->GetGravityZ()) * DeltaZ);\n\t\t\tOrb->SoMovement->Velocity.Z = DesiredVelocityZ;\n\n\t\t\t// UE_LOG(LogTemp, Error, TEXT(\"Late BOUNCE: %f\"), DesiredVelocityZ);\n\n\t\t\tOrb->LastMissedBounceTime = -1.0f;\n\t\t\treturn;\n\t\t}\n\t}\n\n\tif (!Orb->bBanJumpCauseSpamming)\n\t{\n\t\tconst bool bShouldOffsetCharOnJump = !Orb->bCollisionAlreadyDecreased;\n\t\tif (bShouldOffsetCharOnJump)\n\t\t\tOrb->GetCharacterMovement()->JumpZVelocity = JumpZVelocity - 117.82;\n\n\t\tbool bCoyoteJump = false;\n\t\tconst float ThresholdSeconds = USoDateTimeHelper::NormalizeTime(0.15f);\n\t\tif (Orb->SoMovement->MovementMode == EMovementMode::MOVE_Falling &&\n\t\t\tOrb->SoMovement->Velocity.Z < 10.0f &&\n\t\t\tCurrentTime - Orb->LastSwitchToAirTime <= ThresholdSeconds)\n\t\t{\n\t\t\tbCoyoteJump = true;\n\t\t\tOrb->SoMovement->Velocity.Z = Orb->SoMovement->JumpZVelocity;\n\t\t\tOrb->SoMovement->SetMovementMode(MOVE_Falling);\n\t\t}\n\n\t\tif (bCoyoteJump || Orb->GetCharacterMovement()->DoJump(false)) // may or may not jump depending on the state\n\t\t{\n\t\t\tOrb->OnLandJump.Broadcast();\n\n\t\t\tif (bShouldOffsetCharOnJump)\n\t\t\t{\n\t\t\t\tOrb->DecreaseCollisionSize();\n\t\t\t\tOrb->AddActorWorldOffset(FVector(0, 0, Orb->NormalHeight - Orb->DecreasedHeight));\n\t\t\t}\n\n\t\t\tOrb->LastJumpTime = Orb->GetWorld()->GetTimeSeconds();\n\n\t\t\tconst float MovementX = Orb->GetMovementXAxisValue();\n\t\t\tif (ID != EActivity::EA_Rolling && FMath::Abs(MovementX) > KINDA_SMALL_NUMBER)\n\t\t\t{\n\t\t\t\tOrb->StoredMovementInputDirOnJump = MovementX;\n\t\t\t\tOrb->StoredTimeOnJump = Orb->LastJumpTime;\n\t\t\t}\n\n\t\t\tOnJumped();\n\t\t\t// USoAudioManager::PlaySoundAtLocation(Orb, Orb->SFXFLegJump, Orb->GetActorTransform());\n\t\t\tOrb->JumpSFX->SetEvent(Orb->SFXFLegJump);\n\t\t\tOrb->JumpSFX->Play();\n\t\t\tconst FVector GroundLocation = Orb->GetActorLocation() - FVector(0.0f, 0.0f, Orb->NormalHeight);\n\t\t\tUGameplayStatics::SpawnEmitterAtLocation(Orb->GetWorld(), Orb->VFXBounceLarge, GroundLocation, FRotator::ZeroRotator, true);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tOrb->bJumpPressedRecently = true;\n\t\t\tOrb->gTimerManager->SetTimer(\n\t\t\t\tOrb->JumpPressedRecentlyTimer,\n\t\t\t\tOrb,\n\t\t\t\t&ASoCharacter::JumpPressedRecentlyTimeOver,\n\t\t\t\tUSoDateTimeHelper::NormalizeTime(JumpPressedRecentlyTimeOffset),\n\t\t\t\tfalse\n\t\t\t);\n\t\t}\n\n\t\t// restore jump velocity\n\t\tif (bShouldOffsetCharOnJump)\n\t\t\tOrb->GetCharacterMovement()->JumpZVelocity = JumpZVelocity;\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoActivity::TakeWeaponAway()\n{\n\tif (Cast<const USoWeaponTemplate>((Orb->GetPlayerCharacterSheet()->GetEquippedItem(ESoItemSlot::EIS_Weapon0)).Template) == nullptr)\n\t\treturn;\n\n\tif (CanBeInterrupted(EActivity::EA_WeaponInArm))\n\t{\n\t\tSwitchActivity(Orb->SoAWeaponInArm);\n\t\tUSoAudioManager::PlaySoundAtLocation(this, Orb->SFXArmedStart, Orb->GetActorTransform(), true);\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// play wanna use epic ball skill\nvoid USoActivity::RollPressed()\n{\n\tif (CanBeInterrupted(EActivity::EA_Rolling))\n\t\tSwitchActivity(Orb->SoARoll);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoActivity::ToggleWeapons()\n{\n\tOrb->GetPlayerCharacterSheet()->ToggleWeapons();\n\n\tconst FSoItem& Item = Orb->GetPlayerCharacterSheet()->GetEquippedItem(ESoItemSlot::EIS_Weapon0);\n\tconst USoWeaponTemplate* WeaponTemplate = Cast<const USoWeaponTemplate>(Item.Template);\n\tif (WeaponTemplate == nullptr)\n\t\treturn;\n\n\tOrb->SelectWeapon(Item);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoActivity::ToggleItems()\n{\n\tOrb->GetPlayerCharacterSheet()->ToggleItemSlots();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoActivity::ToggleSpells(bool bQuickSelectionMode)\n{\n\t// Implemented in USoAInUI\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoActivity::UseItemFromSlot0()\n{\n\t// TODO: crossbow, is it needed?\n\tswitch (Orb->GetPlayerCharacterSheet()->GetPrimaryItemType())\n\t{\n\t\tcase ESoUsableItemType::EUIT_Crossbow:\n\t\t\tif (CanBeInterrupted(EActivity::EA_Aiming))\n\t\t\t\tSwitchActivity(Orb->SoAAiming);\n\t\t\tbreak;\n\n\t\tcase ESoUsableItemType::EUIT_Potion:\n\t\t\tif (CanBeInterrupted(EActivity::EA_ItemUsage))\n\t\t\t{\n\t\t\t\tconst FSoItem& Item = Orb->GetPlayerCharacterSheet()->GetEquippedItem(ESoItemSlot::EIS_Item0);\n\t\t\t\tUSoUsableItemTemplate* UsableTemplate = Cast<USoUsableItemTemplate>(Item.Template);\n\t\t\t\tif (UsableTemplate == nullptr)\n\t\t\t\t\treturn;\n\n\t\t\t\tUSoAudioManager::PlaySoundAtLocation(Orb, UsableTemplate->SFXOnUse, Orb->GetActorTransform());\n\t\t\t\tOrb->GetPlayerCharacterSheet()->ApplyPotionEffects(UsableTemplate);\n\t\t\t\tOrb->GetPlayerCharacterSheet()->DecreaseItemCountOnSlot(ESoItemSlot::EIS_Item0);\n\t\t\t\tOrb->GetPlayerCharacterSheet()->OnItemUsed.Broadcast();\n\t\t\t}\n\t\t\tbreak;\n\t\tcase ESoUsableItemType::EUIT_Hammer:\n\t\t\tif (!Orb->SoMovement->IsMovingOnGround())\n\t\t\t\treturn;\n\n\t\tcase ESoUsableItemType::EUIT_Throwable:\n\t\t\tif (CanBeInterrupted(EActivity::EA_ItemUsage))\n\t\t\t{\n\t\t\t\tconst FSoItem& Item = Orb->GetPlayerCharacterSheet()->GetEquippedItem(ESoItemSlot::EIS_Item0);\n\t\t\t\tconst USoUsableItemTemplate* UsableTemplate = Cast<const USoUsableItemTemplate>(Item.Template);\n\t\t\t\tif (UsableTemplate == nullptr)\n\t\t\t\t\treturn;\n\n\t\t\t\tif (Item.Amount <= 0)\n\t\t\t\t{\n\t\t\t\t\tUSoAudioManager::PlaySoundAtLocation(Orb, Orb->SFXFCanNot, Orb->GetActorTransform());\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tSwitchActivity(Orb->SoAItemUsage);\n\t\t\t\tOrb->GetPlayerCharacterSheet()->OnItemUsed.Broadcast();\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase ESoUsableItemType::EUIT_Spell:\n\t\t\tif (CanBeInterrupted(EActivity::EA_ItemUsage))\n\t\t\t{\n\t\t\t\tOrb->SoPlayerCharacterSheet->UseActiveRuneStoneIfCastable();\n\t\t\t\tOrb->GetPlayerCharacterSheet()->OnItemUsed.Broadcast();\n\t\t\t}\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tbreak;\n\t}\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoActivity::InteractKeyPressed(bool bPrimary)\n{\n\tif (!CanInteract())\n\t\treturn;\n\n\tif (Orb->Interactables.Num() == 0)\n\t\treturn;\n\n\tconst bool bFirstExclusive = ISoInteractable::Execute_IsExclusive(Orb->Interactables[0]);\n\n\tif (!bFirstExclusive && Orb->Interactables.Num() > 2)\n\t{\n\t\tif (bPrimary)\n\t\t\tOnInteract(Orb->Interactables[Orb->ActiveInteractable]);\n\t\telse\n\t\t\tOrb->SwitchActiveInteractable();\n\t}\n\telse\n\t{\n\t\tconst bool bFirstPrefersSecondKey = ISoInteractable::Execute_IsSecondKeyPrefered(Orb->Interactables[0]);\n\n\t\tif (bFirstExclusive || Orb->Interactables.Num() == 1)\n\t\t{\n\t\t\tif (bPrimary != bFirstPrefersSecondKey)\n\t\t\t{\n\t\t\t\tOnInteract(Orb->Interactables[0]);\n\t\t\t\tOrb->ActiveInteractable = 0;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tOrb->ActiveInteractable = (bPrimary != bFirstPrefersSecondKey) ? 0 : 1;\n\t\t\tOnInteract(Orb->Interactables[Orb->ActiveInteractable]);\n\t\t}\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoActivity::OnInteract(AActor* Interactable)\n{\n\t// are we sure it's something? Are we sure we can act?\n\tif (Interactable != nullptr && CanBeInterrupted())\n\t\tISoInteractable::Execute_Interact(Interactable, Orb);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoActivity::CanInteract() const\n{\n\treturn Orb->CouldSwing() ||\n\t\t(Orb->Interactables.Num() > 0 &&\n\t\t(Orb->SoMovement->IsMovingOnGround() || ISoInteractable::Execute_CanBeInteractedWithFromAir(Orb->Interactables[0])));\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoActivity::StartLeverPush(const FSoLeverData& LeverData, const FSoSplinePoint& SplinePoint, float ZValue)\n{\n\tif (CanBeInterrupted(EActivity::EA_LeverPush))\n\t{\n\t\tOrb->SoALeverPush->SetLeverData(LeverData);\n\t\tSwitchActivity(Orb->SoALeverPush);\n\t\tOrb->SetPositionOnSplineSP(SplinePoint, ZValue, true, false, LeverData.PushDirection < 0);\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoActivity::DebugFeature()\n{\n\t// overridden in cam edit!!!\n\n\tOrb->OnDebugButtonPressed();\n\n#if WITH_EDITOR\n\tif (GUnrealEd->PlayWorld)\n\t{\n\t\tconst bool bWasPaused = GUnrealEd->PlayWorld->bDebugPauseExecution;\n\t\tGUnrealEd->PlayWorld->bDebugPauseExecution = !bWasPaused;\n\t\tif (bWasPaused)\n\t\t\tGUnrealEd->PlaySessionResumed();\n\t\telse\n\t\t\tGUnrealEd->PlaySessionPaused();\n\t}\n#endif\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoActivity::OnDmgTaken(const FSoDmg& Dmg, const FSoHitReactDesc& HitReactDesc)\n{\n\t// Modify incoming DMG based on difficulty\n\tFSoDmg CorrectedDmg = Dmg;\n\tswitch (FSoWorldState::Get().GetGameDifficulty())\n\t{\n\t\tcase ESoDifficulty::Sane:\n\t\t\tCorrectedDmg *= 0.5f;\n\t\t\tbreak;\n\n\t\t// it is called Insane for a reason\n\t\tcase ESoDifficulty::Insane:\n\t\t\tCorrectedDmg *= 2.0f;\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tbreak;\n\t}\n\n\tif ((Orb->DamageBlockCounter > 0.0f || Orb->bGodMode) &&\n\t\tHitReactDesc.HitReact != ESoHitReactType::EHR_BreakIntoPieces &&\n\t\tHitReactDesc.HitReact != ESoHitReactType::EHR_FallToDeath)\n\t\treturn true;\n\n\tOrb->OnHitSuffered.Broadcast(CorrectedDmg, HitReactDesc);\n\n\tif (!Orb->SoAHitReact->Activate(HitReactDesc, (Orb->DamageBlockCounter > 0.0f || Orb->bGodMode) ? true : DecreaseHealth(CorrectedDmg)))\n\t\treturn false;\n\n\tOrb->DamageBlockCounter = HitReactDesc.HitReact != ESoHitReactType::EHR_JumpAwayLight ? Orb->DamageBlockTime : Orb->DamageBlockTimeMelee;\n\n\t// Shake something\n\tif (HitReactDesc.HitReact != ESoHitReactType::EHR_FallToDeath && HitReactDesc.HitReact != ESoHitReactType::EHR_BreakIntoPieces)\n\t{\n\t\tUSoPlatformHelper::PlayCameraShake(Orb, Orb->HitReactCamShake);\n\t\tUSoPlatformHelper::PlayForceFeedback(Orb, Orb->HitReactControllerVibration);\n\t\tOrb->PlayHitReactLightEffectBP();\n\t}\n\n\treturn true;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoActivity::OnMeleeHit(const FSoMeleeHitParam& HitParam)\n{\n\tOrb->OnMeleeHitSuffered.Broadcast(Orb, HitParam);\n\n\tconst bool bSurvived = OnDmgTaken(HitParam.Dmg, HitParam.HitReactDesc);\n\tif (bSurvived)\n\t\tOrb->DamageBlockCounter = Orb->DamageBlockTimeMelee;\n\tUSoAudioManager::PlaySoundAtLocation(Orb, bSurvived ? Orb->SFXFOnMeleeHit : Orb->SFXFOnMeleeHitDeath, FTransform(FVector(HitParam.Hit.ImpactPoint)));\n\n\treturn true;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoActivity::OnPushed(const FVector& DeltaMovement, float DeltaSeconds, bool bStuck, AActor* RematerializeLocation, int32 DamageAmountIfStuck, bool bForceDamage)\n{\n\tif (bStuck)\n\t\tOrb->SoMovement->SetPushedAndStuck(RematerializeLocation, DamageAmountIfStuck, bForceDamage);\n\n\tOrb->SoMovement->ForceUpdateFloor();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoActivity::SwitchToRelevantState(bool bArmedAllowed)\n{\n\t/** only if we are the active activity */\n\tif (Orb->SoActivity != this)\n\t\treturn;\n\n\tif (LastActivity == Orb->SoALillian || Orb->SoPlayerCharacterSheet->GetBoolValue(USoStaticHelper::GetLillianFormName()))\n\t{\n\t\tSwitchActivity(Orb->SoALillian);\n\t\treturn;\n\t}\n\n\tif (USoGameInstance* GameInstance = USoGameInstance::GetInstance(Orb))\n\t{\n\t\t// if (GameInstance->CanPlayEnterSequenceForMap(USoLevelHelper::GetMapNameFromObject(Orb)))\n\t\tif (GameInstance->ShouldStartLevelEnterSequence())\n\t\t{\n\t\t\t// Wait is used to block character movement input\n\t\t\t// input value (wait duration) is irrelevant as this action will be interrupted later, but it has to be longer\n\t\t\t// than the wait time before cutscene starts (which is usually around 4 sec iirc)\n\t\t\tOrb->SoAWait->Enter(10000.0f);\n\t\t\treturn;\n\t\t}\n\t}\n\n\tif (bArmedAllowed &&\n\t\t(LastActivity == Orb->SoAWeaponInArm || LastActivity == Orb->SoAStrike) &&\n\t\tOrb->SoPlayerCharacterSheet->HasWeaponReady())\n\t\tSwitchActivity(Orb->SoAWeaponInArm);\n\telse\n\t{\n\t\tconst bool bMovingOnGround = Orb->SoMovement->IsMovingOnGround();\n\t\tconst bool bCollisionDecreased = Orb->IsCollisionDecreased();\n\t\tif (bCollisionDecreased && bMovingOnGround && !Orb->CanIncreaseCollision())\n\t\t{\n\t\t\tSwitchActivity(Orb->SoARoll);\n\t\t\tOrb->SoARoll->LastActivity = Orb->SoADefault;\n\t\t}\n\t\telse\n\t\t\tSwitchActivity(Orb->SoADefault);\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoActivity::OnJumped()\n{\n\tOrb->SetRollJumpLevel(Orb->LegJumpLevelIndex);\n\tOrb->OnInteractionLabelChanged.Broadcast();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoActivity::OnSuperModeChange(bool bEnter)\n{\n\tif (bEnter)\n\t{\n\t\tOrb->SoMovement->SetMovementMode(EMovementMode::MOVE_None);\n\t\tOrb->GetCapsuleComponent()->SetCollisionEnabled(ECollisionEnabled::NoCollision);\n\t}\n\telse\n\t{\n\t\tOrb->SoMovement->SetMovementMode(EMovementMode::MOVE_Falling);\n\t\tOrb->GetCapsuleComponent()->SetCollisionEnabled(ECollisionEnabled::QueryAndPhysics);\n\t}\n}\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoActivity::SuperModeTick(float DeltaSeconds)\n{\n\tconst float FlyVelocity = FMath::Max(600.0f, MovementSpeed);\n\tconst float DeltaZ = DeltaSeconds * Orb->GetMovementYAxisValue() * FlyVelocity;\n\tconst float DeltaX = DeltaSeconds * Orb->GetMovementXAxisValue() * FlyVelocity * Orb->SavedCamMovModifier;\n\n\tconst float OrbZ = Orb->GetActorLocation().Z + DeltaZ;\n\tconst int32 SavedCamModifier = Orb->SavedCamMovModifier;\n\tOrb->SetPositionOnSplineSP(Orb->SoMovement->GetSplineLocation() + DeltaX, OrbZ, false, false);\n\tOrb->LastLandZ = OrbZ - Orb->GetCapsuleComponent()->GetScaledCapsuleHalfHeight();\n\tOrb->SavedCamMovModifier = SavedCamModifier;\n\tOrb->bResetSavedCamMovModifierAfterTick = false;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoActivity::SetEnabledState()\n{\n\tOrb->GetCapsuleComponent()->SetCollisionProfileName(EnabledCollisionProfileName);\n\n\tOrb->GetMesh()->SetCollisionEnabled(ECollisionEnabled::QueryAndPhysics);\n\tOrb->ShowCharacterBP(false);\n\tOrb->GetMesh()->bPauseAnims = false;\n\n\tOrb->SoMovement->SetMovementMode(MOVE_Walking);\n\n\tOrb->bJumpPressedRecently = false;\n\tOrb->bBanJumpCauseSpamming = false;\n\n\tOrb->bRollPressed = false;\n\n\tOrb->gTimerManager->ClearTimer(Orb->JumpPressedRecentlyTimer);\n\tOrb->gTimerManager->ClearTimer(Orb->LegLandRecentlyTimer);\n\n\t// Orb->bDamageImmunity = false;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoActivity::SetDisabledState()\n{\n\t// Orb->gTimerManager->ClearTimer(Orb->HitReactTimer);\n\t// Orb->bDamageImmunity = true;\n\n\tOrb->SoMovement->Velocity = FVector(0, 0, 0);\n\tOrb->SoMovement->StopActiveMovement();\n\tOrb->ActiveRollJumpLevel = 0;\n\tOrb->SoMovement->SetMovementMode(MOVE_None);\n\n\tOrb->GetCapsuleComponent()->SetCollisionProfileName(DisabledCollisionProfileName);\n\n\tOrb->GetMesh()->SetCollisionEnabled(ECollisionEnabled::NoCollision);\n\tOrb->HideCharacterBP(false);\n\tOrb->GetMesh()->bPauseAnims = true;\n\n\tOrb->Interactables.Empty();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoActivity::StartFloating()\n{\n\tOrb->bFloatingActive = true;\n\tOrb->SoFloatVFXNew->Activate(true);\n\tOrb->FloatStartSFX->Activate(true);\n\tOrb->SoMovement->SetFallVelocityOverride(true, Orb->FloatingVelocity);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoActivity::StopFloating()\n{\n\tOrb->bFloatingActive = false;\n\tOrb->SoFloatVFXNew->Deactivate();\n\tOrb->FloatStopSFX->Activate(true);\n\tOrb->SoMovement->SetFallVelocityOverride(false);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoActivity::OverrideAllMovementSpeed(float Value)\n{\n\tOrb->SoADefault->MovementSpeed = Value;\n\tOrb->SoARoll->MovementSpeed = Value;\n\tOrb->SoAWeaponInArm->MovementSpeed = Value;\n\tOrb->SoAStrike->MovementSpeed = Value;\n\tOrb->SoASlide->MovementSpeed = Value;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoActivity::ClearCooldownInAirFlags()\n{\n\tfor (FSoCooldownCounter& Cooldown : Orb->Cooldowns)\n\t\tCooldown.bAllowInAir = true;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoActivity::UpdateRollAnimDynamicValue(float SpeedMultiplier)\n{\n\tconst FVector2D Vel = FVector2D(Orb->SoMovement->Velocity);\n\tconst FVector2D Look = FVector2D(Orb->GetActorForwardVector());\n\tconst int32 Sign = FMath::Sign(Vel | Look);\n\tOrb->DynamicAnimValue = Sign * 2.f * (Orb->SoMovement->Velocity.Size2D() / Orb->SoMovement->MaxWalkSpeed) * SpeedMultiplier;\n}\n"
  },
  {
    "path": "Source/SOrb/Character/SoCharStates/SoActivity.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#pragma once\n#include \"UObject/Object.h\"\n#include \"Logging/LogMacros.h\"\n#include \"CharacterBase/SoIMortalTypes.h\"\n#include \"SoActivityTypes.h\"\n#include \"Items/SoItemTypes.h\"\n#include \"UI/General/SoUITypes.h\"\n\n#include \"SoActivity.generated.h\"\n\nstruct FHitResult;\nstruct FKey;\nclass UAnimSequenceBase;\n\nenum class ESoLookDirection : uint8\n{\n\t/** Orient rotation to movement, but can be locked via holding a button (shift?) */\n\tELD_Movement,\n\t/** Look direction is determined before the activity and it stays like that */\n\tELD_Frozen,\n\t/** Character always look to the direction the player want the character to move */\n\tELD_Input\n};\n\nenum class ESoJumpType : uint8\n{\n\tEJT_Normal,\n\tEJT_Bounce,\n\tEJT_BounceIfPressed\n};\n\nstruct FSoSplinePoint;\nclass ASoCharacter;\n\nUCLASS(BlueprintType, EditInlineNew, Abstract)\nclass SORB_API USoActivity : public UObject\n{\n\tGENERATED_BODY()\n\npublic:\n\tUSoActivity() {};\n\tUSoActivity(EActivity ActivityID) : ID(ActivityID) {};\n\n\tvoid SetOwner(ASoCharacter* Owner) { Orb = Owner; }\n\npublic:\n\n\tvirtual void PostInitProperties() override;\n\n\t// leaves the current activity (*this) and activates the new one\n\t// this is a forced thing, if the switch is cause by User input CanInterruptActivity() should be called before to check if this function should be called or not\n\tvoid SwitchActivity(USoActivity* NewActivity);\n\n\tvirtual void Tick(float DeltaSeconds);\n\n\tvirtual void UpdateCamera(float DeltaSeconds);\n\tvirtual void UpdateCharMaterials(float DeltaSeconds);\n\tvirtual void UpdateFloating();\n\n\t// events\n\tUFUNCTION(BlueprintCallable, Category = Activity)\n\tvirtual void OnAnimEvent(EAnimEvents Event);\n\n\tUFUNCTION(BlueprintCallable, Category = Collision)\n\tvirtual void IncreaseCollisionSize();\n\n\t// called with true if we are being pushed\n\t// called with false in normal frame update\n\tvoid UpdateOrientation(bool bPushedOnSpline = false);\n\n\tvirtual void OnBaseChanged(AActor* ActualMovementBase);\n\n\t// return value: true if you are still alive\n\tvirtual bool DecreaseHealth(const FSoDmg& Damage);\n\n\t// so it was false after all...\n\tvirtual void OnDeath();\n\t// who cares???\n\tvirtual void OnUmbrellaOverlap() {};\n\t// Nope!\n\tvirtual bool ShouldBounceOnHit(float& OutStepUpHitVelocity, float& OutBounceDamping, const FHitResult* HitResult) const { return false; }\n\t// return false: don't land\n\tvirtual bool OnPreLanded(const FHitResult& Hit);\n\n\t// what did I just told you?\n\tvirtual void OnBounce(bool bWallJump, float NewStoredMoveValue, const FVector& HitPoint, const FVector& HitNormal) { check(false); }\n\n\tvirtual void OnLanded() {};\n\n\t// inputs\n\t// axis updates\n\tvirtual void Move(float Value);\n\t// Attack! Or? How knows...\n\tvirtual void StrikePressed();\n\n\t// if you say left u shall say right too\n\tvirtual void RightBtnPressed();\n\t// button pressed/released\n\t// Jump!\n\tvirtual void JumpPressed();\n\n\tvirtual void SuperEditModePressed() {};\n\n\tvirtual void TakeWeaponAway();\n\tvirtual void RollPressed();\n\n\n\tvirtual void ToggleWeapons();\n\tvirtual void ToggleItems();\n\tvirtual void ToggleSpells(bool bQuickSelectionMode);\n\tvirtual void UseItemFromSlot0();\n\n\t// let's do something... with something :/\n\tvirtual void InteractKeyPressed(bool bPrimary);\n\tvirtual void OnInteract(AActor* Interactable);\n\n\tUFUNCTION(BlueprintCallable, Category = Collision)\n\tvirtual bool CanInteract() const;\n\n\tvirtual void StartLeverPush(const FSoLeverData& LeverData, const FSoSplinePoint& SplinePoint, float ZValue);\n\n\n\tvirtual void DebugFeature();\n\n\t// save/load from file\n\tvirtual void SaveEditedData() {};\n\tvirtual void LoadEditedData() {};\n\t// add/move/remove key node\n\tvirtual void CreateKey() {};\n\tvirtual void MoveClosestKeyHere() {};\n\tvirtual void DeleteActiveKeyNode() {};\n\t// modifies stuff in edit modes\n\tvirtual void SpecialEditButtonPressed(int32 Index) {};\n\n\tvirtual void CopyActiveKeyData() {};\n\tvirtual void PasteToActiveKeyData() {};\n\t// teleport the character into the KeyNode position\n\tvirtual void JumpToNextKey() {};\n\tvirtual void JumpToPrevKey() {};\n\n\tvirtual void LeftBtnPressed() {};\n\n\tvirtual bool CanPauseOnIdle() const { return true; }\n\n\n\tvirtual bool OnDmgTaken(const FSoDmg& Dmg, const FSoHitReactDesc& HitReactDesc);\n\tvirtual bool OnMeleeHit(const FSoMeleeHitParam& HitParam);\n\tvirtual void OnBlocked() {};\n\n\tvirtual void OnPushed(const FVector& DeltaMovement,\n\t\t\t\t\t\t  float DeltaSeconds,\n\t\t\t\t\t\t  bool bStuck,\n\t\t\t\t\t\t  AActor* RematerializeLocation,\n\t\t\t\t\t\t  int32 DamageAmountIfStuck,\n\t\t\t\t\t\t  bool bForceDamage);\n\n\tFORCEINLINE EActivity GetID() const { return ID; }\n\n\tFORCEINLINE bool IsArmedState() const { return bArmed; }\n\tFORCEINLINE virtual bool CanBeArmedState() const { return IsArmedState(); }\n\n\tUFUNCTION(BlueprintCallable, Category = Umbrella)\n\tFORCEINLINE float GetUmbrellaPlayRate() const { return UmbrellaPlayRate; }\n\n\n\t// called every frame, increases/decreases collision\n\t// for simple case override ShouldDecreaseCollision() if necessary\n\t// for complicated stuff override the HandleCollision function\n\tvirtual void HandleCollision();\n\n\t// if an activity requires smaller collision this function should be overriden and return true\n\t// if the characer is in the air he has smaller collision anyway\n\tvirtual bool ShouldDecreaseCollision() const;\n\n\tvirtual bool ShouldUpdateMeshFade() const { return true; }\n\n\t// returns false if the current activity isn't interruptible (by user input)\n\t// kinda weak try, used when the user wants to switch action\n\tvirtual bool CanBeInterrupted(EActivity DesiredState = EActivity::EA_Max) const { return false; }\n\n\tvirtual bool CanOpenCharacterPanels() const { return true; }\n\n\t// revive/teleport\n\tvirtual bool BlocksTeleportRequest() const { return false; }\n\tvirtual void OnTeleportRequest() {};\n\tvirtual bool IsSaveAllowed() const { return true; }\n\n\tbool IsInMultipleGamepadCommandsWhitelist(ESoUICommand Command) const;\n\tbool CanEscapeToMenu(FKey Key, ESoUICommand Command) const;\n\tbool CanHandleUICommand(ESoUICommand Command) const;\n\tvoid ForwardCommandToMainMenu(ESoUICommand Command);\n\tvirtual void HandleUICommand(FKey Key, ESoUICommand Command);\n\n\t// switch to default/armed/roll mode based bArmedAllowed, last activity, collision size and available space\n\tvoid SwitchToRelevantState(bool bArmedAllowed);\n\n\tvirtual void StartFloating();\n\tvirtual void StopFloating();\n\n\tvoid OverrideMovementSpeed(float Value) { MovementSpeed = Value; }\n\n\tUFUNCTION(BlueprintCallable)\n\tvoid OverrideAllMovementSpeed(float Value);\n\n\t// used in editor activities\n\tvoid OnSuperModeChange(bool bEnter);\n\tvoid SuperModeTick(float DeltaSeconds);\n\n\tfloat GetMovementSpeed() const { return MovementSpeed; }\n\nprotected:\n\n\tvirtual void OnEnter(USoActivity* OldActivity);\n\tvirtual void OnExit(USoActivity* NewActivity);\n\t// called on old activity once the new activity became active, can be used to force another activity switch\n\tvirtual void OnPostExit(USoActivity* NewActivity) {};\n\n\t// sometimes we have to set the roll jump level if we jump\n\tvirtual void OnJumped();\n\n\tvirtual bool CanJumpFromAir() const { return false; }\n\n\n\tbool OnPreLandedBounce(const FHitResult& Hit);\n\n\n\tvoid SetEnabledState();\n\tvoid SetDisabledState();\n\n\n\n\tvoid ClearCooldownInAirFlags();\n\n\tvoid UpdateRollAnimDynamicValue(float SpeedMultiplier = 1.0f);\n\npublic:\n\tstatic const FName TrampolineTag;\n\tstatic const FName SlipperyPosTag;\n\tstatic const FName SlipperyNegTag;\n\tstatic const FName RollOnlySurface;\n\tstatic const FName NoWallJumpSurface;\n\tstatic const FName NoBounceSurface; // wall bounce only atm\n\n\tstatic const FName TriggerOnStand; // character triggers it if it becomes base\n\n\tstatic const FName EnabledCollisionProfileName;\n\tstatic const FName DisabledCollisionProfileName;\n\nprotected:\n\n\tASoCharacter* Orb = nullptr;\n\tconst EActivity ID = EActivity::EA_Max;\n\n\tESoLookDirection LookDirection = ESoLookDirection::ELD_Movement;\n\tESoJumpType JumpType = ESoJumpType::EJT_Normal;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite)\n\tfloat MovementSpeed = 450;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite)\n\tbool bCanHaveDefaultKeyLights = true;\n\n\t/** in non-roll mode we have to calculate with 939.36 (-117.82) if the capsule is not yet decreased because of the movement */\n\tUPROPERTY(EditAnywhere)\n\tfloat JumpZVelocity = 1057.18;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadOnly)\n\tfloat DefaultBounceDampening = 0.6;\n\n\tbool bStaminaReg = true;\n\n\t// used to decide if we have to return to WeaponInArm or to Default after an interruption (e.g. HitReact)\n\t// or if we have to put away our weapons or not in OnExit()\n\tUPROPERTY(BlueprintReadOnly)\n\tbool bArmed = false;\n\n\t// used to temporary disable orientrotationtomovement\n\tbool bWasPushedThisFrame = false;\n\n\t// if umbrella is used this value has to be modified to 1.0f in child state for the \"animation\"\n\tfloat UmbrellaPlayRate = -1.0f;\n\n\t/** */\n\tUPROPERTY(BlueprintReadOnly)\n\tUSoActivity* LastActivity = nullptr;\n\n\t// Sound\n\tfloat PreLandedBounceGroundTimeSinceLastSoundPlayed = 0.f;\n};\n"
  },
  {
    "path": "Source/SOrb/Character/SoCharStates/SoActivityTypes.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#pragma once\n\n#include \"SoActivityTypes.generated.h\"\n\nclass UAnimSequenceBase;\n\n/** Basic activity of the character */\n// should be ESoActivity but... whatever\nUENUM(BlueprintType)\nenum class EActivity : uint8\n{\n\t// standing or walking on ground\n\tEA_Default\t\t\tUMETA(DisplayName = \"Default\"),\n\t// rolling - can be done both in air and in ground\n\tEA_Rolling\t\t\tUMETA(DisplayName = \"Rolling\"),\n\t// swinging on a flagpole or on something like that - hope we will be able to implement this\n\tEA_Swinging \t\tUMETA(DisplayName = \"Swinging\"),\n\t// automatic movement on slippery surfaces\n\tEA_Sliding \t\t\tUMETA(DisplayName = \"Sliding\"),\n\t// slow fall / fly in currents with umbrella\n\tEA_SkyDiving\t\tUMETA(DisplayName = \"SkyDiving\"),\n\n\t// melee weapon\n\tEA_WeaponInArm\t\tUMETA(DisplayName = \"WeaponInArm\"),\n\tEA_Striking\t\t\tUMETA(DisplayName = \"Striking\"),\n\n\t// crossbow\n\tEA_Aiming\t\t\tUMETA(DisplayName = \"Aiming\"),\n\t// shield\n\tEA_ShieldMode\t\tUMETA(DisplayName = \"ShieldMode\"),\n\n\t// I had another potion, I am sure I had one... it must be here somewhere...\n\tEA_InUI\t\t\t\tUMETA(DisplayName = \"InUI\"),\n\n\t/** let's push this rock */\n\tEA_InteractWithEnvironment\tUMETA(DisplayName = \"InteractWithEnvironment\"),\n\tEA_WaitForActivitySwitch\tUMETA(DisplayName = \"WaitForActivitySwitch\"),\n\tEA_Wait\t\t\t\t\t\tUMETA(DisplayName = \"Wait\"),\n\n\t// pull the switch!\n\tEA_LeverPush\t\tUMETA(DisplayName = \"LeverPush\"),\n\t// magic boxes\n\tEA_PickUpCarryable\tUMETA(DisplayName = \"PickUpCarryable\"),\n\tEA_DropCarryable\tUMETA(DisplayName = \"DropCarryable\"),\n\tEA_Carrying\t\t\tUMETA(DisplayName = \"Carrying\"),\n\n\t// item usage\n\tEA_ItemThrow\t\tUMETA(DisplayName = \"Throw\"),\n\tEA_ItemUsage\t\tUMETA(DisplayName = \"ItemUsage\"),\n\n\t// autch\n\tEA_HitReact\t\t\tUMETA(DisplayName = \"HitReacting\"),\n\t// autch... puff\n\tEA_Flattened\t\tUMETA(DisplayName = \"Flattened\"),\n\t// character is too busy being dead -> can't do anything\n\tEA_FallToDeath\t\tUMETA(DisplayName = \"FallToDeath\"),\n\tEA_Dead\t\t\t\tUMETA(DisplayName = \"Dead\"),\n\n\tEA_Teleport\t\t\tUMETA(DisplayName = \"Teleport\"),\n\n\tEA_Lillian\t\t\tUMETA(DisplayName = \"Lillian\"),\n\n\tEA_CameraEdit\t\tUMETA(Hidden),\n\tEA_SkyEdit\t\t\tUMETA(Hidden),\n\tEA_CharShadowEdit\tUMETA(Hidden),\n\tEA_Max\t\t\t\tUMETA(Hidden)\n};\n\n/** anim notifications */\n// this should be ESoAnimEvents :( then I would ruin all my anim notifications :/\nUENUM(BlueprintType)\nenum class EAnimEvents : uint8\n{\n\t// standing or walking on ground\n\tEAE_OnCarryStuffPicked\t\t\t\t\t\tUMETA(DisplayName = \"OnCarryStuffPicked\"),\n\tEAE_OnCarriedStuffReleased\t\t\t\t\tUMETA(DisplayName = \"OnCarriedStuffReleased\"),\n\tEAE_OnReleaseCarriedStuffInterrupted\t\tUMETA(DisplayName = \"OnReleaseCarriedStuffInterrupted\"),\n\n\tEAE_AnimFinished\t\t\t\t\t\t\tUMETA(DisplayName = \"AnimFinished\"),\n\tEAE_AnimStarted\t\t\t\t\t\t\t\tUMETA(DisplayName = \"AnimStarted\"),\n\tEAE_ClearRootMotion\t\t\t\t\t\t\tUMETA(DisplayName = \"ClearRootMotion\"),\n\tEAE_OnItemLaunched\t\t\t\t\t\t\tUMETA(DisplayName = \"ItemLaunched\"),\n\tEAE_ShowItemMesh\t\t\t\t\t\t\tUMETA(DisplayName = \"ShowItemMesh\")\n};\n\n\n// Lever: value goes from 0.0f until 1.0f\n// starting value and speed are defined by lever\nUSTRUCT(BlueprintType)\nstruct FSoLeverData\n{\n\tGENERATED_USTRUCT_BODY()\npublic:\n\t\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite)\n\tfloat ActualValue;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite)\n\tfloat TargetValue;\n\t\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite)\n\tfloat Speed;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite)\n\tint32 PushDirection;\n\t\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite)\n\tUAnimSequenceBase* Animation = nullptr;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite)\n\tfloat ScaledAnimDuration;\n\t\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite)\n\tbool bForcePull;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite)\n\tfloat WaitAfterLeverPull;\n};\n"
  },
  {
    "path": "Source/SOrb/Character/SoCharacter.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#include \"SoCharacter.h\"\n\n#include \"EngineGlobals.h\"\n#include \"EngineMinimal.h\" // ANY_PACKAGE enum search\n#include \"GameFramework/SpringArmComponent.h\"\n#include \"Camera/CameraComponent.h\"\n#include \"Components/SkeletalMeshComponent.h\"\n#include \"Components/CapsuleComponent.h\"\n#include \"Engine/StaticMeshActor.h\"\n#include \"Curves/CurveFloat.h\"\n#if WITH_EDITOR\n#include \"Editor/UnrealEdEngine.h\"\n#endif // WITH_EDITOR\n#include \"Components/SceneCaptureComponent2D.h\"\n#include \"Engine/PostProcessVolume.h\"\n\n#include \"DestructibleActor.h\"\n#include \"DestructibleComponent.h\"\n\n#include \"FMODEvent.h\"\n#include \"Levels/SoLevelManager.h\"\n#include \"Basic/Helpers/SoMathHelper.h\"\n#include \"Basic/Helpers/SoStaticHelper.h\"\n#include \"Basic/SoGameInstance.h\"\n#include \"Basic/SoAudioManager.h\"\n#include \"Settings/SoGameSettings.h\"\n#include \"Settings/Input/SoInputNames.h\"\n#include \"SaveFiles/SoWorldState.h\"\n\n#include \"Online/Achievements/SoAchievementManager.h\"\n\n#include \"Online/Analytics/SoAnalyticsComponent.h\"\n#include \"SoPlayerCharacterSheet.h\"\n#include \"CharacterBase/SoCharacterMovementComponent.h\"\n#include \"SoPlayerProgress.h\"\n#include \"Items/SoInventoryComponent.h\"\n\n#include \"SoCharStates/SoActivity.h\"\n#include \"SoCharStates/SoADead.h\"\n// #include \"SoCharStates/SoAFallToDeath.h\"\n#include \"SoCharStates/SoAHitReact.h\"\n#include \"SoCharStates/SoAAiming.h\"\n#include \"SoCharStates/SoASlide.h\"\n#include \"SoCharStates/SoASwing.h\"\n#include \"SoCharStates/SoADefault.h\"\n#include \"SoCharStates/SoALillian.h\"\n#include \"SoCharStates/SoARoll.h\"\n#include \"SoCharStates/SoALeverPush.h\"\n#include \"SoCharStates/SoACarry.h\"\n#include \"SoCharStates/SoAWeaponInArm.h\"\n#include \"SoCharStates/SoAStrike.h\"\n#include \"SoCharStates/SoAItemUsage.h\"\n#include \"SoCharStates/SoAInteractWithEnvironment.h\"\n#include \"SoCharStates/SoAWait.h\"\n#include \"SoCharStates/SoAWaitForActivitySwitch.h\"\n#include \"SoCharStates/SoAInUI.h\"\n#include \"SoCharStates/SoATeleport.h\"\n#include \"SoCharStates/SoACameraEdit.h\"\n#include \"SoCharStates/SoASkyControlEdit.h\"\n#include \"SoCharStates/SoACharShadowEdit.h\"\n\n#include \"SplineLogic/SoPlayerSpline.h\"\n#include \"SplineLogic/SoSplineHelper.h\"\n#include \"SplineLogic/SoSplinePointPtr.h\"\n#include \"SplineLogic/SoMarker.h\"\n#include \"SplineLogic/SoLocationRegistry.h\"\n\n#include \"Interactables/SoInteractable.h\"\n#include \"Interactables/SoCarryable.h\"\n#include \"Objects/SoSwingCenter.h\"\n#include \"SoSpringArmComponent.h\"\n#include \"Basic/SoGameMode.h\"\n#include \"SoWizard.h\"\n#include \"SoBounceSFXOverrideBox.h\"\n#include \"Projectiles/SoProjectileSpawnerComponent.h\"\n\n#include \"UI/General/SoUITypes.h\"\n#include \"UI/SoUISystem.h\"\n#include \"UI/Menu/SoUIMenuMain.h\"\n\n#include \"SoPlayerController.h\"\n#include \"Basic/SoGameSingleton.h\"\n#include \"Levels/SoLevelHelper.h\"\n#include \"Items/ItemTemplates/SoWeaponTemplate.h\"\n\n#include \"SoLocalization.h\"\n#include \"Basic/Helpers/SoDateTimeHelper.h\"\n\nDEFINE_LOG_CATEGORY_STATIC(LogSoChar, All, All);\n\nbool ASoCharacter::bEnableQuickSaveLoad = false;\nconst FName ASoCharacter::SpellcasterCapacityName = TEXT(\"SpellcasterCapacity\");\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// Sets default values\nASoCharacter::ASoCharacter(const FObjectInitializer& ObjectInitializer) :\n\tSuper(ObjectInitializer.SetDefaultSubobjectClass<USoPlayerCharacterSheet>(CharacterSheetName))\n{\n \t// Set this character to call Tick() every frame.  You can turn this off to improve performance if you don't need it.\n\tPrimaryActorTick.bCanEverTick = true;\n\n\tLillianMesh = CreateDefaultSubobject<USkeletalMeshComponent>(TEXT(\"SoLillianMesh\"));\n\tLillianMesh->SetupAttachment(GetRootComponent());\n\n\tWeatherVFX = CreateDefaultSubobject<UParticleSystemComponent>(TEXT(\"SoWeatherVFX\"));\n\tWeatherVFX->bAbsoluteRotation = true;\n\tWeatherVFX->SetupAttachment(GetRootComponent());\n\n\tCapsuleBottomVFX = CreateDefaultSubobject<UParticleSystemComponent>(TEXT(\"SoCapsuleBottomVFX\"));\n\tCapsuleBottomVFX->SetupAttachment(GetRootComponent());\n\n\tProjectileSpawner->SetSpawnProjectileOnSpline(true);\n\tProjectileSpawner->SetupAttachment(GetMesh());\n\n\n\tSoSword = CreateDefaultSubobject<UStaticMeshComponent>(TEXT(\"SoSword\"));\n\tSoSword->SetVisibility(false);\n\tSoSword->SetCollisionEnabled(ECollisionEnabled::NoCollision);\n\n\tSoOffHandWeapon = CreateDefaultSubobject<UStaticMeshComponent>(TEXT(\"SoOffHandWeapon\"));\n\tSoOffHandWeapon->SetVisibility(false);\n\tSoOffHandWeapon->SetCollisionEnabled(ECollisionEnabled::NoCollision);\n\n\tSoSwordFX = CreateDefaultSubobject<UParticleSystemComponent>(TEXT(\"SoSwordFX\"));\n\tSoSwordFX->SetVisibility(false);\n\tSoSwordFX->SetupAttachment(SoSword);\n\n\tSoOffHandWeaponFX = CreateDefaultSubobject<UParticleSystemComponent>(TEXT(\"SoOffHandWeaponFX\"));\n\tSoOffHandWeaponFX->SetVisibility(false);\n\tSoOffHandWeaponFX->SetupAttachment(SoOffHandWeapon);\n\n\n\tSoItemMesh = CreateDefaultSubobject<UStaticMeshComponent>(TEXT(\"SoItemMesh\"));\n\tSoItemMesh->SetVisibility(false);\n\n\tSoInventory = CreateDefaultSubobject<USoInventoryComponent>(TEXT(\"SoInventory\"));\n\n\tSoPlayerCharacterSheet = Cast<USoPlayerCharacterSheet>(SoCharacterSheet);\n\tSoPlayerProgress = CreateDefaultSubobject<USoPlayerProgress>(TEXT(\"SoPlayerProgress\"));\n\tSoAnalytics = CreateDefaultSubobject<USoAnalyticsComponent>(TEXT(\"SoAnalytics\"));\n\n\t// Create a camera boom attached to the root (capsule)\n\tCameraBoom = CreateDefaultSubobject<USoSpringArmComponent>(TEXT(\"CameraBoom\"));\n\tCameraBoom->SetupAttachment(RootComponent);\n\t// CameraBoom->bAbsoluteRotation = true;\n\tCameraBoom->bDoCollisionTest = false;\n\tCameraBoom->TargetArmLength = 500.f;\n\tCameraBoom->SocketOffset = FVector(0.f, 0.f, 75.f);\n\t// CameraBoom->RelativeRotation = FRotator(0.f, 180.f, 0.f);\n\tCameraBoom->bUsePawnControlRotation = false;\n\tCameraBoom->bEnableCameraLag = true;\n\n\t// Create a camera and attach to boom\n\tSideViewCameraComponent = CreateDefaultSubobject<UCameraComponent>(TEXT(\"SideViewCamera\"));\n\tSideViewCameraComponent->SetupAttachment(CameraBoom, USpringArmComponent::SocketName);\n\tSideViewCameraComponent->bUsePawnControlRotation = false;\n\n\tSoMovement->RotationRate = FRotator(0.0f, 9720.0f, 0.0f); // ...at this rotation rate\n\tSoMovement->GravityScale = 2.f;\n\tSoMovement->AirControl = 0.80f;\n\tSoMovement->GroundFriction = 3.f;\n\n\tSoMovement->MaxFlySpeed = 600.f;\n\n\t// Don't rotate when the controller rotates.\n\tbUseControllerRotationPitch = false;\n\tbUseControllerRotationYaw = false;\n\tbUseControllerRotationRoll = false;\n\n\tbCollisionAlreadyDecreased = false;\n\n#define CREATE_ACTIVITY(Var) Var = CreateDefaultSubobject<U##Var>(#Var);\n\tCREATE_ACTIVITY(SoARoll)\n\tCREATE_ACTIVITY(SoADead)\n\tCREATE_ACTIVITY(SoAHitReact)\n\tCREATE_ACTIVITY(SoADefault)\n\tCREATE_ACTIVITY(SoALillian)\n\tCREATE_ACTIVITY(SoASlide)\n\tCREATE_ACTIVITY(SoASwing)\n\tCREATE_ACTIVITY(SoALeverPush)\n\tCREATE_ACTIVITY(SoACarry)\n\t// CREATE_ACTIVITY(SoACarryPickUp)\n\tCREATE_ACTIVITY(SoACarryDrop)\n\tCREATE_ACTIVITY(SoAAiming)\n\tCREATE_ACTIVITY(SoAWeaponInArm)\n\tCREATE_ACTIVITY(SoAStrike)\n\tCREATE_ACTIVITY(SoAItemUsage)\n\tCREATE_ACTIVITY(SoAInteractWithEnvironment);\n\tCREATE_ACTIVITY(SoASoAWaitForActivitySwitch);\n\tCREATE_ACTIVITY(SoAWait);\n\tCREATE_ACTIVITY(SoAInUI)\n\tCREATE_ACTIVITY(SoATeleport)\n\tCREATE_ACTIVITY(SoACameraEdit)\n\tCREATE_ACTIVITY(SoASkyControlEdit)\n\tCREATE_ACTIVITY(SoACharShadowEdit)\n#undef CREATE_ACTIVITY\n\n\n\tSoCenterNew = CreateDefaultSubobject<USceneComponent>(TEXT(\"SoCenterNew\"));\n\tSoCenterNew->bAbsoluteRotation = true;\n\tSoCenterNew->bAbsoluteScale = true;\n\tSoCenterNew->SetupAttachment(GetMesh(), FName(\"Body\"));\n\n\tSoFloatVFXNew = CreateDefaultSubobject<UParticleSystemComponent>(TEXT(\"SoFloatVFXNew\"));\n\tSoFloatVFXNew->bAbsoluteScale = true;\n\tSoFloatVFXNew->SetupAttachment(GetMesh(), FName(\"Body\"));\n\n\tSoQuickTeleportPre = CreateDefaultSubobject<UParticleSystemComponent>(TEXT(\"SoQuickTeleportPre\"));\n\tSoQuickTeleportPre->bAbsoluteScale = true;\n\tSoQuickTeleportPre->SetupAttachment(GetMesh(), FName(\"Body\"));\n\tSoQuickTeleportPre->bAutoActivate = false;\n\n\tSoBreak = CreateDefaultSubobject<UParticleSystemComponent>(TEXT(\"SoBreak\"));\n\tSoBreak->bAbsoluteScale = true;\n\tSoBreak->SetupAttachment(GetMesh(), FName(\"Body\"));\n\tSoBreak->bAutoActivate = false;\n\n\tSoQuickTeleportPost = CreateDefaultSubobject<UParticleSystemComponent>(TEXT(\"SoQuickTeleportPost\"));\n\tSoQuickTeleportPost->bAbsoluteScale = true;\n\tSoQuickTeleportPost->SetupAttachment(GetMesh(), FName(\"Body\"));\n\tSoQuickTeleportPost->bAutoActivate = false;\n\n\tSoResVFX = CreateDefaultSubobject<UParticleSystemComponent>(TEXT(\"SoResVFX\"));\n\tSoResVFX->SetupAttachment(SoCenterNew);\n\tSoResVFX->bAutoActivate = false;\n\n\tSoResCPVFX = CreateDefaultSubobject<UParticleSystemComponent>(TEXT(\"SoResCPVFX\"));\n\tSoResCPVFX->SetupAttachment(SoCenterNew);\n\tSoResCPVFX->bAutoActivate = false;\n\n\tSoNewSmoke = CreateDefaultSubobject<UParticleSystemComponent>(TEXT(\"SoNewSmoke\"));\n\tSoNewSmoke->SetupAttachment(SoCenterNew);\n\n\tSoNewLights = CreateDefaultSubobject<UParticleSystemComponent>(TEXT(\"SoNewLights\"));\n\tSoNewLights->SetupAttachment(GetRootComponent());\n\n\tSoGlowSphere = CreateDefaultSubobject<UStaticMeshComponent>(TEXT(\"SoGlowSphere\"));\n\tSoGlowSphere->SetupAttachment(SoCenterNew);\n\tSoGlowSphere->SetCollisionEnabled(ECollisionEnabled::NoCollision);\n\n\n\tSoResSFX = CreateDefaultSubobject<UFMODAudioComponent>(TEXT(\"SoResSFX\"));\n\tSoResSFX->SetupAttachment(SoCenterNew);\n\tSoResSFX->bAutoActivate = false;\n\n\tSoResCPSFX = CreateDefaultSubobject<UFMODAudioComponent>(TEXT(\"SoResCPSFX\"));\n\tSoResCPSFX->SetupAttachment(SoCenterNew);\n\tSoResCPSFX->bAutoActivate = false;\n\n\tSlideSFX = CreateDefaultSubobject<UFMODAudioComponent>(TEXT(\"SlideSFX\"));\n\tSlideSFX->SetupAttachment(GetRootComponent());\n\tSlideSFX->bAutoActivate = false;\n\n\tJumpSFX = CreateDefaultSubobject<UFMODAudioComponent>(TEXT(\"JumpSFX\"));\n\tJumpSFX->SetupAttachment(SoCenterNew);\n\tJumpSFX->bAutoActivate = false;\n\n\n\tRollSFX = CreateDefaultSubobject<UFMODAudioComponent>(TEXT(\"RollSFX\"));\n\tRollSFX->SetupAttachment(GetRootComponent());\n\tRollSFX->bAutoActivate = false;\n\n\tFloatStartSFX = CreateDefaultSubobject<UFMODAudioComponent>(TEXT(\"FloatStartSFX\"));\n\tFloatStartSFX->SetupAttachment(GetRootComponent());\n\tFloatStartSFX->bAutoActivate = false;\n\n\tFloatStopSFX = CreateDefaultSubobject<UFMODAudioComponent>(TEXT(\"FloatStopSFX\"));\n\tFloatStopSFX->SetupAttachment(GetRootComponent());\n\tFloatStopSFX->bAutoActivate = false;\n\n\n\tDialogueData.PositionIndex = 1;\n\tDialogueData.ParticipantName = TEXT(\"Warriorb\");\n\tDialogueData.ParticipantDisplayName = FROM_STRING_TABLE_DIALOGUE(\"char_name_warriorb\");\n\tDialogueData.TextBoxY = -524;\n\tDialogueData.FloorPosition = FVector2D(220.0f, -500.0f);\n\tDialogueData.FadeInAnimName = TEXT(\"Char_Arrive\");\n\tDialogueData.FadeOutAnimName = TEXT(\"Char_Leave\");\n\n//#if WARRIORB_USE_CHARACTER_SHADOW\n\tSoScreenCapture = CreateDefaultSubobject<USceneCaptureComponent2D>(TEXT(\"SoScreenCapture\"));\n\tSoScreenCapture->SetupAttachment(GetRootComponent());\n//#endif // WARRIORB_USE_CHARACTER_SHADOW\n\n\tWeaponProjectileSpawner = CreateDefaultSubobject<USoProjectileSpawnerComponent>(TEXT(\"SoWeaponProjectileSpawner\"));\n\tWeaponProjectileSpawner->SetupAttachment(RootComponent);\n\n\tSFXBounceVariants.SetNum(5);\n\tRollJumpPitches.SetNum(5);\n\n#if WITH_EDITOR\n\tbEnableQuickSaveLoad = true;\n#endif\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoCharacter::PreInitializeComponents()\n{\n\tSoActivity = SoADefault;\n\tSoMovement->bOrientRotationToMovement = true;\n\tSoMovement->JumpZVelocity = SoADefault->JumpZVelocity;\n\tSoMovement->MaxWalkSpeed = SoADefault->MovementSpeed;\n\n\tSuper::PreInitializeComponents();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoCharacter::PostInitializeComponents()\n{\n\tSuper::PostInitializeComponents();\n\n\tLillianMesh->SetVisibility(false);\n\tLillianMesh->SetComponentTickEnabled(false);\n\tLillianMesh->bNoSkeletonUpdate = true;\n\n\tSoSword->AttachToComponent(GetMesh(), FAttachmentTransformRules::SnapToTargetNotIncludingScale, FName(\"Weapon_R\"));\n\tSoSword->SetRelativeRotation(WeaponLocalRot);\n\n\tSoOffHandWeapon->AttachToComponent(GetMesh(), FAttachmentTransformRules::SnapToTargetNotIncludingScale, FName(\"Weapon_L\"));\n\tSoOffHandWeapon->SetRelativeRotation(WeaponLocalRot);\n\n\tSelectWeapon(SoPlayerCharacterSheet->GetEquippedItem(ESoItemSlot::EIS_Weapon0));\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// Called when the game starts or when spawned\nvoid ASoCharacter::BeginPlay()\n{\n\tGameInstance = USoGameInstance::GetInstance(this);\n\tconst bool bIsInMenuLevel = GameInstance->IsMenu();\n\n\tCurrentGlowSphereColor = GlowSphereColorDefault;\n\tCurrentSmokeColor = SmokeColorDefault;\n\n#if WARRIORB_USE_CHARACTER_SHADOW\n\t// Setup fake shadow\n\tif (!bIsInMenuLevel && ShadowMaterialPostProcessDynamic == nullptr)\n\t{\n\t\tensure(ShadowMaterialPostProcess);\n\t\tShadowMaterialPostProcessDynamic = UMaterialInstanceDynamic::Create(ShadowMaterialPostProcess, this);\n\n\t\tTArray<AActor*> ActorArray;\n\t\tUGameplayStatics::GetAllActorsOfClass(this, APostProcessVolume::StaticClass(), ActorArray);\n\n\t\tAActor* PostProcessActor = ActorArray.Num() > 0 ? ActorArray[0] : nullptr;\n\t\tif (PostProcessActor == nullptr)\n\t\t{\n\t\t\tUE_LOG(LogSoChar, Error, TEXT(\"Failed to setup shadow post process material: the level should contain exactly one post process volume!\"))\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// Manually start begin play on actor\n\t\t\tif (!PostProcessActor->HasActorBegunPlay())\n\t\t\t{\n\t\t\t\tPostProcessActor->DispatchBeginPlay();\n\t\t\t}\n\t\t\tLevelPostProcessVolume = Cast<APostProcessVolume>(ActorArray[0]);\n\t\t}\n\t}\n\tSoScreenCapture->ShowOnlyActors = { this };\n#endif // WARRIORB_USE_CHARACTER_SHADOW\n\tSoScreenCapture->Deactivate();\n\n\tSoWizard = NewObject<USoWizard>(this, WizardClass);\n\tSoWizard->Initialize(this);\n\n\tGetCapsuleComponent()->SetMassOverrideInKg(NAME_None, Mass);\n\n\tSuper::BeginPlay();\n\n\tgTimerManager = &GetWorld()->GetTimerManager();\n\t// for idle detection\n\tSavedPosition = GetActorLocation();\n\n\tAddTickPrerequisiteComponent(SoMovement);\n\tCameraBoom->AddTickPrerequisiteActor(this);\n\tSideViewCameraComponent->AddTickPrerequisiteComponent(CameraBoom);\n\n\n\tGetMesh()->AddTickPrerequisiteActor(this);\n\tGetMesh()->AddTickPrerequisiteComponent(SideViewCameraComponent);\n\n\n\tSoPlayerCharacterSheet->RecalculateStats();\n\tSoPlayerCharacterSheet->RestoreHealth();\n\n\t// created in blueprint's begin play\n\tif (ResRuneVisualActor)\n\t{\n\t\tResRuneVisualActor->Deactivate();\n\t\tResRuneVisualActor->SetActorHiddenInGame(true);\n\t}\n\n#if WARRIORB_WITH_EDITOR\n\t// Location is the closest spline in editor\n\tif (SoMovement->GetSplineLocation().GetSpline() == nullptr)\n\t{\n\t\tFSoSplinePointPtr LocationPtr;\n\t\tUSoSplineHelper::UpdateSplineLocationRef(this, LocationPtr, true, false, true);\n\t\tFSoSplinePoint Location = LocationPtr.Extract();\n\t\tLocation.SetReferenceActor(this);\n\t\tSoMovement->SetSplineLocation(Location);\n\t\tActiveCheckPointLocation = Location;\n\t\tActiveCheckpointZLocation = GetActorLocation().Z;\n\t\tOnSplineChanged({}, Location);\n\t}\n\n\tif (SoMovement->GetSplineLocation().GetSpline() == nullptr)\n\t\tUE_LOG(LogSoChar, Error, TEXT(\"Failed to place Character to the closest spline in the Editor\"));\n\n\t// In editor game is already started\n\tGameInstance->SetGameStarted(true);\n\n\tSoMovement->Velocity.Z = 1000;\n\tSoMovement->SetMovementMode(EMovementMode::MOVE_Falling);\n#else\n\n\t// Load first so that the menu has the right state\n\t// FSoWorldState::Get().LoadGame();\n\n\t// Pause the game and open the menu in non editor builds by default\n\t// EDIT: menu is not paused anymore\n\t//bool bPausedGame = false;\n\t//if (GameInstance)\n\t//\tbPausedGame = GameInstance->PauseGame(true, true);\n\t//\n\t//if (!bPausedGame)\n\t//\tUE_LOG(LogSoChar, Error, TEXT(\"Failed to pause game. Improper UI setup?\"));\n#endif // WARRIORB_WITH_EDITOR\n\n\t// Handle main menu\n\tif (bIsInMenuLevel)\n\t{\n\t\tGameInstance->OpenMenuInstant();\n\t\tGameInstance->SetGameStarted(false);\n\t}\n\n\t// Teleport to the active checkpoint name, initial value is from\n\tif (!WARRIORB_WITH_EDITOR || bIsInMenuLevel)\n\t{\n\t\tTeleportToActiveCheckpointName();\n\t}\n\n\t// Start music and VFX on Spline\n\tif (const ASoPlayerSpline* PlayerSpline = Cast<ASoPlayerSpline>(SoMovement->GetSplineLocation().GetSpline()))\n\t{\n\t\tUpdateMusic(true);\n\n\t\tUParticleSystem* NewTemplate = nullptr;\n\t\tif (PlayerSpline->GetLevelClaims().Num() > 0)\n\t\t\tNewTemplate = USoLevelHelper::GetWeatherVFXForLevel(PlayerSpline->GetLevelClaims()[0].LevelName);\n\n\t\tWeatherVFX->SetTemplate(NewTemplate);\n\t\tOnSplineChanged({}, SoMovement->GetSplineLocation());\n\t}\n\n\tSoADefault->UpdateCamera(0.1f);\n\tCameraBoom->ForceUpdate();\n\n\t// Subscribe to device changed\n\tif (ASoPlayerController* SoController = GetSoPlayerController())\n\t{\n\t\tSoController->OnDeviceTypeChanged().AddDynamic(this, &Self::HandleDeviceTypeChanged);\n\t\tDeviceType = SoController->GetCurrentDeviceType();\n\t}\n\n\tCapsuleBottomVFX->SetRelativeLocation(FVector(0.0f, 0.0f, -NormalHeight));\n\tCapsuleBottomVFX->Deactivate();\n\n\tLastAutoSaveTime = 0.0f;\n\n\tif (MusicOverride == nullptr)\n\t\tUpdateMusic(true);\n\n\tif (USoGameSettings* GameSettings = USoGameSettings::GetInstance())\n\t\tUSoGameSettings::Get().OnCharacterSkinChanged.AddDynamic(this, &ASoCharacter::UpdateCharacterSkin);\n\n\tUpdateCharacterSkin();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoCharacter::EndPlay(const EEndPlayReason::Type EndPlayReason)\n{\n\tif (ASoPlayerController* SoController = GetSoPlayerController())\n\t\tSoController->OnDeviceTypeChanged().RemoveDynamic(this, &Self::HandleDeviceTypeChanged);\n\n\tif (USoGameSettings* GameSettings = USoGameSettings::GetInstance())\n\t\tGameSettings->OnCharacterSkinChanged.RemoveDynamic(this, &ASoCharacter::UpdateCharacterSkin);\n\n\tSuper::EndPlay(EndPlayReason);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoCharacter::UpdateCharacterSkin()\n{\n\tUpdateCharacterSkinBP();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// Called every frame\nvoid ASoCharacter::Tick(float DeltaSeconds)\n{\n\tDECLARE_SCOPE_CYCLE_COUNTER(TEXT(\"Tick\"), STAT_Tick, STATGROUP_SoCharacter);\n\n\tconst float OldDamageBlockCounter = DamageBlockCounter;\n\tDamageBlockCounter = FMath::Max(DamageBlockCounter - DeltaSeconds, -1.0f);\n\tif (OldDamageBlockCounter > 0.0f && DamageBlockCounter <= 0.0f)\n\t\tOnDamageImmunityOver.Broadcast();\n\n\tbSavedCameraBoomZUpdateBlock = false;\n\n\tif (!bUseSavedCameraBoomZ && CameraUnfreezeCounter >= 0.0f)\n\t\tCameraUnfreezeCounter -= DeltaSeconds;\n\n\tForcedMovementCounter = FMath::Max(ForcedMovementCounter - DeltaSeconds, -1.0f);\n\n\t// NOTE: Must be fore activity\n\t// Open spell cast switch\n\tstatic constexpr float DeltaSimilar = 0.001;\n\tif (IsUsingRightThumbStick())\n\t{\n\t\tif (FMath::IsNearlyEqual(PreviousGamepadRightX, GamepadRightX, DeltaSimilar)\n\t\t\t&& FMath::IsNearlyEqual(PreviousGamepadRightY, GamepadRightY, DeltaSimilar))\n\t\t{\n\t\t\tRightThumbstickSameValueFrames++;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tRightThumbstickSameValueFrames = 0;\n\t\t}\n\n\t\t// Apply some delay, so that we don't open the menu spell menu accidentally\n\t\tif (SoAInUI->IsSpellCastSwitchOpen())\n\t\t{\n\t\t\tTickQuickSelectionSum = 0.f;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tTickQuickSelectionSum += DeltaSeconds;\n\t\t\tif (TickQuickSelectionSum > ThresholdOpenQuickSelection)\n\t\t\t{\n\t\t\t\tTickQuickSelectionSum = 0.f;\n\t\t\t\tToggleSpells(true);\n\t\t\t}\n\t\t}\n\n\t\tPreviousGamepadRightX = GamepadRightX;\n\t\tPreviousGamepadRightY = GamepadRightY;\n\n\t\t// UE_LOG(LogTemp, Warning, TEXT(\"Right: X = %f, Y = %f, Angle = %f, RightThumbstickSameValueFrames = %d\"),\n\t\t\t// GamepadRightX, GamepadRightY, GetGamepadRightDirectionDegrees(), RightThumbstickSameValueFrames);\n\t}\n\telse\n\t{\n\t\tTickQuickSelectionSum = 0.f;\n\t\tRightThumbstickSameValueFrames = 0;\n\t}\n\n\tif (IsUsingLeftThumbStick())\n\t{\n\t\tif (FMath::IsNearlyEqual(PreviousGamepadLeftX, GamepadLeftX, DeltaSimilar)\n\t\t\t&& FMath::IsNearlyEqual(PreviousGamepadLeftY, GamepadLeftY, DeltaSimilar))\n\t\t{\n\t\t\tLeftThumbstickSameValueFrames++;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tLeftThumbstickSameValueFrames = 0;\n\t\t}\n\n\t\tPreviousGamepadLeftX = GamepadLeftX;\n\t\tPreviousGamepadLeftY = GamepadLeftY;\n\n\t\t// UE_LOG(LogTemp, Warning, TEXT(\"Left: X = %f, Y = %f, Angle = %f, LeftThumbstickSameValueFrames = %d\"),\n\t\t\t// GamepadLeftX, GamepadLeftY, GetGamepadLeftDirectionDegrees(), LeftThumbstickSameValueFrames);\n\t}\n\telse\n\t{\n\t\tLeftThumbstickSameValueFrames = 0;\n\t}\n\n\tif (bFlyCheatOn)\n\t\tSoActivity->SuperModeTick(DeltaSeconds);\n\n\t// Update activity\n\tSoActivity->Tick(DeltaSeconds);\n\n\t// update camera\n\tSoActivity->UpdateCamera(DeltaSeconds);\n\n\t// update SoulKeeper usage\n\tconst FSoSplinePoint& SplineLoc = SoMovement->GetSplineLocation();\n\tconst ASoPlayerSpline* Spline = Cast<ASoPlayerSpline>(SplineLoc.GetSpline());\n\tif (bCanUseSoulkeeper != (Spline != nullptr &&\n\t\t\t\t\t\t\t  Spline->IsSoulkeeperUsageAllowed(SplineLoc.GetDistance(), GetActorLocation().Z) &&\n\t\t\t\t\t\t\t  Cast<ASoCarryable>(GetMovementBaseActor(this)) == nullptr))\n\t{\n\t\tbCanUseSoulkeeper = !bCanUseSoulkeeper;\n\t\tCanUseSoulkeeperChanged.Broadcast();\n\t}\n\n\t// update smoke vfx\n\tstatic const FName SmokeParamName = FName(\"SpawnRate\");\n\tstatic const FName SmokeColorParamName = FName(\"SmokeColor\");\n\tstatic const FName GlowColorParamName = FName(\"GlowTint\");\n\tstatic const FVector2D InRange = FVector2D(0.0f, 750.0f);\n\tstatic const FVector2D OutRange = FVector2D(5.0f, 100.0f);\n\tconst float VelocitySize = SoMovement->Velocity.Size();\n\tSoNewSmoke->SetFloatParameter(SmokeParamName, FMath::GetMappedRangeValueClamped(InRange, OutRange, VelocitySize));\n\n\tSoNewSmoke->SetVectorParameter(SmokeColorParamName, CurrentSmokeColor);\n\tSoGlowSphere->SetVectorParameterValueOnMaterials(GlowColorParamName, CurrentGlowSphereColor);\n\n\n\t// update bounce params\n\n\n\t// update super\n\tSuper::Tick(DeltaSeconds);\n\n\t// update mesh fade\n\tUpdateMeshFade(DeltaSeconds);\n\n\t// update strike trail fade\n\tfor (int32 i = WeaponTrailMeshFadeList.Num() - 1; i >= 0; i--)\n\t{\n\t\tWeaponTrailMeshFadeList[i].Counter -= DeltaSeconds;\n\t\tconst float Percent = 1.0f - WeaponTrailMeshFadeList[i].Counter / WeaponTrailMeshFadeList[i].MaxValue;\n\t\tconst float ParamValue = TrailCurve != nullptr ? TrailCurve->GetFloatValue(Percent) : Percent;\n\t\tstatic const FName SlideValueName = FName(\"Slide\");\n\t\tWeaponTrailMeshFadeList[i].Mesh->GetStaticMeshComponent()->SetScalarParameterValueOnMaterials(SlideValueName, ParamValue);\n\n\t\tif (WeaponTrailMeshFadeList[i].Counter <= 0.0f)\n\t\t{\n\t\t\tWeaponTrailMeshFadeList[i].Mesh->GetStaticMeshComponent()->SetVisibility(false);\n\t\t\tWeaponTrailMeshFadeList[i].Mesh->DetachFromActor(FDetachmentTransformRules::KeepWorldTransform);\n\t\t\tWeaponTrailMeshes.Add(WeaponTrailMeshFadeList[i].Mesh);\n\t\t\tWeaponTrailMeshFadeList.RemoveAtSwap(i);\n\t\t}\n\t}\n\n\t// update strike Cooldown\n\tconst bool bOnGround = SoMovement->IsMovingOnGround();\n\tfor (int32 i = Cooldowns.Num() - 1; i >= 0; i--)\n\t\tif (bOnGround || Cooldowns[i].bAllowInAir)\n\t\t{\n\t\t\tCooldowns[i].bAllowInAir = true;\n\t\t\tCooldowns[i].Counter -= DeltaSeconds * SoPlayerCharacterSheet->GetCooldownCounterMultiplier();\n\t\t\tif (Cooldowns[i].Counter <= 0.0f)\n\t\t\t{\n\t\t\t\tCooldownEnded.Broadcast(i, -1.0f, Cooldowns[i].Object);\n\t\t\t\tCooldowns.RemoveAt(i); // not swap cause order matters for UI!\n\t\t\t}\n\t\t}\n\n\t// update cam thingy\n\tif (bResetSavedCamMovModifierAfterTick)\n\t{\n\t\tbResetSavedCamMovModifierAfterTick = false;\n\t\tSavedCamMovModifier = 0;\n\t}\n\n\t//\n\t// update orientations:\n\t//\n\tconst float YawCenter = SideViewCameraComponent->GetComponentRotation().Yaw;\n\n\t{\n\t\tconst FRotator OriginalRotation = SoGlowSphere->GetComponentRotation();\n\t\tSoGlowSphere->SetWorldRotation(FRotator(OriginalRotation.Pitch, YawCenter + 90.0f, OriginalRotation.Roll));\n\t}\n\n\n\t// update soulkeeper orientation\n\tif (ResRuneVisualActor != nullptr && ResRuneVisualActor->IsActive())\n\t{\n\t\tconst FRotator OriginalRotation = ResRuneVisualActor->GetActorRotation();\n\t\tResRuneVisualActor->SetActorRotation(FRotator(OriginalRotation.Pitch, USoMathHelper::ClampYaw(YawCenter, 15.0f, OriginalRotation.Yaw), OriginalRotation.Roll));\n\t}\n\n\tOrientTowardsCameraList.RemoveAllSwap([](const USceneComponent* Ptr) { return Ptr == nullptr; });\n\tfor (auto* ComponentToRotate : OrientTowardsCameraList)\n\t{\n\t\tconst FRotator OriginalRotation = ComponentToRotate->GetComponentRotation();\n\t\tComponentToRotate->SetWorldRotation(FRotator(OriginalRotation.Pitch, USoMathHelper::ClampYaw(YawCenter, 15.0f, OriginalRotation.Yaw), OriginalRotation.Roll));\n\t}\n\n\tif (EnemyHPWidgetList.Num() > 0.0f)\n\t{\n\t\tEnemyHPWidgetList.RemoveAllSwap([](const USceneComponent* Ptr) { return Ptr == nullptr; });\n\t\tconst FRotator Rotation = (-SideViewCameraComponent->GetForwardVector()).Rotation();\n\t\tfor (auto* ComponentToRotate : EnemyHPWidgetList)\n\t\t\tComponentToRotate->SetWorldRotation(Rotation);\n\t}\n\n\t// update shadow post process\n\tSoActivity->UpdateCharMaterials(DeltaSeconds);\n\n\tFVector Velocity = GetVelocity();\n\tVelocity.Z = 0.0f;\n\tif (Velocity.SizeSquared2D() > 3.0f)\n\t\tLastVelocityDirection = Velocity.GetSafeNormal();\n\n\tbLandedRecently = false;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// Called to bind functionality to input\nvoid ASoCharacter::SetupPlayerInputComponent(UInputComponent* InInputComponent)\n{\n\tSuper::SetupPlayerInputComponent(InInputComponent);\n\n\t// NOTE if you modify any of the names here also modify the name in the input settings\n\tInInputComponent->BindAxis(\"MouseX\");\n\tInInputComponent->BindAxis(\"MouseY\");\n\n\tInInputComponent->BindAxis(FSoInputAxisName::GamepadRightX, this, &Self::MoveGamepadRightX);\n\tInInputComponent->BindAxis(FSoInputAxisName::GamepadRightY, this, &Self::MoveGamepadRightY);\n\tInInputComponent->BindAxis(FSoInputAxisName::GamepadLeftX, this, &Self::MoveGamepadLeftX);\n\tInInputComponent->BindAxis(FSoInputAxisName::GamepadLeftY, this, &Self::MoveGamepadLeftY);\n\n\tInInputComponent->BindAxis(FSoInputAxisName::Move, this, &Self::Move);\n\tInInputComponent->BindAxis(FSoInputAxisName::MoveY);\n\n\t// Track what was pressed, released\n\tTrackInputPressReleased(InInputComponent, FSoInputActionName::ToggleSpell, false);\n\n\tInInputComponent->BindAction(FSoInputActionName::Strike0, IE_Pressed, this, &Self::Strike0Pressed);\n\tInInputComponent->BindAction(FSoInputActionName::Strike1, IE_Pressed, this, &Self::Strike1Pressed);\n\n\tInInputComponent->BindAction(FSoInputActionName::Roll, IE_Pressed, this, &Self::RollPressed);\n\tInInputComponent->BindAction(FSoInputActionName::Roll, IE_Released, this, &Self::RollReleased);\n\n\tInInputComponent->BindAction(FSoInputActionName::LockFaceDirection, IE_Pressed, this, &Self::LockFaceDirectionPressed);\n\tInInputComponent->BindAction(FSoInputActionName::LockFaceDirection, IE_Released, this, &Self::LockFaceDirectionReleased);\n\n\tInInputComponent->BindAction(FSoInputActionName::Umbrella, IE_Pressed, this, &Self::UmbrellaPressed);\n\tInInputComponent->BindAction(FSoInputActionName::Umbrella, IE_Released, this, &Self::UmbrellaReleased);\n\n\tInInputComponent->BindAction(FSoInputActionName::TakeWeaponAway, IE_Pressed, this, &Self::TakeWeaponAway);\n\n\tInInputComponent->BindAction(FSoInputActionName::Jump, IE_Pressed, this, &Self::JumpPressed);\n\n\tInInputComponent->BindAction(FSoInputActionName::Interact0, IE_Pressed, this, &Self::Interact0);\n\tInInputComponent->BindAction(FSoInputActionName::Interact1, IE_Pressed, this, &Self::Interact1);\n\n\tInInputComponent->BindAction(\"LMB\", IE_Pressed, this, &Self::LeftClickPressed);\n\tInInputComponent->BindAction(\"LMB\", IE_Released, this, &Self::LeftClickReleased);\n\n\tInInputComponent->BindAction(\"RMB\", IE_Pressed, this, &Self::RightClickPressed);\n\tInInputComponent->BindAction(\"RMB\", IE_Released, this, &Self::RightClickReleased);\n\n\tInInputComponent->BindAction(FSoInputActionName::ToggleWeapon, IE_Pressed, this, &Self::ToggleWeapons);\n\tInInputComponent->BindAction(FSoInputActionName::ToggleItem, IE_Pressed, this, &Self::ToggleItems);\n\tInInputComponent->BindAction<FSoDelegateBoolOneParam>(FSoInputActionName::ToggleSpell, IE_Pressed, this, &Self::ToggleSpells, false);\n\n\tInInputComponent->BindAction(FSoInputActionName::UseItemFromSlot0, IE_Pressed, this, &Self::UseItemFromSlot0);\n\n\tInInputComponent->BindAction(FSoInputActionName::QuickSaveLoad0, IE_Pressed, this, &Self::QuickSaveLoad0);\n\tInInputComponent->BindAction(FSoInputActionName::QuickSaveLoad1, IE_Pressed, this, &Self::QuickSaveLoad1);\n\n\tInInputComponent->BindAction(FSoInputActionName::CharacterPanels, IE_Pressed, this, &Self::ToggleCharacterPanels).bExecuteWhenPaused = true;\n\n\t// Video DEMO\n#if WARRIORB_WITH_VIDEO_DEMO\n\tInInputComponent->BindAction(FSoInputActionName::StartVideoLoopPlayback, IE_Pressed, this, &Self::StartVideoLoopPlayback).bExecuteWhenPaused = true;\n\tInInputComponent->BindAction(FSoInputActionName::StartVideoLoopPlaybackGamepad, IE_Pressed, this, &Self::StartVideoLoopPlaybackGamepad).bExecuteWhenPaused = true;\n\tInInputComponent->BindAction(FSoInputActionName::StopVideoLoopPlayback, IE_Pressed, this, &Self::StopVideoLoopPlayback).bExecuteWhenPaused = true;\n\tInInputComponent->BindAction(FSoInputActionName::RestartDemo, IE_Pressed, this, &Self::RestartDemo).bExecuteWhenPaused = true;\n#endif // WARRIORB_WITH_VIDEO_DEMO\n\n\t// Register UI commands\n\tconst int32 UICmdNum = static_cast<int32>(ESoUICommand::EUC_ReleasedMax);\n\tconst int32 UICmdPressedNum = static_cast<int32>(ESoUICommand::EUC_PressedMax);\n\tconst UEnum* EnumPtr = FSoInputActionName::GetUICommandEnum();\n\tif (EnumPtr != nullptr)\n\t{\n\t\tfor (int32 Index = 0; Index < UICmdNum; ++Index)\n\t\t{\n\t\t\t// Ignore Num command EUC_PressedMax\n\t\t\tif (Index == UICmdPressedNum)\n\t\t\t\tcontinue;\n\n\t\t\t// Remove EUC_ or EUC_R\n\t\t\tconst ESoUICommand Command = static_cast<ESoUICommand>(Index);\n\t\t\tconst bool bPressed = Index < UICmdPressedNum;\n\t\t\tconst FName EnumName = FName(*EnumPtr->GetNameStringByIndex(Index).Mid(bPressed ? 4 : 5));\n\n\t\t\t// NOTE: order matters here\n\t\t\t// Track base press event\n\t\t\t{\n\t\t\t\tFInputActionBinding UIEvent_Pressed(EnumName, IE_Pressed);\n\t\t\t\tUIEvent_Pressed.bExecuteWhenPaused = true;\n\t\t\t\tUIEvent_Pressed.ActionDelegate.GetDelegateWithKeyForManualSet().BindUObject(this, &Self::UIInputPressed, Command);\n\t\t\t\tInInputComponent->AddActionBinding(UIEvent_Pressed);\n\t\t\t}\n\n\t\t\t// Track base released event\n\t\t\t{\n\t\t\t\tFInputActionBinding UIEvent_Released(EnumName, IE_Released);\n\t\t\t\tUIEvent_Released.bExecuteWhenPaused = true;\n\t\t\t\tUIEvent_Released.ActionDelegate.GetDelegateWithKeyForManualSet().BindUObject(this, &Self::UIInputReleased, Command);\n\t\t\t\tInInputComponent->AddActionBinding(UIEvent_Released);\n\t\t\t}\n\n\t\t\t// Add the event that the user experiences\n\t\t\t{\n\t\t\t\tFInputActionBinding UIEventActionBinding(EnumName, bPressed ? IE_Pressed : IE_Released);\n\t\t\t\tUIEventActionBinding.bExecuteWhenPaused = true;\n\t\t\t\tUIEventActionBinding.ActionDelegate.GetDelegateWithKeyForManualSet().BindUObject(this, &Self::HandleUICommand, Command);\n\t\t\t\tInInputComponent->AddActionBinding(UIEventActionBinding);\n\t\t\t}\n\t\t}\n\t}\n\n#if WITH_EDITOR\n\tInInputComponent->BindAction(FSoInputActionName::EditorCameraEditMode, IE_Pressed, this, &Self::SwitchCameraEditMode);\n\tInInputComponent->BindAction(FSoInputActionName::EditorSkyEditMode, IE_Pressed, this, &Self::SwitchSkyEditMode);\n\tInInputComponent->BindAction(FSoInputActionName::EditorCharShadowEditMode, IE_Pressed, this, &Self::SwitchCharShadowEditMode);\n\n\tInInputComponent->BindAction(FSoInputActionName::EditorCreateKey, IE_Pressed, this, &Self::CreateKey);\n\tInInputComponent->BindAction(FSoInputActionName::EditorReloadKeys, IE_Pressed, this, &Self::LoadEditedData);\n\tInInputComponent->BindAction(FSoInputActionName::EditorSaveKeys, IE_Pressed, this, &Self::SaveEditedData);\n\tInInputComponent->BindAction(FSoInputActionName::EditorDeleteKey, IE_Pressed, this, &Self::DeleteActiveKeyNode);\n\tInInputComponent->BindAction(FSoInputActionName::EditorCopyFromKey, IE_Pressed, this, &Self::CopyActiveKeyData);\n\tInInputComponent->BindAction(FSoInputActionName::EditorPasteToKey, IE_Pressed, this, &Self::PasteToActiveKeyData);\n\tInInputComponent->BindAction(FSoInputActionName::EditorMoveClosestKeyNodeHere, IE_Pressed, this, &Self::MoveClosestKeyHere);\n\tInInputComponent->BindAction(FSoInputActionName::EditorJumpToNextKey, IE_Pressed, this, &Self::JumpToNextKey);\n\tInInputComponent->BindAction(FSoInputActionName::EditorJumpToPrevKey, IE_Pressed, this, &Self::JumpToPrevKey);\n\tInInputComponent->BindAction(FSoInputActionName::EditorSpecialEditButtonPressed0, IE_Pressed, this, &Self::SpecialEditButtonPressed0);\n\tInInputComponent->BindAction(FSoInputActionName::EditorSpecialEditButtonPressed1, IE_Pressed, this, &Self::SpecialEditButtonPressed1);\n\tInInputComponent->BindAction(FSoInputActionName::EditorCtrl, IE_Pressed, this, &Self::CtrlPressed);\n\tInInputComponent->BindAction(FSoInputActionName::EditorCtrl, IE_Released, this, &Self::CtrlReleased);\n\tInInputComponent->BindAction(FSoInputActionName::EditorMiddleMouseButton, IE_Pressed, this, &Self::MiddleMouseBtnPressed);\n\tInInputComponent->BindAction(FSoInputActionName::EditorMiddleMouseButton, IE_Released, this, &Self::MiddleMouseBtnReleased);\n#endif\n\tInInputComponent->BindAction(FSoInputActionName::EditorSuperEditMode, IE_Pressed, this, &Self::SuperEditModePressed);\n\tInInputComponent->BindAction(FSoInputActionName::EditorDebugFeature, IE_Pressed, this, &Self::DebugFeature).bExecuteWhenPaused = true;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoCharacter::TrackInputPressReleased(UInputComponent* InInputComponent, FName ActionName, bool bTrackWhenPaused)\n{\n\t// Track base press event\n\t{\n\t\tFInputActionBinding Event_Pressed(ActionName, IE_Pressed);\n\t\tEvent_Pressed.bExecuteWhenPaused = bTrackWhenPaused;\n\t\tEvent_Pressed.ActionDelegate.GetDelegateForManualSet().BindUObject(this, &Self::InputPressed, ActionName);\n\t\tInInputComponent->AddActionBinding(Event_Pressed);\n\t}\n\n\t// Track base released event\n\t{\n\t\tFInputActionBinding Event_Released(ActionName, IE_Released);\n\t\tEvent_Released.bExecuteWhenPaused = bTrackWhenPaused;\n\t\tEvent_Released.ActionDelegate.GetDelegateForManualSet().BindUObject(this, &Self::InputReleased, ActionName);\n\t\tInInputComponent->AddActionBinding(Event_Released);\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoCharacter::InputPressed(FName ActionName)\n{\n\tInputPressedActionNames.Add(ActionName);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoCharacter::InputReleased(FName ActionName)\n{\n\tInputPressedActionNames.Remove(ActionName);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoCharacter::UIInputPressed(FKey Key, ESoUICommand Command)\n{\n\tUIInputPressedCommands.Add(Command);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoCharacter::UIInputReleased(FKey Key, ESoUICommand Command)\n{\n\tUIInputPressedCommands.Remove(Command);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoCharacter::HandleDeviceTypeChanged(ESoInputDeviceType InDeviceType)\n{\n\tDeviceType = InDeviceType;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoCharacter::Move(float Value)\n{\n\tif (bUseMovementOverride)\n\t\tValue = MovementOverrideValue;\n\n\tif (FMath::IsNearlyZero(Value, KINDA_SMALL_NUMBER))\n\t\tSavedCamMovModifier = 0;\n\n\tSoActivity->Move(Value);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoCharacter::LockFaceDirectionPressed()\n{\n\tbLockForwardVecPressed = true;\n\tSoMovement->bOrientRotationToMovement = false;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoCharacter::LockFaceDirectionReleased()\n{\n\tbLockForwardVecPressed = false;\n\tSoMovement->bOrientRotationToMovement = true;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoCharacter::OverrideFloatingVelocity(bool bOverride, float OverrideValue)\n{\n\tFloatingVelocity = OverrideValue;\n\tif (bFloatingActive)\n\t{\n\t\tSoMovement->SetFallVelocityOverride(bOverride, OverrideValue);\n\t\tif (!bOverride)\n\t\t{\n\t\t\tUmbrellaReleased();\n\t\t\tSoActivity->StopFloating();\n\t\t}\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool ASoCharacter::SetPositionOnSplineSP(const FSoSplinePoint& InSplinePoint,\n\t\t\t\t\t\t\t\t\t\t float ZValue,\n\t\t\t\t\t\t\t\t\t\t bool bCollisionChecksAndPutToGround,\n\t\t\t\t\t\t\t\t\t\t bool bStoreAsCheckpoint,\n\t\t\t\t\t\t\t\t\t\t bool bLookBackwards)\n{\n\tDECLARE_SCOPE_CYCLE_COUNTER(TEXT(\"SetPositionOnSplineSP\"), STAT_SetPositionOnSplineSP, STATGROUP_SoCharacter);\n\n\tif (!InSplinePoint.IsValid())\n\t{\n\t\tUE_LOG(LogSoChar, Error, TEXT(\"SetPositionOnSplineSP() called with invalid InSplinePoint\"));\n\t\treturn false;\n\t}\n\n\tconst FSoSplinePoint OldSplineLocation = SoMovement->GetSplineLocation();\n\n\t// First try is the input point\n\tFSoSplinePoint SpawnSplineLoc = InSplinePoint;\n\n\t// Find save location along Z axis\n\tbool bFound = true;\n\tFVector Location = bCollisionChecksAndPutToGround ? CalcSafeSpawnLocationAlongZ(SpawnSplineLoc, ZValue, bFound)\n\t\t\t\t\t\t\t\t\t\t\t\t\t  : SpawnSplineLoc.GetWorldLocation(ZValue);\n\tif (!bFound)\n\t{\n\t\tconst FVector SavedFirstLocation = Location;\n\t\tconst float SplineDistanceDelta = GetCapsuleComponent()->GetScaledCapsuleRadius() * 2.0f;\n\n\t\t// Try to the right of the spline point\n\t\tSpawnSplineLoc += SplineDistanceDelta;\n\t\tLocation = CalcSafeSpawnLocationAlongZ(SpawnSplineLoc, ZValue, bFound);\n\t\tif (!bFound)\n\t\t{\n\t\t\t// Try to the left\n\t\t\tSpawnSplineLoc = InSplinePoint - SplineDistanceDelta;\n\t\t\tLocation = CalcSafeSpawnLocationAlongZ(SpawnSplineLoc, ZValue, bFound);\n\t\t\tif (!bFound)\n\t\t\t{\n\t\t\t\t// no reason to move anywhere if nothing helps :(\n\t\t\t\tLocation = SavedFirstLocation;\n\t\t\t\tSpawnSplineLoc = InSplinePoint;\n\t\t\t}\n\t\t}\n\t}\n\n\tSetActorLocation(Location, false, nullptr, ETeleportType::TeleportPhysics);\n\tSpawnSplineLoc.SetReferenceActor(this);\n\tSoMovement->SetSplineLocation(SpawnSplineLoc);\n\n\tif (OldSplineLocation.GetSpline() != SpawnSplineLoc.GetSpline())\n\t\tOnSplineChanged(OldSplineLocation, SpawnSplineLoc);\n\n\tif (bStoreAsCheckpoint)\n\t{\n\t\tActiveCheckPointLocation = SpawnSplineLoc;\n\t\tActiveCheckpointZLocation = ZValue;\n\t}\n\n\tconst FVector FaceDir = SpawnSplineLoc.GetDirection() * ((bLookBackwards) ? -1.0f : 1.0f);\n\tSetActorRotation(FaceDir.Rotation());\n\tStoredForwardVector = FaceDir;\n\tLastInputDirection = StoredForwardVector;\n\tSavedCamMovModifier = 0;\n\tbResetSavedCamMovModifierAfterTick = true;\n\n\treturn true;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFVector ASoCharacter::CalcSafeSpawnLocationAlongZ(const FSoSplinePoint& SplinePoint, float ZValue, bool& bOutSafeFound)\n{\n\tDECLARE_SCOPE_CYCLE_COUNTER(TEXT(\"CalcSafeSpawnLocationAlongZ\"), STAT_CalcSafeSpawnLocationAlongZ, STATGROUP_SoCharacter);\n\n\tbOutSafeFound = true;\n\n\tconst float ScaledCapsuleHalfHeight = GetCapsuleComponent()->GetScaledCapsuleHalfHeight();\n\n\tconst FVector Start = SplinePoint.ToVector(ZValue);\n\tconst FVector ToEnd = -FVector(0.f, 0.f, 500);\n\n\tFCollisionQueryParams TraceParams;\n\tTraceParams.AddIgnoredActor(this);\n\n\tstatic const FName PawnName = FName(\"Pawn\");\n\n\tauto DoSweep = [this, &ToEnd, &TraceParams](const FVector& StartLocation, FHitResult& HitResult) -> bool\n\t{\n\t\treturn GetWorld()->SweepSingleByProfile(HitResult,\n\t\t\t\t\t\t\t\t\t\t\t\tStartLocation,\n\t\t\t\t\t\t\t\t\t\t\t\tStartLocation + ToEnd,\n\t\t\t\t\t\t\t\t\t\t\t\tGetCapsuleComponent()->GetComponentQuat(),\n\t\t\t\t\t\t\t\t\t\t\t\tPawnName,\n\t\t\t\t\t\t\t\t\t\t\t\tGetCapsuleComponent()->GetCollisionShape(),\n\t\t\t\t\t\t\t\t\t\t\t\tTraceParams);\n\t};\n\n\tFHitResult HitData(ForceInit);\n\tif (DoSweep(Start, HitData))\n\t{\n\t\tif (HitData.bStartPenetrating)\n\t\t{\n\t\t\tconst FVector Z[2] = { FVector(0.0f, 0.0f, 1.0f), FVector(0.0f, 0.0f, -1.0f) };\n\n\t\t\tfor (int32 i = 0; i < 2; ++i)\n\t\t\t{\n\t\t\t\tconst bool bUsePenetrationDepth = (HitData.PenetrationDepth > KINDA_SMALL_NUMBER) && ((HitData.Normal - Z[i]).SizeSquared() < KINDA_SMALL_NUMBER);\n\t\t\t\t// ScaledCapsuleHalfHeight * 2 is the greatest we can normally try, because this way the new capsule touches the original one\n\t\t\t\t// -> we did not teleport through ceiling / floor\n\t\t\t\t// TODO: improve this?!\n\t\t\t\tconst float MoveDistance = bUsePenetrationDepth ? HitData.PenetrationDepth + ScaledCapsuleHalfHeight : ScaledCapsuleHalfHeight * 2;\n\t\t\t\tconst FVector FixedStart = Start + Z[i] * MoveDistance;\n\t\t\t\tFHitResult HitDataSecondary(ForceInit);\n\t\t\t\tif (DoSweep(FixedStart, HitDataSecondary))\n\t\t\t\t{\n\t\t\t\t\tif (!HitDataSecondary.bStartPenetrating)\n\t\t\t\t\t\treturn HitDataSecondary.TraceStart + (HitDataSecondary.TraceEnd - HitDataSecondary.TraceStart) * HitDataSecondary.Time;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t\treturn FixedStart;\n\t\t\t}\n\n\t\t\tbOutSafeFound = false;\n\t\t}\n\t\telse\n\t\t\treturn HitData.TraceStart + (HitData.TraceEnd - HitData.TraceStart) * HitData.Time;\n\t}\n\n\treturn Start;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool ASoCharacter::IsFacingVelocity() const\n{\n\treturn (GetActorForwardVector().GetSafeNormal2D() | GetVelocity().GetSafeNormal2D()) > 0;\n}\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoCharacter::DecreaseCollisionSize()\n{\n\tif (bCollisionAlreadyDecreased) // it is a valid case now\n\t\treturn;\n\n\tbCollisionAlreadyDecreased = true;\n\tconst FVector MeshOffset = FVector(0, 0, NormalHeight - DecreasedHeight);\n\tGetCapsuleComponent()->SetCapsuleHalfHeight(DecreasedHeight);\n\tGetCapsuleComponent()->SetMassOverrideInKg(NAME_None, Mass);\n\tGetMesh()->AddLocalTransform(FTransform(MeshOffset));\n\tSoNewLights->AddLocalTransform(FTransform(MeshOffset));\n\n\tCapsuleBottomVFX->SetRelativeLocation(FVector(0.0f, 0.0f, -DecreasedHeight));\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool ASoCharacter::CanIncreaseCollision() const\n{\n\tif (!bCollisionAlreadyDecreased)\n\t\treturn false;\n\n\tUCapsuleComponent* CapsuleComp = GetCapsuleComponent();\n\tconst float FullHeight = CapsuleComp->GetScaledCapsuleHalfHeight() * 2;\n\n\tconst FVector MeshOffset = FVector(0, 0, FullHeight);\n\tFHitResult Hit;\n\n\tconst FTransform RelativeTransform = CapsuleComp->GetRelativeTransform();\n\tCapsuleComp->AddLocalTransform(FTransform(MeshOffset), true, &Hit);\t\t\t// move up\n\tCapsuleComp->SetRelativeTransform(RelativeTransform, true);\t\t\t\t\t// restore\n\n\tif (Hit.bBlockingHit)\n\t{\n\t\tconst ECollisionChannel ColChannel = Hit.Component->GetCollisionObjectType();\n\t\tif (ColChannel == ECollisionChannel::ECC_Destructible)\n\t\t\treturn true;\n\t}\n\n\t// we may have died during this process :/\n\tif (SoActivity == SoADead || SoActivity == SoAHitReact)\n\t\treturn false;\n\n\treturn !(Hit.bBlockingHit);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoCharacter::OnBounce(bool bWallJump, float NewStoredRollValue, const FVector& HitPoint, const FVector& HitNormal)\n{\n\tDECLARE_SCOPE_CYCLE_COUNTER(TEXT(\"OnBounce\"), STAT_OnBounce, STATGROUP_SoCharacter);\n\n\tSoActivity->OnBounce(bWallJump, NewStoredRollValue, HitPoint, HitNormal);\n\tOnRollHitBP(HitPoint, HitNormal, true);\n\n\t// Achievement for WallJump, in Prologue it's instant achievement, in main game you have to do that and heighest bounce before tut 3 to get the achievement\n\tif (USoPlatformHelper::IsDemo())\n\t{\n\t\tstatic const FName WallJumperAchievementName = FName(\"A_WallJumper\");\n\t\tif (bWallJump && !SoPlayerCharacterSheet->GetBoolValue(WallJumperAchievementName))\n\t\t{\n\t\t\tUSoAchievementManager::Get(this).UnlockAchievement(this, WallJumperAchievementName);\n\t\t}\n\t}\n\telse\n\t{\n\t\t// Normal Game\n\t\tif (bWallJump && !SoPlayerCharacterSheet->GetBoolValue(WallJumpDoneName))\n\t\t{\n\t\t\tSoPlayerCharacterSheet->SetBoolValue(WallJumpDoneName, true);\n\t\t\tCheckSelfTrainedAchievement();\n\t\t}\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool ASoCharacter::CanPerformWallJump(const FHitResult& HitResult)\n{\n\tAActor* Actor = HitResult.GetActor();\n\tif (Actor != nullptr && Actor->ActorHasTag(USoActivity::NoWallJumpSurface))\n\t\treturn false;\n\n\treturn DidPlayerJump();\n}\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoCharacter::Landed(const FHitResult& Hit)\n{\n\tDECLARE_SCOPE_CYCLE_COUNTER(TEXT(\"Landed\"), STAT_Landed, STATGROUP_SoCharacter);\n\n\tSuper::Landed(Hit);\n\t// it is needed cause of the slippery surfaces\n\tBaseChange();\n\n\tSoActivity->OnLanded();\n\n\tbForceGroundAnims = false;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoCharacter::OnMovementModeChanged(EMovementMode PrevMovementMode, uint8 PreviousCustomMode)\n{\n\tOnInteractionLabelChanged.Broadcast();\n\tOnMovementModeChangedNotify.Broadcast();\n\n\tif (PrevMovementMode == EMovementMode::MOVE_Walking && SoMovement->MovementMode == EMovementMode::MOVE_Falling)\n\t{\n\t\tLastSwitchToAirTime = GetWorld()->GetTimeSeconds();\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool ASoCharacter::CanJumpInternal_Implementation() const\n{\n\treturn (SoMovement && SoMovement->IsJumpAllowed() && SoMovement->IsMovingOnGround());\n}\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoCharacter::BaseChange()\n{\n\tDECLARE_SCOPE_CYCLE_COUNTER(TEXT(\"BaseChange\"), STAT_BaseChange, STATGROUP_SoCharacter);\n\n\tSuper::BaseChange();\n\tAActor* ActualMovementBase = GetMovementBaseActor(this);\n\tif (ActualMovementBase)\n\t{\n\t\tSoActivity->OnBaseChanged(ActualMovementBase);\n\t\t// UE_LOG(LogSoChar, Error, TEXT(\"New movement base: %s\"), *ActualMovementBase->GetName());\n\t}\n\t// else\n\t// \tUE_LOG(LogSoChar, Error, TEXT(\"Movement base cleared\"));\n\n\n\n\t// TEMP disabled, maybe we won't need this?!\n\t//if (ActualMovementBase != nullptr)\n\t//\tSoMovement->SetSlowDownToMaxWalkSpeedInFall(!ActualMovementBase->IsRootComponentStatic());\n}\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoCharacter::JumpPressedRecentlyTimeOver()\n{\n\tbJumpPressedRecently = false;\n\tbBanJumpCauseSpamming = false;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool ASoCharacter::IsAlive_Implementation() const\n{\n\treturn SoActivity != SoADead;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoCharacter::Kill_Implementation(bool bPhysical)\n{\n\tDECLARE_SCOPE_CYCLE_COUNTER(TEXT(\"Kill_Implementation\"), STAT_Kill_Implementation, STATGROUP_SoCharacter);\n\n\tFSoDmg Dmg;\n\tif (bPhysical)\n\t\tDmg.Physical = (SoPlayerCharacterSheet->GetMaxHealth() + 1.0f) / (1.0f - SoPlayerCharacterSheet->GetPhysicalResistance());\n\telse\n\t\tDmg.Magical = (SoPlayerCharacterSheet->GetMaxHealth() + 1.0f) / (1.0f - SoPlayerCharacterSheet->GetMagicResistance());\n\n\tSoActivity->OnDmgTaken({ Dmg }, {});\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoCharacter::CauseDmg_Implementation(const FSoDmg& Dmg, const FSoHitReactDesc& HitReactDesc)\n{\n\tSoActivity->OnDmgTaken(Dmg, HitReactDesc);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool ASoCharacter::MeleeHit_Implementation(const FSoMeleeHitParam& HitParam)\n{\n\tDECLARE_SCOPE_CYCLE_COUNTER(TEXT(\"MeleeHit_Implementation\"), STAT_MeleeHit_Implementation, STATGROUP_SoCharacter);\n\n\tif (DamageBlockCounter > 0.0f)\n\t\treturn true;\n\n\treturn SoActivity->OnMeleeHit(HitParam);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool ASoCharacter::SubscribeOnWalkThroughMortal_Implementation(const FSoNotifyActorSingle& OnWalkThrough, bool bSubscribe)\n{\n\tif (bSubscribe)\n\t\tOnWalkThroughMortal.Add(OnWalkThrough);\n\telse\n\t\tOnWalkThroughMortal.Remove(OnWalkThrough);\n\n\treturn true;\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoCharacter::AutoSave(float MinTimeSinceLastSave)\n{\n#if PLATFORM_SWITCH\n\tMinTimeSinceLastSave = FMath::Max(MinTimeSinceLastSave, 120.0f);\n#endif\n\t// Save game every 5 minutes\n\tconst float ThresholdSeconds = LastAutoSaveTime + MinTimeSinceLastSave;\n\tif (GetWorld()->GetTimeSeconds() > ThresholdSeconds)\n\t{\n\t\tLastAutoSaveTime = GetWorld()->GetTimeSeconds();\n\t\tif (GameInstance)\n\t\t\tGameInstance->SaveGameForCurrentState();\n\t}\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoCharacter::ModifySpellsCapacity(int32 ModifyAmount)\n{\n\tIDlgDialogueParticipant::Execute_ModifyIntValue(this, SpellcasterCapacityName, true, ModifyAmount);\n\tif (GetSpellsCapacity() < 0)\n\t\tSetSpellsCapacity(0);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoCharacter::SetSpellsCapacity(int32 NewCapacity)\n{\n\tIDlgDialogueParticipant::Execute_ModifyIntValue(this, SpellcasterCapacityName, false, FMath::Abs(NewCapacity));\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nint32 ASoCharacter::GetSpellsCapacity() const\n{\n\treturn IDlgDialogueParticipant::Execute_GetIntValue(this, SpellcasterCapacityName);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoCharacter::EnsureSpellsCapacityLimits(int32 SpellsCapacity/*= 2*/)\n{\n\tif (GetSpellsCapacity() < SpellsCapacity)\n\t\tSetSpellsCapacity(SpellsCapacity);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoCharacter::AddInteractable(AActor* Interactable)\n{\n\tif (Interactable == nullptr || !Interactable->GetClass()->ImplementsInterface(USoInteractable::StaticClass()))\n\t{\n\t\tUE_LOG(LogSoChar, Warning, TEXT(\"ASoCharacter::AddInteractable called, but the input actor does not implement the ISoInteractable interface!\"));\n\t\treturn;\n\t}\n\n\tif (Interactables.Num() > 0 && ISoInteractable::Execute_IsExclusive(Interactable) && !ISoInteractable::Execute_IsExclusive(Interactables[0]))\n\t\tInteractables.Insert(Interactable, 0);\n\telse\n\t\tInteractables.AddUnique(Interactable);\n\n\tif (Interactables.Num() == 3)\n\t\tActiveInteractable = 0;\n\n\t// if there is 2, one for R and one for T T should be always above\n\tif (Interactables.Num() == 2)\n\t{\n\t\tconst bool b0PrefersSecond = ISoInteractable::Execute_IsSecondKeyPrefered(Interactables[0]);\n\t\tconst bool b1PrefersSecond = ISoInteractable::Execute_IsSecondKeyPrefered(Interactables[1]);\n\t\tif (b0PrefersSecond && !b1PrefersSecond)\n\t\t\tInteractables.Swap(0, 1);\n\t}\n\n\tOnInteractionLabelChanged.Broadcast();\n}\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoCharacter::RemoveInteractable(AActor* Interactable)\n{\n\tconst bool bWasExclusive = ISoInteractable::Execute_IsExclusive(Interactable);\n\tInteractables.Remove(Interactable);\n\n\tif (bWasExclusive)\n\t{\n\t\tfor (int32 i = 1; i < Interactables.Num(); ++i)\n\t\t\tif (ISoInteractable::Execute_IsExclusive(Interactables[i]))\n\t\t\t{\n\t\t\t\tInteractables.Swap(0, i);\n\t\t\t\tbreak;\n\t\t\t}\n\t}\n\n\t// if there is 2, one for R and one for T T should be always above\n\tif (Interactables.Num() == 2)\n\t{\n\t\tconst bool b0PrefersSecond = ISoInteractable::Execute_IsSecondKeyPrefered(Interactables[0]);\n\t\tconst bool b1PrefersSecond = ISoInteractable::Execute_IsSecondKeyPrefered(Interactables[1]);\n\t\tif (b0PrefersSecond && !b1PrefersSecond)\n\t\t\tInteractables.Swap(0, 1);\n\t}\n\n\tSwitchActiveInteractable();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoCharacter::RemoveAllInteractable()\n{\n\tInteractables.Empty();\n\tSwitchActiveInteractable();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoCharacter::SwitchActiveInteractable()\n{\n\tActiveInteractable += 1;\n\tif (ActiveInteractable >= Interactables.Num())\n\t\tActiveInteractable = 0;\n\n\tOnInteractionLabelChanged.Broadcast();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nAActor* ASoCharacter::GetInteractionTipRelevantData(int32 Index, UPARAM(Ref)bool& bVisible, UPARAM(Ref)bool& bPrimaryKey)\n{\n\tswitch (Index)\n\t{\n\t\tcase 0:\n\t\t{\n\t\t\tif (Interactables.Num() < 1)\n\t\t\t{\n\t\t\t\tbVisible = false;\n\t\t\t\treturn nullptr;\n\t\t\t}\n\n\t\t\tconst int32 AssociatedInteractableIndex = Interactables.Num() > 2 ? ActiveInteractable : 0;\n\t\t\tbVisible = true;\n\t\t\tbPrimaryKey = (Interactables.Num() > 2) ? true : !ISoInteractable::Execute_IsSecondKeyPrefered(Interactables[AssociatedInteractableIndex]);\n\t\t\treturn Interactables[AssociatedInteractableIndex];\n\t\t}\n\n\t\tcase 1:\n\t\t\tif (Interactables.Num() < 2 || ISoInteractable::Execute_IsExclusive(Interactables[0]))\n\t\t\t{\n\t\t\t\tbVisible = false;\n\t\t\t\treturn nullptr;\n\t\t\t}\n\t\t\tbVisible = true;\n\t\t\tbPrimaryKey = (Interactables.Num() > 2) ? false : ISoInteractable::Execute_IsSecondKeyPrefered(Interactables[0]);\n\t\t\treturn (Interactables.Num() == 2) ? Interactables[1] : nullptr;\n\n\t\tdefault:\n\t\t\tbVisible = false;\n\t\t\treturn nullptr;\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoCharacter::StartCarryStuff(ASoCarryable* Stuff)\n{\n\tif (Stuff != nullptr)\n\t{\n\t\tCarriedStuff = Stuff;\n\t\tSoActivity->SwitchActivity(SoACarry);\n\t}\n\telse\n\t\tUE_LOG(LogSoChar, Error, TEXT(\"ASoCharacter::StartCarryStuff called with nullptr!\"));\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoCharacter::StartLeverPush(const struct FSoLeverData& LeverData, const FSoSplinePoint& SplinePoint, float ZValue)\n{\n\tSoActivity->StartLeverPush(LeverData, SplinePoint, ZValue);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoCharacter::DebugFeature()\n{\n\t// overridden in cam edit!!!\n\tSoActivity->DebugFeature();\n\n\t//if (USoGameSettings* GameSettings = USoGameSettings::GetInstance())\n\t\t//GameSettings->AutosetGamepadUIFromConnectedGamepad();\n\n\t// USoGameInstance::GetInstance(this)->TeleportToChapter(ESoChapterType::CT_Act2);\n\t// SoAInUI->StartSpellCastSwitch();\n\t//GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Red, FString::Printf(TEXT(\"%f\"), GetGamepadRightDirectionDegress()));\n\t// GetPlayerController()->ConsoleCommand(\"HighResShot 1920x1080\");\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoCharacter::QuickSaveLoad(int32 Index)\n{\n\tif (!bEnableQuickSaveLoad)\n\t\treturn;\n\n\tif (GameInstance)\n\t{\n\t\tconst bool bEpisode = GameInstance->IsEpisode();\n\n\t\tconst auto& WorldState = FSoWorldState::Get();\n\t\tif (bCtrlPressed)\n\t\t{\n\t\t\tif (bEpisode)\n\t\t\t{\n\t\t\t\tif (GameInstance->LoadGameForCurrentEpisode(false))\n\t\t\t\t\tUE_LOG(LogSoChar, Warning, TEXT(\"Episode reloaded!\"));\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif (GameInstance->LoadGameForChapter(Index, false))\n\t\t\t\t\tUE_LOG(LogSoChar, Warning, TEXT(\"Loaded from %s!\"), *WorldState.GetSaveFilePath());\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif (bEpisode)\n\t\t\t{\n\t\t\t\tif (GameInstance->SaveGameForEpisode(WorldState.GetEpisodeName()))\n\t\t\t\t\tUE_LOG(LogSoChar, Warning, TEXT(\"Episode saved!\"));\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif (GameInstance->SaveGameForChapter(Index))\n\t\t\t\t\tUE_LOG(LogSoChar, Warning, TEXT(\"Saved to %s - old file is overriden!\"), *WorldState.GetSaveFilePath());\n\t\t\t}\n\t\t}\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool ASoCharacter::SpawnResRune()\n{\n\tFSoSplinePoint SplineLocation = SoMovement->GetSplineLocation();\n\tASoPlayerSpline* PlayerSpline = Cast<ASoPlayerSpline>(SplineLocation.GetSpline());\n\n\tif (!bCanUseSoulkeeper)\n\t\treturn false;\n\n\tResLocation = SplineLocation;\n\tResLocationZValue = GetActorLocation().Z + GetCapsuleComponent()->GetScaledCapsuleHalfHeight();\n\n\tif (ResRuneVisualActor != nullptr && PlayerSpline != nullptr)\n\t{\n\t\tconst FVector CharLocation = GetActorLocation();\n\t\tconst FVector CamLocation = SideViewCameraComponent->GetComponentLocation();\n\t\tFVector DirVector = (CharLocation - CamLocation) * (PlayerSpline->ShouldSpawnSKBetweenCharacterAndCamera() ? -1.0f : 1.0f);\n\t\tDirVector.Z = 0;\n\t\tDirVector.Normalize();\n\n\t\tconst FVector TotemLocation = CharLocation + DirVector * 100;\n\t\tResRuneVisualActor->SetActorLocation(TotemLocation);\n\t\tResRuneVisualActor->SetActorRotation((CharLocation - TotemLocation).Rotation());\n\t\tResRuneVisualActor->SetActorHiddenInGame(false);\n\t\tResRuneVisualActor->Activate();\n\n\t\tOnSoulkeeperPlaced.Broadcast();\n\t}\n\n\treturn true;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoCharacter::Revive(bool bSoulKeeper, bool bCanUseSplineOverrideLocation, bool bWantToLeaveSpline)\n{\n\tDECLARE_SCOPE_CYCLE_COUNTER(TEXT(\"Revive\"), STAT_Revive, STATGROUP_SoCharacter);\n\n\tif (SoActivity->BlocksTeleportRequest())\n\t\treturn;\n\n\tSoActivity->OnTeleportRequest();\n\n\tconst ASoPlayerSpline* PlayerSpline = Cast<ASoPlayerSpline>(SoMovement->GetSplineLocation().GetSpline());\n\tconst bool bSoulKeeperNotUsed = !bSoulKeeper ||\n\t\t\t\t\t\t\t\t\tResRuneVisualActor == nullptr ||\n\t\t\t\t\t\t\t\t\t!ResRuneVisualActor->IsActive() ||\n\t\t\t\t\t\t\t\t\t(bCanUseSplineOverrideLocation && (PlayerSpline != nullptr && PlayerSpline->GetResPointOverride(bWantToLeaveSpline) != nullptr));\n\n\tif (bSoulKeeperNotUsed)\n\t\tPickupResRune();\n\n\tbLastRespawnWasSK = !bSoulKeeperNotUsed;\n\tbLastRespawnWasRetreat = bWantToLeaveSpline;\n\n\t// has to be called first so the collision of the dead parts are disabled before respawn\n\tOnRespawn(!bSoulKeeperNotUsed);\n\tOnPlayerRematerialized.Broadcast();\n\tOnPlayerRespawn.Broadcast();\n\n\tbool bTeleported = false;\n\tif (PlayerSpline != nullptr)\n\t{\n\t\tif (bCanUseSplineOverrideLocation)\n\t\t{\n\t\t\tif (ASoMarker* Marker = PlayerSpline->GetResPointOverride(bWantToLeaveSpline))\n\t\t\t{\n\t\t\t\tbTeleported = true;\n\t\t\t\tSoATeleport->SetupTeleport(Marker->GetSplineLocation(), Marker->GetActorLocation().Z, false, false);\n\t\t\t}\n\t\t}\n\t}\n\n\tSoPlayerCharacterSheet->OnRevive(bSoulKeeperNotUsed);\n\tif (!bTeleported)\n\t{\n\t\tif (bSoulKeeperNotUsed)\n\t\t\tSoATeleport->SetupTeleport(ActiveCheckPointLocation, ActiveCheckpointZLocation, false, false);\n\t\telse\n\t\t\tSoATeleport->SetupTeleport(ResLocation, ResLocationZValue, false, false);\n\t}\n\n\tif (MusicOverride == nullptr && PlayerSpline != nullptr)\n\t\tUSoAudioManager::Get(this).SetMusic(PlayerSpline->GetMusic(), bSoulKeeperNotUsed);\n\n\tUpdateMaterialBP();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoCharacter::FireEventsAsIfRespawned()\n{\n\tOnPlayerRematerialized.Broadcast();\n\tOnPlayerRespawn.Broadcast();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoCharacter::PickupResRune()\n{\n\tif (ResRuneVisualActor != nullptr && ResRuneVisualActor->IsActive())\n\t{\n\t\tResRuneVisualActor->Deactivate();\n\t\tResRuneVisualActor->SetActorHiddenInGame(true);\n\t\tSoPlayerCharacterSheet->SetSpellUsageCount(SoulKeeperSpell, 1, false);\n\t\tOnSoulkeeperPickedUp.Broadcast();\n\t}\n}\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoCharacter::SetActiveCheckpointLocationName(FName LocationName)\n{\n\t//const bool bIsLoading = GameInstance->IsSavingOrLoading();\n\t//const bool bAnyLevelLoading = USoLevelHelper::IsAnyLevelLoading(this);\n\tFSoWorldState::Get().SetCheckpointLocation(LocationName);\n}\n\nFName ASoCharacter::GetActiveCheckpointLocationName() const\n{\n\treturn FSoWorldState::Get().GetCheckpointLocation();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoCharacter::SetCheckpointLocation(const FSoSplinePoint& InSplinePoint, const float ZValue)\n{\n\tActiveCheckPointLocation = InSplinePoint;\n\tActiveCheckpointZLocation = ZValue;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoCharacter::TeleportToCheckpointName(FName CheckPointName, bool bPerformTeleportation)\n{\n\tDECLARE_SCOPE_CYCLE_COUNTER(TEXT(\"TeleportToCheckpointName\"), STAT_TeleportToCheckpointName, STATGROUP_SoCharacter);\n\n\tASoLocationRegistry* LocationRegistry = ASoLocationRegistry::GetInstance(this);\n\tif (LocationRegistry == nullptr)\n\t{\n\t\tUSoPlatformHelper::PrintErrorToAll(this, TEXT(\"Failed to update checkpoint location: location registry not found!\"));\n\t\treturn;\n\t}\n\tUE_LOG(LogSoChar, Verbose, TEXT(\"TeleportToCheckpointName = `%s`\"), *CheckPointName.ToString());\n\n\tif (!LocationRegistry->HasMarker(CheckPointName))\n\t{\n\t\tUSoPlatformHelper::PrintErrorToAll(this, FString::Printf(TEXT(\"ASoLocationRegistry does not have CheckpointName with name = `%s`\"), *CheckPointName.ToString()));\n\t}\n\n\tActiveCheckPointLocation = LocationRegistry->GetSplineLocation(CheckPointName);\n\tActiveCheckpointZLocation = LocationRegistry->GetZLocation(CheckPointName);\n\tLastTeleportedCheckpointName = CheckPointName;\n\tif (bPerformTeleportation)\n\t{\n\t\t// if this \"if statement\" ever changes check on SoPlayerCharacterState::OnReload() regarding level starter cutscenes (or just do not change it)\n\t\tif (SoMovement != nullptr && SoMovement->GetSplineLocation().GetSpline() != nullptr)\n\t\t{\n\t\t\t// Teleport\n\t\t\tSoATeleport->SetupTeleport(ActiveCheckPointLocation,\n\t\t\t\tActiveCheckpointZLocation,\n\t\t\t\ttrue,\n\t\t\t\tLocationRegistry->ShouldMarkerLookBackwards(CheckPointName));\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// Instant\n\t\t\tSetPositionOnSplineSP(ActiveCheckPointLocation,\n\t\t\t\tActiveCheckpointZLocation,\n\t\t\t\tfalse,\n\t\t\t\ttrue,\n\t\t\t\tLocationRegistry->ShouldMarkerLookBackwards(CheckPointName));\n\t\t}\n\t}\n\n\tif (SoMovement->GetSplineLocation().GetSpline() == nullptr)\n\t{\n\t\tUE_LOG(LogSoChar, Error, TEXT(\"TeleportToCheckpointName: Could not find spline from CheckPointName = `%s`\"), *CheckPointName.ToString());\n\t}\n\telse if (bPerformTeleportation)\n\t{\n\t\t// Claim here because the game might be paused\n\t\tbool bAllLevelLoaded;\n\t\tFSoLevelManager::Get().ClaimSplineLocation(SoMovement->GetSplineLocation(), bAllLevelLoaded);\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoCharacter::TeleportToActiveCheckpointName()\n{\n\t// Location is saved location name\n\tTeleportToCheckpointName(GetActiveCheckpointLocationName());\n\n\t// Ups, no spline, something is wrong with the CheckPointName\n\t// Try default location\n\tif (SoMovement->GetSplineLocation().GetSpline() == nullptr)\n\t{\n\t\tconst FString Message = FString::Printf(TEXT(\"Spline was not found for CheckPointName = `%s`. Retrying default checkpoint\"), *GetActiveCheckpointLocationName().ToString());\n\n\t\t// This is an error in everything besides the menu level\n\t\tif (!USoLevelHelper::IsInMenuLevel(this))\n\t\t\tUSoPlatformHelper::PrintErrorToAll(this, Message);\n\n\t\tTeleportToCheckpointName(ASoLocationRegistry::GetDefaultCheckpointLocationName());\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoCharacter::SufferOverlapDamage(AActor* SourceActor, const FSoDmg& Damage, const FSoHitReactDesc& HitReactDesc)\n{\n\tDECLARE_SCOPE_CYCLE_COUNTER(TEXT(\"SufferOverlapDamage\"), STAT_SufferOverlapDamage, STATGROUP_SoCharacter);\n\n\tif (DamageBlockCounter >= 0.0f)\n\t\treturn;\n\n\tCauseDmg_Implementation(Damage, HitReactDesc);\n\tOnOverlapDamageTaken.Broadcast(SourceActor);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool ASoCharacter::PreOverlapDamage(AActor* SourceActor)\n{\n\tif (bBounceAndDamageOverlapSpellUsed && SoActivity == SoARoll && bJumpPressedRecently)\n\t{\n\t\tif (ISoMortal::Execute_IsBounceAble(SourceActor))\n\t\t{\n\t\t\tFSoHitReactDesc EnemyHitReactDesc;\n\t\t\tEnemyHitReactDesc.HitReact = ESoHitReactType::EHR_Nothing;\n\t\t\tEnemyHitReactDesc.AssociatedActor = this;\n\t\t\tEnemyHitReactDesc.Irresistibility = 10;\n\t\t\tISoMortal::Execute_CauseDmg(SourceActor, FSoDmg{ 0.0f, BounceAndDamageOverlapSpellDamage }, EnemyHitReactDesc);\n\t\t\tSoMovement->Velocity.Z = RollJumpLevels.Last(1);\n\t\t\tSoMovement->SetMovementMode(EMovementMode::MOVE_Falling);\n\t\t\tISoMortal::Execute_DisplayVisualEffect(this, ESoVisualEffect::EVE_ElectrifiedYellow);\n\t\t\tDamageBlockCounter = DamageBlockTime;\n\t\t\tOnBounceSpellUsed.Broadcast(SourceActor);\n\t\t\tUSoAudioManager::PlaySoundAtLocation(this, SFXBounceOnEnemy, GetActorTransform(), true);\n\n\t\t\treturn false;\n\t\t}\n\n\t\tASoGameMode::Get(this).DisplayText(GetActorLocation(), ESoDisplayText::EDT_Immune);\n\t}\n\n\treturn true;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoCharacter::OnWalkThroughEnemy(AActor* Enemy)\n{\n\tOnWalkThroughMortal.Broadcast(Enemy);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nfloat ASoCharacter::ModifyRollJumpLevel(int32 DeltaLevel)\n{\n\tActiveRollJumpLevel = FMath::Clamp(ActiveRollJumpLevel + DeltaLevel, 0, RollJumpLevels.Num() - 1);\n\treturn RollJumpLevels[ActiveRollJumpLevel];\n}\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nfloat ASoCharacter::SetRollJumpLevel(int32 Level)\n{\n\tActiveRollJumpLevel = FMath::Clamp(Level, 0, RollJumpLevels.Num() - 1);\n\treturn RollJumpLevels[ActiveRollJumpLevel];\n}\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nfloat ASoCharacter::GetActiveRollJumpHeight() const\n{\n\tcheck(ActiveRollJumpLevel < RollJumpLevels.Num() && ActiveRollJumpLevel >= 0);\n\treturn RollJumpLevels[ActiveRollJumpLevel];\n}\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nfloat ASoCharacter::GetRollJumpHeight(int32 JumpLevel) const\n{\n\tcheck(JumpLevel < RollJumpLevels.Num() && JumpLevel >= 0);\n\treturn RollJumpLevels[JumpLevel];\n}\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoCharacter::FreezeCameraZ(bool bFreeze)\n{\n\tbUseSavedCameraBoomZ = bFreeze;\n\tif (bFreeze && !bSavedCameraBoomZUpdateBlock)\n\t{\n\t\tSavedCameraBoomZ = CameraBoom->GetComponentLocation().Z;\n\t\tSavedCameraBoomZSource = SavedCameraBoomZ;\n\t\tSavedCameraBoomZTarget = SavedCameraBoomZ;\n\t}\n\n\tCameraUnfreezeCounter = CameraUnfreezeTime;\n\n\tbSavedCameraBoomZUpdateBlock = true;\n}\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoCharacter::FreezeCameraZToValue(float ZToFreeze)\n{\n\tbUseSavedCameraBoomZ = true;\n\tSavedCameraBoomZTarget = ZToFreeze;\n\tSavedCameraBoomZSource = SavedCameraBoomZ;\n\tCameraUnfreezeCounter = CameraUnfreezeTime;\n\tbSavedCameraBoomZUpdateBlock = true;\n\tSavedCameraBoomZCounter = SavedCameraBoomZBlendTime;\n}\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoCharacter::SetCameraXDelta(float NewDelta, bool bInstantIn)\n{\n\tCameraXDeltaSource = bInstantIn ? NewDelta : CameraXDeltaCurrent;\n\tCameraXDeltaTarget = NewDelta;\n\tCameraXDeltaCounter = CameraXDeltaBlendTime;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoCharacter::SetMinCameraZ(bool bUseMin, float MinValue)\n{\n\tbUseCamMinZValue = bUseMin;\n\tMinCamZValue = MinValue;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoCharacter::SetMaxCameraZ(bool bUseMax, float MaxValue)\n{\n\tbUseCamMaxZValue = bUseMax;\n\tMaxCamZValue = MaxValue;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoCharacter::AddCooldown(const UObject* CooldownObject, float Duration, bool bCanCountInAir)\n{\n\tif (CooldownObject == nullptr)\n\t\treturn;\n\n\tif (Duration > 0.0f)\n\t{\n\t\tint32 i = 0;\n\t\tfor (; i < Cooldowns.Num() && Cooldowns[i].Counter > Duration; ++i);\n\n\t\tCooldowns.Insert({ CooldownObject, Duration, bCanCountInAir }, i);\n\t\tCooldownStarted.Broadcast(i, Duration, CooldownObject);\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoCharacter::RemoveCooldown(const UObject* CooldownObject)\n{\n\tfor (int32 i = 0; i < Cooldowns.Num(); ++i)\n\t\tif (Cooldowns[i].Object == CooldownObject)\n\t\t\tCooldowns[i].Counter = 0.0f;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoCharacter::RemoveAllCooldown()\n{\n\t// update strike Cooldown\n\tfor (int32 i = Cooldowns.Num() - 1; i >= 0; i--)\n\t{\n\t\tCooldowns[i].Counter -= -1.0f;\n\t\tCooldownEnded.Broadcast(i, -1.0f, Cooldowns[i].Object);\n\t\tCooldowns.RemoveAt(i); // not swap cause order matters for UI!\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoCharacter::AddWeaponBoost(const FSoWeaponBoost& BoostToAdd)\n{\n\tfor (const FSoWeaponBoost& WeaponBoost : WeaponBoosts)\n\t\tif (BoostToAdd.OwnerEffect == WeaponBoost.OwnerEffect)\n\t\t\treturn;\n\n\tWeaponBoosts.Add(BoostToAdd);\n\tif (SoSword->IsVisible())\n\t\tSelectWeapon(SoPlayerCharacterSheet->GetEquippedItem(ESoItemSlot::EIS_Weapon0));\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoCharacter::RemoveWeaponBoost(USoEffectBase* AssociatedEffect)\n{\n\tfor (int32 i = WeaponBoosts.Num() - 1; i>=0; i--)\n\t\tif (WeaponBoosts[i].OwnerEffect == AssociatedEffect)\n\t\t{\n\t\t\tif (WeaponBoosts[i].WeaponTemplate == SoPlayerCharacterSheet->GetEquippedItem(ESoItemSlot::EIS_Weapon0).Template)\n\t\t\t{\n\t\t\t\tSoSwordFX->SetVisibility(false);\n\t\t\t\tSoOffHandWeaponFX->SetVisibility(false);\n\t\t\t}\n\n\t\t\tWeaponBoosts.RemoveAtSwap(i);\n\t\t\treturn;\n\t\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFSoCamKeyNode ASoCharacter::GetInterpolatedCamData() const\n{\n\tconst FSoSplinePoint& SplineLocation = SoMovement->GetSplineLocation();\n\tconst ASoPlayerSpline* PlayerSpline = Cast<ASoPlayerSpline>(SplineLocation.GetSpline());\n\n\tif (PlayerSpline == nullptr)\n\t\treturn FSoCamKeyNode();\n\n\tconst float Distance = SplineLocation.GetDistance();\n\tconst FSoCamNodeList& SplineCamData = PlayerSpline->GetCamNodeList();\n\tint32 CamKey = ActiveCamKey;\n\treturn SplineCamData.GetInterpolatedCamData(Distance, CamKey);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoCharacter::RightClickPressed()\n{\n\tbRightMouseBtnPressed = true;\n\tSoActivity->RightBtnPressed();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoCharacter::OnUmbrellaOverlapBegin(UPrimitiveComponent* OverlappedComponent, AActor* OtherActor, UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult & SweepResult)\n{\n\tif (OtherActor == this)\n\t\treturn;\n\n\tSoActivity->OnUmbrellaOverlap();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nfloat ASoCharacter::GetSoundTimeDelayStopSpam() const\n{\n\treturn USoDateTimeHelper::NormalizeTime(SoundTimeDelayStopSpam);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nfloat ASoCharacter::GetLateBounceThreshold() const\n{\n\treturn USoDateTimeHelper::NormalizeTime(LateBounceThreshold);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nfloat ASoCharacter::GetForcedToMoveTimeAfterWallJump() const\n{\n\treturn ForcedToMoveTimeAfterWallJump;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nfloat ASoCharacter::GetForcedToMoveTimeAfterHit() const\n{\n\treturn ForcedToMoveTimeAfterHit;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoCharacter::SpawnBounceEffects(bool bWallJump, const FVector& HitPoint)\n{\n\t// bubble stops this\n\tif (bFloatingActive)\n\t\treturn;\n\n\t// Play sound but also prevents spam\n\tconst float CurrentTime = GetWorld()->GetTimeSeconds();\n\tif (CurrentTime - BounceTimeSinceLastSoundPlayed > GetSoundTimeDelayStopSpam())\n\t{\n\t\tauto* BounceVariant = GetBounceSFX(bWallJump ? 1 : RollJumpPitches.Num() - 2);\n\t\tUSoAudioManager::PlaySoundAtLocation(this, BounceVariant, FTransform(GetActorTransform()));\n\t\tBounceTimeSinceLastSoundPlayed = CurrentTime;\n\t}\n\tUGameplayStatics::SpawnEmitterAtLocation(GetWorld(), bWallJump ? VFXBounceLarge : VFXBounceSmall, HitPoint, FRotator::ZeroRotator, true);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoCharacter::FadeAndKillDestructible(ADestructibleActor* Destructible)\n{\n\tif (Destructible != nullptr)\n\t{\n\t\tFadeAndKillList.Add({ Destructible, 2.0f });\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoCharacter::FadeOutMeshes(TArray<AStaticMeshActor*> InMeshesToFade, float Speed, bool bCanHide)\n{\n\tfor (AStaticMeshActor* Actor : InMeshesToFade)\n\t\tif (Actor != nullptr)\n\t\t\tFadeOutMesh(Actor, Speed, bCanHide);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoCharacter::FadeInMeshes(TArray<AStaticMeshActor*> InMeshesToFade, float Speed)\n{\n\tfor (AStaticMeshActor* Actor : InMeshesToFade)\n\t\tif (Actor != nullptr)\n\t\t\tFadeInMesh(Actor, Speed);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoCharacter::FadeOutMesh(AStaticMeshActor* MeshToFade, float Speed, bool bCanHide)\n{\n\tif (!IsValid(MeshToFade))\n\t\treturn;\n\n\tTArray<FSoFadeEntry>* FadeLists[] = { &MeshesToFade, &FadedMeshes };\n\tfor (int32 i = 0; i < 2; ++i)\n\t\tfor (FSoFadeEntry& FadeEntry : (*FadeLists[i]))\n\t\t\tif (FadeEntry.Mesh == MeshToFade)\n\t\t\t{\n\t\t\t\tFadeEntry.InstanceCount += 1;\n\t\t\t\tFadeEntry.FadeSpeed = (FadeEntry.FadeSpeed + Speed) / 2.0f;\n\t\t\t\treturn;\n\t\t\t}\n\n\tMeshesToFade.Add({ MeshToFade, 1, 1.0f, Speed, bCanHide });\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoCharacter::FadeInMesh(AStaticMeshActor* MeshToFade, float Speed)\n{\n\tif (!IsValid(MeshToFade))\n\t\treturn;\n\n\t// check FadedMeshes first, these are invisible assets atm\n\tfor (int32 i = 0; i < FadedMeshes.Num(); ++i)\n\t\tif (FadedMeshes[i].Mesh == MeshToFade)\n\t\t{\n\t\t\tFadedMeshes[i].InstanceCount = FMath::Max(FadedMeshes[i].InstanceCount - 1, 0);\n\t\t\tFadedMeshes[i].FadeSpeed = (FadedMeshes[i].FadeSpeed + Speed) / 2.0f;\n\n\t\t\tif (FadedMeshes[i].InstanceCount == 0)\n\t\t\t{\n\t\t\t\t// no more box wants this one faded out, move from one array to the other so it will fade back\n\t\t\t\tif (FadedMeshes[i].Mesh != nullptr)\n\t\t\t\t{\n\t\t\t\t\tFadedMeshes[i].Mesh->GetStaticMeshComponent()->SetVisibility(true, true);\n\t\t\t\t\tMeshesToFade.Add({ FadedMeshes[i]});\n\t\t\t\t}\n\t\t\t\tFadedMeshes.RemoveAt(i);\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\t// not found in outfaded array, check the active list\n\tfor (FSoFadeEntry& FadeEntry : MeshesToFade)\n\t\tif (FadeEntry.Mesh == MeshToFade)\n\t\t{\n\t\t\tFadeEntry.InstanceCount = FMath::Max(FadeEntry.InstanceCount - 1, 0);\n\t\t\tFadeEntry.FadeSpeed = (FadeEntry.FadeSpeed + Speed) / 2.0f;\n\t\t\treturn;\n\t\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoCharacter::UpdateMeshFade(float DeltaSeconds)\n{\n\tstatic const FName OPParamName = (\"OP_Add\");\n\n\t// 1. fade and kill list:\n\n\tfor (int32 i = FadeAndKillList.Num() - 1; i >= 0; --i)\n\t{\n\t\tif (FadeAndKillList[i].Destructible == nullptr)\n\t\t{\n\t\t\tFadeAndKillList.RemoveAtSwap(i);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tFadeAndKillList[i].FadeCounter -= DeltaSeconds;\n\t\t\tif (FadeAndKillList[i].FadeCounter < KINDA_SMALL_NUMBER)\n\t\t\t{\n\t\t\t\tFadeAndKillList[i].Destructible->GetDestructibleComponent()->SetVisibility(false);\n\t\t\t\tFadeAndKillList[i].Destructible->SetLifeSpan(0.1f);\n\t\t\t\tFadeAndKillList.RemoveAtSwap(i);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tFadeAndKillList[i].Destructible->GetDestructibleComponent()->SetScalarParameterValueOnMaterials(OPParamName, FadeAndKillList[i].FadeCounter);\n\t\t\t}\n\t\t}\n\t}\n\n\tconst bool bOnlyOutFade = (SoActivity == SoADead || SoActivity == SoACameraEdit);\n\n\t// 2. standard fade\n\tfor (int32 i = MeshesToFade.Num() - 1; i >= 0; --i)\n\t{\n\t\tif (!IsValid(MeshesToFade[i].Mesh))\n\t\t{\n\t\t\tMeshesToFade.RemoveAt(i);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tconst bool bFadeOut = MeshesToFade[i].InstanceCount > 0;\n\n\t\t\tif (!bFadeOut && bOnlyOutFade)\n\t\t\t\tcontinue;\n\n\t\t\tconst float FadeTarget = bFadeOut ? 0.0f : 1.0f;\n\t\t\tMeshesToFade[i].FadeValue = FMath::FInterpTo(MeshesToFade[i].FadeValue, FadeTarget, DeltaSeconds, MeshesToFade[i].FadeSpeed);\n\n\t\t\tif (MeshesToFade[i].Mesh != nullptr)\n\t\t\t\tMeshesToFade[i].Mesh->GetStaticMeshComponent()->SetScalarParameterValueOnMaterials(OPParamName, MeshesToFade[i].FadeValue);\n\n\t\t\tif (FMath::Abs(MeshesToFade[i].FadeValue - FadeTarget) < KINDA_SMALL_NUMBER)\n\t\t\t{\n\t\t\t\tif (bFadeOut && MeshesToFade[i].Mesh != nullptr)\n\t\t\t\t{\n\t\t\t\t\tif (!MeshesToFade[i].bCanHideIfOutFaded)\n\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\tMeshesToFade[i].Mesh->GetStaticMeshComponent()->SetVisibility(false, true);\n\t\t\t\t\tFadedMeshes.Add(MeshesToFade[i]);\n\t\t\t\t}\n\t\t\t\tMeshesToFade.RemoveAt(i);\n\t\t\t}\n\t\t}\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoCharacter::SelectWeapon(const FSoItem& Item)\n{\n\tDECLARE_SCOPE_CYCLE_COUNTER(TEXT(\"SelectWeapon\"), STAT_SelectWeapon, STATGROUP_SoCharacter);\n\n\t// clear old\n\tconst USoWeaponTemplate* WeaponTemplate = Cast<const USoWeaponTemplate>(Item.Template);\n\tif (WeaponTemplate == nullptr)\n\t\treturn;\n\n\tSoSword->SetVisibility(!bForceHideRightWeapon);\n\tSoSword->SetStaticMesh(WeaponTemplate->GetStaticMeshNew());\n\n\tSoSword->AttachToComponent(GetMesh(), FAttachmentTransformRules::SnapToTargetNotIncludingScale, WeaponTemplate->GetBoneName());\n\tSoSword->SetRelativeRotation(WeaponLocalRot);\n\n\tUParticleSystem* WeaponFX = nullptr;\n\tfor (const FSoWeaponBoost& WeaponBoost : WeaponBoosts)\n\t\tif (WeaponTemplate == WeaponBoost.WeaponTemplate)\n\t\t\tWeaponFX = WeaponBoost.ParticleSystem;\n\n\tSoSwordFX->SetTemplate(WeaponFX);\n\tSoSwordFX->SetVisibility(WeaponFX != nullptr && !bForceHideRightWeapon);\n\n\tconst bool bDualWield = WeaponTemplate->GetWeaponType() == ESoWeaponType::EWT_DualWield;\n\tSoOffHandWeapon->SetVisibility(bDualWield && !bForceHideLeftWeapon);\n\t// SoOffHandWeapon->SetVisibility(bDualWield ? ECollisionEnabled::QueryOnly : ECollisionEnabled::NoCollision);\n\tif (bDualWield)\n\t{\n\t\tSoOffHandWeapon->SetStaticMesh(WeaponTemplate->GetStaticMeshNew());\n\t\tSoOffHandWeapon->AttachToComponent(GetMesh(), FAttachmentTransformRules::SnapToTargetNotIncludingScale, WeaponTemplate->GetBoneNameSecondary());\n\t\tSoOffHandWeapon->SetRelativeRotation(WeaponLocalRot);\n\t}\n\n\tSoOffHandWeaponFX->SetTemplate(WeaponFX);\n\tSoOffHandWeaponFX->SetVisibility(bDualWield && WeaponFX != nullptr && !bForceHideLeftWeapon);\n\n\tArmedAnimationSetNew = WeaponTemplate->GetNewAnimations();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoCharacter::OnArmedStateLeft()\n{\n\tSoMovement->ClearRootMotionDesc();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool ASoCharacter::IsSoulkeeperActive() const\n{\n\treturn ResRuneVisualActor != nullptr && ResRuneVisualActor->IsActive();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoCharacter::OnSplineChanged(const FSoSplinePoint& OldLocation, const FSoSplinePoint& NewLocation)\n{\n\tDECLARE_SCOPE_CYCLE_COUNTER(TEXT(\"OnSplineChanged\"), STAT_OnSplineChanged, STATGROUP_SoCharacter);\n\n\t// update camera dir correction\n\tif (OldLocation.IsValid(false) && NewLocation.IsValid(false))\n\t{\n\t\tSavedCamMovModifier *= ((FVector2D(OldLocation.GetDirection()) | FVector2D(NewLocation.GetDirection())) > 0) ? 1 : -1;\n\t\tAutoSave(300.0f);\n\t}\n\n\tUParticleSystem* NewTemplate = nullptr;\n\tconst ASoPlayerSpline* NewSpline = Cast<ASoPlayerSpline>(NewLocation.GetSpline());\n\tif (NewSpline != nullptr)\n\t\tif (NewSpline->GetLevelClaims().Num() > 0)\n\t\t\tNewTemplate = USoLevelHelper::GetWeatherVFXForLevel(NewSpline->GetLevelClaims()[0].LevelName);\n\n\tif (NewTemplate != WeatherVFX->Template)\n\t\tWeatherVFX->SetTemplate(NewTemplate);\n\n\tOnPlayerSplineChanged.Broadcast(OldLocation.GetSpline(), NewSpline);\n\n\tif (MusicOverride == nullptr)\n\t\tUpdateMusic(false);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoCharacter::SetMusicOverride(UFMODEvent* Music, bool bInstantOverride, UObject* Requester)\n{\n \tMusicOverride = Music;\n\tMusicOverrideRequester = Requester;\n\tUpdateMusic(bInstantOverride);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoCharacter::ClearMusicOverrideFromRequester(UObject* Requester)\n{\n\tif (MusicOverrideRequester == Requester)\n\t{\n\t\tMusicOverride = nullptr;\n\t\tUpdateMusic(true);\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoCharacter::AddBounceSFXOverride(ASoBounceSFXOverrideBox* SFXOverride)\n{\n\tif (SFXOverride != nullptr)\n\t{\n\t\tBounceSFXOverrideStack.Add(SFXOverride);\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoCharacter::RemoveBounceSFXOverride(ASoBounceSFXOverrideBox* SFXOverride)\n{\n\tBounceSFXOverrideStack.Remove(SFXOverride);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUFMODEvent* ASoCharacter::GetBounceSFX(int32 Level) const\n{\n\tif (BounceSFXOverrideStack.Num() > 0 && BounceSFXOverrideStack.Last(0) != nullptr)\n\t\treturn BounceSFXOverrideStack.Last(0)->GetBounceSFX(Level);\n\n\treturn SFXBounceVariants.IsValidIndex(Level) ? SFXBounceVariants[Level] : nullptr;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoCharacter::UpdateMusic(bool bSkipRequestDelay)\n{\n\tUFMODEvent* MusicToSet = MusicOverride;\n\n\tif (MusicToSet == nullptr)\n\t\tif (const ASoPlayerSpline* PlayerSpline = Cast<ASoPlayerSpline>(SoMovement->GetSplineLocation().GetSpline()))\n\t\t{\n\t\t\tif (!SoPlayerCharacterSheet->GetBoolValue(USoStaticHelper::GetForceNoEnvMusicName()))\n\t\t\t\tMusicToSet = PlayerSpline->GetMusic();\n\t\t}\n\n\tif (MusicToSet != nullptr)\n\t\tUSoAudioManager::Get(this).SetMusic(MusicToSet, bSkipRequestDelay);\n\telse\n\t\tUSoAudioManager::Get(this).FadeOutActiveMusic();\n\n\tif (MusicToSet != nullptr)\n\t\tSoPlayerCharacterSheet->SetBoolValue(MusicToSet->GetFName(), true);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nEActivity ASoCharacter::GetActivity() const\n{\n\treturn SoActivity ? SoActivity->GetID() : EActivity::EA_Default;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUSoUIVideoPlayer* ASoCharacter::GetUIVideoPlayer() const\n{\n\treturn UISystem ? UISystem->GetVideoPlayer() : nullptr;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUSoUIMenuMain* ASoCharacter::GetUIMainMenu() const\n{\n\treturn UISystem ? UISystem->GetMainMenu() : nullptr;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool ASoCharacter::IsMainMenuOpened() const\n{\n\tif (USoUIMenuMain* MainMenu = GetUIMainMenu())\n\t\treturn ISoUIEventHandler::Execute_IsOpened(MainMenu);\n\n\treturn false;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoCharacter::InitUISystem()\n{\n\t// Already set\n\tif (UISystem != nullptr)\n\t\treturn;\n\n\tif (*UISystemClass == nullptr)\n\t{\n\t\tUE_LOG(LogSoChar, Error, TEXT(\"Did not set UISystemClass!\"))\n\t\treturn;\n\t}\n\n\tUISystem = CreateWidget<USoUISystem>(GetPlayerController(), UISystemClass);\n\tif (UISystem)\n\t\tUISystem->AddToViewport();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool ASoCharacter::OnPreLanded(const FHitResult& Hit)\n{\n\tDECLARE_SCOPE_CYCLE_COUNTER(TEXT(\"OnPreLanded\"), STAT_OnPreLanded, STATGROUP_SoCharacter);\n\n\tbLandedRecently = true;\n\n\tbAirJumpedSinceLastLand = false;\n\tOnPreLand.Broadcast();\n\treturn SoActivity->OnPreLanded(Hit);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool ASoCharacter::AddItem(const FSoItem& Item, bool bPrintInDlgLog)\n{\n\tconst int32 SlotIndex = SoInventory->AddItem(Item);\n\tSoPlayerCharacterSheet->OnItemPickedUp(Item, SlotIndex);\n\n\tif (bPrintInDlgLog)\n\t{\n\t\tOnDlgItemChange.Broadcast(Item, true);\n\t\tUSoAudioManager::PlaySoundAtLocation(this, SFXFItemGained, GetActorTransform());\n\t}\n\n\treturn true;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool ASoCharacter::RemoveItem(const USoItemTemplate* Template, bool bPrintInDlgLog)\n{\n\tconst int32 ItemIndex = SoInventory->GetIndexFromTemplate(Template);\n\n\tif (ItemIndex < 0)\n\t{\n\t\tif (Template == nullptr)\n\t\t\tUE_LOG(LogSoChar, Warning, TEXT(\"Remove item called with invalid item tempalte (nullptr)!\"))\n\t\telse\n\t\t\tUE_LOG(LogSoChar, Warning, TEXT(\"Remove item called with a template the character does not have (%s!!\"), *Template->GetName());\n\n\t\treturn false;\n\t}\n\n\tconst FSoItem Item = SoInventory->GetItem(ItemIndex);\n\tSoPlayerCharacterSheet->OnItemRemoved(Item);\n\tSoInventory->RemoveItem(ItemIndex, Item.Amount);\n\n\tif (bPrintInDlgLog)\n\t\tOnDlgItemChange.Broadcast(Item, false);\n\n\treturn true;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool ASoCharacter::CanEquipToSlot(ESoItemSlot ItemSlot) const\n{\n\treturn true;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoCharacter::ForceHideWeapon(float Duration, bool bPrimary)\n{\n\tif (bPrimary)\n\t{\n\t\tbForceHideRightWeapon = true;\n\t\tSoSword->SetVisibility(false, true);\n\t}\n\telse\n\t{\n\t\tbForceHideLeftWeapon = true;\n\t\tSoOffHandWeapon->SetVisibility(false, true);\n\t}\n\n\tFTimerDelegate TimerCallback;\n\tTimerCallback.BindLambda([bPrimary, this]\n\t{\n\t\tif (bPrimary)\n\t\t\tbForceHideRightWeapon = false;\n\t\telse\n\t\t\tbForceHideLeftWeapon = false;\n\n\t\tif (SoActivity->IsArmedState())\n\t\t\tSoAWeaponInArm->RefreshWeapon();\n\t});\n\tGetWorld()->GetTimerManager().SetTimer(bPrimary ? ForceHideRightWeaponOver : ForceHideLeftWeaponOver, TimerCallback, Duration, false);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoCharacter::ClearForceHideWeapon()\n{\n\tbForceHideRightWeapon = false;\n\tgTimerManager->ClearTimer(ForceHideRightWeaponOver);\n\tbForceHideLeftWeapon = false;\n\tgTimerManager->ClearTimer(ForceHideLeftWeaponOver);\n\n\tif (SoActivity->IsArmedState())\n\t\tSoAWeaponInArm->RefreshWeapon();\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoCharacter::SetAnimInstanceClassFixed(UClass* NewClass)\n{\n\t// For details: https://gist.github.com/underscorediscovery/46ecaf5cc1ba97f1a7e922f6a77a5705\n\n\t// We may be doing parallel evaluation on the current anim instance\n\t// Calling this here with true will block this init till that thread completes\n\t// and it is safe to continue\n\n\tconst bool bBlockOnTask = true;\t\t\t\t\t// wait on evaluation task so it is safe to swap the buffers\n\tconst bool bPerformPostAnimEvaluation = true;\t// Do PostEvaluation so we make sure to swap the buffers back.\n\tGetMesh()->HandleExistingParallelEvaluationTask(bBlockOnTask, bPerformPostAnimEvaluation);\n\tGetMesh()->SetAnimInstanceClass(NewClass);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool ASoCharacter::GetBoolValue_Implementation(FName ValueName) const\t{ return SoPlayerCharacterSheet->GetBoolValue(ValueName); }\nfloat ASoCharacter::GetFloatValue_Implementation(FName ValueName) const\t{ return SoPlayerCharacterSheet->GetFloatValue(ValueName); }\nint32 ASoCharacter::GetIntValue_Implementation(FName ValueName) const\t{ return SoPlayerCharacterSheet->GetIntValue(ValueName); }\nFName ASoCharacter::GetNameValue_Implementation(FName ValueName) const\t{ return SoPlayerCharacterSheet->GetNameValue(ValueName); }\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool ASoCharacter::ModifyBoolValue_Implementation(FName ValueName, bool bValue)\n{\n\tSoPlayerCharacterSheet->SetBoolValue(ValueName, bValue);\n\n\t/** maybe item is attached to this bool value, remove it if that is the case */\n\tif (bValue == false)\n\t{\n\t\tUSoItemTemplate* QuestItem = SoInventory->FindQuestItem(ValueName);\n\t\tif (QuestItem != nullptr)\n\t\t\tRemoveItem(QuestItem, true);\n\t}\n\n\treturn true;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoCharacter::RemoveBoolsWithPrefix(const FString& PreFix)\n{\n\tSoPlayerCharacterSheet->RemoveBoolsWithPrefix(PreFix);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool ASoCharacter::ModifyIntValue_Implementation(FName ValueName, bool bDelta, int32 Value)\n{\n\tOnDlgIntModified.Broadcast(ValueName, Value);\n\tSoPlayerCharacterSheet->SetIntValue(ValueName, Value, bDelta);\n\n\tif (ValueName == USoStaticHelper::NameGold)\n\t\tLastModifiedGoldAmount = Value;\n\n\tOnIntModified.Broadcast(ValueName, SoPlayerCharacterSheet->GetIntValue(ValueName));\n\n\treturn true;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool ASoCharacter::ModifyFloatValue_Implementation(FName ValueName, bool bDelta, float Value)\n{\n\tSoPlayerCharacterSheet->SetFloatValue(ValueName, Value, bDelta);\n\treturn true;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool ASoCharacter::ModifyNameValue_Implementation(FName ValueName, FName Value)\n{\n\tSoPlayerCharacterSheet->SetNameValue(ValueName, Value);\n\treturn true;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoCharacter::OnPushed_Implementation(const FVector& DeltaMovement, float DeltaSeconds, bool bStuck, AActor* RematerializeLocation, int32 DamageAmountIfStuck, bool bForceDamage)\n{\n\tSoActivity->OnPushed(DeltaMovement, DeltaSeconds, bStuck, RematerializeLocation, DamageAmountIfStuck, bForceDamage);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool ASoCharacter::ShouldBounceOnHit(float& OutStepUpHitVelocity, float& OutBounceDamping, const FHitResult* HitResult) const\n{\n\treturn SoActivity->ShouldBounceOnHit(OutStepUpHitVelocity, OutBounceDamping, HitResult);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoCharacter::OnChapterLoaded()\n{\n\t//#if WARRIORB_WITH_EDITOR\n\t//#else\n\t//\tif (USoGameInstance::GetInstance(this)->IsChapter())\n\t//\t{\n\t//\t\tconst FName ChapterName = USoLevelHelper::GetChapterFNameFromObject(this);\n\t//\n\t//\t\tif (!SoPlayerCharacterSheet->GetBoolValue(ChapterName))\n\t//\t\t{\n\t//\t\t\tSoPlayerCharacterSheet->SetBoolValue(ChapterName, true);\n\t//\t\t\tFSoChapterMapParams ChapterParams;\n\t//\t\t\tUSoGameSingleton::GetInstance()->GetChapterData(ChapterName, ChapterParams);\n\t//\t\t\tif (ChapterParams.LevelEnterAnimation != nullptr)\n\t//\t\t\t{\n\t//\t\t\t\tSoAInteractWithEnvironment->Enter(ChapterParams.LevelEnterAnimation, nullptr, nullptr);\n\t//\t\t\t}\n\t//\t\t}\n\t//\t}\n\t//#endif\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoCharacter::CheckSelfTrainedAchievement()\n{\n\tif (SoPlayerCharacterSheet->GetBoolValue(WallJumpDoneName) &&\n\t\tSoPlayerCharacterSheet->GetBoolValue(MaxBounceDoneName))\n\t\tUSoAchievementManager::Get(this).UnlockAchievementIfSatisfied(this, AchievementSelfTrained);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoCharacter::SetCameraLagEnabled(bool bEnabled)\n{\n\tCameraBoom->bEnableCameraLag = bEnabled;\n\tCameraBoom->bEnableCameraRotationLag = bEnabled;\n\n\t//if (bEnabled)\n\t//\tUE_LOG(LogTemp, Warning, TEXT(\"Cam lag enabled\"))\n\t//else\n\t//\tUE_LOG(LogTemp, Warning, TEXT(\"Cam lag disabled\"));\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoCharacter::Strike0Pressed()\n{\n\tDECLARE_SCOPE_CYCLE_COUNTER(TEXT(\"Strike0Pressed\"), STAT_Strike0Pressed, STATGROUP_SoCharacter);\n\n\tif (bGameInputBlockedByUI || DamageBlockCounter > 0.0f)\n\t\treturn;\n\n\tbSpecialStrikeWasRequestedLast = false;\n\tSoActivity->StrikePressed();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoCharacter::Strike1Pressed()\n{\n\tDECLARE_SCOPE_CYCLE_COUNTER(TEXT(\"Strike1Pressed\"), STAT_Strike1Pressed, STATGROUP_SoCharacter);\n\n\tif (bGameInputBlockedByUI || DamageBlockCounter > 0.0f)\n\t\treturn;\n\n\tbSpecialStrikeWasRequestedLast = true;\n\tSoActivity->StrikePressed();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool ASoCharacter::CouldSwing() const\n{\n\tif (!SoMovement->IsFalling() || !SoActivity->CanBeInterrupted(EActivity::EA_Swinging))\n\t\treturn false;\n\n\tconst float WorldLocZ = GetActorLocation().Z;\n\tfor (int32 i = 0; i < SwingCenters.Num(); ++i)\n\t\tif (SwingCenters[i]->GetActorLocation().Z > WorldLocZ)\n\t\t\treturn true;\n\n\treturn false;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoCharacter::RemoveSkyDiveField(AActor* SkyDiveField)\n{\n\tSkyDiveFields.Remove(SkyDiveField);\n\tSkyDiveFields.Remove(nullptr);\n\n\tif (SkyDiveFields.Num() == 0)\n\t{\n\t\tOverrideFloatingVelocity(false);\n\t}\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoCharacter::StartVideoLoopPlaybackGamepad()\n{\n\tconst ASoPlayerController* SoController = GetSoPlayerController();\n\tif (!GameInstance || !SoController)\n\t\treturn;\n\n\tif (SoController->IsInputKeyDown(EKeys::Gamepad_LeftTrigger) && SoController->IsInputKeyDown(EKeys::Gamepad_RightTrigger))\n\t{\n\t\tStartVideoLoopPlayback();\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoCharacter::StartVideoLoopPlayback()\n{\n\tGameInstance->StartVideoLoopPlayback();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoCharacter::StopVideoLoopPlayback()\n{\n\tGameInstance->StopVideoLoopPlayback();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoCharacter::RestartDemo()\n{\n\tGameInstance->LoadGameForDemo(true);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoCharacter::OverrideAllMovementSpeed(float NewSpeed)\n{\n\tSoARoll->OverrideMovementSpeed(NewSpeed);\n\tSoADead->OverrideMovementSpeed(NewSpeed);\n\tSoAHitReact->OverrideMovementSpeed(NewSpeed);\n\tSoADefault->OverrideMovementSpeed(NewSpeed);\n\tSoALillian->OverrideMovementSpeed(NewSpeed);\n\tSoASlide->OverrideMovementSpeed(NewSpeed);\n\tSoASwing->OverrideMovementSpeed(NewSpeed);\n\tSoALeverPush->OverrideMovementSpeed(NewSpeed);\n\tSoACarry->OverrideMovementSpeed(NewSpeed);\n\t// SoACarryPickUp->OverrideMovementSpeed(NewSpeed);\n\tSoACarryDrop->OverrideMovementSpeed(NewSpeed);\n\tSoAAiming->OverrideMovementSpeed(NewSpeed);\n\tSoAWeaponInArm->OverrideMovementSpeed(NewSpeed);\n\tSoAStrike->OverrideMovementSpeed(NewSpeed);\n\tSoAItemUsage->OverrideMovementSpeed(NewSpeed);\n\tSoAInteractWithEnvironment->OverrideMovementSpeed(NewSpeed);\n\tSoASoAWaitForActivitySwitch->OverrideMovementSpeed(NewSpeed);\n\tSoAWait->OverrideMovementSpeed(NewSpeed);\n\tSoAInUI->OverrideMovementSpeed(NewSpeed);\n\tSoATeleport->OverrideMovementSpeed(NewSpeed);\n\tSoACameraEdit->OverrideMovementSpeed(NewSpeed);\n\tSoASkyControlEdit->OverrideMovementSpeed(NewSpeed);\n\tSoACharShadowEdit->OverrideMovementSpeed(NewSpeed);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoCharacter::UseMovementOverride(bool bUse, float OverrideValue)\n{\n\tbUseMovementOverride = bUse;\n\tMovementOverrideValue = OverrideValue;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUCameraComponent* ASoCharacter::GetSideViewCameraComponent() const { return SideViewCameraComponent; }\nUSoSpringArmComponent* ASoCharacter::GetCameraBoom() const { return CameraBoom; }\nint32 ASoCharacter::GetClosestCamIndex() const { return SoACameraEdit->GetClosestCamIndex(); }\n\nAPlayerController* ASoCharacter::GetPlayerController() const { return Cast<APlayerController>(GetController()); }\nASoPlayerController* ASoCharacter::GetSoPlayerController() const { return Cast<ASoPlayerController>(GetController()); }\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool ASoCharacter::IsSaveAllowed() const\n{\n\treturn SoActivity != nullptr && SoActivity->IsSaveAllowed();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoCharacter::Interact0()\n{\n\tDECLARE_SCOPE_CYCLE_COUNTER(TEXT(\"Interact0\"), STAT_Interact0, STATGROUP_SoCharacter);\n\n\tif (bGameInputBlockedByUI)\n\t\treturn;\n\n\tSoActivity->InteractKeyPressed(true);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoCharacter::Interact1()\n{\n\tDECLARE_SCOPE_CYCLE_COUNTER(TEXT(\"Interact1\"), STAT_Interact1, STATGROUP_SoCharacter);\n\n\tif (bGameInputBlockedByUI)\n\t\treturn;\n\n\tSoActivity->InteractKeyPressed(false);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoCharacter::TakeWeaponAway()\n{\n\tDECLARE_SCOPE_CYCLE_COUNTER(TEXT(\"TakeWeaponAway\"), STAT_TakeWeaponAway, STATGROUP_SoCharacter);\n\n\tif (bGameInputBlockedByUI)\n\t\treturn;\n\n\tSoActivity->TakeWeaponAway();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoCharacter::ToggleItems()\n{\n\tDECLARE_SCOPE_CYCLE_COUNTER(TEXT(\"ToggleItems\"), STAT_ToggleItems, STATGROUP_SoCharacter);\n\n\tif (bGameInputBlockedByUI)\n\t\treturn;\n\n\tSoActivity->ToggleItems();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoCharacter::ToggleSpells(bool bQuickSelectionMode)\n{\n\tDECLARE_SCOPE_CYCLE_COUNTER(TEXT(\"ToggleSpells\"), STAT_ToggleSpells, STATGROUP_SoCharacter);\n\n\tSoAInUI->ToggleSpells(bQuickSelectionMode);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoCharacter::UseItemFromSlot0()\n{\n\tDECLARE_SCOPE_CYCLE_COUNTER(TEXT(\"UseItemFromSlot0\"), STAT_UseItemFromSlot0, STATGROUP_SoCharacter);\n\n\tif (bGameInputBlockedByUI)\n\t\treturn;\n\n\tSoActivity->UseItemFromSlot0();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoCharacter::JumpPressed()\n{\n\tDECLARE_SCOPE_CYCLE_COUNTER(TEXT(\"JumpPressed\"), STAT_JumpPressed, STATGROUP_SoCharacter);\n\n\tif (bGameInputBlockedByUI)\n\t\treturn;\n\n\tSoActivity->JumpPressed();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoCharacter::RollPressed()\n{\n\tDECLARE_SCOPE_CYCLE_COUNTER(TEXT(\"RollPressed\"), STAT_RollPressed, STATGROUP_SoCharacter);\n\n\tif (bGameInputBlockedByUI)\n\t\treturn;\n\n\tbRollPressed = true;\n\tSoActivity->RollPressed();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoCharacter::ToggleWeapons()\n{\n\tDECLARE_SCOPE_CYCLE_COUNTER(TEXT(\"ToggleWeapons\"), STAT_ToggleWeapons, STATGROUP_SoCharacter);\n\n\tif (bGameInputBlockedByUI)\n\t\treturn;\n\n\tSoActivity->ToggleWeapons();\n}\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\nvoid ASoCharacter::IncreaseCollisionSize()\n{\n\tDECLARE_SCOPE_CYCLE_COUNTER(TEXT(\"IncreaseCollisionSize\"), STAT_IncreaseCollisionSize, STATGROUP_SoCharacter);\n\n\tSoActivity->IncreaseCollisionSize();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoCharacter::OnBlocked()\n{\n\tDECLARE_SCOPE_CYCLE_COUNTER(TEXT(\"OnBlocked\"), STAT_OnBlocked, STATGROUP_SoCharacter);\n\n\tSoActivity->OnBlocked();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoCharacter::SuperEditModePressed()\n{\n\tSoActivity->SuperEditModePressed();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoCharacter::LeftClickPressed()\n{\n\tbLeftMouseBtnPressed = true; SoActivity->LeftBtnPressed();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoCharacter::ToggleCharacterPanels()\n{\n\tDECLARE_SCOPE_CYCLE_COUNTER(TEXT(\"ToggleCharacterPanels\"), STAT_ToggleCharacterPanels, STATGROUP_SoCharacter);\n\n\tSoAInUI->ToggleCharacterPanels();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoCharacter::HandleUICommand(FKey Key, ESoUICommand Command)\n{\n\tDECLARE_SCOPE_CYCLE_COUNTER(TEXT(\"HandleUICommand\"), STAT_HandleUICommand, STATGROUP_SoCharacter);\n\n\tif (!GameInstance->IsVideoLooping())\n\t{\n \t\tSoActivity->HandleUICommand(Key, Command);\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoCharacter::SwitchFromUI()\n{\n\tif (SoActivity == SoAInUI)\n\t\tSoAInUI->SwitchToRelevantState(true);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool ASoCharacter::IsInDialogue() const\n{\n\treturn SoActivity == SoAInUI && SoAInUI->IsInDialogue();\n}\n\n///////////////////////////////////////////////////////////////////////////////////////////////////////////\n// <Input bindings>\nbool ASoCharacter::IsToggleSpellsPressed() const { return InputPressedActionNames.Contains(FSoInputActionName::ToggleSpell); }\n\nfloat ASoCharacter::GetXAxisValue() const { return InputComponent ? InputComponent->GetAxisValue(\"MouseX\") : 0.f; }\nfloat ASoCharacter::GetYAxisValue() const { return InputComponent ? InputComponent->GetAxisValue(\"MouseY\") : 0.f; }\n\nfloat ASoCharacter::GetMovementXAxisValue() const { return InputComponent ? InputComponent->GetAxisValue(FSoInputAxisName::Move) : 0.f; }\nfloat ASoCharacter::GetMovementYAxisValue() const { return InputComponent ? InputComponent->GetAxisValue(FSoInputAxisName::MoveY) : 0.f; }\n\n// </Input bindings>\n///////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n\nbool ASoCharacter::CanPauseOnIdle() const { return SoActivity ? SoActivity->CanPauseOnIdle() : true; }\n\n///////////////////////////////////////////////////////////////////////////////////////////////////////////\n// <camera edit functions>\n\n#if WITH_EDITOR\nvoid ASoCharacter::SaveEditedData() { SoActivity->SaveEditedData(); }\nvoid ASoCharacter::LoadEditedData() { SoActivity->LoadEditedData(); }\n\nvoid ASoCharacter::SwitchCameraEditMode()\t\t{ SoActivity->SwitchActivity(SoActivity == SoACameraEdit\t ? Cast<USoActivity>(SoADefault) : SoACameraEdit);\t   }\nvoid ASoCharacter::SwitchSkyEditMode()\t\t\t{ SoActivity->SwitchActivity(SoActivity == SoASkyControlEdit ? Cast<USoActivity>(SoADefault) : SoASkyControlEdit); }\nvoid ASoCharacter::SwitchCharShadowEditMode()\t{ SoActivity->SwitchActivity(SoActivity == SoACharShadowEdit ? Cast<USoActivity>(SoADefault) : SoACharShadowEdit); }\n\nvoid ASoCharacter::CreateKey() { SoActivity->CreateKey(); }\nvoid ASoCharacter::MoveClosestKeyHere() { SoActivity->MoveClosestKeyHere(); }\nvoid ASoCharacter::DeleteActiveKeyNode() { SoActivity->DeleteActiveKeyNode(); }\n\nvoid ASoCharacter::CopyActiveKeyData() { SoActivity->CopyActiveKeyData(); }\nvoid ASoCharacter::PasteToActiveKeyData() { SoActivity->PasteToActiveKeyData(); }\n\nvoid ASoCharacter::JumpToNextKey() { SoActivity->JumpToNextKey(); }\nvoid ASoCharacter::JumpToPrevKey() { SoActivity->JumpToPrevKey(); }\n\nvoid ASoCharacter::SpecialEditButtonPressed0() { SoActivity->SpecialEditButtonPressed(0); }\nvoid ASoCharacter::SpecialEditButtonPressed1() { SoActivity->SpecialEditButtonPressed(1); }\n\n#endif\n\n\n// </camera edit functions>\n///////////////////////////////////////////////////////////////////////////////////////////////////////////\n"
  },
  {
    "path": "Source/SOrb/Character/SoCharacter.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#pragma once\n#include \"CharacterBase/SoCharacterBase.h\"\n\n#include \"DlgDialogueParticipant.h\"\n#include \"Basic/SoDialogueParticipant.h\"\n\n// helper structs\n#include \"SoCharacterDataTypes.h\"\n#include \"Settings/Input/SoInputSettingsTypes.h\"\n#include \"UI/General/SoUITypes.h\"\n#include \"Online/Achievements/SoAchievementManager.h\"\n\n// enum types: EActivity, EAnimEvents\n#include \"SoCharStates/SoActivityTypes.h\"\n\n// FSoCamKeyNode\n#include \"SplineLogic/SoCameraData.h\"\n\n// FSoSkyControlValue\n#include \"SplineLogic/SoSkyControlData.h\"\n\n// SoItemType\n#include \"Items/SoItemTypes.h\"\n\n// FSoItem\n#include \"Items/SoItem.h\"\n\n#include \"SoCharacter.generated.h\"\n\n// Components\nclass USoPlayerProgress;\nclass USoPlayerCharacterSheet;\nclass USoInventoryComponent;\nclass USoAnalyticsComponent;\nclass USoSpringArmComponent;\nclass USoProjectileSpawnerComponent;\nclass UParticleSystemComponent;\nclass USceneCaptureComponent2D;\nclass UCameraComponent;\nclass USoSpringArmComponent;\nclass UInputComponent;\nclass ASoBounceSFXOverrideBox;\n\n// Activities\nclass USoActivity;\nclass USoADead;\nclass USoAHitReact;\nclass USoADefault;\nclass USoALillian;\nclass USoARoll;\nclass USoASlide;\nclass USoASwing;\nclass USoAAiming;\nclass USoAWeaponInArm;\nclass USoAStrike;\nclass USoALeverPush;\nclass USoACarry;\n// class USoACarryPickUp;\nclass USoACarryDrop;\nclass USoAInUI;\nclass USoAItemUsage;\nclass USoAInteractWithEnvironment;\nclass USoAWait;\nclass USoASoAWait;\nclass USoASoAWaitForActivitySwitch;\nclass USoATeleport;\nclass USoACameraEdit;\nclass USoASkyControlEdit;\nclass USoACharShadowEdit;\n\n// Misc\nclass ASoInteractableActor;\nclass ASoCarryable;\nclass ASoSwingCenter;\nclass ISoInteractable;\nclass USoWizard;\nclass ASoCharacter;\nclass USoUISystem;\nclass USoUIMenuMain;\nclass USoUIVideoPlayer;\nclass AActor;\nclass UDlgContext;\nclass USoGameInstance;\nclass USoItemTemplateRuneStone;\nclass UFMODEvent;\nclass UFMODAudioComponent;\nclass UParticleSystem;\nclass UCurveFloat;\nclass APostProcessVolume;\nclass ASoPlayerSpline;\nclass ASoPlayerController;\nclass UCameraShake;\nclass UForceFeedbackEffect;\nstruct FSoAnimationSet;\nclass UMaterial;\nclass USoEffectBase;\nclass ADestructibleActor;\n\n//\n// Delegates\n//\n\nDECLARE_DYNAMIC_MULTICAST_DELEGATE(FSoNotify);\nDECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FSoWaitForLevelShow, bool, bNotEvenLoaded);\n\nDECLARE_DYNAMIC_MULTICAST_DELEGATE_TwoParams(FSoSplineChangeNotify, const ASoSpline*, OldSpline, const ASoSpline*, NewSpline);\nDECLARE_DYNAMIC_MULTICAST_DELEGATE_TwoParams(FSoPlayerSplineChangeNotify, const ASoPlayerSpline*, OldSpline, const ASoPlayerSpline*, NewSpline);\n\nDECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FSoForceAreaEnteredDisplay, const FText&, AreaName);\n\nDECLARE_DYNAMIC_MULTICAST_DELEGATE_TwoParams(FSoDlgIntModified, FName, ValueName, int32, Value);\nDECLARE_DYNAMIC_MULTICAST_DELEGATE_TwoParams(FSoDlgItemChange, const FSoItem&, Item, bool, bGained);\n\nDECLARE_DYNAMIC_MULTICAST_DELEGATE_ThreeParams(FSoCooldownChanged, int32, Index, float, RemainingTime, const UObject*, ObjectWithCooldown);\n\nDECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FSoChangeUIVisibilityNotify, bool, bShow);\n\nDECLARE_DYNAMIC_MULTICAST_DELEGATE_TwoParams(FSoNotifyIntModified, FName, IntName, int32, NewValue);\n\n\n\nUCLASS()\nclass SORB_API ASoCharacter : public ASoCharacterBase, public ISoDialogueParticipant, public IDlgDialogueParticipant\n{\n\tGENERATED_BODY()\n\ttypedef ASoCharacter Self;\n\n\tDECLARE_DELEGATE_OneParam(FSoDelegateBoolOneParam, bool);\npublic:\n\n\tASoCharacter(const FObjectInitializer& ObjectInitializer);\n\n\t///////////////////////////////////////////////////////////////////////////////////////////////////////////\n\t// <ACharacter interface>\n\n\tvoid PreInitializeComponents() override;\n\tvoid PostInitializeComponents() override;\n\tvoid BeginPlay() override;\n\tvoid EndPlay(const EEndPlayReason::Type EndPlayReason);\n\tvoid Tick(float DeltaSeconds) override;\n\tvoid SetupPlayerInputComponent(UInputComponent* InInputComponent) override;\n\tvoid Landed(const FHitResult& Hit) override;\n\tvoid OnMovementModeChanged(EMovementMode PrevMovementMode, uint8 PreviousCustomMode = 0) override;\nprotected:\n\tbool CanJumpInternal_Implementation() const override;\n\tvoid BaseChange() override;\n\t// </ACharacter interface>\n\t///////////////////////////////////////////////////////////////////////////////////////////////////////////\n\npublic:\n\t///////////////////////////////////////////////////////////////////////////////////////////////////////////\n\t// <Interfaces>\n\n\t// ISoDialogueParticipant\n\tvirtual const FSoDialogueParticipantData& GetParticipantData() const override { return DialogueData; }\n\n\t// DlgDialogueParticipant interface\n\tFName GetParticipantName_Implementation() const { return DialogueData.ParticipantName; }\n\tFText GetParticipantDisplayName_Implementation(FName ActiveSpeaker) const { return DialogueData.ParticipantDisplayName; }\n\tETextGender GetParticipantGender_Implementation() const { return ETextGender::Neuter; }\n\tUTexture2D* GetParticipantIcon_Implementation(FName ActiveSpeaker, FName ActiveSpeakerState) const { return DialogueData.ParticipantIcon; }\n\n\tbool ModifyIntValue_Implementation(FName ValueName, bool bDelta, int32 Value);\n\tbool ModifyFloatValue_Implementation(FName ValueName, bool bDelta, float Value);\n\tfloat GetFloatValue_Implementation(FName ValueName) const;\n\tint32 GetIntValue_Implementation(FName ValueName) const;\n\tbool ModifyNameValue_Implementation(FName ValueName, FName Value);\n\tFName GetNameValue_Implementation(FName ValueName) const;\n\n\tbool OnDialogueEvent_Implementation(UDlgContext* Context, FName EventName) { return false; }\n\tbool CheckCondition_Implementation(const UDlgContext* Context, FName ConditionName) const { return false; }\n\n\t/** check/add progress data */\n\tbool ModifyBoolValue_Implementation(FName ValueName, bool bValue);\n\tbool GetBoolValue_Implementation(FName ValueName) const;\n\n\tvoid RemoveBoolsWithPrefix(const FString& PreFix);\n\n\t// ISoSplineWalker\n\tvoid OnPushed_Implementation(const FVector& DeltaMovement, float DeltaSeconds, bool bStuck, AActor* RematerializeLocation, int32 DamageAmountIfStuck, bool bForceDamage) override;\n\n\t// ISoMortal\n\tvirtual bool IsAlive_Implementation() const override;\n\tvirtual bool HasInvulnerability_Implementation() const override { return DamageBlockCounter > 0.0f; }\n\tvirtual void Kill_Implementation(bool bPhysical) override;\n\tvirtual void CauseDmg_Implementation(const FSoDmg& Dmg, const FSoHitReactDesc& HitReactDesc) override;\n\tvirtual bool MeleeHit_Implementation(const FSoMeleeHitParam& HitParam) override;\n\n\tvirtual bool SubscribeOnWalkThroughMortal_Implementation(const FSoNotifyActorSingle& OnWalkThrough, bool bSubscribe = true) override;\n\n\n\tvoid AutoSave(float MinTimeSinceLastSave);\n\n\t//\n\t// Spells\n\t//\n\n\tUFUNCTION(BlueprintCallable, Category = \"Spells\")\n\tvoid ModifySpellsCapacity(int32 ModifyAmount);\n\n\tUFUNCTION(BlueprintCallable, Category = \"Spells\")\n\tvoid SetSpellsCapacity(int32 NewCapacity);\n\n\tUFUNCTION(BlueprintPure, Category = \"Spells\")\n\tint32 GetSpellsCapacity() const;\n\n\tvoid EnsureSpellsCapacityLimits(int32 SpellsCapacity = 2);\n\n\t// </Interfaces>\n\t////////////////////////////////////////////////////////////////////////////////////\n\n\t////////////////////////////////////////////////////////////////////////////////////\n\t// <ASoCharacterBase>\n\tvirtual void OnSplineChanged(const FSoSplinePoint& OldLocation, const FSoSplinePoint& NewLocation) override;\n\tvirtual bool ShouldBounceOnHit(float& OutStepUpHitVelocity, float& OutBounceDamping, const FHitResult* HitResult) const override;\n\tvirtual bool OnPreLanded(const FHitResult& Hit) override;\n\tvirtual void OnBounce(bool bWallJump, float NewStoredMoveValue, const FVector& HitPoint, const FVector& HitNormal) override;\n\tvirtual bool CanPerformWallJump(const FHitResult& HitResult) override;\n\tvirtual void OnBlocked() override;\n\t// </ASoCharacterBase>\n\t////////////////////////////////////////////////////////////////////////////////////\n\n\t///////////////////////////////////////////////////////////////////////////////////////////////////////////\n\t// <Input bindings>\n\n\t// mouse/gamepad-right-stick axis\n\tfloat GetXAxisValue() const;\n\tfloat GetYAxisValue() const;\n\n\t// WASD/gamepad left stick value\n\tUFUNCTION(BlueprintCallable)\n\tfloat GetMovementXAxisValue() const;\n\tfloat GetMovementYAxisValue() const;\n\n\t// Get Right gamepad direction\n\t// https://en.wikipedia.org/wiki/Atan2#/media/File:Atan2_60.svg\n\t// Top circle values are negatives from [-180, 0]\n\t// Bottom circle values are positive from [0, 180]\n\t// Y at top = -1\n\t// Y at bottom = 1\n\tFORCEINLINE float GetGamepadRightDirectionDegrees() const\n\t{\n\t\treturn FMath::RadiansToDegrees(FMath::Atan2(GamepadRightY, GamepadRightX));\n\t}\n\n\t// Get Left gamepad direction\n\t// https://en.wikipedia.org/wiki/Atan2#/media/File:Atan2_60.svg\n\t// Top circle values are positive from [0, 180]\n\t// Bottom values are negative from [-180, 0]\n\t// Y at top = 1\n\t// Y at bottom = -1\n\tFORCEINLINE float GetGamepadLeftDirectionDegrees() const\n\t{\n\t\treturn FMath::RadiansToDegrees(FMath::Atan2(GamepadLeftY, GamepadLeftX));\n\t}\n\n\tfloat GetGamepadRightXAxisValue() const { return GamepadRightX; }\n\tfloat GetGamepadRightYAxisValue() const { return GamepadRightY; }\n\tfloat GetGamepadLeftXAxisValue() const { return GamepadLeftX; }\n\tfloat GetGamepadLeftYAxisValue() const { return GamepadLeftY; }\n\n\tFORCEINLINE bool IsUsingRightThumbStick() const\n\t{\n\t\treturn !FMath::IsNearlyZero(GamepadRightX) || !FMath::IsNearlyZero(GamepadRightY);\n\t}\n\tFORCEINLINE bool IsUsingLeftThumbStick() const\n\t{\n\t\treturn !FMath::IsNearlyZero(GamepadLeftX) || !FMath::IsNearlyZero(GamepadLeftY);\n\t}\n\n\tFORCEINLINE bool IsUsingRightThumbStickWithSameValueForAtLeastFrames(int32 Frames) const\n\t{\n\t\treturn RightThumbstickSameValueFrames >= Frames;\n\t}\n\tFORCEINLINE bool IsUsingLeftThumbStickWithSameValueForAtLeastFrames(int32 Frames) const\n\t{\n\t\treturn LeftThumbstickSameValueFrames >= Frames;\n\t}\n\n\t// Tells us if UI is pressed or not\n\tvoid SetGameInputBlockedByUI(bool bValue) { bGameInputBlockedByUI = bValue; }\n\tvoid UIInputPressed(FKey Key, const ESoUICommand Command);\n\tvoid UIInputReleased(FKey Key, const ESoUICommand Command);\n\tvoid ClearInputStates()\n\t{\n\t\tbGameInputBlockedByUI = false;\n\t\tUIInputPressedCommands.Empty();\n\t\tInputPressedActionNames.Empty();\n\t}\n\n\tFORCEINLINE bool IsAnyUIInputPressed() const { return UIInputPressedCommands.Num() > 0;  }\n\tFORCEINLINE int32 GetNumUIInputsPressed() const { return UIInputPressedCommands.Num(); }\n\tFORCEINLINE bool IsUIInputPressed(ESoUICommand Command) { return UIInputPressedCommands.Contains(Command); }\n\n\t// AND, all must be pressed\n\tFORCEINLINE bool AreUIInputsPressed(const TSet<ESoUICommand>& Commands) const\n\t{\n\t\treturn UIInputPressedCommands.Includes(Commands);\n\t}\n\n\t// OR, one of the following must be present\n\tFORCEINLINE bool AreAnyUIInputsPressed(const TSet<ESoUICommand>& Commands) const\n\t{\n\t\treturn UIInputPressedCommands.Intersect(Commands).Num() > 0;\n\t}\n\n\t// Tracks the input press released for the action name\n\tvoid TrackInputPressReleased(UInputComponent* InInputComponent, FName ActionName, bool bTrackWhenPaused = false);\n\n\t// Tells us which commands are pressed released\n\tvoid InputPressed(FName ActionName);\n\tvoid InputReleased(FName ActionName);\n\n\tUFUNCTION()\n\tvoid HandleDeviceTypeChanged(ESoInputDeviceType InDeviceType);\n\n\t// called each frame with the movement axis (a-d or gamepad left stick)\n\tvoid Move(float Value);\n\n\t// called on gamepad right stick\n\tvoid MoveGamepadRightX(float Value) { GamepadRightX = Value; }\n\tvoid MoveGamepadRightY(float Value) { GamepadRightY = Value; }\n\n\t// called on gamepad left stick\n\tvoid MoveGamepadLeftX(float Value) { GamepadLeftX = Value; }\n\tvoid MoveGamepadLeftY(float Value) { GamepadLeftY = Value; }\n\n\tbool IsToggleSpellsPressed() const;\n\n\t// used only for edit, cause the mouse is removed from the game\n\tvoid LeftClickPressed();\n\tvoid LeftClickReleased() { bLeftMouseBtnPressed = false; }\n\n\tvoid RightClickPressed();\n\tvoid RightClickReleased() { bRightMouseBtnPressed = false; }\n\n\t// press & hold\n\tvoid RollPressed();\n\tvoid RollReleased() { bRollPressed = false; }\n\n\tUFUNCTION(BlueprintCallable, Category = UI)\n\tvoid HandleUICommand(FKey Key, ESoUICommand Command);\n\n\tvoid LockFaceDirectionPressed();\n\tvoid LockFaceDirectionReleased();\n\n\tvoid Strike0Pressed();\n\tvoid Strike1Pressed();\n\n\tvoid JumpPressed();\n\n\t// SkyDiving\n\tvoid UmbrellaPressed() { bUmbrellaPressed = true; }\n\n\tUFUNCTION(BlueprintCallable)\n\tvoid UmbrellaReleased() { bUmbrellaPressed = false; }\n\n\tvoid ToggleWeapons();\n\tvoid ToggleItems();\n\tvoid ToggleSpells(bool bQuickSelectionMode);\n\n\tvoid UseItemFromSlot0();\n\tvoid SuperEditModePressed();\n\tvoid ToggleCharacterPanels();\n\n\tvoid QuickSaveLoad0() { QuickSaveLoad(42); }\n\tvoid QuickSaveLoad1() { QuickSaveLoad(43); }\n\tvoid QuickSaveLoad(int32 Index);\n\n\tUFUNCTION(BlueprintCallable, Category = Combat)\n\tvoid TakeWeaponAway();\n\n\tvoid Interact0();\n\tvoid Interact1();\n\n\t// Video\n\tvoid StartVideoLoopPlayback();\n\tvoid StartVideoLoopPlaybackGamepad();\n\tvoid StopVideoLoopPlayback();\n\n\t// Demo\n\tvoid RestartDemo();\n\n\t// used for quick tests\n\tUFUNCTION(BlueprintCallable)\n\tvoid DebugFeature();\n\n\t// used or quick tests in bp, called by DebugFeature()\n\tUFUNCTION(BlueprintImplementableEvent)\n\tvoid OnDebugButtonPressed();\n\n\t// used by the mechanism which stops the user from bouncing via space spam\n\tvoid JumpPressedRecentlyTimeOver();\n\t// </Input bindings>\n\t///////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n\n\t///////////////////////////////////////////////////////////////////////////////////////////////////////////\n\t// <checkpoint>\n\tUFUNCTION(BlueprintCallable, Category = Health)\n\tbool IsSoulkeeperActive() const;\n\n\tbool CanUseSoulkeeperAtLocation() const { return bCanUseSoulkeeper; }\n\n\tUFUNCTION(BlueprintImplementableEvent)\n\tvoid OnDeathBP(bool bWithSoulkeeper);\n\n\tUFUNCTION(BlueprintImplementableEvent)\n\tvoid OnRespawn(bool bSoulkeeperUsed);\n\n\t/** special hit react, BP spawns destructible mesh */\n\tUFUNCTION(BlueprintImplementableEvent)\n\tvoid OnBreakIntoPieces();\n\n\t/** called only if it was broken into peaces */\n\tUFUNCTION(BlueprintImplementableEvent)\n\tvoid OnRematerialized();\n\n\n\t/** resets player stats and events are fired to reset the world! */\n\tUFUNCTION(BlueprintCallable, Category = Health)\n\tvoid Revive(bool bSoulKeeper, bool bCanUseSplineOverrideLocation = false, bool bWantToLeaveSpline = false);\n\n\tUFUNCTION(BlueprintCallable, Category = Health)\n\tvoid FireEventsAsIfRespawned();\n\n\n\tUFUNCTION(BlueprintCallable, Category = ResRune)\n\tbool SpawnResRune();\n\n\tUFUNCTION(BlueprintCallable, Category = ResRune)\n\tvoid PickupResRune();\n\n\tUFUNCTION(BlueprintCallable, Category = Checkpoint)\n\tvoid SetActiveCheckpointLocationName(FName LocationName);\n\n\tFName GetActiveCheckpointLocationName() const;\n\n\tUFUNCTION(BlueprintCallable, Category = Checkpoint)\n\tvoid SetCheckpointLocation(const FSoSplinePoint& InSplinePoint, const float ZValue);\n\n\t// Updates the current location of the Character to the CheckPoint indentified by CheckPointName\n\tUFUNCTION(BlueprintCallable, Category = Checkpoint)\n\tvoid TeleportToCheckpointName(FName CheckPointName, bool bPerformTeleportation = true);\n\n\t// Helper method for TeleportToCheckpointName that updates the location of the character to the active checkpoint name\n\tUFUNCTION(BlueprintCallable, Category = Checkpoint)\n\tvoid TeleportToActiveCheckpointName();\n\t// </checkpoint>\n\t///////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n\n\t///////////////////////////////////////////////////////////////////////////////////////////////////////////\n\t// <item>\n\tUFUNCTION(BlueprintCallable, Category = Item)\n\tbool AddItem(const FSoItem& Item, bool bPrintInDlgLog = false);\n\n\t/* removes the first item instance with matching template */\n\tUFUNCTION(BlueprintCallable, Category = Item)\n\tbool RemoveItem(const USoItemTemplate* Template, bool bPrintInDlgLog = false);\n\n\tUFUNCTION(BlueprintCallable, Category = Item)\n\tbool CanEquipToSlot(ESoItemSlot ItemSlot) const;\n\t// </item>\n\t///////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n\n\t///////////////////////////////////////////////////////////////////////////////////////////////////////////\n\t// <misc>\n\n\tbool CanPauseOnIdle() const;\n\n\tUFUNCTION(BlueprintCallable, BlueprintImplementableEvent)\n\tvoid ShowCharacterBP(bool bInstant);\n\n\tUFUNCTION()\n\tvoid ShowCharacter() { ShowCharacterBP(true); }\n\n\tUFUNCTION(BlueprintCallable, BlueprintImplementableEvent)\n\tvoid HideCharacterBP(bool bInstant);\n\n\tvoid ForceHideWeapon(float Duration, bool bPrimary);\n\tUFUNCTION(BlueprintCallable)\n\tvoid ClearForceHideWeapon();\n\n\n\tUFUNCTION(BlueprintCallable, Category = AnimationIssue)\n\tvoid SetAnimInstanceClassFixed(UClass* NewClass);\n\n\tvoid OnChapterLoaded();\n\n\tvoid CheckSelfTrainedAchievement();\n\n\tvoid SetInterruptedWizardDialogue(UDlgContext* Context) { InterruptedWizardDialogue = Context; }\n\tUDlgContext* GetInterruptedWizardDialogue() { return InterruptedWizardDialogue; }\n\n\tUFUNCTION(BlueprintCallable, Category = Health)\n\tvoid SufferOverlapDamage(AActor* SourceActor, const FSoDmg& Damage, const FSoHitReactDesc& HitReactDesc);\n\n\t/** return value true: overlap dmg can be called */\n\tUFUNCTION(BlueprintCallable, Category = Health)\n\tbool PreOverlapDamage(AActor* SourceActor);\n\n\n\tUFUNCTION(BlueprintCallable, Category = Health)\n\tvoid OnWalkThroughEnemy(AActor* Enemy);\n\n\tUFUNCTION(BlueprintPure)\n\tbool HasDamageBlock() const { return DamageBlockCounter > 0.0f; }\n\n\n\tbool IsSaveAllowed() const;\n\n\tUFUNCTION(BlueprintImplementableEvent, BlueprintCallable, Category = Material)\n\tvoid UpdateMaterialBP();\n\n\tUFUNCTION(BlueprintImplementableEvent)\n\tvoid SetEditorWidgetVisibility(ESoEditorUI Editor, bool bShow);\n\n\tUFUNCTION(BlueprintImplementableEvent)\n\tvoid OnPostQuickTravelBP(FVector OldLocation);\n\n\tUFUNCTION(BlueprintImplementableEvent)\n\tvoid OnRandomNewFunction(FVector OldLocation);\n\n\tUFUNCTION(BlueprintCallable, Category = Camera)\n\tvoid SetCameraLagEnabled(bool bEnabled);\n\n\n\tUFUNCTION(BlueprintCallable)\n\tvoid SetMusicOverride(UFMODEvent* Music, bool bInstantOverride = false, UObject* Requester = nullptr);\n\n\tUFUNCTION(BlueprintCallable)\n\tvoid ClearMusicOverrideFromRequester(UObject* Requester);\n\n\n\tUFUNCTION(BlueprintCallable)\n\tvoid AddBounceSFXOverride(ASoBounceSFXOverrideBox* SFXOverride);\n\n\tUFUNCTION(BlueprintCallable)\n\tvoid RemoveBounceSFXOverride(ASoBounceSFXOverrideBox* SFXOverride);\n\n\tUFMODEvent* GetBounceSFX(int32 Level) const;\n\n\n\tUFUNCTION(BlueprintCallable)\n\tvoid UpdateMusic(bool bSkipRequestDelay);\n\n\tUFUNCTION(BlueprintCallable)\n\tvoid FadeAndKillDestructible(ADestructibleActor* Destructible);\n\n\tUFUNCTION(BlueprintCallable, Category = Camera)\n\tvoid FadeOutMesh(AStaticMeshActor* MeshToFade, float Speed, bool bCanHide = true);\n\n\tUFUNCTION(BlueprintCallable, Category = Camera)\n\tvoid FadeInMesh(AStaticMeshActor* MeshToFade, float Speed);\n\n\tUFUNCTION(BlueprintCallable, Category = Camera)\n\tvoid FadeOutMeshes(TArray<AStaticMeshActor*> MeshesToFade, float Speed, bool bCanHide = true);\n\n\tUFUNCTION(BlueprintCallable, Category = Camera)\n\tvoid FadeInMeshes(TArray<AStaticMeshActor*> MeshesToFade, float Speed);\n\n\tUFUNCTION(BlueprintCallable, Category = Camera)\n\tvoid AddToOrientTowardsCameraList(USceneComponent* SceneComponentToAdd) { OrientTowardsCameraList.Add(SceneComponentToAdd); }\n\n\tUFUNCTION(BlueprintCallable, Category = Camera)\n\tvoid RemoveFromOrientTowardsCameraList(USceneComponent* SceneComponentToRemove) { OrientTowardsCameraList.RemoveSwap(SceneComponentToRemove); }\n\n\tUFUNCTION(BlueprintCallable, Category = Camera)\n\tvoid AddToEnemyHPWidgetList(USceneComponent* SceneComponentToAdd) { EnemyHPWidgetList.AddUnique(SceneComponentToAdd); }\n\n\tUFUNCTION(BlueprintCallable, Category = Camera)\n\tvoid RemoveFromEnemyHPWidgetList(USceneComponent* SceneComponentToRemove) { EnemyHPWidgetList.RemoveSwap(SceneComponentToRemove); }\n\n\t// Switches from ingame ui to default\n\tvoid SwitchFromUI();\n\n\n\tUFUNCTION(BlueprintPure)\n\tbool IsInDialogue() const;\n\n\tUFUNCTION(BlueprintCallable, Category = CameraFade)\n\tvoid CallFadeFromBlackInstant() { FadeFromBlackInstant.Broadcast(); }\n\n\n\tUFUNCTION(BlueprintCallable, meta=(ScriptName=\"SetForceHideInteractionTip\"))\n\tvoid ForceHideInteractionTip(bool bHide)\n\t{\n\t\tbForceHideInteractionTip = bHide;\n\t\tOnInteractionLabelChanged.Broadcast();\n\t}\n\n\t// </misc>\n\t///////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n\n\t///////////////////////////////////////////////////////////////////////////////////////////////////////////\n\t// <Getter functions>\n\tUFUNCTION(BlueprintPure, Category = State)\n\tEActivity GetActivity() const;\n\n\tUSoPlayerCharacterSheet* GetPlayerCharacterSheet() const { return SoPlayerCharacterSheet; }\n\tUSoInventoryComponent* GetInventory() { return SoInventory; }\n\n\tUFUNCTION(BlueprintCallable, Category = Inventory)\n\tconst USoInventoryComponent* GetInventory() const { return SoInventory; }\n\n\tUFUNCTION(BlueprintCallable, Category = Dialogue)\n\tUSoWizard* GetWizard() const { return SoWizard; }\n\n\tUSoPlayerProgress* GetPlayerProgress() const { return SoPlayerProgress; }\n\tUSoAnalyticsComponent* GetAnalyticsComponent() const { return SoAnalytics; }\n\tUSoUISystem* GetUISystem() const { return UISystem; }\n\tUSoUIVideoPlayer* GetUIVideoPlayer() const;\n\tUSoUIMenuMain* GetUIMainMenu() const;\n\tbool IsMainMenuOpened() const;\n\n\tUFUNCTION(BlueprintCallable, Category = UI)\n\tvoid InitUISystem();\n\n\tAPlayerController* GetPlayerController() const;\n\tASoPlayerController* GetSoPlayerController() const;\n\n\tconst TArray<FSoCooldownCounter>& GetCooldowns() const { return Cooldowns; }\n\n\tFSoCooldownChanged& OnCooldownStarted() { return CooldownStarted; }\n\tFSoCooldownChanged& OnCooldownEnded() { return CooldownEnded; }\n\tFSoCooldownChanged& OnCooldownBlocksEvent() { return CooldownBlocksEvent; }\n\n\tFSoNotify& OnCanUseSoulKeeperChanged() { return CanUseSoulkeeperChanged; }\n\n\tFSoNotify& OnToggleUI() { return ToggleUI; }\n\n\t// </Getter functions>\n\t///////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n\t///////////////////////////////////////////////////////////////////////////////////////////////////////////\n\t// <Combat>\n\n\t/** setups the visual for the input item, changes the weapon(s) to visible but does not activate collision */\n\tvoid SelectWeapon(const FSoItem& Item);\n\n\t/** disable && hide weapon, clear rootmotion, maybe increase collision size */\n\tvoid OnArmedStateLeft();\n\n\t// </Combat>\n\t///////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n\n\t///////////////////////////////////////////////////////////////////////////////////////////////////////////\n\t// <Interactions>\n\tUFUNCTION(BlueprintCallable, Category = \"Interaction\")\n\tvoid AddInteractable(AActor* Interactable);\n\n\tUFUNCTION(BlueprintCallable, Category = \"Interaction\")\n\tvoid RemoveInteractable(AActor* Interactable);\n\n\tUFUNCTION(BlueprintCallable, Category = \"Interaction\")\n\tvoid RemoveAllInteractable();\n\n\tvoid SwitchActiveInteractable();\n\n\t/**  Returns data for UI */\n\tUFUNCTION(BlueprintCallable, Category = Interaction)\n\tAActor* GetInteractionTipRelevantData(int32 Index, bool& bVisible, bool& bPrimaryKey);\n\n\tUFUNCTION(BlueprintCallable, Category = Interaction)\n\tvoid StartCarryStuff(ASoCarryable* Stuff);\n\n\tUFUNCTION(BlueprintCallable, Category = Interaction)\n\tvoid StartLeverPush(const struct FSoLeverData& LeverData, const FSoSplinePoint& SplinePoint, float ZValue);\n\n\tUFUNCTION(BlueprintCallable, BlueprintPure, Category = Interaction)\n\tint32 GetAvailableInteractableNum() const { return Interactables.Num(); }\n\n\tUFUNCTION(BlueprintCallable, BlueprintPure, Category = Interaction)\n\tAActor* GetActiveInteractable() const { return ActiveInteractable < Interactables.Num() ? Interactables[ActiveInteractable] : nullptr; }\n\n\tUFUNCTION(BlueprintCallable, BlueprintPure, Category = Interaction)\n\tint32 GetActiveInteractableIndex() const { return ActiveInteractable; }\n\n\tUFUNCTION(BlueprintCallable, BlueprintPure, Category = Interaction)\n\tAActor* GetInteractable(int32 Index) const { return Index < Interactables.Num() ? Interactables[Index] : nullptr; }\n\n\tUFUNCTION(BlueprintCallable, Category = Interaction)\n\tvoid RequestInteractionMessageDisplay() { OnInteractableMessageRequested.Broadcast(); }\n\n\tUFUNCTION(BlueprintCallable, Category = Interaction)\n\tvoid RequestInteractionMessageHide() { OnInteractableMessageHideRequest.Broadcast(); }\n\n\tUFUNCTION(BlueprintCallable, Category = Interaction)\n\tvoid RequestForcedAreaChange(const FText& AreaName) { OnForcedAreaChange.Broadcast(AreaName); }\n\n\tUFUNCTION(BlueprintCallable, BlueprintPure, Category = Interaction)\n\tbool CouldSwing() const;\n\n\tUFUNCTION(BlueprintCallable, Category = Movement)\n\tvoid RemoveSkyDiveField(AActor* SkyDiveField);\n\n\tvoid AddSwingCenter(ASoSwingCenter* SwingCenter) { SwingCenters.AddUnique(SwingCenter); OnInteractionLabelChanged.Broadcast(); }\n\tvoid RemoveSwingCenter(ASoSwingCenter* SwingCenter) { SwingCenters.Remove(SwingCenter); OnInteractionLabelChanged.Broadcast(); }\n\t// </Interactions>\n\t///////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n\n\t///////////////////////////////////////////////////////////////////////////////////////////////////////////\n\t// <Movement>\n\n\tUFUNCTION(BlueprintCallable, Category = Movement)\n\tvoid OverrideFloatingVelocity(bool bOverride, float OverrideValue = -200.0f);\n\n\t// Teleport character to the specified InSplinePoint\n\tbool SetPositionOnSplineSP(const FSoSplinePoint& InSplinePoint,\n\t\t\t\t\t\t\t  float ZValue,\n\t\t\t\t\t\t\t  bool bCollisionChecksAndPutToGround = true,\n\t\t\t\t\t\t\t  bool bStoreAsCheckpoint = false,\n\t\t\t\t\t\t\t  bool bLookBackwards = false);\n\n\tvoid SetMovementStop() { MovementStopMultiplier = 0.0f; }\n\n\t// true if the player pressed the jump button (only once) in the given time interval\n\tFORCEINLINE bool DidPlayerJump() const { return (bJumpPressedRecently && !bBanJumpCauseSpamming); }\n\n\tUFUNCTION(BlueprintImplementableEvent)\n\tvoid OnRollHitBP(const FVector& HitPoint, const FVector& HitNormal, bool bWallHit);\n\n\tUFUNCTION(BlueprintCallable, BlueprintPure, Category = Movement)\n\tbool IsFacingVelocity() const;\n\n\tfloat GetActiveRollJumpHeight() const;\n\tfloat GetRollJumpHeight(int32 JumpLevel) const;\n\n\tUFUNCTION()\n\tvoid OnUmbrellaOverlapBegin(UPrimitiveComponent* OverlappedComponent, AActor* OtherActor, UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult & SweepResult);\n\n\tvoid SpawnBounceEffects(bool bWallJump, const FVector& HitPoint);\n\n\tfloat GetSoundTimeDelayStopSpam() const;\n\tfloat GetLateBounceThreshold() const;\n\tfloat GetForcedToMoveTimeAfterWallJump() const;\n\tfloat GetForcedToMoveTimeAfterHit() const;\n\t// </Movement>\n\t///////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n\n\t///////////////////////////////////////////////////////////////////////////////////////////////////////////\n\t// <CAMERA>\n\tUCameraComponent* GetSideViewCameraComponent() const;\n\tUSoSpringArmComponent* GetCameraBoom() const;\n\n\tint32 GetClosestCamIndex() const;\n\n\tUFUNCTION(BlueprintCallable, BlueprintPure, Category = Camera)\n\tFSoCamKeyNode GetInterpolatedCamData() const;\n\n\tUFUNCTION(BlueprintCallable, BlueprintPure, Category = Camera)\n\tfloat GetLastLandZ() const { return LastLandZ; }\n\n\tUFUNCTION(BlueprintCallable, Category = Camera)\n\tvoid SetCameraFadeOutBlocked(bool bFadeOutBlocked) { bCameraFadeOutBlocked = bFadeOutBlocked; }\n\t// </CAMERA>\n\t///////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n\n\tUFUNCTION()\n\tvoid UpdateCharacterSkin();\n\n\tUFUNCTION(BlueprintImplementableEvent)\n\tvoid UpdateCharacterSkinBP();\n\nprotected:\n\n\t/**\n\t *  Checks if the character capsule can be placed in given location\n\t *  if not then it tries above/below but without teleporting through floor / ceiling\n\t */\n\tFVector CalcSafeSpawnLocationAlongZ(const FSoSplinePoint& SplinePoint, float ZValue, bool& bOutSafeFound);\n\n\t// ???\n\tUFUNCTION(BlueprintCallable, Category = Collision)\n\tvoid OnLandedAnimFinished() {};\n\n\tUFUNCTION(BlueprintCallable, Category = Collision)\n\tvoid DecreaseCollisionSize();\n\tUFUNCTION(BlueprintCallable, Category = Collision)\n\tvoid IncreaseCollisionSize();\n\n\tbool IsCollisionDecreased() const { return bCollisionAlreadyDecreased; }\n\n\tvoid UpdateMeshFade(float DeltaSeconds);\n\n\t// return false if there isn't enough place to stand up\n\tbool CanIncreaseCollision() const;\n\n\tfloat ModifyRollJumpLevel(int32 DeltaLevel);\n\tfloat SetRollJumpLevel(int32 Level);\n\n\n\tUFUNCTION(BlueprintCallable, Category = Camera)\n\tvoid FreezeCameraZ(bool bFreeze);\n\n\tUFUNCTION(BlueprintCallable, Category = Camera)\n\tvoid FreezeCameraZToValue(float ZToFreeze);\n\n\tUFUNCTION(BlueprintCallable, Category = Camera)\n\tvoid SetCameraXDelta(float NewDelta, bool bInstantIn = false);\n\n\tUFUNCTION(BlueprintCallable, Category = Camera)\n\tvoid SetMinCameraZ(bool bUseMin, float MinValue = 0.0f);\n\n\tUFUNCTION(BlueprintCallable, Category = Camera)\n\tvoid SetMaxCameraZ(bool bUseMax, float MaxValue = 0.0f);\n\n\tvoid AddCooldown(const UObject* CooldownObject, float Duration, bool bCanCountInAir);\n\n\tUFUNCTION(BlueprintCallable, Category = Cooldown)\n\tvoid RemoveCooldown(const UObject* CooldownObject);\n\n\tUFUNCTION(BlueprintCallable, Category = Cooldown)\n\tvoid RemoveAllCooldown();\n\n\t// only applied if it is not yet added\n\tUFUNCTION(BlueprintCallable, Category = Weapon)\n\tvoid AddWeaponBoost(const FSoWeaponBoost& BoostToAdd);\n\n\tUFUNCTION(BlueprintCallable, Category = Weapon)\n\tvoid RemoveWeaponBoost(USoEffectBase* AssociatedEffect);\n\n\tUFUNCTION(BlueprintCallable, Category = Weapon)\n\tconst TArray<FSoWeaponBoost>& GetWeaponBoosts() { return WeaponBoosts; }\n\n\n\tUFUNCTION(BlueprintCallable, Category = MusicLevel)\n\tvoid OverrideAllMovementSpeed(float NewSpeed);\n\n\tUFUNCTION(BlueprintCallable, Category = MusicLevel)\n\tvoid UseMovementOverride(bool bUse, float OverrideValue);\n\n\n\t///////////////////////////////////////////////////////////////////////////////////////////////////////////\n\t// <camera edit functions>\n#if WITH_EDITOR\n\tvoid SaveEditedData();\n\tvoid LoadEditedData();\n\n\tvoid SwitchCameraEditMode();\n\tvoid SwitchSkyEditMode();\n\tvoid SwitchCharShadowEditMode();\n\n\tvoid CreateKey();\n\tvoid MoveClosestKeyHere();\n\tvoid DeleteActiveKeyNode();\n\n\tvoid CopyActiveKeyData();\n\tvoid PasteToActiveKeyData();\n\n\tvoid JumpToNextKey();\n\tvoid JumpToPrevKey();\n\n\tvoid SpecialEditButtonPressed0();\n\tvoid SpecialEditButtonPressed1();\n\n\tvoid CtrlPressed() { bCtrlPressed = true; }\n\tvoid CtrlReleased() { bCtrlPressed = false; }\n\n\tvoid MiddleMouseBtnPressed() { bMiddleMousePressed = true; }\n\tvoid MiddleMouseBtnReleased() { bMiddleMousePressed = false; }\n#endif\n\t// </camera edit functions>\n\t///////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n\n\t///////////////////////////////////////////////////////////////////////////////////////////////////////////\n\t// <Key Lights>\n\n\tUFUNCTION(BlueprintImplementableEvent, BlueprintCallable)\n\tvoid PlayHitReactLightEffectBP();\n\n\tUFUNCTION(BlueprintImplementableEvent, BlueprintCallable)\n\tvoid PlayHealLightEffectBP();\n\n\tUFUNCTION(BlueprintImplementableEvent, BlueprintCallable)\n\tvoid PlayInstantLightEffectBP(FLinearColor Color, float PlayRate = 1.0f);\n\n\tUFUNCTION(BlueprintImplementableEvent, BlueprintCallable)\n\tvoid RefreshDefaultKeyLights();\n\n\tUFUNCTION(BlueprintImplementableEvent, BlueprintCallable)\n\tvoid RefreshDefaultKeyMovementLights();\n\t// </Key Lights>\n\t///////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n\n\t///////////////////////////////////////////////////////////////////////////////////////////////////////////\n\t// VARIABLES\npublic:\n\tconst FName ActiveDisplayNameName = FName(\"DisplayName\");\n\tconst FName DoubleJumpName = FName(\"bDoubleJump\");\n\tconst FName UmbrellaName = FName(\"bUmbrella\");\n\n\tconst FName WallJumpDoneName = FName(\"bMaxWallJumpDone\");\n\tconst FName MaxBounceDoneName = FName(\"bMaxBounceDone\");\n\npublic:\n\tstatic bool bEnableQuickSaveLoad;\n\n\t///////////////////////////////////////////////////////////////////////////////////////////////////////////\n\t// <Activities>\n\tUPROPERTY(BlueprintReadOnly)\n\tUSoActivity* SoActivity;\n\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, NoClear, Instanced, Category = Activity)\n\tUSoADead* SoADead;\n\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, NoClear, Instanced, Category = Activity)\n\tUSoAHitReact* SoAHitReact;\n\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, NoClear, Instanced, Category = Activity)\n\tUSoADefault* SoADefault;\n\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, NoClear, Instanced, Category = Activity)\n\tUSoALillian* SoALillian;\n\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, NoClear, Instanced, Category = Activity)\n\tUSoARoll* SoARoll;\n\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, NoClear, Instanced, Category = Activity)\n\tUSoASlide* SoASlide;\n\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, NoClear, Instanced, Category = Activity)\n\tUSoASwing* SoASwing;\n\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, NoClear, Instanced, Category = Activity)\n\tUSoAAiming* SoAAiming;\n\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, NoClear, Instanced, Category = Activity)\n\tUSoAWeaponInArm* SoAWeaponInArm;\n\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, NoClear, Instanced, Category = Activity)\n\tUSoAStrike* SoAStrike;\n\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, NoClear, Instanced, Category = Activity)\n\tUSoALeverPush* SoALeverPush;\n\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, NoClear, Instanced, Category = Activity)\n\tUSoACarry* SoACarry;\n\n\t// UPROPERTY(BlueprintReadOnly, EditAnywhere, NoClear, Instanced, Category = Activity)\n\t// USoACarryPickUp* SoACarryPickUp;\n\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, NoClear, Instanced, Category = Activity)\n\tUSoACarryDrop* SoACarryDrop;\n\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, NoClear, Instanced, Category = Activity)\n\tUSoAInUI* SoAInUI;\n\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, NoClear, Instanced, Category = Activity)\n\tUSoAItemUsage* SoAItemUsage;\n\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, NoClear, Instanced, Category = Activity)\n\tUSoAInteractWithEnvironment* SoAInteractWithEnvironment;\n\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, NoClear, Instanced, Category = Activity)\n\tUSoAWait* SoAWait;\n\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, NoClear, Instanced, Category = Activity)\n\tUSoASoAWaitForActivitySwitch* SoASoAWaitForActivitySwitch;\n\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, NoClear, Instanced, Category = Activity)\n\tUSoATeleport* SoATeleport;\n\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, NoClear, Instanced, Category = Activity)\n\tUSoACameraEdit* SoACameraEdit;\n\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, NoClear, Instanced, Category = Activity)\n\tUSoASkyControlEdit* SoASkyControlEdit;\n\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, NoClear, Instanced, Category = Activity)\n\tUSoACharShadowEdit* SoACharShadowEdit;\n\t// </Activities>\n\t///////////////////////////////////////////////////////////////////////////////////////////////////////////\n\nprotected:\n\n\tUPROPERTY(BlueprintAssignable)\n\tFSoNotifyIntModified OnIntModified;\n\n\t///////////////////////////////////////////////////////////////////////////////////////////////////////////\n\t// <Hitreact & Checkpoint>\n\npublic:\n\n\tUPROPERTY(BlueprintAssignable)\n\tFSoWaitForLevelShow OnWaitForLevelShowStart;\n\n\tUPROPERTY(BlueprintAssignable)\n\tFSoNotify OnWaitForLevelShowEnd;\n\n\tUPROPERTY(BlueprintAssignable)\n\tFSoNotify OnMainLoadingScreenShow;\n\n\n\tUPROPERTY(BlueprintAssignable)\n\tFSoNotify FadeToBlack;\n\n\tUPROPERTY(BlueprintAssignable)\n\tFSoNotify FadeFromBlack;\n\n\tUPROPERTY(BlueprintAssignable)\n\tFSoNotify FadeToBlackInstant;\n\n\tUPROPERTY(BlueprintAssignable)\n\tFSoNotify FadeFromBlackInstant;\n\n\n\t/** Respawn near Soulkeeper/Checkpoint/Soultrap */\n\tUPROPERTY(BlueprintAssignable)\n\tFSoNotify OnPlayerRespawn;\n\n\t/** Respawn near Checkpoint, Soulkeeper or RematerializationPoint (after a Death or BreakIntoPeaces/FallToDeath HitReact) */\n\tUPROPERTY(BlueprintAssignable)\n\tFSoNotify OnPlayerRematerialized;\n\n\tUPROPERTY(BlueprintAssignable)\n\tFSoNotify OnDamageTaken;\n\n\tUPROPERTY(BlueprintAssignable)\n\tFSoNotifyActor OnOverlapDamageTaken;\n\n\tUPROPERTY(BlueprintAssignable)\n\tFSoNotifyActor OnWalkThroughMortal;\n\n\n\tUPROPERTY(BlueprintAssignable)\n\tFSoNotify OnDamageImmunityOver;\n\n\tUPROPERTY(BlueprintAssignable, BlueprintReadWrite)\n\tFSoNotify OnWorthyStatusGained;\n\n\tUFUNCTION(BlueprintCallable)\n\tvoid FireWorthyStatusGained() { OnWorthyStatusGained.Broadcast(); }\n\n\tFTimerHandle ShowCharacterTimer;\n\nprotected:\n\tUPROPERTY()\n\tUSoGameInstance* GameInstance = nullptr;\n\n\tFSoSplinePoint ActiveCheckPointLocation;\n\tfloat ActiveCheckpointZLocation;\n\n\t// resurrection location\n\tFSoSplinePoint ResLocation;\n\tfloat ResLocationZValue = 0;\n\n\t// spawned in blueprint beginplay, hidden by default\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere, Category = ResRune)\n\tASoInteractableActor* ResRuneVisualActor;\n\n\n\tUPROPERTY(BlueprintReadWrite, Category = Health)\n\tbool bShieldActive = false;\n\n\tUPROPERTY(BlueprintReadOnly, Category = Health)\n\tfloat ActualOPValue = 1.0f;\n\n\tbool bLastRespawnWasSK = false;\n\n\tUPROPERTY(EditAnywhere, Category = Health)\n\tUSoItemTemplateRuneStone* SoulKeeperSpell;\n\n\n\tUPROPERTY(EditAnywhere, BlueprintReadOnly, Category = MatData)\n\tFVector SmokeColorDefault = FVector(1.0f, 1.0f, 1.0f);\n\n\tUPROPERTY(EditAnywhere, BlueprintReadOnly, Category = MatData)\n\tFVector SmokeColorRoll = FVector(1.0f, 0.0f, 1.0f);\n\n\tUPROPERTY(EditAnywhere, BlueprintReadOnly, Category = MatData)\n\tFVector SmokeColorSwing = FVector(1.0f, 0.0f, 0.0f);\n\n\n\tUPROPERTY(EditAnywhere, BlueprintReadOnly, Category = MatData)\n\tFVector GlowSphereColorDefault = FVector(0.0f, 0.889458f, 1.0f);\n\n\tUPROPERTY(EditAnywhere, BlueprintReadOnly, Category = MatData)\n\tFVector GlowSphereColorRoll = FVector(0.5f, 0.9f, 4.0f);\n\n\tUPROPERTY(EditAnywhere, BlueprintReadOnly, Category = MatData)\n\tFVector GlowSphereColorSwing = FVector(1.0f, 0.0f, 0.0f);\n\n\tFVector CurrentSmokeColor;\n\tFVector CurrentGlowSphereColor;\n\n\n\t// <Hitreact & Checkpoint>\n\t///////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n\n\t///////////////////////////////////////////////////////////////////////////////////////////////////////////\n\t// <Components>\n\n\tUPROPERTY(VisibleAnywhere, BlueprintReadWrite, Category = Camera)\n\tUCameraComponent* SideViewCameraComponent;\n\n\tUPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = Camera)\n\tUSoSpringArmComponent* CameraBoom;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Equipment)\n\tUSkeletalMeshComponent* LillianMesh;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Equipment)\n\tFRotator WeaponLocalRot;\n\n\t//\n\t// Cam Effects\n\t//\n\tUPROPERTY(EditAnywhere, Category = FX)\n\tTSubclassOf<UCameraShake> HitReactCamShake;\n\n\tUPROPERTY(EditAnywhere, Category = FX)\n\tUForceFeedbackEffect* HitReactControllerVibration;\n\n\t//\n\t// VFX\n\t//\n\n\tUPROPERTY(EditAnywhere, Category = VFX)\n\tUParticleSystemComponent* WeatherVFX = nullptr;\n\n\tUPROPERTY(EditAnywhere, Category = VFX)\n\tUParticleSystemComponent* CapsuleBottomVFX = nullptr;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = VFX)\n\tUParticleSystemComponent* SoQuickTeleportPre = nullptr;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = VFX)\n\tUParticleSystemComponent* SoQuickTeleportPost = nullptr;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = VFX)\n\tUParticleSystemComponent* SoBreak = nullptr;\n\n\tUPROPERTY(EditAnywhere, Category = VFX)\n\tUParticleSystemComponent* SoResVFX = nullptr;\n\n\tUPROPERTY(EditAnywhere, Category = VFX)\n\tUParticleSystemComponent* SoResCPVFX = nullptr;\n\n\tUPROPERTY(EditAnywhere, Category = VFX)\n\tUParticleSystemComponent* SoFloatVFXNew = nullptr;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = VFX)\n\tUParticleSystemComponent* SoNewSmoke = nullptr;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = VFX)\n\tUParticleSystemComponent* SoNewLights = nullptr;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Collision)\n\tUStaticMeshComponent* SoGlowSphere;\n\n\t//\n\t// SFX\n\t//\n\n\tUPROPERTY(EditAnywhere, Category = SFX)\n\tUFMODAudioComponent* SlideSFX;\n\n\tUPROPERTY(EditAnywhere, Category = SFX)\n\tUFMODAudioComponent* RollSFX;\n\n\tUPROPERTY(EditAnywhere, Category = SFX)\n\tUFMODAudioComponent* FloatStartSFX;\n\n\tUPROPERTY(EditAnywhere, Category = SFX)\n\tUFMODAudioComponent* FloatStopSFX;\n\n\tUPROPERTY(EditAnywhere, Category = VFX)\n\tUFMODAudioComponent* SoResSFX = nullptr;\n\n\tUPROPERTY(EditAnywhere, Category = VFX)\n\tUFMODAudioComponent* SoResCPSFX = nullptr;\n\n\tUPROPERTY(EditAnywhere, Category = SFX)\n\tUFMODAudioComponent* JumpSFX;\n\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = CharacterSheet)\n\tUSoInventoryComponent* SoInventory;\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = CharacterSheet)\n\tUSoPlayerCharacterSheet* SoPlayerCharacterSheet;\n\n\t/** Class writing the notes */\n\tUPROPERTY(EditAnywhere, BlueprintReadOnly, Category = Progress)\n\tUSoPlayerProgress* SoPlayerProgress;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadOnly, Category = Analytics)\n\tUSoAnalyticsComponent* SoAnalytics;\n\n\t// weapon in right hand\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Equipment)\n\tUStaticMeshComponent* SoSword;\n\t// weapon in left hand\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Equipment)\n\tUStaticMeshComponent* SoOffHandWeapon;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Equipment)\n\tUParticleSystemComponent* SoSwordFX;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Equipment)\n\tUParticleSystemComponent* SoOffHandWeaponFX;\n\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Equipment)\n\tUStaticMeshComponent* SoItemMesh;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Equipment)\n\tUSceneComponent* SoCenterNew;\n\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere)\n\tUSoProjectileSpawnerComponent* WeaponProjectileSpawner;\n\n\t// </Components>\n\t///////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n\t///////////////////////////////////////////////////////////////////////////////////////////////////////////\n\t// <Dialogues>\n\tUPROPERTY(EditAnywhere, Category = \"Dialogues\")\n\tFSoDialogueParticipantData DialogueData;\n\n\tUPROPERTY(EditAnywhere, Category = \"Dialogues\")\n\tTMap<FName, FText> DialogueDisplayNameMap;\n\n\tUPROPERTY(BlueprintAssignable, Category = \"Dialogue\")\n\tFSoDlgIntModified OnDlgIntModified;\n\n\tUPROPERTY(BlueprintAssignable, Category = \"Dialogue\")\n\tFSoDlgItemChange OnDlgItemChange;\n\t// </Components>\n\t///////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n\t///////////////////////////////////////////////////////////////////////////////////////////////////////////\n\t// <Input>\n\n\t// The *Pressed tells us if the that button/key/keys is/are pressed\n\tUPROPERTY(BlueprintReadOnly)\n\tbool bRollPressed = false;\n\n\t// Some UI is blocking the game input\n\tbool bGameInputBlockedByUI = false;\n\n\t// Tracks all pressed UI command\n\tTSet<ESoUICommand> UIInputPressedCommands;\n\n\t// Tracks all pressed input action names\n\tTSet<FName> InputPressedActionNames;\n\n\tbool bLockForwardVecPressed = false;\n\tbool bUmbrellaPressed = false;\n\tbool bMiddleMousePressed = false;\n\tbool bCtrlPressed = false;\n\tbool bLeftMouseBtnPressed = false;\n\tbool bRightMouseBtnPressed = false;\n\n\tbool bSpecialStrikeWasRequestedLast = false;\n\n\tbool bJumpPressedRecently = false;\n\tbool bBanJumpCauseSpamming = false;\n\n\tFTimerHandle JumpPressedRecentlyTimer;\n\tFTimerHandle LegLandRecentlyTimer;\n\n\t// In real time\n\tUPROPERTY(EditAnywhere)\n\tfloat ThresholdOpenQuickSelection = 0.1f;\n\n\tUPROPERTY(BlueprintReadOnly)\n\tfloat DamageBlockCounter = -1.0f;\n\n\tUPROPERTY(EditAnywhere)\n\tfloat DamageBlockTime = 0.5f;\n\n\tUPROPERTY(EditAnywhere)\n\tfloat DamageBlockTimeMelee = 1.0f;\n\n\tUPROPERTY(BlueprintReadWrite)\n\tbool bBounceAndDamageOverlapSpellUsed = false;\n\n\tUPROPERTY(BlueprintReadWrite)\n\tfloat BounceAndDamageOverlapSpellDamage = 12.0f;\n\n\t// Accumulated in Tick\n\tfloat TickQuickSelectionSum = 0.f;\n\n\t// </Input>\n\t///////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n\t///////////////////////////////////////////////////////////////////////////////////////////////////////////\n\t// <Movement>\n\t// Keep track of the last used\n\tUPROPERTY(BlueprintReadOnly)\n\tFName LastTeleportedCheckpointName = FName(TEXT(\"sgdfhgshduifygh87rh7\"));\n\n\tUPROPERTY(BlueprintReadOnly)\n\tbool bFloatingActive = false;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadOnly, Category = Movement)\n\tfloat FloatingVelocity = -200.f;\n\n\tUPROPERTY(BlueprintReadOnly, Category = Movement)\n\tbool bLandedRecently = false;\n\n\n\tint32 ActiveRollJumpLevel;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadOnly, Category = Movement)\n\tfloat LateBounceThreshold = 0.2f;\n\n\tfloat LastMissedBounceTime = -1.0f;\n\tint32 MissedBounceLevel = -1;\n\tfloat MissedBounceLocationZ = -1;\n\n\tbool bCollisionAlreadyDecreased;\n\n\tfloat ForcedMovementCounter = -1.0f;\n\tfloat ForcedMovementValue = 0.0f;\n\n\t/** static forward run, used for music levels */\n\tUPROPERTY(BlueprintReadWrite)\n\tbool bForceForwardRun = false;\n\n\t/** forced weapon mode, character can't take the weapon away, used for music levels */\n\tUPROPERTY(BlueprintReadWrite)\n\tbool bForceWeaponOn = false;\n\n\n\t// used when character spline related forward dir is fix\n\tFVector StoredForwardVector;\n\n\tbool bFreezeOrientationUntilLand = false;\n\n\t// SavedPostion is used to detect idle\n\tFVector SavedPosition;\n\tfloat IdleTime = 0.0f;\n\n\tbool bAirJumpedSinceLastLand = false;\n\n\tfloat LastJumpTime = -1.0f;\n\tfloat LastSwitchToAirTime = -1.0f;\n\n\n\tUPROPERTY(EditAnywhere, BlueprintReadOnly, Category = MovementConstValue)\n\tTArray<float> RollJumpLevels;\n\n\tUPROPERTY(EditFixedSize, EditAnywhere, BlueprintReadOnly, Category = MovementConstValue)\n\tTArray<float> RollJumpPitches;\n\n\n\t/** if the character jumps in leg mode the RollJumpLevel will be modified to this index. OnLand it is modified back to level 0 */\n\tUPROPERTY(EditAnywhere, BlueprintReadOnly, Category = MovementConstValue)\n\tint32 LegJumpLevelIndex = 1;\n\n\t// space & roll helpers\n\tfloat StoredMovementInputDirOnJump = -1.0f;\n\tfloat StoredTimeOnJump = -1.0f;\n\n\t// Sound\n\tfloat BounceTimeSinceLastSoundPlayed = 0.f;\n\n\t// Used to stop sound spam delay on stairs\n\tconst float SoundTimeDelayStopSpam = 0.2f;\n\npublic:\n\t// used to notify objects before land/bounce\n\tUPROPERTY(BlueprintAssignable)\n\tFSoNotify OnPreLand;\n\n\t// if the character jumped right after land - true landing wasn't performed but the animation system needs this information\n\tUPROPERTY(BlueprintAssignable)\n\tFSoNotify OnLandJump;\n\n\t/** Fired if the player moves from one spline to another */\n\tUPROPERTY(BlueprintAssignable)\n\tFSoSplineChangeNotify OnPlayerSplineChanged;\n\n\tUPROPERTY(BlueprintAssignable)\n\tFSoPlayerSplineChangeNotify OnAreaChanged;\n\n\tUPROPERTY(BlueprintAssignable)\n\tFSoForceAreaEnteredDisplay OnForcedAreaChange;\n\n\tUPROPERTY(BlueprintAssignable)\n\tFSoNotify OnLevelSwitchStart;\n\n\tUPROPERTY(BlueprintAssignable)\n\tFSoNotify OnMovementModeChangedNotify;\n\n\tUPROPERTY(BlueprintAssignable)\n\tFSoNotifyActor OnBounceSpellUsed;\n\n\tUPROPERTY(BlueprintAssignable)\n\tFSoChangeUIVisibilityNotify ChangeUIVisibility;\n\n\tbool bGodMode = false;\n\tbool bFlyCheatOn = false;\n\nprotected:\n\tstatic const FName SpellcasterCapacityName;\n\n\t// some data for the animations, used by roll, swing\n\tUPROPERTY(BlueprintReadWrite, Category = Movement)\n\tfloat DynamicAnimValue = 0.f;\n\n\tUPROPERTY(BlueprintReadWrite, Category = Movement)\n\tbool bAlmostLanded = false;\n\n\tUPROPERTY(BlueprintReadOnly, Category = Movement)\n\tFVector LastInputDirection = FVector{ 0.0f, 0.0f, 0.0f };\n\n\tUPROPERTY(BlueprintReadOnly, Category = Movement)\n\tFVector LastVelocityDirection = FVector{ 0.0f, 0.0f, 0.0f };\n\n\tUPROPERTY(BlueprintReadOnly, Category = Movement)\n\tbool bForceGroundAnims = false;\n\n\tbool bUseMovementOverride = false;\n\tfloat MovementOverrideValue = 0.0f;\n\n\tUPROPERTY(BlueprintReadWrite, Category = Movement)\n\tTArray<AActor*> SkyDiveFields;\n\t// </Movement>\n\t///////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n\n\t///////////////////////////////////////////////////////////////////////////////////////////////////////////\n\t// <misc>\n\tbool bCameraFadeOutBlocked = false;\n\n\t// Track for how long a certain value is for\n\tfloat PreviousGamepadRightX = 0.f;\n\tfloat PreviousGamepadRightY = 0.f;\n\tfloat PreviousGamepadLeftX = 0.f;\n\tfloat PreviousGamepadLeftY = 0.f;\n\n\tint32 LeftThumbstickSameValueFrames = 0;\n\tint32 RightThumbstickSameValueFrames = 0;\n\n\tfloat GamepadRightX = 0.f;\n\tfloat GamepadRightY = 0.f;\n\tfloat GamepadLeftX = 0.f;\n\tfloat GamepadLeftY = 0.f;\n\n\tUPROPERTY(EditAnywhere)\n\tTSubclassOf<USoWizard> WizardClass;\n\n\tUPROPERTY()\n\tUSoWizard* SoWizard;\n\n\tUPROPERTY()\n\tUDlgContext* InterruptedWizardDialogue = nullptr;\n\n\t// Used to create the UISystem\n\tUPROPERTY(EditAnywhere, Category = UI)\n\tTSubclassOf<USoUISystem> UISystemClass;\n\n\t// Root UI system\n\tUPROPERTY(BlueprintReadOnly)\n\tUSoUISystem* UISystem = nullptr;\n\n\tUPROPERTY(BlueprintReadOnly)\n\tFSoSkyControlValue SkyControlValue;\n\n\tUPROPERTY()\n\tUFMODEvent* MusicOverride = nullptr;\n\n\tUPROPERTY()\n\tUObject* MusicOverrideRequester = nullptr;\n\n\tUPROPERTY()\n\tTArray<ASoBounceSFXOverrideBox*> BounceSFXOverrideStack;\n\n\t// Keep track of the last modified gold amount\n\tUPROPERTY(BlueprintReadOnly)\n\tint32 LastModifiedGoldAmount = 0;\n\n\t// Cached Current device Type\n\tUPROPERTY(BlueprintReadOnly)\n\tESoInputDeviceType DeviceType = ESoInputDeviceType::Keyboard;\n\n\n\t// Keep track of the last modified gold amount\n\tUPROPERTY(BlueprintReadOnly)\n\tbool bLastRespawnWasRetreat = false;\n\npublic:\n\n\t//\n\t// SFX\n\t//\n\n\tUPROPERTY(EditAnywhere, Category = SFX)\n\tUFMODEvent* SFXFClothEquip = nullptr;\n\n\tUPROPERTY(EditAnywhere, Category = SFX)\n\tUFMODEvent* SFXWeaponEquip = nullptr;\n\n\tUPROPERTY(EditAnywhere, Category = SFX)\n\tUFMODEvent* SFXUsableEquip = nullptr;\n\n\tUPROPERTY(EditAnywhere, Category = SFX)\n\tUFMODEvent* SFXPotionEquip = nullptr;\n\n\tUPROPERTY(EditAnywhere, Category = SFX)\n\tUFMODEvent* SFXFItemGained = nullptr;\n\n\tUPROPERTY(EditAnywhere, Category = SFX)\n\tUFMODEvent* SFXFOnMeleeHit = nullptr;\n\n\tUPROPERTY(EditAnywhere, Category = SFX)\n\tUFMODEvent* SFXFOnMeleeHitDeath = nullptr;\n\n\tUPROPERTY(EditAnywhere, Category = SFX)\n\tUFMODEvent* SFXFLegJump = nullptr;\n\n\tUPROPERTY(EditAnywhere, Category = SFX)\n\tUFMODEvent* SFXFLegLand = nullptr;\n\n\tUPROPERTY(EditAnywhere, Category = SFX)\n\tUFMODEvent* SFXArmedLand = nullptr;\n\n\tUPROPERTY(EditAnywhere, Category = SFX)\n\tUFMODEvent* SFXFFallToDeath = nullptr;\n\n\tUPROPERTY(EditAnywhere, Category = SFX)\n\tUFMODEvent* SFXFBreakIntoPieces = nullptr;\n\n\tUPROPERTY(EditAnywhere, Category = SFX)\n\tUFMODEvent* SFXFCanNot = nullptr;\n\n\tUPROPERTY(EditFixedSize, EditAnywhere, Category = SFX)\n\tTArray<UFMODEvent*> SFXBounceVariants;\n\n\tUPROPERTY(EditAnywhere, Category = SFX)\n\tUFMODEvent* SFXSlideCrouchStart = nullptr;\n\n\tUPROPERTY(EditAnywhere, Category = SFX)\n\tUFMODEvent* SFXSlideCrouchEnd = nullptr;\n\n\tUPROPERTY(EditAnywhere, Category = SFX)\n\tUFMODEvent* SFXSlideJump = nullptr;\n\n\tUPROPERTY(EditAnywhere, Category = SFX)\n\tUFMODEvent* SFXRollEnter = nullptr;\n\n\tUPROPERTY(EditAnywhere, Category = SFX)\n\tUFMODEvent* SFXRollLeave = nullptr;\n\n\tUPROPERTY(EditAnywhere, Category = SFX)\n\tUFMODEvent* SFXRollEnterNoMovement = nullptr;\n\n\tUPROPERTY(EditAnywhere, Category = SFX)\n\tUFMODEvent* SFXRollLeaveNoMovement = nullptr;\n\n\tUPROPERTY(EditAnywhere, Category = SFX)\n\tUFMODEvent* SFXWeaponSwitch = nullptr;\n\n\tUPROPERTY(EditAnywhere, Category = SFX)\n\tUFMODEvent* SFXItemSwitch = nullptr;\n\n\tUPROPERTY(EditAnywhere, Category = SFX)\n\tUFMODEvent* SFXCarryStart = nullptr;\n\n\tUPROPERTY(EditAnywhere, Category = SFX)\n\tUFMODEvent* SFXCarryStop = nullptr;\n\n\tUPROPERTY(EditAnywhere, Category = SFX)\n\tUFMODEvent* SFXArmedStart = nullptr;\n\n\tUPROPERTY(EditAnywhere, Category = SFX)\n\tUFMODEvent* SFXArmedStop = nullptr;\n\n\tUPROPERTY(EditAnywhere, Category = SFX)\n\tUFMODEvent* SFXSwing = nullptr;\n\n\tUPROPERTY(EditAnywhere, Category = SFX)\n\tUFMODEvent* SFXSwingEnd = nullptr;\n\n\tUPROPERTY(EditAnywhere, Category = SFX)\n\tUFMODEvent* SFXBounceOnEnemy = nullptr;\n\n\t//\n\t// VFX\n\t//\n\n\tUPROPERTY(EditAnywhere, Category = VFX)\n\tUParticleSystem* VFXBounceSmall = nullptr;\n\n\tUPROPERTY(EditAnywhere, Category = VFX)\n\tUParticleSystem* VFXBounceLarge = nullptr;\n\n\tUPROPERTY(EditAnywhere, Category = VFX)\n\tUParticleSystem* VFXSlide = nullptr;\n\nprotected:\n\t// </misc>\n\t///////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n\n\t///////////////////////////////////////////////////////////////////////////////////////////////////////////\n\t// <strikes>\n\nprotected:\n\tUPROPERTY(BlueprintAssignable)\n\tFSoCooldownChanged CooldownStarted;\n\n\tUPROPERTY(BlueprintAssignable)\n\tFSoCooldownChanged CooldownEnded;\n\n\tUPROPERTY(BlueprintAssignable)\n\tFSoCooldownChanged CooldownBlocksEvent;\n\n\n\tUPROPERTY(BlueprintReadOnly)\n\tFSoAnimationSet ArmedAnimationSetNew;\n\n\n\tUPROPERTY(EditAnywhere, Category = Strikes)\n\tUCurveFloat* TrailCurve;\n\n\tUPROPERTY()\n\tTArray<AStaticMeshActor*> WeaponTrailMeshes;\n\n\tUPROPERTY()\n\tTArray<FSoWeaponTrailFade> WeaponTrailMeshFadeList;\n\n\tUPROPERTY(BlueprintReadOnly)\n\tTArray<FSoCooldownCounter> Cooldowns;\n\n\n\tUPROPERTY(BlueprintReadOnly)\n\tTArray<FSoWeaponBoost> WeaponBoosts;\n\n\n\tbool bForceHideLeftWeapon = false;\n\tbool bForceHideRightWeapon = false;\n\tFTimerHandle ForceHideLeftWeaponOver;\n\tFTimerHandle ForceHideRightWeaponOver;\n\t// </strikes>\n\t///////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n\n\t///////////////////////////////////////////////////////////////////////////////////////////////////////////\n\t// <Interactables>\n\tTArray<AActor*> Interactables;\n\n\tint32 ActiveInteractable = 0;\n\n\tUPROPERTY(BlueprintReadOnly)\n\tbool bShowInteractionTip = true;\n\n\tUPROPERTY(BlueprintReadOnly)\n\tbool bForceHideInteractionTip = false;\n\n\tUPROPERTY(BlueprintReadWrite, Category = Interaction)\n\tASoCarryable* CarriedStuff = nullptr;\n\n\tTArray<ASoSwingCenter*> SwingCenters;\n\n\tUPROPERTY(BlueprintAssignable, Category = Interaction)\n\tFSoNotify OnInteractionLabelChanged;\n\n\tUPROPERTY(BlueprintAssignable, Category = Interaction)\n\tFSoNotify OnSoulkeeperPickedUp;\n\n\tUPROPERTY(BlueprintAssignable, Category = Interaction)\n\tFSoNotify OnSoulkeeperPlaced;\n\n\tUPROPERTY(BlueprintAssignable, Category = Interaction)\n\tFSoNotify OnInteractableMessageRequested;\n\n\tUPROPERTY(BlueprintAssignable, Category = Interaction)\n\tFSoNotify OnInteractableMessageHideRequest;\n\n\n\tUPROPERTY(BlueprintReadOnly, Category = Interaction)\n\tbool bCanUseSoulkeeper;\n\n\tUPROPERTY(BlueprintAssignable)\n\tFSoNotify CanUseSoulkeeperChanged;\n\t// </Interactables>\n\t///////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n\n\t///////////////////////////////////////////////////////////////////////////////////////////////////////////\n\t// <PostProcess shadow>\n\n\t/** only reference */\n\tUPROPERTY()\n\tAPostProcessVolume* LevelPostProcessVolume;\n\n\tUPROPERTY(EditAnywhere, Category = ShadowMaterial)\n\tUMaterial* ShadowMaterialPostProcess;\n\n\t/** dynamic post process material used for fake character shadows */\n\tUPROPERTY()\n\tUMaterialInstanceDynamic* ShadowMaterialPostProcessDynamic = nullptr;\n\n\tbool bShadowWasEnabled = false;\n\n\t/** fake shadow map renderer */\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = ShadowMaterial)\n\tUSceneCaptureComponent2D* SoScreenCapture;\n\n\tUPROPERTY(BlueprintReadOnly)\n\tint32 ActiveShadowKey = 0;\n\t// <PostProcess shadow>\n\t///////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n\n\t///////////////////////////////////////////////////////////////////////////////////////////////////////////\n\t// <Update Lists>\n\n\t/** Meshes currently fading in/out based on the FadeIn/FadeOut calls */\n\tUPROPERTY()\n\tTArray<FSoFadeEntry> MeshesToFade;\n\n\t/** Faded entries - they are simply set to invisible and awiting FadeIn() call */\n\tUPROPERTY()\n\tTArray<FSoFadeEntry> FadedMeshes;\n\n\tUPROPERTY()\n\tTArray<FSoFadeAndKillDestructible> FadeAndKillList;\n\n\n\tUPROPERTY()\n\tTArray<USceneComponent*> OrientTowardsCameraList;\n\n\tUPROPERTY()\n\tTArray<USceneComponent*> EnemyHPWidgetList;\n\n\t// </Update Lists>\n\t///////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n\t///////////////////////////////////////////////////////////////////////////////////////////////////////////\n\t// <Camera>\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Movement)\n\tint32 ActiveCamKey = 0;\n\n\tfloat SavedCamRelative = BIG_NUMBER;\n\tfloat LastLandZ;\n\n\tbool bUseSavedCameraBoomZ = false;\n\t// when the character capsule changes (switch to/from roll, jump/land) the collision is temporary disabled\n\t// in this case the collision areas are left and entered again, which can ruin the saved cameraZ, that is blocked with this bool\n\tbool bSavedCameraBoomZUpdateBlock = false;\n\tfloat SavedCameraBoomZ = 0.0f;\n\t// target used to produce a smooth blend between the original Z and the one which is forced if we want to freeze a fix Z value\n\tfloat SavedCameraBoomZSource = 0.0f;\n\tfloat SavedCameraBoomZTarget = 0.0f;\n\tfloat SavedCameraBoomZCounter = 0.0f;\n\tconst float SavedCameraBoomZBlendTime = 1.3f;\n\n\tbool bUseCamMinZValue = false;\n\tfloat MinCamZValue = 0.0f;\n\n\tbool bUseCamMaxZValue = false;\n\tfloat MaxCamZValue = 0.0f;\n\n\tfloat CameraUnfreezeCounter = 0.0f;\n\tfloat CameraUnfreezeTime = 1.0f;\n\n\tfloat CameraXDeltaSource = 0.0f;\n\tfloat CameraXDeltaTarget = 0.0f;\n\tfloat CameraXDeltaCurrent = 0.0f;\n\n\tfloat CameraXDeltaCounter = 0.0f;\n\tconst float CameraXDeltaBlendTime = 1.3f;\n\n\tint32 SavedCamMovModifier = 1;\n\t// used when we can not reset it directly because the camera is not yet updated and it would be overridden with wrong value again\n\tbool bResetSavedCamMovModifierAfterTick = false;\n\n\t// movement is blocked if it is 0, resets if the input is 0\n\t// can be used to force stop the character until the player releases and presses the button again\n\tint32 MovementStopMultiplier = 1;\n\n\tbool bRotatedCamera = false;\n\n\tint32 MovDir = 1;\n\tfloat HorizontalOffset = 0;\n\n\t// Absolute time in seconds when the game was saved\n\tfloat LastAutoSaveTime = 0.0f;\n\n\tUPROPERTY(BlueprintAssignable)\n\tFSoNotify ToggleUI;\n\t// </Camera>\n\t///////////////////////////////////////////////////////////////////////////////////////////////////////////\n\npublic:\n\n\t///////////////////////////////////////////////////////////////////////////////////////////////////////////\n\t// <CONST VALUES>\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Pause)\n\tfloat MaxIdleTime = 15.0f;\n\n\t// if any of the heights change (from 42/72) the const values used in SoAActivity with JumpZVelocity should be recalculated\n\t// the original jump height we want to keep is 285.102\n\t// h = v0 * v0 / (2*g)\n\t// when the collision is decreased the value (1057.36) can stay\n\t// when the collision is not decreased before jump the character capsule is pushed so that the top of the decreased capsule is at the same location\n\t// as the top of the original capsule, the jump velocity must be corrected so that it reaches the same height (285.102)\n\t// current difference is 117.82, used in USoActivity::JumpPressed()\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Capsule)\n\tfloat DecreasedHeight = 42.0f;\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Capsule)\n\tfloat NormalHeight = 72.0f;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Capsule)\n\tfloat Mass = 127.666199f;\n\n\tbool bDebugSkipDialogues = false;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = MovementConstValue)\n\tfloat ForcedToMoveTimeAfterHit = 0.2f;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = MovementConstValue)\n\tfloat ForcedToMoveTimeAfterWallJump = 0.30f;\n\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = MovementConstValue)\n\tfloat QuickTeleportPreTime = 0.2f;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = MovementConstValue)\n\tfloat QuickTeleportPostTime = 0.2;\n\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Achievements)\n\tFSoConditionalAchievement AchievementSelfTrained;\n\t// </CONST VALUES>\n\t///////////////////////////////////////////////////////////////////////////////////////////////////////////\n\nprotected:\n\tFTimerManager* gTimerManager = nullptr;\n\n\t//\n\t// Our friends\n\t//\n\tfriend class USoActivity;\n\tfriend class USoAAiming;\n\tfriend class USoARoll;\n\tfriend class USoASwing;\n\tfriend class USoASlide;\n\tfriend class USoADefault;\n\tfriend class USoALillian;\n\tfriend class USoALeverPush;\n\tfriend class USoACarry;\n\t// friend class USoACarryPickUp;\n\tfriend class USoACarryDrop;\n\tfriend class USoAWeaponInArm;\n\tfriend class USoAStrike;\n\tfriend class USoADead;\n\tfriend class USoAHitReact;\n\tfriend class USoATeleport;\n\tfriend class USoACameraEdit;\n\tfriend class USoASkyControlEdit;\n\tfriend class USoACharShadowEdit;\n\tfriend class USoAInUI;\n\tfriend class USoAItemUsage;\n\tfriend class USoAInteractWithEnvironment;\n\tfriend class USoASoAWaitForActivitySwitch;\n\tfriend class USoASoAWait;\n\tfriend class ASoPreviewCharacter;\n\n\tfriend class USoCharacterMovementComponent;\n\tfriend class USoPlayerCharacterSheet;\n};\n"
  },
  {
    "path": "Source/SOrb/Character/SoCharacterDataTypes.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#pragma once\n#include \"CharacterBase/SoIMortalTypes.h\"\n#include \"SoCharacterDataTypes.generated.h\"\n\nclass UAnimSequenceBase;\nclass USoWeaponTemplate;\nclass AStaticMeshActor;\nclass ADestructibleActor;\nclass USoEffectBase;\nclass UParticleSystem;\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// struct used to store data for fading in/out objects between the player and camera\n// the fade system is based on trigger volumes they register/unregister mesh components on BeginOverlap/EndOverlap\nUSTRUCT(BlueprintType)\nstruct FSoFadeEntry\n{\n\tGENERATED_USTRUCT_BODY()\npublic:\n\t// mesh to fade out\n\tUPROPERTY()\n\tAStaticMeshActor* Mesh = nullptr;\n\n\t// > 0 -> fade out, == 0 -> fade in, == 0 -> WTH???\n\tint32 InstanceCount;\n\n\t// 0: invisible, 1: visible\n\tfloat FadeValue;\n\n\t// interpolation speed\n\tfloat FadeSpeed;\n\n\tbool bCanHideIfOutFaded;\n};\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUSTRUCT(BlueprintType)\nstruct FSoWeaponTrailFade\n{\n\tGENERATED_USTRUCT_BODY()\n\npublic:\n\tUPROPERTY()\n\tAStaticMeshActor* Mesh = nullptr;\n\n\tUPROPERTY()\n\tfloat Counter;\n\n\tUPROPERTY()\n\tfloat MaxValue;\n};\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUSTRUCT(BlueprintType)\nstruct FSoFadeAndKillDestructible\n{\n\tGENERATED_USTRUCT_BODY()\n\npublic:\n\tUPROPERTY()\n\tADestructibleActor* Destructible = nullptr;\n\n\tfloat FadeCounter;\n};\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUSTRUCT(BlueprintType)\nstruct FSoCooldownCounter\n{\n\tGENERATED_USTRUCT_BODY()\n\npublic:\n\tUPROPERTY(BlueprintReadOnly)\n\tconst UObject* Object = nullptr;\n\n\tUPROPERTY(BlueprintReadOnly)\n\tfloat Counter;\n\n\tUPROPERTY(BlueprintReadOnly)\n\tbool bAllowInAir;\n};\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUSTRUCT(BlueprintType)\nstruct FSoWeaponBoost\n{\n\tGENERATED_USTRUCT_BODY()\n\npublic:\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere)\n\tUSoEffectBase* OwnerEffect = nullptr;\n\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere)\n\tFSoDmg BonusDamage;\n\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere)\n\tUSoWeaponTemplate* WeaponTemplate = nullptr;\n\t\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere)\n\tUParticleSystem* ParticleSystem = nullptr;\n\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere)\n\tUParticleSystem* ImpactFX = nullptr;\n\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere)\n\tFLinearColor TrailColor = FLinearColor(4.8f, 5.0f, 1.2f, 1.0f);\n\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere)\n\tFLinearColor TrailAnimLight = FLinearColor(100.0f, 7.8f, 0.0f, 1.0f);\n};\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUSTRUCT(BlueprintType, Blueprintable)\nstruct FSoAnimationSet\n{\n\tGENERATED_USTRUCT_BODY()\n\npublic:\n\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere)\n\tUAnimSequenceBase* Idle = nullptr;\n\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere)\n\tUAnimSequenceBase* IdleLeft = nullptr;\n\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere)\n\tUAnimSequenceBase* Run = nullptr;\n\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere)\n\tUAnimSequenceBase* RunBack = nullptr;\n\n\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere, Category = Jump)\n\tUAnimSequenceBase* Jump = nullptr;\n\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere, Category = Jump)\n\tUAnimSequenceBase* JumpLeft = nullptr;\n\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere, Category = Jump)\n\tUAnimSequenceBase* Float = nullptr;\n\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere, Category = Jump)\n\tUAnimSequenceBase* FloatLeft = nullptr;\n\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere, Category = Jump)\n\tUAnimSequenceBase* Fall = nullptr;\n\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere, Category = Jump)\n\tUAnimSequenceBase* FallLeft = nullptr;\n\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere, Category = Jump)\n\tUAnimSequenceBase* Land = nullptr;\n\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere, Category = Jump)\n\tUAnimSequenceBase* LandLeft = nullptr;\n};\n"
  },
  {
    "path": "Source/SOrb/Character/SoCharacterStrike.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#include \"SoCharacterStrike.h\"\n\n\n#include \"Basic/Helpers/SoDateTimeHelper.h\"\n#include \"Basic/Helpers/SoStaticHelper.h\"\n#include \"Basic/Helpers/SoStringHelper.h\"\n\nFString USoCharacterStrike::TextNamespace(TEXT(\"CharacterStrike\"));\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUSoCharacterStrike::USoCharacterStrike()\n{\n}\n\n#if WITH_EDITOR\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoCharacterStrike::PreSave(const ITargetPlatform* TargetPlatform)\n{\n\tUpdateLocalizedFields();\n\tSuper::PreSave(TargetPlatform);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoCharacterStrike::PostEditChangeProperty(FPropertyChangedEvent& PropertyChangedEvent)\n{\n\tSuper::PostEditChangeProperty(PropertyChangedEvent);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoCharacterStrike::PostEditChangeChainProperty(struct FPropertyChangedChainEvent& PropertyChangedChainEvent)\n{\n\tSuper::PostEditChangeChainProperty(PropertyChangedChainEvent);\n\tconst int32 ElementIndex = PropertyChangedChainEvent.GetArrayIndex(TEXT(\"CharacterStrikes\"));\n\n\tif (CharacterStrikes.IsValidIndex(ElementIndex))\n\t{\n\t\tif (PropertyChangedChainEvent.GetPropertyName() == TEXT(\"AnimSequenceNew\"))\n\t\t{\n\t\t\tif (CharacterStrikes[ElementIndex].AnimSequenceNew != nullptr)\n\t\t\t\tCharacterStrikes[ElementIndex].AnimDuration = USoStaticHelper::GetScaledAnimLength(CharacterStrikes[ElementIndex].AnimSequenceNew);\n\t\t}\n\n\t\tif (PropertyChangedChainEvent.GetPropertyName() == TEXT(\"AnimEndingSequenceLeft\"))\n\t\t{\n\t\t\tif (CharacterStrikes[ElementIndex].AnimEndingSequenceLeft != nullptr)\n\t\t\t\tCharacterStrikes[ElementIndex].AnimEndDuration = USoStaticHelper::GetScaledAnimLength(CharacterStrikes[ElementIndex].AnimEndingSequenceLeft);\n\t\t}\n\t\tif (PropertyChangedChainEvent.GetPropertyName() == TEXT(\"AnimEndingSequenceRight\"))\n\t\t{\n\t\t\tif (CharacterStrikes[ElementIndex].AnimEndingSequenceRight != nullptr)\n\t\t\t\tCharacterStrikes[ElementIndex].AnimEndDuration = USoStaticHelper::GetScaledAnimLength(CharacterStrikes[ElementIndex].AnimEndingSequenceRight);\n\t\t}\n\n\t\tif (PropertyChangedChainEvent.GetPropertyName() == TEXT(\"TrailDelay\"))\n\t\t{\n\t\t\tfor (FSoStrikeEntry& Entry : CharacterStrikes[ElementIndex].StrikeList)\n\t\t\t\tEntry.TrailDelay = FMath::Min(Entry.TrailDelay, Entry.StrikeDelay);\n\t\t}\n\n\t\tif (PropertyChangedChainEvent.GetPropertyName() == TEXT(\"StrikeDelay\"))\n\t\t{\n\t\t\tfor (FSoStrikeEntry& Entry : CharacterStrikes[ElementIndex].StrikeList)\n\t\t\t\tEntry.StrikeDelay = FMath::Max(Entry.TrailDelay, Entry.StrikeDelay);\n\t\t}\n\t}\n}\n#endif\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUSoCharacterStrike* USoCharacterStrike::GetTemplateFromPath(const FString& Path)\n{\n\tif (Path.Len() == 0)\n\t\treturn nullptr;\n\n\treturn Cast<USoCharacterStrike>(StaticLoadObject(USoCharacterStrike::StaticClass(), NULL, *Path));\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nconst FSoCharacterStrikeData& USoCharacterStrike::GetStrikeData(int32 Index) const\n{\n\tcheck(CharacterStrikes.IsValidIndex(Index));\n\treturn CharacterStrikes[Index];\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoCharacterStrike::UpdateLocalizedFields()\n{\n\tconst FString ObjectName = USoStringHelper::GetObjectBaseName(this);\n\tStrikeName = FInternationalization::ForUseOnlyByLocMacroAndGraphNodeTextLiterals_CreateText(\n\t\t*StrikeName.ToString(),\n\t\t*TextNamespace,\n\t\t*(ObjectName + \"_name\")\n\t);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nfloat USoCharacterStrike::GetCooldownTime() const\n{\n\treturn CooldownTime;\n}\n"
  },
  {
    "path": "Source/SOrb/Character/SoCharacterStrike.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#pragma once\n#include \"Animation/AnimSequenceBase.h\"\n#include \"CharacterBase/SoIMortalTypes.h\"\n#include \"Logic/SoCooldown.h\"\n#include \"SoCharacterStrike.generated.h\"\n\nclass UTexture2D;\nclass USoEffectBase;\nclass ASoProjectile;\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUSTRUCT(BlueprintType, Blueprintable)\nstruct FSoJump\n{\n\tGENERATED_USTRUCT_BODY()\npublic:\n\n\tUPROPERTY(EditAnywhere)\n\tfloat Time;\n\n\tUPROPERTY(EditAnywhere)\n\tfloat Velocity;\n};\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUSTRUCT(BlueprintType, Blueprintable)\nstruct FSoHorizontalMovement\n{\n\tGENERATED_USTRUCT_BODY()\npublic:\n\n\tUPROPERTY(EditAnywhere)\n\tfloat StartTime;\n\n\tUPROPERTY(EditAnywhere)\n\tfloat EndTime;\n\n\tUPROPERTY(EditAnywhere)\n\tfloat Velocity;\n};\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUSTRUCT(BlueprintType, Blueprintable)\nstruct FSoStrikeEntry\n{\n\tGENERATED_USTRUCT_BODY()\n\npublic:\n\n\t/** Time between strike start and trail display start */\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = StrikeData)\n\tfloat TrailDelay = 0.0f;\n\n\t/** Does not effect trail, only the actual time the hit check is executed, has to be greater than or equal to TrailDelay */\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = StrikeData)\n\tfloat StrikeDelay = 0.1f;\n\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = StrikeData)\n\tfloat StrikeDmgDuration = 0.1f;\n\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = StrikeData)\n\tUStaticMesh* TrailMesh = nullptr;\n\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = StrikeData)\n\tbool bAttachToCharacter = true;\n\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = StrikeData)\n\tfloat TrailDisplayTime = 0.6f;\n\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = StrikeData)\n\tint32 TranslucencySortPriority = 0;\n\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = ItemWeapon)\n\tTArray<TSubclassOf<USoEffectBase>> HitEffects;\n};\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUSTRUCT(BlueprintType, Blueprintable)\nstruct FSoCharacterStrikeData\n{\n\tGENERATED_USTRUCT_BODY()\n\npublic:\n\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = StrikeData)\n\tFSoRootMotionDesc RootMotionDesc;\n\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = StrikeData)\n\tbool bStopVerticalRootMotionNearApex = false;\n\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = StrikeData)\n\tbool bBlendIn = true;\n\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = StrikeData)\n\tUAnimSequenceBase* AnimSequenceNew;\n\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = StrikeData)\n\tUAnimSequenceBase* AnimEndingSequenceLeft;\n\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = StrikeData)\n\tUAnimSequenceBase* AnimEndingSequenceRight;\n\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = StrikeData)\n\tfloat AnimDuration = 1.0f;\n\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = StrikeData)\n\tfloat AnimEndDuration = 0.2f;\n\n\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = StrikeData)\n\tTArray<FSoStrikeEntry> StrikeList;\n\n\t/** if true and the character isn't in air the strike is delayed and the character executed a jump first */\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = StrikeData)\n\tbool bRequiresJump = false;\n\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = StrikeData)\n\tTArray<FSoJump> Jumps;\n\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = StrikeData)\n\tTArray<FSoHorizontalMovement> HorizontalMovements;\n\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = StrikeData)\n\tfloat IgnoreWallHitBellowZThreshold = -5.0f;\n\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = StrikeData)\n\tbool bFreezeInAir = false;\n\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = StrikeData)\n\tbool bStartWithLand = false;\n\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = StrikeData)\n\tbool bForceGroundAnimsOnBlendOut = false;\n\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = StrikeData)\n\tfloat RangeAttackDelay = -1.0f;\n\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = StrikeData)\n\tTSubclassOf<ASoProjectile> ProjectileClass;\n\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = StrikeData)\n\tint32 WeaponToHideIndex = -1;\n\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = StrikeData)\n\tfloat WeaponHideDuration = 0.2f;\n};\n\n/**\n *\n */\nUCLASS(Blueprintable, BlueprintType)\nclass SORB_API USoCharacterStrike : public UObject, public ISoCooldown\n{\n\tGENERATED_BODY()\n\npublic:\n\n\t/** save/load helper */\n\tstatic USoCharacterStrike* GetTemplateFromPath(const FString& Path);\n\n\tUSoCharacterStrike();\n\n#if WITH_EDITOR\n\tvoid PreSave(const ITargetPlatform* TargetPlatform) override;\n\tvoid PostEditChangeProperty(FPropertyChangedEvent& PropertyChangedEvent) override;\n\tvoid PostEditChangeChainProperty(struct FPropertyChangedChainEvent& PropertyChangedChainEvent) override;\n#endif\n\n\t// ICooldown\n\tvirtual float GetCooldownDuration_Implementation() const override { return GetCooldownTime(); }\n\tvirtual UTexture2D* GetCooldownIcon_Implementation() const override { return CooldownIcon; }\n\tvirtual bool CanCountDownInAir_Implementation() const override { return bCooldownReducedInAir; }\n\n\tint32 GetStrikeNum() const { return CharacterStrikes.Num(); }\n\tconst FSoCharacterStrikeData& GetStrikeData(int32 Index) const;\n\n\tconst TArray<FSoCharacterStrikeData>& GetCharacterStrikes() const { return CharacterStrikes; }\n\n\tfloat GetCooldownTime() const;\n\tUTexture2D* GetCooldownIcon() const { return CooldownIcon; }\n\n\tESoStatusEffect GetStatusEffect() const { return EffectToApply; }\n\nprotected:\n\tvirtual void UpdateLocalizedFields();\n\nprotected:\n\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = StrikeData)\n\tTArray<FSoCharacterStrikeData> CharacterStrikes;\n\n\t/** Only used if > 0.0f, using the strike in chain ignores cooldown */\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = StrikeData)\n\tfloat CooldownTime = -1.0f;\n\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = StrikeData)\n\tFText StrikeName;\n\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = StrikeData)\n\tUTexture2D* CooldownIcon;\n\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = StrikeData)\n\tbool bCooldownReducedInAir = true;\n\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = StrikeData)\n\tESoStatusEffect EffectToApply = ESoStatusEffect::ESE_NumOf;\n\n\t// Used for all FTexts\n\tstatic FString TextNamespace;\n};\n"
  },
  {
    "path": "Source/SOrb/Character/SoPlayerCharacterSheet.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#include \"SoPlayerCharacterSheet.h\"\n\n\n#include \"EngineUtils.h\"\n#include \"Engine/ObjectLibrary.h\"\n#include \"Components/SkeletalMeshComponent.h\"\n#include \"Components/StaticMeshComponent.h\"\n#include \"Components/CapsuleComponent.h\"\n#include \"Kismet/GameplayStatics.h\"\n#include \"LevelSequenceActor.h\"\n\n#include \"Items/SoInventoryComponent.h\"\n#include \"Items/SoItem.h\"\n#include \"Items/ItemTemplates/SoItemTemplateShard.h\"\n#include \"Items/ItemTemplates/SoUsableItemTemplate.h\"\n#include \"Items/ItemTemplates/SoQuestItemTemplate.h\"\n#include \"Items/ItemTemplates/SoWeaponTemplate.h\"\n#include \"Items/ItemTemplates/SoItemTemplateRuneStone.h\"\n\n#include \"Interactables/SoInteractableActor.h\"\n\n#include \"Character/SoCharStates/SoADefault.h\"\n#include \"Character/SoCharStates/SoALillian.h\"\n#include \"Character/SoCharStates/SoAInUI.h\"\n#include \"Character/SoCharStates/SoATeleport.h\"\n#include \"Character/SoPlayerProgress.h\"\n#include \"Character/SoCharacter.h\"\n#include \"CharacterBase/SoCharacterMovementComponent.h\"\n#include \"SoCharacterStrike.h\"\n#include \"SplineLogic/SoMarker.h\"\n\n#include \"Basic/SoGameMode.h\"\n#include \"Basic/SoGameSingleton.h\"\n#include \"SaveFiles/SoWorldState.h\"\n\n#include \"Levels/SoLevelHelper.h\"\n#include \"Basic/SoGameInstance.h\"\n#include \"Basic/SoAudioManager.h\"\n#include \"Basic/Helpers/SoStaticHelper.h\"\n#include \"Materials/MaterialInstance.h\"\n#include \"Basic/Helpers/SoMathHelper.h\"\n#include \"UI/SoUIHelper.h\"\n\n#include \"SoLocalization.h\"\n\nDEFINE_LOG_CATEGORY_STATIC(LogSoPlayerCharacterSheet, All, All)\n\nconst FName USoPlayerCharacterSheet::HealthUpgradeName = TEXT(\"HealthUpgrade\");\n\nconst FName USoPlayerCharacterSheet::SKSplineName = FName(\"SoulKeeperSpline\");\nconst FName USoPlayerCharacterSheet::SKPenaltyName = FName(\"SoulKeeperPenalty\");\nconst FName USoPlayerCharacterSheet::SKDistanceOnSplineName = FName(\"SoulKeeperDistanceOnSpline\");\nconst FName USoPlayerCharacterSheet::SKZName = FName(\"SoulKeeperZ\");\nconst FName USoPlayerCharacterSheet::SKDirectionName = FName(\"SoulKeeperDirection\");\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// Sets default values for this component's properties\nUSoPlayerCharacterSheet::USoPlayerCharacterSheet()\n{\n\tbWantsInitializeComponent = true;\n\n\tCurrentEquipment.SetNum(static_cast<int32>(ESoItemSlot::EIS_Max));\n\n\tSaneHPMultiplier = 1.0f;\n\tInsaneHPMultiplier = 1.0f;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoPlayerCharacterSheet::InitializeComponent()\n{\n\tSuper::InitializeComponent();\n\n\tSoOwner = Cast<ASoCharacter>(GetOwner());\n\tcheck(SoOwner);\n\n\tOnSlotChanged.AddDynamic(this, &USoPlayerCharacterSheet::OnSlotChange);\n\n\tif (ASoGameMode* GameMode = ASoGameMode::GetInstance(this))\n\t{\n\t\tGameMode->OnPreSave.AddDynamic(this, &USoPlayerCharacterSheet::OnSave);\n\t\tGameMode->OnPostLoad.AddDynamic(this, &USoPlayerCharacterSheet::OnReload);\n\t}\n\n\t// only used in editor, modify ASoCharacter::EnsureSpellsCapacityLimits() to modify the default capacity value\n\tSoOwner->EnsureSpellsCapacityLimits();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoPlayerCharacterSheet::UninitializeComponent()\n{\n\tif (ASoGameMode* GameMode = ASoGameMode::GetInstance(this))\n\t{\n\t\tGameMode->OnPreSave.RemoveDynamic(this, &USoPlayerCharacterSheet::OnSave);\n\t\tGameMode->OnPostLoad.RemoveDynamic(this, &USoPlayerCharacterSheet::OnReload);\n\t}\n\n\tSuper::UninitializeComponent();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoPlayerCharacterSheet::OnSave()\n{\n\t// SoOwner->bCanUseSoulkeeper was here to prevent the player from possible stuck scenarios or exploits via teleporting to\n\t// SoulKeeper from locations they should not be able to via reloading the game.\n\t// It does more harm than good though, because this makes the SK unpredictable - e.g. if you quit the game standing on an enemy patrol\n\t// spawn location you will lose the keeper after reload\n\tif (SoOwner->IsSoulkeeperActive()/* && SoOwner->bCanUseSoulkeeper*/)\n\t{\n\t\tSetNameValue(SKSplineName, SoOwner->ResLocation.GetSpline() ? SoOwner->ResLocation.GetSpline()->GetSplineFName() : NAME_None);\n\t\tSetIntValue(SKPenaltyName, SoulkeeperRespawnPenalty);\n\t\tSetFloatValue(SKDistanceOnSplineName, SoOwner->ResLocation.GetDistance());\n\t\tSetFloatValue(SKZName, SoOwner->ResLocationZValue);\n\n\t\tconst FVector SKSplineLocation = SoOwner->ResLocation.ToVector(SoOwner->ResLocationZValue);\n\t\tconst FVector SKLocation = SoOwner->ResRuneVisualActor->GetActorLocation();\n\t\tconst FVector SKDir = (SKLocation - SKSplineLocation).GetSafeNormal();\n\t\tconst FVector NormalDir = SoOwner->ResLocation.GetPlaneNormal();\n\t\tSetIntValue(SKDirectionName, (SKDir | NormalDir) > 0.0f ? 1 : -1);\n\t}\n\telse\n\t{\n\t\tSetNameValue(SKSplineName, NAME_None);\n\t}\n\n\tFSoWorldState::Get().SetCheckpointLocation(SoOwner->GetActiveCheckpointLocationName());\n\tFSoWorldState::Get().SetMapName(USoLevelHelper::GetChapterNameFromActor(SoOwner));\n\n\t// Player data\n\tFSoWorldState::Get().SetPlayerData(PlayerData);\n\n\t// Inventory\n\tSoOwner->GetInventory()->Save();\n\n\t// Current equipment\n\tSaveEquipment();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoPlayerCharacterSheet::OnReload()\n{\n\tif (SoOwner->SoActivity != nullptr)\n\t\tSoOwner->SoActivity->SwitchActivity(SoOwner->SoADefault);\n\n\t// clear old items\n\tfor (int32 i = 0; i < static_cast<int32>(ESoItemSlot::EIS_Max); ++i)\n\t\tif (CurrentEquipment[i].Template != nullptr)\n\t\t\tOnItemEquiped(static_cast<ESoItemSlot>(i), CurrentEquipment[i], false);\n\n\t// NOTE: we do not need to set any checkpoint as the current world state stores that\n\t// NOTE: NAME_None == GetDefaultCheckpointLocationName()\n\tauto& GameInstance = USoGameInstance::Get(this);\n\tPlayerData = FSoWorldState::Get().GetPlayerData();\n\n\t// INVENTORY FIRST!\n\tSoOwner->GetInventory()->Reload();\n\n\tAttackSpeedMultiplier = 1.0f;\n\tDamageModifiers = 1.0f;\n\n\t// Current equipment\n\tLoadEquipment();\n\n\tconst float InitialMaxHealth = FSoWorldState::Get().GetInitialMaxHealth();;\n\tconst float MaxHealth = InitialMaxHealth + HealthUpgradeValue * GetIntValue(HealthUpgradeName);\n\tSetMaxHealth(MaxHealth);\n\n\t// Reload the location in non editor builds\n\t// NOTE: Same method is called in ASoCharacter::BeginPlay.\n\t// This is useful when a new save is loaded\n\tbool bTeleportedToSK = false;\n#if WARRIORB_WITH_EDITOR\n\t// Editor\n\tif (GameInstance.IsEpisode())\n\t{\n\t\tSoOwner->TeleportToActiveCheckpointName();\n\t}\n#else\n\t// Non Editor\n\n\n\tconst FName SplineName = GetNameValue(SKSplineName);\n\tif (SplineName != NAME_None)\n\t{\n\t\tfor (TActorIterator<ASoPlayerSpline> ActorItr(SoOwner->GetWorld()); ActorItr; ++ActorItr)\n\t\t{\n\t\t\tASoPlayerSpline* SoSpline = *ActorItr;\n\t\t\tif (SoSpline->GetSplineFName() == SplineName)\n\t\t\t{\n\t\t\t\tbTeleportedToSK = true;\n\n\t\t\t\tSoulkeeperRespawnPenalty = GetIntValue(SKPenaltyName);\n\t\t\t\tSetHealth(FMath::Max(MaxHealthPoints - SoulkeeperRespawnPenalty, MaxHealthPoints * 0.3f));\n\t\t\t\tSoOwner->ResLocationZValue = GetFloatValue(SKZName);\n\t\t\t\tSoOwner->ResLocation = FSoSplinePoint(SoSpline, GetFloatValue(SKDistanceOnSplineName));\n\n\t\t\t\tconst FVector LocOnSpline = SoOwner->ResLocation.ToVector(SoOwner->ResLocationZValue - SoOwner->GetCapsuleComponent()->GetScaledCapsuleHalfHeight());\n\t\t\t\tconst FVector TotemLocation = LocOnSpline + SoOwner->ResLocation.GetPlaneNormal() * GetIntValue(SKDirectionName) * 100;\n\t\t\t\tSoOwner->ResRuneVisualActor->SetActorLocation(TotemLocation);\n\t\t\t\tSoOwner->ResRuneVisualActor->SetActorRotation((LocOnSpline - TotemLocation).Rotation());\n\t\t\t\tSoOwner->ResRuneVisualActor->SetActorHiddenInGame(false);\n\t\t\t\tSoOwner->ResRuneVisualActor->Activate();\n\t\t\t\tSoOwner->OnSoulkeeperPlaced.Broadcast();\n\n\t\t\t\tSoOwner->SoATeleport->SetupTeleport(SoOwner->ResLocation, SoOwner->ResLocationZValue, false, false);\n\n\t\t\t\tSetSpellUsageCount(SoOwner->SoulKeeperSpell, 0, false);\n\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\tif (!bTeleportedToSK)\n\t{\n\t\tSoOwner->TeleportToActiveCheckpointName();\n\t}\n#endif // WARRIORB_WITH_EDITOR\n\n\t// Set initial spells capacity\n\tSoOwner->EnsureSpellsCapacityLimits(FSoWorldState::Get().GetInitialSpellsCapacity());\n\n\tUpdateDisplayName();\n\n\t// add/remove status effect if necessary\n\tSoOwner->UpdateMaterialBP();\n\n\tstatic const FName WorthyName = FName(\"bWorthy\");\n\tISoMortal::Execute_OnStatusEffectChanged(SoOwner, ESoStatusEffect::ESE_Worthy, GetBoolValue(WorthyName));\n\n\tif (SoOwner->IsSoulkeeperActive() && !bTeleportedToSK)\n\t\tSoOwner->PickupResRune();\n\n\n\tif (GetBoolValue(USoStaticHelper::GetLillianFormName()))\n\t{\n\t\tSoOwner->SoActivity->SwitchActivity(SoOwner->SoALillian);\n\t\tSoOwner->ChangeUIVisibility.Broadcast(false);\n\t}\n\telse if (SoOwner->SoActivity == SoOwner->SoALillian)\n\t\tSoOwner->SoActivity->SwitchActivity(SoOwner->SoADefault);\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoPlayerCharacterSheet::OnDifficultyChanged(ESoDifficulty NewDifficulty)\n{\n\tif (SoOwner->GetInventory()->HasItem(SpellCasterTemplate) ||\n\t\tCurrentEquipment[static_cast<int32>(ESoItemSlot::EIS_Item0)].Template == SpellCasterTemplate ||\n\t\tCurrentEquipment[static_cast<int32>(ESoItemSlot::EIS_Item1)].Template == SpellCasterTemplate)\n\t{\n\t\t// only do anything if the spellcaster is active\n\n\t\tswitch (NewDifficulty)\n\t\t{\n\t\t\tcase ESoDifficulty::Sane:\n\t\t\t\tif (!ReplaceRuneStone(SoulStoneTemplateIntended, SoulStoneTemplateSane) &&\n\t\t\t\t\t!SoOwner->GetInventory()->HasItem(SoulStoneTemplateSane))\n\t\t\t\t{\n\t\t\t\t\tFSoItem Item;\n\t\t\t\t\tItem.Template = SoulStoneTemplateSane;\n\t\t\t\t\tSoOwner->AddItem(Item, false);\n\t\t\t\t\t// TODO: equip newly added runestone if there is a slot for it\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase ESoDifficulty::Intended:\n\t\t\t\tif (!ReplaceRuneStone(SoulStoneTemplateSane, SoulStoneTemplateIntended) &&\n\t\t\t\t\t!SoOwner->GetInventory()->HasItem(SoulStoneTemplateIntended))\n\t\t\t\t{\n\t\t\t\t\tFSoItem Item;\n\t\t\t\t\tItem.Template = SoulStoneTemplateIntended;\n\t\t\t\t\tSoOwner->AddItem(Item, false);\n\t\t\t\t\t// TODO: equip newly added runestone if there is a slot for it\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase ESoDifficulty::Insane:\n\t\t\t\tSoOwner->RemoveItem(SoulStoneTemplateIntended);\n\t\t\t\tSoOwner->RemoveItem(SoulStoneTemplateSane);\n\t\t\t\tfor (int32 i = EquippedRuneStones.Num() - 1; i >= 0; --i)\n\t\t\t\t\tif (EquippedRuneStones[i].Template == SoulStoneTemplateIntended ||\n\t\t\t\t\t\tEquippedRuneStones[i].Template == SoulStoneTemplateSane)\n\t\t\t\t\t{\n\t\t\t\t\t\tEquippedRuneStones.RemoveAt(i);\n\t\t\t\t\t\tif (ActiveEquippedRuneStoneIndex >= i && ActiveEquippedRuneStoneIndex > 0)\n\t\t\t\t\t\t\tActiveEquippedRuneStoneIndex -= 1;\n\t\t\t\t\t}\n\t\t\t\tbreak;\n\t\t}\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoPlayerCharacterSheet::OnRevive(bool bSoulKeeperNotUsed)\n{\n\tClearBonusHealth();\n\n\tif (bSoulKeeperNotUsed)\n\t{\n\t\tRestoreHealth();\n\t\tResetSoulkeeperRespawnPenalty();\n\t\tRestoreSpells();\n\t}\n\telse\n\t{\n\t\tconst float Penalty = IncreaseSoulkeeperRespawnPenalty();\n\t\tSetHealth(FMath::Max(MaxHealthPoints - Penalty, MaxHealthPoints * 0.3f));\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoPlayerCharacterSheet::Heal()\n{\n\tRestoreHealth();\n\tSoulkeeperRespawnPenalty = 0;\n\tRestoreSpells();\n\tClearBonusHealth();\n\tSoOwner->PlayHealLightEffectBP();\n\tSoOwner->RemoveAllCooldown();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoPlayerCharacterSheet::ApplyHealthUpgrade()\n{\n\tSetIntValue(HealthUpgradeName, 1, true);\n\tSetMaxHealth(GetMaxHealth() + HealthUpgradeValue, false);\n\tIncreaseHealth(HealthUpgradeValue);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoPlayerCharacterSheet::AddSoulStone(USoItemTemplateRuneStone* SoulStoneTemplate)\n{\n\tif (SoulStoneTemplate == nullptr)\n\t\treturn;\n\n\tFSoItem SoulStone;\n\tSoulStone.Template = SoulStoneTemplate;\n\tSoOwner->AddItem(SoulStone, false);\n\n\tfor (FSoItem& Item : EquippedRuneStones)\n\t\tif (Item.Template == SoulStoneTemplate)\n\t\t{\n\t\t\tItem.Amount += 1;\n\t\t\tRestoreSpells();\n\t\t\treturn;\n\t\t}\n\n\tEquippedRuneStones.Add(SoulStone);\n\tOnEquippedSpellListChanged.Broadcast();\n\tRestoreSpells();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoPlayerCharacterSheet::UseActiveRuneStoneIfCastable()\n{\n\tif (EquippedRuneStones.IsValidIndex(ActiveEquippedRuneStoneIndex))\n\t{\n\t\tUSoItemTemplateRuneStone* RuneStone = EquippedRuneStones[ActiveEquippedRuneStoneIndex].GetTemplateAsRuneStone();\n\t\tint32* Amount = SpellMap.Find(RuneStone);\n\n\t\t// check if it isn't used up all\n\t\tif (Amount == nullptr || (*Amount) > 0)\n\t\t{\n\t\t\t// check if it isn't waiting for cooldown\n\t\t\tbool bWaitForCooldown = false;\n\t\t\tfor (int32 i = 0; i < SoOwner->Cooldowns.Num(); ++i)\n\t\t\t\tif (SoOwner->Cooldowns[i].Object == EquippedRuneStones[ActiveEquippedRuneStoneIndex].Template)\n\t\t\t\t{\n\t\t\t\t\tbWaitForCooldown = true;\n\t\t\t\t\tSoOwner->CooldownBlocksEvent.Broadcast(i, SoOwner->Cooldowns[i].Counter, SoOwner->Cooldowns[i].Object);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\tconst bool bCantCauseInAir = !RuneStone->bCanBeUsedInAir && !SoOwner->SoMovement->IsMovingOnGround();\n\t\t\tconst bool bCantCauseNoSKZone = !RuneStone->bCanBeUsedInSKFreeZone && !SoOwner->bCanUseSoulkeeper;\n\n\t\t\tif (!bWaitForCooldown && !bCantCauseInAir && !bCantCauseNoSKZone)\n\t\t\t{\n\t\t\t\tconst TSubclassOf<USoEffectBase>& Effect = RuneStone->GetEffect();\n\t\t\t\tif (Effect != nullptr)\n\t\t\t\t{\n\t\t\t\t\tUSoEffectBase* DefaultEffectObject = Effect->GetDefaultObject<USoEffectBase>();\n\t\t\t\t\tif (DefaultEffectObject->CanBeApplied(SoOwner))\n\t\t\t\t\t{\n\t\t\t\t\t\tISoMortal::Execute_ApplyEffect(SoOwner, Effect, true);\n\n\t\t\t\t\t\tif (RuneStone->SFXOnUse != nullptr)\n\t\t\t\t\t\t\tUSoAudioManager::PlaySoundAtLocation(SoOwner, RuneStone->SFXOnUse, SoOwner->GetActorTransform());\n\n\t\t\t\t\t\tif (Amount != nullptr)\n\t\t\t\t\t\t\t(*Amount) -= 1;\n\n\t\t\t\t\t\tconst float Cooldown = ISoCooldown::Execute_GetCooldownDuration(RuneStone);\n\t\t\t\t\t\tconst bool bCanCountdownInAir = ISoCooldown::Execute_CanCountDownInAir(RuneStone);\n\t\t\t\t\t\tif (Cooldown > KINDA_SMALL_NUMBER)\n\t\t\t\t\t\t\tSoOwner->AddCooldown(RuneStone, Cooldown, bCanCountdownInAir);\n\n\t\t\t\t\t\tSoOwner->GetPlayerProgress()->OnSpellUsed(RuneStone);\n\t\t\t\t\t\tOnSelectedSpellChanged.Broadcast();\n\t\t\t\t\t\tOnSelectedSpellCasted.Broadcast();\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tconst ESoDisplayText ReasonText = DefaultEffectObject->GetCantBeAppliedReason();\n\t\t\t\t\tif (ReasonText != ESoDisplayText::EDT_Max)\n\t\t\t\t\t\tASoGameMode::Get(this).DisplayText(SoOwner->GetActorLocation(), ReasonText);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif (bCantCauseNoSKZone)\n\t\t\t\t{\n\t\t\t\t\tASoGameMode::Get(this).DisplayText(SoOwner->GetActorLocation(), ESoDisplayText::EDT_CantUseInSKFreeZone);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tif (bCantCauseInAir)\n\t\t\t\t\t\tASoGameMode::Get(this).DisplayText(SoOwner->GetActorLocation(), ESoDisplayText::EDT_CantUseInAir);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tUSoAudioManager::PlaySoundAtLocation(SoOwner, SoOwner->SFXFCanNot, {});\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoPlayerCharacterSheet::DecreaseRuneStoneCharges(USoItemTemplateRuneStone* RuneStone)\n{\n\tint32* Amount = SpellMap.Find(RuneStone);\n\tif (Amount != nullptr && *Amount > 0)\n\t{\n\t\t(*Amount) -= 1;\n\t\tOnSelectedSpellChanged.Broadcast();\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoPlayerCharacterSheet::RegainLastUsedRuneStoneCharge()\n{\n\tconst USoItemTemplateRuneStone* ActiveRuneStone = GetActiveSpell();\n\tint32* Amount = SpellMap.Find(ActiveRuneStone);\n\tif (Amount != nullptr && ActiveRuneStone != nullptr)\n\t\tfor (const FSoItem& Rune : EquippedRuneStones)\n\t\t\tif (ActiveRuneStone == Rune.GetTemplateAsRuneStone() && ActiveRuneStone->UsageCount > 0)\n\t\t\t{\n\t\t\t\t(*Amount) = FMath::Min((*Amount + 1), ActiveRuneStone->UsageCount * Rune.Amount);\n\t\t\t\tOnSelectedSpellChanged.Broadcast();\n\t\t\t\treturn true;\n\t\t\t}\n\n\treturn false;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoPlayerCharacterSheet::SetSpellUsageCount(const USoItemTemplateRuneStone* Spell, int32 Amount, bool bDelta)\n{\n\tint32* AmountPtr = SpellMap.Find(Spell);\n\tif (AmountPtr != nullptr)\n\t{\n\t\tif (bDelta)\n\t\t\t(*AmountPtr) += Amount;\n\t\telse\n\t\t\t(*AmountPtr) = Amount;\n\t\tOnSelectedSpellChanged.Broadcast();\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoPlayerCharacterSheet::SaveEquipment()\n{\n\tFSoWorldState::Get().WriteEquippedItemList(CurrentEquipment);\n\tFSoWorldState::Get().WriteEquippedSpellItemList(EquippedRuneStones);\n\n\t// Write the current slot equipment templates\n\tTArray<USoItemTemplate*> ItemTemplates;\n\tfor (const FSoItem& Item : CurrentEquipment)\n\t{\n\t\tif (Item.Template != nullptr)\n\t\t{\n\t\t\tItemTemplates.Add(Item.Template);\n\t\t}\n\t}\n\n\tFSoWorldState::Get().SetMetadataEquippedItems(ItemTemplates);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoPlayerCharacterSheet::LoadEquipment()\n{\n\tfor (int32 i = 0; i < CurrentEquipment.Num(); ++i)\n\t\tCurrentEquipment[i] = FSoItem{};\n\n\tTArray<FSoItem> Items;\n\tTArray<FSoItem> Spells;\n\tFSoWorldState::Get().ReadEquippedItemList(Items);\n\tFSoWorldState::Get().ReadEquippedSpellItemList(Spells);\n\n\tfor (int32 i = 0; i < Items.Num(); ++i)\n\t{\n\t\tif (Items[i].Template != nullptr)\n\t\t{\n\t\t\tif (i < CurrentEquipment.Num() && Items[i].Template->IsSlotCompatible(static_cast<ESoItemSlot>(i)))\n\t\t\t{\n\t\t\t\tCurrentEquipment[i] = Items[i];\n\t\t\t\tOnItemEquiped(static_cast<ESoItemSlot>(i), Items[i], true);\n\t\t\t}\n\t\t\telse\n\t\t\t\tSoOwner->GetInventory()->AddItem(Items[i]);\n\t\t}\n\t}\n\n\tEquippedRuneStones.Empty();\n\tfor (const FSoItem& Spell : Spells)\n\t\tif (Cast<USoItemTemplateRuneStone>(Spell.Template) != nullptr)\n\t\t\tEquippedRuneStones.Add(Spell);\n\tOnEquippedSpellListChanged.Broadcast();\n\n\tfor (int32 i = 0; i < CurrentEquipment.Num(); ++i)\n\t{\n\t\tUpdateSlot(static_cast<ESoItemSlot>(i));\n\t\tOnSlotChange(static_cast<ESoItemSlot>(i));\n\t}\n\n\tRestoreSpells();\n\tOnSelectedSpellChanged.Broadcast();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoPlayerCharacterSheet::ReplaceRuneStone(USoItemTemplateRuneStone* OldStone, USoItemTemplateRuneStone* NewStone)\n{\n\tif (OldStone == nullptr || NewStone == nullptr)\n\t{\n\t\tUE_LOG(LogSoPlayerCharacterSheet, Error, TEXT(\"USoPlayerCharacterSheet::ReplaceRuneStone called with invalid template(s)\"))\n\t\treturn false;\n\t}\n\n\tUSoInventoryComponent* InventoryComponent = SoOwner->GetInventory();\n\n\tbool bFound = false;\n\n\tint32 ItemIndex = InventoryComponent->GetIndexFromTemplate(OldStone);\n\tif (ItemIndex >= 0)\n\t{\n\t\tbFound = true;\n\t\tInventoryComponent->GetItemList()[ItemIndex].Template = NewStone;\n\n\t}\n\n\tfor (int32 i = EquippedRuneStones.Num() - 1; i>=0; --i)\n\t\tif (EquippedRuneStones[i].Template == OldStone)\n\t\t{\n\t\t\tbFound = true;\n\t\t\tEquippedRuneStones[i].Template = NewStone;\n\t\t}\n\n\tif (bFound)\n\t{\n\t\tSpellMap.Remove(OldStone);\n\t\tOnSelectedSpellChanged.Broadcast();\n\t\treturn true;\n\t}\n\n\treturn false;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nconst FSoItem& USoPlayerCharacterSheet::GetEquippedItem(ESoItemSlot ItemSlot) const\n{\n\tconst int32 Index = static_cast<int32>(ItemSlot);\n\tif (CurrentEquipment.IsValidIndex(Index))\n\t\treturn CurrentEquipment[Index];\n\n\tUE_LOG(LogSoPlayerCharacterSheet, Error, TEXT(\"USoPlayerCharacterSheet::GetEquippedItem called with invalid index %d\"), Index);\n\treturn FSoItem::Invalid;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoPlayerCharacterSheet::IsSlotNotEmpty(ESoItemSlot ItemSlot) const\n{\n\tconst int32 Index = static_cast<int32>(ItemSlot);\n\treturn (CurrentEquipment.IsValidIndex(Index) && CurrentEquipment[Index].Template != nullptr);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFSoItem& USoPlayerCharacterSheet::GetEquippedItem(ESoItemSlot ItemSlot)\n{\n\tconst int32 Index = static_cast<int32>(ItemSlot);\n\tcheck(Index >= 0 && Index < CurrentEquipment.Num());\n\treturn CurrentEquipment[Index];\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoPlayerCharacterSheet::IsItemEquipped(USoItemTemplate* Template) const\n{\n\tfor (const FSoItem& Item : CurrentEquipment)\n\t\tif (Item.Template == Template)\n\t\t\treturn true;\n\n\treturn false;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoPlayerCharacterSheet::DecreaseItemCountOnSlot(ESoItemSlot ItemSlot, int32 Delta)\n{\n\tconst int32 Index = static_cast<int32>(ItemSlot);\n\n\tif (CurrentEquipment[Index].Template == nullptr || CurrentEquipment[Index].Template->IsStackable() == false)\n\t\treturn true;\n\n\tif (CurrentEquipment[Index].Amount <= Delta && CurrentEquipment[Index].Template->DestroyOnRunOut())\n\t{\n\t\tDestroyItemOnSlot(ItemSlot);\n\t\tToggleItemSlots();\n\t\treturn false;\n\t}\n\n\tCurrentEquipment[Index].Amount -= Delta;\n\tUpdateSlot(ItemSlot);\n\treturn true;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoPlayerCharacterSheet::DestroyItemOnSlot(ESoItemSlot TargetSlot)\n{\n\tconst int32 Index = static_cast<int32>(TargetSlot);\n\tif (Index < 0 || Index > CurrentEquipment.Num())\n\t{\n\t\tUE_LOG(LogSoPlayerCharacterSheet, Error, TEXT(\"Failed to destroy equipped item: wrong slot index!\"));\n\t\treturn;\n\t}\n\tif (CurrentEquipment[Index].Template != nullptr)\n\t{\n\t\tOnItemEquiped(TargetSlot, CurrentEquipment[Index], false);\n\t\tCurrentEquipment[Index] = FSoItem{};\n\t\tOnSlotChanged.Broadcast(TargetSlot);\n\t\tRecalculateStats();\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoPlayerCharacterSheet::UpdateSlot(ESoItemSlot TargetSlot)\n{\n\tOnSlotChanged.Broadcast(TargetSlot);\n\tRecalculateStats();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoPlayerCharacterSheet::OnSlotChange(ESoItemSlot Slot)\n{\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoPlayerCharacterSheet::SetEquippedSpells(const TArray<FSoItem>& RuneStones)\n{\n\tActiveEquippedRuneStoneIndex = 0;\n\tEquippedRuneStones = RuneStones;\n\tOnEquippedSpellListChanged.Broadcast();\n\n\tRestoreSpells();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoPlayerCharacterSheet::RestoreSpells()\n{\n\tTArray<TSubclassOf<USoEffectBase>> EffectsToApply;\n\tSpellMap.Empty();\n\tfor (const FSoItem& Runes : EquippedRuneStones)\n\t{\n\t\tconst USoItemTemplateRuneStone* RuneStone = Runes.GetTemplateAsRuneStone();\n\t\tif (RuneStone->UsageCount > 0)\n\t\t\tSpellMap.Add(RuneStone, RuneStone->UsageCount  * Runes.Amount);\n\t\telse if (RuneStone->UsageCount == 0)\n\t\t{\n\t\t\tSpellMap.Add(RuneStone, 0);\n\t\t\tEffectsToApply.Add(RuneStone->GetEffect());\n\t\t}\n\t}\n\tOnSelectedSpellChanged.Broadcast();\n\n\tSoOwner->OnSpellsReseted.Broadcast();\n\n\tfor (auto& Effect : EffectsToApply)\n\t\tISoMortal::Execute_ApplyEffect(SoOwner, Effect, true);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoPlayerCharacterSheet::RegainSpellCharges()\n{\n\tfor (const FSoItem& Runes : EquippedRuneStones)\n\t{\n\t\tconst USoItemTemplateRuneStone* RuneStone = Runes.GetTemplateAsRuneStone();\n\t\tif (RuneStone->UsageCount > 0)\n\t\t\tSpellMap.Add(RuneStone, RuneStone->UsageCount  * Runes.Amount);\n\t\telse if (RuneStone->UsageCount == 0)\n\t\t\tSpellMap.Add(RuneStone, 0);\n\t}\n\tOnSelectedSpellChanged.Broadcast();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nconst USoItemTemplateRuneStone* USoPlayerCharacterSheet::GetActiveSpell() const\n{\n\tif (EquippedRuneStones.IsValidIndex(ActiveEquippedRuneStoneIndex))\n\t\treturn EquippedRuneStones[ActiveEquippedRuneStoneIndex].GetTemplateAsRuneStone();\n\n\treturn nullptr;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUSoItemTemplateRuneStone* USoPlayerCharacterSheet::GetActiveSpell()\n{\n\tif (EquippedRuneStones.IsValidIndex(ActiveEquippedRuneStoneIndex))\n\t\treturn EquippedRuneStones[ActiveEquippedRuneStoneIndex].GetTemplateAsRuneStone();\n\n\treturn nullptr;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nint32 USoPlayerCharacterSheet::GetRuneStoneEquippedCountFromSpellEffect(UObject* Effect) const\n{\n\tint32 Amount = 0;\n\tif (Effect != nullptr)\n\t\tif (UClass* EftClass = Effect->GetClass())\n\t\t\tfor (const FSoItem& EquippedRuneStone : EquippedRuneStones)\n\t\t\t\tif (USoItemTemplateRuneStone* RuneStone = Cast<USoItemTemplateRuneStone>(EquippedRuneStone.Template))\n\t\t\t\t\tif (RuneStone->Effect == EftClass)\n\t\t\t\t\t{\n\t\t\t\t\t\tAmount += EquippedRuneStone.Amount;\n\t\t\t\t\t}\n\n\treturn Amount;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nint32 USoPlayerCharacterSheet::GetRuneStoneEquippedCount(USoItemTemplateRuneStone* RuneStone) const\n{\n\tint32 Amount = 0;\n\tfor (const FSoItem& EquippedRuneStone : EquippedRuneStones)\n\t\tif (EquippedRuneStone.Template == RuneStone)\n\t\t\t{\n\t\t\t\tAmount += EquippedRuneStone.Amount;\n\t\t\t}\n\n\treturn Amount;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nint32 USoPlayerCharacterSheet::GetRuneStoneActiveChargeCount(USoItemTemplateRuneStone* RuneStone) const\n{\n\tconst int32* Amount = SpellMap.Find(RuneStone);\n\t// check if it isn't used up all\n\tif (Amount == nullptr)\n\t\treturn RuneStone->UsageCount;\n\n\treturn *Amount;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nESoUsableItemType USoPlayerCharacterSheet::GetPrimaryItemType() const\n{\n\tconst FSoItem& Item = CurrentEquipment[static_cast<int32>(ESoItemSlot::EIS_Item0)];\n\tif (Item.Template == nullptr)\n\t\treturn ESoUsableItemType::EUIT_MAX;\n\n\tcheck(Cast<USoUsableItemTemplate>(Item.Template));\n\treturn Cast<USoUsableItemTemplate>(Item.Template)->UsableType;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nint32 USoPlayerCharacterSheet::RefillTestStoneBag(FName BagName)\n{\n\tauto CheckItem = [BagName](FSoItem& Item) -> bool\n\t{\n\t\tif (USoUsableItemTemplate* Usable = Cast<USoUsableItemTemplate>(Item.Template))\n\t\t\treturn (Usable->UsableItemName == BagName);\n\n\t\treturn false;\n\t};\n\n\tauto OnItemFound = [](FSoItem& Item)\n\t{\n\t\tconst int32 AmountToAdd = FMath::Max(0, Item.Template->GetMaxStackNum() - Item.Amount);\n\t\tItem.Amount += AmountToAdd;\n\t\treturn AmountToAdd;\n\t};\n\n\tfor (int32 i = static_cast<int32>(ESoItemSlot::EIS_Item0); i <= static_cast<int32>(ESoItemSlot::EIS_Item1); ++i)\n\t\tif (CheckItem(CurrentEquipment[i]))\n\t\t{\n\t\t\tconst int32 Result = OnItemFound(CurrentEquipment[i]);\n\t\t\tOnSlotChanged.Broadcast(static_cast<ESoItemSlot>(i));\n\t\t\treturn Result;\n\t\t}\n\n\tTArray<FSoItem>& ItemList = SoOwner->SoInventory->GetItemList();\n\tfor (int32 i = 0; i < ItemList.Num(); ++i)\n\t\tif (CheckItem(ItemList[i]))\n\t\t\treturn OnItemFound(ItemList[i]);\n\n\treturn -1;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoPlayerCharacterSheet::ToggleItemSlots()\n{\n\tif (ToggleSlotContents2(static_cast<int32>(ESoItemSlot::EIS_Item0)))\n\t\tUSoAudioManager::PlaySoundAtLocation(SoOwner, SoOwner->SFXItemSwitch, SoOwner->GetActorTransform());\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoPlayerCharacterSheet::ToggleWeapons()\n{\n\tif (ToggleSlotContents2(static_cast<int32>(ESoItemSlot::EIS_Weapon0)))\n\t\tUSoAudioManager::PlaySoundAtLocation(SoOwner, SoOwner->SFXWeaponSwitch, SoOwner->GetActorTransform());\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoPlayerCharacterSheet::ToggleSpells()\n{\n\tif (EquippedRuneStones.Num() > 0)\n\t{\n\t\tActiveEquippedRuneStoneIndex = USoMathHelper::WrapIndexAround(ActiveEquippedRuneStoneIndex + 1, EquippedRuneStones.Num());\n\t\tOnSelectedSpellSwitched.Broadcast();\n\t}\n}\n\nvoid USoPlayerCharacterSheet::SetActiveSpellIndex(const int32 SpellIndex)\n{\n\tif (EquippedRuneStones.IsValidIndex(SpellIndex))\n\t{\n\t\tActiveEquippedRuneStoneIndex = SpellIndex;\n\t\tOnSelectedSpellSwitched.Broadcast();\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoPlayerCharacterSheet::ToggleSlotContents2(int32 A)\n{\n\tcheck(A >= 0 && A + 1 < CurrentEquipment.Num());\n\n\tconst int32 B = A + 1;\n\tif (CurrentEquipment[B].Template == nullptr)\n\t\treturn false;\n\n\tSwap(CurrentEquipment[A], CurrentEquipment[B]);\n\n\tOnSlotChanged.Broadcast(static_cast<ESoItemSlot>(A));\n\tOnSlotChanged.Broadcast(static_cast<ESoItemSlot>(B));\n\n\treturn true;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoPlayerCharacterSheet::HasWeaponReady() const\n{\n\treturn CurrentEquipment[static_cast<int32>(ESoItemSlot::EIS_Weapon0)].Template != nullptr;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoPlayerCharacterSheet::OnItemPickedUp(const FSoItem& Item, int32 InventorySlotIndex)\n{\n\tif (Item.Template == nullptr)\n\t\treturn;\n\n\n\tUSoQuestItemTemplate* QuestTemplate = Cast<USoQuestItemTemplate>(Item.Template);\n\tif (QuestTemplate != nullptr && QuestTemplate->BoolToAdd != NAME_None && InventorySlotIndex != -1)\n\t{\n\t\tif (SoOwner->SoInventory->GetItem(InventorySlotIndex).Amount == QuestTemplate->MaxStackNum)\n\t\t\tSetBoolValue(QuestTemplate->BoolToAdd, true);\n\t}\n\n\t// add to existing character sheet slot if possible?\n\tfor (int32 i = 0; i < CurrentEquipment.Num(); ++i)\n\t\tif (Item.Template == CurrentEquipment[i].Template &&\n\t\t\tCurrentEquipment[i].Amount + Item.Amount < CurrentEquipment[i].Template->GetMaxStackNum())\n\t\t{\n\t\t\tCurrentEquipment[i].Amount += Item.Amount;\n\t\t\tOnSlotChanged.Broadcast(static_cast<ESoItemSlot>(i));\n\n\t\t\tif (!SoOwner->SoInventory->RemoveItem(InventorySlotIndex, Item.Amount))\n\t\t\t{\n\t\t\t\tUE_LOG(LogSoPlayerCharacterSheet, Error, TEXT(\"OnItemPickedUp: Failed to remove item amount at SlotIndex = %d\"), InventorySlotIndex);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t// auto equip\n\tfor (int32 i = 0; i < CurrentEquipment.Num(); ++i)\n\t\tif (Item.Template->IsSlotCompatible(static_cast<ESoItemSlot>(i)) && CurrentEquipment[i].Template == nullptr)\n\t\t{\n\t\t\tEquip(InventorySlotIndex, static_cast<ESoItemSlot>(i));\n\t\t\treturn;\n\t\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoPlayerCharacterSheet::OnItemRemoved(const FSoItem& Item)\n{\n\tUSoQuestItemTemplate* QuestTemplate = Cast<USoQuestItemTemplate>(Item.Template);\n\tif (QuestTemplate != nullptr && QuestTemplate->BoolToAdd != NAME_None)\n\t\tSetBoolValue(QuestTemplate->BoolToAdd, false);\n\n\t// remove equipped spells if necessary\n\tif (USoItemTemplateRuneStone* RuneStone = Cast<USoItemTemplateRuneStone>(Item.Template))\n\t{\n\t\tfor (int32 i = 0; i < EquippedRuneStones.Num(); ++i)\n\t\t\tif (EquippedRuneStones[i].Template == RuneStone)\n\t\t\t{\n\t\t\t\tconst int32 MaxAmount = SoOwner->GetInventory()->CalcItemCountFromTemplate(RuneStone);\n\t\t\t\tEquippedRuneStones[i].Amount = FMath::Min(EquippedRuneStones[i].Amount, MaxAmount);\n\t\t\t\tif (EquippedRuneStones[i].Amount == 0)\n\t\t\t\t{\n\t\t\t\t\tSpellMap.Remove(RuneStone);\n\t\t\t\t\tEquippedRuneStones.RemoveAt(i);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t\tif (int32* AmountPtr = SpellMap.Find(RuneStone))\n\t\t\t\t\t\t*AmountPtr = FMath::Min(*AmountPtr, MaxAmount);\n\n\t\t\t\tOnSelectedSpellChanged.Broadcast();\n\t\t\t\tbreak;\n\t\t\t}\n\t\tOnEquippedSpellListChanged.Broadcast();\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoPlayerCharacterSheet::EquipFromSlot(int32 SourceInventoryIndex)\n{\n\tUSoInventoryComponent* Inventory = SoOwner->GetInventory();\n\tconst TArray<FSoItem>& ItemList = Inventory->GetItemList();\n\tif (SourceInventoryIndex < 0 || SourceInventoryIndex >= ItemList.Num() || ItemList[SourceInventoryIndex].Template == nullptr)\n\t\treturn;\n\n\tconst ESoItemSlot Slot = ItemList[SourceInventoryIndex].Template->GetDefaultSlot();\n\n\tswitch (Slot)\n\t{\n\t\tcase ESoItemSlot::EIS_Max:\n\t\t\treturn;\n\n\t\tcase ESoItemSlot::EIS_Item0:\n\t\t{\n\t\t\tint32 i = static_cast<int32>(ESoItemSlot::EIS_Item0);\n\t\t\tfor (; i <= static_cast<int32>(ESoItemSlot::EIS_Item1); ++i)\n\t\t\t\tif (CurrentEquipment[i].Template == nullptr)\n\t\t\t\t\tbreak;\n\n\t\t\tif (i > static_cast<int32>(ESoItemSlot::EIS_Item1))\n\t\t\t\ti = static_cast<int32>(ESoItemSlot::EIS_Item0);\n\n\t\t\tEquip(SourceInventoryIndex, static_cast<ESoItemSlot>(i));\n\t\t}\n\t\tbreak;\n\n\t\tdefault:\n\t\t\tEquip(SourceInventoryIndex, Slot);\n\t\t\tbreak;\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoPlayerCharacterSheet::Equip(int32 SourceInventoryIndex, ESoItemSlot TargetSlot)\n{\n\tUSoInventoryComponent* Inventory = SoOwner->GetInventory();\n\tconst TArray<FSoItem> ItemList = Inventory->GetItemList();\n\n\tif (SourceInventoryIndex >= 0 && SourceInventoryIndex < ItemList.Num())\n\t{\n\t\tconst FSoItem Item = ItemList[SourceInventoryIndex];\n\t\tif (Item.Template != nullptr && Item.Template->IsSlotCompatible(TargetSlot))\n\t\t{\n\t\t\tInventory->RemoveItem(SourceInventoryIndex, Item.Amount);\n\t\t\tUnequip(TargetSlot);\n\t\t\tconst int32 EquippedIndex = static_cast<int32>(TargetSlot);\n\t\t\tCurrentEquipment[EquippedIndex] = Item;\n\t\t\tOnItemEquiped(TargetSlot, Item, true);\n\n\t\t\tOnSlotChanged.Broadcast(TargetSlot);\n\t\t\tRecalculateStats();\n\n\t\t\tif (USoPlayerProgress* Progress = SoOwner->GetPlayerProgress())\n\t\t\t\tProgress->OnEquippedItem(Item.Template);\n\t\t}\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoPlayerCharacterSheet::Unequip(ESoItemSlot TargetSlot)\n{\n\tconst int32 EquippedIndex = static_cast<int32>(TargetSlot);\n\tcheck(EquippedIndex >= 0 && EquippedIndex < CurrentEquipment.Num());\n\n\tif (CurrentEquipment[EquippedIndex].Template != nullptr)\n\t{\n\t\tconst FSoItem Item = CurrentEquipment[EquippedIndex];\n\t\tCurrentEquipment[EquippedIndex] = FSoItem{};\n\t\tOnItemEquiped(TargetSlot, Item, false);\n\t\tSoOwner->GetInventory()->AddItem(Item);\n\n\t\tOnSlotChanged.Broadcast(TargetSlot);\n\t\tRecalculateStats();\n\n\t\tif (USoPlayerProgress* Progress = SoOwner->GetPlayerProgress())\n\t\t\tProgress->OnUnEquippedItem(Item.Template);\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoPlayerCharacterSheet::SwapSlots(ESoItemSlot SourceSlot, ESoItemSlot TargetSlot)\n{\n\tconst int32 SourceIndex = static_cast<int32>(SourceSlot);\n\tconst int32 TargetIndex = static_cast<int32>(TargetSlot);\n\tcheck(SourceIndex >= 0 && SourceIndex < CurrentEquipment.Num());\n\tcheck(TargetIndex >= 0 && TargetIndex < CurrentEquipment.Num());\n\n\tif (CurrentEquipment[SourceIndex].Template == nullptr)\n\t\treturn;\n\n\tif (CurrentEquipment[SourceIndex].Template->IsSlotCompatible(TargetSlot))\n\t{\n\t\tOnItemEquiped(SourceSlot, CurrentEquipment[SourceIndex], false);\n\t\tOnItemEquiped(TargetSlot, CurrentEquipment[TargetIndex], false);\n\n\t\tSwap(CurrentEquipment[SourceIndex], CurrentEquipment[TargetIndex]);\n\n\t\tOnItemEquiped(SourceSlot, CurrentEquipment[SourceIndex], true);\n\t\tOnItemEquiped(TargetSlot, CurrentEquipment[TargetIndex], true);\n\n\t\tOnSlotChanged.Broadcast(SourceSlot);\n\t\tOnSlotChanged.Broadcast(TargetSlot);\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoPlayerCharacterSheet::SetUsableAmount(FName UsableName, int32 Amount, bool bDelta)\n{\n\tauto IsDesiredItem = [UsableName](const FSoItem& Item) -> bool\n\t{\n\t\tconst USoUsableItemTemplate* Usable = Cast<USoUsableItemTemplate>(Item.Template);\n\t\treturn (Usable != nullptr && Usable->GetUsableItemName() == UsableName);\n\t};\n\n\t// check equiped items\n\tfor (int32 i = 0; i < 3; ++i)\n\t{\n\t\tconst int32 Index = static_cast<int32>(ESoItemSlot::EIS_Item0) + i;\n\t\tconst ESoItemSlot Slot = static_cast<ESoItemSlot>(Index);\n\t\tif (IsDesiredItem(CurrentEquipment[Index]))\n\t\t{\n\t\t\tif (bDelta)\n\t\t\t\tDecreaseItemCountOnSlot(Slot, -Amount);\n\t\t\telse\n\t\t\t{\n\t\t\t\tCurrentEquipment[Index].Amount = Amount;\n\t\t\t\tOnSlotChanged.Broadcast(Slot);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t}\n\n\t// check inventory\n\tconst TArray<FSoItem>& ItemList = SoOwner->GetInventory()->GetItemList();\n\tfor (int32 i = 0; i < ItemList.Num(); ++i)\n\t\tif (IsDesiredItem(ItemList[i]))\n\t\t{\n\t\t\tSoOwner->GetInventory()->ModifyItemCount(i, bDelta, Amount);\n\t\t\treturn;\n\t\t}\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nint32 USoPlayerCharacterSheet::GetUsableAmount(FName UsableName) const\n{\n\tauto IsDesiredItem = [UsableName](const FSoItem& Item) -> bool\n\t{\n\t\tconst USoUsableItemTemplate* Usable = Cast<USoUsableItemTemplate>(Item.Template);\n\t\treturn (Usable != nullptr && Usable->GetUsableItemName() == UsableName);\n\t};\n\n\t// check equiped items\n\tfor (int32 i = 0; i < 3; ++i)\n\t{\n\t\tconst int32 Index = static_cast<int32>(ESoItemSlot::EIS_Item0) + i;\n\t\tESoItemSlot Slot = static_cast<ESoItemSlot>(Index);\n\t\tif (IsDesiredItem(CurrentEquipment[Index]))\n\t\t\treturn CurrentEquipment[Index].Amount;\n\t}\n\n\t// check inventory\n\tconst TArray<FSoItem>& ItemList = SoOwner->GetInventory()->GetItemList();\n\tfor (int32 i = 0; i < ItemList.Num(); ++i)\n\t\tif (IsDesiredItem(ItemList[i]))\n\t\t\treturn ItemList[i].Amount;\n\n\treturn 0;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoPlayerCharacterSheet::DrinkPotionFromInventory(int32 ItemIndex)\n{\n\tUSoInventoryComponent* Inventory = SoOwner->GetInventory();\n\tTArray<FSoItem>& ItemList = Inventory->GetItemList();\n\tif (ItemList.IsValidIndex(ItemIndex) && ItemList[ItemIndex].Amount > 0)\n\t{\n\t\tif (USoUsableItemTemplate* Potion = Cast<USoUsableItemTemplate>(ItemList[ItemIndex].Template))\n\t\t{\n\t\t\tif (Potion->UsableType == ESoUsableItemType::EUIT_Potion)\n\t\t\t{\n\t\t\t\tApplyPotionEffects(Potion);\n\t\t\t\tUSoAudioManager::PlaySoundAtLocation(SoOwner, SoOwner->SFXFOnHeal, SoOwner->GetActorTransform());\n\t\t\t\tItemList[ItemIndex].Amount -= 1;\n\t\t\t\tif (ItemList[ItemIndex].Amount == 0 && Potion->DestroyOnRunOut())\n\t\t\t\t\tInventory->RemoveItem(ItemIndex, 0);\n\t\t\t}\n\t\t}\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoPlayerCharacterSheet::ApplyPotionEffects(USoUsableItemTemplate* Potion)\n{\n\tif (Potion != nullptr && Potion->UsableType == ESoUsableItemType::EUIT_Potion)\n\t{\n\t\tfor (const TSubclassOf<USoEffectBase>& EffectClass : Potion->Effects)\n\t\t\tISoMortal::Execute_ApplyEffect(SoOwner, EffectClass, true);\n\n\t\tif (Potion->HealAmount > 0.0f)\n\t\t{\n\t\t\tIncreaseHealth(Potion->HealAmount);\n\t\t\tDecreaseSoulkeeperRespawnPenalty(Potion->HealAmount);\n\t\t\tSoOwner->DisplayVisualEffect_Implementation(ESoVisualEffect::EVE_Heal);\n\t\t}\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoPlayerCharacterSheet::OnItemEquiped(ESoItemSlot Slot, const FSoItem& Item, bool bEquiped)\n{\n\t// not all item slots can give static effects\n\tswitch (Slot)\n\t{\n\t\tcase ESoItemSlot::EIS_Item0:\n\t\tcase ESoItemSlot::EIS_Item1:\n\t\tcase ESoItemSlot::EIS_Weapon1:\n\t\t\treturn;\n\n\t\tcase ESoItemSlot::EIS_Weapon0:\n\t\t\tif (bEquiped)\n\t\t\t\tSoOwner->SelectWeapon(Item);\n\t\t\telse\n\t\t\t{\n\t\t\t\tSoOwner->SoSword->SetVisibility(false, true);\n\t\t\t\tSoOwner->SoOffHandWeapon->SetVisibility(false, true);\n\t\t\t}\n\t\t\treturn;\n\n\t\tdefault:\n\t\t\tbreak;\n\t}\n\n\tSoOwner->ApplyStaticEffects(Item, bEquiped);\n\n\tUSoItemTemplateShard* ShardTemplate = Cast<USoItemTemplateShard>(Item.Template);\n\tif (ShardTemplate != nullptr)\n\t\tUSoUIHelper::PreCacheTexture2D(ShardTemplate->GetIcon());\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoPlayerCharacterSheet::RecalculateStats()\n{\n\tOnRecalculateAttributes.Broadcast();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nfloat USoPlayerCharacterSheet::IncreaseSoulkeeperRespawnPenalty()\n{\n\tif (FSoWorldState::Get().GetGameDifficulty() != ESoDifficulty::Sane)\n\t\tSoulkeeperRespawnPenalty += 10.0f;\n\n\treturn SoulkeeperRespawnPenalty;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoPlayerCharacterSheet::SetIntValue(FName ValueName, int32 Value, bool bDelta)\n{\n\tif (!PlayerData.Ints.Contains(ValueName))\n\t\tPlayerData.Ints.Add(ValueName, 0);\n\n\tif (bDelta)\n\t\tPlayerData.Ints[ValueName] += Value;\n\telse\n\t\tPlayerData.Ints[ValueName] = Value;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nint32 USoPlayerCharacterSheet::GetIntValue(FName ValueName) const\n{\n\tif (!PlayerData.Ints.Contains(ValueName))\n\t{\n\t\treturn 0;\n\t}\n\treturn PlayerData.Ints[ValueName];\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoPlayerCharacterSheet::SetFloatValue(FName ValueName, float Value, bool bDelta)\n{\n\tif (!PlayerData.Floats.Contains(ValueName))\n\t\tPlayerData.Floats.Add(ValueName, 0.0f);\n\n\tif (bDelta)\n\t\tPlayerData.Floats[ValueName] += Value;\n\telse\n\t\tPlayerData.Floats[ValueName] = Value;\n}\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nfloat USoPlayerCharacterSheet::GetFloatValue(FName ValueName) const\n{\n\tif (!PlayerData.Floats.Contains(ValueName))\n\t{\n\t\treturn 0.0f;\n\t}\n\treturn PlayerData.Floats[ValueName];\n}\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoPlayerCharacterSheet::SetBoolValue(FName ValueName, bool bValue)\n{\n\tif (bValue)\n\t\tPlayerData.TrueBools.Add(ValueName);\n\telse\n\t\tPlayerData.TrueBools.Remove(ValueName);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoPlayerCharacterSheet::RemoveBoolsWithPrefix(const FString& Prefix)\n{\n\tTSet<FName> NewSet;\n\n\tfor (FName& Name : PlayerData.TrueBools)\n\t\tif (Name.ToString().Find(Prefix) == 0)\n\t\t\tNewSet.Add(Name);\n\n\tPlayerData.TrueBools = NewSet;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoPlayerCharacterSheet::GetBoolValue(FName ValueName) const\n{\n\treturn PlayerData.TrueBools.Contains(ValueName);\n}\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoPlayerCharacterSheet::SetNameValue(FName ValueName, FName Value)\n{\n\tif (PlayerData.Names.Contains(ValueName))\n\t\tPlayerData.Names[ValueName] = Value;\n\telse\n\t\tPlayerData.Names.Add(ValueName, Value);\n\n\tif (ValueName == SoOwner->ActiveDisplayNameName)\n\t\tUpdateDisplayName();\n}\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFName USoPlayerCharacterSheet::GetNameValue(FName ValueName)\n{\n\tif (PlayerData.Names.Contains(ValueName))\n\t\treturn PlayerData.Names[ValueName];\n\n\treturn NAME_None;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoPlayerCharacterSheet::UpdateDisplayName()\n{\n\tFText* DisplayNamePtr = SoOwner->DialogueDisplayNameMap.Find(GetNameValue(SoOwner->ActiveDisplayNameName));\n\tif (DisplayNamePtr != nullptr)\n\t\tSoOwner->DialogueData.ParticipantDisplayName = *DisplayNamePtr;\n\telse\n\t\tSoOwner->DialogueData.ParticipantDisplayName = FROM_STRING_TABLE_DIALOGUE(\"char_name_warriorb\");\n}\n"
  },
  {
    "path": "Source/SOrb/Character/SoPlayerCharacterSheet.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#pragma once\n\n#include \"CharacterBase/SoCharacterSheet.h\"\n#include \"Items/SoItem.h\"\n#include \"SaveFiles/SoWorldStateTypes.h\"\n#include \"Basic/SoDifficulty.h\"\n\n#include \"SoPlayerCharacterSheet.generated.h\"\n\nclass USoItemTemplateRuneStone;\nclass ASoCharacter;\nclass USoUsableItemTemplate;\n\nUCLASS( ClassGroup=(Custom), meta=(BlueprintSpawnableComponent) )\nclass SORB_API USoPlayerCharacterSheet : public USoCharacterSheet\n{\n\tGENERATED_BODY()\npublic:\n\n\tUSoPlayerCharacterSheet();\n\n\tvirtual void InitializeComponent() override;\n\tvirtual void UninitializeComponent() override;\n\n\t// called before the game state is serialized (aka saved)\n\tUFUNCTION()\n\tvoid OnSave();\n\n\t// called after the game state is reloaded (aka loaded)\n\tUFUNCTION()\n\tvoid OnReload();\n\n\t/** call when difficulty is changed during game so the proper SK rune can be activated */\n\tvoid OnDifficultyChanged(ESoDifficulty NewDifficulty);\n\n\tvoid OnRevive(bool bSoulKeeperNotUsed);\n\n\t/** Heals, restores SK, spells etc. */\n\tUFUNCTION(BlueprintCallable, Category = Health)\n\tvoid Heal();\n\n\tUFUNCTION(BlueprintCallable, Category = Health)\n\tvoid ApplyHealthUpgrade();\n\n\n\t// res rune\n\n\tUFUNCTION(BlueprintCallable, Category = Spells)\n\tvoid AddSoulStone(USoItemTemplateRuneStone* SoulStoneTemplate);\n\n\tUFUNCTION(BlueprintCallable, Category = Spells)\n\tint32 GetMaxResRunCount() const { return MaxRuneNum; }\n\n\t// sets only the current one, not the default/max value\n\tvoid SetSpellUsageCount(const USoItemTemplateRuneStone* Spell, int32 Amount, bool bDelta);\n\n\tvoid SetUsableAmount(FName UsableName, int32 Amount, bool bDelta);\n\tint32 GetUsableAmount(FName UsableName) const;\n\n\tvoid DrinkPotionFromInventory(int32 ItemIndex);\n\n\tvoid ApplyPotionEffects(USoUsableItemTemplate* Potion);\n\n\tUFUNCTION(BlueprintCallable, Category = Stats)\n\tvoid ApplyAttackSpeedModifier(float Multiplier) { AttackSpeedMultiplier *= Multiplier; }\n\n\tUFUNCTION(BlueprintCallable, Category = Stats)\n\tvoid ApplyCooldownCounterMultiplier(float Multiplier) { CooldownCounterMultiplier *= Multiplier; }\n\n\tUFUNCTION(BlueprintCallable, Category = Stats)\n\tvoid ModifyCriticalHitChance(float Delta) { CriticalHitChance += Delta; }\n\n\tUFUNCTION(BlueprintCallable, Category = Stats)\n\tvoid AddDamageModifer(float Multiplier) { DamageModifiers *= Multiplier; }\n\n\n\tfloat GetCooldownCounterMultiplier() { return CooldownCounterMultiplier; }\n\tfloat GetCriticalHitChance() { return CriticalHitChance; }\n\n\n\t// Helper to get the active checkpoint name\n\n\t// dynamic values defined by FName, can be used in story scripts/dialogues\n\tvoid SetIntValue(FName ValueName, int32 Value, bool bDelta = false);\n\tint32 GetIntValue(FName ValueName) const;\n\n\tvoid SetFloatValue(FName ValueName, float Value, bool bDelta = false);\n\tfloat GetFloatValue(FName ValueName) const;\n\n\tUFUNCTION(BlueprintCallable, Category = DlgVariables)\n\tvoid SetBoolValue(FName ValueName, bool bValue);\n\n\tvoid RemoveBoolsWithPrefix(const FString& Prefix);\n\n\tUFUNCTION(BlueprintPure, Category = DlgVariables)\n\tbool GetBoolValue(FName ValueName) const;\n\n\tUFUNCTION(BlueprintCallable, Category = DlgVariables)\n\tvoid SetNameValue(FName ValueName, FName Value);\n\n\tUFUNCTION(BlueprintPure, Category = DlgVariables)\n\tFName GetNameValue(FName ValueName);\n\n\tvoid UpdateDisplayName();\n\n\t// items\n\n\tvoid OnItemPickedUp(const FSoItem& Item, int32 InventorySlotIndex);\n\tvoid OnItemRemoved(const FSoItem& Item);\n\n\t// Equip an item from the inventory\n\tvoid Equip(int32 SourceInventoryIndex, ESoItemSlot TargetSlot);\n\n\t// Equip an item from the inventory\n\tvoid EquipFromSlot(int32 SourceInventoryIndex);\n\n\tvoid Unequip(ESoItemSlot TargetSlot);\n\n\t// move an item from a character sheet slot to another\n\t// TargetSlot can be empty, SourceSlot can not\n\tvoid SwapSlots(ESoItemSlot SourceSlot, ESoItemSlot TargetSlot);\n\n\tUFUNCTION(BlueprintPure, Category = \"Equipment\")\n\tconst FSoItem& GetEquippedItem(ESoItemSlot ItemSlot) const;\n\n\tUFUNCTION(BlueprintPure, Category = \"Equipment\")\n\tbool IsSlotNotEmpty(ESoItemSlot ItemSlot) const;\n\n\tFSoItem& GetEquippedItem(ESoItemSlot ItemSlot);\n\tbool IsItemEquipped(USoItemTemplate* Template) const;\n\n\t/** decreases only stackable items, return value: true if there is any left, false otherwise */\n\tbool DecreaseItemCountOnSlot(ESoItemSlot ItemSlot, int32 Delta = 1);\n\n\tUFUNCTION(BlueprintCallable, Category = \"Equipment\")\n\tvoid DestroyItemOnSlot(ESoItemSlot TargetSlot);\n\n\tvoid UpdateSlot(ESoItemSlot TargetSlot);\n\n\tUFUNCTION()\n\tvoid OnSlotChange(ESoItemSlot Slot);\n\n\t//\n\t// Spells\n\t//\n\tvoid UseActiveRuneStoneIfCastable();\n\n\t/** assumed to be the selected one */\n\tUFUNCTION(BlueprintCallable, Category = Spells)\n\tvoid DecreaseRuneStoneCharges(USoItemTemplateRuneStone* RuneStone);\n\n\tUFUNCTION(BlueprintCallable, Category = Spells)\n\tbool RegainLastUsedRuneStoneCharge();\n\n\t// sets equipped runestones, reinitializes the spell map (rest/spell reset is expected here)\n\tvoid SetEquippedSpells(const TArray<FSoItem>& RuneStones);\n\n\tUFUNCTION(BlueprintCallable, Category = Spells)\n\tvoid RestoreSpells();\n\n\t/** Regains spell charges but does not remove any active spells */\n\tUFUNCTION(BlueprintCallable, Category = Spells)\n\tvoid RegainSpellCharges();\n\n\tconst TArray<FSoItem>& GetEquippedSpells() const { return EquippedRuneStones; }\n\tbool HasAnyEquippedSpells() const { return EquippedRuneStones.Num() > 0;  }\n\n\tconst TMap<const USoItemTemplateRuneStone*, int32>& GetSpellMap() const { return SpellMap; }\n\n\tbool HasActiveSpell() const { return GetActiveSpell() != nullptr; }\n\n\tconst USoItemTemplateRuneStone* GetActiveSpell() const;\n\n\tUFUNCTION(BlueprintPure, Category = Spells)\n\tint32 GetRuneStoneEquippedCountFromSpellEffect(UObject* Effect) const;\n\n\tUFUNCTION(BlueprintPure, Category = Spells)\n\tint32 GetRuneStoneEquippedCount(USoItemTemplateRuneStone* RuneStone) const;\n\n\tUFUNCTION(BlueprintPure, Category = Spells)\n\tint32 GetRuneStoneActiveChargeCount(USoItemTemplateRuneStone* RuneStone) const;\n\n\tUFUNCTION(BlueprintPure, Category = Spells)\n\tUSoItemTemplateRuneStone* GetActiveSpell();\n\n\tbool CanCastActiveSpell() const { return CanUseSpells() && HasActiveSpell(); }\n\n\tint32 GetActiveSpellIndex() const { return ActiveEquippedRuneStoneIndex; }\n\tvoid SetActiveSpellIndex(const int32 SpellIndex);\n\n\tvoid ToggleSpells();\n\n\t// Only if we can use the spells, does not tell us if there is something to cast\n\t// bool CanUseSpells() const { return ESoUsableItemType::EUIT_Spell == GetPrimaryItemType(); }\n\n\t// let's try to allow spell switch and usage from spell switch wheel without having the spellcaster in primary slot\n\tbool CanUseSpells() const { return EquippedRuneStones.Num() > 0; }\n\n\n\tvoid ToggleItemSlots();\n\tvoid ToggleWeapons();\n\n\tbool HasWeaponReady() const;\n\n\n\tUFUNCTION(BlueprintCallable, Category = \"Equipment\")\n\tESoUsableItemType GetPrimaryItemType() const;\n\n\t/**\n\t *  Return: -1 -> no item\n\t *  Return: 0  -> already full\n\t *  Return: >0 -> x added\n\t */\n\tUFUNCTION(BlueprintCallable, Category = \"Equipment\")\n\tint32 RefillTestStoneBag(FName BagName);\n\n\tvoid RecalculateStats();\n\n\tvoid ResetSoulkeeperRespawnPenalty() { SoulkeeperRespawnPenalty = 0.0f; }\n\tfloat IncreaseSoulkeeperRespawnPenalty();\n\tvoid DecreaseSoulkeeperRespawnPenalty(float Amount) { SoulkeeperRespawnPenalty = FMath::Max(SoulkeeperRespawnPenalty - Amount, 0.0f); }\n\n\tconst float GetDamageModifiers() const { return DamageModifiers; }\n\n\tfloat GetAttackSpeedMultiplier() const { return AttackSpeedMultiplier; }\n\nprotected:\n\n\tbool ToggleSlotContents2(int32 FirstIndex);\n\n\t/**\n\t * Called each time an item is equipped/unequipped, used to update item effects\n\t * @PARAM Slot: the changed slot\n\t * @PARAM Item: the item which was equipped/unequipped\n\t * @PARAM bEquiped: true if equipped, false if unequipped\n\t */\n\tvoid OnItemEquiped(ESoItemSlot Slot, const FSoItem& Item, bool bEquiped);\n\n\tvoid SaveEquipment();\n\tvoid LoadEquipment();\n\n\tint32 GetStrikeIndexFromAssetName(const FString& Path);\n\n\t/** special function to swap res rune based on difficulty change */\n\tbool ReplaceRuneStone(USoItemTemplateRuneStone* OldStone, USoItemTemplateRuneStone* NewStone);\n\npublic:\n\n\tUPROPERTY(BlueprintAssignable)\n\tFSoEquipmentSlotChanged OnSlotChanged;\n\n\t/** fired when a usable item is used */\n\tUPROPERTY(BlueprintAssignable)\n\tFSoUINotify OnItemUsed;\n\n\tUPROPERTY(BlueprintAssignable)\n\tFSoUINotify OnRecalculateAttributes;\n\n\tUPROPERTY(BlueprintAssignable)\n\tFSoUINotify OnSelectedSpellChanged;\n\n\tUPROPERTY(BlueprintAssignable)\n\tFSoUINotify OnSelectedSpellCasted;\n\n\tUPROPERTY(BlueprintAssignable)\n\tFSoUINotify OnSelectedSpellSwitched;\n\n\tUPROPERTY(BlueprintAssignable)\n\tFSoUINotify OnEquippedSpellListChanged;\n\nprotected:\n\tstatic const FName HealthUpgradeName;\n\n\tconst float HealthUpgradeValue = 5.0f;\n\n\t// resurrection runes\n\tint32 MaxRuneNum = 1;\n\n\tUPROPERTY(BlueprintReadWrite)\n\tfloat SoulkeeperRespawnPenalty = 0.0f;\n\n\tUPROPERTY(EditAnywhere)\n\tUSoItemTemplateRuneStone* SoulStoneTemplateIntended;\n\n\tUPROPERTY(EditAnywhere)\n\tUSoItemTemplateRuneStone* SoulStoneTemplateSane;\n\n\tUPROPERTY(BlueprintReadWrite)\n\tUSoItemTemplate* SpellCasterTemplate;\n\n\t//////////////////////////////////////////////////////////////////////////////////////////\n\t// Equipped items\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere)\n\tTArray<FSoItem> CurrentEquipment;\n\n\t// Spells\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere)\n\tTArray<FSoItem> EquippedRuneStones;\n\n\t// Current Spell index\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere)\n\tint32 ActiveEquippedRuneStoneIndex = 0;\n\n\t// used to register how much spell do the player still have from the runes, must be > 0 to cast the spell\n\t// if a template isn't part of this map it is considered to be usable\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere)\n\tTMap<const USoItemTemplateRuneStone*, int32> SpellMap;\n\n\n\t// script/story data\n\tFSoPlayerData PlayerData;\n\n\t// Our master\n\tUPROPERTY()\n\tASoCharacter* SoOwner = nullptr;\n\n\t/** Current damage modifiers from clothes, effects, etc. */\n\tUPROPERTY(BlueprintReadOnly)\n\tfloat DamageModifiers = 1.0f;\n\n\tfloat AttackSpeedMultiplier = 1.0f;\n\tfloat CooldownCounterMultiplier = 1.0f;\n\n\tfloat CriticalHitChance = 0.0f;\n\n\tstatic const FName SKSplineName;\n\tstatic const FName SKPenaltyName;\n\tstatic const FName SKDistanceOnSplineName;\n\tstatic const FName SKZName;\n\tstatic const FName SKDirectionName;\n};\n"
  },
  {
    "path": "Source/SOrb/Character/SoPlayerController.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#include \"SoPlayerController.h\"\n\n#include \"Engine/Engine.h\"\n#include \"Camera/CameraComponent.h\"\n\n#include \"Basic/SoGameInstance.h\"\n#include \"Basic/SoCheatManager.h\"\n#include \"Character/SoCharacter.h\"\n#include \"Settings/SoGameSettings.h\"\n#include \"Settings/Input/SoInputHelper.h\"\n#include \"Basic/Helpers/SoPlatformHelper.h\"\n#include \"GameFramework/CheatManager.h\"\n#include \"Framework/Application/SlateApplication.h\"\n#include \"Engine/LocalPlayer.h\"\n\n#include \"Online/SoOnlineHelper.h\"\n\n#include \"SaveFiles/SoWorldState.h\"\n\n\nDEFINE_LOG_CATEGORY(LogSoPlayerController);\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoPlayerController::InitInputSystem()\n{\n\tSuper::InitInputSystem();\n\tbShouldPerformFullTickWhenPaused = true;\n\tGameSettings = USoGameSettings::GetInstance();\n\tcheck(GameSettings);\n\n\t// Initialize the custom key mappings\n\tif (PlayerInput)\n\t{\n\t\tstatic const FString EmptyCommand;\n#if WARRIORB_WITH_EDITOR\n\t\t// We need to reset it back\n\t\tPlayerInput->SetBind(TEXT(\"F1\"), TEXT(\"viewmode wireframe\"));\n\t\tPlayerInput->SetBind(TEXT(\"F9\"), TEXT(\"shot showui\"));\n\t\tPlayerInput->SetBind(TEXT(\"F5\"), TEXT(\"viewmode ShaderComplexity\"));\n#else\n\t\t//PlayerInput->SetBind(TEXT(\"F1\"), TEXT(\"viewmode CollisionPawn\"));\n\t\t//PlayerInput->SetBind(TEXT(\"F9\"), EmptyCommand);\n\t\tPlayerInput->SetBind(TEXT(\"F5\"), EmptyCommand);\n#endif // !WARRIORB_WITH_EDITOR\n\n\t\tGameSettings->TryAutoSetGamepadLayout();\n\t\tGameSettings->LoadSettings();\n\t\tGameSettings->RebuildInputKeymapsForPlayerInput(PlayerInput);\n\n\t\t// Is gamepad connect? prefer that over keyboard\n\t\tif (USoPlatformHelper::IsAnyGamepadConnected())\n\t\t{\n\t\t\tUpdateLastInputState(true);\n\t\t}\n\n\t\t// Set mouse\n\t\tSetInputModeForGamepad(false);\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoPlayerController::GetAudioListenerPosition(FVector& OutLocation, FVector& OutFrontDir, FVector& OutRightDir)\n{\n\tFVector ViewLocation;\n\tFRotator ViewRotation;\n\n\tif (ASoCharacter* SoCharacter = Cast<ASoCharacter>(GetCharacter()))\n\t{\n\t\tif (GetViewTarget() == SoCharacter &&\n\t\t\t(PlayerCameraManager == nullptr || PlayerCameraManager->PendingViewTarget.Target == nullptr))\n\t\t{\n\t\t\tconst FVector CharacterPosition = SoCharacter->GetActorLocation();\n\t\t\tconst FTransform& CamTransform = SoCharacter->GetSideViewCameraComponent()->GetComponentTransform();\n\n\t\t\tOutLocation = FMath::Lerp(CharacterPosition, CamTransform.GetLocation(), ListenerLerpValue);\n\t\t\tOutFrontDir = CamTransform.GetUnitAxis(EAxis::X);\n\t\t\tOutRightDir = CamTransform.GetUnitAxis(EAxis::Y);\n\n\t\t\treturn;\n\t\t}\n\t}\n\n\tGetPlayerViewPoint(ViewLocation, ViewRotation);\n\tconst FRotationTranslationMatrix ViewRotationMatrix(ViewRotation, ViewLocation);\n\tOutLocation = ViewLocation;\n\tOutFrontDir = ViewRotationMatrix.GetUnitAxis(EAxis::X);\n\tOutRightDir = ViewRotationMatrix.GetUnitAxis(EAxis::Y);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool ASoPlayerController::InputKey(FKey Key, EInputEvent EventType, float AmountDepressed, bool bGamepad)\n{\n#if PLATFORM_XBOXONE\n\t// check if we are in login screen where there are more players spawned so we can get the one which pressed the A button first\n\t// unfortunately otherwise we would not get input from controllers\n\tif (USoOnlineHelper::bWaitForFirstControllerInput)\n\t{\n\t\tif (Key != EKeys::Gamepad_FaceButton_Bottom)\n\t\t\treturn true;\n\n\t\tUSoGameInstance* SoGameInstance = USoGameInstance::GetInstance(this);\n\t\tif (!USoOnlineHelper::IsLocalPlayerSignedIn(GetLocalPlayer()))\n\t\t{\n\t\t\t// the controller belongs to a user who is not signed in (probably nobody is)\n\t\t\t// we just open the external UI\n\t\t\tUSoOnlineHelper::ShowExternalLoginUI(SoGameInstance);\n\t\t\treturn true;\n\t\t}\n\n\t\t// the controller belongs to this local player, we can destroy the other ones\n\t\tUSoOnlineHelper::DestroyLocalPlayers(GetLocalPlayer());\n\t\tUSoOnlineHelper::bWaitForFirstControllerInput = false;\n\n\t\t// just some debug log junk\n\t\tconst auto OnlineSub = IOnlineSubsystem::Get();\n\t\tconst auto IdentityInterface = OnlineSub->GetIdentityInterface();\n\t\tTSharedPtr<const FUniqueNetId> UserId = IdentityInterface->GetUniquePlayerId(GetLocalPlayer()->GetControllerId());\n\t\tUE_LOG(LogTemp, Warning, TEXT(\"SetCachedControllerNetID: %s\"), *UserId->ToString());\n\n\t\t// we have to set the user index so we save/load from this user\n\t\tFSoWorldState::Get().SetUserIndex(GetLocalPlayer()->GetControllerId());\n\n\t\t// have to reload metadata for the new player because we need that in menu (to display continue and restart or only start play for prologue)\n\t\tFSoWorldState::Get().ReloadGameMetaData();\n\n\t\t// force reload menu, even if though we are already there, because everything might be messed up cause of the additional player spawn\n\t\t// optional solution would be to create a different playercontroller/map/gamemode for the selection screen, but meh\n\t\tSoGameInstance->TeleportToMainMenu(false, true);\n\n\t\treturn true;\n\t}\n#endif\n\tconst bool bResult = Super::InputKey(Key, EventType, AmountDepressed, bGamepad);\n\n\t//const FName KeyName = Key.GetFName();\n\t//if (FSoInputKey::IsRightThumbStickDirection(KeyName))\n\t//{\n\t//\tif (EventType == IE_Pressed)\n\t//\t\tPressedRightStickKeys.Add(KeyName);\n\t//\telse if (EventType == IE_Released)\n\t//\t\tPressedRightStickKeys.Remove(KeyName);\n\t//}\n\n\tif (bResult)\n\t{\n\t\tResetTimeSinceLastInput();\n\t\tUpdateLastInputState(Key.IsGamepadKey());\n\t}\n\n\t//UE_LOG(LogSoPlayerController, Warning, TEXT(\"ASoPlayerController::InputKey = %s\"), *KeyName.ToString());\n\treturn bResult;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool ASoPlayerController::InputTouch(uint32 Handle, ETouchType::Type Type, const FVector2D& TouchLocation, float Force, FDateTime DeviceTimestamp, uint32 TouchpadIndex)\n{\n\tconst bool bResult = Super::InputTouch(Handle, Type, TouchLocation, Force, DeviceTimestamp, TouchpadIndex);\n\t// Meh, we don't handle touch devices\n\t// if (bResult)\n\t// {\n\t// \tResetTimeSinceLastInput();\n\t// \tUpdateLastInputState(false);\n\t// }\n\treturn bResult;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool ASoPlayerController::InputAxis(FKey Key, float Delta, float DeltaTime, int32 NumSamples, bool bGamepad)\n{\n\tconst bool bIsUsingAxis = Super::InputAxis(Key, Delta, DeltaTime, NumSamples, bGamepad);\n\n\t// Actual motion, stops gamepad/mouse from pinging\n\tif (bIsUsingAxis)\n\t{\n\t\tResetTimeSinceLastInput();\n\t\tUpdateLastInputState(Key.IsGamepadKey());\n\t}\n\n\treturn bIsUsingAxis;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool ASoPlayerController::InputMotion(const FVector& Tilt, const FVector& RotationRate, const FVector& Gravity, const FVector& Acceleration)\n{\n\tconst bool bResult = Super::InputMotion(Tilt, RotationRate, Gravity, Acceleration);\n\tif (bResult)\n\t{\n\t\tResetTimeSinceLastInput();\n\t\tUpdateLastInputState(true);\n\t}\n\treturn bResult;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoPlayerController::UpdateLastInputState(bool bFromGamepad)\n{\n\tconst bool bNotify = bIsLastInputFromGamepad != bFromGamepad;\n\tbIsLastInputFromGamepad = bFromGamepad;\n\tif (bNotify)\n\t{\n\t\tBroadcastDeviceChanged(GetCurrentDeviceType());\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoPlayerController::BroadcastDeviceChanged(ESoInputDeviceType NewDevice)\n{\n\t// Set the text labels properly for some gamepad key\n\tswitch (NewDevice)\n\t{\n\tcase ESoInputDeviceType::Gamepad_Xbox:\n\t\tEKeys::SetConsoleForGamepadLabels(EConsoleForGamepadLabels::XBoxOne);\n\t\tbreak;\n\tcase ESoInputDeviceType::Gamepad_PlayStation:\n\t\tEKeys::SetConsoleForGamepadLabels(EConsoleForGamepadLabels::PS4);\n\t\tbreak;\n\tdefault:\n\t\tEKeys::SetConsoleForGamepadLabels(EConsoleForGamepadLabels::None);\n\t\tbreak;\n\t}\n\n\tLastDeviceTypeBroadcasted = NewDevice;\n\tDeviceTypeChanged.Broadcast(LastDeviceTypeBroadcasted);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool ASoPlayerController::SetPause(bool bPause, FCanUnpause CanUnpauseDelegate)\n{\n\tUE_LOG(LogSoPlayerController, Log, TEXT(\"SetPause = %d\"), bPause);\n\tResetTimeSinceLastInput();\n\treturn Super::SetPause(bPause, CanUnpauseDelegate);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoPlayerController::AddCheats(bool bForce)\n{\n\tSuper::AddCheats(bForce);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoPlayerController::EnableCheats()\n{\n\t// NOTE: don't use force\n\tAddCheats();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoPlayerController::PlayerTick(float DeltaTime)\n{\n\t// if (!IsPaused())\n\t// {\n\tTimeSecondsSinceLastInput += DeltaTime;\n\t// }\n\tSuper::PlayerTick(DeltaTime);\n\n\t// Get delta of mouse\n\tfloat MouseX = 0;\n\tfloat MouseY = 0;\n\tGetMousePosition(MouseX, MouseY);\n\tconst float MouseDeltaX = LastMouseX - MouseX;\n\tconst float MouseDeltaY = LastMouseY - MouseY;\n\t// GetInputMouseDelta(MouseDeltaX, MouseDeltaY);\n\n\tbWasMouseMovedThisFrame = !FMath::IsNearlyZero(MouseDeltaX) || !FMath::IsNearlyZero(MouseDeltaY);\n\tif (bIsLastInputFromGamepad)\n\t{\n\t\t// Gamepad: Hide mouse cursor\n\t\tSetInputModeForGamepad(true);\n\t\tSetIsMouseEnabled(false);\n\t}\n\telse if (bWasMouseMovedThisFrame)\n\t{\n\t\t// Keyboard: Sync state with allowed state\n\t\tSetInputModeForGamepad(false);\n\t\tif (bShowMouseCursor != bAllowMouse)\n\t\t\tSetIsMouseEnabled(bAllowMouse);\n\t}\n\n\t// UE_LOG(LogSoPlayerController, Verbose, TEXT(\"Mouse DeltaX = %f, DeltaY = %f\"), MouseDeltaX, MouseDeltaY);\n\tLastMouseX = MouseX;\n\tLastMouseY = MouseY;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFString ASoPlayerController::ConsoleCommand(const FString& Command, bool bWriteToLog)\n{\n\tif (USoCheatManager::IsAllowCheatsPasswordValid(Command))\n\t{\n\t\tif (auto* GameInstance = USoGameInstance::GetInstance(this))\n\t\t\tGameInstance->SetAllowCheats(true);\n\t}\n\n\treturn Super::ConsoleCommand(Command, bWriteToLog);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nASoPlayerController* ASoPlayerController::GetInstance(const UObject* WorldContextObject)\n{\n\tif (!GEngine || !WorldContextObject)\n\t\treturn nullptr;\n\n\tif (UWorld* World = GEngine->GetWorldFromContextObject(WorldContextObject, EGetWorldErrorMode::LogAndReturnNull))\n\t\treturn Cast<ASoPlayerController>(World->GetFirstPlayerController());\n\n\treturn nullptr;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoPlayerController::SetIsMouseEnabled(bool bEnabled)\n{\n\tif (bShowMouseCursor == bEnabled)\n\t\treturn;\n\n\tbShowMouseCursor = bEnabled;\n\tbEnableClickEvents = bEnabled;\n\tbEnableTouchEvents = bEnabled;\n\tbEnableMouseOverEvents = bEnabled;\n\tbEnableTouchOverEvents = bEnabled;\n\tUE_LOG(LogSoPlayerController, Log, TEXT(\"SetIsMouseEnabled: bEnabled = %d\"), bEnabled);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoPlayerController::SetInputModeForGamepad(bool bEnable)\n{\n\tif (bInputModeForGamepad == bEnable)\n\t\treturn;\n\n\tif (bEnable)\n\t{\n\t\t// Gamepad\n\t\tFInputModeGameOnly InputMode;\n\t\tSetInputMode(InputMode);\n\t}\n\telse\n\t{\n\t\t// Keyboard\n\t\tFInputModeGameAndUI InputMode;\n\t\tInputMode.SetLockMouseToViewportBehavior(EMouseLockMode::DoNotLock);\n\t\tInputMode.SetHideCursorDuringCapture(false);\n\t\tSetInputMode(InputMode);\n\t}\n\n\tbInputModeForGamepad = bEnable;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nESoInputDeviceType ASoPlayerController::GetCurrentDeviceType() const\n{\n#if PLATFORM_SWITCH || PLATFORM_XBOXONE\n\t// On these platforms only the gamepad type is supported\n\tcheck(USoPlatformHelper::HasHardcodedGamepad());\n\treturn USoPlatformHelper::GetHardcodedGamepadType();\n#else\n\t// Force\n\tif (bUseForcedDeviceType)\n\t\treturn ForcedDeviceType;\n\n\t// Gamepad\n\tif (bIsLastInputFromGamepad)\n\t{\n\t\t// Desktop most likely return UI type from settings\n\t\treturn GetGamepadDeviceTypeFromSettings();\n\t}\n\n\t// Default is keyboard\n\treturn ESoInputDeviceType::Keyboard;\n#endif\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nESoInputDeviceType ASoPlayerController::GetGamepadDeviceTypeFromSettings() const\n{\n\t// Get type from settings\n\treturn USoInputHelper::ConvertInputGamepadUITypeToInputDeviceType(GameSettings->GetGamepadLayoutType());\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoPlayerController::NotifyUserSettingsGamepadUITypeChanged(bool bForce)\n{\n\tconst ESoInputDeviceType NewDeviceType = GetCurrentDeviceType();\n\tif (bForce || NewDeviceType != LastDeviceTypeBroadcasted)\n\t{\n\t\tBroadcastDeviceChanged(NewDeviceType);\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoPlayerController::EnableForcedDeviceType(ESoInputDeviceType InDeviceType)\n{\n\tForcedDeviceType = InDeviceType;\n\tbUseForcedDeviceType = true;\n\tBroadcastDeviceChanged(GetCurrentDeviceType());\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoPlayerController::DisableForcedDeviceType()\n{\n\tbUseForcedDeviceType = false;\n\tBroadcastDeviceChanged(GetCurrentDeviceType());\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoPlayerController::HandleNewGamepadInput()\n{\n\tif (GameSettings->IsAutoDetectGamepadLayout())\n\t\tGameSettings->AutoSetGamepadLayoutFromConnectedGamepad();\n}\n"
  },
  {
    "path": "Source/SOrb/Character/SoPlayerController.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#pragma once\n\n#include \"GameFramework/PlayerController.h\"\n\n#include \"Settings/Input/SoInputSettingsTypes.h\"\n\n#include \"SoPlayerController.generated.h\"\n\nclass USoGameSettings;\n\nDECLARE_LOG_CATEGORY_EXTERN(LogSoPlayerController, All, All);\n\n// if false most likely it is a keyboard\nDECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FSoOnDeviceTypeChanged, ESoInputDeviceType, DeviceType);\n\n// Custom player controller class\nUCLASS()\nclass SORB_API ASoPlayerController : public APlayerController\n{\n\tGENERATED_BODY()\npublic:\n\t//\n\t// APlayerController interface\n\t//\n\n\t/**\n\t * Spawn the appropriate class of PlayerInput.\n\t * Only called for player controllers that belong to local players.\n\t */\n\tvoid InitInputSystem() override;\n\n\t// get audio listener position and orientation\n\tvoid GetAudioListenerPosition(FVector& OutLocation, FVector& OutFrontDir, FVector& OutRightDir) override;\n\n\t// Handles a key press\n\tbool InputKey(FKey Key, EInputEvent EventType, float AmountDepressed, bool bGamepad) override;\n\tbool InputTouch(uint32 Handle, ETouchType::Type Type, const FVector2D& TouchLocation, float Force, FDateTime DeviceTimestamp, uint32 TouchpadIndex) override;\n\tbool InputAxis(FKey Key, float Delta, float DeltaTime, int32 NumSamples, bool bGamepad) override;\n\tbool InputMotion(const FVector& Tilt, const FVector& RotationRate, const FVector& Gravity, const FVector& Acceleration) override;\n\tbool SetPause(bool bPause, FCanUnpause CanUnpauseDelegate = FCanUnpause()) override;\n\n\t// Cheats\n\tvoid AddCheats(bool bForce = false) override;\n\tvoid EnableCheats() override;\n\n\t/**\n\t * Processes player input (immediately after PlayerInput gets ticked) and calls UpdateRotation().\n\t * PlayerTick is only called if the PlayerController has a PlayerInput object. Therefore, it will only be called for locally controlled PlayerControllers.\n\t */\n\tvoid PlayerTick(float DeltaTime) override;\n\n\t// Input console command\n\tFString ConsoleCommand(const FString& Command, bool bWriteToLog = true) override;\n\n\t//\n\t// Own methods\n\t//\n\n\tUFUNCTION(BlueprintPure, DisplayName = \"Get So Player Controller\", Category = PlayerController, meta = (WorldContext = \"WorldContextObject\"))\n\tstatic ASoPlayerController* GetInstance(const UObject* WorldContextObject);\n\n\t// Enable/Disable mouse support\n\t// NOTE: You should probably use the hint bAllowMouse instead of this\n\tvoid SetIsMouseEnabled(bool bEnabled);\n\n\t// Allows the mouse to show if it is moved\n\tvoid SetIsMouseAllowed(bool bAllow) { bAllowMouse = bAllow; }\n\tbool IsMouseAllowed() const { return bAllowMouse; }\n\n\tfloat GetTimeSecondsSinceLastInput() const { return TimeSecondsSinceLastInput; }\n\n\t// Is the last input from the gamepad?\n\tbool IsLastInputFromGamepad() const { return bIsLastInputFromGamepad; }\n\n\t// Gets the current user device type, also queries the user settings if input is from gamepad\n\tESoInputDeviceType GetCurrentDeviceType() const;\n\tESoInputDeviceType GetGamepadDeviceTypeFromSettings() const;\n\n\t// Notify us that the user settings UI type changed from the settings\n\t// NOTE: should only be called from settings\n\tvoid NotifyUserSettingsGamepadUITypeChanged(bool bForce = false);\n\n\t// Device was changed\n\tFSoOnDeviceTypeChanged& OnDeviceTypeChanged() { return DeviceTypeChanged; }\n\n\tFORCEINLINE void ResetTimeSinceLastInput() { TimeSecondsSinceLastInput = 0.f; }\n\t//FORCEINLINE bool IsUsingRightThumbStick() const { return PressedRightStickKeys.Num() > 0; }\n\n\tFORCEINLINE void SetListenerLerpValue(float NewValue) { ListenerLerpValue = FMath::Clamp(NewValue, 0.0f, 1.0f); }\n\n\tvoid HandleNewGamepadInput();\n\n\tint32 GetLastJoystickIndexUsed() const { return LastJoystickIndexUsed; }\n\n\t// Force device type, useful for debugging\n\tvoid EnableForcedDeviceType(ESoInputDeviceType InDeviceType);\n\tvoid DisableForcedDeviceType();\n\nprotected:\n\tvoid UpdateLastInputState(bool bFromGamepad);\n\tvoid BroadcastDeviceChanged(ESoInputDeviceType NewDevice);\n\n\tvoid SetInputModeForGamepad(bool bEnable);\n\t\nprotected:\n\t// Tells us where the last input came from\n\tUPROPERTY(BlueprintReadOnly, Category = \">Input\")\n\tbool bIsLastInputFromGamepad = false;\n\n\t// Tells us the time passed since last input from the user keyboard/mouse/\n\t// NOTE: this only applies for when the game is not paused\n\tUPROPERTY(BlueprintReadOnly, Category = \">Input\")\n\tfloat TimeSecondsSinceLastInput = 0.f;\n\n\t// Event that tells if the input device changed\n\tUPROPERTY(BlueprintAssignable, Category = \">Input\")\n\tFSoOnDeviceTypeChanged DeviceTypeChanged;\n\n\t// Keeps track of the pressed right stick actions\n\t//TSet<FName> PressedRightStickKeys;\n\n\t// Contains the last device type broadcasted.\n\tUPROPERTY()\n\tESoInputDeviceType LastDeviceTypeBroadcasted = ESoInputDeviceType::Keyboard;\n\n\t// The SDL JoystickIndex of the last game controller used.\n\tUPROPERTY()\n\tint32 LastJoystickIndexUsed = INDEX_NONE;\n\n\t/** 0.0f: character position, 1.0f: camera position */\n\tUPROPERTY()\n\tfloat ListenerLerpValue = 0.5f;\n\n\t// Cache of variable\n\tUPROPERTY()\n\tUSoGameSettings* GameSettings = nullptr;\n\n\t// Used to force the debug type for debugging\n\tUPROPERTY()\n\tESoInputDeviceType ForcedDeviceType = ESoInputDeviceType::Gamepad_Generic;\n\tUPROPERTY()\n\tbool bUseForcedDeviceType = false;\n\n\t// Last mouse  position\n\tfloat LastMouseX = 0.f;\n\tfloat LastMouseY = 0.f;\n\n\t// Mouse was moved this frame\n\tbool bWasMouseMovedThisFrame = false;\n\n\t// Allows the mouse to show once it is moved and last input is not from gamepad\n\tbool bAllowMouse = false;\n\n\t// Keep track of input mode\n\tbool bInputModeForGamepad = false;\n};\n"
  },
  {
    "path": "Source/SOrb/Character/SoPlayerProgress.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#include \"SoPlayerProgress.h\"\n\n#include \"EngineUtils.h\"\n#include \"Misc/FileHelper.h\"\n\n#include \"SplineLogic/SoPlayerSpline.h\"\n#include \"Character/SoPlayerCharacterSheet.h\"\n#include \"SoCharacter.h\"\n#include \"Basic/SoGameMode.h\"\n#include \"Basic/Helpers/SoDateTimeHelper.h\"\n#include \"SaveFiles/SoWorldState.h\"\n#include \"Levels/SoLevelHelper.h\"\n#include \"Basic/SoGameInstance.h\"\n#include \"Items/ItemTemplates/SoItemTemplateRuneStone.h\"\n#include \"Online/SoOnlineRichPresence.h\"\n#include \"Basic/Helpers/SoStaticHelper.h\"\n#include \"Online/Analytics/SoAnalytics.h\"\n\n\nDECLARE_STATS_GROUP(TEXT(\"SoPlayerProgress\"), STATGROUP_SoPlayerProgress, STATCAT_Advanced);\n\nDEFINE_LOG_CATEGORY_STATIC(LogSoProgress, All, All);\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// Sets default values for this component's properties\nUSoPlayerProgress::USoPlayerProgress()\n{\n\t// Set this component to be initialized when the game starts, and to be ticked every frame.  You can turn these features\n\t// off to improve performance if you don't need them.\n\t// bWantsBeginPlay = true;\n\tPrimaryComponentTick.bCanEverTick = true;\n\n\tbWantsInitializeComponent = true;\n\n\tOnlineRichPresence = CreateDefaultSubobject<USoOnlineRichPresence>(TEXT(\"SoOnlineRichPresence\"));\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoPlayerProgress::InitializeComponent()\n{\n\tSuper::InitializeComponent();\n\n\t// Progress data is independent of anything else\n\tif (ASoGameMode* GameMode = ASoGameMode::GetInstance(this))\n\t{\n\t\tGameMode->OnPreSave.AddDynamic(this, &ThisClass::OnSave);\n\t\tGameMode->OnPostLoad.AddDynamic(this, &ThisClass::OnLoad);\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoPlayerProgress::UninitializeComponent()\n{\n\tif(ASoGameMode* GameMode = ASoGameMode::GetInstance(this))\n\t{\n\t\tGameMode->OnPreSave.RemoveDynamic(this, &ThisClass::OnSave);\n\t\tGameMode->OnPostLoad.RemoveDynamic(this, &ThisClass::OnLoad);\n\t}\n\tSuper::UninitializeComponent();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoPlayerProgress::BeginPlay()\n{\n\tSuper::BeginPlay();\n\tSoOwner = CastChecked<ASoCharacter>(GetOwner());\n\tOwnerSplineLocation.SetSpline(nullptr);\n\tTempAnalyticsStats = {};\n\tGameInstance = USoGameInstance::GetInstance(this);\n\tcheck(GameInstance);\n\n\tif (OnlineRichPresence)\n\t\tOnlineRichPresence->SetOwner(this);\n\n\t// Do not collect spline stats if we are not in the chapter\n\tbCollectSplineStats = true;\n\tif (OnlineRichPresence)\n\t\tOnlineRichPresence->OnChapterChanged();\n\n\tSoOwner->OnPlayerRematerialized.AddDynamic(this, &ThisClass::OnPlayerRematerialize);\n\tSoOwner->OnPlayerRespawn.AddDynamic(this, &ThisClass::OnPlayerRespawn);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoPlayerProgress::EndPlay(const EEndPlayReason::Type EndPlayReason)\n{\n\tSoOwner->OnPlayerRematerialized.RemoveDynamic(this, &ThisClass::OnPlayerRematerialize);\n\tSoOwner->OnPlayerRespawn.RemoveDynamic(this, &ThisClass::OnPlayerRespawn);\n\tSuper::EndPlay(EndPlayReason);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoPlayerProgress::TickComponent(float DeltaTime, ELevelTick TickType, FActorComponentTickFunction* ThisTickFunction)\n{\n\tDECLARE_SCOPE_CYCLE_COUNTER(TEXT(\"TickComponent\"), STAT_TickComponent, STATGROUP_SoPlayerProgress);\n\n\tSuper::TickComponent(DeltaTime, TickType, ThisTickFunction);\n\n\tconst float UndilatedDeltaSeconds = USoDateTimeHelper::GetDeltaSeconds();\n\tIncreaseTotalPlayTimeSeconds(UndilatedDeltaSeconds);\n\n\t// Update other info\n\tUpdateChapter(UndilatedDeltaSeconds);\n\tUpdateSpline(UndilatedDeltaSeconds);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoPlayerProgress::OnSave()\n{\n\tPreSaveEvent.Broadcast();\n\tFSoWorldState::Get().SetProgressStats(ProgressStats);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoPlayerProgress::OnLoad()\n{\n\tPreLoadEvent.Broadcast();\n\n\t// Session ended\n\tProgressStats = {};\n\tTempAnalyticsStats = {};\n\tProgressStats = FSoWorldState::Get().GetProgressStats();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoPlayerProgress::OnPlayerRematerialize()\n{\n\t// TODO check episode stuff?\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoPlayerProgress::OnPlayerRespawn()\n{\n\t// TODO check episode stuff?\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoPlayerProgress::UpdateSpline(float DeltaSeconds)\n{\n\tDECLARE_SCOPE_CYCLE_COUNTER(TEXT(\"TickComponent - UpdateSpline\"), STAT_UpdateSpline, STATGROUP_SoPlayerProgress);\n\n\t// TODO fix changing spline collecting stats from old one\n\tif (GameInstance->IsSavingOrLoading()) // || USoLevelHelper::IsAnyLevelLoading(this))\n\t\treturn;\n\n\tFSoSplinePoint NewSplineLocation = ISoSplineWalker::Execute_GetSplineLocationI(SoOwner);\n\n\tASoPlayerSpline* CurrentOwnerSpline = GetOwnerSpline();\n\tASoPlayerSpline* NewOwnerSpline = Cast<ASoPlayerSpline>(NewSplineLocation.GetSpline());\n\n\t// Different spline?\n\tif (CurrentOwnerSpline != NewOwnerSpline)\n\t{\n\t\tif (NewOwnerSpline != nullptr)\n\t\t{\n\t\t\tif (OnlineRichPresence)\n\t\t\t\tOnlineRichPresence->OnSplineChanged();\n\n\t\t\t// New current\n\t\t\tCurrentOwnerSpline = NewOwnerSpline;\n\n\t\t\t// enter num increased\n\t\t\tconst FName SplineName = NewOwnerSpline->GetSplineFName();\n\t\t\tif (bCollectSplineStats)\n\t\t\t{\n\t\t\t\tIncrementSplineEnterNum(SplineName);\n\t\t\t\tSetSplineLength(SplineName, NewOwnerSpline->GetSplineLength());\n\t\t\t}\n\n\t\t\tconst FString LogEntry = FString::SanitizeFloat(ProgressStats.TotalPlayTimeSeconds) + \": Spline Entered: \" + SplineName.ToString();\n\t\t\tUE_LOG(LogSoProgress, Display, TEXT(\"%s\"), *LogEntry);\n\t\t}\n\t}\n\n\t// Tick\n\tif (bCollectSplineStats && CurrentOwnerSpline != nullptr)\n\t{\n\t\tconst FName SplineName = CurrentOwnerSpline->GetSplineFName();\n\n\t\t// Time\n\t\tUpdateSplineFirstEnterTime(SplineName);\n\t\tIncreaseSplineTimeSpent(SplineName, DeltaSeconds);\n\n\t\t// FPS\n\t\tCurrentOwnerSpline->TickPerformanceStats(DeltaSeconds);\n\t\tCurrentOwnerSpline->UpdateCriticalPerformanceStats(NewSplineLocation.GetDistance());\n\t}\n\n\t// Tick Location\n\tOwnerSplineLocation = NewSplineLocation;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoPlayerProgress::UpdateChapter(float DeltaSeconds)\n{\n\tDECLARE_SCOPE_CYCLE_COUNTER(TEXT(\"TickComponent - UpdateChapter\"), STAT_UpdateChapter, STATGROUP_SoPlayerProgress);\n\n\tif (GameInstance->IsSavingOrLoading())\n\t\treturn;\n\n\tconst FName NewChapterName = USoLevelHelper::GetChapterNameFromObject(this);\n\tif (OwnerChapterName != NewChapterName)\n\t{\n\t\tif (!NewChapterName.IsNone())\n\t\t{\n\t\t\tUE_LOG(LogSoProgress, Display, TEXT(\"Chapter Entered: %s\"), *NewChapterName.ToString());\n\n\t\t\tif (OnlineRichPresence)\n\t\t\t\tOnlineRichPresence->OnChapterChanged();\n\t\t}\n\t}\n\n\n\t// Tick Chapter\n\tOwnerChapterName = NewChapterName;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nASoPlayerSpline* USoPlayerProgress::GetOwnerSpline()\n{\n\treturn Cast<ASoPlayerSpline>(OwnerSplineLocation.GetSpline());\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoPlayerProgress::OnDeath(bool bSoulKeeperActive)\n{\n\tDECLARE_SCOPE_CYCLE_COUNTER(TEXT(\"OnDeath\"), STAT_OnDeath, STATGROUP_SoPlayerProgress);\n\n\tIncrementTotalDeathNum();\n\n\tif (bSoulKeeperActive)\n\t\tIncrementTotalDeathWithSoulKeeperNum();\n\telse\n\t\tIncrementTotalDeathWithCheckpointNum();\n\n\t// create log entry:\n\tconst float CurrentPlayTimeSeconds = GetCurrentPlayTimeSeconds();\n\tFString LogEntry = FString::SanitizeFloat(CurrentPlayTimeSeconds) + \": Death \";\n\tASoPlayerSpline* Spline = GetOwnerSpline();\n\tif (Spline != nullptr)\n\t\tLogEntry += \" in \" + Spline->GetSplineName() + \" spline at \" + FString::SanitizeFloat(OwnerSplineLocation.GetDistance());\n\telse\n\t\tLogEntry += \" InvalidSplineLocation\";\n\tLogEntry += bSoulKeeperActive ? \", soul keeper used\" : \", checkpoint used\";\n\tUE_LOG(LogSoProgress, Display, TEXT(\"%s\"), *LogEntry);\n\n\t// store data in spline\n\tif (Spline != nullptr)\n\t{\n\t\tconst auto DeathEntry = FSoSplineDeathContext(OwnerSplineLocation.GetDistance(), CurrentPlayTimeSeconds, bSoulKeeperActive);\n\t\tAddSplineDeathEntry(Spline->GetSplineFName(), DeathEntry);\n\t}\n\telse\n\t{\n\t\tUE_LOG(LogSoProgress, Error, TEXT(\"Death registering  failed... invalid spline location\"));\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoPlayerProgress::OnSpellUsed(const USoItemTemplateRuneStone* UsedSpell)\n{\n\tif (UsedSpell == nullptr)\n\t\treturn;\n\n\t// TODO localization maybe breaks this?\n\tconst FText EnglishName = UsedSpell->GetItemName();\n\tSpellCasted(FName(*EnglishName.ToString()));\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoPlayerProgress::OnEquippedItem(const USoItemTemplate* Item)\n{\n\tif (Item)\n\t\tProgressStats.EquipItem(Item->GetFName(), ProgressStats.TotalPlayTimeSeconds);\n\t// NOTE: Not interested in the TempAnalytics\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoPlayerProgress::OnUnEquippedItem(const USoItemTemplate* Item)\n{\n\tif (Item)\n\t\tProgressStats.UnEquipItem(Item->GetFName(), ProgressStats.TotalPlayTimeSeconds);\n\t// NOTE: Not interested in the TempAnalytics\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoPlayerProgress::OnHpLost(const FSoDmg& Damage)\n{\n\tDECLARE_SCOPE_CYCLE_COUNTER(TEXT(\"OnHpLost\"), STAT_OnHpLost, STATGROUP_SoPlayerProgress);\n\n\t// input is reduced dmg already, not clamped to max hp tho\n\tASoPlayerSpline* Spline = GetOwnerSpline();\n\tfloat PlayerPreHealth = SoOwner->GetPlayerCharacterSheet()->GetHealth();\n\tconst FSoDmg BonusHealth = SoOwner->GetPlayerCharacterSheet()->GetBonushHealth();\n\n\tif (Damage.HasPhysical())\n\t{\n\t\tconst float MaxPhysicalLoss = FMath::Min(Damage.Physical, PlayerPreHealth + BonusHealth.Physical);\n\t\tIncreaseTotalLostHP(ESoDmgType::Physical, MaxPhysicalLoss);\n\t\tif (bCollectSplineStats && Spline != nullptr)\n\t\t\tIncreaseSplineLostHP(Spline->GetSplineFName(), ESoDmgType::Physical, MaxPhysicalLoss);\n\n\t\tPlayerPreHealth = FMath::Min(PlayerPreHealth - Damage.Physical + BonusHealth.Physical, PlayerPreHealth);\n\t}\n\n\tif (Damage.HasMagical())\n\t{\n\t\tconst float MaxMagicLoss = FMath::Min(Damage.Magical, PlayerPreHealth + BonusHealth.Magical);\n\t\tIncreaseTotalLostHP(ESoDmgType::Magic, MaxMagicLoss);\n\t\tif (bCollectSplineStats && Spline != nullptr)\n\t\t\tIncreaseSplineLostHP(Spline->GetSplineFName(), ESoDmgType::Magic, MaxMagicLoss);\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoPlayerProgress::MarkCurrentEpisodeAsCompleted()\n{\n\tStopGatheringPlayerData();\n\t// TODO\n\t// EpisodeStats.Progress = ESoEpisodeProgress::Completed;\n\t// FSoWorldState::Get().SetCurrentEpisode(EpisodeStats);\n\t// GameInstance->SaveGameForCurrentState();\n\t//\n\t// // Analytics\n\t// GameInstance->GetAnalytics()->RecordEpisodeCompleted(\n\t// \tFSoWorldState::Get().GetEpisodeName().ToString(),\n\t// \tEpisodeStats.TotalPlayTimeSeconds\n\t// );\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nfloat USoPlayerProgress::GetCurrentPlayTimeSeconds() const\n{\n\treturn ProgressStats.TotalPlayTimeSeconds;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoPlayerProgress::IncreaseTotalPlayTimeSeconds(float DeltaTime)\n{\n\tProgressStats.TotalPlayTimeSeconds += DeltaTime;\n\tTempAnalyticsStats.TotalPlayTimeSeconds += DeltaTime;\n\n\t// TODO special episodes\n\t// if (GameInstance->IsEpisode() && EpisodeStats.Progress == ESoEpisodeProgress::Started)\n\t\t// EpisodeStats.TotalPlayTimeSeconds += DeltaTime;\n}\n"
  },
  {
    "path": "Source/SOrb/Character/SoPlayerProgress.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#pragma once\n\n#include \"SplineLogic/SoPlayerSpline.h\"\n#include \"Levels/SoLevelManager.h\"\n#include \"SaveFiles/Stats/SoPlayerProgressStats.h\"\n#include \"SaveFiles/SoWorldStateEpisodeTypes.h\"\n\n#include \"SoPlayerProgress.generated.h\"\n\nstruct FSoPlayerProgressStats;\nclass USoItemTemplateRuneStone;\nclass USoGameInstance;\nclass USoOnlineRichPresence;\nclass ASoCharacter;\nclass USoItemTemplate;\n\n// Actor component that follows the player and updates the current stats\n// NOTE: that USoAnalyticsComponent collects additional data that is sent to the GameAnalytics servers\n// This class just updates the stats that are also useful for the running of the game or displayed/used inside the game\n// These are stored inside the metadata of the save\nUCLASS(ClassGroup=(Custom), meta=(BlueprintSpawnableComponent))\nclass SORB_API USoPlayerProgress : public UActorComponent\n{\n\tGENERATED_BODY()\npublic:\n\t// Sets default values for this component's properties\n\tUSoPlayerProgress();\n\n\t// UActorComponent Interface\n\n\tvoid InitializeComponent() override;\n\tvoid UninitializeComponent() override;\n\n\t// Called when the game starts\n\tvoid BeginPlay() override;\n\tvoid EndPlay(const EEndPlayReason::Type EndPlayReason) override;\n\n\t// Called every frame\n\tvoid TickComponent(float DeltaTime, ELevelTick TickType, FActorComponentTickFunction* ThisTickFunction) override;\n\n\t// Own methods\n\n\tUFUNCTION(BlueprintCallable)\n\tvoid StartGatheringPlayerData() { SetComponentTickEnabled(true); }\n\n\tUFUNCTION(BlueprintCallable)\n\tvoid StopGatheringPlayerData() { SetComponentTickEnabled(false); };\n\n\t// called before the game state is serialized (aka saved)\n\tUFUNCTION()\n\tvoid OnSave();\n\n\t// called after the game state is reloaded (aka loaded)\n\tUFUNCTION()\n\tvoid OnLoad();\n\n\tUFUNCTION()\n\tvoid OnPlayerRematerialize();\n\n\tUFUNCTION()\n\tvoid OnPlayerRespawn();\n\n\t// Called if the player took damage but didn't die. I hope that it won't happen that often - OnDeath should be called all the time\n\tvoid OnHpLost(const FSoDmg& Damage);\n\n\t// Called every time the player dies. That meant to be damn often.\n\tvoid OnDeath(const bool bSoulKeeperActive);\n\n\t// Called every time we use a spell\n\tvoid OnSpellUsed(const USoItemTemplateRuneStone* UsedSpell);\n\n\t// Called every time the users explicitly (from the UI) equips an item\n\tvoid OnEquippedItem(const USoItemTemplate* Item);\n\n\t// Called every time the user explicitly (from the UI) unequips an item\n\tvoid OnUnEquippedItem(const USoItemTemplate* Item);\n\n\t// Gets the player stats from all session\n\tconst FSoPlayerProgressStats& GetStatsFromAllSession() const { return ProgressStats; }\n\tFSoPlayerProgressStats& GetStatsFromAllSession() { return ProgressStats; }\n\t//const FSoPlayerProgressStats& GetStatsFromCurrentSession() const { return CurrentSessionStats; }\n\tFSoPlayerProgressStats& GetTempAnalyticsStats() { return TempAnalyticsStats; }\n\tconst FSoPlayerProgressStats& GetTempAnalyticsStats() const { return TempAnalyticsStats; }\n\n\tFORCEINLINE void ResetTempAnalyticsStats() { TempAnalyticsStats = {}; }\n\n\tDECLARE_EVENT(USoPlayerProgress, FSoPlayerProgressPreSaveLoad)\n\tFSoPlayerProgressPreSaveLoad& OnPreLoad() { return PreLoadEvent; }\n\tFSoPlayerProgressPreSaveLoad& OnPreSave() { return PreSaveEvent; }\n\n\tUFUNCTION(BlueprintCallable)\n\tvoid MarkCurrentEpisodeAsCompleted();\n\n\tUFUNCTION(BlueprintPure)\n\tfloat GetCurrentPlayTimeSeconds() const;\n\nprotected:\n\t// Tick\n\tvoid UpdateSpline(float DeltaSeconds);\n\tvoid UpdateChapter(float DeltaSeconds);\n\n\t// Helper methods\n\tASoPlayerSpline* GetOwnerSpline();\n\n\tvoid IncreaseTotalPlayTimeSeconds(float DeltaTime);\n\n\tFORCEINLINE void IncrementTotalDeathNum()\n\t{\n\t\tProgressStats.TotalDeathNum++;\n\t\tTempAnalyticsStats.TotalDeathNum++;\n\t}\n\n\tFORCEINLINE void IncrementTotalDeathWithSoulKeeperNum()\n\t{\n\t\tProgressStats.TotalDeathWithSoulKeeperNum++;\n\t\tTempAnalyticsStats.TotalDeathWithSoulKeeperNum++;\n\t}\n\n\tFORCEINLINE void IncrementTotalDeathWithCheckpointNum()\n\t{\n\t\tProgressStats.TotalDeathWithCheckpointNum++;\n\t\tTempAnalyticsStats.TotalDeathWithCheckpointNum++;\n\t}\n\n\tFORCEINLINE void IncreaseTotalLostHP(ESoDmgType DamageType, int32 LostHP)\n\t{\n\t\tProgressStats.IncreaseTotalLostHP(DamageType, LostHP);\n\t\tTempAnalyticsStats.IncreaseTotalLostHP(DamageType, LostHP);\n\t}\n\n\tFORCEINLINE void IncrementSplineEnterNum(FName SplineName)\n\t{\n\t\tProgressStats.IncrementMapSplineEnterNum(OwnerChapterName, SplineName);\n\t\tTempAnalyticsStats.IncrementMapSplineEnterNum(OwnerChapterName, SplineName);\n\t}\n\n\tFORCEINLINE void IncreaseSplineTimeSpent(FName SplineName, float DeltaSeconds)\n\t{\n\t\tProgressStats.IncreaseMapSplineTimeSpent(OwnerChapterName, SplineName, DeltaSeconds);\n\t\tTempAnalyticsStats.IncreaseMapSplineTimeSpent(OwnerChapterName, SplineName, DeltaSeconds);\n\t}\n\n\tFORCEINLINE void AddSplineDeathEntry(FName SplineName, const FSoSplineDeathContext& DeathContext)\n\t{\n\t\tProgressStats.AddMapSplineDeathEntry(OwnerChapterName, SplineName, DeathContext);\n\t\tTempAnalyticsStats.AddMapSplineDeathEntry(OwnerChapterName, SplineName, DeathContext);\n\t}\n\n\tFORCEINLINE void IncreaseSplineLostHP(FName SplineName, ESoDmgType DamageType, int32 LostHP)\n\t{\n\t\tProgressStats.IncreaseMapSplineLostHP(OwnerChapterName, SplineName, DamageType, LostHP);\n\t\tTempAnalyticsStats.IncreaseMapSplineLostHP(OwnerChapterName, SplineName, DamageType, LostHP);\n\t}\n\n\tFORCEINLINE void UpdateSplineFirstEnterTime(FName SplineName)\n\t{\n\t\tProgressStats.UpdateMapSplineTimeFirstEnter(OwnerChapterName, SplineName, ProgressStats.TotalPlayTimeSeconds);\n\t\t// NOTE not interested in updating spline first time enter data for the TempAnalyticsStats\n\t}\n\n\tFORCEINLINE void SetSplineLength(FName SplineName, float Length)\n\t{\n\t\tProgressStats.SetMapSplineLength(OwnerChapterName, SplineName, Length);\n\t\t// NOTE not interested in updating spline first time enter data for the TempAnalyticsStats\n\t}\n\n\tFORCEINLINE void SpellCasted(FName SpellName)\n\t{\n\t\tProgressStats.SpellCasted(SpellName);\n\t\tTempAnalyticsStats.SpellCasted(SpellName);\n\t}\n\nprotected:\n\t// Our master\n\tUPROPERTY(BlueprintReadOnly)\n\tASoCharacter* SoOwner = nullptr;\n\n\t// Should we spline stats?\n\tUPROPERTY(BlueprintReadOnly)\n\tbool bCollectSplineStats = true;\n\n\t// Stats for the current player, contains data from all sessions, loaded from/to save file.\n\tUPROPERTY(BlueprintReadOnly)\n\tFSoPlayerProgressStats ProgressStats;\n\n\t// Current player stats, tracks only some variables for the current session, not saved on disk\n\t// NOTE: This is discarded on session end.\n\t// UPROPERTY(BlueprintReadOnly)\n\t//FSoPlayerProgressStats CurrentSessionStats;\n\n\t// Temporary stats for the analytics, that will get reset every time the analytics sends the data\n\t// Will get reset on save/load\n\tUPROPERTY(BlueprintReadOnly)\n\tFSoPlayerProgressStats TempAnalyticsStats;\n\n\t// the spline location of the owner player\n\tFSoSplinePoint OwnerSplineLocation;\n\n\t// Current Chapter Name\n\tFName OwnerChapterName;\n\n\t/** Broadcasts before loading anything in OnLoad */\n\tFSoPlayerProgressPreSaveLoad PreLoadEvent;\n\n\t/** Broadcasts before saving anything in OnSave */\n\tFSoPlayerProgressPreSaveLoad PreSaveEvent;\n\n\t// Cached game instance\n\tUPROPERTY()\n\tUSoGameInstance* GameInstance;\n\n\tUPROPERTY()\n\tUSoOnlineRichPresence* OnlineRichPresence;\n};\n"
  },
  {
    "path": "Source/SOrb/Character/SoPreviewCharacter.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#include \"SoPreviewCharacter.h\"\n\n#include \"Components/SkeletalMeshComponent.h\"\n#include \"Components/StaticMeshComponent.h\"\n#include \"UObject/ConstructorHelpers.h\"\n\n#include \"Basic/Helpers/SoStaticHelper.h\"\n#include \"Character/SoCharacter.h\"\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// Sets default values\nASoPreviewCharacter::ASoPreviewCharacter()\n{\n\tPrimaryActorTick.bCanEverTick = true;\n\n\tSoCharMesh = CreateDefaultSubobject<USkeletalMeshComponent>(TEXT(\"SoMesh\"));\n\tRootComponent = SoCharMesh;\n\tauto SkelMesh = ConstructorHelpers::FObjectFinder<USkeletalMesh>(TEXT(\"/Game/SO/Assets/CharacterMeshMat/SOrbMesh.SOrbMesh\"));\n\tSoCharMesh->SetSkeletalMesh(SkelMesh.Object);\n\n\tSoLeftItem = CreateDefaultSubobject<UStaticMeshComponent>(TEXT(\"SoLeftItem\"));\n\tSoLeftItem->SetupAttachment(SoCharMesh, \"Item_L\");\n\tSoLeftItem->SetRelativeLocation(FVector(-1.071995, 13.090923, -0.000017));\n\tSoLeftItem->SetRelativeRotation({ -0.000031, 0.000073, -89.999939 });\n\n\tSoRightItem = CreateDefaultSubobject<UStaticMeshComponent>(TEXT(\"SoRightItem\"));\n\tSoRightItem->SetupAttachment(SoCharMesh, \"ItemAttachPoint\");\n\tSoRightItem->SetRelativeLocation(FVector(-1.071995, 13.090923, -0.000017));\n\tSoRightItem->SetRelativeRotation({ -0.000031, 0.000073, -89.999939 });\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n#if WITH_EDITOR\nvoid ASoPreviewCharacter::PostEditChangeProperty(FPropertyChangedEvent& PropertyChangedEvent)\n{\n\tSuper::PostEditChangeProperty(PropertyChangedEvent);\n\n\tSoLeftItem->SetStaticMesh(LeftItemMesh);\n\tif (SoLeftItem->GetMaterials().Num() > 0 && LeftItemMaterial != nullptr)\n\t\tSoLeftItem->SetMaterial(0, LeftItemMaterial);\n\n\tSoRightItem->SetStaticMesh(RightItemMesh);\n\tif (SoRightItem->GetMaterials().Num() > 0 && RightItemMaterial != nullptr)\n\t\tSoRightItem->SetMaterial(0, RightItemMaterial);\n}\n#endif\n\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoPreviewCharacter::SetMeshMaterialSafe(USkeletalMeshComponent* MeshComponent, USkeletalMesh* Mesh, UMaterialInterface* Material)\n{\n\tif (MeshComponent == nullptr)\n\t\treturn;\n\n\tMeshComponent->SetSkeletalMesh(Mesh);\n\tif (MeshComponent->GetMaterials().Num() > 0 && Material != nullptr)\n\t\tMeshComponent->SetMaterial(0, Material);\n}\n"
  },
  {
    "path": "Source/SOrb/Character/SoPreviewCharacter.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#pragma once\n\n#include \"GameFramework/Actor.h\"\n#include \"SoPreviewCharacter.generated.h\"\n\n\nclass USkeletalMesh;\nclass USkeletalMeshComponent;\nclass UMaterialInterface;\nclass USkeletalMeshComponent;\n\n\n/** class used to setup any character pose with clothes/weapons */\nUCLASS()\nclass SORB_API ASoPreviewCharacter : public AActor\n{\n\tGENERATED_BODY()\n\t\npublic:\t\n\tASoPreviewCharacter();\n\n#if WITH_EDITOR\n\tvirtual void PostEditChangeProperty(FPropertyChangedEvent& PropertyChangedEvent) override;\n#endif\n\nprotected:\n\n\tvoid SetMeshMaterialSafe(USkeletalMeshComponent* MeshComponent, USkeletalMesh* Mesh, UMaterialInterface* Material);\n\nprotected:\n\n\tUPROPERTY(EditAnywhere, Category = Preview)\n\tUStaticMesh* LeftItemMesh;\n\n\tUPROPERTY(EditAnywhere, Category = Preview)\n\tUMaterialInterface* LeftItemMaterial;\n\n\tUPROPERTY(EditAnywhere, Category = Preview)\n\tUStaticMesh* RightItemMesh;\n\n\tUPROPERTY(EditAnywhere, Category = Preview)\n\tUMaterialInterface* RightItemMaterial;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Preview)\n\tUSkeletalMeshComponent* SoCharMesh;\n\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Preview)\n\tUStaticMeshComponent* SoLeftItem;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Preview)\n\tUStaticMeshComponent* SoRightItem;\n};\n"
  },
  {
    "path": "Source/SOrb/Character/SoSpringArmComponent.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#include \"SoSpringArmComponent.h\"\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoSpringArmComponent::ForceUpdate()\n{\n\tUpdateDesiredArmLocation(false, false, false, 1.0f);\n}\n"
  },
  {
    "path": "Source/SOrb/Character/SoSpringArmComponent.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#pragma once\n\n#include \"GameFramework/SpringArmComponent.h\"\n#include \"SoSpringArmComponent.generated.h\"\n\n/**\n * \n */\nUCLASS()\nclass SORB_API USoSpringArmComponent : public USpringArmComponent\n{\n\tGENERATED_BODY()\n\t\npublic:\n\n\tvoid ForceUpdate();\n\t\n};\n"
  },
  {
    "path": "Source/SOrb/Character/SoWizard.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#include \"SoWizard.h\"\n\n#include \"TimerManager.h\"\n#include \"EngineUtils.h\"\n\n#include \"DlgManager.h\"\n#include \"DlgContext.h\"\n\n#include \"SoCharacter.h\"\n#include \"DlgDialogue.h\"\n#include \"Character/SoCharStates/SoAInUI.h\"\n\n#include \"SoLocalization.h\"\n\nDEFINE_LOG_CATEGORY_STATIC(LogSoWizard, Log, All);\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// Sets default values\nUSoWizard::USoWizard()\n{\n\tDialogueData.PositionIndex = 2;\n\tDialogueData.ParticipantName = TEXT(\"Wizard\");\n\tDialogueData.ParticipantDisplayName = FROM_STRING_TABLE_DIALOGUE(\"npc_wizard\");\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoWizard::Initialize(ASoCharacter* PlayerCharacter)\n{\n\tCharacter = PlayerCharacter;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoWizard::StartDialogueWithPlayer(UDlgDialogue* Dialogue)\n{\n\tif (Dialogue == nullptr || Character == nullptr || Character->bDebugSkipDialogues)\n\t\treturn false;\n\n\tUDlgContext* DlgContext = nullptr;\n\tswitch (Dialogue->GetParticipantsNum())\n\t{\n\t\tcase 1:\n\t\t{\n\t\t\tif (!Dialogue->HasParticipant(DialogueData.ParticipantName))\n\t\t\t\tUE_LOG(LogSoWizard, Warning, TEXT(\"Failed to start dialogue = `%s`: the Wizard must participate!\"), *Dialogue->GetPathName())\n\t\t\telse\n\t\t\t\tDlgContext = UDlgManager::StartMonologue(Dialogue, this);\n\t\t}\n\t\tbreak;\n\n\t\tcase 2:\n\t\t{\n\t\t\tif (!Dialogue->HasParticipant(DialogueData.ParticipantName) ||\n\t\t\t\tCharacter == nullptr ||\n\t\t\t\t!Dialogue->HasParticipant(IDlgDialogueParticipant::Execute_GetParticipantName(Character)))\n\t\t\t{\n\t\t\t\tUE_LOG(LogSoWizard, Warning, TEXT(\"Failed to start dialogue = `%s`: the Wizard and the Character must participate!\"), *Dialogue->GetPathName());\n\t\t\t}\n\t\t\telse\n\t\t\t\tDlgContext = UDlgManager::StartDialogue2(Dialogue, this, Character);\n\t\t}\n\t\tbreak;\n\n\t\tdefault:\n\t\t\tUE_LOG(LogSoWizard, Warning, TEXT(\"Failed to start dialogue = `%s`: invalid participant count!\"), *Dialogue->GetPathName());\n\t}\n\n\tif (DlgContext == nullptr)\n\t\treturn false;\n\n\tCharacter->SoAInUI->Enter(DlgContext, WizardDialogueUIActivityClass, true);\n\n\treturn true;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoWizard::ResumeDialogueWithPlayer()\n{\n\tif (Character->GetInterruptedWizardDialogue() != nullptr)\n\t\tCharacter->SoAInUI->Enter(Character->GetInterruptedWizardDialogue(), WizardDialogueUIActivityClass, true);\n}\n"
  },
  {
    "path": "Source/SOrb/Character/SoWizard.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#pragma once\n#include \"Engine/EngineTypes.h\"\n#include \"DlgDialogueParticipant.h\"\n\n#include \"Basic/SoDialogueParticipant.h\"\n\n#include \"SoWizard.generated.h\"\n\n\nclass USoInGameUIActivity;\nclass ASoCharacter;\nclass UDlgDialogue;\n\n/**\n *  Wizard dialogue participant, it is created and managed by the character class\n */\nUCLASS(BlueprintType)\nclass SORB_API USoWizard : public UObject, public IDlgDialogueParticipant, public ISoDialogueParticipant\n{\n\tGENERATED_BODY()\n\npublic:\n\t// Sets default values for this actor's properties\n\tUSoWizard();\n\n\tvoid Initialize(ASoCharacter* PlayerCharacter);\n\n\t// <SoDialogueParticipant>\n\tvirtual const FSoDialogueParticipantData& GetParticipantData() const override { return DialogueData; }\n\n\t// <DlgDialogueParticipant interface>\n\tFName GetParticipantName_Implementation() const override { return DialogueData.ParticipantName; }\n\tFText GetParticipantDisplayName_Implementation(FName ActiveSpeaker) const override { return DialogueData.ParticipantDisplayName; }\n\tETextGender GetParticipantGender_Implementation() const { return ETextGender::Neuter; }\n\tUTexture2D* GetParticipantIcon_Implementation(FName ActiveSpeaker, FName ActiveSpeakerState) const override { return DialogueData.ParticipantIcon; }\n\n\t// should be implemented in blueprint:\n\tbool ModifyIntValue_Implementation(FName ValueName, bool bDelta, int32 Value) override { return false; }\n\tbool ModifyFloatValue_Implementation(FName ValueName, bool bDelta, float Value) override { return false; }\n\tbool ModifyNameValue_Implementation(FName ValueName, FName NameValue) override { return false; }\n\tbool ModifyBoolValue_Implementation(FName ValueName, bool bValue) override { return false; }\n\tbool OnDialogueEvent_Implementation(UDlgContext* Context, FName EventName) override { return false; }\n\tbool CheckCondition_Implementation(const UDlgContext* Context, FName ConditionName) const override { return false; }\n\tfloat GetFloatValue_Implementation(FName ValueName) const override { return 0.0f; }\n\tint32 GetIntValue_Implementation(FName ValueName) const override { return 0; }\n\tbool GetBoolValue_Implementation(FName ValueName) const override { return false; }\n\tFName GetNameValue_Implementation(FName ValueName) const override { return NAME_None; }\n\t// </DlgDialogueParticipant interface>\n\n\n\tUFUNCTION(BlueprintCallable, Category = Dialogue)\n\tbool StartDialogueWithPlayer(UDlgDialogue* Dialogue);\n\n\tvoid ResumeDialogueWithPlayer();\n\n\tconst TSubclassOf<USoInGameUIActivity>& GetWizardDialogueUIActivityClass() const { return WizardDialogueUIActivityClass; }\n\nprotected:\n\n\tUPROPERTY(EditAnywhere, BlueprintReadOnly, Category = \"Dialogues\")\n\tFSoDialogueParticipantData DialogueData;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadOnly, Category = \"Dialogues\")\n\tTSubclassOf<USoInGameUIActivity> WizardDialogueUIActivityClass;\n\n\tUPROPERTY(BlueprintReadWrite)\n\tASoCharacter* Character;\n};\n"
  },
  {
    "path": "Source/SOrb/CharacterBase/SoCharacterBase.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#include \"SoCharacterBase.h\"\n\n#include \"Effects/SoEffectHandlerComponent.h\"\n#include \"Kismet/GameplayStatics.h\"\n#include \"Components/SkeletalMeshComponent.h\"\n#include \"Particles/ParticleSystemComponent.h\"\n#include \"Curves/CurveFloat.h\"\n#include \"Curves/CurveLinearColor.h\"\n#include \"Materials/MaterialInstanceDynamic.h\"\n\n#include \"Effects/SoEffectBase.h\"\n#include \"SoCharacterMovementComponent.h\"\n#include \"SoCharacterSheet.h\"\n#include \"Items/SoItem.h\"\n#include \"Basic/SoAudioManager.h\"\n#include \"SplineLogic/SoPlayerSpline.h\"\n#include \"Projectiles/SoProjectileSpawnerComponent.h\"\n#include \"SplineLogic/SoSplinePoint.h\"\n\nDEFINE_LOG_CATEGORY_STATIC(LogSoCharacterBase, All, All)\n\n\nFName ASoCharacterBase::CharacterSheetName(TEXT(\"SoCharacterSheet\"));\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nASoCharacterBase::ASoCharacterBase(const FObjectInitializer& ObjectInitializer) :\n\tSuper(ObjectInitializer.SetDefaultSubobjectClass<USoCharacterMovementComponent>(CharacterMovementComponentName))\n{\n\tSoMovement = Cast<USoCharacterMovementComponent>(GetCharacterMovement());\n\tSoMovement->bOrientRotationToMovement = true;\n\n\tSoCharacterSheet = CreateDefaultSubobject<USoCharacterSheet>(CharacterSheetName);\n\tSoEffectHandler = ObjectInitializer.CreateDefaultSubobject<USoEffectHandlerComponent>(this, TEXT(\"SoEffectHandler\"));\n\n\tProjectileSpawner = CreateDefaultSubobject<USoProjectileSpawnerComponent>(TEXT(\"SoProjectileSpawner\"));\n\tProjectileSpawner->SetupAttachment(RootComponent);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoCharacterBase::Tick(float DeltaSeconds)\n{\n\tDECLARE_SCOPE_CYCLE_COUNTER(TEXT(\"Base - Tick\"), STAT_Base_Tick, STATGROUP_SoCharacter);\n\n\tSuper::Tick(DeltaSeconds);\n\tUpdateMaterialAnimations(DeltaSeconds);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool ASoCharacterBase::NeedsHeal_Implementation() const\n{\n\treturn SoCharacterSheet->GetHealth() < SoCharacterSheet->GetMaxHealth();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoCharacterBase::Heal_Implementation(bool bAll, float Delta)\n{\n\tif (bAll)\n\t\tSoCharacterSheet->RestoreHealth();\n\telse\n\t\tSoCharacterSheet->IncreaseHealth(Delta);\n\n\tUSoAudioManager::PlaySoundAtLocation(this, SFXFOnHeal, GetActorTransform());\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoCharacterBase::ApplyEffect_Implementation(TSubclassOf<USoEffectBase> EffectClass, bool bApply)\n{\n\tif (bApply)\n\t\tSoEffectHandler->AddEffect(EffectClass);\n\telse\n\t\tSoEffectHandler->RemoveEffect(EffectClass);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool ASoCharacterBase::SubscribeOnDied_Implementation(const FSoOnMortalNoParam& OnDeath, bool bSubscribe)\n{\n\tif (bSubscribe)\n\t\tOnMortalDeath.Add(OnDeath);\n\telse\n\t\tOnMortalDeath.Remove(OnDeath);\n\n\treturn true;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool ASoCharacterBase::SubscribeOnSpellsReset_Implementation(const FSoOnMortalNoParam& OnSpellsReset, bool bSubscribe)\n{\n\tif (bSubscribe)\n\t\tOnSpellsReseted.Add(OnSpellsReset);\n\telse\n\t\tOnSpellsReseted.Remove(OnSpellsReset);\n\n\treturn true;\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool ASoCharacterBase::SubscribeOnMeleeHit_Implementation(const FSoOnMeleeHit& InOnMeleeHit, bool bSubscribe)\n{\n\tif (bSubscribe)\n\t\tOnMeleeHit.Add(InOnMeleeHit);\n\telse\n\t\tOnMeleeHit.Remove(InOnMeleeHit);\n\n\treturn true;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool ASoCharacterBase::SubscribeOnMeleeHitTaken_Implementation(const FSoOnMeleeHit& InOnMeleeHit, bool bSubscribe)\n{\n\tif (bSubscribe)\n\t\tOnMeleeHitSuffered.Add(InOnMeleeHit);\n\telse\n\t\tOnMeleeHitSuffered.Remove(InOnMeleeHit);\n\n\treturn true;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool ASoCharacterBase::SubscribeOnHitTaken_Implementation(const FSoOnHit& OnHit, bool bSubscribe)\n{\n\tif (bSubscribe)\n\t\tOnHitSuffered.Add(OnHit);\n\telse\n\t\tOnHitSuffered.Remove(OnHit);\n\n\treturn true;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoCharacterBase::SetRootMotionDesc(const FSoRootMotionDesc& Desc)\n{\n\tSoMovement->SetRootMotionDesc(Desc);\n}\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoCharacterBase::ClearRootMotionDesc()\n{\n\tSoMovement->ClearRootMotionDesc();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoCharacterBase::ChangeSpline(ASoPlayerSpline* NewSpline)\n{\n\tFSoSplinePoint SplineLoc;\n\tSplineLoc.SetSpline(NewSpline);\n\tSplineLoc.SetDistanceFromWorldLocation(GetActorLocation());\n\tSoMovement->SetSplineLocation(SplineLoc);\n\n\t// move character there, otherwise he would get crazy velocity next frame\n\tFVector NewPos = SplineLoc;\n\tNewPos.Z = GetActorLocation().Z;\n\tSetActorLocation(NewPos, true, nullptr, ETeleportType::TeleportPhysics);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFSoSplinePoint ASoCharacterBase::GetSplineLocationI_Implementation() const\n{\n\treturn SoMovement ? SoMovement->GetSplineLocation() : FSoSplinePoint{};\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoCharacterBase::SetSplineLocation_Implementation(const FSoSplinePoint& SplinePoint, bool bUpdateOrientation)\n{\n\tSoMovement->SetSplineLocation(SplinePoint);\n\tif (bUpdateOrientation)\n\t\tSetActorRotation(SplinePoint.GetDirectionFromVector(GetActorForwardVector()).Rotation());\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoCharacterBase::OnStatusEffectChanged_Implementation(ESoStatusEffect Effect, bool bGained)\n{\n\tOnStatusEffect(Effect, bGained);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoCharacterBase::DisplayVisualEffect_Implementation(ESoVisualEffect Effect)\n{\n\tOnDisplayVisualEffect(Effect);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFVector ASoCharacterBase::GetEffectAttachLocation_Implementation()\n{\n\treturn GetActorLocation();\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoCharacterBase::ApplyStaticEffects(const FSoItem& Item, bool bApply)\n{\n\tTArray<TSubclassOf<USoEffectBase>> Effects;\n\tItem.GetStaticEffects(Effects);\n\tfor (TSubclassOf<USoEffectBase>& Effect : Effects)\n\t\tISoMortal::Execute_ApplyEffect(this, Effect, bApply);\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoCharacterBase::PlayMaterialAnimation(int32 Index, bool bForward, float Speed)\n{\n\tif (MaterialAnimations.IsValidIndex(Index))\n\t{\n\t\tMaterialAnimations[Index].Counter = 0.0f;\n\t\tMaterialAnimations[Index].bPlayForward = bForward;\n\t\tMaterialAnimations[Index].PlaySpeed = Speed;\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoCharacterBase::StopMaterialAnimation(int32 Index)\n{\n\tif (MaterialAnimations.IsValidIndex(Index) && MaterialAnimations[Index].Counter < MaterialAnimations[Index].Duration)\n\t{\n\t\tMaterialAnimations[Index].Counter = MaterialAnimations[Index].Duration + 0.1f;\n\t\tOnMaterialAnimationInterrupted(Index);\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoCharacterBase::StopAllMaterialAnimations()\n{\n\tfor (int32 i = 0; i < MaterialAnimations.Num(); ++i)\n\t\tStopMaterialAnimation(i);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoCharacterBase::SetScalarOnParticleMaterials(UParticleSystemComponent* PS, FName ParamName, float Value)\n{\n\tif (PS == nullptr)\n\t\treturn;\n\n\tfor (UMaterialInterface* MaterialInterface : PS->EmitterMaterials)\n\t\tif (UMaterialInstanceDynamic* DynamicMaterial = Cast<UMaterialInstanceDynamic>(MaterialInterface))\n\t\t\tDynamicMaterial->SetScalarParameterValue(ParamName, Value);\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoCharacterBase::UpdateMaterialAnimations(float DeltaSeconds)\n{\n\tfor (int32 MatAnimIndex = 0; MatAnimIndex < MaterialAnimations.Num(); ++MatAnimIndex)\n\t{\n\t\tFSoMaterialAnimationEntry& Entry = MaterialAnimations[MatAnimIndex];\n\t\tif (Entry.Counter < Entry.Duration && (Entry.ScalarCurve != nullptr || Entry.ColorCurve))\n\t\t{\n\t\t\tEntry.Counter += DeltaSeconds * Entry.PlaySpeed;\n\t\t\tconst float Progress = FMath::Clamp(Entry.Counter / Entry.Duration, 0.0f, 1.0f);\n\t\t\tconst float Percent = Entry.bPlayForward ? Progress : 1.0f - Progress;\n\t\t\tauto ApplyOnMaterialInstance = [&Entry, &Percent](UMaterialInstanceDynamic* Instance)\n\t\t\t{\n\t\t\t\tif (Instance != nullptr)\n\t\t\t\t{\n\t\t\t\t\tif (Entry.ScalarCurve != nullptr)\n\t\t\t\t\t\tInstance->SetScalarParameterValue(Entry.MaterialParameterName, Entry.ScalarCurve->GetFloatValue(Percent));\n\t\t\t\t\telse\n\t\t\t\t\t\tInstance->SetVectorParameterValue(Entry.MaterialParameterName, Entry.ColorCurve->GetLinearColorValue(Percent));\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t\tUE_LOG(LogSoCharacterBase, Warning, TEXT(\"[ASoCharacterBase]: failed to set param in material: invalid pointer (maybe not dynamic material?)\"));\n\t\t\t};\n\n\t\t\tif (Entry.TargetOverridePS.Num() > 0)\n\t\t\t{\n\t\t\t\tauto ApplyOnMaterial = [&ApplyOnMaterialInstance](UParticleSystemComponent* PS, int Index)\n\t\t\t\t{\n\t\t\t\t\tif (PS->EmitterMaterials.IsValidIndex(Index))\n\t\t\t\t\t\tApplyOnMaterialInstance(Cast<UMaterialInstanceDynamic>(PS->EmitterMaterials[Index]));\n\t\t\t\t};\n\n\t\t\t\tfor (UParticleSystemComponent* PS : Entry.TargetOverridePS)\n\t\t\t\t{\n\t\t\t\t\tif (Entry.MaterialIndexList.Num() == 0)\n\t\t\t\t\t\tfor (int32 i = 0; i < PS->EmitterMaterials.Num(); ++i)\n\t\t\t\t\t\t\tApplyOnMaterial(PS, i);\n\t\t\t\t\telse\n\t\t\t\t\t\tfor (int32 MaterialIndex : Entry.MaterialIndexList)\n\t\t\t\t\t\t\tApplyOnMaterial(PS, MaterialIndex);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif (Entry.MaterialIndexList.Num() == 0)\n\t\t\t\t{\n\t\t\t\t\tif (Entry.ScalarCurve != nullptr)\n\t\t\t\t\t\tGetMesh()->SetScalarParameterValueOnMaterials(Entry.MaterialParameterName, Entry.ScalarCurve->GetFloatValue(Percent));\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tconst FLinearColor C = Entry.ColorCurve->GetLinearColorValue(Percent);\n\t\t\t\t\t\tGetMesh()->SetVectorParameterValueOnMaterials(Entry.MaterialParameterName, FVector(C.R, C.G, C.B));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tfor (int32 MaterialIndex : Entry.MaterialIndexList)\n\t\t\t\t\t{\n\t\t\t\t\t\tUMaterialInterface* MaterialInterface = GetMesh()->GetMaterial(MaterialIndex);\n\t\t\t\t\t\tif (MaterialInterface)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tUMaterialInstanceDynamic* DynamicMaterial = Cast<UMaterialInstanceDynamic>(MaterialInterface);\n\t\t\t\t\t\t\tif (DynamicMaterial == nullptr)\n\t\t\t\t\t\t\t\tDynamicMaterial = GetMesh()->CreateAndSetMaterialInstanceDynamic(MaterialIndex);\n\n\t\t\t\t\t\t\tApplyOnMaterialInstance(DynamicMaterial);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (Entry.Counter >= Entry.Duration)\n\t\t\t{\n\t\t\t\tOnMaterialAnimationFinished(MatAnimIndex);\n\t\t\t}\n\t\t}\n\t}\n\n}\n"
  },
  {
    "path": "Source/SOrb/CharacterBase/SoCharacterBase.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#pragma once\n\n// interface\n#include \"CoreMinimal.h\"\n\n#include \"GameFramework/Character.h\"\n\n#include \"SoIMortalTypes.h\"\n#include \"CharacterBase/SoMortal.h\"\n#include \"SplineLogic/SoSplineWalker.h\"\n\n#include \"SoCharacterBase.generated.h\"\n\nclass USoEffectHandlerComponent;\nclass USoEffectBase;\nclass ASoPlayerSpline;\nclass UParticleSystemComponent;\nclass UFMODEvent;\nclass USoProjectileSpawnerComponent;\nclass USoCharacterMovementComponent;\nclass USoCharacterSheet;\nstruct FSoSplinePoint;\nstruct FSoItem;\n\n\nDECLARE_STATS_GROUP(TEXT(\"SoCharacter\"), STATGROUP_SoCharacter, STATCAT_Advanced);\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n/**\n *  Common parent class for the player character and for the spline based AI\n */\nUCLASS(Abstract)\nclass SORB_API ASoCharacterBase : public ACharacter, public ISoMortal, public ISoSplineWalker\n{\n\tGENERATED_BODY()\n\npublic:\n\t// Sets default values for this actor's properties\n\tASoCharacterBase(const FObjectInitializer& ObjectInitializer);\n\n\tvirtual void Tick(float DeltaSeconds) override;\n\n\t// So interfaces:\n\n\t// mortal\n\tvirtual bool IsAlive_Implementation() const override { return false; }\n\tvirtual void Kill_Implementation(bool bPhysical) override {};\n\tvirtual bool NeedsHeal_Implementation() const override;\n\tvirtual bool HasInvulnerability_Implementation() const override { return false; }\n\tvirtual bool IsBounceAble_Implementation() const override { return false; }\n\n\tvirtual bool MeleeHit_Implementation(const FSoMeleeHitParam& HitParam) override { return false; }\n\n\tvirtual void ApplyEffect_Implementation(TSubclassOf<USoEffectBase> EffectClass, bool bApply) override;\n\n\tvirtual void Heal_Implementation(bool bAll, float Delta) override;\n\n\tvirtual bool SubscribeOnDied_Implementation(const FSoOnMortalNoParam& OnDeath, bool bSubscribe = true) override;\n\tvirtual bool SubscribeOnSpellsReset_Implementation(const FSoOnMortalNoParam& OnDeath, bool bSubscribe = true) override;\n\tvirtual bool SubscribeOnMeleeHit_Implementation(const FSoOnMeleeHit& InOnMeleeHit, bool bSubscribe = true) override;\n\tvirtual bool SubscribeOnMeleeHitTaken_Implementation(const FSoOnMeleeHit& InOnMeleeHit, bool bSubscribe = true) override;\n\tvirtual bool SubscribeOnHitTaken_Implementation(const FSoOnHit& InOnHit, bool bSubscribe = true) override;\n\tvirtual bool SubscribeOnWalkThroughMortal_Implementation(const FSoNotifyActorSingle& OnWalkThrough, bool bSubscribe = true) override { return true; }\n\n\n\tvoid OnStatusEffectChanged_Implementation(ESoStatusEffect Effect, bool bGained);\n\tvoid DisplayVisualEffect_Implementation(ESoVisualEffect Effect);\n\n\tvirtual FVector GetEffectAttachLocation_Implementation() override;\n\n\n\t// SoSplineWalker\n\tFSoSplinePoint GetSplineLocationI_Implementation() const override;\n\tvoid SetSplineLocation_Implementation(const FSoSplinePoint& SplinePoint, bool bUpdateOrientation) override;\n\tvoid OnPushed_Implementation(const FVector& DeltaMovement, float DeltaSeconds, bool bStuck, AActor* RematerializeLocation, int32 DamageAmountIfStuck, bool bForceDamage) override {};\n\n\n\t// <Movement>\n\t// used by SoCharacter only\n\n\t// used by SoCharacter for camera/input direction handling\n\tvirtual void OnSplineChanged(const FSoSplinePoint& OldLocation, const FSoSplinePoint& NewLocation) {};\n\n\tvirtual bool ShouldBounceOnHit(float& OutStepUpHitVelocity, float& OutBounceDamping, const FHitResult* HitResult = nullptr) const { return false; }\n\t// true: land should go on, false: character is bounced back\n\tvirtual bool OnPreLanded(const FHitResult& Hit) { return true; }\n\n\t// nope nope nope - those are player related stuffs, only SoCharacter implements it (which is the player char only), everyone else should never try those\n\t// can be Check(false) because ShouldBounceOnHit() should stop the function from being executed if it is irrelevant anyway\n\tvirtual void OnBounce(bool bWallJump, float NewStoredMoveValue, const FVector& HitPoint, const FVector& HitNormal) { check(false); }\n\t// return true if character can perform a wall jump right now\n\tvirtual bool CanPerformWallJump(const FHitResult& HitResult) { ensure(false); return false; }\n\t// </Movement>\n\n\n\t// SoCombatComponent calls on the owner if the owner's strike is blocked\n\tvirtual void OnBlocked() {}\n\n\n\tvoid SetRootMotionDesc(const FSoRootMotionDesc& Desc);\n\tvoid ClearRootMotionDesc();\n\n\t// TODO: is it used at all?\n\tUFUNCTION(BlueprintCallable, Category = SplineLocation)\n\tvoid ChangeSpline(ASoPlayerSpline* NewSpline);\n\n\tUSoCharacterMovementComponent* GetSoMovement() { return SoMovement; }\n\tUSoCharacterMovementComponent* GetSoMovement() const { return SoMovement; }\n\n\tvoid ApplyStaticEffects(const FSoItem& Item, bool bApply);\n\n\tUSoProjectileSpawnerComponent* GetProjectileSpawner() { return ProjectileSpawner; }\n\tconst USoProjectileSpawnerComponent* GetProjectileSpawner() const { return ProjectileSpawner; }\n\n\tUFUNCTION(BlueprintCallable, Category = Misc)\n\tvoid PlayMaterialAnimation(int32 Index, bool bForward = true, float Speed = 1.0f);\n\n\tUFUNCTION(BlueprintCallable, Category = Misc)\n\tvoid StopMaterialAnimation(int32 Index);\n\n\tUFUNCTION(BlueprintCallable, Category = Misc)\n\tvoid StopAllMaterialAnimations();\n\n\tUFUNCTION(BlueprintCallable, Category = Misc)\n\tvoid SetScalarOnParticleMaterials(UParticleSystemComponent* PS, FName ParamName, float Value);\n\n\tvoid UpdateMaterialAnimations(float DeltaSeconds);\n\nprotected:\n\n\tUFUNCTION(BlueprintImplementableEvent, BlueprintCallable, Category = General)\n\tvoid OnStatusEffect(ESoStatusEffect Effect, bool bGained);\n\n\tUFUNCTION(BlueprintImplementableEvent, Category = General)\n\tvoid OnDisplayVisualEffect(ESoVisualEffect Effect);\n\n\tUFUNCTION(BlueprintImplementableEvent, Category = General)\n\tvoid OnMaterialAnimationFinished(int32 MaterialAnimationIndex);\n\n\tUFUNCTION(BlueprintImplementableEvent, Category = General)\n\tvoid OnMaterialAnimationInterrupted(int32 MaterialAnimationIndex);\n\nprotected:\n\n\t// Components:\n\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere)\n\tUSoProjectileSpawnerComponent* ProjectileSpawner;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadOnly, Category = Movement)\n\tUSoCharacterMovementComponent* SoMovement;\n\n\t/** Name of the Character Sheet component. Use this name if you want to use a different class (with ObjectInitializer.SetDefaultSubobjectClass). */\n\tstatic FName CharacterSheetName;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Stats)\n\tUSoCharacterSheet* SoCharacterSheet;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadOnly, Category = EffectSystem)\n\tUSoEffectHandlerComponent* SoEffectHandler;\n\n\n\tFSoOnMortalNoParamMulti OnMortalDeath;\n\n\tFSoOnMortalNoParamMulti OnSpellsReseted;\n\n\t/** event fired when the character hits something with a melee attack */\n\tFSoOnMeleeHitMulti OnMeleeHit;\n\n\tFSoOnMeleeHitMulti OnMeleeHitSuffered;\n\n\tFSoOnHitMulti OnHitSuffered;\n\n\n\tfriend class USoCombatComponent;\n\n\tUPROPERTY(EditAnywhere, Category = SFX)\n\tUFMODEvent* SFXFOnHeal = nullptr;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Materials)\n\tTArray<FSoMaterialAnimationEntry> MaterialAnimations;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadOnly)\n\tbool bCanBeSlowed = true;\n};\n"
  },
  {
    "path": "Source/SOrb/CharacterBase/SoCharacterMovementComponent.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#include \"SoCharacterMovementComponent.h\"\n\n#include \"Components/SplineComponent.h\"\n#include \"DrawDebugHelpers.h\"\n#include \"Engine/World.h\"\n\n#include \"Basic/Helpers/SoMathHelper.h\"\n#include \"CharacterBase/SoMortal.h\"\n#include \"SplineLogic/SoSpline.h\"\n#include \"CharacterBase/SoCharacterBase.h\"\n#include \"Basic/Helpers/SoDateTimeHelper.h\"\n\n#include \"Logic/SoSimulated.h\"\n\n/////////////////////////////////////////////////\n// STUFF from charactermovementcomponent, cause something is required for the phys**** functions\nDEFINE_LOG_CATEGORY_STATIC(LogCharacterMovement, Log, All);\nDEFINE_LOG_CATEGORY_STATIC(LogNavMeshMovement, Log, All);\n\n/**\n* Character stats\n*/\n// DECLARE_STATS_GROUP(TEXT(\"Character\"), STATGROUP_Character, STATCAT_Advanced);\n\n//DECLARE_CYCLE_STAT(TEXT(\"Char Movement Tick\"), STAT_CharacterMovementTick, STATGROUP_Character);\n//DECLARE_CYCLE_STAT(TEXT(\"Char Movement Authority Time\"), STAT_CharacterMovementAuthority, STATGROUP_Character);\n//DECLARE_CYCLE_STAT(TEXT(\"Char Movement Simulated Time\"), STAT_CharacterMovementSimulated, STATGROUP_Character);\n//DECLARE_CYCLE_STAT(TEXT(\"Char CombineNetMove\"), STAT_CharacterMovementCombineNetMove, STATGROUP_Character);\n//DECLARE_CYCLE_STAT(TEXT(\"Char SmoothClientPosition\"), STAT_CharacterMovementSmoothClientPosition, STATGROUP_Character);\n//DECLARE_CYCLE_STAT(TEXT(\"Char Physics Interation\"), STAT_CharPhysicsInteraction, STATGROUP_Character);\n//DECLARE_CYCLE_STAT(TEXT(\"Char StepUp\"), STAT_CharStepUp, STATGROUP_Character);\n//DECLARE_CYCLE_STAT(TEXT(\"Char FindFloor\"), STAT_CharFindFloor, STATGROUP_Character);\n//DECLARE_CYCLE_STAT(TEXT(\"Char AdjustFloorHeight\"), STAT_CharAdjustFloorHeight, STATGROUP_Character);\n//DECLARE_CYCLE_STAT(TEXT(\"Char Update Acceleration\"), STAT_CharUpdateAcceleration, STATGROUP_Character);\n//DECLARE_CYCLE_STAT(TEXT(\"Char MoveUpdateDelegate\"), STAT_CharMoveUpdateDelegate, STATGROUP_Character);\n//DECLARE_CYCLE_STAT(TEXT(\"Char PhysWalking\"), STAT_CharPhysWalking, STATGROUP_Character);\n//DECLARE_CYCLE_STAT(TEXT(\"Char PhysFalling\"), STAT_CharPhysFalling, STATGROUP_Character);\n//DECLARE_CYCLE_STAT(TEXT(\"Char PhysNavWalking\"), STAT_CharPhysNavWalking, STATGROUP_Character);\n//DECLARE_CYCLE_STAT(TEXT(\"Char NavProjectPoint\"), STAT_CharNavProjectPoint, STATGROUP_Character);\n//DECLARE_CYCLE_STAT(TEXT(\"Char NavProjectLocation\"), STAT_CharNavProjectLocation, STATGROUP_Character);\n\n// MAGIC NUMBERS\nconst float MAX_STEP_SIDE_Z = 0.08f;\t// maximum z value for the normal on the vertical side of steps\nconst float SWIMBOBSPEED = -80.f;\nconst float VERTICAL_SLOPE_NORMAL_Z = 0.001f; // Slope is vertical if Abs(Normal.Z) <= this threshold. Accounts for precision problems that sometimes angle normals slightly off horizontal for vertical surface.\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUSoCharacterMovementComponent::USoCharacterMovementComponent()\n{\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoCharacterMovementComponent::InitializeComponent()\n{\n\tSuper::InitializeComponent();\n\n\tSoOwner = Cast<ASoCharacterBase>(GetOwner());\n\tcheck(SoOwner);\n\n\tSplineLocation.SetReferenceActor(GetOwner());\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoCharacterMovementComponent::SetDefaultMovementMode()\n{\n\tif (!bOppressSetDefaultMovementMode)\n\t\tSuper::SetDefaultMovementMode();\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoCharacterMovementComponent::TickComponent(float DeltaTime, ELevelTick TickType, FActorComponentTickFunction* ThisTickFunction)\n{\n\tDECLARE_SCOPE_CYCLE_COUNTER(TEXT(\"Movement - TickComponent\"), STAT_Movement_TickComponent, STATGROUP_SoCharacter);\n\n\tconst FSoSplinePoint OldSplineLocation = SplineLocation;\n\n\tbAlrearyRollHitThisFrame = false;\n\n\tif (MovementMode == EMovementMode::MOVE_Custom && CustomMovementMode == ECustomMovementMode::ECM_Swing)\n\t\tSwingInput = ConsumeInputVector();\n\n\t// if (SoRootMotionDesc.bVerticalRootMotionEnabled && !SoRootMotionDesc.bHorizontalRootMotionEnabled)\n\t// {\n\t// \tCalcVelocity(DeltaTime, GroundFriction, false, BrakingDecelerationWalking);\n\t// \t// Acceleration.X = 0;\n\t// \t// Acceleration.Y = 0;\n\t// }\n\n\tbWallJumpedThisFrame = false;\n\tSuper::TickComponent(DeltaTime, TickType, ThisTickFunction);\n\n\tif (MovementMode == EMovementMode::MOVE_Walking)\n\t{\n\t\tif (Velocity.Size2D() > MaxWalkSpeed)\n\t\t{\n\t\t\tconst FVector Vel = Velocity.GetSafeNormal2D() * MaxWalkSpeed;\n\t\t\tVelocity.X = Vel.X;\n\t\t\tVelocity.Y = Vel.Y;\n\t\t}\n\t}\n\n\t// force orientation along spline\n\t// used to fix orientation in air\n\t// also is a must, otherwise there are wrong frames in the middle of a turn which leads to camera glitch for the player character\n\tif (Velocity.SizeSquared2D() > 1.0f)\n\t{\n\t\tif (bOrientRotationToMovement)\n\t\t\tSoOwner->SetActorRotation(SplineLocation.GetDirectionFromVector(Velocity).Rotation());\n\t\telse\n\t\t\tif (bOrientRotationToSpline)\n\t\t\t\tSoOwner->SetActorRotation(SplineLocation.GetDirectionFromVector(SoOwner->GetActorForwardVector()).Rotation());\n\t}\n\n\tif (OldSplineLocation.GetSpline() != SplineLocation.GetSpline())\n\t\tSoOwner->OnSplineChanged(OldSplineLocation, SplineLocation);\n\n\t// maybe modified if we landed last frame, we reset here to 2.0f\n\t// BrakingFrictionFactor = 6.0f;\n\n\t// let's try to fix issues caused by moving platforms and stuff\n\tif (bWasPushedAndStuckLastFrame)\n\t{\n\t\t// check if we are inside something\n\t\tUPrimitiveComponent* Primitive = Cast<UPrimitiveComponent>(UpdatedComponent);\n\t\tif (Primitive != nullptr)\n\t\t{\n\t\t\t// test with a slightly smaller component so the base doesn't cause trouble if we are just standing on it\n\t\t\tif (GetOwner()->GetWorld()->OverlapBlockingTestByProfile(Primitive->GetComponentLocation(),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t Primitive->GetComponentTransform().GetRotation(),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t FName(\"Pawn\"), // Primitive->GetCollisionProfileName() returns with Custom?!\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t Primitive->GetCollisionShape(-5.0f)))\n\t\t\t{\n\t\t\t\t// try to move out\n\t\t\t\tbool bFixed = false;\n\t\t\t\tFHitResult Hit;\n\t\t\t\tconst FQuat Rot = UpdatedComponent->GetComponentTransform().GetRotation();\n\n\t\t\t\tconst FVector Dir = GetOwner()->GetActorForwardVector();\n\n\t\t\t\tconst FVector Delta[] = { FVector(0, 0,  0.1f),\n\t\t\t\t\t\t\t\t\t\t  FVector(0, 0, -0.1f),\n\t\t\t\t\t\t\t\t\t\t\t Dir,\n\t\t\t\t\t\t\t\t\t\t   - Dir };\n\t\t\t\t// const FVector OldLoc = UpdatedComponent->GetComponentLocation();\n\t\t\t\tfor (int32 i = 0; i < 4; ++i)\n\t\t\t\t{\n\t\t\t\t\t// if any direction says stuck we wanna fix\n\t\t\t\t\tUpdatedComponent->MoveComponent(Delta[i], Rot, true, &Hit, MoveComponentFlags | MOVECOMP_NeverIgnoreBlockingOverlaps);\n\t\t\t\t\t// Handle initial penetrations\n\t\t\t\t\tif (Hit.bStartPenetrating)\n\t\t\t\t\t{\n\t\t\t\t\t\tconst FVector RequestedAdjustment = GetPenetrationAdjustment(Hit);\n\t\t\t\t\t\tconst bool bDirFix = ResolvePenetration(RequestedAdjustment, Hit, Rot);\n\n\t\t\t\t\t\tif (bDirFix)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tbFixed = true;\n\t\t\t\t\t\t\t// UE_LOG(LogTemp, Error, TEXT(\"Moved: %f\"), (OldLoc - UpdatedComponent->GetComponentLocation()).Size());\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t\tbFixed = true;\n\t\t\t\t}\n\t\t\t\t// there is only one way out now:\n\t\t\t\tif (!bFixed)\n\t\t\t\t\tStuckedAndShouldBeKilled();\n\t\t\t}\n\t\t}\n\t\tbWasPushedAndStuckLastFrame = false;\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoCharacterMovementComponent::SetSplineLocation(ASoSpline* NewSpline, float Distance /*= 0.f*/)\n{\n\tSetSplineLocation(FSoSplinePoint(NewSpline, Distance));\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoCharacterMovementComponent::SetSplineLocation(const FSoSplinePoint& InSplineLocation)\n{\n\tSplineLocation.CopySplineLocation(InSplineLocation);\n#if WITH_EDITOR\n\tif (CharacterOwner != nullptr)\n\t{\n\t\tconst float Distance = (SplineLocation.ToVector2D() - FVector2D(CharacterOwner->GetActorLocation())).Size();\n\t\tif (Distance > 1.0f)\n\t\t\tUE_LOG(LogSoSplineSys, Warning, TEXT(\"DistanceFromSplineStart isn't 0 in USoCharacterMovementComponent::SetSpline (%f)\"), Distance);\n\t}\n#endif\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoCharacterMovementComponent::MoveAlongFloor(const FVector& InVelocity, float DeltaSeconds, FStepDownResult* OutStepDownResult)\n{\n\tDECLARE_SCOPE_CYCLE_COUNTER(TEXT(\"Movement - MoveAlongFloor\"), STAT_Movement_MoveAlongFloor, STATGROUP_SoCharacter);\n\n#if WITH_EDITOR\n\tif (!SplineLocation.IsValid())\n\t{\n\t\tUE_LOG(LogSoSplineSys, Warning, TEXT(\"Standard MoveAlongFloor used cause SplineLocation is invalid (check is only in editor atm)\"));\n\t\tSuper::MoveAlongFloor(InVelocity, DeltaSeconds, OutStepDownResult);\n\t\treturn;\n\t}\n#endif\n\n\tif (!CurrentFloor.IsWalkableFloor() || InVelocity.Size2D() < KINDA_SMALL_NUMBER)\n\t{\n\t\treturn;\n\t}\n\n\tconst FVector OldPos = UpdatedComponent->GetComponentLocation();\n\n\t// sanity check\n\t{\n\t\tconst float Error = (OldPos - SplineLocation).Size2D();\n\t\tif (Error > 0.5f)\n\t\t{\n\t\t\t// too much error, let's fix it\n\t\t\tSplineLocation.SetDistanceFromWorldLocation(OldPos);\n\t\t\t// UE_LOG(LogSoSplineSys, Warning, TEXT(\"Too much error in spline (%f) - spline location is reinitialized from actor location!\"), Error);\n\t\t}\n\t}\n\n\n\t// Move along the current floor\n\n\tFVector Direction = SplineLocation.GetDirection();\n\tDirection.Z = 0;\n\tbool bForwardMovement = true;\n\tif ((FVector2D(Direction) | FVector2D(Velocity)) <= 0)\n\t{\n\t\tDirection *= -1;\n\t\tbForwardMovement = false;\n\t}\n\n\n\tconst float SplineDeltaSign = (bForwardMovement ? 1 : -1);\n\tconst float SplineDelta = InVelocity.Size2D() * DeltaSeconds;\n\tfloat DeltaOnSpline = SplineDelta * SplineDeltaSign;\n\n\t// First attempt to fix the spline distance problem\n\t// maybe it could be moved inside SplineLocation += ?!\n\t// performance vs movement accuracy question\n\tfor (int32 i = 0; i < 4; ++i)\n\t{\n\t\tconst float RealDelta = (FVector(SplineLocation + DeltaOnSpline) - OldPos).Size2D();\n\t\tconst float Rest = FMath::Max(SplineDelta - RealDelta, 0.0f);\n\t\tDeltaOnSpline += Rest * SplineDeltaSign;\n\t}\n\n\tFVector NewPos = (SplineLocation + DeltaOnSpline);\n\tFVector Delta = NewPos - OldPos;\n\t//const float Error = fabs(Delta.Size2D() - InVelocity.Size2D() * DeltaSeconds);\n\t//if (Error > 0.6f)\n\t//\tUE_LOG(LogCharacterMovement, Warning, TEXT(\"MoveAlongFloor Error %f\"), Error);\n\n\tDelta.Z = 0.f;\n\tFHitResult Hit(1.f);\n\tFVector RampVector = ComputeGroundMovementDelta(Delta, CurrentFloor.HitResult, CurrentFloor.bLineTrace);\n\tSafeMoveUpdatedComponent(RampVector, UpdatedComponent->GetComponentQuat(), true, Hit);\n\tFSoSplinePoint OldSplineLocation = SplineLocation;\n\tSplineLocation += DeltaOnSpline;\n\tfloat LastMoveTimeSlice = DeltaSeconds;\n\n\tif (Hit.bStartPenetrating)\n\t{\n\t\t// Allow this hit to be used as an impact we can deflect off, otherwise we do nothing the rest of the update and appear to hitch.\n\t\tHandleImpact(Hit);\n\t\tfloat PercentDistanceApplied = SlideAlongSurface(Delta, 1.f, Hit.Normal, Hit, true);\n\t\tSplineLocation = OldSplineLocation + DeltaOnSpline * PercentDistanceApplied;\n\n\t\tif (Hit.bStartPenetrating)\n\t\t{\n\t\t\tOnCharacterStuckInGeometry(&Hit);\n\t\t}\n\n\t\t// UE_LOG(LogTemp, Warning, TEXT(\"bStartPenetrating\"));\n\t}\n\telse if (Hit.IsValidBlockingHit())\n\t{\n\t\t// We impacted something (most likely another ramp, but possibly a barrier).\n\t\tfloat PercentTimeApplied = Hit.Time;\n\t\tif ((Hit.Time > 0.f) && (Hit.Normal.Z > KINDA_SMALL_NUMBER) && IsWalkable(Hit))\n\t\t{\n\t\t\t// Another walkable ramp.\n\t\t\tconst float InitialPercentRemaining = 1.f - PercentTimeApplied;\n\t\t\tRampVector = ComputeGroundMovementDelta(Delta * InitialPercentRemaining, Hit, false);\n\t\t\tLastMoveTimeSlice = InitialPercentRemaining * LastMoveTimeSlice;\n\t\t\tSafeMoveUpdatedComponent(RampVector, UpdatedComponent->GetComponentQuat(), true, Hit);\n\n\t\t\tconst float SecondHitPercent = Hit.Time * InitialPercentRemaining;\n\t\t\tPercentTimeApplied = FMath::Clamp(PercentTimeApplied + SecondHitPercent, 0.f, 1.f);\n\n\t\t\t// UE_LOG(LogTemp, Warning, TEXT(\"first if\"));\n\t\t}\n\n\t\tconst float DeltaDistance = SplineLocation - OldSplineLocation;\n\t\tSplineLocation = OldSplineLocation + DeltaDistance * PercentTimeApplied;\n\t\tconst float RestDistance = (1.f - PercentTimeApplied) * DeltaDistance;\n\n\t\tif (Hit.IsValidBlockingHit())\n\t\t{\n\t\t\tif (CanStepUp(Hit) || (CharacterOwner->GetMovementBase() != NULL && CharacterOwner->GetMovementBase()->GetOwner() == Hit.GetActor()))\n\t\t\t{\n\t\t\t\t// hit a barrier, try to step up\n\t\t\t\tconst FVector GravDir(0.f, 0.f, -1.f);\n\t\t\t\tauto SavedHid = Hit;\n\t\t\t\tconst FVector LocationBeforeStepUp = UpdatedComponent->GetComponentLocation();\n\t\t\t\tbool bCouldStepUp = StepUp(GravDir, Delta * (1.f - PercentTimeApplied), Hit, OutStepDownResult);\n\t\t\t\tif (!bCouldStepUp)\n\t\t\t\t{\n\t\t\t\t\tUE_LOG(LogCharacterMovement, Verbose, TEXT(\"- StepUp (ImpactNormal %s, Normal %s\"), *Hit.ImpactNormal.ToString(), *Hit.Normal.ToString());\n\t\t\t\t\tHandleImpact(Hit, LastMoveTimeSlice, RampVector);\n\n\t\t\t\t\tfloat PercentDistanceApplied = SlideAlongSurface(Delta, 1.f - PercentTimeApplied, Hit.Normal, Hit, true);\n\t\t\t\t\tSplineLocation += RestDistance * PercentDistanceApplied;\n\t\t\t\t\t// UE_LOG(LogTemp, Warning, TEXT(\"Second if / true / true\"));\n\n\t\t\t\t\tfloat StepUpHitVelocity = 0.0f;\n\t\t\t\t\tfloat DefaultBounce = 0.0f;\n\t\t\t\t\tstatic const FName NoFloorBounceTag = FName(\"NoFloorBounce\");\n\t\t\t\t\tif (SoOwner->ShouldBounceOnHit(StepUpHitVelocity, DefaultBounce, &Hit) &&\n\t\t\t\t\t\tHit.GetActor() != nullptr &&\n\t\t\t\t\t\t!Hit.GetActor()->ActorHasTag(NoFloorBounceTag))\n\t\t\t\t\t{\n\t\t\t\t\t\tconst FVector OldVelocity = Velocity;\n\t\t\t\t\t\tif (bCouldStepUp)\n\t\t\t\t\t\t\tVelocity.Z = Velocity.Z + StepUpHitVelocity;\n\t\t\t\t\t\telse Velocity = Velocity - SavedHid.ImpactNormal * (SavedHid.ImpactNormal | Velocity) * 2;\n\n\t\t\t\t\t\tfloat RollStoredValue = SplineLocation.GetDirectionModifierFromVector(Velocity);\n\t\t\t\t\t\tSoOwner->OnBounce(false, RollStoredValue, SavedHid.ImpactPoint, SavedHid.ImpactNormal);\n\t\t\t\t\t\tif (Velocity.Z > KINDA_SMALL_NUMBER)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tSetMovementMode(EMovementMode::MOVE_Falling);\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// const FVector NewInVelocity = InVelocity - SavedHid.ImpactNormal * (SavedHid.ImpactNormal | InVelocity) * 2;\n\t\t\t\t\t\t// TODO: pray that it solves everything and doesn't ruin anything\n\t\t\t\t\t\t// UPDATE: I am not good at praying, we should hire some religious developers\n\n\t\t\t\t\t\tif (!bAlrearyRollHitThisFrame)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tbAlrearyRollHitThisFrame = true;\n\t\t\t\t\t\t\tMoveAlongFloor(-InVelocity, DeltaSeconds * (1.f - PercentTimeApplied), OutStepDownResult);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t// Don't recalculate velocity based on this height adjustment, if considering vertical adjustments.\n\t\t\t\t\tUE_LOG(LogCharacterMovement, Verbose, TEXT(\"+ StepUp (ImpactNormal %s, Normal %s\"), *Hit.ImpactNormal.ToString(), *Hit.Normal.ToString());\n\t\t\t\t\tbJustTeleported |= !bMaintainHorizontalGroundVelocity;\n\n\t\t\t\t\t// I guess StepUp did the movement after all\n\t\t\t\t\tSplineLocation += FMath::Sign(RestDistance) * (UpdatedComponent->GetComponentLocation() - LocationBeforeStepUp).Size2D();\n\t\t\t\t\t// UE_LOG(LogTemp, Warning, TEXT(\"Second if / true / false\"));\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (Hit.Component.IsValid() && !Hit.Component.Get()->CanCharacterStepUp(CharacterOwner))\n\t\t\t{\n\t\t\t\tHandleImpact(Hit, LastMoveTimeSlice, RampVector);\n\n\t\t\t\tfloat PercentDistanceApplied = SlideAlongSurface(Delta, 1.f - PercentTimeApplied, Hit.Normal, Hit, true);\n\t\t\t\tSplineLocation += RestDistance * PercentDistanceApplied;\n\n\t\t\t\t// static int i = 0;\n\t\t\t\t// ++i;\n\t\t\t\t// UE_LOG(LogTemp, Warning, TEXT(\"Second if / else %d\"), i);\n\n\t\t\t}\n\t\t}\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoCharacterMovementComponent::ResolvePenetrationImpl(const FVector& Adjustment, const FHitResult& Hit, const FQuat& NewRotation)\n{\n\tif (!SplineLocation.IsValid(false))\n\t\treturn Super::ResolvePenetrationImpl(Adjustment, Hit, NewRotation);\n\n\treturn  ResolvePenetrationOnSpline(Adjustment, Hit, NewRotation);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoCharacterMovementComponent::ResolvePenetrationOnSpline(const FVector& ProposedAdjustment, const FHitResult& Hit, const FQuat& NewRotationQuat)\n{\n\tDECLARE_SCOPE_CYCLE_COUNTER(TEXT(\"Movement - ResolvePenetrationOnSpline\"), STAT_Movement_ResolvePenetrationOnSpline, STATGROUP_SoCharacter);\n\n\t// SceneComponent can't be in penetration, so this function really only applies to PrimitiveComponent.\n\tconst FVector Adjustment = FVector::VectorPlaneProject(ProposedAdjustment, SplineLocation.GetPlaneNormal());\n\tif (Adjustment.IsZero() || !UpdatedPrimitive)\n\t\treturn false;\n\n\t// See if we can fit at the adjusted location without overlapping anything.\n\tAActor* ActorOwner = UpdatedComponent->GetOwner();\n\tif (!ActorOwner)\n\t\treturn false;\n\n\tUE_LOG(LogSoSplineSys, Verbose, TEXT(\"ResolvePenetration: %s.%s at location %s inside %s.%s at location %s by %.3f (netmode: %d)\"),\n\t\t   *ActorOwner->GetName(),\n\t\t   *UpdatedComponent->GetName(),\n\t\t   *UpdatedComponent->GetComponentLocation().ToString(),\n\t\t   *GetNameSafe(Hit.GetActor()),\n\t\t   *GetNameSafe(Hit.GetComponent()),\n\t\t   Hit.Component.IsValid() ? *Hit.GetComponent()->GetComponentLocation().ToString() : TEXT(\"<unknown>\"),\n\t\t   Hit.PenetrationDepth,\n\t\t   (uint32)GetNetMode());\n\n\t// We really want to make sure that precision differences or differences between the overlap test and sweep tests don't put us into another overlap,\n\t// so make the overlap test a bit more restrictive.\n\tconst float OverlapInflation = 0.1f;\n\tconst bool bEncroached = OverlapTest(Hit.TraceStart + Adjustment, NewRotationQuat, UpdatedPrimitive->GetCollisionObjectType(), UpdatedPrimitive->GetCollisionShape(OverlapInflation), ActorOwner);\n\tif (!bEncroached)\n\t{\n\t\t// Move without sweeping.\n\t\tMoveUpdatedComponent(Adjustment, NewRotationQuat, false, nullptr, ETeleportType::TeleportPhysics);\n\t\tSplineLocation += Adjustment.Size2D() * SplineLocation.GetDirectionModifierFromVector(Adjustment);\n\n\t\tUE_LOG(LogSoSplineSys, Verbose, TEXT(\"ResolvePenetration:   teleport by %s\"), *Adjustment.ToString());\n\t\treturn true;\n\t}\n\n\t// Disable MOVECOMP_NeverIgnoreBlockingOverlaps if it is enabled, otherwise we wouldn't be able to sweep out of the object to fix the penetration.\n\tTGuardValue<EMoveComponentFlags> ScopedFlagRestore(MoveComponentFlags, EMoveComponentFlags(MoveComponentFlags & (~MOVECOMP_NeverIgnoreBlockingOverlaps)));\n\n\t// Try sweeping as far as possible...\n\tFHitResult SweepOutHit(1.f);\n\tbool bMoved = MoveUpdatedComponent(Adjustment, NewRotationQuat, true, &SweepOutHit, ETeleportType::TeleportPhysics);\n\tif (bMoved)\n\t\tSplineLocation += Adjustment.Size2D() * SplineLocation.GetDirectionModifierFromVector(Adjustment) * SweepOutHit.Time;\n\n\tUE_LOG(LogSoSplineSys, Verbose, TEXT(\"ResolvePenetration:   sweep by %s (success = %d)\"), *Adjustment.ToString(), bMoved);\n\n\t// Still stuck?\n\tif (!bMoved && SweepOutHit.bStartPenetrating)\n\t{\n\t\t// Combine two MTD results to get a new direction that gets out of multiple surfaces.\n\t\tconst FVector SecondMTD = FVector::VectorPlaneProject(GetPenetrationAdjustment(SweepOutHit), SplineLocation.GetPlaneNormal());\n\t\tconst FVector CombinedMTD = Adjustment + SecondMTD;\n\t\tif (SecondMTD != Adjustment && !CombinedMTD.IsZero())\n\t\t{\n\t\t\tbMoved = MoveUpdatedComponent(CombinedMTD, NewRotationQuat, true, &SweepOutHit, ETeleportType::TeleportPhysics);\n\t\t\tif (bMoved)\n\t\t\t\tSplineLocation += CombinedMTD.Size2D() * SplineLocation.GetDirectionModifierFromVector(CombinedMTD) * SweepOutHit.Time;\n\t\t\tUE_LOG(LogSoSplineSys, Verbose, TEXT(\"ResolvePenetration:   sweep by %s (MTD combo success = %d)\"), *CombinedMTD.ToString(), bMoved);\n\t\t}\n\t}\n\n\t// Still stuck?\n\tif (!bMoved)\n\t{\n\t\t// Try moving the proposed adjustment plus the attempted move direction. This can sometimes get out of penetrations with multiple objects\n\t\tconst FVector MoveDelta = ConstrainDirectionToPlane(Hit.TraceEnd - Hit.TraceStart);\n\t\tif (!MoveDelta.IsZero())\n\t\t{\n\t\t\tconst FVector LastTryDelta = Adjustment + MoveDelta;\n\t\t\tbMoved = MoveUpdatedComponent(LastTryDelta, NewRotationQuat, true, &SweepOutHit, ETeleportType::TeleportPhysics);\n\t\t\tif (bMoved)\n\t\t\t\tSplineLocation += LastTryDelta.Size2D() * SplineLocation.GetDirectionModifierFromVector(LastTryDelta) * SweepOutHit.Time;\n\t\t\tUE_LOG(LogSoSplineSys, Verbose, TEXT(\"ResolvePenetration:   sweep by %s (adjusted attempt success = %d)\"), *(Adjustment + MoveDelta).ToString(), bMoved);\n\t\t}\n\t}\n\n\treturn bMoved;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoCharacterMovementComponent::ProcessLanded(const FHitResult& Hit, float remainingTime, int32 Iterations)\n{\n\tif (SoOwner->OnPreLanded(Hit))\n\t{\n\t\t// value modified to minimize horizontal movement after landing\n\t\t// BrakingFrictionFactor = 6.0f;\n\t\tUCharacterMovementComponent::ProcessLanded(Hit, remainingTime, Iterations);\n\t}\n\telse\n\t\tStartNewPhysics(remainingTime, Iterations);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFVector USoCharacterMovementComponent::ComputeSlideVector(const FVector& Delta, const float Time, const FVector& Normal, const FHitResult& Hit) const\n{\n\tFVector PlaneNormal = Delta.CrossProduct(Delta, FVector(0.f, 0.f, 1.f));\n\tPlaneNormal.Normalize();\n\tconst FVector ProjectedNormal = FVector::VectorPlaneProject(Normal, PlaneNormal).GetSafeNormal();\n\treturn Super::ComputeSlideVector(Delta, Time, ProjectedNormal, Hit);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoCharacterMovementComponent::PhysWalking(float deltaTime, int32 Iterations)\n{\n\tDECLARE_SCOPE_CYCLE_COUNTER(TEXT(\"Movement - PhysWalking\"), STAT_Movement_PhysWalking, STATGROUP_SoCharacter);\n\n\t//if (bControlledMovement)\n\t//\tPhysCustomForcedWalking(deltaTime, Iterations);\n\t//else\n\t{\n\t\tif (HasAnimRootMotion() && SoRootMotionDesc.bVerticalRootMotionEnabled)\n\t\t{\n\t\t\tif (Velocity.Z > KINDA_SMALL_NUMBER)\n\t\t\t{\n\t\t\t\tSetMovementMode(MOVE_Falling);\n\t\t\t\tStartNewPhysics(deltaTime, 0);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (!SoRootMotionDesc.bHorizontalRootMotionEnabled)\n\t\t\t{\n\t\t\t\tconst FVector OldVelocity = Velocity;\n\t\t\t\tMaintainHorizontalGroundVelocity();\n\t\t\t\tAcceleration.Z = 0.f;\n\t\t\t\t// autch\n\t\t\t\tRootMotionParams.bHasRootMotion = false;\n\t\t\t\tCalcVelocity(deltaTime, GroundFriction, false, BrakingDecelerationWalking);\n\t\t\t\tRootMotionParams.bHasRootMotion = true;\n\t\t\t\tcheckCode(ensureMsgf(!Velocity.ContainsNaN(), TEXT(\"PhysWalking: Velocity contains NaN after CalcVelocity (%s)\\n%s\"), *GetPathNameSafe(this), *Velocity.ToString()));\n\t\t\t\tVelocity.Z = OldVelocity.Z;\n\t\t\t}\n\t\t}\n\n\t\tUCharacterMovementComponent::PhysWalking(deltaTime, Iterations);\n\t}\n\n\t// Root Motion has been used, clear - cause animation should not ruin the rotation, that's why\n\tif (!bAllowRootMotionRotation)\n\t\tRootMotionParams.Clear();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoCharacterMovementComponent::PhysFalling(float deltaTime, int32 Iterations)\n{\n\tDECLARE_SCOPE_CYCLE_COUNTER(TEXT(\"Movement - PhysFalling\"), STAT_Movement_PhysFalling, STATGROUP_SoCharacter);\n\n\tif (SplineLocation.GetSpline() != nullptr)\n\t\tSplinePhysFalling(deltaTime, Iterations);\n\telse\n\t\tUCharacterMovementComponent::PhysFalling(deltaTime, Iterations);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoCharacterMovementComponent::PhysFlying(float deltaTime, int32 Iterations)\n{\n\tDECLARE_SCOPE_CYCLE_COUNTER(TEXT(\"Movement - PhysFlying\"), STAT_Movement_PhysFlying, STATGROUP_SoCharacter);\n\n\tif (SplineLocation.GetSpline() != nullptr)\n\t\tSplinePhysFlying(deltaTime, Iterations);\n\telse\n\t\tUCharacterMovementComponent::PhysFlying(deltaTime, Iterations);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoCharacterMovementComponent::PhysCustom(float deltaTime, int32 Iterations)\n{\n\tswitch (CustomMovementMode)\n\t{\n\t\tcase ECustomMovementMode::ECM_Swing:\n\t\t\tPhysCustomSwinging(deltaTime, Iterations);\n\t\t\tbreak;\n\n\t\t//case ECustomMovementMode::ECM_Controlled:\n\t\t//\tPhysControlledMovement(deltaTime, Iterations);\n\t\t//\tbreak;\n\n\t\tdefault:\n\t\t\tbreak;\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n//void USoCharacterMovementComponent::PhysCustomForcedWalking(float deltaTime, int32 Iterations)\n//{\n//\tif (deltaTime < MIN_TICK_TIME) { return; }\n//\n//\tfloat remainingTime = deltaTime;\n//\n//\t// Perform the move\n//\twhile ((remainingTime >= MIN_TICK_TIME) && (Iterations < MaxSimulationIterations) && CharacterOwner)\n//\t{\n//\t\tIterations++;\n//\t\tconst float timeTick = GetSimulationTimeStep(remainingTime, Iterations);\n//\t\tremainingTime -= timeTick;\n//\n//\t\t// Save current values\n//\t\tconst FVector OldLocation = UpdatedComponent->GetComponentLocation();\n//\n//\t\t// Ensure velocity is horizontal.\n//\t\tMaintainHorizontalGroundVelocity();\n//\t\tconst FVector OldVelocity = Velocity;\n//\t\tAcceleration.Z = 0.f;\n//\n//\t\t// Compute move parameters\n//\t\tconst FVector MoveVelocity = Velocity;\n//\t\tconst FVector Delta = timeTick * MoveVelocity;\n//\t\tconst bool bZeroDelta = Delta.IsNearlyZero();\n//\t\tFStepDownResult StepDownResult;\n//\n//\t\tconst FFindFloorResult OldFloor = CurrentFloor;\n//\t\tif (!CurrentFloor.IsWalkableFloor())\n//\t\t{\n//\t\t\tFindFloor(UpdatedComponent->GetComponentLocation(), CurrentFloor, bZeroDelta, NULL);\n//\t\t}\n//\n//\t\tif (bZeroDelta) remainingTime = 0.f;\n//\t\telse MoveAlongFloor(MoveVelocity, timeTick, &StepDownResult);\n//\n//\t\t// Update floor.\n//\t\t// StepUp might have already done it for us.\n//\t\tif (StepDownResult.bComputedFloor)\n//\t\t{\n//\t\t\tCurrentFloor = StepDownResult.FloorResult;\n//\t\t}\n//\t\telse\n//\t\t{\n//\t\t\tFindFloor(UpdatedComponent->GetComponentLocation(), CurrentFloor, bZeroDelta, NULL);\n//\t\t}\n//\n//\t\tbool bWalkableFloor = CurrentFloor.IsWalkableFloor();\n//\t\tif ( !bWalkableFloor || (bWalkableFloor && ShouldCatchAir(OldFloor, CurrentFloor)))\n//\t\t{\n//\t\t\tCharacterOwner->OnWalkingOffLedge(OldFloor.HitResult.ImpactNormal, OldFloor.HitResult.Normal, OldLocation, timeTick);\n//\t\t\tSetMovementMode(EMovementMode::MOVE_Falling);\n//\t\t\tStartFalling(Iterations, remainingTime, timeTick, Delta, OldLocation);\n//\t\t\treturn;\n//\t\t}\n//\n//\t\t// Make velocity reflect actual move\n//\t\tif (timeTick >= MIN_TICK_TIME)\n//\t\t{\n//\t\t\tVelocity = (UpdatedComponent->GetComponentLocation() - OldLocation) / timeTick;\n//\t\t}\n//\n//\t\t// If we didn't move at all this iteration then abort (since future iterations will also be stuck).\n//\t\tif (UpdatedComponent->GetComponentLocation() == OldLocation)\n//\t\t{\n//\t\t\tremainingTime = 0.f;\n//\t\t\tbreak;\n//\t\t}\n//\t}\n//}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoCharacterMovementComponent::PhysCustomSwinging(float deltaTime, int32 Iterations)\n{\n\tDECLARE_SCOPE_CYCLE_COUNTER(TEXT(\"Movement - PhysCustomSwinging\"), STAT_Movement_PhysCustomSwinging, STATGROUP_SoCharacter);\n\n\tif (deltaTime < MIN_TICK_TIME) { return; }\n\n\tfloat remainingTime = deltaTime;\n\n\t// Perform the move\n\twhile ((remainingTime >= MIN_TICK_TIME) && (Iterations < MaxSimulationIterations) && CharacterOwner)\n\t{\n\t\tIterations++;\n\t\tconst float timeTick = GetSimulationTimeStep(remainingTime, Iterations);\n\t\tremainingTime -= timeTick;\n\n\t\t// Save current values\n\t\tconst FVector OldLocation = UpdatedComponent->GetComponentLocation();\n\n\t\t// calculate acceleration\n\t\tconst FVector SwingCenterToCharacter = OldLocation - SwingCenter;\n\t\tconst float SwingArm = FMath::Clamp(SwingCenterToCharacter.Size() + SwingArmDelta, SwingArmMin, SwingArmMax);\n\t\tSwingArmDelta = 0.0f;\n\n\t\tFVector2D Direction2D = FVector2D(SplineLocation.GetDirection());\n\n\t\t// calculate Acceleration and set the direction to match the spline's\n\t\tDirection2D.Normalize();\n\t\tconst FVector Gravity(0.f, 0.f, GetGravityZ());\n\t\tFVector SwingAcceleration = (Gravity - Gravity.ProjectOnTo(SwingCenterToCharacter));\n\n\t\t// user tried to move\n\t\tif (SwingInput.Size2D() > 0)\n\t\t{\n\t\t\t// user input is added only if the angle between Gravity and (CharacterLocation - SwingCenter) is small enough\n\t\t\tif (((Gravity - SwingAcceleration).GetSafeNormal() | Gravity.GetSafeNormal()) > 0.7f)\n\t\t\t\tSwingAcceleration += SwingAcceleration.GetSafeNormal() * ((FVector2D(SwingInput) | FVector2D(SwingAcceleration)) > 0.f ? 1.f : -1.f) * SwingInputForce;\n\t\t}\n\n\t\tint32 DirModifier = (Direction2D | FVector2D(SwingAcceleration)) > 0.f ? 1 : -1;\n\t\tFVector2D SwingAccel2D = Direction2D * DirModifier * SwingAcceleration.Size2D();\n\t\tSwingAcceleration.X = SwingAccel2D.X;\n\t\tSwingAcceleration.Y = SwingAccel2D.Y;\n\n\t\t// update velocity\n\t\tVelocity += SwingAcceleration * timeTick;\n\n\t\t// align velocity\n\t\tDirModifier = (Direction2D | FVector2D(Velocity)) > 0.f ? 1 : -1;\n\t\tconst FVector2D SwingVelocity = Direction2D * DirModifier * Velocity.Size2D();\n\t\tVelocity.X = SwingVelocity.X;\n\t\tVelocity.Y = SwingVelocity.Y;\n\n\t\tif (Velocity.Size2D() > KINDA_SMALL_NUMBER)\n\t\t{\n\t\t\tbIsSwingForward = (GetOwner()->GetActorForwardVector() | Velocity.GetSafeNormal()) > 0;\n\t\t\tif (GetOwner()->GetActorLocation().Z > SwingCenter.Z)\n\t\t\t\tbIsSwingForward = !bIsSwingForward;\n\t\t}\n\n\n\t\t// DEBUG\n\t\t//FVector LinkEnd = OldLocation + SwingAcceleration;\n\t\t//DrawDebugLine(GetWorld(), OldLocation, LinkEnd, FColor(255, 0, 0), false, -1, 0, 12.333);\n\t\t//\n\t\t//LinkEnd = OldLocation + Velocity;\n\t\t//DrawDebugLine(GetWorld(), OldLocation, LinkEnd, FColor(0, 0, 255), false, -1, 0, 12.333);\n\n\t\tFVector PointWithoutRope = OldLocation + Velocity * timeTick;\n\t\tFVector NewLocation = SwingCenter + (PointWithoutRope - SwingCenter).GetSafeNormal() * SwingArm;\n\n\t\tconst FVector Delta = NewLocation - OldLocation;\n\t\tDirModifier = (Direction2D | FVector2D(Delta)) > 0.f ? 1 : -1;\n\n\t\tFSoSplinePoint OldSplinePoint = SplineLocation;\n\t\tSplineLocation += (Delta.Size2D() * DirModifier);\n\n\t\tFHitResult Hit;\n\t\tUpdatedComponent->SetWorldLocation(NewLocation, true, &Hit);\n\n\t\tif (Hit.IsValidBlockingHit())\n\t\t{\n\t\t\tSplineLocation = OldSplinePoint + Delta.Size2D() * DirModifier * Hit.Time;\n\t\t}\n\n\t\t// Make velocity reflect actual move\n\t\tif (timeTick >= MIN_TICK_TIME)\n\t\t{\n\t\t\tVelocity = (UpdatedComponent->GetComponentLocation() - OldLocation) / timeTick;\n\t\t}\n\n\t\t// If we didn't move at all this iteration then abort (since future iterations will also be stuck).\n\t\tif (UpdatedComponent->GetComponentLocation() == OldLocation)\n\t\t{\n\t\t\tremainingTime = 0.f;\n\t\t\tbreak;\n\t\t}\n\t}\n}\n\n// Old offset based controlled movement\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n//void USoCharacterMovementComponent::PhysControlledMovement(float deltaTime, int32 Iterations)\n//{\n//\tif (deltaTime < MIN_TICK_TIME) { return; }\n//\n//\tfloat remainingTime = deltaTime;\n//\n//\tconst FVector OldLocation = GetActorLocation();\n//\tfloat RestTime = 0.f;\n//\t// Perform the move\n//\twhile ((remainingTime >= MIN_TICK_TIME) && (Iterations < MaxSimulationIterations) && CharacterOwner)\n//\t{\n//\t\tIterations++;\n//\t\tconst float timeTick = GetSimulationTimeStep(remainingTime, Iterations);\n//\t\tremainingTime -= timeTick;\n//\n//\t\tconst float BeforeTime = ControlledMovementDesc.CurrentTime;\n//\t\tfloat AfterTime = BeforeTime + timeTick;\n//\n//\t\tif (AfterTime > ControlledMovementDesc.Duration)\n//\t\t{\n//\t\t\tRestTime = AfterTime - ControlledMovementDesc.Duration;\n//\t\t\tbControlledMovement = false;\n//\t\t\tAfterTime = ControlledMovementDesc.Duration;\n//\t\t}\n//\t\tControlledMovementDesc.CurrentTime = AfterTime;\n//\n//\t\t// recalculate velocity\n//\t\tconst float BeforePercent = BeforeTime / ControlledMovementDesc.Duration;\n//\t\tconst float AfterPercent = AfterTime / ControlledMovementDesc.Duration;\n//\n//\t\tfloat BeforeXDelta = ControlledMovementDesc.BaseOffset.X;\n//\t\tif (ControlledMovementDesc.XCurve)\n//\t\t\tBeforeXDelta *= ControlledMovementDesc.XCurve->GetFloatValue(BeforePercent);\n//\n//\t\tfloat AfterXDelta = ControlledMovementDesc.BaseOffset.X;\n//\t\tif (ControlledMovementDesc.XCurve)\n//\t\t\tAfterXDelta *= ControlledMovementDesc.XCurve->GetFloatValue(AfterPercent);\n//\n//\t\tfloat BeforeZDelta = ControlledMovementDesc.BaseOffset.Y;\n//\t\tif (ControlledMovementDesc.ZCurve)\n//\t\t\tBeforeZDelta *= ControlledMovementDesc.ZCurve->GetFloatValue(BeforePercent);\n//\n//\t\tfloat AfterZDelta = ControlledMovementDesc.BaseOffset.Y;\n//\t\tif (ControlledMovementDesc.ZCurve)\n//\t\t\tAfterZDelta *= ControlledMovementDesc.ZCurve->GetFloatValue(AfterPercent);\n//\n//\t\tconst int DirModifier = (FVector2D(SplineLocation.GetDirection()) | FVector2D(GetOwner()->GetActorForwardVector())) > 0 ? 1 : -1;\n//\t\tconst float DeltaZ = AfterZDelta - BeforeZDelta;\n//\t\tconst float DeltaX = (AfterXDelta - BeforeXDelta) * DirModifier;\n//\n//\t\tif (fabs(DeltaX) < KINDA_SMALL_NUMBER && fabs(DeltaZ) < KINDA_SMALL_NUMBER)\n//\t\t\tcontinue;\n//\n//\t\tFVector Delta = FVector(SplineLocation + DeltaX) - FVector(SplineLocation);\n//\t\tDelta.Z = DeltaZ;\n//\n//\t\tFHitResult Hit(1.f);\n//\t\tSafeMoveUpdatedComponent(Delta, UpdatedComponent->GetComponentQuat(), true, Hit);\n//\t\tfloat MovedPercent = 1.0f;\n//\t\tif (Hit.bBlockingHit)\n//\t\t\tMovedPercent = Hit.Time;\n//\t\tSplineLocation += DeltaX * MovedPercent;\n//\t}\n//\n//\tconst FVector Location = GetActorLocation();\n//\n//\tif (deltaTime > KINDA_SMALL_NUMBER)\n//\t\tVelocity = (Location - OldLocation) / deltaTime;\n//\n//\tif (!bControlledMovement)\n//\t{\n//\t\tFindFloor(UpdatedComponent->GetComponentLocation(), CurrentFloor, false, NULL);\n//\n//\t\tif (CurrentFloor.IsWalkableFloor())\n//\t\t\tSetMovementMode(EMovementMode::MOVE_Walking);\n//\t\telse\n//\t\t{\n//\t\t\tSetMovementMode(EMovementMode::MOVE_Falling);\n//\t\t\tStartFalling(Iterations, RestTime, deltaTime, Location - OldLocation, OldLocation);\n//\t\t}\n//\n//\t\tControlledMovementDesc = FSoControlledMovementDesc();\n//\t}\n//}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoCharacterMovementComponent::SplinePhysFlying(float deltaTime, int32 Iterations)\n{\n\tDECLARE_SCOPE_CYCLE_COUNTER(TEXT(\"Movement - SplinePhysFlying\"), STAT_Movement_SplinePhysFlying, STATGROUP_SoCharacter);\n\n\tif (deltaTime < MIN_TICK_TIME)\n\t\treturn;\n\n\tRestorePreAdditiveRootMotionVelocity();\n\n\tif (!HasAnimRootMotion() && !CurrentRootMotion.HasOverrideVelocity())\n\t\tCalcVelocity(deltaTime, GroundFriction, false, GetMaxBrakingDeceleration());\n\n\tApplyRootMotionToVelocity(deltaTime);\n\n\tIterations++;\n\tbJustTeleported = false;\n\n\tif (Velocity.IsNearlyZero())\n\t{\n\t\treturn;\n\t}\n\n\t// Move\n\tFHitResult Hit(1.f);\n\tconst FVector OldLocation = UpdatedComponent->GetComponentLocation();\n\tconst FSoSplinePoint OldSplineLocation = SplineLocation;\n\n\t{\n\t\tconst int32 DirModifier = (FVector2D(SplineLocation.GetDirection()) | FVector2D(Velocity)) > 0.f ? 1 : -1;\n\t\tconst float DeltaMovement = Velocity.Size2D() * deltaTime * DirModifier;\n\t\tSplineLocation += DeltaMovement;\n\t}\n\n\tFVector NewPos = SplineLocation;\n\tNewPos.Z = OldLocation.Z + Velocity.Z * deltaTime;\n\tconst FVector Adjusted = NewPos - OldLocation;\n\n\tSafeMoveUpdatedComponent(Adjusted, UpdatedComponent->GetComponentQuat(), true, Hit);\n\n\tif (Hit.Time < 1.f)\n\t{\n\t\tconst FVector GravDir = FVector(0.f, 0.f, -1.f);\n\t\tconst FVector VelDir = Velocity.GetSafeNormal();\n\t\tconst float UpDown = GravDir | VelDir;\n\n\t\t//bool bSteppedUp = false;\n\t\t//if ((FMath::Abs(Hit.ImpactNormal.Z) < 0.2f) && (UpDown < 0.5f) && (UpDown > -0.2f) && CanStepUp(Hit))\n\t\t//{\n\t\t//\tfloat stepZ = UpdatedComponent->GetComponentLocation().Z;\n\t\t//\tbSteppedUp = StepUp(GravDir, Adjusted * (1.f - Hit.Time), Hit);\n\t\t//\tif (bSteppedUp)\n\t\t//\t{\n\t\t//\t\tOldLocation.Z = UpdatedComponent->GetComponentLocation().Z + (OldLocation.Z - stepZ);\n\t\t//\t}\n\t\t//}\n\t\t//\n\t\t//if (!bSteppedUp)\n\t\t{\n\t\t\t//adjust and try again\n\t\t\tHandleImpact(Hit, deltaTime, Adjusted);\n\t\t\tconst float PercentDistanceApplied = SlideAlongSurface(Adjusted, (1.f - Hit.Time), Hit.Normal, Hit, true);\n\t\t\tSplineLocation = OldSplineLocation + (SplineLocation - OldSplineLocation) * PercentDistanceApplied;\n\t\t}\n\t}\n\n\t//if (!bJustTeleported && !HasAnimRootMotion() && !CurrentRootMotion.HasOverrideVelocity())\n\t//{\n\t//\tVelocity = (UpdatedComponent->GetComponentLocation() - OldLocation) / deltaTime;\n\t//}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoCharacterMovementComponent::SplinePhysFalling(float deltaTime, int32 Iterations)\n{\n\tDECLARE_SCOPE_CYCLE_COUNTER(TEXT(\"Movement - SplinePhysFalling\"), STAT_Movement_SplinePhysFalling, STATGROUP_SoCharacter);\n\n\tif (deltaTime < MIN_TICK_TIME)\n\t{\n\t\treturn;\n\t}\n\n\tFVector FallAcceleration = GetFallingLateralAcceleration(deltaTime);\n\tFallAcceleration.Z = 0.f;\n\tconst bool bHasAirControl = (FallAcceleration.SizeSquared2D() > 0.f);\n\n\tfloat remainingTime = deltaTime;\n\twhile ((remainingTime >= MIN_TICK_TIME) && (Iterations < MaxSimulationIterations))\n\t{\n\t\tIterations++;\n\t\tconst float timeTick = GetSimulationTimeStep(remainingTime, Iterations);\n\t\tremainingTime -= timeTick;\n\n\t\tconst FVector OldLocation = UpdatedComponent->GetComponentLocation();\n\t\tconst FQuat PawnRotation = UpdatedComponent->GetComponentQuat();\n\t\tbJustTeleported = false;\n\n\t\tFVector OldVelocity = Velocity;\n\t\tFVector VelocityNoAirControl = Velocity;\n\n\t\t// Apply input\n\n\t\t// Compute VelocityNoAirControl\n\t\tif (bHasAirControl)\n\t\t{\n\t\t\t// Find velocity *without* acceleration.\n\t\t\tTGuardValue<FVector> RestoreAcceleration(Acceleration, FVector::ZeroVector);\n\t\t\tTGuardValue<FVector> RestoreVelocity(Velocity, Velocity);\n\t\t\tVelocity.Z = 0.f;\n\t\t\tconst bool bWayTooFast = bSlowDownToMaxWalkSpeedInFall && Velocity.Size2D() > MaxWalkSpeed;\n\t\t\t// const bool bWayTooFast = false;\n\t\t\tCalcVelocity(timeTick, FallingLateralFriction, false, bWayTooFast ? BrakingDecelerationFallingOverMaxWalkSpeed : BrakingDecelerationFalling);\n\t\t\tVelocityNoAirControl = FVector(Velocity.X, Velocity.Y, OldVelocity.Z);\n\t\t}\n\n\t\t// Compute Velocity\n\t\t{\n\t\t\t// Acceleration = FallAcceleration for CalcVelocity(), but we restore it after using it.\n\t\t\tTGuardValue<FVector> RestoreAcceleration(Acceleration, FallAcceleration);\n\t\t\tVelocity.Z = 0.f;\n\t\t\t// oh well...\n\t\t\tconst bool bSavedHasRootMotion = RootMotionParams.bHasRootMotion;\n\t\t\tRootMotionParams.bHasRootMotion = false;\n\t\t\t//const bool bWayTooFast = false;\n\t\t\tconst bool bWayTooFast = bSlowDownToMaxWalkSpeedInFall && Velocity.Size2D() > MaxWalkSpeed;\n\t\t\tCalcVelocity(timeTick, FallingLateralFriction, false, bWayTooFast ? BrakingDecelerationFallingOverMaxWalkSpeed : BrakingDecelerationFalling);\n\t\t\tRootMotionParams.bHasRootMotion = bSavedHasRootMotion;\n\t\t\tVelocity.Z = OldVelocity.Z;\n\t\t}\n\n\t\t// Just copy Velocity to VelocityNoAirControl if they are the same (ie no acceleration).\n\t\tif (!bHasAirControl)\n\t\t{\n\t\t\tVelocityNoAirControl = Velocity;\n\t\t}\n\n\t\t// force velocity to follow the spline\n\t\t{\n\t\t\tFVector Direction = SplineLocation.GetDirection();\n\t\t\tDirection.Z = 0;\n\t\t\tDirection.Normalize();\n\n\t\t\tif ((FVector2D(Direction) | FVector2D(Velocity)) <= 0)\n\t\t\t{\n\t\t\t\tDirection *= -1;\n\t\t\t}\n\n\t\t\tFVector2D Velocity2D = FVector2D(Direction.X, Direction.Y) * Velocity.Size2D();\n\t\t\tVelocity = FVector(Velocity2D.X, Velocity2D.Y, Velocity.Z);\n\n\t\t\tFVector2D VelocityNoAirControl2D = FVector2D(Direction.X, Direction.Y) * VelocityNoAirControl.Size2D();\n\t\t\tVelocityNoAirControl = FVector(VelocityNoAirControl2D.X, VelocityNoAirControl2D.Y, VelocityNoAirControl.Z);\n\t\t}\n\n\t\tif (!HasAnimRootMotion() || !SoRootMotionDesc.bVerticalRootMotionEnabled)\n\t\t{\n\t\t\t// Apply gravity\n\t\t\tif (bFallVelocityOverride)\n\t\t\t{\n\t\t\t\tVelocity.Z = FallVelocityOverrideValue;\n\t\t\t\tVelocityNoAirControl.Z = FallVelocityOverrideValue;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tconst FVector Gravity(0.f, 0.f, GetGravityZ());\n\t\t\t\tVelocity = NewFallVelocity(Velocity, Gravity, timeTick);\n\t\t\t\tVelocityNoAirControl = NewFallVelocity(VelocityNoAirControl, Gravity, timeTick);\n\t\t\t}\n\t\t}\n\n\t\tconst FVector AirControlAccel = (Velocity - VelocityNoAirControl) / timeTick;\n\n\t\tif (bNotifyApex && CharacterOwner->Controller && (Velocity.Z <= 0.f))\n\t\t{\n\t\t\t// Just passed jump apex since now going down\n\t\t\tbNotifyApex = false;\n\t\t\tNotifyJumpApex();\n\t\t}\n\n\n\t\t// Move\n\t\tFHitResult Hit(1.f);\n\t\tconst FVector TempVelocity = (OldVelocity + Velocity) * 0.5f;\n\t\tint32 DirModifier = (FVector2D(SplineLocation.GetDirection()) | FVector2D(TempVelocity)) > 0.f ? 1 : -1;\n\t\tconst float DeltaMovement = TempVelocity.Size2D() * timeTick * DirModifier;\n\n\t\tFVector NewPos = (SplineLocation + DeltaMovement);\n\t\tNewPos.Z = OldLocation.Z + 0.5f * (OldVelocity.Z + Velocity.Z) * timeTick;\n\t\tFVector Adjusted = NewPos - OldLocation;\n\t\t// WARNING: SplineLocation might change during this call!!!\n\t\tSafeMoveUpdatedComponent(Adjusted, PawnRotation, true, Hit);\n\n\t\tif (!HasValidData())\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\tfloat LastMoveTimeSlice = timeTick;\n\t\tfloat subTimeTickRemaining = timeTick * (1.f - Hit.Time);\n\n\t\tif (IsSwimming()) //just entered water\n\t\t{\n\t\t\tSplineLocation = SplineLocation + (DeltaMovement) * Hit.Time;\n\n\t\t\tremainingTime += subTimeTickRemaining;\n\t\t\tStartSwimming(OldLocation, OldVelocity, timeTick, remainingTime, Iterations);\n\t\t\treturn;\n\t\t}\n\n\t\tif (!Hit.bBlockingHit)\n\t\t{\n\t\t\tSplineLocation += DeltaMovement;\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// DrawDebugLine(SoOwner->GetWorld(), OldLocation, OldLocation + Adjusted.GetSafeNormal() * 500, FColor::Blue);\n\n   \t\t\tSplineLocation = SplineLocation + DeltaMovement * Hit.Time;\n\n\t\t\tif (IsValidLandingSpot(UpdatedComponent->GetComponentLocation(), Hit))\n\t\t\t{\n\t\t\t\tremainingTime += subTimeTickRemaining;\n\t\t\t\tProcessLanded(Hit, remainingTime, Iterations);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Compute impact deflection based on final velocity, not integration step.\n\t\t\t// This allows us to compute a new velocity from the deflected vector, and ensures the full gravity effect is included in the slide result.\n\t\t\tAdjusted = Velocity * timeTick;\n\n\t\t\t// See if we can convert a normally invalid landing spot (based on the hit result) to a usable one.\n\t\t\tif (!Hit.bStartPenetrating && ShouldCheckForValidLandingSpot(timeTick, Adjusted, Hit))\n\t\t\t{\n\t\t\t\tconst FVector PawnLocation = UpdatedComponent->GetComponentLocation();\n\t\t\t\tFFindFloorResult FloorResult;\n\t\t\t\tFindFloor(PawnLocation, FloorResult, false);\n\t\t\t\tif (FloorResult.IsWalkableFloor() && IsValidLandingSpot(PawnLocation, FloorResult.HitResult))\n\t\t\t\t{\n\t\t\t\t\tremainingTime += subTimeTickRemaining;\n\t\t\t\t\tProcessLanded(FloorResult.HitResult, remainingTime, Iterations);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst FVector VelocityBeforeRoll = Velocity;\n\t\t\tfloat StepUpHitVelocity = 0.0f;\n\t\t\tfloat DefaultBounce = 0.0f;\n\t\t\tbool bParallel = false;\n\t\t\tif (SoOwner->ShouldBounceOnHit(StepUpHitVelocity, DefaultBounce, &Hit))\n\t\t\t{\n\t\t\t\tif (UPrimitiveComponent* Component = Hit.GetComponent())\n\t\t\t\t{\n\t\t\t\t\tstatic FName ApplyForceTag = FName(\"ApplyForce\");\n\t\t\t\t\tif (Component->ComponentHasTag(ApplyForceTag))\n\t\t\t\t\t{\n\t\t\t\t\t\tISoSimulated::Execute_OnPlayerBounce(Hit.GetActor(), Velocity, Hit);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tconst FVector ProjectedHitNormal = USoMathHelper::GetProjectedNormal(Velocity, Hit.ImpactNormal);\n\n\t\t\t\t// DrawDebugLine(SoOwner->GetWorld(), Hit.ImpactPoint, Hit.ImpactPoint + ProjectedHitNormal.GetSafeNormal() * 500, FColor::Green, false, 1.0f);\n\n\t\t\t\tconst FVector VecNormal = Velocity.GetSafeNormal();\n\t\t\t\t// UE_LOG(LogTemp, Warning, TEXT(\"CosAlpha: %f\"), CosAlpha);\n\t\t\t\tbool bWallJump = false;\n\n\t\t\t\t// no wall jump from e.g. ceiling\n\t\t\t\tconst float CosAWithZ = ProjectedHitNormal | FVector(0.0f, 0.0f, -1.0f);\n\t\t\t\tconst bool bMightWallJump = !bWallJumpedThisFrame && (CosAWithZ < 0.5f);\n\n\t\t\t\tFVector WallJumpVelocity = ProjectedHitNormal.GetSafeNormal2D() * 200.0f;\n\t\t\t\tWallJumpVelocity.Z = 950;\n\n\t\t\t\tif (bMightWallJump && SoOwner->CanPerformWallJump(Hit))\n\t\t\t\t{\n\t\t\t\t\tbWallJump = true;\n\t\t\t\t\tVelocity = WallJumpVelocity;\n\t\t\t\t\tbWallJumpedThisFrame = true;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t// just bouncing\n\t\t\t\t\tfloat CosAlpha = ProjectedHitNormal | VecNormal;\n\t\t\t\t\tbParallel = fabs(CosAlpha) + KINDA_SMALL_NUMBER > 1.0f;\n\t\t\t\t\tVelocity = (!bParallel) ? (Velocity - ProjectedHitNormal * (ProjectedHitNormal | Velocity) * 2) : -Velocity;\n\t\t\t\t\tVelocity *= DefaultBounce;\n\n\t\t\t\t\tif (bMightWallJump)\n\t\t\t\t\t{\n\t\t\t\t\t\tMissedWallJumpTime = GetWorld()->GetTimeSeconds();\n\t\t\t\t\t\tMissedWallJumpVelocity = WallJumpVelocity;\n\t\t\t\t\t\tMissedImpactPointOffset = Hit.ImpactPoint - UpdatedComponent->GetComponentLocation();\n\t\t\t\t\t\tMissedImpactNormal = Hit.ImpactNormal;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tAcceleration.X = 0.f;\n\t\t\t\tAcceleration.Y = 0.f;\n\n\t\t\t\tfloat RollStoredValue = (!bParallel) && (CosAWithZ < 0.5f) ? ((FVector2D(SplineLocation.GetDirection()) | FVector2D(Velocity)) > 0.f ? 1 : -1)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t   : 0.f;\n\n\t\t\t\tif (CosAWithZ > 0.5f)\n\t\t\t\t\tRollStoredValue = 0.0f;\n\t\t\t\tMissedRollStoredValue = RollStoredValue;\n\n\t\t\t\tSoOwner->OnBounce(bWallJump, RollStoredValue, Hit.ImpactPoint, Hit.ImpactNormal);\n\n\t\t\t\t// DrawDebugLine(SoOwner->GetWorld(), SoOwner->GetActorLocation(), SoOwner->GetActorLocation() + Velocity.GetSafeNormal() * 500, FColor::Blue, false, 1.0f);\n\t\t\t\t// static int i = 0;\n\t\t\t\t// ++i;\n\t\t\t\t// UE_LOG(LogTemp, Warning, TEXT(\"Roll dir: %d\"), i);\n\n\t\t\t\tremainingTime += subTimeTickRemaining;\n\t\t\t\tSplinePhysFalling(remainingTime, Iterations);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tHandleImpact(Hit, LastMoveTimeSlice, Adjusted);\n\n\t\t\t// If we've changed physics mode, abort.\n\t\t\tif (!HasValidData() || !IsFalling())\n\t\t\t{\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Limit air control based on what we hit.\n\t\t\t// We moved to the impact point using air control, but may want to deflect from there based on a limited air control acceleration.\n\t\t\tif (bHasAirControl)\n\t\t\t{\n\t\t\t\tconst bool bCheckLandingSpot = false; // we already checked above.\n\t\t\t\tconst FVector AirControlDeltaV = LimitAirControl(LastMoveTimeSlice, AirControlAccel, Hit, bCheckLandingSpot) * LastMoveTimeSlice;\n\t\t\t\tAdjusted = (VelocityNoAirControl + AirControlDeltaV) * LastMoveTimeSlice;\n\t\t\t}\n\n\t\t\tconst FVector OldHitNormal = USoMathHelper::GetProjectedNormal(VelocityBeforeRoll, Hit.Normal);\n\t\t\tconst FVector OldHitImpactNormal = USoMathHelper::GetProjectedNormal(VelocityBeforeRoll, Hit.ImpactNormal);\n\t\t\tFVector Delta = ComputeSlideVector(Adjusted, 1.f - Hit.Time, OldHitNormal, Hit);\n\n\t\t\t// Compute velocity after deflection (only gravity component for RootMotion)\n\t\t\tif (subTimeTickRemaining > KINDA_SMALL_NUMBER && !bJustTeleported)\n\t\t\t{\n\t\t\t\tVelocity = (Delta / subTimeTickRemaining);\n\t\t\t}\n\n\t\t\tif (subTimeTickRemaining > KINDA_SMALL_NUMBER && (Delta | Adjusted) > 0.f)\n\t\t\t{\n\t\t\t\t// UE_LOG(LogTemp, Warning, TEXT(\"Spline Location DELTA: %f %f %f\"), Delta.GetSafeNormal().X, Delta.GetSafeNormal().Y, Delta.GetSafeNormal().Z);\n\t\t\t\t// UE_LOG(LogTemp, Warning, TEXT(\"Spline Location ADJUSTED: %f %f %f\"), Adjusted.GetSafeNormal().X, Adjusted.GetSafeNormal().Y, Adjusted.GetSafeNormal().Z);\n\n\t\t\t\t// Move in deflected direction.\n\t\t\t\tSafeMoveUpdatedComponent(Delta, PawnRotation, true, Hit);\n\n\t\t\t\tDirModifier = (FVector2D(SplineLocation.GetDirection()) | FVector2D(Delta)) > 0.f ? 1 : -1;\n\t\t\t\tFSoSplinePoint OldSplineLocation = SplineLocation;\n\t\t\t\tSplineLocation += Delta.Size2D() * DirModifier; /** (bMoveForwardOnSpline ? 1.f : -1.f)*/;\n\n\t\t\t\tif (Hit.bBlockingHit)\n\t\t\t\t{\n\t\t\t\t\t// hit second wall\n\t\t\t\t\tLastMoveTimeSlice = subTimeTickRemaining;\n\t\t\t\t\tsubTimeTickRemaining = subTimeTickRemaining * (1.f - Hit.Time);\n\n\t\t\t\t\tSplineLocation = OldSplineLocation + (SplineLocation - OldSplineLocation) * Hit.Time;\n\n\t\t\t\t\tif (IsValidLandingSpot(UpdatedComponent->GetComponentLocation(), Hit))\n\t\t\t\t\t{\n\t\t\t\t\t\tremainingTime += subTimeTickRemaining;\n\t\t\t\t\t\tProcessLanded(Hit, remainingTime, Iterations);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tHandleImpact(Hit, LastMoveTimeSlice, Delta);\n\n\t\t\t\t\t// If we've changed physics mode, abort.\n\t\t\t\t\tif (!HasValidData() || !IsFalling())\n\t\t\t\t\t{\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Act as if there was no air control on the last move when computing new deflection.\n\t\t\t\t\tif (bHasAirControl && Hit.Normal.Z > VERTICAL_SLOPE_NORMAL_Z)\n\t\t\t\t\t{\n\t\t\t\t\t\tconst FVector LastMoveNoAirControl = VelocityNoAirControl * LastMoveTimeSlice;\n\t\t\t\t\t\tDelta = ComputeSlideVector(LastMoveNoAirControl, 1.f, OldHitNormal, Hit);\n\t\t\t\t\t}\n\n\t\t\t\t\tFVector PreTwoWallDelta = Delta;\n\t\t\t\t\tTwoWallAdjust(Delta, Hit, OldHitNormal);\n\n\t\t\t\t\t// Limit air control, but allow a slide along the second wall.\n\t\t\t\t\tif (bHasAirControl)\n\t\t\t\t\t{\n\t\t\t\t\t\tconst bool bCheckLandingSpot = false; // we already checked above.\n\t\t\t\t\t\tconst FVector AirControlDeltaV = LimitAirControl(subTimeTickRemaining, AirControlAccel, Hit, bCheckLandingSpot) * subTimeTickRemaining;\n\n\t\t\t\t\t\t// Only allow if not back in to first wall\n\t\t\t\t\t\tif (FVector::DotProduct(AirControlDeltaV, OldHitNormal) > 0.f)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tDelta += (AirControlDeltaV * subTimeTickRemaining);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Compute velocity after deflection (only gravity component for RootMotion)\n\t\t\t\t\tif (subTimeTickRemaining > KINDA_SMALL_NUMBER && !bJustTeleported)\n\t\t\t\t\t{\n\t\t\t\t\t\tVelocity = Delta / subTimeTickRemaining;\n\t\t\t\t\t}\n\n\t\t\t\t\tconst FVector NewImpactNormal = USoMathHelper::GetProjectedNormal(Delta, Hit.ImpactNormal);\n\n\t\t\t\t\t// bDitch=true means that pawn is straddling two slopes, neither of which he can stand on\n\t\t\t\t\tbool bDitch = ((OldHitImpactNormal.Z > 0.f) && (NewImpactNormal.Z > 0.f) && (FMath::Abs(Delta.Z) <= KINDA_SMALL_NUMBER) && ((NewImpactNormal | OldHitImpactNormal) < 0.f));\n\t\t\t\t\tSafeMoveUpdatedComponent(Delta, PawnRotation, true, Hit);\n\n\t\t\t\t\tDirModifier = (FVector2D(SplineLocation.GetDirection()) | FVector2D(Delta)) > 0.f ? 1 : -1;\n\t\t\t\t\tOldSplineLocation = SplineLocation;\n\t\t\t\t\tSplineLocation += Delta.Size2D() * DirModifier;\n\n\t\t\t\t\tif (Hit.Time == 0.f)\n\t\t\t\t\t{\n\t\t\t\t\t\tSplineLocation = OldSplineLocation;\n\n\t\t\t\t\t\t// if we are stuck then try to side step\n\t\t\t\t\t\tFVector SideDelta = (OldHitNormal + NewImpactNormal).GetSafeNormal2D();\n\t\t\t\t\t\tif (SideDelta.IsNearlyZero())\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tSideDelta = FVector(OldHitNormal.Y, -OldHitNormal.X, 0).GetSafeNormal();\n\t\t\t\t\t\t}\n\t\t\t\t\t\tSafeMoveUpdatedComponent(SideDelta, PawnRotation, true, Hit);\n\n\t\t\t\t\t\tDirModifier = (FVector2D(SplineLocation.GetDirection()) | FVector2D(SideDelta)) > 0.f ? 1 : -1;\n\t\t\t\t\t\tSplineLocation += SideDelta.Size2D() * DirModifier * (Hit.bBlockingHit ? Hit.Time : 1.f);\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif (bDitch || IsValidLandingSpot(UpdatedComponent->GetComponentLocation(), Hit) || Hit.Time == 0.f)\n\t\t\t\t\t{\n\t\t\t\t\t\tremainingTime = 0.f;\n\t\t\t\t\t\tProcessLanded(Hit, remainingTime, Iterations);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tif (GetPerchRadiusThreshold() > 0.f && Hit.Time == 1.f && OldHitImpactNormal.Z >= GetWalkableFloorZ())\n\t\t\t\t\t{\n\t\t\t\t\t\t// We might be in a virtual 'ditch' within our perch radius. This is rare.\n\t\t\t\t\t\tconst FVector PawnLocation = UpdatedComponent->GetComponentLocation();\n\t\t\t\t\t\tconst float ZMovedDist = FMath::Abs(PawnLocation.Z - OldLocation.Z);\n\t\t\t\t\t\tconst float MovedDist2DSq = (PawnLocation - OldLocation).SizeSquared2D();\n\t\t\t\t\t\tif (ZMovedDist <= 0.2f * timeTick && MovedDist2DSq <= 4.f * timeTick)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tVelocity.X += 0.25f * GetMaxSpeed() * (FMath::FRand() - 0.5f);\n\t\t\t\t\t\t\tVelocity.Y += 0.25f * GetMaxSpeed() * (FMath::FRand() - 0.5f);\n\t\t\t\t\t\t\tVelocity.Z = FMath::Max<float>(JumpZVelocity * 0.25f, 1.f);\n\t\t\t\t\t\t\tDelta = Velocity * timeTick;\n\t\t\t\t\t\t\tSafeMoveUpdatedComponent(Delta, PawnRotation, true, Hit);\n\n\t\t\t\t\t\t\tDirModifier = (FVector2D(SplineLocation.GetDirection()) | FVector2D(Delta)) > 0.f ? 1 : -1;\n\t\t\t\t\t\t\tSplineLocation += Delta.Size2D() * DirModifier * (Hit.bBlockingHit ? Hit.Time : 1.f);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (Velocity.SizeSquared2D() <= KINDA_SMALL_NUMBER * 10.f)\n\t\t{\n\t\t\tVelocity.X = 0.f;\n\t\t\tVelocity.Y = 0.f;\n\t\t}\n\n\n\t\t// UE_LOG(LogTemp, Warning, TEXT(\"Spline Location thingy: %f\"), SplineLocation.GetDistanceFromSplineStart());\n\n\t}\n\n\t// Root Motion has been used, clear - cause animation should not ruin the rotation, that's why\n\tif (!bAllowRootMotionRotation)\n\t\tRootMotionParams.Clear();\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nconst USplineComponent* USoCharacterMovementComponent::GetActiveSplineComponent() const\n{\n\treturn SplineLocation.GetSpline()->GetSplineComponent();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFVector USoCharacterMovementComponent::ComputeFixedNormalForDelta(const FVector& Delta, const FVector& InNormal, const FHitResult& Hit)\n{\n\tFVector Normal(InNormal);\n\tif (IsMovingOnGround())\n\t{\n\t\t// We don't want to be pushed up an unwalkable surface.\n\t\tif (Normal.Z > 0.f)\n\t\t{\n\t\t\tif (!IsWalkable(Hit))\n\t\t\t{\n\t\t\t\tNormal = Normal.GetSafeNormal2D();\n\t\t\t}\n\t\t}\n\t\telse if (Normal.Z < -KINDA_SMALL_NUMBER)\n\t\t{\n\t\t\t// Don't push down into the floor when the impact is on the upper portion of the capsule.\n\t\t\tif (CurrentFloor.FloorDist < MIN_FLOOR_DIST && CurrentFloor.bBlockingHit)\n\t\t\t{\n\t\t\t\tconst FVector FloorNormal = CurrentFloor.HitResult.Normal;\n\t\t\t\tconst bool bFloorOpposedToMovement = (Delta | FloorNormal) < 0.f && (FloorNormal.Z < 1.f - DELTA);\n\t\t\t\tif (bFloorOpposedToMovement)\n\t\t\t\t{\n\t\t\t\t\tNormal = FloorNormal;\n\t\t\t\t}\n\n\t\t\t\tNormal = Normal.GetSafeNormal2D();\n\t\t\t}\n\t\t}\n\t}\n\treturn Normal;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nfloat USoCharacterMovementComponent::SlideAlongSurface(const FVector& Delta, float Time, const FVector& Normal, FHitResult& Hit, bool bHandleImpact)\n{\n\tif (Delta.IsNearlyZero())\n\t{\n\t\treturn 0.0f;\n\t}\n\tconst FVector SlideVector = ComputeSlideVector(Delta, Time, ComputeFixedNormalForDelta(Delta, Hit.Normal, Hit), Hit);\n\n\tif (SlideVector.IsNearlyZero())\n\t{\n\t\treturn 0.0f;\n\t}\n\n\tconst float ProjectionPercent = SlideVector.ProjectOnTo(Delta).Size2D() / Delta.Size2D();\n\treturn Super::SlideAlongSurface(Delta, Time, Hit.Normal, Hit, true) * ProjectionPercent;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoCharacterMovementComponent::OnCharacterStuckInGeometry(const FHitResult* Hit)\n{\n\tSuper::OnCharacterStuckInGeometry(Hit);\n\tif (bWasPushedAndStuckLastFrame)\n\t\tStuckedAndShouldBeKilled();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoCharacterMovementComponent::UpdateBasedMovement(float DeltaSeconds)\n{\n\tconst FVector OldPostion = UpdatedComponent->GetComponentLocation();\n\tSuper::UpdateBasedMovement(DeltaSeconds);\n\n\tconst FVector NewPosition = UpdatedComponent->GetComponentLocation();\n\tFVector Delta = NewPosition - OldPostion;\n\tconst float Offset = Delta.Size2D();\n\n\tif (Offset <= KINDA_SMALL_NUMBER) return;\n\n\tFVector PositiveDirection = SplineLocation.GetDirection();\n\tPositiveDirection.Normalize();\n\tDelta.Normalize();\n\n\tSplineLocation += FMath::Sign(FVector::DotProduct(Delta, PositiveDirection)) * Offset;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFVector USoCharacterMovementComponent::CalcAnimRootMotionVelocity(const FVector& RootMotionDeltaMove, float DeltaSeconds, const FVector& CurrentVelocity) const\n{\n\tFVector Vel = DeltaSeconds > KINDA_SMALL_NUMBER ? RootMotionDeltaMove / DeltaSeconds * SoRootMotionDesc.Multiplier * SkeletonIsExportedTerriblyModifier : Velocity;\n\tFVector2D VelHorizontal = FVector2D(SplineLocation.GetDirection()) * Vel.Size2D();\n\n\tif (!SoRootMotionDesc.bVerticalRootMotionEnabled)\n\t\tVel.Z = Velocity.Z;\n\n\tif (!SoRootMotionDesc.bHorizontalRootMotionEnabled)\n\t{\n\t\tconst FVector TempVel = Velocity;\n\t\t// Apply acceleration\n\t\t// const float MaxSpeed = GetMaxSpeed();\n\t\t// const float NewMaxSpeed = (IsExceedingMaxSpeed(MaxSpeed)) ? TempVel.Size() : MaxSpeed;\n\t\t// TempVel += Acceleration * DeltaSeconds;\n\t\t// TempVel = TempVel.GetClampedToMaxSize(NewMaxSpeed);\n\n\n\t\tVel.X = TempVel.X;\n\t\tVel.Y = TempVel.Y;\n\t}\n\treturn Vel;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFVector USoCharacterMovementComponent::GetImpartedMovementBaseVelocity() const\n{\n\tif (CharacterOwner)\n\t{\n\t\tif (UPrimitiveComponent* MovementBase = CharacterOwner->GetMovementBase())\n\t\t{\n\t\t\tif (AActor* BaseActor = MovementBase->GetOwner())\n\t\t\t{\n\t\t\t\tstatic const FName ActorTagNoImpartedVel = FName(\"NoImpartedVel\");\n\t\t\t\tif (BaseActor->ActorHasTag(ActorTagNoImpartedVel))\n\t\t\t\t{\n\t\t\t\t\treturn FVector::ZeroVector;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn Super::GetImpartedMovementBaseVelocity();\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFVector USoCharacterMovementComponent::ConstrainLocationToPlane(FVector Location) const\n{\n\tif (SplineLocation.GetSpline() != nullptr)\n\t{\n\t\t// the spline is horizontal, Z must not be projected\n\t\tconst FVector L = SplineLocation.GetSpline()->GetSplineComponent()->FindLocationClosestToWorldLocation(Location, ESplineCoordinateSpace::World);\n\t\treturn FVector(L.X, L.Y, Location.Z);\n\t}\n\n\treturn Location;\n}\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoCharacterMovementComponent::SetFallVelocityOverride(const bool bInFallVelocityOverride, const float InFallVelocityOverride)\n{\n\tbFallVelocityOverride = bInFallVelocityOverride;\n\tFallVelocityOverrideValue = InFallVelocityOverride;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoCharacterMovementComponent::Dash(const FVector& Dir, const float Distance)\n{\n\tconst float SplineDelta = Dir.Size2D() * Distance;\n\tconst float ZDelta = Dir.Z * Distance;\n\tSplineLocation += SplineDelta * SplineLocation.GetDirectionModifierFromVector(Dir);\n\n\tFVector Delta = FVector(SplineLocation) - UpdatedComponent->GetComponentLocation();\n\tDelta.Z = ZDelta;\n\tFHitResult Hit;\n\tSafeMoveUpdatedComponent(Delta, UpdatedComponent->GetComponentQuat(), true, Hit);\n\n}\n\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoCharacterMovementComponent::StartSwinging(const FVector& InSwingCenter, const float InSwingInputForce)\n{\n\tMovementMode = EMovementMode::MOVE_Custom;\n\tCustomMovementMode = ECustomMovementMode::ECM_Swing;\n\tSwingCenter = InSwingCenter;\n\tSwingArmDelta = 0.0f;\n\tSwingInput = FVector(0.0f, 0.0f, 0.0f);\n\tSwingInputForce = InSwingInputForce;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoCharacterMovementComponent::IsPointInSwingReach(const FVector& InSwingCenter) const\n{\n\treturn (InSwingCenter - CharacterOwner->GetActorLocation()).Size() < SwingArmMax;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoCharacterMovementComponent::StartSliding(const FVector& SurfaceNormal, float SurfaceSlidingModifier)\n{\n\t// TODO\n\tMovementMode = EMovementMode::MOVE_Custom;\n\n\tFVector Direction = SplineLocation.GetDirection();\n\tDirection.Z = 0;\n\tDirection.Normalize();\n\n\tif ((FVector2D(Direction) | FVector2D(SurfaceNormal)) <= 0)\n\t{\n\t\tDirection *= -1.f;\n\t}\n\tVelocity = Direction * MaxWalkSpeed * SurfaceSlidingModifier;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoCharacterMovementComponent::AddOffsetOnSpline(float Offset, const FVector& Direction, bool bSweep /*= false*/, FHitResult* HitResult /*= nullptr*/)\n{\n\tconst FVector DirectionOnSpline = SplineLocation.GetDirection();\n\tOffset *= FMath::Sign(DirectionOnSpline | Direction);\n\n\tFHitResult Hit;\n\tUpdatedComponent->AddWorldOffset(DirectionOnSpline * Offset, bSweep, &Hit);\n\tif (bSweep)\n\t{\n\t\tif (HitResult) *HitResult = Hit;\n\t\tif (Hit.bBlockingHit) Offset = Offset * Hit.Time;\n\t}\n\tSplineLocation += Offset;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoCharacterMovementComponent::Push(const FVector2D& PushVelocity)\n{\n\tconst FVector Vel = SplineLocation.GetDirection() * PushVelocity.X;\n\t// Velocity += FVector(Vel.X, Vel.Y, PushedDesc.Velocity.Y); ??\n\tVelocity = FVector(Vel.X, Vel.Y, PushVelocity.Y);\n\n\tif (MovementMode == EMovementMode::MOVE_Walking)\n\t{\n\t\tif (Velocity.Z < -KINDA_SMALL_NUMBER)\n\t\t{\n\t\t\tfloat StepUpHitVelocity = 0.0f;\n\t\t\tfloat DefaultBounce = 0.0f;\n\t\t\tif (SoOwner->ShouldBounceOnHit(StepUpHitVelocity, DefaultBounce, nullptr))\n\t\t\t\tVelocity.Z *= -DefaultBounce;\n\t\t}\n\n\t\tif (Velocity.Z > KINDA_SMALL_NUMBER)\n\t\t\tSetMovementMode(EMovementMode::MOVE_Falling);\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoCharacterMovementComponent::StuckedAndShouldBeKilled()\n{\n\tif (LastPushRematerializeLocation != nullptr)\n\t{\n\t\tFSoHitReactDesc HitReact;\n\t\tHitReact.AssociatedActor = LastPushRematerializeLocation;\n\t\tHitReact.HitReact = ESoHitReactType::EHR_BreakIntoPieces;\n\t\tISoMortal::Execute_CauseDmg(GetOwner(), FSoDmg{ LastPushCrushDamage * 10.0f, 0.0f }, HitReact);\n\t}\n\telse // RIP\n\t\tISoMortal::Execute_Kill(GetOwner(), true);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n//void USoCharacterMovementComponent::StartControlledMovementBasedOnOffset(const FSoControlledMovementDesc& MovementDesc)\n//{\n//\tif (bControlledMovement) return;\n//\n//\tbControlledMovement = true;\n//\tControlledMovementDesc = MovementDesc;\n//\n//\tMovementMode = EMovementMode::MOVE_Custom;\n//\tCustomMovementMode = ECustomMovementMode::ECM_Controlled;\n//}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoCharacterMovementComponent::SetPushedAndStuck(AActor* RematerializeLocation, int32 DamageAmountIfStuck, bool bForceDamage)\n{\n\tbWasPushedAndStuckLastFrame = true;\n\tLastPushRematerializeLocation = RematerializeLocation;\n\tLastPushCrushDamage = DamageAmountIfStuck;\n\tif (bForceDamage)\n\t\tStuckedAndShouldBeKilled();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoCharacterMovementComponent::ForceUpdateFloor()\n{\n\t// check floor again\n\tFindFloor(UpdatedComponent->GetComponentLocation(), CurrentFloor, false);\n\n\tif (AActor* Floor = CurrentFloor.HitResult.GetActor())\n\t{\n\t\tconst float FloorZ = Floor->GetVelocity().Z;\n\t\tif (FloorZ > Velocity.Z)\n\t\t{\n\t\t\tAdjustFloorHeight();\n\t\t\tSetBaseFromFloor(CurrentFloor);\n\t\t}\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoCharacterMovementComponent::TryLateWallJump()\n{\n\tif (!bAllowLateWallJump)\n\t\treturn false;\n\n\tconst float TimeSinceMissedWallJump = GetWorld()->GetTimeSeconds() - MissedWallJumpTime;\n\tif (TimeSinceMissedWallJump < GetLateWallJumpInterval())\n\t{\n\t\tVelocity = MissedWallJumpVelocity;\n\t\tSoOwner->OnBounce(true, MissedRollStoredValue, MissedImpactPointOffset + UpdatedComponent->GetComponentLocation(), MissedImpactNormal);\n\t\tMissedWallJumpTime = 0.0f;\n\t\t// UE_LOG(LogTemp, Warning, TEXT(\"Late WallJump!\"));\n\t\treturn true;\n\t}\n\n\treturn false;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoCharacterMovementComponent::ToggleAllowLateWallJump()\n{\n\tbAllowLateWallJump = !bAllowLateWallJump;\n\tif (bAllowLateWallJump)\n\t\tUE_LOG(LogTemp, Warning, TEXT(\"Late WallJump Enabled\"))\n\telse\n\t\tUE_LOG(LogTemp, Warning, TEXT(\"Late WallJump Disabled\"));\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoCharacterMovementComponent::SetLateWallJumpInterval(float Time)\n{\n\tLateWallJumpInterval = Time;\n\tUE_LOG(LogTemp, Warning, TEXT(\"LateWallJumpInterval set to %f\"), Time);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nfloat USoCharacterMovementComponent::GetLateWallJumpInterval() const\n{\n\treturn USoDateTimeHelper::NormalizeTime(LateWallJumpInterval);\n}\n"
  },
  {
    "path": "Source/SOrb/CharacterBase/SoCharacterMovementComponent.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#pragma once\n#include \"GameFramework/CharacterMovementComponent.h\"\n#include \"SplineLogic/SoSplinePoint.h\"\n#include \"CharacterBase/SoIMortalTypes.h\"\n\n#include \"SoCharacterMovementComponent.generated.h\"\n\nclass USplineComponent;\nclass ASoSpline;\nclass ASoCharacterBase;\n\n/** Custom movement modes for characters */\nUENUM(BlueprintType)\nenum ECustomMovementMode\n{\n\t/** None (movement is disabled). */\n\tECM_Swing\t\tUMETA(DisplayName = \"Swing\"),\n\t/** Movement defined via curves as offset based on time - check FSoControlledMovementDesc */\n\t// ECM_Controlled\tUMETA(DisplayName = \"Controlled\"),\n\n\tECM_MAX\t\t\tUMETA(Hidden),\n};\n\n\n/**\n *\n */\nUCLASS()\nclass SORB_API USoCharacterMovementComponent : public UCharacterMovementComponent\n{\n\tGENERATED_BODY()\n\npublic:\n\n\tUSoCharacterMovementComponent();\n\n\t///////////////////////////////////////////////////////////////////////////////////////////////////////////\n\t///////////////////////////////////////////////////////////////////////////////////////////////////////////\n\t// Inherited functions\n\t// Called when the game starts\n\tvirtual void InitializeComponent() override;\n\n\tvirtual void SetDefaultMovementMode() override;\n\n\t// Called every frame\n\tvirtual void TickComponent(float DeltaTime, ELevelTick TickType, FActorComponentTickFunction* ThisTickFunction) override;\n\n\n\t/** Update position based on Base movement */\n\tvirtual void UpdateBasedMovement(float DeltaSeconds) override;\n\n\t// TEST TEST TEST\n\tvirtual FVector CalcAnimRootMotionVelocity(const FVector& RootMotionDeltaMove, float DeltaSeconds, const FVector& CurrentVelocity) const override;\n\n\tvirtual FVector ConstrainAnimRootMotionVelocity(const FVector& RootMotionVelocity, const FVector& CurrentVelocity) const override { return RootMotionVelocity; }\n\n\tvirtual FVector GetImpartedMovementBaseVelocity() const override;\n\nprotected:\n\t// overloaded for UpdateBasedMovement() - we force the position to be on the spline\n\tvirtual FVector ConstrainLocationToPlane(FVector Location) const override;\n\n\t// SPLINE MOVEMENT:\n\tvirtual void PhysFalling(float deltaTime, int32 Iterations) override;\n\n\tvirtual void PhysFlying(float deltaTime, int32 Iterations) override;\n\n\tvirtual void PhysWalking(float deltaTime, int32 Iterations) override;\n\n\tvirtual void PhysCustom(float deltaTime, int32 Iterations) override;\n\n\tvirtual FVector ComputeSlideVector(const FVector& Delta, const float Time, const FVector& Normal, const FHitResult& Hit) const override;\n\n\tvirtual void MoveAlongFloor(const FVector& InVelocity, float DeltaSeconds, FStepDownResult* OutStepDownResult = NULL) override;\n\n\n\tvirtual bool ResolvePenetrationImpl(const FVector& Adjustment, const FHitResult& Hit, const FQuat& NewRotation) override;\n\tbool ResolvePenetrationOnSpline(const FVector& ProposedAdjustment, const FHitResult& Hit, const FQuat& NewRotationQuat);\n\n\tvirtual void ProcessLanded(const FHitResult& Hit, float remainingTime, int32 Iterations) override;\n\n\n\t/* Code copied from charactermovement/SlideAlongSurface in order to get the same results for SlideVector **/\n\tFVector ComputeFixedNormalForDelta(const FVector& Delta, const FVector& InNormal, const FHitResult& Hit);\n\n\t/** Custom version of SlideAlongSurface that calculates the percent of the movement in spline-space */\n\tvirtual float SlideAlongSurface(const FVector& Delta, float Time, const FVector& Normal, FHitResult& Hit, bool bHandleImpact) override;\n\n\tvirtual void OnCharacterStuckInGeometry(const FHitResult* Hit) override;\n\n\t///////////////////////////////////////////////////////////////////////////////////////////////////////////\n\t///////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n\t///////////////////////////////////////////////////////////////////////////////////////////////////////////\n\t// Spline Movement\n\npublic:\n\tFORCEINLINE FVector GetDirection() const { return SplineLocation.GetDirection(); }\n\tFORCEINLINE const FSoSplinePoint& GetSplineLocation() const { return SplineLocation; }\n\tFORCEINLINE FSoSplinePoint& GetSplineLocation() { return SplineLocation; }\n\n\t// doesn't modify the actor's location in the world, it just modify the stored spline location\n\tvoid SetSplineLocation(ASoSpline* NewSpline, float Distance = 0.f);\n\t// doesn't modify the actor's location in the world, it just modify the stored spline location\n\tUFUNCTION(BlueprintCallable)\n\tvoid SetSplineLocation(const FSoSplinePoint& InSplineLocation);\n\n\t/**\n\t* Adds a delta to the location of the component in spline space.\n\t* @param Offset\t\t\t\tChange in location, absolute value\n\t* @param SweepHitResult\t\tHit result from any impact if sweep is true.\n\t* @param bSweep\t\t\t\tWhether we sweep to the destination location, triggering overlaps along the way and stopping short of the target if blocked by something.\n\t*\t\t\t\t\t\t\tOnly the root component is swept and checked for blocking collision, child components move without sweeping. If collision is off, this has no effect.\n\t*/\n\tvoid AddOffsetOnSpline(float Offset, const FVector& Direction, bool bSweep = false, FHitResult* HitResult = nullptr);\n\n\tconst USplineComponent* GetActiveSplineComponent() const;\n\n\t///////////////////////////////////////////////////////////////////////////////////////////////////////////\n\tUFUNCTION(BlueprintCallable, Category = Movement)\n\tvoid SetRootMotionDesc(const FSoRootMotionDesc& Desc)\n\t{\n\t\tSoRootMotionDesc = Desc;\n\t}\n\n\tUFUNCTION(BlueprintCallable, Category = Movement)\n\tvoid ClearRootMotionDesc()\n\t{\n\t\tSoRootMotionDesc.bHorizontalRootMotionEnabled = false;\n\t\tSoRootMotionDesc.bVerticalRootMotionEnabled = false;\n\t\tSoRootMotionDesc.Multiplier = 1.0f;\n\t}\n\n\tvoid SetFallVelocityOverride(const bool bInFallVelocityOverride, const float InFallVelocityOverride = 0.0f);\n\tbool IsFallVelocityOverriden() const { return bFallVelocityOverride; }\n\n\tvoid SetSlowDownToMaxWalkSpeedInFall(bool bEnable) { bSlowDownToMaxWalkSpeedInFall = bEnable; }\n\n\tvoid Dash(const FVector& Dir, const float Distance);\n\n\tvoid StartSwinging(const FVector& InSwingCenter, const float InSwingInputForce);\n\n\tvoid StartSliding(const FVector& SurfaceNormal, float SurfaceSlidingModifier);\n\n\tvoid Push(const FVector2D& PushVelocity);\n\n\t// UFUNCTION(BlueprintCallable, Category = Movement)\n\t// void StartControlledMovementBasedOnOffset(const FSoControlledMovementDesc& MovementDesc);\n\n\tUFUNCTION(BlueprintCallable, Category = Movement)\n\tFVector GetSwingCenter() const { return SwingCenter; }\n\n\tUFUNCTION(BlueprintPure, Category = Movement)\n\tbool IsSwingForward() const { return bIsSwingForward; }\n\n\tvoid AddSwingDelta(float Delta) { SwingArmDelta += Delta; }\n\n\tfloat GetMaxSwingArm() const { return SwingArmMax; }\n\tbool IsPointInSwingReach(const FVector& InSwingCenter) const;\n\n\tvoid SetPushedAndStuck(AActor* RematerializeLocation, int32 DamageAmountIfStuck, bool bForceDamage);\n\tvoid ForceUpdateFloor();\n\n\tvoid SetOppressSetDefaultMovementMode(bool bOppress) { bOppressSetDefaultMovementMode = bOppress; }\n\n\n\tbool TryLateWallJump();\n\tvoid ToggleAllowLateWallJump();\n\tvoid SetLateWallJumpInterval(float Time);\n\tfloat GetLateWallJumpInterval() const;\n\n\nprivate:\n\n\t/** Handle falling movement. */\n\tvoid SplinePhysFalling(float deltaTime, int32 Iterations);\n\n\tvoid SplinePhysFlying(float deltaTime, int32 Iterations);\n\n\t// void PhysCustomForcedWalking(float deltaTime, int32 Iterations);\n\tvoid PhysCustomSwinging(float deltaTime, int32 Iterations);\n\n\t// void PhysControlledMovement(float deltaTime, int32 Iterations);\n\n\t// // ret val: amplitude\n\t// float UpdateSwingState();\n\n\tvoid StuckedAndShouldBeKilled();\n\n\t///////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n\t///////////////////////////////////////////////////////////////////////////////////////////////////////////\n\t///////////////////////////////////////////////////////////////////////////////////////////////////////////\n\t// Variables:\n\nprotected:\n\n\t// blender -> unreal fbx pipeline ftw, should be 1.0 for skeletons exported without this little issue\n\tUPROPERTY(EditAnywhere)\n\tint32 SkeletonIsExportedTerriblyModifier = 1.0f;\n\n\t///////////////////////////////////////////////////////////////////////////////////////////////////////////\n\t// Spline Movement\nprotected:\n\n\t// used if Velocity.size2d is greater than the MaxWalkSpeed\n\tUPROPERTY(EditAnywhere)\n\tfloat BrakingDecelerationFallingOverMaxWalkSpeed = 2000.0f;\n\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere)\n\tFSoSplinePoint SplineLocation;\n\n\t///////////////////////////////////////////////////////////////////////////////////////////////////////////\n\tASoCharacterBase* SoOwner;\n\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere)\n\tFSoRootMotionDesc SoRootMotionDesc;\n\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere)\n\tbool bAllowRootMotionRotation = false;\n\n\t/** keeps the orientation at the spline, only used if it is not kept on movement direction */\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere)\n\tbool bOrientRotationToSpline = false;\n\n\tbool bOppressSetDefaultMovementMode = false;\n\tbool bFly = false;\n\n\t// swing\n\tUPROPERTY(BlueprintReadWrite)\n\tFVector SwingCenter;\n\n\tFVector SwingInput;\n\tfloat SwingInputForce;\n\n\tbool bIsSwingForward;\n\tfloat SwingArmDelta = 0.0f;\n\n\tUPROPERTY(EditAnywhere)\n\tfloat SwingArmMin = 150.0f;\n\n\tUPROPERTY(EditAnywhere)\n\tfloat SwingArmMax = 400.0f;\n\n\n\tbool bFallVelocityOverride = false;\n\tfloat FallVelocityOverrideValue;\n\n\tbool bAlrearyRollHitThisFrame = false;\n\n\n\t/**\n\t *  set to true if the owner was pushed into something last frame\n\t *  if moving him out of the geometry fails he is simply executed\n\t */\n\tbool bWasPushedAndStuckLastFrame = false;\n\n\tUPROPERTY()\n\tAActor* LastPushRematerializeLocation = nullptr;\n\n\tint32 LastPushCrushDamage = 0;\n\n\n\t/** Late WallJump */\n\tbool bAllowLateWallJump = true;\n\tfloat LateWallJumpInterval = 0.1f;\n\n\tfloat MissedWallJumpTime;\n\tFVector MissedWallJumpVelocity;\n\tfloat MissedRollStoredValue;\n\tFVector MissedImpactPointOffset;\n\tFVector MissedImpactNormal;\n\n\t// only one wall jump is allowed in a frame to avoid being stuck on negative surfaces\n\tbool bWallJumpedThisFrame = false;\n\n\n\t/**\n\t * the character has to slow down in air if he jumped from a moving platform, otherwise he would be way too fast in some cases\n\t * however in some cases this slow has to be avoided\n\t * (e.g. when he jumps from sliding, because the MaxWalkSpeed is smaller in \"walk\" mode, than it was in \"slide\" mode)\n\t * this bool is modified each time the actor's base changes (the platform he is standing on) based on the base mobility\n\t * static - no slow down, moveable - slow down!\n\t * (maybe it should be updated based on the velocity of the base?!)\n\t * TEMP: disabled, LET'S SEE IF IT IS NEEDED OR NOT (2018.03.15).\n\t*/\n\tbool bSlowDownToMaxWalkSpeedInFall = false;\n\t///////////////////////////////////////////////////////////////////////////////////////////////////////////\n\t///////////////////////////////////////////////////////////////////////////////////////////////////////////\n};\n"
  },
  {
    "path": "Source/SOrb/CharacterBase/SoCharacterSheet.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#include \"SoCharacterSheet.h\"\n#include \"SoIMortalTypes.h\"\n\n#include \"Basic/Helpers/SoStaticHelper.h\"\n#include \"SaveFiles/SoWorldState.h\"\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// Sets default values for this component's properties\nUSoCharacterSheet::USoCharacterSheet()\n{\n\t// Set this component to be initialized when the game starts, and to be ticked every frame.  You can turn these features\n\t// off to improve performance if you don't need them.\n\t// bWantsBeginPlay = false;\n\tPrimaryComponentTick.bCanEverTick = false;\n\n\tbWantsInitializeComponent = true;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoCharacterSheet::InitializeComponent()\n{\n\tSuper::InitializeComponent();\n\tCurrentHealthPoints = GetMaxHealth();\n}\n\n#if WITH_EDITOR\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoCharacterSheet::PostEditChangeProperty(FPropertyChangedEvent& PropertyChangedEvent)\n{\n\tSuper::PostEditChangeProperty(PropertyChangedEvent);\n\n\tCurrentHealthPoints = MaxHealthPoints;\n}\n#endif\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoCharacterSheet::RestoreHealth()\n{\n\tCurrentHealthPoints = GetMaxHealth();\n\n\tOnHealthChanged.Broadcast(CurrentHealthPoints, CurrentHealthPoints);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoCharacterSheet::SetMaxHealth(float NewValue, bool bModifyCurrent)\n{\n\tMaxHealthPoints = NewValue;\n\tconst float Max = GetMaxHealth();\n\tif (bModifyCurrent)\n\t\tCurrentHealthPoints = Max;\n\tOnHealthChanged.Broadcast(CurrentHealthPoints, Max);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoCharacterSheet::SetHealth(float NewValue)\n{\n\tconst float Max = GetMaxHealth();\n\tCurrentHealthPoints = FMath::Clamp(NewValue, 0.0f, Max);\n\tOnHealthChanged.Broadcast(CurrentHealthPoints, Max);\n\treturn CurrentHealthPoints > 0.0f;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoCharacterSheet::IncreaseHealth(float Delta)\n{\n\tconst float Max = GetMaxHealth();\n\tCurrentHealthPoints = FMath::Clamp(CurrentHealthPoints + Delta, 0.0f, Max);\n\tOnHealthChanged.Broadcast(CurrentHealthPoints, Max);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoCharacterSheet::AddBonusHealth(const FSoDmg& BonusHealthAmount)\n{\n\tBonusHealth += BonusHealthAmount;\n\tOnBonusHealthChanged.Broadcast(BonusHealth);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoCharacterSheet::ClearBonusHealth()\n{\n\tBonusHealth.SetToZero();\n\tOnBonusHealthChanged.Broadcast(BonusHealth);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFSoDmg USoCharacterSheet::AddRes(const FSoDmg& Res)\n{\n\tFSoDmg Applied = Res;\n\n\tif (Resistance.Physical + Res.Physical > 1.0f)\n\t\tApplied.Physical = 1.0f - Resistance.Physical;\n\n\tif (Resistance.Magical + Res.Magical > 1.0f)\n\t\tApplied.Magical = 1.0f - Resistance.Magical;\n\n\tResistance.Physical = FMath::Clamp(Resistance.Physical + Res.Physical, 0.0f, 1.0f);\n\tResistance.Magical = FMath::Clamp(Resistance.Magical + Res.Magical, 0.0f, 1.0f);\n\n\treturn Applied;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoCharacterSheet::RemoveRes(const FSoDmg& Res)\n{\n\tResistance.Physical = FMath::Clamp(Resistance.Physical - Res.Physical, 0.0f, 1.0f);\n\tResistance.Magical = FMath::Clamp(Resistance.Magical - Res.Magical, 0.0f, 1.0f);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoCharacterSheet::ApplyDmg(const FSoDmg& Damage)\n{\n\tFSoDmg AppliedDmg = Damage * (Resistance.OneMinus());\n\tconst float Sum = AppliedDmg.Sum();\n\tif (Sum > KINDA_SMALL_NUMBER)\n\t{\n\t\tOnDmg.Broadcast(AppliedDmg);\n\n\t\tbool bBonusBlocked = false;\n\t\tif (AppliedDmg.HasPhysical() && BonusHealth.HasPhysical())\n\t\t{\n\t\t\tconst float PreBonusHealth = BonusHealth.Physical;\n\t\t\tBonusHealth.Physical = FMath::Max(BonusHealth.Physical - AppliedDmg.Physical, 0.0f);\n\t\t\tAppliedDmg.Physical = FMath::Max(AppliedDmg.Physical - PreBonusHealth, 0.0f);\n\t\t\tbBonusBlocked = true;\n\t\t}\n\t\tif (AppliedDmg.HasMagical() && BonusHealth.HasMagical())\n\t\t{\n\t\t\tconst float PreBonusHealth = BonusHealth.Magical;\n\t\t\tBonusHealth.Magical = FMath::Max(BonusHealth.Magical - AppliedDmg.Magical, 0.0f);\n\t\t\tAppliedDmg.Magical = FMath::Max(AppliedDmg.Magical - PreBonusHealth, 0.0f);\n\t\t\tbBonusBlocked = true;\n\t\t}\n\t\tif (bBonusBlocked)\n\t\t\tOnBonusHealthChanged.Broadcast(BonusHealth);\n\n\t\tOnDmgApplied.Broadcast(AppliedDmg);\n\n\t\tconst float PostBonusSum = AppliedDmg.Sum();\n\t\tif (PostBonusSum > KINDA_SMALL_NUMBER)\n\t\t{\n\t\t\tconst bool bAlive = CurrentHealthPoints > PostBonusSum;\n\t\t\tCurrentHealthPoints = FMath::Clamp(CurrentHealthPoints - PostBonusSum, 0.0f, GetMaxHealth());\n\n\t\t\tif (!bAlive)\n\t\t\t{\n\t\t\t\tOnPreDeath.Broadcast();\n\t\t\t\treturn CurrentHealthPoints > KINDA_SMALL_NUMBER;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn true;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFSoDmg USoCharacterSheet::GetReducedDmg(const FSoDmg& Damage)\n{\n\treturn Damage * (Resistance.OneMinus());\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nfloat USoCharacterSheet::GetMaxHealth() const\n{\n\tswitch (FSoWorldState::Get().GetGameDifficulty())\n\t{\n\t\tcase ESoDifficulty::Sane:\n\t\t\treturn MaxHealthPoints * SaneHPMultiplier;\n\n\t\tcase ESoDifficulty::Insane:\n\t\t\treturn MaxHealthPoints * InsaneHPMultiplier;\n\n\t\tcase ESoDifficulty::Intended:\n\t\tdefault:\n\t\t\treturn MaxHealthPoints;\n\t}\n}"
  },
  {
    "path": "Source/SOrb/CharacterBase/SoCharacterSheet.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#pragma once\n#include \"Components/ActorComponent.h\"\n#include \"SoIMortalTypes.h\"\n#include \"UI/General/SoUITypes.h\"\n\n#include \"SoCharacterSheet.generated.h\"\n\n\nUCLASS(ClassGroup=(Custom), meta=(BlueprintSpawnableComponent))\nclass SORB_API USoCharacterSheet : public UActorComponent\n{\nGENERATED_BODY()\n\npublic:\n\t// Sets default values for this component's properties\n\tUSoCharacterSheet();\n\n\tvirtual void InitializeComponent() override;\n\n#if WITH_EDITOR\n\tvirtual void PostEditChangeProperty(FPropertyChangedEvent& PropertyChangedEvent) override;\n#endif\n\n\tUFUNCTION(BlueprintCallable, Category = Health)\n\tvoid RestoreHealth();\n\n\tUFUNCTION(BlueprintCallable, Category = Health)\n\tvoid SetMaxHealth(float NewValue, bool bModifyCurrent = true);\n\n\t/** value is clamped in [0, MaxHealth], returns true if we are still alive */\n\tUFUNCTION(BlueprintCallable, Category = Health)\n\tbool SetHealth(float NewValue);\n\n\tUFUNCTION(BlueprintCallable, Category = Health)\n\tvoid IncreaseHealth(float Delta);\n\n\n\tUFUNCTION(BlueprintCallable, Category = Health)\n\tvoid AddBonusHealth(const FSoDmg& BonusHealthAmount);\n\n\tUFUNCTION(BlueprintCallable, Category = Health)\n\tvoid ClearBonusHealth();\n\n\n\tUFUNCTION(BlueprintCallable, Category = Health)\n\tFSoDmg AddRes(const FSoDmg& Res);\n\n\tUFUNCTION(BlueprintCallable, Category = Health)\n\tvoid RemoveRes(const FSoDmg& Res);\n\n\n\t// return: true if we are still alive, damage resistances reduce the damage\n\tvirtual bool ApplyDmg(const FSoDmg& Damage);\n\n\tFSoDmg GetReducedDmg(const FSoDmg& Damage);\n\n\tUFUNCTION(BlueprintPure, Category = Health)\n\tbool IsAlive() const { return CurrentHealthPoints > KINDA_SMALL_NUMBER; }\n\n\n\tUFUNCTION(BlueprintPure, Category = Health)\n\tfloat GetHealth() const { return CurrentHealthPoints; }\n\n\tUFUNCTION(BlueprintPure, Category = Health)\n\tfloat GetMaxHealth() const;\n\n\tUFUNCTION(BlueprintPure, Category = Health)\n\tfloat GetHealthPercent() const { return CurrentHealthPoints / GetMaxHealth(); }\n\n\tfloat GetPhysicalResistance() const { return Resistance.Physical; }\n\tfloat GetMagicResistance() const { return Resistance.Magical; }\n\n\tUFUNCTION(BlueprintPure)\n\tconst FSoDmg& GetBonushHealth() const { return BonusHealth; }\n\n\tUFUNCTION(BlueprintPure)\n\tfloat GetBonushHealthSum() const { return BonusHealth.Sum(); }\n\npublic:\n\n\tUPROPERTY(BlueprintAssignable, Category = UI)\n\tFSoUINotifyTwoFloat OnHealthChanged;\n\n\t/** Param is the actual bonus health */\n\tUPROPERTY(BlueprintAssignable, Category = UI)\n\tFSoUINotifyDmg OnBonusHealthChanged;\n\n\t/** applied dmg after bonus health might drained some dmg */\n\tUPROPERTY(BlueprintAssignable, Category = UI)\n\tFSoUINotifyDmg OnDmgApplied;\n\n\tUPROPERTY(BlueprintAssignable, Category = UI)\n\tFSoUINotifyDmg OnDmg;\n\n\t/** health is reduced to 0 */\n\tUPROPERTY(BlueprintAssignable, Category = Health)\n\tFSoUINotify OnPreDeath;\n\nprotected:\n\n\tUPROPERTY(EditAnywhere, BlueprintReadOnly)\n\tfloat MaxHealthPoints = 30.0f;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadOnly)\n\tfloat CurrentHealthPoints = 30.0f;\n\n\tUPROPERTY(EditAnywhere)\n\tFSoDmg Resistance;\n\n\tUPROPERTY(EditAnywhere)\n\tFSoDmg BonusHealth;\n\n\n\tUPROPERTY(EditAnywhere)\n\tfloat SaneHPMultiplier = 0.6f;\n\n\tUPROPERTY(EditAnywhere)\n\tfloat InsaneHPMultiplier = 1.5f;\n};\n"
  },
  {
    "path": "Source/SOrb/CharacterBase/SoCombatComponent.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#include \"SoCombatComponent.h\"\n\n#include \"EngineUtils.h\"\n#include \"Components/SkeletalMeshComponent.h\"\n#include \"DrawDebugHelpers.h\"\n\n#include \"Basic/SoCollisionChannels.h\"\n#include \"CharacterBase/SoMortal.h\"\n#include \"SplineLogic/SoSplineWalker.h\"\n#include \"Character/SoCharacter.h\"\n\nbool USoCombatComponent::bDisplayDebugHitLines = false;\n\nDEFINE_LOG_CATEGORY_STATIC(LogSoCombatComponent, All, All);\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// Sets default values for this component's properties\nUSoCombatComponent::USoCombatComponent()\n{\n\t// bWantsBeginPlay = false;\n\tPrimaryComponentTick.bCanEverTick = true;\n\tbWantsInitializeComponent = true;\n\n\tPrimaryComponentTick.TickGroup = TG_PostPhysics;\n\n\tActiveDamage.Physical = 20.0f;\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// Called when the game starts\n//void USoCombatComponent::BeginPlay()\n//{\n//\tSuper::BeginPlay();\n//\n//\tGetOwner();\n//\n//}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoCombatComponent::InitializeComponent()\n{\n\tSuper::InitializeComponent();\n\n\t// some interfaces are expected to be implemented\n\tSoOwner = Cast<ASoCharacterBase>(GetOwner());\n\tcheck(SoOwner);\n\n\tOwnerSkeletal = SoOwner->GetMesh();\n\n\tWeaponShape.SetSphere(1.0f);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoCombatComponent::TickComponent( float DeltaTime, ELevelTick TickType, FActorComponentTickFunction* ThisTickFunction )\n{\n\tSuper::TickComponent( DeltaTime, TickType, ThisTickFunction );\n\n\n\tfor (int32 i = 0; i < WeaponsDynamic.Num(); ++i)\n\t\tif (WeaponsDynamic[i].bEnabled)\n\t\t{\n\t\t\tWeaponShape.SetSphere(Weapons[i].TraceRadius);\n\n\t\t\tFCollisionQueryParams TraceParams(FName(TEXT(\"Not Yet Trace\")), true, SoOwner);\n\t\t\tTraceParams.bTraceComplex = false;\n\t\t\tTraceParams.bReturnPhysicalMaterial = false;\n\n\t\t\tconst FVector CurrentSocketStartPos = OwnerSkeletal->GetSocketLocation(Weapons[i].StartSocketName);\n\n\t\t\tconst FVector CurrentDirection = (OwnerSkeletal->GetSocketLocation(Weapons[i].EndSocketName) - CurrentSocketStartPos).GetSafeNormal();\n\n\t\t\tif ((CurrentDirection - WeaponsDynamic[i].LastDirection).Size() < KINDA_SMALL_NUMBER &&\n\t\t\t\t(CurrentSocketStartPos - WeaponsDynamic[i].LastStartSocketPosition).Size() < KINDA_SMALL_NUMBER)\n\t\t\t\tcontinue;\n\n\t\t\tfor (int32 j = 0; j <= Weapons[i].PartitionNum; ++j)\n\t\t\t{\n\t\t\t\tconst float DistanceFromStart = j * Weapons[i].PartitionLength;\n\n\t\t\t\tconst FVector StartLocation = WeaponsDynamic[i].LastStartSocketPosition + DistanceFromStart * WeaponsDynamic[i].LastDirection;\n\t\t\t\tconst FVector EndLocation = CurrentSocketStartPos + DistanceFromStart * CurrentDirection;\n\n\t\t\t\tif (USoCombatComponent::bDisplayDebugHitLines)\n\t\t\t\t{\n\t\t\t\t\tconst FColor Color = Cast<ASoCharacter>(SoOwner) == nullptr ? FColor(255, 0, 0) : FColor(0, 255, 0);\n\t\t\t\t\tDrawDebugLine(SoOwner->GetWorld(), StartLocation, EndLocation, Color, false, 3, 0, Weapons[i].TraceRadius);\n\t\t\t\t}\n\n\t\t\t\tTArray<FHitResult> Hits;\n\t\t\t\tSoOwner->GetWorld()->SweepMultiByChannel(Hits, StartLocation, EndLocation, {}, ECC_Weapon, WeaponShape, TraceParams);\n\n\t\t\t\tfor (const auto& Hit : Hits)\n\t\t\t\t{\n\t\t\t\t\tAActor* TargetActor = Hit.Actor.Get();\n\n\t\t\t\t\tUPrimitiveComponent* Component = Hit.Component.Get();\n\n\t\t\t\t\tif (TargetActor == nullptr ||\n\t\t\t\t\t\t!TargetActor->GetClass()->ImplementsInterface(USoMortal::StaticClass()) ||\n\t\t\t\t\t\t(bOneActorOncePerStrike && ActorsAlreadyHit.Contains(FSoTargetHit{ TargetActor, i })))\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tActorsAlreadyHit.Add({ TargetActor, i });\n\n\t\t\t\t\tFSoMeleeHitParam Params;\n\t\t\t\t\tParams.Dmg = ActiveDamage;\n\t\t\t\t\tParams.HitReactDesc.AssociatedActor = GetOwner();\n\t\t\t\t\tParams.Hit = Hit;\n\t\t\t\t\tParams.HitReactDesc.HitReact = ESoHitReactType::EHR_Pushed;\n\t\t\t\t\tParams.HitReactDesc.PushDesc = ActivePushDesc;\n\t\t\t\t\tParams.HitReactDesc.Irresistibility = CurrentIrresistibility;\n\n\t\t\t\t\tfor (const auto LocalHit : Hits)\n\t\t\t\t\t\tif (LocalHit.Actor.Get() == TargetActor)\n\t\t\t\t\t\t\tParams.HitReactDesc.AssociatedBones.Add(LocalHit.BoneName);\n\n\t\t\t\t\t// direction correction happens in char now\n\t\t\t\t\t// const int32 Modifier = ISoSplineWalker::Execute_GetSplineLocationI(SoOwner).GetDirectionModifierFromVector(TargetActor->GetActorLocation() - GetOwner()->GetActorLocation());\n\t\t\t\t\t// Params.HitReactDesc.PushDesc.HorizontalVelocity *= Modifier;\n\t\t\t\t\tParams.bBlockable = bBlockable;\n\n\t\t\t\t\tif (!ISoMortal::Execute_MeleeHit(TargetActor, Params))\n\t\t\t\t\t\tSoOwner->OnBlocked();\n\n\t\t\t\t\tSoOwner->OnMeleeHit.Broadcast(TargetActor, Params);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tWeaponsDynamic[i].LastDirection = CurrentDirection;\n\t\t\tWeaponsDynamic[i].LastStartSocketPosition = CurrentSocketStartPos;\n\t\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoCombatComponent::RegisterWeapon(FName StartSocketName, FName EndSocketName, int32 PartitionNum, float TraceRadius)\n{\n\tPartitionNum = FMath::Max(PartitionNum, 1);\n\n\tFSoWeapon Weapon;\n\n\tWeapon.StartSocketName = StartSocketName;\n\tWeapon.EndSocketName = EndSocketName;\n\tWeapon.PartitionNum = PartitionNum;\n\tWeapon.TraceRadius = TraceRadius;\n\n\tWeapon.PartitionLength = (OwnerSkeletal->GetSocketLocation(EndSocketName) - OwnerSkeletal->GetSocketLocation(StartSocketName)).Size() / PartitionNum;\n\n\tWeapons.Add(Weapon);\n\tWeaponsDynamic.Add({ false, {}, {} });\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoCombatComponent::SetupNewStrike(const FSoStrikePhase& StrikeData)\n{\n\tClearActorsAlreadyHit();\n\tActivePushDesc = StrikeData.PushDesc;\n\tbBlockable = StrikeData.bBlockable;\n\tActiveDamage = StrikeData.Damage;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoCombatComponent::SetWeaponCollisionEnabled(int32 Index, bool bEnabled)\n{\n\tif (WeaponsDynamic.IsValidIndex(Index))\n\t{\n\t\tWeaponsDynamic[Index].bEnabled = bEnabled;\n\t\tWeaponsDynamic[Index].LastStartSocketPosition = OwnerSkeletal->GetSocketLocation(Weapons[Index].StartSocketName);\n\t\tWeaponsDynamic[Index].LastDirection = (OwnerSkeletal->GetSocketLocation(Weapons[Index].EndSocketName) - WeaponsDynamic[Index].LastStartSocketPosition).GetSafeNormal();\n\t}\n\telse\n\t\tUE_LOG(LogSoCombatComponent, Warning, TEXT(\"USoCombatComponent::SetWeaponCollisionEnabled called with invalid weapon index\"));\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoCombatComponent::DisableAllWeaponCollision()\n{\n\tfor (auto& Weapon : WeaponsDynamic)\n\t\tWeapon.bEnabled = false;\n}\n"
  },
  {
    "path": "Source/SOrb/CharacterBase/SoCombatComponent.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#pragma once\n\n#include \"Components/ActorComponent.h\"\n#include \"Enemy/SoEnemyDataTypes.h\"\n#include \"WorldCollision.h\"\n#include \"SoCombatComponent.generated.h\"\n\nclass ASoCharacterBase;\n\n/**\n * Struct to store hits\n * Used to make sure that one weapon can only damage one target once in one strike\n */\nUSTRUCT(BlueprintType)\nstruct FSoTargetHit\n{\n\tGENERATED_USTRUCT_BODY()\npublic:\n\t/** The actor we already damaged */\n\tUPROPERTY()\n\tAActor* Target;\n\n\t/** The weapon slot which already hit the actor */\n\tUPROPERTY()\n\tint32 WeaponCollisionIndex;\n};\n\n/**\n * TODO: Write comment\n */\nstruct FSoWeapon\n{\n\tFName StartSocketName;\n\tFName EndSocketName;\n\tfloat WeaponLength;\n\t/** amount of line trace source/end points along weapon, at least 2 */\n\tint32 PartitionNum;\n\tfloat PartitionLength;\n\n\tfloat TraceRadius;\n};\n\n\nstruct FSoWeaponDynamicData\n{\n\tbool bEnabled;\n\n\tFVector LastStartSocketPosition;\n\tFVector LastDirection;\n};\n\n\ninline bool operator==(const FSoTargetHit& _First, const FSoTargetHit& _Second) { return _First.Target == _Second.Target && _First.WeaponCollisionIndex == _Second.WeaponCollisionIndex; }\n\n\nUCLASS( ClassGroup=(Custom), meta=(BlueprintSpawnableComponent) )\nclass SORB_API USoCombatComponent : public UActorComponent\n{\n\tGENERATED_BODY()\n\npublic:\n\t// Sets default values for this component's properties\n\tUSoCombatComponent();\n\n\t// Called when the game starts\n\tvirtual void InitializeComponent() override;\n\n\t// virtual void BeginPlay() override;\n\tvirtual void TickComponent( float DeltaTime, ELevelTick TickType, FActorComponentTickFunction* ThisTickFunction ) override;\n\n\tUFUNCTION(BlueprintCallable, Category = Combat)\n\tvoid RegisterWeapon(FName StartSocketName, FName EndSocketName, int32 PartitionNum, float TraceRadius);\n\n\tvoid ClearActorsAlreadyHit();\n\n\tvoid SetActivePushDesc(const FSoPushDesc& PushDesc);\n\tvoid SetBlockable(bool bInBlockable);\n\n\tvoid SetupNewStrike(const FSoStrikePhase& StrikeData);\n\n\tUFUNCTION(BlueprintCallable, Category = Combat)\n\tvoid SetCurrentIrresistibility(int32 Irresistibility) { CurrentIrresistibility = Irresistibility; }\n\n\tUFUNCTION(BlueprintCallable, Category = Combat)\n\tvoid ModifyCurrentIrresistibility(int32 IrresistibilityChange) { CurrentIrresistibility += IrresistibilityChange; }\n\n\tvoid SetWeaponCollisionEnabled(int32 Index, bool bEnabled);\n\tvoid DisableAllWeaponCollision();\n\npublic:\n\n\tstatic bool bDisplayDebugHitLines;\n\nprotected:\n\n\tASoCharacterBase* SoOwner;\n\n\t// gives a hint to the target about his next action\n\tESoHitReactType HitReactType = ESoHitReactType::EHR_JumpAway;\n\n\tFSoDmg ActiveDamage;\n\n\tint32 CurrentIrresistibility = 1;\n\n\tUPROPERTY(EditAnywhere)\n\tFSoPushDesc ActivePushDesc;\n\n\tUPROPERTY(EditAnywhere)\n\tbool bBlockable = true;\n\n\tUPROPERTY(EditAnywhere)\n\tbool bOneActorOncePerStrike = true;\n\n\tUPROPERTY()\n\tUSkeletalMeshComponent* OwnerSkeletal;\n\n\tTArray<FName> BonesHit;\n\n\t// list of actors already hit with this strike\n\t// one strike hits a target only once normally\n\t// if it is a more complicated movement sending an anim event can reset the array during a strike\n\tTArray<FSoTargetHit> ActorsAlreadyHit;\n\n\n\tTArray<FSoWeapon> Weapons;\n\tTArray<FSoWeaponDynamicData> WeaponsDynamic;\n\n\tFCollisionShape WeaponShape;\n};\n\ninline void USoCombatComponent::ClearActorsAlreadyHit() { ActorsAlreadyHit.Empty(); }\ninline void USoCombatComponent::SetActivePushDesc(const FSoPushDesc& PushDesc) { ActivePushDesc = PushDesc; }\ninline void USoCombatComponent::SetBlockable(bool bInBlockable) { bBlockable = bInBlockable; }\n"
  },
  {
    "path": "Source/SOrb/CharacterBase/SoIMortalTypes.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#pragma once\n#include \"SoIMortalTypes.h\"\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFSoDmg FSoDmg::operator*(const FSoDmg& Other) const\n{\n\tFSoDmg Dmg;\n\tDmg.Physical = Physical * Other.Physical;\n\tDmg.Magical = Magical * Other.Magical;\n\treturn Dmg;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFSoDmg FSoDmg::operator*(float Multiplier) const\n{\n\tFSoDmg Dmg;\n\tDmg.Physical = Physical * Multiplier;\n\tDmg.Magical = Magical * Multiplier;\n\treturn Dmg;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSoDmg::operator*=(const FSoDmg& Other)\n{\n\tPhysical *= Other.Physical;\n\tMagical *= Other.Magical;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSoDmg::operator*=(float Multiplier)\n{\n\tPhysical *= Multiplier;\n\tMagical *= Multiplier;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFSoDmg FSoDmg::operator+(const FSoDmg& Other) const\n{\n\tFSoDmg Dmg;\n\tDmg.Physical = Physical + Other.Physical;\n\tDmg.Magical = Magical + Other.Magical;\n\treturn Dmg;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSoDmg::operator+=(const FSoDmg& Other)\n{\n\tPhysical += Other.Physical;\n\tMagical += Other.Magical;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nfloat FSoDmg::operator[](int32 Index) const\n{\n\tif (Index == 0)\n\t\treturn Physical;\n\n\treturn Magical;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFSoDmg FSoDmg::OneMinus() const\n{\n\tFSoDmg Dmg;\n\tDmg.Physical = 1.0f - Physical;\n\tDmg.Magical = 1.0f - Magical;\n\treturn Dmg;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nfloat FSoDmg::Sum() const\n{\n\treturn Physical + Magical;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nESoDmgType FSoDmg::GetType() const\n{\n\tif (Physical > KINDA_SMALL_NUMBER && Magical > KINDA_SMALL_NUMBER)\n\t\treturn ESoDmgType::Mixed;\n\n\tif (Physical > KINDA_SMALL_NUMBER)\n\t\treturn ESoDmgType::Physical;\n\n\tif (Magical > KINDA_SMALL_NUMBER)\n\t\treturn ESoDmgType::Magic;\n\n\treturn ESoDmgType::None;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool FSoDmg::HasPhysical() const\n{\n\treturn Physical > KINDA_SMALL_NUMBER;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool FSoDmg::HasMagical() const\n{\n\treturn Magical > KINDA_SMALL_NUMBER;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSoDmg::SetToZero()\n{\n\tPhysical = 0.0f;\n\tMagical = 0.0f;\n}"
  },
  {
    "path": "Source/SOrb/CharacterBase/SoIMortalTypes.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#pragma once\n#include \"CoreMinimal.h\"\n#include \"SoIMortalTypes.generated.h\"\n\n\nclass UParticleSystem;\nclass UParticleSystemComponent;\nclass USoEffectBase;\nclass UCurveFloat;\nclass AActor;\nclass UCurveLinearColor;\n\n\n////////////////////////////////////////////////////////////////////////////////////////\n/** used to request some special visual effect */\nUENUM(BlueprintType)\nenum class ESoStatusEffect : uint8\n{\n\tESE_Fire = 0\t\t\t\tUMETA(DisplayName = \"Fire\"),\n\tESE_Stun\t\t\t\t\tUMETA(DisplayName = \"Stun\"),\n\tESE_Slow\t\t\t\t\tUMETA(DisplayName = \"Slow\"),\n\tESE_Speed\t\t\t\t\tUMETA(DisplayName = \"Speed\"),\n\tESE_Shade\t\t\t\t\tUMETA(DisplayName = \"Shade\"),\n\tESE_LightningShade\t\t\tUMETA(DisplayName = \"LightningShade\"),\n\tESE_ReducedCooldown\t\t\tUMETA(DisplayName = \"ReducedCooldown\"),\n\tESE_Floating\t\t\t\tUMETA(DisplayName = \"Floating\"),\n\tESE_Bounce\t\t\t\t\tUMETA(DisplayName = \"Bounce\"),\n\tESE_Shield\t\t\t\t\tUMETA(DisplayName = \"Shield\"),\n\n\tESE_BootTransmutation\t\tUMETA(DisplayName = \"BootTransmutation\"),\n\n\tESE_Worthy\t\t\t\t\tUMETA(DisplayName = \"Worthy\"),\n\n\t// weird sign above characters to generate attention\n\tESE_FloatingSign\t\t\tUMETA(DisplayName = \"FloatingSign\"),\n\t\n\tESE_NumOf\t\t\t\t\tUMETA(DisplayName = \"None\"),\n};\n\n////////////////////////////////////////////////////////////////////////////////////////\n/** used to request visual effects in a fire and forget way */\nUENUM(BlueprintType)\nenum class ESoVisualEffect : uint8\n{\n\tEVE_Heal = 0\t\t\tUMETA(DisplayName = \"Heal\"),\n\tEVE_SecondChanceCast\tUMETA(DisplayName = \"SecondChanceCast\"),\n\n\tEVE_Electrified\t\t\tUMETA(DisplayName = \"Electrified\"),\n\tEVE_ElectrifiedBlue\t\tUMETA(DisplayName = \"ElectrifiedBlue\"),\n\tEVE_ElectrifiedYellow\tUMETA(DisplayName = \"ElectrifiedYellow\"),\n\n\tEVE_Damaged\t\t\t\tUMETA(DisplayName = \"Damaged\"),\n\tEVE_RegenerateSpells\tUMETA(DisplayName = \"RegenerateSpell\"),\n\n\tEVE_MAX\t\t\t\t\tUMETA(DisplayName = \"Invalid\")\n};\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUENUM(BlueprintType)\nenum class ESoHitReactType : uint8\n{\n\tEHR_Nothing = 0\t\tUMETA(DisplayName = \"Nothing\"),\n\tEHR_JumpAway\t\tUMETA(DisplayName = \"JumpAway\"),\n\tEHR_JumpAwayLight\tUMETA(DisplayName = \"JumpAwayLight\"),\n\tEHR_Stun\t\t\tUMETA(DisplayName = \"Stun\"),\n\tEHR_Pushed\t\t\tUMETA(DisplayName = \"Pushed\"),\n\n\tEHR_FallToDeath\t\tUMETA(DisplayName = \"FallToDeath\"),\n\tEHR_BreakIntoPieces\tUMETA(DisplayName = \"BreakIntoPieces\"),\n\n\tEHR_MAX\t\t\t\tUMETA(Hidden),\n};\n\n////////////////////////////////////////////////////////////////////////////////////////\nUSTRUCT(BlueprintType)\nstruct FSoPushDesc\n{\n\tGENERATED_USTRUCT_BODY()\npublic:\n\t// the velocity the character is kicked away\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite)\n\tfloat HorizontalVelocity = 0.0f;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite)\n\tfloat VerticalVelocity = 0.0f;\n\n\t/** FIXMYSELF: we don't need this here, who would want to set this up for each damage?! */\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite)\n\tfloat StunDuration = -1.0f;\n};\n\n////////////////////////////////////////////////////////////////////////////////////////\nUSTRUCT(BlueprintType, Blueprintable)\nstruct FSoHitReactDesc\n{\n\tGENERATED_USTRUCT_BODY()\n\npublic:\n\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere)\n\tESoHitReactType HitReact = ESoHitReactType::EHR_Stun;\n\n\t/** Source of the damage type, or the Actor providing the respawn location via implementing  */\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere)\n\tAActor* AssociatedActor = nullptr;\n\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere)\n\tint32 OutDir = 0;\n\n\t/** used for push */\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere)\n\tFSoPushDesc PushDesc;\n\n\t/** normally decides if hit react is triggered or not. if abs of this is greater than or equal to 10 it can't be blocked by enemies who ignore ranged attacks */\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere)\n\tint32 Irresistibility = 0;\n\n\t/** \n\t *  Used to decide if the hit is critical or not for NPCs as they can have Critical vulnerable parts\n\t *  Critical hit on npc uses a different set of res values\n\t *  A damage is critical on the player (ignores res) if the array contains the \"Critical\" name\n\t */\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere)\n\tTSet<FName> AssociatedBones;\n};\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUSTRUCT(BlueprintType, Blueprintable)\nstruct FSoRootMotionDesc\n{\n\tGENERATED_USTRUCT_BODY()\n\npublic:\n\n\t// defines if the given components of the root motion are ignored or not\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere)\n\tbool bHorizontalRootMotionEnabled = false;\n\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere)\n\tbool bVerticalRootMotionEnabled = false;\n\n\t// applied to the extracted values\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere)\n\tfloat Multiplier = 1.0f;\n};\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// UENUM(BlueprintType)\n// enum class ESoDamageType : uint8\n// {\n// \t// physical\n// \tEDT_Crush = 0\t\t\tUMETA(DisplayName = \"Crush\"),\n// \tEDT_Slash\t\t\t\tUMETA(DisplayName = \"Slash\"),\n// \t// magical\n// \tEDT_WarmMagic\t\t\tUMETA(DisplayName = \"WarmMagic\"),\n// \tEDT_ColdMagic\t\t\tUMETA(DisplayName = \"ColdMagic\"),\n//\n// \tEDT_Overlap\t\t\t\tUMETA(DisplayName = \"Overlap\"),\n//\n// \tEDT_MAX\t\t\t\t\tUMETA(Hidden),\n// };\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// NOTE: Don't ever rename this to ESoDamageType as it used t be that way\nUENUM(BlueprintType)\nenum class ESoDmgType : uint8\n{\n\tNone = 0\t\t\t\tUMETA(DisplayName = \"None\"),\n\t\n\tPhysical \t\t\t\tUMETA(DisplayName = \"Physical\"),\n\tMagic\t\t\t\t\tUMETA(DisplayName = \"Magical\"),\n\tMixed\t\t\t\t\tUMETA(DisplayName = \"Mixed\"),\n\n\tMax\t\t\t\t\t\tUMETA(Hidden),\n};\n\n////////////////////////////////////////////////////////////////////////////////////////\n// New damage type\nUSTRUCT(BlueprintType, Blueprintable)\nstruct FSoDmg\n{\n\tGENERATED_USTRUCT_BODY()\n\npublic:\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere)\n\tfloat Physical = 0.0f;\n\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere)\n\tfloat Magical = 0.0f;\n\npublic:\n\n\tFSoDmg operator*(const FSoDmg& Other) const;\n\tFSoDmg operator*(float Multiplier) const;\n\tvoid operator*=(const FSoDmg& Other);\n\tvoid operator*=(float Multiplier);\n\tFSoDmg operator+(const FSoDmg& Other) const;\n\tvoid operator+=(const FSoDmg& Other);\n\tfloat operator[](int32 Index) const;\n\n\tFSoDmg OneMinus() const;\n\tfloat Sum() const;\n\tESoDmgType GetType() const;\n\tbool HasPhysical() const;\n\tbool HasMagical() const;\n\tvoid SetToZero();\n};\n\n////////////////////////////////////////////////////////////////////////////////////////\nUSTRUCT(BlueprintType, Blueprintable)\nstruct FSoMeleeHitParam\n{\n\tGENERATED_USTRUCT_BODY()\n\npublic:\n\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere)\n\tFSoDmg Dmg;\n\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere)\n\tTArray<TSubclassOf<USoEffectBase>> Effects;\n\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere)\n\tFSoHitReactDesc HitReactDesc;\n\t\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere)\n\tFHitResult Hit;\n\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere)\n\tbool bBlockable = false;\n\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere)\n\tbool bCritical = false;\n\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere)\n\tUParticleSystem* ImpactFX = nullptr;\n};\n\n\n/**\n *   Helper struct used to animate material properties \n */\nUSTRUCT(BlueprintType, Blueprintable)\nstruct FSoMaterialAnimationEntry\n{\n\tGENERATED_USTRUCT_BODY()\npublic:\n\n\t/** Animation Curve, evalueated between 0 and 1 */\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere)\n\tUCurveFloat* ScalarCurve = nullptr;\n\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere)\n\tUCurveLinearColor* ColorCurve = nullptr;\n\n\t/** length of material animation */\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere)\n\tfloat Duration = 0.f;\n\n\t/** name of material we have to animate */\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere)\n\tFName MaterialParameterName;\n\n\t// all material is modified if the set is empty, only selected indices otherwise\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere)\n\tTSet<int32> MaterialIndexList;\n\n\tUPROPERTY(BlueprintReadWrite)\n\tfloat Counter = 1000.0f;\n\n\tUPROPERTY(BlueprintReadWrite)\n\tbool bPlayForward = true;\n\n\tUPROPERTY(BlueprintReadWrite)\n\tfloat PlaySpeed = 1.0f;\n\n\tUPROPERTY(BlueprintReadWrite)\n\tTArray<UParticleSystemComponent*> TargetOverridePS;\n};\n"
  },
  {
    "path": "Source/SOrb/CharacterBase/SoMortal.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#include \"SoMortal.h\"\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUSoMortal::USoMortal(const FObjectInitializer& PCIP)\n\t: Super(PCIP)\n{\n\n}\n"
  },
  {
    "path": "Source/SOrb/CharacterBase/SoMortal.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#pragma once\n\n#include \"CharacterBase/SoIMortalTypes.h\"\n#include \"UObject/Interface.h\"\n#include \"SoMortal.generated.h\"\n\nDECLARE_DYNAMIC_DELEGATE(FSoOnMortalNoParam);\nDECLARE_DYNAMIC_MULTICAST_DELEGATE(FSoOnMortalNoParamMulti);\n\nDECLARE_DYNAMIC_DELEGATE_TwoParams(FSoOnMeleeHit, AActor*, Actor, const FSoMeleeHitParam&, Param);\nDECLARE_DYNAMIC_MULTICAST_DELEGATE_TwoParams(FSoOnMeleeHitMulti, AActor*, Actor, const FSoMeleeHitParam&, Param);\n\nDECLARE_DYNAMIC_DELEGATE_TwoParams(FSoOnHit, const FSoDmg&, Dmg, const FSoHitReactDesc&, Param);\nDECLARE_DYNAMIC_MULTICAST_DELEGATE_TwoParams(FSoOnHitMulti, const FSoDmg&, Dmg, const FSoHitReactDesc&, Param);\n\nDECLARE_DYNAMIC_DELEGATE_OneParam(FSoNotifyActorSingle, AActor*, Actor);\nDECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FSoNotifyActor, AActor*, Actor);\n\n/**\n*\n*/\nUINTERFACE(BlueprintType, Blueprintable)\nclass SORB_API USoMortal : public UInterface\n{\n\tGENERATED_UINTERFACE_BODY()\n\n};\n\n\n/**\n * interface for damageable entities\n * both C++ and Blueprint classes can implement and use the interface\n */\nclass SORB_API ISoMortal\n{\n\tGENERATED_IINTERFACE_BODY()\n\n\n\tUFUNCTION(BlueprintNativeEvent, BlueprintCallable, Category = Health)\n\tbool IsAlive() const;\n\n\tUFUNCTION(BlueprintNativeEvent, BlueprintCallable, Category = Health)\n\tbool NeedsHeal() const;\n\n\tUFUNCTION(BlueprintNativeEvent, BlueprintCallable, Category = Health)\n\tbool HasInvulnerability() const;\n\n\tUFUNCTION(BlueprintNativeEvent, BlueprintCallable, Category = Health)\n\tbool IsBounceAble() const;\n\n\t/**\n\t * Attack tries to simply destroy target no matter what\n\t *\n\t * @param\tbPhysical\t\t\tDamage type for statistics/log\n\t */\n\tUFUNCTION(BlueprintNativeEvent, BlueprintCallable, Category = Health)\n\tvoid Kill(bool bPhysical);\n\n\n\t/**\n\t * Causes some damage with different damage types\n\t * Resistance/immunity may still applied to the input by the receiver\n\t */\n\tUFUNCTION(BlueprintNativeEvent, BlueprintCallable, Category = Health)\n\tvoid CauseDmg(const FSoDmg& Dmg, const FSoHitReactDesc& HitReactDesc);\n\n\t/**\n\t * Causes some damage with different damage types\n\t * Resistance/immunity may still applied to the input by the receiver\n\t *\n\t * @param\tHitParam\t\tstruct describing the hit params, may change in the future\n\t * @return\ttrue: successful hit, false: blocked (it may or may not interrupt the attacker)\n\t */\n\t// return value ? hit : blocked\n\tUFUNCTION(BlueprintNativeEvent, BlueprintCallable, Category = Health)\n\tbool MeleeHit(const FSoMeleeHitParam& HitParam);\n\n\t/**\n\t * Restores health\n\t *\n\t * @param\tbAll\tTrue -> HP is restored to max\n\t * @param\tfDelta\t!bAll -> HP is increased with fDelta (can't be more than max)\n\t */\n\tUFUNCTION(BlueprintNativeEvent, BlueprintCallable, Category = Health)\n\tvoid Heal(bool bAll = true, float Delta = 0.0f);\n\n\n\tUFUNCTION(BlueprintNativeEvent, BlueprintCallable, Category = Effect)\n\tvoid ApplyEffect(TSubclassOf<USoEffectBase> EffectClass, bool bApply = true);\n\n\n\tUFUNCTION(BlueprintNativeEvent, BlueprintCallable, Category = MortalEvent)\n\tbool SubscribeOnDied(const FSoOnMortalNoParam& OnDeath, bool bSubscribe = true);\n\n\tUFUNCTION(BlueprintNativeEvent, BlueprintCallable, Category = MortalEvent)\n\tbool SubscribeOnSpellsReset(const FSoOnMortalNoParam& OnSpellsReset, bool bSubscribe = true);\n\n\tUFUNCTION(BlueprintNativeEvent, BlueprintCallable, Category = MortalEvent)\n\tbool SubscribeOnMeleeHit(const FSoOnMeleeHit& OnMeleeHit, bool bSubscribe = true);\n\n\tUFUNCTION(BlueprintNativeEvent, BlueprintCallable, Category = MortalEvent)\n\tbool SubscribeOnMeleeHitTaken(const FSoOnMeleeHit& OnMeleeHit, bool bSubscribe = true);\n\n\tUFUNCTION(BlueprintNativeEvent, BlueprintCallable, Category = MortalEvent)\n\tbool SubscribeOnHitTaken(const FSoOnHit& OnHit, bool bSubscribe = true);\n\n\tUFUNCTION(BlueprintNativeEvent, BlueprintCallable, Category = MortalEvent)\n\tbool SubscribeOnWalkThroughMortal(const FSoNotifyActorSingle& OnWalkThrough, bool bSubscribe = true);\n\n\n\tUFUNCTION(BlueprintNativeEvent, BlueprintCallable, Category = VisualStuff)\n\tvoid OnStatusEffectChanged(ESoStatusEffect Effect, bool bGained);\n\n\tUFUNCTION(BlueprintNativeEvent, BlueprintCallable, Category = VisualStuff)\n\tvoid DisplayVisualEffect(ESoVisualEffect Effect);\n\n\tUFUNCTION(BlueprintNativeEvent, BlueprintCallable, Category = VisualStuff)\n\tFVector GetEffectAttachLocation();\n};\n"
  },
  {
    "path": "Source/SOrb/CharacterBase/SoVoiceUser.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#include \"SoVoiceUser.h\"\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUSoVoiceUser::USoVoiceUser(const FObjectInitializer& PCIP)\n\t: Super(PCIP)\n{\n\n}\n"
  },
  {
    "path": "Source/SOrb/CharacterBase/SoVoiceUser.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#pragma once\n\n#include \"UObject/Interface.h\"\n#include \"SoVoiceUser.generated.h\"\n\n\nclass USceneComponent;\n\nUENUM()\nenum class ESoVoiceType : uint8\n{\n\tSoVoiceTypeIdle = 0\t\tUMETA(DisplayName = \"Idle\"),\n\tSoVoiceTypeHitReact\t\tUMETA(DisplayName = \"HitReact\"),\n\tSoVoiceTypeDeath\t\tUMETA(DisplayName = \"Death\"),\n\tSoVoiceTypeAttack\t\tUMETA(DisplayName = \"Attack\"),\n\tSoVoiceTypeNoise\t\tUMETA(DisplayName = \"Noise\")\n};\n\n\n/**\n*\n*/\nUINTERFACE(BlueprintType, Blueprintable)\nclass SORB_API USoVoiceUser : public UInterface\n{\n\tGENERATED_UINTERFACE_BODY()\n\n};\n\n\n/**\n * interface for damageable entities\n * both C++ and Blueprint classes can implement and use the interface\n */\nclass SORB_API ISoVoiceUser\n{\n\tGENERATED_IINTERFACE_BODY()\n\n\t/** Used for voice and text location */\n\tUFUNCTION(BlueprintNativeEvent, BlueprintCallable, Category = Voice)\n\tUSceneComponent* GetComponent() const;\n\n\t/** Used for voice and text location */\n\tUFUNCTION(BlueprintNativeEvent, BlueprintCallable, Category = Voice)\n\tFName GetSocketName() const;\n\n\t/** depends on random if vo should be spawned or not */\n\tUFUNCTION(BlueprintNativeEvent, BlueprintCallable, Category = Voice)\n\tbool ShouldSpawnVO(ESoVoiceType VoiceType) const;\n};\n"
  },
  {
    "path": "Source/SOrb/Effects/SoEffectBase.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#include \"SoEffectBase.h\"\n#include \"GameFramework/Actor.h\"\n\n#include \"CharacterBase/SoMortal.h\"\n#include \"Basic/Helpers/SoStaticHelper.h\"\n#include \"Basic/Helpers/SoStringHelper.h\"\n#include \"Online/Achievements/SoAchievementManager.h\"\n\nDEFINE_LOG_CATEGORY(LogSoEffectSystem);\n\nFString USoEffectBase::TextNamespace(TEXT(\"EffectInstance\"));\n\n\n#if WITH_EDITOR\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoEffectBase::PreSave(const ITargetPlatform* TargetPlatform)\n{\n\tUpdateLocalizedFields();\n\tSuper::PreSave(TargetPlatform);\n}\n#endif // WITH_EDITOR\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoEffectBase::UpdateLocalizedFields()\n{\n\tconst FString ObjectName = USoStringHelper::GetObjectBaseName(this);\n\tDisplayName = FInternationalization::ForUseOnlyByLocMacroAndGraphNodeTextLiterals_CreateText(\n\t\t*DisplayName.ToString(),\n\t\t*TextNamespace,\n\t\t*(ObjectName + \"_name\")\n\t);\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoEffectBase::CanBeApplied_Implementation(AActor* TargetOwner)\n{\n\treturn true;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoEffectBase::Apply(AActor* InOwner)\n{\n\tDECLARE_SCOPE_CYCLE_COUNTER(TEXT(\"Apply\"), STAT_Apply, STATGROUP_SoEffect);\n\n#if WITH_EDITOR\n\tif (InOwner == nullptr)\n\t{\n\t\tUE_LOG(LogSoEffectSystem, Error, TEXT(\"USoEffectBase::Apply called on nullptr!\"));\n\t\treturn false;\n\t}\n\n\tif (!InOwner->GetClass()->ImplementsInterface(USoMortal::StaticClass()))\n\t{\n\t\tUE_LOG(LogSoEffectSystem, Error, TEXT(\"USoEffectBase::Apply called on %s but it does not implement the appropriate interface!\"), *InOwner->GetName());\n\t\treturn false;\n\t}\n#endif\n\n\tOwner = InOwner;\n\n\tCounter = 0.0f;\n\tCountNum = 0;\n\n\tOnApplied();\n\n\treturn EffectType != ESoEffectType::EET_Instant;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoEffectBase::Reapply_Implementation()\n{\n\tswitch (EffectType)\n\t{\n\t\tcase ESoEffectType::EET_TimeBased:\n\t\t\tCounter = 0.0f;\n\t\t\treturn true;\n\n\t\tcase ESoEffectType::EET_Counted:\n\t\t\tCountNum = 0;\n\t\t\treturn true;\n\n\t\tdefault:\n\t\t\treturn false;\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoEffectBase::Tick(float DeltaSeconds)\n{\n\tDECLARE_SCOPE_CYCLE_COUNTER(TEXT(\"Tick\"), STAT_Tick, STATGROUP_SoEffect);\n\n\tconst float RealTick = EffectType == ESoEffectType::EET_TimeBased ? FMath::Min(DeltaSeconds, Duration - Counter) : DeltaSeconds;\n\tCounter += DeltaSeconds;\n\n\tif (bKidWantsOnTick)\n\t\tOnTick(RealTick);\n\n\tif (EffectType == ESoEffectType::EET_TimeBased && Counter > Duration)\n\t{\n\t\tOnDurationOver();\n\t\treturn false;\n\t}\n\n\tif (EffectType == ESoEffectType::EET_Counted && CountNum >= MaxCount)\n\t{\n\t\tOnDurationOver();\n\t\treturn false;\n\t}\n\n\treturn true;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoEffectBase::IncreaseCount()\n{\n\tCountNum += 1;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoEffectBase::PrintMessage(const FString& TextToPrint)\n{\n\tUE_LOG(LogSoEffectSystem, Error, TEXT(\"%s\"), *TextToPrint);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoEffectBase::PrintError(const FString& TextToPrint, bool bJustWarning)\n{\n\tif (bJustWarning)\n\t\tUE_LOG(LogSoEffectSystem, Warning, TEXT(\"%s\"), *TextToPrint)\n\telse\n\t\tUE_LOG(LogSoEffectSystem, Error, TEXT(\"%s\"), *TextToPrint);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nASoCharacter* USoEffectBase::GetSoChar()\n{\n\treturn USoStaticHelper::GetPlayerCharacterAsSoCharacter(Owner);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoEffectBase::UnlockAchievement(AActor* WorldContext, FName Name)\n{\n\tif (WorldContext != nullptr)\n\t\tUSoAchievementManager::Get(WorldContext).UnlockAchievement(WorldContext, Name);\n\telse\n\t{\n\t\tif (Owner != nullptr)\n\t\t\tUSoAchievementManager::Get(Owner).UnlockAchievement(Owner, Name);\n\t\telse\n\t\t\tUE_LOG(LogSoEffectSystem, Warning, TEXT(\"Failed to unlock achievement: %s in USoEffectBase::UnlockAchievement, no valid world context!\"), *Name.ToString())\n\t}\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nfloat USoEffectBase::GetPercent()\n{\n\tif (EffectType == ESoEffectType::EET_Counted)\n\t\treturn FMath::Clamp(CountNum / static_cast<float>(MaxCount), 0.0f, 1.0f);\n\n\treturn FMath::Clamp(Counter / Duration, 0.0f, 1.0f);\n}\n"
  },
  {
    "path": "Source/SOrb/Effects/SoEffectBase.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#pragma once\n\n#include \"Engine/EngineTypes.h\"\n\n#include \"CharacterBase/SoIMortalTypes.h\"\n\n#include \"SoEffectBase.generated.h\"\n\nclass ASoCharacter;\n\nDECLARE_LOG_CATEGORY_EXTERN(LogSoEffectSystem, Log, All);\n\nDECLARE_STATS_GROUP(TEXT(\"SoEffect\"), STATGROUP_SoEffect, STATCAT_Advanced);\n\n////////////////////////////////////////////////////////////////////////////////////////\nUENUM(BlueprintType)\nenum class ESoEffectType : uint8\n{\n\t/** effect dies after Duration sec */\n\tEET_TimeBased\t\t\tUMETA(DisplayName = \"TimeBased\"),\n\t/** one time effect */\n\tEET_Instant\t\t\t\tUMETA(DisplayName = \"Instant\"),\n\t/** effect is on as long as it is not removed */\n\tEET_Item\t\t\t\tUMETA(DisplayName = \"Item\"),\n\t/** effect is used when *something* happens, child has to update the *something* counter */\n\tEET_Counted\t\t\t\tUMETA(DisplayName = \"Counted\"),\n\n\tEET_NumOf\t\t\t\tUMETA(Hidden)\n};\n\nUENUM(BlueprintType)\nenum class ESoDisplayText : uint8\n{\n\tEDT_Immune\t\t\tUMETA(DisplayName = \"Immune\"),\n\tEDT_Resisted\t\tUMETA(DisplayName = \"Resisted\"),\n\tEDT_SecondChance\tUMETA(DisplayName = \"Second Chance\"),\n\tEDT_Blocked\t\t\tUMETA(DisplayName = \"Blocked\"),\n\tEDT_Infected\t\tUMETA(DisplayName = \"Infected\"),\n\n\tEDT_NoNeadForHeal\tUMETA(DisplayName = \"NoNeedForHeal\"),\n\tEDT_MissingTarget\tUMETA(DisplayName = \"MissingTarget\"),\n\n\tEDT_CantUseInSKFreeZone\t\tUMETA(DisplayName = \"CantUseSKFreeZone\"),\n\tEDT_CantUseInAir\t\t\tUMETA(DisplayName = \"CantUseInAir\"),\n\n\tEDT_SpellRegained\t\t\tUMETA(DisplayName = \"SpellRegained\"),\n\tEDT_InstantRecharge\t\t\tUMETA(DisplayName = \"InstantRecharge\"),\n\n\tEDT_HPGained\t\t\t\tUMETA(DisplayName = \"HPGained\"),\n\tEDT_SpellCapacityGained\t\tUMETA(DisplayName = \"SpellCapacityGained\"),\n\n\tEDT_Max\t\t\t\tUMETA(DisplayName = \"Invalid\") // Merch actually uses it now rofl\n};\n\n\n/**\n *\n */\nUCLASS(Blueprintable, BlueprintType, Abstract)\nclass SORB_API USoEffectBase : public UObject\n{\n\tGENERATED_BODY()\n\npublic:\n#if WITH_EDITOR\n\tvoid PreSave(const ITargetPlatform* TargetPlatform) override;\n#endif // WITH_EDITOR\n\n\tUFUNCTION(BlueprintNativeEvent, Category = General)\n\tbool CanBeApplied(AActor* TargetOwner);\n\n\tESoDisplayText GetCantBeAppliedReason() const { return CantBeAppliedReason; }\n\n\t/** Return false: remove */\n\tbool Apply(AActor* InOwner);\n\n\t/** called on timebased/counted effects if another is applied from the same type */\n\tUFUNCTION(BlueprintNativeEvent, Category = General)\n\tbool Reapply();\n\n\t/** Called when the effect is forced stopped - e.g. some has to be if the owner ends up dead, item based if item is removed, etc. */\n\tUFUNCTION(BlueprintImplementableEvent, Category = General)\n\tvoid Interrupt();\n\n\t// functions called after construction to decide what functions will be called on this instance\n\tbool ShouldReceiveTick() const { return bKidWantsOnTick || EffectType == ESoEffectType::EET_TimeBased || EffectType == ESoEffectType::EET_Counted; }\n\n\tbool ShouldReceiveNotifyOnDeath() const { return bGetNotifyOnDeath; }\n\tbool ShouldBeDestroyedOnSpellReset() const { return bBeDestroyedOnSpellsReset; }\n\tbool ShouldBeDestroyedOnDeath() const { return bBeDestroyedOnDeath; }\n\n\tbool ShouldReceiveNotifyOnMeleeHit() const { return bGetNotifyOnMeleeHit; }\n\tbool ShouldReceiveNotifyOnMeleeHitTaken() const { return bGetNotifyOnMeleeHitTaken; }\n\tbool ShouldReceiveNotifyOnHitTaken() const { return bGetNotifyOnHitTaken; }\n\tbool ShouldReceiveNotifyOnWalkThroughEnemies() const { return bGetNotifyOnWalkThroughEnemies; }\n\n\tESoEffectType GetEffectType() const { return EffectType; }\n\n\t/** optional functions */\n\n\t/** Return false: has to be removed */\n\tbool Tick(float DeltaSeconds);\n\n\n\tUFUNCTION(BlueprintImplementableEvent, Category = General)\n\tvoid OnOwnerDeath();\n\n\tUFUNCTION(BlueprintImplementableEvent, Category = General)\n\tvoid OnOwnerMeleeHit(AActor* Target, const FSoMeleeHitParam& Param);\n\n\tUFUNCTION(BlueprintImplementableEvent, Category = General)\n\tvoid OnOwnerMeleeHitTaken(const FSoMeleeHitParam& Param);\n\n\tUFUNCTION(BlueprintImplementableEvent, Category = General)\n\tvoid OnOwnerHitTaken(const FSoDmg& Dmg, const FSoHitReactDesc& HitReact);\n\n\tUFUNCTION(BlueprintImplementableEvent, Category = General)\n\tvoid OnWalkThroughMortal(AActor* Mortal);\n\n\tUFUNCTION(BlueprintPure, Category = \"General\")\n\tUTexture2D* GetEffectIcon() { return DisplayIcon; }\n\n\t/** works with time based effects, returns 1.0f at start and 0.0f at the end */\n\tUFUNCTION(BlueprintPure, Category = TimeBased)\n\tfloat GetPercent();\n\n\tconst TArray<TSubclassOf<USoEffectBase>>& GetEffectsToRemoveOnApply() const { return EffectsToRemoveOnApply; }\n\nprotected:\n\n\tUFUNCTION(BlueprintImplementableEvent, Category = General)\n\tvoid OnTick(float DeltaSeconds);\n\n\tUFUNCTION(BlueprintImplementableEvent, Category = General)\n\tvoid OnApplied();\n\n\t/** called when a timebased or counted effect is finished */\n\tUFUNCTION(BlueprintImplementableEvent, Category = \"TimeBased\")\n\tvoid OnDurationOver();\n\n\tUFUNCTION(BlueprintCallable, Category = \"Counted\")\n\tvoid IncreaseCount();\n\n\tUFUNCTION(BlueprintCallable, Category = \"Counted\")\n\tvoid PrintMessage(const FString& TextToPrint);\n\n\tUFUNCTION(BlueprintCallable, Category = \"Counted\")\n\tvoid PrintError(const FString& TextToPrint, bool bJustWarning = false);\n\n\tUFUNCTION(BlueprintPure, Category = \"Helper\")\n\tASoCharacter* GetSoChar();\n\n\tUFUNCTION(BlueprintCallable, Category = \"Helper\")\n\tvoid UnlockAchievement(AActor* WorldContext, FName Name);\n\n\tvirtual void UpdateLocalizedFields();\n\nprotected:\n\n\tUPROPERTY(EditAnywhere, BlueprintReadOnly, Category = \"General\")\n\tESoEffectType EffectType;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadOnly, Category = \"General\")\n\tbool bKidWantsOnTick = false;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadOnly, Category = \"General\")\n\tbool bBeDestroyedOnDeath = true;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadOnly, Category = \"General\")\n\tbool bGetNotifyOnDeath = false;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadOnly, Category = \"General\")\n\tbool bBeDestroyedOnSpellsReset = false;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadOnly, Category = \"General\")\n\tbool bGetNotifyOnMeleeHit = false;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadOnly, Category = \"General\")\n\tbool bGetNotifyOnMeleeHitTaken = false;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadOnly, Category = \"General\")\n\tbool bGetNotifyOnHitTaken = false;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadOnly, Category = \"General\")\n\tbool bGetNotifyOnWalkThroughEnemies = false;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadOnly, Category = \"General\")\n\tTArray<TSubclassOf<USoEffectBase>> EffectsToRemoveOnApply;\n\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = \"TimeBased\")\n\tfloat Duration = 0.0f;\n\n\tfloat Counter = 0.0f;\n\n\n\tUPROPERTY(EditAnywhere, BlueprintReadOnly, Category = \"Counted\")\n\tint32 MaxCount = 1;\n\n\t/** how much time happened the counted effect already */\n\tint32 CountNum = 0;\n\n\t/** Owner, has to implement USoMortal interface with a valid GetCharacterSheet() override */\n\tUPROPERTY(BlueprintReadOnly, Category = \"General\")\n\tAActor* Owner = nullptr;\n\n\n\tUPROPERTY(EditAnywhere, BlueprintReadOnly, Category = \"General|UI\")\n\tUTexture2D* DisplayIcon = nullptr;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadOnly, Category = \"General|UI\")\n\tFLinearColor DisplayIconColor = FLinearColor{ 1.0f, 1.0f, 1.0f, 1.0f };\n\n\t/** tooltip line */\n\tUPROPERTY(EditAnywhere, BlueprintReadOnly, Category = \"General|UI\")\n\tFText DisplayName;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadOnly, Category = \"General|UI\")\n\tESoDisplayText CantBeAppliedReason = ESoDisplayText::EDT_Max;\n\n\t// Used for all FTexts\n\tstatic FString TextNamespace;\n};\n"
  },
  {
    "path": "Source/SOrb/Effects/SoEffectHandlerComponent.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#include \"SoEffectHandlerComponent.h\"\n#include \"GameFramework/Actor.h\"\n\n#include \"SoEffectBase.h\"\n#include \"CharacterBase/SoMortal.h\"\n#include \"Basic/SoGameInstance.h\"\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// Sets default values for this component's properties\nUSoEffectHandlerComponent::USoEffectHandlerComponent()\n{\n\tPrimaryComponentTick.bCanEverTick = true;\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoEffectHandlerComponent::BeginPlay()\n{\n\tSuper::BeginPlay();\n\n\tif (!GetOwner()->GetClass()->ImplementsInterface(USoMortal::StaticClass()))\n\t{\n\t\tUE_LOG(LogSoEffectSystem, Error, TEXT(\"USoEffectHandlerComponent owner *has to* implement USoMortal!\"));\n\t\treturn;\n\t}\n\n\tOnOwnerDeathSubscription.BindUFunction(this, FName(\"OnOwnerDeath\"));\n\tISoMortal::Execute_SubscribeOnDied(GetOwner(), OnOwnerDeathSubscription, true);\n\n\tOnOwnerSpellsResetedSubscription.BindUFunction(this, FName(\"OnOwnerSpellsReset\"));\n\tISoMortal::Execute_SubscribeOnSpellsReset(GetOwner(), OnOwnerSpellsResetedSubscription, true);\n\n\tOnOwnerMeleeHitSubscription.BindUFunction(this, FName(\"OnOwnerMeleeHit\"));\n\tISoMortal::Execute_SubscribeOnMeleeHit(GetOwner(), OnOwnerMeleeHitSubscription, true);\n\n\tOnOwnerMeleeHitTakenSubscription.BindUFunction(this, FName(\"OnOwnerMeleeHitTaken\"));\n\tISoMortal::Execute_SubscribeOnMeleeHitTaken(GetOwner(), OnOwnerMeleeHitTakenSubscription, true);\n\n\tOnOwnerHitTakenSubscription.BindUFunction(this, FName(\"OnOwnerHitTaken\"));\n\tISoMortal::Execute_SubscribeOnHitTaken(GetOwner(), OnOwnerHitTakenSubscription, true);\n\n\tOnWalkThroughMortalListSubscription.BindUFunction(this, FName(\"OnWalkThroughMortal\"));\n\tISoMortal::Execute_SubscribeOnWalkThroughMortal(GetOwner(), OnWalkThroughMortalListSubscription, true);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoEffectHandlerComponent::EndPlay(const EEndPlayReason::Type EndPlayReason)\n{\n\tSuper::EndPlay(EndPlayReason);\n\n\tISoMortal::Execute_SubscribeOnDied(GetOwner(), OnOwnerDeathSubscription, false);\n\tISoMortal::Execute_SubscribeOnSpellsReset(GetOwner(), OnOwnerSpellsResetedSubscription, false);\n\tISoMortal::Execute_SubscribeOnMeleeHit(GetOwner(), OnOwnerMeleeHitSubscription, false);\n\tISoMortal::Execute_SubscribeOnMeleeHitTaken(GetOwner(), OnOwnerMeleeHitTakenSubscription, false);\n\tISoMortal::Execute_SubscribeOnHitTaken(GetOwner(), OnOwnerHitTakenSubscription, false);\n\tISoMortal::Execute_SubscribeOnWalkThroughMortal(GetOwner(), OnWalkThroughMortalListSubscription, false);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoEffectHandlerComponent::TickComponent(float DeltaTime, ELevelTick TickType, FActorComponentTickFunction* ThisTickFunction)\n{\n\tDECLARE_SCOPE_CYCLE_COUNTER(TEXT(\"Handler - TickComponent\"), STAT_Handler_TickComponent, STATGROUP_SoEffect);\n\n\tSuper::TickComponent(DeltaTime, TickType, ThisTickFunction);\n\n\tfor (int32 Index = EffectsToTick.Num() - 1; Index >= 0; --Index)\n\t\tif (!EffectsToTick[Index]->Tick(DeltaTime))\n\t\t\tRemoveEffect_Internal(EffectsToTick[Index], false);\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoEffectHandlerComponent::AddEffect(const TSubclassOf<USoEffectBase>& EffectClass)\n{\n\tDECLARE_SCOPE_CYCLE_COUNTER(TEXT(\"Handler - AddEffect\"), STAT_Handler_AddEffect, STATGROUP_SoEffect);\n\n\t// only one timebased/counted effect can be used from the same type\n\tfor (USoEffectBase* Effect : ActiveEffects)\n\t\tif (Effect->GetClass() == EffectClass &&\n\t\t   (Effect->GetEffectType() == ESoEffectType::EET_TimeBased || Effect->GetEffectType() == ESoEffectType::EET_Counted))\n\t\t{\n\t\t\tif (Effect->Reapply())\n\t\t\t\treturn;\n\t\t}\n\n\tUSoEffectBase* Effect = USoGameInstance::Get(GetOwner()).ClaimEffect(EffectClass);\n\n\tfor (const auto& EffectClassToRemove : Effect->GetEffectsToRemoveOnApply())\n\t\tRemoveEffect(EffectClassToRemove);\n\n\tif (Effect->Apply(GetOwner()))\n\t{\n\t\tActiveEffects.Add(Effect);\n\n\t\tif (Effect->ShouldReceiveTick())\n\t\t\tEffectsToTick.Add(Effect);\n\n\t\tif (Effect->ShouldReceiveNotifyOnMeleeHit())\n\t\t\tOnMeleeHitNotifyList.Add(Effect);\n\n\t\tif (Effect->ShouldReceiveNotifyOnMeleeHitTaken())\n\t\t\tOnMeleeHitTakenNotifyList.Add(Effect);\n\n\t\tif (Effect->ShouldReceiveNotifyOnHitTaken())\n\t\t\tOnHitTakenNotifyList.Add(Effect);\n\n\t\tif (Effect->ShouldReceiveNotifyOnWalkThroughEnemies())\n\t\t\tOnWalkThroughMortalList.Add(Effect);\n\n\t\tOnEffectStateChanged.Broadcast(Effect, true);\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoEffectHandlerComponent::RemoveEffect(const TSubclassOf<USoEffectBase>& EffectClass)\n{\n\tDECLARE_SCOPE_CYCLE_COUNTER(TEXT(\"Handler - RemoveEffect\"), STAT_Handler_RemoveEffect, STATGROUP_SoEffect);\n\n\tfor (int32 i = 0; i < ActiveEffects.Num(); ++i)\n\t\tif (ActiveEffects[i]->GetClass() == EffectClass)\n\t\t{\n\t\t\tRemoveEffect_Internal(ActiveEffects[i], true);\n\t\t\treturn;\n\t\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoEffectHandlerComponent::HasEffect(const TSubclassOf<USoEffectBase>& EffectClass)\n{\n\tfor (int32 i = 0; i < ActiveEffects.Num(); ++i)\n\t\tif (ActiveEffects[i]->GetClass() == EffectClass)\n\t\t\treturn true;\n\n\treturn false;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUSoEffectBase* USoEffectHandlerComponent::GetEffect(const TSubclassOf<USoEffectBase>& EffectClass)\n{\n\tfor (int32 i = 0; i < ActiveEffects.Num(); ++i)\n\t\tif (ActiveEffects[i]->GetClass() == EffectClass)\n\t\t\treturn ActiveEffects[i];\n\n\treturn nullptr;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoEffectHandlerComponent::GetEffects(const TSubclassOf<USoEffectBase>& EffectClass, TArray<USoEffectBase*>& OutEffects)\n{\n\tOutEffects.Empty();\n\n\tfor (int32 i = 0; i < ActiveEffects.Num(); ++i)\n\t\tif (ActiveEffects[i]->GetClass() == EffectClass)\n\t\t\tOutEffects.Add(ActiveEffects[i]);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoEffectHandlerComponent::OnOwnerMeleeHit(AActor* Target, const FSoMeleeHitParam& Param)\n{\n\tfor (USoEffectBase* Effect : OnMeleeHitNotifyList)\n\t\tEffect->OnOwnerMeleeHit(Target, Param);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoEffectHandlerComponent::OnOwnerMeleeHitTaken(AActor* Source, const FSoMeleeHitParam& Param)\n{\n\tfor (USoEffectBase* Effect : OnMeleeHitTakenNotifyList)\n\t\tEffect->OnOwnerMeleeHitTaken(Param);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoEffectHandlerComponent::OnOwnerHitTaken(const FSoDmg& Dmg, const FSoHitReactDesc& Param)\n{\n\tfor (USoEffectBase* Effect : OnHitTakenNotifyList)\n\t\tEffect->OnOwnerHitTaken(Dmg, Param);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoEffectHandlerComponent::OnOwnerDeath()\n{\n\t// notify if necessary\n\tfor (USoEffectBase* Effect : ActiveEffects)\n\t\tif (Effect->ShouldReceiveNotifyOnDeath())\n\t\t\tEffect->OnOwnerDeath();\n\n\t// remove if necessary\n\tfor (int32 Index = ActiveEffects.Num() - 1; Index >= 0; --Index)\n\t\tif (ActiveEffects[Index]->ShouldBeDestroyedOnDeath())\n\t\t\tRemoveEffect_Internal(ActiveEffects[Index], true);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoEffectHandlerComponent::OnOwnerSpellsReset()\n{\n\t// remove if necessary\n\tfor (int32 Index = ActiveEffects.Num() - 1; Index >= 0; --Index)\n\t\tif (ActiveEffects[Index]->ShouldBeDestroyedOnSpellReset())\n\t\t\tRemoveEffect_Internal(ActiveEffects[Index], true);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoEffectHandlerComponent::OnWalkThroughMortal(AActor* Mortal)\n{\n\tfor (USoEffectBase* Effect : OnWalkThroughMortalList)\n\t\tEffect->OnWalkThroughMortal(Mortal);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoEffectHandlerComponent::RemoveEffect_Internal(USoEffectBase* Effect, bool bInterrupt)\n{\n\tDECLARE_SCOPE_CYCLE_COUNTER(TEXT(\"Handler - RemoveEffect_Internal\"), STAT_Handler_RemoveEffect_Internal, STATGROUP_SoEffect);\n\n\tif (bInterrupt)\n\t\tEffect->Interrupt();\n\n\tOnEffectStateChanged.Broadcast(Effect, false);\n\n\tActiveEffects.Remove(Effect);\n\tEffectsToTick.Remove(Effect);\n\tOnMeleeHitNotifyList.Remove(Effect);\n\tOnMeleeHitTakenNotifyList.Remove(Effect);\n\tOnHitTakenNotifyList.Remove(Effect);\n\tOnWalkThroughMortalList.Remove(Effect);\n\n\tUSoGameInstance::Get(GetOwner()).ReturnEffect(Effect);\n}\n"
  },
  {
    "path": "Source/SOrb/Effects/SoEffectHandlerComponent.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#pragma once\n\n#include \"Components/ActorComponent.h\"\n#include \"CharacterBase/SoMortal.h\"\n#include \"SoEffectHandlerComponent.generated.h\"\n\n\nclass USoEffectBase;\n\nDECLARE_DYNAMIC_MULTICAST_DELEGATE_TwoParams(FSoEffectStateChanged, USoEffectBase*, Effect, bool, bActivated);\n\nUCLASS(ClassGroup=(Custom), meta=(BlueprintSpawnableComponent))\nclass SORB_API USoEffectHandlerComponent : public UActorComponent\n{\nGENERATED_BODY()\n\npublic:\n\t// Sets default values for this component's properties\n\tUSoEffectHandlerComponent();\n\n\t// Called when the game starts\n\tvirtual void BeginPlay() override;\n\tvirtual void EndPlay(const EEndPlayReason::Type EndPlayReason) override;\n\n\t// Called every frame\n\tvirtual void TickComponent(float DeltaTime, ELevelTick TickType, FActorComponentTickFunction* ThisTickFunction) override;\n\n\n\tvirtual void AddEffect(const TSubclassOf<USoEffectBase>& EffectClass);\n\tvirtual void RemoveEffect(const TSubclassOf<USoEffectBase>& EffectClass);\n\n\tUFUNCTION(BlueprintPure)\n\tbool HasEffect(const TSubclassOf<USoEffectBase>& EffectClass);\n\n\tUFUNCTION(BlueprintPure)\n\tUSoEffectBase* GetEffect(const TSubclassOf<USoEffectBase>& EffectClass);\n\n\tUFUNCTION(BlueprintPure)\n\tvoid GetEffects(const TSubclassOf<USoEffectBase>& EffectClass, TArray<USoEffectBase*>& OutEffects);\n\n\tUFUNCTION()\n\tvoid OnOwnerDeath();\n\n\tUFUNCTION()\n\tvoid OnOwnerMeleeHit(AActor* Target, const FSoMeleeHitParam& Param);\n\n\tUFUNCTION()\n\tvoid OnOwnerMeleeHitTaken(AActor* Source, const FSoMeleeHitParam& Param);\n\n\tUFUNCTION()\n\tvoid OnOwnerHitTaken(const FSoDmg& Dmg, const FSoHitReactDesc& Param);\n\n\tUFUNCTION()\n\tvoid OnOwnerSpellsReset();\n\n\tUFUNCTION()\n\tvoid OnWalkThroughMortal(AActor* Mortal);\n\nprotected:\n\n\tvoid RemoveEffect_Internal(USoEffectBase* Effect, bool bInterrupt);\n\nprotected:\n\n\tUPROPERTY(BlueprintAssignable)\n\tFSoEffectStateChanged OnEffectStateChanged;\n\n\t/** container containing all active effect */\n\tUPROPERTY()\n\tTArray<USoEffectBase*> ActiveEffects;\n\n\n\t/** container containing the effects the component has to tick */\n\tUPROPERTY()\n\tTArray<USoEffectBase*> EffectsToTick;\n\n\t/** container containing the effects the component has to notify on melee hit */\n\tUPROPERTY()\n\tTArray<USoEffectBase*> OnMeleeHitNotifyList;\n\n\t/** container containing the effects the component has to notify on melee hit taken */\n\tUPROPERTY()\n\tTArray<USoEffectBase*> OnMeleeHitTakenNotifyList;\n\n\tUPROPERTY()\n\tTArray<USoEffectBase*> OnHitTakenNotifyList;\n\n\tUPROPERTY()\n\tTArray<USoEffectBase*> OnWalkThroughMortalList;\n\nprivate:\n\tFSoOnMortalNoParam OnOwnerDeathSubscription;\n\tFSoOnMortalNoParam OnOwnerSpellsResetedSubscription;\n\tFSoOnMeleeHit OnOwnerMeleeHitSubscription;\n\tFSoOnMeleeHit OnOwnerMeleeHitTakenSubscription;\n\tFSoOnHit OnOwnerHitTakenSubscription;\n\tFSoNotifyActorSingle OnWalkThroughMortalListSubscription;\n};\n"
  },
  {
    "path": "Source/SOrb/Enemy/EActions/SoEAActionComposition.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#include \"SoEAActionComposition.h\"\n#include \"Enemy/SoEnemy.h\"\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nfloat USoEAActionChainElement::Evaluate(const ASoEnemy* Owner) const\n{\n\tconst float Value = USoEAction::Evaluate(Owner);\n\tif (Value > KINDA_SMALL_NUMBER)\n\t\treturn Value * PrimaryAction->Evaluate(Owner);\n\n\treturn Value;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoEAActionChainElement::Interrupt(ASoEnemy* Owner)\n{\n\tif (bPrimaryPhase)\n\t\tPrimaryAction->Interrupt(Owner);\n\telse\n\t{\n\t\tActiveSecondaryAction->Interrupt(Owner);\n\t\tActiveSecondaryAction = nullptr;\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoEAActionChainElement::IsInterruptible() const\n{\n\tif (bPrimaryPhase)\n\t\treturn PrimaryAction->IsInterruptible();\n\t\n\tif (ActiveSecondaryAction != nullptr)\n\t\treturn ActiveSecondaryAction->IsInterruptible();\n\n\treturn true;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoEAActionChainElement::OnEnter(ASoEnemy* Owner)\n{\n\tbPrimaryPhase = true;\n\tPrimaryAction->Start(Owner);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoEAActionChainElement::OnTick(float DeltaSeconds, ASoEnemy* Owner)\n{\n\tif (bPrimaryPhase)\n\t{\n\t\tconst bool bStillRuning = PrimaryAction->Tick(DeltaSeconds, Owner);\n\t\tif (!bStillRuning)\n\t\t{\n\t\t\tbPrimaryPhase = false;\n\t\t\tif (bPickFirstSecond)\n\t\t\t\tActiveSecondaryAction = Owner->GetFirstSatisfiedAction(SecondActions);\n\t\t\telse\n\t\t\t\tActiveSecondaryAction = Owner->ChooseActionFromList(SecondActions);\n\n\t\t\tif (ActiveSecondaryAction == nullptr)\n\t\t\t\treturn false;\n\n\t\t\tActiveSecondaryAction->Start(Owner);\n\t\t}\n\t\treturn true;\n\t}\n\t\n\tcheck(ActiveSecondaryAction);\n\treturn ActiveSecondaryAction->Tick(DeltaSeconds, Owner);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nfloat USoEAActionSequence::Evaluate(const ASoEnemy* Owner) const\n{\n\tif (ActionSequence.Num() == 0)\n\t\treturn 0.0f;\n\n\tconst float Value = USoEAction::Evaluate(Owner);\n\tif (Value > KINDA_SMALL_NUMBER)\n\t\treturn Value * ActionSequence[0]->Evaluate(Owner);\n\n\treturn Value;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoEAActionSequence::Interrupt(ASoEnemy* Owner)\n{\n\tif (ActionSequence.IsValidIndex(ActiveSequenceID))\n\t{\n\t\tActionSequence[ActiveSequenceID]->Interrupt(Owner);\n\t\tUE_LOG(LogSoEnemyAI, Display, TEXT(\"Action sequence interrupted!\"));\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoEAActionSequence::OnEnter(ASoEnemy* Owner)\n{\n\tActiveSequenceID = -1;\n\tLoopCounter = 0;\n\n\tif (ActionSequence.Num() == 0 || ActionSequence[0]->Evaluate(Owner) < KINDA_SMALL_NUMBER)\n\t\treturn;\n\n\tActionSequence[0]->Start(Owner);\n\tActiveSequenceID = 0;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoEAActionSequence::OnTick(float DeltaSeconds, ASoEnemy* Owner)\n{\n\tif (ActiveSequenceID < 0)\n\t\treturn false;\n\n\tconst bool bStillRuning = ActionSequence[ActiveSequenceID]->Tick(DeltaSeconds, Owner);\n\tif (bStillRuning)\n\t\treturn true;\n\n\tActiveSequenceID += 1;\n\n\tif (ActiveSequenceID == ActionSequence.Num())\n\t{\n\t\tLoopCounter += 1;\n\t\tif (LoopCounter >= LoopCount || \n\t\t\t(bCheckPreconditionEachLoop && (Evaluate(Owner) < KINDA_SMALL_NUMBER)))\n\t\t{\n\t\t\tActiveSequenceID = -1;\n\t\t\treturn false;\n\t\t}\n\t\t\n\t\tActiveSequenceID = 0;\n\t}\n\n\tif (ActionSequence[ActiveSequenceID]->Evaluate(Owner) < KINDA_SMALL_NUMBER)\n\t\treturn false;\n\n\tActionSequence[ActiveSequenceID]->Start(Owner);\n\treturn true;\n}\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nfloat USoEAActionList::Evaluate(const ASoEnemy* Owner) const\n{\n\tconst float BaseChance = Super::Evaluate(Owner);\n\tfloat Value = 0.0f;\n\tif (BaseChance > KINDA_SMALL_NUMBER)\n\t{\n\t\tfor (const USoEAction* Action : Actions)\n\t\t{\n\t\t\tValue = FMath::Max(Value, Action->Evaluate(Owner));\n\t\t}\n\t}\n\n\treturn Value * BaseChance;\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoEAActionList::Interrupt(ASoEnemy* Owner)\n{\n\tif (ActiveAction != nullptr)\n\t\tActiveAction->Interrupt(Owner);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoEAActionList::OnEnter(ASoEnemy* Owner)\n{\n\tActiveAction = Owner->ChooseActionFromList(Actions);\n\tActiveAction->Start(Owner);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoEAActionList::OnTick(float DeltaSeconds, ASoEnemy* Owner)\n{\n\tif (ActiveAction == nullptr)\n\t\treturn false;\n\n\tconst bool bStillRuning = ActiveAction->Tick(DeltaSeconds, Owner);\n\tif (bStillRuning)\n\t\treturn true;\n\n\tActiveAction = nullptr;\n\treturn false;\n}\n\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoEARandomer::Interrupt(ASoEnemy* Owner)\n{\n\tif (ActiveAction != nullptr)\n\t\tActiveAction->Interrupt(Owner);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoEARandomer::OnEnter(ASoEnemy* Owner)\n{\n\tActiveAction = nullptr;\n\n\tTArray<float> Multipliers;\n\tMultipliers.SetNum(Actions.Num());\n\n\tfloat Sum = 0.0f;\n\tfor (int32 i = 0; i < Actions.Num(); ++i)\n\t{\n\t\tMultipliers[i] = Actions[i]->Evaluate(Owner);\n\t\tSum += (Chances.IsValidIndex(i) ? Chances[i] : 1.0f) * Multipliers[i] * GetRepeatAvoidanceMultiplier(i);\n\t}\n\tconst float RandValue = FMath::RandRange(0.0f, Sum);\n\tSum = -KINDA_SMALL_NUMBER;\n\tfor (int32 i = 0; i < Actions.Num(); ++i)\n\t{\n\t\tSum += (Chances.IsValidIndex(i) ? Chances[i] : 1.0f) * Multipliers[i] * GetRepeatAvoidanceMultiplier(i);\n\t\tif (RandValue <= Sum)\n\t\t{\n\t\t\tActiveAction = Actions[i];\n\t\t\tActiveAction->Start(Owner);\n\t\t\tPrevPrevSelectedIndex = PrevSelectedIndex;\n\t\t\tPrevSelectedIndex = i;\n\t\t\treturn;\n\t\t}\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoEARandomer::OnTick(float DeltaSeconds, ASoEnemy* Owner)\n{\n\tif (ActiveAction == nullptr)\n\t\treturn false;\n\n\tconst bool bStillRuning = ActiveAction->Tick(DeltaSeconds, Owner);\n\tif (bStillRuning)\n\t\treturn true;\n\n\tActiveAction = nullptr;\n\treturn false;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nfloat USoEARandomer::GetRepeatAvoidanceMultiplier(int32 Index) const\n{\n\tif (bLowerChanceToRepeat && PrevSelectedIndex == Index)\n\t{\n\t\treturn (PrevPrevSelectedIndex == Index) ? 0.3f : 0.6f;\n\t}\n\n\treturn 1.0f;\n}"
  },
  {
    "path": "Source/SOrb/Enemy/EActions/SoEAActionComposition.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#pragma once\n#include \"SoEAction.h\"\n#include \"SoEAActionComposition.generated.h\"\n\n/**\n *  An action containing and controlling other actions\n *  It has one primary action, and optional secondary ones\n *  action start is based on the root action's precondition, the primary action's preconditions are ignored\n *  one or none of the secondary ones are played after the primary action depending on their preconditions\n *  action is over after the secondary action is over, or if none of the secondary can be selected\n */\nUCLASS(BlueprintType, EditInlineNew)\nclass SORB_API USoEAActionChainElement : public USoEAction\n{\n\tGENERATED_BODY()\npublic:\n\n\tvirtual float Evaluate(const ASoEnemy* Owner) const override;\n\n\tvirtual void Interrupt(ASoEnemy* Owner) override;\n\n\tvirtual bool IsInterruptible() const override;\n\nprotected:\n\n\tvirtual void OnEnter(ASoEnemy* Owner) override;\n\tvirtual bool OnTick(float DeltaSeconds, ASoEnemy* Owner) override;\n\nprotected:\n\n\tUPROPERTY(Instanced, BlueprintReadWrite, EditAnywhere, Category = Params)\n\tUSoEAction* PrimaryAction;\n\n\tUPROPERTY(Instanced, BlueprintReadWrite, EditAnywhere, Category = Params)\n\tTArray<USoEAction*> SecondActions;\n\n\t/** whether to call GetFirstSatisfiedAction() or ChooseActionFromList() to select the secondary action */\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere, Category = Params)\n\tbool bPickFirstSecond = true;\n\n\tbool bPrimaryPhase = true;\n\tUSoEAction* ActiveSecondaryAction = nullptr;\n};\n\n/**\n *  A sequence of actions, executed after each other\n *  if one's preconditions fail the sequence is interrupted\n */\nUCLASS(BlueprintType, EditInlineNew)\nclass SORB_API USoEAActionSequence : public USoEAction\n{\n\tGENERATED_BODY()\npublic:\n\n\tvirtual float Evaluate(const ASoEnemy* Owner) const override;\n\n\tvirtual void Interrupt(ASoEnemy* Owner) override;\n\nprotected:\n\n\tvirtual void OnEnter(ASoEnemy* Owner) override;\n\tvirtual bool OnTick(float DeltaSeconds, ASoEnemy* Owner) override;\n\nprotected:\n\n\tUPROPERTY(Instanced, BlueprintReadWrite, EditAnywhere, Category = Params)\n\tTArray<USoEAction*> ActionSequence;\n\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere, Category = Params)\n\tint32 LoopCount = 1;\n\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere, Category = Params)\n\tbool bCheckPreconditionEachLoop = true;\n\n\tint32 ActiveSequenceID = -1;\n\n\tint32 LoopCounter = 0;\n};\n\n\n\n/**\n *  Selects an action randomly from an array of actions\n *  SubAction preconditions are ignored, only the root matters on evaluation\n */\nUCLASS(BlueprintType, EditInlineNew)\nclass SORB_API USoEARandomer : public USoEAction\n{\n\tGENERATED_BODY()\npublic:\n\n\tvirtual void Interrupt(ASoEnemy* Owner) override;\n\nprotected:\n\n\tvirtual void OnEnter(ASoEnemy* Owner) override;\n\tvirtual bool OnTick(float DeltaSeconds, ASoEnemy* Owner) override;\n\nprotected:\n\n\tfloat GetRepeatAvoidanceMultiplier(int32 Index) const;\n\n\tUPROPERTY(Instanced, BlueprintReadWrite, EditAnywhere, Category = Params)\n\tTArray<USoEAction*> Actions;\n\n\t/** 1.0f by default for out of range, x-th element goes for x-th action in Actions */\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere, Category = Params)\n\tTArray<float> Chances;\n\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere, Category = Params)\n\tbool bLowerChanceToRepeat = false;\n\n\tint32 PrevSelectedIndex = -1;\n\tint32 PrevPrevSelectedIndex = -1;\n\n\tUSoEAction* ActiveAction = nullptr;\n};\n\n\n\n\n/**\n *  An array of actions\n *  If any is satisfied it is as well - own preconditions are taken into account as well\n *  One action is selected and executed on enter\n *  Evaluate returns with the max value of Evaluate calls on the action array\n */\nUCLASS(BlueprintType, EditInlineNew)\nclass SORB_API USoEAActionList : public USoEAction\n{\n\tGENERATED_BODY()\npublic:\n\n\tvirtual float Evaluate(const ASoEnemy* Owner) const override;\n\n\tvirtual void Interrupt(ASoEnemy* Owner) override;\n\nprotected:\n\n\tvirtual void OnEnter(ASoEnemy* Owner) override;\n\tvirtual bool OnTick(float DeltaSeconds, ASoEnemy* Owner) override;\n\nprotected:\n\n\tUPROPERTY(Instanced, BlueprintReadWrite, EditAnywhere, Category = Params)\n\tTArray<USoEAction*> Actions;\n\n\tUSoEAction* ActiveAction = nullptr;\n};\n"
  },
  {
    "path": "Source/SOrb/Enemy/EActions/SoEACombat.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#include \"SoEACombat.h\"\n\n#include \"Basic/SoCollisionChannels.h\"\n#include \"CharacterBase/SoCharacterMovementComponent.h\"\n#include \"Enemy/SoEnemy.h\"\n#include \"Enemy/EPreconditions/SoEPrecondition.h\"\n#include \"Components/CapsuleComponent.h\"\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUSoEAStrike::USoEAStrike()\n{\n\t// most likely\n\tbForceSplineDirection = true;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoEAStrike::OnEnter(ASoEnemy* Owner)\n{\n\tUE_LOG(LogSoEnemyAI, Display, TEXT(\"USoEAStrike::OnEnter (%s)\"), *Name.ToString());\n\n\tActivePhase = 0;\n\tOwner->Strike(Name);\n\tCounter = 0.0f;\n\tCachedMaxWalkSpeed = Owner->GetSoMovement()->MaxWalkSpeed;\n\tbLeave = false;\n\n\tif (const FSoStrike* Strike = Owner->GetStrike(Name))\n\t{\n\t\tif (Strike->bLookAtPlayer)\n\t\t\tbForceSplineDirection = false;\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoEAStrike::OnTick(float DeltaSeconds, ASoEnemy* Owner)\n{\n\tconst FSoStrike* Strike = Owner->GetStrike(Name);\n\n\tif (Strike == nullptr)\n\t{\n\t\tUE_LOG(LogSoEnemyAI, Warning, TEXT(\"Failed to find strike (%s)\"), *Name.ToString());\n\t\treturn false;\n\t}\n\n\tif (bLeave || !Strike->Phases.IsValidIndex(ActivePhase))\n\t\treturn false;\n\n\tconst float NewTime = Counter + DeltaSeconds;\n\n\tUpdate(Owner, Strike->Phases[ActivePhase], Counter, NewTime);\n\n\tif (NewTime > Strike->Phases[ActivePhase].Duration)\n\t{\n\t\tCounter = NewTime - Strike->Phases[ActivePhase].Duration;\n\n\t\tActivePhase += 1;\n\t\tif (ActivePhase == Strike->Phases.Num())\n\t\t\treturn false;\n\n\t\tOwner->OnStrikePhaseSwitch(Strike->Phases[ActivePhase], ActivePhase);\n\t\tUpdate(Owner, Strike->Phases[ActivePhase], 0.0f, Counter);\n\t}\n\telse\n\t\tCounter = NewTime;\n\n\treturn true;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoEAStrike::Update(ASoEnemy* Owner, const FSoStrikePhase& Phase, float OldTime, float NewTime)\n{\n\t// Root motion:\n\t// step 1: turn off old ones\n\tfor (const FSoRootMotionEntry& RootM : Phase.RootMotion)\n\t\tif (RootM.To >= OldTime && RootM.To < NewTime)\n\t\t\tOwner->ClearRootMotionDesc();\n\t// step 2: activate new ones\n\tfor (const FSoRootMotionEntry& RootM : Phase.RootMotion)\n\t\tif (RootM.From >= OldTime && RootM.From < NewTime)\n\t\t\tOwner->SetRootMotionDesc(RootM.RootMotion);\n\n\tif (bAreaLimitedRootMotion &&\n\t\t!Owner->IsBetweenMarkers(0, 1, true) &&\n\t\t!Owner->IsFacingMarker(0, true))\n\t{\n\t\tOwner->ClearRootMotionDesc();\n\t\tOwner->GetSoMovement()->Velocity.X = 0.0f;\n\t\tOwner->GetSoMovement()->Velocity.Y = 0.0f;\n\t}\n\n\n\t// controlled motion:\n\n\t// step 1: turn off old ones if there is any\n\tif (ControlledMotionCounter > 0)\n\t{\n\t\tfor (const FSoControlledMotionEntry& Motion : Phase.ControlledMotion)\n\t\t\tif (Motion.To >= OldTime && Motion.To < NewTime)\n\t\t\t\tControlledMotionCounter -= 1;\n\n\t\tif (ControlledMotionCounter <= 0)\n\t\t\tOwner->GetSoMovement()->MaxWalkSpeed = CachedMaxWalkSpeed;\n\n#if WITH_EDITOR\n\t\tif (ControlledMotionCounter < 0)\n\t\t\tUE_LOG(LogSoEnemyAI, Warning, TEXT(\"Invalid ControlledMotionCounter value %d: check the intervals!\"), ControlledMotionCounter);\n#endif\n\t}\n\n\t// step 2: activate new ones\n\tfor (const FSoControlledMotionEntry& Motion : Phase.ControlledMotion)\n\t\tif (Motion.From >= OldTime && Motion.From < NewTime)\n\t\t{\n\t\t\tSetStopOnHit(Motion.bStopIfStuck, Owner);\n\t\t\tControlledMotionCounter += 1;\n\t\t\tOwner->GetSoMovement()->MaxWalkSpeed = Motion.Speed;\n\t\t}\n\n\t// apply active\n\t// TODO: handle vertical movement?!\n\t//\t\t handle negative speed value?!\n\tif (ControlledMotionCounter > 0)\n\t\tOwner->AddMovementInput(Owner->GetActorForwardVector(), 1.0f, true);\n\n\n\t// Weapon collision:\n\t// step 1: inactivate old\n\tfor (const FSoWeaponCollisionEntry& Collision : Phase.WeaponCollision)\n\t\tif (Collision.To >= OldTime && Collision.To < NewTime)\n\t\t\tOwner->ActivateWeaponCollision(false, Collision.Slot);\n\n\t// step 2: activate new\n\tfor (const FSoWeaponCollisionEntry& Collision : Phase.WeaponCollision)\n\t\tif (Collision.From >= OldTime && Collision.From < NewTime)\n\t\t\tOwner->ActivateWeaponCollision(true, Collision.Slot);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoEAStrike::OnLeave(ASoEnemy* Owner)\n{\n\tUE_LOG(LogSoEnemyAI, Display, TEXT(\"USoEAStrike::OnLeave (%s)\"), *Name.ToString());\n\tOwner->StrikeEnd();\n\n\tOwner->GetSoMovement()->MaxWalkSpeed = CachedMaxWalkSpeed;\n\tControlledMotionCounter = 0;\n\tSetStopOnHit(false, Owner);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoEAStrike::OnHitCallback(UPrimitiveComponent* HitComp, AActor* OtherActor, UPrimitiveComponent* OtherComp, FVector NormalImpulse, const FHitResult& Hit)\n{\n\tif (bStopOnHit && OtherComp->GetCollisionObjectType() != ECC_Projectile)\n\t\tbLeave = true;\n\n\tASoEnemy* Owner = Cast<ASoEnemy>(HitComp->GetOwner());\n\tif (Owner != nullptr)\n\t\tOwner->OnCapsuleComponentHitWhileStriking(OtherActor, OtherComp, NormalImpulse, Hit);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoEAStrike::SetStopOnHit(bool bNewValue, ASoEnemy* Owner)\n{\n\tif (bStopOnHit != bNewValue)\n\t{\n\t\tbStopOnHit = bNewValue;\n\n\t\tif (bStopOnHit)\n\t\t\tOwner->GetCapsuleComponent()->OnComponentHit.AddDynamic(this, &USoEAStrike::OnHitCallback);\n\t\telse\n\t\t\tOwner->GetCapsuleComponent()->OnComponentHit.RemoveDynamic(this, &USoEAStrike::OnHitCallback);\n\t}\n}\n\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoEABlocked::OnEnter(ASoEnemy* Owner)\n{\n\tUE_LOG(LogSoEnemyAI, Display, TEXT(\"USoEABlocked::OnEnter\"));\n\tOwner->SetActivity(ESoEnemyActivity::EEA_Blocked);\n\tCounter = 0.0f;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoEABlocked::OnTick(float DeltaSeconds, ASoEnemy* Owner)\n{\n\tCounter += DeltaSeconds;\n\treturn Duration > Counter;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoEABlocked::OnLeave(ASoEnemy* Owner)\n{\n\tUE_LOG(LogSoEnemyAI, Display, TEXT(\"USoEABlocked::OnLeave\"));\n\tOwner->SetActivity(ESoEnemyActivity::EEA_Default);\n}\n\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoEABlock::OnEnter(ASoEnemy* Owner)\n{\n\tUE_LOG(LogSoEnemyAI, Display, TEXT(\"USoEABlock::OnEnter (%s)\"), *Name.ToString());\n\tOwner->Block(Name, Duration);\n\tCounter = 0.0f;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoEABlock::OnTick(float DeltaSeconds, ASoEnemy* Owner)\n{\n\tCounter += DeltaSeconds;\n\treturn Duration > Counter;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoEABlock::OnLeave(ASoEnemy* Owner)\n{\n\tUE_LOG(LogSoEnemyAI, Display, TEXT(\"USoEABlock::OnLeave (%s)\"), *Name.ToString());\n\tOwner->SetActivity(ESoEnemyActivity::EEA_Default);\n}\n\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoEAHitReact::OnEnter(ASoEnemy* Owner)\n{\n\tUE_LOG(LogSoEnemyAI, Display, TEXT(\"USoEAHitReact::OnEnter (%s)\"), *Name.ToString());\n\tOwner->HitReact(Name, Duration);\n\tCounter = 0.0f;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoEAHitReact::OnTick(float DeltaSeconds, ASoEnemy* Owner)\n{\n\tCounter += DeltaSeconds;\n\treturn Duration > Counter;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoEAHitReact::OnLeave(ASoEnemy* Owner)\n{\n\tUE_LOG(LogSoEnemyAI, Display, TEXT(\"USoEAHitReact::OnLeave (%s)\"), *Name.ToString());\n\tOwner->SetActivity(ESoEnemyActivity::EEA_Default);\n}\n\n\n\n//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n//void USoEARangeAttack::OnEnter(ASoEnemy* Owner)\n//{\n//\tUE_LOG(LogSoEnemyAI, Display, TEXT(\"USoEARangeAttack::OnEnter (%s)\"), *Name.ToString());\n//\tCounter = 0.0f;\n//\tbProjectileCreated = false;\n//\n//\tconst FSoERangeAttackDesc* Desc = Owner->GetRangeAttackDesc(Name);\n//\tif (Desc != nullptr)\n//\t\tOwner->OnRangeAttackStarted(Name, Desc->TimeBeforeSpawn + Desc->TimeAfterSpawn);\n//}\n//\n//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n//bool USoEARangeAttack::OnTick(float DeltaSeconds, ASoEnemy* Owner)\n//{\n//\tCounter += DeltaSeconds;\n//\n//\tconst FSoERangeAttackDesc* Desc = Owner->GetRangeAttackDesc(Name);\n//\tif (Desc == nullptr)\n//\t\treturn false;\n//\n//\tif (bProjectileCreated)\n//\t\treturn Counter < Desc->TimeAfterSpawn;\n//\n//\tif (Counter > Desc->TimeBeforeSpawn)\n//\t{\n//\t\tbProjectileCreated = true;\n//\t\tconst AActor* Target = Owner->GetTarget();\n//\t\tif (Target != nullptr)\n//\t\t{\n//\t\t\tOwner->OnRangeAttackFired();\n//\n//\t\t\tconst FVector StartPos = Owner->GetRangeAttackLocation(Name);\n//\t\t\tconst FVector TargetPos = Target->GetActorLocation();\n//\n//\t\t\t//if (bOnSpline)\n//\t\t\t//{\n//\t\t\t//\tconst FSoSplinePoint OwnerSplineLocation = ISoSplineWalker::Execute_GetSplineLocationI(Owner);\n//\t\t\t//\tconst FSoSplinePoint PlayerSplineLocation = USoStaticHelper::GetPlayerSplineLocation(Owner);\n//\t\t\t//\tconst FVector Delta = StartPos - FVector(OwnerSplineLocation);\n//\t\t\t//\tconst FSoSplinePoint StartSplineLocation = OwnerSplineLocation + OwnerSplineLocation.GetDirectionModifierFromVector(Delta) * Delta.Size2D();\n//\t\t\t//\tFVector Velocity = USoMathHelper::CalcRangeAttackVelocity(StartPos,\n//\t\t\t//\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tStartSplineLocation,\n//\t\t\t//\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tTargetPos,\n//\t\t\t//\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tPlayerSplineLocation,\n//\t\t\t//\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tDesc->BulletSpeed,\n//\t\t\t//\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tDesc->BulletGravityScale);\n//\t\t\t//\tif (Velocity.Size() < KINDA_SMALL_NUMBER)\n//\t\t\t//\t\tVelocity = Owner->GetActorForwardVector() * Desc->BulletSpeed;\n//\t\t\t//\n//\t\t\t//\tASoBullet* Projectile = Owner->GetWorld()->SpawnActor<ASoBullet>(Desc->ProjectileClass, StartPos, Velocity.Rotation());\n//\t\t\t//\tProjectile->SetGravityScale(Desc->BulletGravityScale);\n//\t\t\t//\n//\t\t\t//\tconst FVector Offset = (FVector(StartSplineLocation) - StartPos);\n//\t\t\t//\tProjectile->FireOnSplineWithOffset(StartSplineLocation, FVector(Offset.X, Offset.Y, 0.0f), Velocity);\n//\t\t\t//\tProjectile->SetSpawnerActor(Owner);\n//\t\t\t//}\n//\t\t\t//else\n//\t\t\t//{\n//\t\t\t//\tFVector Velocity = USoMathHelper::CalcRangeAttackVelocity(StartPos,\n//\t\t\t//\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tTargetPos,\n//\t\t\t//\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tDesc->BulletSpeed,\n//\t\t\t//\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tDesc->BulletGravityScale);\n//\t\t\t//\tif (Velocity.Size() < KINDA_SMALL_NUMBER)\n//\t\t\t//\t\tVelocity = (TargetPos - StartPos).GetSafeNormal() * Desc->BulletSpeed;\n//\t\t\t//\n//\t\t\t//\tASoBullet* Projectile = Owner->GetWorld()->SpawnActor<ASoBullet>(Desc->ProjectileClass, StartPos, Velocity.Rotation());\n//\t\t\t//\tProjectile->SetGravityScale(Desc->BulletGravityScale);\n//\t\t\t//\tProjectile->FireOnSplineNew(FSoSplinePoint{ nullptr }, Velocity);\n//\t\t\t//\tProjectile->SetSpawnerActor(Owner);\n//\t\t\t//}\n//\t\t}\n//\t}\n//\n//\treturn true;\n//}\n//\n//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n//void USoEARangeAttack::OnLeave(ASoEnemy* Owner)\n//{\n//\tUE_LOG(LogSoEnemyAI, Display, TEXT(\"USoEARangeAttack::OnLeave (%s)\"), *Name.ToString());\n//\tOwner->OnRangeAttackEnded();\n//}\n"
  },
  {
    "path": "Source/SOrb/Enemy/EActions/SoEACombat.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#pragma once\n\n#include \"SoEAction.h\"\n#include \"Engine/EngineTypes.h\"\n#include \"SoEACombat.generated.h\"\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// owner strikes\nUCLASS(Blueprintable, BlueprintType, EditInlineNew)\nclass SORB_API USoEAStrike : public USoEAction\n{\n\tGENERATED_BODY()\npublic:\n\n\tUSoEAStrike();\n\n\tUFUNCTION(BlueprintCallable)\n\tFName GetStrikeName();\n\n\tUFUNCTION()\n\tvoid OnHitCallback(UPrimitiveComponent* Comp, AActor* OtherActor, UPrimitiveComponent* OtherComp, FVector NormalImpulse, const FHitResult& Hit);\n\nprotected:\n\n\tvirtual void OnEnter(ASoEnemy* Owner) override;\n\tvirtual bool OnTick(float DeltaSeconds, ASoEnemy* Owner) override;\n\tvirtual void OnLeave(ASoEnemy* Owner) override;\n\n\tvoid SetStopOnHit(bool bNewValue, ASoEnemy* Owner);\n\nprotected:\n\n\tvoid Update(ASoEnemy* Owner, const struct FSoStrikePhase& Phase, float OldTime, float NewTime);\n\nprotected:\n\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = Params)\n\tFName Name;\n\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = Params)\n\tbool bAreaLimitedRootMotion;\n\n\tfloat Counter;\n\tint32 ActivePhase;\n\n\t// controlled movement params\n\tfloat CachedMaxWalkSpeed;\n\tint32 ControlledMotionCounter = 0;\n\tbool bStopOnHit = false;\n\n\tbool bLeave = false;\n};\ninline FName USoEAStrike::GetStrikeName() { return Name; }\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// owner's strike is blocked\nUCLASS(BlueprintType, EditInlineNew)\nclass SORB_API USoEABlocked : public USoEAction\n{\n\tGENERATED_BODY()\n\nprotected:\n\n\tvirtual void OnEnter(ASoEnemy* Owner) override;\n\tvirtual bool OnTick(float DeltaSeconds, ASoEnemy* Owner) override;\n\tvirtual void OnLeave(ASoEnemy* Owner) override;\n\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = Params)\n\tfloat Duration;\n\n\tfloat Counter;\n};\n\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// owner blocks a strike\nUCLASS(BlueprintType, EditInlineNew)\nclass SORB_API USoEABlock : public USoEAction\n{\n\tGENERATED_BODY()\nprotected:\n\n\tvirtual void OnEnter(ASoEnemy* Owner) override;\n\tvirtual bool OnTick(float DeltaSeconds, ASoEnemy* Owner) override;\n\tvirtual void OnLeave(ASoEnemy* Owner) override;\n\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = Params)\n\tFName Name;\n\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = Params)\n\tfloat Duration;\n\n\tfloat Counter;\n};\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUCLASS(BlueprintType, EditInlineNew)\nclass SORB_API USoEAHitReact : public USoEAction\n{\n\tGENERATED_BODY()\nprotected:\n\n\tvirtual void OnEnter(ASoEnemy* Owner) override;\n\tvirtual bool OnTick(float DeltaSeconds, ASoEnemy* Owner) override;\n\tvirtual void OnLeave(ASoEnemy* Owner) override;\n\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = Params)\n\tFName Name;\n\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = Params)\n\tfloat Duration;\n\n\tfloat Counter;\n};\n\n\n\n//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n//UCLASS(BlueprintType, EditInlineNew)\n//class SORB_API USoEARangeAttack : public USoEAction\n//{\n//\tGENERATED_BODY()\n//protected:\n//\n//\tvirtual void OnEnter(ASoEnemy* Owner) override;\n//\tvirtual bool OnTick(float DeltaSeconds, ASoEnemy* Owner) override;\n//\tvirtual void OnLeave(ASoEnemy* Owner) override;\n//\n//\n//\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = Params)\n//\tFName Name;\n//\n//\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = Params)\n//\tbool bOnSpline = true;\n//\n//\n//\tfloat Counter;\n//\tbool bProjectileCreated = false;\n//};\n"
  },
  {
    "path": "Source/SOrb/Enemy/EActions/SoEAExecuteFirst.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#include \"SoEAExecuteFirst.h\"\n#include \"Enemy/SoEnemy.h\"\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoEAExecuteFirst::Interrupt(ASoEnemy* Owner)\n{\n\tif (ActiveAction != nullptr)\n\t{\n\t\tActiveAction->Interrupt(Owner);\n\t\tActiveAction = nullptr;\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoEAExecuteFirst::OnEnter(ASoEnemy* Owner)\n{\n\tfor (USoEAction* Action : Actions)\n\t{\n\t\tif (Action->Evaluate(Owner) > KINDA_SMALL_NUMBER)\n\t\t{\n\t\t\tActiveAction = Action;\n\t\t\tActiveAction->Start(Owner);\n\t\t\treturn;\n\t\t}\n\t}\n\n\tActiveAction = nullptr;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoEAExecuteFirst::OnTick(float DeltaSeconds, ASoEnemy* Owner)\n{\n\tif (ActiveAction == nullptr)\n\t\treturn false;\n\n\tconst bool bStillRuning = ActiveAction->Tick(DeltaSeconds, Owner);\n\tif (bStillRuning)\n\t\treturn true;\n\n\tActiveAction = nullptr;\n\treturn false;\n}\n"
  },
  {
    "path": "Source/SOrb/Enemy/EActions/SoEAExecuteFirst.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#pragma once\n#include \"SoEAction.h\"\n#include \"SoEAExecuteFirst.generated.h\"\n\n/**\n *  An array of actions, first satisfied action is executed\n *  Only the precondition of the base is checked for enter, but the action immediately finished if the others are all unsatisfied\n */\nUCLASS(BlueprintType, EditInlineNew)\nclass SORB_API USoEAExecuteFirst : public USoEAction\n{\n\tGENERATED_BODY()\npublic:\n\n\tvirtual void Interrupt(ASoEnemy* Owner) override;\n\nprotected:\n\n\tvirtual void OnEnter(ASoEnemy* Owner) override;\n\tvirtual bool OnTick(float DeltaSeconds, ASoEnemy* Owner) override;\n\nprotected:\n\n\tUPROPERTY(Instanced, BlueprintReadWrite, EditAnywhere, Category = Params)\n\tTArray<USoEAction*> Actions;\n\n\tUSoEAction* ActiveAction = nullptr;\n};\n"
  },
  {
    "path": "Source/SOrb/Enemy/EActions/SoEAFlyHome.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#include \"SoEAFlyHome.h\"\n\n#include \"Engine/World.h\"\n\n#include \"Enemy/SoEnemy.h\"\n#include \"CharacterBase/SoCharacterMovementComponent.h\"\n\n//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoEAFlyHome::OnEnter(ASoEnemy* Owner)\n{\n\tconst FVector OldLocation = Owner->GetActorLocation();\n\tbTargetReached = false;\n\n\tconst FVector TargetLocation = Owner->GetInitialLocation();\n\tif (bOnlyAlongZ)\n\t\tCurrentVelocity = FVector::UpVector * FMath::Sign(TargetLocation.Z - OldLocation.Z) * StartVelocity;\n\telse\n\t\tCurrentVelocity = (TargetLocation - OldLocation).GetSafeNormal() * StartVelocity;\n}\n\n//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoEAFlyHome::OnLeave(ASoEnemy* Owner)\n{\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoEAFlyHome::OnTick(float DeltaSeconds, ASoEnemy* Owner)\n{\n\tif (DeltaSeconds < KINDA_SMALL_NUMBER)\n\t\treturn !bTargetReached || CurrentVelocity.Size2D() > 1.0f;\n\n\tconst FVector OldLocation = Owner->GetActorLocation();\n\tconst FVector TargetLocation = bOnlyAlongZ ? FVector(OldLocation.X, OldLocation.Y, Owner->GetInitialLocation().Z) : Owner->GetInitialLocation();\n\tif (bTargetReached)\n\t{\n\t\tfloat ActualVelocity = CurrentVelocity.Size();\n\t\tActualVelocity = FMath::Max(ActualVelocity - Acceleration * DeltaSeconds, 0.0f);\n\t\tCurrentVelocity = CurrentVelocity.GetSafeNormal() * ActualVelocity;\n\t}\n\telse\n\t{\n\t\tconst FVector ToTarget = TargetLocation - OldLocation;\n\t\tCurrentVelocity += ToTarget.GetSafeNormal() * DeltaSeconds * Acceleration;\n\t\tCurrentVelocity = CurrentVelocity.GetSafeNormal() * FMath::Min(MaxVelocity, CurrentVelocity.Size());\n\t}\n\n\tFHitResult HitResult;\n\tOwner->AddActorWorldOffset(CurrentVelocity * DeltaSeconds, true, &HitResult);\n\tconst FVector CurrentLocation = Owner->GetActorLocation();\n\tconst FVector Delta = (CurrentLocation - OldLocation);\n\tCurrentVelocity = Delta / DeltaSeconds;\n\n\tFSoSplinePoint& SplineLocation = Owner->GetSoMovement()->GetSplineLocation();\n\tSplineLocation += (Delta.Size2D() * SplineLocation.GetDirectionModifierFromVector(Delta));\n\n\tif (bTargetReached)\n\t\treturn CurrentVelocity.Size2D() > 1.0f;\n\n\tconst float DistanceSquared = (TargetLocation - CurrentLocation).SizeSquared();\n\tbTargetReached = (DistanceSquared < AcceptedDistance * AcceptedDistance);\n\treturn true;\n}\n"
  },
  {
    "path": "Source/SOrb/Enemy/EActions/SoEAFlyHome.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#pragma once\n\n#include \"SoEAction.h\"\n#include \"Enemy/SoEnemyDataTypes.h\"\n#include \"SoEAFlyHome.generated.h\"\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUCLASS(BlueprintType, EditInlineNew)\nclass SORB_API USoEAFlyHome : public USoEAction\n{\n\tGENERATED_BODY()\n\nprotected:\n\n\tvirtual void OnEnter(ASoEnemy* Owner) override;\n\tvirtual void OnLeave(ASoEnemy* Owner) override;\n\tvirtual bool OnTick(float DeltaSeconds, ASoEnemy* Owner) override;\n\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Params)\n\tfloat AcceptedDistance = 100;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Params)\n\tfloat MaxVelocity = 500;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Params)\n\tfloat StartVelocity = 0;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Params)\n\tfloat Acceleration = 2000;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Params)\n\tfloat ZOffset = 0.0f;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Params)\n\tbool bOnlyAlongZ = false;\n\n\t// Runtime:\n\tFVector CurrentVelocity;\n\tbool bTargetReached;\n};\n"
  },
  {
    "path": "Source/SOrb/Enemy/EActions/SoEAFlyToPlayer.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#include \"SoEAFlyToPlayer.h\"\n\n#include \"Engine/World.h\"\n\n#include \"Enemy/SoEnemy.h\"\n#include \"CharacterBase/SoCharacterMovementComponent.h\"\n#include \"Basic/Helpers/SoStaticHelper.h\"\n\n//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoEAFlyToPlayer::OnEnter(ASoEnemy* Owner)\n{\n\tconst FVector OldLocation = Owner->GetActorLocation();\n\tconst FVector PlayerLocation = USoStaticHelper::GetPlayerCharacterAsActor(Owner)->GetActorLocation() +\n\t\t\t\t\t\t\t\t   USoStaticHelper::GetPlayerSplineLocation(Owner).GetDirection() * SplineOffset;\n\tbTargetReached = false;\n\n\tif (bAway)\n\t{\n\t\tFVector Direction = (OldLocation - PlayerLocation);\n\t\tDirection.Z = FMath::Max(Direction.Z, ZOffset);\n\t\tAwayDirection = Direction;\n\t\tCurrentVelocity = Direction * StartVelocity;\n\n\t\tRestTime = AwayTime;\n\t}\n\telse\n\t{\n\t\tconst FVector TargetLocation = PlayerLocation + FVector(0.0f, 0.0f, ZOffset);\n\t\tCurrentVelocity = (TargetLocation - OldLocation).GetSafeNormal() * StartVelocity;\n\t\tActualZOffset = ZOffset;\n\t}\n}\n\n//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoEAFlyToPlayer::OnLeave(ASoEnemy* Owner)\n{\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoEAFlyToPlayer::OnTick(float DeltaSeconds, ASoEnemy* Owner)\n{\n\tif (DeltaSeconds < KINDA_SMALL_NUMBER)\n\t\treturn !bTargetReached || CurrentVelocity.Size2D() > 1.0f;\n\n\tconst FVector OldLocation = Owner->GetActorLocation();\n\tconst FVector TargetLocation = bAway ? OldLocation + AwayDirection * 400\n\t\t\t\t\t\t\t\t\t\t : USoStaticHelper::GetPlayerCharacterAsActor(Owner)->GetActorLocation() +\n\t\t\t\t\t\t\t\t\t\t   USoStaticHelper::GetPlayerSplineLocation(Owner).GetDirection() * SplineOffset +\n\t\t\t\t\t\t\t\t\t\t   FVector(0.0f, 0.0f, ActualZOffset);\n\tif (bTargetReached)\n\t{\n\t\tfloat ActualVelocity = CurrentVelocity.Size();\n\t\tActualVelocity = FMath::Max(ActualVelocity - Acceleration * DeltaSeconds, 0.0f);\n\t\tCurrentVelocity = CurrentVelocity.GetSafeNormal() * ActualVelocity;\n\t}\n\telse\n\t{\n\t\tconst FVector ToTarget = TargetLocation - OldLocation;\n\t\tActualZOffset = FMath::Min(ZOffset, ToTarget.Size2D());\n\t\tCurrentVelocity += ToTarget.GetSafeNormal() * DeltaSeconds * Acceleration;\n\t\tCurrentVelocity = CurrentVelocity.GetSafeNormal() * FMath::Min(MaxVelocity, CurrentVelocity.Size());\n\t}\n\n\tFHitResult HitResult;\n\tOwner->AddActorWorldOffset(CurrentVelocity * DeltaSeconds, true, &HitResult);\n\tconst FVector CurrentLocation = Owner->GetActorLocation();\n\tconst FVector Delta = (CurrentLocation - OldLocation);\n\tCurrentVelocity = Delta / DeltaSeconds;\n\n\tFSoSplinePoint& SplineLocation = Owner->GetSoMovement()->GetSplineLocation();\n\tSplineLocation += (Delta.Size2D() * SplineLocation.GetDirectionModifierFromVector(Delta));\n\n\tif (bTargetReached)\n\t\treturn CurrentVelocity.Size2D() > 1.0f;\n\n\tconst float DistanceSquared = (TargetLocation - CurrentLocation).SizeSquared();\n\tif (bAway)\n\t{\n\t\tRestTime -= DeltaSeconds;\n\t\tbTargetReached = RestTime > 0.0f;\n\t}\n\telse\n\t\tbTargetReached = (DistanceSquared < AcceptedDistance * AcceptedDistance);\n\n\treturn true;\n}\n"
  },
  {
    "path": "Source/SOrb/Enemy/EActions/SoEAFlyToPlayer.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#pragma once\n\n#include \"SoEAction.h\"\n#include \"Enemy/SoEnemyDataTypes.h\"\n#include \"SoEAFlyToPlayer.generated.h\"\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUCLASS(BlueprintType, EditInlineNew)\nclass SORB_API USoEAFlyToPlayer : public USoEAction\n{\n\tGENERATED_BODY()\n\nprotected:\n\n\tvirtual void OnEnter(ASoEnemy* Owner) override;\n\tvirtual void OnLeave(ASoEnemy* Owner) override;\n\tvirtual bool OnTick(float DeltaSeconds, ASoEnemy* Owner) override;\n\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Params)\n\tfloat AcceptedDistance = 100;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Params)\n\tfloat MaxVelocity = 500;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Params)\n\tfloat StartVelocity = 0;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Params)\n\tfloat Acceleration = 2000;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Params)\n\tfloat ZOffset = 0.0f;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Params)\n\tfloat SplineOffset = 0.0f;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Params)\n\tbool bAway = false;\n\n\t// only works without bAway atm\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Params)\n\tbool bAllowZMovement = true;\n\n\t/** time before deceleration applied */\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Params)\n\tfloat AwayTime = 2.0f;\n\n\t// Runtime:\n\tFVector CurrentVelocity;\n\tbool bTargetReached;\n\n\tFVector AwayDirection;\n\n\t// actual z offset can't be bigger than x offset so we reach player no matter what\n\tfloat ActualZOffset;\n\n\n\tfloat RestTime;\n};\n"
  },
  {
    "path": "Source/SOrb/Enemy/EActions/SoEAGeneral.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#include \"SoEAGeneral.h\"\n\n#include \"Engine/World.h\"\n\n#include \"Enemy/SoEnemy.h\"\n\n//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoEAWait::OnEnter(ASoEnemy* Owner)\n{\n\tif (Range > KINDA_SMALL_NUMBER)\n\t\tRandomFactor = FMath::RandRange(-Range, Range);\n\telse\n\t\tRandomFactor = 0.0f;\n\n\tRestTime = Duration + RandomFactor;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoEAWait::OnTick(float DeltaSeconds, ASoEnemy* Owner)\n{\n\tRestTime -= DeltaSeconds;\n\treturn RestTime > 0.0f;\n}\n\n//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoEAChangeActionSet::OnEnter(ASoEnemy* Owner)\n{\n\tOwner->ChangeActionList(NewActionList);\n\tRestTime = Duration;\n}\n//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoEAChangeActionSet::OnTick(float DeltaSeconds, ASoEnemy* Owner)\n{\n\tRestTime -= DeltaSeconds;\n\treturn RestTime > 0.0f;\n}\n\n\n\n//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoEAModifyFloat::OnEnter(ASoEnemy* Owner)\n{\n\tOwner->ModifyFloatValue(Variable, Value, bDelta);\n}\n\n\n//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoEABPEvent::OnEnter(ASoEnemy* Owner)\n{\n\tUE_LOG(LogSoEnemyAI, Verbose, TEXT(\"BP event executed: %s\"), *Name.ToString());\n\tOwner->ExecuteBlueprintEventBP(Name);\n}\n\n//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoEABPEventIndexed::OnEnter(ASoEnemy* Owner)\n{\n\tUE_LOG(LogSoEnemyAI, Verbose, TEXT(\"BP event (indexed) executed: %s %d\"), *Name.ToString(), Index);\n\n\tif (MaxIndex > Index)\n\t{\n\t\tfor (int32 i = Index; i <= MaxIndex; ++i)\n\t\t\tOwner->ExecuteBlueprintEventIndexedBP(Name, i);\n\t}\n\telse\n\t\tOwner->ExecuteBlueprintEventIndexedBP(Name, Index);\n}\n\n//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoEAPlayMaterialAnimation::OnEnter(ASoEnemy* Owner)\n{\n\tUE_LOG(LogSoEnemyAI, Verbose, TEXT(\"Play material anim: %d\"), Index);\n\tOwner->PlayMaterialAnimation(Index);\n}\n\n//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoEASetAnim::OnEnter(ASoEnemy* Owner)\n{\n\tUE_LOG(LogSoEnemyAI, Verbose, TEXT(\"USoEASetAnim::OnEnter: %s -> %s\"), *SourceName.ToString(), *TargetName.ToString());\n\tOwner->SetAnimation(SourceName, TargetName);\n}\n\n\n//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoEASetForcedLookAtPlayer::OnEnter(ASoEnemy* Owner)\n{\n\tOwner->SetForcedLookAtPlayer(bActivate);\n}\n\n\n//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoEASetDynamicName::OnEnter(ASoEnemy* Owner)\n{\n\tOwner->SetDynamicName(ValueToSet);\n}\n\n\n//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoEASetVOOn::OnEnter(ASoEnemy* Owner)\n{\n\tOwner->SetIdleVOOn(bEnable);\n}\n"
  },
  {
    "path": "Source/SOrb/Enemy/EActions/SoEAGeneral.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#pragma once\n\n#include \"SoEAction.h\"\n#include \"Enemy/SoEnemyDataTypes.h\"\n#include \"SoEAGeneral.generated.h\"\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n/**\n *  Simple wait action - the enemy doesn't do anything for the given Duration\n */\nUCLASS(BlueprintType, EditInlineNew)\nclass SORB_API USoEAWait : public USoEAction\n{\n\tGENERATED_BODY()\npublic:\n\n\tvoid SetDuration(float DeltaSeconds) { Duration = DeltaSeconds; }\n\nprotected:\n\n\tvirtual void OnEnter(ASoEnemy* Owner) override;\n\tvirtual bool OnTick(float DeltaSeconds, ASoEnemy* Owner) override;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Params)\n\tfloat Duration;\n\n\t/** > 0: duration is randomized on enter in range Duration +- Range */\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Params)\n\tfloat Range = -1.0f;\n\n\tfloat RandomFactor = 0.0f;\n\n\tfloat RestTime = 0.0f;\n};\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n/**\n *  Action to change one of the active actionlist to one of the named actionlist\n */\nUCLASS(BlueprintType, EditInlineNew)\nclass SORB_API USoEAChangeActionSet : public USoEAction\n{\n\tGENERATED_BODY()\nprotected:\n\n\tvirtual bool OnTick(float DeltaSeconds, ASoEnemy* Owner) override;\n\tvirtual void OnEnter(ASoEnemy* Owner) override;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Params)\n\tESoActionList NewActionList;\n\n\t/** the action is executed instantly, but after that it waits Duration seconds before it says it is done */\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Params)\n\tfloat Duration = 0.0f;\n\n\tfloat RestTime;\n};\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUCLASS(BlueprintType, EditInlineNew)\nclass SORB_API USoEAModifyFloat : public USoEAction\n{\n\tGENERATED_BODY()\nprotected:\n\n\tvirtual void OnEnter(ASoEnemy* Owner) override;\n\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = Params)\n\tESoEnemyFloat Variable;\n\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = Params)\n\tbool bDelta = false;\n\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = Params)\n\tfloat Value = 0.0f;\n};\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUCLASS(BlueprintType, EditInlineNew)\nclass SORB_API USoEABPEvent : public USoEAction\n{\n\tGENERATED_BODY()\nprotected:\n\n\tvirtual void OnEnter(ASoEnemy* Owner) override;\n\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = Params)\n\tFName Name;\n};\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUCLASS(BlueprintType, EditInlineNew)\nclass SORB_API USoEABPEventIndexed : public USoEAction\n{\n\tGENERATED_BODY()\nprotected:\n\n\tvirtual void OnEnter(ASoEnemy* Owner) override;\n\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = Params)\n\tFName Name;\n\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = Params)\n\tint32 Index;\n\n\t/** used if >= Index, then all index is called in range */\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = Params)\n\tint32 MaxIndex = -1;\n};\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUCLASS(BlueprintType, EditInlineNew)\nclass SORB_API USoEAPlayMaterialAnimation : public USoEAction\n{\n\tGENERATED_BODY()\nprotected:\n\n\tvirtual void OnEnter(ASoEnemy* Owner) override;\n\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = Params)\n\tint32 Index = 0;\n};\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUCLASS(BlueprintType, EditInlineNew)\nclass SORB_API USoEASetAnim : public USoEAction\n{\n\tGENERATED_BODY()\nprotected:\n\n\tvirtual void OnEnter(ASoEnemy* Owner) override;\n\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = Params)\n\tFName TargetName;\n\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = Params)\n\tFName SourceName;\n};\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUCLASS(BlueprintType, EditInlineNew)\nclass SORB_API USoEASetForcedLookAtPlayer : public USoEAction\n{\n\tGENERATED_BODY()\nprotected:\n\n\tvirtual void OnEnter(ASoEnemy* Owner) override;\n\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = Params)\n\tbool bActivate = true;\n};\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUCLASS(BlueprintType, EditInlineNew)\nclass SORB_API USoEASetDynamicName : public USoEAction\n{\n\tGENERATED_BODY()\nprotected:\n\n\tvirtual void OnEnter(ASoEnemy* Owner) override;\n\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = Params)\n\tFName ValueToSet;\n};\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUCLASS(BlueprintType, EditInlineNew)\nclass SORB_API USoEASetVOOn : public USoEAction\n{\n\tGENERATED_BODY()\nprotected:\n\n\tvirtual void OnEnter(ASoEnemy* Owner) override;\n\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = Params)\n\tbool bEnable = true;\n};\n"
  },
  {
    "path": "Source/SOrb/Enemy/EActions/SoEAMoveToPosition.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#include \"SoEAMoveToPosition.h\"\n\n#include \"Engine/World.h\"\n\n#include \"Enemy/SoEnemy.h\"\n#include \"Basic/Helpers/SoMathHelper.h\"\n#include \"CharacterBase/SoCharacterMovementComponent.h\"\n#include \"Basic/Helpers/SoStaticHelper.h\"\n#include \"SplineLogic/SoMarker.h\"\n\n//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoEAMoveToPosition::OnEnter(ASoEnemy* Owner)\n{\n\tInitialSplineLocation = Owner->GetSoMovement()->GetSplineLocation();\n\tInitialZ = Owner->GetActorLocation().Z;\n\n\tCounter = 0.0f;\n\n\tTargetZ = bToPlayer ? USoStaticHelper::GetPlayerCharacterAsActor(Owner)->GetActorLocation().Z + ZOffset\n\t\t\t\t\t\t: Owner->GetInitialLocation().Z + ZOffset;\n\n\tTargetX = bToPlayer ? (USoStaticHelper::GetPlayerSplineLocation(Owner) + SplineOffset).GetDistance()\n\t\t\t\t\t\t: (Owner->GetInitialSplineLocation() + SplineOffset).GetDistance();\n\n\tif (bClamBetweenMarkers)\n\t{\n\t\tASoMarker* Marker0 = Owner->GetTargetMarker(MarkerIndex0);\n\t\tASoMarker* Marker1 = Owner->GetTargetMarker(MarkerIndex1);\n\t\tif (Marker0 != nullptr && Marker1 != nullptr)\n\t\t{\n\t\t\tconst float MarkerDist0 = Marker0->GetSplineLocation().GetDistance();\n\t\t\tconst float MarkerDist1 = Marker1->GetSplineLocation().GetDistance();\n\t\t\tTargetX = FMath::Clamp(TargetX, FMath::Min(MarkerDist0, MarkerDist1), FMath::Max(MarkerDist0, MarkerDist1));\n\t\t}\n\t}\n\n\tSuper::OnEnter(Owner);\n}\n\n//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoEAMoveToPosition::OnLeave(ASoEnemy* Owner)\n{\n\tSuper::OnLeave(Owner);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoEAMoveToPosition::OnTick(float DeltaSeconds, ASoEnemy* Owner)\n{\n\tCounter = FMath::Min(Counter + DeltaSeconds, Duration);\n\n\tconst float Percent = Counter / Duration;\n\n\tfloat CurrentZ = InitialZ;\n\tFSoSplinePoint CurrentX = InitialSplineLocation;\n\n\tif (bAlongZ)\n\t\tCurrentZ = bSmoothStep ? USoMathHelper::InterpolateSmoothStep(InitialZ, TargetZ, Percent)\n\t\t\t\t\t\t\t   : USoMathHelper::InterpolateDeceleration(InitialZ, TargetZ, Percent);\n\n\tif (bAlongSpline)\n\t{\n\t\tCurrentX.SetDistance(bSmoothStep ? USoMathHelper::InterpolateSmoothStep(CurrentX.GetDistance(), TargetX, Percent)\n\t\t\t\t\t\t\t\t\t\t : USoMathHelper::InterpolateDeceleration(CurrentX.GetDistance(), TargetX, Percent));\n\n\t\tOwner->SetActorLocation(CurrentX.GetWorldLocation(CurrentZ));\n\t\tOwner->GetSoMovement()->SetSplineLocation(CurrentX);\n\t}\n\telse\n\t{\n\t\tFVector Location = Owner->GetActorLocation();\n\t\tLocation.Z = CurrentZ;\n\t\tOwner->SetActorLocation(Location);\n\t}\n\n\treturn Counter < Duration - KINDA_SMALL_NUMBER;\n}\n"
  },
  {
    "path": "Source/SOrb/Enemy/EActions/SoEAMoveToPosition.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#pragma once\n\n#include \"SoEAction.h\"\n\n#include \"SplineLogic/SoSplinePoint.h\"\n\n#include \"SoEAMoveToPosition.generated.h\"\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUCLASS(BlueprintType, EditInlineNew)\nclass SORB_API USoEAMoveToPosition : public USoEAction\n{\n\tGENERATED_BODY()\n\nprotected:\n\n\tvirtual void OnEnter(ASoEnemy* Owner) override;\n\tvirtual void OnLeave(ASoEnemy* Owner) override;\n\tvirtual bool OnTick(float DeltaSeconds, ASoEnemy* Owner) override;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Params)\n\tfloat Duration = 0.0f;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Params)\n\tbool bToPlayer = false;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Params)\n\tfloat ZOffset = 0.0f;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Params)\n\tfloat SplineOffset = 0.0f;\n\n\t// only works on a single spline!!!\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Params)\n\tbool bAlongSpline = true;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Params)\n\tbool bAlongZ = false;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Params)\n\tbool bClamBetweenMarkers = false;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Params)\n\tbool bSmoothStep = false;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Params)\n\tint32 MarkerIndex0 = 0;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Params)\n\tint32 MarkerIndex1 = 1;\n\n\n\n\tfloat Counter;\n\n\n\tFSoSplinePoint InitialSplineLocation;\n\tfloat InitialZ;\n\n\tfloat TargetZ;\n\tfloat TargetX;\n};\n"
  },
  {
    "path": "Source/SOrb/Enemy/EActions/SoEAMovements.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#include \"SoEAMovements.h\"\n\n\n#include \"Basic/Helpers/SoDateTimeHelper.h\"\n#include \"Engine/World.h\"\n\n#include \"CharacterBase/SoCharacterMovementComponent.h\"\n#include \"Enemy/SoEnemy.h\"\n#include \"Enemy/SoEnemyHelper.h\"\n#include \"Basic/Helpers/SoStaticHelper.h\"\n#include \"SplineLogic/SoMarker.h\"\n#include \"SplineLogic/SoSplineHelper.h\"\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoEAMoveTo::OnEnter(ASoEnemy* Owner)\n{\n\tTimeSinceProgress = 0.0f;\n\tOwnerLastFramePos = Owner->GetActorLocation();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoEAMoveTo::OnTick(float DeltaSeconds, ASoEnemy* Owner)\n{\n\tconst float Distance = TargetPoint - ISoSplineWalker::Execute_GetSplineLocationI(Owner);\n\n\tif (fabs(Distance) < AcceptedDistance)\n\t\treturn false;\n\n\tconst FVector OwnerPos = Owner->GetActorLocation();\n\tif (bGiveUpIfNoProgress)\n\t{\n\t\tif (fabs((OwnerPos - OwnerLastFramePos).SizeSquared()) > KINDA_SMALL_NUMBER)\n\t\t\tTimeSinceProgress = 0.0f;\n\t\telse\n\t\t\tTimeSinceProgress += DeltaSeconds;\n\n\t\tDistanceLastFrame = Distance;\n\n\t\tif (TimeSinceProgress > FMath::Max(DeltaSeconds, 0.3f))\n\t\t\treturn false;\n\t}\n\n\tOwner->AddMovementInput(ISoSplineWalker::Execute_GetSplineLocationI(Owner).GetDirection(), FMath::Sign(Distance));\n\tOwnerLastFramePos = Owner->GetActorLocation();\n\treturn true;\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoEAMoveToMarker::OnEnter(ASoEnemy* Owner)\n{\n\tSuper::OnEnter(Owner);\n\n\tOwner->GetSplineLocationFromMarker(Index, TargetPoint);\n\tif (TargetPoint.IsValid())\n\t\treturn;\n\n\tUE_LOG(LogSoEnemyAI, Warning, TEXT(\"USoEAMoveToTargetMarker: invalid marker or marker index (%d)\"), Index);\n\tTargetPoint = ISoSplineWalker::Execute_GetSplineLocationI(Owner);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoEAMoveToPlayer::OnTick(float DeltaSeconds, ASoEnemy* Owner)\n{\n\tTargetPoint = USoStaticHelper::GetPlayerSplineLocation(Owner) + SplineOffset;\n\n\tif (bOnlyBetweenMarkers && !Owner->IsPlayerBetweenMarkers(MarkerIndex0, MarkerIndex1, bCheckResultOnInvalidMarkers))\n\t{\n\t\treturn false;\n\t}\n\n\tif (bClampBetweenMarkers)\n\t{\n\t\tASoMarker* Marker0 = Owner->GetTargetMarker(MarkerIndex0);\n\t\tASoMarker* Marker1 = Owner->GetTargetMarker(MarkerIndex1);\n\t\tif (Marker0 != nullptr && Marker1 != nullptr)\n\t\t{\n\t\t\tconst float MarkerDist0 = Marker0->GetSplineLocation().GetDistance();\n\t\t\tconst float MarkerDist1 = Marker1->GetSplineLocation().GetDistance();\n\t\t\tTargetPoint.SetDistance(FMath::Clamp(TargetPoint.GetDistance(), FMath::Min(MarkerDist0, MarkerDist1), FMath::Max(MarkerDist0, MarkerDist1)));\n\t\t}\n\t}\n\n\n\treturn USoEAMoveTo::OnTick(DeltaSeconds, Owner);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoEAMoveToPlayerForDuration::OnEnter(ASoEnemy* Owner)\n{\n\tSuper::OnEnter(Owner);\n\tRestTime = Duration;\n}\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoEAMoveToPlayerForDuration::OnTick(float DeltaSeconds, ASoEnemy* Owner)\n{\n\tUSoEAMoveToPlayer::OnTick(DeltaSeconds, Owner);\n\tRestTime -= DeltaSeconds;\n\treturn RestTime > 0.0f;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoEAMoveAwayFromPlayer::OnTick(float DeltaSeconds, ASoEnemy* Owner)\n{\n\tTimer += DeltaSeconds;\n\tif (MaxMoveTime < Timer)\n\t\treturn false;\n\n\tconst FSoSplinePoint PlayerSplineLoc = USoStaticHelper::GetPlayerSplineLocation(Owner);\n\tconst FSoSplinePoint OwnerSplineLoc = ISoSplineWalker::Execute_GetSplineLocationI(Owner);\n\tconst float Distance = PlayerSplineLoc.GetDistanceFromSplinePoint(OwnerSplineLoc, 1000);\n\n\tif (fabs(Distance) < AcceptedDistance)\n\t{\n\t\tif (bBetweenMarkers)\n\t\t{\n\t\t\tASoMarker* Marker0 = Owner->GetTargetMarker(0);\n\t\t\tASoMarker* Marker1 = Owner->GetTargetMarker(1);\n\t\t\tif (Marker0 != nullptr && Marker1 != nullptr)\n\t\t\t{\n\t\t\t\tconst float PlayerToMarker0 = PlayerSplineLoc.GetDistanceFromSplinePoint(Marker0->GetSplineLocation());\n\t\t\t\tconst float PlayerToMarker1 = PlayerSplineLoc.GetDistanceFromSplinePoint(Marker1->GetSplineLocation());\n\t\t\t\tASoMarker* SelectedMarker = (fabs(PlayerToMarker1) < fabs(PlayerToMarker0)) ? Marker0 : Marker1;\n\n\t\t\t\tconst float SelectedDistance = Owner->GetSoMovement()->GetSplineLocation().GetDistanceFromSplinePoint(SelectedMarker->GetSplineLocation());\n\t\t\t\tif (fabs(SelectedDistance) < MarkerDistanceThreshold)\n\t\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\tOwner->AddMovementInput(OwnerSplineLoc.GetDirection(), -FMath::Sign(Distance));\n\t\tif (bFacePlayer)\n\t\t{\n\t\t\tconst float TargetDir = FMath::Sign((PlayerSplineLoc.GetDistanceFromSplinePoint(OwnerSplineLoc, 10000)));\n\t\t\tOwner->SetActorRotation((OwnerSplineLoc.GetDirection() * TargetDir).Rotation());\n\t\t}\n\t\treturn true;\n\t}\n\treturn false;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoEAMoveAwayFromPlayer::OnEnter(ASoEnemy* Owner)\n{\n\tSuper::OnEnter(Owner);\n\n\tTimer = 0.0f;\n\tOwner->GetSoMovement()->bOrientRotationToMovement = !bFacePlayer;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoEAMoveAwayFromPlayer::OnLeave(ASoEnemy* Owner)\n{\n\tSuper::OnLeave(Owner);\n\tOwner->GetSoMovement()->bOrientRotationToMovement = true;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoEAMoveAwayFromClosestAlly::OnTick(float DeltaSeconds, ASoEnemy* Owner)\n{\n\tTimer += DeltaSeconds;\n\tif (MaxMoveTime < Timer)\n\t\treturn false;\n\n\tconst FSoSplinePoint OwnerSplineLoc = ISoSplineWalker::Execute_GetSplineLocationI(Owner);\n\tconst float Distance = USoEnemyHelper::GetSignedSplineDistanceToClosestEnemy(Owner, bIgnoreFloatings, bOnlySameClass);\n\tif (fabs(Distance) < AcceptedDistance)\n\t{\n\t\tOwner->AddMovementInput(OwnerSplineLoc.GetDirection(), FMath::Sign(Distance));\n\t\treturn true;\n\t}\n\treturn false;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoEAMoveAwayFromClosestAlly::OnEnter(ASoEnemy* Owner)\n{\n\tSuper::OnEnter(Owner);\n\n\tTimer = 0.0f;\n\tOwner->GetSoMovement()->bOrientRotationToMovement = false;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoEAMoveAwayFromClosestAlly::OnLeave(ASoEnemy* Owner)\n{\n\tSuper::OnLeave(Owner);\n\tOwner->GetSoMovement()->bOrientRotationToMovement = true;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoEATurnToPlayer::OnTick(float DeltaSeconds, ASoEnemy* Owner)\n{\n\tOwner->LookAtPlayer();\n\treturn false;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoEATurn::OnTick(float DeltaSeconds, ASoEnemy* Owner)\n{\n\tOwner->SetActorRotation((-Owner->GetActorForwardVector()).Rotation());\n\treturn false;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoEAMoveTowardsDirection::OnTick(float DeltaSeconds, ASoEnemy* Owner)\n{\n\tCounter += DeltaSeconds;\n\n\tOwner->AddMovementInput(ISoSplineWalker::Execute_GetSplineLocationI(Owner).GetDirectionFromVector(Owner->GetActorForwardVector()), DirectionMultiplier);\n\treturn Counter < Duration;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoEAMoveTowardsDirection::OnEnter(ASoEnemy* Owner)\n{\n\tSuper::OnEnter(Owner);\n\n\tCounter = 0.0f;\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoEAJumpTo::OnEnter(ASoEnemy* Owner)\n{\n\tSuper::OnEnter(Owner);\n\n\tUSoCharacterMovementComponent* SoMovement = Owner->GetSoMovement();\n\tCachedWalkSpeed = SoMovement->MaxWalkSpeed;\n\n\tCalculateTarget(Owner);\n\tfloat Distance = SoMovement->GetSplineLocation().GetDistanceFromSplinePoint(TargetPoint);\n\tDistance += FMath::Sign(Distance) * DistanceOffset;\n\n\tif (bClampToMarkers)\n\t{\n\t\tASoMarker* Marker0 = Owner->GetTargetMarker(0);\n\t\tASoMarker* Marker1 = Owner->GetTargetMarker(1);\n\t\tif (Marker0 != nullptr && Marker1 != nullptr)\n\t\t{\n\t\t\tDistance = USoSplineHelper::ClampOffsetBetweenSplinePoints(SoMovement->GetSplineLocation(),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t   Marker0->GetSplineLocation(),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t   Marker1->GetSplineLocation(),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t   Distance);\n\t\t}\n\t}\n\n\tconst float Time = 2 * JumpZ / SoMovement->GetGravityZ();\n\tSoMovement->MaxWalkSpeed = fabs(Distance / Time);\n\n\tconst FVector Direction = -SoMovement->GetSplineLocation().GetDirection() * FMath::Sign(Distance);\n\tSoMovement->Velocity = Direction * SoMovement->MaxWalkSpeed;\n\n\tSoMovement->JumpZVelocity = JumpZ;\n\tSoMovement->DoJump(false);\n\n\tSuper::OnEnter(Owner);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoEAJumpTo::OnLeave(ASoEnemy* Owner)\n{\n\tOwner->GetSoMovement()->MaxWalkSpeed = CachedWalkSpeed;\n\tSuper::OnLeave(Owner);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoEAJumpTo::OnTick(float DeltaSeconds, ASoEnemy* Owner)\n{\n\tSuper::OnTick(DeltaSeconds, Owner);\n\tif (bClampToMarkers && !Owner->IsBetweenMarkers(0, 1, true))\n\t{\n\t\tASoMarker* Marker0 = Owner->GetTargetMarker(0);\n\t\tASoMarker* Marker1 = Owner->GetTargetMarker(1);\n\t\tif (Marker0 != nullptr && Marker1 != nullptr)\n\t\t{\n\t\t\tUSoCharacterMovementComponent* SoMovement = Owner->GetSoMovement();\n\t\t\tconst float DistanceToMarker0 = SoMovement->GetSplineLocation().GetDistanceFromSplinePoint(Marker0->GetSplineLocation());\n\t\t\tconst float DistanceToMarker1 = SoMovement->GetSplineLocation().GetDistanceFromSplinePoint(Marker1->GetSplineLocation());\n\t\t\tASoMarker* SelectedMarker = fabs(DistanceToMarker0) < fabs(DistanceToMarker1) ? Marker0 : Marker1;\n\n\t\t\tSoMovement->SetSplineLocation(SelectedMarker->GetSplineLocation());\n\t\t\tOwner->SetActorLocation(SoMovement->GetSplineLocation().ToVector(Owner->GetActorLocation().Z), true);\n\t\t}\n\t}\n\n\t// TODO: why is this here, this seems useless\n\tconst float CurrentTime =  Owner->GetWorld()->GetTimeSeconds();\n\tconst float ThresholdSeconds = LastUsageTime + 0.2f;\n\treturn !Owner->GetSoMovement()->IsMovingOnGround() || ThresholdSeconds > CurrentTime;\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoEAJumpTo::CalculateTarget(ASoEnemy* Owner)\n{\n\tTargetPoint = Owner->GetSoMovement()->GetSplineLocation();\n\tTargetPoint += TargetPoint.GetDirectionModifierFromVector(Owner->GetActorForwardVector()) * 5.0f;\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoEAJumpToPlayer::CalculateTarget(ASoEnemy* Owner)\n{\n\tTargetPoint = USoStaticHelper::GetPlayerSplineLocation(Owner);\n}\n"
  },
  {
    "path": "Source/SOrb/Enemy/EActions/SoEAMovements.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#pragma once\n#include \"SoEAction.h\"\n#include \"SplineLogic/SoSplinePoint.h\"\n#include \"SoEAMovements.generated.h\"\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n/**\n *  Abstract base class for spline based movement\n */\nUCLASS(BlueprintType, EditInlineNew, Abstract)\nclass SORB_API USoEAMoveTo : public USoEAction\n{\n\tGENERATED_BODY()\nprotected:\n\n\tvirtual void OnEnter(ASoEnemy* Owner) override;\n\tvirtual bool OnTick(float DeltaSeconds, ASoEnemy* Owner) override;\n\nprotected:\n\n\t/** The distance the owner has to be from the target, once it is reached the action is finished */\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Params)\n\tfloat AcceptedDistance = 30.0f;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Params)\n\tbool bGiveUpIfNoProgress = false;\n\n\tfloat DistanceLastFrame;\n\tfloat TimeSinceProgress;\n\n\tFSoSplinePoint TargetPoint;\n\n\tFVector OwnerLastFramePos;\n};\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUCLASS(BlueprintType, EditInlineNew)\nclass SORB_API USoEAMoveToMarker : public USoEAMoveTo\n{\n\tGENERATED_BODY()\n\nprotected:\n\n\tvirtual void OnEnter(ASoEnemy* Owner) override;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Params)\n\tint32 Index;\n};\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUCLASS(BlueprintType, EditInlineNew)\nclass SORB_API USoEAMoveToPlayer : public USoEAMoveTo\n{\n\tGENERATED_BODY()\n\nprotected:\n\n\tvirtual bool OnTick(float DeltaSeconds, ASoEnemy* Owner) override;\n\nprotected:\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Params)\n\tbool bOnlyBetweenMarkers = false;\n\n\t/** Only works for same spline */\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Params)\n\tbool bClampBetweenMarkers = false;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Params)\n\tbool bCheckResultOnInvalidMarkers = false;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Params)\n\tint32 MarkerIndex0 = 0;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Params)\n\tint32 MarkerIndex1 = 1;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Params)\n\tfloat SplineOffset = 0.0f;\n};\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUCLASS(BlueprintType, EditInlineNew)\nclass SORB_API USoEAMoveToPlayerForDuration : public USoEAMoveToPlayer\n{\n\tGENERATED_BODY()\n\nprotected:\n\n\tvirtual void OnEnter(ASoEnemy* Owner) override;\n\tvirtual bool OnTick(float DeltaSeconds, ASoEnemy* Owner) override;\n\nprotected:\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Params)\n\tfloat Duration = 2.0f;\n\n\tfloat RestTime = 0.0f;\n};\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUCLASS(BlueprintType, EditInlineNew)\nclass SORB_API USoEAMoveAwayFromPlayer : public USoEAction\n{\n\tGENERATED_BODY()\n\nprotected:\n\n\tvirtual void OnEnter(ASoEnemy* Owner) override;\n\tvirtual bool OnTick(float DeltaSeconds, ASoEnemy* Owner) override;\n\tvirtual void OnLeave(ASoEnemy* Owner) override;\n\nprotected:\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Params)\n\tfloat AcceptedDistance;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Params)\n\tfloat MaxMoveTime;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Params)\n\tbool bFacePlayer;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Params)\n\tbool bBetweenMarkers = false;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Params)\n\tfloat MarkerDistanceThreshold = 400;\n\n\tfloat Timer;\n};\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUCLASS(BlueprintType, EditInlineNew)\nclass SORB_API USoEAMoveAwayFromClosestAlly : public USoEAction\n{\n\tGENERATED_BODY()\n\nprotected:\n\n\tvirtual void OnEnter(ASoEnemy* Owner) override;\n\tvirtual bool OnTick(float DeltaSeconds, ASoEnemy* Owner) override;\n\tvirtual void OnLeave(ASoEnemy* Owner) override;\n\nprotected:\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Params)\n\tfloat AcceptedDistance;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Params)\n\tfloat MaxMoveTime;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Params)\n\tbool bIgnoreFloatings = false;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Params)\n\tbool bOnlySameClass = true;\n\n\tfloat Timer;\n};\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUCLASS(BlueprintType, EditInlineNew)\nclass SORB_API USoEATurnToPlayer : public USoEAction\n{\n\tGENERATED_BODY()\nprotected:\n\tvirtual bool OnTick(float DeltaSeconds, ASoEnemy* Owner) override;\n};\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUCLASS(BlueprintType, EditInlineNew)\nclass SORB_API USoEATurn : public USoEAction\n{\n\tGENERATED_BODY()\nprotected:\n\tvirtual bool OnTick(float DeltaSeconds, ASoEnemy* Owner) override;\n};\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUCLASS(BlueprintType, EditInlineNew)\nclass SORB_API USoEAMoveTowardsDirection : public USoEAction\n{\n\tGENERATED_BODY()\n\nprotected:\n\n\tvirtual bool OnTick(float DeltaSeconds, ASoEnemy* Owner) override;\n\tvirtual void OnEnter(ASoEnemy* Owner) override;\n\n\nprotected:\n\n\tUPROPERTY()\n\tint32 DirectionMultiplier = 1.0f;\n\n\tUPROPERTY()\n\tfloat Duration = 4.0f;\n\n\tfloat Counter = 0.0f;\n};\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUCLASS(BlueprintType, EditInlineNew)\nclass SORB_API USoEAJumpTo : public USoEAMoveTo\n{\n\tGENERATED_BODY()\n\nprotected:\n\tvirtual void OnEnter(ASoEnemy* Owner) override;\n\tvirtual void OnLeave(ASoEnemy* Owner) override;\n\n\tvirtual bool OnTick(float DeltaSeconds, ASoEnemy* Owner) override;\n\n\tvirtual void CalculateTarget(ASoEnemy* Owner);\n\n\tUPROPERTY(EditAnywhere)\n\tfloat JumpZ = 800;\n\n\tUPROPERTY(EditAnywhere)\n\tfloat DistanceOffset = 0.0f;\n\n\tUPROPERTY(EditAnywhere)\n\tbool bClampToMarkers = false;\n\n\tfloat CachedWalkSpeed;\n};\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUCLASS(BlueprintType, EditInlineNew)\nclass SORB_API USoEAJumpToPlayer : public USoEAJumpTo\n{\n\tGENERATED_BODY()\n\nprotected:\n\n\tvirtual void CalculateTarget(ASoEnemy* Owner) override;\n};\n"
  },
  {
    "path": "Source/SOrb/Enemy/EActions/SoEAParallel.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#include \"SoEAParallel.h\"\n#include \"Enemy/SoEnemy.h\"\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nfloat USoEAParallel::Evaluate(const ASoEnemy* Owner) const\n{\n\tif (Action0 == nullptr || Action1 == nullptr)\n\t{\n\t\tUE_LOG(LogSoEnemyAI, Warning, TEXT(\"USoEAParallel::Evaluate failed: one of the actions isn't setup properly\"));\n\t\treturn 0.0f;\n\t}\n\n\tswitch (Behaviour)\n\t{\n\t\tcase ESoParallelBehaviour::EPB_TrySecondPauseFirst:\n\t\tcase ESoParallelBehaviour::EPB_ExecuteFirstWhileNotSecond:\n\t\t\treturn Super::Evaluate(Owner) * Action0->Evaluate(Owner);\n\n\t\tcase ESoParallelBehaviour::EPB_ExecuteAtOnce:\n\t\tdefault:\n\t\t\treturn Super::Evaluate(Owner) * Action0->Evaluate(Owner) * Action1->Evaluate(Owner);\n\t}\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoEAParallel::Interrupt(ASoEnemy* Owner)\n{\n\tAction0->Interrupt(Owner);\n\tif (bSecondIsRunning)\n\t\tAction1->Interrupt(Owner);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoEAParallel::OnEnter(ASoEnemy* Owner)\n{\n\tif (Action0)\n\t\tAction0->Start(Owner);\n\n\tif (Behaviour == ESoParallelBehaviour::EPB_ExecuteAtOnce)\n\t{\n\t\tAction1->Start(Owner);\n\t\tbSecondIsRunning = true;\n\t}\n\telse\n\t{\n\t\tCounter = SecondTryInterval;\n\t\tbSecondIsRunning = false;\n\t}\n\n\tbFirstFinished = false;\n\tbSecondFinished = false;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoEAParallel::OnTick(float DeltaSeconds, ASoEnemy* Owner)\n{\n\tif (Action0 == nullptr || Action1 == nullptr)\n\t\treturn false;\n\n\tswitch (Behaviour)\n\t{\n\t\tcase ESoParallelBehaviour::EPB_ExecuteAtOnce:\n\t\t{\n\t\t\tif (bEndlessLoop)\n\t\t\t{\n\t\t\t\tif (!Action0->Tick(DeltaSeconds, Owner))\n\t\t\t\t\tAction0->Start(Owner);\n\n\t\t\t\tif (!Action1->Tick(DeltaSeconds, Owner))\n\t\t\t\t\tAction1->Start(Owner);\n\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\t\n\t\t\tif (!bFirstFinished)\n\t\t\t\tbFirstFinished = !Action0->Tick(DeltaSeconds, Owner);\n\t\t\tif (!bSecondFinished)\n\t\t\t\tbSecondFinished = !Action1->Tick(DeltaSeconds, Owner);\n\t\t\t\n\t\t\treturn !bFirstFinished || !bSecondFinished;\n\t\t}\n\n\t\tcase ESoParallelBehaviour::EPB_TrySecondPauseFirst:\n\t\t{\n\t\t\tif (bSecondIsRunning)\n\t\t\t\tbSecondIsRunning = Action1->Tick(DeltaSeconds, Owner);\n\t\t\telse\n\t\t\t{\n\t\t\t\tif (!Action0->Tick(DeltaSeconds, Owner))\n\t\t\t\t\tAction0->Start(Owner);\n\n\t\t\t\tCounter -= DeltaSeconds;\n\t\t\t\tif (Counter < 0.0f)\n\t\t\t\t{\n\t\t\t\t\tif (Action1->Evaluate(Owner) > KINDA_SMALL_NUMBER)\n\t\t\t\t\t{\n\t\t\t\t\t\tbSecondIsRunning = true;\n\t\t\t\t\t\tAction1->Start(Owner);\n\t\t\t\t\t}\n\t\t\t\t\tCounter = SecondTryInterval;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn true;\n\n\t\tcase ESoParallelBehaviour::EPB_ExecuteFirstWhileNotSecond:\n\t\t{\n\t\t\tif (bSecondIsRunning)\n\t\t\t{\n\t\t\t\tif (!Action1->Tick(DeltaSeconds, Owner))\n\t\t\t\t\treturn false;\n\t\t\t}\n\t\t\telse if (Action1->Evaluate(Owner) > KINDA_SMALL_NUMBER)\n\t\t\t{\n\t\t\t\tbSecondIsRunning = true;\n\t\t\t\tAction1->Start(Owner);\n\t\t\t\tAction0->Interrupt(Owner);\n\t\t\t}\n\t\t\telse if(!Action0->Tick(DeltaSeconds, Owner))\n\t\t\t\tAction0->Start(Owner);\n\t\t}\n\t\treturn true;\n\n\t\tdefault:\n\t\t\treturn false;\n\t}\n}\n\n"
  },
  {
    "path": "Source/SOrb/Enemy/EActions/SoEAParallel.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#pragma once\n#include \"SoEAction.h\"\n#include \"SoEAParallel.generated.h\"\n\n/** Different predefined logic the USoEAParallel is controlled */\nUENUM(BlueprintType)\nenum class ESoParallelBehaviour : uint8\n{\n\t// both action is executed at the same time\n\tEPB_ExecuteAtOnce\t\t\t\tUMETA(DisplayName = \"ExecuteAtOnce\"),\n\n\t// first is executed normally\n\t// second is tried from time to time, if it does not fail first is not updated until second is running\n\t// does not have a not looped variant\n\tEPB_TrySecondPauseFirst\t\t\tUMETA(DisplayName = \"TrySecondPauseFirst\"),\n\n\t// first is executed in a loop\n\t// second is tried from time to time, if it does not fail first is interrupted\n\t// and once second is finished the task is over\n\tEPB_ExecuteFirstWhileNotSecond\tUMETA(DisplayName = \"ExecuteFirstWhileNotSecond\"),\n};\n\n\n/**\n *  Two actions executed parallel\n *  Only use with actions which aren't cause conflict!\n */\nUCLASS(BlueprintType, EditInlineNew)\nclass SORB_API USoEAParallel : public USoEAction\n{\n\tGENERATED_BODY()\npublic:\n\n\t/** Evaluate = Super::Evaluate() * Acton0.Evaluate() * Action1.Evaluate() */\n\tvirtual float Evaluate(const ASoEnemy* Owner) const override;\n\n\tvirtual void Interrupt(ASoEnemy* Owner) override;\n\nprotected:\n\n\tvirtual void OnEnter(ASoEnemy* Owner) override;\n\tvirtual bool OnTick(float DeltaSeconds, ASoEnemy* Owner) override;\n\nprotected:\n\n\tUPROPERTY(Instanced, BlueprintReadWrite, EditAnywhere, Category = Params)\n\tUSoEAction* Action0;\n\n\tUPROPERTY(Instanced, BlueprintReadWrite, EditAnywhere, Category = Params)\n\tUSoEAction* Action1;\n\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere, Category = Params)\n\tbool bEndlessLoop = false;\n\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere, Category = Params)\n\tESoParallelBehaviour Behaviour = ESoParallelBehaviour::EPB_ExecuteAtOnce;\n\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere, Category = Params)\n\tfloat SecondTryInterval = 1.5f;\n\n\tfloat Counter = -1.0f;\n\tbool bSecondIsRunning = false;\n\n\t// used in EPB_ExecuteAtOnce mode to stop calling tick on the already finished one\n\tbool bFirstFinished;\n\tbool bSecondFinished;\n};\n"
  },
  {
    "path": "Source/SOrb/Enemy/EActions/SoEARangeAttack.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#include \"SoEARangeAttack.h\"\n\n#include \"Components/CapsuleComponent.h\"\n\n#include \"CharacterBase/SoCharacterMovementComponent.h\"\n#include \"Enemy/SoEnemy.h\"\n#include \"Basic/Helpers/SoStaticHelper.h\"\n#include \"Projectiles/SoProjectileSpawnerComponent.h\"\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoEARangeAttack::OnEnter(ASoEnemy* Owner)\n{\n\tUE_LOG(LogSoEnemyAI, Display, TEXT(\"USoEARangeAttack::OnEnter (%s)\"), *Name.ToString());\n\n\tCounter = 0.0f;\n\n\tif (AnimationType == ESoRangeAttackAnimType::ERAT_SingleAnimBasedTiming)\n\t\tif (UAnimSequenceBase* const* AnimPtr = Owner->GetAnimationMap().Find(Name))\n\t\t\tDuration = USoStaticHelper::GetScaledAnimLength(*AnimPtr);\n\n\tOwner->OnRangeAttackStarted(Name, Duration, AnimationType, bInterruptible);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoEARangeAttack::OnTick(float DeltaSeconds, ASoEnemy* Owner)\n{\n\tconst float NewCounter = Counter + DeltaSeconds;\n\n\tfor (const FSoRangeAttackSpawn& Spawn : AttackList)\n\t\tif (Spawn.Time >= Counter && Spawn.Time < NewCounter)\n\t\t{\n\t\t\tconst FSoERangeAttackProfile* Profile = Owner->InitializeAndGetRangeAttackProfile(Spawn.Index, Spawn.Variant);\n\t\t\tif (Profile == nullptr)\n\t\t\t{\n\t\t\t\tUE_LOG(LogSoEnemyAI, Error, TEXT(\"%s Failed to spawn projectile: invalid index %d\"), *Owner->GetName(), Spawn.Index);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tUE_LOG(LogSoEnemyAI, Display, TEXT(\"%s spawns projectile!\"), *Owner->GetName());\n\n\t\t\tUSoProjectileSpawnerComponent* ProjectileSpawner = Owner->GetProjectileSpawner();\n\n\t\t\tif (Profile->bUseThisInsteadOfComponentDefaults)\n\t\t\t\tProjectileSpawner->SpawnProjectileFromClass(Profile->ProjectileClass,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tProfile->Location,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tProfile->Orientation,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tProfile->bUseProjectileInitDataOverride ? &Profile->InitDataOverride : nullptr);\n\t\t\telse\n\t\t\t\tProjectileSpawner->SpawnProjectile();\n\t\t}\n\n\tfor (const FSoAnimationOverride& Animation : AnimationOverrideList)\n\t\tif (Animation.Time >= Counter && Animation.Time < NewCounter)\n\t\t\tOwner->OverrideAnimation(Animation.bInterruptible, Animation.AnimationName, Animation.Duration, Animation.bLoop);\n\n\tCounter = NewCounter;\n\n\tbool bStillAlive = Counter < Duration;\n\tif (bForceDoneOnDurationOver && !bStillAlive)\n\t\treturn false;\n\n\tif (bDoneIfProjectilesDied && AttackList.Num() > 0 && AttackList.Last(0).Time < Counter)\n\t\tbStillAlive = Owner->GetProjectileSpawner()->HasActiveProjectile();\n\n\treturn bStillAlive;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoEARangeAttack::OnLeave(ASoEnemy* Owner)\n{\n\tUE_LOG(LogSoEnemyAI, Display, TEXT(\"USoEARangeAttack::OnLeave (%s)\"), *Name.ToString());\n\tOwner->OnRangeAttackEnded();\n}\n"
  },
  {
    "path": "Source/SOrb/Enemy/EActions/SoEARangeAttack.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#pragma once\n\n#include \"SoEAction.h\"\n#include \"Engine/EngineTypes.h\"\n\n#include \"Enemy/SoEnemyDataTypes.h\"\n#include \"SoEARangeAttack.generated.h\"\n\n\nUSTRUCT(BlueprintType, Blueprintable)\nstruct FSoRangeAttackSpawn\n{\n\tGENERATED_USTRUCT_BODY()\npublic:\n\n\t/** time of spawn (after range attack start) */\n\tUPROPERTY(EditAnywhere)\n\tfloat Time = 0.0f;\n\n\t/** index of the projectile profile */\n\tUPROPERTY(EditAnywhere)\n\tint32 Index = 0;\n\n\t/** subtype, can be used in BP */\n\tUPROPERTY(EditAnywhere)\n\tint32 Variant = 0;\n};\n\nUSTRUCT(BlueprintType, Blueprintable)\nstruct FSoAnimationOverride\n{\n\tGENERATED_USTRUCT_BODY()\npublic:\n\n\t/** time of spawn (after range attack start) */\n\tUPROPERTY(EditAnywhere)\n\tfloat Time;\n\n\tUPROPERTY(EditAnywhere)\n\tFName AnimationName;\n\n\tUPROPERTY(EditAnywhere)\n\tfloat Duration;\n\n\tUPROPERTY(EditAnywhere)\n\tbool bLoop = false;\n\n\tUPROPERTY(EditAnywhere)\n\tbool bInterruptible = false;\n};\n\n//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUCLASS(BlueprintType, EditInlineNew)\nclass SORB_API USoEARangeAttack : public USoEAction\n{\n\tGENERATED_BODY()\nprotected:\n\n\tvirtual void OnEnter(ASoEnemy* Owner) override;\n\tvirtual bool OnTick(float DeltaSeconds, ASoEnemy* Owner) override;\n\tvirtual void OnLeave(ASoEnemy* Owner) override;\n\n\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = Params)\n\tFName Name;\n\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = Params)\n\tfloat Duration;\n\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = Params)\n\tbool bDoneIfProjectilesDied = false;\n\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = Params)\n\tbool bForceDoneOnDurationOver = false;\n\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = Params)\n\tESoRangeAttackAnimType AnimationType;\n\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = Params)\n\tTArray<FSoRangeAttackSpawn> AttackList;\n\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = Params)\n\tTArray<FSoAnimationOverride> AnimationOverrideList;\n\n\tfloat Counter;\n};\n"
  },
  {
    "path": "Source/SOrb/Enemy/EActions/SoEASpawnWave.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#include \"SoEASpawnWave.h\"\n\n#include \"Enemy/SoEnemy.h\"\n#include \"Enemy/SoEnemySpawner.h\"\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoEASpawnWave::OnEnter(ASoEnemy* Owner)\n{\n\tASoEnemySpawner* Spawner = Owner->GetTargetSpawner(Index);\n\tif (Spawner != nullptr)\n\t{\n\t\tSpawner->DeactivateAndReset();\n\t\tSpawner->Activate();\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoEASpawnWave::OnTick(float DeltaSeconds, ASoEnemy* Owner)\n{\n\tASoEnemySpawner* Spawner = Owner->GetTargetSpawner(Index);\n\treturn Spawner != nullptr && Spawner->IsActiveAndNotDone();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoEASpawnWave::OnLeave(ASoEnemy* Owner)\n{\n}\n"
  },
  {
    "path": "Source/SOrb/Enemy/EActions/SoEASpawnWave.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#pragma once\n\n#include \"SoEAction.h\"\n#include \"SoEASpawnWave.generated.h\"\n\n\n//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUCLASS(BlueprintType, EditInlineNew)\nclass SORB_API USoEASpawnWave : public USoEAction\n{\n\tGENERATED_BODY()\nprotected:\n\n\tvirtual void OnEnter(ASoEnemy* Owner) override;\n\tvirtual bool OnTick(float DeltaSeconds, ASoEnemy* Owner) override;\n\tvirtual void OnLeave(ASoEnemy* Owner) override;\n\n\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = Params)\n\tint32 Index = 0;\n};\n"
  },
  {
    "path": "Source/SOrb/Enemy/EActions/SoEAStunned.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#include \"SoEAStunned.h\"\n\n#include \"Enemy/SoEnemy.h\"\n\n//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoEAStunned::OnEnter(ASoEnemy* Owner)\n{\n\tbInterruptible = false;\n\n\tISoMortal::Execute_OnStatusEffectChanged(Owner, StatusEffect, true);\n\n\tif (StatusEffect != ESoStatusEffect::ESE_BootTransmutation)\n\t\tif (FSoEActions* HitReacts = Owner->GetActionList(ESoActionList::EAL_HitReact))\n\t\t{\n\t\t\tHitReact = Owner->GetFirstSatisfiedAction(HitReacts->Array);\n\t\t\tif (HitReact != nullptr)\n\t\t\t\tHitReact->Start(Owner);\n\t\t}\n\n\tOwner->OnStunned();\n\n\tRestTime = Duration;\n}\n\n//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoEAStunned::OnLeave(ASoEnemy* Owner)\n{\n \tISoMortal::Execute_OnStatusEffectChanged(Owner, StatusEffect, false);\n\tOwner->OnStunOver();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoEAStunned::OnTick(float DeltaSeconds, ASoEnemy* Owner)\n{\n\tif (HitReact != nullptr)\n\t\tif (!HitReact->Tick(DeltaSeconds, Owner))\n\t\t\tHitReact = nullptr;\n\n\tRestTime -= DeltaSeconds;\n\n\treturn HitReact != nullptr || (RestTime > 0.0f);\n}\n\n//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoEAStunned::Interrupt(ASoEnemy* Owner)\n{\n\tif (HitReact != nullptr)\n\t\tHitReact->Interrupt(Owner);\n\n\tHitReact = nullptr;\n\tSuper::Interrupt(Owner);\n}\n"
  },
  {
    "path": "Source/SOrb/Enemy/EActions/SoEAStunned.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#pragma once\n\n#include \"SoEAction.h\"\n#include \"Enemy/SoEnemyDataTypes.h\"\n#include \"SoEAStunned.generated.h\"\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUCLASS(BlueprintType, EditInlineNew)\nclass SORB_API USoEAStunned : public USoEAction\n{\n\tGENERATED_BODY()\npublic:\n\n\tvoid SetDuration(float DeltaSeconds) { Duration = DeltaSeconds; }\n\tvoid SetStatusEffect(ESoStatusEffect InStatusEffect) { StatusEffect = InStatusEffect; }\n\nprotected:\n\n\tvirtual void OnEnter(ASoEnemy* Owner) override;\n\tvirtual void OnLeave(ASoEnemy* Owner) override;\n\tvirtual bool OnTick(float DeltaSeconds, ASoEnemy* Owner) override;\n\tvirtual void Interrupt(ASoEnemy* Owner) override;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Params)\n\tfloat Duration;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Params)\n\tESoStatusEffect StatusEffect;\n\n\tUPROPERTY()\n\tUSoEAction* HitReact;\n\n\tfloat RestTime;\n};\n"
  },
  {
    "path": "Source/SOrb/Enemy/EActions/SoEATeleportToMarker.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#include \"SoEATeleportToMarker.h\"\n#include \"CharacterBase/SoCharacterMovementComponent.h\"\n#include \"Enemy/SoEnemy.h\"\n#include \"SplineLogic/SoMarker.h\"\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoEATeleportToMarker::OnTick(float DeltaSeconds, ASoEnemy* Owner)\n{\n\tconst float NewFrameTime = LastFrameTime + DeltaSeconds;\n\tif (LastFrameTime < TeleportDelay && NewFrameTime >= TeleportDelay)\n\t{\n\t\tFSoSplinePoint SplineLocation;\n\t\tif (Owner->GetSplineLocationFromMarker(Index, SplineLocation))\n\t\t{\n\t\t\tconst FVector Location = SplineLocation.GetWorldLocation(SplineLocation.GetReferenceZ());\n\t\t\tif (bPutToGround)\n\t\t\t{\n\t\t\t\t// TODO: DO STUFF\n\t\t\t}\n\n\t\t\tOwner->SetActorLocation(Location, false, nullptr, ETeleportType::TeleportPhysics);\n\t\t\tSplineLocation.SetReferenceActor(Owner);\n\t\t\tOwner->GetSoMovement()->SetSplineLocation(SplineLocation);\n\t\t}\n\t\telse\n\t\t\tUE_LOG(LogSoEnemyAI, Error, TEXT(\"Enemy %s failed to perform USoEATeleportToMarker: invalid target location (%d)!\"), *Owner->GetName(), Index);\n\n\t\tOwner->OnTeleportBP(false);\n\t}\n\n\tLastFrameTime = NewFrameTime;\n\treturn LastFrameTime < Duration;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoEATeleportToMarker::OnEnter(ASoEnemy* Owner)\n{\n\tOwner->OnTeleportBP(true);\n\tLastFrameTime = 0.0f;\n}\n"
  },
  {
    "path": "Source/SOrb/Enemy/EActions/SoEATeleportToMarker.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#pragma once\n#include \"SoEAction.h\"\n#include \"SplineLogic/SoSplinePoint.h\"\n#include \"SoEATeleportToMarker.generated.h\"\n\n\nUCLASS(BlueprintType, EditInlineNew)\nclass SORB_API USoEATeleportToMarker : public USoEAction\n{\n\tGENERATED_BODY()\nprotected:\n\n\tvirtual void OnEnter(ASoEnemy* Owner) override;\n\tvirtual bool OnTick(float DeltaSeconds, ASoEnemy* Owner) override;\n\nprotected:\n\n\t/** The distance the owner has to be from the target, once it is reached the action is finished */\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Params)\n\tint32 Index = 0;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Params)\n\tbool bPutToGround = true;\n\n\t/** sum duration, includes wait time before and after teleport */\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Params)\n\tfloat Duration = 1.0f;\n\n\t/** delay from action start before the teleport is performed */\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Params)\n\tfloat TeleportDelay = 0.5f;\n\n\tfloat LastFrameTime = 0.0f;\n};\n"
  },
  {
    "path": "Source/SOrb/Enemy/EActions/SoEAction.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#include \"SoEAction.h\"\n\n#include \"Engine/World.h\"\n\n#include \"Enemy/SoEnemy.h\"\n#include \"Enemy/EPreconditions/SoEPrecondition.h\"\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoEAction::Start(ASoEnemy* Owner)\n{\n\tDECLARE_SCOPE_CYCLE_COUNTER(TEXT(\"EAction - Start\"), STAT_EAction_Start, STATGROUP_SoEnemy);\n\n\tLastUsageTime = Owner->GetWorld()->GetTimeSeconds();\n\tOnEnter(Owner);\n\t// UE_LOG(LogSoEnemyAI, Display, TEXT(\"Action entered: %s (%s)\"), *GetName(), *Owner->GetName());\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoEAction::Interrupt(ASoEnemy* Owner)\n{\n\tDECLARE_SCOPE_CYCLE_COUNTER(TEXT(\"EAction - Interrupt\"), STAT_EAction_Interrupt, STATGROUP_SoEnemy);\n\n\tOnLeave(Owner);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nfloat USoEAction::Evaluate(const ASoEnemy* Owner) const\n{\n\tDECLARE_SCOPE_CYCLE_COUNTER(TEXT(\"EAction - Evaluate\"), STAT_EAction_Evaluate, STATGROUP_SoEnemy);\n\n\tfloat GetMe = 1.0f;\n\n\tfor (const auto* Prec : Preconditions)\n\t{\n\t\tif (Prec != nullptr)\n\t\t{\n\t\t\tGetMe *= Prec->Evaluate(Owner, this);\n\t\t\t// first prec can stop the others, this way we can save some energy\n\t\t\t// harder to calculate predictions should be placed at the end of the array\n\t\t\tif (GetMe < KINDA_SMALL_NUMBER)\n\t\t\t\treturn 0.0f;\n\t\t}\n\t}\n\n\treturn GetMe;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoEAction::Tick(float DeltaSeconds, ASoEnemy* Owner)\n{\n\tDECLARE_SCOPE_CYCLE_COUNTER(TEXT(\"EAction - Tick\"), STAT_EAction_Tick, STATGROUP_SoEnemy);\n\n\tif (bForceSplineDirection)\n\t\tOwner->SetActorRotation(ISoSplineWalker::Execute_GetSplineLocationI(Owner).GetDirectionFromVector(Owner->GetActorForwardVector()).Rotation());\n\n\tconst bool bResult = OnTick(DeltaSeconds, Owner);\n\tif (!bResult ||\n\t\t(bOnlyWhileEvaluated && Evaluate(Owner) < KINDA_SMALL_NUMBER))\n\t{\n\t\tOnLeave(Owner);\n\t\treturn false;\n\t}\n\n\treturn true;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nfloat USoEAction::GetLastUsageTime() const\n{\n\treturn LastUsageTime;\n}\n"
  },
  {
    "path": "Source/SOrb/Enemy/EActions/SoEAction.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#pragma once\n\n#include \"CoreMinimal.h\"\n#include \"SoEAction.generated.h\"\n\nclass ASoEnemy;\nclass USoEPrecondition;\n\n/**\n *  Abstract base class for all enemy actions\n *  Basic element of the AI system:\n *  1. An action is selected based on its precondition\n *  2. The selected action does something with the owner character\n *  3. Action is done, owner selects another one\n */\nUCLASS(BlueprintType, EditInlineNew, Abstract)\nclass SORB_API USoEAction : public UObject\n{\n\tGENERATED_BODY()\npublic:\n\n\tUSoEAction() {};\n\n\t/** Called each time the action is selected */\n\tvoid Start(ASoEnemy* Owner);\n\t/** Called before the action is interrupted unexpectedly, can be called even if bInterruptible is false (e.g. Death) */\n\tvirtual void Interrupt(ASoEnemy* Owner);\n\n\t/**\n\t * Called each frame after Start() as long as it is neither finished nor terminated\n\t * @Return: whether the action is still going on (true) or finished (false)\n\t */\n\tbool Tick(float DeltaSeconds, ASoEnemy* Owner);\n\n\t/**\n\t * Evaluates the preconditons in order to generate the necessity of the action\n\t * Check SoEnemy::GetFirstSatisfiedAction() and SoEnemy::ChooseActionFromList()\n\t */\n\tvirtual float Evaluate(const ASoEnemy* Owner) const;\n\n\t/** Returns the last time the action was selected in seconds */\n\tfloat GetLastUsageTime() const;\n\n\t/** whether an outside effect can stop the action from being executed (e.g. a successful melee strike) */\n\tvirtual bool IsInterruptible() const { return bInterruptible; }\n\n\tvoid SetInterruptible(bool bCanBe) { bInterruptible = bCanBe; }\n\nprotected:\n\n\t/**\n\t * Implementable function, called from Tick()\n\t * @Return: whether the action is still going on (true) or finished (false)\n\t */\n\tvirtual bool OnTick(float DeltaSeconds, ASoEnemy* Owner) { return false; }\n\n\t/** Called when the action is started */\n\tvirtual void OnEnter(ASoEnemy* Owner) {};\n\t/** Called when the action is finished or interrupted */\n\tvirtual void OnLeave(ASoEnemy* Owner) {};\n\nprotected:\n\n\t/** whether an outside effect can stop the action from being executed (e.g. a successful melee strike) */\n\tUPROPERTY(EditAnywhere, BlueprintReadOnly, Category = Params)\n\tbool bInterruptible = true;\n\n\t/** if true the actor's orientation is modified each frame to match the spine's direction in the given point */\n\tUPROPERTY(EditAnywhere, BlueprintReadOnly, Category = Params)\n\tbool bForceSplineDirection = false;\n\n\t/** preconditons are used to decide how important it is for this action to be chosen (0: can't be chosen, the bigger the stronger necessity) */\n\tUPROPERTY(Instanced, EditAnywhere, BlueprintReadWrite, Category = Params)\n\tTArray<USoEPrecondition*> Preconditions;\n\n\t/** if this is set to true the action is evaluated each frame and it is over if the preconditions fail */\n\tUPROPERTY(EditAnywhere, BlueprintReadOnly, Category = Params)\n\tbool bOnlyWhileEvaluated = false;\n\n\n\t/** last time the action was selected in seconds */\n\tfloat LastUsageTime = -300.f;\n};\n"
  },
  {
    "path": "Source/SOrb/Enemy/EPreconditions/SoEPMarkerBased.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#include \"SoEPMarkerBased.h\"\n\n#include \"Enemy/SoEnemy.h\"\n#include \"Enemy/EActions/SoEAction.h\"\n#include \"Basic/Helpers/SoStaticHelper.h\"\n#include \"SplineLogic/SoMarker.h\"\n#include \"SplineLogic/SoSplineHelper.h\"\n#include \"CharacterBase/SoCharacterMovementComponent.h\"\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nfloat USoEPSplineDistanceFromMarker::Evaluate(const ASoEnemy* OwnerCharacter, const USoEAction* OwnerAction) const\n{\n\tconst bool bResult = ASoMarker::IsMarkerInRangeFromSplineLocation(OwnerCharacter->GetTargetMarker(Index),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t  ISoSplineWalker::Execute_GetSplineLocationI(OwnerCharacter),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t  MinDistance,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t  MaxDistance);\n\treturn bResult == bShouldBeIn ? TrueValue : 0.0f;\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nfloat USoEPNotBetweenMarkers::Evaluate(const ASoEnemy* OwnerCharacter, const USoEAction* OwnerAction) const\n{\n\tASoMarker* TargetMarker0 = OwnerCharacter->GetTargetMarker(Index0);\n\tASoMarker* TargetMarker1 = OwnerCharacter->GetTargetMarker(Index1);\n\tif (TargetMarker0 == nullptr || TargetMarker1 == nullptr)\n\t\treturn bFailsOnInvalidMarker ? 0.0f : TrueValue;\n\n\tconst bool bBetween = USoSplineHelper::IsSplinepointBetweenPoints(OwnerCharacter->GetSoMovement()->GetSplineLocation(),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t  TargetMarker0->GetSplineLocation(),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t  TargetMarker1->GetSplineLocation());\n\treturn (bBetween == bFailsIfNotBetween ? TrueValue : 0.0f);\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nfloat USoEPCharacterBetweenMarkers::Evaluate(const ASoEnemy* OwnerCharacter, const USoEAction* OwnerAction) const\n{\n\treturn ((OwnerCharacter->IsPlayerBetweenMarkers(Index0, Index1, bResultOnInvalidMarkers)) != bInverse) ? TrueValue : 0.0f;\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nfloat USoEPCharacterSplineDistancefromMarker::Evaluate(const ASoEnemy* OwnerCharacter, const USoEAction* OwnerAction) const\n{\n\tconst bool bResult = ASoMarker::IsMarkerInRangeFromSplineLocation(OwnerCharacter->GetTargetMarker(Index),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t  USoStaticHelper::GetPlayerSplineLocation(OwnerCharacter),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t  MinDistance,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t  MaxDistance);\n\treturn bResult == bShouldBeIn ? TrueValue : 0.0f;\n}\n"
  },
  {
    "path": "Source/SOrb/Enemy/EPreconditions/SoEPMarkerBased.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#pragma once\n\n#include \"SoEPrecondition.h\"\n#include \"SoEPMarkerBased.generated.h\"\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUCLASS(BlueprintType, EditInlineNew)\nclass SORB_API USoEPSplineDistanceFromMarker : public USoEPrecondition\n{\n\tGENERATED_BODY()\npublic:\n\tvirtual float Evaluate(const ASoEnemy* OwnerCharacter, const USoEAction* OwnerAction) const override;\nprotected:\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = Params)\n\tint32 Index = 0;\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = Params)\n\tfloat MinDistance = 0.0f;\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = Params)\n\tfloat MaxDistance = BIG_NUMBER;\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = Params)\n\tbool bShouldBeIn = true;\n};\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUCLASS(BlueprintType, EditInlineNew)\nclass SORB_API USoEPNotBetweenMarkers : public USoEPrecondition\n{\n\tGENERATED_BODY()\npublic:\n\tvirtual float Evaluate(const ASoEnemy* OwnerCharacter, const USoEAction* OwnerAction) const override;\n\nprotected:\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = Params)\n\tint32 Index0 = 0;\n\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = Params)\n\tint32 Index1 = 1;\n\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = Params)\n\tbool bFailsOnInvalidMarker = true;\n\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = Params)\n\tbool bFailsIfNotBetween = false;\n};\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUCLASS(BlueprintType, EditInlineNew)\nclass SORB_API USoEPCharacterBetweenMarkers : public USoEPrecondition\n{\n\tGENERATED_BODY()\npublic:\n\tvirtual float Evaluate(const ASoEnemy* OwnerCharacter, const USoEAction* OwnerAction) const override;\nprotected:\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = Params)\n\tint32 Index0 = 0;\n\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = Params)\n\tint32 Index1 = 1;\n\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = Params)\n\tbool bResultOnInvalidMarkers = true;\n\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = Params)\n\tbool bInverse = false;\n};\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUCLASS(BlueprintType, EditInlineNew)\nclass SORB_API USoEPCharacterSplineDistancefromMarker : public USoEPrecondition\n{\n\tGENERATED_BODY()\npublic:\n\tvirtual float Evaluate(const ASoEnemy* OwnerCharacter, const USoEAction* OwnerAction) const override;\n\nprotected:\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = Params)\n\tint32 Index = 0;\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = Params)\n\tfloat MinDistance = 0.0f;\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = Params)\n\tfloat MaxDistance = BIG_NUMBER;\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = Params)\n\tbool bShouldBeIn = true;\n};\n"
  },
  {
    "path": "Source/SOrb/Enemy/EPreconditions/SoEPrecondition.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#include \"SoEPrecondition.h\"\n\n#include \"GameFramework/PawnMovementComponent.h\"\n#include \"Engine/World.h\"\n\n#include \"Enemy/SoEnemy.h\"\n#include \"Enemy/SoEnemyHelper.h\"\n#include \"Enemy/EActions/SoEAction.h\"\n#include \"Basic/Helpers/SoStaticHelper.h\"\n#include \"Basic/SoGameMode.h\"\n#include \"Basic/Helpers/SoMathHelper.h\"\n#include \"Basic/SoGameInstance.h\"\n#include \"Projectiles/SoProjectile.h\"\n#include \"CharacterBase/SoCharacterMovementComponent.h\"\n#include \"Character/SoCharacter.h\"\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nfloat USoEPrecondition::Evaluate(const ASoEnemy* OwnerCharacter, const USoEAction* OwnerAction) const\n{\n\tcheck(false);\n\treturn 0.0f;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nfloat USoEPSplineDistanceFromPlayer::Evaluate(const ASoEnemy* OwnerCharacter, const USoEAction* OwnerAction) const\n{\n\tconst FSoSplinePoint OwnerSplineLocation = ISoSplineWalker::Execute_GetSplineLocationI(OwnerCharacter);\n\tconst FSoSplinePoint PlayerSplineLocation = USoStaticHelper::GetPlayerSplineLocation(OwnerCharacter);\n\n\tif (!PlayerSplineLocation.IsValid(false))\n\t\treturn 0.0f;\n\n\tif (bCheckAgainstAlert)\n\t{\n\t\tconst float AlertDistance = OwnerCharacter->GetAlertDistance();\n\t\tconst float Distance = fabs(OwnerSplineLocation.GetDistanceFromSplinePoint(PlayerSplineLocation, AlertDistance + 10.0f));\n\t\treturn Distance < AlertDistance;\n\t}\n\n\tconst float Distance = fabs(OwnerSplineLocation.GetDistanceFromSplinePoint(PlayerSplineLocation, MaxDistance + 10.0f));\n\treturn Distance > MinDistance && Distance < MaxDistance ? TrueValue : 0.0f;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nfloat USoEPSplineDistanceFromClosestAlly::Evaluate(const ASoEnemy* OwnerCharacter, const USoEAction* OwnerAction) const\n{\n\tconst float ClosestDistance = FMath::Abs(USoEnemyHelper::GetSignedSplineDistanceToClosestEnemy(OwnerCharacter, bIgnoreFloatings, bOnlySameClass));\n\treturn (ClosestDistance > MinDistance && ClosestDistance < MaxDistance) ? TrueValue : 0.0f;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nfloat USoEPZDistanceFromPlayer::Evaluate(const ASoEnemy* OwnerCharacter, const USoEAction* OwnerAction) const\n{\n\tconst float OwnerZ = OwnerCharacter->GetActorLocation().Z;\n\n\tAActor* Player = USoStaticHelper::GetPlayerCharacterAsActor(OwnerCharacter);\n\tif (Player == nullptr)\n\t\treturn 0.0f;\n\n\tconst float Distance = OwnerZ - Player->GetActorLocation().Z;\n\treturn ((Distance > MinDistance && Distance < MaxDistance) != bInverse) ? TrueValue : 0.0f;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nfloat USoEPDistanceFromPlayer::Evaluate(const ASoEnemy* OwnerCharacter, const USoEAction* OwnerAction) const\n{\n\tAActor* Player = USoStaticHelper::GetPlayerCharacterAsActor(OwnerCharacter);\n\tif (Player == nullptr)\n\t\treturn 0.0f;\n\n\tconst FVector OwnerLoc = OwnerCharacter->GetActorLocation();\n\tconst FVector PlayerLoc = Player->GetActorLocation();\n\n\tconst float DistanceSquared = (OwnerLoc - PlayerLoc).SizeSquared();\n\treturn (DistanceSquared > MinDistance*MinDistance && DistanceSquared < MaxDistance*MaxDistance) ? TrueValue : 0.0f;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nfloat USoEPZDistanceFromStart::Evaluate(const ASoEnemy* OwnerCharacter, const USoEAction* OwnerAction) const\n{\n\tconst float OwnerZ = OwnerCharacter->GetActorLocation().Z;\n\tconst float StartZ = OwnerCharacter->GetInitialLocation().Z;\n\tconst float Distance = OwnerZ - StartZ;\n\n\treturn ((Distance > MinDistance && Distance < MaxDistance) != bInverse) ? TrueValue : 0.0f;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nfloat USoEPNotFacingPlayer::Evaluate(const ASoEnemy* OwnerCharacter, const USoEAction* OwnerAction) const\n{\n\tconst FSoSplinePoint OwnerSplineLocation = ISoSplineWalker::Execute_GetSplineLocationI(OwnerCharacter);\n\tconst FSoSplinePoint PlayerSplineLocation = USoStaticHelper::GetPlayerSplineLocation(OwnerCharacter);\n\tif (!PlayerSplineLocation.IsValid(false))\n\t\treturn 0.0f;\n\n\tconst int32 FaceDir = FMath::Sign(OwnerSplineLocation.GetDirectionModifierFromVector(OwnerCharacter->GetActorForwardVector()));\n\tconst int32 TargetDir = static_cast<int32>(FMath::Sign((PlayerSplineLocation - OwnerSplineLocation)));\n\n\tif (bInverse)\n\t\treturn FaceDir == TargetDir ? TrueValue : 0.0f;\n\n\treturn FaceDir != TargetDir ? TrueValue : 0.0f;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nfloat USoEPPlayerNotInDialogue::Evaluate(const ASoEnemy* OwnerCharacter, const USoEAction* OwnerAction) const\n{\n\tif (ASoCharacter* Player = USoStaticHelper::GetPlayerCharacterAsSoCharacter(OwnerCharacter))\n\t{\n\t\treturn Player->IsInDialogue() ? 0.0f : TrueValue;\n\t}\n\n\treturn TrueValue;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nfloat USoEPWasNotUsedRecently::Evaluate(const ASoEnemy* OwnerCharacter, const USoEAction* OwnerAction) const\n{\n\tconst float CurrentTime = OwnerCharacter->GetWorld()->GetTimeSeconds();\n\tconst float LastUsageTime = OwnerAction->GetLastUsageTime();\n\tconst float TimeSinceUsage = OwnerCharacter->GetWorld()->GetTimeSeconds() - OwnerAction->GetLastUsageTime();\n\n\tif (TimeSinceUsage < SoftTimeDelta)\n\t\treturn 0.0f;\n\n\tif (TimeSinceUsage > HardTimeDelta)\n\t\treturn HardTimeValue;\n\n\tconst float Ratio = (TimeSinceUsage - SoftTimeDelta) / (HardTimeDelta - SoftTimeDelta);\n\treturn SoftTimeValue + (HardTimeValue - SoftTimeValue) * Ratio;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nfloat USoEPIsStandingOnGround::Evaluate(const ASoEnemy* OwnerCharacter, const USoEAction* OwnerAction) const\n{\n\tif (bInverse)\n\t\treturn OwnerCharacter->GetMovementComponent()->IsMovingOnGround() ? 0.0f : TrueValue;\n\n\treturn OwnerCharacter->GetMovementComponent()->IsMovingOnGround() ? TrueValue : 0.0f;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nfloat USoEPRandom::Evaluate(const ASoEnemy* OwnerCharacter, const USoEAction* OwnerAction) const\n{\n\treturn Percent >= FMath::FRandRange(0.0f, 1.0f) ? TrueValue : 0.0f;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nfloat USoEPBlockedRecently::Evaluate(const ASoEnemy* OwnerCharacter, const USoEAction* OwnerAction) const\n{\n\tconst float Delta = OwnerCharacter->GetWorld()->GetTimeSeconds() - OwnerCharacter->GetLastBlockTime();\n\tconst bool bBlockedRecently = Delta <= MaxTimeDelta;\n\treturn bInverse ? !bBlockedRecently : bBlockedRecently;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nfloat USoEPLastID::Evaluate(const ASoEnemy* OwnerCharacter, const USoEAction* OwnerAction) const\n{\n\tFName LastName;\n\tswitch (IDType)\n\t{\n\t\tcase ESoEnemyIDType::EEIT_Strike:\n\t\t\tLastName = OwnerCharacter->GetStrikeName();\n\t\t\tbreak;\n\n\t\tcase ESoEnemyIDType::EEIT_Block:\n\t\t\tLastName = OwnerCharacter->GetBlockName();\n\t\t\tbreak;\n\n\t\tcase ESoEnemyIDType::EEIT_HitReact:\n\t\t\tLastName = OwnerCharacter->GetHitReactName();\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tbreak;\n\t}\n\tconst bool bEquals = LastName == Name;\n\treturn bInverse ? !bEquals : bEquals;\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nfloat USoEPRangeAttackTestHit::Evaluate(const ASoEnemy* OwnerCharacter, const USoEAction* OwnerAction) const\n{\n\tconst AActor* Target = OwnerCharacter->GetTarget();\n\tif (Target == nullptr)\n\t\treturn 0.0f;\n\n\tconst FVector StartPos = OwnerCharacter->GetRangeAttackLocation(Index);\n\tconst FVector TargetPos = Target->GetActorLocation();\n\tTArray<const AActor*> ActorsToIgnore;\n\tActorsToIgnore.Add(OwnerCharacter);\n\tActorsToIgnore.Add(Target);\n\n\tbool bSuccess = false;\n\n\tbool bSplineProjectile = false;\n\tconst FSoProjectileInitData* InitData = OwnerCharacter->GetRangeAttackInitData(Index, bSplineProjectile);\n\tif (InitData == nullptr)\n\t\treturn 0.0f;\n\n\tif (bSplineProjectile)\n\t{\n\t\tconst FSoSplinePoint OwnerSplineLocation = ISoSplineWalker::Execute_GetSplineLocationI(OwnerCharacter);\n\t\tconst FSoSplinePoint PlayerSplineLocation = USoStaticHelper::GetPlayerSplineLocation(OwnerCharacter);\n\t\tconst FVector Delta = StartPos - FVector(OwnerSplineLocation);\n\t\tconst FSoSplinePoint StartSplineLocation = OwnerSplineLocation + OwnerSplineLocation.GetDirectionModifierFromVector(Delta) * Delta.Size2D();\n\n\t\tbSuccess = USoMathHelper::CheckRangeAttack(OwnerCharacter->GetWorld(),\n\t\t\t\t\t\t\t\t\t\t\t\t\t StartPos,\n\t\t\t\t\t\t\t\t\t\t\t\t\t StartSplineLocation,\n\t\t\t\t\t\t\t\t\t\t\t\t\t TargetPos,\n\t\t\t\t\t\t\t\t\t\t\t\t\t PlayerSplineLocation,\n\t\t\t\t\t\t\t\t\t\t\t\t\t ActorsToIgnore,\n\t\t\t\t\t\t\t\t\t\t\t\t\t InitData->Velocity.Size(),\n\t\t\t\t\t\t\t\t\t\t\t\t\t InitData->GravityScale,\n\t\t\t\t\t\t\t\t\t\t\t\t\t Precision,\n\t\t\t\t\t\t\t\t\t\t\t\t\t OwnerCharacter->ShouldRangeAttackPreferLargeArc(Index) ? 1 : -1);\n\t}\n\telse\n\t\tbSuccess = USoMathHelper::CheckRangeAttack(OwnerCharacter->GetWorld(),\n\t\t\t\t\t\t\t\t\t\t\t\t   StartPos,\n\t\t\t\t\t\t\t\t\t\t\t\t   TargetPos,\n\t\t\t\t\t\t\t\t\t\t\t\t   ActorsToIgnore,\n\t\t\t\t\t\t\t\t\t\t\t\t   InitData->Velocity.Size(),\n\t\t\t\t\t\t\t\t\t\t\t\t   InitData->GravityScale,\n\t\t\t\t\t\t\t\t\t\t\t\t   Precision,\n\t\t\t\t\t\t\t\t\t\t\t\t   OwnerCharacter->ShouldRangeAttackPreferLargeArc(Index) ? 1 : -1);\n\n\treturn bSuccess ? TrueValue : 0.0f;\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nfloat USoEPFloatValueIsGreater::Evaluate(const ASoEnemy* OwnerCharacter, const USoEAction* OwnerAction) const\n{\n\treturn (OwnerCharacter->GetFloatValue(Value) > CompareTo) ? TrueValue : 0.0f;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nfloat USoEPFloatValueIsSmaller::Evaluate(const ASoEnemy* OwnerCharacter, const USoEAction* OwnerAction) const\n{\n\treturn (OwnerCharacter->GetFloatValue(Value) < CompareTo) ? TrueValue : 0.0f;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nfloat USoEPIsPlayerAlive::Evaluate(const ASoEnemy* OwnerCharacter, const USoEAction* OwnerAction) const\n{\n\tAActor* Player = USoStaticHelper::GetPlayerCharacterAsActor(OwnerCharacter);\n\treturn (ISoMortal::Execute_IsAlive(Player) == bShouldBeAlive) ? TrueValue : 0.0f;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nfloat USoEPBlueprintCondition::Evaluate(const ASoEnemy* OwnerCharacter, const USoEAction* OwnerAction) const\n{\n\treturn OwnerCharacter->CheckBlueprintConditionBP(Name) ? TrueValue : 0.0f;\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nfloat USoEPIsPlayerSurrounded::Evaluate(const ASoEnemy* OwnerCharacter, const USoEAction* OwnerAction) const\n{\n\tASoEnemySpawner* Spawner = OwnerCharacter->GetSoSpawner();\n\tif (Spawner == nullptr)\n\t\treturn bInverse ? TrueValue : 0.0f;\n\n\tconst TArray<ASoEnemy*> EnemyList = ASoGameMode::Get(OwnerCharacter).GetEnemiesFromGroup(OwnerCharacter->GetSoGroupName());\n\n\tif (EnemyList.Num() < 2)\n\t\treturn bInverse ? TrueValue : 0.0f;\n\n\tbool bDir0 = false;\n\tbool bDir1 = false;\n\n\tconst FSoSplinePoint PlayerSplineLocation = USoStaticHelper::GetPlayerSplineLocation(OwnerCharacter);\n\tfor (ASoEnemy* Enemy : EnemyList)\n\t{\n\t\tconst FSoSplinePoint& SplinePoint = Enemy->GetSoMovement()->GetSplineLocation();\n\n\t\tif ((SplinePoint - PlayerSplineLocation) > 0)\n\t\t\tbDir0 = true;\n\t\telse\n\t\t\tbDir1 = true;\n\n\t\tif (bDir0 && bDir1)\n\t\t\treturn bInverse ? 0.0f : TrueValue;\n\t}\n\n\treturn bInverse ? TrueValue : 0.0f;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nfloat USoEPEnemyDistanceFromPlayer::Evaluate(const ASoEnemy* OwnerCharacter, const USoEAction* OwnerAction) const\n{\n\tif (MinValue < 0 && MaxValue < 0)\n\t\treturn TrueValue;\n\n\tconst FSoSplinePoint PlayerSplineLocation = USoStaticHelper::GetPlayerSplineLocation(OwnerCharacter);\n\n\tconst float OwnerDistance = PlayerSplineLocation - OwnerCharacter->GetSoMovement()->GetSplineLocation();\n\tint32 EnemyDistance = 0;\n\tfor (ASoEnemy* Enemy : ASoGameMode::Get(OwnerCharacter).GetEnemiesFromGroup(OwnerCharacter->GetSoGroupName()))\n\t{\n\t\tif (Enemy != OwnerCharacter &&\n\t\t\tEnemy != nullptr &&\n\t\t\t(!bIgnoreFloatings || Enemy->GetSoMovement()->DefaultLandMovementMode != EMovementMode::MOVE_Flying) &&\n\t\t\t(!bOnlySameClass || Enemy->GetClass() == OwnerCharacter->GetClass()))\n\t\t{\n\t\t\tconst float Distance = PlayerSplineLocation - Enemy->GetSoMovement()->GetSplineLocation();\n\t\t\tif (FMath::Sign(Distance) == FMath::Sign(OwnerDistance) &&\n\t\t\t\tfabs(Distance) < fabs(OwnerDistance))\n\t\t\t\tEnemyDistance += 1;\n\t\t}\n\t}\n\n\n\treturn ((MinValue < 0 || EnemyDistance >= MinValue) && (MaxValue < 0 || EnemyDistance <= MaxValue)) ? TrueValue : 0.0f;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nfloat USoEPAorB::Evaluate(const ASoEnemy* OwnerCharacter, const USoEAction* OwnerAction) const\n{\n\tif (A == nullptr || B == nullptr)\n\t\treturn 0.0f;\n\n\treturn TrueValue * (FMath::Max(A->Evaluate(OwnerCharacter, OwnerAction), B->Evaluate(OwnerCharacter, OwnerAction)));\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nfloat USoEPCheckDynamicName::Evaluate(const ASoEnemy* OwnerCharacter, const USoEAction* OwnerAction) const\n{\n\treturn OwnerCharacter->GetDynamicName() == ExpectedValue ? TrueValue : 0.0f;\n}\n"
  },
  {
    "path": "Source/SOrb/Enemy/EPreconditions/SoEPrecondition.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#pragma once\n\n#include \"Enemy/SoEnemyDataTypes.h\"\n#include \"SoEPrecondition.generated.h\"\n\nclass USoEAction;\nclass ASoEnemy;\n\n/**\n *\n */\nUCLASS(BlueprintType, EditInlineNew, Abstract)\nclass SORB_API USoEPrecondition : public UObject\n{\n\tGENERATED_BODY()\npublic:\n\tvirtual float Evaluate(const ASoEnemy* OwnerCharacter, const USoEAction* OwnerAction) const;\nprotected:\n\t// the value this precondition returns if it is satisfied\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, meta = (ClampMin = \"0\", ClampMax = \"1000000\"), Category = Params)\n\tfloat TrueValue = 1.0f;\n};\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUCLASS(BlueprintType, EditInlineNew)\nclass SORB_API USoEPSplineDistanceFromPlayer : public USoEPrecondition\n{\n\tGENERATED_BODY()\npublic:\n\tvirtual float Evaluate(const ASoEnemy* OwnerCharacter, const USoEAction* OwnerAction) const override;\nprotected:\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = Params)\n\tfloat MinDistance;\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = Params)\n\tfloat MaxDistance;\n\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = Params)\n\tbool bCheckAgainstAlert = false;\n};\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUCLASS(BlueprintType, EditInlineNew)\nclass SORB_API USoEPSplineDistanceFromClosestAlly : public USoEPrecondition\n{\n\tGENERATED_BODY()\npublic:\n\tvirtual float Evaluate(const ASoEnemy* OwnerCharacter, const USoEAction* OwnerAction) const override;\n\nprotected:\n\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = Params)\n\tfloat MinDistance;\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = Params)\n\tfloat MaxDistance;\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = Params)\n\tbool bIgnoreFloatings = false;\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = Params)\n\tbool bOnlySameClass = true;\n};\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUCLASS(BlueprintType, EditInlineNew)\nclass SORB_API USoEPZDistanceFromPlayer : public USoEPrecondition\n{\n\tGENERATED_BODY()\npublic:\n\tvirtual float Evaluate(const ASoEnemy* OwnerCharacter, const USoEAction* OwnerAction) const override;\nprotected:\n\t// compared to OwnerZ - PlayerZ, sign matters\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = Params)\n\tfloat MinDistance;\n\t// compared to OwnerZ - PlayerZ, sign matters\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = Params)\n\tfloat MaxDistance;\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = Params)\n\tbool bInverse = false;\n};\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUCLASS(BlueprintType, EditInlineNew)\nclass SORB_API USoEPDistanceFromPlayer : public USoEPrecondition\n{\n\tGENERATED_BODY()\npublic:\n\tvirtual float Evaluate(const ASoEnemy* OwnerCharacter, const USoEAction* OwnerAction) const override;\nprotected:\n\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = Params)\n\tfloat MinDistance;\n\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = Params)\n\tfloat MaxDistance;\n};\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUCLASS(BlueprintType, EditInlineNew)\nclass SORB_API USoEPZDistanceFromStart : public USoEPrecondition\n{\n\tGENERATED_BODY()\npublic:\n\tvirtual float Evaluate(const ASoEnemy* OwnerCharacter, const USoEAction* OwnerAction) const override;\nprotected:\n\t// compared to OwnerZ - StartOwnerZ, sign matters\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = Params)\n\tfloat MinDistance;\n\t// compared to OwnerZ - StartOwnerZ, sign matters\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = Params)\n\tfloat MaxDistance;\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = Params)\n\tbool bInverse;\n};\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUCLASS(BlueprintType, EditInlineNew)\nclass SORB_API USoEPNotFacingPlayer : public USoEPrecondition\n{\n\tGENERATED_BODY()\npublic:\n\tvirtual float Evaluate(const ASoEnemy* OwnerCharacter, const USoEAction* OwnerAction) const override;\nprotected:\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = Params)\n\tbool bInverse;\n};\n\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUCLASS(BlueprintType, EditInlineNew)\nclass SORB_API USoEPPlayerNotInDialogue : public USoEPrecondition\n{\n\tGENERATED_BODY()\npublic:\n\tvirtual float Evaluate(const ASoEnemy* OwnerCharacter, const USoEAction* OwnerAction) const override;\n};\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUCLASS(BlueprintType, EditInlineNew)\nclass SORB_API USoEPWasNotUsedRecently : public USoEPrecondition\n{\n\tGENERATED_BODY()\npublic:\n\tvirtual float Evaluate(const ASoEnemy* OwnerCharacter, const USoEAction* OwnerAction) const override;\nprotected:\n\t// Delta < SoftTimeDelta ? 0.0f : >= SoftTimeValue\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = Params)\n\tfloat SoftTimeDelta;\n\t// Delta >= HardTimeDelta ? HardTimeValue : <HardTimeValue\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = Params)\n\tfloat HardTimeDelta;\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = Params)\n\tfloat SoftTimeValue;\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = Params)\n\tfloat HardTimeValue;\n};\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUCLASS(BlueprintType, EditInlineNew)\nclass SORB_API USoEPIsStandingOnGround : public USoEPrecondition\n{\n\tGENERATED_BODY()\npublic:\n\tvirtual float Evaluate(const ASoEnemy* OwnerCharacter, const USoEAction* OwnerAction) const override;\n\nprotected:\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = Params)\n\tbool bInverse;\n};\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUCLASS(BlueprintType, EditInlineNew, Abstract)\nclass SORB_API USoEPRandom : public USoEPrecondition\n{\n\tGENERATED_BODY()\npublic:\n\tvirtual float Evaluate(const ASoEnemy* OwnerCharacter, const USoEAction* OwnerAction) const;\nprotected:\n\t// value between 0.0f and 1.0f, 0.0f means never, 1.0f means always\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, meta = (ClampMin = \"0\", ClampMax = \"1\"), Category = Params)\n\tfloat Percent = 1.0f;\n};\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUCLASS(BlueprintType, EditInlineNew)\nclass SORB_API USoEPBlockedRecently : public USoEPrecondition\n{\n\tGENERATED_BODY()\npublic:\n\tvirtual float Evaluate(const ASoEnemy* OwnerCharacter, const USoEAction* OwnerAction) const override;\n\nprotected:\n\t// delta time which is the upper bound of the \"recently\" consideration\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = Params)\n\tfloat MaxTimeDelta;\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = Params)\n\tbool bInverse;\n};\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUCLASS(BlueprintType, EditInlineNew)\nclass SORB_API USoEPLastID : public USoEPrecondition\n{\n\tGENERATED_BODY()\npublic:\n\tvirtual float Evaluate(const ASoEnemy* OwnerCharacter, const USoEAction* OwnerAction) const override;\n\nprotected:\n\t// the value we will ask from the player\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = Params)\n\tESoEnemyIDType IDType;\n\n\t// player's value is compared to this\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = Params)\n\tFName Name;\n\n\t// bInverse -> !=\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = Params)\n\tbool bInverse;\n};\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUCLASS(BlueprintType, EditInlineNew)\nclass SORB_API USoEPRangeAttackTestHit : public USoEPrecondition\n{\n\tGENERATED_BODY()\npublic:\n\tvirtual float Evaluate(const ASoEnemy* OwnerCharacter, const USoEAction* OwnerAction) const override;\n\nprotected:\n\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = Params)\n\tint32 Index = 0;\n\n\t// amount of raycasts for the hit test\n\t// with gravity scale 0 and straight spline it could be 1\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = Params)\n\tint32 Precision = 3;\n};\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUCLASS(BlueprintType, EditInlineNew)\nclass SORB_API USoEPFloatValueIsGreater : public USoEPrecondition\n{\n\tGENERATED_BODY()\npublic:\n\tvirtual float Evaluate(const ASoEnemy* OwnerCharacter, const USoEAction* OwnerAction) const override;\n\nprotected:\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = Params)\n\tESoEnemyFloat Value;\n\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = Params)\n\tfloat CompareTo;\n};\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUCLASS(BlueprintType, EditInlineNew)\nclass SORB_API USoEPFloatValueIsSmaller : public USoEPrecondition\n{\n\tGENERATED_BODY()\npublic:\n\tvirtual float Evaluate(const ASoEnemy* OwnerCharacter, const USoEAction* OwnerAction) const override;\n\nprotected:\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = Params)\n\tESoEnemyFloat Value;\n\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = Params)\n\tfloat CompareTo;\n};\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUCLASS(BlueprintType, EditInlineNew)\nclass SORB_API USoEPIsPlayerAlive : public USoEPrecondition\n{\n\tGENERATED_BODY()\npublic:\n\tvirtual float Evaluate(const ASoEnemy* OwnerCharacter, const USoEAction* OwnerAction) const override;\n\nprotected:\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = Params)\n\tbool bShouldBeAlive = true;\n};\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUCLASS(BlueprintType, EditInlineNew)\nclass SORB_API USoEPBlueprintCondition : public USoEPrecondition\n{\n\tGENERATED_BODY()\n\npublic:\n\n\tvirtual float Evaluate(const ASoEnemy* OwnerCharacter, const USoEAction* OwnerAction) const override;\n\nprotected:\n\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = Params)\n\tFName Name;\n};\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUCLASS(BlueprintType, EditInlineNew)\nclass SORB_API USoEPIsPlayerSurrounded : public USoEPrecondition\n{\n\tGENERATED_BODY()\n\npublic:\n\n\tvirtual float Evaluate(const ASoEnemy* OwnerCharacter, const USoEAction* OwnerAction) const override;\n\nprotected:\n\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = Params)\n\tbool bInverse;\n};\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUCLASS(BlueprintType, EditInlineNew)\nclass SORB_API USoEPEnemyDistanceFromPlayer : public USoEPrecondition\n{\n\tGENERATED_BODY()\n\npublic:\n\n\tvirtual float Evaluate(const ASoEnemy* OwnerCharacter, const USoEAction* OwnerAction) const override;\n\nprotected:\n\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = Params)\n\tint32 MinValue = -1;\n\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = Params)\n\tint32 MaxValue = -1;\n\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = Params)\n\tbool bIgnoreFloatings = true;\n\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = Params)\n\tbool bOnlySameClass = false;\n};\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUCLASS(BlueprintType, EditInlineNew)\nclass SORB_API USoEPAorB : public USoEPrecondition\n{\n\tGENERATED_BODY()\n\npublic:\n\n\tvirtual float Evaluate(const ASoEnemy* OwnerCharacter, const USoEAction* OwnerAction) const override;\n\nprotected:\n\n\tUPROPERTY(Instanced, BlueprintReadWrite, EditAnywhere, Category = Params)\n\tUSoEPrecondition* A;\n\n\tUPROPERTY(Instanced, BlueprintReadWrite, EditAnywhere, Category = Params)\n\tUSoEPrecondition* B;\n};\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUCLASS(BlueprintType, EditInlineNew)\nclass SORB_API USoEPCheckDynamicName : public USoEPrecondition\n{\n\tGENERATED_BODY()\n\npublic:\n\n\tvirtual float Evaluate(const ASoEnemy* OwnerCharacter, const USoEAction* OwnerAction) const override;\n\nprotected:\n\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = Params)\n\tFName ExpectedValue;\n};\n"
  },
  {
    "path": "Source/SOrb/Enemy/SoEnemy.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#include \"SoEnemy.h\"\n#include \"TimerManager.h\"\n#include \"Components/ShapeComponent.h\"\n#include \"Components/CapsuleComponent.h\"\n#include \"Components/WidgetComponent.h\"\n#include \"Components/SizeBox.h\"\n#include \"Components/ProgressBar.h\"\n#include \"EngineMinimal.h\" // ANY_PACKAGE enum search\n#include \"DrawDebugHelpers.h\"\n\n#include \"DlgManager.h\"\n\n#include \"Settings/SoGameSettings.h\"\n#include \"SoEnemyVoiceManager.h\"\n#include \"EActions/SoEAGeneral.h\"\n#include \"EActions/SoEAStunned.h\"\n#include \"CharacterBase/SoCharacterMovementComponent.h\"\n#include \"CharacterBase/SoCombatComponent.h\"\n#include \"CharacterBase/SoCharacterSheet.h\"\n#include \"Character/SoCharacter.h\"\n#include \"Basic/SoGameMode.h\"\n#include \"SplineLogic/SoSplineHelper.h\"\n#include \"SplineLogic/SoMarker.h\"\n#include \"Basic/SoGameInstance.h\"\n#include \"Basic/Helpers/SoStaticHelper.h\"\n#include \"Basic/SoAudioManager.h\"\n#include \"Projectiles/SoProjectileSpawnerComponent.h\"\n#include \"SoEnemyHelper.h\"\n#include \"Basic/Helpers/SoMathHelper.h\"\n#include \"SplineLogic/SoEditorGameInterface.h\"\n#include \"Online/Achievements/SoAchievementManager.h\"\n#include \"Effects/SoEffectHandlerComponent.h\"\n#include \"Basic/Helpers/SoDateTimeHelper.h\"\n\nDEFINE_LOG_CATEGORY(LogSoEnemyAI);\n\nbool ASoEnemy::bDisplayMeleeHitTraceLines = false;\nconst FName ASoEnemy::FadeStrName = FName(\"FadeStr\");\nconst FName ASoEnemy::FadeOutColorParamName = FName(\"FadeEdgeColor\");\nconst float ASoEnemy::PauseFadeSpeed = 2.0f;\nconst FName ASoEnemy::SwappedTagName = FName(\"Swapped\");\n\nUAnimSequenceBase* ASoEnemy::CachedSpawnAnim = nullptr;\n\nFSoStrikePhase FSoStrikePhase::Invalid;\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// Sets default values\nASoEnemy::ASoEnemy(const FObjectInitializer& ObjectInitializer) :\n\tSuper(ObjectInitializer.SetDefaultSubobjectClass<USoCharacterMovementComponent>(CharacterMovementComponentName))\n{\n \t// Set this actor to call Tick() every frame.  You can turn this off to improve performance if you don't need it.\n\tPrimaryActorTick.bCanEverTick = true;\n\n\tNamedActionLists.Empty();\n\tfor (int32 i = 0; i < static_cast<int32>(ESoActionList::EAL_Max); ++i)\n\t\tNamedActionLists.Add(static_cast<ESoActionList>(i));\n\n\tSoCombat = ObjectInitializer.CreateDefaultSubobject<USoCombatComponent>(this, TEXT(\"SoCombatComponent\"));\n\n\tHealthWidget3D = ObjectInitializer.CreateDefaultSubobject<UWidgetComponent>(this, TEXT(\"HealthWidget3D\"));\n\tHealthWidget3D->SetupAttachment(GetRootComponent());\n}\n\n#if WITH_EDITOR\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoEnemy::PostEditChangeProperty(FPropertyChangedEvent& PropertyChangedEvent)\n{\n\tconst FName PropertyName = PropertyChangedEvent.Property != nullptr ? PropertyChangedEvent.Property->GetFName() : NAME_None;\n\tif (PropertyName == FName(\"DistanceAlongSpline\"))\n\t{\n\t\tconst FSoSplinePoint TempPoint = SplinePointPtr.Extract();\n\t\tif (TempPoint.IsValid(false))\n\t\t\tSetActorLocation(TempPoint.ToVector(GetActorLocation().Z));\n\t}\n\telse if (PropertyName == GET_MEMBER_NAME_CHECKED(ASoEnemy, SoGroupName))\n\t{\n\t\tFSoEditorGameInterface::FixEnemyGroupName(SoGroupName);\n\t\tFSoEditorGameInterface::BuildEnemyGroupDataConfigFile(GetWorld());\n\t}\n\n\tSuper::PostEditChangeProperty(PropertyChangedEvent);\n}\n#endif\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoEnemy::OnConstruction(const FTransform& Transform)\n{\n\tSuper::OnConstruction(Transform);\n\tUSoSplineHelper::UpdateSplineLocationRef(this, SplinePointPtr, true, true);\n\n\t// if (HealthWidget3DParent != nullptr)\n\t// \tHealthWidget3D->AttachToComponent(HealthWidget3DParent, FAttachmentTransformRules::SnapToTargetNotIncludingScale);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoEnemy::PostInitializeComponents()\n{\n\tSuper::PostInitializeComponents();\n\tReloadScripts();\n\n\tOverlapHitReact.AssociatedActor = this;\n\n\tif (HealthWidget3DParent != nullptr)\n\t\tHealthWidget3D->AttachToComponent(HealthWidget3DParent, FAttachmentTransformRules::SnapToTargetNotIncludingScale);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// Called when the game starts or when spawned\nvoid ASoEnemy::BeginPlay()\n{\n\tDECLARE_SCOPE_CYCLE_COUNTER(TEXT(\"BeginPlay\"), STAT_BeginPlay, STATGROUP_SoEnemy);\n\n\tSuper::BeginPlay();\n\n\tSoMovement->SetSplineLocation(SplinePointPtr.Extract());\n\n\tInitialTransform = GetActorTransform();\n\n\tInitialMeshLocation = GetMesh()->RelativeLocation;\n\tInitialMeshRotation = GetMesh()->RelativeRotation;\n\n\tInitialSplinePoint = SoMovement->GetSplineLocation();\n\tHealthWidget3D->SetVisibility(false);\n\n\tconst FName* NamePtr = AnimationMap.FindKey(SpawnAnimation);\n\tif (SpawnAnimation != nullptr && NamePtr != nullptr)\n\t{\n\t\tSpawnCounter = (SpawnAnimation->SequenceLength / SpawnAnimation->RateScale);\n\t\tMaxSpawnCounterValue = SpawnCounter;\n\t\tActivity = ESoEnemyActivity::EEA_Spawn;\n\n\t\t// before?\n\t\tGetMesh()->SetCollisionEnabled(ECollisionEnabled::NoCollision);\n\n\t\tGetCapsuleComponent()->SetCollisionEnabled(ECollisionEnabled::NoCollision);\n\t\tSoMovement->Velocity = FVector(0, 0, 0);\n\t\tSoMovement->StopActiveMovement();\n\t\tSoMovement->SetMovementMode(MOVE_None);\n\t\t// during the Possess phase movement would be changed otherwise:\n\t\tSoMovement->SetOppressSetDefaultMovementMode(true);\n\n\t\tGetMesh()->VisibilityBasedAnimTickOption = EVisibilityBasedAnimTickOption::AlwaysTickPoseAndRefreshBones;\n\t\t// UE_LOG(LogTemp, Warning, TEXT(\"Spawn Counter: %f, Anim: %s\"), SpawnCounter, *NamePtr->ToString());\n\t}\n\telse\n\t{\n\t\tActivity = ESoEnemyActivity::EEA_Default;\n\t\tCurrentAnimData.Type = ESoAnimationType::EAT_Default;\n\t\tGetMesh()->VisibilityBasedAnimTickOption = DefaultVisibilityBasedAnimTickOption;\n\t\tUpdateOverlapSetup();\n\t\tGetCapsuleComponent()->SetCollisionEnabled(ECollisionEnabled::QueryAndPhysics);\n\t\tGetMesh()->SetCollisionEnabled(bEnableMeshCollisionInBeginPlay ? ECollisionEnabled::QueryAndPhysics : ECollisionEnabled::NoCollision);\n\t}\n\n\t// callback subscribes to player rematerialize if it is needed\n\tif (bPlacedInLevel)\n\t\tUSoEventHandlerHelper::SubscribeToSoPostLoad(this);\n\n\n\tASoGameMode::Get(this).RegisterEnemy(this, SoGroupName);\n\n\tif (!bPlacedInLevel && bUseIdleVO)\n\t\tGetWorld()->GetTimerManager().SetTimer(\n\t\t\tIdleVOTimer,\n\t\t\tthis,\n\t\t\t&ThisClass::OnIdleVO,\n\t\t\tGetRandRangeIdleVODelay()\n\t\t);\n\n\tif (bPlacedInLevel && bShouldBePausedIfPlacedInLevel && bCanBePaused)\n\t\tPauseEnemy();\n\n#if PLATFORM_SWITCH\n\tRagdollVisibleTime = 1.0f;\n#endif\n\n\tUSoGameSettings::Get().OnDisplayEnemyHealthBarChanged.AddDynamic(this, &ASoEnemy::OnHealthBarSettingsChanged);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoEnemy::EndPlay(const EEndPlayReason::Type EndPlayReason)\n{\n\tif (USoGameSettings* GameSettings = USoGameSettings::GetInstance())\n\t\tGameSettings->OnDisplayEnemyHealthBarChanged.RemoveDynamic(this, &ASoEnemy::OnHealthBarSettingsChanged);\n\n\tif (bPlacedInLevel)\n\t\tResetSoEnemy();\n\telse\n\t\tOnRemoveSoEnemyBP();\n\n\t// After ResetSoEnemy call because that function registers the enemy!!!\n\tASoGameMode::Get(this).UnregisterEnemy(this, SoGroupName);\n\n\tSuper::EndPlay(EndPlayReason);\n\n\tif (bPlacedInLevel)\n\t{\n\t\tUSoEventHandlerHelper::UnsubscribeFromPlayerRespawn(this);\n\t\tUSoEventHandlerHelper::UnsubscribeFromSoPostLoad(this);\n\t}\n\n\tif (RagdollFadeOutTimer.IsValid())\n\t{\n\t\tbRagdollFadeOutInProgress = false;\n\t\tGetWorld()->GetTimerManager().ClearTimer(RagdollFadeOutTimer);\n\t}\n\n\tif (bSubscribedToMeshHit)\n\t{\n\t\tGetMesh()->OnComponentHit.RemoveDynamic(this, &ASoEnemy::OnMeshHitCallback);\n\t\tbSubscribedToMeshHit = false;\n\t}\n\n\tGetWorld()->GetTimerManager().ClearTimer(IdleVOTimer);\n\tGetWorld()->GetTimerManager().ClearTimer(PauseFadeOutTimer);\n\tbShouldBePausedIfPlacedInLevel = true;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoEnemy::SetPlacedInLevel(bool bPlaced)\n{\n\tif (bPlacedInLevel && !bPlaced)\n\t{\n\t\tUSoEventHandlerHelper::UnsubscribeFromPlayerRespawn(this);\n\t\tUSoEventHandlerHelper::UnsubscribeFromSoPostLoad(this);\n\t}\n\n\tbPlacedInLevel = bPlaced;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoEnemy::SetActiveActionList(FName Name)\n{\n\tif (!ActionLists.Contains(Name))\n\t{\n\t\tUE_LOG(LogSoEnemyAI, Warning, TEXT(\"ASoEnemy::SetActiveActionList failed: list %s isn't a valid script for %s\"), *Name.ToString(), *GetName());\n\t\treturn;\n\t}\n\n\tActiveActionListName = Name;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoEnemy::Tick(float DeltaTime)\n{\n\tDECLARE_SCOPE_CYCLE_COUNTER(TEXT(\"Tick\"), STAT_Tick, STATGROUP_SoEnemy);\n\n\tSuper::Tick(DeltaTime);\n\n\tif (bPaused || bSoMarkedForDestroy)\n\t\treturn;\n\n\tbWasHitThisFrame = false;\n\n\tSFXTCounter -= DeltaTime;\n\tif (SFXTCounter < 0.0f && !bRagdollFadeOutInProgress)\n\t{\n\t\tSFXTCounter = SFXSPPeriod;\n\t\tif (SFXTCount > SFXSPThreshold)\n\t\t{\n\t\t\tSFXTCount = 0;\n\t\t\tSFXSpamCounter += 1;\n\t\t\tif (SFXSpamCounter > SFXSPMaxSpamCountBeforeBan)\n\t\t\t{\n\t\t\t\tFadeOutRagdoll();\n\t\t\t\tSFXSpamCounter = 0;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t\tSFXSpamCounter = 0;\n\t}\n\n\tif (bForceLookAtPlayer)\n\t\tLookAtPlayer();\n\n#if WITH_EDITOR\n\tif (!SoMovement->GetSplineLocation().IsValid())\n\t\treturn;\n#endif\n\n\tswitch (Activity)\n\t{\n\t\tcase ESoEnemyActivity::EEA_Spawn:\n\t\t\tSpawnCounter -= DeltaTime;\n\t\t\tif (SpawnCounter < KINDA_SMALL_NUMBER)\n\t\t\t\tOnSpawnFinished();\n\t\t\telse if (MaxSpawnCounterValue - SpawnCounter > 0.1f)\n\t\t\t\tGetMesh()->SetCollisionEnabled(ECollisionEnabled::QueryAndPhysics);\n\n\t\t\tbreak;\n\n\t\tcase ESoEnemyActivity::EEA_Dead:\n\t\t\tbreak;\n\n\t\tcase ESoEnemyActivity::EEA_Default:\n\t\t\tCurrentAnimData.Type = ESoAnimationType::EAT_Default;\n\t\tdefault:\n\t\t{\n\t\t\tBlockChance = FMath::Clamp(BlockChance + BlockChanceDelta * DeltaTime, 0.0f, 1.0f);\n\n\t\t\tif (SwitchBetweenNamedActionListsInterval > 0.0f)\n\t\t\t\tUpdateNamedActionListChange(DeltaTime);\n\n\t\t\tif (ActiveAction == nullptr)\n\t\t\t{\n\t\t\t\tif (bCanStartNewAction && (bCanStartActionInAir || SoMovement->IsMovingOnGround()))\n\t\t\t\t\tChooseNewAction();\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tUSoEAction* OldActiveAction = ActiveAction;\n\t\t\t\tconst bool bStillActive = ActiveAction->Tick(DeltaTime, this);\n\t\t\t\tif (!bStillActive && OldActiveAction == ActiveAction)\n\t\t\t\t\tChooseNewAction();\n\t\t\t}\n\t\t}\n\t}\n\n\t// update health widget if necessary\n\tif (WidgetPercentUpdateCounter > 0.0f)\n\t{\n\t\tWidgetPercentUpdateCounter -= DeltaTime;\n\t\tconst float Alpha = FMath::Clamp(1.0f - WidgetPercentUpdateCounter / WidgetPercentUpdateTime, 0.0f, 1.0f);\n\t\tWidgetCurrentPercent = USoMathHelper::InterpolateDeceleration(WidgetLastTargetPercent, FMath::Max(SoCharacterSheet->GetHealthPercent(), 0.1f), Alpha);\n\t\tSetHealthBar3DPercent(WidgetCurrentPercent);\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nconst FSoEnemyAnimData& ASoEnemy::InitializeAnimationState()\n{\n\tif (SpawnAnimation == nullptr)\n\t{\n\t\t// maybe the cache is used to set this - but we have to reset it, because we don't want other enemies to use _our_ spawn animation\n\t\tSpawnAnimation = CachedSpawnAnim;\n\t\tCachedSpawnAnim = nullptr;\n\t}\n\n\tconst FName* NamePtr = AnimationMap.FindKey(SpawnAnimation);\n\tif (SpawnAnimation != nullptr && NamePtr != nullptr)\n\t{\n\t\tCurrentAnimData.Type = ESoAnimationType::EAT_Spawn;\n\t\tCurrentAnimData.SpawnAnim = *NamePtr;\n\t}\n\n\treturn CurrentAnimData;\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoEnemy::UpdateOverlapSetup()\n{\n\tGetMesh()->SetGenerateOverlapEvents(bUseMeshForOverlaps);\n\t// GetMesh()->SetCollisionEnabled(bUseMeshForOverlaps ? ECollisionEnabled::QueryAndPhysics : ECollisionEnabled::NoCollision);\n\tstatic FName SoEnemy = FName(\"SoEnemyCapsule\");\n\tstatic FName SoEnemyNoMeshOverlap = FName(\"SoEnemyNoMeshOverlap\");\n\tif (bCanCodeModifyCapsuleCollisionProfile)\n\t\tGetCapsuleComponent()->SetCollisionProfileName(bUseMeshForOverlaps ? SoEnemy: SoEnemyNoMeshOverlap);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoEnemy::UpdateNamedActionListChange(float DeltaSeconds)\n{\n\tDECLARE_SCOPE_CYCLE_COUNTER(TEXT(\"UpdateNamedActionListChange\"), STAT_UpdateNamedActionListChange, STATGROUP_SoEnemy);\n\n\tSwitchCounter += DeltaSeconds;\n\tif (SwitchCounter > SwitchBetweenNamedActionListsInterval)\n\t{\n\t\tSwitchCounter = 0.0f;\n\n\t\tAActor* Player = USoStaticHelper::GetPlayerCharacterAsActor(this);\n\t\tconst bool bPlayerAlive = ISoMortal::Execute_IsAlive(Player);\n\t\tconst FSoSplinePoint OwnerSplineLocation = ISoSplineWalker::Execute_GetSplineLocationI(this);\n\t\tconst FSoSplinePoint PlayerSplineLocation = USoStaticHelper::GetPlayerSplineLocation(this);\n\t\tconst float DistanceZ = fabs(GetActorLocation().Z - Player->GetActorLocation().Z);\n\n\t\tswitch (ActiveActionList)\n\t\t{\n\t\t\tcase ESoActionList::EAL_Idle:\n\t\t\t\tif (bPlayerAlive)\n\t\t\t\t{\n\t\t\t\t\tconst float Distance = fabs(OwnerSplineLocation.GetDistanceFromSplinePoint(PlayerSplineLocation, AlertDistance + 10.0f));\n\t\t\t\t\tif (Distance < AlertDistance && DistanceZ < AlertDistanceZ)\n\t\t\t\t\t\tSwitchActionListImmediately(ESoActionList::EAL_Melee);\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase ESoActionList::EAL_Melee:\n\t\t\t\t{\n\t\t\t\t\tconst float Distance = fabs(OwnerSplineLocation.GetDistanceFromSplinePoint(PlayerSplineLocation, AlertOffDistance + 10.0f));\n\t\t\t\t\tif (!bPlayerAlive || Distance > AlertOffDistance || DistanceZ > AlertOffDistanceZ)\n\t\t\t\t\t\tSwitchActionListImmediately(ESoActionList::EAL_Idle, 0.5f);\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t}\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoEnemy::SwitchActionListImmediately(ESoActionList NewList, float WaitTime)\n{\n\tDECLARE_SCOPE_CYCLE_COUNTER(TEXT(\"SwitchActionListImmediately\"), STAT_SwitchActionListImmediately, STATGROUP_SoEnemy);\n\n\tInterruptAction();\n\n\tActiveActionListName = NamedActionLists[NewList];\n\tActiveActionList = NewList;\n\n\tif (WaitTime > KINDA_SMALL_NUMBER)\n\t\tWait(0.5f);\n\n\tif (bControlIdleVOBasedOnActionList)\n\t\tbIdleVOOn = (NewList == ESoActionList::EAL_Idle);\n\n\tOnPostActionListChangeBP(NewList);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoEnemy::ChooseNewAction()\n{\n\tActiveAction = nullptr;\n\n\tif (WaitAfterNextAction > KINDA_SMALL_NUMBER)\n\t{\n\t\tWait(WaitAfterNextAction, true);\n\t\tWaitAfterNextAction = -1.0f;\n\t\treturn;\n\t}\n\n\tFSoEActions* List = ActionMap.Find(ActiveActionListName);\n\tif (List != nullptr)\n\t{\n\t\tActiveAction = ChooseActionFromList(List->Array);\n\t\tif (ActiveAction != nullptr)\n\t\t\tActiveAction->Start(this);\n\t\t// UE_LOG(LogSoEnemyAI, Display, TEXT(\"ASoEnemy::ChooseNewAction()\"));\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoEnemy::ChooseNewAction(FName ListName)\n{\n\tDECLARE_SCOPE_CYCLE_COUNTER(TEXT(\"ChooseNewAction\"), STAT_ChooseNewAction, STATGROUP_SoEnemy);\n\n\tActiveAction = nullptr;\n\tif (FSoEActions* List = ActionMap.Find(ListName))\n\t{\n\t\tActiveAction = ChooseActionFromList(List->Array);\n\t\tif (ActiveAction != nullptr)\n\t\t\tActiveAction->Start(this);\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUSoEAction* ASoEnemy::GetFirstSatisfiedAction(TArray<USoEAction*>& Actions) const\n{\n\tDECLARE_SCOPE_CYCLE_COUNTER(TEXT(\"GetFirstSatisfiedAction\"), STAT_GetFirstSatisfiedAction, STATGROUP_SoEnemy);\n\n\tfor (USoEAction* Action : Actions)\n\t\tif (Action->Evaluate(this) > KINDA_SMALL_NUMBER)\n\t\t\treturn Action;\n\n\treturn nullptr;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUSoEAction* ASoEnemy::ChooseActionFromList(TArray<USoEAction*>& Actions) const\n{\n\tDECLARE_SCOPE_CYCLE_COUNTER(TEXT(\"ChooseActionFromList\"), STAT_ChooseActionFromList, STATGROUP_SoEnemy);\n\n\tstruct FSoActionToChoose\n\t{\n\t\tUSoEAction* Action;\n\t\tfloat Value;\n\t};\n\n\tTArray<FSoActionToChoose> ActionList;\n\tfloat Sum = 0.0f;\n\tfor (int i = 0; i < Actions.Num(); ++i)\n\t{\n\t\tFSoActionToChoose A;\n\t\tA.Action = Actions[i];\n\t\tif (A.Action != nullptr)\n\t\t{\n\t\t\tA.Value = A.Action->Evaluate(this);\n\t\t\tif (A.Value > KINDA_SMALL_NUMBER)\n\t\t\t{\n\t\t\t\tSum += A.Value;\n\t\t\t\tActionList.Add(A);\n\t\t\t}\n\t\t}\n\t}\n\n\t// TODO: check if random generation works as intended, blame leyyin if it is not\n\tconst float RandValue = FMath::RandRange(0.0f, Sum);\n\tSum = 0.0f;\n\tfor (int32 i = 0; i < ActionList.Num(); ++i)\n\t{\n\t\tSum += ActionList[i].Value;\n\t\tif (RandValue < Sum)\n\t\t\treturn ActionList[i].Action;\n\t}\n\n\treturn nullptr;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool ASoEnemy::HasNamedActionList(ESoActionList List)\n{\n\tif (FName* NamePtr = NamedActionLists.Find(List))\n\t{\n\t\treturn (*NamePtr) != NAME_None;\n\t}\n\n\treturn false;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoEnemy::Wait(float DeltaSeconds, bool bCanBeInterrupted)\n{\n\tDECLARE_SCOPE_CYCLE_COUNTER(TEXT(\"Wait\"), STAT_Wait, STATGROUP_SoEnemy);\n\n\tif (ActiveAction != nullptr)\n\t{\n\t\tUE_LOG(LogSoEnemyAI, Display, TEXT(\"ASoEnemy::Wait failed: an action is already active!\"));\n\t\treturn;\n\t}\n\n\tif (DefaultWaitAction == nullptr)\n\t\tDefaultWaitAction = NewObject<USoEAWait>(this, USoEAWait::StaticClass());\n\n\tDefaultWaitAction->SetDuration(DeltaSeconds);\n\tDefaultWaitAction->Start(this);\n\tDefaultWaitAction->SetInterruptible(bCanBeInterrupted);\n\tActiveAction = DefaultWaitAction;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoEnemy::SwitchToAction(USoEAction* Action)\n{\n\tDECLARE_SCOPE_CYCLE_COUNTER(TEXT(\"SwitchToAction\"), STAT_SwitchToAction, STATGROUP_SoEnemy);\n\n\tif (ActiveAction != nullptr)\n\t{\n\t\tActiveAction->Interrupt(this);\n\t\tActiveAction = nullptr;\n\t}\n\n\tActiveAction = Action;\n\tif (ActiveAction != nullptr)\n\t\tActiveAction->Start(this);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoEnemy::SelectActionFromActions(FName ActionsName, bool bForced)\n{\n\tDECLARE_SCOPE_CYCLE_COUNTER(TEXT(\"SelectActionFromActions\"), STAT_SelectActionFromActions, STATGROUP_SoEnemy);\n\n\tif (bForced && ActiveAction != nullptr)\n\t{\n\t\tActiveAction->Interrupt(this);\n\t\tActiveAction = nullptr;\n\t}\n\n\tif (ActiveAction != nullptr)\n\t\treturn;\n\n\tChooseNewAction(ActionsName);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoEnemy::Stun(float DeltaSeconds, ESoStatusEffect StatusEffect, bool bIgnoreRes)\n{\n\tDECLARE_SCOPE_CYCLE_COUNTER(TEXT(\"Stun\"), STAT_Stun, STATGROUP_SoEnemy);\n\n\tif (IsStunned())\n\t\treturn;\n\n\tif (((StunResistance + KINDA_SMALL_NUMBER > 1.0f) && StatusEffect != ESoStatusEffect::ESE_BootTransmutation) ||\n\t\t(!bCanBeTurnedIntoBoots && StatusEffect == ESoStatusEffect::ESE_BootTransmutation))\n\t\tASoGameMode::Get(this).DisplayText(GetActorLocation(), ESoDisplayText::EDT_Immune);\n\telse\n\t{\n\t\tif (bIgnoreRes ||\n\t\t\tStunResistance - KINDA_SMALL_NUMBER <= FMath::FRandRange(0.0f, 1.0f) ||\n\t\t\tStatusEffect == ESoStatusEffect::ESE_BootTransmutation)\n\t\t{\n\t\t\tInterruptAction();\n\n\t\t\tif (DefaultStunnedAction == nullptr)\n\t\t\t\tDefaultStunnedAction = NewObject<USoEAStunned>(this, USoEAStunned::StaticClass());\n\n\t\t\tDefaultStunnedAction->SetStatusEffect(StatusEffect);\n\t\t\tDefaultStunnedAction->SetDuration(DeltaSeconds);\n\t\t\tDefaultStunnedAction->Start(this);\n\t\t\tActiveAction = DefaultStunnedAction;\n\t\t}\n\t\telse\n\t\t\tASoGameMode::Get(this).DisplayText(GetActorLocation(), ESoDisplayText::EDT_Resisted);\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool ASoEnemy::IsStunned() const\n{\n\treturn (ActiveAction != nullptr && ActiveAction->GetClass() == USoEAStunned::StaticClass());\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoEnemy::LookAtPlayer()\n{\n\tconst FSoSplinePoint SplineLocation = SoMovement->GetSplineLocation();\n\tconst FSoSplinePoint PlayerSplineLocation = USoStaticHelper::GetPlayerSplineLocation(this);\n\tconst float TargetDir = FMath::Sign((PlayerSplineLocation.GetDistanceFromSplinePoint(SplineLocation, 10000)));\n\tSetActorRotation((SplineLocation.GetDirection() * TargetDir).Rotation());\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoEnemy::LookAtPlayerIgnoreSpline()\n{\n\tif (AActor* Player = USoStaticHelper::GetPlayerCharacterAsActor(this))\n\t{\n\t\tFVector Direction = Player->GetActorLocation() - GetActorLocation();\n\t\tDirection.Z = 0.0;\n\t\tSetActorRotation(Direction.Rotation());\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFVector ASoEnemy::GetFloorLocation_Implementation() const\n{\n\tFVector Result = GetActorLocation();\n\tResult.Z -= GetCapsuleComponent()->GetScaledCapsuleHalfHeight();\n\treturn Result;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nfloat ASoEnemy::GetMinIdleVODelay() const\n{\n\treturn USoDateTimeHelper::NormalizeTime(MinIdleVODelay);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nfloat ASoEnemy::GetMaxIdleVODelay() const\n{\n\treturn USoDateTimeHelper::NormalizeTime(MaxIdleVODelay);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nfloat ASoEnemy::GetRandRangeIdleVODelay() const\n{\n\treturn FMath::RandRange(GetMinIdleVODelay(), GetMaxIdleVODelay());\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nfloat ASoEnemy::GetRagdollVisibleTime() const\n{\n\treturn USoDateTimeHelper::NormalizeTime(RagdollVisibleTime);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoEnemy::InterruptAction()\n{\n\tDECLARE_SCOPE_CYCLE_COUNTER(TEXT(\"InterruptAction\"), STAT_InterruptAction, STATGROUP_SoEnemy);\n\n\tif (ActiveAction != nullptr)\n\t{\n\t\tActiveAction->Interrupt(this);\n\t\tActiveAction = nullptr;\n\t}\n\n\tOnActionInterruptedBP();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool ASoEnemy::IsCriticalHit(const TSet<FName> AssociatedBones)\n{\n\tfor (auto& Bone : AssociatedBones)\n\t\tif (CriticalBones.Contains(Bone))\n\t\t\treturn true;\n\n\treturn false;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFVector ASoEnemy::GetClosestHitLocationToPoint(const FSoHitReactDesc& HitParam, const FVector& SourceLocation, bool bCritical)\n{\n\tDECLARE_SCOPE_CYCLE_COUNTER(TEXT(\"GetClosestHitLocationToPoint\"), STAT_GetClosestHitLocationToPoint, STATGROUP_SoEnemy);\n\n\tif (!bMeshUsedForCoverTraceCheck)\n\t{\n\t\tFVector Value;\n\t\tGetCapsuleComponent()->GetClosestPointOnCollision(SourceLocation, Value);\n\t\treturn Value;\n\t}\n\n\tif (USkeletalMeshComponent* SkeletalMesh = GetMesh())\n\t{\n\t\tFVector MinLocation = FVector(0.0f, 0.0f, 0.0f);\n\t\tfloat MinDist = BIG_NUMBER;\n\n\t\tconst TSet<FName>* BonesToCheck = &HitParam.AssociatedBones;\n\n\t\tif (HitParam.AssociatedBones.Num() == 1 && HitParam.AssociatedBones.Contains(NAME_None))\n\t\t{\n\t\t\tif (bCheckAllBonesWithBodyIfNoBoneNameIsRecieved)\n\t\t\t{\n\t\t\t\tif (BonesWithBody.Num() == 0)\n\t\t\t\t{\n\t\t\t\t\tTArray<FName> BoneNames;\n\t\t\t\t\tSkeletalMesh->GetBoneNames(BoneNames);\n\n\t\t\t\t\tfor (FName BoneName : BoneNames)\n\t\t\t\t\t\tif (SkeletalMesh->GetBodyInstance(BoneName) != nullptr)\n\t\t\t\t\t\t\tBonesWithBody.Add(BoneName);\n\t\t\t\t}\n\n\t\t\t\tBonesToCheck = &BonesWithBody;\n\t\t\t}\n\t\t}\n\n\t\tfor (const FName BoneName : *BonesToCheck)\n\t\t\tif (!bCritical || CriticalBones.Contains(BoneName))\n\t\t\t{\n\t\t\t\tFVector Value;\n\t\t\t\tconst float Dist = SkeletalMesh->GetClosestPointOnCollision(SourceLocation, Value, BoneName);\n\t\t\t\tif (Dist > 0.0f && Dist < MinDist)\n\t\t\t\t{\n\t\t\t\t\tMinDist = Dist;\n\t\t\t\t\tMinLocation = Value;\n\t\t\t\t}\n\t\t\t}\n\n\t\treturn MinLocation;\n\t}\n\treturn FVector(0.0f, 0.0f, 0.0f);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool ASoEnemy::Strike(FName StrikeName)\n{\n\tDECLARE_SCOPE_CYCLE_COUNTER(TEXT(\"Strike\"), STAT_Strike, STATGROUP_SoEnemy);\n\n\tFSoStrike* StrikeData = StrikeMap.Find(StrikeName);\n\tif (StrikeData == nullptr || StrikeData->Phases.Num() == 0)\n\t\treturn false;\n\n\tLastStrikeName = StrikeName;\n\tActivity = ESoEnemyActivity::EEA_Strike;\n\tSoCombat->SetupNewStrike(StrikeData->Phases[0]);\n\n\tCurrentAnimData.Type = ESoAnimationType::EAT_InterruptibleSingle;\n\tOnStrikePhaseSwitch(StrikeData->Phases[0], 0);\n\n\tif (StrikeData->bLookAtPlayer)\n\t\tLookAtPlayerIgnoreSpline();\n\treturn true;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoEnemy::OnStrikePhaseSwitch(const FSoStrikePhase& NewPhase, int32 PhaseIndex)\n{\n\tDECLARE_SCOPE_CYCLE_COUNTER(TEXT(\"OnStrikePhaseSwitch\"), STAT_OnStrikePhaseSwitch, STATGROUP_SoEnemy);\n\n\tconst float AnimDuration = (NewPhase.bLooped || NewPhase.AnimationDuration < 0.0f) ? NewPhase.Duration : NewPhase.AnimationDuration;\n\tCurrentAnimData.InterruptibleSingle.SetAnimation(NewPhase.Animation, AnimDuration, NewPhase.bLooped);\n\tSoCombat->SetupNewStrike(NewPhase);\n\tLastStrikePhaseIndex = PhaseIndex;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nconst FSoStrike* ASoEnemy::GetStrike(FName StrikeName) const\n{\n\treturn StrikeMap.Find(StrikeName);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nconst FSoStrikePhase& ASoEnemy::GetActiveStrikePhase() const\n{\n\tconst FSoStrike* Strike = StrikeMap.Find(LastStrikeName);\n\tif (Strike != nullptr && Strike->Phases.IsValidIndex(LastStrikePhaseIndex))\n\t\treturn Strike->Phases[LastStrikePhaseIndex];\n\n\treturn FSoStrikePhase::Invalid;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoEnemy::StrikeEnd()\n{\n\tActivity = ESoEnemyActivity::EEA_Default;\n\n\tSoCombat->DisableAllWeaponCollision();\n\tSoMovement->SetRootMotionDesc({});\n\n\tCurrentAnimData.Type = ESoAnimationType::EAT_Default;\n\n\tOnStrikeEnd();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoEnemy::OnRangeAttackStarted(FName RangeAttackName, float Duration, ESoRangeAttackAnimType AnimType, bool bInterruptible)\n{\n\tDECLARE_SCOPE_CYCLE_COUNTER(TEXT(\"OnRangeAttackStarted\"), STAT_OnRangeAttackStarted, STATGROUP_SoEnemy);\n\n\tLastRangeAttackName = RangeAttackName;\n\tif (AnimType != ESoRangeAttackAnimType::ERAT_NoAnim)\n\t\tActivity = ESoEnemyActivity::EEA_RangeAttack;\n\tOnRangeAttackStartedBP();\n\n\tbool bLooped = false;\n\tswitch (AnimType)\n\t{\n\t\tcase ESoRangeAttackAnimType::ERAT_PrepareAndLoop:\n\t\t\tbLooped = true;\n\t\tcase ESoRangeAttackAnimType::ERAT_PrepareAndFinish:\n\t\t{\n\t\t\tCurrentAnimData.Type = ESoAnimationType::EAT_InterruptibleWithPreparation;\n\t\t\tconst FName InitAnimName = FName(*(RangeAttackName.ToString() + \"_start\"));\n\t\t\tCurrentAnimData.InterruptibleWithPreparation.InitAsInterruptibleWithPreparation(InitAnimName, RangeAttackName, bLooped, 1.0f);\n\t\t}\n\t\tbreak;\n\n\t\tcase ESoRangeAttackAnimType::ERAT_SingleLooped:\n\t\t\tbLooped = true;\n\n\t\tcase ESoRangeAttackAnimType::ERAT_Single:\n\t\tcase ESoRangeAttackAnimType::ERAT_SingleAnimBasedTiming:\n\t\t\tif (UAnimSequenceBase** AnimPtr = AnimationMap.Find(RangeAttackName))\n\t\t\t\tDuration = USoStaticHelper::GetScaledAnimLength(*AnimPtr);\n\n\t\tcase ESoRangeAttackAnimType::ERAT_SingleTimeScaled:\n\t\t{\n\t\t\tCurrentAnimData.Type = bInterruptible ? ESoAnimationType::EAT_InterruptibleSingle : ESoAnimationType::EAT_UninterruptibleSingle;\n\t\t\t(bInterruptible ? CurrentAnimData.InterruptibleSingle : CurrentAnimData.UninterruptibleSingle).SetAnimation(RangeAttackName, Duration, bLooped);\n\t\t}\n\t\tbreak;\n\n\t\tcase ESoRangeAttackAnimType::ERAT_NoAnim:\n\t\tdefault:\n\t\t\tbreak;\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFSoERangeAttackProfile* ASoEnemy::InitializeAndGetRangeAttackProfile(int32 Index, int32 Variant)\n{\n\tif (RangeAttackProfileList.IsValidIndex(Index))\n\t{\n\t\tPrepareRangeAttackProfile(Index, Variant);\n\t\treturn &RangeAttackProfileList[Index];\n\t}\n\n\treturn nullptr;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoEnemy::PrepareRangeAttackProfile_Implementation(int32 RangeAttackProfileIndex, int32 Variant)\n{\n\tDECLARE_SCOPE_CYCLE_COUNTER(TEXT(\"PrepareRangeAttackProfile_Implementation\"), STAT_PrepareRangeAttackProfile_Implementation, STATGROUP_SoEnemy);\n\n\tconst AActor* Target = GetTarget();\n\tif (Target != nullptr)\n\t{\n\t\tconst FVector StartPos = GetRangeAttackLocation(RangeAttackProfileIndex);\n\t\tconst FVector TargetPos = Target->GetActorLocation();\n\n\t\tRangeAttackProfileList[RangeAttackProfileIndex].Location = StartPos;\n\n\t\tbool bSplineProjectile = false;\n\t\tconst FSoProjectileInitData* InitData = GetRangeAttackInitData(RangeAttackProfileIndex, bSplineProjectile);\n\t\tif (InitData == nullptr)\n\t\t\treturn;\n\n\t\tif (fabs(InitData->GravityScale) < KINDA_SMALL_NUMBER)\n\t\t{\n\t\t\tRangeAttackProfileList[RangeAttackProfileIndex].Orientation = (TargetPos - StartPos).Rotation();\n\t\t\treturn;\n\t\t}\n\n\t\tif (bSplineProjectile)\n\t\t{\n\t\t\tconst FSoSplinePoint SplineLocation = SoMovement->GetSplineLocation();\n\t\t\tconst FSoSplinePoint PlayerSplineLocation = USoStaticHelper::GetPlayerSplineLocation(this);\n\t\t\tconst FVector Delta = StartPos - FVector(SplineLocation);\n\t\t\tconst FSoSplinePoint StartSplineLocation = SplineLocation + SplineLocation.GetDirectionModifierFromVector(Delta) * Delta.Size2D();\n\t\t\tconst FVector Velocity = USoMathHelper::CalcRangeAttackVelocity(StartPos,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t  StartSplineLocation,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t  TargetPos,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t  PlayerSplineLocation,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t  InitData->Velocity.Size(),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t  InitData->GravityScale,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t  RangeAttackProfileList[RangeAttackProfileIndex].bPreferLargeArc ? 1 : -1);\n\t\t\tif (Velocity.Size() > KINDA_SMALL_NUMBER)\n\t\t\t\tRangeAttackProfileList[RangeAttackProfileIndex].Orientation = Velocity.Rotation();\n\t\t\telse\n\t\t\t\tRangeAttackProfileList[RangeAttackProfileIndex].Orientation = (TargetPos - StartPos).Rotation();\n\t\t}\n\t\telse\n\t\t{\n\t\t\tconst FVector Velocity = USoMathHelper::CalcRangeAttackVelocity(StartPos,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t  TargetPos,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t  InitData->Velocity.Size(),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t  InitData->GravityScale,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t  RangeAttackProfileList[RangeAttackProfileIndex].bPreferLargeArc ? 1 : -1);\n\t\t\tif (Velocity.Size() > KINDA_SMALL_NUMBER)\n\t\t\t\tRangeAttackProfileList[RangeAttackProfileIndex].Orientation = Velocity.Rotation();\n\t\t\telse\n\t\t\t\tRangeAttackProfileList[RangeAttackProfileIndex].Orientation = (TargetPos - StartPos).Rotation();\n\t\t}\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFVector ASoEnemy::GetRangeAttackLocation_Implementation(int32 RangeAttackProfileIndex) const\n{\n\tif (ProjectileSpawner != nullptr)\n\t\treturn ProjectileSpawner->GetComponentLocation();\n\n\treturn FVector(0.0f, 0.0f, 0.0f);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFVector ASoEnemy::GetDefaultDmgNumberLocation_Implementation() const\n{\n\treturn GetActorLocation();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nconst FSoERangeAttackProfile* ASoEnemy::GetRangeAttackProfile(int32 Index) const\n{\n\tif (RangeAttackProfileList.IsValidIndex(Index))\n\t\treturn &RangeAttackProfileList[Index];\n\n\treturn nullptr;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nconst FSoProjectileInitData* ASoEnemy::GetRangeAttackInitData(int32 RangeAttackProfileIndex, bool& bSplineBased) const\n{\n\tDECLARE_SCOPE_CYCLE_COUNTER(TEXT(\"GetRangeAttackInitData\"), STAT_GetRangeAttackInitData, STATGROUP_SoEnemy);\n\n\tif (!RangeAttackProfileList.IsValidIndex(RangeAttackProfileIndex))\n\t\treturn nullptr;\n\n\tASoProjectile* Projectile =  USoGameInstance::Get(this).ClaimProjectile(RangeAttackProfileList[RangeAttackProfileIndex].ProjectileClass);\n\tif (Projectile == nullptr)\n\t\treturn nullptr;\n\n\tbool bUseOverride = RangeAttackProfileList[RangeAttackProfileIndex].bUseProjectileInitDataOverride;\n\tconst FSoProjectileInitData* InitData = &RangeAttackProfileList[RangeAttackProfileIndex].InitDataOverride;\n\tif (!RangeAttackProfileList[RangeAttackProfileIndex].bUseThisInsteadOfComponentDefaults)\n\t{\n\t\tInitData = &ProjectileSpawner->GetProjectileInitData();\n\t\tbUseOverride = ProjectileSpawner->GetOverrideProjectileInitData();\n\t}\n\tif (!bUseOverride)\n\t\tInitData = &Projectile->GetDefaultInitData();\n\n\tbSplineBased = Projectile->IsSplineProjectile();\n\n\tUSoGameInstance::Get(this).ReturnProjectile(Projectile);\n\n\treturn InitData;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool ASoEnemy::ShouldRangeAttackPreferLargeArc(int32 Index) const\n{\n\tif (!RangeAttackProfileList.IsValidIndex(Index))\n\t\treturn false;\n\n\treturn RangeAttackProfileList[Index].bPreferLargeArc;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoEnemy::OnRangeAttackEnded()\n{\n\tif (Activity == ESoEnemyActivity::EEA_RangeAttack)\n\t{\n\t\tActivity = ESoEnemyActivity::EEA_Default;\n\t\tCurrentAnimData.Type = ESoAnimationType::EAT_Default;\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoEnemy::SetAnimation(FName SourceAnimName, FName TargetAnimName)\n{\n\tUAnimSequenceBase** SourcePtr = AnimationMap.Find(SourceAnimName);\n\tUAnimSequenceBase** TargetPtr = AnimationMap.Find(TargetAnimName);\n\n\tif (SourcePtr != nullptr && TargetPtr != nullptr)\n\t{\n\t\t*TargetPtr = *SourcePtr;\n\t\tOnAnimationMapChange.Broadcast(this);\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoEnemy::Block(FName BlockName, float Duration)\n{\n\tActivity = ESoEnemyActivity::EEA_Block;\n\tLastBlockName = BlockName;\n\n\tCurrentAnimData.Type = ESoAnimationType::EAT_UninterruptibleSingle;\n\tCurrentAnimData.UninterruptibleSingle.SetAnimation(BlockName, Duration);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoEnemy::HitReact(FName HitReactName, float Duration)\n{\n\tif (Activity == ESoEnemyActivity::EEA_Spawn)\n\t{\n\t\t// collision change in OnSpawnFinished can lead to overlap updates which can lead to unintended damage and death\n\t\t// bTempIgnoreAllDmg is used to prevent that\n\t\tbTempIgnoreAllDmg = true;\n\t\tOnSpawnFinished();\n\t\tbTempIgnoreAllDmg = false;\n\t}\n\n\tif (Activity == ESoEnemyActivity::EEA_Dead)\n\t\treturn;\n\tActivity = ESoEnemyActivity::EEA_HitReact;\n\n\tLastHitReactName = HitReactName;\n\tCurrentAnimData.Type = ESoAnimationType::EAT_UninterruptibleSingle;\n\tCurrentAnimData.UninterruptibleSingle.SetAnimation(HitReactName, Duration);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoEnemy::OverrideAnimation(bool bInterruptible, FName AnimName, float Duration, bool bLoop)\n{\n\tCurrentAnimData.Type = bInterruptible ? ESoAnimationType::EAT_InterruptibleSingle : ESoAnimationType::EAT_UninterruptibleSingle;\n\n\tFSoPingPongAnimName& Anim = bInterruptible ? CurrentAnimData.InterruptibleSingle : CurrentAnimData.UninterruptibleSingle;\n\tAnim.SetAnimation(AnimName, Duration, bLoop);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoEnemy::ActivateWeaponCollision_Implementation(bool bActivate, int32 SlotID)\n{\n\tSoCombat->SetWeaponCollisionEnabled(SlotID, bActivate);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoEnemy::Kill_Implementation(bool bPhysical)\n{\n\tDECLARE_SCOPE_CYCLE_COUNTER(TEXT(\"Kill_Implementation\"), STAT_Kill_Implementation, STATGROUP_SoEnemy);\n\n\tif (Activity == ESoEnemyActivity::EEA_Dead || bSoMarkedForDestroy)\n\t\treturn;\n\n\tif (ActiveAction != nullptr)\n\t{\n\t\tActiveAction->Interrupt(this);\n\t\tActiveAction = nullptr;\n\t}\n\t// ActiveAction->Interrupt can change activity, so that must be called first\n\tActivity = ESoEnemyActivity::EEA_Dead;\n\t// TODO: weapon collision num variable?!\n\tActivateWeaponCollision(false, 0);\n\tActivateWeaponCollision(false, 1);\n\n\tOnDeath();\n\tOnDeathNotify.Broadcast(this);\n\n\tif (!ASoGameMode::Get(this).IsEnemyGroupStillActive(SoGroupName))\n\t{\n\t\tif (bPrintWarningIfGroupIsGoneOnDeath)\n\t\t\tUE_LOG(LogSoEnemyAI, Warning, TEXT(\"%s just died but his group is already dead?!\"), *GetName());\n\n\t\treturn;\n\t}\n\n\tASoGameMode::Get(this).OnEnemyDestroyed(this, SoGroupName, GetActorLocation());\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoEnemy::OnDeath_Implementation()\n{\n\tDECLARE_SCOPE_CYCLE_COUNTER(TEXT(\"OnDeath_Implementation\"), STAT_OnDeath_Implementation, STATGROUP_SoEnemy);\n\n\tif (bSoMarkedForDestroy)\n\t\treturn;\n\n\tOnMortalDeath.Broadcast();\n\tSoMovement->Deactivate();\n\tGetCapsuleComponent()->SetCollisionEnabled(ECollisionEnabled::NoCollision);\n\n\tif (SFXOnDeathVOs.Num() > 0)\n\t\tUSoEnemyVoiceManager::Get(this).PlayEnemyVoice(this, SFXOnDeathVOs[FMath::RandHelper(SFXOnDeathVOs.Num())], ESoVoiceType::SoVoiceTypeDeath);\n\n\tif (bActivateRagdollOnDeath)\n\t{\n\t\tGetMesh()->SetCollisionProfileName(FName(\"Ragdoll\"));\n\t\tGetMesh()->SetCollisionEnabled(ECollisionEnabled::QueryAndPhysics);\n\t\tGetMesh()->SetSimulatePhysics(true);\n\t\tGetMesh()->bPauseAnims = true;\n\n\t\tif (SFXOnBodyHit != nullptr && !bSubscribedToMeshHit)\n\t\t{\n\t\t\tGetMesh()->OnComponentHit.AddDynamic(this, &ASoEnemy::OnMeshHitCallback);\n\t\t\tbSubscribedToMeshHit = true;\n\t\t}\n\n\t\tif (bHideRagdollAfterVisibleTime)\n\t\t{\n\t\t\tGetWorld()->GetTimerManager().SetTimer(\n\t\t\t\tRagdollFadeOutTimer,\n\t\t\t\tthis,\n\t\t\t\t&ThisClass::FadeOutRagdoll,\n\t\t\t\tGetRagdollVisibleTime()\n\t\t\t);\n\t\t}\n\n#if !PLATFORM_SWITCH\n\t\tif (bRagdollShouldGenerateOverlapEvents)\n\t\t{\n\t\t\tGetMesh()->SetGenerateOverlapEvents(true);\n\t\t}\n#endif\n\t}\n\telse\n\t\tGetMesh()->SetCollisionEnabled(ECollisionEnabled::NoCollision);\n\t// GetMesh()->SetGenerateOverlapEvents(false);\n\n\tGetWorld()->GetTimerManager().ClearTimer(IdleVOTimer);\n\n\tif (bCanHaveHealthWidget)\n\t\tUpdateHealthBar3D(true);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool ASoEnemy::IsAlive_Implementation() const\n{\n\treturn Activity != ESoEnemyActivity::EEA_Dead;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoEnemy::CauseDmg_Implementation(const FSoDmg& Dmg, const FSoHitReactDesc& HitReactDesc)\n{\n\tDECLARE_SCOPE_CYCLE_COUNTER(TEXT(\"CauseDmg_Implementation\"), STAT_CauseDmg_Implementation, STATGROUP_SoEnemy);\n\tUE_LOG(LogSoEnemyAI, Display, TEXT(\"ASoEnemy::CauseDmg_Implementation\"));\n\n\tif (Activity == ESoEnemyActivity::EEA_Dead || bTempIgnoreAllDmg || bIgnoreDamage || bSoMarkedForDestroy)\n\t\treturn;\n\n\tif (bBlockRangedAttacks &&\n\t\t!bMeleeHitTakeInProgress &&\n\t\tHitReactDesc.HitReact != ESoHitReactType::EHR_FallToDeath &&\n\t\tHitReactDesc.HitReact != ESoHitReactType::EHR_BreakIntoPieces &&\n\t\tfabs(HitReactDesc.Irresistibility) < 10)\n\t{\n\t\tOnRangeAttackBlockedBP();\n\n\t\tconst FVector TargetLocation = BoneToTarget == NAME_None ? GetActorLocation() : GetMesh()->GetSocketLocation(BoneToTarget);\n\t\tASoGameMode::Get(this).DisplayText(TargetLocation, Dmg.Physical > Dmg.Magical ? ESoDisplayText::EDT_Blocked : ESoDisplayText::EDT_Immune);\n\n\t\treturn;\n\t}\n\n\tif (HitReactDesc.AssociatedActor != nullptr && AttackSourcesToIgnore.Contains(HitReactDesc.AssociatedActor->GetClass()))\n\t{\n\t\tASoGameMode::Get(this).DisplayText(HitReactDesc.AssociatedActor->GetActorLocation(), ESoDisplayText::EDT_Immune);\n\t\treturn;\n\t}\n\n\tUSoAudioManager::PlaySoundAttached(\n\t\tSFXHitReact,\n\t\tGetMesh(),\n\t\tNAME_None,\n\t\tFVector(0.0f, 0.0f, 0.0f),\n\t\tEAttachLocation::KeepRelativeOffset\n\t);\n\n\tif ((HitReactDesc.HitReact == ESoHitReactType::EHR_BreakIntoPieces && !bIgnoreBreakHitReact) ||\n\t\tHitReactDesc.HitReact == ESoHitReactType::EHR_FallToDeath)\n\t{\n\t\tif (Tags.Contains(SwappedTagName))\n\t\t{\n\t\t\tstatic const FName SwapKillName = FName(\"A_Swapkill\");\n\t\t\tUSoAchievementManager::Get(this).UnlockAchievement(this, SwapKillName);\n\t\t}\n\n\t\tISoMortal::Execute_Kill(this, true);\n\t\treturn;\n\t}\n\n\tif (!bMeleeHitTakeInProgress)\n\t{\n\t\tstatic const FName PoisonName = FName(\"Poison\");\n\t\tif (bChangedHitReactColor != HitReactDesc.AssociatedBones.Contains(PoisonName))\n\t\t{\n\t\t\tbUpdateHitReactColor = true;\n\t\t\tbChangedHitReactColor = HitReactDesc.AssociatedBones.Contains(PoisonName);\n\t\t}\n\n\t\tif (!bIsInAnotherDimension)\n\t\t\tUSoEnemyHelper::DisplayDamageText(this,\n\t\t\t\t\t\t\t\t\t\t\t  SoCharacterSheet->GetReducedDmg(Dmg),\n\t\t\t\t\t\t\t\t\t\t\t  (HitReactDesc.AssociatedActor == nullptr || HitReactDesc.AssociatedActor == this)\n\t\t\t\t\t\t\t\t\t\t\t\t\t? GetDefaultDmgNumberLocation()\n\t\t\t\t\t\t\t\t\t\t\t\t\t: HitReactDesc.AssociatedActor->GetActorLocation(),\n\t\t\t\t\t\t\t\t\t\t\t  GetActorForwardVector(),\n\t\t\t\t\t\t\t\t\t\t\t  bWasHitThisFrame,\n\t\t\t\t\t\t\t\t\t\t\t  false);\n\t\tbWasHitThisFrame = true;\n\t}\n\n\tconst bool bStillAlive = SoCharacterSheet->ApplyDmg(Dmg);\n\tOnDamageTakenBP(bStillAlive);\n\tif (!bStillAlive)\n\t{\n\t\t// damage type is irrelevant here\n\t\tISoMortal::Execute_Kill(this, true);\n\t}\n\telse\n\t{\n\t\tUpdateHealthBar3D();\n\n\t\tif (SFXHitReactVOs.Num() > 0)\n\t\t\tUSoEnemyVoiceManager::Get(this).PlayEnemyVoice(this, SFXHitReactVOs[FMath::RandHelper(SFXHitReactVOs.Num())], ESoVoiceType::SoVoiceTypeHitReact);\n\n\t\tif (ActiveAction)\n\t\t{\n\t\t\tif (!bHitreactBlock && RessistanceToInterrupts < HitReactDesc.Irresistibility && ActiveAction->IsInterruptible())\n\t\t\t{\n\t\t\t\tActiveAction->Interrupt(this);\n\t\t\t\tActiveAction = nullptr;\n\t\t\t}\n\t\t\telse\n\t\t\t\treturn;\n\t\t}\n\n\t\tFSoEActions* HitReacts = ActionMap.Find(NamedActionLists[ESoActionList::EAL_HitReact]);\n\t\tif (HitReacts != nullptr && !bHitreactBlock)\n\t\t{\n\t\t\tActiveAction = GetFirstSatisfiedAction(HitReacts->Array);\n\t\t\tif (ActiveAction != nullptr)\n\t\t\t\tActiveAction->Start(this);\n\t\t}\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool ASoEnemy::MeleeHit_Implementation(const FSoMeleeHitParam& HitParam)\n{\n\tDECLARE_SCOPE_CYCLE_COUNTER(TEXT(\"MeleeHit_Implementation\"), STAT_MeleeHit_Implementation, STATGROUP_SoEnemy);\n\tUE_LOG(LogSoEnemyAI, Display, TEXT(\"ASoEnemy::MeleeHit_Implementation\"));\n\n\tif (Activity == ESoEnemyActivity::EEA_Dead || bIgnoreDamage || bSoMarkedForDestroy)\n\t\treturn true;\n\n\tconst bool bCritical = IsCriticalHit(HitParam.HitReactDesc.AssociatedBones);\n\tconst FVector EstimatedSourceLocation = HitParam.HitReactDesc.AssociatedActor->GetActorLocation();\n\tconst FVector HitLocation = HitParam.Hit.ImpactPoint.IsNearlyZero() ? GetClosestHitLocationToPoint(HitParam.HitReactDesc, EstimatedSourceLocation, bCritical)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t: FVector(HitParam.Hit.ImpactPoint);\n\tif (bAllowCoverTraceCheck)\n\t{\n\t\tFCollisionQueryParams QuaryParams;\n\t\tQuaryParams.bIgnoreTouches = true;\n\t\tFCollisionResponseParams ResponseParams;\n\t\tResponseParams.CollisionResponse.SetAllChannels(ECollisionResponse::ECR_Ignore);\n\t\tResponseParams.CollisionResponse.SetResponse(ECollisionChannel::ECC_WorldStatic, ECR_Block);\n\t\tif (bCoverTraceCheckWorldDyanmicToo)\n\t\t\tResponseParams.CollisionResponse.SetResponse(ECollisionChannel::ECC_WorldDynamic, ECR_Block);\n\t\tconst bool bBlocked = GetWorld()->LineTraceTestByChannel(EstimatedSourceLocation, HitLocation, ECollisionChannel::ECC_WorldStatic, QuaryParams, ResponseParams);\n\n\t\tif (bDisplayMeleeHitTraceLines)\n\t\t\tDrawDebugLine(GetWorld(), EstimatedSourceLocation, HitLocation, (bBlocked ? FColor::Red : FColor::Green), false, 3, 0, 3.0f);\n\n\t\tif (bBlocked)\n\t\t\treturn false;\n\t}\n\n\tbool bHit = false;\n\tfor (const FName BoneName : HitParam.HitReactDesc.AssociatedBones)\n\t{\n\t\tif (BoneToIgnore == NAME_None ||\n\t\t\t(BoneName != BoneToIgnore && !GetMesh()->BoneIsChildOf(BoneName, BoneToIgnore)))\n\t\t{\n\t\t\tbHit = true;\n\t\t\tbreak;\n\t\t}\n\t}\n\n\tif (!bHit)\n\t\treturn true;\n\n\n\t// check blockchance\n\tif (BlockChance >= FMath::RandRange(0.0f, 1.0f))\n\t{\n\t\t// block is only possible atm if the current action is interruptible\n\t\tif (ActiveAction == nullptr || ActiveAction->IsInterruptible())\n\t\t{\n\t\t\tif (ActiveAction != nullptr)\n\t\t\t{\n\t\t\t\tActiveAction->Interrupt(this);\n\t\t\t\tActiveAction = nullptr;\n\t\t\t}\n\n\t\t\tFSoEActions* BlockActions = ActionMap.Find(NamedActionLists[ESoActionList::EAL_Block]);\n\t\t\tif (BlockActions != nullptr)\n\t\t\t{\n\t\t\t\t// maybe all failed - then the enemy could not block the attack\n\t\t\t\tActiveAction = GetFirstSatisfiedAction(BlockActions->Array);\n\t\t\t\tif (ActiveAction != nullptr)\n\t\t\t\t{\n\t\t\t\t\t// TODO: some event or something if blocked with blocked damage amount\n\t\t\t\t\tActiveAction->Start(this);\n\t\t\t\t\tLastBlockTime = GetWorld()->GetTimeSeconds();\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t} // can block\n\t}\n\n\tif (bChangedHitReactColor != (HitParam.ImpactFX != nullptr))\n\t{\n\t\tbUpdateHitReactColor = true;\n\t\tbChangedHitReactColor = (HitParam.ImpactFX != nullptr);\n\t}\n\n\tOnMeleeHitSuffered.Broadcast(this, HitParam);\n\n\tOnMeleeHitTaken(HitParam, HitLocation, bCritical);\n\n\tif (HitParam.ImpactFX != nullptr)\n\t\tUGameplayStatics::SpawnEmitterAtLocation(GetWorld(), HitParam.ImpactFX, HitLocation);\n\n\t// Reduce friendly fire effect\n\tconst FSoDmg Damage = (HitParam.HitReactDesc.AssociatedActor == USoStaticHelper::GetPlayerCharacterAsActor(this) ? HitParam.Dmg : HitParam.Dmg * 0.1f);\n\tif (!bIsInAnotherDimension)\n\t\tUSoEnemyHelper::DisplayDamageText(this, SoCharacterSheet->GetReducedDmg(Damage), HitLocation, GetActorForwardVector(), bWasHitThisFrame, HitParam.bCritical);\n\tbWasHitThisFrame = true;\n\n\t// before CauseDamage, so certain effects can modify ActiveAction to prevent HitReact\n\tfor (auto& Effect : HitParam.Effects)\n\t\tApplyEffect_Implementation(Effect, true);\n\n\tbMeleeHitTakeInProgress = true;\n\tCauseDmg_Implementation(Damage, HitParam.HitReactDesc);\n\tbMeleeHitTakeInProgress = false;\n\n\tLastHitTime = GetWorld()->GetTimeSeconds();\n\treturn true;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoEnemy::HandlePlayerRespawn_Implementation()\n{\n\tif (ASoGameMode::Get(this).IsEnemyGroupStillActive(SoGroupName))\n\t{\n\t\tResetSoEnemy();\n\t}\n\telse\n\t\tUSoEventHandlerHelper::UnsubscribeFromPlayerRespawn(this);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoEnemy::HandleSoPostLoad_Implementation()\n{\n\tensure(bPlacedInLevel);\n\n\tif (ASoGameMode::Get(this).IsEnemyGroupStillActive(SoGroupName))\n\t{\n\t\tActivity = ESoEnemyActivity::EEA_Default;\n\t\tResetSoEnemy();\n\t\tUSoEventHandlerHelper::SubscribeToPlayerRespawn(this);\n\n\t\tFSoSplinePoint& SplineLocation = SoMovement->GetSplineLocation();\n\t\tif (ASoPlayerSpline* Spline = Cast<ASoPlayerSpline>(SplineLocation.GetSpline()))\n\t\t\tSpline->RegisterEnemySpawnLocation(SplineLocation.GetDistance(), GetActorLocation().Z, SoGroupName);\n\t}\n\telse\n\t\tDeactivateSoEnemy();\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUSceneComponent* ASoEnemy::GetComponent_Implementation() const\n{\n\treturn GetMesh();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFName ASoEnemy::GetSocketName_Implementation() const\n{\n\treturn BoneToTarget;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool ASoEnemy::ShouldSpawnVO_Implementation(ESoVoiceType VoiceType) const\n{\n\tswitch (VoiceType)\n\t{\n\t\tcase ESoVoiceType::SoVoiceTypeAttack:\n\t\t\treturn FMath::RandRange(0.0f, 1.0f) <= VOChanceAttack;\n\n\t\tcase ESoVoiceType::SoVoiceTypeHitReact:\n\t\t\treturn FMath::RandRange(0.0f, 1.0f) <= VOChanceHitReact;\n\n\t\tcase ESoVoiceType::SoVoiceTypeIdle:\n\t\tcase ESoVoiceType::SoVoiceTypeDeath:\n\t\tcase ESoVoiceType::SoVoiceTypeNoise:\n\t\t\treturn true;\n\n\t\tdefault:\n\t\t\treturn false;\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoEnemy::ResetSoEnemy()\n{\n\tif (NamedActionLists[ESoActionList::EAL_Idle] != NAME_None)\n\t{\n\t\tActiveActionListName = NamedActionLists[ESoActionList::EAL_Idle];\n\t\tActiveActionList = ESoActionList::EAL_Idle;\n\t}\n\n\tOnResetSoEnemyBP();\n\n\tProjectileSpawner->ClearSpawnedProjectiles();\n\n\tSetActorTransform(InitialTransform);\n\tSoMovement->SetSplineLocation(InitialSplinePoint);\n\tSoCharacterSheet->RestoreHealth();\n\n\tSoEffectHandler->OnOwnerSpellsReset();\n\n\t// 3d health\n\tWidgetPercentUpdateTime = 0.6f;\n\tWidgetLastTargetPercent = 1.0f;\n\tWidgetCurrentPercent = 1.0f;\n\tWidgetPercentUpdateCounter = -1.0f;\n\tSetHealthBar3DPercent(1.0f);\n\n\tif (ActiveAction != nullptr)\n\t{\n\t\tActiveAction->Interrupt(this);\n\t\tActiveAction = nullptr;\n\t}\n\tActivity = ESoEnemyActivity::EEA_Default;\n\n\tActivateSoEnemy();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoEnemy::PauseEnemy()\n{\n\tif (!bCanBePaused)\n\t\treturn;\n\n\tbShouldBePausedIfPlacedInLevel = true;\n\tif (!bPaused && IsAlive() && ASoGameMode::Get(this).IsEnemyGroupStillActive(SoGroupName))\n\t{\n\t\tbPaused = true;\n\t\tSoMovement->SetComponentTickEnabled(false);\n\t\tUpdateHealthBar3D(true);\n\n\t\tif (MaterialAnimations.IsValidIndex(RagdollFadeOutMaterialAnimationIndex))\n\t\t{\n\t\t\tGetMesh()->SetVectorParameterValueOnMaterials(FadeOutColorParamName, PauseFadeOutColor);\n\t\t\tPlayMaterialAnimation(RagdollFadeOutMaterialAnimationIndex, true, PauseFadeSpeed);\n\t\t\tGetWorld()->GetTimerManager().SetTimer(PauseFadeOutTimer, this, &ASoEnemy::PauseFadeFinished, MaterialAnimations[RagdollFadeOutMaterialAnimationIndex].Duration, false);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tCustomTimeDilation = 0.0f;\n\t\t\tSetActorHiddenInGame(true);\n\t\t\tSetActorTickEnabled(false);\n\t\t}\n\n\t\tGetMesh()->bNoSkeletonUpdate = true;\n\t\tGetMesh()->SetComponentTickEnabled(false);\n\t\tGetMesh()->SetCollisionEnabled(ECollisionEnabled::NoCollision);\n\n\t\tGetCapsuleComponent()->SetCollisionEnabled(ECollisionEnabled::NoCollision);\n\n\t\tOnPauseEnemyBP();\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoEnemy::UnpauseEnemy()\n{\n\tif (!ASoGameMode::Get(this).IsEnemyGroupStillActive(SoGroupName))\n\t\treturn;\n\n\tGetWorld()->GetTimerManager().ClearTimer(PauseFadeOutTimer);\n\n\tbShouldBePausedIfPlacedInLevel = false;\n\tbPaused = false;\n\tif (!IsAlive())\n\t{\n\t\tDeactivateSoEnemy();\n\t}\n\telse\n\t{\n\t\tSoMovement->SetComponentTickEnabled(true);\n\t\tCustomTimeDilation = USoGameSettings::Get().GetGameSpeed();\n\t\tSetActorTickEnabled(true);\n\t\tSetActorHiddenInGame(false);\n\n\t\tGetMesh()->SetVectorParameterValueOnMaterials(FadeOutColorParamName, PauseFadeOutColor);\n\n\t\tif (MaterialAnimations.IsValidIndex(RagdollFadeOutMaterialAnimationIndex))\n\t\t{\n\t\t\tauto& MatAnim = MaterialAnimations[RagdollFadeOutMaterialAnimationIndex];\n\t\t\tif (MatAnim.Counter < MatAnim.Duration)\n\t\t\t{\n\t\t\t\tMatAnim.bPlayForward = false;\n\t\t\t\tMatAnim.Counter = MatAnim.Duration - MatAnim.Counter;\n\t\t\t}\n\t\t\telse\n\t\t\t\tPlayMaterialAnimation(RagdollFadeOutMaterialAnimationIndex, false, PauseFadeSpeed);\n\t\t}\n\n\t\tGetCapsuleComponent()->SetCollisionEnabled(ECollisionEnabled::QueryAndPhysics);\n\n\t\tGetMesh()->bNoSkeletonUpdate = false;\n\t\tGetMesh()->SetComponentTickEnabled(true);\n\t\tGetMesh()->SetCollisionEnabled(ECollisionEnabled::QueryAndPhysics);\n\n\t\tUpdateHealthBar3D();\n\t\tOnUnpauseEnemyBP();\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoEnemy::FadeOutAndDestroy()\n{\n\tif (!MaterialAnimations.IsValidIndex(RagdollFadeOutMaterialAnimationIndex))\n\t{\n\t\tDestroy();\n\t\treturn;\n\t}\n\n\n\tbPaused = true;\n\tSoMovement->SetComponentTickEnabled(false);\n\tUpdateHealthBar3D(true);\n\n\tGetMesh()->SetVectorParameterValueOnMaterials(FadeOutColorParamName, PauseFadeOutColor);\n\tPlayMaterialAnimation(RagdollFadeOutMaterialAnimationIndex, true, PauseFadeSpeed);\n\tGetWorld()->GetTimerManager().SetTimer(PauseFadeOutTimer, this, &ASoEnemy::DestroyFadeFinished, MaterialAnimations[RagdollFadeOutMaterialAnimationIndex].Duration, false);\n\n\tGetMesh()->bNoSkeletonUpdate = true;\n\tGetMesh()->SetComponentTickEnabled(false);\n\tGetMesh()->SetCollisionEnabled(ECollisionEnabled::NoCollision);\n\n\tGetCapsuleComponent()->SetCollisionEnabled(ECollisionEnabled::NoCollision);\n\tOnPauseEnemyBP();\n\tbSoMarkedForDestroy = true;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoEnemy::ActivateSoEnemy()\n{\n\tDECLARE_SCOPE_CYCLE_COUNTER(TEXT(\"ActivateSoEnemy\"), STAT_ActivateSoEnemy, STATGROUP_SoEnemy);\n\n\tGetMesh()->SetVisibility(true, true);\n\tGetMesh()->SetCollisionProfileName(FName(\"SoCharMesh\"));\n\t// TODO: enable this if it isn't just the sphere golem who needs it\n\t// GetMesh()->SetCollisionResponseToChannel(ECC_WorldDynamic, ECR_Overlap);\n\tGetMesh()->SetCollisionResponseToChannel(ECollisionChannel::ECC_Pawn, ECollisionResponse::ECR_Overlap);\n\tGetMesh()->bPauseAnims = false;\n\n\tStopAllMaterialAnimations();\n\n\tif (bActivateRagdollOnDeath)\n\t{\n\t\tGetMesh()->PutAllRigidBodiesToSleep();\n\t\tGetMesh()->SetSimulatePhysics(false);\n\t\tGetMesh()->SetAllBodiesPhysicsBlendWeight(0.0f);\n\t\tif (bSubscribedToMeshHit)\n\t\t{\n\t\t\tGetMesh()->OnComponentHit.RemoveDynamic(this, &ASoEnemy::OnMeshHitCallback);\n\t\t\tbSubscribedToMeshHit = false;\n\t\t}\n\n\t\tGetMesh()->ResetAllBodiesSimulatePhysics();\n\t\tGetMesh()->SetRelativeLocationAndRotation(FVector::ZeroVector, FRotator::ZeroRotator);\n\t\t/** called here because somehow the ragdoll setup ruins something and the capsule does not update the mesh location without this anymore */\n\t\tGetMesh()->AttachToComponent(GetCapsuleComponent(), FAttachmentTransformRules::KeepWorldTransform);\n\n\t\t/** After attachment is \"restored\" !!! */\n\t\tGetMesh()->SetRelativeLocation(InitialMeshLocation);\n\t\tGetMesh()->SetRelativeRotation(InitialMeshRotation);\n\n\t\tif (RagdollFadeOutTimer.IsValid())\n\t\t{\n\t\t\tbRagdollFadeOutInProgress = false;\n\t\t\tGetWorld()->GetTimerManager().ClearTimer(RagdollFadeOutTimer);\n\t\t}\n\n\t\tGetMesh()->SetScalarParameterValueOnMaterials(FadeStrName, 1.0f);\n\t}\n\telse\n\t\tGetMesh()->SetCollisionEnabled(ECollisionEnabled::QueryAndPhysics);\n\n\tUpdateOverlapSetup();\n\n\tSoMovement->Activate(true);\n\tSoMovement->SetMovementMode(SoMovement->DefaultLandMovementMode);\n\tGetCapsuleComponent()->SetCollisionEnabled(ECollisionEnabled::QueryAndPhysics);\n\n\tOnActivateSoEnemyBP();\n\tASoGameMode::Get(this).RegisterEnemy(this, SoGroupName);\n\n\tif (bUseIdleVO)\n\t\tGetWorld()->GetTimerManager().SetTimer(\n\t\t\tIdleVOTimer,\n\t\t\tthis,\n\t\t\t&ThisClass::OnIdleVO,\n\t\t\tGetRandRangeIdleVODelay()\n\t\t);\n\n\tHealthWidget3D->SetVisibility(false);\n\n\tif (bPlacedInLevel && bShouldBePausedIfPlacedInLevel && bCanBePaused)\n\t\tPauseEnemy();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoEnemy::DeactivateSoEnemy()\n{\n\tDECLARE_SCOPE_CYCLE_COUNTER(TEXT(\"DeactivateSoEnemy\"), STAT_DeactivateSoEnemy, STATGROUP_SoEnemy);\n\n\tGetMesh()->SetVisibility(false, true);\n\tGetMesh()->bPauseAnims = true;\n\tSoMovement->Deactivate();\n\tGetCapsuleComponent()->SetCollisionEnabled(ECollisionEnabled::NoCollision);\n\tGetMesh()->SetCollisionEnabled(ECollisionEnabled::NoCollision);\n\tGetMesh()->SetGenerateOverlapEvents(false);\n\tActivity = ESoEnemyActivity::EEA_Dead;\n\tSoEffectHandler->OnOwnerSpellsReset();\n\n\tOnDeactivateSoEnemyBP();\n\tASoGameMode::Get(this).UnregisterEnemy(this, SoGroupName);\n\n\tif (RagdollFadeOutTimer.IsValid())\n\t{\n\t\tbRagdollFadeOutInProgress = false;\n\t\tGetWorld()->GetTimerManager().ClearTimer(RagdollFadeOutTimer);\n\t}\n\n\tGetWorld()->GetTimerManager().ClearTimer(IdleVOTimer);\n\tif (bCanHaveHealthWidget)\n\t\tUpdateHealthBar3D(true);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoEnemy::DiedAndLanded()\n{\n\tSoMovement->StopActiveMovement();\n\tSoMovement->SetMovementMode(MOVE_Flying);\n\tGetCapsuleComponent()->SetCollisionEnabled(ECollisionEnabled::NoCollision);\n\tActivateWeaponCollision(false, 0);\n\tActivateWeaponCollision(false, 1);\n\tSoMovement->ClearRootMotionDesc();\n\tSoMovement->Velocity = FVector(0, 0, 0);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoEnemy::OnBlocked()\n{\n\tDECLARE_SCOPE_CYCLE_COUNTER(TEXT(\"OnBlocked\"), STAT_OnBlocked, STATGROUP_SoEnemy);\n\tUE_LOG(LogSoEnemyAI, Display, TEXT(\"ASoEnemy::OnBlocked\"));\n\n\tif (ActiveAction != nullptr && ActiveAction->IsInterruptible())\n\t{\n\t\tActiveAction->Interrupt(this);\n\t\tActiveAction = nullptr;\n\n\t\tFSoEActions* BlockedActions = ActionMap.Find(NamedActionLists[ESoActionList::EAL_Blocked]);\n\t\tif (BlockedActions != nullptr)\n\t\t{\n\t\t\tActiveAction = GetFirstSatisfiedAction(BlockedActions->Array);\n\t\t\tif (ActiveAction != nullptr)\n\t\t\t\tActiveAction->Start(this);\n\t\t}\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool ASoEnemy::OnPreLanded(const FHitResult& Hit)\n{\n\tif (ActiveAction == nullptr && WaitSecAfterLand > KINDA_SMALL_NUMBER)\n\t\tWait(WaitSecAfterLand);\n\n\tTags.Remove(SwappedTagName);\n\treturn true;\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nAActor* ASoEnemy::GetTarget() const\n{\n\treturn USoStaticHelper::GetPlayerCharacterAsActor(this);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoEnemy::ChangeActionList(ESoActionList NewList)\n{\n\tFName* ListName = NamedActionLists.Find(NewList);\n\tif (ListName == nullptr || (*ListName) == NAME_None)\n\t{\n\t\tconst UEnum* EnumPtr = FindObject<UEnum>(ANY_PACKAGE, TEXT(\"ESoActionList\"), true);\n\t\tconst FString EnumName = EnumPtr ? EnumPtr->GetNameStringByIndex(static_cast<int32>(NewList)) : \"Invalid ESoActionList Value\";\n\t\tUE_LOG(LogSoEnemyAI, Warning, TEXT(\"ASoEnemy::ChangeActionList called for named list %s but it does not have a valid value!\"), *EnumName);\n\t\treturn;\n\t}\n\tActiveActionListName = *ListName;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoEnemy::ModifyFloatValue(ESoEnemyFloat ValueToChange, float Value, bool bDelta)\n{\n\tswitch (ValueToChange)\n\t{\n\t\tcase ESoEnemyFloat::EEF_BlockChance:\n\t\t\tBlockChance = FMath::Clamp((bDelta ? (BlockChance + Value) : Value), 0.0f, 1.0f);\n\t\t\treturn;\n\n\t\tcase ESoEnemyFloat::EEF_BlockChanceDelta:\n\t\t\tBlockChanceDelta = (bDelta ? (BlockChanceDelta + Value) : Value);\n\t\t\treturn;\n\n\t\tdefault:\n\t\t\tbreak;\n\t}\n\n\tconst UEnum* EnumPtr = FindObject<UEnum>(ANY_PACKAGE, TEXT(\"ESoEnemyFloat\"), true);\n\tconst FString EnumName = EnumPtr ? EnumPtr->GetNameStringByIndex(static_cast<int32>(ValueToChange)) : \"Invalid ESoEnemyFloat Value\";\n\tUE_LOG(LogSoEnemyAI, Warning, TEXT(\"ASoEnemy::ModifyFloatValue called on %s, but it is not a valid modifiable value\"), *EnumName);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nfloat ASoEnemy::GetFloatValue(ESoEnemyFloat Value) const\n{\n\tswitch (Value)\n\t{\n\t\tcase ESoEnemyFloat::EEF_BlockChance:\n\t\t\treturn BlockChance;\n\n\t\tcase ESoEnemyFloat::EEF_BlockChanceDelta:\n\t\t\treturn BlockChanceDelta;\n\n\t\tcase ESoEnemyFloat::EEF_TimeSinceLastBlock:\n\t\t\treturn GetWorld()->GetTimeSeconds() - LastBlockTime;\n\n\t\tcase ESoEnemyFloat::EEF_TimeSinceLastHitReact:\n\t\t\treturn GetWorld()->GetTimeSeconds() - LastHitTime;\n\n\t\tcase ESoEnemyFloat::EEF_TimeSinceLastMonologueEnd:\n\t\t\treturn GetWorld()->GetTimeSeconds() - LastMonologueEndTime;\n\t}\n\n\treturn 0.0f;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoEnemy::ReloadScripts()\n{\n\tDECLARE_SCOPE_CYCLE_COUNTER(TEXT(\"ReloadScripts\"), STAT_ReloadScripts, STATGROUP_SoEnemy);\n\n\tUWorld* World = GetWorld();\n\tif (World == nullptr)\n\t\treturn;\n\n\tauto* GameInstance = USoGameInstance::GetInstance(this);\n\tif (GameInstance == nullptr)\n\t\treturn;\n\n\t// strike data - each melee attack for the enemy should be defined in the config file behind StrikeMapConfigName\n\tGameInstance->ReinitializeStrikeMap(StrikeMapConfigName, StrikeMap);\n\n\tif (ActiveAction != nullptr)\n\t{\n\t\tActiveAction->Interrupt(this);\n\t\tActiveAction = nullptr;\n\t}\n\n\t// action sets\n\tActionMap.Empty();\n\tfor (FName ListName : ActionLists)\n\t{\n\t\tFSoEActions& ActionList = ActionMap.Add(ListName);\n\t\tGameInstance->ReinitializeActionList(ListName, this, ActionList.Array);\n\t}\n\n\t// named action sets\n\tfor (auto& Iter : NamedActionLists)\n\t\tif (Iter.Value != NAME_None)\n\t\t{\n\t\t\tFSoEActions& ActionList = ActionMap.Add(Iter.Value);\n\t\t\tGameInstance->ReinitializeActionList(Iter.Value, this, ActionList.Array);\n\t\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool ASoEnemy::IsPlayerBetweenMarkers(int32 Index0, int32 Index1, bool bResultOnInvalidMarkers) const\n{\n\tconst FSoSplinePoint PlayerSplineLocation = USoStaticHelper::GetPlayerSplineLocation(this);\n\tASoMarker* TargetMarker0 = GetTargetMarker(Index0);\n\tASoMarker* TargetMarker1 = GetTargetMarker(Index1);\n\tif (TargetMarker0 == nullptr || TargetMarker1 == nullptr)\n\t\treturn bResultOnInvalidMarkers;\n\n\treturn USoSplineHelper::IsSplinepointBetweenPoints(PlayerSplineLocation, TargetMarker0->GetSplineLocation(), TargetMarker1->GetSplineLocation());\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool ASoEnemy::IsBetweenMarkers(int32 Index0, int32 Index1, bool bResultOnInvalidMarkers) const\n{\n\tASoMarker* TargetMarker0 = GetTargetMarker(Index0);\n\tASoMarker* TargetMarker1 = GetTargetMarker(Index1);\n\tif (TargetMarker0 == nullptr || TargetMarker1 == nullptr)\n\t\treturn bResultOnInvalidMarkers;\n\n\treturn USoSplineHelper::IsSplinepointBetweenPoints(SoMovement->GetSplineLocation(), TargetMarker0->GetSplineLocation(), TargetMarker1->GetSplineLocation());\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool ASoEnemy::IsFacingMarker(int32 Index0, bool bResultOnInvalidMarkers) const\n{\n\tASoMarker* TargetMarker = GetTargetMarker(Index0);\n\tif (TargetMarker == nullptr)\n\t\treturn bResultOnInvalidMarkers;\n\n\tconst int32 Direction0 = SoMovement->GetSplineLocation().GetDirectionModifierFromVector(GetActorForwardVector());\n\tconst int32 Direction1 = FMath::Sign(TargetMarker->GetSplineLocation() - SoMovement->GetSplineLocation());\n\treturn Direction0 == Direction1;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool ASoEnemy::GetSplineLocationFromMarker(int32 Index, FSoSplinePoint& OutSplineLocation) const\n{\n\tif (Index == -1)\n\t{\n\t\tOutSplineLocation = InitialSplinePoint;\n\t\tOutSplineLocation.SetReferenceZ(InitialTransform.GetLocation().Z);\n\t}\n\telse\n\t{\n\t\tASoMarker* TargetMarker = GetTargetMarker(Index);\n\t\tif (!TargetMarker)\n\t\t\treturn false;\n\n\t\tOutSplineLocation = TargetMarker->GetSplineLocation();\n\t\tOutSplineLocation.SetReferenceZ(TargetMarker->GetActorLocation().Z);\n\t}\n\treturn (OutSplineLocation.IsValid(false));\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoEnemy::SetSoGroupName(FName GroupName)\n{\n\tSoGroupName = GroupName;\n\tASoGameMode::Get(this).RegisterEnemy(this, GroupName);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoEnemy::FadeOutRagdoll()\n{\n\tGetMesh()->SetVectorParameterValueOnMaterials(FadeOutColorParamName, RagdollFadeOutColor);\n\tPlayMaterialAnimation(RagdollFadeOutMaterialAnimationIndex);\n\tif (MaterialAnimations.IsValidIndex(RagdollFadeOutMaterialAnimationIndex))\n\t{\n\t\tbRagdollFadeOutInProgress = true;\n\t\tGetWorld()->GetTimerManager().SetTimer(RagdollFadeOutTimer, this, &ASoEnemy::RagdollFadeFinished, MaterialAnimations[RagdollFadeOutMaterialAnimationIndex].Duration);\n\t}\n#if !PLATFORM_SWITCH\n\tif (bRagdollShouldGenerateOverlapEvents)\n\t{\n\t\tGetMesh()->SetGenerateOverlapEvents(false);\n\t}\n#endif\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoEnemy::RagdollFadeFinished()\n{\n\tbRagdollFadeOutInProgress = false;\n\tGetMesh()->SetVisibility(false);\n\tGetMesh()->PutAllRigidBodiesToSleep();\n\tGetMesh()->SetSimulatePhysics(false);\n\tif (bSubscribedToMeshHit)\n\t{\n\t\tGetMesh()->OnComponentHit.RemoveDynamic(this, &ASoEnemy::OnMeshHitCallback);\n\t\tbSubscribedToMeshHit = false;\n\t}\n\n\t// point of no return?\n\tif (!bPlacedInLevel)\n\t{\n\t\tDestroy();\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoEnemy::PauseFadeFinished()\n{\n\tSetActorHiddenInGame(true);\n\tSetActorTickEnabled(false);\n\tCustomTimeDilation = 0.0f;\n\t// UE_LOG(LogTemp, Warning, TEXT(\"SetActorHiddenInGame(true)\"));\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoEnemy::DestroyFadeFinished()\n{\n\tDestroy();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoEnemy::OnMeshHitCallback(UPrimitiveComponent* Comp, AActor* OtherActor, UPrimitiveComponent* OtherComp, FVector NormalImpulse, const FHitResult& Hit)\n{\n\tDECLARE_SCOPE_CYCLE_COUNTER(TEXT(\"OnMeshHitCallback\"), STAT_OnMeshHitCallback, STATGROUP_SoEnemy);\n\n\tif (bIgnoreRagdollSelfHit && OtherActor == this && Comp == OtherComp)\n\t\treturn;\n\n\tif (NormalImpulse.SizeSquared() > MinImpulseToSpawnSFX * MinImpulseToSpawnSFX)\n\t{\n\t\tSFXTCount += 1;\n\n\t\tconst float TimeSeconds = GetWorld()->GetTimeSeconds();\n\t\tif (SFXSpamCounter == 0 && !bRagdollFadeOutInProgress && LastSFXSpawnTime + 0.1f <= TimeSeconds)\n\t\t{\n\t\t\tLastSFXSpawnTime = TimeSeconds;\n\t\t\tUSoAudioManager::PlaySoundAtLocation(this, SFXOnBodyHit, FTransform(FVector(Hit.Location)));\n\t\t}\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoEnemy::OnIdleVO_Implementation()\n{\n\tif (SFXIdleVOs.Num() > 0 && bUseIdleVO)\n\t{\n\t\tif (AActor* Player = USoStaticHelper::GetPlayerCharacterAsActor(this))\n\t\t{\n\t\t\tif (!bPaused && bIdleVOOn && (GetActorLocation() - Player->GetActorLocation()).SizeSquared() < MaxIdleDistanceFromPlayer * MaxIdleDistanceFromPlayer)\n\t\t\t\tUSoEnemyVoiceManager::Get(this).PlayEnemyVoice(this, SFXIdleVOs[FMath::RandHelper(SFXIdleVOs.Num())], ESoVoiceType::SoVoiceTypeIdle);\n\t\t}\n\n\t\tGetWorld()->GetTimerManager().SetTimer(\n\t\t\tIdleVOTimer,\n\t\t\tthis,\n\t\t\t&ThisClass::OnIdleVO,\n\t\t\tGetRandRangeIdleVODelay()\n\t\t);\n\t}\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoEnemy::OnSpawnFinished()\n{\n\tGetMesh()->SetCollisionEnabled(ECollisionEnabled::QueryAndPhysics);\n\tActivity = ESoEnemyActivity::EEA_Default;\n\tCurrentAnimData.Type = ESoAnimationType::EAT_Default;\n\tGetCapsuleComponent()->SetCollisionEnabled(ECollisionEnabled::QueryAndPhysics);\n\tSoMovement->SetMovementMode(SoMovement->DefaultLandMovementMode);\n\tSoMovement->SetOppressSetDefaultMovementMode(false);\n\n\tGetMesh()->VisibilityBasedAnimTickOption = DefaultVisibilityBasedAnimTickOption;\n\n\tOnSpawnAnimFinishedBP();\n\n\tUpdateOverlapSetup();\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoEnemy::UpdateHealthBar3D(bool bForceHide)\n{\n\tconst float HealthPercent = SoCharacterSheet->GetHealthPercent();\n\tif (!bForceHide && CanHaveHealthWidget() && IsAlive() && HealthPercent < (1.0f - KINDA_SMALL_NUMBER))\n\t{\n\t\tHealthWidget3D->SetVisibility(true);\n\n\t\tWidgetLastTargetPercent = WidgetCurrentPercent;\n\t\tWidgetPercentUpdateCounter = WidgetPercentUpdateTime;\n\t\tSetHealthBar3DPercent(FMath::Max(SoCharacterSheet->GetHealthPercent(), 0.1f));\n\t\tif (ASoCharacter* SoCharacter = USoStaticHelper::GetPlayerCharacterAsSoCharacter(this))\n\t\t\tSoCharacter->AddToEnemyHPWidgetList(HealthWidget3D);\n\t}\n\telse\n\t{\n\t\tHealthWidget3D->SetVisibility(false);\n\t\tif (ASoCharacter* SoCharacter = USoStaticHelper::GetPlayerCharacterAsSoCharacter(this))\n\t\t\tSoCharacter->RemoveFromEnemyHPWidgetList(HealthWidget3D);\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoEnemy::SetHealthBar3DPercent(float Percent)\n{\n\tif (HealthWidget3D == nullptr || HealthWidget3D->GetUserWidgetObject() == nullptr)\n\t\treturn;\n\n\tif (USizeBox* SizeBox = Cast<USizeBox>(HealthWidget3D->GetUserWidgetObject()->GetRootWidget()))\n\t\tif (UProgressBar* ProgressBar = Cast<UProgressBar>(SizeBox->GetContent()))\n\t\t{\n\t\t\tProgressBar->SetPercent(Percent);\n\t\t\tProgressBar->SetRenderScale(FVector2D(1.0f, 1.0f + (FMath::Max(0.0f, (0.5f - Percent) * 20))));\n\t\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoEnemy::OnHealthBarSettingsChanged()\n{\n\tUpdateHealthBar3D(false);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool ASoEnemy::CanHaveHealthWidget() const\n{\n\tif (!bCanHaveHealthWidget)\n\t\treturn false;\n\n\treturn USoGameSettings::Get().IsDisplayEnemyHealthBarEnabled();\n}\n"
  },
  {
    "path": "Source/SOrb/Enemy/SoEnemy.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#pragma once\n\n#include \"SoEnemyDataTypes.h\"\n#include \"CharacterBase/SoCharacterBase.h\"\n#include \"CharacterBase/SoVoiceUser.h\"\n#include \"SplineLogic/SoSplinePointPtr.h\"\n#include \"Basic/SoEventHandler.h\"\n\n#include \"SoEnemy.generated.h\"\n\nclass ASoEnemySpawner;\nclass UAnimSequenceBase;\nclass USoEAction;\nclass UFMODEvent;\nclass ASoMarker;\nclass USceneComponent;\nclass USoCharacterMovementComponent;\nclass UWidgetComponent;\nclass USoEAWait;\nclass USoEAStunned;\nclass USoCombatComponent;\n\nDECLARE_STATS_GROUP(TEXT(\"SoEnemy\"), STATGROUP_SoEnemy, STATCAT_Advanced);\n\nDECLARE_LOG_CATEGORY_EXTERN(LogSoEnemyAI, Log, All);\n\nDECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FSoEnemyNotify, ASoEnemy*, Enemy);\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n/**\n *  Class for spline based AI characters\n */\nUCLASS()\nclass SORB_API ASoEnemy : public ASoCharacterBase, public ISoEventHandler, public ISoVoiceUser\n{\n\tGENERATED_BODY()\n\npublic:\n\t// Sets default values for this actor's properties\n\tASoEnemy(const FObjectInitializer& ObjectInitializer);\n\n#if WITH_EDITOR\n\tvirtual void PostEditChangeProperty(FPropertyChangedEvent& PropertyChangedEvent) override;\n#endif\n\n\t// AActor\n\tvirtual void OnConstruction(const FTransform& Transform) override;\n\tvirtual void PostInitializeComponents() override;\n\tvirtual void BeginPlay() override;\n\tvirtual void EndPlay(const EEndPlayReason::Type EndPlayReason) override;\n\tvirtual void Tick(float DeltaSeconds) override;\n\n\t// SoCharacterBase\n\tvirtual void OnBlocked() override;\n\tvirtual bool OnPreLanded(const FHitResult& Hit);\n\n\t// SoMortal interface\n\tvirtual void CauseDmg_Implementation(const FSoDmg& Dmg, const FSoHitReactDesc& HitReactDesc) override;\n\tvirtual bool MeleeHit_Implementation(const FSoMeleeHitParam& HitParam) override;\n\tvirtual void Kill_Implementation(bool bPhysical) override;\n\tvirtual bool IsAlive_Implementation() const override;\n\tvirtual bool IsBounceAble_Implementation() const override { return bIsBounceAble; }\n\n\n\t// SoEventHandler interface\n\tvirtual void HandlePlayerRespawn_Implementation() override;\n\tvirtual void HandleSoPostLoad_Implementation() override;\n\tvirtual void HandlePlayerRematerialize_Implementation() override {};\n\tvirtual void HandleWhitelistedSplinesEntered_Implementation() override {};\n\tvirtual void HandleWhitelistedSplinesLeft_Implementation() override {};\n\n\t// SoVoiceUser interface\n\tvirtual USceneComponent* GetComponent_Implementation() const;\n\tvirtual FName GetSocketName_Implementation() const;\n\tvirtual bool ShouldSpawnVO_Implementation(ESoVoiceType VoiceType) const;\n\n\n\tbool IsInAnotherDimension() const { return bIsInAnotherDimension; }\n\n\tUFUNCTION(BlueprintCallable, Category = Init)\n\tvoid ResetSoEnemy();\n\n\t/** Called before reset */\n\tUFUNCTION(BlueprintImplementableEvent, Category = Init)\n\tvoid OnResetSoEnemyBP();\n\n\t/** Called in endplay if the enemy isn't placed in level */\n\tUFUNCTION(BlueprintImplementableEvent, Category = Init)\n\tvoid OnRemoveSoEnemyBP();\n\n\n\tUFUNCTION(BlueprintImplementableEvent, Category = Init)\n\tvoid OnSpawnAnimFinishedBP();\n\n\n\tUFUNCTION(BlueprintCallable)\n\tvoid PauseEnemy();\n\n\tUFUNCTION(BlueprintCallable)\n\tvoid UnpauseEnemy();\n\n\tUFUNCTION(BlueprintImplementableEvent)\n\tvoid OnPauseEnemyBP();\n\n\tUFUNCTION(BlueprintImplementableEvent)\n\tvoid OnUnpauseEnemyBP();\n\n\tUFUNCTION(BlueprintCallable)\n\tvoid FadeOutAndDestroy();\n\n\n\tUFUNCTION(BlueprintImplementableEvent, Category = Init)\n\tvoid OnPostActionListChangeBP(ESoActionList NewList);\n\n\tUFUNCTION(BlueprintImplementableEvent, Category = Init)\n\tvoid OnRangeAttackBlockedBP();\n\n\tvoid ActivateSoEnemy();\n\tvoid DeactivateSoEnemy();\n\n\tUFUNCTION(BlueprintCallable, Category = Init)\n\tvoid SetActivity(ESoEnemyActivity NewActivity) { Activity = NewActivity; }\n\n\t/** called from animation BP to setup the spawn animations properly, it is called really early, even before PreInitializeComponents */\n\tUFUNCTION(BlueprintCallable, Category = Animation)\n\tconst FSoEnemyAnimData& InitializeAnimationState();\n\n\tUFUNCTION(BlueprintCallable, Category = Animation)\n\tstatic void SetCachedSpawnAnim(UAnimSequenceBase* Sequence) { CachedSpawnAnim = Sequence; }\n\n\t// action functions\n\n\t/**\n\t* Changes one of the active actionlists\n\t* The active action isn't modified nor dropped\n\t* @PARAM NewList: the name of the list (key in NamedActionLists)\n\t* @PARAM bPrimary: whether the primary or the secondary list should be changed\n\t*/\n\tvoid ChangeActionList(ESoActionList NewList);\n\n\n\n\t/**\n\t * Called from Strike Action to begin a strike - changes state, initializes combat component\n\t * @PARAM StrikeName: name of the strike (defined in config, key in StrikeMap), has to match with the strike animation\n\t * @Param SecondaryAnimationName: optional, used if the strike uses more than one animations\n\t * @Return whether the strike with given name was found and started or not\n\t */\n\tbool Strike(FName StrikeName);\n\n\tvoid OnStrikePhaseSwitch(const FSoStrikePhase& NewPhase, int32 PhaseIndex);\n\n\t/**\n\t * Called from Strike Action when an action is finished\n\t * Weapon collision is disabled here\n\t * Rootmotion turned off\n\t */\n\tvoid StrikeEnd();\n\n\t/** Called from action when the AI begin to use the range attack */\n\tvoid OnRangeAttackStarted(FName RangeAttackName, float Duration, ESoRangeAttackAnimType AnimType, bool bInterruptible);\n\n\tUFUNCTION(BlueprintImplementableEvent, Category = Combat)\n\tvoid OnRangeAttackStartedBP();\n\n\tFSoERangeAttackProfile* InitializeAndGetRangeAttackProfile(int32 Index, int32 Variant);\n\n\t// dynamic values like location and orientation won't be valid\n\tconst FSoERangeAttackProfile* GetRangeAttackProfile(int32 Index) const;\n\n\tconst struct FSoProjectileInitData* GetRangeAttackInitData(int32 RangeAttackProfileIndex, bool& bSplineBased) const;\n\tbool ShouldRangeAttackPreferLargeArc(int32 Index) const;\n\n\tUFUNCTION(BlueprintNativeEvent, Category = Combat)\n\tvoid PrepareRangeAttackProfile(int32 RangeAttackProfileIndex, int32 Variant);\n\n\tUFUNCTION(BlueprintNativeEvent, Category = Combat)\n\tFVector GetRangeAttackLocation(int32 RangeAttackProfileIndex) const;\n\n\tUFUNCTION(BlueprintNativeEvent, Category = Combat)\n\tFVector GetDefaultDmgNumberLocation() const;\n\n\t/** Range attack finished, AI switches back to default mode */\n\tvoid OnRangeAttackEnded();\n\n\tUFUNCTION(BlueprintCallable, Category = Animations)\n\tvoid SetAnimation(FName SourceAnimName, FName TargetAnimName);\n\n\tUPROPERTY(BlueprintAssignable)\n\tFSoEnemyNotify OnAnimationMapChange;\n\n\t/**\n\t * Called when the enemy blocks an attack\n\t * Block name is saved so the animation can react accordingly\n\t */\n\tvoid Block(FName BlockName, float Duration);\n\tvoid HitReact(FName HitReactName, float Duration);\n\n\tUFUNCTION(BlueprintCallable, Category = Animation)\n\tvoid OverrideAnimation(bool bInterruptible, FName AnimName, float Duration, bool bLoop = false);\n\n\t/**\n\t *  Called when a teleport effect is performed\n\t *  bInitPass decides if the call is executed when the \"wait before teleport\" time is started, or the actual teleport is performed\n\t */\n\tUFUNCTION(BlueprintImplementableEvent, Category = Combat)\n\tvoid OnTeleportBP(bool bInitPass);\n\n\n\t/**\n\t *  @Return pointer to the selected strike or nullptr\n\t *  WARNING: the pointer should not be kept, it may becomes invalid (e.g. ReloadScripts)\n\t */\n\tconst FSoStrike* GetStrike(FName Name) const;\n\n\tUFUNCTION(BlueprintPure, Category = Strike)\n\tconst FSoStrikePhase& GetActiveStrikePhase() const;\n\n\t/**\n\t*  @PARAM bActivate: whether to enable or disable collision\n\t*  @PARAM SlotID: index of the collision primitive, there is two atm\n\t*/\n\tUFUNCTION(BlueprintNativeEvent, Category = Combat)\n\tvoid ActivateWeaponCollision(bool bActivate = true, int32 SlotID = 0);\n\n\n\t/**\n\t*  Returns with the first satisfied action (Evalueate() > 0.0f) from the input array,\n\t*  or nullptr if there is not any\n\t*/\n\tUSoEAction* GetFirstSatisfiedAction(TArray<USoEAction*>& Actions) const;\n\n\t/**\n\t *  Evaluates action from a list, returns with the chosen one\n\t *  It is supposed to bring balance to the force, not leave it in darkness\n\t *  If the chosen one is not found nullptr takes his place\n\t */\n\tUSoEAction* ChooseActionFromList(TArray<USoEAction*>& Actions) const;\n\n\tFSoEActions* GetActionList(ESoActionList List) { return ActionMap.Find(NamedActionLists[List]); }\n\n\tUFUNCTION(BlueprintPure, Category = Actions)\n\tbool HasNamedActionList(ESoActionList List);\n\n\tUFUNCTION(BlueprintNativeEvent, Category = Combat)\n\tvoid OnDeath();\n\n\tUPROPERTY(BlueprintAssignable)\n\tFSoEnemyNotify OnDeathNotify;\n\n\tUFUNCTION(BlueprintCallable, Category = Enemy)\n\tESoEnemyActivity GetActivity() const { return Activity; }\n\n\tUFUNCTION(BlueprintCallable, Category = Enemy)\n\tbool IsAlive() const { return Activity != ESoEnemyActivity::EEA_Dead; }\n\n\tUFUNCTION(BlueprintCallable, Category = Enemy)\n\tvoid SetCanStartNewAction(bool bCanStart) { bCanStartNewAction = bCanStart; }\n\n\tfloat GetLastBlockTime() const { return LastBlockTime; }\n\n\t/** temp junk until ragdol - look kinda cool tho */\n\tUFUNCTION(BlueprintCallable, Category = Movement)\n\tvoid DiedAndLanded();\n\n\t/** Name of actual strike for animation */\n\tUFUNCTION(BlueprintPure, Category = Strike)\n\tFName GetStrikeName() const { return LastStrikeName; }\n\n\tUFUNCTION(BlueprintPure, Category = Strike)\n\tFName GetRangeAttackName() const { return LastRangeAttackName; }\n\n\t/** Name of actual block for animation */\n\tUFUNCTION(BlueprintPure, Category = Strike)\n\tFName GetBlockName() const { return LastBlockName; }\n\n\t/** Name of actual hit react for animation */\n\tUFUNCTION(BlueprintPure, Category = Strike)\n\tFName GetHitReactName() const { return LastHitReactName; }\n\n\tUSoCharacterMovementComponent* GetSoMovement() { return SoMovement; }\n\tUSoCharacterMovementComponent* GetSoMovement() const { return SoMovement; }\n\n\tfloat GetAlertDistance() const { return AlertDistance; }\n\n\tAActor* GetTarget() const;\n\n\t/**\n\t *  @PARAM ValueToChange: the value the function will modify - not all ESoEnemyFloat is modifiable, invalid calls are ignored\n\t *  @PARAM Value: the value used to modify ValueToChange\n\t *  @PARAM bDelta: whether to apply Value as delta or as absolute value (+= vs =)\n\t */\n\tvoid ModifyFloatValue(ESoEnemyFloat ValueToChange, float Value, bool bDelta);\n\n\tfloat GetFloatValue(ESoEnemyFloat Value) const;\n\n\tvoid ReloadScripts();\n\n\t// can be handled in BP for special effects\n\tUFUNCTION(BlueprintImplementableEvent, Category = Combat)\n\tvoid OnCapsuleComponentHitWhileStriking(AActor* OtherActor, UPrimitiveComponent* OtherComp, FVector NormalImpulse, const FHitResult& Hit);\n\n\tUFUNCTION(BlueprintImplementableEvent, Category = Combat)\n\tvoid OnStrikeEnd();\n\n\n\t/** Used by the action system to communicate events to BP */\n\tUFUNCTION(BlueprintImplementableEvent, BlueprintCallable, Category = Combat)\n\tvoid ExecuteBlueprintEventBP(FName EventID);\n\n\tUFUNCTION(BlueprintImplementableEvent, Category = Combat)\n\tvoid ExecuteBlueprintEventIndexedBP(FName EventID, int32 Index);\n\n\tUFUNCTION(BlueprintImplementableEvent, Category = Combat)\n\tbool CheckBlueprintConditionBP(FName ConditionID) const;\n\n\tUFUNCTION(BlueprintPure)\n\tASoMarker* GetTargetMarker(int32 Index) const { return TargetMarkers.IsValidIndex(Index) ? TargetMarkers[Index] : nullptr; }\n\n\tASoEnemySpawner* GetTargetSpawner(int32 Index) const { return TargetSpawners.IsValidIndex(Index) ? TargetSpawners[Index] : nullptr; }\n\n\tUFUNCTION(BlueprintPure)\n\tbool IsPlayerBetweenMarkers(int32 Index0, int32 Index1, bool bResultOnInvalidMarkers = false) const;\n\n\tbool IsBetweenMarkers(int32 Index0, int32 Index1, bool bResultOnInvalidMarkers = false) const;\n\tbool IsFacingMarker(int32 Index0, bool bResultOnInvalidMarkers = false) const;\n\tbool GetSplineLocationFromMarker(int32 Index, FSoSplinePoint& OutSplineLocation) const;\n\n\tFVector GetInitialLocation() const { return InitialTransform.GetLocation(); }\n\tconst FSoSplinePoint& GetInitialSplineLocation() const { return InitialSplinePoint; }\n\n\tFName GetSoGroupName() const { return SoGroupName; }\n\tvoid SetSoGroupName(FName GroupName);\n\n\tASoEnemySpawner* GetSoSpawner() const { return SoSpawner; }\n\tvoid SetSoSpawner(ASoEnemySpawner* Spawner) { SoSpawner = Spawner; }\n\n\tFName GetBoneToTarget() const { return BoneToTarget; }\n\tbool IsAutoAimSupported() const { return bSupportAutoAim; }\n\n\tint32 GetSpawnMaterialAnimationIndex() const { return SpawnMaterialAnimationIndex; }\n\n\t/** Has to be called with false if actor is spawned runtime */\n\tvoid SetPlacedInLevel(bool bPlaced);\n\n\tbool IsPlacedInLevel() const { return bPlacedInLevel; }\n\n\tUFUNCTION(BlueprintCallable, Category = Init)\n\tvoid SetTargetMarkers(const TArray<ASoMarker*>& Markers) { TargetMarkers = Markers; }\n\n\tUFUNCTION(BlueprintCallable, Category = Script)\n\tvoid SetActiveActionList(FName Name);\n\n\tUFUNCTION(BlueprintCallable, Category = Script)\n\tvoid Stun(float DeltaSeconds, ESoStatusEffect StatusEffect = ESoStatusEffect::ESE_Stun, bool bIgnoreRes = false);\n\n\tvoid LookAtPlayer();\n\tvoid LookAtPlayerIgnoreSpline();\n\n\tvoid SetForcedLookAtPlayer(bool bActive) { bForceLookAtPlayer = bActive; }\n\n\tbool CanBeMovedByPlayer() const { return bCanBeMovedByPlayer; }\n\tbool CanBeMovedByLogic() const { return bCanBeMovedByLogic; }\n\n\tbool ShouldKeepZLocationOnSwap() const { return bKeepZLocationOnSwap; }\n\n\tUFUNCTION(BlueprintNativeEvent, Category = Combat)\n\tFVector GetFloorLocation() const;\n\n\tconst TMap<FName, UAnimSequenceBase*>& GetAnimationMap() { return AnimationMap; }\n\n\tvoid SetDynamicName(FName NewValue) { DynamicName = NewValue; }\n\tFName GetDynamicName() const { return DynamicName; }\n\n\tUFUNCTION(BlueprintImplementableEvent, Category = Combat)\n\tvoid OnStunned();\n\n\tUFUNCTION(BlueprintImplementableEvent, Category = Combat)\n\tvoid OnStunOver();\n\n\tvoid SetIdleVOOn(bool bEnable) { bIdleVOOn = bEnable; }\n\n\tUFUNCTION(BlueprintCallable, Category = HitReact)\n\tvoid ChangeHitReactColor()\n\t{\n\t\tbChangedHitReactColor = true;\n\t\tbUpdateHitReactColor = true;\n\t}\n\n\tbool IsSoPaused() const { return bPaused; }\n\n\tfloat GetMinIdleVODelay() const;\n\tfloat GetMaxIdleVODelay() const;\n\tfloat GetRandRangeIdleVODelay() const;\n\tfloat GetRagdollVisibleTime() const;\nprotected:\n\n\tvoid UpdateOverlapSetup();\n\n\tvoid UpdateNamedActionListChange(float DeltaSeconds);\n\n\tvoid SwitchActionListImmediately(ESoActionList NewList, float WaitTime = -1.0f);\n\n\tvoid ChooseNewAction();\n\tvoid ChooseNewAction(FName ListName);\n\n\tUFUNCTION(BlueprintCallable, Category = Script)\n\tvoid Wait(float DeltaSeconds, bool bCanBeInterrupted = true);\n\n\tUFUNCTION(BlueprintCallable, Category = Script)\n\tvoid SwitchToAction(USoEAction* Action);\n\n\tUFUNCTION(BlueprintCallable, Category = Script)\n\tvoid SelectActionFromActions(FName ActionsName, bool bForced = true);\n\n\tUFUNCTION(BlueprintCallable, Category = State)\n\tvoid ForceLeaveHitReactState() { Activity = ESoEnemyActivity::EEA_Default; }\n\n\tUFUNCTION(BlueprintPure, Category = State)\n\tbool IsStunned() const;\n\n\tUFUNCTION(BlueprintCallable, Category = Script)\n\tvoid InterruptAction();\n\n\tUFUNCTION(BlueprintImplementableEvent, Category = Combat)\n\tvoid OnActionInterruptedBP();\n\n\tbool IsCriticalHit(const TSet<FName> AssociatedBones);\n\n\tUFUNCTION(BlueprintCallable, Category = Combat)\n\tFVector GetClosestHitLocationToPoint(const FSoHitReactDesc& HitParam, const FVector& SourceLocation, bool bCritical);\n\n\tUFUNCTION(BlueprintImplementableEvent, Category = Combat)\n\tvoid OnMeleeHitTaken(const FSoMeleeHitParam& HitParam, FVector EstimatedHitLocation, bool bCritical);\n\n\tUFUNCTION(BlueprintImplementableEvent, Category = Combat)\n\tvoid OnDamageTakenBP(bool bStillAlive);\n\n\tUFUNCTION(BlueprintImplementableEvent, Category = SoEnemyState)\n\tvoid OnActivateSoEnemyBP();\n\n\tUFUNCTION(BlueprintImplementableEvent, Category = SoEnemyState)\n\tvoid OnDeactivateSoEnemyBP();\n\n\tUFUNCTION(BlueprintCallable)\n\tvoid FadeOutRagdoll();\n\n\tUFUNCTION()\n\tvoid RagdollFadeFinished();\n\n\tUFUNCTION()\n\tvoid PauseFadeFinished();\n\n\tUFUNCTION()\n\tvoid DestroyFadeFinished();\n\n\tUFUNCTION()\n\tvoid OnMeshHitCallback(UPrimitiveComponent* Comp, AActor* OtherActor, UPrimitiveComponent* OtherComp, FVector NormalImpulse, const FHitResult& Hit);\n\n\n\tUFUNCTION(BlueprintNativeEvent, Category = VO)\n\tvoid OnIdleVO();\n\n\tvoid OnSpawnFinished();\n\n\tUFUNCTION(BlueprintCallable)\n\tvoid UpdateHealthBar3D(bool bFordeHide = false);\n\n\tvoid SetHealthBar3DPercent(float Percent);\n\n\tUFUNCTION()\n\tvoid OnHealthBarSettingsChanged();\n\n\tbool CanHaveHealthWidget() const;\n\npublic:\n\tstatic bool bDisplayMeleeHitTraceLines;\n\n\tstatic const FName FadeStrName;\n\tstatic const FName FadeOutColorParamName;\n\n\tstatic const float PauseFadeSpeed;\n\n\tstatic const FName SwappedTagName;\n\nprotected:\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = \"HealthWidget3D\")\n\tUWidgetComponent* HealthWidget3D;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = \"HealthWidget3D\")\n\tfloat WidgetPercentUpdateTime = 0.6f;\n\n\tfloat WidgetLastTargetPercent = 1.0f;\n\tfloat WidgetCurrentPercent = 1.0f;\n\tfloat WidgetPercentUpdateCounter = -1.0f;\n\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = \"HealthWidget3D\")\n\tUSceneComponent* HealthWidget3DParent;\n\n\tUPROPERTY(EditAnywhere, Category = \"HealthWidget3D\")\n\tbool bCanHaveHealthWidget = true;\n\n\tUPROPERTY(EditAnywhere, Category = \"HealthWidget3D\")\n\tbool bAttachHealthWidgetToMesh = false;\n\n\t////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\t// spawn\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = \"SplineLocation\", Meta = (ExposeOnSpawn = true))\n\tFSoSplinePointPtr SplinePointPtr;\n\n\t/** optional animation, played once on spawn if provided */\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = \"SplineLocation\", Meta = (ExposeOnSpawn = true))\n\tUAnimSequenceBase* SpawnAnimation;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Gameplay, Meta = (ExposeOnSpawn = true))\n\tint32 SpawnMaterialAnimationIndex = -1;\n\n\t////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\t// State variables\n\tUPROPERTY(BlueprintReadWrite)\n\tESoEnemyActivity Activity = ESoEnemyActivity::EEA_Default;\n\n\tUPROPERTY(EditAnywhere)\n\tbool bCanBePaused = true;\n\n\tUPROPERTY(BlueprintReadOnly)\n\tbool bPaused = false;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite)\n\tbool bShouldBePausedIfPlacedInLevel = true;\n\n\tUPROPERTY(VisibleAnywhere)\n\tUSoEAction* ActiveAction = nullptr;\n\n\tUPROPERTY(BlueprintReadOnly)\n\tbool bRagdollFadeOutInProgress = false;\n\n\tbool bTempIgnoreAllDmg = false;\n\n\t/** can be set from BP to prevent the enemy from taking damage */\n\tUPROPERTY(BlueprintReadWrite)\n\tbool bIgnoreDamage = false;\n\nprotected:\n\n\t////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\t// <actions>\n\n\t/** a valid key value in ActionMap, check ChooseNewAction() function - called secondary for legacy reasons */\n\tUPROPERTY(EditAnywhere, Category = \"AI|Actions\")\n\tFName ActiveActionListName;\n\n\tESoActionList ActiveActionList = ESoActionList::EAL_Idle;\n\n\t// only used if > 0.0f\n\tUPROPERTY(EditAnywhere, BlueprintReadOnly, Category = \"AI|Actions\")\n\tfloat SwitchBetweenNamedActionListsInterval = -1.0f;\n\n\tfloat SwitchCounter = 0.0f;\n\n\n\t/** each value has to match a file name (without extension) in SO/AiConfig/ActionLists, used to initialize the ActionMap */\n\tUPROPERTY(EditAnywhere, Category = \"AI|Actions\")\n\tTSet<FName> ActionLists;\n\n\t/** Action sequences the enemy can use */\n\tUPROPERTY(VisibleAnywhere, Category = \"AI|Actions\")\n\tTMap<FName, FSoEActions> ActionMap;\n\n\t/** these action lists don't have to be in the ActionLists set, check ESoActionList for more info */\n\tUPROPERTY(EditAnywhere, BlueprintReadOnly, EditFixedSize, Category = \"AI|Actions\")\n\tTMap<ESoActionList, FName> NamedActionLists;\n\n\tUPROPERTY()\n\tUSoEAWait* DefaultWaitAction;\n\n\tUPROPERTY()\n\tUSoEAStunned* DefaultStunnedAction;\n\n\t/** some react action can be created in BP and set as active action. */\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Instanced, Category = \"AI|Actions\")\n\tTArray<USoEAction*> SpecialActions;\n\n\tUPROPERTY(BlueprintReadWrite)\n\tfloat WaitAfterNextAction = -1.0f;\n\t// </actions>\n\t////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n\t/** time in \"spawn\" phase if a spawn anim is provided, matches the animation length */\n\tfloat SpawnCounter = 0.0f;\n\n\tfloat MaxSpawnCounterValue = 0.0f;\n\n\tUPROPERTY(BlueprintReadOnly)\n\tbool bOverlapDamageBlocked = false;\n\n\n\tUPROPERTY(BlueprintReadOnly)\n\tbool bIgnoreBreakHitReact = false;\n\n\t////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\t// combat related stuff\n\n\tUPROPERTY(EditAnywhere, BlueprintReadOnly, Category = Combat)\n\tUSoCombatComponent* SoCombat;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadOnly, Category = \"AI|Combat\")\n\tTSet<FName> CriticalBones;\n\n\t/** bones used to check the simulated location when spawning water is considered */\n\tUPROPERTY(EditAnywhere, BlueprintReadOnly, Category = \"AI\")\n\tTArray<FName> BonesToSplash;\n\n\t/** this bone and its children are ignored on melee hit */\n\tUPROPERTY(EditAnywhere, BlueprintReadOnly, Category = \"AI|Combat\")\n\tFName BoneToIgnore;\n\n\t/** if set auto target projectiles are supposed to aim at this one instead of the capsule\n\t *  VO is attached to this bone as well\n\t */\n\tUPROPERTY(EditAnywhere, BlueprintReadOnly, Category = \"AI|Combat\")\n\tFName BoneToTarget;\n\n\t/** effects aim at this mesh */\n\tUPROPERTY(EditAnywhere, BlueprintReadOnly, Category = \"AI|Combat\")\n\tFName BoneCenter;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadOnly, Category = \"AI|Combat\")\n\tbool bCheckAllBonesWithBodyIfNoBoneNameIsRecieved = false;\n\n\tTSet<FName> BonesWithBody;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadOnly, Category = \"AI|Combat\")\n\tTArray<UClass*> AttackSourcesToIgnore;\n\n\n\t/** The distance the enemy will attack the player from, can be used in actions */\n\tUPROPERTY(EditAnywhere, BlueprintReadOnly, Category = \"AI|Combat\")\n\tfloat AlertDistance = 600;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadOnly, Category = \"AI|Combat\")\n\tfloat AlertDistanceZ = 1200;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadOnly, Category = \"AI|Combat\")\n\tfloat AlertOffDistance = 3600;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadOnly, Category = \"AI|Combat\")\n\tfloat AlertOffDistanceZ = 3600;\n\n\tUPROPERTY(EditAnywhere, Category = \"AI|Strike\")\n\tFName StrikeMapConfigName;\n\n\t/** Data used to define strike behaviour, used by USoEAStrike, defined in config */\n\tUPROPERTY(VisibleAnywhere, Category = \"AI|Strike\")\n\tTMap<FName, FSoStrike> StrikeMap;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = \"AI|Strike\")\n\tTArray<FSoERangeAttackProfile> RangeAttackProfileList;\n\n\n\t// used for preconditons\n\t// TODO: use dialogue variables instead of this\n\tUPROPERTY(BlueprintReadOnly)\n\tFName LastStrikeName;\n\n\tUPROPERTY(BlueprintReadOnly)\n\tFName DynamicName;\n\n\tFName LastRangeAttackName;\n\tFName LastBlockName;\n\tFName LastHitReactName;\n\n\tUPROPERTY(BlueprintReadOnly)\n\tint32 LastStrikePhaseIndex = 0;\n\n\tUPROPERTY(BlueprintReadOnly)\n\tFSoEnemyAnimData CurrentAnimData;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadOnly)\n\tTMap<FName, UAnimSequenceBase*> AnimationMap;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadOnly, Category = Gameplay)\n\tTArray<ASoMarker*> TargetMarkers;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadOnly, Category = Gameplay)\n\tTArray<ASoEnemySpawner*> TargetSpawners;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadOnly, Category = Gameplay)\n\tFName SoGroupName;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadOnly, Category = Gameplay)\n\tbool bPrintWarningIfGroupIsGoneOnDeath = true;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadOnly, Category = Gameplay)\n\tbool bUseMeshForOverlaps = true;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadOnly, Category = Gameplay)\n\tbool bCanCodeModifyCapsuleCollisionProfile = true;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadOnly, Category = Gameplay)\n\tbool bEnableMeshCollisionInBeginPlay = true;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadOnly, Category = Gameplay)\n\tASoEnemySpawner* SoSpawner = nullptr;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadOnly, Category = Gameplay, Meta = (ExposeOnSpawn = true))\n\tbool bPlacedInLevel = true;\n\n\tUPROPERTY(EditAnywhere, Category = Anim)\n\tEVisibilityBasedAnimTickOption DefaultVisibilityBasedAnimTickOption = EVisibilityBasedAnimTickOption::OnlyTickPoseWhenRendered;\n\n\tUPROPERTY(EditAnywhere, Category = Combat)\n\tbool bCanStartActionInAir = false;\n\n\tUPROPERTY(EditAnywhere, Category = Combat)\n\tbool bAllowCoverTraceCheck = true;\n\n\tUPROPERTY(EditAnywhere, Category = Combat)\n\tbool bCoverTraceCheckWorldDyanmicToo = false;\n\n\tUPROPERTY(EditAnywhere, Category = Combat)\n\tbool bMeshUsedForCoverTraceCheck = true;\n\n\tUPROPERTY(EditAnywhere, Category = Combat)\n\tbool bActivateRagdollOnDeath = true;\n\n\t/** must be used if enemy parts are suppsoed to spawn vfx and sfx e.g. on water surfaces */\n\tUPROPERTY(EditAnywhere, Category = Combat)\n\tbool bRagdollShouldGenerateOverlapEvents = false;\n\n\tUPROPERTY(EditAnywhere, Category = Combat)\n\tfloat RagdollVisibleTime = 10.0f;\n\n\tUPROPERTY(EditAnywhere, Category = Combat)\n\tbool bHideRagdollAfterVisibleTime = false;\n\n\tUPROPERTY(EditAnywhere, Category = Combat)\n\tbool bIgnoreRagdollSelfHit = false;\n\n\tUPROPERTY(EditAnywhere, Category = Combat)\n\tint32 RagdollFadeOutMaterialAnimationIndex = 1;\n\n\tUPROPERTY()\n\tFTimerHandle RagdollFadeOutTimer;\n\n\tUPROPERTY()\n\tFTimerHandle PauseFadeOutTimer;\n\n\tUPROPERTY(EditAnywhere, Category = Combat)\n\tbool bForceLookAtPlayer = false;\n\n\t/** time the enemy has to wait after landing (generates a wait action, but only if the enemy wasn't doing anything already) */\n\tUPROPERTY(EditAnywhere, Category = Combat)\n\tfloat WaitSecAfterLand = 0.0f;\n\n\tUPROPERTY(EditAnywhere, Category = Combat)\n\tint32 RessistanceToInterrupts = 0;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Combat)\n\tbool bHitreactBlock = false;\n\n\tUPROPERTY(EditAnywhere, Category = Combat)\n\tbool bKeepZLocationOnSwap = false;\n\n\tUPROPERTY(EditAnywhere, Category = Combat)\n\tfloat StunResistance = 0.0f;\n\n\tUPROPERTY(EditAnywhere, Category = Combat)\n\tbool bCanBeTurnedIntoBoots = true;\n\n\tUPROPERTY(EditAnywhere, Category = Combat)\n\tbool bIsBounceAble = true;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Combat)\n\tbool bSupportAutoAim = true;\n\n\t/** used to decide if it can be detected via certain spells (Swap) */\n\tUPROPERTY(EditAnywhere, Category = Combat)\n\tbool bCanBeMovedByPlayer = true;\n\n\t/** used to decide if enemy is currently movable by SoEnemyHelper */\n\tUPROPERTY(BlueprintReadWrite, Category = Combat)\n\tbool bCanBeMovedByLogic = false;\n\n\t/** Value between 0 and 1, 0: no block at all, 1: it tries to select a block from the block action list (that can still fail) */\n\tUPROPERTY(EditAnywhere, Category = Combat)\n\tfloat BlockChance = 0.0f;\n\t/** the amount BlockChance is changed per seconds */\n\tUPROPERTY(EditAnywhere, Category = Combat)\n\tfloat BlockChanceDelta = 0.0f;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Combat)\n\tbool bBlockRangedAttacks = false;\n\n\t/** can be disabled from BP when the enemy becomes invisible between teleports */\n\tUPROPERTY(BlueprintReadWrite, Category = Combat)\n\tbool bIsInAnotherDimension = false;\n\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Combat)\n\tFSoHitReactDesc OverlapHitReact;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadOnly, Category = SFX)\n\tUFMODEvent* SFXHitReact = nullptr;\n\n\n\n\tUPROPERTY(EditAnywhere, BlueprintReadOnly, Category = SFX)\n\tfloat VOChanceHitReact = 0.5f;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadOnly, Category = SFX)\n\tfloat VOChanceAttack = 0.5f;\n\n\n\tUPROPERTY(EditAnywhere, BlueprintReadOnly, Category = SFX)\n\tTArray<UFMODEvent*> SFXHitReactVOs;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadOnly, Category = SFX)\n\tTArray<UFMODEvent*> SFXOnDeathVOs;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadOnly, Category = SFX)\n\tTArray<UFMODEvent*> SFXIdleVOs;\n\n\n\tUPROPERTY(EditAnywhere, BlueprintReadOnly, Category = SFX)\n\tfloat MinIdleVODelay = 3.0f;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadOnly, Category = SFX)\n\tfloat MaxIdleVODelay = 10.0f;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadOnly, Category = SFX)\n\tfloat MaxIdleDistanceFromPlayer = 2000.0f;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = SFX)\n\tbool bIdleVOOn = false;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = SFX)\n\tbool bControlIdleVOBasedOnActionList = false;\n\n\tUPROPERTY(EditAnywhere, Category = SFX)\n\tbool bUseIdleVO = false;\n\n\tUPROPERTY()\n\tFTimerHandle IdleVOTimer;\n\n\n\tUPROPERTY(EditAnywhere, BlueprintReadOnly, Category = SFX)\n\tUFMODEvent* SFXOnBodyHit = nullptr;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadOnly, Category = SFX)\n\tfloat MinImpulseToSpawnSFX = 10000.0f;\n\n\tUPROPERTY(BlueprintReadOnly, Category = SFX)\n\tfloat LastSFXSpawnTime;\n\n\tUPROPERTY(EditAnywhere, Category = SFXSpamProtection)\n\tfloat SFXSPPeriod = 0.5f;\n\n\tUPROPERTY(EditAnywhere, Category = SFXSpamProtection)\n\tint32 SFXSPThreshold = 50;\n\n\tUPROPERTY(EditAnywhere, Category = SFXSpamProtection)\n\tint32 SFXSPMaxSpamCountBeforeBan = 2;\n\n\n\tUPROPERTY(BlueprintReadOnly, Category = SFX)\n\tfloat SFXTCounter = 0.5f;\n\n\tUPROPERTY(BlueprintReadOnly, Category = SFX)\n\tint32 SFXTCount;\n\n\tUPROPERTY(BlueprintReadOnly, Category = SFX)\n\tint32 SFXSpamCounter;\n\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = SFX)\n\tFVector RagdollFadeOutColor = FVector(30.0f, 0.0f, 0.0f);\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = SFX)\n\tFVector PauseFadeOutColor = FVector(0.0f, 0.0f, 30.0f);\n\n\n\tUPROPERTY(BlueprintReadOnly, Category = SFX)\n\tbool bChangedHitReactColor = false;\n\n\tUPROPERTY(BlueprintReadWrite, Category = SFX)\n\tbool bUpdateHitReactColor = true;\n\n\tbool bSubscribedToMeshHit = false;\n\n\n\tbool bCanStartNewAction = true;\n\n\t/** time in seconds when the enemy last blocked an attack */\n\tfloat LastBlockTime = 0;\n\t/** time in seconds when the enemy last suffered a melee attack */\n\tfloat LastHitTime = 0;\n\n\t/** last monologue end time */\n\tfloat LastMonologueEndTime = 0;\n\n\tbool bMeleeHitTakeInProgress = false;\n\n\tbool bWasHitThisFrame = false;\n\n\tUPROPERTY(BlueprintReadOnly)\n\tbool bSoMarkedForDestroy = false;\n\n\n\tFTransform InitialTransform;\n\tFSoSplinePoint InitialSplinePoint;\n\n\t/** Relative, stored in BeginPlay(), used to reset mesh (cause of ragdoll) */\n\tFVector InitialMeshLocation;\n\t/** Relative, stored in BeginPlay(), used to reset mesh (cause of ragdoll) */\n\tFRotator InitialMeshRotation;\n\n\n\n\t/**\n\t  *  this is the only way to have it passed from spawner to InitializeAnimationState(), which is called from AnimBP::InitAnim script\n\t  *  it has to be setup before the Spawn node is called and the object is created, because the spawn process starts the animation immediately,\n\t  *  even before the exposed properties are initialized (-> would be first frame glitch otherwise)\n\t  */\n\tstatic UAnimSequenceBase* CachedSpawnAnim;\n\t////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n};\n"
  },
  {
    "path": "Source/SOrb/Enemy/SoEnemyAnimationHelper.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#include \"SoEnemyAnimationHelper.h\"\n\n#include \"Animation/AnimSequenceBase.h\"\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUAnimSequenceBase* USoEnemyAnimationHelper::GetSingleAnimSequence(\n\tconst TMap<FName, UAnimSequenceBase*>& AnimationMap,\n\tconst FSoEnemyAnimData& AnimData,\n\tconst bool bInterruptible,\n\tconst bool bPing,\n\tbool& bLoop,\n\tfloat& PlayRate\n)\n{\n\n\tconst FSoPingPongAnimName& PingPong = bInterruptible ? AnimData.InterruptibleSingle : AnimData.UninterruptibleSingle;\n\n\tUAnimSequenceBase* const* SequencePtr = AnimationMap.Find(PingPong.GetName(bPing));\n\tif (SequencePtr == nullptr || (*SequencePtr) == nullptr)\n\t\treturn nullptr;\n\n\tbLoop = PingPong.IsLooped(bPing);\n\tPlayRate = bLoop ? 1.0f : (*SequencePtr)->SequenceLength / PingPong.GetDuration(bPing);\n\n\treturn *SequencePtr;\n}\n"
  },
  {
    "path": "Source/SOrb/Enemy/SoEnemyAnimationHelper.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#pragma once\n\n#include \"SoEnemyDataTypes.h\"\n#include \"Kismet/BlueprintFunctionLibrary.h\"\n\n#include \"SoEnemyAnimationHelper.generated.h\"\n\nclass UAnimSequenceBase;\n\nUCLASS()\nclass SORB_API USoEnemyAnimationHelper : public UBlueprintFunctionLibrary\n{\n\tGENERATED_BODY()\n\npublic:\n\n\tUFUNCTION(BlueprintPure, Category = EnemyAnimHelper, meta = (BlueprintThreadSafe))\n\tstatic UAnimSequenceBase* GetSingleAnimSequence(\n\t\tconst TMap<FName, UAnimSequenceBase*>& AnimationMap,\n\t\tconst FSoEnemyAnimData& AnimData,\n\t\tconst bool bInterruptible,\n\t\tconst bool bPing,\n\t\tbool& bLoop,\n\t\tfloat& PlayRate\n\t);\n};\n"
  },
  {
    "path": "Source/SOrb/Enemy/SoEnemyDataTypes.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#pragma once\n\n#include \"CharacterBase/SoIMortalTypes.h\"\n#include \"Projectiles/SoProjectileTypes.h\"\n\n#include \"SoEnemyDataTypes.generated.h\"\n\nclass ASoProjectile;\nclass USoEAction;\n\n/** Basic activity of an AI character */\nUENUM(BlueprintType)\nenum class ESoEnemyActivity : uint8\n{\n\t// idle/walking/doing basic stuff/thinking about life\n\tEEA_Default\t\tUMETA(DisplayName = \"Default\"),\n\t// melee attack\n\tEEA_Strike\t\tUMETA(DisplayName = \"Strike\"),\n\t// range attack\n\tEEA_RangeAttack\tUMETA(DisplayName = \"RangeAttack\"),\n\t// taking damage, shouting \"autch\"\n\tEEA_HitReact\tUMETA(DisplayName = \"HitReact\"),\n\t// blocking enemy attack\n\tEEA_Block\t\tUMETA(DisplayName = \"Block\"),\n\t// being blocked by enemy\n\tEEA_Blocked\t\tUMETA(DisplayName = \"Blocked\"),\n\t// guess what\n\tEEA_Dead\t\tUMETA(DisplayName = \"Dead\"),\n\n\tEEA_Spawn\t\tUMETA(DisplayName = \"Disabled\")\n};\n\n\n/**\n * struct used to enable root motion for the given time interval, used by strike\n * if the \"To\" time is greater than the strike length it is not turned off\n */\nUSTRUCT(BlueprintType, Blueprintable)\nstruct FSoRootMotionEntry\n{\n\tGENERATED_USTRUCT_BODY()\npublic:\n\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere)\n\tfloat From = 0.f;\n\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere)\n\tfloat To = 0.f;\n\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere)\n\tFSoRootMotionDesc RootMotion;\n};\n\n\n/**\n*  struct used to enable weapon collision for the given time interval, used by strike\n*  if the \"To\" time is greater than the strike length it is not turned off\n*/\nUSTRUCT(BlueprintType, Blueprintable)\nstruct FSoWeaponCollisionEntry\n{\n\tGENERATED_USTRUCT_BODY()\npublic:\n\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere)\n\tfloat From = 0.f;\n\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere)\n\tfloat To = 0.f;\n\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere)\n\tint32 Slot = 0;\n};\n\n\n/**\n * struct used to enable controlled movement for the given time interval\n */\nUSTRUCT(BlueprintType, Blueprintable)\nstruct FSoControlledMotionEntry\n{\n\tGENERATED_USTRUCT_BODY()\npublic:\n\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere)\n\tfloat From = 0.0f;\n\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere)\n\tfloat To = 1.5f;\n\n\t/** it can only be positive right now TODO: handle negative value if necessary */\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere)\n\tfloat Speed = 0.0f;\n\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere)\n\tbool bStopIfStuck = false;\n\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere)\n\tbool bHorizontal = true;\n};\n\n\nUSTRUCT(BlueprintType, Blueprintable)\nstruct FSoStrikePhase\n{\n\tGENERATED_USTRUCT_BODY()\npublic:\n\t/**\n\t *  length of the strike phase in seconds\n\t *  non-looped animation is played with a speed so that the length matches this\n\t */\n\tUPROPERTY(VisibleAnywhere)\n\tfloat Duration = 0.f;\n\n\t/** Name of the animation to play during this strike phase, the enemy has to have a matching entry in ASoEnemy::StrikeMap */\n\tUPROPERTY(VisibleAnywhere)\n\tFName Animation;\n\n\t/** weather the animation is looped or not (not the phase). Looped phase takes Duration seconds, but the animation isn't aligned to that */\n\tUPROPERTY(VisibleAnywhere)\n\tbool bLooped = false;\n\n\t/**\n\t *  only used if >0 and bLooped is false. Use this to have a shorter/longer animation than the actual phase duration\n\t *  if it is shorter, the last frame of the animation will be displayed. if it is longer the end is skipped\n\t */\n\tUPROPERTY(VisibleAnywhere)\n\tfloat AnimationDuration = -1.0f;\n\n\n\tUPROPERTY(VisibleAnywhere)\n\tTArray<FSoRootMotionEntry> RootMotion;\n\n\tUPROPERTY(VisibleAnywhere)\n\tTArray<FSoControlledMotionEntry> ControlledMotion;\n\n\tUPROPERTY(VisibleAnywhere)\n\tTArray<FSoWeaponCollisionEntry> WeaponCollision;\n\n\tUPROPERTY(BlueprintReadWrite, VisibleAnywhere)\n\tFSoDmg Damage;\n\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere)\n\tFSoPushDesc PushDesc;\n\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere)\n\tbool bBlockable = false;\n\npublic:\n\tstatic FSoStrikePhase Invalid;\n};\n\n\n/**\n *  Everything the AI needs to perform a strike\n *  Strikes are defined in \"SO\\AIConfig\\ActionLists\"\n */\nUSTRUCT(BlueprintType, Blueprintable)\nstruct FSoStrike\n{\n\tGENERATED_USTRUCT_BODY()\npublic:\n\n\tUPROPERTY(VisibleAnywhere)\n\tTArray<FSoStrikePhase> Phases;\n\n\tUPROPERTY(VisibleAnywhere)\n\tbool bLookAtPlayer;\n};\n\n\n/**\n *  WIP\n */\nUSTRUCT(BlueprintType, Blueprintable)\nstruct FSoERangeAttackProfile\n{\n\tGENERATED_USTRUCT_BODY()\npublic:\n\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere)\n\tbool bUseThisInsteadOfComponentDefaults = true;\n\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere)\n\tTSubclassOf<ASoProjectile> ProjectileClass;\n\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere)\n\tbool bUseProjectileInitDataOverride = false;\n\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere)\n\tFSoProjectileInitData InitDataOverride;\n\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere)\n\tbool bPreferLargeArc = false;\n\n\t// Dynamic Data, initialized runtime:\n\n\tUPROPERTY(BlueprintReadWrite)\n\tFVector Location;\n\n\tUPROPERTY(BlueprintReadWrite)\n\tFRotator Orientation;\n};\n\n\n/**\n *  Struct is required because a container has to have a wrapper if it wants to be in another container\n *  tbh I really hate copy-paste comments\n */\nUSTRUCT(BlueprintType, Blueprintable)\nstruct FSoEStrikes\n{\n\tGENERATED_USTRUCT_BODY()\n\npublic:\n\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere)\n\tTMap<FName, FSoStrike> StrikeMap;\n};\n\n\n/**\n *  Struct is required because a container has to have a wrapper if it wants to be in another container\n *  tbh I have no idea if it wants to be there or not, and I don't even care\n *  I want him to be there, that was the point : /\n */\nUSTRUCT(BlueprintType, Blueprintable)\nstruct FSoEActions\n{\n\tGENERATED_USTRUCT_BODY()\n\npublic:\n\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Instanced)\n\tTArray<USoEAction*> Array;\n};\n\n\n/**\n * Named action lists to provide combinations more easily\n * E.g. switch to \"EAL_Idle\" state is possible as an action\n * -> can work with any idle state, action list independent\n * check the usage of ESoEnemy::NamedActionLists\n */\nUENUM(BlueprintType)\nenum class ESoActionList : uint8\n{\n\t// slots to select from config\n\tEAL_Idle\t\tUMETA(DisplayName = \"Idle\"),\n\tEAL_Melee\t\tUMETA(DisplayName = \"Melee\"),\n\tEAL_Ranged\t\tUMETA(DisplayName = \"Ranged\"),\n\n\t// slots used in code directly (with GetFirstSatisfiedAction())\n\tEAL_Block\t\tUMETA(DisplayName = \"Block\"),\n\tEAL_HitReact\tUMETA(DisplayName = \"HitReact\"),\n\tEAL_Blocked\t\tUMETA(DisplayName = \"Blocked\"),\n\n\tEAL_Max\t\t\tUMETA(DisplayName = \"Max\"),\n};\n\n\n/**\n *  Used e.g. to get the name of the last strike/block/hitreact\n */\nUENUM(BlueprintType)\nenum class ESoEnemyIDType : uint8\n{\n\tEEIT_Strike\t\tUMETA(DisplayName = \"Strike\"),\n\tEEIT_Block\t\tUMETA(DisplayName = \"Block\"),\n\tEEIT_HitReact\tUMETA(DisplayName = \"HitReact\")\n};\n\n\nUENUM(BlueprintType)\nenum class ESoRangeAttackAnimType : uint8\n{\n\tERAT_Single\t\t\t\t\tUMETA(DisplayName = \"Single\"),\n\tERAT_SingleLooped\t\t\tUMETA(DisplayName = \"SingleLooped\"),\n\tERAT_SingleTimeScaled\t\tUMETA(DisplayName = \"SingleTimeScaled\"),\n\n\t// duration of both the anim and the range attack is determined by the anim length\n\tERAT_SingleAnimBasedTiming\tUMETA(DisplayName = \"SingleAnimBasedTiming\"),\n\n\tERAT_PrepareAndFinish\t\tUMETA(DisplayName = \"PrepareAndFinish\"),\n\tERAT_PrepareAndLoop\t\t\tUMETA(DisplayName = \"PrepareAndLoop\"),\n\n\tERAT_NoAnim\t\t\t\t\tUMETA(DisplayName = \"NoAnim\"),\n};\n\n\n/**\n *  Named values for script support\n */\nUENUM(BlueprintType)\nenum class ESoEnemyFloat : uint8\n{\n\t// read only outside of SoEnemy\n\tEEF_TimeSinceLastBlock\t\t\tUMETA(DisplayName = \"TimeSinceLastBlock\"),\n\tEEF_TimeSinceLastHitReact\t\tUMETA(DisplayName = \"TimeSinceLastHitReact\"),\n\tEEF_TimeSinceLastMonologueEnd\tUMETA(DisplayName = \"TimeSinceLastMonolougeEnd\"),\n\n\t// can be set directly\n\tEEF_BlockChance\t\t\t\t\tUMETA(DisplayName = \"BlockChance\"),\n\tEEF_BlockChanceDelta\t\t\tUMETA(DisplayName = \"BlockChanceDelta\"),\n};\n\n\nUENUM(BlueprintType)\nenum class ESoAnimationType : uint8\n{\n\t// idle/walk/fall cycle\n\tEAT_Default\t\t\t\t\t\t\tUMETA(DisplayName = \"Default\"),\n\n\tEAT_InterruptibleSingle\t\t\t\tUMETA(DisplayName = \"InterruptibleSingle\"),\n\tEAT_UninterruptibleSingle\t\t\tUMETA(DisplayName = \"UninterruptibleSingle\"),\n\n\tEAT_InterruptibleWithPreparation\tUMETA(DisplayName = \"InterruptibleWithPreparation\"),\n\n\tEAT_Spawn\t\t\t\t\t\t\tUMETA(DisplayName = \"Spawn\")\n};\n\n\nUSTRUCT(BlueprintType, Blueprintable)\nstruct FSoPingPongAnimName\n{\n\tGENERATED_USTRUCT_BODY()\npublic:\n\n\tvoid SetAnimation(FName AnimName, float Duration, bool bLoop = false)\n\t{\n\t\tbPing = !bPing;\n\n\t\tif (bPing)\n\t\t{\n\t\t\tPingAnimName = AnimName;\n\t\t\tPingDuration = Duration;\n\t\t\tbPingLoop = bLoop;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tPongAnimName = AnimName;\n\t\t\tPongDuration = Duration;\n\t\t\tbPongLoop = bLoop;\n\t\t}\n\t}\n\n\tvoid InitAsInterruptibleWithPreparation(FName PreperAnimName, FName MainAnimName, bool bMainLooped, float MainPlayRate)\n\t{\n\t\tbPing = true;\n\t\tPingAnimName = PreperAnimName;\n\t\tPongAnimName = MainAnimName;\n\t\tbPingLoop = false;\n\t\tbPongLoop = bMainLooped;\n\t\tPingDuration = 1.0f;\n\t\tPongDuration = MainPlayRate;\n\t}\n\n\tFORCEINLINE FName GetName(bool bInPing) const { return bInPing ? PingAnimName : PongAnimName; }\n\tFORCEINLINE bool IsLooped(bool bInPing) const { return bInPing ? bPingLoop : bPongLoop; }\n\tFORCEINLINE float GetDuration(bool bInPing) const { return bInPing ? PingDuration : PongDuration; }\n\nprotected:\n\tUPROPERTY(BlueprintReadOnly)\n\tbool bPing = false;\n\n\tUPROPERTY(BlueprintReadOnly)\n\tFName PingAnimName;\n\n\tUPROPERTY(BlueprintReadOnly)\n\tFName PongAnimName;\n\n\tUPROPERTY(BlueprintReadOnly)\n\tfloat PingDuration = 0.f;\n\n\tUPROPERTY(BlueprintReadOnly)\n\tfloat PongDuration = 0.f;\n\n\tUPROPERTY(BlueprintReadOnly)\n\tbool bPingLoop = false;\n\n\tUPROPERTY(BlueprintReadOnly)\n\tbool bPongLoop = false;\n};\n\n\n/**\n *  Information for animation state machines\n */\nUSTRUCT(BlueprintType, Blueprintable)\nstruct FSoEnemyAnimData\n{\n\tGENERATED_USTRUCT_BODY()\npublic:\n\n\tUPROPERTY(BlueprintReadOnly)\n\tESoAnimationType Type = ESoAnimationType::EAT_Default;\n\n\tUPROPERTY(BlueprintReadOnly)\n\tFSoPingPongAnimName UninterruptibleSingle;\n\n\tUPROPERTY(BlueprintReadOnly)\n\tFSoPingPongAnimName InterruptibleSingle;\n\n\tUPROPERTY(BlueprintReadOnly)\n\tFSoPingPongAnimName InterruptibleWithPreparation;\n\n\tUPROPERTY(BlueprintReadOnly)\n\tFName SpawnAnim;\n};\n"
  },
  {
    "path": "Source/SOrb/Enemy/SoEnemyHelper.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#include \"SoEnemyHelper.h\"\n\n#include \"Kismet/GameplayStatics.h\"\n\n#include \"DrawDebugHelpers.h\"\n\n#include \"Basic/Helpers/SoStaticHelper.h\"\n#include \"Basic/SoGameMode.h\"\n#include \"SoEnemy.h\"\n#include \"SplineLogic/SoSplineWalker.h\"\n#include \"SplineLogic/SoSpline.h\"\n#include \"CharacterBase/SoCharacterMovementComponent.h\"\n\nbool USoEnemyHelper::bDrawDebugModeOn = false;\n\nstruct FSoActorCluster\n{\n\tTArray<AActor*> Actors;\n};\n\nstruct FSoActorWith2DPos\n{\n\tAActor* Actor;\n\tFVector2D Pos;\n};\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoEnemyHelper::DisplayDamageText(UObject* WorldContextObject,\n\t\t\t\t\t\t\t\t\t\tconst FSoDmg& Damage,\n\t\t\t\t\t\t\t\t\t\tconst FVector& BaseLocation,\n\t\t\t\t\t\t\t\t\t\tconst FVector ForwardDirRef,\n\t\t\t\t\t\t\t\t\t\tbool bWasHitThisFrame,\n\t\t\t\t\t\t\t\t\t\tbool bCritical,\n\t\t\t\t\t\t\t\t\t\tbool bOnPlayer)\n{\n\tDECLARE_SCOPE_CYCLE_COUNTER(TEXT(\"Helper - DisplayDamageText\"), STAT_Helper_DisplayDamageText, STATGROUP_SoEnemy);\n\n\tif (bOnPlayer)\n\t{\n\t\tfor (int32 i = 0; i < 2; ++i)\n\t\t{\n\t\t\tFVector Offset = FVector(0.0f, 0.0f, 0.0f);\n\n\t\t\tif (Damage.Magical > KINDA_SMALL_NUMBER && Damage.Physical > KINDA_SMALL_NUMBER)\n\t\t\t{\n\t\t\t\tOffset = ForwardDirRef * ((i % 2 == 0) ? 40 : -40);\n\t\t\t\tif (bWasHitThisFrame)\n\t\t\t\t\tOffset.Z += FMath::FRandRange(50.0f, 60.0f);\n\t\t\t}\n\t\t\telse\n\t\t\t\tOffset = FMath::VRand() * 40;\n\n\t\t\tif (Damage[i] > 0.0f)\n\t\t\t\tASoGameMode::Get(WorldContextObject).DisplayDamageText(BaseLocation + Offset, Damage[i], i == 0, bOnPlayer, bCritical);\n\n\t\t\tbWasHitThisFrame = true;\n\t\t}\n\t}\n\telse\n\t{\n\t\tconst FVector Offset = FMath::VRand() * 40;\n\t\tASoGameMode::Get(WorldContextObject).DisplayDamageText(BaseLocation + Offset, Damage.Sum(), true, false, bCritical);\n\t}\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoEnemyHelper::ForceDistanceOnFlyingEnemies(const UObject* WorldContextObject, TSubclassOf<ASoEnemy> Class, float MinDistance, float MaxDelta)\n{\n\tDECLARE_SCOPE_CYCLE_COUNTER(TEXT(\"Helper - ForceDistanceOnFlyingEnemies\"), STAT_Helper_ForceDistanceOnFlyingEnemies, STATGROUP_SoEnemy);\n\n\tTArray<ASoEnemy*> Enemies = ASoGameMode::Get(WorldContextObject).GetEnemies();\n\t// remove irrelevant ones\n\tfor (int32 i = Enemies.Num() - 1; i >= 0; --i)\n\t\tif (!Enemies[i]->CanBeMovedByLogic() || !Enemies[i]->IsAlive())\n\t\t\tEnemies.RemoveAtSwap(i);\n\n\t// gather close to eachother ones in groups:\n\n\tTArray<FSoActorCluster> EnemyClusters;\n\tTMap<AActor*, FSoSplinePoint> PositionMap;\n\tfor (AActor* Enemy : Enemies)\n\t\tPositionMap.Add(Enemy, ISoSplineWalker::Execute_GetSplineLocationI(Enemy));\n\n\t// first pass: check all enemy against all other and create initial \"we are close to each other\" groups\n\tconst float MinDistanceSquered = MinDistance * MinDistance;\n\tfor (int32 i = 0; i < Enemies.Num(); ++i)\n\t\tfor (int32 j = 0; j < Enemies.Num(); ++j)\n\t\t\tif (i != j &&\n\t\t\t\tPositionMap[Enemies[i]].GetDistanceFromSplinePointWithZSquered(PositionMap[Enemies[j]]) < MinDistanceSquered &&\n\t\t\t\tPositionMap[Enemies[i]].GetSpline() == PositionMap[Enemies[j]].GetSpline())\n\t\t\t{\n\t\t\t\tbool bFound = false;\n\t\t\t\tfor (FSoActorCluster& Cluster : EnemyClusters)\n\t\t\t\t\tif (Cluster.Actors.Contains(Enemies[i]) || Cluster.Actors.Contains(Enemies[j]))\n\t\t\t\t\t{\n\t\t\t\t\t\tbFound = true;\n\t\t\t\t\t\tCluster.Actors.AddUnique(Enemies[i]);\n\t\t\t\t\t\tCluster.Actors.AddUnique(Enemies[j]);\n\t\t\t\t\t}\n\n\t\t\t\tif (!bFound)\n\t\t\t\t{\n\t\t\t\t\tTArray<AActor*>& NewCluster = EnemyClusters.Add_GetRef({}).Actors;\n\t\t\t\t\tNewCluster.Add(Enemies[i]);\n\t\t\t\t\tNewCluster.Add(Enemies[j]);\n\t\t\t\t}\n\t\t\t}\n\n\t// 2 merge groups if there is a connection between them\n\tbool bFound = true;\n\twhile (bFound)\n\t{\n\t\tbFound = false;\n\t\tfor (int32 i = 0; !bFound && i < EnemyClusters.Num(); ++i)\n\t\t\tfor (int32 j = i + 1; !bFound && j < EnemyClusters.Num(); ++j)\n\t\t\t\tfor (int x = 0; !bFound && x < EnemyClusters[i].Actors.Num(); ++x)\n\t\t\t\t\tfor (int y = 0; !bFound && y < EnemyClusters[j].Actors.Num(); ++y)\n\t\t\t\t\t\tif (PositionMap[EnemyClusters[i].Actors[x]].GetDistanceFromSplinePointWithZSquered(PositionMap[EnemyClusters[j].Actors[y]]) < MinDistanceSquered &&\n\t\t\t\t\t\t\tPositionMap[EnemyClusters[i].Actors[x]].GetSpline() == PositionMap[EnemyClusters[j].Actors[y]].GetSpline())\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tbFound = true;\n\t\t\t\t\t\t\tfor (int32 k = 0; k < EnemyClusters[j].Actors.Num(); ++k)\n\t\t\t\t\t\t\t\tEnemyClusters[i].Actors.AddUnique(EnemyClusters[j].Actors[k]);\n\t\t\t\t\t\t\tEnemyClusters.RemoveAtSwap(j);\n\t\t\t\t\t\t}\n\t}\n\n\t// move enemies inside clusters:\n\tconst FSoSplinePoint PlayerSplinePoint = USoStaticHelper::GetPlayerSplineLocation(WorldContextObject);\n\tfor (FSoActorCluster& Cluster : EnemyClusters)\n\t{\n\t\t// order them based on angle from player (clockwise/counterclockwise, idk, does not matter)\n\t\tTArray<FSoActorWith2DPos> VectorList;\n\t\tfor (AActor* Actor : Cluster.Actors)\n\t\t\tVectorList.Add({Actor, FVector2D(PlayerSplinePoint - PositionMap[Actor], PlayerSplinePoint.GetReferenceZ() - PositionMap[Actor].GetReferenceZ()).GetSafeNormal()});\n\n\t\tconst FVector2D ReferenceVec = VectorList[0].Pos;\n\t\tVectorList.Sort([&ReferenceVec](const FSoActorWith2DPos& One, const FSoActorWith2DPos& Two)\n\t\t{\n\t\t\treturn FVector2D::CrossProduct(One.Pos, ReferenceVec) > FVector2D::CrossProduct(Two.Pos, ReferenceVec);\n\t\t});\n\n\t\t// some debug helper for the ordering\n\t\tif (bDrawDebugModeOn)\n\t\t\tfor (int32 i = 0; i < VectorList.Num(); ++i)\n\t\t\t{\n\t\t\t\tDrawDebugString(VectorList[0].Actor->GetWorld(), VectorList[i].Actor->GetActorLocation(),\n\t\t\t\t\tFString::FromInt(i) + \" : \" + FString::SanitizeFloat(FVector2D::CrossProduct(VectorList[i].Pos, ReferenceVec)),\n\t\t\t\t\tnullptr,\n\t\t\t\t\tFColor::White,\n\t\t\t\t\t0.1f);\n\n\t\t\t\tDrawDebugLine(VectorList[0].Actor->GetWorld(),\n\t\t\t\t\t\t\t  VectorList[i].Actor->GetActorLocation(),\n\t\t\t\t\t\t\t  USoStaticHelper::GetPlayerCharacterAsActor(WorldContextObject)->GetActorLocation(),\n\t\t\t\t\t\t\t  FColor::Blue, false, 0.1f);\n\t\t\t}\n\n\n\t\tauto GetPosFromSplineLoc = [](const FSoSplinePoint& SplineLoc) -> FVector2D\n\t\t{\n\t\t\treturn FVector2D(SplineLoc.GetDistance(), SplineLoc.GetReferenceZ());\n\t\t};\n\t\tconst FVector2D PlayerPos = GetPosFromSplineLoc(PlayerSplinePoint);\n\t\tauto Push = [&PositionMap, &GetPosFromSplineLoc, &PlayerPos, &MinDistance, &MaxDelta](AActor* ActorToPush, AActor* ActorToPushFrom)\n\t\t{\n\t\t\tconst FSoSplinePoint& SplineLocation = PositionMap[ActorToPush];\n\t\t\tPushActor(ActorToPush,\n\t\t\t\t\t  SplineLocation,\n\t\t\t\t\t  GetPosFromSplineLoc(SplineLocation),\n\t\t\t\t\t  GetPosFromSplineLoc(PositionMap[ActorToPushFrom]),\n\t\t\t\t\t  PlayerPos,\n\t\t\t\t\t  MinDistance,\n\t\t\t\t\t  MaxDelta,\n\t\t\t\t\t  ActorToPushFrom->GetActorLocation());\n\t\t};\n\n\t\tconst int32 Mid = (VectorList.Num() + 1) / 2;\n\t\tif (VectorList.Num() % 2 == 0)\n\t\t{\n\t\t\t// simply push the one who is above the other\n\t\t\tAActor* Actor0 = VectorList[Mid - 1].Actor;\n\t\t\tAActor* Actor1 = VectorList[Mid].Actor;\n\t\t\tconst bool bPushActor0 = Actor0->GetActorLocation().Z > Actor1->GetActorLocation().Z;\n\t\t\tPush(bPushActor0 ? Actor0 : Actor1, bPushActor0 ? Actor1 : Actor0);\n\n\t\t\tfor (int32 i = 2; i <= Mid; ++i)\n\t\t\t{\n\t\t\t\tPush(VectorList[Mid - i].Actor, VectorList[Mid - i + 1].Actor);\n\t\t\t\tPush(VectorList[Mid + i - 1].Actor, VectorList[Mid + i - 2].Actor);\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tfor (int32 i = 1; i < Mid; ++i)\n\t\t\t{\n\t\t\t\tPush(VectorList[Mid - i - 1].Actor, VectorList[Mid - i].Actor);\n\t\t\t\tPush(VectorList[Mid + i - 1].Actor, VectorList[Mid + i - 2].Actor);\n\t\t\t}\n\t\t}\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoEnemyHelper::PushActor(AActor* Actor,\n\t\t\t\t\t\t\t   const FSoSplinePoint& SplineLocation,\n\t\t\t\t\t\t\t   const FVector2D& Pos,\n\t\t\t\t\t\t\t   const FVector2D& OtherActorPos,\n\t\t\t\t\t\t\t   const FVector2D& PlayerPos,\n\t\t\t\t\t\t\t   float DesiredDistance,\n\t\t\t\t\t\t\t   float MaxDelta,\n\t\t\t\t\t\t\t   const FVector& OtherActorLocation)\n{\n\tDECLARE_SCOPE_CYCLE_COUNTER(TEXT(\"Helper - PushActor\"), STAT_Helper_PushActor, STATGROUP_SoEnemy);\n\n\tconst FVector OldPos = Actor->GetActorLocation();\n\n\t// normal of the line we want the actor to push on - it is perpendicular to the normal movement direction (which is towards the player)\n\tFVector2D N = (PlayerPos - Pos).GetSafeNormal();\n\n\t// Nx * X + Ny * Y = Nx * X0 + Ny * Y0, point is Pos\n\t// (X-X1)^2 + (Y-Y1)^2 = r^2, circle is around OtherActorPos\n\n\t//...\n\t// X = Nx*X0...\n\n\t// just a random helper variable\n\tconst float H = Pos.X + (N.Y / N.X) * Pos.Y - OtherActorPos.X;\n\n\t// a*x^2 + bx + c = 0\n\tconst float A = 1 + N.Y * N.Y / (N.X * N.X);\n\tconst float B = -2 * (H * (N.Y / N.X) + OtherActorPos.Y);\n\tconst float C = OtherActorPos.Y * OtherActorPos.Y + H * H - DesiredDistance * DesiredDistance;\n\n\tconst float D = B * B - 4 * A * C;\n\n\t// nothing to do here\n\tif (D <= 0.0f)\n\t\treturn;\n\n\tconst float Ya = (-B + FMath::Sqrt(D)) / (2 * A);\n\tconst float Yb = (-B - FMath::Sqrt(D)) / (2 * A);\n\n\tconst float Xa = Pos.X + (N.Y / N.X) * (Pos.Y - Ya);\n\tconst float Xb = Pos.X + (N.Y / N.X) * (Pos.Y - Yb);\n\n\t// checks:\n\tauto CircleCheck = [&OtherActorPos, &DesiredDistance](float X, float Y)\n\t{\n\t\tconst float CircleCheckSum = (X - OtherActorPos.X) * (X - OtherActorPos.X) + (Y - OtherActorPos.Y) * (Y - OtherActorPos.Y);\n\t\t// verify(FMath::IsNearlyEqual(CircleCheckSum, DesiredDistance * DesiredDistance, 5.0f));\n\t\tconst float Error = fabs(CircleCheckSum - DesiredDistance * DesiredDistance);\n\t\tif (Error < 3.0f)\n\t\t\tUE_LOG(LogTemp, Warning, TEXT(\"Circle error: %f\"), Error);\n\t};\n\n\tauto LineCheck = [&N, &Pos](float X, float Y)\n\t{\n\t\tconst float LineCheckSum0 = N.X * X + N.Y * Y;\n\t\tconst float LineCheckSum1 = N.X * Pos.X + N.Y * Pos.Y;\n\t\t// verify(FMath::IsNearlyEqual(LineCheckSum0, LineCheckSum1, 5.0f));\n\n\t\tconst float Error = fabs(LineCheckSum0 - LineCheckSum1);\n\t\tif (Error < 3.0f)\n\t\t\tUE_LOG(LogTemp, Warning, TEXT(\"Line error: %f\"), Error);\n\t};\n\n\tif (bDrawDebugModeOn)\n\t{\n\t\tCircleCheck(Xa, Ya);\n\t\tCircleCheck(Xb, Yb);\n\n\t\tLineCheck(Xa, Ya);\n\t\tLineCheck(Xb, Yb);\n\t}\n\n\tconst float DistA = (Pos - FVector2D(Xa, Ya)).Size();\n\tconst float DistB = (Pos - FVector2D(Xa, Yb)).Size();\n\n\tconst FVector2D Target = DistA < DistB ? FVector2D(Xa, Ya) : FVector2D(Xb, Yb);\n\n\tconst FVector2D DesiredDelta = (Target - Pos);\n\tconst float DeltaSize = FMath::Min(DesiredDelta.Size(), MaxDelta);\n\tconst FVector2D Delta = DesiredDelta.GetSafeNormal() * DeltaSize;\n\n\tconst FSoSplinePoint NewSplinePoint = SplineLocation + Delta.X * SplineLocation.GetSpline()->GetSplineDirection();\n\tActor->SetActorLocation(NewSplinePoint.GetWorldLocation(NewSplinePoint.GetReferenceZ() + Delta.Y), true);\n\tISoSplineWalker::Execute_SetSplineLocation(Actor, NewSplinePoint, false);\n\n\tif (bDrawDebugModeOn)\n\t{\n\t\t// circle around actor from push\n\t\tDrawDebugCircle(Actor->GetWorld(), OtherActorLocation, DesiredDistance, 32, FColor::Green, false, 0.1f, 0, 0.f, NewSplinePoint.GetDirection());\n\t\t// old pos - character line\n\t\tDrawDebugLine(Actor->GetWorld(), OldPos, USoStaticHelper::GetPlayerCharacterAsActor(Actor)->GetActorLocation(), FColor::Blue, false, 0.1f);\n\t}\n}\n\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nfloat USoEnemyHelper::GetSignedSplineDistanceToClosestEnemy(const ASoEnemy* Source, bool bIgnoreFloatings, bool bOnlySameClass)\n{\n\tDECLARE_SCOPE_CYCLE_COUNTER(TEXT(\"Helper - GetSignedSplineDistanceToClosestEnemy\"), STAT_Helper_GetSignedSplineDistanceToClosestEnemy, STATGROUP_SoEnemy);\n\n\tfloat ClosestDistance = BIG_NUMBER;\n\tconst FSoSplinePoint SourceSplineLocation = ISoSplineWalker::Execute_GetSplineLocationI(Source);\n\tfor (ASoEnemy* Enemy : ASoGameMode::Get(Source).GetEnemiesFromGroup(Source->GetSoGroupName()))\n\t{\n\t\tif (Enemy != Source &&\n\t\t\tEnemy != nullptr &&\n\t\t\t(!bIgnoreFloatings || Enemy->GetSoMovement()->DefaultLandMovementMode != EMovementMode::MOVE_Flying) &&\n\t\t\t(!bOnlySameClass || Enemy->GetClass() == Source->GetClass()))\n\t\t{\n\t\t\tconst float DistanceSigned = SourceSplineLocation - Enemy->GetSoMovement()->GetSplineLocation();\n\t\t\tif (fabs(DistanceSigned) < fabs(ClosestDistance))\n\t\t\t\tClosestDistance = DistanceSigned;\n\t\t}\n\t}\n\n\n\treturn ClosestDistance;\n}\n"
  },
  {
    "path": "Source/SOrb/Enemy/SoEnemyHelper.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#pragma once\n#include \"Kismet/BlueprintFunctionLibrary.h\"\n#include \"CharacterBase/SoIMortalTypes.h\"\n\n#include \"SoEnemyHelper.generated.h\"\n\n\nstruct FSoSplinePoint;\nclass ASoEnemy;\n\n/**\n *\n */\nUCLASS()\nclass SORB_API USoEnemyHelper : public UBlueprintFunctionLibrary\n{\n\tGENERATED_BODY()\n\npublic:\n\n\tUFUNCTION(BlueprintCallable, Category = EnemyHelper, meta = (WorldContext = \"WorldContextObject\"))\n\tstatic void DisplayDamageText(UObject* WorldContextObject,\n\t\t\t\t\t\t\t\t  const FSoDmg& Damage,\n\t\t\t\t\t\t\t\t  const FVector& BaseLocation,\n\t\t\t\t\t\t\t\t  const FVector ForwardDirRef,\n\t\t\t\t\t\t\t\t  bool bWasHitThisFrame,\n\t\t\t\t\t\t\t\t  bool bCritical,\n\t\t\t\t\t\t\t\t  bool bOnPlayer = false);\n\n\tstatic void ForceDistanceOnFlyingEnemies(const UObject* WorldContextObject, TSubclassOf<ASoEnemy> Enemies, float MinDistance, float MaxDelta);\n\n\tstatic float GetSignedSplineDistanceToClosestEnemy(const ASoEnemy* Source, bool bIgnoreFloatings, bool bOnlySameClass);\n\nprivate:\n\tstatic void PushActor(AActor* Actor,\n\t\t\t\t\t\t  const FSoSplinePoint& SplineLocation,\n\t\t\t\t\t\t  const FVector2D& Pos,\n\t\t\t\t\t\t  const FVector2D& OtherActorPos,\n\t\t\t\t\t\t  const FVector2D& PlayerPos,\n\t\t\t\t\t\t  float DesiredDistance,\n\t\t\t\t\t\t  float MaxDelta,\n\t\t\t\t\t\t  const FVector& OtherActorLocation);\n\npublic:\n\n\tstatic bool bDrawDebugModeOn;// = false;\n\n};\n"
  },
  {
    "path": "Source/SOrb/Enemy/SoEnemySpawnHandler.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#include \"SoEnemySpawnHandler.h\"\n\n#include \"SplineLogic/SoSplineHelper.h\"\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// Sets default values\nASoEnemySpawnHandler::ASoEnemySpawnHandler(const FObjectInitializer& ObjectInitializer)\n{\n\tPrimaryActorTick.bCanEverTick = false;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool ASoEnemySpawnHandler::CanSpawn_Implementation() const\n{\n\treturn false;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nASoEnemy* ASoEnemySpawnHandler::SpawnCreature(TSubclassOf<ASoEnemy> Class)\n{\n\tASoEnemy* Enemy = SpawnCreatureBP(Class);\n\tif (Enemy != nullptr)\n\t{\n\t\tEnemy->SetTargetMarkers(MarkerList);\n\n\t\tif (DefaultScriptOverride != NAME_None)\n\t\t\tEnemy->SetActiveActionList(DefaultScriptOverride);\n\n\t\tif (bAllowSpawnMaterialAnimation)\n\t\t{\n\t\t\tconst int32 MatAnimIndex = Enemy->GetSpawnMaterialAnimationIndex();\n\t\t\tif (MatAnimIndex > -1)\n\t\t\t{\n\t\t\t\tEnemy->PlayMaterialAnimation(MatAnimIndex);\n\t\t\t\tEnemy->UpdateMaterialAnimations(0.0f);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn Enemy;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool ASoEnemySpawnHandler::GetPointNearTarget(UPARAM(Ref)FSoSplinePointPtr& PointOnSpline,\n\t\t\t\t\t\t\t\t\t\t\t  const FSoSplinePoint& Min,\n\t\t\t\t\t\t\t\t\t\t\t  const FSoSplinePoint& Max,\n\t\t\t\t\t\t\t\t\t\t\t  const FSoSplinePoint& Target,\n\t\t\t\t\t\t\t\t\t\t\t  float DistanceFromTarget,\n\t\t\t\t\t\t\t\t\t\t\t  bool bMoveActorToPoint,\n\t\t\t\t\t\t\t\t\t\t\t  bool bLookAtTarget,\n\t\t\t\t\t\t\t\t\t\t\t  int32 PreferredDirection)\n{\n\tif (!Min.IsValid(true) || !Max.IsValid(true) || !Target.IsValid(true))\n\t\treturn false;\n\n\tif (!USoSplineHelper::IsSplinepointBetweenPoints(Target, Min, Max))\n\t\treturn false;\n\n\n\tconst FSoSplinePoint First = Target + DistanceFromTarget;\n\tconst FSoSplinePoint Second = Target - DistanceFromTarget;\n\tconst bool bFirstGood = USoSplineHelper::IsSplinepointBetweenPoints(First, Min, Max);\n\tconst bool bSecondGood = USoSplineHelper::IsSplinepointBetweenPoints(Second, Min, Max);\n\n\tif (!bFirstGood && !bSecondGood)\n\t\treturn false;\n\n\tbool bFirstSelected = bFirstGood;\n\tif (bFirstGood == bSecondGood)\n\t\tbFirstSelected = FMath::RandRange(0.0f, 1.0f) < (0.5 + PreferredDirection);\n\n\tconst FSoSplinePoint Selected = bFirstSelected ? First : Second;\n\tPointOnSpline = Selected;\n\n\tif (bMoveActorToPoint)\n\t\tSetActorLocation(Selected.GetWorldLocation(GetActorLocation().Z));\n\n\tif (bLookAtTarget)\n\t\tSetActorRotation(USoSplineHelper::GetSplineLookAtRotation(Selected, Target));\n\n\treturn true;\n}\n"
  },
  {
    "path": "Source/SOrb/Enemy/SoEnemySpawnHandler.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#pragma once\n#include \"GameFramework/Actor.h\"\n#include \"Enemy/SoEnemy.h\"\n#include \"SoEnemySpawnHandler.generated.h\"\n\nUCLASS()\nclass SORB_API ASoEnemySpawnHandler : public AActor\n{\n\tGENERATED_BODY()\n\npublic:\n\t// Sets default values for this actor's properties\n\tASoEnemySpawnHandler(const FObjectInitializer& ObjectInitializer);\n\n\tUFUNCTION(BlueprintNativeEvent, BlueprintCallable, Category = Spawn)\n\tbool CanSpawn() const;\n\n\tUFUNCTION(BlueprintCallable, Category = Spawn)\n\tbool IsEnemyCompatible(TSubclassOf<ASoEnemy>& Class) const { return CompatibleEnemies.Contains(Class); }\n\n\tUFUNCTION(BlueprintCallable, Category = Spawn)\n\tASoEnemy* SpawnCreature(TSubclassOf<ASoEnemy> Class);\n\n\tvoid SetSoGroupName(FName GroupName) { SoGroupName = GroupName; }\n\nprotected:\n\n\tUFUNCTION(BlueprintImplementableEvent, BlueprintCallable, Category = Spawn)\n\tASoEnemy* SpawnCreatureBP(TSubclassOf<ASoEnemy> Class);\n\n\n\tUFUNCTION(BlueprintCallable, Category = Spawn)\n\tbool GetPointNearTarget(UPARAM(Ref)FSoSplinePointPtr& PointOnSpline,\n\t\t\t\t\t\t\tconst FSoSplinePoint& Min,\n\t\t\t\t\t\t\tconst FSoSplinePoint& Max,\n\t\t\t\t\t\t\tconst FSoSplinePoint& Target,\n\t\t\t\t\t\t\tfloat DistanceFromTarget,\n\t\t\t\t\t\t\tbool bMoveActorToPoint,\n\t\t\t\t\t\t\tbool bLookAtTarget,\n\t\t\t\t\t\t\tint32 PreferredDirection = 0);\n\nprotected:\n\n\tUPROPERTY(EditAnywhere, BlueprintReadOnly)\n\tTArray<TSubclassOf<ASoEnemy>> CompatibleEnemies;\n\n\t/** used if the child spawner handler visibility depends on the groups state, the spawners are supposed to set this in editor */\n\tUPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = SpawnedCreatureParam)\n\tFName SoGroupName;\n\n\t/** sets this array as marker list for the spawned creature */\n\tUPROPERTY(EditAnywhere, BlueprintReadOnly, Category = SpawnedCreatureParam)\n\tTArray<ASoMarker*> MarkerList;\n\n\t/** used if not known: creature will get this is default secondary action list if it is valid */\n\tUPROPERTY(EditAnywhere, BlueprintReadOnly, Category = SpawnedCreatureParam)\n\tFName DefaultScriptOverride;\n\n\tUPROPERTY(EditAnywhere)\n\tbool bAllowSpawnMaterialAnimation = true;\n};\n"
  },
  {
    "path": "Source/SOrb/Enemy/SoEnemySpawner.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#include \"SoEnemySpawner.h\"\n\n#include \"TimerManager.h\"\n\n#include \"SoEnemySpawnHandler.h\"\n#include \"SoEnemy.h\"\n#include \"Character/SoCharacter.h\"\n#include \"Basic/Helpers/SoStaticHelper.h\"\n#include \"Basic/SoGameMode.h\"\n#include \"SplineLogic/SoEditorGameInterface.h\"\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nASoEnemySpawner::ASoEnemySpawner(const FObjectInitializer& ObjectInitializer)\n{\n\tPrimaryActorTick.bCanEverTick = false;\n}\n\n#if WITH_EDITOR\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoEnemySpawner::PostEditChangeProperty(FPropertyChangedEvent& PropertyChangedEvent)\n{\n\tconst FName PropertyName = PropertyChangedEvent.Property != nullptr ? PropertyChangedEvent.Property->GetFName() : NAME_None;\n\tif (PropertyName == GET_MEMBER_NAME_CHECKED(ASoEnemySpawner, SoGroupName))\n\t{\n\t\tif (SoGroupName != NAME_None)\n\t\t\tFSoEditorGameInterface::FixEnemyGroupName(SoGroupName);\n\n\t\tFSoEditorGameInterface::BuildEnemyGroupDataConfigFile(GetWorld());\n\t}\n\n\tSuper::PostEditChangeProperty(PropertyChangedEvent);\n}\n#endif\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoEnemySpawner::OnConstruction(const FTransform& Transform)\n{\n\tif (SpawnGroups.Num() != 0)\n\t{\n\t\tSoEnemyToSpawnNum = 0;\n\n\t\tfor (const auto& SpawnGroup : SpawnGroups)\n\t\t\tfor (const auto& Entry : SpawnGroup.Entry)\n\t\t\t\tSoEnemyToSpawnNum += Entry.Count;\n\t}\n\n\tSuper::OnConstruction(Transform);\n\n\tfor (auto* SpawnHandler : SpawnHandlers)\n\t\tif (SpawnHandler != nullptr)\n\t\t\tSpawnHandler->SetSoGroupName(SoGroupName);\n\n\tfor (auto& SpawnGroup : SpawnGroups)\n\t\tfor (auto& Entry : SpawnGroup.Entry)\n\t\t\tif (Entry.SpawnerOverride != nullptr)\n\t\t\t\tEntry.SpawnerOverride->SetSoGroupName(SoGroupName);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoEnemySpawner::BeginPlay()\n{\n\tSuper::BeginPlay();\n\n\tSpawnHandlers.RemoveAll([](const ASoEnemySpawnHandler* Ptr) { return Ptr == nullptr; });\n\tOnReload();\n\n\tASoGameMode::Get(this).OnPostLoad.AddDynamic(this, &ASoEnemySpawner::OnReload);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoEnemySpawner::EndPlay(const EEndPlayReason::Type EndPlayReason)\n{\n\tDeactivateAndReset();\n\tASoGameMode::Get(this).OnPostLoad.RemoveDynamic(this, &ASoEnemySpawner::OnReload);\n\n\tSuper::EndPlay(EndPlayReason);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoEnemySpawner::Trigger_Implementation(const FSoTriggerData& TriggerData)\n{\n\tif (ASoGameMode::Get(this).IsEnemyGroupStillActive(SoGroupName))\n\t\tActivate();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoEnemySpawner::OnSpawnedDied(ASoEnemy* Victim)\n{\n\tSpawnedDiedCounter += 1;\n\n\tSpawnedEnemiesAlive.Remove(Victim);\n\tAllEnemiesAlive.Remove(Victim);\n\tSpawnedEnemiesDeadTemp.Add(Victim);\n\tif (bSpawnNextOnSpawnedDied)\n\t\tSpawn();\n\n\tOnSpawnedDiedBP();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoEnemySpawner::OnNotSpawnedDied(ASoEnemy* Victim)\n{\n\tVictim->OnDeathNotify.RemoveDynamic(this, &ASoEnemySpawner::OnNotSpawnedDied);\n\tNotSpawnedEnemiesWatched.Remove(Victim);\n\tAllEnemiesAlive.Remove(Victim);\n\tif (SpawnedEnemiesAlive.Num() == 0 && NotSpawnedEnemiesWatched.Num() == 0 && !ShouldSpawnMore())\n\t\tFinish();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoEnemySpawner::Spawn()\n{\n\tif (GetWorld() == nullptr)\n\t\treturn;\n\n\tif (!SpawnInternal() && SpawnedEnemiesAlive.Num() == 0 && NotSpawnedEnemiesWatched.Num() == 0)\n\t{\n\t\tFinish();\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoEnemySpawner::Finish()\n{\n\tbFinished = true;\n\tOnFinishedSpawningAll(false);\n\n\tif (Music != nullptr)\n\t\tif (ASoCharacter* SoCharacter = USoStaticHelper::GetPlayerCharacterAsSoCharacter(this))\n\t\t\tSoCharacter->ClearMusicOverrideFromRequester(this);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool ASoEnemySpawner::ShouldSpawnMore_Implementation()\n{\n\treturn ActiveGroup < SpawnGroups.Num();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool ASoEnemySpawner::SpawnInternal_Implementation()\n{\n\tDECLARE_SCOPE_CYCLE_COUNTER(TEXT(\"Spawn - SpawnInternal_Implementation\"), STAT_Spawn_SpawnInternal_Implementation, STATGROUP_SoEnemy);\n\n\tif (ActiveGroup >= SpawnGroups.Num())\n\t\treturn false;\n\n\t// 1. check group - even if it fails we still have enemies to spawn (but we have to wait in this case)\n\tif (MaxSpawnedCreatureNum <= SpawnedEnemiesAlive.Num())\n\t\treturn true;\n\n\tbool bAnyCandidateNotUsed = false;\n\n\tint32 ToSpawnNum = 0;\n\tTArray<int32> Candidates;\n\tTArray<ASoEnemySpawnHandler*> CandidateHandlers;\n\tfor (int32 i = 0; i < SpawnGroups[ActiveGroup].Entry.Num(); ++i)\n\t\tif (SpawnGroups[ActiveGroup].Entry[i].AlreadySpawned < SpawnGroups[ActiveGroup].Entry[i].Count)\n\t\t{\n\t\t\tToSpawnNum += 1;\n\n\t\t\tASoEnemySpawnHandler* SpawnHandlerOverride = SpawnGroups[ActiveGroup].Entry[i].SpawnerOverride;\n\t\t\tif (SpawnHandlerOverride != nullptr &&\n\t\t\t\tSpawnHandlerOverride->IsEnemyCompatible(SpawnGroups[ActiveGroup].Entry[i].Class) &&\n\t\t\t\tSpawnHandlerOverride->CanSpawn())\n\t\t\t{\n\t\t\t\tCandidates.Add(i);\n\t\t\t\tCandidateHandlers.Add(SpawnHandlerOverride);\n\n\t\t\t\tif (HandlersUsedInCurrentSpawnGroup.Find(SpawnHandlerOverride) == INDEX_NONE)\n\t\t\t\t\tbAnyCandidateNotUsed = true;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tfor (ASoEnemySpawnHandler* SpawnHandler : SpawnHandlers)\n\t\t\t\t\tif (SpawnHandler->IsEnemyCompatible(SpawnGroups[ActiveGroup].Entry[i].Class) && SpawnHandler->CanSpawn())\n\t\t\t\t\t{\n\t\t\t\t\t\tCandidates.Add(i);\n\t\t\t\t\t\tCandidateHandlers.Add(SpawnHandler);\n\n\t\t\t\t\t\tif (HandlersUsedInCurrentSpawnGroup.Find(SpawnHandler) == INDEX_NONE)\n\t\t\t\t\t\t\tbAnyCandidateNotUsed = true;\n\t\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t// no more unit in this group\n\tif (ToSpawnNum == 0)\n\t{\n\t\tif (SpawnedEnemiesAlive.Num() == 0)\n\t\t{\n\t\t\t// group is done, time to spawn the next group\n\t\t\tActiveGroup += 1;\n\t\t\tHandlersUsedInCurrentSpawnGroup.Empty();\n\t\t\treturn SpawnInternal();\n\t\t}\n\t\treturn true;\n\t}\n\n\t// there are candidates, but no free spawner -> wait\n\tif (Candidates.Num() == 0)\n\t{\n\t\tUE_LOG(LogSoEnemyAI, Display, TEXT(\"No spawnerhandler could take the job, spawn is delayed!\"));\n\t\tGetWorld()->GetTimerManager().SetTimer(SpawnDelayTimer, this, &ASoEnemySpawner::Spawn, 1.0f);\n\t\treturn true;\n\t}\n\n\tint32 SpawnIndex = FMath::RandHelper(Candidates.Num());\n\tcheck(Candidates.Num() == CandidateHandlers.Num());\n\n\tif (CandidateHandlers.Num() != 1)\n\t{\n\t\tif (LastUsedSpawnHandler == CandidateHandlers[SpawnIndex])\n\t\t\tSpawnIndex = (SpawnIndex + 1) % Candidates.Num();\n\n\t\tif (bAnyCandidateNotUsed)\n\t\t\twhile (HandlersUsedInCurrentSpawnGroup.Find(CandidateHandlers[SpawnIndex]) != INDEX_NONE)\n\t\t\t\tSpawnIndex = (SpawnIndex + 1) % Candidates.Num();\n\t}\n\n\tif (SpawnCreature(CandidateHandlers[SpawnIndex], SpawnGroups[ActiveGroup].Entry[Candidates[SpawnIndex]].Class))\n\t{\n\t\tSpawnGroups[ActiveGroup].Entry[Candidates[SpawnIndex]].AlreadySpawned += 1;\n\t\tLastUsedSpawnHandler = CandidateHandlers[SpawnIndex];\n\t\tHandlersUsedInCurrentSpawnGroup.AddUnique(LastUsedSpawnHandler);\n\t}\n\telse\n\t{\n\t\tUE_LOG(LogSoEnemyAI, Warning, TEXT(\"SpawnHandler failed to spawn a creature! The whole Spawn process is terminated to avoid endless loop!\"));\n\t\treturn false;\n\t}\n\n\tif (SpawnedEnemiesAlive.Num() < MaxSpawnedCreatureNum)\n\t\treturn SpawnInternal();\n\n\t// function will be called again the next time an already spawned creature dies\n\treturn true;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool ASoEnemySpawner::SpawnCreature(ASoEnemySpawnHandler* SpawnHandler, TSubclassOf<ASoEnemy> Class)\n{\n\tDECLARE_SCOPE_CYCLE_COUNTER(TEXT(\"Spawn - SpawnCreature\"), STAT_Spawn_SpawnCreature, STATGROUP_SoEnemy);\n\n\tASoEnemy* SpawnedCreature = SpawnHandler->SpawnCreature(Class);\n\tif (SpawnedCreature != nullptr)\n\t{\n\t\tSpawnedCreature->SetSoSpawner(this);\n\t\tSpawnedCreature->SetSoGroupName(SoGroupName);\n\t\tSpawnedCreature->SetPlacedInLevel(false);\n\t\tSpawnedCreature->OnDeathNotify.AddDynamic(this, &ASoEnemySpawner::OnSpawnedDied);\n\t\tSpawnedEnemiesAlive.Add(SpawnedCreature);\n\t\tAllEnemiesAlive.Add(SpawnedCreature);\n\t\treturn true;\n\t}\n\n\treturn false;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool ASoEnemySpawner::SpawnCreatureFromRandomHandler(TSubclassOf<ASoEnemy> Class)\n{\n\tDECLARE_SCOPE_CYCLE_COUNTER(TEXT(\"Spawn - SpawnCreatureFromRandomHandler\"), STAT_Spawn_SpawnCreatureFromRandomHandler, STATGROUP_SoEnemy);\n\n\tTArray<ASoEnemySpawnHandler*> PossibleSpawnHandlers;\n\n\tfor (ASoEnemySpawnHandler* SpawnHandler : SpawnHandlers)\n\t\tif (SpawnHandler != nullptr && SpawnHandler->IsEnemyCompatible(Class) && SpawnHandler->CanSpawn())\n\t\t\tPossibleSpawnHandlers.Add(SpawnHandler);\n\n\tif (PossibleSpawnHandlers.Num() == 0)\n\t\treturn false;\n\n\treturn SpawnCreature(PossibleSpawnHandlers[FMath::RandRange(0, PossibleSpawnHandlers.Num() - 1)], Class);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoEnemySpawner::DestroySpawnedCreatures(bool bFadeOutAlive)\n{\n\tfor (auto* Enemy : SpawnedEnemiesAlive)\n\t\tif (Enemy != nullptr)\n\t\t{\n\t\t\tif (bFadeOutAlive)\n\t\t\t\tEnemy->FadeOutAndDestroy();\n\t\t\telse\n\t\t\t\tEnemy->Destroy();\n\t\t}\n\n\tfor (auto* Enemy : SpawnedEnemiesDeadTemp)\n\t\tif (Enemy != nullptr)\n\t\t\tEnemy->Destroy();\n\n\tSpawnedEnemiesDeadTemp.Empty();\n\tSpawnedEnemiesAlive.Empty();\n\tAllEnemiesAlive.Empty();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoEnemySpawner::OnPlayerRespawn()\n{\n\tDeactivateAndReset();\n\tOnPlayerRespawnBP();\n\n\tif (bAutoRestartOnPlayerDeath || bAutoActivate)\n\t\tActivate();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoEnemySpawner::Activate()\n{\n\tDECLARE_SCOPE_CYCLE_COUNTER(TEXT(\"Spawn - Activate\"), STAT_Spawn_Activate, STATGROUP_SoEnemy);\n\tif (!bActivated && !bFinished)\n\t{\n\t\tSpawnedDiedCounter = 0;\n\n\t\tif (EnemyGroupDefeatedDelayOverride > KINDA_SMALL_NUMBER)\n\t\t\tASoGameMode::Get(this).OverrideGroupDefeatedDelay(SoGroupName, EnemyGroupDefeatedDelayOverride);\n\n\t\tfor (ASoEnemy* Enemy : NotSpawnedEnemiesAttached)\n\t\t\tif (Enemy->GetActivity() != ESoEnemyActivity::EEA_Dead)\n\t\t\t{\n\t\t\t\tNotSpawnedEnemiesWatched.Add(Enemy);\n\t\t\t\tEnemy->SetSoSpawner(this);\n\t\t\t\tAllEnemiesAlive.Add(Enemy);\n\t\t\t\tEnemy->OnDeathNotify.AddDynamic(this, &ASoEnemySpawner::OnNotSpawnedDied);\n\t\t\t}\n\n\t\tOnActivatedBP();\n\n\t\tbActivated = true;\n\n\t\tASoCharacter* SoCharacter = USoStaticHelper::GetPlayerCharacterAsSoCharacter(this);\n\t\tif (SoCharacter != nullptr)\n\t\t{\n\t\t\tSoCharacter->OnPlayerRespawn.AddDynamic(this, &ASoEnemySpawner::OnPlayerRespawn);\n\t\t\tif (Music != nullptr)\n\t\t\t\tSoCharacter->SetMusicOverride(Music, true, this);\n\t\t}\n\t\tSpawn();\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoEnemySpawner::DeactivateAndCancelKilledOnes()\n{\n\tif (!bActivated || bFinished)\n\t\treturn;\n\n\tASoGameMode::Get(this).IncreaseEnemyCountInGroup(SoGroupName, SpawnedDiedCounter);\n\tDestroySpawnedCreatures(true);\n\tDeactivateAndReset();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoEnemySpawner::DeactivateAndReset()\n{\n\tDECLARE_SCOPE_CYCLE_COUNTER(TEXT(\"Spawn - DeactivateAndReset\"), STAT_Spawn_DeactivateAndReset, STATGROUP_SoEnemy);\n\n\tfor (ASoEnemy* Enemy : NotSpawnedEnemiesWatched)\n\t\tEnemy->OnDeathNotify.RemoveDynamic(this, &ASoEnemySpawner::OnNotSpawnedDied);\n\tNotSpawnedEnemiesWatched.Empty();\n\tAllEnemiesAlive.Empty();\n\n\tif (bActivated)\n\t{\n\t\tif (Music != nullptr)\n\t\t\tif (ASoCharacter* SoCharacter = USoStaticHelper::GetPlayerCharacterAsSoCharacter(this))\n\t\t\t\tSoCharacter->ClearMusicOverrideFromRequester(this);\n\n\t\tGetWorld()->GetTimerManager().ClearTimer(SpawnDelayTimer);\n\t\tDestroySpawnedCreatures();\n\t\tActiveGroup = 0;\n\t\tHandlersUsedInCurrentSpawnGroup.Empty();\n\t\tbActivated = false;\n\n\t\tfor (auto& Group : SpawnGroups)\n\t\t\tfor (int32 i = 0; i < Group.Entry.Num(); ++i)\n\t\t\t\tGroup.Entry[i].AlreadySpawned = 0;\n\n\t\tASoCharacter* SoCharacter = USoStaticHelper::GetPlayerCharacterAsSoCharacter(this);\n\t\tif (SoCharacter != nullptr)\n\t\t\tSoCharacter->OnPlayerRespawn.RemoveDynamic(this, &ASoEnemySpawner::OnPlayerRespawn);\n\t\tDeactivateAndResetBP();\n\t}\n\tbFinished = false;\n\tSpawnedDiedCounter = 0;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoEnemySpawner::OnReload()\n{\n\tDeactivateAndReset();\n\n\tif (ASoGameMode::Get(this).IsEnemyGroupStillActive(SoGroupName))\n\t{\n\t\tif (bAutoActivate)\n\t\t\tActivate();\n\t}\n\telse\n\t{\n\t\tOnFinishedSpawningAll(true);\n\t\tbFinished = false;\n\t}\n}\n"
  },
  {
    "path": "Source/SOrb/Enemy/SoEnemySpawner.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#pragma once\n#include \"Templates/SubclassOf.h\"\n#include \"GameFramework/Actor.h\"\n\n#include \"Logic/SoTriggerable.h\"\n\n#include \"SoEnemySpawner.generated.h\"\n\nclass ASoEnemy;\nclass ASoEnemySpawnHandler;\nclass UFMODEvent;\n\nUSTRUCT(BlueprintType)\nstruct FSoSpawnEntry\n{\n\tGENERATED_USTRUCT_BODY()\n\npublic:\n\n\tUPROPERTY(EditAnywhere, BlueprintReadOnly)\n\tTSubclassOf<ASoEnemy> Class;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadOnly)\n\tint32 Count = 1;\n\n\t/** Tries to use this spawner before anything else, falls back to the rest if it is not set / can't spawn */\n\tUPROPERTY(EditAnywhere, BlueprintReadOnly)\n\tASoEnemySpawnHandler* SpawnerOverride = nullptr;\n\n\tint32 AlreadySpawned = 0;\n};\n\n\nUSTRUCT(BlueprintType)\nstruct FSoSpawnGroup\n{\n\tGENERATED_USTRUCT_BODY()\npublic:\n\tUPROPERTY(EditAnywhere, BlueprintReadOnly)\n\tTArray<FSoSpawnEntry> Entry;\n};\n\n\nUCLASS()\nclass SORB_API ASoEnemySpawner : public AActor, public ISoTriggerable\n{\n\tGENERATED_BODY()\n\npublic:\n\t// Sets default values for this actor's properties\n\tASoEnemySpawner(const FObjectInitializer& ObjectInitializer);\n\n#if WITH_EDITOR\n\tvirtual void PostEditChangeProperty(FPropertyChangedEvent& PropertyChangedEvent) override;\n#endif\n\n\tvirtual void OnConstruction(const FTransform& Transform) override;\n\n\tvirtual void BeginPlay() override;\n\tvirtual void EndPlay(const EEndPlayReason::Type EndPlayReason) override;\n\n\tvoid Trigger_Implementation(const FSoTriggerData& TriggerData) override;\n\n\tUFUNCTION(BlueprintCallable, Category = \"Spawn\")\n\tvoid Spawn();\n\n\tUFUNCTION()\n\tvoid OnSpawnedDied(ASoEnemy* Victim);\n\n\tUFUNCTION()\n\tvoid OnNotSpawnedDied(ASoEnemy* Victim);\n\n\tUFUNCTION(BlueprintCallable, Category = \"Spawn\")\n\tvoid OnPlayerRespawn();\n\n\tFName GetSoGroupName() const { return SoGroupName; }\n\n\t/** returns with the amount of enemy this spawner will spawn */\n\tUFUNCTION(Category = \"Spawn\")\n\tint32 GetEnemyNum() const { return SoEnemyToSpawnNum; }\n\n\tUFUNCTION(BlueprintCallable, Category = \"Spawn\")\n\tvoid Activate();\n\n\n\tUFUNCTION(BlueprintCallable, Category = \"Spawn\")\n\tvoid DeactivateAndCancelKilledOnes();\n\n\tUFUNCTION(BlueprintCallable, Category = \"Spawn\")\n\tvoid DeactivateAndReset();\n\n\tbool IsActiveAndNotDone() const { return bActivated && !bFinished; }\n\n\tconst TArray<ASoEnemy*>& GetActiveEnemies() const { return AllEnemiesAlive; }\n\nprotected:\n\n\tUFUNCTION(BlueprintImplementableEvent, Category = \"Spawn\")\n\tvoid DeactivateAndResetBP();\n\n\tUFUNCTION(BlueprintImplementableEvent, Category = \"Spawn\")\n\tvoid OnActivatedBP();\n\n\tUFUNCTION()\n\tvoid OnReload();\n\n\t/** @Return: false -> spawner finished */\n\tUFUNCTION(BlueprintNativeEvent, Category = \"Spawn\")\n\tbool SpawnInternal();\n\n\tUFUNCTION(BlueprintNativeEvent, Category = \"Spawn\")\n\tbool ShouldSpawnMore();\n\n\tUFUNCTION(BlueprintCallable, Category = \"Spawn\")\n\tvoid Finish();\n\n\tUFUNCTION(BlueprintImplementableEvent, Category = \"Spawn\")\n\tvoid OnFinishedSpawningAll(bool bBecauseReloaded);\n\n\tUFUNCTION(BlueprintImplementableEvent, Category = \"Spawn\")\n\tvoid OnSpawnedDiedBP();\n\n\tUFUNCTION(BlueprintCallable, Category = \"Spawn\")\n\tbool SpawnCreature(ASoEnemySpawnHandler* SpawnHandler, TSubclassOf<ASoEnemy> Class);\n\n\tUFUNCTION(BlueprintCallable, Category = \"Spawn\")\n\tbool SpawnCreatureFromRandomHandler(TSubclassOf<ASoEnemy> Class);\n\n\tUFUNCTION(BlueprintCallable, Category = \"Spawn\")\n\tvoid DestroySpawnedCreatures(bool bFadeOutAlive = false);\n\n\tUFUNCTION(BlueprintImplementableEvent, Category = \"Spawn\")\n\tvoid OnPlayerRespawnBP();\n\nprotected:\n\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = Spawn)\n\tFName SoGroupName;\n\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = Spawn)\n\tfloat EnemyGroupDefeatedDelayOverride = -1.0f;\n\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = Spawn)\n\tTArray<ASoEnemySpawnHandler*> SpawnHandlers;\n\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = Spawn)\n\tTArray<FSoSpawnGroup> SpawnGroups;\n\n\t/** maximum amount of spawned creatures alive at any given time */\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = Spawn)\n\tint32 MaxSpawnedCreatureNum = 3;\n\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = Spawn)\n\tbool bAutoActivate = false;\n\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = Spawn)\n\tbool bAutoRestartOnPlayerDeath = false;\n\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = SFX)\n\tUFMODEvent* Music = nullptr;\n\n\tUPROPERTY(BlueprintReadWrite, Category = Spawn)\n\tint32 SoEnemyToSpawnNum;\n\n\tUPROPERTY(EditAnywhere, Category = Spawn)\n\tbool bSpawnNextOnSpawnedDied = true;\n\n\t/** Enemies placed in the level, combat isn't over until they are alive */\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere)\n\tTArray<ASoEnemy*> NotSpawnedEnemiesAttached;\n\n\tUPROPERTY(BlueprintReadOnly)\n\tTArray<ASoEnemy*> NotSpawnedEnemiesWatched;\n\n\tUPROPERTY(BlueprintReadOnly)\n\tTArray<ASoEnemy*> SpawnedEnemiesAlive;\n\n\t/** SpawnedEnemiesAlive + NotSpawnedEnemiesWatched */\n\tUPROPERTY(BlueprintReadOnly)\n\tTArray<ASoEnemy*> AllEnemiesAlive;\n\n\n\tUPROPERTY()\n\tTArray<ASoEnemy*> SpawnedEnemiesDeadTemp;\n\n\tUPROPERTY(BlueprintReadOnly)\n\tint32 ActiveGroup = 0;\n\n\tUPROPERTY(BlueprintReadOnly)\n\tbool bActivated = false;\n\n\tUPROPERTY(BlueprintReadOnly)\n\tbool bFinished = false;\n\n\tUPROPERTY()\n\tASoEnemySpawnHandler* LastUsedSpawnHandler = nullptr;\n\n\tUPROPERTY()\n\tTArray<ASoEnemySpawnHandler*> HandlersUsedInCurrentSpawnGroup;\n\n\tFTimerHandle SpawnDelayTimer;\n\n\tint32 SpawnedDiedCounter = 0;\n};\n"
  },
  {
    "path": "Source/SOrb/Enemy/SoEnemyVoiceManager.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#include \"SoEnemyVoiceManager.h\"\n\n#include \"Components/SkeletalMeshComponent.h\"\n\n#include \"Basic/SoGameInstance.h\"\n#include \"Basic/SoGameSingleton.h\"\n#include \"CharacterBase/SoVoiceUser.h\"\n#include \"Settings/SoGameSettings.h\"\n#include \"Basic/SoAudioManager.h\"\n\nDEFINE_LOG_CATEGORY_STATIC(LogSoEnemyVoiceManager, All, All)\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUSoEnemyVoiceManager::USoEnemyVoiceManager(const FObjectInitializer& ObjectInitializer) : Super(ObjectInitializer)\n{\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUSoEnemyVoiceManager::~USoEnemyVoiceManager()\n{\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUSoEnemyVoiceManager* USoEnemyVoiceManager::GetInstance(const UObject* WorldContextObject)\n{\n\tif (USoGameInstance* GameInstance = USoGameInstance::GetInstance(WorldContextObject))\n\t\treturn GameInstance->GetEnemyVoiceManager();\n\n\treturn nullptr;\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoEnemyVoiceManager::PlayEnemyVoice(AActor* Enemy, UFMODEvent* EventToPlay, ESoVoiceType Type)\n{\n\tif (Enemy == nullptr || EventToPlay == nullptr)\n\t{\n\t\treturn false;\n\t}\n\n\t// Voice gibberish disabled by settings\n\tif (USoGameSettings::Get().IsVoiceGibberishMuted())\n\t\treturn false;\n\n\tif (!Enemy->GetClass()->ImplementsInterface(USoVoiceUser::StaticClass()))\n\t{\n\t\tUE_LOG(LogSoEnemyVoiceManager, Warning, TEXT(\"Failed to use Voice: class %s does not implement the VoiceUser interface\"), *Enemy->GetClass()->GetName());\n\t\treturn false;\n\t}\n\n\tif (!ISoVoiceUser::Execute_ShouldSpawnVO(Enemy, Type))\n\t\treturn false;\n\n\tif (Type == ESoVoiceType::SoVoiceTypeNoise)\n\t{\n\t\tUSceneComponent* SceneComponent = ISoVoiceUser::Execute_GetComponent(Enemy);\n\t\tconst FName SocketName = ISoVoiceUser::Execute_GetSocketName(Enemy);\n\t\tUSoAudioManager::PlaySoundAttached(\n\t\t\tEventToPlay,\n\t\t\tSceneComponent,\n\t\t\tSocketName,\n\t\t\tFVector::ZeroVector,\n\t\t\tEAttachLocation::SnapToTarget\n\t\t);\n\t\treturn true;\n\t}\n\n\t// do a cleanup to avoid possible nullptr dereferencing\n\tCleanupActiveVoiceList();\n\n\tconst bool bForceOverride = Type == ESoVoiceType::SoVoiceTypeDeath;\n\n\tif (FSoEnemyVoice* VoicePtr = GetActiveVoiceFromEnemy(Enemy))\n\t{\n\t\tif (!bForceOverride || VoicePtr->bForced)\n\t\t\treturn false;\n\n\t\tVoicePtr->Voice->Stop();\n\t\tif (!PlayEnemyVoice_Internal(*VoicePtr, Enemy, EventToPlay, bForceOverride))\n\t\t{\n\t\t\tRemoveVoice(VoicePtr);\n\t\t\treturn false;\n\t\t}\n\n\t\treturn true;\n\t}\n\n\tif (!bForceOverride && GetActiveVoiceFromClass(Enemy) != nullptr)\n\t\treturn false;\n\n\t// if there is a free voice slot\n\tif (FSoEnemyVoice* VoicePtr = GetFreeVoiceSlot(Enemy->GetClass(), bForceOverride))\n\t{\n\t\tif (!PlayEnemyVoice_Internal(*VoicePtr, Enemy, EventToPlay, bForceOverride))\n\t\t{\n\t\t\tRemoveVoice(VoicePtr);\n\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t}\n\n\treturn false;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoEnemyVoiceManager::StopEnemyVoice(AActor* Enemy)\n{\n\tfor (int32 i = 0; i < ActiveVoices.Num(); ++i)\n\t\tif (ActiveVoices[i].Enemy == Enemy)\n\t\t{\n\t\t\tif (ActiveVoices[i].Voice != nullptr)\n\t\t\t\tActiveVoices[i].Voice->Stop();\n\n\t\t\tActiveVoices.RemoveAtSwap(i);\n\t\t\treturn;\n\t\t}\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoEnemyVoiceManager::CleanupActiveVoiceList()\n{\n\t// DestroyComponent() calls the function again cause of FMOD :rolling_eyes:\n\tif (bCleanupWIP)\n\t\treturn;\n\n\tbCleanupWIP = true;\n\n\tfor (int32 i = ActiveVoices.Num() - 1; ActiveVoices.IsValidIndex(i); --i)\n\t\tif (ActiveVoices[i].Enemy == nullptr || ActiveVoices[i].Voice == nullptr || !ActiveVoices[i].Voice->IsActive())\n\t\t{\n\t\t\tif (ActiveVoices[i].Voice != nullptr)\n\t\t\t\tActiveVoices[i].Voice->DestroyComponent();\n\n\t\t\tActiveVoices.RemoveAtSwap(i);\n\t\t}\n\n\tbCleanupWIP = false;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFSoEnemyVoice* USoEnemyVoiceManager::GetActiveVoiceFromEnemy(AActor* Enemy)\n{\n\tfor (FSoEnemyVoice& EnemyVoice : ActiveVoices)\n\t\tif (EnemyVoice.Enemy == Enemy)\n\t\t\treturn &EnemyVoice;\n\n\treturn nullptr;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFSoEnemyVoice* USoEnemyVoiceManager::GetActiveVoiceFromClass(AActor* Enemy)\n{\n\tfor (FSoEnemyVoice& EnemyVoice : ActiveVoices)\n\t\tif (EnemyVoice.Enemy->GetClass() == Enemy->GetClass())\n\t\t\treturn &EnemyVoice;\n\n\treturn nullptr;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFSoEnemyVoice* USoEnemyVoiceManager::GetFreeVoiceSlot(UClass* RequesterClass, bool bIgnoreCheck)\n{\n\t// only 2 different enemy can talk in the same time\n\n\tif (!bIgnoreCheck)\n\t{\n\t\tTSet<UClass*> Classes;\n\t\tClasses.Add(RequesterClass);\n\n\t\tfor (FSoEnemyVoice& EnemyVoice : ActiveVoices)\n\t\t\tif (EnemyVoice.Enemy != nullptr)\n\t\t\t\tClasses.Add(EnemyVoice.Enemy->GetClass());\n\n\t\tif (Classes.Num() > 2)\n\t\t\treturn nullptr;\n\t}\n\n\tActiveVoices.Add({});\n\treturn &ActiveVoices.Last(0);\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoEnemyVoiceManager::PlayEnemyVoice_Internal(FSoEnemyVoice& Voice, AActor* Enemy, UFMODEvent* EventToPlay, bool bForceOverride)\n{\n\tUSceneComponent* SceneComponent = ISoVoiceUser::Execute_GetComponent(Enemy);\n\tconst FName SocketName = ISoVoiceUser::Execute_GetSocketName(Enemy);\n\n\tVoice.Enemy = Enemy;\n\tVoice.bForced = bForceOverride;\n\n\tconst bool bStopWhenAttachedToDestroyed = true;\n\tconst bool bAutoPlay = true;\n\tconst bool bAutoDestroy = false;\n\tVoice.Voice = USoAudioManager::PlaySoundAttached(\n\t\tEventToPlay,\n\t\tSceneComponent,\n\t\tSocketName,\n\t\tFVector::ZeroVector,\n\t\tEAttachLocation::SnapToTarget,\n\t\tbStopWhenAttachedToDestroyed,\n\t\tbAutoPlay,\n\t\tbAutoDestroy\n\t);\n\n\tif (Voice.Voice != nullptr && Voice.Voice->IsPlaying())\n\t{\n\t\tVoice.Voice->OnEventStopped.AddDynamic(this, &USoEnemyVoiceManager::CleanupActiveVoiceList);\n\t\tOnDisplayVoice.Broadcast(SceneComponent->GetSocketLocation(SocketName), USoGameSingleton::GetEnemyVoiceText(EventToPlay));\n\t\treturn true;\n\t}\n\n\treturn false;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoEnemyVoiceManager::RemoveVoice(FSoEnemyVoice* VoicePtr)\n{\n\tfor (int32 i = 0; i < ActiveVoices.Num(); ++i)\n\t\tif (&ActiveVoices[i] == VoicePtr)\n\t\t{\n\t\t\tActiveVoices.RemoveAtSwap(i);\n\t\t\treturn;\n\t\t}\n}\n"
  },
  {
    "path": "Source/SOrb/Enemy/SoEnemyVoiceManager.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#pragma once\n#include \"CoreMinimal.h\"\n#include \"SoEnemyVoiceManager.generated.h\"\n\nDECLARE_DYNAMIC_MULTICAST_DELEGATE_TwoParams(FOnDisplayVoice, const FVector&, WorldPosition, const FText&, DisplayText);\n\nclass AActor;\nclass UFMODAudioComponent;\nclass UFMODEvent;\n\nUSTRUCT()\nstruct FSoEnemyVoice\n{\n\tGENERATED_USTRUCT_BODY()\n\npublic:\n\n\tUPROPERTY()\n\tAActor* Enemy = nullptr;\n\n\tUPROPERTY()\n\tUFMODAudioComponent* Voice = nullptr;\n\n\tUPROPERTY()\n\tbool bForced = false;\n};\n\n\nUCLASS(Blueprintable, BlueprintType)\nclass SORB_API USoEnemyVoiceManager : public UObject\n{\n\tGENERATED_BODY()\n\ttypedef USoEnemyVoiceManager Self;\n\npublic:\n\tUSoEnemyVoiceManager(const FObjectInitializer& ObjectInitializer);\n\t~USoEnemyVoiceManager();\n\n\n\tUFUNCTION(BlueprintPure, DisplayName = \"Get So Enemy Voice Manager\", meta = (WorldContext = \"WorldContextObject\"))\n\tstatic USoEnemyVoiceManager* GetInstance(const UObject* WorldContextObject);\n\tstatic USoEnemyVoiceManager& Get(const UObject* WorldContextObject)\n\t{\n\t\tcheck(IsValid(WorldContextObject));\n\t\tauto* Instance = GetInstance(WorldContextObject);\n\t\tcheck(IsValid(Instance));\n\t\treturn *Instance;\n\t}\n\n\tUFUNCTION(BlueprintCallable, Category = EnemyVO)\n\tbool PlayEnemyVoice(AActor* Enemy, UFMODEvent* EventToPlay, ESoVoiceType Type);\n\n\tUFUNCTION(BlueprintCallable, Category = EnemyVO)\n\tvoid StopEnemyVoice(AActor* Enemy);\n\nprotected:\n\tFSoEnemyVoice* GetActiveVoiceFromEnemy(AActor* Enemy);\n\tFSoEnemyVoice* GetActiveVoiceFromClass(AActor* Enemy);\n\tFSoEnemyVoice* GetFreeVoiceSlot(UClass* RequesterClass, bool bIgnoreCheck = false);\n\n\tbool PlayEnemyVoice_Internal(FSoEnemyVoice& Voice, AActor* Enemy, UFMODEvent* EventToPlay, bool bForceOverride);\n\n\tvoid RemoveVoice(FSoEnemyVoice* VoicePtr);\n\nprotected:\n\tUPROPERTY(BlueprintAssignable)\n\tFOnDisplayVoice OnDisplayVoice;\n\n\tUFUNCTION()\n\tvoid CleanupActiveVoiceList();\n\n\tUPROPERTY()\n\tTArray<FSoEnemyVoice> ActiveVoices;\n\n\tbool bCleanupWIP = false;\n};\n"
  },
  {
    "path": "Source/SOrb/Interactables/SoCarryable.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#include \"SoCarryable.h\"\n\n#include \"Components/CapsuleComponent.h\"\n#include \"Components/BoxComponent.h\"\n// #include \"Components/SkeletalMeshComponent.h\"\n#include \"Components/StaticMeshComponent.h\"\n#include \"Kismet/GameplayStatics.h\"\n#include \"TimerManager.h\"\n#include \"Particles/ParticleSystemComponent.h\"\n\n#include \"Online/Achievements/SoAchievementManager.h\"\n#include \"SplineLogic/SoSplinePoint.h\"\n#include \"Character/SoCharacter.h\"\n#include \"Enemy/SoEnemy.h\"\n#include \"SaveFiles/SoWorldState.h\"\n#include \"Kinematic/Tasks/SoKTask.h\"\n#include \"Basic/SoGameMode.h\"\n#include \"Basic/SoAudioManager.h\"\n#include \"Character/SoCharStates/SoActivity.h\"\n#include \"Basic/Helpers/SoStaticHelper.h\"\n\n#include \"SoLocalization.h\"\n#include \"Basic/Helpers/SoDateTimeHelper.h\"\n\nconst FName ASoCarryable::StaticMeshSpeedName = FName(\"Speed\");\nconst float ASoCarryable::StaticMeshAnimSpeedValue = 2.0f;\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nASoCarryable::ASoCarryable()\n{\n\tPrimaryActorTick.bCanEverTick = true;\n\n\tSetActorTickEnabled(false);\n\tSoBox = CreateDefaultSubobject<UBoxComponent>(TEXT(\"SoBox\"));\n\tSoBox->OnComponentBeginOverlap.AddDynamic(this, &ASoCarryable::OnBoxOverlapBegin);\n\tRootComponent = SoBox;\n\n\t// SkeletalMesh = CreateDefaultSubobject<USkeletalMeshComponent>(TEXT(\"SkeletalMesh\"));\n\t// SkeletalMesh->SetupAttachment(RootComponent);\n\n\tCollision->SetupAttachment(RootComponent);\n\n\tStaticMesh = CreateDefaultSubobject<UStaticMeshComponent>(TEXT(\"StaticMesh\"));\n\tStaticMesh->SetupAttachment(RootComponent);\n\n\tMagicBoxAnimationSFX = CreateDefaultSubobject<UFMODAudioComponent>(TEXT(\"MagicBoxAnimationSFX\"));\n\tMagicBoxAnimationSFX->SetupAttachment(RootComponent);\n\tMagicBoxAnimationSFX->SetupAttachment(RootComponent);\n\n\n\tOnHitParticle = CreateDefaultSubobject<UParticleSystemComponent>(TEXT(\"OnHitParticle\"));\n\tOnHitParticle->SetupAttachment(RootComponent);\n\n\tOnHitParticleSFX = CreateDefaultSubobject<UFMODAudioComponent>(TEXT(\"OnHitParticleSFX\"));\n\tOnHitParticleSFX->SetupAttachment(RootComponent);\n\tOnHitParticleSFX->bAutoActivate = false;\n\n\tSoPlayerBlockArea = CreateDefaultSubobject<UBoxComponent>(TEXT(\"SoPlayerBlockBox\"));\n\tSoPlayerBlockArea->SetupAttachment(RootComponent);\n\n\tDamage.Physical = 20.0f;\n\n\tHitReactDesc.HitReact = ESoHitReactType::EHR_BreakIntoPieces;\n\n\tSoTask = CreateDefaultSubobject<USoKTTranslateOnSpline>(TEXT(\"SoSplineTask\"));\n\tInitTask();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoCarryable::PostInitializeComponents()\n{\n\tSuper::PostInitializeComponents();\n\n\tHitReactDesc.AssociatedActor = SoRematerializePoint;\n\n\tif (!bTransformInitialized)\n\t{\n\t\tbTransformInitialized = true;\n\t\tSavedActorTransform = GetActorTransform();\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoCarryable::BeginPlay()\n{\n\tSuper::BeginPlay();\n\n\tif (SoTask == nullptr)\n\t{\n\t\tSoTask = NewObject<USoKTTranslateOnSpline>(this);\n\t\tInitTask();\n\t}\n\n\tSoTask->Initialize(SoBox, HitReactDesc.AssociatedActor, 2);\n\tUSoEventHandlerHelper::SubscribeToSoPostLoad(this);\n\n\tSoBox->OnComponentHit.AddDynamic(this, &ASoCarryable::OnHitCallback);\n\tSoPlayerBlockArea->SetCollisionEnabled(ECollisionEnabled::NoCollision);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoCarryable::InitTask()\n{\n\tSoTask->bVelocityBased = true;\n\tSoTask->Value = FVector2D(0.0f, 0.0f);\n\tSoTask->CollisionType = ESoTaskCollisionResponse::ETCR_PushOrWait;\n\tSoTask->TimeInSec = 3600 * 24 * 365;\n\tSoTask->CurrentTime = 0.0f;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoCarryable::EndPlay(const EEndPlayReason::Type EndPlayReason)\n{\n\tSoBox->OnComponentHit.RemoveDynamic(this, &ASoCarryable::OnHitCallback);\n\n\tSuper::EndPlay(EndPlayReason);\n\n\tUSoEventHandlerHelper::UnsubscribeFromSoPostLoad(this);\n\n\tGetWorld()->GetTimerManager().ClearTimer(PlayerBlockTimer);\n\n\tif (PlacedTime > KINDA_SMALL_NUMBER)\n\t\tHandleSoPostLoad_Implementation();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoCarryable::Tick(float DeltaSeconds)\n{\n\tconst FVector OldLocation = GetActorLocation();\n\tSoTask->Value = SoTask->Value + ForceFieldVelocity.GetSafeNormal() * Acceleration * DeltaSeconds;\n\n\tif (SoTask->Value.Size() > ForceFieldVelocity.Size())\n\t\tSoTask->Value = ForceFieldVelocity;\n\n\tSoTask->Execute(DeltaSeconds, true);\n\n\t// can leave forcefield in execute\n\tif (bInForceField)\n\t\tVelocity = (GetActorLocation() - OldLocation) / DeltaSeconds;\n\n\tSetActorRotation(SoTask->SplineLocation.GetDirection().Rotation());\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoCarryable::Interact_Implementation(ASoCharacter* Character)\n{\n\tStopMovement();\n\tif (ActiveState == ESoCarryableState::ECS_Idle || ActiveState == ESoCarryableState::ECS_WaitForSignal)\n\t\tCarryStarted();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoCarryable::Trigger_Implementation(const FSoTriggerData& TriggerData)\n{\n\tif (ActiveState == ESoCarryableState::ECS_WaitForSignal)\n\t{\n\t\tActiveState = ESoCarryableState::ECS_Idle;\n\t\tOnGoHomeStart();\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoCarryable::HandleSoPostLoad_Implementation()\n{\n\tSoBox->DetachFromComponent(FDetachmentTransformRules::KeepWorldTransform);\n\tActiveState = ESoCarryableState::ECS_Idle;\n\tSwitchToSolid();\n\tSetActorTransform(SavedActorTransform);\n\n\tGetWorld()->GetTimerManager().ClearTimer(GoHomeStartTimer);\n\tGetWorld()->GetTimerManager().ClearTimer(GoHomeEndTimer);\n\tGetWorld()->GetTimerManager().ClearTimer(DroppedAndHitProtectedTimer);\n\tGetWorld()->GetTimerManager().ClearTimer(PlayerBlockTimer);\n\tSoPlayerBlockArea->SetCollisionEnabled(ECollisionEnabled::NoCollision);\n\n\tOnReturned.Broadcast();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoCarryable::OnBoxOverlapBegin(UPrimitiveComponent* OverlappedComponent,\n\t\t\t\t\t\t\t\t\tAActor* OtherActor,\n\t\t\t\t\t\t\t\t\tUPrimitiveComponent* OtherComp,\n\t\t\t\t\t\t\t\t\tint32 OtherBodyIndex,\n\t\t\t\t\t\t\t\t\tbool bFromSweep,\n\t\t\t\t\t\t\t\t\tconst FHitResult& SweepResult)\n{\n\tif (OverlappedComponent == Collision)\n\t{\n\t\tASoInteractableActor::OnOverlapBegin(OverlappedComponent, OtherActor, OtherComp, OtherBodyIndex, bFromSweep, SweepResult);\n\t\treturn;\n\t}\n\n\tASoCharacter* Character = USoStaticHelper::GetPlayerCharacterAsSoCharacter(this);\n\tif (OtherActor != Character && ActiveState == ESoCarryableState::ECS_DropInProgress && OtherComp->GetCollisionResponseToChannel(ECollisionChannel::ECC_Pawn) == ECollisionResponse::ECR_Block)\n\t{\n\t\tCharacter->SoActivity->OnAnimEvent(EAnimEvents::EAE_OnReleaseCarriedStuffInterrupted);\n\t\tSoBox->SetCollisionEnabled(ECollisionEnabled::NoCollision);\n\t}\n\n\tif (Cast<ASoEnemy>(OtherActor) != nullptr && (ActiveState == ESoCarryableState::ECS_Idle || ActiveState == ESoCarryableState::ECS_WaitForSignal))\n\t\tOnGoHomeStart();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoCarryable::OnHitCallback(UPrimitiveComponent* Comp, AActor* OtherActor, UPrimitiveComponent* OtherComp, FVector NormalImpulse, const FHitResult& Hit)\n{\n\tif (ActiveState == ESoCarryableState::ECS_WaitForSignal &&\n\t\t((Behavior == ESoCarryableBehavior::ECB_ReturnAfterCharacterHit && Cast<ASoCharacter>(OtherActor) != nullptr)\n\t\t|| Cast<ASoEnemy>(OtherActor) != nullptr) &&\n\t\t// Threshold\n\t\tGetWorld()->GetTimeSeconds() > DroppedTime + GetReturnProtectionTime())\n\t{\n\t\tActiveState = ESoCarryableState::ECS_Idle;\n\t\tOnHitParticle->Activate(true);\n\t\tOnHitParticleSFX->Activate(true);\n\t\tOnGoHomeStart();\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoCarryable::SwitchToSolid()\n{\n\tSoBox->SetCollisionProfileName(FName(\"BlockAllDynamic\"));\n\tSoBox->SetCollisionEnabled(ECollisionEnabled::QueryAndPhysics);\n\t// SkeletalMesh->SetPlayRate(1.0f);\n\tStaticMesh->SetScalarParameterValueOnMaterials(StaticMeshSpeedName, StaticMeshAnimSpeedValue);\n\tMagicBoxAnimationSFX->Play();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoCarryable::SwitchToOverlap()\n{\n\tSoBox->SetCollisionProfileName(FName(\"OverlapAllDynamic\"));\n\tSoBox->SetCollisionEnabled(ECollisionEnabled::QueryOnly);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoCarryable::StopMovement()\n{\n\tSetActorTickEnabled(false);\n\tVelocity = FVector(0.0f, 0.0f, 0.0f);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoCarryable::OnGoHomeStart()\n{\n\tStopMovement();\n\n\tif (ActiveState != ESoCarryableState::ECS_PickedUp)\n\t{\n\t\tASoInteractableActor::Deactivate();\n\t\tSoBox->SetCollisionEnabled(ECollisionEnabled::NoCollision);\n\t\tif (SoPlayerBlockArea != nullptr)\n\t\t\tSoPlayerBlockArea->SetCollisionEnabled(ECollisionEnabled::NoCollision);\n\t\tMagicBoxAnimationSFX->Stop();\n\n\t\t// SkeletalMesh->SetVisibility(false);\n\t\t// SkeletalMesh->SetPlayRate(1.0f);\n\n\t\tStaticMesh->SetVisibility(false);\n\t\tStaticMesh->SetScalarParameterValueOnMaterials(StaticMeshSpeedName, StaticMeshAnimSpeedValue);\n\n\n\t\tASoCharacter* Character = USoStaticHelper::GetPlayerCharacterAsSoCharacter(this);\n\t\tif (Character != nullptr)\n\t\t\tCharacter->SetBase(nullptr);\n\n\t\tUGameplayStatics::SpawnEmitterAtLocation(GetWorld(), ReturnVFX, GetActorLocation(), GetActorRotation(), true, EPSCPoolMethod::AutoRelease);\n\n\t\tGetWorld()->GetTimerManager().SetTimer(\n\t\t\tGoHomeEndTimer,\n\t\t\tthis,\n\t\t\t&ThisClass::OnGoHomeEnd,\n\t\t\tGetReturnTime()\n\t\t);\n\t\tUSoAudioManager::PlaySoundAtLocation(this, SFXOnGoHomeStart, GetActorTransform());\n\n\t\t// move home here to avoid weird collision issue?!\n\t\tif (Behavior != ESoCarryableBehavior::ECB_ReturnAfterCharacterHit)\n\t\t\tSetActorTransform(SavedActorTransform);\n\n\t\tOnReturnStart.Broadcast();\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoCarryable::OnGoHomeEnd()\n{\n\tStopMovement();\n\n\tSetActorTransform(SavedActorTransform);\n\n\tASoInteractableActor::Activate();\n\tSwitchToOverlap();\n\t// SkeletalMesh->SetVisibility(true);\n\tStaticMesh->SetVisibility(true);\n\tMagicBoxAnimationSFX->Play();\n\n\tSoBox->UpdateOverlaps();\n\tTArray<AActor*> OverlappingActors;\n\tSoBox->GetOverlappingActors(OverlappingActors, ASoCharacterBase::StaticClass());\n\n\tfor (AActor* Actor : OverlappingActors)\n\t{\n\t\tISoMortal::Execute_CauseDmg(Actor, Damage, HitReactDesc);\n\t\tif (Actor == USoStaticHelper::GetPlayerCharacterAsActor(this))\n\t\t{\n\t\t\tstatic const FName SuicideACName = FName(\"A_SuicideSQuad\");\n\t\t\tUSoAchievementManager::Get(this).UnlockAchievement(this, SuicideACName);\n\t\t}\n\t}\n\n\tSwitchToSolid();\n\tUSoAudioManager::PlaySoundAtLocation(this, SFXOnGoHomeEnd, GetActorTransform());\n\n\tOnReturned.Broadcast();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoCarryable::CarryStarted()\n{\n\tDisplayText = FROM_STRING_TABLE_INTERACTION(\"drop\");\n\tASoCharacter* Character = USoStaticHelper::GetPlayerCharacterAsSoCharacter(this);\n\n\tSoBox->SetCollisionEnabled(ECollisionEnabled::NoCollision);\n\tSoBox->SetWorldRotation(ISoSplineWalker::Execute_GetSplineLocationI(Character).GetDirection().Rotation());\n\tActiveState = ESoCarryableState::ECS_PickedUp;\n\n\tCharacter->StartCarryStuff(this);\n\t// SkeletalMesh->SetPlayRate(0.0f);\n\tStaticMesh->SetScalarParameterValueOnMaterials(StaticMeshSpeedName, 0.0f);\n\tMagicBoxAnimationSFX->Stop();\n\n\tOnTaken.Broadcast();\n\n\tUSoEventHandlerHelper::SubscribeToPlayerRematerialize(this);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoCarryable::Dropped(bool bActivatePlayerBlock)\n{\n\tUSoEventHandlerHelper::UnsubscribeFromPlayerRematerialize(this);\n\n\tDisplayText = FROM_STRING_TABLE_INTERACTION(\"pick_up\");\n\n\tSoBox->DetachFromComponent(FDetachmentTransformRules::KeepWorldTransform);\n\n\tif (bActivatePlayerBlock)\n\t{\n\t\tSoPlayerBlockArea->SetCollisionEnabled(ECollisionEnabled::QueryAndPhysics);\n\t\tGetWorld()->GetTimerManager().SetTimer(PlayerBlockTimer, this, &ASoCarryable::OnCharBlockTimeOver, 0.4);\n\t}\n\n\n\t//TArray<AActor*> OverlappedActors;\n\t//SoBox->GetOverlappingActors(OverlappedActors);\n\t//for (AActor* Actor : OverlappedActors)\n\t//\tif (Cast<ASoEnemy>(Actor))\n\t//\t{\n\t//\t\tOnGoHomeStart();\n\t//\t\treturn;\n\t//\t}\n\n\tSwitchToSolid();\n\tif (Behavior == ESoCarryableBehavior::ECB_ReturnAfterTime)\n\t{\n\t\tif (PlacedTime > KINDA_SMALL_NUMBER)\n\t\t{\n\t\t\tGetWorld()->GetTimerManager().SetTimer(GoHomeStartTimer, this, &ASoCarryable::OnGoHomeStart, PlacedTime);\n\t\t\tActiveState = ESoCarryableState::ECS_Idle;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tOnGoHomeStart();\n\t\t\treturn;\n\t\t}\n\t}\n\telse\n\t\tActiveState = ESoCarryableState::ECS_WaitForSignal;\n\n\tOnPlaced.Broadcast();\n\n\tASoCharacter* Character = USoStaticHelper::GetPlayerCharacterAsSoCharacter(this);\n\tFSoSplinePoint SplineLocation = ISoSplineWalker::Execute_GetSplineLocationI(Character);\n\tSetActorRotation(SplineLocation.GetDirection().Rotation());\n\n\tif (bInForceField && Behavior != ESoCarryableBehavior::ECB_IgnoreForceField)\n\t{\n\t\tSoTask->Value = ForceFieldVelocity.GetSafeNormal() * 100.0f;\n\t\tSetActorTickEnabled(true);\n\n\t\tconst FVector Delta = GetActorLocation() - Character->GetActorLocation();\n\t\tSplineLocation += Delta.Size2D() * SplineLocation.GetDirectionModifierFromVector(Delta);\n\t\tSplineLocation.SetReferenceActor(this);\n\t\tSoTask->Start(SoBox, true, SplineLocation);\n\t}\n\n\tDroppedTime = GetWorld()->GetTimeSeconds();\n\n\tif (Behavior == ESoCarryableBehavior::ECB_ReturnAfterCharacterHit)\n\t\tGetWorld()->GetTimerManager().SetTimer(\n\t\t\tDroppedAndHitProtectedTimer,\n\t\t\tthis,\n\t\t\t&ThisClass::OnCharHitProtectionTimeOver,\n\t\t\tGetReturnProtectionTime()\n\t\t);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoCarryable::OnCharHitProtectionTimeOver()\n{\n\tif (ActiveState == ESoCarryableState::ECS_WaitForSignal)\n\t{\n\t\tASoCharacter* Character = USoStaticHelper::GetPlayerCharacterAsSoCharacter(this);\n\t\tif (Character->GetMovementBaseActor(Character) == this)\n\t\t{\n\t\t\tCharacter->SetBase(nullptr);\n\t\t\tActiveState = ESoCarryableState::ECS_Idle;\n\t\t\tOnGoHomeStart();\n\t\t}\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoCarryable::OnCharBlockTimeOver()\n{\n\tif (SoPlayerBlockArea != nullptr)\n\t\tSoPlayerBlockArea->SetCollisionEnabled(ECollisionEnabled::NoCollision);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nfloat ASoCarryable::GetReturnProtectionTime() const\n{\n\treturn ReturnProtectionTime;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoCarryable::CancelDrop()\n{\n\tif (ActiveState == ESoCarryableState::ECS_DropInProgress)\n\t{\n\t\tActiveState = ESoCarryableState::ECS_PickedUp;\n\t\tSoBox->SetCollisionEnabled(ECollisionEnabled::NoCollision);\n\t\tASoCharacter* Character = USoStaticHelper::GetPlayerCharacterAsSoCharacter(this);\n\t\tSoBox->SetWorldRotation(ISoSplineWalker::Execute_GetSplineLocationI(Character).GetDirection().Rotation());\n\t\tActiveState = ESoCarryableState::ECS_PickedUp;\n\t}\n}\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nfloat ASoCarryable::GetReturnTime() const\n{\n\treturn USoDateTimeHelper::NormalizeTime(ReturnTime);\n}\n"
  },
  {
    "path": "Source/SOrb/Interactables/SoCarryable.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#pragma once\n\n#include \"SoInteractableActor.h\"\n#include \"Logic/SoTriggerable.h\"\n#include \"Basic/SoEventHandler.h\"\n#include \"CharacterBase/SoIMortalTypes.h\"\n#include \"SoCarryable.generated.h\"\n\nclass UStaticMeshComponent;\nclass UFMODAudioComponent;\nclass UParticleSystemComponent;\nclass UParticleSystem;\nclass USoKTTranslateOnSpline;\nclass UFMODEvent;\n\nDECLARE_DYNAMIC_MULTICAST_DELEGATE(FSoCarryableNotify);\n\nUENUM(BlueprintType)\nenum class ESoCarryableState : uint8\n{\n\tECS_Idle\t\t\tUMETA(DisplayName = \"Idle\"),\n\tECS_PickedUp\t\tUMETA(DisplayName = \"PickedUp\"),\n\tECS_DropInProgress\tUMETA(DisplayName = \"DropInProgress\"),\n\tECS_WaitForSignal\tUMETA(DisplayName = \"WaitForSignal\"),\n\n\tECS_MAX\t\t\t\tUMETA(DisplayName = \"Max\"),\n};\n\nUENUM(BlueprintType)\nenum class ESoCarryableBehavior : uint8\n{\n\tECB_Default\t\t\t\t\t\t\t\tUMETA(DisplayName = \"Default\"),\n\tECB_IgnoreForceField\t\t\t\t\tUMETA(DisplayName = \"IgnoreForceField\"),\n\tECB_ReturnAfterCharacterHit\t\t\t\tUMETA(DisplayName = \"ReturnAfterCharacterHit\"),\n\tECB_ReturnAfterTime\t\t\t\t\t\tUMETA(DisplayName = \"ReturnAfterTime\"),\n\n\tECB_MAX\t\t\t\t\t\t\t\t\tUMETA(DisplayName = \"Max\"),\n};\n\n\n\nUCLASS()\nclass SORB_API ASoCarryable : public ASoInteractableActor, public ISoTriggerable, public ISoEventHandler\n{\n\tGENERATED_BODY()\n\npublic:\n\t// Sets default values for this actor's properties\n\tASoCarryable();\n\n\tvirtual void PostInitializeComponents() override;\n\n\tvirtual void BeginPlay() override;\n\tvirtual void EndPlay(const EEndPlayReason::Type EndPlayReason) override;\n\n\tvirtual void Tick(float DeltaSeconds) override;\n\n\tvirtual FVector GetVelocity() const override { return Velocity; }\n\n\n\tvirtual void Interact_Implementation(ASoCharacter* Character) override;\n\tvirtual bool IsExclusive_Implementation() const override { return ActiveState == ESoCarryableState::ECS_PickedUp; }\n\n\tvirtual void Trigger_Implementation(const FSoTriggerData& TriggerData) override;\n\n\tvirtual void HandleSoPostLoad_Implementation() override;\n\tvirtual void HandlePlayerRespawn_Implementation() override {};\n\tvirtual void HandlePlayerRematerialize_Implementation() override {};\n\tvirtual void HandleWhitelistedSplinesEntered_Implementation() override {};\n\tvirtual void HandleWhitelistedSplinesLeft_Implementation() override {};\n\n\tvoid Dropped(bool bActivatePlayerBlock);\n\tvoid CancelDrop();\n\n\tUFUNCTION(BlueprintCallable)\n\tvoid ForceReturn()\n\t{\n\t\tDropped(false);\n\t\tOnGoHomeStart();\n\t}\n\n\tvoid ForceDrop()\n\t{\n\t\tOnPlayerDiedWithBox();\n\t\tDropped(false);\n\t}\n\n\tUFUNCTION(BlueprintPure, Category = \">Time\")\n\tfloat GetReturnTime() const;\n\nprotected:\n\n\tvoid InitTask();\n\n\n\tUFUNCTION()\n\tvoid OnBoxOverlapBegin(UPrimitiveComponent* OverlappedComponent,\n\t\t\t\t\t\t   AActor* OtherActor,\n\t\t\t\t\t\t   UPrimitiveComponent* OtherComp,\n\t\t\t\t\t\t   int32 OtherBodyIndex,\n\t\t\t\t\t\t   bool bFromSweep,\n\t\t\t\t\t\t   const FHitResult & SweepResult);\n\n\tUFUNCTION()\n\tvoid OnHitCallback(UPrimitiveComponent* Comp, AActor* OtherActor, UPrimitiveComponent* OtherComp, FVector NormalImpulse, const FHitResult& Hit);\n\n\tUFUNCTION(BlueprintImplementableEvent)\n\tvoid OnPlayerDiedWithBox();\n\n\tvoid SwitchToSolid();\n\tvoid SwitchToOverlap();\n\n\tUFUNCTION(BlueprintCallable, Category = Movement)\n\tvoid StopMovement();\n\n\tvoid OnGoHomeStart();\n\n\tvoid OnGoHomeEnd();\n\n\tvoid CarryStarted();\n\n\n\tvoid OnCharHitProtectionTimeOver();\n\n\tvoid OnCharBlockTimeOver();\n\n\tfloat GetReturnProtectionTime() const;\n\n\nprotected:\n\n\tUPROPERTY(BlueprintAssignable, Category = Notify)\n\tFSoCarryableNotify OnTaken;\n\n\tUPROPERTY(BlueprintAssignable, Category = Notify)\n\tFSoCarryableNotify OnPlaced;\n\n\tUPROPERTY(BlueprintAssignable, Category = Notify)\n\tFSoCarryableNotify OnReturnStart;\n\n\tUPROPERTY(BlueprintAssignable, Category = Notify)\n\tFSoCarryableNotify OnReturned;\n\nprotected:\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite)\n\tUBoxComponent* SoBox;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite)\n\tUBoxComponent* SoPlayerBlockArea;\n\n\n\t// UPROPERTY(EditAnywhere, BlueprintReadWrite)\n\t// USkeletalMeshComponent* SkeletalMesh;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite)\n\tUStaticMeshComponent* StaticMesh;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite)\n\tUFMODAudioComponent* MagicBoxAnimationSFX;\n\n\n\t/** used for red box on character hit */\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite)\n\tUParticleSystemComponent* OnHitParticle;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite)\n\tUFMODAudioComponent* OnHitParticleSFX;\n\n\t/** used for non-red box for return vfx */\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite)\n\tUParticleSystem* ReturnVFX;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite)\n\tAActor* SoRematerializePoint;\n\n\tESoCarryableState ActiveState = ESoCarryableState::ECS_Idle;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Behavior)\n\tESoCarryableBehavior Behavior;\n\n\t/** time the box spends after it is gone before it respawns in starting location */\n\tUPROPERTY(EditAnywhere, Category = Behavior)\n\tfloat ReturnTime = 1.0f;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Behavior)\n\tfloat Acceleration = 1000;\n\n\t/** time the box returns to default state if used with ECB_ReturnAfterTime behavior */\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Behavior)\n\tfloat PlacedTime = 5.0f;\n\n\t/** time the box is protected from character hit after placed with ECB_ReturnAfterCharacterHit */\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Behavior)\n\tfloat ReturnProtectionTime = 0.7f;\n\n\tUPROPERTY(BlueprintReadWrite)\n\tbool bInForceField = false;\n\n\tUPROPERTY(BlueprintReadWrite)\n\tFVector2D ForceFieldVelocity = FVector2D(1000.0f, 0.0f);\n\n\tUPROPERTY(VisibleAnywhere, BlueprintReadWrite, Instanced)\n\tUSoKTTranslateOnSpline* SoTask;\n\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite)\n\tFSoDmg Damage;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite)\n\tFSoHitReactDesc HitReactDesc;\n\n\tFTimerHandle GoHomeStartTimer;\n\tFTimerHandle GoHomeEndTimer;\n\n\tFTimerHandle PlayerBlockTimer;\n\n\tUPROPERTY(EditAnywhere, Category = SFX)\n\tUFMODEvent* SFXOnGoHomeStart;\n\n\tUPROPERTY(EditAnywhere, Category = SFX)\n\tUFMODEvent* SFXOnGoHomeEnd;\n\n\tFVector Velocity = FVector(0.0f, 0.0f, 0.0f);\n\n\tFTransform SavedActorTransform;\n\tbool bTransformInitialized = false;\n\n\tfloat DroppedTime;\n\tFTimerHandle DroppedAndHitProtectedTimer;\n\n\n\tstatic const FName StaticMeshSpeedName;\n\tstatic const float StaticMeshAnimSpeedValue;\n};\n"
  },
  {
    "path": "Source/SOrb/Interactables/SoInteractable.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#include \"SoInteractable.h\"\n\n\nUSoInteractable::USoInteractable(const FObjectInitializer& PCIP)\n\t: Super(PCIP)\n{\n\n}\n"
  },
  {
    "path": "Source/SOrb/Interactables/SoInteractable.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#pragma once\n#include \"UObject/Interface.h\"\n\n#include \"Settings/Input/SoInputNames.h\"\n\n#include \"SoInteractable.generated.h\"\n\nclass ASoCharacter;\n\n\nUSTRUCT(BlueprintType)\nstruct FSoInteractableMessage\n{\n\tGENERATED_USTRUCT_BODY()\n\npublic:\n\t// The input action name UI, optional, only displayed if this is valid\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite)\n\tESoInputActionNameType ActionNameType = ESoInputActionNameType::IANT_None;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite)\n\tFText DisplayText;\n};\n\n\nUINTERFACE()\nclass SORB_API USoInteractable : public UInterface\n{\n\tGENERATED_UINTERFACE_BODY()\n};\n\n\nclass SORB_API ISoInteractable\n{\n\tGENERATED_IINTERFACE_BODY()\n\n\tUFUNCTION(BlueprintNativeEvent, BlueprintCallable, Category = Interaction)\n\tvoid Interact(ASoCharacter* Character);\n\n\tUFUNCTION(BlueprintNativeEvent, BlueprintCallable, Category = Interaction)\n\tFText GetInteractionText() const;\n\n\tUFUNCTION(BlueprintNativeEvent, BlueprintCallable, Category = Interaction)\n\tFSoInteractableMessage GetInteractionMessage() const;\n\n\t/** All other interactable is ignored until the player is in the area of this one. The first exclusive is the active one */\n\tUFUNCTION(BlueprintNativeEvent, BlueprintCallable, Category = Interaction)\n\tbool IsExclusive() const;\n\n\t/** Weather first or second key is used (if it is still free) */\n\tUFUNCTION(BlueprintNativeEvent, BlueprintCallable, Category = Interaction)\n\tbool IsSecondKeyPrefered() const;\n\n\n\tUFUNCTION(BlueprintNativeEvent, BlueprintCallable, Category = Interaction)\n\tbool CanBeInteractedWithFromAir() const;\n};\n"
  },
  {
    "path": "Source/SOrb/Interactables/SoInteractableActor.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#include \"SoInteractableActor.h\"\n\n#include \"Components/CapsuleComponent.h\"\n#include \"Components/BoxComponent.h\"\n\n#include \"Character/SoCharacter.h\"\n#include \"SaveFiles/SoWorldState.h\"\n#include \"Basic/SoGameMode.h\"\n#include \"SaveFiles/SoWorldStateBlueprint.h\"\n#include \"Basic/Helpers/SoStaticHelper.h\"\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// Sets default values\nASoInteractableActor::ASoInteractableActor()\n{\n\tPrimaryActorTick.bCanEverTick = false;\n\n\tCollision = CreateDefaultSubobject<UBoxComponent>(TEXT(\"Collision\"));\n\tCollision->SetCollisionEnabled(ECollisionEnabled::QueryOnly);\n\n\tRootComponent = Collision;\n\n\tCollision->SetGenerateOverlapEvents(true);\n\tbActive = true;\n\tbActiveByDefault = true;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoInteractableActor::OnConstruction(const FTransform& Transform)\n{\n\tSuper::OnConstruction(Transform);\n\tbActiveByDefault = bActive;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoInteractableActor::BeginPlay()\n{\n\tSuper::BeginPlay();\n\tCollision->OnComponentBeginOverlap.AddUniqueDynamic(this, &ASoInteractableActor::OnOverlapBegin);\n\tCollision->OnComponentEndOverlap.AddUniqueDynamic(this, &ASoInteractableActor::OnOverlapEnd);\n\n\tif (!bActive)\n\t\tCollision->SetCollisionEnabled(ECollisionEnabled::NoCollision);\n\n\tif (bSerializeState)\n\t{\n\t\t// Never change it to use the interface because that is used by child BPs!!!\n\t\tASoGameMode::Get(this).OnPostLoad.AddDynamic(this, &ASoInteractableActor::OnReload);\n\t\tOnReload();\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoInteractableActor::EndPlay(const EEndPlayReason::Type EndPlayReason)\n{\n\tSuper::EndPlay(EndPlayReason);\n\tif (bSerializeState)\n\t\tASoGameMode::Get(this).OnPostLoad.RemoveDynamic(this, &ASoInteractableActor::OnReload);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoInteractableActor::OnReload_Implementation()\n{\n\tif (bSerializeState)\n\t{\n\t\tconst bool bChanged = USoWorldState::IsActorNameInSet(this);\n\n\t\tif (bChanged == bActiveByDefault)\n\t\t\tDeactivate();\n\t\telse\n\t\t\tActivate();\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool ASoInteractableActor::ShouldBeRegistredAsInteractable_Implementation()\n{\n\treturn true;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoInteractableActor::OnOverlapBegin(UPrimitiveComponent* OverlappedComponent, AActor* OtherActor, UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult & SweepResult)\n{\n\tif (!bActive)\n\t\treturn;\n\n\tif (Cast<UCapsuleComponent>(OtherComp) == nullptr)\n\t\treturn;\n\n\tif (!ShouldBeRegistredAsInteractable())\n\t\treturn;\n\n\tASoCharacter* pChar = Cast<ASoCharacter>(OtherActor);\n\tif (pChar)\n\t{\n\t\tPlayersInArea.AddUnique(pChar);\n\t\tpChar->AddInteractable(this);\n\t\tOnCharEntered();\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoInteractableActor::OnOverlapEnd(UPrimitiveComponent* OverlappedComponent, AActor* OtherActor, UPrimitiveComponent* OtherComp, int32 OtherBodyIndex)\n{\n\tif (!bActive)\n\t\treturn;\n\n\tif (Cast<UCapsuleComponent>(OtherComp) == nullptr)\n\t\treturn;\n\n\tASoCharacter* pChar = Cast<ASoCharacter>(OtherActor);\n\tif (pChar)\n\t{\n\t\tpChar->RemoveInteractable(this);\n\t\tPlayersInArea.Remove(pChar);\n\t\tOnCharLeft();\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoInteractableActor::Activate()\n{\n\tbActive = true;\n\tCollision->SetCollisionEnabled(ECollisionEnabled::QueryOnly);\n\n\tif (bSerializeState)\n\t{\n\t\tif (bActiveByDefault)\n\t\t\tUSoWorldState::RemoveActorNameFromSet(this);\n\t\telse\n\t\t\tUSoWorldState::AddActorNameToSet(this);\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoInteractableActor::Deactivate()\n{\n\tbActive = false;\n\tfor (auto* Ptr : PlayersInArea)\n\t{\n\t\tPtr->RemoveInteractable(this);\n\t\tPtr = nullptr;\n\t}\n\tPlayersInArea.Empty();\n\tCollision->SetCollisionEnabled(ECollisionEnabled::NoCollision);\n\n\tif (bSerializeState)\n\t{\n\t\tif (bActiveByDefault)\n\t\t\tUSoWorldState::AddActorNameToSet(this);\n\t\telse\n\t\t\tUSoWorldState::RemoveActorNameFromSet(this);\n\t}\n}\n"
  },
  {
    "path": "Source/SOrb/Interactables/SoInteractableActor.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#pragma once\n#include \"GameFramework/Actor.h\"\n#include \"Components/BoxComponent.h\"\n#include \"SoInteractable.h\"\n#include \"SoInteractableActor.generated.h\"\n\nUCLASS()\nclass SORB_API ASoInteractableActor : public AActor, public ISoInteractable\n{\n\tGENERATED_BODY()\n\npublic:\n\t// Sets default values for this actor's properties\n\tASoInteractableActor();\n\n\tvirtual void OnConstruction(const FTransform& Transform) override;\n\n\t// Called when the game starts or when spawned\n\tvirtual void BeginPlay() override;\n\tvirtual void EndPlay(const EEndPlayReason::Type EndPlayReason) override;\n\n\tvirtual void Interact_Implementation(ASoCharacter* Character) override { OnInteract(Character); }\n\tvirtual FText GetInteractionText_Implementation() const override { return DisplayText; };\n\tvirtual FSoInteractableMessage GetInteractionMessage_Implementation() const override { return Message; }\n\tvirtual bool IsExclusive_Implementation() const override { return false; }\n\tvirtual bool IsSecondKeyPrefered_Implementation() const override { return bSecondKeyPreferred; }\n\tvirtual bool CanBeInteractedWithFromAir_Implementation() const override { return bCanBeInteractedWithFromAir; }\n\n\tUFUNCTION(BlueprintImplementableEvent, Category = Interaction)\n\tvoid OnInteract(ASoCharacter* pCharacter);\n\n\tUFUNCTION(BlueprintCallable, Category = Interaction)\n\tvoid Activate();\n\n\tUFUNCTION(BlueprintCallable, Category = Interaction)\n\tvoid Deactivate();\n\n\tUFUNCTION(BlueprintCallable, Category = Interaction)\n\tbool IsActive() const { return bActive; }\n\n\t// overlap callbacks\n\tUFUNCTION()\n\tvoid OnOverlapBegin(UPrimitiveComponent* OverlappedComponent, AActor* OtherActor, UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult & SweepResult);\n\n\tUFUNCTION()\n\tvoid OnOverlapEnd(UPrimitiveComponent* OverlappedComponent, AActor* OtherActor, UPrimitiveComponent* OtherComp, int32 OtherBodyIndex);\n\nprotected:\n\n\tUFUNCTION(BlueprintNativeEvent, Category = Interaction)\n\tvoid OnReload();\n\n\tUFUNCTION(BlueprintNativeEvent, Category = Interaction)\n\tbool ShouldBeRegistredAsInteractable();\n\n\tUFUNCTION(BlueprintImplementableEvent, Category = Interaction)\n\tvoid OnCharEntered();\n\n\tUFUNCTION(BlueprintImplementableEvent, Category = Interaction)\n\tvoid OnCharLeft();\n\nprotected:\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite)\n\tFText DisplayText;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite)\n\tUBoxComponent* Collision;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite)\n\tbool bActive;\n\n\t/** stored for serialization (changed state is serialized) */\n\tUPROPERTY(VisibleAnywhere, BlueprintReadOnly)\n\tbool bActiveByDefault;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite)\n\tbool bSerializeState;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite)\n\tFSoInteractableMessage Message;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite)\n\tbool bSecondKeyPreferred;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite)\n\tbool bCanBeInteractedWithFromAir;\n\nprivate:\n\tTArray<ASoCharacter*> PlayersInArea;\n};\n"
  },
  {
    "path": "Source/SOrb/Interactables/SoInteractableComponent.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#include \"SoInteractableComponent.h\"\n#include \"Components/CapsuleComponent.h\"\n#include \"SoInteractable.h\"\n#include \"Character/SoCharacter.h\"\n\nDEFINE_LOG_CATEGORY_STATIC(LogSoInteractableComponent, All, All)\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// Sets default values\nUSoInteractableComponent::USoInteractableComponent()\n{\n\tPrimaryComponentTick.bCanEverTick = false;\n\n\tSetCollisionEnabled(ECollisionEnabled::QueryOnly);\n\tSetCollisionProfileName(FName(\"TriggerPawnOnly\"));\n\tSetGenerateOverlapEvents(true);\n\n\tbActive = true;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// Called when the game starts or when spawned\nvoid USoInteractableComponent::BeginPlay()\n{\n\tSuper::BeginPlay();\n\n\tOnComponentBeginOverlap.AddUniqueDynamic(this, &USoInteractableComponent::OnOverlapBegin);\n\tOnComponentEndOverlap.AddUniqueDynamic(this, &USoInteractableComponent::OnOverlapEnd);\n\n\tif (!bActive)\n\t\tSetCollisionEnabled(ECollisionEnabled::NoCollision);\n\n\n\tif (GetOwner() == nullptr || !GetOwner()->GetClass()->ImplementsInterface(USoInteractable::StaticClass()))\n\t\tUE_LOG(LogSoInteractableComponent, Warning, TEXT(\"Owner of USoInteractableComponent must implement the ISoInteractable interface!\"));\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoInteractableComponent::OnOverlapBegin(UPrimitiveComponent* OverlappedComponent, AActor* OtherActor, UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult & SweepResult)\n{\n\tif (!bActive)\n\t\treturn;\n\n\tif (Cast<UCapsuleComponent>(OtherComp) == nullptr)\n\t\treturn;\n\n\tASoCharacter* SoChar = Cast<ASoCharacter>(OtherActor);\n\tif (SoChar != nullptr)\n\t{\n\t\tSoCharacter = SoChar;\n\t\tOnCharOverlapBegin.Broadcast();\n\t\tSoCharacter->AddInteractable(GetOwner());\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoInteractableComponent::OnOverlapEnd(UPrimitiveComponent* OverlappedComponent, AActor* OtherActor, UPrimitiveComponent* OtherComp, int32 OtherBodyIndex)\n{\n\tif (!bActive)\n\t\treturn;\n\n\tif (Cast<UCapsuleComponent>(OtherComp) == nullptr)\n\t\treturn;\n\n\tif (OtherActor == SoCharacter && SoCharacter != nullptr)\n\t{\n\t\tSoCharacter->RemoveInteractable(GetOwner());\n\t\tSoCharacter = nullptr;\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoInteractableComponent::ActivateInteractable()\n{\n\tbActive = true;\n\tSetCollisionEnabled(ECollisionEnabled::QueryOnly);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoInteractableComponent::DeactivateInteractable()\n{\n\tbActive = false;\n\n\tif (SoCharacter)\n\t{\n\t\tSoCharacter->RemoveInteractable(GetOwner());\n\t\tSoCharacter = nullptr;\n\t}\n\n\tSetCollisionEnabled(ECollisionEnabled::NoCollision);\n}\n"
  },
  {
    "path": "Source/SOrb/Interactables/SoInteractableComponent.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#pragma once\n\n#include \"Components/BoxComponent.h\"\n#include \"SoInteractableComponent.generated.h\"\n\nDECLARE_DYNAMIC_MULTICAST_DELEGATE(FSoInteractableNotify);\n\nclass ASoCharacter;\n\n/**\n *  Can be used by actors implementing the ISoInteractable interface\n */\nUCLASS(ClassGroup = (Custom), meta = (BlueprintSpawnableComponent))\nclass SORB_API USoInteractableComponent : public UBoxComponent\n{\n\tGENERATED_BODY()\n\npublic:\n\n\tUSoInteractableComponent();\n\n\t// Called when the game starts or when spawned\n\tvirtual void BeginPlay() override;\n\n\tUFUNCTION(BlueprintCallable, Category = Interaction)\n\tvoid ActivateInteractable();\n\n\tUFUNCTION(BlueprintCallable, Category = Interaction)\n\tvoid DeactivateInteractable();\n\n\t//UFUNCTION(BlueprintCallable, Category = Interaction)\n\tbool IsActive() const { return bActive; }\n\n\t// overlap callbacks\n\tUFUNCTION()\n\tvoid OnOverlapBegin(UPrimitiveComponent* OverlappedComponent, AActor* OtherActor, UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult & SweepResult);\n\n\tUFUNCTION()\n\tvoid OnOverlapEnd(UPrimitiveComponent* OverlappedComponent, AActor* OtherActor, UPrimitiveComponent* OtherComp, int32 OtherBodyIndex);\n\nprotected:\n\n\t/** called when the character enteres the interactable area, but only if it is active */\n\tUPROPERTY(BlueprintAssignable)\n\tFSoInteractableNotify OnCharOverlapBegin;\n\nprotected:\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite)\n\tbool bActive;\n\n\t/** pointer to character, only valid if he is inside the area */\n\tUPROPERTY(BlueprintReadOnly)\n\tASoCharacter* SoCharacter;\n};\n"
  },
  {
    "path": "Source/SOrb/Interactables/SoInteractableLever.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#include \"SoInteractableLever.h\"\n\n#include \"Animation/AnimSequenceBase.h\"\n\n#include \"Character/SoCharStates/SoActivityTypes.h\"\n#include \"SoInteractableComponent.h\"\n#include \"SplineLogic/SoSplineHelper.h\"\n#include \"Character/SoCharStates/SoALeverPush.h\"\n#include \"SaveFiles/SoWorldState.h\"\n#include \"Logic/SoControllable.h\"\n#include \"Basic/SoGameMode.h\"\n#include \"Basic/SoGameInstance.h\"\n#include \"SaveFiles/SoWorldStateBlueprint.h\"\n#include \"DlgDialogueParticipant.h\"\n#include \"Basic/Helpers/SoStaticHelper.h\"\n#include \"Basic/Helpers/SoDateTimeHelper.h\"\n#include \"Character/SoCharacter.h\"\n#include \"Basic/Helpers/SoMathHelper.h\"\n\nconst FName ASoInteractableLever::PercentName = FName(\"Percent\");\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// Sets default values\nASoInteractableLever::ASoInteractableLever()\n{\n \t// Set this actor to call Tick() every frame.  You can turn this off to improve performance if you don't need it.\n\tPrimaryActorTick.bCanEverTick = true;\n\n\tSoInteractableComponent = CreateDefaultSubobject<USoInteractableComponent>(TEXT(\"InteractableComponent\"));\n\tRootComponent = SoInteractableComponent;\n\n\tSoInteractableComponent->ActivateInteractable();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoInteractableLever::OnConstruction(const FTransform& Transform)\n{\n\tSuper::OnConstruction(Transform);\n\tUSoSplineHelper::UpdateSplineLocationRef(this, SplineLocationPtr, true, true);\n\tPulledStatePercent = DefaultPulledStatePercent;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoInteractableLever::BeginPlay()\n{\n\tLeverActivity = ELS_Rest;\n\tPulledStatePercent = DefaultPulledStatePercent;\n\n\tOnReload();\n\tASoGameMode::Get(this).OnPostLoad.AddDynamic(this, &ASoInteractableLever::OnReload);\n\n\tSetActorTickEnabled(false);\n\tSuper::BeginPlay();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoInteractableLever::EndPlay(const EEndPlayReason::Type EndPlayReason)\n{\n\tSuper::EndPlay(EndPlayReason);\n\tASoGameMode::Get(this).OnPostLoad.RemoveDynamic(this, &ASoInteractableLever::OnReload);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoInteractableLever::OnReload()\n{\n\tif (USoWorldState::IsActorNameInSet(this))\n\t{\n\t\tPulledStatePercent = 1.0f;\n\t\tif (bTriggerOnlyOnce)\n\t\t{\n\t\t\tSoInteractableComponent->DeactivateInteractable();\n\t\t\tbTriggerBlock = true;\n\t\t}\n\t}\n\telse\n\t{\n\t\tPulledStatePercent = DefaultPulledStatePercent;\n\t\tif (bSavePulledStatePercent)\n\t\t\tUSoWorldState::ReadFloatValue(this, PercentName, PulledStatePercent);\n\t\tif (bTriggerOnlyOnce)\n\t\t{\n\t\t\tSoInteractableComponent->ActivateInteractable();\n\t\t\tbTriggerBlock = false;\n\t\t}\n\t}\n\tUpdateState(false);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// Called every frame\nvoid ASoInteractableLever::Tick(float DeltaSeconds)\n{\n\tSuper::Tick(DeltaSeconds);\n\n\tDeltaSeconds = USoDateTimeHelper::DenormalizeTime(DeltaSeconds);\n\n\tswitch (LeverActivity)\n\t{\n\t\tcase ELS_Pulled:\n\t\t{\n\t\t\tUSoALeverPush* LeverPush = SoCharacter->SoALeverPush;\n\t\t\tif (LeverPush != nullptr)\n\t\t\t{\n\t\t\t\tSetPulledStatePercent(LeverPush->GetLeverData().ActualValue);\n\n\t\t\t\tif (PulledStatePercent + KINDA_SMALL_NUMBER >= 1.0f && !bTriggerBlock)\n\t\t\t\t{\n\t\t\t\t\tUSoTriggerHelper::TriggerAll(TriggerData);\n\t\t\t\t\tUSoTriggerHelper::TriggerActorArray(QuickTriggerList, QuickTriggerListValue);\n\t\t\t\t\tOnTargetsTriggeredBP();\n\n\t\t\t\t\tbTriggerBlock = PulledStatePercent > LeverResetThreshold;\n\n\t\t\t\t\tif (bTriggerOnlyOnce)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (NameToAddToPlayer != NAME_None)\n\t\t\t\t\t\t\tIDlgDialogueParticipant::Execute_ModifyBoolValue(SoCharacter, NameToAddToPlayer, true);\n\n\t\t\t\t\t\tSoInteractableComponent->DeactivateInteractable();\n\t\t\t\t\t\tif (SoCharacter->GetActivity() == EActivity::EA_LeverPush)\n\t\t\t\t\t\t\tSoCharacter->SoActivity->SwitchActivity(nullptr);\n\n\t\t\t\t\t\tif (!bAutomaticPull)\n\t\t\t\t\t\t\tSoCharacter->SetMovementStop();\n\n\t\t\t\t\t\tLeverActivity = ESoLeverActivity::ELS_Rest;\n\t\t\t\t\t\tSetActorTickEnabled(false);\n\t\t\t\t\t\tOnInteractEndBP();\n\t\t\t\t\t\tUSoWorldState::AddActorNameToSet(this);\n\t\t\t\t\t\tUpdateState(true);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (SoCharacter->GetActivity() != EActivity::EA_LeverPush)\n\t\t\t\t\tSwitchToReset();\n\t\t\t}\n\t\t\telse\n\t\t\t\tSwitchToReset();\n\n\t\t\tUpdateState(true);\n\t\t}\n\t\tbreak;\n\n\t\tcase ELS_Reset:\n\t\t{\n\t\t\tif (ResetSpeed > 0.0f)\n\t\t\t{\n\t\t\t\tif (bUseImprovedResetMethod)\n\t\t\t\t{\n\t\t\t\t\tResetTime = FMath::Max(ResetTime - DeltaSeconds, 0.0f);\n\t\t\t\t\tSetPulledStatePercent(USoMathHelper::InterpolateAcceleration(0.0f, 1.0f, ResetTime * ResetSpeed) * ResetStartPercent);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t\tSetPulledStatePercent(FMath::FInterpTo(PulledStatePercent, 0.0f, DeltaSeconds, ResetSpeed));\n\n\t\t\t\tif (PulledStatePercent < LeverResetThreshold)\n\t\t\t\t\tbTriggerBlock = false;\n\n\t\t\t\tif ((PulledStatePercent < LeverResetThreshold && bAutomaticPull) ||\n\t\t\t\t\t(bUseImprovedResetMethod && PulledStatePercent < KINDA_SMALL_NUMBER))\n\t\t\t\t{\n\t\t\t\t\tSetPulledStatePercent(0.0f);\n\t\t\t\t\tLeverActivity = ELS_Rest;\n\t\t\t\t}\n\t\t\t\tUpdateState(true);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tSetActorTickEnabled(false);\n\t\t\t\tOnInteractEndBP();\n\t\t\t}\n\t\t}\n\t\tbreak;\n\n\t\tcase ELS_Rest:\n\t\t\tSetActorTickEnabled(false);\n\t\t\tOnInteractEndBP();\n\n\t\tdefault:\n\t\t\tbreak;\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoInteractableLever::Interact_Implementation(ASoCharacter* Character)\n{\n\t// only allow interact if the lever is in default state\n\tif (bAutomaticPull && LeverActivity != ELS_Rest)\n\t\treturn;\n\n\tSoCharacter = Character;\n\n\tif (SoCharacter->GetActivity() != EActivity::EA_LeverPush && CharacterAnimation != nullptr)\n\t{\n\t\t// Old stuff, was used before lever went rest only:\n\t\t// only allow a new interaction if the reset threshold is already reached\n\t\t//if (bAutomaticPull && LeverActivity == ELS_Reset && bTriggerBlock)\n\t\t//\treturn;\n\n\t\tFSoLeverData LeverData{ PulledStatePercent,\n\t\t\t\t\t\t\t\t1.0f,\n\t\t\t\t\t\t\t\tPullSpeed,\n\t\t\t\t\t\t\t\tCharFaceDir,\n\t\t\t\t\t\t\t\tCharacterAnimation,\n\t\t\t\t\t\t\t\tCharacterAnimation->SequenceLength / CharacterAnimation->RateScale,\n\t\t\t\t\t\t\t\tbAutomaticPull,\n\t\t\t\t\t\t\t\tWaitAfterLeverPull };\n\n\t\tSoCharacter->StartLeverPush(LeverData, SplineLocationPtr.Extract(), GetActorLocation().Z);\n\n\t\tif (SoCharacter->GetActivity() == EActivity::EA_LeverPush)\n\t\t{\n\t\t\tLeverActivity = ELS_Pulled;\n\t\t\tSetActorTickEnabled(true);\n\t\t\tOnInteractBP();\n\n\t\t\tif (bTriggerOnlyOnce && bAutomaticPull)\n\t\t\t\tSoCharacter->RemoveInteractable(this);\n\t\t}\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoInteractableLever::UpdateState(bool bFromTick)\n{\n\tOnStateUpdated(PulledStatePercent, bFromTick);\n\n\tif (ControllableTarget != nullptr)\n\t\tISoControllable::Execute_OnControledValueChange(ControllableTarget, PulledStatePercent);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoInteractableLever::SwitchToReset()\n{\n\tLeverActivity = ELS_Reset;\n\n\tif (bUseImprovedResetMethod)\n\t{\n\t\tResetTime = 1.0f / ResetSpeed;\n\t\tResetStartPercent = PulledStatePercent;\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoInteractableLever::SetPulledStatePercent(float NewPercent)\n{\n\tPulledStatePercent = NewPercent;\n\tif (bSavePulledStatePercent)\n\t\tUSoWorldState::WriteFloatValue(this, PercentName, PulledStatePercent);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFText ASoInteractableLever::GetInteractionText_Implementation() const\n{\n\tUSoALeverPush* LeverPush = SoCharacter == nullptr ? nullptr : Cast<USoALeverPush>(SoCharacter->SoActivity);\n\n\tif (bAutomaticPull)\n\t\treturn DisplayText;\n\n\tif (LeverPush == nullptr || LeverPush->IsFinished())\n\t\treturn DisplayText;\n\n\treturn DisplayTextUsed;\n}\n"
  },
  {
    "path": "Source/SOrb/Interactables/SoInteractableLever.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#pragma once\n\n#include \"GameFramework/Actor.h\"\n#include \"SoInteractable.h\"\n#include \"Logic/SoTriggerable.h\"\n#include \"SplineLogic/SoSplinePointPtr.h\"\n#include \"SoInteractableLever.generated.h\"\n\nclass UAnimSequenceBase;\nclass USoInteractableComponent;\n\nUCLASS()\nclass SORB_API ASoInteractableLever : public AActor, public ISoInteractable\n{\n\tGENERATED_BODY()\n\npublic:\n\t// Sets default values for this actor's properties\n\tASoInteractableLever();\n\n\t// update spline location if necessary\n\tvirtual void OnConstruction(const FTransform& Transform) override;\n\n\t// Called when the game starts or when spawned\n\tvirtual void BeginPlay() override;\n\tvirtual void EndPlay(const EEndPlayReason::Type EndPlayReason) override;\n\n\t// Called every frame\n\tvirtual void Tick(float DeltaSeconds) override;\n\n\tvirtual void Interact_Implementation(ASoCharacter* Character) override;\n\tvirtual FText GetInteractionText_Implementation() const override;\n\tvirtual FSoInteractableMessage GetInteractionMessage_Implementation() const override { return Message; }\n\tvirtual bool IsExclusive_Implementation() const override { return false; }\n\tvirtual bool IsSecondKeyPrefered_Implementation() const override { return false; }\n\tvirtual bool CanBeInteractedWithFromAir_Implementation() const override { return false; }\n\nprotected:\n\n\tvoid UpdateState(bool bFromTick);\n\n\tvoid SwitchToReset();\n\n\tvoid SetPulledStatePercent(float NewPercent);\n\n\tUFUNCTION(BlueprintCallable)\n\tvoid OnReload();\n\n\tUFUNCTION(BlueprintImplementableEvent)\n\tvoid OnStateUpdated(float StatePercent, bool bFromTick);\n\n\tUFUNCTION(BlueprintImplementableEvent)\n\tvoid OnInteractBP();\n\n\tUFUNCTION(BlueprintImplementableEvent)\n\tvoid OnInteractEndBP();\n\n\tUFUNCTION(BlueprintImplementableEvent)\n\tvoid OnTargetsTriggeredBP();\n\n\nprotected:\n\n\tenum ESoLeverActivity\n\t{\n\t\tELS_Rest,\n\t\tELS_Pulled,\n\t\tELS_Reset\n\t};\n\n\t// lever is placed on the spline - the character interacting with it will teleport to this spline location\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere, Category = \"SplineLocation\")\n\tFSoSplinePointPtr SplineLocationPtr;\n\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere)\n\tUSoInteractableComponent* SoInteractableComponent;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite)\n\tFText DisplayText;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite)\n\tFText DisplayTextUsed;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite)\n\tFSoInteractableMessage Message;\n\n\t// the lever goes from 0 (default state) to 1 (fully pulled)\n\t// if it reaches the max state (1.0f) it triggers the targets\n\t// after the first trigger it won't trigger again until the value goes below this threshold and back to 1.0f again\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere, meta = (ClampMin = \"0.01\", ClampMax = \"1.1\"))\n\tfloat LeverResetThreshold = 0.5f;\n\n\t// after the first trigger the lever won't be interactable anymore\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere)\n\tbool bTriggerOnlyOnce;\n\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere)\n\tbool bSavePulledStatePercent = false;\n\n\tstatic const FName PercentName;\n\n\t// value between 0.0f (default) to 1.0f (pulled)\n\tUPROPERTY(BlueprintReadWrite, VisibleAnywhere)\n\tfloat PulledStatePercent = 0.0f;\n\n\t// used when the level is loaded if serialized data isn't specified otherwise\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere)\n\tfloat DefaultPulledStatePercent = 0.0f;\n\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere)\n\tfloat PullSpeed = 1.0f;\n\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere)\n\tfloat ResetSpeed = 1.0f;\n\n\tUPROPERTY(EditAnywhere)\n\tbool bUseImprovedResetMethod;\n\n\tfloat ResetTime = 0.0;\n\tfloat ResetStartPercent = 0.0f;\n\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere)\n\tbool bAutomaticPull = false;\n\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere)\n\tfloat WaitAfterLeverPull = -1.0f;\n\n\t// -1 or 1 depending on the spline\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere)\n\tint32 CharFaceDir = 1;\n\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = Movement)\n\tUAnimSequenceBase* CharacterAnimation;\n\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere)\n\tTArray<FSoTriggerableDataArray> TriggerData;\n\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere)\n\tTArray<AActor*> QuickTriggerList;\n\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere)\n\tint32 QuickTriggerListValue = 1;\n\n\t/** used only if trigger only once, ModifyBoolValue(NameToAddToPlayer, true) is called on player if it isn't None */\n\tUPROPERTY(EditAnywhere)\n\tFName NameToAddToPlayer = NAME_None;\n\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite)\n\tAActor* ControllableTarget = nullptr;\n\n\n\tESoLeverActivity LeverActivity = ESoLeverActivity::ELS_Rest;\n\n\t// set to true on trigger if the Threshold is smaller than 0.999f\n\t// blocks trigger, cleared if percent became smaller than LeverResetThreshold\n\tbool bTriggerBlock = false;\n\n\tUPROPERTY()\n\tASoCharacter* SoCharacter = nullptr;\n};\n"
  },
  {
    "path": "Source/SOrb/Interactables/SoInteractableLeverSwitch.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#include \"SoInteractableLeverSwitch.h\"\n\n#include \"Animation/AnimSequenceBase.h\"\n\n#include \"Basic/SoGameMode.h\"\n#include \"Basic/SoGameInstance.h\"\n#include \"Basic/Helpers/SoStaticHelper.h\"\n#include \"SoInteractableComponent.h\"\n#include \"SplineLogic/SoSplineHelper.h\"\n#include \"SaveFiles/SoWorldState.h\"\n#include \"SaveFiles/SoWorldStateBlueprint.h\"\n#include \"Logic/SoTriggerable.h\"\n#include \"Character/SoCharStates/SoALeverPush.h\"\n#include \"Character/SoCharStates/SoActivityTypes.h\"\n#include \"Character/SoCharacter.h\"\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// Sets default values\nASoInteractableLeverSwitch::ASoInteractableLeverSwitch()\n{\n \t// Set this actor to call Tick() every frame.  You can turn this off to improve performance if you don't need it.\n\tPrimaryActorTick.bCanEverTick = true;\n\tPrimaryActorTick.bStartWithTickEnabled = false;\n\n\tSoInteractableComponent = CreateDefaultSubobject<USoInteractableComponent>(TEXT(\"InteractableComponent\"));\n\tRootComponent = SoInteractableComponent;\n\n\tSoInteractableComponent->ActivateInteractable();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoInteractableLeverSwitch::OnConstruction(const FTransform& Transform)\n{\n\tUSoSplineHelper::UpdateSplineLocationRef(this, SplineLocationPtr, true, true);\n\tbSet = bSetByDefault;\n\tPulledStatePercent = bSetByDefault ? 1.0f : 0.0f;\n\n\tSuper::OnConstruction(Transform);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoInteractableLeverSwitch::BeginPlay()\n{\n\tif (bSerializeState)\n\t{\n\t\tOnReload();\n\t\tASoGameMode::Get(this).OnPostLoad.AddDynamic(this, &ASoInteractableLeverSwitch::OnReload);\n\t}\n\telse\n\t\tOnStateChangeBP();\n\n\tSetActorTickEnabled(false);\n\tSuper::BeginPlay();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoInteractableLeverSwitch::EndPlay(const EEndPlayReason::Type EndPlayReason)\n{\n\tSuper::EndPlay(EndPlayReason);\n\n\tif (bSerializeState)\n\t{\n\t\tASoGameMode::Get(this).OnPostLoad.RemoveDynamic(this, &ASoInteractableLeverSwitch::OnReload);\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoInteractableLeverSwitch::OnReload()\n{\n\tbSet = bSetByDefault;\n\n\tif (USoWorldState::IsActorNameInSet(this))\n\t\tbSet = !bSet;\n\n\tPulledStatePercent = bSet ? 1.0f : 0.0f;\n\tOnStateChangeBP();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// Called every frame\nvoid ASoInteractableLeverSwitch::Tick(float DeltaSeconds)\n{\n\tSuper::Tick(DeltaSeconds);\n\n\tif (SoCharacter == nullptr)\n\t{\n\t\tSetActorTickEnabled(false);\n\t\treturn;\n\t}\n\n\tUSoALeverPush* LeverPush = SoCharacter->SoALeverPush;\n\tif (LeverPush != nullptr)\n\t{\n\t\tconst FSoLeverData& LeverData = LeverPush->GetLeverData();\n\t\tPulledStatePercent = LeverData.ActualValue;\n\t\tOnStateChangeBP();\n\n\t\tif (fabs(PulledStatePercent - LeverData.TargetValue) < KINDA_SMALL_NUMBER)\n\t\t{\n\t\t\tTArray<AActor*>& TriggerData = bSet ? TriggerOnSet : TriggerOnReset;\n\t\t\tfor (AActor* Actor : TriggerData)\n\t\t\t\tif (Actor != nullptr && Actor->GetClass()->ImplementsInterface(USoTriggerable::StaticClass()))\n\t\t\t\t\tISoTriggerable::Execute_Trigger(Actor, { bSet ? SetValue : ResetValue, {} });\n\n\t\t\tOnInteractionEndBP();\n\n\t\t\tif (bSerializeState)\n\t\t\t{\n\t\t\t\tif (bSetByDefault == bSet)\n\t\t\t\t\tUSoWorldState::RemoveActorNameFromSet(this);\n\t\t\t\telse\n\t\t\t\t\tUSoWorldState::AddActorNameToSet(this);\n\t\t\t}\n\t\t}\n\t\telse\n\t\t\treturn;\n\t}\n\n\tSetActorTickEnabled(false);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoInteractableLeverSwitch::Interact_Implementation(ASoCharacter* Character)\n{\n\tSoCharacter = Character;\n\n\tif (SoCharacter->GetActivity() != EActivity::EA_LeverPush && CharacterAnimation != nullptr)\n\t{\n\t\tbSet = !bSet;\n\n\t\tconst FSoLeverData LeverData{ PulledStatePercent,\n\t\t\t\t\t\t\t\tbSet ? 1.0f : 0.0f,\n\t\t\t\t\t\t\t\tPullSpeed * (bSet ? 1.0f : -1.0f),\n\t\t\t\t\t\t\t\tCharFaceDir,\n\t\t\t\t\t\t\t\tCharacterAnimation,\n\t\t\t\t\t\t\t\tCharacterAnimation->SequenceLength / CharacterAnimation->RateScale,\n\t\t\t\t\t\t\t\ttrue,\n\t\t\t\t\t\t\t\tWaitAfterLeverPull };\n\n\t\tSoCharacter->StartLeverPush(LeverData, SplineLocationPtr.Extract(), GetActorLocation().Z);\n\n\t\tif (SoCharacter->GetActivity() == EActivity::EA_LeverPush)\n\t\t{\n\t\t\tSetActorTickEnabled(true);\n\t\t\tOnCharacterInteractBP();\n\t\t}\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFText ASoInteractableLeverSwitch::GetInteractionText_Implementation() const\n{\n\treturn bSet ? DisplayTextInSetState : DisplayTextInResetState;\n}\n"
  },
  {
    "path": "Source/SOrb/Interactables/SoInteractableLeverSwitch.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#pragma once\n\n#include \"GameFramework/Actor.h\"\n#include \"SoInteractable.h\"\n#include \"SplineLogic/SoSplinePointPtr.h\"\n#include \"SoInteractableLeverSwitch.generated.h\"\n\nclass UAnimSequenceBase;\nclass USoInteractableComponent;\n\nUCLASS()\nclass SORB_API ASoInteractableLeverSwitch : public AActor, public ISoInteractable\n{\n\tGENERATED_BODY()\n\npublic:\n\t// Sets default values for this actor's properties\n\tASoInteractableLeverSwitch();\n\n\t// update spline location if necessary\n\tvirtual void OnConstruction(const FTransform& Transform) override;\n\n\t// Called when the game starts or when spawned\n\tvirtual void BeginPlay() override;\n\tvirtual void EndPlay(const EEndPlayReason::Type EndPlayReason) override;\n\n\t// Called every frame\n\tvirtual void Tick(float DeltaSeconds) override;\n\n\tvirtual void Interact_Implementation(ASoCharacter* Character) override;\n\tvirtual FText GetInteractionText_Implementation() const override;\n\tvirtual FSoInteractableMessage GetInteractionMessage_Implementation() const override { return Message; }\n\tvirtual bool IsExclusive_Implementation() const override { return false; }\n\tvirtual bool IsSecondKeyPrefered_Implementation() const override { return false; }\n\tvirtual bool CanBeInteractedWithFromAir_Implementation() const override { return false; }\n\nprotected:\n\tUFUNCTION(BlueprintCallable, Category = LeverState)\n\tvoid OnReload();\n\n\tUFUNCTION(BlueprintImplementableEvent, Category = LeverState)\n\tvoid OnStateChangeBP();\n\n\tUFUNCTION(BlueprintImplementableEvent, Category = LeverState)\n\tvoid OnCharacterInteractBP();\n\n\tUFUNCTION(BlueprintImplementableEvent, Category = LeverState)\n\tvoid OnInteractionEndBP();\n\nprotected:\n\n\t// lever is placed on the spline - the character interacting with it will teleport to this spline location\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere, Category = \"SplineLocation\")\n\tFSoSplinePointPtr SplineLocationPtr;\n\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere)\n\tUSoInteractableComponent* SoInteractableComponent;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite)\n\tFText DisplayTextInSetState;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite)\n\tFText DisplayTextInResetState;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite)\n\tFSoInteractableMessage Message;\n\n\t// value between 0.0f (unset) to 1.0f (set)\n\tUPROPERTY(BlueprintReadWrite, VisibleAnywhere)\n\tfloat PulledStatePercent = 0.0f;\n\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere)\n\tbool bSetByDefault = false;\n\n\tUPROPERTY(BlueprintReadWrite, VisibleAnywhere)\n\tbool bSet = false;\n\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere)\n\tbool bSerializeState = false;\n\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere)\n\tfloat PullSpeed = 1.0f;\n\n\t// -1 or 1 depending on the spline and placement\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere)\n\tint32 CharFaceDir = 1;\n\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = Movement)\n\tUAnimSequenceBase* CharacterAnimation;\n\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere, Category = Trigger)\n\tTArray<AActor*> TriggerOnSet;\n\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere, Category = Trigger)\n\tTArray<AActor*> TriggerOnReset;\n\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere, Category = Trigger)\n\tint32 SetValue = 1;\n\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere, Category = Trigger)\n\tint32 ResetValue = -1;\n\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere, Category = Trigger)\n\tfloat WaitAfterLeverPull = -1.0f;\n\n\tUPROPERTY()\n\tASoCharacter* SoCharacter = nullptr;\n};\n"
  },
  {
    "path": "Source/SOrb/Interactables/SoNPC.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#include \"SoNPC.h\"\n\n#include \"Basic/Helpers/SoStaticHelper.h\"\n#include \"SaveFiles/SoWorldStateBlueprint.h\"\n#include \"Character/SoCharacter.h\"\n\nconst FName NameKnownName = FName(\"NameKnown\");\nconst FName AlreadyTriggered = FName(\"AlreadyTriggered\");\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nASoNPC::ASoNPC(const FObjectInitializer& ObjectInitializer) :\n\tSuper()\n{\n\tDialogueData.PositionIndex = 0;\n\tDialogueData.FadeInAnimName = FName(\"NPC_Arrive\");\n\tDialogueData.FadeOutAnimName = FName(\"NPC_Leave\");\n\tDialogueData.FadeOutAnimName = FName(\"NPCInactive_Leave\");\n\tDialogueData.TextBoxY = -876.0f;\n\tDialogueData.FloorPosition = FVector2D(-1048.0f, -876.0f);\n\n\tbSecondKeyPreferred = false;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoNPC::BeginPlay()\n{\n\tSuper::BeginPlay();\n\n\tif (bHandlePostLoad || bSaveIfNameKnown || bTriggerOnlyOnce)\n\t\tUSoEventHandlerHelper::SubscribeToSoPostLoad(this);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoNPC::EndPlay(const EEndPlayReason::Type EndPlayReason)\n{\n\tSuper::EndPlay(EndPlayReason);\n\n\tif (bHandlePostLoad || bSaveIfNameKnown || bTriggerOnlyOnce)\n\t\tUSoEventHandlerHelper::UnsubscribeFromSoPostLoad(this);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoNPC::HandleSoPostLoad_Implementation()\n{\n\n\tif (bSaveIfNameKnown)\n\t{\n\t\tbool bNameKnown = false;\n\t\tUSoWorldState::ReadBoolValue(this, NameKnownName, bNameKnown);\n\t\tDialogueData.ParticipantDisplayName = bNameKnown ? DlgParticipantDisplayName : DlgDisplayNameIfUnkown;\n\t}\n\n\tif (bTriggerOnlyOnce)\n\t{\n\t\tbool bTriggered = false;\n\t\tUSoWorldState::ReadBoolValue(this, AlreadyTriggered, bTriggered);\n\t\tif (bTriggered || bActiveByDefault == USoWorldState::IsMyNameInSet(this))\n\t\t\tDeactivate();\n\t\telse\n\t\t\tActivate();\n\t}\n\n\tOnGameReloadBP();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool ASoNPC::ShouldSpawnVO_Implementation(ESoVoiceType VoiceType) const\n{\n\tif (ASoCharacter* Player = USoStaticHelper::GetPlayerCharacterAsSoCharacter(this))\n\t{\n\t\tif ((GetActorLocation() - Player->GetActorLocation()).SizeSquared() > MaxVODistance * MaxVODistance)\n\t\t\treturn false;\n\n\t\tif (Player->IsInDialogue())\n\t\t\treturn false;\n\t}\n\n\tif (VoiceType == ESoVoiceType::SoVoiceTypeNoise)\n\t\treturn true;\n\n\treturn FMath::RandRange(0.0f, 1.0f) <= VOChance;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool ASoNPC::IsAlreadyTriggered()\n{\n\tbool bTriggered = false;\n\tUSoWorldState::ReadBoolValue(this, AlreadyTriggered, bTriggered);\n\treturn bTriggerOnlyOnce && bTriggered;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoNPC::Interact_Implementation(ASoCharacter* Character)\n{\n\tOnInteract(Character);\n\n\tif (bTriggerOnlyOnce)\n\t{\n\t\tUSoWorldState::WriteBoolValue(this, AlreadyTriggered, true);\n\t\tDeactivate();\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool ASoNPC::ModifyBoolValue_Implementation(FName ValueName, bool bValue)\n{\n\tif (bSaveIfNameKnown && ValueName == NameKnownName)\n\t{\n\t\tUSoWorldState::WriteBoolValue(this, NameKnownName, bValue);\n\t\tDialogueData.ParticipantDisplayName = bValue ? DlgParticipantDisplayName : DlgDisplayNameIfUnkown;\n\t}\n\n\treturn false;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool ASoNPC::GetBoolValue_Implementation(FName ValueName) const\n{\n\tif (bSaveIfNameKnown && ValueName == NameKnownName)\n\t{\n\t\tbool bNameKnown = false;\n\t\tUSoWorldState::ReadBoolValue(this, NameKnownName, bNameKnown);\n\t\treturn bNameKnown;\n\t}\n\n\treturn false;\n}\n"
  },
  {
    "path": "Source/SOrb/Interactables/SoNPC.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#pragma once\n\n// interface\n#include \"CoreMinimal.h\"\n\n#include \"DlgDialogueParticipant.h\"\n\n#include \"CharacterBase/SoVoiceUser.h\"\n#include \"Basic/SoDialogueParticipant.h\"\n#include \"Basic/SoEventHandler.h\"\n#include \"Interactables/SoInteractableActor.h\"\n\n#include \"Items/SoItem.h\"\n\n#include \"SoNPC.generated.h\"\n\nclass USceneComponent;\n\n/** Can be talked to */\nUCLASS()\nclass SORB_API ASoNPC : public ASoInteractableActor, public IDlgDialogueParticipant, public ISoDialogueParticipant, public ISoEventHandler, public ISoVoiceUser\n{\n\tGENERATED_BODY()\n\npublic:\n\n\tASoNPC(const FObjectInitializer& ObjectInitializer);\n\tvirtual void BeginPlay() override;\n\tvirtual void EndPlay(const EEndPlayReason::Type EndPlayReason) override;\n\n\t// Interfaces:\n\n\t// SoEventHandler interface\n\tvirtual void HandleSoPostLoad_Implementation() override;\n\tvirtual void HandlePlayerRematerialize_Implementation() override {};\n\tvirtual void HandlePlayerRespawn_Implementation() override {};\n\tvirtual void HandleWhitelistedSplinesEntered_Implementation() override {};\n\tvirtual void HandleWhitelistedSplinesLeft_Implementation() override {};\n\n\t// interactable:\n\tvirtual bool CanBeInteractedWithFromAir_Implementation() const override { return false; }\n\tvirtual void Interact_Implementation(ASoCharacter* Character) override;\n\n\t// SoDialogueParticipant interface\n\tvirtual const FSoDialogueParticipantData& GetParticipantData() const override\n\t{\n\t\treturn DialogueData;\n\t}\n\n\t// SoVoiceUser interface\n\tvirtual USceneComponent* GetComponent_Implementation() const { return Collision; }\n\tvirtual FName GetSocketName_Implementation() const { return NAME_None; }\n\tvirtual bool ShouldSpawnVO_Implementation(ESoVoiceType VoiceType) const;\n\n\tconst TArray<FSoItem>& GetStartingItemList() const { return StartingItemList; }\n\n\n\t// DlgDialogueParticipant interface\n\tFName GetParticipantName_Implementation() const override { return DialogueData.ParticipantName; }\n\tFText GetParticipantDisplayName_Implementation(FName ActiveSpeaker) const override { return DialogueData.ParticipantDisplayName; }\n\tETextGender GetParticipantGender_Implementation() const { return ETextGender::Neuter; }\n\tUTexture2D* GetParticipantIcon_Implementation(FName ActiveSpeaker, FName ActiveSpeakerState) const override { return DialogueData.ParticipantIcon; }\n\n\tbool ModifyBoolValue_Implementation(FName ValueName, bool bValue) override;\n\tbool ModifyIntValue_Implementation(FName ValueName, bool bDelta, int32 Value) override { return false; }\n\tbool ModifyFloatValue_Implementation(FName ValueName, bool bDelta, float Value) override { return false; }\n\tbool ModifyNameValue_Implementation(FName ValueName, FName NameValue) override { return false; }\n\n\tbool GetBoolValue_Implementation(FName ValueName) const override;\n\tbool OnDialogueEvent_Implementation(UDlgContext* Context, FName EventName) override { return false; }\n\tbool CheckCondition_Implementation(const UDlgContext* Context, FName ConditionName) const override { return false; }\n\n\t// ones with some logic:\n\tint32 GetIntValue_Implementation(FName ValueName) const override { return 0; }\n\tFName GetNameValue_Implementation(FName ValueName) const override { return NAME_None; }\n\tfloat GetFloatValue_Implementation(FName ValueName) const override { return -1.0f; }\n\nprotected:\n\tUFUNCTION(BlueprintPure, Category = \"State\")\n\tbool IsAlreadyTriggered();\n\n\tUFUNCTION(BlueprintImplementableEvent, Category = \"Reload\")\n\tvoid OnGameReloadBP();\n\nprotected:\n\n\t// Dialogue:\n\n\tUPROPERTY(EditAnywhere, BlueprintReadOnly, Category = \"Dialogues\")\n\tbool bTriggerOnlyOnce = false;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadOnly, Category = \"Dialogues\")\n\tbool bHandlePostLoad;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadOnly, Category = \"Dialogues\")\n\tbool bSaveIfNameKnown;\n\n\t/** Used only if bSaveIfNameKnown is set */\n\tUPROPERTY(EditAnywhere, BlueprintReadOnly, Category = \"Dialogues\")\n\tFText DlgParticipantDisplayName;\n\n\t/** Used only if bSaveIfNameKnown is set */\n\tUPROPERTY(EditAnywhere, BlueprintReadOnly, Category = \"Dialogues\")\n\tFText DlgDisplayNameIfUnkown;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = \"Dialogues\")\n\tFSoDialogueParticipantData DialogueData;\n\n\t/** used for traders to remember the initial state, isn't in component cause instanced stuff resets if it is in component cause why not */\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere)\n\tTArray<FSoItem> StartingItemList;\n\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere)\n\tfloat VOChance = 0.5f;\n\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere)\n\tfloat MaxVODistance = 3000;\n};\n"
  },
  {
    "path": "Source/SOrb/Items/ItemTemplates/SoItemTemplate.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#include \"SoItemTemplate.h\"\n\n#include \"Basic/SoGameSingleton.h\"\n#include \"Basic/Helpers/SoStringHelper.h\"\n\nFString USoItemTemplate::TextNamespace(TEXT(\"ItemData\"));\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUSoItemTemplate::USoItemTemplate()\n{\n}\n\n#if WITH_EDITOR\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoItemTemplate::PreSave(const ITargetPlatform* TargetPlatform)\n{\n\tUpdateLocalizedFields();\n\tSuper::PreSave(TargetPlatform);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoItemTemplate::PostEditChangeProperty(FPropertyChangedEvent& PropertyChangedEvent)\n{\n\tSuper::PostEditChangeProperty(PropertyChangedEvent);\n\n\t// being extra lazy here and updating text fields even if it is not needed\n\tUpdateLocalizedFields();\n}\n#endif // WITH_EDITOR\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFString USoItemTemplate::GetObjectPath() const\n{\n\tconst auto ThePath = FSoftObjectPath(this);\n\tif (!ThePath.IsValid())\n\t\treturn \"\";\n\n\treturn GetClass()->GetDescription() + \"'\" + ThePath.ToString() + \"'\";\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUSoItemTemplate* USoItemTemplate::GetTemplateFromPath(const FString& Path)\n{\n\tif (Path.Len() == 0)\n\t\treturn nullptr;\n\n\treturn Cast<USoItemTemplate>(StaticLoadObject(USoItemTemplate::StaticClass(), NULL, *Path));\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nconst FText& USoItemTemplate::GetSubTypeText() const\n{\n\treturn USoGameSingleton::GetTextForItemType(ItemType);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFString USoItemTemplate::GetItemTypeAsFriendlyString() const\n{\n\treturn USoStringHelper::ItemTypeToFriendlyString(ItemType);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoItemTemplate::UpdateLocalizedFields()\n{\n\tconst FString ObjectName = USoStringHelper::GetObjectBaseName(this);\n\tName = FInternationalization::ForUseOnlyByLocMacroAndGraphNodeTextLiterals_CreateText(\n\t\t*Name.ToString(),\n\t\t*TextNamespace,\n\t\t*(ObjectName + \"_name\")\n\t);\n\tDescription = FInternationalization::ForUseOnlyByLocMacroAndGraphNodeTextLiterals_CreateText(\n\t\t*Description.ToString(),\n\t\t*TextNamespace,\n\t\t*(ObjectName + \"_desc\")\n\t);\n}\n"
  },
  {
    "path": "Source/SOrb/Items/ItemTemplates/SoItemTemplate.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#pragma once\n#include \"UObject/Object.h\"\n#include \"Items/SoItemTypes.h\"\n\n#include \"SoItemTemplate.generated.h\"\n\nclass UTexture2D;\nclass USoEffectBase;\n\n/**\n *\n */\nUCLASS(BlueprintType, Abstract)\nclass SORB_API USoItemTemplate : public UObject\n{\n\tGENERATED_BODY()\n\npublic:\n\n\tUSoItemTemplate();\n\n#if WITH_EDITOR\n\tvoid PreSave(const ITargetPlatform* TargetPlatform) override;\n\tvoid PostEditChangeProperty(FPropertyChangedEvent& PropertyChangedEvent) override;\n#endif // WITH_EDITOR\n\n\t//~ Begin UObject Interface.\n\t/** @return a one line description of an object for viewing in the thumbnail view of the generic browser */\n\tFString GetDesc() override\n\t{\n\t\treturn FString::Printf(TEXT(\"Item Name = %s\\nType = %s\"), *Name.ToString(), *GetSubTypeText().ToString());\n\t}\n\n\n\tstatic USoItemTemplate* GetTemplateFromPath(const FString& Path);\n\n\tFString GetObjectPath() const;\n\n\n\tUFUNCTION(BlueprintCallable, Category = Equipment)\n\tvirtual bool IsSlotCompatible(ESoItemSlot Slot) const { return false; }\n\n\tUFUNCTION(BlueprintCallable, Category = Equipment)\n\tvirtual bool IsStackable() const { return false; }\n\n\tUFUNCTION(BlueprintCallable, Category = Equipment)\n\tvirtual int32 GetMaxStackNum() const { return 1; }\n\n\tUFUNCTION(BlueprintCallable, Category = Equipment)\n\tvirtual bool CanBePutTogether(const USoItemTemplate* TheOther) const { return false; }\n\n\tUFUNCTION(BlueprintCallable, Category = Equipment)\n\tvirtual bool IsEquipable() const { return false; }\n\n\t// weather or not to destroy the item if the amount is 0\n\tvirtual bool DestroyOnRunOut() const { return true; }\n\n\tUFUNCTION(BlueprintCallable, Category = Equipment)\n\tvirtual ESoItemSlot GetDefaultSlot() const { return ESoItemSlot::EIS_Max; }\n\n\tUFUNCTION(BlueprintPure, Category = Equipment)\n\tvirtual const FText& GetSubTypeText() const;\n\n\tUFUNCTION(BlueprintPure, Category = Equipment)\n\tvirtual bool HasPropertyBlock(ESoItemPropertyBlock Block) const { return false; }\n\n\tUTexture2D* GetIcon() const { return Icon; }\n\n\tUFUNCTION(BlueprintCallable, Category = UI)\n\tvirtual void FillTooltipProperties(UObject* Tooltip) const {};\n\n\tUFUNCTION(BlueprintCallable, Category = Equipment)\n\tvirtual bool CanEquip(UObject* ItemOwner) const { return true; }\n\n\t/** effects active while the item is active, some type does not have this */\n\tvirtual void GetStaticEffects(TArray<TSubclassOf<USoEffectBase>>& OutEffects) const {};\n\n\tESoItemType GetItemType() const { return ItemType; }\n\tFString GetItemTypeAsFriendlyString() const;\n\n\tFText GetItemName() const { return Name; }\n\tint32 GetValue() const { return Value; }\n\n\tvirtual void UpdateLocalizedFields();\n\nprotected:\n\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = Item, AssetRegistrySearchable)\n\tFText Name;\n\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = Item, AssetRegistrySearchable, Meta = (MultiLine = true))\n\tFText Description;\n\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = Item, AssetRegistrySearchable)\n\tint32 Value = 5;\n\n\t//\tLevel\tText\t\t\t\t\t\tFirst Chapter\n\t//\n\t//\t\t0\tBetter than nothing, right?\t\t1\n\t//\t\t1\tBetter than nothing\t\t\t\t1\n\t//\t\t2\tGood Stuff\t\t\t\t\t\t2\n\t//\t\t3\tPretty Good Stuff\t\t\t\t2\n\t//\t\t4\tAmazing\t\t\t\t\t\t\t3\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = Item, AssetRegistrySearchable)\n\tint32 RarityValue = 1;\n\n\tUPROPERTY(BlueprintReadOnly, VisibleAnywhere, Category = Item, AssetRegistrySearchable)\n\tESoItemType ItemType;\n\n\t// in inventory / character sheet / etc.\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = Visual)\n\tUTexture2D* Icon;\n\n\t// Used for all FTexts\n\tstatic FString TextNamespace;\n};\n"
  },
  {
    "path": "Source/SOrb/Items/ItemTemplates/SoItemTemplateJewelry.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#pragma once\n\n#include \"SoItemTemplate.h\"\n\n#include \"SoItemTemplateJewelry.generated.h\"\n\n\nUCLASS()\nclass SORB_API USoItemTemplateJewelry : public USoItemTemplate\n{\n\tGENERATED_BODY()\n\npublic:\n\n\tUSoItemTemplateJewelry() { ItemType = ESoItemType::EIT_Jewelry; }\n\n\tvirtual bool IsStackable() const override { return MaxStackNum > 1; }\n\tvirtual int32 GetMaxStackNum() const override { return MaxStackNum; }\n\npublic:\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere)\n\tint32 MaxStackNum = 1;\n};\n"
  },
  {
    "path": "Source/SOrb/Items/ItemTemplates/SoItemTemplateQuestBook.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#include \"SoItemTemplateQuestBook.h\"\n\n#include \"Basic/SoGameSingleton.h\"\n#include \"Basic/Helpers/SoStringHelper.h\"\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nconst FText& USoItemTemplateQuestBook::GetSubTypeText() const\n{\n\treturn USoGameSingleton::GetTextForQuestItemType(ESoQuestItemType::EQIT_Book);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoItemTemplateQuestBook::UpdateLocalizedFields()\n{\n\tconst FString ObjectName = USoStringHelper::GetObjectBaseName(this);\n\n\t// Update Pages\n\tfor (int32 Index = 0; Index < Pages.Num(); Index++)\n\t{\n\t\tFText& PageText = Pages[Index];\n\n\t\tPageText = FInternationalization::ForUseOnlyByLocMacroAndGraphNodeTextLiterals_CreateText(\n\t\t\t*PageText.ToString(),\n\t\t\t*TextNamespace,\n\t\t\t*(ObjectName + \"_page_\" + FString::FromInt(Index))\n\t\t);\n\t}\n\n\tSuper::UpdateLocalizedFields();\n}\n"
  },
  {
    "path": "Source/SOrb/Items/ItemTemplates/SoItemTemplateQuestBook.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#pragma once\n\n#include \"SoItemTemplate.h\"\n\n#include \"SoItemTemplateQuestBook.generated.h\"\n\n\n/**\n *  Used for e.g. keys\n *  Item in the inventory, nothing special, but objects can check if the character has one or not\n */\nUCLASS()\nclass SORB_API USoItemTemplateQuestBook : public USoItemTemplate\n{\n\tGENERATED_BODY()\n\npublic:\n\tUSoItemTemplateQuestBook() { ItemType = ESoItemType::EIT_QuestItem; }\n\n\tconst FText& GetSubTypeText() const override;\n\tvoid UpdateLocalizedFields() override;\n\npublic:\n\t/** text inside books */\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = ItemQuest, Meta = (MultiLine = true))\n\tTArray<FText> Pages;\n};\n"
  },
  {
    "path": "Source/SOrb/Items/ItemTemplates/SoItemTemplateRuneStone.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#include \"SoItemTemplateRuneStone.h\"\n\n#include \"Basic/SoGameInstance.h\"\n#include \"Effects/SoEffectBase.h\"\n#include \"Items/SoItemTooltipUI.h\"\n#include \"Basic/Helpers/SoStringHelper.h\"\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoItemTemplateRuneStone::FillTooltipProperties(UObject* Tooltip) const\n{\n\tif (Effect == nullptr)\n\t\treturn;\n\n\tconst USoEffectBase* DefaultEffect = Cast<USoEffectBase>(Effect->GetDefaultObject());\n\tif (DefaultEffect != nullptr)\n\t\tISoItemTooltipUI::Execute_AddEffectLine(Tooltip, DefaultEffect, true);\n\n\tif (CapacityCost > 0)\n\t\tISoItemTooltipUI::Execute_AddParamWithIntLine(Tooltip, ESoItemParam::EIP_SpellCapacityCost, CapacityCost);\n\n\tif (UsageCount > 0)\n\t\tISoItemTooltipUI::Execute_AddParamWithIntLine(Tooltip, ESoItemParam::EIP_SpellUsageCount, UsageCount);\n\tif (Cooldown > 0.0f)\n\t\tISoItemTooltipUI::Execute_AddParamWithFloatLine(Tooltip, ESoItemParam::EIP_Cooldown, Cooldown);\n\n\tISoItemTooltipUI::Execute_AddParamWithBoolLine(Tooltip, ESoItemParamBool::EIPB_SpellOnlyInAir, !bCanBeUsedInAir);\n\tISoItemTooltipUI::Execute_AddParamWithBoolLine(Tooltip, ESoItemParamBool::EIPB_SpellRestricted, !bCanBeUsedInSKFreeZone);\n\tISoItemTooltipUI::Execute_AddParamWithBoolLine(Tooltip, ESoItemParamBool::EIPB_CooldownStopsInAir, !bCooldownReducedInAir);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nconst FText& USoItemTemplateRuneStone::GetDescForLevel(int32 Level, bool bLevelUp) const\n{\n\tconst TArray<FText>& TextArray = bLevelUp ? LevelUpBasedDescOverride : LevelBasedDescOverride;\n\n\tif (TextArray.IsValidIndex(Level))\n\t\treturn TextArray[Level];\n\n\treturn Description;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoItemTemplateRuneStone::UpdateLocalizedFields()\n{\n\tconst FString ObjectName = USoStringHelper::GetObjectBaseName(this);\n\n\t// Update LevelBasedDescOverride\n\tfor (int32 Index = 0; Index < LevelBasedDescOverride.Num(); Index++)\n\t{\n\t\tFText& OverrideText = LevelBasedDescOverride[Index];\n\t\tOverrideText = FInternationalization::ForUseOnlyByLocMacroAndGraphNodeTextLiterals_CreateText(\n\t\t\t*OverrideText.ToString(),\n\t\t\t*TextNamespace,\n\t\t\t*(ObjectName + \"_level_desc_\" + FString::FromInt(Index))\n\t\t);\n\t}\n\n\t// Update LevelUpBasedDescOverride\n\tfor (int32 Index = 0; Index < LevelUpBasedDescOverride.Num(); Index++)\n\t{\n\t\tFText& OverrideText = LevelUpBasedDescOverride[Index];\n\t\tOverrideText = FInternationalization::ForUseOnlyByLocMacroAndGraphNodeTextLiterals_CreateText(\n\t\t\t*OverrideText.ToString(),\n\t\t\t*TextNamespace,\n\t\t\t*(ObjectName + \"_level_up_desc_\" + FString::FromInt(Index))\n\t\t);\n\t}\n\n\tSuper::UpdateLocalizedFields();\n}\n"
  },
  {
    "path": "Source/SOrb/Items/ItemTemplates/SoItemTemplateRuneStone.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#pragma once\n\n#include \"SoItemTemplate.h\"\n#include \"CharacterBase/SoIMortalTypes.h\"\n#include \"Logic/SoCooldown.h\"\n#include \"SoItemTemplateRuneStone.generated.h\"\n\nclass UFMODEvent;\nclass UTexture2D;\nclass USoEffectBase;\n\n/**\n*\n*/\nUCLASS()\nclass SORB_API USoItemTemplateRuneStone : public USoItemTemplate, public ISoCooldown\n{\n\tGENERATED_BODY()\n\npublic:\n\n\tUSoItemTemplateRuneStone() { ItemType = ESoItemType::EIT_RuneStone; }\n\n\tfloat GetCooldownDuration_Implementation() const override { return Cooldown; }\n\tUTexture2D* GetCooldownIcon_Implementation() const override { return Icon; }\n\tbool CanCountDownInAir_Implementation() const override { return bCooldownReducedInAir; }\n\n\tconst TSubclassOf<USoEffectBase>& GetEffect() const { return Effect; }\n\n\tvoid FillTooltipProperties(UObject* Tooltip) const override;\n\tvoid UpdateLocalizedFields() override;\n\n\n\tUFUNCTION(BlueprintPure)\n\tconst FText& GetDescForLevel(int32 Level, bool bLevelUp) const;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadOnly, Category = RuneStoneData)\n\tfloat Cooldown = -1.0f;\n\n\t// == 0: auto cast\n\t//  < 0: unlimited usage\n\tUPROPERTY(EditAnywhere, BlueprintReadOnly, Category = RuneStoneData)\n\tint32 UsageCount = 1;\n\n\t// amount of capacity it takes from the Spellcaster if equipped\n\tUPROPERTY(EditAnywhere, BlueprintReadOnly, Category = RuneStoneData)\n\tint32 CapacityCost = 1;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadOnly, Category = RuneStoneData)\n\tTSubclassOf<USoEffectBase> Effect;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadOnly, Category = RuneStoneData)\n\tbool bCanBeUsedInAir = true;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadOnly, Category = RuneStoneData)\n\tbool bCanBeUsedInSKFreeZone = true;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadOnly, Category = RuneStoneData)\n\tbool bCooldownReducedInAir = true;\n\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = ItemUsable)\n\tUFMODEvent* SFXOnUse;\n\n\n\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = ItemUsable, Meta = (MultiLine = true))\n\tTArray<FText> LevelBasedDescOverride;\n\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = ItemUsable, Meta = (MultiLine = true))\n\tTArray<FText> LevelUpBasedDescOverride;\n};\n"
  },
  {
    "path": "Source/SOrb/Items/ItemTemplates/SoItemTemplateShard.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#include \"SoItemTemplateShard.h\"\n\n#include \"Items/SoItemTooltipUI.h\"\n\n#include \"Basic/SoGameSingleton.h\"\n#include \"Effects/SoEffectBase.h\"\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoItemTemplateShard::IsSlotCompatible(ESoItemSlot Slot) const\n{\n\tswitch (Slot)\n\t{\n\t\tcase ESoItemSlot::EIS_ShardDefensive0:\n\t\tcase ESoItemSlot::EIS_ShardDefensive1:\n\t\t\treturn ShardType == ESoShardType::Defensive;\n\n\t\tcase ESoItemSlot::EIS_ShardOffensive0:\n\t\tcase ESoItemSlot::EIS_ShardOffensive1:\n\t\t\treturn ShardType == ESoShardType::Offensive;\n\n\t\tcase ESoItemSlot::EIS_ShardSpecial:\n\t\t\treturn ShardType == ESoShardType::Special;\n\n\t\tdefault:\n\t\t\treturn false;\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nESoItemSlot USoItemTemplateShard::GetDefaultSlot() const\n{\n\tswitch (ShardType)\n\t{\n\t\tcase ESoShardType::Defensive:\n\t\t\treturn ESoItemSlot::EIS_ShardDefensive0;\n\n\t\tcase ESoShardType::Offensive:\n\t\t\treturn ESoItemSlot::EIS_ShardOffensive0;\n\n\t\tcase ESoShardType::Special:\n\t\t\treturn ESoItemSlot::EIS_ShardSpecial;\n\n\t\tdefault:\n\t\t\treturn ESoItemSlot::EIS_Max;\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nconst FText& USoItemTemplateShard::GetSubTypeText() const\n{\n\treturn USoGameSingleton::GetTextForShardType(ShardType);\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoItemTemplateShard::FillTooltipProperties(UObject* Tooltip) const\n{\n\tfor (const TSubclassOf<USoEffectBase>& EffectClass : Effects)\n\t\tif (const USoEffectBase* DefaultEffect = Cast<USoEffectBase>(EffectClass->GetDefaultObject()))\n\t\t\tISoItemTooltipUI::Execute_AddEffectLine(Tooltip, DefaultEffect, true);\n}\n"
  },
  {
    "path": "Source/SOrb/Items/ItemTemplates/SoItemTemplateShard.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#pragma once\n\n#include \"SoItemTemplate.h\"\n#include \"CharacterBase/SoIMortalTypes.h\"\n#include \"SoItemTemplateShard.generated.h\"\n\nclass USoEffectBase;\n\n/**\n*\n*/\nUCLASS()\nclass SORB_API USoItemTemplateShard : public USoItemTemplate\n{\n\tGENERATED_BODY()\n\npublic:\n\n\tUSoItemTemplateShard() { ItemType = ESoItemType::EIT_Shard; }\n\n\tbool IsEquipable() const override { return true; }\n\n\tbool IsSlotCompatible(ESoItemSlot Slot) const override;\n\tESoItemSlot GetDefaultSlot() const override;\n\n\tconst FText& GetSubTypeText() const override;\n\n\tvoid FillTooltipProperties(UObject* Tooltip) const override;\n\n\tvoid GetStaticEffects(TArray<TSubclassOf<USoEffectBase>>& OutEffects) const override { OutEffects = Effects; }\n\n\tESoShardType GetClothType() const { return ShardType; }\n\n\nprotected:\n\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = ItemCloth, AssetRegistrySearchable)\n\tESoShardType ShardType;\n\n\t// TODO: check effect type, force item based\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = ItemCloth)\n\tTArray<TSubclassOf<USoEffectBase>> Effects;\n};\n"
  },
  {
    "path": "Source/SOrb/Items/ItemTemplates/SoQuestItemTemplate.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#include \"SoQuestItemTemplate.h\"\n\n#include \"Basic/SoGameSingleton.h\"\n\n\n#if WITH_EDITOR\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoQuestItemTemplate::PostEditChangeProperty(struct FPropertyChangedEvent& PropertyChangedEvent)\n{\n\tSuper::PostEditChangeProperty(PropertyChangedEvent);\n\tUpdateItemType();\n}\n#endif\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoQuestItemTemplate::PostLoad()\n{\n\tSuper::PostLoad();\n\tUpdateItemType();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nconst FText& USoQuestItemTemplate::GetSubTypeText() const\n{\n\treturn USoGameSingleton::GetTextForQuestItemType(QuestItemType);\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoQuestItemTemplate::UpdateItemType()\n{\n\tswitch (QuestItemType)\n\t{\n\t\tcase ESoQuestItemType::EQIT_Key:\n\t\tcase ESoQuestItemType::EQIT_KeyLikeItem:\n\t\t\tItemType = ESoItemType::EIT_Key;\n\t\t\tbreak;\n\n\t\tcase ESoQuestItemType::EQIT_MemoryStone:\n\t\t\tItemType = ESoItemType::EIT_MemoryStone;\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tItemType = ESoItemType::EIT_QuestItem;\n\t\t\tbreak;\n\t};\n}\n"
  },
  {
    "path": "Source/SOrb/Items/ItemTemplates/SoQuestItemTemplate.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#pragma once\n\n#include \"SoItemTemplate.h\"\n\n#include \"SoQuestItemTemplate.generated.h\"\n\n\n/**\n *  Used for e.g. keys\n *  Item in the inventory, nothing special, but objects can check if the character has one or not\n */\nUCLASS()\nclass SORB_API USoQuestItemTemplate : public USoItemTemplate\n{\n\tGENERATED_BODY()\n\npublic:\n\n\tUSoQuestItemTemplate() { ItemType = ESoItemType::EIT_QuestItem; Value = 0; }\n\n\tvirtual void PostLoad() override;\n#if WITH_EDITOR\n\tvirtual void PostEditChangeProperty(struct FPropertyChangedEvent& PropertyChangedEvent) override;\n#endif\n\n\tconst FText& GetSubTypeText() const override;\n\n\tvirtual bool IsStackable() const override { return MaxStackNum > 0; }\n\tvirtual int32 GetMaxStackNum() const override { return MaxStackNum; }\n\tvirtual bool CanBePutTogether(const USoItemTemplate* TheOther) const override { return TheOther == this; }\n\nprivate:\n\n\tvoid UpdateItemType();\n\npublic:\n\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = ItemQuest, AssetRegistrySearchable)\n\tESoQuestItemType QuestItemType;\n\n\t/** name of the bool dialogue variable which is set to true if the item is picked up (must be maxstacknum amount) */\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = ItemQuest)\n\tFName BoolToAdd;\n\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = ItemQuest)\n\tint32 MaxStackNum = 1;\n};\n\n"
  },
  {
    "path": "Source/SOrb/Items/ItemTemplates/SoUsableItemTemplate.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#include \"SoUsableItemTemplate.h\"\n#include \"SoItemTemplate.h\"\n#include \"Basic/SoGameSingleton.h\"\n#include \"Items/SoItemTooltipUI.h\"\n#include \"Effects/SoEffectBase.h\"\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoUsableItemTemplate::IsSlotCompatible(ESoItemSlot Slot) const\n{\n\treturn Slot == ESoItemSlot::EIS_Item0 ||\n\t\t   Slot == ESoItemSlot::EIS_Item1;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoUsableItemTemplate::CanBePutTogether(const USoItemTemplate* TheOther) const\n{\n\tauto* Other = Cast<USoUsableItemTemplate>(TheOther);\n\tif (Other == nullptr)\n\t\treturn false;\n\n\treturn (UsableType == Other->UsableType) && (UsableItemName == Other->UsableItemName);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nconst FText& USoUsableItemTemplate::GetSubTypeText() const\n{\n\treturn USoGameSingleton::GetTextForUsableType(UsableType);\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUsableItemTemplate::FillTooltipProperties(UObject* Tooltip) const\n{\n\tif (Effects.Num() == 0)\n\t\treturn;\n\n\tISoItemTooltipUI::Execute_AddEmptyLine(Tooltip);\n\tfor (auto EffectClass : Effects)\n\t\tif (EffectClass != nullptr)\n\t\t\tif (const USoEffectBase* DefaultEffect = Cast<USoEffectBase>(EffectClass->GetDefaultObject()))\n\t\t\t\tISoItemTooltipUI::Execute_AddEffectLine(Tooltip, DefaultEffect, true);\n}\n"
  },
  {
    "path": "Source/SOrb/Items/ItemTemplates/SoUsableItemTemplate.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#pragma once\n\n#include \"SoItemTemplate.h\"\n#include \"CharacterBase/SoIMortalTypes.h\"\n\n#include \"SoUsableItemTemplate.generated.h\"\n\nclass UMaterialInstance;\nclass UStaticMesh;\nclass ASoProjectile;\nclass USoEffectBase;\nclass UFMODEvent;\n\n/**\n*\n*/\nUCLASS()\nclass SORB_API USoUsableItemTemplate : public USoItemTemplate\n{\n\tGENERATED_BODY()\n\npublic:\n\n\tUSoUsableItemTemplate() { ItemType = ESoItemType::EIT_UsableItem; }\n\n\tvirtual void FillTooltipProperties(UObject* Tooltip) const override;\n\n\tbool IsSlotCompatible(ESoItemSlot Slot) const override;\n\tESoItemSlot GetDefaultSlot() const override { return ESoItemSlot::EIS_Item0; }\n\n\tbool IsEquipable() const override { return true; }\n\n\tbool IsStackable() const override { return StackSize > 1 || !bDestroyOnZeroAmount; }\n\tint32 GetMaxStackNum() const override { return StackSize; }\n\n\tbool CanBePutTogether(const USoItemTemplate* TheOther) const override;\n\n\tbool DestroyOnRunOut() const override { return bDestroyOnZeroAmount; }\n\n\tFName GetUsableItemName() const { return UsableItemName; }\n\n\tconst FText& GetSubTypeText() const override;\n\n\tUStaticMesh* GetStaticMesh() const { return Mesh; }\n\tUMaterialInstance* GetMaterial() const { return MaterialOverride; }\n\npublic:\n\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = ItemUsable, AssetRegistrySearchable)\n\tESoUsableItemType UsableType;\n\n\t// unique identifier of each type (e.g. black grenade, test stone, etc.)\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = ItemUsable, AssetRegistrySearchable)\n\tFName UsableItemName;\n\n\t// if > 1 more item can be stacked together\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = ItemUsable, AssetRegistrySearchable)\n\tint32 StackSize;\n\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = ItemUsable, AssetRegistrySearchable)\n\tbool bDestroyOnZeroAmount = true;\n\n\t/* droppable stuff / crossbow: */\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = ItemUsable)\n\tTSubclassOf<ASoProjectile> ProjectileType;\n\n\t/** .x: spline offset, .y: vertical offset */\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = ItemUsable)\n\tFVector2D SpawnOffset = FVector2D(20.0f, 30.0f);\n\n\t/* for potions */\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = ItemUsable)\n\tTArray<TSubclassOf<USoEffectBase>> Effects;\n\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = ItemUsable)\n\tfloat HealAmount = 0.0f;\n\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = ItemUsable)\n\tTMap<ESoDmgType, int32> HealthBonus;\n\t\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = ItemUsable)\n\tUFMODEvent* SFXOnUse;\n\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = Visual)\n\tUStaticMesh* Mesh;\n\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = Visual)\n\tUMaterialInstance* MaterialOverride;\n};\n"
  },
  {
    "path": "Source/SOrb/Items/ItemTemplates/SoWeaponTemplate.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#include \"SoWeaponTemplate.h\"\n\n#include \"Items/SoItemTooltipUI.h\"\n#include \"Character/SoCharacterStrike.h\"\n#include \"Basic/SoGameSingleton.h\"\n#include \"Basic/SoGameInstance.h\"\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoWeaponTemplate::PostLoad()\n{\n\tSuper::PostLoad();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nconst FText& USoWeaponTemplate::GetSubTypeText() const\n{\n\treturn USoGameSingleton::GetTextForWeaponType(WeaponType);\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoWeaponTemplate::FillTooltipProperties(UObject* Tooltip) const\n{\n\tISoItemTooltipUI::Execute_AddDamageLine(Tooltip, ESoDmgType::Physical, BaseDmg.Physical, true, WeaponType == ESoWeaponType::EWT_DualWield, false);\n\n\tISoItemTooltipUI::Execute_AddEmptyLine(Tooltip);\n\n\tISoItemTooltipUI::Execute_AddSpecialLine(Tooltip, SpecialStrike);\n\tISoItemTooltipUI::Execute_AddDamageLine(Tooltip, ESoDmgType::Physical, SpecialDmg.Physical, false, WeaponType == ESoWeaponType::EWT_DualWield, false);\n\n\tif (SpecialStrike != nullptr)\n\t{\n\t\tISoItemTooltipUI::Execute_AddParamWithFloatLine(Tooltip, ESoItemParam::EIP_Cooldown, SpecialStrike->GetCooldownTime());\n\t\tISoItemTooltipUI::Execute_AddParamWithBoolLine(Tooltip, ESoItemParamBool::EIPB_CooldownStopsInAir, !SpecialStrike->CanCountDownInAir_Implementation());\n\t}\n\n\tfor (const FSoCharacterStrikeData& StrikeData : SpecialStrike->GetCharacterStrikes())\n\t\tfor (const FSoStrikeEntry& Entry : StrikeData.StrikeList)\n\t\t\tfor (TSubclassOf<USoEffectBase> EffectClass : Entry.HitEffects)\n\t\t\t\tif (const USoEffectBase* DefaultEffect = Cast<USoEffectBase>(EffectClass->GetDefaultObject()))\n\t\t\t\t\tISoItemTooltipUI::Execute_AddEffectLine(Tooltip, DefaultEffect, false);\n\n\t// ISoItemTooltipUI::Execute_AddEmptyLine(Tooltip);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoWeaponTemplate::IsValidStrikeIndex(int32 Index, bool bSpecial) const\n{\n\tUSoCharacterStrike* StrikePtr = bSpecial ? SpecialStrike : PrimaryStrike;\n\treturn StrikePtr != nullptr && Index >= 0 && Index < StrikePtr->GetStrikeNum();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoWeaponTemplate::IsSlotCompatible(ESoItemSlot Slot) const\n{\n\treturn Slot == ESoItemSlot::EIS_Weapon0 || Slot == ESoItemSlot::EIS_Weapon1;\n}\n"
  },
  {
    "path": "Source/SOrb/Items/ItemTemplates/SoWeaponTemplate.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#pragma once\n\n#include \"SoItemTemplate.h\"\n#include \"CharacterBase/SoIMortalTypes.h\"\n#include \"Character/SoCharacterDataTypes.h\"\n\n#include \"SoWeaponTemplate.generated.h\"\n\nclass USoCharacterStrike;\nclass UStaticMesh;\n\n/**\n*\n*/\nUCLASS()\nclass SORB_API USoWeaponTemplate : public USoItemTemplate\n{\n\tGENERATED_BODY()\n\npublic:\n\n\tUSoWeaponTemplate() { ItemType = ESoItemType::EIT_Weapon; }\n\n\tvirtual void PostLoad() override;\n\n\tvirtual const FText& GetSubTypeText() const override;\n\n\tvirtual void FillTooltipProperties(UObject* Tooltip) const override;\n\n\tESoWeaponType GetWeaponType() const { return WeaponType; }\n\n\t// const TMap<ESoDamageType, int32>& GetDamageMap(bool bSpecialStrike) const { return bSpecialStrike ? SpecialDamage : BaseDamage; }\n\tconst FSoDmg& GetDmg(bool bSpecial) const { return bSpecial ? SpecialDmg : BaseDmg; }\n\n\tvirtual void GetStaticEffects(TArray<TSubclassOf<USoEffectBase>>& OutEffects) const override { OutEffects = StaticEffects; }\n\n\tbool IsValidStrikeIndex(int32 Index, bool bSpecial) const;\n\tUSoCharacterStrike* GetStrike(bool bSpecial) const { return bSpecial ? SpecialStrike : PrimaryStrike; }\n\n\n\tESoItemSlot GetDefaultSlot() const override { return ESoItemSlot::EIS_Weapon0; }\n\tbool IsSlotCompatible(ESoItemSlot Slot) const override;\n\n\tvirtual bool IsEquipable() const override { return true; }\n\n\tUStaticMesh* GetStaticMeshNew() const { return MeshNew; }\n\n\tint32 GetInterruptModifier() const { return InterruptModifier; }\n\tfloat GetCriticalMultiplier() const { return CriticalMultiplier; }\n\tfloat GetAutoAimDistance() const { return AutoAimDistance; }\n\n\tconst FSoAnimationSet& GetNewAnimations() const { return NewAnimations; }\n\n\tconst FLinearColor& GetTrailColor() const { return TrailColor; }\n\tconst FLinearColor& GetTrailAnimLight() const { return TrailAnimLight; }\n\n\tFName GetBoneName() const { return BoneName; }\n\tFName GetBoneNameSecondary() const { return BoneNameSecondary; }\n\tbool GetInverseRollAnimsIfArmed() const { return bInverseRollAnimsIfArmed; }\n\nprotected:\n\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = ItemWeapon, AssetRegistrySearchable)\n\tESoWeaponType WeaponType;\n\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = ItemWeapon)\n\tFSoDmg BaseDmg;\n\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = ItemWeapon)\n\tFSoDmg SpecialDmg;\n\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = ItemWeapon)\n\tTArray<TSubclassOf<USoEffectBase>> StaticEffects;\n\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = ItemWeapon)\n\tint32 InterruptModifier;\n\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = ItemWeapon)\n\tfloat CriticalMultiplier = 2.0f;\n\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = ItemWeapon)\n\tbool bInverseRollAnimsIfArmed = false;\n\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = ItemWeapon)\n\tfloat AutoAimDistance = 400;\n\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = ItemWeapon)\n\tUSoCharacterStrike* PrimaryStrike;\n\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = ItemWeapon)\n\tUSoCharacterStrike* SpecialStrike;\n\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = ItemWeapon)\n\tFSoAnimationSet NewAnimations;\n\n\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = ItemWeapon)\n\tFLinearColor TrailColor = FLinearColor(4.8f, 5.0f, 1.2f, 1.0f);\n\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = ItemWeapon)\n\tFLinearColor TrailAnimLight = FLinearColor(100.0f, 7.8f, 0.0f, 1.0f);\n\n\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = Visual)\n\tUStaticMesh* MeshNew;\n\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = Visual)\n\tFName BoneName = FName(\"Weapon_R\");\n\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = Visual)\n\tFName BoneNameSecondary = FName(\"Weapon_L\");\n};\n"
  },
  {
    "path": "Source/SOrb/Items/SoInventoryComponent.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#include \"SoInventoryComponent.h\"\n#include \"SoItem.h\"\n#include \"ItemTemplates/SoQuestItemTemplate.h\"\n#include \"SaveFiles/SoWorldState.h\"\n#include \"Basic/SoGameInstance.h\"\n#include \"Items/ItemTemplates/SoItemTemplateRuneStone.h\"\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// Sets default values for this component's properties\nUSoInventoryComponent::USoInventoryComponent()\n{\n\tPrimaryComponentTick.bCanEverTick = false;\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// Called when the game starts\nvoid USoInventoryComponent::BeginPlay()\n{\n\tSuper::BeginPlay();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoInventoryComponent::Save()\n{\n\tFSoWorldState::Get().WriteInventoryItemList(ItemList);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoInventoryComponent::Reload()\n{\n\tItemList.Empty();\n\tFSoWorldState::Get().ReadInventoryItemList(ItemList);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nint32 USoInventoryComponent::AddItem(const FSoItem& Item)\n{\n\t// handle stack\n\tif (Item.Template != nullptr && Item.Template->IsStackable())\n\t{\n\t\tint32 LastAddedIndex = -1;\n\t\tint32 AmountToAdd = Item.Amount;\n\t\tfor (int32 i = 0; i < ItemList.Num() && AmountToAdd > 0; ++i)\n\t\t\tif (ItemList[i].Template == Item.Template)\n\t\t\t{\n\t\t\t\tconst int32 CanBeAdded = FMath::Max(ItemList[i].Template->GetMaxStackNum() - ItemList[i].Amount, 0);\n\t\t\t\tItemList[i].Amount += FMath::Min(AmountToAdd, CanBeAdded);\n\t\t\t\tAmountToAdd -= CanBeAdded;\n\t\t\t\tLastAddedIndex = i;\n\t\t\t}\n\n\t\tif (AmountToAdd <= 0)\n\t\t\treturn LastAddedIndex;\n\n\t\tItemList.Add(Item);\n\t\tItemList.Last(0).Amount = AmountToAdd;\n\t\treturn ItemList.Num() - 1;\n\t}\n\n\tItemList.Add(Item);\n\treturn ItemList.Num() - 1;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoInventoryComponent::RemoveAndGetItem(int32 ItemIndex, int32 Amount, FSoItem& OutRemovedItem)\n{\n\tif (!ItemList.IsValidIndex(ItemIndex))\n\t\treturn false;\n\n\tOutRemovedItem = ItemList[ItemIndex];\n\tif (OutRemovedItem.Template == nullptr || !OutRemovedItem.Template->IsStackable() || OutRemovedItem.Amount == Amount)\n\t\tItemList.RemoveAt(ItemIndex);\n\telse\n\t{\n\t\tensure(OutRemovedItem.Amount > Amount);\n\t\tItemList[ItemIndex].Amount -= Amount;\n\t\tOutRemovedItem.Amount = Amount;\n\t}\n\n\treturn true;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoInventoryComponent::ModifyItemCount(int32 ItemIndex, bool bDelta, int32 Amount)\n{\n\tif (!ItemList.IsValidIndex(ItemIndex) || ItemList[ItemIndex].Template == nullptr)\n\t\treturn;\n\n\tif (ItemList[ItemIndex].Template->DestroyOnRunOut() &&\n\t\t((bDelta && ItemList[ItemIndex].Amount <= Amount) || (!bDelta && Amount == 0)))\n\t\tRemoveItem(ItemIndex, ItemList[ItemIndex].Amount);\n\telse\n\t{\n\t\tif (bDelta)\n\t\t\tItemList[ItemIndex].Amount -= Amount;\n\t\telse\n\t\t\tItemList[ItemIndex].Amount = Amount;\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nconst FSoItem& USoInventoryComponent::GetItem(int32 SlotIndex)\n{\n\tcheck(SlotIndex >= 0 && SlotIndex < ItemList.Num());\n\treturn ItemList[SlotIndex];\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoInventoryComponent::OrderRuneStones()\n{\n\t// 1. move runestones to another array\n\tTArray<FSoItem> RuneStones;\n\tfor (int32 Index = ItemList.Num() - 1; Index >= 0; --Index)\n\t{\n\t\tif (USoItemTemplateRuneStone* RuneStone = Cast<USoItemTemplateRuneStone>(ItemList[Index].Template))\n\t\t{\n\t\t\tRuneStones.Add(ItemList[Index]);\n\t\t\tItemList.RemoveAtSwap(Index);\n\t\t}\n\t}\n\n\t// 2. order runtestones\n\tRuneStones.Sort([](const FSoItem& First, const FSoItem& Second)\n\t{\n\t\tif (First.Template == nullptr || Second.Template == nullptr)\n\t\t\treturn false;\n\n\t\treturn First.Template->GetName() > Second.Template->GetName();\n\t});\n\n\t// 3. add ordered runestones to the back of ItemList\n\tItemList.Append(RuneStones);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoInventoryComponent::HasQuestItem(USoQuestItemTemplate* QuestItem) const\n{\n\tfor (const FSoItem& Item : ItemList)\n\t\tif (Item.Template == QuestItem)\n\t\t\treturn true;\n\n\treturn false;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoInventoryComponent::HasItem(USoItemTemplate* Template) const\n{\n\tfor (const FSoItem& Item : ItemList)\n\t\tif (Item.Template == Template)\n\t\t\treturn true;\n\n\treturn false;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUSoItemTemplate* USoInventoryComponent::FindQuestItem(FName QuestItemBoolValueName)\n{\n\tfor (int32 i = 0; i < ItemList.Num(); ++i)\n\t{\n\t\tUSoQuestItemTemplate* QuestTemplate = Cast<USoQuestItemTemplate>(ItemList[i].Template);\n\t\tif (QuestTemplate != nullptr &&QuestTemplate->BoolToAdd == QuestItemBoolValueName)\n\t\t\treturn ItemList[i].Template;\n\t}\n\treturn nullptr;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nint32 USoInventoryComponent::GetIndexFromTemplate(const USoItemTemplate* Template) const\n{\n\tfor (int32 i = 0; i < ItemList.Num(); ++i)\n\t\tif (ItemList[i].Template == Template)\n\t\t\treturn i;\n\n\treturn -1;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nint32 USoInventoryComponent::CalcItemCount(ESoItemType Type) const\n{\n\tint32 Count = 0;\n\n\tfor (const FSoItem& Item : ItemList)\n\t\tif (Item.Template != nullptr && Item.Template->GetItemType() == Type)\n\t\t\tCount += 1;\n\n\treturn Count;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nint32 USoInventoryComponent::CalcItemCountFromTemplate(USoItemTemplate* Template) const\n{\n\tint32 Count = 0;\n\n\tfor (const FSoItem& Item : ItemList)\n\t\tif (Item.Template == Template)\n\t\t\tCount += Item.Amount;\n\n\treturn Count;\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nint32 USoInventoryComponent::CalcItemCountForSlot(ESoItemSlot Slot) const\n{\n\tint32 Count = 0;\n\n\tfor (const FSoItem& Item : ItemList)\n\t\tif (Item.Template != nullptr && Item.Template->IsSlotCompatible(Slot))\n\t\t\tCount += 1;\n\n\treturn Count;\n}\n"
  },
  {
    "path": "Source/SOrb/Items/SoInventoryComponent.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#pragma once\n\n#include \"Components/ActorComponent.h\"\n#include \"Items/SoItem.h\"\n#include \"SoInventoryComponent.generated.h\"\n\nenum class ESoItemType : uint8;\nenum class ESoItemSlot : uint8;\nclass USoQuestItemTemplate;\nclass USoItemTemplate;\nDECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FSoItemChange, int32, ItemIndex);\n\n\nUCLASS(ClassGroup=(Custom), meta=(BlueprintSpawnableComponent))\nclass SORB_API USoInventoryComponent : public UActorComponent\n{\n\tGENERATED_BODY()\n\npublic:\n\t// Sets default values for this component's properties\n\tUSoInventoryComponent();\n\n\t// Called when the game starts\n\tvirtual void BeginPlay() override;\n\n\t// Loads the current items in ListName from the WorldState\n\tvoid Reload();\n\n\t// Saves the current items to the WorldState ListName\n\tvoid Save();\n\n\tUFUNCTION(BlueprintPure, Category = Item)\n\tint32 CalcItemCount(ESoItemType Type) const;\n\n\tUFUNCTION(BlueprintPure, Category = Item)\n\tint32 CalcItemCountFromTemplate(USoItemTemplate* Template) const;\n\n\tUFUNCTION(BlueprintPure, Category = Item)\n\tint32 CalcItemCountForSlot(ESoItemSlot Slot) const;\n\n\tUFUNCTION(BlueprintCallable, Category = Item)\n\tint32 AddItem(const FSoItem& ItemDesc);\n\n\tUFUNCTION()\n\tbool RemoveAndGetItem(int32 SlotIndex, int32 Amount, FSoItem& OutRemovedItem);\n\n\tUFUNCTION(BlueprintCallable, Category = Item)\n\tbool RemoveItem(int32 SlotIndex, int32 Amount)\n\t{\n\t\tFSoItem Ignored;\n\t\treturn RemoveAndGetItem(SlotIndex, Amount, Ignored);\n\t}\n\n\tvoid ModifyItemCount(int32 ItemIndex, bool bDelta, int32 Amount = 1);\n\n\tUFUNCTION(BlueprintPure, Category = Item)\n\tbool HasQuestItem(USoQuestItemTemplate* QuestItem) const;\n\n\tUFUNCTION(BlueprintPure, Category = Item)\n\tbool HasItem(USoItemTemplate* Template) const;\n\n\tUSoItemTemplate* FindQuestItem(FName QuestItemBoolValueName);\n\n\t/** returns the first item index matching the input template, or -1 if there isn't any */\n\tUFUNCTION(BlueprintPure, Category = Item)\n\tint32 GetIndexFromTemplate(const USoItemTemplate* Template) const;\n\n\tbool IsValidIndex(int32 Index) { return Index >= 0 && Index < ItemList.Num(); }\n\tconst FSoItem& GetItem(int32 SlotIndex);\n\n\tvoid OrderRuneStones();\n\n\n\tUFUNCTION(BlueprintCallable, Category = Item)\n\tconst TArray<FSoItem>& GetItemList() const { return ItemList; }\n\n\tTArray<FSoItem>& GetItemList() { return ItemList; }\n\nprotected:\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere)\n\tTArray<FSoItem> ItemList;\n};\n"
  },
  {
    "path": "Source/SOrb/Items/SoItem.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#include \"SoItem.h\"\n\n#include \"Basic/Helpers/SoStringHelper.h\"\n#include \"Items/ItemTemplates/SoWeaponTemplate.h\"\n\n\nDEFINE_LOG_CATEGORY(LogSoItem);\n\nFSoItem FSoItem::Invalid;\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool FSoItem::operator==(const FSoItem& Other) const\n{\n\treturn Template == Other.Template && Amount == Other.Amount;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSoItem::UpdateSHA1(FSHA1& HashState) const\n{\n\tUSoStringHelper::UpdateSHA1_UObject(HashState, Template);\n\tUSoStringHelper::UpdateSHA1_Int32(HashState, Amount);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSoItem::GetStaticEffects(TArray<TSubclassOf<USoEffectBase>>& OutEffects) const\n{\n\tif (Template != nullptr)\n\t\tTemplate->GetStaticEffects(OutEffects);\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUTexture2D* FSoItem::GetIcon()\n{\n\treturn (Template == nullptr) ? nullptr : Template->GetIcon();\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nint32 FSoItem::GetValue(bool bBuyPrice) const\n{\n\tif (Template == nullptr)\n\t\treturn 0;\n\n\tconst int32 BuyPrice = Template->GetValue();\n\tif (bBuyPrice)\n\t\treturn BuyPrice;\n\n\treturn BuyPrice * 3 / 4;\n}\n"
  },
  {
    "path": "Source/SOrb/Items/SoItem.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#pragma once\n#include \"CoreMinimal.h\"\n#include \"Misc/SecureHash.h\"\n\n#include \"CharacterBase/SoIMortalTypes.h\"\n\n#include \"SoItem.generated.h\"\n\nDECLARE_LOG_CATEGORY_EXTERN(LogSoItem, All, All);\n\nclass UTexture2D;\nclass USoItemTemplateRuneStone;\nclass USoEffectBase;\nclass USoItemTemplate;\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// an item or a stack of items in an inventory or in any other storage\nUSTRUCT(BlueprintType)\nstruct FSoItem\n{\n\tGENERATED_USTRUCT_BODY()\n\npublic:\n\tFSoItem() {};\n\n\t/** effects active while the item is active, some type does not have this */\n\tvoid GetStaticEffects(TArray<TSubclassOf<USoEffectBase>>& OutEffects) const;\n\n\t/** Template->GetIcon() or nullptr */\n\tUTexture2D* GetIcon();\n\n\tint32 GetValue(bool bBuyPrice) const;\n\n\t// weapon only functions:\n\n\tbool operator==(const FSoItem& Other) const;\n\tvoid UpdateSHA1(FSHA1& HashState) const;\n\n\t// only call on valid RuneStone!!!\n\tUSoItemTemplateRuneStone* GetTemplateAsRuneStone();\n\n\t// only call on valid RuneStone!!!\n\tconst USoItemTemplateRuneStone* GetTemplateAsRuneStone() const;\n\npublic:\n\tstatic FSoItem Invalid;\n\npublic:\n\t/** reference to the data asset which defines this item */\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite)\n\tUSoItemTemplate* Template = nullptr;\n\n\t/**\n\t *  can mean actual amount, or the amount the item can be used in given type - depending on the Template\n\t *  item is may or may not destroyed on 0 amount. Max value is also defined by the template (max stack size).\n\t *  for most items it's just const 1\n\t */\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite)\n\tint32 Amount = 1;\n};\n"
  },
  {
    "path": "Source/SOrb/Items/SoItemHelper.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#include \"SoItemHelper.h\"\n\n#include \"Engine/ObjectLibrary.h\"\n#include \"ItemTemplates/SoItemTemplate.h\"\n#include \"SoItem.h\"\n#include \"ItemTemplates/SoItemTemplateRuneStone.h\"\n#include \"ItemTemplates/SoWeaponTemplate.h\"\n#include \"Basic/Helpers/SoStaticHelper.h\"\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUSoItemTemplateRuneStone* FSoItem::GetTemplateAsRuneStone()\n{\n\tUSoItemTemplateRuneStone* RuneStone = Cast<USoItemTemplateRuneStone>(Template);\n\tensure(RuneStone != nullptr);\n\treturn RuneStone;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nconst USoItemTemplateRuneStone* FSoItem::GetTemplateAsRuneStone() const\n{\n\tUSoItemTemplateRuneStone* RuneStone = Cast<USoItemTemplateRuneStone>(Template);\n\tensure(RuneStone != nullptr);\n\treturn RuneStone;\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoItemHelper::LoadAllItemsIntoMemory()\n{\n\t// NOTE: All paths must NOT have the forward slash \"/\" at the end.\n\tUObjectLibrary* ObjectLibrary = UObjectLibrary::CreateLibrary(USoItemTemplate::StaticClass(), true, GIsEditor);\n\tObjectLibrary->AddToRoot();\n\tObjectLibrary->LoadAssetDataFromPaths({ TEXT(\"/Game\") });\n\tObjectLibrary->LoadAssetsFromAssetData();\n\tObjectLibrary->RemoveFromRoot();\n}\n"
  },
  {
    "path": "Source/SOrb/Items/SoItemHelper.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#pragma once\n#include \"UObject/Object.h\"\n#include \"CharacterBase/SoIMortalTypes.h\"\n#include \"SoItem.h\"\n\n#include \"SoItemHelper.generated.h\"\n\nclass USoWeaponTemplate;\n\n/** because struct can't have functions, that's why */\nUCLASS()\nclass SORB_API USoItemHelper : public UObject\n{\n\tGENERATED_BODY()\n\npublic:\n\n\tUFUNCTION(BlueprintPure, Category = Item)\n\tstatic int32 GetValue(const FSoItem& Item, bool bBuyPrice) { return Item.GetValue(bBuyPrice); }\n\n\t/**\n\t * Loads all Items from the filesystem into memory\n\t */\n\tstatic void LoadAllItemsIntoMemory();\n};\n"
  },
  {
    "path": "Source/SOrb/Items/SoItemTooltipUI.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#include \"SoItemTooltipUI.h\"\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUSoItemTooltipUI::USoItemTooltipUI(const FObjectInitializer& PCIP)\n\t: Super(PCIP)\n{\n}\n"
  },
  {
    "path": "Source/SOrb/Items/SoItemTooltipUI.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#pragma once\n#include \"UObject/Interface.h\"\n\n#include \"SoItemTooltipUI.generated.h\"\n\n/**\n *\n */\nUINTERFACE(BlueprintType, Blueprintable)\nclass SORB_API USoItemTooltipUI : public UInterface\n{\n\tGENERATED_UINTERFACE_BODY()\n};\n\n\n/**\n *\n */\nclass SORB_API ISoItemTooltipUI\n{\n\tGENERATED_IINTERFACE_BODY()\n\n\tUFUNCTION(BlueprintNativeEvent, BlueprintCallable, Category = ItemTooltip)\n\tvoid AddDamageLine(ESoDmgType Type, int32 Value, bool bShowDamageIcon, bool bDualWield, bool bAsBonus);\n\n\tUFUNCTION(BlueprintNativeEvent, BlueprintCallable, Category = ItemTooltip)\n\tvoid AddParamWithFloatLine(ESoItemParam Param, float Value);\n\n\tUFUNCTION(BlueprintNativeEvent, BlueprintCallable, Category = ItemTooltip)\n\tvoid AddParamWithIntLine(ESoItemParam Param, int32 Value);\n\n\tUFUNCTION(BlueprintNativeEvent, BlueprintCallable, Category = ItemTooltip)\n\tvoid AddParamWithBoolLine(ESoItemParamBool Param, bool bValue);\n\n\tUFUNCTION(BlueprintNativeEvent, BlueprintCallable, Category = ItemTooltip)\n\tvoid AddSpecialLine(USoCharacterStrike* CharacterStrike);\n\n\tUFUNCTION(BlueprintNativeEvent, BlueprintCallable, Category = ItemTooltip)\n\tvoid AddEffectLine(const USoEffectBase* Effect, bool bFirstLine);\n\n\tUFUNCTION(BlueprintNativeEvent, BlueprintCallable, Category = ItemTooltip)\n\tvoid AddEmptyLine();\n};\n"
  },
  {
    "path": "Source/SOrb/Items/SoItemTypes.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#pragma once\n\n#include \"SoItemTypes.generated.h\"\n\n\n////////////////////////////////////////////////////////////////////////////////////////\nUENUM(BlueprintType)\nenum class ESoItemType : uint8\n{\n\t// all melee weapons\n\tEIT_Weapon\t\t\tUMETA(DisplayName = \"Weapon\"),\n\t\n\tEIT_Shard\t\t\tUMETA(DisplayName = \"Shard\"),\n\n\t// can be equipped to the \"item0-2\" slots\n\tEIT_UsableItem\t\tUMETA(DisplayName = \"UsableItem\"),\n\n\tEIT_Jewelry\t\t\tUMETA(DisplayName = \"Jewelry\"),\n\t\n\t// books, keys, quest items\n\tEIT_QuestItem\t\tUMETA(DisplayName = \"QuestItem\"),\n\tEIT_Key\t\t\t\tUMETA(DisplayName = \"Key\"),\n\tEIT_MemoryStone\t\tUMETA(DisplayName = \"MemoryStone\"),\n\t\n\tEIT_RuneStone\t\tUMETA(DisplayName = \"RuneStone\"),\n\n\tEIT_MAX\t\t\t\tUMETA(DisplayName = \"Max\"),\n};\n\n////////////////////////////////////////////////////////////////////////////////////////\nUENUM(BlueprintType)\nenum class ESoWeaponType : uint8\n{\n\tEWT_OneHanded\t\t\tUMETA(DisplayName = \"OneHanded\"),\n\tEWT_DualWield\t\t\tUMETA(DisplayName = \"DualWield\"),\n\tEWT_TwoHanded\t\t\tUMETA(DisplayName = \"TwoHanded\"),\n\n\tEWT_MAX\t\t\t\t\tUMETA(Hidden),\n};\n\n////////////////////////////////////////////////////////////////////////////////////////\nUENUM(BlueprintType)\nenum class ESoShardType : uint8\n{\n\tOffensive\t\tUMETA(DisplayName = \"Offensive\"),\n\tDefensive\t\tUMETA(DisplayName = \"Defensive\"),\n\tSpecial\t\t\tUMETA(DisplayName = \"Special\"),\n\n\tNumOf\t\t\t\tUMETA(Hidden),\n};\n\n\n////////////////////////////////////////////////////////////////////////////////////////\nUENUM(BlueprintType)\nenum class ESoUsableItemType : uint8\n{\n\t// switch to drop mode on use\n\tEUIT_Throwable\t\t\t\tUMETA(DisplayName = \"Throwable\"),\n\t// drink anim on use\n\tEUIT_Potion\t\t\t\t\tUMETA(DisplayName = \"Potion\"),\n\t\n\tEUIT_Spell\t\t\t\t\tUMETA(DisplayName = \"Spell\"),\n\n\tEUIT_Hammer\t\t\t\t\tUMETA(DisplayName = \"Hammer\"),\n\n\t// fast, needs bullets, they fly horizontal\n\tEUIT_Crossbow\t\t\t\tUMETA(DisplayName = \"Crossbow\"),\n\t\n\tEUIT_MAX\t\t\t\t\tUMETA(Hidden),\n};\n\n////////////////////////////////////////////////////////////////////////////////////////\nUENUM(BlueprintType)\nenum class ESoQuestItemType : uint8\n{\n\t// can be used to open things /o.o/\n\tEQIT_Key\t\t\t\tUMETA(DisplayName = \"Key\"),\n\tEQIT_KeyLikeItem\t\tUMETA(DisplayName = \"KeyLikeItem\"),\n\tEQIT_Item\t\t\t\tUMETA(DisplayName = \"Item\"),\n\tEQIT_MemoryStone\t\tUMETA(DisplayName = \"MemoryStone\"),\n\n\t// can be read\n\tEQIT_Book\t\t\t\tUMETA(Hidden),\n\n\tEQIT_MAX\t\t\t\tUMETA(Hidden),\n};\n\n\n////////////////////////////////////////////////////////////////////////////////////////\nUENUM(BlueprintType)\nenum class ESoItemSlot : uint8\n{\n\tEIS_ShardDefensive0\t\tUMETA(DisplayName = \"Defensive0\"),\n\tEIS_ShardDefensive1\t\tUMETA(DisplayName = \"Defensive1\"),\n\tEIS_ShardOffensive0\t\tUMETA(DisplayName = \"Offensive0\"),\n\tEIS_ShardOffensive1\t\tUMETA(DisplayName = \"Offensive1\"),\n\tEIS_ShardSpecial\t\tUMETA(DisplayName = \"Special\"),\n\n\t// if the amount of item slots changes make sure that the related codes in SoPlayerCharacterSheet are updated properly\n\t// (Soulkeeper handling, item toggle)\n\tEIS_Item0\t\tUMETA(DisplayName = \"Item0\"),\n\tEIS_Item1\t\tUMETA(DisplayName = \"Item1\"),\n\t// EIS_Item2\t\tUMETA(DisplayName = \"Item2\"),\n\n\tEIS_Weapon0\t\tUMETA(DisplayName = \"Weapon0\"),\n\tEIS_Weapon1\t\tUMETA(DisplayName = \"Weapon1\"),\n\t// EIS_Weapon2\t\tUMETA(DisplayName = \"Weapon2\"),\n\n\tEIS_Max\t\t\tUMETA(DisplayName = \"Max\"),\n};\n\n\n////////////////////////////////////////////////////////////////////////////////////////\nUENUM(BlueprintType)\nenum class ESoItemParamType : uint8\n{\n\tEIPT_NiceStuff\t\t\tUMETA(DisplayName = \"NiceStuff\"),\n\tEIPT_NotNiceStuff\t\tUMETA(DisplayName = \"NotNiceStuff\"),\n\tEIPT_MAX\t\t\t\tUMETA(Hidden),\n};\n\n////////////////////////////////////////////////////////////////////////////////////////\nUENUM(BlueprintType)\nenum class ESoItemParam : uint8\n{\n\t// ints\n\tEIP_Health\t\t\t\tUMETA(DisplayName = \"Health\"),\n\tEIP_SpellCapacityCost\tUMETA(DisplayName = \"SpellCapacityCost\"),\n\tEIP_SpellUsageCount\t\tUMETA(DisplayName = \"SpellUsageCount\"),\n\n\t// floats\n\tEIP_AttackSpeed\t\t\tUMETA(DisplayName = \"AttackSpeed\"),\n\tEIP_Cooldown\t\t\tUMETA(DisplayName = \"Cooldown\"),\n\n\tEIP_MAX\t\t\t\t\tUMETA(Hidden),\n};\n\n////////////////////////////////////////////////////////////////////////////////////////\nUENUM(BlueprintType)\nenum class ESoItemParamBool : uint8\n{\n\tEIPB_SpellOnlyInAir\t\t\t\tUMETA(DisplayName = \"SpellOnlyInAir\"),\n\tEIPB_SpellRestricted\t\t\tUMETA(DisplayName = \"SpellRestricted\"),\n\tEIPB_CooldownStopsInAir\t\t\tUMETA(DisplayName = \"CooldownStopsInAir\"),\n\n\tEIP_MAX\t\t\t\t\tUMETA(Hidden),\n};\n\n\n////////////////////////////////////////////////////////////////////////////////////////\nUENUM(BlueprintType)\nenum class ESoItemPropertyBlock : uint8\n{\n\tEIPB_Damage\t\t\tUMETA(DisplayName = \"Damage\"),\n\tEIPB_Effect\t\t\tUMETA(DisplayName = \"Effect\"),\n\tEIPB_SideEffect\t\tUMETA(DisplayName = \"SideEffect\"),\n\n\tEIPB_Max\t\t\tUMETA(Hidden),\n};\n"
  },
  {
    "path": "Source/SOrb/Items/SoTraderComponent.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#include \"SoTraderComponent.h\"\n\n#include \"SaveFiles/SoWorldState.h\"\n#include \"Items/ItemTemplates/SoItemTemplate.h\"\n#include \"Basic/SoGameMode.h\"\n#include \"Interactables/SoNPC.h\"\n#include \"Basic/SoGameInstance.h\"\n#include \"Basic/Helpers/SoStaticHelper.h\"\n\nDEFINE_LOG_CATEGORY_STATIC(LogSoUITraderComponent, All, All);\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// Sets default values for this component's properties\nUSoTraderComponent::USoTraderComponent()\n{\n\tPrimaryComponentTick.bCanEverTick = false;\n\tbWantsInitializeComponent = true;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoTraderComponent::InitializeComponent()\n{\n\tcheck(GetOwner());\n\n\tconst FString OwnerName = GetOwner()->GetName();\n\n\tPurchasedListName = FName(*(OwnerName + \"_Purchased\"));\n\tSoldListName = FName(*(OwnerName + \"_Sold\"));\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoTraderComponent::BeginPlay()\n{\n\tSuper::BeginPlay();\n\n\tASoGameMode::Get(this).OnPostLoad.AddDynamic(this, &USoTraderComponent::OnReload);\n\tOnReload();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoTraderComponent::EndPlay(const EEndPlayReason::Type EndPlayReason)\n{\n\tASoGameMode::Get(this).OnPostLoad.RemoveDynamic(this, &USoTraderComponent::OnReload);\n\tSuper::EndPlay(EndPlayReason);\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoTraderComponent::OnReload()\n{\n\t// construct ActualList from StartingList + AlreadySoldItems\n\tTArray<FSoItem> AlreadySoldItems;\n\n\tFSoWorldState::Get().ReadItemList(SoldListName, AlreadySoldItems);\n\tActualList.Empty();\n\t// ActualList still follows the initial order, only the AlreadySoldItems does not, but that one isn't displayed anyway\n\n\tASoNPC* NPC = Cast<ASoNPC>(GetOwner());\n\tif (NPC == nullptr)\n\t{\n\t\tUE_LOG(LogSoUITraderComponent, Error, TEXT(\"USoTraderComponent has a non-npc owner %s\"), *GetOwner()->GetName());\n\t\treturn;\n\t}\n\n\tfor (const FSoItem& Item : NPC->GetStartingItemList())\n\t{\n\t\tif (Item.Template != nullptr)\n\t\t{\n\t\t\tif (!Item.Template->IsStackable())\n\t\t\t{\n\t\t\t\tif (AlreadySoldItems.RemoveSingleSwap(Item) == 0)\n\t\t\t\t\tActualList.Add(Item);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tFSoItem StillInShopItem = Item;\n\t\t\t\tfor (int32 i = AlreadySoldItems.Num() - 1; i >= 0 && StillInShopItem.Amount > 0; --i)\n\t\t\t\t\tif (AlreadySoldItems[i].Template == Item.Template)\n\t\t\t\t\t{\n\t\t\t\t\t\tconst int32 AmountToSubtract = FMath::Min(AlreadySoldItems[i].Amount, StillInShopItem.Amount);\n\t\t\t\t\t\tStillInShopItem.Amount -= AmountToSubtract;\n\t\t\t\t\t\tAlreadySoldItems[i].Amount -= AmountToSubtract;\n\t\t\t\t\t}\n\n\t\t\t\tif (StillInShopItem.Amount > 0)\n\t\t\t\t\tActualList.Add(StillInShopItem);\n\t\t\t}\n\t\t}\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFSoItem USoTraderComponent::PurchaseItem(int32 ItemIndex, int32 Amount)\n{\n\tif (ItemIndex < 0 || ItemIndex > ActualList.Num())\n\t{\n\t\tUE_LOG(LogSoUITraderComponent, Warning, TEXT(\"Invalid item was bought?! (OnItemPurchased)\"));\n\t\treturn{};\n\t}\n\n\tFSoItem Item = ActualList[ItemIndex];\n\tif (Item.Template == nullptr)\n\t\treturn{};\n\n\tif (Item.Template->IsStackable() && Item.Amount != Amount)\n\t{\n\t\tensure(Item.Amount > Amount);\n\t\tActualList[ItemIndex].Amount -= Amount;\n\t\tItem.Amount = Amount;\n\t\tFSoWorldState::Get().GetItemList(SoldListName).Add(Item);\n\t}\n\telse\n\t{\n\t\tFSoWorldState::Get().GetItemList(SoldListName).Add(Item);\n\t\tActualList.RemoveAt(ItemIndex);\n\t}\n\treturn Item;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFSoItem USoTraderComponent::BuyBackItem(int32 ItemIndex, int32 Amount)\n{\n\tTArray<FSoItem>& ItemList =\tFSoWorldState::Get().GetItemList(PurchasedListName);\n\tif (ItemIndex < 0 || ItemIndex > ItemList.Num())\n\t{\n\t\tUE_LOG(LogSoUITraderComponent, Warning, TEXT(\"Invalid item index?! (BuyBackItem)\"));\n\t\treturn{};\n\t}\n\n\tFSoItem Item = ItemList[ItemIndex];\n\tif (Item.Template == nullptr)\n\t\treturn{};\n\n\tif (Item.Template->IsStackable() && Item.Amount != Amount)\n\t{\n\t\tensure(Item.Amount > Amount);\n\t\tItemList[ItemIndex].Amount -= Amount;\n\t\tItem.Amount = Amount;\n\t\treturn Item;\n\t}\n\n\tItemList.RemoveAt(ItemIndex);\n\treturn Item;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoTraderComponent::OnItemSold(const FSoItem& Item, int32 SoldAmount)\n{\n\tif (Item.Template == nullptr)\n\t\treturn;\n\n\tTArray<FSoItem>& ItemList = FSoWorldState::Get().GetItemList(PurchasedListName);\n\tif (Item.Template->IsStackable())\n\t{\n\t\tfor (FSoItem& ItemInList : ItemList)\n\t\t\tif (ItemInList.Template == Item.Template)\n\t\t\t{\n\t\t\t\tconst int32 CanBeAdded = FMath::Min(Item.Template->GetMaxStackNum() - ItemInList.Amount, SoldAmount);\n\t\t\t\tItemInList.Amount += CanBeAdded;\n\t\t\t\tSoldAmount -= CanBeAdded;\n\t\t\t\tif (SoldAmount == 0)\n\t\t\t\t\treturn;\n\t\t\t}\n\n\t\tItemList.Add(Item);\n\t\tItemList.Last(0).Amount = SoldAmount;\n\t}\n\telse\n\t\tItemList.Add(Item);\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nconst TArray<FSoItem>& USoTraderComponent::GetPurchasedList()\n{\n\treturn FSoWorldState::Get().GetItemList(PurchasedListName);\n}\n"
  },
  {
    "path": "Source/SOrb/Items/SoTraderComponent.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#pragma once\n\n#include \"Components/ActorComponent.h\"\n#include \"Items/SoItem.h\"\n#include \"SoTraderComponent.generated.h\"\n\n\nUCLASS(ClassGroup=(Custom), meta=(BlueprintSpawnableComponent))\nclass SORB_API USoTraderComponent : public UActorComponent\n{\n\tGENERATED_BODY()\n\npublic:\n\t// Sets default values for this component's properties\n\tUSoTraderComponent();\n\n\tvirtual void InitializeComponent() override;\n\n\tvirtual void BeginPlay() override;\n\tvirtual void EndPlay(const EEndPlayReason::Type EndPlayReason) override;\n\n\tUFUNCTION(BlueprintCallable)\n\tvoid OnReload();\n\n\t/** Player bought something */\n\tUFUNCTION(BlueprintCallable, Category = \"Trade\")\n\tFSoItem PurchaseItem(int32 ItemIndex, int32 Amount);\n\n\t/** Player bought something back*/\n\tUFUNCTION(BlueprintCallable, Category = \"Trade\")\n\tFSoItem BuyBackItem(int32 ItemIndex, int32 Amount);\n\n\t/** Player sold something */\n\tUFUNCTION(BlueprintCallable, Category = \"Trade\")\n\tvoid OnItemSold(const FSoItem& Item, int32 SoldAmount);\n\n\tUFUNCTION(BlueprintCallable, Category = \"Trade\")\n\tconst TArray<FSoItem>& GetActualList() { return ActualList;\t}\n\n\tUFUNCTION(BlueprintCallable, Category = \"Trade\")\n\tconst TArray<FSoItem>& GetPurchasedList();\n\nprotected:\n\n\t/** the items the merchant can sell right now */\n\tUPROPERTY(BlueprintReadOnly)\n\tTArray<FSoItem> ActualList;\n\n\t/** bought from player, he can buy back */\n\tFName PurchasedListName;\n\n\t/** already sold items, these are serialized to get the ActualList */\n\tFName SoldListName;\n};\n"
  },
  {
    "path": "Source/SOrb/Kinematic/SoKHelper.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#include \"SoKHelper.h\"\n\n#include \"EngineUtils.h\"\n\n#include \"Tasks/SoKTask.h\"\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USokHelper::StartStopLoopedSounds(TArray<struct FSoKProcess>& Processes, bool bStop)\n{\n\tfor (FSoKProcess& Process : Processes)\n\t\tfor (int32 i = 0; i < Process.GetTasks().Num(); ++i)\n\t\t\tif (USoKTPlayLoopedSound* PLTask = Cast<USoKTPlayLoopedSound>(Process.GetTasks()[i]))\n\t\t\t\tPLTask->StartStopSFX(bStop);\n}\n"
  },
  {
    "path": "Source/SOrb/Kinematic/SoKHelper.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#pragma once\n#include \"Kismet/BlueprintFunctionLibrary.h\"\n#include \"SoKProcess.h\"\n#include \"SoKHelper.generated.h\"\n\nUCLASS()\nclass SORB_API USokHelper : public UBlueprintFunctionLibrary\n{\n\tGENERATED_BODY()\n\npublic:\n\t\n\tUFUNCTION(BlueprintCallable, Category = Kinematic)\n\tstatic void StartStopLoopedSounds(UPARAM(Ref)TArray<FSoKProcess>& Processes, bool bStop);\n};\n"
  },
  {
    "path": "Source/SOrb/Kinematic/SoKProcess.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#include \"SoKProcess.h\"\n\n#include \"TimerManager.h\"\n#include \"Engine/World.h\"\n\n#include \"Tasks/SoKTask.h\"\n\nDEFINE_LOG_CATEGORY(LogSoKinematicSystem);\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSoKProcess::Initialize(TArray<USceneComponent*>& TargetComponents, AActor* RematerializeLocation, int32 CrushDamage)\n{\n\tDECLARE_SCOPE_CYCLE_COUNTER(TEXT(\"SoKProcess - Initialize\"), STAT_SoKProcessInitialize, STATGROUP_SoKinematic);\n\n\tActiveTaskID = 0;\n\n#if WITH_EDITOR\n\tfor (int32 i = 0; i < Tasks.Num(); ++i)\n\t{\n\t\tif (Tasks[i] == nullptr)\n\t\t{\n\t\t\tif (TargetComponents.Num() > 0 && TargetComponents[0] != nullptr)\n\t\t\t\tUE_LOG(LogSoKinematicSystem,\n\t\t\t\t\t   Error,\n\t\t\t\t\t   TEXT(\"%s: Task is nullptr! It is removed now, but it should not happen outside of the editor!\"), \n\t\t\t\t\t   *TargetComponents[0]->GetOwner()->GetName())\n\t\t\telse\n\t\t\t\tUE_LOG(LogSoKinematicSystem, Error, TEXT(\"Task is nullptr! It is removed now, but it should not happen outside of the editor!\"));\n\t\t}\n\t}\n\tTasks.RemoveAll([](const USoKTask* Ptr) { return Ptr == nullptr; });\n#endif\n\n\tif (!Tasks.IsValidIndex(ActiveTaskID))\n\t{\n\t\tbRun = false;\n\t\tUE_LOG(LogSoKinematicSystem, Error, TEXT(\"Process with invalid Task ID = %d!\"), ActiveTaskID);\n\t}\n\n\tUSceneComponent* Target = GetTarget(TargetComponents);\n\tif (Target != nullptr)\n\t{\n\t\tfor (auto& Task : Tasks)\n\t\t\tTask->Initialize(Target, RematerializeLocation, CrushDamage);\n\n\t\tif (bRun)\n\t\t{\n\n\t\t\tif (FirstTimeOffset < KINDA_SMALL_NUMBER)\n\t\t\t\tTasks[ActiveTaskID]->Start(Target, true);\n\t\t\telse\n\t\t\t{\n\t\t\t\t// handle initial delay\n\t\t\t\tif (bWorkAhead)\n\t\t\t\t{\n\t\t\t\t\t// hard working solution\n\t\t\t\t\tif (Tasks[ActiveTaskID])\n\t\t\t\t\t\tTasks[ActiveTaskID]->Start(Target, true);\n\t\t\t\t\tTick(TargetComponents, FirstTimeOffset);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tbRun = false;\n\t\t\t\t\tFirstTimeOffsetCounter = FirstTimeOffset;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSoKProcess::ForceFinish(TArray<USceneComponent*>& TargetComponents)\n{\n\tFirstTimeOffsetCounter = -1.0f;\n\tfor (int32 i = 0; i < 10 && bRun; ++i)\n\t\tTick(TargetComponents, 10.0f);\n\n\tif (bRun)\n\t\tUE_LOG(LogSoKinematicSystem, Error, TEXT(\"ForceFinish failed - is this process infinite?\"));\n}\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nfloat FSoKProcess::Tick(TArray<USceneComponent*>& TargetComponents, float DeltaSeconds)\n{\n\tDECLARE_SCOPE_CYCLE_COUNTER(TEXT(\"SoKProcess - Tick\"), STAT_SoKProcessTick, STATGROUP_SoKinematic);\n\n\tif (FirstTimeOffsetCounter > 0.0f)\n\t{\n\t\tFirstTimeOffsetCounter -= DeltaSeconds;\n\n\t\tif (FirstTimeOffsetCounter <= 0.0f)\n\t\t{\n\t\t\tDeltaSeconds = FMath::Abs(FirstTimeOffsetCounter);\n\n\t\t\tbRun = true;\n\t\t\tif (Tasks.IsValidIndex(ActiveTaskID) && Tasks[ActiveTaskID])\n\t\t\t\tTasks[ActiveTaskID]->Start(GetTarget(TargetComponents), true);\n\t\t\tFirstTimeOffsetCounter = -1.0f;\n\t\t}\n\t}\n\n\n\tif (bRun)\n\t{\n\t\tUSceneComponent* Target = GetTarget(TargetComponents);\n#if WITH_EDITOR\n\t\tif (Target == nullptr)\n\t\t\treturn DeltaSeconds;\n\n\t\tconst int32 MaxIterationNum = 20;\n\t\tint32 IterationNum = 0;\n#endif\n\t\tFSoTaskExecutionResults TaskResults = Tasks[ActiveTaskID]->Execute(DeltaSeconds, !bCurrentlyReverse);\n\t\tif (TaskResults.bChangeDirection)\n\t\t\tbCurrentlyReverse = !bCurrentlyReverse;\n\n\t\twhile (TaskResults.RestTime > KINDA_SMALL_NUMBER)\n\t\t{\n#if WITH_EDITOR\n\t\t\tIterationNum += 1;\n\t\t\tif (IterationNum > MaxIterationNum)\n\t\t\t{\n\t\t\t\tUE_LOG(LogSoKinematicSystem, Error, TEXT(\"Too many iteration - process does not have progress at all. Hopeless tasks!\"));\n\t\t\t\treturn 0.0f;\n\t\t\t}\n#endif\n\t\t\t// handle task switch\n\t\t\tActiveTaskID += bCurrentlyReverse ? -1 : 1;\n\t\t\tif (bLoop)\n\t\t\t{\n\t\t\t\tif (ActiveTaskID < 0)\n\t\t\t\t{\n\t\t\t\t\tActiveTaskID = 0;\n\t\t\t\t\tbCurrentlyReverse = false;\n\t\t\t\t}\n\t\t\t\telse if (ActiveTaskID >= Tasks.Num())\n\t\t\t\t{\n\t\t\t\t\tif (bPlayReverse)\n\t\t\t\t\t{\n\t\t\t\t\t\tbCurrentlyReverse = true;\n\t\t\t\t\t\tActiveTaskID = Tasks.Num() - 1;\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t\tActiveTaskID = 0;\n\t\t\t\t}\n\t\t\t\tTasks[ActiveTaskID]->Start(Target, !bCurrentlyReverse);\n\t\t\t\tTaskResults = Tasks[ActiveTaskID]->Execute(TaskResults.RestTime, !bCurrentlyReverse);\n\t\t\t\tif (TaskResults.bChangeDirection)\n\t\t\t\t\tbCurrentlyReverse = !bCurrentlyReverse;\n\t\t\t} // bLoop\n\t\t\telse\n\t\t\t{\n\t\t\t\tif (ActiveTaskID < 0 || ActiveTaskID >= Tasks.Num())\n\t\t\t\t{\n\t\t\t\t\tif (bPlayReverse && ActiveTaskID >= Tasks.Num())\n\t\t\t\t\t{\n\t\t\t\t\t\tbCurrentlyReverse = true;\n\t\t\t\t\t\tActiveTaskID = Tasks.Num() - 1;\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tbRun = false;\n\t\t\t\t\t\treturn TaskResults.RestTime;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tTasks[ActiveTaskID]->Start(Target, !bCurrentlyReverse);\n\t\t\t\tTaskResults = Tasks[ActiveTaskID]->Execute(TaskResults.RestTime, !bCurrentlyReverse);\n\t\t\t\tif (TaskResults.bChangeDirection)\n\t\t\t\t\tbCurrentlyReverse = !bCurrentlyReverse;\n\t\t\t}\n\t\t} // RestTime > 0.0f\n\n\t\treturn -1.0f;\n\t} // bRun\n\n\treturn DeltaSeconds;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUSceneComponent* FSoKProcess::GetTarget(TArray<USceneComponent*>& TargetComponents) const\n{\n#if WITH_EDITOR\n\tif (TargetIndex < 0 || TargetIndex >= TargetComponents.Num() || TargetComponents[TargetIndex] == nullptr)\n\t{\n\t\tUE_LOG(LogSoKinematicSystem, Error, TEXT(\"Process with invalid target ID!\"));\n\t\treturn nullptr;\n\t}\n#endif\n\treturn TargetComponents[TargetIndex];\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSoKProcess::Start(bool bReverse, TArray<USceneComponent*>& TargetComponents)\n{\n\tDECLARE_SCOPE_CYCLE_COUNTER(TEXT(\"SoKProcess - Start\"), STAT_SoKProcessStart, STATGROUP_SoKinematic);\n\n\tauto* Target = GetTarget(TargetComponents);\n#if WITH_EDITOR\n\tif (Target == nullptr)\n\t\treturn;\n\n\tif (Tasks.Num() == 0)\n\t{\n\t\t// I would really like to sleep at this point\n\t\tUE_LOG(LogSoKinematicSystem, Error, TEXT(\"FSoKProcess::Start, but no task to run...\"));\n\t\treturn;\n\t}\n#endif\n\n\tbRun = true;\n\tbCurrentlyReverse = bReverse;\n\tActiveTaskID = bReverse ? Tasks.Num() - 1 : 0;\n\n\tTasks[ActiveTaskID]->Start(Target, !bCurrentlyReverse);\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFSoKProcess FSoKProcess::CopyParamsButNoTasks() const\n{\n\tFSoKProcess NewProcess = *this;\n\tNewProcess.Tasks.Empty();\n\treturn NewProcess;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSoKProcess::CopyParamsButNoTasks(const FSoKProcess& Ref)\n{\n\tbRun\t\t\t\t= Ref.bRun;\n\tbPlayReverse\t\t= Ref.bPlayReverse;\n\tbLoop\t\t\t\t= Ref.bLoop;\n\tbWorkAhead\t\t\t= Ref.bWorkAhead;\n\tFirstTimeOffset\t\t= Ref.FirstTimeOffset;\n\tTargetIndex\t\t\t= Ref.TargetIndex;\n\tbCurrentlyReverse\t= Ref.bCurrentlyReverse;\n\tActiveTaskID\t\t= Ref.ActiveTaskID;\n}\n"
  },
  {
    "path": "Source/SOrb/Kinematic/SoKProcess.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#pragma once\n\n#include \"SoKProcess.generated.h\"\n\nDECLARE_LOG_CATEGORY_EXTERN(LogSoKinematicSystem, Log, All);\n\nDECLARE_STATS_GROUP(TEXT(\"SoKinematic\"), STATGROUP_SoKinematic, STATCAT_Advanced);\n\nclass USoKTask;\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUSTRUCT(BlueprintType)\nstruct FSoKProcess\n{\n\tGENERATED_USTRUCT_BODY()\npublic:\n\tFSoKProcess() {};\n\n\t// has to be called once at the beginning\n\tvoid Initialize(TArray<USceneComponent*>& TargetComponents, AActor* RematerializeLocation, int32 CrushDamage);\n\n\t// it's just a struct, not an AActor, functions must be called!\n\t// return value: rest time < - KINDA_SMALL_NUMBER -> still running\n\tfloat Tick(TArray<USceneComponent*>& TargetComponents, float DeltaSeconds);\n\n\t// come on\n\tvoid Start(bool bReverse, TArray<USceneComponent*>& TargetComponents);\n\n\t/** simply calls Tick 10 times with 10 seconds, but stops calling it if it is finished */\n\tvoid ForceFinish(TArray<USceneComponent*>& TargetComponents);\n\n\t/** Stops the process. This can totally leave the object in invalid state - who know what happens if the object isn't reset outside of this function!!! */\n\tvoid Terminate() { bRun = false; FirstTimeOffsetCounter = -1.0f; ActiveTaskID = 0; }\n\n\tbool IsActive() const { return bRun || FirstTimeOffsetCounter > 0.0f; }\n\n\tvoid SetDirection(bool bForward) { bCurrentlyReverse = !bForward; }\n\tvoid ReverseDirection() { bCurrentlyReverse = !bCurrentlyReverse; }\n\n\t/** Creates a new process with the params but without any task */\n\tFSoKProcess CopyParamsButNoTasks() const;\n\n\t/** resets the params based on the other process */\n\tvoid CopyParamsButNoTasks(const FSoKProcess& Ref);\n\n\tTArray<USoKTask*>& GetTasks() { return Tasks; }\nprivate:\n\n\tUSceneComponent* GetTarget(TArray<USceneComponent*>& TargetComponents) const;\n\nprotected:\n\t// indicates if the process is running or not\n\t// default true: process starts automatically, otherwise it will be set to true later (in Run())\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite)\n\tbool bRun = false;\n\n\t// true -> after the last task tasks are executed again in reverse order\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite)\n\tbool bPlayReverse = false;\n\n\t// true -> after the last task the first will begin again\n\t// can work with bPlayReverse, then the { Tasks, TasksBackwards } loops\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite)\n\tbool bLoop = false;\n\n\t// if true, FirstTimeOffset is Executed at the beginning if bRun\n\t// if false, FirstTimeOffset is waited at the beginning if bRun\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite)\n\tbool bWorkAhead = false;\n\n\t// if it should run by default it will simulate FirstTimeOffset time at the beginning so it's easier to setup cool offsets\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite)\n\tfloat FirstTimeOffset = 0.f;\n\n\t// the index of the SceneComponent this process modifies in the SoKinematicActor::TargetComponents array\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (ClampMin = \"0\", ClampMax = \"100\"))\n\tint32 TargetIndex = 0;\n\n\tUPROPERTY(Instanced, EditAnywhere, NoClear, BlueprintReadWrite)\n\tTArray<USoKTask*> Tasks;\n\nprivate:\n\n\t// if the tasks are executed in reverse order currently\n\tbool bCurrentlyReverse = false;\n\n\t// active task = Tasks[ActiveTaskID]\n\tint32 ActiveTaskID = 0;\n\n\tfloat FirstTimeOffsetCounter = -1.0f;\n};\n"
  },
  {
    "path": "Source/SOrb/Kinematic/SoKinematicActor.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#include \"SoKinematicActor.h\"\n\n#include \"MeshMaterialShaderType.h\"\n#include \"Engine/World.h\"\n\n#include \"SoKProcess.h\"\n#include \"SoKHelper.h\"\n#include \"Basic/SoGameMode.h\"\n#include \"Basic/Helpers/SoStaticHelper.h\"\n#include \"Character/SoCharacter.h\"\n#include \"SplineLogic/SoMarker.h\"\n#include \"Basic/SoEventHandler.h\"\n#include \"Basic/Helpers/SoPlatformHelper.h\"\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nASoKinematicActor::ASoKinematicActor()\n{\n\tPrimaryActorTick.bCanEverTick = true;\n\tbAllowTickBeforeBeginPlay = false;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoKinematicActor::OnConstruction(const FTransform& Transform)\n{\n\tSuper::OnConstruction(Transform);\n\n\tInitStateOfProcesses.Empty();\n\tfor (int32 i = 0; i < Processes.Num(); ++i)\n\t\tInitStateOfProcesses.Add(Processes[i].CopyParamsButNoTasks());\n\n\tInitialTransform = GetActorTransform();\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoKinematicActor::PostInitializeComponents()\n{\n\tSuper::PostInitializeComponents();\n\n\t// init if not yet done\n\tif (InitStateOfProcesses.Num() != Processes.Num())\n\t{\n\t\tInitStateOfProcesses.Empty();\n\t\tfor (int32 i = 0; i < Processes.Num(); ++i)\n\t\t\tInitStateOfProcesses.Add(Processes[i].CopyParamsButNoTasks());\n\n\t\tInitialTransform = GetActorTransform();\n\t}\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoKinematicActor::BeginPlay()\n{\n\tSuper::BeginPlay();\n\n\tif (bResetInBeginPlay)\n\t\tResetKinematicActor();\n\telse\n\t\tfor (int32 i = 0; i < Processes.Num(); ++i)\n\t\t\tProcesses[i].Initialize(TargetComponents, this, CrushDamageOnPushAndStuck);\n\n\tif (bResetOnReload)\n\t\tASoGameMode::Get(this).OnPostLoad.AddDynamic(this, &ASoKinematicActor::ResetKinematicActor);\n\n\tif (bResetOnRematerialize)\n\t\tif (ASoCharacter* SoCharacter = USoStaticHelper::GetPlayerCharacterAsSoCharacter(this))\n\t\t\tSoCharacter->OnPlayerRematerialized.AddDynamic(this, &ASoKinematicActor::ResetKinematicActor);\n\n\tif (bCanDisableTickWhileNoProcessIsActive)\n\t\tSetActorTickEnabled(true);\n\n\tPostBeginPlayBP();\n\n\tif (ShouldHandleWhitelistedSplines())\n\t{\n\t\tbool bInWhiteListed = false;\n\t\tUSoEventHandlerHelper::SubscribeWhitelistedSplines(this, WhitelistedSplines);\n\t\tif (ASoSpline* PlayerSpline = USoStaticHelper::GetPlayerSplineLocation(this).GetSpline())\n\t\t\tfor (TAssetPtr<ASoSpline>& AssetPtr : WhitelistedSplines)\n\t\t\t\tif (AssetPtr.Get() == PlayerSpline)\n\t\t\t\t{\n\t\t\t\t\tbInWhiteListed = true;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\tSetActorTickEnabled(bInWhiteListed);\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoKinematicActor::EndPlay(const EEndPlayReason::Type EndPlayReason)\n{\n\tif (bResetOnReload)\n\t\tASoGameMode::Get(this).OnPostLoad.RemoveDynamic(this, &ASoKinematicActor::ResetKinematicActor);\n\n\tif (bResetOnRematerialize)\n\t\tif (ASoCharacter* SoCharacter = USoStaticHelper::GetPlayerCharacterAsSoCharacter(this))\n\t\t\tSoCharacter->OnPlayerRematerialized.RemoveDynamic(this, &ASoKinematicActor::ResetKinematicActor);\n\n\tif (ShouldHandleWhitelistedSplines())\n\t\tUSoEventHandlerHelper::UnsubscribeWhitelistedSplines(this);\n\n\tSuper::EndPlay(EndPlayReason);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// Called every frame\nvoid ASoKinematicActor::Tick(float DeltaTime)\n{\n\tDECLARE_SCOPE_CYCLE_COUNTER(TEXT(\"SoKinematicActor - Tick\"), STAT_SoKinematicActorTick, STATGROUP_SoKinematic);\n\n\tSuper::Tick(DeltaTime);\n\n\tif (IsPendingKill() || TargetComponents.Num() == 0 || TargetComponents[0] == nullptr || !TargetComponents[0]->IsRegistered())\n\t\treturn;\n\n\tbool bWasAnyActive = false;\n\n\t// update velocity of target component 0\n\tconst FVector OldLocation = TargetComponents[0]->GetComponentLocation();\n\n\tfor (int32 i = 0; i < Processes.Num(); ++i)\n\t{\n\t\tif (Processes[i].IsActive())\n\t\t{\n\t\t\tbWasAnyActive = true;\n\t\t\tconst float RestTime = Processes[i].Tick(TargetComponents, DeltaTime * ProcessTimeMultiplier);\n\t\t\tif (RestTime > -KINDA_SMALL_NUMBER)\n\t\t\t\tOnProcessFinished.Broadcast(i, RestTime);\n\t\t}\n\t}\n\n\tconst FVector NewLocation = TargetComponents[0]->GetComponentLocation();\n\t// someone might needs this (e.g. the ball if it bounces on it)\n\tTargetComponents[0]->ComponentVelocity = (NewLocation - OldLocation) / DeltaTime;\n\n\tif (!bWasAnyActive && bCanDisableTickWhileNoProcessIsActive)\n\t\tSetActorTickEnabled(false);\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFSoSplinePoint ASoKinematicActor::GetSplineLocationI_Implementation() const\n{\n\tDECLARE_SCOPE_CYCLE_COUNTER(TEXT(\"SoKinematicActor - GetSplineLocationI_Implementation\"), STAT_SoKinematicActorGetSplineLocationI_Implementation, STATGROUP_SoKinematic);\n\n\tif (RematerializePoint != nullptr)\n\t{\n\t\t// need the interface call, because some rematerialize point implements that function differently, they don't override the base function of the marker\n\t\tif (RematerializePoint->GetClass()->ImplementsInterface(USoSplineWalker::StaticClass()))\n\t\t\treturn ISoSplineWalker::Execute_GetSplineLocationI(RematerializePoint);\n\n\t\treturn RematerializePoint->GetSplineLocation();\n\t}\n\n\treturn FSoSplinePoint{};\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoKinematicActor::HandleWhitelistedSplinesEntered_Implementation()\n{\n\tSetActorTickEnabled(true);\n\tUSokHelper::StartStopLoopedSounds(Processes, false);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoKinematicActor::HandleWhitelistedSplinesLeft_Implementation()\n{\n\tSetActorTickEnabled(false);\n\tUSokHelper::StartStopLoopedSounds(Processes, true);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoKinematicActor::StartProcess(int32 ProcessID, bool bReverse)\n{\n\tDECLARE_SCOPE_CYCLE_COUNTER(TEXT(\"SoKinematicActor - StartProcess\"), STAT_SoKinematicActorStartProcess, STATGROUP_SoKinematic);\n\n\tif (bCanDisableTickWhileNoProcessIsActive)\n\t\tSetActorTickEnabled(true);\n\n#if WITH_EDITOR\n\tif (ProcessID >= Processes.Num())\n\t{\n\t\tUE_LOG(LogSoKinematicSystem, Error, TEXT(\"%s: Startprocess called with invalid ProcessID(%d / %d)\"), *GetActorLabel(), ProcessID, Processes.Num());\n\t\treturn;\n\t}\n#endif\n \tProcesses[ProcessID].Start(bReverse, TargetComponents);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoKinematicActor::ReverseProcessDirection(int32 ProcessID)\n{\n\tDECLARE_SCOPE_CYCLE_COUNTER(TEXT(\"SoKinematicActor - ReverseProcessDirection\"), STAT_ReverseProcessDirection, STATGROUP_SoKinematic);\n\n\tif (bCanDisableTickWhileNoProcessIsActive)\n\t\tSetActorTickEnabled(true);\n\n#if WITH_EDITOR\n\tif (ProcessID >= Processes.Num())\n\t{\n\t\tUE_LOG(LogSoKinematicSystem, Error, TEXT(\"%s: ReverseProcessDirection called with invalid ProcessID(%d / %d)\"), *GetActorLabel(), ProcessID, Processes.Num());\n\t\treturn;\n\t}\n#endif\n\tProcesses[ProcessID].ReverseDirection();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoKinematicActor::SetProcessDirection(int32 ProcessID, bool bForward)\n{\n\tDECLARE_SCOPE_CYCLE_COUNTER(TEXT(\"SoKinematicActor - SetProcessDirection\"), STAT_SetProcessDirection, STATGROUP_SoKinematic);\n\n\tif (bCanDisableTickWhileNoProcessIsActive)\n\t\tSetActorTickEnabled(true);\n\n#if WITH_EDITOR\n\tif (ProcessID >= Processes.Num())\n\t{\n\t\tUE_LOG(LogSoKinematicSystem, Error, TEXT(\"%s: ReverseProcessDirection called with invalid ProcessID(%d / %d)\"), *GetActorLabel(), ProcessID, Processes.Num());\n\t\treturn;\n\t}\n#endif\n\tProcesses[ProcessID].SetDirection(bForward);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoKinematicActor::StartProcessAndTick(int32 ProcessID, bool bReverse, float DeltaTime)\n{\n\tDECLARE_SCOPE_CYCLE_COUNTER(TEXT(\"SoKinematicActor - StartProcessAndTick\"), STAT_StartProcessAndTick, STATGROUP_SoKinematic);\n\n\tStartProcess(ProcessID, bReverse);\n\tif (Processes.IsValidIndex(ProcessID))\n\t\tProcesses[ProcessID].Tick(TargetComponents, DeltaTime);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoKinematicActor::ForceFinishProcess(int32 ProcessID)\n{\n\tif (Processes.IsValidIndex(ProcessID))\n\t\tProcesses[ProcessID].ForceFinish(TargetComponents);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoKinematicActor::TerminateProcess(int32 ProcessID)\n{\n\tif (Processes.IsValidIndex(ProcessID))\n\t\tProcesses[ProcessID].Terminate();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool ASoKinematicActor::IsProcessActive(int32 Index) const\n{\n\treturn Index >= 0 && Index < Processes.Num() && Processes[Index].IsActive();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool ASoKinematicActor::HasAnyActiveProcess() const\n{\n\tfor (const FSoKProcess& Process : Processes)\n\t\tif (Process.IsActive())\n\t\t\treturn true;\n\n\treturn false;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoKinematicActor::ResetKinematicActor()\n{\n\tSetActorTransform(InitialTransform);\n\n\tensure(Processes.Num() == InitStateOfProcesses.Num());\n\tfor (int32 i = 0; i < Processes.Num(); ++i)\n\t\tProcesses[i].CopyParamsButNoTasks(InitStateOfProcesses[i]);\n\n\tfor (int32 i = 0; i < Processes.Num(); ++i)\n\t\tProcesses[i].Initialize(TargetComponents, this, CrushDamageOnPushAndStuck);\n\n\tif (bCanDisableTickWhileNoProcessIsActive)\n\t\tSetActorTickEnabled(true);\n\n\tOnResetKinematicActorBP();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool ASoKinematicActor::ShouldHandleWhitelistedSplines() const\n{\n\tif (USoPlatformHelper::HasWeakHardware())\n\t\treturn WhitelistedSplines.Num() > 0;\n\n\treturn WhitelistedSplines.Num() > 0 && (!bUseWhitelistedSplinesOnlyOnSwitch);\n}"
  },
  {
    "path": "Source/SOrb/Kinematic/SoKinematicActor.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#pragma once\n\n#include \"Basic/SoEventHandler.h\"\n#include \"SoKProcess.h\"\n#include \"GameFramework/Actor.h\"\n#include \"SplineLogic/SoSplineWalker.h\"\n#include \"SoKinematicActor.generated.h\"\n\nclass ASoMarker;\n\nDECLARE_DYNAMIC_MULTICAST_DELEGATE_TwoParams(FKKinematicDelegateIntFloat, int32, ProcessIndex, float, RestTime);\n\nUCLASS()\nclass SORB_API ASoKinematicActor : public AActor, public ISoSplineWalker, public ISoEventHandler\n{\n\tGENERATED_BODY()\n\npublic:\n\t// Sets default values for this component's properties\n\tASoKinematicActor();\n\n\tvirtual void OnConstruction(const FTransform& Transform) override;\n\tvirtual void PostInitializeComponents() override;\n\tvirtual void BeginPlay() override;\n\tvirtual void EndPlay(const EEndPlayReason::Type EndPlayReason) override;\n\tvirtual void Tick(float DeltaSeconds) override;\n\n\n\t// spline walker interface - used to provide rematerialize location\n\tFSoSplinePoint GetSplineLocationI_Implementation() const override;\n\tvoid SetSplineLocation_Implementation(const FSoSplinePoint& SplinePoint, bool bUpdateOrientation) {};\n\tvoid OnPushed_Implementation(const FVector& DeltaMovement, float DeltaSeconds, bool bStuck, AActor* RematerializeLocation, int32 DamageAmountIfStuck, bool bForceDamage) {};\n\n\tvirtual void HandleWhitelistedSplinesEntered_Implementation() override;\n\tvirtual void HandleWhitelistedSplinesLeft_Implementation() override;\n\n\tUFUNCTION(BlueprintImplementableEvent, Category = Kinematic)\n\tvoid PostBeginPlayBP();\n\n\tUFUNCTION(BlueprintCallable, Category = Kinematic)\n\tvoid StartProcess(int32 ProcessID, bool bReverse);\n\n\tUFUNCTION(BlueprintCallable, Category = Kinematic)\n\tvoid StartProcessAndTick(int32 ProcessID, bool bReverse, float DeltaTime);\n\n\t/** simply calls Tick 10 times with 10 seconds, but stops calling it if it is finished */\n\tUFUNCTION(BlueprintCallable, Category = Kinematic)\n\tvoid ForceFinishProcess(int32 ProcessID);\n\n\t/** Stops the process. This can totally leave the object in invalid state - who know what happens if the object isn't reset outside of this function!!! */\n\tUFUNCTION(BlueprintCallable, Category = Kinematic)\n\tvoid TerminateProcess(int32 ProcessID);\n\n\tUFUNCTION(BlueprintCallable, Category = Kinematic)\n\tvoid ReverseProcessDirection(int32 ProcessID);\n\n\tUFUNCTION(BlueprintCallable, Category = Kinematic)\n\tvoid SetProcessDirection(int32 ProcessID, bool bForward);\n\n\tUFUNCTION(BlueprintPure, Category = Process)\n\tbool IsProcessActive(int32 Index) const;\n\n\tUFUNCTION(BlueprintPure, Category = Process)\n\tbool HasAnyActiveProcess() const;\n\n\t/**\n\t * called after the process is terminated - if ever\n\t * RestTime: the not used time from this tick\n\t*/\n\tUPROPERTY(BlueprintAssignable)\n\tFKKinematicDelegateIntFloat OnProcessFinished;\n\nprotected:\n\n\tUFUNCTION(BlueprintCallable, Category = \"KinematicActor\")\n\tvoid ResetKinematicActor();\n\n\t/** Called after reset */\n\tUFUNCTION(BlueprintImplementableEvent, Category = \"KinematicActor\")\n\tvoid OnResetKinematicActorBP();\n\n\tbool ShouldHandleWhitelistedSplines() const;\n\nprotected:\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = \"KinematicActor\")\n\tTArray<FSoKProcess> Processes;\n\n\t// Processes effects an USceneComponent based on a stored index\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = \"KinematicActor\")\n\tTArray<USceneComponent*> TargetComponents;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = \"KinematicActor\")\n\tfloat ProcessTimeMultiplier = 1.0f;\n\n\t/** If set the character will suffer CrushDamageOnPushAndStuck and can rematerialize at this location instead of instant death */\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = \"KinematicActor\")\n\tASoMarker* RematerializePoint;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = \"KinematicActor\")\n\tint32 CrushDamageOnPushAndStuck = 2;\n\n\n\tUPROPERTY(EditAnywhere, BlueprintReadOnly, Category = \"KinematicActor\")\n\tbool bResetOnRematerialize = false;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadOnly, Category = \"KinematicActor\")\n\tbool bResetOnReload = false;\n\n\t/** has to be used if the actor is moving all the time - otherwise it will stay in invalid state after level reactivate */\n\tUPROPERTY(EditAnywhere, BlueprintReadOnly, Category = \"KinematicActor\")\n\tbool bResetInBeginPlay = false;\n\n\tUPROPERTY(EditDefaultsOnly, BlueprintReadWrite, Category = \"KinematicActor\")\n\tbool bCanDisableTickWhileNoProcessIsActive = true;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = \"KinematicActor\")\n\tTArray<TAssetPtr<ASoSpline>> WhitelistedSplines;\n\n\t/** weak hardware instead of switch now, but the name is kept because it is already used :( */\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = \"KinematicActor\")\n\tbool bUseWhitelistedSplinesOnlyOnSwitch = false;\n\n\t/** Generated from Processes, does not have the tasks, only the process params. Used when the actor must be reset */\n\tTArray<FSoKProcess> InitStateOfProcesses;\n\n\tFTransform InitialTransform;\n};\n"
  },
  {
    "path": "Source/SOrb/Kinematic/Tasks/SoKTProcessControl.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#include \"SoKTProcessControl.h\"\n#include \"Kinematic/SoKinematicActor.h\"\n#include \"SoKTask.h\"\n\n//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoKTProcessStart::Start(USceneComponent* Target, const bool bForward)\n{\n\tOwner = Cast<ASoKinematicActor>(Target->GetOwner());\n\tbStarted = false;\n\tbFinished = false;\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFSoTaskExecutionResults USoKTProcessStart::Execute(const float DeltaSeconds, const bool bForward)\n{\n\tif (Owner == nullptr)\n\t{\n\t\tUE_LOG(LogSoKinematicSystem, Error, TEXT(\"USoKTProcessStart error: invalid owner!\"));\n\t\treturn { 0.0f };\n\t}\n\n\tif (!bStarted)\n\t{\n\t\tif (bTickOnStart)\n\t\t\tOwner->StartProcessAndTick(ProcessToStart, bStartReverse, DeltaSeconds);\n\t\telse\n\t\t\tOwner->StartProcess(ProcessToStart, bStartReverse);\n\n\t\tbStarted = true;\n\n\t\tif (!bSynchrone)\n\t\t\treturn {DeltaSeconds};\n\n\t\tOwner->OnProcessFinished.AddUniqueDynamic(this, &USoKTProcessStart::OnProcessFinished);\n\t}\n\n\tif (bFinished)\n\t\treturn {TimeAfterFinished};\n\n\treturn { -KINDA_SMALL_NUMBER };\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoKTProcessStart::OnProcessFinished(int32 ProcessIndex, float RestTime)\n{\n\tif (ProcessIndex == ProcessToStart)\n\t{\n\t\tbFinished = true;\n\t\tOwner->OnProcessFinished.RemoveDynamic(this, &USoKTProcessStart::OnProcessFinished);\n\t\tTimeAfterFinished = RestTime;\n\t}\n}\n"
  },
  {
    "path": "Source/SOrb/Kinematic/Tasks/SoKTProcessControl.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#pragma once\n#include \"Kinematic/SoKinematicActor.h\"\n#include \"SoKTask.h\"\n#include \"SoKTProcessControl.generated.h\"\n\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n/**\n *  Used to start other processes\n *  Should be *after* the started process in the process array (with > index)\n */\nUCLASS(BlueprintType, EditInlineNew)\nclass SORB_API USoKTProcessStart :public USoKTask\n{\n\tGENERATED_BODY()\n\npublic:\n\n\tUSoKTProcessStart() {};\n\tvirtual void Start(USceneComponent* Target, const bool bForward) override;\n\tvirtual FSoTaskExecutionResults Execute(const float DeltaSeconds, const bool bForward) override;\n\n\tUFUNCTION()\n\tvirtual void OnProcessFinished(int32 ProcessIndex, float RestTime);\n\nprotected:\n\n\t/**\n\t *  Synchrone: task is ready when the started process is over | otherwise: task is finished immediately, time is not taken\n\t */\n\tUPROPERTY(EditAnywhere, Category = Params)\n\tbool bSynchrone = true;\n\n\tUPROPERTY(EditAnywhere, Category = Params)\n\tint32 ProcessToStart;\n\n\tUPROPERTY(EditAnywhere, Category = Params)\n\tbool bStartReverse;\n\n\tUPROPERTY(EditAnywhere, Category = Params)\n\tbool bTickOnStart = true;\n\n\tbool bStarted = false;\n\tASoKinematicActor* Owner = nullptr;\n\n\tbool bFinished;\n\tfloat TimeAfterFinished;\n};\n"
  },
  {
    "path": "Source/SOrb/Kinematic/Tasks/SoKTask.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#include \"SoKTask.h\"\n\n#include \"DestructibleComponent.h\"\n#include \"Kismet/GameplayStatics.h\"\n\n#include \"Components/PrimitiveComponent.h\"\n#include \"Curves/CurveFloat.h\"\n#include \"CollisionQueryParams.h\"\n#include \"SplineLogic/SoSplineHelper.h\"\n#include \"SplineLogic/SoSplineWalker.h\"\n#include \"Kinematic/SoKProcess.h\"\n#include \"CharacterBase/SoMortal.h\"\n#include \"Basic/SoAudioManager.h\"\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoKTask::Initialize(USceneComponent* Target, AActor* InRematerializeLocation, int32 InCrushDamage)\n{\n\tRematerializeLocation = InRematerializeLocation;\n\tCrushDamage = InCrushDamage;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFSoTaskExecutionResults USoKTWait::Execute(float DeltaSeconds, bool bForward)\n{\n\tCurrentTime += DeltaSeconds;\n\treturn {CurrentTime - TimeToWait};\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoKTCallFunction::Initialize(USceneComponent* Target, AActor* InRematerializeLocation, int32 InCrushDamage)\n{\n\tif (AActor* OwnerActor = Target->GetOwner())\n\t{\n\t\tif (FunctionNameForward != NAME_None)\n\t\t\tBindDelegate(OwnerActor, FunctionNameForward, ForwardFunction);\n\t\tif (FunctionNameBackwards != NAME_None)\n\t\t\tBindDelegate(OwnerActor, FunctionNameBackwards, BackwardsFunction);\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoKTCallFunction::BindDelegate(AActor* OwnerActor, FName FunctionName, FSoKNotify& FunctionDelegate)\n{\n\tif (UFunction* Func = OwnerActor->FindFunction(FunctionName))\n\t{\n\t\tif (Func->ParmsSize > 0)\n\t\t{\n\t\t\tUE_LOG(LogSoKinematicSystem, Warning, TEXT(\"USoKTCallFunction inside %s has a function (%s) that expects parameters.\"), *OwnerActor->GetName(), *FunctionName.ToString());\n\t\t}\n\t\telse\n\t\t{\n\t\t\tFunctionDelegate.BindUFunction(OwnerActor, FunctionName);\n\t\t}\n\t}\n\telse\n\t{\n\t\tUE_LOG(LogSoKinematicSystem, Error, TEXT(\"USoKTCallFunction inside %s does NOT have function with name = %s\"), *OwnerActor->GetName(), *FunctionName.ToString());\n\t}\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoKTCallFunction::Start(USceneComponent* Target, bool bForward)\n{\n\tif (bForward)\n\t\tForwardFunction.ExecuteIfBound();\n\telse\n\t\tBackwardsFunction.ExecuteIfBound();\n}\n\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoKTActivateComponent::Start(USceneComponent* Target, bool bForward)\n{\n\tif (bForward)\n\t{\n\t\tTarget->Activate(bReset);\n\t}\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoKTPlaySound::Start(USceneComponent* Target, bool bForward)\n{\n\tif (bForward)\n\t{\n\t\tif (bAttached)\n\t\t\tUSoAudioManager::PlaySoundAttached(SFX, Target, NAME_None, FVector::ZeroVector, EAttachLocation::SnapToTarget);\n\t\telse\n\t\t\tUSoAudioManager::PlaySoundAtLocation(Target->GetOwner(), SFX, Target->GetComponentTransform());\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoKTPlaySoundForReversePlay::Start(USceneComponent* Target, bool bForward)\n{\n\tif (!bForward)\n\t{\n\t\tif (bAttached)\n\t\t\tUSoAudioManager::PlaySoundAttached(SFX, Target, NAME_None, FVector::ZeroVector, EAttachLocation::SnapToTarget);\n\t\telse\n\t\t\tUSoAudioManager::PlaySoundAtLocation(Target->GetOwner(), SFX, Target->GetComponentTransform());\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoKTPlayLoopedSound::Start(USceneComponent* Target, bool bForward)\n{\n\tif (bForward)\n\t{\n\t\tif (FMODComponent == nullptr)\n\t\t\tFMODComponent = USoAudioManager::PlaySoundAttached(SFX, Target, NAME_None, FVector::ZeroVector, EAttachLocation::SnapToTarget);\n\t\telse\n\t\t\tUSoAudioManager::PlayComponentIfNotPlaying(FMODComponent);\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoKTPlayLoopedSound::StartStopSFX(bool bStop)\n{\n\tif (FMODComponent != nullptr)\n\t{\n\t\tif (bStop)\n\t\t\tFMODComponent->Stop();\n\t\telse\n\t\t\tFMODComponent->Play();\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoKTTimeBasedTransform::Start(USceneComponent* Target, bool bForward)\n{\n\tCurrentTime = bForward ? 0.0f : TimeInSec;\n\tTargetComponent = Target;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFVector USoKTTimeBasedTransform::GetOffset(float StartPercent, float EndPercent) const\n{\n\tUE_LOG(LogSoKinematicSystem, Error, TEXT(\"USoKTimeBasedTransformer::GetOffset() called, but it should be overriden and should not be called directly!\"));\n\treturn FVector(0.0f, 0.0f, 0.0f);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFSoTaskExecutionResults USoKTTimeBasedTransform::Execute(float DeltaSeconds, bool bForward)\n{\n\tconst float LastTime = CurrentTime;\n\tfloat RestTime = UpdateCurrentTime(TimeInSec, DeltaSeconds * (bForward ? 1 : -1), CurrentTime);\n\n\t// calc offset based on time\n\tconst float ActualPercent = CurrentTime / TimeInSec;\n\tconst float LastPercent = LastTime / TimeInSec;\n\n\t// get offset from child class\n\tconst FVector Offset = GetOffset(LastPercent, ActualPercent);\n\n\tif (IsRotation())\n\t{\n\t\tAddDeltaRotation(Offset, IsLocalAxis(), CollisionType, DeltaSeconds);\n\t\treturn { RestTime };\n\t}\n\n\tconst float AppliedPercent = AddDeltaOffset(Offset, IsLocalAxis(), CollisionType, DeltaSeconds);\n\tbool bChangeDirection = false;\n\tconst bool bNotFinished = (AppliedPercent < 1.0f - KINDA_SMALL_NUMBER);\n\tif (bNotFinished)\n\t{\n\t\tCurrentTime = LastTime + (CurrentTime - LastTime) * AppliedPercent;\n\t\tswitch (CollisionType)\n\t\t{\n\t\t\tcase ESoTaskCollisionResponse::ETCR_TurnBack:\n\t\t\t\tbChangeDirection = true;\n\t\t\t\tbreak;\n\n\t\t\tcase ESoTaskCollisionResponse::ETCR_Skip:\n\t\t\t\tRestTime = KINDA_SMALL_NUMBER * 2.0f;\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\t// notify child class\n\tOnMoved(Offset, AppliedPercent);\n\n\treturn { RestTime, bChangeDirection };\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUSoKTTransformBasedOnOffsetCurve* USoKTTransformBasedOnOffsetCurve::ConstructTransformBasedOnOffsetCurve(UObject* WorldContextObject,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t float InTimeInSec,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t UCurveFloat* InCurve,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t const FVector& InOffset,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t bool bInRotation,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t ESoTaskCollisionResponse InCollisionType)\n{\n\tUSoKTTransformBasedOnOffsetCurve* Task = NewObject<USoKTTransformBasedOnOffsetCurve>();\n\n\tTask->CollisionType = InCollisionType;\n\tTask->TimeInSec = InTimeInSec;\n\tTask->OffsetCurve = InCurve;\n\tTask->Offset = InOffset;\n\tTask->bRotation = bInRotation;\n\n\treturn Task;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFVector USoKTTransformBasedOnOffsetCurve::GetOffset(float StartPercent, float EndPercent) const\n{\n\tif (OffsetCurve == nullptr)\n\t{\n\t\tUE_LOG(LogSoKinematicSystem, Error, TEXT(\"Curve based offset kinmematic task without curve!\"));\n\t\treturn FVector(0.0f, 0.0f, 0.0f);\n\t}\n\n\tconst FVector ValueBefore = Offset * OffsetCurve->GetFloatValue(StartPercent);\n\tconst FVector ValueAfter = Offset * OffsetCurve->GetFloatValue(EndPercent);\n\treturn ValueAfter - ValueBefore;\n}\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoKTTransformBasedOnOffset::Initialize(USceneComponent* Target, AActor* InRematerializeLocation, int32 InCrushDamage)\n{\n\tif (Target != nullptr)\n\t\tSavedStartPos = Target->GetComponentLocation();\n\tFullTime = TimeInSec;\n\n\tRealOffset = Offset;\n\n\tSuper::Initialize(Target, InRematerializeLocation, InCrushDamage);\n}\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoKTTransformBasedOnOffset::Start(USceneComponent* Target, bool bForward)\n{\n\tif (bAlwaysRelativeToStartPosition)\n\t{\n\t\tconst FVector TargetPos = SavedStartPos + Offset;\n\t\tconst FVector StartPos = Target->GetComponentLocation();\n\n\t\tconst float Distance = (StartPos - TargetPos).Size();\n\t\tconst float NormalDistance = Offset.Size();\n\n\t\tTimeInSec = FullTime * Distance / NormalDistance;\n\t\tRealOffset = TargetPos - StartPos;\n\t}\n\n\t// has to be called after bAlwaysRelativeToStartPosition setup is finished cause it needs the modified TimeInSec\n\tSuper::Start(Target, bForward);\n}\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFVector USoKTTransformBasedOnOffset::GetOffset(float StartPercent, float EndPercent) const\n{\n\treturn RealOffset * (EndPercent - StartPercent);\n}\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFVector USoKTTransformBasedOnVelocity::GetOffset(float StartPercent, float EndPercent) const\n{\n\treturn Velocity * (EndPercent - StartPercent) * TimeInSec;\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\ninline bool USoKTask::ShouldUseSweep(ESoTaskCollisionResponse CollisionType) const\n{\n\treturn CollisionType != ESoTaskCollisionResponse::ETCR_Ignore;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoKTask::AddDeltaRotation(const FVector& InDeltaRot, bool bLocal, ESoTaskCollisionResponse CollisionType, float DeltaSeconds)\n{\n\tconst FQuat OldTargetQuat = TargetComponent->GetComponentQuat();\n\tconst FVector OldTargetLocation = TargetComponent->GetComponentLocation();\n\n\tif (bLocal)\n\t\tTargetComponent->AddLocalRotation(FRotator(InDeltaRot.Y, InDeltaRot.Z, InDeltaRot.X));\n\telse\n\t\tTargetComponent->AddWorldRotation(FRotator(InDeltaRot.Y, InDeltaRot.Z, InDeltaRot.X));\n\n#if WITH_EDITOR\n\tif (CollisionType == ESoTaskCollisionResponse::ETCR_Notify ||\n\t\tCollisionType == ESoTaskCollisionResponse::ETCR_Wait ||\n\t\tCollisionType == ESoTaskCollisionResponse::ETCR_TurnBack ||\n\t\tCollisionType == ESoTaskCollisionResponse::ETCR_PushOrWait)\n\t\tUE_LOG(LogSoKinematicSystem, Error, TEXT(\"USoKTask::AddDeltaRotation: invalid collision response! Rotation supports Ignore and Push only atm!\"));\n#endif\n\n\tif (CollisionType != ESoTaskCollisionResponse::ETCR_Push && CollisionType != ESoTaskCollisionResponse::ETCR_PushAggressive)\n\t\treturn;\n\n\tUPrimitiveComponent* Target = Cast<UPrimitiveComponent>(TargetComponent);\n\n\tif (Target == nullptr) // should not happen\n\t\treturn;\n\n\tconst FQuat NewTargetQuat = TargetComponent->GetComponentQuat();\n\tconst FVector NewTargetLocation = TargetComponent->GetComponentLocation();\n\tconst FQuatRotationTranslationMatrix OldTargetLocalToWorld(OldTargetQuat, OldTargetLocation);\n\tconst FQuatRotationTranslationMatrix NewTargetLocalToWorld(NewTargetQuat, NewTargetLocation);\n\n\tconst ECollisionChannel TargetCollisionChannel = Target->GetCollisionObjectType();\n\n\tTSet<AActor*> ActorsToPush;\n\t//TArray<UPrimitiveComponent*> OverlapingComponents;\n\t// Target->UpdateOverlaps(nullptr, false, nullptr);\n\t// Target->GetOverlappingComponents(OverlapingComponents);\n\n\tTArray<FOverlapResult> OutOverlaps;\n\tFComponentQueryParams Params;\n\tParams.MobilityType = EQueryMobilityType::Dynamic;\n\n\tFCollisionObjectQueryParams ObjectQueryParams;\n\tconst auto& Responses = Target->GetCollisionResponseToChannels();\n\tfor (int32 i = 0; i < ECollisionChannel::ECC_MAX; ++i)\n\t\tif (Responses.GetResponse(static_cast<ECollisionChannel>(i)) == ECollisionResponse::ECR_Block)\n\t\t\tObjectQueryParams.AddObjectTypesToQuery(static_cast<ECollisionChannel>(i));\n\n\tTarget->ComponentOverlapMulti(OutOverlaps, Target->GetOwner()->GetWorld(), Target->GetComponentLocation(), Target->GetComponentRotation(), Target->GetCollisionObjectType(), Params, ObjectQueryParams);\n\n\t// gather actors to push\n\tfor (const auto& OverlapResult : OutOverlaps)\n\t{\n\t\tauto* Component = OverlapResult.GetComponent();\n\t\tif (Component == nullptr)\n\t\t\tcontinue;\n\n\t\t// have to check both way, because the weaker collision response should be considered\n\t\tconst ECollisionResponse Resp1 = Component->GetCollisionResponseToChannel(TargetCollisionChannel);\n\t\tconst ECollisionResponse Resp2 = TargetComponent->GetCollisionResponseToChannel(Component->GetCollisionObjectType());\n\n\t\tif (Resp1 == ECollisionResponse::ECR_Block && Resp2 == ECollisionResponse::ECR_Block)\n\t\t\tActorsToPush.Add(Component->GetOwner());\n\t\t// maybe trigger overlap events otherwise? - we can add it later if we need it\n\t\t// also maybe triggering hit events here would be cool too, they are triggered when the actor is moved back, maybe it can cause some trouble?!\n\t\t// but then they would be triggered twice, so I am not sure\n\t}\n\n\tfor (auto* Actor : ActorsToPush)\n\t{\n\t\tconst FVector LocalBasePos = OldTargetLocalToWorld.InverseTransformPosition(Actor->GetActorLocation());\n\t\tconst FVector NewWorldPos = NewTargetLocalToWorld.TransformPosition(LocalBasePos);\n\t\tconst FVector DeltaPosition = (NewWorldPos - Actor->GetActorLocation());\n\n\t\tOnPushObject(Actor, DeltaPosition, DeltaSeconds, true, CollisionType == ESoTaskCollisionResponse::ETCR_PushAggressive);\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nfloat USoKTask::AddDeltaOffset(const FVector& InDeltaOffset, bool bLocal, ESoTaskCollisionResponse CollisionType, float DeltaSeconds)\n{\n\tconst bool bSweep = ShouldUseSweep(CollisionType);\n\tFHitResult HitResult;\n\n\tif (bLocal)\n\t\tTargetComponent->AddLocalOffset(InDeltaOffset, bSweep, &HitResult);\n\telse\n\t\tTargetComponent->AddWorldOffset(InDeltaOffset, bSweep, &HitResult);\n\n\t// react collision\n\tif (bSweep && HitResult.bBlockingHit)\n\t{\n\t\tswitch (CollisionType)\n\t\t{\n\t\t\tcase ESoTaskCollisionResponse::ETCR_Ignore:\n\t\t\t\tcheck(false);\n\t\t\t\tbreak;\n\t\t\tcase ESoTaskCollisionResponse::ETCR_Wait:\n\t\t\tcase ESoTaskCollisionResponse::ETCR_TurnBack:\n\t\t\tcase ESoTaskCollisionResponse::ETCR_Skip:\n\t\t\t\treturn HitResult.Time;\n\t\t\tcase ESoTaskCollisionResponse::ETCR_Notify:\n\t\t\t{\n\t\t\t\t// atm only the first collision is handled\n\t\t\t\t// maybe all could be handled properly - but how?\n\t\t\t\tconst FVector RestOffset = InDeltaOffset * (1.0f - HitResult.Time);\n\t\t\t\tif (bLocal)\n\t\t\t\t\tTargetComponent->AddLocalOffset(RestOffset);\n\t\t\t\telse\n\t\t\t\t\tTargetComponent->AddWorldOffset(RestOffset);\n\n\t\t\t\treturn 1.0f;\n\t\t\t}\n\n\t\t\tcase ESoTaskCollisionResponse::ETCR_PushOrWait:\n\t\t\t{\n\t\t\t\tUClass* HitClass = HitResult.GetActor()->GetClass();\n\t\t\t\tif ((!HitClass->ImplementsInterface(USoSplineWalker::StaticClass()) ||\n\t\t\t\t\t!HitClass->ImplementsInterface(USoMortal::StaticClass())) &&\n\t\t\t\t\tCast<UDestructibleComponent>(HitResult.GetComponent()) == nullptr &&\n\t\t\t\t\tHitResult.GetComponent()->GetCollisionObjectType() != ECollisionChannel::ECC_PhysicsBody)\n\t\t\t\t\treturn HitResult.Time;\n\t\t\t}\n\t\t\t// no break for a reason!!\n\t\t\tcase ESoTaskCollisionResponse::ETCR_Push:\n\t\t\tcase ESoTaskCollisionResponse::ETCR_PushAggressive:\n\t\t\t{\n\t\t\t\tFVector RestWorldOffset;\n\n\t\t\t\tif (bLocal)\n\t\t\t\t{\n\t\t\t\t\t// has to remove scale from the transform\n\t\t\t\t\tFTransform Transform = TargetComponent->GetComponentTransform();\n\t\t\t\t\tTransform.SetScale3D(FVector(1.0f, 1.0f, 1.0f));\n\t\t\t\t\tRestWorldOffset = Transform.TransformVector(InDeltaOffset);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t\tRestWorldOffset = InDeltaOffset;\n\n\t\t\t\tTArray<AActor*> ActorsAlreadyHit;\n\n\t\t\t\tconst float SumLength = RestWorldOffset.Size();\n\n\t\t\t\twhile (HitResult.bBlockingHit && !ActorsAlreadyHit.Contains(HitResult.GetActor()) && RestWorldOffset.SizeSquared() > KINDA_SMALL_NUMBER)\n\t\t\t\t{\n\t\t\t\t\tif (HitResult.GetActor() && HitResult.GetActor()->GetRootComponent()->Mobility != EComponentMobility::Movable)\n\t\t\t\t\t\tbreak; // can't have proper collision, just skip everything\n\n\n\t\t\t\t\tOnPushObject(HitResult.GetActor(), RestWorldOffset * (1.0f - HitResult.Time), DeltaSeconds, false, CollisionType == ESoTaskCollisionResponse::ETCR_PushAggressive);\n\n\t\t\t\t\tRestWorldOffset *= (1.0f - HitResult.Time);\n\t\t\t\t\tActorsAlreadyHit.Add(HitResult.GetActor());\n\n\t\t\t\t\tTargetComponent->AddWorldOffset(RestWorldOffset, true, &HitResult);\n\t\t\t\t}\n\t\t\t\t// could not push everything out of the way, but we don't care\n\t\t\t\tRestWorldOffset *= (1.0f - HitResult.Time);\n\t\t\t\tif (RestWorldOffset.Size() > KINDA_SMALL_NUMBER)\n\t\t\t\t\tTargetComponent->AddWorldOffset(RestWorldOffset);\n\n\t\t\t\t// TODO: maybe after it is moved, it should check all overlapping actors the way rotation does, for a final correction, if there was a blocking hit which was not resolved\n\n\t\t\t\treturn 1.0f;\n\t\t\t}\n\t\t\tdefault:\n\t\t\t\tcheck(false);\n\t\t\t\tbreak;\n\t\t}\n\t}\n\treturn 1.0f;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoKTask::OnPushObject(AActor* ActorToPush, const FVector& DeltaMovement, float DeltaSeconds, bool bTeleportAndSweepBack, bool bForceDamage) const\n{\n\tif (ActorToPush == nullptr)\n\t\treturn;\n\n\tISoSplineWalker* SplineWalker = Cast<ISoSplineWalker>(ActorToPush);\n\t// try to handle it as spline object, but maybe it's e.g. a bullet with invalid spline location - then normal push\n\t// FIXMYSELF: bullets shouldn't even be considered, should they? :O\n\tbool bHandledAsSplineWalker = false;\n\tif (SplineWalker != nullptr)\n\t{\n\t\t// push along spline\n\t\tFHitResult HitResult;\n\t\tbHandledAsSplineWalker = USoSplineHelper::PushSplineWalker(ActorToPush,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t   DeltaMovement,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t   DeltaSeconds,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t   bTeleportAndSweepBack ? nullptr : &HitResult,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t   RematerializeLocation,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t   CrushDamage, bForceDamage);\n\n\t\tif (bTeleportAndSweepBack && bHandledAsSplineWalker)\n\t\t{\n\t\t\tUSoSplineHelper::PushSplineWalker(ActorToPush, -DeltaMovement, DeltaSeconds, &HitResult, RematerializeLocation, CrushDamage, bForceDamage);\n\t\t\tconst int32 MaxIterNum = 6;\n\t\t\tint32 IterNum = 0;\n\t\t\twhile (HitResult.bBlockingHit && HitResult.Time < KINDA_SMALL_NUMBER && HitResult.GetComponent() == TargetComponent && IterNum < MaxIterNum)\n\t\t\t{\n\t\t\t\t// some more so we don't get stuck\n\t\t\t\tUSoSplineHelper::PushSplineWalker(ActorToPush, DeltaMovement, DeltaSeconds, nullptr, RematerializeLocation, CrushDamage, bForceDamage);\n\t\t\t\tUSoSplineHelper::PushSplineWalker(ActorToPush, -DeltaMovement, DeltaSeconds, &HitResult, RematerializeLocation, CrushDamage, bForceDamage);\n\t\t\t\tIterNum += 1;\n\t\t\t}\n\t\t\t// UE_LOG(LogSoKinematicSystem, Display, TEXT(\"Iter num: %d\"), IterNum);\n\t\t}\n\t}\n\n\tif (!bHandledAsSplineWalker)\n\t{\n\t\t// simple case\n\t\tActorToPush->AddActorWorldOffset(DeltaMovement, !bTeleportAndSweepBack);\n\t\tif (bTeleportAndSweepBack)\n\t\t\tActorToPush->AddActorWorldOffset(-DeltaMovement, true);\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nfloat USoKTask::UpdateCurrentTime(float MaxCurrentTime, float DeltaSeconds, float& CurrentTime) const\n{\n\t// update current time\n\tconst float UnClampedNewTime = CurrentTime + DeltaSeconds;\n\tCurrentTime = UnClampedNewTime;\n\t// rest time means \"unused time\" in this context: if we reached our goals in less than DeltaSeconds, we give the \"not used\" time back for the next task\n\tfloat RestTime = -1.0f;\n\tif (UnClampedNewTime < 0.0f)\n\t{\n\t\tCurrentTime = 0.0f;\n\t\tRestTime = -UnClampedNewTime;\n\t}\n\telse if (UnClampedNewTime > MaxCurrentTime)\n\t{\n\t\tCurrentTime = MaxCurrentTime;\n\t\tRestTime = UnClampedNewTime - MaxCurrentTime;\n\t}\n\n\treturn RestTime;\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoKTTranslateOnSpline::Start(USceneComponent* Target, bool bForward)\n{\n\tSuper::Start(Target, bForward);\n\n\t// setup spline location\n\tSplineLocation.SetSpline(SplinePtr.Get());\n\tSplineLocation.SetDistanceFromWorldLocation(Target->GetComponentLocation());\n\n\tif (bFreezeRotationRelativeToSplineDirection)\n\t\tRotationDelta = Target->GetComponentRotation() - SplineLocation.GetDirectionFromVector(Target->GetForwardVector()).Rotation();\n\n\tif (bForceDistanceFromSpline)\n\t{\n\t\tDistanceFromSplinePoint = Target->GetComponentLocation() - FVector(SplineLocation);\n\t\tDistanceFromSplinePoint.Z = 0.0f;\n\n\t\tDistanceFromSplinePoint = Target->GetComponentTransform().InverseTransformVector(DistanceFromSplinePoint);\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoKTTranslateOnSpline::Start(USceneComponent* Target, const bool bForward, const FSoSplinePoint& SplinePoint)\n{\n\tSuper::Start(Target, bForward);\n\tSplineLocation = SplinePoint;\n\n\tif (bFreezeRotationRelativeToSplineDirection)\n\t\tRotationDelta = Target->GetComponentRotation() - SplineLocation.GetDirectionFromVector(Target->GetForwardVector()).Rotation();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFVector USoKTTranslateOnSpline::GetOffset(float StartPercent, float EndPercent) const\n{\n\tif (!SplineLocation.IsValid())\n\t\treturn FVector(0, 0, 0);\n\n\tconst float Multiplier = (EndPercent - StartPercent) * (bVelocityBased ? TimeInSec : 1.0f);\n\n\tconst FVector OldLocation = SplineLocation;\n\tconst FVector NewLocation = (SplineLocation + Value.X * Multiplier);\n\tconst FVector DeltaLocation = NewLocation - OldLocation;\n\n\treturn FVector(DeltaLocation.X, DeltaLocation.Y, Value.Y * Multiplier);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoKTTranslateOnSpline::OnMoved(const FVector& Offset, float AppliedPercent)\n{\n\t// TODO: better splinelocation update if AppliedPercent < 1 (if it is necessary)\n\tSplineLocation += Offset.Size2D() * AppliedPercent * SplineLocation.GetDirectionModifierFromVector(Offset);\n\n\tif (bFreezeRotationRelativeToSplineDirection && TargetComponent != nullptr)\n\t\tTargetComponent->SetWorldRotation(SplineLocation.GetDirectionFromVector(TargetComponent->GetForwardVector()).Rotation() + RotationDelta);\n\n\tif (bForceDistanceFromSpline && TargetComponent != nullptr)\n\t{\n\t\tconst FVector WorldDelta = TargetComponent->GetComponentTransform().TransformVector(DistanceFromSplinePoint);\n\t\tconst float ZValue = TargetComponent->GetComponentLocation().Z;\n\t\tconst FVector NewLocation = FVector(SplineLocation) + WorldDelta;\n\t\tTargetComponent->SetWorldLocation(FVector(NewLocation.X, NewLocation.Y, ZValue));\n\t}\n}\n"
  },
  {
    "path": "Source/SOrb/Kinematic/Tasks/SoKTask.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#pragma once\n#include \"UObject/Object.h\"\n#include \"SplineLogic/SoSpline.h\"\n#include \"SplineLogic/SoSplinePoint.h\"\n#include \"SoKTask.generated.h\"\n\nDECLARE_DYNAMIC_DELEGATE(FSoKNotify);\n\nclass UFMODEvent;\nclass UFMODAudioComponent;\n\nUENUM(BlueprintType)\nenum class ESoTaskCollisionResponse : uint8\n{\n\t// obstacles are simply ignored\n\tETCR_Ignore\t\t\tUMETA(DisplayName = \"Ignore\"),\n\t// OnHit event is fired, but after that the object simply goes on\n\t// WARNING: only the first Hit event can be fired in a frame\n\t// works perfectly with rotation as well\n\tETCR_Notify\t\t\tUMETA(DisplayName = \"Notify\"),\n\t// task stops and waits until the path is free\n\t// does not work with rotation\n\tETCR_Wait\t\t\tUMETA(DisplayName = \"Wait\"),\n\t// the task is skipped and the process goes on with the next one\n\tETCR_Skip\t\t\tUMETA(DisplayName = \"Skip\"),\n\t// the whole process (not just the task) is played reverse from the point when the collision occurred\n\t// does not work with rotation\n\tETCR_TurnBack\t\tUMETA(DisplayName = \"Turn\"),\n\t// pushes the obstacles if it can\n\t// notes:\n\t// use with caution: the object moved with this collision type should not collide with static objects\n\t// pushing does not care about the terrain surface, objects may get stuck (maybe later they will be moved along surface?!)\n\t// if the pushed objects are physic simulated things should work out nicely\n\t// if they are not, the directly pushed object can't push other objects, it will get stuck should another collision occur\n\t// ISplineWalker objects are pushed along the spline, which works correctly only if the movement direction is more or less the same as the spline direction in the given point\n\t// ISPlineWalkers should not be pushed down from a spline at not connected spline ends\n\tETCR_Push\t\t\tUMETA(DisplayName = \"Push\"),\n\n\t// like push but damages target on stuck even if he could escape next frame\n\tETCR_PushAggressive\tUMETA(DisplayName = \"PushAggressive\"),\n\n\t// behaves like ETCR_Push for ISoSplineWalker-s, ETCR_Wait otherwise\n\t// Ignores destructibles meshes and PhysicsBody collision object types, does not work with rotation\n\tETCR_PushOrWait\t\tUMETA(DisplayName = \"PushAndIgnore\")\n};\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nstruct FSoTaskExecutionResults\n{\n\tfloat RestTime = 0.0f;\n\tbool bChangeDirection = false;\n\n\tFSoTaskExecutionResults() {};\n\tFSoTaskExecutionResults(float InRestTime) { RestTime = InRestTime; }\n\tFSoTaskExecutionResults(float InRestTime, bool bInChangeDirection) : RestTime(InRestTime), bChangeDirection(bInChangeDirection) {};\n};\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUCLASS(BlueprintType, EditInlineNew, Abstract)\nclass SORB_API USoKTask : public UObject\n{\n\tGENERATED_BODY()\n\npublic:\n\tUSoKTask() {};\n\n\t// called only once in BeginPlay(), can be used e.g. to store the start world transform of the actor\n\tvirtual void Initialize(USceneComponent* Target, AActor* InRematerializeLocation, int32 InCrushDamage);\n\n\t// resets state / store some init value if necessary - sad that unreal has a weird idea about a class being abstract\n\tvirtual void Start(USceneComponent* Target, bool bForward) { check(false); }\n\n\t// if @return >= 0, the task is done\n\tvirtual FSoTaskExecutionResults Execute(float DeltaSeconds, bool bForward) { check(false); return {}; };\n\nprotected:\n\t// some helper function, shared code between children\n\n\tbool ShouldUseSweep(ESoTaskCollisionResponse CollisionType) const;\n\n\t// rotates target object\n\tvoid AddDeltaRotation(const FVector& InDeltaRot, bool bLocal, ESoTaskCollisionResponse CollisionType, float DeltaSeconds);\n\n\t// translates TargetComponent with the given offset\n\t// return value: applied percentage\n\tfloat AddDeltaOffset(const FVector& InDeltaOffset, bool bLocal, ESoTaskCollisionResponse CollisionType, float DeltaSeconds);\n\n\t// Pushes target on spline, works both on ISplineWalkers and on normal objects\n\t// bTeleportAndSweepBack expects that the movement responsible for this push is already happened (used in rotation atm):\n\t//\t\t1. it moves the object without a sweep, expecting DeltaOffset to be bigger than the distance we actually have to move\n\t//\t\t2. it moves back to towards the initial location with sweep, expecting a blocking collision from the original object\n\tvoid OnPushObject(AActor* ActorToPush, const FVector& DeltaOffset, float DeltaSeconds, bool bTeleportAndSweepBack = false, bool bForceDamage = false) const;\n\n\n\t/**\n\t*  CurrentTime is increased by DeltaSeconds, then it is clamped between 0 and MaxCurrentTime\n\t*  Return value: fabs(UnClampedCurrent - CurrentTime)\n\t*/\n\tfloat UpdateCurrentTime(float MaxCurrentTime, float DeltaSeconds, float& CurrentTime) const;\n\nprotected:\n\t// currently cached target\n\tUPROPERTY()\n\tUSceneComponent* TargetComponent;\n\n\tUPROPERTY()\n\tAActor* RematerializeLocation;\n\n\tint32 CrushDamage;\n};\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// I should have called it USoKTSleep, now I could write \"zzzz\" as a comment...\nUCLASS(BlueprintType, EditInlineNew)\nclass SORB_API USoKTWait :public USoKTask\n{\n\tGENERATED_BODY()\n\npublic:\n\n\tUSoKTWait() {};\n\tvirtual void Start(USceneComponent* Target, bool bForward) { CurrentTime = 0.0f; }\n\tvirtual FSoTaskExecutionResults Execute(float DeltaSeconds, bool bForward) override;\n\nprotected:\n\n\tUPROPERTY(EditAnywhere, Category = Params)\n\tfloat TimeToWait;\n\n\tfloat CurrentTime = 0.0f;\n\n};\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUCLASS(BlueprintType, EditInlineNew)\nclass SORB_API USoKTCallFunction :public USoKTask\n{\n\tGENERATED_BODY()\n\npublic:\n\n\tUSoKTCallFunction() {};\n\tvirtual void Initialize(USceneComponent* Target, AActor* InRematerializeLocation, int32 InCrushDamage);\n\tvirtual void Start(USceneComponent* Target, bool bForward);\n\tvirtual FSoTaskExecutionResults Execute(float DeltaSeconds, bool bForward) { return { DeltaSeconds }; }\n\nprotected:\n\tvoid BindDelegate(AActor* Actor, FName FunctionName, FSoKNotify& FunctionDelegate);\n\n\n\tUPROPERTY(EditAnywhere, Category = Params)\n\tFName FunctionNameForward;\n\n\tUPROPERTY(EditAnywhere, Category = Params)\n\tFName FunctionNameBackwards;\n\n\tUPROPERTY()\n\tFSoKNotify ForwardFunction;\n\n\tUPROPERTY()\n\tFSoKNotify BackwardsFunction;\n};\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUCLASS(BlueprintType, EditInlineNew)\nclass SORB_API USoKTActivateComponent :public USoKTask\n{\n\tGENERATED_BODY()\n\npublic:\n\n\tUSoKTActivateComponent() {};\n\tvirtual void Start(USceneComponent* Target, bool bForward) override;\n\tvirtual FSoTaskExecutionResults Execute(float DeltaSeconds, bool bForward) { return { DeltaSeconds}; }\n\nprotected:\n\n\tUPROPERTY(EditAnywhere, Category = Params)\n\tbool bReset = true;\n};\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUCLASS(BlueprintType, EditInlineNew)\nclass SORB_API USoKTPlaySound :public USoKTask\n{\n\tGENERATED_BODY()\n\npublic:\n\n\tUSoKTPlaySound() {};\n\tvirtual void Start(USceneComponent* Target, bool bForward) override;\n\tvirtual FSoTaskExecutionResults Execute(float DeltaSeconds, bool bForward) { return { DeltaSeconds}; }\n\nprotected:\n\n\tUPROPERTY(EditAnywhere, Category = Params)\n\tUFMODEvent* SFX;\n\n\tUPROPERTY(EditAnywhere, Category = Params)\n\tbool bAttached = false;\n};\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n/** Only played backwards */\nUCLASS(BlueprintType, EditInlineNew)\nclass SORB_API USoKTPlaySoundForReversePlay :public USoKTask\n{\n\tGENERATED_BODY()\n\npublic:\n\n\tUSoKTPlaySoundForReversePlay() {};\n\tvirtual void Start(USceneComponent* Target, bool bForward) override;\n\tvirtual FSoTaskExecutionResults Execute(float DeltaSeconds, bool bForward) { return{ DeltaSeconds }; }\n\nprotected:\n\n\tUPROPERTY(EditAnywhere, Category = Params)\n\tUFMODEvent* SFX;\n\n\tUPROPERTY(EditAnywhere, Category = Params)\n\tbool bAttached = false;\n};\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUCLASS(BlueprintType, EditInlineNew)\nclass SORB_API USoKTPlayLoopedSound :public USoKTask\n{\n\tGENERATED_BODY()\n\npublic:\n\n\tUSoKTPlayLoopedSound() {};\n\tvirtual void Start(USceneComponent* Target, bool bForward) override;\n\tvirtual FSoTaskExecutionResults Execute(float DeltaSeconds, bool bForward) { return { DeltaSeconds}; }\n\n\tvoid StartStopSFX(bool bStop);\n\nprotected:\n\n\tUPROPERTY(EditAnywhere, Category = Params)\n\tUFMODEvent* SFX;\n\n\tUPROPERTY()\n\tUFMODAudioComponent* FMODComponent = nullptr;\n};\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// modifies location or orientation\nUCLASS(BlueprintType, EditInlineNew, Abstract)\nclass SORB_API USoKTTimeBasedTransform :public USoKTask\n{\n\tGENERATED_BODY()\n\npublic:\n\tvirtual void Start(USceneComponent* Target, bool bForward) override;\n\tvirtual FSoTaskExecutionResults Execute(float DeltaSeconds, bool bForward) override;\n\nprotected:\n\n\t// all children has to override this function\n\tvirtual FVector GetOffset(float StartPercent, float EndPercent) const;\n\n\tvirtual bool IsRotation() const { return false; }\n\tvirtual bool IsLocalAxis() const { return false; }\n\n\tvirtual void OnMoved(const FVector& Offset, float AppliedPercent) {};\n\npublic:\n\n\t// determines the collision response of the task, use with caution\n\tUPROPERTY(EditAnywhere, Category = Params)\n\tESoTaskCollisionResponse CollisionType;\n\n\t// the amount of time the task takes after Start() is called\n\tUPROPERTY(EditAnywhere, Category = Params, meta = (ClampMin = \"0.01\", ClampMax = \"100000\"))\n\tfloat TimeInSec = 0.01;\n\n\tfloat CurrentTime = 0.0f;\n};\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// translation / rotation with const velocity in given time\n// Value(t) = StartingValue + Axis * t\nUCLASS(BlueprintType, EditInlineNew)\nclass SORB_API USoKTTransformBasedOnOffset :public USoKTTimeBasedTransform\n{\n\tGENERATED_BODY()\n\n\tvirtual void Initialize(USceneComponent* Target, AActor* InRematerializeLocation, int32 InCrushDamage) override;\n\tvirtual void Start(USceneComponent* Target, bool bForward) override;\n\nprotected:\n\tvirtual FVector GetOffset(float StartPercent, float EndPercent) const override;\n\n\tvirtual bool IsRotation() const override { return bRotation; }\n\tvirtual bool IsLocalAxis() const override { return bLocalAxis; }\n\n\t// the distance the object will cover in the given time\n\tUPROPERTY(EditAnywhere, Category = Params)\n\tFVector Offset;\n\n\t// decides if the transform is translation or rotation\n\tUPROPERTY(EditAnywhere, Category = Params)\n\tbool bRotation;\n\n\t// axis can be global, or the local axis of the target component\n\tUPROPERTY(EditAnywhere, Category = Params)\n\tbool bLocalAxis = true;\n\n\t// if true the starting position of the target will be saved\n\t// the movement is performed to the location defined by starting pos + offset\n\t// the time in order to keep the original speed\n\t// WORKS only with local axis, but seriously why the hell do we even have the world one?\n\tUPROPERTY(EditAnywhere, Category = Params)\n\tbool bAlwaysRelativeToStartPosition;\n\n\t// time it would take if we would start in the StartPos, used if bAlwaysRelativeToStartPosition\n\tfloat FullTime;\n\t// world position of the target component when Initilaize() was called\n\tFVector SavedStartPos;\n\t// Offset, or the offset leading to the position defined by (StartPos + Offset) depending on bAlwaysRelativeToStartPosition\n\tFVector RealOffset;\n};\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// calculates new position/rotation based on offset from starting position/rotation in given time: Value(t) = StartingValue + OffsetCurve(t/TimeInSec) * Axis\nUCLASS(BlueprintType, EditInlineNew)\nclass SORB_API USoKTTransformBasedOnOffsetCurve :public USoKTTimeBasedTransform\n{\n\tGENERATED_BODY()\n\npublic:\n\tUFUNCTION(BlueprintPure, meta = (HidePin = \"WorldContextObject\", DefaultToSelf = \"WorldContextObject\", DisplayName = \"Create TransformBasedOnOffsetCurve task\", Keywords = \"new create kinematic task\"), Category = KinematicTask)\n\tstatic USoKTTransformBasedOnOffsetCurve* ConstructTransformBasedOnOffsetCurve(UObject* WorldContextObject,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t  float InTimeInSec,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t  UCurveFloat* InCurve,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t  const FVector& InOffset,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t  bool bInRotation,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t  ESoTaskCollisionResponse InCollisionType);\n\nprotected:\n\tvirtual FVector GetOffset(float StartPercent, float EndPercent) const override;\n\n\tvirtual bool IsRotation() const override { return bRotation; }\n\tvirtual bool IsLocalAxis() const override { return bLocalAxis; }\n\nprotected:\n\n\t// Value(t) = StartingValue(t) + OffsetCurve(t) * Axis\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Params)\n\tUCurveFloat* OffsetCurve;\n\n\t// the const part of the distance the object will cover in the given time, it is multiplied with the current Offset value each frame\n\tUPROPERTY(EditAnywhere, Category = Params)\n\tFVector Offset;\n\n\t// decides if the transform is translation or rotation\n\tUPROPERTY(EditAnywhere, Category = Params)\n\tbool bRotation;\n\n\t// axis can be global, or the local axis of the target component\n\tUPROPERTY(EditAnywhere, Category = Params)\n\tbool bLocalAxis;\n};\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// translation / rotation with const velocity in given time\n// Value(t) = StartingValue + Axis * dt\nUCLASS(BlueprintType, EditInlineNew)\nclass SORB_API USoKTTransformBasedOnVelocity :public USoKTTimeBasedTransform\n{\n\tGENERATED_BODY()\n\nprotected:\n\tvirtual FVector GetOffset(float StartPercent, float EndPercent) const override;\n\n\tvirtual bool IsRotation() const override { return bRotation; }\n\tvirtual bool IsLocalAxis() const override { return bLocalAxis; }\n\npublic:\n\n\t// the velocity the target is transformed with\n\tUPROPERTY(EditAnywhere, Category = Params)\n\tFVector Velocity;\n\n\t// decides if the transform is translation or rotation\n\tUPROPERTY(EditAnywhere, Category = Params)\n\tbool bRotation;\n\n\t// axis can be global, or the local axis of the target component\n\tUPROPERTY(EditAnywhere, Category = Params)\n\tbool bLocalAxis;\n};\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// target is moved along a spline\n// start offset from spline is calculated in start() and is kept\n// does not handle collisions too well atm\nUCLASS(BlueprintType, EditInlineNew)\nclass SORB_API USoKTTranslateOnSpline :public USoKTTimeBasedTransform\n{\n\tGENERATED_BODY()\n\npublic:\n\n\tUSoKTTranslateOnSpline() {};\n\n\t// USoKTask - closest point on spline is calculated here\n\tvirtual void Start(USceneComponent* Target, bool bForward) override;\n\n\tvoid Start(USceneComponent* Target, bool bForward, const FSoSplinePoint& SplinePoint);\n\nprotected:\n\t// USoKTTimeBasedTransform:\n\n\tvirtual FVector GetOffset(float StartPercent, float EndPercent) const override;\n\t// spline location update\n\tvirtual void OnMoved(const FVector& Offset, float AppliedPercent) override;\n\npublic:\n\n\t// the spline the target is moving on\n\t// spline switch is not supported at the moment\n\t// the exact spline location is calculated based on world position in Start()\n\tUPROPERTY(EditAnywhere, BlueprintReadOnly, Category = Params)\n\tTAssetPtr<ASoSpline> SplinePtr;\n\n\t// if true Value is velocity, otherwise it is the offset the target will move in the given time\n\tUPROPERTY(EditAnywhere, BlueprintReadOnly, Category = Params)\n\tbool bVelocityBased;\n\n\t// offset to move if bVelcityBased is false, velocity otherwise, .X is along spline, .Y is vertical\n\tUPROPERTY(EditAnywhere, BlueprintReadOnly, Category = Params)\n\tFVector2D Value;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadOnly, Category = Params)\n\tbool bFreezeRotationRelativeToSplineDirection;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadOnly, Category = Params)\n\tbool bForceDistanceFromSpline;\n\n\n\tUPROPERTY(BlueprintReadOnly, Category = RuntimeValues)\n\tFVector DistanceFromSplinePoint;\n\n\tUPROPERTY(BlueprintReadOnly, Category = RuntimeValues)\n\tFRotator RotationDelta;\n\n\tUPROPERTY(BlueprintReadWrite, Category = RuntimeValues)\n\tFSoSplinePoint SplineLocation;\n};\n\n\n// Task ideas:\n// Task to signal triggerables?\n// we will see\n"
  },
  {
    "path": "Source/SOrb/Levels/SoEnvironmentPreset.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#pragma once\n\n#include \"SoEnvironmentPreset.generated.h\"\n\nclass UTextureCube;\n\nUSTRUCT(BlueprintType, Blueprintable)\nstruct FSoSkyPreset\n{\n\tGENERATED_USTRUCT_BODY()\n\npublic:\n\n\t// base color\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = BaseColor)\n\tFLinearColor BaseColor = { 0.034f, 0.028f, 0.085f, 1.0f };\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = BaseColor)\n\tfloat Brightness = 1.0f;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = BaseColor)\n\tfloat GradientAdd = 0.0f;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = BaseColor)\n\tfloat GradientMultiply = 2.0f;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = BaseColor)\n\tfloat GradientPower = 3.0f;\n\t\n\n\t// Cloud\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Cloud)\n\tFLinearColor CloudColor = { 1.0f, 1.0f, 1.0f, 1.0f };\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Cloud)\n\tfloat CloudLerpMultiply = 1.08233f;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Cloud)\n\tfloat CloudLerpPower = 1.276203f;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Cloud)\n\tfloat CloudLerpUV = 2.0f;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Cloud)\n\tfloat CloudOpacity = 0.722936;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Cloud)\n\tfloat CloudSpeed = 1.0f;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Cloud)\n\tfloat CloudMoreClouds = 0.743801f;\n\n\n\t// Cubemap\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Cubemap)\n\tfloat CubemapStrength = 1.0f;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Cubemap)\n\tfloat SkyTexLerp = 1.0f;\n\n\t// UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Cubemap)\n\t// UTextureCube* Texture;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Cubemap)\n\tFSoftObjectPath TexturePath;\n\n\n\t// Stars\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Stars)\n\tfloat StarBrightness = 1.0f;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Stars)\n\tFLinearColor StarColor = { 1.0f, 1.0f, 1.0f, 1.0f };\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Stars)\n\tfloat StarShineMaskUV = 6.0f;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Stars)\n\tfloat StarShineMin = 0.4f;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Stars)\n\tfloat StarShineMax = 3.0f;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Stars)\n\tfloat StarUV = 3.0f;\n};\n\nUSTRUCT(BlueprintType, Blueprintable)\nstruct FSoSunPreset\n{\n\tGENERATED_USTRUCT_BODY()\n\npublic:\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Sun)\n\tFLinearColor CloudColor = { 0.0f, 0.0f, 0.0f, 1.0f };\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Sun)\n\tFLinearColor Color = { 0.0f, 0.0f, 0.0f, 1.0f };\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Sun)\n\tfloat GradientMultiply = 1.0f;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Sun)\n\tfloat GradientPower = 1.0f;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Sun)\n\tfloat GradientRadius = 0.0f;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Sun)\n\tfloat GradientX = 0.5f;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Sun)\n\tfloat GradientY = 0.5f;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Sun)\n\tfloat SunMultiply = 1.0f;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Sun)\n\tfloat SunRadius = 0.0f;\n};\n\n\nUSTRUCT(BlueprintType, Blueprintable)\nstruct FSoSkyLightPreset\n{\n\tGENERATED_USTRUCT_BODY()\n\npublic:\n\n\t// UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = LightParam)\n\t// UTextureCube* CubeMap;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = LightParam)\n\tFSoftObjectPath CubeMapPath;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = LightParam)\n\tfloat Intensity = 4.0f;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = LightParam)\n\tFColor LightColor = { 102, 153, 255, 255 };\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = LightParam)\n\tfloat VolumetricScatteringIntensity = 1.0f;\n};\n\n\nUSTRUCT(BlueprintType, Blueprintable)\nstruct FSoExponentialHeightFogPreset\n{\n\tGENERATED_USTRUCT_BODY()\n\npublic:\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = FogParam)\n\tfloat FogDensity = 0.05f;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = FogParam)\n\tfloat FogMaskOpacity = 0.2f;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = FogParam)\n\tFLinearColor FogInscatteringColor = { 0.085f, 0.17f, 0.2, 1.0f };\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = FogParam)\n\tfloat FogHeightFallof = 0.2f;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = FogParam)\n\tfloat FogCutoffDistance = 20000000.0f;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = FogParam)\n\tbool bVolumetricFog = true;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = FogParam)\n\tfloat VolumetricFogExtinctionScale = 6.5f;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = FogParam)\n\tfloat VolumetricFogViewDistance = 6000.0f;\n};\n\n\nUSTRUCT(BlueprintType, Blueprintable)\nstruct FSoEnvironmentPreset\n{\n\tGENERATED_USTRUCT_BODY()\n\npublic:\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite)\n\tFSoSkyPreset SkyParams;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite)\n\tFSoSunPreset SunParams;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite)\n\tFSoSkyLightPreset SkyLightParams;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite)\n\tFSoExponentialHeightFogPreset FogParams;\n};\n"
  },
  {
    "path": "Source/SOrb/Levels/SoEpisodeLevelTypes.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#pragma once\n\n#include \"CoreMinimal.h\"\n\n#include \"Items/SoItem.h\"\n#include \"SoLevelTypes.h\"\n\n#include \"SoEpisodeLevelTypes.generated.h\"\n\nclass UTexture2D;\n\n// UENUM(BlueprintType)\n// enum class ESoEpisodeProgress : uint8\n// {\n// \tStarted = 0,\n// \tCompleted\n// };\n\n// Data for each episode\nUSTRUCT(BlueprintType, Blueprintable)\nstruct FSoEpisodeMapParams\n{\n\tGENERATED_USTRUCT_BODY()\npublic:\n\tFORCEINLINE bool IsValid() const { return Level.IsValid(); }\n\n\t// Aka the EpisodeName\n\tFORCEINLINE FString GetMapNameString() const { return Level.GetAssetName(); }\n\tFORCEINLINE FName GetMapName() const { return FName(*GetMapNameString()); }\n\npublic:\n\t// The persistent map level\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere, meta = (AllowedClasses = \"World\"))\n\tFSoftObjectPath Level;\n\n\t// The checkpoint location in the persistent level\n\t// NAME_None means default/start location.\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere)\n\tFName CheckpointLocation = NAME_None;\n\n\t// Friendly display name\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere)\n\tFText DisplayName;\n\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere)\n\tUTexture2D* Image = nullptr;\n\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere)\n\tFText Description;\n\n\t// All the equipped items this char has when entering the Episode\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere, Category = Character)\n\tTArray<FSoItem> EnterEquippedItems;\n\n\t// All the equipped spells this char has when entering the Episode\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere, Category = Character)\n\tTArray<FSoItem> EnterEquippedSpells;\n\n\t// Items in the inventory the char has when entering the Episode\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere, Category = Character)\n\tTArray<FSoItem> EnterInventoryItems;\n\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere)\n\tfloat MaxHealth = 30.0f;\n\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere)\n\tint32 SpellsCapacity = 2;\n\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere)\n\tFText CompletedSubtitle;\n\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere)\n\tFText CompletedDescription;\n\n\t// Means if we can save progress in this episode to a checkpoint or something like this\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere)\n\tbool bCanSave = false;\n\n\t// Useful if want to see if we can just remove the Teleport to SoulKeeper button\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere)\n\tbool bCanHaveSoulKeeper = false;\n\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere)\n\tFSoLevelEnterParams LevelEnterParams;\n};\n"
  },
  {
    "path": "Source/SOrb/Levels/SoLevelHelper.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#include \"SoLevelHelper.h\"\n\n#include \"Engine/Engine.h\"\n#include \"Engine/LevelStreaming.h\"\n#include \"Kismet/GameplayStatics.h\"\n#include \"GameFramework/Actor.h\"\n#include \"Particles/ParticleSystem.h\"\n\n#include \"SplineLogic/SoPlayerSpline.h\"\n#include \"Basic/SoGameSingleton.h\"\n\n\nDEFINE_LOG_CATEGORY_STATIC(LogSoLevelHelper, All, All);\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFName USoLevelHelper::GetLevelNameFromActor(const AActor* Actor)\n{\n\tif (Actor == nullptr)\n\t\treturn NAME_None;\n\n\tif (const ULevel* Level = Actor->GetLevel())\n\t{\n\t\tif (const UObject* Outer = Level->GetOuter())\n\t\t\treturn Outer->GetFName();\n\n\t\treturn Level->GetFName();\n\t}\n\n\treturn NAME_None;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFName USoLevelHelper::GetChapterNameFromActor(const AActor* Actor)\n{\n\treturn Actor == nullptr ? NAME_None : GetChapterNameFromObject(Actor);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoLevelHelper::GetAllLevelsThatAreLoading(const UObject* WorldContextObject, TArray<FName>& OutLevelNames)\n{\n\tif (!GEngine)\n\t\treturn false;\n\n\tconst UWorld* World = GEngine->GetWorldFromContextObject(WorldContextObject, EGetWorldErrorMode::LogAndReturnNull);\n\tif (World == nullptr)\n\t\treturn false;\n\n\tfor (const ULevelStreaming* Level : World->GetStreamingLevels())\n\t{\n\t\tif (!IsValid(Level))\n\t\t\tcontinue;\n\n\t\t// Wait until level is completely loaded (loaded/visible/Correct LOD loaded)\n\t\tif (Level->IsStreamingStatePending())\n\t\t{\n\t\t\tOutLevelNames.Add(Level->GetWorldAssetPackageFName());\n\t\t}\n\t}\n\n\treturn OutLevelNames.Num() > 0;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoLevelHelper::GetAllVisibleLevels(const UObject* WorldContextObject, TArray<FName>& OutLevelNames)\n{\n\tif (!GEngine)\n\t\treturn false;\n\n\tconst UWorld* World = GEngine->GetWorldFromContextObject(WorldContextObject, EGetWorldErrorMode::LogAndReturnNull);\n\tif (World == nullptr)\n\t\treturn false;\n\n\tfor (const ULevelStreaming* Level : World->GetStreamingLevels())\n\t{\n\t\tif (!IsValid(Level))\n\t\t\tcontinue;\n\n\t\tif (Level->IsLevelVisible())\n\t\t{\n\t\t\tOutLevelNames.Add(Level->GetWorldAssetPackageFName());\n\t\t}\n\t}\n\n\treturn OutLevelNames.Num() > 0;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// Blueprint interface\nbool USoLevelHelper::IsAnyLevelLoading(const UObject* WorldContextObject)\n{\n\tif (!GEngine)\n\t\treturn false;\n\n\tconst UWorld* World = GEngine->GetWorldFromContextObject(WorldContextObject, EGetWorldErrorMode::LogAndReturnNull);\n\tif (World == nullptr)\n\t\treturn false;\n\n\tif (World->IsVisibilityRequestPending())\n\t\treturn true;\n\n\t//if (!World->AreAlwaysLoadedLevelsLoaded())\n\t//\treturn false;\n\n\tfor (const ULevelStreaming* Level : World->GetStreamingLevels())\n\t{\n\t\tif (!IsValid(Level))\n\t\t\tcontinue;\n\n\t\t// Warn about failed to load levels\n\t\tif (Level->GetCurrentState() == ULevelStreaming::ECurrentState::FailedToLoad)\n\t\t{\n\t\t\tconst FString LevelName = Level->GetWorldAssetPackageName();\n\t\t\tUE_LOG(LogSoLevelHelper, Warning, TEXT(\"Failed to load level name = %s\"), *LevelName);\n\t\t}\n\n\t\t// Wait until level is completely loaded (loaded/visible/Correct LOD loaded)\n\t\tconst bool bIsStreamingStatePending = Level->IsStreamingStatePending();\n\t\tif (bIsStreamingStatePending)\n\t\t\treturn true;\n\t}\n\n\treturn false;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoLevelHelper::AreLevelsAtSplineLocationLoaded(const FSoSplinePoint& ClaimedLocation)\n{\n\tconst ASoPlayerSpline* Spline = Cast<ASoPlayerSpline>(ClaimedLocation.GetSpline());\n\tif (Spline == nullptr)\n\t\treturn false;\n\n\tconst float SplineDistance = ClaimedLocation.GetDistance();\n\tfor (const auto& Claim : Spline->GetLevelClaims())\n\t{\n\t\tif (!Claim.DoesClaim(SplineDistance) || Claim.LevelName == USoLevelHelper::GetLevelNameFromActor(Spline))\n\t\t\tcontinue;\n\n\t\tULevelStreaming* Level = UGameplayStatics::GetStreamingLevel(Spline, Claim.LevelName);\n\t\tif (Level == nullptr)\n\t\t\treturn false;\n\n\t\tif (Level->GetCurrentState() == ULevelStreaming::ECurrentState::FailedToLoad)\n\t\t\treturn false;\n\n\t\tif (Level->IsStreamingStatePending())\n\t\t\treturn false;\n\t}\n\n\treturn true;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoLevelHelper::IsAnyLevelVisible(const UObject* ContextObject, const TSet<FName>& Levels)\n{\n\tif (!ContextObject)\n\t\treturn false;\n\n\tfor (const FName Name : Levels)\n\t\tif (ULevelStreaming* Level = UGameplayStatics::GetStreamingLevel(ContextObject, Name))\n\t\t\tif (Level->IsLevelLoaded() && Level->IsLevelVisible())\n\t\t\t\treturn true;\n\n\treturn false;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUParticleSystem* USoLevelHelper::GetWeatherVFXForLevel(FName LevelName)\n{\n\tfor (const auto& Entry : USoGameSingleton::Get().LevelsWeatherVFXArray)\n\t{\n\t\tif (Entry.GetLevelName() == LevelName)\n\t\t{\n\t\t\treturn Entry.ParticlesPtr.Get();\n\t\t}\n\t}\n\n\treturn nullptr;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFString USoLevelHelper::GetMapNameStringFromObject(const UObject* WorldContextObject)\n{\n\tif (!GEngine)\n\t\treturn FString();\n\n\tif (const UWorld* World = GEngine->GetWorldFromContextObject(WorldContextObject, EGetWorldErrorMode::LogAndReturnNull))\n\t\treturn *World->GetName();\n\n\treturn FString();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nconst FSoftObjectPath* USoLevelHelper::GetLevelFromPreTag(const FString& PreTag)\n{\n\tif (const FSoLevelParams * DataPtr = USoGameSingleton::Get().LevelDataForTags.Find(PreTag))\n\t\treturn &DataPtr->Level;\n\n\treturn nullptr;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nconst FSoftObjectPath& USoLevelHelper::GetMainMenuLevel()\n{\n\treturn USoGameSingleton::Get().MainMenuLevel;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoLevelHelper::IsInMenuLevel(const UObject* WorldContextObject)\n{\n\treturn GetMapNameStringFromObject(WorldContextObject) == GetMainMenuLevel().GetAssetName();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nconst FSoftObjectPath& USoLevelHelper::GetDemoEpisodeLevel()\n{\n\treturn USoGameSingleton::Get().DemoEpisodeLevel;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFName USoLevelHelper::GetDemoMapName()\n{\n\treturn FName(*GetDemoEpisodeLevel().GetAssetName());\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFText USoLevelHelper::ChapterNameToFriendlyText(FName ChapterName)\n{\n\tFSoChapterMapParams Data;\n\tif (GetChapterData(ChapterName, Data))\n\t\treturn Data.NameText;\n\n\treturn FText::GetEmpty();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoLevelHelper::GetChapterData(FName ChapterName, FSoChapterMapParams& OutData)\n{\n\tfor (const auto& Chapter : USoGameSingleton::Get().ChaptersArray)\n\t{\n\t\tif (Chapter.GetMapName() == ChapterName)\n\t\t{\n\t\t\tOutData = Chapter;\n\t\t\treturn true;\n\t\t}\n\t}\n\n\treturn false;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nconst TArray<FSoChapterMapParams>& USoLevelHelper::GetAllChaptersData()\n{\n\treturn USoGameSingleton::Get().ChaptersArray;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoLevelHelper::IsValidChapterName(FName ChapterName)\n{\n\tfor (const auto& Chapter : USoGameSingleton::Get().ChaptersArray)\n\t{\n\t\tif (Chapter.GetMapName() == ChapterName)\n\t\t{\n\t\t\treturn true;\n\t\t}\n\t}\n\n\treturn false;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFName USoLevelHelper::GetFirstChapterName()\n{\n\treturn FName(*USoGameSingleton::Get().FirstChapterLevel.GetAssetName());\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFName USoLevelHelper::GetNextChapterNameAfter(FName ChapterName)\n{\n\tFSoChapterMapParams ChapterParams;\n\tif (!GetChapterData(ChapterName, ChapterParams))\n\t{\n\t\tUE_LOG(\n\t\t\tLogSoLevelHelper,\n\t\t\tWarning,\n\t\t\tTEXT(\"GetNextChapterNameAfter: Failed to find next chapter for ChapterName = %s\"),\n\t\t\t*ChapterName.ToString()\n\t\t);\n\t\treturn NAME_None;\n\t}\n\n\treturn FName(*ChapterParams.NextLevel.GetAssetName());\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFName USoLevelHelper::GetLastChapterName()\n{\n\treturn FName(*USoGameSingleton::Get().LastChapterLevel.GetAssetName());\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFText USoLevelHelper::GetEpisodeNameDisplayText(FName EpisodeName)\n{\n\tFSoEpisodeMapParams Data;\n\tif (GetEpisodeData(EpisodeName, Data))\n\t\treturn Data.DisplayName;\n\n\treturn FText::GetEmpty();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoLevelHelper::IsValidEpisodeName(FName EpisodeName)\n{\n\tfor (const auto& Episode : USoGameSingleton::Get().EpisodesArray)\n\t{\n\t\tif (Episode.GetMapName() == EpisodeName)\n\t\t{\n\t\t\treturn true;\n\t\t}\n\t}\n\n\treturn false;\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFName USoLevelHelper::GetFirstValidEpisodeName()\n{\n\tif (USoPlatformHelper::IsDemo())\n\t\treturn GetDemoMapName();\n\n\t// Normal game\n\tfor (const auto& Episode : USoGameSingleton::Get().EpisodesArray)\n\t{\n\t\tif (Episode.IsValid())\n\t\t{\n\t\t\treturn Episode.GetMapName();\n\t\t}\n\t}\n\n\treturn NAME_None;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nconst TArray<FSoEpisodeMapParams>& USoLevelHelper::GetAllEpisodesData()\n{\n\treturn USoGameSingleton::Get().EpisodesArray;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoLevelHelper::GetEpisodeData(FName EpisodeName, FSoEpisodeMapParams& OutData)\n{\n\tfor (const auto& Episode : USoGameSingleton::Get().EpisodesArray)\n\t{\n\t\tif (Episode.GetMapName() == EpisodeName)\n\t\t{\n\t\t\tOutData = Episode;\n\t\t\treturn true;\n\t\t}\n\t}\n\n\treturn false;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoLevelHelper::GetMapEnterParams(FName MapName, FSoLevelEnterParams& OutData)\n{\n\tOutData = {};\n\n\t// Chapter\n\tif (IsValidChapterName(MapName))\n\t{\n\t\tFSoChapterMapParams ChapterData;\n\t\tif (!GetChapterData(MapName, ChapterData))\n\t\t\treturn false;\n\n\t\tOutData = ChapterData.LevelEnterParams;\n\t\treturn true;\n\t}\n\n\t// Episode\n\tif (IsValidEpisodeName(MapName))\n\t{\n\t\tFSoEpisodeMapParams EpisodeData;\n\t\tif (!GetEpisodeData(MapName, EpisodeData))\n\t\t\treturn false;\n\n\t\tOutData = EpisodeData.LevelEnterParams;\n\t\treturn true;\n\t}\n\n\treturn false;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoLevelHelper::GetMapImageTitleDescription(FName MapName, TSoftObjectPtr<UTexture2D>& OutImage, FText& OutTitle, FText& OutDescription)\n{\n\tOutImage.Reset();\n\tOutTitle = FText::GetEmpty();\n\tOutDescription = FText::GetEmpty();\n\n\t// Chapter\n\tif (IsValidChapterName(MapName))\n\t{\n\t\tFSoChapterMapParams ChapterData;\n\t\tif (!GetChapterData(MapName, ChapterData))\n\t\t\treturn false;\n\n\t\tOutTitle = ChapterData.NameText;\n\t\tOutImage = ChapterData.LevelEnterParams.LoadingImagePtr;\n\t\tOutDescription = ChapterData.LevelEnterParams.LoadingDescription;\n\t\treturn true;\n\t}\n\n\t// Episode\n\tif (IsValidEpisodeName(MapName))\n\t{\n\t\tFSoEpisodeMapParams EpisodeData;\n\t\tif (!GetEpisodeData(MapName, EpisodeData))\n\t\t\treturn false;\n\n\t\tOutImage = EpisodeData.LevelEnterParams.LoadingImagePtr;\n\t\tOutTitle = EpisodeData.DisplayName;\n\t\tOutDescription = EpisodeData.LevelEnterParams.LoadingDescription;\n\t\treturn true;\n\t}\n\n\treturn false;\n}\n"
  },
  {
    "path": "Source/SOrb/Levels/SoLevelHelper.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#pragma once\n\n#include \"UObject/Object.h\"\n#include \"Kismet/BlueprintFunctionLibrary.h\"\n\n#include \"SoLevelTypes.h\"\n#include \"SoEpisodeLevelTypes.h\"\n\n#include \"SoLevelHelper.generated.h\"\n\n\nclass AActor;\nstruct FSoSplinePoint;\nclass UParticleSystem;\n\n/**\n *  Blueprint/static interface for SoLevelManager\n */\nUCLASS()\nclass SORB_API USoLevelHelper : public UBlueprintFunctionLibrary\n{\n\tGENERATED_BODY()\npublic:\n\t//\n\t// Other\n\t//\n\n\t// Gets an array of levels that are still loading\n\tstatic bool GetAllLevelsThatAreLoading(const UObject* WorldContextObject, TArray<FName>& OutLevelNames);\n\n\t// What it says\n\tstatic bool GetAllVisibleLevels(const UObject* WorldContextObject, TArray<FName>& OutLevelNames);\n\n\t/** Is any level loading for the provided World. */\n\tUFUNCTION(BlueprintPure, Category = LevelManager, meta = (WorldContext = \"WorldContextObject\"))\n\tstatic bool IsAnyLevelLoading(const UObject* WorldContextObject);\n\n\t/** return value false: there is at least one not yet loaded claimed level */\n\tstatic bool AreLevelsAtSplineLocationLoaded(const FSoSplinePoint& ClaimedLocation);\n\n\t// Is any of the level names inside Levels visible?\n\tstatic bool IsAnyLevelVisible(const UObject* ContextObject, const TSet<FName>& Levels);\n\n\tstatic FString GetMapNameStringFromObject(const UObject* WorldContextObject);\n\n\tUFUNCTION(BlueprintPure, Category = LevelManager, meta = (WorldContext = \"WorldContextObject\"))\n\tstatic FORCEINLINE FName GetMapNameFromObject(const UObject* WorldContextObject)\n\t{\n\t\tconst FString MapName = GetMapNameStringFromObject(WorldContextObject);\n\t\treturn MapName.IsEmpty() ? NAME_None : FName(*MapName);\n\t}\n\n\t/** return the name of the default level for the pretag, or NAME_None if there is any */\n\tstatic FName GetLevelNameFromPreTag(const FString& PreTag)\n\t{\n\t\tif (const FSoftObjectPath * AssetRefPtr = GetLevelFromPreTag(PreTag))\n\t\t\treturn FName(*AssetRefPtr->GetAssetName());\n\n\t\treturn NAME_None;\n\t}\n\n\t/** returns a ptr to map entry or nullptr for the pretag, only valid until the map isn't changed */\n\tstatic const FSoftObjectPath* GetLevelFromPreTag(const FString& PreTag);\n\n\t// Some nice weather\n\tstatic UParticleSystem* GetWeatherVFXForLevel(FName LevelName);\n\n\t//\n\t// Menu\n\t//\n\n\t// Are we in the menu level?\n\tstatic bool IsInMenuLevel(const UObject* WorldContextObject);\n\tstatic const FSoftObjectPath& GetMainMenuLevel();\n\n\t//\n\t// Demo\n\t//\n\tstatic const FSoftObjectPath& GetDemoEpisodeLevel();\n\tstatic FName GetDemoMapName();\n\n\t//\n\t// Chapter\n\t//\n\n\t// NOTE: Chapter Name is just the World->MapName and only works this ways because we use the following hierarchy\n\t// SoAct1 (Chapter 1): MapName == PersistentLevel\n\t//\t - SubLevel1\n\t//\t - SubLevel2\n\n\t/**\n\t * Gets the Level name from the actor.\n\t * NOTE: For some actors this is the same as the MapName because the actor is placed in the persistent level.\n\t */\n\tUFUNCTION(BlueprintPure, Category = LevelManager)\n\tstatic FName GetLevelNameFromActor(const AActor* Actor);\n\n\t// Gets the ChapterName from the Actor. Only can get the chapter from the actor world\n\tUFUNCTION(BlueprintPure, Category = LevelManager)\n\tstatic FName GetChapterNameFromActor(const AActor* Actor);\n\n\t/** Gets the chapter name from the object */\n\tUFUNCTION(BlueprintPure, Category = LevelManager, meta = (WorldContext = \"WorldContextObject\"))\n\tstatic FORCEINLINE FName GetChapterNameFromObject(const UObject* WorldContextObject) { return GetMapNameFromObject(WorldContextObject); }\n\n\t// Is this object in the chapter level\n\tstatic FORCEINLINE bool IsInChapterLevel(const UObject* WorldContextObject)\n\t{\n\t\treturn IsValidChapterName(GetChapterNameFromObject(WorldContextObject));\n\t}\n\n\t// Converts a ChapterName to a friendly chapter name\n\t// Eg: convert from `SoAct1` to `Chapter 1`\n\tstatic FText ChapterNameToFriendlyText(FName ChapterName);\n\n\tUFUNCTION(BlueprintPure, Category = Chapter)\n\tstatic bool GetChapterData(FName ChapterName, FSoChapterMapParams& OutData);\n\n\tstatic const TArray<FSoChapterMapParams>& GetAllChaptersData();\n\tstatic bool IsValidChapterName(FName ChapterName);\n\n\tUFUNCTION(BlueprintPure, Category = Chapter)\n\tstatic FName GetFirstChapterName();\n\n\t// Gets the next chapter name following ChapterName\n\tUFUNCTION(BlueprintPure, Category = Chapter)\n\tstatic FName GetNextChapterNameAfter(FName ChapterName);\n\n\tUFUNCTION(BlueprintPure, Category = Chapter)\n\tstatic FName GetLastChapterName();\n\n\n\t//\n\t// Episode\n\t//\n\n\t/** Gets the episode name from the world context object */\n\tUFUNCTION(BlueprintPure, Category = LevelManager, meta = (WorldContext = \"WorldContextObject\"))\n\tstatic FORCEINLINE FName GetEpisodeNameFromObject(const UObject* WorldContextObject) { return GetMapNameFromObject(WorldContextObject); }\n\n\t// Is this object in the episode level\n\tstatic FORCEINLINE bool IsInEpisodeLevel(const UObject* WorldContextObject)\n\t{\n\t\treturn IsValidEpisodeName(GetEpisodeNameFromObject(WorldContextObject));\n\t}\n\n\t// Converts an Episode Name to a friendly name\n\tstatic FText GetEpisodeNameDisplayText(FName EpisodeName);\n\n\tstatic bool IsValidEpisodeName(FName EpisodeName);\n\tstatic FName GetFirstValidEpisodeName();\n\tstatic const TArray<FSoEpisodeMapParams>& GetAllEpisodesData();\n\n\tUFUNCTION(BlueprintPure, Category = Episode)\n\tstatic bool GetEpisodeData(FName EpisodeName, FSoEpisodeMapParams& OutData);\n\n\t//\n\t// Maps (Acts + Episodes)\n\t//\n\tstatic bool IsValidMapName(FName MapName) { return IsValidChapterName(MapName) || IsValidEpisodeName(MapName); }\n\n\tUFUNCTION(BlueprintPure, Category = Episode)\n\tstatic bool GetMapEnterParams(FName MapName, FSoLevelEnterParams& OutData);\n\n\tstatic bool GetMapImageTitleDescription(FName MapName, TSoftObjectPtr<UTexture2D>& OutImage, FText& OutTitle, FText& OutDescription);\n};\n"
  },
  {
    "path": "Source/SOrb/Levels/SoLevelManager.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#include \"SoLevelManager.h\"\n\n#include \"Engine/LevelStreaming.h\"\n#include \"Kismet/GameplayStatics.h\"\n#include \"Engine/World.h\"\n\n#include \"SplineLogic/SoPlayerSpline.h\"\n#include \"SplineLogic/SoMarker.h\"\n#include \"Engine/Engine.h\"\n#include \"UObject/SoftObjectPath.h\"\n#include \"SoLevelHelper.h\"\n#include \"Basic/SoGameSingleton.h\"\n\nDEFINE_LOG_CATEGORY(LogSoLevelManager);\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFSoLevelManager& FSoLevelManager::Get()\n{\n\tstatic FSoLevelManager Instance;\n\treturn Instance;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSoLevelManager::Update(const FSoSplinePoint& PlayerLocation, float DeltaSeconds)\n{\n\t// Mark current levels\n\tbool bAllLoaded = false;\n\tClaimSplineLocation(PlayerLocation, bAllLoaded);\n\n\tfor (int32 i = ActiveLevels.Num() - 1; i >= 0; --i)\n\t{\n\t\t// Level not seen in the past second, mark it to be hidden\n\t\tif (ActiveLevels[i].Time > 1.0f && !LoggedToHideLevels.Contains(ActiveLevels[i].Name))\n\t\t{\n\t\t\tLoggedToHideLevels.Add(ActiveLevels[i].Name);\n\t\t\tUE_LOG(LogSoLevelManager, Display, TEXT(\"Level %s is marked as inactive, will be turned off in %2.2f sec\"), *ActiveLevels[i].Name.ToString(), HideTime);\n\t\t}\n\n\t\tActiveLevels[i].Time += DeltaSeconds;\n\n\t\t// Hide level\n\t\tif (ActiveLevels[i].Time > HideTime)\n\t\t{\n\t\t\tHideLevel(PlayerLocation.GetSpline(), ActiveLevels[i].Name);\n\t\t\tOnClaimedLevelUnloaded(PlayerLocation.GetSpline(), ActiveLevels[i].Name);\n\t\t\tActiveLevels.RemoveAtSwap(i);\n\t\t}\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool FSoLevelManager::ClaimSplineLocation(const FSoSplinePoint& ClaimedLocation, bool& bOutAllLoaded)\n{\n\tbOutAllLoaded = true;\n\n\tconst ASoPlayerSpline* Spline = Cast<ASoPlayerSpline>(ClaimedLocation.GetSpline());\n\tif (Spline == nullptr)\n\t\treturn false;\n\n\tbool bAllClaimedActive = true;\n\tconst float SplineDistance = ClaimedLocation.GetDistance();\n\tfor (const auto& Claim : Spline->GetLevelClaims())\n\t{\n\t\tif (!Claim.DoesClaim(SplineDistance))\n\t\t\tcontinue;\n\n\t\tULevelStreaming* Level = UGameplayStatics::GetStreamingLevel(Spline, Claim.LevelName);\n\t\tif (Level == nullptr)\n\t\t\tbreak;\n\n\t\tconst bool bThisClaimActive = Level->IsLevelLoaded() && Level->IsLevelVisible();\n\t\tbAllClaimedActive = bAllClaimedActive && bThisClaimActive;\n\n\t\tFSoLevelEntry* LevelEntry = ActiveLevels.FindByPredicate([&Claim](const FSoLevelEntry& Entry) { return Entry.Name == Claim.LevelName; });\n\t\tif (LevelEntry != nullptr)\n\t\t{\n\t\t\t// Found level, unhide it if marked\n\t\t\tLevelEntry->Time = 0.0f;\n\t\t\tLoggedToHideLevels.Remove(Claim.LevelName);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif (Level->IsLevelLoaded())\n\t\t\t\tUE_LOG(LogSoLevelManager, Display, TEXT(\"Level is requested to be visible: %s\"), *Claim.LevelName.ToString())\n\t\t\telse\n\t\t\t\tUE_LOG(LogSoLevelManager, Display, TEXT(\"Level will load: %s\"), *Claim.LevelName.ToString());\n\n\t\t\tActiveLevels.Add({ Claim.LevelName, 0.0f });\n\t\t}\n\n\t\tif (!bThisClaimActive)\n\t\t{\n\t\t\tconst bool bLoaded = ShowLevel(ClaimedLocation.GetSpline(), Claim.LevelName);\n\t\t\tbOutAllLoaded = bLoaded && bOutAllLoaded;\n\t\t}\n\t}\n\n\treturn bAllClaimedActive;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSoLevelManager::Empty()\n{\n\tActiveLevels.Empty();\n\tDependentLevelCounters.Empty();\n\tLoggedToHideLevels.Empty();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSoLevelManager::ClaimAndLoadAllLevels(UWorld* WorldPtr)\n{\n\tif (WorldPtr == nullptr)\n\t\treturn;\n\n\tfor (ULevelStreaming* Level : WorldPtr->GetStreamingLevels())\n\t{\n\t\tif (!IsValid(Level))\n\t\t\tcontinue;\n\n\t\t//Level->SetShouldBeVisible(true);\n\t\tif (!Level->IsLevelLoaded())\n\t\t{\n\t\t\tconst FLatentActionInfo Info;\n\t\t\tUGameplayStatics::LoadStreamLevel(WorldPtr, Level->PackageNameToLoad, true, true, Info);\n\n\t\t\tActiveLevels.Add({ Level->PackageNameToLoad, 0.0f });\n\t\t}\n\t}\n\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool FSoLevelManager::TeleportToChapter(const UObject* ContextObject, FName ChapterName)\n{\n\tconst FString ThisContext = FString::Printf(TEXT(\"TeleportToChapter(ChapterName = %d)\"), *ChapterName.ToString());\n\n\tFSoChapterMapParams ChapterData;\n\tif (!USoLevelHelper::GetChapterData(ChapterName, ChapterData))\n\t{\n\t\tUE_LOG(LogSoLevelManager, Error, TEXT(\"%s - Could not get any chapter data for ChapterName\"), *ThisContext);\n\t\treturn false;\n\t}\n\n\tUE_LOG(\n\t\tLogSoLevelManager,\n\t\tLog,\n\t\tTEXT(\"%s - FriendlyName = `%s`\"),\n\t\t*ThisContext, *ChapterData.NameText.ToString()\n\t);\n\tverify(ChapterData.IsValid());\n\n\tEmpty();\n\tif (!OpenLevel(ContextObject, ChapterData.GetMapName()))\n\t{\n\t\tUE_LOG(LogSoLevelManager, Error, TEXT(\"%s - Could open ChapterName\"), *ThisContext);\n\t\treturn false;\n\t}\n\n\treturn true;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool FSoLevelManager::TeleportToEpisode(const UObject* ContextObject, FName EpisodeName)\n{\n\tconst FString ThisContext = FString::Printf(TEXT(\"TeleportToEpisode(EpisodeName = %d)\"), *EpisodeName.ToString());\n\n\tFSoEpisodeMapParams EpisodeData;\n\tif (!USoLevelHelper::GetEpisodeData(EpisodeName, EpisodeData))\n\t{\n\t\tUE_LOG(LogSoLevelManager, Error, TEXT(\"%s - Could not get any episode data for EpisodeName\"), *ThisContext);\n\t\treturn false;\n\t}\n\n\tUE_LOG(\n\t\tLogSoLevelManager,\n\t\tLog,\n\t\tTEXT(\"%s -  to Checkpoint = `%s`\"),\n\t\t*ThisContext, *EpisodeData.CheckpointLocation.ToString()\n\t);\n\tverify(EpisodeData.IsValid());\n\n\tEmpty();\n\tif (!OpenLevel(ContextObject, EpisodeData.GetMapName()))\n\t{\n\t\tUE_LOG(LogSoLevelManager, Error, TEXT(\"%s - Could find and open EpisodeName\"), *ThisContext);\n\t\treturn false;\n\t}\n\n\treturn true;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool FSoLevelManager::TeleportToMainMenuLevel(const UObject* ContextObject)\n{\n\tif (!ContextObject)\n\t\treturn false;\n\n\tconst FSoftObjectPath& MainMenuLevel = USoLevelHelper::GetMainMenuLevel();\n\tEmpty();\n\tif (!OpenLevel(ContextObject, FName(*MainMenuLevel.GetAssetName())))\n\t{\n\t\tUE_LOG(LogSoLevelManager, Error, TEXT(\"TeleportToMainMenuLevel - Could not teleport to maine menu level = %s\"), *MainMenuLevel.GetAssetName());\n\t\treturn false;\n\t}\n\n\treturn true;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSoLevelManager::HideActiveLevel(const UObject* ContextObject, FName LevelName)\n{\n\tActiveLevels.RemoveAllSwap([&LevelName](const FSoLevelEntry& Entry) { return Entry.Name == LevelName; });\n\tHideLevel(ContextObject, LevelName);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool FSoLevelManager::OpenLevel(const UObject* ContextObj, FName LevelName)\n{\n\t// Adapted from UGameplayStatics::OpenLevel\n\tif (!GEngine)\n\t\treturn false;\n\n\tUWorld* World = GEngine->GetWorldFromContextObject(ContextObj, EGetWorldErrorMode::LogAndReturnNull);\n\tif (World == nullptr)\n\t\treturn false;\n\n\tconst ETravelType TravelType = TRAVEL_Absolute;\n\tconst FString Command = LevelName.ToString();\n\tFWorldContext &WorldContext = GEngine->GetWorldContextFromWorldChecked(World);\n\n\tFURL TestURL(&WorldContext.LastURL, *Command, TravelType);\n\tif (TestURL.IsLocalInternal())\n\t{\n\t\t// make sure the file exists if we are opening a local file\n\t\tif (!GEngine->MakeSureMapNameIsValid(TestURL.Map))\n\t\t{\n\t\t\tUE_LOG(LogSoLevelManager, Warning, TEXT(\"WARNING: The map '%s' does not exist.\"), *TestURL.Map);\n\t\t}\n\t}\n\n\tGEngine->SetClientTravel(World, *Command, TravelType);\n\n\treturn true;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool FSoLevelManager::ShowLevel(const UObject* ContextObj, FName LevelName)\n{\n\tif (ULevelStreaming* Level = UGameplayStatics::GetStreamingLevel(ContextObj, LevelName))\n\t{\n#if PLATFORM_SWITCH\n\t\tif (FSoNameArray* LevelListPtr = USoGameSingleton::Get().LevelUnloadMapForSwitch.Find(LevelName))\n\t\t{\n\t\t\tfor (FName LevelToUnload : LevelListPtr->Names)\n\t\t\t\tUnloadLevelIfNotVisible(ContextObj, LevelToUnload);\n\t\t}\n#endif\n\n\t\tif (Level->IsLevelLoaded())\n\t\t{\n\t\t\tLevel->SetShouldBeVisible(true);\n\t\t\treturn true;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tFLatentActionInfo Info;\n\t\t\tUGameplayStatics::LoadStreamLevel(ContextObj, LevelName, true, false, Info);\n\t\t\treturn false;\n\t\t}\n\n\t}\n\n\tUE_LOG(LogSoLevelManager, Warning, TEXT(\"Failed to show level: `%s` - level not loaded\"), *LevelName.ToString());\n\treturn false;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool FSoLevelManager::HideLevel(const UObject* ContextObj, FName LevelName)\n{\n\tif (ULevelStreaming* Level = UGameplayStatics::GetStreamingLevel(ContextObj, LevelName))\n\t{\n\t\tUE_LOG(LogSoLevelManager, Display, TEXT(\"Level became hidden: %s\"), *LevelName.ToString());\n\t\tLevel->SetShouldBeVisible(false);\n\t\treturn true;\n\t}\n\n\tUE_LOG(LogSoLevelManager, Warning, TEXT(\"Failed to hide level: `%s` - level not loaded\"), *LevelName.ToString());\n\treturn false;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSoLevelManager::UnloadLevelIfNotVisible(const UObject* ContextObj, FName LevelName)\n{\n\tif (ULevelStreaming* Level = UGameplayStatics::GetStreamingLevel(ContextObj, LevelName))\n\t{\n\t\tif (Level->IsLevelLoaded() && !Level->IsLevelVisible())\n\t\t{\n\t\t\tUE_LOG(LogSoLevelManager, Display, TEXT(\"Level will be unloaded: %s\"), *LevelName.ToString());\n\n\t\t\tFLatentActionInfo Info;\n\t\t\tUGameplayStatics::UnloadStreamLevel(ContextObj, LevelName, Info, false);\n\t\t}\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSoLevelManager::OnClaimedLevelUnloaded(const UObject* ContextObj, FName Level)\n{\n\t// NOTE USED\n// \tif (const FSoDependentLevels* LevelList = USoGameSingleton::GetDependentLevels(Level))\n// \t{\n// \t\tfor (const FName& Name : LevelList->LevelNames)\n// \t\t{\n// \t\t\tif (!DependentLevelCounters.Contains(Name))\n// \t\t\t{\n// \t\t\t\tUE_LOG(LogSoLevelManager, Error, TEXT(\"A dependent level would be unloaded but it doesn't have a counter - this was considered impossible!\"));\n// \t\t\t\tDependentLevelCounters.Add(Name, 0);\n// \t\t\t}\n// \t\t\telse\n// \t\t\t{\n// \t\t\t\tDependentLevelCounters[Name] -= 1;\n//\n// #if WITH_EDITOR\n// \t\t\t\tif (DependentLevelCounters[Name] < 0)\n// \t\t\t\t\tUE_LOG(LogSoLevelManager, Error, TEXT(\"Counter for dependent level %s is smaller than 0 - something is broken :/\"), *Name.ToString());\n// #endif\n// \t\t\t\tif (DependentLevelCounters[Name] == 0)\n// \t\t\t\t\tHideLevel(ContextObj, Name);\n// \t\t\t}\n// \t\t}\n// \t}\n}\n"
  },
  {
    "path": "Source/SOrb/Levels/SoLevelManager.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#pragma once\n\n#include \"CoreMinimal.h\"\n#include \"SoLevelTypes.h\"\n\nDECLARE_LOG_CATEGORY_EXTERN(LogSoLevelManager, All, All);\n\nstruct FSoSplinePoint;\nclass UObject;\nclass UWorld;\n\n/**\n *   Singleton class handling the level streaming based on the player character's spline location\n *\n *  There are two kind of levels:\n *\n *\t\tClaimed Level: one or more level are claimed every frame based on the player's spline location\n *\t\t\t\t\t   the claimed level is loaded\n *\t\t\t\t\t   if it isn't claimed anymore it is unloaded after a few sec (HideTime)\n *\n *\t\tDependent Level: Claimed levels can have dependent level\n *\t\t\t\t\t\t A dependent level is loaded when any claimed level references it\n *\t\t\t\t\t\t Can be used for areas between two levels - when certain objects are visible from\n *\t\t\t\t\t\t two claimed levels a part of them can be moved to a dependent level which is always loaded\n *\t\t\t\t\t\t if any of the two claimed level is loaded\n *\t\t\t\t\t\t DEPENDENT LEVELS CAN NOT HAVE DEPENDENT LEVELS ATM\n */\nclass FSoLevelManager\n{\npublic:\n\tstatic FSoLevelManager& Get();\n\tFSoLevelManager(const FSoLevelManager& Other) = delete;\n\tvoid operator=(const FSoLevelManager& Other) = delete;\n\n\t// void RegisterDependentLevel(FName DependentLevelName, const TArray<FName>& ClaimedLevels);\n\n\t/** has to be called each Tick */\n\tvoid Update(const FSoSplinePoint& PlayerLocation, float DeltaSeconds);\n\n\t/**\n\t * Show all the levels that are claimed by the spline point.\n\t * return value false: there is at least one not yet loaded claimed level\n\t */\n\tbool ClaimSplineLocation(const FSoSplinePoint& ClaimedLocation, bool& bOutAllLoaded);\n\n\t/**\n\t * Clears the active levels list, should be called in begin play / end play\n\t * otherwise an old entry can stop the level being loaded (play in editor)\n\t */\n\tvoid Empty();\n\n\t/** can be used to force load everything (for editor simulation) */\n\tvoid ClaimAndLoadAllLevels(UWorld* WorldPtr);\n\n\t/**\n\t * Move/teleport character to the new chapter map\n\t * NOTE: SHOULD NOT CALL THIS METHOD DIRECTLY, call the GameInstance one\n\t * NOTE: by moving to the new level everything in the actors is reset\n\t * And a new World is set. Only USoGameInstance has the variables still set\n\t */\n\tbool TeleportToChapter(const UObject* ContextObject, FName ChapterName);\n\n\t/**\n\t * Move/teleport character to the a new episode\n\t * NOTE: SHOULD NOT CALL THIS METHOD DIRECTLY, call the GameInstance one\n\t */\n\tbool TeleportToEpisode(const UObject* ContextObject, FName EpisodeName);\n\n\t// Teleports to t he main menu level\n\tbool TeleportToMainMenuLevel(const UObject* ContextObject);\n\n\t/** Hides the active LevelName  */\n\tvoid HideActiveLevel(const UObject* ContextObject, FName LevelName);\n\nprivate:\n\t// Controls DependentLevelCounters\n\tvoid OnClaimedLevelUnloaded(const UObject* ContextObj, FName Level);\n\n\tstatic bool OpenLevel(const UObject* ContextObj, FName LevelName);\n\tbool ShowLevel(const UObject* ContextObj, FName LevelName);\n\tstatic bool HideLevel(const UObject* ContextObj, FName LevelName);\n\tvoid UnloadLevelIfNotVisible(const UObject* ContextObj, FName LevelName);\n\n\nprivate:\n\tstatic constexpr float HideTime = 5.0f;\n\n\tFSoLevelManager() {};\n\n\tstruct FSoLevelEntry\n\t{\n\t\t// Level Name (actually it is the PackageName)\n\t\tFName Name = NAME_None;\n\n\t\t/** time since it was last claimed */\n\t\tfloat Time = 0.f;\n\n\t\tFSoLevelEntry(FName InName, float InTime) : Name(InName), Time(InTime) {};\n\t};\n\n\t// Keep track of the active levels\n\tTArray<FSoLevelEntry> ActiveLevels;\n\n\t// NOTE: Not used, seems to be the same as USoGameSingleton::DependentLevels\n\t/**\n\t *  Counter for dependent levels\n\t *  Claimed level referencing the dependent level Loaded: counter increased\n\t *\t\t\t\t\t\t\t\t\t\t\t\t  Unloaded: counter decreased\n\t *  Counter becomes 0: level unloaded\n\t *  Counter becomes greater one from 0: level loaded\n\t */\n\tTMap<FName, int32> DependentLevelCounters;\n\n\t// Levels marked to be hidden\n\tTSet<FName> LoggedToHideLevels;\n};\n\n"
  },
  {
    "path": "Source/SOrb/Levels/SoLevelTypes.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#pragma once\n\n#include \"CoreMinimal.h\"\n\n#include \"SoLevelTypes.generated.h\"\n\nclass ASoMarker;\nclass ALevelSequenceActor;\nclass UAnimSequenceBase;\n\nUSTRUCT(BlueprintType, Blueprintable)\nstruct FSoLevelEnterParams\n{\n\tGENERATED_USTRUCT_BODY()\npublic:\n\tUPROPERTY(EditAnywhere)\n\tUAnimSequenceBase* Animation;\n\n\tUPROPERTY(EditAnywhere)\n\tTSoftObjectPtr<ALevelSequenceActor> Sequence;\n\n\tUPROPERTY(EditAnywhere)\n\tTSoftObjectPtr<AActor> Camera;\n\n\tUPROPERTY(EditAnywhere)\n\tfloat HideCharacterTime = -1.0f;\n\n\tUPROPERTY(EditAnywhere)\n\tTSoftObjectPtr<ASoMarker> TeleportAfterCutscene;\n\n\t// UPROPERTY(BlueprintReadWrite, EditAnywhere)\n\t// UTexture2D* LoadingImage = nullptr;\n\n\tUPROPERTY(EditAnywhere)\n\tTSoftObjectPtr<UTexture2D> LoadingImagePtr;\n\n\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere)\n\tFText LoadingDescription;\n\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere)\n\tFText DisplayTextOnBlackFadeDuringFirstMapStart;\n\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere)\n\tTArray<FText> RandomLoadingScreenTexts;\n};\n\nUSTRUCT(BlueprintType, Blueprintable)\nstruct FSoChapterMapParams\n{\n\tGENERATED_USTRUCT_BODY()\npublic:\n\tFORCEINLINE bool IsValid() const { return Level.IsValid(); }\n\n\t// Aka the ChapterName\n\tFORCEINLINE FString GetMapNameString() const { return Level.GetAssetName(); }\n\tFORCEINLINE FName GetMapName() const { return FName(*GetMapNameString()); }\n\npublic:\n\t// Current Level\n\tUPROPERTY(EditAnywhere, meta = (AllowedClasses = \"World\"))\n\tFSoftObjectPath Level;\n\n\t// Next Level after the current level if any\n\tUPROPERTY(EditAnywhere, meta = (AllowedClasses = \"World\"))\n\tFSoftObjectPath NextLevel;\n\n\t// Friendly localizable name\n\tUPROPERTY(EditAnywhere)\n\tFText NameText;\n\n\tUPROPERTY(EditAnywhere)\n\tFSoLevelEnterParams LevelEnterParams;\n};\n\nUSTRUCT(BlueprintType, Blueprintable)\nstruct FSoLevelWeatherVFX\n{\n\tGENERATED_USTRUCT_BODY()\n\npublic:\n\tFORCEINLINE FString GetLevelNameString() const { return Level.GetAssetName(); }\n\tFORCEINLINE FName GetLevelName() const { return FName(*GetLevelNameString()); }\n\npublic:\n\tUPROPERTY(EditAnywhere, Config, meta = (AllowedClasses = \"World\"))\n\tFSoftObjectPath Level;\n\n\tUPROPERTY(EditAnywhere, Config, meta = (DisplayName = \"Particles\"))\n\tTSoftObjectPtr<UParticleSystem> ParticlesPtr;\n};\n\n\nUSTRUCT()\nstruct FSoLevelParams\n{\n\tGENERATED_USTRUCT_BODY()\n\npublic:\n\tFORCEINLINE FString GetLevelNameString() const { return Level.GetAssetName(); }\n\tFORCEINLINE FName GetLevelName() const { return FName(*GetLevelNameString()); }\n\npublic:\n\tUPROPERTY(EditAnywhere, Config, meta = (AllowedClasses = \"World\"))\n\tFSoftObjectPath Level;\n\n\tUPROPERTY(EditAnywhere, Config, meta = (AllowedClasses = \"World\"))\n\tFName SkyPresetName;\n};\n\n/**\n*  Helper struct to setup dependent levels for a claimed level\n*/\n// USTRUCT(BlueprintType)\n// struct FSoDependentLevelDesc\n// {\n// \tGENERATED_USTRUCT_BODY()\n//\n// public:\n// \t/** Name of the claimed level */\n// \tUPROPERTY(EditAnywhere, meta = (AllowedClasses = \"World\"))\n// \tFSoftObjectPath Level;\n//\n// \t/** dependent levels for the claimed level */\n// \tUPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (AllowedClasses = \"World\"))\n// \tTArray<FSoftObjectPath> ClaimedLevels;\n// };\n\n\n/** fname array wrapper struct so it can be stored in map */\n// USTRUCT()\n// struct FSoDependentLevels\n// {\n// \tGENERATED_USTRUCT_BODY()\n//\n// public:\n// \tUPROPERTY(VisibleAnywhere)\n// \tTArray<FName> LevelNames;\n// };\n"
  },
  {
    "path": "Source/SOrb/Localization/SoLocalization.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#pragma once\n#include \"CoreMinimal.h\"\n\n// Just a proxy\n#include \"SoBeforeGame/Public/SoLocalization.h\"\n\n\n"
  },
  {
    "path": "Source/SOrb/Localization/SoLocalizationHelper.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#include \"SoLocalizationHelper.h\"\n\n#include \"Kismet/KismetInternationalizationLibrary.h\"\n#include \"Internationalization/Internationalization.h\"\n#include \"Internationalization/Culture.h\"\n\n#include \"Misc/ConfigCacheIni.h\"\n#include \"Basic/Helpers/SoStaticHelper.h\"\n#include \"Basic/Helpers/SoStringHelper.h\"\n#include \"Basic/Helpers/SoPlatformHelper.h\"\n\nbool USoLocalizationHelper::bIsInitialized = false;\nTArray<ESoSupportedCulture> USoLocalizationHelper::ConfigurableCultures;\n\nDEFINE_LOG_CATEGORY_STATIC(LogSoLocalization, All, All);\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoLocalizationHelper::Init()\n{\n\tif (bIsInitialized)\n\t\treturn;\n\tbIsInitialized = true;\n\n\tConfigurableCultures = {\n\t\tESoSupportedCulture::English,\n\t\tESoSupportedCulture::ChineseSimplified,\n\t\tESoSupportedCulture::ChineseTraditional,\n\t\tESoSupportedCulture::Russian,\n\t\tESoSupportedCulture::French,\n\t\tESoSupportedCulture::Spanish,\n\t\tESoSupportedCulture::Hungarian,\n\t\tESoSupportedCulture::Romanian\n\t};\n\n#if WARRIORB_WITH_STEAM\n\t// We only use the steam language if the user did not already set one in the file\n\tif (USoPlatformHelper::IsSteamInitialized() && !HasSavedCultureConfig())\n\t{\n\t\tconst ESoSupportedCulture SteamCulture = GetSteamCurrentLanguageNameType();\n\n\t\t// NOTE: we don't save it to the config, because the config is only for user set ingame language values\n\t\tSetCurrentCultureEverywhere(SteamCulture, false);\n\n\t\tUE_LOG(LogSoLocalization, Log, TEXT(\"Using Steam Language = %s\"), *GetLanguageTagFromSupporterCulture(SteamCulture));\n\t}\n#endif // WARRIORB_WITH_STEAM\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoLocalizationHelper::TestAllCultures()\n{\n\tTArray<FString> StockCultureNames;\n\tFInternationalization::Get().GetCultureNames(StockCultureNames);\n\n\tfor (ESoSupportedCulture SupportedCulture : ConfigurableCultures)\n\t{\n\t\tconst FString LanguageTag = GetLanguageTagFromSupporterCulture(SupportedCulture);\n\t\tconst FCulturePtr Culture = FInternationalization::Get().GetCulture(LanguageTag);\n\t\tcheck(Culture.IsValid());\n\t\tconst FString DisplayName = Culture->GetDisplayName();\n\t\tconst FString EnglishName = Culture->GetEnglishName();\n\t\tconst FString NativeName = USoStringHelper::CapitalizeEachWordFromString(Culture->GetNativeName());\n\n\t\tUE_LOG(LogSoLocalization, Warning, TEXT(\"Tag = %s, DisplayName = %s, EnglishName = %s, Native = %s\"), *LanguageTag, *DisplayName, *EnglishName, *NativeName)\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFText USoLocalizationHelper::GetDisplayTextFromSupportedCulture(ESoSupportedCulture CultureType, bool bInNativeCulture)\n{\n\tconst FCulturePtr Culture = GetCultureFromSupportedCulture(CultureType);\n\tcheck(Culture.IsValid());\n\n\t// Get the string as displayed in that culture\n\tif (bInNativeCulture)\n\t{\n\t\tconst FString NativeName = USoStringHelper::CapitalizeEachWordFromString(Culture->GetNativeName());\n\t\treturn FText::FromString(NativeName);\n\t}\n\n\tconst FString DisplayName = Culture->GetDisplayName();\n\treturn FText::FromString(DisplayName);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoLocalizationHelper::SetCurrentCultureEverywhere(ESoSupportedCulture Culture, bool bSaveToConfig)\n{\n\tconst FString LanguageTag = GetLanguageTagFromSupporterCulture(Culture);\n\n\t// Copied from UKismetInternationalizationLibrary::SetCurrentCulture\n\tif (FInternationalization::Get().SetCurrentCulture(LanguageTag))\n\t{\n\t\tif (!WARRIORB_WITH_EDITOR && bSaveToConfig)\n\t\t{\n\t\t\tGConfig->SetString(TEXT(\"Internationalization\"), TEXT(\"Culture\"), *LanguageTag, GGameUserSettingsIni);\n\t\t\tGConfig->EmptySection(TEXT(\"Internationalization.AssetGroupCultures\"), GGameUserSettingsIni);\n\t\t\tGConfig->Flush(false, GGameUserSettingsIni);\n\t\t}\n\t\treturn true;\n\t}\n\n\treturn false;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoLocalizationHelper::HasSavedCultureConfig()\n{\n\tFString Culture;\n\tconst bool bOk = GConfig->GetString(TEXT(\"Internationalization\"), TEXT(\"Culture\"), Culture, GGameUserSettingsIni);\n\treturn bOk && Culture.Len() > 0;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFCulturePtr USoLocalizationHelper::GetCultureFromLanguageTag(const FString& LanguageTag)\n{\n\treturn FInternationalization::Get().GetCulture(LanguageTag);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFString USoLocalizationHelper::GetCurrentLanguageName()\n{\n\treturn FInternationalization::Get().GetCurrentLanguage()->GetName();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nESoSupportedCulture USoLocalizationHelper::GetCurrentLanguageNameType()\n{\n\tconst FString LanguageTag = GetCurrentLanguageName();\n\tconst ESoSupportedCulture Culture = GetSupportedCultureFromLanguageTag(LanguageTag);\n\tif (Culture == ESoSupportedCulture::Invalid)\n\t{\n\t\tUE_LOG(LogSoLocalization, Error, TEXT(\"GetCurrentLanguageNameType(): Invalid LanguageTag = %s, it is not in supported cultures. Defaulting to English\"), *LanguageTag);\n\t\treturn ESoSupportedCulture::English;\n\t}\n\n\treturn Culture;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nESoSupportedCulture USoLocalizationHelper::GetSteamCurrentLanguageNameType()\n{\n\tconst FString APILanguageCode = USoPlatformHelper::GetSteamCurrentGameLanguage();\n\tconst ESoSupportedCulture CultureType = GetSupportedCultureFromSteamAPILanguageCode(APILanguageCode);\n\tif (CultureType == ESoSupportedCulture::Invalid)\n\t{\n\t\tUE_LOG(LogSoLocalization, Error, TEXT(\"GetSteamCurrentLanguageNameType(): Invalid APILanguageCode = %s, it is not in supported cultures. Defaulting to English\"), *APILanguageCode);\n\t\treturn ESoSupportedCulture::English;\n\t}\n\n\treturn CultureType;\n}\n"
  },
  {
    "path": "Source/SOrb/Localization/SoLocalizationHelper.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#pragma once\n\n#include \"CoreMinimal.h\"\n#include \"Kismet/BlueprintFunctionLibrary.h\"\n\n#include \"SoLocalizationHelper.generated.h\"\n\n// Enum that lists all the cultures of our game\nUENUM(BlueprintType)\nenum class ESoSupportedCulture : uint8\n{\n\t// Unsupported basically\n\tInvalid = 0,\n\n\tEnglish, // en also native culture\n\n\tHungarian, // ro\n\tRomanian, // hu\n\n\tChineseSimplified, // zh-Hans\n\tChineseTraditional, // zh-Hant\n\n\tRussian, // ru\n\tFrench, // fr\n\tSpanish, // es\n};\n\n// Helper class for localization/internationalization stuff\n// https://docs.unrealengine.com/en-US/Gameplay/Localization/ManageActiveCultureRuntime/index.html\nUCLASS()\nclass SORB_API USoLocalizationHelper : public UBlueprintFunctionLibrary\n{\n\tGENERATED_BODY()\n\npublic:\n\t// Statically initialize to set some values\n\tstatic void Init();\n\n\tUFUNCTION(BlueprintCallable, Category=\">Localization\")\n\tstatic const TArray<ESoSupportedCulture>& GetAllConfigurableCultures() { return ConfigurableCultures; }\n\n\t// Converts Enum to IETF language tag\n\tUFUNCTION(BlueprintPure, Category=\">Localization\")\n\tstatic FString GetLanguageTagFromSupporterCulture(ESoSupportedCulture Culture)\n\t{\n\t\tswitch (Culture)\n\t\t{\n\t\tcase ESoSupportedCulture::Romanian:\n\t\t\treturn TEXT(\"ro\");\n\t\tcase ESoSupportedCulture::Hungarian:\n\t\t\treturn TEXT(\"hu\");\n\t\tcase ESoSupportedCulture::ChineseSimplified:\n\t\t\treturn TEXT(\"zh-Hans\");\n\t\tcase ESoSupportedCulture::ChineseTraditional:\n\t\t\treturn TEXT(\"zh-Hant\");\n\t\tcase ESoSupportedCulture::Russian:\n\t\t\treturn TEXT(\"ru\");\n\t\tcase ESoSupportedCulture::French:\n\t\t\treturn TEXT(\"fr\");\n\t\tcase ESoSupportedCulture::Spanish:\n\t\t\treturn TEXT(\"es\");\n\n\t\t// Sane default\n\t\tcase ESoSupportedCulture::English:\n\t\tdefault:\n\t\t\treturn TEXT(\"en\");\n\t\t}\n\t}\n\tstatic void TestAllCultures();\n\n\tUFUNCTION(BlueprintPure, Category=\">Localization|Steam\")\n\tstatic ESoSupportedCulture GetSupportedCultureFromSteamAPILanguageCode(const FString& APILanguageCode)\n\t{\n\t\t// https://partner.steamgames.com/doc/store/localization#8\n\t\tif (APILanguageCode.Equals(TEXT(\"english\"), ESearchCase::IgnoreCase))\n\t\t{\n\t\t\treturn ESoSupportedCulture::English;\n\t\t}\n\t\tif (APILanguageCode.Equals(TEXT(\"romanian\"), ESearchCase::IgnoreCase))\n\t\t{\n\t\t\treturn ESoSupportedCulture::Romanian;\n\t\t}\n\t\tif (APILanguageCode.Equals(TEXT(\"hungarian\"), ESearchCase::IgnoreCase))\n\t\t{\n\t\t\treturn ESoSupportedCulture::Hungarian;\n\t\t}\n\t\tif (APILanguageCode.Equals(TEXT(\"schinese\"), ESearchCase::IgnoreCase))\n\t\t{\n\t\t\treturn ESoSupportedCulture::ChineseSimplified;\n\t\t}\n\t\tif (APILanguageCode.Equals(TEXT(\"tchinese\"), ESearchCase::IgnoreCase))\n\t\t{\n\t\t\treturn ESoSupportedCulture::ChineseTraditional;\n\t\t}\n\t\tif (APILanguageCode.Equals(TEXT(\"russian\"), ESearchCase::IgnoreCase))\n\t\t{\n\t\t\treturn ESoSupportedCulture::Russian;\n\t\t}\n\t\tif (APILanguageCode.Equals(TEXT(\"french\"), ESearchCase::IgnoreCase))\n\t\t{\n\t\t\treturn ESoSupportedCulture::French;\n\t\t}\n\t\tif (APILanguageCode.Equals(TEXT(\"spanish\"), ESearchCase::IgnoreCase))\n\t\t{\n\t\t\treturn ESoSupportedCulture::Spanish;\n\t\t}\n\t\t// Latin American spanish\n\t\tif (APILanguageCode.Equals(TEXT(\"latam\"), ESearchCase::IgnoreCase))\n\t\t{\n\t\t\treturn ESoSupportedCulture::Spanish;\n\t\t}\n\n\t\treturn ESoSupportedCulture::Invalid;\n\t}\n\n\tUFUNCTION(BlueprintPure, Category=\">Localization\")\n\tstatic ESoSupportedCulture GetSupportedCultureFromLanguageTag(const FString& LanguageTag)\n\t{\n\t\tif (LanguageTag.StartsWith(TEXT(\"en\")))\n\t\t{\n\t\t\treturn ESoSupportedCulture::English;\n\t\t}\n\t\tif (LanguageTag.StartsWith(TEXT(\"ro\")))\n\t\t{\n\t\t\treturn ESoSupportedCulture::Romanian;\n\t\t}\n\t\tif (LanguageTag.StartsWith(TEXT(\"hu\")))\n\t\t{\n\t\t\treturn ESoSupportedCulture::Hungarian;\n\t\t}\n\t\tif (LanguageTag.StartsWith(TEXT(\"zh-Hans\")))\n\t\t{\n\t\t\treturn ESoSupportedCulture::ChineseSimplified;\n\t\t}\n\t\tif (LanguageTag.StartsWith(TEXT(\"zh-Hant\")))\n\t\t{\n\t\t\treturn ESoSupportedCulture::ChineseTraditional;\n\t\t}\n\t\tif (LanguageTag.StartsWith(TEXT(\"ru\")))\n\t\t{\n\t\t\treturn ESoSupportedCulture::Russian;\n\t\t}\n\t\tif (LanguageTag.StartsWith(TEXT(\"fr\")))\n\t\t{\n\t\t\treturn ESoSupportedCulture::French;\n\t\t}\n\t\tif (LanguageTag.StartsWith(TEXT(\"es\")))\n\t\t{\n\t\t\treturn ESoSupportedCulture::Spanish;\n\t\t}\n\n\t\treturn ESoSupportedCulture::Invalid;\n\t}\n\n\tUFUNCTION(BlueprintPure, Category=\">Localization\")\n\tstatic FText GetDisplayTextFromSupportedCulture(ESoSupportedCulture CultureType, bool bInNativeCulture);\n\n\t// This basically sets the current culture everywhere\n\t// NOTE: This function is a sledgehammer, and will set both the language and locale, as well as clear out any asset group cultures that may be set.\n\t// NOTE: This clears Internationalization.AssetGroupCulture\n\t// Locale is what we represent time and numbers in\n\t// Language is what we see\n\t// NOTE: Does not work in editor after restart, set WARRIORB_NON_EDITOR_TEST = true\n\tUFUNCTION(BlueprintCallable, Category=\">Localization\")\n\tstatic bool SetCurrentCultureEverywhere(ESoSupportedCulture Culture, bool bSaveToConfig);\n\n\t// Did we save anything?\n\tstatic bool HasSavedCultureConfig();\n\n\tstatic FCulturePtr GetCultureFromLanguageTag(const FString& LanguageTag);\n\tstatic FCulturePtr GetCultureFromSupportedCulture(ESoSupportedCulture Culture)\n\t{\n\t\treturn GetCultureFromLanguageTag(GetLanguageTagFromSupporterCulture(Culture));\n\t}\n\n\tUFUNCTION(BlueprintPure, Category=\">Localization\")\n\tstatic FString GetCurrentLanguageName();\n\n\tUFUNCTION(BlueprintPure, Category=\">Localization\")\n\tstatic ESoSupportedCulture GetCurrentLanguageNameType();\n\n\t// Set by steam\n\tUFUNCTION(BlueprintPure, Category=\">Localization|Steam\")\n\tstatic ESoSupportedCulture GetSteamCurrentLanguageNameType();\n\n\t// Helper function:\n\t// If val is\n\t// UFUNCTION(BlueprintPure)\n\t// static FText FloatAsTextPercentInteger(float Val);\nprotected:\n\t// By the users\n\tstatic TArray<ESoSupportedCulture> ConfigurableCultures;\n\n\t// Set in Initialize\n\tstatic bool bIsInitialized;\n};\n"
  },
  {
    "path": "Source/SOrb/Logic/SoConsoleExtensionComponent.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#include \"SoConsoleExtensionComponent.h\"\n\n#include \"GameFramework/Character.h\"\n#include \"Kismet/GameplayStatics.h\"\n\n\nUSoConsoleExtensionComponent::USoConsoleExtensionComponent()\n{\n\tPrimaryComponentTick.bCanEverTick = false;\n}\n\n\nvoid USoConsoleExtensionComponent::BeginPlay()\n{\n\tSuper::BeginPlay();\n\tIConsoleManager& ConsoleManager = IConsoleManager::Get();\n\n\tAActor* OwnerActor = GetOwner();\n\tif (OwnerActor == nullptr)\n\t{\n\t\treturn;\n\t}\n\n\tfor (const UField* Field = OwnerActor->GetClass()->Children; Field != nullptr; Field = Field->Next)\n\t{\n\t\tif (const UFunction* Function = Cast<UFunction>(Field))\n\t\t{\n\t\t\tconst FString FunctionName = Field->GetName();\n\t\t\tif (PreFix.Compare(FunctionName.Left(PreFix.Len())) == 0)\n\t\t\t{\n\t\t\t\tConsoleObjects.Add(ConsoleManager.RegisterConsoleCommand(\n\t\t\t\t\t*FunctionName,\n\t\t\t\t\t*FunctionName,\n\t\t\t\t\tFConsoleCommandWithWorldArgsAndOutputDeviceDelegate::CreateLambda([this, FunctionName](const TArray<FString>& Args, UWorld* World, FOutputDevice& Ar)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (AActor* Actor = GetOwner())\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tFString Command = FunctionName;\n\t\t\t\t\t\t\tfor (const FString& Param : Args)\n\t\t\t\t\t\t\t\tCommand += FString(\" \") + Param;\n\n\t\t\t\t\t\t\tActor->CallFunctionByNameWithArguments(*Command, Ar, UGameplayStatics::GetPlayerCharacter(Actor, 0), true);\n\t\t\t\t\t\t}\n\t\t\t\t\t}), ECVF_Default)\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n}\n\n\nvoid USoConsoleExtensionComponent::EndPlay(const EEndPlayReason::Type EndPlayReason)\n{\n\tfor (IConsoleObject* Object : ConsoleObjects)\n\t\tIConsoleManager::Get().UnregisterConsoleObject(Object);\n\n\tConsoleObjects.Empty();\n\n\tSuper::EndPlay(EndPlayReason);\n}\n"
  },
  {
    "path": "Source/SOrb/Logic/SoConsoleExtensionComponent.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#pragma once\n\n#include \"CoreMinimal.h\"\n#include \"Components/ActorComponent.h\"\n#include \"SoConsoleExtensionComponent.generated.h\"\n\n/**\n *\n */\nUCLASS( ClassGroup=(Custom), meta=(BlueprintSpawnableComponent) )\nclass SORB_API USoConsoleExtensionComponent : public UActorComponent\n{\n\tGENERATED_BODY()\n\npublic:\n\n\tUSoConsoleExtensionComponent();\n\nprotected:\n\n\tvirtual void BeginPlay() override;\n\tvirtual void EndPlay(const EEndPlayReason::Type EndPlayReason) override;\n\nprotected:\n\n\tUPROPERTY(EditAnywhere)\n\tFString PreFix = \"SO_\";\n\n\tTArray<IConsoleObject*> ConsoleObjects;\n};\n"
  },
  {
    "path": "Source/SOrb/Logic/SoControllable.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#include \"SoControllable.h\"\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUSoControllable::USoControllable(const FObjectInitializer& PCIP)\n\t: Super(PCIP)\n{\n}\n"
  },
  {
    "path": "Source/SOrb/Logic/SoControllable.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#pragma once\n\n#include \"UObject/Interface.h\"\n#include \"SoControllable.generated.h\"\n\n\nUINTERFACE(BlueprintType, Blueprintable)\nclass SORB_API USoControllable : public UInterface\n{\n\tGENERATED_UINTERFACE_BODY()\n\n};\n\n\n/** Used by some levers to move or rotate objects between to positions */\nclass SORB_API ISoControllable\n{\n\tGENERATED_IINTERFACE_BODY()\n\n\tUFUNCTION(BlueprintNativeEvent, BlueprintCallable, Category = Triggerable)\n\tvoid OnControledValueChange(float fNewPercent);\n};\n"
  },
  {
    "path": "Source/SOrb/Logic/SoCooldown.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#pragma once\n\n#include \"SoCooldown.h\"\n\nUSoCooldown::USoCooldown(const FObjectInitializer& PCIP)\n{\n\n}\n"
  },
  {
    "path": "Source/SOrb/Logic/SoCooldown.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#pragma once\n\n#include \"UObject/Interface.h\"\n#include \"Engine/EngineTypes.h\"\n\n#include \"SoCooldown.generated.h\"\n\nclass UTexture2D;\n\n/**\n *  Interface for anything with cooldown: spells/strikes\n */\nUINTERFACE(BlueprintType, Blueprintable)\nclass SORB_API USoCooldown : public UInterface\n{\n\tGENERATED_UINTERFACE_BODY()\n};\n\nclass SORB_API ISoCooldown\n{\n\tGENERATED_IINTERFACE_BODY()\n\n\tUFUNCTION(BlueprintNativeEvent, BlueprintCallable, Category = Cooldown)\n\tfloat GetCooldownDuration() const;\n\n\tUFUNCTION(BlueprintNativeEvent, BlueprintCallable, Category = Cooldown)\n\tUTexture2D* GetCooldownIcon() const;\n\n\tUFUNCTION(BlueprintNativeEvent, BlueprintCallable, Category = Cooldown)\n\tbool CanCountDownInAir() const;\n};\n"
  },
  {
    "path": "Source/SOrb/Logic/SoFreezable.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#pragma once\n\n#include \"SoFreezable.h\"\n\nUSoFreezable::USoFreezable(const FObjectInitializer& PCIP)\n{\n\n}\n"
  },
  {
    "path": "Source/SOrb/Logic/SoFreezable.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#pragma once\n\n#include \"UObject/Interface.h\"\n#include \"Engine/EngineTypes.h\"\n\n#include \"SoFreezable.generated.h\"\n\n\n/**\n *  Interface to provide a stupid way of communication between different objects\n *  (e.g. a lever can send message to the three-story elevator with the 12 doors to open/close a few)\n *  both C++ and Blueprint classes can implement and use the interface\n */\nUINTERFACE(BlueprintType, Blueprintable)\nclass SORB_API USoFreezable : public UInterface\n{\n\tGENERATED_UINTERFACE_BODY()\n};\n\n/**\n *  Interface to provide a stupid way of communication between different objects\n *  (e.g. a lever can send message to the three-story elevator with the 12 doors to open/close a few)\n *  both C++ and Blueprint classes can implement and use the interface\n */\nclass SORB_API ISoFreezable\n{\n\tGENERATED_IINTERFACE_BODY()\n\n\tUFUNCTION(BlueprintNativeEvent, BlueprintCallable, Category = Triggerable)\n\tvoid OnIceStoneHit(const FHitResult& Hit);\n};\n"
  },
  {
    "path": "Source/SOrb/Logic/SoParticleSystemController.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#include \"SoParticleSystemController.h\"\n\n#include \"Particles/Emitter.h\"\n#include \"Particles/ParticleSystemComponent.h\"\n\n#include \"SplineLogic/SoSpline.h\"\n#include \"Character/SoCharacter.h\"\n#include \"Basic/Helpers/SoStaticHelper.h\"\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nASoParticleSystemController::ASoParticleSystemController()\n{\n \t// Set this actor to call Tick() every frame.  You can turn this off to improve performance if you don't need it.\n\tPrimaryActorTick.bCanEverTick = false;\n\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoParticleSystemController::BeginPlay()\n{\n\tSuper::BeginPlay();\n\tbJustBeganPlay = true;\n\n\t// build spline list from spline ptr-s\n\tfor (TAssetPtr<ASoSpline>& SplinePtr : WhiteListedSplinePtrList)\n\t{\n\t\tif (ASoSpline* Spline = SplinePtr.Get())\n\t\t\tWhiteListedSplineList.Add(Spline);\n\t}\n\n\tif (WhiteListedSplineList.Num() > 0)\n\t{\n\t\tASoCharacter* Character = USoStaticHelper::GetPlayerCharacterAsSoCharacter(this);\n\t\tif (Character != nullptr)\n\t\t{\n\t\t\tCharacter->OnPlayerSplineChanged.AddDynamic(this, &ASoParticleSystemController::OnPlayerSplineChanged);\n\t\t\tOnPlayerSplineChanged(nullptr, ISoSplineWalker::Execute_GetSplineLocationI(Character).GetSpline());\n\t\t}\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoParticleSystemController::EndPlay(const EEndPlayReason::Type EndPlayReason)\n{\n\tif (WhiteListedSplineList.Num() > 0)\n\t{\n\t\tASoCharacter* Character = USoStaticHelper::GetPlayerCharacterAsSoCharacter(this);\n\t\tif (Character != nullptr)\n\t\t\tCharacter->OnPlayerSplineChanged.RemoveDynamic(this, &ASoParticleSystemController::OnPlayerSplineChanged);\n\t\tWhiteListedSplineList.Empty();\n\t}\n\n\tSuper::EndPlay(EndPlayReason);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoParticleSystemController::OnPlayerSplineChanged(const ASoSpline* OldSpline, const ASoSpline* NewSpline)\n{\n\tconst bool bPlayerInWhitelisted = WhiteListedSplineList.Contains(NewSpline);\n\tif (bParticlesActive != bPlayerInWhitelisted || bJustBeganPlay)\n\t{\n\t\tbParticlesActive = bPlayerInWhitelisted;\n\n\t\tfor (AEmitter* Emitter : EmitterList)\n\t\t\tif (Emitter != nullptr)\n\t\t\t{\n\t\t\t\tif (bParticlesActive)\n\t\t\t\t\tEmitter->GetParticleSystemComponent()->Activate(false);\n\t\t\t\telse\n\t\t\t\t\tEmitter->GetParticleSystemComponent()->Deactivate();\n\t\t\t}\n\n\t\tbJustBeganPlay = false;\n\t}\n}\n"
  },
  {
    "path": "Source/SOrb/Logic/SoParticleSystemController.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#pragma once\n\n#include \"CoreMinimal.h\"\n#include \"GameFramework/Actor.h\"\n#include \"SoParticleSystemController.generated.h\"\n\nclass AEmitter;\nclass ASoSpline;\n\nUCLASS()\nclass SORB_API ASoParticleSystemController : public AActor\n{\n\tGENERATED_BODY()\n\npublic:\n\n\tASoParticleSystemController();\n\nprotected:\n\tvirtual void BeginPlay() override;\n\tvirtual void EndPlay(const EEndPlayReason::Type EndPlayReason) override;\n\npublic:\n\n\tUFUNCTION()\n\tvoid OnPlayerSplineChanged(const ASoSpline* OldSpline, const ASoSpline* NewSpline);\n\n\nprotected:\n\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere, Category = ControllerData)\n\tTArray<AEmitter*> EmitterList;\n\n\t/**\n\t *  Particles are only enabled if the palyer is on one of these splines\n\t */\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = ControllerData)\n\tTArray<TAssetPtr<ASoSpline>> WhiteListedSplinePtrList;\n\n\n\tUPROPERTY(BlueprintReadOnly, Category = ControllerData)\n\tTArray<ASoSpline*> WhiteListedSplineList;\n\n\tbool bParticlesActive = true;\n\tbool bJustBeganPlay = true;\n};\n"
  },
  {
    "path": "Source/SOrb/Logic/SoSimulated.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#pragma once\n\n#include \"SoSimulated.h\"\n\nUSoSimulated::USoSimulated(const FObjectInitializer& PCIP)\n{\n\n}\n"
  },
  {
    "path": "Source/SOrb/Logic/SoSimulated.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#pragma once\n\n#include \"UObject/Interface.h\"\n#include \"Engine/EngineTypes.h\"\n\n#include \"SoSimulated.generated.h\"\n\n\n\nUINTERFACE(BlueprintType, Blueprintable)\nclass SORB_API USoSimulated : public UInterface\n{\n\tGENERATED_UINTERFACE_BODY()\n};\n\nclass SORB_API ISoSimulated\n{\n\tGENERATED_IINTERFACE_BODY()\n\n\tUFUNCTION(BlueprintNativeEvent, BlueprintCallable, Category = Triggerable)\n\tvoid OnPlayerBounce(const FVector& PlayerVelocity, const FHitResult& HitData);\n};\n"
  },
  {
    "path": "Source/SOrb/Logic/SoTriggerChain.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#include \"SoTriggerChain.h\"\n\n#include \"Engine/World.h\"\n#include \"TimerManager.h\"\n\n#include \"Online/Analytics/SoAnalyticsHelper.h\"\n\n#include \"SaveFiles/SoWorldState.h\"\n#include \"SplineLogic/SoSpline.h\"\n#include \"SaveFiles/SoWorldStateBlueprint.h\"\n#include \"Basic/SoAudioManager.h\"\n#include \"Basic/Helpers/SoStaticHelper.h\"\n#include \"DlgDialogueParticipant.h\"\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nASoTriggerChain::ASoTriggerChain()\n{\n\tPrimaryActorTick.bCanEverTick = false;\n}\n\n#if WITH_EDITOR\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoTriggerChain::PostEditChangeProperty(FPropertyChangedEvent& PropertyChangedEvent)\n{\n\tSuper::PostEditChangeProperty(PropertyChangedEvent);\n\n\tif (Behavior == ESoTriggerChainBehavior::ETCB_RandomizedPattern)\n\t\tStepNum = FMath::Min(StepNum, Targets.Num());\n\n\tif (Behavior == ESoTriggerChainBehavior::ETCB_Pattern)\n\t{\n\t\tIndexTable.SetNum(StepNum);\n\t\tTimeTable.SetNum(StepNum);\n\t}\n\telse if (Behavior == ESoTriggerChainBehavior::ETCB_PatternNotHinted)\n\t{\n\t\tTimeTable.SetNum(0);\n\t\tIndexTable.SetNum(StepNum);\n\t}\n\telse\n\t{\n\t\tIndexTable.SetNum(0);\n\t\tTimeTable.SetNum(0);\n\t}\n}\n#endif\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoTriggerChain::BeginPlay()\n{\n\tSuper::BeginPlay();\n\n\t// fill the random pattern\n\tif (Behavior == ESoTriggerChainBehavior::ETCB_RandomizedPattern)\n\t{\n\t\tIndexTable.SetNum(StepNum);\n\t\tfor (int32 i = 0; i < StepNum; ++i)\n\t\t\tIndexTable[i] = i;\n\n\t\tfor (int32 i = 0; i < StepNum - 1; ++i)\n\t\t{\n\t\t\tconst int32 Index = FMath::RandRange(i + 1, StepNum - 1);\n\t\t\tIndexTable.Swap(i, Index);\n\t\t}\n\t}\n\n\tbSequenceStarted = false;\n\tbIgnoreTriggers = false;\n\n\tUSoEventHandlerHelper::SubscribeToPlayerRematerialize(this);\n\tUSoEventHandlerHelper::SubscribeToSoPostLoad(this);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoTriggerChain::EndPlay(const EEndPlayReason::Type EndPlayReason)\n{\n\tGetWorld()->GetTimerManager().ClearTimer(ResetTimer);\n\tGetWorld()->GetTimerManager().ClearTimer(InputWaitTimer);\n\n\tUSoEventHandlerHelper::UnsubscribeFromPlayerRematerialize(this);\n\tUSoEventHandlerHelper::UnsubscribeFromSoPostLoad(this);\n\n\tSuper::EndPlay(EndPlayReason);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoTriggerChain::Trigger_Implementation(const FSoTriggerData& TriggerData)\n{\n\t// UE_LOG(LogTemp, Warning, TEXT(\"Trigger %d seconds %f\"), TriggerData.SourceIdentifier, Seconds);\n\n\tGetWorld()->GetTimerManager().ClearTimer(InputWaitTimer);\n\tif (bIgnoreTriggers || StepCounter == StepNum)\n\t\treturn;\n\n\tif (bSequenceStarted)\n\t{\n\t\tif (TriggerData.SourceIdentifier == ExpectedInput)\n\t\t{\n\t\t\tconst int32 TriggerValue = ((Behavior != ESoTriggerChainBehavior::ETCB_Randomized) ? 1 : 0);\n\t\t\tISoTriggerable::Execute_Trigger(Targets[ExpectedInput], { TriggerValue, {} });\n\n\t\t\tif (SFXOnCorrectInput.IsValidIndex(StepCounter))\n\t\t\t\tUSoAudioManager::PlaySoundAtLocation(this, SFXOnCorrectInput[StepCounter], Targets[ExpectedInput]->GetActorTransform());\n\n\t\t\tStepCounter += 1;\n\t\t\tif (StepCounter == StepNum)\n\t\t\t{\n\t\t\t\tUSoTriggerHelper::TriggerAllElement(TriggerOnDone);\n\t\t\t\tUSoAudioManager::PlaySound2D(this, SFXOnDone);\n\n\t\t\t\tif (bRegisterAsMilestone)\n\t\t\t\t\tUSoAnalyticsHelper::RecordGameplayMilestone(this, USoStaticHelper::GetNameFromActor(this, \"TC_\"), true);\n\n\t\t\t\tif (BoolToSetTrueOnCharacter != NAME_None)\n\t\t\t\t\tIDlgDialogueParticipant::Execute_ModifyBoolValue(USoStaticHelper::GetPlayerCharacterAsActor(this), BoolToSetTrueOnCharacter, true);\n\n\t\t\t\tif (bResetOnDone)\n\t\t\t\t\tResetEverything();\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tif (bSerializeState)\n\t\t\t\t\t\tUSoWorldState::AddMyNameToSet(this);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t\tUpdateExpectedInput();\n\t\t}\n\t\telse\n\t\t\tInputFailed();\n\t}\n\telse\n\t{\n\t\tbSequenceStarted = true;\n\t\tStepCounter = 0;\n\t\tUpdateExpectedInput();\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoTriggerChain::HandlePlayerRematerialize_Implementation()\n{\n\tif (bResetOnPlayerRematerialize || StepCounter < StepNum)\n\t\tResetEverything();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoTriggerChain::HandleSoPostLoad_Implementation()\n{\n\tif (bSerializeState && USoWorldState::IsMyNameInSet(this))\n\t{\n\t\tfor (auto* Target : Targets)\n\t\t\tISoTriggerable::Execute_Trigger(Target, { 1, {} });\n\n\t\tStepCounter = StepNum;\n\t}\n\telse\n\t\tResetEverything();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoTriggerChain::UpdateExpectedInput()\n{\n\tswitch (Behavior)\n\t{\n\t\tcase ESoTriggerChainBehavior::ETCB_Randomized:\n\t\tif (Targets.Num() > 1)\n\t\t{\n\t\t\tconst int32 OldExpectedInput = ExpectedInput;\n\t\t\twhile (OldExpectedInput == ExpectedInput)\n\t\t\t\tExpectedInput = FMath::RandRange(0, Targets.Num() - 1);\n\t\t}\n\t\tbreak;\n\n\t\tcase ESoTriggerChainBehavior::ETCB_Pattern:\n\t\tcase ESoTriggerChainBehavior::ETCB_PatternNotHinted:\n\t\tcase ESoTriggerChainBehavior::ETCB_RandomizedPattern:\n\t\t\tExpectedInput = IndexTable.IsValidIndex(StepCounter) ? IndexTable[StepCounter] : -1;\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tbreak;\n\t}\n\n\tif (Behavior == ESoTriggerChainBehavior::ETCB_Randomized)\n\t{\n\t\tif (Targets.IsValidIndex(ExpectedInput))\n\t\t\tISoTriggerable::Execute_Trigger(Targets[ExpectedInput], { 1,{} });\n\n\t\tGetWorld()->GetTimerManager().SetTimer(InputWaitTimer, this, &ASoTriggerChain::InputFailed, TimeTable.IsValidIndex(StepCounter) ? TimeTable[StepCounter] : DefaultWaitTime);\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoTriggerChain::ResetEverything()\n{\n\tFSoTriggerData ResetData;\n\tResetData.SourceIdentifier = 0;\n\n\tfor (AActor* Target : Targets)\n\t\tif (Target != nullptr)\n\t\t\tISoTriggerable::Execute_Trigger(Target, ResetData);\n\n\tbIgnoreTriggers = false;\n\tbSequenceStarted = (Behavior == ESoTriggerChainBehavior::ETCB_RandomizedPattern ||\n\t\t\t\t\t\tBehavior == ESoTriggerChainBehavior::ETCB_PatternNotHinted);\n\tStepCounter = 0;\n\tif (IndexTable.IsValidIndex(StepCounter))\n\t\tExpectedInput = IndexTable[StepCounter];\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoTriggerChain::InputFailed()\n{\n\tFSoTriggerData InvalidInputData;\n\tInvalidInputData.SourceIdentifier = -1;\n\tfor (AActor* Target : Targets)\n\t\tISoTriggerable::Execute_Trigger(Target, InvalidInputData);\n\n\tGetWorld()->GetTimerManager().SetTimer(ResetTimer, this, &ASoTriggerChain::ResetEverything, 1.0f);\n\tbIgnoreTriggers = true;\n}\n"
  },
  {
    "path": "Source/SOrb/Logic/SoTriggerChain.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#pragma once\n#include \"GameFramework/Actor.h\"\n#include \"Engine/EngineTypes.h\"\n\n#include \"Basic/SoEventHandler.h\"\n#include \"SoTriggerable.h\"\n#include \"SoTriggerChain.generated.h\"\n\nclass UFMODEvent;\n\nUENUM(BlueprintType)\nenum class ESoTriggerChainBehavior : uint8\n{\n\tETCB_Randomized\t\t\tUMETA(DisplayName = \"Randomized\"),\n\tETCB_Pattern\t\t\tUMETA(DisplayName = \"Pattern\"),\n\tETCB_PatternNotHinted\tUMETA(DisplayName = \"PatternNotHinted\"),\n\tETCB_RandomizedPattern\tUMETA(DisplayName = \"RandomizedPattern\"),\n};\n\n\nUCLASS()\nclass SORB_API ASoTriggerChain : public AActor, public ISoTriggerable, public ISoEventHandler\n{\n\tGENERATED_BODY()\n\npublic:\n\t// Sets default values for this actor's properties\n\tASoTriggerChain();\n\n#if WITH_EDITOR\n\tvirtual void PostEditChangeProperty(FPropertyChangedEvent& PropertyChangedEvent) override;\n#endif\n\n\tvirtual void BeginPlay() override;\n\tvirtual void EndPlay(const EEndPlayReason::Type EndPlayReason) override;\n\n\tvirtual void Trigger_Implementation(const FSoTriggerData& TriggerData) override;\n\n\tvirtual void HandlePlayerRematerialize_Implementation() override;\n\tvirtual void HandleSoPostLoad_Implementation() override;\n\tvirtual void HandlePlayerRespawn_Implementation() override {};\n\tvirtual void HandleWhitelistedSplinesEntered_Implementation() override {};\n\tvirtual void HandleWhitelistedSplinesLeft_Implementation() override {};\n\nprotected:\n\n\tvoid UpdateExpectedInput();\n\n\tvoid ResetEverything();\n\tvoid InputFailed();\n\nprotected:\n\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere, Category = TriggerChain)\n\tTArray<AActor*> Targets;\n\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere, Category = TriggerChain)\n\tbool bResetOnDone = false;\n\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere, Category = TriggerChain)\n\tbool bResetOnPlayerRematerialize = false;\n\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere, Category = TriggerChain)\n\tbool bSerializeState = false;\n\n\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere, Category = TriggerChain)\n\tTArray<FSoTriggerableData> TriggerOnDone;\n\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere, Category = TriggerChain)\n\tUFMODEvent* SFXOnDone;\n\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere, Category = TriggerChain)\n\tTArray<UFMODEvent*> SFXOnCorrectInput;\n\n\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere, Category = TriggerChain, Meta = (ClampMin = 0))\n\tint32 StepNum = 4;\n\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere, Category = TriggerChain)\n\tESoTriggerChainBehavior Behavior;\n\n\t/** Used if the array is not filled or with ETCB_Randomized */\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere, Category = TriggerChain)\n\tfloat DefaultWaitTime;\n\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere, EditFixedSize, Category = TriggerChain)\n\tTArray<int32> IndexTable;\n\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere, EditFixedSize, Category = TriggerChain)\n\tTArray<float> TimeTable;\n\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere, Category = TriggerChain)\n\tbool bRegisterAsMilestone;\n\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere, Category = TriggerChain)\n\tFName BoolToSetTrueOnCharacter;\n\n\tbool bSequenceStarted = false;\n\tbool bIgnoreTriggers = false;\n\tint32 StepCounter = 0;\n\n\tint32 ExpectedInput;\n\n\tFTimerHandle ResetTimer;\n\tFTimerHandle InputWaitTimer;\n};\n"
  },
  {
    "path": "Source/SOrb/Logic/SoTriggerable.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#include \"SoTriggerable.h\"\n\n#include \"GameFramework/Actor.h\"\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUSoTriggerable::USoTriggerable(const FObjectInitializer& PCIP)\n\t: Super(PCIP)\n{\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUSoTriggerHelper::USoTriggerHelper(const FObjectInitializer& ObjectInitializer)\n\t: Super(ObjectInitializer)\n{\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUSoTriggerHelper::~USoTriggerHelper()\n{\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoTriggerHelper::TriggerAllElement(TArray<FSoTriggerableData>& TriggerableData)\n{\n\tfor (FSoTriggerableData& Entry : TriggerableData)\n\t\tif (Entry.TargetTriggerable != nullptr && Entry.TargetTriggerable->GetClass()->ImplementsInterface(USoTriggerable::StaticClass()))\n\t\t\tISoTriggerable::Execute_Trigger(Entry.TargetTriggerable, Entry.TriggerData);\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoTriggerHelper::TriggerAll(TArray<FSoTriggerableDataArray>& TriggerData)\n{\n\tfor (FSoTriggerableDataArray& Entry : TriggerData)\n\t{\n\t\tif (Entry.TargetTriggerable != nullptr && Entry.TargetTriggerable->GetClass()->ImplementsInterface(USoTriggerable::StaticClass()))\n\t\t{\n\t\t\tfor (const FSoTriggerData& Data : Entry.TriggerData)\n\t\t\t\tISoTriggerable::Execute_Trigger(Entry.TargetTriggerable, Data);\n\t\t}\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoTriggerHelper::TriggerActor(AActor* ActorToTrigger, int32 SourceIdentifier)\n{\n\tif (ActorToTrigger != nullptr)\n\t\tISoTriggerable::Execute_Trigger(ActorToTrigger, { SourceIdentifier, {} });\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoTriggerHelper::TriggerActorArray(TArray<AActor*> ActorsToTrigger, int32 SourceIdentifier)\n{\n\tfor (AActor* Actor : ActorsToTrigger)\n\t\tif (Actor != nullptr)\n\t\t\tISoTriggerable::Execute_Trigger(Actor, { SourceIdentifier,{} });\n}\n"
  },
  {
    "path": "Source/SOrb/Logic/SoTriggerable.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#pragma once\n\n#include \"UObject/Interface.h\"\n\n#include \"SoTriggerable.generated.h\"\n\n/**\n*  Struct used by a weird communication channel between objects\n*  SourceIdentifier is typically the ID of the triggering object, but can be more to give extra information (e.g. triggered movement direction)\n*  TargetIdentifiers: can be empty or can contain any integer which can mean pretty much anything based on the object\n*  Interpretation of the data depends on the receiver, the sender should respect that\n*/\nUSTRUCT(BlueprintType)\nstruct FSoTriggerData\n{\n\tGENERATED_USTRUCT_BODY()\npublic:\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = TriggerData)\n\tint32 SourceIdentifier;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = TriggerData)\n\tTArray<int32> TargetIdentifiers;\n};\n\n/**\n*  Helper struct for triggers\n*/\nUSTRUCT(BlueprintType)\nstruct FSoTriggerableData\n{\n\tGENERATED_USTRUCT_BODY()\npublic:\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = TriggerData)\n\tAActor* TargetTriggerable;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = TriggerData)\n\tFSoTriggerData TriggerData;\n};\n/**\n*  More struct -> more fun\n*/\nUSTRUCT(BlueprintType)\nstruct FSoTriggerableDataArray\n{\n\tGENERATED_USTRUCT_BODY()\npublic:\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = TriggerData)\n\tAActor* TargetTriggerable;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = TriggerData)\n\tTArray<FSoTriggerData> TriggerData;\n};\n\n\n/** Triggerable interface helper functions */\nUCLASS()\nclass SORB_API USoTriggerHelper : public UObject\n{\n\tGENERATED_UCLASS_BODY()\npublic:\n\n\tvirtual ~USoTriggerHelper();\n\n\tUFUNCTION(BlueprintCallable, Category = Trigger)\n\tstatic void TriggerAllElement(UPARAM(ref)TArray<FSoTriggerableData>& TriggerableData);\n\n\tUFUNCTION(BlueprintCallable, Category = Trigger)\n\tstatic void TriggerAll(UPARAM(ref)TArray<FSoTriggerableDataArray>& TriggerData);\n\n\tUFUNCTION(BlueprintCallable, Category = Trigger)\n\tstatic void TriggerActor(AActor* ActorToTrigger, int32 SourceIdentifier);\n\n\tUFUNCTION(BlueprintCallable, Category = Trigger)\n\tstatic void TriggerActorArray(TArray<AActor*> ActorsToTrigger, int32 SourceIdentifier);\n};\n\n\n/**\n *  Interface to provide a stupid way of communication between different objects\n *  (e.g. a lever can send message to the three-story elevator with the 12 doors to open/close a few)\n *  both C++ and Blueprint classes can implement and use the interface\n */\nUINTERFACE(BlueprintType, Blueprintable)\nclass SORB_API USoTriggerable : public UInterface\n{\n\tGENERATED_UINTERFACE_BODY()\n};\n\n/**\n*  Interface to provide a stupid way of communication between different objects\n*  (e.g. a lever can send message to the three-story elevator with the 12 doors to open/close a few)\n*  both C++ and Blueprint classes can implement and use the interface\n*/\nclass SORB_API ISoTriggerable\n{\n\tGENERATED_IINTERFACE_BODY()\n\n\tUFUNCTION(BlueprintNativeEvent, BlueprintCallable, Category = Triggerable)\n\tvoid Trigger(const FSoTriggerData& TriggerData);\n};\n"
  },
  {
    "path": "Source/SOrb/Logic/SoTutorialDecal.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#include \"SoTutorialDecal.h\"\n\n#include \"Components/ArrowComponent.h\"\n#include \"Components/BillboardComponent.h\"\n#include \"Components/DecalComponent.h\"\n#include \"Components/SpotLightComponent.h\"\n#include \"Materials/MaterialInstanceDynamic.h\"\n#include \"Engine/Texture2D.h\"\n\n#include \"Basic/SoGameSingleton.h\"\n#include \"SaveFiles/SoWorldState.h\"\n#include \"Character/SoPlayerController.h\"\n#include \"Settings/SoGameSettings.h\"\n#include \"Settings/Input/SoInputHelper.h\"\n#include \"SaveFiles/SoWorldStateBlueprint.h\"\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nASoTutorialDecal::ASoTutorialDecal()\n{\n\tPrimaryActorTick.bCanEverTick = true;\n\n\tSprite = CreateDefaultSubobject<UBillboardComponent>(TEXT(\"SoSprite\"));\n\tSetRootComponent(Sprite);\n\n\tArrow = CreateDefaultSubobject<UArrowComponent>(TEXT(\"SoArrow\"));\n\tArrow->SetupAttachment(RootComponent);\n\n\tDecalCharacter = CreateDefaultSubobject<UDecalComponent>(TEXT(\"SoDecalCharacter\"));\n\tDecalCharacter->SetupAttachment(RootComponent);\n\n\tDecalKeyAnim0 = CreateDefaultSubobject<UDecalComponent>(TEXT(\"SoDecalKeyAnim0\"));\n\tDecalKeyAnim0->SetupAttachment(RootComponent);\n\tDecalKeyAnim1 = CreateDefaultSubobject<UDecalComponent>(TEXT(\"SoDecalKeyAnim1\"));\n\tDecalKeyAnim1->SetupAttachment(RootComponent);\n\tDecalKeyAnim2 = CreateDefaultSubobject<UDecalComponent>(TEXT(\"SoDecalKeyAnim2\"));\n\tDecalKeyAnim2->SetupAttachment(RootComponent);\n\n\tSpotLight = CreateDefaultSubobject<USpotLightComponent>(TEXT(\"SoSpotLight\"));\n\tSpotLight->SetupAttachment(RootComponent);\n}\n\n\n#if WITH_EDITOR\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoTutorialDecal::PostEditChangeProperty(FPropertyChangedEvent& PropertyChangedEvent)\n{\n\tSuper::PostEditChangeProperty(PropertyChangedEvent);\n\n\tif (Cast<ULevel>(GetOuter()) != nullptr)\n\t\tReinitialize();\n}\n#endif\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoTutorialDecal::BeginPlay()\n{\n\tSuper::BeginPlay();\n\n\tTriggerCounter = 0;\n\tif (ASoPlayerController* PlayerController = ASoPlayerController::GetInstance(this))\n\t{\n\t\tPlayerController->OnDeviceTypeChanged().AddDynamic(this, &ASoTutorialDecal::OnDeviceChanged);\n\t\tCurrentDeviceType = PlayerController->GetCurrentDeviceType();\n\t\tReinitialize();\n\t}\n\telse\n\t\tReinitialize();\n\n\t// this will also call postload which resets the decal\n\tUSoEventHandlerHelper::SubscribeToSoPostLoad(this);\n\n\tUSoGameSettings::Get().OnInputSettingsApplied.AddDynamic(this, &ASoTutorialDecal::OnInputSettingsApplied);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoTutorialDecal::EndPlay(const EEndPlayReason::Type EndPlayReason)\n{\n\tUSoEventHandlerHelper::UnsubscribeFromSoPostLoad(this);\n\n\tif (ASoPlayerController* PlayerController = ASoPlayerController::GetInstance(this))\n\t\tPlayerController->OnDeviceTypeChanged().RemoveDynamic(this, &ASoTutorialDecal::OnDeviceChanged);\n\n\tif (USoGameSettings* GameSettings = USoGameSettings::GetInstance())\n\t\tGameSettings->OnInputSettingsApplied.RemoveDynamic(this, &ASoTutorialDecal::OnInputSettingsApplied);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoTutorialDecal::Tick(float DeltaSeconds)\n{\n\tSuper::Tick(DeltaSeconds);\n\n\tCurrentValue = FMath::FInterpTo(CurrentValue, FadeTarget, DeltaSeconds, 1.0f);\n\tUpdate();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoTutorialDecal::Trigger_Implementation(const FSoTriggerData& TriggerData)\n{\n\tif (TriggerData.SourceIdentifier == 0)\n\t{\n\t\tFadeTarget = 0.0f;\n\t\tif (bEnabledByDefault)\n\t\t\tUSoWorldState::AddMyNameToSet(this);\n\t}\n\telse\n\t{\n\t\tTriggerCounter += 1;\n\t\tif (TriggerCounter == TriggerBeforeFade)\n\t\t{\n\t\t\tFadeTarget = 1.0f;\n\n\t\t\tif (!bEnabledByDefault)\n\t\t\t\tUSoWorldState::AddMyNameToSet(this);\n\t\t}\n\t}\n\n\tSetActorTickEnabled(true);\n\tDecalCharacter->SetVisibility(true);\n\tSpotLight->SetVisibility(true);\n\n\tconst TArray<FSoTutorialKeyParam>& KeyParams = (CurrentDeviceType == ESoInputDeviceType::Keyboard) ? KeyParamsKeyboard : KeyParamsController;\n\tUDecalComponent* KeyDecals[] = { DecalKeyAnim0, DecalKeyAnim1, DecalKeyAnim2 };\n\tfor (int32 i = 0; i < 3; ++i)\n\t{\n\t\tconst bool bUsed = KeyParams.IsValidIndex(i);\n\t\tKeyDecals[i]->SetVisibility(bUsed);\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoTutorialDecal::HandleSoPostLoad_Implementation()\n{\n\tconst bool bChanged = USoWorldState::IsMyNameInSet(this);\n\n\tTriggerCounter = 0;\n\tFadeTarget = (bEnabledByDefault == bChanged) ? 0.0f : 1.0f;\n\tCurrentValue = FadeTarget;\n\tUpdate();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoTutorialDecal::OnDeviceChanged(ESoInputDeviceType NewDeviceType)\n{\n\tCurrentDeviceType = NewDeviceType;\n\tReinitialize();\n\tUpdate();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoTutorialDecal::OnInputSettingsApplied()\n{\n\tReinitialize();\n\tUpdate();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoTutorialDecal::Reinitialize()\n{\n\t// main decal\n\t{\n\t\tUMaterialInstanceDynamic* DynamicMaterial = Cast<UMaterialInstanceDynamic>(DecalCharacter->GetDecalMaterial());\n\t\tif (DynamicMaterial == nullptr)\n\t\t{\n\t\t\tDecalCharacter->SetDecalMaterial(BaseMaterial);\n\t\t\tDynamicMaterial = DecalCharacter->CreateDynamicMaterialInstance();\n\t\t}\n\t\tif (DynamicMaterial != nullptr)\n\t\t{\n\t\t\tDynamicMaterial->SetScalarParameterValue(FName(\"PeriodTime\"), PeriodTime);\n\t\t\tDynamicMaterial->SetScalarParameterValue(FName(\"TextureUsagePercent\"), UsedAtlasSlotCount / static_cast<float>(RowNum * ColNum));\n\t\t\tDynamicMaterial->SetScalarParameterValue(FName(\"RowNum\"), static_cast<float>(RowNum));\n\t\t\tDynamicMaterial->SetScalarParameterValue(FName(\"ColNum\"), static_cast<float>(ColNum));\n\t\t\tDynamicMaterial->SetScalarParameterValue(FName(\"Exponent\"), Exponent);\n\t\t\tDynamicMaterial->SetTextureParameterValue(FName(\"Texture\"), DecalTexture);\n\t\t}\n\t}\n\n\tconst TArray<FSoTutorialKeyParam>& KeyParams = (CurrentDeviceType == ESoInputDeviceType::Keyboard) ? KeyParamsKeyboard : KeyParamsController;\n\tUDecalComponent* KeyDecals[] = { DecalKeyAnim0, DecalKeyAnim1, DecalKeyAnim2 };\n\tfor (int32 i = 0; i < 3; ++i)\n\t{\n\t\tconst bool bUsed = KeyParams.IsValidIndex(i);\n\t\tKeyDecals[i]->SetVisibility(bUsed);\n\t\tif (bUsed)\n\t\t{\n\t\t\tbool bSquare = true;\n\t\t\tKeyDecals[i]->SetRelativeLocation(KeyParams[i].RelativeLocation);\n\n\t\t\tUMaterialInstanceDynamic* DynamicMaterial = Cast<UMaterialInstanceDynamic>(KeyDecals[i]->GetDecalMaterial());\n\t\t\tif (DynamicMaterial == nullptr || DynamicMaterial->Parent != (KeyParams[i].bDoublePress ? KeyMaterialDoublePress : KeyMaterial))\n\t\t\t{\n\t\t\t\tKeyDecals[i]->SetDecalMaterial(KeyParams[i].bDoublePress ? KeyMaterialDoublePress : KeyMaterial);\n\t\t\t\tDynamicMaterial = KeyDecals[i]->CreateDynamicMaterialInstance();\n\t\t\t}\n\t\t\tif (DynamicMaterial != nullptr)\n\t\t\t{\n\t\t\t\tDynamicMaterial->SetScalarParameterValue(FName(\"PeriodTime\"), PeriodTime * KeyPeriodMultiplier);\n\n\t\t\t\tDynamicMaterial->SetScalarParameterValue(FName(\"PressedStart\"), KeyParams[i].PressIntervals.X);\n\t\t\t\tDynamicMaterial->SetScalarParameterValue(FName(\"PressedEnd\"), KeyParams[i].PressIntervals.Y);\n\n\t\t\t\tUTexture2D* FirstTexture = USoGameSingleton::GetIconForInputActionNameType(KeyParams[i].InputAction, CurrentDeviceType, true);\n\t\t\t\tDynamicMaterial->SetTextureParameterValue(FName(\"PressedTexture\"), FirstTexture);\n\t\t\t\tif (FirstTexture != nullptr)\n\t\t\t\t\tbSquare = FirstTexture->GetSizeX() == FirstTexture->GetSizeY();\n\n\t\t\t\tUTexture2D* SecondTexture = nullptr;\n\t\t\t\tif (KeyParams[i].bUseSecondaryInputActionInsteadOfUnpressed)\n\t\t\t\t{\n\t\t\t\t\tSecondTexture = USoGameSingleton::GetIconForInputActionNameType(KeyParams[i].SecondaryInputAction, CurrentDeviceType, true);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t// check for special case: unpressed movement stick\n\t\t\t\t\tif (CurrentDeviceType != ESoInputDeviceType::Keyboard &&\n\t\t\t\t\t\t(KeyParams[i].InputAction == ESoInputActionNameType::IANT_MoveLeft || KeyParams[i].InputAction == ESoInputActionNameType::IANT_MoveRight))\n\t\t\t\t\t{\n\t\t\t\t\t\tFInputActionKeyMapping KeyMapping;\n\t\t\t\t\t\tconst TArray<FInputActionKeyMapping> ActionMappings = USoGameSettings::Get().GetGamepadInputActionMappingsForActionName(\n\t\t\t\t\t\t\tFSoInputActionName::MoveLeft,\n\t\t\t\t\t\t\tfalse\n\t\t\t\t\t\t);\n\t\t\t\t\t\tif (USoInputHelper::GetFirstInputActionKeyMapping(ActionMappings, KeyMapping))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tconst FName ThumbStickDirection = KeyMapping.Key.GetFName();\n\t\t\t\t\t\t\tconst FName ThumbStick = FSoInputKey::GetThumbStickForStickDirection(ThumbStickDirection);\n\n\t\t\t\t\t\t\tFSoInputGamepadKeyTextures Textures;\n\t\t\t\t\t\t\tif (USoGameSingleton::GetGamepadKeyTexturesFromKeyName(ThumbStick, false, Textures))\n\t\t\t\t\t\t\t\tSecondTexture = Textures.GetTextureForDeviceType(CurrentDeviceType);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t\tSecondTexture = USoGameSingleton::GetIconForInputActionNameType(KeyParams[i].InputAction, CurrentDeviceType, false); // grab unpressed key\n\t\t\t\t}\n\n\t\t\t\tDynamicMaterial->SetTextureParameterValue(FName(\"UnpressedTexture\"), SecondTexture);\n\t\t\t}\n\t\t\tKeyDecals[i]->DecalSize = GetDecalSize(bSquare);\n\t\t\tKeyDecals[i]->PushSelectionToProxy();\n\t\t}\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFVector ASoTutorialDecal::GetDecalSize(bool bSquared) const\n{\n\tif (CurrentDeviceType == ESoInputDeviceType::Keyboard)\n\t\treturn bSquared ? FVector(16.0f, 32.0f, 32.0f) : FVector(16.0f, 32.0f, 64.0f);\n\n\treturn FVector(16.0f, 48.0f, 48.0f);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoTutorialDecal::SetScalarOnDecalSafe(UDecalComponent* Decal, FName Name, float Value)\n{\n\tif (Decal != nullptr)\n\t{\n\t\tif (UMaterialInstanceDynamic* DynamicMaterial = Cast<UMaterialInstanceDynamic>(Decal->GetDecalMaterial()))\n\t\t\tDynamicMaterial->SetScalarParameterValue(Name, Value);\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoTutorialDecal::Update()\n{\n\tSpotLight->SetIntensity(CurrentValue);\n\tstatic const FName OpacityName = FName(\"Opacity\");\n\tSetScalarOnDecalSafe(DecalCharacter, OpacityName, CurrentValue);\n\tSetScalarOnDecalSafe(DecalKeyAnim0, OpacityName, CurrentValue);\n\tSetScalarOnDecalSafe(DecalKeyAnim1, OpacityName, CurrentValue);\n\tSetScalarOnDecalSafe(DecalKeyAnim2, OpacityName, CurrentValue);\n\n\tif (fabs(CurrentValue - FadeTarget) < KINDA_SMALL_NUMBER)\n\t{\n\t\tSetActorTickEnabled(false);\n\t\tif (CurrentValue < 0.1f)\n\t\t{\n\t\t\tDecalCharacter->SetVisibility(false);\n\t\t\tDecalKeyAnim0->SetVisibility(false);\n\t\t\tDecalKeyAnim1->SetVisibility(false);\n\t\t\tDecalKeyAnim2->SetVisibility(false);\n\t\t\tSpotLight->SetVisibility(false);\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "Source/SOrb/Logic/SoTutorialDecal.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#pragma once\n\n#include \"CoreMinimal.h\"\n#include \"GameFramework/Actor.h\"\n\n#include \"Settings/Input/SoInputNames.h\"\n#include \"Logic/SoTriggerable.h\"\n#include \"Basic/SoEventHandler.h\"\n\n#include \"SoTutorialDecal.generated.h\"\n\nclass UArrowComponent;\nclass UBillboardComponent;\nclass UDecalComponent;\nclass USpotLightComponent;\nclass UMaterialInterface;\n\nUSTRUCT(BlueprintType)\nstruct SORB_API FSoTutorialKeyParam\n{\n\tGENERATED_USTRUCT_BODY()\n\npublic:\n\n\tUPROPERTY(EditAnywhere, BlueprintReadOnly)\n\tFVector2D PressIntervals;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadOnly)\n\tFVector RelativeLocation;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadOnly)\n\tESoInputActionNameType InputAction;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadOnly)\n\tbool bUseSecondaryInputActionInsteadOfUnpressed;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadOnly)\n\tESoInputActionNameType SecondaryInputAction;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadOnly)\n\tbool bDoublePress;\n};\n\n\nUCLASS()\nclass SORB_API ASoTutorialDecal : public AActor, public ISoEventHandler, public ISoTriggerable\n{\n\tGENERATED_BODY()\n\npublic:\n\tASoTutorialDecal();\n\n#if WITH_EDITOR\n\tvirtual void PostEditChangeProperty(FPropertyChangedEvent& PropertyChangedEvent) override;\n#endif\n\nprotected:\n\tvirtual void BeginPlay() override;\n\tvirtual void EndPlay(const EEndPlayReason::Type EndPlayReason) override;\n\tvirtual void Tick(float DeltaSeconds) override;\n\n\n\t// SoEventHandler interface\n\tvirtual void HandleSoPostLoad_Implementation() override;\n\tvirtual void HandlePlayerRematerialize_Implementation() override {};\n\tvirtual void HandlePlayerRespawn_Implementation() override {};\n\tvirtual void HandleWhitelistedSplinesEntered_Implementation() override {};\n\tvirtual void HandleWhitelistedSplinesLeft_Implementation() override {};\n\t// SoTriggerable interface\n\tvoid Trigger_Implementation(const FSoTriggerData& TriggerData) override;\n\nprotected:\n\n\tUFUNCTION(BlueprintCallable)\n\tvoid OnDeviceChanged(ESoInputDeviceType NewDeviceType);\n\n\tUFUNCTION(BlueprintCallable)\n\tvoid OnInputSettingsApplied();\n\n\tvoid Reinitialize();\n\n\tvoid SetScalarOnDecalSafe(UDecalComponent* Decal, FName Name, float Value);\n\n\tvoid Update();\n\n\tFVector GetDecalSize(bool bSquared) const;\n\nprotected:\n\n\tUPROPERTY(EditAnywhere, BlueprintReadOnly)\n\tUBillboardComponent* Sprite;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadOnly)\n\tUArrowComponent* Arrow;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadOnly)\n\tUDecalComponent* DecalCharacter;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadOnly)\n\tUDecalComponent* DecalKeyAnim0;\n\tUPROPERTY(EditAnywhere, BlueprintReadOnly)\n\tUDecalComponent* DecalKeyAnim1;\n\tUPROPERTY(EditAnywhere, BlueprintReadOnly)\n\tUDecalComponent* DecalKeyAnim2;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadOnly)\n\tUSpotLightComponent* SpotLight;\n\n\n\tUPROPERTY(EditAnywhere, BlueprintReadOnly, Category = DecalControl)\n\tbool bEnabledByDefault;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadOnly, Category = DecalControl)\n\tint32 TriggerBeforeFade;\n\n\tUPROPERTY()\n\tint32 TriggerCounter = 0;\n\n\n\tUPROPERTY(EditAnywhere, BlueprintReadOnly, Category = DecalParam)\n\tfloat PeriodTime = 1.0f;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadOnly, Category = DecalParam)\n\tfloat KeyPeriodMultiplier = 1.0f;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadOnly, Category = DecalParam)\n\tint32 RowNum = 8;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadOnly, Category = DecalParam)\n\tint32 ColNum = 8;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadOnly, Category = DecalParam)\n\tint32 UsedAtlasSlotCount = 64;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadOnly, Category = DecalParam)\n\tfloat Exponent = 1.0f;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadOnly, Category = DecalParam)\n\tUTexture2D* DecalTexture;\n\n\n\tUPROPERTY(EditAnywhere, BlueprintReadOnly, Category = DecalParam)\n\tTArray<FSoTutorialKeyParam> KeyParamsKeyboard;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadOnly, Category = DecalParam)\n\tTArray<FSoTutorialKeyParam> KeyParamsController;\n\n\n\tUPROPERTY(EditAnywhere, BlueprintReadOnly, Category = DecalDefaults)\n\tUMaterialInterface* BaseMaterial;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadOnly, Category = DecalDefaults)\n\tUMaterialInterface* KeyMaterial;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadOnly, Category = DecalDefaults)\n\tUMaterialInterface* KeyMaterialDoublePress;\n\n\n\tUPROPERTY(BlueprintReadOnly)\n\tESoInputDeviceType CurrentDeviceType;\n\n\tfloat FadeTarget = 1.0f;\n\tfloat CurrentValue = 0.0f;\n};\n"
  },
  {
    "path": "Source/SOrb/Objects/SoDestructible.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#include \"SoDestructible.h\"\n#include \"DestructibleComponent.h\"\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nASoDestructible::ASoDestructible()\n{\n\tPrimaryActorTick.bCanEverTick = false;\n\n\tDestructible = CreateDefaultSubobject<UDestructibleComponent>(\"DestructibleMesh\");\n\tRootComponent = Destructible;\n}\n"
  },
  {
    "path": "Source/SOrb/Objects/SoDestructible.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#pragma once\n#include \"GameFramework/Actor.h\"\n#include \"SoDestructible.generated.h\"\n\nclass UDestructibleComponent;\n\n/*\n *  UDestructibleComponents created in BP are buggy so Destructibles need a c++ base\n */\nUCLASS()\nclass SORB_API ASoDestructible : public AActor\n{\n\tGENERATED_BODY()\n\npublic:\n\t// Sets default values for this actor's properties\n\tASoDestructible();\n\nprotected:\n\tUDestructibleComponent* Destructible = nullptr;\n};\n"
  },
  {
    "path": "Source/SOrb/Objects/SoFadingPlatform.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#include \"SoFadingPlatform.h\"\n\n#include \"Components/BoxComponent.h\"\n#include \"Components/StaticMeshComponent.h\"\n\n#include \"Basic/Helpers/SoStaticHelper.h\"\n#include \"Character/SoCharacter.h\"\n#include \"Basic/SoAudioManager.h\"\n\nconst FName ASoFadingPlatform::OPAddName = \"OP_Add\";\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nASoFadingPlatform::ASoFadingPlatform()\n{\n\tPrimaryActorTick.bCanEverTick = true;\n\n\tRoot = CreateDefaultSubobject<USceneComponent>(TEXT(\"SceneRoot\"));\n\tRootComponent = Root;\n\n\tMesh = CreateDefaultSubobject<UStaticMeshComponent>(TEXT(\"Mesh\"));\n\tMesh->SetupAttachment(RootComponent);\n\n\tFadeInArea = CreateDefaultSubobject<UBoxComponent>(TEXT(\"FadeInArea\"));\n\tFadeInArea->SetupAttachment(RootComponent);\n\n\tFadeOutArea = CreateDefaultSubobject<UBoxComponent>(TEXT(\"FadeOutArea\"));\n\tFadeOutArea->SetupAttachment(RootComponent);\n\n\tFadeInArea->OnComponentBeginOverlap.AddDynamic(this, &ASoFadingPlatform::OnFadeInSignal);\n\tFadeOutArea->OnComponentBeginOverlap.AddDynamic(this, &ASoFadingPlatform::OnFadeOutSignal);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoFadingPlatform::BeginPlay()\n{\n\tSuper::BeginPlay();\n\tReset();\n\n\tASoCharacter* SoCharacter = USoStaticHelper::GetPlayerCharacterAsSoCharacter(this);\n\tif (SoCharacter != nullptr)\n\t\tSoCharacter->OnPlayerRematerialized.AddDynamic(this, &ASoFadingPlatform::Reset);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoFadingPlatform::EndPlay(const EEndPlayReason::Type EndPlayReason)\n{\n\tSuper::EndPlay(EndPlayReason);\n\n\tASoCharacter* SoCharacter = USoStaticHelper::GetPlayerCharacterAsSoCharacter(this);\n\tif (SoCharacter != nullptr)\n\t\tSoCharacter->OnPlayerRematerialized.RemoveDynamic(this, &ASoFadingPlatform::Reset);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoFadingPlatform::Tick(float DeltaTime)\n{\n\tSuper::Tick(DeltaTime);\n\tUpdate(DeltaTime);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoFadingPlatform::Update(float DeltaSeconds)\n{\n\tbool bFadeIn = false;\n\n\tswitch (State)\n\t{\n\t\tcase EFPS_FadedOut:\n\t\tcase EFPS_FadedIn:\n\t\t\tSetActorTickEnabled(false);\n\t\t\treturn;\n\n\t\tcase EFPS_WaitBeforeFadeIn:\n\t\t\tbFadeIn = true;\n\t\tcase EFPS_WaitBeforeFadeOut:\n\t\t\tCounter -= DeltaSeconds;\n\t\t\tif (Counter < 0.0f)\n\t\t\t{\n\t\t\t\tconst float RestTime = -Counter;\n\t\t\t\tCounter = bFadeIn ? FadeInTime : FadeOutTime;\n\t\t\t\tState = bFadeIn ? EFPS_FadeIn : EFPS_FadeOut;\n\t\t\t\tUFMODEvent* EventToPlay = bFadeIn ? SFXFadeIn : SFXFadeOut;\n\t\t\t\tif (EventToPlay != nullptr)\n\t\t\t\t\tUSoAudioManager::PlaySoundAtLocation(this, EventToPlay, GetActorTransform());\n\t\t\t\tUpdate(RestTime);\n\t\t\t}\n\t\t\treturn;\n\n\t\tcase EFPS_FadeIn:\n\t\t\tbFadeIn = true;\n\t\tcase EFPS_FadeOut:\n\t\t{\n\t\t\tCounter -= DeltaSeconds;\n\t\t\tfloat FadePercent = FMath::Clamp(Counter / (bFadeIn ? FadeInTime : FadeOutTime), 0.0f, 1.0f);\n\t\t\tif (bFadeIn)\n\t\t\t\tFadePercent = 1.0f - FadePercent;\n\t\t\tMesh->SetCollisionEnabled(FadePercent > CollisionOffPercent ? ECollisionEnabled::QueryAndPhysics : ECollisionEnabled::NoCollision);\n\t\t\tMesh->SetVisibility(FadePercent > KINDA_SMALL_NUMBER);\n\t\t\tMesh->SetScalarParameterValueOnMaterials(OPAddName, FadePercent);\n\n\t\t\tif (Counter < 0.0f)\n\t\t\t{\n\t\t\t\tState = bFadeIn ? EFPS_FadedIn : EFPS_FadedOut;\n\n\t\t\t\tif (bFadeIn != bFadeInRequestWasLast)\n\t\t\t\t{\n\t\t\t\t\tState = bFadeInRequestWasLast ? EFPS_WaitBeforeFadeIn : EFPS_WaitBeforeFadeOut;\n\t\t\t\t\tCounter = bFadeInRequestWasLast ? FadeInTime : FadeOutDelay;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t\tSetActorTickEnabled(false);\n\t\t\t}\n\t\t}\n\t\treturn;\n\n\t\tdefault:\n\t\t\treturn;\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoFadingPlatform::Reset()\n{\n\tSetActorTickEnabled(false);\n\tState = bFadedInByDefault ? EFPS_FadedIn : EFPS_FadedOut;\n\tMesh->SetCollisionEnabled(bFadedInByDefault ? ECollisionEnabled::QueryAndPhysics : ECollisionEnabled::NoCollision);\n\tMesh->SetVisibility(bFadedInByDefault);\n\n\tbFadeInRequestWasLast = bFadedInByDefault;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoFadingPlatform::OnFadeInSignal(UPrimitiveComponent* OverlappedComponent,\n\t\t\t\t\t\t\t\t\t   AActor* OtherActor,\n\t\t\t\t\t\t\t\t\t   UPrimitiveComponent* OtherComp,\n\t\t\t\t\t\t\t\t\t   int32 OtherBodyIndex,\n\t\t\t\t\t\t\t\t\t   bool bFromSweep,\n\t\t\t\t\t\t\t\t\t   const FHitResult& SweepResult)\n{\n\tbFadeInRequestWasLast = true;\n\n\tif (State == EFPS_FadedOut)\n\t{\n\t\tSetActorTickEnabled(true);\n\t\tCounter = FadeInDelay;\n\t\tState = EFPS_WaitBeforeFadeIn;\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoFadingPlatform::OnFadeOutSignal(UPrimitiveComponent* OverlappedComponent,\n\t\t\t\t\t\t\t\t\t\tAActor* OtherActor,\n\t\t\t\t\t\t\t\t\t\tUPrimitiveComponent* OtherComp,\n\t\t\t\t\t\t\t\t\t\tint32 OtherBodyIndex,\n\t\t\t\t\t\t\t\t\t\tbool bFromSweep,\n\t\t\t\t\t\t\t\t\t\tconst FHitResult& SweepResult)\n{\n\tbFadeInRequestWasLast = false;\n\n\tif (State == EFPS_FadedIn)\n\t{\n\t\tSetActorTickEnabled(true);\n\t\tCounter = FadeOutDelay;\n\t\tState = EFPS_WaitBeforeFadeOut;\n\t}\n}\n"
  },
  {
    "path": "Source/SOrb/Objects/SoFadingPlatform.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#pragma once\n\n#include \"CoreMinimal.h\"\n#include \"GameFramework/Actor.h\"\n#include \"SoFadingPlatform.generated.h\"\n\nclass UFMODEvent;\nclass USceneComponent;\nclass UBoxComponent;\nclass UStaticMeshComponent;\nclass UPrimitiveComponent;\n\nenum ESoFadingPlatformState\n{\n\tEFPS_FadedIn,\n\tEFPS_WaitBeforeFadeIn,\n\tEFPS_FadeIn,\n\n\tEFPS_FadedOut,\n\tEFPS_WaitBeforeFadeOut,\n\tEFPS_FadeOut\n};\n\nUCLASS()\nclass SORB_API ASoFadingPlatform : public AActor\n{\n\tGENERATED_BODY()\n\npublic:\n\t// Sets default values for this actor's properties\n\tASoFadingPlatform();\n\n\tvirtual void Tick(float DeltaTime) override;\n\n\tUFUNCTION()\n\tvoid Reset();\n\n\tUFUNCTION(BlueprintCallable)\n\tvoid OnFadeInSignal(UPrimitiveComponent* OverlappedComponent,\n\t\t\t\t\t\tAActor* OtherActor,\n\t\t\t\t\t\tUPrimitiveComponent* OtherComp,\n\t\t\t\t\t\tint32 OtherBodyIndex,\n\t\t\t\t\t\tbool bFromSweep,\n\t\t\t\t\t\tconst FHitResult & SweepResult);\n\n\tUFUNCTION(BlueprintCallable)\n\tvoid OnFadeOutSignal(UPrimitiveComponent* OverlappedComponent,\n\t\t\t\t\t\tAActor* OtherActor,\n\t\t\t\t\t\tUPrimitiveComponent* OtherComp,\n\t\t\t\t\t\tint32 OtherBodyIndex,\n\t\t\t\t\t\tbool bFromSweep,\n\t\t\t\t\t\tconst FHitResult & SweepResult);\n\nprotected:\n\tvirtual void BeginPlay() override;\n\tvirtual void EndPlay(const EEndPlayReason::Type EndPlayReason) override;\n\n\tvoid Update(float DeltaSeconds);\n\nprotected:\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite)\n\tUSceneComponent* Root;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite)\n\tUStaticMeshComponent* Mesh;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite)\n\tUBoxComponent* FadeInArea;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite)\n\tUBoxComponent* FadeOutArea;\n\n\tUPROPERTY(EditAnywhere)\n\tbool bFadedInByDefault;\n\n\tUPROPERTY(EditAnywhere)\n\tfloat FadeInDelay = 1.0f;\n\n\tUPROPERTY(EditAnywhere)\n\tfloat FadeOutDelay = 1.0f;\n\n\tUPROPERTY(EditAnywhere)\n\tfloat FadeInTime = 1.0f;\n\n\tUPROPERTY(EditAnywhere)\n\tfloat FadeOutTime = 1.0f;\n\n\tUPROPERTY(EditAnywhere)\n\tfloat CollisionOffPercent = 0.5f;\n\n\tfloat Counter = 0.0f;\n\n\tESoFadingPlatformState State;\n\tbool bFadeInRequestWasLast;\n\n\tstatic const FName OPAddName;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadOnly, Category = SFX)\n\tUFMODEvent* SFXFadeIn = nullptr;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadOnly, Category = SFX)\n\tUFMODEvent* SFXFadeOut = nullptr;\n};\n"
  },
  {
    "path": "Source/SOrb/Objects/SoFadingPlatformTimeBased.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#include \"SoFadingPlatformTimeBased.h\"\n\n#include \"Components/BoxComponent.h\"\n#include \"Components/StaticMeshComponent.h\"\n#include \"TimerManager.h\"\n#include \"Basic/SoAudioManager.h\"\n#include \"Engine/World.h\"\n\n#include \"Basic/Helpers/SoStaticHelper.h\"\n#include \"Basic/SoGameMode.h\"\n#include \"CharacterBase/SoMortal.h\"\n#include \"Character/SoCharacter.h\"\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nASoFadingPlatformTimeBased::ASoFadingPlatformTimeBased()\n{\n\tPrimaryActorTick.bCanEverTick = true;\n\n\tMesh = CreateDefaultSubobject<UStaticMeshComponent>(TEXT(\"Mesh\"));\n\tMesh->SetupAttachment(RootComponent);\n\tRootComponent = Mesh;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoFadingPlatformTimeBased::BeginPlay()\n{\n\tSuper::BeginPlay();\n\n\tASoGameMode::Get(this).OnPostLoad.AddDynamic(this, &ASoFadingPlatformTimeBased::Reset);\n\n\tif (bHideOnTrigger)\n\t\tUSoEventHandlerHelper::SubscribeToSoPostLoad(this);\n\telse\n\t\tReset();\n\n\tif (ActionOnDisabled == ESoFadingPlatformDisabledBehavior::EFPT_Kill)\n\t\tMesh->OnComponentHit.AddDynamic(this, &ASoFadingPlatformTimeBased::OnHitCallback);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoFadingPlatformTimeBased::EndPlay(const EEndPlayReason::Type EndPlayReason)\n{\n\tGetWorld()->GetTimerManager().ClearTimer(TimeHandle);\n\n\tif (ActionOnDisabled == ESoFadingPlatformDisabledBehavior::EFPT_Kill)\n\t\tMesh->OnComponentHit.RemoveDynamic(this, &ASoFadingPlatformTimeBased::OnHitCallback);\n\n\tASoGameMode::Get(this).OnPostLoad.RemoveDynamic(this, &ASoFadingPlatformTimeBased::Reset);\n\tif (bHideOnTrigger)\n\t\tUSoEventHandlerHelper::UnsubscribeFromSoPostLoad(this);\n\n\tSuper::EndPlay(EndPlayReason);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoFadingPlatformTimeBased::Tick(float DeltaTime)\n{\n\tSuper::Tick(DeltaTime);\n\n\tCounter -= DeltaTime;\n\tfloat FadePercent = FMath::Clamp(Counter / (bFadeIn ? FadeInTime : FadeOutTime), 0.0f, 1.0f);\n\tif (bFadeIn)\n\t\tFadePercent = 1.0f - FadePercent;\n\n\tASoCharacter* Character = USoStaticHelper::GetPlayerCharacterAsSoCharacter(this);\n\tif (ActionOnDisabled == ESoFadingPlatformDisabledBehavior::EFPT_Kill &&\n\t\tFadePercent < ActAsDisabledPercent &&\n\t\tCharacter &&\n\t\tCharacter->GetMovementBase() &&\n\t\tCharacter->GetMovementBase()->GetOwner() == this)\n\t\tISoMortal::Execute_CauseDmg(Character, Dmg, HitReactDesc);\n\n\tif (ActionOnDisabled == ESoFadingPlatformDisabledBehavior::EFPT_Hide)\n\t{\n\t\tMesh->SetCollisionEnabled(FadePercent > ActAsDisabledPercent ? ECollisionEnabled::QueryAndPhysics : ECollisionEnabled::NoCollision);\n\t\tMesh->SetVisibility(FadePercent > KINDA_SMALL_NUMBER);\n\t}\n\tOnUpdate(FadePercent);\n\tMesh->SetScalarParameterValueOnMaterials(MaterialParamName, FadeInValue * FadePercent + FadeOutValue * (1.0f - FadePercent));\n\n\tif (Counter < 0.0f)\n\t{\n\t\tSetActorTickEnabled(false);\n\n\t\tif (bFadeIn)\n\t\t\tGetWorld()->GetTimerManager().SetTimer(TimeHandle, this, &ASoFadingPlatformTimeBased::OnEnabledTimeOver, EnabledTime, false);\n\t\telse\n\t\t\tGetWorld()->GetTimerManager().SetTimer(TimeHandle, this, &ASoFadingPlatformTimeBased::OnDisabledTimeOver, DisabledTime, false);\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoFadingPlatformTimeBased::Trigger_Implementation(const FSoTriggerData& TriggerData)\n{\n\tif (!bHideOnTrigger)\n\t\treturn;\n\n\tMesh->SetVisibility(TriggerData.SourceIdentifier > 0, true);\n\tMesh->SetCollisionEnabled(TriggerData.SourceIdentifier > 0 ? ECollisionEnabled::QueryAndPhysics : ECollisionEnabled::NoCollision);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoFadingPlatformTimeBased::HandleSoPostLoad_Implementation()\n{\n\tMesh->SetVisibility(true, true);\n\tReset();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoFadingPlatformTimeBased::Reset()\n{\n\tSetActorTickEnabled(false);\n\n\tif (ActionOnDisabled == ESoFadingPlatformDisabledBehavior::EFPT_Hide)\n\t{\n\t\tMesh->SetCollisionEnabled(bFadedInByDefault ? ECollisionEnabled::QueryAndPhysics : ECollisionEnabled::NoCollision);\n\t\tMesh->SetVisibility(bFadedInByDefault);\n\t}\n\n\tMesh->SetScalarParameterValueOnMaterials(MaterialParamName, bFadedInByDefault ? FadeInValue : FadeOutValue);\n\n\tif (bFadedInByDefault)\n\t\tGetWorld()->GetTimerManager().SetTimer(TimeHandle, this, &ASoFadingPlatformTimeBased::OnEnabledTimeOver, EnabledTime + FirstTimeOffset, false);\n\telse\n\t\tGetWorld()->GetTimerManager().SetTimer(TimeHandle, this, &ASoFadingPlatformTimeBased::OnDisabledTimeOver, DisabledTime + FirstTimeOffset, false);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoFadingPlatformTimeBased::OnEnabledTimeOver()\n{\n\tSetActorTickEnabled(true);\n\tCounter = FadeInTime;\n\tbFadeIn = false;\n\tif (SFXOnHide != nullptr)\n\t\tUSoAudioManager::PlaySoundAtLocation(this, SFXOnHide, GetActorTransform(), true);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoFadingPlatformTimeBased::OnDisabledTimeOver()\n{\n\tSetActorTickEnabled(true);\n\tCounter = FadeOutTime;\n\tbFadeIn = true;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoFadingPlatformTimeBased::OnHitCallback(UPrimitiveComponent* Comp, AActor* OtherActor, UPrimitiveComponent* OtherComp, FVector NormalImpulse, const FHitResult& Hit)\n{\n\tfloat FadePercent = FMath::Clamp(Counter / (bFadeIn ? FadeInTime : FadeOutTime), 0.0f, 1.0f);\n\tif (bFadeIn)\n\t\tFadePercent = 1.0f - FadePercent;\n\n\tif (ActionOnDisabled == ESoFadingPlatformDisabledBehavior::EFPT_Kill &&\n\t\tFadePercent < ActAsDisabledPercent &&\n\t\tOtherActor &&\n\t\tOtherActor->GetClass()->ImplementsInterface(USoMortal::StaticClass()))\n\t{\n\t\tISoMortal::Execute_CauseDmg(OtherActor, Dmg, HitReactDesc);\n\t\tUSoAudioManager::PlayHitReactSFX(\n\t\t\tthis,\n\t\t\tOtherActor,\n\t\t\tGetActorTransform(),\n\t\t\tHitReactDesc,\n\t\t\tSFXOnHit,\n\t\t\tSFXOnHit2D,\n\t\t\tSFXOnHitDeath,\n\t\t\tSFXOnEnemyHit\n\t\t);\n\t}\n}\n"
  },
  {
    "path": "Source/SOrb/Objects/SoFadingPlatformTimeBased.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#pragma once\n\n#include \"CoreMinimal.h\"\n#include \"GameFramework/Actor.h\"\n#include \"Logic/SoTriggerable.h\"\n#include \"Basic/SoEventHandler.h\"\n\n#include \"CharacterBase/SoIMortalTypes.h\"\n\n#include \"SoFadingPlatformTimeBased.generated.h\"\n\nclass UFMODEvent;\nclass UStaticMeshComponent;\n\nUENUM(BlueprintType)\nenum class ESoFadingPlatformDisabledBehavior : uint8\n{\n\tEFPT_Hide,\n\tEFPT_Kill\n};\n\nUCLASS()\nclass SORB_API ASoFadingPlatformTimeBased : public AActor, public ISoTriggerable, public ISoEventHandler\n{\n\tGENERATED_BODY()\n\npublic:\n\t// Sets default values for this actor's properties\n\tASoFadingPlatformTimeBased();\n\n\tvirtual void Tick(float DeltaTime) override;\n\n\tvoid Trigger_Implementation(const FSoTriggerData& TriggerData) override;\n\n\tvirtual void HandleSoPostLoad_Implementation() override;\n\tvirtual void HandlePlayerRematerialize_Implementation() override {};\n\tvirtual void HandlePlayerRespawn_Implementation() override {};\n\tvirtual void HandleWhitelistedSplinesEntered_Implementation() override {};\n\tvirtual void HandleWhitelistedSplinesLeft_Implementation() override {};\n\n\n\tUFUNCTION()\n\tvoid Reset();\n\n\tUFUNCTION()\n\tvoid OnEnabledTimeOver();\n\n\tUFUNCTION()\n\tvoid OnDisabledTimeOver();\n\nprotected:\n\tvirtual void BeginPlay() override;\n\tvirtual void EndPlay(const EEndPlayReason::Type EndPlayReason) override;\n\n\tUFUNCTION(BlueprintImplementableEvent)\n\tvoid OnUpdate(float Percent);\n\n\tUFUNCTION()\n\tvoid OnHitCallback(UPrimitiveComponent* Comp, AActor* OtherActor, UPrimitiveComponent* OtherComp, FVector NormalImpulse, const FHitResult& Hit);\n\nprotected:\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite)\n\tUStaticMeshComponent* Mesh;\n\n\tUPROPERTY(EditAnywhere)\n\tESoFadingPlatformDisabledBehavior ActionOnDisabled;\n\n\tUPROPERTY(EditAnywhere)\n\tbool bFadedInByDefault;\n\n\tUPROPERTY(EditAnywhere)\n\tbool bHideOnTrigger;\n\n\n\tUPROPERTY(EditAnywhere)\n\tfloat EnabledTime = 1.0f;\n\n\tUPROPERTY(EditAnywhere)\n\tfloat DisabledTime = 1.0f;\n\n\tUPROPERTY(EditAnywhere)\n\tfloat FadeInTime = 1.0f;\n\n\tUPROPERTY(EditAnywhere)\n\tfloat FadeOutTime = 1.0f;\n\n\t/** added to default state at the first time */\n\tUPROPERTY(EditAnywhere)\n\tfloat FirstTimeOffset = 0.0f;\n\n\n\tUPROPERTY(EditAnywhere)\n\tFName MaterialParamName = \"OP_Add\";\n\n\tUPROPERTY(EditAnywhere)\n\tfloat FadeInValue = 1.0f;\n\n\tUPROPERTY(EditAnywhere)\n\tfloat FadeOutValue = 0.0f;\n\n\n\tUPROPERTY(EditAnywhere)\n\tfloat ActAsDisabledPercent = 0.5f;\n\n\tUPROPERTY(EditAnywhere)\n\tFSoDmg Dmg;\n\n\tUPROPERTY(EditAnywhere)\n\tFSoHitReactDesc HitReactDesc;\n\n\tUPROPERTY(EditAnywhere, Category = SFX)\n\tUFMODEvent* SFXOnHit;\n\n\tUPROPERTY(EditAnywhere, Category = SFX)\n\tUFMODEvent* SFXOnHit2D;\n\n\tUPROPERTY(EditAnywhere, Category = SFX)\n\tUFMODEvent* SFXOnHitDeath;\n\n\tUPROPERTY(EditAnywhere, Category = SFX)\n\tUFMODEvent* SFXOnEnemyHit;\n\n\tUPROPERTY(EditAnywhere, Category = SFX)\n\tUFMODEvent* SFXOnHide;\n\n\n\tUPROPERTY(EditAnywhere)\n\tfloat Counter = 0.0f;\n\n\tbool bFadeIn;\n\n\tFTimerHandle TimeHandle;\n};\n"
  },
  {
    "path": "Source/SOrb/Objects/SoJellyfishPlatform.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#include \"SoJellyfishPlatform.h\"\n\n#include \"Particles/ParticleSystemComponent.h\"\n#include \"TimerManager.h\"\n#include \"Components/BoxComponent.h\"\n#include \"Components/SkeletalMeshComponent.h\"\n\n#include \"FMODAudioComponent.h\"\n\n\nconst FName ASoJellyfishPlatform::BaseOPName = \"BaseOP\";\nconst FName ASoJellyfishPlatform::OPAddName = \"OP_Add\";\nconst float ASoJellyfishPlatform::BaseOpMin = -1.2f;\nconst float ASoJellyfishPlatform::BaseOpMax = 0.5f;\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nASoJellyfishPlatform::ASoJellyfishPlatform()\n{\n\tPrimaryActorTick.bCanEverTick = true;\n\tSetActorTickEnabled(false);\n\n\tCollision = CreateDefaultSubobject<UBoxComponent>(TEXT(\"Collision\"));\n\tRootComponent = Collision;\n\tSkeletalMesh = CreateDefaultSubobject<USkeletalMeshComponent>(TEXT(\"SkeletalMesh\"));\n\tSkeletalMesh->SetupAttachment(RootComponent);\n\n\tParticleComponent = CreateDefaultSubobject<UParticleSystemComponent>(TEXT(\"Particles\"));\n\tParticleComponent->SetupAttachment(RootComponent);\n\n\tHitSFX = CreateDefaultSubobject<UFMODAudioComponent>(TEXT(\"HitSFX\"));\n\tHitSFX->bAutoActivate = false;\n\tHitSFX->SetupAttachment(RootComponent);\n\n\tTags.Add(FName(\"Trampoline\"));\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoJellyfishPlatform::BeginPlay()\n{\n\tSuper::BeginPlay();\n\tCollision->OnComponentHit.AddDynamic(this, &ASoJellyfishPlatform::OnHitCallback);\n\n\tif (!bActiveByDefault)\n\t{\n\t\tActiveState = ESoJellyfishState::EJS_Inactive;\n\t\tCollision->SetCollisionEnabled(ECollisionEnabled::NoCollision);\n\t\tSkeletalMesh->SetVisibility(false);\n\t\tSkeletalMesh->SetScalarParameterValueOnMaterials(OPAddName, 0.0f);\n\t\tSkeletalMesh->SetScalarParameterValueOnMaterials(BaseOPName, BaseOpMin);\n\t}\n\telse\n\t\tActiveState = ESoJellyfishState::EJS_Active;\n\n\tif (bResetOnPlayerRematerialize)\n\t\tUSoEventHandlerHelper::SubscribeToPlayerRematerialize(this);\n\tif (bResetOnReload)\n\t\tUSoEventHandlerHelper::SubscribeToSoPostLoad(this);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoJellyfishPlatform::EndPlay(const EEndPlayReason::Type EndPlayReason)\n{\n\tif (bResetOnPlayerRematerialize)\n\t\tUSoEventHandlerHelper::UnsubscribeFromPlayerRematerialize(this);\n\tif (bResetOnReload)\n\t\tUSoEventHandlerHelper::UnsubscribeFromSoPostLoad(this);\n\n\tSuper::EndPlay(EndPlayReason);\n\n\tCollision->OnComponentHit.RemoveDynamic(this, &ASoJellyfishPlatform::OnHitCallback);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoJellyfishPlatform::Tick(float DeltaTime)\n{\n\tSuper::Tick(DeltaTime);\n\n\tswitch (ActiveState)\n\t{\n\t\tcase ESoJellyfishState::EJS_FadeIn:\n\t\t{\n\t\t\tFadeCounter += DeltaTime;\n\t\t\tconst float FadePercent = FadeCounter / FadeDuration;\n\t\t\tSkeletalMesh->SetScalarParameterValueOnMaterials(OPAddName, FadePercent);\n\t\t\tSkeletalMesh->SetScalarParameterValueOnMaterials(BaseOPName, FMath::Lerp(BaseOpMin, BaseOpMax, FadePercent));\n\n\t\t\tif (FadePercent < 1.0f)\n\t\t\t\treturn;\n\n\t\t\tCollision->SetCollisionEnabled(ECollisionEnabled::QueryAndPhysics);\n\t\t\tActiveState = ESoJellyfishState::EJS_Active;\n\t\t}\n\t\tbreak;\n\n\t\tcase ESoJellyfishState::EJS_FadeOut:\n\t\t{\n\t\t\tFadeCounter -= DeltaTime;\n\t\t\tconst float FadePercent = FadeCounter / FadeDuration;\n\t\t\tSkeletalMesh->SetScalarParameterValueOnMaterials(OPAddName, FadePercent);\n\t\t\tSkeletalMesh->SetScalarParameterValueOnMaterials(BaseOPName, FMath::Lerp(-1.2, 0.5, FadePercent));\n\n\t\t\tif (FadePercent > 0.0f)\n\t\t\t\treturn;\n\n\t\t\tSkeletalMesh->SetVisibility(false);\n\t\t\tActiveState = ESoJellyfishState::EJS_Inactive;\n\t\t\tif (FadeBackTime > 0.0f)\n\t\t\t{\n\t\t\t\tActiveState = ESoJellyfishState::EJS_FadeIn;\n\t\t\t\tGetWorld()->GetTimerManager().SetTimer(Timer, this, &ASoJellyfishPlatform::StartFade, FadeBackTime, false);\n\t\t\t}\n\t\t}\n\t\tbreak;\n\n\t\tdefault:\n\t\t\tbreak;\n\t}\n\n\tSetActorTickEnabled(false);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoJellyfishPlatform::Trigger_Implementation(const FSoTriggerData& TriggerData)\n{\n\tconst bool bResetToDefaultState = TriggerData.SourceIdentifier == 0;\n\tResetToDefaultState(bResetToDefaultState);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoJellyfishPlatform::HandlePlayerRematerialize_Implementation()\n{\n\tif (bResetOnPlayerRematerialize)\n\t{\n\t\tGetWorld()->GetTimerManager().ClearTimer(Timer);\n\t\tResetToDefaultState();\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoJellyfishPlatform::HandleSoPostLoad_Implementation()\n{\n\tif (bResetOnReload)\n\t{\n\t\tGetWorld()->GetTimerManager().ClearTimer(Timer);\n\t\tResetToDefaultState();\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoJellyfishPlatform::OnHitCallback(UPrimitiveComponent* HitComp, AActor* OtherActor, UPrimitiveComponent* OtherComp, FVector NormalImpulse, const FHitResult& Hit)\n{\n\t// play hit react anim\n\tSkeletalMesh->SetPosition(0.0f);\n\tSkeletalMesh->Play(false);\n\tParticleComponent->Activate(true);\n\tHitSFX->Activate(true);\n\n\tif (bFadeOutOnHit && ActiveState != ESoJellyfishState::EJS_FadeOut)\n\t{\n\t\tActiveState = ESoJellyfishState::EJS_FadeOut;\n\t\tGetWorld()->GetTimerManager().SetTimer(Timer, this, &ASoJellyfishPlatform::StartFade, DeactivationDelay, false);\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoJellyfishPlatform::ASoJellyfishPlatform::StartFade()\n{\n\tSetActorTickEnabled(true);\n\tif (ActiveState == ESoJellyfishState::EJS_FadeOut)\n\t{\n\t\tFadeCounter = FadeDuration;\n\t\tCollision->SetCollisionEnabled(ECollisionEnabled::NoCollision);\n\t}\n\telse\n\t{\n\t\tFadeCounter = 0.0f;\n\t\tSkeletalMesh->SetVisibility(true);\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoJellyfishPlatform::ResetToDefaultState(bool bResetToDefaultState)\n{\n\tconst bool bInactivate = (bResetToDefaultState != bActiveByDefault);\n\tif (bInactivate)\n\t{\n\t\tswitch (ActiveState)\n\t\t{\n\t\t\tcase ESoJellyfishState::EJS_Active:\n\t\t\t\tActiveState = ESoJellyfishState::EJS_FadeOut;\n\t\t\t\tStartFade();\n\t\t\t\tbreak;\n\n\t\t\tcase ESoJellyfishState::EJS_FadeIn:\n\t\t\t\tActiveState = ESoJellyfishState::EJS_FadeOut;\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t}\n\t}\n\telse\n\t{\n\t\t\n\t\tswitch (ActiveState)\n\t\t{\n\t\t\tcase ESoJellyfishState::EJS_Inactive:\n\t\t\t\tActiveState = ESoJellyfishState::EJS_FadeIn;\n\t\t\tcase ESoJellyfishState::EJS_FadeIn:\n\t\t\t\tStartFade();\n\t\t\t\tbreak;\n\n\t\t\tcase ESoJellyfishState::EJS_FadeOut:\n\t\t\t\tActiveState = ESoJellyfishState::EJS_FadeIn;\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t}\n\t}\n\tSetActorTickEnabled(true);\n}\n"
  },
  {
    "path": "Source/SOrb/Objects/SoJellyfishPlatform.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#pragma once\n#include \"Components/BoxComponent.h\"\n#include \"Logic/SoTriggerable.h\"\n#include \"Basic/SoEventHandler.h\"\n#include \"SoJellyfishPlatform.generated.h\"\n\nclass UFMODAudioComponent;\nclass UParticleSystemComponent;\n\nUENUM(BlueprintType)\nenum class ESoJellyfishState : uint8\n{\n\t// invisible, no collision\n\tEJS_Inactive\t\t UMETA(DisplayName = \"Inactive\"),\n\t// visible, collision on\n\tEJS_Active\t\t\t UMETA(DisplayName = \"Active\"),\n\t// turning on to active move\n\tEJS_FadeIn\t\t\t UMETA(DisplayName = \"FadeIn\"),\n\t// turning off to inactive move\n\tEJS_FadeOut\t\t\t UMETA(DisplayName = \"FadeOut\"),\n};\n\nUCLASS()\nclass SORB_API ASoJellyfishPlatform : public AActor, public ISoTriggerable, public ISoEventHandler\n{\n\tGENERATED_BODY()\n\npublic:\n\n\tASoJellyfishPlatform();\n\n\tvirtual void BeginPlay() override;\n\tvirtual void EndPlay(const EEndPlayReason::Type EndPlayReason) override;\n\n\tvirtual void Tick(float DeltaSeconds) override;\n\n\tvoid Trigger_Implementation(const FSoTriggerData& TriggerData) override;\n\n\tvirtual void HandleSoPostLoad_Implementation() override;\n\tvirtual void HandlePlayerRematerialize_Implementation() override;\n\tvirtual void HandlePlayerRespawn_Implementation() override {};\n\tvirtual void HandleWhitelistedSplinesEntered_Implementation() override {};\n\tvirtual void HandleWhitelistedSplinesLeft_Implementation() override {};\n\n\tUFUNCTION()\n\tvoid OnHitCallback(UPrimitiveComponent* HitComp, AActor* OtherActor, UPrimitiveComponent* OtherComp, FVector NormalImpulse, const FHitResult& Hit);\n\n\tUFUNCTION()\n\tvoid StartFade();\n\nprotected:\n\n\tvoid ResetToDefaultState(bool bResetToDefaultState = true);\n\nprotected:\n\n\tUPROPERTY(EditAnywhere, BlueprintReadOnly)\n\tUSkeletalMeshComponent* SkeletalMesh;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadOnly)\n\tUBoxComponent* Collision;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadOnly)\n\tUParticleSystemComponent* ParticleComponent;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadOnly)\n\tUFMODAudioComponent* HitSFX;\n\n\n\t/** default idle state is active or inactive */\n\tUPROPERTY(EditAnywhere, BlueprintReadOnly, Category = JellyfishSetup)\n\tbool bActiveByDefault = false;\n\n\tESoJellyfishState ActiveState;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadOnly, Category = JellyfishSetup)\n\tfloat ActivationTime = 0.2f;\n\n\t/** time between hit and fading out */\n\tUPROPERTY(EditAnywhere, BlueprintReadOnly, Category = JellyfishSetup)\n\tfloat DeactivationDelay = 0.6f;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadOnly, Category = JellyfishSetup)\n\tfloat FadeDuration = 0.6f;\n\n\tfloat FadeCounter = 0.0f;\n\n\n\tUPROPERTY(EditAnywhere, BlueprintReadOnly, Category = JellyfishSetup)\n\tbool bFadeOutOnHit = true;\n\n\t/** if > 0 the object fades back again every time is faded out after FadeBackTime */\n\tUPROPERTY(EditAnywhere, BlueprintReadOnly, Category = JellyfishSetup)\n\tfloat FadeBackTime = 3.0f;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadOnly, Category = JellyfishSetup)\n\tbool bResetOnPlayerRematerialize = true;\n\n\tUPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = JellyfishSetup)\n\tbool bResetOnReload = true;\n\n\tstatic const FName BaseOPName;\n\tstatic const FName OPAddName;\n\tstatic const float BaseOpMin;\n\tstatic const float BaseOpMax;\n\n\tFTimerHandle Timer;\n};\n"
  },
  {
    "path": "Source/SOrb/Objects/SoSky.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#include \"SoSky.h\"\n\n#include \"Materials/MaterialInstanceDynamic.h\"\n#include \"Engine/TextureCube.h\"\n\n#include \"Character/SoCharacter.h\"\n#include \"Character/SoCharStates/SoASkyControlEdit.h\"\n#include \"Basic/Helpers/SoStaticHelper.h\"\n#include \"Settings/SoGameSettings.h\"\n#include \"SplineLogic/SoPlayerSpline.h\"\n\nDEFINE_LOG_CATEGORY_STATIC(LogSoSky, All, All);\n\n\nconst FName ASoSky::DefaultPresetName = FName(\"Default\");\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nASoSky::ASoSky()\n{\n \t// Set this actor to call Tick() every frame.  You can turn this off to improve performance if you don't need it.\n\tPrimaryActorTick.bCanEverTick = true;\n\n\tSkyLight = CreateDefaultSubobject<USkyLightComponent>(TEXT(\"SoSkyLight\"));\n\tSkySphereMesh = CreateDefaultSubobject<UStaticMeshComponent>(TEXT(\"SoSkySphereMesh\"));\n\tFogComponent = CreateDefaultSubobject<UExponentialHeightFogComponent>(TEXT(\"FogComponent\"));\n\n\tRootComponent = SkySphereMesh;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoSky::OnConstruction(const FTransform& Transform)\n{\n\tSuper::OnConstruction(Transform);\n\n\tDynamicMaterial = SkySphereMesh->CreateAndSetMaterialInstanceDynamic(0);\n\n\tif (!bEnableBlendedPreview)\n\t{\n\t\tBlendValue = FMath::Clamp(BlendValue, 0.0f, 1.0f);\n\t\tif (BlendValue < 0.5f)\n\t\t\tBlendValue = 0.0f;\n\t\telse\n\t\t\tBlendValue = 1.0f;\n\t}\n\n\tInitializeSoSky();\n\tUpdateSky(PreviewedPreset0, PreviewedPreset1, BlendValue);\n}\n\n#if WITH_EDITOR\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoSky::PostEditChangeProperty(FPropertyChangedEvent& PropertyChangedEvent)\n{\n\tSuper::PostEditChangeProperty(PropertyChangedEvent);\n\tUpdatePreviewedSky();\n}\n#endif\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoSky::InitializeSoSky()\n{\n\tif (!Presets.Contains(DefaultPresetName))\n\t\tPresets.Add(DefaultPresetName);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoSky::BeginPlay()\n{\n\tSuper::BeginPlay();\n\n\tif (DynamicMaterial == nullptr)\n\t\tDynamicMaterial = SkySphereMesh->CreateAndSetMaterialInstanceDynamic(0);\n\n\tTArray<FName> PresetNames;\n\tfor (const auto& Pair : Presets)\n\t\tPresetNames.Add(Pair.Key);\n\n\tif (ASoCharacter* Character = USoStaticHelper::GetPlayerCharacterAsSoCharacter(this))\n\t\tCharacter->SoASkyControlEdit->InitializePresets(PresetNames);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoSky::Tick(float DeltaTime)\n{\n\tSuper::Tick(DeltaTime);\n\n\tif (const ASoCharacter* Character = USoStaticHelper::GetPlayerCharacterAsSoCharacter(this))\n\t{\n\t\tconst FSoSplinePoint SplineLocation = ISoSplineWalker::Execute_GetSplineLocationI(Character);\n\t\tconst ASoPlayerSpline* PlayerSpline = Cast<ASoPlayerSpline>(SplineLocation.GetSpline());\n\n\t\tif (PlayerSpline != nullptr)\n\t\t{\n\t\t\tconst FSoSkyControlValue Value = PlayerSpline->GetSkyControlPoints().GetInterpolated(SplineLocation);\n\t\t\tUpdateSky(Value.FirstPreset, Value.SecondPreset, Value.SecondWeight);\n\t\t}\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoSky::UpdateSky(FName FirstPresetName, FName SecondPresetName, float LerpValue)\n{\n\tif (DynamicMaterial == nullptr)\n\t\treturn;\n\n\tLerpValue = FMath::Clamp(LerpValue, 0.0f, 1.0f);\n\n\t// preset selection: look for volumetric free versions if it is turned off\n\tFSoEnvironmentPreset* FirstPreset = nullptr;\n\tFSoEnvironmentPreset* SecondPreset = nullptr;\n\tif (!USoGameSettings::Get().IsVolumetricFogEnabled())\n\t{\n\t\tFirstPreset = PresetsWithoutVolumetricFog.Find(FirstPresetName);\n\t\tSecondPreset = PresetsWithoutVolumetricFog.Find(SecondPresetName);\n\t}\n\tif (FirstPreset == nullptr)\n\t\tFirstPreset = Presets.Find(FirstPresetName);\n\tif (SecondPreset == nullptr)\n\t\tSecondPreset = Presets.Find(SecondPresetName);\n\n\tif (FirstPreset == nullptr || SecondPreset == nullptr)\n\t{\n\t\tUE_LOG(LogSoSky, Warning, TEXT(\"Failed to find sky preset %s or %s\"), *FirstPresetName.ToString(), *SecondPresetName.ToString());\n\t\treturn;\n\t}\n\n\tif (LerpValue < 0.0001f || FirstPresetName == SecondPresetName)\n\t{\n\t\tUpdateSkyMesh(FirstPreset->SkyParams);\n\t\tUpdateSunParams(FirstPreset->SunParams);\n\t\tUpdateSkyLight(FirstPreset->SkyLightParams);\n\t\tUpdateFog(FirstPreset->FogParams);\n\t}\n\telse if (LerpValue > 0.9999f)\n\t{\n\t\tUpdateSkyMesh(SecondPreset->SkyParams);\n\t\tUpdateSunParams(SecondPreset->SunParams);\n\t\tUpdateSkyLight(SecondPreset->SkyLightParams);\n\t\tUpdateFog(SecondPreset->FogParams);\n\t}\n\telse\n\t{\n\t\tUpdateSkyMesh(FirstPreset->SkyParams, SecondPreset->SkyParams, LerpValue);\n\t\tUpdateSunParams(FirstPreset->SunParams, SecondPreset->SunParams, LerpValue);\n\t\tUpdateSkyLight(FirstPreset->SkyLightParams, SecondPreset->SkyLightParams, LerpValue);\n\t\tUpdateFog(FirstPreset->FogParams, SecondPreset->FogParams, LerpValue);\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoSky::UpdateSkyMesh(const FSoSkyPreset& SrcSky, const FSoSkyPreset& DstSky, float LerpValue)\n{\n\t// base color\n\tDynamicMaterial->SetVectorParameterValue(BaseColorName, FMath::Lerp(SrcSky.BaseColor, DstSky.BaseColor, LerpValue));\n\tDynamicMaterial->SetScalarParameterValue(BrightnessName, FMath::Lerp(SrcSky.Brightness, DstSky.Brightness, LerpValue));\n\tDynamicMaterial->SetScalarParameterValue(GradientAddName, FMath::Lerp(SrcSky.GradientAdd, DstSky.GradientAdd, LerpValue));\n\tDynamicMaterial->SetScalarParameterValue(GradientMultiplyName, FMath::Lerp(SrcSky.GradientMultiply, DstSky.GradientMultiply, LerpValue));\n\tDynamicMaterial->SetScalarParameterValue(GradientPowerName, FMath::Lerp(SrcSky.GradientPower, DstSky.GradientPower, LerpValue));\n\n\t// cloud\n\tDynamicMaterial->SetVectorParameterValue(CloudColorName, FMath::Lerp(SrcSky.CloudColor, DstSky.CloudColor, LerpValue));\n\tDynamicMaterial->SetScalarParameterValue(CloudLerpMultiplyName, FMath::Lerp(SrcSky.CloudLerpMultiply, DstSky.CloudLerpMultiply, LerpValue));\n\tDynamicMaterial->SetScalarParameterValue(CloudLerpPowerName, FMath::Lerp(SrcSky.CloudLerpPower, DstSky.CloudLerpPower, LerpValue));\n\tDynamicMaterial->SetScalarParameterValue(CloudLerpUVName, FMath::Lerp(SrcSky.CloudLerpUV, DstSky.CloudLerpUV, LerpValue));\n\tDynamicMaterial->SetScalarParameterValue(CloudOpacityName, FMath::Lerp(SrcSky.CloudOpacity, DstSky.CloudOpacity, LerpValue));\n\tDynamicMaterial->SetScalarParameterValue(CloudSpeedName, FMath::Lerp(SrcSky.CloudSpeed, DstSky.CloudSpeed, LerpValue));\n\tDynamicMaterial->SetScalarParameterValue(CloudMoreCloudName, FMath::Lerp(SrcSky.CloudMoreClouds, DstSky.CloudMoreClouds, LerpValue));\n\n\t// Cubemap\n\tDynamicMaterial->SetScalarParameterValue(CubemapStrengthName, FMath::Lerp(SrcSky.CubemapStrength, DstSky.CubemapStrength, LerpValue));\n\tDynamicMaterial->SetScalarParameterValue(SkyTexLerpName, FMath::Lerp(SrcSky.SkyTexLerp, DstSky.SkyTexLerp, LerpValue));\n\tDynamicMaterial->SetTextureParameterValue(SourceTextureName, GetTextureCube(SrcSky.TexturePath));\n\tDynamicMaterial->SetTextureParameterValue(DestTextureName, GetTextureCube(DstSky.TexturePath));\n\n\t// Stars\n\tDynamicMaterial->SetVectorParameterValue(StarColorName, FMath::Lerp(SrcSky.StarColor, DstSky.StarColor, LerpValue));\n\n\tDynamicMaterial->SetScalarParameterValue(StarBrightnessName, FMath::Lerp(SrcSky.StarBrightness, DstSky.StarBrightness, LerpValue));\n\tDynamicMaterial->SetScalarParameterValue(StarShineMaskUVName, FMath::Lerp(SrcSky.StarShineMaskUV, DstSky.StarShineMaskUV, LerpValue));\n\tDynamicMaterial->SetScalarParameterValue(StarShineMinName, FMath::Lerp(SrcSky.StarShineMin, DstSky.StarShineMin, LerpValue));\n\tDynamicMaterial->SetScalarParameterValue(StarShineMaxName, FMath::Lerp(SrcSky.StarShineMax, DstSky.StarShineMax, LerpValue));\n\tDynamicMaterial->SetScalarParameterValue(StarUVName, FMath::Lerp(SrcSky.StarUV, DstSky.StarUV, LerpValue));\n\n\tDynamicMaterial->SetScalarParameterValue(CubeMapLerpName, LerpValue);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoSky::UpdateSkyMesh(const FSoSkyPreset& Preset)\n{\n\t// base color\n\tDynamicMaterial->SetVectorParameterValue(BaseColorName, Preset.BaseColor);\n\tDynamicMaterial->SetScalarParameterValue(BrightnessName, Preset.Brightness);\n\tDynamicMaterial->SetScalarParameterValue(GradientAddName, Preset.GradientAdd);\n\tDynamicMaterial->SetScalarParameterValue(GradientMultiplyName, Preset.GradientMultiply);\n\tDynamicMaterial->SetScalarParameterValue(GradientPowerName, Preset.GradientPower);\n\n\t// cloud\n\tDynamicMaterial->SetVectorParameterValue(CloudColorName, Preset.CloudColor);\n\tDynamicMaterial->SetScalarParameterValue(CloudLerpMultiplyName, Preset.CloudLerpMultiply);\n\tDynamicMaterial->SetScalarParameterValue(CloudLerpPowerName, Preset.CloudLerpPower);\n\tDynamicMaterial->SetScalarParameterValue(CloudLerpUVName, Preset.CloudLerpUV);\n\tDynamicMaterial->SetScalarParameterValue(CloudOpacityName, Preset.CloudOpacity);\n\tDynamicMaterial->SetScalarParameterValue(CloudSpeedName, Preset.CloudSpeed);\n\tDynamicMaterial->SetScalarParameterValue(CloudMoreCloudName, Preset.CloudMoreClouds);\n\n\t// Cubemap\n\tDynamicMaterial->SetScalarParameterValue(CubemapStrengthName, Preset.CubemapStrength);\n\tDynamicMaterial->SetScalarParameterValue(SkyTexLerpName, Preset.SkyTexLerp);\n\tDynamicMaterial->SetTextureParameterValue(SourceTextureName, GetTextureCube(Preset.TexturePath));\n\tDynamicMaterial->SetTextureParameterValue(DestTextureName, GetTextureCube(Preset.TexturePath));\n\n\t// Stars\n\tDynamicMaterial->SetVectorParameterValue(StarColorName, Preset.StarColor);\n\n\tDynamicMaterial->SetScalarParameterValue(StarBrightnessName, Preset.StarBrightness);\n\tDynamicMaterial->SetScalarParameterValue(StarShineMaskUVName, Preset.StarShineMaskUV);\n\tDynamicMaterial->SetScalarParameterValue(StarShineMinName, Preset.StarShineMin);\n\tDynamicMaterial->SetScalarParameterValue(StarShineMaxName, Preset.StarShineMax);\n\tDynamicMaterial->SetScalarParameterValue(StarUVName, Preset.StarUV);\n\n\tDynamicMaterial->SetScalarParameterValue(CubeMapLerpName, 0.0f);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoSky::UpdateSunParams(const FSoSunPreset& SrcSun, const FSoSunPreset& DstSun, float LerpValue)\n{\n\tDynamicMaterial->SetVectorParameterValue(SunCloudColorName, FMath::Lerp(SrcSun.CloudColor, DstSun.CloudColor, LerpValue));\n\tDynamicMaterial->SetVectorParameterValue(SunColorName, FMath::Lerp(SrcSun.Color, DstSun.Color, LerpValue));\n\n\tDynamicMaterial->SetScalarParameterValue(SunGradientMultiplyName, FMath::Lerp(SrcSun.GradientMultiply, DstSun.GradientMultiply, LerpValue));\n\tDynamicMaterial->SetScalarParameterValue(SunGradientPowerName, FMath::Lerp(SrcSun.GradientPower, DstSun.GradientPower, LerpValue));\n\tDynamicMaterial->SetScalarParameterValue(SunGradientRadiusName, FMath::Lerp(SrcSun.GradientRadius, DstSun.GradientRadius, LerpValue));\n\tDynamicMaterial->SetScalarParameterValue(SunGradientXName, FMath::Lerp(SrcSun.GradientX, DstSun.GradientX, LerpValue));\n\tDynamicMaterial->SetScalarParameterValue(SunGradientYName, FMath::Lerp(SrcSun.GradientY, DstSun.GradientY, LerpValue));\n\tDynamicMaterial->SetScalarParameterValue(SunMultiplyName, FMath::Lerp(SrcSun.SunMultiply, DstSun.SunMultiply, LerpValue));\n\tDynamicMaterial->SetScalarParameterValue(SunRadiusName, FMath::Lerp(SrcSun.SunRadius, DstSun.SunRadius, LerpValue));\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoSky::UpdateSunParams(const FSoSunPreset& Preset)\n{\n\tDynamicMaterial->SetVectorParameterValue(SunCloudColorName, Preset.CloudColor);\n\tDynamicMaterial->SetVectorParameterValue(SunColorName, Preset.Color);\n\n\tDynamicMaterial->SetScalarParameterValue(SunGradientMultiplyName, Preset.GradientMultiply);\n\tDynamicMaterial->SetScalarParameterValue(SunGradientPowerName, Preset.GradientPower);\n\tDynamicMaterial->SetScalarParameterValue(SunGradientRadiusName, Preset.GradientRadius);\n\tDynamicMaterial->SetScalarParameterValue(SunGradientXName, Preset.GradientX);\n\tDynamicMaterial->SetScalarParameterValue(SunGradientYName, Preset.GradientY);\n\tDynamicMaterial->SetScalarParameterValue(SunMultiplyName, Preset.SunMultiply);\n\tDynamicMaterial->SetScalarParameterValue(SunRadiusName, Preset.SunRadius);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoSky::UpdateSkyLight(const FSoSkyLightPreset& SrcLight, const FSoSkyLightPreset& DstLight, float LerpValue)\n{\n\tSkyLight->SetCubemapBlend(GetTextureCube(SrcLight.CubeMapPath), GetTextureCube(DstLight.CubeMapPath), LerpValue);\n\tbWasSkyCubemapBlended = true;\n\n\tSkyLight->SetIntensity(FMath::Lerp(SrcLight.Intensity, DstLight.Intensity, LerpValue));\n\n\tconst FLinearColor SrcColor = FLinearColor(SrcLight.LightColor);\n\tconst FLinearColor DstColor = FLinearColor(DstLight.LightColor);\n\tSkyLight->SetLightColor(FMath::Lerp(SrcColor, DstColor, LerpValue));\n\n\tSkyLight->SetVolumetricScatteringIntensity(FMath::Lerp(SrcLight.VolumetricScatteringIntensity, DstLight.VolumetricScatteringIntensity, LerpValue));\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoSky::UpdateSkyLight(const FSoSkyLightPreset& Preset)\n{\n\tSkyLight->SetCubemap(GetTextureCube(Preset.CubeMapPath));\n\tif (bWasSkyCubemapBlended)\n\t{\n\t\tSkyLight->SetCubemapBlend(GetTextureCube(Preset.CubeMapPath), GetTextureCube(Preset.CubeMapPath), 0.0f);\n\t\tbWasSkyCubemapBlended = false;\n\t}\n\n\tSkyLight->SetIntensity(Preset.Intensity);\n\tSkyLight->SetLightColor(FLinearColor(Preset.LightColor));\n\tSkyLight->SetVolumetricScatteringIntensity(Preset.VolumetricScatteringIntensity);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoSky::UpdateFog(const FSoExponentialHeightFogPreset& SrcFog, const FSoExponentialHeightFogPreset& DstFog, float LerpValue)\n{\n\tFogComponent->SetFogDensity(FMath::Lerp(SrcFog.FogDensity, DstFog.FogDensity, LerpValue));\n\tFogComponent->SetFogMaxOpacity(FMath::Lerp(SrcFog.FogMaskOpacity, DstFog.FogMaskOpacity, LerpValue));\n\tFogComponent->SetFogInscatteringColor(FMath::Lerp(SrcFog.FogInscatteringColor, DstFog.FogInscatteringColor, LerpValue));\n\tFogComponent->SetFogHeightFalloff(FMath::Lerp(SrcFog.FogHeightFallof, DstFog.FogHeightFallof, LerpValue));\n\tFogComponent->SetFogCutoffDistance(FMath::Lerp(SrcFog.FogCutoffDistance, DstFog.FogCutoffDistance, LerpValue));\n\tFogComponent->SetVolumetricFog(SrcFog.bVolumetricFog || DstFog.bVolumetricFog);\n\tFogComponent->SetVolumetricFogExtinctionScale(FMath::Lerp(SrcFog.VolumetricFogExtinctionScale, DstFog.VolumetricFogExtinctionScale, LerpValue));\n\tFogComponent->SetVolumetricFogDistance(FMath::Lerp(SrcFog.VolumetricFogViewDistance, DstFog.VolumetricFogViewDistance, LerpValue));\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoSky::UpdateFog(const FSoExponentialHeightFogPreset& Preset)\n{\n\tFogComponent->SetFogDensity(Preset.FogDensity);\n\tFogComponent->SetFogMaxOpacity(Preset.FogMaskOpacity);\n\tFogComponent->SetFogInscatteringColor(Preset.FogInscatteringColor);\n\tFogComponent->SetFogHeightFalloff(Preset.FogHeightFallof);\n\tFogComponent->SetFogCutoffDistance(Preset.FogCutoffDistance);\n\tFogComponent->SetVolumetricFog(Preset.bVolumetricFog);\n\tFogComponent->SetVolumetricFogExtinctionScale(Preset.VolumetricFogExtinctionScale);\n\tFogComponent->SetVolumetricFogDistance(Preset.VolumetricFogViewDistance);\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUTextureCube* ASoSky::GetTextureCube(FSoftObjectPath Path)\n{\n\tUTextureCube* TextureCube = Cast<UTextureCube>(Path.ResolveObject());\n\tif (TextureCube != nullptr)\n\t\treturn TextureCube;\n\n\treturn Cast<UTextureCube>(Path.TryLoad());\n}\n"
  },
  {
    "path": "Source/SOrb/Objects/SoSky.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#pragma once\n\n#include \"GameFramework/Actor.h\"\n#include \"Components/SkyLightComponent.h\"\n#include \"Components/ExponentialHeightFogComponent.h\"\n#include \"Levels/SoEnvironmentPreset.h\"\n\n#include \"SoSky.generated.h\"\n\nUCLASS()\nclass SORB_API ASoSky : public AActor\n{\n\tGENERATED_BODY()\n\npublic:\n\t// Sets default values for this actor's properties\n\tASoSky();\n\n\tvirtual void OnConstruction(const FTransform& Transform) override;\n\n#if WITH_EDITOR\n\tvirtual void PostEditChangeProperty(FPropertyChangedEvent& PropertyChangedEvent) override;\n#endif\n\n\tvirtual void Tick(float DeltaTime) override;\n\n\t// Setter for previewed values\n\tvoid SetPreviewedPreset0(FName InPresetName) { PreviewedPreset0 = InPresetName; }\n\tvoid SetPreviewedPreset1(FName InPresetName) { PreviewedPreset1 = InPresetName; }\n\tvoid SetBlendValue(float InBlendValue) { BlendValue = InBlendValue; }\n\n\t// Update the sky with the values for the previewed sky\n\tvoid UpdatePreviewedSky()\n\t{\n\t\tInitializeSoSky();\n\t\tUpdateSky(PreviewedPreset0, PreviewedPreset1, BlendValue);\n\t}\n\nprotected:\n\t// Called when the game starts or when spawned\n\tvirtual void BeginPlay() override;\n\n\tvoid InitializeSoSky();\n\n\tvoid UpdateSky(FName FirstPresetName, FName SecondPresetName, float LerpValue);\n\n\n\tvoid UpdateSkyMesh(const FSoSkyPreset& SrcSky, const FSoSkyPreset& DstSky, float LerpValue);\n\tvoid UpdateSkyMesh(const FSoSkyPreset& Preset);\n\n\tvoid UpdateSunParams(const FSoSunPreset& SrcSun, const FSoSunPreset& DstSun, float LerpValue);\n\tvoid UpdateSunParams(const FSoSunPreset& Preset);\n\n\tvoid UpdateSkyLight(const FSoSkyLightPreset& SrcLight, const FSoSkyLightPreset& DstLight, float LerpValue);\n\tvoid UpdateSkyLight(const FSoSkyLightPreset& Preset);\n\n\tvoid UpdateFog(const FSoExponentialHeightFogPreset& SrcFog, const FSoExponentialHeightFogPreset& DstFog, float LerpValue);\n\tvoid UpdateFog(const FSoExponentialHeightFogPreset& Preset);\n\n\tUTextureCube* GetTextureCube(FSoftObjectPath Path);\n\npublic:\n\tstatic const FName DefaultPresetName;\n\nprotected:\n\n\t/** name of the preset previewed in editor if BlendValue = 0.0f */\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere, Category = Preview)\n\tFName PreviewedPreset0 = \"Default\";\n\n\t/** name of the preset previewed in editor if BlendValue = 1.0f */\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere, Category = Preview)\n\tFName PreviewedPreset1 = \"Default\";\n\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere, Category = Preview)\n\tfloat BlendValue = 0.0f;\n\n\t/** on act3 it ruins some preset so it is disabled by default, use with caution! */\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere, Category = Preview)\n\tbool bEnableBlendedPreview = false;\n\n\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere)\n\tTMap<FName, FSoEnvironmentPreset> Presets;\n\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere)\n\tTMap<FName, FSoEnvironmentPreset> PresetsWithoutVolumetricFog;\n\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere)\n\tUSkyLightComponent* SkyLight;\n\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere)\n\tUStaticMeshComponent* SkySphereMesh;\n\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere)\n\tUExponentialHeightFogComponent* FogComponent;\n\n\tUMaterialInstanceDynamic* DynamicMaterial = nullptr;\n\n\tbool bWasSkyCubemapBlended = false;\n\n\t// base color\n\tconst FName BaseColorName = \"BaseColor\";\n\tconst FName BrightnessName = \"Brightness\";\n\tconst FName GradientAddName = \"GradientAdd\";\n\tconst FName GradientMultiplyName = \"GradientMultiply\";\n\tconst FName GradientPowerName = \"GradientPower\";\n\t// Cloud\n\tconst FName CloudColorName = \"CloudColor\";\n\tconst FName CloudLerpMultiplyName = \"CloudLerpMultiply\";\n\tconst FName CloudLerpPowerName = \"CloudLerpPower\";\n\tconst FName CloudLerpUVName = \"CloudLerpUV\";\n\tconst FName CloudOpacityName = \"CloudOpacity\";\n\tconst FName CloudSpeedName = \"CloudSpeed\";\n\tconst FName CloudMoreCloudName = \"MoreClouds\";\n\t// Cubemap\n\tconst FName CubemapStrengthName = \"CubemapStrength\";\n\tconst FName SkyTexLerpName = \"SkyTexLerp\";\n\tconst FName SourceTextureName = \"SourceTexture\";\n\tconst FName DestTextureName = \"DestTexture\";\n\t// Stars\n\tconst FName StarBrightnessName = \"StarBrightness\";\n\tconst FName StarColorName = \"StarColor\";\n\tconst FName StarShineMaskUVName = \"StarShineMaskUV\";\n\tconst FName StarShineMinName = \"StarShineMin\";\n\tconst FName StarShineMaxName = \"StarShineMax\";\n\tconst FName StarUVName = \"StarUV\";\n\n\tconst FName CubeMapLerpName = \"CubemapLerp\";\n\n\tconst FName SunCloudColorName = \"SunCloudColor\";\n\tconst FName SunColorName = \"SunColor\";\n\tconst FName SunGradientMultiplyName = \"SunGradientMultiply\";\n\tconst FName SunGradientPowerName = \"SunGradientPower\";\n\tconst FName SunGradientRadiusName = \"SunGradientRadius\";\n\tconst FName SunGradientXName = \"SunGradientX\";\n\tconst FName SunGradientYName = \"SunGradientY\";\n\tconst FName SunMultiplyName = \"SunMultiply\";\n\tconst FName SunRadiusName = \"SunRadius\";\n};\n"
  },
  {
    "path": "Source/SOrb/Objects/SoSwingCenter.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#include \"SoSwingCenter.h\"\n#include \"Character/SoCharacter.h\"\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// Sets default values\nASoSwingCenter::ASoSwingCenter(const FObjectInitializer& ObjectInitializer)\n{\n\tPrimaryActorTick.bCanEverTick = false;\n\n\tCollision = ObjectInitializer.CreateDefaultSubobject<USphereComponent>(this, TEXT(\"Collision\"));\n\tCollision->SetCollisionEnabled(ECollisionEnabled::QueryOnly);\n\tCollision->SetupAttachment(RootComponent);\n\n\tCollision->SetGenerateOverlapEvents(true);\n\n\tCollision->OnComponentBeginOverlap.AddDynamic(this, &ASoSwingCenter::OnOverlapBegin);\n\tCollision->OnComponentEndOverlap.AddDynamic(this, &ASoSwingCenter::OnOverlapEnd);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// Called when the game starts or when spawned\nvoid ASoSwingCenter::BeginPlay()\n{\n\tSuper::BeginPlay();\n\n}\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoSwingCenter::OnOverlapBegin(UPrimitiveComponent* OverlappedComponent, AActor* OtherActor, UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult & SweepResult)\n{\n\tif (OtherComp == OtherActor->GetRootComponent())\n\t{\n\t\tASoCharacter* Char = Cast<ASoCharacter>(OtherActor);\n\t\tif (Char != nullptr)\n\t\t\tChar->AddSwingCenter(this);\n\n\t\tCharEnteredArea();\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoSwingCenter::OnOverlapEnd(UPrimitiveComponent* OverlappedComponent, AActor* OtherActor, UPrimitiveComponent* OtherComp, int32 OtherBodyIndex)\n{\n\tif (OtherComp == OtherActor->GetRootComponent())\n\t{\n\t\tASoCharacter* Char = Cast<ASoCharacter>(OtherActor);\n\t\tif (Char != nullptr)\n\t\t\tChar->RemoveSwingCenter(this);\n\n\t\tCharLeftArea();\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFVector ASoSwingCenter::GetSwingCenter_Implementation()\n{\n\treturn RootComponent->GetComponentLocation();\n}\n"
  },
  {
    "path": "Source/SOrb/Objects/SoSwingCenter.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#pragma once\n#include \"Components/SphereComponent.h\"\n#include \"SoSwingCenter.generated.h\"\n\n\nUCLASS()\nclass SORB_API ASoSwingCenter : public AActor\n{\n\tGENERATED_BODY()\n\npublic:\n\t// Sets default values for this actor's properties\n\tASoSwingCenter(const FObjectInitializer& ObjectInitializer);\n\n\t// Called when the game starts or when spawned\n\tvirtual void BeginPlay() override;\n\n\tUFUNCTION(BlueprintNativeEvent)\n\tFVector GetSwingCenter();\n\n\tUFUNCTION()\n\tvirtual void OnOverlapBegin(UPrimitiveComponent* OverlappedComponent, AActor* OtherActor, UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult & SweepResult);\n\n\tUFUNCTION()\n\tvirtual void OnOverlapEnd(UPrimitiveComponent* OverlappedComponent, AActor* OtherActor, UPrimitiveComponent* OtherComp, int32 OtherBodyIndex);\n\n\tUFUNCTION(BlueprintImplementableEvent)\n\tvoid CharEnteredArea();\n\n\tUFUNCTION(BlueprintImplementableEvent)\n\tvoid CharLeftArea();\n\nprotected:\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite)\n\tUSphereComponent* Collision;\n};\n"
  },
  {
    "path": "Source/SOrb/Online/Achievements/SoAchievement.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#include \"SoAchievement.h\"\n\n#if WARRIORB_WITH_ONLINE\n#include \"Interfaces/OnlineAchievementsInterface.h\"\n#endif // WARRIORB_WITH_ONLINE\n\n#include \"Basic/Helpers/SoStaticHelper.h\"\n#include \"Basic/Helpers/SoStringHelper.h\"\n#include \"SoAchievementSettings.h\"\n#include \"Basic/Helpers/SoPlatformHelper.h\"\n#include \"Math/UnrealMathUtility.h\"\n\nDEFINE_LOG_CATEGORY_STATIC(LogSoAchievement, All, All)\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFName FSoAchievement::SteamStatTypeToName(const ESoSteamStatType Type)\n{\n\tFString EnumValue;\n\tif (USoStringHelper::ConvertEnumToString<ESoSteamStatType>(TEXT(\"ESoSteamStatType\"), Type, false, EnumValue))\n\t\treturn FName(*EnumValue);\n\n\treturn NAME_None;\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nconst TSet<FName>& FSoAchievement::GetAllAchievementNames()\n{\n\tstatic TSet<FName> AllNamesSet;\n\tif (AllNamesSet.Num() == 0)\n\t{\n\t\tif (USoPlatformHelper::IsDemo())\n\t\t{\n\t\t\tAllNamesSet.Append(GetDefault<USoAchievementSettings>()->GetDemoAchievementNames());\n\t\t}\n\t\telse\n\t\t{\n\t\t\tAllNamesSet.Append(GetDefault<USoAchievementSettings>()->GetAchievementNames());\n\t\t}\n\t}\n\n\treturn AllNamesSet;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool FSoAchievement::WouldMakeItUnlocked(float FutureProgress) const\n{\n\tFutureProgress = GetClampOfProgress(FutureProgress);\n\treturn FMath::IsNearlyEqual(FutureProgress, GetMaxProgressAsFloat());\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSoAchievement::SetProgress(float InProgress)\n{\n\tProgress = GetClampOfProgress(InProgress);\n\tUnlockTime = {};\n\n\tif (IsUnlocked())\n\t\tUnlockTime = FDateTime::UtcNow();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSoAchievement::Unlock()\n{\n\tSetProgress(GetMaxProgressAsFloat());\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFString FSoAchievement::ToString() const\n{\n\treturn FString::Printf(\n\t\tTEXT(\"Name=%s, Progress=%f (IsUnlocked = %s), UnlockTime=%s, bSetBySteam = %s\\n\")\n\t\tTEXT(\"Title=%s, LockedDesc=%s, UnlockedDesc=%s\"),\n\t\t*Name.ToString(),\n\t\tProgress,\n\t\tIsUnlocked() ? TEXT(\"true\") : TEXT(\"false\"),\n\t\t*UnlockTime.ToString(),\n\t\tbSetBySteam ? TEXT(\"true\") : TEXT(\"false\"),\n\t\t*Title.ToString(),\n\t\t*LockedDesc.ToString(),\n\t\t*UnlockedDesc.ToString()\n\t);\n}\n"
  },
  {
    "path": "Source/SOrb/Online/Achievements/SoAchievement.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#pragma once\n\n#include \"CoreMinimal.h\"\n\n#include \"SoAchievement.generated.h\"\n\nstruct FOnlineAchievement;\nstruct FOnlineAchievementDesc;\n\n// https://partner.steamgames.com/doc/features/achievements#7\nUENUM(BlueprintType)\nenum class ESoSteamStatType : uint8\n{\n\tInt = 0,\n\tFloat\n\n\t// TODO add AVG Rate\n};\n\n// Hold the stats for the player progress\nUSTRUCT(BlueprintType)\nstruct FSoAchievement\n{\n\tGENERATED_USTRUCT_BODY()\n\ttypedef FSoAchievement Self;\n\npublic:\n\tstatic const TSet<FName>& GetAllAchievementNames();\n\tstatic float GetUnlockedProgressValue() { return 1.f; }\n\tstatic FName SteamStatTypeToName(const ESoSteamStatType Type);\n\n\t// Valid ingame Achievement Name, this is the only valid one\n\tstatic bool IsValidName(const FName Name) { return GetAllAchievementNames().Contains(Name); }\n\tstatic bool IsValidName(const FString& NameStr) { return IsValidName(FName(*NameStr)); }\n\n\tFSoAchievement() {}\n\n\tvoid SetBySteam(bool bValue) { bSetBySteam = bValue; }\n\tbool IsSetBySteam() const { return bSetBySteam; }\n\n\tbool IsValid() const { return Name.IsValid() && !Name.IsNone(); }\n\tbool IsUnlocked() const { return FMath::IsNearlyEqual(Progress, GetMaxProgressAsFloat()); }\n\tbool IsProgressAchievement() const\n\t{\n\t\treturn MaxProgress > 1 && SteamUserStatName != NAME_None;\n\t}\n\n\t// Getters/Setters\n\tFName GetName() const { return Name; }\n\tint32 GetProgress() const { return FMath::FloorToInt(GetProgressAsFloat()); }\n\tfloat GetProgressAsFloat() const { return Progress; }\n\tint32 GetMaxProgress() const { return MaxProgress; }\n\tfloat GetMaxProgressAsFloat() const { return static_cast<float>(GetMaxProgress()); }\n\n\t// Checks if this progress would make this unlocked\n\tbool WouldMakeItUnlocked(float FutureProgress) const;\n\n\t// Sets the progress for achievements that support progress\n\tvoid SetProgress(float InProgress);\n\n\t// Unlocks the achievement\n\tvoid Unlock();\n\n\t// Resets the achievement progress, should only be used in development\n\tvoid Reset() { SetProgress(0.f); }\n\n\t// Returns debugging string to print out achievement info\n\tFString ToString() const;\n\n\tbool operator==(const Self& Other)\n\t{\n\t\treturn Name == Other.Name &&\n\t\t\tbIsHidden == Other.bIsHidden &&\n\t\t\tMaxProgress == Other.MaxProgress &&\n\t\t\tSteamUserStatName == Other.SteamUserStatName &&\n\t\t\tSteamUserStatType == Other.SteamUserStatType &&\n\t\t\tbIsOnSteam == Other.bIsOnSteam;\n\t}\n\tbool operator!=(const Self& Other)\n\t{\n\t\treturn !(*this == Other);\n\t}\n\nprotected:\n\tfloat GetClampOfProgress(float InValue) const\n\t{\n\t\treturn FMath::Clamp(InValue, 0.f, GetMaxProgressAsFloat());\n\t}\n\nprotected:\n\t//\n\t// TODO USE\n\t//\n\n\t// Achievement Title\n\tUPROPERTY(BlueprintReadOnly, VisibleAnywhere, Category = \">Runtime\")\n\tFText Title;\n\n\t// Locked description of the achievement\n\tUPROPERTY(BlueprintReadOnly, VisibleAnywhere, Category = \">Runtime\")\n\tFText LockedDesc;\n\n\t// Unlocked description of the achievement\n\tUPROPERTY(BlueprintReadOnly, VisibleAnywhere, Category = \">Runtime\")\n\tFText UnlockedDesc;\n\n\t// The Date/Time the achievement was unlocked\n\tUPROPERTY(BlueprintReadOnly, VisibleAnywhere, Category = \">Runtime\")\n\tFDateTime UnlockTime{0};\n\n\t// NOTE: This is set from Unreal Online Subsystem\n\t// Progress towards completing the achievement in range: [0, 100]\n\t// Steam:\n\t//\t\tIt calls GetUserAchievement which returns if it is unlocked or not\n\t//\t\t0 - locked\n\t//\t\t1 - unlocked\n\tUPROPERTY(BlueprintReadOnly, VisibleAnywhere, Category = \">Runtime\")\n\tfloat Progress = 0.f;\n\n\t// Achievement set by steam\n\tUPROPERTY(BlueprintReadOnly, VisibleAnywhere, Category = \">Runtime\")\n\tbool bSetBySteam = false;\n\n\t//\n\t// TODO USE\n\t//\n\n\n\t// Unique ID of the achievement\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = \">Data\")\n\tFName Name = NAME_None;\n\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = \">Data\")\n\tbool bIsHidden = false;\n\n\t// Simple achievements, those who can be locked/unlocked have this at 1\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = \">Data\", meta = (ClampMin = \"1\", UIMin = \"1\"))\n\tint32 MaxProgress = 1;\n\n\t//\n\t// Steam\n\t//\n\n\t// On steam if MaxProgres != 1 we need to set this StatName to progress the achievement\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = \">Data\")\n\tFName SteamUserStatName = NAME_None;\n\n\t// Type of user stat\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = \">Data\")\n\tESoSteamStatType SteamUserStatType = ESoSteamStatType::Int;\n\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = \">Data\")\n\tbool bIsOnSteam = true;\n};\n"
  },
  {
    "path": "Source/SOrb/Online/Achievements/SoAchievementManager.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#include \"SoAchievementManager.h\"\n#include \"Basic/SoGameInstance.h\"\n#include \"Basic/Helpers/SoPlatformHelper.h\"\n#include \"GameFramework/PlayerController.h\"\n#include \"GameFramework/PlayerState.h\"\n#include \"SoAchievement.h\"\n\n#if WARRIORB_WITH_ONLINE\n#include \"Interfaces/OnlineAchievementsInterface.h\"\n#include \"OnlineSubsystemUtils/Classes/AchievementWriteCallbackProxy.h\"\n#endif // WARRIORB_WITH_ONLINE\n\n#if WARRIORB_WITH_STEAM\n#include \"INotYetSteamModule.h\"\n#endif // WARRIORB_WITH_STEAM\n\n#include \"DlgDialogueParticipant.h\"\n\n#include \"Online/SoOnlineHelper.h\"\n#include \"SoAchievementSettings.h\"\n#include \"SaveFiles/SoWorldState.h\"\n#include \"SaveFiles/SoSaveParser.h\"\n#include \"SaveFiles/SoSaveWriter.h\"\n#include \"SaveFiles/SoSaveHelper.h\"\n#include \"Basic/Helpers/SoStaticHelper.h\"\n\nDEFINE_LOG_CATEGORY_STATIC(LogSoAchievementManager, All, All)\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUSoAchievementManager::USoAchievementManager(const FObjectInitializer& ObjectInitializer) : Super(ObjectInitializer)\n{\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUSoAchievementManager::~USoAchievementManager()\n{\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUSoAchievementManager* USoAchievementManager::GetInstance(const UObject* WorldContextObject)\n{\n\treturn USoGameInstance::Get(WorldContextObject).GetAchievementManager();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoAchievementManager::AreSteamAchievementsAvailable()\n{\n\treturn USoPlatformHelper::IsSteamInitialized();\n}\n\n#if WARRIORB_WITH_STEAM\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nINYSteamStatsAndAchievementsPtr USoAchievementManager::GetSteamAchievements()\n{\n\tINYSteamSubsystemPtr Subsystem = INotYetSteamModule::Get().GetSteamSubsystem();\n\tif (Subsystem.IsValid())\n\t{\n\t\treturn Subsystem->GetStatsAndAchievements();\n\t}\n\n\treturn nullptr;\n}\n#endif // WARRIORB_WITH_STEAM\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoAchievementManager::Tick(float DeltaSeconds)\n{\n\t//if (!ValidateCurrentState(false))\n\t//\treturn;\n\n\t// Fill achievements once\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoAchievementManager::Initialize(APlayerController* InController)\n{\n\tUE_LOG(LogSoAchievementManager, Log, TEXT(\"Initialize\"));\n\n\tPlayerControllerWeakPtr = InController;\n\tUserIDPtr = USoOnlineHelper::GetUniqueNetIDFromObject(InController);\n\tif (!IsUserIDValid())\n\t{\n\t\tUE_LOG(LogSoAchievementManager, Error, TEXT(\"Initialize: Cannot map local player to unique net ID\"));\n\t\treturn false;\n\t}\n\tUE_LOG(LogSoAchievementManager, Log, TEXT(\"Initialize: UniqueNetID = %s\"), *UserIDPtr->ToDebugString());\n\n\t// Initialize from settings\n\t// AchievementDefinitions = GetDefault<USoAchievementSettings>()->AchievementDefinitions;\n\n\t// Steam achievements\n#if WARRIORB_WITH_STEAM\n\tSteamAchievementsInterface = GetSteamAchievements();\n\t//if (AreSteamAchievementsAvailable() && SteamAchievementsInterface.IsValid())\n\tif (SteamAchievementsInterface.IsValid())\n\t{\n\t\tUE_LOG(LogSoAchievementManager, Log, TEXT(\"Initialize: Steam Achievements are available\"));\n\n\t\tSteamAchievementsInterface->OnUserStatsReceived().AddUObject(this, &ThisClass::OnSteamUserStatsReceived);\n\t\tSteamAchievementsInterface->OnUserAchievementStored().AddUObject(this, &ThisClass::OnSteamAchievementStored);\n\t}\n\telse\n\t{\n\t\tSteamAchievementsInterface = nullptr;\n\t\tUE_LOG(LogSoAchievementManager, Error, TEXT(\"Initialize: Steam Achievements are not available\"));\n\t}\n\n\t// Warn us if anything is wrong\n\tCheckSteamDataIntegrity();\n#endif // WARRIORB_WITH_STEAM\n\n\t// Retrieve the data for our achievements\n\tCacheAchievements();\n\treturn true;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoAchievementManager::Shutdown()\n{\n\tPlayerControllerWeakPtr = nullptr;\n\tUserIDPtr.Reset();\n\tUE_LOG(LogSoAchievementManager, Log, TEXT(\"Shutdown\"));\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoAchievementManager::CheckSteamDataIntegrity()\n{\n#if WARRIORB_WITH_STEAM\n\tUE_LOG(LogSoAchievementManager, Verbose, TEXT(\"CheckSteamDataIntegrity\"));\n\tif (!SteamAchievementsInterface.IsValid())\n\t\treturn;\n\n\t// check maybe if achievement name exists?\n#endif // WARRIORB_WITH_STEAM\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoAchievementManager::ResetAchievements()\n{\n\tUE_LOG(LogSoAchievementManager, Log, TEXT(\"ResetAchievements\"));\n\n#if WARRIORB_WITH_STEAM\n\tif (SteamAchievementsInterface.IsValid())\n\t{\n\t\tSteamAchievementsInterface->ResetAllAchievements();\n\t}\n#endif // WARRIORB_WITH_STEAM\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoAchievementManager::ResetAchievement(UObject* WorldContextObject, FName AchievementName)\n{\n\tif (AActor* Player = USoStaticHelper::GetPlayerCharacterAsActor(WorldContextObject))\n\t\tIDlgDialogueParticipant::Execute_ModifyBoolValue(Player, AchievementName, false);\n\n\tUE_LOG(LogSoAchievementManager, Log, TEXT(\"ResetAchievement = %s\"), *AchievementName.ToString());\n#if WARRIORB_WITH_STEAM\n\tif (SteamAchievementsInterface.IsValid())\n\t{\n\t\tSteamAchievementsInterface->ResetAchievement(AchievementName);\n\t}\n#endif // WARRIORB_WITH_STEAM\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoAchievementManager::IsProgressAchievement(FName AchievementName) const\n{\n\t// const FSoAchievement* Achievement = LocalAchievementsStorage().Find(FSoAchievement::NameIDToType(AchievementName));\n\t// if (!Achievement)\n\t// \treturn false;\n\n\t// return Achievement->IsProgressAchievement();\n\tcheckNoEntry();\n\treturn false;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoAchievementManager::ShowAchievementProgress(FName AchievementName) const\n{\n\tif (!IsValidAchievementName(AchievementName))\n\t{\n\t\tUE_LOG(LogSoAchievementManager, Warning, TEXT(\"ShowAchievementProgress: AchievementName = %s does not exist\"), *AchievementName.ToString());\n\t\treturn;\n\t}\n\n\tUE_LOG(LogSoAchievementManager, Log, TEXT(\"ShowAchievementProgress = %s\"), *AchievementName.ToString());\n#if WARRIORB_WITH_STEAM\n\tif (SteamAchievementsInterface.IsValid())\n\t{\n\t\t// const FSoAchievement& FoundAchievement = LocalAchievementsStorage().FindChecked(FSoAchievement::NameIDToType(AchievementName));\n\t\t//SteamAchievementsInterface->ShowAchievementProgress(AchievementName, FoundAchievement.GetProgress(), FoundAchievement.GetMaxProgress());\n\t\tcheckNoEntry();\n\t}\n#endif\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoAchievementManager::UnlockAchievement(UObject* WorldContextObject, FName AchievementName)\n{\n\t// achievement already unlocked\n\tif (AActor* Player = USoStaticHelper::GetPlayerCharacterAsActor(WorldContextObject))\n\t{\n\t\tif (IDlgDialogueParticipant::Execute_GetBoolValue(Player, AchievementName))\n\t\t\treturn;\n\n\t\tIDlgDialogueParticipant::Execute_ModifyBoolValue(Player, AchievementName, true);\n\t}\n\n\tconst FString ThisContext = FString::Printf(TEXT(\"UnlockAchievement(AchievementName = %s)\"), *AchievementName.ToString());\n\tUE_LOG(LogSoAchievementManager, Log, TEXT(\"%s\"), *ThisContext);\n\n#if WARRIORB_WITH_STEAM\n\tif (SteamAchievementsInterface.IsValid())\n\t{\n\t\tSteamAchievementsInterface->UnlockAchievement(AchievementName);\n\t}\n\telse\n\t{\n\t\tUE_LOG(LogSoAchievementManager, Error, TEXT(\"%s - steam is NOT available\"), *ThisContext);\n\t}\n#endif // WARRIORB_WITH_STEAM\n\n#if PLATFORM_XBOXONE\n\tUAchievementWriteCallbackProxy* Proxy = UAchievementWriteCallbackProxy::WriteAchievementProgress(WorldContextObject,\n\t\tUSoStaticHelper::GetPlayerController(WorldContextObject),\n\t\tAchievementName);\n\tProxy->Activate();\n#endif\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoAchievementManager::UnlockAchievementIfSatisfied(UObject* WorldContextObject, const FSoConditionalAchievement& Achievement)\n{\n\tif (Achievement.Name == NAME_None || !IsValid(WorldContextObject))\n\t\treturn;\n\n\tif (AActor* Player = USoStaticHelper::GetPlayerCharacterAsActor(WorldContextObject))\n\t{\n\t\tif (Achievement.ConditionBoolTrueOnCharacter != NAME_None && !IDlgDialogueParticipant::Execute_GetBoolValue(Player, Achievement.ConditionBoolTrueOnCharacter))\n\t\t\treturn;\n\n\t\tif (Achievement.ConditionBoolFalseOnCharacter != NAME_None && IDlgDialogueParticipant::Execute_GetBoolValue(Player, Achievement.ConditionBoolFalseOnCharacter))\n\t\t\treturn;\n\n\t\tif (USoAchievementManager* AchievementManager = USoAchievementManager::GetInstance(WorldContextObject))\n\t\t{\n\t\t\tAchievementManager->UnlockAchievement(WorldContextObject, Achievement.Name);\n\t\t}\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoAchievementManager::SetSteamAchievementProgressForName(FName AchievementName, float CompletionRatio)\n{\n#if WARRIORB_WITH_STEAM\n\tcheckNoEntry();\n\t// UE_LOG(LogSoAchievementManager, Log, TEXT(\"SetSteamAchievementProgressForName: Achievement = %s with CompletionRatio = %f\"), *AchievementName.ToString(), CompletionRatio);\n\t// if (!SteamAchievementsInterface.IsValid())\n\t// \treturn;\n\n\t// FSoAchievement* Achievement = LocalAchievementsStorage().Find(FSoAchievement::NameIDToType(AchievementName));\n\t// if (!Achievement)\n\t// {\n\t// \tUE_LOG(LogSoAchievementManager, Warning, TEXT(\"SetSteamAchievementProgressForName: AchievementName = %s does not exist\"), *AchievementName.ToString());\n\t// \treturn;\n\t// }\n\t// const bool bIsProgressAchivement = Achievement->IsProgressAchievement();\n\n\t// // Write stat\n\t// if (bIsProgressAchivement)\n\t// {\n\t// \t// For achievements with progress we must write to the corresponding stat for that\n\t// \tconst FSoAchievementDefinition& Definition = Achievement->GetDefinition();\n\t// \tverify(Definition.IsProgressAchievement());\n\n\t// \tswitch (Definition.SteamUserStatType)\n\t// \t{\n\t// \tcase ESoSteamStatType::Int:\n\t// \t\tSteamAchievementsInterface->SetIntStat(Definition.SteamUserStatName, FMath::FloorToInt(CompletionRatio));\n\t// \t\tbreak;\n\t// \tcase ESoSteamStatType::Float:\n\t// \t\tSteamAchievementsInterface->SetFloatStat(Definition.SteamUserStatName, CompletionRatio);\n\t// \t\tbreak;\n\t// \tdefault:\n\t// \t\tcheckNoEntry();\n\t// \t\tbreak;\n\t// \t}\n\t// \tSteamAchievementsInterface->StoreStats();\n\t// }\n\n\t// // Write achievement\n\t// if (!bIsProgressAchivement || (bIsProgressAchivement && Achievement->WouldMakeItUnlocked(CompletionRatio)))\n\t// {\n\t// \t// Normal achievement\n\t// \tMutexWriteQueries.Lock();\n\t// \tNumInProgressQueriesWrite++;\n\t// \tMutexWriteQueries.Unlock();\n\n\t// \tauto WriteFinishedDelegate = FOnAchievementsWrittenDelegate::CreateLambda([this, AchievementName, CompletionRatio](const FUniqueNetId& UserID, bool bSuccess)\n\t// \t{\n\t// \t\tOnAchievementWritten(AchievementName, CompletionRatio, UserID, bSuccess);\n\n\t// \t\t// TOOD do we need to reset the writer object, this potentially leaks\n\t// \t\t//WriteObject.Reset();\n\t// \t});\n\n\t// \tSteamAchievementsInterface->SetAchievementProgress(*UserIDPtr, AchievementName, CompletionRatio, WriteFinishedDelegate);\n\t// }\n#endif // WARRIORB_WITH_STEAM\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoAchievementManager::ValidateCurrentState(bool bLog) const\n{\n\tbool bHasOneValidSubsystem = false;\n#if WARRIORB_WITH_STEAM\n\tif (SteamAchievementsInterface.IsValid())\n\t{\n\t\tbHasOneValidSubsystem = true;\n\t}\n#endif // WARRIORB_WITH_STEAM\n\n\tif (!bHasOneValidSubsystem)\n\t{\n\t\tif (bLog)\n\t\t\tUE_LOG(LogSoAchievementManager, Warning, TEXT(\"Does not have any valid subsystem\"));\n\n\t\treturn false;\n\t}\n\n\tconst bool bHasValidUserID = IsUserIDValid();\n\tif (!bHasValidUserID)\n\t{\n\t\tif (bLog)\n\t\t\tUE_LOG(LogSoAchievementManager, Warning, TEXT(\"Does not have a valid UserID\"));\n\n\t\treturn false;\n\t}\n\n\treturn true;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoAchievementManager::IsInOfflineMode() const\n{\n\treturn !ValidateCurrentState(false);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoAchievementManager::CacheSteamAchievements()\n{\n#if WARRIORB_WITH_STEAM\n\tUE_LOG(LogSoAchievementManager, Log, TEXT(\"CacheSteamAchievements\"));\n\tif (!SteamAchievementsInterface.IsValid())\n\t\treturn;\n\n\tSteamAchievementsInterface->RequestCurrentStats();\n#endif // WARRIORB_WITH_STEAM\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoAchievementManager::CacheAchievements()\n{\n\tUE_LOG(LogSoAchievementManager, Log, TEXT(\"CacheAchievements\"));\n\tCacheSteamAchievements();\n}\n\n#if WARRIORB_WITH_STEAM\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoAchievementManager::OnSteamUserStatsReceived(FNYSteamUserStatsReceived_Result Result)\n{\n\tif (Result.bSuccess)\n\t{\n\t\tUE_LOG(LogSoAchievementManager, Log, TEXT(\"OnSteamUserStatsReceived Finished for UserID = %llu\"), Result.UserID);\n\t}\n\telse\n\t{\n\t\tUE_LOG(LogSoAchievementManager, Error, TEXT(\"OnSteamUserStatsReceived Failure for UserID = %llu\"),  Result.UserID);\n\t}\n\t// FillAchievements();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoAchievementManager::OnSteamAchievementStored(FNYSteamUserAchievementStored_Result Result)\n{\n\tUE_LOG(\n\t\tLogSoAchievementManager,\n\t\tLog,\n\t\tTEXT(\"OnAchievementWritten Finished for AchievementName = %s, CurrentProgress = %d, bSuccess = %d\"),\n\t\t*Result.AchievementName.ToString(), Result.CurrentProgress, Result.bSuccess\n\t);\n}\n\n#endif // WARRIORB_WITH_STEAM\n"
  },
  {
    "path": "Source/SOrb/Online/Achievements/SoAchievementManager.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#pragma once\n\n#include \"CoreMinimal.h\"\n#include \"HAL/FileManager.h\"\n#include \"UObject/CoreOnline.h\"\n\n#if WARRIORB_WITH_ONLINE\n#include \"OnlineStats.h\"\n#include \"OnlineSubsystem.h\"\n#endif // WARRIORB_WITH_ONLINE\n\n#if WARRIORB_WITH_STEAM\n#include \"INYSteamSubsystem.h\"\n#endif // WARRIORB_WITH_STEAM\n\n#include \"SoAchievement.h\"\n#include \"SoAchievementSettings.h\"\n\n#include \"SoAchievementManager.generated.h\"\n\nclass APlayerController;\n\n\nUSTRUCT(BlueprintType, Blueprintable)\nstruct FSoConditionalAchievement\n{\n\tGENERATED_USTRUCT_BODY()\n\npublic:\n\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere)\n\tFName Name;\n\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere)\n\tFName ConditionBoolTrueOnCharacter;\n\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere)\n\tFName ConditionBoolFalseOnCharacter;\n};\n\n\n// Docs: https://docs.unrealengine.com/en-us/Programming/Online/AchievementsInterface\n// See blueprints implementation:\n// - UAchievementBlueprintLibrary\n// - FOnlineSubsystemBPCallHelper\n// - UAchievementWriteCallbackProxy\nUCLASS(Blueprintable, BlueprintType)\nclass SORB_API USoAchievementManager : public UObject\n{\n\tGENERATED_BODY()\npublic:\n\tUSoAchievementManager(const FObjectInitializer& ObjectInitializer);\n\t~USoAchievementManager();\n\n\tUFUNCTION(BlueprintPure, DisplayName = \"Get So Achievement Manager\", Category=\"Achievements\", meta = (WorldContext = \"WorldContextObject\"))\n\tstatic USoAchievementManager* GetInstance(const UObject* WorldContextObject);\n\tstatic USoAchievementManager& Get(const UObject* WorldContextObject)\n\t{\n\t\tcheck(IsValid(WorldContextObject));\n\t\tauto* Instance = GetInstance(WorldContextObject);\n\t\tcheck(IsValid(Instance));\n\t\treturn *Instance;\n\t}\n\n\tstatic bool AreSteamAchievementsAvailable();\n\n#if WARRIORB_WITH_STEAM\n\tstatic INYSteamStatsAndAchievementsPtr GetSteamAchievements();\n#endif\n\n\tvoid Tick(float DeltaSeconds);\n\tbool Initialize(APlayerController* InController);\n\tbool IsInitialized() const { return PlayerControllerWeakPtr.IsValid() && IsUserIDValid(); }\n\tvoid Shutdown();\n\n\t// Removes all achievements, WARNING: Only call this in dev mode\n\t// All these work only in NON SHIPPING\n\tvoid ResetAchievements(); // this does not clean the player array\n\tvoid ResetAchievement(UObject* WorldContextObject, FName AchievementName);\n\n\tUFUNCTION(BlueprintCallable, Category=\">Achievements\", meta = (WorldContext = \"WorldContextObject\"))\n\tvoid UnlockAchievement(UObject* WorldContextObject, FName AchievementName);\n\n\tUFUNCTION(BlueprintCallable, Category = \">Achievements\", meta = (WorldContext = \"WorldContextObject\"))\n\tstatic void UnlockAchievementIfSatisfied(UObject* WorldContextObject, const FSoConditionalAchievement& Achievement);\n\n\tbool IsProgressAchievement(FName AchievementName) const;\n\tvoid ShowAchievementProgress(FName AchievementName) const;\n\tbool IsValidAchievementName(FName AchievementName) const { return FSoAchievement::IsValidName(AchievementName); }\n\n\tbool IsUserIDValid() const { return UserIDPtr.IsValid() && UserIDPtr->IsValid(); }\n\n\t// Are we recording achievements in  offline mode\n\tbool IsInOfflineMode() const;\n\nprivate:\n\t// Steam variants\n\tvoid SetSteamAchievementProgressForName(FName AchievementName, float CompletionRatio);\n\n\t// Sanity checks\n\n\tvoid CheckSteamDataIntegrity();\n\n\t// Checks if the current state is valid, aka we can do some operation\n\tbool ValidateCurrentState(bool bLog = true) const;\n\n\t// NOTE: This is async\n\tvoid CacheSteamAchievements();\n\tvoid CacheAchievements();\n\n#if WARRIORB_WITH_STEAM\n\t// Internal callback when the achievement query completes\n\tvoid OnSteamUserStatsReceived(FNYSteamUserStatsReceived_Result Result);\n\n\t// Internal callback when the achievement is written\n\tvoid OnSteamAchievementStored(FNYSteamUserAchievementStored_Result Result);\n#endif // WARRIORB_WITH_STEAM\n\nprotected:\n\t// All the Achievement subsystems:\n#if WARRIORB_WITH_STEAM\n\tINYSteamStatsAndAchievementsPtr SteamAchievementsInterface;\n#endif // WARRIORB_WITH_STEAM\n\n\t// Holds the player controller weak object\n\tTWeakObjectPtr<APlayerController> PlayerControllerWeakPtr = nullptr;\n\n\t// Our Net user ID\n\tTSharedPtr<const FUniqueNetId> UserIDPtr;\n};\n"
  },
  {
    "path": "Source/SOrb/Online/Achievements/SoAchievementSettings.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#include \"SoAchievementSettings.h\"\n#include \"SoAchievement.h\"\n#include \"Basic/Helpers/SoStaticHelper.h\"\n\n\n#if WITH_EDITOR\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFText USoAchievementSettings::GetSectionDescription() const\n{\n\treturn FText::FromString(TEXT(\"Configure the achievements present in the game\"));\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoAchievementSettings::CanEditChange(const UProperty* InProperty) const\n{\n\tconst bool bIsEditable = Super::CanEditChange(InProperty);\n\treturn bIsEditable;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoAchievementSettings::PostEditChangeProperty(struct FPropertyChangedEvent& PropertyChangedEvent)\n{\n\tSuper::PostEditChangeProperty(PropertyChangedEvent);\n}\n#endif // WITH_EDITOR\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoAchievementSettings::PostLoad()\n{\n\tSuper::PostLoad();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoAchievementSettings::PostInitProperties()\n{\n\tSuper::PostInitProperties();\n\n\tif (!HasAnyFlags(RF_ClassDefaultObject | RF_NeedLoad))\n\t{\n\t\tCheckAndFixIntegrity();\n\t\tSaveSettings();\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoAchievementSettings::CheckAndFixIntegrity()\n{\n\n}\n"
  },
  {
    "path": "Source/SOrb/Online/Achievements/SoAchievementSettings.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#pragma once\n\n#include \"CoreMinimal.h\"\n\n#include \"Engine/DeveloperSettings.h\"\n#include \"SoAchievement.h\"\n\n#include \"SoAchievementSettings.generated.h\"\n\n// Custom input settings we need\nUCLASS(Config = SoAchievementSettings, DefaultConfig, meta = (DisplayName = \"Warriorb Achievements\"))\nclass SORB_API USoAchievementSettings : public UDeveloperSettings\n{\n\tGENERATED_BODY()\npublic:\n\t// UDeveloperSettings interface\n\t/** Gets the settings container name for the settings, either Project or Editor */\n\tFName GetContainerName() const override { return \"Project\"; }\n\t/** Gets the category for the settings, some high level grouping like, Editor, Engine, Game...etc. */\n\tFName GetCategoryName() const override { return \"Game\"; };\n\t/** The unique name for your section of settings, uses the class's FName. */\n\tFName GetSectionName() const override { return \"Warriorb Achievements\"; };\n\n#if WITH_EDITOR\n\t/** Gets the description for the section, uses the classes ToolTip by default. */\n\tFText GetSectionDescription() const override;\n\n\t/** Whether or not this class supports auto registration or if the settings have a custom setup */\n\tbool SupportsAutoRegistration() const override { return true; }\n\n\t// UObject interface\n\tbool CanEditChange(const UProperty* InProperty) const override;\n\tvoid PostEditChangeProperty(struct FPropertyChangedEvent& PropertyChangedEvent) override;\n#endif // WITH_EDITOR\n\tvoid PostLoad() override;\n\tvoid PostInitProperties() override;\n\n\t// Own methods\n\n\t/** Saves the settings to the config file depending on the settings of this class. */\n\tvoid SaveSettings()\n\t{\n\t\tconst UClass* ThisClass = GetClass();\n\t\tif (ThisClass->HasAnyClassFlags(CLASS_DefaultConfig))\n\t\t{\n\t\t\tUpdateDefaultConfigFile();\n\t\t}\n\t\telse if (ThisClass->HasAnyClassFlags(CLASS_GlobalUserConfig))\n\t\t{\n\t\t\tUpdateGlobalUserConfigFile();\n\t\t}\n\t\telse\n\t\t{\n\t\t\tSaveConfig();\n\t\t}\n\t}\n\n\tvoid CheckAndFixIntegrity();\n\n\tconst TArray<FName>& GetDemoAchievementNames() const { return DemoAchievementNames; }\n\tconst TArray<FName>& GetAchievementNames() const { return AchievementNames; }\n\t\nprotected:\n\t// All the achievement names for the Demo\n\t// Useful mostly for the console commands\n\tUPROPERTY(Config, EditAnywhere, Category = \"Demo\", DisplayName = \"Achievement Names\")\n\tTArray<FName> DemoAchievementNames;\n\n\t// All the achievement name for the main game\n\t// Useful mostly for the console commands\n\tUPROPERTY(Config, EditAnywhere, Category = \"Game\")\n\tTArray<FName> AchievementNames;\n};\n"
  },
  {
    "path": "Source/SOrb/Online/Analytics/SoAnalytics.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#include \"SoAnalytics.h\"\n\n#include \"Basic/Helpers/SoStaticHelper.h\"\n#include \"Basic/Helpers/SoStringHelper.h\"\n#include \"SoAnalyticsProvider.h\"\n#include \"CharacterBase/SoIMortalTypes.h\"\n#include \"SplineLogic/SoPlayerSpline.h\"\n#include \"Basic/Helpers/SoDateTimeHelper.h\"\n#include \"SaveFiles/Stats/SoPlayerProgressSplineStats.h\"\n#include \"SaveFiles/Stats/SoPlayerProgressItemStats.h\"\n#include \"Levels/SoLevelHelper.h\"\n\nDEFINE_LOG_CATEGORY(LogSoAnalytics);\n\n// Static constants\nconst FString USoAnalytics::ATTRIBUTE_FlowType(TEXT(\"flowType\"));\nconst FString USoAnalytics::ATTRIBUTE_FlowSink(TEXT(\"sink\"));\nconst FString USoAnalytics::ATTRIBUTE_FlowSource(TEXT(\"source\"));\nconst FString USoAnalytics::ATTRIBUTE_ItemType(TEXT(\"itemType\"));\nconst FString USoAnalytics::ATTRIBUTE_Currency(TEXT(\"currency\"));\nconst FString USoAnalytics::ATTRIBUTE_Message(TEXT(\"message\"));\nconst FString USoAnalytics::ATTRIBUTE_Value(TEXT(\"value\"));\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoAnalytics::StartSession(bool bInCollectGameAnalytics, bool bInWaitForAnalyticsToSend, double PollWaitSeconds, double PollProcessEventsSeconds)\n{\n\tModifyCanCollectStatus(bInCollectGameAnalytics, bInWaitForAnalyticsToSend, PollWaitSeconds, PollProcessEventsSeconds);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoAnalytics::ModifyCanCollectStatus(bool bInCollectGameAnalytics, bool bInWaitForAnalyticsToSend, double PollWaitSeconds, double PollProcessEventsSeconds)\n{\n\tif (bCollectGameAnalytics == bInCollectGameAnalytics)\n\t\treturn;\n\n\t// Was collecting, now stop\n\tif (bCollectGameAnalytics && !bInCollectGameAnalytics)\n\t{\n\t\tUE_LOG(LogSoAnalytics, Display, TEXT(\"Stopping previous collect session. bCollectGameAnalytics = %d, bWaitForAnalyticsToSend = %d\"), bInCollectGameAnalytics, bInWaitForAnalyticsToSend);\n\t\tEndSession();\n\t\tbCollectGameAnalytics = bInCollectGameAnalytics;\n\t\tbWaitForAnalyticsToSend = bInWaitForAnalyticsToSend;\n\t\treturn;\n\t}\n\n\t// Start normal session\n\tbCollectGameAnalytics = bInCollectGameAnalytics;\n\tbWaitForAnalyticsToSend = bInWaitForAnalyticsToSend;\n\tUE_LOG(LogSoAnalytics, Display, TEXT(\"Normal session. bCollectGameAnalytics = %d, bWaitForAnalyticsToSend = %d\"), bCollectGameAnalytics, bWaitForAnalyticsToSend);\n\tif (!bCollectGameAnalytics)\n\t{\n\t\tUE_LOG(LogSoAnalytics, Display, TEXT(\"Analytics is DISABLED because user opted out.\"));\n\t\treturn;\n\t}\n\n\tif (bInWaitForAnalyticsToSend)\n\t\tFSoAnalyticsProvider::SetPollTimers(PollWaitSeconds, PollProcessEventsSeconds);\n\n\tif (FSoAnalyticsProvider::StartSession())\n\t{\n\t\tFSoAnalyticsProvider::SetCustomDimensions();\n\t\tUE_LOG(LogSoAnalytics, Display, TEXT(\"Analytics START new session\"));\n\t}\n\telse\n\t{\n\t\tUE_LOG(LogSoAnalytics, Error, TEXT(\"USoAnalytics::StartSession: Failed to start\"));\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoAnalytics::EndSession()\n{\n\tif (bCollectGameAnalytics)\n\t{\n\t\tUE_LOG(LogSoAnalytics, Display, TEXT(\"Analytics END session\"));\n\t\tFSoAnalyticsProvider::EndSession();\n\t\tFlushEventsAndWait();\n\t}\n\n\tbCollectGameAnalytics = false;\n\tbWaitForAnalyticsToSend = false;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoAnalytics::FlushEventsAndWait(bool bForceWait)\n{\n\tif (!bCollectGameAnalytics)\n\t\treturn;\n\n\tFSoAnalyticsProvider::FlushEvents();\n\tif (bForceWait || bWaitForAnalyticsToSend)\n\t{\n\t\tUE_LOG(LogSoAnalytics, Display, TEXT(\"Analytics WAITING for analytics to send\"));\n\t\tFSoAnalyticsProvider::WaitForAnalyticsToSend();\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoAnalytics::RecordDesignEvent(const FString& EventId)\n{\n\tif (!bCollectGameAnalytics)\n\t\treturn;\n\n\tFSoAnalyticsProvider::RecordEvent(EventId);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoAnalytics::RecordDesignEvent(const FString& EventId, float Value)\n{\n\tif (!bCollectGameAnalytics)\n\t\treturn;\n\n\t// AttributeName is actually the EventName\n\tconst FString FakeEventId = TEXT(\"NOT_USED_\") + EventId;\n\tconst FString ValueString = FString::SanitizeFloat(Value);\n\tFSoAnalyticsProvider::RecordEventWithAttribute(FakeEventId, EventId, ValueString);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoAnalytics::RecordPerformanceAverageFPS(int32 FPS)\n{\n\tif (!bCollectGameAnalytics || FPS <= 0)\n\t\treturn;\n\n\tstatic const FString EventName(TEXT(\"Performance:AverageFPS\"));\n\tRecordDesignEvent(EventName, static_cast<float>(FPS));\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoAnalytics::RecordPerformanceSplineAverageFPS(const FString& MapName, const FString& SplineName, int32 FPS)\n{\n\tif (!bCollectGameAnalytics || MapName.IsEmpty() || SplineName.IsEmpty() || FPS <= 0)\n\t\treturn;\n\n\tconst FString EventName = FString::Printf(TEXT(\"Performance:%s:%s:AverageFPS\"), *MapName, *SplineName);\n\tRecordDesignEvent(EventName, static_cast<float>(FPS));\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoAnalytics::BuildMessageForCriticalFPSAreas(const FString& MapName, const FString& SplineName, const FSoSplineCriticalFPSAreas& Areas,\n\tconst float AccumulateThreshold, FString& OutMessage)\n{\n\tbool bDidSendAny = false;\n\tif (!bCollectGameAnalytics || MapName.IsEmpty() || SplineName.IsEmpty() || !Areas.HasAreas())\n\t\treturn bDidSendAny;\n\n\tOutMessage = FString::Printf(\n\t\tTEXT(\"Chapter = `%s`\\n\")\n\t\tTEXT(\"Spline = `%s`\\n\")\n\t\tTEXT(\"Areas (on spline):\\n\"),\n\t\t*MapName, *SplineName\n\t);\n\n\t// Send each area\n\tfor (const FSoSplineCriticalFPSLocation& Area : Areas.Areas)\n\t{\n\t\tif (!Area.IsValid() || Area.TimeSeconds < AccumulateThreshold)\n\t\t\tcontinue;\n\n\t\tbDidSendAny = true;\n\t\tOutMessage += FString::Printf(\n\t\t\tTEXT(\"\\tAverageDistance = %d, AverageCriticalFPS = %d, TimeSeconds = %d\\n\"),\n\t\t\tArea.AverageDistance, Area.AverageCriticalFPS, FMath::TruncToInt(Area.TimeSeconds)\n\t\t);\n\t}\n\n\treturn bDidSendAny;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoAnalytics::RecordPerformanceSplineCriticalFPSAreas(const TArray<FString>& SplineMessages)\n{\n\tif (!bCollectGameAnalytics || SplineMessages.Num() == 0)\n\t\treturn;\n\n\tFString Message = FString::Printf(\n\t\tTEXT(\"- Critical FPS drop happened -\\n\")\n\t\tTEXT(\"CriticalFPSThreshold = %f\\n\")\n\t\tTEXT(\"ThresholdDistanceSimilar = %d\\n\")\n\t\tTEXT(\"Platform:\\n%s\\n\")\n\t\tTEXT(\"Splines:\\n\\n\"),\n\t\tASoPlayerSpline::CriticalFPSThreshold, FSoSplineCriticalFPSLocation::ThresholdDistanceSimilar,\n\t\t*USoPlatformHelper::ToStringPlatformContext()\n\t);\n\n\t// Send each spline\n\tfor (const FString& SplineMessage : SplineMessages)\n\t\tif (!SplineMessage.IsEmpty())\n\t\t\tMessage += FString::Printf(TEXT(\"%s\\n\\n\"), *SplineMessage);\n\n\tRecordErrorEvent(ESoAnalyticsErrorType::EAE_Warning, Message);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoAnalytics::RecordDeathTotal(int32 DeathNum)\n{\n\tif (!bCollectGameAnalytics || DeathNum <= 0)\n\t\treturn;\n\n\tstatic const FString EventName(TEXT(\"Deaths:All\"));\n\tRecordDesignEvent(EventName, static_cast<float>(DeathNum));\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoAnalytics::RecordDeathWithSoulKeeperNum(int32 DeathNum)\n{\n\tif (!bCollectGameAnalytics || DeathNum <= 0)\n\t\treturn;\n\n\tstatic const FString EventName(TEXT(\"Deaths:WithSoulKeeper\"));\n\tRecordDesignEvent(EventName, static_cast<float>(DeathNum));\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoAnalytics::RecordDeathWithCheckpointNum(int32 DeathNum)\n{\n\tif (!bCollectGameAnalytics || DeathNum <= 0)\n\t\treturn;\n\n\tstatic const FString EventName(TEXT(\"Deaths:WithCheckpoint\"));\n\tRecordDesignEvent(EventName, static_cast<float>(DeathNum));\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoAnalytics::RecordHPLostTotal(int32 HPNum)\n{\n\tif (!bCollectGameAnalytics || HPNum <= 0)\n\t\treturn;\n\n\tstatic const FString EventName(TEXT(\"HPLost:All\"));\n\tRecordDesignEvent(EventName, static_cast<float>(HPNum));\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoAnalytics::RecordHPLostByDamageType(const TMap<ESoDmgType, int32>& LostHpByDamageTypeTable)\n{\n\tif (!bCollectGameAnalytics || LostHpByDamageTypeTable.Num() == 0)\n\t\treturn;\n\n\tstatic const FString BaseEventName(TEXT(\"HPLost:\"));\n\tInternalRecordHPLostByDamageType(BaseEventName, LostHpByDamageTypeTable);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoAnalytics::RecordPlayTime(float Seconds)\n{\n\tif (!bCollectGameAnalytics || Seconds <= 0.f)\n\t\treturn;\n\n\tstatic const FString EventName(TEXT(\"Gameplay:PlayTime\"));\n\tRecordDesignEvent(EventName, USoDateTimeHelper::SecondsToMinutes(Seconds));\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoAnalytics::RecordSplineEnterNum(const FString& MapName, const FString& SplineName, int32 EnterNum)\n{\n\tif (!bCollectGameAnalytics || MapName.IsEmpty() || SplineName.IsEmpty() || EnterNum <= 0)\n\t\treturn;\n\n\tconst FString EventName = FString::Printf(TEXT(\"Gameplay:%s:%s:EnterNumber\"), *MapName, *SplineName);\n\tRecordDesignEvent(EventName, static_cast<float>(EnterNum));\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoAnalytics::RecordSplineTimeSpent(const FString& MapName, const FString& SplineName, float Seconds)\n{\n\tif (!bCollectGameAnalytics || MapName.IsEmpty() || SplineName.IsEmpty() || Seconds <= 0.f)\n\t\treturn;\n\n\tconst FString EventName = FString::Printf(TEXT(\"Gameplay:%s:%s:TimeSpent\"), *MapName, *SplineName);\n\tRecordDesignEvent(EventName, USoDateTimeHelper::SecondsToMinutes(Seconds));\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoAnalytics::RecordSplineTimeFirstEnter(const FString& MapName, const FString& SplineName, float Seconds)\n{\n\tif (!bCollectGameAnalytics || MapName.IsEmpty() || SplineName.IsEmpty() || Seconds < 0.f)\n\t\treturn;\n\n\tconst FString EventName = FString::Printf(TEXT(\"Gameplay:%s:%s:TimeFirstEnter\"), *MapName, *SplineName);\n\tRecordDesignEvent(EventName, USoDateTimeHelper::SecondsToMinutes(Seconds));\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoAnalytics::RecordSplineDeath(const FString& MapName, const FString& SplineName, const FSoSplineDeathContext& Context)\n{\n\tif (!bCollectGameAnalytics || MapName.IsEmpty() || SplineName.IsEmpty())\n\t\treturn;\n\n\tconst FString BaseEventName = FString::Printf(TEXT(\"Deaths:%s:%s:\"), *MapName, *SplineName);\n\tInternalRecordGameplaySplineDeath(BaseEventName, MapName, SplineName, Context);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoAnalytics::RecordSplineDeaths(const FString& MapName, const FString& SplineName, const TArray<FSoSplineDeathContext>& DeathData)\n{\n\tif (!bCollectGameAnalytics || MapName.IsEmpty() || SplineName.IsEmpty() || DeathData.Num() == 0)\n\t\treturn;\n\n\tconst FString BaseEventName = FString::Printf(TEXT(\"Deaths:%s:%s:\"), *MapName, *SplineName);\n\tfor (const FSoSplineDeathContext& Context : DeathData)\n\t\tInternalRecordGameplaySplineDeath(BaseEventName, MapName, SplineName, Context);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoAnalytics::RecordSplineHPLostTotal(const FString& MapName, const FString& SplineName, int32 HPNum)\n{\n\tif (!bCollectGameAnalytics || HPNum <= 0 || MapName.IsEmpty() || SplineName.IsEmpty())\n\t\treturn;\n\n\tconst FString EventName = FString::Printf(TEXT(\"HPLost:%s:%s:All\"), *MapName, *SplineName);\n\tRecordDesignEvent(EventName, static_cast<float>(HPNum));\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoAnalytics::RecordSplineHPLostByDamageType(const FString& MapName, const FString& SplineName, const TMap<ESoDmgType, int32>& LostHpByDamageTypeTable)\n{\n\tif (!bCollectGameAnalytics || LostHpByDamageTypeTable.Num() == 0 || MapName.IsEmpty() || SplineName.IsEmpty())\n\t\treturn;\n\n\tconst FString BaseEventName = FString::Printf(TEXT(\"HPLost:%s:%s:\"), *MapName, *SplineName);\n\tInternalRecordHPLostByDamageType(BaseEventName, LostHpByDamageTypeTable);\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoAnalytics::InternalRecordGameplaySplineDeath(const FString& BaseEventName, const FString& MapName, const FString& SplineName, const FSoSplineDeathContext& Context)\n{\n\tif (!bCollectGameAnalytics || MapName.IsEmpty() || SplineName.IsEmpty())\n\t\treturn;\n\n\t// Distance along spline\n\t{\n\t\tconst FString EventName = BaseEventName + TEXT(\"Distance\");\n\t\tRecordDesignEvent(EventName, static_cast<float>(Context.Distance));\n\t}\n\n\t// Absolute time of death\n\t{\n\t\tconst FString EventName = BaseEventName + TEXT(\"Time\");\n\t\tRecordDesignEvent(EventName, USoDateTimeHelper::SecondsToMinutes(Context.TimeSeconds));\n\t}\n\n\t// Has soul keeper\n\tif (Context.bSoulKeeperActive)\n\t{\n\t\tconst FString EventName = BaseEventName + TEXT(\"SoulKeeperActive\");\n\t\tRecordDesignEvent(EventName);\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoAnalytics::InternalRecordHPLostByDamageType(const FString& BaseEventName, const TMap<ESoDmgType, int32>& LostHpByDamageTypeTable)\n{\n\tif (!bCollectGameAnalytics || LostHpByDamageTypeTable.Num() == 0)\n\t\treturn;\n\n\tfor (const auto& KeyValue : LostHpByDamageTypeTable)\n\t{\n\t\tconst ESoDmgType DamageType = KeyValue.Key;\n\t\tconst int32 LostHP = KeyValue.Value;\n\t\tif (DamageType >= ESoDmgType::Max || LostHP <= 0)\n\t\t\tcontinue;\n\n\t\t// Send for each damage type\n\t\tconst FString DamageName = USoStringHelper::DamageTypeToFriendlyString(DamageType);\n\t\tconst FString EventName = BaseEventName + DamageName;\n\t\tRecordDesignEvent(EventName, static_cast<float>(LostHP));\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoAnalytics::RecordMilestone(const FString& MapName, const FString& MilestoneName, const float Seconds)\n{\n\tif (!bCollectGameAnalytics || MapName.IsEmpty() || MilestoneName.IsEmpty() || Seconds < 0.f)\n\t\treturn;\n\n\tconst FString EventName = FString::Printf(TEXT(\"Milestones:%s:%s\"), *MapName, *MilestoneName);\n\tRecordDesignEvent(EventName, USoDateTimeHelper::SecondsToMinutes(Seconds));\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoAnalytics::RecordMilestone(const FString& MapName, const FString& MilestoneName)\n{\n\tif (!bCollectGameAnalytics || MapName.IsEmpty() || MilestoneName.IsEmpty())\n\t\treturn;\n\n\tconst FString EventName = FString::Printf(TEXT(\"Milestones:%s:%s\"), *MapName, *MilestoneName);\n\tRecordDesignEvent(EventName);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoAnalytics::RecordItemUsageTime(const FString& ItemName, const FSoPlayerProgressItemUsageStats& Usage)\n{\n\tif (!bCollectGameAnalytics || ItemName.IsEmpty() || !Usage.CanBeSent())\n\t\treturn;\n\n\tconst int32 TimeUsedSeconds = Usage.GetTimeUsedSeconds();\n\tif (TimeUsedSeconds > 0)\n\t{\n\t\tconst FString EventName = FString::Printf(TEXT(\"Items:%s:TimeUsed\"), *ItemName);\n\t\tRecordDesignEvent(EventName, USoDateTimeHelper::SecondsToMinutes(TimeUsedSeconds));\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoAnalytics::RecordItemUsageTimes(const FString& ItemName, const TArray<FSoPlayerProgressItemUsageStats>& Usages)\n{\n\tif (!bCollectGameAnalytics || ItemName.IsEmpty() || Usages.Num() == 0)\n\t\treturn;\n\n\tfor (const FSoPlayerProgressItemUsageStats& Usage : Usages)\n\t\tRecordItemUsageTime(ItemName, Usage);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoAnalytics::RecordSpellCasted(const FString& SpellName, int32 CastAmount)\n{\n\tif (!bCollectGameAnalytics || SpellName.IsEmpty() || CastAmount <= 0)\n\t\treturn;\n\n\tconst FString EventName = FString::Printf(TEXT(\"Spells:%s:CastCount\"), *SpellName);\n\tRecordDesignEvent(EventName, static_cast<float>(CastAmount));\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoAnalytics::RecordUIEpisodeStart()\n{\n\tif (!bCollectGameAnalytics)\n\t\treturn;\n\n\tstatic const FString EventName(TEXT(\"UI:Episode:Start\"));\n\tRecordDesignEvent(EventName);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoAnalytics::RecordUISaveLoad()\n{\n\tif (!bCollectGameAnalytics)\n\t\treturn;\n\n\tstatic const FString EventName(TEXT(\"UI:Save:Load\"));\n\tRecordDesignEvent(EventName);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoAnalytics::RecordUISaveRemove()\n{\n\tif (!bCollectGameAnalytics)\n\t\treturn;\n\n\tstatic const FString EventName(TEXT(\"UI:Save:Remove\"));\n\tRecordDesignEvent(EventName);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoAnalytics::RecordUISaveStartNewGame()\n{\n\tif (!bCollectGameAnalytics)\n\t\treturn;\n\n\tstatic const FString EventName(TEXT(\"UI:Save:StartNewGame\"));\n\tRecordDesignEvent(EventName);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoAnalytics::RecordEpisodeCompleted(const FString& EpisodeName, float Seconds)\n{\n\tif (!bCollectGameAnalytics || EpisodeName.IsEmpty() || Seconds < 1.f || !USoLevelHelper::IsValidEpisodeName(FName(*EpisodeName)))\n\t\treturn;\n\n\tconst FString EventName = FString::Printf(TEXT(\"Episode:%s:Progress:Completed\"), *EpisodeName);\n\tRecordDesignEvent(EventName, USoDateTimeHelper::SecondsToMinutes(Seconds));\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoAnalytics::RecordErrorEvent(ESoAnalyticsErrorType ErrorType, const FString& Message)\n{\n\tif (!bCollectGameAnalytics)\n\t\treturn;\n\n\tconst FString Error = GetStringFromAnalyticsErrorType(ErrorType);\n\n#if WARRIORB_WITH_ANALYTICS\n\tconst TArray<FAnalyticsEventAttribute> Attributes = {\n\t\t{ ATTRIBUTE_Message, Message }\n\t};\n\n\tFSoAnalyticsProvider::RecordErrorWithAttributes(Error, Attributes);\n#endif // WARRIORB_WITH_ANALYTICS\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoAnalytics::UpdateMapProgress(ESoAnalyticsProgressType ProgressType, const FString& MapName, float TimeSeconds)\n{\n\tif (!bCollectGameAnalytics)\n\t\treturn;\n\n\tconst TArray<FString> ProgressHierarchy = { MapName };\n\tUpdateProgress(ProgressType, ProgressHierarchy, TimeSeconds);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoAnalytics::UpdateLevelProgress(ESoAnalyticsProgressType ProgressType, const FString& MapName, const FString& LevelName, float TimeSeconds)\n{\n\tif (!bCollectGameAnalytics)\n\t\treturn;\n\n\tconst TArray<FString> ProgressHierarchy = { MapName, LevelName };\n\tUpdateProgress(ProgressType, ProgressHierarchy, TimeSeconds);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoAnalytics::UpdateSplineProgress(ESoAnalyticsProgressType ProgressType, const FString& MapName, const FString& LevelName, const FString& SplineName, float TimeSeconds)\n{\n\tif (!bCollectGameAnalytics)\n\t\treturn;\n\n\tconst TArray<FString> ProgressHierarchy = { MapName, LevelName, SplineName };\n\tUpdateProgress(ProgressType, ProgressHierarchy, TimeSeconds);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoAnalytics::UpdateProgress(ESoAnalyticsProgressType ProgressType, const TArray<FString>& ProgressHierarchy, float TimeSeconds)\n{\n\tif (!bCollectGameAnalytics)\n\t\treturn;\n\n#if WARRIORB_WITH_ANALYTICS\n\tcheck(ProgressHierarchy.Num() > 0);\n\tconst FString ProgressString = GetStringFromAnalyticsProgressType(ProgressType);\n\tconst FString TimeString = FString::SanitizeFloat(USoDateTimeHelper::SecondsToMinutes(TimeSeconds));\n\tconst TArray<FAnalyticsEventAttribute> Attributes = {\n\t\t{ ATTRIBUTE_Value, TimeString }\n\t};\n\n\tFSoAnalyticsProvider::RecordProgressWithFullHierarchyAndAttributes(ProgressString, ProgressHierarchy, Attributes);\n#endif // WARRIORB_WITH_ANALYTICS\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoAnalytics::AddResourceCurrency(const FSoResourceCurrency& ResourceCurrency)\n{\n\tif (!bCollectGameAnalytics)\n\t\treturn;\n\n\t// Add, source of money\n\tModifyResourceCurrency(ATTRIBUTE_FlowSource, ResourceCurrency);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoAnalytics::SubtractResourceCurrency(const FSoResourceCurrency& ResourceCurrency)\n{\n\tif (!bCollectGameAnalytics)\n\t\treturn;\n\n\t// Subtract, sink of money\n\tModifyResourceCurrency(ATTRIBUTE_FlowSink, ResourceCurrency);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoAnalytics::ModifyResourceCurrency(const FString& FlowType, const FSoResourceCurrency& ResourceCurrency)\n{\n\tif (!bCollectGameAnalytics)\n\t\treturn;\n\n\t// Ignore 0 change\n\tif (ResourceCurrency.CurrencyQuantity == 0)\n\t\treturn;\n\n#if WARRIORB_WITH_ANALYTICS\n\tconst TArray<FAnalyticsEventAttribute> Attributes = {\n\t\t{ ATTRIBUTE_FlowType, FlowType },\n\t\t{ ATTRIBUTE_ItemType, GetStringFromResourceItemType(ResourceCurrency.ItemType) },\n\t\t{ ATTRIBUTE_Currency, GetStringFromResourceCurrencyType(ResourceCurrency.CurrencyType) }\n\t};\n\n\t// itemQuantity is actually CurrencyQuantity\n\tFSoAnalyticsProvider::RecordItemPurchaseWithAttributes(ResourceCurrency.ItemID, FMath::Abs(ResourceCurrency.CurrencyQuantity), Attributes);\n#endif // WARRIORB_WITH_ANALYTICS\n}\n"
  },
  {
    "path": "Source/SOrb/Online/Analytics/SoAnalytics.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#pragma once\n\n#include \"CoreMinimal.h\"\n#include \"UObject/Object.h\"\n#include \"CharacterBase/SoIMortalTypes.h\"\n\n#include \"SoAnalytics.generated.h\"\n\n\nDECLARE_LOG_CATEGORY_EXTERN(LogSoAnalytics, All, All);\n\nstruct FSoPlayerProgressItemUsageStats;\nstruct FSoSplineDeathContext;\nstruct FSoSplineStats;\nstruct FSoPlayerProgressStats;\nstruct FSoSplineCriticalFPSAreas;\n\n////////////////////////////////////////////////////////////////////////////////////////\n// NOTE this must be kept in sync with the GameAnalytics settings\nUENUM(BlueprintType)\nenum class ESoResourceCurrencyType : uint8\n{\n\tERC_Gold = 0\t\tUMETA(DisplayName = \"Gold\")\n};\n\n////////////////////////////////////////////////////////////////////////////////////////\n// NOTE this must be kept in sync with the GameAnalytics settings\nUENUM(BlueprintType)\nenum class ESoResourceItemType : uint8\n{\n\tERI_BuyTrader = 0\t\tUMETA(DisplayName = \"Buy from Trader\"),\n\tERI_SellTrader \t\t\tUMETA(DisplayName = \"Sell Trader\"),\n\tERI_MonsterChest \t\tUMETA(DisplayName = \"Monster Chest\"),\n\tERI_Quest \t\t\t\tUMETA(DisplayName = \"Quest\"),\n};\n\n\n////////////////////////////////////////////////////////////////////////////////////////\n// Our own version of EGAErrorSeverity\nUENUM()\nenum class ESoAnalyticsErrorType : uint8\n{\n\tEAE_Undefined = 0,\n\tEAE_Debug,\n\tEAE_Info,\n\tEAE_Warning,\n\tEAE_Error,\n\tEAE_Critical,\n};\n\n////////////////////////////////////////////////////////////////////////////////////////\n// Our own version of EGAProgressionStatus\nUENUM()\nenum class ESoAnalyticsProgressType : uint8\n{\n\tEAP_Undefined = 0,\n\tEAE_Start,\n\tEAE_Complete,\n\tEAE_Fail,\n};\n\n////////////////////////////////////////////////////////////////////////////////////////\n// Defines all the info we need to record a currency\nUSTRUCT(BlueprintType)\nstruct FSoResourceCurrency\n{\n\tGENERATED_USTRUCT_BODY()\n\npublic:\n\tFSoResourceCurrency() {}\n\tFSoResourceCurrency(const ESoResourceCurrencyType InCurrencyType, const int32 InCurrencyQuantity, const ESoResourceItemType InItemType, const FString& InItemID)\n\t\t: CurrencyType(InCurrencyType), CurrencyQuantity(InCurrencyQuantity), ItemType(InItemType), ItemID(InItemID) {}\n\npublic:\n\tUPROPERTY(VisibleAnywhere, BlueprintReadOnly)\n\tESoResourceCurrencyType CurrencyType = ESoResourceCurrencyType::ERC_Gold;\n\n\tUPROPERTY(VisibleAnywhere, BlueprintReadOnly)\n\tint32 CurrencyQuantity = 0;\n\n\tUPROPERTY(VisibleAnywhere, BlueprintReadOnly)\n\tESoResourceItemType ItemType = ESoResourceItemType::ERI_BuyTrader;\n\n\tUPROPERTY(VisibleAnywhere, BlueprintReadOnly)\n\tFString ItemID;\n};\n\n/**\n * Handles the collection of events for Warriorb with the consent of the user.\n * Handles correct translation + conversion of seconds to the appropriate time stamp\n * Note you should only record events and stuff from the current session.\n */\nUCLASS()\nclass SORB_API USoAnalytics : public UObject\n{\n\tGENERATED_BODY()\npublic:\n\t// Start/End session\n\tvoid StartSession(bool bInCollectGameAnalytics, bool bInWaitForAnalyticsToSend, double PollWaitSeconds, double PollProcessEventsSeconds);\n\tvoid ModifyCanCollectStatus(bool bInCollectGameAnalytics, bool bInWaitForAnalyticsToSend, double PollWaitSeconds, double PollProcessEventsSeconds);\n\tvoid EndSession();\n\tvoid FlushEventsAndWait(bool bForceWait = false);\n\n\t// Design events (everything else)\n\t// See:\n\t// 1. https://gameanalytics.com/docs/unreal4-sdk#design-event\n\t// 2. https://gameanalytics.com/docs/cpp-sdk#design\n\t// 3. https://gameanalytics.com/docs/ga-data#design-event\n\t// 4. https://gameanalytics.com/docs/implementing-your-tracking#design\n\t// 5. https://gameanalytics.com/docs/custom-events\n\t//\n\tvoid RecordDesignEvent(const FString& EventId);\n\tvoid RecordDesignEvent(const FString& EventId, float Value);\n\n\t// Performance\n\tvoid RecordPerformanceAverageFPS(int32 FPS);\n\tvoid RecordPerformanceSplineAverageFPS(const FString& MapName, const FString& SplineName, int32 FPS);\n\n\t// Critical FPS areas, is actually a warning error report\n\tbool BuildMessageForCriticalFPSAreas(const FString& MapName, const FString& SplineName, const FSoSplineCriticalFPSAreas& Areas,\n\t\tfloat AccumulateThreshold, FString& OutMessage);\n\tvoid RecordPerformanceSplineCriticalFPSAreas(const TArray<FString>& SplineMessages);\n\n\t// Death happened\n\tvoid RecordDeathTotal(int32 DeathNum);\n\tvoid RecordDeathWithSoulKeeperNum(int32 DeathNum);\n\tvoid RecordDeathWithCheckpointNum(int32 DeathNum);\n\n\t// HP lost\n\tvoid RecordHPLostTotal(int32 HPNum);\n\tvoid RecordHPLostByDamageType(const TMap<ESoDmgType, int32>& LostHpByDamageTypeTable);\n\n\t// Total play time\n\tvoid RecordPlayTime(float Seconds);\n\n\t// Spline stuff happened\n\tvoid RecordSplineEnterNum(const FString& MapName, const FString& SplineName, int32 EnterNum);\n\tvoid RecordSplineTimeSpent(const FString& MapName, const FString& SplineName, float Seconds);\n\tvoid RecordSplineTimeFirstEnter(const FString& MapName, const FString& SplineName, float Seconds);\n\n\t// Spline deaths\n\tvoid RecordSplineDeath(const FString& MapName, const FString& SplineName, const FSoSplineDeathContext& Context);\n\tvoid RecordSplineDeaths(const FString& MapName, const FString& SplineName, const TArray<FSoSplineDeathContext>& DeathData);\n\n\t// Spline HP lost\n\tvoid RecordSplineHPLostTotal(const FString& MapName, const FString& SplineName, int32 HPNum);\n\tvoid RecordSplineHPLostByDamageType(const FString& MapName, const FString& SplineName, const TMap<ESoDmgType, int32> & LostHpByDamageTypeTable);\n\n\t// Gameplay milestone\n\t// Eg: Tutorial 2 finished, Defeated boss, etc\n\tvoid RecordMilestone(const FString& MapName, const FString& MilestoneName, const float Seconds);\n\tvoid RecordMilestone(const FString& MapName, const FString& MilestoneName);\n\n\t// Record Item usage time\n\tvoid RecordItemUsageTime(const FString& ItemName, const FSoPlayerProgressItemUsageStats& Usage);\n\tvoid RecordItemUsageTimes(const FString& ItemName, const TArray<FSoPlayerProgressItemUsageStats>& Usages);\n\n\t// Record Spells stats\n\tvoid RecordSpellCasted(const FString& SpellName, int32 CastAmount);\n\n\t// Records UI events\n\tvoid RecordUIEpisodeStart();\n\tvoid RecordUISaveLoad();\n\tvoid RecordUISaveRemove();\n\tvoid RecordUISaveStartNewGame();\n\n\t// Episode\n\tvoid RecordEpisodeCompleted(const FString& EpisodeName, float Seconds);\n\n\t// Record an error.\n\t// See:\n\t// 1. https://gameanalytics.com/docs/unreal4-sdk#error-event\n\t// 2. https://gameanalytics.com/docs/cpp-sdk#error\n\t// 3. https://gameanalytics.com/docs/ga-data#error-event\n\t// 4. https://gameanalytics.com/docs/implementing-your-tracking#error\n\t//\n\tvoid RecordErrorEvent(ESoAnalyticsErrorType ErrorType, const FString& Message);\n\n\t// Update the level progress of the game\n\t// Can have the follow hierarchies (only up to 3 hierarchies).\n\t// 1. Chapter: Chapter, time\n\t//\n\t// NOT Useful:\n\t// 2. Level:   Chapter, Level, time\n\t// 3. Spline:  Chapter, Level, Spline, time\n\t//\n\t// See:\n\t// 1. https://gameanalytics.com/docs/unreal4-sdk#progression-event\n\t// 2. https://gameanalytics.com/docs/cpp-sdk#progression\n\t// 3. https://gameanalytics.com/docs/ga-data#progression-event\n\t// 4. https://gameanalytics.com/docs/implementing-your-tracking#progression\n\t//\n\tvoid UpdateMapProgress(ESoAnalyticsProgressType ProgressType, const FString& MapName, float TimeSeconds);\n\tvoid UpdateLevelProgress(ESoAnalyticsProgressType ProgressType, const FString& MapName, const FString& LevelName, float TimeSeconds);\n\tvoid UpdateSplineProgress(ESoAnalyticsProgressType ProgressType, const FString& MapName, const FString& LevelName, const FString& SplineName, float TimeSeconds);\n\n\t// Add/Reduce gold\n\tFORCEINLINE void AddGold(int32 GoldAmount, ESoResourceItemType ItemType, const FString& ItemID)\n\t{\n\t\tAddResourceCurrency(ESoResourceCurrencyType::ERC_Gold, GoldAmount, ItemType, ItemID);\n\t}\n\n\tFORCEINLINE void SubtractGold(int32 GoldAmount, ESoResourceItemType ItemType, const FString& ItemID)\n\t{\n\t\tSubtractResourceCurrency(ESoResourceCurrencyType::ERC_Gold, GoldAmount, ItemType, ItemID);\n\t}\n\n\t// Enum to string conversion\n\t// NOTE this must be kept in sync with the GameAnalytics settings\n\tFORCEINLINE static FString GetStringFromResourceCurrencyType(ESoResourceCurrencyType Currency)\n\t{\n\t\tswitch (Currency)\n\t\t{\n\t\tcase ESoResourceCurrencyType::ERC_Gold:\n\t\t\treturn TEXT(\"Gold\");\n\t\tdefault:\n\t\t\treturn TEXT(\"UNKNOWN\");\n\t\t}\n\t}\n\tFORCEINLINE static FString GetStringFromResourceItemType(ESoResourceItemType ItemType)\n\t{\n\t\tswitch (ItemType)\n\t\t{\n\t\tcase ESoResourceItemType::ERI_BuyTrader:\n\t\t\treturn TEXT(\"BuyTrader\");\n\t\tcase ESoResourceItemType::ERI_SellTrader:\n\t\t\treturn TEXT(\"SellTrader\");\n\t\tcase ESoResourceItemType::ERI_MonsterChest:\n\t\t\treturn TEXT(\"MonsterChest\");\n\t\tcase ESoResourceItemType::ERI_Quest:\n\t\t\treturn TEXT(\"Quest\");\n\t\tdefault:\n\t\t\treturn TEXT(\"UNKNOWN\");\n\t\t}\n\t}\n\tFORCEINLINE static FString GetStringFromAnalyticsErrorType(ESoAnalyticsErrorType ErrorType)\n\t{\n\t\tswitch (ErrorType)\n\t\t{\n\t\tcase ESoAnalyticsErrorType::EAE_Undefined:\n\t\t\treturn TEXT(\"undefined\");\n\t\tcase ESoAnalyticsErrorType::EAE_Debug :\n\t\t\treturn TEXT(\"debug\");\n\t\tcase ESoAnalyticsErrorType::EAE_Info:\n\t\t\treturn TEXT(\"info\");\n\t\tcase ESoAnalyticsErrorType::EAE_Warning:\n\t\t\treturn TEXT(\"warning\");\n\t\tcase ESoAnalyticsErrorType::EAE_Error:\n\t\t\treturn TEXT(\"error\");\n\t\tcase ESoAnalyticsErrorType::EAE_Critical:\n\t\t\treturn TEXT(\"critical\");\n\t\tdefault:\n\t\t\treturn TEXT(\"UNKNOWN\");\n\t\t}\n\t}\n\tFORCEINLINE static FString GetStringFromAnalyticsProgressType(ESoAnalyticsProgressType ProgressType)\n\t{\n\t\tswitch (ProgressType)\n\t\t{\n\t\tcase ESoAnalyticsProgressType::EAP_Undefined:\n\t\t\treturn TEXT(\"undefined\");\n\t\tcase ESoAnalyticsProgressType::EAE_Start:\n\t\t\treturn TEXT(\"start\");\n\t\tcase ESoAnalyticsProgressType::EAE_Complete:\n\t\t\treturn TEXT(\"complete\");\n\t\tcase ESoAnalyticsProgressType::EAE_Fail:\n\t\t\treturn TEXT(\"fail\");\n\t\tdefault:\n\t\t\treturn TEXT(\"UNKNOWN\");\n\t\t}\n\t}\n\nprotected:\n\t// Add/subtract generic currency with item type and id.\n\t// See:\n\t// 1. https://gameanalytics.com/docs/unreal4-sdk#resource-event\n\t// 2. https://gameanalytics.com/docs/cpp-sdk#resource\n\t// 3. https://gameanalytics.com/docs/ga-data#resource-event\n\t// 4. https://gameanalytics.com/docs/implementing-your-tracking#resource\n\t//\n\tvoid AddResourceCurrency(const FSoResourceCurrency& ResourceCurrency);\n\tvoid SubtractResourceCurrency(const FSoResourceCurrency& ResourceCurrency);\n\n\t// Helper methods\n\tFORCEINLINE void AddResourceCurrency(ESoResourceCurrencyType Currency, int32 InCurrencyQuantity, ESoResourceItemType ItemType, const FString& ItemID)\n\t{\n\t\tAddResourceCurrency({ Currency, InCurrencyQuantity, ItemType, ItemID });\n\t}\n\tFORCEINLINE void SubtractResourceCurrency(ESoResourceCurrencyType Currency, int32 InCurrencyQuantity, ESoResourceItemType ItemType, const FString& ItemID)\n\t{\n\t\tSubtractResourceCurrency({ Currency, InCurrencyQuantity, ItemType, ItemID });\n\t}\n\n\t// Internal version\n\tvoid InternalRecordHPLostByDamageType(const FString& BaseEventName, const TMap<ESoDmgType, int32>& LostHpByDamageTypeTable);\n\tvoid InternalRecordGameplaySplineDeath(const FString& BaseEventName, const FString& MapName, const FString& SplineName, const FSoSplineDeathContext& Context);\n\n\t// Internal version of Add/Subtract currency\n\tvoid ModifyResourceCurrency(const FString& FlowType, const FSoResourceCurrency& ResourceCurrency);\n\n\t// Internal version of Update<>Progress\n\tvoid UpdateProgress(ESoAnalyticsProgressType ProgressType, const TArray<FString>& ProgressHierarchy, float TimeSeconds);\n\npublic:\n\t// Constants from https://gameanalytics.com/docs/unreal4-sdk\n\tstatic const FString ATTRIBUTE_FlowType;\n\tstatic const FString ATTRIBUTE_FlowSink;\n\tstatic const FString ATTRIBUTE_FlowSource;\n\tstatic const FString ATTRIBUTE_ItemType;\n\tstatic const FString ATTRIBUTE_Currency;\n\tstatic const FString ATTRIBUTE_Message;\n\tstatic const FString ATTRIBUTE_Value;\n\nprotected:\n\t// Can collect data\n\tUPROPERTY(VisibleAnywhere)\n\tbool bCollectGameAnalytics = false;\n\n\tUPROPERTY(VisibleAnywhere)\n\tbool bWaitForAnalyticsToSend = false;\n};\n"
  },
  {
    "path": "Source/SOrb/Online/Analytics/SoAnalyticsComponent.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#include \"SoAnalyticsComponent.h\"\n\n#include \"EngineUtils.h\"\n#include \"Misc/FileHelper.h\"\n\n#include \"SplineLogic/SoPlayerSpline.h\"\n#include \"Character/SoCharacter.h\"\n#include \"Settings/SoGameSettings.h\"\n#include \"SoAnalytics.h\"\n#include \"Basic/SoGameInstance.h\"\n#include \"Basic/Helpers/SoDateTimeHelper.h\"\n#include \"Character/SoPlayerProgress.h\"\n#include \"Levels/SoLevelHelper.h\"\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// Sets default values for this component's properties\nUSoAnalyticsComponent::USoAnalyticsComponent()\n{\n\t// Set this component to be initialized when the game starts, and to be ticked every frame.  You can turn these features\n\t// off to improve performance if you don't need them.\n\tPrimaryComponentTick.bCanEverTick = true;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoAnalyticsComponent::BeginPlay()\n{\n\tSuper::BeginPlay();\n\tSoOwner = CastChecked<ASoCharacter>(GetOwner());\n\n\tCurrentTimeSeconds = 0.f;\n\tWaitTimeSecondsPerformance = 0.f;\n\tWaitTimeSecondsCriticalPerformance = 0.f;\n\tWaitTimeSecondsGameplay = 0.f;\n\tLastTimeSecondsUpdateAverage = 0.f;\n\tbCollectGameAnalytics = false;\n\tAnalytics = nullptr;\n\n\t// Analytics\n\tSetCanCollectAnalytics(USoGameSettings::Get().CanCollectGameAnalytics());\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoAnalyticsComponent::EndPlay(const EEndPlayReason::Type EndPlayReason)\n{\n\tSetCanCollectAnalytics(false);\n\tSuper::EndPlay(EndPlayReason);\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoAnalyticsComponent::TickComponent(float DeltaTime, ELevelTick TickType, FActorComponentTickFunction* ThisTickFunction)\n{\n\tif (!bCollectGameAnalytics)\n\t\treturn;\n\n\tSuper::TickComponent(DeltaTime, TickType, ThisTickFunction);\n\n\tconst float UndilatedDeltaSeconds = USoDateTimeHelper::GetDeltaSeconds();\n\tFrameTickForAverageNum++;\n\tCurrentTimeSeconds += UndilatedDeltaSeconds;\n\tWaitTimeSecondsPerformance += UndilatedDeltaSeconds;\n\tWaitTimeSecondsCriticalPerformance += UndilatedDeltaSeconds;\n\tWaitTimeSecondsGameplay += UndilatedDeltaSeconds;\n\n\t// TODO Handle sending the rest of the events when the Map ends, because of the interval this might not happen immediately\n\n\t// Can do update\n\tif (WaitTimeSecondsPerformance > IntervalSecondsPerformance)\n\t{\n\t\tIntervalPerformanceFinished();\n\t\tWaitTimeSecondsPerformance = 0.f;\n\t}\n\tif (WaitTimeSecondsCriticalPerformance > IntervalSecondsCriticalPerformance)\n\t{\n\t\tIntervalCriticalPerformanceFinished();\n\t\tWaitTimeSecondsCriticalPerformance = 0.f;\n\t}\n\tif (WaitTimeSecondsGameplay > IntervalSecondsGameplay)\n\t{\n\t\tIntervalGameplayFinished();\n\t\tWaitTimeSecondsGameplay = 0.f;\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoAnalyticsComponent::SetCanCollectAnalytics(bool bInCollect)\n{\n\tif (!SoOwner || bCollectGameAnalytics == bInCollect)\n\t\treturn;\n\n\tauto SetCollectDisabled = [this]()\n\t{\n\t\t// Flush\n\t\tFireAllRecordIntervals();\n\t\tif (SoOwner && SoOwner->GetPlayerProgress())\n\t\t{\n\t\t\tSoOwner->OnPlayerSplineChanged.RemoveDynamic(this, &Self::OnPlayerSplineChanged);\n\t\t\tSoOwner->GetPlayerProgress()->OnPreLoad().RemoveAll(this);\n\t\t\tSoOwner->GetPlayerProgress()->OnPreSave().RemoveAll(this);\n\t\t}\n\t\tbCollectGameAnalytics = false;\n\t};\n\n\t// Kill previous\n\tif (bCollectGameAnalytics && !bInCollect)\n\t{\n\t\tSetCollectDisabled();\n\t\tSetComponentTickEnabled(false);\n\t\treturn;\n\t}\n\n\t// Normal set, first time?\n\tbCollectGameAnalytics = bInCollect;\n\tif (bCollectGameAnalytics)\n\t{\n\t\t// NOTE: Disable anlytics here for episodes if we want that?\n\t\tAnalytics = USoGameInstance::Get(this).GetAnalytics();\n\t\tif (SoOwner && SoOwner->GetPlayerProgress())\n\t\t{\n\t\t\tSoOwner->OnPlayerSplineChanged.AddDynamic(this, &Self::OnPlayerSplineChanged);\n\t\t\tSoOwner->GetPlayerProgress()->OnPreLoad().AddUObject(this, &Self::OnPreLoadPlayerProgress);\n\t\t\tSoOwner->GetPlayerProgress()->OnPreSave().AddUObject(this, &Self::OnPreSavePlayerProgress);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tUE_LOG(LogSoAnalytics, Error, TEXT(\"Disabling analytics because we can't get the SoOWner\"));\n\t\t\tbCollectGameAnalytics = false;\n\t\t}\n\t}\n\telse\n\t{\n\t\t// Disabled\n\t\tSetCollectDisabled();\n\t}\n\n\t// Tick only when we can\n\tSetComponentTickEnabled(bCollectGameAnalytics);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoAnalyticsComponent::RecordGameplayMilestone(FName MilestoneName, bool bAttachPlayTime)\n{\n\tif (!SoOwner || !SoOwner->GetPlayerProgress())\n\t\treturn;\n\n\t// Map is current one from this world\n\t// TODO maybe edge cases when milestone is changing map?\n\tconst FName MapFName = USoLevelHelper::GetMapNameFromObject(this);\n\tconst FString MapName = MapFName.ToString();\n\n\t// Already exists, nothing to record\n\tFSoPlayerProgressStats& AllSessions = SoOwner->GetPlayerProgress()->GetStatsFromAllSession();\n\tif (AllSessions.HasMapMilestone(MapFName, MilestoneName))\n\t{\n\t\tUE_LOG(LogSoAnalytics,\n\t\t\t   Warning,\n\t\t\t   TEXT(\"RecordGameplayMilestone: MilestoneName = `%s` already recorded. Wrong MilestoneName in game maybe? Anyways, ignoring\"),\n\t\t\t   *MilestoneName.ToString());\n\t\treturn;\n\t}\n\n\t// Record new milestone\n\tif (bAttachPlayTime)\n\t\tAllSessions.AddMapMilestone(MapFName, MilestoneName, AllSessions.TotalPlayTimeSeconds);\n\telse\n\t\tAllSessions.AddMapMilestone(MapFName, MilestoneName);\n\n\t// Send analytics if enabled\n\tif (bCollectGameAnalytics && Analytics)\n\t{\n\t\tconst FString MilestoneNameStr = MilestoneName.ToString();\n\t\tif (bAttachPlayTime)\n\t\t\tAnalytics->RecordMilestone(MapName, MilestoneNameStr, AllSessions.TotalPlayTimeSeconds);\n\t\telse\n\t\t\tAnalytics->RecordMilestone(MapName, MilestoneNameStr);\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoAnalyticsComponent::OnPreLoadPlayerProgress()\n{\n\t// Fire everything we can as the sessions will get cleared\n\tFireAllRecordIntervals();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoAnalyticsComponent::OnPreSavePlayerProgress()\n{\n\t// Mostly useful for performance\n\tFireAllRecordIntervals();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoAnalyticsComponent::OnPlayerSplineChanged(const ASoSpline* OldSpline, const ASoSpline* NewSpline)\n{\n\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoAnalyticsComponent::IntervalPerformanceFinished(bool bFlushAll)\n{\n\tif (!bCollectGameAnalytics || !Analytics || !SoOwner || !SoOwner->GetPlayerProgress())\n\t\treturn;\n\n\tconst float TimeSinceAverageUpdate = CurrentTimeSeconds - LastTimeSecondsUpdateAverage;\n\tif (TimeSinceAverageUpdate < 1.0f)\n\t\treturn;\n\n\t// FMath::RoundToInt(FrameTickForAverageNum / IntervalSecondsPerformance);\n\tFSoPlayerProgressStats& AllSessions = SoOwner->GetPlayerProgress()->GetStatsFromAllSession();\n\tconst int32 AverageFPSSinceUpdate = FMath::RoundToInt(FrameTickForAverageNum / TimeSinceAverageUpdate);\n\n\t// Reset for next interval\n\tFrameTickForAverageNum = 0;\n\tLastTimeSecondsUpdateAverage = CurrentTimeSeconds;\n\n\t// Record performance for each spline\n\tfor (TActorIterator<ASoPlayerSpline> ActorItr(GetWorld()); ActorItr; ++ActorItr)\n\t{\n\t\tASoPlayerSpline* PlayerSpline = *ActorItr;\n\n\t\t// On flush, simply flush all :shrug:\n\t\tconst bool bHasAveragePerformanceStats = (bFlushAll && PlayerSpline->HasAveragePerformanceStats()) ||\n\t\t\t\t\t\t\t\t\t\t\t\tPlayerSpline->HasAveragePerformanceStats(SplineAccumulatePerformanceThresholdSeconds);\n\t\tif (!bHasAveragePerformanceStats)\n\t\t\tcontinue;\n\n\t\tconst FName MapFName = GetSafeMapNameFromSpline(PlayerSpline);\n\t\tconst FString MapName = MapFName.ToString();\n\t\tconst FName SplineFName = PlayerSpline->GetSplineFName();\n\t\tconst FString SplineName = SplineFName.ToString();\n\n\t\t// Average FPS\n\t\tconst int32 AverageFPSSpline = FMath::RoundToInt(PlayerSpline->GetAverageFPS());\n\t\tAllSessions.UpdateMapSplineAverageFPS(MapFName, SplineFName, AverageFPSSpline);\n\t\tAnalytics->RecordPerformanceSplineAverageFPS(MapName, SplineName, AverageFPSSpline);\n\n\t\t// Reset for next interval\n\t\tPlayerSpline->ResetAveragePerformanceStats();\n\t}\n\n\tAllSessions.UpdateTotalAverageFPS(AverageFPSSinceUpdate);\n\tAnalytics->RecordPerformanceAverageFPS(AverageFPSSinceUpdate);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoAnalyticsComponent::IntervalCriticalPerformanceFinished(bool bFlushAll)\n{\n\tif (!bCollectGameAnalytics || !Analytics || !SoOwner || !SoOwner->GetPlayerProgress())\n\t\treturn;\n\n\tFSoPlayerProgressStats& AllSessions = SoOwner->GetPlayerProgress()->GetStatsFromAllSession();\n\n\t// Record performance for each spline\n\tTArray<FString> SplineMessages;\n\tfor (TActorIterator<ASoPlayerSpline> ActorItr(GetWorld()); ActorItr; ++ActorItr)\n\t{\n\t\tASoPlayerSpline* PlayerSpline = *ActorItr;\n\t\tif (!PlayerSpline->HasCriticalPerformanceStats())\n\t\t\tcontinue;\n\n\t\tconst FName MapFName = GetSafeMapNameFromSpline(PlayerSpline);\n\t\tconst FString MapName = MapFName.ToString();\n\t\tconst FName SplineFName = PlayerSpline->GetSplineFName();\n\t\tconst FString SplineName = SplineFName.ToString();\n\n\t\t// Critical FPS\n\t\tconst FSoSplineCriticalFPSAreas& FPSAreas = PlayerSpline->GetCriticalFPSAreas();\n\t\tAllSessions.UpdateMapSplineCriticalFPSAreas(MapFName, SplineFName, FPSAreas);\n\n\t\t// Mark for sending\n\t\tif (AllSessions.CanMapSplineCriticalFPSAreasBeSent(MapFName, SplineFName))\n\t\t{\n\t\t\t// Group them\n\t\t\tFString Message;\n\t\t\tif (Analytics->BuildMessageForCriticalFPSAreas(MapName, SplineName, FPSAreas, SplineAccumulatePerformanceThresholdSeconds, Message))\n\t\t\t{\n\t\t\t\tSplineMessages.Add(Message);\n\t\t\t\tAllSessions.IncrementMapSplineCriticalFPSAreasSentRecordsNum(MapFName, SplineFName);\n\t\t\t}\n\t\t}\n\n\t\t// Reset for next interval\n\t\tPlayerSpline->ResetCriticalPerformanceStats();\n\t\tPlayerSpline->ResetCriticalFPSAreas();\n\t}\n\n\t// Send them all\n\tAnalytics->RecordPerformanceSplineCriticalFPSAreas(SplineMessages);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoAnalyticsComponent::IntervalGameplayFinished(bool bFlushAll)\n{\n\tif (!bCollectGameAnalytics || !Analytics || !SoOwner)\n\t\treturn;\n\n\tUSoPlayerProgress* PlayerProgress = SoOwner->GetPlayerProgress();\n\tif (!PlayerProgress)\n\t\treturn;\n\n\t// Record the temp analytics\n\tFSoPlayerProgressStats& TempAnalyticsStats = PlayerProgress->GetTempAnalyticsStats();\n\n\t// Useful from current session\n\tAnalytics->RecordDeathTotal(TempAnalyticsStats.TotalDeathNum);\n\tAnalytics->RecordDeathWithSoulKeeperNum(TempAnalyticsStats.TotalDeathWithSoulKeeperNum);\n\tAnalytics->RecordDeathWithCheckpointNum(TempAnalyticsStats.TotalDeathWithCheckpointNum);\n\tAnalytics->RecordHPLostTotal(TempAnalyticsStats.TotalLostHp);\n\tAnalytics->RecordHPLostByDamageType(TempAnalyticsStats.TotalLostHpByDamageTypeTable);\n\tAnalytics->RecordPlayTime(TempAnalyticsStats.TotalPlayTimeSeconds);\n\n\t// Reset for next interval\n\tTempAnalyticsStats.ResetGameplayTotalVariables();\n\n\t// For each Map\n\tfor (auto& KeyValue : TempAnalyticsStats.MapsProgressTable)\n\t{\n\t\tconst FName MapFName = KeyValue.Key;\n\n\t\t// Record or each Spline in Map\n\t\tfor (auto& ElemSpline : KeyValue.Value.Splines)\n\t\t{\n\t\t\tconst FName SplineFName = ElemSpline.Key;\n\t\t\tFSoPlayerProgressSplineStats& SplineStats = ElemSpline.Value;\n\t\t\tif (bFlushAll || SplineStats.HasStatsForAtLeast(SplineAccumulateGamePlayThresholdSeconds))\n\t\t\t{\n\t\t\t\tconst FString SplineName = SplineFName.ToString();\n\t\t\t\tconst FString MapName = MapFName.ToString();\n\t\t\t\tAnalytics->RecordSplineEnterNum(MapName, SplineName, SplineStats.EnterNum);\n\t\t\t\tAnalytics->RecordSplineTimeSpent(MapName, SplineName, FMath::RoundToInt(SplineStats.TimeSpentSeconds));\n\t\t\t\tAnalytics->RecordSplineDeaths(MapName, SplineName, SplineStats.DeathData);\n\t\t\t\tAnalytics->RecordSplineHPLostTotal(MapName, SplineName, SplineStats.LostHp);\n\t\t\t\tAnalytics->RecordSplineHPLostByDamageType(MapName, SplineName, SplineStats.LostHpByDamageTypeTable);\n\n\t\t\t\t// Reset for next interval\n\t\t\t\tSplineStats = {};\n\t\t\t}\n\t\t}\n\t}\n\n\t// Record spells stats\n\tfor (const auto& Elem : TempAnalyticsStats.SpellsStatsTable)\n\t{\n\t\tAnalytics->RecordSpellCasted(Elem.Key.ToString(), Elem.Value.CastNum);\n\t}\n\tTempAnalyticsStats.SpellsStatsTable.Empty();\n\n\t// Done one each spline\n\t//PlayerProgress->ResetTempAnalyticsStats();\n\n\t// Record spline first enter time for each Map\n\t// NOTE: CurrentSession does not contain this information or is useless for us.\n\tFSoPlayerProgressStats& AllSessions = PlayerProgress->GetStatsFromAllSession();\n\tfor (auto& KeyValue : AllSessions.MapsProgressTable)\n\t{\n\t\tconst FString MapName = KeyValue.Key.ToString();\n\t\tconst TMap<FName, int32> SplinesFromCurrentSession = KeyValue.Value.GetAllSplinesFirstTimeEnterForSending();\n\n\t\t// Record each spline\n\t\tfor (const auto& SplineElem : SplinesFromCurrentSession)\n\t\t{\n\t\t\tconst FString SplineName = SplineElem.Key.ToString();\n\t\t\tconst int32 TimeFirstEnterSeconds = SplineElem.Value;\n\t\t\tAnalytics->RecordSplineTimeFirstEnter(MapName, SplineName, TimeFirstEnterSeconds);\n\t\t}\n\n\t\tKeyValue.Value.MarkAllSplinesFirstTimeEnterAsSent();\n\t}\n\n\t// Record Item Usage Times\n\t// NOTE: CurrentSession does not contain this information or is useless for us.\n\tfor (auto& ItemElem : AllSessions.ItemsStatsTable)\n\t{\n\t\tconst FName ItemFName = ItemElem.Key;\n\t\tif (ItemFName == NAME_None)\n\t\t\tcontinue;\n\n\t\tAnalytics->RecordItemUsageTimes(ItemFName.ToString(), ItemElem.Value.Usages);\n\t\tItemElem.Value.MarkAllItemsUsageAsSent();\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFName USoAnalyticsComponent::GetSafeMapNameFromSpline(const ASoPlayerSpline* PlayerSpline) const\n{\n\tconst FName MapName = USoLevelHelper::GetMapNameFromObject(PlayerSpline);\n\tif (MapName == NAME_None)\n\t\treturn USoLevelHelper::GetMapNameFromObject(this);\n\n\treturn MapName;\n}\n"
  },
  {
    "path": "Source/SOrb/Online/Analytics/SoAnalyticsComponent.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#pragma once\n\n#include \"CoreMinimal.h\"\n#include \"Components/ActorComponent.h\"\n#include \"SplineLogic/SoPlayerSpline.h\"\n\n#include \"SoAnalyticsComponent.generated.h\"\n\nclass ASoCharacter;\nclass USoAnalytics;\n\n// Actor component that follows the player and updates the analytics sent\n// This is used in additions to the USoPlayerProgress components\nUCLASS(ClassGroup=(Custom))\nclass SORB_API USoAnalyticsComponent : public UActorComponent\n{\n\tGENERATED_BODY()\n\ttypedef USoAnalyticsComponent Self;\npublic:\n\t// Sets default values for this component's properties\n\tUSoAnalyticsComponent();\n\n\t// UActorComponent Interface\n\n\tvoid BeginPlay() override;\n\tvoid EndPlay(const EEndPlayReason::Type EndPlayReason) override;\n\n\t// Called every frame\n\tvoid TickComponent(float DeltaTime, ELevelTick TickType, FActorComponentTickFunction* ThisTickFunction) override;\n\n\t// Own methods\n\n\t// See comment in USoAnalyticsHelper::RecordGameplayMilestone\n\tUFUNCTION(BlueprintCallable, Category = Analytics)\n\tvoid RecordGameplayMilestone(FName MilestoneName, bool bAttachPlayTime);\n\n\tvoid FireAllRecordIntervals()\n\t{\n\t\tif (bCollectGameAnalytics && Analytics)\n\t\t{\n\t\t\tif (WaitTimeSecondsPerformance > 0.f)\n\t\t\t{\n\t\t\t\tIntervalPerformanceFinished(true);\n\t\t\t\tWaitTimeSecondsPerformance = 0.f;\n\t\t\t}\n\t\t\tif (WaitTimeSecondsCriticalPerformance > 0.f)\n\t\t\t{\n\t\t\t\tIntervalCriticalPerformanceFinished(true);\n\t\t\t\tWaitTimeSecondsCriticalPerformance = 0.f;\n\t\t\t}\n\t\t\tif (WaitTimeSecondsGameplay > 0.f)\n\t\t\t{\n\t\t\t\tIntervalGameplayFinished(true);\n\t\t\t\tWaitTimeSecondsGameplay = 0.f;\n\t\t\t}\n\t\t}\n\t}\n\n\tvoid SetCanCollectAnalytics(bool bInCollect);\n\nprotected:\n\tvoid OnPreLoadPlayerProgress();\n\tvoid OnPreSavePlayerProgress();\n\n\tUFUNCTION()\n\tvoid OnPlayerSplineChanged(const ASoSpline* OldSpline, const ASoSpline* NewSpline);\n\n\tvoid IntervalPerformanceFinished(bool bFlushAll = false);\n\tvoid IntervalCriticalPerformanceFinished(bool bFlushAll = false);\n\tvoid IntervalGameplayFinished(bool bFlushAll = false);\n\n\tFName GetSafeMapNameFromSpline(const ASoPlayerSpline* PlayerSpline) const;\n\nprotected:\n\t// Our master\n\tUPROPERTY(BlueprintReadOnly)\n\tASoCharacter* SoOwner = nullptr;\n\n\tUPROPERTY(BlueprintReadOnly)\n\tUSoAnalytics* Analytics = nullptr;\n\n\t// Can collect data\n\tUPROPERTY(VisibleAnywhere)\n\tbool bCollectGameAnalytics = false;\n\n\t// NOTE: These variables get set/reset at every IntervalSecondsPerformance\n\n\t// Performance variables\n\tint32 FrameTickForAverageNum = 0;\n\n\tfloat LastTimeSecondsUpdateAverage = 0.f;\n\tfloat WaitTimeSecondsPerformance = 0.f;\n\tfloat WaitTimeSecondsCriticalPerformance = 0.f;\n\tfloat WaitTimeSecondsGameplay = 0.f;\n\n\t// Holds the absolute current time\n\tfloat CurrentTimeSeconds = 0.f;\n\npublic:\n\t// At what interval are we submitting the performance data at, every 2 minutes, itsh\n\tstatic constexpr float IntervalSecondsPerformance = 60.f * 2.1f;\n\n\t// At what interval are we submitting the critical performance data at, once every 30 minutes, itsh\n\tstatic constexpr float IntervalSecondsCriticalPerformance = 60.f * 27.9f;\n\n\t// Interval we are submitting our gameplay data at.\n\tstatic constexpr float IntervalSecondsGameplay = 60.f;\n\n\t// Will only send spline performance data if it has at least this amount of seconds spent on it\n\tstatic constexpr float SplineAccumulatePerformanceThresholdSeconds = 5.0f;\n\n\t// Will only send spline gameplay data if it has at least this amount of seconds spent on it\n\tstatic constexpr float SplineAccumulateGamePlayThresholdSeconds = 2.0f;\n};\n"
  },
  {
    "path": "Source/SOrb/Online/Analytics/SoAnalyticsHelper.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#include \"SoAnalyticsHelper.h\"\n\n#include \"Basic/Helpers/SoStaticHelper.h\"\n#include \"SoAnalyticsComponent.h\"\n#include \"Character/SoCharacter.h\"\n#include \"Character/SoPlayerProgress.h\"\n#include \"SaveFiles/Stats/SoPlayerProgressStats.h\"\n#include \"Basic/SoGameInstance.h\"\n#include \"Levels/SoLevelHelper.h\"\n\nDEFINE_LOG_CATEGORY_STATIC(LogSoAnalyticsHelper, All, All)\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoAnalyticsHelper::RecordGameplayMilestone(const UObject* WorldContextObject, const FName MilestoneName, bool bAttachPlayTime)\n{\n\tASoCharacter* Character = USoStaticHelper::GetPlayerCharacterAsSoCharacter(WorldContextObject);\n\tif (Character == nullptr)\n\t{\n\t\tUE_LOG(LogSoAnalyticsHelper, Error, TEXT(\"USoAnalyticsHelper::RecordGameplayMileStone. Could not get character\"));\n\t\treturn;\n\t}\n\n\tUSoAnalyticsComponent* AnalyticsComponent = Character->GetAnalyticsComponent();\n\tif (AnalyticsComponent == nullptr)\n\t\treturn;\n\n\tAnalyticsComponent->RecordGameplayMilestone(MilestoneName, bAttachPlayTime);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoAnalyticsHelper::RecordGameplayMilestoneIfItIsNot(const UObject* WorldContextObject, FName MilestoneName, bool bAttachPlayTime)\n{\n\tif (!IsGameplayMilestoneRecorded(WorldContextObject, MilestoneName))\n\t\tRecordGameplayMilestone(WorldContextObject, MilestoneName, bAttachPlayTime);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoAnalyticsHelper::IsGameplayMilestoneRecorded(const UObject* WorldContextObject, FName MilestoneName)\n{\n\tASoCharacter* Character = USoStaticHelper::GetPlayerCharacterAsSoCharacter(WorldContextObject);\n\tif (Character == nullptr || Character->GetPlayerProgress() == nullptr)\n\t\treturn false;\n\n\tconst FName MapName = USoLevelHelper::GetMapNameFromObject(WorldContextObject);\n\tconst FSoPlayerProgressStats& AllSessions = Character->GetPlayerProgress()->GetStatsFromAllSession();\n\treturn AllSessions.HasMapMilestone(MapName, MilestoneName);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoAnalyticsHelper::RecordAddGold(const UObject* WorldContextObject, int32 GoldAmount, ESoResourceItemType ItemType, const FString& ItemID)\n{\n\tif (USoAnalytics* Analytics = USoGameInstance::Get(WorldContextObject).GetAnalytics())\n\t\tAnalytics->AddGold(GoldAmount, ItemType, ItemID);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoAnalyticsHelper::RecordSubtractGold(const UObject* WorldContextObject, int32 GoldAmount, ESoResourceItemType ItemType, const FString& ItemID)\n{\n\tif (USoAnalytics* Analytics = USoGameInstance::Get(WorldContextObject).GetAnalytics())\n\t\tAnalytics->SubtractGold(GoldAmount, ItemType, ItemID);\n}\n"
  },
  {
    "path": "Source/SOrb/Online/Analytics/SoAnalyticsHelper.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#pragma once\n#include \"Kismet/BlueprintFunctionLibrary.h\"\n#include \"SoAnalytics.h\"\n\n#include \"SoAnalyticsHelper.generated.h\"\n\nUCLASS()\nclass SORB_API USoAnalyticsHelper : public UBlueprintFunctionLibrary\n{\n\tGENERATED_BODY()\npublic:\n\t/**\n\t * Records a game play milestone for the current Map.\n\t * If bAttachPlayTime it will also attach to this milestone the session total play seconds.\n\t * Each milestone must be unique in each Map for it to be sent to the analytics server.\n\t */\n\tUFUNCTION(BlueprintCallable, Category = SoAnalytics, meta = (WorldContext = \"WorldContextObject\"))\n\tstatic void RecordGameplayMilestone(const UObject* WorldContextObject, FName MilestoneName, bool bAttachPlayTime = true);\n\n\t/** Records game play milestone for the current Map with time - if it was not recorded before */\n\tUFUNCTION(BlueprintCallable, Category = SoAnalytics, meta = (WorldContext = \"WorldContextObject\"))\n\tstatic void RecordGameplayMilestoneIfItIsNot(const UObject* WorldContextObject, FName MilestoneName, bool bAttachPlayTime = true);\n\n\t/** Checks if a milestone is recorded for the current Map. */\n\tUFUNCTION(BlueprintPure, Category = SoAnalytics, meta = (WorldContext = \"WorldContextObject\"))\n\tstatic bool IsGameplayMilestoneRecorded(const UObject* WorldContextObject, FName MilestoneName);\n\n\t/** Recording the adding of gold. */\n\tUFUNCTION(BlueprintCallable, Category = SoAnalytics, meta = (WorldContext = \"WorldContextObject\"))\n\tstatic void RecordAddGold(const UObject* WorldContextObject, int32 GoldAmount, ESoResourceItemType ItemType, const FString& ItemID);\n\n\t/** Recording the loosing of gold. */\n\tUFUNCTION(BlueprintCallable, Category = SoAnalytics, meta = (WorldContext = \"WorldContextObject\"))\n\tstatic void RecordSubtractGold(const UObject* WorldContextObject, int32 GoldAmount, ESoResourceItemType ItemType, const FString& ItemID);\n};\n"
  },
  {
    "path": "Source/SOrb/Online/Analytics/SoAnalyticsProvider.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#include \"SoAnalyticsProvider.h\"\n\n#if WARRIORB_WITH_GAMEANALYTICS\n#include \"GameAnalytics.h\"\n#include \"UEGameAnalytics.h\"\n#endif // WARRIORB_WITH_GAMEANALYTICS\n\n#if WARRIORB_WITH_ANALYTICS\n#include \"Analytics.h\"\n#endif // WARRIORB_WITH_ANALYTICS\n\n#include \"Basic/Helpers/SoPlatformHelper.h\"\n\nDEFINE_LOG_CATEGORY_STATIC(LogSoAnalyticsProvider,  All, All);\n\n#if WARRIORB_WITH_ANALYTICS\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nTSharedPtr<IAnalyticsProvider> FSoAnalyticsProvider::GetDefaultConfiguredProvider(const FString& ContextErrorMessage)\n{\n#if WARRIORB_WITH_GAMEANALYTICS\n\tstatic TSharedPtr<IAnalyticsProvider> Provider = FAnalytics::Get().GetDefaultConfiguredProvider();\n\tif (!Provider.IsValid() && !ContextErrorMessage.IsEmpty())\n\t{\n\t\tconst FString Message = FString::Printf(\n\t\t\tTEXT(\"%s: Failed to get the default analytics provider. Double check your [Analytics] configuration in your INI\"), *ContextErrorMessage);\n\t\tUE_LOG(LogSoAnalyticsProvider, Error, TEXT(\"%s\"), *Message);\n\t}\n\treturn Provider;\n#else\n\treturn nullptr;\n#endif // WARRIORB_WITH_GAMEANALYTICS\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSoAnalyticsProvider::RecordErrorWithAttributes(const FString& Error, const TArray<FAnalyticsEventAttribute>& Attributes)\n{\n\tTSharedPtr<IAnalyticsProvider> Provider = GetDefaultConfiguredProvider(TEXT(\"RecordErrorWithAttributes\"));\n\tif (Provider.IsValid())\n\t{\n\t\tProvider->RecordError(Error, Attributes);\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSoAnalyticsProvider::RecordProgressWithFullHierarchyAndAttributes(const FString& ProgressType, const TArray<FString>& ProgressNames, const TArray<FAnalyticsEventAttribute>& Attributes)\n{\n\tTSharedPtr<IAnalyticsProvider> Provider = GetDefaultConfiguredProvider(TEXT(\"RecordProgressWithFullHierarchyAndAttributes\"));\n\tif (Provider.IsValid())\n\t{\n\t\tProvider->RecordProgress(ProgressType, ProgressNames, Attributes);\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSoAnalyticsProvider::RecordProgressWithAttributes(const FString& ProgressType, const FString& ProgressName, const TArray<FAnalyticsEventAttribute>& Attributes)\n{\n\tTSharedPtr<IAnalyticsProvider> Provider = GetDefaultConfiguredProvider(TEXT(\"RecordProgressWithAttributes\"));\n\tif (Provider.IsValid())\n\t{\n\t\tProvider->RecordProgress(ProgressType, ProgressName, Attributes);\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool FSoAnalyticsProvider::StartSessionWithAttributes(const TArray<FAnalyticsEventAttribute>& Attributes)\n{\n\tInitializeBuildOverride();\n\n\tTSharedPtr<IAnalyticsProvider> Provider = GetDefaultConfiguredProvider(TEXT(\"StartSessionWithAttributes\"));\n\tif (Provider.IsValid())\n\t{\n\t\tconst bool bStatus = Provider->StartSession(Attributes);\n\t\treturn bStatus;\n\t}\n\n\treturn false;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSoAnalyticsProvider::RecordEventWithAttributes(const FString& EventName, const TArray<FAnalyticsEventAttribute>& Attributes)\n{\n\tTSharedPtr<IAnalyticsProvider> Provider = GetDefaultConfiguredProvider(TEXT(\"RecordEventWithAttributes\"));\n\tif (Provider.IsValid())\n\t{\n\t\tProvider->RecordEvent(EventName, Attributes);\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSoAnalyticsProvider::RecordItemPurchaseWithAttributes(const FString& ItemId, int32 ItemQuantity, const TArray<FAnalyticsEventAttribute>& Attributes)\n{\n\t// The only valid RecordItemPurchase supported by GameAnalytics\n\tTSharedPtr<IAnalyticsProvider> Provider = GetDefaultConfiguredProvider(TEXT(\"RecordSimpleItemPurchaseWithAttributes\"));\n\tif (Provider.IsValid())\n\t{\n\t\tProvider->RecordItemPurchase(ItemId, ItemQuantity, Attributes);\n\t}\n}\n#endif // WARRIORB_WITH_ANALYTICS\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSoAnalyticsProvider::InitializeBuildOverride()\n{\n#if WARRIORB_WITH_GAMEANALYTICS\n\tFGameAnalyticsBuildOverride& BuildOverride = FAnalyticsGameAnalytics::Get().GetBuildOverride();\n\tif (!BuildOverride.IsBound())\n\t{\n\t\tBuildOverride.BindLambda(&USoPlatformHelper::GetGameBuildVersion);\n\t}\n#endif // WARRIORB_WITH_GAMEANALYTICS\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool FSoAnalyticsProvider::StartSession()\n{\n\tInitializeBuildOverride();\n\n#if WARRIORB_WITH_ANALYTICS\n\t// Start the normal sessions\n\tTSharedPtr<IAnalyticsProvider> Provider = GetDefaultConfiguredProvider(TEXT(\"StartSession\"));\n\tif (Provider.IsValid())\n\t{\n\t\tconst bool bStatus = Provider->StartSession();\n\t\t// Be aware that the initialization will always automatically start the first session even with manual session handling.\n\t\t// NOTE: On PIE  Mode because we have manual session handling enabled it will just call UGameAnalytics::startSession()\n\t\treturn bStatus;\n\t}\n#endif // WARRIORB_WITH_ANALYTICS\n\n\treturn false;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSoAnalyticsProvider::EndSession()\n{\n#if WARRIORB_WITH_ANALYTICS\n\tTSharedPtr<IAnalyticsProvider> Provider = GetDefaultConfiguredProvider(TEXT(\"EndSession\"));\n\tif (Provider.IsValid())\n\t{\n\t\tProvider->EndSession();\n\t}\n#endif // WARRIORB_WITH_ANALYTICS\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSoAnalyticsProvider::FlushEvents()\n{\n#if WARRIORB_WITH_ANALYTICS\n\tTSharedPtr<IAnalyticsProvider> Provider = GetDefaultConfiguredProvider(TEXT(\"FlushEvents\"));\n\tif (Provider.IsValid())\n\t{\n\t\tProvider->FlushEvents();\n\t}\n#endif // WARRIORB_WITH_ANALYTICS\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSoAnalyticsProvider::SetCustomDimensions()\n{\n#if WARRIORB_WITH_GAMEANALYTICS\n\n#if WITH_EDITOR\n\tUGameAnalytics::setCustomDimension01(\"WITH_EDITOR\");\n#else\n\tUGameAnalytics::setCustomDimension01(\"WITH_NO_EDITOR\");\n#endif // WITH_EDITOR\n\n#endif // WARRIORB_WITH_GAMEANALYTICS\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSoAnalyticsProvider::WaitForAnalyticsToSend()\n{\n#if WARRIORB_WITH_GAMEANALYTICS\n\tUGameAnalytics::waitUntilJobsAreDone();\n#endif // WARRIORB_WITH_GAMEANALYTICS\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSoAnalyticsProvider::SetPollTimers(double WaitSeconds, double ProcessEventsSeconds)\n{\n#if WARRIORB_WITH_GAMEANALYTICS\n\tUGameAnalytics::setThreadAndEventTimers(WaitSeconds, ProcessEventsSeconds);\n#endif // WARRIORB_WITH_GAMEANALYTICS\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSoAnalyticsProvider::RecordEvent(const FString& EventName)\n{\n#if WARRIORB_WITH_ANALYTICS\n\tTSharedPtr<IAnalyticsProvider> Provider = GetDefaultConfiguredProvider(TEXT(\"RecordEvent\"));\n\tif (Provider.IsValid())\n\t{\n\t\tProvider->RecordEvent(EventName);\n\t}\n#endif // WARRIORB_WITH_ANALYTICS\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSoAnalyticsProvider::RecordEventWithAttribute(const FString& EventName, const FString& AttributeName, const FString& AttributeValue)\n{\n#if WARRIORB_WITH_ANALYTICS\n\tTSharedPtr<IAnalyticsProvider> Provider = GetDefaultConfiguredProvider(TEXT(\"RecordEventWithAttribute\"));\n\tif (Provider.IsValid())\n\t{\n\t\tconst FAnalyticsEventAttribute Attribute{AttributeName, AttributeValue};\n\t\tProvider->RecordEvent(EventName, Attribute);\n\t}\n#endif // WARRIORB_WITH_ANALYTICS\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFString FSoAnalyticsProvider::GetSessionId()\n{\n#if WARRIORB_WITH_ANALYTICS\n\tTSharedPtr<IAnalyticsProvider> Provider = GetDefaultConfiguredProvider(TEXT(\"GetSessionId\"));\n\tif (Provider.IsValid())\n\t{\n\t\treturn Provider->GetSessionID();\n\t}\n#endif // WARRIORB_WITH_ANALYTICS\n\n\treturn FString();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSoAnalyticsProvider::SetSessionId(const FString& SessionId)\n{\n#if WARRIORB_WITH_ANALYTICS\n\tTSharedPtr<IAnalyticsProvider> Provider = GetDefaultConfiguredProvider(TEXT(\"SetSessionId\"));\n\tif (Provider.IsValid())\n\t{\n\t\tProvider->SetSessionID(SessionId);\n\t}\n#endif // WARRIORB_WITH_ANALYTICS\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFString FSoAnalyticsProvider::GetUserId()\n{\n#if WARRIORB_WITH_ANALYTICS\n\tTSharedPtr<IAnalyticsProvider> Provider = GetDefaultConfiguredProvider(TEXT(\"GetUserId\"));\n\tif (Provider.IsValid())\n\t{\n\t\treturn Provider->GetUserID();\n\t}\n#endif // WARRIORB_WITH_ANALYTICS\n\n\treturn FString();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSoAnalyticsProvider::SetUserId(const FString& UserId)\n{\n#if WARRIORB_WITH_ANALYTICS\n\tTSharedPtr<IAnalyticsProvider> Provider = GetDefaultConfiguredProvider(TEXT(\"SetUserId\"));\n\tif (Provider.IsValid())\n\t{\n\t\tProvider->SetUserID(UserId);\n\t}\n#endif // WARRIORB_WITH_ANALYTICS\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSoAnalyticsProvider::SetBuildInfo(const FString& BuildInfo)\n{\n#if WARRIORB_WITH_ANALYTICS\n\tTSharedPtr<IAnalyticsProvider> Provider = GetDefaultConfiguredProvider(TEXT(\"SetBuildInfo\"));\n\tif (Provider.IsValid())\n\t{\n\t\tProvider->SetBuildInfo(BuildInfo);\n\t}\n#endif // WARRIORB_WITH_ANALYTICS\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSoAnalyticsProvider::RecordProgress(const FString& ProgressType, const FString& ProgressName)\n{\n#if WARRIORB_WITH_ANALYTICS\n\tTSharedPtr<IAnalyticsProvider> Provider = GetDefaultConfiguredProvider(TEXT(\"RecordProgress\"));\n\tif (Provider.IsValid())\n\t{\n\t\tProvider->RecordProgress(ProgressType, ProgressName);\n\t}\n#endif // WARRIORB_WITH_ANALYTICS\n}\n"
  },
  {
    "path": "Source/SOrb/Online/Analytics/SoAnalyticsProvider.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#pragma once\n\n#include \"CoreMinimal.h\"\n\n#if WARRIORB_WITH_ANALYTICS\n#include \"Interfaces/IAnalyticsProvider.h\"\n#endif // WARRIORB_WITH_ANALYTICS\n\n/**\n * Mostly copied from AnalyticsBlueprintLibrary as we can't access it.\n * Not all methods are implemented:\n * 1. We do not need all\n * 2. GameAnalytics only supports some\n * 3. Safe way to record game analytics events\n */\nclass SORB_API FSoAnalyticsProvider\n{\npublic:\n#if WARRIORB_WITH_ANALYTICS\n\t// Gets the current analytics provider and outputs an error if nothing could be found\n\tstatic TSharedPtr<IAnalyticsProvider> GetDefaultConfiguredProvider(const FString& ContextErrorMessage);\n\n\t/** Starts an analytics session with custom attributes specified */\n\tstatic bool StartSessionWithAttributes(const TArray<FAnalyticsEventAttribute>& Attributes);\n\n\t/** Records an event has happened by name with a single attribute */\n\tstatic void RecordEventWithAttributes(const FString& EventName, const TArray<FAnalyticsEventAttribute>& Attributes);\n\n\t/** Records an in-game item was purchased with attributes */\n\tstatic void RecordItemPurchaseWithAttributes(const FString& ItemId, int32 ItemQuantity, const TArray<FAnalyticsEventAttribute>& Attributes);\n\n\t/** Records an error event has happened with attributes */\n\tstatic void RecordErrorWithAttributes(const FString& Error, const TArray<FAnalyticsEventAttribute>& Attributes);\n\n\t/** Records a user progress event has happened with a full list of progress hierarchy names and with attributes */\n\tstatic void RecordProgressWithFullHierarchyAndAttributes(const FString& ProgressType, const TArray<FString>& ProgressNames, const TArray<FAnalyticsEventAttribute>& Attributes);\n\n\t/** Records a user progress event has happened with attributes */\n\tstatic void RecordProgressWithAttributes(const FString& ProgressType, const FString& ProgressName, const TArray<FAnalyticsEventAttribute>& Attributes);\n#endif // WARRIORB_WITH_ANALYTICS\n\t\n\t// Is there a default configured provider?\n\tFORCEINLINE static bool HasDefaultConfiguredProvider()\n\t{\n#if WARRIORB_WITH_ANALYTICS\n\t\treturn GetDefaultConfiguredProvider(TEXT(\"HasDefaultConfiguredProvider\")).IsValid();\n#else\n\t\treturn false;\n#endif\n\t}\n\n\t// Overrides the build version with our own\n\tstatic void InitializeBuildOverride();\n\n\t/** Starts an analytics session without any custom attributes specified */\n\tstatic bool StartSession();\n\n\n\t/** Ends an analytics session */\n\tstatic void EndSession();\n\n\t/** Flush all events. */\n\tstatic void FlushEvents();\n\n\t/** Sets all the custom dimensions values */\n\tstatic void SetCustomDimensions();\n\n\t/** Blocking. Waits for analytics to send */\n\tstatic void WaitForAnalyticsToSend();\n\n\t/** Sets the thread and event timers for the game analytics */\n\tstatic void SetPollTimers(double WaitSeconds, double ProcessEventsSeconds);\n\n\t/** Records an event has happened by name without any attributes (an event counter) */\n\tstatic void RecordEvent(const FString& EventName);\n\n\t/** Records an event has happened by name with a single attribute */\n\tstatic void RecordEventWithAttribute(const FString& EventName, const FString& AttributeName, const FString& AttributeValue);\n\n\t/** Gets the current session id from the analytics provider */\n\tstatic FString GetSessionId();\n\n\t/** Sets the session id (if supported) on the analytics provider */\n\tstatic void SetSessionId(const FString& SessionId);\n\n\t/** Gets the current user id from the analytics provider */\n\tstatic FString GetUserId();\n\n\t/** Sets the user id (if supported) on the analytics provider */\n\tstatic void SetUserId(const FString& UserId);\n\n\t/** Sets the game's build info (if supported) on the analytics provider */\n\tstatic void SetBuildInfo(const FString& BuildInfo);\n\n\t/** Records a user progress event has happened */\n\tstatic void RecordProgress(const FString& ProgressType, const FString& ProgressName);\n};\n"
  },
  {
    "path": "Source/SOrb/Online/SoOnlineCloud.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#include \"SoOnlineCloud.h\"\n\n#if WARRIORB_WITH_STEAM\n#include \"INotYetSteamModule.h\"\n#endif // WARRIORB_WITH_STEAM\n#include \"Basic/Helpers/SoMathHelper.h\"\n\nDEFINE_LOG_CATEGORY_STATIC(LogSoOnlineCloud, All, All);\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSoOnlineCloud::Initiallize(TSharedPtr<const FUniqueNetId> InUserID)\n{\n\tUE_LOG(LogSoOnlineCloud, Log, TEXT(\"Initiallize\"));\n\n\tUserID = InUserID;\n\tbIsInitialized = false;\n\n#if WARRIORB_WITH_STEAM\n\t// const INYSteamSubsystemPtr Steam = INotYetSteamModule::Get().GetSteamSubsystem();\n\t// if (!Steam.IsValid())\n\t// \treturn ;\n\n\t// SteamUserCloud = Steam->GetUserCloud();\n\t// if (SteamUserCloud.IsValid())\n\t// {\n\t// \tUE_LOG(LogSoOnlineCloud, Log, TEXT(\"Initiallize: Steam UserCloud is available\"));\n\n\t// \tSteamUserCloud->OnEnumerateUserFilesCompleteDelegates.AddRaw(this, &Self::HandleOnSteamEnumerateUserFilesComplete);\n\t// \tSteamUserCloud->EnumerateUserFiles(*UserID);\n\t// \tDumpCloudState();\n\t// \tDumpCloudFilesState();\n\t// }\n\t// else\n\t// {\n\t// \tUE_LOG(LogSoOnlineCloud, Warning, TEXT(\"Initiallize: SteamUserCloud is DISABLED\"));\n\t// }\n#endif // WARRIORB_WITH_STEAM\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSoOnlineCloud::Shutdown()\n{\n#if WARRIORB_WITH_STEAM\n\t// SteamUserCloud.Reset();\n\tUserID.Reset();\n#endif\n\n\tUE_LOG(LogSoOnlineCloud, Log, TEXT(\"Shutdown\"));\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool FSoOnlineCloud::IsSteamCloudEnabled() const\n{\n#if WARRIORB_WITH_STEAM\n\t// if (!SteamUserCloud.IsValid())\n\t// \treturn false;\n\t//\n\t// return SteamUserCloud->IsCloudEnabledForAccount() && SteamUserCloud->IsCloudEnabledForApp();\n\treturn false;\n#else\n\treturn false;\n#endif // WARRIORB_WITH_STEAM\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSoOnlineCloud::HandleOnSteamEnumerateUserFilesComplete(bool bWasSuccessful, const FUniqueNetId& HandleUserID)\n{\n#if WARRIORB_WITH_STEAM\n\t// if (HandleUserID != *UserID)\n\t// {\n\t// \tUE_LOG(LogSoOnlineCloud, Warning, TEXT(\"HandleOnSteamEnumerateUserFilesComplete: Not our user ID. Ignoring.\"));\n\t// \treturn;\n\t// }\n\t// if (!bWasSuccessful)\n\t// {\n\t// \tUE_LOG(LogSoOnlineCloud, Error, TEXT(\"HandleOnSteamEnumerateUserFilesComplete: NOT successful :(\"));\n\t// \treturn;\n\t// }\n\t// if (!IsSteamCloudEnabled())\n\t// {\n\t// \tUE_LOG(LogSoOnlineCloud, Warning, TEXT(\"HandleOnSteamEnumerateUserFilesComplete: Steam cloud not enabled. Ignoring.\"));\n\t// \treturn;\n\t// }\n\t//\n\t// SteamUserCloud->GetUserFileList(*UserID, UserFiles);\n\t// DumpCloudState();\n\t// DumpCloudFilesState();\n#endif // WARRIORB_WITH_STEAM\n\n\tbIsInitialized = true;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSoOnlineCloud::DumpCloudState()\n{\n#if WARRIORB_WITH_STEAM\n\t// if (!SteamUserCloud.IsValid())\n\t// \treturn;\n\t//\n\t// uint64 TotalBytes = 0, AvailableBytes = 0;\n\t// SteamUserCloud->GetQuota(TotalBytes, AvailableBytes);\n\t// UE_LOG(LogSoOnlineCloud, Verbose, TEXT(\"Steam Disk Quota: %f MB / %f MB\"), USoMathHelper::BytesToMegaBytes(AvailableBytes), USoMathHelper::BytesToMegaBytes(TotalBytes));\n\t// UE_LOG(LogSoOnlineCloud, Verbose, TEXT(\"Game does %shave cloud storage enabled.\"), SteamUserCloud->IsCloudEnabledForApp() ? TEXT(\"\") : TEXT(\"NOT \"));\n\t// UE_LOG(LogSoOnlineCloud, Verbose, TEXT(\"User does %shave cloud storage enabled.\"), SteamUserCloud->IsCloudEnabledForAccount() ? TEXT(\"\") : TEXT(\"NOT \"));\n#endif // WARRIORB_WITH_STEAM\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSoOnlineCloud::DumpCloudFileState(const FString& FileName)\n{\n#if WARRIORB_WITH_STEAM\n\t// if (!SteamUserCloud.IsValid())\n\t// \treturn;\n\t//\n\t// SteamUserCloud->DumpCloudFileState(*UserID, FileName);\n#endif // WARRIORB_WITH_STEAM\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSoOnlineCloud::DumpCloudFilesState()\n{\n#if WARRIORB_WITH_STEAM\n\t// if (!IsInitialized())\n\t// {\n\t// \tUE_LOG(LogSoOnlineCloud, Warning, TEXT(\"DumpCloudFilesState: Steam clouds are not initialized. Ignoring.\"));\n\t// \treturn;\n\t// }\n\t//\n\t// for (const FCloudFileHeader& Header : UserFiles)\n\t// {\n\t// \tDumpCloudFileState(Header.FileName);\n\t// }\n\n#endif // WARRIORB_WITH_STEAM\n}\n"
  },
  {
    "path": "Source/SOrb/Online/SoOnlineCloud.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#pragma once\n#include \"CoreMinimal.h\"\n#include \"UObject/CoreOnline.h\"\n\n#if WARRIORB_WITH_ONLINE\n#include \"OnlineSubsystemTypes.h\"\n#endif // WARRIORB_WITH_ONLINE\n\n#include \"SoOnlineCloud.generated.h\"\n\n\nUSTRUCT()\nstruct FSoOnlineCloud\n{\n\tGENERATED_USTRUCT_BODY()\n\ttypedef FSoOnlineCloud Self;\n\npublic:\n\tFSoOnlineCloud() {}\n\n\tvoid Initiallize(TSharedPtr<const FUniqueNetId> InUserID);\n\tvoid Shutdown();\n\n\tbool IsInitialized() const { return bIsInitialized;  }\n\tbool IsSteamCloudEnabled() const;\n\n\tvoid DumpCloudState();\n\tvoid DumpCloudFileState(const FString& FileName);\n\tvoid DumpCloudFilesState();\n\nprotected:\n\tvoid HandleOnSteamEnumerateUserFilesComplete(bool bWasSuccessful, const FUniqueNetId& HandleUserID);\n\nprotected:\n#if WARRIORB_WITH_STEAM\n\t// TSharedPtr<UObject> SteamUserCloud = nullptr;\n#endif\n\n\t// Enumerate files finished at least once\n\tbool bIsInitialized = false;\n\n\t// Online user id\n\tTSharedPtr<const FUniqueNetId> UserID = nullptr;\n\n#if WARRIORB_WITH_ONLINE\n\t// All the cloud user files metadata\n\tTArray<FCloudFileHeader> UserFiles;\n#endif // WARRIORB_WITH_ONLINE\n};\n"
  },
  {
    "path": "Source/SOrb/Online/SoOnlineHelper.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#include \"SoOnlineHelper.h\"\n#include \"Basic/Helpers/SoStaticHelper.h\"\n#include \"GameFramework/PlayerState.h\"\n#include \"GameFramework/PlayerController.h\"\n#include \"Engine/LocalPlayer.h\"\n\n#if WARRIORB_WITH_ONLINE\n#include \"OnlineSubsystem.h\"\n#endif\n#include \"Basic/SoGameInstance.h\"\n\nbool USoOnlineHelper::bWaitForFirstControllerInput = false;\n\n\nTSharedPtr<const FUniqueNetId> USoOnlineHelper::GetUniqueNetIDFromObject(const UObject* WorldContextObject)\n{\n\tconst APlayerController* PlayerController = USoStaticHelper::GetPlayerController(WorldContextObject);\n\tif (!PlayerController)\n\t\treturn nullptr;\n\n\tconst APlayerState* PlayerState = PlayerController->PlayerState;\n\tif (!PlayerState)\n\t\treturn nullptr;\n\n\treturn PlayerState->UniqueId.GetUniqueNetId();\n}\n\n\nbool USoOnlineHelper::IsLocalPlayerSignedIn(ULocalPlayer* LocalPlayer)\n{\n#if WARRIORB_WITH_ONLINE\n\tif (LocalPlayer == nullptr)\n\t{\n\t\treturn false;\n\t}\n\n\tconst auto OnlineSub = IOnlineSubsystem::Get();\n\tif (OnlineSub)\n\t{\n\t\tconst auto IdentityInterface = OnlineSub->GetIdentityInterface();\n\t\tif (IdentityInterface.IsValid())\n\t\t{\n\t\t\tauto UniqueId = LocalPlayer->GetUniqueNetIdFromCachedControllerId();\n\t\t\tif (UniqueId.IsValid())\n\t\t\t{\n\t\t\t\tconst auto LoginStatus = IdentityInterface->GetLoginStatus(*UniqueId);\n\t\t\t\tif (LoginStatus == ELoginStatus::LoggedIn)\n\t\t\t\t{\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n#endif\n\treturn false;\n}\n\nbool USoOnlineHelper::IsFirstLocalPlayerReadyToPlay(const UObject* WorldContextObject)\n{\n\tULocalPlayer* LocalPlayer = USoStaticHelper::GetPlayerController(WorldContextObject)->GetLocalPlayer();\n\treturn IsLocalPlayerSignedIn(LocalPlayer);\n\t// && LocalPlayer->GetUniqueNetIdFromCachedControllerId() == USoGameInstance::Get(WorldContextObject).GetCachedControllerNetID();\n}\n\n\nvoid USoOnlineHelper::ShowExternalLoginUI(USoGameInstance* SoGameInstance)\n{\n#if WARRIORB_WITH_ONLINE\n\tconst auto ExternalUI = Online::GetExternalUIInterface();\n\tif (ExternalUI.IsValid())\n\t{\n\t\tExternalUI->ShowLoginUI(0, false, false, FOnLoginUIClosedDelegate::CreateUObject(SoGameInstance, &USoGameInstance::HandleLoginUIClosed));\n\t}\n#endif\n}\n\n\nvoid USoOnlineHelper::SpawnLocalPlayers(const UObject* WorldContextObject)\n{\n#if WARRIORB_WITH_ONLINE\n\tFString ErrorReason;\n\t// the first player is already created by default\n\tfor (int i = 2; i <= MAX_LOCAL_PLAYERS; i++)\n\t{\n\t\tUSoGameInstance::Get(WorldContextObject).CreateLocalPlayer(-1, ErrorReason, true);\n\t}\n\n\tbWaitForFirstControllerInput = true;\n#endif\n}\n\n\nvoid USoOnlineHelper::DestroyLocalPlayers(ULocalPlayer* TheChosenOne)\n{\n\tUSoGameInstance& SoGameInstance = USoGameInstance::Get(TheChosenOne);\n\n\tconst TArray<class ULocalPlayer*>& LocalPlayers = USoGameInstance::Get(TheChosenOne).GetLocalPlayers();\n\n\tfor (int32 i = LocalPlayers.Num() -1; i>=0; --i)\n\t{\n\t\tif (LocalPlayers[i] != TheChosenOne)\n\t\t\tSoGameInstance.RemoveLocalPlayer(LocalPlayers[i]);\n\t}\n}\n\n\nFString USoOnlineHelper::GetPlayerNickname(const UObject* WorldContextObject)\n{\n#if WARRIORB_WITH_ONLINE\n\tif (const APlayerController* PlayerController = USoStaticHelper::GetPlayerController(WorldContextObject))\n\t{\n\t\tconst auto OnlineSub = IOnlineSubsystem::Get();\n\t\tif (OnlineSub)\n\t\t{\n\t\t\tconst auto IdentityInterface = OnlineSub->GetIdentityInterface();\n\t\t\tTSharedPtr<const FUniqueNetId> UserId = IdentityInterface->GetUniquePlayerId(PlayerController->GetLocalPlayer()->GetControllerId());\n\t\t\tif (UserId.IsValid())\n\t\t\t\treturn IdentityInterface->GetPlayerNickname(*UserId);\n\t\t}\n\t}\n#endif\n\n\treturn FString(\"Invalid\");\n}"
  },
  {
    "path": "Source/SOrb/Online/SoOnlineHelper.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#pragma once\n#include \"Kismet/BlueprintFunctionLibrary.h\"\n#include \"UObject/CoreOnline.h\"\n\n#if WARRIORB_WITH_ONLINE\n#include \"OnlineSubsystem.h\"\n#include \"Interfaces/OnlineExternalUIInterface.h\"\n#include \"OnlineSubsystemUtils/Public/OnlineSubsystemUtils.h\"\n#endif\n\n#include \"SoOnlineHelper.generated.h\"\n\n\n/**\n *\n */\nUCLASS()\nclass SORB_API USoOnlineHelper : public UBlueprintFunctionLibrary\n{\n\tGENERATED_BODY()\n\npublic:\n\tstatic TSharedPtr<const FUniqueNetId> GetUniqueNetIDFromObject(const UObject* WorldContextObject);\n\n\n\tstatic bool IsLocalPlayerSignedIn(class ULocalPlayer* LocalPlayer);\n\n\tUFUNCTION(BlueprintCallable)\n\tstatic void ShowExternalLoginUI(class USoGameInstance* SoGameInstance);\n\n\t/** signed in and got access to the controller associated with player controller 0 */\n\tUFUNCTION(BlueprintPure, meta = (WorldContext = \"WorldContextObject\"))\n\tstatic bool IsFirstLocalPlayerReadyToPlay(const UObject* WorldContextObject);\n\n\tUFUNCTION(BlueprintCallable, meta = (WorldContext = \"WorldContextObject\"))\n\tstatic void SpawnLocalPlayers(const UObject* WorldContextObject);\n\n\tUFUNCTION()\n\tstatic void DestroyLocalPlayers(ULocalPlayer* TheChosenOne);\n\n\tUFUNCTION(BlueprintPure, meta = (WorldContext = \"WorldContextObject\"))\n\tstatic FString GetPlayerNickname(const UObject* WorldContextObject);\n\n\n\n\tstatic bool bWaitForFirstControllerInput;\n};\n"
  },
  {
    "path": "Source/SOrb/Online/SoOnlineRichPresence.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#include \"SoOnlineRichPresence.h\"\n#include \"Basic/SoGameInstance.h\"\n\n#if WARRIORB_WITH_STEAM\n#include \"INotYetSteamModule.h\"\n#endif\n#include \"SoOnlineHelper.h\"\n#include \"Levels/SoLevelHelper.h\"\n#include \"Character/SoPlayerProgress.h\"\n\n\nDEFINE_LOG_CATEGORY_STATIC(LogSoOnlineRichPresence, All, All);\n\nconst FName USoOnlineRichPresence::TokenMenu(TEXT(\"#menu\"));\nconst FName USoOnlineRichPresence::TokenChapter(TEXT(\"#chapter\"));\nconst FName USoOnlineRichPresence::TokenEpisode(TEXT(\"#challenge\"));\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUSoOnlineRichPresence::USoOnlineRichPresence()\n{\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoOnlineRichPresence::SetOwner(USoPlayerProgress* InOwner)\n{\n\tSoOwner = InOwner;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoOnlineRichPresence::OnSplineChanged()\n{\n\tUpdateFromCurrentState();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoOnlineRichPresence::OnChapterChanged()\n{\n\tUpdateFromCurrentState();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoOnlineRichPresence::UpdateFromCurrentState()\n{\n\t// DISABLED for now\n\treturn;\n\n#if WARRIORB_WITH_STEAM\n\tconst INYSteamSubsystemPtr Steam = INotYetSteamModule::Get().GetSteamSubsystem();\n\tif (!Steam.IsValid())\n\t\treturn;\n\n\tconst bool bHasAnyProvider = Steam->IsEnabled();\n#else\n\tconst bool bHasAnyProvider = false;\n#endif\n\n\tif (!bHasAnyProvider)\n\t{\n\t\treturn;\n\t}\n\n\tconst auto& GameInstance = USoGameInstance::Get(SoOwner);\n\tTSharedPtr<const FUniqueNetId> PlayerID = USoOnlineHelper::GetUniqueNetIDFromObject(SoOwner);\n\tif (!PlayerID.IsValid())\n\t\treturn;\n\n\tTMap<FString, FText> Substitutions;\n\tbool bShouldContainSubstitutions = false;\n\tFName TokenToUse;\n\n\t// Fill Token and substitutions depending on where we are\n\tif (GameInstance.IsMenu())\n\t{\n\t\tTokenToUse = TokenMenu;\n\t}\n\telse if (GameInstance.IsEpisode())\n\t{\n\t\tbShouldContainSubstitutions = true;\n\t\tTokenToUse = TokenEpisode;\n\n\t\t// Fill current Episode FText\n\t\tconst FName EpisodeName = USoLevelHelper::GetEpisodeNameFromObject(SoOwner);\n\t\tSubstitutions.Add(TEXT(\"challenge\"), USoLevelHelper::GetEpisodeNameDisplayText(EpisodeName));\n\t}\n\telse if (GameInstance.IsChapter())\n\t{\n\t\tbShouldContainSubstitutions = true;\n\t\tTokenToUse = TokenChapter;\n\n\t\tconst FName ChapterName = USoLevelHelper::GetChapterNameFromObject(SoOwner);\n\t\tSubstitutions.Add(TEXT(\"chapter\"), USoLevelHelper::ChapterNameToFriendlyText(ChapterName));\n\t}\n\n\t// Weird\n\tif (TokenToUse.IsNone())\n\t\treturn;\n\n\tif (bShouldContainSubstitutions && Substitutions.Num() == 0)\n\t\treturn;\n\n#if WARRIORB_WITH_STEAM\n\tINYSteamPresencePtr Presence = Steam->GetPresence();\n\tif (!Presence.IsValid())\n\t\treturn;\n\n\tPresence->ClearRichPresence(*PlayerID);\n\tPresence->SetRichPresenceSteamDisplay(*PlayerID, TokenToUse, Substitutions);\n#endif // WARRIORB_WITH_STEAM\n}\n"
  },
  {
    "path": "Source/SOrb/Online/SoOnlineRichPresence.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#include \"CoreMinimal.h\"\n#include \"UObject/Object.h\"\n\n#include \"SoOnlineRichPresence.generated.h\"\n\nclass USoPlayerProgress;\n\n\n// Controls what appears in online applications status\nUCLASS()\nclass SORB_API USoOnlineRichPresence : public UObject\n{\n\tGENERATED_BODY()\npublic:\n\tUSoOnlineRichPresence();\n\n\tvoid SetOwner(USoPlayerProgress* InOwner);\n\tvoid OnSplineChanged();\n\tvoid OnChapterChanged();\n\nprotected:\n\tvoid UpdateFromCurrentState();\n\nprotected:\n\tstatic const FName TokenMenu;\n\tstatic const FName TokenChapter;\n\tstatic const FName TokenEpisode;\n\n\tUPROPERTY()\n\tUSoPlayerProgress* SoOwner;\n};\n"
  },
  {
    "path": "Source/SOrb/Projectiles/SoProjectile.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#include \"SoProjectile.h\"\n\n#include \"GameFramework/ProjectileMovementComponent.h\"\n#include \"Components/PrimitiveComponent.h\"\n#include \"Engine/World.h\"\n#include \"TimerManager.h\"\n#include \"Kismet/GameplayStatics.h\"\n#include \"GameFramework/Character.h\"\n#include \"Components/SkeletalMeshComponent.h\"\n\n#include \"CharacterBase/SoMortal.h\"\n#include \"SplineLogic/SoSplinePoint.h\"\n#include \"SoProjectileMovementComponent.h\"\n#include \"Basic/Helpers/SoStaticHelper.h\"\n#include \"Basic/SoAudioManager.h\"\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nASoProjectile::ASoProjectile()\n{\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoProjectile::OnConstruction(const FTransform& Transform)\n{\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoProjectile::BeginPlay()\n{\n\tSuper::BeginPlay();\n\tHitReactDesc.AssociatedActor = this;\n\n\tif (PrimitiveComponent != nullptr)\n\t{\n\t\tPrimitiveComponent->OnComponentBeginOverlap.AddDynamic(this, &ASoProjectile::OnOverlapBegin);\n\t\tPrimitiveComponent->OnComponentHit.AddDynamic(this, &ASoProjectile::OnHitCallback);\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoProjectile::ActivateProjectile(const FVector& InitialLocation,\n\t\t\t\t\t\t\t\t\t   const FRotator& InitialRotation,\n\t\t\t\t\t\t\t\t\t   const FSoProjectileInitData* InitDataOverride,\n\t\t\t\t\t\t\t\t\t   const FSoProjectileRuntimeData* RuntimeData,\n\t\t\t\t\t\t\t\t\t   AActor* Spawner)\n{\n\tDECLARE_SCOPE_CYCLE_COUNTER(TEXT(\"ActivateProjectile\"), STAT_ActivateProjectile, STATGROUP_SoProjectile);\n\n\tSetActorLocationAndRotation(InitialLocation + FVector(0.0f, 0.0f, ZSpawnOffset), InitialRotation);\n\tconst FSoProjectileInitData& InitDataRef = InitDataOverride == nullptr ? DefaultInitData : *InitDataOverride;\n\tActivateProjectile_Internal(InitDataRef, RuntimeData == nullptr ? DefaultRuntimeData : *RuntimeData, Spawner);\n\n\tif (ProjectileMovementComponent != nullptr)\n\t{\n\t\tif (InitDataRef.bShouldVelocityInfluenceDirection)\n\t\t{\n\t\t\tFVector ForwardVector = InitialRotation.Vector();\n\t\t\tForwardVector.Z = 0.0f;\n\t\t\tForwardVector.Normalize();\n\t\t\tProjectileMovementComponent->Velocity = ForwardVector * InitDataRef.Velocity.X + FVector(0.0f, 0.0f, InitDataRef.Velocity.Y);\n\t\t}\n\t\telse\n\t\t\tProjectileMovementComponent->Velocity = GetActorForwardVector() * InitDataRef.Velocity.X;\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoProjectile::ActivateProjectileOnSpline(const struct FSoSplinePoint& SplineLocation,\n\t\t\t\t\t\t\t\t\t\t\t   float LocationZ,\n\t\t\t\t\t\t\t\t\t\t\t   const FVector& OffsetFromSpline,\n\t\t\t\t\t\t\t\t\t\t\t   const FRotator& InitialRotation,\n\t\t\t\t\t\t\t\t\t\t\t   const FSoProjectileInitData* InitDataOverride,\n\t\t\t\t\t\t\t\t\t\t\t   const FSoProjectileRuntimeData* RuntimeData,\n\t\t\t\t\t\t\t\t\t\t\t   AActor* Spawner)\n{\n\tDECLARE_SCOPE_CYCLE_COUNTER(TEXT(\"ActivateProjectileOnSpline\"), STAT_ActivateProjectileOnSpline, STATGROUP_SoProjectile);\n\n\tUSoProjectileMovementComponent* SoProjectileMovement = Cast<USoProjectileMovementComponent>(ProjectileMovementComponent);\n\tif (SoProjectileMovement == nullptr || !SplineLocation.IsValid(false))\n\t{\n\t\tUE_LOG(LogTemp, Warning, TEXT(\"Failed to fire projectile %s: projectile does not support splines or the spline parameters are invalid!\"), *GetClass()->GetName());\n\t\treturn;\n\t}\n\n\tFVector Location = SplineLocation;\n\tLocation.Z = LocationZ;\n\tSetActorLocationAndRotation(Location + OffsetFromSpline + FVector(0.0f, 0.0f, ZSpawnOffset), InitialRotation);\n\n\tSoProjectileMovement->SetSplineLocation(SplineLocation);\n\tSoProjectileMovement->SetOffsetFromSplineLocation(OffsetFromSpline);\n\n\tconst FSoProjectileInitData& InitDataRef = InitDataOverride == nullptr ? DefaultInitData : *InitDataOverride;\n\tActivateProjectile_Internal(InitDataRef, RuntimeData == nullptr ? DefaultRuntimeData : *RuntimeData, Spawner);\n\n\tif (InitDataRef.bShouldVelocityInfluenceDirection)\n\t\tProjectileMovementComponent->Velocity = GetActorForwardVector() * InitDataRef.Velocity.X + FVector(0.0f, 0.0f, InitDataRef.Velocity.Y);\n\telse\n\t{\n\t\tconst FVector ForwardVector = SplineLocation.GetDirectionFromVector(InitialRotation.Vector());\n\t\tProjectileMovementComponent->Velocity = ForwardVector * InitDataRef.Velocity.X + FVector(0.0f, 0.0f, InitDataRef.Velocity.Y);\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoProjectile::ForceVelocityToZ()\n{\n\tif (ProjectileMovementComponent != nullptr)\n\t\tProjectileMovementComponent->Velocity = FVector(0.0f, 0.0f, 1.0f) * ProjectileMovementComponent->Velocity.Size();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoProjectile::ActivateProjectile_Internal(const FSoProjectileInitData& InitData,\n\t\t\t\t\t\t\t\t\t\t\t\tconst FSoProjectileRuntimeData& RuntimeData,\n\t\t\t\t\t\t\t\t\t\t\t\tAActor* Spawner)\n{\n\tDECLARE_SCOPE_CYCLE_COUNTER(TEXT(\"ActivateProjectile_Internal\"), STAT_ActivateProjectile_Internal, STATGROUP_SoProjectile);\n\n\t// override some data\n\tRuntimeDataPtr = &RuntimeData;\n\tSpawnerActor = Spawner;\n\tRemainingHitCount = InitData.HitCountBeforeDestroyed;\n\tconst bool OptionList[] = { bKillProjectileOnTargetHit, true, false };\n\tbCurrentKillProjectileOnTargetHit = OptionList[static_cast<int32>(InitData.TargetHitBehaviourOverride)];\n\tActorsAlreadyHit.Empty();\n\n\tif (ProjectileMovementComponent != nullptr)\n\t{\n\t\tProjectileMovementComponent->ProjectileGravityScale = InitData.GravityScale;\n\t\tif (InitData.bSetVelocityAsMaxSpeed)\n\t\t\tProjectileMovementComponent->MaxSpeed = InitData.Velocity.Size();\n\t}\n\n\t// Setup max lifetime\n\tGetWorld()->GetTimerManager().SetTimer(LifeTimer, this, &ASoProjectile::DestroyProjectile, InitData.MaxLifeTime, false);\n\n\t// Spawner immunity timer\n\tif (InitData.SpawnerProtectionTime > KINDA_SMALL_NUMBER)\n\t{\n\t\tbDoNotDamageSpawner = true;\n\t\tFTimerDelegate TimerCallback;\n\t\tTimerCallback.BindLambda([&] { bDoNotDamageSpawner = false; });\n\t\tGetWorld()->GetTimerManager().SetTimer(SpawnerImmunityTimer, TimerCallback, InitData.SpawnerProtectionTime, false);\n\t}\n\telse\n\t\tbDoNotDamageSpawner = false;\n\n\tSetActorScale3D(InitData.Scale);\n\n\t// activate components\n\tif (bEnableMovementOnActivate && ProjectileMovementComponent != nullptr)\n\t{\n\t\tif (PrimitiveComponent != nullptr)\n\t\t\tProjectileMovementComponent->SetUpdatedComponent(PrimitiveComponent);\n\t\tProjectileMovementComponent->SetComponentTickEnabled(true);\n\t}\n\tif (PrimitiveComponent != nullptr)\n\t{\n\t\tPrimitiveComponent->SetVisibility(true, true);\n\t\tif (bEnableCollisionOnActivate)\n\t\t\tPrimitiveComponent->SetCollisionEnabled(PrimitiveComponentCollisionType);\n\t}\n\n\t// reset dmg in case it was modified\n\tif (ASoProjectile* Proj = Cast<ASoProjectile>(GetClass()->GetDefaultObject()))\n\t\tDefaultRuntimeData.Damage = Proj->DefaultRuntimeData.Damage;\n\n\tOnProjectileActivatedBP();\n\n\tbCollisionActiveOnPrimitiveComponent = true;\n\tif (CollisionActiveDistanceFromPlayerSquered > 0.0f && CollisionRefreshFrequency > 0.0f)\n\t{\n\t\tUpdateCollision();\n\t\tGetWorld()->GetTimerManager().SetTimer(CollisionRefreshTimer, this, &ASoProjectile::UpdateCollision, CollisionRefreshFrequency, true);\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoProjectile::DeactivateProjectile()\n{\n\tOnProjectileDeactivatedBP();\n\n\tRuntimeDataPtr = nullptr;\n\tSpawnerActor = nullptr;\n\n\tGetWorld()->GetTimerManager().ClearTimer(LifeTimer);\n\tGetWorld()->GetTimerManager().ClearTimer(SpawnerImmunityTimer);\n\tGetWorld()->GetTimerManager().ClearTimer(CollisionRefreshTimer);\n\n\tif (ProjectileMovementComponent != nullptr)\n\t\tProjectileMovementComponent->SetComponentTickEnabled(false);\n\n\tif (PrimitiveComponent != nullptr)\n\t{\n\t\tPrimitiveComponent->SetVisibility(false, true);\n\t\tPrimitiveComponent->SetCollisionEnabled(ECollisionEnabled::NoCollision);\n\t}\n\n\t// to avoid 1 frame glitches on next activation?!\n\tSetActorLocation(FVector(0.0f, 0.0f, 0.0f));\n\n\tSFXOverride = nullptr;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool ASoProjectile::IsSplineProjectile() const\n{\n\treturn Cast<USoProjectileMovementComponent>(ProjectileMovementComponent) != nullptr;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoProjectile::DestroyProjectile_Implementation()\n{\n\tOnProjectileDestroyed();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoProjectile::OnDestroyStartDisableTimers()\n{\n\tGetWorld()->GetTimerManager().ClearTimer(LifeTimer);\n\tGetWorld()->GetTimerManager().ClearTimer(SpawnerImmunityTimer);\n\tGetWorld()->GetTimerManager().ClearTimer(CollisionRefreshTimer);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoProjectile::OnProjectileDestroyed()\n{\n\tDeactivateProjectile();\n\tOnDeathNotify.Broadcast(this);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoProjectile::OnTargetHit_Implementation(AActor* OtherActor, const FHitResult& SweepResult)\n{\n\tDECLARE_SCOPE_CYCLE_COUNTER(TEXT(\"OnTargetHit_Implementation\"), STAT_OnTargetHit_Implementation, STATGROUP_SoProjectile);\n\n\tif (RuntimeDataPtr != nullptr && !ActorsAlreadyHit.Contains(OtherActor))\n\t{\n\t\tHitReactDesc.HitReact = RuntimeDataPtr->HitReactType;\n\t\tHitReactDesc.AssociatedActor = RuntimeDataPtr->AssociatedActor == nullptr ? this : RuntimeDataPtr->AssociatedActor;\n\t\tHitReactDesc.Irresistibility = RuntimeDataPtr->Irresistibility;\n\t\tHitReactDesc.AssociatedBones = { SweepResult.BoneName };\n\n\t\tOnTargetHitReallyHappened(OtherActor, SweepResult);\n\n\t\tif (VFXOnTargetHit != nullptr)\n\t\t{\n\t\t\tconst FVector MyActorLocation = GetActorLocation();\n\t\t\tFVector SpawnLocation = MyActorLocation;\n\n\t\t\tif (ACharacter* Character = Cast<ACharacter>(OtherActor))\n\t\t\t{\n\t\t\t\tUSkeletalMeshComponent* SkeletalMesh = Character->GetMesh();\n\t\t\t\tFHitResult Hit;\n\t\t\t\tif (SkeletalMesh->LineTraceComponent(Hit, MyActorLocation, Character->GetActorLocation(), FCollisionQueryParams::DefaultQueryParam))\n\t\t\t\t{\n\t\t\t\t\tif (Hit.BoneName != NAME_None)\n\t\t\t\t\t{\n\t\t\t\t\t\tFVector ImpactPoint;\n\t\t\t\t\t\tif (SkeletalMesh->GetClosestPointOnCollision(MyActorLocation, ImpactPoint, Hit.BoneName) > 0.0f)\n\t\t\t\t\t\t\tSpawnLocation = ImpactPoint;\n\n\t\t\t\t\t\tif (bAttachImpactToTarget)\n\t\t\t\t\t\t\tUGameplayStatics::SpawnEmitterAttached(VFXOnTargetHit, SkeletalMesh, Hit.BoneName, SpawnLocation, FRotator::ZeroRotator, EAttachLocation::KeepWorldPosition);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (!bAttachImpactToTarget)\n\t\t\t\tUGameplayStatics::SpawnEmitterAtLocation(GetWorld(), VFXOnTargetHit, SpawnLocation);\n\t\t}\n\n\t\tif (EffectToApplyOnTarget != ESoVisualEffect::EVE_MAX)\n\t\t\tISoMortal::Execute_DisplayVisualEffect(OtherActor, EffectToApplyOnTarget);\n\n\t\t// Reduce friendly fire effect\n\t\tFSoDmg Dmg = bCanUseDamageOverride ? RuntimeDataPtr->Damage : DefaultRuntimeData.Damage;\n\t\tif (bReduceDmgAgainstNotPlayer && USoStaticHelper::GetPlayerCharacterAsActor(this) != OtherActor)\n\t\t\tDmg *= 0.1f;\n\n\t\tISoMortal::Execute_CauseDmg(OtherActor, Dmg, HitReactDesc);\n\n\t\tUSoAudioManager::PlayHitReactSFX(\n\t\t\tthis,\n\t\t\tOtherActor,\n\t\t\tGetActorTransform(),\n\t\t\tHitReactDesc,\n\t\t\tSFXOnTargetHit,\n\t\t\tSFXOnEnemyTargetHit2D,\n\t\t\tSFXOnTargetDeath,\n\t\t\tSFXOnEnemyTargetHit\n\t\t);\n\n\t\tif (bCurrentKillProjectileOnTargetHit)\n\t\t\tDestroyProjectile();\n\t\telse if (bHitOneActorOnlyOnce)\n\t\t\tActorsAlreadyHit.Add(OtherActor);\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool ASoProjectile::HasDamage() const\n{\n\treturn (RuntimeDataPtr != nullptr &&\n\t\t(RuntimeDataPtr->Damage.Physical > 0.0f || RuntimeDataPtr->Damage.Magical > 0.0f));\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoProjectile::ForceUpdate_Implementation(float DeltaTime)\n{\n\tif (ProjectileMovementComponent != nullptr)\n\t{\n\t\tconst float MaxDeltaPerCall = 0.2f;\n\t\tfor (int32 i = 0; i < DeltaTime / MaxDeltaPerCall; ++i)\n\t\t\tProjectileMovementComponent->TickComponent(MaxDeltaPerCall, ELevelTick::LEVELTICK_All, nullptr);\n\n\t\tProjectileMovementComponent->TickComponent(FMath::Fmod(DeltaTime, MaxDeltaPerCall), ELevelTick::LEVELTICK_All, nullptr);\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoProjectile::OnOverlapBegin(UPrimitiveComponent* OverlappedComponent, AActor* OtherActor, UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult & SweepResult)\n{\n\tDECLARE_SCOPE_CYCLE_COUNTER(TEXT(\"OnOverlapBegin\"), STAT_OnOverlapBegin, STATGROUP_SoProjectile);\n\n\tif (OtherActor->Implements<USoMortal>() &&\n\t\t((OtherActor != SpawnerActor || !bDoNotDamageSpawner) &&\n\t\t\t!(bDoNotDamageSpawner && SpawnerActor == nullptr)) &&\n\t\t\t((!bOnlyHitAliveTargets) || ISoMortal::Execute_IsAlive(OtherActor)))\n\t{\n\t\tOnTargetHit(OtherActor, SweepResult);\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoProjectile::OnHitCallback(UPrimitiveComponent* Comp, AActor* OtherActor, UPrimitiveComponent* OtherComp, FVector NormalImpulse, const FHitResult& Hit)\n{\n\tif (RemainingHitCount > 0)\n\t{\n\t\tRemainingHitCount -= 1;\n\t\tif (RemainingHitCount == 0)\n\t\t{\n\t\t\tOnHitBP(Hit, false);\n\t\t\tDestroyProjectile();\n\t\t}\n\t\telse\n\t\t\tOnHitBP(Hit, true);\n\t}\n\telse\n\t\tOnHitBP(Hit, true);\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoProjectile::UpdateCollision()\n{\n\tif (AActor* Player = USoStaticHelper::GetPlayerCharacterAsActor(this))\n\t{\n\t\tconst FVector Loc = Player->GetActorLocation();\n\t\tconst bool bShouldCheckOverlaps = (Loc - GetActorLocation()).SizeSquared() < CollisionActiveDistanceFromPlayerSquered;\n\t\tif (bShouldCheckOverlaps != bCollisionActiveOnPrimitiveComponent)\n\t\t{\n\t\t\tensure(PrimitiveComponent);\n\n\t\t\tif (bShouldCheckOverlaps)\n\t\t\t\tPrimitiveComponent->SetCollisionEnabled(PrimitiveComponentCollisionType);\n\t\t\telse\n\t\t\t\tPrimitiveComponent->SetCollisionEnabled(ECollisionEnabled::NoCollision);\n\n\t\t\tbCollisionActiveOnPrimitiveComponent = bShouldCheckOverlaps;\n\t\t\tOnCollisionUpdatedBP(bCollisionActiveOnPrimitiveComponent);\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "Source/SOrb/Projectiles/SoProjectile.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#pragma once\n\n#include \"GameFramework/Actor.h\"\n\n#include \"CharacterBase/SoIMortalTypes.h\"\n#include \"SoProjectileTypes.h\"\n\n#include \"SoProjectile.generated.h\"\n\nclass ASoProjectile;\nDECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FSoProjectileNotify, ASoProjectile*, Projectile);\n\nDECLARE_STATS_GROUP(TEXT(\"SoProjectile\"), STATGROUP_SoProjectile, STATCAT_Advanced);\n\n\nclass UFMODEvent;\nclass UParticleSystem;\nclass UProjectileMovementComponent;\n\nUCLASS()\nclass SORB_API ASoProjectile : public AActor\n{\n\tGENERATED_BODY()\n\npublic:\n\tASoProjectile();\n\n\tvirtual void OnConstruction(const FTransform& Transform) override;\n\tvirtual void BeginPlay() override;\n\n\t/**\n\t * Activates the projectile: collision and rendering is enabled, transformation and velocity is reinitialized\n\t *\n\t * @param InitialLocation \tInitial location the projectile is spawned at\n\t * @param InitialRotation \tOrientation of projectile, velocity is relative to this\n\t * @param InitData \t\t\tData from spawner used to initialize the projectile\n\t * @param RuntimeData\t\tData the projectile will need while its active. The passed value must be valid while the projectile is active!\n\t * @param Spawner\t\t\tThe spawner actor, he won't be effected by the projectile for a while\n\t */\n\tvoid ActivateProjectile(const FVector& InitialLocation,\n\t\t\t\t\t\t\tconst FRotator& InitialRotation,\n\t\t\t\t\t\t\tconst FSoProjectileInitData* InitDataOverride = nullptr,\n\t\t\t\t\t\t\tconst FSoProjectileRuntimeData* RuntimeData = nullptr,\n\t\t\t\t\t\t\tAActor* Spawner = nullptr);\n\n\t/**\n\t * Like above, but on spline. Projectile is expected to be spline based\n\t *\n\t * @param OffsetFromSpline \tFix offset from the real spline location, it is interpolated to FVector(0, 0, 0)\n\t * @param RuntimeData\t\tData the projectile will need while its active. The passed value must be valid while the projectile is active!\n\t * @param InitDataOverride\tData from spawner used to initialize the projectile\n\t * @param Spawner\t\t\tThe spawner actor, he won't be effected by the projectile for a while\n\t */\n\tvoid ActivateProjectileOnSpline(const struct FSoSplinePoint& SplineLocation,\n\t\t\t\t\t\t\t\t\tfloat LocationZ,\n\t\t\t\t\t\t\t\t\tconst FVector& OffsetFromSpline,\n\t\t\t\t\t\t\t\t\tconst FRotator& InitialRotation,\n\t\t\t\t\t\t\t\t\tconst FSoProjectileInitData* InitDataOverride = nullptr,\n\t\t\t\t\t\t\t\t\tconst FSoProjectileRuntimeData* RuntimeData = nullptr,\n\t\t\t\t\t\t\t\t\tAActor* Spawner = nullptr);\n\n\t///**\n\t// * Like above, but on spline, initialized with 3D velocity\n\t// *\n\t// * @param OffsetFromSpline \tFix offset from the real spline location, it is interpolated to FVector(0, 0, 0)\n\t// * @param RuntimeData\t\tData the projectile will need while its active. The passed value must be valid while the projectile is active!\n\t// * @param InitDataOverride\tData from spawner used to initialize the projectile\n\t// * @param Spawner\t\t\tThe spawner actor, he won't be effected by the projectile for a while\n\t// */\n\t//void ActivateProjectileOnSpline(const struct FSoSplinePoint& SplineLocation,\n\t//\t\t\t\t\t\t\t\tconst FVector& Location,\n\t//\t\t\t\t\t\t\t\tconst FVector& OffsetFromSpline,\n\t//\t\t\t\t\t\t\t\tconst FRotator& InitialRotation,\n\t//\t\t\t\t\t\t\t\tconst FSoProjectileInitData* InitDataOverride = nullptr,\n\t//\t\t\t\t\t\t\t\tconst FSoProjectileRuntimeData* RuntimeData = nullptr,\n\t//\t\t\t\t\t\t\t\tAActor* Spawner = nullptr);\n\n\t/**\n\t * Deactivates the projectile: collision and rendering is disabled, stored runtime data is cleared\n\t * It does not \"kill\" the projectile with fadeout, it is instantly turned off\n\t * Must be called only if the projectile is stopped from outside, projectile calls it before OnDeathNotify is fired\n\t */\n\tvoid DeactivateProjectile();\n\n\t/** Velocity is changed to FVector(0, 0, |Velocity|) */\n\tvoid ForceVelocityToZ();\n\n\n\t/**\n\t *  Called if the projectile became inactive, spawner is supposed to place it back to the pool\n\t *  Projectile can't do it itself, because the spawner has to keep a list of projectiles and that list must be updated as well\n\t *  It is a must, because we must be able to reset any projectile e.g. on reload\n\t */\n\tUPROPERTY(BlueprintAssignable)\n\tFSoProjectileNotify OnDeathNotify;\n\n\tbool IsSplineProjectile() const;\n\n\tconst FSoProjectileInitData& GetDefaultInitData() const { return DefaultInitData; }\n\n\tUFUNCTION(BlueprintPure, Category = Projectile)\n\tbool HasDamage() const;\n\n\tUFUNCTION(BlueprintNativeEvent)\n\tvoid ForceUpdate(float DeltaTime);\n\n\tUFUNCTION(BlueprintCallable)\n\tvoid SetSFXOverride(UFMODEvent* SFX) { SFXOverride = SFX; }\n\n\t/** Projectile template dmg is reset to class default on activate */\n\tUFUNCTION(BlueprintCallable)\n\tvoid OverrideDamage(const FSoDmg& Dmg) { DefaultRuntimeData.Damage = Dmg; }\n\n\tUFUNCTION(BlueprintPure, Category = \">Projectile\")\n\tFSoDmg GetDamage() { return DefaultRuntimeData.Damage; }\n\nprotected:\n\n\t/**\n\t * Called when the projectile has to die, default implementation simply deactivates the projectile via calling OnProjectileDestroyed()\n\t * OnProjectileDestroyed() must be called in custom implementation as well (can be delayed)\n\t */\n\tUFUNCTION(BlueprintNativeEvent, BlueprintCallable, Category = \"SoProjectile\")\n\tvoid DestroyProjectile();\n\n\t/** must be called if the projectile dies in a \"natural\" way, fires death notify and deactivates projectile */\n\tUFUNCTION(BlueprintCallable, Category = \"SoProjectile\")\n\tvoid OnProjectileDestroyed();\n\n\t/** disable all c++ timers on the projectile because it is already being destroyed */\n\tUFUNCTION(BlueprintCallable, Category = \"SoProjectile\")\n\tvoid OnDestroyStartDisableTimers();\n\n\n\t/** Called after the projectile is activated */\n\tUFUNCTION(BlueprintImplementableEvent, Category = \"SoProjectile\")\n\tvoid OnProjectileActivatedBP();\n\n\t/** Called before the projectile is deactivated */\n\tUFUNCTION(BlueprintImplementableEvent, Category = \"SoProjectile\")\n\tvoid OnProjectileDeactivatedBP();\n\n\n\tUFUNCTION(BlueprintNativeEvent, BlueprintCallable)\n\tvoid OnTargetHit(AActor* OtherActor, const FHitResult& SweepResult);\n\n\tUFUNCTION(BlueprintImplementableEvent)\n\tvoid OnTargetHitReallyHappened(AActor* OtherActor, const FHitResult& SweepResult);\n\n\n\n\t/** Called when the PrimitiveComponent overlaps */\n\tUFUNCTION()\n\tvoid OnOverlapBegin(UPrimitiveComponent* OverlappedComponent, AActor* OtherActor, UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult & SweepResult);\n\n\t/** Called when the PrimitiveComponent collides */\n\tUFUNCTION()\n\tvoid OnHitCallback(UPrimitiveComponent* Comp, AActor* OtherActor, UPrimitiveComponent* OtherComp, FVector NormalImpulse, const FHitResult& Hit);\n\n\t/** should be only called if CollisionActiveDistanceFromPlayer is set to a sane value */\n\tUFUNCTION()\n\tvoid UpdateCollision();\n\n\tUFUNCTION(BlueprintImplementableEvent)\n\tvoid OnCollisionUpdatedBP(bool bEnabled);\n\n\tUFUNCTION(BlueprintImplementableEvent)\n\tvoid OnHitBP(const FHitResult& Hit, bool bStillAlive);\n\nprivate:\n\n\t/**\n\t* Activates the projectile: collision and rendering is enabled\n\t*\n\t* @param InitData \t\t\tData from spawner used to initialize the projectile\n\t* @param RuntimeData\t\tData the projectile will need while its active. The passed value must be valid while the projectile is active!\n\t* @param Spawner\t\t\tThe spawner actor, he won't be effected by the projectile for a while\n\t*/\n\tvoid ActivateProjectile_Internal(const FSoProjectileInitData& InitData,\n\t\t\t\t\t\t\t\t\t const FSoProjectileRuntimeData& RuntimeData,\n\t\t\t\t\t\t\t\t\t AActor* Spawner);\n\nprotected:\n\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere, Category = \"SoProjectileData\")\n\tbool bEnableCollisionOnActivate = true;\n\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere, Category = \"SoProjectileData\")\n\tbool bEnableMovementOnActivate = true;\n\n\t/** Used if the spawner does not want to override it */\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere, Category = \"SoProjectileData\")\n\tFSoProjectileInitData DefaultInitData;\n\n\t/** Used if the spawner does not want to override it */\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere, Category = \"SoProjectileData\")\n\tFSoProjectileRuntimeData DefaultRuntimeData;\n\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere, Category = \"SoProjectileData\")\n\tbool bCanUseDamageOverride = true;\n\n\t/** weather the projectile is destroyed or not if it hits a mortal */\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere, Category = \"SoProjectileData\")\n\tbool bKillProjectileOnTargetHit = true;\n\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere, Category = \"SoProjectileData\")\n\tbool bHitOneActorOnlyOnce = true;\n\n\tUPROPERTY(BlueprintReadWrite, Category = \"SoProjectileData\")\n\tbool bCurrentKillProjectileOnTargetHit = true;\n\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere, Category = \"SoProjectileData\")\n\tbool bOnlyHitAliveTargets = false;\n\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere, Category = \"SoProjectileData\")\n\tbool bReduceDmgAgainstNotPlayer = true;\n\n\n\t/** must be created in Blueprint and initialized in BP BeginPlay(), but optional, simply ignored if not set */\n\tUPROPERTY(BlueprintReadWrite)\n\tUProjectileMovementComponent* ProjectileMovementComponent = nullptr;\n\n\t/** must be created in Blueprint and initialized in BP BeginPlay() */\n\tUPROPERTY(BlueprintReadWrite)\n\tUPrimitiveComponent* PrimitiveComponent;\n\n\tconst FSoProjectileRuntimeData* RuntimeDataPtr = nullptr;\n\n\tUPROPERTY(EditAnywhere)\n\tfloat ZSpawnOffset = 0.0f;\n\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere)\n\tTEnumAsByte<ECollisionEnabled::Type> PrimitiveComponentCollisionType = ECollisionEnabled::QueryAndPhysics;\n\n\tUPROPERTY(BlueprintReadWrite)\n\tAActor* SpawnerActor = nullptr;\n\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere)\n\tFSoHitReactDesc HitReactDesc;\n\n\tUPROPERTY(BlueprintReadWrite)\n\tfloat RemainingHitCount = -1;\n\n\tUPROPERTY(BlueprintReadWrite)\n\tbool bDoNotDamageSpawner = false;\n\n\tUPROPERTY(BlueprintReadWrite)\n\tTSet<AActor*> ActorsAlreadyHit;\n\n\t//\n\t// SFX\n\t//\n\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere, Category = SFX)\n\tUFMODEvent* SFXOnTargetHit = nullptr;\n\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere, Category = SFX)\n\tUFMODEvent* SFXOnTargetDeath = nullptr;\n\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere, Category = SFX)\n\tUFMODEvent* SFXOnEnemyTargetHit = nullptr;\n\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere, Category = SFX)\n\tUFMODEvent* SFXOnEnemyTargetHit2D = nullptr;\n\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere, Category = SFX)\n\tUFMODEvent* SFXOverride = nullptr;\n\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere, Category = VFX)\n\tUParticleSystem* VFXOnTargetHit = nullptr;\n\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere, Category = VFX)\n\tbool bAttachImpactToTarget = false;\n\n\t/** effect applied to target - so he can hanle it instead of this actor */\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere, Category = VFX)\n\tESoVisualEffect EffectToApplyOnTarget = ESoVisualEffect::EVE_MAX;\n\n\t/** used with OnLifetimeOver() to deactivate projectile after its lifetime is expired, must be reset if the projectile is deactivated before */\n\tFTimerHandle LifeTimer;\n\n\t/** used to save spawner from instant suicide on projectile spawn */\n\tFTimerHandle SpawnerImmunityTimer;\n\n\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere, Category = PerfTrick)\n\tfloat CollisionRefreshFrequency = -1.0f;\n\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere, Category = PerfTrick)\n\tfloat CollisionActiveDistanceFromPlayerSquered = -1.0f;\n\n\tbool bCollisionActiveOnPrimitiveComponent = true;\n\n\t/**\n\t *  Used if CollisionRefreshFrequency > 0 and CollisionActiveDistanceFromPlayer > 0\n\t *  We only enable collision on the primitive component if the player is in CollisionActiveDistanceFromPlayer\n\t */\n\tFTimerHandle CollisionRefreshTimer;\n};\n"
  },
  {
    "path": "Source/SOrb/Projectiles/SoProjectileMovementComponent.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#include \"SoProjectileMovementComponent.h\"\n\n#include \"Components/SplineComponent.h\"\n\n#include \"Basic/Helpers/SoMathHelper.h\"\n#include \"SplineLogic/SoSpline.h\"\n#include \"SoProjectile.h\"\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoProjectileMovementComponent::InitializeComponent()\n{\n\tSuper::InitializeComponent();\n\tSplineLocation.SetReferenceActor(GetOwner());\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoProjectileMovementComponent::TickComponent(float DeltaTime, enum ELevelTick TickType, FActorComponentTickFunction *ThisTickFunction)\n{\n\tDECLARE_SCOPE_CYCLE_COUNTER(TEXT(\"Movement - TickComponent\"), STAT_Movement_TickComponent, STATGROUP_SoProjectile);\n\n\tfloat ZDistanceFromSpline = 0.0f;\n\tif (bKeepZFromSpline && SplineLocation.GetSpline() != nullptr)\n\t\tZDistanceFromSpline = UpdatedComponent->GetComponentLocation().Z - FVector(SplineLocation).Z;\n\n\tif (OffsetFromSplineLocation.Size() > KINDA_SMALL_NUMBER)\n\t\tOffsetFromSplineLocation = FMath::VInterpTo(OffsetFromSplineLocation, FVector(0.0f, 0.0f, 0.0f), DeltaTime, InterpSpeed);\n\n\tSuper::TickComponent(DeltaTime, TickType, ThisTickFunction);\n\n\tif (ASoSpline* Spline = SplineLocation.GetSpline())\n\t{\n\t\tconst FVector VelDir = SplineLocation.GetDirectionFromVector(Velocity) * FVector2D(Velocity).Size();\n\t\tVelocity.X = VelDir.X;\n\t\tVelocity.Y = VelDir.Y;\n\n\t\tif (bOrientRotationAlongSpline)\n\t\t{\n\t\t\tconst FVector Tangent = Spline->GetSplineComponent()->GetTangentAtDistanceAlongSpline(SplineLocation.GetDistance(), ESplineCoordinateSpace::World);\n\t\t\tUpdatedComponent->SetWorldRotation(Tangent.Rotation());\n\t\t}\n\n\t\tif (bKeepZFromSpline)\n\t\t{\n\t\t\tFVector Location = UpdatedComponent->GetComponentLocation();\n\t\t\tLocation.Z = FVector(SplineLocation).Z + ZDistanceFromSpline;\n\t\t\tUpdatedComponent->SetWorldLocation(Location);\n\t\t}\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFVector USoProjectileMovementComponent::ComputeMoveDelta(const FVector& InVelocity, float DeltaTime) const\n{\n\treturn UProjectileMovementComponent::ComputeMoveDelta(InVelocity, DeltaTime);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoProjectileMovementComponent::MoveUpdatedComponentImpl(const FVector& Delta, const FQuat& NewRotation, bool bSweep, FHitResult* OutHit, ETeleportType Teleport)\n{\n\tDECLARE_SCOPE_CYCLE_COUNTER(TEXT(\"Movement - MoveUpdatedComponentImpl\"), STAT_Movement_MoveUpdatedComponentImpl, STATGROUP_SoProjectile);\n\n\tif (SplineLocation.GetSpline() == nullptr)\n\t\treturn Super::MoveUpdatedComponentImpl(Delta, NewRotation, bSweep, OutHit, Teleport);\n\n\n\tif (UpdatedComponent)\n\t{\n\t\tconst int32 DirModifier = ((FVector2D(SplineLocation.GetDirection()) | FVector2D(Delta)) > 0) ? 1 : -1;\n\t\tconst float DeltaX = Delta.Size2D() * DirModifier;\n\n\t\tconst FVector2D OldLocation = FVector2D(UpdatedComponent->GetComponentLocation()) + FVector2D(OffsetFromSplineLocation);\n\t\tconst FVector2D NewLocation = SplineLocation + DeltaX;\n\n\t\tconst FVector DeltaVector = FVector(NewLocation - OldLocation, Delta.Z);\n\t\tconst bool bMoved = UpdatedComponent->MoveComponent(DeltaVector, NewRotation, bSweep, OutHit, MoveComponentFlags, Teleport);\n\n\t\tif (bMoved)\n\t\t{\n\t\t\tfloat MovedPercent = 1.0f;\n\t\t\tif (OutHit && OutHit->bBlockingHit)\n\t\t\t\tMovedPercent = OutHit->Time;\n\n\t\t\tbool bLeftSpline = false;\n\t\t\tfloat RestTime = 0.0f;\n\t\t\tSplineLocation.ProjectAndAddToDistance(DeltaX * MovedPercent, bLeftSpline, RestTime);\n\n\t\t\tif (bLeftSpline)\n\t\t\t{\n\t\t\t\tSplineLocation.SetSpline(nullptr);\n\t\t\t\tMoveUpdatedComponentImpl(DeltaVector * RestTime, NewRotation, bSweep, OutHit, Teleport);\n\n\t\t\t\tOnSplineLeft.Broadcast();\n\t\t\t}\n\t\t\treturn true;\n\t\t}\n\t}\n\treturn false;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoProjectileMovementComponent::ResolvePenetrationImpl(const FVector& Adjustment, const FHitResult& Hit, const FQuat& NewRotation)\n{\n\t//\tif (SplineLocation.GetSpline() == nullptr)\n\treturn Super::ResolvePenetrationImpl(Adjustment, Hit, NewRotation);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFVector USoProjectileMovementComponent::ComputeBounceResult(const FHitResult& Hit, float TimeSlice, const FVector& MoveDelta)\n{\n\tDECLARE_SCOPE_CYCLE_COUNTER(TEXT(\"Movement - ComputeBounceResult\"), STAT_Movement_ComputeBounceResult, STATGROUP_SoProjectile);\n\n\tif (SplineLocation.GetSpline() == nullptr)\n\t\treturn Super::ComputeBounceResult(Hit, TimeSlice, MoveDelta);\n\n\n\tFVector TempVelocity = Velocity;\n\tconst FVector Normal = USoMathHelper::GetProjectedNormal(TempVelocity, Hit.Normal);\n\tconst float VDotNormal = (TempVelocity | Normal);\n\n\t// Only if velocity is opposed by normal\n\t// if (VDotNormal < 0.f)\n\t{\n\t\t// Project velocity onto normal in reflected direction.\n\t\tconst FVector ProjectedNormal = Normal * -VDotNormal;\n\n\t\t// Point velocity in direction parallel to surface\n\t\tTempVelocity += ProjectedNormal;\n\n\t\t// Only tangential velocity should be affected by friction.\n\t\tconst float ScaledFriction = (bBounceAngleAffectsFriction || bIsSliding) ? FMath::Clamp(-VDotNormal / TempVelocity.Size(), 0.f, 1.f) * Friction : Friction;\n\t\tTempVelocity *= FMath::Clamp(1.f - ScaledFriction, 0.f, 1.f);\n\n\t\t// Coefficient of restitution only applies perpendicular to impact.\n\t\tTempVelocity += (ProjectedNormal * FMath::Max(Bounciness, 0.f));\n\n\t\t// Bounciness could cause us to exceed max speed.\n\t\tTempVelocity = LimitVelocity(TempVelocity);\n\t}\n\n\treturn TempVelocity;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFVector USoProjectileMovementComponent::ComputeAcceleration(const FVector& InVelocity, float DeltaTime) const\n{\n\treturn Super::ComputeAcceleration(InVelocity, DeltaTime) + ExtraAcceleration;\n}\n"
  },
  {
    "path": "Source/SOrb/Projectiles/SoProjectileMovementComponent.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#pragma once\n#include \"GameFramework/ProjectileMovementComponent.h\"\n#include \"SplineLogic/SoSplinePoint.h\"\n#include \"SoProjectileMovementComponent.generated.h\"\n\nDECLARE_DYNAMIC_MULTICAST_DELEGATE(FSoProjectileMovementNotify);\n\n/**\n *\n */\nUCLASS(ClassGroup = (Custom), meta = (BlueprintSpawnableComponent))\nclass SORB_API USoProjectileMovementComponent : public UProjectileMovementComponent\n{\n\tGENERATED_BODY()\n\npublic:\n\t//Begin UActorComponent Interface\n\tvirtual void InitializeComponent() override;\n\tvirtual void TickComponent(float DeltaTime, enum ELevelTick TickType, FActorComponentTickFunction *ThisTickFunction) override;\n\t//End UActorComponent Interface\n\n\tvoid SetSplineLocation(const FSoSplinePoint& InSplinePoint) { SplineLocation.CopySplineLocation(InSplinePoint); }\n\tconst FSoSplinePoint& GetSplineLocation() const { return SplineLocation; }\n\n\tvoid SetOffsetFromSplineLocation(const FVector& Offset) { OffsetFromSplineLocation = Offset; }\n\n\tvoid SetExtraAcceleration(const FVector& Value) { ExtraAcceleration = Value; }\n\nprotected:\n\n\tvirtual FVector ComputeMoveDelta(const FVector& InVelocity, float DeltaTime) const override;\n\tvirtual bool MoveUpdatedComponentImpl(const FVector& Delta, const FQuat& NewRotation, bool bSweep, FHitResult* OutHit = NULL, ETeleportType Teleport = ETeleportType::None) override;\n\tvirtual bool ResolvePenetrationImpl(const FVector& Adjustment, const FHitResult& Hit, const FQuat& NewRotation) override;\n\tvirtual FVector ComputeBounceResult(const FHitResult& Hit, float TimeSlice, const FVector& MoveDelta) override;\n\n\tvirtual FVector ComputeAcceleration(const FVector& InVelocity, float DeltaTime) const;\n\n\n\tUPROPERTY(BlueprintReadWrite, Category = Spline)\n\tFSoSplinePoint SplineLocation;\n\n\tUPROPERTY(BlueprintReadWrite, Category = Spline)\n\tFVector OffsetFromSplineLocation = FVector(0.0f, 0.0f, 0.0f);\n\n\tUPROPERTY(BlueprintReadWrite, Category = Spline)\n\tfloat InterpSpeed = 1.0f;\n\n\n\tUPROPERTY(BlueprintReadWrite, Category = Spline)\n\tFVector ExtraAcceleration = FVector(0.0f, 0.0f, 0.0f);\n\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Spline)\n\tbool bOrientRotationAlongSpline = false;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Spline)\n\tbool bKeepZFromSpline = false;\n\n\n\tUPROPERTY(BlueprintAssignable, Category = Spline)\n\tFSoProjectileMovementNotify OnSplineLeft;\n};\n\n"
  },
  {
    "path": "Source/SOrb/Projectiles/SoProjectileSpawnerAutomata.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#include \"SoProjectileSpawnerAutomata.h\"\n\n#include \"Engine/World.h\"\n#include \"TimerManager.h\"\n#include \"Components/ArrowComponent.h\"\n\n#include \"Kismet/GameplayStatics.h\"\n\n#include \"SaveFiles/SoWorldState.h\"\n#include \"Basic/SoGameInstance.h\"\n#include \"SplineLogic/SoSplineHelper.h\"\n#include \"SplineLogic/SoSpline.h\"\n#include \"Character/SoCharacter.h\"\n#include \"Basic/Helpers/SoStaticHelper.h\"\n#include \"Basic/SoTimerManager.h\"\n#include \"Basic/SoGameMode.h\"\n#include \"SaveFiles/SoWorldStateBlueprint.h\"\n#include \"Basic/SoAudioManager.h\"\n#include \"SoProjectile.h\"\n#include \"Basic/Helpers/SoPlatformHelper.h\"\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nASoProjectileSpawnerAutomata::ASoProjectileSpawnerAutomata()\n{\n\tArrowComponent = CreateDefaultSubobject<UArrowComponent>(TEXT(\"SoArrow\"));\n\tSetRootComponent(ArrowComponent);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoProjectileSpawnerAutomata::OnConstruction(const FTransform& Transform)\n{\n\tSuper::OnConstruction(Transform);\n\n\tif (bUpdateSplineLocation)\n\t{\n\t\tif (bSpawnProjectileOnSpline)\n\t\t{\n\t\t\tUSoSplineHelper::UpdateSplineLocationRef(this, SplineLocationPtr, false, false);\n\n\t\t\t// store reference if they are on the same level - some child may work in editor\n\t\t\tif (SplineLocationPtr.IsValid())\n\t\t\t{\n\t\t\t\tFSoSplinePoint Point = SplineLocationPtr.Extract();\n\t\t\t\tif (Point.GetSpline()->GetLevel() == GetLevel())\n\t\t\t\t\tSplineLocation = Point;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tSplineLocationPtr = {};\n\t\t\tSplineLocation = {};\n\t\t}\n\t}\n\tArrowComponent->SetArrowColor(SplineLocationPtr.IsValid() ? SplineColor : NonSplineColor);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoProjectileSpawnerAutomata::BeginPlay()\n{\n\tDECLARE_SCOPE_CYCLE_COUNTER(TEXT(\"SpawnerAutomata - BeginPlay\"), STAT_SpawnerAutomata_BeginPlay, STATGROUP_SoProjectile);\n\n\tif (PreSimulationTime > KINDA_SMALL_NUMBER)\n\t\tStartPreSimulation();\n\n\tif (bSpawnProjectileOnSpline)\n\t{\n\t\tSplineLocation = SplineLocationPtr.Extract();\n\t\tSplineLocation.SetReferenceZ(GetActorLocation().Z);\n\n\t\tif (!SplineLocation.IsValid(false))\n\t\t{\n\t\t\tUE_LOG(LogTemp, Warning, TEXT(\"ASoProjectileSpawnerAutomata %s was supposed to spawn stuff on spline but the spline isn't setup correctly!\"), *GetName());\n\t\t\tbSpawnProjectileOnSpline = false;\n\t\t}\n\t}\n\n\tSuper::BeginPlay();\n\n\t// build spline list from spline ptr-s\n\tfor (TAssetPtr<ASoSpline>& SplinePtr : WhiteListedSplinePtrList)\n\t{\n\t\tASoSpline* Spline = SplinePtr.Get();\n\t\tif (Spline != nullptr)\n\t\t\tWhiteListedSplineList.Add(Spline);\n\t}\n\n\tif (bSerializeState)\n\t\tUSoEventHandlerHelper::SubscribeToSoPostLoad(this);\n\telse\n\t{\n\t\tif (bActiveByDefault &&\n\t\t\t(!ShouldUseWhitelistedSplines() || CharIsOnWhitelistedSplines()))\n\t\t\tStartExecution();\n\t}\n\n\tif (ShouldUseWhitelistedSplines())\n\t{\n\t\tASoCharacter* Character = USoStaticHelper::GetPlayerCharacterAsSoCharacter(this);\n\t\tif (Character != nullptr)\n\t\t{\n\t\t\tCharacter->OnPlayerSplineChanged.AddDynamic(this, &ASoProjectileSpawnerAutomata::OnPlayerSplineChanged);\n\t\t}\n\t}\n\n\tbPreSimulationPhase = false;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoProjectileSpawnerAutomata::EndPlay(const EEndPlayReason::Type EndPlayReason)\n{\n\tif (ShouldUseWhitelistedSplines())\n\t{\n\t\tASoCharacter* Character = USoStaticHelper::GetPlayerCharacterAsSoCharacter(this);\n\t\tif (Character != nullptr)\n\t\t\tCharacter->OnPlayerSplineChanged.RemoveDynamic(this, &ASoProjectileSpawnerAutomata::OnPlayerSplineChanged);\n\t\tWhiteListedSplineList.Empty();\n\t}\n\n\tClearSpawnedProjectiles();\n\tStopExecution(false);\n\n\tif (bSerializeState)\n\t\tUSoEventHandlerHelper::UnsubscribeFromSoPostLoad(this);\n\n\tClearTimer();\n\n\tSuper::EndPlay(EndPlayReason);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoProjectileSpawnerAutomata::HandleSoPostLoad_Implementation()\n{\n\tcheck(bSerializeState);\n\n\tClearSpawnedProjectiles();\n\tStopExecution(false);\n\tconst bool bChanged = USoWorldState::IsActorNameInSet(this);\n\tif (bChanged != bActiveByDefault &&\n\t\t(!ShouldUseWhitelistedSplines() || CharIsOnWhitelistedSplines()))\n\t\tStartExecution();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoProjectileSpawnerAutomata::HandlePlayerRematerialize_Implementation()\n{\n\tcheck(bResetOnPlayerRematerialize);\n\n\tClearSpawnedProjectiles();\n\tStopExecution(true);\n\tif (bActiveByDefault)\n\t\tStartExecution();\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoProjectileSpawnerAutomata::Trigger_Implementation(const FSoTriggerData& InTriggerData)\n{\n\tif (InTriggerData.SourceIdentifier > 0)\n\t{\n\t\tif (MaxSpawnedProjectileNum <= 0 || SpawnedProjectiles.Num() < MaxSpawnedProjectileNum)\n\t\tStartExecution();\n\t}\n\telse\n\t\tStopExecution(true);\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoProjectileSpawnerAutomata::StartExecution()\n{\n\tDECLARE_SCOPE_CYCLE_COUNTER(TEXT(\"SpawnerAutomata - StartExecution\"), STAT_SpawnerAutomata_StartExecution, STATGROUP_SoProjectile);\n\n\tif (ShouldUseWhitelistedSplines())\n\t{\n\t\tASoCharacter* Character = USoStaticHelper::GetPlayerCharacterAsSoCharacter(this);\n\t\tif (Character != nullptr)\n\t\t{\n\t\t\tif (!WhiteListedSplineList.Contains(ISoSplineWalker::Execute_GetSplineLocationI(Character).GetSpline()))\n\t\t\t{\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\n\tif (!bWorking && (TimeTable.Num() > 0 || !bStartWithWait))\n\t{\n\t\tbWorking = true;\n\t\tUpdateSerializedState();\n\n\t\tif (FirstTimeOffset > KINDA_SMALL_NUMBER)\n\t\t{\n\t\t\tActiveIndex = -1;\n\t\t\tClearTimer();\n\t\t\tTimerID = USoStaticHelper::GetSoTimerManager(this).SetTimer(this, &ASoProjectileSpawnerAutomata::Fire, FirstTimeOffset);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif (bStartWithWait)\n\t\t\t{\n\t\t\t\tActiveIndex = 0;\n\t\t\t\tClearTimer();\n\t\t\t\tTimerID = USoStaticHelper::GetSoTimerManager(this).SetTimer(this, &ASoProjectileSpawnerAutomata::Fire, TimeTable[0]);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tActiveIndex = -1;\n\t\t\t\tFire();\n\t\t\t}\n\t\t}\n\n\n\t\tif (bResetOnPlayerRematerialize)\n\t\t\tUSoEventHandlerHelper::SubscribeToPlayerRematerialize(this);\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoProjectileSpawnerAutomata::StopExecution(bool bCanUpdateSerializedState)\n{\n\t// outside of if because this stops the end trigger timer as well which happens when bWorking is false\n\tClearTimer();\n\tif (bWorking || bCanUpdateSerializedState)\n\t{\n\t\tActiveIndex = -1;\n\t\tbWorking = false;\n\n\t\tif (bResetOnPlayerRematerialize && SpawnedProjectiles.Num() == 0)\n\t\t\tUSoEventHandlerHelper::UnsubscribeFromPlayerRematerialize(this);\n\n\t\tif (bCanUpdateSerializedState)\n\t\t\tUpdateSerializedState();\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoProjectileSpawnerAutomata::Fire()\n{\n\tDECLARE_SCOPE_CYCLE_COUNTER(TEXT(\"SpawnerAutomata - Fire\"), STAT_SpawnerAutomata_Fire, STATGROUP_SoProjectile);\n\n\tClearTimer();\n\tTimerID = -1;\n\tif (bWorking)\n\t{\n\t\tbool bFired = true;\n\t\tif (bTeleportAbovePlayer)\n\t\t{\n\t\t\tbFired = false;\n\t\t\tconst float Z = GetActorLocation().Z;\n\t\t\tif (AActor* Player = UGameplayStatics::GetPlayerCharacter(this, 0))\n\t\t\t{\n\t\t\t\tFVector Transform = Player->GetActorLocation();\n\t\t\t\tTransform.Z = TeleportAbovePlayerZDist > 0.0f ? Transform.Z + TeleportAbovePlayerZDist : Z;\n\t\t\t\tSetActorLocation(Transform);\n\n\t\t\t\tif (ISoMortal::Execute_IsAlive(Player))\n\t\t\t\t{\n\t\t\t\t\tOnFireProjectiles();\n\t\t\t\t\tbFired = true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse\n\t\t\tOnFireProjectiles();\n\n\t\tif (TriggerOnFire != nullptr && bFired)\n\t\t\tUSoTriggerHelper::TriggerActor(TriggerOnFire, TriggerOnFireValue);\n\n\t\tOnProjectileSpawned.Broadcast();\n\n\t\tif (SFXOnFire != nullptr && bFired)\n\t\t\tUSoAudioManager::PlaySoundAtLocation(this, SFXOnFire, GetActorTransform());\n\n\t\tActiveIndex += 1;\n\n\t\tif (!TimeTable.IsValidIndex(ActiveIndex))\n\t\t{\n\t\t\tif (!bLoop)\n\t\t\t{\n\t\t\t\tStopExecution(true);\n\t\t\t\tif (TriggerTargetList.Num() > 0)\n\t\t\t\t{\n\t\t\t\t\tif (TriggerDelay > KINDA_SMALL_NUMBER)\n\t\t\t\t\t\tTimerID = USoStaticHelper::GetSoTimerManager(this).SetTimer(this, &ASoProjectileSpawnerAutomata::TriggerTargets, TriggerDelay);\n\t\t\t\t\telse\n\t\t\t\t\t\tTriggerTargets();\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tActiveIndex = 0;\n\t\t}\n\t\tTimerID = USoStaticHelper::GetSoTimerManager(this).SetTimer(this, &ASoProjectileSpawnerAutomata::Fire, TimeTable[ActiveIndex]);\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoProjectileSpawnerAutomata::TriggerTargets()\n{\n\tfor (AActor* Target : TriggerTargetList)\n\t\tISoTriggerable::Execute_Trigger(Target, TriggerData);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoProjectileSpawnerAutomata::OnProjectileDied(ASoProjectile* Projectile)\n{\n\tClearSpawnedProjectile(Projectile);\n\tSpawnedProjectiles.RemoveSwap(Projectile);\n\n\tif (SpawnedProjectiles.Num() == 0)\n\t\tOnAllSpawnedProjectileDied.Broadcast();\n\n\tif (!bWorking && bResetOnPlayerRematerialize && SpawnedProjectiles.Num() == 0)\n\t\tUSoEventHandlerHelper::UnsubscribeFromPlayerRematerialize(this);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoProjectileSpawnerAutomata::OnPlayerSplineChanged(const ASoSpline* OldSpline, const ASoSpline* NewSpline)\n{\n\tconst bool bPlayerInWhitelisted = WhiteListedSplineList.Contains(NewSpline);\n\tif (!bPlayerInWhitelisted)\n\t{\n\t\tStopExecution(false);\n\n\t\tif (bKillProjectilesOnWhitelistedSplinesLeft)\n\t\t\tClearSpawnedProjectiles();\n\n\t\tif (TriggerOnStateChange != nullptr)\n\t\t\tUSoTriggerHelper::TriggerActor(TriggerOnStateChange, 0);\n\t}\n\telse\n\t{\n\t\tbool bStartExecution = bActiveByDefault;\n\t\tif (bSerializeState)\n\t\t{\n\t\t\tconst bool bChanged = USoWorldState::IsActorNameInSet(this);\n\t\t\tbStartExecution = (bChanged != bActiveByDefault);\n\t\t}\n\n\t\tif (bStartExecution && !bWorking)\n\t\t{\n\t\t\tif (PreSimulationTime > KINDA_SMALL_NUMBER && bPreSimulateOnWhitelistedSplineEnterred)\n\t\t\t\tStartPreSimulation();\n\n\t\t\tStartExecution();\n\t\t\tbPreSimulationPhase = false;\n\t\t}\n\t}\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoProjectileSpawnerAutomata::OnFireProjectiles_Implementation()\n{\n\tDECLARE_SCOPE_CYCLE_COUNTER(TEXT(\"SpawnerAutomata - OnFireProjectiles_Implementation\"), STAT_SpawnerAutomata_OnFireProjectiles_Implementation, STATGROUP_SoProjectile);\n\n\tif (ProjectileClass == nullptr)\n\t{\n\t\tUE_LOG(LogTemp, Warning, TEXT(\"Failed to spawn projectile: class is nullptr!\"));\n\t\treturn;\n\t}\n\n\tASoProjectile* Projectile = USoGameInstance::Get(this).ClaimProjectile(ProjectileClass);\n\tif (Projectile == nullptr)\n\t{\n\t\tUE_LOG(LogTemp, Warning, TEXT(\"Failed to spawn projectile %s!\"), *ProjectileClass->GetName());\n\t\treturn;\n\t}\n\n\tif (bSpawnProjectileOnSpline)\n\t{\n\t\tif (SplineLocation.GetSpline() == nullptr)\n\t\t{\n\n\t\t\tUE_LOG(LogTemp, Warning, TEXT(\"Failed to spawn projectile: invalid spline location! (%s)\"), *GetOwner()->GetClass()->GetName());\n\t\t\treturn;\n\t\t}\n\n\t\tconst FVector ActorLocation = GetActorLocation();\n\t\tconst FVector Offset = SplineLocation.ToVector(ActorLocation.Z) - ActorLocation;\n\t\tProjectile->ActivateProjectileOnSpline(SplineLocation,\n\t\t\t\t\t\t\t\t\t\t\t   ActorLocation.Z,\n\t\t\t\t\t\t\t\t\t\t\t   Offset,\n\t\t\t\t\t\t\t\t\t\t\t   GetActorRotation(),\n\t\t\t\t\t\t\t\t\t\t\t   bOverrideProjectileInitData ? &ProjectileInitData : nullptr,\n\t\t\t\t\t\t\t\t\t\t\t   bOverrideProjectileRuntimeData ? &ProjectileRuntimeData : nullptr,\n\t\t\t\t\t\t\t\t\t\t\t   this);\n\t}\n\telse\n\t\tProjectile->ActivateProjectile(GetActorLocation(),\n\t\t\t\t\t\t\t\t\t   GetActorRotation(),\n\t\t\t\t\t\t\t\t\t   bOverrideProjectileInitData ? &ProjectileInitData : nullptr,\n\t\t\t\t\t\t\t\t\t   bOverrideProjectileRuntimeData ? &ProjectileRuntimeData : nullptr,\n\t\t\t\t\t\t\t\t\t   GetOwner());\n\n\tProjectile->OnDeathNotify.AddDynamic(this, &ASoProjectileSpawnerAutomata::OnProjectileDied);\n\tSpawnedProjectiles.Add(Projectile);\n\tif (SFXProjectileImpactOverride != nullptr)\n\t\tProjectile->SetSFXOverride(SFXProjectileImpactOverride);\n\n\tif (bPreSimulationPhase)\n\t{\n\t\tconst float CurrentExtraTime = USoStaticHelper::GetSoTimerManager(this).GetExtraTime(this);\n\t\tif (CurrentExtraTime > KINDA_SMALL_NUMBER)\n\t\t{\n\t\t\tconst float TimeToSimulate = PreSimulationTime - CurrentExtraTime;\n\t\t\tProjectile->ForceUpdate(TimeToSimulate);\n\t\t}\n\t}\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoProjectileSpawnerAutomata::UpdateSerializedState()\n{\n\tif (bSerializeState)\n\t{\n\t\tif (bActiveByDefault == bWorking)\n\t\t\tUSoWorldState::RemoveActorNameFromSet(this);\n\t\telse\n\t\t\tUSoWorldState::AddActorNameToSet(this);\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoProjectileSpawnerAutomata::StartPreSimulation()\n{\n\tbPreSimulationPhase = true;\n\tUSoStaticHelper::GetSoTimerManager(this).SetExtraTime(this, PreSimulationTime);\n\tif (TriggerOnStateChange != nullptr)\n\t\tUSoTriggerHelper::TriggerActor(TriggerOnStateChange, 1);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoProjectileSpawnerAutomata::ClearTimer()\n{\n\tif (TimerID >= 0)\n\t\tTimerID = USoStaticHelper::GetSoTimerManager(this).ClearTimer(TimerID);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoProjectileSpawnerAutomata::ClearSpawnedProjectiles()\n{\n\tfor (auto* Projectile : SpawnedProjectiles)\n\t\tClearSpawnedProjectile(Projectile);\n\n\tSpawnedProjectiles.Empty();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoProjectileSpawnerAutomata::ClearSpawnedProjectile(ASoProjectile* Projectile)\n{\n\tif (Projectile == nullptr)\n\t\treturn;\n\n\tProjectile->OnDeathNotify.RemoveDynamic(this, &ASoProjectileSpawnerAutomata::OnProjectileDied);\n\tProjectile->DeactivateProjectile();\n\n\tUSoGameInstance::Get(this).ReturnProjectile(Projectile);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool ASoProjectileSpawnerAutomata::ShouldUseWhitelistedSplines() const\n{\n\tif (USoPlatformHelper::HasWeakHardware())\n\t\treturn WhiteListedSplineList.Num() > 0;\n\n\treturn WhiteListedSplineList.Num() > 0 && (!bUseWhitelistedSplinesOnlyOnSwitch);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool ASoProjectileSpawnerAutomata::CharIsOnWhitelistedSplines() const\n{\n\tif (ASoCharacter* Character = USoStaticHelper::GetPlayerCharacterAsSoCharacter(this))\n\t\treturn WhiteListedSplineList.Contains(USoStaticHelper::GetPlayerSplineLocation(this).GetSpline());\n\n\treturn false;\n}"
  },
  {
    "path": "Source/SOrb/Projectiles/SoProjectileSpawnerAutomata.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#pragma once\n\n#include \"GameFramework/Actor.h\"\n\n#include \"Basic/SoEventHandler.h\"\n#include \"Logic/SoTriggerable.h\"\n#include \"SplineLogic/SoSplinePointPtr.h\"\n#include \"SoProjectileTypes.h\"\n\n#include \"SoProjectileSpawnerAutomata.generated.h\"\n\nDECLARE_DYNAMIC_MULTICAST_DELEGATE(FSoProjectileSpawnNotify);\n\nclass ASoProjectile;\nclass UArrowComponent;\nclass UFMODEvent;\n\nUCLASS()\nclass SORB_API ASoProjectileSpawnerAutomata : public AActor, public ISoEventHandler, public ISoTriggerable\n{\n\tGENERATED_BODY()\n\npublic:\n\tASoProjectileSpawnerAutomata();\n\n\t// AActor:\n\n\tvirtual void OnConstruction(const FTransform& Transform) override;\n\tvirtual void BeginPlay() override;\n\tvirtual void EndPlay(const EEndPlayReason::Type EndPlayReason) override;\n\n\t// ISoEventHandler:\n\tvirtual void HandleSoPostLoad_Implementation() override;\n\tvirtual void HandlePlayerRematerialize_Implementation() override;\n\tvirtual void HandlePlayerRespawn_Implementation() override {};\n\tvirtual void HandleWhitelistedSplinesEntered_Implementation() override {};\n\tvirtual void HandleWhitelistedSplinesLeft_Implementation() override {};\n\n\t// ISoTriggerable\n\tvirtual void Trigger_Implementation(const FSoTriggerData& InTriggerData) override;\n\n\n\tUFUNCTION(BlueprintCallable, Category = \"SoProjectileSpawnerAutomata\")\n\tvoid StartExecution();\n\n\tUFUNCTION(BlueprintCallable, Category = \"SoProjectileSpawnerAutomata\")\n\tvoid StopExecution(bool bCanUpdateSerializedState);\n\n\tUFUNCTION()\n\tvoid Fire();\n\n\tUFUNCTION()\n\tvoid TriggerTargets();\n\n\tUFUNCTION()\n\tvoid OnProjectileDied(ASoProjectile* Projectile);\n\n\tUFUNCTION()\n\tvoid OnPlayerSplineChanged(const ASoSpline* OldSpline, const ASoSpline* NewSpline);\n\nprotected:\n\n\tUFUNCTION(BlueprintNativeEvent, Category = \"SoProjectileSpawnerAutomata\")\n\tvoid OnFireProjectiles();\n\n\tvoid UpdateSerializedState();\n\n\tvoid StartPreSimulation();\n\n\tvoid ClearTimer();\n\n\t/** Spawned Projectiles are deactivated and placed back to cache */\n\tvoid ClearSpawnedProjectiles();\n\tvoid ClearSpawnedProjectile(ASoProjectile* Projectile);\n\n\tbool ShouldUseWhitelistedSplines() const;\n\tbool CharIsOnWhitelistedSplines() const;\n\n\tUPROPERTY(BlueprintAssignable)\n\tFSoProjectileSpawnNotify OnProjectileSpawned;\n\n\tUPROPERTY(BlueprintAssignable)\n\tFSoProjectileSpawnNotify OnAllSpawnedProjectileDied;\n\nprotected:\n\n\t/** Projectiles are removed and state is reseted to default if set */\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = \"SoProjectileSpawnerAutomata\")\n\tbool bResetOnPlayerRematerialize = false;\n\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = \"SoProjectileSpawnerAutomata\")\n\tbool bActiveByDefault;\n\n\tUPROPERTY(BlueprintReadOnly, Category = \"SoProjectileSpawnerAutomata\")\n\tbool bWorking = false;\n\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = \"SoProjectileSpawnerAutomata\")\n\tbool bLoop;\n\n\t/** If it is set the state (if active or not) will be serialized. Should not be changed runtime */\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = \"SoProjectileSpawnerAutomata\")\n\tbool bSerializeState;\n\n\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = \"SoProjectileSpawnerAutomata\")\n\tfloat PreSimulationTime = -1.0f;\n\n\tUPROPERTY(BlueprintReadOnly)\n\tbool bPreSimulationPhase = false;\n\n\n\t/** Used each time in StartExecution before we wait for the first time, obviously skipped if < KINDA_SMALL_NUMBER */\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = \"SoProjectileSpawnerAutomata\")\n\tfloat FirstTimeOffset = -1.0f;\n\n\t/** used only if FirstTimeOffset is ~0, decides if the very first time we start with spawn or wait */\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = \"SoProjectileSpawnerAutomata\")\n\tbool bStartWithWait = true;\n\n\t/** Wait TimeTable[ActiveIndex], then a projectile is spawned and the index is increased */\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = \"SoProjectileSpawnerAutomata\")\n\tTArray<float> TimeTable;\n\n\n\t/**\n\t *  If this has any element the spawner resets and stays deactivated if the player isn't in one of the whitelisted splines\n\t *  Only works if it is always Active or if the state is serialized\n\t */\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = \"SoProjectileSpawnerAutomata\")\n\tTArray<TAssetPtr<ASoSpline>> WhiteListedSplinePtrList;\n\n\t/** weak hardware instead of switch now, but the name is kept because it is already used :( */\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = \"SoProjectileSpawnerAutomata\")\n\tbool bUseWhitelistedSplinesOnlyOnSwitch = false;\n\n\tUPROPERTY(BlueprintReadOnly, Category = \"SoProjectileSpawnerAutomata\")\n\tTArray<ASoSpline*> WhiteListedSplineList;\n\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = \"SoProjectileSpawnerAutomata\")\n\tbool bKillProjectilesOnWhitelistedSplinesLeft = false;\n\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = \"SoProjectileSpawnerAutomata\")\n\tbool bPreSimulateOnWhitelistedSplineEnterred = false;\n\n\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere, Category = \"SoProjectileData\")\n\tTSubclassOf<ASoProjectile> ProjectileClass;\n\n\n\t/** Used if >0, spawn request is ignored if this number matches the amount of projectiles alive */\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = \"SoProjectileData\")\n\tint32 MaxSpawnedProjectileNum = -1;\n\n\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = \"SoProjectileData\")\n\tbool bOverrideProjectileInitData = true;\n\n\t/** only used if bOverrideProjectileInitData is true */\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere, Category = \"SoProjectileData\")\n\tFSoProjectileInitData ProjectileInitData;\n\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = \"SoProjectileData\")\n\tbool bOverrideProjectileRuntimeData = true;\n\n\t/** only used if bOverrideProjectileRuntimeData is true */\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = \"SoProjectileData\")\n\tFSoProjectileRuntimeData ProjectileRuntimeData;\n\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = \"SoProjectileData\")\n\tbool bTeleportAbovePlayer = false;\n\n\t/** > 0 -> used, otherwise z is fixed */\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = \"SoProjectileData\")\n\tfloat TeleportAbovePlayerZDist = -1.0f;\n\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = \"SoProjectileData\")\n\tAActor* TriggerOnFire = nullptr;\n\n\t/** Triggers with 1 if execution starts, 0 if stops (whitelisted splines + begin play) */\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = \"SoProjectileData\")\n\tAActor* TriggerOnStateChange = nullptr;\n\n\tUPROPERTY(EditAnywhere, Category = SFX)\n\tUFMODEvent* SFXOnFire = nullptr;\n\n\tUPROPERTY(EditAnywhere, Category = SFX)\n\tUFMODEvent* SFXProjectileImpactOverride = nullptr;\n\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = \"SoProjectileData\")\n\tint32 TriggerOnFireValue = 1;\n\n\n\t/** if it is set to true the actor is aligned to spline and the projectile is spawned on it as well */\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = \"SoProjectileSplinity\")\n\tbool bSpawnProjectileOnSpline = false;\n\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = \"SoProjectileSplinity\")\n\tbool bUpdateSplineLocation = true;\n\n\t/** used only if bSpawnProjectileOnSpline */\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = \"SoProjectileSplinity\")\n\tFSoSplinePointPtr SplineLocationPtr;\n\n\t/** used only if bSpawnProjectileOnSpline */\n\tUPROPERTY(BlueprintReadOnly, Category = \"SoProjectileSplinity\")\n\tFSoSplinePoint SplineLocation;\n\n\n\t/** If bLoop isn't set once the projectile is finished it will trigger all these targets */\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = \"SoProjectileTriggerOnFinished\")\n\tTArray<AActor*> TriggerTargetList;\n\n\t/** delay between last projectile spawned and targets are triggered */\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = \"SoProjectileTriggerOnFinished\")\n\tfloat TriggerDelay;\n\n\t/** All actor is triggered with this same value */\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = \"SoProjectileTriggerOnFinished\")\n\tFSoTriggerData TriggerData;\n\n\n\n\tint32 ActiveIndex = -1;\n\n\t/** has to be destroyed if >=0 */\n\tint32 TimerID = -1;\n\n\tUPROPERTY()\n\tTArray<ASoProjectile*> SpawnedProjectiles;\n\n\tUPROPERTY(EditAnywhere)\n\tFLinearColor SplineColor = FLinearColor(1.0f, 0.0f, 0.0f, 1.0f);\n\n\tUPROPERTY(EditAnywhere)\n\tFLinearColor NonSplineColor = FLinearColor(0.0f, 2.0f, 1.0f, 1.0f);\n\n\t/** used to represent orientation, color tells if it is on spline or not */\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere, Category = \"SoProjectileSpawnerAutomata\")\n\tUArrowComponent* ArrowComponent;\n};\n"
  },
  {
    "path": "Source/SOrb/Projectiles/SoProjectileSpawnerComponent.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#include \"SoProjectileSpawnerComponent.h\"\n\n#include \"GameFramework/Actor.h\"\n\n#include \"Basic/SoGameInstance.h\"\n#include \"SplineLogic/SoSplineWalker.h\"\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUSoProjectileSpawnerComponent::USoProjectileSpawnerComponent()\n{\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoProjectileSpawnerComponent::InitializeComponent()\n{\n\tSuper::InitializeComponent();\n\n\tcheck(GetOwner());\n\n\tif (bSpawnProjectileOnSpline && !GetOwner()->GetClass()->ImplementsInterface(USoSplineWalker::StaticClass()))\n\t{\n\t\tbSpawnProjectileOnSpline = false;\n\t\tUE_LOG(LogTemp, Warning, TEXT(\"USoProjectileSpawnerComponent is marked bSpawnProjectileOnSpline but owner %s does not implement ISoSplineWalker!\"), *GetOwner()->GetClass()->GetName());\n\t}\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoProjectileSpawnerComponent::BeginPlay()\n{\n\tSuper::BeginPlay();\n\tHandleProjectileSpawnerBeginPlay();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoProjectileSpawnerComponent::EndPlay(const EEndPlayReason::Type EndPlayReason)\n{\n\tSuper::EndPlay(EndPlayReason);\n\tHandleProjectileSpawnerEndPlay();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoProjectileSpawnerComponent::HandleProjectileSpawnerBeginPlay()\n{\n\tif (bClearParticlesOnReload)\n\t\tUSoEventHandlerHelper::SubscribeToSoPostLoad(this);\n\tif (bClearParticlesOnPlayerRematerialize)\n\t\tUSoEventHandlerHelper::SubscribeToPlayerRematerialize(this);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoProjectileSpawnerComponent::HandleProjectileSpawnerEndPlay()\n{\n\tClearSpawnedProjectiles();\n\n\tif (bClearParticlesOnReload)\n\t\tUSoEventHandlerHelper::UnsubscribeFromSoPostLoad(this);\n\tif (bClearParticlesOnPlayerRematerialize)\n\t\tUSoEventHandlerHelper::UnsubscribeFromPlayerRematerialize(this);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoProjectileSpawnerComponent::ClearSpawnedProjectiles()\n{\n\tfor (auto* Projectile : SpawnedProjectiles)\n\t{\n\t\tif (Projectile != nullptr)\n\t\t{\n\t\t\tProjectile->DeactivateProjectile();\n\t\t\tProjectile->OnDeathNotify.RemoveDynamic(this, &USoProjectileSpawnerComponent::OnProjectileDied);\n\t\t\tUSoGameInstance::Get(GetOwner()).ReturnProjectile(Projectile);\n\t\t}\n\t}\n\n\tSpawnedProjectiles.Empty();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nASoProjectile* USoProjectileSpawnerComponent::SpawnProjectile()\n{\n\tif (bSpawnProjectileOnSpline)\n\t{\n\t\tFSoSplinePoint OwnerSplineLocation = ISoSplineWalker::Execute_GetSplineLocationI(GetOwner());\n\t\tif (OwnerSplineLocation.GetSpline() == nullptr)\n\t\t{\n\t\t\tUE_LOG(LogTemp, Warning, TEXT(\"Failed to spawn projectile: invalid spline location! (%s)\"), *GetOwner()->GetClass()->GetName());\n\t\t\treturn nullptr;\n\t\t}\n\t\tconst FVector ComponentLocation = GetComponentLocation();\n\t\tconst FVector Delta = ComponentLocation - FVector(OwnerSplineLocation);\n\t\tconst FSoSplinePoint StartSplineLocation = OwnerSplineLocation + OwnerSplineLocation.GetDirectionModifierFromVector(Delta) * Delta.Size2D();\n\t\tconst FVector Offset = FVector(StartSplineLocation) - ComponentLocation;\n\t\treturn SpawnProjectile_Internal(StartSplineLocation, ComponentLocation.Z, GetComponentRotation(), FVector(Offset.X, Offset.Y, 0.0f));\n\t}\n\n\treturn SpawnProjectile_Internal(GetComponentLocation(), GetComponentRotation());\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nASoProjectile* USoProjectileSpawnerComponent::SpawnProjectileFromClass(const TSubclassOf<ASoProjectile>& ClassToSpawn,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t   const FVector& Location,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t   const FRotator& Orientation,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t   const FSoProjectileInitData* InitDataOverride)\n{\n\tconst FSoProjectileInitData* InitDataPtr = InitDataOverride;\n\tif (InitDataPtr == nullptr)\n\t\tInitDataPtr = bOverrideProjectileInitData ? &ProjectileInitData : nullptr;\n\n\tASoProjectile* Projectile = USoGameInstance::Get(GetOwner()).ClaimProjectile(ClassToSpawn);\n\tProjectile->ActivateProjectile( Location,\n\t\t\t\t\t\t\t\t\tOrientation,\n\t\t\t\t\t\t\t\t\tInitDataPtr,\n\t\t\t\t\t\t\t\t\tbOverrideProjectileRuntimeData ? &ProjectileRuntimeData : nullptr,\n\t\t\t\t\t\t\t\t\tGetOwner());\n\n\tProjectile->OnDeathNotify.AddDynamic(this, &USoProjectileSpawnerComponent::OnProjectileDied);\n\tSpawnedProjectiles.Add(Projectile);\n\treturn Projectile;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nASoProjectile* USoProjectileSpawnerComponent::SpawnFromProjectile(const TSubclassOf<ASoProjectile> ClassToSpawn,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t  const FVector& Location,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t  const FRotator& Orientation)\n{\n\tif (ASoProjectile* Projectile = USoGameInstance::Get(GetOwner()).ClaimProjectile(ClassToSpawn))\n\t{\n\t\tProjectile->ActivateProjectile(Location, Orientation, nullptr, nullptr, GetOwner());\n\t\tProjectile->OnDeathNotify.AddDynamic(this, &USoProjectileSpawnerComponent::OnProjectileDied);\n\t\tSpawnedProjectiles.Add(Projectile);\n\t\treturn Projectile;\n\t}\n\n\treturn nullptr;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nASoProjectile* USoProjectileSpawnerComponent::SpawnFromProjectileOnSpline(const TSubclassOf<ASoProjectile> ClassToSpawn,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t  const FVector& Location,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t  const FRotator& Orientation,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t  const FSoSplinePoint& SplineLocation)\n{\n\tASoProjectile* Projectile = USoGameInstance::Get(GetOwner()).ClaimProjectile(ClassToSpawn);\n\n\tif (Projectile->IsSplineProjectile())\n\t\tProjectile->ActivateProjectileOnSpline(SplineLocation, Location.Z, FVector(0.0f, 0.0f, 0.0f), Orientation, nullptr, nullptr, GetOwner());\n\telse\n\t\tProjectile->ActivateProjectile(Location, Orientation, nullptr, nullptr, GetOwner());\n\n\tProjectile->OnDeathNotify.AddDynamic(this, &USoProjectileSpawnerComponent::OnProjectileDied);\n\tSpawnedProjectiles.Add(Projectile);\n\treturn Projectile;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nASoProjectile*  USoProjectileSpawnerComponent::SpawnProjectile_Internal(const FVector& Location, const FRotator& Rotation)\n{\n\tASoProjectile* Projectile = USoGameInstance::Get(GetOwner()).ClaimProjectile(ProjectileClass);\n\tif (Projectile != nullptr)\n\t{\n\t\tProjectile->ActivateProjectile( Location,\n\t\t\t\t\t\t\t\t\t\tRotation,\n\t\t\t\t\t\t\t\t\t\tbOverrideProjectileInitData ? &ProjectileInitData : nullptr,\n\t\t\t\t\t\t\t\t\t\tbOverrideProjectileRuntimeData ? &ProjectileRuntimeData : nullptr,\n\t\t\t\t\t\t\t\t\t\tGetOwner());\n\n\t\tProjectile->OnDeathNotify.AddDynamic(this, &USoProjectileSpawnerComponent::OnProjectileDied);\n\t\tSpawnedProjectiles.Add(Projectile);\n\t}\n\treturn Projectile;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nASoProjectile* USoProjectileSpawnerComponent::SpawnProjectile_Internal(const FSoSplinePoint& SplineLocation,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t   float ZValue,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t   const FRotator& Rotation,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t   const FVector& OffsetFromSpline)\n{\n\tDECLARE_SCOPE_CYCLE_COUNTER(TEXT(\"Spawner - SpawnProjectile_Internal\"), STAT_Spawner_SpawnProjectile_Internal, STATGROUP_SoProjectile);\n\n\tASoProjectile* Projectile = USoGameInstance::Get(GetOwner()).ClaimProjectile(ProjectileClass);\n\tif (SplineLocation.GetSpline() == nullptr)\n\t{\n\t\tUE_LOG(LogTemp, Warning, TEXT(\"Failed to spawn projectile: invalid spline location! (%s)\"), *GetOwner()->GetClass()->GetName());\n\t\treturn nullptr;\n\t}\n\tif (Projectile != nullptr)\n\t{\n\t\tProjectile->ActivateProjectileOnSpline(SplineLocation,\n\t\t\t\t\t\t\t\t\t\t\t\tZValue,\n\t\t\t\t\t\t\t\t\t\t\t\tOffsetFromSpline,\n\t\t\t\t\t\t\t\t\t\t\t\tRotation,\n\t\t\t\t\t\t\t\t\t\t\t\tbOverrideProjectileInitData ? &ProjectileInitData : nullptr,\n\t\t\t\t\t\t\t\t\t\t\t\tbOverrideProjectileRuntimeData ? &ProjectileRuntimeData : nullptr,\n\t\t\t\t\t\t\t\t\t\t\t\tGetOwner());\n\n\t\tProjectile->OnDeathNotify.AddDynamic(this, &USoProjectileSpawnerComponent::OnProjectileDied);\n\t\tSpawnedProjectiles.Add(Projectile);\n\t}\n\treturn Projectile;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoProjectileSpawnerComponent::OnProjectileDied(ASoProjectile* Projectile)\n{\n\tProjectile->OnDeathNotify.RemoveDynamic(this, &USoProjectileSpawnerComponent::OnProjectileDied);\n\tSpawnedProjectiles.RemoveSwap(Projectile);\n\tUSoGameInstance::Get(GetOwner()).ReturnProjectile(Projectile);\n}\n"
  },
  {
    "path": "Source/SOrb/Projectiles/SoProjectileSpawnerComponent.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#pragma once\n\n#include \"Components/ArrowComponent.h\"\n\n#include \"Projectiles/SoProjectile.h\"\n#include \"Basic/SoEventHandler.h\"\n\n#include \"SoProjectileSpawnerComponent.generated.h\"\n\n\nUCLASS(ClassGroup = (Custom), meta = (BlueprintSpawnableComponent))\nclass SORB_API USoProjectileSpawnerComponent : public UArrowComponent, public ISoEventHandler\n{\n\tGENERATED_BODY()\npublic:\n\tUSoProjectileSpawnerComponent();\n\n\tvirtual void InitializeComponent() override;\n\n\tvirtual void BeginPlay() override;\n\tvirtual void EndPlay(const EEndPlayReason::Type EndPlayReason) override;\n\n\tvirtual void HandleSoPostLoad_Implementation() override { ClearSpawnedProjectiles(); }\n\tvirtual void HandlePlayerRematerialize_Implementation() override { ClearSpawnedProjectiles(); }\n\tvirtual void HandlePlayerRespawn_Implementation() override {};\n\tvirtual void HandleWhitelistedSplinesEntered_Implementation() override {};\n\tvirtual void HandleWhitelistedSplinesLeft_Implementation() override {};\n\n\tvoid SetProjectileClass(TSubclassOf<ASoProjectile> NewProjectileClass) { ProjectileClass = NewProjectileClass; }\n\tvoid SetSpawnProjectileOnSpline(bool bOnSpline) { bSpawnProjectileOnSpline = bOnSpline;\t}\n\n\tUFUNCTION(BlueprintCallable, Category = \"SoProjectileSpawner\")\n\tASoProjectile* SpawnProjectile();\n\n\t/** Non-spline projectile with custom class, location, orientation - and maybe custom InitData, if it is not nullptr */\n\tASoProjectile* SpawnProjectileFromClass(const TSubclassOf<ASoProjectile>& ClassToSpawn,\n\t\t\t\t\t\t\t\t\t\t\tconst FVector& Location,\n\t\t\t\t\t\t\t\t\t\t\tconst FRotator& Orientation,\n\t\t\t\t\t\t\t\t\t\t\tconst FSoProjectileInitData* InitDataOverride = nullptr);\n\n\t/** Non-spline projectile with custom class, location, and orientation - uses the projectile data for init/runtime, not the component one */\n\tUFUNCTION(BlueprintCallable, Category = \"SoProjectileSpawner\")\n\tASoProjectile* SpawnFromProjectile(const TSubclassOf<ASoProjectile> ClassToSpawn,\n\t\t\t\t\t\t\t\t\t   const FVector& Location,\n\t\t\t\t\t\t\t\t\t   const FRotator& Orientation);\n\n\t/**\n\t *  Projectile with custom class, location, and orientation - uses the projectile data for init/runtime, not the component one\n\t *  Can be both Spline and Non-Spline projectile\n\t */\n\tASoProjectile* SpawnFromProjectileOnSpline(const TSubclassOf<ASoProjectile> ClassToSpawn,\n\t\t\t\t\t\t\t\t\t\t\t   const FVector& Location,\n\t\t\t\t\t\t\t\t\t\t\t   const FRotator& Orientation,\n\t\t\t\t\t\t\t\t\t\t\t   const FSoSplinePoint& SplineLocation);\n\n\tUFUNCTION()\n\tvirtual void OnProjectileDied(ASoProjectile* Projectile);\n\n\tbool GetOverrideProjectileInitData() const { return bOverrideProjectileInitData; }\n\tconst FSoProjectileInitData& GetProjectileInitData() const { return ProjectileInitData; }\n\n\tUFUNCTION(BlueprintPure, Category = \"SoProjectileSpawner\")\n\tbool HasActiveProjectile() const { return SpawnedProjectiles.Num() > 0; }\n\n\n\t/** Spawned Projectiles are deactivated and placed back to cache */\n\tUFUNCTION(BlueprintCallable)\n\tvoid ClearSpawnedProjectiles();\n\nprotected:\n\n\tASoProjectile* SpawnProjectile_Internal(const FVector& Location, const FRotator& Rotation);\n\tASoProjectile* SpawnProjectile_Internal(const FSoSplinePoint& SplineLocation,\n\t\t\t\t\t\t\t\t\t\t\tfloat ZValue,\n\t\t\t\t\t\t\t\t\t\t\tconst FRotator& Rotation,\n\t\t\t\t\t\t\t\t\t\t\tconst FVector& OffsetFromSpline);\n\nprotected:\n\n\t/** Called in BeginPlay  */\n\tvirtual void HandleProjectileSpawnerBeginPlay();\n\t/** Called in EndPlay */\n\tvirtual void HandleProjectileSpawnerEndPlay();\n\nprotected:\n\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = \"SoProjectileSpawner\")\n\tTSubclassOf<ASoProjectile> ProjectileClass;\n\n\t/**\n\t*  if it is set to true and the owner implements ISoSplineWalker interface the projectile is spawned on spline\n\t*  The projectile class must support splines in this case!!!\n\t*  Should not be changed runtime\n\t*/\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = \"SoProjectileSpawner\")\n\tbool bSpawnProjectileOnSpline = false;\n\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = \"SoProjectileSpawner\")\n\tbool bOverrideProjectileInitData = false;\n\n\t/** only used if bOverrideProjectileInitData is true */\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = \"SoProjectileSpawner\")\n\tFSoProjectileInitData ProjectileInitData;\n\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = \"SoProjectileSpawner\")\n\tbool bOverrideProjectileRuntimeData = false;\n\n\t/** only used if bOverrideProjectileRuntimeData is true */\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = \"SoProjectileSpawner\")\n\tFSoProjectileRuntimeData ProjectileRuntimeData;\n\n\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = \"SoProjectileSpawner\")\n\tbool bClearParticlesOnPlayerRematerialize = false;\n\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = \"SoProjectileSpawner\")\n\tbool bClearParticlesOnReload = true;\n\n\n\tUPROPERTY()\n\tTArray<ASoProjectile*> SpawnedProjectiles;\n};\n"
  },
  {
    "path": "Source/SOrb/Projectiles/SoProjectileTypes.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#pragma once\n\n#include \"CoreMinimal.h\"\n#include \"CharacterBase/SoIMortalTypes.h\"\n\n#include \"SoProjectileTypes.generated.h\"\n\nclass AActor;\n\nUENUM(BlueprintType)\nenum class ESoBehaviourOnTargetHit : uint8\n{\n\tEBOTH_UseDefault\t\t\tUMETA(DisplayName = \"UseDefault\"),\n\tEBOTH_KillProjectile\t\tUMETA(DisplayName = \"KillProjectile\"),\n\tEBOTH_Ignore\t\t\t\tUMETA(DisplayName = \"Ignore\")\n};\n\n\n/** init data from spawner */\nUSTRUCT(BlueprintType, Blueprintable)\nstruct FSoProjectileInitData\n{\n\tGENERATED_USTRUCT_BODY()\npublic:\n\n\t/**\n\t * Starting velocity, usage is a bit meh/overcomplicated\n\t * if Spline based:\n\t *\t\t\tif bShouldVelocityInfluenceDirection is false:\n\t *\t\t\t\t\t- X along spline, Y is vertical\n\t *\t\t\telse:\n\t *\t\t\t\t\t- X along forward vector (can contain Z as well), Y adds to that along (0,0,1) only\n\t * else:\n\t *\t\t\tif bShouldVelocityInfluenceDirection is false:\n\t *\t\t\t\t- X is along forward vector, Y is ignored\n\t *\t\t\telse:\n\t *\t\t\t\t- X and Y and ForwardVector somehow determines it, the way it used to be with bullets before projectiles\n\t */\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere)\n\tFVector2D Velocity;\n\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere)\n\tbool bSetVelocityAsMaxSpeed = false;\n\n\t/** old bullet like thing, can be still useful in some case */\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere)\n\tbool bShouldVelocityInfluenceDirection = false;\n\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere)\n\tFVector Scale = FVector(1.0f, 1.0f, 1.0f);\n\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere)\n\tfloat GravityScale = 0.0f;\n\n\t/* must be >0! */\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere, meta = (ClampMin = \"0.1\"))\n\tfloat MaxLifeTime = 20.0f;\n\n\t/* used if > 0 */\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere)\n\tint32 HitCountBeforeDestroyed = -1;\n\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere)\n\tfloat SpawnerProtectionTime = -2.0f;\n\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere)\n\tESoBehaviourOnTargetHit TargetHitBehaviourOverride = ESoBehaviourOnTargetHit::EBOTH_UseDefault;\n};\n\n\n/** runtime data from spawner */\nUSTRUCT(BlueprintType, Blueprintable)\nstruct FSoProjectileRuntimeData\n{\n\tGENERATED_USTRUCT_BODY()\n\npublic:\n\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere)\n\tFSoDmg Damage;\n\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere)\n\tESoHitReactType HitReactType = ESoHitReactType::EHR_Stun;\n\n\t/** the one used for hitreact in the case of break into peaces (normally the bullet is used) */\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere)\n\tAActor* AssociatedActor = nullptr;\n\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere)\n\tint32 Irresistibility = 0;\n};\n"
  },
  {
    "path": "Source/SOrb/Resources/Windows/Default-Win32-Debug.manifest",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<assembly xmlns=\"urn:schemas-microsoft-com:asm.v1\" manifestVersion=\"1.0\" xmlns:asmv3=\"urn:schemas-microsoft-com:asm.v3\">\n\n  <!-- Tell Vista we don't need administrator level access-->\n  <ms_asmv2:trustInfo xmlns:ms_asmv2=\"urn:schemas-microsoft-com:asm.v2\">\n    <ms_asmv2:security>\n      <ms_asmv2:requestedPrivileges>\n        <ms_asmv2:requestedExecutionLevel level=\"asInvoker\" uiAccess=\"false\" />\n      </ms_asmv2:requestedPrivileges>\n    </ms_asmv2:security>\n  </ms_asmv2:trustInfo>\n\n  <!-- Use themed common controls -->\n  <dependency>\n    <dependentAssembly>\n      <assemblyIdentity type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='x86' publicKeyToken='6595b64144ccf1df' />\n\t</dependentAssembly>\n  </dependency>\n\n  <!-- OS Support -->\n  <compatibility xmlns=\"urn:schemas-microsoft-com:compatibility.v1\">\n    <application>\n      <!-- Windows 10 -->\n      <supportedOS Id=\"{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}\"/>\n      <!-- Windows 8.1 -->\n      <supportedOS Id=\"{1f676c76-80e1-4239-95bb-83d0f6d0da78}\"/>\n      <!-- Windows Vista -->\n      <supportedOS Id=\"{e2011457-1546-43c5-a5fe-008deee3d3f0}\"/>\n      <!-- Windows 7 -->\n      <supportedOS Id=\"{35138b9a-5d96-4fbd-8e2d-a2440225f93a}\"/>\n      <!-- Windows 8 -->\n      <supportedOS Id=\"{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}\"/>\n    </application>\n  </compatibility>\n\n  <!-- Allow paths longer than MAX_PATH (also requires enabling per-system via group policy or registry entry) -->\n  <asmv3:application>\n    <windowsSettings xmlns:ws2=\"http://schemas.microsoft.com/SMI/2016/WindowsSettings\">\n      <ws2:longPathAware>true</ws2:longPathAware>\n    </windowsSettings>\n  </asmv3:application>\n\n</assembly>\n"
  },
  {
    "path": "Source/SOrb/Resources/Windows/Default-Win32.manifest",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<assembly xmlns=\"urn:schemas-microsoft-com:asm.v1\" manifestVersion=\"1.0\" xmlns:asmv3=\"urn:schemas-microsoft-com:asm.v3\">\n\n  <!-- Tell Vista we don't need administrator level access-->\n  <ms_asmv2:trustInfo xmlns:ms_asmv2=\"urn:schemas-microsoft-com:asm.v2\">\n    <ms_asmv2:security>\n      <ms_asmv2:requestedPrivileges>\n        <ms_asmv2:requestedExecutionLevel level=\"asInvoker\" uiAccess=\"false\" />\n      </ms_asmv2:requestedPrivileges>\n    </ms_asmv2:security>\n  </ms_asmv2:trustInfo>\n\n  <!-- Use themed common controls -->\n  <dependency>\n    <dependentAssembly>\n      <assemblyIdentity type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='x86' publicKeyToken='6595b64144ccf1df' />\n    </dependentAssembly>\n  </dependency>\n\n\t<!-- OS Support -->\n  <compatibility xmlns=\"urn:schemas-microsoft-com:compatibility.v1\">\n    <application>\n      <!-- Windows 10 -->\n      <supportedOS Id=\"{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}\"/>\n      <!-- Windows 8.1 -->\n      <supportedOS Id=\"{1f676c76-80e1-4239-95bb-83d0f6d0da78}\"/>\n      <!-- Windows Vista -->\n      <supportedOS Id=\"{e2011457-1546-43c5-a5fe-008deee3d3f0}\"/>\n      <!-- Windows 7 -->\n      <supportedOS Id=\"{35138b9a-5d96-4fbd-8e2d-a2440225f93a}\"/>\n      <!-- Windows 8 -->\n      <supportedOS Id=\"{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}\"/>\n    </application>\n  </compatibility>\n\n  <!-- Allow paths longer than MAX_PATH (also requires enabling per-system via group policy or registry entry) -->\n  <asmv3:application>\n    <windowsSettings xmlns:ws2=\"http://schemas.microsoft.com/SMI/2016/WindowsSettings\">\n      <ws2:longPathAware>true</ws2:longPathAware>\n    </windowsSettings>\n  </asmv3:application>\n\n</assembly>\n"
  },
  {
    "path": "Source/SOrb/Resources/Windows/Default-Win64-Debug.manifest",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<assembly xmlns=\"urn:schemas-microsoft-com:asm.v1\" manifestVersion=\"1.0\" xmlns:asmv3=\"urn:schemas-microsoft-com:asm.v3\">\n\n  <!-- Tell Vista we don't need administrator level access-->\n  <ms_asmv2:trustInfo xmlns:ms_asmv2=\"urn:schemas-microsoft-com:asm.v2\">\n    <ms_asmv2:security>\n      <ms_asmv2:requestedPrivileges>\n        <ms_asmv2:requestedExecutionLevel level=\"asInvoker\" uiAccess=\"false\" />\n      </ms_asmv2:requestedPrivileges>\n    </ms_asmv2:security>\n  </ms_asmv2:trustInfo>\n\n  <!-- Use themed common controls -->\n  <dependency>\n    <dependentAssembly>\n      <assemblyIdentity type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='amd64' publicKeyToken='6595b64144ccf1df' />\n    </dependentAssembly>\n  </dependency>\n\n  <!-- OS Support -->\n  <compatibility xmlns=\"urn:schemas-microsoft-com:compatibility.v1\">\n    <application>\n      <!-- Windows 10 -->\n      <supportedOS Id=\"{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}\"/>\n      <!-- Windows 8.1 -->\n      <supportedOS Id=\"{1f676c76-80e1-4239-95bb-83d0f6d0da78}\"/>\n      <!-- Windows Vista -->\n      <supportedOS Id=\"{e2011457-1546-43c5-a5fe-008deee3d3f0}\"/>\n      <!-- Windows 7 -->\n      <supportedOS Id=\"{35138b9a-5d96-4fbd-8e2d-a2440225f93a}\"/>\n      <!-- Windows 8 -->\n      <supportedOS Id=\"{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}\"/>\n    </application>\n  </compatibility>\n\n  <!-- Allow paths longer than MAX_PATH (also requires enabling per-system via group policy or registry entry) -->\n  <asmv3:application>\n    <windowsSettings xmlns:ws2=\"http://schemas.microsoft.com/SMI/2016/WindowsSettings\">\n      <ws2:longPathAware>true</ws2:longPathAware>\n    </windowsSettings>\n  </asmv3:application>\n\n</assembly>\n"
  },
  {
    "path": "Source/SOrb/Resources/Windows/Default-Win64.manifest",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<assembly xmlns=\"urn:schemas-microsoft-com:asm.v1\" manifestVersion=\"1.0\" xmlns:asmv3=\"urn:schemas-microsoft-com:asm.v3\">\n\n  <!-- Tell Vista we don't need administrator level access-->\n  <ms_asmv2:trustInfo xmlns:ms_asmv2=\"urn:schemas-microsoft-com:asm.v2\">\n    <ms_asmv2:security>\n      <ms_asmv2:requestedPrivileges>\n        <ms_asmv2:requestedExecutionLevel level=\"asInvoker\" uiAccess=\"false\" />\n      </ms_asmv2:requestedPrivileges>\n    </ms_asmv2:security>\n  </ms_asmv2:trustInfo>\n\n  <!-- Use themed common controls -->\n  <dependency>\n    <dependentAssembly>\n      <assemblyIdentity type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='amd64' publicKeyToken='6595b64144ccf1df' />\n    </dependentAssembly>\n  </dependency>\n\n  <!-- OS Support -->\n  <compatibility xmlns=\"urn:schemas-microsoft-com:compatibility.v1\">\n    <application>\n      <!-- Windows 10 -->\n      <supportedOS Id=\"{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}\"/>\n      <!-- Windows 8.1 -->\n      <supportedOS Id=\"{1f676c76-80e1-4239-95bb-83d0f6d0da78}\"/>\n      <!-- Windows Vista -->\n      <supportedOS Id=\"{e2011457-1546-43c5-a5fe-008deee3d3f0}\"/>\n      <!-- Windows 7 -->\n      <supportedOS Id=\"{35138b9a-5d96-4fbd-8e2d-a2440225f93a}\"/>\n      <!-- Windows 8 -->\n      <supportedOS Id=\"{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}\"/>\n    </application>\n  </compatibility>\n\n  <!-- Allow paths longer than MAX_PATH (also requires enabling per-system via group policy or registry entry) -->\n  <asmv3:application>\n    <windowsSettings xmlns:ws2=\"http://schemas.microsoft.com/SMI/2016/WindowsSettings\">\n      <ws2:longPathAware>true</ws2:longPathAware>\n    </windowsSettings>\n  </asmv3:application>\n\n</assembly>\n"
  },
  {
    "path": "Source/SOrb/Resources/Windows/Warriorb.rc",
    "content": "// Copyright 1998-2014 Epic Games, Inc. All Rights Reserved.\n\n//\n// Original file is at Engine/Build/Windows/Resources/Default.rc2\n//\n#include \"Runtime/Launch/Resources/Windows/resource.h\"\n#include \"Runtime/Core/Public/Misc/CoreMiscDefines.h\"\n#include \"Runtime/Launch/Resources/Version.h\"\n#include \"../WarriorbVersion.h\"\n\n#define APSTUDIO_READONLY_SYMBOLS\n#include <windows.h>\n#undef APSTUDIO_READONLY_SYMBOLS\n\n// Various strings used for project resources\n#ifdef PROJECT_COMPANY_NAME\n\t#define BUILD_PROJECT_COMPANY_NAME PREPROCESSOR_TO_STRING(PROJECT_COMPANY_NAME)\n#else\n\t#define BUILD_PROJECT_COMPANY_NAME EPIC_COMPANY_NAME\n#endif\n\n#ifdef PROJECT_COPYRIGHT_STRING\n\t#define BUILD_PROJECT_COPYRIGHT_STRING PREPROCESSOR_TO_STRING(PROJECT_COPYRIGHT_STRING)\n#else\n\t#define BUILD_PROJECT_COPYRIGHT_STRING EPIC_COPYRIGHT_STRING\n#endif\n\n#ifdef PROJECT_PRODUCT_NAME\n\t#define BUILD_PROJECT_PRODUCT_NAME PREPROCESSOR_TO_STRING(PROJECT_PRODUCT_NAME)\n#else\n\t#define BUILD_PROJECT_PRODUCT_NAME PREPROCESSOR_TO_STRING(UE_APP_NAME)\n#endif\n\n#ifdef PROJECT_PRODUCT_IDENTIFIER\n\t#define BUILD_PROJECT_PRODUCT_IDENTIFIER PREPROCESSOR_TO_STRING(PROJECT_PRODUCT_IDENTIFIER)\n#else\n\t#define BUILD_PROJECT_PRODUCT_IDENTIFIER EPIC_PRODUCT_IDENTIFIER\n#endif\n\n/////////////////////////////////////////////////////////////////////////////\n// English (United States) resources\n\n#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)\nLANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US\n#pragma code_page(1252)\n\n/////////////////////////////////////////////////////////////////////////////\n//\n// Version\n//\n\nVS_VERSION_INFO VERSIONINFO\n FILEVERSION ENGINE_MAJOR_VERSION,ENGINE_MINOR_VERSION,ENGINE_PATCH_VERSION,0\n PRODUCTVERSION ENGINE_MAJOR_VERSION,ENGINE_MINOR_VERSION,ENGINE_PATCH_VERSION,0\n FILEFLAGSMASK 0x17L\n#ifdef _DEBUG\n FILEFLAGS 0x1L\n#else\n FILEFLAGS 0x0L\n#endif\n FILEOS 0x4L\n FILETYPE 0x2L\n FILESUBTYPE 0x0L\nBEGIN\n\tBLOCK \"StringFileInfo\"\n\tBEGIN\n\t\tBLOCK \"040904b0\"\n\t\tBEGIN\n\t\t\tVALUE \"CompanyName\", BUILD_PROJECT_COMPANY_NAME\n\t\t\tVALUE \"LegalCopyright\", BUILD_PROJECT_COPYRIGHT_STRING\n\t\t\tVALUE \"ProductName\", BUILD_PROJECT_PRODUCT_NAME\n#ifdef WARRIORB_BUILD_ALL\n\t\t\tVALUE \"ProductVersion\", PREPROCESSOR_TO_STRING(WARRIORB_BUILD_ALL)\n#endif\n\t\t\tVALUE \"FileDescription\", BUILD_PROJECT_PRODUCT_NAME\n\t\t\tVALUE \"InternalName\", BUILD_PROJECT_PRODUCT_IDENTIFIER\n#ifdef ORIGINAL_FILE_NAME\n\t\t\tVALUE \"OriginalFilename\", PREPROCESSOR_TO_STRING(ORIGINAL_FILE_NAME)\n#endif\n\t\tEND\n\tEND\n\tBLOCK \"VarFileInfo\"\n\tBEGIN\n\t\tVALUE \"Translation\", 0x409, 1200\n\tEND\nEND\n\n\n/////////////////////////////////////////////////////////////////////////////\n//\n// Icon\n//\n\n// Icon with lowest ID value placed first to ensure application icon\n// remains consistent on all systems.\n\n#ifdef BUILD_ICON_FILE_NAME\nIDICON_UE4Game          ICON                    BUILD_ICON_FILE_NAME\n#endif\n\n/////////////////////////////////////////////////////////////////////////////\n//\n// Application Manifest\n//\n\n#if _DEBUG\n\n// Debug manifest\n#if _WIN64\n1\t\t\t\t\t\tRT_MANIFEST\t\t\t\t\"Default-Win64-Debug.manifest\"\n#else\n1\t\t\t\t\t\tRT_MANIFEST\t\t\t\t\"Default-Win32-Debug.manifest\"\n#endif\n\n#else\n\n// Release manifest\n#if _WIN64\n1\t\t\t\t\t\tRT_MANIFEST\t\t\t\t\"Default-Win64.manifest\"\n#else\n1\t\t\t\t\t\tRT_MANIFEST\t\t\t\t\"Default-Win32.manifest\"\n#endif\n\n#endif\n\n#endif    // English (United States) resources\n/////////////////////////////////////////////////////////////////////////////\n"
  },
  {
    "path": "Source/SOrb/SOrb.Build.cs",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\nusing System;\nusing System.IO;\nusing System.Diagnostics;\nusing System.Collections.Generic;\nusing System.Runtime.InteropServices;\nusing Tools.DotNETCommon;\n\nusing UnrealBuildTool;\n\n\npublic class SOrb : ModuleRules\n{\n\t// PublicDefinition flags\n\t//\n\t// NOTE: These flags have the default values for the desktop (usually)\n\t//\n\n\t// Enables/disable GameAnalytics plugin\n\t// NOTE: WARRIORB_WITH_ANALYTICS needs be also true\n\tpublic bool WARRIORB_WITH_GAMEANALYTICS = false;\n\n\t// Enables/disable the analytics providers, all of THEM\n\tpublic bool WARRIORB_WITH_ANALYTICS = false;\n\n\t// Enable/disable the default collection of analytics\n\tpublic readonly bool WARRIORB_COLLECT_ANALYTICS = true;\n\n\t// off by default\n\tpublic bool WARRIORB_WITH_ONLINE = false;\n\n\t// Enables/disable SDL2 plugin\n\tpublic readonly bool WARRIORB_WITH_SDL2 = false;\n\n\t// Enable/disable the char fake shadow\n\tpublic readonly bool WARRIORB_USE_CHARACTER_SHADOW = true;\n\n\t// Enable/disable the usage of the unreal save system\n\t// If this is enabled we use the unreal save (ISaveGameSystem) for saving and loading. These files are binary\n\t// NOTE: usually on consoles as our own implementation of the save does not support those platforms\n\tpublic readonly bool WARRIORB_USE_UNREAL_SAVE_SYSTEM = false;\n\n\t// Special variable we can override to fake non editor behaviour in editor\n\t// Usually just equal with WITH_EDITOR\n\tpublic readonly bool WARRIORB_WITH_EDITOR = false;\n\n\t//\n\t// INPUT\n\t//\n\n\t// Should we use the keyboard arrow preset as the default?\n\tpublic readonly bool WARRIORB_USE_ARROW_PRESET_AS_DEFAULT = true;\n\n\t//\n\t// DEBUG\n\t//\n\n\t// Simulate non editor behaviour\n\t// Set it to true to have non-editor behavior in editor regarding game start, saves, etc.\n\t// Mostly used in places where !WITH_EDITOR would be used\n\t// NOTE: does not affect analytics, use WARRIORB_NON_EDITOR_COLLECT_ANALYTICS_TEST for that\n\tpublic const bool WARRIORB_NON_EDITOR_TEST = false;\n\n\t// Simulate the collecting of events analytics like in the non editor\n\tpublic const bool WARRIORB_NON_EDITOR_COLLECT_ANALYTICS_TEST = false;\n\n\t// Simulate as we are on a console\n\tpublic const bool WARRIORB_CONSOLE_TEST = false;\n\n\t// Simulate like the platform does not support keyboard\n\tpublic const bool WARRIORB_NO_KEYBOARD_TEST = false;\n\n\tpublic SOrb(ReadOnlyTargetRules Target) : base(Target)\n\t{\n\t\tConsole.WriteLine(\"Using SOrb.Build.cs\");\n\t\tInit();\n\n\t\tif (!IsSupportedConsolePlatform && !IsSupportedDesktopPlatform)\n\t\t{\n\t\t\tFail(\"Target platform is not supported\");\n\t\t}\n\n\t\t// Aka WITH_EDITOR && !WARRIORB_NON_EDITOR_TEST\n\t\tWARRIORB_WITH_EDITOR = Target.bBuildEditor && !WARRIORB_NON_EDITOR_TEST;\n\n\t\t// Do not collect analytics in editor, only if the debug flag is set to true\n\t\t// Aka !WITH_EDITOR || WARRIORB_NON_EDITOR_COLLECT_ANALYTICS_TEST\n\t\tWARRIORB_COLLECT_ANALYTICS = !Target.bBuildEditor || WARRIORB_NON_EDITOR_COLLECT_ANALYTICS_TEST;\n\n\t\t// Console flags take precedence\n\t\tif (IsPlatformSwitch)\n\t\t{\n\t\t\tif (WARRIORB_USE_CHARACTER_SHADOW)\n\t\t\t{\n\t\t\t\tPrintYellow(\"Disabling the Character fake shadow (WARRIORB_USE_CHARACTER_SHADOW)\");\n\t\t\t\tWARRIORB_USE_CHARACTER_SHADOW = false;\n\t\t\t}\n\t\t}\n\t\tif (IsSupportedConsolePlatform)\n\t\t{\n\t\t\tPrintYellow(\"Disabling Analytics & GameAnalytics support because we are building for console\");\n\t\t\tWARRIORB_WITH_ANALYTICS = false;\n\t\t\tWARRIORB_COLLECT_ANALYTICS = false;\n\n\t\t\tif (WARRIORB_WITH_SDL2)\n\t\t\t{\n\t\t\t\tPrintYellow(\"Disabling SDL2 support because we are building for console\");\n\t\t\t\tWARRIORB_WITH_SDL2 = false;\n\t\t\t}\n\t\t\tif (WARRIORB_WITH_DISCORD)\n\t\t\t{\n\t\t\t\tPrintYellow(\"Disabling Discord support because we are building for console\");\n\t\t\t\tWARRIORB_WITH_DISCORD = false;\n\t\t\t}\n\t\t\tif (WARRIORB_WITH_STEAM)\n\t\t\t{\n\t\t\t\tPrintYellow(\"Disabling Steam support because we are building for console\");\n\t\t\t\tWARRIORB_WITH_STEAM = false;\n\t\t\t}\n\n\t\t\tPrintYellow(\"Enabling (WARRIORB_USE_UNREAL_SAVE_SYSTEM) the the Unreal Save System (ISaveGameSystem)\");\n\t\t\tWARRIORB_USE_UNREAL_SAVE_SYSTEM = true;\n\t\t}\n\t\tif (Target.bBuildEditor)\n\t\t{\n\t\t\tif (WARRIORB_NON_EDITOR_TEST)\n\t\t\t{\n\t\t\t\tPrintYellow(\"[DEBUG] WARRIORB_NON_EDITOR_TEST is set to TRUE, WARRIORB_WITH_EDITOR will be set to FALSE\");\n\t\t\t}\n\t\t\tif (WARRIORB_NON_EDITOR_COLLECT_ANALYTICS_TEST)\n\t\t\t{\n\t\t\t\tPrintYellow(\"[DEBUG] WARRIORB_NON_EDITOR_COLLECT_ANALYTICS_TEST is set to TRUE, WARRIORB_COLLECT_ANALYTICS will be set to TRUE\");\n\t\t\t}\n\n\t\t\tif (WARRIORB_WITH_DISCORD)\n\t\t\t{\n\t\t\t\tPrintYellow(\"Disabling WARRIORB_WITH_DISCORD because we are building for Editor\");\n\t\t\t\tWARRIORB_WITH_DISCORD = false;\n\t\t\t}\n\t\t\tif (WARRIORB_WITH_STEAM)\n\t\t\t{\n\t\t\t\tPrintYellow(\"Disabling WARRIORB_WITH_STEAM because we are building for Editor\");\n\t\t\t\tWARRIORB_WITH_STEAM = false;\n\t\t\t}\n\t\t}\n\n\t\tif (IsPlatformXboxOne)\n\t\t{\n\t\t\tPrintYellow(\"Enabling online because XBOX\");\n\t\t\tWARRIORB_WITH_ONLINE = true;\n\t\t}\n\n\t\tif (WARRIORB_DEMO)\n\t\t{\n\t\t\tPrintBlue(\"[DEMO] BUILD [DEMO]\");\n\t\t\tPrintYellow(\"[DEMO] BUILD [DEMO]\");\n\t\t\tPrintRed(\"[DEMO] BUILD [DEMO]\");\n\t\t\tConsole.WriteLine(\"\");\n\n\t\t\tif (WARRIORB_WITH_VIDEO_INTRO)\n\t\t\t{\n\t\t\t\tPrintYellow(\"Disabling WARRIORB_WITH_VIDEO_INTRO because we are building for Demo\");\n\t\t\t\tWARRIORB_WITH_VIDEO_INTRO = false;\n\t\t\t}\n\t\t}\n\t\tif (!WARRIORB_WITH_ANALYTICS)\n\t\t{\n\t\t\tWARRIORB_WITH_GAMEANALYTICS = false;\n\t\t\tPrintYellow(\"Disabling GameAnalytics (WARRIORB_WITH_ANALYTICS) because WARRIORB_WITH_ANALYTICS is false\");\n\t\t}\n\t\tif (WARRIORB_WITH_STEAM)\n\t\t{\n\t\t\tPrintYellow(\"Enabling online because we have steam enabled\");\n\t\t\tWARRIORB_WITH_ONLINE = true;\n\n\t\t\t// Disable some flags that should only be used in a NON demo build\n\t\t\tif (WARRIORB_DEMO || Target.bBuildEditor)\n\t\t\t{\n\t\t\t\tif (WARRIORB_RELAUNCH_IN_STEAM)\n\t\t\t\t{\n\t\t\t\t\tPrintYellow(\"Disabling WARRIORB_RELAUNCH_IN_STEAM because we are building for Demo/Editor\");\n\t\t\t\t\tWARRIORB_RELAUNCH_IN_STEAM = false;\n\t\t\t\t}\n\n\t\t\t\tif (WARRIORB_STEAM_CHECK_IF_LIBRARY_CHECKSUM_MATCHES)\n\t\t\t\t{\n\t\t\t\t\tPrintYellow(\"Disabling WARRIORB_STEAM_CHECK_IF_LIBRARY_CHECKSUM_MATCHES because we are building for Demo/Editor\");\n\t\t\t\t\tWARRIORB_STEAM_CHECK_IF_LIBRARY_CHECKSUM_MATCHES = false;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Disable some flags that should only be used in a Windows64 build\n\t\t\tif (!IsPlatformWindows64)\n\t\t\t{\n\t\t\t\tif (WARRIORB_RELAUNCH_IN_STEAM)\n\t\t\t\t{\n\t\t\t\t\tPrintYellow(\"Disabling WARRIORB_RELAUNCH_IN_STEAM because we are NOT building for Windows64\");\n\t\t\t\t\tWARRIORB_RELAUNCH_IN_STEAM = false;\n\t\t\t\t}\n\n\t\t\t\tif (WARRIORB_STEAM_CHECK_IF_LIBRARY_CHECKSUM_MATCHES)\n\t\t\t\t{\n\t\t\t\t\tPrintYellow(\"Disabling WARRIORB_STEAM_CHECK_IF_LIBRARY_CHECKSUM_MATCHES because we are NOT building for Windows64\");\n\t\t\t\t\tWARRIORB_STEAM_CHECK_IF_LIBRARY_CHECKSUM_MATCHES = false;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif (WARRIORB_RELAUNCH_IN_STEAM)\n\t\t\t{\n\t\t\t\tPrintYellow(\"Disabling WARRIORB_RELAUNCH_IN_STEAM because we are NOT building for Steam\");\n\t\t\t\tWARRIORB_RELAUNCH_IN_STEAM = false;\n\t\t\t}\n\t\t\tif (WARRIORB_STEAM_CHECK_IF_LIBRARY_CHECKSUM_MATCHES)\n\t\t\t{\n\t\t\t\tPrintYellow(\"Disabling WARRIORB_STEAM_CHECK_IF_LIBRARY_CHECKSUM_MATCHES because we are NOT building for Steam\");\n\t\t\t\tWARRIORB_STEAM_CHECK_IF_LIBRARY_CHECKSUM_MATCHES = false;\n\t\t\t}\n\t\t}\n\n\t\t//\n\t\t// Flags to use in C++\n\t\t//\n\n\t\t// DEBUG FLAGS\n\t\tPublicDefinitions.Add(\"WARRIORB_NON_EDITOR_TEST=\" + BoolToIntString(WARRIORB_NON_EDITOR_TEST));\n\t\tPublicDefinitions.Add(\"WARRIORB_NON_EDITOR_COLLECT_ANALYTICS_TEST=\" + BoolToIntString(WARRIORB_NON_EDITOR_COLLECT_ANALYTICS_TEST));\n\t\tPublicDefinitions.Add(\"WARRIORB_WITH_EDITOR=\" + BoolToIntString(WARRIORB_WITH_EDITOR));\n\t\tPublicDefinitions.Add(\"WARRIORB_CONSOLE_TEST=\" + BoolToIntString(WARRIORB_CONSOLE_TEST));\n\t\tPublicDefinitions.Add(\"WARRIORB_NO_KEYBOARD_TEST=\" + BoolToIntString(WARRIORB_NO_KEYBOARD_TEST));\n\n\t\t// Plugins\n\t\tPublicDefinitions.Add(\"WARRIORB_WITH_ONLINE=\" + BoolToIntString(WARRIORB_WITH_ONLINE));\n\n\t\t// Enable video demo support\n\t\tPublicDefinitions.Add(\"WARRIORB_WITH_VIDEO_DEMO=\" + BoolToIntString(WARRIORB_WITH_VIDEO_DEMO));\n\n\t\tPublicDefinitions.Add(\"WARRIORB_WITH_VIDEO_INTRO=\" + BoolToIntString(WARRIORB_WITH_VIDEO_INTRO));\n\n\t\t// Enable demo support aka WarriOrb: Prologue\n\t\tPublicDefinitions.Add(\"WARRIORB_DEMO=\" + BoolToIntString(WARRIORB_DEMO));\n\n\t\t// Game flags\n\t\tPublicDefinitions.Add(\"WARRIORB_USE_CHARACTER_SHADOW=\" + BoolToIntString(WARRIORB_USE_CHARACTER_SHADOW));\n\t\tPublicDefinitions.Add(\"WARRIORB_USE_UNREAL_SAVE_SYSTEM=\" + BoolToIntString(WARRIORB_USE_UNREAL_SAVE_SYSTEM));\n\t\tPublicDefinitions.Add(\"WARRIORB_USE_ARROW_PRESET_AS_DEFAULT=\" + BoolToIntString(WARRIORB_USE_ARROW_PRESET_AS_DEFAULT));\n\t\tPublicDefinitions.Add(\"WARRIORB_ALLOW_CONSOLE_CHEATS_DEFAULT=\" + BoolToIntString(WARRIORB_ALLOW_CONSOLE_CHEATS_DEFAULT));\n\t\tPublicDefinitions.Add(String.Format(\"WARRIORB_PASSWORD_ENABLE_CONSOLE_CHEATS=\\\"{0}\\\"\", WARRIORB_PASSWORD_ENABLE_CONSOLE_CHEATS));\n\t\tPublicDefinitions.Add(String.Format(\"WARRIORB_PASSWORD_SAVE_FILE=\\\"{0}\\\"\", WARRIORB_PASSWORD_SAVE_FILE));\n\n\t\tif (WARRIORB_WITH_ONLINE)\n\t\t{\n\t\t\tPublicDependencyModuleNames.Add(\"OnlineSubsystem\");\n\t\t\tPublicDependencyModuleNames.Add(\"OnlineSubsystemUtils\");\n\t\t\tif (IsPlatformXboxOne)\n\t\t\t\tPublicDependencyModuleNames.Add(\"OnlineSubsystemLive\");\n\t\t\telse\n\t\t\t\tPublicDependencyModuleNames.Add(\"OnlineSubsystemNull\");\n\t\t\t//PublicDependencyModuleNames.Add(\"OnlineFramework\");\n\t\t}\n\n\t\tSetupBuildVersion();\n\t\tSetupSteam();\n\t\tSetupLoadingScreen();\n\t\tSetupSDL();\n\t\tSetupAsusAuraSDK();\n\t\tSetupDiscord();\n\t\tSetupAnalytics();\n\n\t\t// We need this dependency to get some key information from viewport when moving object along spline\n\t\tif (Target.bBuildEditor == true)\n\t\t{\n\t\t\tPrivateDependencyModuleNames.Add(\"UnrealEd\");\n\t\t}\n\n\t\tPublicIncludePaths.AddRange(new string[] {\n\t\t\tPath.Combine(ModuleDirectory)\n\t\t});\n\n\t\t// Print Normal flags\n\t\tConsole.WriteLine(\"PublicDefinitions Flags:\");\n\t\tforeach (string Defintion in PublicDefinitions)\n\t\t{\n\t\t\tPrintBlue(Defintion);\n\t\t}\n\t\tConsole.WriteLine(\"\");\n\n\t\t//Console.WriteLine(\"ProjectDefinitions Flags:\");\n\t\t//foreach (string Defintion in Target.ProjectDefinitions)\n\t\t//{\n\t\t//\tPrintBlue(Defintion);\n\t\t//}\n\t\t//Console.WriteLine(\"\");\n\n\t\t// Now get the base of UE4's modules dir (could also be Developer, Editor, ThirdParty)\n\t\t//string source_runtime_path = Path.Combine(EngineRoot, \"Source\", \"Runtime\");\n\t\t//if (Target.Platform == UnrealTargetPlatform.Win64 || Target.Platform == UnrealTargetPlatform.Win32)\n\t\t//{\n\t\t//\tPublicIncludePaths.Add(Path.Combine(source_runtime_path, \"ApplicationCore\", \"Private\"));\n\t\t//}\n\n\t\t// Debug info disable\n\t\t// PrintBlue(string.Format(\"ENGINE_VERSION_MAJOR={0}\", Target.Version.MajorVersion));\n\t\t// PrintBlue(string.Format(\"ENGINE_VERSION_MINOR={0}\", Target.Version.MinorVersion));\n\t\t// PrintBlue(string.Format(\"ENGINE_VERSION_HOTFIX={0}\", Target.Version.PatchVersion));\n\t\t// PrintBlue(string.Format(\"ENGINE_IS_LICENSEE_VERSION={0}\", Target.Version.IsLicenseeVersion? \"true\" : \"false\"));\n\t\t// PrintBlue(string.Format(\"ENGINE_IS_PROMOTED_BUILD={0}\", Target.Version.IsPromotedBuild? \"true\" : \"false\"));\n\t\t// PrintBlue(string.Format(\"CURRENT_CHANGELIST={0}\", Target.Version.Changelist));\n\t\t// PrintBlue(string.Format(\"COMPATIBLE_CHANGELIST={0}\", Target.Version.EffectiveCompatibleChangelist));\n\t\t// PrintBlue(string.Format(\"BRANCH_NAME=\\\"{0}\\\"\", Target.Version.BranchName));\n\t\t// PrintBlue(string.Format(\"BUILD_VERSION=\\\"{0}\\\"\", Target.BuildVersion));\n\t}\n\n\tpublic void Init()\n\t{\n\t\tInitFromPlatform(Target.Platform);\n\t\tParseBuildFile();\n\n\t\t//\n\t\t// Common\n\t\t//\n\n\t\t// Enable IWYU\n\t\t// https://docs.unrealengine.com/latest/INT/Programming/UnrealBuildSystem/IWYUReferenceGuide/index.html\n\t\tPCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs;\n\t\tbEnforceIWYU = true;\n\t\t//PrivatePCHHeaderFile = \"SOrb.h\";\n\n\t\t// Faster compile time optimization\n\t\t// MinFilesUsingPrecompiledHeaderOverride = 1;\n\t\t// If this is enabled, it makes each file compile by itself, default UE is to bundle files together into Modules\n\t\tbFasterWithoutUnity = false;\n\n\t\t// Other, note older CPUS than 2012 don't work\n\t\tbUseAVX = false;\n\n\t\tPublicDependencyModuleNames.AddRange(new string[] {\n\t\t\t\"Core\",\n\t\t\t\"ApplicationCore\",\n\t\t\t\"CoreUObject\",\n\t\t\t\"Engine\",\n\t\t\t\"InputCore\",\n\t\t\t\"AIModule\",\n\t\t\t\"Json\",\n\t\t\t\"AnimationCore\",\n\t\t\t\"AnimGraphRuntime\",\n\t\t\t\"UMG\",\n\t\t\t\"Slate\",\n\t\t\t\"SlateCore\",\n\t\t\t\"ApexDestruction\",\n\n\t\t\t\"MovieScene\",\n\t\t\t\"LevelSequence\",\n\t\t\t\"MediaAssets\",\n\t\t\t\"Media\",\n\t\t\t\"AudioMixer\",\n\n\t\t\t\"RHI\", // getting system stuff\n\n\t\t\t// Init stuff\n\t\t\t\"SoBeforeGame\"\n\t\t});\n\n\t\tPrivateDependencyModuleNames.AddRange(new string[] {\n\t\t\t// Plugins\n\t\t\t \"DlgSystem\",\n\t\t\t \"FMODStudio\",\n\t\t\t \"NotYetLoadingScreen\"\n\t\t});\n\t}\n\n\tpublic string CurrentDirectoryPath\n\t{\n\t\tget\n\t\t{\n\t\t\treturn Path.GetFullPath(ModuleDirectory);\n\t\t}\n\t}\n\tpublic string WarriorbVersionFilePath\n\t{\n\t\tget\n\t\t{\n\t\t\treturn Path.Combine(CurrentDirectoryPath, \"Resources\", \"WarriorbVersion.h\");\n\t\t}\n\t}\n\n\tpublic string EngineRootPath\n\t{\n\t\t// Get the engine path. Ends with \"Engine/\"\n\t\tget\n\t\t{\n\t\t\treturn Path.GetFullPath(Target.RelativeEnginePath);\n\t\t}\n\t}\n\n\tpublic void SetupSteam()\n\t{\n\t\t// C++ Flags\n\t\tPublicDefinitions.Add(\"WARRIORB_WITH_STEAM=\" + BoolToIntString(WARRIORB_WITH_STEAM));\n\t\tPublicDefinitions.Add(\"WARRIORB_STEAM_APP_ID=\" + IntToString(WARRIORB_STEAM_APP_ID));\n\t\tPublicDefinitions.Add(\"WARRIORB_STEAM_DEMO_APP_ID=\" + IntToString(WARRIORB_STEAM_DEMO_APP_ID));\n\t\tPublicDefinitions.Add(\"WARRIORB_RELAUNCH_IN_STEAM=\" + BoolToIntString(WARRIORB_RELAUNCH_IN_STEAM));\n\t\tPublicDefinitions.Add(\"WARRIORB_STEAM_CHECK_IF_LIBRARY_CHECKSUM_MATCHES=\" + BoolToIntString(WARRIORB_STEAM_CHECK_IF_LIBRARY_CHECKSUM_MATCHES));\n\t\tPublicDefinitions.Add(String.Format(\"WARRIORB_STEAM_LIBRARY_WINDOWS_API64_SHA1_SUM=\\\"{0}\\\"\", WARRIORB_STEAM_LIBRARY_WINDOWS_API64_SHA1_SUM));\n\n\t\tConfigHierarchy ConfigEngineHierarchy = ConfigCache.ReadHierarchy(ConfigHierarchyType.Engine, new DirectoryReference(ProjectRootPath), Target.Platform);\n\t\tDictionary<string, string> SteamReplacements = new Dictionary<string, string>();\n\n\t\t// Steam\n\t\tif (WARRIORB_WITH_STEAM)\n\t\t{\n\t\t\t// Replace the steam id with our own defined one\n\t\t\t// Same for the Game Version\n\n\t\t\t// SteamDevAppId\n\t\t\t{\n\t\t\t\tint CurrentAppid;\n\t\t\t\tConfigEngineHierarchy.GetInt32(\"OnlineSubsystemSteam\", \"SteamDevAppId\", out CurrentAppid);\n\t\t\t\tstring FormatString = \"SteamDevAppId={0}\";\n\t\t\t\tSteamReplacements.Add(String.Format(FormatString, CurrentAppid), String.Format(FormatString, SteamAppid));\n\t\t\t}\n\n\t\t\t// GameVersion\n\t\t\t{\n\t\t\t\tstring CurrentGameVersion;\n\t\t\t\tConfigEngineHierarchy.GetString(\"OnlineSubsystemSteam\", \"GameVersion\", out CurrentGameVersion);\n\t\t\t\tstring FormatString = \"GameVersion={0}\";\n\t\t\t\tSteamReplacements.Add(String.Format(FormatString, CurrentGameVersion), String.Format(FormatString, WARRIORB_BUILD_VERSION));\n\t\t\t}\n\n\t\t\t// Relaunch in Steam?\n\t\t\t// https://partner.steamgames.com/doc/api/steam_api#SteamAPI_RestartAppIfNecessary\n\t\t\t// NOTE: disabled at it is broken anyways\n\t\t\t// {\n\t\t\t// \tbool CurrentRelaunchInSteam;\n\t\t\t// \tConfigEngineHierarchy.GetBool(\"OnlineSubsystemSteam\", \"bRelaunchInSteam\", out CurrentRelaunchInSteam);\n\t\t\t// \tstring FormatString = \"bRelaunchInSteam={0}\";\n\t\t\t// \tSteamReplacements.Add(String.Format(FormatString, CurrentRelaunchInSteam), String.Format(FormatString, WARRIORB_RELAUNCH_IN_STEAM));\n\t\t\t// }\n\n\t\t\t// Include plugins\n\t\t\tPrivateDependencyModuleNames.Add(\"NotYetSteam\");\n\t\t\tDynamicallyLoadedModuleNames.Add(\"OnlineSubsystemSteam\");\n\t\t}\n\n\t\t// bEnabled\n\t\t// {\n\t\t// \tbool CurrentEnabled;\n\t\t// \tConfigEngineHierarchy.GetBool(\"OnlineSubsystemSteam\", \"bEnabled\", out CurrentEnabled);\n\t\t// \tstring FormatString = \"bEnabled={0}\";\n\t\t// \tSteamReplacements.Add(String.Format(FormatString, CurrentEnabled), String.Format(FormatString, WARRIORB_WITH_STEAM));\n\t\t// }\n\n\t\tPatchFile(DefaultEngineConfigPath, SteamReplacements);\n\t}\n\n\tpublic void SetupLoadingScreen()\n\t{\n\t\t// Loading screen replacements\n\t\tDictionary<string, string> LoadingReplacements = new Dictionary<string, string>();\n\t\tstring Format = \"(Image={0},\";\n\t\tstring LoadingImageFinal = String.Format(Format, LoadingImage);\n\t\tstring LoadingImageDemoFinal = String.Format(Format, LoadingImageDemo);\n\t\tif (WARRIORB_DEMO)\n\t\t{\n\t\t\t// Replace main game image with demo\n\t\t\tLoadingReplacements.Add(LoadingImageFinal, LoadingImageDemoFinal);\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// Replace demo image with main game\n\t\t\tLoadingReplacements.Add(LoadingImageDemoFinal, LoadingImageFinal);\n\t\t}\n\t\tPatchFile(DefaultNYLoadingScreenSettingsConfigPath, LoadingReplacements);\n\t}\n\n\tpublic void SetupSDL()\n\t{\n\t\t// C++ Flags\n\t\tPublicDefinitions.Add(\"WARRIORB_WITH_SDL2=\" + BoolToIntString(WARRIORB_WITH_SDL2));\n\t\tif (WARRIORB_WITH_SDL2)\n\t\t{\n\t\t\tPrivateDependencyModuleNames.Add(\"NotYetSDL2\");\n\t\t}\n\n\t\t// For USoPlatformeHelper\n\t\t// if (IsPlatformLinux)\n\t\t// {\n\t\t// \tAddEngineThirdPartyPrivateStaticDependencies(Target, \"SDL2\");\n\t\t// }\n\t}\n\n\tpublic void SetupAsusAuraSDK()\n\t{\n\t\tPublicDefinitions.Add(\"WARRIORB_USE_ASUS_AURA_SDK=\" + BoolToIntString(WARRIORB_USE_ASUS_AURA_SDK));\n\t}\n\n\tpublic void SetupDiscord()\n\t{\n\t\tPublicDefinitions.Add(\"WARRIORB_WITH_DISCORD=\" + BoolToIntString(WARRIORB_WITH_DISCORD));\n\t\tPublicDefinitions.Add(\"WARRIORB_DISCORD_CLIENT_ID=\" + Int64ToString(WARRIORB_DISCORD_CLIENT_ID));\n\t\tPublicDefinitions.Add(\"WARRIORB_DISCORD_DEMO_CLIENT_ID=\" + Int64ToString(WARRIORB_DISCORD_DEMO_CLIENT_ID));\n\n\t\tif (WARRIORB_WITH_DISCORD)\n\t\t{\n\t\t\tPrivateDependencyModuleNames.Add(\"DiscordGameSDK\");\n\t\t\t// PrivateDependencyModuleNames.Add(\"DiscordGameSDKLibrary\");\n\t\t\tPrivateIncludePathModuleNames.Add(\"DiscordGameSDK\");\n\t\t}\n\t}\n\n\tpublic void SetupAnalytics()\n\t{\n\t\t// C++ Flags\n\t\t// Enable/disable analytics entirely or only the GameAnalytics plugin\n\t\tPublicDefinitions.Add(\"WARRIORB_WITH_GAMEANALYTICS=\" + BoolToIntString(WARRIORB_WITH_GAMEANALYTICS));\n\t\tPublicDefinitions.Add(\"WARRIORB_WITH_ANALYTICS=\" + BoolToIntString(WARRIORB_WITH_ANALYTICS));\n\t\tPublicDefinitions.Add(\"WARRIORB_COLLECT_ANALYTICS=\" + BoolToIntString(WARRIORB_COLLECT_ANALYTICS));\n\n\t\tif (WARRIORB_WITH_ANALYTICS)\n\t\t{\n\t\t\tPrivateDependencyModuleNames.Add(\"Analytics\");\n\t\t\tPrivateIncludePathModuleNames.Add(\"Analytics\");\n\n\t\t\tif (WARRIORB_WITH_GAMEANALYTICS)\n\t\t\t{\n\t\t\t\tPrivateDependencyModuleNames.Add(\"GameAnalytics\");\n\t\t\t\tPrivateIncludePathModuleNames.Add(\"GameAnalytics\");\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic void SetupBuildVersion()\n\t{\n\t\tstring BUILD_VERSION = WARRIORB_BUILD_VERSION;\n\t\tstring BRANCH = \"None\";\n\t\tstring COMMIT = \"None\";\n\t\tstring DEMO = WARRIORB_DEMO ? \"-DEMO\" : \"\";\n\n\t\t// Read build version\n\t\tGetCurrentBranchAndCommit(ref BRANCH, ref COMMIT);\n\n\t\tConsole.WriteLine(\"\");\n\t\tPrintBlue(String.Format(\"BUILD_VERSION = {0}, BRANCH = {1}, COMMIT = {2}, DEMO = {3}\", BUILD_VERSION, BRANCH, COMMIT, WARRIORB_DEMO));\n\t\tConsole.WriteLine(\"\");\n\n\t\t// The current build number\n\t\t// NOTE: this also sets the GameAnalytics version for all platforms, so you do not need to update those values.\n\t\tPublicDefinitions.Add(String.Format(\"WARRIORB_BUILD_VERSION=\\\"{0}\\\"\", BUILD_VERSION));\n\t\tPublicDefinitions.Add(String.Format(\"WARRIORB_BUILD_BRANCH=\\\"{0}\\\"\", BRANCH));\n\t\tPublicDefinitions.Add(String.Format(\"WARRIORB_BUILD_COMMIT=\\\"{0}\\\"\", COMMIT));\n\n\t\t// Write to file so that other resources can use it\n\t\tstring VersionFileText = @\"\n// DO NOT MODIFY - FILE AUTOMATICALLY GENERATED in SOrb.Build.cs - DO NOT MODIFY\n#define WARRIORB_BUILD_VERSION {0}\n#define WARRIORB_BUILD_BRANCH {1}\n#define WARRIORB_BUILD_COMMIT {2}\n#define WARRIORB_BUILD_ALL {0}-{1}-{2}{3}\n// DO NOT MODIFY - FILE AUTOMATICALLY GENERATED in SOrb.Build.cs - DO NOT MODIFY\n\";\n\t\tstring VersionFileTextFormat = String.Format(VersionFileText, BUILD_VERSION, BRANCH, COMMIT, DEMO);\n\t\tFile.WriteAllText(WarriorbVersionFilePath, VersionFileTextFormat);\n\n\t\t// Do replacements in GeneralProjectSettings\n\t\tConfigHierarchy ConfigGameHierarchy = ConfigCache.ReadHierarchy(ConfigHierarchyType.Game, new DirectoryReference(ProjectRootPath), Target.Platform);\n\t\tDictionary<string, string> GeneralProjectSettingsReplacements = new Dictionary<string, string>();\n\n\t\t// ProjectVersion\n\t\t{\n\t\t\tstring CurrentProjectVersion;\n\t\t\tConfigGameHierarchy.GetString(\"/Script/EngineSettings.GeneralProjectSettings\", \"ProjectVersion\", out CurrentProjectVersion);\n\t\t\tstring FormatString = \"ProjectVersion={0}\";\n\t\t\tGeneralProjectSettingsReplacements.Add(String.Format(FormatString, CurrentProjectVersion), String.Format(FormatString, WARRIORB_BUILD_VERSION));\n\t\t}\n\n\t\t// ProjectName\n\t\t{\n\t\t\tstring CurrentProjectName;\n\t\t\tConfigGameHierarchy.GetString(\"/Script/EngineSettings.GeneralProjectSettings\", \"ProjectName\", out CurrentProjectName);\n\t\t\tstring FormatString = \"ProjectName={0}\";\n\t\t\tstring ReplacementString = WARRIORB_DEMO ? ProjectNameDemo : ProjectName;\n\t\t\tGeneralProjectSettingsReplacements.Add(String.Format(FormatString, CurrentProjectName), String.Format(FormatString, ReplacementString));\n\t\t}\n\n\t\t// ProjectDisplayedTitle\n\t\t{\n\t\t\tstring CurrentProjectDisplayedTitle;\n\t\t\tConfigGameHierarchy.GetString(\"/Script/EngineSettings.GeneralProjectSettings\", \"ProjectDisplayedTitle\", out CurrentProjectDisplayedTitle);\n\t\t\tstring FormatString = \"ProjectDisplayedTitle={0}\";\n\t\t\tstring ReplacementString = WARRIORB_DEMO ? ProjectDisplayedTitleDemo : ProjectDisplayedTitle;\n\t\t\tGeneralProjectSettingsReplacements.Add(String.Format(FormatString, CurrentProjectDisplayedTitle), String.Format(FormatString, ReplacementString));\n\t\t}\n\n\t\tPatchFile(DefaultGameConfigPath, GeneralProjectSettingsReplacements);\n\t}\n\n\t//\n\t// BEGIN COMMON\n\t//\n\n\t//\n\t// Platform\n\t//\n\n\t// Constant variables because C# is stupid\n\tpublic bool IsSupportedDesktopPlatform = false;\n\tpublic bool IsSupportedConsolePlatform = false;\n\n\tpublic bool IsPlatformWindows64 = false;\n\tpublic bool IsPlatformLinux = false;\n\tpublic bool IsPlatformSwitch = false;\n\tpublic bool IsPlatformXboxOne = false;\n\n\tpublic void InitFromPlatform(UnrealTargetPlatform TargetPlatform)\n\t{\n\t\t// Checks if we can have some flags\n\t\tIsPlatformWindows64 = TargetPlatform == UnrealTargetPlatform.Win64;\n\t\tIsPlatformLinux = TargetPlatform == UnrealTargetPlatform.Linux;\n\t\tIsSupportedDesktopPlatform = IsPlatformWindows64 || IsPlatformLinux;\n\n\t\tIsPlatformSwitch = TargetPlatform == UnrealTargetPlatform.Switch;\n\t\tIsPlatformXboxOne = TargetPlatform == UnrealTargetPlatform.XboxOne;\n\t\tIsSupportedConsolePlatform = IsPlatformXboxOne || IsPlatformSwitch;\n\t}\n\n\t//\n\t// From Build file\n\t//\n\n\tpublic const string WARRIORB_BUILD_FILE_NAME = \"WarriorbBuild.json\";\n\tpublic string ProjectRootPath { get { return Target.ProjectFile.Directory.ToString(); } }\n\tpublic string ProjectSourceDirPath { get { return ProjectRootPath + \"/Source\"; } }\n\n\tpublic string ProjectConfigDirPath { get { return ProjectRootPath + \"/Config\"; } }\n\tpublic string DefaultEngineConfigPath { get { return ProjectConfigDirPath + \"/DefaultEngine.ini\"; } }\n\tpublic string DefaultGameConfigPath { get { return ProjectConfigDirPath + \"/DefaultGame.ini\"; } }\n\tpublic string DefaultNYLoadingScreenSettingsConfigPath { get { return ProjectConfigDirPath + \"/DefaultNYLoadingScreenSettings.ini\"; } }\n\n\tpublic string BuildConfigFilePath { get { return ProjectSourceDirPath + \"/\" + WARRIORB_BUILD_FILE_NAME; } }\n\n\n\t//\n\t// Steam\n\t//\n\n\tpublic bool WARRIORB_WITH_STEAM = false;\n\tpublic int WARRIORB_STEAM_APP_ID = 0;\n\tpublic int WARRIORB_STEAM_DEMO_APP_ID = 0;\n\n\t// https://partner.steamgames.com/doc/api/steam_api#SteamAPI_RestartAppIfNecessary\n\tpublic bool WARRIORB_RELAUNCH_IN_STEAM = false;\n\n\tpublic bool WARRIORB_STEAM_CHECK_IF_LIBRARY_CHECKSUM_MATCHES = false;\n\n\tpublic string WARRIORB_STEAM_LIBRARY_WINDOWS_API64_SHA1_SUM = \"\";\n\n\t//\n\t// Discord\n\t//\n\n\tpublic bool WARRIORB_WITH_DISCORD = false;\n\tpublic long WARRIORB_DISCORD_CLIENT_ID = 0;\n\tpublic long WARRIORB_DISCORD_DEMO_CLIENT_ID = 0;\n\n\n\n\t//\n\t// Video\n\t//\n\n\t// Enable/disable the video demo (for example at dreamhack/devplay)\n\t// Next time maybe look at: GIsDemoMode\n\tpublic bool WARRIORB_WITH_VIDEO_DEMO = false;\n\tpublic bool WARRIORB_WITH_VIDEO_INTRO = false;\n\n\t//\n\t// Other\n\t//\n\n\tpublic bool WARRIORB_DEMO = false;\n\n\tpublic bool WARRIORB_USE_ASUS_AURA_SDK = false;\n\n\tpublic string WARRIORB_BUILD_VERSION;\n\n\tpublic bool WARRIORB_ALLOW_CONSOLE_CHEATS_DEFAULT = false;\n\n\tpublic string WARRIORB_PASSWORD_ENABLE_CONSOLE_CHEATS;\n\n\tpublic string WARRIORB_PASSWORD_SAVE_FILE;\n\n\tpublic string LoadingImage;\n\tpublic string LoadingImageDemo;\n\n\tpublic string ProjectName;\n\tpublic string ProjectNameDemo;\n\tpublic string ProjectDisplayedTitle;\n\tpublic string ProjectDisplayedTitleDemo;\n\n\n\tpublic int SteamAppid { get { return WARRIORB_DEMO ? WARRIORB_STEAM_DEMO_APP_ID : WARRIORB_STEAM_APP_ID; } }\n\n\tpublic void ParseBuildFile()\n\t{\n\t\tPrintBlue(String.Format(\"Reading from BuildConfigFile = {0}\", BuildConfigFilePath));\n\t\tvar AllFields = JsonObject.Read(new FileReference(BuildConfigFilePath));\n\t\tvar PublicDefinitionsFields = AllFields.GetObjectField(\"PublicDefinitions\");\n\t\tvar LoadingFields = AllFields.GetObjectField(\"Loading\");\n\t\tvar SteamFields = AllFields.GetObjectField(\"Steam\");\n\t\tvar VideoFields = AllFields.GetObjectField(\"Video\");\n\n\t\tProjectName = AllFields.GetStringField(\"Name\");\n\t\tProjectNameDemo = AllFields.GetStringField(\"NameDemo\");\n\t\tProjectDisplayedTitle = AllFields.GetStringField(\"DisplayedTitle\");\n\t\tProjectDisplayedTitleDemo = AllFields.GetStringField(\"DisplayedTitleDemo\");\n\n\t\tWARRIORB_BUILD_VERSION = AllFields.GetStringField(\"Version\");\n\t\tWARRIORB_DEMO = PublicDefinitionsFields.GetBoolField(\"WARRIORB_DEMO\");\n\t\tWARRIORB_USE_ASUS_AURA_SDK = PublicDefinitionsFields.GetBoolField(\"WARRIORB_USE_ASUS_AURA_SDK\");\n\n\t\tWARRIORB_WITH_STEAM = SteamFields.GetBoolField(\"IS_ENABLED\");\n\t\tWARRIORB_STEAM_APP_ID = SteamFields.GetIntegerField(\"APP_ID\");\n\t\tWARRIORB_STEAM_DEMO_APP_ID = SteamFields.GetIntegerField(\"APP_ID_DEMO\");\n\t\tWARRIORB_RELAUNCH_IN_STEAM = SteamFields.GetBoolField(\"RELAUNCH_IN_STEAM\");\n\t\tWARRIORB_STEAM_CHECK_IF_LIBRARY_CHECKSUM_MATCHES = SteamFields.GetBoolField(\"CHECK_IF_LIBRARY_CHECKSUM_MATCHES\");\n\t\tWARRIORB_STEAM_LIBRARY_WINDOWS_API64_SHA1_SUM = SteamFields.GetStringField(\"LIBRARY_WINDOWS_API64_SHA1_SUM\");\n\n\t\tJsonObject DiscordFields;\n\t\tif (AllFields.TryGetObjectField(\"Discord\", out DiscordFields))\n\t\t{\n\t\t\tWARRIORB_WITH_DISCORD = DiscordFields.GetBoolField(\"IS_ENABLED\");\n\t\t\tWARRIORB_DISCORD_CLIENT_ID = Convert.ToInt64(DiscordFields.GetStringField(\"CLIENT_ID\"));\n\t\t\tWARRIORB_DISCORD_DEMO_CLIENT_ID = Convert.ToInt64(DiscordFields.GetStringField(\"CLIENT_ID_DEMO\"));\n\t\t}\n\n\t\tWARRIORB_WITH_VIDEO_DEMO = VideoFields.GetBoolField(\"DEMO\");\n\t\tWARRIORB_WITH_VIDEO_INTRO = VideoFields.GetBoolField(\"INTRO\");\n\n\t\tWARRIORB_ALLOW_CONSOLE_CHEATS_DEFAULT = PublicDefinitionsFields.GetBoolField(\"WARRIORB_ALLOW_CONSOLE_CHEATS_DEFAULT\");\n\t\tWARRIORB_PASSWORD_ENABLE_CONSOLE_CHEATS = PublicDefinitionsFields.GetStringField(\"WARRIORB_PASSWORD_ENABLE_CONSOLE_CHEATS\");\n\t\tWARRIORB_PASSWORD_SAVE_FILE = PublicDefinitionsFields.GetStringField(\"WARRIORB_PASSWORD_SAVE_FILE\");\n\n\t\tLoadingImage = LoadingFields.GetStringField(\"Image\");\n\t\tLoadingImageDemo = LoadingFields.GetStringField(\"ImageDemo\");\n\t}\n\n\t//\n\t// Other\n\t//\n\n\tstatic void PatchFileSingle(string filename, string oldValue, string newValue)\n\t{\n\t\tstring text = File.ReadAllText(filename);\n\t\ttext = text.Replace(oldValue, newValue);\n\t\tFile.WriteAllText(filename, text);\n\t}\n\n\tstatic void PatchFile(string filename, Dictionary<string, string> Replacements)\n\t{\n\t\tif (Replacements.Count == 0)\n\t\t\treturn;\n\n\t\tstring text = File.ReadAllText(filename);\n\t\tforeach (var KeyValue in Replacements)\n\t\t{\n\t\t\ttext = text.Replace(KeyValue.Key, KeyValue.Value);\n\t\t}\n\t\tFile.WriteAllText(filename, text);\n\t}\n\n\tstatic string IntToString(int value)\n\t{\n\t\treturn value.ToString();\n\t}\n\n\tstatic string Int64ToString(long value)\n\t{\n\t\treturn value.ToString();\n\t}\n\n\tstatic string BoolToIntString(bool value)\n\t{\n\t\treturn value ? \"1\" : \"0\";\n\t}\n\n\tstatic void PrintBlue(string String)\n\t{\n\t\tConsole.ForegroundColor = ConsoleColor.Blue;\n\t\tConsole.WriteLine(String);\n\t\tConsole.ResetColor();\n\t}\n\n\tstatic void PrintRed(string String)\n\t{\n\t\tConsole.ForegroundColor = ConsoleColor.Red;\n\t\tConsole.WriteLine(String);\n\t\tConsole.ResetColor();\n\t}\n\n\tstatic void PrintGreen(string String)\n\t{\n\t\tConsole.ForegroundColor = ConsoleColor.Green;\n\t\tConsole.WriteLine(String);\n\t\tConsole.ResetColor();\n\t}\n\n\tstatic void PrintYellow(string String)\n\t{\n\t\tConsole.ForegroundColor = ConsoleColor.Yellow;\n\t\tConsole.WriteLine(String);\n\t\tConsole.ResetColor();\n\t}\n\n\t//\n\t// Print out a build message\n\t// Why error? Well, the UE masks all other errors. *shrug*\n\t//\n\tprivate void Trace(string msg)\n\t{\n\t\tLog.TraceInformation(\"Warriorb: \" + msg);\n\t}\n\n\t// Trace helper\n\tprivate void Trace(string format, params object[] args)\n\t{\n\t\tTrace(string.Format(format, args));\n\t}\n\n\t// Raise an error\n\tprivate void Fail(string message)\n\t{\n\t\tTrace(message);\n\t\tthrow new Exception(message);\n\t}\n\n\tpublic static bool IsLinux\n\t{\n\t\tget\n\t\t{\n\t\t   return RuntimeInformation.IsOSPlatform(OSPlatform.Linux);\n\t\t}\n\t}\n\n\tpublic static bool ExistsOnPath(string exeName)\n\t{\n\t\ttry\n\t\t{\n\t\t\tusing (Process p = new Process())\n\t\t\t{\n\t\t\t\tp.StartInfo.CreateNoWindow = true;\n\t\t\t\tp.StartInfo.UseShellExecute = false;\n\t\t\t\tp.StartInfo.RedirectStandardError = true;\n\t\t\t\tp.StartInfo.RedirectStandardOutput = true;\n\t\t\t\tp.StartInfo.FileName = IsLinux ? \"whereis\" : \"where\";\n\t\t\t\tp.StartInfo.Arguments = exeName;\n\t\t\t\tp.Start();\n\t\t\t\tp.WaitForExit();\n\t\t\t\treturn p.ExitCode == 0;\n\t\t\t}\n\t\t}\n\t\tcatch (Exception)\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t}\n\n\tpublic static bool RunCommand(string workingDirectory,  string commandName, string arguments, ref string output)\n\t{\n\t\tusing (Process p = new Process())\n\t\t{\n\t\t\tp.StartInfo.WorkingDirectory = workingDirectory;\n\t\t\tp.StartInfo.CreateNoWindow = true;\n\t\t\tp.StartInfo.UseShellExecute = false;\n\t\t\tp.StartInfo.RedirectStandardError = true;\n\t\t\tp.StartInfo.RedirectStandardOutput = true;\n\t\t\tp.StartInfo.FileName = commandName;\n\t\t\tp.StartInfo.Arguments = arguments;\n\t\t\tp.Start();\n\t\t\toutput = p.StandardOutput.ReadToEnd();\n\t\t\tp.WaitForExit();\n\t\t\treturn p.ExitCode == 0;\n\t\t}\n\t}\n\n\tpublic static bool GetGitBranch(string path, ref string branch)\n\t{\n\t\tif (RunCommand(path, \"git\", \"rev-parse --abbrev-ref HEAD\", ref branch))\n\t\t{\n\t\t\tbranch = branch.Trim();\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\n\tpublic static bool GetGitCommit(string path, ref string commit)\n\t{\n\t\tif (RunCommand(path, \"git\", \"rev-parse --short HEAD\", ref commit))\n\t\t{\n\t\t\tcommit = commit.Trim();\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\n\tpublic bool GetCurrentBranchAndCommit(ref string branch, ref string commit)\n\t{\n\t\t// Try first from git command\n\t\tif (GeBranchAndCommitFromGit(ref branch, ref commit))\n\t\t\treturn true;\n\n\t\treturn false;\n\t}\n\n\tpublic bool GeBranchAndCommitFromGit(ref string branch, ref string commit)\n\t{\n\t\tif (!ExistsOnPath(\"git\"))\n\t\t{\n\t\t\tPrintYellow(\"git does not exist in path\");\n\t\t\treturn false;\n\t\t}\n\n\t\tPrintBlue(\"Using git\");\n\t\tif (!GetGitBranch(ProjectRootPath, ref branch))\n\t\t{\n\t\t\tPrintRed(\"Can't get git branch\");\n\t\t\treturn false;\n\t\t}\n\t\tif (!GetGitCommit(ProjectRootPath, ref commit))\n\t\t{\n\t\t\tPrintRed(\"Can't get git commit\");\n\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t}\n\n\t//\n\t// END COMMON\n\t//\n}\n"
  },
  {
    "path": "Source/SOrb/SOrb.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#include \"SOrb.h\"\n\n#include \"Modules/ModuleManager.h\"\n#include \"Misc/Paths.h\"\n#include \"SaveGameSystem.h\"\n#include \"PlatformFeatures.h\"\n#include \"Serialization/MemoryReader.h\"\n\n#include \"Localization/SoLocalization.h\"\n#include \"Settings/Input/SoInputHelper.h\"\n#include \"SoBeforeGame/Public/SoBeforeGameModule.h\"\n#include \"Localization/SoLocalizationHelper.h\"\n#include \"FMODStudioModule.h\"\n\n#include \"DlgManager.h\"\n\n#if WARRIORB_WITH_SDL2\n#include \"INotYetSDL2Module.h\"\n#endif // WARRIORB_WITH_SDL2\n\n#if WARRIORB_WITH_STEAM\n#include \"INotYetSteamModule.h\"\n#endif // WARRIORB_WITH_STEAM\n\n// NOTE: the name (third param) seems to be deprecated\nIMPLEMENT_PRIMARY_GAME_MODULE(FWarriorbGameModule, SOrb, \"WarriOrb\");\n\nDEFINE_LOG_CATEGORY(LogSoGeneral);\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FWarriorbGameModule::StartupModule()\n{\n\tUE_LOG(LogSoGeneral, Log, TEXT(\"WarriorbGame: StartupModule\"));\n\n\t// Listen to core delegates\n\tPreExitDelegateHandle = FCoreDelegates::OnPreExit.AddRaw(this, &Self::HandlePreExit);\n\tExitDelegateHandle = FCoreDelegates::OnExit.AddRaw(this, &Self::HandleExit);\n\tApplicationWillDeactivateDelegate = FCoreDelegates::ApplicationWillDeactivateDelegate.AddRaw(this, &Self::HandleApplicationWillDeactivate);\n\tApplicationHasReactivatedDelegate = FCoreDelegates::ApplicationHasReactivatedDelegate.AddRaw(this, &Self::HandleApplicationHasReactivated);\n\tApplicationWillEnterBackgroundDelegate = FCoreDelegates::ApplicationWillEnterBackgroundDelegate.AddRaw(this, &Self::HandleApplicationWillEnterBackground);\n\tApplicationHasEnteredForegroundDelegate = FCoreDelegates::ApplicationHasEnteredForegroundDelegate.AddRaw(this, &Self::HandleApplicationHasEnteredForeground);\n\n#if PLATFORM_SWITCH\n\tHandleSwitchConfigSerialization();\n#endif\n\n\tInit();\n\n\tUDlgManager::LoadAllDialoguesIntoMemory();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FWarriorbGameModule::ShutdownModule()\n{\n\tUE_LOG(LogSoGeneral, Log, TEXT(\"WarriorbGame: ShutdownModule\"));\n\n\tif (PreExitDelegateHandle.IsValid())\n\t{\n\t\tFCoreDelegates::OnPreExit.Remove(PreExitDelegateHandle);\n\t\tPreExitDelegateHandle.Reset();\n\t}\n\tif (ExitDelegateHandle.IsValid())\n\t{\n\t\tFCoreDelegates::OnExit.Remove(ExitDelegateHandle);\n\t\tExitDelegateHandle.Reset();\n\t}\n\tif (ApplicationWillDeactivateDelegate.IsValid())\n\t{\n\t\tFCoreDelegates::ApplicationWillDeactivateDelegate.Remove(ApplicationWillDeactivateDelegate);\n\t\tApplicationWillDeactivateDelegate.Reset();\n\t}\n\tif (ApplicationHasReactivatedDelegate.IsValid())\n\t{\n\t\tFCoreDelegates::ApplicationHasReactivatedDelegate.Remove(ApplicationHasReactivatedDelegate);\n\t\tApplicationHasReactivatedDelegate.Reset();\n\t}\n\tif (ApplicationWillEnterBackgroundDelegate.IsValid())\n\t{\n\t\tFCoreDelegates::ApplicationWillEnterBackgroundDelegate.Remove(ApplicationWillEnterBackgroundDelegate);\n\t\tApplicationWillEnterBackgroundDelegate.Reset();\n\t}\n\tif (ApplicationHasEnteredForegroundDelegate.IsValid())\n\t{\n\t\tFCoreDelegates::ApplicationHasEnteredForegroundDelegate.Remove(ApplicationHasEnteredForegroundDelegate);\n\t\tApplicationHasEnteredForegroundDelegate.Reset();\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FWarriorbGameModule::Init()\n{\n\tInitStringTables();\n\tInitInput();\n\tInitPlugins();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FWarriorbGameModule::InitStringTables()\n{\n\tif (bInitStringTables)\n\t\treturn;\n\n\t// Register String tables that are not already registered\n\tUE_LOG(LogSoGeneral, Log, TEXT(\"WarriorbGame: InitStringTables\"));\n\tFSoBeforeGameModule::Get().InitStringTables();\n\tbInitStringTables = true;\n}\n\nvoid FWarriorbGameModule::InitInput()\n{\n\tUE_LOG(LogSoGeneral, Log, TEXT(\"WarriorbGame: InitInput\"));\n\tif (!bInitStringTables)\n\t{\n\t\tUE_LOG(LogSoGeneral, Error, TEXT(\"WarriorbGame: Called InitInput before InitStringTables, some translations may be invalid\"));\n\t}\n\n\t// Init the static variables\n\t// NOTE: the order here matters\n\tFSoInputKey::Init();\n\tFSoInputActionName::Init();\n\tFSoInputAxisName::Init();\n\tFSoInputActionNameAxisNameLink::Init();\n\tFSoInputConfigurableActionName::Init();\n\tUSoLocalizationHelper::Init();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FWarriorbGameModule::InitPlugins()\n{\n\tUE_LOG(LogSoGeneral, Log, TEXT(\"WarriorbGame: InitPlugins\"));\n\tIFMODStudioModule::Get().RefreshSettings();\n\n\t// TODO why do we need to manually load it?\n#if WARRIORB_WITH_SDL2\n\tif (!INotYetSDL2Module::LoadModule())\n\t{\n\t\tUE_LOG(LogSoGeneral, Error, TEXT(\"INotYetSDL2Module Failed :(\"));\n\t}\n#endif // WARRIORB_WITH_SDL2\n\n#if WARRIORB_WITH_STEAM\n\tif (!INotYetSteamModule::LoadModule())\n\t{\n\t\tUE_LOG(LogSoGeneral, Error, TEXT(\"INotYetSteamModule Failed :(\"));\n\t}\n#endif\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FWarriorbGameModule::HandleSwitchConfigSerialization()\n{\n\t// set up save game system to load GameUserSettings before it's loaded from normal location\n\tFCoreDelegates::CountPreLoadConfigFileRespondersDelegate.AddLambda([](const TCHAR* Filename, int32& ResponderCount)\n\t{\n\t\tif (GInputIni.Len() > 0 && Filename == GInputIni)\n\t\t{\n\t\t\tISaveGameSystem* SaveSystem = IPlatformFeaturesModule::Get().GetSaveGameSystem();\n\t\t\tif (SaveSystem->DoesSaveGameExist(TEXT(\"Input.ini\"), 0))\n\t\t\t{\n\t\t\t\tResponderCount++;\n\t\t\t}\n\t\t}\n\t});\n\n\tFCoreDelegates::PreLoadConfigFileDelegate.AddLambda([](const TCHAR* Filename, FString& LoadedContents)\n\t{\n\t\tif (GInputIni.Len() > 0 && Filename == GInputIni)\n\t\t{\n\t\t\tISaveGameSystem* SaveSystem = IPlatformFeaturesModule::Get().GetSaveGameSystem();\n\t\t\tTArray<uint8> RawData;\n\t\t\t// load with the same game system\n\t\t\tif (SaveSystem->LoadGame(false, TEXT(\"Input.ini\"), 0, RawData))\n\t\t\t{\n\t\t\t\tFMemoryReader Ar(RawData);\n\t\t\t\tAr << LoadedContents;\n\t\t\t}\n\t\t}\n\t});\n\n\tFCoreDelegates::PreSaveConfigFileDelegate.AddLambda([](const TCHAR* Filename, const FString& ContentsToSave, int32& SavedCount)\n\t{\n\t\tif (GInputIni.Len() > 0 && Filename == GInputIni)\n\t\t{\n\t\t\tISaveGameSystem* SaveSystem = IPlatformFeaturesModule::Get().GetSaveGameSystem();\n\n\t\t\tTArray<uint8> RawData;\n\t\t\tFMemoryWriter Ar(RawData, true);\n\t\t\tAr << (FString&)ContentsToSave;\n\t\t\tif (RawData.Num() > 0)\n\t\t\t{\n\t\t\t\t// save with the save game system\n\t\t\t\tif (SaveSystem->SaveGame(false, TEXT(\"Input.ini\"), 0, RawData))\n\t\t\t\t{\n\t\t\t\t\t// if we succeeded, track it\n\t\t\t\t\tSavedCount++;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t});\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FWarriorbGameModule::HandlePreExit()\n{\n\tUE_LOG(LogSoGeneral, Log, TEXT(\"WarriorbGame: HandlePreExit\"));\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FWarriorbGameModule::HandleExit()\n{\n\tUE_LOG(LogSoGeneral, Log, TEXT(\"WarriorbGame: HandleExit\"));\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FWarriorbGameModule::HandleApplicationWillDeactivate()\n{\n\tUE_LOG(LogSoGeneral, Log, TEXT(\"WarriorbGame: HandleApplicationWillDeactivate\"));\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FWarriorbGameModule::HandleApplicationHasReactivated()\n{\n\tUE_LOG(LogSoGeneral, Log, TEXT(\"WarriorbGame: HandleApplicationHasReactivated\"));\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FWarriorbGameModule::HandleApplicationWillEnterBackground()\n{\n\tUE_LOG(LogSoGeneral, Log, TEXT(\"WarriorbGame: HandleApplicationWillEnterBackground\"));\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FWarriorbGameModule::HandleApplicationHasEnteredForeground()\n{\n\tUE_LOG(LogSoGeneral, Log, TEXT(\"WarriorbGame: HandleApplicationHasEnteredForeground\"));\n}\n"
  },
  {
    "path": "Source/SOrb/SOrb.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#pragma once\n\n#include \"Logging/LogMacros.h\"\n#include \"Modules/ModuleInterface.h\"\n#include \"Modules/ModuleManager.h\"\n\nDECLARE_LOG_CATEGORY_EXTERN(LogSoGeneral, All, All);\n\nconst FName WARRIORB_GAME_MODULE_NAME(TEXT(\"WarriorbGame\"));\n\nclass FWarriorbGameModule: public IModuleInterface\n{\n\ttypedef FWarriorbGameModule Self;\npublic:\n\tvoid StartupModule() override;\n\tvoid ShutdownModule() override;\n\tbool IsGameModule() const override\n\t{\n\t\treturn true;\n\t}\n\n\tstatic FWarriorbGameModule& Get() { return FModuleManager::LoadModuleChecked<FWarriorbGameModule>(WARRIORB_GAME_MODULE_NAME); }\n\tstatic bool IsAvailable() { return FModuleManager::Get().IsModuleLoaded(WARRIORB_GAME_MODULE_NAME); }\n\n\tvoid Init();\n\tvoid InitStringTables();\n\tvoid InitInput();\n\tvoid InitPlugins();\n\n\tvoid HandleSwitchConfigSerialization();\n\nprotected:\n\tvoid HandlePreExit();\n\tvoid HandleExit();\n\tvoid HandleApplicationWillDeactivate();\n\tvoid HandleApplicationHasReactivated();\n\tvoid HandleApplicationWillEnterBackground();\n\tvoid HandleApplicationHasEnteredForeground();\n\nprotected:\n\tbool bInitStringTables = false;\n\n\tFDelegateHandle PreExitDelegateHandle;\n\tFDelegateHandle ExitDelegateHandle;\n\n\tFDelegateHandle ApplicationWillDeactivateDelegate;\n\tFDelegateHandle ApplicationHasReactivatedDelegate;\n\tFDelegateHandle ApplicationWillEnterBackgroundDelegate;\n\tFDelegateHandle ApplicationHasEnteredForegroundDelegate;\n};\n"
  },
  {
    "path": "Source/SOrb/SaveFiles/SoSaveHelper.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#include \"SoSaveHelper.h\"\n\n#include \"Misc/FileHelper.h\"\n#include \"Serialization/BufferArchive.h\"\n#include \"Misc/Paths.h\"\n#include \"Serialization/MemoryReader.h\"\n#include \"SaveGameSystem.h\"\n#include \"PlatformFeatures.h\"\n\n#include \"IO/IDlgWriter.h\"\n#include \"IO/IDlgParser.h\"\n#include \"SoWorldState.h\"\n#include \"Kismet/GameplayStatics.h\"\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool FSoSaveHelper::SaveToFile(IDlgWriter& Writer, const FString& FileNameNoExt, int32 UserIndex)\n{\n#if PLATFORM_XBOXONE\n\tif (UserIndex == -1)\n\t\treturn false;\n#endif\n\n\t// Binary files\n\tif (UseUnrealSaveSystem())\n\t{\n\t\treturn WriteUsingUnrealSaveSystem(GetSaveFilePathFromFileName(FileNameNoExt), UserIndex, Writer.GetAsString());\n\t}\n\n\t// Text files\n\treturn Writer.ExportToFile(GetSaveFilePathFromFileName(FileNameNoExt));\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool FSoSaveHelper::LoadFromFile(IDlgParser& Parser, const FString& FileNameNoExt, int32 UserIndex)\n{\n#if PLATFORM_XBOXONE\n\tif (UserIndex == -1)\n\t\treturn false;\n#endif\n\n\t// Binary files\n\tif (UseUnrealSaveSystem())\n\t{\n\t\tFString Data;\n\t\tif (ReadUsingUnrealSaveSystem(GetSaveFilePathFromFileName(FileNameNoExt), UserIndex,Data))\n\t\t{\n\t\t\tParser.InitializeParserFromString(Data);\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\n\t// Text files\n\tParser.InitializeParser(GetSaveFilePathFromFileName(FileNameNoExt));\n\treturn Parser.IsValidFile();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSoSaveHelper::BackupSaveFile(const FString& FileNameNoExt, const FString& NewCopyName, int32 UserIndex)\n{\n\tconst FString FileToCopy = GetSaveFilePathFromFileName(FileNameNoExt);\n\tconst FString BackupFile = GetSaveFilePathFromFileName(NewCopyName);\n\n\tUE_LOG(\n\t\tLogSoWorldState,\n\t\tVerbose,\n\t\tTEXT(\"Creating BACKUP for Save file: Copying file from = `%s` to = `%s`\"),\n\t\t*FileToCopy, *BackupFile\n\t);\n\tif (UseUnrealSaveSystem())\n\t{\n\t\t// Binary files\n\t\tFString DataToCopy;\n\t\tif (ReadUsingUnrealSaveSystem(FileToCopy, UserIndex, DataToCopy))\n\t\t{\n\t\t\tWriteUsingUnrealSaveSystem(BackupFile, UserIndex, DataToCopy);\n\t\t}\n\t}\n\telse\n\t{\n\t\t// Text files\n\t\t// Delete it first as we can't copy if already exists\n\t\tIFileManager::Get().Copy(*BackupFile, *FileToCopy, true);\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool FSoSaveHelper::DeleteSaveFile(const FString& FileNameNoExt, int32 UserIndex)\n{\n\t// Binary files\n\tif (UseUnrealSaveSystem())\n\t{\n\t\tISaveGameSystem* SaveSystem = IPlatformFeaturesModule::Get().GetSaveGameSystem();\n\t\tif (SaveSystem && FileNameNoExt.Len() > 0)\n\t\t{\n\t\t\treturn SaveSystem->DeleteGame(false, *GetSaveFilePathFromFileName(FileNameNoExt), UserIndex);\n\t\t}\n\t\treturn false;\n\t}\n\n\t// Text files\n\treturn IFileManager::Get().Delete(*GetSaveFilePathFromFileName(FileNameNoExt), true, false, false);\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool FSoSaveHelper::WriteUsingUnrealSaveSystem(const FString& FileName, int32 UserIndex, const FString& Data)\n{\n\tISaveGameSystem* SaveSystem = IPlatformFeaturesModule::Get().GetSaveGameSystem();\n\t// If we have a system and an object to save and a save name...\n\tif (SaveSystem && FileName.Len() > 0 && Data.Len() > 0)\n\t{\n\t\tFString NonConstData = Data;\n\t\tTArray<uint8> ObjectBytes;\n\t\tFMemoryWriter MemoryWriter(ObjectBytes, true);\n\t\tMemoryWriter << NonConstData;\n\n\t\treturn SaveSystem->SaveGame(false, *FileName, UserIndex, ObjectBytes);\n\t}\n\n\treturn false;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool FSoSaveHelper::ReadUsingUnrealSaveSystem(const FString& FileName, int32 UserIndex, FString& OutData)\n{\n\tISaveGameSystem* SaveSystem = IPlatformFeaturesModule::Get().GetSaveGameSystem();\n\t// If we have a save system and a valid name..\n\tif (SaveSystem && (FileName.Len() > 0))\n\t{\n\t\t// Load raw data from slot\n\t\tTArray<uint8> ObjectBytes;\n\t\tbool bSuccess = SaveSystem->LoadGame(false, *FileName, UserIndex, ObjectBytes);\n\t\tif (bSuccess)\n\t\t{\n\t\t\tFMemoryReader MemoryReader(ObjectBytes, true);\n\t\t\tMemoryReader << OutData;\n\t\t\treturn true;\n\t\t}\n\t}\n\n\treturn false;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool FSoSaveHelper::DoesSaveFileNameExist(const FString& FileNameNoExt, int32 UserIndex)\n{\n\t// Binary files\n\tif (UseUnrealSaveSystem())\n\t{\n\t\tif (ISaveGameSystem* SaveSystem = IPlatformFeaturesModule::Get().GetSaveGameSystem())\n\t\t{\n\t\t\treturn SaveSystem->DoesSaveGameExist(*GetSaveFilePathFromFileName(FileNameNoExt), UserIndex);\n\t\t}\n\t\treturn false;\n\t}\n\n\t// Text files\n\treturn IFileManager::Get().FileExists(*GetSaveFilePathFromFileName(FileNameNoExt));\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool FSoSaveHelper::GetDeletedSaveFileNameFromFileName(const FString& SaveFileNameNoExt, int32 UserIndex, FString& OutDeletedFileNameNoExt)\n{\n\tstatic constexpr int32 MaxIteration = 1000;\n\tbool bFoundValid = false;\n\tint32 Iteration = -1;\n\tdo\n\t{\n\t\t// Add indices to the end of BasePath until we find a valid one\n\t\tIteration++;\n\t\tOutDeletedFileNameNoExt = FString::Printf(TEXT(\"%s-backup-%d\"), *SaveFileNameNoExt, Iteration);\n\t\tif (!DoesSaveFileNameExist(OutDeletedFileNameNoExt, UserIndex))\n\t\t\tbFoundValid = true;\n\n\t\t// until the file does not exists OR until something is very wrong.\n\t} while (!bFoundValid && Iteration < MaxIteration);\n\n\treturn bFoundValid;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nconst FString& FSoSaveHelper::GetSaveGameDirectoryPath()\n{\n\tstatic FString Path = FString::Printf(TEXT(\"%sSaveGames\"), *FPaths::ProjectSavedDir());\n\treturn Path;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nconst FString& FSoSaveHelper::GetPasswordSaveFile()\n{\n#ifndef WARRIORB_PASSWORD_SAVE_FILE\n#error \"WARRIORB_PASSWORD_SAVE_FILE is not set in the SOrb.Build.cs file\"\n#endif // !WARRIORB_PASSWORD_SAVE_FILE\n\tstatic const FString Password(TEXT(WARRIORB_PASSWORD_SAVE_FILE));\n\treturn Password;\n}\n"
  },
  {
    "path": "Source/SOrb/SaveFiles/SoSaveHelper.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#pragma once\n\n#include \"CoreMinimal.h\"\n\nclass IDlgWriter;\nclass IDlgParser;\n\n// See: https://docs.unrealengine.com/en-US/Gameplay/SaveGame/index.html\n/**\n * Static functions handling save/load data to/from files\n * NOTE: All the file names do not have the file extension as it is added in a later step\n */\nclass FSoSaveHelper\n{\npublic:\n\tstatic bool SaveToFile(IDlgWriter& Writer, const FString& FileNameNoExt, int32 UserIndex);\n\tstatic bool LoadFromFile(IDlgParser& Parser, const FString& FileNameNoExt, int32 UserIndex);\n\n\tstatic void BackupSaveFile(const FString& FileNameNoExt, const FString& NewCopyName, int32 UserIndex);\n\tstatic bool DeleteSaveFile(const FString& FileNameNoExt, int32 UserIndex);\n\n\n\t// Save gam file exists?\n\tstatic bool DoesSaveFileNameExist(const FString& FileNameNoExt, int32 UserIndex);\n\tstatic bool DoesSaveFileNameExistForSlot(const FString& FileNameNoExt, int32 SlotIndex, int32 UserIndex)\n\t{\n\t\treturn DoesSaveFileNameExist(GetSaveFileNameFromSlot(FileNameNoExt, SlotIndex), UserIndex);\n\t}\n\n\tstatic FString GetSaveFilePathFromFileName(const FString& FileNameNoExt)\n\t{\n\t\tif (UseUnrealSaveSystem())\n\t\t{\n\t\t\t// Extension is added by unreal save system\n\t\t\treturn FileNameNoExt;\n\t\t}\n\n\t\t// Text file\n\t\treturn FString::Printf(TEXT(\"%s/%s.sav.txt\"), *GetSaveGameDirectoryPath(), *FileNameNoExt);\n\t}\n\n\t// Gets the path for save file from the SaveSlotName Name and the provided SlotIndex;\n\tstatic FString GetSaveFilePathFromSlot(const FString& FileNameNoExt, int32 SlotIndex)\n\t{\n\t\tif (UseUnrealSaveSystem())\n\t\t{\n\t\t\t// Extension is added by unreal save system\n\t\t\treturn FString::Printf(TEXT(\"%s_%d\"), *FileNameNoExt, SlotIndex);\n\t\t}\n\t\t\n\t\t// Inside the Saves/SaveGames/<Name>_<Index>.sav.txt\n\t\treturn FString::Printf(TEXT(\"%s/%s_%d.sav.txt\"), *GetSaveGameDirectoryPath(), *FileNameNoExt, SlotIndex);\n\t}\n\n\tstatic FString GetSaveFileNameFromSlot(const FString& FileNameNoExt, int32 SlotIndex)\n\t{\n\t\treturn FString::Printf(TEXT(\"%s_%d\"), *FileNameNoExt, SlotIndex);\n\t}\n\n\t// Gets a valid (non existent) deleted save game file path for the Specified SlotIndex.\n\tstatic bool GetDeletedSaveFileNameFromSlot(const FString& SaveFileNameNoExt, int32 SlotIndex, int32 UserIndex, FString& OutDeletedFileNameNoExt)\n\t{\n\t\treturn GetDeletedSaveFileNameFromFileName(\n\t\t\tFString::Printf(TEXT(\"DELETED_%s_%d\"), *SaveFileNameNoExt, SlotIndex),\n\t\t\tUserIndex,\n\t\t\tOutDeletedFileNameNoExt\n\t\t);\n\t}\n\tstatic bool GetDeletedSaveFileNameFromFileName(const FString& SaveFileNameNoExt, int32 UserIndex, FString& OutDeletedFileNameNoExt);\n\n\t// Directory of where all the saves are\n\tstatic const FString& GetSaveGameDirectoryPath();\n\n\t// From WARRIORB_PASSWORD_SAVE_FILE\n\tstatic const FString& GetPasswordSaveFile();\n\n\t// Use the unreal binary save system or our own save system?\n\tstatic bool UseUnrealSaveSystem() { return WARRIORB_USE_UNREAL_SAVE_SYSTEM; }\n\nprotected:\n\t// Save string to file using the Unreal Save System\n\tstatic bool WriteUsingUnrealSaveSystem(const FString& FileName, int32 UserIndex, const FString& Data);\n\tstatic bool ReadUsingUnrealSaveSystem(const FString& FileName, int32 UserIndex, FString& OutData);\n};\n"
  },
  {
    "path": "Source/SOrb/SaveFiles/SoSaveParser.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#pragma once\n\n#include \"IO/DlgJsonParser.h\"\n\nclass FSoSaveParser : public FDlgJsonParser\n{\n\ttypedef FDlgJsonParser Super;\npublic:\n\tFSoSaveParser() : Super()\n\t{\n\t\tbLogVerbose = false;\n\t}\n\tFSoSaveParser(const FString& FilePath) : Super(FilePath)\n\t{\n\t\tbLogVerbose = false;\n\t}\n};\n"
  },
  {
    "path": "Source/SOrb/SaveFiles/SoSaveWriter.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#pragma once\n\n#include \"IO/DlgJsonWriter.h\"\n\n#include \"Items/ItemTemplates/SoItemTemplate.h\"\n\n\nclass FSoSaveWriter : public FDlgJsonWriter\n{\n\ttypedef FDlgJsonWriter Super;\npublic:\n\tFSoSaveWriter() : Super()\n\t{\n\t\tbLogVerbose = false;\n\t}\n\n\tbool CanSaveAsReference(const UProperty* Property, const UObject* Object) override\n\t{\n\t\tif (Super::CanSaveAsReference(Property, Object))\n\t\t\treturn true;\n\n\t\tconst UArrayProperty* ArrayProperty = Cast<UArrayProperty>(Property);\n\t\tconst UObjectProperty* ObjProperty = Cast<UObjectProperty>(ArrayProperty == nullptr ? Property : ArrayProperty->Inner);\n\t\tif (ObjProperty != nullptr)\n\t\t{\n\t\t\tif (ObjProperty->PropertyClass == nullptr)\n\t\t\t\treturn false;\n\n\t\t\tif (ObjProperty->PropertyClass->IsChildOf(USoItemTemplate::StaticClass()))\n\t\t\t\treturn true;\n\t\t}\n\n\t\treturn false;\n\t}\n};\n"
  },
  {
    "path": "Source/SOrb/SaveFiles/SoWorldState.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#include \"SoWorldState.h\"\n\n#include \"GameFramework/Actor.h\"\n#include \"Misc/FileHelper.h\"\n#include \"Serialization/BufferArchive.h\"\n#include \"Misc/Paths.h\"\n\n#include \"Levels/SoLevelHelper.h\"\n#include \"Basic/SoConsoleCommands.h\"\n#include \"SoSaveWriter.h\"\n#include \"SoSaveParser.h\"\n#include \"Basic/Helpers/SoPlatformHelper.h\"\n#include \"Basic/SoGameSingleton.h\"\n#include \"SoSaveHelper.h\"\n\nDEFINE_LOG_CATEGORY(LogSoWorldState);\n\n// Some class constants\n\nconst FName FSoWorldState::FinishedProgressSave(TEXT(\"epilogue_save_creatures\"));\nconst FName FSoWorldState::FinishedProgressSeparate(TEXT(\"epilogue_separate_worlds\"));\n\nconst FString FSoWorldState::MetadataFileName(TEXT(\"METADATA\"));\nconst FString FSoWorldState::EpisodeBaseFileName(TEXT(\"EPISODE\"));\nconst FString FSoWorldState::EpisodesFileName(TEXT(\"EPISODES\"));\nconst FString FSoWorldState::ChapterFileName(TEXT(\"SAVE\"));\nconst FName FSoWorldState::Chapter1CompletedName(TEXT(\"Chapter1Completed\"));\nconst FName FSoWorldState::Chapter2CompletedName(TEXT(\"Chapter2Completed\"));\n\nconst FName FSoWorldState::InventoryItemListName(TEXT(\"Warriorb_ItemList\"));\nconst FName FSoWorldState::EquippedItemListName(TEXT(\"Warriorb_Equipped\"));\nconst FName FSoWorldState::EquippedSpellListName(TEXT(\"Warriorb_EquippedSpells\"));\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFSoWorldState& FSoWorldState::Get()\n{\n\tstatic FSoWorldState Instance;\n\n\t// For debug stuff\n\t//auto& StateTable = Instance.GetStateTable();\n\n\t// Lazy load the valid data the first time\n\tif (!Instance.bMetadataLoadedOnce)\n\t{\n\t\tif (Instance.LoadGameMetadata() != ESoSaveStatus::Success)\n\t\t{\n\t\t\tUE_LOG(LogSoWorldState, Error, TEXT(\"FSoWorldState::Get() FAILED to load the METADATA file\"));\n\t\t}\n\t}\n\tif (!Instance.bInitializedOnce)\n\t{\n\t\tInstance.ResetToDefault();\n\t\tInstance.bInitializedOnce = true;\n\t}\n\n\treturn Instance;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFString FSoWorldState::GetSaveFilePathFromSlot(int32 SlotIndex) const\n{\n\tif (IsForChapter())\n\t\treturn FSoSaveHelper::GetSaveFilePathFromSlot(ChapterFileName, SlotIndex);\n\n\treturn FSoSaveHelper::GetSaveFilePathFromSlot(GetPrefixEpisodeFileName(), SlotIndex);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFString FSoWorldState::GetSaveFileNameFromSlot(int32 SlotIndex) const\n{\n\tif (IsForChapter())\n\t\treturn FSoSaveHelper::GetSaveFileNameFromSlot(ChapterFileName, SlotIndex);\n\n\treturn FSoSaveHelper::GetSaveFileNameFromSlot(GetPrefixEpisodeFileName(), SlotIndex);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool FSoWorldState::DoesSaveExistForSlot(int32 SlotIndex) const\n{\n\treturn FSoSaveHelper::DoesSaveFileNameExist(GetSaveFileNameFromSlot(SlotIndex), UserIndex);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSoWorldState::ResetEpisodeAndChapterDataToDefault()\n{\n\tResetMapNameToDefault();\n\tMetadata.CheckAndFixIntegrity();\n\tSaveGameMetadata();\n\n\tif (IsForEpisode())\n\t{\n\t\tFSoEpisodeMapParams EpisodeData;\n\t\tverify(USoLevelHelper::GetEpisodeData(GetEpisodeName(), EpisodeData));\n\t\tSetCheckpointLocation(EpisodeData.CheckpointLocation);\n\t\tWriteInventoryItemList(EpisodeData.EnterInventoryItems);\n\t\tWriteEquippedItemList(EpisodeData.EnterEquippedItems);\n\t\tWriteEquippedSpellItemList(EpisodeData.EnterEquippedSpells);\n\t\tSetInitialMaxHealth(EpisodeData.MaxHealth);\n\t\tSetInitialSpellsCapacity(EpisodeData.SpellsCapacity);\n\t}\n\telse\n\t{\n\t\t// Chapter\n\t\tSetInitialMaxHealth(30);\n\t\tSetInitialSpellsCapacity(2);\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSoWorldState::ResetMapNameToDefault()\n{\n\tif (IsForChapter())\n\t{\n\t\t// Chapter\n\t\tGetStateTableMetadata().MapName = USoLevelHelper::GetFirstChapterName();\n\t}\n\telse\n\t{\n\t\t// Episode\n\t\tGetStateTableMetadata().MapName = USoLevelHelper::GetFirstValidEpisodeName();\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSoWorldState::SetCheckpointLocation(FName CheckpointLocation)\n{\n\tGetStateTableMetadata().CheckpointLocationName = CheckpointLocation;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSoWorldState::SetDisplayedProgressName(FName DisplayedProgressName)\n{\n\tGetStateTableMetadata().DisplayedProgressName = DisplayedProgressName;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSoWorldState::SetMapName(FName MapName)\n{\n\tif (USoLevelHelper::IsValidMapName(MapName))\n\t{\n\t\tGetStateTableMetadata().MapName = MapName;\n\t}\n\telse\n\t{\n\t\tResetMapNameToDefault();\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nESoSaveStatus FSoWorldState::SaveGameMetadata()\n{\n\tUE_LOG(LogSoWorldState, Verbose, TEXT(\"SAVE Metadata\"));\n\n\t// Can happen on editor Builds\n#if WARRIORB_NON_EDITOR_TEST\n\tcheck(bMetadataLoadedOnce);\n#endif\n\n\tMetadata.UpdateToLatestVersion();\n\tFSoSaveWriter SaveWriter;\n\tSaveWriter.Write(FSoStateMetadata::StaticStruct(), &Metadata);\n\n\treturn FSoSaveHelper::SaveToFile(SaveWriter, MetadataFileName, UserIndex) ? ESoSaveStatus::Success : ESoSaveStatus::MetadataFailedToSave;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nESoSaveStatus FSoWorldState::SaveGameToSlot(int32 SlotIndex)\n{\n\tUE_LOG(LogSoWorldState, Verbose, TEXT(\"SAVE Save Slot at index = %d\"), SlotIndex);\n\tif (!VerifyValidSlotIndex(SlotIndex, TEXT(\"SAVE save slot\")))\n\t\treturn ESoSaveStatus::InvalidSaveIndex;\n\n\t// TODO fix this\n\t//if (IsGameSlotACompletedGame(StateTable))\n\t//{\n\t//\tUE_LOG(LogSoWorldState, Warning, TEXT(\"Can't save because this save slot = %d, is marked as a completed game (good job).\"), SlotIndex);\n\t//\treturn ESoSaveStatus::LockedGameCompleted;\n\t//}\n\n#if !PLATFORM_XBOXONE && !PLATFORM_SWITCH\n\t// Create backup of file\n\tif (bAutoBackupBeforeSave)\n\t{\n\t\tFSoSaveHelper::BackupSaveFile(GetSaveFileNameFromSlot(SlotIndex), TEXT(\"BEFORE_SAVE.backup\"), UserIndex);\n\t}\n#endif\n\tFSoStateTable& StateTable = GetStateTable();\n\n\t// Modify Current\n\t// Assume that once saved, this is the current index.\n\tStateTable.UpdateToLatestVersion();\n\tSetSlotIndex(SlotIndex);\n\n\t// Update Save time and game version\n\tStateTable.Metadata.SetSaveTimeToNow();\n\tStateTable.Metadata.GameBuildVersion = USoPlatformHelper::GetGameBuildVersion();\n\tStateTable.Metadata.GameBuildBranch = USoPlatformHelper::GetGameBuildBranch();\n\tStateTable.Metadata.GameBuildCommit = USoPlatformHelper::GetGameBuildCommit();\n\n\t// Fix integrity before\n\tStateTable.CheckAndFixIntegrity();\n\n\t// Calculate Checksum\n\tif (FSoConsoleCommands::IsSpeedRunCompetitionMode())\n\t{\n\t\tStateTable.Metadata.Checksum = StateTable.GetChecksum();\n\t}\n\telse\n\t{\n\t\tStateTable.Metadata.Checksum = TEXT(\"\");\n\t}\n\n\tFSoSaveWriter SaveWriter;\n\tSaveWriter.Write(FSoStateTable::StaticStruct(), &StateTable);\n\tif (FSoSaveHelper::SaveToFile(SaveWriter, GetSaveFileNameFromSlot(SlotIndex), UserIndex))\n\t{\n\t\t// Validate if it saved correctly by loading again from the file\n#if WARRIORB_NON_EDITOR_TEST\n\t\tFSoStateTable SlotLoadStateTable;\n\t\tif (LoadGameStateTableForSlotIntoData(SlotIndex, SlotLoadStateTable) == ESoSaveStatus::Success)\n\t\t{\n\t\t\tif (SlotLoadStateTable != StateTable)\n\t\t\t{\n\t\t\t\tcheckNoEntry();\n\t\t\t}\n\t\t}\n#endif\n\n\t\treturn ESoSaveStatus::Success;\n\t}\n\n\treturn ESoSaveStatus::SaveFailedToSave;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nESoSaveStatus FSoWorldState::DeleteGameInSlot(int32 SlotIndex)\n{\n\tUE_LOG(LogSoWorldState, Verbose, TEXT(\"DELETE Save Slot at index = %d\"), SlotIndex);\n\tif (!VerifyValidSlotIndex(SlotIndex, TEXT(\"DELETE save slot\")))\n\t\treturn ESoSaveStatus::InvalidSaveIndex;\n\n\tconst bool bFileExists = DoesSaveExistForSlot(SlotIndex);\n\n\t// Backup the save slot\n\tbool bStatus = true;\n\tif (bFileExists && bAutoBackupDeletedSaves)\n\t{\n\t\tFSoStateTable DeletedSave;\n\n\t\t// Step 1. Save the StateTable for the SlotIndex\n\t\tif (SlotIndex == GetSlotIndex())\n\t\t{\n\t\t\t// From Memory\n\t\t\tDeletedSave = GetStateTable();\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// Load it from disk\n\t\t\tLoadGameStateTableForSlotIntoData(SlotIndex, DeletedSave);\n\t\t}\n\n\t\t// Backup\n\t\tFString DeletedFileNameNoExt;\n\t\tif (FSoSaveHelper::GetDeletedSaveFileNameFromFileName(GetSaveFileNameFromSlot(SlotIndex), UserIndex, DeletedFileNameNoExt))\n\t\t{\n\t\t\tFSoSaveWriter SaveWriter;\n\t\t\tSaveWriter.Write(FSoStateTable::StaticStruct(), &DeletedSave);\n\t\t\tbStatus &= FSoSaveHelper::SaveToFile(SaveWriter, DeletedFileNameNoExt, UserIndex);\n\t\t}\n\t\tUE_LOG(LogSoWorldState, Verbose, TEXT(\"Creating BACKUP for Deleted Save slot of index = %d to file = `%s`\"), SlotIndex, *DeletedFileNameNoExt);\n\t}\n\n\tif (SlotIndex == GetSlotIndex())\n\t\tResetToDefault();\n\n\t// Do not need to delete anything\n\tif (!bFileExists)\n\t{\n\t\tUE_LOG(LogSoWorldState, Verbose, TEXT(\"File missing for slot index = %d. Not deleting it *shrug*\"), SlotIndex);\n\t\treturn ESoSaveStatus::SaveFileMissing;\n\t}\n\n\t// Delete Save slot\n\tbStatus &= FSoSaveHelper::DeleteSaveFile(GetSaveFileNameFromSlot(SlotIndex), UserIndex);\n\treturn bStatus ? ESoSaveStatus::Success : ESoSaveStatus::SaveFailedToDelete;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nESoSaveStatus FSoWorldState::LoadGameMetadata()\n{\n\tUE_LOG(LogSoWorldState, Verbose, TEXT(\"LOAD Metadata\"));\n\n\t// probably xbox and the user is not signed in yet / atm\n\tif (UserIndex == -1)\n\t{\n\t\treturn ESoSaveStatus::MetadataFileFailedParsing;\n\t}\n\n\t// Does not matter if the file does not exist, we tried\n\tbMetadataLoadedOnce = true;\n\tif (!FSoSaveHelper::DoesSaveFileNameExist(MetadataFileName, UserIndex))\n\t{\n\t\t// Most likely first time loading, set the save time to now\n\t\tUE_LOG(\n\t\t\tLogSoWorldState,\n\t\t\tVerbose,\n\t\t\tTEXT(\"Tried to LOAD Metadata. But file = `%s` does not exist. Creating it for the first ime\"),\n\t\t\t*FSoSaveHelper::GetSaveFilePathFromFileName(MetadataFileName)\n\t\t);\n\t\tMetadata = {};\n\t\tMetadata.CheckAndFixIntegrity();\n\t\treturn SaveGameMetadata();\n\t}\n\n\tFSoSaveParser Parser;\n\tif (FSoSaveHelper::LoadFromFile(Parser, MetadataFileName, UserIndex) && Parser.IsValidFile())\n\t{\n\t\t// Clear Current metadata\n\t\tMetadata = {};\n\t\tParser.ReadAllProperty(FSoStateMetadata::StaticStruct(), &Metadata, nullptr);\n\t\treturn Metadata.CheckAndFixIntegrity() ? SaveGameMetadata() : ESoSaveStatus::Success;\n\t}\n\n\treturn ESoSaveStatus::MetadataFileFailedParsing;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nESoSaveStatus FSoWorldState::LoadGameFromSlot(int32 SlotIndex)\n{\n\tUE_LOG(LogSoWorldState, Verbose, TEXT(\"LOAD Save Slot at index = %d\"), SlotIndex);\n\tif (!VerifyValidSlotIndex(SlotIndex, TEXT(\"LOAD save slot\")))\n\t\treturn ESoSaveStatus::InvalidSaveIndex;\n\n\tResetToDefault();\n\tif (!DoesSaveExistForSlot(SlotIndex))\n\t{\n\t\tUE_LOG(LogSoWorldState, Warning, TEXT(\"SlotIndex = %d save file does not exist, loading empty.\"), SlotIndex);\n\t\tSetSlotIndex(SlotIndex);\n\t\treturn ESoSaveStatus::Success;\n\t}\n\n\t// Load save\n\tFSoStateTable& StateTable = GetStateTable();\n\tif (LoadGameStateTableForSlotIntoData(SlotIndex, StateTable) == ESoSaveStatus::Success)\n\t{\n\t\tSetSlotIndex(SlotIndex);\n\t\treturn ESoSaveStatus::Success;\n\t}\n\n\t// Invalidate, Load default\n\tUE_LOG(LogSoWorldState, Warning, TEXT(\"Invalidating current slot index, setting to default SlotIndex = %d\"), DefaultSlotIndex);\n\tSetSlotIndex(DefaultSlotIndex);\n\tResetToDefault();\n\n\t// Don't care about failure/success, if it is empty we use it, if it is not we simply load it from there\n\tif (DoesSaveExistForSlot(SlotIndex))\n\t\tLoadGameStateTableForSlotIntoData(DefaultSlotIndex, StateTable);\n\n\treturn ESoSaveStatus::SaveFailedToLoad_UsingDefault;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSoWorldState::LogSaveStatusIfError(const ESoSaveStatus Status, const FString& Context)\n{\n\tif (IsSaveStatusSuccessful(Status))\n\t\treturn;\n\n\tFString Message;\n\tswitch (Status)\n\t{\n\tcase ESoSaveStatus::InvalidSaveIndex:\n\t\tMessage = TEXT(\"Save slot index is not in the valid range (most likely negative)\");\n\t\tbreak;\n\tcase ESoSaveStatus::SaveFileMissing:\n\t\tMessage = TEXT(\"Save slot file does not exist (missing on the filesystem)\");\n\t\tbreak;\n\tcase ESoSaveStatus::SaveFileFailedParsing:\n\t\tMessage = TEXT(\"Failed to parse the save slot file (most likely something is corrupt)\");\n\t\tbreak;\n\tcase ESoSaveStatus::SaveFailedToSave:\n\t\tMessage = TEXT(\"SaveGameForChapter failed\");\n\t\tbreak;\n\tcase ESoSaveStatus::SaveFailedToDelete:\n\t\tMessage = TEXT(\"DeleteGameInSlot failed\");\n\t\tbreak;\n\n\tcase ESoSaveStatus::MetadataFileMissing:\n\t\tMessage = TEXT(\"Metadata file does not exist (missing on the filesystem)\");\n\t\tbreak;\n\tcase ESoSaveStatus::MetadataFileFailedParsing:\n\t\tMessage = TEXT(\"Failed to parse metadata file (most likely something is corrupt)\");\n\t\tbreak;\n\tcase ESoSaveStatus::MetadataFailedToSave:\n\t\tMessage = TEXT(\"SaveGameMetadata Failed\");\n\t\tbreak;\n\n\tdefault:\n\t\tMessage = FString::Printf(TEXT(\"Unhandled ESoSaveStatus = %d\"), static_cast<int32>(Status));\n\t\tbreak;\n\t}\n\n\tUE_LOG(LogSoWorldState, Error, TEXT(\"Got ESoSaveStatus with a non success code. Message = `%s`, Context = `%s`\"), *Message, *Context);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nTArray<int32> FSoWorldState::GetAllSavesSlotFilesPaths()\n{\n\tTArray<int32> SaveSlotsFilePaths;\n\n\tfor (int32 i = 0; i < 8; ++i)\n\t{\n\t\tif (DoesSaveExistForSlot(i))\n\t\t{\n\t\t\tSaveSlotsFilePaths.Add(i);\n\t\t}\n\t}\n\n\treturn SaveSlotsFilePaths;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool FSoWorldState::IsStateTableAGameCompleted(const FSoStateTable& StateTable)\n{\n\t// TODO fix this for episodes\n\treturn IsGameFinished(StateTable.Metadata.DisplayedProgressName);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool FSoWorldState::GetAllSavesSlots(TMap<int32, FSoStateTable>& AllSlotsMetadata)\n{\n\tbool bStatus = true;\n\tAllSlotsMetadata.Empty();\n\n\t// Load every save slot file\n\tTArray<int32> AllSaveSlotsFilePaths = GetAllSavesSlotFilesPaths();\n\tfor (const int32 SaveSlotIndex : AllSaveSlotsFilePaths)\n\t{\n\t\tFSoStateTable SlotStateTable;\n\t\tif (LoadGameStateTableForSlotIntoData(SaveSlotIndex, SlotStateTable) == ESoSaveStatus::Success)\n\t\t{\n\t\t\t// NOTE: Duplicates should not exist here, filtered in GetAllSavesSlotFilesPaths\n\t\t\tAllSlotsMetadata.Add(SaveSlotIndex, SlotStateTable);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tbStatus = false;\n\t\t}\n\t}\n\n\treturn bStatus;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool FSoWorldState::VerifyValidSlotIndex(int32 SlotIndex, const TCHAR* ContextMessage)\n{\n\tif (SlotIndex < 0)\n\t{\n\t\tUE_LOG(LogSoWorldState, Warning, TEXT(\"Invalid Negative SlotIndex = %d. Context = %s\"), ContextMessage);\n\t\treturn false;\n\t}\n\n\treturn true;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nESoSaveStatus FSoWorldState::LoadGameStateTableForSlotIntoData(int32 SlotIndex, FSoStateTable& OutStateTable)\n{\n\t// Not on file system\n\tif (!DoesSaveExistForSlot(SlotIndex))\n\t{\n\t\tUE_LOG(LogSoWorldState, Warning, TEXT(\"Tried to LOAD Save Slot at Index = %d. But file = `%s` does not exist\"), SlotIndex, *GetSaveFilePathFromSlot(SlotIndex));\n\t\tOutStateTable.CheckAndFixIntegrity();\n\t\treturn ESoSaveStatus::SaveFileMissing;\n\t}\n\n\t// Load the save file\n\tFSoSaveParser Parser;\n\tif (!FSoSaveHelper::LoadFromFile(Parser, GetSaveFileNameFromSlot(SlotIndex), UserIndex) || !Parser.IsValidFile())\n\t{\n\t\tUE_LOG(LogSoWorldState, Warning, TEXT(\"Tried to PARSE Save Slot at Index = %d. But file = `%s`is not valid\"), SlotIndex, *GetSaveFilePathFromSlot(SlotIndex));\n\t\tOutStateTable.CheckAndFixIntegrity();\n\t\treturn ESoSaveStatus::SaveFileFailedParsing;\n\t}\n\n\t// TODO file can still be invalid\n\tParser.ReadAllProperty(FSoStateTable::StaticStruct(), &OutStateTable, nullptr);\n\tOutStateTable.CheckAndFixIntegrity();\n\n\t// Speed run competition?\n\tif (FSoConsoleCommands::IsSpeedRunCompetitionMode())\n\t{\n\t\t// Most likely the checksum failed, reset everything\n\t\tif (OutStateTable.CheckAndFixIntegrityFromChecksum())\n\t\t{\n\t\t\tUE_LOG(LogSoWorldState, Warning, TEXT(\"CheckAndFixIntegrityFromChecksum is telling us to reset everything. Are you a cheater?\"));\n\t\t\tOutStateTable = {};\n\t\t}\n\t}\n\n\treturn ESoSaveStatus::Success;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSoWorldState::AddNameToSet(FName LevelName, FName ValueName)\n{\n\tif (!CheckAndValidateStringSetInputs(LevelName, ValueName, TEXT(\"AddNameToSet\")))\n\t\treturn;\n\tFSoStateTable& StateTable = GetStateTable();\n\tFSoStringSet* Set = StateTable.StringSets.Find(LevelName);\n\tif (Set == nullptr)\n\t\tSet = &StateTable.StringSets.Add(LevelName);\n\n\tSet->Strings.Add(ValueName);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSoWorldState::RemoveNameFromSet(FName LevelName, FName ValueName)\n{\n\tif (!CheckAndValidateStringSetInputs(LevelName, ValueName, TEXT(\"RemoveNameFromSet\")))\n\t\treturn;\n\n\tFSoStateTable& StateTable = GetStateTable();\n\tFSoStringSet* Set = StateTable.StringSets.Find(LevelName);\n\tif (Set == nullptr)\n\t\treturn;\n\n\tSet->Strings.Remove(ValueName);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool FSoWorldState::IsNameInSet(FName LevelName, FName ValueName) const\n{\n\tCheckAndValidateStringSetInputs(LevelName, ValueName, TEXT(\"IsNameInSet. Not actually ignoring.\"));\n\tFSoStateTable& StateTable = GetStateTable();\n\tconst FSoStringSet* Set = StateTable.StringSets.Find(LevelName);\n\tif (Set == nullptr)\n\t\treturn false;\n\n\treturn Set->Strings.Contains(ValueName);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool FSoWorldState::ReadIntValue(FName LevelName, FName EntryName, FName ValueName, int32& Value)\n{\n\tFSoStateTable& StateTable = GetStateTable();\n\tconst int32* StoredValue = GetIntFromStateTable(StateTable, LevelName, EntryName, ValueName, false);\n\tif (StoredValue != nullptr)\n\t{\n\t\tValue = *StoredValue;\n\t\treturn true;\n\t}\n\treturn false;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSoWorldState::WriteIntValue(FName LevelName, FName EntryName, FName ValueName, int32 Value)\n{\n\tFSoStateTable& StateTable = GetStateTable();\n\tint32* StoredValue = GetIntFromStateTable(StateTable, LevelName, EntryName, ValueName, true);\n\t*StoredValue = Value;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool FSoWorldState::ReadBoolValue(FName LevelName, FName EntryName, FName ValueName, bool& bValue)\n{\n\tint32 Value = 0;\n\tif (ReadIntValue(LevelName, EntryName, ValueName, Value))\n\t{\n\t\tbValue = Value == 0 ? false : true;\n\t\treturn true;\n\t}\n\treturn false;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSoWorldState::WriteBoolValue(FName LevelName, FName EntryName, FName ValueName, bool bValue)\n{\n\tFSoStateTable& StateTable = GetStateTable();\n\tint32* StoredValue = GetIntFromStateTable(StateTable, LevelName, EntryName, ValueName, true);\n\t*StoredValue = (bValue == true ? 1 : 0);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool FSoWorldState::ReadFloatValue(FName LevelName, FName EntryName, FName ValueName, float& Value)\n{\n\tFSoStateTable& StateTable = GetStateTable();\n\tconst float* StoredValue = GetFloatFromStateTable(StateTable, LevelName, EntryName, ValueName, false);\n\tif (StoredValue != nullptr)\n\t{\n\t\tValue = *StoredValue;\n\t\treturn true;\n\t}\n\treturn false;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSoWorldState::WriteFloatValue(FName LevelName, FName EntryName, FName ValueName, float Value)\n{\n\tFSoStateTable& StateTable = GetStateTable();\n\tfloat* StoredValue = GetFloatFromStateTable(StateTable, LevelName, EntryName, ValueName, true);\n\t*StoredValue = Value;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool FSoWorldState::ReadVectorValue(FName LevelName, FName EntryName, FName ValueName, FVector& Value)\n{\n\tFSoStateTable& StateTable = GetStateTable();\n\tconst FVector* StoredValue = GetVectorFromStateTable(StateTable, LevelName, EntryName, ValueName, false);\n\tif (StoredValue != nullptr)\n\t{\n\t\tValue = *StoredValue;\n\t\treturn true;\n\t}\n\treturn false;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSoWorldState::WriteVectorValue(FName LevelName, FName EntryName, FName ValueName, const FVector& Value)\n{\n\tFSoStateTable& StateTable = GetStateTable();\n\tFVector* StoredValue = GetVectorFromStateTable(StateTable, LevelName, EntryName, ValueName, true);\n\t*StoredValue = Value;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nTArray<FSoItem>& FSoWorldState::GetItemList(FName ListName)\n{\n\tFSoStateTable& StateTable = GetStateTable();\n\treturn StateTable.ItemMap.FindOrAdd(ListName).Items;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool FSoWorldState::ReadItemList(FName ListName, TArray<FSoItem>& OutList) const\n{\n\t// TODO special case for episode?\n\tFSoStateTable& StateTable = GetStateTable();\n\t// Difference from GetItemList: This does not create the ListName if it does not exist\n\tconst FSoItemArray* Array = StateTable.ItemMap.Find(ListName);\n\tif (Array == nullptr)\n\t\treturn false;\n\n\tOutList = Array->Items;\n\treturn true;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSoWorldState::WriteItemList(FName ListName, const TArray<FSoItem>& Items)\n{\n\tFSoStateTable& StateTable = GetStateTable();\n\tFSoItemArray* Array = StateTable.ItemMap.Find(ListName);\n\tif (Array == nullptr)\n\t\tStateTable.ItemMap.Add(ListName, FSoItemArray{ Items });\n\telse\n\t\tArray->Items = Items;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nint32* FSoWorldState::GetIntFromStateTable(FSoStateTable& Table, FName LevelName, FName EntryName, FName ValueName, bool bCreate)\n{\n\tFSoStateEntry* Entry = GetEntryFromStateTable(Table, LevelName, EntryName, bCreate);\n\tif (Entry != nullptr)\n\t{\n\t\tint32* Ptr = Entry->Ints.Find(ValueName);\n\t\tif (Ptr == nullptr && bCreate)\n\t\t\tPtr = &Entry->Ints.Add(ValueName, 0);\n\t\treturn Ptr;\n\t}\n\treturn nullptr;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nfloat* FSoWorldState::GetFloatFromStateTable(FSoStateTable& Table, FName LevelName, FName EntryName, FName ValueName, bool bCreate)\n{\n\tFSoStateEntry* Entry = GetEntryFromStateTable(Table, LevelName, EntryName, bCreate);\n\tif (Entry != nullptr)\n\t{\n\t\tfloat* Ptr = Entry->Floats.Find(ValueName);\n\t\tif (Ptr == nullptr && bCreate)\n\t\t\tPtr = &Entry->Floats.Add(ValueName, 0.0f);\n\t\treturn Ptr;\n\t}\n\treturn nullptr;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFVector* FSoWorldState::GetVectorFromStateTable(FSoStateTable& Table, FName LevelName, FName EntryName, FName ValueName, bool bCreate)\n{\n\tFSoStateEntry* Entry = GetEntryFromStateTable(Table, LevelName, EntryName, bCreate);\n\tif (Entry != nullptr)\n\t{\n\t\tFVector* Ptr = Entry->Vectors.Find(ValueName);\n\t\tif (Ptr == nullptr && bCreate)\n\t\t\tPtr = &Entry->Vectors.Add(ValueName, FVector(0,0,0));\n\t\treturn Ptr;\n\t}\n\treturn nullptr;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFSoStateEntry* FSoWorldState::GetEntryFromStateTable(FSoStateTable& Table, FName LevelName, FName EntryName, bool bCreate)\n{\n\tFSoStateEntries* EntryMap = Table.Entries.Find(LevelName);\n\n\tif (EntryMap == nullptr)\n\t{\n\t\t// Create Level name entry inside table\n\t\tif (bCreate)\n\t\t\tEntryMap = &(Table.Entries.Add(LevelName));\n\t\telse\n\t\t\treturn nullptr;\n\t}\n\n\tFSoStateEntry* Entry = EntryMap->Entries.Find(EntryName);\n\tif (Entry == nullptr && bCreate)\n\t\tEntry = &EntryMap->Entries.Add(EntryName);\n\n\treturn Entry;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFSoStateTable& FSoWorldState::GetStateTable() const\n{\n\t// Use this as we must keep references to some actors\n\treturn USoGameSingleton::GetStateTable();\n}\n"
  },
  {
    "path": "Source/SOrb/SaveFiles/SoWorldState.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#pragma once\n\n#include \"UObject/Object.h\"\n\n#include \"Items/SoItemTypes.h\"\n#include \"HAL/FileManager.h\"\n#include \"SoWorldStateTypes.h\"\n#include \"SoWorldStateTable.h\"\n#include \"SoWorldStateEpisodeTypes.h\"\n#include \"Online/SoOnlineCloud.h\"\n\nstruct FSoStateMetadataSaveSlotEntry;\n\nDECLARE_LOG_CATEGORY_EXTERN(LogSoWorldState, All, All);\n\nenum class ESoSaveStatus : uint8\n{\n\tSuccess = 0,\n\n\tInvalidSaveIndex,\n\tSaveFileMissing,\n\tSaveFileFailedParsing,\n\tSaveFailedToSave,\n\tSaveFailedToDelete,\n\n\t// Uses default file\n\tSaveFailedToLoad_UsingDefault,\n\n\tMetadataFileMissing,\n\tMetadataFileFailedParsing,\n\tMetadataFailedToSave,\n\n\t// WTH?\n\tLockedGameCompleted,\n\n\tUnknownError\n};\n\n/**\n * Singleton class storing the state values for save/load and level streaming\n * USoWorldState should offer all functionality, most likely there is no need to use this class directly\n */\nclass FSoWorldState\n{\npublic:\n\t// Get singleton\n\tstatic FSoWorldState& Get();\n\n\t// Forbid copy and assign\n\tFSoWorldState(const FSoWorldState& Other) = delete;\n\tvoid operator=(const FSoWorldState& Other) = delete;\n\n\t//\n\t// Metadata and save slot files\n\t//\n\n\tFSoOnlineCloud& GetCloudSavesManager() { return CloudSaves; }\n\n\tFORCEINLINE void ReloadGameMetaData()\n\t{\n\t\tLoadGameMetadata();\n\t}\n\n\n\t// WorldState for Episode or chapter?\n\tbool IsForEpisode() const { return bForEpisodeState; }\n\tbool IsForChapter() const { return !bForEpisodeState; }\n\tvoid UseForEpisode(int32 SlotIndex, FName EpisodeName)\n\t{\n\t\tbForEpisodeState = true;\n\t\tSetSlotIndex(SlotIndex, false);\n\t\tMetadata.EpisodeName = EpisodeName;\n\t\tSaveGameMetadata();\n\t}\n\tvoid UseForChapter(int32 SlotIndex)\n\t{\n\t\tbForEpisodeState = false;\n\t\tSetSlotIndex(SlotIndex, false);\n\t}\n\n\t// Gets the current used save slot. This is updates if SaveGameForChapter/LoadGameForChapter is successful.\n\tint32 GetSlotIndex() const { return IsForChapter() ? Metadata.ChapterSlotIndex : Metadata.EpisodeSlotIndex; }\n\tvoid SetSlotIndex(int32 Index, bool bSaveMetadata = true)\n\t{\n\t\tif (IsForChapter())\n\t\t\tMetadata.ChapterSlotIndex = Index;\n\t\telse\n\t\t\tMetadata.EpisodeSlotIndex = Index;\n\n\t\tif (bSaveMetadata)\n\t\t\tSaveGameMetadata();\n\t}\n\n\t// Used for consoles\n\tint32 GetUserIndex() const { return UserIndex; }\n\tvoid SetUserIndex(int32 Index) { UserIndex = Index; }\n\n\t// Helper methods to save/load the current save slot index\n\tESoSaveStatus SaveGame() { return SaveGameToSlot(GetSlotIndex()); }\n\tESoSaveStatus LoadGame() { return LoadGameFromSlot(GetSlotIndex()); }\n\n\t// Exists?\n\tbool DoesSaveExist() const { return DoesSaveExistForSlot(GetSlotIndex()); }\n\tbool DoesSaveExistForSlot(int32 SlotIndex) const;\n\n\t// Paths\n\tFString GetSaveFilePath() const { return GetSaveFilePathFromSlot(GetSlotIndex()); }\n\tFString GetSaveFileName() const { return GetSaveFileNameFromSlot(GetSlotIndex()); }\n\tFString GetSaveFilePathFromSlot(int32 SlotIndex) const;\n\tFString GetSaveFileNameFromSlot(int32 SlotIndex) const;\n\n\n\t// Metadata EquippedItems\n\tconst TArray<USoItemTemplate*>& GetMetadataEquippedItems() const { return GetStateTableMetadata().EquippedItems; }\n\tvoid SetMetadataEquippedItems(const TArray<USoItemTemplate*>& EquippedItems)\n\t{\n\t\tGetStateTableMetadata().EquippedItems = EquippedItems;\n\t}\n\n\tFName GetMapName() const { return GetStateTableMetadata().MapName; }\n\tbool IsGameCompleted() const\n\t{\n\t\treturn IsStateTableAGameCompleted(GetStateTable());\n\t}\n\n\tstatic bool IsGameFinished(FName ProgressData)\n\t{\n\t\treturn ProgressData == FinishedProgressSeparate || ProgressData == FinishedProgressSave;\n\t}\n\n\t// SpellsCapacity\n\tint32 GetInitialSpellsCapacity() const { return GetStateTableMetadata().InitialSpellsCapacity; }\n\tvoid SetInitialSpellsCapacity(int32 Value)\n\t{\n\t\tGetStateTableMetadata().InitialSpellsCapacity = Value;\n\t}\n\n\t// HP\n\tint32 GetInitialMaxHealth() const { return GetStateTableMetadata().InitialMaxHealth; }\n\tvoid SetInitialMaxHealth(int32 Value)\n\t{\n\t\tGetStateTableMetadata().InitialMaxHealth = Value;\n\t}\n\n\t// Progress Stats\n\tconst FSoPlayerProgressStats& GetProgressStats() const { return GetStateTableMetadata().ProgressStats; }\n\tvoid SetProgressStats(const FSoPlayerProgressStats& InStats) { GetStateTableMetadata().ProgressStats = InStats; }\n\n\n\t// CheckpointLocationName\n\tbool IsCheckpointLocationDefault() const { return GetCheckpointLocation() == NAME_None; }\n\tFName GetCheckpointLocation() const { return GetStateTableMetadata().CheckpointLocationName; }\n\tvoid SetCheckpointLocation(FName CheckpointLocation);\n\tvoid SetDisplayedProgressName(FName DisplayedProgressName);\n\n\tvoid SetMapName(FName MapName);\n\n\t// Is slot at SlotIndex empty? Note this only checks the metadata\n\tbool IsEmpty() const { return GetStateTableMetadata().IsEmpty(); }\n\n\t// Clears the data from the current slot\n\t// NOTE: does not affect if this is for chapter or episode or the slot index or anything like this\n\tvoid ResetToDefault()\n\t{\n\t\tGetStateTable() = {};\n\t\tCloudSaves = {};\n\t\tResetEpisodeAndChapterDataToDefault();\n\t}\n\n\t// Clears the data from the current slot and then sets the difficulty based on input\n\t// NOTE: does not affect if this is for chapter or episode or the slot index or anything like this\n\tvoid ResetToDefault(ESoDifficulty Difficulty)\n\t{\n\t\tGetStateTable() = {};\n\t\tGetStateTable().Metadata.Difficulty = Difficulty;\n\t\tGetStateTable().Metadata.DisplayedProgressName = FName(\"act1_start\");\n\t\tCloudSaves = {};\n\t\tResetEpisodeAndChapterDataToDefault();\n\t}\n\n\tESoDifficulty GetGameDifficulty() const\n\t{\n\t\treturn GetStateTable().Metadata.Difficulty;\n\t}\n\n\tvoid SetGameDifficulty(ESoDifficulty Difficulty)\n\t{\n\t\tGetStateTable().Metadata.Difficulty = Difficulty;\n\t}\n\n\t// Save game, updates the current slot index to be SlotIndex\n\t// Note: Modifies current slot index\n\tESoSaveStatus SaveGameToSlot(int32 SlotIndex);\n\n\t/**\n\t *  Deletes the game at SlotIndex\n\t * 1. Saves the values for the SlotIndex and\n\t *\tSets the metadata values in memory to empty\n\t * 2. Deletes the save slot file and creates a backup file with all the data\n\t */\n\tESoSaveStatus DeleteGameInSlot(int32 SlotIndex);\n\n\t// Load from the save game. Updates the current slot index to be SlotIndex\n\t// NOTE: if this loads successfully the metadata current save slot index is updated.\n\tESoSaveStatus LoadGameFromSlot(int32 SlotIndex);\n\n\t// For Delete, should we backup?\n\tvoid SetAutoBackupDeletedSaves(bool bBackup) { bAutoBackupDeletedSaves = bBackup; }\n\tvoid SetAutoBackupBeforeSave(bool bBackup) { bAutoBackupBeforeSave = bBackup; }\n\n\t//\n\t// Episodes file saves\n\t//\n\n\tFName GetEpisodeName() const { return Metadata.EpisodeName; }\n\n\t//\n\t// Helper static methods\n\t//\n\n\t// Was it a success or a failure, but we consider loading the default as success\n\tstatic FORCEINLINE bool IsSaveStatusSuccessful(ESoSaveStatus Status)\n\t{\n\t\treturn Status == ESoSaveStatus::Success || Status == ESoSaveStatus::SaveFailedToLoad_UsingDefault\n\t\t\t|| Status == ESoSaveStatus::LockedGameCompleted;\n\t}\n\n\tstatic void LogSaveStatusIfError(const ESoSaveStatus Status, const FString& Context);\n\n\t// Gets all the save slots file paths.\n\t// returns:\n\t//\t\tKey: SlotIndex\n\t//\t\tValue: Absolute file system path\n\tTArray<int32> GetAllSavesSlotFilesPaths();\n\n\t// This save table is marked as a completed game\n\tstatic bool IsStateTableAGameCompleted(const FSoStateTable& StateTable);\n\n\t// Gets all the save slots from the file system\n\tbool GetAllSavesSlots(TMap<int32, FSoStateTable>& AllSlotsMetadata);\n\n\t//\n\t// Manipulate StateTable\n\t//\n\n\t// check StringSets variable\n\tvoid AddNameToSet(FName LevelName, FName Name);\n\tvoid RemoveNameFromSet(FName LevelName, FName Name);\n\tbool IsNameInSet(FName LevelName, FName Name) const;\n\n\t// reads value if there is any entry for the given name\n\t// if there is no value in the map reference is not modified - it is possible if the element was not saved before\n\t// bool and int is stored as int, (ValueName has to be unique inside level/actor/valuetype map)\n\tbool ReadIntValue(FName LevelName, FName EntryName, FName ValueName, int32& Value);\n\tvoid WriteIntValue(FName LevelName, FName EntryName, FName ValueName, int32 Value);\n\n\tbool ReadBoolValue(FName LevelName, FName EntryName, FName ValueName, bool& bValue);\n\tvoid WriteBoolValue(FName LevelName, FName EntryName, FName ValueName, bool bValue);\n\n\tbool ReadFloatValue(FName LevelName, FName EntryName, FName ValueName, float& Value);\n\tvoid WriteFloatValue(FName LevelName, FName EntryName, FName ValueName, float Value);\n\n\tbool ReadVectorValue(FName LevelName, FName EntryName, FName ValueName, FVector& Value);\n\tvoid WriteVectorValue(FName LevelName, FName EntryName, FName ValueName, const FVector& Value);\n\n\t// Get/Read/Write items to the StateTable\n\tTArray<FSoItem>& GetItemList(FName ListName);\n\tbool ReadItemList(FName ListName, TArray<FSoItem>& OutList) const;\n\tvoid WriteItemList(FName ListName, const TArray<FSoItem>& Items);\n\n\tvoid WriteEquippedSpellItemList(const TArray<FSoItem>& Items) { WriteItemList(EquippedSpellListName, Items); }\n\tbool ReadEquippedSpellItemList(TArray<FSoItem>& OutList) const { return ReadItemList(EquippedSpellListName, OutList); }\n\n\tvoid WriteEquippedItemList(const TArray<FSoItem>& Items) { WriteItemList(EquippedItemListName, Items); }\n\tbool ReadEquippedItemList(TArray<FSoItem>& OutList) const { return ReadItemList(EquippedItemListName, OutList); }\n\n\tvoid WriteInventoryItemList(const TArray<FSoItem>& Items) { WriteItemList(InventoryItemListName, Items); }\n\tbool ReadInventoryItemList(TArray<FSoItem>& OutList) const { return ReadItemList(InventoryItemListName, OutList); }\n\n\t// Get/Set Dialogue history\n\tvoid SetDlgHistory(const TMap<FGuid, FDlgHistory>& HistoryMap) { GetStateTable().DlgHistoryMap = HistoryMap; }\n\tconst TMap<FGuid, FDlgHistory>& GetDlgHistory() const { return GetStateTable().DlgHistoryMap; }\n\n\t// Player related stuff:\n\tconst FSoPlayerData& GetPlayerData() const { return GetStateTable().PlayerData; }\n\tvoid SetPlayerData(const FSoPlayerData& PlayerData) { GetStateTable().PlayerData = PlayerData; }\n\n\nprivate:\n\tFSoWorldState() {};\n\n\tFSoStateTableMetadata& GetStateTableMetadata() const { return GetStateTable().Metadata; }\n\tFSoStateTable& GetStateTable() const;\n\n\tvoid ResetMapNameToDefault();\n\tvoid ResetEpisodeAndChapterDataToDefault();\n\n\tFString GetPrefixEpisodeFileName() const\n\t{\n\t\treturn FString::Printf(TEXT(\"%s_%s\"), *EpisodeBaseFileName, *Metadata.EpisodeName.ToString());\n\t}\n\n\tFORCEINLINE static bool CheckAndValidateStringSetInputs(FName LevelName, FName Name, const TCHAR* Context)\n\t{\n\t\tif (LevelName.IsNone())\n\t\t{\n\t\t\tUE_LOG(LogSoWorldState, Error, TEXT(\"Got LevelName = `None` and Name = `%s` with Context = `%s`. Ignoring\"), *Name.ToString(), Context);\n\t\t\treturn false;\n\t\t}\n\n\t\tif (Name.IsNone())\n\t\t{\n\t\t\tUE_LOG(LogSoWorldState, Error, TEXT(\"Got Name = `None` in LevelName = `%s` with Context = `%s`. Ignoring\"), *LevelName.ToString(), Context);\n\t\t\treturn false;\n\t\t}\n\n\t\tif (!Name.IsValidIndexFast())\n\t\t{\n\t\t\tUE_LOG(LogSoWorldState, Error, TEXT(\"Got Name.IsValidIndexFast() == false in LevelName = `%s` with Context = `%s`. Ignoring\"), *LevelName.ToString(), Context);\n\t\t\treturn false;\n\t\t}\n\n\t\treturn true;\n\t}\n\n\t// Helper methods:\n\tstatic FSoStateEntry* GetEntryFromStateTable(FSoStateTable& Table, FName LevelName, FName EntryName, bool bCreate = false);\n\tstatic int32* GetIntFromStateTable(FSoStateTable& Table, FName LevelName, FName EntryName, FName ValueName, bool bCreate = false);\n\tstatic float* GetFloatFromStateTable(FSoStateTable& Table, FName LevelName, FName EntryName, FName ValueName, bool bCreate = false);\n\tstatic FVector* GetVectorFromStateTable(FSoStateTable& Table, FName LevelName, FName EntryName, FName ValueName, bool bCreate = false);\n\n\t// Validate SlotIndex is valid, ouput error message if it is not\n\tstatic bool VerifyValidSlotIndex(int32 SlotIndex, const TCHAR* ContextMessage);\n\n\t// Save the Metadata to file.\n\tESoSaveStatus SaveGameMetadata();\n\n\t// Loads the Metadata from file\n\tESoSaveStatus LoadGameMetadata();\n\n\t// Loads the state table from the file system\n\tESoSaveStatus LoadGameStateTableForSlotIntoData(int32 SlotIndex, FSoStateTable& OutStateTable);\n\nprivate:\n\t// Represents metadata for the save files\n\tFSoStateMetadata Metadata;\n\n\t// Our head is in the clouds\n\tFSoOnlineCloud CloudSaves;\n\n\t// For some platforms, master user index to identify the user doing the saving.\n#if PLATFORM_XBOXONE\n\tint32 UserIndex = -1;\n#else\n\tint32 UserIndex = 0;\n#endif\n\n\t// Current World is for a chapter or episode?\n\tbool bForEpisodeState = false;\n\n\t// Was the metadata file loaded at least once?\n\t// Lazy set\n\tbool bMetadataLoadedOnce = false;\n\n\t// Was the data reset to default\n\t// Lazy set\n\tbool bInitializedOnce = false;\n\n\t// Should auto backup deleted saves\n\tbool bAutoBackupDeletedSaves = true;\n\n\t// Should we backup saves before saving.\n\tbool bAutoBackupBeforeSave = true;\n\n\t// Default slot index used if anything else fails.\n\tstatic constexpr int32 DefaultSlotIndex = 0;\n\n\t// The metadata file name\n\tstatic const FString MetadataFileName;\n\n\t// The chapter file name\n\tstatic const FString ChapterFileName;\n\n\t// The episodes file name\n\tstatic const FString EpisodeBaseFileName;\n\tstatic const FString EpisodesFileName;\n\n\t// Set in Gatekeeper_AfterBattle\n\tstatic const FName Chapter1CompletedName;\n\tstatic const FName Chapter2CompletedName;\n\n\t// set when the player chooses the ending\n\tstatic const FName FinishedProgressSave;\n\tstatic const FName FinishedProgressSeparate;\n\n\t// Item lists\n\tstatic const FName InventoryItemListName;\n\tstatic const FName EquippedItemListName;\n\tstatic const FName EquippedSpellListName;\n};\n"
  },
  {
    "path": "Source/SOrb/SaveFiles/SoWorldStateBlueprint.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#include \"SoWorldStateBlueprint.h\"\n#include \"Levels/SoLevelHelper.h\"\n#include \"GameFramework/Actor.h\"\n\n#include \"SoWorldState.h\"\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// Blueprint interface\nbool USoWorldState::ReadIntValue(const AActor* Actor, FName ValueName, UPARAM(Ref)int32& Value)\n{\n\tif (!IsValid(Actor))\n\t{\n\t\tUE_LOG(LogSoWorldState, Error, TEXT(\"ReadIntValue failed: input actor is not valid (nullptr OR IsPendingKill)\"));\n\t\treturn false;\n\t}\n\n\tconst FName LevelName = USoLevelHelper::GetLevelNameFromActor(Actor);\n\tconst FName ActorName = Actor->GetFName();\n\treturn FSoWorldState::Get().ReadIntValue(LevelName, ActorName, ValueName, Value);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nint32 USoWorldState::GetIntValue(const UObject* WorldContextObject, FName ValueName)\n{\n\tconst AActor* Actor = Cast<const AActor>(WorldContextObject);\n\tif (!IsValid(Actor))\n\t{\n\t\tUE_LOG(LogSoWorldState, Error, TEXT(\"GetIntValue failed: input actor is not valid (nullptr OR IsPendingKill)\"));\n\t\treturn false;\n\t}\n\n\tconst FName LevelName = USoLevelHelper::GetLevelNameFromActor(Actor);\n\tconst FName ActorName = Actor->GetFName();\n\tint32 TempValue = 0;\n\tFSoWorldState::Get().ReadIntValue(LevelName, ActorName, ValueName, TempValue);\n\treturn TempValue;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoWorldState::ReadBoolValue(const AActor* Actor, FName ValueName, UPARAM(Ref)bool& bValue)\n{\n\tif (!IsValid(Actor))\n\t{\n\t\tUE_LOG(LogSoWorldState, Error, TEXT(\"ReadBoolValue failed: input actor is not valid (nullptr OR IsPendingKill)\"));\n\t\treturn false;\n\t}\n\n\tconst FName LevelName = USoLevelHelper::GetLevelNameFromActor(Actor);\n\tconst FName ActorName = Actor->GetFName();\n\treturn FSoWorldState::Get().ReadBoolValue(LevelName, ActorName, ValueName, bValue);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoWorldState::GetBoolValue(const UObject* WorldContextObject, FName ValueName)\n{\n\tconst AActor* Actor = Cast<const AActor>(WorldContextObject);\n\tif (!IsValid(Actor))\n\t{\n\t\tUE_LOG(LogSoWorldState, Error, TEXT(\"GetBoolValue failed: input actor is not valid (nullptr OR IsPendingKill)\"));\n\t\treturn false;\n\t}\n\n\tconst FName LevelName = USoLevelHelper::GetLevelNameFromActor(Actor);\n\tconst FName ActorName = Actor->GetFName();\n\tbool bValue = false;\n\tFSoWorldState::Get().ReadBoolValue(LevelName, ActorName, ValueName, bValue);\n\treturn bValue;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoWorldState::WriteIntValue(const AActor* Actor, FName ValueName, int32 Value)\n{\n\tif (!IsValid(Actor))\n\t{\n\t\tUE_LOG(LogSoWorldState, Error, TEXT(\"WriteIntValue failed: input actor is not valid (nullptr OR IsPendingKill)\"));\n\t\treturn;\n\t}\n\n\tconst FName LevelName = USoLevelHelper::GetLevelNameFromActor(Actor);\n\tconst FName ActorName = Actor->GetFName();\n\tFSoWorldState::Get().WriteIntValue(LevelName, ActorName, ValueName, Value);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoWorldState::WriteBoolValue(const AActor* Actor, FName ValueName, bool bValue)\n{\n\tif (!IsValid(Actor))\n\t{\n\t\tUE_LOG(LogSoWorldState, Error, TEXT(\"WriteBoolValue failed: input actor is not valid (nullptr OR IsPendingKill)\"));\n\t\treturn;\n\t}\n\n\tconst FName LevelName = USoLevelHelper::GetLevelNameFromActor(Actor);\n\tconst FName ActorName = Actor->GetFName();\n\tFSoWorldState::Get().WriteBoolValue(LevelName, ActorName, ValueName, bValue);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoWorldState::ReadFloatValue(const AActor* Actor, FName ValueName, UPARAM(Ref)float& Value)\n{\n\tif (!IsValid(Actor))\n\t{\n\t\tUE_LOG(LogSoWorldState, Error, TEXT(\"ReadFloatValue failed: input actor is not valid (nullptr OR IsPendingKill)\"));\n\t\treturn false;\n\t}\n\n\tconst FName LevelName = USoLevelHelper::GetLevelNameFromActor(Actor);\n\tconst FName ActorName = Actor->GetFName();\n\treturn FSoWorldState::Get().ReadFloatValue(LevelName, ActorName, ValueName, Value);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoWorldState::WriteFloatValue(const AActor* Actor, FName ValueName, float Value)\n{\n\tif (!IsValid(Actor))\n\t{\n\t\tUE_LOG(LogSoWorldState, Error, TEXT(\"WriteFloatValue failed: input actor is not valid (nullptr OR IsPendingKill)\"));\n\t\treturn;\n\t}\n\n\tconst FName LevelName = USoLevelHelper::GetLevelNameFromActor(Actor);\n\tconst FName ActorName = Actor->GetFName();\n\tFSoWorldState::Get().WriteFloatValue(LevelName, ActorName, ValueName, Value);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoWorldState::ReadVectorValue(const AActor* Actor, FName ValueName, UPARAM(Ref)FVector& Value)\n{\n\tif (!IsValid(Actor))\n\t{\n\t\tUE_LOG(LogSoWorldState, Error, TEXT(\"ReadVectorValue failed: input actor is not valid (nullptr OR IsPendingKill)\"));\n\t\treturn false;\n\t}\n\n\tconst FName LevelName = USoLevelHelper::GetLevelNameFromActor(Actor);\n\tconst FName ActorName = Actor->GetFName();\n\tif (!CheckAndValidateFName(ActorName))\n\t{\n\t\tUE_LOG(LogSoWorldState, Error, TEXT(\"ReadVectorValue failed: ActorName for input Actor is not valid :O\"));\n\t\treturn false;\n\t}\n\n\treturn FSoWorldState::Get().ReadVectorValue(LevelName, ActorName, ValueName, Value);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoWorldState::WriteVectorValue(const AActor* Actor, FName ValueName, const FVector& Value)\n{\n\tif (!IsValid(Actor))\n\t{\n\t\tUE_LOG(LogSoWorldState, Error, TEXT(\"WriteVectorValue failed: input actor is not valid (nullptr OR IsPendingKill)\"));\n\t\treturn;\n\t}\n\n\tconst FName LevelName = USoLevelHelper::GetLevelNameFromActor(Actor);\n\tconst FName ActorName = Actor->GetFName();\n\tif (!CheckAndValidateFName(ActorName))\n\t{\n\t\tUE_LOG(LogSoWorldState, Error, TEXT(\"WriteVectorValue failed: ActorName for input Actor is not valid :O\"));\n\t\treturn;\n\t}\n\n\tFSoWorldState::Get().WriteVectorValue(LevelName, ActorName, ValueName, Value);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoWorldState::AddNameToSet(const AActor* Actor, FName Name)\n{\n\tif (!IsValid(Actor))\n\t{\n\t\tUE_LOG(LogSoWorldState, Error, TEXT(\"AddNameToSet failed: input actor is not valid (nullptr OR IsPendingKill)\"));\n\t}\n\n\tconst FName LevelName = USoLevelHelper::GetLevelNameFromActor(Actor);\n\tif (!CheckAndValidateFName(Name))\n\t{\n\t\tUE_LOG(LogSoWorldState, Error, TEXT(\"AddNameToSet failed: Name for input Actor = `%s` is not valid :O\"), *Actor->GetName());\n\t\treturn;\n\t}\n\n\tFSoWorldState::Get().AddNameToSet(LevelName, Name);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoWorldState::AddActorNameToSet(const AActor* Actor)\n{\n\tif (!IsValid(Actor))\n\t{\n\t\tUE_LOG(LogSoWorldState, Error, TEXT(\"AddActorNameToSet failed: input actor is not valid (nullptr OR IsPendingKill)\"));\n\t}\n\n\tconst FName LevelName = USoLevelHelper::GetLevelNameFromActor(Actor);\n\tconst FName ActorName = Actor->GetFName();\n\tif (!CheckAndValidateFName(ActorName))\n\t{\n\t\tUE_LOG(LogSoWorldState, Error, TEXT(\"AddActorNameToSet failed: ActorName for input Actor is not valid :O\"));\n\t\treturn;\n\t}\n\n\tFSoWorldState::Get().AddNameToSet(LevelName, ActorName);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoWorldState::RemoveActorNameFromSet(const AActor* Actor)\n{\n\tif (!IsValid(Actor))\n\t{\n\t\tUE_LOG(LogSoWorldState, Error, TEXT(\"RemoveActorNameFromSet failed: input actor is not valid (nullptr OR IsPendingKill)\"));\n\t\treturn;\n\t}\n\n\tconst FName LevelName = USoLevelHelper::GetLevelNameFromActor(Actor);\n\tconst FName ActorName = Actor->GetFName();\n\tif (!CheckAndValidateFName(ActorName))\n\t{\n\t\tUE_LOG(LogSoWorldState, Error, TEXT(\"RemoveActorNameFromSet failed: ActorName for input Actor is not valid :O\"));\n\t\treturn;\n\t}\n\n\tFSoWorldState::Get().RemoveNameFromSet(LevelName, ActorName);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoWorldState::AddMyNameToSet(const UObject* WorldContextObject)\n{\n\tAddActorNameToSet(Cast<AActor>(WorldContextObject));\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoWorldState::RemoveMyNameFromSet(const UObject* WorldContextObject)\n{\n\tRemoveActorNameFromSet(Cast<AActor>(WorldContextObject));\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoWorldState::IsMyNameInSet(const UObject* WorldContextObject)\n{\n\treturn IsActorNameInSet(Cast<AActor>(WorldContextObject));\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoWorldState::RemoveNameFromSet(const AActor* Actor, FName Name)\n{\n\tif (!IsValid(Actor))\n\t{\n\t\tUE_LOG(LogSoWorldState, Error, TEXT(\"RemoveNameFromSet failed: input actor is not valid (nullptr OR IsPendingKill)\"));\n\t\treturn;\n\t}\n\n\tconst FName LevelName = USoLevelHelper::GetLevelNameFromActor(Actor);\n\tFSoWorldState::Get().RemoveNameFromSet(LevelName, Name);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoWorldState::IsNameInSet(const AActor* Actor, FName Name)\n{\n\tif (!IsValid(Actor))\n\t{\n\t\tUE_LOG(LogSoWorldState, Error, TEXT(\"IsNameInSet failed: input actor is not valid (nullptr OR IsPendingKill)\"));\n\t\treturn false;\n\t}\n\n\tconst FName LevelName = USoLevelHelper::GetLevelNameFromActor(Actor);\n\treturn FSoWorldState::Get().IsNameInSet(LevelName, Name);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoWorldState::IsActorNameInSet(const AActor* Actor)\n{\n\tif (!IsValid(Actor))\n\t{\n\t\tUE_LOG(LogSoWorldState, Error, TEXT(\"IsActorNameInSet failed: input actor is not valid (nullptr OR IsPendingKill)\"));\n\t\treturn false;\n\t}\n\n\tconst FName LevelName = USoLevelHelper::GetLevelNameFromActor(Actor);\n\tconst FName ActorName = Actor->GetFName();\n\tif (!CheckAndValidateFName(ActorName))\n\t{\n\t\tUE_LOG(LogSoWorldState, Error, TEXT(\"IsActorNameInSet failed: ActorName for input Actor is not valid :O\"));\n\t\treturn false;\n\t}\n\n\treturn FSoWorldState::Get().IsNameInSet(LevelName, ActorName);\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoWorldState::CheckAndValidateFName(FName Name)\n{\n\tif (Name.IsNone())\n\t{\n\t\tUE_LOG(LogSoWorldState, Warning, TEXT(\"CheckAndValidateFName: Got Name = `None`.\"));\n\t\treturn false;\n\t}\n\n\tif (!Name.IsValidIndexFast())\n\t{\n\t\tUE_LOG(LogSoWorldState, Warning, TEXT(\"Got Name.IsValidIndexFast() == false\"));\n\t\treturn false;\n\t}\n\n\treturn true;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoWorldState::SetDisplayedProgressName(FName DisplayedProgressName)\n{\n\tif (DisplayedProgressName != NAME_None)\n\t\tFSoWorldState::Get().SetDisplayedProgressName(DisplayedProgressName);\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nESoDifficulty USoWorldState::GetGameDifficulty()\n{\n\treturn FSoWorldState::Get().GetGameDifficulty();\n}\n"
  },
  {
    "path": "Source/SOrb/SaveFiles/SoWorldStateBlueprint.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#pragma once\n\n#include \"UObject/Object.h\"\n#include \"Kismet/BlueprintFunctionLibrary.h\"\n\n#include \"Basic/SoDifficulty.h\"\n\n#include \"SoWorldStateBlueprint.generated.h\"\n\nstruct FSoStateMetadataSaveSlotEntry;\nclass AActor;\n\n/**\n *   Interface to load/write data to the storage\n *\n *  There are different ways to store information here, more specific ones will be created when it becomes more clear what we need to store (for player, npc-s, shops, etc.)\n *\n *  - Entries:\n *\t\tEach actor can store any int/float/vector values with a given ValueName\n *\t\tValues are stored based on LevelName and ActorName, so ValueName has to be unique only within the same actor for the same variable types\n *\t\tIt is something like this:\n *\t\tMap:\n *\t\t\tKey: LevelName\n *\t\t\tValue: Map:\n *\t\t\t\t\t\tKey: ActorName\n *\t\t\t\t\t\tValue: Struct\n *\t\t\t\t\t\t\t\t\tMap<ValueName, int32>\n *\t\t\t\t\t\t\t\t\tMap<ValueName, float>\n *\t\t\t\t\t\t\t\t\tMap<ValueName, fvector>\n *\n *\t\tIn reality it has some extra Struct wrapper so it works with UPROPERTY() macro (nested containers are not supported directly)\n *\n *\t- NameSets:\n *\t\tEach level has a set of names\n *\t\tEach actor can add/remove/check names from his level\n *\n *\t- ItemMap:\n *\t\tItemList-s can be saved/loaded\n *\t\tunique FName is used for identification\n *\n * Typical usage:\n *\t\tread values in BeginPlay()\n *\t\twrite values when they are changed / in EndPlay()\n *\n *  Despite Yoda's wisdom it is absolutely ok to try to read not yet written values (out reference is ignored)\n */\nUCLASS()\nclass SORB_API USoWorldState : public UBlueprintFunctionLibrary\n{\n\tGENERATED_BODY()\npublic:\n\n\t// functions to store value in the global entry storage\n\tUFUNCTION(BlueprintCallable, Category = \"SoWorldState\")\n\tstatic bool ReadIntValue(const AActor* Actor, FName ValueName, UPARAM(Ref)int32& Value);\n\n\t/** returns with int value or 0 if it did not exist */\n\tUFUNCTION(BlueprintPure, Category = \"SoWorldState\", meta = (WorldContext = \"WorldContextObject\"))\n\tstatic int32 GetIntValue(const UObject* WorldContextObject, FName ValueName);\n\n\tUFUNCTION(BlueprintCallable, Category = \"SoWorldState\")\n\tstatic bool ReadBoolValue(const AActor* Actor, FName ValueName, UPARAM(Ref)bool& bValue);\n\n\tUFUNCTION(BlueprintPure, Category = \"SoWorldState\", meta = (WorldContext = \"WorldContextObject\"))\n\tstatic bool GetBoolValue(const UObject* WorldContextObject, FName ValueName);\n\n\tUFUNCTION(BlueprintCallable, Category = \"SoWorldState\")\n\tstatic void WriteIntValue(const AActor* Actor, FName ValueName, int32 Value);\n\n\tUFUNCTION(BlueprintCallable, Category = \"SoWorldState\")\n\tstatic void WriteBoolValue(const AActor* Actor, FName ValueName, bool bValue);\n\n\tUFUNCTION(BlueprintCallable, Category = \"SoWorldState\")\n\tstatic bool ReadFloatValue(const AActor* Actor, FName ValueName, UPARAM(Ref)float& Value);\n\n\tUFUNCTION(BlueprintCallable, Category = \"SoWorldState\")\n\tstatic void WriteFloatValue(const AActor* Actor, FName ValueName, float Value);\n\n\tUFUNCTION(BlueprintCallable, Category = \"SoWorldState\")\n\tstatic bool ReadVectorValue(const AActor* Actor, FName ValueName, UPARAM(Ref)FVector& Value);\n\n\tUFUNCTION(BlueprintCallable, Category = \"SoWorldState\")\n\tstatic void WriteVectorValue(const AActor* Actor, FName ValueName, const FVector& Value);\n\n\t// each level has one StringSet\n\t// actors can add, remove or check strings there\n\tUFUNCTION(BlueprintCallable, Category = \"SoWorldState\")\n\tstatic void AddNameToSet(const AActor* Actor, FName Name);\n\n\tUFUNCTION(BlueprintCallable, Category = \"SoWorldState\")\n\tstatic void AddActorNameToSet(const AActor* Actor);\n\n\tUFUNCTION(BlueprintCallable, Category = \"SoWorldState\")\n\tstatic void RemoveActorNameFromSet(const AActor* Actor);\n\n\tUFUNCTION(BlueprintCallable, Category = \"SoWorldState\")\n\tstatic void RemoveNameFromSet(const AActor* Actor, FName Name);\n\n\tUFUNCTION(BlueprintCallable, Category = \"SoWorldState\")\n\tstatic bool IsNameInSet(const AActor* Actor, FName Name);\n\n\tUFUNCTION(BlueprintPure, Category = \"SoWorldState\")\n\tstatic bool IsActorNameInSet(const AActor* Actor);\n\n\tUFUNCTION(BlueprintCallable, Category = \"SoWorldState\", meta = (WorldContext = \"WorldContextObject\"))\n\tstatic void AddMyNameToSet(const UObject* WorldContextObject);\n\n\tUFUNCTION(BlueprintCallable, Category = \"SoWorldState\", meta = (WorldContext = \"WorldContextObject\"))\n\tstatic void RemoveMyNameFromSet(const UObject* WorldContextObject);\n\n\tUFUNCTION(BlueprintPure, Category = \"SoWorldState\", meta = (WorldContext = \"WorldContextObject\"))\n\tstatic bool IsMyNameInSet(const UObject* WorldContextObject);\n\n\n\tUFUNCTION(BlueprintCallable, Category = \"SoWorldState\")\n\tstatic void SetDisplayedProgressName(FName DisplayedProgressName);\n\n\n\tUFUNCTION(BlueprintPure, Category = \"SoWorldState\", meta = (WorldContext = \"WorldContextObject\"))\n\tstatic ESoDifficulty GetGameDifficulty();\n\nprivate:\n\tstatic bool CheckAndValidateFName(FName Name);\n};\n"
  },
  {
    "path": "Source/SOrb/SaveFiles/SoWorldStateEpisodeTypes.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#include \"SoWorldStateEpisodeTypes.h\"\n\n// #include \"Levels/SoLevelHelper.h\"\n\nDEFINE_LOG_CATEGORY_STATIC(LogSoWorldStateEpisodes, All, All);\n\n// ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// void FSoWorldStateEpisode::CheckAndFixIntegrity()\n// {\n// \tif (Version < FSoWorldStateEpisodeVersion::Initial || Version > FSoWorldStateEpisodeVersion::LatestVersion)\n// \t{\n// \t\tUE_LOG(LogSoWorldStateEpisodes, Warning, TEXT(\"StateTable: Failed integrity, Version not in range [0, LatestVersion]. Resseting Version to LatestVersion\"));\n// \t\tVersion = FSoWorldStateEpisodeVersion::LatestVersion;\n// \t}\n//\n// \tif (TotalPlayTimeSeconds < 0.f)\n// \t{\n// \t\tUE_LOG(LogSoWorldStateEpisodes, Warning, TEXT(\"Failed integrity, PlayTimeSeconds < 0. Resseting to 0\"));\n// \t\tTotalPlayTimeSeconds = 0.f;\n// \t}\n//\n// \t// Rest if not even completed\n// \tif (Progress == ESoEpisodeProgress::Started)\n// \t{\n// \t\tTotalPlayTimeSeconds = 0.f;\n// \t}\n// }\n//\n// ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// void FSoWorldStateEpisodesTable::CheckAndFixIntegrity()\n// {\n// \tif (Version < FSoWorldStateEpisodeVersion::Initial || Version > FSoWorldStateEpisodeVersion::LatestVersion)\n// \t{\n// \t\tUE_LOG(LogSoWorldStateEpisodes, Warning, TEXT(\"StateTable: Failed integrity, Version not in range [0, LatestVersion]. Resseting Version to LatestVersion\"));\n// \t\tVersion = FSoWorldStateEpisodeVersion::LatestVersion;\n// \t}\n//\n// \tfor (auto& KeyValue : EpisodesMap)\n// \t\tKeyValue.Value.CheckAndFixIntegrity();\n// }\n//\n// ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// FSoWorldStateEpisode& FSoWorldStateEpisodesTable::GetCurrentEpisode()\n// {\n// \tstatic FSoWorldStateEpisode Empty;\n// \tif (USoLevelHelper::IsValidEpisodeName(EpisodeName))\n// \t\treturn GetOrAddEpisode(EpisodeName);\n//\n// \treturn Empty;\n// }\n//\n// ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// void FSoWorldStateEpisodesTable::SetCurrentEpisodeState(const FSoWorldStateEpisode& NewState)\n// {\n// \t// Completed\n// \tif (USoLevelHelper::IsValidEpisodeName(EpisodeName) && NewState.Progress == ESoEpisodeProgress::Completed)\n// \t{\n// \t\tFSoWorldStateEpisode* CurrentEpisode = GetOrAddEpisodePtr(EpisodeName);\n// \t\tif (CurrentEpisode->Progress == ESoEpisodeProgress::Completed)\n// \t\t{\n// \t\t\t// Better time?\n// \t\t\tif (CurrentEpisode->TotalPlayTimeSeconds > NewState.TotalPlayTimeSeconds)\n// \t\t\t\t*CurrentEpisode = NewState;\n// \t\t}\n// \t\telse\n// \t\t{\n// \t\t\t// First time\n// \t\t\t*CurrentEpisode = NewState;\n// \t\t}\n// \t}\n// }\n"
  },
  {
    "path": "Source/SOrb/SaveFiles/SoWorldStateEpisodeTypes.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#pragma once\n\n#include \"CoreMinimal.h\"\n#include \"Levels/SoEpisodeLevelTypes.h\"\n\n// #include \"SoWorldStateEpisodeTypes.generated.h\"\n\n\n// Keep track of version in save files\nstruct FSoWorldStateEpisodeVersion\n{\n\tenum Type\n\t{\n\t\tInitial = 0,\n\t\tRemovedEpisodeName,\n\n\t\t// -----<new versions can be added above this line>-------------------------------------------------\n\t\tVersionPlusOne,\n\t\tLatestVersion = VersionPlusOne - 1\n\t};\n};\n\n// // Holds the current episode\n// USTRUCT(BlueprintType)\n// struct FSoWorldStateEpisode\n// {\n// \tGENERATED_USTRUCT_BODY()\n// public:\n// \tvoid CheckAndFixIntegrity();\n// \tFORCEINLINE void UpdateToLatestVersion()\n// \t{\n// \t\tVersion = FSoWorldStateEpisodeVersion::LatestVersion;\n// \t}\n//\n// \t// Update SaveTime to reflect the current time.\n// \tFORCEINLINE void SetSaveTimeToNow()\n// \t{\n// \t\t// UTC time so that we can convert back easily to local time if the user changes time zone\n// \t\tSaveTime = FName(*FDateTime::UtcNow().ToIso8601());\n// \t}\n//\n// public:\n// \tUPROPERTY()\n// \tint32 Version = FSoWorldStateEpisodeVersion::LatestVersion;\n//\n// \t// Time this save was made at, UTC time\n// \tUPROPERTY()\n// \tFName SaveTime;\n//\n// \tUPROPERTY()\n// \tESoEpisodeProgress Progress = ESoEpisodeProgress::Started;\n//\n// \tUPROPERTY(BlueprintReadOnly)\n// \tfloat TotalPlayTimeSeconds = 0.f;\n// };\n//\n//\n// // Holds all the episodes\n// USTRUCT(BlueprintType)\n// struct FSoWorldStateEpisodesTable\n// {\n// \tGENERATED_USTRUCT_BODY()\n// public:\n// \tvoid CheckAndFixIntegrity();\n//\n// \tFORCEINLINE void UpdateToLatestVersion()\n// \t{\n// \t\tVersion = FSoWorldStateEpisodeVersion::LatestVersion;\n// \t\tfor (auto& KeyValue : EpisodesMap)\n// \t\t\tKeyValue.Value.UpdateToLatestVersion();\n// \t}\n//\n// \tFSoWorldStateEpisode& GetCurrentEpisode();\n// \tvoid SetCurrentEpisodeState(const FSoWorldStateEpisode& NewState);\n//\n// \tFORCEINLINE const FSoWorldStateEpisode& GetConstCurrentEpisode()\n// \t{\n// \t\treturn const_cast<FSoWorldStateEpisodesTable*>(this)->GetCurrentEpisode();\n// \t}\n//\n// \tFORCEINLINE FSoWorldStateEpisode& GetOrAddEpisode(FName EpisodeName) { return EpisodesMap.FindOrAdd(EpisodeName); }\n// \tFORCEINLINE FSoWorldStateEpisode* GetOrAddEpisodePtr(FName EpisodeName) { return &GetOrAddEpisode(EpisodeName); }\n// \tFORCEINLINE void SetSaveTimeToNow() { GetCurrentEpisode().SetSaveTimeToNow(); }\n//\n// public:\n// \tUPROPERTY()\n// \tint32 Version = FSoWorldStateEpisodeVersion::LatestVersion;\n//\n// \tUPROPERTY()\n// \tTMap<FName, FSoWorldStateEpisode> EpisodesMap;\n//\n// \t// Tells us about the current/last used episode name from the EpisodesArray\n// \tUPROPERTY()\n// \tFName EpisodeName = NAME_None;\n// };\n"
  },
  {
    "path": "Source/SOrb/SaveFiles/SoWorldStateTable.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#include \"SoWorldStateTable.h\"\n#include \"Misc/Guid.h\"\n#include \"Misc/Base64.h\"\n\n#include \"Basic/Helpers/SoStringHelper.h\"\n#include \"Basic/Helpers/SoDateTimeHelper.h\"\n#include \"Levels/SoLevelHelper.h\"\n#include \"SoSaveHelper.h\"\n#include \"DlgHelper.h\"\n#include \"Items/ItemTemplates/SoItemTemplate.h\"\n\nDEFINE_LOG_CATEGORY_STATIC(LogSoWorldStateTable, All, All);\n\nconst FString FSoStateTable::ChecksumSeparator(TEXT(\"||\"));\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSoStateTableMetadata::CheckAndFixIntegrity()\n{\n\tProgressStats.CheckAndFixIntegrity();\n\n\tfor (int32 Index = EquippedItems.Num() - 1; Index >= 0; Index--)\n\t{\n\t\tif (EquippedItems[Index] == nullptr || EquippedItems[Index]->IsPendingKill())\n\t\t{\n\t\t\tUE_LOG(LogSoWorldStateTable, Warning, TEXT(\"StateTableMetadata: Failed integrity, EnterEquippedItems[%d] is not Valid. Removing\"), Index);\n\t\t\tEquippedItems.RemoveAtSwap(Index);\n\t\t}\n\t}\n\n\tif (!USoLevelHelper::IsValidMapName(MapName))\n\t{\n\t\t// TODO does this break anything?\n\t\tUE_LOG(LogSoWorldStateTable, Warning, TEXT(\"Failed integrity, MapName = `%s` is not valid. Using default\"), *MapName.ToString());\n\t\tMapName = NAME_None;\n\t}\n\n\tif (InitialSpellsCapacity < 2)\n\t{\n\t\tInitialSpellsCapacity = 2;\n\t}\n\n\t// TODO the rest\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool FSoStateTableMetadata::GetSaveTimeAsDateTime(FDateTime& OutDateTime, bool bLocalTime) const\n{\n\tconst bool bParsed = FDateTime::ParseIso8601(*SaveTime, OutDateTime);\n\n\t// Convert to local time\n\tif (bParsed && bLocalTime)\n\t\tOutDateTime = USoDateTimeHelper::ConvertUTCTimeToLocalTime(OutDateTime);\n\n\treturn bParsed;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSoStateTableMetadata::UpdateSHA1(FSHA1& HashState) const\n{\n\tUSoStringHelper::UpdateSHA1_String(HashState, SaveTime);\n\t// NOT USED: ChecksumVersion\n\t// NOT USED: Checksum\n\tUSoStringHelper::UpdateSHA1_String(HashState, GameBuildVersion);\n\tUSoStringHelper::UpdateSHA1_String(HashState, GameBuildBranch);\n\tUSoStringHelper::UpdateSHA1_String(HashState, GameBuildCommit);\n\tUSoStringHelper::UpdateSHA1_String(HashState, GameBuildCommit);\n\tUSoStringHelper::UpdateSHA1_UInt8(HashState, static_cast<uint8>(Difficulty));\n\tUSoStringHelper::UpdateSHA1_Name(HashState, CheckpointLocationName);\n\tUSoStringHelper::UpdateSHA1_Name(HashState, MapName);\n\tProgressStats.UpdateSHA1(HashState);\n\tUSoStringHelper::UpdateSHA1_ArrayOfUObjects(HashState, EquippedItems);\n\tUSoStringHelper::UpdateSHA1_Int32(HashState, InitialMaxHealth);\n\tUSoStringHelper::UpdateSHA1_Int32(HashState, InitialSpellsCapacity);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSoStateTable::CheckAndFixIntegrity()\n{\n\tif (Version < FSoWorldStateVersion::RedesignedCombatSystem)\n\t{\n\t\tUE_LOG(LogSoWorldStateTable, Warning, TEXT(\"StateTable: Your save version is too old (before RedesignedCombatSystem), sorry about this :(. \"));\n\t\t*this = {};\n\t}\n\n\tif (Version < FSoWorldStateVersion::Initial || Version > FSoWorldStateVersion::LatestVersion)\n\t{\n\t\tUE_LOG(LogSoWorldStateTable, Warning, TEXT(\"StateTable: Failed integrity, Version not in range [0, LatestVersion]. Resseting Version to LatestVersion\"));\n\t\tVersion = FSoWorldStateVersion::LatestVersion;\n\t}\n\n\tfor (auto& Elem : ItemMap)\n\t\tElem.Value.CheckAndFixIntegrity();\n\n\tMetadata.CheckAndFixIntegrity();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool FSoStateTable::CheckAndFixIntegrityFromChecksum()\n{\n\t// Check Integrity of playtime seconds\n\tconst FString CurrentCheckSum = GetChecksum();\n\tif (Metadata.Checksum == CurrentCheckSum)\n\t\treturn false;\n\n\t// Hash did not match, check playtime seconds\n\tUE_LOG(LogSoWorldStateTable, Error, TEXT(\"StateTable: Failed integrity. The save file did not match the checksum with the current value. Cheater?\"));\n\treturn true;\n\n\t// FString SavedSHA1Checksum;\n\t// int32 SavedChecksumTotalPlaytimeSeconds = 0;\n\t// if (DecodeChecksum(Metadata.Checksum, SavedSHA1Checksum, SavedChecksumTotalPlaytimeSeconds))\n\t// {\n\t// \tconst int32 CurrentTotalPlayTimeSeconds = FMath::RoundToInt(Metadata.ProgressStats.TotalPlayTimeSeconds);\n\t// \tif (CurrentTotalPlayTimeSeconds < SavedChecksumTotalPlaytimeSeconds)\n\t// \t{\n\t// \t\tUE_LOG(\n\t// \t\t\tLogSoWorldStateTable,\n\t// \t\t\tError,\n\t// \t\t\tTEXT(\"StateTable: Failed integrity. CurrentTotalPlayTimeSeconds(%d) < SavedChecksumTotalPlaytimeSeconds(%d). Resetting to checksum you filthy cheater!\"),\n\t// \t\t\tCurrentTotalPlayTimeSeconds, SavedChecksumTotalPlaytimeSeconds\n\t// \t\t);\n\t// \t\tMetadata.ProgressStats.TotalPlayTimeSeconds = SavedChecksumTotalPlaytimeSeconds;\n\t// \t}\n\t// \telse if (CurrentTotalPlayTimeSeconds != SavedChecksumTotalPlaytimeSeconds)\n\t// \t{\n\t// \t\t// Something fucked up\n\t// \t\tbOutResetEverything = true;\n\t// \t}\n\t// }\n\t// else\n\t// {\n\t// \t// Maybe he cheated by omitting the checksum?\n\t// \tbOutResetEverything = true;\n\t// \tUE_LOG(LogSoWorldStateTable, Error, TEXT(\"StateTable: Failed integrity. Can't decode Checksum data!\"));\n\t// }\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool FSoStateTable::operator==(const FSoStateTable& Other) const\n{\n\treturn Version == Other.Version &&\n\t\tFDlgHelper::IsMapEqual(Entries, Other.Entries) &&\n\t\tFDlgHelper::IsMapEqual(StringSets, Other.StringSets) &&\n\t\tFDlgHelper::IsMapEqual(DlgHistoryMap, Other.DlgHistoryMap) &&\n\t\tFDlgHelper::IsMapEqual(ItemMap, Other.ItemMap) &&\n\t\tPlayerData == Other.PlayerData &&\n\t\tMetadata == Other.Metadata;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFString FSoStateTable::GetChecksum() const\n{\n\t// Compute the  hash\n\tFSHA1 HashState;\n\tUSoStringHelper::UpdateSHA1_Int32(HashState, Version);\n\tMetadata.UpdateSHA1(HashState);\n\tfor (const auto& KeyValue : Entries)\n\t{\n\t\tUSoStringHelper::UpdateSHA1_Name(HashState, KeyValue.Key);\n\t\tKeyValue.Value.UpdateSHA1(HashState);\n\t}\n\tfor (const auto& KeyValue : StringSets)\n\t{\n\t\tUSoStringHelper::UpdateSHA1_Name(HashState, KeyValue.Key);\n\t\tKeyValue.Value.UpdateSHA1(HashState);\n\t}\n\tfor (const auto& KeyValue : DlgHistoryMap)\n\t{\n\t\tUSoStringHelper::UpdateSHA1_Data(HashState, KeyValue.Key);\n\t\tfor (int32 Index : KeyValue.Value.VisitedNodeIndices)\n\t\t{\n\t\t\tUSoStringHelper::UpdateSHA1_Int32(HashState, Index);\n\t\t}\n\t}\n\tfor (const auto& KeyValue : ItemMap)\n\t{\n\t\tUSoStringHelper::UpdateSHA1_Name(HashState, KeyValue.Key);\n\t\tKeyValue.Value.UpdateSHA1(HashState);\n\t}\n\tPlayerData.UpdateSHA1(HashState);\n\n\t// Get the hash result\n\tHashState.Final();\n\tFSHAHash Hash;\n\tHashState.GetHash(Hash.Hash);\n\n\t// AES256(BASE64(SHA1Checksum + ChecksumSeparator + TotalPlaytimeSeconds))\n\tconst FString FullString = Hash.ToString()\n\t\t+ ChecksumSeparator\n\t\t+ FString::FromInt(FMath::RoundToInt(Metadata.ProgressStats.TotalPlayTimeSeconds));\n\n\t// Convert to base64\n\treturn USoStringHelper::AES256Encrypt(FBase64::Encode(FullString), FSoSaveHelper::GetPasswordSaveFile());\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool FSoStateTable::DecodeChecksum(const FString& RawChecksum, FString& OutCheckSum, int32& OutTotalPlaytimeSeconds)\n{\n\t// Decrypt AES256\n\tconst FString DecryptedString = USoStringHelper::AES256Decrypt(RawChecksum, FSoSaveHelper::GetPasswordSaveFile());\n\n\t// Base64 decode\n\tFString FullString;\n\tif (!FBase64::Decode(DecryptedString, FullString))\n\t\treturn false;\n\n\t// Split\n\tTArray<FString> ChecksumParts;\n\tif (FullString.ParseIntoArray(ChecksumParts, *ChecksumSeparator, false) == 0)\n\t\treturn false;\n\n\tif (ChecksumParts.Num() < 2)\n\t\treturn false;\n\n\tOutCheckSum = ChecksumParts[0];\n\tOutTotalPlaytimeSeconds = FCString::Atoi(*ChecksumParts[1]);\n\treturn true;\n}\n"
  },
  {
    "path": "Source/SOrb/SaveFiles/SoWorldStateTable.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#pragma once\n\n#include \"Misc/SecureHash.h\"\n\n#include \"SoWorldStateTypes.h\"\n#include \"Stats/SoPlayerProgressStats.h\"\n#include \"DlgMemory.h\"\n#include \"Basic/SoDifficulty.h\"\n\n#include \"SoWorldStateTable.generated.h\"\n\n\n// Holds metadata info for each save slot entry\nUSTRUCT()\nstruct FSoStateTableMetadata\n{\n\tGENERATED_USTRUCT_BODY()\npublic:\n\tFSoStateTableMetadata() {}\n\tFSoStateTableMetadata(const TArray<USoItemTemplate*>& InEquippedItems) :\n\t\tEquippedItems(InEquippedItems) {}\n\n\t// Is this Empty? (aka default)\n\tFORCEINLINE bool IsEmpty() const\n\t{\n\t\treturn SaveTime.IsEmpty() &&\n\t\t\tCheckpointLocationName == NAME_None &&\n\t\t\tEquippedItems.Num() == 0 &&\n\t\t\tProgressStats.IsEmpty();\n\t}\n\n\tvoid CheckAndFixIntegrity();\n\n\t// Update SaveTime to reflect the current time.\n\tFORCEINLINE void SetSaveTimeToNow()\n\t{\n\t\t// UTC time so that we can convert back easily to local time if the user changes time zone\n\t\t// See time format https://en.wikipedia.org/wiki/ISO_8601\n\t\tSaveTime = *FDateTime::UtcNow().ToIso8601();\n\t}\n\n\tbool GetSaveTimeAsDateTime(FDateTime& OutDateTime, bool bLocalTime) const;\n\n\tFORCEINLINE bool operator==(const FSoStateTableMetadata& Other) const\n\t{\n\t\treturn SaveTime == Other.SaveTime &&\n\t\t\tCheckpointLocationName == Other.CheckpointLocationName &&\n\t\t\tMapName == Other.MapName &&\n\t\t\tProgressStats == Other.ProgressStats &&\n\t\t\tEquippedItems == Other.EquippedItems;\n\t}\n\n\tvoid UpdateSHA1(FSHA1& HashState) const;\n\npublic:\n\t// Time this save was made at, UTC time\n\tUPROPERTY()\n\tFString SaveTime;\n\n\t// Checksum of all the data in the files besides this value\n\tUPROPERTY()\n\tint32 ChecksumVersion = 0;\n\tUPROPERTY()\n\tFString Checksum;\n\n\t// In what version of the game was this saved\n\tUPROPERTY()\n\tFString GameBuildVersion;\n\n\t// Build branch\n\tUPROPERTY()\n\tFString GameBuildBranch;\n\n\t// Git commit number\n\tUPROPERTY()\n\tFString GameBuildCommit;\n\n\tUPROPERTY()\n\tESoDifficulty Difficulty = ESoDifficulty::Intended;\n\n\t// Name of the checkpoint location this save is at\n\t// Also saved in the PlayerData, but we want to query the location from the save slots\n\tUPROPERTY()\n\tFName CheckpointLocationName;\n\n\tUPROPERTY()\n\tFName DisplayedProgressName;\n\n\t// Current Map name (Act/Episode), in internal form, use conversion to friendly if you want it in that way\n\tUPROPERTY()\n\tFName MapName;\n\n\t// Progress stats of the game (for all the sessions)\n\tUPROPERTY()\n\tFSoPlayerProgressStats ProgressStats;\n\n\t// Hold all the currently equipped items\n\t// Useful if we want to preview the character in the save slots UI.\n\tUPROPERTY()\n\tTArray<USoItemTemplate*> EquippedItems;\n\n\tUPROPERTY()\n\tint32 InitialMaxHealth = 30.f;\n\n\tUPROPERTY()\n\tint32 InitialSpellsCapacity = 2.f;\n};\n\n\n// Holds the current state information aka a save\nUSTRUCT()\nstruct FSoStateTable\n{\n\tGENERATED_USTRUCT_BODY()\npublic:\n\tvoid CheckAndFixIntegrity();\n\n\t// Returns true if we must reset everything\n\tbool CheckAndFixIntegrityFromChecksum();\n\n\tFORCEINLINE void UpdateToLatestVersion()\n\t{\n\t\tVersion = FSoWorldStateVersion::LatestVersion;\n\t}\n\n\tbool operator==(const FSoStateTable& Other) const;\n\n\tFORCEINLINE bool operator!=(const FSoStateTable& Other) const\n\t{\n\t\treturn !(*this == Other);\n\t}\n\n\tFString GetChecksum() const;\n\n\tstatic bool DecodeChecksum(const FString& RawChecksum, FString& OutCheckSum, int32& OutTotalPlaytimeSeconds);\npublic:\n\t// Version of the save\n\tUPROPERTY(VisibleAnywhere)\n\tint32 Version = FSoWorldStateVersion::LatestVersion;\n\n\t// Metadata for this save slot\n\tUPROPERTY(VisibleAnywhere)\n\tFSoStateTableMetadata Metadata;\n\n\t// Key: LevelName\n\t// Value: Actors in Level\n\tUPROPERTY(VisibleAnywhere)\n\tTMap<FName, FSoStateEntries> Entries;\n\n\t// Key: LevelName\n\tUPROPERTY(VisibleAnywhere)\n\tTMap<FName, FSoStringSet> StringSets;\n\n\t// Key: Dialogue Unique identifier\n\tUPROPERTY(VisibleAnywhere)\n\tTMap<FGuid, FDlgHistory> DlgHistoryMap;\n\n\t// Holds all the item sets\n\t// Key: ItemSetKey\n\tUPROPERTY(VisibleAnywhere)\n\tTMap<FName, FSoItemArray> ItemMap;\n\n\tUPROPERTY(VisibleAnywhere)\n\tFSoPlayerData PlayerData;\n\n\tstatic const FString ChecksumSeparator;\n};\n"
  },
  {
    "path": "Source/SOrb/SaveFiles/SoWorldStateTypes.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#pragma once\n\n#include \"SoWorldStateTypes.h\"\n\n#include \"Basic/Helpers/SoStringHelper.h\"\n#include \"DlgHelper.h\"\n#include \"Levels/SoLevelHelper.h\"\n\nDEFINE_LOG_CATEGORY_STATIC(LogSoWorldStateTypes, All, All);\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool FSoStateEntry::operator==(const FSoStateEntry& Other) const\n{\n\treturn FDlgHelper::IsMapEqual(Ints, Other.Ints) &&\n\t\tFDlgHelper::IsMapEqual(Floats, Other.Floats) &&\n\t\tFDlgHelper::IsMapEqual(Vectors, Other.Vectors);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSoStateEntry::UpdateSHA1(FSHA1& HashState) const\n{\n\tfor (const auto& KeyValue : Ints)\n\t{\n\t\tUSoStringHelper::UpdateSHA1_Name(HashState, KeyValue.Key);\n\t\tUSoStringHelper::UpdateSHA1_Int32(HashState, KeyValue.Value);\n\t}\n\tfor (const auto& KeyValue : Floats)\n\t{\n\t\tUSoStringHelper::UpdateSHA1_Name(HashState, KeyValue.Key);\n\t\tUSoStringHelper::UpdateSHA1_Float(HashState, KeyValue.Value);\n\t}\n\tfor (const auto& KeyValue : Vectors)\n\t{\n\t\tUSoStringHelper::UpdateSHA1_Name(HashState, KeyValue.Key);\n\t\tUSoStringHelper::UpdateSHA1_Data(HashState, KeyValue.Value);\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool FSoStateEntries::operator==(const FSoStateEntries& Other) const\n{\n\treturn FDlgHelper::IsMapEqual(Entries, Other.Entries);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSoStateEntries::UpdateSHA1(FSHA1& HashState) const\n{\n\tfor (const auto& KeyValue : Entries)\n\t{\n\t\tUSoStringHelper::UpdateSHA1_Name(HashState, KeyValue.Key);\n\t\tKeyValue.Value.UpdateSHA1(HashState);\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool FSoStringSet::operator==(const FSoStringSet& Other) const\n{\n\treturn FDlgHelper::IsSetEqual(Strings, Other.Strings);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSoStringSet::UpdateSHA1(FSHA1& HashState) const\n{\n\tfor (FName Name : Strings)\n\t{\n\t\tUSoStringHelper::UpdateSHA1_Name(HashState, Name);\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool FSoNameSet::operator==(const FSoNameSet& Other) const\n{\n\treturn FDlgHelper::IsSetEqual(Names, Other.Names);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSoNameSet::UpdateSHA1(FSHA1& HashState) const\n{\n\tfor (FName Name : Names)\n\t{\n\t\tUSoStringHelper::UpdateSHA1_Name(HashState, Name);\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool FSoPlayerData::operator==(const FSoPlayerData& Other) const\n{\n\treturn FDlgHelper::IsSetEqual(TrueBools, Other.TrueBools) &&\n\t\tFDlgHelper::IsMapEqual(Ints, Other.Ints) &&\n\t\tFDlgHelper::IsMapEqual(Floats, Other.Floats) &&\n\t\tFDlgHelper::IsMapEqual(Names, Other.Names);\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSoItemArray::UpdateSHA1(FSHA1& HashState) const\n{\n\tfor (const auto& Elem : Items)\n\t{\n\t\tElem.UpdateSHA1(HashState);\n\t}\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSoPlayerData::UpdateSHA1(FSHA1& HashState) const\n{\n\tfor (const auto& KeyValue : Ints)\n\t{\n\t\tUSoStringHelper::UpdateSHA1_Name(HashState, KeyValue.Key);\n\t\tUSoStringHelper::UpdateSHA1_Int32(HashState, KeyValue.Value);\n\t}\n\tfor (const auto& KeyValue : Floats)\n\t{\n\t\tUSoStringHelper::UpdateSHA1_Name(HashState, KeyValue.Key);\n\t\tUSoStringHelper::UpdateSHA1_Float(HashState, KeyValue.Value);\n\t}\n\tfor (FName Name : TrueBools)\n\t{\n\t\tUSoStringHelper::UpdateSHA1_Name(HashState, Name);\n\t}\n\tfor (const auto& KeyValue : Names)\n\t{\n\t\tUSoStringHelper::UpdateSHA1_Name(HashState, KeyValue.Key);\n\t\tUSoStringHelper::UpdateSHA1_Name(HashState, KeyValue.Value);\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool FSoStateMetadata::CheckAndFixIntegrity()\n{\n\t// Invalid ranges\n\tbool bFixedSomething = false;\n\tif (Version < FSoWorldStateVersion::Initial || Version > FSoWorldStateVersion::LatestVersion)\n\t{\n\t\tUE_LOG(LogSoWorldStateTypes, Error, TEXT(\"Metadata: Failed integrity, Version not in range [0, LatestVersion]. Resseting Version to LatestVersion\"));\n\t\tVersion = FSoWorldStateVersion::LatestVersion;\n\t\tbFixedSomething = true;\n\t}\n\n\tif (ChapterSlotIndex < 0)\n\t{\n\t\tUE_LOG(LogSoWorldStateTypes, Error, TEXT(\"Metadata: Failed integrity, ChapterSlotIndex < 0. Resseting to 0\"));\n\t\tChapterSlotIndex = 0;\n\t\tbFixedSomething = true;\n\t}\n\n\tif (EpisodeSlotIndex < 0)\n\t{\n\t\tUE_LOG(LogSoWorldStateTypes, Error, TEXT(\"Metadata: Failed integrity, EpisodeSlotIndex < 0. Resseting to 0\"));\n\t\tEpisodeSlotIndex = 0;\n\t\tbFixedSomething = true;\n\t}\n\n\tif (!USoLevelHelper::IsValidEpisodeName(EpisodeName))\n\t{\n\t\tconst FName FirstValidEpisodeName = USoLevelHelper::GetFirstValidEpisodeName();\n\t\tUE_LOG(\n\t\t\tLogSoWorldStateTypes,\n\t\t\tError,\n\t\t\tTEXT(\"Metadata: Failed integrity, EpisodeName = %s is invalid. Resseting to default = %s\"),\n\t\t\t*EpisodeName.ToString(), *FirstValidEpisodeName.ToString()\n\t\t);\n\t\tEpisodeName = FirstValidEpisodeName;\n\t\tbFixedSomething = true;\n\t}\n\n\treturn bFixedSomething;\n}\n"
  },
  {
    "path": "Source/SOrb/SaveFiles/SoWorldStateTypes.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#pragma once\n\n#include \"Misc/SecureHash.h\"\n\n#include \"Items/SoItemTypes.h\"\n#include \"Items/SoItem.h\"\n\n#include \"SoWorldStateTypes.generated.h\"\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// Storage structs\n// Are created so that we can save to text file as we can't directly save TMap/TArray, etc\n\n// Keep track of version in save files\nstruct FSoWorldStateVersion\n{\n\tenum Type\n\t{\n\t\tInitial = 0,\n\t\tMovedMetadataToSaveFiles,\n\t\tRedesignedCombatSystem,\n\t\tAddedEpisode,\n\t\tModifiedALotOfStuffBreakingChanges,\n\n\t\t// -----<new versions can be added above this line>-------------------------------------------------\n\t\tVersionPlusOne,\n\t\tLatestVersion = VersionPlusOne - 1\n\t};\n};\n\n\n// Each actor can have his own FSoStateEntry to store int/float/fvector values\nUSTRUCT()\nstruct FSoStateEntry\n{\n\tGENERATED_USTRUCT_BODY()\npublic:\n\tbool operator==(const FSoStateEntry& Other) const;\n\tvoid UpdateSHA1(FSHA1& HashState) const;\n\npublic:\n\t// Key: VariableName\n\tUPROPERTY(VisibleAnywhere)\n\tTMap<FName, int32> Ints;\n\n\t// Key: VariableName\n\tUPROPERTY(VisibleAnywhere)\n\tTMap<FName, float> Floats;\n\n\t// Key: VariableName\n\tUPROPERTY(VisibleAnywhere)\n\tTMap<FName, FVector> Vectors;\n};\n\n\nUSTRUCT()\nstruct FSoStateEntries\n{\n\tGENERATED_USTRUCT_BODY()\npublic:\n\tbool operator==(const FSoStateEntries& Other) const;\n\tvoid UpdateSHA1(FSHA1& HashState) const;\n\npublic:\n\t// Key: ActorName\n\t// Valee: Variables for this actor\n\tUPROPERTY(VisibleAnywhere)\n\tTMap<FName, FSoStateEntry> Entries;\n};\n\nUSTRUCT()\nstruct FSoStringSet\n{\n\tGENERATED_USTRUCT_BODY()\npublic:\n\tbool operator==(const FSoStringSet& Other) const;\n\tvoid UpdateSHA1(FSHA1& HashState) const;\n\npublic:\n\t// each level has a list of strings here\n\t// actors can add/remove strings or check their existence\n\tUPROPERTY(VisibleAnywhere, Meta = (DlgLinePerItem))\n\tTSet<FName> Strings;\n};\n\n\nUSTRUCT()\nstruct FSoNameSet\n{\n\tGENERATED_USTRUCT_BODY()\npublic:\n\tbool operator==(const FSoNameSet& Other) const;\n\tvoid UpdateSHA1(FSHA1& HashState) const;\n\npublic:\n\tUPROPERTY(VisibleAnywhere, Meta = (DlgLinePerItem))\n\tTSet<FName> Names;\n};\n\n\nUSTRUCT()\nstruct FSoItemArray\n{\n\tGENERATED_USTRUCT_BODY()\npublic:\n\tFORCEINLINE void CheckAndFixIntegrity()\n\t{\n\t\t// TODO maybe\n\t}\n\n\tFORCEINLINE bool operator==(const FSoItemArray& Other) const\n\t{\n\t\treturn Items == Other.Items;\n\t}\n\tvoid UpdateSHA1(FSHA1& HashState) const;\n\npublic:\n\tUPROPERTY()\n\tTArray<FSoItem> Items;\n};\n\n\n/** Player specific stuffs: */\nUSTRUCT()\nstruct FSoPlayerData\n{\n\tGENERATED_USTRUCT_BODY()\npublic:\n\tbool operator==(const FSoPlayerData& Other) const;\n\tvoid UpdateSHA1(FSHA1& HashState) const;\n\npublic:\n\t// Key: VariableName\n\tUPROPERTY()\n\tTMap<FName, int32> Ints;\n\n\t// Key: VariableName\n\tUPROPERTY()\n\tTMap<FName, float> Floats;\n\n\t// All bool variables are in this set, the bool variables not in this set are considered false by default\n\tUPROPERTY()\n\tTSet<FName> TrueBools;\n\n\t// Key: VariableName\n\tUPROPERTY()\n\tTMap<FName, FName> Names;\n};\n\n\n// Holds the metadata for the game, like the current SlotIndex\n//\n// Chapter saves:\n// - SlotIndex - represents the current  slot index for chapter the save\n//\n// Episodes saves:\n//- SlotIndex - represents the current episodfe\n//-\nUSTRUCT()\nstruct FSoStateMetadata\n{\n\tGENERATED_USTRUCT_BODY()\npublic:\n\tbool CheckAndFixIntegrity();\n\n\tFORCEINLINE void UpdateToLatestVersion()\n\t{\n\t\tVersion = FSoWorldStateVersion::LatestVersion;\n\t}\n\npublic:\n\t// Version of the save\n\tUPROPERTY()\n\tint32 Version = FSoWorldStateVersion::LatestVersion;\n\n\t// Last chapter save slot index used. This is the one that will be loaded on game restart by default.\n\tUPROPERTY()\n\tint32 ChapterSlotIndex = 0;\n\n\t// Tells us about the last used episode name from the EpisodesArray\n\tUPROPERTY()\n\tFName EpisodeName = NAME_None;\n\n\t// Last episode save slot index used.\n\t// TODO use it\n\tUPROPERTY()\n\tint32 EpisodeSlotIndex = 0;\n};\n"
  },
  {
    "path": "Source/SOrb/SaveFiles/Stats/SoPlayerProgressItemStats.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#pragma once\n\n#include \"SoPlayerProgressItemStats.h\"\n#include \"Basic/Helpers/SoStringHelper.h\"\n\nDEFINE_LOG_CATEGORY_STATIC(LogSoPlayerProgressItemStats, All, All);\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSoPlayerProgressItemUsageStats::CheckAndFixIntegrity()\n{\n\tif (TimeEquippedSeconds < INDEX_NONE)\n\t{\n\t\tUE_LOG(LogSoPlayerProgressItemStats, Warning, TEXT(\"Failed integrity, ItemUsageStats.TimeEquippedSeconds < INDEX_NONE. Resseting both INDEX_NONE\"));\n\t\tTimeEquippedSeconds = INDEX_NONE;\n\t\tTimeUnEquippedSeconds = INDEX_NONE;\n\t}\n\tif (TimeUnEquippedSeconds < INDEX_NONE)\n\t{\n\t\tUE_LOG(LogSoPlayerProgressItemStats, Warning, TEXT(\"Failed integrity, ItemUsageStats.TimeUnEquippedSeconds < INDEX_NONE. Resseting to INDEX_NONE\"));\n\t\tTimeUnEquippedSeconds = INDEX_NONE;\n\t}\n\n\tif (IsTimeUnEquippedValid() && TimeEquippedSeconds > TimeUnEquippedSeconds)\n\t{\n\t\tUE_LOG(LogSoPlayerProgressItemStats, Warning, TEXT(\"Failed integrity, ItemUsageStats, TimeEquippedSeconds > TimeUnEquippedSeconds. Resseting both to INDEX_NONE\"));\n\t\tTimeEquippedSeconds = INDEX_NONE;\n\t\tTimeUnEquippedSeconds = INDEX_NONE;\n\t\tbSent = false;\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSoPlayerProgressItemUsageStats::UpdateSHA1(FSHA1& HashState) const\n{\n\tUSoStringHelper::UpdateSHA1_Int32(HashState, TimeEquippedSeconds);\n\tUSoStringHelper::UpdateSHA1_Int32(HashState, TimeUnEquippedSeconds);\n\tUSoStringHelper::UpdateSHA1_Int32(HashState, bSent);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSoPlayerProgressItemStats::CheckAndFixIntegrity()\n{\n\tfor (int32 Index = Usages.Num() - 1; Index >= 0; Index--)\n\t{\n\t\tUsages[Index].CheckAndFixIntegrity();\n\t\tif (!Usages[Index].IsValidRange())\n\t\t{\n\t\t\tUE_LOG(LogSoPlayerProgressItemStats, Warning, TEXT(\"Failed integrity, ItemStats.Usages[%d].IsValidRange() == false. Removing\"), Index);\n\t\t\tUsages.RemoveAt(Index);\n\t\t}\n\t}\n\n\t// Should not be a valid range\n\tCurrentUsage.CheckAndFixIntegrity();\n\tif (CurrentUsage.IsValidRange())\n\t{\n\t\tUE_LOG(LogSoPlayerProgressItemStats, Warning, TEXT(\"Failed integrity, ItemStats.CurrentUsage.IsValidRange() == true. Reseeting to default\"));\n\t\tCurrentUsage = {};\n\t}\n\tif (CurrentUsage.bSent == true)\n\t{\n\t\tUE_LOG(LogSoPlayerProgressItemStats, Warning, TEXT(\"Failed integrity, ItemStats.CurrentUsage.bSentAnalytics == true. Reseeting to false\"));\n\t\tCurrentUsage.bSent = false;\n\t}\n\tif (CurrentUsage.IsTimeUnEquippedValid())\n\t{\n\t\tUE_LOG(LogSoPlayerProgressItemStats, Warning, TEXT(\"Failed integrity, ItemStats.IsTimeUnEquippedValid() == true. Reseeting to INDEX_NONE\"));\n\t\tCurrentUsage.TimeUnEquippedSeconds = INDEX_NONE;\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSoPlayerProgressItemStats::UpdateSHA1(FSHA1& HashState) const\n{\n\tUSoStringHelper::UpdateSHA1_Array(HashState, Usages);\n\tCurrentUsage.UpdateSHA1(HashState);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSoPlayerProgressSpellStats::CheckAndFixIntegrity()\n{\n\tif (CastNum < 0)\n\t{\n\t\tCastNum = 0;\n\t\tUE_LOG(LogSoPlayerProgressItemStats, Warning, TEXT(\"Failed integrity, SpellStats.CastNum < 0. Reseting to 0\"));\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSoPlayerProgressSpellStats::UpdateSHA1(FSHA1& HashState) const\n{\n\tUSoStringHelper::UpdateSHA1_Int32(HashState, CastNum);\n}\n"
  },
  {
    "path": "Source/SOrb/SaveFiles/Stats/SoPlayerProgressItemStats.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#pragma once\n\n#include \"CoreMinimal.h\"\n#include \"Misc/SecureHash.h\"\n\n#include \"SoPlayerProgressItemStats.generated.h\"\n\n\n// Holds the stats about the usage of an item\nUSTRUCT(BlueprintType)\nstruct FSoPlayerProgressItemUsageStats\n{\n\tGENERATED_USTRUCT_BODY()\npublic:\n\tFSoPlayerProgressItemUsageStats()\n\t{\n\t\tCheckAndFixIntegrity();\n\t}\n\n\tvoid CheckAndFixIntegrity();\n\n\tFORCEINLINE bool operator==(const FSoPlayerProgressItemUsageStats& Other) const\n\t{\n\t\treturn TimeEquippedSeconds == Other.TimeEquippedSeconds &&\n\t\t\tTimeUnEquippedSeconds == Other.TimeUnEquippedSeconds &&\n\t\t\tbSent == Other.bSent;\n\t}\n\n\t// Do we have a valid range?\n\tFORCEINLINE bool IsValidRange() const\n\t{\n\t\treturn IsTimeEquippedValid() && IsTimeUnEquippedValid() && TimeEquippedSeconds <= TimeUnEquippedSeconds;\n\t}\n\n\tFORCEINLINE bool IsTimeEquippedValid() const { return TimeEquippedSeconds >= 0; }\n\tFORCEINLINE bool IsTimeUnEquippedValid() const { return TimeUnEquippedSeconds >= 0;  }\n\n\tFORCEINLINE void SetTimeEquippedSeconds(const float InTimeSeconds)\n\t{\n\t\tif (!IsTimeEquippedValid())\n\t\t{\n\t\t\tTimeEquippedSeconds = FMath::TruncToInt(InTimeSeconds);\n\t\t\tif (TimeEquippedSeconds < INDEX_NONE)\n\t\t\t\tTimeEquippedSeconds = INDEX_NONE;\n\t\t}\n\t}\n\n\tFORCEINLINE void SetTimeUnEquippedSeconds(const float InTimeSeconds)\n\t{\n\t\tif (!IsTimeUnEquippedValid())\n\t\t{\n\t\t\tTimeUnEquippedSeconds = FMath::TruncToInt(InTimeSeconds);\n\t\t\tif (TimeUnEquippedSeconds < INDEX_NONE)\n\t\t\t\tTimeUnEquippedSeconds = INDEX_NONE;\n\t\t}\n\t}\n\n\tFORCEINLINE bool CanBeSent() const\n\t{\n\t\treturn bSent == false && IsValidRange();\n\t}\n\tFORCEINLINE void MarkAsSent()\n\t{\n\t\tif (IsValidRange())\n\t\t\tbSent = true;\n\t}\n\n\tFORCEINLINE int32 GetTimeUsedSeconds() const\n\t{\n\t\treturn IsValidRange() ? TimeUnEquippedSeconds - TimeEquippedSeconds : 0;\n\t}\n\n\tvoid UpdateSHA1(FSHA1& HashState) const;\npublic:\n\t// Time at which this item was equipped in absolute seconds (from all sessions)\n\tUPROPERTY(BlueprintReadOnly)\n\tint32 TimeEquippedSeconds = INDEX_NONE;\n\n\t// Time at which this item was unequipped in absolute seconds (from all sessions)\n\tUPROPERTY(BlueprintReadOnly)\n\tint32 TimeUnEquippedSeconds = INDEX_NONE;\n\n\t// Was this interval sent to the analytics provider?\n\tUPROPERTY(BlueprintReadOnly)\n\tbool bSent = false;\n};\n\n\n// Holds the stats about an item\nUSTRUCT(BlueprintType)\nstruct FSoPlayerProgressItemStats\n{\n\tGENERATED_USTRUCT_BODY()\npublic:\n\tFSoPlayerProgressItemStats()\n\t{\n\t\tCheckAndFixIntegrity();\n\t}\n\n\tvoid CheckAndFixIntegrity();\n\n\tFORCEINLINE void MarkAllItemsUsageAsSent()\n\t{\n\t\tfor (auto& Elem : Usages)\n\t\t\tElem.MarkAsSent();\n\t}\n\n\t// Equipped this item\n\tFORCEINLINE void EquipItem(const float TimeSeconds)\n\t{\n\t\tCurrentUsage = {};\n\t\tCurrentUsage.SetTimeEquippedSeconds(TimeSeconds);\n\t}\n\n\t// Unequipped this item\n\tFORCEINLINE void UnEquipItem(const float TimeSeconds)\n\t{\n\t\tCurrentUsage.SetTimeUnEquippedSeconds(TimeSeconds);\n\n\t\t// Update current usages\n\t\tif (CurrentUsage.IsValidRange())\n\t\t\tUsages.Add(CurrentUsage);\n\n\t\tCurrentUsage = {};\n\t}\n\n\tvoid UpdateSHA1(FSHA1& HashState) const;\n\npublic:\n\t// Tracks the usage of items, all items here should have a valid range\n\tUPROPERTY(BlueprintReadOnly)\n\tTArray<FSoPlayerProgressItemUsageStats> Usages;\n\n\t// Holds the current usage buffer, this means that this has a valid equipped time but not a valid unequipped time.\n\tUPROPERTY(BlueprintReadOnly)\n\tFSoPlayerProgressItemUsageStats CurrentUsage;\n};\n\n\n// Holds the stats about a spell\nUSTRUCT(BlueprintType)\nstruct FSoPlayerProgressSpellStats\n{\n\tGENERATED_USTRUCT_BODY()\npublic:\n\tFSoPlayerProgressSpellStats()\n\t{\n\t\tCheckAndFixIntegrity();\n\t}\n\n\tvoid CheckAndFixIntegrity();\n\n\tvoid SpellCasted() { CastNum++; }\n\n\tvoid UpdateSHA1(FSHA1& HashState) const;\npublic:\n\t// Number of times it was casted\n\tUPROPERTY(BlueprintReadOnly)\n\tint32 CastNum = 0;\n};\n"
  },
  {
    "path": "Source/SOrb/SaveFiles/Stats/SoPlayerProgressMapStats.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#pragma once\n\n#include \"SoPlayerProgressMapStats.h\"\n\n#include \"Basic/Helpers/SoStringHelper.h\"\n#include \"DlgHelper.h\"\n\nDEFINE_LOG_CATEGORY_STATIC(LogSoPlayerProgressMapStats, All, All);\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSoPlayerProgressMilestoneStats::CheckAndFixIntegrity()\n{\n\tif (TimeSeconds < INDEX_NONE)\n\t{\n\t\tUE_LOG(LogSoPlayerProgressMapStats, Warning, TEXT(\"Failed integrity, Milestone.TimeSeconds < INDEX_NONE. Resseting to INDEX_NONE\"));\n\t\tTimeSeconds = INDEX_NONE;\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSoPlayerProgressMilestoneStats::UpdateSHA1(FSHA1& HashState) const\n{\n\tUSoStringHelper::UpdateSHA1_Int32(HashState, TimeSeconds);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool FSoPlayerProgressMapStats::operator==(const FSoPlayerProgressMapStats& Other) const\n{\n\treturn FDlgHelper::IsMapEqual(Splines, Other.Splines) &&\n\t\tFDlgHelper::IsMapEqual(MilestonesCompleted, Other.MilestonesCompleted);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSoPlayerProgressMapStats::UpdateSHA1(FSHA1& HashState) const\n{\n\tfor (const auto& KeyValue : Splines)\n\t{\n\t\tUSoStringHelper::UpdateSHA1_Name(HashState, KeyValue.Key);\n\t\tKeyValue.Value.UpdateSHA1(HashState);\n\t}\n\tfor (const auto& KeyValue : MilestonesCompleted)\n\t{\n\t\tUSoStringHelper::UpdateSHA1_Name(HashState, KeyValue.Key);\n\t\tKeyValue.Value.UpdateSHA1(HashState);\n\t}\n}\n"
  },
  {
    "path": "Source/SOrb/SaveFiles/Stats/SoPlayerProgressMapStats.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#pragma once\n\n#include \"CoreMinimal.h\"\n#include \"Misc/SecureHash.h\"\n\n#include \"SoPlayerProgressSplineStats.h\"\n\n#include \"SoPlayerProgressMapStats.generated.h\"\n\n\n// Data about each milestone\nUSTRUCT(BlueprintType)\nstruct FSoPlayerProgressMilestoneStats\n{\n\tGENERATED_USTRUCT_BODY()\npublic:\n\tFSoPlayerProgressMilestoneStats()\n\t{\n\t\tCheckAndFixIntegrity();\n\t}\n\n\tvoid CheckAndFixIntegrity();\n\n\tFORCEINLINE bool operator==(const FSoPlayerProgressMilestoneStats& Other) const\n\t{\n\t\treturn TimeSeconds == Other.TimeSeconds;\n\t}\n\n\tFORCEINLINE bool HasTime() { return TimeSeconds > INDEX_NONE; }\n\tFORCEINLINE void SetTimeSeconds(const float InTimeSeconds)\n\t{\n\t\tTimeSeconds = FMath::TruncToInt(InTimeSeconds);\n\t\tif (TimeSeconds < INDEX_NONE)\n\t\t\tTimeSeconds = INDEX_NONE;\n\t}\n\n\tvoid UpdateSHA1(FSHA1& HashState) const;\n\npublic:\n\t// Time at which this milestone was recorded. In absolute seconds (from all sessions)\n\t// If TimeSeconds = INDEX_NONE it means we do not care about the time\n\tUPROPERTY(BlueprintReadOnly)\n\tint32 TimeSeconds = INDEX_NONE;\n\n\t// TODO add bSent for later when we the user can opt out of sending analytics\n};\n\n\n// Contains stats about a map\n// Can be used for an Act Map or an Episode Map\nUSTRUCT(BlueprintType)\nstruct FSoPlayerProgressMapStats\n{\n\tGENERATED_USTRUCT_BODY()\npublic:\n\tFSoPlayerProgressMapStats()\n\t{\n\t\tCheckAndFixIntegrity();\n\t}\n\n\tFORCEINLINE void CheckAndFixIntegrity()\n\t{\n\t\tfor (auto& Elem : Splines)\n\t\t\tElem.Value.CheckAndFixIntegrity();\n\n\t\tfor (auto& Elem : MilestonesCompleted)\n\t\t\tElem.Value.CheckAndFixIntegrity();\n\t}\n\n\tbool operator==(const FSoPlayerProgressMapStats& Other) const;\n\n\tFORCEINLINE void AddMilestone(FName MilestoneName, const float TimeSeconds = INDEX_NONE)\n\t{\n\t\tFSoPlayerProgressMilestoneStats MilestoneStats;\n\t\tMilestoneStats.SetTimeSeconds(TimeSeconds);\n\t\tMilestonesCompleted.Add(MilestoneName, MilestoneStats);\n\t}\n\tFORCEINLINE bool HasMilestone(FName MilestoneName) const { return MilestonesCompleted.Contains(MilestoneName); }\n\n\tFORCEINLINE bool HasSpline(FName SplineName) const { return Splines.Contains(SplineName); }\n\tFORCEINLINE bool HasSplineTimeFirstEnter(FName SplineName) const\n\t{\n\t\treturn HasSpline(SplineName) ? Splines.FindChecked(SplineName).IsTimeFirstEnterValid() : false;\n\t}\n\tFORCEINLINE bool CanSplineCriticalFPSAreasBeSent(FName SplineName) const\n\t{\n\t\treturn HasSpline(SplineName) ? Splines.FindChecked(SplineName).CanCriticalFPSAreasBeSent() : false;\n\t}\n\n\t// Only updates if the FirstEnterTimeSeconds is invalid\n\tFORCEINLINE void UpdateSplineTimeFirstEnter(FName SplineName, float FirstEnterTimeSeconds)\n\t{\n\t\tif (SplineName != NAME_None)\n\t\t\tSplines.FindOrAdd(SplineName).SetTimeFirstEnterSeconds(FirstEnterTimeSeconds);\n\t}\n\n\tFORCEINLINE void UpdateSplineCriticalFPSAreas(FName SplineName, const FSoSplineCriticalFPSAreas& Areas)\n\t{\n\t\tif (SplineName != NAME_None)\n\t\t\tSplines.FindOrAdd(SplineName).UpdateCriticalFPSAreas(Areas);\n\t}\n\n\tFORCEINLINE void UpdateSplineAverageFPS(FName SplineName, int32 NewAverageFPS)\n\t{\n\t\tif (SplineName != NAME_None)\n\t\t\tSplines.FindOrAdd(SplineName).UpdateAverageFPS(NewAverageFPS);\n\t}\n\n\tFORCEINLINE void SetSplineLength(FName SplineName, float Length)\n\t{\n\t\tif (SplineName != NAME_None)\n\t\t\tSplines.FindOrAdd(SplineName).SetSplineLength(Length);\n\t}\n\n\tFORCEINLINE void IncrementSplineCriticalFPSAreasSentRecordsNum(const FName SplineName)\n\t{\n\t\tif (SplineName != NAME_None)\n\t\t\tSplines.FindOrAdd(SplineName).IncrementCriticalFPSAreasSentRecordsNum();\n\t}\n\n\tFORCEINLINE void IncrementSplineEnterNum(FName SplineName)\n\t{\n\t\tif (SplineName != NAME_None)\n\t\t\tSplines.FindOrAdd(SplineName).IncrementEnterNum();\n\t}\n\n\tFORCEINLINE void IncreaseSplineLostHP(FName SplineName, ESoDmgType DamageType, int32 LostHP)\n\t{\n\t\tif (SplineName != NAME_None)\n\t\t\tSplines.FindOrAdd(SplineName).IncreaseLostHP(DamageType, LostHP);\n\t}\n\n\tFORCEINLINE void IncreaseSplineTimeSpent(FName SplineName, float DeltaSeconds)\n\t{\n\t\tif (SplineName != NAME_None)\n\t\t\tSplines.FindOrAdd(SplineName).IncreaseTimeSpent(DeltaSeconds);\n\t}\n\n\tFORCEINLINE void AddSplineDeathEntry(FName SplineName, const FSoSplineDeathContext& DeathContext)\n\t{\n\t\tif (SplineName != NAME_None)\n\t\t\tSplines.FindOrAdd(SplineName).AddDeathEntry(DeathContext);\n\t}\n\n\t// Gets all the splines first time enter value that need to be sent.\n\t// All splines that had their FirstEnterTimeSeconds set in the current session and bSentTimeFirstEnter = false\n\t//\n\t// Returns:\n\t//\tMap:\n\t//\t\tKey: SplineName\n\t//\t\tValue: FirstEnterTimeSeconds\n\tFORCEINLINE TMap<FName, int32> GetAllSplinesFirstTimeEnterForSending() const\n\t{\n\t\tTMap<FName, int32> FilteredSplines;\n\t\tfor (const auto& Elem : Splines)\n\t\t\tif (Elem.Value.IsTimeFirstEnterValid() && Elem.Value.bSentTimeFirstEnter == false && Elem.Value.bSetFirstTimeEnterInCurrentSession == true)\n\t\t\t\tFilteredSplines.Add(Elem.Key, Elem.Value.TimeFirstEnterSeconds);\n\n\t\treturn FilteredSplines;\n\t}\n\n\tFORCEINLINE void MarkAllSplinesFirstTimeEnterAsSent()\n\t{\n\t\tfor (auto& Elem : Splines)\n\t\t\tElem.Value.MarkTimeFirstEnterAsSent();\n\t}\n\n\tvoid UpdateSHA1(FSHA1& HashState) const;\n\npublic:\n\t// Holds info about each spline name in this map\n\t// Key: Spline Name\n\t// Value: Stats about this spline\n\tUPROPERTY(BlueprintReadOnly)\n\tTMap<FName, FSoPlayerProgressSplineStats> Splines;\n\n\t// All the completed milestones\n\tUPROPERTY(BlueprintReadOnly)\n\tTMap<FName, FSoPlayerProgressMilestoneStats> MilestonesCompleted;\n};\n"
  },
  {
    "path": "Source/SOrb/SaveFiles/Stats/SoPlayerProgressSplineStats.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#pragma once\n\n#include \"SoPlayerProgressSplineStats.h\"\n\n#include \"Basic/Helpers/SoStringHelper.h\"\n#include \"DlgHelper.h\"\n\nDEFINE_LOG_CATEGORY_STATIC(LogSoPlayerProgressSplineStats, All, All);\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSoSplineDeathContext::CheckAndFixIntegrity()\n{\n\tif (Distance < 0)\n\t{\n\t\tUE_LOG(LogSoPlayerProgressSplineStats, Warning, TEXT(\"Failed integrity, Spline.DeathData.Distance < 0. Resseting to 0\"));\n\t\tDistance = 0;\n\t}\n\tif (TimeSeconds < 0)\n\t{\n\t\tUE_LOG(LogSoPlayerProgressSplineStats, Warning, TEXT(\"Failed integrity, Spline.DeathData.TimeSeconds < 0. Resseting to 0\"));\n\t\tTimeSeconds = 0;\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSoSplineCriticalFPSLocation::CheckAndFixIntegrity()\n{\n\tif (AverageDistance < 0)\n\t{\n\t\tUE_LOG(LogSoPlayerProgressSplineStats, Warning, TEXT(\"Failed integrity, SplineCriticalFPS.Distance < 0. Resseting to 0\"));\n\t\tAverageDistance = 0;\n\t}\n\tif (AverageCriticalFPS < 0)\n\t{\n\t\tUE_LOG(LogSoPlayerProgressSplineStats, Warning, TEXT(\"Failed integrity, SplineCriticalFPS.CriticalFPS < 0. Resseting to 0\"));\n\t\tAverageCriticalFPS = 0;\n\t}\n\tif (TimeSeconds < 0.f)\n\t{\n\t\tUE_LOG(LogSoPlayerProgressSplineStats, Warning, TEXT(\"Failed integrity, SplineCriticalFPS.TimeSeconds < 0. Resseting to 0\"));\n\t\tTimeSeconds = 0.f;\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSoSplineCriticalFPSAreas::CheckAndFixIntegrity()\n{\n\tfor (auto& Elem : Areas)\n\t\tElem.CheckAndFixIntegrity();\n\n\tif (SentRecordsNum < 0)\n\t{\n\t\tUE_LOG(LogSoPlayerProgressSplineStats, Warning, TEXT(\"Failed integrity, SplineCriticalFPSAreas.SentRecordsNum < 0. Resseting to 0\"));\n\t\tSentRecordsNum = 0;\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSoPlayerProgressSplineStats::CheckAndFixIntegrity()\n{\n\tstatic constexpr int32 NumDamageTypes = static_cast<int32>(ESoDmgType::Max);\n\tfor (int32 Index = 0; Index < NumDamageTypes; Index++)\n\t{\n\t\tconst ESoDmgType Type = static_cast<ESoDmgType>(Index);\n\t\tif (!LostHpByDamageTypeTable.Contains(Type))\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (LostHpByDamageTypeTable[Type] < 0)\n\t\t{\n\t\t\tUE_LOG(LogSoPlayerProgressSplineStats, Warning, TEXT(\"Failed integrity, Spline.LostHpByDamageTypeTable[%d] < 0. Resseting to 0\"), Index);\n\t\t\tLostHpByDamageTypeTable[Type] = 0;\n\t\t}\n\t}\n\n\tif (TimeFirstEnterSeconds < INDEX_NONE)\n\t{\n\t\tUE_LOG(LogSoPlayerProgressSplineStats, Warning, TEXT(\"Failed integrity, Spline.FirstEnterTimeSeconds < INDEX_NONE. Resseting to INDEX_NONE\"));\n\t\tTimeFirstEnterSeconds = INDEX_NONE;\n\t}\n\tif (EnterNum < 0)\n\t{\n\t\tUE_LOG(LogSoPlayerProgressSplineStats, Warning, TEXT(\"Failed integrity, Spline.EnterNum < 0. Resseting to 0\"));\n\t\tEnterNum = 0;\n\t}\n\tif (TimeSpentSeconds < 0.f)\n\t{\n\t\tUE_LOG(LogSoPlayerProgressSplineStats, Warning, TEXT(\"Failed integrity, Spline.TimeSpentSeconds < 0. Resseting to 0\"));\n\t\tTimeSpentSeconds = 0.f;\n\t}\n\tif (AverageFPS < 0)\n\t{\n\t\tUE_LOG(LogSoPlayerProgressSplineStats, Warning, TEXT(\"Failed integrity, Spline.AverageFPS < 0. Resseting to 0\"));\n\t\tAverageFPS = 0;\n\t}\n\tif (LostHp < 0)\n\t{\n\t\tUE_LOG(LogSoPlayerProgressSplineStats, Warning, TEXT(\"Failed integrity, Spline.LostHp < 0. Resseting to 0\"));\n\t\tLostHp = 0;\n\t}\n\n\t// Sent time first enter, but it is not valid, what\n\tif (bSentTimeFirstEnter && !IsTimeFirstEnterValid())\n\t{\n\t\tUE_LOG(LogSoPlayerProgressSplineStats, Warning, TEXT(\"Failed integrity, bSentTimeFirstEnter && !IsTimeFirstEnterValid()\"));\n\t\tbSentTimeFirstEnter = false;\n\t}\n\n\tCriticalFPSAreas.CheckAndFixIntegrity();\n\tfor (auto& Elem : DeathData)\n\t\tElem.CheckAndFixIntegrity();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool FSoPlayerProgressSplineStats::operator==(const FSoPlayerProgressSplineStats& Other) const\n{\n\treturn TimeFirstEnterSeconds == Other.TimeFirstEnterSeconds &&\n\t\tbSentTimeFirstEnter == Other.bSentTimeFirstEnter &&\n\t\tEnterNum == Other.EnterNum &&\n\t\tFMath::IsNearlyEqual(TimeSpentSeconds, Other.TimeSpentSeconds, KINDA_SMALL_NUMBER) &&\n\t\tAverageFPS == Other.AverageFPS &&\n\t\tDeathData == Other.DeathData &&\n\t\tLostHp == Other.LostHp &&\n\t\tFDlgHelper::IsMapEqual(LostHpByDamageTypeTable, Other.LostHpByDamageTypeTable);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSoPlayerProgressSplineStats::UpdateSHA1(FSHA1& HashState) const\n{\n\tUSoStringHelper::UpdateSHA1_Int32(HashState, TimeFirstEnterSeconds);\n\tUSoStringHelper::UpdateSHA1_Int32(HashState, bSentTimeFirstEnter);\n\tUSoStringHelper::UpdateSHA1_Int32(HashState, EnterNum);\n\tUSoStringHelper::UpdateSHA1_Float(HashState, TimeSpentSeconds);\n\tUSoStringHelper::UpdateSHA1_Int32(HashState, AverageFPS);\n\t// NOT USED: CriticalFPSAreas\n\tUSoStringHelper::UpdateSHA1_Int32(HashState, AverageFPS);\n\tUSoStringHelper::UpdateSHA1_Array(HashState, DeathData);\n\tUSoStringHelper::UpdateSHA1_Int32(HashState, LostHp);\n\tfor (const auto& KeyValue : LostHpByDamageTypeTable)\n\t{\n\t\tUSoStringHelper::UpdateSHA1_UInt8(HashState, static_cast<uint8>(KeyValue.Key));\n\t\tUSoStringHelper::UpdateSHA1_Int32(HashState, KeyValue.Value);\n\t}\n}\n"
  },
  {
    "path": "Source/SOrb/SaveFiles/Stats/SoPlayerProgressSplineStats.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#pragma once\n\n#include \"CoreMinimal.h\"\n#include \"Misc/SecureHash.h\"\n\n#include \"Items/SoItem.h\"\n\n#include \"SoPlayerProgressSplineStats.generated.h\"\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// Some player stat stuff\nUSTRUCT(BlueprintType)\nstruct FSoSplineDeathContext\n{\n\tGENERATED_USTRUCT_BODY()\npublic:\n\tFSoSplineDeathContext()\n\t{\n\t\tCheckAndFixIntegrity();\n\t}\n\tFSoSplineDeathContext(const float InDistance, const float InTime, const bool bInSoulKeeperActive) :\n\t\tDistance(FMath::TruncToInt(InDistance)), TimeSeconds(FMath::TruncToInt(InTime)), bSoulKeeperActive(bInSoulKeeperActive)\n\t{\n\t\tCheckAndFixIntegrity();\n\t}\n\n\tvoid CheckAndFixIntegrity();\n\n\tFORCEINLINE bool operator==(const FSoSplineDeathContext& Other) const\n\t{\n\t\treturn Distance == Other.Distance &&\n\t\t\tTimeSeconds == Other.TimeSeconds &&\n\t\t\tbSoulKeeperActive == Other.bSoulKeeperActive;\n\t}\n\npublic:\n\t// Distance of death along the spline.\n\tUPROPERTY(BlueprintReadOnly)\n\tint32 Distance = 0;\n\n\t// Absolute time of death (to all sessions)\n\tUPROPERTY(BlueprintReadOnly)\n\tint32 TimeSeconds = 0;\n\n\t// Is the soul keeper used?\n\tUPROPERTY(BlueprintReadOnly)\n\tbool bSoulKeeperActive = false;\n};\n\n\n// Holds info about an FPS occurrence\nUSTRUCT(BlueprintType)\nstruct FSoSplineCriticalFPSLocation\n{\n\tGENERATED_USTRUCT_BODY()\npublic:\n\tFSoSplineCriticalFPSLocation()\n\t{\n\t\tCheckAndFixIntegrity();\n\t}\n\n\tvoid CheckAndFixIntegrity();\n\n\t// Is this similar to the other? At least ThresholdSimilar units apart\n\tFORCEINLINE bool IsSimilarTo(const FSoSplineCriticalFPSLocation& Other) const\n\t{\n\t\treturn FMath::Abs(AverageDistance - Other.AverageDistance) < ThresholdDistanceSimilar;\n\t}\n\n\t// Combine with the other FPS critical\n\t// Assumes this.IsSimilarTo(Other)\n\tFORCEINLINE void MergeWith(const FSoSplineCriticalFPSLocation& Other)\n\t{\n\t\tTimeSeconds += Other.TimeSeconds;\n\t\tUpdateAverageDistance(Other.AverageDistance);\n\t\tUpdateCriticalAverageFPS(Other.AverageCriticalFPS);\n\t}\n\n\tFORCEINLINE bool IsValid() const\n\t{\n\t\treturn AverageDistance >= 0 && AverageCriticalFPS > 0 && TimeSeconds > 1.f;\n\t}\n\n\tFORCEINLINE void UpdateAverageDistance(const float NewDistance)\n\t{\n\t\tif (NewDistance < 0.f)\n\t\t\treturn;\n\n\t\tif (AverageDistance > 0)\n\t\t\tAverageDistance = FMath::RoundToInt((AverageDistance + NewDistance) / 2.f);\n\t\telse\n\t\t\tAverageDistance = FMath::TruncToInt(NewDistance);\n\t}\n\n\tFORCEINLINE void UpdateCriticalAverageFPS(const float NewAverageFPS)\n\t{\n\t\tif (NewAverageFPS < 0.f)\n\t\t\treturn;\n\n\t\tif (AverageCriticalFPS > 0)\n\t\t\tAverageCriticalFPS = FMath::RoundToInt((AverageCriticalFPS + NewAverageFPS) / 2.f);\n\t\telse\n\t\t\tAverageCriticalFPS = FMath::TruncToInt(NewAverageFPS);\n\t}\n\npublic:\n\t// Average Distance of critical FPS occurrences\n\tUPROPERTY(BlueprintReadOnly)\n\tint32 AverageDistance = 0;\n\n\t// Critical FPS found on this spline\n\tUPROPERTY(BlueprintReadOnly)\n\tint32 AverageCriticalFPS = 0;\n\n\t// For how much time this critical FPS occur\n\tUPROPERTY(BlueprintReadOnly)\n\tfloat TimeSeconds = 0.f;\n\n\t// The threshold so that we do not collect multiple spline in the same are\n\tstatic constexpr int32 ThresholdDistanceSimilar = 1000;\n};\n\n\n// Holds the Array of areas\nUSTRUCT(BlueprintType)\nstruct FSoSplineCriticalFPSAreas\n{\n\tGENERATED_USTRUCT_BODY()\npublic:\n\tFSoSplineCriticalFPSAreas()\n\t{\n\t\tCheckAndFixIntegrity();\n\t}\n\n\tvoid CheckAndFixIntegrity();\n\n\t// Merge other areas into this one\n\tFORCEINLINE void MergeWith(const FSoSplineCriticalFPSAreas& Other)\n\t{\n\t\tif (!Other.HasAreas())\n\t\t\treturn;\n\n\t\tif (Areas.Num() == 0)\n\t\t{\n\t\t\t// Copy\n\t\t\tAreas = Other.Areas;\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// Merge in\n\t\t\tfor (const FSoSplineCriticalFPSLocation& OtherArea : Other.Areas)\n\t\t\t\tAddCriticalFPS(OtherArea);\n\t\t}\n\t}\n\n\tvoid AddCriticalFPS(const FSoSplineCriticalFPSLocation& CriticalFPSEntry)\n\t{\n\t\t// TODO maybe add/search on sorted array, binary search\n\t\tif (!CriticalFPSEntry.IsValid())\n\t\t\treturn;\n\n\t\t// Is similar to anything else?\n\t\tfor (auto& Elem : Areas)\n\t\t\tif (Elem.IsSimilarTo(CriticalFPSEntry))\n\t\t\t{\n\t\t\t\t// Combine with the first occurrence\n\t\t\t\tElem.MergeWith(CriticalFPSEntry);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t// Can't fit anymore :shrug\n\t\tif (Areas.Num() + 1 > MaxCriticalFPSAreas)\n\t\t\treturn;\n\n\t\t// Can add\n\t\tAreas.Add(CriticalFPSEntry);\n\t}\n\n\tFORCEINLINE bool HasAreas() const { return Areas.Num() > 0; }\n\tFORCEINLINE void IncrementSentRecordsNum()\n\t{\n\t\tif (HasAreas())\n\t\t\tSentRecordsNum++;\n\t}\n\n\tFORCEINLINE bool CanBeSent() const\n\t{\n\t\t// MaxCriticalFPSAreas is our limit\n\t\treturn HasAreas() && SentRecordsNum <= MaxCriticalFPSAreas;\n\t}\n\npublic:\n\tUPROPERTY(BlueprintReadOnly)\n\tTArray<FSoSplineCriticalFPSLocation> Areas;\n\n\t// How many times  did we send this data to the analytics server\n\tUPROPERTY(BlueprintReadOnly)\n\tint32 SentRecordsNum = 0;\n\n\t// Maximum amount of max critical FPS areas, depends on the SplineLength if set\n\tint32 MaxCriticalFPSAreas = 10;\n};\n\n\n// Holds the player progress about some spline\nUSTRUCT(BlueprintType)\nstruct FSoPlayerProgressSplineStats\n{\n\tGENERATED_USTRUCT_BODY()\npublic:\n\tFSoPlayerProgressSplineStats()\n\t{\n\t\tCheckAndFixIntegrity();\n\t}\n\n\tvoid CheckAndFixIntegrity();\n\tbool operator==(const FSoPlayerProgressSplineStats& Other) const;\n\n\tFORCEINLINE bool IsTimeFirstEnterValid() const { return TimeFirstEnterSeconds >= 0; }\n\tFORCEINLINE void SetTimeFirstEnterSeconds(const float Seconds)\n\t{\n\t\t// Update if invalid\n\t\tif (!IsTimeFirstEnterValid())\n\t\t{\n\t\t\tbSetFirstTimeEnterInCurrentSession = true;\n\t\t\tTimeFirstEnterSeconds = FMath::TruncToInt(Seconds);\n\t\t\tif (TimeFirstEnterSeconds < INDEX_NONE)\n\t\t\t\tTimeFirstEnterSeconds = INDEX_NONE;\n\t\t}\n\t}\n\tFORCEINLINE void MarkTimeFirstEnterAsSent()\n\t{\n\t\tif (IsTimeFirstEnterValid())\n\t\t\tbSentTimeFirstEnter = true;\n\t}\n\n\tFORCEINLINE void IncrementEnterNum() { EnterNum++; }\n\tFORCEINLINE void IncreaseTimeSpent(float DeltaSeconds) { TimeSpentSeconds += FMath::Abs(DeltaSeconds); }\n\n\tFORCEINLINE void IncreaseLostHP(ESoDmgType DamageType, int32 LostHP)\n\t{\n\t\tif (LostHP < 0)\n\t\t\treturn;\n\n\t\tLostHp += LostHP;\n\t\tif (!LostHpByDamageTypeTable.Contains(DamageType))\n\t\t\tLostHpByDamageTypeTable.Add(DamageType, 0);\n\n\t\tLostHpByDamageTypeTable[DamageType] += LostHP;\n\t}\n\n\tFORCEINLINE void AddDeathEntry(const FSoSplineDeathContext& DeathContext)\n\t{\n\t\tDeathData.Add(DeathContext);\n\t}\n\n\t// Useful to not spam the analytics server.\n\tFORCEINLINE bool HasStatsForAtLeast(float AccumulateThreshold = 1.0f) const\n\t{\n\t\treturn EnterNum > 0 && TimeSpentSeconds > AccumulateThreshold;\n\t}\n\n\tFORCEINLINE void UpdateAverageFPS(int32 NewAverageFPS)\n\t{\n\t\tif (NewAverageFPS < 0)\n\t\t\treturn;\n\n\t\tif (AverageFPS > 0)\n\t\t\tAverageFPS = FMath::RoundToInt((AverageFPS + NewAverageFPS) / 2.f);\n\t\telse\n\t\t\tAverageFPS = NewAverageFPS;\n\t}\n\n\tFORCEINLINE void UpdateCriticalFPSAreas(const FSoSplineCriticalFPSAreas& Areas)\n\t{\n\t\tCriticalFPSAreas.MergeWith(Areas);\n\t}\n\n\tFORCEINLINE void IncrementCriticalFPSAreasSentRecordsNum()\n\t{\n\t\tCriticalFPSAreas.IncrementSentRecordsNum();\n\t}\n\n\tFORCEINLINE void SetSplineLength(float InSplineLength)\n\t{\n\t\tSplineLength = FMath::TruncToInt(InSplineLength);\n\t\t// At least two entries for this\n\t\tCriticalFPSAreas.MaxCriticalFPSAreas = FMath::Max(2, SplineLength / FSoSplineCriticalFPSLocation::ThresholdDistanceSimilar);\n\t}\n\n\tFORCEINLINE bool HasSplineLength() const { return SplineLength > 0; }\n\tFORCEINLINE bool CanCriticalFPSAreasBeSent() const { return CriticalFPSAreas.CanBeSent(); }\n\n\tvoid UpdateSHA1(FSHA1& HashState) const;\n\npublic:\n\t// Time at which this spline was first entered at. In Absolute seconds (from all seconds) in the current session.\n\t// Int here because we do not require that much precision\n\tUPROPERTY(BlueprintReadOnly)\n\tint32 TimeFirstEnterSeconds = INDEX_NONE;\n\n\t// Was the time first enter for this spline already sent?\n\tUPROPERTY(BlueprintReadOnly)\n\tbool bSentTimeFirstEnter = false;\n\n\t// The number of times player entered this spline\n\tUPROPERTY(BlueprintReadOnly)\n\tint32 EnterNum = 0;\n\n\t// Amount of time the player spent on the spline\n\tUPROPERTY(BlueprintReadOnly)\n\tfloat TimeSpentSeconds = 0.f;\n\n\t// Average FPS on this spline.\n\tUPROPERTY(BlueprintReadOnly)\n\tint32 AverageFPS = 0;\n\n\t// Holds the info about the critical FPS areas\n\tUPROPERTY(BlueprintReadOnly)\n\tFSoSplineCriticalFPSAreas CriticalFPSAreas;\n\n\t// Data about deaths on this spline\n\tUPROPERTY(BlueprintReadOnly)\n\tTArray<FSoSplineDeathContext> DeathData;\n\n\t// Data about HP lost on this spline\n\tUPROPERTY(BlueprintReadOnly)\n\tint32 LostHp = 0;\n\n\t// Data about HP lost on this spline by damage type\n\t// Index/Key: ESoDamageType (casted to int)\n\t// Value: int32, total lost hp for the key damage type\n\tUPROPERTY(BlueprintReadOnly)\n\tTMap<ESoDmgType, int32> LostHpByDamageTypeTable;\n\n\t// Useful to know in which session the FirstEnterTimeSeconds was set.\n\t// TODO remove this and resend events not in current session but that have bSentTimeFirstEnter = false when UI is done.\n\tbool bSetFirstTimeEnterInCurrentSession = false;\n\nprotected:\n\t// The length of this spline.\n\tint32 SplineLength = 0;\n};\n"
  },
  {
    "path": "Source/SOrb/SaveFiles/Stats/SoPlayerProgressStats.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#include \"SoPlayerProgressStats.h\"\n\n#include \"Basic/Helpers/SoStringHelper.h\"\n#include \"Levels/SoLevelHelper.h\"\n#include \"DlgHelper.h\"\n\nDEFINE_LOG_CATEGORY_STATIC(LogSoPlayerProgressStats, All, All);\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSoPlayerProgressStats::CheckAndFixIntegrity()\n{\n\tstatic constexpr int32 NumDamageTypes = static_cast<int32>(ESoDmgType::Max);\n\tfor (int32 Index = 0; Index < NumDamageTypes; Index++)\n\t{\n\t\tconst ESoDmgType Type = static_cast<ESoDmgType>(Index);\n\t\tif (!TotalLostHpByDamageTypeTable.Contains(Type))\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (TotalLostHpByDamageTypeTable[Type] < 0)\n\t\t{\n\t\t\tUE_LOG(LogSoPlayerProgressStats, Warning, TEXT(\"Failed integrity, TotalLostHpByDamageTypeTable[%d] < 0. Resseting to 0\"), Index);\n\t\t\tTotalLostHpByDamageTypeTable[Type] = 0;\n\t\t}\n\t}\n\n\tif (TotalDeathNum < 0)\n\t{\n\t\tUE_LOG(LogSoPlayerProgressStats, Warning, TEXT(\"Failed integrity, TotalDeathNum < 0. Resseting to 0\"));\n\t\tTotalDeathNum = 0;\n\t}\n\tif (TotalDeathWithSoulKeeperNum < 0)\n\t{\n\t\tUE_LOG(LogSoPlayerProgressStats, Warning, TEXT(\"Failed integrity, TotalDeathWithSoulKeeperNum < 0. Resseting to 0\"));\n\t\tTotalDeathWithSoulKeeperNum = 0;\n\t}\n\tif (TotalDeathWithCheckpointNum < 0)\n\t{\n\t\tUE_LOG(LogSoPlayerProgressStats, Warning, TEXT(\"Failed integrity, TotalDeathWithCheckpointNum < 0. Resseting to 0\"));\n\t\tTotalDeathWithCheckpointNum = 0;\n\t}\n\tif (TotalLostHp < 0)\n\t{\n\t\tUE_LOG(LogSoPlayerProgressStats, Warning, TEXT(\"Failed integrity, TotalLostHp < 0. Resseting to 0\"));\n\t\tTotalLostHp = 0;\n\t}\n\tif (TotalPlayTimeSeconds < 0.f)\n\t{\n\t\tUE_LOG(LogSoPlayerProgressStats, Warning, TEXT(\"Failed integrity, PlayTimeSeconds < 0. Resseting to 0\"));\n\t\tTotalPlayTimeSeconds = 0.f;\n\t}\n\n\t{\n\t\tTArray<FName> KeysToRemove;\n\t\tfor (auto& Elem : MapsProgressTable)\n\t\t{\n\t\t\tconst FName MapName = Elem.Key;\n\t\t\tif (!USoLevelHelper::IsValidMapName(MapName))\n\t\t\t{\n\t\t\t\tUE_LOG(LogSoPlayerProgressStats, Warning, TEXT(\"Failed integrity, MapName = `%s` is not valid. Removing\"), *MapName.ToString());\n\t\t\t\tKeysToRemove.Add(MapName);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tElem.Value.CheckAndFixIntegrity();\n\t\t}\n\n\t\tfor (FName Key : KeysToRemove)\n\t\t\tMapsProgressTable.Remove(Key);\n\t}\n\t{\n\t\tfor (auto& Elem : ItemsStatsTable)\n\t\t\tElem.Value.CheckAndFixIntegrity();\n\t}\n\n\t{\n\t\tfor (auto& Elem : SpellsStatsTable)\n\t\t\tElem.Value.CheckAndFixIntegrity();\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool FSoPlayerProgressStats::operator==(const FSoPlayerProgressStats& Other) const\n{\n\treturn TotalDeathNum == Other.TotalDeathNum &&\n\t\tTotalDeathWithSoulKeeperNum == Other.TotalDeathWithSoulKeeperNum &&\n\t\tTotalDeathWithCheckpointNum == Other.TotalDeathWithCheckpointNum &&\n\t\tTotalLostHp == Other.TotalLostHp &&\n\t\tFDlgHelper::IsMapEqual(TotalLostHpByDamageTypeTable, Other.TotalLostHpByDamageTypeTable) &&\n\t\tFMath::IsNearlyEqual(TotalPlayTimeSeconds, Other.TotalPlayTimeSeconds, KINDA_SMALL_NUMBER) &&\n\t\tFDlgHelper::IsMapEqual(MapsProgressTable, Other.MapsProgressTable);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSoPlayerProgressStats::UpdateSHA1(FSHA1& HashState) const\n{\n\tUSoStringHelper::UpdateSHA1_UInt8(HashState, static_cast<uint8>(ProgressState));\n\tUSoStringHelper::UpdateSHA1_Int32(HashState, TotalDeathNum);\n\tUSoStringHelper::UpdateSHA1_Int32(HashState, TotalDeathWithSoulKeeperNum);\n\tUSoStringHelper::UpdateSHA1_Int32(HashState, TotalDeathWithCheckpointNum);\n\tUSoStringHelper::UpdateSHA1_Int32(HashState, TotalLostHp);\n\tUSoStringHelper::UpdateSHA1_Float(HashState, TotalPlayTimeSeconds);\n\tUSoStringHelper::UpdateSHA1_Int32(HashState, TotalAverageFPS);\n\tfor (const auto& KeyValue : TotalLostHpByDamageTypeTable)\n\t{\n\t\tUSoStringHelper::UpdateSHA1_UInt8(HashState, static_cast<uint8>(KeyValue.Key));\n\t\tUSoStringHelper::UpdateSHA1_Int32(HashState, KeyValue.Value);\n\t}\n\tfor (const auto& KeyValue : MapsProgressTable)\n\t{\n\t\tUSoStringHelper::UpdateSHA1_Name(HashState, KeyValue.Key);\n\t\tKeyValue.Value.UpdateSHA1(HashState);\n\t}\n\tfor (const auto& KeyValue : ItemsStatsTable)\n\t{\n\t\tUSoStringHelper::UpdateSHA1_Name(HashState, KeyValue.Key);\n\t\tKeyValue.Value.UpdateSHA1(HashState);\n\t}\n\tfor (const auto& KeyValue : SpellsStatsTable)\n\t{\n\t\tUSoStringHelper::UpdateSHA1_Name(HashState, KeyValue.Key);\n\t\tKeyValue.Value.UpdateSHA1(HashState);\n\t}\n}\n"
  },
  {
    "path": "Source/SOrb/SaveFiles/Stats/SoPlayerProgressStats.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#pragma once\n\n#include \"Misc/SecureHash.h\"\n\n#include \"SoPlayerProgressMapStats.h\"\n#include \"SoPlayerProgressItemStats.h\"\n\n#include \"SoPlayerProgressStats.generated.h\"\n\n\nUENUM(BlueprintType)\nenum class ESoMapProgressState : uint8\n{\n\tNone,\n\n\t// Could also be in the middle of the map\n\tStarted,\n\n\tCompleted\n};\n\n// Hold the stats for the player progress\nUSTRUCT(BlueprintType)\nstruct FSoPlayerProgressStats\n{\n\tGENERATED_USTRUCT_BODY()\npublic:\n\tFSoPlayerProgressStats()\n\t{\n\t\t// Initialize the damage type table\n\t\tCheckAndFixIntegrity();\n\t}\n\n\tvoid CheckAndFixIntegrity();\n\n\tbool operator==(const FSoPlayerProgressStats& Other) const;\n\n\tFORCEINLINE void UpdateTotalAverageFPS(int32 NewAverageFPS)\n\t{\n\t\tif (NewAverageFPS < 0)\n\t\t\treturn;\n\n\t\tif (TotalAverageFPS > 0)\n\t\t\tTotalAverageFPS = FMath::RoundToInt((TotalAverageFPS + NewAverageFPS) / 2.f);\n\t\telse\n\t\t\tTotalAverageFPS = NewAverageFPS;\n\t}\n\n\tFORCEINLINE void IncreaseTotalLostHP(ESoDmgType DamageType, int32 LostHP)\n\t{\n\t\tif (LostHP < 0)\n\t\t\treturn;\n\n\t\tTotalLostHp += LostHP;\n\t\tif (!TotalLostHpByDamageTypeTable.Contains(DamageType))\n\t\t\tTotalLostHpByDamageTypeTable.Add(DamageType, 0);\n\n\t\tTotalLostHpByDamageTypeTable[DamageType] += LostHP;\n\t}\n\n\t// Is this Empty? (aka default)\n\tFORCEINLINE bool IsEmpty() const\n\t{\n\t\treturn TotalDeathNum == 0 &&\n\t\t\tTotalDeathWithSoulKeeperNum == 0 &&\n\t\t\tTotalDeathWithCheckpointNum == 0 &&\n\t\t\tFMath::IsNearlyEqual(TotalLostHp, 0.f, KINDA_SMALL_NUMBER) &&\n\t\t\tFMath::IsNearlyEqual(TotalPlayTimeSeconds, 0.f, KINDA_SMALL_NUMBER);\n\t}\n\n\t// Contains the MapName:Milestone\n\tFORCEINLINE bool HasMapMilestone(FName MapName, FName MilestoneName) const\n\t{\n\t\treturn MapsProgressTable.Contains(MapName) ? MapsProgressTable.FindChecked(MapName).HasMilestone(MilestoneName) : false;\n\t}\n\n\tFORCEINLINE void AddMapMilestone(FName MapName, FName MilestoneName, float TimeSeconds = INDEX_NONE)\n\t{\n\t\tif (MapName != NAME_None && MilestoneName != NAME_None)\n\t\t\tMapsProgressTable.FindOrAdd(MapName).AddMilestone(MilestoneName, TimeSeconds);\n\t}\n\n\t// Contains the MapName:SplineName\n\tFORCEINLINE bool HasMapSpline(FName MapName, FName SplineName) const\n\t{\n\t\treturn MapsProgressTable.Contains(MapName) ? MapsProgressTable.FindChecked(MapName).HasSpline(SplineName)  : false;\n\t}\n\n\tFORCEINLINE bool HasMapSplineTimeFirstEnter(FName MapName, FName SplineName) const\n\t{\n\t\treturn MapsProgressTable.Contains(MapName) ? MapsProgressTable.FindChecked(MapName).HasSplineTimeFirstEnter(SplineName) : false;\n\t}\n\n\tFORCEINLINE bool CanMapSplineCriticalFPSAreasBeSent(FName MapName, FName SplineName) const\n\t{\n\t\treturn MapsProgressTable.Contains(MapName) ? MapsProgressTable.FindChecked(MapName).CanSplineCriticalFPSAreasBeSent(SplineName) : false;\n\t}\n\n\tFORCEINLINE void IncrementMapSplineEnterNum(FName MapName, FName SplineName)\n\t{\n\t\tif (MapName != NAME_None && SplineName != NAME_None)\n\t\t\tMapsProgressTable.FindOrAdd(MapName).IncrementSplineEnterNum(SplineName);\n\t}\n\n\tFORCEINLINE void IncrementMapSplineCriticalFPSAreasSentRecordsNum(FName MapName, FName SplineName)\n\t{\n\t\tif (MapName != NAME_None && SplineName != NAME_None)\n\t\t\tMapsProgressTable.FindOrAdd(MapName).IncrementSplineCriticalFPSAreasSentRecordsNum(SplineName);\n\t}\n\n\tFORCEINLINE void IncreaseMapSplineLostHP(FName MapName, FName SplineName, ESoDmgType DamageType, int32 LostHP)\n\t{\n\t\tif (MapName != NAME_None && SplineName != NAME_None)\n\t\t\tMapsProgressTable.FindOrAdd(MapName).IncreaseSplineLostHP(SplineName, DamageType, LostHP);\n\t}\n\n\tFORCEINLINE void IncreaseMapSplineTimeSpent(FName MapName, FName SplineName, float DeltaSeconds)\n\t{\n\t\tif (MapName != NAME_None && SplineName != NAME_None)\n\t\t\tMapsProgressTable.FindOrAdd(MapName).IncreaseSplineTimeSpent(SplineName, DeltaSeconds);\n\t}\n\n\tFORCEINLINE void AddMapSplineDeathEntry(FName MapName, FName SplineName, const FSoSplineDeathContext& DeathContext)\n\t{\n\t\tif (MapName != NAME_None && SplineName != NAME_None)\n\t\t\tMapsProgressTable.FindOrAdd(MapName).AddSplineDeathEntry(SplineName, DeathContext);\n\t}\n\n\t// Updates the MapName:SplineName:FirstEnterTimeSeconds with FirstEnterTimeSeconds.\n\t// NOTE: Only updates the first enter time enter only if the first time is not valid/not set\n\tFORCEINLINE void UpdateMapSplineTimeFirstEnter(FName MapName, FName SplineName, float FirstEnterTimeSeconds)\n\t{\n\t\tif (MapName != NAME_None && SplineName != NAME_None)\n\t\t\tMapsProgressTable.FindOrAdd(MapName).UpdateSplineTimeFirstEnter(SplineName, FirstEnterTimeSeconds);\n\t}\n\n\tFORCEINLINE void UpdateMapSplineAverageFPS(FName MapName, FName SplineName, int32 NewAverageFPS)\n\t{\n\t\tif (MapName != NAME_None && SplineName != NAME_None)\n\t\t\tMapsProgressTable.FindOrAdd(MapName).UpdateSplineAverageFPS(SplineName, NewAverageFPS);\n\t}\n\n\tFORCEINLINE void UpdateMapSplineCriticalFPSAreas(FName MapName, FName SplineName, const FSoSplineCriticalFPSAreas& Areas)\n\t{\n\t\tif (MapName != NAME_None && SplineName != NAME_None)\n\t\t\tMapsProgressTable.FindOrAdd(MapName).UpdateSplineCriticalFPSAreas(SplineName, Areas);\n\t}\n\n\tFORCEINLINE void SetMapSplineLength(FName MapName, FName SplineName, float Length)\n\t{\n\t\tif (MapName != NAME_None && SplineName != NAME_None)\n\t\t\tMapsProgressTable.FindOrAdd(MapName).SetSplineLength(SplineName, Length);\n\t}\n\n\tFORCEINLINE void ResetGameplayTotalVariables()\n\t{\n\t\tTotalDeathNum = 0;\n\t\tTotalDeathWithSoulKeeperNum = 0;\n\t\tTotalDeathWithCheckpointNum = 0;\n\t\tTotalLostHp = 0;\n\t\tTotalPlayTimeSeconds = 0.f;\n\n\t\tTotalLostHpByDamageTypeTable.Empty();\n\t}\n\n\tFORCEINLINE void EquipItem(FName ItemName, float TimeSeconds)\n\t{\n\t\tif (ItemName != NAME_None)\n\t\t\tItemsStatsTable.FindOrAdd(ItemName).EquipItem(TimeSeconds);\n\t}\n\n\tFORCEINLINE void UnEquipItem(FName ItemName, float TimeSeconds)\n\t{\n\t\tif (ItemName != NAME_None)\n\t\t\tItemsStatsTable.FindOrAdd(ItemName).UnEquipItem(TimeSeconds);\n\t}\n\n\tFORCEINLINE void SpellCasted(FName SpellName)\n\t{\n\t\tif (SpellName != NAME_None)\n\t\t\tSpellsStatsTable.FindOrAdd(SpellName).SpellCasted();\n\t}\n\n\tvoid UpdateSHA1(FSHA1& HashState) const;\n\npublic:\n\t// Did we complete the map or what?\n\tUPROPERTY()\n\tESoMapProgressState ProgressState = ESoMapProgressState::None;\n\n\tUPROPERTY(BlueprintReadOnly)\n\tint32 TotalDeathNum = 0;\n\n\t// Deaths with soul keeper used\n\t// Mutual exclusive with TotalCheckpointDeathNum\n\tUPROPERTY(BlueprintReadOnly)\n\tint32 TotalDeathWithSoulKeeperNum = 0;\n\n\t// Deaths with checkpoint used\n\t// Mutual exclusive with TotalSoulKeeperDeathNum\n\tUPROPERTY(BlueprintReadOnly)\n\tint32 TotalDeathWithCheckpointNum = 0;\n\n\t// Total lost HP\n\tUPROPERTY(BlueprintReadOnly)\n\tint32 TotalLostHp = 0;\n\n\t// Total play time in seconds since game started.\n\t// Float here because we require more precision.\n\tUPROPERTY(BlueprintReadOnly)\n\tfloat TotalPlayTimeSeconds = 0.f;\n\n\t// UPROPERTY(BlueprintReadOnly)\n\t// float TotalPlayTimeSinceRestart = 0.f;\n\n\t// Average FPS over all all game\n\tUPROPERTY(BlueprintReadOnly)\n\tint32 TotalAverageFPS = 0;\n\n\t// Maps from damage type (ESoDamageType) to total lost HP by that damage.\n\t// Index/Key: ESoDamageType (casted to int)\n\t// Value: int32, total lost hp for the key damage type\n\tUPROPERTY(BlueprintReadOnly)\n\tTMap<ESoDmgType, int32> TotalLostHpByDamageTypeTable;\n\t// TArray<int32> TotalLostHpByDamageTypeTable;\n\n\n\t// Holds stats data about each map\n\t// Key: Map Name\n\t// Value: Stats about this map\n\tUPROPERTY(BlueprintReadOnly)\n\tTMap<FName, FSoPlayerProgressMapStats> MapsProgressTable;\n\n\t// Holds stats about each item used by the player.\n\t// Key: Item Name\n\t// Value: Stats about this item\n\tUPROPERTY(BlueprintReadOnly)\n\tTMap<FName, FSoPlayerProgressItemStats> ItemsStatsTable;\n\n\t// Holds stats about each spell used by the user\n\t// Key: Spell Name\n\t// Value: Stats about this spell\n\tUPROPERTY(BlueprintReadOnly)\n\tTMap<FName, FSoPlayerProgressSpellStats> SpellsStatsTable;\n};\n"
  },
  {
    "path": "Source/SOrb/Settings/Input/SoInputHelper.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#include \"SoInputHelper.h\"\n\n#include \"Character/SoCharacter.h\"\n#include \"Character/SoPlayerController.h\"\n#include \"Basic/Helpers/SoStaticHelper.h\"\n#include \"Basic/Helpers/SoStringHelper.h\"\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoInputHelper::SetGameInputBlockedByUI(UObject* WorldContextObject, bool bValue)\n{\n\tASoCharacter* Character = USoStaticHelper::GetPlayerCharacterAsSoCharacter(WorldContextObject);\n\tif (!Character)\n\t\treturn;\n\n\tCharacter->SetGameInputBlockedByUI(bValue);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoInputHelper::IsLastInputFromGamepad(const UObject* WorldContextObject)\n{\n\tconst ASoPlayerController* Controller = ASoPlayerController::GetInstance(WorldContextObject);\n\tif (!Controller)\n\t\treturn false;\n\n\treturn Controller->IsLastInputFromGamepad();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nESoInputDeviceType USoInputHelper::GetCurrentDeviceType(UObject* WorldContextObject)\n{\n#if PLATFORM_SWITCH\n\treturn ESoInputDeviceType::Gamepad_Switch;\n#else\n\tif (ASoPlayerController* Controller = ASoPlayerController::GetInstance(WorldContextObject))\n\t\treturn Controller->GetCurrentDeviceType();\n\n#if PLATFORM_XBOXONE\n\treturn ESoInputDeviceType::Gamepad_Xbox;\n#else\n\treturn ESoInputDeviceType::Keyboard;\n#endif\n\n#endif\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nESoInputDeviceType USoInputHelper::GetCurrentGamepadDeviceTypeFromSettings(UObject* WorldContextObject)\n{\n\tif (ASoPlayerController* Controller = ASoPlayerController::GetInstance(WorldContextObject))\n\t\treturn Controller->GetGamepadDeviceTypeFromSettings();\n\n\treturn ESoInputDeviceType::Gamepad_Generic;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\nFString USoInputHelper::DeviceTypeToFriendlyString(const ESoInputDeviceType DeviceType)\n{\n\tFString EnumValue;\n\tif (USoStringHelper::ConvertEnumToString<ESoInputDeviceType>(TEXT(\"ESoInputDeviceType\"), DeviceType, false, EnumValue))\n\t\treturn EnumValue.Mid(4);\n\n\treturn EnumValue;\n}\n"
  },
  {
    "path": "Source/SOrb/Settings/Input/SoInputHelper.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#pragma once\n\n#include \"CoreMinimal.h\"\n#include \"Kismet/BlueprintFunctionLibrary.h\"\n#include \"GameFramework/PlayerInput.h\"\n\n#include \"SoInputNames.h\"\n#include \"SoInputSettingsTypes.h\"\n#include \"Basic/Helpers/SoPlatformHelper.h\"\n\n#include \"SoInputHelper.generated.h\"\n\n/** Helper methods for the input */\nUCLASS()\nclass SORB_API USoInputHelper : public UBlueprintFunctionLibrary\n{\n\tGENERATED_BODY()\npublic:\n\tUFUNCTION(BlueprintCallable, Category = \"Input\", meta = (WorldContext = \"WorldContextObject\"))\n\tstatic void SetGameInputBlockedByUI(UObject* WorldContextObject, bool bValue);\n\n\tUFUNCTION(BlueprintPure, Category = \"Input\", meta = (WorldContext = \"WorldContextObject\"))\n\tstatic bool IsLastInputFromGamepad(const UObject* WorldContextObject);\n\n\tUFUNCTION(BlueprintPure, Category = \"Input\", meta = (WorldContext = \"WorldContextObject\"))\n\tstatic bool IsLastInputFromKeyboard(const UObject* WorldContextObject) { return !IsLastInputFromGamepad(WorldContextObject); }\n\n\t// Gets the current player input device\n\tUFUNCTION(BlueprintPure, Category = \"Input\", meta = (WorldContext = \"WorldContextObject\"))\n\tstatic ESoInputDeviceType GetCurrentDeviceType(UObject* WorldContextObject);\n\n\tUFUNCTION(BlueprintPure, Category = \"Input\", meta = (WorldContext = \"WorldContextObject\"))\n\tstatic ESoInputDeviceType GetCurrentGamepadDeviceTypeFromSettings(UObject* WorldContextObject);\n\n\t// Gets the Axis names that are linked to an action name. This usually means the axis must also be modified alongside the action name\n\tstatic FORCEINLINE const TSet<FName>& GetAxisNamesLinkedToActionName(const FName ActionName)\n\t{\n\t\treturn FSoInputActionNameAxisNameLink::GetAxisNamesLinkedToActionName(ActionName);\n\t}\n\n\t// Gets the action names that are linked to an axis name.\n\tstatic FORCEINLINE const TSet<FName>& GetActionNamesLinkedToAxisName(const FName AxisName)\n\t{\n\t\treturn FSoInputActionNameAxisNameLink::GetActionNamesLinkedToAxisName(AxisName);\n\t}\n\n\t// Gets the first FInputActionKeyMapping from the array, if any\n\tUFUNCTION(BlueprintPure, Category = \"Input\", meta = (WorldContext = \"WorldContextObject\"))\n\tstatic FORCEINLINE bool GetFirstInputActionKeyMapping(const TArray<FInputActionKeyMapping>& ActionMappings, FInputActionKeyMapping& OutFirst)\n\t{\n\t\tOutFirst = {};\n\t\tif (ActionMappings.Num() > 0)\n\t\t{\n\t\t\tOutFirst = ActionMappings[0];\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\n\t// Is the Key an allowed input keyboard key?\n\tstatic FORCEINLINE bool IsAllowedInputKeyboardKey(const FInputChord& InputChord)\n\t{\n\t\t// All keyboard keys are valid but without any modifier keys\n\t\t// OR it can be a modified key only\n\t\treturn (IsKeyboardKey(InputChord.Key) && !InputChord.HasAnyModifierKeys()) || IsASingleModifierKey(InputChord);\n\t}\n\n\t// Checks InputChord has only one modifier key set\n\tstatic FORCEINLINE bool IsASingleModifierKey(const FInputChord& InputChord)\n\t{\n\t\tconst uint8 SumValue = static_cast<uint8>(InputChord.bAlt)\n\t\t\t+ static_cast<uint8>(InputChord.bCtrl)\n\t\t\t+ static_cast<uint8>(InputChord.bCmd)\n\t\t\t+ static_cast<uint8>(InputChord.bShift);\n\n\t\t// SumValue == 1 means that only one modifier key is set, similar to HasAnyModifierKeys()\n\t\treturn !InputChord.Key.IsValid() && SumValue == 1;\n\t}\n\n\t// Is the key an allowed gamepad key\n\tstatic FORCEINLINE bool IsAllowedInputGamepadKey(const FInputChord& InputChord)\n\t{\n\t\treturn IsGamepadKey(InputChord.Key) && !InputChord.Key.IsFloatAxis() && !InputChord.Key.IsVectorAxis();\n\t}\n\n\t// Is the key from the keyboard? NOTE: This does not accept invalid keys\n\tstatic FORCEINLINE bool IsKeyboardKey(const FKey& Key)\n\t{\n\t\treturn Key.IsValid() && !Key.IsGamepadKey() && !Key.IsMouseButton() && !Key.IsVectorAxis() && !Key.IsFloatAxis();\n\t}\n\n\t// Is the key from the gamepad? NOTE: This does not accept invalid keys\n\t// NOTE: that this can also return true on keys that are also axis\n\tstatic FORCEINLINE bool IsGamepadKey(const FKey& Key)\n\t{\n\t\treturn Key.IsValid() && Key.IsGamepadKey();\n\t}\n\n\tstatic FORCEINLINE FString ActionMappingToString(const FInputActionKeyMapping& ActionMapping)\n\t{\n\t\treturn FString::Printf(TEXT(\"FInputActionKeyMapping(ActionName=%s, Key=%s, bShift=%d, bCtrl=%d, bAlt=%d, bCmd=%d)\"),\n\t\t\t*ActionMapping.ActionName.ToString(), *ActionMapping.Key.ToString(), ActionMapping.bShift, ActionMapping.bCtrl, ActionMapping.bAlt, ActionMapping.bCmd);\n\t}\n\n\tstatic FORCEINLINE FString AxisMappingToString(const FInputAxisKeyMapping& AxisMapping)\n\t{\n\t\treturn FString::Printf(TEXT(\"FInputAxisKeyMapping(AxisName=%s, Key=%s, Scale=%f)\"),\n\t\t\t*AxisMapping.AxisName.ToString(), *AxisMapping.Key.ToString(), AxisMapping.Scale);\n\t}\n\n\tstatic FORCEINLINE FString ChordToString(const FInputChord& InputChord)\n\t{\n\t\treturn FString::Printf(TEXT(\"FInputChord(%s)\"), *InputChord.GetInputText().ToString());\n\t}\n\n\tstatic FORCEINLINE bool AreAxisMappingsEqual(const FInputAxisKeyMapping& A, const FInputAxisKeyMapping& B, const bool bIgnoreScale = false)\n\t{\n\t\treturn A.AxisName == B.AxisName && A.Key == B.Key &&\n\t\t\t(bIgnoreScale || FMath::IsNearlyEqual(A.Scale, B.Scale, KINDA_SMALL_NUMBER));\n\t}\n\n\t// Checks if the ActionMapping matches the AxisMapping\n\tstatic bool DoesActionMappingMatchAxisMapping(const FInputActionKeyMapping& ActionMapping, const FInputAxisKeyMapping& AxisMapping)\n\t{\n\t\t// The key matches we are on the good start\n\t\tif (ActionMapping.Key == AxisMapping.Key)\n\t\t{\n\t\t\t// Does the AxisName also match?\n\t\t\tconst TSet<FName>& ActionNamesAxis = GetAxisNamesLinkedToActionName(ActionMapping.ActionName);\n\t\t\treturn ActionNamesAxis.Contains(AxisMapping.AxisName);\n\t\t}\n\n\t\treturn false;\n\t}\n\n\t// Checks if the ActionMapping matches the InputChord\n\tstatic FORCEINLINE bool DoesActionMappingMatchInputChord(const FInputActionKeyMapping& ActionMapping, const FInputChord& InputChord)\n\t{\n\t\treturn ActionMapping.Key == InputChord.Key && ActionMapping.bShift == InputChord.bShift && ActionMapping.bCtrl == InputChord.bCtrl\n\t\t\t&& ActionMapping.bAlt == InputChord.bAlt && ActionMapping.bCmd == InputChord.bCmd;\n\t}\n\n\t// Converts FInputActionKeyMapping to an FInputChord\n\tstatic FInputChord ActionMappingToInputChord(const FInputActionKeyMapping& ActionMapping)\n\t{\n\t\tFInputChord InputChord;\n\t\tInputChord.Key = ActionMapping.Key;\n\t\tInputChord.bAlt = ActionMapping.bAlt;\n\t\tInputChord.bCmd = ActionMapping.bCmd;\n\t\tInputChord.bCtrl = ActionMapping.bCtrl;\n\t\tInputChord.bShift = ActionMapping.bShift;\n\t\treturn InputChord;\n\t}\n\n\t// Converts FInputChord to an FInputActionKeyMapping\n\t// NOTE: the returned ActionMapping does not have the ActionName, for obvious reasons.\n\tstatic FInputActionKeyMapping InputChordToActionMapping(const FInputChord& InputChord)\n\t{\n\t\tFInputActionKeyMapping ActionMapping;\n\t\tActionMapping.Key = InputChord.Key;\n\t\tActionMapping.bAlt = InputChord.bAlt;\n\t\tActionMapping.bCmd = InputChord.bCmd;\n\t\tActionMapping.bCtrl = InputChord.bCtrl;\n\t\tActionMapping.bShift = InputChord.bShift;\n\t\treturn ActionMapping;\n\t}\n\n\t// Variant to be used with blueprints\n\t// Convert from ActionNameType to ActionName\n\tUFUNCTION(BlueprintPure)\n\tstatic FORCEINLINE FName ConvertActionNameTypeToFName(const ESoInputActionNameType Type)\n\t{\n\t\treturn FSoInputActionName::ActionNameTypeToActionName(Type);\n\t}\n\n\tstatic FORCEINLINE bool IsInputDeviceTypeGamepad(const ESoInputDeviceType DeviceType)\n\t{\n\t\treturn DeviceType != ESoInputDeviceType::Keyboard;\n\t}\n\n\tstatic FORCEINLINE ESoGamepadLayoutType ConvertInputDeviceTypeToInputGamepadUIType(const ESoInputDeviceType DeviceType)\n\t{\n\t\tswitch (DeviceType)\n\t\t{\n\t\tcase ESoInputDeviceType::Gamepad_PlayStation:\n\t\t\treturn ESoGamepadLayoutType::PlayStation;\n\t\tcase ESoInputDeviceType::Gamepad_Switch:\n\t\t\treturn ESoGamepadLayoutType::Switch;\n\t\tdefault:\n\t\t\treturn ESoGamepadLayoutType::Xbox;\n\t\t}\n\t}\n\n\tstatic FORCEINLINE ESoInputDeviceType ConvertInputGamepadUITypeToInputDeviceType(const ESoGamepadLayoutType UIType)\n\t{\n\t\tswitch (UIType)\n\t\t{\n\t\tcase ESoGamepadLayoutType::PlayStation:\n\t\t\treturn ESoInputDeviceType::Gamepad_PlayStation;\n\n\t\tcase ESoGamepadLayoutType::Switch:\n\t\t\treturn ESoInputDeviceType::Gamepad_Switch;\n\n\t\tcase ESoGamepadLayoutType::Xbox:\n\t\tdefault:\n\t\t\treturn ESoInputDeviceType::Gamepad_Xbox;\n\t\t}\n\t\t// TODO add nintendo switch\n\t}\n\n\tstatic FString DeviceTypeToFriendlyString(const ESoInputDeviceType DeviceType);\n};\n"
  },
  {
    "path": "Source/SOrb/Settings/Input/SoInputNames.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#include \"SoInputNames.h\"\n\n#include \"InputCoreTypes.h\"\n#include \"Basic/Helpers/SoStaticHelper.h\"\n#include \"Localization/SoLocalization.h\"\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// FSoInputKey\nbool FSoInputKey::bIsInitialized = false;\nTArray<FKey> FSoInputKey::AllKeyboardKeys;\nTArray<FKey> FSoInputKey::AllGamepadKeys;\nTSet<FName> FSoInputKey::GamepadButtonNames;\nTSet<FName> FSoInputKey::GamepadFaceButtonNames;\nTMap<FName, FName> FSoInputKey::GamepadStickDirectionToStickMap;\nTMap<FKey, FText> FSoInputKey::KeyToFTextMap;\n\n\n#define SO_CREATE_GAMEPAD_KEY_CONST_STATIC_INIT(VariableName) \\\n\tFName FSoInputKey::_##VariableName;\n\n#define SO_ASSSIGN_GAMEPAD_KEY_CONST(VariableName) \\\n\tFSoInputKey::_##VariableName = EKeys::VariableName.GetFName()\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nSO_CREATE_GAMEPAD_KEY_CONST_STATIC_INIT(Gamepad_LeftThumbstick);\nSO_CREATE_GAMEPAD_KEY_CONST_STATIC_INIT(Gamepad_RightThumbstick);\nSO_CREATE_GAMEPAD_KEY_CONST_STATIC_INIT(Gamepad_Special_Left);\nSO_CREATE_GAMEPAD_KEY_CONST_STATIC_INIT(Gamepad_Special_Right);\n\nSO_CREATE_GAMEPAD_KEY_CONST_STATIC_INIT(Gamepad_FaceButton_Bottom);\nSO_CREATE_GAMEPAD_KEY_CONST_STATIC_INIT(Gamepad_FaceButton_Right);\nSO_CREATE_GAMEPAD_KEY_CONST_STATIC_INIT(Gamepad_FaceButton_Left);\nSO_CREATE_GAMEPAD_KEY_CONST_STATIC_INIT(Gamepad_FaceButton_Top);\n\nSO_CREATE_GAMEPAD_KEY_CONST_STATIC_INIT(Gamepad_LeftShoulder);\nSO_CREATE_GAMEPAD_KEY_CONST_STATIC_INIT(Gamepad_RightShoulder);\nSO_CREATE_GAMEPAD_KEY_CONST_STATIC_INIT(Gamepad_LeftTrigger);\nSO_CREATE_GAMEPAD_KEY_CONST_STATIC_INIT(Gamepad_RightTrigger);\n\nSO_CREATE_GAMEPAD_KEY_CONST_STATIC_INIT(Gamepad_DPad_Up);\nSO_CREATE_GAMEPAD_KEY_CONST_STATIC_INIT(Gamepad_DPad_Down);\nSO_CREATE_GAMEPAD_KEY_CONST_STATIC_INIT(Gamepad_DPad_Right);\nSO_CREATE_GAMEPAD_KEY_CONST_STATIC_INIT(Gamepad_DPad_Left);\n\nSO_CREATE_GAMEPAD_KEY_CONST_STATIC_INIT(Gamepad_LeftStick_Up);\nSO_CREATE_GAMEPAD_KEY_CONST_STATIC_INIT(Gamepad_LeftStick_Down);\nSO_CREATE_GAMEPAD_KEY_CONST_STATIC_INIT(Gamepad_LeftStick_Right);\nSO_CREATE_GAMEPAD_KEY_CONST_STATIC_INIT(Gamepad_LeftStick_Left);\n\nSO_CREATE_GAMEPAD_KEY_CONST_STATIC_INIT(Gamepad_RightStick_Up);\nSO_CREATE_GAMEPAD_KEY_CONST_STATIC_INIT(Gamepad_RightStick_Down);\nSO_CREATE_GAMEPAD_KEY_CONST_STATIC_INIT(Gamepad_RightStick_Right);\nSO_CREATE_GAMEPAD_KEY_CONST_STATIC_INIT(Gamepad_RightStick_Left);\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSoInputKey::Init()\n{\n\tif (bIsInitialized)\n\t\treturn;\n\tbIsInitialized = true;\n\n\t// GamepadKeys\n\tSO_ASSSIGN_GAMEPAD_KEY_CONST(Gamepad_LeftThumbstick);\n\tSO_ASSSIGN_GAMEPAD_KEY_CONST(Gamepad_RightThumbstick);\n\tSO_ASSSIGN_GAMEPAD_KEY_CONST(Gamepad_Special_Left);\n\tSO_ASSSIGN_GAMEPAD_KEY_CONST(Gamepad_Special_Right);\n\n\tSO_ASSSIGN_GAMEPAD_KEY_CONST(Gamepad_FaceButton_Bottom);\n\tSO_ASSSIGN_GAMEPAD_KEY_CONST(Gamepad_FaceButton_Right);\n\tSO_ASSSIGN_GAMEPAD_KEY_CONST(Gamepad_FaceButton_Left);\n\tSO_ASSSIGN_GAMEPAD_KEY_CONST(Gamepad_FaceButton_Top);\n\n\tSO_ASSSIGN_GAMEPAD_KEY_CONST(Gamepad_LeftShoulder);\n\tSO_ASSSIGN_GAMEPAD_KEY_CONST(Gamepad_RightShoulder);\n\tSO_ASSSIGN_GAMEPAD_KEY_CONST(Gamepad_LeftTrigger);\n\tSO_ASSSIGN_GAMEPAD_KEY_CONST(Gamepad_RightTrigger);\n\n\tSO_ASSSIGN_GAMEPAD_KEY_CONST(Gamepad_DPad_Up);\n\tSO_ASSSIGN_GAMEPAD_KEY_CONST(Gamepad_DPad_Down);\n\tSO_ASSSIGN_GAMEPAD_KEY_CONST(Gamepad_DPad_Right);\n\tSO_ASSSIGN_GAMEPAD_KEY_CONST(Gamepad_DPad_Left);\n\n\tSO_ASSSIGN_GAMEPAD_KEY_CONST(Gamepad_LeftStick_Up);\n\tSO_ASSSIGN_GAMEPAD_KEY_CONST(Gamepad_LeftStick_Down);\n\tSO_ASSSIGN_GAMEPAD_KEY_CONST(Gamepad_LeftStick_Right);\n\tSO_ASSSIGN_GAMEPAD_KEY_CONST(Gamepad_LeftStick_Left);\n\n\tSO_ASSSIGN_GAMEPAD_KEY_CONST(Gamepad_RightStick_Up);\n\tSO_ASSSIGN_GAMEPAD_KEY_CONST(Gamepad_RightStick_Down);\n\tSO_ASSSIGN_GAMEPAD_KEY_CONST(Gamepad_RightStick_Right);\n\tSO_ASSSIGN_GAMEPAD_KEY_CONST(Gamepad_RightStick_Left);\n\n\tAllKeyboardKeys.Empty();\n\tAllKeyboardKeys = {\n\t\tEKeys::Backslash,\n\t\tEKeys::Tab,\n\t\tEKeys::Enter,\n\n\t\tEKeys::CapsLock,\n\t\tEKeys::Escape,\n\t\tEKeys::SpaceBar,\n\t\tEKeys::PageUp,\n\t\tEKeys::PageDown,\n\t\tEKeys::End,\n\t\tEKeys::Home,\n\n\t\tEKeys::Left,\n\t\tEKeys::Up,\n\t\tEKeys::Right,\n\t\tEKeys::Down,\n\n\t\tEKeys::Insert,\n\t\tEKeys::Delete,\n\n\t\tEKeys::Zero,\n\t\tEKeys::One,\n\t\tEKeys::Two,\n\t\tEKeys::Three,\n\t\tEKeys::Four,\n\t\tEKeys::Five,\n\t\tEKeys::Six,\n\t\tEKeys::Seven,\n\t\tEKeys::Eight,\n\t\tEKeys::Nine,\n\n\t\tEKeys::A,\n\t\tEKeys::B,\n\t\tEKeys::C,\n\t\tEKeys::D,\n\t\tEKeys::E,\n\t\tEKeys::F,\n\t\tEKeys::G,\n\t\tEKeys::H,\n\t\tEKeys::I,\n\t\tEKeys::J,\n\t\tEKeys::K,\n\t\tEKeys::L,\n\t\tEKeys::M,\n\t\tEKeys::N,\n\t\tEKeys::O,\n\t\tEKeys::P,\n\t\tEKeys::Q,\n\t\tEKeys::R,\n\t\tEKeys::S,\n\t\tEKeys::T,\n\t\tEKeys::U,\n\t\tEKeys::V,\n\t\tEKeys::W,\n\t\tEKeys::X,\n\t\tEKeys::Y,\n\t\tEKeys::Z,\n\n\t\tEKeys::NumPadZero,\n\t\tEKeys::NumPadOne,\n\t\tEKeys::NumPadTwo,\n\t\tEKeys::NumPadThree,\n\t\tEKeys::NumPadFour,\n\t\tEKeys::NumPadFive,\n\t\tEKeys::NumPadSix,\n\t\tEKeys::NumPadSeven,\n\t\tEKeys::NumPadEight,\n\t\tEKeys::NumPadNine,\n\n\t\tEKeys::Multiply,\n\t\tEKeys::Add,\n\t\tEKeys::Subtract,\n\n\t\tEKeys::F1,\n\t\tEKeys::F2,\n\t\tEKeys::F3,\n\t\tEKeys::F4,\n\t\tEKeys::F5,\n\t\tEKeys::F6,\n\t\tEKeys::F7,\n\t\tEKeys::F8,\n\t\tEKeys::F9,\n\t\tEKeys::F10,\n\t\tEKeys::F11,\n\t\tEKeys::F12,\n\n\t\tEKeys::NumLock,\n\t\tEKeys::LeftShift,\n\t\tEKeys::RightShift,\n\t\tEKeys::LeftControl,\n\t\tEKeys::RightControl,\n\t\tEKeys::LeftAlt,\n\t\tEKeys::RightAlt,\n\t\tEKeys::LeftCommand,\n\t\tEKeys::RightCommand,\n\n\t\tEKeys::Tilde,\n\t\tEKeys::LeftBracket,\n\t\tEKeys::RightBracket,\n\n\t\tEKeys::Semicolon,\n\t\tEKeys::Quote,\n\n\t\t// Obscure\n\t\tEKeys::Equals,\n\t\tEKeys::Comma,\n\t\tEKeys::Underscore,\n\t\tEKeys::Hyphen,\n\t\tEKeys::Period,\n\t\tEKeys::Slash,\n\t\tEKeys::Apostrophe,\n\t\tEKeys::Ampersand,\n\t\tEKeys::Asterix,\n\t\tEKeys::Caret,\n\t\tEKeys::Colon,\n\t\tEKeys::Dollar,\n\t\tEKeys::Exclamation,\n\t\tEKeys::LeftParantheses,\n\t\tEKeys::RightParantheses,\n\t\tEKeys::Pause,\n\t\tEKeys::Decimal,\n\t\tEKeys::Divide,\n\t\tEKeys::ScrollLock,\n\t};\n\n\tAllGamepadKeys.Empty();\n\tAllGamepadKeys = {\n\t\tEKeys::Gamepad_LeftThumbstick,\n\t\tEKeys::Gamepad_RightThumbstick,\n\t\tEKeys::Gamepad_Special_Left,\n\t\tEKeys::Gamepad_Special_Right,\n\n\t\tEKeys::Gamepad_FaceButton_Bottom,\n\t\tEKeys::Gamepad_FaceButton_Right,\n\t\tEKeys::Gamepad_FaceButton_Left,\n\t\tEKeys::Gamepad_FaceButton_Top,\n\n\t\tEKeys::Gamepad_LeftShoulder,\n\t\tEKeys::Gamepad_RightShoulder,\n\t\tEKeys::Gamepad_LeftTrigger,\n\t\tEKeys::Gamepad_RightTrigger,\n\n\t\tEKeys::Gamepad_DPad_Up,\n\t\tEKeys::Gamepad_DPad_Down,\n\t\tEKeys::Gamepad_DPad_Right,\n\t\tEKeys::Gamepad_DPad_Left,\n\n\t\tEKeys::Gamepad_LeftStick_Up,\n\t\tEKeys::Gamepad_LeftStick_Down,\n\t\tEKeys::Gamepad_LeftStick_Right,\n\t\tEKeys::Gamepad_LeftStick_Left,\n\n\t\tEKeys::Gamepad_RightStick_Up,\n\t\tEKeys::Gamepad_RightStick_Down,\n\t\tEKeys::Gamepad_RightStick_Right,\n\t\tEKeys::Gamepad_RightStick_Left,\n\n\t\t// Axis bellow\n\n\t\t// Gamepad Left Thumbstick X-Axis\n\t\tEKeys::Gamepad_LeftX,\n\n\t\t// Gamepad Left Thumbstick Y-Axis\n\t\tEKeys::Gamepad_LeftY,\n\n\t\t// Gamepad Right Thumbstick X-Axis\n\t\tEKeys::Gamepad_RightX,\n\n\t\t// Gamepad Right Thumbstick Y-Axis\n\t\tEKeys::Gamepad_RightY,\n\n\t\t// L2 axis\n\t\tEKeys::Gamepad_LeftTriggerAxis,\n\n\t\t// R2 axis\n\t\tEKeys::Gamepad_RightTriggerAxis,\n\n\t\t// PS4 touchpad buttons\n\t\tEKeys::Gamepad_Special_Left_X,\n\t\tEKeys::Gamepad_Special_Left_Y,\n\t};\n\n\t// No duplicates\n\tconst TSet<FKey> KeyboardKeysUnique(AllKeyboardKeys);\n\tconst TSet<FKey> GamepadKeysUnique(AllGamepadKeys);\n\tverify(KeyboardKeysUnique.Num() == AllKeyboardKeys.Num());\n\tverify(GamepadKeysUnique.Num() == AllGamepadKeys.Num());\n\n\tGamepadButtonNames = {\n\t\tGamepad_LeftThumbstick(),\n\t\tGamepad_RightThumbstick(),\n\t\tGamepad_Special_Left(),\n\t\tGamepad_Special_Right(),\n\n\t\tGamepad_FaceButton_Bottom(),\n\t\tGamepad_FaceButton_Right(),\n\t\tGamepad_FaceButton_Left(),\n\t\tGamepad_FaceButton_Top(),\n\n\t\tGamepad_LeftShoulder(),\n\t\tGamepad_RightShoulder(),\n\t\tGamepad_LeftTrigger(),\n\t\tGamepad_RightTrigger(),\n\n\t\tGamepad_DPad_Up(),\n\t\tGamepad_DPad_Down(),\n\t\tGamepad_DPad_Right(),\n\t\tGamepad_DPad_Left(),\n\n\t\tGamepad_DPad_Up(),\n\t\tGamepad_DPad_Down(),\n\t\tGamepad_DPad_Right(),\n\t\tGamepad_DPad_Left(),\n\n\t\tGamepad_LeftStick_Up(),\n\t\tGamepad_LeftStick_Down(),\n\t\tGamepad_LeftStick_Right(),\n\t\tGamepad_LeftStick_Left(),\n\n\t\tGamepad_RightStick_Up(),\n\t\tGamepad_RightStick_Down(),\n\t\tGamepad_RightStick_Right(),\n\t\tGamepad_RightStick_Left(),\n\t};\n\tverify(GamepadButtonNames.Num() > 20);\n\n\tGamepadFaceButtonNames = {\n\t\tGamepad_FaceButton_Bottom(),\n\t\tGamepad_FaceButton_Right(),\n\t\tGamepad_FaceButton_Left(),\n\t\tGamepad_FaceButton_Top(),\n\t};\n\tverify(GamepadFaceButtonNames.Num() == 4);\n\n\tGamepadStickDirectionToStickMap.Empty();\n\tGamepadStickDirectionToStickMap.Add(Gamepad_LeftThumbstick(), Gamepad_LeftThumbstick());\n\tGamepadStickDirectionToStickMap.Add(Gamepad_LeftStick_Up(), Gamepad_LeftThumbstick());\n\tGamepadStickDirectionToStickMap.Add(Gamepad_LeftStick_Down(), Gamepad_LeftThumbstick());\n\tGamepadStickDirectionToStickMap.Add(Gamepad_LeftStick_Right(), Gamepad_LeftThumbstick());\n\tGamepadStickDirectionToStickMap.Add(Gamepad_LeftStick_Left(), Gamepad_LeftThumbstick());\n\tGamepadStickDirectionToStickMap.Add(Gamepad_RightThumbstick(), Gamepad_RightThumbstick());\n\tGamepadStickDirectionToStickMap.Add(Gamepad_RightStick_Up(), Gamepad_RightThumbstick());\n\tGamepadStickDirectionToStickMap.Add(Gamepad_RightStick_Down(), Gamepad_RightThumbstick());\n\tGamepadStickDirectionToStickMap.Add(Gamepad_RightStick_Right(), Gamepad_RightThumbstick());\n\tGamepadStickDirectionToStickMap.Add(Gamepad_RightStick_Left(), Gamepad_RightThumbstick());\n\n\t// Only a subset of the keys in InputCoreTypes.h\n#define LOCTEXT_NAMESPACE \"InputKeys\"\n\tKeyToFTextMap.Empty();\n\n\tKeyToFTextMap.Add(EKeys::AnyKey, LOCTEXT(\"AnyKey\", \"Any Key\"));\n\n\t// KeyToFTextMap.Add(EKeys::LeftMouseButton, LOCTEXT(\"LeftMouseButton\", \"Left Mouse Button\"));\n\t// KeyToFTextMap.Add(EKeys::RightMouseButton, LOCTEXT(\"RightMouseButton\", \"Right Mouse Button\"));\n\t// KeyToFTextMap.Add(EKeys::MiddleMouseButton, LOCTEXT(\"MiddleMouseButton\", \"Middle Mouse Button\"));\n\t// KeyToFTextMap.Add(EKeys::ThumbMouseButton, LOCTEXT(\"ThumbMouseButton\", \"Thumb Mouse Button\"));\n\t// KeyToFTextMap.Add(EKeys::ThumbMouseButton2, LOCTEXT(\"ThumbMouseButton2\", \"Thumb Mouse Button 2\"));\n\n\t// KeyToFTextMap.Add(EKeys::Escape, LOCTEXT(\"Escape\", \"Escape\"));\n\t// KeyToFTextMap.Add(EKeys::Tab, LOCTEXT(\"Tab\", \"Tab\"));\n\t// KeyToFTextMap.Add(EKeys::Enter, LOCTEXT(\"Enter\", \"Enter\"));\n\t// KeyToFTextMap.Add(EKeys::CapsLock, LOCTEXT(\"CapsLock\", \"Caps Lock\"));\n\t// KeyToFTextMap.Add(EKeys::SpaceBar, LOCTEXT(\"SpaceBarShort\", \"Space\"));\n\t// KeyToFTextMap.Add(EKeys::BackSpace, LOCTEXT(\"BackSpace\", \"Backspace\"));\n\n\n\t// KeyToFTextMap.Add(EKeys::PageUp, LOCTEXT(\"PageUp\", \"Page Up\"));\n\t// KeyToFTextMap.Add(EKeys::PageDown, LOCTEXT(\"PageDown\", \"Page Down\"));\n\t// KeyToFTextMap.Add(EKeys::End, LOCTEXT(\"End\", \"End\"));\n\t// KeyToFTextMap.Add(EKeys::Home, LOCTEXT(\"Home\", \"Home\"));\n\t// KeyToFTextMap.Add(EKeys::Insert, LOCTEXT(\"Insert\", \"Insert\"));\n\t// KeyToFTextMap.Add(EKeys::Pause, LOCTEXT(\"Pause\", \"Pause\"));\n\t// KeyToFTextMap.Add(EKeys::Delete, LOCTEXT(\"Delete\", \"Delete\"));\n\t// KeyToFTextMap.Add(EKeys::NumLock, LOCTEXT(\"NumLock\", \"Num Lock\"));\n\t// KeyToFTextMap.Add(EKeys::ScrollLock, LOCTEXT(\"ScrollLock\", \"Scroll Lock\"));\n\n\tKeyToFTextMap.Add(EKeys::Left, LOCTEXT(\"Left\", \"Left\"));\n\tKeyToFTextMap.Add(EKeys::Up, LOCTEXT(\"Up\", \"Up\"));\n\tKeyToFTextMap.Add(EKeys::Right, LOCTEXT(\"Right\", \"Right\"));\n\tKeyToFTextMap.Add(EKeys::Down, LOCTEXT(\"Down\", \"Down\"));\n\n#if PLATFORM_XBOXONE\n\tKeyToFTextMap.Add(EKeys::Gamepad_Special_Right, FROM_STRING_TABLE_UI(\"gamepad_special_right_xbox\"));\n\tKeyToFTextMap.Add(EKeys::Gamepad_Special_Left, FROM_STRING_TABLE_UI(\"gamepad_special_left_xbox\"));\n#endif\n\n#if PLATFORM_SWITCH\n\tKeyToFTextMap.Add(EKeys::Gamepad_FaceButton_Top, FROM_STRING_TABLE_UI(\"Switch_FaceButton_Top\"));\n\tKeyToFTextMap.Add(EKeys::Gamepad_FaceButton_Bottom, FROM_STRING_TABLE_UI(\"Switch_FaceButton_Bottom\"));\n\tKeyToFTextMap.Add(EKeys::Gamepad_FaceButton_Left, FROM_STRING_TABLE_UI(\"Switch_FaceButton_Left\"));\n\tKeyToFTextMap.Add(EKeys::Gamepad_FaceButton_Right, FROM_STRING_TABLE_UI(\"Switch_FaceButton_Right\"));\n\n\tKeyToFTextMap.Add(EKeys::Gamepad_LeftTrigger, FROM_STRING_TABLE_UI(\"Switch_Trigger_Left\"));\n\tKeyToFTextMap.Add(EKeys::Gamepad_LeftShoulder, FROM_STRING_TABLE_UI(\"Switch_Shoulder_Left\"));\n\tKeyToFTextMap.Add(EKeys::Gamepad_RightTrigger, FROM_STRING_TABLE_UI(\"Switch_Trigger_Right\"));\n\tKeyToFTextMap.Add(EKeys::Gamepad_RightShoulder, FROM_STRING_TABLE_UI(\"Switch_Shoulder_Right\"));\n\n\tKeyToFTextMap.Add(EKeys::Gamepad_Special_Right, FROM_STRING_TABLE_UI(\"Switch_special_right\"));\n\tKeyToFTextMap.Add(EKeys::Gamepad_Special_Left, FROM_STRING_TABLE_UI(\"Switch_special_left\"));\n\n\tKeyToFTextMap.Add(EKeys::Gamepad_DPad_Up, FROM_STRING_TABLE_UI(\"Switch_special_dpad_up\"));\n\tKeyToFTextMap.Add(EKeys::Gamepad_DPad_Down, FROM_STRING_TABLE_UI(\"Switch_special_dpad_down\"));\n\tKeyToFTextMap.Add(EKeys::Gamepad_DPad_Left, FROM_STRING_TABLE_UI(\"Switch_special_dpad_left\"));\n\tKeyToFTextMap.Add(EKeys::Gamepad_DPad_Right, FROM_STRING_TABLE_UI(\"Switch_special_dpad_right\"));\n\tKeyToFTextMap.Add(EKeys::Gamepad_LeftThumbstick, FROM_STRING_TABLE_UI(\"Switch_LeftThumbstick\"));\n\tKeyToFTextMap.Add(EKeys::Gamepad_RightThumbstick, FROM_STRING_TABLE_UI(\"Switch_RightThumbstick\"));\n#endif\n\n\tKeyToFTextMap.Add(EKeys::Gamepad_LeftStick_Up, FROM_STRING_TABLE_UI(\"Switch_Gamepad_LeftStick_Up\"));\n\tKeyToFTextMap.Add(EKeys::Gamepad_LeftStick_Down, FROM_STRING_TABLE_UI(\"Switch_Gamepad_LeftStick_Down\"));\n\tKeyToFTextMap.Add(EKeys::Gamepad_LeftStick_Right, FROM_STRING_TABLE_UI(\"Switch_Gamepad_LeftStick_Right\"));\n\tKeyToFTextMap.Add(EKeys::Gamepad_LeftStick_Left, FROM_STRING_TABLE_UI(\"Switch_Gamepad_LeftStick_Left\"));\n\tKeyToFTextMap.Add(EKeys::Gamepad_RightStick_Up, FROM_STRING_TABLE_UI(\"Switch_Gamepad_RightStick_Up\"));\n\tKeyToFTextMap.Add(EKeys::Gamepad_RightStick_Down, FROM_STRING_TABLE_UI(\"Switch_Gamepad_RightStick_Down\"));\n\tKeyToFTextMap.Add(EKeys::Gamepad_RightStick_Right, FROM_STRING_TABLE_UI(\"Switch_Gamepad_RightStick_Right\"));\n\tKeyToFTextMap.Add(EKeys::Gamepad_RightStick_Left, FROM_STRING_TABLE_UI(\"Switch_Gamepad_RightStick_Left\"));\n\n\t// KeyToFTextMap.Add(EKeys::LeftShift, LOCTEXT(\"LeftShift\", \"Left Shift\"));\n\t// KeyToFTextMap.Add(EKeys::RightShift, LOCTEXT(\"RightShift\", \"Right Shift\"));\n\t// KeyToFTextMap.Add(EKeys::LeftControl, LOCTEXT(\"LeftControl\", \"Left Ctrl\"));\n\t// KeyToFTextMap.Add(EKeys::RightControl, LOCTEXT(\"RightControl\", \"Right Ctrl\"));\n\t// KeyToFTextMap.Add(EKeys::LeftAlt, LOCTEXT(\"LeftAlt\", \"Left Alt\"));\n\t// KeyToFTextMap.Add(EKeys::RightAlt, LOCTEXT(\"RightAlt\", \"Right Alt\"));\n#undef LOCTEXT_NAMESPACE\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFText FSoInputKey::GetInputChordDisplayName(const FInputChord& InputChord)\n{\n\t// Modified from FInputChord::GetInputText\n#if PLATFORM_MAC\n\tconst FText CommandText = Text::FromString(TEXT(\"Ctrl\"));\n\tconst FText ControlText = Text::FromString(TEXT(\"Cmd\"));\n#else\n\tconst FText ControlText = FText::FromString(TEXT(\"Ctrl\"));\n\tconst FText CommandText = FText::FromString(TEXT(\"Cmd\"));\n#endif\n\tconst FText AltText = FText::FromString(TEXT(\"Alt\"));\n\tconst FText ShiftText = FText::FromString(TEXT(\"Shift\"));\n\n\n\tconst FText AppenderText = InputChord.Key != EKeys::Invalid ? FText::FromString(TEXT(\"+\")) : FText::GetEmpty();\n\n\tFFormatNamedArguments Args;\n\tint32 ModCount = 0;\n\n\tif (InputChord.bCtrl)\n\t{\n\t\tArgs.Add(FString::Printf(TEXT(\"Mod%d\"), ++ModCount), ControlText);\n\t}\n\tif (InputChord.bCmd)\n\t{\n\t\tArgs.Add(FString::Printf(TEXT(\"Mod%d\"), ++ModCount), CommandText);\n\t}\n\tif (InputChord.bAlt)\n\t{\n\t\tArgs.Add(FString::Printf(TEXT(\"Mod%d\"), ++ModCount), AltText);\n\t}\n\tif (InputChord.bShift)\n\t{\n\t\tArgs.Add(FString::Printf(TEXT(\"Mod%d\"), ++ModCount), ShiftText);\n\t}\n\n\tfor (int32 i = 1; i <= 4; ++i)\n\t{\n\t\tif (i > ModCount)\n\t\t{\n\t\t\tArgs.Add(FString::Printf(TEXT(\"Mod%d\"), i), FText::GetEmpty());\n\t\t\tArgs.Add(FString::Printf(TEXT(\"Appender%d\"), i), FText::GetEmpty());\n\t\t}\n\t\telse\n\t\t{\n\t\t\tArgs.Add(FString::Printf(TEXT(\"Appender%d\"), i), AppenderText);\n\t\t}\n\n\t}\n\n\tFText KeyText;\n\tif (InputChord.Key.IsValid() && !InputChord.Key.IsModifierKey())\n\t{\n\t\tKeyText = GetKeyDisplayName(InputChord.Key);\n\t}\n\tArgs.Add(TEXT(\"Key\"), KeyText);\n\n\treturn FText::Format(FText::FromString(TEXT(\"{Mod1}{Appender1}{Mod2}{Appender2}{Mod3}{Appender3}{Mod4}{Appender4}{Key}\")), Args);\n}\n\n\n#undef SO_CREATE_GAMEPAD_KEY_CONST_STATIC_INIT\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// FSoInputAxisName\nbool FSoInputAxisName::bIsInitialized = false;\nTSet<FName> FSoInputAxisName::AllAxisNames;\n\nconst FName FSoInputAxisName::GamepadLeftX(TEXT(\"GamepadLeftX\"));\nconst FName FSoInputAxisName::GamepadLeftY(TEXT(\"GamepadLeftY\"));\nconst FName FSoInputAxisName::GamepadRightX(TEXT(\"GamepadRightX\"));\nconst FName FSoInputAxisName::GamepadRightY(TEXT(\"GamepadRightY\"));\nconst FName FSoInputAxisName::Move(TEXT(\"Move\"));\nconst FName FSoInputAxisName::MoveY(TEXT(\"MoveY\"));\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSoInputAxisName::Init()\n{\n\tif (bIsInitialized)\n\t\treturn;\n\tbIsInitialized = true;\n\n\tAllAxisNames.Empty();\n\tAllAxisNames = {\n\t\tGamepadLeftX,\n\t\tGamepadLeftY,\n\t\tGamepadRightX,\n\t\tGamepadRightY,\n\t\tMove,\n\t\tMoveY\n\t};\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// FSoInputActionName\nbool FSoInputActionName::bIsInitialized = false;\nTSet<FName> FSoInputActionName::GameActionNames;\nTSet<FName> FSoInputActionName::EditorActionNames;\nTSet<FName> FSoInputActionName::UIActionNames;\nTSet<FName> FSoInputActionName::IgnoreDuplicatesActionNames;\nTMap<FName, FText> FSoInputActionName::ActionNameToFTextMap;\nTMap<ESoInputActionNameType, FName> FSoInputActionName::ActionNameTypeToActionNameMap;\nTMap<FName, ESoInputActionNameType> FSoInputActionName::ActionNameToActionNameTypeMap;\nTMap<FName, ESoUICommand> FSoInputActionName::ActionNameToUICommandMap;\nTMap<ESoUICommand, FName> FSoInputActionName::UICommandToActionNameMap;\nTMap<ESoUICommand, TSet<ESoUICommand>> FSoInputActionName::UICommandConflictMap;\nTMap<FName, FName> FSoInputActionName::ActionNamesSyncIfModifiedMap;\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// Game shortcuts\nconst FName FSoInputActionName::MoveLeft(TEXT(\"Left\"));\nconst FName FSoInputActionName::MoveRight(TEXT(\"Right\"));\nconst FName FSoInputActionName::Strike0(TEXT(\"Strike0\"));\nconst FName FSoInputActionName::Strike1(TEXT(\"Strike1\"));\nconst FName FSoInputActionName::Roll(TEXT(\"Roll\"));\nconst FName FSoInputActionName::Umbrella(TEXT(\"Umbrella\"));\nconst FName FSoInputActionName::TakeWeaponAway(TEXT(\"TakeWeaponAway\"));\nconst FName FSoInputActionName::Jump(TEXT(\"Jump\"));\nconst FName FSoInputActionName::Interact0(TEXT(\"Interact0\"));\nconst FName FSoInputActionName::Interact1(TEXT(\"Interact1\"));\nconst FName FSoInputActionName::UseItemFromSlot0(TEXT(\"UseItemFromSlot0\"));\nconst FName FSoInputActionName::ToggleWeapon(TEXT(\"ToggleWeapon\"));\nconst FName FSoInputActionName::ToggleItem(TEXT(\"ToggleItem\"));\nconst FName FSoInputActionName::ToggleSpell(TEXT(\"ToggleSpell\"));\nconst FName FSoInputActionName::LockFaceDirection(TEXT(\"LockFaceDirection\"));\nconst FName FSoInputActionName::CharacterPanels(TEXT(\"CharacterPanels\"));\nconst FName FSoInputActionName::QuickSaveLoad0(TEXT(\"QuickSaveLoad0\"));\nconst FName FSoInputActionName::QuickSaveLoad1(TEXT(\"QuickSaveLoad1\"));\nconst FName FSoInputActionName::StartVideoLoopPlayback(TEXT(\"StartVideoLoopPlayback\"));\nconst FName FSoInputActionName::StartVideoLoopPlaybackController(TEXT(\"StartVideoLoopPlaybackController\"));\nconst FName FSoInputActionName::StopVideoLoopPlayback(TEXT(\"StopVideoLoopPlayback\"));\nconst FName FSoInputActionName::RestartDemo(TEXT(\"RestartDemo\"));\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// Editor shortcuts\nconst FName FSoInputActionName::EditorCameraEditMode(TEXT(\"CameraEditMode\"));\nconst FName FSoInputActionName::EditorSkyEditMode(TEXT(\"SkyEditMode\"));\nconst FName FSoInputActionName::EditorCharShadowEditMode(TEXT(\"CharShadowEditMode\"));\nconst FName FSoInputActionName::EditorCreateKey(TEXT(\"CreateKey\"));\nconst FName FSoInputActionName::EditorReloadKeys(TEXT(\"ReloadKeys\"));\nconst FName FSoInputActionName::EditorSaveKeys(TEXT(\"SaveKeys\"));\nconst FName FSoInputActionName::EditorDeleteKey(TEXT(\"DeleteKey\"));\nconst FName FSoInputActionName::EditorCopyFromKey(TEXT(\"CopyFromKey\"));\nconst FName FSoInputActionName::EditorPasteToKey(TEXT(\"PasteToKey\"));\nconst FName FSoInputActionName::EditorMoveClosestKeyNodeHere(TEXT(\"MoveClosestKeyNodeHere\"));\nconst FName FSoInputActionName::EditorJumpToNextKey(TEXT(\"JumpToNextKey\"));\nconst FName FSoInputActionName::EditorJumpToPrevKey(TEXT(\"JumpToPrevKey\"));\nconst FName FSoInputActionName::EditorSpecialEditButtonPressed0(TEXT(\"SpecialEditButtonPressed0\"));\nconst FName FSoInputActionName::EditorSpecialEditButtonPressed1(TEXT(\"SpecialEditButtonPressed1\"));\nconst FName FSoInputActionName::EditorCtrl(TEXT(\"Ctrl\"));\nconst FName FSoInputActionName::EditorMiddleMouseButton(TEXT(\"MMB\"));\nconst FName FSoInputActionName::EditorSuperEditMode(TEXT(\"SuperEditMode\"));\nconst FName FSoInputActionName::EditorDebugFeature(TEXT(\"DebugFeature\"));\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSoInputActionName::Init()\n{\n\tif (bIsInitialized)\n\t\treturn;\n\tbIsInitialized = true;\n\n\t// GameActionNames Set\n\tGameActionNames.Empty();\n\tGameActionNames = {\n\t\tMoveLeft,\n\t\tMoveRight,\n\t\tStrike0,\n\t\tStrike1,\n\t\tRoll,\n\t\tUmbrella,\n\t\tTakeWeaponAway,\n\t\tJump,\n\t\tInteract0,\n\t\tInteract1,\n\t\tUseItemFromSlot0,\n\t\tToggleWeapon,\n\t\tToggleItem,\n\t\tToggleSpell,\n\t\tLockFaceDirection,\n\t\tCharacterPanels,\n\t\tQuickSaveLoad0,\n\t\tQuickSaveLoad1,\n\n\t\t// Does this break the video demo?\n\t\t// NOTE: if you enable this the game controller settings will show an invalid texture if the button shares the same key\n\t\tStartVideoLoopPlayback,\n\t\tStartVideoLoopPlaybackController,\n\t\tStopVideoLoopPlayback\n\t};\n\n\t// EditorActionNames Set\n\tEditorActionNames.Empty();\n\tEditorActionNames = {\n\t\tEditorCameraEditMode,\n\t\tEditorSkyEditMode,\n\t\tEditorCharShadowEditMode,\n\t\tEditorCreateKey,\n\t\tEditorReloadKeys,\n\t\tEditorSaveKeys,\n\t\tEditorDeleteKey,\n\t\tEditorCopyFromKey,\n\t\tEditorPasteToKey,\n\t\tEditorMoveClosestKeyNodeHere,\n\t\tEditorJumpToNextKey,\n\t\tEditorJumpToPrevKey,\n\t\tEditorSpecialEditButtonPressed0,\n\t\tEditorSpecialEditButtonPressed1,\n\t\tEditorCtrl,\n\t\tEditorMiddleMouseButton,\n\t\tEditorSuperEditMode,\n\t\tEditorDebugFeature\n\t};\n\n\t// Fill UI\n\t{\n\t\tActionNameToUICommandMap.Empty();\n\t\tconst int32 CommandNum = static_cast<int32>(ESoUICommand::EUC_ReleasedMax);\n\t\tfor (int32 Index = 0; Index < CommandNum; Index++)\n\t\t{\n\t\t\tconst ESoUICommand Command = static_cast<ESoUICommand>(Index);\n\t\t\tconst FName CommandName = GetNameFromUICommand(Command, false);\n\t\t\tif (CommandName != NAME_None)\n\t\t\t\tActionNameToUICommandMap.Add(CommandName, Command);\n\t\t}\n\t\tverify(ActionNameToUICommandMap.Num() == CommandNum - 1);\n\n\t\t// Add to inverse and fill UI commands\n\t\tUICommandToActionNameMap.Empty();\n\t\tUIActionNames.Empty();\n\t\tfor (const auto& Elem : ActionNameToUICommandMap)\n\t\t{\n\t\t\tverify(Elem.Key != NAME_None);\n\t\t\tverify(IsValidUICommand(Elem.Value));\n\n\t\t\tUIActionNames.Add(Elem.Key);\n\t\t\tUICommandToActionNameMap.Add(Elem.Value, Elem.Key);\n\t\t}\n\n\t\tverify(UICommandToActionNameMap.Num() == ActionNameToUICommandMap.Num());\n\t\tverify(UIActionNames.Num() == UICommandToActionNameMap.Num());\n\n\t\t// Conflict map\n\t\tUICommandConflictMap.Empty();\n\t\tTMap<ESoUICommand, TSet<ESoUICommand>> ConflictMap;\n\t\tConflictMap.Add(ESoUICommand::EUC_Left, { ESoUICommand::EUC_MainMenuLeft });\n\t\tConflictMap.Add(ESoUICommand::EUC_Right, { ESoUICommand::EUC_MainMenuRight });\n\t\tConflictMap.Add(ESoUICommand::EUC_Up, { ESoUICommand::EUC_MainMenuUp });\n\t\tConflictMap.Add(ESoUICommand::EUC_Down, { ESoUICommand::EUC_MainMenuDown });\n\t\t//ConflictMap.Add(ESoUICommand::EUC_ActionBack, { ESoUICommand::EUC_MainMenuBack });\n\n\t\t// Complete our map\n\t\tfor (const auto& Elem : ConflictMap)\n\t\t{\n\t\t\tconst ESoUICommand Command = Elem.Key;\n\t\t\tUICommandConflictMap.FindOrAdd(Command).Append(Elem.Value);\n\n\t\t\t// add value as keys aka the inverse\n\t\t\tfor (const ESoUICommand SetElem : Elem.Value)\n\t\t\t{\n\t\t\t\tUICommandConflictMap.FindOrAdd(SetElem).Add(Command);\n\t\t\t}\n\t\t}\n\n\t\tverify(UICommandConflictMap.Num() > ConflictMap.Num());\n\t}\n\n\n\t// Fill action names to sync if modified\n\tActionNamesSyncIfModifiedMap.Add(UICommandToActionName(ESoUICommand::EUC_Left), UICommandToActionName(ESoUICommand::EUC_MainMenuLeft));\n\tActionNamesSyncIfModifiedMap.Add(UICommandToActionName(ESoUICommand::EUC_Right), UICommandToActionName(ESoUICommand::EUC_MainMenuRight));\n\tActionNamesSyncIfModifiedMap.Add(UICommandToActionName(ESoUICommand::EUC_Up), UICommandToActionName(ESoUICommand::EUC_MainMenuUp));\n\tActionNamesSyncIfModifiedMap.Add(UICommandToActionName(ESoUICommand::EUC_Down), UICommandToActionName(ESoUICommand::EUC_MainMenuDown));\n\n\t// Ignore duplicates\n\tIgnoreDuplicatesActionNames.Empty();\n\tIgnoreDuplicatesActionNames = {\n\t\t// UICommandToActionName(ESoUICommand::EUC_Up),\n\t\t// UICommandToActionName(ESoUICommand::EUC_Down),\n\t\t// TODO do we need to add left/right?\n\n\t\tStartVideoLoopPlayback,\n\t\tStartVideoLoopPlaybackController,\n\t\tStopVideoLoopPlayback,\n\n\t\t// NOTE: this is kinda a hack because we are ignoring some duplicates UI commands\n\t\t//UICommandToActionName(ESoUICommand::EUC_MainMenuLeft),\n\t\t//UICommandToActionName(ESoUICommand::EUC_MainMenuRight),\n\t\t//UICommandToActionName(ESoUICommand::EUC_MainMenuUp),\n\t\t//UICommandToActionName(ESoUICommand::EUC_MainMenuDown),\n\t\t//UICommandToActionName(ESoUICommand::EUC_MainMenuEnter),\n\t\t//UICommandToActionName(ESoUICommand::EUC_MainMenuBack),\n\n\t\t//// TODO configure spells\n\t\t//UICommandToActionName(ESoUICommand::EUC_SpellLeft),\n\t\t//UICommandToActionName(ESoUICommand::EUC_SpellRight),\n\t\t//UICommandToActionName(ESoUICommand::EUC_SpellUp),\n\t\t//UICommandToActionName(ESoUICommand::EUC_SpellDown),\n\t\t//UICommandToActionName(ESoUICommand::EUC_SpellSelect),\n\t\t//UICommandToActionName(ESoUICommand::EUC_SpellSelectAndCast)\n\t};\n\n\t// Verify that categories do not intersect with any editor action names\n\tverify(GameActionNames.Intersect(EditorActionNames).Num() == 0);\n\tverify(UIActionNames.Intersect(EditorActionNames).Num() == 0);\n\n\t// ESoInputActionNameType maps\n\t{\n\t\tActionNameTypeToActionNameMap.Empty();\n\t\tActionNameTypeToActionNameMap.Add(ESoInputActionNameType::IANT_None, NAME_None);\n\t\tActionNameTypeToActionNameMap.Add(ESoInputActionNameType::IANT_MoveLeft, MoveLeft);\n\t\tActionNameTypeToActionNameMap.Add(ESoInputActionNameType::IANT_MoveRight, MoveRight);\n\t\tActionNameTypeToActionNameMap.Add(ESoInputActionNameType::IANT_MoveUp, UICommandToActionName(ESoUICommand::EUC_Up));\n\t\tActionNameTypeToActionNameMap.Add(ESoInputActionNameType::IANT_MoveDown, UICommandToActionName(ESoUICommand::EUC_Down));\n\n\t\tActionNameTypeToActionNameMap.Add(ESoInputActionNameType::IANT_Strike0, Strike0);\n\t\tActionNameTypeToActionNameMap.Add(ESoInputActionNameType::IANT_Strike1, Strike1);\n\n\t\tActionNameTypeToActionNameMap.Add(ESoInputActionNameType::IANT_Roll, Roll);\n\t\tActionNameTypeToActionNameMap.Add(ESoInputActionNameType::IANT_Umbrella, Umbrella);\n\t\tActionNameTypeToActionNameMap.Add(ESoInputActionNameType::IANT_Jump, Jump);\n\n\t\tActionNameTypeToActionNameMap.Add(ESoInputActionNameType::IANT_ToggleItem, ToggleItem);\n\t\tActionNameTypeToActionNameMap.Add(ESoInputActionNameType::IANT_ToggleSpell, ToggleSpell);\n\t\tActionNameTypeToActionNameMap.Add(ESoInputActionNameType::IANT_ToggleWeapon, ToggleWeapon);\n\t\tActionNameTypeToActionNameMap.Add(ESoInputActionNameType::IANT_TakeWeaponAway, TakeWeaponAway);\n\t\tActionNameTypeToActionNameMap.Add(ESoInputActionNameType::IANT_CharacterPanels, CharacterPanels);\n\n\t\tActionNameTypeToActionNameMap.Add(ESoInputActionNameType::IANT_UseItemFromSlot0, UseItemFromSlot0);\n\t\tActionNameTypeToActionNameMap.Add(ESoInputActionNameType::IANT_Interact0, Interact0);\n\t\tActionNameTypeToActionNameMap.Add(ESoInputActionNameType::IANT_Interact1, Interact1);\n\n\t\t// Add to inverse\n\t\tActionNameToActionNameTypeMap.Empty();\n\t\tfor (const auto& Elem : ActionNameTypeToActionNameMap)\n\t\t{\n\t\t\tconst ESoInputActionNameType NameType = Elem.Key;\n\t\t\tconst FName Name = Elem.Value;\n\n\t\t\t// sanity check\n\t\t\tif (NameType != ESoInputActionNameType::IANT_None)\n\t\t\t\tverify(IsValid(Name));\n\n\t\t\t// It is Inverse\n\t\t\tActionNameToActionNameTypeMap.Add(Name, NameType);\n\t\t}\n\n\t\tverify(ActionNameTypeToActionNameMap.Num() == static_cast<int32>(ESoInputActionNameType::IANT_Num));\n\t\tverify(ActionNameTypeToActionNameMap.Num() == ActionNameToActionNameTypeMap.Num());\n\t}\n\n\t// ActionNameToFTextMap Map\n\tActionNameToFTextMap.Empty();\n\tActionNameToFTextMap.Add(MoveLeft, FROM_STRING_TABLE_UI(\"input_left\"));\n\tActionNameToFTextMap.Add(MoveRight, FROM_STRING_TABLE_UI(\"input_right\"));\n\tActionNameToFTextMap.Add(Strike0, FROM_STRING_TABLE_UI(\"input_strike_primary\"));\n\tActionNameToFTextMap.Add(Strike1, FROM_STRING_TABLE_UI(\"input_strike_special\"));\n\tActionNameToFTextMap.Add(Roll, FROM_STRING_TABLE_UI(\"input_roll\"));\n\tActionNameToFTextMap.Add(Umbrella, FROM_STRING_TABLE_UI(\"input_float\"));\n\tActionNameToFTextMap.Add(TakeWeaponAway, FROM_STRING_TABLE_UI(\"input_take_weapon\"));\n\tActionNameToFTextMap.Add(Jump, FROM_STRING_TABLE_UI(\"input_jump\"));\n\tActionNameToFTextMap.Add(Interact0, FROM_STRING_TABLE_UI(\"input_interact\"));\n\tActionNameToFTextMap.Add(Interact1, FROM_STRING_TABLE_UI(\"input_alt_interact\"));\n\tActionNameToFTextMap.Add(UseItemFromSlot0, FROM_STRING_TABLE_UI(\"input_use_item\"));\n\tActionNameToFTextMap.Add(ToggleItem, FROM_STRING_TABLE_UI(\"input_change_item\"));\n\tActionNameToFTextMap.Add(ToggleSpell, FROM_STRING_TABLE_UI(\"input_change_spell\"));\n\tActionNameToFTextMap.Add(ToggleWeapon, FROM_STRING_TABLE_UI(\"input_change_weapon\"));\n\tActionNameToFTextMap.Add(CharacterPanels, FROM_STRING_TABLE_UI(\"input_open_inventory\"));\n\n\t// UI\n\tActionNameToFTextMap.Add(UICommandToActionName(ESoUICommand::EUC_MainMenuBack), FROM_STRING_TABLE_UI(\"input_menu_back\"));\n\tActionNameToFTextMap.Add(UICommandToActionName(ESoUICommand::EUC_Up), FROM_STRING_TABLE_UI(\"input_up\"));\n\tActionNameToFTextMap.Add(UICommandToActionName(ESoUICommand::EUC_Down), FROM_STRING_TABLE_UI(\"input_down\"));\n\tActionNameToFTextMap.Add(UICommandToActionName(ESoUICommand::EUC_Action0), FROM_STRING_TABLE_UI(\"input_action_first\"));\n\tActionNameToFTextMap.Add(UICommandToActionName(ESoUICommand::EUC_Action1), FROM_STRING_TABLE_UI(\"input_action_second\"));\n\tActionNameToFTextMap.Add(UICommandToActionName(ESoUICommand::EUC_Action2), FROM_STRING_TABLE_UI(\"input_action_third\"));\n\tActionNameToFTextMap.Add(UICommandToActionName(ESoUICommand::EUC_TopLeft), FROM_STRING_TABLE_UI(\"input_top_left\"));\n\tActionNameToFTextMap.Add(UICommandToActionName(ESoUICommand::EUC_TopRight), FROM_STRING_TABLE_UI(\"input_top_right\"));\n\tActionNameToFTextMap.Add(UICommandToActionName(ESoUICommand::EUC_ActionBack), FROM_STRING_TABLE_UI(\"input_action_back\"));\n\n\tActionNameToFTextMap.Add(UICommandToActionName(ESoUICommand::EUC_SpellLeft), FROM_STRING_TABLE_UI(\"input_spell_left\"));\n\tActionNameToFTextMap.Add(UICommandToActionName(ESoUICommand::EUC_SpellRight), FROM_STRING_TABLE_UI(\"input_spell_right\"));\n\tActionNameToFTextMap.Add(UICommandToActionName(ESoUICommand::EUC_SpellUp), FROM_STRING_TABLE_UI(\"input_spell_up\"));\n\tActionNameToFTextMap.Add(UICommandToActionName(ESoUICommand::EUC_SpellDown), FROM_STRING_TABLE_UI(\"input_spell_down\"));\n\tActionNameToFTextMap.Add(UICommandToActionName(ESoUICommand::EUC_SpellSelect), FROM_STRING_TABLE_UI(\"input_spell_select\"));\n\tActionNameToFTextMap.Add(UICommandToActionName(ESoUICommand::EUC_SpellSelectAndCast), FROM_STRING_TABLE_UI(\"input_spell_select_and_cast\"));\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool FSoInputActionName::IsValidActionNameForCategory(FName ActionName, ESoInputActionCategoryType ForCategoryType)\n{\n\tswitch (ForCategoryType)\n\t{\n\tcase ESoInputActionCategoryType::Game:\n\t\treturn Self::IsGameActionName(ActionName);\n\tcase ESoInputActionCategoryType::Editor:\n\t\treturn Self::IsEditorActionName(ActionName);\n\tcase ESoInputActionCategoryType::UI:\n\t\treturn Self::IsUIActionName(ActionName);\n\tcase ESoInputActionCategoryType::GameOrUI:\n\t\treturn Self::IsGameActionName(ActionName) || Self::IsUIActionName(ActionName);\n\n\tdefault:\n\t\tcheckNoEntry();\n\t}\n\n\treturn false;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nESoInputActionCategoryType FSoInputActionName::GetCategoryForActionName(FName ActionName, bool bPriorityGame)\n{\n\tconst bool bIsGame = Self::IsGameActionName(ActionName);\n\tconst bool bIsUI = Self::IsUIActionName(ActionName);\n\n\tif (bPriorityGame)\n\t{\n\t\t// Return Game first\n\t\tif (bIsGame)\n\t\t\treturn ESoInputActionCategoryType::Game;\n\t\tif (bIsUI)\n\t\t\treturn ESoInputActionCategoryType::UI;\n\t}\n\telse\n\t{\n\t\t// Return UI first\n\t\tif (bIsUI)\n\t\t\treturn ESoInputActionCategoryType::UI;\n\t\tif (bIsGame)\n\t\t\treturn ESoInputActionCategoryType::Game;\n\t}\n\n\tif (Self::IsEditorActionName(ActionName))\n\t\treturn ESoInputActionCategoryType::Editor;\n\n\treturn ESoInputActionCategoryType::None;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nESoInputActionUICategoryType FSoInputActionName::GetUICategoryForUICommand(ESoUICommand Command)\n{\n\tswitch (Command)\n\t{\n\tcase ESoUICommand::EUC_Left:\n\tcase ESoUICommand::EUC_Right:\n\tcase ESoUICommand::EUC_Up:\n\tcase ESoUICommand::EUC_Down:\n\tcase ESoUICommand::EUC_TopLeft:\n\tcase ESoUICommand::EUC_TopRight:\n\tcase ESoUICommand::EUC_Action0:\n\tcase ESoUICommand::EUC_Action1:\n\tcase ESoUICommand::EUC_Action2:\n\tcase ESoUICommand::EUC_ActionBack:\n\tcase ESoUICommand::EUC_RAction2:\n\t\treturn ESoInputActionUICategoryType::Normal;\n\n\tcase ESoUICommand::EUC_MainMenuLeft:\n\tcase ESoUICommand::EUC_MainMenuRight:\n\tcase ESoUICommand::EUC_MainMenuUp:\n\tcase ESoUICommand::EUC_MainMenuDown:\n\tcase ESoUICommand::EUC_MainMenuEnter:\n\tcase ESoUICommand::EUC_MainMenuBack:\n\t\treturn ESoInputActionUICategoryType::MainMenu;\n\n\tcase ESoUICommand::EUC_SpellLeft:\n\tcase ESoUICommand::EUC_SpellRight:\n\tcase ESoUICommand::EUC_SpellUp:\n\tcase ESoUICommand::EUC_SpellDown:\n\tcase ESoUICommand::EUC_SpellSelect:\n\tcase ESoUICommand::EUC_SpellSelectAndCast:\n\t\treturn ESoInputActionUICategoryType::Spell;\n\n\tdefault:\n\t\tbreak;\n\t}\n\n\treturn ESoInputActionUICategoryType::None;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// FSoInputActionNameAxisNameLink\nbool FSoInputActionNameAxisNameLink::bIsInitialized = false;\nTMap<FName, TSet<FName>> FSoInputActionNameAxisNameLink::AxisNameToActionNamesMap;\nTMap<FName, TSet<FName>> FSoInputActionNameAxisNameLink::ActionNameToAxisNamesMap;\nconst TSet<FName> FSoInputActionNameAxisNameLink::EmptySet;\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSoInputActionNameAxisNameLink::Init()\n{\n\tif (bIsInitialized)\n\t\treturn;\n\tbIsInitialized = true;\n\n\tAxisNameToActionNamesMap.Empty();\n\tAxisNameToActionNamesMap.Add(FSoInputAxisName::Move, { FSoInputActionName::MoveLeft, FSoInputActionName::MoveRight });\n\n\t// Add to inverse\n\tfor (const auto& Elem : AxisNameToActionNamesMap)\n\t{\n\t\tconst FName AxisName = Elem.Key;\n\t\tverify(FSoInputAxisName::IsValid(AxisName)); // sanity check\n\n\t\t// It is inverse\n\t\tfor (const FName ActionName : Elem.Value)\n\t\t{\n\t\t\tverify(FSoInputActionName::IsValid(ActionName)) // sanity check\n\t\t\tActionNameToAxisNamesMap.FindOrAdd(ActionName).Add(AxisName);\n\t\t}\n\t}\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// FSoInputConfigurableActionName\nbool FSoInputConfigurableActionName::bIsInitialized = false;\nTArray<FSoInputConfigurableActionName> FSoInputConfigurableActionName::AllOptions;\nTArray<FSoInputConfigurableActionName> FSoInputConfigurableActionName::GamepadOptions;\nTSet<FName> FSoInputConfigurableActionName::GamepadOptionsActionNames;\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSoInputConfigurableActionName::Init()\n{\n\tif (bIsInitialized)\n\t\treturn;\n\tbIsInitialized = true;\n\n\tAllOptions.Empty();\n\tAddToAllOptions(FSoInputActionName::MoveLeft);\n\tAddToAllOptions(FSoInputActionName::MoveRight);\n\tAddToAllOptions(FSoInputActionName::Jump);\n\tAddToAllOptions(FSoInputActionName::Roll);\n\tAddToAllOptions(FSoInputActionName::UseItemFromSlot0);\n\tAddToAllOptions(FSoInputActionName::Strike0);\n\tAddToAllOptions(FSoInputActionName::Strike1);\n\tAddToAllOptions(FSoInputActionName::TakeWeaponAway);\n\tAddToAllOptions(FSoInputActionName::ToggleWeapon);\n\tAddToAllOptions(FSoInputActionName::ToggleItem);\n\tAddToAllOptions(FSoInputActionName::ToggleSpell);\n\tAddToAllOptions(FSoInputActionName::CharacterPanels);\n\tAddToAllOptions(FSoInputActionName::Interact0);\n\tAddToAllOptions(FSoInputActionName::Interact1);\n\tAddToAllOptions(FSoInputActionName::Umbrella);\n\n\tAddToAllOptions(FSoInputActionName::UICommandToActionName(ESoUICommand::EUC_Down));\n\tAddToAllOptions(FSoInputActionName::UICommandToActionName(ESoUICommand::EUC_Up));\n\n\tAddToAllOptions(FSoInputActionName::UICommandToActionName(ESoUICommand::EUC_Action0));\n\tAddToAllOptions(FSoInputActionName::UICommandToActionName(ESoUICommand::EUC_Action1));\n\tAddToAllOptions(FSoInputActionName::UICommandToActionName(ESoUICommand::EUC_Action2));\n\tAddToAllOptions(FSoInputActionName::UICommandToActionName(ESoUICommand::EUC_TopLeft));\n\tAddToAllOptions(FSoInputActionName::UICommandToActionName(ESoUICommand::EUC_TopRight));\n\tAddToAllOptions(FSoInputActionName::UICommandToActionName(ESoUICommand::EUC_ActionBack));\n\n\tAddToAllOptions(FSoInputActionName::UICommandToActionName(ESoUICommand::EUC_SpellLeft));\n\tAddToAllOptions(FSoInputActionName::UICommandToActionName(ESoUICommand::EUC_SpellRight));\n\tAddToAllOptions(FSoInputActionName::UICommandToActionName(ESoUICommand::EUC_SpellUp));\n\tAddToAllOptions(FSoInputActionName::UICommandToActionName(ESoUICommand::EUC_SpellDown));\n\tAddToAllOptions(FSoInputActionName::UICommandToActionName(ESoUICommand::EUC_SpellSelect));\n\tAddToAllOptions(FSoInputActionName::UICommandToActionName(ESoUICommand::EUC_SpellSelectAndCast));\n\n\tGamepadOptions.Empty();\n\tGamepadOptionsActionNames.Empty();\n\tAddToGamepadOptions(FSoInputActionName::Jump);\n\tAddToGamepadOptions(FSoInputActionName::Roll);\n\tAddToGamepadOptions(FSoInputActionName::UseItemFromSlot0);\n\tAddToGamepadOptions(FSoInputActionName::Strike0);\n\tAddToGamepadOptions(FSoInputActionName::Strike1);\n\tAddToGamepadOptions(FSoInputActionName::TakeWeaponAway);\n\tAddToGamepadOptions(FSoInputActionName::ToggleWeapon);\n\tAddToGamepadOptions(FSoInputActionName::ToggleItem);\n\tAddToGamepadOptions(FSoInputActionName::ToggleSpell);\n\tAddToGamepadOptions(FSoInputActionName::CharacterPanels);\n\tAddToGamepadOptions(FSoInputActionName::Interact0);\n\tAddToGamepadOptions(FSoInputActionName::Interact1);\n\tAddToGamepadOptions(FSoInputActionName::Umbrella);\n}\n"
  },
  {
    "path": "Source/SOrb/Settings/Input/SoInputNames.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#pragma once\n\n#include \"CoreMinimal.h\"\n#include \"InputCoreTypes.h\"\n#include \"Framework/Commands/InputChord.h\"\n\n#include \"UI/General/SoUITypes.h\"\n\n#include \"SoInputNames.generated.h\"\n\n#define SO_CREATE_GAMEPAD_KEY_CONST_GETTER(VariableName)                         \\\n\tpublic:                                                                      \\\n\t\tstatic FORCEINLINE FName VariableName() { return _ ## VariableName; }    \\\n\tprivate:                                                                     \\\n\t\tstatic FName _ ## VariableName;\n\n// Keeps track of all the input key names\nstruct SORB_API FSoInputKey\n{\n\ttypedef FSoInputKey Self;\npublic:\n\t// Statically initialize to set some values\n\tstatic void Init();\n\n\tstatic const TArray<FKey>& GetAllKeyboardKeys() { return AllKeyboardKeys; }\n\tstatic const TArray<FKey>& GetAllGamepadKeys() { return AllGamepadKeys; }\n\n\tstatic FORCEINLINE bool IsGamepadButton(FName ButtonName) { return GamepadButtonNames.Contains(ButtonName); }\n\tstatic FORCEINLINE bool IsGamepadFaceButton(FName ButtonName) { return GamepadFaceButtonNames.Contains(ButtonName);  }\n\n\tstatic FORCEINLINE FName GetThumbStickForStickDirection(FName StickDirection)\n\t{\n\t\tif (const FName* NamePtr = GamepadStickDirectionToStickMap.Find(StickDirection))\n\t\t\treturn *NamePtr;\n\n\t\treturn NAME_None;\n\t}\n\n\tstatic FORCEINLINE bool IsRightThumbStickDirection(FName StickDirection)\n\t{\n\t\tif (const FName* NamePtr = GamepadStickDirectionToStickMap.Find(StickDirection))\n\t\t\treturn Gamepad_RightThumbstick() == *NamePtr;\n\n\t\treturn false;\n\t}\n\n\tstatic FText GetKeyDisplayName(const FKey& Key)\n\t{\n\t\t// Search our overrides\n\t\tif (FText* TextPtr = KeyToFTextMap.Find(Key))\n\t\t\treturn *TextPtr;\n\n\t\t// Use the default fallback, always in short form\n\t\tstatic constexpr bool bLongDisplayName = false;\n\t\treturn Key.GetDisplayName(bLongDisplayName);\n\t}\n\n\tstatic FText GetInputChordDisplayName(const FInputChord& InputChord);\n\n\t// Gamepad Button keys, no Axis here\n\tSO_CREATE_GAMEPAD_KEY_CONST_GETTER(Gamepad_LeftThumbstick);\n\tSO_CREATE_GAMEPAD_KEY_CONST_GETTER(Gamepad_RightThumbstick);\n\tSO_CREATE_GAMEPAD_KEY_CONST_GETTER(Gamepad_Special_Left);\n\tSO_CREATE_GAMEPAD_KEY_CONST_GETTER(Gamepad_Special_Right);\n\n\tSO_CREATE_GAMEPAD_KEY_CONST_GETTER(Gamepad_FaceButton_Bottom);\n\tSO_CREATE_GAMEPAD_KEY_CONST_GETTER(Gamepad_FaceButton_Right);\n\tSO_CREATE_GAMEPAD_KEY_CONST_GETTER(Gamepad_FaceButton_Left);\n\tSO_CREATE_GAMEPAD_KEY_CONST_GETTER(Gamepad_FaceButton_Top);\n\n\tSO_CREATE_GAMEPAD_KEY_CONST_GETTER(Gamepad_LeftShoulder);\n\tSO_CREATE_GAMEPAD_KEY_CONST_GETTER(Gamepad_RightShoulder);\n\tSO_CREATE_GAMEPAD_KEY_CONST_GETTER(Gamepad_LeftTrigger);\n\tSO_CREATE_GAMEPAD_KEY_CONST_GETTER(Gamepad_RightTrigger);\n\n\tSO_CREATE_GAMEPAD_KEY_CONST_GETTER(Gamepad_DPad_Up);\n\tSO_CREATE_GAMEPAD_KEY_CONST_GETTER(Gamepad_DPad_Down);\n\tSO_CREATE_GAMEPAD_KEY_CONST_GETTER(Gamepad_DPad_Right);\n\tSO_CREATE_GAMEPAD_KEY_CONST_GETTER(Gamepad_DPad_Left);\n\n\tSO_CREATE_GAMEPAD_KEY_CONST_GETTER(Gamepad_LeftStick_Up);\n\tSO_CREATE_GAMEPAD_KEY_CONST_GETTER(Gamepad_LeftStick_Down);\n\tSO_CREATE_GAMEPAD_KEY_CONST_GETTER(Gamepad_LeftStick_Right);\n\tSO_CREATE_GAMEPAD_KEY_CONST_GETTER(Gamepad_LeftStick_Left);\n\n\tSO_CREATE_GAMEPAD_KEY_CONST_GETTER(Gamepad_RightStick_Up);\n\tSO_CREATE_GAMEPAD_KEY_CONST_GETTER(Gamepad_RightStick_Down);\n\tSO_CREATE_GAMEPAD_KEY_CONST_GETTER(Gamepad_RightStick_Right);\n\tSO_CREATE_GAMEPAD_KEY_CONST_GETTER(Gamepad_RightStick_Left);\n\nprotected:\n\t// Keep track of all keyboard key names from EKeys\n\tstatic TArray<FKey> AllKeyboardKeys;\n\n\t// Keep track of all gamepad key names from EKeys\n\tstatic TArray<FKey> AllGamepadKeys;\n\n\t// Contains all the names for the gamepad buttons, no axis names here\n\tstatic TSet<FName> GamepadButtonNames;\n\n\t// Converts from\n\t// Key: Stick direction\n\t// Value: Stick Name\n\tstatic TMap<FName, FName> GamepadStickDirectionToStickMap;\n\n\t// Converts from\n\t// Key: Key\n\t// Value: Localizable FText\n\tstatic TMap<FKey, FText> KeyToFTextMap;\n\n\t// Keeps track of all the gamepad face buttons names\n\tstatic TSet<FName> GamepadFaceButtonNames;\n\n\t// Set in Initialize\n\tstatic bool bIsInitialized;\n};\n\n#undef SO_CREATE_GAMEPAD_KEY_CONST_GETTER\n\n// Keep track of all input axis names\nstruct SORB_API FSoInputAxisName\n{\npublic:\n\t// Statically initialize to set some values\n\tstatic void Init();\n\n\t// Is this axis name editable? Does it exist?\n\tstatic FORCEINLINE bool IsValid(const FName AxisName)\n\t{\n\t\treturn AllAxisNames.Contains(AxisName);\n\t}\n\npublic:\n\tstatic const FName GamepadLeftX;\n\tstatic const FName GamepadLeftY;\n\tstatic const FName GamepadRightX;\n\tstatic const FName GamepadRightY;\n\tstatic const FName MoveY;\n\n\t// Tied to MoveLeft/MoveRight\n\tstatic const FName Move;\n\nprivate:\n\tstatic TSet<FName> AllAxisNames;\n\n\t// Set in Initialize\n\tstatic bool bIsInitialized;\n};\n\n\n// Enum equivalent of the action names, mainly used to get the UI icons\nUENUM(BlueprintType)\nenum class ESoInputActionNameType : uint8\n{\n\t// Invalid default state\n\tIANT_None = 0\t\t\tUMETA(DisplayName = \"None\"),\n\n\tIANT_MoveUp\t\t\t\tUMETA(DisplayName = \"Move Up (UI only)\"),\n\tIANT_MoveDown\t\t\tUMETA(DisplayName = \"Move Down (UI only)\"),\n\tIANT_MoveLeft\t\t\tUMETA(DisplayName = \"Move Left\"),\n\tIANT_MoveRight\t\t\tUMETA(DisplayName = \"Move Right\"),\n\n\tIANT_Strike0\t\t\tUMETA(DisplayName = \"Primary Strike (Strike0)\"),\n\tIANT_Strike1\t\t\tUMETA(DisplayName = \"Special Strike (Strike1)\"),\n\n\tIANT_Roll\t\t\t\tUMETA(DisplayName = \"Roll\"),\n\tIANT_Umbrella\t\t\tUMETA(DisplayName = \"Floating (Umbrella)\"),\n\tIANT_Jump\t\t\t\tUMETA(DisplayName = \"Jump\"),\n\n\tIANT_ToggleItem\t\t\tUMETA(DisplayName = \"Change Item (ToggleItem)\"),\n\tIANT_ToggleSpell\t\tUMETA(DisplayName = \"Change Spell (ToggleSpell)\"),\n\tIANT_ToggleWeapon\t\tUMETA(DisplayName = \"Change Weapon (ToggleWeapon)\"),\n\tIANT_TakeWeaponAway\t\tUMETA(DisplayName = \"Take Weapon Away (TakeWeaponAway)\"),\n\tIANT_CharacterPanels\tUMETA(DisplayName = \"Open Inventory (CharacterPanels)\"),\n\n\tIANT_UseItemFromSlot0\tUMETA(DisplayName = \"Use Item (UseItemFromSlot0)\"),\n\tIANT_Interact0\t\t\tUMETA(DisplayName = \"Interact (Interact0)\"),\n\tIANT_Interact1\t\t\tUMETA(DisplayName = \"Interact Alternative (Interact1)\"),\n\n\tIANT_Num\t\t\t\tUMETA(Hidden)\n};\n\n\n// The type of input category\n// Used so that we can know when to warn users about key conflicts from different categories of input action names\nUENUM(BlueprintType)\nenum class ESoInputActionCategoryType : uint8\n{\n\tNone = 0,\n\n\tAll,\n\n\tGame,\n\tEditor,\n\tUI,\n\n\t// Game or UI\n\tGameOrUI\n};\n\n// The subtype for the UI input category\n// Used so that we know how to warn users if some UI Commands from the same category conflict\nUENUM(BlueprintType)\nenum class ESoInputActionUICategoryType : uint8\n{\n\t// Not an Action UI command\n\tNone = 0,\n\n\tNormal,\n\tMainMenu,\n\tSpell\n};\n\n\n// Keep track of all input action names\n// Gamepad config helper: https://pjstrnad.com/mapping-of-xbox-controller-to-unreal-engine/\nstruct SORB_API FSoInputActionName\n{\n\ttypedef FSoInputActionName Self;\npublic:\n\t// Statically initialize to set some values\n\tstatic void Init();\n\n\t// Is this action name editable? Does it exist?\n\tstatic FORCEINLINE bool IsValid(FName ActionName)\n\t{\n\t\treturn IsGameActionName(ActionName) || IsEditorActionName(ActionName) || IsUIActionName(ActionName);\n\t}\n\n\t// Is the ActionName an editor one?\n\tstatic FORCEINLINE bool IsEditorActionName(FName ActionName)\n\t{\n\t\treturn EditorActionNames.Contains(ActionName);\n\t}\n\n\t// Is the ActionName part of the final game, in the game viewport\n\tstatic FORCEINLINE bool IsGameActionName(FName ActionName)\n\t{\n\t\treturn GameActionNames.Contains(ActionName);\n\t}\n\n\t// Is the ActionName an UI command?\n\tstatic FORCEINLINE bool IsUIActionName(FName ActionName)\n\t{\n\t\treturn UIActionNames.Contains(ActionName);\n\t}\n\n\tstatic FORCEINLINE bool CanIgnoreDuplicateBindingForActionName(FName ActionName)\n\t{\n\t\treturn IgnoreDuplicatesActionNames.Contains(ActionName);\n\t}\n\n\t// Is this a valid UI command?\n\tstatic FORCEINLINE bool IsValidUICommand(ESoUICommand Command)\n\t{\n\t\treturn Command != ESoUICommand::EUC_PressedMax && Command != ESoUICommand::EUC_ReleasedMax;\n\t}\n\n\t// Is this a valid ActionNameType\n\tstatic FORCEINLINE bool IsValidActionNameType(ESoInputActionNameType Type)\n\t{\n\t\treturn Type != ESoInputActionNameType::IANT_None;\n\t}\n\n\tstatic FORCEINLINE const TSet<ESoUICommand>& GetUICommandsThatConflictWith(ESoUICommand Command)\n\t{\n\t\tstatic const TSet<ESoUICommand> EmptySet;\n\t\tif (UICommandConflictMap.Contains(Command))\n\t\t\treturn UICommandConflictMap.FindChecked(Command);\n\n\t\treturn EmptySet;\n\t}\n\n\t// Converts ESoInputActionNameType to FName\n\tstatic FORCEINLINE FName ActionNameTypeToActionName(ESoInputActionNameType Type)\n\t{\n\t\tif (const FName* NamePtr = ActionNameTypeToActionNameMap.Find(Type))\n\t\t\treturn *NamePtr;\n\n\t\treturn NAME_None;\n\t}\n\n\t// Converts ESoInputActionNameType to FName\n\tstatic FORCEINLINE ESoInputActionNameType ActionNameToActionNameType(FName ActionName)\n\t{\n\t\tif (const ESoInputActionNameType* TypePtr = ActionNameToActionNameTypeMap.Find(ActionName))\n\t\t\treturn *TypePtr;\n\n\t\treturn ESoInputActionNameType::IANT_None;\n\t}\n\n\t// Converts between and UI action name to the enum\n\tstatic FORCEINLINE ESoUICommand ActionNameToUICommand(FName ActionName)\n\t{\n\t\tif (const ESoUICommand* CommandPtr = ActionNameToUICommandMap.Find(ActionName))\n\t\t\treturn *CommandPtr;\n\n\t\treturn ESoUICommand::EUC_ReleasedMax;\n\t}\n\n\t// Converts between an ActionName\n\t// NOTE: This is just the cached version of GetNameFromUICommand\n\tstatic FORCEINLINE FName UICommandToActionName(ESoUICommand Command)\n\t{\n\t\tif (const FName* NamePtr = UICommandToActionNameMap.Find(Command))\n\t\t\treturn *NamePtr;\n\n\t\treturn NAME_None;\n\t}\n\n\tstatic FORCEINLINE FName GetSyncedActionNameIfModified(FName ActionName)\n\t{\n\t\tif (const FName* NamePtr = ActionNamesSyncIfModifiedMap.Find(ActionName))\n\t\t\treturn *NamePtr;\n\n\t\treturn NAME_None;\n\t}\n\n\t// Convert Enum to friendly string name\n\tstatic FName GetNameFromUICommand(ESoUICommand Command, bool bStripReleasePrefix = true)\n\t{\n\t\tif (Command == ESoUICommand::EUC_PressedMax || Command == ESoUICommand::EUC_ReleasedMax)\n\t\t\treturn NAME_None;\n\n\t\tstatic const int32 UICmdPressedNum = static_cast<int32>(ESoUICommand::EUC_PressedMax);\n\t\tconst UEnum* EnumPtr = GetUICommandEnum();\n\t\tif (!EnumPtr)\n\t\t\treturn NAME_None;\n\n\t\t// Remove EUC_ or EUC_R\n\t\tconst int32 CommandIndex = static_cast<int32>(Command);\n\t\tconst bool bPressedEnum = CommandIndex < UICmdPressedNum;\n\t\tconst FString EnumValue = EnumPtr->GetNameStringByIndex(CommandIndex);\n\t\tif (EnumValue.IsEmpty())\n\t\t\treturn NAME_None;\n\n\t\tif (bPressedEnum || (!bPressedEnum && !bStripReleasePrefix))\n\t\t\treturn FName(*EnumValue.Mid(4));\n\n\t\t// Released\n\t\treturn FName(*EnumValue.Mid(5));\n\t}\n\n\t// Gets the enum\n\tstatic const UEnum* GetUICommandEnum()\n\t{\n\t\tstatic const UEnum* EnumPtr = FindObject<UEnum>(ANY_PACKAGE, TEXT(\"ESoUICommand\"), true);\n\t\treturn EnumPtr;\n\t}\n\n\tstatic FORCEINLINE FText GetTextForActionName(FName ActionName)\n\t{\n\t\tif (FText* TextPtr = ActionNameToFTextMap.Find(ActionName))\n\t\t\treturn *TextPtr;\n\n\t\treturn FText::GetEmpty();\n\t}\n\n\tstatic bool IsValidActionNameForCategory(FName ActionName, ESoInputActionCategoryType ForCategoryType);\n\tstatic ESoInputActionCategoryType GetCategoryForActionName(FName ActionName, bool bPriorityGame = true);\n\tstatic ESoInputActionUICategoryType GetUICategoryForUICommand(ESoUICommand Command);\n\tstatic ESoInputActionUICategoryType GetUICategoryForActionName(FName ActionName)\n\t{\n\t\treturn GetUICategoryForUICommand(ActionNameToUICommand(ActionName));\n\t}\n\n\npublic:\n\t// Game shortcuts\n\t// NOTE: We only care if we modify these shortcuts, UI shortcuts can't be modified anyways\n\tstatic const FName MoveLeft;  // NOTE: also used in UI BUT also corresponds to in game left\n\tstatic const FName MoveRight; // NOTE: also used in UI BUT also corresponds to in game right\n\tstatic const FName Strike0;\n\tstatic const FName Strike1;\n\tstatic const FName Roll;\n\tstatic const FName Umbrella;\n\tstatic const FName TakeWeaponAway;\n\tstatic const FName Jump;\n\tstatic const FName Interact0;\n\tstatic const FName Interact1;\n\tstatic const FName UseItemFromSlot0;\n\tstatic const FName ToggleWeapon;\n\tstatic const FName ToggleItem;\n\tstatic const FName ToggleSpell;\n\tstatic const FName LockFaceDirection;\n\tstatic const FName CharacterPanels;\n\tstatic const FName QuickSaveLoad0;\n\tstatic const FName QuickSaveLoad1;\n\n\t// TODO why do we need a separate one for just he controller\n\tstatic const FName StartVideoLoopPlayback;\n\tstatic const FName StartVideoLoopPlaybackController;\n\tstatic const FName StopVideoLoopPlayback;\n\n\tstatic const FName RestartDemo;\n\n\t// UI commands\n\t// Equivalent of command from ESoUICommand\n\t// Useful variables:\n\t// - UIActionNames - Set to see if an FName is an UI action name\n\t// - ActionNameToUICommandMap - Maps FName => Enum\n\t// - UICommandToActionNameMap - Maps Enum => Fname\n\t// NOTE: no need to define here, just use GetNameFromUICommand(ESoUICommand)\n\n\n\t// Editor shortcuts\n\t// We do not really care if we override this shortcuts\n\tstatic const FName EditorCameraEditMode;\n\tstatic const FName EditorSkyEditMode;\n\tstatic const FName EditorCharShadowEditMode;\n\tstatic const FName EditorCreateKey;\n\tstatic const FName EditorReloadKeys;\n\tstatic const FName EditorSaveKeys;\n\tstatic const FName EditorDeleteKey;\n\tstatic const FName EditorCopyFromKey;\n\tstatic const FName EditorPasteToKey;\n\tstatic const FName EditorMoveClosestKeyNodeHere;\n\tstatic const FName EditorJumpToNextKey;\n\tstatic const FName EditorJumpToPrevKey;\n\tstatic const FName EditorSpecialEditButtonPressed0;\n\tstatic const FName EditorSpecialEditButtonPressed1;\n\tstatic const FName EditorCtrl;\n\tstatic const FName EditorMiddleMouseButton;\n\tstatic const FName EditorSuperEditMode;\n\tstatic const FName EditorDebugFeature;\n\nprotected:\n\tstatic TSet<FName> GameActionNames;\n\tstatic TSet<FName> EditorActionNames;\n\tstatic TSet<FName> UIActionNames;\n\n\t// For these action names we don't care if there are duplicates.\n\tstatic TSet<FName> IgnoreDuplicatesActionNames;\n\n\t// Converts from\n\t// Key: ActionName\n\t// Value: Localizable FText\n\tstatic TMap<FName, FText> ActionNameToFTextMap;\n\n\t// Converts from\n\t// Key: ESoInputActionNameType\n\t// Value: FName ActionName\n\tstatic TMap<ESoInputActionNameType, FName> ActionNameTypeToActionNameMap;\n\n\t// Opposite of ActionNameTypeToActionNameMap\n\t// Key: FName ActionName\n\t// Value: ESoInputActionNameType\n\tstatic TMap<FName, ESoInputActionNameType> ActionNameToActionNameTypeMap;\n\n\t// Cache that Converts from\n\t// Key: ActionName\n\t// Value: UI command\n\tstatic TMap<FName, ESoUICommand> ActionNameToUICommandMap;\n\n\t// Opposite of ActionNameToUICommandMap\n\t// Key: ActionName\n\t// Value: UI command\n\tstatic TMap<ESoUICommand, FName> UICommandToActionNameMap;\n\n\t// Key: Command\n\t// Value: Other Commands it conflicts with\n\tstatic TMap<ESoUICommand, TSet<ESoUICommand>> UICommandConflictMap;\n\n\t// If the key action name is modified also modify the value action name\n\t// Key: Action name\n\t// Value: The value action name to modify if the key is modified\n\tstatic TMap<FName, FName> ActionNamesSyncIfModifiedMap;\n\n\t// Set in Initialize\n\tstatic bool bIsInitialized;\n};\n\n\n// Contains the info about the dependencies between the AxisNames and ActionNames\nstruct SORB_API FSoInputActionNameAxisNameLink\n{\npublic:\n\t// Statically initialize to set some values\n\tstatic void Init();\n\n\t// Gets the Axis names that are linked to an action name. This usually means the axis must also be modified alongside the action name\n\tstatic FORCEINLINE const TSet<FName>& GetAxisNamesLinkedToActionName(const FName ActionName)\n\t{\n\t\tif (const auto* NameSet = ActionNameToAxisNamesMap.Find(ActionName))\n\t\t\treturn *NameSet;\n\n\t\treturn EmptySet;\n\t}\n\n\t// Gets the action names that are linked to an axis name.\n\tstatic FORCEINLINE const TSet<FName>& GetActionNamesLinkedToAxisName(const FName AxisName)\n\t{\n\t\tif (const auto* NameSet = AxisNameToActionNamesMap.Find(AxisName))\n\t\t\treturn *NameSet;\n\n\t\treturn EmptySet;\n\t}\n\nprotected:\n\t// Key: Axis Name\n\t// Value: Action names linked to the axis name\n\tstatic TMap<FName, TSet<FName>> AxisNameToActionNamesMap;\n\n\t// Opposite of AxisNameToActionNameMap\n\t// Key: Action Name\n\t// Value: Axis names linked to the action name\n\tstatic TMap<FName, TSet<FName>> ActionNameToAxisNamesMap;\n\n\t// Used to return empty set by reference\n\tstatic const TSet<FName> EmptySet;\n\n\t// Set in Initialize\n\tstatic bool bIsInitialized;\n};\n\n\n// Action name that can be configured from the UI settings\nUSTRUCT(BlueprintType)\nstruct FSoInputConfigurableActionName\n{\n\tGENERATED_USTRUCT_BODY()\n\ttypedef FSoInputConfigurableActionName Self;\npublic:\n\tFSoInputConfigurableActionName() {}\n\tFSoInputConfigurableActionName(FName InActionName, const FText& InDisplayText) :\n\t\tActionName(InActionName), DisplayText(InDisplayText) {}\n\n\t// Statically initialize to set some values\n\tstatic void Init();\n\n\tstatic const TArray<Self>& GetAllOptions() { return AllOptions; }\n\tstatic const TArray<Self>& GetGamepadOptions() { return GamepadOptions; }\n\n\tstatic bool IsGamepadActionName(FName ActionName) { return GamepadOptionsActionNames.Contains(ActionName); }\n\nprotected:\n\tstatic void AddToAllOptions(FName ActionName)\n\t{\n\t\tAllOptions.Add(Self(ActionName, FSoInputActionName::GetTextForActionName(ActionName)));\n\t}\n\tstatic void AddToGamepadOptions(FName ActionName)\n\t{\n\t\tGamepadOptions.Add(Self(ActionName, FSoInputActionName::GetTextForActionName(ActionName)));\n\t\tGamepadOptionsActionNames.Add(ActionName);\n\t}\n\npublic:\n\t// See Config\\DefaultInput.ini and ASoCharacter::SetupPlayerInputComponent\n\tUPROPERTY(BlueprintReadOnly, VisibleAnywhere)\n\tFName ActionName;\n\n\t// The displayed text for this action name\n\tUPROPERTY(BlueprintReadOnly, VisibleAnywhere)\n\tFText DisplayText;\n\nprotected:\n\t// Set in Initialize\n\tstatic bool bIsInitialized;\n\n\t// Array of all configurable action names\n\tstatic TArray<Self> AllOptions;\n\n\t// All the configurable action names by the gamepad\n\tstatic TArray<Self> GamepadOptions;\n\n\t// Just the Action names from GamepadOptions\n\tstatic TSet<FName> GamepadOptionsActionNames;\n};\n"
  },
  {
    "path": "Source/SOrb/Settings/Input/SoInputSettings.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#include \"SoInputSettings.h\"\n#include \"SoInputNames.h\"\n#include \"SoInputHelper.h\"\n#include \"SOrb.h\"\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFInputActionKeyMapping FSoInputPresetKeyRebind::ToUnrealActionMapping() const\n{\n\tFInputActionKeyMapping UnrealMapping = USoInputHelper::InputChordToActionMapping(Key);\n\tUnrealMapping.ActionName = ActionName;\n\treturn UnrealMapping;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFSoInputPreset::FSoInputPreset()\n{\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSoInputPreset::CheckAndFixIntegrityKeyRebinds(TArray<FSoInputPresetKeyRebind>& KeyRebinds)\n{\n\tif (KeyRebinds.Num() == 0)\n\t{\n\t\t// Reset to something sensible\n\t\tResetToDefaultsKeyRebinds(KeyRebinds);\n\t\treturn;\n\t}\n\n\t// 1. Remove action names that do not exist anymore\n\t// 2. Adds action names that were added\n\t// 3. Keep proper order from the AllOption\n\n\t// Collect current\n\tTMap<FName, FInputChord> CurrentKeyRebinds;\n\tfor (const FSoInputPresetKeyRebind& Rebind : KeyRebinds)\n\t\tCurrentKeyRebinds.Add(Rebind.ActionName, Rebind.Key);\n\n\t// Reset and restore key bindings for preset\n\tResetToDefaultsKeyRebinds(KeyRebinds);\n\tfor (FSoInputPresetKeyRebind& Rebind : KeyRebinds)\n\t\tRebind.Key = CurrentKeyRebinds.FindRef(Rebind.ActionName);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSoInputPreset::ResetToDefaultsKeyRebinds(TArray<FSoInputPresetKeyRebind>& KeyRebinds)\n{\n\t// HACK!\n\t//FWarriorbGameModule::Init();\n\n\t// Defaults at the time of creation\n\tKeyRebinds.Empty();\n\tfor (const FSoInputConfigurableActionName& Option : FSoInputConfigurableActionName::GetAllOptions())\n\t\tKeyRebinds.Add({ Option.ActionName });\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSoInputPreset::CheckAndFixIntegrity()\n{\n\tCheckAndFixIntegrityKeyRebinds(KeyRebinds);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSoInputPreset::ResetToDefaults()\n{\n\tResetToDefaultsKeyRebinds(KeyRebinds);\n}\n\n#if WITH_EDITOR\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoInputSettings::CanEditChange(const UProperty* InProperty) const\n{\n\tconst bool bIsEditable = Super::CanEditChange(InProperty);\n\treturn bIsEditable;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoInputSettings::PostEditChangeChainProperty(struct FPropertyChangedChainEvent& PropertyChangedEvent)\n{\n\tSuper::PostEditChangeChainProperty(PropertyChangedEvent);\n\tFSoInputPreset::CheckAndFixIntegrityKeyRebinds(KeyboardDefaultArrowsPresetKeyRebinds);\n}\n#endif // WITH_EDITOR\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoInputSettings::PostInitProperties()\n{\n\tSuper::PostInitProperties();\n\n\tReloadRuntimeValues();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoInputSettings::ReloadRuntimeValues()\n{\n\tif (HasAnyFlags(RF_NeedLoad))\n\t\treturn;\n\t\n\tKeyboardDefaultArrowsPreset.DeviceType = KeyboardDefaultArrowsPresetDeviceType;\n\tKeyboardDefaultArrowsPreset.KeyRebinds = KeyboardDefaultArrowsPresetKeyRebinds;\n}"
  },
  {
    "path": "Source/SOrb/Settings/Input/SoInputSettings.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#pragma once\n\n#include \"CoreMinimal.h\"\n#include \"GameFramework/PlayerInput.h\"\n#include \"Engine/DeveloperSettings.h\"\n#include \"SoInputSettingsTypes.h\"\n\n#include \"SoInputSettings.generated.h\"\n\n\n// Tells us to what key we want to Rebind the ActionName\nUSTRUCT(BlueprintType)\nstruct SORB_API FSoInputPresetKeyRebind\n{\n\tGENERATED_USTRUCT_BODY()\npublic:\n\tFInputActionKeyMapping ToUnrealActionMapping() const;\n\npublic:\n\t// Action name to rebind\n\tUPROPERTY(BlueprintReadOnly, VisibleAnywhere)\n\tFName ActionName;\n\n\t// Key to rebind to\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere)\n\tFInputChord Key;\n};\n\n\n// Represents an input preset, how do we want to reassign all keys?\nUSTRUCT(BlueprintType)\nstruct SORB_API FSoInputPreset\n{\n\tGENERATED_USTRUCT_BODY()\npublic:\n\tFSoInputPreset();\n\n\t// Fix any changing configurable option names, we removed/added new option\n\tstatic void CheckAndFixIntegrityKeyRebinds(TArray<FSoInputPresetKeyRebind>& KeyRebinds);\n\tstatic void ResetToDefaultsKeyRebinds(TArray<FSoInputPresetKeyRebind>& KeyRebinds);\n\t\n\tvoid CheckAndFixIntegrity();\n\tvoid ResetToDefaults();\n\n\tFORCEINLINE bool IsKeyboard() const { return DeviceType == ESoInputDeviceType::Keyboard; }\n\npublic:\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere)\n\tESoInputDeviceType DeviceType = ESoInputDeviceType::Keyboard;\n\n\t// All the key rebinds for this preset\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, EditFixedSize)\n\tTArray<FSoInputPresetKeyRebind> KeyRebinds;\n};\n\n\n// Custom input settings we need\nUCLASS(Config = SoInputSettings, DefaultConfig, meta = (DisplayName = \"Warriorb Input\"))\nclass SORB_API USoInputSettings : public UDeveloperSettings\n{\n\tGENERATED_BODY()\npublic:\n\t// UDeveloperSettings interface\n\t/** Gets the settings container name for the settings, either Project or Editor */\n\tFName GetContainerName() const override { return TEXT(\"Project\"); }\n\t/** Gets the category for the settings, some high level grouping like, Editor, Engine, Game...etc. */\n\tFName GetCategoryName() const override { return TEXT(\"Game\"); };\n\t/** The unique name for your section of settings, uses the class's FName. */\n\tFName GetSectionName() const override { return TEXT(\"Warriorb Input\"); };\n\n#if WITH_EDITOR\n\t/** Gets the description for the section, uses the classes ToolTip by default. */\n\tFText GetSectionDescription() const override\n\t{\n\t\treturn FText::FromString(TEXT(\"Configure the custom input settings\"));\n\t}\n\n\t/** Whether or not this class supports auto registration or if the settings have a custom setup */\n\tbool SupportsAutoRegistration() const override { return true; }\n\n\t// UObject interface\n\tbool CanEditChange(const UProperty* InProperty) const override;\n\tvoid PostEditChangeChainProperty(struct FPropertyChangedChainEvent& PropertyChangedEvent) override;\n#endif // WITH_EDITOR\n\n\tvoid PostInitProperties() override;\n\n\t// Own methods\n\t/** Saves the settings to the config file depending on the settings of this class. */\n\tvoid SaveSettings()\n\t{\n\t\tconst UClass* ThisClass = GetClass();\n\t\tif (ThisClass->HasAnyClassFlags(CLASS_DefaultConfig))\n\t\t{\n\t\t\tUpdateDefaultConfigFile();\n\t\t}\n\t\telse if (ThisClass->HasAnyClassFlags(CLASS_GlobalUserConfig))\n\t\t{\n\t\t\tUpdateGlobalUserConfigFile();\n\t\t}\n\t\telse\n\t\t{\n\t\t\tSaveConfig();\n\t\t}\n\t}\n\n\t\n\tconst FSoInputPreset& GetKeyboardDefaultArrowsPreset() const { return KeyboardDefaultArrowsPreset; }\n\nprotected:\n\tvoid ReloadRuntimeValues();\n\t\nprotected:\n\t// This is like this because it looks nicer in the config file instead of one long line\n\tUPROPERTY(Config, EditAnywhere, Category = \"Keyboard Default Arrows Preset\", DisplayName = \"Device Type\")\n\tESoInputDeviceType KeyboardDefaultArrowsPresetDeviceType = ESoInputDeviceType::Keyboard;\n\tUPROPERTY(Config, EditAnywhere, EditFixedSize, Category = \"Keyboard Default Arrows Preset\", DisplayName = \"Key Rebinds\")\n\tTArray<FSoInputPresetKeyRebind> KeyboardDefaultArrowsPresetKeyRebinds;\n\n\t// Set at runtime\n\tFSoInputPreset KeyboardDefaultArrowsPreset;\n};\n"
  },
  {
    "path": "Source/SOrb/Settings/Input/SoInputSettingsTypes.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#include \"SoInputSettingsTypes.h\"\n#include \"SoInputHelper.h\"\n#include \"Engine/Texture2D.h\"\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool FSoInputActionKeyMapping::IsKeyboard() const\n{\n\treturn USoInputHelper::IsKeyboardKey(Default.Key);\n}\n\nbool FSoInputActionKeyMapping::IsGamepad() const\n{\n\treturn USoInputHelper::IsGamepadKey(Default.Key);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool FSoInputActionKeyMapping::operator==(const FSoInputActionKeyMapping& Other) const\n{\n\treturn Default == Other.Default && Modified == Other.Modified;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool FSoInputActionKeyMapping::operator<(const FSoInputActionKeyMapping& Other) const\n{\n\tif (Default == Other.Default)\n\t{\n\t\treturn Modified < Other.Modified;\n\t}\n\n\treturn Default < Other.Default;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nESoInputIntegrity FSoInputActionKeyMapping::ValidateIntegrity() const\n{\n\tif (Default.ActionName != Modified.ActionName)\n\t\treturn ESoInputIntegrity::NamesMismatch;\n\n\t// We can only determine category if both keys are valid\n\tif (Default.Key.IsValid() && Modified.Key.IsValid())\n\t\tif (USoInputHelper::IsKeyboardKey(Default.Key) != USoInputHelper::IsKeyboardKey(Modified.Key))\n\t\t{\n\t\t\treturn ESoInputIntegrity::KeyCategoryMismatch;\n\t\t}\n\n\treturn ESoInputIntegrity::Ok;\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFString FSoInputActionKeyMapping::ToString() const\n{\n\treturn FString::Printf(TEXT(\"FSoInputActionKeyMapping(Default=%s, Modified=%s)\"),\n\t\t*USoInputHelper::ActionMappingToString(Default), *USoInputHelper::ActionMappingToString(Modified));\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool FSoInputAxisKeyMapping::IsKeyboard() const\n{\n\treturn USoInputHelper::IsKeyboardKey(Default.Key);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool FSoInputAxisKeyMapping::IsGamepad() const\n{\n\treturn USoInputHelper::IsGamepadKey(Default.Key);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool FSoInputAxisKeyMapping::operator==(const FSoInputAxisKeyMapping& Other) const\n{\n\treturn USoInputHelper::AreAxisMappingsEqual(Default, Other.Default) &&\n\t\tUSoInputHelper::AreAxisMappingsEqual(Modified, Other.Modified);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool FSoInputAxisKeyMapping::operator<(const FSoInputAxisKeyMapping& Other) const\n{\n\tif (USoInputHelper::AreAxisMappingsEqual(Default, Other.Default))\n\t{\n\t\treturn Modified < Other.Modified;\n\t}\n\n\treturn Default < Other.Default;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nESoInputIntegrity FSoInputAxisKeyMapping::ValidateIntegrity() const\n{\n\tif (Default.AxisName != Modified.AxisName)\n\t\treturn ESoInputIntegrity::NamesMismatch;\n\n\t// We can only determine category if both keys are valid\n\tif (Default.Key.IsValid() && Modified.Key.IsValid())\n\t\tif (USoInputHelper::IsKeyboardKey(Default.Key) != USoInputHelper::IsKeyboardKey(Modified.Key))\n\t\t\treturn ESoInputIntegrity::KeyCategoryMismatch;\n\n\n\treturn ESoInputIntegrity::Ok;\n}\n\n///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFString FSoInputAxisKeyMapping::ToString() const\n{\n\treturn FString::Printf(TEXT(\"FSoInputAxisKeyMapping(Default=%s, Modified=%s)\"),\n\t\t*USoInputHelper::AxisMappingToString(Default), *USoInputHelper::AxisMappingToString(Modified));\n}\n\n///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUTexture2D* FSoInputUITextures::GetTextureForDeviceType(const ESoInputDeviceType DeviceType) const\n{\n\tswitch (DeviceType)\n\t{\n\tcase ESoInputDeviceType::Keyboard:\n\t\treturn Keyboard;\n\tcase ESoInputDeviceType::Gamepad_PlayStation:\n\t\treturn PlayStation;\n\tcase ESoInputDeviceType::Gamepad_Switch:\n\t\treturn Switch;\n\tcase ESoInputDeviceType::Gamepad_Generic:\n\tcase ESoInputDeviceType::Gamepad_Xbox:\n\t\treturn Xbox;\n\tdefault:\n\t\tbreak;\n\t}\n\n\treturn nullptr;\n}\n\n///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUTexture2D* FSoInputKeyboardKeyTextures::GetTexture(bool bPressed) const\n{\n\treturn bPressed ? Pressed : Unpressed;\n}\n\n///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUTexture2D* FSoInputGamepadKeyTextures::GetTextureForDeviceType(const ESoInputDeviceType DeviceType) const\n{\n\tswitch (DeviceType)\n\t{\n\tcase ESoInputDeviceType::Gamepad_PlayStation:\n\t\treturn PlayStation;\n\tcase ESoInputDeviceType::Gamepad_Generic:\n\tcase ESoInputDeviceType::Gamepad_Xbox:\n\t\treturn Xbox;\n\tcase ESoInputDeviceType::Gamepad_Switch:\n\t\treturn Switch;\n\tdefault:\n\t\tbreak;\n\t}\n\n\treturn nullptr;\n}\n"
  },
  {
    "path": "Source/SOrb/Settings/Input/SoInputSettingsTypes.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#pragma once\n\n#include \"CoreMinimal.h\"\n#include \"GameFramework/PlayerInput.h\"\n\n#include \"SoInputSettingsTypes.generated.h\"\n\nclass UTexture2D;\n\n// Used to check the integrity of FSoInputActionKeyMapping and FSoInputAxisKeyMapping\nUENUM()\nenum class ESoInputIntegrity : uint8\n{\n\tOk = 0,\n\n\t// The Default is not actually a default\n\tNotDefault,\n\n\t// Default.Name and Modified.Name mismatch\n\tNamesMismatch,\n\n\t// Default.Key and Modified.Key are not of the same type\n\tKeyCategoryMismatch\n};\n\n\n// Used internally only\nUENUM(BlueprintType)\nenum class ESoInputDeviceType : uint8\n{\n\tKeyboard = 0\t\t\tUMETA(DisplayName = \"Keyboard\"),\n\tGamepad_Generic\t\t\tUMETA(DisplayName = \"Gamepad Generic\"),\n\tGamepad_Xbox\t\t\tUMETA(DisplayName = \"Xbox\"),\n\tGamepad_PlayStation\t\tUMETA(DisplayName = \"PlayStation\"),\n\tGamepad_Switch\t\t\tUMETA(DisplayName = \"Nintendo Switch\"),\n\n\tNum\t\t\t\t\t\tUMETA(Hidden)\n};\n\n\nUSTRUCT(BlueprintType)\nstruct SORB_API FSoInputActionKeyMapping\n{\n\tGENERATED_USTRUCT_BODY()\npublic:\n\t// The original key mapping, must keep track so that we know what exactly we modified, gamepad, keyboard or\n\t// if we just overwrote just one shortcut for an action name, etc.\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = \"Input\")\n\tFInputActionKeyMapping Default;\n\n\t// Our own version, modified\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = \"Input\")\n\tFInputActionKeyMapping Modified;\n\npublic:\n\tFName GetActionName() const { return Default.ActionName; }\n\tbool IsUnbinding() const { return !Modified.Key.IsValid(); }\n\tbool IsKeyboard() const;\n\tbool IsGamepad() const;\n\n\tbool operator==(const FSoInputActionKeyMapping& Other) const;\n\tbool operator<(const FSoInputActionKeyMapping& Other) const;\n\tFString ToString() const;\n\tESoInputIntegrity ValidateIntegrity() const;\n};\n\nFORCEINLINE uint32 GetTypeHash(const FInputActionKeyMapping& Key)\n{\n\tuint32 Hash = HashCombine(GetTypeHash(Key.ActionName), GetTypeHash(Key.Key));\n\tHash = HashCombine(Hash, GetTypeHash(Key.bAlt + Key.bCmd + Key.bShift + Key.bCtrl));\n\treturn Hash;\n}\n\n\nUSTRUCT(BlueprintType)\nstruct SORB_API FSoInputAxisKeyMapping\n{\n\tGENERATED_USTRUCT_BODY()\npublic:\n\t// The original axis mapping\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = \"Input\")\n\tFInputAxisKeyMapping Default;\n\n\t// Our own version, modified\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = \"Input\")\n\tFInputAxisKeyMapping Modified;\n\npublic:\n\tbool IsKeyboard() const;\n\tbool IsGamepad() const;\n\n\tbool operator==(const FSoInputAxisKeyMapping& Other) const;\n\tbool operator<(const FSoInputAxisKeyMapping& Other) const;\n\tFString ToString() const;\n\tESoInputIntegrity ValidateIntegrity() const;\n};\n\nFORCEINLINE uint32 GetTypeHash(const FInputAxisKeyMapping& Key)\n{\n\t// NOTE we ignore scale\n\treturn HashCombine(GetTypeHash(Key.AxisName), GetTypeHash(Key.Key));\n}\n\n\n// Keeps all the textures for the key name / UI command\nUSTRUCT()\nstruct FSoInputUITextures\n{\n\tGENERATED_USTRUCT_BODY()\n\npublic:\n\tUTexture2D* GetTextureForDeviceType(const ESoInputDeviceType DeviceType) const;\n\npublic:\n\tUPROPERTY(EditAnywhere, Category = Input)\n\tUTexture2D* Keyboard = nullptr;\n\n\tUPROPERTY(EditAnywhere, Category = Input)\n\tUTexture2D* Xbox = nullptr;\n\n\tUPROPERTY(EditAnywhere, Category = Input)\n\tUTexture2D* PlayStation = nullptr;\n\n\tUPROPERTY(EditAnywhere, Category = Input)\n\tUTexture2D* Switch = nullptr;\n};\n\n\n// Defines the input key to display if for an ESoUICommmand\n// For example EUC_MainMenuEnter can have enter and space, but maybe we want the second one which is index 1\n// By default it uses the first index\nUSTRUCT(BlueprintType)\nstruct FSoInputUICommandPriorities\n{\n\tGENERATED_USTRUCT_BODY()\n\npublic:\n\tFORCEINLINE bool IsValidKeyboard() const { return KeyboardPriority > INDEX_NONE; }\n\tFORCEINLINE bool IsValidGamepad() const { return GamepadPriority > INDEX_NONE; }\n\npublic:\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere, Category = Input)\n\tint32 KeyboardPriority = 0;\n\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere, Category = Input)\n\tint32 GamepadPriority = 0;\n};\n\n\n// All the textures of a keyboard key\nUSTRUCT(BlueprintType)\nstruct FSoInputKeyboardKeyTextures\n{\n\tGENERATED_USTRUCT_BODY()\npublic:\n\tUTexture2D* GetTexture(bool bPressed = true) const;\n\npublic:\n\t// Default state\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere, Category = Input)\n\tUTexture2D* Pressed = nullptr;\n\n\t// Only in some case used\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere, Category = Input)\n\tUTexture2D* Unpressed = nullptr;\n};\n\n\n// All the textures of a gamepad key\nUSTRUCT(BlueprintType)\nstruct FSoInputGamepadKeyTextures\n{\n\tGENERATED_USTRUCT_BODY()\npublic:\n\tUTexture2D* GetTextureForDeviceType(const ESoInputDeviceType DeviceType) const;\n\n\tFORCEINLINE bool IsValid() const\n\t{\n\t\treturn Xbox != nullptr && PlayStation != nullptr && Switch != nullptr;\n\t}\n\npublic:\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere, Category = Input)\n\tUTexture2D* Xbox = nullptr;\n\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere, Category = Input)\n\tUTexture2D* PlayStation = nullptr;\n\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere, Category = Input)\n\tUTexture2D* Switch = nullptr;\n};\n"
  },
  {
    "path": "Source/SOrb/Settings/SoAudioSettingsTypes.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#pragma once\n\n#include \"CoreMinimal.h\"\n\n#include \"SoAudioSettingsTypes.generated.h\"\n\nclass UFMODEvent;\n\nUENUM(BlueprintType)\nenum class ESoSFX : uint8\n{\n\tNone = 0,\n\n\tSettingsLineSwitch,\n\tSettingsValueSwitch,\n\tSettingsApply,\n\tSettingsRestore,\n\tSettingsPressed,\n\tSettingsClose,\n\n\tMenuButtonSwitch,\n\tMenuButtonPressed,\n\tMenuReturnToRoot\n};\n\n// All the voice entries\nUSTRUCT(BlueprintType)\nstruct FSoVoiceEntry\n{\n\tGENERATED_USTRUCT_BODY()\n\npublic:\n\tUPROPERTY(BlueprintReadWrite, Config, EditAnywhere, Category = Voice, meta = (DisplayName = \"Event\"))\n\tTSoftObjectPtr<UFMODEvent> EventPtr;\n\n\tUPROPERTY(BlueprintReadWrite, Config, EditAnywhere, Category = Voice)\n\tFText Text;\n};\n\n// All the voice entries\nUSTRUCT(BlueprintType)\nstruct FSoVoiceEntryRandomText\n{\n\tGENERATED_USTRUCT_BODY()\n\npublic:\n\tUPROPERTY(BlueprintReadWrite, Config, EditAnywhere, Category = Voice, meta = (DisplayName = \"Event\"))\n\tTSoftObjectPtr<UFMODEvent> EventPtr;\n\n\tUPROPERTY(BlueprintReadWrite, Config, EditAnywhere, Category = Voice)\n\tTArray<FText> Texts;\n};\n\n\n// The default values here represent the default audio settings for the game\n// As defined by the CPP\nUSTRUCT()\nstruct SORB_API FSoAudioSettings\n{\n\tGENERATED_USTRUCT_BODY()\n\ttypedef FSoAudioSettings Self;\n\npublic:\n\tFSoAudioSettings() {}\n\tFSoAudioSettings(bool InMuteAudio, bool bInMuteAudioWhenUnfocused, bool bInMuteVoiceGibberish, bool bInMuteDialogueVoiceGibberish,\n\t\tfloat InVolumeMaster, float InVolumeMusic, float InVolumeSFX) :\n\t\tbMuteAudio(InMuteAudio), bMuteAudioWhenUnfocused(bInMuteAudioWhenUnfocused), bMuteVoiceGibberish(bInMuteVoiceGibberish),\n\t\tbMuteDialogueVoiceGibberish(bInMuteDialogueVoiceGibberish),\n\t\tVolumeMaster(InVolumeMaster), VolumeMusic(InVolumeMusic),  VolumeSFX(InVolumeSFX)\n\t{\n\n\t}\n\n\tbool operator==(const Self& Other) const\n\t{\n\t\treturn Other.bMuteAudio == bMuteAudio &&\n\t\t\tOther.bMuteAudioWhenUnfocused == bMuteAudioWhenUnfocused &&\n\t\t\tOther.bMuteVoiceGibberish == bMuteVoiceGibberish &&\n\t\t\tOther.bMuteDialogueVoiceGibberish == bMuteDialogueVoiceGibberish &&\n\t\t\tFMath::IsNearlyEqual(VolumeMaster, Other.VolumeMaster, KINDA_SMALL_NUMBER) &&\n\t\t\tFMath::IsNearlyEqual(VolumeMusic, Other.VolumeMusic, KINDA_SMALL_NUMBER) &&\n\t\t\tFMath::IsNearlyEqual(VolumeSFX, Other.VolumeSFX, KINDA_SMALL_NUMBER);\n\t}\n\npublic:\n\tUPROPERTY()\n\tbool bMuteAudio = false;\n\n\tUPROPERTY()\n\tbool bMuteAudioWhenUnfocused = true;\n\n\tUPROPERTY()\n\tbool bMuteVoiceGibberish = false;;\n\n\tUPROPERTY()\n\tbool bMuteDialogueVoiceGibberish = false;;\n\n\tUPROPERTY()\n\tfloat VolumeMaster = 1.f;\n\n\tUPROPERTY()\n\tfloat VolumeMusic = 1.f;\n\n\tUPROPERTY()\n\tfloat VolumeSFX = 1.f;\n};\n"
  },
  {
    "path": "Source/SOrb/Settings/SoDisplaySettingsTypes.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#pragma once\n\n#include \"CoreMinimal.h\"\n\n#include \"SoDisplaySettingsTypes.generated.h\"\n\n\n// All the aspect options supported\nUENUM(BlueprintType)\nenum class ESoDisplayAspectRatio : uint8\n{\n\t// Unknown or not supported\n\tUnknown = 0,\n\n\tRatio_4_3,\n\tRatio_16_9,\n\tRatio_16_10,\n};\n\n\n/**\n * Struct to also handle the actual resolution Width/Height as an int\n * Also has comparison functions + aspect ratio\n */\nUSTRUCT(BlueprintType)\nstruct SORB_API FSoDisplayResolution\n{\n\tGENERATED_USTRUCT_BODY()\nprivate:\n\ttypedef FSoDisplayResolution Self;\n\npublic:\n\tFSoDisplayResolution() : Resolution(FIntPoint::NoneValue) {}\n\n\t// Performs sanity checks\n\tFSoDisplayResolution(uint32 InWidth, uint32 InHeight, ESoDisplayAspectRatio InAspectRatio) :\n\t\tResolution(InWidth, InHeight), AspectRatio(InAspectRatio)\n\t{\n\t\t// Sanity check if aspect ratios match\n#if DO_CHECK\n\t\tconst float Ratio_Input = GetAspectRatioFloat();\n\t\tswitch (AspectRatio)\n\t\t{\n\t\t\tcase ESoDisplayAspectRatio::Ratio_4_3:\n\t\t\t\tcheckf(AreAspectRatiosEqual(Ratio_Input, Ratio_4_3),\n\t\t\t\t\tTEXT(\"Resolution Input is not aspect ratio 4:3. Width = %d, Height = %d\"), Resolution.X, Resolution.Y);\n\t\t\t\tbreak;\n\t\t\tcase ESoDisplayAspectRatio::Ratio_16_9:\n\t\t\t\tcheckf(AreAspectRatiosEqual(Ratio_Input, Ratio_16_9),\n\t\t\t\t\tTEXT(\"Resolution Input is not aspect ratio 16:9. Width = %d, Height = %d\"), Resolution.X, Resolution.Y);\n\t\t\t\tbreak;\n\t\t\tcase ESoDisplayAspectRatio::Ratio_16_10:\n\t\t\t\tcheckf(AreAspectRatiosEqual(Ratio_Input, Ratio_16_10),\n\t\t\t\t\tTEXT(\"Resolution Input is not aspect ratio 16:10. Width = %d, Height = %d\"), Resolution.X, Resolution.Y);\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\t// Unknown :(\n\t\t\t\tbreak;\n\t\t}\n#endif // DO_CHECK\n\t}\n\n\t// Automatically set AspectRatio enum\n\tFSoDisplayResolution(uint32 InWidth, uint32 InHeight) : Resolution(InWidth, InHeight)\n\t{\n\t\tconst float Ratio_Input = GetAspectRatioFloat();\n\t\tif (AreAspectRatiosEqual(Ratio_Input, Ratio_4_3))\n\t\t\tAspectRatio = ESoDisplayAspectRatio::Ratio_4_3;\n\t\telse if (AreAspectRatiosEqual(Ratio_Input, Ratio_16_9))\n\t\t\tAspectRatio = ESoDisplayAspectRatio::Ratio_16_9;\n\t\telse if (AreAspectRatiosEqual(Ratio_Input, Ratio_16_10))\n\t\t\tAspectRatio = ESoDisplayAspectRatio::Ratio_16_10;\n\t\telse\n\t\t\tAspectRatio = ESoDisplayAspectRatio::Unknown;\n\t}\n\tFSoDisplayResolution(const FIntPoint& Point) : FSoDisplayResolution(Point.X, Point.Y) {}\n\n\t// Are the two aspect rations equal, different variants\n\tstatic bool AreAspectRatiosEqual(const float A, const float B) { return FMath::IsNearlyEqual(A, B, ErrorTolerance); }\n\tstatic bool AreAspectRatiosEqual(const ESoDisplayAspectRatio Enum, const float AspectRatio) { return AreAspectRatiosEqual(AspectRatio, Enum); }\n\tstatic bool AreAspectRatiosEqual(const float AspectRatio, const ESoDisplayAspectRatio Enum)\n\t{\n\t\tswitch (Enum)\n\t\t{\n\t\t\tcase ESoDisplayAspectRatio::Ratio_4_3:\n\t\t\t\treturn AreAspectRatiosEqual(AspectRatio, Ratio_4_3);\n\t\t\tcase ESoDisplayAspectRatio::Ratio_16_9:\n\t\t\t\treturn AreAspectRatiosEqual(AspectRatio, Ratio_16_9);\n\t\t\tcase ESoDisplayAspectRatio::Ratio_16_10:\n\t\t\t\treturn AreAspectRatiosEqual(AspectRatio, Ratio_16_10);\n\t\t\tdefault:\n\t\t\t\treturn false;\n\t\t}\n\t}\n\n\t// Sort Predicate for ascending resolutions\n\tbool operator==(const Self& Other) const { return Resolution == Other.Resolution; }\n\tbool operator<(const Self& Other) const  { return Resolution.X < Other.Resolution.X && Resolution.Y < Other.Resolution.Y; }\n\tbool operator<=(const Self& Other) const { return Resolution.X <= Other.Resolution.X && Resolution.Y <= Other.Resolution.Y; }\n\tbool operator>(const Self& Other) const  { return Resolution.X > Other.Resolution.X && Resolution.Y > Other.Resolution.Y; }\n\tbool operator>=(const Self& Other) const { return Resolution.X >= Other.Resolution.X && Resolution.Y >= Other.Resolution.Y; }\n\n\t// Gets the aspect ratio as a float\n\tconstexpr float GetAspectRatioFloat() const { return static_cast<float>(Resolution.X) / static_cast<float>(Resolution.Y); }\n\n\t// TMap key hash\n\tfriend uint32 GetTypeHash(const FSoDisplayResolution& This)\n\t{\n\t\treturn GetTypeHash(This.Resolution);\n\t}\n\npublic:\n\t// X - Width, Y - Height\n\tUPROPERTY(BlueprintReadOnly)\n\tFIntPoint Resolution;\n\n\t// Not needed, this is just cached\n\tUPROPERTY(BlueprintReadOnly)\n\tESoDisplayAspectRatio AspectRatio = ESoDisplayAspectRatio::Unknown;\n\nprivate:\n\tstatic constexpr float Ratio_4_3 = 4.f / 3.f;\n\tstatic constexpr float Ratio_16_9 = 16.f / 9.f;\n\tstatic constexpr float Ratio_16_10 = 16.f / 10.f;\n\tstatic constexpr float ErrorTolerance = 1.e-2f; // only the first two decimals must match\n};\n"
  },
  {
    "path": "Source/SOrb/Settings/SoGameSettings.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#include \"SoGameSettings.h\"\n\n#include \"EngineUtils.h\"\n#include \"Kismet/KismetSystemLibrary.h\"\n#include \"GameFramework/InputSettings.h\"\n#include \"GameFramework/GameModeBase.h\"\n#include \"Widgets/SWindow.h\"\n#include \"Engine/Engine.h\"\n#include \"Misc/ConfigCacheIni.h\"\n#include \"UnrealEngine.h\"\n\n#include \"Basic/SoGameInstance.h\"\n#include \"Basic/Helpers/SoPlatformHelper.h\"\n#include \"Character/SoPlayerController.h\"\n#include \"UI/SoUIHelper.h\"\n#include \"Basic/SoGameMode.h\"\n#include \"Input/SoInputHelper.h\"\n#include \"Input/SoInputNames.h\"\n#include \"Input/SoInputSettings.h\"\n#include \"SoAudioSettingsTypes.h\"\n#include \"Basic/SoAudioManager.h\"\n#include \"Basic/SoGameSingleton.h\"\n\n#include \"NYLoadingScreenSettings.h\"\n\nDEFINE_LOG_CATEGORY_STATIC(LogSoGameSettings, All, All);\n\n// Manually set Value was UE_GAMEUSERSETTINGS_VERSION = 5. Double it just in case of future updates\n// NOTE: if the Config/DefaultGameUserSettings.ini contains the \"Version\" value you also must update it there\nstatic constexpr int32 SO_GAMEUSERSETTINGS_VERSION = 13;\n\n// Stupid compiler, bad compiler :|\nconstexpr float USoGameSettings::MaxScreenPercentage;\nconstexpr float USoGameSettings::MinScreenPercentage;\nconstexpr float USoGameSettings::MinBrightness;\nconstexpr float USoGameSettings::MaxBrightness;\nconstexpr float USoGameSettings::DefaultBrightness;\nconstexpr float USoGameSettings::MinVibrationScale;\nconstexpr float USoGameSettings::MaxVibrationScale;\nconstexpr float USoGameSettings::DefaultVibrationScale;\nconstexpr float USoGameSettings::DefaultGameSpeed;\n\nconst TArray<FInputActionKeyMapping> USoGameSettings::EmptyInputActionKeysArray;\nconst TArray<FInputAxisKeyMapping> USoGameSettings::EmptyInputAxisKeysArray;\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUSoGameSettings::USoGameSettings()\n{\n\tResetVariablesToDefault();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUSoGameSettings::~USoGameSettings()\n{\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoGameSettings::SetToDefaults()\n{\n\tSetDisplaySettingsToDefault();\n\tSetAudioSettingsToDefault();\n\tSetGameSettingsToDefault();\n\tSetInputSettingsToDefault();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoGameSettings::ResetVariablesToDefault()\n{\n\tResetDisplaySettingsVariables();\n\tResetAudioSettingsVariables();\n\tResetGameSettingsVariables();\n\tResetInputSettingsVariables();\n\tWorldContextObject = nullptr;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoGameSettings::SetCacheSaveRequestsMode(bool bActive)\n{\n\tbCacheSaveRequests = bActive;\n\tif (!bActive && bAnySaveRequestCached)\n\t\tSaveSettings();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoGameSettings::ResetToCurrentSettings()\n{\n\tResetToCurrentDisplaySettings();\n\tResetToCurrentAudioSettings();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoGameSettings::ApplySettings(bool bCheckForCommandLineOverrides)\n{\n\tValidateSettings();\n\tApplyDisplaySettings(bCheckForCommandLineOverrides, false);\n\tApplyAudioSettings(bCheckForCommandLineOverrides, false);\n\tApplyGameSettings(bCheckForCommandLineOverrides, false);\n\tApplyInputSettings(false);\n\tSaveSettings();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoGameSettings::LoadSettings(bool bForceReload)\n{\n\tSuper::LoadSettings(bForceReload);\n\tRefreshInputSettingsMappings();\n\n\tconst UNYLoadingScreenSettings* LoadingScreenSettings = GetDefault<UNYLoadingScreenSettings>();\n\n\t// Custom event period\n\tif (LoadingScreenSettings->IsHalloweenEventPeriod())\n\t{\n\t\t// Set the new char skin for this event, and save the previous one\n\t\tif (!LoadingScreenSettings->IsDateTimeInHalloweenEventPeriod(ModifiedDateTimePreviousCharacterSkinType))\n\t\t{\n\t\t\tModifiedDateTimePreviousCharacterSkinType = FDateTime::Now();\n\t\t\tPreviousCharacterSkinType = CharacterSkinType;\n\t\t\tCharacterSkinType = ESoCharacterSkinType::Pumpkin;\n\t\t}\n\t}\n\n\t// Restore the previous Char skin\n\telse if (LoadingScreenSettings->IsDateTimeInHalloweenEventPeriod(ModifiedDateTimePreviousCharacterSkinType))\n\t{\n\t\t// Restore to the previous one\n\t\tModifiedDateTimePreviousCharacterSkinType = FDateTime::MinValue();\n\t\tCharacterSkinType = PreviousCharacterSkinType;\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoGameSettings::SaveSettings()\n{\n\tif (bBlockConfigSave)\n\t\treturn;\n\n\tif (bCacheSaveRequests)\n\t{\n\t\tbAnySaveRequestCached = true;\n\t\treturn;\n\t}\n\n\t// Always be in the same order\n\tModifiedInputActionMappings.Sort();\n\tModifiedInputAxisMappings.Sort();\n\tSuper::SaveSettings();\n\tbAnySaveRequestCached = false;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoGameSettings::ValidateSettings()\n{\n\t// Reset game speed to normal\n\tif (GameSpeedVersion < FSoGameSpeedVersion::Initial)\n\t{\n\t\tGameSpeed = 1.f;\n\t\tSaveSettings();\n\t}\n\n\tValidateDisplaySettings();\n\tValidateGameSettings();\n\tValidateAudioSettings();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// Game settings\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUSoGameSettings* USoGameSettings::GetInstance()\n{\n\treturn GEngine ? CastChecked<USoGameSettings>(GEngine->GetGameUserSettings()) : nullptr;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoGameSettings::BeforeGameModeStartPlay()\n{\n\t// Reset for PIE mode\n\tSetToDefaults();\n\n\tLoadSettings(true);\n\n\t// First time starting?\n#if WITH_EDITOR\n\tconst bool bLocalFirstTimeGameStarted = false;\n#else\n\tconst bool bLocalFirstTimeGameStarted = IsFirstTimeGameStarted();\n#endif // WITH_EDITOR\n\n\t// First time running the game\n\tif (bLocalFirstTimeGameStarted)\n\t{\n\t\t// Set resolution to primary display resolution\n\t\tif (IsWindowModeFullScreen())\n\t\t{\n\t\t\tSetScreenResolutionToPrimaryDisplayResolution();\n\t\t\tApplySettings(true);\n\t\t}\n\n\t\t// Run benchmarks only if the user didn't stop us from doing it\n\t\tconst bool bNoHardwareBenchmark = FParse::Param(FCommandLine::Get(), TEXT(\"NoHardwareBenchmark\"));\n\t\tif (!bNoHardwareBenchmark)\n\t\t{\n\t\t\tbShouldDoHardwareBenchmark = true;\n\t\t}\n\t}\n\n\t// Set keyboard preset the first time\n\tif (!bKeyboardPresetAlreadySelected)\n\t{\n\t\tif (WARRIORB_USE_ARROW_PRESET_AS_DEFAULT)\n\t\t{\n\t\t\tSetInputToPresetKeyboardArrows();\n\t\t}\n\t\telse\n\t\t{\n\t\t\tSetKeyboardInputBindingsToDefault();\n\t\t}\n\n\t\tbKeyboardPresetAlreadySelected = true;\n\t}\n\n\t// We set the game as started from now on\n\tbIsFirstTimeGameStarted = false;\n\n\t// Force fullscreen\n\tif (USoPlatformHelper::IsSteamBigPicture())\n\t{\n\t\tUE_LOG(LogSoGameSettings, Log, TEXT(\"BeforeGameModeStartPlay: User is in Steam Big Picture, Forcing fullscreen!\"));\n\t\tSetFullscreenMode(EWindowMode::WindowedFullscreen);\n\t\tConfirmVideoMode();\n\t}\n\n\tApplySettings(true);\n\tPrintToLog();\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoGameSettings::PrintToLog() const\n{\n\tFDisplayMetrics DisplayMetrics;\n\tif (USoPlatformHelper::GetDisplaysMetrics(DisplayMetrics))\n\t\tDisplayMetrics.PrintToLog();\n\n\tUE_LOG(LogSoGameSettings, Log, TEXT(\"DefaultGameUserSettingsIni: %s\"), *GetDefaultConfigFilename());\n\tUE_LOG(LogSoGameSettings, Log, TEXT(\"GameUserSettingsIni: %s\"), *GGameUserSettingsIni);\n\tUE_LOG(LogSoGameSettings, Log, LINE_TERMINATOR TEXT(\"%s\") LINE_TERMINATOR, *ToString());\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoGameSettings::ApplyGameSettings(bool bCheckForCommandLineOverrides, bool bSaveSettings)\n{\n\tif (bCheckForCommandLineOverrides)\n\t{\n\t\tif (FParse::Param(FCommandLine::Get(), TEXT(\"CollectGameAnalytics\")))\n\t\t{\n\t\t\tbCollectGameAnalytics = true;\n\t\t}\n\t\telse if (FParse::Param(FCommandLine::Get(), TEXT(\"NoCollectGameAnalytics\")))\n\t\t{\n\t\t\tbCollectGameAnalytics = false;\n\t\t}\n\n\t\tif (FParse::Param(FCommandLine::Get(), TEXT(\"WaitForAnalyticsToSend\")))\n\t\t{\n\t\t\tbWaitForAnalyticsToSend = true;\n\t\t}\n\t\telse if (FParse::Param(FCommandLine::Get(), TEXT(\"NoWaitForAnalyticsToSend\")))\n\t\t{\n\t\t\tbWaitForAnalyticsToSend = false;\n\t\t}\n\n\t\tif (FParse::Param(FCommandLine::Get(), TEXT(\"PauseGameWhenUnfocused\")))\n\t\t{\n\t\t\tbPauseGameWhenUnfocused = true;\n\t\t}\n\t\telse if (FParse::Param(FCommandLine::Get(), TEXT(\"NoPauseGameWhenUnfocused\")))\n\t\t{\n\t\t\tbPauseGameWhenUnfocused = false;\n\t\t}\n\t}\n\n\tif (GEngine && GEngine->IsInitialized())\n\t{\n\t\t// Game Speed\n\t\tUSoPlatformHelper::SetGlobalTimeDilation(WorldContextObject, GameSpeed);\n\n\t\t// Brightness\n\t\tUSoPlatformHelper::SetDisplayGamma(Brightness);\n\n\t\t// Vibration\n\t\tUSoPlatformHelper::SetForceFeedbackScale(WorldContextObject, VibrationScale);\n\t}\n\n\tif (bSaveSettings)\n\t\tSaveSettings();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoGameSettings::OnLanguageSelected()\n{\n\tbLanguageAlreadySelected = true;\n\tSaveSettings();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoGameSettings::SetGameSettingsToDefault()\n{\n\tResetGameSettingsVariables();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoGameSettings::ResetGameSettingsVariables()\n{\n\t// language\n\tbLanguageAlreadySelected = false;\n\n\t// Video Demo\n\tbVideoDemoDisableMainMenu = false;\n\tbVideoDemoStartVideoOnIdle = false;\n\tVideoDemoIdleTimeSecondsStartVideo = 30.f;\n\n\tbDisplayFPS = false;\n\tbDisplayTime = false;\n\tbDisplayDamageTexts = true;\n\tbDisplayEnemyHealthBar = true;\n\tbDisplayFloatingVOLines = true;\n\tbDisplayStat = false;\n\tbPauseGameWhenUnfocused = true;\n\tIdleTimeSecondsBeforeGamePause = 120.f;\n\tbPauseGameOnIdle = true;\n\tbIsFirstTimeGameStarted = true;\n\tBounceModeType = ESoBounceModeType::Always;\n\tCharacterSkinType = ESoCharacterSkinType::Classic;\n\tModifiedDateTimeCharacterSkinType = FDateTime::MinValue();\n\tModifiedDateTimePreviousCharacterSkinType = FDateTime::MinValue();\n\n\t// Analytics\n\tbCollectGameAnalytics = false;\n\tbWaitForAnalyticsToSend = true;\n\tUnixTimeModifiedCollectGameAnalytics = INDEX_NONE;\n\tAnalyticsWaitSeconds = 0.5;\n\tAnalyticsProcessEventsSeconds = 2.0;\n\n\t// Saves\n\tbAutoSaveAndLoad = true;\n\tbAutoBackupDeletedSaves = true;\n\tbAutoBackupBeforeSave = true;\n\n\t// Configurable custom maps\n\tbCustomMapsEnabled = true;\n\n\tGameSpeed = DefaultGameSpeed;\n\tBrightness = DefaultBrightness;\n\tVibrationScale = DefaultVibrationScale;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoGameSettings::ValidateGameSettings()\n{\n\tif (UnixTimeModifiedCollectGameAnalytics < INDEX_NONE)\n\t\tUnixTimeModifiedCollectGameAnalytics = 0;\n\n\tif (AnalyticsWaitSeconds < KINDA_SMALL_NUMBER)\n\t\tAnalyticsWaitSeconds = 0.5;\n\n\tif (AnalyticsProcessEventsSeconds < KINDA_SMALL_NUMBER)\n\t\tAnalyticsProcessEventsSeconds = 2.0;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoGameSettings::SetTemporaryGameSpeed(float NewGameSpeed)\n{\n\tUSoPlatformHelper::SetGlobalTimeDilation(WorldContextObject, FMath::Abs(NewGameSpeed));\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoGameSettings::IsTemporaryGameSpeedChanged() const\n{\n\treturn !FMath::IsNearlyEqual(GameSpeed, GetTemporaryGameSpeed());\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nfloat USoGameSettings::GetTemporaryGameSpeed() const\n{\n\treturn USoPlatformHelper::GetGlobalTimeDilation(WorldContextObject);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// Display settings\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoGameSettings::MoveToMonitor(int32 MonitorNumber, FMonitorInfo& OutMonitor)\n{\n\t// On Consoles this is useless\n#if !PLATFORM_DESKTOP\n\treturn false;\n#endif\n\n\t// References (they seem wrong as they do not take in account different screen sizes or different platforms):\n\t// - https://answers.unrealengine.com/questions/294650/is-it-possible-to-choose-the-default-screen-in-a-m.html\n\t// - http://www.froyok.fr/blog/2018-01-ue4-specify-default-monitor-at-launch\n\n\tif (MonitorNumber < 0)\n\t{\n\t\tUE_LOG(LogSoGameSettings, Error, TEXT(\"MoveToMonitor: MonitorNumber < 0\"));\n\t\treturn false;\n\t}\n\n\tif (GEngine == nullptr)\n\t{\n\t\tUE_LOG(LogSoGameSettings, Error, TEXT(\"MoveToMonitor: GEngine == nullptr\"));\n\t\treturn false;\n\t}\n\tif (GEngine->GameViewport == nullptr)\n\t{\n\t\tUE_LOG(LogSoGameSettings, Error, TEXT(\"MoveToMonitor: GEngine->GameViewport == nullptr\"));\n\t\treturn false;\n\t}\n\tif (!GEngine->GameViewport->GetWindow().IsValid())\n\t{\n\t\tUE_LOG(LogSoGameSettings, Error, TEXT(\"MoveToMonitor: !GEngine->GameViewport->GetWindow().IsValid()\"));\n\t\treturn false;\n\t}\n\n\tFDisplayMetrics DisplayMetrics;\n\tif (!USoPlatformHelper::GetDisplaysMetrics(DisplayMetrics))\n\t{\n\t\tUE_LOG(LogSoGameSettings, Error, TEXT(\"MoveToMonitor: Can't get FDisplayMetrics\"));\n\t\treturn false;\n\t}\n\n\tint32 MonitorIndex = INDEX_NONE;\n\tif (MonitorNumber == 0)\n\t{\n\t\t// Start monitor on the main screen\n\t\tfor (int32 Index = 0; Index < DisplayMetrics.MonitorInfo.Num(); Index++)\n\t\t{\n\t\t\tif (DisplayMetrics.MonitorInfo[Index].bIsPrimary)\n\t\t\t{\n\t\t\t\tMonitorIndex = Index;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\telse\n\t{\n\t\t// Normalize\n\t\tMonitorIndex = MonitorNumber - 1;\n\t}\n\n\tif (!DisplayMetrics.MonitorInfo.IsValidIndex(MonitorIndex))\n\t{\n\t\tUE_LOG(LogSoGameSettings, Error, TEXT(\"MoveToMonitor: MonitorIndex is not a valid index in DisplayMetrics of Num = %d\"), DisplayMetrics.MonitorInfo.Num());\n\t\treturn false;\n\t}\n\n\t// NOTE: WindowPosX and WindowPosY are used only if Game is ran with -SAVEWINPOS=1\n\t// Offset to the new monitor\n\t// NOTE: on windows this seems to be the right order but on linux it is not :|\n\t//WindowPosX = (MonitorIndex * DisplayMetrics.PrimaryDisplayWidth) - CurrentMonitorWidth;\n\t//WindowPosX = DisplayMetrics.PrimaryDisplayWorkAreaRect.Left;\n\t//WindowPosY = DisplayMetrics.PrimaryDisplayWorkAreaRect.Top;\n\t//const int32 CurrentMonitorWidth = DisplayMetrics.MonitorInfo[MonitorIndex].NativeWidth;\n\n\t// Figure out where to move, previous method by offsetting was inaccurate\n\tconst FMonitorInfo Monitor = DisplayMetrics.MonitorInfo[MonitorIndex];\n\tWindowPosX = Monitor.WorkArea.Left;\n\tWindowPosY = Monitor.WorkArea.Top;\n\n\t// Screen we are moving to has a smaller resolution than our current one\n\tif (static_cast<int32>(ResolutionSizeX) > Monitor.NativeWidth || static_cast<int32>(ResolutionSizeY) > Monitor.NativeHeight)\n\t{\n\t\tUE_LOG(\n\t\t\tLogSoGameSettings,\n\t\t\tLog,\n\t\t\tTEXT(\"MoveToMonitor: Changing Resolution of game because current resolution is larger than the monitor resolution. CurrentResolution = (%d, %d), MonitorResolution = (%d, %d)\"),\n\t\t\tResolutionSizeX, ResolutionSizeY, Monitor.NativeWidth,Monitor.NativeHeight\n\t\t);\n\t\tSetScreenResolution(FIntPoint(Monitor.NativeWidth, Monitor.NativeHeight));\n\t\tConfirmVideoMode();\n\t\tApplyDisplaySettings(false);\n\t}\n\n\t// Move\n\tTSharedPtr<SWindow> Window = GEngine->GameViewport->GetWindow();\n\tconst FVector2D Position(static_cast<float>(WindowPosX), static_cast<float>(WindowPosY));\n\n\t// Huge hack, because linux does not seem to work properly if it is not windowed mode\n#if PLATFORM_LINUX\n\tconst EWindowMode::Type CurrentWindowMode = Window->GetWindowMode();\n\tWindow->SetWindowMode(EWindowMode::Windowed);\n#endif\n\n\t// Move\n\tWindow->MoveWindowTo(Position);\n\n#if PLATFORM_LINUX\n\t// Set back to original\n\tWindow->SetWindowMode(CurrentWindowMode);\n#endif\n\n\tconst FVector2D InitialDesiredScreenPosition = Window->GetInitialDesiredPositionInScreen();\n\tUE_LOG(\n\t\tLogSoGameSettings,\n\t\tLog,\n\t\tTEXT(\"MoveToMonitor: MonitorIndex = %d, DisplayMetrics.PrimaryDisplayWidth = %d, WindowPos = (%d, %d), InitialDesiredScreenPosition = %s\"),\n\t\tMonitorIndex, DisplayMetrics.PrimaryDisplayWidth, WindowPosX, WindowPosY, *InitialDesiredScreenPosition.ToString()\n\t);\n\n\tOutMonitor = DisplayMetrics.MonitorInfo[MonitorIndex];\n\treturn true;\n}\n\nvoid USoGameSettings::ResetToCurrentDisplaySettings()\n{\n\t// Super class is only Display settings related\n\tSuper::ResetToCurrentSettings();\n\tif (GEngine)\n\t{\n\t\t// From `t.MaxFPS` console variable.\n\t\tFrameRateLimit = GEngine->GetMaxFPS();\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoGameSettings::ApplyDisplaySettings(bool bCheckForCommandLineOverrides, bool bSaveSettings)\n{\n\tEnsureCustomQualityLimits();\n\tApplyResolutionSettings(bCheckForCommandLineOverrides);\n\tApplyNonResolutionSettings();\n\n\tif (bSaveSettings)\n\t\tSaveSettings();\n}\n\nvoid USoGameSettings::ConfirmPreviewVideoModeSettings()\n{\n\tbIsPreviewVideoMode = false;\n\tConfirmVideoMode();\n}\n\nvoid USoGameSettings::RevertPreviewVideoModeSettings()\n{\n\tif (bIsPreviewVideoMode)\n\t{\n\t\tLastUserConfirmedResolutionSizeX = BeforePreviewResolutionSizeX;\n\t\tLastUserConfirmedResolutionSizeY = BeforePreviewResolutionSizeY;\n\t\tLastConfirmedFullscreenMode = BeforePreviewFullscreenMode;\n\t}\n\n\tbIsPreviewVideoMode = false;\n\tRevertVideoMode();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoGameSettings::ConfirmVideoMode()\n{\n\tSuper::ConfirmVideoMode();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoGameSettings::PreviewVideoModeSettings()\n{\n\tBeforePreviewResolutionSizeX = LastUserConfirmedResolutionSizeX;\n\tBeforePreviewResolutionSizeY = LastUserConfirmedResolutionSizeY;\n\tBeforePreviewFullscreenMode = LastConfirmedFullscreenMode;\n\tbIsPreviewVideoMode = true;\n\n\t// NOTE: This calls ConfirmVideoMode in a callback in the engine so we can't used LastConfirmed variables after this call\n\tFSystemResolution::RequestResolutionChange(ResolutionSizeX, ResolutionSizeY, GetFullscreenMode());\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoGameSettings::SetDisplaySettingsToDefault()\n{\n\t// Super class is only Display settings related\n\tSuper::SetToDefaults();\n\n\tResetDisplaySettingsVariables();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoGameSettings::ResetDisplaySettingsVariables()\n{\n\t// On Main Display\n\tWindowPosX = 0;\n\tWindowPosX = 0;\n\tbVolumetricFog = false;\n\tbForceWeakHardwareOptimizations = false;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoGameSettings::ValidateDisplaySettings()\n{\n\t// Super class is only Display settings related\n\tSuper::ValidateSettings();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoGameSettings::SetScreenResolutionToPrimaryDisplayResolution()\n{\n\tconst FIntPoint& DesktopResolution = GetDesktopResolution();\n\tUE_LOG(LogSoGameSettings, Log, TEXT(\"Setting ScreenResolution to DesktopResolution = %d X %d\"), DesktopResolution.X, DesktopResolution.Y);\n\tSetScreenResolution(DesktopResolution);\n\tConfirmVideoMode();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoGameSettings::RunAndApplyHardwareBenchmarkIfRequested()\n{\n\tif (bShouldDoHardwareBenchmark)\n\t{\n\t\tRunAndApplyHardwareBenchmark();\n\t\tbShouldDoHardwareBenchmark = false;\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoGameSettings::RunAndApplyHardwareBenchmark()\n{\n\t// Skip hardware benchmark on non desktop platforms because it kills their hardware\n#if !PLATFORM_DESKTOP\n\tUE_LOG(LogSoGameSettings, Log, TEXT(\"RunAndApplyHardwareBenchmark disabled because we are not in a desktop platform\"));\n\treturn;\n#endif // !PLATFORM_DESKTOP\n\n\tUE_LOG(LogSoGameSettings, Log, TEXT(\"Autodetecting quality settings\"));\n\n\tstatic constexpr int32 WorkScale = 10;\n\tstatic constexpr float CPUMultiplier = 1.f;\n\tstatic constexpr float GPUMultiplier = 1.f;\n\n\t// From RunHardwareBenchmark\n\tScalabilityQuality = Scalability::BenchmarkQualityLevels(WorkScale, CPUMultiplier, GPUMultiplier);\n\n\t// 100 is average\n\t// < 100 - slower\n\t// > 100 - faster\n\tLastCPUBenchmarkResult = ScalabilityQuality.CPUBenchmarkResults;\n\tLastGPUBenchmarkResult = ScalabilityQuality.GPUBenchmarkResults;\n\n\tLastCPUBenchmarkSteps = ScalabilityQuality.CPUBenchmarkSteps;\n\tLastGPUBenchmarkSteps = ScalabilityQuality.GPUBenchmarkSteps;\n\tLastGPUBenchmarkMultiplier = GPUMultiplier;\n\n\t// Only if GPU result is over average (-20%)\n\t// This matches the ScalabilitySettings perf index threshold for the shadow quality\n\t// because low and medium shadow quality disables volumetric fog (r.VolumetricFog=0)\n\t// In the scalability settings the thershold for enabling volumetric fog is 42\n\tbVolumetricFog = FMath::Min(LastCPUBenchmarkResult, LastGPUBenchmarkResult) > 60.f;\n\n\t// Check our limits\n\tEnsureCustomQualityLimits();\n\n\t// Save\n\tApplyHardwareBenchmarkResults();\n\tApplySettings(true);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoGameSettings::GetScreenPercentageInformation(float& CurrentPercentNormalized, float& CurrentPercentValue,\n\tfloat& MinPercentValue, float& MaxPercentValue) const\n{\n\tCurrentPercentValue = GetScreenPercentage();\n\t// Minimum the same as the resolution quality as it is automatically calculated and it is something sane.\n\tMinPercentValue = MinScreenPercentage;\n\tMaxPercentValue = MaxScreenPercentage;\n\tCurrentPercentNormalized = (CurrentPercentValue - MinPercentValue) / (MaxPercentValue - MinPercentValue);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nfloat USoGameSettings::GetScreenPercentage() const\n{\n\tstatic const auto ScreenPercentage = IConsoleManager::Get().FindTConsoleVariableDataFloat(ScreenPercentageVariable);\n\treturn ScreenPercentage->GetValueOnGameThread();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoGameSettings::SetScreenPercentageValue(float NewScreenPercentageValue)\n{\n\tNewScreenPercentageValue = FMath::Clamp(NewScreenPercentageValue, MinScreenPercentage, MaxScreenPercentage);\n\n\t// Update ScreenPercentage (r.ScreenPercentage)\n\tstatic IConsoleVariable* ScreenPercentage = IConsoleManager::Get().FindConsoleVariable(ScreenPercentageVariable);\n\tScreenPercentage->Set(NewScreenPercentageValue, ECVF_SetByGameSetting);\n\n\t// Update ResolutionQuality (sg.ResolutionQuality)\n\tSetResolutionScaleValueEx(NewScreenPercentageValue);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoGameSettings::SetScreenPercentageNormalized(float NewScaleNormalized)\n{\n\tSetScreenPercentageValue(FMath::Lerp(MinScreenPercentage, MaxScreenPercentage, NewScaleNormalized));\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoGameSettings::IsVersionValid()\n{\n\treturn Version == SO_GAMEUSERSETTINGS_VERSION;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoGameSettings::UpdateVersion()\n{\n\tVersion = SO_GAMEUSERSETTINGS_VERSION;\n\tGameSpeedVersion = FSoGameSpeedVersion::LatestVersion;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// Audio settings\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoGameSettings::ResetToCurrentAudioSettings()\n{\n\tVolumeMaster = USoAudioManager::GetVolumeMaster();\n\tVolumeMusic = USoAudioManager::GetVolumeMusic();\n\tVolumeSFX = USoAudioManager::GetVolumeSFX();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoGameSettings::ApplyAudioSettings(bool bCheckForCommandLineOverrides, bool bSaveSettings)\n{\n\t// if (!GEngine->IsInitialized())\n\t// {\n\t\t// UE_LOG(LogSoGameSettings, Warning, TEXT(\"USoGameSettings:ApplyAudioSettings Engine is not initialized\"));\n\t\t// return;\n\t// }\n\n\tif (bMuteAudio)\n\t\tUSoAudioManager::MuteAudio();\n\telse\n\t\tUSoAudioManager::UnMuteAudio();\n\n\tUSoAudioManager::SetVolumeMaster(VolumeMaster);\n\tUSoAudioManager::SetVolumeMusic(VolumeMusic);\n\tUSoAudioManager::SetVolumeSFX(VolumeSFX);\n\n\tif (bSaveSettings)\n\t\tSaveSettings();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoGameSettings::AreDefaultAudioSettingsUsed() const\n{\n\t// Compare against default\n\tconst FSoAudioSettings& Default = GetDefaultAudioSettings();\n\tconst FSoAudioSettings Current{bMuteAudio, bMuteAudioWhenUnfocused, bMuteVoiceGibberish, bMuteDialogueVoiceGibberish, VolumeMaster, VolumeMusic, VolumeSFX};\n\n\treturn Default == Current;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoGameSettings::SetAudioSettingsToDefault()\n{\n\tResetAudioSettingsVariables();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoGameSettings::ResetAudioSettingsVariables()\n{\n\tconst FSoAudioSettings& Default = GetDefaultAudioSettings();\n\tbMuteAudio = Default.bMuteAudio;\n\tbMuteAudioWhenUnfocused = Default.bMuteAudioWhenUnfocused;\n\tbMuteVoiceGibberish = Default.bMuteVoiceGibberish;\n\tbMuteDialogueVoiceGibberish = Default.bMuteDialogueVoiceGibberish;\n\tVolumeMaster = Default.VolumeMaster;\n\tVolumeMusic = Default.VolumeMusic;\n\tVolumeSFX = Default.VolumeSFX;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoGameSettings::ValidateAudioSettings()\n{\n\tVolumeMaster = FMath::Clamp(VolumeMaster, 0.f, 1.f);\n\tVolumeMusic = FMath::Clamp(VolumeMusic, 0.f, 1.f);\n\tVolumeSFX = FMath::Clamp(VolumeSFX, 0.f, 1.f);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// Input settings\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoGameSettings::ApplyInputSettings(bool bSaveSettings, bool bForce)\n{\n\tRefreshInputSettingsMappings();\n\tRebuildInputKeymapsForAllPlayers();\n\n\tif (ASoPlayerController* Controller = ASoPlayerController::GetInstance(WorldContextObject))\n\t\tController->NotifyUserSettingsGamepadUITypeChanged(bForce);\n\n\tif (bSaveSettings)\n\t\tSaveSettings();\n\n\tUSoUIHelper::ForceReloadAllUICommandImages();\n\n\tOnInputSettingsApplied.Broadcast();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoGameSettings::SetInputSettingsToDefault()\n{\n\tResetInputSettingsVariables();\n\tSetInputBindingsToDefault();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoGameSettings::ResetInputSettingsVariables()\n{\n\tbAutoDetectGamepadUIType = false;\n\tbKeyboardPresetAlreadySelected = false;\n\tbUseKeyboardArrowPresetAsDefault = false;\n\tGamepadUIType = ESoGamepadLayoutType::Xbox;\n\tModifiedInputActionMappings.Empty();\n\tModifiedInputAxisMappings.Empty();\n\tInputActionMappings.Empty();\n\tInputAxisMappings.Empty();\n\tGamepadKeyToGameActionNameMap.Empty();\n\tGamepadKeyToUIActionNameMap.Empty();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoGameSettings::SetInputBindingsToDefault()\n{\n\tModifiedInputActionMappings.Empty();\n\tModifiedInputAxisMappings.Empty();\n\tRefreshInputSettingsMappings();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoGameSettings::SetKeyboardInputBindingsToDefault()\n{\n\tbUseKeyboardArrowPresetAsDefault = false;\n\n\tfor (int32 Index = ModifiedInputActionMappings.Num() - 1; Index >= 0; Index--)\n\t{\n\t\tconst FSoInputActionKeyMapping& Mapping = ModifiedInputActionMappings[Index];\n\t\tif (Mapping.IsKeyboard())\n\t\t\tModifiedInputActionMappings.RemoveAt(Index);\n\t}\n\tfor (int32 Index = ModifiedInputAxisMappings.Num() - 1; Index >= 0; Index--)\n\t{\n\t\tconst FSoInputAxisKeyMapping& Mapping = ModifiedInputAxisMappings[Index];\n\t\tif (Mapping.IsKeyboard())\n\t\t\tModifiedInputAxisMappings.RemoveAt(Index);\n\t}\n\n\tRefreshInputSettingsMappings();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoGameSettings::SetGamepadInputBindingsToDefault()\n{\n\tfor (int32 Index = ModifiedInputActionMappings.Num() - 1; Index >= 0; Index--)\n\t{\n\t\tconst FSoInputActionKeyMapping& Mapping = ModifiedInputActionMappings[Index];\n\t\tif (Mapping.IsGamepad())\n\t\t\tModifiedInputActionMappings.RemoveAt(Index);\n\t}\n\tfor (int32 Index = ModifiedInputAxisMappings.Num() - 1; Index >= 0; Index--)\n\t{\n\t\tconst FSoInputAxisKeyMapping& Mapping = ModifiedInputAxisMappings[Index];\n\t\tif (Mapping.IsGamepad())\n\t\t\tModifiedInputAxisMappings.RemoveAt(Index);\n\t}\n\n\tRefreshInputSettingsMappings();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoGameSettings::TryAutoSetGamepadLayout()\n{\n\tif (IsAutoDetectGamepadLayout())\n\t{\n\t\treturn AutoSetGamepadLayoutFromConnectedGamepad();\n\t}\n\n\treturn false;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoGameSettings::AutoSetGamepadLayoutFromConnectedGamepad()\n{\n\tif (!USoPlatformHelper::IsAnyGamepadConnected())\n\t\treturn false;\n\n\tASoPlayerController* Controller = ASoPlayerController::GetInstance(WorldContextObject);\n\tif (!Controller)\n\t\treturn false;\n\n\t// Default is first\n\tFString GamepadName = USoPlatformHelper::GetFirstGamepadName();\n\n\t// Try from input joystick\n\tconst int32 LastJoystickIndexUsed = Controller->GetLastJoystickIndexUsed();\n\tif (USoPlatformHelper::IsJoystickIndexAGamepad(LastJoystickIndexUsed))\n\t{\n\t\tGamepadName = USoPlatformHelper::GetGamepadName(LastJoystickIndexUsed);\n\t}\n\n\t// Prefer the first valid\n\tconst int32 NumGamepads = USoPlatformHelper::NumGamepads();\n\tUE_LOG(\n\t\tLogSoGameSettings,\n\t\tLog,\n\t\tTEXT(\"AutosetGamepadUIFromConnectedGamepad: NumGamepads = %d, FirstGamepadName = %s\"),\n\t\tNumGamepads, *GamepadName\n\t);\n\n\tif (!GamepadName.IsEmpty())\n\t{\n\t\tconst ESoGamepadLayoutType PreviousGamepadLayout = GetGamepadLayoutType();\n\t\tconst ESoGamepadLayoutType NewGamepadLayout = USoPlatformHelper::GetGamepadLayoutTypeFromName(GamepadName);\n\t\tif (PreviousGamepadLayout != NewGamepadLayout)\n\t\t{\n\t\t\tSetGamepadLayoutType(NewGamepadLayout);\n\t\t\tUE_LOG(\n\t\t\t\tLogSoGameSettings,\n\t\t\t\tLog,\n\t\t\t\tTEXT(\"AutosetGamepadUIFromConnectedGamepad: Changing gamepad layout to %s because of GamepadName = %s\"),\n\t\t\t\t*USoPlatformHelper::GamepadLayoutToString(NewGamepadLayout), *GamepadName\n\t\t\t);\n\t\t\tApplyInputSettings();\n\t\t\treturn true;\n\t\t}\n\t}\n\n\treturn false;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nESoGamepadLayoutType USoGameSettings::GetGamepadLayoutType() const\n{\n\tif (USoPlatformHelper::HasHardcodedGamepad())\n\t{\n\t\treturn USoInputHelper::ConvertInputDeviceTypeToInputGamepadUIType(USoPlatformHelper::GetHardcodedGamepadType());\n\t}\n\n\treturn GamepadUIType;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoGameSettings::SetAutoDetectGamepadLayout(bool InValue)\n{\n\tbAutoDetectGamepadUIType = InValue;\n\tif (IsAutoDetectGamepadLayout())\n\t{\n\t\tAutoSetGamepadLayoutFromConnectedGamepad();\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoGameSettings::RefreshInputSettingsMappings()\n{\n\tInputActionMappings.Empty();\n\tInputAxisMappings.Empty();\n\tGamepadKeyToGameActionNameMap.Empty();\n\tGamepadKeyToUIActionNameMap.Empty();\n\tconst UInputSettings* InputSettings = UInputSettings::GetInputSettings();\n\tif (InputSettings == nullptr)\n\t\treturn;\n\n\t// Sanity check\n\tCheckAndRepairModifiedInputSettings();\n\n\t// NOTE: InputSettings->*Mappings are the default ones\n\n\t// Action mappings\n\tInputActionMappings = GenerateInputActionMappings();\n\n\t// Axis mappings\n\tfor (const FInputAxisKeyMapping& DefaultAxis : InputSettings->AxisMappings)\n\t{\n\t\tTArray<FSoInputAxisKeyMapping> ModifiedMappings = GetModifiedInputAxisMappingsForDefault(DefaultAxis);\n\t\tif (ModifiedMappings.Num() > 0)\n\t\t{\n\t\t\t// Add overridden (modified) axis\n\t\t\tfor (const FSoInputAxisKeyMapping& ModifiedAxis : ModifiedMappings)\n\t\t\t\tInputAxisMappings.FindOrAdd(ModifiedAxis.Modified.AxisName).Add(ModifiedAxis.Modified);\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// Normal not overridden, Not Yet\n\t\t\tInputAxisMappings.FindOrAdd(DefaultAxis.AxisName).Add(DefaultAxis);\n\t\t}\n\t}\n\n\t// Build GamepadKeyToActionNameMap\n\tfor (const auto& Elem : InputActionMappings)\n\t{\n\t\tconst FName ActionName = Elem.Key;\n\n\t\t// Normal actions\n\t\tif (FSoInputActionName::IsGameActionName(ActionName))\n\t\t{\n\t\t\tfor (const FInputActionKeyMapping& KeyMapping : Elem.Value)\n\t\t\t{\n\t\t\t\t// Must be gamepad button\n\t\t\t\tconst FName KeyName = KeyMapping.Key.GetFName();\n\t\t\t\tif (!USoInputHelper::IsGamepadKey(KeyMapping.Key) || !FSoInputKey::IsGamepadButton(KeyName))\n\t\t\t\t\tcontinue;\n\n\t\t\t\tGamepadKeyToGameActionNameMap.FindOrAdd(KeyName).Add(ActionName);\n\t\t\t}\n\t\t}\n\n\t\t// UI actions\n\t\tif (FSoInputActionName::IsUIActionName(ActionName))\n\t\t{\n\t\t\tfor (const FInputActionKeyMapping& KeyMapping : Elem.Value)\n\t\t\t{\n\t\t\t\t// Must be gamepad button\n\t\t\t\tconst FName KeyName = KeyMapping.Key.GetFName();\n\t\t\t\tif (!USoInputHelper::IsGamepadKey(KeyMapping.Key) || !FSoInputKey::IsGamepadButton(KeyName))\n\t\t\t\t\tcontinue;\n\n\t\t\t\tGamepadKeyToUIActionNameMap.FindOrAdd(KeyName).Add(ActionName);\n\t\t\t}\n\t\t}\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nTMap<FName, TArray<FInputActionKeyMapping>> USoGameSettings::GenerateInputActionMappings() const\n{\n\tconst UInputSettings* InputSettings = UInputSettings::GetInputSettings();\n\tverify(InputSettings);\n\n\tTMap<FName, TArray<FInputActionKeyMapping>> LocalInputActionMappings;\n\tfor (const FInputActionKeyMapping& DefaultAction : InputSettings->ActionMappings)\n\t{\n\t\t// NOTE: InputSettings->ActionMappings are the default ones\n\t\tTArray<FSoInputActionKeyMapping> ModifiedMappings = GetModifiedInputActionMappingsForDefault(DefaultAction);\n\t\tif (ModifiedMappings.Num() > 0)\n\t\t{\n\t\t\t// Add overridden (modified) keys\n\t\t\tfor (const FSoInputActionKeyMapping& ModifiedKey : ModifiedMappings)\n\t\t\t\tLocalInputActionMappings.FindOrAdd(ModifiedKey.Modified.ActionName).Add(ModifiedKey.Modified);\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// Normal not overridden, Not Yet\n\t\t\tLocalInputActionMappings.FindOrAdd(DefaultAction.ActionName).Add(DefaultAction);\n\t\t}\n\t}\n\n\treturn LocalInputActionMappings;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoGameSettings::SetInputToPreset(const FSoInputPreset& Preset)\n{\n\tif (Preset.KeyRebinds.Num() == 0)\n\t{\n\t\tUE_LOG(LogSoGameSettings, Error, TEXT(\"SetInputToPreset: Got Empty preset\"));\n\t\treturn false;\n\t}\n\n\tcheck(Preset.IsKeyboard());\n\tbool bReturnStatus = true;\n\tfor (const FSoInputPresetKeyRebind& PresetKey : Preset.KeyRebinds)\n\t{\n\t\tconst FInputActionKeyMapping NewMapping = PresetKey.ToUnrealActionMapping();\n\n\t\tconst TArray<FInputActionKeyMapping>& AllMappings = GetInputActionMappingsForActionName(NewMapping.ActionName);\n\t\tbReturnStatus &= AllMappings.Num() > 0;\n\n\t\t// Rebind KeyMapping to new Preset key\n\t\tfor (const FInputActionKeyMapping& KeyMapping : AllMappings)\n\t\t{\n\t\t\tconst bool bIsInvalidKey = !KeyMapping.Key.IsValid();\n\t\t\tif (bIsInvalidKey || USoInputHelper::IsKeyboardKey(KeyMapping.Key))\n\t\t\t\tbReturnStatus &= RebindInputKey(KeyMapping, NewMapping, false, false);\n\t\t}\n\t}\n\n\treturn bReturnStatus;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoGameSettings::SetInputToPresetKeyboardArrows()\n{\n\tconst USoInputSettings* CustomInputSettings = GetDefault<USoInputSettings>();\n\tconst bool bStatus = SetInputToPreset(CustomInputSettings->GetKeyboardDefaultArrowsPreset());\n\tbUseKeyboardArrowPresetAsDefault = bStatus;\n\n\treturn bStatus;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoGameSettings::RebindInputKeyToInputChord(const FInputActionKeyMapping& OldKeyMapping, const FInputChord& NewInputChord,\n\tbool bCheckExistingBinding, bool bUnbindExisting)\n{\n\t// NOTE: we ignore the meta modified (alt, ctrl, shift) + keys\n\tFInputActionKeyMapping NewKeyMapping = OldKeyMapping;\n\tNewKeyMapping.Key = NewInputChord.Key;\n\treturn RebindInputKey(OldKeyMapping, NewKeyMapping, bCheckExistingBinding, bUnbindExisting);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoGameSettings::RebindInputKey(const FInputActionKeyMapping& OldKeyMapping, const FInputActionKeyMapping& NewKeyMapping,\n\tbool bCheckExistingBinding, bool bUnbindExisting)\n{\n\t// Does not even exist\n\tif (!InputActionMappings.Contains(OldKeyMapping.ActionName))\n\t{\n\t\tUE_LOG(\n\t\t\tLogSoGameSettings,\n\t\t\tError,\n\t\t\tTEXT(\"RebindInputKey: ActionName = %s Does not even exist in the InputActionMappings\"),\n\t\t\t*OldKeyMapping.ActionName.ToString()\n\t\t);\n\t\treturn false;\n\t}\n\n\t// Key already used?\n\tif (bCheckExistingBinding)\n\t{\n\t\tconst FInputChord NewInputChord = USoInputHelper::ActionMappingToInputChord(NewKeyMapping);\n\t\tTArray<FInputActionKeyMapping> ByActionMappings;\n\t\tif (IsInputChordAlreadyUsed(NewKeyMapping.ActionName, NewInputChord, ESoInputActionCategoryType::GameOrUI, ByActionMappings))\n\t\t{\n\t\t\tif (bUnbindExisting)\n\t\t\t{\n\t\t\t\t// Unbind all\n\t\t\t\tUE_LOG(\n\t\t\t\t\tLogSoGameSettings,\n\t\t\t\t\tWarning,\n\t\t\t\t\tTEXT(\"RebindInputKey: Unbinding all existing Action for Chord = %s\"),\n\t\t\t\t\t*USoInputHelper::ChordToString(NewInputChord)\n\t\t\t\t);\n\t\t\t\tUnbindInputActionMappings(ByActionMappings);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tFInputActionKeyMapping SwappedKeyMapping = ByActionMappings[0];\n\t\t\t\tSwappedKeyMapping.Key = OldKeyMapping.Key;\n\t\t\t\tRebindInputKey(ByActionMappings[0], SwappedKeyMapping, false, false);\n\n\t\t\t\t// Is the input key already was already in the settings Well that was easy\n\t\t\t\t//UE_LOG(\n\t\t\t\t//\tLogSoGameSettings,\n\t\t\t\t//\tWarning,\n\t\t\t\t//\tTEXT(\"RebindInputKey: NewInputChord (%s) is already used. Ignoring this. We assume that it was a success as the rebind is already in the settings.\"),\n\t\t\t\t//\t*USoInputHelper::ChordToString(NewInputChord)\n\t\t\t\t//);\n\t\t\t\t//return true;\n\t\t\t}\n\t\t}\n\t}\n\n\t// Find the default one for the OldKeyMapping\n\tTArray<FInputActionKeyMapping> DefaultKeys = GetDefaultInputActionMappingsForModified(OldKeyMapping);\n\tif (DefaultKeys.Num() != 1)\n\t{\n\t\tUE_LOG(LogSoGameSettings, Error, TEXT(\"RebindInputKey: DefaultKeys.Num (%d) != 1\"), DefaultKeys.Num());\n\t\treturn false;\n\t}\n\n\t// Replace default action mapping with new modified one\n\tFSoInputActionKeyMapping ActionMapping;\n\tActionMapping.Default = DefaultKeys[0];\n\tActionMapping.Modified = NewKeyMapping;\n\n\t// Replace axis mappings\n\tbool bReturnStatus = true;\n\tconst TSet<FName>& AxisToModify = USoInputHelper::GetAxisNamesLinkedToActionName(ActionMapping.Default.ActionName);\n\tfor (const FName AxisNameToModify : AxisToModify)\n\t{\n\t\tif (AxisNameToModify != NAME_None)\n\t\t{\n\t\t\tFSoInputAxisKeyMapping AxisMapping;\n\t\t\tbReturnStatus = bReturnStatus && GetModifiedInputAxisMappingForActionMapping(ActionMapping, AxisNameToModify, AxisMapping);\n\t\t\tbReturnStatus = bReturnStatus && AddModifiedInputAxisMapping(AxisMapping);\n\t\t}\n\t}\n\n\tbReturnStatus = bReturnStatus && AddModifiedInputActionMapping(ActionMapping);\n\n\t// Check Sync\n\tif (bReturnStatus)\n\t\tEnsureActionNamesAreInSyncIfModified(ActionMapping);\n\n\t// Check unbound keys\n\tif (bReturnStatus)\n\t\tEnsureUnbindingDoesNotBreakGame(ActionMapping);\n\n\treturn bReturnStatus;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoGameSettings::UnbindInputActionMapping(const FInputActionKeyMapping& OldKeyMapping)\n{\n\tFInputActionKeyMapping EmptyBinding = OldKeyMapping;\n\tEmptyBinding.Key = FKey{};\n\n\t// Invalidate key\n\treturn RebindInputKey(OldKeyMapping, EmptyBinding, false, false);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoGameSettings::UnbindKeyboardInputActionMapping(const FInputActionKeyMapping& OldKeyMapping)\n{\n\t// Can't unbind not a keyboard key\n\tif (!USoInputHelper::IsKeyboardKey(OldKeyMapping.Key))\n\t\treturn false;\n\n\treturn UnbindInputActionMapping(OldKeyMapping);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoGameSettings::UnbindAllKeyboardInputsForActionName(FName ActionName)\n{\n\tTArray<FInputActionKeyMapping> ActionMappings = GetKeyboardInputActionMappingsForActionName(ActionName, false);\n\tfor (auto& Binding : ActionMappings)\n\t{\n\t\tUnbindKeyboardInputActionMapping(Binding);\n\t}\n\n\treturn ActionMappings.Num() > 0;\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoGameSettings::UnbindInputActionMappings(const TArray<FInputActionKeyMapping>& ActionMappings)\n{\n\tfor (const FInputActionKeyMapping& DefaultMapping : ActionMappings)\n\t{\n\t\tUnbindInputActionMapping(DefaultMapping);\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoGameSettings::EnsureActionNamesAreInSyncIfModified(const FSoInputActionKeyMapping& ActionMapping)\n{\n\t// Is unbinding, oops can't do anything?\n\tif (ActionMapping.IsUnbinding())\n\t\treturn;\n\n\tconst FName ActionName = ActionMapping.GetActionName();\n\tconst FName SyncWithActionName = FSoInputActionName::GetSyncedActionNameIfModified(ActionName);\n\n\t// Nothing to sync with\n\tif (SyncWithActionName == NAME_None)\n\t\treturn;\n\n\t// Key was reset to default, remove our modifications\n\tif (IsInputActionMappingDefault(ActionMapping.Modified))\n\t{\n\t\tRemoveModifiedInputActionMappingsForActionName(SyncWithActionName);\n\t\treturn;\n\t}\n\n\t// Get the synced action mappings\n\tTArray<FInputActionKeyMapping> SyncActionMappings = GetKeyboardInputActionMappingsForActionName(SyncWithActionName, true);\n\tif (SyncActionMappings.Num() == 0)\n\t\treturn;\n\n\t// Use the first one as the old one\n\tconst FInputActionKeyMapping OldKeyMapping = SyncActionMappings[0];\n\n\t// Use the parent modified as the sync one\n\tFInputActionKeyMapping NewKeyMapping = ActionMapping.Modified;\n\tNewKeyMapping.ActionName = SyncWithActionName;\n\n\tRebindInputKey(OldKeyMapping, NewKeyMapping, true, false);\n\n\t// Unbind the rest\n\tfor (int32 Index = 1; Index < SyncActionMappings.Num(); Index++)\n\t{\n\t\tUnbindKeyboardInputActionMapping(SyncActionMappings[Index]);\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoGameSettings::EnsureUnbindingDoesNotBreakGame(const FSoInputActionKeyMapping& ActionMapping)\n{\n\tstatic const TArray<FKey> CandidatesInputKeys = {\n\t\tEKeys::A,\n\t\tEKeys::B,\n\t\tEKeys::C,\n\t\tEKeys::D,\n\t\tEKeys::E,\n\t\tEKeys::F,\n\t\tEKeys::G,\n\t\tEKeys::H,\n\t\tEKeys::I,\n\t\tEKeys::J,\n\t\tEKeys::K,\n\t\tEKeys::L,\n\t\tEKeys::M,\n\t\tEKeys::N,\n\t\tEKeys::O,\n\t\tEKeys::P,\n\t\tEKeys::Q,\n\t\tEKeys::R,\n\t\tEKeys::S,\n\t\tEKeys::T,\n\t\tEKeys::U,\n\t\tEKeys::V,\n\t\tEKeys::W,\n\t\tEKeys::X,\n\t\tEKeys::Y,\n\t\tEKeys::Z,\n\n\t\tEKeys::Zero,\n\t\tEKeys::One,\n\t\tEKeys::Two,\n\t\tEKeys::Three,\n\t\tEKeys::Four,\n\t\tEKeys::Five,\n\t\tEKeys::Six,\n\t\tEKeys::Seven,\n\t\tEKeys::Eight,\n\t\tEKeys::Nine,\n\n\t\tEKeys::Tab,\n\t};\n\tstatic const TSet<FName> AlwaysValidUIActionNames = {\n\t\tFSoInputActionName::GetNameFromUICommand(ESoUICommand::EUC_Action0),\n\t\tFSoInputActionName::GetNameFromUICommand(ESoUICommand::EUC_Action1),\n\t\tFSoInputActionName::GetNameFromUICommand(ESoUICommand::EUC_Action2),\n\t\tFSoInputActionName::GetNameFromUICommand(ESoUICommand::EUC_TopLeft),\n\t\tFSoInputActionName::GetNameFromUICommand(ESoUICommand::EUC_TopRight),\n\t\tFSoInputActionName::GetNameFromUICommand(ESoUICommand::EUC_ActionBack),\n\n\t\t// Ensure these are set\n\t\tFSoInputActionName::GetNameFromUICommand(ESoUICommand::EUC_SpellSelect),\n\t\tFSoInputActionName::GetNameFromUICommand(ESoUICommand::EUC_SpellSelectAndCast)\n\t};\n\n\t// Was not unbound, can't use this method\n\tif (!ActionMapping.IsUnbinding())\n\t\treturn;\n\n\t// Check UI action names are valid\n\tconst FName ActionName = ActionMapping.GetActionName();;\n\tconst ESoInputActionCategoryType ActionCategory = FSoInputActionName::GetCategoryForActionName(ActionName);\n\tif (ActionCategory == ESoInputActionCategoryType::UI)\n\t{\n\t\t// Must be invalid and in our always valid set\n\t\tif (AlwaysValidUIActionNames.Contains(ActionName))\n\t\t{\n\t\t\tfor (const FKey KeyCandidate : CandidatesInputKeys)\n\t\t\t{\n\t\t\t\tTArray<FInputActionKeyMapping> ByActionMappings;\n\t\t\t\tif (!IsInputKeyAlreadyUsed(ActionName, KeyCandidate, ESoInputActionCategoryType::UI, ByActionMappings))\n\t\t\t\t{\n\t\t\t\t\t// Found a valid candidate, use this\n\t\t\t\t\tFInputActionKeyMapping NewCandidate = ActionMapping.Modified;\n\t\t\t\t\tNewCandidate.Key = KeyCandidate;\n\n\t\t\t\t\tUE_LOG(LogSoGameSettings,\n\t\t\t\t\t\tWarning,\n\t\t\t\t\t\tTEXT(\"EnsureUnbindingsDoesNotBreakGame: ActionName  = %s can't get unbound so we are assigning it the key = %s\"),\n\t\t\t\t\t\t*ActionName.ToString(), *KeyCandidate.ToString());\n\t\t\t\t\tRebindInputKey(ActionMapping.Default, NewCandidate, false, false);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoGameSettings::GetDefaultInputActionMapping(const FInputActionKeyMapping& ModifiedMapping, FInputActionKeyMapping& OutDefault) const\n{\n\tOutDefault = {};\n\tconst TArray<FInputActionKeyMapping> DefaultKeys = GetDefaultInputActionMappingsForModified(ModifiedMapping);\n\tif (DefaultKeys.Num() != 1)\n\t{\n\t\treturn false;\n\t}\n\n\tOutDefault = DefaultKeys[0];\n\treturn true;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoGameSettings::SetInputActionMappingToDefault(const FInputActionKeyMapping& ModifiedMapping, bool bUnbindExisting, bool bUsePreset)\n{\n\t// Already a default\n\tif (IsInputActionMappingDefault(ModifiedMapping))\n\t{\n\t\tUE_LOG(LogSoGameSettings,\n\t\t\tWarning,\n\t\t\tTEXT(\"SetInputActionMappingToDefault: ModifiedMapping = %s is already Default ¯\\\\_(ツ)_/¯\"),\n\t\t\t*USoInputHelper::ActionMappingToString(ModifiedMapping));\n\t\treturn false;\n\t}\n\n\t// Arrow preset\n\tTArray<FInputActionKeyMapping> DefaultPresetMappings;\n\tif (bUsePreset && bUseKeyboardArrowPresetAsDefault)\n\t{\n\t\tstatic const USoInputSettings* CustomInputSettings = GetDefault<USoInputSettings>();\n\t\tfor (const FSoInputPresetKeyRebind& SoMapping : CustomInputSettings->GetKeyboardDefaultArrowsPreset().KeyRebinds)\n\t\t{\n\t\t\tconst FInputActionKeyMapping Mapping = SoMapping.ToUnrealActionMapping();\n\n\t\t\t// Modified ActionName matches mapping from the input preset so this is the default I guess\n\t\t\tif (Mapping.ActionName == ModifiedMapping.ActionName)\n\t\t\t{\n\t\t\t\tDefaultPresetMappings.Add(Mapping);\n\t\t\t}\n\t\t}\n\t}\n\n\t// Can we find the default key?\n\tFInputActionKeyMapping DefaultMapping;\n\tif (DefaultPresetMappings.Num() == 0)\n\t{\n\t\t// Use the default values\n\t\tif (!GetDefaultInputActionMapping(ModifiedMapping, DefaultMapping))\n\t\t{\n\t\t\tUE_LOG(LogSoGameSettings, Error, TEXT(\"SetInputActionMappingToDefault: Can't find default mappings\"));\n\t\t\treturn false;\n\t\t}\n\t}\n\telse\n\t{\n\t\t// Use the preset values\n\t\tDefaultMapping = DefaultPresetMappings[0];\n\t}\n\n\t// Replace modified action with default\n\treturn RebindInputKey(ModifiedMapping, DefaultMapping, true, bUnbindExisting);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoGameSettings::IsInputChordAlreadyUsed(FName ForActionName, const FInputChord& InputChord,\n\tESoInputActionCategoryType FilterCategory, TArray<FInputActionKeyMapping>& OutByActionMappings) const\n{\n\t// Key can have duplicates\n\tif (ForActionName != NAME_None && FSoInputActionName::CanIgnoreDuplicateBindingForActionName(ForActionName))\n\t\treturn false;\n\n\tconst ESoInputActionCategoryType ForActionNameCategoryType = FSoInputActionName::GetCategoryForActionName(ForActionName);\n\tif (ForActionNameCategoryType == ESoInputActionCategoryType::None)\n\t{\n\t\tUE_LOG(LogSoGameSettings, Error, TEXT(\"IsInputChordAlreadyUsed: ForActionName = %s got an invalid category type\"), *ForActionName.ToString());\n\t\treturn false;\n\t}\n\n\t// UI subcategory\n\tconst bool bOnlyForACategory = ForActionNameCategoryType != ESoInputActionCategoryType::All;\n\tconst ESoInputActionUICategoryType ForActionNameUICategoryType = FSoInputActionName::GetUICategoryForActionName(ForActionName);\n\n\tOutByActionMappings.Empty();\n\n\t//\n\t// NOTE: we Use the slower method here instead of iterating over the fast input map (InputActionMappings)\n\t// This is because we sometimes call this method before applying the input settings or calling RefreshInputSettingsMappings()\n\t// which we can't always do if for example we are changing the input preset\n\t//\n\n\t// Rebuild just for this function\n\tTMap<FName, TArray<FInputActionKeyMapping>> LocalInputActionMappings = GenerateInputActionMappings();\n\n\tfor (const auto& Elem : LocalInputActionMappings)\n\t{\n\t\tconst FName ActionName = Elem.Key;\n\n\t\t// Can ignore duplicates for this action name\n\t\tif (FSoInputActionName::CanIgnoreDuplicateBindingForActionName(ActionName))\n\t\t\tcontinue;\n\n\t\t// Does NOT Matches the input FilterCategory\n\t\tif (!FSoInputActionName::IsValidActionNameForCategory(ActionName, FilterCategory))\n\t\t\tcontinue;\n\n\t\tif (bOnlyForACategory)\n\t\t{\n\t\t\t// ActionName has the category different than the ForActionName\n\t\t\tif (ForActionNameCategoryType != FSoInputActionName::GetCategoryForActionName(ActionName))\n\t\t\t\tcontinue;\n\n\t\t\t// The subcategory UI does not match between ForActionName and ActionName, duplicates are allowed\n\t\t\tif (ForActionNameCategoryType == ESoInputActionCategoryType::UI && ForActionNameUICategoryType != FSoInputActionName::GetUICategoryForActionName(ActionName))\n\t\t\t\tcontinue;\n\t\t}\n\n\t\t// Loop over key mappings of ActionName\n\t\tfor (const FInputActionKeyMapping& KeyMapping : Elem.Value)\n\t\t{\n\t\t\tif (USoInputHelper::DoesActionMappingMatchInputChord(KeyMapping, InputChord))\n\t\t\t{\n\t\t\t\t// We can't ignore duplicate\n\t\t\t\tif (!FSoInputActionName::CanIgnoreDuplicateBindingForActionName(KeyMapping.ActionName))\n\t\t\t\t{\n\t\t\t\t\tOutByActionMappings.Add(KeyMapping);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn OutByActionMappings.Num() > 0;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoGameSettings::DoActionNamesHaveTheSameKey(FName FirstActionName, FName SecondActionName, bool bIsKeyboard)\n{\n\t// Either one of them do not exist\n\tif (!InputActionMappings.Contains(FirstActionName))\n\t\treturn false;\n\tif (!InputActionMappings.Contains(SecondActionName))\n\t\treturn false;\n\n\tconst TArray<FInputActionKeyMapping>& FirstActionMappings = InputActionMappings.FindChecked(FirstActionName);\n\tconst TArray<FInputActionKeyMapping>& SecondActionMappings = InputActionMappings.FindChecked(SecondActionName);\n\n\t// Could this ever happen?\n\tif (FirstActionMappings.Num() == 0)\n\t\treturn false;\n\tif (SecondActionMappings.Num() == 0)\n\t\treturn false;\n\n\tauto IsValidDeviceType = [bIsKeyboard](const FKey Key) -> bool\n\t{\n\t\t// Must be keyboard\n\t\tif (bIsKeyboard && !USoInputHelper::IsKeyboardKey(Key))\n\t\t\treturn false;\n\n\t\t// Must be gamepad\n\t\tif (!bIsKeyboard && !USoInputHelper::IsGamepadKey(Key))\n\t\t\treturn false;\n\n\t\treturn true;\n\t};\n\n\t// Loop over both options\n\tfor (const FInputActionKeyMapping& First : FirstActionMappings)\n\t{\n\t\tif (!IsValidDeviceType(First.Key))\n\t\t\tcontinue;\n\n\t\tfor (const FInputActionKeyMapping& Second : SecondActionMappings)\n\t\t{\n\t\t\tif (!IsValidDeviceType(Second.Key))\n\t\t\t\tcontinue;\n\n\t\t\t// Keys match\n\t\t\tif (First.Key == Second.Key)\n\t\t\t\treturn true;\n\t\t}\n\t}\n\n\treturn false;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nTArray<FInputActionKeyMapping> USoGameSettings::GetKeyboardInputActionMappingsForActionName(FName ActionName, bool bIncludeUnbound) const\n{\n\t// Only get keyboard action mappings, if bIncludeUnbound is true we also include unbound keys\n\tconst TArray<FInputActionKeyMapping>& AllMappings = GetInputActionMappingsForActionName(ActionName);\n\n\tTArray<FInputActionKeyMapping> GamepadMappings;\n\tfor (const FInputActionKeyMapping& KeyMapping : AllMappings)\n\t{\n\t\tconst bool bUseUnbound = bIncludeUnbound && !KeyMapping.Key.IsValid();\n\t\tconst bool bIsKeyboardKey = USoInputHelper::IsKeyboardKey(KeyMapping.Key);\n\t\tif (bUseUnbound || bIsKeyboardKey)\n\t\t\tGamepadMappings.Add(KeyMapping);\n\t}\n\n\treturn GamepadMappings;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nTArray<FInputActionKeyMapping> USoGameSettings::GetGamepadInputActionMappingsForActionName(FName ActionName, bool bIncludeUnbound) const\n{\n\t// Only get gamepad action mappings, if bIncludeUnbound is true we also include unbound keys\n\tconst TArray<FInputActionKeyMapping>& AllMappings = GetInputActionMappingsForActionName(ActionName);\n\n\tTArray<FInputActionKeyMapping> KeyboardMappings;\n\tfor (const FInputActionKeyMapping& KeyMapping : AllMappings)\n\t{\n\t\tconst bool bUseUnbound = bIncludeUnbound && !KeyMapping.Key.IsValid();\n\t\tconst bool bIsGamepadKey = USoInputHelper::IsGamepadKey(KeyMapping.Key);\n\t\tif (bUseUnbound || bIsGamepadKey)\n\t\t\tKeyboardMappings.Add(KeyMapping);\n\t}\n\n\treturn KeyboardMappings;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nconst TArray<FInputActionKeyMapping>& USoGameSettings::GetInputActionMappingsForActionName(FName ActionName) const\n{\n\tconst TArray<FInputActionKeyMapping>* Value = InputActionMappings.Find(ActionName);\n\treturn Value == nullptr ? EmptyInputActionKeysArray : *Value;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nconst TArray<FInputAxisKeyMapping>& USoGameSettings::GetInputAxisMappingForAxisName(FName AxisName) const\n{\n\tconst TArray<FInputAxisKeyMapping>* Value = InputAxisMappings.Find(AxisName);\n\treturn Value == nullptr ? EmptyInputAxisKeysArray : *Value;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nTArray<FSoInputActionKeyMapping> USoGameSettings::GetModifiedInputActionMappingsForDefault(const FInputActionKeyMapping& DefaultKeyMapping) const\n{\n\tTArray<FSoInputActionKeyMapping> ModifiedMappings;\n\tfor (const FSoInputActionKeyMapping& KeyMapping : ModifiedInputActionMappings)\n\t\tif (KeyMapping.Default == DefaultKeyMapping)\n\t\t\tModifiedMappings.Add(KeyMapping);\n\n\treturn ModifiedMappings;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nTArray<FInputActionKeyMapping> USoGameSettings::GetDefaultInputActionMappingsForModified(const FInputActionKeyMapping& ModifiedKeyMapping) const\n{\n\tTArray<FInputActionKeyMapping> DefaultMappings;\n\n\t// Normal preset\n\tfor (const FSoInputActionKeyMapping& KeyMapping : ModifiedInputActionMappings)\n\t\tif (KeyMapping.Modified == ModifiedKeyMapping)\n\t\t\tDefaultMappings.Add(KeyMapping.Default);\n\n\t// NOTE: order here is important, as we first check if the modified key exists, if it does not it is most likely a default one\n\t// Already a default?\n\tif (DefaultMappings.Num() == 0)\n\t\tif (IsInputActionMappingDefault(ModifiedKeyMapping))\n\t\t\tDefaultMappings.Add(ModifiedKeyMapping);\n\n\treturn DefaultMappings;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nTArray<FSoInputAxisKeyMapping> USoGameSettings::GetModifiedInputAxisMappingsForDefault(const FInputAxisKeyMapping& DefaultAxisMapping) const\n{\n\tTArray<FSoInputAxisKeyMapping> ModifiedMappings;\n\tfor (const FSoInputAxisKeyMapping& AxisMapping : ModifiedInputAxisMappings)\n\t\tif (USoInputHelper::AreAxisMappingsEqual(AxisMapping.Default, DefaultAxisMapping))\n\t\t\tModifiedMappings.Add(AxisMapping);\n\n\treturn ModifiedMappings;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoGameSettings::IsInputActionMappingDefault(const FInputActionKeyMapping& CheckKeyMapping, bool bUsePreset) const\n{\n\t// Arrow preset\n\tif (bUsePreset && bUseKeyboardArrowPresetAsDefault)\n\t{\n\t\tconst USoInputSettings* CustomInputSettings = GetDefault<USoInputSettings>();\n\t\tfor (const FSoInputPresetKeyRebind& SoMapping : CustomInputSettings->GetKeyboardDefaultArrowsPreset().KeyRebinds)\n\t\t{\n\t\t\tconst FInputActionKeyMapping Mapping = SoMapping.ToUnrealActionMapping();\n\t\t\tif (Mapping == CheckKeyMapping)\n\t\t\t\treturn true;\n\t\t}\n\t}\n\n\tconst UInputSettings* InputSettings = UInputSettings::GetInputSettings();\n\tif (InputSettings == nullptr)\n\t\treturn false;\n\n\t// Is the key mapping in the UInputSettings which represents the Config/DefaultInput.ini\n\tfor (const FInputActionKeyMapping& Mapping : InputSettings->ActionMappings)\n\t\tif (Mapping == CheckKeyMapping)\n\t\t\treturn true;\n\n\treturn false;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoGameSettings::IsInputAxisMappingDefault(const FInputAxisKeyMapping& CheckAxisMapping) const\n{\n\tconst UInputSettings* InputSettings = UInputSettings::GetInputSettings();\n\tif (InputSettings == nullptr)\n\t\treturn false;\n\n\t// Is the key mapping in the UInputSettings which represents the Config/DefaultInput.ini\n\tfor (const FInputAxisKeyMapping& Mapping : InputSettings->AxisMappings)\n\t\tif (USoInputHelper::AreAxisMappingsEqual(Mapping, CheckAxisMapping))\n\t\t\treturn true;\n\n\treturn false;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoGameSettings::GetModifiedInputAxisMappingForActionMapping(const FSoInputActionKeyMapping& ActionMapping,\n\tFName AxisNameToModify, FSoInputAxisKeyMapping& OutAxisMapping) const\n{\n\t// TODO this method seems a bit too much, what is wrong with just checking InputAxisMappings?\n\t// Something is wrong\n\tif (ValidateModifiedInputActionMapping(ActionMapping) != ESoInputIntegrity::Ok)\n\t\treturn false;\n\n\t// No Axis name\n\tif (AxisNameToModify == NAME_None)\n\t\treturn false;\n\n\t// Does not event exist\n\tif (!InputAxisMappings.Contains(AxisNameToModify))\n\t{\n\t\tUE_LOG(LogSoGameSettings,\n\t\t\tError,\n\t\t\tTEXT(\"GetInputAxisMappingsFromInputActionMapping: AxisName = %s Does not even exist in the InputAxisMappings\"),\n\t\t\t*AxisNameToModify.ToString());\n\t\treturn false;\n\t}\n\n\t// Get the axis mapping from the default axis mappings\n\tauto GetFromDefaultSettings = [AxisNameToModify, &OutAxisMapping](const FInputActionKeyMapping& CompareKeyMapping) -> bool\n\t{\n\t\tconst UInputSettings* InputSettings = UInputSettings::GetInputSettings();\n\t\tif (InputSettings == nullptr)\n\t\t\treturn false;\n\n\t\tbool bFound = false;\n\t\tfor (const FInputAxisKeyMapping& DefaultAxis : InputSettings->AxisMappings)\n\t\t{\n\t\t\t// AxisName and Key must match\n\t\t\tif (DefaultAxis.AxisName == AxisNameToModify && DefaultAxis.Key == CompareKeyMapping.Key)\n\t\t\t{\n\t\t\t\tif (bFound)\n\t\t\t\t{\n\t\t\t\t\tUE_LOG(LogSoGameSettings,\n\t\t\t\t\t\tWarning,\n\t\t\t\t\t\tTEXT(\"GetInputAxisMappingsFromInputActionMapping: Found another default axis for default CompareKeyMapping = %s. Ignoring\"),\n\t\t\t\t\t\t*USoInputHelper::ActionMappingToString(CompareKeyMapping));\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tbFound = true;\n\t\t\t\t\tOutAxisMapping.Default = DefaultAxis;\n\t\t\t\t\tOutAxisMapping.Modified = DefaultAxis;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Could not find any default axis mapping, something is wrong\n\t\tif (!bFound)\n\t\t{\n\t\t\tUE_LOG(LogSoGameSettings,\n\t\t\t\tError,\n\t\t\t\tTEXT(\"GetInputAxisMappingsFromInputActionMapping: Could not find any default axis mapping for default CompareKeyMapping = %s\"),\n\t\t\t\t*USoInputHelper::ActionMappingToString(CompareKeyMapping));\n\t\t\treturn false;\n\t\t}\n\n\t\treturn true;\n\t};\n\n\t// If the ActionMapping is default it must be that also the AxisMapping must be default\n\tif (IsInputActionMappingDefault(ActionMapping.Modified))\n\t{\n\t\treturn GetFromDefaultSettings(ActionMapping.Modified);\n\t}\n\n\t// Try with the default action mapping\n\tconst bool bFound = GetFromDefaultSettings(ActionMapping.Default);\n\tif (!bFound)\n\t{\n\t\tUE_LOG(LogSoGameSettings,\n\t\t\t   Error,\n\t\t\t   TEXT(\"GetInputAxisMappingsFromInputActionMapping: Could not find any axis mapping for ActionMapping=%s\"),\n\t\t\t   *ActionMapping.ToString());\n\t}\n\n\t// New key for axis\n\tOutAxisMapping.Modified.Key = ActionMapping.Modified.Key;\n\treturn bFound;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoGameSettings::AddModifiedInputActionMapping(const FSoInputActionKeyMapping& ActionMapping)\n{\n\t// Something is wrong\n\tif (ValidateModifiedInputActionMapping(ActionMapping) != ESoInputIntegrity::Ok)\n\t\treturn false;\n\n\t// New key is default, just remove current modified one\n\tif (IsInputActionMappingDefault(ActionMapping.Modified))\n\t{\n\t\t// They should be equal shouldn't they?\n\t\tif (!(ActionMapping.Default == ActionMapping.Modified))\n\t\t{\n\t\t\tUE_LOG(LogSoGameSettings,\n\t\t\t\tWarning,\n\t\t\t\tTEXT(\"AddModifiedInputActionMapping: ActionMapping.Default (%s) != ActionMapping.Modified (%s)\"),\n\t\t\t\t*USoInputHelper::ActionMappingToString(ActionMapping.Default), *USoInputHelper::ActionMappingToString(ActionMapping.Modified));\n\t\t}\n\n\t\tRemoveModifiedInputActionMappingsForDefault(ActionMapping.Modified);\n\t\treturn true;\n\t}\n\n\t// Did we find at least one modified action\n\tbool bFound = false;\n\n\t// Replace all actions\n\tfor (FSoInputActionKeyMapping& Mapping : ModifiedInputActionMappings)\n\t{\n\t\tif (Mapping.Default == ActionMapping.Default)\n\t\t{\n\t\t\tMapping.Modified = ActionMapping.Modified;\n\t\t\tbFound = true;\n\t\t}\n\t}\n\n\t// Add it for the first time\n\tif (!bFound)\n\t\tModifiedInputActionMappings.Add(ActionMapping);\n\n\treturn true;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoGameSettings::AddModifiedInputAxisMapping(const FSoInputAxisKeyMapping& AxisMapping)\n{\n\t// Something is wrong\n\tif (ValidateModifiedInputAxisMapping(AxisMapping) != ESoInputIntegrity::Ok)\n\t\treturn false;\n\n\t// New axis is default, just remove the current modified one\n\tif (IsInputAxisMappingDefault(AxisMapping.Modified))\n\t{\n\t\t// They should be equal shouldn't they?\n\t\tif (!USoInputHelper::AreAxisMappingsEqual(AxisMapping.Default, AxisMapping.Modified))\n\t\t{\n\t\t\tUE_LOG(LogSoGameSettings,\n\t\t\t\tWarning,\n\t\t\t\tTEXT(\"AddModifiedInputAxisMapping: AxisMapping.Default (%s) !=  AxisMapping.Modified (%s)\"),\n\t\t\t\t*USoInputHelper::AxisMappingToString(AxisMapping.Default), *USoInputHelper::AxisMappingToString(AxisMapping.Modified));\n\t\t}\n\n\t\tRemoveModifiedInputAxisMappingsForDefault(AxisMapping.Modified);\n\t\treturn true;\n\t}\n\n\t// Did we find at least one modified axis\n\tbool bFound = false;\n\n\t// Replace all axis\n\tfor (FSoInputAxisKeyMapping& Mapping : ModifiedInputAxisMappings)\n\t{\n\t\tif (USoInputHelper::AreAxisMappingsEqual(Mapping.Default, AxisMapping.Default))\n\t\t{\n\t\t\tMapping.Modified = AxisMapping.Modified;\n\t\t\tbFound = true;\n\t\t}\n\t}\n\n\t// Add it for the first time\n\tif (!bFound)\n\t\tModifiedInputAxisMappings.Add(AxisMapping);\n\n\treturn true;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoGameSettings::RemoveModifiedInputActionMappingsForActionName(FName ActionName)\n{\n\tfor (int32 i = ModifiedInputActionMappings.Num() - 1; i >= 0; i--)\n\t\tif (ModifiedInputActionMappings[i].GetActionName() == ActionName)\n\t\t\tModifiedInputActionMappings.RemoveAtSwap(i);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoGameSettings::RemoveModifiedInputActionMappingsForDefault(const FInputActionKeyMapping& DefaultKeyMapping)\n{\n\tfor (int32 i = ModifiedInputActionMappings.Num() - 1; i >= 0; i--)\n\t\tif (ModifiedInputActionMappings[i].Default == DefaultKeyMapping)\n\t\t\tModifiedInputActionMappings.RemoveAtSwap(i);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoGameSettings::RemoveModifiedInputAxisMappingsForDefault(const FInputAxisKeyMapping& DefaultAxisMapping)\n{\n\tfor (int32 i = ModifiedInputAxisMappings.Num() - 1; i >= 0; i--)\n\t\tif (USoInputHelper::AreAxisMappingsEqual(ModifiedInputAxisMappings[i].Default, DefaultAxisMapping))\n\t\t\tModifiedInputAxisMappings.RemoveAtSwap(i);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoGameSettings::GetAllInputActionMappings(TArray<FInputActionKeyMapping>& OutMappings) const\n{\n\t// Add all the values to the array\n\tfor (const auto& Elem : InputActionMappings)\n\t\tOutMappings.Append(Elem.Value);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoGameSettings::GetAllInputAxisMappings(TArray<FInputAxisKeyMapping>& OutMappings) const\n{\n\t// Add all the values to the array\n\tfor (const auto& Elem : InputAxisMappings)\n\t\tOutMappings.Append(Elem.Value);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nESoInputIntegrity USoGameSettings::ValidateModifiedInputActionMapping(const FSoInputActionKeyMapping& ActionMapping, bool bLog) const\n{\n\tif (!IsInputActionMappingDefault(ActionMapping.Default))\n\t{\n\t\tif (bLog)\n\t\t\tUE_LOG(LogSoGameSettings,\n\t\t\t\tError,\n\t\t\t\tTEXT(\"ValidateModifiedInputActionMapping: ActionMapping.Default = %s is not Default :(\"),\n\t\t\t\t*USoInputHelper::ActionMappingToString(ActionMapping.Default));\n\n\t\treturn ESoInputIntegrity::NotDefault;\n\t}\n\n\tconst ESoInputIntegrity ReturnStatus = ActionMapping.ValidateIntegrity();\n\tif (bLog)\n\t{\n\t\tswitch (ReturnStatus)\n\t\t{\n\t\tcase ESoInputIntegrity::NamesMismatch:\n\t\t\tUE_LOG(LogSoGameSettings,\n\t\t\t\tError,\n\t\t\t\tTEXT(\"ValidateModifiedInputActionMapping: ActionMapping.Default.ActionName (%s) != ActionMapping.Modified.ActionName (%s)\"),\n\t\t\t\t*ActionMapping.Default.ActionName.ToString(), *ActionMapping.Modified.ActionName.ToString());\n\t\t\tbreak;\n\t\tcase ESoInputIntegrity::KeyCategoryMismatch:\n\t\t\tUE_LOG(LogSoGameSettings,\n\t\t\t\tError,\n\t\t\t\tTEXT(\"ValidateModifiedInputActionMapping: ActionMapping.Default.Key (%s) not the same category (keyboard, gamepad) as ActionMapping.Modified.Key (%s)\"),\n\t\t\t\t*ActionMapping.Default.Key.GetDisplayName().ToString(), *ActionMapping.Modified.Key.GetDisplayName().ToString());\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tbreak;\n\t\t}\n\t}\n\n\treturn ReturnStatus;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nESoInputIntegrity USoGameSettings::ValidateModifiedInputAxisMapping(const FSoInputAxisKeyMapping& AxisMapping, bool bLog) const\n{\n\tif (!IsInputAxisMappingDefault(AxisMapping.Default))\n\t{\n\t\tif (bLog)\n\t\t\tUE_LOG(LogSoGameSettings,\n\t\t\t\tError,\n\t\t\t\tTEXT(\"ValidateModifiedInputAxisMapping: AxisMapping.Default = %s is not Default :(\"),\n\t\t\t\t*USoInputHelper::AxisMappingToString(AxisMapping.Default));\n\n\t\treturn ESoInputIntegrity::NotDefault;\n\t}\n\n\tconst ESoInputIntegrity ReturnStatus = AxisMapping.ValidateIntegrity();\n\tif (bLog)\n\t{\n\t\tswitch (ReturnStatus)\n\t\t{\n\t\tcase ESoInputIntegrity::NamesMismatch:\n\t\t\tUE_LOG(LogSoGameSettings,\n\t\t\t\tError,\n\t\t\t\tTEXT(\"ValidateModifiedInputAxisMapping: AxisMapping.Default.AxisName (%s) != AxisMapping.Modified.AxisName (%s)\"),\n\t\t\t\t*AxisMapping.Default.AxisName.ToString(), *AxisMapping.Modified.AxisName.ToString());\n\t\t\tbreak;\n\t\tcase ESoInputIntegrity::KeyCategoryMismatch:\n\t\t\tUE_LOG(LogSoGameSettings,\n\t\t\t\tError,\n\t\t\t\tTEXT(\"ValidateModifiedInputAxisMapping: AxisMapping.Default.Key (%s) not the same category (keyboard, gamepad) as AxisMapping.Modified.Key (%s)\"),\n\t\t\t\t*AxisMapping.Default.Key.GetDisplayName().ToString(), *AxisMapping.Modified.Key.GetDisplayName().ToString());\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tbreak;\n\t\t}\n\t}\n\n\treturn ReturnStatus;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoGameSettings::CheckAndRepairModifiedInputSettings()\n{\n\t// First check if the defaults changed by us or by the user. Invalidate any modified keys if they did\n\n\t// ActionMappings\n\tTArray<FSoInputActionKeyMapping> RemovedActionMappings;\n\tTSet<FInputActionKeyMapping> DefaultActionMappings;\n\tfor (int32 Index = ModifiedInputActionMappings.Num() - 1; Index >= 0; Index--)\n\t{\n\t\tconst FSoInputActionKeyMapping& ModifiedMapping = ModifiedInputActionMappings[Index];\n\t\tconst ESoInputIntegrity ReturnStatus = ValidateModifiedInputActionMapping(ModifiedMapping, false);\n\n\t\tswitch (ReturnStatus)\n\t\t{\n\t\tcase ESoInputIntegrity::NamesMismatch:\n\t\t\tUE_LOG(LogSoGameSettings,\n\t\t\t\tError,\n\t\t\t\tTEXT(\"CheckAndRepairdModifiedInputSettings: ActionMapping.Default.ActionName (%s) != ActionMapping.Modified.ActionName (%s). \"\n\t\t\t\t\t\"The action names were modified manually?\"\n\t\t\t\t\t\"Removing modification at index = %d\"),\n\t\t\t\t*ModifiedMapping.Default.ActionName.ToString(), *ModifiedMapping.Modified.ActionName.ToString(), Index);\n\t\t\tbreak;\n\n\t\tcase ESoInputIntegrity::KeyCategoryMismatch:\n\t\t\tUE_LOG(LogSoGameSettings,\n\t\t\t\tWarning,\n\t\t\t\tTEXT(\"CheckAndRepairdModifiedInputSettings: ActionMapping.Default.Key (%s) not the same category (keyboard, gamepad) as ActionMapping.Modified.Key (%s). \"\n\t\t\t\t\t\"The action keys were modified manually?\"\n\t\t\t\t\t\"Removing modification at index = %d\"),\n\t\t\t\t*ModifiedMapping.Default.Key.GetDisplayName().ToString(), *ModifiedMapping.Modified.Key.GetDisplayName().ToString(), Index);\n\t\t\tbreak;\n\n\t\tcase ESoInputIntegrity::NotDefault:\n\t\t\tUE_LOG(LogSoGameSettings,\n\t\t\t\tWarning,\n\t\t\t\tTEXT(\"CheckAndRepairdModifiedInputSettings: Default action mapping = %s does not exist anymore, \"\n\t\t\t\t\t\"the game had it's defaults modified or you edited the user settings by yourself. \"\n\t\t\t\t\t\"Removing modification at index = %d\"),\n\t\t\t\t*USoInputHelper::ActionMappingToString(ModifiedMapping.Default), Index);\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tbreak;\n\t\t}\n\n\t\t// Can't have same default twice\n\t\tbool bFoundDuplicateDefault = false;\n\t\tif (DefaultActionMappings.Contains(ModifiedMapping.Default))\n\t\t{\n\t\t\tbFoundDuplicateDefault = true;\n\t\t\tUE_LOG(LogSoGameSettings,\n\t\t\t\tWarning,\n\t\t\t\tTEXT(\"CheckAndRepairdModifiedInputSettings: Default action mapping = %s at index %d is a duplicate. \"\n\t\t\t\t\t\"The game had it's defaults modified or you edited the user settings by yourself. \"\n\t\t\t\t\t\"Removing modification at index = %d\"),\n\t\t\t\t*USoInputHelper::ActionMappingToString(ModifiedMapping.Default), Index, Index);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tDefaultActionMappings.Add(ModifiedMapping.Default);\n\t\t}\n\n\t\tif (ReturnStatus != ESoInputIntegrity::Ok)\n\t\t{\n\t\t\tRemovedActionMappings.Add(ModifiedMapping);\n\t\t\tModifiedInputActionMappings.RemoveAtSwap(Index);\n\t\t}\n\t\telse if (bFoundDuplicateDefault)\n\t\t{\n\t\t\t// Do not remove any dependencies as this was a duplicate\n\t\t\tModifiedInputActionMappings.RemoveAtSwap(Index);\n\t\t}\n\t}\n\n\t// AxisMappings\n\tTArray<FSoInputAxisKeyMapping> RemovedAxisMappings;\n\tTSet<FInputAxisKeyMapping> DefaultAxisMappings;\n\tfor (int32 Index = ModifiedInputAxisMappings.Num() - 1; Index >= 0; Index--)\n\t{\n\t\tconst FSoInputAxisKeyMapping& ModifiedMapping = ModifiedInputAxisMappings[Index];\n\t\tconst ESoInputIntegrity ReturnStatus = ValidateModifiedInputAxisMapping(ModifiedMapping, false);\n\n\t\tswitch (ReturnStatus)\n\t\t{\n\t\tcase ESoInputIntegrity::NamesMismatch:\n\t\t\tUE_LOG(LogSoGameSettings,\n\t\t\t\tWarning,\n\t\t\t\tTEXT(\"RefreshInputSettingsMappings: AxisMapping.Default.AxisName (%s) != AxisMapping.Modified.AxisName (%s). \"\n\t\t\t\t\t\"The axis names were modified manually? \"\n\t\t\t\t\t\"Removing modification at index = %d\"),\n\t\t\t\t*ModifiedMapping.Default.AxisName.ToString(), *ModifiedMapping.Modified.AxisName.ToString(), Index);\n\t\t\tbreak;\n\n\t\tcase ESoInputIntegrity::KeyCategoryMismatch:\n\t\t\tUE_LOG(LogSoGameSettings,\n\t\t\t\tWarning,\n\t\t\t\tTEXT(\"CheckAndRepairdModifiedInputSettings: AxisMapping.Default.Key (%s) not the same category (keyboard, gamepad) as AxisMapping.Modified.Key (%s). \"\n\t\t\t\t\t\"The axis keys were modified manually?\"\n\t\t\t\t\t\"Removing modification at index = %d\"),\n\t\t\t\t*ModifiedMapping.Default.Key.GetDisplayName().ToString(), *ModifiedMapping.Modified.Key.GetDisplayName().ToString(), Index);\n\t\t\tbreak;\n\n\t\tcase ESoInputIntegrity::NotDefault:\n\t\t\tUE_LOG(LogSoGameSettings,\n\t\t\t\tWarning,\n\t\t\t\tTEXT(\"RefreshInputSettingsMappings: Default axis mapping = %s does not exist anymore, \"\n\t\t\t\t\t\"the game had it's defaults modified or you edited the user settings by yourself. \"\n\t\t\t\t\t\"Removing modification at index = %d\"),\n\t\t\t\t*USoInputHelper::AxisMappingToString(ModifiedMapping.Default), Index);\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tbreak;\n\t\t}\n\n\t\t// Can't have same default twice\n\t\tbool bFoundDuplicateDefault = false;\n\t\tif (DefaultAxisMappings.Contains(ModifiedMapping.Default))\n\t\t{\n\t\t\tbFoundDuplicateDefault = true;\n\t\t\tUE_LOG(LogSoGameSettings,\n\t\t\t\tWarning,\n\t\t\t\tTEXT(\"CheckAndRepairdModifiedInputSettings: Default axis mapping = %s at index %d is a duplicate. \"\n\t\t\t\t\t\"The game had it's defaults modified or you edited the user settings by yourself. \"\n\t\t\t\t\t\"Removing modification at index = %d\"),\n\t\t\t\t*USoInputHelper::AxisMappingToString(ModifiedMapping.Default), Index, Index);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tDefaultAxisMappings.Add(ModifiedMapping.Default);\n\t\t}\n\n\t\tif (ReturnStatus != ESoInputIntegrity::Ok)\n\t\t{\n\t\t\tRemovedAxisMappings.Add(ModifiedMapping);\n\t\t\tModifiedInputAxisMappings.RemoveAtSwap(Index);\n\t\t}\n\t\telse if (bFoundDuplicateDefault)\n\t\t{\n\t\t\t// Do not remove any dependencies as this was a duplicate\n\t\t\tModifiedInputAxisMappings.RemoveAtSwap(Index);\n\t\t}\n\t}\n\n\t// Remove leftover axis names\n\tauto RemoveAxisForAction = [this](const FInputActionKeyMapping ToRemove)\n\t{\n\t\tfor (int32 Index = ModifiedInputAxisMappings.Num() - 1; Index >= 0; Index--)\n\t\t{\n\t\t\tconst FSoInputAxisKeyMapping& ModifiedMapping = ModifiedInputAxisMappings[Index];\n\t\t\tif (USoInputHelper::DoesActionMappingMatchAxisMapping(ToRemove, ModifiedMapping.Default) ||\n\t\t\t\tUSoInputHelper::DoesActionMappingMatchAxisMapping(ToRemove, ModifiedMapping.Modified))\n\t\t\t{\n\t\t\t\tUE_LOG(LogSoGameSettings,\n\t\t\t\t\tWarning,\n\t\t\t\t\tTEXT(\"Removed leftover modified axis mapping = %s at index = %d\"),\n\t\t\t\t\t*ModifiedMapping.ToString(), Index);\n\t\t\t\tModifiedInputAxisMappings.RemoveAtSwap(Index);\n\t\t\t}\n\t\t}\n\t};\n\tfor (const FSoInputActionKeyMapping& Removed : RemovedActionMappings)\n\t{\n\t\tRemoveAxisForAction(Removed.Default);\n\t\tRemoveAxisForAction(Removed.Modified);\n\t}\n\n\t// Remove leftover action names\n\tauto RemoveActionForAxis = [this](const FInputAxisKeyMapping ToRemove)\n\t{\n\t\tfor (int32 Index = ModifiedInputActionMappings.Num() - 1; Index >= 0; Index--)\n\t\t{\n\t\t\tconst FSoInputActionKeyMapping& ModifiedMapping = ModifiedInputActionMappings[Index];\n\t\t\tif (USoInputHelper::DoesActionMappingMatchAxisMapping(ModifiedMapping.Default, ToRemove) ||\n\t\t\t\tUSoInputHelper::DoesActionMappingMatchAxisMapping(ModifiedMapping.Modified, ToRemove))\n\t\t\t{\n\t\t\t\tUE_LOG(LogSoGameSettings,\n\t\t\t\t\tWarning,\n\t\t\t\t\tTEXT(\"Removed leftover modified action mapping = %s at index = %d\"),\n\t\t\t\t\t*ModifiedMapping.ToString(), Index);\n\t\t\t\tModifiedInputActionMappings.RemoveAtSwap(Index);\n\t\t\t}\n\t\t}\n\t};\n\tfor (const FSoInputAxisKeyMapping& Removed : RemovedAxisMappings)\n\t{\n\t\tRemoveActionForAxis(Removed.Default);\n\t\tRemoveActionForAxis(Removed.Modified);\n\t}\n\n\t// TODO check if Action matches the Axis\n\t// TODO multiple IsInputChordAlreadyUsed\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoGameSettings::RebuildInputKeymapsForAllPlayers() const\n{\n\tfor (TObjectIterator<UPlayerInput> It; It; ++It)\n\t{\n\t\tRebuildInputKeymapsForPlayerInput(*It);\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoGameSettings::RebuildInputKeymapsForPlayerInput(UPlayerInput* PlayerInput) const\n{\n\tif (!IsValid(PlayerInput))\n\t\treturn;\n\n\t// Load from default first\n\tPlayerInput->ForceRebuildingKeyMaps(true);\n\n\t// Override with our values\n\tPlayerInput->AxisMappings.Empty();\n\tPlayerInput->ActionMappings.Empty();\n\tGetAllInputAxisMappings(PlayerInput->AxisMappings);\n\tGetAllInputActionMappings(PlayerInput->ActionMappings);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoGameSettings::AreDefaultInputSettingsUsed() const\n{\n\treturn ModifiedInputActionMappings.Num() == 0 && ModifiedInputAxisMappings.Num() == 0;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoGameSettings::SetCharacterSkinType(ESoCharacterSkinType InCharacterSkinType)\n{\n\tCharacterSkinType = InCharacterSkinType;\n\tModifiedDateTimeCharacterSkinType = FDateTime::Now();\n\tOnCharacterSkinChanged.Broadcast();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nESoCharacterSkinType USoGameSettings::GetCharacterSkinType() const\n{\n\treturn CharacterSkinType;\n}\n"
  },
  {
    "path": "Source/SOrb/Settings/SoGameSettings.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#pragma once\n\n#include \"GameFramework/GameUserSettings.h\"\n#include \"GameFramework/PlayerInput.h\"\n\n#include \"Settings/Input/SoInputNames.h\"\n#include \"Input/SoInputSettingsTypes.h\"\n#include \"Basic/Helpers/SoPlatformHelper.h\"\n#include \"Input/SoInputSettings.h\"\n#include \"SoAudioSettingsTypes.h\"\n\n#include \"SoGameSettings.generated.h\"\n\n\nclass UPlayerInput;\nclass AGameModeBase;\nclass USoGameInstance;\n\nDECLARE_DYNAMIC_MULTICAST_DELEGATE(FSoSettingsNotify);\n\nstruct FSoGameSpeedVersion\n{\n\tenum Type\n\t{\n\t\tBeforeVersion = 0,\n\t\tInitial, // speed 1.x\n\n\t\t// -----<new versions can be added above this line>-------------------------------------------------\n\t\tVersionPlusOne,\n\t\tLatestVersion = VersionPlusOne - 1\n\t};\n};\n\n\nUENUM(BlueprintType)\nenum class ESoBounceModeType : uint8\n{\n\t// Disabled\n\tNever = 0,\n\n\t// Only enabled in easy mode\n\tOnEasy,\n\n\t// Always enabled\n\tAlways,\n\n\tNum\t\t\t\tUMETA(Hidden)\n};\n\n\nUENUM(BlueprintType)\nenum class ESoCharacterSkinType : uint8\n{\n\tClassic = 0,\n\tMummy,\n\tPumpkin,\n\n\tNum\t\t\t\tUMETA(Hidden)\n};\n\n//\n// Custom game user settings, default saved to Saved/<Platform>/GameUserSettings.ini\n//\n// InputSettings: https://answers.unrealengine.com/questions/542866/key-mapping-revert-to-default-keys.html\n// - never modifies the UInputSettings class, those are considered defaults\n// - modified keys are stored here\n//\n// Priorities (higher order takes precedence):\n// 1. Value defined in this cpp file: Property = Value, see ResetVariablesToDefault()\n// 2. Value from Config/DefaultGameUserSettings.ini (or any other default config file)\n// 3. Value set by user in Saved/<Platform>/GameUserSettings.ini\n//\n// NOTE: some values are set directly in other configs\n// - Gamma/Brightness - inside the GEngine\n// - ForceFeedbackScale/VibrationScale - in PlayerController\n// - Culture/Language - inside the config GGameUserSettingsIni the Internationalization section (See USoLocalizationHelper::SetCurrentCultureEverywhere)\n//\nUCLASS()\nclass SORB_API USoGameSettings : public UGameUserSettings\n{\n\tGENERATED_BODY()\npublic:\n\tUSoGameSettings();\n\tvirtual ~USoGameSettings();\n\n\t/** UGameUserSettings Interface */\n\tvoid SetToDefaults() override;\n\n\t/** Resets all settings to the current system settings */\n\tvoid ResetToCurrentSettings() override;\n\n\t/** Applies all the settings and saves to disk */\n\tvoid ApplySettings(bool bCheckForCommandLineOverrides) override;\n\n\t/** Loads the user settings from persistent storage */\n\tvoid LoadSettings(bool bForceReload = false) override;\n\n\t/** Save the user settings to persistent storage (automatically happens as part of ApplySettings) */\n\tvoid SaveSettings() override;\n\n\t/** Validates and resets bad user settings to default. Deletes stale user settings file if necessary. */\n\tvoid ValidateSettings() override;\n\n\t// Own functions\n\n\t// Gets the current game settings singleton\n\tUFUNCTION(BlueprintPure, DisplayName = \"Get So Game Settings\", Category = Settings)\n\tstatic USoGameSettings* GetInstance();\n\tstatic USoGameSettings& Get()\n\t{\n\t\tauto* Instance = GetInstance();\n\t\tcheck(IsValid(Instance));\n\t\treturn *Instance;\n\t}\n\n\t// Similar to SetToDefaults but only affects variables\n\tvoid ResetVariablesToDefault();\n\n\tvoid SetBlockConfigSave(bool bBlock) { bBlockConfigSave = bBlock; }\n\n\t/**\n\t *  After the mode is activated it prevents the saves\n\t *  Once it is deactivated it saves if there was any save request since the activation\n\t *  Used on switch to reduce the amount of write access\n\t */\n\tvoid SetCacheSaveRequestsMode(bool bActive);\n\n\t// Called before GameMode StartPlay\n\tvoid BeforeGameModeStartPlay();\n\n\tFString ToStringGameSettings() const\n\t{\n\t\treturn FString::Printf(\n\t\t\tTEXT(\"\\tbIsFirstTimeGameStarted = %d\\n\")\n\t\t\tTEXT(\"\\tbDisplayFPS = %d, bDisplayTime = %d, bDisplayDamageTexts = %d, bDisplayEnemyHealthBar = %d, bDisplayFloatingVOLines = %d, bDisplayStat = %d\\n\")\n\t\t\tTEXT(\"\\tbPauseGameWhenUnfocused = %d, bPauseGameOnIdle = %d, IdleTimeSecondsBeforeGamePause = %f\\n\")\n\t\t\tTEXT(\"\\tBounceModeType = %d\\n\")\n\t\t\tTEXT(\"\\tCharacterSkinType = %d\\n\")\n\t\t\tTEXT(\"\\tbCollectGameAnalytics = %d, UnixTimeModifiedCollectGameAnalytics = %lld, bWaitForAnalyticsToSend = %d\\n\")\n\t\t\tTEXT(\"\\tAnalyticsWaitSeconds = %s, AnalyticsProcessEventsSeconds = %s\\n\")\n\t\t\tTEXT(\"\\tbAutoSaveAndLoad = %d, bAutoBackupDeletedSaves = %d, bAutoBackupBeforeSave = %d\"),\n\t\t\tbIsFirstTimeGameStarted,\n\t\t\tbDisplayFPS, bDisplayTime, bDisplayDamageTexts, bDisplayEnemyHealthBar, bDisplayFloatingVOLines, bDisplayStat,\n\t\t\tbPauseGameWhenUnfocused, bPauseGameOnIdle, IdleTimeSecondsBeforeGamePause,\n\t\t\tstatic_cast<int32>(BounceModeType),\n\t\t\tstatic_cast<int32>(CharacterSkinType),\n\t\t\tbCollectGameAnalytics, UnixTimeModifiedCollectGameAnalytics, bWaitForAnalyticsToSend,\n\t\t\t*FString::SanitizeFloat(AnalyticsWaitSeconds), *FString::SanitizeFloat(AnalyticsProcessEventsSeconds),\n\t\t\tbAutoSaveAndLoad, bAutoBackupDeletedSaves, bAutoBackupBeforeSave\n\t\t);\n\t}\n\n\tFString ToStringScalabilitySettings() const\n\t{\n\t\treturn FString::Printf(\n\t\t\tTEXT(\"Scalability:\\n\")\n\t\t\tTEXT(\"\\tResolutionQuality = %s, ViewDistanceQuality = %d, AntiAliasingQuality = %d\\n\")\n\t\t\tTEXT(\"\\tShadowQuality = %d, PostProcessQuality = %d, TextureQuality = %d\\n\")\n\t\t\tTEXT(\"\\tEffectsQuality = %d, FoliageQuality = %d\"),\n\t\t\t*FString::SanitizeFloat(ScalabilityQuality.ResolutionQuality), ScalabilityQuality.ViewDistanceQuality, ScalabilityQuality.AntiAliasingQuality,\n\t\t\tScalabilityQuality.ShadowQuality, ScalabilityQuality.PostProcessQuality, ScalabilityQuality.TextureQuality,\n\t\t\tScalabilityQuality.EffectsQuality, ScalabilityQuality.FoliageQuality\n\t\t);\n\t}\n\n\tFString ToStringDisplaySettings() const\n\t{\n\t\tconst FString ScalabilityString = ToStringScalabilitySettings();\n\t\treturn FString::Printf(\n\t\t\tTEXT(\"\\tResolutionSizeX = %u, ResolutionSizeY = %u\\n\")\n\t\t\tTEXT(\"\\tLastUserConfirmedResolutionSizeX = %u, LastUserConfirmedResolutionSizeY = %u\\n\")\n\t\t\tTEXT(\"\\tbUseDesiredScreenHeight = %d, DesiredScreenWidth = %d, DesiredScreenHeight = %d\\n\")\n\t\t\tTEXT(\"\\tFrameRateLimit = %s, MinResolutionScale = %s\\n\")\n\t\t\tTEXT(\"\\tWindowPosX = %d, WindowPosY = %d\\n\")\n\t\t\tTEXT(\"\\tFullscreenMode = %d, LastConfirmedFullscreenMode = %d, PreferredFullscreenMode = %d, IsWindowModeFullScreen = %d\\n\")\n\t\t\tTEXT(\"\\tbVolumetricFog = %d\\n\")\n\t\t\tTEXT(\"\\tbForceWeakHardwareOptimizations = %d\\n\")\n\t\t\tTEXT(\"\\n\\t%s\"),\n\t\t\tResolutionSizeX, ResolutionSizeY,\n\t\t\tLastUserConfirmedResolutionSizeX, LastUserConfirmedResolutionSizeY,\n\t\t\tbUseDesiredScreenHeight, DesiredScreenWidth, DesiredScreenHeight,\n\t\t\t*FString::SanitizeFloat(FrameRateLimit), *FString::SanitizeFloat(MinResolutionScale),\n\t\t\tWindowPosX, WindowPosY,\n\t\t\tFullscreenMode, LastConfirmedFullscreenMode, PreferredFullscreenMode, IsWindowModeFullScreen(),\n\t\t\tbVolumetricFog,\n\t\t\tbForceWeakHardwareOptimizations,\n\t\t\t*ScalabilityString\n\t\t);\n\t}\n\n\tFString ToStringAudioSettings() const\n\t{\n\t\treturn FString::Printf(\n\t\t\tTEXT(\"\\tAudioQualityLevel = %d, bMuteAudio = %d\\n\")\n\t\t\tTEXT(\"\\tVolumeMaster = %s, VolumeMusic = %s, VolumeSFX = %s\"),\n\t\t\tAudioQualityLevel, bMuteAudio,\n\t\t\t*FString::SanitizeFloat(VolumeMaster), *FString::SanitizeFloat(VolumeMusic), *FString::SanitizeFloat(VolumeSFX)\n\t\t);\n\t}\n\n\tFString ToString() const\n\t{\n\t\treturn FString::Printf(\n\t\t\tTEXT(\"GameSettings:\\n\")\n\t\t\tTEXT(\"\\tVersion = %u\\n\")\n\t\t\tTEXT(\"\\n%s\\n\")\n\t\t\tTEXT(\"\\n%s\\n\")\n\t\t\tTEXT(\"\\n%s\\n\"),\n\t\t\tVersion, *ToStringGameSettings(), *ToStringDisplaySettings(), *ToStringAudioSettings()\n\t\t);\n\t}\n\n\t// Sets the reference world object, used to get the UWorld\n\tUFUNCTION(BlueprintCallable, Category = \">Settings\")\n\tvoid SetWorldContextObject(UObject* InWorldContextObject) { WorldContextObject = InWorldContextObject; }\n\n\tUObject* GetWorldContextObject() const { return WorldContextObject; }\n\n\t/** Logs out game metrics */\n\tvoid PrintToLog() const;\n\n\t// Apply only the game settings\n\t// NOTE: this does not reset all settings, use ApplySettings for that\n\tUFUNCTION(BlueprintCallable, Category = \">Settings|Game\")\n\tvoid ApplyGameSettings(bool bCheckForCommandLineOverrides, bool bSaveSettings = true);\n\n\t// Sets the custom game settings to default\n\t// NOTE: this does not reset all settings, use SetToDefaults for that\n\tUFUNCTION(BlueprintCallable, Category = \">Settings|Game\")\n\tvoid SetGameSettingsToDefault();\n\tvoid ResetGameSettingsVariables();\n\n\t// Validates and resets bad game settings\n\t// NOTE: this does not validate all settings, use ValidateSettings for that\n\tUFUNCTION(BlueprintCallable, Category = \">Settings|Game\")\n\tvoid ValidateGameSettings();\n\n\t////////////////////////////////////////////////////\n\t// Video Demo settings\n\t// Used  for conferences\n\t////////////////////////////////////////////////////\n\n\tUFUNCTION(BlueprintPure, Category = \">Settings|Demo\")\n\tbool CanVideoDemoDisableMenu() const { return bVideoDemoDisableMainMenu; }\n\n\tUFUNCTION(BlueprintCallable, Category = \">Settings|Demo\")\n\tvoid SetIsVideoDemoDisableMenu(bool bValue) { bVideoDemoDisableMainMenu = bValue; }\n\n\tUFUNCTION(BlueprintPure, Category = \">Settings|Demo\")\n\tbool CanVideoDemoStartVideoOnIdle() const { return bVideoDemoStartVideoOnIdle; }\n\n\tUFUNCTION(BlueprintCallable, Category = \">Settings|Demo\")\n\tvoid SetVideoDemoStartVideoOnIdle(bool bValue) { bVideoDemoStartVideoOnIdle = bValue; }\n\n\tUFUNCTION(BlueprintPure, Category = \">Settings|Game\")\n\tfloat GetVideoDemoIdleTimeSecondsStartVideo() const { return VideoDemoIdleTimeSecondsStartVideo; }\n\n\tUFUNCTION(BlueprintCallable, Category = \">Settings|Game\")\n\tvoid SetVideoDemoIdleTimeSecondsStartVideo(float InValue) { VideoDemoIdleTimeSecondsStartVideo = InValue; }\n\n\t////////////////////////////////////////////////////\n\t// Game settings\n\t////////////////////////////////////////////////////\n\n\t// Called when the player selects the language the first time before anything else is displayed\n\tUFUNCTION(BlueprintCallable, Category = \">Settings|Game\")\n\tvoid OnLanguageSelected();\n\n\tUFUNCTION(BlueprintPure, Category = \">Settings|Game\")\n\tbool WasLanguageSelected() const { return bLanguageAlreadySelected; }\n\n\t// Is the game starting for the first time?\n\tbool IsFirstTimeGameStarted() const { return bIsFirstTimeGameStarted; }\n\n\t// Custom maps support\n\tbool AreCustomMapsEnabled() const { return bCustomMapsEnabled; }\n\tvoid SetAreCustomMapsEnabled(bool bValue) { bCustomMapsEnabled = bValue; }\n\n\tUFUNCTION(BlueprintPure, Category = \">Settings|Game\")\n\tbool IsDisplayFPSEnabled() const { return bDisplayFPS; }\n\n\tUFUNCTION(BlueprintPure, Category = \">Settings|Game\")\n\tbool IsDisplayTimeEnabled() const { return bDisplayTime; }\n\n\tUFUNCTION(BlueprintPure, Category = \">Settings|Game\")\n\tbool IsDisplayDamageTextsEnabled() const { return bDisplayDamageTexts; }\n\n\tUFUNCTION(BlueprintPure, Category = \">Settings|Game\")\n\tbool IsDisplayEnemyHealthBarEnabled() const { return bDisplayEnemyHealthBar; }\n\n\tUFUNCTION(BlueprintPure, Category = \">Settings|Game\")\n\tbool IsDisplayFloatingVOLinesEnabled() const { return bDisplayFloatingVOLines; }\n\n\tUFUNCTION(BlueprintPure, Category = \">Settings|Game\")\n\tbool IsDisplayedStatsEnabled() const { return bDisplayStat; }\n\n\tUFUNCTION(BlueprintPure, Category = \">Settings|Game\")\n\tbool CanPauseGameWhenUnfocused() const { return bPauseGameWhenUnfocused;  }\n\n\tUFUNCTION(BlueprintCallable, Category = \">Settings|Game\")\n\tvoid SetPauseGameWhenUnfocused(bool bEnabled) { bPauseGameWhenUnfocused = bEnabled; }\n\n\tUFUNCTION(BlueprintPure, Category = \">Settings|Game\")\n\tbool CanPauseGameOnIdle() const { return bPauseGameOnIdle; }\n\n\tUFUNCTION(BlueprintCallable, Category = \">Settings|Game\")\n\tvoid SetPauseGameOnIdle(bool bEnabled) { bPauseGameOnIdle = bEnabled; }\n\n\tUFUNCTION(BlueprintCallable, Category = \">Settings|Game\")\n\tvoid SetBounceModeType(ESoBounceModeType InBounceMode) { BounceModeType = InBounceMode; }\n\n\tUFUNCTION(BlueprintPure, Category = \">Settings|Game\")\n\tESoBounceModeType GetBounceModeType() const { return BounceModeType; }\n\n\tUFUNCTION(BlueprintCallable, Category = \">Settings|Game\")\n\tvoid SetCharacterSkinType(ESoCharacterSkinType InCharacterSkinType);\n\n\tUFUNCTION(BlueprintPure, Category = \">Settings|Game\")\n\tESoCharacterSkinType GetCharacterSkinType() const;\n\n\tUFUNCTION(BlueprintPure, Category = \">Settings|Game\")\n\tfloat GetIdleTimeSecondsBeforeGamePause() const { return IdleTimeSecondsBeforeGamePause; }\n\n\tUFUNCTION(BlueprintCallable, Category = \">Settings|Game\")\n\tvoid SetDisplayFPSEnabled(bool bEnabled) { bDisplayFPS = bEnabled; }\n\n\tUFUNCTION(BlueprintCallable, Category = \">Settings|Game\")\n\tvoid SetDisplayTimeEnabled(bool bEnabled) { bDisplayTime = bEnabled; }\n\n\tUFUNCTION(BlueprintCallable, Category = \">Settings|Game\")\n\tvoid SetDisplayDamageTexts(bool bEnabled) { bDisplayDamageTexts = bEnabled; }\n\n\tUFUNCTION(BlueprintCallable, Category = \">Settings|Game\")\n\tvoid SetDisplayEnemyHealthBar(bool bEnabled)\n\t{\n\t\tbDisplayEnemyHealthBar = bEnabled;\n\t\tOnDisplayEnemyHealthBarChanged.Broadcast();\n\t}\n\n\tUFUNCTION(BlueprintCallable, Category = \">Settings|Game\")\n\tvoid SetDisplayFloatingVOLines(bool bEnabled) { bDisplayFloatingVOLines = bEnabled; }\n\n\tUFUNCTION(BlueprintCallable, Category = \">Settings|Game\")\n\tvoid SetDisplayStatsEnabled(bool bEnabled) { bDisplayStat = bEnabled; }\n\n\tUFUNCTION(BlueprintCallable, Category = \">Settings|Game\")\n\tvoid SetCollectGameAnalyticsEnabled(bool bEnabled)\n\t{\n\t\tbCollectGameAnalytics = bEnabled;\n\t\tUnixTimeModifiedCollectGameAnalytics = FDateTime::UtcNow().ToUnixTimestamp();\n\t}\n\n\t//\n\t// Game Speed\n\t//\n\n\t// This sets the current game speed but does not store it for saving. This function is Instant.\n\t// To reverse just call ApplyGameSettings() to apply the game settings values;\n\tUFUNCTION(BlueprintCallable, Category = \">Settings|Game|Speed\")\n\tvoid SetTemporaryGameSpeed(float NewGameSpeed);\n\n\t// Was SetInstantTemporaryGameSpeed set?\n\tUFUNCTION(BlueprintPure, Category = \">Settings|Game|Speed\")\n\tbool IsTemporaryGameSpeedChanged() const;\n\n\tUFUNCTION(BlueprintPure, Category = \">Settings|Game|Speed\")\n\tfloat GetTemporaryGameSpeed() const;\n\n\t// NOTE: you must call ApplyGameSettings() for this setting to propagate\n\tUFUNCTION(BlueprintCallable, Category = \">Settings|Game|Speed\")\n\tvoid SetGameSpeed(float NewGameSpeed) { GameSpeed = FMath::Abs(NewGameSpeed); }\n\n\t// NOTE: you must call ApplyGameSettings() for this setting to propagate\n\tUFUNCTION(BlueprintCallable, Category = \">Settings|Game|Speed\")\n\tvoid ResetGameSpeedToDefault() { SetGameSpeed(DefaultGameSpeed); }\n\n\tUFUNCTION(BlueprintPure, Category = \">Settings|Game|Speed\")\n\tfloat GetGameSpeed() const { return GameSpeed; }\n\n\t// Is it changed from the default (DefaultGameSpeed)\n\tUFUNCTION(BlueprintPure, Category = \">Settings|Game|Speed\")\n\tbool IsGameSpeedChanged() const { return !FMath::IsNearlyEqual(GameSpeed, DefaultGameSpeed); }\n\n\t//\n\t// Brightness\n\t//\n\n\t// Set the Brightness. Note the valid range is between [MinBrightness, MaxBrightness]\n\t// NOTE: you must call ApplyGameSettings() for this setting to propagate\n\tUFUNCTION(BlueprintCallable, Category = \">Settings|Game|Brightness\")\n\tvoid SetBrightness(float NewBrightness)\n\t{\n\t\tBrightness = FMath::Clamp(NewBrightness, MinBrightness, MaxBrightness);\n\t}\n\n\t// Same as SetBrightness only the value of NewBrightnessNormalized is in range [0, 1]\n\t// NOTE: you must call ApplyGameSettings() for this setting to propagate\n\tUFUNCTION(BlueprintCallable, Category = \">Settings|Game|Brightness\")\n\tvoid SetBrightnessNormalized(float NewBrightnessNormalized)\n\t{\n\t\t// Get a valid value in range\n\t\tSetBrightness(FMath::Lerp(MinBrightness, MaxBrightness, FMath::Clamp(NewBrightnessNormalized, 0.f, 1.f)));\n\t}\n\n\t// Resets the Brightness to the default value (DefaultBrightness)\n\t// NOTE: you must call ApplyGameSettings() for this setting to propagate\n\tUFUNCTION(BlueprintCallable, Category = \">Settings|Game|Brightness\")\n\tvoid ResetBrightnessToDefault() { SetBrightness(DefaultBrightness); }\n\n\t// Value in range [MinBrightness, MaxBrightness]\n\tUFUNCTION(BlueprintPure, Category = \">Settings|Game|Brightness\")\n\tfloat GetBrightness() const { return Brightness; }\n\n\t// Value in range [0, 1]\n\tUFUNCTION(BlueprintPure, Category = \">Settings|Game|Brightness\")\n\tfloat GetBrightnessNormalized() const\n\t{\n\t\treturn NormalizeBrightness(GetBrightness());\n\t}\n\n\t// Converts a normal value to a normalized value in the range [0, 1]\n\tstatic float NormalizeBrightness(float Value)\n\t{\n\t\treturn (Value - MinBrightness) / (MaxBrightness - MinBrightness);\n\t}\n\tstatic bool IsEqualToDefaultNormalizedBrightness(float NormalizedValue)\n\t{\n\t\tstatic const float DefaultNormalized = NormalizeBrightness(DefaultBrightness);\n\t\treturn FMath::IsNearlyEqual(NormalizedValue, DefaultNormalized, KINDA_SMALL_NUMBER);\n\t}\n\n\t//\n\t// Gamepad vibration\n\t//\n\n\t// Set the Player Controller. Note the valid range is between [MinVibrationScale, MaxVibrationScale]\n\t// NOTE: you must call ApplyGameSettings() for this setting to propagate\n\tUFUNCTION(BlueprintCallable, Category = \">Settings|Game|Gamepad\")\n\tvoid SetVibrationScale(float NewValue)\n\t{\n\t\tVibrationScale = FMath::Clamp(NewValue, MinVibrationScale, MaxVibrationScale);\n\t}\n\n\t// Same as SetVibrationScale only the value of NewValueNormalized is in range [0, 1]\n\t// NOTE: you must call ApplyGameSettings() for this setting to propagate\n\tUFUNCTION(BlueprintCallable, Category = \">Settings|Game|Gamepad\")\n\tvoid SetVibrationScaleNormalized(float NewValueNormalized)\n\t{\n\t\t// Get a valid value in range\n\t\tSetVibrationScale(\n\t\t\tFMath::Lerp(MinVibrationScale, MaxVibrationScale, FMath::Clamp(NewValueNormalized, 0.f, 1.f))\n\t\t);\n\t}\n\n\t// Resets the VibrationScale to the default value (DefaultVibrationScale)\n\t// NOTE: you must call ApplyGameSettings() for this setting to propagate\n\tUFUNCTION(BlueprintCallable, Category = \">Settings|Game|Gamepad\")\n\tvoid ResetVibrationScaleToDefault() { SetVibrationScale(DefaultVibrationScale); }\n\n\t// Value in range [MinVibrationScale, MaxVibrationScale]\n\tUFUNCTION(BlueprintPure, Category = \">Settings|Game|Gamepad\")\n\tfloat GetVibrationScale() const { return VibrationScale; }\n\n\t// Value in range [0, 1]\n\tUFUNCTION(BlueprintPure, Category = \">Settings|Game|Gamepad\")\n\tfloat GetVibrationScaleNormalized() const\n\t{\n\t\treturn NormalizeVibrationScale(GetVibrationScale());\n\t}\n\n\t// Converts a normal value to a normalized value in the range [0, 1]\n\tstatic float NormalizeVibrationScale(float Value)\n\t{\n\t\treturn (Value - MinVibrationScale) / (MaxVibrationScale - MinVibrationScale);\n\t}\n\tstatic bool IsEqualToDefaultNormalizedVibrationScale(float NormalizedValue)\n\t{\n\t\tstatic const float DefaultNormalized = NormalizeVibrationScale(DefaultVibrationScale);\n\t\treturn FMath::IsNearlyEqual(NormalizedValue, DefaultNormalized, KINDA_SMALL_NUMBER);\n\t}\n\n\tUFUNCTION(BlueprintPure, Category = \">Settings|Game|Gamepad\")\n\tbool IsVibrationEnabled() const { return GetVibrationScale() > MinVibrationScale; }\n\n\t//\n\t// Analytics\n\t//\n\n\tUFUNCTION(BlueprintPure, Category = \">Settings|Game\")\n\tbool CanCollectGameAnalytics() const\n\t{\n\t\treturn WARRIORB_COLLECT_ANALYTICS ? bCollectGameAnalytics : false;\n\t}\n\tint64 GetUnixTimeModifiedCollectGameAnalytics() const { return UnixTimeModifiedCollectGameAnalytics; }\n\tbool WasCollectAnalyticsSetByUser() const { return UnixTimeModifiedCollectGameAnalytics > 0;  }\n\n\tUFUNCTION(BlueprintPure, Category = \">Settings|Game\")\n\tbool CanWaitForAnalyticsToSend() const { return bWaitForAnalyticsToSend; }\n\n\tvoid GetAnalyticsPollTimers(double& WaitSeconds, double& ProcessEventsSeconds) const\n\t{\n\t\tWaitSeconds = AnalyticsWaitSeconds;\n\t\tProcessEventsSeconds = AnalyticsProcessEventsSeconds;\n\t}\n\n\t//\n\t// Saves\n\t//\n\n\tUFUNCTION(BlueprintPure, Category = \">Settings|Game\")\n\tbool IsAutoSaveAndLoadEnabled() const { return bAutoSaveAndLoad; }\n\n\tUFUNCTION(BlueprintPure, Category = \">Settings|Game\")\n\tbool IsAutoBackupDeletedSavesEnabled() const { return bAutoBackupDeletedSaves; }\n\n\tUFUNCTION(BlueprintPure, Category = \">Settings|Game\")\n\tbool IsAutoBackupBeforeSaveEnabled() const { return bAutoBackupBeforeSave; }\n\n\n\t////////////////////////////////////////////////////\n\t// Display settings\n\t////////////////////////////////////////////////////\n\n\t// Moves to the corresponding monitor number, if it exists\n\t// MonitorNumber starts at 1. Corresponds to numbers from the display settings of your OS\n\t// If MonitorNumber = 0, it will use the primary display as default\n\tbool MoveToMonitor(int32 MonitorNumber, FMonitorInfo& OutMonitor);\n\n\t// Resets all video setting to current system settings\n\tUFUNCTION(BlueprintCallable, Category = \">Settings|Display\")\n\tvoid ResetToCurrentDisplaySettings();\n\n\t// Apply only the display settings\n\tUFUNCTION(BlueprintCallable, Category = \">Settings|Display\")\n\tvoid ApplyDisplaySettings(bool bCheckForCommandLineOverrides, bool bSaveSettings = true);\n\n\t// Own version of ConfirmVideoMode()/RevertVideoMode()\n\tvoid ConfirmPreviewVideoModeSettings();\n\tvoid RevertPreviewVideoModeSettings();\n\n\t// Override of the confirm video mode\n\tvoid ConfirmVideoMode() override;\n\n\t// This just changes the resolution and display mode Temporaraly\n\t// Call ConfirmPreviewVideoModeSettings to confirm\n\t// Call RevertPreviewVideoModeSettings to revert\n\tvoid PreviewVideoModeSettings();\n\n\t// Sets the display settings to default\n\tUFUNCTION(BlueprintCallable, Category = \">Settings|Display\")\n\tvoid SetDisplaySettingsToDefault();\n\tvoid ResetDisplaySettingsVariables();\n\n\t// Validates and resets bad display settings\n\tUFUNCTION(BlueprintCallable, Category = \">Settings|Display\")\n\tvoid ValidateDisplaySettings();\n\n\tUFUNCTION(BlueprintCallable, Category = \">Settings|Display\")\n\tvoid SetVolumetricFogEnabled(bool bEnabled) { bVolumetricFog = bEnabled; }\n\n\tUFUNCTION(BlueprintCallable, Category = \">Settings|Display\")\n\tvoid SetForceWeakHardwareOptimization(bool bForce)\n\t{\n\t\tbForceWeakHardwareOptimizations = bForce;\n\t\tOnForceWeakHardwareOptimizationsChanged.Broadcast();\n\t}\n\n\tUFUNCTION(BlueprintPure, Category = \">Settings|Display\")\n\tbool IsVolumetricFogEnabled() const { return bVolumetricFog; }\n\n\tUFUNCTION(BlueprintPure, Category = \">Settings|Display\")\n\tbool IsWeakHardwareOptimizationForced() const { return bForceWeakHardwareOptimizations; }\n\n\t// Is the window mode in any fullscreen configuration? (aka not windowed)\n\tbool IsWindowModeFullScreen() const\n\t{\n\t\tconst EWindowMode::Type WindowMode = GetFullscreenMode();\n\t\treturn WindowMode == EWindowMode::Fullscreen || WindowMode == EWindowMode::WindowedFullscreen;\n\t}\n\n\t// Sets the Screen Resolution to be the resolution of the primary display\n\tvoid SetScreenResolutionToPrimaryDisplayResolution();\n\n\n\t// calls RunAndApplyHardwareBenchmark once if bShouldDoHardwareBenchmark was set to true\n\tvoid RunAndApplyHardwareBenchmarkIfRequested();\n\n\t// Runs and apply the hardware benchmark.\n\tvoid RunAndApplyHardwareBenchmark();\n\n\t// Own Implementation of ScreenPercentage info/set/get\n\t// This is similar to the ResolutionScale info. But r.ScreenPercentage seems to be the accurate than sg.ResolutionQuality.\n\t// sg.ResolutionQuality seem to map directly to r.ScreenPercentage but it is clamped to 100.\n\t// See https://answers.unrealengine.com/questions/118155/difference-between-resolution-quality-and-screen-p.html\n\n\t// Returns the current resolution scale and the range\n\tUFUNCTION(BlueprintPure, Category = \">Settings|Display\")\n\tvoid GetScreenPercentageInformation(float& CurrentPercentNormalized, float& CurrentPercentValue, float& MinPercentValue, float& MaxPercentValue) const;\n\n\t// Gets the screen percentage from the console variables\n\tUFUNCTION(BlueprintPure, Category = \">Settings|Display\")\n\tfloat GetScreenPercentage() const;\n\n\t// Sets the current screen percentage\n\tUFUNCTION(BlueprintCallable, Category = \">Settings|Display\")\n\tvoid SetScreenPercentageValue(float NewScreenPercentageValue);\n\n\t// Sets the current screen percentage as a normalized 0..1 value between MinScaleValue and MaxScreenPercentage\n\tUFUNCTION(BlueprintCallable, Category = \">Settings|Display\")\n\tvoid SetScreenPercentageNormalized(float NewScaleNormalized);\n\n\t// Makes sure the our settings are in the range we desire for our game\n\tvoid EnsureCustomQualityLimits()\n\t{\n\t\t// NOTE: do not force here, shrug\n\t\tSetScreenPercentageValue(GetScreenPercentage());\n\t}\n\n\t//\n\t// 0:low, 1:med, 2:high, 3:epic, 4:cinematic\n\n\t////////////////////////////////////////////////////\n\t// Audio settings\n\t////////////////////////////////////////////////////\n\n\t// Resets all audio settings to current system settings\n\tUFUNCTION(BlueprintCallable, Category = \">Settings|Audio\")\n\tvoid ResetToCurrentAudioSettings();\n\n\t// Apply only the audio settings\n\tUFUNCTION(BlueprintCallable, Category = \">Settings|Audio\")\n\tvoid ApplyAudioSettings(bool bCheckForCommandLineOverrides, bool bSaveSettings = true);\n\n\t// Sets the audio settings to default\n\tUFUNCTION(BlueprintCallable, Category = \">Settings|Audio\")\n\tvoid SetAudioSettingsToDefault();\n\tvoid ResetAudioSettingsVariables();\n\n\t/** Are the default audio setting used? */\n\tUFUNCTION(BlueprintCallable, Category = \">Settings|Audio\")\n\tbool AreDefaultAudioSettingsUsed() const;\n\n\t// Validates and resets bad audio settings\n\tUFUNCTION(BlueprintCallable, Category = \">Settings|Audio\")\n\tvoid ValidateAudioSettings();\n\n\tUFUNCTION(BlueprintPure, Category = \">Settings|Audio\")\n\tbool IsAudioMuted() const { return bMuteAudio; }\n\n\tUFUNCTION(BlueprintCallable, Category = \">Settings|Audio\")\n\tvoid SetIsAudioMuted(bool bMute) { bMuteAudio = bMute; }\n\n\tUFUNCTION(BlueprintPure, Category = \">Settings|Audio\")\n\tfloat GetVolumeMaster() const { return VolumeMaster; }\n\n\tUFUNCTION(BlueprintCallable, Category = \">Settings|Audio\")\n\tvoid SetVolumeMaster(float InVolume) { VolumeMaster = InVolume; }\n\n\tUFUNCTION(BlueprintPure, Category = \">Settings|Audio\")\n\tfloat GetVolumeMusic() const { return VolumeMusic; }\n\n\tUFUNCTION(BlueprintCallable, Category = \">Settings|Audio\")\n\tvoid SetVolumeMusic(float InVolume) { VolumeMusic = InVolume; }\n\n\tUFUNCTION(BlueprintPure, Category = \">Settings|Audio\")\n\tfloat GetVolumeSFX() const { return VolumeSFX; }\n\n\tUFUNCTION(BlueprintCallable, Category = \">Settings|Audio\")\n\tvoid SetVolumeSFX(float InVolume) { VolumeSFX = InVolume; }\n\n\tUFUNCTION(BlueprintPure, Category = \">Settings|Audio\")\n\tbool IsAudioMutedWhenUnfocused() const { return bMuteAudioWhenUnfocused; }\n\n\tUFUNCTION(BlueprintCallable, Category = \">Settings|Audio\")\n\tvoid SetIsAudioMutedWhenUnfocused(bool bMute) { bMuteAudioWhenUnfocused = bMute; }\n\n\tUFUNCTION(BlueprintPure, Category = \">Settings|Audio\")\n\tbool IsVoiceGibberishMuted() const { return bMuteVoiceGibberish; }\n\n\tUFUNCTION(BlueprintCallable, Category = \">Settings|Audio\")\n\tvoid SetIsVoiceGibberishMuted(bool bMute) { bMuteVoiceGibberish = bMute; }\n\n\tUFUNCTION(BlueprintPure, Category = \">Settings|Audio\")\n\tbool IsDialogueVoiceGibberishMuted() const { return bMuteDialogueVoiceGibberish; }\n\n\tUFUNCTION(BlueprintCallable, Category = \">Settings|Audio\")\n\tvoid SetIsDialogueVoiceGibberishMuted(bool bMute) { bMuteDialogueVoiceGibberish = bMute; }\n\n\n\t////////////////////////////////////////////////////\n\t// Input settings\n\t////////////////////////////////////////////////////\n\n\t// Apply only the input settings\n\tUFUNCTION(BlueprintCallable, Category = \">Settings|Input\")\n\tvoid ApplyInputSettings(bool bSaveSettings = true, bool bForce = false);\n\n\t// Resets the input settings used by the user to the default ones\n\tUFUNCTION(BlueprintCallable, Category = \">Settings|Input\")\n\tvoid SetInputSettingsToDefault();\n\tvoid ResetInputSettingsVariables();\n\n\t// Sets the default input bindings\n\t// NOTE: modifies both keyboard + gamepad\n\tUFUNCTION(BlueprintCallable, Category = \">Settings|Input\")\n\tvoid SetInputBindingsToDefault();\n\n\t// Sets the default input bindings for keyboard\n\tUFUNCTION(BlueprintCallable, Category = \">Settings|Input\")\n\tvoid SetKeyboardInputBindingsToDefault();\n\n\tUFUNCTION(BlueprintCallable, Category = \">Settings|Input\")\n\tvoid SetGamepadInputBindingsToDefault();\n\n\t// Sets GamepadUIType\n\t// or bAutoDetectGamepadUIType = true\n\tbool TryAutoSetGamepadLayout();\n\n\t// Auto detect magic\n\t// Returns true if GamepadUI changed\n\tbool AutoSetGamepadLayoutFromConnectedGamepad();\n\n\tUFUNCTION(BlueprintPure, Category = \">Settings|Input\")\n\tESoGamepadLayoutType GetGamepadLayoutType() const;\n\n\tUFUNCTION(BlueprintCallable, Category = \">Settings|Input\")\n\tvoid SetGamepadLayoutType(ESoGamepadLayoutType UIType) { GamepadUIType = UIType; }\n\n\tUFUNCTION(BlueprintPure, Category = \">Settings|Input\")\n\tbool IsAutoDetectGamepadLayout() const\n\t{\n\t\t// Disabled as this is too flaky\n\t\treturn false; //bAutoDetectGamepadUIType;\n\t}\n\n\tUFUNCTION(BlueprintCallable, Category = \">Settings|Input\")\n\tvoid SetAutoDetectGamepadLayout(bool InValue);\n\n\tUFUNCTION(BlueprintPure, Category = \">Settings|Input\")\n\tbool UseKeyboardArrowPresetAsDefault() const { return bUseKeyboardArrowPresetAsDefault; }\n\n\tUFUNCTION(BlueprintCallable, Category = \">Settings|Input\")\n\tvoid SetUseKeyboardArrowPresetAsDefault(bool InValue) { bUseKeyboardArrowPresetAsDefault = InValue; }\n\n\tUFUNCTION(BlueprintPure, Category = \">Settings|Input\")\n\tFORCEINLINE bool HasActionNamesForGamepadKey(FName GamepadKeyName) const\n\t{\n\t\treturn GamepadKeyToGameActionNameMap.Contains(GamepadKeyName);\n\t}\n\n\tUFUNCTION(BlueprintPure, Category = \">Settings|Input\")\n\tFORCEINLINE bool HasUIActionNamesForGamepadKey(FName GamepadKeyName) const\n\t{\n\t\treturn GamepadKeyToUIActionNameMap.Contains(GamepadKeyName);\n\t}\n\n\tUFUNCTION(BlueprintPure, Category = \">Settings|Input\")\n\tconst TArray<FName>& GetActionNamesForGamepadKey(FName GamepadKeyName) const\n\t{\n\t\tstatic const TArray<FName> EmptyArray;\n\t\tif (const TArray<FName> *ArrayPtr = GamepadKeyToGameActionNameMap.Find(GamepadKeyName))\n\t\t\treturn *ArrayPtr;\n\n\t\treturn EmptyArray;\n\t}\n\n\tUFUNCTION(BlueprintPure, Category = \">Settings|Input\")\n\tconst TArray<FName>& GetUIActionNamesForGamepadKey(FName GamepadKeyName) const\n\t{\n\t\tstatic const TArray<FName> EmptyArray;\n\t\tif (const TArray<FName> *ArrayPtr = GamepadKeyToUIActionNameMap.Find(GamepadKeyName))\n\t\t\treturn *ArrayPtr;\n\n\t\treturn EmptyArray;\n\t}\n\n\t// Refreshes the cached InputActionMappings and InputAxisMappings from the InputSettings\n\tUFUNCTION(BlueprintCallable, Category = \">Settings|Input\")\n\tvoid RefreshInputSettingsMappings();\n\n\t// Set the input settings to the provided preset\n\tUFUNCTION(BlueprintCallable, Category = \">Settings|Input\")\n\tbool SetInputToPreset(const FSoInputPreset& Preset);\n\n\t// Helper function\n\tUFUNCTION(BlueprintCallable, Category = \">Settings|Input\")\n\tbool SetInputToPresetKeyboardArrows();\n\n\t// Rebind OldKeyMapping to the NewInputChord\n\tbool RebindInputKeyToInputChord(const FInputActionKeyMapping& OldKeyMapping, const FInputChord& NewInputChord, bool bCheckExistingBinding, bool bUnbindExisting);\n\n\t// Rebind OldKeyMapping to the NewKeyMapping\n\tbool RebindInputKey(const FInputActionKeyMapping& OldKeyMapping, const FInputActionKeyMapping& NewKeyMapping, bool bCheckExistingBinding, bool bUnbindExisting);\n\n\t// // Add from vanilla, no old modified\n\t// bool AddInputBindingForActionName(FName ActionName, const FInputActionKeyMapping& NewKeyMapping, bool bCheckExistingBinding, bool bUnbindExisting)\n\t// {\n\t// \tFInputActionKeyMapping OldKeyMapping;\n\t// \tOldKeyMapping.ActionName = ActionName;\n\t// \treturn RebindInputKey(OldKeyMapping, NewKeyMapping, bCheckExistingBinding, bUnbindExisting);\n\t// }\n\n\t// Reverse of RebindInputKey\n\tbool UnbindInputActionMapping(const FInputActionKeyMapping& OldKeyMapping);\n\tbool UnbindKeyboardInputActionMapping(const FInputActionKeyMapping& OldKeyMapping);\n\tbool UnbindAllKeyboardInputsForActionName(FName ActionName);\n\n\t// Unbinds all the ActionMappings\n\tvoid UnbindInputActionMappings(const TArray<FInputActionKeyMapping>& ActionMappings);\n\n\t// Gets the default FInputActionKeyMapping for the ModifiedKeyMapping,\n\t// NOTE: same as GetDefaultInputActionMappingsForModified only this is public facing and should return only one result\n\tUFUNCTION(BlueprintPure, Category = \">Settings|Input\")\n\tbool GetDefaultInputActionMapping(const FInputActionKeyMapping& ModifiedMapping, FInputActionKeyMapping& OutDefault) const;\n\n\t// Rebinds the ModifiedMapping to the default one if it can.\n\tUFUNCTION(BlueprintCallable, Category = \">Settings|Input\")\n\tbool SetInputActionMappingToDefault(const FInputActionKeyMapping& ModifiedMapping, bool bUnbindExisting, bool bUsePreset = false);\n\n\t// Is the InputChord already used?\n\t// If bOnlyForTheActionCategory = true then we return the duplicates only for the category that corresponds for ForActionName\n\tbool IsInputChordAlreadyUsed(FName ForActionName, const FInputChord& InputChord, ESoInputActionCategoryType FilterCategory, TArray<FInputActionKeyMapping>& OutByActionMappings) const;\n\n\t// Same as IsInputChordAlreadyUsed only does it with a key\n\tbool IsInputKeyAlreadyUsed(FName ForActionName, FKey Key, ESoInputActionCategoryType FilterCategory, TArray<FInputActionKeyMapping>& OutByActionMappings) const\n\t{\n\t\tconst FInputChord InputChord{ Key };\n\t\treturn IsInputChordAlreadyUsed(ForActionName, InputChord, FilterCategory, OutByActionMappings);\n\t}\n\n\t// Check if FirstActionName and SecondActionName have the same assigned key for the specified input device (either keyboard or gamepad)\n\tbool DoActionNamesHaveTheSameKey(FName FirstActionName, FName SecondActionName, bool bIsKeyboard);\n\n\t// Gets the InActionName action key mappings array. This is O(1) compared to UInputSettings O(n)\n\tUFUNCTION(BlueprintPure, Category = \">Settings|Input\")\n\tconst TArray<FInputActionKeyMapping>& GetInputActionMappingsForActionName(FName ActionName) const;\n\n\t// Helper method: Gets only the keyboard input action names\n\tUFUNCTION(BlueprintPure, Category = \">Settings|Input\")\n\tTArray<FInputActionKeyMapping> GetKeyboardInputActionMappingsForActionName(FName ActionName, bool bIncludeUnbound) const;\n\n\t// Helper method: Gets only the gamepad input action names\n\tUFUNCTION(BlueprintPure, Category = \">Settings|Input\")\n\tTArray<FInputActionKeyMapping> GetGamepadInputActionMappingsForActionName(FName ActionName, bool bIncludeUnbound) const;\n\n\t// Gets the InAxisName action mappings array. This is O(1) compared to UInputSettings O(n)\n\tUFUNCTION(BlueprintPure, Category = \">Settings|Input\")\n\tconst TArray<FInputAxisKeyMapping>& GetInputAxisMappingForAxisName(FName AxisName) const;\n\n\t/** Are the default user input settings used? */\n\tUFUNCTION(BlueprintPure, Category = \">Settings|Input\")\n\tbool AreDefaultInputSettingsUsed() const;\n\n\t/** Is the provided KeyMapping a default one? From Config/DefaultInput.ini  */\n\tUFUNCTION(BlueprintPure, Category = \">Settings|Input\")\n\tbool IsInputActionMappingDefault(const FInputActionKeyMapping& CheckKeyMapping, bool bUsePreset = false) const;\n\n\t/** Is the provided AxisMapping a default one? From Config/DefaultInput.ini  */\n\tUFUNCTION(BlueprintPure, Category = \">Settings|Input\")\n\tbool IsInputAxisMappingDefault(const FInputAxisKeyMapping& CheckAxisMapping) const;\n\n\t/** Rebuilds all the input key maps of all player inputs */\n\tUFUNCTION(BlueprintCallable, Category = \">Settings|Input\")\n\tvoid RebuildInputKeymapsForAllPlayers() const;\n\n\t/** Rebuilds only the input key map of the PlayerInput  */\n\tUFUNCTION(BlueprintCallable, Category = \">Settings|Input\")\n\tvoid RebuildInputKeymapsForPlayerInput(UPlayerInput* PlayerInput) const;\n\n\tUPROPERTY(BlueprintAssignable, Category = \">Settings|Events\")\n\tFSoSettingsNotify OnInputSettingsApplied;\n\n\tUPROPERTY(BlueprintAssignable, Category = \">Settings|Events\")\n\tFSoSettingsNotify OnForceWeakHardwareOptimizationsChanged;\n\n\tUPROPERTY(BlueprintAssignable, Category = \">Settings|Events\")\n\tFSoSettingsNotify OnDisplayEnemyHealthBarChanged;\n\n\tUPROPERTY(BlueprintAssignable, Category = \">Settings|Events\")\n\tFSoSettingsNotify OnCharacterSkinChanged;\n\nprotected:\n\t// UGameUserSettings Interface\n\tbool IsVersionValid() override;\n\tvoid UpdateVersion() override;\n\n\t// Own methods\n\n\t// Getter so that we only have one place where we set the default audio settings\n\tstatic const FSoAudioSettings& GetDefaultAudioSettings()\n\t{\n\t\tstatic const FSoAudioSettings Default{};\n\t\treturn Default;\n\t}\n\n\t////////////////////////////////////////////////////\n\t// Input settings\n\t////////////////////////////////////////////////////\n\n\t// Generates the map for InputActionMappings\n\tTMap<FName, TArray<FInputActionKeyMapping>> GenerateInputActionMappings() const;\n\n\tvoid EnsureActionNamesAreInSyncIfModified(const FSoInputActionKeyMapping& ActionMapping);\n\tvoid EnsureUnbindingDoesNotBreakGame(const FSoInputActionKeyMapping& ActionMapping);\n\n\t// Gets the modified key mappings for the default key mapping\n\tTArray<FSoInputActionKeyMapping> GetModifiedInputActionMappingsForDefault(const FInputActionKeyMapping& DefaultKeyMapping) const;\n\n\t// Gets the default key mappings for the modified key mapping\n\tTArray<FInputActionKeyMapping> GetDefaultInputActionMappingsForModified(const FInputActionKeyMapping& ModifiedKeyMapping) const;\n\n\t// Gets the modified axis mappings for the default axis mappings\n\tTArray<FSoInputAxisKeyMapping> GetModifiedInputAxisMappingsForDefault(const FInputAxisKeyMapping& DefaultAxisMapping) const;\n\n\t// Deduce the axis mapping we need to modify from the modified ActionMapping. False if we there is nothing to deduce\n\tbool GetModifiedInputAxisMappingForActionMapping(const FSoInputActionKeyMapping& ActionMapping, FName AxisNameToModify, FSoInputAxisKeyMapping& OutAxisMapping) const;\n\n\t/** Adds the ActionMapping into the ModifiedInputActionMappings.  */\n\tbool AddModifiedInputActionMapping(const FSoInputActionKeyMapping& ActionMapping);\n\n\t/** Adds the AxisMapping into the ModifiedInputAxisMappings. */\n\tbool AddModifiedInputAxisMapping(const FSoInputAxisKeyMapping& AxisMapping);\n\n\t/** Removes all the modified action mappings that have the default as DefaultKeyMapping */\n\tvoid RemoveModifiedInputActionMappingsForActionName(FName ActionName);\n\tvoid RemoveModifiedInputActionMappingsForDefault(const FInputActionKeyMapping& DefaultKeyMapping);\n\n\t/** Removes all the modified axis mappings that have the default as DefaultAxisMapping */\n\tvoid RemoveModifiedInputAxisMappingsForDefault(const FInputAxisKeyMapping& DefaultAxisMapping);\n\n\t// Converts InputActionMappings into a TArray\n\tvoid GetAllInputActionMappings(TArray<FInputActionKeyMapping>& OutMappings) const;\n\n\t// Converts InputAxisMappings into a TArray\n\tvoid GetAllInputAxisMappings(TArray<FInputAxisKeyMapping>& OutMappings) const;\n\n\t// Checks if the ActionMapping is valid\n\tESoInputIntegrity ValidateModifiedInputActionMapping(const FSoInputActionKeyMapping& ActionMapping, bool bLog = true) const;\n\n\t// Checks if the ActionMapping is valid;\n\tESoInputIntegrity ValidateModifiedInputAxisMapping(const FSoInputAxisKeyMapping& AxisMapping, bool bLog = true) const;\n\n\t// Checks if the modified input settings are valid if they are not it tries to \"repair\" them\n\tvoid CheckAndRepairModifiedInputSettings();\n\nprotected:\n\t//\n\t// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n\t// NOTE: The defaults are set in the construct and that calls a general reset function\n\t// This is because we want to modify it in only one place instead of two\n\t// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n\n\t////////////////////////////////////////////////////\n\t// Video Demo settings\n\t////////////////////////////////////////////////////\n\n\t// If this is enabled we try to disables the main menu\n\tUPROPERTY(Config)\n\tbool bVideoDemoDisableMainMenu;\n\n\t// Should we start video loop\n\tUPROPERTY(Config)\n\tbool bVideoDemoStartVideoOnIdle;\n\n\t// If <= 0 then this is disabled\n\tUPROPERTY(Config)\n\tfloat VideoDemoIdleTimeSecondsStartVideo;\n\n\t////////////////////////////////////////////////////\n\t// Game settings\n\t////////////////////////////////////////////////////\n\n\tUPROPERTY(Config)\n\tbool bDisplayFPS;\n\n\tUPROPERTY(Config)\n\tbool bDisplayTime;\n\n\tUPROPERTY(Config)\n\tbool bDisplayDamageTexts;\n\n\tUPROPERTY(Config)\n\tbool bDisplayEnemyHealthBar;\n\n\tUPROPERTY(Config)\n\tbool bDisplayFloatingVOLines;\n\n\tUPROPERTY(Config)\n\tbool bDisplayStat;\n\n\t// Should we pause the game when the game is in the background\n\t// Other options is to idle: Set t.IdleWhenNotForeground=1\n\tUPROPERTY(Config)\n\tbool bPauseGameWhenUnfocused;\n\n\t// Should the game pause when we are idling over IdleTimeSecondsBeforeGamePause\n\tUPROPERTY(Config)\n\tbool bPauseGameOnIdle;\n\n\t// If the user reaches this idle time then the game pauses\n\t// If <= 0 then this is disabled\n\tUPROPERTY(Config)\n\tfloat IdleTimeSecondsBeforeGamePause;\n\n\t// Started game for the first time.\n\t// NOTE: Saved/Config/<Platform>/GameUserSettings does not work properly\n\tUPROPERTY(Config)\n\tbool bIsFirstTimeGameStarted;\n\n\t// Can we use the custom maps?\n\tUPROPERTY(Config)\n\tbool bCustomMapsEnabled;\n\n\t// Screen percentage screen var\n\tconst TCHAR* ScreenPercentageVariable = TEXT(\"r.ScreenPercentage\");\n\n\t//\n\t// Language selection - only first time\n\t//\n\n\tUPROPERTY(Config)\n\tbool bLanguageAlreadySelected;\n\n\t//\n\t// Game Speed\n\t//\n\n\t// Keep track of the game speed version\n\tUPROPERTY(config)\n\tuint32 GameSpeedVersion = 0;\n\n\t// The current game speed multiplier\n\tUPROPERTY(Config)\n\tfloat GameSpeed;\n\n\t//\n\t// Brightness\n\t//\n\n\t// The current screen brightness\n\tUPROPERTY(Config)\n\tfloat Brightness;\n\n\t//\n\t// Gamepad vibration\n\t//\n\n\t// The current gamepad vibration scale\n\tUPROPERTY(Config)\n\tfloat VibrationScale;\n\n\t//\n\t// Analytics\n\t//\n\n\t// Does the user allow us to collect anonymous game analytics?\n\tUPROPERTY(Config)\n\tbool bCollectGameAnalytics;\n\n\t// NOTE: the following settings are not not configured in the settings, so no functions in this class affects this, only\n\t// changing this in the settings file can actually change these value.\n\n\t// Unix time at which, bCollectGameAnalyticswas set to true\n\t// If 0 - then it was set in the default config\n\t// If INDEX_NONE - then it means the user did not accept anything\n\tUPROPERTY(Config)\n\tint64 UnixTimeModifiedCollectGameAnalytics;\n\n\t// Should the game wait at the end for all analytics to send?\n\tUPROPERTY(Config)\n\tbool bWaitForAnalyticsToSend;\n\n\t// For analytics wait thread. Default is 1.\n\tUPROPERTY(Config)\n\tdouble AnalyticsWaitSeconds;\n\n\t// For Analytics process events thread. Default is 8.\n\tUPROPERTY(Config)\n\tdouble AnalyticsProcessEventsSeconds;\n\n\t//\n\t// BounceMode\n\t//\n\n\tUPROPERTY(Config)\n\tESoBounceModeType BounceModeType = ESoBounceModeType::Always;\n\n\t// Value used if for non custom events\n\tUPROPERTY(Config)\n\tESoCharacterSkinType CharacterSkinType = ESoCharacterSkinType::Classic;\n\n\t// Used to save CharacterSkinType if we are overriding it for a custom event\n\tUPROPERTY(Config)\n\tESoCharacterSkinType PreviousCharacterSkinType = ESoCharacterSkinType::Classic;\n\n\t// Keep track of set times\n\tUPROPERTY(Config)\n\tFDateTime ModifiedDateTimePreviousCharacterSkinType = FDateTime::MinValue();\n\tUPROPERTY(Config)\n\tFDateTime ModifiedDateTimeCharacterSkinType = FDateTime::MinValue();\n\n\t//\n\t// Saves\n\t//\n\n\t// Auto save and load in game.\n\tUPROPERTY(Config)\n\tbool bAutoSaveAndLoad;\n\n\t// Create backup files for deleted files (before they are deleted)\n\tUPROPERTY(Config)\n\tbool bAutoBackupDeletedSaves;\n\n\t// Create a backup file before saving each save file\n\tUPROPERTY(Config)\n\tbool bAutoBackupBeforeSave;\n\n\n\t////////////////////////////////////////////////////\n\t// Display settings\n\t////////////////////////////////////////////////////\n\n\tUPROPERTY(Config)\n\tbool bVolumetricFog;\n\n\tUPROPERTY(Config)\n\tbool bForceWeakHardwareOptimizations;\n\n\t// We need to store these ourselfs, otherwise we can't preview the new resolution\n\t// Because if we call FSystemResolution::RequestResolutionChange\n\t// It will also ConfirmVideoMode() making LastUserConfirmed variables useless for us\n\tbool bIsPreviewVideoMode = false;\n\tuint32 BeforePreviewResolutionSizeX = 0;\n\tuint32 BeforePreviewResolutionSizeY = 0;\n\tint32 BeforePreviewFullscreenMode = 0;\n\n\t////////////////////////////////////////////////////\n\t// Audio settings\n\t// NOTE: Change defaults in C++ in GetDefaultAudioSettings()\n\t////////////////////////////////////////////////////\n\n\tUPROPERTY(Config)\n\tbool bMuteAudio;\n\n\tUPROPERTY(Config)\n\tfloat VolumeMaster;\n\n\tUPROPERTY(Config)\n\tfloat VolumeMusic;\n\n\tUPROPERTY(Config)\n\tfloat VolumeSFX;\n\n\t// Mutes the audio when the game is in background\n\tUPROPERTY(Config)\n\tbool bMuteAudioWhenUnfocused;\n\n\t// Should we mute the gibberish voices?\n\tUPROPERTY(Config)\n\tbool bMuteVoiceGibberish;\n\n\tUPROPERTY(Config)\n\tbool bMuteDialogueVoiceGibberish;\n\n\t////////////////////////////////////////////////////\n\t// Input settings\n\t////////////////////////////////////////////////////\n\n\t// We automatically detect the gamepad UI type instead of relying the manual value set by the user GamepadUIType.\n\tUPROPERTY(Config)\n\tbool bAutoDetectGamepadUIType;\n\n\t// Was the keyboard preset already selected?\n\tUPROPERTY(Config)\n\tbool bKeyboardPresetAlreadySelected;\n\n\t// Does the user prefer the arrow keys preset for keyboard?\n\tUPROPERTY(Config)\n\tbool bUseKeyboardArrowPresetAsDefault;\n\n\t// Default UI for the gamepad to display\n\tUPROPERTY(Config)\n\tESoGamepadLayoutType GamepadUIType;\n\n\t// Modified action mappings by this user\n\tUPROPERTY(Config)\n\tTArray<FSoInputActionKeyMapping> ModifiedInputActionMappings;\n\n\t// Modified axis mappings by this user\n\tUPROPERTY(Config)\n\tTArray<FSoInputAxisKeyMapping> ModifiedInputAxisMappings;\n\n\t// All action mappings, combines UInputSettings.ActionMappings + ModifiedInputActionMappings so that we access it in O(1);\n\t// Key: ActionName\n\t// Value: All the key mappings\n\tTMap<FName, TArray<FInputActionKeyMapping>> InputActionMappings;\n\n\t// All axis mappings, combines UInputSettings.AxisMappings + ModifiedInputAxisMappings so that we access it in O(1);\n\t// Key: ActionName\n\t// Value: All the axis mappings\n\tTMap<FName, TArray<FInputAxisKeyMapping>> InputAxisMappings;\n\n\t/**\n\t * Map that points from the gamepad key name to the action name.\n\t * NOTE: only includes game action names\n\t * Key: Gamepad Key Name\n\t * Value: Array of ActionNames\n\t */\n\tTMap<FName, TArray<FName>> GamepadKeyToGameActionNameMap;\n\n\t/**\n\t* Map that points from the gamepad key name to the action name.\n\t* NOTE: only includes UI action names\n\t* Key: Gamepad Key Name\n\t* Value: Array of action names ActionName\n\t*/\n\tTMap<FName, TArray<FName>> GamepadKeyToUIActionNameMap;\n\n\t////////////////////////////////////////////////////\n\t// Other\n\t////////////////////////////////////////////////////\n\n\n\t// See RunAndApplyHardwareBenchmarkIfRequested\n\tbool bShouldDoHardwareBenchmark = false;\n\n\t// Reference Actor used to get the UWorld.\n\tUPROPERTY(Transient)\n\tUObject* WorldContextObject = nullptr;\n\n\tbool bBlockConfigSave = false;\n\n\tbool bCacheSaveRequests = false;\n\tbool bAnySaveRequestCached = false;\n\npublic:\n\t// Empties\n\tstatic const TArray<FInputActionKeyMapping> EmptyInputActionKeysArray;\n\tstatic const TArray<FInputAxisKeyMapping> EmptyInputAxisKeysArray;\n\n\t// Maximum/Minimum single axis scale for render resolution\n\tstatic constexpr float MaxScreenPercentage = 200.0f;\n\tstatic constexpr float MinScreenPercentage = 75.f;\n\n\t// Brightness limits, Original limits are on UEngine::HandleGammaCommand\n\tstatic constexpr float MinBrightness = 1.2f;\n\tstatic constexpr float MaxBrightness = 3.2;\n\tstatic constexpr float DefaultBrightness = 2.2f;\n\n\t// Gamepad vibration\n\tstatic constexpr float MinVibrationScale = 0.f;\n\tstatic constexpr float MaxVibrationScale = 2.f;\n\tstatic constexpr float DefaultVibrationScale = 1.f;\n\n\t// Game Speed\n\tstatic constexpr float DefaultGameSpeed = 1.f;\n};\n"
  },
  {
    "path": "Source/SOrb/SplineLogic/SoCameraData.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#include \"SoCameraData.h\"\n\n#include \"Basic/Helpers/SoMathHelper.h\"\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// FSoCamNodeList\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\nDEFINE_LOG_CATEGORY_STATIC(LogSoCameraData, All, All);\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\ntemplate<typename T>\nT Interpolate(const T& First, const T& Second, const float SecondWeight, ESoCamInterpolationMethod Method)\n{\n\t// https://codeplea.com/simple-interpolation\n\tswitch (Method)\n\t{\n\tcase ESoCamInterpolationMethod::ECIM_Cosine:\n\t\treturn USoMathHelper::InterpolateCosine(First, Second, SecondWeight);\n\n\tcase ESoCamInterpolationMethod::ECIM_SmoothStep:\n\t\treturn USoMathHelper::InterpolateSmoothStep(First, Second, SecondWeight);\n\n\tcase ESoCamInterpolationMethod::ECIM_Acceleration:\n\t\treturn USoMathHelper::InterpolateAcceleration(First, Second, SecondWeight);\n\n\tcase ESoCamInterpolationMethod::ECIM_Deceleration:\n\t\treturn USoMathHelper::InterpolateDeceleration(First, Second, SecondWeight);\n\n\tcase ESoCamInterpolationMethod::ECIM_Linear:\n\tdefault:\n\t\treturn First + SecondWeight * (Second - First);\n\t}\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFSoCamKeyNode::FSoCamKeyNode()\n{\n};\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFSoCamKeyNode::FSoCamKeyNode(const FSoSplinePoint& InSplinePoint)\n{\n\tDistance = InSplinePoint.GetDistance();\n\tSplinePoint = InSplinePoint;\n\tPosition = InSplinePoint;\n};\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFSoCamKeyNode::FSoCamKeyNode(float InArmLength, float InDeltaYaw, float InDeltaPitch, float InMaxHorizontalOffset, FVector InDeltaOffset) :\n\tArmLength(InArmLength),\n\tDeltaYaw(InDeltaYaw),\n\tDeltaPitch(InDeltaPitch),\n\tMaxHorizontalOffset(InMaxHorizontalOffset),\n\tDeltaOffset(InDeltaOffset)\n{\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSoCamNodeList::CreateNewCamKey(const FSoSplinePoint& SplinePoint, int32 CamKeyIndex)\n{\n\tCamKeys.Push(GetInterpolatedCamData(SplinePoint.GetDistance(), CamKeyIndex, true));\n\n\tCamKeys.Sort([](const FSoCamKeyNode& First, const FSoCamKeyNode& Second)\n\t{\n\t\treturn First.SplinePoint.GetDistance() < Second.SplinePoint.GetDistance();\n\t});\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFSoCamKeyNode FSoCamNodeList::GetInterpolatedCamData(float DistanceOnSpline, int32& InOutIndex, bool bForceSplineBased) const\n{\n\tif (CamKeys.Num() == 0)\n\t\treturn {};\n\n\tInOutIndex = FMath::Clamp(InOutIndex, 0, CamKeys.Num() - 1);\n\n\twhile (DistanceOnSpline < CamKeys[InOutIndex].SplinePoint.GetDistance() && InOutIndex > 0) --InOutIndex;\n\twhile (InOutIndex < CamKeys.Num() - 1 && DistanceOnSpline > CamKeys[InOutIndex + 1].SplinePoint.GetDistance()) ++InOutIndex;\n\n\tif (InOutIndex == CamKeys.Num() - 1)\n\t{\n\t\tFSoCamKeyNode OutNode = CamKeys[InOutIndex];\n\t\tOutNode.Position = GetPosition(InOutIndex);\n\t\tOutNode.Rotation = GetRotation(InOutIndex);\n\t\treturn OutNode;\n\t}\n\n\tconst int32 CorrectedIndex0 = FMath::Clamp(InOutIndex + CamKeys[InOutIndex].LockOffset, 0, CamKeys.Num() - 1);\n\tconst int32 CorrectedIndex1 = FMath::Clamp(InOutIndex + 1 + CamKeys[InOutIndex + 1].LockOffset, 0, CamKeys.Num() - 1);\n\tif (CorrectedIndex0 == CorrectedIndex1)\n\t{\n\t\tFSoCamKeyNode Node = CamKeys[CorrectedIndex0];\n\t\tNode.Position = GetPosition(InOutIndex);\n\t\tNode.Rotation = GetRotation(InOutIndex);\n\t\treturn Node;\n\t}\n\n\tFSoCamKeyNode InterpKey = FSoCamKeyNode::GetInterpolatedCamData(CamKeys[CorrectedIndex0],\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tCamKeys[CorrectedIndex1],\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tCamKeys[InOutIndex].SplinePoint.GetDistance(),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tCamKeys[InOutIndex + 1].SplinePoint.GetDistance(),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tDistanceOnSpline);\n\tif (CamKeys[InOutIndex].bUseSplineOnInterpolation || bForceSplineBased)\n\t{\n#if WITH_EDITOR\n\t\tif (CamKeys[InOutIndex].LockOffset != 0 || CamKeys[InOutIndex + 1].LockOffset != 0)\n\t\t\tUE_LOG(LogSoCameraData, Warning, TEXT(\"LockOffset doesn't make any sense with bUseSplineOnInterpolation (%d)\"), InOutIndex);\n#endif\n\n\t\tInterpKey.Position = InterpKey.SplinePoint;\n\t\tInterpKey.Position.Z = 0;\n\t\tInterpKey.Rotation = InterpKey.GetRotation();\n\t}\n\telse\n\t{\n\t\tconst float FirstDistance = CamKeys[InOutIndex].SplinePoint.GetDistance();\n\t\tconst float SecondDistance = CamKeys[InOutIndex + 1].SplinePoint.GetDistance();\n\t\tconst float OtherWeight = (DistanceOnSpline - FirstDistance) / (SecondDistance - FirstDistance);\n\n\t\t// InterpKey.Position = Interpolate(GetPosition(CorrectedIndex0), GetPosition(CorrectedIndex1), OtherWeight, CamKeys[CorrectedIndex0].InterpolationMethod);\n\t\tInterpKey.Position = Interpolate(GetPosition(CorrectedIndex0), GetPosition(CorrectedIndex1), OtherWeight, ESoCamInterpolationMethod::ECIM_Linear);\n\n\t\tFRotator Rot1 = GetRotation(CorrectedIndex0);\n\t\tFRotator Rot2 = GetRotation(CorrectedIndex1);\n\n\t\tif (fabs(Rot1.Yaw - Rot2.Yaw) > 180.0f)\n\t\t{\n\t\t\tif (Rot1.Yaw < Rot2.Yaw)\n\t\t\t\tRot1.Yaw += 360;\n\t\t\telse\n\t\t\t\tRot2.Yaw += 360;\n\t\t}\n\n\t\tInterpKey.Rotation = Interpolate(Rot1, Rot2, OtherWeight, CamKeys[CorrectedIndex0].InterpolationMethod);\n\n\t}\n\treturn InterpKey;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSoCamNodeList::ReScale(float SplineLength)\n{\n\tconst float LastDistance = CamKeys.Top().SplinePoint.GetDistance();\n\tif (fabs(SplineLength - LastDistance) > KINDA_SMALL_NUMBER)\n\t{\n\t\tconst float ScaleFactor = SplineLength / LastDistance;\n\t\tfor (int i = 0; i < CamKeys.Num(); ++i)\n\t\t{\n\t\t\tconst FSoSplinePoint OldPoint = CamKeys[i].SplinePoint;\n\t\t\tCamKeys[i].SplinePoint = OldPoint.GetScaledSplinePoint(ScaleFactor);\n\t\t}\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFVector FSoCamNodeList::GetPosition(int32 CamKeyIndex) const\n{\n\tint32 Ix;\n\tif (!CalcAndCheckLockOffset(CamKeyIndex, Ix)) return FVector(0, 0, 0);\n\tFVector Pos = CamKeys[Ix].SplinePoint;\n\tPos.Z = 0.f;\n\treturn Pos;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFRotator FSoCamNodeList::GetRotation(int32 CamKeyIndex) const\n{\n\tint32 Ix;\n\tif (!CalcAndCheckLockOffset(CamKeyIndex, Ix)) return FRotator();\n\n\treturn CamKeys[Ix].GetRotation();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool FSoCamNodeList::CalcAndCheckLockOffset(int32 CamKeyIndex, int32& OutIndex) const\n{\n\tOutIndex = CamKeyIndex + CamKeys[CamKeyIndex].LockOffset;\n#ifdef WITH_EDITOR\n\tif (OutIndex < 0 || OutIndex >= CamKeys.Num())\n\t{\n\t\tUE_LOG(LogSoCameraData, Error, TEXT(\"InValid LockOffset on CamKey %d\"), CamKeyIndex);\n\t\treturn false;\n\t}\n#endif\n\treturn true;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSoCamNodeList::Modify(const FSoCamKeyNodeModifier& Modifier)\n{\n\tif (Modifier.KeyIndex < 0 || Modifier.KeyIndex >= CamKeys.Num())\n\t{\n\t\tUE_LOG(LogSoCameraData, Error, TEXT(\"InValid CamKey index in modifier %d\"), Modifier.KeyIndex);\n\t\treturn;\n\t}\n\tFSoCamKeyNode& Node = CamKeys[Modifier.KeyIndex];\n\n\tif (Modifier.bModifyYaw) Node.DeltaYaw = Modifier.DeltaYaw;\n}\n\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// FSoCamKeyNode\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFRotator FSoCamKeyNode::GetRotation() const\n{\n\tFVector Direction = SplinePoint.GetDirection();\n\tDirection.Z = 0.f;\n\treturn Direction.Rotation() + FRotator(DeltaPitch, 90.f + DeltaYaw, 0.f);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nint32 FSoCamKeyNode::GetDirectionModifier() const\n{\n\tif (fabs(DeltaYaw) < 90.f - KINDA_SMALL_NUMBER) return 1;\n\tif (fabs(fabs(DeltaYaw) - 90.f) < KINDA_SMALL_NUMBER) return 0;\n\treturn -1;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFSoCamKeyNode FSoCamKeyNode::GetInterpolatedCamData(const FSoCamKeyNode& First,\n\t\t\t\t\t\t\t\t\t\t\t\t\tconst FSoCamKeyNode& Second,\n\t\t\t\t\t\t\t\t\t\t\t\t\tfloat FirstSplineDistance,\n\t\t\t\t\t\t\t\t\t\t\t\t\tfloat SecondSplineDistance,\n\t\t\t\t\t\t\t\t\t\t\t\t\tfloat DistanceOnSpline)\n{\n#ifdef WITH_EDITOR\n\tif (SecondSplineDistance < FirstSplineDistance)\n\t{\n\t\tUE_LOG(LogSoCameraData, Error, TEXT(\"GetInterpolatedCamData called on wrong CamKey\"));\n\t\treturn FSoCamKeyNode();\n\t}\n#endif\n\n\tif (fabs(SecondSplineDistance - FirstSplineDistance) < KINDA_SMALL_NUMBER)\n\t{\n\t\tUE_LOG(LogSoCameraData, Error, TEXT(\"FSoCamKeyNode::GetInterpolatedCamData called with invaid values \\\n\t\t\t\t\t\t\t\t\t (maybe more than one spline point is on the same splinepoint!)\"));\n\t\tif (FirstSplineDistance < KINDA_SMALL_NUMBER)\n\t\t\tFirstSplineDistance = 0;\n\t\telse\n\t\t\tFirstSplineDistance = 1000; // just random number to stop (SecondSplineDistance - FirstSplineDistance) being 0\n\t}\n\n\tconst float SecondWeight = (DistanceOnSpline - FirstSplineDistance) / (SecondSplineDistance - FirstSplineDistance);\n\tconst float FirstWeight = 1.0f - SecondWeight;\n\n\tFSoCamKeyNode InterpolatedCamData;\n\t// InterpolatedCamData.Distance = Interpolate(First.Distance, Second.Distance, SecondWeight, First.InterpolationMethod);\n\tInterpolatedCamData.Distance = DistanceOnSpline;\n\tInterpolatedCamData.ArmLength = Interpolate(First.ArmLength, Second.ArmLength, SecondWeight, First.InterpolationMethod);\n\tInterpolatedCamData.DeltaYaw = Interpolate(First.DeltaYaw, Second.DeltaYaw, SecondWeight, First.InterpolationMethod);\n\tInterpolatedCamData.DeltaPitch = Interpolate(First.DeltaPitch, Second.DeltaPitch, SecondWeight, First.InterpolationMethod);\n\tInterpolatedCamData.MaxHorizontalOffset = Interpolate(First.MaxHorizontalOffset, Second.MaxHorizontalOffset, SecondWeight, First.InterpolationMethod);\n\tInterpolatedCamData.DeltaOffset = Interpolate(First.DeltaOffset, Second.DeltaOffset, SecondWeight, First.InterpolationMethod);\n\tInterpolatedCamData.bUseSplineOnInterpolation = First.bUseSplineOnInterpolation;\n\tInterpolatedCamData.InterpolationMethod = First.InterpolationMethod;\n\tInterpolatedCamData.SplinePoint = First.SplinePoint;\n\tInterpolatedCamData.SplinePoint.SetDistance(DistanceOnSpline);\n\n\treturn InterpolatedCamData;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSoCamKeyNode::CopyParams(const FSoCamKeyNode& _Source, bool CopyDistance)\n{\n\tif (CopyDistance)\n\t\tDistance = _Source.Distance;\n\tArmLength = _Source.ArmLength;\n\tDeltaYaw = _Source.DeltaYaw;\n\tDeltaPitch = _Source.DeltaPitch;\n\tMaxHorizontalOffset = _Source.MaxHorizontalOffset;\n\tDeltaOffset = _Source.DeltaOffset;\n\tbUseSplineOnInterpolation = _Source.bUseSplineOnInterpolation;\n\tLockOffset = _Source.LockOffset;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool FSoCamKeyNode::CompareParams(const FSoCamKeyNode& _Source) const\n{\n\treturn\tfabs(ArmLength - _Source.ArmLength) < KINDA_SMALL_NUMBER &&\n\t\t\tfabs(DeltaYaw - _Source.DeltaYaw) < KINDA_SMALL_NUMBER &&\n\t\t\tfabs(DeltaPitch - _Source.DeltaPitch) < KINDA_SMALL_NUMBER &&\n\t\t\tfabs(MaxHorizontalOffset - _Source.MaxHorizontalOffset) < KINDA_SMALL_NUMBER &&\n\t\t\t(DeltaOffset - _Source.DeltaOffset).Size() < KINDA_SMALL_NUMBER &&\n\t\t\tLockOffset == _Source.LockOffset;\n}\n"
  },
  {
    "path": "Source/SOrb/SplineLogic/SoCameraData.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#pragma once\n\n// wth is wrong with u, unreal?\n#include \"SoSplinePoint.h\"\n#include \"SoCameraData.generated.h\"\n\nUENUM()\nenum class ESoCamInterpolationMethod : uint8\n{\n\t// https://codeplea.com/simple-interpolation\n\n\tECIM_Linear = 0\t\tUMETA(DisplayName = \"Linear\"),\n\tECIM_Cosine\t\t\tUMETA(DisplayName = \"Cosine\"),\n\tECIM_SmoothStep\t\tUMETA(DisplayName = \"SmoothStep\"),\n\tECIM_Acceleration\tUMETA(DisplayName = \"Acceleration\"),\n\tECIM_Deceleration\tUMETA(DisplayName = \"Deceleration\"),\n\n\tECIM_NumOf\t\t\tUMETA(Hidden)\n};\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUSTRUCT(BlueprintType)\nstruct FSoCamKeyNode\n{\n\tGENERATED_USTRUCT_BODY()\n\npublic:\n\tFSoCamKeyNode();\n\tFSoCamKeyNode(const FSoSplinePoint& InSplinePoint);\n\n\tFSoCamKeyNode(float ArmLength, float DeltaYaw, float DeltaPitch, float MaxHorizontalOffset, FVector DeltaOffset);\n\n\tFRotator GetRotation() const;\n\n\t// angle of the camera modifies which button is forward and which is backward\n\t// it can be 0, then we should use the one we used last time\n\tint32 GetDirectionModifier() const;\n\n\tstatic FSoCamKeyNode GetInterpolatedCamData(const FSoCamKeyNode& First,\n\t\t\t\t\t\t\t\t\t\t\t\tconst FSoCamKeyNode& Second,\n\t\t\t\t\t\t\t\t\t\t\t\tfloat FirstSplineDistance,\n\t\t\t\t\t\t\t\t\t\t\t\tfloat SecondSplineDistance,\n\t\t\t\t\t\t\t\t\t\t\t\tfloat DistanceOnSpline);\n\n\t// the location (spline position, world location, distance on spline, etc.) stays the same\n\t// the other parameters are copied from _Source\n\tvoid CopyParams(const FSoCamKeyNode& _Source, bool CopyDistance);\n\n\t/** compares the camera key related data, location and interpolation only data is ignored */\n\tbool CompareParams(const FSoCamKeyNode& _Source) const;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite)\n\tfloat Distance = 0.0f;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite)\n\tfloat ArmLength = 1200.0f;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite)\n\tfloat DeltaYaw = 0.0f;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite)\n\tfloat DeltaPitch = -20.0f;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite)\n\tfloat MaxHorizontalOffset = 100.f;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite)\n\tFVector DeltaOffset = FVector(0,0,0);\n\n\t// this data effects the edge after this point if there is any\n\t// if false, the spline curve's effect between the two key point will be ignored\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite)\n\tbool bUseSplineOnInterpolation = false;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite)\n\tint32 LockOffset = 0;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite)\n\tESoCamInterpolationMethod InterpolationMethod = ESoCamInterpolationMethod::ECIM_SmoothStep;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Meta = (DlgNoExport))\n\tFSoSplinePoint SplinePoint;\n\n\t// only in interpolated stuff, otherwise invalid\n\tFVector Position = FVector::ZeroVector;\n\n\t// only in interpolated stuff, otherwise invalid\n\tFRotator Rotation = FRotator::ZeroRotator;\n};\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUSTRUCT(BlueprintType)\nstruct FSoCamKeyNodeModifier\n{\n\tGENERATED_USTRUCT_BODY()\n\npublic:\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite)\n\tfloat DeltaYaw;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite)\n\tbool bModifyYaw;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite)\n\tint32 KeyIndex;\n};\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUSTRUCT(BlueprintType)\nstruct FSoCamNodeList\n{\n\tGENERATED_USTRUCT_BODY()\n\npublic:\n\tFSoCamKeyNode GetInterpolatedCamData(float DistanceOnSpline, int32& InOutIndex, bool bForceSplineBased = false) const;\n\n\t// rescale the CamKey positions based on the last key's position (it should be == with the SplineLength)\n\tvoid ReScale(float SplineLength);\n\n\tvoid CreateNewCamKey(const FSoSplinePoint& SplinePoint, int32 CamKeyIndex);\n\n\tvoid Modify(const FSoCamKeyNodeModifier& Modifier);\n\nprivate:\n\n\tFVector GetPosition(int32 CamKeyIndex) const;\n\tFRotator GetRotation(int32 CamKeyIndex) const;\n\tbool CalcAndCheckLockOffset(int32 CamKeyIndex, int32& OutIndex) const;\n\npublic:\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Meta = (DlgWriteIndex))\n\tTArray<FSoCamKeyNode> CamKeys;\n};\n\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUSTRUCT(BlueprintType)\nstruct FSoWorldCamData\n{\n\tGENERATED_USTRUCT_BODY()\n\npublic:\n\tUPROPERTY()\n\tTMap<FString, FSoCamNodeList> Data;\n};\n"
  },
  {
    "path": "Source/SOrb/SplineLogic/SoCharShadowData.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#include \"SoCharShadowData.h\"\n#include \"Basic/Helpers/SoMathHelper.h\"\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nconst FSoCharShadowKeyNode& FSoCharShadowKeyNode::GetInvalidKey()\n{\n\tstatic FSoCharShadowKeyNode Invalid = FSoCharShadowKeyNode{ 0.0f };\n\treturn Invalid;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSoCharShadowKeyNode::CopyValuesFrom(const FSoCharShadowKeyNode& Ref)\n{\n\tElevation = Ref.Elevation;\n\tAzimuth = Ref.Azimuth;\n\tStrength = Ref.Strength;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nint32 FSoCharShadowNodeList::CreateNewKey(float Distance, int32 KeyIndex)\n{\n\tKeys.Push(GetInterpolated(Distance, KeyIndex));\n\tKeys.Sort([](const FSoCharShadowKeyNode& First, const FSoCharShadowKeyNode& Second)\n\t{\n\t\treturn First.Distance < Second.Distance;\n\t});\n\n\treturn GetClosestIndex(Distance);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nint32 FSoCharShadowNodeList::GetClosestIndex(float Distance) const\n{\n\tif (Keys.Num() == 0)\n\t\treturn -1;\n\n\tint32 Index = 0;\n\twhile (Index < Keys.Num() && Keys[Index].Distance < Distance)\n\t\t++Index;\n\n\tconst int32 PreIndex = FMath::Max(0, Index - 1);\n\tconst int32 PostIndex = FMath::Min(Index, Keys.Num() - 1);\n\n\tif (fabs(Keys[PreIndex].Distance - Distance) < fabs(Keys[PostIndex].Distance - Distance))\n\t\treturn PreIndex;\n\n\treturn PostIndex;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nint32 FSoCharShadowNodeList::GetPrevIndex(float Distance) const\n{\n\tint32 Index = 0;\n\twhile (Index < Keys.Num() && Keys[Index].Distance < Distance)\n\t\t++Index;\n\n\treturn FMath::Max(Index - 1, 0);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nint32 FSoCharShadowNodeList::GetNextIndex(float Distance) const\n{\n\tint32 Index = 0;\n\twhile (Index < Keys.Num() && Keys[Index].Distance < Distance)\n\t\t++Index;\n\n\treturn FMath::Min(Index, Keys.Num() - 1);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFSoCharShadowKeyNode FSoCharShadowNodeList::GetInterpolated(const float DistanceOnSpline, int32& InOutIndex) const\n{\n\tFSoCharShadowKeyNode Interpolated;\n\tInterpolated.Strength = 0.0f;\n\tInterpolated.Distance = DistanceOnSpline;\n\n\tif (Keys.Num() > 0)\n\t{\n\t\tInOutIndex = FMath::Clamp(InOutIndex, 0, Keys.Num() - 1);\n\n\t\twhile (DistanceOnSpline < Keys[InOutIndex].Distance && InOutIndex > 0)\n\t\t\t--InOutIndex;\n\t\twhile (InOutIndex < Keys.Num() - 1 && DistanceOnSpline > Keys[InOutIndex + 1].Distance)\n\t\t\t++InOutIndex;\n\n\t\tif (InOutIndex == 0 && Keys[0].Distance > DistanceOnSpline)\n\t\t\tInterpolated.CopyValuesFrom(Keys[0]);\n\t\telse if (InOutIndex == Keys.Num() - 1)\n\t\t\tInterpolated.CopyValuesFrom(Keys[InOutIndex]);\n\t\telse\n\t\t{\n\t\t\tconst float FirstDistance = Keys[InOutIndex].Distance;\n\t\t\tconst float SecondDistance = Keys[InOutIndex + 1].Distance;\n\t\t\tconst float OtherWeight = (DistanceOnSpline - FirstDistance) / (SecondDistance - FirstDistance);\n\n\t\t\tInterpolated.Azimuth = USoMathHelper::InterpolateSmoothStep(Keys[InOutIndex].Azimuth,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tKeys[InOutIndex].Azimuth + USoMathHelper::ShortAngleDist(Keys[InOutIndex].Azimuth, Keys[InOutIndex + 1].Azimuth),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tOtherWeight);\n\n\t\t\tInterpolated.Elevation = USoMathHelper::InterpolateSmoothStep(Keys[InOutIndex].Elevation, Keys[InOutIndex + 1].Elevation, OtherWeight);\n\t\t\tInterpolated.Strength = USoMathHelper::InterpolateSmoothStep(Keys[InOutIndex].Strength, Keys[InOutIndex + 1].Strength, OtherWeight);\n\t\t}\n\t}\n\n\treturn Interpolated;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSoCharShadowNodeList::ReScale(float SplineLength)\n{\n\tconst float LastDistance = Keys.Top().Distance;\n\tif (fabs(SplineLength - LastDistance) > KINDA_SMALL_NUMBER)\n\t{\n\t\tconst float ScaleFactor = SplineLength / LastDistance;\n\t\tfor (int i = 0; i < Keys.Num(); ++i)\n\t\t\tKeys[i].Distance *= ScaleFactor;\n\t}\n}\n"
  },
  {
    "path": "Source/SOrb/SplineLogic/SoCharShadowData.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#pragma once\n\n#include \"SoCharShadowData.generated.h\"\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUSTRUCT(BlueprintType)\nstruct FSoCharShadowKeyNode\n{\n\tGENERATED_USTRUCT_BODY()\n\npublic:\t\n\tFSoCharShadowKeyNode() {};\n\n\tFSoCharShadowKeyNode(float Z) :Distance(Z), Elevation(Z), Azimuth(Z), Strength(Z) {};\n\n\tvoid CopyValuesFrom(const FSoCharShadowKeyNode& Ref);\n\n\tstatic const FSoCharShadowKeyNode& GetInvalidKey();\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite)\n\tfloat Distance = 0.0f;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite)\n\tfloat Elevation = -0.3f;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite)\n\tfloat Azimuth = 0.0f;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite)\n\tfloat Strength = 1.0f;\n}; \n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUSTRUCT(BlueprintType)\nstruct FSoCharShadowNodeList\n{\n\tGENERATED_USTRUCT_BODY()\n\npublic:\n\n\tFSoCharShadowKeyNode GetInterpolated(const float DistanceOnSpline, int32& InOutIndex) const;\n\n\t// rescale the CamKey positions based on the last key's position (it should be == with the SplineLength)\n\tvoid ReScale(float SplineLength);\n\n\t// ehh\n\tint32 CreateNewKey(float Distance, int32 KeyIndex);\n\n\tint32 GetClosestIndex(float Distance) const;\n\tint32 GetPrevIndex(float Distance) const;\n\tint32 GetNextIndex(float Distance) const;\n\npublic:\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Meta = (DlgWriteIndex))\n\tTArray<FSoCharShadowKeyNode> Keys;\n};\n\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUSTRUCT(BlueprintType)\nstruct FSoWorldCharShadowData\n{\n\tGENERATED_USTRUCT_BODY()\n\npublic:\n\t\n\tUPROPERTY()\n\tTMap<FString, FSoCharShadowNodeList> Data;\n};\n"
  },
  {
    "path": "Source/SOrb/SplineLogic/SoEditorGameInterface.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#include \"SoEditorGameInterface.h\"\n\n#include \"Misc/Paths.h\"\n#include \"EngineUtils.h\"\n\n#include \"IO/DlgConfigWriter.h\"\n#include \"IO/DlgConfigParser.h\"\n\n#include \"SplineLogic/SoSplineHelper.h\"\n#include \"SplineLogic/SoSplineGraph.h\"\n#include \"SoCameraData.h\"\n#include \"SoPlayerSpline.h\"\n#include \"Basic/Helpers/SoStaticHelper.h\"\n#include \"Levels/SoLevelHelper.h\"\n#include \"Basic/SoGameMode.h\"\n#include \"Enemy/SoEnemySpawner.h\"\n#include \"Enemy/SoEnemy.h\"\n\nDEFINE_LOG_CATEGORY(LogSoCameraDataIO);\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool FSoEditorGameInterface::LoadCameraData(UWorld* World)\n{\n\tif (World == nullptr)\n\t{\n\t\tUE_LOG(LogSoCameraDataIO, Error, TEXT(\"LoadCameraData: Failed to load Camera Data: no world\"));\n\t\treturn false;\n\t}\n\n\t// In MainMenu, Ignore\n\tif (USoLevelHelper::IsInMenuLevel(World))\n\t{\n\t\tUE_LOG(LogSoCameraDataIO, Log, TEXT(\"LoadCameraData: In MainMenu, ignoring\"));\n\t\treturn false;\n\t}\n\n\tFSoWorldCamData CameraData;\n\tconst FString FileName =\n\t\tTEXT(\"SO/Data/CameraData/\") + USoLevelHelper::GetMapNameFromObject(World).ToString() + TEXT(\"CamData.txt\");\n\tFDlgConfigParser Parser(FPaths::ProjectContentDir() + FileName, \"So\");\n\n\tParser.ReadAllProperty(FSoWorldCamData::StaticStruct(), &CameraData, nullptr);\n\tUE_LOG(LogSoCameraDataIO, Log, TEXT(\"LoadCameraData: Camera Data Loaded from %s\"), *FileName);\n\n\t// Setup for all splines\n\tfor (TActorIterator<ASoPlayerSpline> ActorItr(World); ActorItr; ++ActorItr)\n\t{\n\t\tASoPlayerSpline* SoSpline = *ActorItr;\n\t\tif (CameraData.Data.Contains(SoSpline->GetSplineName()))\n\t\t\tSoSpline->SetupCameraData(CameraData.Data[SoSpline->GetSplineName()]);\n\t}\n\n\treturn true;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool FSoEditorGameInterface::SaveCameraData(UWorld* World)\n{\n\tif (World == nullptr)\n\t{\n\t\tUE_LOG(LogSoCameraDataIO, Error, TEXT(\"Failed to save camera data: no world!\"));\n\t\treturn false;\n\t}\n\tif (IsRunningCommandlet())\n\t{\n\t\tUE_LOG(LogSoCameraDataIO, Log, TEXT(\"SaveCameraData: Running commandlet, ignoring\"));\n\t\treturn false;\n\t}\n\n\tUE_LOG(LogSoCameraDataIO, Verbose, TEXT(\"SaveCameraData = %d\"), GIsCookerLoadingPackage);\n\tconst FString OutFileName =\n\t\tTEXT(\"SO/Data/CameraData/\") + USoLevelHelper::GetMapNameStringFromObject(World) + TEXT(\"CamData.txt\");\n\n\t// Save all spline\n\tFSoWorldCamData AllCam;\n\tTArray<FString> SplineNameList;\n\tfor (TActorIterator<ASoPlayerSpline> ActorItr(World); ActorItr; ++ActorItr)\n\t{\n\t\tconst ASoPlayerSpline* SoSpline = *ActorItr;\n\t\tFString SplineName = SoSpline->GetSplineName();\n\t\t\n\t\t// sanity check\n\t\tint32 Index = 0;\n\t\tconst bool bAlreadyThere = SplineNameList.Find(SplineName, Index);\n\t\tif (bAlreadyThere)\n\t\t{\n#if WITH_EDITOR\n\t\t\tUE_LOG(LogSoCameraDataIO, Error, TEXT(\"Two spline with the same name %s\"), *SplineName);\n#endif\n\t\t\tSplineName.Append(\"1\");\n\t\t}\n\n\t\tSplineNameList.Add(SplineName);\n\t\tAllCam.Data.Add(SplineName, SoSpline->GetCamNodeList());\n\t}\n\n\t// sort to minimalize difference in output config file\n\tAllCam.Data.KeySort([](const FString& First, const FString& Second) { return First < Second; });\n\n\tFDlgConfigWriter Writer(\"So\");\n\tWriter.Write(FSoWorldCamData::StaticStruct(), &AllCam);\n\tWriter.ExportToFile(FPaths::ProjectContentDir() + OutFileName);\n\tUE_LOG(LogSoCameraDataIO, Log, TEXT(\"SaveCameraData: Camera data saved to %s\"), *OutFileName);\n\n\treturn true;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool FSoEditorGameInterface::ToggleSplinePosCorrection()\n{\n\tUSoSplineHelper::SetSplinePosCorrection(!USoSplineHelper::IsSplinePosCorrectionEnabled());\n\treturn USoSplineHelper::IsSplinePosCorrectionEnabled();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool FSoEditorGameInterface::IsSplinePosCorrectionEnabled()\n{\n\treturn USoSplineHelper::IsSplinePosCorrectionEnabled();\n}\n\n\n// int32 Count = 0;\n// for (TActorIterator<ASoSplineGraph> It(World, ASoSplineGraph::StaticClass()); It; ++It)\n// {\n// \tif (Count != 0)\n// \t{\n// \t\tUE_LOG(LogSoSplineGraph, Warning, TEXT(\"More than one spline graph is placed in the level, that should not happen!\"));\n// \t\treturn false;\n// \t}\n// \t(*It)->Rebuild();\n// \t++Count;\n// }\n//\n// if (Count == 0)\n// {\n// \tUE_LOG(LogSoSplineGraph, Warning, TEXT(\"Failed to rebuild navigation graph: could not locate spline graph instance!\"));\n// \treturn false;\n// }\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSoEditorGameInterface::FixEnemyGroupName(FName& InOutName)\n{\n\tif (InOutName == NAME_None)\n\t\treturn;\n\n\tconst FString GroupString = InOutName.ToString();\n\tstatic const FString PreFix = FString(\"EG_\");\n\tif (!GroupString.Mid(0, 3).Equals(PreFix))\n\t\tInOutName = FName(*(PreFix + GroupString));\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFString FSoEditorGameInterface::GetEnemyGroupDataConfigPath(UWorld* World)\n{\n\tif (World == nullptr)\n\t\treturn \"\";\n\n\treturn FPaths::ProjectContentDir() + TEXT(\"SO/AIConfig/EnemyGroups_\") + USoLevelHelper::GetMapNameStringFromObject(World) + TEXT(\".txt\");\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool FSoEditorGameInterface::BuildEnemyGroupDataConfigFile(UWorld* World)\n{\n\t// In MainMenu, Ignore\n\tif (USoLevelHelper::IsInMenuLevel(World))\n\t{\n\t\tUE_LOG(LogSoCameraDataIO, Log, TEXT(\"BuildEnemyGroupDataConfigFile: In MainMenu, ignoring\"));\n\t\treturn false;\n\t}\n\tif (IsRunningCommandlet())\n\t{\n\t\tUE_LOG(LogSoCameraDataIO, Log, TEXT(\"BuildEnemyGroupDataConfigFile: Running commandlet, ignoring\"));\n\t\treturn false;\n\t}\n\n\tFSoEnemyGroups EnemyGroups;\n\tfor (TActorIterator<ASoEnemy> It(World, ASoEnemy::StaticClass()); It; ++It)\n\t{\n\t\tconst FName GroupName = (*It)->GetSoGroupName();\n\t\tint32* CountPtr = EnemyGroups.EnemyGroupMap.Find(GroupName);\n\t\tif (CountPtr == nullptr)\n\t\t\tEnemyGroups.EnemyGroupMap.Add(GroupName, 1);\n\t\telse\n\t\t\tEnemyGroups.EnemyGroupMap[GroupName] += 1;\n\t}\n\n\tfor (TActorIterator<ASoEnemySpawner> It(World, ASoEnemySpawner::StaticClass()); It; ++It)\n\t{\n\t\tconst FName GroupName = (*It)->GetSoGroupName();\n\t\tint32* CountPtr = EnemyGroups.EnemyGroupMap.Find(GroupName);\n\t\tif (CountPtr == nullptr)\n\t\t\tEnemyGroups.EnemyGroupMap.Add(GroupName, (*It)->GetEnemyNum());\n\t\telse\n\t\t\tEnemyGroups.EnemyGroupMap[GroupName] += (*It)->GetEnemyNum();\n\t}\n\n\tFDlgConfigWriter Writer(\"So\");\n\tWriter.Write(FSoEnemyGroups::StaticStruct(), &EnemyGroups);\n\n\treturn Writer.ExportToFile(GetEnemyGroupDataConfigPath(World));\n}\n"
  },
  {
    "path": "Source/SOrb/SplineLogic/SoEditorGameInterface.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#pragma once\n\n#include \"CoreMinimal.h\"\n#include \"Logging/LogMacros.h\"\n\nclass UWorld;\n\nDECLARE_LOG_CATEGORY_EXTERN(LogSoCameraDataIO, Log, All);\n\n/**\n* Interface for the editor buttons\n*/\nclass SORB_API FSoEditorGameInterface\n{\npublic:\n\n\tstatic bool LoadCameraData(UWorld* World);\n\tstatic bool SaveCameraData(UWorld* World);\n\n\tstatic bool ToggleSplinePosCorrection();\n\tstatic bool IsSplinePosCorrectionEnabled();\n\n\t/**\n\t *  Gathers the Group data from the enemies and enemy spawners placed in the level and exports it to a config the character will load\n\t *  Do not ever call this function from game!!!\n\t */\n\tstatic bool BuildEnemyGroupDataConfigFile(UWorld* World);\n\n\t/** Adds unique prefix if it isn't there yet */\n\tstatic void FixEnemyGroupName(FName& InOutName);\n\n\tstatic FString GetEnemyGroupDataConfigPath(UWorld* World);\n};\n"
  },
  {
    "path": "Source/SOrb/SplineLogic/SoLevelConfigSaver.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#include \"SoLevelConfigSaver.h\"\n#include \"SoEditorGameInterface.h\"\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoLevelConfigSaver::PreSave(const ITargetPlatform* TargetPlatform)\n{\n\tSuper::PreSave(TargetPlatform);\n\n\tif (GetWorld() != nullptr)\n\t\tFSoEditorGameInterface::SaveCameraData(GetWorld());\n}\n"
  },
  {
    "path": "Source/SOrb/SplineLogic/SoLevelConfigSaver.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#pragma once\n#include \"GameFramework/Actor.h\"\n#include \"SoLevelConfigSaver.generated.h\"\n\n\nUCLASS()\nclass SORB_API ASoLevelConfigSaver : public AActor\n{\n\tGENERATED_BODY()\n\npublic:\n\n\tvirtual void PreSave(const ITargetPlatform* TargetPlatform) override;\n\n};\n"
  },
  {
    "path": "Source/SOrb/SplineLogic/SoLocationRegistry.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#include \"SoLocationRegistry.h\"\n\n#include \"SplineLogic/SoMarker.h\"\n#include \"Engine/Engine.h\"\n#include \"EngineUtils.h\"\n\nDEFINE_LOG_CATEGORY_STATIC(LogSoLocationRegistry, All, All)\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// Sets default values\nASoLocationRegistry::ASoLocationRegistry()\n{\n\tPrimaryActorTick.bCanEverTick = false;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFSoSplinePoint ASoLocationRegistry::GetSplineLocation(FName LocationName) const\n{\n\tconst ASoMarker* Marker = GetMarker(LocationName);\n\tif (Marker == nullptr)\n\t\treturn FSoSplinePoint{};\n\n\treturn Marker->GetSplineLocation();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nfloat ASoLocationRegistry::GetZLocation(FName LocationName) const\n{\n\tconst ASoMarker* Marker = GetMarker(LocationName);\n\tif (Marker == nullptr)\n\t\treturn 0.0f;\n\n\treturn Marker->GetActorLocation().Z;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFVector ASoLocationRegistry::GetForwardVector(FName LocationName) const\n{\n\tconst FSoSplinePoint SplinePoint = GetSplineLocation(LocationName);\n\tif (!SplinePoint.IsValid(true))\n\t\treturn FVector(1.0f, 0.0f, 0.0f);\n\n\treturn SplinePoint.GetDirection() * (ShouldMarkerLookBackwards(LocationName) ? -1.0 : 1.0f);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nconst ASoMarker* ASoLocationRegistry::GetMarker(FName LocationName) const\n{\n\tASoMarker* const* MarkerPtr = SplineLocations.Find(LocationName);\n\treturn MarkerPtr == nullptr ? nullptr : *MarkerPtr;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoLocationRegistry::RegisterSplineLocation(FName Name, ASoMarker* Location)\n{\n\tif (Location == nullptr)\n\t\treturn;\n\n\tif (Location->GetLevel() != GetLevel())\n\t{\n\t\tUE_LOG(LogSoLocationRegistry, Warning, TEXT(\"Failed to register spline location: registry and marker has to be in the same level!\"));\n\t\treturn;\n\t}\n\n\tif (SplineLocations.Contains(Name))\n\t\tSplineLocations[Name] = Location;\n\telse\n\t\tSplineLocations.Add(Name, Location);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nASoLocationRegistry* ASoLocationRegistry::GetInstance(UObject* WorldContextObject)\n{\n\tif (UWorld* World = GEngine->GetWorldFromContextObject(WorldContextObject, EGetWorldErrorMode::LogAndReturnNull))\n\t{\n\t\tconst TActorIterator<ASoLocationRegistry> LocationIter(World);\n\t\tif (!LocationIter || *LocationIter == nullptr)\n\t\t{\n\t\t\tUE_LOG(LogSoLocationRegistry, Error, TEXT(\"ASoLocationRegistry::GetInstance: Failed to get location registry actor. Does the level contain one?\"));\n\t\t\treturn nullptr;\n\t\t}\n\n\t\t// First one found\n\t\treturn *LocationIter;\n\t}\n\n\treturn nullptr;\n}\n"
  },
  {
    "path": "Source/SOrb/SplineLogic/SoLocationRegistry.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#pragma once\n#include \"GameFramework/Actor.h\"\n#include \"SplineLogic/SoSplinePoint.h\"\n#include \"SoLocationRegistry.generated.h\"\n\n\nclass ASoMarker;\n\n/**\n * Gather information about all the checkpoints in the game\n * Used in the child BP in it's Construct.\n * NOTE LocationName = NAME_None is the start one (default)\n */\nUCLASS()\nclass SORB_API ASoLocationRegistry : public AActor\n{\n\tGENERATED_BODY()\n\npublic:\n\t// Sets default values for this actor's properties\n\tASoLocationRegistry();\n\n\t// Get information from a LocationName.\n\t// These methods are safe, if the LocationName Marker does not exist it returns a sane default\n\tFSoSplinePoint GetSplineLocation(FName LocationName) const;\n\tfloat GetZLocation(FName LocationName) const;\n\tFVector GetForwardVector(FName LocationName) const;\n\n\t// Returns the Marker for the LocationName or nullptr if the marker is not registered.\n\tconst ASoMarker* GetMarker(FName LocationName) const;\n\n\t// Does the Marker identified  by LocattionName exist in the registry?\n\tbool HasMarker(FName LocationName) const { return GetMarker(LocationName) != nullptr; }\n\n\t// Register the LocationName\n\tUFUNCTION(BlueprintCallable, Category = Initialization)\n\tvoid RegisterSplineLocation(FName Name, ASoMarker* Location);\n\n\t// Should the rotation of the marker be backwards\n\tbool ShouldMarkerLookBackwards(FName LocationName) const { return NegativeDirections.Contains(LocationName); }\n\n\tconst TMap<FName, ASoMarker*>& GetAllCheckpoints() const { return SplineLocations; }\n\n\t// Gets the LocationRegistry Instance\n\tstatic ASoLocationRegistry* GetInstance(UObject* WorldContextObject);\n\n\t// NAME_None is always the default/start checkpoint\n\tstatic FName GetDefaultCheckpointLocationName() { return NAME_None; }\n\nprotected:\n\t// Key: LocationName\n\t// Value: The checkpoint marker\n\tUPROPERTY(VisibleAnywhere, BlueprintReadWrite)\n\tTMap<FName, ASoMarker*> SplineLocations;\n\n\t/** if the named location is in this the default orientation will be along the negative spline direction */\n\tUPROPERTY(EditAnywhere, BlueprintReadOnly)\n\tTSet<FName> NegativeDirections;\n};\n"
  },
  {
    "path": "Source/SOrb/SplineLogic/SoMarker.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#include \"SoMarker.h\"\n\n#include \"SplineLogic/SoSplinePoint.h\"\n#include \"SplineLogic/SoSpline.h\"\n#include \"SplineLogic/SoSplineHelper.h\"\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// Sets default values\nASoMarker::ASoMarker()\n{\n\t// Set this actor to call Tick() every frame.  You can turn this off to improve performance if you don't need it.\n\tPrimaryActorTick.bCanEverTick = false;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoMarker::OnConstruction(const FTransform& Transform)\n{\n\tSuper::OnConstruction(Transform);\n\n\tUSoSplineHelper::UpdateSplineLocationRef(this, SplineLocationPtr, true, true);\n\n\t// store reference if they are on the same level - some child may work in editor\n\tif (SplineLocationPtr.IsValid())\n\t{\n\t\tFSoSplinePoint Point = SplineLocationPtr.Extract();\n\t\tif (Point.GetSpline()->GetLevel() == GetLevel())\n\t\t\tSplineLocation = Point;\n\t}\n}\n\n#if WITH_EDITOR\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoMarker::PostEditChangeProperty(FPropertyChangedEvent& PropertyChangedEvent)\n{\n\tconst FName PropertyName = PropertyChangedEvent.Property != nullptr ? PropertyChangedEvent.Property->GetFName() : NAME_None;\n\tif (PropertyName == FName(\"DistanceAlongSpline\"))\n\t{\n\t\tconst FSoSplinePoint TempPoint = SplineLocationPtr.Extract();\n\t\tif (TempPoint.IsValid(false))\n\t\t\tSetActorLocation(TempPoint.ToVector(GetActorLocation().Z));\n\t}\n\n\tSuper::PostEditChangeProperty(PropertyChangedEvent);\n}\n#endif\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoMarker::InitiliazeSplineLocation()\n{\n\tSplineLocation = SplineLocationPtr.Extract();\n\tSplineLocation.SetReferenceZ(GetActorLocation().Z);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoMarker::BeginPlay()\n{\n\tSuper::BeginPlay();\n\tInitiliazeSplineLocation();\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool ASoMarker::IsMarkerInRangeFromSplineLocation(const ASoMarker* Marker, const FSoSplinePoint& SplineLocation, float MinDistance, float MaxDistance)\n{\n\tif (Marker == nullptr || !SplineLocation.IsValid(false))\n\t\treturn false;\n\n\tif (!Marker->SplineLocation.IsValid(false))\n\t\treturn 0.0f;\n\n\tconst float Distance = fabs(SplineLocation.GetDistanceFromSplinePoint(Marker->SplineLocation, MaxDistance + 10.0f));\n\treturn (Distance > MinDistance && Distance < MaxDistance);\n}"
  },
  {
    "path": "Source/SOrb/SplineLogic/SoMarker.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#pragma once\n#include \"GameFramework/Actor.h\"\n#include \"SplineLogic/SoSplinePointPtr.h\"\n#include \"SoMarker.generated.h\"\n\n\nUCLASS()\nclass SORB_API ASoMarker : public AActor\n{\n\tGENERATED_BODY()\n\npublic:\n\t// Sets default values for this actor's properties\n\tASoMarker();\n\n\tvirtual void OnConstruction(const FTransform& Transform) override;\n\n#if WITH_EDITOR\n\tvirtual void PostEditChangeProperty(FPropertyChangedEvent& PropertyChangedEvent) override;\n#endif\n\n\tvirtual void BeginPlay() override;\n\n\t// Initialize spline location from the spline pointer.\n\tvoid InitiliazeSplineLocation();\n\n\tUFUNCTION(BlueprintPure, Category = \"SplinePoint\")\n\tFSoSplinePoint GetSplineLocation() const { return SplineLocation; }\n\n\tUFUNCTION(BlueprintPure, Category = \"SplinePoint\")\n\tfloat GetDistanceOnSpline() const { return SplineLocation.GetDistance(); }\n\n\t// Gets the spline location pointer\n\tFSoSplinePointPtr GetSplineLocationPtr() const { return SplineLocationPtr; }\n\n\tstatic bool IsMarkerInRangeFromSplineLocation(const ASoMarker* Marker, const FSoSplinePoint& SplineLocation, float MinDistance, float MaxDistance);\n\nprotected:\n\t// EditAnywhere VisibleAnywhere\n\t/** Constructed in BeginPlay/ConstructScript from SplineLocationPtr  */\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite)\n\tFSoSplinePoint SplineLocation;\n\n\t/** used in editor */\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite)\n\tFSoSplinePointPtr SplineLocationPtr;\n};\n"
  },
  {
    "path": "Source/SOrb/SplineLogic/SoPlayerSpline.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#include \"SoPlayerSpline.h\"\n\n#include \"Components/SplineComponent.h\"\n\n#include \"Basic/Helpers/SoStaticHelper.h\"\n#include \"Character/SoCharacter.h\"\n#include \"Levels/SoLevelManager.h\"\n#include \"SplineLogic/SoMarker.h\"\n#include \"SplineLogic/SoEditorGameInterface.h\"\n#include \"Basic/SoGameMode.h\"\n#include \"Levels/SoLevelHelper.h\"\n\nbool ASoPlayerSpline::bHideCameraKeys = true;\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool FSoLevelClaim::DoesClaim(const float SplineDistance) const\n{\n\treturn (LowerBorder == nullptr || LowerBorder->GetSplineLocation().GetDistance() <= SplineDistance)\n\t\t&& (UpperBorder == nullptr || UpperBorder->GetSplineLocation().GetDistance() >= SplineDistance);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// Sets default values\nASoPlayerSpline::ASoPlayerSpline(const FObjectInitializer& ObjectInitializer) :\n\tASoSpline(ObjectInitializer)\n{\n\tPrimaryActorTick.bCanEverTick = false;\n}\n\n#if WITH_EDITOR\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoPlayerSpline::OnConstruction(const FTransform& Transform)\n{\n\tSuper::OnConstruction(Transform);\n\n\tSkyControlPoints.ValidateStartAndEnd(this);\n\n\t// naming scheme:\n\t// - first two characters determines a level (e.g. LLShore -> LuckyLake\n\t// - first two characters determines a level + To + next two characters determines another level (e.g. PCToDO -> PortalCave, DwarvenOutpost)\n\tconst FName PrimaryLevelFromName = USoLevelHelper::GetLevelNameFromPreTag(SplineName.Left(2));\n\tbool bHasPrimaryLevelFromName = false;\n\tFName SecondaryLevelFromName = NAME_None;\n\tbool bHasSecondaryLevelFromName = false;\n\n\tif (SplineName.Len() > 6 && SplineName.Mid(2, 2).Equals(\"To\"))\n\t\tSecondaryLevelFromName = USoLevelHelper::GetLevelNameFromPreTag(SplineName.Mid(4, 2));\n\n\tfor (auto& LevelClaim : LevelClaims)\n\t{\n\t\tLevelClaim.LevelName = FName(*LevelClaim.Level.GetAssetName());\n\n\t\tif (LevelClaim.LevelName == PrimaryLevelFromName || LevelClaim.LevelName == SecondaryLevelFromName)\n\t\t{\n\t\t\t// level based on name, whole spline must be involved\n\t\t\tLevelClaim.LowerBorder = nullptr;\n\t\t\tLevelClaim.UpperBorder = nullptr;\n\t\t\tif (LevelClaim.LevelName == PrimaryLevelFromName)\n\t\t\t\tbHasPrimaryLevelFromName = true;\n\t\t\telse\n\t\t\t\tbHasSecondaryLevelFromName = true;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tbool bPrintError = false;\n\t\t\tif (LevelClaim.LowerBorder != nullptr && LevelClaim.LowerBorder->GetLevel() != GetLevel())\n\t\t\t{\n\t\t\t\tLevelClaim.LowerBorder = nullptr;\n\t\t\t\tbPrintError = true;\n\t\t\t}\n\t\t\tif (LevelClaim.UpperBorder != nullptr && LevelClaim.UpperBorder->GetLevel() != GetLevel())\n\t\t\t{\n\t\t\t\tLevelClaim.UpperBorder = nullptr;\n\t\t\t\tbPrintError = true;\n\t\t\t}\n\t\t\tif (bPrintError)\n\t\t\t\tUE_LOG(LogSoLevelManager, Warning, TEXT(\"LevelClaim marker has to be located in the same level as the spline it is located at!\"));\n\n\t\t\t// ToThink: maybe we don't need this, if we ever need to define to opened spline segments for the same streaming level, it should be removed :/\n\t\t\tif (LevelClaim.LowerBorder != nullptr && LevelClaim.UpperBorder != nullptr &&\n\t\t\t\tLevelClaim.LowerBorder->GetSplineLocation().GetDistance() > LevelClaim.UpperBorder->GetSplineLocation().GetDistance())\n\t\t\t{\n\t\t\t\tauto* Temp = LevelClaim.LowerBorder;\n\t\t\t\tLevelClaim.LowerBorder = LevelClaim.UpperBorder;\n\t\t\t\tLevelClaim.UpperBorder = Temp;\n\n\t\t\t\tUE_LOG(LogSoLevelManager, Warning, TEXT(\"LevelClaim markers swapped: LowerBorder has to have the smaller spline distance!\"));\n\t\t\t}\n\t\t}\n\t}\n\n\tif (!bHasPrimaryLevelFromName && PrimaryLevelFromName != NAME_None)\n\t\tLevelClaims.Add( FSoLevelClaim{ nullptr, nullptr, *USoLevelHelper::GetLevelFromPreTag(SplineName.Left(2)), PrimaryLevelFromName });\n\n\tif (!bHasSecondaryLevelFromName && SecondaryLevelFromName != NAME_None)\n\t\tLevelClaims.Add(FSoLevelClaim{ nullptr, nullptr, *USoLevelHelper::GetLevelFromPreTag(SplineName.Mid(4, 2)), SecondaryLevelFromName });\n\n\tfor (auto& Segment : SoulKeeperFreeSegments)\n\t\tif (Segment.LowerBorder != nullptr && Segment.UpperBorder != nullptr && Segment.LowerBorder->GetDistanceOnSpline() > Segment.UpperBorder->GetDistanceOnSpline())\n\t\t\tSwap(Segment.LowerBorder, Segment.UpperBorder);\n\n\tUpdateCameraKeyData();\n\n\tUpdateAmbientControlKeys();\n}\n#endif\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// Called when the game starts or when spawned\nvoid ASoPlayerSpline::BeginPlay()\n{\n\tSuper::BeginPlay();\n\n\t// init cam data - maybe there is no entry atm\n\tCamNodes.CamKeys.Empty();\n\tCamNodes.CamKeys.Add(FSoCamKeyNode(FSoSplinePoint(this, 0)));\n\tCamNodes.CamKeys.Add(FSoCamKeyNode(FSoSplinePoint(this, Spline->GetSplineLength())));\n\n\tAmbientControlPointsWorldSpace = AmbientControlPoints;\n\tfor (FSoAmbientControlPoint& ControlPoint : AmbientControlPointsWorldSpace)\n\t\tControlPoint.Location = GetTransform().TransformPosition(ControlPoint.Location);\n\n\tAmbientControlPointsWorldSpace.Sort([](const FSoAmbientControlPoint& A, const FSoAmbientControlPoint& B)\n\t{\n\t\treturn A.DistanceOnSpline < B.DistanceOnSpline;\n\t});\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool ASoPlayerSpline::IsSoulkeeperUsageAllowed(float Distance, float ZDistance) const\n{\n\tfor (const auto& Segment : SoulKeeperFreeSegments)\n\t\tif ((Segment.LowerBorder == nullptr || Segment.LowerBorder->GetDistanceOnSpline() < Distance) &&\n\t\t\t(Segment.UpperBorder == nullptr || Segment.UpperBorder->GetDistanceOnSpline() > Distance))\n\t\t\treturn false;\n\n\tstatic const float SoulkeeperBanHalfWidth = 200.0f;\n\tstatic const float SoulkeeperBanHalfHeight = 400.0f;\n\n\tfor (const auto& SpawnLoc : EnemySpawnLocations)\n\t\tif ((fabs(Distance - SpawnLoc.Distance) < SoulkeeperBanHalfWidth) && (fabs(ZDistance - SpawnLoc.ZDistance) < SoulkeeperBanHalfHeight))\n\t\t{\n\t\t\tif (SpawnLoc.GroupName == NAME_None ||\n\t\t\t\tASoGameMode::Get(this).IsEnemyGroupStillActive(SpawnLoc.GroupName))\n\t\t\t\treturn false;\n\t\t}\n\n\treturn true;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoPlayerSpline::RegisterEnemySpawnLocation(float Distance, float ZDistance, FName GroupName)\n{\n\t// one location should be only registered once\n\tfor (const FSoEnemySpawnLocation& SpawnLoc : EnemySpawnLocations)\n\t\tif (fabs(SpawnLoc.Distance - Distance) < 1.0f &&\n\t\t\tfabs(SpawnLoc.ZDistance - ZDistance) < 1.0f &&\n\t\t\tSpawnLoc.GroupName == GroupName)\n\t\t\treturn;\n\n\tEnemySpawnLocations.Add(FSoEnemySpawnLocation{ Distance, ZDistance, GroupName });\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoPlayerSpline::SetupCameraData(const FSoCamNodeList& CamNodeList)\n{\n\tif (CamNodeList.CamKeys.Num() < 2)\n\t{\n\t\tUE_LOG(LogSoCameraDataIO, Error, TEXT(\"ASoSpline::SetupCameraData failed - input must contain at least 2 nodes\"));\n\t\treturn;\n\t}\n\n\tCameraKeyPoints.Empty();\n\n\tCamNodes = CamNodeList;\n\t// CamNodes.ReScale(Spline->GetSplineLength());\n\tCamNodes.CamKeys[CamNodes.CamKeys.Num() - 1].Distance = Spline->GetSplineLength();\n\n\tfor (int i = 0; i < CamNodes.CamKeys.Num(); ++i)\n\t{\n\t\tCamNodes.CamKeys[i].SplinePoint = FSoSplinePoint(this, CamNodes.CamKeys[i].Distance);\n\t\tCamNodes.CamKeys[i].Position = CamNodes.CamKeys[i].SplinePoint;\n\n#if WITH_EDITOR\n\t\tCameraKeyPoints.Add(GetTransform().InverseTransformPosition(CamNodes.CamKeys[i].Position + FVector(0, 0, CamKeyVisZOffset)));\n\n\t\tif (!bHideCameraKeys)\n\t\t\tCameraKeyPointsV = CameraKeyPoints;\n#endif\n\t}\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoPlayerSpline::UpdateCameraKeyData()\n{\n\tif (CameraKeyPoints.Num() == CamNodes.CamKeys.Num() && CameraKeyPoints.Num() > 1)\n\t{\n\t\t// update cam data based on visualized stuff\n\t\tif (!bHideCameraKeys && CameraKeyPointsV.Num() == CamNodes.CamKeys.Num())\n\t\t\t\tCameraKeyPoints = CameraKeyPointsV;\n\n\t\t// fix first key & visualization point\n\t\tCamNodes.CamKeys[0].Distance = 0.0f;\n\t\tCamNodes.CamKeys[0].SplinePoint = FSoSplinePoint(this, 0.0f);\n\t\tCamNodes.CamKeys[0].Position = CamNodes.CamKeys[0].SplinePoint;\n\t\tCameraKeyPoints[0] = GetTransform().InverseTransformPosition(CamNodes.CamKeys[0].Position + FVector(0, 0, CamKeyVisZOffset));\n\n\t\t// fix last key & visualization point\n\t\tconst int32 LastIndex = CamNodes.CamKeys.Num() - 1;\n\t\tCamNodes.CamKeys[LastIndex].Distance = Spline->GetSplineLength();\n\t\tCamNodes.CamKeys[LastIndex].SplinePoint = FSoSplinePoint(this, CamNodes.CamKeys[LastIndex].Distance);\n\t\tCamNodes.CamKeys[LastIndex].Position = CamNodes.CamKeys[LastIndex].SplinePoint;\n\t\tCameraKeyPoints[LastIndex] = GetTransform().InverseTransformPosition(CamNodes.CamKeys[LastIndex].Position + FVector(0, 0, CamKeyVisZOffset));\n\n\t\t// modify cam data based on the rest\n\t\tfor (int32 i = 1; i < LastIndex; ++i)\n\t\t{\n\t\t\t// calc spline point based on the visualizer point\n\t\t\tFSoSplinePoint& Point = CamNodes.CamKeys[i].SplinePoint;\n\t\t\tFVector WorldPoint = GetTransform().TransformPosition(CameraKeyPoints[i]);\n\t\t\tWorldPoint.Z = GetActorLocation().Z;\n\t\t\tPoint.SetDistanceFromWorldLocation(WorldPoint);\n\t\t\t// refresh data based on the calculated spline point\n\t\t\tCamNodes.CamKeys[i].Distance = Point.GetDistance();\n\t\t\tCamNodes.CamKeys[i].Position = Point;\n\t\t}\n\n\t\t// sort based on distance to keep the data valid\n\t\tCamNodes.CamKeys.Sort([](const FSoCamKeyNode& First, const FSoCamKeyNode& Second) { return First.Distance < Second.Distance; });\n\n\t\t// refresh visualizer locations to force them to the spline\n\t\tfor (int32 i = 1; i < LastIndex; ++i)\n\t\t\tCameraKeyPoints[i] = GetTransform().InverseTransformPosition(CamNodes.CamKeys[i].Position + FVector(0, 0, CamKeyVisZOffset));\n\t}\n\telse\n\t{\n\t\tCameraKeyPoints.Empty();\n\t\tfor (int i = 0; i < CamNodes.CamKeys.Num(); ++i)\n\t\t\tCameraKeyPoints.Add(GetTransform().InverseTransformPosition(CamNodes.CamKeys[i].Position + FVector(0, 0, CamKeyVisZOffset)));\n\t}\n\n\t// modify the visualizers based on the real data\n\tif (bHideCameraKeys)\n\t\tCameraKeyPointsV.Empty();\n\telse\n\t\tCameraKeyPointsV = CameraKeyPoints;\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoPlayerSpline::UpdateAmbientControlKeys()\n{\n\tfor (FSoAmbientControlPoint& ControlPoint : AmbientControlPoints)\n\t{\n\t\t// calc spline point based on the visualizer point\n\t\tFSoSplinePoint Point;\n\t\tPoint.SetSpline(this);\n\t\tconst FVector WorldPoint = FVector(FVector2D(GetTransform().TransformPosition(ControlPoint.Location)), GetActorLocation().Z);\n\t\tPoint.SetDistanceFromWorldLocation(WorldPoint);\n\t\tControlPoint.DistanceOnSpline = Point.GetDistance();\n\n\t\tconst FVector NewLocation = GetTransform().InverseTransformPosition(FVector(Point));\n\t\tControlPoint.Location.X = NewLocation.X;\n\t\tControlPoint.Location.Y = NewLocation.Y;\n\t}\n}\n"
  },
  {
    "path": "Source/SOrb/SplineLogic/SoPlayerSpline.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#pragma once\n#include \"CoreMinimal.h\"\n\n#include \"SoSpline.h\"\n#include \"SoSkyControlData.h\"\n#include \"SoCameraData.h\"\n#include \"SoCharShadowData.h\"\n#include \"SaveFiles/Stats/SoPlayerProgressSplineStats.h\"\n#include \"Basic/Helpers/SoPlatformHelper.h\"\n\n#include \"SoPlayerSpline.generated.h\"\n\nclass ASoMarker;\nclass UFMODEvent;\nclass ASoPlayerSpline;\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// LowerBorder and UpperBorder have to be on the same spline, they define a spline segment\n// The streaming level with the name LevelName has to be active if the player is in the defined segment\n// if a Border Marker is nullptr the interval is opened in the given direction\nUSTRUCT(BlueprintType)\nstruct FSoLevelClaim\n{\n\tGENERATED_USTRUCT_BODY()\n\npublic:\n\t// Does this level claim cover the spline distance?\n\tbool DoesClaim(const float SplineDistance) const;\n\npublic:\n\t// border with smaller distance from spline value (nullptr means 0)\n\tUPROPERTY(EditAnywhere, BlueprintReadOnly)\n\tASoMarker* LowerBorder;\n\n\t// border with bigger distance from spline value (nullptr means endless)\n\tUPROPERTY(EditAnywhere, BlueprintReadOnly)\n\tASoMarker* UpperBorder;\n\n\t// streaming level bounded by this segment\n\tUPROPERTY(EditAnywhere, meta = (AllowedClasses = \"World\"))\n\tFSoftObjectPath Level;\n\n\t// name of the streaming level bounded by this segment\n\tUPROPERTY(BlueprintReadOnly)\n\tFName LevelName;\n};\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// used by the editor to setup the level claims\nUSTRUCT(BlueprintType)\nstruct FSoLevelClaimEntry\n{\n\tGENERATED_USTRUCT_BODY()\n\npublic:\n\t// border with smaller distance from spline value (nullptr means 0)\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite)\n\tASoMarker* LowerBorder = nullptr;\n\n\t// border with bigger distance from spline value (nullptr means endless)\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite)\n\tASoMarker* UpperBorder = nullptr;\n\n\t// the associated spline\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite)\n\tASoPlayerSpline* Spline = nullptr;\n};\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUSTRUCT(BlueprintType)\nstruct FSoSoulKeeperFreeSegment\n{\n\tGENERATED_USTRUCT_BODY()\n\npublic:\n\t// border with smaller distance from spline value (nullptr means 0)\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite)\n\tASoMarker* LowerBorder = nullptr;\n\n\t// border with bigger distance from spline value (nullptr means endless)\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite)\n\tASoMarker* UpperBorder = nullptr;\n};\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n/**\n *  Used to stop player from placing Soulkeeper to placed enemy spawn positions\n *  Registered in ASoEnemy Post Load\n *  Only counts if the enemy group is still alive (or none)\n */\nUSTRUCT(BlueprintType)\nstruct FSoEnemySpawnLocation\n{\n\tGENERATED_USTRUCT_BODY()\n\npublic:\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite)\n\tfloat Distance;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite)\n\tfloat ZDistance;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite)\n\tFName GroupName;\n};\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUSTRUCT(BlueprintType, Blueprintable)\nstruct FSoAmbientParameter\n{\n\tGENERATED_USTRUCT_BODY()\n\npublic:\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite)\n\tFName ParameterName;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite)\n\tfloat ParameterValue;\n};\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUSTRUCT(BlueprintType, Blueprintable)\nstruct FSoAmbientControlPoint\n{\n\tGENERATED_USTRUCT_BODY()\n\npublic:\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Meta = (MakeEditWidget = true))\n\tFVector Location;\n\n\tUPROPERTY(VisibleAnywhere)\n\tfloat DistanceOnSpline;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite)\n\tTArray<FSoAmbientParameter> Parameters;\n};\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUCLASS()\nclass SORB_API ASoPlayerSpline : public ASoSpline\n{\n\tGENERATED_BODY()\n\npublic:\n\n\tASoPlayerSpline(const FObjectInitializer& ObjectInitializer);\n\n\t// Called when the game starts or when spawned\n\tvirtual void BeginPlay() override;\n\n#if WITH_EDITOR\n\tvirtual void OnConstruction(const FTransform& Transform) override;\n#endif\n\n\tvoid RegisterEnemySpawnLocation(float Distance, float ZDistance, FName GroupName);\n\n\tvoid SetupCameraData(const FSoCamNodeList& CamNodeList);\n\tconst FSoCamNodeList& GetCamNodeList() const { return CamNodes; }\n\tFSoCamNodeList& GetCamNodeList() { return CamNodes; }\n\n\tUFUNCTION(BlueprintCallable, Category = Camera)\n\tint32 GetCamKeyNum() const { return CamNodes.CamKeys.Num(); }\n\n\tconst TArray<FSoLevelClaim>& GetLevelClaims() const { return LevelClaims; }\n\n\tconst TArray<FSoAmbientControlPoint>& GetAmbientControlPoints() const { return AmbientControlPointsWorldSpace; }\n\n\tFSoSkyControlPoints& GetSkyControlPoints() { return SkyControlPoints; }\n\tconst FSoSkyControlPoints& GetSkyControlPoints() const { return SkyControlPoints; }\n\n\tFSoCharShadowNodeList& GetCharShadowControlPoints() { return CharShadowControlPoints; }\n\tconst FSoCharShadowNodeList& GetCharShadowControlPoints() const { return CharShadowControlPoints; }\n\n\tbool IsSoulkeeperUsageAllowed(float Distance, float ZDistance) const;\n\n\tbool ShouldSpawnSKBetweenCharacterAndCamera() const { return bSpawnSKBetweenCharacterAndCamera; }\n\n\tvoid UpdateCameraKeyData();\n\tvoid UpdateAmbientControlKeys();\n\n\tUFMODEvent* GetMusic() const { return Music; }\n\n\tfloat GetCharacterEmissiveStrength() const { return CharacterEmissiveStrength; }\n\tbool ShouldUseCharacterEmissiveStrength() const { return bUseCharacterEmissiveStrength; }\n\n\tUFUNCTION(BlueprintPure, Category = LevelDesgin)\n\tASoMarker* GetResPointOverride(bool bExit) const { return bExit ? ResPointOverrideExit : ResPointOverride; }\n\n\tUFUNCTION(BlueprintCallable, Category = LevelDesgin)\n\tvoid SetRotateCameraWith180Yaw(bool bEnable) { bRotateCameraWith180Yaw = bEnable; }\n\n\tbool GetRotateCameraWith180Yaw() const { return bRotateCameraWith180Yaw; }\n\n\t//\n\t// Performance stats this player spline.\n\t// NOTE: Kept in the Spline so that it is easier to track and calculate\n\t//\n\n\tFORCEINLINE void TickPerformanceStats(float DeltaSeconds)\n\t{\n\t\tFrameTickForAverageNum++;\n\t\tFrameTickForCriticalNum++;\n\t\tTimeSinceAverageReset += DeltaSeconds;\n\t\tTimeSinceCriticalReset += DeltaSeconds;\n\t}\n\n\t// Updates the Critical FPS\n\tvoid UpdateCriticalPerformanceStats(float PlayerDistance)\n\t{\n\t\tif (TimeSinceCriticalReset < 1.f)\n\t\t\treturn;\n\n\t\tif (USoPlatformHelper::IsGameInBackground(this))\n\t\t{\n\t\t\t// Prevent counting when game is in background\n\t\t\tResetCriticalPerformanceStats();\n\t\t\treturn;\n\t\t}\n\n\t\tconst float AverageCriticalFPS = FrameTickForCriticalNum / TimeSinceCriticalReset;\n\t\tif (IsCriticalFPS(AverageCriticalFPS))\n\t\t{\n\t\t\t// Add new critical FPS entry\n\t\t\tFSoSplineCriticalFPSLocation CriticalFPS;\n\t\t\tCriticalFPS.UpdateCriticalAverageFPS(AverageCriticalFPS);\n\t\t\tCriticalFPS.UpdateAverageDistance(PlayerDistance);\n\t\t\tCriticalFPS.TimeSeconds = TimeSinceCriticalReset;\n\n\t\t\tCriticalFPSAreas.AddCriticalFPS(CriticalFPS);\n\t\t}\n\n\t\tResetCriticalPerformanceStats();\n\t}\n\n\tFORCEINLINE float GetAverageFPS() const\n\t{\n\t\treturn FrameTickForAverageNum / TimeSinceAverageReset;\n\t}\n\n\tFORCEINLINE bool HasAveragePerformanceStats(float AccumulateThreshold = 1.0f) const\n\t{\n\t\treturn FrameTickForAverageNum > 0 && TimeSinceAverageReset > AccumulateThreshold;\n\t}\n\n\tFORCEINLINE bool HasCriticalPerformanceStats() const\n\t{\n\t\treturn CriticalFPSAreas.HasAreas();\n\t}\n\n\tFORCEINLINE const FSoSplineCriticalFPSAreas& GetCriticalFPSAreas() const\n\t{\n\t\treturn CriticalFPSAreas;\n\t}\n\n\tFORCEINLINE void ResetCriticalFPSAreas()\n\t{\n\t\tCriticalFPSAreas = {};\n\t}\n\n\tFORCEINLINE void ResetAveragePerformanceStats()\n\t{\n\t\tFrameTickForAverageNum = 0;\n\t\tTimeSinceAverageReset = 0.f;\n\t}\n\n\tFORCEINLINE void ResetCriticalPerformanceStats()\n\t{\n\t\tFrameTickForCriticalNum = 0;\n\t\tTimeSinceCriticalReset = 0.f;\n\t}\n\n\tstatic FORCEINLINE bool IsCriticalFPS(float FPS)\n\t{\n\t\treturn FPS < CriticalFPSThreshold;\n\t}\n\npublic:\n\tstatic bool bHideCameraKeys;\n\n\t// Under this FPS everything gets reported\n\tstatic constexpr float CriticalFPSThreshold = 27.f;\n\nprotected:\n\n\t// list of streaming levels and associated spline segments\n\t// markers have to be in the same level as the spline\n\tUPROPERTY(EditAnywhere, BlueprintReadOnly, Category = \"LevelDesign|General\")\n\tTArray<FSoLevelClaim> LevelClaims;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadOnly, Category = \"LevelDesign|General\")\n\tTArray<FSoSoulKeeperFreeSegment> SoulKeeperFreeSegments;\n\n\t/** runtime constructed array of placed enemy locations */\n\tUPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = \"LevelDesign|General\")\n\tTArray<FSoEnemySpawnLocation> EnemySpawnLocations;\n\n\t/** Character Respawns here instead of arcade if he dies on this Spline if set */\n\tUPROPERTY(EditAnywhere, BlueprintReadOnly, Category = \"LevelDesign|General\")\n\tASoMarker* ResPointOverride;\n\n\t/** Character can respawn here instead of ResPointOverride if he choses to */\n\tUPROPERTY(EditAnywhere, BlueprintReadOnly, Category = \"LevelDesign|General\")\n\tASoMarker* ResPointOverrideExit;\n\n\n\tUPROPERTY(EditAnywhere, BlueprintReadOnly, Category = \"LevelDesign|General\")\n\tFText AreaName;\n\n\n\tUPROPERTY(EditAnywhere, BlueprintReadOnly, Category = \"LevelDesign|General\")\n\tUFMODEvent* Music;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadOnly, Category = \"LevelDesign|General\")\n\tfloat CharacterEmissiveStrength = 0.3f;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadOnly, Category = \"LevelDesign|General\")\n\tbool bUseCharacterEmissiveStrength = false;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadOnly, Category = \"LevelDesign|General\")\n\tbool bSpawnSKBetweenCharacterAndCamera = false;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadOnly, Category = \"LevelDesign|General\")\n\tbool bRotateCameraWith180Yaw = false;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = \"LevelDesign|CamData\")\n\tFSoCamNodeList CamNodes;\n\n\t// camera point locations in local space - they will try to keep it as much as possible when the spline is modified\n\tUPROPERTY(EditFixedSize)\n\tTArray<FVector> CameraKeyPoints;\n\n\t// used to visualize (and replace) camera keys\n\tUPROPERTY(EditAnywhere, EditFixedSize, BlueprintReadWrite, Category = \"LevelDesign|CamData\", Meta = (MakeEditWidget = true))\n\tTArray<FVector> CameraKeyPointsV;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = \"LevelDesign|CamData\")\n\tfloat CamKeyVisZOffset = 10.0f;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = \"LevelDesign|Ambient\")\n\tTArray<FSoAmbientControlPoint> AmbientControlPoints;\n\n\tTArray<FSoAmbientControlPoint> AmbientControlPointsWorldSpace;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = \"LevelDesign|SkyControl\")\n\tFSoSkyControlPoints SkyControlPoints;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = \"LevelDesign|CharShadowControl\")\n\tFSoCharShadowNodeList CharShadowControlPoints;\n\n\t// Performance variables\n\tint32 FrameTickForAverageNum = 0;\n\tint32 FrameTickForCriticalNum = 0;\n\n\tfloat TimeSinceAverageReset = 0.f;\n\tfloat TimeSinceCriticalReset = 0.f;\n\n\t// Holds the instances of the critical fps entries\n\tFSoSplineCriticalFPSAreas CriticalFPSAreas;\n};\n"
  },
  {
    "path": "Source/SOrb/SplineLogic/SoPrecomputedVisibility.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n\n#include \"SoPrecomputedVisibility.h\"\n\n\n"
  },
  {
    "path": "Source/SOrb/SplineLogic/SoPrecomputedVisibility.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#pragma once\n\n#include \"CoreMinimal.h\"\n\n#include \"RenderCore/Public/RendererInterface.h\"\n\nclass SoCustomVisibilityQuery: public ICustomVisibilityQuery\n{\npublic:\n\t/** prepares the query for visibility tests */\n\tvirtual bool Prepare() override { return true; }\n\n\t/** test primitive visiblity */\n\tvirtual bool IsVisible(int32 VisibilityId, const FBoxSphereBounds& Bounds) override { return false; }\n\n\t/** return true if we can call IsVisible from a ParallelFor */\n\tvirtual bool IsThreadsafe() override\n\t{\n\t\treturn true;\n\t}\n\n\tvirtual ~SoCustomVisibilityQuery() {};\n\n\n\tvirtual uint32 AddRef() const override { return ++NumRefs; }\n\tvirtual uint32 Release() const override { return 0; }\n\tvirtual uint32 GetRefCount() const override { return 0; }\n\nprivate:\n\n\tmutable int32 NumRefs;\n};\n\nclass SoCustomCulling : public ICustomCulling\n{\npublic:\n\n\tvirtual ~SoCustomCulling() {};\n\n\tvirtual ICustomVisibilityQuery* CreateQuery(const FSceneView& View) override\n\t{\n\t\treturn &CustomVisibilityQuery;\n\t}\n\nprotected:\n\n\tSoCustomVisibilityQuery CustomVisibilityQuery;\n};\n\n"
  },
  {
    "path": "Source/SOrb/SplineLogic/SoSkyControlData.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#include \"SoSkyControlData.h\"\n#include \"Components/SplineComponent.h\"\n#include \"Objects/SoSky.h\"\n#include \"SoPlayerSpline.h\"\n#include \"Basic/SoGameSingleton.h\"\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFSoSkyControlValue::FSoSkyControlValue(const FSoSkyControlPoint& First, const FSoSkyControlPoint& Second, float InSecondWeight)\n{\n\tFirstPreset = First.Preset;\n\tSecondPreset = Second.Preset;\n\tSecondWeight = InSecondWeight;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFSoSkyControlValue::FSoSkyControlValue()\n{\n\tFirstPreset = ASoSky::DefaultPresetName;\n\tSecondPreset = ASoSky::DefaultPresetName;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFSoSkyControlValue::FSoSkyControlValue(const FSoSkyControlPoint& Only)\n{\n\tFirstPreset = Only.Preset;\n\tSecondPreset = ASoSky::DefaultPresetName;\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFSoSkyControlValue FSoSkyControlPoints::GetInterpolated(const FSoSplinePoint& Location) const\n{\n\tFSoSkyControlValue Value;\n\n\tconst float Distance = Location.GetDistance();\n\tint32 Index = 0;\n\n\tfor (; Index + 1 < ControlPoints.Num() && ControlPoints[Index + 1].Distance < Distance; ++Index);\n\n\tif (Index < ControlPoints.Num())\n\t{\n\t\tif (Index == ControlPoints.Num() - 1)\n\t\t\tValue = FSoSkyControlValue{ ControlPoints[Index] };\n\t\telse\n\t\t{\n\t\t\tconst float FirstDistance = ControlPoints[Index].Distance;\n\t\t\tconst float SecondDistance = ControlPoints[Index + 1].Distance;\n\n\t\t\tif (fabs(SecondDistance - FirstDistance) < KINDA_SMALL_NUMBER)\n\t\t\t\tValue = FSoSkyControlValue{ ControlPoints[Index] };\n\t\t\telse\n\t\t\t{\n\t\t\t\tconst float SecondWeight = (Distance - FirstDistance) / (SecondDistance - FirstDistance);\n\t\t\t\tValue = FSoSkyControlValue{ ControlPoints[Index], ControlPoints[Index + 1], SecondWeight };\n\t\t\t}\n\t\t}\n\t}\n\treturn Value;\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSoSkyControlPoints::ClearAndCreateDefaults(ASoPlayerSpline* Spline)\n{\n\tif (Spline == nullptr)\n\t\treturn;\n\n\tControlPoints.Empty();\n\tconst FString& SplineName = Spline->GetSplineName();\n\n\tFName StartSkyPreset = USoGameSingleton::GetDefaultSkyPresetFromSplineName(SplineName, true);\n\tFName EndSkyPreset = USoGameSingleton::GetDefaultSkyPresetFromSplineName(SplineName, false);\n\n\tif (StartSkyPreset == NAME_None)\n\t\tStartSkyPreset = ASoSky::DefaultPresetName;\n\tif (EndSkyPreset == NAME_None)\n\t\tEndSkyPreset = ASoSky::DefaultPresetName;\n\n\tControlPoints.Add({ StartSkyPreset, 0.0f });\n\tControlPoints.Add({ EndSkyPreset, Spline->GetSplineComponent()->GetSplineLength() });\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSoSkyControlPoints::ValidateStartAndEnd(ASoPlayerSpline* Spline)\n{\n\tif (ControlPoints.Num() < 2)\n\t\tClearAndCreateDefaults(Spline);\n\telse\n\t{\n\t\tControlPoints[0].Distance = 0;\n\t\tControlPoints[ControlPoints.Num() - 1].Distance = Spline->GetSplineComponent()->GetSplineLength();\n\t}\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSoSkyControlPoints::CreateNewPoint(float Distance)\n{\n\tint32 Index = 0;\n\twhile (Index < ControlPoints.Num() && ControlPoints[Index].Distance < Distance)\n\t\t++Index;\n\n\tFSoSkyControlPoint Point;\n\tPoint.Distance = Distance;\n\tif (Index > 0)\n\t\tPoint.Preset = ControlPoints[Index - 1].Preset;\n\telse\n\t\tif (Index < ControlPoints.Num())\n\t\t\tPoint.Preset = ControlPoints[Index].Preset;\n\n\tControlPoints.Insert(Point, Index);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nint32 FSoSkyControlPoints::GetClosestIndex(float Distance) const\n{\n\tif (ControlPoints.Num() == 0)\n\t\treturn -1;\n\n\tint32 Index = 0;\n\twhile (Index < ControlPoints.Num() && ControlPoints[Index].Distance < Distance)\n\t\t++Index;\n\n\tconst int32 PreIndex = FMath::Max(0, Index - 1);\n\tconst int32 PostIndex = FMath::Min(Index, ControlPoints.Num() - 1);\n\n\tif (fabs(ControlPoints[PreIndex].Distance - Distance) < fabs(ControlPoints[PostIndex].Distance - Distance))\n\t\treturn PreIndex;\n\n\treturn PostIndex;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nint32 FSoSkyControlPoints::GetPrevIndex(float Distance) const\n{\n\tint32 Index = 0;\n\twhile (Index < ControlPoints.Num() && ControlPoints[Index].Distance < Distance)\n\t\t++Index;\n\n\treturn FMath::Max(Index - 1, 0);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nint32 FSoSkyControlPoints::GetNextIndex(float Distance) const\n{\n\tint32 Index = 0;\n\twhile (Index < ControlPoints.Num() && ControlPoints[Index].Distance < Distance)\n\t\t++Index;\n\n\treturn FMath::Min(Index, ControlPoints.Num() - 1);\n}\n"
  },
  {
    "path": "Source/SOrb/SplineLogic/SoSkyControlData.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#pragma once\n#include \"CoreMinimal.h\"\n\n#include \"SoSkyControlData.generated.h\"\n\nstruct FSoSplinePoint;\nclass ASoPlayerSpline;\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUSTRUCT(BlueprintType)\nstruct FSoSkyControlPoint\n{\n\tGENERATED_USTRUCT_BODY()\npublic:\n\tFSoSkyControlPoint() {};\n\n\tFSoSkyControlPoint(FName InPreset, float InDistance) : Preset(InPreset), Distance(InDistance) {};\n\n\tUPROPERTY(EditAnywhere)\n\tFName Preset = FName(\"Default\");\n\n\tUPROPERTY(EditAnywhere)\n\tfloat Distance = 0.0f;\n};\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUSTRUCT(BlueprintType)\nstruct FSoSkyControlValue\n{\n\tGENERATED_USTRUCT_BODY()\n\npublic:\n\tFSoSkyControlValue();\n\tFSoSkyControlValue(const FSoSkyControlPoint& Only);\n\tFSoSkyControlValue(const FSoSkyControlPoint& First, const FSoSkyControlPoint& Second, float InSecondWeight);\n\npublic:\n\n\tUPROPERTY(BlueprintReadOnly)\n\tFName FirstPreset;\n\n\tUPROPERTY(BlueprintReadOnly)\n\tFName SecondPreset;\n\n\tUPROPERTY(BlueprintReadOnly)\n\tfloat SecondWeight = 0.0f;\n};\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUSTRUCT(BlueprintType)\nstruct FSoSkyControlPoints\n{\n\tGENERATED_USTRUCT_BODY()\n\npublic:\n\n\tFSoSkyControlValue GetInterpolated(const FSoSplinePoint& Location) const;\n\n\tvoid ClearAndCreateDefaults(ASoPlayerSpline* Spline);\n\tvoid ValidateStartAndEnd(ASoPlayerSpline* Spline);\n\n\tvoid CreateNewPoint(float Distance);\n\n\tint32 GetClosestIndex(float Distance) const;\n\tint32 GetPrevIndex(float Distance) const;\n\tint32 GetNextIndex(float Distance) const;\n\npublic:\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite)\n\tTArray<FSoSkyControlPoint> ControlPoints;\n};\n"
  },
  {
    "path": "Source/SOrb/SplineLogic/SoSpline.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#include \"SoSpline.h\"\n\n#include \"Components/SplineComponent.h\"\n\n#include \"Basic/SoGameMode.h\"\n#include \"SoSplinePoint.h\"\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// Sets default values\nASoSpline::ASoSpline(const FObjectInitializer& ObjectInitializer)\n{\n \t// spline tick isn't required\n\tPrimaryActorTick.bCanEverTick = false;\n\n\tSpline = ObjectInitializer.CreateDefaultSubobject<USplineComponent>(this, TEXT(\"Spline\"));\n\tRootComponent = Spline;\n}\n\n#if WITH_EDITOR\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoSpline::OnConstruction(const FTransform& Transform)\n{\n\tSuper::OnConstruction(Transform);\n\t// actor name update\n\tSplineName = GetActorLabel();\n\n\t// spline prev/next z level updates\n\tconst int32 DesiredPrevSize = FMath::Max(PrevSplines.Num() - 1, 0);\n\tconst int32 OldPrevSize = PrevZLevels.Num();\n\tif (PrevZLevels.Num() != DesiredPrevSize)\n\t\tPrevZLevels.SetNum(DesiredPrevSize);\n\n\tconst FVector PrevLoc = Spline->GetLocationAtDistanceAlongSpline(15, ESplineCoordinateSpace::Local);\n\tfor (int32 i = 0; i < DesiredPrevSize; ++i)\n\t{\n\t\tPrevZLevels[i].X = PrevLoc.X;\n\t\tPrevZLevels[i].Y = PrevLoc.Y;\n\t\tif (i >= OldPrevSize)\n\t\t\tPrevZLevels[i].Z = PrevLoc.Z;\n\t}\n\n\tconst int32 DesiredNextSize = FMath::Max(NextSplines.Num() - 1, 0);\n\tconst int32 OldNextSize = NextZLevels.Num();\n\tif (NextZLevels.Num() != DesiredNextSize)\n\t\tNextZLevels.SetNum(DesiredNextSize);\n\n\tconst FVector NextLoc = Spline->GetLocationAtDistanceAlongSpline(Spline->GetSplineLength() - 15, ESplineCoordinateSpace::Local);\n\tfor (int32 i = 0; i < DesiredNextSize; ++i)\n\t{\n\t\tNextZLevels[i].X = NextLoc.X;\n\t\tNextZLevels[i].Y = NextLoc.Y;\n\t\tif (i >= OldNextSize)\n\t\t\tNextZLevels[i].Z = NextLoc.Z;\n\t}\n\n\t// AI points\n\tif (bShowAIStopPoints)\n\t{\n\t\tif (AIStopPointsV.Num() != 0)\n\t\t{\n\t\t\tAIStopPoints.SetNum(AIStopPointsV.Num());\n\t\t\tauto Point = FSoSplinePoint(this);\n\t\t\tfor (int32 i = 0; i < AIStopPointsV.Num(); ++i)\n\t\t\t{\n\t\t\t\tFVector WorldPoint = GetTransform().TransformPosition(AIStopPointsV[i]);\n\t\t\t\tWorldPoint.Z = GetActorLocation().Z;\n\t\t\t\tPoint.SetDistanceFromWorldLocation(WorldPoint);\n\t\t\t\tAIStopPoints[i] = Point.GetDistance();\n\t\t\t}\n\t\t}\n\n\t\t// sort based on distance to keep the data valid\n\t\tAIStopPoints.Sort([](const float& First, const float& Second) { return First < Second; });\n\n\t\tAIStopPointsV.SetNum(AIStopPoints.Num());\n\t\tfor (int32 i = 0; i < AIStopPoints.Num(); ++i)\n\t\t\tAIStopPointsV[i] = Spline->GetLocationAtDistanceAlongSpline(AIStopPoints[i], ESplineCoordinateSpace::Local);\n\t}\n\telse\n\t\tAIStopPointsV.Empty();\n\n\n\t// direction sanity check\n\tif (Direction != 1)\n\t\tDirection = -1;\n}\n#endif\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// returns one spline which is \"after\" this spline\nASoSpline* ASoSpline::GetNextSpline(const float ZCoordinate) const\n{\n\tif (NextSplines.Num() == 0)\n\t\treturn nullptr;\n\n\tcheck(NextZLevels.Num() == NextSplines.Num() - 1);\n\n\tint32 Index = 0;\n\t// Spline->GetComponentLocation().Z +  is enough to convert to world space\n\t// because the spline has to be horizontal and only the Z coordinate matters anyway\n\twhile (Index < NextZLevels.Num() && Spline->GetComponentLocation().Z + NextZLevels[Index].Z < ZCoordinate)\n\t\t++Index;\n\n\treturn NextSplines[Index];\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// returns one spline which is \"before\" this spline\nASoSpline* ASoSpline::GetPrevSpline(const float ZCoordinate) const\n{\n\tif (PrevSplines.Num() == 0)\n\t\treturn nullptr;\n\n\tcheck(PrevZLevels.Num() == PrevSplines.Num() - 1);\n\n\tint32 Index = 0;\n\t// Spline->GetComponentLocation().Z +  is enough to convert to world space\n\t// because the spline has to be horizontal and only the Z coordinate matters anyway\n\twhile (Index < PrevZLevels.Num() && Spline->GetComponentLocation().Z + PrevZLevels[Index].Z < ZCoordinate)\n\t\t++Index;\n\n\treturn PrevSplines[Index];\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFVector ASoSpline::GetWorldLocationAtDistance(const float Distance) const\n{\n\treturn Spline->GetLocationAtDistanceAlongSpline(Distance, ESplineCoordinateSpace::World);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFRotator ASoSpline::GetWorldRotationAtDistance(const float Distance) const\n{\n\treturn Spline->GetRotationAtDistanceAlongSpline(Distance, ESplineCoordinateSpace::World);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFVector ASoSpline::GetStartWorldLocation() const\n{\n\treturn Spline->GetLocationAtSplinePoint(0, ESplineCoordinateSpace::World);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFVector ASoSpline::GetEndWorldLocation() const\n{\n\treturn Spline->GetLocationAtSplinePoint(Spline->GetNumberOfSplinePoints() - 1, ESplineCoordinateSpace::World);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool ASoSpline::IsInPrevSplines(ASoSpline* SplineToCheck) const\n{\n\tfor (int i = 0; i < PrevSplines.Num(); ++i)\n\t\tif (PrevSplines[i] == SplineToCheck) return true;\n\n\treturn false;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool ASoSpline::IsInNextSplines(ASoSpline* SplineToCheck) const\n{\n\tfor (int i = 0; i < NextSplines.Num(); ++i)\n\t\tif (NextSplines[i] == SplineToCheck) return true;\n\n\treturn false;\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoSpline::MakeCircleSpline(ASoSpline* Spline, float Radius, float TangentModifier, const FVector Scale)\n{\n\tif (Spline == nullptr)\n\t\treturn;\n\n\tUSplineComponent* SplineComponent = Spline->Spline;\n\n\tconst TArray<FVector> Points = {{ Radius,\t0.0f,\t0.0f },\n\t\t\t\t\t\t\t\t\t{ 0.0f,\t\tRadius, 0.0f },\n\t\t\t\t\t\t\t\t\t{ -Radius,\t0.0f,\t0.0f },\n\t\t\t\t\t\t\t\t\t{ 0.0f,\t   -Radius, 0.0f },\n\t\t\t\t\t\t\t\t\t{ Radius,\t0.0f,\t0.0f }};\n\n\n\n\tSplineComponent->SetSplinePoints(Points, ESplineCoordinateSpace::Local, true);\n\n\n\tSplineComponent->SetTangentAtSplinePoint(0, { 0.0f, Radius * TangentModifier, 0.0f }, ESplineCoordinateSpace::Local, true);\n\tSplineComponent->SetTangentAtSplinePoint(4, { 0.0f, Radius * TangentModifier, 0.0f }, ESplineCoordinateSpace::Local, true);\n\tSplineComponent->SetTangentAtSplinePoint(2, { 0.0f, -Radius * TangentModifier, 0.0f }, ESplineCoordinateSpace::Local, true);\n\n\tSplineComponent->SetTangentAtSplinePoint(1, { -Radius * TangentModifier, 0.0f, 0.0f }, ESplineCoordinateSpace::Local, true);\n\tSplineComponent->SetTangentAtSplinePoint(3, { Radius * TangentModifier, 0.0f, 0.0f }, ESplineCoordinateSpace::Local, true);\n\n\tTArray<FInterpCurvePointVector>& ScalePoints = SplineComponent->GetSplinePointsScale().Points;\n\tfor (int32 i = 0; i < ScalePoints.Num(); ++i)\n\t\tScalePoints[i].OutVal = Scale;\n\n\tSplineComponent->UpdateSpline();\n\n\tif (Spline->NextSplines.Num() == 0 || Spline->NextSplines[0] == nullptr)\n\t\tSpline->NextSplines = { Spline };\n\n\tif (Spline->PrevSplines.Num() == 0 || Spline->PrevSplines[0] == nullptr)\n\t\tSpline->PrevSplines = { Spline };\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoSpline::MakeSymmetry(ASoSpline* Spline)\n{\n\tif (Spline == nullptr)\n\t\treturn;\n\n\tUSplineComponent* SplineComponent = Spline->GetSplineComponent();\n\n\tconst int32 SplinePointNum = SplineComponent->GetNumberOfSplinePoints();\n\tif (SplinePointNum < 2)\n\t\treturn;\n\n\tFVector Center = { 0.0f, 0.0f, 0.0f };\n\n\tif ((SplinePointNum % 2) == 0)\n\t{\n\t\tconst FVector Pos0 = SplineComponent->GetLocationAtSplinePoint(SplinePointNum / 2, ESplineCoordinateSpace::Local);\n\t\tconst FVector Pos1 = SplineComponent->GetLocationAtSplinePoint(SplinePointNum / 2 - 1, ESplineCoordinateSpace::Local);\n\t\tCenter = (Pos0 + Pos1) / 2.0f;\n\t}\n\telse\n\t\tCenter = SplineComponent->GetLocationAtSplinePoint(SplinePointNum / 2, ESplineCoordinateSpace::Local);\n\n\tconst int32 FirstIndex = (SplinePointNum / 2) + (SplinePointNum % 2);\n\n\tfor (int32 i = FirstIndex; i < SplinePointNum; ++i)\n\t{\n\t\tconst int32 ToCopy = SplinePointNum - i - 1;\n\t\tcheck(ToCopy >= 0 && ToCopy < SplinePointNum);\n\n\t\t// position\n\t\tconst FVector MirrorPosition = SplineComponent->GetLocationAtSplinePoint(ToCopy, ESplineCoordinateSpace::Local);\n\t\tFVector NewPosition = Center + (Center - MirrorPosition);\n\t\tNewPosition.Z = MirrorPosition.Z;\n\t\tSplineComponent->SetLocationAtSplinePoint(i, NewPosition, ESplineCoordinateSpace::Local, true);\n\n\t\t// rotation\n\t\tTArray<FInterpCurvePointQuat>& RotationPoints = SplineComponent->GetSplinePointsRotation().Points;\n\t\tif (ToCopy < RotationPoints.Num() && i < RotationPoints.Num())\n\t\t\tRotationPoints[i].OutVal = RotationPoints[ToCopy].OutVal;\n\n\t\t// scale\n\t\tTArray<FInterpCurvePointVector>& ScalePoints = SplineComponent->GetSplinePointsScale().Points;\n\t\tif (ToCopy < ScalePoints.Num() && i < ScalePoints.Num())\n\t\t\tScalePoints[i].OutVal = ScalePoints[ToCopy].OutVal;\n\n\t\t// up vector\n\t\tSplineComponent->SetUpVectorAtSplinePoint(i,\n\t\t\t\t\t\t\t\t\t\t\t\t  SplineComponent->GetUpVectorAtSplinePoint(ToCopy, ESplineCoordinateSpace::Local),\n\t\t\t\t\t\t\t\t\t\t\t\t  ESplineCoordinateSpace::Local);\n\t\t// tangent\n\t\tSplineComponent->SetTangentAtSplinePoint(i,\n\t\t\t\t\t\t\t\t\t\t\t\t SplineComponent->GetTangentAtSplinePoint(ToCopy, ESplineCoordinateSpace::Local) * FVector(1.0f, 1.0f, -1.0f),\n\t\t\t\t\t\t\t\t\t\t\t\t ESplineCoordinateSpace::Local);\n\t}\n}\n"
  },
  {
    "path": "Source/SOrb/SplineLogic/SoSpline.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#pragma once\n\n#include \"GameFramework/Actor.h\"\n#include \"Components/SplineComponent.h\"\n\n#include \"SoSpline.generated.h\"\n\nUCLASS()\nclass SORB_API ASoSpline : public AActor\n{\n\tGENERATED_BODY()\n\npublic:\n\t// Sets default values for this actor's properties\n\tASoSpline(const FObjectInitializer& ObjectInitializer);\n\n#if WITH_EDITOR\n\tvirtual void OnConstruction(const FTransform& Transform) override;\n#endif\n\n\tbool IsInPrevSplines(ASoSpline* SplineToCheck) const;\n\tbool IsInNextSplines(ASoSpline* SplineToCheck) const;\n\n\tASoSpline* GetPrevSpline(const float ZCoordinate) const;\n\tASoSpline* GetNextSpline(const float ZCoordinate) const;\n\n\tconst TArray<ASoSpline*>& GetPrevSplines() const { return PrevSplines; }\n\tconst TArray<ASoSpline*>& GetNextSplines() const { return NextSplines; }\n\n\tFVector GetWorldLocationAtDistance(const float Distance) const;\n\tFRotator GetWorldRotationAtDistance(const float Distance) const;\n\n\tFVector GetStartWorldLocation() const;\n\tFVector GetEndWorldLocation() const;\n\n\tconst USplineComponent* GetSplineComponent() const { return Spline; }\n\tUSplineComponent* GetSplineComponent() { return Spline; }\n\tint32 GetSplineDirection() const { return Direction; }\n\tfloat GetSplineLength() const { return Spline ? Spline->GetSplineLength() : 0.f; }\n\tconst FString& GetSplineName() const { return SplineName; }\n\tconst FName GetSplineFName() const { return FName(*SplineName); }\n\n\tUFUNCTION(BlueprintCallable, Category = Construction)\n\tstatic void MakeCircleSpline(ASoSpline* Spline, float Radius, float TangentModifier, const FVector Scale = FVector(1.0f, 1.0f, 1.0f));\n\n\tUFUNCTION(BlueprintCallable, Category = Construction)\n\tstatic void MakeSymmetry(ASoSpline* Spline);\n\nprotected:\n\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere, Category = SoSpline)\n\tUSplineComponent* Spline;\n\n\t// -1 or 1, defines the camera angle\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = \"LevelDesign|General\")\n\tint32 Direction = 1;\n\n\tUPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = \"LevelDesign|General\")\n\tFString SplineName = \"DefaultSplineName\";\n\n\tUPROPERTY(EditAnywhere, BlueprintReadOnly, Category = \"LevelDesign|General\")\n\tTArray<ASoSpline*> NextSplines;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadOnly, Category = \"LevelDesign|General\")\n\tTArray<ASoSpline*> PrevSplines;\n\n\t// 3d widgets to visualize the borders\n\tUPROPERTY(EditAnywhere, EditFixedSize, BlueprintReadOnly, Category = \"LevelDesign|General\", Meta = (MakeEditWidget = true))\n\tTArray<FVector> PrevZLevels;\n\n\tUPROPERTY(EditAnywhere, EditFixedSize, BlueprintReadOnly, Category = \"LevelDesign|General\", Meta = (MakeEditWidget = true))\n\tTArray<FVector> NextZLevels;\n\n\t// spline distances the AI won't cross (e.g. to stop him from walking off a cliff)\n\tUPROPERTY(VisibleAnywhere, Category = AIData)\n\tTArray<float> AIStopPoints;\n\n\tUPROPERTY(EditAnywhere, Category = AIData)\n\tbool bShowAIStopPoints;\n\n\t// used to visualize and edit the points if bShowAIStopPoints is true\n\tUPROPERTY(EditAnywhere, BlueprintReadOnly, Category = AIData, Meta = (MakeEditWidget = true))\n\tTArray<FVector> AIStopPointsV;\n};\n"
  },
  {
    "path": "Source/SOrb/SplineLogic/SoSplineGraph.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#include \"SoSplineGraph.h\"\n#include \"EngineUtils.h\"\n#include \"DrawDebugHelpers.h\"\n#include \"Components/SplineMeshComponent.h\"\n#include \"Components/ArrowComponent.h\"\n#include \"Components/BillboardComponent.h\"\n#include \"SplineLogic/SoMarker.h\"\n#include \"SplineLogic/SoSplineGraphStructs.h\"\n\nstatic constexpr float MIN_HEIGHT = -1000000.0f;\nstatic constexpr float MAX_HEIGHT = 1000000.0f;\n\nDEFINE_LOG_CATEGORY(LogSoSplineGraph);\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nASoSplineGraph::ASoSplineGraph()\n{\n\tPrimaryActorTick.bCanEverTick = false;\n\tBillboard = CreateDefaultSubobject<UBillboardComponent>(TEXT(\"SoBillboard\"));\n\tRootComponent = Billboard;\n}\n\n\n#if WITH_EDITOR\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoSplineGraph::PostEditChangeProperty(FPropertyChangedEvent& PropertyChangedEvent)\n{\n\tSuper::PostEditChangeProperty(PropertyChangedEvent);\n\tconst FName PropertyName = PropertyChangedEvent.Property != nullptr ? PropertyChangedEvent.Property->GetFName() : NAME_None;\n\tif (PropertyName == GET_MEMBER_NAME_CHECKED(ASoSplineGraph, bVisualize)\n\t\t|| PropertyName == GET_MEMBER_NAME_CHECKED(ASoSplineGraph, NodeMeshScale)\n\t\t|| PropertyName == GET_MEMBER_NAME_CHECKED(ASoSplineGraph, NodeTemplate))\n\t\tUpdateVisualisation();\n\telse if (PropertyName == GET_MEMBER_NAME_CHECKED(ASoSplineGraph, bDebugNoOptimalization))\n\t\tRebuild();\n}\n#endif\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoSplineGraph::Rebuild()\n{\n\t// 0. clear\n\tNodes.Empty();\n\tEdges.Empty();\n\tSplineEdgeList.Empty();\n\n\t// 1. build\n\tfor (TActorIterator<ASoMarker> It(GetWorld(), GeneratorClass); It; ++It)\n\t\tExtendGraph(*It);\n\n\t// 2. post processes\n\n\t// 2.1\tremove node if it is between two other (no other connection with any other node)\n\t//\t\tand it is too close (was created cause of height difference)\n\n\tif (!bDebugNoOptimalization)\n\t\tfor (int32 i = Nodes.Num() - 1; i >= 0; --i)\n\t\t{\n\t\t\t// first checks only the registered nodes\n\t\t\t// second also the directional nodes pointing to this target (node does not have them in its list)\n\t\t\tif (Nodes[i].EdgeIndices.Num() == 2 && CalcEdgeTargetCount(i) == 2)\n\t\t\t{\n\t\t\t\tconst int32 FirstIndex = Nodes[i].EdgeIndices[0];\n\t\t\t\tconst int32 SecondIndex = Nodes[i].EdgeIndices[1];\n\n\t\t\t\tFSoSplineGraphEdge& FirstEdge = Edges[FirstIndex];\n\t\t\t\tFSoSplineGraphEdge& SecondEdge = Edges[SecondIndex];\n\n\t\t\t\tif (FirstEdge.Type == ESoSplineGraphEdge::ESGE_Walk &&\n\t\t\t\t\tSecondEdge.Type == ESoSplineGraphEdge::ESGE_Walk)\n\t\t\t\t{\n\t\t\t\t\tif ((FirstEdge.Length + SecondEdge.Length) < MaxEdgeDistance &&\n\t\t\t\t\t\tFMath::Min(FirstEdge.Length, SecondEdge.Length) < TooCloseEdgeLength)\n\t\t\t\t\t{\n\t\t\t\t\t\t// create a new edge to connect the 2 neighbors\n\t\t\t\t\t\tconst int32 StartIndex = (FirstEdge.StartNodeIndex == i) ? FirstEdge.EndNodeIndex\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t: FirstEdge.StartNodeIndex;\n\t\t\t\t\t\tconst int32 EndIndex = (SecondEdge.StartNodeIndex == i) ? SecondEdge.EndNodeIndex\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t: SecondEdge.StartNodeIndex;\n\t\t\t\t\t\tconst float Length = FirstEdge.Length + SecondEdge.Length;\n\t\t\t\t\t\tconst float MaxHeight = FMath::Min(FirstEdge.MaxHeight, SecondEdge.MaxHeight);\n\n\t\t\t\t\t\tEdges.Add({ StartIndex, EndIndex, Length, MaxHeight, ESoSplineGraphEdge::ESGE_Walk });\n\t\t\t\t\t\tNodes[StartIndex].EdgeIndices.Add(Edges.Num() - 1);\n\t\t\t\t\t\tNodes[EndIndex].EdgeIndices.Add(Edges.Num() - 1);\n\n\t\t\t\t\t\tRemoveNode(i);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t// TODO: find portals, add graph nodes and edges so the AI can use them too ???\n\n\n\t// 3. rebuild spline edge list:\n\tfor (int32 i = 0; i < Edges.Num(); ++i)\n\t{\n\t\t// check one end of the edge, assign edge to associated spline\n\t\tASoSpline* FirstSpline = Nodes[Edges[i].StartNodeIndex].SplinePoint.GetSpline();\n\t\tFSoIntArray* ArrayPtr = SplineEdgeList.Find(FirstSpline);\n\t\tif (ArrayPtr == nullptr)\n\t\t\tArrayPtr = &SplineEdgeList.Add(FirstSpline, {});\n\t\tArrayPtr->Elements.Add(i);\n\n\t\t// check other end, add if it is not the same\n\t\tASoSpline* SecondSpline = Nodes[Edges[i].EndNodeIndex].SplinePoint.GetSpline();\n\t\tif (FirstSpline != SecondSpline)\n\t\t{\n\t\t\tArrayPtr = SplineEdgeList.Find(SecondSpline);\n\t\t\tif (ArrayPtr == nullptr)\n\t\t\t\tArrayPtr = &SplineEdgeList.Add(SecondSpline, {});\n\t\t\tArrayPtr->Elements.Add(i);\n\t\t}\n\t}\n\n\t// 4. refresh visualization\n\tUpdateVisualisation();\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoSplineGraph::ExtendGraph(ASoMarker* Generator)\n{\n\tconst FSoSplinePoint& MarkerSplineLocation = Generator->GetSplineLocation();\n\tif (Generator == nullptr || !MarkerSplineLocation.IsValid())\n\t\treturn;\n\n\tconst float MarkerZ = Generator->GetActorLocation().Z;\n\n\tFSoSplineGraphPoint ActualPoint = ConstructPoint(MarkerSplineLocation, MarkerZ);\n\n\tif (!IsValid(ActualPoint) || IsPointInGraph(MarkerSplineLocation, ActualPoint.FloorZ))\n\t{\n\t\tUE_LOG(LogSoSplineGraph, Warning, TEXT(\"Marker %s did not add anything to the graph!\"), *Generator->GetName())\n\t\treturn;\n\t}\n\n\tFSoSplineGraphPoint NextPoint;\n\n\t// find first point in negative direction\n\twhile (Step(ActualPoint, -1, NextPoint))\n\t\tActualPoint = NextPoint;\n\n\t// add first point\n\tNodes.Add({ ActualPoint.SplineLoc, ActualPoint.FloorZ });\n\n\tconst int32 NodeIndex = Nodes.Num() - 1;\n\t// explore to both directions\n\tExtendGraph(NodeIndex, 1);\n\tExtendGraph(NodeIndex, -1);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoSplineGraph::ExtendGraph(int32 NodeIndex, int32 Direction)\n{\n\tcheck(NodeIndex >= 0 && NodeIndex < Nodes.Num());\n\n\tFSoSplineGraphPoint ActualPoint = ConstructPoint(Nodes[NodeIndex]);\n\tFSoSplineGraphPoint NextPoint;\n\n\tint32 StepCounter = 0;\n\tbool bAtLeastOneNotInGraph = false;\n\n\tfloat MinHeight = MAX_HEIGHT;\n\tfloat MaxHeight = MinEdgeHeight;\n\t// loop with small steps until each step is valid and each step could be on the same edge\n\twhile (Step(ActualPoint, Direction, NextPoint) && StepCounter * StepSize < MaxEdgeDistance)\n\t{\n\t\tMaxHeight = FMath::Max(NextPoint.Height, MaxHeight);\n\t\tconst float NewMinHeight = FMath::Min(NextPoint.Height, MinHeight);\n\n\t\t// too much height dif -> new step can't be in the same edge with the previous ones\n\t\tif (fabs(NewMinHeight - MaxHeight) > MaxHeightDifference && NewMinHeight < MaxHeightToCheck)\n\t\t\tbreak;\n\n\t\tActualPoint = NextPoint;\n\t\tMinHeight = NewMinHeight;\n\n\t\tStepCounter++;\n\n\t\t// if we end up in a visited place, we would like to know if there was any unexplored involved or not\n\t\tif (!bAtLeastOneNotInGraph)\n\t\t\tbAtLeastOneNotInGraph = !IsPointInGraph(ActualPoint.SplineLoc, ActualPoint.FloorZ + MinEdgeHeight / 2);\n\t}\n\n\t// check, maybe handle CASE 1:\n\t// some kind of edge, maybe special action can lead to other nodes\n\tif (StepCounter == 0)\n\t{\n\t\t// special action number 1: walk off a cliff\n\t\tTryToAddJumpDownEdge(ActualPoint, NodeIndex, Direction, MinHeight);\n\t\treturn;\n\t}\n\n\t// check, maybe handle CASE 2:\n\tint32 ClosestNodeIndex;\n\tif (IsPointInGraph(ActualPoint.SplineLoc, ActualPoint.FloorZ + MinEdgeHeight / 2.0f, &ClosestNodeIndex))\n\t{\n\t\t// even if it leads back to the original graph, chances are that we have to add an edge here\n\t\tif (bAtLeastOneNotInGraph)\n\t\t{\n\t\t\tconst float EdgeLength = fabs(Nodes[ClosestNodeIndex].SplinePoint - Nodes[NodeIndex].SplinePoint);\n\t\t\tEdges.Add({ NodeIndex, ClosestNodeIndex, EdgeLength, MinHeight, ESoSplineGraphEdge::ESGE_Walk });\n\n\t\t\tNodes[NodeIndex].EdgeIndices.Push(Edges.Num() - 1);\n\t\t\tNodes[ClosestNodeIndex].EdgeIndices.Push(Edges.Num() - 1);\n\t\t}\n\n\t\treturn;\n\t}\n\n\t// handle CASE 3:\n\t// nothing special: add another node along direction\n\tNodes.Add({ ActualPoint.SplineLoc, ActualPoint.FloorZ });\n\n\tconst float Length = fabs(ActualPoint.SplineLoc - Nodes[NodeIndex].SplinePoint);\n\tEdges.Add({ NodeIndex, Nodes.Num() - 1, Length, MinHeight, ESoSplineGraphEdge::ESGE_Walk });\n\n\tNodes[NodeIndex].EdgeIndices.Push(Edges.Num() - 1);\n\tNodes[Nodes.Num() - 1].EdgeIndices.Push(Edges.Num() - 1);\n\n\tExtendGraph(Nodes.Num() - 1, Direction);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoSplineGraph::TryToAddJumpDownEdge(const FSoSplineGraphPoint& ActualPoint, int32 NodeIndex, int32 Direction, float MinHeight)\n{\n\t// check walk down\n\tFSoSplinePoint WDSPoint = ActualPoint.SplineLoc;\n\tbool bSplineOver = false;\n\tfloat Rest;\n\tWDSPoint.AddToDistance(WalkDownDistance * Direction, bSplineOver, Rest);\n\tif (!bSplineOver && IsVisible(ActualPoint.ToVector(MinEdgeHeight / 2.0f),\n\t\t\t\t\t\t\t\t\tWDSPoint.ToVector(ActualPoint.FloorZ + MinEdgeHeight / 2.0f)))\n\t{\n\t\tconst FSoSplineGraphPoint Point = ConstructPoint(WDSPoint, ActualPoint.FloorZ);\n\t\tif (IsValid(Point))\n\t\t{\n\t\t\tint32 EdgeIndex = -1;\n\t\t\tif (IsPointInGraph(WDSPoint, Point.FloorZ + MinEdgeHeight / 2.0f, nullptr, &EdgeIndex))\n\t\t\t{\n\t\t\t\t// sigh, already explored place\n\t\t\t\t// if a node is like really really close it can be bound with the upper one\n\t\t\t\t// if that's not the case the edge has to be split\n\t\t\t\tcheck(EdgeIndex >= 0 && EdgeIndex < Edges.Num());\n\t\t\t\tconst FVector PointLocation = Point.ToVector();\n\t\t\t\tconst FSoSplineGraphNode& FirstNode = Nodes[Edges[EdgeIndex].StartNodeIndex];\n\t\t\t\tconst FSoSplineGraphNode& SecondNode = Nodes[Edges[EdgeIndex].EndNodeIndex];\n\n\t\t\t\tif ((FirstNode.ToVector() - PointLocation).SizeSquared() < 20)\n\t\t\t\t{\n\t\t\t\t\tEdges.Add({ NodeIndex,\n\t\t\t\t\t\t\t\tEdges[EdgeIndex].StartNodeIndex,\n\t\t\t\t\t\t\t\tFMath::Abs(ActualPoint.SplineLoc - FirstNode.SplinePoint),\n\t\t\t\t\t\t\t\tMinHeight,\n\t\t\t\t\t\t\t\tESoSplineGraphEdge::ESGE_Fall });\n\n\t\t\t\t\tNodes[NodeIndex].EdgeIndices.Add(Edges.Num() - 1);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif ((SecondNode.ToVector() - PointLocation).SizeSquared() < 20)\n\t\t\t\t{\n\t\t\t\t\tEdges.Add({ NodeIndex,\n\t\t\t\t\t\t\t\tEdges[EdgeIndex].EndNodeIndex,\n\t\t\t\t\t\t\t\tFMath::Abs(ActualPoint.SplineLoc - SecondNode.SplinePoint),\n\t\t\t\t\t\t\t\tMinHeight,\n\t\t\t\t\t\t\t\tESoSplineGraphEdge::ESGE_Fall });\n\n\t\t\t\t\tNodes[NodeIndex].EdgeIndices.Add(Edges.Num() - 1);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// edge has to be split :/\n\t\t\t\t// step 1: add node\n\t\t\t\tNodes.Add({ WDSPoint, Point.FloorZ });\n\t\t\t\t// step 2: add the fall edge to the new node\n\t\t\t\tEdges.Add({ NodeIndex,\n\t\t\t\t\t\t\tNodes.Num() - 1,\n\t\t\t\t\t\t\tFMath::Abs(ActualPoint.SplineLoc - Nodes[NodeIndex].SplinePoint),\n\t\t\t\t\t\t\tMinHeight,\n\t\t\t\t\t\t\tESoSplineGraphEdge::ESGE_Fall });\n\t\t\t\tNodes[NodeIndex].EdgeIndices.Push(Edges.Num() - 1);\n\t\t\t\t// step 3: add a new edge between the new node and the EndNode of the edge is about to be split\n\t\t\t\tEdges.Add({ Nodes.Num() - 1,\n\t\t\t\t\t\t\tEdges[EdgeIndex].EndNodeIndex,\n\t\t\t\t\t\t\tFMath::Abs(ActualPoint.SplineLoc - SecondNode.SplinePoint),\n\t\t\t\t\t\t\tEdges[EdgeIndex].MaxHeight,\n\t\t\t\t\t\t\tESoSplineGraphEdge::ESGE_Walk });\n\t\t\t\tNodes[Nodes.Num() - 1].EdgeIndices.Push(Edges.Num() - 1);\n\t\t\t\tNodes[Edges[EdgeIndex].EndNodeIndex].EdgeIndices.Push(Edges.Num() - 1);\n\t\t\t\t// step 4: add a new edge between the StartNode of the old edge and the new node\n\t\t\t\tEdges.Add({ Edges[EdgeIndex].StartNodeIndex,\n\t\t\t\t\t\t\tNodes.Num() - 1,\n\t\t\t\t\t\t\tFMath::Abs(FirstNode.SplinePoint - ActualPoint.SplineLoc),\n\t\t\t\t\t\t\tEdges[EdgeIndex].MaxHeight,\n\t\t\t\t\t\t\tESoSplineGraphEdge::ESGE_Walk });\n\t\t\t\tNodes[Nodes.Num() - 1].EdgeIndices.Push(Edges.Num() - 1);\n\t\t\t\tNodes[Edges[EdgeIndex].StartNodeIndex].EdgeIndices.Push(Edges.Num() - 1);\n\t\t\t\t// step 4: remove old edge\n\t\t\t\tRemoveEdge(EdgeIndex);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t// new, not yet explored land! let's put a node here and check what's up in both directions\n\t\t\t\tNodes.Add({ WDSPoint, Point.FloorZ });\n\n\t\t\t\tEdges.Add({ NodeIndex,\n\t\t\t\t\t\t\tNodes.Num() - 1,\n\t\t\t\t\t\t\tFMath::Abs(ActualPoint.SplineLoc - Nodes[NodeIndex].SplinePoint),\n\t\t\t\t\t\t\tMinHeight,\n\t\t\t\t\t\t\tESoSplineGraphEdge::ESGE_Fall });\n\t\t\t\tNodes[NodeIndex].EdgeIndices.Push(Edges.Num() - 1);\n\n\t\t\t\tconst int32 NewNodeIndex = Nodes.Num() - 1;\n\t\t\t\tExtendGraph(NewNodeIndex, 1);\n\t\t\t\tExtendGraph(NewNodeIndex, -1);\n\t\t\t}\n\t\t}\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoSplineGraph::RemoveNode(int32 NodeIndex)\n{\n\t// 1. remove all edges connecting with this node\n\tfor (int32 i = Edges.Num() - 1; i >= 0; --i)\n\t\tif (Edges[i].StartNodeIndex == NodeIndex || Edges[i].EndNodeIndex == NodeIndex)\n\t\t\tRemoveEdge(i);\n\n\n\t// update node indices\n\tfor (FSoSplineGraphEdge& Edge : Edges)\n\t{\n\t\tif (Edge.StartNodeIndex > NodeIndex)\n\t\t\tEdge.StartNodeIndex -= 1;\n\n\t\tif (Edge.EndNodeIndex > NodeIndex)\n\t\t\tEdge.EndNodeIndex -= 1;\n\t}\n\n\tNodes.RemoveAt(NodeIndex);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoSplineGraph::RemoveEdge(int32 EdgeIndex)\n{\n\tfor (FSoSplineGraphNode& Node : Nodes)\n\t{\n\t\tNode.EdgeIndices.Remove(EdgeIndex);\n\n\t\t// update edge indices\n\t\tfor (int32 i = 0; i < Node.EdgeIndices.Num(); ++i)\n\t\t\tif (Node.EdgeIndices[i] > EdgeIndex)\n\t\t\t\tNode.EdgeIndices[i] -= 1;\n\t}\n\n\tEdges.RemoveAt(EdgeIndex);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool ASoSplineGraph::IsPointInGraph(const FSoSplinePoint& Point, float ZValue, int32* ClosestNodeIndex, int32* EdgeIndexPtr)\n{\n\tfor (int32 NodeIndex = 0; NodeIndex < Nodes.Num(); ++NodeIndex)\n\t{\n\t\tconst FSoSplineGraphNode& Node = Nodes[NodeIndex];\n\t\tconst ASoSpline* NodeSpline = Node.SplinePoint.GetSpline();\n\n\t\tif (NodeSpline == Point.GetSpline())\n\t\t{\n\t\t\tfor (const int32& EdgeIndex : Node.EdgeIndices)\n\t\t\t\tif (IsValid(EdgeIndex))\n\t\t\t\t{\n\t\t\t\t\tconst FSoSplineGraphEdge& Edge = Edges[EdgeIndex];\n\n\t\t\t\t\tif (Edge.Type != ESoSplineGraphEdge::ESGE_Walk)\n\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\tconst FSoSplineGraphNode& StartNode = Nodes[Edge.StartNodeIndex];\n\t\t\t\t\tconst FSoSplineGraphNode& EndNode = Nodes[Edge.EndNodeIndex];\n\t\t\t\t\tconst FSoSplinePoint& StartNodeSplineLoc = StartNode.SplinePoint;\n\t\t\t\t\tconst FSoSplinePoint& EndNodeSplineLoc = EndNode.SplinePoint;\n\n\t\t\t\t\t// check along spline\n\t\t\t\t\tconst float StartToEnd = fabs(EndNodeSplineLoc - StartNodeSplineLoc);\n\t\t\t\t\tconst float StartToPoint = fabs(Point - StartNodeSplineLoc);\n\t\t\t\t\tconst float EndToPoint = fabs(Point - EndNodeSplineLoc);\n\n\t\t\t\t\tif (StartToEnd >= StartToPoint && StartToEnd >= EndToPoint)\n\t\t\t\t\t{\n\t\t\t\t\t\t// check z\n\t\t\t\t\t\tconst float ZOffset = MinEdgeHeight / 2.0f;\n\t\t\t\t\t\tconst FVector StartPos = StartNodeSplineLoc.GetWorldLocation(StartNode.ZValue + ZOffset);\n\t\t\t\t\t\tconst FVector EndPos = EndNodeSplineLoc.GetWorldLocation(EndNode.ZValue + ZOffset);\n\t\t\t\t\t\tconst FVector PointPos = Point.GetWorldLocation(ZValue + ZOffset);\n\n\t\t\t\t\t\tif (IsVisible(StartPos, PointPos) && IsVisible(PointPos, EndPos))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif (ClosestNodeIndex != nullptr)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tconst float StartDist2 = (PointPos - StartPos).SizeSquared();\n\t\t\t\t\t\t\t\tconst float EndDist2 = (PointPos - EndPos).SizeSquared();\n\t\t\t\t\t\t\t\t*ClosestNodeIndex = StartDist2 < EndDist2 ? Edge.StartNodeIndex : Edge.EndNodeIndex;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (EdgeIndexPtr != nullptr)\n\t\t\t\t\t\t\t\t*EdgeIndexPtr = EdgeIndex;\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t}\n\t}\n\n\treturn false;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool ASoSplineGraph::IsVisible(const FVector A, const FVector B) const\n{\n\tFCollisionObjectQueryParams ObjectQueryParams;\n\tObjectQueryParams.AddObjectTypesToQuery(ECC_WorldStatic);\n\tconst FCollisionQueryParams QueryParams;\n\treturn (!GetWorld()->LineTraceTestByObjectType(A, B, ObjectQueryParams, QueryParams));\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nfloat ASoSplineGraph::GetFloorZUnderPoint(const FSoSplinePoint& Point, float ZValue)\n{\n\tconst FVector SplineLocation = Point;\n\n\tconst FVector Start = FVector(SplineLocation.X, SplineLocation.Y, ZValue);\n\tconst FVector End = FVector(Start.X, Start.Y, MIN_HEIGHT);\n\n\tFCollisionObjectQueryParams ObjectQueryParams;\n\tObjectQueryParams.AddObjectTypesToQuery(ECC_WorldStatic);\n\tFCollisionQueryParams QuaryParams;\n\tFHitResult Hit;\n\tconst bool bHit = GetWorld()->LineTraceSingleByObjectType(Hit, Start, End, ObjectQueryParams, QuaryParams);\n\n\tif (bVisualizeBuild)\n\t\tDrawDebugLine(GetWorld(),\n\t\t\t\t\t  Start,\n\t\t\t\t\t  FVector(End.X, End.Y, bHit ? Hit.ImpactPoint.Z : End.Z),\n\t\t\t\t\t  bHit ? FColor(0, 255, 0) : FColor(255, 0, 0),\n\t\t\t\t\t  false,\n\t\t\t\t\t  VisualizeBuildDuration,\n\t\t\t\t\t  0,\n\t\t\t\t\t  VisualizeLineTickness);\n\n\n\treturn bHit ? Hit.ImpactPoint.Z : MIN_HEIGHT;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nfloat ASoSplineGraph::GetCeilingZAbovePoint(const FSoSplinePoint& Point, float ZValue)\n{\n\tconst FVector Start = Point.GetWorldLocation(ZValue);\n\tconst FVector End = FVector(Start.X, Start.Y, MAX_HEIGHT);\n\n\tFCollisionObjectQueryParams ObjectQueryParams;\n\tObjectQueryParams.AddObjectTypesToQuery(ECC_WorldStatic);\n\tFCollisionQueryParams QuaryParams;\n\tFHitResult Hit;\n\tconst bool bHit = GetWorld()->LineTraceSingleByObjectType(Hit, Start, End, ObjectQueryParams, QuaryParams);\n\n\tif (bVisualizeBuild)\n\t\tDrawDebugLine(GetWorld(),\n\t\t\t\t\t  Start,\n\t\t\t\t\t  FVector(End.X, End.Y, bHit ? Hit.ImpactPoint.Z : End.Z),\n\t\t\t\t\t  bHit ? FColor(0, 0, 255) : FColor(255, 0, 0),\n\t\t\t\t\t  false,\n\t\t\t\t\t  VisualizeBuildDuration,\n\t\t\t\t\t  0,\n\t\t\t\t\t  VisualizeLineTickness);\n\n\treturn bHit ? Hit.ImpactPoint.Z : MAX_HEIGHT;\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool ASoSplineGraph::IsValid(FSoSplineGraphEdge Edge)\n{\n\treturn (Edge.StartNodeIndex >= 0 && Edge.StartNodeIndex < Nodes.Num() &&\n\t\t\tEdge.EndNodeIndex >= 0 && Edge.EndNodeIndex < Nodes.Num());\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool ASoSplineGraph::IsValid(int32 Edge)\n{\n\tif (Edge < 0 || Edge >= Edges.Num())\n\t\treturn false;\n\n\treturn IsValid(Edges[Edge]);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nint32 ASoSplineGraph::CalcEdgeTargetCount(int32 NodeIndex)\n{\n\tint32 Count = 0;\n\tfor (const FSoSplineGraphEdge& Edge : Edges)\n\t\tif (Edge.EndNodeIndex == NodeIndex || (Edge.IsUndirected() && Edge.StartNodeIndex ==  NodeIndex))\n\t\t\tCount += 1;\n\n\treturn Count;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFSoSplineGraphPoint ASoSplineGraph::ConstructPoint(const FSoSplinePoint& SplineLoc, float ZValue)\n{\n\tFSoSplineGraphPoint Point;\n\tPoint.FloorZ = GetFloorZUnderPoint(SplineLoc, ZValue);\n\tPoint.Height = GetCeilingZAbovePoint(SplineLoc, ZValue) - Point.FloorZ;\n\tPoint.SplineLoc = SplineLoc;\n\treturn Point;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFSoSplineGraphPoint ASoSplineGraph::ConstructPoint(const FSoSplineGraphNode& Node)\n{\n\treturn ConstructPoint(Node.SplinePoint, Node.ZValue);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool ASoSplineGraph::Step(const FSoSplineGraphPoint& StartPoint, int32 StepMultiplier, FSoSplineGraphPoint& EndPoint)\n{\n\tEndPoint.SplineLoc = StartPoint.SplineLoc;\n\n\tFSoSplinePoint NewSL = StartPoint.SplineLoc;\n\tNewSL.SetReferenceZ(StartPoint.FloorZ);\n\tbool bOutSplineEnd = false;\n\tfloat Rest = 0.0f;\n\tNewSL.AddToDistance(StepSize * StepMultiplier, bOutSplineEnd, Rest);\n\n\tconst float RefZ = StartPoint.FloorZ + MinEdgeHeight - KINDA_SMALL_NUMBER;\n\tEndPoint = ConstructPoint(NewSL, RefZ);\n\n\tif (!IsValid(EndPoint))\n\t\treturn false;\n\n\tif (bOutSplineEnd && fabs(Rest) > fabs(StepSize * StepMultiplier) - KINDA_SMALL_NUMBER)\n\t\treturn false;\n\n\t// check angle\n\tconst float Angle = FMath::RadiansToDegrees(FMath::Atan(fabs(StartPoint.FloorZ - EndPoint.FloorZ) / StepSize));\n\tif (fabs(Angle) > MaxStepAngle)\n\t\treturn false;\n\n\treturn true;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool ASoSplineGraph::IsValid(const FSoSplineGraphPoint& Point)\n{\n\tif (Point.FloorZ < MIN_HEIGHT + KINDA_SMALL_NUMBER)\n\t\treturn false;\n\n\tif (Point.Height < MinEdgeHeight)\n\t\treturn false;\n\n\treturn Point.SplineLoc.IsValid(false);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoSplineGraph::UpdateVisualisation()\n{\n\t// 0: clean up\n\tfor (UStaticMeshComponent* MeshComp : Meshes)\n\t\tif (MeshComp)\n\t\t\tMeshComp->DestroyComponent();\n\tMeshes.Empty();\n\tfor (UArrowComponent* Arrow : ArrowComponents)\n\t\tif (Arrow)\n\t\t\tArrow->DestroyComponent();\n\tArrowComponents.Empty();\n\n\t// 1: check if enabled\n\tif (!bVisualize)\n\t\treturn;\n\n\t// 2: add node meshes:\n\tfor (const FSoSplineGraphNode& Node : Nodes)\n\t{\n\t\tconst FVector Location = Node.SplinePoint.ToVector(Node.ZValue);\n\n\t\tUStaticMeshComponent* MeshComp = NewObject<UStaticMeshComponent>(this, UStaticMeshComponent::StaticClass());\n\t\tMeshComp->RegisterComponent();\n\t\tMeshComp->SetStaticMesh(NodeTemplate);\n\t\tMeshComp->SetWorldLocation(Location);\n\t\tMeshComp->SetWorldScale3D(NodeMeshScale);\n\t\tMeshComp->SetWorldRotation(Node.SplinePoint.GetDirection().Rotation());\n\n\t\tMeshes.Add(MeshComp);\n\t}\n\n\t// 3: add edge meshes:\n\tfor (const FSoSplineGraphEdge& Edge : Edges)\n\t{\n\t\tconst FVector StartPoint = Nodes[Edge.StartNodeIndex].SplinePoint.ToVector(Nodes[Edge.StartNodeIndex].ZValue);\n\t\tconst FVector EndPoint = Nodes[Edge.EndNodeIndex].SplinePoint.ToVector(Nodes[Edge.EndNodeIndex].ZValue);\n\t\t// side offset based on direction\n\t\tconst float Length = FMath::Min((EndPoint - StartPoint).Size(), 160.0f);\n\n\t\tswitch (Edge.Type)\n\t\t{\n\t\t\tcase ESoSplineGraphEdge::ESGE_Walk:\n\t\t\t{\n\t\t\t\tconst FVector UpOffset = FVector(0.0f, 0.0f, 15.0f);\n\n\t\t\t\tUArrowComponent* Arrow = NewObject<UArrowComponent>(this, UArrowComponent::StaticClass());\n\t\t\t\tArrow->RegisterComponent();\n\t\t\t\tArrowComponents.Add(Arrow);\n\t\t\t\tArrow->SetWorldScale3D(FVector(Length / 80.0f, 1.0f, 1.0f));\n\t\t\t\tArrow->SetWorldLocation((StartPoint + EndPoint) / 2.0f + UpOffset);\n\t\t\t\tArrow->SetWorldRotation((EndPoint - StartPoint).Rotation());\n\t\t\t\tArrow->SetArrowColor(Edge.GetEdgeColor());\n\n\t\t\t\tArrow = NewObject<UArrowComponent>(this, UArrowComponent::StaticClass());\n\t\t\t\tArrow->RegisterComponent();\n\t\t\t\tArrowComponents.Add(Arrow);\n\t\t\t\tArrow->SetWorldScale3D(FVector(Length / 80.0f, 1.0f, 1.0f));\n\t\t\t\tArrow->SetWorldLocation((StartPoint + EndPoint) / 2.0f + UpOffset);\n\t\t\t\tArrow->SetWorldRotation((StartPoint - EndPoint).Rotation());\n\t\t\t\tArrow->SetArrowColor(Edge.GetEdgeColor());\n\t\t\t}\n\t\t\tbreak;\n\n\t\t\tcase ESoSplineGraphEdge::ESGE_Fall:\n\t\t\t{\n\t\t\t\tUArrowComponent* Arrow = NewObject<UArrowComponent>(this, UArrowComponent::StaticClass());\n\t\t\t\tArrow->RegisterComponent();\n\t\t\t\tArrowComponents.Add(Arrow);\n\t\t\t\tArrow->SetWorldScale3D(FVector(Length / 80.0f, 1.0f, 1.0f));\n\t\t\t\tArrow->SetWorldLocation(StartPoint);\n\t\t\t\tArrow->SetWorldRotation((EndPoint - StartPoint).Rotation());\n\t\t\t\tArrow->SetArrowColor(Edge.GetEdgeColor());\n\n\t\t\t\tArrow = NewObject<UArrowComponent>(this, UArrowComponent::StaticClass());\n\t\t\t\tArrow->RegisterComponent();\n\t\t\t\tArrowComponents.Add(Arrow);\n\t\t\t\tArrow->SetWorldScale3D(FVector(Length / 80.0f, 1.0f, 1.0f));\n\t\t\t\tArrow->SetWorldLocation(EndPoint - (EndPoint - StartPoint).GetSafeNormal() * (Length + 60));\n\t\t\t\tArrow->SetWorldRotation((EndPoint - StartPoint).Rotation());\n\t\t\t\tArrow->SetArrowColor(Edge.GetEdgeColor());\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "Source/SOrb/SplineLogic/SoSplineGraph.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#pragma once\n#include \"Components/BillboardComponent.h\"\n#include \"Logging/LogMacros.h\"\n#include \"SoSplineGraphStructs.h\"\n#include \"GameFramework/Actor.h\"\n#include \"SoSpline.h\"\n#include \"SoSplineGraph.generated.h\"\n\nstruct FSoSplinePoint;\nclass ASoMarker;\nclass UArrowComponent;\n\nDECLARE_LOG_CATEGORY_EXTERN(LogSoSplineGraph, Log, All);\n\n\nUCLASS()\nclass SORB_API ASoSplineGraph : public AActor\n{\n\tGENERATED_BODY()\n\npublic:\n\n\t/** please tell me that I don't have to write here what a constructor is */\n\tASoSplineGraph();\n\n#if WITH_EDITOR\n\t/** used to rebuild visuals if any associated variable changes */\n\tvirtual void PostEditChangeProperty(FPropertyChangedEvent& PropertyChangedEvent) override;\n#endif\n\n\t/** clears the graph, gets all generator markers and rebuilds it starting from those */\n\tvoid Rebuild();\n\nprotected:\n\t// Runtime functionality:\n\n\n\n\n\n\t// Graph construction functionality:\n\n\t/* Explores all not yet explored reachable area starting from the input marker, and adds it to the graph*/\n\tvoid ExtendGraph(ASoMarker* Generator);\n\n\t/* Extends the graph if any not yet visited reachable area found from Nodes[NodeIndex] based on input direction */\n\tvoid ExtendGraph(int32 NodeIndex, int32 Direction);\n\n\t/* If the node is at an edge (edge like the edge of a table) maybe a JumpDown edge can be added here */\n\tvoid TryToAddJumpDownEdge(const FSoSplineGraphPoint& ActualPoint, int32 NodeIndex, int32 Direction, float MinHeight);\n\n\t/** removes node and all associated edges, fixes both node and end indices accordingly */\n\tvoid RemoveNode(int32 NodeIndex);\n\n\t/** removes edge, updates each edge index accordingly */\n\tvoid RemoveEdge(int32 EdgeIndex);\n\n\t/** performs a line check against static objects between A and B, returns true if no hit occurred */\n\tbool IsVisible(const FVector A, const FVector B) const;\n\n\t/** first hit impact point downwards from world location defined via {Point, ZValue} */\n\tfloat GetFloorZUnderPoint(const FSoSplinePoint& Point, float ZValue);\n\t/** first hit impact point upwards from world location defined via {Point, ZValue} */\n\tfloat GetCeilingZAbovePoint(const FSoSplinePoint& Point, float ZValue);\n\n\t/**\n\t *  Checks if given input location is on the graph, optionally gives back the closest edge/node\n\t *  IMPORTANT: construct functionality, should not be used runtime\n\t *  For runtime use: <TODO: function name>\n\t *\n\t * @PARAM  Point: spline point of the location to check\n\t * @PARAM  ZValue: z coordinate of the location to check\n\t * @PARAM  ClosestNodeIndex: optional, calculated if it is on spline\n\t * @PARAM  EdgeIndexPtr: optional, filled if it is on spline\n\t * @RETURN weather the point was in the graph or not\n\t */\n\tbool IsPointInGraph(const FSoSplinePoint& Point, float ZValue, int32* ClosestNodeIndex = nullptr, int32* EdgeIndexPtr = nullptr);\n\n\t/** checks if the edge has 2 valid node index */\n\tbool IsValid(FSoSplineGraphEdge Edge);\n\n\t/** checks if the edge index is a valid edge index pointing to an edge with 2 valid node index */\n\tbool IsValid(int32 Edge);\n\n\t/** calculates the amount of edges having the node as targets */\n\tint32 CalcEdgeTargetCount(int32 NodeIndex);\n\n\n\tFSoSplineGraphPoint ConstructPoint(const FSoSplinePoint& SplineLoc, float ZValue);\n\tFSoSplineGraphPoint ConstructPoint(const FSoSplineGraphNode& Node);\n\n\t/* one step from StartPoint in the direction defined by StepMultiplier, if successful EndPoint is filled */\n\n\t/**\n\t *  Makes one step along the spline, step size is based on StepSize\n\t *  A successful step has to meet these requirements:\n\t *\t\t- EndPoint is a valid point (has floor, height is large enough)\n\t *\t\t- it actually has at least some horizontal movement (not sucked at the dead-end of a spline)\n\t *\t\t- Height offset between StartPoint and EndPoint is smaller as a threshold (defined via MaxStepAngle)\n\t *\n\t * @PARAM  StartPoint: source location of the step\n\t * @PARAM  StepMultiplier: should be 1 or -1, defines the direction the step is heading\n\t * @PARAM  EndPoint: Output, filled if the step is successful\n\t * @RETURN weather the step was a success or not\n\t */\n\tbool Step(const FSoSplineGraphPoint& StartPoint, int32 StepMultiplier, FSoSplineGraphPoint& EndPoint);\n\n\t/* a valid point has floor under it, and the distance between floor and ceiling is greater than MinEdgeHeight */\n\tbool IsValid(const FSoSplineGraphPoint& Point);\n\n\t/* rebuilds the visual meshes and stuffs based on the setup defined by the member variabled in the Visualization category */\n\tvoid UpdateVisualisation();\n\nprotected:\n\n\tUPROPERTY(EditAnywhere)\n\tbool bDebugNoOptimalization;\n\n\t/** Horizontal step size along spline for the ray-casts */\n\tUPROPERTY(EditAnywhere, Category = GraphConstants)\n\tfloat StepSize = 5;\n\n\t/** Max angle in degrees an edge can contain at any given point */\n\tUPROPERTY(EditAnywhere, Category = GraphConstants)\n\tfloat MaxStepAngle = 45;\n\n\t/** Max height difference inside an edge */\n\tUPROPERTY(EditAnywhere, Category = GraphConstants)\n\tfloat MaxHeightDifference = 30;\n\n\t/** spline location with height under MidEdgeHeight is not considered as walkable surface */\n\tUPROPERTY(EditAnywhere, Category = GraphConstants)\n\tfloat MinEdgeHeight = 30;\n\n\t/** height change above MaxHeightToCheck will not lead to new edges */\n\tUPROPERTY(EditAnywhere, Category = GraphConstants)\n\tfloat MaxHeightToCheck = 500;\n\n\t/** horizontal length of a walk down edge */\n\tUPROPERTY(EditAnywhere, Category = GraphConstants)\n\tfloat WalkDownDistance = 60;\n\n\tUPROPERTY(EditAnywhere, Category = GraphConstants)\n\tfloat MaxEdgeDistance = 1000.0f;\n\n\n\t/** edges too close to each other will be cleaned unless they are there for a good reason (e.g. jump/fall edge), branch */\n\tUPROPERTY(EditAnywhere, Category = GraphConstants)\n\tfloat TooCloseEdgeLength = 300.0f;\n\n\n\tUPROPERTY(VisibleAnywhere, Category = GraphData)\n\tTArray<FSoSplineGraphNode> Nodes;\n\n\tUPROPERTY(VisibleAnywhere, Category = GraphData)\n\tTArray<FSoSplineGraphEdge> Edges;\n\n\t/*\n\t *  list of the index of each connected edge for each spline, RemoveEdge() and RemoveNode() does not update this\n\t *  it is generated as the last step of the constuct process, should only be used runtime\n\t */\n\tUPROPERTY(VisibleAnywhere, Category = GraphData)\n\tTMap<ASoSpline*, FSoIntArray> SplineEdgeList;\n\n\t/** the child class of markers used as start locations */\n\tUPROPERTY(EditAnywhere)\n\tTSubclassOf<ASoMarker> GeneratorClass;\n\n\n\t/* It makes the actor clickable, and also serves as a rootcomponent (without it one generated node visualizer mesh would become root) */\n\tUPROPERTY(EditAnywhere, Category = Visualization)\n\tUBillboardComponent* Billboard;\n\n\tUPROPERTY(EditAnywhere, Category = Visualization)\n\tbool bVisualize;\n\n\t/* each raycast is displayed as a debug line with different colors, disabled by default for good reason */\n\tUPROPERTY(EditAnywhere, Category = Visualization)\n\tbool bVisualizeBuild;\n\n\tUPROPERTY(EditAnywhere, Category = Visualization)\n\tfloat VisualizeBuildDuration;\n\n\tUPROPERTY(EditAnywhere, Category = Visualization)\n\tfloat VisualizeLineTickness = 3.0f;\n\n\t/* mesh used to visualize nodes */\n\tUPROPERTY(EditAnywhere, Category = Visualization)\n\tUStaticMesh* NodeTemplate;\n\n\tUPROPERTY(EditAnywhere, Category = Visualization)\n\tFVector NodeMeshScale = FVector(1.0f, 1.0f, 1.0f);\n\n\t/* the mesh components used to visualize nodes */\n\tUPROPERTY(VisibleAnywhere, Category = Visualization)\n\tTArray<UStaticMeshComponent*> Meshes;\n\n\t/* the array components used to visualize edges */\n\tUPROPERTY(VisibleAnywhere, Category = Visualization)\n\tTArray<UArrowComponent*> ArrowComponents;\n};\n\n\n\n// TODO: runtime function to get graph location\n// TODO: AI should use the graph\n// TODO: jump nodes ?!\n"
  },
  {
    "path": "Source/SOrb/SplineLogic/SoSplineGraphStructs.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#include \"SoSplineGraphStructs.h\"\n#include \"SoSplinePoint.h\"\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFSoSplineGraphNode::FSoSplineGraphNode(const FSoSplinePoint& InSplinePoint, float InZValue) :\n\tSplinePoint(InSplinePoint),\n\tZValue(InZValue)\n{\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFLinearColor FSoSplineGraphEdge::GetEdgeColor() const\n{\n\tswitch (Type)\n\t{\n\t\tcase ESoSplineGraphEdge::ESGE_Walk:\n\t\t\treturn FLinearColor(0.0f, 1.0f, 0.0f, 1.0f);\n\n\t\tcase ESoSplineGraphEdge::ESGE_Fall:\n\t\t\treturn FLinearColor(0.0f, 0.6f, 0.7f, 1.0f);\n\t}\n\n\treturn FLinearColor(0.0f, 0.0f, 0.0f, 1.0f);\n}\n"
  },
  {
    "path": "Source/SOrb/SplineLogic/SoSplineGraphStructs.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#pragma once\n#include \"CoreTypes.h\"\n#include \"UObject/ObjectMacros.h\"\n#include \"SplineLogic/SoSplinePoint.h\"\n#include \"SoSplineGraphStructs.generated.h\"\n\n\nUENUM(meta=(ScriptName=\"SoSplineGraphEdgeType\"))\nenum class ESoSplineGraphEdge : uint8\n{\n\t// basic edge, undirected\n\tESGE_Walk\tUMETA(DisplayName = \"Walk\"),\n\n\t// directional \"walk off a cliff\" edge\n\tESGE_Fall\tUMETA(DisplayName = \"Fall\")\n};\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUSTRUCT(BlueprintType)\nstruct FSoSplineGraphEdge\n{\n\tGENERATED_USTRUCT_BODY()\n\npublic:\n\n\tUPROPERTY(VisibleAnywhere)\n\tint32 StartNodeIndex;\n\n\tUPROPERTY(VisibleAnywhere)\n\tint32 EndNodeIndex;\n\n\tUPROPERTY(VisibleAnywhere)\n\tfloat Length;\n\n\tUPROPERTY(VisibleAnywhere)\n\tfloat MaxHeight;\n\n\tUPROPERTY(VisibleAnywhere)\n\tESoSplineGraphEdge Type;\n\npublic:\n\n\tFLinearColor GetEdgeColor() const;\n\n\tbool IsUndirected() const { return Type == ESoSplineGraphEdge::ESGE_Walk; }\n};\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// int array wrapper so it can be placed inside a container\nUSTRUCT(BlueprintType)\nstruct FSoIntArray\n{\n\tGENERATED_USTRUCT_BODY()\n\n\tUPROPERTY(VisibleAnywhere)\n\tTArray<int32> Elements;\n};\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUSTRUCT(BlueprintType)\nstruct FSoSplineGraphNode\n{\n\tGENERATED_USTRUCT_BODY()\n\npublic:\n\n\tFSoSplineGraphNode() {};\n\n\tFSoSplineGraphNode(const FSoSplinePoint& InSplinePoint, float InZValue);\n\n\tFVector ToVector() const { return SplinePoint.ToVector(ZValue); }\n\npublic:\n\n\tUPROPERTY(VisibleAnywhere)\n\tFSoSplinePoint SplinePoint;\n\n\tUPROPERTY(VisibleAnywhere)\n\tfloat ZValue = 0.f;\n\n\tUPROPERTY(VisibleAnywhere)\n\tTArray<int32> EdgeIndices;\n};\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// used only inside the spline graph generation\n// should not be stored as it references actors but it is not UStruct\n// e.g. points are tested when edge is under construction\nstruct FSoSplineGraphPoint\n{\n\npublic:\n\n\tFVector ToVector() const { return SplineLoc.ToVector(FloorZ); }\n\n\tFVector ToVector(float ZOffset) const { return SplineLoc.ToVector(FloorZ) + FVector(0.0f, 0.0f, ZOffset); }\n\npublic:\n\n\t// spline location of given point\n\tFSoSplinePoint SplineLoc;\n\t// Z coordinate of the floor in given point\n\tfloat FloorZ;\n\t// max height of walkable area at given point\n\tfloat Height;\n};\n"
  },
  {
    "path": "Source/SOrb/SplineLogic/SoSplineHelper.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#include \"SplineLogic/SoSplineHelper.h\"\n\n#include \"EngineUtils.h\"\n\n#include \"Components/SplineComponent.h\"\n#include \"SplineLogic/SoSplineWalker.h\"\n#include \"SplineLogic/SoPlayerSpline.h\"\n#include \"SplineLogic/SoSplinePointPtr.h\"\n\n#if WITH_EDITOR\n#include \"Editor.h\"\n#endif\n\nbool USoSplineHelper::bSplinePosCorrectionEnabled = true;\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFSoSplinePoint USoSplineHelper::ExtractSplinePointPtr(const FSoSplinePointPtr& SplinePointPtr)\n{\n\treturn SplinePointPtr.Extract();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoSplineHelper::SetSplinePointFromPtr(UPARAM(Ref)FSoSplinePoint& SplineLocation, const FSoSplinePointPtr& SplinePointPtr)\n{\n\tSplineLocation = SplinePointPtr.Extract();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFSoSplinePointPtr USoSplineHelper::ConstructSplinePointPtr(const FSoSplinePoint& SplineLocation)\n{\n\tFSoSplinePointPtr Ptr(SplineLocation);\n\treturn Ptr;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoSplineHelper::SetSplineLocationReferenceZ(UPARAM(Ref)FSoSplinePoint& SplineLocation, float ReferenceZ)\n{\n\tSplineLocation.SetReferenceZ(ReferenceZ);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFVector USoSplineHelper::GetRandomLocationNearSplineLocation(UPARAM(Ref)FSoSplinePoint& SplineLocation, float Range, float LocationZ)\n{\n\tif (!SplineLocation.IsValid())\n\t\treturn FVector::ZeroVector;\n\n\tconst float RangeMax = fabs((SplineLocation + Range) - SplineLocation);\n\tconst float RangeMin = -fabs((SplineLocation - Range) - SplineLocation);\n\n\tconst float Distance = FMath::RandRange(RangeMin, RangeMax);\n\n\treturn (SplineLocation + Distance).GetWorldLocation(LocationZ);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoSplineHelper::UpdateSplineLocationRef(AActor* Actor,\n\t\t\t\t\t\t\t\t\t\t\t  UPARAM(Ref)FSoSplinePointPtr& SplineLocationPtr,\n\t\t\t\t\t\t\t\t\t\t\t  bool bPlayerSplineOnly,\n\t\t\t\t\t\t\t\t\t\t\t  bool bIgnoreZ,\n\t\t\t\t\t\t\t\t\t\t\t  bool bForcedCanModifySpline)\n{\n\tbool bCanModifySpline = bForcedCanModifySpline;\n\tbool bJustReturn = !bSplinePosCorrectionEnabled;\n#if WITH_EDITOR\n\tif (GEditor && GEditor->GetActiveViewport())\n\t{\n\t\tbCanModifySpline = bCanModifySpline || GEditor->GetActiveViewport()->KeyState(EKeys::E);\n\t\tbJustReturn = bJustReturn || GEditor->GetActiveViewport()->KeyState(EKeys::Q);\n\t}\n#endif\n\n\tif (bJustReturn || Actor == nullptr)\n\t\treturn;\n\n\tFSoSplinePoint SplineLocation = SplineLocationPtr.Extract();\n\tconst FVector ActorLocation = Actor->GetActorLocation();\n\tFVector NewLocation = FVector(0, 0, 0);\n\tif (bCanModifySpline)\n\t{\n\t\t// iterate through all spline, find the closest\n\t\tstruct FSoSplineResult\n\t\t{\n\t\t\tfloat DistanceSquared;\n\t\t\tfloat InputKey;\n\t\t\tASoSpline* Spline;\n\t\t};\n\n\t\tFSoSplineResult BestFit = { BIG_NUMBER, 0.0f, nullptr };\n\n\t\tTActorIterator<ASoSpline> SplineItr(Actor->GetWorld());\n\t\tTActorIterator<ASoPlayerSpline> PlayerSplineItr(Actor->GetWorld());\n\t\twhile ((bPlayerSplineOnly && PlayerSplineItr) || (!bPlayerSplineOnly && SplineItr))\n\t\t{\n\t\t\tASoSpline* SoSpline = bPlayerSplineOnly ? Cast<ASoSpline>(*PlayerSplineItr) : *SplineItr;\n\t\t\t// GetSplineComponent()->GetSplinePointPosition().InaccurateFindNearest(WhateverLocation, DistanceSquared); doesn't work, distance is wrong!!!\n\t\t\tFVector OldLoc = ActorLocation;\n\t\t\tif (bIgnoreZ)\n\t\t\t\tOldLoc.Z = SoSpline->GetWorldLocationAtDistance(0).Z;\n\t\t\tconst float InputKey = SoSpline->GetSplineComponent()->FindInputKeyClosestToWorldLocation(OldLoc);\n\t\t\tconst FVector Loc = SoSpline->GetSplineComponent()->GetLocationAtSplineInputKey(InputKey, ESplineCoordinateSpace::World);\n\t\t\tconst float SizeSquared = (Loc - OldLoc).SizeSquared();\n\t\t\tif (SizeSquared < BestFit.DistanceSquared)\n\t\t\t\tBestFit = { SizeSquared, InputKey, SoSpline };\n\n\t\t\tif (bPlayerSplineOnly)\n\t\t\t\t++PlayerSplineItr;\n\t\t\telse\n\t\t\t\t++SplineItr;\n\t\t}\n\n\t\tif (BestFit.Spline != nullptr)\n\t\t{\n\t\t\tSplineLocation.SetSpline(BestFit.Spline);\n\t\t\tSplineLocation.SetDistanceFromInputKey(BestFit.InputKey);\n\t\t\tNewLocation = BestFit.Spline->GetSplineComponent()->GetLocationAtSplineInputKey(BestFit.InputKey, ESplineCoordinateSpace::World);\n\t\t}\n\t}\n\telse\n\t{\n\t\tconst ASoSpline* SoSpline = SplineLocation.GetSpline();\n\t\tif (SoSpline != nullptr)\n\t\t{\n\t\t\tFVector Loc = ActorLocation;\n\t\t\tif (bIgnoreZ)\n\t\t\t\tLoc.Z = SoSpline->GetWorldLocationAtDistance(0).Z;\n\t\t\tconst float InputKey = SoSpline->GetSplineComponent()->FindInputKeyClosestToWorldLocation(Loc);\n\t\t\tSplineLocation.SetDistanceFromInputKey(InputKey);\n\t\t\tNewLocation = SoSpline->GetSplineComponent()->GetLocationAtSplineInputKey(InputKey, ESplineCoordinateSpace::World);\n\t\t}\n\t}\n\n\tconst ASoSpline* SoSpline = SplineLocation.GetSpline();\n\tif (SoSpline != nullptr)\n\t\tActor->SetActorLocation(FVector(NewLocation.X, NewLocation.Y, ActorLocation.Z));\n\n\tif (SplineLocation.GetSpline() != nullptr)\n\t\tSplineLocationPtr = FSoSplinePointPtr(SplineLocation);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoSplineHelper::ClampSplinePoint(FSoSplinePoint& SplinePoint)\n{\n\tSplinePoint.ClampSplineData();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFSoSplinePoint USoSplineHelper::GetOffsetedSplinePoint(const FSoSplinePoint& SplinePoint, float Delta)\n{\n\treturn SplinePoint + Delta;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFVector USoSplineHelper::GetWorldLocationFromSplinePoint(const FSoSplinePoint& SplinePoint)\n{\n\treturn SplinePoint;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFVector USoSplineHelper::GetWorldLocationFromSplinePointZ(const FSoSplinePoint& SplinePoint, float ZValue)\n{\n\tconst FVector F = SplinePoint;\n\treturn FVector(F.X, F.Y, ZValue);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFRotator USoSplineHelper::GetSplineLookAtRotation(const FSoSplinePoint& Source, const FSoSplinePoint& Target)\n{\n\tconst float TargetDir = FMath::Sign((Target.GetDistanceFromSplinePoint(Source, 10000)));\n\treturn (Source.GetDirection() * TargetDir).Rotation();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nint32 USoSplineHelper::GetSplineLookAtSign(const FSoSplinePoint& Source, const FSoSplinePoint& Target)\n{\n\treturn FMath::Sign((Target.GetDistanceFromSplinePoint(Source, 10000)));\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFVector USoSplineHelper::GetSplineVelocity(const FSoSplinePoint& SplinePoint, float SplineDirVelocity, float ZVelocity)\n{\n\treturn FVector(FVector2D(SplinePoint.GetDirection() * SplineDirVelocity), ZVelocity);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFVector2D USoSplineHelper::GetDirVec2D(const FSoSplinePoint& StartSP, float StartZ, const FSoSplinePoint& EndSP, float EndZ)\n{\n\treturn FVector2D(EndSP - StartSP, EndZ - StartZ).GetSafeNormal();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoSplineHelper::CheckSplinePoint(const FSoSplinePoint& SplinePoint, bool bPrintWarnings)\n{\n\treturn SplinePoint.IsValid(false);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nfloat USoSplineHelper::GetDistanceBetweenSplinePoints(const FSoSplinePoint& First, const FSoSplinePoint& Second)\n{\n\treturn Second - First;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoSplineHelper::IsSplinepointBetweenPoints(const FSoSplinePoint& Point, const FSoSplinePoint& Start, const FSoSplinePoint& End)\n{\n\tconst float SegmentLength = fabs(End - Start);\n\n\tconst float StartDistance = fabs(Point - Start);\n\tconst float EndDistance = fabs(Point - End);\n\n\treturn (StartDistance < SegmentLength) && (EndDistance < SegmentLength);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nfloat USoSplineHelper::ClampOffsetBetweenSplinePoints(const FSoSplinePoint& Source,\n\t\t\t\t\t\t\t\t\t\t\t\t\t  const FSoSplinePoint& Border0,\n\t\t\t\t\t\t\t\t\t\t\t\t\t  const FSoSplinePoint& Border1,\n\t\t\t\t\t\t\t\t\t\t\t\t\t  float Offset)\n{\n\tconst float DistanceToBorder0 = Border0.GetDistanceFromSplinePoint(Source);\n\tconst float DistanceToBorder1 = Border1.GetDistanceFromSplinePoint(Source);\n\n\tif (fabs(DistanceToBorder0) < fabs(Offset) && FMath::Sign(DistanceToBorder0) == FMath::Sign(Offset))\n\t\tOffset = DistanceToBorder0;\n\telse if (fabs(DistanceToBorder1) < fabs(Offset) && FMath::Sign(DistanceToBorder1) == FMath::Sign(Offset))\n\t\tOffset = DistanceToBorder1;\n\n\treturn Offset;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoSplineHelper::IsSplinePointTargetInRange(const FSoSplinePoint& Source,\n\t\t\t\t\t\t\t\t\t\t\t\t const FSoSplinePoint& Target,\n\t\t\t\t\t\t\t\t\t\t\t\t const FVector& ReferenceDirection,\n\t\t\t\t\t\t\t\t\t\t\t\t float RangeDistance,\n\t\t\t\t\t\t\t\t\t\t\t\t bool& OutForward,\n\t\t\t\t\t\t\t\t\t\t\t\t bool& OutInRange)\n{\n\tOutInRange = false;\n\tconst float Distance = Target.GetDistanceFromSplinePoint(Source, RangeDistance);\n\tif (Distance <= RangeDistance)\n\t{\n\t\tOutInRange = true;\n\t\tOutForward = FMath::Sign(Source.GetDirectionModifierFromVector(ReferenceDirection)) == FMath::Sign(Distance);\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoSplineHelper::PushSplineWalker(AActor* ActorToPush,\n\t\t\t\t\t\t\t\t\t   const FVector& DeltaMovement, \n\t\t\t\t\t\t\t\t\t   float DeltaSeconds, \n\t\t\t\t\t\t\t\t\t   FHitResult* HitResult,\n\t\t\t\t\t\t\t\t\t   AActor* RematerializeLocation,\n\t\t\t\t\t\t\t\t\t   int32 DamageAmountIfStuck,\n\t\t\t\t\t\t\t\t\t   bool bForceDamage)\n{\n\t// TODO: maybe ground should be considered (if it is not horizontal the object does not move if it would be pushed into the ground, it should move along the surface)\n\tconst FVector OldActorLocation = ActorToPush->GetActorLocation();\n\tconst FSoSplinePoint SplineLocation = ISoSplineWalker::Execute_GetSplineLocationI(ActorToPush);\n\n\tif (!SplineLocation.IsValid(false))\n\t\treturn false;\n\n\tconst int32 DirModifer = SplineLocation.GetDirectionModifierFromVector(DeltaMovement);\n\tFSoSplinePoint NewSplinePoint = SplineLocation.GetEstimatedSplineLocation(OldActorLocation + DeltaMovement, DeltaMovement.Size() * DirModifer);\n\tFHitResult HitRes;\n\tconst FVector PointOnSpline = FVector(NewSplinePoint);\n\n\tActorToPush->SetActorLocation(FVector(PointOnSpline.X, PointOnSpline.Y, OldActorLocation.Z + DeltaMovement.Z), HitResult != nullptr, HitResult);\n\tbool bStuck = false;\n\tif (HitResult != nullptr && HitResult->bBlockingHit)\n\t{\n\t\tconst FVector DirNormal = DeltaMovement.GetSafeNormal();\n\t\tconst FVector NegativeHitNormal = -HitResult->ImpactNormal;\n\n\t\t// if ((DirNormal | NegativeHitNormal) > 0.5f)\n\t\t{\n\t\t\tNewSplinePoint = SplineLocation + (NewSplinePoint - SplineLocation) * HitResult->Time;\n\t\t\tbStuck = true;\n\t\t}\n\t}\n\n\tISoSplineWalker::Execute_SetSplineLocation(ActorToPush, NewSplinePoint, true);\n\tISoSplineWalker::Execute_OnPushed(ActorToPush, DeltaMovement, DeltaSeconds, bStuck, RematerializeLocation, DamageAmountIfStuck, bForceDamage);\n\n\treturn true;\n}\n"
  },
  {
    "path": "Source/SOrb/SplineLogic/SoSplineHelper.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#pragma once\n#include \"SplineLogic/SoSplinePointPtr.h\"\n#include \"SoSplineHelper.generated.h\"\n\n\nstruct FHitResult;\n\n\nUCLASS()\nclass SORB_API USoSplineHelper : public UObject\n{\n\tGENERATED_BODY()\n\npublic:\n\n\tUSoSplineHelper(const FObjectInitializer& ObjectInitializer) {};\n\t~USoSplineHelper() {};\n\n\tUFUNCTION(BlueprintPure, Category = \"SoCharacter\")\n\tstatic FSoSplinePoint ExtractSplinePointPtr(const FSoSplinePointPtr& SplinePointPtr);\n\n\tUFUNCTION(BlueprintCallable, Category = \"SoCharacter\")\n\tstatic void SetSplinePointFromPtr(UPARAM(Ref)FSoSplinePoint& SplineLocation, const FSoSplinePointPtr& SplinePointPtr);\n\n\tUFUNCTION(BlueprintCallable, Category = SplinePoint)\n\tstatic FSoSplinePointPtr ConstructSplinePointPtr(const FSoSplinePoint& SplineLocation);\n\n\tUFUNCTION(BlueprintCallable, Category = \"SoCharacter\")\n\tstatic void SetSplineLocationReferenceZ(UPARAM(Ref)FSoSplinePoint& SplineLocation, float ReferenceZ);\n\n\tUFUNCTION(BlueprintPure, Category = \"SoCharacter\")\n\tstatic FVector GetRandomLocationNearSplineLocation(UPARAM(Ref)FSoSplinePoint& SplineLocation, float Range, float LocationZ);\n\n\tUFUNCTION(BlueprintPure, Category = \"SplinePoint\")\n\tstatic int32 GetDirectionModifierFromVector(const FSoSplinePoint& SplineLocation, const FVector& Vector)\n\t{\n\t\treturn SplineLocation.GetDirectionModifierFromVector(Vector);\n\t}\n\n\tUFUNCTION(BlueprintPure, Category = \"SplinePoint\")\n\tstatic FVector GetDirectionFromVector(const FSoSplinePoint& SplineLocation, const FVector& Vector)\n\t{\n\t\treturn SplineLocation.GetDirectionFromVector(Vector);\n\t}\n\n\t/**\n\t *  Function used to place/translate spline based actors in the EDITOR, should not be used in-game\n\t *  Works only if bSplinePosCorrectionEnabled is true (there is an editor button to toggle it)\n\t *\n\t *  Press and hold E: actor can move to another spline\n\t *  Press and hold Q: actor spline location won't be updated (actor can move freely)\n\t *\n\t *  Actor: the actor we would like to place\n\t *  SplineLocationPtr: safe way to store the spline ptr\n\t *  bPlayerSplineOnly: if it has to consider ASoPlayerSplines only (objects can use other type of splines, e.g. spline mesh - rail)\n\t *  bIgnoreZ: if true the z coordinates won't take into account when the closest spline is selected\n\t *  bForcedCanModifySpline: spline can be modified even if E isn't pressed\n\t */\n\tUFUNCTION(BlueprintCallable, Category = \"SplinePoint\")\n\tstatic void UpdateSplineLocationRef(AActor* Actor,\n\t\t\t\t\t\t\t\t\t\tUPARAM(Ref)FSoSplinePointPtr& SplineLocationPtr,\n\t\t\t\t\t\t\t\t\t\tbool bPlayerSplineOnly = true,\n\t\t\t\t\t\t\t\t\t\tbool bIgnoreZ = true,\n\t\t\t\t\t\t\t\t\t\tbool bForcedCanModifySpline = false);\n\n\t// clamps spline distance based on spline length\n\tUFUNCTION(BlueprintCallable, Category = \"SplinePoint\")\n\tstatic void ClampSplinePoint(UPARAM(Ref)FSoSplinePoint& SplinePoint);\n\n\tUFUNCTION(BlueprintCallable, Category = \"SplinePoint\")\n\tstatic void AddToSplinePoint(UPARAM(Ref)FSoSplinePoint& SplinePoint, float Delta) { SplinePoint += Delta; }\n\n\tUFUNCTION(BlueprintPure, Category = \"SplinePoint\")\n\tstatic FSoSplinePoint GetOffsetedSplinePoint(const FSoSplinePoint& SplinePoint, float Delta);\n\n\tUFUNCTION(BlueprintCallable, Category = \"SplinePoint\")\n\tstatic FVector GetWorldLocationFromSplinePoint(const FSoSplinePoint& SplinePoint);\n\n\tUFUNCTION(BlueprintCallable, Category = \"SplinePoint\")\n\tstatic FVector GetWorldLocationFromSplinePointZ(const FSoSplinePoint& SplinePoint, float ZValue);\n\n\t/** Use this rotation in source to look at target in spline space (along spline), spline distance is limited to 10000 in search */\n\tUFUNCTION(BlueprintCallable, Category = \"SplinePoint\")\n\tstatic FRotator GetSplineLookAtRotation(const FSoSplinePoint& Source, const FSoSplinePoint& Target);\n\n\tUFUNCTION(BlueprintPure, Category = \"SplinePoint\")\n\tstatic int32 GetSplineLookAtSign(const FSoSplinePoint& Source, const FSoSplinePoint& Target);\n\n\t// calculates the 3d starter velocity from the components\n\tUFUNCTION(BlueprintCallable, Category = \"SplinePoint\")\n\tstatic FVector GetSplineVelocity(const FSoSplinePoint& SplinePoint, float SplineDirVelocity, float ZVelocity);\n\n\tUFUNCTION(BlueprintCallable, Category = \"SplinePoint\")\n\tstatic FVector2D GetDirVec2D(const FSoSplinePoint& StartSP, float StartZ, const FSoSplinePoint& EndSP, float EndZ);\n\n\tUFUNCTION(BlueprintCallable, Category = \"SplinePoint\")\n\tstatic bool CheckSplinePoint(const FSoSplinePoint& SplinePoint, bool bPrintWarnings);\n\n\tUFUNCTION(BlueprintCallable, Category = \"SplinePoint\")\n\tstatic float GetDistanceBetweenSplinePoints(const FSoSplinePoint& First, const FSoSplinePoint& Second);\n\n\tUFUNCTION(BlueprintPure, Category = \"SplinePoint\")\n\tstatic bool IsSplinepointBetweenPoints(const FSoSplinePoint& Point, const FSoSplinePoint& Start, const FSoSplinePoint& End);\n\n\tUFUNCTION(BlueprintPure, Category = \"SplinePoint\")\n\tstatic float ClampOffsetBetweenSplinePoints(const FSoSplinePoint& Source,\n\t\t\t\t\t\t\t\t\t\t\t\tconst FSoSplinePoint& Border0,\n\t\t\t\t\t\t\t\t\t\t\t\tconst FSoSplinePoint& Border1,\n\t\t\t\t\t\t\t\t\t\t\t\tfloat Offset);\n\n\t/** bForward is based on ReferenceDirection */\n\tUFUNCTION(BlueprintPure, Category = \"SplinePoint\")\n\tstatic void IsSplinePointTargetInRange(const FSoSplinePoint& Source,\n\t\t\t\t\t\t\t\t\t\t   const FSoSplinePoint& Target,\n\t\t\t\t\t\t\t\t\t\t   const FVector& ReferenceDirection,\n\t\t\t\t\t\t\t\t\t\t   float RangeDistance,\n\t\t\t\t\t\t\t\t\t\t   bool& OutForward,\n\t\t\t\t\t\t\t\t\t\t   bool& OutInRange);\n\n\t/**\n\t* ActorToPush is expected to be a ISplineWalker\n\t* he is moved with DeltaMovement in real life, and he tries to follow it along spline\n\t* if HitResult == nullptr then there is no sweep\n\t* @return: false: actor has no valid spline location\n\t*/\n\tstatic bool PushSplineWalker(AActor* ActorToPush,\n\t\t\t\t\t\t\t\t const FVector& DeltaMovement,\n\t\t\t\t\t\t\t\t float DeltaSeconds,\n\t\t\t\t\t\t\t\t FHitResult* HitResult,\n\t\t\t\t\t\t\t\t AActor* RematerializeLocation,\n\t\t\t\t\t\t\t\t int32 DamageAmountIfStuck,\n\t\t\t\t\t\t\t\t bool bForceDamage);\n\n\tstatic bool IsSplinePosCorrectionEnabled() { return bSplinePosCorrectionEnabled; }\n\tstatic void SetSplinePosCorrection(bool bNewValue) { bSplinePosCorrectionEnabled = bNewValue; }\n\nprivate:\n\tstatic bool bSplinePosCorrectionEnabled;\n\n};\n"
  },
  {
    "path": "Source/SOrb/SplineLogic/SoSplinePoint.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#include \"SoSplinePoint.h\"\n#include \"Components/SplineComponent.h\"\n#include \"SoSpline.h\"\n\n\nstatic constexpr int32 ACCEPTED_SPLINECONNECTION_DISTANCE = 10;\n\nDEFINE_LOG_CATEGORY(LogSoSplineSys);\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFSoSplinePoint::FSoSplinePoint()\n{\n\tDistance = 0.f;\n\tSpline = nullptr;\n}\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFSoSplinePoint::FSoSplinePoint(ASoSpline* InSpline, float InDistance /*= 0.f*/) :\n\tDistance(InDistance),\n\tSpline(InSpline)\n{\n\tClampSplineData();\n}\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFSoSplinePoint::FSoSplinePoint(const FSoSplinePoint& TheOther) :\n\tDistance(TheOther.Distance),\n\tSpline(TheOther.Spline),\n\tReferenceActor(TheOther.ReferenceActor),\n\tReferenceZ(TheOther.ReferenceZ)\n{\n\tClampSplineData();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSoSplinePoint::operator=(const FSoSplinePoint& OtherPoint)\n{\n\tDistance = OtherPoint.Distance;\n\tSpline = OtherPoint.Spline;\n\tReferenceActor = OtherPoint.ReferenceActor;\n\tReferenceZ = OtherPoint.ReferenceZ;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSoSplinePoint::CopySplineLocation(const FSoSplinePoint& OtherPoint)\n{\n\tDistance = OtherPoint.Distance;\n\tSpline = OtherPoint.Spline;\n\tReferenceZ = OtherPoint.ReferenceZ;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFSoSplinePoint FSoSplinePoint::operator+(float DeltaDistance) const\n{\n\tFSoSplinePoint NewPoint = *this;\n\tNewPoint += DeltaDistance;\n\treturn NewPoint;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSoSplinePoint::SetDistance(float InDistance)\n{\n\tif (InDistance < 0 || InDistance > GetActiveSplineLength())\n\t{\n\t\tUE_LOG(LogSoSplineSys, Error, TEXT(\"SetDistance: invalid distance %f for %s\"), InDistance, *Spline->GetSplineName());\n\t\tInDistance = FMath::Clamp(InDistance, 0.f, GetActiveSplineLength());\n\t}\n\tDistance = InDistance;\n}\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSoSplinePoint::SetDistanceFromInputKey(float InputKey)\n{\n\tif (Spline == nullptr)\n\t\treturn;\n\n\tconst USplineComponent* SplineComponent = Spline->GetSplineComponent();\n\tconst float SplineLength = SplineComponent->GetSplineLength();\n\tfloat Left = 0.0f;\n\tfloat Right = SplineLength;\n\tfloat NewDistance = Right * 0.5f;\n\t// WARNING: if the bug is fixed in the engine \"(SplineComponent->GetNumberOfSplinePoints() - 1.0f)\" has to be removed\n\tfloat EstimatedInputKey = SplineComponent->GetInputKeyAtDistanceAlongSpline(NewDistance) * (SplineComponent->GetNumberOfSplinePoints() - 1.0f);\n\twhile (fabs(EstimatedInputKey - InputKey) > KINDA_SMALL_NUMBER)\n\t{\n\t\tif (EstimatedInputKey > InputKey)\n\t\t\tRight = NewDistance;\n\t\telse\n\t\t\tLeft = NewDistance;\n\n\t\tNewDistance = (Left + Right) / 2.0f;\n\t\t// WARNING: if the bug is fixed in the engine \"(SplineComponent->GetNumberOfSplinePoints() - 1.0f)\" has to be removed\n\t\tEstimatedInputKey = SplineComponent->GetInputKeyAtDistanceAlongSpline(NewDistance) * (SplineComponent->GetNumberOfSplinePoints() - 1.0f);\n\n\t\tSplineComponent->GetSplineLength();\n\n\t\tif (NewDistance < KINDA_SMALL_NUMBER || NewDistance > SplineLength - 1.0f)\n\t\t\tbreak;\n\t}\n\n\tDistance = NewDistance;\n}\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSoSplinePoint::SetSpline(ASoSpline* InSpline)\n{\n\tSpline = InSpline;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSoSplinePoint::ClampSplineData()\n{\n\tif (Spline)\n\t\tDistance = FMath::Clamp(Distance, 0.f, Spline->GetSplineComponent()->GetSplineLength());\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSoSplinePoint::operator+=(float DeltaDistance)\n{\n\tconst FVector DirectionVector = GetDirection();\n\tif (DirectionVector.Z != 0)\n\t{\n\t\tFVector HorizontalDirection = FVector(DirectionVector.X, DirectionVector.Y, 0.f);\n\t\tHorizontalDirection.Normalize();\n\n\t\tDeltaDistance /= (DirectionVector | HorizontalDirection);\n\t}\n\n\tbool bSplineEnded = false;\n\tfloat Rest = 0;\n\tAddToDistance(DeltaDistance, bSplineEnded, Rest);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSoSplinePoint::ProjectAndAddToDistance(float DeltaDistance, bool& bOutSplineEnd, float& OutRestDistanceTime)\n{\n\tconst FVector DirectionVector = GetDirection();\n\tif (DirectionVector.Z != 0)\n\t{\n\t\tFVector HorizontalDirection = FVector(DirectionVector.X, DirectionVector.Y, 0.f);\n\t\tHorizontalDirection.Normalize();\n\n\t\tDeltaDistance /= (DirectionVector | HorizontalDirection);\n\t}\n\tAddToDistance(DeltaDistance, bOutSplineEnd, OutRestDistanceTime);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSoSplinePoint::AddToDistance(const float DeltaDistance, bool& bOutSplineEnd, float& OutRestDistanceTime)\n{\n\tbOutSplineEnd = false;\n\tOutRestDistanceTime = 0.f;\n\n\tif (fabs(DeltaDistance) < KINDA_SMALL_NUMBER)\n\t\treturn;\n\n\tconst float NewDistance = Distance + DeltaDistance * Spline->GetSplineDirection();\n\n\tif (NewDistance < 0.f)\n\t{\n\t\tconst float ZValue = ReferenceActor == nullptr ? ReferenceZ : ReferenceActor->GetActorLocation().Z;\n\t\tASoSpline* PrevSpline = Spline->GetPrevSpline(ZValue);\n\t\tif (PrevSpline == nullptr)\n\t\t{\n\t\t\tbOutSplineEnd = true;\n\t\t\tOutRestDistanceTime = fabs(NewDistance) / fabs(DeltaDistance);\n\t\t\tDistance = 0;\n\t\t\treturn;\n\t\t}\n\t\tconst FVector Offset = PrevSpline->GetEndWorldLocation() - Spline->GetStartWorldLocation();\n\n#if WITH_EDITOR\n\t\t{\n\t\t\tconst FVector Dist1 = Offset;\n\t\t\tconst FVector Dist2 = PrevSpline->GetStartWorldLocation() - Spline->GetStartWorldLocation();\n\n\t\t\tif (Dist1.Size2D() > ACCEPTED_SPLINECONNECTION_DISTANCE && Dist2.Size2D() > ACCEPTED_SPLINECONNECTION_DISTANCE)\n\t\t\t\tUE_LOG(LogSoSplineSys, Error, TEXT(\"Two spline isn't connected properly: %s and %s\"), *Spline->GetSplineName(), *PrevSpline->GetSplineName());\n\t\t}\n#endif\n\t\tif (Offset.Size2D() > ACCEPTED_SPLINECONNECTION_DISTANCE)\n\t\t\tDistance = -NewDistance;\n\t\telse\n\t\t\tDistance = PrevSpline->GetSplineComponent()->GetSplineLength() + NewDistance;\n\t\tSpline = PrevSpline;\n\t}\n\telse\n\t{\n\t\tconst float SplineLength = Spline->GetSplineComponent()->GetSplineLength();\n\t\tif (NewDistance > SplineLength)\n\t\t{\n\t\t\tconst float ZValue = ReferenceActor == nullptr ? ReferenceZ : ReferenceActor->GetActorLocation().Z;\n\t\t\tASoSpline* NextSpline = Spline->GetNextSpline(ZValue);\n\t\t\tif (NextSpline == nullptr)\n\t\t\t{\n\t\t\t\tbOutSplineEnd = true;\n\t\t\t\tOutRestDistanceTime = (NewDistance - SplineLength) / fabs(DeltaDistance);\n\t\t\t\tDistance = SplineLength;\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tDistance = NewDistance - SplineLength;\n\t\t\tconst FVector Offset = Spline->GetEndWorldLocation() - NextSpline->GetStartWorldLocation();\n\n#if WITH_EDITOR\n\t\t\t{\n\t\t\t\tconst FVector Dist1 = Offset;\n\t\t\t\tconst FVector Dist2 = NextSpline->GetEndWorldLocation() - Spline->GetEndWorldLocation();\n\n\t\t\t\tif (Dist1.Size2D() > ACCEPTED_SPLINECONNECTION_DISTANCE && Dist2.Size2D() > ACCEPTED_SPLINECONNECTION_DISTANCE)\n\t\t\t\t\tUE_LOG(LogSoSplineSys, Error, TEXT(\"Two spline isn't connected properly: %s and %s\"), *Spline->GetSplineName(), *NextSpline->GetSplineName());\n\t\t\t}\n#endif\n\n\t\t\tif (Offset.Size2D() > ACCEPTED_SPLINECONNECTION_DISTANCE)\n\t\t\t\tDistance = NextSpline->GetSplineComponent()->GetSplineLength() - Distance;\n\t\t\tSpline = NextSpline;\n\t\t}\n\t\telse\n\t\t\tDistance = NewDistance;\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSoSplinePoint::SetDistanceFromWorldLocation(const FVector& WorldLocation)\n{\n\tif (Spline == nullptr)\n\t{\n\t\tUE_LOG(LogSoSplineSys, Error, TEXT(\"FSoSplinePoint::SetDistanceFromWorldLocation called, but Spline is nullptr!\"));\n\t\treturn;\n\t}\n\tconst float InputKey = Spline->GetSplineComponent()->FindInputKeyClosestToWorldLocation(WorldLocation);\n\tSetDistanceFromInputKey(InputKey);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nfloat FSoSplinePoint::operator-(const FSoSplinePoint& OtherPoint) const\n{\n#if WITH_EDITOR\n\tif (Spline == nullptr || OtherPoint.GetSpline() == nullptr)\n\t{\n\t\tUE_LOG(LogSoSplineSys, Error, TEXT(\"FSoSplinePoint - FSoSplinePoint: at least one spline is nullptr!\"));\n\t\treturn BIG_NUMBER;\n\t}\n#endif\n\treturn GetDistanceFromSplinePoint(OtherPoint);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// A - B == A.GetDistanceFromSplinePoint(B)\nfloat FSoSplinePoint::GetDistanceFromSplinePoint(const FSoSplinePoint& OtherPoint, float MaxAcceptedDistance) const\n{\n\tif (Spline == nullptr || OtherPoint.Spline == nullptr)\n\t\treturn BIG_NUMBER;\n\n\tstruct FSoPointDesc\n\t{\n\t\tconst ASoSpline* Spline = nullptr;\t// the spline the point is on\n\t\tbool bStartPoint = true;\t\t\t// indicates if the point is the first or the last point of the spline\n\t\tfloat Distance = 0.0f;\t\t\t\t// shortest distance from B so far\n\t\tint32 Direction = 1;\t\t\t\t// the direction we have to go along B from starter location to reach this point\n\n\t\tFSoPointDesc(const ASoSpline* S, bool B, float D, int Dir) : Spline(S), bStartPoint(B), Distance(D), Direction(Dir) {};\n\t};\n\n\tint32 TargetDirection = 1;\n\tfloat TargetDistance = BIG_NUMBER;\n\n\tif (Spline == OtherPoint.Spline)\n\t{\n\t\t// register the trivial way\n\t\tTargetDistance = (Distance - OtherPoint.Distance) * Spline->GetSplineDirection();\n\t\tTargetDirection = FMath::Sign(TargetDistance);\n\t\tTargetDistance = fabs(TargetDistance);\n\t\t// we still have to go on - another way could be shorter theoretically\n\t}\n\n\t// One Path is one path through the spline graph\n\t// Only the distance matters and the direction in the first spline from the starting point, those are stored\n\t// Each Path begins at \"A\" and ends at the beginning or at the end of a spline\n\tTArray<FSoPointDesc> Path;\n\t// used to stop not optimal Paths\n\tTArray<FSoPointDesc> BestWayTable;\n\tBestWayTable.Reserve(30);\n\tPath.Reserve(30);\n\n\t// Algorithm:\n\n\t// Get next Path from FIFO\n\t// If the Path's endpoint and the target is in the same spline, update MinDist if necessary\n\t// A Neighbor Point is a point, which is:\n\t//\t\tnot in the same spline\n\t//\t\t(0 distance away, located near this end of the spline, or\n\t//\t\tSplineLength distance away, located near the other end of the spline)\n\t// Make new Path from each neighbor if\n\t//\t\tNew PathEndPoint wasn't reached yet, or it is closer this way, and\n\t//\t\tNew Path distance is < minimum target distance\n\t//\t\tNew Path distance is < MaxAcceptedDistance\n\t// Update BestWayTable && push new Paths to FIFO\n\t// Repeat until we run out of Paths\n\n\t// init values\n\tconst FSoPointDesc S1 = { OtherPoint.Spline, true, OtherPoint.Distance, -OtherPoint.Spline->GetSplineDirection() };\n\tconst FSoPointDesc S2 = { OtherPoint.Spline, false, OtherPoint.Spline->GetSplineComponent()->GetSplineLength() - OtherPoint.Distance, OtherPoint.Spline->GetSplineDirection() };\n\tPath.Add(S1);\n\tPath.Add(S2);\n\tBestWayTable.Add(S1);\n\tBestWayTable.Add(S2);\n\n\tint32 PathIndex = 0;\n\n\twhile (PathIndex < Path.Num())\n\t{\n\t\tconst FSoPointDesc& Point = Path[PathIndex];\n\t\tPathIndex += 1;\n\n\t\t// Goal Spline? Let's calculate distance to target point\n\t\tif (Point.Spline == Spline)\n\t\t{\n\t\t\tfloat NewDistance = Point.Distance;\n\t\t\tif (Point.bStartPoint)\n\t\t\t\tNewDistance += Distance;\n\t\t\telse\n\t\t\t\tNewDistance += (GetSpline()->GetSplineComponent()->GetSplineLength() - Distance);\n\n\t\t\tif (NewDistance < TargetDistance)\n\t\t\t{\n\t\t\t\tTargetDistance = NewDistance;\n\t\t\t\tTargetDirection = Point.Direction;\n\t\t\t}\n\t\t}\n\n\t\t// generate new neighbors\n\t\t{\n\t\t\t// first turn prev\n\t\t\tauto* Splines = Point.bStartPoint ? &Point.Spline->GetPrevSplines() : &Point.Spline->GetNextSplines();\n\t\t\tfloat ExtraDistance = 0.0f;\n\t\t\tfor (int32 i = 0; i < 2; ++i) // second turn nexts\n\t\t\t{\n\t\t\t\tfor (const auto& SplinePtr : *Splines)\n\t\t\t\t{\n\t\t\t\t\tif (SplinePtr == nullptr)\n\t\t\t\t\t{\n\t\t\t\t\t\tUE_LOG(LogSoSplineSys, Error, TEXT(\"Nullptr as neighbor spline for %s\"), *Point.Spline->GetSplineName());\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tconst float DistToThisPoint = Point.Distance + ExtraDistance;\n\t\t\t\t\tconst FVector P0 = Point.bStartPoint ? Point.Spline->GetStartWorldLocation() : Point.Spline->GetEndWorldLocation();\n\t\t\t\t\tconst FVector PS = SplinePtr->GetStartWorldLocation();\n\t\t\t\t\tconst FVector PE = SplinePtr->GetEndWorldLocation();\n\t\t\t\t\tconst bool bStartPoint = (SplinePtr == Point.Spline) ? (!Point.bStartPoint) : ((P0 - PS).SizeSquared2D() < (P0 - PE).SizeSquared2D());\n\n\t\t\t\t\tbool bAdd = (TargetDistance > DistToThisPoint + KINDA_SMALL_NUMBER) && (DistToThisPoint < MaxAcceptedDistance);\n\t\t\t\t\tbool bAlreadyInBestTable = false;\n\t\t\t\t\tif (bAdd)\n\t\t\t\t\t{\n\t\t\t\t\t\tfor (auto& BestEntry : BestWayTable)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif (BestEntry.Spline == SplinePtr && BestEntry.bStartPoint == bStartPoint)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tbAlreadyInBestTable = true;\n\t\t\t\t\t\t\t\tbAdd = BestEntry.Distance > DistToThisPoint + KINDA_SMALL_NUMBER;\n\t\t\t\t\t\t\t\tif (bAdd)\n\t\t\t\t\t\t\t\t\tBestEntry = { SplinePtr, bStartPoint, DistToThisPoint, Point.Direction };\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (bAdd)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tconst FSoPointDesc NewEntry = { SplinePtr, bStartPoint, DistToThisPoint, Point.Direction };\n\t\t\t\t\t\t\tPath.Add(NewEntry);\n\t\t\t\t\t\t\tif (!bAlreadyInBestTable)\n\t\t\t\t\t\t\t\tBestWayTable.Add(NewEntry);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// switch from prev to next\n\t\t\t\tSplines = !Point.bStartPoint ? &Point.Spline->GetPrevSplines() : &Point.Spline->GetNextSplines();\n\t\t\t\tExtraDistance = Point.Spline->GetSplineComponent()->GetSplineLength();\n\t\t\t} // generate new neighbors | {prev, next}\n\t\t}\n\t} // PathIndex < Paths.Num()\n\t// UE_LOG(LogSoSplineSys, Display, TEXT(\"Distance: %f\"), TargetDirection * TargetDistance);\n\treturn TargetDirection * TargetDistance;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nfloat FSoSplinePoint::GetDistanceFromSplinePointWithZSquered(const FSoSplinePoint& OtherPoint, float MaxAcceptedDistance) const\n{\n\tconst float XDistance = GetDistanceFromSplinePoint(OtherPoint, MaxAcceptedDistance);\n\tconst float ZDistance = GetReferenceZ() - OtherPoint.GetReferenceZ();\n\n\treturn XDistance * XDistance + ZDistance * ZDistance;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFVector FSoSplinePoint::GetWorldLocation(float ZValue) const\n{\n\tFVector Location = *this;\n\tLocation.Z = ZValue;\n\treturn Location;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFSoSplinePoint::operator FVector() const\n{\n\tif (Spline == nullptr)\n\t{\n\t\tUE_LOG(LogSoSplineSys, Warning, TEXT(\"FSoSplinePoint -> FVector cast failed, FSoSplinePoint doesn't have a valid SoSpline\"));\n\t\treturn FVector(0, 0, 0);\n\t}\n\treturn Spline->GetWorldLocationAtDistance(Distance);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFSoSplinePoint::operator FVector2D() const\n{\n\treturn FVector2D(FVector(*this));\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFVector2D FSoSplinePoint::ToVector2D() const\n{\n\tif (Spline == nullptr)\n\t{\n\t\tUE_LOG(LogSoSplineSys, Warning, TEXT(\"FSoSplinePoint -> FVector2D failed, FSoSplinePoint doesn't have a valid SoSpline\"));\n\t\treturn FVector2D(0, 0);\n\t}\n\treturn FVector2D(Spline->GetWorldLocationAtDistance(Distance));\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFVector FSoSplinePoint::ToVector(float ZValue) const\n{\n\tif (Spline == nullptr)\n\t{\n\t\tUE_LOG(LogSoSplineSys, Warning, TEXT(\"FSoSplinePoint::ToVector failed, FSoSplinePoint doesn't have a valid SoSpline\"));\n\t\treturn FVector(0, 0, 0);\n\t}\n\tFVector Vec = Spline->GetWorldLocationAtDistance(Distance);\n\tVec.Z = ZValue;\n\treturn Vec;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFSoSplinePoint::operator FRotator() const\n{\n\tif (Spline == nullptr)\n\t{\n\t\tUE_LOG(LogSoSplineSys, Warning, TEXT(\"FSoSplinePoint -> FRotator cast failed, FSoSplinePoint doesn't have a valid SoSpline\"));\n\t\treturn FRotator();\n\t}\n\treturn Spline->GetWorldRotationAtDistance(Distance);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFVector FSoSplinePoint::GetPlaneNormal() const\n{\n\treturn FVector::CrossProduct(GetDirection(), FVector(0.f, 0.f, 1.f)).GetSafeNormal();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFVector FSoSplinePoint::GetDirection() const\n{\n\tif (!Spline)\n\t{\n\t\tUE_LOG(LogSoSplineSys, Warning, TEXT(\"FSoSplinePoint::GetDirection called, FSoSplinePoint doesn't have a valid Spline\"));\n\t\treturn FVector(0, 0, 0);\n\t}\n\n\treturn Spline->GetSplineComponent()->GetDirectionAtDistanceAlongSpline(Distance, ESplineCoordinateSpace::World) * Spline->GetSplineDirection();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool FSoSplinePoint::IsValid(bool bPrintWarning/* = true*/) const\n{\n\tif (!Spline)\n\t{\n\t\tif (bPrintWarning)\n\t\t{\n\t\t\tFString ActorName = FString(\"???\");\n\t\t\tif (ReferenceActor != nullptr)\n\t\t\t\tActorName = ReferenceActor->GetName();\n\t\t\tUE_LOG(LogSoSplineSys, Warning, TEXT(\"FSoSplinePoint IsValid check inside %s failed: Spline is missing\"), *ActorName);\n\t\t}\n\t\treturn false;\n\t}\n\n\tif (Distance < -KINDA_SMALL_NUMBER || Distance > Spline->GetSplineComponent()->GetSplineLength() + KINDA_SMALL_NUMBER)\n\t{\n\t\tif (bPrintWarning)\n\t\t\tUE_LOG(LogSoSplineSys, Warning, TEXT(\"FSoSplinePoint IsValid check failed: Distance is out of range(%f outside of [0..%f]\"), Distance, Spline->GetSplineComponent()->GetSplineLength());\n\t\treturn false;\n\t}\n\n\treturn true;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSoSplinePoint::Invalidate()\n{\n\tSpline = nullptr;\n\tDistance = 0.0f;\n\tReferenceZ = 0.0f;\n\tReferenceActor = nullptr;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nfloat FSoSplinePoint::GetActiveSplineLength() const\n{\n\tif (!Spline)\n\t\treturn 0.f;\n\treturn Spline->GetSplineComponent()->GetSplineLength();\n}\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFSoSplinePoint FSoSplinePoint::GetEstimatedSplineLocation(const FVector WorldLocation, const float MaxDistance) const\n{\n\tFSoSplinePoint A = *this;\n\tFSoSplinePoint B = *this + MaxDistance;\n\tfloat ActualDistance = MaxDistance;\n\n\tfor (int i = 0; i < 7; ++i)\n\t{\n\t\tActualDistance /= 2.0f;\n\n\t\tif ((FVector(A) - WorldLocation).SizeSquared2D() > (FVector(B) - WorldLocation).SizeSquared2D())\n\t\t\tA = A + ActualDistance;\n\t\telse\n\t\t\tB = A + ActualDistance;\n\t}\n\treturn A + ActualDistance / 2.0f;\n}\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFVector FSoSplinePoint::GetDirectionFromVector(const FVector V) const\n{\n\treturn FVector(FVector2D(GetDirection()), 0).GetSafeNormal() * GetDirectionModifierFromVector(V);\n}\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nint32 FSoSplinePoint::GetDirectionModifierFromVector(const FVector V) const\n{\n\tconst FVector2D Dir = FVector2D(GetDirection()).GetSafeNormal();\n\tconst FVector2D V2D = FVector2D(V).GetSafeNormal();\n\treturn ((Dir | V2D) < 0) ? -1 : 1;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nfloat FSoSplinePoint::GetReferenceZ() const\n{\n\treturn ReferenceActor == nullptr ? ReferenceZ : ReferenceActor->GetActorLocation().Z;\n}\n\n"
  },
  {
    "path": "Source/SOrb/SplineLogic/SoSplinePoint.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#pragma once\n#include \"CoreMinimal.h\"\n\n#include \"SoSplinePoint.generated.h\"\n\nclass ASoSpline;\nclass USplineComponent;\n\nDECLARE_LOG_CATEGORY_EXTERN(LogSoSplineSys, Log, All);\n\n/**\n* A SplinePoint is a {point, direction} pair\n* the point is identified by a Spline and a Distance value\n* IMPORTANT UPDATE: the struct has a reference actor member variable\n* the owner has to make sure that it is set and reserved correctly\n* check ReferenceActor for more information\n*/\nUSTRUCT(BlueprintType)\nstruct FSoSplinePoint\n{\n\tGENERATED_USTRUCT_BODY()\npublic:\n\n\tFSoSplinePoint();\n\tFSoSplinePoint(ASoSpline* InSpline, float InDistance = 0.f);\n\tFSoSplinePoint(const FSoSplinePoint& TheOther);\n\n\tFSoSplinePoint operator+(float DeltaDistance) const;\n\tFSoSplinePoint operator-(float DeltaDistance) const { return *this + (-DeltaDistance); }\n\n\tFSoSplinePoint GetScaledSplinePoint(const float ScaleFactor) const { return FSoSplinePoint(Spline, Distance * ScaleFactor); }\n\n\tvoid ClampSplineData();\n\n\tvoid SetReferenceActor(AActor* Actor) { ReferenceActor = Actor; }\n\tvoid SetReferenceZ(float Z) { ReferenceZ = Z; }\n\n\tfloat GetReferenceZ() const;\n\n\tvoid operator=(const FSoSplinePoint& OtherPoint);\n\n\t// sets distance and spline based on other, but the reference actor is kept\n\tvoid CopySplineLocation(const FSoSplinePoint& OtherPoint);\n\n\t/**\n\t* Distance between two SplinePoints along the spline\n\t* The sign indicates the direction we have to go from the given spline point B to reach A if (A-B)\n\t* Same as GetDistanceFromSplinePoint()\n\t*/\n\tfloat operator-(const FSoSplinePoint& OtherPoint) const;\n\n\t// (A-B) implementation, because there was a time when the two function was different, and now I am too lazy to remove one of them\n\t// if it isn't in MaxAcceptedDistance, return value is inf(BIG_NUMBER)\n\t// The sign indicates the direction we have to go from the given spline point B to reach A if (A - B)\n\tfloat GetDistanceFromSplinePoint(const FSoSplinePoint& OtherPoint, float MaxAcceptedDistance = BIG_NUMBER) const;\n\n\tfloat GetDistanceFromSplinePointWithZSquered(const FSoSplinePoint& OtherPoint, float MaxAcceptedDistance = BIG_NUMBER) const;\n\n\n\t/**\n\t* Translates the point with an offset\n\t* the offset has to be small enough, it can not cause more than one spline switch\n\t* IMPORTANT: DeltaDistance will be \"projected\" to xy plane\n\t*/\n\tvoid operator+=(float DeltaDistance);\n\n\t/**\n\t* Translates the point with an offset\n\t* the offset has to be small enough, it can not cause more than one spline switch\n\t* if the end of the spline reached bOutSplineEnd is set to true, and OutRestDistance is set to the not applied part of the distance\n\t*/\n\tvoid ProjectAndAddToDistance(float DeltaDistance, bool& bOutSplineEnd, float& OutRestDistanceTime);\n\tvoid AddToDistance(const float Offset, bool& bOutSplineEnd, float& OutRestDistanceTime);\n\n\tvoid SetDistanceFromWorldLocation(const FVector& WorldLocation);\n\n\tvoid SetDistance(float InDistance);\n\tvoid SetDistanceFromInputKey(float InputKey);\n\tvoid SetSpline(ASoSpline* Spline);\n\tASoSpline* GetSpline() { return Spline; }\n\tconst ASoSpline* GetSpline() const { return Spline; }\n\n\toperator FVector() const;\n\toperator FVector2D() const;\n\t// has nothing to do with the point's direction, it just returns the rotation of the Spline at the distance defined by *this\n\toperator FRotator() const;\n\n\tFVector GetWorldLocation(float ZValue) const;\n\n\tFVector2D ToVector2D() const;\n\tFVector ToVector(float ZValue) const;\n\n\tfloat GetDistance() const { return Distance; }\n\t\n\tbool IsValid(bool bPrintWarning = true) const;\n\tfloat GetActiveSplineLength() const;\n\t\n\t/** Sets the spline to nullptr and resets all other values as well */\n\tvoid Invalidate();\n\n\t// normal of the tangential plane in the actual spline location\n\tFVector GetPlaneNormal() const;\n\n\tFVector GetDirection() const;\n\t// spline direction vector at point, maybe multiplied by -1 (to have the same orientation as V)\n\tFVector GetDirectionFromVector(const FVector V) const;\n\t// angle(Direction,V) < 180 ? 1 : -1\n\tint32 GetDirectionModifierFromVector(const FVector V) const;\n\n\t// search for closest spline point, starting from *this\n\t// sign(MaxDistance) determines the search direction\n\tFSoSplinePoint GetEstimatedSplineLocation(const FVector WorldLocation, const float MaxDistance) const;\n\nprotected:\n\n\t// distance from the startpoint of the spline the point located at\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite)\n\tfloat Distance = 0.f;\n\n\t// the spline the point is located at\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite)\n\tASoSpline* Spline = nullptr;\n\n\t// used to get a z location which helps to decide which neighbor spline comes next\n\t// maybe it would be nicer passing the z value as a parameter to the AddDistance() functions, but...\n\t// since operator+ and operator+= is already used all over the code...\n\tUPROPERTY()\n\tAActor* ReferenceActor = nullptr;\n\n\t/** used instead of ReferenceActor if the SplinePoint is not attached to an actor; value is never copied between spline points*/\n\tfloat ReferenceZ = 0.f;\n};\n"
  },
  {
    "path": "Source/SOrb/SplineLogic/SoSplinePointPtr.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#include \"SoSplinePointPtr.h\"\n#include \"Components/SplineComponent.h\"\n#include \"SoSpline.h\"\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFSoSplinePointPtr::FSoSplinePointPtr()\n{\n\tDistanceAlongSpline = 0.0f;\n\tSplinePtr = TAssetPtr<ASoSpline>(nullptr);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFSoSplinePointPtr::FSoSplinePointPtr(const FSoSplinePoint& SplinePoint)\n{\n\tDistanceAlongSpline = SplinePoint.GetDistance();\n\tSplinePtr = TAssetPtr<ASoSpline>(SplinePoint.GetSpline());\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFSoSplinePoint FSoSplinePointPtr::Extract() const\n{\n\treturn FSoSplinePoint(SplinePtr.Get(), DistanceAlongSpline);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSoSplinePointPtr::SetDistanceAlongSpline(float Distance)\n{\n\tconst ASoSpline* Spline = SplinePtr.Get();\n\tif (Spline != nullptr)\n\t\tDistanceAlongSpline = FMath::Clamp(Distance, 0.0f, Spline->GetSplineComponent()->GetSplineLength());\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool FSoSplinePointPtr::IsValid() const\n{\n\treturn SplinePtr.IsValid();\n}\n"
  },
  {
    "path": "Source/SOrb/SplineLogic/SoSplinePointPtr.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#pragma once\n\n#include \"SoSplinePoint.h\"\n#include \"SoSplinePointPtr.generated.h\"\n\n\n/**\n *  Safe way to store a spline location from another level\n *  All the splines are in the persistent level, this struct\n *  is mostly used to store init spline locations in editor\n */\nUSTRUCT(BlueprintType)\nstruct FSoSplinePointPtr\n{\n\tGENERATED_USTRUCT_BODY()\npublic:\n\n\tFSoSplinePointPtr();\n\n\tFSoSplinePointPtr(const FSoSplinePoint& SplinePoint);\n\n\t// Extract the Splin point from the Spline pointer\n\tFSoSplinePoint Extract() const;\n\n\tvoid SetDistanceAlongSpline(float Distance);\n\tfloat GetDistanceAlongSpline() const { return DistanceAlongSpline; }\n\n\t// Is The Spline pointer valid?\n\tbool IsValid() const;\nprotected:\n\tUPROPERTY(EditAnywhere)\n\tfloat DistanceAlongSpline = 0.f;\n\n\t/** safe spline reference, works between different levels */\n\tUPROPERTY(EditAnywhere)\n\tTAssetPtr<ASoSpline> SplinePtr;\n};\n"
  },
  {
    "path": "Source/SOrb/SplineLogic/SoSplineWalker.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#include \"SoSplineWalker.h\"\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUSoSplineWalker::USoSplineWalker(const FObjectInitializer& PCIP)\n\t: Super(PCIP)\n{\n\n}\n"
  },
  {
    "path": "Source/SOrb/SplineLogic/SoSplineWalker.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#pragma once\n#include \"UObject/Interface.h\"\n#include \"SplineLogic/SoSplinePoint.h\"\n#include \"SoSplineWalker.generated.h\"\n\n/**\n*\n*/\nUINTERFACE(BlueprintType, Blueprintable)\nclass SORB_API USoSplineWalker : public UInterface\n{\n\tGENERATED_UINTERFACE_BODY()\n\n};\n\n/**\n*  Interface for everything moving on the spline system\n*  both C++ and Blueprint classes can implement and use the interface\n*/\nclass SORB_API ISoSplineWalker\n{\n\tGENERATED_IINTERFACE_BODY()\n\n\tUFUNCTION(BlueprintNativeEvent, BlueprintCallable, Category = SplineMovement)\n\tFSoSplinePoint GetSplineLocationI() const;\n\n\t// does not modify actor location, only the registered spline location\n\tUFUNCTION(BlueprintNativeEvent, BlueprintCallable, Category = SplineMovement)\n\tvoid SetSplineLocation(const FSoSplinePoint& SplinePoint, bool bUpdateOrientation);\n\n\t// called after a kinematic process modified the location of the actor\n\tUFUNCTION(BlueprintNativeEvent, BlueprintCallable, Category = SplineMovement)\n\tvoid OnPushed(const FVector& DeltaMovement, float DeltaSeconds, bool bStuck, AActor* RematerializeLocation, int32 DamageAmountIfStuck, bool bForceDamage);\n};\n"
  },
  {
    "path": "Source/SOrb/UI/General/Buttons/SoUIButton.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#include \"SoUIButton.h\"\n#include \"Components/TextBlock.h\"\n#include \"Components/Image.h\"\n\nUSoUIButton::USoUIButton(const FObjectInitializer& ObjectInitializer) : Super(ObjectInitializer)\n{\n\tbIsActive = true;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIButton::SynchronizeProperties()\n{\n\tSuper::SynchronizeProperties();\n\tUpdateAll();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIButton::SetButtonText(FText InText)\n{\n\tif (ElementText)\n\t\tElementText->SetText(InText);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFText USoUIButton::GetButtonText() const\n{\n\treturn ElementText->Text;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIButton::SetTextAlignment(TEnumAsByte<ETextJustify::Type> TextAlignment)\n{\n\tElementText->SetJustification(TextAlignment);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIButton::UpdateBackgroundImage()\n{\n\tif (!BackgroundImage)\n\t\treturn;\n\n\tif (OverrideBackgroundImage)\n\t\tBackgroundImage->SetBrushFromTexture(OverrideBackgroundImage, bOverrideBackgroundImageMatchSize);\n\n\tBackgroundImage->SetVisibility(bShowBackgroundImage ? ESlateVisibility::Visible : ESlateVisibility::Collapsed);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIButton::UpdateText()\n{\n\tif (!ElementText)\n\t\treturn;\n\n\tif (!OverrideText.IsEmpty())\n\t\tElementText->SetText(OverrideText);\n\n\tElementText->SetVisibility(bShowText ? ESlateVisibility::Visible : ESlateVisibility::Collapsed);\n}\n"
  },
  {
    "path": "Source/SOrb/UI/General/Buttons/SoUIButton.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#pragma once\n\n#include \"CoreMinimal.h\"\n#include \"Framework/Text/TextLayout.h\"\n\n#include \"UI/General/SoUIUserWidget.h\"\n\n#include \"SoUIButton.generated.h\"\n\nclass UTexture2D;\nclass UImage;\nclass UTextBlock;\n\n/**\n *  Primitive UI element, usually all it has is a text and a background image/color\n *  Can have 2x2 different states, mostly used in SoUIButtonArray\n */\nUCLASS()\nclass SORB_API USoUIButton : public USoUIUserWidget\n{\n\tGENERATED_BODY()\n\npublic:\n\tUSoUIButton(const FObjectInitializer& ObjectInitializer);\n\n\t//\n\t// UUserWidget Interface\n\t//\n\tvoid SynchronizeProperties() override;\n\n\t//\n\t// Own methods\n\t//\n\n\tUFUNCTION(BlueprintCallable, Category = Data)\n\tvoid SetButtonText(FText Text);\n\n\tUFUNCTION(BlueprintCallable, Category = Data)\n\tFText GetButtonText() const;\n\n\tUFUNCTION(BlueprintCallable, Category = Data)\n\tvirtual void SetOverrideBackgroundImage(UTexture2D* NewImage, bool bInMatchSize = false)\n\t{\n\t\tOverrideBackgroundImage = NewImage;\n\t\tbOverrideBackgroundImageMatchSize = bInMatchSize;\n\t\tUpdateBackgroundImage();\n\t}\n\n\t//\n\t// Setters\n\t//\n\n\tThisClass* SetShowText(bool bValue)\n\t{\n\t\tbShowText = bValue;\n\t\treturn this;\n\t}\n\tThisClass* SetShowBackgroundImage(bool bValue)\n\t{\n\t\tbShowBackgroundImage = bValue;\n\t\treturn this;\n\t}\n\n\tvoid SetTextAlignment(TEnumAsByte<ETextJustify::Type> TextAlignment);\n\n\tvirtual void UpdateAll()\n\t{\n\t\tUpdateBackgroundImage();\n\t\tUpdateText();\n\t\tInvalidateLayoutAndVolatility();\n\t}\n\tvirtual void UpdateBackgroundImage();\n\tvirtual void UpdateText();\n\nprotected:\n\t// If this is set it will use this instead of the default one used for the background image in editor\n\tUPROPERTY(EditAnywhere, BlueprintReadOnly, Category = \">Override\")\n\tUTexture2D* OverrideBackgroundImage = nullptr;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadOnly, Category = \">Override\")\n\tbool bOverrideBackgroundImageMatchSize = false;\n\n\t// Override the ElementText\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = \">Override\")\n\tFText OverrideText;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = \">Visiblity\")\n\tbool bShowBackgroundImage = true;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = \">Visiblity\")\n\tbool bShowText = true;\n\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\", meta = (BindWidget))\n\tUTextBlock* ElementText = nullptr;\n\n\t// If any\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\", meta = (BindWidget))\n\tUImage* BackgroundImage = nullptr;\n};\n"
  },
  {
    "path": "Source/SOrb/UI/General/Buttons/SoUIButtonArray.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#include \"SoUIButtonArray.h\"\n#include \"SoUIButton.h\"\n\n#include \"Basic/Helpers/SoMathHelper.h\"\n#include \"../SoUIUserWidget.h\"\n#include \"Basic/SoAudioManager.h\"\n#include \"Components/HorizontalBox.h\"\n#include \"Character/SoCharacter.h\"\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUSoUIButtonArray::USoUIButtonArray(const FObjectInitializer& ObjectInitializer) : Super(ObjectInitializer)\n{\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIButtonArray::SynchronizeProperties()\n{\n\tSuper::SynchronizeProperties();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIButtonArray::NativeTick(const FGeometry& MyGeometry, float InDeltaTime)\n{\n\tSuper::NativeTick(MyGeometry, InDeltaTime);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIButtonArray::NativeConstruct()\n{\n\tSuper::NativeConstruct();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIButtonArray::CreateButtons(const TArray<FText>& ElementTexts, bool bIgnoreEmptyTexts)\n{\n\tEmptyContainerChildren(true);\n\n\t// Create the Children\n\tfor (int32 Index = 0; Index < ElementTexts.Num(); Index++)\n\t{\n\t\tif (bIgnoreEmptyTexts && ElementTexts[Index].IsEmpty())\n\t\t\tcontinue;\n\n\t\tUSoUIButton* Button = CreateWidget<USoUIButton>(GetWorld(), ChildWidgetClass);\n\t\tif (Button != nullptr)\n\t\t{\n\t\t\tButton->SetButtonText(ElementTexts[Index]);\n\t\t\tAddContainerButton(Button);\n\t\t}\n\t}\n\n\tUpdateAllOverrides();\n\tSetSelectedIndex(0); // Reset\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIButtonArray::SetButtons(const TArray<USoUIButton*>& InButtons)\n{\n\tEmptyContainerChildren(true);\n\tfor (USoUIButton* Button : InButtons)\n\t\tAddContainerButton(Button);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIButtonArray::SetButtonsTexts(const TArray<FText>& ButtonTexts)\n{\n\tfor (int32 Index = 0; Index < NumContainerChildren(); ++Index)\n\t{\n\t\tUSoUIButton* Button = GetContainerButtonAt(Index);\n\t\tif (!Button)\n\t\t\tcontinue;\n\n\t\tif (ButtonTexts.IsValidIndex(Index))\n\t\t{\n\t\t\tButton->Show();\n\t\t\tButton->SetButtonText(ButtonTexts[Index]);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tButton->Hide();\n\t\t}\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIButtonArray::AddContainerButton(USoUIButton* Button)\n{\n\tSuper::AddContainerChild(Button);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIButtonArray::AddContainerButtonWithText(USoUIButton* Button, FText Text)\n{\n\tif (Button)\n\t\tButton->SetButtonText(Text);\n\n\tAddContainerButton(Button);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIButtonArray::RemoveContainerButton(USoUIButton* Button)\n{\n\tSuper::RemoveContainerChild(Button);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUSoUIButton* USoUIButtonArray::GetContainerButtonAt(int32 ButtonIndex) const\n{\n\treturn Cast<USoUIButton>(GetContainerChildAt(ButtonIndex));\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoUIButtonArray::SetButtonText(int32 ButtonIndex, const FText& Text)\n{\n\tUSoUIButton* Button = GetContainerButtonAt(ButtonIndex);\n\tif (!Button)\n\t\treturn false;\n\n\tButton->SetButtonText(Text);\n\treturn true;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFText USoUIButtonArray::GetButtonText(int32 ButtonIndex)\n{\n\tUSoUIButton* Button = GetContainerButtonAt(ButtonIndex);\n\tif (!Button)\n\t\treturn FText::GetEmpty();\n\n\treturn Button->GetButtonText();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIButtonArray::UpdateWidgetOverrides(UUserWidget* Widget, int32 ChildIndex)\n{\n\tSuper::UpdateWidgetOverrides(Widget, ChildIndex);\n\n\t// Handle button bellow\n\tUSoUIButton* Button = Cast<USoUIButton>(Widget);\n\tif (!Button)\n\t\treturn;\n\n\t// Cycle through images\n\tif (OverrideButtonImages.Num() > 0)\n\t\tif (UTexture2D * OverrideImage = OverrideButtonImages[USoMathHelper::WrapIndexAround(ChildIndex, OverrideButtonImages.Num())])\n\t\t\tButton->SetOverrideBackgroundImage(OverrideImage, false);\n\n\tif (bOverrideButtonsVisibility)\n\t\tButton->SetShowText(bShowButtonsText)\n\t\t\t  ->SetShowBackgroundImage(bShowButtonsBackgroundImage);\n\n\tif (bOverrideTextAlignment)\n\t\tButton->SetTextAlignment(TextAlignmentOverride);\n\n\tButton->UpdateAll();\n}\n"
  },
  {
    "path": "Source/SOrb/UI/General/Buttons/SoUIButtonArray.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#pragma once\n\n#include \"CoreMinimal.h\"\n#include \"UObject/ObjectMacros.h\"\n#include \"../SoUIUserWidgetArray.h\"\n\n#include \"SoUIButtonArray.generated.h\"\n\nclass USoUIButton;\nclass UFMODEvent;\nclass USoUIUserWidget;\nclass ASoCharacter;\n\n/**\n *  Container class containing an array of SoUIButton\n *  the layout can be ordered horizontally or vertically\n *  it supports selecting/highlighting the buttons, navigation for the active button, etc.\n */\nUCLASS(HideCategories = (Navigation), AutoCollapseCategories = (Performance, Clipping, Interaction, Input))\nclass SORB_API USoUIButtonArray : public USoUIUserWidgetArray\n{\n\tGENERATED_BODY()\n\npublic:\n\tUSoUIButtonArray(const FObjectInitializer& ObjectInitializer);\n\n\t//\n\t// UUserWidget Interface\n\t//\n\tvoid SynchronizeProperties() override;\n\tvoid NativeTick(const FGeometry& MyGeometry, float InDeltaTime);\n\tvoid NativeConstruct() override;\n\n\t//\n\t// Own methods\n\t//\n\n\t/**\n\t * ButtonClass has to be set before the function is executed\n\t * All old children are removed from the container.\n\t * Creates new children with the provided texts.\n\t */\n\tUFUNCTION(BlueprintCallable, Category = Initialization)\n\tvirtual void CreateButtons(const TArray<FText>& ElementTexts, bool bIgnoreEmptyTexts = false);\n\n\t/** Alternative way to initialize the children via setting the array directly, can be used e.g. from child BP */\n\tUFUNCTION(BlueprintCallable, Category = Initialization)\n\tvoid SetButtons(const TArray<USoUIButton*>& InButtons);\n\n\t/**\n\t *  (Re)initializes the children texts. Does not modify the state of the Buttons\n\t *  ElementTexts.Num does not have to match with Children.Num\n\t *  (Out of index texts are ignored, buttons does not necessary have to have text)\n\t */\n\tUFUNCTION(BlueprintCallable, Category = Initialization)\n\tvoid SetButtonsTexts(const TArray<FText>& ButtonTexts);\n\n\t/** Sets the Text on the Button located at ButtonIndex  */\n\tbool SetButtonText(int32 ButtonIndex, const FText& Text);\n\tFText GetButtonText(int32 ButtonIndex);\n\n\t// Get the button from ButtonChildren\n\tUFUNCTION(BlueprintPure, Category = Data)\n\tvirtual USoUIButton* GetContainerButtonAt(int32 ButtonIndex) const;\n\n\tvirtual void AddContainerButton(USoUIButton* Button);\n\tvirtual void AddContainerButtonWithText(USoUIButton* Button, FText Text);\n\tvirtual void RemoveContainerButton(USoUIButton* Button);\n\nprotected:\n\tvoid UpdateWidgetOverrides(UUserWidget* Widget, int32 ChildIndex) override;\n\nprotected:\n\n\t//\n\t// Override\n\t//\n\n\t// If these textures are set it will use them in a cyclic fashion when adding new buttons.\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = \">Override Images\")\n\tTArray<UTexture2D*> OverrideButtonImages;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = \">Override Visibility\")\n\tbool bOverrideButtonsVisibility = true;\n\n\t// Used only if bOverrideButtonsVisibility is true\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = \">Override Visibility\")\n\tbool bShowButtonsBackgroundImage = true;\n\n\t// Used only if bOverrideButtonsVisibility is true\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = \">Override Visibility\")\n\tbool bShowButtonsText = true;\n\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = \">Override Visibility\")\n\tbool bOverrideTextAlignment = false;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = \">Override Visibility\")\n\tTEnumAsByte<ETextJustify::Type> TextAlignmentOverride;\n};\n"
  },
  {
    "path": "Source/SOrb/UI/General/Buttons/SoUIButtonImage.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#include \"SoUIButtonImage.h\"\n#include \"Components/TextBlock.h\"\n#include \"Components/Image.h\"\n#include \"Engine/Texture2D.h\"\n#include \"UI/General/Commands/SoUICommandImage.h\"\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIButtonImage::SynchronizeProperties()\n{\n\tSuper::SynchronizeProperties();\n\n\tif (Image)\n\t{\n\t\tif (USoUICommandImage::IsValidOverrideWidthAndHeight(ImageOverrideWidthAndHeight))\n\t\t\tImage->SetOverrideWidthAndHeight(ImageOverrideWidthAndHeight);\n\n\t\tif (PreviewImage)\n\t\t\tImage->SetPreviewImage(PreviewImage);\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIButtonImage::SetOverrideBackgroundImage(UTexture2D* NewImage, bool bInMatchSize)\n{\n\tSuper::SetOverrideBackgroundImage(NewImage, bInMatchSize);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIButtonImage::SetUICommand(ESoUICommand InCommand, bool bUpdateDeviceType)\n{\n\tif (Image)\n\t\tImage->SetUICommand(InCommand, bUpdateDeviceType);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIButtonImage::SetUICommandPriorities(const FSoInputUICommandPriorities& Priorities, bool bUpdateImage)\n{\n\tif (Image)\n\t\tImage->SetUICommandPriorities(Priorities, bUpdateImage);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIButtonImage::SetActionNameType(ESoInputActionNameType InType, bool bUpdateDeviceType)\n{\n\tif (Image)\n\t\tImage->SetActionNameType(InType, bUpdateDeviceType);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIButtonImage::SetImageFromTexture(UTexture2D* NewTexture, bool bInMatchSize)\n{\n\tif (Image)\n\t\tImage->EnableStaticTextureMode(NewTexture, bInMatchSize);\n\n\tEnableImageMode();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIButtonImage::UpdateImageMode()\n{\n\tif (ElementText)\n\t\tElementText->SetVisibility(bImageMode ? ESlateVisibility::Collapsed : ESlateVisibility::Visible);\n\tif (BackgroundImage)\n\t\tBackgroundImage->SetVisibility(bImageMode ? ESlateVisibility::Collapsed : ESlateVisibility::Visible);\n\n\tif (Image)\n\t\tImage->SetVisibility(bImageMode ? ESlateVisibility::Visible : ESlateVisibility::Collapsed);\n}\n"
  },
  {
    "path": "Source/SOrb/UI/General/Buttons/SoUIButtonImage.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#pragma once\n\n#include \"CoreMinimal.h\"\n#include \"SoUIButton.h\"\n#include \"Settings/Input/SoInputSettingsTypes.h\"\n\n#include \"SoUIButtonImage.generated.h\"\n\nenum class ESoInputActionNameType : uint8;\nclass UTextBlock;\nclass UTexture2D;\nclass USoUICommandImage;\n\n\n// USoUICommandImage + USoUIButton\n// Can be an Image that acts as a button\n// A Command tooltip that acts as a button, etc\nUCLASS()\nclass SORB_API USoUIButtonImage : public USoUIButton\n{\n\tGENERATED_BODY()\n\npublic:\n\t//\n\t// UUserWidget Interface\n\t//\n\tvoid SynchronizeProperties() override;\n\n\t//\n\t// USoUIButton interface\n\t//\n\tvoid SetOverrideBackgroundImage(UTexture2D* NewImage, bool bInMatchSize = false) override;\n\n\t//\n\t// Own methods\n\t//\n\n\n\tUFUNCTION(BlueprintCallable, Category = Image)\n\tvoid SetUICommand(ESoUICommand InCommand, bool bUpdateDeviceType = true);\n\n\tUFUNCTION(BlueprintCallable, Category = Image)\n\tvoid SetUICommandPriorities(const FSoInputUICommandPriorities& Priorities, bool bUpdateImage = true);\n\n\tUFUNCTION(BlueprintCallable, Category = Image)\n\tvoid SetActionNameType(ESoInputActionNameType InType, bool bUpdateDeviceType = true);\n\n\t// This also enables image mode and static texture mode on the image\n\tUFUNCTION(BlueprintCallable, Category = Image)\n\tvoid SetImageFromTexture(UTexture2D* NewTexture, bool bInMatchSize = false);\n\n\tUFUNCTION(BlueprintCallable, Category = Image)\n\tvoid EnableImageMode()\n\t{\n\t\tbImageMode = true;\n\t\tUpdateImageMode();\n\t}\n\n\tUFUNCTION(BlueprintCallable, Category = Image)\n\tvoid DisableImageMode()\n\t{\n\t\tbImageMode = false;\n\t\tUpdateImageMode();\n\t}\n\nprotected:\n\tvoid UpdateImageMode();\n\n\tUFUNCTION(BlueprintImplementableEvent, BlueprintCallable, BlueprintCosmetic, Category = \">Events\")\n\tvoid UpdateAnimation(bool bShouldBeAnimated);\n\nprotected:\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\", meta = (BindWidget))\n\tUSoUICommandImage* Image = nullptr;\n\n\n\t// If this is a positive number it uses this as the image size instead of the default ones from USoGameSingleton::GetDefaultWidthAndHeightForUIIcons\n\t// X - Width\n\t// Y - Height\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere, Category = \">Image\")\n\tFVector2D ImageOverrideWidthAndHeight = FVector2D::ZeroVector;\n\n\t// Only used for previews\n\tUPROPERTY(EditAnywhere, Category = \">Override\")\n\tUTexture2D* PreviewImage = nullptr;\n\n\t// Enable/Disable Image\n\tUPROPERTY(BlueprintReadOnly, Category = \">Image\")\n\tbool bImageMode = true;\n};\n"
  },
  {
    "path": "Source/SOrb/UI/General/Buttons/SoUIButtonImageArray.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#include \"SoUIButtonImageArray.h\"\n\n#include \"Components/Image.h\"\n#include \"Components/PanelWidget.h\"\n\n#include \"SoUIButton.h\"\n#include \"UI/General/SoUITypes.h\"\n#include \"SoUIButtonImage.h\"\n#include \"Basic/SoAudioManager.h\"\n\nDEFINE_LOG_CATEGORY_STATIC(LogSoUIButtonImageArray, All, All)\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUSoUIButtonImageArray::USoUIButtonImageArray(const FObjectInitializer& ObjectInitializer) : Super(ObjectInitializer)\n{\n\tbVerticalLayout = false;\n\tbExtraAttachedVerticalLayout = false;\n\tbCyclicNavigation = true;\n\tbSkipDeactivatedChildren = true;\n\tChildWidgetClass = USoUIButtonImage::StaticClass();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIButtonImageArray::SynchronizeProperties()\n{\n\tSuper::SynchronizeProperties();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIButtonImageArray::NativeConstruct()\n{\n\tSuper::NativeConstruct();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUSoUIButtonImage* USoUIButtonImageArray::GetOrCreateButtonImage(bool bTryCache)\n{\n\t// TOOD use cache?\n\n\tif (*ChildWidgetClass == nullptr)\n\t{\n\t\tUE_LOG(LogSoUIButtonImageArray, Error, TEXT(\"Invalid ButtonClass for USoUIButtonImageArray\"));\n\t\treturn nullptr;\n\t}\n\tUWorld* World = GetWorld();\n\tif (World == nullptr)\n\t{\n\t\tUE_LOG(LogSoUIButtonImageArray, Error, TEXT(\"Invalid World for USoUIButtonImageArray\"));\n\t\treturn nullptr;\n\t}\n\tif (!ChildWidgetClass->IsChildOf(USoUIButtonImage::StaticClass()))\n\t{\n\t\tUE_LOG(LogSoUIButtonImageArray, Error, TEXT(\"ButtonClass does not derive from ButtonClass for USoUIButtonImageArray\"));\n\t\treturn nullptr;\n\t}\n\n\treturn CreateWidget<USoUIButtonImage>(World, ChildWidgetClass);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIButtonImageArray::UpdateEnsureOnlyTheseCommandsExist(const TArray<FSoUITextCommandPair> CommandsToBeDisplayed,  bool bAllowEmpty)\n{\n\tClearEditorPreviewButtons();\n\n\t// Should have used EmptyAllUIButtons\n\tif (!bAllowEmpty && CommandsToBeDisplayed.Num() == 0)\n\t\treturn;\n\n\t// TODO handle case where the order is not right\n\t// because we removed and added to many\n\n\t// deduplicate Commands\n\tTSet<ESoUICommand> CommandsToAdd;\n\tfor (auto& Elem : CommandsToBeDisplayed)\n\t\tCommandsToAdd.Add(Elem.Command);\n\n\t// Check if we have commands that are not in the set of approved values\n\tTSet<ESoUICommand> CommandsToRemove;\n\tfor (auto& Elem : CreatedCommandsMap)\n\t\tif (!CommandsToAdd.Contains(Elem.Key))\n\t\t\tCommandsToRemove.Add(Elem.Key);\n\n\t// Remove old commands first\n\tfor (ESoUICommand Command : CommandsToRemove)\n\t\tRemoveButtonForUICommand(Command);\n\n\t// Add new commands or update texts\n\tfor (const auto& Elem : CommandsToBeDisplayed)\n\t{\n\t\tconst ESoUICommand Command = Elem.Command;\n\t\tconst FText Text = Elem.Text;\n\n\t\tif (CreatedCommandsMap.Contains(Command))\n\t\t{\n\t\t\t// Modify only text\n\t\t\tSetButtonTextForUICommand(Text, Command);\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// Add new UI Command\n\t\t\tAddButtonForUICommand(Text, Command);\n\t\t}\n\t}\n\n\tif (IsEmpty())\n\t\tSetVisibility(ESlateVisibility::Collapsed);\n\telse\n\t\tSetVisibility(ESlateVisibility::Visible);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoUIButtonImageArray::SetButtonTextForUICommand(FText InText, ESoUICommand Command)\n{\n\t// Can't remove as it does not exist\n\tif (!CreatedCommandsMap.Contains(Command))\n\t\treturn false;\n\n\tconst int32 ButtonIndex = CreatedCommandsMap.FindChecked(Command);\n\tSetButtonText(ButtonIndex, InText);\n\treturn true;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIButtonImageArray::AddButtonForUICommand(FText InText, ESoUICommand Command)\n{\n\tClearEditorPreviewButtons();\n\n\t// Already contains the command\n\tif (CreatedCommandsMap.Contains(Command))\n\t\treturn;\n\n\tUSoUIButtonImage* ButtonImage = GetOrCreateButtonImage();\n\tif (!ButtonImage)\n\t\treturn;\n\n\tButtonImage->SetUICommand(Command);\n\tButtonImage->SetButtonText(InText);\n\tAddContainerButton(ButtonImage);\n\tCreatedCommandsMap.Add(Command, NumContainerChildren() - 1);\n\n\t// Force redraw\n\tInvalidateLayoutAndVolatility();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIButtonImageArray::RemoveButtonForUICommand(ESoUICommand Command)\n{\n\t// Can't remove as it does not exist\n\tif (!CreatedCommandsMap.Contains(Command))\n\t\treturn;\n\n\tconst int32 RemovedButtonIndex = CreatedCommandsMap.FindChecked(Command);\n\tRemoveContainerChildAt(RemovedButtonIndex);\n\n\tCreatedCommandsMap.Remove(Command);\n\t\n\t// Fix the indices by reducing the index\n\t// of the buttons after the removed button\n\tfor (auto& Elem : CreatedCommandsMap)\n\t\tif (Elem.Value > RemovedButtonIndex)\n\t\t\tElem.Value -= 1;\n\t\n\t// Force redraw\n\tInvalidateLayoutAndVolatility();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIButtonImageArray::EmptyAllUIButtons()\n{\n\tCreatedCommandsMap.Empty();\n\tif (Container && Container->GetChildrenCount() > 0)\n\t{\n\t\tContainer->ClearChildren();\n\t\tInvalidateLayoutAndVolatility();\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nESoUICommand USoUIButtonImageArray::GetButtonIndexCommand(int32 ButtonIndex) const\n{\n\tfor (const auto& Pair : CreatedCommandsMap)\n\t\tif (Pair.Value == ButtonIndex)\n\t\t\treturn Pair.Key;\n\n\treturn ESoUICommand::EUC_ReleasedMax;\n}"
  },
  {
    "path": "Source/SOrb/UI/General/Buttons/SoUIButtonImageArray.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#pragma once\n\n#include \"CoreMinimal.h\"\n#include \"SoUIButtonArray.h\"\n\n#include \"SoUIButtonImageArray.generated.h\"\n\nclass UImage;\nclass UTextBlock;\nclass USoUIButtonImage;\n\n\n\n\nUCLASS()\nclass SORB_API USoUIButtonImageArray : public USoUIButtonArray\n{\n\tGENERATED_BODY()\npublic:\n\tUSoUIButtonImageArray(const FObjectInitializer& ObjectInitializer);\n\n\t//\n\t// UUserWidget Interface\n\t//\n\tvoid SynchronizeProperties() override;\n\tvoid NativeConstruct() override;\n\n\n\t//\n\t// USoUIUserWidgetBaseNavigation interface\n\t//\n\tbool IsValidWidget() const override\n\t{\n\t\treturn Super::IsValidWidget() && CreatedCommandsMap.Num() > 0;\n\t}\n\t\n\t//\n\t// USoUIButtonArray interface\n\t//\n\tvoid EmptyContainerChildren(bool bContainer = false) override\n\t{\n\t\tSuper::EmptyContainerChildren(bContainer);\n\t\tCreatedCommandsMap.Empty();\n\t}\n\n\t//\n\t// Own methods\n\t//\n\n\tUFUNCTION(BlueprintCallable, Category = \">UI\")\n\tUSoUIButtonImage* GetOrCreateButtonImage(bool bTryCache = true);\n\n\t// This updates the tooltip array without making unnecessary modifications, it ensures the commands in the input map always exists\n\t// If there was none to display, we simply hide this widget\n\tUFUNCTION(BlueprintCallable, Category = \">UI\")\n\tvoid UpdateEnsureOnlyTheseCommandsExist(const TArray<FSoUITextCommandPair> CommandsToBeDisplayed, bool bAllowEmpty = false);\n\n\t// Button must already exist\n\tUFUNCTION(BlueprintCallable, Category = \">UI\")\n\tbool SetButtonTextForUICommand(FText InText, ESoUICommand Command);\n\n\tUFUNCTION(BlueprintCallable, Category = \">UI\")\n\tvoid AddButtonForUICommand(FText InText, ESoUICommand Command);\n\n\tUFUNCTION(BlueprintCallable, Category = \">UI\")\n\tvoid RemoveButtonForUICommand(ESoUICommand Command);\n\n\tUFUNCTION(BlueprintCallable, Category = \">UI\")\n\tvoid EmptyAllUIButtons();\n\n\tUFUNCTION(BlueprintCallable, Category = \">UI\")\n\tvoid HideIfEmpty()\n\t{\n\t\tif (IsEmpty())\n\t\t\tSetVisibility(ESlateVisibility::Collapsed);\n\t}\n\n\tUFUNCTION(BlueprintCallable, Category = \">UI\")\n\tvoid ClearEditorPreviewButtons()\n\t{\n\t\tif (CreatedCommandsMap.Num() > 0)\n\t\t\treturn;\n\n\t\tEmptyAllUIButtons();\n\t}\n\n\tUFUNCTION(BlueprintPure, Category = \">UI\")\n\tESoUICommand GetSelectedButtonCommand() const\n\t{\n\t\treturn GetButtonIndexCommand(GetSelectedIndex());\n\t}\n\n\tUFUNCTION(BlueprintPure, Category = \">UI\")\n\tESoUICommand GetButtonIndexCommand(int32 ButtonIndex) const;\n\t\nprotected:\n\t// keep track of button children created from what, so that we don't refresh this every time\n\t// Maps UICommand -> Index in ButtonChildren array\n\tUPROPERTY()\n\tTMap<ESoUICommand, int32> CreatedCommandsMap;\n};\n"
  },
  {
    "path": "Source/SOrb/UI/General/Buttons/SoUIScrollingButtonArray.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#include \"SoUIScrollingButtonArray.h\"\n\n#include \"Components/Image.h\"\n#include \"Components/PanelWidget.h\"\n\n#include \"SoUIButton.h\"\n#include \"UI/General/SoUITypes.h\"\n#include \"Basic/SoGameSingleton.h\"\n#include \"Basic/SoAudioManager.h\"\n#include \"Basic/Helpers/SoMathHelper.h\"\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUSoUIScrollingButtonArray::USoUIScrollingButtonArray(const FObjectInitializer& ObjectInitializer) : Super(ObjectInitializer)\n{\n\tbVerticalLayout = false;\n\tbExtraAttachedVerticalLayout = false;\n\tbCyclicNavigation = true;\n\tbSkipDeactivatedChildren = false;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIScrollingButtonArray::SynchronizeProperties()\n{\n\tbOverrideButtonsVisibility = false;\n\n\t// Call parent but don't set the parents default if we can\n\tconst bool bPreviousValue = bSFXSetDefault;\n\tbSFXSetDefault = false;\n\tSuper::SynchronizeProperties();\n\tbSFXSetDefault = bPreviousValue;\n\n\tif (bSFXSetDefault && SFXChildSelectionChanged == nullptr)\n\t\tSFXChildSelectionChanged = USoGameSingleton::GetSFX(ESoSFX::SettingsValueSwitch);\n\n\t// Should never happen?\n\tbSkipDeactivatedChildren = false;\n\tbVerticalLayout = false;\n\tbExtraAttachedVerticalLayout = false;\n\tbListenToChildHighlightRequest = false;\n\tbListenToChildPressedRequest = false;\n\n\t// Sync SFX to child buttons\n\tif (LeftArrowButton)\n\t{\n\t\tLeftArrowButton->SetHandleOwnMouseEvents(true);\n\t\tLeftArrowButton->SetSFXOnPressed(nullptr)\n\t\t\t\t\t   ->SetSFXHighlightChanged(SFXChildSelectionChanged);\n\t}\n\tif (RightArrowButton)\n\t{\n\t\tLeftArrowButton->SetHandleOwnMouseEvents(true);\n\t\tRightArrowButton->SetSFXOnPressed(nullptr)\n\t\t\t\t\t\t->SetSFXHighlightChanged(SFXChildSelectionChanged);\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIScrollingButtonArray::NativeConstruct()\n{\n\tSuper::NativeConstruct();\n\n\tif (LeftArrowButton)\n\t\tLeftArrowButton->OnPressedEvent().AddUObject(this, &ThisClass::OnPressedArrowLeft);\n\tif (RightArrowButton)\n\t\tRightArrowButton->OnPressedEvent().AddUObject(this, &ThisClass::OnPressedArrowRight);\n\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIScrollingButtonArray::NativeDestruct()\n{\n\tif (LeftArrowButton)\n\t\tLeftArrowButton->OnPressedEvent().RemoveAll(this);\n\tif (RightArrowButton)\n\t\tRightArrowButton->OnPressedEvent().RemoveAll(this);\n\n\tSuper::NativeDestruct();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIScrollingButtonArray::CreateButtons(const TArray<FText>& ElementTexts, bool bIgnoreEmptyTexts)\n{\n\t// NOTE: we need to have different children\n\tSuper::CreateButtons(ElementTexts, bIgnoreEmptyTexts);\n\n\t// Empty the container but keep the ContainerChildren\n\t// NOTE: Container (children) != ContainerChildren\n\tif (Container)\n\t{\n\t\tContainer->ClearChildren();\n\t\tContainer->AddChild(LeftArrowButton);\n\t\tContainer->AddChild(SelectedButton);\n\t\tContainer->AddChild(RightArrowButton);\n\n\t\tbListenToChildHighlightRequest = true;\n\t\tSubscribeToChildEvents(SelectedButton, 0);\n\t\tbListenToChildHighlightRequest = false;\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoUIScrollingButtonArray::Navigate(ESoUICommand Command, bool bPlaySound)\n{\n\tSuper::Navigate(Command, bPlaySound);\n\t//UpdateSelectedButton();\n\t//HighlightSelectedChild(false);\n\treturn true;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nint32 USoUIScrollingButtonArray::SelectFirstActiveChild(int32 StartFrom)\n{\n\tconst int32 Num = NumContainerChildren();\n\tif (Num == 0)\n\t\treturn INDEX_NONE;\n\n\tSetSelectedIndex(FMath::Clamp(StartFrom, 0, Num - 1));\n\treturn GetSelectedIndex();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIScrollingButtonArray::OnRequestChildHighlightChange(int32 ChildIndex, bool bHighlight)\n{\n\tUE_LOG(\n\t\tLogSoUI,\n\t\tVerbose,\n\t\tTEXT(\"[%s] USoUIScrollingButtonArray::OnRequestChildHighlightChange(ChildIndex = %d, bHighlight = %d)\"),\n\t\t*GetName(), ChildIndex,bHighlight\n\t);\n\n\t// Send back to a parent if any is listening\n\tif (bHandleOwnMouseEvents)\n\t\tSetIsHighlighted(bHighlight, bHighlight);\n\telse\n\t\tHighlightRequestChangeEvent.Broadcast(bHighlight);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoUIScrollingButtonArray::SetIsHighlighted(bool bInHighlighted, bool bPlaySound)\n{\n\t// Ignore bPlaySound\n\tif (bIsHighlighted != bInHighlighted)\n\t{\n\t\tbIsHighlighted = bInHighlighted;\n\t\tSelectedButton->SetIsHighlighted(bInHighlighted);\n\t\tLeftArrowButton->SetIsHighlighted(bInHighlighted);\n\t\tRightArrowButton->SetIsHighlighted(bInHighlighted);\n\t\tif (bPlaySound)\n\t\t\tUSoAudioManager::PlaySound2D(this, SFXChildSelectionChanged);\n\n\t\tOnHighlightChanged(bInHighlighted);\n\t\treturn true;\n\t}\n\n\treturn false;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIScrollingButtonArray::SetSelectedIndex(int32 ElementIndex, bool bPlaySound)\n{\n\tInternalSetSelectedIndex(ElementIndex);\n\tUpdateSelectedButton(bPlaySound);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIScrollingButtonArray::UpdateSelectedButton(bool bPlaySound)\n{\n\tif (!SelectedButton)\n\t\treturn;\n\n\tif (!IsValidIndex(SelectedIndex))\n\t{\n\t\tUnhighlightSelectedChild();\n\t\tSelectedButton->Deactivate();\n\t\tLeftArrowButton->Deactivate();\n\t\tRightArrowButton->Deactivate();\n\t\treturn;\n\t}\n\n\t// Can't cycle just disable left/right buttons if it is the case\n\tif (!bCyclicNavigation)\n\t{\n\t\t// Enable/Disable arrows\n\t\t// at least one element left on the left ;)\n\t\tconst bool bEnableLeftButton = SelectedIndex > 0;\n\t\tLeftArrowButton->SetIsActive(bEnableLeftButton);\n\t\tLeftArrowButton->SetIsEnabled(bEnableLeftButton);\n\n\t\t// at least one element left on the right\n\t\tconst bool bEnableRightButton = SelectedIndex < NumContainerChildren() - 1;\n\t\tRightArrowButton->SetIsActive(bEnableRightButton);\n\t\tRightArrowButton->SetIsEnabled(bEnableRightButton);\n\t}\n\n\tSelectedButton->Activate();\n\tSelectedButton->SetButtonText(GetButtonText(SelectedIndex));\n\n\tif (bPlaySound)\n\t\tUSoAudioManager::PlaySound2D(this, SFXChildSelectionChanged);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoUIScrollingButtonArray::IsChildActive(int32 ChildIndex) const\n{\n\treturn SelectedButton->IsActive();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoUIScrollingButtonArray::IsChildHighlighted(int32 ChildIndex) const\n{\n\treturn SelectedButton->IsHighlighted();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoUIScrollingButtonArray::IsChildEnabled(int32 ChildIndex) const\n{\n\treturn SelectedButton->GetIsEnabled();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIScrollingButtonArray::UpdateWidgetOverrides(UUserWidget* Widget, int32 ChildIndex)\n{\n\tUpdateOverrideCustomPadding(Widget);\n\tUpdateOverridesSFX(Widget);\n\n\t// Handle only the Selected Button\n\tUSoUIButton* Button = Cast<USoUIButton>(Widget);\n\tif (Button != SelectedButton)\n\t\treturn;\n\n\t// Cycle through images\n\tif (OverrideButtonImages.Num() > 0)\n\t\tif (UTexture2D * OverrideImage = OverrideButtonImages[USoMathHelper::WrapIndexAround(ChildIndex, OverrideButtonImages.Num())])\n\t\t\tButton->SetOverrideBackgroundImage(OverrideImage, false);\n\n\n\tif (bOverrideButtonsVisibility)\n\t\tButton->SetShowText(bShowButtonsText)\n\t\t\t  ->SetShowBackgroundImage(bShowButtonsBackgroundImage);\n\n\tButton->UpdateAll();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIScrollingButtonArray::OnPressedArrowLeft()\n{\n\tNavigate(ESoUICommand::EUC_Left, true);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIScrollingButtonArray::OnPressedArrowRight()\n{\n\tNavigate(ESoUICommand::EUC_Right, true);\n}\n"
  },
  {
    "path": "Source/SOrb/UI/General/Buttons/SoUIScrollingButtonArray.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#pragma once\n\n#include \"CoreMinimal.h\"\n#include \"SoUIButtonArray.h\"\n\n#include \"SoUIScrollingButtonArray.generated.h\"\n\nclass UImage;\nclass UTextBlock;\n\n/**\n * Like the normal Button array only of this layout\n * |<| |Button text| |>|\n * The active element is the current selected one\n */\nUCLASS()\nclass SORB_API USoUIScrollingButtonArray : public USoUIButtonArray\n{\n\tGENERATED_BODY()\npublic:\n\tUSoUIScrollingButtonArray(const FObjectInitializer& ObjectInitializer);\n\n\t//\n\t// UUserWidget Interface\n\t//\n\tvoid SynchronizeProperties() override;\n\tvoid NativeConstruct() override;\n\tvoid NativeDestruct() override;\n\n\t//\n\t// USoUIButtonArray Interface\n\t//\n\tvoid CreateButtons(const TArray<FText>& ElementTexts, bool bIgnoreEmptyTexts = false) override;\n\tbool Navigate(ESoUICommand Command, bool bPlaySound = true) override;\n\tvoid SetSelectedIndex(int32 ElementIndex, bool bPlaySound = false) override;\n\n\tbool SetIsHighlightedOnChildAt(int32 ChildIndex, bool bInHighlighted, bool bPlaySound = false) override\n\t{\n\t\treturn SetIsHighlighted(bInHighlighted, bPlaySound);\n\t}\n\tbool SetIsHighlighted(bool bInHighlighted, bool bPlaySound = false) override;\n\tvoid SetIsHighlightedOnAllChildren(bool bInHighlighted) override\n\t{\n\t\tSetSelectedChildIsHighlighted(bInHighlighted);\n\t}\n\tvoid OnRequestChildHighlightChange(int32 ChildIndex, bool bHighlight) override;\n\n\tbool SelectFirstValidChild(bool bPlaySound = false) override { return false; }\n\tint32 SelectFirstActiveChild(int32 StartFrom = 0) override;\n\n\t/** Active/Inactive state is not used on buttons in ScrollingButtonArray, only Highlighted/Not highlighted */\n\tbool IsChildActive(int32 ChildIndex) const override;\n\tbool IsChildHighlighted(int32 ChildIndex) const override;\n\tbool IsChildEnabled(int32 ChildIndex) const override;\n\n\tbool SetIsActiveOnChildAt(int32 ChildIndex, bool bActive, bool bPlaySound = false) override { return true; }\n\tbool SetIsEnabledOnChildAt(int32 ChildIndex, bool bEnabled) override { return true; }\n\tvoid SetIsActiveOnAllChildren(bool bActive) override {}\n\nprotected:\n\t//\n\t// USoUIButtonArray Interface\n\t//\n\tvoid UpdateWidgetOverrides(UUserWidget* Widget, int32 ChildIndex) override;\n\n\t//\n\t// Own Methods\n\t//\n\n\t// Updates the SelectedButton with the state from the Children[SelectedIndex]\n\tvoid UpdateSelectedButton(bool bPlaySound);\n\n\tUFUNCTION()\n\tvoid OnPressedArrowLeft();\n\tUFUNCTION()\n\tvoid OnPressedArrowRight();\n\nprotected:\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\", meta = (BindWidget))\n\tUSoUIButton* LeftArrowButton = nullptr;\n\n\t// The Selected button, kept in sync with the text from Children[SelectedIndex]\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\", meta = (BindWidget))\n\tUSoUIButton* SelectedButton = nullptr;\n\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\", meta = (BindWidget))\n\tUSoUIButton* RightArrowButton = nullptr;\n};\n"
  },
  {
    "path": "Source/SOrb/UI/General/Commands/SoCommandImageBilboardComponent.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#include \"SoCommandImageBilboardComponent.h\"\n\n#include \"Character/SoPlayerController.h\"\n#include \"Basic/SoGameSingleton.h\"\n#include \"Settings/Input/SoInputHelper.h\"\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoCommandImageBilboardComponent::BeginPlay()\n{\n\tSuper::BeginPlay();\n\tSubscribeToDeviceChanged();\n\n\tDeviceType = USoInputHelper::GetCurrentDeviceType(this);\n\tUpdateImage();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoCommandImageBilboardComponent::EndPlay(const EEndPlayReason::Type EndPlayReason)\n{\n\tUnSubscribeFromDeviceChanged();\n\tSuper::EndPlay(EndPlayReason);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoCommandImageBilboardComponent::SetSprite(UTexture2D* NewSprite)\n{\n\t// Ignore Super\n\tUpdateImage();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoCommandImageBilboardComponent::SetActionNameType(const ESoInputActionNameType InType)\n{\n\tActionNameType = InType;\n\tif (!IsActionNameTypeValid())\n\t\treturn;\n\n\tDeviceType = USoInputHelper::GetCurrentDeviceType(this);\n\tUpdateImage();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoCommandImageBilboardComponent::HandleDeviceTypeChanged(ESoInputDeviceType InDeviceType)\n{\n\tDeviceType = InDeviceType;\n\tUpdateImage();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoCommandImageBilboardComponent::SubscribeToDeviceChanged()\n{\n\tif (bIsListeningToDevicesChanges)\n\t\treturn;\n\n\tif (ASoPlayerController* Controller = ASoPlayerController::GetInstance(this))\n\t{\n\t\tController->OnDeviceTypeChanged().AddDynamic(this, &Self::HandleDeviceTypeChanged);\n\t\tbIsListeningToDevicesChanges = true;\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoCommandImageBilboardComponent::UnSubscribeFromDeviceChanged()\n{\n\tif (!bIsListeningToDevicesChanges)\n\t\treturn;\n\n\tif (ASoPlayerController* Controller = ASoPlayerController::GetInstance(this))\n\t{\n\t\tController->OnDeviceTypeChanged().RemoveDynamic(this, &Self::HandleDeviceTypeChanged);\n\t\tbIsListeningToDevicesChanges = false;\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoCommandImageBilboardComponent::UpdateImage()\n{\n\t// Maybe needed, not sure\n\tSubscribeToDeviceChanged();\n\n\tSprite = nullptr;\n\tif (IsActionNameTypeValid())\n\t\tSprite = USoGameSingleton::GetIconForInputActionNameType(ActionNameType, DeviceType);\n\n\tMarkRenderStateDirty();\n}\n"
  },
  {
    "path": "Source/SOrb/UI/General/Commands/SoCommandImageBilboardComponent.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#pragma once\n#include \"Components/BillboardComponent.h\"\n\n#include \"Settings/Input/SoInputNames.h\"\n#include \"Settings/Input/SoInputSettingsTypes.h\"\n\n#include \"SoCommandImageBilboardComponent.generated.h\"\n\nclass UTexture2D;\n\nUCLASS(ClassGroup = Rendering, collapsecategories, hidecategories = (Object, Activation, \"Components|Activation\", Physics, Collision, Lighting, Mesh, PhysicsVolume), editinlinenew, meta = (BlueprintSpawnableComponent))\nclass SORB_API USoCommandImageBilboardComponent : public UBillboardComponent\n{\n\tGENERATED_BODY()\n\ttypedef USoCommandImageBilboardComponent Self;\npublic:\n\t//\n\t// UActorComponent interface\n\t//\n\tvoid BeginPlay() override;\n\tvoid EndPlay(const EEndPlayReason::Type EndPlayReason) override;\n\n\t//\n\t// UBillboardComponent Interface\n\t//\n\tvoid SetSprite(UTexture2D* NewSprite) override;\n\n\t//\n\t// Own Methods\n\t//\n\n\tUFUNCTION(BlueprintCallable)\n\tvoid SetActionNameType(const ESoInputActionNameType InType);\n\n\tESoInputActionNameType GetActionNameType() const { return ActionNameType; }\n\tbool IsActionNameTypeValid() const { return ActionNameType != ESoInputActionNameType::IANT_None; }\n\tvoid ResetActionNameType()\n\t{\n\t\tActionNameType = ESoInputActionNameType::IANT_None;\n\t}\n\nprotected:\n\tUFUNCTION()\n\tvoid HandleDeviceTypeChanged(ESoInputDeviceType InDeviceType);\n\n\tvoid SubscribeToDeviceChanged();\n\tvoid UnSubscribeFromDeviceChanged();\n\tvoid UpdateImage();\n\nprotected:\n\t// Mutual exclusive with UICommand\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere, Category = \">UI\")\n\tESoInputActionNameType ActionNameType = ESoInputActionNameType::IANT_None;\n\n\t// Cached Current device Type\n\tESoInputDeviceType DeviceType = ESoInputDeviceType::Keyboard;\n\n\t// Keep track if we are listening or not\n\tbool bIsListeningToDevicesChanges = false;\n};\n"
  },
  {
    "path": "Source/SOrb/UI/General/Commands/SoUICommandImage.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#include \"SoUICommandImage.h\"\n\n#include \"Components/Image.h\"\n\n#include \"Basic/SoGameSingleton.h\"\n#include \"Character/SoPlayerController.h\"\n#include \"UI/SoUIHelper.h\"\n#include \"Settings/Input/SoInputHelper.h\"\n#include \"Engine/Texture2D.h\"\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUICommandImage::SynchronizeProperties()\n{\n\tSuper::SynchronizeProperties();\n\tUpdateImage(true);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUICommandImage::NativeConstruct()\n{\n\tSuper::NativeConstruct();\n\n\tSubscribeToDeviceChanged();\n\tSetDeviceType(USoInputHelper::GetCurrentDeviceType(this));\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUICommandImage::NativeDestruct()\n{\n\tUnSubscribeFromDeviceChanged();\n\tSuper::NativeDestruct();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUICommandImage::SetPreviewImage(UTexture2D* Preview)\n{\n\tif (Image && Preview)\n\t{\n\t\tTextureOriginalSize = FIntPoint(Preview->GetSizeX(), Preview->GetSizeY());\n\t\tImage->SetBrushFromTexture(Preview, false);\n\t\tUpdateImageSize();\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUICommandImage::SetUICommand(ESoUICommand InCommand, bool bUpdateDeviceType)\n{\n\tUICommand = InCommand;\n\tResetActionNameType();\n\tif (!IsUICommandValid())\n\t\treturn;\n\n\tif (bUpdateDeviceType)\n\t\tSetDeviceType(USoInputHelper::GetCurrentDeviceType(this));\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUICommandImage::SetActionNameType(ESoInputActionNameType InType, bool bUpdateDeviceType)\n{\n\tActionNameType = InType;\n\tResetUICommand();\n\tif (!IsActionNameTypeValid())\n\t\treturn;\n\n\tif (bUpdateDeviceType)\n\t\tSetDeviceType(USoInputHelper::GetCurrentDeviceType(this));\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUICommandImage::HandleDeviceTypeChanged(ESoInputDeviceType InDeviceType)\n{\n\tif (!bChangeImageOnInputDeviceChange)\n\t\treturn;\n\n\tSetDeviceType(InDeviceType);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUICommandImage::SubscribeToDeviceChanged()\n{\n\tif (!bChangeImageOnInputDeviceChange || bIsListeningToDevicesChanges)\n\t\treturn;\n\n\tif (ASoPlayerController* Controller = USoUIHelper::GetSoPlayerControllerFromUWidget(this))\n\t{\n\t\tController->OnDeviceTypeChanged().AddDynamic(this, &ThisClass::HandleDeviceTypeChanged);\n\t\tbIsListeningToDevicesChanges = true;\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUICommandImage::UnSubscribeFromDeviceChanged()\n{\n\tif (!bIsListeningToDevicesChanges)\n\t\treturn;\n\n\tif (ASoPlayerController* Controller = USoUIHelper::GetSoPlayerControllerFromUWidget(this))\n\t{\n\t\tController->OnDeviceTypeChanged().RemoveDynamic(this, &ThisClass::HandleDeviceTypeChanged);\n\t\tbIsListeningToDevicesChanges = false;\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUICommandImage::EnableStaticTextureMode(UTexture2D* Texture, bool bMatchSize)\n{\n\tStaticTextureBrush.SetResourceObject(Texture);\n\tbStaticTextureMatchSize = bMatchSize;\n\tSetStaticTextureMode(true);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUICommandImage::UpdateImage(bool bFromSyncronize)\n{\n\tUTexture2D* NewTexture = nullptr;\n\n\tif (bStaticTextureMode)\n\t{\n\t\t// Use static texture\n\t\tNewTexture = Cast<UTexture2D>(StaticTextureBrush.GetResourceObject());\n\t}\n\telse\n\t{\n\t\t// Use Dynamic\n\t\tNewTexture = GetDynamicImage(bFromSyncronize);\n\t}\n\n\tif (NewTexture)\n\t\tTextureOriginalSize = FIntPoint(NewTexture->GetSizeX(), NewTexture->GetSizeY());\n\n\tif (Image)\n\t{\n\t\tImage->SetBrushFromTexture(NewTexture, bStaticTextureMode ? bStaticTextureMatchSize : false);\n\t\tUpdateImageSize();\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUTexture2D* USoUICommandImage::GetDynamicImage(bool bFromSyncronize)\n{\n\t// Override with gamepad texture:\n\t// Is override gamepad textures set\n\t// AND either of\n\t// - is NOT bChangeImageOnInputDeviceChange\n\t// - bIsKeyboard AND bChangeImageOnInputDeviceChange\n\tconst bool bIsGamepad = DeviceType != ESoInputDeviceType::Keyboard;\n\tconst bool bIsKeyboard = !bIsGamepad;\n\tconst bool bCanOverrideGamepad = OverrideGamepadTextures.IsValid() &&\n\t\t((bChangeImageOnInputDeviceChange && bIsGamepad) || !bChangeImageOnInputDeviceChange);\n\n\tif (bCanOverrideGamepad)\n\t{\n\t\t// Overridden by gamepad textures\n\t\treturn OverrideGamepadTextures.GetTextureForDeviceType(DeviceType);\n\t}\n\n\tif (bFromSyncronize)\n\t{\n\t\t// Preview, Set the current image\n\t\treturn Image ? Cast<UTexture2D>(Image->Brush.GetResourceObject()) : nullptr;\n\t}\n\t\n\t// Normal\n\tif (IsUICommandValid())\n\t{\n\t\tResetActionNameType();\n\t\treturn USoGameSingleton::GetIconForUICommand(UICommand, DeviceType, UICommandPriorities);\n\t}\n\tif (IsActionNameTypeValid())\n\t{\n\t\tResetUICommand();\n\t\treturn USoGameSingleton::GetIconForInputActionNameType(ActionNameType, DeviceType, bIsKeyboard);\n\t}\n\n\treturn nullptr;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUICommandImage::UpdateImageSize()\n{\n\tif (!Image)\n\t\treturn;\n\n\tif (bStaticTextureMode)\n\t{\n\t\tImage->Brush.ImageSize = StaticTextureBrush.ImageSize;\n\t\tImage->Brush.TintColor = StaticTextureBrush.TintColor;\n\t\tImage->Brush.DrawAs = StaticTextureBrush.DrawAs;\n\t\tImage->Brush.Tiling = StaticTextureBrush.Tiling;\n\t}\n\telse\n\t{\n\t\tif (IsValidOverrideWidthAndHeight())\n\t\t{\n\t\t\tImage->Brush.ImageSize = USoGameSingleton::GetVectorWidthHeightForUIIcons(DeviceType, OverrideWidthAndHeight);\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// Should be safe for SynchronizeProperties()\n\t\t\tImage->Brush.ImageSize = USoGameSingleton::GetDefaultVectorWidthHeightForUIIcons(DeviceType);\n\t\t}\n\t}\n\n\t// Check if we need to scale by ratio\n\tif (TextureOriginalSize.X > 0 && TextureOriginalSize.Y > 0 && TextureOriginalSize.X != TextureOriginalSize.Y)\n\t{\n\t\t// Only Scale Up\n\t\tif (TextureOriginalSize.X > TextureOriginalSize.Y)\n\t\t{\n\t\t\t// Scale X\n\t\t\tconst float Ratio = TextureOriginalSize.X / static_cast<float>(TextureOriginalSize.Y);\n\t\t\tImage->Brush.ImageSize.X *= Ratio;\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// Scale Y\n\t\t\tconst float Ratio = TextureOriginalSize.Y / static_cast<float>(TextureOriginalSize.X);\n\t\t\tImage->Brush.ImageSize.Y *= Ratio;\n\t\t}\n\t}\n\n\t// Force redraw\n\tInvalidateLayoutAndVolatility();\n\tImage->InvalidateLayoutAndVolatility();\n}\n"
  },
  {
    "path": "Source/SOrb/UI/General/Commands/SoUICommandImage.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#pragma once\n\n#include \"CoreMinimal.h\"\n#include \"Blueprint/UserWidget.h\"\n\n#include \"UI/General/SoUITypes.h\"\n#include \"Settings/Input/SoInputNames.h\"\n#include \"Settings/Input/SoInputSettingsTypes.h\"\n\n#include \"SoUICommandImage.generated.h\"\n\nclass UImage;\n\n/**\n * Displays a shortcut image that changes if the input type also changes\n * NOTE: this is always visible. To have visibility only one some inputs see USoUICommandTooltip\n * You can set either a ESoUICommand OR a ESoInputActionNameType for the image to display,\n */\nUCLASS(HideCategories = (Navigation))\nclass SORB_API USoUICommandImage : public UUserWidget\n{\n\tGENERATED_BODY()\npublic:\n\t//\n\t// UUserWidget Interface\n\t//\n\tvoid SynchronizeProperties() override;\n\tvoid NativeConstruct() override;\n\tvoid NativeDestruct() override;\n\n\t//\n\t// Own Methods\n\t//\n\n\t// Only used for previews\n\tvoid SetPreviewImage(UTexture2D* Preview);\n\n\tvoid SetIsListeningToDeviceChanges(bool bIsListening)\n\t{\n\t\tif (bIsListeningToDevicesChanges == bIsListening)\n\t\t\treturn;\n\n\t\tif (bIsListeningToDevicesChanges)\n\t\t\tUnSubscribeFromDeviceChanged();\n\t\telse\n\t\t\tSubscribeToDeviceChanged();\n\t}\n\n\t//\n\t// Sets the UICommand we want to display the image for\n\t// NOTE: this is mutual exclusive with the ActionNameType\n\t// UICommand\n\t//\n\n\tUFUNCTION(BlueprintCallable, Category = WhatToDisplay)\n\tvoid SetUICommand(ESoUICommand InCommand, bool bUpdateDeviceType = true);\n\n\tUFUNCTION(BlueprintCallable, Category = WhatToDisplay)\n\tvoid SetUICommandPriorities(const FSoInputUICommandPriorities& Priorities, bool bUpdateImage = true)\n\t{\n\t\tUICommandPriorities = Priorities;\n\t\tif (IsUICommandValid() && bUpdateImage)\n\t\t\tUpdateImage();\n\t}\n\n\tESoUICommand GetUICommand() const { return UICommand; }\n\tbool IsUICommandValid() const { return FSoInputActionName::IsValidUICommand(UICommand); }\n\tvoid ResetUICommand()\n\t{\n\t\tUICommand = ESoUICommand::EUC_PressedMax;\n\t\tUICommandPriorities = {};\n\t}\n\n\t//\n\t// Sets the input action name type we want to set the image for\n\t// NOTE: this is mutual exclusive with the UICommand\n\t// ActionNameType\n\t//\n\n\tUFUNCTION(BlueprintCallable, Category = WhatToDisplay)\n\tvoid SetActionNameType(ESoInputActionNameType InType, bool bUpdateDeviceType = true);\n\n\tESoInputActionNameType GetActionNameType() const { return ActionNameType; }\n\tbool IsActionNameTypeValid() const { return FSoInputActionName::IsValidActionNameType(ActionNameType); }\n\tvoid ResetActionNameType()\n\t{\n\t\tActionNameType = ESoInputActionNameType::IANT_None;\n\t}\n\n\t//\n\t// Can be used to override the image size instead of relying on the texture size\n\t// OverrideWidthAndHeight\n\t//\n\n\tUFUNCTION(BlueprintCallable)\n\tvoid SetOverrideWidthAndHeight(const FVector2D& WidthAndHeight)\n\t{\n\t\tOverrideWidthAndHeight = WidthAndHeight;\n\t\tUpdateImageSize();\n\t}\n\n\tbool GetOverrideWidthAndHeight(FVector2D& OutVector) const\n\t{\n\t\tOutVector = OverrideWidthAndHeight;\n\t\treturn IsValidOverrideWidthAndHeight();\n\t}\n\n\tstatic FORCEINLINE bool IsValidOverrideWidthAndHeight(const FVector2D& Override)\n\t{\n\t\treturn !Override.IsNearlyZero() && Override.X > 1.f && Override.Y > 1.f;\n\t}\n\n\tbool IsValidOverrideWidthAndHeight() const { return IsValidOverrideWidthAndHeight(OverrideWidthAndHeight); }\n\n\t//\n\t// DeviceType\n\t//\n\n\tUFUNCTION(BlueprintCallable)\n\tvoid SetDeviceType(const ESoInputDeviceType NewDevice)\n\t{\n\t\tDeviceType = NewDevice;\n\t\tUpdateImage();\n\t}\n\n\t//\n\t// OverrideGamepadTextures\n\t// bChangeImageOnInputDeviceChange\n\t//\n\n\t// Used mainly in settings UI\n\tThisClass* SetOverrideGamepadTextures(const FSoInputGamepadKeyTextures& Textures)\n\t{\n\t\tOverrideGamepadTextures = Textures;\n\t\treturn this;\n\t}\n\tThisClass* SetChangeImageOnInputDeviceChanged(bool bValue)\n\t{\n\t\tbChangeImageOnInputDeviceChange = bValue;\n\t\treturn this;\n\t}\n\n\tvoid ForceUpdateImage() { UpdateImage(); }\n\n\t//\n\t// StaticTexture\n\t//\n\n\tUFUNCTION(BlueprintCallable, Category = StaticTexture)\n\tvoid EnableStaticTextureMode(UTexture2D* Texture, bool bMatchSize);\n\n\tUFUNCTION(BlueprintCallable, Category = StaticTexture)\n\tvoid EnableStaticTextureModeWithBrush(const FSlateBrush Brush, bool bMatchSize)\n\t{\n\t\tStaticTextureBrush = Brush;\n\t\tbStaticTextureMatchSize = bMatchSize;\n\t\tSetStaticTextureMode(true);\n\t}\n\n\tUFUNCTION(BlueprintCallable, Category = StaticTexture)\n\tvoid DisableStaticTextureMode()\n\t{\n\t\tStaticTextureBrush = {};\n\t\tbStaticTextureMatchSize = false;\n\t\tSetStaticTextureMode(true);\n\t}\n\nprotected:\n\tUFUNCTION()\n\tvoid HandleDeviceTypeChanged(ESoInputDeviceType InDeviceType);\n\n\tvoid SetStaticTextureMode(bool bValue)\n\t{\n\t\tbStaticTextureMode = bValue;\n\t\tSetIsListeningToDeviceChanges(!bStaticTextureMode);\n\t\tUpdateImage();\n\t}\n\n\tvoid SubscribeToDeviceChanged();\n\tvoid UnSubscribeFromDeviceChanged();\n\tvoid UpdateImage(bool bFromSyncronize = false);\n\tUTexture2D* GetDynamicImage(bool bFromSyncronize = false);\n\tvoid UpdateImageSize();\n\nprotected:\n\t//\n\t// WhatToDisplay\n\t//\n\n\t// The current command if any\n\t// Mutual exclusive with ActionNameType\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere, Category = \">WhatToDisplay\")\n\tESoUICommand UICommand = ESoUICommand::EUC_PressedMax;\n\n\t// Priorities for the UI command\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere, Category = \">WhatToDisplay\")\n\tFSoInputUICommandPriorities UICommandPriorities;\n\n\t// The current action name\n\t// Mutual exclusive with UICommand\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere, Category = \">WhatToDisplay\")\n\tESoInputActionNameType ActionNameType = ESoInputActionNameType::IANT_None;\n\n\n\t//\n\t// Override\n\t//\n\n\t// Sometimes used by the UI, if this is set it does not get the textures, it uses these\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere, Category = \">Override\")\n\tFSoInputGamepadKeyTextures OverrideGamepadTextures;\n\n\t// If this is a positive number it uses this as the image size instead of the default ones from USoGameSingleton::GetDefaultWidthAndHeightForUIIcons\n\t// X - Width\n\t// Y - Height\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere, Category = \">Override\")\n\tFVector2D OverrideWidthAndHeight = FVector2D::ZeroVector;\n\n\n\t//\n\t// Options\n\t//\n\n\t// If false it does not try to change the input device used\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere, Category = \">Options\")\n\tbool bChangeImageOnInputDeviceChange = true;\n\n\n\t//\n\t// Other\n\t//\n\n\tUPROPERTY(BlueprintReadOnly, meta = (BindWidget))\n\tUImage* Image = nullptr;\n\n\t// Cached Current device Type\n\tESoInputDeviceType DeviceType = ESoInputDeviceType::Keyboard;\n\n\t// Keep track if we are listening or not\n\tUPROPERTY(BlueprintReadOnly)\n\tbool bIsListeningToDevicesChanges = false;\n\n\t// Keep track of the original texture size\n\tUPROPERTY(BlueprintReadOnly)\n\tFIntPoint TextureOriginalSize = FIntPoint::ZeroValue;\n\n\n\t//\n\t// StaticTexture\n\t//\n\n\t// If this is true this will act as a normal UImage\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere, Category = \">StaticTexture\")\n\tbool bStaticTextureMode = false;\n\n\t// Only used if bStaticTextureMode = true\n\t// NOTE: this is not affected by OverrideWidthAndHeight\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere, Category = \">StaticTexture\")\n\tFSlateBrush StaticTextureBrush;\n\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere, Category = \">StaticTexture\")\n\tbool bStaticTextureMatchSize = false;\n};\n"
  },
  {
    "path": "Source/SOrb/UI/General/Commands/SoUICommandTooltip.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#include \"SoUICommandTooltip.h\"\n\n#include \"Components/TextBlock.h\"\n#include \"Components/HorizontalBoxSlot.h\"\n#include \"Components/HorizontalBox.h\"\n\n#include \"SoUICommandImage.h\"\n#include \"Basic/SoGameSingleton.h\"\n#include \"UI/SoUIHelper.h\"\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUICommandTooltip::SynchronizeProperties()\n{\n\tSuper::SynchronizeProperties();\n\n\tif (!PreviewText.IsEmpty())\n\t\tSetText(PreviewText);\n\n\tif (CommandImage)\n\t{\n\t\tif (USoUICommandImage::IsValidOverrideWidthAndHeight(ImageOverrideWidthAndHeight))\n\t\t\tCommandImage->SetOverrideWidthAndHeight(ImageOverrideWidthAndHeight);\n\n\t\tif (PreviewImage)\n\t\t\tCommandImage->SetPreviewImage(PreviewImage);\n\t}\n\n\t// Set left sided or right sided\n\tif (Container && CommandText && CommandImage)\n\t{\n\t\tSetCacheSlots();\n\n\t\tContainer->ClearChildren();\n\t\tUHorizontalBoxSlot* ImageSlot = nullptr;\n\t\tUHorizontalBoxSlot* TextSlot = nullptr;\n\t\tif (bLeftSided)\n\t\t{\n\t\t\tImageSlot = AddWidgetToContainer(CommandImage);\n\t\t\tTextSlot = AddWidgetToContainer(CommandText);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tTextSlot = AddWidgetToContainer(CommandText);\n\t\t\tImageSlot = AddWidgetToContainer(CommandImage);\n\t\t}\n\n\t\t// Copy From Cache\n\t\tUSoUIHelper::CopyHorizontalBoxSlotToAnother(CachedSlotText, TextSlot);\n\t\tUSoUIHelper::CopyHorizontalBoxSlotToAnother(CachedSlotImage, ImageSlot);\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUICommandTooltip::NativeConstruct()\n{\n\tSuper::NativeConstruct();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUICommandTooltip::NativeDestruct()\n{\n\tSuper::NativeDestruct();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUICommandTooltip::SetPaddingBetween(float Size)\n{\n\tif (Size < 1.0f)\n\t\treturn;\n\n\tif (UHorizontalBoxSlot* FirstSlot = GetSlotFromContainer(0))\n\t{\n\t\tFirstSlot->Padding.Right = Size;\n\t\tFirstSlot->SynchronizeProperties();\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUICommandTooltip::SetText(FText InText)\n{\n\tif (CommandText)\n\t\tCommandText->SetText(InText);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUICommandTooltip::SetUICommand(ESoUICommand InCommand, bool bUpdateDeviceType)\n{\n\tif (CommandImage)\n\t\tCommandImage->SetUICommand(InCommand, bUpdateDeviceType);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUICommandTooltip::SetUICommandPriorities(const FSoInputUICommandPriorities& Priorities, bool bUpdateImage)\n{\n\tif (CommandImage)\n\t\tCommandImage->SetUICommandPriorities(Priorities, bUpdateImage);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUICommandTooltip::SetActionNameType(ESoInputActionNameType InType, bool bUpdateDeviceType)\n{\n\tif (CommandImage)\n\t\tCommandImage->SetActionNameType(InType, bUpdateDeviceType);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUICommandTooltip::SetDeviceType(ESoInputDeviceType NewDevice)\n{\n\tif (CommandImage)\n\t\tCommandImage->SetDeviceType(NewDevice);\n\n\tSetLocalDeviceType(NewDevice);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUICommandTooltip::SetOverrideWidthAndHeight(const FVector2D& WidthAndHeight)\n{\n\tif (CommandImage)\n\t\tCommandImage->SetOverrideWidthAndHeight(WidthAndHeight);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoUICommandTooltip::GetOverrideWidthAndHeight(FVector2D& OutVector) const\n{\n\tif (CommandImage)\n\t\treturn CommandImage->GetOverrideWidthAndHeight(OutVector);\n\n\treturn false;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUICommandTooltip::SetOverrideGamepadTextures(const FSoInputGamepadKeyTextures& Textures)\n{\n\tif (CommandImage)\n\t\tCommandImage->SetOverrideGamepadTextures(Textures);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUHorizontalBoxSlot* USoUICommandTooltip::AddWidgetToContainer(UWidget* Widget)\n{\n\tif (!Container)\n\t\treturn nullptr;\n\n\tif (UHorizontalBoxSlot* ContainerSlot = Container->AddChildToHorizontalBox(Widget))\n\t{\n\t\t//ContainerSlot->Size = FSlateChildSize(ESlateSizeRule::Type::Automatic);\n\t\t//ContainerSlot->HorizontalAlignment = EHorizontalAlignment::HAlign_Fill;\n\t\t//ContainerSlot->VerticalAlignment = EVerticalAlignment::VAlign_Fill;\n\t\treturn ContainerSlot;\n\t}\n\n\treturn nullptr;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUHorizontalBoxSlot* USoUICommandTooltip::GetSlotFromContainer(int32 Index)\n{\n\tif (!Container)\n\t\treturn nullptr;\n\n\tconst TArray<UPanelSlot*>& ContainerSlots = Container->GetSlots();\n\tif (ContainerSlots.IsValidIndex(Index))\n\t\treturn Cast<UHorizontalBoxSlot>(ContainerSlots[Index]);\n\n\treturn nullptr;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUICommandTooltip::SetCacheSlots()\n{\n\tif (!Container)\n\t\treturn;\n\n\tCachedSlotImage = nullptr;\n\tCachedSlotText = nullptr;\n\n\tif (CommandText)\n\t\tCachedSlotText = Cast<UHorizontalBoxSlot>(CommandText->Slot);\n\n\tif (CommandImage)\n\t\tCachedSlotImage = Cast<UHorizontalBoxSlot>(CommandImage->Slot);\n}\n"
  },
  {
    "path": "Source/SOrb/UI/General/Commands/SoUICommandTooltip.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#pragma once\n\n#include \"CoreMinimal.h\"\n#include \"UI/General/SoUIUserWidgetDeviceVisibility.h\"\n\n#include \"SoUICommandTooltip.generated.h\"\n\nenum class ESoInputActionNameType : uint8;\nclass UHorizontalBox;\nclass UHorizontalBoxSlot;\nclass UTextBlock;\nclass USoUICommandImage;\nstruct FSoInputGamepadKeyTextures;\n\n\nUSTRUCT(BlueprintType, Blueprintable)\nstruct FSoCommandTooltipData\n{\n\tGENERATED_USTRUCT_BODY()\n\npublic:\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere)\n\tFText InText;\n\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere)\n\tESoUICommand Command;\n};\n\n/**\n * Display a shortcut and some text (command) besides it\n * NOTE: Assumes horizontal box\n * NOTE: You can set either a ESoUICommand OR a ESoInputActionNameType for the image to display\n * [Icon][Command name]\n * OR\n * [Command name] [Icon]\n */\nUCLASS(HideCategories = (\"Navigation\"))\nclass SORB_API USoUICommandTooltip : public USoUIUserWidgetDeviceVisibility\n{\n\tGENERATED_BODY()\npublic:\n\t//\n\t// UUserWidget Interface\n\t//\n\tvoid SynchronizeProperties() override;\n\tvoid NativeConstruct() override;\n\tvoid NativeDestruct() override;\n\n\t//\n\t// Own Methods\n\t//\n\n\tUFUNCTION(BlueprintCallable)\n\tvoid SetPaddingBetween(float Size);\n\n\n\t//\n\t// UICommand\n\t//\n\n\tUFUNCTION(BlueprintCallable, Category = Image)\n\tvoid SetUICommand(ESoUICommand InCommand, bool bUpdateDeviceType = true);\n\n\tUFUNCTION(BlueprintCallable, Category = Image)\n\tvoid SetUICommandPriorities(const FSoInputUICommandPriorities& Priorities, bool bUpdateImage = true);\n\n\tUFUNCTION(BlueprintCallable, Category = Initialize)\n\tvoid InitializeFromUICommandData(const FSoCommandTooltipData& Data)\n\t{\n\t\tInitializeFromUICommand(Data.InText, Data.Command);\n\t}\n\n\tUFUNCTION(BlueprintCallable, Category = Initialize)\n\tvoid InitializeFromUICommand(FText InText, ESoUICommand Command, bool bUpdateDeviceType = true, bool bAnimate = false)\n\t{\n\t\tSetText(InText);\n\t\tSetUICommand(Command, bUpdateDeviceType);\n\t\tUpdateAnimation(bAnimate);\n\t}\n\n\t//\n\t// ActionNameType\n\t//\n\n\tUFUNCTION(BlueprintCallable, Category = Initialize)\n\tvoid InitializeFromInputActionNameType(FText InText,\n\t\t\t\t\t\t\t\t\t\t   ESoInputActionNameType ActionNameType,\n\t\t\t\t\t\t\t\t\t\t   bool bUpdateDeviceType = true,\n\t\t\t\t\t\t\t\t\t\t   bool bAnimate = false)\n\t{\n\t\tSetText(InText);\n\t\tSetActionNameType(ActionNameType, bUpdateDeviceType);\n\t\tUpdateAnimation(bAnimate);\n\t}\n\n\t//\n\t// Override\n\t//\n\n\tUFUNCTION(BlueprintCallable, Category = Image)\n\tvoid SetOverrideWidthAndHeight(const FVector2D& WidthAndHeight);\n\n\tbool GetOverrideWidthAndHeight(FVector2D& OutVector) const;\n\tvoid SetOverrideGamepadTextures(const FSoInputGamepadKeyTextures& Textures);\n\n\tUFUNCTION(BlueprintCallable, Category = Image)\n\tvoid SetActionNameType(const ESoInputActionNameType InType, const bool bUpdateDeviceType = true);\n\n\t//\n\t// Other\n\t//\n\n\tUFUNCTION(BlueprintCallable)\n\tvoid SetText(FText InText);\n\n\tUFUNCTION(BlueprintCallable)\n\tvoid SetDeviceType(ESoInputDeviceType NewDevice) override;\n\n\nprotected:\n\tUHorizontalBoxSlot* AddWidgetToContainer(UWidget* Widget);\n\tUHorizontalBoxSlot* GetSlotFromContainer(int32 Index);\n\tvoid SetCacheSlots();\n\n\tUFUNCTION(BlueprintImplementableEvent, BlueprintCallable, BlueprintCosmetic, Category = \">Events\")\n\tvoid UpdateAnimation(bool bShouldBeAnimated);\n\nprotected:\n\t/**\n\t * bLeftSided = true [Icon][Command name]\n\t * OR\n\t * bLeftSided = false [Command name][Icon]\n\t*/\n\tUPROPERTY(EditAnywhere, BlueprintReadOnly, Category = \">General\")\n\tbool bLeftSided = true;\n\n\t// Only used for previews\n\tUPROPERTY(EditAnywhere, Category = \">Preview\")\n\tFText PreviewText;\n\n\t// Only used for previews\n\tUPROPERTY(EditAnywhere, Category = \">Preview\")\n\tUTexture2D* PreviewImage = nullptr;\n\n\t// If this is a positive number it uses this as the image size instead of the default ones from USoGameSingleton::GetDefaultWidthAndHeightForUIIcons\n\t// X - Width\n\t// Y - Height\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere, Category = \">Image\")\n\tFVector2D ImageOverrideWidthAndHeight = FVector2D::ZeroVector;\n\n\tUPROPERTY(BlueprintReadWrite, meta = (BindWidget))\n\tUTextBlock* CommandText = nullptr;\n\n\tUPROPERTY(BlueprintReadWrite, meta = (BindWidget))\n\tUSoUICommandImage* CommandImage = nullptr;\n\n\tUPROPERTY(BlueprintReadWrite, meta = (BindWidget))\n\tUHorizontalBox* Container = nullptr;\n\n\t// Used for caching\n\tUPROPERTY()\n\tUHorizontalBoxSlot* CachedSlotText = nullptr;\n\n\t// Used for caching\n\tUPROPERTY()\n\tUHorizontalBoxSlot* CachedSlotImage = nullptr;\n};\n"
  },
  {
    "path": "Source/SOrb/UI/General/Commands/SoUICommandTooltipArray.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#include \"SoUICommandTooltipArray.h\"\n\n#include \"Components/PanelWidget.h\"\n#include \"Components/Spacer.h\"\n#include \"Components/HorizontalBoxSlot.h\"\n#include \"Components/SizeBoxSlot.h\"\n#include \"Components/HorizontalBox.h\"\n\nDEFINE_LOG_CATEGORY_STATIC(LogSoUICommandTooltipArray, All, All)\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUICommandTooltipArray::SynchronizeProperties()\n{\n\tSuper::SynchronizeProperties();\n\n\t// Set proper size form template\n\tif (*CommandTooltipClass && WidgetsContainer)\n\t{\n\t\t// if (const USoUICommandTooltip* Template = GetCommandTooltipWidget(false))\n\t\t// {\n\t\t// \tFVector2D OverrideWidthAndHeight;\n\t\t// \tif (Template->GetOverrideWidthAndHeight(OverrideWidthAndHeight))\n\t\t// \t{\n\t\t// \t\tfor (int32 Index = WidgetsContainer->GetChildrenCount() - 1; Index >= 0; --Index)\n\t\t// \t\t{\n\t\t// \t\t\tUWidget* CurrentWidget = WidgetsContainer->GetChildAt(Index);\n\t\t// \t\t\tif (USoUICommandTooltip* CommandWidget = Cast<USoUICommandTooltip>(CurrentWidget))\n\t\t// \t\t\t\tCommandWidget->SetOverrideWidthAndHeight(OverrideWidthAndHeight);\n\t\t// \t\t}\n\t\t// \t}\n\t\t// }\n\n\t\t// Set Defaults\n\t\tfor (int32 Index = WidgetsContainer->GetChildrenCount() - 1; Index >= 0; --Index)\n\t\t\tif (USoUICommandTooltip* CommandTooltip = Cast<USoUICommandTooltip>(WidgetsContainer->GetChildAt(Index)))\n\t\t\t\tSetHorizontalBoxSlotToDefaults(Cast<UHorizontalBoxSlot>(CommandTooltip->Slot));\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUICommandTooltipArray::Clear()\n{\n\t// Cache the current widgets\n\tconst int32 NumWidgets = WidgetsContainer->GetChildrenCount();\n\tfor (int32 Index = 0; Index < NumWidgets; Index++)\n\t{\n\t\tUWidget* CurrentWidget = WidgetsContainer->GetChildAt(Index);\n\t\tif (USoUICommandTooltip* CommandWidget = Cast<USoUICommandTooltip>(CurrentWidget))\n\t\t{\n\t\t\tif (*CommandTooltipClass != nullptr && CommandWidget->IsA(CommandTooltipClass))\n\t\t\t{\n\t\t\t\tCachedCommandTooltipWidgets.Add(CommandWidget);\n\t\t\t}\n\t\t}\n\t}\n\n\tWidgetsContainer->ClearChildren();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoUICommandTooltipArray::IsEmpty() const\n{\n\treturn WidgetsContainer->GetChildrenCount() == 0;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUSoUICommandTooltip* USoUICommandTooltipArray::GetOrCreateCommandTooltipWidget(bool bTryCache)\n{\n\t// Pop from cache?\n\tif (bTryCache && CachedCommandTooltipWidgets.Num() > 0)\n\t\treturn CachedCommandTooltipWidgets.Pop();\n\n\tif (*CommandTooltipClass == nullptr)\n\t{\n\t\tUE_LOG(LogSoUICommandTooltipArray, Error, TEXT(\"Invalid CommandTooltipClass for USoUICommandTooltipArray\"));\n\t\treturn nullptr;\n\t}\n\tUWorld* World = GetWorld();\n\tif (World == nullptr)\n\t{\n\t\tUE_LOG(LogSoUICommandTooltipArray, Error, TEXT(\"Invalid World for USoUICommandTooltipArray\"));\n\t\treturn nullptr;\n\t}\n\n\t// Create the command tooltip\n\treturn CreateWidget<USoUICommandTooltip>(World, CommandTooltipClass);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUICommandTooltipArray::AddTooltipFromUICommand(const FText InText, const ESoUICommand Command)\n{\n\t// Add command tooltip\n\tif (USoUICommandTooltip* CommandTooltip = GetOrCreateCommandTooltipWidget())\n\t{\n\t\tWidgetsContainer->AddChild(CommandTooltip);\n\t\t// Can't get the slot before adding\n\t\tUHorizontalBoxSlot* HorizontalSlot = Cast<UHorizontalBoxSlot>(CommandTooltip->Slot);\n\t\tverify(HorizontalSlot);\n\t\tSetHorizontalBoxSlotToDefaults(HorizontalSlot);\n\t\tOnPostAddTooltip(HorizontalSlot, CommandTooltip);\n\n\t\tCommandTooltip->InitializeFromUICommand(InText, Command);\n\t\tOnPostInitializeTooltip(HorizontalSlot, CommandTooltip);\n\t}\n\n\tif (USizeBoxSlot* SizeBoxSlot = Cast<USizeBoxSlot>(WidgetsContainer->Slot))\n\t\tSizeBoxSlot->SetHorizontalAlignment(EHorizontalAlignment::HAlign_Fill);\n\n\t// Force redraw\n\tInvalidateLayoutAndVolatility();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUICommandTooltipArray::SetupFromUICommands(const TArray<FSoCommandTooltipData>& Data)\n{\n\tif (Data.Num() == 0)\n\t{\n\t\tSetVisibility(ESlateVisibility::Collapsed);\n\t\treturn;\n\t}\n\n\tSetVisibility(ESlateVisibility::Visible);\n\n\t// Cache and remove all excess elements\n\tfor (int32 Index = WidgetsContainer->GetChildrenCount() - 1; Index >= Data.Num(); --Index)\n\t{\n\t\tUWidget* CurrentWidget = WidgetsContainer->GetChildAt(Index);\n\t\tif (USoUICommandTooltip* CommandWidget = Cast<USoUICommandTooltip>(CurrentWidget))\n\t\t{\n\t\t\tif (*CommandTooltipClass != nullptr && CommandWidget->IsA(CommandTooltipClass))\n\t\t\t{\n\t\t\t\tCachedCommandTooltipWidgets.Add(CommandWidget);\n\t\t\t}\n\t\t}\n\n\t\tWidgetsContainer->RemoveChildAt(Index);\n\t}\n\n\tfor (int32 i = 0; i < Data.Num(); ++i)\n\t{\n\t\tif (i >= WidgetsContainer->GetChildrenCount())\n\t\t{\n\t\t\tUSoUICommandTooltip* TooltipAdded = GetOrCreateCommandTooltipWidget();\n\t\t\tWidgetsContainer->AddChild(TooltipAdded);\n\t\t\tif (TooltipAdded)\n\t\t\t\tOnPostAddTooltip(Cast<UHorizontalBoxSlot>(TooltipAdded->Slot), TooltipAdded);\n\t\t}\n\n\t\tif (USoUICommandTooltip* CommandTooltip = Cast<USoUICommandTooltip>(WidgetsContainer->GetChildAt(i)))\n\t\t{\n\t\t\tCommandTooltip->InitializeFromUICommandData(Data[i]);\n\n\t\t\tUHorizontalBoxSlot* HorizontalSlot = Cast<UHorizontalBoxSlot>(CommandTooltip->Slot);\n\t\t\tverify(HorizontalSlot);\n\t\t\tSetHorizontalBoxSlotToDefaults(HorizontalSlot);\n\t\t\tOnPostInitializeTooltip(HorizontalSlot, CommandTooltip);\n\t\t}\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUICommandTooltipArray::SetHorizontalBoxSlotToDefaults(UHorizontalBoxSlot* HorizontalSlot)\n{\n\tif (!HorizontalSlot)\n\t\treturn;\n\n\tHorizontalSlot->Size = TooltipsSize;\n\tHorizontalSlot->Padding = TooltipsPadding;\n\tHorizontalSlot->HorizontalAlignment = TooltipsHorizontalAlignment;\n\tHorizontalSlot->VerticalAlignment = TooltipsVerticalAlignment;\n\tHorizontalSlot->SynchronizeProperties();\n}\n"
  },
  {
    "path": "Source/SOrb/UI/General/Commands/SoUICommandTooltipArray.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#pragma once\n\n#include \"CoreMinimal.h\"\n#include \"Blueprint/UserWidget.h\"\n\n#include \"SoUICommandTooltip.h\"\n\n#include \"SoUICommandTooltipArray.generated.h\"\n\nclass UTextBlock;\nclass USpacer;\nclass UHorizontalBoxSlot;\n\n/**\n * An array of command tooltips with space between them? possibly\n * NOTE: these are not navigable\n * NOTE: this assume horizontal layout for anything else pls modify this class\n */\nUCLASS(HideCategories = (\"Navigation\"))\nclass SORB_API USoUICommandTooltipArray : public UUserWidget\n{\n\tGENERATED_BODY()\n\npublic:\n\t//\n\t// UUserWidget Interface\n\t//\n\tvoid SynchronizeProperties() override;\n\n\t//\n\t// Own methods\n\t//\n\n\t// Clears all the widgets from the WidgetsContainer\n\tUFUNCTION(BlueprintCallable)\n\tvoid Clear();\n\n\t// Is this widget empty?\n\tUFUNCTION(BlueprintPure)\n\tbool IsEmpty() const;\n\n\t// Get or create spacer widget\n\t// UFUNCTION(BlueprintCallable)\n\t// USpacer* GetSpacerWidget();\n\n\t// Get or create command tooltip widget\n\tUFUNCTION(BlueprintCallable)\n\tUSoUICommandTooltip* GetOrCreateCommandTooltipWidget(bool bTryCache = true);\n\n\t// Adds a command tooltip from the UI command provided\n\tUFUNCTION(BlueprintCallable)\n\tvoid AddTooltipFromUICommand(const FText InText, const ESoUICommand Command);\n\n\t// Called after the tooltip is initialized\n\tUFUNCTION(BlueprintImplementableEvent)\n\tvoid OnPostInitializeTooltip(UHorizontalBoxSlot* TooltipSlot, USoUICommandTooltip* TooltipAdded);\n\n\t// Called after the tooltip is added to the widget container\n\tUFUNCTION(BlueprintImplementableEvent)\n\tvoid OnPostAddTooltip(UHorizontalBoxSlot* TooltipSlot, USoUICommandTooltip* TooltipAdded);\n\n\tUFUNCTION(BlueprintCallable)\n\tvoid SetupFromUICommands(const TArray<FSoCommandTooltipData>& Data);\n\nprotected:\n\tvoid SetHorizontalBoxSlotToDefaults(UHorizontalBoxSlot* HorizontalSlot);\n\nprotected:\n\t// Container for all the tooltip commands\n\tUPROPERTY(BlueprintReadWrite, meta = (BindWidget))\n\tUHorizontalBox* WidgetsContainer = nullptr;\n\n\t/** Class used for creating command tooltips. Used in GetCommandTooltipWidget */\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = \">Tooltips\")\n\tTSubclassOf<USoUICommandTooltip> CommandTooltipClass;\n\n\t// Default Padding for each tooltip\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Tooltips)\n\tFMargin TooltipsPadding;\n\n\t// Default size for each tooltip\n\tUPROPERTY(EditAnywhere, BlueprintReadOnly, Category = Tooltips)\n\tFSlateChildSize TooltipsSize = FSlateChildSize(ESlateSizeRule::Type::Automatic);\n\n\t// Default HorizontalAlignment for each tooltip\n\tUPROPERTY(EditAnywhere, BlueprintReadOnly, Category = Tooltips)\n\tTEnumAsByte<EHorizontalAlignment> TooltipsHorizontalAlignment = EHorizontalAlignment::HAlign_Center;\n\n\t// Padding for VerticalAlignment each tooltip\n\tUPROPERTY(EditAnywhere, BlueprintReadOnly, Category = Tooltips)\n\tTEnumAsByte<EVerticalAlignment> TooltipsVerticalAlignment = EVerticalAlignment::VAlign_Center;\n\n\t// Cached command tooltip widgets so that we do not recreate them all the time\n\tUPROPERTY(BlueprintReadOnly)\n\tTArray<USoUICommandTooltip*> CachedCommandTooltipWidgets;\n};\n"
  },
  {
    "path": "Source/SOrb/UI/General/SoUIActorMediaAudioPlayer.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#pragma once\n\n#include \"GameFramework/Actor.h\"\n#include \"MediaPlayer.h\"\n#include \"MediaSoundComponent.h\"\n#include \"Engine/World.h\"\n\n#include \"SoUIActorMediaAudioPlayer.generated.h\"\n\n\n// Helper Actor to use for MediaSoundComponent...\nUCLASS()\nclass SORB_API ASoUIActorMediaAudioPlayer : public AActor\n{\n\tGENERATED_BODY()\n\npublic:\n\tASoUIActorMediaAudioPlayer(const FObjectInitializer& ObjectInitializer) : Super(ObjectInitializer)\n\t{\n\t\tPrimaryActorTick.bCanEverTick = true;\n\t\tPrimaryActorTick.bTickEvenWhenPaused = true;\n\t\tMediaSoundComponent = CreateDefaultSubobject<UMediaSoundComponent>(TEXT(\"MediaSoundComponent\"));\n\t\tMediaSoundComponent->bAllowSpatialization = false;\n\t\tMediaSoundComponent->bIsUISound = true;\n\t}\n\n\tvoid RightAfterConstructorButNotInIt()\n\t{\n\t\t// Demo\n\t\tMediaSoundComponent->SetActive(true);\n\t\tMediaSoundComponent->SetTickableWhenPaused(true);\n\t\t// Role = ENetRole::ROLE_None;\n\t}\n\n\tvoid SetMediaPlayer(UMediaPlayer* MediaPlayer)\n\t{\n\t\tMediaSoundComponent->SetMediaPlayer(MediaPlayer);\n\t\tMediaSoundComponent->UpdatePlayer();\n\t}\n\n\tstatic ASoUIActorMediaAudioPlayer* SpawnInWorld(UWorld* World)\n\t{\n\t\tif (!World)\n\t\t\treturn nullptr;\n\n\t\tstatic FTransform Transform{};\n\t\tstatic FActorSpawnParameters SpawnParams;\n\t\tASoUIActorMediaAudioPlayer* This = World->SpawnActor<ThisClass>(ThisClass::StaticClass(), Transform, SpawnParams);\n\t\tThis->RightAfterConstructorButNotInIt();\n\t\treturn This;\n\t}\n\npublic:\n\tUPROPERTY(BlueprintReadOnly, Category = \">Video\")\n\tUMediaSoundComponent* MediaSoundComponent = nullptr;\n};\n"
  },
  {
    "path": "Source/SOrb/UI/General/SoUICheckbox.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#include \"SoUICheckbox.h\"\n#include \"Components/Image.h\"\n#include \"Basic/SoGameSingleton.h\"\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUICheckbox::SynchronizeProperties()\n{\n\tSuper::SynchronizeProperties();\n\tUpdateFromCurrentState();\n\n\t// Set sane default\n\tif (SFXActiveChanged == nullptr)\n\t\tSFXActiveChanged = USoGameSingleton::GetSFX(ESoSFX::SettingsValueSwitch);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUICheckbox::NativeConstruct()\n{\n\tSuper::NativeConstruct();\n\n\t// Reset\n\tSetIsHighlighted(false, false);\n\tSetIsActive(false, false);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUICheckbox::UpdateFromCurrentState()\n{\n\tif (XImage)\n\t\tXImage->SetVisibility(IsChecked() ? ESlateVisibility::Visible : ESlateVisibility::Collapsed);\n\n\tif (SelectionImage)\n\t\tSelectionImage->SetVisibility(IsHighlighted() ? ESlateVisibility::Visible : ESlateVisibility::Collapsed);\n}\n"
  },
  {
    "path": "Source/SOrb/UI/General/SoUICheckbox.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#pragma once\n\n#include \"SoUIUserWidget.h\"\n\n#include \"SoUICheckbox.generated.h\"\n\nclass UImage;\n\n/**\n * Checkbox primitive\n * NOTE: we use the bIsActive from the base widget as our bIsChecked\n */\nUCLASS(HideCategories = (\"Navigation\"))\nclass SORB_API USoUICheckbox : public USoUIUserWidget\n{\n\tGENERATED_BODY()\n\npublic:\n\t//\n\t// UUserWidget Interface\n\t//\n\tvoid SynchronizeProperties() override;\n\tvoid NativeConstruct() override;\n\n\t//\n\t// USoUIUserWidget Interface\n\t//\n\tvoid OnStateChanged() override\n\t{\n\t\tSuper::OnStateChanged();\n\t\tUpdateFromCurrentState();\n\t}\n\tbool IsValidWidget() const override\n\t{\n\t\treturn GetIsEnabled() && IsVisible();\n\t}\n\n\t//\n\t// Own Methods\n\t//\n\n\t/**  Checked/Unchecked for checkboxes */\n\tUFUNCTION(BlueprintCallable, Category = State)\n\tvoid SetIsChecked(bool bActive, bool bPlaySound = false) { SetIsActive(bActive, bPlaySound); }\n\n\tUFUNCTION(BlueprintCallable, Category = State)\n\tbool IsChecked() const { return IsActive(); }\n\n\tUFUNCTION(BlueprintCallable, Category = State)\n\tvoid UpdateFromCurrentState();\n\nprotected:\n\tUFUNCTION(BlueprintNativeEvent, BlueprintCallable, Category = State)\n\tvoid ScaleSize(float ScaleAmount);\n\tvoid ScaleSize_Implementation(float ScaleAmount) {}\n\nprotected:\n\t// The X Image. Used when IsChecked() = true\n\tUPROPERTY(BlueprintReadOnly, meta = (BindWidget))\n\tUImage* XImage = nullptr;\n\n\t// Used when bIsHighlighted = true;\n\tUPROPERTY(BlueprintReadOnly, meta = (BindWidget))\n\tUImage* SelectionImage = nullptr;\n};\n"
  },
  {
    "path": "Source/SOrb/UI/General/SoUIConfirmPanel.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#include \"SoUIConfirmPanel.h\"\n\n\n#include \"Commands/SoUICommandTooltipArray.h\"\n#include \"Buttons/SoUIButtonArray.h\"\n#include \"Buttons/SoUIButtonImageArray.h\"\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIConfirmPanel::SynchronizeProperties()\n{\n\tSuper::SynchronizeProperties();\n\tRefreshButtonsArray();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIConfirmPanel::Open_Implementation(bool bOpen)\n{\n\tif (bOpened == bOpen)\n\t\treturn;\n\n\tbOpened = bOpen;\n\tSetVisibility(bOpen ? ESlateVisibility::Visible : ESlateVisibility::Collapsed);\n\n\tif (ButtonsArray)\n\t\tButtonsArray->Highlight();\n\n\tOpenChangedEvent.Broadcast(bOpened);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUSoUIButtonArray* USoUIConfirmPanel::GetButtonArray() const\n{\n\treturn ButtonsArray;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUSoUIButtonImageArray* USoUIConfirmPanel::GetButtonArrayAsButtonImagesArray() const\n{\n\treturn Cast<USoUIButtonImageArray>(GetButtonArray());\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIConfirmPanel::UpdateEnsureOnlyTheseCommandsExist(const TArray<FSoUITextCommandPair> CommandsToBeDisplayed)\n{\n\tUSoUIButtonImageArray* ImageArray = GetButtonArrayAsButtonImagesArray();\n\tif (!ImageArray)\n\t{\n\t\tUE_LOG(LogSoUI, Error, TEXT(\"EnsureOnlyTheseCommandsExist: Not a USoUIButtonImageArray, in the widget = %s\"), *GetPathName());\n\t\treturn;\n\t}\n\n\tImageArray->UpdateEnsureOnlyTheseCommandsExist(CommandsToBeDisplayed);\n}\n"
  },
  {
    "path": "Source/SOrb/UI/General/SoUIConfirmPanel.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#pragma once\n\n#include \"Blueprint/UserWidget.h\"\n#include \"UI/General/SoUITypes.h\"\n\n#include \"SoUIConfirmPanel.generated.h\"\n\nclass USoUICommandTooltipArray;\nclass USoUIButtonArray;\nclass USoUIButtonImageArray;\n\nDECLARE_DYNAMIC_MULTICAST_DELEGATE(FSoConfirmPanelQuestionAnsweredEvent);\n\n\n/**\n * ConfirmPanel base class so that we are sure the UserWidget implements the ISoUIEventHandler\n */\nUCLASS(HideCategories = (Navigation), AutoCollapseCategories = (Performance, Clipping, Interaction, Input))\nclass SORB_API USoUIConfirmPanel : public UUserWidget, public ISoUIEventHandler\n{\n\tGENERATED_BODY()\n\npublic:\n\n\t//\n\t// UUserWidget Interface\n\t//\n\tvoid SynchronizeProperties() override;\n\n\tvoid NativeConstruct() override\n\t{\n\t\tSuper::NativeConstruct();\n\t\tSetVisibility(ESlateVisibility::Collapsed);\n\t\tbOpened = false;\n\t}\n\n\t//\n\t// ISoUIEventHandler Interface\n\t//\n\tbool OnUICommand_Implementation(ESoUICommand Command) override { return false; };\n\tvoid Open_Implementation(bool bOpen) override;\n\tbool IsOpened_Implementation() const override { return bOpened; }\n\tbool CanBeInterrupted_Implementation() const override { return true; }\n\n\t//\n\t// Own Methods\n\t//\n\n\tUFUNCTION(BlueprintPure, Category = UI)\n\tvirtual bool CanHandleUICommand() const { return ISoUIEventHandler::Execute_IsOpened(this); }\n\n\tUFUNCTION(BlueprintPure, Category = UI)\n\tUSoUIButtonArray* GetButtonArray() const;\n\n\tUFUNCTION(BlueprintPure, Category = UI)\n\tUSoUIButtonImageArray* GetButtonArrayAsButtonImagesArray() const;\n\n\tUFUNCTION(BlueprintCallable, Category = UI)\n\tvoid UpdateEnsureOnlyTheseCommandsExist(const TArray<FSoUITextCommandPair> CommandsToBeDisplayed);\n\n\tUFUNCTION(BlueprintCallable, Category = UI)\n\tvirtual void RefreshButtonsArray() {}\n\n\tUFUNCTION(BlueprintImplementableEvent, BlueprintCosmetic, Category = \">Events\", meta = (DisplayName = \"OnPressedButtonTooltipsCommand\"))\n\tbool ReceiveOnPressedButtonTooltipsCommand(ESoUICommand Command);\n\n\tUFUNCTION(BlueprintCallable, Category = \">Events\")\n\tvirtual bool OnPressedButtonTooltipsCommand(ESoUICommand Command)\n\t{\n\t\treturn ReceiveOnPressedButtonTooltipsCommand(Command);\n\t}\n\n\tFSoUIOpenChangedEvent& OnOpenChangedEvent() { return OpenChangedEvent; }\n\tFSoConfirmPanelQuestionAnsweredEvent& OnQuestionAnsweredEvent() { return QuestionAnsweredEvent; }\n\nprotected:\n\tUPROPERTY(BlueprintAssignable, Category = \">Events\")\n\tFSoUIOpenChangedEvent OpenChangedEvent;\n\n\tUPROPERTY(BlueprintAssignable, Category = \">Events\")\n\tFSoConfirmPanelQuestionAnsweredEvent QuestionAnsweredEvent;\n\n\tUPROPERTY(BlueprintReadOnly, Category = \">State\")\n\tbool bOpened = false;\n\n\t// Buttons array that can be used for example for Yes/No Buttons\n\tUPROPERTY(BlueprintReadOnly, meta = (BindWidget), Category = \">Widgets\")\n\tUSoUIButtonArray* ButtonsArray = nullptr;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = \">Behaviour\")\n\tbool bBehaveAsCommandTooltips = false;\n};\n"
  },
  {
    "path": "Source/SOrb/UI/General/SoUIContainerNamedSlot.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#include \"SoUIContainerNamedSlot.h\"\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIContainerNamedSlot::SynchronizeProperties()\n{\n\tSuper::SynchronizeProperties();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIContainerNamedSlot::NativeConstruct()\n{\n\tSuper::NativeConstruct();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIContainerNamedSlot::NativeDestruct()\n{\n\tSuper::NativeDestruct();\n}\n"
  },
  {
    "path": "Source/SOrb/UI/General/SoUIContainerNamedSlot.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#pragma once\n\n#include \"SoUIUserWidgetDeviceVisibility.h\"\n\n#include \"SoUIContainerNamedSlot.generated.h\"\n\nclass UNamedSlot;\n\n\n/**\n * Container that can contain anything but only displays that widget in case of some input\n * NOTE: this is the generalized version of USoUICommandTooltip\n */\nUCLASS()\nclass SORB_API USoUIContainerNamedSlot : public USoUIUserWidgetDeviceVisibility\n{\n\tGENERATED_BODY()\npublic:\n\t//\n\t// UUserWidget Interface\n\t//\n\tvoid SynchronizeProperties() override;\n\tvoid NativeConstruct() override;\n\tvoid NativeDestruct() override;\n\nprotected:\n\t// The slot we want our widget to be in\n\tUPROPERTY(BlueprintReadWrite, meta = (BindWidget))\n\tUNamedSlot* NamedSlot = nullptr;\n};\n"
  },
  {
    "path": "Source/SOrb/UI/General/SoUIExternalLink.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#include \"SoUIExternalLink.h\"\n#include \"Basic/Helpers/SoPlatformHelper.h\"\n#include \"Components/TextBlock.h\"\n#include \"Components/Image.h\"\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUSoUIExternalLink::USoUIExternalLink(const FObjectInitializer& ObjectInitializer)\n{\n\tbIsActive = true;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIExternalLink::SynchronizeProperties()\n{\n\tSuper::SynchronizeProperties();\n\n\tbIsActive = true;\n\tUpdateFromCurrentState();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIExternalLink::NativeConstruct()\n{\n\tSuper::NativeConstruct();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIExternalLink::NativeDestruct()\n{\n\tSuper::NativeDestruct();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIExternalLink::UpdateFromCurrentState()\n{\n\tif (!TextElement || !ImageElement)\n\t\treturn;\n\n\tTextElement->SetText(Text);\n\tImageElement->SetBrushFromTexture(Image);\n\n\tif (IsHighlighted())\n\t{\n\t\tTextElement->SetVisibility(ESlateVisibility::Visible);\n\t\tTextElement->SetOpacity(OpacityHighlighted);\n\t\tImageElement->SetOpacity(OpacityHighlighted);\n\t}\n\telse\n\t{\n\t\tif (!bAlwaysShowText)\n\t\t\tTextElement->SetVisibility(ESlateVisibility::Collapsed);\n\n\t\tImageElement->SetOpacity(OpacityUnHighlighted);\n\t\tTextElement->SetOpacity(OpacityUnHighlighted);\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoUIExternalLink::NavigateOnPressed(bool bPlaySound)\n{\n\tSuper::NavigateOnPressed(bPlaySound);\n\tOpenLink();\n\treturn true;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIExternalLink::OnStateChanged()\n{\n\tSuper::OnStateChanged();\n\tUpdateFromCurrentState();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIExternalLink::OpenLink()\n{\n\tif (OpenLinkEventCPP.IsBound())\n\t{\n\t\tOpenLinkEventCPP.Execute();\n\t}\n\telse\n\t{\n\t\tUSoPlatformHelper::LaunchURL(ExternalLink, bCopyExternalLinkIntoClipboard);\n\t}\n}\n"
  },
  {
    "path": "Source/SOrb/UI/General/SoUIExternalLink.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#pragma once\n\n#include \"CoreMinimal.h\"\n#include \"SoUIUserWidget.h\"\n\n#include \"SoUIExternalLink.generated.h\"\n\nclass UTextBlock;\nclass UImage;\nclass UTexture2D;\n\n\nDECLARE_DELEGATE(FSoOpenLinkEventCPP);\n\n\nUCLASS()\nclass SORB_API USoUIExternalLink : public USoUIUserWidget\n{\n\tGENERATED_BODY()\npublic:\n\tUSoUIExternalLink(const FObjectInitializer& ObjectInitializer);\n\n\t//\n\t// UUserWidget Interface\n\t//\n\tvoid SynchronizeProperties() override;\n\tvoid NativeConstruct() override;\n\tvoid NativeDestruct() override;\n\n\t//\n\t// Own methods\n\t//\n\n\tUFUNCTION(BlueprintCallable, Category = \">State\")\n\tvirtual void UpdateFromCurrentState();\n\n\tUFUNCTION(BlueprintCallable, Category = \">ExternalLink\")\n\tvirtual void OpenLink();\n\n\t//\n\t// USoUIUserWidget interface\n\t//\n\tbool NavigateOnPressed(bool bPlaySound = true) override;\n\tvoid OnStateChanged() override;\n\n\t// NOTE: left empty on purpose as we are not using the active state\n\tvoid SetIsActive(bool bActive, bool bPlaySound = false) override {}\n\n\t// Is enabled and visible\n\tbool IsValidWidget() const override { return GetIsEnabled() && IsVisible(); }\n\n\tFSoOpenLinkEventCPP& OnOpenLinkEvent() { return OpenLinkEventCPP; }\n\nprotected:\n\tUPROPERTY(BlueprintReadWrite, meta = (BindWidget))\n\tUImage* ImageElement = nullptr;\n\n\tUPROPERTY(BlueprintReadWrite, meta = (BindWidget))\n\tUTextBlock* TextElement = nullptr;\n\n\t// Image to display\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = \">ExternalLink\")\n\tUTexture2D* Image;\n\n\t// Text to display under image\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = \">ExternalLink\")\n\tFText Text;\n\n\t// Text should always show?\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = \">ExternalLink\")\n\tbool bAlwaysShowText = false;\n\n\t// Default, when this is selected\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = \">ExternalLink\", meta = (ClampMin = \"0.0\", ClampMax = \"1.0\"))\n\tfloat OpacityHighlighted = 1.f;\n\n\t// When not selected\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = \">ExternalLink\", meta = (ClampMin = \"0.0\", ClampMax = \"1.0\"))\n\tfloat OpacityUnHighlighted = 0.5f;\n\n\t// Where does this go\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = \">ExternalLink\")\n\tFString ExternalLink;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = \">ExternalLink\")\n\tbool bCopyExternalLinkIntoClipboard = false;\n\n\t// If you override this the default thing won't happen\n\tFSoOpenLinkEventCPP OpenLinkEventCPP;\n};\n"
  },
  {
    "path": "Source/SOrb/UI/General/SoUIPressAndHoldConfirmation.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#include \"SoUIPressAndHoldConfirmation.h\"\n\n#include \"Components/Image.h\"\n#include \"Components/TextBlock.h\"\n#include \"Materials/MaterialInstanceDynamic.h\"\n\n#include \"UI/SoUIHelper.h\"\n#include \"Basic/SoAudioManager.h\"\n\n#include \"Settings/Input/SoInputHelper.h\"\n#include \"Character/SoPlayerController.h\"\n#include \"Character/SoCharacter.h\"\n#include \"Basic/Helpers/SoStaticHelper.h\"\n#include \"Basic/SoGameSingleton.h\"\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIPressAndHoldConfirmation::NativeConstruct()\n{\n\tSuper::NativeConstruct();\n\n\tif (ASoPlayerController* Controller = USoUIHelper::GetSoPlayerControllerFromUWidget(this))\n\t\tController->OnDeviceTypeChanged().AddDynamic(this, &ThisClass::HandleDeviceTypeChanged);\n\n\tUpdateImageTexture(USoInputHelper::GetCurrentDeviceType(this));\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIPressAndHoldConfirmation::NativeDestruct()\n{\n\tif (ASoPlayerController* Controller = USoUIHelper::GetSoPlayerControllerFromUWidget(this))\n\t\tController->OnDeviceTypeChanged().RemoveDynamic(this, &ThisClass::HandleDeviceTypeChanged);\n\n\tSuper::NativeDestruct();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIPressAndHoldConfirmation::NativeTick(const FGeometry& MyGeometry, float InDeltaTime)\n{\n\tSuper::NativeTick(MyGeometry, InDeltaTime);\n\n\tif (ASoCharacter* SoChar = USoStaticHelper::GetPlayerCharacterAsSoCharacter(this))\n\t{\n\t\tconst bool bConfirmPressed = bConfirmationEnabled &&\n\t\t\t(SoChar->IsUIInputPressed(ESoUICommand::EUC_MainMenuEnter) ||\n\t\t\t (bAlsoAcceptMainMenuBack && SoChar->IsUIInputPressed(ESoUICommand::EUC_MainMenuBack)));\n\t\tif (bConfirmPressed)\n\t\t\tConfirmCounter = FMath::Max(ConfirmCounter, 0.0f);\n\n\t\tconst bool bUpdateMaterial = ((bConfirmPressed && ConfirmCounter < 1.0f) ||\n\t\t\t\t\t\t\t\t\t  (!bConfirmPressed && ConfirmCounter > 0.0f));\n\n\n\t\tif (!bConfirmed)\n\t\t{\n\t\t\tConfirmCounter += InDeltaTime * (bConfirmPressed ? 1 : -1);\n\t\t\tif (bConfirmPressed)\n\t\t\t{\n\t\t\t\tif (Instance == nullptr && SFXProgress != nullptr)\n\t\t\t\t{\n\t\t\t\t\tInstance = USoAudioManager::PlaySound2D(this, SFXProgress, false).Instance;\n\t\t\t\t\tif (Instance != nullptr)\n\t\t\t\t\t\tInstance->start();\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t\tStopSFX();\n\t\t}\n\n\t\tif (bUpdateMaterial)\n\t\t{\n\t\t\tSetPercent(FMath::Clamp(ConfirmCounter, 0.0f, 1.0f));\n\t\t\tif (!bElementsVisible)\n\t\t\t\tUpdateVisibility(true, false);\n\t\t}\n\n\t\tif (!bConfirmed && ConfirmCounter >= 1.0f)\n\t\t{\n\t\t\tbConfirmed = true;\n\t\t\tConfirmed.Broadcast();\n\t\t\tStopSFX();\n\t\t\tif (SFXDone != nullptr)\n\t\t\t\tUSoAudioManager::PlaySound2D(this, SFXDone, true);\n\n\t\t\tif (bHideIfNotPressed && bElementsVisible)\n\t\t\t\tUpdateVisibility(false, false);\n\t\t}\n\t\telse if (ConfirmCounter < -0.5f && bHideIfNotPressed && bElementsVisible)\n\t\t{\n\t\t\tUpdateVisibility(false, false);\n\t\t}\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIPressAndHoldConfirmation::Reinitialize()\n{\n\tConfirmCounter = 0.0f;\n\tSetPercent(0.0f);\n\tbConfirmed = false;\n\n\tif (ASoCharacter* SoChar = USoStaticHelper::GetPlayerCharacterAsSoCharacter(this))\n\t\tUpdateVisibility(!bHideIfNotPressed || SoChar->IsUIInputPressed(ESoUICommand::EUC_MainMenuEnter), true);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIPressAndHoldConfirmation::StopSFX()\n{\n\tif (Instance != nullptr)\n\t{\n\t\tFMOD_STUDIO_PLAYBACK_STATE State;\n\t\tInstance->getPlaybackState(&State);\n\t\tif (State == FMOD_STUDIO_PLAYBACK_STATE::FMOD_STUDIO_PLAYBACK_PLAYING)\n\t\t\tInstance->stop(FMOD_STUDIO_STOP_ALLOWFADEOUT);\n\n\t\tInstance->release();\n\t\tInstance = nullptr;\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIPressAndHoldConfirmation::SetPercent(float Percent)\n{\n\tif (UMaterialInstanceDynamic* DynamicMaterial = CommandImageProgressBar->GetDynamicMaterial())\n\t{\n\t\tstatic const FName PercentParamName = FName(\"Percent\");\n\t\tDynamicMaterial->SetScalarParameterValue(PercentParamName, Percent);\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIPressAndHoldConfirmation::UpdateImageTexture(ESoInputDeviceType DeviceType)\n{\n\tconst bool bKeyboard = DeviceType == ESoInputDeviceType::Keyboard;\n\tif (bKeyboard)\n\t{\n\t\tCommandImage->SetBrushSize(FVector2D(64.0f, 32.0f));\n\t\tCommandImageProgressBar->SetBrushSize(FVector2D(72.0f, 42.0f));\n\t}\n\telse\n\t{\n\t\tCommandImage->SetBrushSize(FVector2D(48.0f, 48.0f));\n\t\tCommandImageProgressBar->SetBrushSize(FVector2D(56.0f, 56.0f));\n\t}\n\n\tCommandImage->SetBrushFromTexture(USoGameSingleton::GetIconForUICommand(ESoUICommand::EUC_MainMenuEnter, DeviceType, {}));\n\n\tif (UMaterialInstanceDynamic* DynamicMaterial = CommandImageProgressBar->GetDynamicMaterial())\n\t{\n\t\tstatic const FName TextureParamName = FName(\"Texture\");\n\t\tDynamicMaterial->SetTextureParameterValue(TextureParamName, bKeyboard ? ProgressImgKeyboard : ProgressImgGamepad);\n\t}\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIPressAndHoldConfirmation::UpdateVisibility(bool bShow, bool bInstantChange)\n{\n\tPlayFadeAnimation(bShow, bInstantChange);\n\tbElementsVisible = bShow;\n\n\tif (!bShow)\n\t\tStopSFX();\n}\n"
  },
  {
    "path": "Source/SOrb/UI/General/SoUIPressAndHoldConfirmation.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#pragma once\n\n#include \"CoreMinimal.h\"\n#include \"Blueprint/UserWidget.h\"\n\n#include \"SoUITypes.h\"\n#include \"Settings/Input/SoInputSettingsTypes.h\"\n\n#include \"SoUIPressAndHoldConfirmation.generated.h\"\n\n\nclass UImage;\nclass UTextBlock;\nclass UFMODEvent;\n\nnamespace FMOD\n{\nnamespace Studio\n{\n\tclass EventInstance;\n}\n}\n\nDECLARE_DYNAMIC_MULTICAST_DELEGATE(FSoConfirmation);\n\n\n/**\n *  A main menu enter tip with a circular(console) or quadratic(keyboard) loading bar.\n *\n *  Fires an event if it has been pressed for a duration\n */\nUCLASS(HideCategories = (Navigation), AutoCollapseCategories = (Performance, Clipping, Interaction, Input))\nclass SORB_API USoUIPressAndHoldConfirmation : public UUserWidget\n{\n\tGENERATED_BODY()\n\npublic:\n\n\t//\n\t// UUserWidget Interface\n\t//\n\tvoid NativeConstruct() override;\n\tvoid NativeDestruct() override;\n\tvoid NativeTick(const FGeometry& MyGeometry, float InDeltaTime) override;\n\n\t//\n\t// Own Methods\n\t//\n\n\t// Confirmed\n\tFSoConfirmation& OnConfirmed() { return Confirmed; }\n\n\tUFUNCTION(BlueprintCallable)\n\tvoid Reinitialize();\n\n\tbool IsConfirmed() const { return bConfirmed; }\n\n\tUFUNCTION(BlueprintCallable)\n\tvoid SetConfirmationEnabled(bool bEnabled) { bConfirmationEnabled = bEnabled; }\n\n\nprotected:\n\n\tvoid StopSFX();\n\n\t// Only update local so that we do not update the image, that is done already\n\tUFUNCTION(BlueprintCallable)\n\tvoid UpdateImageTexture(ESoInputDeviceType DeviceType);\n\n\tUFUNCTION(BlueprintImplementableEvent)\n\tvoid PlayFadeAnimation(bool bShow, bool bInstantChange);\n\n\tUFUNCTION()\n\tvoid HandleDeviceTypeChanged(ESoInputDeviceType InDeviceType)\n\t{\n\t\tUpdateImageTexture(InDeviceType);\n\t}\n\n\tvoid SetPercent(float Percent);\n\n\tUFUNCTION(BlueprintCallable)\n\tvoid UpdateVisibility(bool bShow, bool bInstantChange);\n\nprotected:\n\n\tUPROPERTY(BlueprintAssignable, Category = \">Events\")\n\tFSoConfirmation Confirmed;\n\n\n\tUPROPERTY(BlueprintReadWrite, meta = (BindWidget))\n\tUImage* CommandImage;\n\n\tUPROPERTY(BlueprintReadWrite, meta = (BindWidget))\n\tUImage* CommandImageProgressBar;\n\n\tUPROPERTY(BlueprintReadWrite, meta = (BindWidget))\n\tUTextBlock* SkipText;\n\n\n\tUPROPERTY(EditAnywhere)\n\tUTexture2D* ProgressImgKeyboard;\n\n\tUPROPERTY(EditAnywhere)\n\tUTexture2D* ProgressImgGamepad;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadOnly)\n\tbool bHideIfNotPressed = false;\n\n\tUPROPERTY(EditAnywhere)\n\tfloat ConfirmDuration = 1.0f;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadOnly)\n\tbool bAlsoAcceptMainMenuBack = false;\n\n\tfloat ConfirmCounter = 0.0f;\n\n\tbool bElementsVisible = true;\n\n\tbool bConfirmed = false;\n\n\tbool bConfirmationEnabled = true;\n\n\n\tUPROPERTY(EditAnywhere, Category = SFX)\n\tUFMODEvent* SFXProgress = nullptr;\n\n\tUPROPERTY(EditAnywhere, Category = SFX)\n\tUFMODEvent* SFXDone = nullptr;\n\n\tFMOD::Studio::EventInstance* Instance = nullptr;\n};\n"
  },
  {
    "path": "Source/SOrb/UI/General/SoUISlider.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#include \"SoUISlider.h\"\n\n#include \"Components/TextBlock.h\"\n#include \"Components/Slider.h\"\n\n#include \"Localization/SoLocalization.h\"\n#include \"Character/SoCharacter.h\"\n#include \"Basic/Helpers/SoStaticHelper.h\"\n#include \"UI/SoUIHelper.h\"\n#include \"Basic/SoGameSingleton.h\"\n#include \"Basic/SoAudioManager.h\"\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUSoUISlider::USoUISlider(const FObjectInitializer& ObjectInitializer)\n{\n\tbIsActive = true;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISlider::SynchronizeProperties()\n{\n\tSuper::SynchronizeProperties();\n\n\tif (bSFXSetDefault && SFXValueChanged == nullptr)\n\t\tSFXValueChanged = USoGameSingleton::GetSFX(ESoSFX::SettingsValueSwitch);\n\n\tbIsActive = true;\n\tSetStepSize(StepSize);\n\tUpdateValueText();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISlider::NativeTick(const FGeometry& MyGeometry, float InDeltaTime)\n{\n\tSuper::NativeTick(MyGeometry, InDeltaTime);\n\tif (!bTrackPressedInput)\n\t\treturn;\n\n\tif (!SoCharacter || !IsValidWidget() || !IsHighlighted() || !SoCharacter->IsAnyUIInputPressed())\n\t{\n\t\tTrackedInput.Reset();\n\t\treturn;\n\t}\n\n\t// Pressed left/right change value\n\tTrackedInput.Tick(InDeltaTime, [&]()\n\t{\n\t\tif (SoCharacter->AreAnyUIInputsPressed({ ESoUICommand::EUC_Left, ESoUICommand::EUC_MainMenuLeft }))\n\t\t\tNavigate(ESoUICommand::EUC_Left, false);\n\t\telse if (SoCharacter->AreAnyUIInputsPressed({ ESoUICommand::EUC_Right, ESoUICommand::EUC_MainMenuRight }))\n\t\t\tNavigate(ESoUICommand::EUC_Right, false);\n\t});\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISlider::NativeConstruct()\n{\n\tSuper::NativeConstruct();\n\n\tSoCharacter = USoStaticHelper::GetPlayerCharacterAsSoCharacter(this);\n\tif (Slider)\n\t{\n\t\tSlider->OnMouseCaptureBegin.AddDynamic(this, &ThisClass::HandleOnMouseCaptureBegin);\n\t\tSlider->OnMouseCaptureEnd.AddDynamic(this, &ThisClass::HandleOnMouseCaptureEnd);\n\t\tSlider->OnControllerCaptureBegin.AddDynamic(this, &ThisClass::HandleOnControllerCaptureBegin);\n\t\tSlider->OnControllerCaptureEnd.AddDynamic(this, &ThisClass::HandleOnControllerCaptureEnd);\n\t\tSlider->OnValueChanged.AddDynamic(this, &ThisClass::HandleUSliderOnValueChanged);\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISlider::NativeDestruct()\n{\n\tif (Slider)\n\t{\n\t\tSlider->OnMouseCaptureBegin.RemoveDynamic(this, &ThisClass::HandleOnMouseCaptureBegin);\n\t\tSlider->OnMouseCaptureEnd.RemoveDynamic(this, &ThisClass::HandleOnMouseCaptureEnd);\n\t\tSlider->OnControllerCaptureBegin.RemoveDynamic(this, &ThisClass::HandleOnControllerCaptureBegin);\n\t\tSlider->OnControllerCaptureEnd.RemoveDynamic(this, &ThisClass::HandleOnControllerCaptureEnd);\n\t\tSlider->OnValueChanged.RemoveDynamic(this, &ThisClass::HandleUSliderOnValueChanged);\n\t}\n\tSuper::NativeDestruct();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoUISlider::Navigate(ESoUICommand Command, bool bPlaySound)\n{\n\t// Ignore navigation, widget is disabled\n\tif (!IsValidWidget())\n\t\treturn false;\n\n\tbool bChanged = false;\n\tCommand = USoUIHelper::TryTranslateMenuCommandDirectionToGame(Command);\n\tif (Command == ESoUICommand::EUC_Left)\n\t\tbChanged = SetValue(GetValue() - StepSize, bPlaySound);\n\telse if (Command == ESoUICommand::EUC_Right)\n\t\tbChanged = SetValue(GetValue() + StepSize, bPlaySound);\n\n\treturn bChanged;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nfloat USoUISlider::GetValueNormalized() const\n{\n\treturn Slider ? Slider->GetValue() : 0.f;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nfloat USoUISlider::GetValue() const\n{\n\treturn GetValueInDisplayRangeFromNormalizedValue(GetValueNormalized());\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISlider::SetStepSizeNormalized(float InValueNormalized)\n{\n\t// Normalized to MaxDisplayValue\n\tStepSize = FMath::Lerp(0.f, MaxDisplayValue, InValueNormalized);\n\n\t// SSlider is normalized to 1.f\n\tInValueNormalized = FMath::Clamp(InValueNormalized, 0.f, 1.f);\n\tif (Slider)\n\t\tSlider->SetStepSize(InValueNormalized);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISlider::SetStepSize(float InValue)\n{\n\tSetStepSizeNormalized(InValue / MaxDisplayValue);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoUISlider::SetValueNormalized(float InValueNormalized, bool bPlaySound)\n{\n\t// SSlider is normalized to 1.f\n\tInValueNormalized = FMath::Clamp(InValueNormalized, 0.f, 1.f);\n\n\t// Snap to snap multiplier\n\tconst int32 CurrentPercentValue = FMath::RoundToInt(GetValueInDisplayRangeFromNormalizedValue(InValueNormalized));\n\tconst int32 Remainder = CurrentPercentValue % SnapMultiplier;\n\tif (Remainder != 0)\n\t{\n\t\t// Must snap, to the next value in range\n\t\tconst int32 DifferenceUntilSnap = SnapMultiplier - Remainder;\n\t\tInValueNormalized = GetNormalizedValueFromDisplayRange(CurrentPercentValue + DifferenceUntilSnap);\n\t}\n\n\t// If successful it will call HandleUSliderOnValueChanged\n\tif (Slider)\n\t\tSlider->SetValue(InValueNormalized);\n\n\treturn OnNewValueSet(bPlaySound);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoUISlider::SetValue(float InValue, bool bPlaySound)\n{\n\treturn SetValueNormalized(GetNormalizedValueFromDisplayRange(InValue), bPlaySound);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISlider::OnStateChanged()\n{\n\tSuper::OnStateChanged();\n\tUpdateValueText();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISlider::UpdateValueText()\n{\n\tif (!ValueText)\n\t\treturn;\n\n\tValueText->SetVisibility(ESlateVisibility::Visible);\n\tswitch (ValueType)\n\t{\n\tcase ESoUISliderValueType::Percentage:\n\t{\n\t\t// ValueText->SetText(\n\t\t// \tFText::AsPercent(GetValueNormalized(),  &FNumberFormattingOptions::DefaultNoGrouping())\n\t\t// );\n\t\t// TODO Maybe use as percent?\n\t\tconst int32 Number = FMath::RoundToInt(GetValue());\n\t\tFFormatOrderedArguments Arguments;\n\t\tArguments.Add(FText::AsNumber(Number));\n\t\tValueText->SetText(FText::Format(FText::FromString(TEXT(\"{0}%\")), Arguments));\n\t\tbreak;\n\t}\n\tcase ESoUISliderValueType::Hidden:\n\t\tValueText->SetVisibility(ESlateVisibility::Collapsed);\n\t\tbreak;\n\n\tcase ESoUISliderValueType::FloatValue:\n\t{\n\t\tValueText->SetText(FText::AsNumber(GetValue()));\n\t\tbreak;\n\t}\n\tcase ESoUISliderValueType::FloatValueNormalized:\n\t{\n\t\tValueText->SetText(FText::AsNumber(GetValueNormalized()));\n\t\tbreak;\n\t}\n\tdefault:\n\t\tbreak;\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoUISlider::OnNewValueSet(bool bPlaySound)\n{\n\t// Value changed?\n\tconst float NewValue = GetValueNormalized();\n\tconst bool bChanged = !FMath::IsNearlyEqual(PreviousBroadcastedValue, NewValue, KINDA_SMALL_NUMBER);\n\n\t// Play sound\n\tif (bPlaySound && bChanged)\n\t\tUSoAudioManager::PlaySound2D(this, SFXValueChanged);\n\n\t// Update values\n\tif (bChanged)\n\t{\n\t\tUpdateValueText();\n\n\t\t// Broadcast to listeners the new value\n\t\tValueChangedEvent.Broadcast(NewValue);\n\t\tPreviousBroadcastedValue = NewValue;\n\t}\n\n\treturn bChanged;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISlider::HandleOnMouseCaptureBegin()\n{\n\t//UE_LOG(LogTemp, Warning, TEXT(\"OnMouseCaptureBegin\"));\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISlider::HandleOnMouseCaptureEnd()\n{\n\t//UE_LOG(LogTemp, Warning, TEXT(\"HandleOnMouseCaptureEnd\"));\n\n\t// Snap to correct value\n\tSetValueNormalized(GetValueNormalized(), true);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISlider::HandleUSliderOnValueChanged(float InValue)\n{\n\t//UE_LOG(LogTemp, Warning, TEXT(\"HandleUSliderOnValueChanged: %f\"), InValue);\n\tOnNewValueSet(true);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISlider::HandleOnControllerCaptureBegin()\n{\n\t// NOTE: not used as we handle it in Navigate\n\t// UE_LOG(LogTemp, Warning, TEXT(\"HandleOnControllerCaptureBegin\"));\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISlider::HandleOnControllerCaptureEnd()\n{\n\t// NOTE: not used as we handle it in Navigate\n\t// UE_LOG(LogTemp, Warning, TEXT(\"HandleOnControllerCaptureEnd\"));\n\tSetValueNormalized(GetValueNormalized(), true);\n}\n"
  },
  {
    "path": "Source/SOrb/UI/General/SoUISlider.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#pragma once\n\n#include \"CoreMinimal.h\"\n#include \"SoUIUserWidget.h\"\n\n#include \"SoUITypes.h\"\n#include \"Components/Slider.h\"\n\n#include \"SoUISlider.generated.h\"\n\n\nclass UTextBlock;\nclass USlider;\nclass ASoCharacter;\n\n\nUENUM(BlueprintType)\nenum class ESoUISliderValueType : uint8\n{\n\tPercentage = 0,\n\n\t// Do not display the value\n\tHidden,\n\n\t// The float value, Same as Percentage only without the %\n\tFloatValue,\n\n\t// The normalized value\n\tFloatValueNormalized,\n};\n\n/**\n * Slider Element that also has a text box widget besides it\n * [slider][text percentage]\n */\nUCLASS()\nclass SORB_API USoUISlider : public USoUIUserWidget\n{\n\tGENERATED_BODY()\n\npublic:\n\tUSoUISlider(const FObjectInitializer& ObjectInitializer);\n\n\t//\n\t// UUserWidget Interface\n\t//\n\tvoid SynchronizeProperties() override;\n\tvoid NativeTick(const FGeometry& MyGeometry, float InDeltaTime) override;\n\tvoid NativeConstruct() override;\n\tvoid NativeDestruct() override;\n\n\n\t//\n\t// USoUIUserWidget interface\n\t//\n\n\t// NOTE: left empty on purpose as we are not using the active state\n\tvoid SetIsActive(bool bActive, bool bPlaySound = false) override {}\n\tbool IsValidWidget() const override { return GetIsEnabled() && IsVisible(); }\n\tvoid OnStateChanged() override;\n\n\t//\n\t// Own methods\n\t//\n\n\t/** Move the slider by using navigation. */\n\tbool Navigate(ESoUICommand Command, bool bPlaySound = true) override;\n\n\t/** Gets the current value of the slider between [0, 1] */\n\tUFUNCTION(BlueprintPure, Category = Data)\n\tfloat GetValueNormalized() const;\n\n\t/** Gets the current value as a percent between [0, 100] */\n\tUFUNCTION(BlueprintPure, Category = Data)\n\tfloat GetValue() const;\n\n\t/** Sets the amount to adjust the value by, when using a controller or keyboard */\n\tUFUNCTION(BlueprintCallable, Category = Data)\n\tvoid SetStepSizeNormalized(float InValueNormalized);\n\n\t/** Set step size in the normal display range. */\n\tUFUNCTION(BlueprintCallable, Category = Data)\n\tvoid SetStepSize(float InValue);\n\n\t/** Sets the current value (between [0, 1]) of the slider. Returns true if value changed. */\n\tUFUNCTION(BlueprintCallable, Category = Data)\n\tbool SetValueNormalized(float InValueNormalized, bool bPlaySound = false);\n\n\t/** Sets the current value (between [MinDisplayValue, MaxDisplayValue]) of the slider.*/\n\tUFUNCTION(BlueprintCallable, Category = Data)\n\tbool SetValue(float InValue, bool bPlaySound = false);\n\n\t/** Sets the Percentage text min/max displayed values ranges.  */\n\tvoid SetRangeTextDisplayValues(float Min, float Max)\n\t{\n\t\tMinDisplayValue = Min;\n\t\tMaxDisplayValue = Max;\n\t}\n\n\tThisClass* SetTrackPressedInput(bool bEnable)\n\t{\n\t\tbTrackPressedInput = bEnable;\n\t\treturn this;\n\t}\n\n\tFOnFloatValueChangedEvent& OnValueChangedEvent() { return ValueChangedEvent; }\n\nprotected:\n\n\n\t// Listen to USlider events\n\tUFUNCTION()\n\tvoid HandleOnMouseCaptureBegin();\n\tUFUNCTION()\n\tvoid HandleOnMouseCaptureEnd();\n\tUFUNCTION()\n\tvoid HandleOnControllerCaptureBegin();\n\tUFUNCTION()\n\tvoid HandleOnControllerCaptureEnd();\n\tUFUNCTION()\n\tvoid HandleUSliderOnValueChanged(float InValue);\n\n\t// Gets a valid value in range for the provided normalized value\n\tfloat GetValueInDisplayRangeFromNormalizedValue(float NormalizedValue) const\n\t{\n\t\treturn FMath::Lerp(MinDisplayValue, MaxDisplayValue, FMath::Clamp(NormalizedValue, 0.f, 1.f));\n\t}\n\n\t// Gets the normalized value for this range value, opposite of GetValueInDisplayRange\n\tfloat GetNormalizedValueFromDisplayRange(float ValueInRange) const\n\t{\n\t\treturn (ValueInRange - MinDisplayValue) / (MaxDisplayValue - MinDisplayValue);\n\t}\n\n\tvoid UpdateValueText();\n\n\t// Return true if value was changed\n\tbool OnNewValueSet(bool bPlaySound);\n\nprotected:\n\tUPROPERTY(BlueprintAssignable, Category = \">Events\")\n\tFOnFloatValueChangedEvent ValueChangedEvent;\n\n\t/** The Value text element */\n\tUPROPERTY(BlueprintReadOnly, meta = (BindWidget))\n\tUTextBlock* ValueText = nullptr;\n\n\t/** The actual slider */\n\tUPROPERTY(BlueprintReadOnly, meta = (BindWidget))\n\tUSlider* Slider = nullptr;\n\n\t// How should we display the value\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = \">Slider\")\n\tESoUISliderValueType ValueType = ESoUISliderValueType::Percentage;\n\n\t// Should be in range [0, MaxDisplayValue]\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = \">Slider\")\n\tfloat StepSize = 1.f;\n\n\t// At what value multiple of this should the slider snap at.\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = \">Slider\")\n\tint32 SnapMultiplier = 1;\n\n\t// The minimum displayed value, used for the PercentageText\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = \">Slider\")\n\tfloat MinDisplayValue = 0.f;\n\n\t// The maximum displayed value, used for the PercentageText\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = \">Slider\")\n\tfloat MaxDisplayValue = 100.f;\n\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = \">Slider\")\n\tFSoUITrackedInputKeyDown TrackedInput;\n\n\t// Enable moving navigation if a certain button is pressed\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = \">Input\")\n\tbool bTrackPressedInput = true;\n\n\t// Keep track of the previous broadcasted value to know if we can broadcast now too\n\tfloat PreviousBroadcastedValue = -1.f;\n\n\n\t//\n\t// SFX\n\t//\n\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere, Category = \">SFX\")\n\tbool bSFXSetDefault = true;\n\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere, Category = \">SFX\")\n\tUFMODEvent* SFXValueChanged = nullptr;\n\n\t//\n\t// Cached\n\t//\n\n\tUPROPERTY()\n\tASoCharacter* SoCharacter = nullptr;\n};\n"
  },
  {
    "path": "Source/SOrb/UI/General/SoUISteamExternalLink.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#include \"SoUISteamExternalLink.h\"\n#include \"Basic/Helpers/SoPlatformHelper.h\"\n#include \"Components/TextBlock.h\"\n#include \"Components/Image.h\"\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISteamExternalLink::SynchronizeProperties()\n{\n\tSuper::SynchronizeProperties();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISteamExternalLink::NativeConstruct()\n{\n\tSuper::NativeConstruct();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISteamExternalLink::NativeDestruct()\n{\n\tSuper::NativeDestruct();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISteamExternalLink::OpenLink()\n{\n#if WARRIORB_WITH_STEAM\n\tif (USoPlatformHelper::IsSteamInitialized() && !USoPlatformHelper::IsSteamBuildPirated())\n\t{\n\t\tif (USoPlatformHelper::OpenSteamOverlayToStore(ExternalAppId, bAddToCart, bShowCart))\n\t\t{\n\t\t\treturn;\n\t\t}\n\t}\n#endif\n\n\t// Fallback to open link\n\tSuper::OpenLink();\n}\n"
  },
  {
    "path": "Source/SOrb/UI/General/SoUISteamExternalLink.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#pragma once\n\n#include \"CoreMinimal.h\"\n#include \"SoUIUserWidget.h\"\n#include \"SoUIExternalLink.h\"\n\n#include \"SoUISteamExternalLink.generated.h\"\n\nclass UTextBlock;\nclass UImage;\nclass UTexture2D;\n\n\nUCLASS()\nclass SORB_API USoUISteamExternalLink : public USoUIExternalLink\n{\n\tGENERATED_BODY()\npublic:\n\t//\n\t// UUserWidget Interface\n\t//\n\tvoid SynchronizeProperties() override;\n\tvoid NativeConstruct() override;\n\tvoid NativeDestruct() override;\n\n\t//\n\t// USoUIExternalLink interface\n\t//\n\tvoid OpenLink() override;\n\npublic:\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = \">Steam\")\n\tint32 ExternalAppId = 0;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = \">Steam\")\n\tbool bAddToCart = true;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = \">Steam\")\n\tbool bShowCart = true;\n};\n"
  },
  {
    "path": "Source/SOrb/UI/General/SoUITypes.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#include \"SoUITypes.h\"\n#include \"Basic/Helpers/SoDateTimeHelper.h\"\n\nDEFINE_LOG_CATEGORY(LogSoUI);\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUSoUIEventHandler::USoUIEventHandler(const FObjectInitializer& PCIP)\n\t: Super(PCIP)\n{\n\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nfloat FSoUITrackedInputKeyDown::GetKeyDownThresholdSeconds() const\n{\n\treturn USoDateTimeHelper::NormalizeTime(KeyDownThresholdSeconds);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nfloat FSoUITrackedInputKeyDown::GetKeyDownThresholdDelaySeconds() const\n{\n\treturn USoDateTimeHelper::NormalizeTime(KeyDownThresholdDelaySeconds);\n}\n"
  },
  {
    "path": "Source/SOrb/UI/General/SoUITypes.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#pragma once\n#include \"CoreMinimal.h\"\n#include \"UObject/Interface.h\"\n\n#include \"Delegates/DelegateCombinations.h\"\n#include \"Items/SoItemTypes.h\"\n#include \"CharacterBase/SoIMortalTypes.h\"\n\n#include \"SoUITypes.generated.h\"\n\nDECLARE_LOG_CATEGORY_EXTERN(LogSoUI, Log, All);\n// DECLARE_LOG_CATEGORY_EXTERN(LogSoUI, All, All);\n\nclass UUserWidget;\nclass USoUIUserWidget;\nclass USoUIUserWidgetArray;\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// Input for the UI\n// to create a new event a new entry has to be added here, and an event has to be created with the proper name\n// name is e.g. \"Left\" from EUC_Left, and also Action2 from both EUC_Action2 and EUC_RAction2\n// See ASoCharacter::SetupPlayerInputComponent for setup of these commands\n//\n//\n// EUC_Left/EUC_Right - are used in game but also in the UI\n//\t\t\t\t\t  - sync with EUC_MainMenuLeft/EUC_MainMenuRight if modified\n// EUC_Up/EUC_Down  - are only used in the ui\n//\t\t\t\t  - sync with EUC_MainMenuUp/EUC_MainMenuDown if modified\nUENUM(BlueprintType)\nenum class ESoUICommand : uint8\n{\n\t// first commands supports input binding (action pressed events)\n\n\t// navigation in panels (has to stay with value 0..3, because stuff is indexed with it)\n\t// NOTE: left/right is also used for the in game input to move left or right ;)\n\tEUC_Left = 0\t\t\tUMETA(DisplayName = \"Left\"),\n\tEUC_Right\t\t\t\tUMETA(DisplayName = \"Right\"),\n\tEUC_Up\t\t\t\t\tUMETA(DisplayName = \"Up\"),\n\tEUC_Down\t\t\t\tUMETA(DisplayName = \"Down\"),\n\n\t// top level left/right command, most likely q/e on keyboard\n\tEUC_TopLeft\t\t\t\tUMETA(DisplayName = \"TopLeft\"),\n\tEUC_TopRight\t\t\tUMETA(DisplayName = \"TopRight\"),\n\n\t// j - e.g. equip / change slot item\n\tEUC_Action0\t\t\t\tUMETA(DisplayName = \"Action0\"),\n\t// i - e.g. clear slot\n\tEUC_Action1\t\t\t\tUMETA(DisplayName = \"Action1\"),\n\t// k - e.g. compare while pressed\n\tEUC_Action2\t\t\t\tUMETA(DisplayName = \"Action2\"),\n\n\tEUC_ActionBack\t\t\tUMETA(DisplayName = \"ActionBack (back/exit)\"),\n\n\t// Constants that allows us to always control the menu\n\t// NOTE: these differ by Left/Right/Up/Down by not allowing the user to change them\n\tEUC_MainMenuLeft\t\tUMETA(DisplayName = \"MainMenuLeft\"),\n\tEUC_MainMenuRight\t\tUMETA(DisplayName = \"MainMenuRight\"),\n\tEUC_MainMenuUp\t\t\tUMETA(DisplayName = \"MainMenuUp\"),\n\tEUC_MainMenuDown\t\tUMETA(DisplayName = \"MainMenuDown\"),\n\tEUC_MainMenuEnter\t\tUMETA(DisplayName = \"MainMenuEnter\"),\n\tEUC_MainMenuBack\t\tUMETA(DisplayName = \"MainMenuBack\"),\n\n\t// Spell UI commands\n\tEUC_SpellLeft\t\t\tUMETA(DisplayName = \"SpellLeft\"),\n\tEUC_SpellRight\t\t\tUMETA(DisplayName = \"SpellRight\"),\n\tEUC_SpellUp\t\t\t\tUMETA(DisplayName = \"SpellUp\"),\n\tEUC_SpellDown\t\t\tUMETA(DisplayName = \"SpellDown\"),\n\tEUC_SpellSelect\t\t\tUMETA(DisplayName = \"SpellSelect\"),\n\tEUC_SpellSelectAndCast\tUMETA(DisplayName = \"SpellSelectAndCast\"),\n\n\tEUC_PressedMax\t\t\tUMETA(Hidden),\n\n\t// all released event has to start with EUC_R!!! - they react to action released events\n\tEUC_RAction2\t\t\tUMETA(DisplayName = \"Action2Up\"),\n\tEUC_ReleasedMax\t\t\tUMETA(Hidden),\n};\n\n\n//\n// ID for the ingame editor bp widgets\n//\nUENUM(BlueprintType)\nenum class ESoEditorUI : uint8\n{\n\tEEUI_Camera\t\tUMETA(DisplayName = \"Camera\"),\n\tEEUI_Sky\t\tUMETA(DisplayName = \"Sky\"),\n\tEEUI_CharShadow\tUMETA(DisplayName = \"CharShadow\"),\n\n\tEEUI_MAX\t\tUMETA(Hidden),\n};\n\n\n//\n// ID for the UI panels\n//\nUENUM(BlueprintType)\nenum class ESoUIPanel : uint8\n{\n\t// main char UI with char sheet, inventory, skills, etc.\n\tEUP_Character\t\tUMETA(DisplayName = \"Character\"),\n\tEUP_ItemContainer\tUMETA(DisplayName = \"ItemContainer\"),\n\tEUP_Book\t\t\tUMETA(DisplayName = \"Book\"),\n\n\tEUP_MAX\t\t\t\tUMETA(Hidden),\n};\n\n//\n// ID for Event types, does not have anything to do with ISoUIEventHandler interface\n//\nUENUM(BlueprintType)\nenum class ESoUIEventType : uint8\n{\n\tNone = 0,\n\n\tMouseEnter,\n\tMouseLeave,\n\tMouseButtonDown,\n\tMouseButtonUp\n};\n\n//\n// UI Event Handler\n//\nUINTERFACE(BlueprintType, Blueprintable)\nclass SORB_API USoUIEventHandler : public UInterface\n{\n\tGENERATED_UINTERFACE_BODY()\n\n};\n\nclass SORB_API ISoUIEventHandler\n{\n\tGENERATED_IINTERFACE_BODY()\n\n\t// Return true if command was handled, false otherwise\n\tUFUNCTION(BlueprintNativeEvent, BlueprintCallable, Category = UI)\n\tbool OnUICommand(ESoUICommand Command);\n\n\tUFUNCTION(BlueprintNativeEvent, BlueprintCallable, Category = UI)\n\tvoid Open(bool bOpen);\n\n\tUFUNCTION(BlueprintNativeEvent, BlueprintCallable, Category = UI)\n\tbool IsOpened() const;\n\n\tUFUNCTION(BlueprintNativeEvent, BlueprintCallable, Category = UI)\n\tbool CanBeInterrupted() const;\n};\n\n\nUSTRUCT(BlueprintType)\nstruct FSoUIWidgetArray\n{\n\tGENERATED_USTRUCT_BODY()\npublic:\n\n\t// mesh to fade out\n\tUPROPERTY()\n\tTArray<UUserWidget*> Widgets;\n};\n\n\nUSTRUCT(BlueprintType)\nstruct FSoUITextCommandPair\n{\n\tGENERATED_USTRUCT_BODY()\n\npublic:\n\tFSoUITextCommandPair() {}\n\tFSoUITextCommandPair(ESoUICommand InCommand, FText InText) :\n\t\tCommand(InCommand), Text(InText) {}\n\npublic:\n\tUPROPERTY(BlueprintReadWrite)\n\tESoUICommand Command = ESoUICommand::EUC_ReleasedMax;\n\n\tUPROPERTY(BlueprintReadWrite)\n\tFText Text;\n};\n\n\n// Track the total time spent on a key down\nUSTRUCT(BlueprintType)\nstruct FSoUITrackedInputKeyDown\n{\n\tGENERATED_USTRUCT_BODY()\npublic:\n\n\t// Time in seconds after which we move in one direction or another if the move key is pressed down\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = \">Time\")\n\tfloat KeyDownThresholdSeconds = 0.02f;\n\n\t// Delay in seconds before triggering the moving\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = \">Time\")\n\tfloat KeyDownThresholdDelaySeconds = 0.5f;\n\n\t// Are we tracking?\n\t// TickDelayTimeSum > KeyDownThresholdDelaySeconds\n\tUPROPERTY()\n\tbool bTrack = false;\n\n\t// Counter, current Total time spent in Tick()\n\tUPROPERTY()\n\tfloat TickTimeSum = 0.f;\n\n\t// Counter, current time open in Tick(), should be larger than KeyDownThresholdDelaySeconds\n\t// For bTrack to be set to true\n\tUPROPERTY()\n\tfloat TickDelayTimeSum = 0.f;\n\npublic:\n\tFORCEINLINE void Reset()\n\t{\n\t\tbTrack = false;\n\t\tTickTimeSum = 0.f;\n\t\tTickDelayTimeSum = 0.f;\n\t}\n\n\tFORCEINLINE bool Tick(float InDeltaTime, TFunction<void()> CallbackSuccess)\n\t{\n\t\tif (!InternalPreTick(InDeltaTime))\n\t\t\treturn false;\n\n\t\tif (!bTrack)\n\t\t\treturn false;\n\n\t\t// Update sum\n\t\tTickTimeSum += InDeltaTime;\n\n\t\t// Can Call\n\t\tif (TickTimeSum > GetKeyDownThresholdSeconds())\n\t\t{\n\t\t\tCallbackSuccess();\n\n\t\t\tTickTimeSum = 0.f;\n\t\t\treturn true;\n\t\t}\n\n\t\treturn false;\n\t}\n\n\tfloat GetKeyDownThresholdDelaySeconds() const;\n\tfloat GetKeyDownThresholdSeconds() const;\n\n\nprotected:\n\t// Tick the update to bTrack\n\t// If it returns false we should abort the NativeTick of the calling function\n\tFORCEINLINE bool InternalPreTick(float InDeltaTime)\n\t{\n\t\tif (bTrack)\n\t\t\treturn true;\n\n\t\t// Update delay sum\n\t\tTickDelayTimeSum += InDeltaTime;\n\n\t\t// Can finally start tracking\n\t\tif (TickDelayTimeSum > GetKeyDownThresholdDelaySeconds())\n\t\t{\n\t\t\tbTrack = true;\n\t\t\treturn true;\n\t\t}\n\n\t\treturn false;\n\t}\n};\n\n\n//\n// Delegates\n//\n\n// we need a non-multicast version for the delegates for the subscribe function\nDECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FSoEquipmentSlotChanged, ESoItemSlot, Slot);\nDECLARE_DYNAMIC_DELEGATE_OneParam(FSoEquipmentSlotChangedSingle, ESoItemSlot, Slot);\n\nDECLARE_DYNAMIC_MULTICAST_DELEGATE(FSoUINotify);\nDECLARE_DYNAMIC_DELEGATE(FSoUINotifySingle);\n\nDECLARE_DYNAMIC_MULTICAST_DELEGATE_TwoParams(FSoUINotifyTwoInt, int32, Current, int32, Max);\nDECLARE_DYNAMIC_DELEGATE_TwoParams(FSoUINotifyTwoIntSingle, int32, Current, int32, Max);\n\nDECLARE_DYNAMIC_MULTICAST_DELEGATE_TwoParams(FSoUINotifyTwoFloat, float, Current, float, Max);\nDECLARE_DYNAMIC_DELEGATE_TwoParams(FSoUINotifyTwoFloatSingle, float, Current, float, Max);\n\nDECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FSoUINotifyDmg, const FSoDmg&, UnresistedDmg);\nDECLARE_DYNAMIC_DELEGATE_OneParam(FSoUINotifyDmgSingle, const FSoDmg&, UnresistedDmg);\n\nDECLARE_DYNAMIC_MULTICAST_DELEGATE_ThreeParams(FSoUIPanelEvent, ESoUIPanel, Panel, bool, bOpened, AActor*, Initiator);\nDECLARE_DYNAMIC_DELEGATE_ThreeParams(FSoUIPanelEventSingle, ESoUIPanel, Panel, bool, bOpened, AActor*, Initiator);\n\n\nDECLARE_MULTICAST_DELEGATE_OneParam(FSoUIEventTypeEvent, ESoUIEventType);\nDECLARE_MULTICAST_DELEGATE_OneParam(FSoUIUserWidgetRequestHighlightChangeEvent, bool);\n\n// Event Happened\nDECLARE_MULTICAST_DELEGATE(FSoUIUserWidgetEventCPP);\nDECLARE_DYNAMIC_MULTICAST_DELEGATE(FSoUIUserWidgetEvent);\n\nDECLARE_MULTICAST_DELEGATE_OneParam(FSoUIUserWidgetChangedEventCPP, bool);\nDECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FSoUIUserWidgetChangedEvent, bool, bNewValue);\n\n// Navigate\nDECLARE_DYNAMIC_MULTICAST_DELEGATE(FSoPreNavigateEvent);\nDECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FSoPostNavigateEvent, bool, bHandled);\n\nDECLARE_DYNAMIC_MULTICAST_DELEGATE_TwoParams(FSoNavigateOnPressedHandleChilEvent, int32, ChildIndex, USoUIUserWidget*, Widget);\nDECLARE_DYNAMIC_MULTICAST_DELEGATE_TwoParams(FSoNavigateOnPressedHandleChildArrayEvent, int32, ChildIndex, USoUIUserWidgetArray*, ArrayWidget);\n\nDECLARE_DELEGATE_TwoParams(FSoNavigateOnPressedHandleChilEventCPP, int32, USoUIUserWidget*);\nDECLARE_DELEGATE_TwoParams(FSoNavigateOnPressedHandleChildArrayEventCPP, int32, USoUIUserWidgetArray*);\n\n\n// Handle child\nDECLARE_MULTICAST_DELEGATE_TwoParams(FSoPostSetSelectedIndexEvent, int32, int32);\n\n// Array Child highlight changed\nDECLARE_MULTICAST_DELEGATE_TwoParams(FSoArrayChildBoolChangedEventCPP, int32, bool);\nDECLARE_DYNAMIC_MULTICAST_DELEGATE_TwoParams(FSoArrayChildBoolChangedEvent, int32, ChildIndex, bool, bHighlight);\n\n\n// UI opened changed\nDECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FSoUIOpenChangedEvent, bool, bOpened);\n"
  },
  {
    "path": "Source/SOrb/UI/General/SoUIUserWidget.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#include \"SoUIUserWidget.h\"\n#include \"Basic/SoAudioManager.h\"\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIUserWidget::SynchronizeProperties()\n{\n\tSuper::SynchronizeProperties();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIUserWidget::NativeConstruct()\n{\n\t// Call our CPP\n\tActiveChangedEvent.AddDynamic(this, &ThisClass::OnProxyActiveChangedEvent);\n\n\tSuper::NativeConstruct();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIUserWidget::NativeDestruct()\n{\n\tActiveChangedEvent.RemoveDynamic(this, &ThisClass::OnProxyActiveChangedEvent);\n\tSuper::NativeDestruct();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoUIUserWidget::NavigateOnPressed(bool bPlaySound)\n{\n\tif (bPlaySound)\n\t\tUSoAudioManager::PlaySound2D(this, SFXOnPressed);\n\n\treturn true;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIUserWidget::SetIsActive(bool bActive, bool bPlaySound)\n{\n\tif (bIsActive != bActive)\n\t{\n\t\tif (bPlaySound)\n\t\t\tUSoAudioManager::PlaySound2D(this, SFXActiveChanged);\n\n\t\tbIsActive = bActive;\n\t\tOnActiveChanged(bIsActive);\n\t}\n}\n"
  },
  {
    "path": "Source/SOrb/UI/General/SoUIUserWidget.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#pragma once\n\n#include \"CoreMinimal.h\"\n#include \"SoUIUserWidgetBaseNavigation.h\"\n#include \"SoUITypes.h\"\n\n#include \"SoUIUserWidget.generated.h\"\n\nclass UImage;\nclass UFMODEvent;\n\n\n\n/**\n *  Common UserWidget functionality to be inherited by other widgets\n *  A USoUIUserWidgetBaseNavigation + can be activated/deactivate\n */\nUCLASS(Abstract)\nclass SORB_API USoUIUserWidget : public USoUIUserWidgetBaseNavigation\n{\n\tGENERATED_BODY()\n\npublic:\n\t//\n\t// UUserWidget Interface\n\t//\n\tvoid SynchronizeProperties() override;\n\tvoid NativeConstruct() override;\n\tvoid NativeDestruct() override;\n\n\t//\n\t// USoUIUserWidgetBaseNavigation Interface\n\t//\n\n\tbool NavigateOnPressed(bool bPlaySound = true) override;\n\n\t// Is active and visible\n\tbool IsValidWidget() const override\n\t{\n\t\treturn IsActive() && GetIsEnabled() && IsVisible();\n\t}\n\n\t//\n\t// Own methods\n\t//\n\n\t// used as Enabled/Disabled for normal buttons, Checked/Unchecked for checkboxes\n\tUFUNCTION(BlueprintCallable, Category = \">State\")\n\tvoid Activate(bool bPlaySound = false) { SetIsActive(true, bPlaySound); }\n\n\tUFUNCTION(BlueprintCallable, Category = \">State\")\n\tvoid Deactivate(bool bPlaySound = false) { SetIsActive(false, bPlaySound); }\n\n\tUFUNCTION(BlueprintPure, Category = \">State\", meta=(ScriptName=\"GetIsActive\"))\n\tbool IsActive() const { return bIsActive; }\n\n\t// NOTE: Not BP on purpose\n\tUFUNCTION(BlueprintCallable, Category = \">State\")\n\tvirtual void SetIsActive(bool bActive, bool bPlaySound = false);\n\n\t// Events\n\tFSoUIUserWidgetChangedEventCPP& OnActiveChangedEvent() { return ProxyActiveChangedCPP; }\n\nprotected:\n\t//\n\t// Handle CPP proxies\n\t//\n\tUFUNCTION()\n\tvoid OnProxyActiveChangedEvent(bool bNewValue) { ProxyActiveChangedCPP.Broadcast(bNewValue); }\n\npublic:\n\t//\n\t// Handle BP events and events firing\n\t//\n\n\tUFUNCTION(BlueprintImplementableEvent, BlueprintCosmetic, Category = \">Events\", DisplayName = \"OnActiveChanged\")\n\tvoid ReceiveOnActiveChanged(bool bActive);\n\tUFUNCTION(BlueprintCallable, Category = \">Events\")\n\tvirtual void OnActiveChanged(bool bActive)\n\t{\n\t\tReceiveOnActiveChanged(bActive);\n\t\tActiveChangedEvent.Broadcast(bActive);\n\t\tOnStateChanged();\n\t}\n\nprotected:\n\n\t/**\n\t * Can be used for Toggleable buttons, or for disabled ones if they need special status\n\t * Can be combined with bHighlighted to generate 4 different styles\n\t * not all button need to use this\n\t * Can be used for check boxes to verify if it is checked\n\t*/\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = \">State\")\n\tbool bIsActive = false;\n\n\t//\n\t// Events\n\t//\n\n\n\t// Fired when the Active value of this widget changed\n\tUPROPERTY(BlueprintAssignable, Category = \">Events\", DisplayName = \"OnActiveChangedEvent\")\n\tFSoUIUserWidgetChangedEvent ActiveChangedEvent;\n\n\t// Proxy events that pass from Dynamic event to our event handler in CPP\n\tFSoUIUserWidgetChangedEventCPP ProxyActiveChangedCPP;\n\n\n\t//\n\t// SFX\n\t//\n\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere, Category = \">SFX\")\n\tUFMODEvent* SFXActiveChanged = nullptr;\n};\n"
  },
  {
    "path": "Source/SOrb/UI/General/SoUIUserWidgetArray.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#include \"SoUIUserWidgetArray.h\"\n\n#include \"UI/General/SoUITypes.h\"\n#include \"Basic/Helpers/SoMathHelper.h\"\n#include \"UI/SoUIHelper.h\"\n#include \"SoUIUserWidget.h\"\n#include \"Basic/SoAudioManager.h\"\n#include \"Components/HorizontalBox.h\"\n#include \"Basic/Helpers/SoStaticHelper.h\"\n#include \"Character/SoCharacter.h\"\n#include \"Components/VerticalBox.h\"\n#include \"Basic/SoGameSingleton.h\"\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUSoUIUserWidgetArray::USoUIUserWidgetArray(const FObjectInitializer& ObjectInitializer) : Super(ObjectInitializer)\n{\n\tTrackedInput.KeyDownThresholdSeconds = 0.2f;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIUserWidgetArray::PostLoad()\n{\n\tSuper::PostLoad();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIUserWidgetArray::SynchronizeProperties()\n{\n\tSuper::SynchronizeProperties();\n\tUpdateAllOverrides();\n\n\t// Vertical box, vertical layout, makes sense\n\tif (InternalCanUseContainer() && Container->IsA<UVerticalBox>())\n\t{\n\t\tbVerticalLayout = true;\n\t}\n\n\t// SFX\n\tif (bSFXSetDefault)\n\t{\n\t\tif (SFXChildSelectionChanged == nullptr)\n\t\t\tSFXChildSelectionChanged = USoGameSingleton::GetSFX(ESoSFX::MenuButtonSwitch);\n\n\t\tif (SFXChildPressed == nullptr)\n\t\t\tSFXChildPressed = USoGameSingleton::GetSFX(ESoSFX::MenuButtonPressed);\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIUserWidgetArray::NativeTick(const FGeometry& MyGeometry, float InDeltaTime)\n{\n\tSuper::NativeTick(MyGeometry, InDeltaTime);\n\tif (!bTrackPressedInput)\n\t\treturn;\n\n\tif (!SoCharacter || !IsValidWidget() || !SoCharacter->IsAnyUIInputPressed())\n\t{\n\t\tTrackedInput.Reset();\n\t\treturn;\n\t}\n\n\t// Pressed left/right/up/down change value\n\tif (bVerticalLayout)\n\t{\n\t\tTrackedInput.Tick(InDeltaTime, [&]()\n\t\t{\n\t\t\tif (SoCharacter->AreAnyUIInputsPressed({ ESoUICommand::EUC_Up, ESoUICommand::EUC_MainMenuUp }))\n\t\t\t\tNavigate(ESoUICommand::EUC_Up);\n\t\t\telse if (SoCharacter->AreAnyUIInputsPressed({ ESoUICommand::EUC_Down, ESoUICommand::EUC_MainMenuDown }))\n\t\t\t\tNavigate(ESoUICommand::EUC_Down);\n\t\t});\n\t}\n\telse\n\t{\n\t\tTrackedInput.Tick(InDeltaTime, [&]()\n\t\t{\n\t\t\tif (SoCharacter->AreAnyUIInputsPressed({ ESoUICommand::EUC_Left, ESoUICommand::EUC_MainMenuLeft }))\n\t\t\t\tNavigate(ESoUICommand::EUC_Left);\n\t\t\telse if (SoCharacter->AreAnyUIInputsPressed({ ESoUICommand::EUC_Right, ESoUICommand::EUC_MainMenuRight }))\n\t\t\t\tNavigate(ESoUICommand::EUC_Right);\n\t\t});\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIUserWidgetArray::NativeConstruct()\n{\n\t// Call our CPP\n\tChildHighlightChangedEvent.AddDynamic(this, &ThisClass::OnProxyChildHighlightChangedEvent);\n\tChildEnabledChangedEvent.AddDynamic(this, &ThisClass::OnProxyChildEnabledChangedEvent);\n\n\tSuper::NativeConstruct();\n\n\tSoCharacter = USoStaticHelper::GetPlayerCharacterAsSoCharacter(this);\n\n\t// Default to 0\n\tSetSelectedIndex(0);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIUserWidgetArray::NativeDestruct()\n{\n\tChildHighlightChangedEvent.RemoveDynamic(this, &ThisClass::OnProxyChildHighlightChangedEvent);\n\tChildEnabledChangedEvent.RemoveDynamic(this, &ThisClass::OnProxyChildEnabledChangedEvent);\n\n\tSuper::NativeDestruct();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoUIUserWidgetArray::Navigate(ESoUICommand Command, bool bPlaySound)\n{\n\t// Ignore navigation, widget is disabled\n\tbWasChildChangedInNavigate = false;\n\tif (!GetIsEnabled())\n\t\treturn false;\n\n\tPreNavigateEvent.Broadcast();\n\n\t// Handle OnPressed\n\tbool bStatus = false;\n\tif (Command == ESoUICommand::EUC_MainMenuEnter)\n\t{\n\t\tbStatus = NavigateOnPressed(bPlaySound);\n\t\tPostNavigateEvent.Broadcast(bStatus);\n\t\treturn bStatus;\n\t}\n\n\t// Can we navigate on a different child\n\t// OR we should navigate on THAT child\n\tint32 Delta = 0;\n\tconst int32 OldIndex = GetSelectedIndex();\n\tconst bool bCanNavigateChildren = InternalGetDeltaFromCommand(Command, OldIndex, Delta);\n\tif (bCanNavigateChildren)\n\t{\n\t\t// Try to navigate on children\n\t\tconst int32 NewIndex = InternalGetNextChildIndex(Delta, OldIndex);\n\n\t\t// Not found\n\t\tif (!IsValidIndex(NewIndex))\n\t\t{\n\t\t\tPostNavigateEvent.Broadcast(false);\n\t\t\treturn false;\n\t\t}\n\n\t\t// Found\n\t\tSetSelectedIndex(NewIndex, bPlaySound);\n\t\tbStatus = OldIndex != NewIndex;\n\t\tbWasChildChangedInNavigate = bStatus;\n\n\t\t// TOOD maybe only play this in Highlight?\n\t\t//if (bPlaySound && bStatus)\n\t\t//\tUSoAudioManager::PlaySound2D(this, SFXChildSelectionChanged);\n\t}\n\telse\n\t{\n\t\t// Navigate ON our current child\n\t\tbStatus = NavigateOnChildAt(OldIndex, Command, bPlaySound);\n\t}\n\n\t// Special case for keyboard\n\tif (bAlwaysHighlightAtLeastOneChild && bWasChildChangedInNavigate)\n\t{\n\t\tUnhighlightAllChildren();\n\t}\n\n\tPostNavigateEvent.Broadcast(bStatus);\n\treturn bStatus;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoUIUserWidgetArray::NavigateOnPressed(bool bPlaySound)\n{\n\tUUserWidget* Widget = GetChildAt(GetSelectedIndex());\n\n\t// Handle arrays differently\n\tif (ThisClass* SoArray = Cast<ThisClass>(Widget))\n\t{\n\t\tif (NavigateOnPressedHandleChildArrayEvent.IsBound())\n\t\t{\n\t\t\t// Handled by BP\n\t\t\tNavigateOnPressedHandleChildArrayEvent.Broadcast(GetSelectedIndex(), SoArray);\n\t\t\treturn true;\n\t\t}\n\t\tif (NavigateOnPressedHandleChildArrayEventCPP.IsBound())\n\t\t{\n\t\t\t// Handled by CPP\n\t\t\tNavigateOnPressedHandleChildArrayEventCPP.Execute(GetSelectedIndex(), SoArray);\n\t\t\treturn true;\n\t\t}\n\n\t\t// Default handle it\n\t\treturn SoArray->NavigateOnPressed(bPlaySound);\n\t}\n\n\tif (USoUIUserWidget* SoUserWidget = Cast<USoUIUserWidget>(Widget))\n\t{\n\t\tif (NavigateOnPressedHandleChildEvent.IsBound())\n\t\t{\n\t\t\t// Handled by BP\n\t\t\tNavigateOnPressedHandleChildEvent.Broadcast(GetSelectedIndex(), SoUserWidget);\n\t\t}\n\t\telse if (NavigateOnPressedHandleChildEventCPP.IsBound())\n\t\t{\n\t\t\t// Handled by CPP\n\t\t\tNavigateOnPressedHandleChildEventCPP.Execute(GetSelectedIndex(), SoUserWidget);\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// Default handle it\n\t\t\tSoUserWidget->NavigateOnPressed(bPlaySound);\n\t\t}\n\t\treturn true;\n\t}\n\n\treturn false;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nint32 USoUIUserWidgetArray::InternalGetDirectChildrenDeltaFromCommand(ESoUICommand Command, bool bIsOnVerticalLayout)\n{\n\tif (bIsOnVerticalLayout)\n\t{\n\t\t// Vertical\n\t\tif (Command == ESoUICommand::EUC_Up)\n\t\t\treturn -1;\n\t\tif (Command == ESoUICommand::EUC_Down)\n\t\t\treturn 1;\n\t}\n\telse\n\t{\n\t\t// Horizontal\n\t\tif (Command == ESoUICommand::EUC_Left)\n\t\t\treturn -1;\n\t\tif (Command == ESoUICommand::EUC_Right)\n\t\t\treturn 1;\n\t}\n\n\treturn 0;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoUIUserWidgetArray::InternalGetDeltaFromCommand(ESoUICommand Command, int32 OldIndex, int32& OutDelta) const\n{\n\t// NOTE: we mostly assume that none of the extra attached children are Arrays\n\tOutDelta = 0;\n\n\t// Choose direction based on layout vertical or horizontal\n\tCommand = USoUIHelper::TryTranslateMenuCommandDirectionToGame(Command);\n\tbool bIsOnVerticalLayout = bVerticalLayout;\n\tbool bSwitchedLayout = false;\n\n\t// The layout of our extra attached children is opposite\n\t// We must handle a custom layout\n\tconst bool bIsOnExtraChildren = IsIndexForExtraAttachedChildren(OldIndex);\n\tif (bIsOnExtraChildren)\n\t{\n\t\tif (HasTwoDifferentLayouts())\n\t\t{\n\t\t\t// Extra attached children has a different layout\n\t\t\tbIsOnVerticalLayout = !bIsOnVerticalLayout;\n\t\t\tbSwitchedLayout = true;\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// Same layout\n\n\t\t\t// Special case when we only have one extra attached child that is also an array\n\t\t\tUSoUIUserWidgetArray* ExtraChildArray = Cast<ThisClass> (GetExtraAttachedChildAt(OldIndex));\n\t\t\tif (ExtraChildArray && NumExtraAttachedChildren() == 1)\n\t\t\t{\n\t\t\t\tconst int32 ChildDelta = InternalGetDirectChildrenDeltaFromCommand(Command, bIsOnVerticalLayout);\n\n\t\t\t\t// The delta is possible, let the child handle it\n\t\t\t\tif (ExtraChildArray->IsValidIndex(ExtraChildArray->GetSelectedIndex() + ChildDelta))\n\t\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t}\n\n\t// Normal\n\tOutDelta = InternalGetDirectChildrenDeltaFromCommand(Command, bIsOnVerticalLayout);\n\n\t// Special layout switched case\n\tif (bSwitchedLayout)\n\t{\n\t\t// Extra attached children are in opposite direction and we are on them\n\t\tif (bIsOnVerticalLayout)\n\t\t{\n\t\t\t// NOTE: Assumes OldIndex is in the extra children\n\t\t\tcheckNoEntry();\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// Horizontal\n\t\t\t// Children are Vertical\n\t\t\t// Extra Attached Children Are Horizontal\n\n\t\t\t// NOTE: Assumes OldIndex is in the extra children\n\t\t\t// TODO: it assumes the extra children are below the container children\n\t\t\tif (IsVerticalCommand(Command))\n\t\t\t{\n\t\t\t\t// Should have navigated the container children\n\t\t\t\t// Go up or down to either first or last element in the ContainerChildren\n\t\t\t\tif (Command == ESoUICommand::EUC_Up)\n\t\t\t\t{\n\t\t\t\t\t// To last\n\t\t\t\t\tOutDelta = -(OldIndex - (NumContainerChildren() - 1));\n\t\t\t\t}\n\t\t\t\telse if (Command == ESoUICommand::EUC_Down)\n\t\t\t\t{\n\t\t\t\t\t// To first\n\t\t\t\t\t// (NumAllChildren() - 1) - OldIndex + 1 =\n\t\t\t\t\tOutDelta = NumAllChildren() - OldIndex;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t// Horizontal Command\n\t\t\t\t// Should have navigated the extra children\n\t\t\t\tconst int32 NewIndex = OldIndex + OutDelta;\n\t\t\t\tif (!IsIndexForExtraAttachedChildren(NewIndex))\n\t\t\t\t{\n\t\t\t\t\t// Make sure we wrap around\n\t\t\t\t\tif (Command == ESoUICommand::EUC_Left)\n\t\t\t\t\t{\n\t\t\t\t\t\t// To Last\n\t\t\t\t\t\tOutDelta = NumAllChildren() - OldIndex - 1;\n\t\t\t\t\t}\n\t\t\t\t\telse if (Command == ESoUICommand::EUC_Right)\n\t\t\t\t\t{\n\t\t\t\t\t\t// To First\n\t\t\t\t\t\tOutDelta = -(OldIndex - NumContainerChildren());\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// Else use the normal child direction if it is on extra attached child\n\t\t\t}\n\t\t}\n\t}\n\n\t// If still 0 it means it was not a direction for our layout\n\treturn OutDelta != 0;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nint32 USoUIUserWidgetArray::InternalGetNextChildIndex(int32 Delta, int32 CurrentIndex)\n{\n\t// Not a direction command\n\tif (Delta == 0)\n\t\treturn INDEX_NONE;\n\n\tbWasLastChildWrappedAround = false;\n\tconst int32 NumChildren = NumAllChildren();\n\n\t// Advance the selected index\n\tint32 NextIndex = CurrentIndex;\n\tauto ChooseNextIndex = [this, &NumChildren, &NextIndex, &Delta]()\n\t{\n\t\tNextIndex += Delta;\n\t\tif (bCyclicNavigation && NumChildren != 0)\n\t\t\tNextIndex = USoMathHelper::WrapIndexAround(NextIndex, NumChildren);\n\t\telse\n\t\t\tNextIndex = FMath::Clamp(NextIndex, 0, NumChildren - 1);\n\t};\n\n\t// Try first\n\tChooseNextIndex();\n\n\t// Try to skip deactivated buttons\n\tif (bSkipDeactivatedChildren)\n\t{\n\t\t// Try to skip deactivated buttons\n\t\tint32 NumTries = -1;\n\t\twhile (true)\n\t\t{\n\t\t\t// Reached limit of tries\n\t\t\tif (NumTries >= NumChildren)\n\t\t\t\tbreak;\n\n\t\t\t// Got a valid index\n\t\t\tif (IsValidWidgetAt(NextIndex))\n\t\t\t\tbreak;\n\n\t\t\tNumTries++;\n\t\t\tChooseNextIndex();\n\t\t}\n\t}\n\n\t// Check wrapping around\n\tif (NextIndex != CurrentIndex)\n\t{\n\t\tconst bool bLastToFirst = CurrentIndex == NumChildren - 1 && NextIndex == 0;\n\t\tconst bool bFirstToLast = CurrentIndex == 0               && NextIndex == NumChildren - 1;\n\t\tbWasLastChildWrappedAround = bLastToFirst || bFirstToLast;\n\t}\n\n\treturn NextIndex;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIUserWidgetArray::EnsureHighlights()\n{\n\tif (!bIsConstructed)\n\t\treturn;\n\n\t// Don't care\n\tif (!bAlwaysHighlightAtLeastOneChild)\n\t\treturn;\n\n\t// One child is already highlighted\n\tif (IsAnyChildHighlighted())\n\t\treturn;\n\n\tSetSelectedChildIsHighlighted(true, false);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFReply USoUIUserWidgetArray::OnUIEventType(ESoUIEventType EventType)\n{\n\treturn FReply::Unhandled();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIUserWidgetArray::InternalSetSelectedIndex(int32 NewIndex)\n{\n\tPreviousSelectedIndex = SelectedIndex;\n\tSelectedIndex = NewIndex;\n\tPostSetSelectedIndexEvent.Broadcast(PreviousSelectedIndex, NewIndex);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIUserWidgetArray::SetSelectedIndex(int32 ChildIndex, bool bPlaySound)\n{\n\t// Can't select as it is not active\n\tif (bSkipDeactivatedChildren && !IsValidWidgetAt(ChildIndex))\n\t\treturn;\n\n\tUE_LOG(\n\t\tLogSoUI,\n\t\tVerbose,\n\t\tTEXT(\"[%s] USoUIUserWidgetArray::SetSelectedIndex(ChildIndex = %d, bPlaySound = %d)\"),\n\t\t*GetName(), ChildIndex, bPlaySound\n\t);\n\n\t// We must disable bAlwaysHighlightAtLeastOneChild for this to work properly\n\tconst bool bPreviousValue = bAlwaysHighlightAtLeastOneChild;\n\tbAlwaysHighlightAtLeastOneChild = false;\n\n\t// Play sound only on highlight if it is set to true\n\tUnhighlightAllChildren();\n\n\t// Enable back\n\tbAlwaysHighlightAtLeastOneChild = bPreviousValue;\n\n\tconst int32 OldIndex = GetSelectedIndex();\n\tInternalSetSelectedIndex(ChildIndex);\n\tconst int32 NewIndex = GetSelectedIndex();\n\n\tHighlightSelectedChild(bPlaySound);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoUIUserWidgetArray::SelectFirstValidChild(bool bPlaySound)\n{\n\tif (IsValidIndex(GetSelectedIndex()))\n\t{\n\t\t// Selected element is not active, unhighlight it and select the first active one if there is any\n\t\tif (USoUIUserWidgetBaseNavigation* SelectedChild = Cast<USoUIUserWidgetBaseNavigation>(GetChildAt(GetSelectedIndex())))\n\t\t{\n\t\t\t// Already valid, nothing to do\n\t\t\t//if (bIgnoreIfSelectedIsValid && SelectedChild->IsValidWidget())\n\t\t\t//\treturn false;\n\n\t\t\t// Just in case we could not find anything\n\t\t\tSelectedChild->Unhighlight();\n\t\t}\n\t}\n\n\t// Find a valid widget to select\n\tconst int32 NumChildren = NumAllChildren();\n\tfor (int32 Index = 0; Index < NumChildren; ++Index)\n\t{\n\t\tif (IsValidWidgetAt(Index))\n\t\t{\n\t\t\t// Found a valid child\n\t\t\tSetSelectedIndex(Index, bPlaySound);\n\t\t\treturn true;\n\t\t}\n\t}\n\n\t// Something is wrong, no valid index found?\n\tInternalSetSelectedIndex(INDEX_NONE);\n\treturn false;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nint32 USoUIUserWidgetArray::SelectFirstActiveChild(int32 StartFrom)\n{\n\tconst int32 NumChildren = NumAllChildren();\n\tfor (int32 Index = StartFrom; Index < NumChildren + StartFrom; Index++)\n\t{\n\t\tconst int32 SafeIndex = Index % NumChildren;\n\n\t\tUSoUIUserWidget* Child = GetChildAtAsSoUserWidget(SafeIndex);\n\t\tif (Child && Child->IsActive())\n\t\t{\n\t\t\tSetSelectedIndex(SafeIndex);\n\t\t\treturn SafeIndex;\n\t\t}\n\t}\n\n\tSetSelectedIndex(INDEX_NONE);\n\treturn INDEX_NONE;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoUIUserWidgetArray::GetSelectedIndexChecked(int32& OutIndex) const\n{\n\tOutIndex = GetSelectedIndex();\n\treturn IsValidIndex(OutIndex);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoUIUserWidgetArray::SetIsEnabledOnWidget(UUserWidget* Widget, bool bEnabled)\n{\n\tif (!Widget)\n\t\treturn false;\n\n\tWidget->SetIsEnabled(bEnabled);\n\treturn true;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoUIUserWidgetArray::SetIsHighlightedOnWidget(UUserWidget* Widget, bool bInHighlighted, bool bPlaySound)\n{\n\tif (!Widget)\n\t\treturn false;\n\n\tif (USoUIUserWidgetBaseNavigation* UserWidgetNavigation = Cast<USoUIUserWidgetBaseNavigation>(Widget))\n\t{\n\t\treturn UserWidgetNavigation->SetIsHighlighted(bInHighlighted, bPlaySound);\n\t}\n\n\treturn false;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoUIUserWidgetArray::SetIsHighlighted(bool bInHighlighted, bool bPlaySound)\n{\n\tUE_LOG(\n\t\tLogSoUI,\n\t\tVerbose,\n\t\tTEXT(\"[%s] USoUIUserWidgetArray::SetIsHighlighted(bInHighlighted = %d, bPlaySound = %d)\"),\n\t\t*GetName(), bInHighlighted, bPlaySound\n\t);\n\tUnhighlightAllChildren();\n\tif (bInHighlighted)\n\t{\n\t\t// Select first from Array\n\t\tif (!SelectFirstValidChild(bPlaySound))\n\t\t{\n\t\t\t// SelectedIndex is valid now\n\t\t\tHighlightSelectedChild(bPlaySound);\n\t\t}\n\t}\n\n\treturn Super::SetIsHighlighted(bInHighlighted, false);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoUIUserWidgetArray::SetIsHighlightedOnChildAt(int32 ChildIndex, bool bHighlight, bool bPlaySound)\n{\n\treturn SetIsHighlightedOnWidget(GetChildAt(ChildIndex), bHighlight, bPlaySound);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoUIUserWidgetArray::SetIsActiveOnWidget(UUserWidget* Widget, bool bActive, bool bPlaySound)\n{\n\tif (!Widget)\n\t\treturn false;\n\n\tif (USoUIUserWidget* SoUserWidget = Cast<USoUIUserWidget>(Widget))\n\t{\n\t\tSoUserWidget->SetIsActive(bActive, bPlaySound);\n\t\treturn true;\n\t}\n\tif (ThisClass* SoArray = Cast<ThisClass>(Widget))\n\t{\n\t\tSoArray->SetSelectedChildIsActive(bActive, bPlaySound);\n\t\treturn true;\n\t}\n\n\treturn false;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoUIUserWidgetArray::NavigateOnWidget(UUserWidget* Widget, ESoUICommand Command, bool bPlaySound)\n{\n\tif (!Widget)\n\t\treturn false;\n\n\tif (USoUIUserWidgetBaseNavigation* UserWidgetNavigation = Cast<USoUIUserWidgetBaseNavigation>(Widget))\n\t\treturn UserWidgetNavigation->Navigate(Command, bPlaySound);\n\n\treturn false;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoUIUserWidgetArray::IsWidgetEnabled(UUserWidget* Widget)\n{\n\treturn Widget ? Widget->GetIsEnabled() : false;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoUIUserWidgetArray::IsWidgetValid(UUserWidget* Widget)\n{\n\tif (!Widget)\n\t\treturn false;\n\n\tif (USoUIUserWidgetBaseNavigation* UserWidgetNavigation = Cast<USoUIUserWidgetBaseNavigation>(Widget))\n\t\treturn UserWidgetNavigation->IsValidWidget();\n\n\treturn IsWidgetEnabled(Widget) && Widget->IsVisible();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoUIUserWidgetArray::IsWidgetActive(UUserWidget* Widget)\n{\n\tif (!Widget)\n\t\treturn false;\n\n\tif (USoUIUserWidget* SoUserWidget = Cast<USoUIUserWidget>(Widget))\n\t{\n\t\treturn SoUserWidget->IsActive();\n\t}\n\tif (ThisClass* SoArray = Cast<ThisClass>(Widget))\n\t{\n\t\treturn SoArray->IsSelectedChildActive();\n\t}\n\n\treturn false;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoUIUserWidgetArray::IsWidgetHighlighted(UUserWidget* Widget)\n{\n\tif (!Widget)\n\t\treturn false;\n\n\tif (USoUIUserWidget* SoUserWidget = Cast<USoUIUserWidget>(Widget))\n\t{\n\t\treturn SoUserWidget->IsHighlighted();\n\t}\n\tif (ThisClass* SoArray = Cast<ThisClass>(Widget))\n\t{\n\t\treturn SoArray->IsSelectedChildHighlighted();\n\t}\n\n\treturn false;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIUserWidgetArray::AddContainerChild(UUserWidget* Child)\n{\n\tif (!Child)\n\t\treturn;\n\n\tContainerChildren.Add(Child);\n\tif (InternalCanUseContainer() && !Container->HasChild(Child))\n\t\tContainer->AddChild(Child);\n\n\tconst int32 AddedIndex = NumContainerChildren() - 1;\n\tSubscribeToChildEvents(Child, AddedIndex);\n\tUpdateWidgetOverrides(Child, AddedIndex);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIUserWidgetArray::RemoveContainerChild(UUserWidget* Child)\n{\n\tContainerChildren.Remove(Child);\n\tif (InternalCanUseContainer() && Container->HasChild(Child))\n\t\tContainer->RemoveChild(Child);\n\n\tUnSubscribeFromChildEvents(Child);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIUserWidgetArray::RemoveContainerChildAt(int32 ChildIndex)\n{\n\tif (ContainerChildren.IsValidIndex(ChildIndex))\n\t\tRemoveContainerChild(ContainerChildren[ChildIndex]);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIUserWidgetArray::EmptyContainerChildren(bool bContainer)\n{\n\t// Unsubscribe\n\tif (Container && Container->GetChildrenCount() > 0)\n\t{\n\t\t// Container children\n\t\tfor (int32 Index = 0; Index < Container->GetChildrenCount(); Index++)\n\t\t{\n\t\t\tUUserWidget* Widget = Cast<UUserWidget>(Container->GetChildAt(Index));\n\t\t\tif (!Widget)\n\t\t\t\tcontinue;\n\n\t\t\tUnSubscribeFromChildEvents(Widget);\n\t\t}\n\t}\n\tUnhighlightSelectedChild(false);\n\n\tContainerChildren.Empty();\n\n\tif (bContainer && InternalCanUseContainer())\n\t{\n\t\tContainer->ClearChildren();\n\t\tInvalidateLayoutAndVolatility();\n\t}\n\tSelectedIndex = INDEX_NONE;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUUserWidget* USoUIUserWidgetArray::GetContainerChildAt(int32 ChildIndex) const\n{\n\treturn IsIndexForContainer(ChildIndex) ? ContainerChildren[ChildIndex] : nullptr;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIUserWidgetArray::HideContainer()\n{\n\tif (InternalCanUseContainer())\n\t\tContainer->SetVisibility(ESlateVisibility::Collapsed);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIUserWidgetArray::ShowContainer()\n{\n\tif (InternalCanUseContainer())\n\t\tContainer->SetVisibility(ESlateVisibility::Visible);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIUserWidgetArray::AddExtraAttachedChild(UUserWidget* ExtraChild)\n{\n\tif (!ExtraChild)\n\t\treturn;\n\n\tExtraAttachedChildren.Add(ExtraChild);\n\n\tconst int32 AddedIndex = NumAllChildren() - 1;\n\tSubscribeToChildEvents(ExtraChild, AddedIndex);\n\tUpdateWidgetOverrides(ExtraChild, AddedIndex);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIUserWidgetArray::EmptyExtraAttachedChildren()\n{\n\t// unsubscribe\n\tfor (UUserWidget* Widget : ExtraAttachedChildren)\n\t\tUnSubscribeFromChildEvents(Widget);\n\n\tExtraAttachedChildren.Empty();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUUserWidget* USoUIUserWidgetArray::GetExtraAttachedChildAt(int32 ChildIndex) const\n{\n\treturn IsIndexForExtraAttachedChildren(ChildIndex) ? ExtraAttachedChildren[ConvertAllChildIndexToExtraAttachedChildIndex(ChildIndex)] : nullptr;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoUIUserWidgetArray::IsValidIndex(int32 ChildIndex) const\n{\n\t// Not in range\n\tconst int32 Num = NumAllChildren();\n\tif (ChildIndex < 0 || ChildIndex >= Num)\n\t\treturn false;\n\n\treturn IsIndexForContainer(ChildIndex) || IsIndexForExtraAttachedChildren(ChildIndex);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUUserWidget* USoUIUserWidgetArray::GetChildAt(int32 ChildIndex) const\n{\n\t// Not in range\n\tif (!IsValidIndex(ChildIndex))\n\t\treturn nullptr;\n\n\t// In the normal children array\n\tUUserWidget* Child = GetContainerChildAt(ChildIndex);\n\treturn Child ? Child : GetExtraAttachedChildAt(ChildIndex);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUSoUIUserWidget* USoUIUserWidgetArray::GetChildAtAsSoUserWidget(int32 ChildIndex) const\n{\n\treturn Cast<USoUIUserWidget>(GetChildAt(ChildIndex));\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUSoUIUserWidgetArray* USoUIUserWidgetArray::GetChildAtAsSoUserWidgetArray(int32 ChildIndex) const\n{\n\treturn Cast<ThisClass>(GetChildAt(ChildIndex));\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIUserWidgetArray::SubscribeToChildEvents(UUserWidget* Child, int32 ChildIndex)\n{\n\tif (!Child)\n\t\treturn;\n\n\tauto* UserWidgetNavigation = Cast<USoUIUserWidgetBaseNavigation>(Child);\n\tif (!UserWidgetNavigation)\n\t\treturn;\n\n\t\tconst uint32 Key = Child->GetUniqueID();\n\n\t// Listen to enabled change events\n\tif (!DelegatesEnabledChangedMap.Contains(Key))\n\t{\n\t\tconst FDelegateHandle NewHandle = UserWidgetNavigation->OnEnabledChangedEvent().AddLambda([this, ChildIndex](bool bEnabled)\n\t\t{\n\t\t\tOnChildEnabledChanged(ChildIndex, bEnabled);\n\t\t});\n\n\t\tDelegatesEnabledChangedMap.Add(Key);\n\t}\n\n\t// Listen to highlight change events\n\tif (!DelegatesHighlightChangedMap.Contains(Key))\n\t{\n\t\tconst FDelegateHandle NewHandle = UserWidgetNavigation->OnHighlightChangedEvent().AddLambda([this, ChildIndex](bool bHighlight)\n\t\t{\n\t\t\tOnChildHighlightChanged(ChildIndex, bHighlight);\n\t\t});\n\n\t\tDelegatesHighlightChangedMap.Add(Key);\n\t}\n\n\t// Listen to highlight request change event\n\tif (bListenToChildHighlightRequest && !DelegatesHighlightRequestChangeMap.Contains(Key))\n\t{\n\t\tconst FDelegateHandle NewHandle = UserWidgetNavigation->OnHighlightRequestChangeEvent().AddLambda([this, ChildIndex](bool bHighlight)\n\t\t{\n\t\t\tOnRequestChildHighlightChange(ChildIndex, bHighlight);\n\t\t});\n\n\t\tDelegatesHighlightRequestChangeMap.Add(Key, NewHandle);\n\t}\n\n\t// Listen to pressed event\n\tif (bListenToChildPressedRequest && !DelegatesPressedRequestMap.Contains(Key))\n\t{\n\t\tconst FDelegateHandle NewHandle = UserWidgetNavigation->OnPressedEvent().AddUObject(this, &ThisClass::OnRequestChildPressed, ChildIndex);\n\t\tDelegatesPressedRequestMap.Add(Key, NewHandle);\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIUserWidgetArray::UnSubscribeFromChildEvents(UUserWidget* Child)\n{\n\tif (!Child)\n\t\treturn;\n\n\tauto* UserWidgetNavigation = Cast<USoUIUserWidgetBaseNavigation>(Child);\n\tif (!UserWidgetNavigation)\n\t\treturn;\n\n\n\tconst uint32 Key = Child->GetUniqueID();\n\n\tif (DelegatesEnabledChangedMap.Contains(Key))\n\t{\n\t\tUserWidgetNavigation->OnEnabledChangedEvent().Remove(DelegatesEnabledChangedMap.FindChecked(Key));\n\t\tDelegatesEnabledChangedMap.Remove(Key);\n\t}\n\tif (DelegatesHighlightChangedMap.Contains(Key))\n\t{\n\t\tUserWidgetNavigation->OnHighlightChangedEvent().Remove(DelegatesHighlightChangedMap.FindChecked(Key));\n\t\tDelegatesHighlightChangedMap.Remove(Key);\n\t}\n\tif (DelegatesHighlightRequestChangeMap.Contains(Key))\n\t{\n\t\tUserWidgetNavigation->OnHighlightRequestChangeEvent().Remove(DelegatesHighlightRequestChangeMap.FindChecked(Key));\n\t\tDelegatesHighlightRequestChangeMap.Remove(Key);\n\t}\n\tif (DelegatesPressedRequestMap.Contains(Key))\n\t{\n\t\tUserWidgetNavigation->OnPressedEvent().Remove(DelegatesPressedRequestMap.FindChecked(Key));\n\t\tDelegatesPressedRequestMap.Remove(Key);\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIUserWidgetArray::OnRequestChildHighlightChange(int32 ChildIndex, bool bHighlight)\n{\n\tif (!GetChildAt(ChildIndex))\n\t\treturn;\n\n\t// if (USoUIUserWidget* Widget = GetChildAtAsSoUserWidget(ChildIndex))\n\t// {\n\t// \tif (Widget->IsHandlingOwnMouseEvents())\n\t// \t\treturn;\n\t// }\n\n\tUE_LOG(\n\t\tLogSoUI,\n\t\tVerbose,\n\t\tTEXT(\"[%s] USoUIUserWidgetArray::OnRequestChildHighlightChange(ChildIndex = %d, bHighlight = %d)\"),\n\t\t*GetName(), ChildIndex,bHighlight\n\t);\n\n\tif (bHighlight)\n\t{\n\t\tif (bHighlightSelectsChild)\n\t\t{\n\t\t\tSetSelectedIndex(ChildIndex, true);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tUnhighlightAllChildren();\n\t\t\tHighlightChildAt(ChildIndex, true);\n\t\t}\n\t}\n\telse\n\t{\n\t\tUnhighlightChildAt(ChildIndex, false);\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIUserWidgetArray::OnChildHighlightChanged(int32 ChildIndex, bool bHighlight)\n{\n\tUE_LOG(\n\t\tLogSoUI,\n\t\tVerbose,\n\t\tTEXT(\"[%s] USoUIUserWidgetArray::OnChildHighlightChanged(ChildIndex = %d, bHighlight = %d)\"),\n\t\t*GetName(), ChildIndex, bHighlight\n\t);\n\n\tReceiveOnChildHighlightChanged(ChildIndex, bHighlight);\n\tChildHighlightChangedEvent.Broadcast(ChildIndex, bHighlight);\n\tEnsureHighlights();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIUserWidgetArray::OnChildEnabledChanged(int32 ChildIndex, bool bEnabled)\n{\n\tUE_LOG(\n\t\tLogSoUI,\n\t\tVerbose,\n\t\tTEXT(\"[%s] USoUIUserWidgetArray::OnChildEnabledChanged(ChildIndex = %d, bEnabled = %d)\"),\n\t\t*GetName(), ChildIndex, bEnabled\n\t);\n\n\tReceiveOnChildEnabledChanged(ChildIndex, bEnabled);\n\tChildEnabledChangedEvent.Broadcast(ChildIndex, bEnabled);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIUserWidgetArray::OnRequestChildPressed(int32 ChildIndex)\n{\n\tif (!GetChildAt(ChildIndex))\n\t\treturn;\n\n\t// Widget is handling its own events\n\tif (USoUIUserWidget* Widget = GetChildAtAsSoUserWidget(ChildIndex))\n\t{\n\t\tif (Widget->IsHandlingOwnMouseEvents())\n\t\t\treturn;\n\t}\n\n\tif (bHighlightSelectsChild)\n\t{\n\t\tOnRequestChildHighlightChange(ChildIndex, true);\n\t}\n\telse\n\t{\n\t\tSetSelectedIndex(ChildIndex, true);\n\t}\n\tNavigateOnPressed(true);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIUserWidgetArray::UpdateAllOverrides()\n{\n\tMapOverContainerChildren([&](int32 Index, UUserWidget* Widget)\n\t{\n\t\tUpdateWidgetOverrides(Widget, Index);\n\t});\n\n\t// Extra children\n\tfor (int32 Index = 0; Index < NumExtraAttachedChildren(); Index++)\n\t{\n\t\tUUserWidget* Widget = ExtraAttachedChildren[Index];\n\t\tif (!Widget)\n\t\t\tcontinue;\n\n\t\t// Normalize index to all children indices\n\t\tUpdateWidgetOverrides(Widget, NumContainerChildren() + Index);\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIUserWidgetArray::UpdateWidgetOverrides(UUserWidget* Widget, int32 ChildIndex)\n{\n\tUpdateOverrideCustomPadding(Widget);\n\tUpdateOverridesSFX(Widget);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIUserWidgetArray::UpdateOverridesSFX(UUserWidget* Widget)\n{\n\tif (!bSFXOverrideIndividualChildren)\n\t\treturn;\n\n\tif (USoUIUserWidget* UserWidget = Cast<USoUIUserWidget>(Widget))\n\t{\n\t\tif (SFXChildSelectionChanged)\n\t\t\tUserWidget->SetSFXHighlightChanged(SFXChildSelectionChanged);\n\n\t\tif (SFXChildPressed)\n\t\t\tUserWidget->SetSFXOnPressed(SFXChildPressed);\n\t}\n\telse if (ThisClass* SoArray = Cast<ThisClass>(Widget))\n\t{\n\t\tif (SFXChildSelectionChanged)\n\t\t\tSoArray->SetSFXChildSelectionChanged(SFXChildSelectionChanged);\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIUserWidgetArray::UpdateOverrideCustomPadding(UUserWidget* Widget)\n{\n\tif (!bUseCustomPadding)\n\t\treturn;\n\n\tWidget->SetPadding(PaddingForEachChildren);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIUserWidgetArray::MapOverContainerChildren(TFunction<void(int32, UUserWidget*)> CallbackLoopBody)\n{\n\t// TODO handle case when ContainerChildren != Container.Children\n\t// used in scrolling array?\n\n\tif (NumContainerChildren() > 0)\n\t{\n\t\t// Children\n\t\tfor (int32 Index = 0; Index < NumContainerChildren(); Index++)\n\t\t{\n\t\t\tUUserWidget* Widget = GetContainerChildAt(Index);\n\t\t\tif (!Widget)\n\t\t\t\tcontinue;\n\n\t\t\tCallbackLoopBody(Index, Widget);\n\t\t}\n\t}\n\telse if (Container && Container->GetChildrenCount() > 0)\n\t{\n\t\t// Container children\n\t\tfor (int32 Index = 0; Index < Container->GetChildrenCount(); Index++)\n\t\t{\n\t\t\tUUserWidget* Widget = Cast<UUserWidget>(Container->GetChildAt(Index));\n\t\t\tif (!Widget)\n\t\t\t\tcontinue;\n\n\t\t\tCallbackLoopBody(Index, Widget);\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "Source/SOrb/UI/General/SoUIUserWidgetArray.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#pragma once\n\n#include \"CoreMinimal.h\"\n#include \"UObject/ObjectMacros.h\"\n#include \"Blueprint/UserWidget.h\"\n#include \"UI/General/SoUITypes.h\"\n#include \"Delegates/IDelegateInstance.h\"\n#include \"SoUIUserWidgetBaseNavigation.h\"\n\n#include \"SoUIUserWidgetArray.generated.h\"\n\nclass USoUIButton;\nclass UFMODEvent;\nclass USoUIUserWidget;\nclass ASoCharacter;\nclass USoUIUserWidgetArray;\n\n\n/**\n * Container class containing an array of UserWidgets\n *\n * the layout can be ordered horizontally or vertically\n * it supports selecting/highlighting the widgets, navigation for the active button, etc.\n */\nUCLASS()\nclass SORB_API USoUIUserWidgetArray : public USoUIUserWidgetBaseNavigation\n{\n\tGENERATED_BODY()\n\npublic:\n\tUSoUIUserWidgetArray(const FObjectInitializer& ObjectInitializer);\n\n\t//\n\t// UObject Interface\n\t//\n\tvoid PostLoad() override;\n\n\t//\n\t// UUserWidget Interface\n\t//\n\tvoid SynchronizeProperties() override;\n\tvoid NativeTick(const FGeometry& MyGeometry, float InDeltaTime) override;\n\tvoid NativeConstruct() override;\n\tvoid NativeDestruct() override;\n\n\t//\n\t// USoUIUserWidgetBaseNavigation interface\n\t//\n\n\t/**\n\t* Navigate along the children\n\t* @Param Command: defines the navigation direction depending on the layout orientation (vertical/horizontal)\n\t* Returns true if the command was handled\n\t*/\n\tbool Navigate(ESoUICommand Command, bool bPlaySound = true) override;\n\n\t// Pressed the current widget, either mouse or enter\n\tbool NavigateOnPressed(bool bPlaySound = true) override;\n\n\t//\n\t// Own methods\n\t//\n\n\t// Useful to know after calling Navigate() if the child changed because of it\n\tbool WasChildChangedInNavigate() const { return bWasChildChangedInNavigate; }\n\n\t/** Sets the currently selected widget and highlights it */\n\tUFUNCTION(BlueprintCallable, Category = \">Selection\")\n\tvirtual void SetSelectedIndex(int32 ChildIndex, bool bPlaySound = false);\n\n\t/** returns with the currently selected widget, index might be INDEX_NONE */\n\tUFUNCTION(BlueprintPure, Category = \">Selection\")\n\tint32 GetSelectedIndex() const { return SelectedIndex; }\n\tint32 GetPreviousSelectedIndex() const { return PreviousSelectedIndex; }\n\n\t/** Puts the active index to OutIndex, return value tells if it is a valid value or not */\n\tUFUNCTION(BlueprintCallable, Category = \">Selection\")\n\tbool GetSelectedIndexChecked(int32& OutIndex) const;\n\n\t// Resets the selected child (unhighlight it) if it is deactivated.\n\t// Returns true if something new and valid was selected\n\t// Returns false if the current SelectedIndex is valid\n\t// NOTE: most likely you should just call Highlight() this widget\n\tvirtual bool SelectFirstValidChild(bool bPlaySound = false);\n\n\t/** @Return: the index of the new selected widget, or INDEX_NONE if there wasn't any active */\n\tvirtual int32 SelectFirstActiveChild(int32 StartFrom = 0);\n\n\t/**\n\t *  Enables/Disables the highlight for the selected child\n\t *  The value is not cached, so if it should be disabled\n\t *  the function has to be called manually after each SetSelectedElement() call\n\t */\n\tUFUNCTION(BlueprintCallable, Category = \">Selection\")\n\tvoid HighlightSelectedChild(bool bPlaySound = false) { SetSelectedChildIsHighlighted(true, bPlaySound);  }\n\n\tUFUNCTION(BlueprintCallable, Category = \">Selection\")\n\tvoid UnhighlightSelectedChild(bool bPlaySound = false) { SetSelectedChildIsHighlighted(false, bPlaySound); }\n\n\t// Change child states - has nothing to do with the child array itself:\n\n\tUFUNCTION(BlueprintCallable, Category = \">Selection\")\n\tvoid ActivateChildAt(int32 ChildIndex, bool bPlaySound = false) { SetIsActiveOnChildAt(ChildIndex, true, bPlaySound); }\n\n\tUFUNCTION(BlueprintCallable, Category = \">Selection\")\n\tvoid DeactivateChildAt(int32 ChildIndex, bool bPlaySound = false) { SetIsActiveOnChildAt(ChildIndex, false, bPlaySound); }\n\n\tUFUNCTION(BlueprintCallable, Category = \">Selection\")\n\tbool HighlightChildAt(int32 ChildIndex, bool bPlaySound = false) { return SetIsHighlightedOnChildAt(ChildIndex, true, bPlaySound); }\n\n\tUFUNCTION(BlueprintCallable, Category = \">Selection\")\n\tbool UnhighlightChildAt(int32 ChildIndex, bool bPlaySound = false) { return SetIsHighlightedOnChildAt(ChildIndex, false, bPlaySound); }\n\n\tUFUNCTION(BlueprintCallable, Category = \">Selection\")\n\tvoid ActivateAllChildren() { SetIsActiveOnAllChildren(true); }\n\n\tUFUNCTION(BlueprintCallable, Category = \">Selection\")\n\tvoid DeactivateAllChildren() { SetIsActiveOnAllChildren(false); }\n\n\tvoid HighlightAllChildren() { SetIsHighlightedOnAllChildren(true); }\n\tvoid UnhighlightAllChildren() { SetIsHighlightedOnAllChildren(false); }\n\n\n\t//\n\t// Operations for ContainerChildren\n\t//\n\n\tUFUNCTION(BlueprintPure, Category = \">Children\")\n\tvirtual int32 NumContainerChildren() const { return ContainerChildren.Num(); }\n\n\tvirtual void AddContainerChild(UUserWidget* Child);\n\tvirtual void RemoveContainerChild(UUserWidget* Child);\n\tvirtual void RemoveContainerChildAt(int32 ChildIndex);\n\tvirtual void EmptyContainerChildren(bool bContainer = false);\n\tvirtual UUserWidget* GetContainerChildAt(int32 ChildIndex) const;\n\tvirtual bool IsIndexForContainer(int32 ChildIndex) const { return ContainerChildren.IsValidIndex(ChildIndex); }\n\n\t// NOTE use with care because the IsValidWidget() will tell us this widget is it true\n\t// But the container is hidden\n\tvirtual void HideContainer();\n\tvirtual void ShowContainer();\n\n\t//\n\t// Operations for ExtraAttachedChildren\n\t//\n\tvoid AddExtraAttachedChild(UUserWidget* ExtraChild);\n\tvoid EmptyExtraAttachedChildren();\n\tconst TArray<UUserWidget*>& GetExtraAttachedChildren() const { return ExtraAttachedChildren; }\n\tUUserWidget* GetExtraAttachedChildAt(int32 ChildIndex) const;\n\tint32 NumExtraAttachedChildren() const { return ExtraAttachedChildren.Num(); }\n\n\t// Same as SetSelectedIndex only this works exclusively on the ExtraAttached children\n\tUFUNCTION(BlueprintCallable, Category = \">Selection\")\n\tvoid SetSelectedExtraAttachedIndex(int32 ExtraAttachedChildIndex, bool bPlaySound = false)\n\t{\n\t\tSetSelectedIndex(ConvertExtraAttachedChildIndexToAllChildIndex(ExtraAttachedChildIndex), bPlaySound);\n\t}\n\n\t// The parameter ChildIndex is a valid index in all the children [0, NumAllChildren)\n\t// Returns the index which is valid in the ExtraAttachedChildren Array [0, NumExtraAttachedChildren)\n\tint32 ConvertAllChildIndexToExtraAttachedChildIndex(int32 ChildIndex) const { return ChildIndex - NumContainerChildren(); }\n\n\t// The parameter ExtraAttachedChildIndex is a valid index in the ExtraAttachedChildren Array [0, NumExtraAttachedChildren)\n\t// Returns the index which is valid in all the children  [0, NumAllChildren)\n\tint32 ConvertExtraAttachedChildIndexToAllChildIndex(int32 ExtraAttachedChildIndex) const { return NumContainerChildren() + ExtraAttachedChildIndex; }\n\n\tbool IsIndexForExtraAttachedChildren(int32 ChildIndex) const\n\t{\n\t\treturn ExtraAttachedChildren.IsValidIndex(ConvertAllChildIndexToExtraAttachedChildIndex(ChildIndex));\n\t}\n\n\t// Is the index at the margins of the ExtraAttachedChildren array [0, Num)\n\tbool IsMarginIndexForExtraAttachedChildren(int32 ChildIndex) const\n\t{\n\t\tconst int32 NormalizedIndex = ConvertAllChildIndexToExtraAttachedChildIndex(ChildIndex);\n\t\treturn ExtraAttachedChildren.IsValidIndex(NormalizedIndex) && (NormalizedIndex == 0 || NormalizedIndex == ExtraAttachedChildren.Num() - 1);\n\t}\n\n\t//\n\t// Operations for ContainerChildren + ExtraAttachedChildren\n\t//\n\n\tstatic bool IsHorizontalCommand(ESoUICommand Command)\n\t{\n\t\treturn Command == ESoUICommand::EUC_Left || Command == ESoUICommand::EUC_Right;\n\t}\n\tstatic bool IsVerticalCommand(ESoUICommand Command)\n\t{\n\t\treturn Command == ESoUICommand::EUC_Up || Command == ESoUICommand::EUC_Down;\n\t}\n\n\t// Tells us if the layouts are in sync\n\tbool HasTwoDifferentLayouts() const\n\t{\n\t\tif (NumExtraAttachedChildren() > 0)\n\t\t\treturn bVerticalLayout != bExtraAttachedVerticalLayout;\n\n\t\t// We only use the ContainerChildren so this is a hard no\n\t\treturn false;\n\t}\n\n\t// Is the ButtonIndex a valid index for the buttons\n\t// NOTE: This counts all children, so ContainerChildren + ExtraAttachedChildren\n\tUFUNCTION(BlueprintPure, Category = \">Children\")\n\tbool IsValidIndex(int32 ChildIndex) const;\n\n\tbool IsValidWidgetAt(int32 ChildIndex) const { return IsWidgetValid(GetChildAt(ChildIndex)); }\n\n\t// Gets the number of children\n\t// NOTE: This counts all children, so ContainerChildren + ExtraAttachedChildren\n\tUFUNCTION(BlueprintPure, Category = \">Children\")\n\tint32 NumAllChildren() const { return NumContainerChildren() + NumExtraAttachedChildren(); }\n\n\t// NOTE: This counts all children, so ContainerChildren + ExtraAttachedChildren\n\tUFUNCTION(BlueprintPure, Category = \">Children\")\n\tUUserWidget* GetChildAt(int32 ChildIndex) const;\n\tUSoUIUserWidget* GetChildAtAsSoUserWidget(int32 ChildIndex) const;\n\tUSoUIUserWidgetArray* GetChildAtAsSoUserWidgetArray(int32 ChildIndex) const;\n\n\tUFUNCTION(BlueprintPure, Category = \">Children\")\n\tbool IsEmpty() const { return NumAllChildren() == 0; }\n\n\t//\n\t// NOTE: Not BP on purpose\n\t//\n\n\t// Active\n\tvirtual bool IsChildActive(int32 ChildIndex) const { return IsWidgetActive(GetChildAt(ChildIndex)); }\n\tvirtual void SetIsActiveOnAllChildren(bool bActive)\n\t{\n\t\tconst int32 NumChildren = NumAllChildren();\n\t\tfor (int32 Index = 0; Index < NumChildren; ++Index)\n\t\t\tSetIsActiveOnChildAt(Index, bActive);\n\t}\n\tvirtual bool SetIsActiveOnChildAt(int32 ChildIndex, bool bActive, bool bPlaySound = false)\n\t{\n\t\treturn SetIsActiveOnWidget(GetChildAt(ChildIndex), bActive, bPlaySound);\n\t}\n\n\tbool IsSelectedChildActive() const { return IsChildActive(GetSelectedIndex()); }\n\tbool SetSelectedChildIsActive(bool bActive, bool bPlaySound = false) { return SetIsActiveOnChildAt(GetSelectedIndex(), bActive, bPlaySound); }\n\n\t// Highlight\n\tbool SetIsHighlighted(bool bInHighlighted, bool bPlaySound = false) override;\n\tvirtual bool IsChildHighlighted(int32 ChildIndex) const { return IsWidgetHighlighted(GetChildAt(ChildIndex)); }\n\tvirtual void SetIsHighlightedOnAllChildren(bool bInHighlighted)\n\t{\n\t\tUE_LOG(\n\t\t\tLogSoUI,\n\t\t\tVerbose,\n\t\t\tTEXT(\"[%s] USoUIUserWidgetArray::SetIsHighlightedOnAllChildren(bInHighlighted = %d)\"),\n\t\t\t*GetName(), bInHighlighted\n\t\t);\n\n\t\tconst int32 NumChildren = NumAllChildren();\n\t\tfor (int32 Index = 0; Index < NumChildren; ++Index)\n\t\t\tSetIsHighlightedOnChildAt(Index, bInHighlighted);\n\t}\n\tvirtual bool SetIsHighlightedOnChildAt(int32 ChildIndex, bool bHighlight, bool bPlaySound = false);\n\tvirtual bool IsAnyChildHighlighted() const\n\t{\n\t\tconst int32 NumChildren = NumAllChildren();\n\t\tfor (int32 Index = 0; Index < NumChildren; ++Index)\n\t\t\tif (IsChildHighlighted(Index))\n\t\t\t\treturn true;\n\n\t\treturn false;\n\t}\n\n\tbool IsSelectedChildHighlighted() const { return IsChildHighlighted(GetSelectedIndex()); }\n\tbool SetSelectedChildIsHighlighted(bool bHighlight, bool bPlaySound = false) { return SetIsHighlightedOnChildAt(GetSelectedIndex(), bHighlight, bPlaySound); }\n\n\t// Enabled\n\tvirtual bool IsChildEnabled(int32 ChildIndex) const { return IsWidgetEnabled(GetChildAt(ChildIndex)); }\n\tvirtual bool SetIsEnabledOnChildAt(int32 ChildIndex, bool bEnabled) { return SetIsEnabledOnWidget(GetChildAt(ChildIndex), bEnabled); }\n\n\tbool IsSelectedChildEnabled() const { return IsChildEnabled(GetSelectedIndex()); }\n\tbool SetSelectedChildIsEnabled(bool bEnabled) { return SetIsEnabledOnChildAt(GetSelectedIndex(), bEnabled); }\n\n\t// Navigation\n\tvirtual bool NavigateOnChildAt(int32 ChildIndex, ESoUICommand Command, bool bPlaySound = true)\n\t{\n\t\treturn NavigateOnWidget(GetChildAt(ChildIndex), Command, bPlaySound);\n\t}\n\n\t//\n\t// Getters\n\t//\n\tbool IsVerticalLayout() const { return bVerticalLayout; }\n\n\t//\n\t// Setters\n\t//\n\n\tThisClass* SetCyclicNavigation(bool bEnable)\n\t{\n\t\tbCyclicNavigation = bEnable;\n\t\treturn this;\n\t}\n\tThisClass* SetVerticalLayout(bool bEnable)\n\t{\n\t\tbVerticalLayout = bEnable;\n\t\treturn this;\n\t}\n\tThisClass* SetExtraAttachedVerticalLayout(bool bEnable)\n\t{\n\t\tbExtraAttachedVerticalLayout = bEnable;\n\t\treturn this;\n\t}\n\tThisClass* SetSkipDeactivatedChildren(bool bEnable)\n\t{\n\t\tbSkipDeactivatedChildren = bEnable;\n\t\treturn this;\n\t}\n\tThisClass* SetUseCustomPadding(bool bEnable, const FMargin& InPadding)\n\t{\n\t\tbUseCustomPadding = bEnable;\n\t\tPaddingForEachChildren = InPadding;\n\t\treturn this;\n\t}\n\tThisClass* SetTrackPressedInput(bool bEnable)\n\t{\n\t\tbTrackPressedInput = bEnable;\n\t\treturn this;\n\t}\n\tThisClass* SetFakeVirtualContainer(bool bEnable)\n\t{\n\t\tbFakeVirtualContainer = bEnable;\n\t\treturn this;\n\t}\n\n\tThisClass* SetSFXChildSelectionChanged(UFMODEvent* SFX)\n\t{\n\t\tSFXChildSelectionChanged = SFX;\n\t\treturn this;\n\t}\n\tThisClass* SetSFXChildPressed(UFMODEvent* SFX)\n\t{\n\t\tSFXChildPressed = SFX;\n\t\treturn this;\n\t}\n\n\t// Events\n\tFSoNavigateOnPressedHandleChilEventCPP& OnNavigateOnPressedHandleChildEvent() { return NavigateOnPressedHandleChildEventCPP; }\n\tFSoNavigateOnPressedHandleChildArrayEventCPP& OnNavigateOnPressedHandleChildArrayEvent() { return NavigateOnPressedHandleChildArrayEventCPP; }\n\tFSoPostSetSelectedIndexEvent& OnPostSetSelectedIndexEvent() { return PostSetSelectedIndexEvent; }\n\tFSoPostSetSelectedIndexEvent& OnSelectedChildChangedEvent() { return PostSetSelectedIndexEvent; }\n\n\tFSoArrayChildBoolChangedEventCPP& OnChildHighlightChangedEvent() { return ProxyChildHighlightChangedEventCPP; }\n\tFSoArrayChildBoolChangedEventCPP& OnChildEnabledChangedEvent() { return ProxyChildEnabledChangedEventCPP; }\n\nprotected:\n\tstatic bool IsWidgetEnabled(UUserWidget* Widget);\n\tstatic bool IsWidgetValid(UUserWidget* Widget);\n\tstatic bool IsWidgetActive(UUserWidget* Widget);\n\tstatic bool IsWidgetHighlighted(UUserWidget* Widget);\n\tstatic bool SetIsEnabledOnWidget(UUserWidget* Widget, bool bEnabled);\n\tstatic bool SetIsHighlightedOnWidget(UUserWidget* Widget, bool bInHighlighted, bool bPlaySound = false);\n\tstatic bool SetIsActiveOnWidget(UUserWidget* Widget, bool bActive, bool bPlaySound = false);\n\tstatic bool NavigateOnWidget(UUserWidget* Widget, ESoUICommand Command, bool bPlaySound = true);\n\n\t//\n\t// USoUIUserWidgetBaseNavigation Interface\n\t//\n\n\tFReply OnUIEventType(ESoUIEventType EventType) override;\n\n\t//\n\t// Own methods\n\t//\n\n\tbool InternalCanUseContainer() const { return !bFakeVirtualContainer && Container; }\n\tvoid InternalSetSelectedIndex(int32 NewIndex);\n\n\t// Normal navigation on only children\n\t//\n\t// Or if we have children with layout bVertical and and extra attached child that is an Array is with layout !bVertical\n\t// This would also work because the direction of the extra attached child is opposite so the directions are mutually exclusive.\n\t// Aka this would return 0, which means nothing is modified and we would navigate ON the extra attached child Array\n\t// Example of this is in the Settings.\n\tstatic int32 InternalGetDirectChildrenDeltaFromCommand(ESoUICommand Command, bool bIsOnVerticalLayout);\n\n\tbool InternalGetDeltaFromCommand(ESoUICommand Command, int32 OldIndex, int32& OutDelta) const;\n\tint32 InternalGetNextChildIndex(int32 Delta, int32 CurrentIndex);\n\n\tvoid EnsureHighlights();\n\n\t// Listen/unlisten to event from the children\n\tvoid SubscribeToChildEvents(UUserWidget* Child, int32 ChildIndex);\n\tvoid UnSubscribeFromChildEvents(UUserWidget* Child);\n\n\t// Child requested we change the highlight. Most likely mouse or touch event\n\t// Children -> Parent (this)\n\tUFUNCTION()\n\tvirtual void OnRequestChildHighlightChange(int32 ChildIndex, bool bHighlight);\n\n\tUFUNCTION()\n\tvirtual void OnRequestChildPressed(int32 ChildIndex);\n\n\tvirtual void UpdateAllOverrides();\n\tvirtual void UpdateWidgetOverrides(UUserWidget* Widget, int32 ChildIndex);\n\tvoid UpdateOverridesSFX(UUserWidget* Widget);\n\tvoid UpdateOverrideCustomPadding(UUserWidget* Widget);\n\tvoid MapOverContainerChildren(TFunction<void(int32, UUserWidget*)> CallbackLoopBody);\n\n\t//\n\t// Handle CPP proxies\n\t//\n\tUFUNCTION()\n\tvoid OnProxyChildHighlightChangedEvent(int32 ChildIndex, bool bNewValue) { ProxyChildHighlightChangedEventCPP.Broadcast(ChildIndex, bNewValue); }\n\tUFUNCTION()\n\tvoid OnProxyChildEnabledChangedEvent(int32 ChildIndex, bool bNewValue) { ProxyChildEnabledChangedEventCPP.Broadcast(ChildIndex, bNewValue); }\n\npublic:\n\t//\n\t// Handle BP events and events firing\n\t//\n\n\tUFUNCTION(BlueprintImplementableEvent, BlueprintCosmetic, Category = \">Events\", DisplayName = \"OnChildHighlightChanged\")\n\tvoid ReceiveOnChildHighlightChanged(int32 ChildIndex, bool bHighlight);\n\tUFUNCTION(BlueprintCallable, Category = \">Events\")\n\tvirtual void OnChildHighlightChanged(int32 ChildIndex, bool bHighlight);\n\n\tUFUNCTION(BlueprintImplementableEvent, BlueprintCosmetic, Category = \">Events\", DisplayName = \"OnChildEnabledChanged\")\n\tvoid ReceiveOnChildEnabledChanged(int32 ChildIndex, bool bEnabled);\n\tUFUNCTION(BlueprintCallable, Category = \">Events\")\n\tvirtual void OnChildEnabledChanged(int32 ChildIndex, bool bEnabled);\n\nprotected:\n\t//\n\t// Events\n\t//\n\n\t// Handle NavigateOnPressed() on a simple widget\n\tUPROPERTY(BlueprintAssignable, Category = \">Events\", DisplayName = \"OnNavigateOnPressedHandleChildEvent\")\n\tFSoNavigateOnPressedHandleChilEvent NavigateOnPressedHandleChildEvent;\n\t// CPP variant\n\tFSoNavigateOnPressedHandleChilEventCPP NavigateOnPressedHandleChildEventCPP;\n\n\t// Handle NavigateOnPressed() on an Array Widget\n\tUPROPERTY(BlueprintAssignable, Category = \">Events\", DisplayName = \"OnNavigateOnPressedHandleChildArrayEvent\")\n\tFSoNavigateOnPressedHandleChildArrayEvent NavigateOnPressedHandleChildArrayEvent;\n\t// CPP variant\n\tFSoNavigateOnPressedHandleChildArrayEventCPP NavigateOnPressedHandleChildArrayEventCPP;\n\t// Broadcasts after setting the SelectedIndex\n\tFSoPostSetSelectedIndexEvent PostSetSelectedIndexEvent;\n\n\t// Child Highlight changed\n\tUPROPERTY(BlueprintAssignable, Category = \">Events\", DisplayName = \"OnChildHighlightChangedEvent\")\n\tFSoArrayChildBoolChangedEvent ChildHighlightChangedEvent;\n\n\t// Child Enabled changed\n\tUPROPERTY(BlueprintAssignable, Category = \">Events\", DisplayName = \"OnChildEnabledChangedEvent\")\n\tFSoArrayChildBoolChangedEvent ChildEnabledChangedEvent;\n\n\t// Proxy events that pass from Dynamic event to our event handler in CPP\n\tFSoArrayChildBoolChangedEventCPP ProxyChildHighlightChangedEventCPP;\n\tFSoArrayChildBoolChangedEventCPP ProxyChildEnabledChangedEventCPP;\n\n\n\t//\n\t// Variables\n\t//\n\n\t// Could be Vertical/Horizontal,\n\t// NOTE: can contain Non-Button elements\n\tUPROPERTY(BlueprintReadOnly, Category = \">Container\", meta = (BindWidget))\n\tUPanelWidget* Container = nullptr;\n\n\t/**\n\t * Actual buttons - maybe not all of them are displayed. But these are in the Container\n\t * NOTE: most of the time all of this correspond to the Container children\n\t * But in some cases they can differ\n\t */\n\tUPROPERTY(BlueprintReadOnly, Category = \">Children\")\n\tTArray<UUserWidget*> ContainerChildren;\n\n\t/**\n\t * Extra Children that are attached to this class but are NOT in the Container.\n\t * This allows us to have elements that are separate from the Container\n\t */\n\tUPROPERTY(BlueprintReadOnly, Category = \">Children\")\n\tTArray<UUserWidget*> ExtraAttachedChildren;\n\n\tUPROPERTY(BlueprintReadOnly, Category = \">Runtime\")\n\tbool bWasChildChangedInNavigate = false;\n\n\t//\n\t// Container\n\t//\n\n\t// If true we won't use the Container of this widget\n\t// It means the widgets are in some other container maybe external to this widget\n\t// NOTE: This essentially makes the ContainerChildren the same as the ExtraAttachedChildren\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere, Category = \">Container\")\n\tbool bFakeVirtualContainer = false;\n\n\t//\n\t// Selection\n\t//\n\n\t// If true this means if we unhighlight all children we will highlight the selected child (if any)\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere, Category = \">Selection\")\n\tbool bAlwaysHighlightAtLeastOneChild = false;\n\n\t// In most cases you want the highlight to also select the child index\n\t// If true: OnRequestChildHighlightChange will highlight and select\n\t// If false:\n\t// - highlight - OnRequestChildHighlightChange\n\t// - select - OnRequestChildPressed or Navigation\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere, Category = \">Selection\")\n\tbool bHighlightSelectsChild = true;\n\n\t//\n\t// Children\n\t//\n\n\t// Only used when creating the widgets ourselves in this class\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere, Category = \">Children\")\n\tTSubclassOf<UUserWidget> ChildWidgetClass;\n\n\t// Depending on the value after the last element the selected is either the first or none\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere, Category = \">Children\")\n\tbool bCyclicNavigation = false;\n\n\t// Decides if the navigation is controlled by the left/right or the up/down commands, only affects ContainerChildren\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere, Category = \">Children\")\n\tbool bVerticalLayout = false;\n\n\t// Same as bVerticalLayout but only affects ExtraAttachedChildren\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere, Category = \">Children\")\n\tbool bExtraAttachedVerticalLayout = false;\n\n\t// Decides if we should skip the children highlight for buttons that are not active.\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere, Category = \">Children\")\n\tbool bSkipDeactivatedChildren = false;\n\n\t//\n\t// Override\n\t//\n\n\t// Should we use PaddingForEachChildren\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere, Category = \">Override Padding\")\n\tbool bUseCustomPadding = false;\n\n\t// Padding applied to each children\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere, Category = \">Override Padding\")\n\tFMargin PaddingForEachChildren;\n\n\n\t//\n\t// Input\n\t//\n\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = \">Input\")\n\tFSoUITrackedInputKeyDown TrackedInput;\n\n\t// Enable moving navigation if a certain button is pressed\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = \">Input\")\n\tbool bTrackPressedInput = false;\n\n\t// Did we wrap around in the last Navigate\n\tUPROPERTY(BlueprintReadOnly, Category = \">Input\")\n\tbool bWasLastChildWrappedAround = false;\n\n\t// Runtime values\n\t// Currently selected button index inside the Children Array\n\tint32 SelectedIndex = INDEX_NONE;\n\n\t// The value of previous SelectedIndex\n\tint32 PreviousSelectedIndex = INDEX_NONE;\n\n\t//\n\t// SFX\n\t//\n\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere, Category = \">SFX\")\n\tbool bSFXSetDefault = true;\n\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere, Category = \">SFX\")\n\tUFMODEvent* SFXChildSelectionChanged = nullptr;\n\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere, Category = \">SFX\")\n\tUFMODEvent* SFXChildPressed = nullptr;\n\n\t// Override the individual buttons sounds with our sounds\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere, Category = \">SFX\")\n\tbool bSFXOverrideIndividualChildren = true;\n\n\t//\n\t// Cached\n\t//\n\n\tUPROPERTY()\n\tASoCharacter* SoCharacter = nullptr;\n\n\t//\n\t// Keep track of delegates\n\t//\n\tTMap<uint32, FDelegateHandle> DelegatesEnabledChangedMap;\n\tTMap<uint32, FDelegateHandle> DelegatesHighlightChangedMap;\n\tTMap<uint32, FDelegateHandle> DelegatesHighlightRequestChangeMap;\n\tTMap<uint32, FDelegateHandle> DelegatesPressedRequestMap;\n\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere, Category = \">Events\")\n\tbool bListenToChildHighlightRequest = true;\n\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere, Category = \">Events\")\n\tbool bListenToChildPressedRequest = true;\n};\n"
  },
  {
    "path": "Source/SOrb/UI/General/SoUIUserWidgetBaseNavigation.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#include \"SoUIUserWidgetBaseNavigation.h\"\n#include \"Basic/SoAudioManager.h\"\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIUserWidgetBaseNavigation::SynchronizeProperties()\n{\n\tSuper::SynchronizeProperties();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIUserWidgetBaseNavigation::NativeConstruct()\n{\n\tSuper::NativeConstruct();\n\n\t// Call our CPP\n\tStateChangedEvent.AddDynamic(this, &ThisClass::OnProxyStateChangedEvent);\n\tPressedEvent.AddDynamic(this, &ThisClass::OnProxyPressedEvent);\n\tHighlightChangedEvent.AddDynamic(this, &ThisClass::OnProxyHighlightChangedEvent);\n\tEnabledChangedEvent.AddDynamic(this, &ThisClass::OnProxyEnabledChangedEvent);\n\n\tbIsConstructed = true;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIUserWidgetBaseNavigation::NativeDestruct()\n{\n\tStateChangedEvent.RemoveDynamic(this, &ThisClass::OnProxyStateChangedEvent);\n\tPressedEvent.RemoveDynamic(this, &ThisClass::OnProxyPressedEvent);\n\tHighlightChangedEvent.RemoveDynamic(this, &ThisClass::OnProxyHighlightChangedEvent);\n\tEnabledChangedEvent.RemoveDynamic(this, &ThisClass::OnProxyEnabledChangedEvent);\n\n\tSuper::NativeDestruct();\n\tbIsConstructed = false;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIUserWidgetBaseNavigation::NativeOnMouseEnter(const FGeometry& InGeometry, const FPointerEvent& InMouseEvent)\n{\n\t// Give Event to CPP\n\tOnUIEventType(ESoUIEventType::MouseEnter);\n\n\t// Give event to BP\n\tSuper::NativeOnMouseEnter(InGeometry, InMouseEvent);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIUserWidgetBaseNavigation::NativeOnMouseLeave(const FPointerEvent& InMouseEvent)\n{\n\t// Give Event to CPP\n\tOnUIEventType(ESoUIEventType::MouseLeave);\n\n\t// Give event to BP\n\tSuper::NativeOnMouseLeave(InMouseEvent);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFReply USoUIUserWidgetBaseNavigation::NativeOnMouseButtonDown(const FGeometry& InGeometry, const FPointerEvent& InMouseEvent)\n{\n\t// Give Event to CPP\n\tconst FReply CPPReply = OnUIEventType(ESoUIEventType::MouseButtonDown);\n\n\t// Give event to BP\n\tconst FReply BPReply = Super::NativeOnMouseButtonDown(InGeometry, InMouseEvent);\n\n\treturn BPReply.IsEventHandled() ? BPReply : CPPReply;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFReply USoUIUserWidgetBaseNavigation::NativeOnMouseButtonUp(const FGeometry& InGeometry, const FPointerEvent& InMouseEvent)\n{\n\t// Give Event to CPP\n\tconst FReply CPPReply = OnUIEventType(ESoUIEventType::MouseButtonUp);\n\n\t// Give event to BP\n\tconst FReply BPReply = Super::NativeOnMouseButtonUp(InGeometry, InMouseEvent);\n\n\treturn BPReply.IsEventHandled() ? BPReply : CPPReply;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoUIUserWidgetBaseNavigation::Navigate(ESoUICommand Command, bool bPlaySound)\n{\n\tPreNavigateEvent.Broadcast();\n\n\tbool bStatus = false;\n\tif (Command == ESoUICommand::EUC_MainMenuEnter)\n\t{\n\t\tbStatus = NavigateOnPressed(bPlaySound);\n\t}\n\n\tPostNavigateEvent.Broadcast(bStatus);\n\treturn bStatus;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoUIUserWidgetBaseNavigation::NavigateOnPressed(bool bPlaySound)\n{\n\treturn false;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFReply USoUIUserWidgetBaseNavigation::OnUIEventType(ESoUIEventType EventType)\n{\n\tswitch (EventType)\n\t{\n\tcase ESoUIEventType::None:\n\t\tbreak;\n\tcase ESoUIEventType::MouseEnter:\n\t\tif (bHandleOwnMouseEvents)\n\t\t\tSetIsHighlighted(true, true);\n\t\telse\n\t\t\tHighlightRequestChangeEvent.Broadcast(true);\n\n\t\treturn FReply::Handled();\n\n\tcase ESoUIEventType::MouseLeave:\n\t\tif (bHandleOwnMouseEvents)\n\t\t\tSetIsHighlighted(false, false);\n\t\telse\n\t\t\tHighlightRequestChangeEvent.Broadcast(false);\n\n\t\treturn FReply::Handled();\n\n\tcase ESoUIEventType::MouseButtonDown:\n\t\tSetIsPressed(true);\n\t\tif (bHandleOwnMouseEvents)\n\t\t\tNavigateOnPressed(true);\n\n\t\tbreak;\n\n\tcase ESoUIEventType::MouseButtonUp:\n\t\tSetIsPressed(false);\n\t\tbreak;\n\tdefault:\n\t\tbreak;\n\t}\n\n\treturn FReply::Unhandled();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoUIUserWidgetBaseNavigation::SetIsHighlighted(bool bInHighlighted, bool bPlaySound)\n{\n\tif (bIsHighlighted != bInHighlighted)\n\t{\n\t\tif (bPlaySound)\n\t\t\tUSoAudioManager::PlaySound2D(this, SFXHighlightChanged);\n\n\t\tbIsHighlighted = bInHighlighted;\n\t\tUE_LOG(\n\t\t\tLogSoUI,\n\t\t\tVerbose,\n\t\t\tTEXT(\"[%s] USoUIUserWidgetBaseNavigation::SetIsHighlighted(bIsHighlighted = %d)\"),\n\t\t\t*GetName(), bIsHighlighted\n\t\t);\n\t\tOnHighlightChanged(bIsHighlighted);\n\t\treturn true;\n\t}\n\n\treturn false;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIUserWidgetBaseNavigation::SetIsEnabled(bool bInIsEnabled)\n{\n\tif (GetIsEnabled() != bInIsEnabled)\n\t{\n\t\tSuper::SetIsEnabled(bInIsEnabled);\n\t\tOnEnabledChanged(bInIsEnabled);\n\t}\n}\n"
  },
  {
    "path": "Source/SOrb/UI/General/SoUIUserWidgetBaseNavigation.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#pragma once\n\n#include \"CoreMinimal.h\"\n#include \"Blueprint/UserWidget.h\"\n#include \"SoUITypes.h\"\n\n#include \"SoUIUserWidgetBaseNavigation.generated.h\"\n\nclass UImage;\nclass UFMODEvent;\n\n\nDECLARE_MULTICAST_DELEGATE_OneParam(FSoUIUserWidgetRequestHighlightChangeEvent, bool);\n\n\n/**\n *  Common UserWidget functionality to be inherited by other widgets used for navigation with keyboard/controller/mouse\n */\nUCLASS(Abstract, HideCategories = (Navigation), AutoCollapseCategories = (Performance, Clipping, Interaction, Input))\nclass SORB_API USoUIUserWidgetBaseNavigation : public UUserWidget\n{\n\tGENERATED_BODY()\n\npublic:\n\t//\n\t// UUserWidget Interface\n\t//\n\tvoid SynchronizeProperties() override;\n\tvoid NativeConstruct() override;\n\tvoid NativeDestruct() override;\n\tvoid NativeOnMouseEnter(const FGeometry& InGeometry, const FPointerEvent& InMouseEvent) override;\n\tvoid NativeOnMouseLeave(const FPointerEvent& InMouseEvent) override;\n\tFReply NativeOnMouseButtonDown(const FGeometry& InGeometry, const FPointerEvent& InMouseEvent) override;\n \tFReply NativeOnMouseButtonUp(const FGeometry& InGeometry, const FPointerEvent& InMouseEvent) override;\n\n\t//  Sets the current enabled status of the widget\n\tvoid SetIsEnabled(bool bInIsEnabled) override;\n\n\t//\n\t// Own methods\n\t//\n\n\tUFUNCTION(BlueprintCallable, Category = \">Navigation\")\n\tvirtual bool Navigate(ESoUICommand Command, bool bPlaySound = true);\n\n\tUFUNCTION(BlueprintCallable, Category = \">Navigation\")\n\tvirtual bool NavigateOnPressed(bool bPlaySound = true);\n\n\t// Shortcut to set visibility so that we show/hide it correctly;\n\tUFUNCTION(BlueprintCallable, Category = \">Visibility\")\n\tvirtual void Show() { SetVisibility(ESlateVisibility::Visible); }\n\n\tUFUNCTION(BlueprintCallable, Category = \">Visibility\")\n\tvirtual void Hide() { SetVisibility(ESlateVisibility::Collapsed); }\n\n\t// Is active and visible\n\tUFUNCTION(BlueprintPure, Category = \">Widget\")\n\tvirtual bool IsValidWidget() const\n\t{\n\t\treturn GetIsEnabled() && IsVisible();\n\t}\n\n\tUFUNCTION(BlueprintCallable, Category = \">State\")\n\tbool Highlight(bool bPlaySound = false) { return SetIsHighlighted(true, bPlaySound); }\n\n\tUFUNCTION(BlueprintCallable, Category = \">State\")\n\tbool Unhighlight(bool bPlaySound = false) { return SetIsHighlighted(false, bPlaySound); }\n\n\tUFUNCTION(BlueprintPure, Category = \">State\", meta=(ScriptName=\"GetIsHighlighted\"))\n\tbool IsHighlighted() const { return bIsHighlighted; }\n\n\tUFUNCTION(BlueprintPure, Category = \">State\", meta=(ScriptName=\"GetIsPressed\"))\n\tbool IsPressed() const { return bIsPressed; }\n\n\t// Return true if NativeConstruct() was called\n\tUFUNCTION(BlueprintPure, Category = \">State\", meta=(ScriptName=\"GetIsConstructed\"))\n\tbool IsConstructed() const { return bIsConstructed; }\n\n\tUFUNCTION(BlueprintCallable, Category = \">State\")\n\tvirtual bool SetIsHighlighted(bool bInHighlighted, bool bPlaySound = false);\n\n\tbool IsHandlingOwnMouseEvents() const { return bHandleOwnMouseEvents; }\n\tvoid SetHandleOwnMouseEvents(bool bValue) { bHandleOwnMouseEvents = bValue; }\n\n\tThisClass* SetSFXHighlightChanged(UFMODEvent* SFX)\n\t{\n\t\tSFXHighlightChanged = SFX;\n\t\treturn this;\n\t}\n\tThisClass* SetSFXOnPressed(UFMODEvent* SFX)\n\t{\n\t\tSFXOnPressed = SFX;\n\t\treturn this;\n\t}\n\n\t// Events\n\tFSoUIUserWidgetRequestHighlightChangeEvent& OnHighlightRequestChangeEvent() { return HighlightRequestChangeEvent; }\n\tFSoPreNavigateEvent& OnPreNavigateEvent() { return PreNavigateEvent; }\n\tFSoPostNavigateEvent& OnPostNavigateEvent() { return PostNavigateEvent; }\n\n\tFSoUIUserWidgetEventCPP& OnStateChangedEvent() { return ProxyStateChangedEventCPP; }\n\tFSoUIUserWidgetEventCPP& OnPressedEvent() { return ProxyPressedEventCPP; }\n\tFSoUIUserWidgetChangedEventCPP& OnHighlightChangedEvent() { return ProxyHighlightChangedCPP; }\n\tFSoUIUserWidgetChangedEventCPP& OnEnabledChangedEvent() { return ProxyEnabledChangedCPP; }\n\nprotected:\n\t//\n\t// Handle CPP proxies\n\t//\n\tUFUNCTION()\n\tvoid OnProxyStateChangedEvent() { ProxyStateChangedEventCPP.Broadcast(); }\n\tUFUNCTION()\n\tvoid OnProxyPressedEvent() { ProxyPressedEventCPP.Broadcast(); }\n\tUFUNCTION()\n\tvoid OnProxyHighlightChangedEvent(bool bNewValue) { ProxyHighlightChangedCPP.Broadcast(bNewValue); }\n\tUFUNCTION()\n\tvoid OnProxyEnabledChangedEvent(bool bNewValue) { ProxyEnabledChangedCPP.Broadcast(bNewValue); }\n\n\tvirtual void SetIsPressed(bool bValue)\n\t{\n\t\tbIsPressed = bValue;\n\t\tif (bIsPressed)\n\t\t\tOnPressed();\n\t}\n\tvirtual FReply OnUIEventType(ESoUIEventType EventType);\n\npublic:\n\t//\n\t// Handle BP events and events firing\n\t//\n\n\tUFUNCTION(BlueprintImplementableEvent, BlueprintCosmetic, Category = \">Events\", DisplayName = \"OnStateChanged\")\n\tvoid ReceiveOnStateChanged();\n\tUFUNCTION(BlueprintCallable, Category = \">Events\")\n\tvirtual void OnStateChanged()\n\t{\n\t\tReceiveOnStateChanged();\n\t\tStateChangedEvent.Broadcast();\n\t}\n\n\tUFUNCTION(BlueprintImplementableEvent, BlueprintCosmetic, Category = \">Events\", DisplayName = \"OnPressed\")\n\tvoid ReceiveOnPressed();\n\tUFUNCTION(BlueprintCallable, Category = \">Events\")\n\tvirtual void OnPressed()\n\t{\n\t\tReceiveOnPressed();\n\t\tPressedEvent.Broadcast();\n\t}\n\n\tUFUNCTION(BlueprintImplementableEvent, BlueprintCosmetic, Category = \">Events\", DisplayName = \"OnHighlightChanged\")\n\tvoid ReceiveOnHighlightChanged(bool bHighlight);\n\tUFUNCTION(BlueprintCallable, Category = \">Events\")\n\tvirtual void OnHighlightChanged(bool bHighlight)\n\t{\n\t\tReceiveOnHighlightChanged(bHighlight);\n\t\tHighlightChangedEvent.Broadcast(bHighlight);\n\t\tOnStateChanged();\n\t}\n\n\tUFUNCTION(BlueprintImplementableEvent, BlueprintCosmetic, Category = \">Events\", DisplayName = \"OnEnabledChanged\")\n\tvoid ReceiveOnEnabledChanged(bool bEnabled);\n\tUFUNCTION(BlueprintCallable, Category = \">Events\")\n\tvirtual void OnEnabledChanged(bool bEnabled)\n\t{\n\t\tReceiveOnEnabledChanged(bEnabled);\n\t\tEnabledChangedEvent.Broadcast(bEnabled);\n\t\tOnStateChanged();\n\t}\n\nprotected:\n\t//\n\t// Events\n\t//\n\n\t// Special event used for arrays to know if we got highlighter\n\tFSoUIUserWidgetRequestHighlightChangeEvent HighlightRequestChangeEvent;\n\n\t// Broadcasts before doing anything in Navigate()\n\tUPROPERTY(BlueprintAssignable, Category = \">Events\", DisplayName = \"OnPreNavigateEvent\")\n\tFSoPreNavigateEvent PreNavigateEvent;\n\n\t// Broadcasts after executing Navigate()\n\tUPROPERTY(BlueprintAssignable, Category = \">Events\", DisplayName = \"OnPostNavigateEvent\")\n\tFSoPostNavigateEvent PostNavigateEvent;\n\n\t// Fired when the state of the widget changes\n\tUPROPERTY(BlueprintAssignable, Category = \">Events\", DisplayName = \"OnStateChangedEvent\")\n\tFSoUIUserWidgetEvent StateChangedEvent;\n\n\t// Fired when widget is pressed\n\tUPROPERTY(BlueprintAssignable, Category = \">Events\", DisplayName = \"OnPressedEvent\")\n\tFSoUIUserWidgetEvent PressedEvent;\n\n\t// Fired when the Highlight value of this widget changed\n\tUPROPERTY(BlueprintAssignable, Category = \">Events\", DisplayName = \"OnHighlightChangedEvent\")\n\tFSoUIUserWidgetChangedEvent HighlightChangedEvent;\n\n\t// Fired when the Enabled value of this widget changed\n\tUPROPERTY(BlueprintAssignable, Category = \">Events\", DisplayName = \"OnEnabledChangedEvent\")\n\tFSoUIUserWidgetChangedEvent EnabledChangedEvent;\n\n\t// Proxy events that pass from Dynamic event to our event handler in CPP\n\tFSoUIUserWidgetEventCPP ProxyStateChangedEventCPP;\n\tFSoUIUserWidgetEventCPP ProxyPressedEventCPP;\n\tFSoUIUserWidgetChangedEventCPP ProxyHighlightChangedCPP;\n\tFSoUIUserWidgetChangedEventCPP ProxyEnabledChangedCPP;\n\n\t//\n\t// Variables\n\t//\n\n\t// Is highlighted, usually used for selected stuff.\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = \">State\")\n\tbool bIsHighlighted = false;\n\n\t// This widget is handling the mouse events\n\t// Instead of a parent\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = \">Mouse\")\n\tbool bHandleOwnMouseEvents = false;\n\n\t// Is this widget pressed\n\t// Set on  ESoUIEventType::MouseButtonDown\n\t// Unset on ESoUIEventType::MouseButtonUp\n\tUPROPERTY(BlueprintReadOnly, Category = \">Mouse\")\n\tbool bIsPressed = false;\n\n\t// Was constructed at runtime?\n\t// Set in NativeConstruct()\n\t// Unset in NativeDestruct()\n\tUPROPERTY(BlueprintReadOnly, Category = \">State\")\n\tbool bIsConstructed = false;\n\n\t//\n\t// SFX\n\t//\n\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere, Category = \">SFX\")\n\tUFMODEvent* SFXHighlightChanged = nullptr;\n\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere, Category = \">SFX\")\n\tUFMODEvent* SFXOnPressed = nullptr;\n};\n"
  },
  {
    "path": "Source/SOrb/UI/General/SoUIUserWidgetDeviceVisibility.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#include \"SoUIUserWidgetDeviceVisibility.h\"\n\n#include \"Settings/Input/SoInputHelper.h\"\n#include \"Character/SoPlayerController.h\"\n#include \"UI/SoUIHelper.h\"\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIUserWidgetDeviceVisibility::SynchronizeProperties()\n{\n\tSuper::SynchronizeProperties();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIUserWidgetDeviceVisibility::NativeConstruct()\n{\n\tSuper::NativeConstruct();\n\n\tSubscribeToDeviceChanged();\n\tSetLocalDeviceType(USoInputHelper::GetCurrentDeviceType(this));\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIUserWidgetDeviceVisibility::NativeDestruct()\n{\n\tUnSubscribeFromDeviceChanged();\n\tSuper::NativeDestruct();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIUserWidgetDeviceVisibility::SubscribeToDeviceChanged()\n{\n\tif (bIsListeningToDevicesChanges)\n\t\treturn;\n\n\tif (ASoPlayerController* Controller = USoUIHelper::GetSoPlayerControllerFromUWidget(this))\n\t{\n\t\tController->OnDeviceTypeChanged().AddDynamic(this, &ThisClass::HandleDeviceTypeChanged);\n\t\tbIsListeningToDevicesChanges = true;\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIUserWidgetDeviceVisibility::UnSubscribeFromDeviceChanged()\n{\n\tif (!bIsListeningToDevicesChanges)\n\t\treturn;\n\n\tif (ASoPlayerController* Controller = USoUIHelper::GetSoPlayerControllerFromUWidget(this))\n\t{\n\t\tController->OnDeviceTypeChanged().RemoveDynamic(this, &ThisClass::HandleDeviceTypeChanged);\n\t\tbIsListeningToDevicesChanges = false;\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoUIUserWidgetDeviceVisibility::CanBeVisibleOnCurrentDeviceType() const\n{\n\t// Tooltip visibility does not match with the device type, hide widget\n\tconst bool bShouldBeKeyboard = WhenToShowVisibility == ESoUIUserWidgetDeviceVisibilityType::Keyboard && CachedDeviceType != ESoInputDeviceType::Keyboard;\n\tconst bool bShouldBeGamepad = WhenToShowVisibility == ESoUIUserWidgetDeviceVisibilityType::Gamepad && !USoInputHelper::IsInputDeviceTypeGamepad(CachedDeviceType);\n\tif (bShouldBeKeyboard || bShouldBeGamepad)\n\t{\n\t\treturn false;\n\t}\n\n\t// Default is all\n\treturn true;\n}\n"
  },
  {
    "path": "Source/SOrb/UI/General/SoUIUserWidgetDeviceVisibility.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#pragma once\n\n#include \"CoreMinimal.h\"\n#include \"Blueprint/UserWidget.h\"\n\n#include \"SoUITypes.h\"\n#include \"Settings/Input/SoInputSettingsTypes.h\"\n\n#include \"SoUIUserWidgetDeviceVisibility.generated.h\"\n\nclass UImage;\n\n\nUENUM(BlueprintType)\nenum class ESoUIUserWidgetDeviceVisibilityType : uint8\n{\n\tAll = 0\t\t\tUMETA(DisplayName = \"All\"),\n\tKeyboard\t\tUMETA(DisplayName = \"Keyboard only\"),\n\tGamepad\t\t\tUMETA(DisplayName = \"Gamepad only\"),\n};\n\n/**\n * Common UserWidget functionality for widgets to have different visibility depending on the device used.\n *\n * This will be visible only if the user allows us to be visible\n * AND our current device type allows us to be visible\n */\nUCLASS(HideCategories = (Navigation), AutoCollapseCategories = (Performance, Clipping, Interaction, Input))\nclass SORB_API USoUIUserWidgetDeviceVisibility : public UUserWidget\n{\n\tGENERATED_BODY()\n\npublic:\n\t//\n\t// UUserWidget Interface\n\t//\n\tvoid SynchronizeProperties() override;\n\tvoid NativeConstruct() override;\n\tvoid NativeDestruct() override;\n\n\t//\n\t// Own Methods\n\t//\n\n\tUFUNCTION(BlueprintCallable, Category = \">Visibility\")\n\tvoid SetIsListeningToDeviceChanges(bool bIsListening)\n\t{\n\t\tif (bIsListeningToDevicesChanges == bIsListening)\n\t\t\treturn;\n\n\t\tif (bIsListeningToDevicesChanges)\n\t\t\tUnSubscribeFromDeviceChanged();\n\t\telse\n\t\t\tSubscribeToDeviceChanged();\n\t}\n\n\tvirtual void SetDeviceType(ESoInputDeviceType NewDevice)\n\t{\n\t\tSetLocalDeviceType(NewDevice);\n\t}\n\n\tUFUNCTION(BlueprintCallable, Category = \">Visibility\")\n\tvoid SetWhenToShowVisibility(ESoUIUserWidgetDeviceVisibilityType InVisiblity)\n\t{\n\t\tWhenToShowVisibility = InVisiblity;\n\t\tUpdateVisibility();\n\t}\n\n\t// Method that take care of WhenToShowVisibility\n\t// If it is hidden because the wrong device is handling this method will do nothing if we are trying to hide something\n\tUFUNCTION(BlueprintCallable, Category = \">Visibility\")\n\tvoid SetShouldBeVisible(bool bVisible)\n\t{\n\t\tbShouldBeVisible = bVisible;\n\t\tUpdateVisibility();\n\t}\n\nprotected:\n\t// Only update local so that we do not update the image, that is done already\n\tUFUNCTION(BlueprintCallable, Category = \">Visibility\")\n\tvoid SetLocalDeviceType(ESoInputDeviceType NewDevice)\n\t{\n\t\tCachedDeviceType = NewDevice;\n\t\tUpdateVisibility();\n\t}\n\n\tUFUNCTION()\n\tvoid HandleDeviceTypeChanged(ESoInputDeviceType InDeviceType)\n\t{\n\t\tif (!bIsListeningToDevicesChanges)\n\t\t\treturn;\n\n\t\tSetLocalDeviceType(InDeviceType);\n\t}\n\n\tvoid SubscribeToDeviceChanged();\n\tvoid UnSubscribeFromDeviceChanged();\n\tvoid UpdateVisibility()\n\t{\n\t\t// User allows us to set it visible and container allows us\n\t\tconst bool bVisible = bShouldBeVisible && CanBeVisibleOnCurrentDeviceType();\n\t\tSetVisibility(bVisible ? ESlateVisibility::Visible : ESlateVisibility::Collapsed);\n\t}\n\tbool CanBeVisibleOnCurrentDeviceType() const;\n\nprotected:\n\t// Tells us where this container is visible\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = \">Visibility\")\n\tESoUIUserWidgetDeviceVisibilityType WhenToShowVisibility = ESoUIUserWidgetDeviceVisibilityType::All;\n\n\t// Set by user in SetShouldBeVisible\n\tUPROPERTY(BlueprintReadOnly, Category = \">Visibility\")\n\tbool bShouldBeVisible = true;\n\n\t// Keep track if we are listening or not\n\tUPROPERTY(BlueprintReadOnly, Category = \">Device\")\n\tbool bIsListeningToDevicesChanges = false;\n\n\t// Cached Current device Type\n\tESoInputDeviceType CachedDeviceType = ESoInputDeviceType::Keyboard;\n};\n"
  },
  {
    "path": "Source/SOrb/UI/General/SoUIVideoPlayer.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#include \"SoUIVideoPlayer.h\"\n\n#include \"Components/Image.h\"\n#include \"Components/TextBlock.h\"\n#include \"FileMediaSource.h\"\n#include \"MediaPlayer.h\"\n#include \"MediaSoundComponent.h\"\n#include \"IMediaEventSink.h\"\n#include \"TimerManager.h\"\n\n#include \"SoUIActorMediaAudioPlayer.h\"\n#include \"UI/General/SoUIPressAndHoldConfirmation.h\"\n#include \"Basic/SoGameSingleton.h\"\n#include \"Basic/SoAudioManager.h\"\n\nDEFINE_LOG_CATEGORY_STATIC(LogSoUIVideoPlayer, All, All);\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIVideoPlayer::SynchronizeProperties()\n{\n\tSuper::SynchronizeProperties();\n\tif (VideoTextureSource != nullptr)\n\t\tSetVideoTextureSource(VideoTextureSource);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIVideoPlayer::NativeTick(const FGeometry& MyGeometry, float InDeltaTime)\n{\n\tSuper::NativeTick(MyGeometry, InDeltaTime);\n\n\tif (bWaitingForLoad)\n\t{\n\t\tif (VideoTextureSource != nullptr && VideoMediaSource != nullptr && VideoMediaPlayer != nullptr)\n\t\t{\n\t\t\tbWaitingForLoad = false;\n\t\t\tOnWaitForStreamingEnd();\n\t\t\tStartVideo();\n\t\t}\n\t}\n\telse if (VideoMediaPlayer->IsPlaying() && SubtitleTextBlock != nullptr && CurrentSubtitles != nullptr)\n\t{\n\t\tconst float OldTime = Counter;\n\t\tCounter = Counter + InDeltaTime;\n\n\t\t// hide if needed first\n\t\tfor (int32 i = 0; i < CurrentSubtitles->Num(); ++i)\n\t\t{\n\t\t\tif (OldTime < (*CurrentSubtitles)[i].EndTime && Counter >= (*CurrentSubtitles)[i].EndTime)\n\t\t\t{\n\t\t\t\t// do not collapse to avoid ui glitch when it becomes visible again\n\t\t\t\tSubtitleTextBlock->SetVisibility(ESlateVisibility::Hidden);\n\n\t\t\t\tif (CurrentSubtitles->IsValidIndex(i + 1))\n\t\t\t\t\tSubtitleTextBlock->SetText((*CurrentSubtitles)[i + 1].Text);\n\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\t// set text and show if needed\n\t\tfor (FSoVideoSubtitle& Sub : *CurrentSubtitles)\n\t\t{\n\t\t\tif (OldTime < Sub.StartTime && Counter >= Sub.StartTime)\n\t\t\t{\n\t\t\t\tSubtitleTextBlock->SetVisibility(ESlateVisibility::Visible);\n\t\t\t\tSubtitleTextBlock->SetText(Sub.Text);\n\t\t\t}\n\t\t}\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIVideoPlayer::NativeConstruct()\n{\n\tSuper::NativeConstruct();\n\n\t// Hide by default\n\tSetVisibility(ESlateVisibility::Collapsed);\n\n\tSkipButton->OnConfirmed().AddDynamic(this, &USoUIVideoPlayer::SkipVideo);\n\tSubtitleTextBlock->SetVisibility(ESlateVisibility::Collapsed);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIVideoPlayer::NativeDestruct()\n{\n\tSuper::NativeDestruct();\n\n\tSkipButton->OnConfirmed().RemoveDynamic(this, &USoUIVideoPlayer::OnSkipOrEnd);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIVideoPlayer::StartVideo(TSoftObjectPtr<UMediaSource> VideoMediaSourcePtr,\n\t\t\t\t\t\t\t\t  TSoftObjectPtr<UMediaPlayer> VideoMediaPlayerPtr,\n\t\t\t\t\t\t\t\t  TSoftObjectPtr<UMediaTexture> VideoMediaTexturePtr,\n\t\t\t\t\t\t\t\t  UFMODEvent* InVideoSound)\n{\n\tVideoTextureSource = nullptr;\n\tVideoMediaSource = nullptr;\n\tVideoMediaPlayer = nullptr;\n\tSubtitleTextBlock->SetVisibility(ESlateVisibility::Collapsed);\n\n\tbReleaseResourcesAtEnd = true;\n\n\tCurrentVideoMediaSourcePtr = VideoMediaSourcePtr;\n\tCurrentVideoMediaPlayerPtr = VideoMediaPlayerPtr;\n\tCurrentVideoMediaTexturePtr = VideoMediaTexturePtr;\n\n\tVideoSound = InVideoSound;\n\n\tif (UpdateResourcesFromPtrs())\n\t{\n\t\tStartVideo();\n\t}\n\telse\n\t{\n\t\tSetVisibility(ESlateVisibility::Visible);\n\t\tbWaitingForLoad = true;\n\t\tOnWaitForStreamingStart();\n\t}\n\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIVideoPlayer::SetVideoTextureSource(UObject* InVideoTextureSource)\n{\n\tcheckf(InVideoTextureSource != nullptr, TEXT(\"Did you package the movies?\"));\n\tVideoTextureSource = InVideoTextureSource;\n\tif (VideoPlayer)\n\t{\n\t\tVideoPlayer->Brush.SetResourceObject(VideoTextureSource);\n\t\tVideoPlayer->SynchronizeProperties();\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIVideoPlayer::SetVideoMediaSource(UMediaSource* InVideoMediaSource)\n{\n\tcheckf(InVideoMediaSource != nullptr, TEXT(\"Did you package the movies?\"));\n\tVideoMediaSource = InVideoMediaSource;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIVideoPlayer::SetVideoMediaPlayer(UMediaPlayer* InVideoMediaPlayer)\n{\n\tcheckf(InVideoMediaPlayer != nullptr, TEXT(\"Did you package the movies?\"));\n\tif (!InVideoMediaPlayer)\n\t{\n\t\treturn;\n\t}\n\n\tVideoMediaPlayer = InVideoMediaPlayer;\n\tVideoMediaPlayer->OnMediaEvent().AddUObject(this, &Self::HandleMediaPlayerMediaEvent);\n\n\t// This must be true because Play() manually does not work for some reason\n\tVideoMediaPlayer->PlayOnOpen = true;\n\tVideoMediaPlayer->Shuffle = false;\n\n\tif (!VideoAudioPlayer)\n\t{\n\t\tVideoAudioPlayer = ASoUIActorMediaAudioPlayer::SpawnInWorld(GetWorld());\n\t}\n\n\tif (VideoAudioPlayer)\n\t{\n\t\tVideoAudioPlayer->SetMediaPlayer(VideoMediaPlayer);\n\t}\n\telse\n\t{\n\t\tUE_LOG(LogSoUIVideoPlayer, Error, TEXT(\"SetVideoMediaPlayer: No AudioPlayer set. No sounds provided RIP\"));\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIVideoPlayer::StartVideo()\n{\n\tSkipButton->Reinitialize();\n\n\tif (!VideoTextureSource)\n\t{\n\t\tUE_LOG(LogSoUIVideoPlayer, Error, TEXT(\"No VideoTextureSource set. Aborting StartVideo\"));\n\t\treturn;\n\t}\n\tif (!VideoMediaSource)\n\t{\n\t\tUE_LOG(LogSoUIVideoPlayer, Error, TEXT(\"No VideoMediaSource set. Aborting StartVideo\"));\n\t\treturn;\n\t}\n\tif (!VideoMediaPlayer)\n\t{\n\t\tUE_LOG(LogSoUIVideoPlayer, Error, TEXT(\"No VideoMediaPlayer set. Aborting StartVideo\"));\n\t\treturn;\n\t}\n\tSetVisibility(ESlateVisibility::Visible);\n\n\tVideoMediaPlayer->SetLooping(bIsLooping);\n\tif (VideoMediaPlayer->OpenSource(VideoMediaSource))\n\t{\n\t\t// Play at normal rate\n\t\t// Useless call it sems cuz mediaplayer is made by users with IQ of 1000\n\t\tVideoMediaPlayer->Play();\n\n\t\tif (VideoSound != nullptr)\n\t\t{\n\t\t\t// VideoMediaPlayer->SetNativeVolume(0.0f);\n\t\t\tSoundEventInstance = USoAudioManager::PlaySound2D(this, VideoSound, true);\n\t\t}\n\n\t\t//if (VideoAudioPlayer)\n\t\t//\tVideoAudioPlayer->Start();\n\t}\n\telse\n\t{\n\t\tUE_LOG(LogSoUIVideoPlayer, Error, TEXT(\"StartVideo: Can't open media source\"));\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIVideoPlayer::StopVideo()\n{\n\tSetVisibility(ESlateVisibility::Collapsed);\n\tif (!VideoTextureSource)\n\t{\n\t\tUE_LOG(LogSoUIVideoPlayer, Error, TEXT(\"No VideoTextureSource set. Aborting StartVideo\"));\n\t\treturn;\n\t}\n\tif (!VideoMediaPlayer)\n\t{\n\t\tUE_LOG(LogSoUIVideoPlayer, Error, TEXT(\"No VideoMediaPlayer set. Can't StopVideo\"));\n\t\treturn;\n\t}\n\n\tif (VideoMediaPlayer->IsPlaying())\n\t{\n\t\tif (VideoSound != nullptr)\n\t\t{\n\t\t\tUSoAudioManager::SoundInstanceStop(SoundEventInstance, true);\n\t\t\tSoundEventInstance.Instance = nullptr;\n\t\t\tVideoSound = nullptr;\n\t\t}\n\t\t\n\t\tVideoMediaPlayer->Close();\n\t}\n\telse\n\t{\n\t\tUE_LOG(LogSoUIVideoPlayer, Warning, TEXT(\"VideoMediaPlayer was not playing. Weird.\"));\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIVideoPlayer::SkipVideo()\n{\n\tPauseVideo(true);\n\tif (VideoSound != nullptr)\n\t{\n\t\tUSoAudioManager::SoundInstanceStop(SoundEventInstance, true);\n\t\tSoundEventInstance.Instance = nullptr;\n\t\tVideoSound = nullptr;\n\t}\n\tOnSkipOrEnd();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIVideoPlayer::PauseVideo(bool bPause)\n{\n\tif (!VideoMediaPlayer)\n\t{\n\t\tUE_LOG(LogSoUIVideoPlayer, Error, TEXT(\"No VideoMediaPlayer set. Can't PauseVideo\"));\n\t\treturn;\n\t}\n\n\tif (bPause)\n\t\tVideoMediaPlayer->Pause();\n\telse\n\t\tVideoMediaPlayer->Play();\n\n\tif (VideoSound != nullptr)\n\t\tUSoAudioManager::SoundInstancePause(SoundEventInstance, bPause);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoUIVideoPlayer::IsVideoPaused() const\n{\n\tif (!VideoMediaPlayer)\n\t{\n\t\treturn false;\n\t}\n\n\treturn VideoMediaPlayer->IsPaused();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIVideoPlayer::OnSkipOrEnd()\n{\n\tStopVideo();\n\tOnVideoFinishedOrSkipped.Broadcast();\n\n\tif (bReleaseResourcesAtEnd)\n\t{\n\t\tbReleaseResourcesAtEnd = false;\n\t\tStreamableManager.Unload(CurrentVideoMediaSourcePtr.ToSoftObjectPath());\n\t\tStreamableManager.Unload(CurrentVideoMediaPlayerPtr.ToSoftObjectPath());\n\t\tStreamableManager.Unload(CurrentVideoMediaTexturePtr.ToSoftObjectPath());\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIVideoPlayer::HandleMediaPlayerMediaEvent(EMediaEvent Event)\n{\n\tif (VideoAudioPlayer == nullptr)\n\t{\n\t\treturn;\n\t}\n\n\tif (Event == EMediaEvent::PlaybackEndReached)\n\t{\n\t\tOnSkipOrEnd();\n\t}\n\n\t//if (Event == EMediaEvent::PlaybackSuspended)\n\t//{\n\t//\tVideoAudioPlayer->MediaSoundComponent->Stop();\n\t//}\n\t//else if (Event == EMediaEvent::PlaybackResumed)\n\t//{\n\t//\tVideoAudioPlayer->MediaSoundComponent->Start();\n\t//}\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoUIVideoPlayer::UpdateResourcesFromPtrs()\n{\n\tbool bAllLoaded = true;\n\n\t// Texture source\n\tif (UObject* VTS = CurrentVideoMediaTexturePtr.Get())\n\t{\n\t\tSetVideoTextureSource(VTS);\n\t}\n\telse\n\t{\n\t\tbAllLoaded = false;\n\t\tconst FSoftObjectPath ValuePath = CurrentVideoMediaTexturePtr.ToSoftObjectPath();\n\t\tStreamableManager.RequestAsyncLoad(ValuePath, [this, ValuePath]()\n\t\t{\n\t\t\tSetVideoTextureSource(ValuePath.ResolveObject());\n\t\t});\n\n\t}\n\n\t//  Media player\n\tif (UMediaPlayer* VMP = CurrentVideoMediaPlayerPtr.Get())\n\t{\n\t\tSetVideoMediaPlayer(VMP);\n\t}\n\telse\n\t{\n\t\tbAllLoaded = false;\n\t\tconst FSoftObjectPath ValuePath = CurrentVideoMediaPlayerPtr.ToSoftObjectPath();\n\t\tStreamableManager.RequestAsyncLoad(ValuePath, [this, ValuePath]()\n\t\t{\n\t\t\tSetVideoMediaPlayer(Cast<UMediaPlayer>(ValuePath.ResolveObject()));\n\t\t});\n\t}\n\n\t//  Media source\n\tif (UMediaSource* MSP = CurrentVideoMediaSourcePtr.Get())\n\t{\n\t\tSetVideoMediaSource(MSP);\n\t}\n\telse\n\t{\n\t\tbAllLoaded = false;\n\t\tconst FSoftObjectPath ValuePath = CurrentVideoMediaSourcePtr.ToSoftObjectPath();\n\t\tStreamableManager.RequestAsyncLoad(ValuePath, [this, ValuePath]()\n\t\t{\n\t\t\tSetVideoMediaSource(Cast<UMediaSource>(ValuePath.ResolveObject()));\n\t\t});\n\t}\n\n\treturn bAllLoaded;\n}\n"
  },
  {
    "path": "Source/SOrb/UI/General/SoUIVideoPlayer.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#pragma once\n\n#include \"Blueprint/UserWidget.h\"\n\n#include \"FMODBlueprintStatics.h\"\n\n#include \"Engine/StreamableManager.h\"\n#include \"MediaTexture.h\"\n\n#include \"SoUIVideoPlayer.generated.h\"\n\nclass ASoUIActorMediaAudioPlayer;\nclass UFileMediaSource;\nclass UMediaSource;\nclass UMediaPlayer;\nclass UImage;\nenum class EMediaEvent;\nclass USoUIPressAndHoldConfirmation;\nclass UFMODEvent;\n\nDECLARE_DYNAMIC_MULTICAST_DELEGATE(FSoVideoFinished);\n\n\nUCLASS(HideCategories = (\"Navigation\"))\nclass SORB_API USoUIVideoPlayer : public UUserWidget\n{\n\tGENERATED_BODY()\n\ttypedef USoUIVideoPlayer Self;\n\npublic:\n\t//\n\t// UUserWidget Interface\n\t//\n\tvoid SynchronizeProperties() override;\n\tvoid NativeTick(const FGeometry& MyGeometry, float InDeltaTime);\n\tvoid NativeConstruct() override;\n\tvoid NativeDestruct() override;\n\n\t//\n\t// Own methods\n\t//\n\n\tvoid StartVideo(TSoftObjectPtr<UMediaSource> VideoMediaSourcePtr,\n\t\t\t\t\tTSoftObjectPtr<UMediaPlayer> VideoMediaPlayerPtr,\n\t\t\t\t\tTSoftObjectPtr<UMediaTexture> VideoMediaTexturePtr,\n\t\t\t\t\tUFMODEvent* InVideoSound = nullptr);\n\n\n\tUFUNCTION(BlueprintCallable)\n\tvoid SetVideoTextureSource(UObject* InVideoTextureSource);\n\n\tUFUNCTION(BlueprintCallable)\n\tvoid SetVideoMediaSource(UMediaSource* InVideoMediaSource);\n\n\tUFUNCTION(BlueprintCallable)\n\tvoid SetVideoMediaPlayer(UMediaPlayer* InVideoMediaPlayer);\n\n\tUFUNCTION(BlueprintCallable)\n\tvoid StartVideo();\n\n\tUFUNCTION(BlueprintCallable)\n\tvoid StopVideo();\n\n\tUFUNCTION(BlueprintCallable)\n\tvoid SkipVideo();\n\n\tvoid SetSubtitles(TArray<struct FSoVideoSubtitle>* Sub) { CurrentSubtitles = Sub; }\n\n\tvoid PauseVideo(bool bPause);\n\tbool IsVideoPaused() const;\n\n\tUFUNCTION(BlueprintCallable)\n\tvoid SetIsVideoLooping(bool bValue) { bIsLooping = bValue; }\n\n\n\tUFUNCTION()\n\tvoid OnSkipOrEnd();\n\nprotected:\n\n\tUFUNCTION(BlueprintImplementableEvent)\n\tvoid OnWaitForStreamingStart();\n\n\tUFUNCTION(BlueprintImplementableEvent)\n\tvoid OnWaitForStreamingEnd();\n\n\n\tvoid HandleMediaPlayerMediaEvent(EMediaEvent Event);\n\n\t/** Return value true if all of them is valid and loaded\n\t  * if they are not the function starts the asynch load process and  they eventually will be loaded\n\t  * Checking the pointers is sufficient in this case\n\t  */\n\tbool UpdateResourcesFromPtrs();\n\npublic:\n\t// The source of the video player\n\tUPROPERTY(EditAnywhere, BlueprintReadOnly, Category = \">Video\", meta = (AllowPrivateAccess = \"true\", DisplayThumbnail = \"true\", AllowedClasses = \"Texture,MaterialInterface,SlateTextureAtlasInterface\"))\n\tUObject* VideoTextureSource = nullptr;\n\n\t// The video file we are playing\n\tUPROPERTY(EditAnywhere, BlueprintReadOnly, Category = \">Video\")\n\tUMediaSource* VideoMediaSource = nullptr;\n\n\t// The media player we are using\n\tUPROPERTY(EditAnywhere, BlueprintReadOnly, Category = \">Video\")\n\tUMediaPlayer* VideoMediaPlayer = nullptr;\n\n\tUPROPERTY(BlueprintReadOnly, Category = \">Video\")\n\tASoUIActorMediaAudioPlayer* VideoAudioPlayer = nullptr;\n\n\t// Is Video looping\n\tUPROPERTY(EditAnywhere, BlueprintReadOnly, Category = \">Video\")\n\tbool bIsLooping = true;\n\n\tUPROPERTY(BlueprintReadWrite, meta = (BindWidget), Category = \">Video\")\n\tUImage* VideoPlayer = nullptr;\n\n\n\tUPROPERTY(BlueprintReadWrite, meta = (BindWidget), Category = \">Video\")\n\tUSoUIPressAndHoldConfirmation* SkipButton;\n\n\n\tUPROPERTY(BlueprintReadWrite, meta = (BindWidget), Category = \">Video\")\n\tclass UTextBlock* SubtitleTextBlock = nullptr;\n\n\n\tFSoVideoFinished OnVideoFinishedOrSkipped;\n\n\tbool bWaitingForLoad = false;\n\n\tbool bReleaseResourcesAtEnd = false;\n\nprotected:\n\n\t// A native class for managing streaming assets in and keeping them in memory.\n\tFStreamableManager StreamableManager;\n\n\tTSoftObjectPtr<UMediaSource> CurrentVideoMediaSourcePtr;\n\tTSoftObjectPtr<UMediaPlayer> CurrentVideoMediaPlayerPtr;\n\tTSoftObjectPtr<UMediaTexture> CurrentVideoMediaTexturePtr;\n\n\tUPROPERTY()\n\tclass UFMODEvent* VideoSound;\n\n\n\tFFMODEventInstance SoundEventInstance;\n\n\t// subtitles\n\tTArray<struct FSoVideoSubtitle>* CurrentSubtitles = nullptr;\n\tfloat Counter = -0.0f;\n};\n"
  },
  {
    "path": "Source/SOrb/UI/InGame/Cooldowns/SoUICooldownEntry.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#include \"SoUICooldownEntry.h\"\n\n#include \"Components/Image.h\"\n#include \"Materials/MaterialInstanceDynamic.h\"\n\n#include \"Character/SoCharacterStrike.h\"\n#include \"Character/SoCharacter.h\"\n#include \"Basic/Helpers/SoStaticHelper.h\"\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUICooldownEntry::NativeConstruct()\n{\n\tSuper::NativeConstruct();\n\n\tSetVisibility(ESlateVisibility::Collapsed);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUICooldownEntry::Setup(int32 InIndex, const UObject* InObjectWithCooldown, float InCounter)\n{\n\tSetVisibility(ESlateVisibility::Visible);\n\tObjectWithCooldown = InObjectWithCooldown;\n\tRemainingTime = InCounter;\n\tIndex = InIndex;\n\n\tif (ObjectWithCooldown != nullptr)\n\t{\n\t\tLine->GetDynamicMaterial()->SetScalarParameterValue(PercentName, RemainingTime / ISoCooldown::Execute_GetCooldownDuration(ObjectWithCooldown));\n\t\tIcon->SetBrushFromTexture(ISoCooldown::Execute_GetCooldownIcon(ObjectWithCooldown));\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUICooldownEntry::Setup(const USoUICooldownEntry* Reference)\n{\n\tSetup(Reference->GetIndex(), Reference->GetObjectWithCooldown(), Reference->GetRemainingTime());\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUICooldownEntry::ClearAndHide()\n{\n\tObjectWithCooldown = nullptr;\n\tRemainingTime = -1.0f;\n\tIndex = -1;\n\tStopAllAnimations();\n\n\tSetVisibility(ESlateVisibility::Hidden);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoUICooldownEntry::Update()\n{\n\tif (ASoCharacter* Character = USoStaticHelper::GetPlayerCharacterAsSoCharacter(this))\n\t{\n\t\tconst TArray<FSoCooldownCounter>& Cooldowns = Character->GetCooldowns();\n\t\tif (Cooldowns.IsValidIndex(Index) && Cooldowns[Index].Object == ObjectWithCooldown && ObjectWithCooldown != nullptr)\n\t\t{\n\t\t\tRemainingTime = FMath::Max(Cooldowns[Index].Counter, 0.0f);\n\t\t\tLine->GetDynamicMaterial()->SetScalarParameterValue(PercentName, RemainingTime / ISoCooldown::Execute_GetCooldownDuration(ObjectWithCooldown));\n\t\t\treturn true;\n\t\t}\n\t}\n\treturn false;\n}\n"
  },
  {
    "path": "Source/SOrb/UI/InGame/Cooldowns/SoUICooldownEntry.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#pragma once\n\n#include \"CoreMinimal.h\"\n#include \"Blueprint/UserWidget.h\"\n\n#include \"SoUICooldownEntry.generated.h\"\n\nclass UImage;\n\n ////////////////////////////////////////////////////////////////////////////////////////\nUCLASS()\nclass SORB_API USoUICooldownEntry : public UUserWidget\n{\n\tGENERATED_BODY()\n\nprotected:\n\tvoid NativeConstruct() override;\n\npublic:\n\tvoid Setup(int32 InIndex, const UObject* InObjectWithCooldown, float InRemainingTime);\n\tvoid Setup(const USoUICooldownEntry* Reference);\n\tvoid ClearAndHide();\n\n\t// return value true if it should be displayed\n\tbool Update();\n\n\tint32 GetIndex() const { return Index; }\n\tfloat GetRemainingTime() const { return RemainingTime; }\n\tconst UObject* GetObjectWithCooldown() const { return ObjectWithCooldown; }\n\n\tUFUNCTION(BlueprintImplementableEvent)\n\tvoid OnBlockEvent();\n\nprotected:\n\tUPROPERTY()\n\tconst UObject* ObjectWithCooldown;\n\n\tfloat RemainingTime;\n\n\tint32 Index;\n\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\", meta = (BindWidget))\n\tUImage* Line;\n\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\", meta = (BindWidget))\n\tUImage* Icon;\n\n\tconst FName PercentName = FName(\"Percent\");\n};\n"
  },
  {
    "path": "Source/SOrb/UI/InGame/Cooldowns/SoUICooldownList.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#include \"SoUICooldownList.h\"\n\n#include \"Components/PanelWidget.h\"\n#include \"Components/PanelSlot.h\"\n\n#include \"SoUICooldownEntry.h\"\n#include \"Character/SoCharacter.h\"\n#include \"Basic/Helpers/SoStaticHelper.h\"\n\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUICooldownList::NativeConstruct()\n{\n\tSuper::NativeConstruct();\n\n\tif (ASoCharacter* SoCharacter = USoStaticHelper::GetPlayerCharacterAsSoCharacter(this))\n\t{\n\t\tSoCharacter->OnCooldownStarted().AddDynamic(this, &USoUICooldownList::OnCooldownStarted);\n\t\tSoCharacter->OnCooldownEnded().AddDynamic(this, &USoUICooldownList::OnCooldownEnded);\n\t\tSoCharacter->OnCooldownBlocksEvent().AddDynamic(this, &USoUICooldownList::OnCooldownBlocksEvent);\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUICooldownList::NativeDestruct()\n{\n\tif (ASoCharacter* SoCharacter = USoStaticHelper::GetPlayerCharacterAsSoCharacter(this))\n\t{\n\t\tSoCharacter->OnCooldownStarted().RemoveDynamic(this, &USoUICooldownList::OnCooldownStarted);\n\t\tSoCharacter->OnCooldownBlocksEvent().RemoveDynamic(this, &USoUICooldownList::OnCooldownBlocksEvent);\n\t\tSoCharacter->OnCooldownEnded().RemoveDynamic(this, &USoUICooldownList::OnCooldownEnded);\n\t}\n\n\tSuper::NativeDestruct();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUICooldownList::NativeTick(const FGeometry& MyGeometry, float InDeltaTime)\n{\n\tconst TArray<UPanelSlot*>& Slots = Container->GetSlots();\n\tconst int32 OldUsedEntryNum = UsedEntryNum;\n\tfor (int32 i = OldUsedEntryNum - 1; i >= 0; --i)\n\t{\n\t\tif (USoUICooldownEntry* Entry = Cast<USoUICooldownEntry>(Slots[i]->Content))\n\t\t{\n\t\t\tif (!Entry->Update())\n\t\t\t{\n\t\t\t\t// move all data bellow this (maybe not necessary if the list is ordered anyway?), and hide the last entry\n\t\t\t\tint32 LastIndex = i;\n\t\t\t\tfor (; LastIndex <= OldUsedEntryNum - 2; ++LastIndex)\n\t\t\t\t{\n\t\t\t\t\tUSoUICooldownEntry* Current = Cast<USoUICooldownEntry>(Slots[LastIndex]->Content);\n\t\t\t\t\tUSoUICooldownEntry* Next = Cast<USoUICooldownEntry>(Slots[LastIndex + 1]->Content);\n\t\t\t\t\tif (Current != nullptr && Next != nullptr)\n\t\t\t\t\t\tCurrent->Setup(Cast<USoUICooldownEntry>(Next));\n\t\t\t\t}\n\n\t\t\t\tUSoUICooldownEntry* Current = Cast<USoUICooldownEntry>(Slots[LastIndex]->Content);\n\t\t\t\tif (Current != nullptr)\n\t\t\t\t{\n\t\t\t\t\tCurrent->ClearAndHide();\n\t\t\t\t\tUsedEntryNum -= 1;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tSuper::NativeTick(MyGeometry, InDeltaTime);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUICooldownList::OnCooldownStarted(int32 Index, float RemainingTime, const UObject* ObjectWithCooldown)\n{\n\tconst TArray<UPanelSlot*>& Slots = Container->GetSlots();\n\n\tUsedEntryNum += 1;\n\tfor (int32 j = UsedEntryNum - 1; j > Index; --j)\n\t{\n\t\tif (Slots.IsValidIndex(j))\n\t\t{\n\t\t\tUSoUICooldownEntry* Current = Cast<USoUICooldownEntry>(Slots[j]->Content);\n\t\t\tUSoUICooldownEntry* Prev = Cast<USoUICooldownEntry>(Slots[j - 1]->Content);\n\t\t\tif (Current != nullptr && Prev != nullptr)\n\t\t\t\tCurrent->Setup(j, Prev->GetObjectWithCooldown(), Prev->GetRemainingTime());\n\t\t}\n\t}\n\n\tif (Slots.IsValidIndex(Index))\n\t{\n\t\tUSoUICooldownEntry* Current = Cast<USoUICooldownEntry>(Slots[Index]->Content);\n\t\tif (Current != nullptr)\n\t\t\tCurrent->Setup(Index, ObjectWithCooldown, RemainingTime);\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUICooldownList::OnCooldownEnded(int32 Index, float RemainingTime, const UObject* ObjectWithCooldown)\n{\n\tif (Index >= 0 && Index < UsedEntryNum)\n\t{\n\t\tconst TArray<UPanelSlot*>& Slots = Container->GetSlots();\n\t\tint32 LastIndex = Index;\n\t\tfor (; LastIndex <= UsedEntryNum - 2; ++LastIndex)\n\t\t{\n\t\t\tUSoUICooldownEntry* Current = Cast<USoUICooldownEntry>(Slots[LastIndex]->Content);\n\t\t\tUSoUICooldownEntry* Next = Cast<USoUICooldownEntry>(Slots[LastIndex + 1]->Content);\n\t\t\tif (Current != nullptr && Next != nullptr)\n\t\t\t\tCurrent->Setup(LastIndex, Next->GetObjectWithCooldown(), Next->GetRemainingTime());\n\t\t}\n\n\t\tUSoUICooldownEntry* Current = Cast<USoUICooldownEntry>(Slots[LastIndex]->Content);\n\t\tif (Current != nullptr)\n\t\t{\n\t\t\tCurrent->ClearAndHide();\n\t\t\tUsedEntryNum -= 1;\n\t\t}\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUICooldownList::OnCooldownBlocksEvent(int32 Index, float RemainingTime, const UObject* ObjectWithCooldown)\n{\n\tconst TArray<UPanelSlot*>& Slots = Container->GetSlots();\n\tif (Slots.IsValidIndex(Index))\n\t{\n\t\tUSoUICooldownEntry* Current = Cast<USoUICooldownEntry>(Slots[Index]->Content);\n\t\tif (Current != nullptr && Current->GetObjectWithCooldown() == ObjectWithCooldown)\n\t\t\tCurrent->OnBlockEvent();\n\t}\n}\n"
  },
  {
    "path": "Source/SOrb/UI/InGame/Cooldowns/SoUICooldownList.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#pragma once\n\n#include \"CoreMinimal.h\"\n#include \"Blueprint/UserWidget.h\"\n\n#include \"SoUICooldownList.generated.h\"\n\nclass UPanelWidget;\n\n ////////////////////////////////////////////////////////////////////////////////////////\nUCLASS()\nclass SORB_API USoUICooldownList : public UUserWidget\n{\n\tGENERATED_BODY()\n\nprotected:\n\tvoid NativeConstruct() override;\n\tvoid NativeDestruct() override;\n\tvoid NativeTick(const FGeometry& MyGeometry, float InDeltaTime) override;\n\n\tUFUNCTION()\n\tvoid OnCooldownStarted(int32 Index, float RemainingTime, const UObject* ObjectWithCooldown);\n\n\tUFUNCTION()\n\tvoid OnCooldownBlocksEvent(int32 Index, float RemainingTime, const UObject* ObjectWithCooldown);\n\n\tUFUNCTION()\n\tvoid OnCooldownEnded(int32 Index, float RemainingTime, const UObject* ObjectWithCooldown);\n\nprotected:\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\", meta = (BindWidget))\n\tUPanelWidget* Container;\n\n\tint32 UsedEntryNum = 0;\n};\n"
  },
  {
    "path": "Source/SOrb/UI/InGame/Dialogues/SoUIDialogueChoiceBox.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#include \"SoUIDialogueChoiceBox.h\"\n\n#include \"Components/TextBlock.h\"\n#include \"Components/Image.h\"\n#include \"Components/CanvasPanelSlot.h\"\n\n#include \"Materials/MaterialInstanceDynamic.h\"\n\n#include \"Basic/Helpers/SoMathHelper.h\"\n\nDEFINE_LOG_CATEGORY_STATIC(LogSoUIDialogueChoiceBox, All, All);\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIDialogueChoiceBox::NativeConstruct()\n{\n\tSuper::NativeConstruct();\n\n\tChoiceState = ESoDialogueChoiceBoxState::EDCBS_Inactive;\n\tSetVisibility(ESlateVisibility::Collapsed);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIDialogueChoiceBox::NativeTick(const FGeometry& MyGeometry, float InDeltaTime)\n{\n\tSuper::NativeTick(MyGeometry, InDeltaTime);\n\n\tif (!bUpdateCalledFromParent)\n\t\tUpdate(InDeltaTime);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIDialogueChoiceBox::Update(float InDeltaTime)\n{\n\tswitch (ChoiceState)\n\t{\n\t\tcase ESoDialogueChoiceBoxState::EDCBS_FadeIn:\n\t\t\tCounterSeconds += InDeltaTime;\n\t\t\tif (CounterSeconds > StartDelay)\n\t\t\t{\n\t\t\t\tconst float Percent = FMath::Min((CounterSeconds - StartDelay) / FadeInTime, 1.0f);\n\t\t\t\tconst FVector2D Position = USoMathHelper::InterpolateDeceleration(EndPosition + StartOffset, EndPosition, Percent);\n\t\t\t\tUCanvasPanelSlot* AsCanvasSlot = Cast<UCanvasPanelSlot>(Slot);\n\t\t\t\tif (AsCanvasSlot != nullptr)\n\t\t\t\t\tAsCanvasSlot->SetPosition(Position);\n\n\t\t\t\tSetColorAndOpacity(FLinearColor(1.0f, 1.0f, 1.0f, USoMathHelper::InterpolateDeceleration(0.0f, 1.0f, Percent)));\n\n\t\t\t\tif (HighlightedPercentTarget > 0.5f)\n\t\t\t\t\tUpdateHighlight(Percent);\n\n\t\t\t\tif (FMath::IsNearlyEqual(Percent, 1.f))\n\t\t\t\t\tChoiceState = ESoDialogueChoiceBoxState::EDCBS_Active;\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase ESoDialogueChoiceBoxState::EDCBS_FadeOut:\n\t\t\t{\n\t\t\t\tCounterSeconds += InDeltaTime;\n\t\t\t\tconst float Percent = FMath::Min(CounterSeconds / FadeOutTime, 1.0f);\n\t\t\t\tSetColorAndOpacity(FLinearColor(1.0f, 1.0f, 1.0f, 1.0f - Percent));\n\n\t\t\t\tconst FVector2D MaxOffset = HighlightedPercentTarget > 0.5f ? FadeOutOffsetHighlighted : FadeOutOffset;\n\t\t\t\tconst FVector2D Position = USoMathHelper::InterpolateDeceleration(EndPosition, EndPosition + MaxOffset, Percent);\n\t\t\t\tUCanvasPanelSlot* AsCanvasSlot = Cast<UCanvasPanelSlot>(Slot);\n\t\t\t\tif (AsCanvasSlot != nullptr)\n\t\t\t\t\tAsCanvasSlot->SetPosition(Position);\n\n\t\t\t\tif (FMath::IsNearlyEqual(Percent, 1.f))\n\t\t\t\t{\n\t\t\t\t\tChoiceState = ESoDialogueChoiceBoxState::EDCBS_Inactive;\n\t\t\t\t\tSetVisibility(ESlateVisibility::Collapsed);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase ESoDialogueChoiceBoxState::EDCBS_ChangeHighlight:\n\t\t\t{\n\t\t\t\tCounterSeconds += InDeltaTime;\n\t\t\t\tconst float Percent = FMath::Min(CounterSeconds / HighlightTime, 1.0f);\n\t\t\t\tUpdateHighlight(HighlightedPercentTarget > 0.5f ? Percent : 1.0f - Percent);\n\n\t\t\t\tif (FMath::IsNearlyEqual(Percent, 1.f))\n\t\t\t\t\tChoiceState = ESoDialogueChoiceBoxState::EDCBS_Active;\n\t\t\t}\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tbreak;\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoUIDialogueChoiceBox::DisplayText(const FText& TextToDisplay, const FVector2D& InEndPosition, float InDelay, bool bHighlight)\n{\n\t// Only allow to display text once this widget is in the inactive state\n\tif (ChoiceState != ESoDialogueChoiceBoxState::EDCBS_Inactive)\n\t{\n\t\tUE_LOG(LogSoUIDialogueChoiceBox,\n\t\t\tWarning,\n\t\t\tTEXT(\"Trying to call DisplayText(TextToDisplay = `%s`) on choicebox but the ChoiceState (%d) != ESoDialogueChoiceBoxState::EDCBS_Inactive. Ignoring fading in!\"),\n\t\t\t*TextToDisplay.ToString(), static_cast<int32>(ChoiceState));\n\t\treturn false;\n\t}\n\n\tChoiceState = ESoDialogueChoiceBoxState::EDCBS_FadeIn;\n\tEndPosition = InEndPosition;\n\n\t// extra check cause of weird issue\n\tif (bUpdateCalledFromParent)\n\t{\n\t\tif (fabs(InEndPosition.X) > 60 || fabs(InEndPosition.Y) > 1000)\n\t\t{\n\t\t\tUE_LOG(LogSoUIDialogueChoiceBox,\n\t\t\t\tWarning,\n\t\t\t\tTEXT(\"Trying to call DisplayText on choicebox with invalid end position %f %f\"),\n\t\t\t\tInEndPosition.X, InEndPosition.Y);\n\n\t\t\tEndPosition.X = FMath::Clamp(InEndPosition.X, -52.0f, 20.0f);\n\t\t\tEndPosition.Y = FMath::Clamp(InEndPosition.Y, -748.0f, 0.0f);\n\t\t}\n\t}\n\n\tStartDelay = InDelay;\n\tHighlightedPercentTarget = bHighlight ? 1.0f : 0.0f;\n\tCounterSeconds = 0.0f;\n\n\tUpdateHighlight(0.0f);\n\n\tChoiceText->SetText(TextToDisplay);\n\tSetColorAndOpacity(FLinearColor(1.0f, 1.0f, 1.0f, 0.0f));\n\tSetVisibility(ESlateVisibility::Visible);\n\n\treturn true;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoUIDialogueChoiceBox::HideChoiceTextBox()\n{\n\tif (ChoiceState != ESoDialogueChoiceBoxState::EDCBS_Active)\n\t{\n\t\t// UE_LOG(LogSoUIDialogueChoiceBox,\n\t\t// \tWarning,\n\t\t// \tTEXT(\"Trying to call HideChoiceTextBox() on choicebox but the ChoiceState (%d)  != ESoDialogueChoiceBoxState::EDCBS_Active. Ignoring fading out!\"),\n\t\t// \tstatic_cast<int32>(ChoiceState));\n\t\treturn false;\n\t}\n\n\tChoiceState = ESoDialogueChoiceBoxState::EDCBS_FadeOut;\n\tCounterSeconds = 0.0f;\n\treturn true;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIDialogueChoiceBox::ForceHideChoiceTextBox()\n{\n\tSetColorAndOpacity(FLinearColor(1.0f, 1.0f, 1.0f, 0.0f));\n\n\tconst FVector2D MaxOffset = HighlightedPercentTarget > 0.5f ? FadeOutOffsetHighlighted : FadeOutOffset;\n\tconst FVector2D Position = USoMathHelper::InterpolateDeceleration(EndPosition, EndPosition + MaxOffset, 1.0f);\n\tUCanvasPanelSlot* AsCanvasSlot = Cast<UCanvasPanelSlot>(Slot);\n\tif (AsCanvasSlot != nullptr)\n\t\tAsCanvasSlot->SetPosition(Position);\n\tChoiceState = ESoDialogueChoiceBoxState::EDCBS_Inactive;\n\tSetVisibility(ESlateVisibility::Collapsed);\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIDialogueChoiceBox::ForceFinishChange()\n{\n\tUE_LOG(LogSoUIDialogueChoiceBox, Warning, TEXT(\"USoUIDialogueChoiceBox::ForceFinishChange called - something went wrong with the dialogue UI again!\"));\n\n\tswitch (ChoiceState)\n\t{\n\t\tcase ESoDialogueChoiceBoxState::EDCBS_FadeIn:\n\t\t\tCounterSeconds = StartDelay + FadeInTime;\n\t\t\tif (UCanvasPanelSlot* AsCanvasSlot = Cast<UCanvasPanelSlot>(Slot))\n\t\t\t\tAsCanvasSlot->SetPosition(EndPosition);\n\n\t\t\tSetColorAndOpacity(FLinearColor(1.0f, 1.0f, 1.0f, 1.0f));\n\t\t\tif (HighlightedPercentTarget > 0.5f)\n\t\t\t\tUpdateHighlight(1.0f);\n\t\t\tChoiceState = ESoDialogueChoiceBoxState::EDCBS_Active;\n\t\t\tSetVisibility(ESlateVisibility::Visible);\n\t\t\tbreak;\n\n\t\tcase ESoDialogueChoiceBoxState::EDCBS_FadeOut:\n\t\t\tForceHideChoiceTextBox();\n\t\t\tbreak;\n\n\t\tcase ESoDialogueChoiceBoxState::EDCBS_ChangeHighlight:\n\t\t\tCounterSeconds = HighlightTime;\n\t\t\tUpdateHighlight(HighlightedPercentTarget > 0.5f ? 1.0f : 0.0f);\n\t\t\tChoiceState = ESoDialogueChoiceBoxState::EDCBS_Active;\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tbreak;\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoUIDialogueChoiceBox::SetHighlighted(bool bHighlight)\n{\n\tverify(ChoiceState == ESoDialogueChoiceBoxState::EDCBS_Active ||\n\t\t   ChoiceState == ESoDialogueChoiceBoxState::EDCBS_ChangeHighlight);\n\n\tHighlightedPercentTarget = bHighlight ? 1.0f : 0.0f;\n\tif (!FMath::IsNearlyEqual(HighlightedPercent, HighlightedPercentTarget))\n\t{\n\t\tChoiceState = ESoDialogueChoiceBoxState::EDCBS_ChangeHighlight;\n\t\tCounterSeconds = 0.0f;\n\t}\n\treturn true;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIDialogueChoiceBox::UpdateHighlight(float NewPercent)\n{\n\tHighlightedPercent = NewPercent;\n\n\tconst FVector2D RenderScale = USoMathHelper::InterpolateSmoothStep(FVector2D(1.0f, 1.0f), HighlightScale, HighlightedPercent);\n\t// SetRenderScale(RenderScale);\n\tBackgroundFrame->SetRenderScale(RenderScale);\n\tBackground->SetRenderScale(RenderScale);\n\n\tstatic const FName HighlightName{ TEXT(\"Highlight\") };\n\tBackgroundFrame->GetDynamicMaterial()->SetScalarParameterValue(HighlightName, HighlightedPercent);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoUIDialogueChoiceBox::IsChoiceTextBoxAnimated() const\n{\n\tcheck(ChoiceState != ESoDialogueChoiceBoxState::EDCBS_MAX);\n\treturn ChoiceState != ESoDialogueChoiceBoxState::EDCBS_Active && ChoiceState != ESoDialogueChoiceBoxState::EDCBS_Inactive;\n}\n"
  },
  {
    "path": "Source/SOrb/UI/InGame/Dialogues/SoUIDialogueChoiceBox.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#pragma once\n\n#include \"CoreMinimal.h\"\n#include \"Blueprint/UserWidget.h\"\n\n#include \"SoUIDialogueChoiceBox.generated.h\"\n\nclass UImage;\nclass UTextBlock;\n\n////////////////////////////////////////////////////////////////////////////////////////\nUENUM(BlueprintType)\nenum class ESoDialogueChoiceBoxState : uint8\n{\n\tEDCBS_Inactive\t\t\tUMETA(DisplayName = \"Inactive\"),\n\tEDCBS_Active\t\t\tUMETA(DisplayName = \"Active\"),\n\tEDCBS_FadeIn\t\t\tUMETA(DisplayName = \"Fade In\"),\n\tEDCBS_FadeOut\t\t\tUMETA(DisplayName = \"Fade Out\"),\n\tEDCBS_ChangeHighlight\tUMETA(DisplayName = \"ChangeHighlight\"),\n\n\tEDCBS_MAX\t\t\t\tUMETA(Hidden),\n};\n\n ////////////////////////////////////////////////////////////////////////////////////////\nUCLASS()\nclass SORB_API USoUIDialogueChoiceBox : public UUserWidget\n{\n\tGENERATED_BODY()\n\t\npublic:\n\tvirtual void NativeConstruct() override;\n\tvirtual void NativeTick(const FGeometry& MyGeometry, float InDeltaTime) override;\n\n\tvoid Update(float InDeltaTime);\n\n\t// Only has any effect if the option is inactive, otherwise simply returns false\n\tbool DisplayText(const FText& TextToDisplay, const FVector2D& InEndPosition, float InDelay, bool bHighlight);\n\n\t// Only has any effect if the option is active, otherwise simply returns false\n\tbool HideChoiceTextBox();\n\n\t// instantly hides box\n\tvoid ForceHideChoiceTextBox();\n\n\tvoid ForceFinishChange();\n\n\t// Only has any effect if the option is active, otherwise simply returns false\n\tbool SetHighlighted(bool bHighlight);\n\n\n\tbool IsChoiceTextBoxAnimated() const;\n\n\tbool CanHighlightChange() const { return ChoiceState == ESoDialogueChoiceBoxState::EDCBS_Active || ChoiceState == ESoDialogueChoiceBoxState::EDCBS_ChangeHighlight; }\n\n\tUFUNCTION(BlueprintImplementableEvent, BlueprintCallable, Category = UI)\n\tvoid PlayPressedEffect();\n\n\tvoid SetUpdateCalledFromParent(bool bCalled) { bUpdateCalledFromParent = bCalled; }\n\nprotected:\n\tUCurveFloat* GetCurrentCurve() const;\n\tfloat GetCurrentChangeDuration() const;\n\n\tvoid UpdateHighlight(float NewPercent);\n\nprotected:\n\n\tUPROPERTY(BlueprintReadWrite, meta = (BindWidget), Category = Widgets)\n\tUTextBlock* ChoiceText;\n\n\tUPROPERTY(BlueprintReadWrite, meta = (BindWidget), Category = Widgets)\n\tUImage* BackgroundFrame;\n\n\tUPROPERTY(BlueprintReadWrite, meta = (BindWidget), Category = Widgets)\n\tUImage* Background;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Appearance)\n\tfloat FadeInTime = 0.7f;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Appearance)\n\tfloat FadeOutTime = 0.3f;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Appearance)\n\tFVector2D FadeOutOffset = FVector2D(10.0f, 0.0f);\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Appearance)\n\tFVector2D StartOffset = FVector2D(20.0f, 0.0f);\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Appearance)\n\tFVector2D FadeOutOffsetHighlighted = FVector2D(-10.0f, 0.0f);\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Appearance)\n\tfloat HighlightTime = 0.3f;\n\n\t// Counter for Tick()\n\tfloat CounterSeconds = 0.f;\n\n\t/** Position of the widget after fully faded in */\n\tFVector2D EndPosition{ EForceInit::ForceInitToZero };\n\n\t/** Time to wait before fade starts */\n\tfloat StartDelay = 0.f;\n\n\tESoDialogueChoiceBoxState ChoiceState = ESoDialogueChoiceBoxState::EDCBS_Inactive;\n\n\tfloat HighlightedPercent = 0.0f;\n\tfloat HighlightedPercentTarget = 0.0f;\n\n\tUPROPERTY(EditAnywhere, Category = Appearance)\n\tFVector2D HighlightScale = FVector2D(1.2f, 1.2f);\n\n\tbool bUpdateCalledFromParent = false;\n};\n"
  },
  {
    "path": "Source/SOrb/UI/InGame/Dialogues/SoUIDialogueNameBox.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#include \"SoUIDialogueNameBox.h\"\n\n#include \"Components/TextBlock.h\"\n#include \"Components/Image.h\"\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIDialogueNameBox::SetBackgroundImage(UTexture2D* Image)\n{\n\tBackground->SetBrushFromTexture(Image);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIDialogueNameBox::SetDisplayText(const FText& TextToDisplay)\n{\n\tNameText->SetText(TextToDisplay);\n}"
  },
  {
    "path": "Source/SOrb/UI/InGame/Dialogues/SoUIDialogueNameBox.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#pragma once\n\n#include \"CoreMinimal.h\"\n#include \"Blueprint/UserWidget.h\"\n\n#include \"SoUIDialogueNameBox.generated.h\"\n\nclass UTexture2D;\nclass UTextBlock;\nclass UImage;\n\n ////////////////////////////////////////////////////////////////////////////////////////\nUCLASS()\nclass SORB_API USoUIDialogueNameBox : public UUserWidget\n{\n\tGENERATED_BODY()\n\t\npublic:\n\tvoid SetBackgroundImage(UTexture2D* Image);\n\tvoid SetDisplayText(const FText& TextToDisplay);\n\nprotected:\n\tUPROPERTY(BlueprintReadWrite, meta = (BindWidget), Category = Widgets)\n\tUTextBlock* NameText;\n\n\tUPROPERTY(BlueprintReadWrite, meta = (BindWidget), Category = Widgets)\n\tUImage* Background;\n};\n"
  },
  {
    "path": "Source/SOrb/UI/InGame/Dialogues/SoUIDialoguePanel.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#include \"SoUIDialoguePanel.h\"\n\n#include \"Components/TextBlock.h\"\n#include \"Components/Image.h\"\n#include \"Components/CanvasPanelSlot.h\"\n#include \"Animation/WidgetAnimation.h\"\n\n#include \"FMODEvent.h\"\n\n#include \"DlgContext.h\"\n#include \"DlgDialogueParticipant.h\"\n\n#include \"Basic/Helpers/SoMathHelper.h\"\n#include \"Basic/SoGameInstance.h\"\n#include \"Basic/Helpers/SoStaticHelper.h\"\n#include \"Basic/SoDialogueParticipant.h\"\n#include \"UI/General/Buttons/SoUIButtonArray.h\"\n#include \"SoUIDialogueTextBox.h\"\n#include \"SoUIDialogueChoiceBox.h\"\n#include \"UI/InGame/SoUICharacterPreview.h\"\n#include \"Character/SoCharacter.h\"\n#include \"Basic/SoAudioManager.h\"\n#include \"Basic/Helpers/SoDateTimeHelper.h\"\n#include \"UI/SoUIHelper.h\"\n#include \"Settings/SoGameSettings.h\"\n\n\nDEFINE_LOG_CATEGORY(LogSoDlgUI);\n\nconst FName USoUIDialoguePanel::AnimNameFadeIn = FName(\"BackgroundFadeIn\");\nconst FName USoUIDialoguePanel::AnimNameFadeOut = FName(\"BackgroundFadeOut\");\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUSoUIDialoguePanel::USoUIDialoguePanel(const FObjectInitializer& PCIP) :\n\tSuper(PCIP)\n{\n\t// PlayerChoiceLocations2.SetNum(2);\n\t// PlayerChoiceLocations3.SetNum(3);\n\t// PlayerChoiceLocations4.SetNum(4);\n\t// PlayerChoiceLocations5.SetNum(5);\n\t// PlayerChoiceLocations6.SetNum(6);\n\t// PlayerChoiceLocations7.SetNum(7);\n\t// PlayerChoiceLocations8.SetNum(8);\n\n\tInactiveValues.SetNum(4);\n\tfor (int32 i = 0; i < 4; ++i)\n\t\tInactiveValues[i] = 1.0f;\n\n\tbArmedStateAllowedOnLeave = false;\n}\n\n#if WITH_EDITOR\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIDialoguePanel::PostEditChangeProperty(FPropertyChangedEvent& PropertyChangedEvent)\n{\n\tSuper::PostEditChangeProperty(PropertyChangedEvent);\n\n\t//TArray<TArray<FVector2D>*> ChoiceDataArrays = { &PlayerChoiceLocations2,\n\t//\t\t\t\t\t\t\t\t\t\t\t\t&PlayerChoiceLocations3,\n\t//\t\t\t\t\t\t\t\t\t\t\t\t&PlayerChoiceLocations4,\n\t//\t\t\t\t\t\t\t\t\t\t\t\t&PlayerChoiceLocations5,\n\t//\t\t\t\t\t\t\t\t\t\t\t\t&PlayerChoiceLocations6,\n\t//\t\t\t\t\t\t\t\t\t\t\t\t&PlayerChoiceLocations7,\n\t//\t\t\t\t\t\t\t\t\t\t\t\t&PlayerChoiceLocations8 };\n\t//for (int32 i = 0; i < ChoiceDataArrays.Num(); ++i)\n\t//\tfor (int32 j = 1; j < ChoiceDataArrays[i]->Num(); ++j)\n\t//\t\t(*ChoiceDataArrays[i])[j].Y = (*ChoiceDataArrays[i])[0].Y + j * YDifferenceBetweenChoices;\n}\n#endif // WITH_EDITOR\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIDialoguePanel::NativeConstruct()\n{\n\tSuper::NativeConstruct();\n\tSetVisibility(ESlateVisibility::Collapsed);\n\n\tDialogueTextBoxArray = { TextBox0, TextBox1, TextBox2, TextBox3 };\n\tPlayerChoiceTextBoxArray = { PlayerChoice0, PlayerChoice1, PlayerChoice2, PlayerChoice3, PlayerChoice4, PlayerChoice5, PlayerChoice6, PlayerChoice7 };\n\n\tfor (USoUIDialogueChoiceBox* ChoiceBox : PlayerChoiceTextBoxArray)\n\t\tif (ChoiceBox != nullptr)\n\t\t\tChoiceBox->SetUpdateCalledFromParent(true);\n\n\tUSoStaticHelper::BuildAnimationMap(this, AnimationMap);\n\n\tfor (int32 i = 0; i < DialogueTextBoxArray.Num(); ++i)\n\t\tDialogueTextBoxArray[i]->OnDialogueTextboxOpenned.AddDynamic(this, &USoUIDialoguePanel::OnDialogueTextboxOpenned);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIDialoguePanel::NativeDestruct()\n{\n\tif (Instance != nullptr)\n\t{\n\t\tInstance->release();\n\t\tInstance = nullptr;\n\t}\n\n\tSuper::NativeDestruct();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoUIDialoguePanel::SetInGameActivityEnabled_Implementation(UObject* Source, bool bEnable)\n{\n\tif (bEnable)\n\t{\n\t\tif (bOpened)\n\t\t{\n\t\t\tUE_LOG(LogSoUIActivity, Warning, TEXT(\"Dialogue request rejected: a dialogue is already in progress\"));\n\t\t\treturn true;\n\t\t}\n\n\t\tActiveDlgContext = Cast<UDlgContext>(Source);\n\t\tif (ActiveDlgContext == nullptr)\n\t\t\tUE_LOG(LogSoUIActivity, Warning, TEXT(\"Dialogue request rejected: Source is not a dialogue context\"))\n\t\telse\n\t\t{\n\t\t\tParticipantStateMap.Empty();\n\t\t\tFadeIn();\n\t\t\tPlayerEmotion = NAME_None;\n\t\t\tCharPreviewLeft->UpdateFromPlayerCharacter(PlayerEmotion);\n\t\t\tUSoAudioManager::PlaySound2D(this, SFXOpen);\n\t\t}\n\t}\n\telse\n\t{\n\t\tif (bOpened)\n\t\t{\n\t\t\tbOpened = false;\n\n\t\t\tfor (int32 i = 0; i < DialogueTextBoxArray.Num(); ++i)\n\t\t\t\tDialogueTextBoxArray[i]->ForceHideDialogueTextBox();\n\n\t\t\tfor (USoUIDialogueChoiceBox* PlayerChoice : PlayerChoiceTextBoxArray)\n\t\t\t\tPlayerChoice->ForceHideChoiceTextBox();\n\n\t\t\tSetVisibility(ESlateVisibility::Collapsed);\n\t\t}\n\t}\n\n\tUSoGameInstance::Get(this).OnDialogueStateChange(bOpened);\n\treturn bOpened;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoUIDialoguePanel::HandleCommand_Implementation(ESoUICommand Command)\n{\n\tif (SoPanelState == ESoDialoguePanelState::EDPS_WaitForFadeOut)\n\t\treturn true;\n\n\tCommand = USoUIHelper::TryTranslateMenuCommandDirectionToGame(Command);\n\n\t// weird but whatever\n\tif (GetVisibility() != ESlateVisibility::Visible)\n\t\treturn true;\n\n\tif (SoPanelState == ESoDialoguePanelState::EDPS_Change &&\n\t\t(Command == ESoUICommand::EUC_MainMenuEnter ||\n\t\tCommand == ESoUICommand::EUC_MainMenuBack))\n\t{\n\t\tfor (USoUIDialogueTextBox* TextBox : DialogueTextBoxArray)\n\t\t\tTextBox->SetAnimationSpeedMultiplier(10.0f);\n\t}\n\n\tif (ChangeActivePlayerChoice(Command))\n\t\treturn true;\n\n\tif (SoPanelState != ESoDialoguePanelState::EDPS_WaitForInput)\n\t\treturn true;\n\n\tif ((Command == ESoUICommand::EUC_MainMenuEnter ||\n\t\t Command == ESoUICommand::EUC_MainMenuBack) && ActiveDlgContext != nullptr)\n\t{\n\t\tif (ActiveDlgContext->GetOptionsNum() > 1 && !bPlayerChoicesDisplayed)\n\t\t{\n\t\t\tbDisplayPlayerChoiceAfterFade = true;\n\t\t\tbWaitForTextBoxFadeOut = true;\n\n\t\t\tDialogueTextBoxArray[1]->HideDialogueTextBox();\n\t\t\tDialogueTextBoxArray[2]->HideDialogueTextBox();\n\t\t\tDialogueTextBoxArray[3]->HideDialogueTextBox();\n\n\t\t\tSoPanelState = ESoDialoguePanelState::EDPS_Change;\n\t\t\tLastChangeStartTime = GetWorld()->GetTimeSeconds();\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif (bWaitForSpace)\n\t\t\t{\n\t\t\t\tbWaitForSpace = false;\n\t\t\t\tUpdateUI();\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\tbool bStillInDialogue = ActiveDlgContext->ChooseOption(ActivePlayerOption);\n\n\t\t\tif (ASoCharacter* SoCharacter = USoStaticHelper::GetPlayerCharacterAsSoCharacter(this))\n\t\t\t\twhile (bStillInDialogue && SoCharacter->bDebugSkipDialogues && ActiveDlgContext->GetOptionsNum() == 1)\n\t\t\t\t\tbStillInDialogue = ActiveDlgContext->ChooseOption(0);\n\n\t\t\tif (bStillInDialogue)\n\t\t\t{\n\t\t\t\tif (bPlayerChoicesDisplayed)\n\t\t\t\t{\n\t\t\t\t\tHidePlayerOptions();\n\t\t\t\t\tHideNotOptionTextBoxes();\n\t\t\t\t\tUSoAudioManager::PlaySound2D(this, SFXOptionSelected);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tif (bWaitForSpace || SoPanelState == ESoDialoguePanelState::EDPS_WaitForDuration)\n\t\t\t\t\t{\n\t\t\t\t\t\tfor (int32 i = 0; i < DialogueTextBoxArray.Num(); ++i)\n\t\t\t\t\t\t\tif (DialogueTextBoxArray[i]->IsDialogueTextBoxOpenedAndInIdle())\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tbWaitForTextBoxFadeOut = true;\n\t\t\t\t\t\t\t\tDialogueTextBoxArray[i]->HideDialogueTextBox();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t\tUpdateUI();\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif (FadeOutDelay > KINDA_SMALL_NUMBER)\n\t\t\t\t{\n\t\t\t\t\tSoPanelState = ESoDialoguePanelState::EDPS_WaitForFadeOut;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t\tFadeOut();\n\t\t\t}\n\t\t}\n\t}\n\treturn true;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoUIDialoguePanel::Update_Implementation(float DeltaSeconds)\n{\n\t// manual update cause of weird bug\n\tfor (USoUIDialogueChoiceBox* ChoiceBox : PlayerChoiceTextBoxArray)\n\t\tif (ChoiceBox != nullptr)\n\t\t\tChoiceBox->Update(DeltaSeconds);\n\n\tif (bOpened && SoPanelState != ESoDialoguePanelState::EDPS_FadeIn && SoPanelState != ESoDialoguePanelState::EDPS_FadeOut)\n\t{\n\t\tUImage* DlgImages[] = { DlgImage0, nullptr, DlgImage2, DlgImage3 };\n\t\tfor (int32 i = 0; i < 4; ++i)\n\t\t{\n\t\t\tconst float InactiveAlpha = 0.3f;\n\t\t\tInactiveValues[i] = FMath::FInterpTo(InactiveValues[i], (i != ActiveParticipantImageIndex ? InactiveAlpha : 1.0f), DeltaSeconds, 3.0f);\n\n\t\t\tif (DlgImages[i] != nullptr)\n\t\t\t\tDlgImages[i]->GetDynamicMaterial()->SetScalarParameterValue(ActivePercentName, InactiveValues[i]);\n\t\t\telse\n\t\t\t\tCharPreviewLeft->SetActivePercent(InactiveValues[i]);\n\t\t}\n\t}\n\n\tswitch (SoPanelState)\n\t{\n\t\tcase ESoDialoguePanelState::EDPS_WaitForDuration:\n\t\t\tWaitCounter -= DeltaSeconds;\n\t\t\tif (WaitCounter < 0.0f)\n\t\t\t{\n\t\t\t\tUpdateUI();\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase ESoDialoguePanelState::EDPS_WaitForFadeOut:\n\t\t\tFadeOutDelay -= DeltaSeconds;\n\t\t\tif (FadeOutDelay < 0.0f)\n\t\t\t\tFadeOut();\n\t\t\tbreak;\n\n\t\tcase ESoDialoguePanelState::EDPS_FadeIn:\n\t\t\tif (!IsPlayingAnimation())\n\t\t\t\tUpdateUI();\n\t\t\tbreak;\n\n\t\tcase ESoDialoguePanelState::EDPS_Change:\n\t\t\tif (!IsAnyTextBoxAnimated())\n\t\t\t{\n\t\t\t\tif (bWaitForTextBoxFadeOut)\n\t\t\t\t{\n\t\t\t\t\tif (bDisplayPlayerChoiceAfterFade)\n\t\t\t\t\t{\n\t\t\t\t\t\tDisplayPlayerOptions();\n\t\t\t\t\t\tbDisplayPlayerChoiceAfterFade = false;\n\t\t\t\t\t\tbWaitForTextBoxFadeOut = false;\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t\tUpdateUI();\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t\tSoPanelState = ESoDialoguePanelState::EDPS_WaitForInput;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t// Every 3 seconds\n\t\t\t\tconst float ThresholdSeconds = LastChangeStartTime + USoDateTimeHelper::NormalizeTime(3.f);\n\t\t\t\tif (GetWorld()->GetTimeSeconds() > ThresholdSeconds)\n\t\t\t\t{\n\t\t\t\t\tfor (auto* TextBox : DialogueTextBoxArray)\n\t\t\t\t\t\tif (TextBox != nullptr && TextBox->IsDialogueTextBoxAnimated())\n\t\t\t\t\t\t\tTextBox->ForceFinishChange();\n\n\t\t\t\t\tfor (auto* ChoiceBox : PlayerChoiceTextBoxArray)\n\t\t\t\t\t\tif (ChoiceBox != nullptr && ChoiceBox->IsChoiceTextBoxAnimated())\n\t\t\t\t\t\t\tChoiceBox->ForceFinishChange();\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase ESoDialoguePanelState::EDPS_FadeOut:\n\t\t{\n\t\t\tconst bool bStillIn = IsPlayingAnimation();\n\t\t\tif (!bStillIn)\n\t\t\t{\n\t\t\t\tSetVisibility(ESlateVisibility::Collapsed);\n\t\t\t\tbOpened = false;\n\t\t\t}\n\t\t\treturn bStillIn;\n\t\t}\n\n\t\tdefault:\n\t\t\tbreak;\n\t}\n\n\treturn true;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoUIDialoguePanel::ModifyNameValue_Implementation(FName ValueName, FName NameValue)\n{\n \tstatic const FName PlayAnimation = FName(\"PlayAnimation\");\n\tstatic const FName HideParticipant = FName(\"HideParticipant\");\n\tstatic const FName ShowParticipant = FName(\"ShowParticipant\");\n\tstatic const FName UpdateParticipantImage = FName(\"UpdateImage\");\n\n\tconst bool bHideParticipant = ValueName == HideParticipant;\n\tif (bHideParticipant || ValueName == ShowParticipant)\n\t{\n\t\tif (ActiveDlgContext != nullptr)\n\t\t{\n\t\t\tfor (const auto& Pair : ActiveDlgContext->GetParticipantsMap())\n\t\t\t\tif (Pair.Key == NameValue)\n\t\t\t\t{\n\t\t\t\t\tconst FSoDialogueParticipantData& ParticipantData = Cast<ISoDialogueParticipant>(Pair.Value)->GetParticipantData();\n\n\t\t\t\t\tPlayAnimationSafe(bHideParticipant ? ParticipantData.FadeOutAnimName : ParticipantData.FadeInAnimName);\n\t\t\t\t\tParticipantStateMap[Pair.Key] = !bHideParticipant;\n\n\t\t\t\t\tUSoAudioManager::PlaySound2D(this, bHideParticipant ? SFXParticipantDisappears : SFXParticipantAppears);\n\t\t\t\t}\n\t\t}\n\t}\n\telse if (ValueName == PlayAnimation)\n\t\tPlayAnimationSafe(NameValue);\n\telse if (ValueName == UpdateParticipantImage)\n\t{\n\t\tif (ActiveDlgContext != nullptr)\n\t\t\tfor (const auto& Pair : ActiveDlgContext->GetParticipantsMap())\n\t\t\t\tif (Pair.Key == NameValue)\n\t\t\t\t{\n\t\t\t\t\tconst FSoDialogueParticipantData& ParticipantData = Cast<ISoDialogueParticipant>(Pair.Value)->GetParticipantData();\n\t\t\t\t\tUImage* DlgImages[] = { DlgImage0, nullptr, DlgImage2, DlgImage3 };\n\t\t\t\t\tif (ParticipantData.PositionIndex >= 0 && ParticipantData.PositionIndex < 4 && DlgImages[ParticipantData.PositionIndex] != nullptr)\n\t\t\t\t\t\t// DlgImages[ParticipantData.PositionIndex]->SetBrushFromTexture(ParticipantData.ParticipantIcon);\n\t\t\t\t\t\tDlgImages[ParticipantData.PositionIndex]->GetDynamicMaterial()->SetTextureParameterValue(FName(\"Texture\"), ParticipantData.ParticipantIcon);\n\t\t\t\t}\n\t}\n\telse\n\t\tUE_LOG(LogSoDlgUI, Warning, TEXT(\"Unhandled USoUIDialoguePanel::ModifyNameValue: %s\"), *ValueName.ToString());\n\n\treturn true;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoUIDialoguePanel::ModifyFloatValue_Implementation(FName ValueName, bool bDelta, float Value)\n{\n\tif (ValueName == FName(\"FadeOutDelay\"))\n\t\tFadeOutDelay = Value;\n\telse if (ValueName == FName(\"Wait\"))\n\t{\n\t\tWaitCounter = Value;\n\t\tSoPanelState = ESoDialoguePanelState::EDPS_WaitForDuration;\n\t}\n\n\treturn true;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoUIDialoguePanel::OnDialogueEvent_Implementation(UDlgContext* Context, FName EventName)\n{\n\tif (EventName == FName(\"SpaceRequest\"))\n\t\tbWaitForSpace = true;\n\n\treturn true;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIDialoguePanel::OnDialogueTextboxOpenned()\n{\n\t// Voice gibberish disabled by settings\n\tif (USoGameSettings::Get().IsDialogueVoiceGibberishMuted())\n\t\treturn;\n\n\tif (UFMODEvent* VO = Cast<UFMODEvent>(ActiveDlgContext->GetActiveNodeGenericData()))\n\t{\n\t\tif (Instance != nullptr)\n\t\t{\n\t\t\tFMOD_STUDIO_PLAYBACK_STATE State;\n\t\t\tInstance->getPlaybackState(&State);\n\t\t\tif (State == FMOD_STUDIO_PLAYBACK_STATE::FMOD_STUDIO_PLAYBACK_PLAYING)\n\t\t\t\tInstance->stop(FMOD_STUDIO_STOP_ALLOWFADEOUT);\n\n\t\t\tInstance->release();\n\t\t\tInstance = nullptr;\n\t\t}\n\n\t\tInstance = USoAudioManager::PlaySound2D(this, VO, false).Instance;\n\t\tif (Instance != nullptr)\n\t\t\tInstance->start();\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIDialoguePanel::FadeIn()\n{\n\tensure(ActiveDlgContext != nullptr);\n\n\t// clear anims from invalid exits\n\tStopAllAnimations();\n\n\tbOpened = true;\n\tSetVisibility(ESlateVisibility::Visible);\n\tSoPanelState = ESoDialoguePanelState::EDPS_FadeIn;\n\tActivePlayerOption = 0;\n\tbPlayerChoicesDisplayed = false;\n\n\tPlayAnimationSafe(AnimNameFadeIn);\n\tTMap<FName, UObject*> ParticipantMap = ActiveDlgContext->GetParticipantsMap();\n\n\tUImage* DlgImages[] = { DlgImage0, nullptr, DlgImage2, DlgImage3 };\n\tUImage* FloorImages[] = { Floor0, Floor1, nullptr, nullptr };\n\n\tCharPreviewLeft->SetActivePercent(1.0f);\n\n\tfor (int32 i = 0; i < 4; ++i)\n\t\tInactiveValues[i] = 1.0f;\n\n\t// fade in the primary participants\n\tfor (const auto& Pair : ParticipantMap)\n\t\tif (Pair.Value != nullptr && Pair.Value != this)\n\t\t{\n\t\t\tconst FSoDialogueParticipantData& ParticipantData = Cast<ISoDialogueParticipant>(Pair.Value)->GetParticipantData();\n\t\t\tconst int32 DlgPositionIndex = ParticipantData.PositionIndex;\n\n\t\t\tif (DlgPositionIndex == 0)\n\t\t\t{\n\t\t\t\tbKeepMusicAfterDialogue = true;\n\t\t\t\tif (ParticipantData.Music != nullptr)\n\t\t\t\t{\n\t\t\t\t\tUSoAudioManager::Get(this).SetMusic(ParticipantData.Music, true, ParticipantData.PrevMusicFadeDuration);\n\t\t\t\t\tIDlgDialogueParticipant::Execute_ModifyBoolValue(USoStaticHelper::GetPlayerCharacterAsActor(this), ParticipantData.Music->GetFName(), true);\n\t\t\t\t\tbKeepMusicAfterDialogue = ParticipantData.bKeepMusicAfterDialogue;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (DlgPositionIndex < 2 && DlgPositionIndex >= 0)\n\t\t\t{\n\t\t\t\tPlayAnimationSafe(ParticipantData.FadeInAnimName);\n\t\t\t\tParticipantStateMap.Add(Pair.Key, true);\n\t\t\t}\n\t\t\telse\n\t\t\t\tParticipantStateMap.Add(Pair.Key, false);\n\n\t\t\t// not player stuff\n\t\t\tif (DlgPositionIndex >= 0 && DlgPositionIndex < 4)\n\t\t\t{\n\t\t\t\tif (DlgImages[DlgPositionIndex] != nullptr)\n\t\t\t\t{\n\t\t\t\t\tDlgImages[DlgPositionIndex]->GetDynamicMaterial()->SetTextureParameterValue(FName(\"Texture\"), ParticipantData.ParticipantIcon);\n\t\t\t\t\tDlgImages[DlgPositionIndex]->GetDynamicMaterial()->SetScalarParameterValue(ActivePercentName, 1.0f);\n\t\t\t\t}\n\n\t\t\t\t// setup floor\n\t\t\t\tif (FloorImages[DlgPositionIndex] != nullptr)\n\t\t\t\t{\n\t\t\t\t\tFloorImages[DlgPositionIndex]->SetBrushFromTexture(ParticipantData.FloorImage, true);\n\t\t\t\t\tUCanvasPanelSlot* CanvasSlot = Cast<UCanvasPanelSlot>(FloorImages[DlgPositionIndex]->Slot);\n\t\t\t\t\tif (CanvasSlot != nullptr)\n\t\t\t\t\t\tCanvasSlot->SetPosition(ParticipantData.FloorPosition);\n\t\t\t\t}\n\n\t\t\t\t// setup name box\n\t\t\t\tif (UCanvasPanelSlot* CanvasSlot = Cast<UCanvasPanelSlot>(DialogueTextBoxArray[DlgPositionIndex]->Slot))\n\t\t\t\t{\n\t\t\t\t\tFVector2D Pos = CanvasSlot->GetPosition();\n\t\t\t\t\tPos.Y = ParticipantData.TextBoxY;\n\t\t\t\t\tCanvasSlot->SetPosition(Pos);\n\t\t\t\t}\n\n\t\t\t\tDialogueTextBoxArray[DlgPositionIndex]->SetSpeakerData(ParticipantData.TextBoxBackground,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t   ParticipantData.NameTextBackground,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t   ParticipantData.ParticipantDisplayName);\n\t\t\t}\n\n\t\t}\n\n\tUSoAudioManager::PlaySound2D(this, SFXDialogueStart);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIDialoguePanel::FadeOut()\n{\n\tSoPanelState = ESoDialoguePanelState::EDPS_FadeOut;\n\tPlayAnimationSafe(AnimNameFadeOut);\n\tUSoAudioManager::PlaySound2D(this, SFXClose);\n\n\tif (ActiveDlgContext != nullptr)\n\t{\n\t\t// fade out active participants\n\t\tTMap<FName, UObject*> ParticipantMap = ActiveDlgContext->GetParticipantsMap();\n\t\tfor (const auto& Pair : ParticipantMap)\n\t\t\tif (Pair.Value != nullptr && ParticipantStateMap.Contains(Pair.Key) && ParticipantStateMap[Pair.Key])\n\t\t\t{\n\t\t\t\tconst auto& ParticipantData = Cast<ISoDialogueParticipant>(Pair.Value)->GetParticipantData();\n\t\t\t\tPlayAnimationSafe(ParticipantData.FadeOutAnimName);\n\n\t\t\t\t// update this here because it can change during dialogue\n\t\t\t\tif (ParticipantData.Music != nullptr && ParticipantData.PositionIndex == 0)\n\t\t\t\t\tbKeepMusicAfterDialogue = ParticipantData.bKeepMusicAfterDialogue;\n\t\t\t}\n\t}\n\n\tActiveDlgContext = nullptr;\n\n\tfor (auto* TextBox : DialogueTextBoxArray)\n\t\tTextBox->HideDialogueTextBox();\n\n\tfor (USoUIDialogueChoiceBox* PlayerChoice : PlayerChoiceTextBoxArray)\n\t\tPlayerChoice->HideChoiceTextBox();\n\n\tif (!bKeepMusicAfterDialogue)\n\t\tif (ASoCharacter* SoChar = USoStaticHelper::GetPlayerCharacterAsSoCharacter(this))\n\t\t\tSoChar->UpdateMusic(true);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIDialoguePanel::UpdateUI()\n{\n\tif (ActiveDlgContext == nullptr || ActiveDlgContext->GetOptionsNum() == 0)\n\t{\n\t\tFadeOut();\n\t\treturn;\n\t}\n\n\tUObject* ActiveParticipant = ActiveDlgContext->GetActiveNodeParticipant();\n\tensure(ActiveParticipant);\n\n\tconst FSoDialogueParticipantData& ParticipantData = Cast<ISoDialogueParticipant>(ActiveParticipant)->GetParticipantData();\n\n\tActiveParticipantImageIndex = ParticipantData.PositionIndex;\n\n\tensure(DialogueTextBoxArray.IsValidIndex(ParticipantData.PositionIndex));\n\tif (!DialogueTextBoxArray.IsValidIndex(ParticipantData.PositionIndex))\n\t\treturn;\n\n\tSoPanelState = ESoDialoguePanelState::EDPS_Change;\n\tLastChangeStartTime = GetWorld()->GetTimeSeconds();\n\tbWaitForTextBoxFadeOut = false;\n\tfor (int32 i = 0; i < DialogueTextBoxArray.Num(); ++i)\n\t\tif (i != ParticipantData.PositionIndex && DialogueTextBoxArray[i]->IsDialogueTextBoxOpenedAndInIdle())\n\t\t{\n\t\t\tbWaitForTextBoxFadeOut = true;\n\t\t\tDialogueTextBoxArray[i]->HideDialogueTextBox();\n\t\t}\n\n\tif (!bWaitForTextBoxFadeOut)\n\t{\n\t\tif (ParticipantStateMap.Contains(ParticipantData.ParticipantName) && !ParticipantStateMap[ParticipantData.ParticipantName])\n\t\t{\n\t\t\tSoPanelState = ESoDialoguePanelState::EDPS_FadeIn;\n\t\t\tParticipantStateMap[ParticipantData.ParticipantName] = true;\n\t\t\tPlayAnimationSafe(ParticipantData.FadeInAnimName);\n\t\t\tUSoAudioManager::PlaySound2D(this, SFXParticipantAppears);\n\t\t\treturn;\n\t\t}\n\n\t\tDialogueTextBoxArray[ParticipantData.PositionIndex]->DisplayText(ActiveDlgContext->GetActiveNodeText());\n\n\t\tif (ActiveParticipantImageIndex == 1)\n\t\t{\n\t\t\tPlayerEmotion = ActiveDlgContext->GetActiveNodeSpeakerState();\n\t\t\tCharPreviewLeft->UpdateFromPlayerCharacter(PlayerEmotion);\n\t\t}\n\t}\n\n\tUpdateNameFields();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIDialoguePanel::DisplayPlayerOptions()\n{\n\tif (!ensure(ActiveDlgContext))\n\t\treturn;\n\n\tActiveParticipantImageIndex = 1;\n\n\tSoPanelState = ESoDialoguePanelState::EDPS_Change;\n\tLastChangeStartTime = GetWorld()->GetTimeSeconds();\n\tbPlayerChoicesDisplayed = true;\n\n\tconst TArray<FVector2D> PCL2 = { {0.0f, -508.0f},  {0.0f, -428.0f} };\n\tconst TArray<FVector2D> PCL3 = { {20.0f, -548.0f}, { -16.0f, -468.0f }, { 20.0f, -388.0f } };\n\tconst TArray<FVector2D> PCL4 = { {20.f, -584.0f},  { -16.0f , -504.0f }, { -16.0f, -424.0f }, { 20.0f, -344.0f } };\n\tconst TArray<FVector2D> PCL5 = { {20.f, -632.0f},  { -16.0f , -552.0f }, { -52.0f, -472.0f }, { -16.0f, -392.0f }, {20.f, -312.0f } };\n\tconst TArray<FVector2D> PCL6 = { {20.f, -668.0f},  { -16.0f , -588.0f }, { -52.0f, -508.0f }, { -52.0f, -428.0f }, {-16.f, -348.0f}, { 20.0f, -268.0f } };\n\tconst TArray<FVector2D> PCL7 = { {20.f, -712.0f},  { -16.0f , -632.0f }, { -34.0f, -552.0f }, { -52.0f, -472.0f }, {-34.f, -392.0f }, { -16.0f, -312.0f }, { 20.0f, -232.0f } };\n\tconst TArray<FVector2D> PCL8 = { {20.f, -748.0f},  { -16.0f , -668.0f }, { -34.0f, -588.0f }, { -52.0f, -508.0f }, {-52.f, -428.0f }, { -34.0f, -348.0f }, { -16.0f, -268.0f }, { 20.0f, -188.0f } };\n\n\tconst int32 PlayerOptionNum = FMath::Min(ActiveDlgContext->GetOptionsNum(), PlayerChoiceTextBoxArray.Num());\n\tconst TArray<FVector2D>* ChoiceDataArrays[] = { nullptr,\n\t\t\t\t\t\t\t\t\t\t\t\t\tnullptr,\n\t\t\t\t\t\t\t\t\t\t\t\t\t&PCL2,\n\t\t\t\t\t\t\t\t\t\t\t\t\t&PCL3,\n\t\t\t\t\t\t\t\t\t\t\t\t\t&PCL4,\n\t\t\t\t\t\t\t\t\t\t\t\t\t&PCL5,\n\t\t\t\t\t\t\t\t\t\t\t\t\t&PCL6,\n\t\t\t\t\t\t\t\t\t\t\t\t\t&PCL7,\n\t\t\t\t\t\t\t\t\t\t\t\t\t&PCL8 };\n\n\tconst TArray<FVector2D>* AppearanceDataPtr = ChoiceDataArrays[PlayerOptionNum];\n\tif (!ensure(AppearanceDataPtr))\n\t\treturn;\n\n\tfor (int32 i = 0; i < PlayerOptionNum; ++i)\n\t{\n\t\tensure(i < AppearanceDataPtr->Num());\n\t\tPlayerChoiceTextBoxArray[i]->DisplayText(ActiveDlgContext->GetOptionText(i), (*AppearanceDataPtr)[i], (PlayerOptionNum <= 3 ? 0.3f : 0.2f) * i, i == 0);\n\t}\n\n\tActivePlayerOption = 0;\n\tPlayerEmotion = ActiveDlgContext->GetOptionSpeakerState(ActivePlayerOption);\n\tCharPreviewLeft->UpdateFromPlayerCharacter(PlayerEmotion);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIDialoguePanel::HidePlayerOptions()\n{\n\tif (!bPlayerChoicesDisplayed)\n\t\treturn;\n\n\tActivePlayerOption = 0;\n\tbWaitForTextBoxFadeOut = true;\n\tSoPanelState = ESoDialoguePanelState::EDPS_Change;\n\tLastChangeStartTime = GetWorld()->GetTimeSeconds();\n\n\tbPlayerChoicesDisplayed = false;\n\tfor (USoUIDialogueChoiceBox* PlayerChoice : PlayerChoiceTextBoxArray)\n\t\tPlayerChoice->HideChoiceTextBox();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIDialoguePanel::HideNotOptionTextBoxes()\n{\n\tfor (int32 i = 0; i < DialogueTextBoxArray.Num(); ++i)\n\t\tDialogueTextBoxArray[i]->HideDialogueTextBox();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoUIDialoguePanel::ChangeActivePlayerChoice(ESoUICommand Command)\n{\n\tint32 Delta = 0;\n\tswitch (Command)\n\t{\n\t\tcase ESoUICommand::EUC_Left:\n\t\tcase ESoUICommand::EUC_Up:\n\t\t\tDelta = -1;\n\t\t\tbreak;\n\t\tcase ESoUICommand::EUC_Right:\n\t\tcase ESoUICommand::EUC_Down:\n\t\t\tDelta = 1;\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tbreak;\n\t}\n\n\tif (Delta != 0 &&\n\t\tbPlayerChoicesDisplayed &&\n\t\tPlayerChoiceTextBoxArray.IsValidIndex(ActivePlayerOption) &&\n\t\tPlayerChoiceTextBoxArray[ActivePlayerOption]->CanHighlightChange())\n\t{\n\t\tconst int32 NewActiveOption = USoMathHelper::WrapIndexAround(ActivePlayerOption + Delta, FMath::Min(ActiveDlgContext->GetOptionsNum(), PlayerChoiceTextBoxArray.Num()));\n\t\tif (PlayerChoiceTextBoxArray[NewActiveOption]->CanHighlightChange())\n\t\t{\n\t\t\tPlayerChoiceTextBoxArray[ActivePlayerOption]->SetHighlighted(false);\n\t\t\tActivePlayerOption = NewActiveOption;\n\t\t\tPlayerChoiceTextBoxArray[ActivePlayerOption]->SetHighlighted(true);\n\t\t\tSoPanelState = ESoDialoguePanelState::EDPS_Change;\n\t\t\tLastChangeStartTime = GetWorld()->GetTimeSeconds();\n\n\t\t\tPlayerEmotion = ActiveDlgContext->GetOptionSpeakerState(ActivePlayerOption);\n\t\t\tCharPreviewLeft->UpdateFromPlayerCharacter(PlayerEmotion);\n\n\t\t\tUSoAudioManager::PlaySound2D(this, SFXOptionSwitch);\n\t\t\treturn true;\n\t\t}\n\t}\n\n\treturn false;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoUIDialoguePanel::IsAnyTextBoxAnimated() const\n{\n\tfor (auto* TextBox : DialogueTextBoxArray)\n\t\tif (TextBox != nullptr && TextBox->IsDialogueTextBoxAnimated())\n\t\t\treturn true;\n\n\tfor (auto* ChoiceBox : PlayerChoiceTextBoxArray)\n\t\tif (ChoiceBox != nullptr && ChoiceBox->IsChoiceTextBoxAnimated())\n\t\t\treturn true;\n\n\treturn false;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIDialoguePanel::PlayAnimationSafe(FName AnimName)\n{\n\tUWidgetAnimation** AnimPtrPtr = AnimationMap.Find(AnimName);\n\tif (AnimPtrPtr == nullptr || (*AnimPtrPtr) == nullptr)\n\t{\n\t\tUE_LOG(LogSoDlgUI, Warning, TEXT(\"Failed to play animation: %s\"), *AnimName.ToString());\n\t\treturn;\n\t}\n\n\tUE_LOG(LogSoDlgUI, Display, TEXT(\"Played animation: %s\"), *AnimName.ToString());\n\tPlayAnimation(*AnimPtrPtr);\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIDialoguePanel::UpdateNameFields()\n{\n\tif (ActiveDlgContext == nullptr)\n\t\treturn;\n\n\tfor (const auto& Pair : ParticipantStateMap)\n\t\tif (Pair.Value)\n\t\t{\n\t\t\tconst UObject* Participant = ActiveDlgContext->GetParticipant(Pair.Key);\n\t\t\tif (Participant != nullptr)\n\t\t\t{\n\t\t\t\tconst FSoDialogueParticipantData& ParticipantData = Cast<ISoDialogueParticipant>(Participant)->GetParticipantData();\n\n\t\t\t\tif (!DialogueTextBoxArray.IsValidIndex(ParticipantData.PositionIndex))\n\t\t\t\t\treturn;\n\n\t\t\t\tDialogueTextBoxArray[ParticipantData.PositionIndex]->SetSpeakerData(ParticipantData.TextBoxBackground,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tParticipantData.NameTextBackground,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tParticipantData.ParticipantDisplayName);\n\t\t\t}\n\t\t}\n}\n"
  },
  {
    "path": "Source/SOrb/UI/InGame/Dialogues/SoUIDialoguePanel.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#pragma once\n\n#include \"CoreMinimal.h\"\n#include \"DlgDialogueParticipant.h\"\n#include \"UI/InGame/SoUIGameActivity.h\"\n#include \"Basic/SoDialogueParticipant.h\"\n\n#include \"SoUIDialoguePanel.generated.h\"\n\nDECLARE_LOG_CATEGORY_EXTERN(LogSoDlgUI, Log, All);\n\n\nclass UFMODEvent;\nclass UDlgContext;\nclass USoUIDialogueTextBox;\nclass UImage;\nclass USoUIDialogueChoiceBox;\nclass USoUICharacterPreview;\n\nnamespace FMOD\n{\nnamespace Studio\n{\n\tclass EventInstance;\n}\n}\n\nUENUM()\nenum class ESoDialoguePanelState : uint8\n{\n\tEDPS_FadeIn,\n\tEDPS_Change,\n\tEDPS_WaitForInput,\n\tEDPS_WaitForDuration,\n\tEDPS_FadeOut,\n\tEDPS_WaitForFadeOut,\n};\n\n/**  UI and control class for ingame dialogues */\nUCLASS()\nclass SORB_API USoUIDialoguePanel : public USoInGameUIActivity, public IDlgDialogueParticipant, public ISoDialogueParticipant\n{\n\tGENERATED_BODY()\n\nprotected:\n\tUSoUIDialoguePanel(const FObjectInitializer& PCIP);\n\n#if WITH_EDITOR\n\tvirtual void PostEditChangeProperty(FPropertyChangedEvent& PropertyChangedEvent) override;\n#endif // WITH_EDITOR\n\n\t// Begin UUserWidget Interface\n\tvoid NativeConstruct() override;\n\tvoid NativeDestruct() override;\n\t// End UUserWidget Interface\n\n\t// Begin USoInGameUIActivity\n\n\t/** valid, started DlgContext is expected */\n\tbool SetInGameActivityEnabled_Implementation(UObject* Source, bool bEnable) override;\n\n\tbool HandleCommand_Implementation(ESoUICommand Command) override;\n\n\tbool Update_Implementation(float DeltaSeconds) override;\n\n\tbool ShouldHideUIElements_Implementation() const override { return true; }\n\n\t//End USoInGameUIActivity\n\n\n\t// Begin IDlgDialogueParticipant\n\tFName GetParticipantName_Implementation() const override { return DlgName; }\n\tFText GetParticipantDisplayName_Implementation(FName ActiveSpeaker) const override { return FText{}; }\n\tETextGender GetParticipantGender_Implementation() const { return ETextGender::Neuter; }\n\tUTexture2D* GetParticipantIcon_Implementation(FName ActiveSpeaker, FName ActiveSpeakerState) const override { return nullptr; }\n\n\tbool ModifyNameValue_Implementation(FName ValueName, FName NameValue) override;\n\tbool ModifyFloatValue_Implementation(FName ValueName, bool bDelta, float Value) override;\n\tbool OnDialogueEvent_Implementation(UDlgContext* Context, FName EventName) override;\n\n\tbool ModifyIntValue_Implementation(FName ValueName, bool bDelta, int32 Value) override { return false; }\n\tbool ModifyBoolValue_Implementation(FName ValueName, bool bValue) override { return false; }\n\tbool CheckCondition_Implementation(const UDlgContext* Context, FName ConditionName) const override { return false; }\n\tfloat GetFloatValue_Implementation(FName ValueName) const override { return 0.0f; }\n\tint32 GetIntValue_Implementation(FName ValueName) const override { return -1; }\n\tbool GetBoolValue_Implementation(FName ValueName) const override { return false; }\n\tFName GetNameValue_Implementation(FName ValueName) const override { return NAME_None; }\n\t// End IDlgDialogueParticipant\n\nprotected:\n\tUFUNCTION()\n\tvoid OnDialogueTextboxOpenned();\n\n\tvoid FadeIn();\n\tvoid FadeOut();\n\n\tvoid UpdateUI();\n\n\tvoid DisplayPlayerOptions();\n\tvoid HidePlayerOptions();\n\n\tvoid HideNotOptionTextBoxes();\n\n\tbool ChangeActivePlayerChoice(ESoUICommand Command);\n\n\n\tbool IsAnyTextBoxAnimated() const;\n\n\tvoid BuildAnimationMap();\n\tvoid PlayAnimationSafe(FName AnimName);\n\n\tvoid UpdateNameFields();\n\nprotected:\n\tstatic const FName AnimNameFadeIn;\n\tstatic const FName AnimNameFadeOut;\n\n\t// Widgets\n\n\t// Default NPC Dialogue Box\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere, meta = (BindWidget))\n\tUSoUIDialogueTextBox* TextBox0;\n\n\t// Player Dialogue box\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere, meta = (BindWidget))\n\tUSoUIDialogueTextBox* TextBox1;\n\n\t// Wizard Dialogue box\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere, meta = (BindWidget))\n\tUSoUIDialogueTextBox* TextBox2;\n\n\t// Additional NPC Dialogue Box\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere, meta = (BindWidget))\n\tUSoUIDialogueTextBox* TextBox3;\n\n\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere, meta = (BindWidget))\n\tUImage* Floor0;\n\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere, meta = (BindWidget))\n\tUImage* Floor1;\n\n\n\t// Default NPC Dialogue Image\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere, meta = (BindWidget))\n\tUImage* DlgImage0;\n\n\t// Wizard Dialogue Image\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere, meta = (BindWidget))\n\tUImage* DlgImage2;\n\n\t// Additional NPC Dialogue Image\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere, meta = (BindWidget))\n\tUImage* DlgImage3;\n\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere, meta = (BindWidget))\n\tUSoUICharacterPreview* CharPreviewLeft;\n\n\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere, meta = (BindWidget))\n\tUSoUIDialogueChoiceBox* PlayerChoice0;\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere, meta = (BindWidget))\n\tUSoUIDialogueChoiceBox* PlayerChoice1;\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere, meta = (BindWidget))\n\tUSoUIDialogueChoiceBox* PlayerChoice2;\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere, meta = (BindWidget))\n\tUSoUIDialogueChoiceBox* PlayerChoice3;\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere, meta = (BindWidget))\n\tUSoUIDialogueChoiceBox* PlayerChoice4;\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere, meta = (BindWidget))\n\tUSoUIDialogueChoiceBox* PlayerChoice5;\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere, meta = (BindWidget))\n\tUSoUIDialogueChoiceBox* PlayerChoice6;\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere, meta = (BindWidget))\n\tUSoUIDialogueChoiceBox* PlayerChoice7;\n\n\t/** the 4 normal textbox */\n\tUPROPERTY()\n\tTArray<USoUIDialogueTextBox*> DialogueTextBoxArray;\n\n\t/** the player choices */\n\tUPROPERTY()\n\tTArray<USoUIDialogueChoiceBox*> PlayerChoiceTextBoxArray;\n\n\n\tUPROPERTY(EditAnywhere)\n\tfloat YDifferenceBetweenChoices = 80.0f;\n\n\n\tUPROPERTY(BlueprintReadOnly)\n\tTMap<FName, UImage*> NameBackgroundImageMap;\n\n\n\t// runtime stuff\n\n\tUPROPERTY(BlueprintReadOnly)\n\tUDlgContext* ActiveDlgContext = nullptr;\n\n\tUPROPERTY(BlueprintReadOnly)\n\tFName PlayerEmotion;\n\n\tbool bOpened = false;\n\n\tbool bKeepMusicAfterDialogue;\n\n\tUPROPERTY(BlueprintReadOnly)\n\tTMap<FName, UWidgetAnimation*> AnimationMap;\n\n\tESoDialoguePanelState SoPanelState;\n\n\tfloat LastChangeStartTime;\n\n\t/** Stored for participants if they are faded in or out */\n\tTMap<FName, bool> ParticipantStateMap;\n\n\t/** if a textbox has to be fade out before the change */\n\tbool bWaitForTextBoxFadeOut = true;\n\n\tbool bPlayerChoicesDisplayed = false;\n\n\tbool bWaitForSpace = false;\n\n\tbool bDisplayPlayerChoiceAfterFade = false;\n\n\tint32 ActivePlayerOption = 0;\n\n\tconst FName DlgName = FName(\"UIPanel\");\n\tconst FName ActivePercentName = FName(\"ActivePercent\");\n\n\tint32 ActiveParticipantImageIndex = -1;\n\n\tTArray<float> InactiveValues;\n\n\t//\n\t// SFX\n\t//\n\n\tUPROPERTY(EditAnywhere, Category = SFX)\n\tUFMODEvent* SFXDialogueStart = nullptr;\n\n\tUPROPERTY(EditAnywhere, Category = SFX)\n\tUFMODEvent* SFXOptionSwitch = nullptr;\n\n\tUPROPERTY(EditAnywhere, Category = SFX)\n\tUFMODEvent* SFXOptionSelected = nullptr;\n\n\tUPROPERTY(EditAnywhere, Category = SFX)\n\tUFMODEvent* SFXParticipantAppears = nullptr;\n\n\tUPROPERTY(EditAnywhere, Category = SFX)\n\tUFMODEvent* SFXParticipantDisappears = nullptr;\n\n\tUPROPERTY(EditAnywhere, Category = SFX)\n\tUFMODEvent* SFXOpen = nullptr;\n\n\tUPROPERTY(EditAnywhere, Category = SFX)\n\tUFMODEvent* SFXClose = nullptr;\n\n\tFMOD::Studio::EventInstance* Instance = nullptr;\n\n\n\tfloat FadeOutDelay = -1.0f;\n\n\tfloat WaitCounter = -1.0f;\n};\n"
  },
  {
    "path": "Source/SOrb/UI/InGame/Dialogues/SoUIDialogueTextBox.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#include \"SoUIDialogueTextBox.h\"\n\n#include \"Components/RetainerBox.h\"\n#include \"Components/RichTextBlock.h\"\n#include \"Components/TextBlock.h\"\n#include \"Components/Image.h\"\n#include \"Engine/Texture2D.h\"\n#include \"Materials/MaterialInstanceDynamic.h\"\n\n#include \"Basic/SoAudioManager.h\"\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIDialogueTextBox::NativeConstruct()\n{\n\tSuper::NativeConstruct();\n\n\tTextBoxState = ESoDialogueTextBoxState::EDTBS_Closed;\n\tSetRetainerPercentSafe(0.0f);\n\n\tSetVisibility(ESlateVisibility::Collapsed);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIDialogueTextBox::NativeTick(const FGeometry& MyGeometry, float InDeltaTime)\n{\n\tSuper::NativeTick(MyGeometry, InDeltaTime);\n\n\t// NOTE: in the first frames this will be most likely not valid, totally normal, one prepas on the renderer has to be done\n\t// before desired size returns anything approaching to reality\n\t// Simulate what GetDesiredSize does\n\tTSharedPtr<SWidget> TextFieldSlateWidget = RichTextField->GetCachedWidget();\n\tif (TextFieldSlateWidget.IsValid())\n\t{\n\t\tCurrentHeight = TextFieldSlateWidget->GetDesiredSize().Y;\n\t}\n\t// RichTextField->SetJustification(CurrentHeight < 80.0f ? ETextJustify::Center : ETextJustify::Left);\n\tUpdateTextJustificationBP(CurrentHeight < 90.0f);\n\tRichTextField->SynchronizeProperties();\n\n\tauto UpdateTextBoxSize = [this](float Percent)\n\t{\n\t\t// reference points:\n\t\t// y0 = 0.142   x0 = 100\n\t\t// y1 = 1.0\t\tx1 = 605\n\t\t// m = (y1 - y0) / (x1 - x0)\n\t\t// b = y0 - x0 * m\n\t\tstatic const float m = 0.00169901;\n\t\tstatic const float b = -0.02790099;\n\t\tconst float NewValue =  Percent * FMath::Max(0.0f, CurrentHeight * m + b);\n\t\tSetRetainerPercentSafe(NewValue);\n\t};\n\n\n\tconst UCurveFloat* ChangeCurve = GetCurrentCurve();\n\tif (ChangeCurve != nullptr)\n\t{\n\t\t// Animate\n\t\tconst float CurrentDuration = GetCurrentChangeDuration();\n\t\tCounter = FMath::Min(Counter + InDeltaTime * AnimationSpeedMultiplier, CurrentDuration);\n\t\tconst float NewPercent = Counter / CurrentDuration;\n\t\tUpdateTextBoxSize(ChangeCurve->GetFloatValue(NewPercent));\n\n\n\t\tif (FMath::IsNearlyEqual(CurrentDuration, Counter, KINDA_SMALL_NUMBER))\n\t\t{\n\t\t\tswitch (TextBoxState)\n\t\t\t{\n\t\t\t\tcase ESoDialogueTextBoxState::EDTBS_Changing:\n\t\t\t\t\tif (!bTextUpdated)\n\t\t\t\t\t{\n\t\t\t\t\t\tbTextUpdated = true;\n\t\t\t\t\t\tRichTextField->SetText(NewText);\n\t\t\t\t\t\tCounter = 0.0f;\n\t\t\t\t\t\tUSoAudioManager::PlaySound2D(this, SFXTextBoxOpen);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\tcase ESoDialogueTextBoxState::EDTBS_Opening:\n\t\t\t\t\tTextBoxState = ESoDialogueTextBoxState::EDTBS_Opened;\n\t\t\t\t\tAnimationSpeedMultiplier = 1.0f;\n\t\t\t\t\tOnDialogueTextboxOpenned.Broadcast();\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase ESoDialogueTextBoxState::EDTBS_Closing:\n\t\t\t\t\tTextBoxState = ESoDialogueTextBoxState::EDTBS_Closed;\n\t\t\t\t\tAnimationSpeedMultiplier = 1.0f;\n\t\t\t\t\tSetVisibility(ESlateVisibility::Collapsed);\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase ESoDialogueTextBoxState::EDTBS_Closed:\n\t\t\t\tcase ESoDialogueTextBoxState::EDTBS_Opened:\n\t\t\t\tdefault:\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\telse if (TextBoxState == ESoDialogueTextBoxState::EDTBS_Opened)\n\t{\n\t\t// have to keep update it be cause of some rare low performance issue\n\t\tUpdateTextBoxSize(1.0f);\n\t}\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIDialogueTextBox::SetSpeakerData(UTexture2D* Background, UTexture2D* NameImage, const FText& Name)\n{\n\tstatic const FName TextureName = FName(\"Bgr_Texture\");\n\tTextBackground->GetDynamicMaterial()->SetTextureParameterValue(TextureName, Background);\n\tNameBackground->SetBrushFromTexture(NameImage);\n\tNameText->SetText(Name);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoUIDialogueTextBox::DisplayText(const FText& TextToDisplay)\n{\n\tswitch(TextBoxState)\n\t{\n\t\tcase ESoDialogueTextBoxState::EDTBS_Changing:\n\t\tcase ESoDialogueTextBoxState::EDTBS_Opening:\n\t\tcase ESoDialogueTextBoxState::EDTBS_Closing:\n\t\t\treturn false;\n\n\t\tcase ESoDialogueTextBoxState::EDTBS_Closed:\n\t\t\tRichTextField->SetText(TextToDisplay);\n\t\t\tSetVisibility(ESlateVisibility::Visible);\n\t\t\tSetRetainerPercentSafe(0.0f);\n\t\t\tTextBoxState = ESoDialogueTextBoxState::EDTBS_Opening;\n\t\t\tCounter = 0.0f;\n\t\t\tbTextUpdated = true;\n\t\t\tAnimationSpeedMultiplier = 1.0f;\n\n\t\t\tUSoAudioManager::PlaySound2D(this, SFXTextBoxOpen);\n\n\t\t\treturn true;\n\n\t\tcase ESoDialogueTextBoxState::EDTBS_Opened:\n\t\t\tNewText = TextToDisplay;\n\t\t\tTextBoxState = ESoDialogueTextBoxState::EDTBS_Changing;\n\t\t\tbTextUpdated = false;\n\t\t\tCounter = 0.0f;\n\t\t\tAnimationSpeedMultiplier = 1.0f;\n\n\t\t\t// USoAudioManager::PlaySound2D(this, SFXTextBoxClose);\n\n\t\tdefault:\n\t\t\treturn true;\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoUIDialogueTextBox::HideDialogueTextBox()\n{\n\tswitch(TextBoxState)\n\t{\n\t\tcase ESoDialogueTextBoxState::EDTBS_Changing:\n\t\tcase ESoDialogueTextBoxState::EDTBS_Opening:\n\t\tcase ESoDialogueTextBoxState::EDTBS_Closing:\n\t\t\treturn false;\n\n\t\tcase ESoDialogueTextBoxState::EDTBS_Opened:\n\t\t\tTextBoxState = ESoDialogueTextBoxState::EDTBS_Closing;\n\t\t\tCounter = 0.0f;\n\n\t\t\t// USoAudioManager::PlaySound2D(this, SFXTextBoxClose);\n\n\t\tcase ESoDialogueTextBoxState::EDTBS_Closed:\n\t\tdefault:\n\t\t\treturn true;\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIDialogueTextBox::ForceHideDialogueTextBox()\n{\n\tSetRetainerPercentSafe(0.0f);\n\tTextBoxState = ESoDialogueTextBoxState::EDTBS_Closed;\n\tAnimationSpeedMultiplier = 1.0f;\n\tSetVisibility(ESlateVisibility::Collapsed);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIDialogueTextBox::ForceFinishChange()\n{\n\tswitch (TextBoxState)\n\t{\n\t\tcase ESoDialogueTextBoxState::EDTBS_Changing:\n\t\t\tRichTextField->SetText(NewText);\n\n\t\tcase ESoDialogueTextBoxState::EDTBS_Opening:\n\t\t\tSetRetainerPercentSafe(1.0f);\n\t\t\tTextBoxState = ESoDialogueTextBoxState::EDTBS_Opened;\n\t\t\tAnimationSpeedMultiplier = 1.0f;\n\t\t\tOnDialogueTextboxOpenned.Broadcast();\n\t\t\tSetVisibility(ESlateVisibility::Visible);\n\t\t\tbreak;\n\n\t\tcase ESoDialogueTextBoxState::EDTBS_Closing:\n\t\t\tForceHideDialogueTextBox();\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tbreak;\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoUIDialogueTextBox::IsDialogueTextBoxAnimated() const\n{\n\tswitch(TextBoxState)\n\t{\n\t\tcase ESoDialogueTextBoxState::EDTBS_Changing:\n\t\tcase ESoDialogueTextBoxState::EDTBS_Opening:\n\t\tcase ESoDialogueTextBoxState::EDTBS_Closing:\n\t\t\treturn true;\n\n\t\tcase ESoDialogueTextBoxState::EDTBS_Opened:\n\t\tcase ESoDialogueTextBoxState::EDTBS_Closed:\n\t\tdefault:\n\t\t\treturn false;\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nconst UCurveFloat* USoUIDialogueTextBox::GetCurrentCurve() const\n{\n\tswitch (TextBoxState)\n\t{\n\t\tcase ESoDialogueTextBoxState::EDTBS_Changing:\n\t\t\treturn bTextUpdated ? TextChangeAnimCurveClosing : TextChangeAnimCurveOpening;\n\n\t\tcase ESoDialogueTextBoxState::EDTBS_Opening:\n\t\t\treturn TextDisplayAnimCurve;\n\n\t\tcase ESoDialogueTextBoxState::EDTBS_Closing:\n\t\t\treturn TextHideAnimCurve;\n\n\t\tcase ESoDialogueTextBoxState::EDTBS_Closed:\n\t\tcase ESoDialogueTextBoxState::EDTBS_Opened:\n\t\tdefault:\n\t\t\treturn nullptr;\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nfloat USoUIDialogueTextBox::GetCurrentChangeDuration() const\n{\n\tswitch (TextBoxState)\n\t{\n\t\tcase ESoDialogueTextBoxState::EDTBS_Changing:\n\t\t\treturn TextChangeDuration * CurrentHeight / MaxHeight;\n\n\t\tcase ESoDialogueTextBoxState::EDTBS_Opening:\n\t\t\treturn TextDisplayDuration * CurrentHeight / MaxHeight;\n\n\t\tcase ESoDialogueTextBoxState::EDTBS_Closing:\n\t\t\treturn TextHideDuration * CurrentHeight / MaxHeight;\n\n\t\tcase ESoDialogueTextBoxState::EDTBS_Closed:\n\t\tcase ESoDialogueTextBoxState::EDTBS_Opened:\n\t\tdefault:\n\t\t\treturn -1.0f;\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIDialogueTextBox::SetRetainerPercentSafe(float Percent)\n{\n\tstatic const FName EffectMaterialParamNamePercent = FName(\"EdgeSlide\");\n\n\tif (TextRetainer != nullptr)\n\t\tif (auto* EffectMaterial = TextRetainer->GetEffectMaterial())\n\t\t\tEffectMaterial->SetScalarParameterValue(EffectMaterialParamNamePercent, Percent);\n\n\tif (TextBackground && TextBackground->GetDynamicMaterial())\n\t\tTextBackground->GetDynamicMaterial()->SetScalarParameterValue(EffectMaterialParamNamePercent, Percent);\n}\n"
  },
  {
    "path": "Source/SOrb/UI/InGame/Dialogues/SoUIDialogueTextBox.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#pragma once\n\n#include \"CoreMinimal.h\"\n#include \"Blueprint/UserWidget.h\"\n\n#include \"SoUIDialogueTextBox.generated.h\"\n\nDECLARE_DYNAMIC_MULTICAST_DELEGATE(FSoDialogueTextboxNotify);\n\nclass UTextBlock;\nclass UTexture2D;\nclass UImage;\nclass URetainerBox;\nclass URichTextBlock;\nclass URichTextBlock;\nclass UFMODEvent;\n\n\n////////////////////////////////////////////////////////////////////////////////////////\nUENUM(BlueprintType)\nenum class ESoDialogueTextBoxState : uint8\n{\n\tEDTBS_Closed\t\t\tUMETA(DisplayName = \"Closed\"),\n\tEDTBS_Opened\t\t\tUMETA(DisplayName = \"Opened\"),\n\n\tEDTBS_Opening\t\t\tUMETA(DisplayName = \"Opening\"),\n\tEDTBS_Closing\t\t\tUMETA(DisplayName = \"Closing\"),\n\tEDTBS_Changing\t\t\tUMETA(DisplayName = \"Changing\"),\n\n\tEDTBS_MAX\t\t\t\tUMETA(Hidden),\n};\n\n\n/**\n * \n */\nUCLASS()\nclass SORB_API USoUIDialogueTextBox : public UUserWidget\n{\n\tGENERATED_BODY()\n\t\npublic:\n\tvirtual void NativeConstruct() override;\n\tvirtual void NativeTick(const FGeometry& MyGeometry, float InDeltaTime) override;\n\n\tvoid SetSpeakerData(UTexture2D* Background, UTexture2D* NameImage, const FText& Name);\n\n\t/** \n\t *  New text will only be displayed if the textbox was in an idle state: opened or closed\n\t *  If it was opened it will switch to EDTBS_Changing, close, change text, and open again visually\n\t *  If it was closed the widget becomes visible and it opens\n\t *  @Return: false if the call was ignored\n\t */\n\tbool DisplayText(const FText& TextToDisplay);\n\n\t/** Only happens if there wasn't any change in progress, switches to EDTBS_Closing, and the widget only becomes invisible once it is closed */\n\tbool HideDialogueTextBox();\n\n\tvoid ForceHideDialogueTextBox();\n\n\tvoid ForceFinishChange();\n\n\tbool IsDialogueTextBoxHidden() const { return TextBoxState == ESoDialogueTextBoxState::EDTBS_Closed; }\n\tbool IsDialogueTextBoxOpenedAndInIdle() const { return TextBoxState == ESoDialogueTextBoxState::EDTBS_Opened; }\n\tbool IsDialogueTextBoxAnimated() const;\n\n\tESoDialogueTextBoxState GetDialogueTextBoxState() const { return TextBoxState; }\n\n\tvoid SetAnimationSpeedMultiplier(float InAnimationSpeedMultiplier) { AnimationSpeedMultiplier = InAnimationSpeedMultiplier; }\n\nprotected:\n\tconst UCurveFloat* GetCurrentCurve() const;\n\tfloat GetCurrentChangeDuration() const;\n\n\t// Rescale the backgound and retainer\n\tvoid SetRetainerPercentSafe(float Percent);\n\n\tUFUNCTION(BlueprintImplementableEvent)\n\tvoid UpdateTextJustificationBP(bool bCenter);\n\npublic:\n\n\tFSoDialogueTextboxNotify OnDialogueTextboxOpenned;\n\nprotected:\n\n\tUPROPERTY(BlueprintReadWrite, meta = (BindWidget), Category = Widgets)\n\tUTextBlock* NameText;\n\n\tUPROPERTY(BlueprintReadWrite, meta = (BindWidget), Category = Widgets)\n\tUImage* NameBackground;\n\n\tUPROPERTY(BlueprintReadWrite, meta = (BindWidget), Category = Widgets)\n\tURetainerBox* TextRetainer;\n\n\tUPROPERTY(BlueprintReadWrite, meta = (BindWidget), Category = Widgets)\n\tURichTextBlock* RichTextField;\n\n\tUPROPERTY(BlueprintReadWrite, meta = (BindWidget), Category = Widgets)\n\tUImage* TextBackground;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Animations)\n\tfloat TextChangeDuration;\n\n\t// Max Height of the Text box\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Widgets)\n\tfloat MaxHeight = 700.0f;\n\n\t/** first half of text change */\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Animations)\n\tUCurveFloat* TextChangeAnimCurveClosing;\n\n\t/** second half of text change */\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Animations)\n\tUCurveFloat* TextChangeAnimCurveOpening;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Animations)\n\tfloat TextDisplayDuration;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Animations)\n\tUCurveFloat* TextDisplayAnimCurve;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Animations)\n\tfloat TextHideDuration;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Animations)\n\tUCurveFloat* TextHideAnimCurve;\n\n\t\n\t// Height of the Text box\n\tfloat CurrentHeight = 200.0f;\n\n\tfloat Counter;\n\tbool bTextUpdated = false;\n\tFText NewText;\n\n\tESoDialogueTextBoxState TextBoxState;\n\n\tfloat AnimationSpeedMultiplier = 1.0f;\n\n\n\t//\n\t// SFX\n\t//\n\n\tUPROPERTY(EditAnywhere, Category = SFX)\n\tUFMODEvent* SFXTextBoxOpen = nullptr;\n\n\t// UPROPERTY(EditAnywhere, Category = SFX)\n\t// UFMODEvent* SFXTextBoxClose = nullptr;\n};\n"
  },
  {
    "path": "Source/SOrb/UI/InGame/Dialogues/SoUIDialogueWithWizard.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#include \"SoUIDialogueWithWizard.h\"\n\n#include \"Components/Image.h\"\n#include \"Components/TextBlock.h\"\n#include \"Materials/MaterialInstanceDynamic.h\"\n\n#include \"DlgContext.h\"\n#include \"DlgDialogueParticipant.h\"\n\n#include \"Basic/Helpers/SoStaticHelper.h\"\n#include \"Basic/SoGameMode.h\"\n#include \"UI/General/Buttons/SoUIButtonArray.h\"\n#include \"UI/General/Commands/SoUICommandTooltip.h\"\n#include \"Character/SoCharacter.h\"\n#include \"CharacterBase/SoCharacterMovementComponent.h\"\n#include \"FMODEvent.h\"\n#include \"Settings/SoGameSettings.h\"\n#include \"Basic/SoAudioManager.h\"\n\nconst FName SoMatParamWarriorbWeight = FName(\"WarriorbWeight\");\nconst FName SoMatParamWarriorbTexture = FName(\"WarriorbImage\");\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIDialogueWithWizard::NativeConstruct()\n{\n\tSuper::NativeConstruct();\n\tSetVisibility(ESlateVisibility::Collapsed);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIDialogueWithWizard::NativeDestruct()\n{\n\tif (Instance != nullptr)\n\t{\n\t\tInstance->release();\n\t\tInstance = nullptr;\n\t}\n\n\tSuper::NativeDestruct();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoUIDialogueWithWizard::SetInGameActivityEnabled_Implementation(UObject* Source, bool bEnable)\n{\n\tif (bEnable)\n\t{\n\t\tASoGameMode::Get(this).ClearWizardDialogueAfterGroupDefeated();\n\n\t\tif (bOpened)\n\t\t{\n\t\t\tUE_LOG(LogSoUIActivity, Warning, TEXT(\"Dialogue request rejected: a dialogue is already in progress\"));\n\t\t\treturn true;\n\t\t}\n\n\t\tActiveDlgContext = Cast<UDlgContext>(Source);\n\t\tif (ActiveDlgContext == nullptr)\n\t\t\tUE_LOG(LogSoUIActivity, Warning, TEXT(\"Dialogue request rejected: Source is not a dialogue context\"))\n\t\telse\n\t\t{\n\t\t\tbOpened = true;\n\t\t\tSetVisibility(ESlateVisibility::Visible);\n\n\t\t\tASoCharacter* Character = USoStaticHelper::GetPlayerCharacterAsSoCharacter(this);\n\t\t\tconst bool bWizardLine = ActiveDlgContext->GetActiveNodeParticipant() != Character;\n\t\t\tPlayAnimation(WidgetAnimFadeIn);\n\t\t\tPlayAnimation(bWizardLine ? WidgetAnimFadeInWizardText : WidgetAnimFadeInWarriorbText);\n\t\t\tbLastLineWasWizard = bWizardLine;\n\t\t\tBackground->GetDynamicMaterial()->SetScalarParameterValue(SoMatParamWarriorbWeight, bWizardLine ? 0.0f : 1.0f);\n\t\t\t(bWizardLine ? WizardText : WarriorbText)->SetText(ActiveDlgContext->GetActiveNodeText());\n\t\t\tFixTextSizes();\n\t\t\tUpdatePlayerImage();\n\t\t\tUpdateTooltipsVisbility();\n\t\t\tbWaitUntilAnimEndWithVO = true;\n\t\t\tUSoAudioManager::PlaySound2D(this, SFXOnOpen);\n\t\t}\n\t}\n\telse\n\t{\n\t\tbOpened = false;\n\t\tSetVisibility(ESlateVisibility::Collapsed);\n\t\tASoCharacter* Character = USoStaticHelper::GetPlayerCharacterAsSoCharacter(this);\n\t\tCharacter->SetInterruptedWizardDialogue(ActiveDlgContext);\n\t\tActiveDlgContext = nullptr;\n\t}\n\n\treturn bOpened;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoUIDialogueWithWizard::HandleCommand_Implementation(ESoUICommand Command)\n{\n\tswitch (Command)\n\t{\n\t\tcase ESoUICommand::EUC_MainMenuBack:\n\t\tcase ESoUICommand::EUC_MainMenuEnter:\n\t\t\tCommandTooltip->SetVisibility(ESlateVisibility::Collapsed);\n\t\t\tCommandTooltip->SetIsListeningToDeviceChanges(false);\n\t\t\tif (ActiveDlgContext != nullptr && !IsAnyAnimationPlaying())\n\t\t\t{\n\t\t\t\tif (ActiveDlgContext->ChooseOption(0))\n\t\t\t\t{\n\t\t\t\t\tconst bool bWizardLine = ActiveDlgContext->GetActiveNodeParticipant() != USoStaticHelper::GetPlayerCharacterAsActor(this);\n\t\t\t\t\tif (bWizardLine != bLastLineWasWizard)\n\t\t\t\t\t{\n\t\t\t\t\t\tPlayAnimation(WidgetAnimSwitchBackground, 0.0f, 1.0f, bWizardLine ? EUMGSequencePlayMode::Reverse : EUMGSequencePlayMode::Forward);\n\t\t\t\t\t\tUSoAudioManager::PlaySound2D(this, SFXOnSpeakerChange);\n\t\t\t\t\t\tbWaitUntilAnimEndWithVO = true;\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tUSoAudioManager::PlaySound2D(this, SFXOnTextSwitch);\n\t\t\t\t\t\tCheckAndPlayVoice();\n\t\t\t\t\t}\n\n\t\t\t\t\t(bWizardLine ? WizardText : WarriorbText)->SetText(ActiveDlgContext->GetActiveNodeText());\n\t\t\t\t\tFixTextSizes();\n\t\t\t\t\tbLastLineWasWizard = bWizardLine;\n\t\t\t\t\tUpdatePlayerImage();\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tActiveDlgContext = nullptr;\n\t\t\t\t\tPlayAnimation(WidgetAnimFadeOut);\n\t\t\t\t\tPlayAnimation(bLastLineWasWizard ? WidgetAnimFadeOutWizardText : WidgetAnimFadeOutWarriorbText);\n\t\t\t\t\tUSoAudioManager::PlaySound2D(this, SFXOnClose);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tbreak;\n\t}\n\n\t// let the menu open on escape\n\treturn true;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoUIDialogueWithWizard::Update_Implementation(float DeltaSeconds)\n{\n\tif (bWaitUntilAnimEndWithVO && !IsAnyAnimationPlaying())\n\t{\n\t\tbWaitUntilAnimEndWithVO = false;\n\t\tCheckAndPlayVoice();\n\t}\n\n\tASoCharacter* Character = USoStaticHelper::GetPlayerCharacterAsSoCharacter(this);\n\tconst FVector2D Velocity = FVector2D(Character->GetSoMovement()->Velocity);\n\tif (Velocity.SizeSquared() > 0.1f)\n\t{\n\t\tFVector2D NewVelocity = Velocity - Velocity.GetSafeNormal() * DeltaSeconds * SlowDownSpeed;\n\t\tif ((NewVelocity.GetSafeNormal() | Velocity.GetSafeNormal()) < 0.0f)\n\t\t\tNewVelocity = FVector2D(0.0f, 0.0f);\n\n\t\tCharacter->GetSoMovement()->Velocity.X = NewVelocity.X;\n\t\tCharacter->GetSoMovement()->Velocity.Y = NewVelocity.Y;\n\t}\n\n\treturn IsAnyAnimationPlaying() || (ActiveDlgContext != nullptr && ActiveDlgContext->GetOptionsNum() > 0);\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIDialogueWithWizard::UpdatePlayerImage()\n{\n\tif (ActiveDlgContext != nullptr && ActiveDlgContext->GetActiveNodeParticipant() == USoStaticHelper::GetPlayerCharacterAsActor(this))\n\t{\n\t\tBackground->GetDynamicMaterial()->SetTextureParameterValue(SoMatParamWarriorbTexture, GetWarriOrbImage());\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIDialogueWithWizard::UpdateTooltipsVisbility()\n{\n\tAActor* PlayerActor = USoStaticHelper::GetPlayerCharacterAsActor(this);\n\tstatic const FName DlgDisplayedBoolName = TEXT(\"DlgWithWizardDisplayed\");\n\tconst bool bWasHintDisplayed = IDlgDialogueParticipant::Execute_GetBoolValue(PlayerActor, DlgDisplayedBoolName);\n\tif (!bWasHintDisplayed)\n\t{\n\t\tIDlgDialogueParticipant::Execute_ModifyBoolValue(PlayerActor, DlgDisplayedBoolName, true);\n\t}\n\n\tCommandTooltip->SetVisibility(!bWasHintDisplayed ? ESlateVisibility::Visible : ESlateVisibility::Collapsed);\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIDialogueWithWizard::CheckAndPlayVoice()\n{\n\tif (ActiveDlgContext == nullptr)\n\t\treturn;\n\n\t// Voice gibberish disabled by settings\n\tif (USoGameSettings::Get().IsDialogueVoiceGibberishMuted())\n\t\treturn;\n\n\tif (UFMODEvent* VO = Cast<UFMODEvent>(ActiveDlgContext->GetActiveNodeGenericData()))\n\t{\n\t\tif (Instance != nullptr)\n\t\t{\n\t\t\tFMOD_STUDIO_PLAYBACK_STATE State;\n\t\t\tInstance->getPlaybackState(&State);\n\t\t\tif (State == FMOD_STUDIO_PLAYBACK_STATE::FMOD_STUDIO_PLAYBACK_PLAYING)\n\t\t\t\tInstance->stop(FMOD_STUDIO_STOP_ALLOWFADEOUT);\n\n\t\t\tInstance->release();\n\t\t\tInstance = nullptr;\n\t\t}\n\n\t\tInstance = USoAudioManager::PlaySound2D(this, VO, false).Instance;\n\t\tif (Instance != nullptr)\n\t\t\tInstance->start();\n\t}\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUTexture* USoUIDialogueWithWizard::GetWarriOrbImage() const\n{\n\tswitch (USoGameSettings::Get().GetCharacterSkinType())\n\t{\n\t\tcase ESoCharacterSkinType::Mummy:\n\t\t\treturn WarriOrbImageMummy;\n\n\t\tcase ESoCharacterSkinType::Pumpkin:\n\t\t\treturn WarriOrbImagePumpkin;\n\n\t\tdefault:\n\t\tcase ESoCharacterSkinType::Classic:\n\t\t\treturn WarriOrbImageClassic;\n\t}\n}"
  },
  {
    "path": "Source/SOrb/UI/InGame/Dialogues/SoUIDialogueWithWizard.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#pragma once\n\n#include \"CoreMinimal.h\"\n#include \"UI/InGame/SoUIGameActivity.h\"\n\n#include \"SoUIDialogueWithWizard.generated.h\"\n\n\nclass UImage;\nclass UFMODEvent;\nclass UTextBlock;\nclass USoUICommandTooltip;\nclass UTexture;\nclass UWidgetAnimation;\nclass UDlgContext;\n\nnamespace FMOD\n{\n\tnamespace  Studio\n\t{\n\t\tclass EventInstance;\n\t}\n}\n\n/**  UI and control class for mini dialogues with the wizard */\nUCLASS()\nclass SORB_API USoUIDialogueWithWizard : public USoInGameUIActivity\n{\n\tGENERATED_BODY()\n\nprotected:\n\t// Begin UUserWidget Interface\n\tvoid NativeConstruct() override;\n\tvoid NativeDestruct() override;\n\t// End UUserWidget Interface\n\n\t/** valid, started DlgContext is expected */\n\tbool SetInGameActivityEnabled_Implementation(UObject* Source, bool bEnable) override;\n\n\tbool HandleCommand_Implementation(ESoUICommand Command) override;\n\n\tbool Update_Implementation(float DeltaSeconds) override;\n\n\tvoid UpdatePlayerImage();\n\n\tvoid UpdateTooltipsVisbility();\n\n\tvoid CheckAndPlayVoice();\n\n\tUTexture* GetWarriOrbImage() const;\n\nprotected:\n\n\tUFUNCTION(BlueprintImplementableEvent)\n\tvoid FixTextSizes();\n\nprotected:\n\n\tUPROPERTY(BlueprintReadWrite, meta = (BindWidget), Category = Widgets)\n\tUImage* Background;\n\n\tUPROPERTY(BlueprintReadWrite, meta = (BindWidget), Category = Widgets)\n\tUTextBlock* WizardText;\n\n\tUPROPERTY(BlueprintReadWrite, meta = (BindWidget), Category = Widgets)\n\tUTextBlock* WarriorbText;\n\n\tUPROPERTY(BlueprintReadWrite, meta = (BindWidget), Category = Widgets)\n\tUSoUICommandTooltip* CommandTooltip;\n\n\tUPROPERTY(EditAnywhere, Category = Widgets)\n\tUTexture* WarriOrbImageClassic;\n\n\tUPROPERTY(EditAnywhere, Category = Widgets)\n\tUTexture* WarriOrbImageMummy;\n\n\tUPROPERTY(EditAnywhere, Category = Widgets)\n\tUTexture* WarriOrbImagePumpkin;\n\n\n\tUPROPERTY(BlueprintReadWrite, Category = Widgets)\n\tUWidgetAnimation* WidgetAnimFadeIn;\n\n\tUPROPERTY(BlueprintReadWrite, Category = Widgets)\n\tUWidgetAnimation* WidgetAnimFadeInWizardText;\n\n\tUPROPERTY(BlueprintReadWrite, Category = Widgets)\n\tUWidgetAnimation* WidgetAnimFadeInWarriorbText;\n\n\tUPROPERTY(BlueprintReadWrite, Category = Widgets)\n\tUWidgetAnimation* WidgetAnimFadeOut;\n\n\tUPROPERTY(BlueprintReadWrite, Category = Widgets)\n\tUWidgetAnimation* WidgetAnimFadeOutWizardText;\n\n\tUPROPERTY(BlueprintReadWrite, Category = Widgets)\n\tUWidgetAnimation* WidgetAnimFadeOutWarriorbText;\n\n\tUPROPERTY(BlueprintReadWrite, Category = Widgets)\n\tUWidgetAnimation* WidgetAnimSwitchBackground;\n\n\n\tbool bLastLineWasWizard = false;\n\n\tUPROPERTY(BlueprintReadOnly)\n\tUDlgContext* ActiveDlgContext = nullptr;\n\n\tbool bOpened = false;\n\n\tUPROPERTY(EditAnywhere)\n\tfloat SlowDownSpeed = 500.0f;\n\n\tbool bWaitUntilAnimEndWithVO;\n\n\n\tFMOD::Studio::EventInstance* Instance = nullptr;\n\n\t//\n\t// SFX\n\t//\n\n\tUPROPERTY(EditAnywhere, Category = SFX)\n\tUFMODEvent* SFXOnOpen = nullptr;\n\n\tUPROPERTY(EditAnywhere, Category = SFX)\n\tUFMODEvent* SFXOnClose = nullptr;\n\n\tUPROPERTY(EditAnywhere, Category = SFX)\n\tUFMODEvent* SFXOnSpeakerChange = nullptr;\n\n\tUPROPERTY(EditAnywhere, Category = SFX)\n\tUFMODEvent* SFXOnTextSwitch = nullptr;\n};\n"
  },
  {
    "path": "Source/SOrb/UI/InGame/SoUIChallengeCompleted.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#include \"SoUIChallengeCompleted.h\"\n\n#include \"Components/Image.h\"\n#include \"Components/TextBlock.h\"\n#include \"Components/HorizontalBox.h\"\n\n#include \"Levels/SoLevelHelper.h\"\n#include \"Basic/Helpers/SoStaticHelper.h\"\n#include \"Basic/SoGameInstance.h\"\n#include \"Character/SoCharacter.h\"\n#include \"UI/General/Buttons/SoUIButtonImage.h\"\n#include \"UI/General/Buttons/SoUIButtonArray.h\"\n#include \"UI/General/SoUIExternalLink.h\"\n\n#include \"Localization/SoLocalization.h\"\n#include \"Basic/Helpers/SoPlatformHelper.h\"\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIChallengeCompleted::SynchronizeProperties()\n{\n\tSuper::SynchronizeProperties();\n\n\tif (ButtonsArray)\n\t{\n\t\tButtonsArray\n\t\t\t->SetVerticalLayout(false)\n\t\t\t->SetFakeVirtualContainer(true)\n\t\t\t->SetSkipDeactivatedChildren(false);\n\n\t\tButtonsArray->SetVisibility(ESlateVisibility::Collapsed);\n\t}\n\n\tif (ButtonImageToolTipExit)\n\t\tButtonImageToolTipExit->SetVisibility(bDemoEnding ? ESlateVisibility::Collapsed : ESlateVisibility::Visible);\n\n\tif (TextDemoThankYou)\n\t\tTextDemoThankYou->SetVisibility(bDemoEnding ? ESlateVisibility::Visible : ESlateVisibility::Collapsed);\n\tif (ButtonDiscord)\n\t\tButtonDiscord->SetVisibility(bDemoEnding ? ESlateVisibility::Visible : ESlateVisibility::Collapsed);\n\tif (ButtonTwitter)\n\t\tButtonTwitter->SetVisibility(bDemoEnding ? ESlateVisibility::Visible : ESlateVisibility::Collapsed);\n\tif (ButtonSteam)\n\t\tButtonSteam->SetVisibility(bDemoEnding && !USoPlatformHelper::IsConsole() ? ESlateVisibility::Visible : ESlateVisibility::Collapsed);\n\tif (ButtonExit)\n\t\tButtonExit->SetVisibility(bDemoEnding ? ESlateVisibility::Visible : ESlateVisibility::Collapsed);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIChallengeCompleted::NativeConstruct()\n{\n\tSuper::NativeConstruct();\n\tSetVisibility(ESlateVisibility::Collapsed);\n\n\tif (ButtonExit)\n\t{\n\t\tButtonExit->OnOpenLinkEvent().BindUObject(this, &ThisClass::OnExitPressed);\n\t}\n\n\t// NOTE: because it is a fake virtual container\n\tButtonsArray->AddContainerChild(ButtonDiscord);\n\tButtonsArray->AddContainerChild(ButtonTwitter);\n\n\tif (!USoPlatformHelper::IsConsole())\n\t\tButtonsArray->AddContainerChild(ButtonSteam);\n\n\tButtonsArray->AddContainerChild(ButtonExit);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIChallengeCompleted::OnExitPressed()\n{\n\tbOpened = false;\n\tSetVisibility(ESlateVisibility::Collapsed);\n\tUSoGameInstance::Get(this).TeleportToMainMenu(true);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoUIChallengeCompleted::SetInGameActivityEnabled_Implementation(UObject* Source, bool bEnable)\n{\n\t// Ignore all close requests\n\tif (!bEnable)\n\t\treturn false;\n\n\tbOpened = bEnable;\n\tSetVisibility(ESlateVisibility::Visible);\n\n\t// Init the buttons\n\tButtonImageToolTipExit->SetUICommand(CommandLeave, true);\n\tButtonImageToolTipExit->SetButtonText(FROM_STRING_TABLE_INTERACTION(\"leave\"));\n\n\t// Fill episode data\n\tconst FName EpisodeName = USoLevelHelper::GetEpisodeNameFromObject(this);\n\tFSoEpisodeMapParams EpisodeData;\n\tUSoLevelHelper::GetEpisodeData(EpisodeName, EpisodeData);\n\tSubtitle->SetText(EpisodeData.CompletedSubtitle);\n\tDescription->SetText(EpisodeData.CompletedDescription);\n\n\t// Override music\n\tif (ASoCharacter* Char = USoStaticHelper::GetPlayerCharacterAsSoCharacter(this))\n\t{\n\t\tChar->SetMusicOverride(MusicToPlay, true, this);\n\t}\n\n\tif (bDemoEnding)\n\t{\n\t\tButtonsArray->SetSelectedIndex(0);\n\t}\n\n\t// Enable mouse\n\tUSoPlatformHelper::AllowMouse(this);\n\n\treturn true;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoUIChallengeCompleted::HandleCommand_Implementation(ESoUICommand Command)\n{\n\tif (IsAnyAnimationPlaying())\n\t\treturn true;\n\n\t// Forward to children\n\tif (bDemoEnding)\n\t{\n\t\tButtonsArray->Navigate(Command);\n\t}\n\telse\n\t{\n\t\tif (Command == CommandLeave)\n\t\t{\n\t\t\tOnExitPressed();\n\t\t}\n\t\telse if (Command == ESoUICommand::EUC_MainMenuBack)\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t}\n\n\treturn true;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoUIChallengeCompleted::Update_Implementation(float DeltaSeconds)\n{\n\treturn bOpened;\n}\n"
  },
  {
    "path": "Source/SOrb/UI/InGame/SoUIChallengeCompleted.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#pragma once\n\n#include \"CoreMinimal.h\"\n#include \"Components/PanelWidget.h\"\n\n#include \"UI/InGame/SoUIGameActivity.h\"\n#include \"Basic/Helpers/SoMathHelper.h\"\n\n#include \"SoUIChallengeCompleted.generated.h\"\n\nclass UFMODEvent;\nclass UImage;\nclass UCanvasPanel;\nclass UTextBlock;\nclass USoUIButtonImage;\nclass UHorizontalBox;\nclass USoUIExternalLink;\n\nUCLASS(HideCategories = (Navigation), AutoCollapseCategories = (Performance, Clipping, Interaction, Input))\nclass SORB_API USoUIChallengeCompleted : public USoInGameUIActivity\n{\n\tGENERATED_BODY()\n\nprotected:\n\t// Begin UUserWidget Interface\n\tvoid SynchronizeProperties() override;\n\tvoid NativeConstruct() override;\n\t// End UUserWidget Interface\n\n\tbool SetInGameActivityEnabled_Implementation(UObject* Source, bool bEnable) override;\n\tbool HandleCommand_Implementation(ESoUICommand Command) override;\n\tbool Update_Implementation(float DeltaSeconds) override;\n\n\tUFUNCTION()\n\tvoid OnExitPressed();\n\nprotected:\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\", meta = (BindWidget))\n\tUTextBlock* Subtitle;\n\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\", meta = (BindWidget))\n\tUTextBlock* Description;\n\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\", meta = (BindWidget))\n\tUTextBlock* TextDemoThankYou;\n\n\t// Shows the back button\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\", meta = (BindWidget))\n\tUSoUIButtonImage* ButtonImageToolTipExit;\n\n\tUPROPERTY(BlueprintReadOnly, Category = \">Widgets\", meta = (BindWidget))\n\tUSoUIUserWidgetArray* ButtonsArray;\n\n\tUPROPERTY(BlueprintReadOnly, Category = \">Widgets\", meta = (BindWidget))\n\tUHorizontalBox* ButtonsContainer;\n\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\",  meta = (BindWidget))\n\tUSoUIExternalLink* ButtonDiscord;\n\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\",  meta = (BindWidget))\n\tUSoUIExternalLink* ButtonTwitter;\n\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\",  meta = (BindWidget))\n\tUSoUIExternalLink* ButtonSteam;\n\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\",  meta = (BindWidget))\n\tUSoUIExternalLink* ButtonExit;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = \">State\")\n\tbool bOpened = false;\n\n\t// Special case for demo\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = \">State\")\n\tbool bDemoEnding = false;\n\n\t// Command/shortcut used for leaving\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = \">State\")\n\tESoUICommand CommandLeave = ESoUICommand::EUC_Action1;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = \">SFX\")\n\tUFMODEvent* MusicToPlay;\n};\n"
  },
  {
    "path": "Source/SOrb/UI/InGame/SoUICharacterPanels.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#include \"SoUICharacterPanels.h\"\n\n#include \"Components/TextBlock.h\"\n\n#include \"UI/General/Buttons/SoUIButtonArray.h\"\n#include \"Settings/Input/SoInputHelper.h\"\n#include \"UI/SoUIHelper.h\"\n#include \"Basic/SoAudioManager.h\"\n#include \"Settings/SoGameSettings.h\"\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUICharacterPanels::NativeConstruct()\n{\n\t// first so BP can use it\n\tSubPanels = { CharacterSheet, Inventory, Spells, Notes };\n\n\tSuper::NativeConstruct();\n\n\tSetVisibility(ESlateVisibility::Collapsed);\n\n\tfor (USoInGameUIActivity* SubPanel : SubPanels)\n\t\tSubPanel->SetInGameActivityEnabled(nullptr, false);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoUICharacterPanels::SetInGameActivityEnabled_Implementation(UObject* Source, bool bEnable)\n{\n\tif (bOpened == bEnable)\n\t\treturn bOpened;\n\n\tbShouldIgnoreMenuBackCommand = false;\n\tbOpened = bEnable;\n\n\t// Block game UI only if gamepad\n\tUSoInputHelper::SetGameInputBlockedByUI(this, bOpened && USoInputHelper::IsLastInputFromGamepad(this));\n\n\tif (bOpened)\n\t{\n\t\tUSoAudioManager::PlaySound2D(this, SFXOpen);\n\t\tUSoGameSettings::Get().SetTemporaryGameSpeed(0.1f);\n\t}\n\telse\n\t{\n\t\tUSoAudioManager::PlaySound2D(this, SFXClose);\n\n\t\t// Reset game speed to setting values\n\t\tUSoGameSettings::Get().ApplyGameSettings(true);\n\t}\n\n\tSetVisibility(bOpened ? ESlateVisibility::Visible : ESlateVisibility::Collapsed);\n\n\t// Select current Menu\n\tint32 SelectedMenu = 0;\n\tif (bOpened)\n\t{\n\t\t// Open previous menu\n\t\tif (PanelToOpenOnNextStartOverride != nullptr)\n\t\t\tSelectedMenu = SubPanels.Find(PanelToOpenOnNextStartOverride);\n\t\tif (!SubPanels.IsValidIndex(SelectedMenu))\n\t\t\tSelectedMenu = 0;\n\n\t\tSubMenus->SetSelectedIndex(SelectedMenu);\n\t\tPanelToOpenOnNextStartOverride = nullptr;\n\t}\n\telse\n\t\tSelectedMenu = SubMenus->GetSelectedIndex();\n\n\tSubPanels[SelectedMenu]->SetInGameActivityEnabled(Source, bOpened);\n\treturn bOpened;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoUICharacterPanels::HandleCommand_Implementation(ESoUICommand Command)\n{\n\tCommand = USoUIHelper::TryTranslateMenuCommandDirectionToGame(Command);\n\n\t// Ignore MenuBack Command\n\tif (bShouldIgnoreMenuBackCommand && Command == ESoUICommand::EUC_MainMenuBack)\n\t{\n\t\tbShouldIgnoreMenuBackCommand = false;\n\t\treturn true;\n\t}\n\n\tswitch (Command)\n\t{\n\t\tcase ESoUICommand::EUC_TopLeft:\n\t\t\tGetSelectedSubPanel()->SetInGameActivityEnabled(nullptr, false);\n\t\t\tSubMenus->Navigate(ESoUICommand::EUC_Left);\n\t\t\tGetSelectedSubPanel()->SetInGameActivityEnabled(nullptr, true);\n\t\t\tUSoAudioManager::PlaySound2D(this, SFXPanelSwitch);\n\t\t\tbreak;\n\n\t\tcase ESoUICommand::EUC_TopRight:\n\t\t\tGetSelectedSubPanel()->SetInGameActivityEnabled(nullptr, false);\n\t\t\tSubMenus->Navigate(ESoUICommand::EUC_Right);\n\t\t\tGetSelectedSubPanel()->SetInGameActivityEnabled(nullptr, true);\n\t\t\tUSoAudioManager::PlaySound2D(this, SFXPanelSwitch);\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\t// Let sub panel handle command but if it is not handled by sub panel and it is a close command we close the current widget\n\t\t\tconst bool bHandledBySubPanel = GetSelectedSubPanel()->HandleCommand(Command);\n\n\t\t\t// Subpanel wants to handle ActionBack Command most likely\n\t\t\tif (!bShouldIgnoreMenuBackCommand)\n\t\t\t\tbShouldIgnoreMenuBackCommand = GetSelectedSubPanel()->ShouldParentIgnoreTheNextMenuBack();\n\n\t\t\tif (!bHandledBySubPanel && IsMenuBackCommand(Command))\n\t\t\t\tSetInGameActivityEnabled(nullptr, false);\n\n\t\t\tbreak;\n\t}\n\n\t// it is a top level UI Element, will handle the input no matter what (worst case it hides itself)\n\treturn true;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoUICharacterPanels::Update_Implementation(float DeltaSeconds)\n{\n\treturn bOpened;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoUICharacterPanels::IsMenuBackCommand(ESoUICommand Command) const\n{\n\tif (Command == ESoUICommand::EUC_MainMenuBack)\n\t\treturn true;\n\n\t// Only make back button work on gamepads\n\tif (USoInputHelper::IsLastInputFromGamepad(this) && Command == ESoUICommand::EUC_ActionBack)\n\t\treturn true;\n\n\treturn false;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUSoInGameUIActivity* USoUICharacterPanels::GetSelectedSubPanel() const\n{\n\tconst int32 PanelIndex = SubMenus->GetSelectedIndex();\n\tverify(SubPanels.IsValidIndex(PanelIndex));\n\tUSoInGameUIActivity* Panel = SubPanels[PanelIndex];\n\tverify(Panel);\n\n\treturn Panel;\n}\n"
  },
  {
    "path": "Source/SOrb/UI/InGame/SoUICharacterPanels.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#pragma once\n\n#include \"CoreMinimal.h\"\n#include \"UI/InGame/SoUIGameActivity.h\"\n\n#include \"SoUICharacterPanels.generated.h\"\n\nclass USoUIButtonArray;\nclass ASoPlayerController;\nclass USoInGameUIActivity;\nclass UFMODEvent;\n\n/**\n *\n */\nUCLASS()\nclass SORB_API USoUICharacterPanels : public USoInGameUIActivity\n{\n\tGENERATED_BODY()\n\npublic:\n\t// Begin UUserWidget Interface\n\tvoid NativeConstruct() override;\n\t// End UUserWidget Interface\n\nprotected:\n\t// USoInGameUIActivity Interface\n\tbool SetInGameActivityEnabled_Implementation(UObject* Source, bool bEnable) override;\n\tbool HandleCommand_Implementation(ESoUICommand Command) override;\n\tbool Update_Implementation(float DeltaSeconds) override;\n\tbool IsActiveInPausedGame_Implementation() const override { return true;  }\n\tbool IsActiveInDilatedTime_Implementation(float CurrentTimeDilation) const override { return true; }\n\n\tbool IsMenuBackCommand(ESoUICommand Command) const;\n\tUSoInGameUIActivity* GetSelectedSubPanel() const;\n\nprotected:\n\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\", meta = (BindWidget))\n\tUSoUIButtonArray* SubMenus = nullptr;\n\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\", meta = (BindWidget))\n\tUSoInGameUIActivity* CharacterSheet = nullptr;\n\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\", meta = (BindWidget))\n\tUSoInGameUIActivity* Inventory = nullptr;\n\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\", meta = (BindWidget))\n\tUSoInGameUIActivity* Spells = nullptr;\n\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\", meta = (BindWidget))\n\tUSoInGameUIActivity* Notes = nullptr;\n\n\tUPROPERTY(BlueprintReadWrite, Category = \">Runtime\")\n\tTArray<USoInGameUIActivity*> SubPanels;\n\n\tUPROPERTY(BlueprintReadWrite, Category = \">Runtime\")\n\tUSoInGameUIActivity* PanelToOpenOnNextStartOverride = nullptr;\n\n\tUPROPERTY()\n\tbool bShouldIgnoreMenuBackCommand = false;\n\n\tUPROPERTY()\n\tbool bOpened = false;\n\n\t//\n\t// SFX\n\t//\n\n\tUPROPERTY(EditAnywhere, Category = \">SFX\")\n\tUFMODEvent* SFXPanelSwitch = nullptr;\n\n\tUPROPERTY(EditAnywhere, Category = \">SFX\")\n\tUFMODEvent* SFXOpen = nullptr;\n\n\tUPROPERTY(EditAnywhere, Category = \">SFX\")\n\tUFMODEvent* SFXClose = nullptr;\n};\n"
  },
  {
    "path": "Source/SOrb/UI/InGame/SoUICharacterPreview.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#pragma once\n\n#include \"CoreMinimal.h\"\n#include \"Blueprint/UserWidget.h\"\n#include \"Components/Image.h\"\n#include \"Materials/MaterialInstanceDynamic.h\"\n\n#include \"SoUICharacterPreview.generated.h\"\n\n/**\n *\n */\nUCLASS()\nclass SORB_API USoUICharacterPreview : public UUserWidget\n{\n\tGENERATED_BODY()\n\npublic:\n\tvoid SetColorMultiplier(const FLinearColor& Color)\n\t{\n\t\tColorMultiplier = Color;\n\t\tSoImage->GetDynamicMaterial()->SetVectorParameterValue(ColorMultiplierName, ColorMultiplier);\n\t}\n\n\tvoid SetActivePercent(float Value)\n\t{\n\t\tActivePercent = Value;\n\t\tSoImage->GetDynamicMaterial()->SetScalarParameterValue(ActivePercentName, ActivePercent);\n\t}\n\n\tconst FLinearColor& GetColorMultiplier() const { return ColorMultiplier; }\n\n\tUFUNCTION(BlueprintImplementableEvent, BlueprintCallable, Category = CharPreview)\n\tvoid UpdateFromPlayerCharacter(FName Emotion = NAME_None);\n\nprotected:\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\", meta = (BindWidget))\n\tUImage* SoImage;\n\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = \">Options\")\n\tFLinearColor ColorMultiplier = FLinearColor(1.0f, 1.0f, 1.0f, 1.0f);\n\n\tfloat ActivePercent = 1.0f;\n\n\tconst FName ColorMultiplierName = FName(\"ColorMultiplier\");\n\tconst FName ActivePercentName = FName(\"ActivePercent\");\n};\n"
  },
  {
    "path": "Source/SOrb/UI/InGame/SoUIEnding.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#include \"SoUIEnding.h\"\n\n#include \"Components/CanvasPanel.h\"\n#include \"Components/RichTextBlock.h\"\n#include \"Components/Image.h\"\n\n#include \"Materials/MaterialInstanceDynamic.h\"\n\n#include \"Basic/Helpers/SoStringHelper.h\"\n#include \"Basic/Helpers/SoStaticHelper.h\"\n#include \"Basic/Helpers/SoDateTimeHelper.h\"\n#include \"Character/SoCharacter.h\"\n#include \"Character/SoPlayerProgress.h\"\n#include \"Basic/SoAudioManager.h\"\n#include \"Basic/SoGameInstance.h\"\n#include \"UI/SoUICredits.h\"\n#include \"SaveFiles/SoWorldState.h\"\n#include \"Levels/SoLevelHelper.h\"\n\n#if WITH_EDITOR\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIEnding::PreSave(const ITargetPlatform* TargetPlatform)\n{\n\tUpdateLocalizedFields();\n\tSuper::PreSave(TargetPlatform);\n}\n#endif // WITH_EDITOR\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIEnding::UpdateLocalizedFields()\n{\n\tconst FString ObjectName = USoStringHelper::GetObjectBaseName(this);\n\tconst FString TextNamespace(TEXT(\"EndScreen\"));\n\n\tfor (int32 EntryIndex = 0; EntryIndex < EndingLogic.Num(); EntryIndex++)\n\t{\n\t\tauto& Entry = EndingLogic[EntryIndex];\n\t\tfor (int32 TextIndex = 0; TextIndex < EndingLogic[EntryIndex].Texts.Num(); TextIndex++)\n\t\t{\n\t\t\tauto& Text = Entry.Texts[TextIndex];\n\t\t\tif (Text.ShouldGatherForLocalization())\n\t\t\t{\n\t\t\t\tText = FInternationalization::ForUseOnlyByLocMacroAndGraphNodeTextLiterals_CreateText(\n\t\t\t\t\t*Text.ToString(),\n\t\t\t\t\t*TextNamespace,\n\t\t\t\t\t*(ObjectName + \"_entry_\" + FString::FromInt(EntryIndex) + \"_text_\" + FString::FromInt(TextIndex))\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIEnding::NativeConstruct()\n{\n\tSuper::NativeConstruct();\n\n\tHideAllTextBlocks();\n\n\tSetVisibility(ESlateVisibility::Collapsed);\n\n#if WITH_EDITOR\n\tconst bool bCanBeVisible = true;\n#else\n\tconst bool bCanBeVisible = (USoLevelHelper::GetChapterNameFromObject(this) == FName(\"SoEnding\"));\n#endif\n\n\tfor (FSoUIEndingEntry& Entry : EndingLogic)\n\t{\n\t\tif (UImage* Img = GetImage(Entry.ImageName))\n\t\t{\n\t\t\tif (UTexture* Texture = Cast<UTexture>(Img->Brush.GetResourceObject()))\n\t\t\t{\n\t\t\t\tif (bCanBeVisible)\n\t\t\t\t\tTextureMap.Add(Entry.ImageName, Texture);\n\n\t\t\t\tif (const FSoUIImageFadeData* FadeData = ImageFadeData.Find(Entry.ImageName))\n\t\t\t\t\tImg->SetBrushFromMaterial(FadeData->FadeInMaterial);\n\t\t\t\telse\n\t\t\t\t\tImg->SetBrushFromMaterial(ImgMaterial);\n\n\t\t\t\tif (UMaterialInstanceDynamic* DynamicMaterial = Img->GetDynamicMaterial())\n\t\t\t\t{\n\t\t\t\t\tDynamicMaterial->SetTextureParameterValue(FName(\"Texture\"), bCanBeVisible ? Texture : nullptr);\n\t\t\t\t\tDynamicMaterial->SetScalarParameterValue(FName(\"FadeStr\"), 0.0f);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tif (Credits != nullptr)\n\t\tCredits->OnCreditsFinished().AddDynamic(this, &USoUIEnding::OnCreditsFinished);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIEnding::NativeDestruct()\n{\n\tif (Credits != nullptr)\n\t\tCredits->OnCreditsFinished().RemoveDynamic(this, &USoUIEnding::OnCreditsFinished);\n\n\tSuper::NativeDestruct();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoUIEnding::SetInGameActivityEnabled_Implementation(UObject* Source, bool bEnable)\n{\n\tif (bEnable)\n\t{\n\t\tSetVisibility(ESlateVisibility::Visible);\n\t\tbShouldBeOpen = true;\n\t\tEndingUIState = ESoEndingUIState::Idle;\n\n\t\tActiveSequenceIndex = 0;\n\t\tRefreshPreview(0.0f);\n\n\t\tActiveSequenceSubIndex = 0;\n\t\tFadeCounter = 0.0f;\n\t\tbFadeImage = true;\n\t\tEndingUIState = ESoEndingUIState::FadeIn;\n\t\tStartFadeInBP();\n\t\tif (UImage* Img = GetImage(EndingLogic[0].ImageName))\n\t\t{\n\t\t\tImg->SetVisibility(ESlateVisibility::Visible);\n\t\t\t// SetImageRenderOpacity(Img, 0.0f);\n\t\t\tSetImageMaterialParams(Img, EndingLogic[0].ImageName, true);\n\t\t}\n\n\t\tif (EndingLogic.IsValidIndex(0))\n\t\t\tUSoAudioManager::Get(this).SetMusic(EndingLogic[0].Music, true, 0.0f);\n\n\t\tESoDifficulty GameDifficulty = FSoWorldState::Get().GetGameDifficulty();\n\n\t\t// Unlock speedrun achievement\n\t\tif (GameDifficulty == ESoDifficulty::Intended || GameDifficulty == ESoDifficulty::Insane)\n\t\t{\n\t\t\tif (ASoCharacter* SoChar = USoStaticHelper::GetPlayerCharacterAsSoCharacter(this))\n\t\t\t{\n\t\t\t\tif (USoPlayerProgress* PlayerProgress = SoChar->GetPlayerProgress())\n\t\t\t\t{\n\t\t\t\t\t// 3 Hours\n\t\t\t\t\tconst float ThresholdSeconds = 180.0f * 60.0f;\n\t\t\t\t\tif (PlayerProgress->GetCurrentPlayTimeSeconds() <= ThresholdSeconds)\n\t\t\t\t\t{\n\t\t\t\t\t\tstatic const FName SpeedrunnerAchievementName = FName(\"A_Speedrunner\");\n\t\t\t\t\t\tUSoAchievementManager::Get(this).UnlockAchievement(this, SpeedrunnerAchievementName);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\n\n\t\t// Unlock insane achievement\n\t\tif (GameDifficulty == ESoDifficulty::Insane)\n\t\t{\n\t\t\tstatic const FName InsaneAchievementName = FName(\"A_Insane\");\n\t\t\tUSoAchievementManager::Get(this).UnlockAchievement(this, InsaneAchievementName);\n\t\t}\n\n\t}\n\telse\n\t{\n\t\tSetVisibility(ESlateVisibility::Collapsed);\n\t}\n\n\treturn bEnable;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoUIEnding::HandleCommand_Implementation(ESoUICommand Command)\n{\n\tif (EndingUIState == ESoEndingUIState::Idle && Command == ESoUICommand::EUC_MainMenuEnter)\n\t{\n\t\tif (EndingLogic.IsValidIndex(ActiveSequenceIndex))\n\t\t{\n\t\t\tif (ActiveSequenceSubIndex == 1 && EndingLogic[ActiveSequenceIndex].Texts.Num() > 1)\n\t\t\t{\n\t\t\t\tEndingUIState = ESoEndingUIState::EntryUpdate;\n\t\t\t\tFadeCounter = FadeInDurationFirstText;\n\t\t\t\tPlayVO(ActiveSequenceIndex, ActiveSequenceSubIndex);\n\t\t\t}\n\t\t\telse if (EndingLogic.IsValidIndex(ActiveSequenceIndex + 1))\n\t\t\t{\n\t\t\t\tbFadeImage = EndingLogic[ActiveSequenceIndex].ImageName != EndingLogic[ActiveSequenceIndex + 1].ImageName &&\n\t\t\t\t\tEndingLogic[ActiveSequenceIndex].ImageName != NAME_None;\n\t\t\t\tEndingUIState = ESoEndingUIState::EntryFadeOut;\n\t\t\t\tFadeCounter = 0.0f;\n\n\t\t\t\tif (bFadeImage)\n\t\t\t\t\tSetImageMaterialParams(GetImage(EndingLogic[ActiveSequenceIndex].ImageName), EndingLogic[ActiveSequenceIndex].ImageName, false);\n\n\t\t\t\tif (EndingLogic[ActiveSequenceIndex + 1].Music != nullptr && EndingLogic[ActiveSequenceIndex + 1].Music != EndingLogic[ActiveSequenceIndex].Music)\n\t\t\t\t\tUSoAudioManager::Get(this).SetMusic(EndingLogic[ActiveSequenceIndex + 1].Music, true, GetFadeOutDuration());\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tEndingUIState = ESoEndingUIState::Finished;\n\t\t\t\tOnFinished();\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tEndingUIState = ESoEndingUIState::Finished;\n\t\t\tOnFinished();\n\t\t}\n\t}\n\telse if (EndingUIState == ESoEndingUIState::Finished && Command != ESoUICommand::EUC_MainMenuBack)\n\t{\n\t\tif (Credits)\n\t\t{\n\t\t\tCredits->HandleCommand(Command);\n\t\t\treturn true;\n\t\t}\n\t}\n\n\t// let the menu open on escape\n\treturn Command != ESoUICommand::EUC_MainMenuBack;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoUIEnding::Update_Implementation(float DeltaSeconds)\n{\n\tswitch (EndingUIState)\n\t{\n\t\tcase ESoEndingUIState::FadeIn:\n\t\t\tif (!IsAnyAnimationPlaying())\n\t\t\t\tEndingUIState = ESoEndingUIState::EntryFadeIn;\n\t\t\tbreak;\n\n\t\tcase ESoEndingUIState::EntryFadeOut:\n\t\t{\n\t\t\tFadeCounter += DeltaSeconds;\n\n\t\t\tif (FadeCounter <= GetFadeOutDuration())\n\t\t\t{\n\t\t\t\tconst float NewRenderOpacity = USoMathHelper::Interpolate(1.0f,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t  0.0f,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t  FMath::Clamp(FadeCounter / GetFadeOutDuration(), 0.0f, 1.0f),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t  bFadeImage ? FadeOutMethodImage : FadeOutMethod);\n\n\t\t\t\tif (bFadeImage)\n\t\t\t\t\tSetImageRenderOpacity(ActiveSequenceIndex, NewRenderOpacity);\n\n\t\t\t\tfor (int32 i = 0; i < EndingLogic[ActiveSequenceIndex].Texts.Num(); ++i)\n\t\t\t\t\tSetTextBoxRenderOpacity(ActiveSequenceIndex, i, NewRenderOpacity);\n\n\t\t\t\tif (URichTextBlock* TB = GetTextBlock(EndingLogic[ActiveSequenceIndex].TextBoxName))\n\t\t\t\t\tTB->SetRenderOpacity(NewRenderOpacity);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif (bFadeImage)\n\t\t\t\t{\n\t\t\t\t\tif (UImage* Img = GetImage(EndingLogic[ActiveSequenceIndex].ImageName))\n\t\t\t\t\t\tImg->SetVisibility(ESlateVisibility::Collapsed);\n\t\t\t\t}\n\n\t\t\t\tfor (int32 i = 0; i < EndingLogic[ActiveSequenceIndex].Texts.Num(); ++i)\n\t\t\t\t\tif (URichTextBlock* TB = GetTextBlock(ActiveSequenceIndex, i))\n\t\t\t\t\t\tTB->SetVisibility(ESlateVisibility::Hidden);\n\n\t\t\t\tActiveSequenceIndex += 1;\n\t\t\t\tActiveSequenceSubIndex = 0;\n\t\t\t\tHideUnusedTextBlocks(ActiveSequenceIndex);\n\n\t\t\t\tfor (int32 i = 0; i < EndingLogic[ActiveSequenceIndex].Texts.Num(); ++i)\n\t\t\t\t\tif (URichTextBlock* TextBlock = GetTextBlock(ActiveSequenceIndex, i))\n\t\t\t\t\t{\n\t\t\t\t\t\tTextBlock->SetText(EndingLogic[ActiveSequenceIndex].Texts[i]);\n\t\t\t\t\t\tSetParentOffset(TextBlock, EndingLogic[ActiveSequenceIndex].TextOffset);\n\t\t\t\t\t\tTextBlock->SetVisibility(ESlateVisibility::Visible);\n\t\t\t\t\t\tTextBlock->SetRenderOpacity(0.0f);\n\t\t\t\t\t}\n\n\t\t\t\tbFadeImage = EndingLogic[ActiveSequenceIndex].ImageName != EndingLogic[ActiveSequenceIndex - 1].ImageName;\n\t\t\t\tEndingUIState = ESoEndingUIState::EntryFadeOutPostWait;\n\t\t\t\tFadeCounter = bFadeImage ? WaitAfterFadeOutDuration : WaitAfterTextFadeOutDuration;\n\t\t\t}\n\t\t}\n\t\tbreak;\n\n\t\tcase ESoEndingUIState::EntryFadeOutPostWait:\n\t\t\tFadeCounter -= DeltaSeconds;\n\t\t\tif (FadeCounter < 0.0f)\n\t\t\t{\n\t\t\t\tif (bFadeImage)\n\t\t\t\t{\n\t\t\t\t\tif (UImage* Image = GetImage(EndingLogic[ActiveSequenceIndex].ImageName))\n\t\t\t\t\t{\n\t\t\t\t\t\tImage->SetVisibility(ESlateVisibility::Visible);\n\t\t\t\t\t\t// SetImageRenderOpacity(Image, 0.0f);\n\t\t\t\t\t\tSetImageMaterialParams(Image, EndingLogic[ActiveSequenceIndex].ImageName, true);\n\t\t\t\t\t}\n\t\t\t\t\tEndingUIState = ESoEndingUIState::EntryFadeIn;\n\t\t\t\t\tFadeCounter = 0.0f;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tEndingUIState = ESoEndingUIState::EntryUpdate;\n\t\t\t\t\tFadeCounter = FadeInDurationFirstText;\n\t\t\t\t\tPlayVO(ActiveSequenceIndex, 0);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\n\n\t\tcase ESoEndingUIState::EntryFadeIn:\n\t\t{\n\t\t\tFadeCounter += DeltaSeconds;\n\n\t\t\tconst float NewRenderOpacity = USoMathHelper::Interpolate(0.0f,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t  1.0f,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t  FMath::Clamp(FadeCounter / FadeInDurationImage, 0.0f, 1.0f),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t  bFadeImage ? FadeInMethodImage : FadeInMethod);\n\t\t\tSetImageRenderOpacity(ActiveSequenceIndex, NewRenderOpacity);\n\t\t\tif (FadeCounter > FadeInDurationImage)\n\t\t\t{\n\t\t\t\tEndingUIState = ESoEndingUIState::EntryUpdateWait;\n\t\t\t\tFadeCounter = WaitAfterImgFadeDuration;\n\t\t\t}\n\t\t}\n\t\tbreak;\n\n\t\tcase ESoEndingUIState::EntryUpdateWait:\n\t\t{\n\t\t\tFadeCounter -= DeltaSeconds;\n\t\t\tif (FadeCounter < 0.0f)\n\t\t\t{\n\t\t\t\tEndingUIState = ESoEndingUIState::EntryUpdate;\n\t\t\t\tFadeCounter = ActiveSequenceSubIndex == 0 ? FadeInDurationFirstText : FadeInDurationRestText;\n\t\t\t\tif (URichTextBlock* TextBlock = GetTextBlock(ConstructTextBlockName(EndingLogic[ActiveSequenceIndex].TextBoxName, ActiveSequenceSubIndex)))\n\t\t\t\t{\n\t\t\t\t\tif (EndingLogic[ActiveSequenceIndex].Texts.IsValidIndex(ActiveSequenceSubIndex))\n\t\t\t\t\t{\n\t\t\t\t\t\tTextBlock->SetText(EndingLogic[ActiveSequenceIndex].Texts[ActiveSequenceSubIndex]);\n\t\t\t\t\t\tSetParentOffset(TextBlock, EndingLogic[ActiveSequenceIndex].TextOffset);\n\t\t\t\t\t}\n\n\t\t\t\t\tTextBlock->SetVisibility(ESlateVisibility::Visible);\n\t\t\t\t\tTextBlock->SetRenderOpacity(0.0f);\n\n\t\t\t\t\tPlayVO(ActiveSequenceIndex, ActiveSequenceSubIndex);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tbreak;\n\n\t\tcase ESoEndingUIState::EntryUpdate:\n\t\t{\n\t\t\tFadeCounter -= DeltaSeconds;\n\t\t\tconst float FadeDuration = ActiveSequenceSubIndex == 0 ? FadeInDurationFirstText : FadeInDurationRestText;\n\t\t\tconst float NewRenderOpacity = USoMathHelper::Interpolate(0.0f, 1.0f, FMath::Clamp(1.0f - (FadeCounter / FadeDuration), 0.0f, 1.0f), FadeInMethod);\n\t\t\tSetTextBoxRenderOpacity(ActiveSequenceIndex, ActiveSequenceSubIndex, NewRenderOpacity);\n\t\t\tif (FadeCounter < 0.0f && !IsWaitingForVO())\n\t\t\t{\n\t\t\t\tif (ActiveSequenceSubIndex == 0 || ActiveSequenceSubIndex == EndingLogic[ActiveSequenceIndex].Texts.Num() - 1)\n\t\t\t\t{\n\t\t\t\t\tEndingUIState = ESoEndingUIState::Idle;\n\t\t\t\t\tActiveSequenceSubIndex += 1;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tEndingUIState = ESoEndingUIState::EntryUpdateWait;\n\t\t\t\t\tActiveSequenceSubIndex += 1;\n\t\t\t\t\tFadeCounter = WaitBetweenTexts;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tbreak;\n\n\t\tdefault:\n\t\t\tbreak;\n\t}\n\n\treturn bShouldBeOpen;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUImage* USoUIEnding::GetImage(FName Name) const\n{\n\tif (Name == NAME_None || RootCanvas == nullptr)\n\t\treturn nullptr;\n\n\treturn GetWidgetRecursive<UImage>(RootCanvas, Name);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nURichTextBlock* USoUIEnding::GetTextBlock(FName Name) const\n{\n\tif (Name == NAME_None || RootCanvas == nullptr)\n\t\treturn nullptr;\n\n\treturn GetWidgetRecursive<URichTextBlock>(RootCanvas, Name);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nURichTextBlock* USoUIEnding::GetTextBlock(int32 SequenceIndex, int32 SubIndex) const\n{\n\tif (EndingLogic.IsValidIndex(SequenceIndex))\n\t\treturn GetTextBlock(ConstructTextBlockName(EndingLogic[SequenceIndex].TextBoxName, SubIndex));\n\n\treturn nullptr;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIEnding::RefreshPreview(float Opacity)\n{\n\tHideAllTextBlocks();\n\n\t// Set Visibility\n\tfor (int32 i = 0; i < EndingLogic.Num(); ++i)\n\t{\n\t\tif (UImage* Img = GetImage(EndingLogic[i].ImageName))\n\t\t\tImg->SetVisibility(ESlateVisibility::Collapsed);\n\n\t\tfor (int32 j = 0; j < EndingLogic[i].Texts.Num(); ++j)\n\t\t\tif (URichTextBlock* TextBlock = GetTextBlock(ConstructTextBlockName(EndingLogic[i].TextBoxName, j)))\n\t\t\t\t\tTextBlock->SetVisibility(ESlateVisibility::Collapsed);\n\t}\n\n\tif (EndingLogic.IsValidIndex(ActiveSequenceIndex))\n\t{\n\t\tif (UImage* Img = GetImage(EndingLogic[ActiveSequenceIndex].ImageName))\n\t\t{\n\t\t\tImg->SetVisibility(ESlateVisibility::Visible);\n\t\t\tSetImageRenderOpacity(Img, Opacity);\n\t\t}\n\n\t\tfor (int32 j = 0; j < EndingLogic[ActiveSequenceIndex].Texts.Num(); ++j)\n\t\t{\n\t\t\tif (URichTextBlock* TextBlock = GetTextBlock(ConstructTextBlockName(EndingLogic[ActiveSequenceIndex].TextBoxName, j)))\n\t\t\t{\n\t\t\t\tTextBlock->SetVisibility(ESlateVisibility::Visible);\n\t\t\t\tTextBlock->SetText(EndingLogic[ActiveSequenceIndex].Texts[j]);\n\t\t\t\tSetParentOffset(TextBlock, EndingLogic[ActiveSequenceIndex].TextOffset);\n\t\t\t\tTextBlock->SetRenderOpacity(Opacity);\n\t\t\t}\n\t\t}\n\t}\n\n\tHideUnusedTextBlocks(ActiveSequenceIndex);\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFName USoUIEnding::ConstructTextBlockName(FName Name, int32 Index) const\n{\n\treturn FName(*(Name.ToString() + FString::FromInt(Index)));\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIEnding::SetImageRenderOpacity(int32 SequenceIndex, float Opacity)\n{\n\tif (UImage* Img = GetImage(EndingLogic[ActiveSequenceIndex].ImageName))\n\t\tSetImageRenderOpacity(Img, Opacity);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIEnding::SetImageRenderOpacity(UImage* Image, float Opacity)\n{\n\tif (Image == nullptr)\n\t\treturn;\n\n\tif (UMaterialInstanceDynamic* DynamicMaterial = Image->GetDynamicMaterial())\n\t\tDynamicMaterial->SetScalarParameterValue(FName(\"FadeStr\"), Opacity);\n\telse\n\t\tImage->SetRenderOpacity(Opacity);\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIEnding::SetImageMaterialParams(UImage* Image, FName ImageName, bool bFadeIn)\n{\n\tif (Image == nullptr)\n\t\treturn;\n\n\tif (bFadeIn)\n\t{\n\t\tif (const FSoUIImageFadeData* FadeData = ImageFadeData.Find(ImageName))\n\t\t{\n\t\t\tSetImageMaterial(Image, FadeData->FadeInMaterial, ImageName, 0.0f);\n\n\t\t\tif (UMaterialInstanceDynamic* DynamicMaterial = Image->GetDynamicMaterial())\n\t\t\t\tDynamicMaterial->SetScalarParameterValue(FName(\"Rotation\"), FadeData->FadeInRotation);\n\t\t}\n\t\telse\n\t\t\tSetImageMaterial(Image, ImgMaterial, ImageName, 0.0f);\n\t}\n\telse\n\t{\n\t\tSetImageMaterial(Image, FadeOutMaterial, ImageName, 0.0f);\n\t}\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIEnding::SetImageMaterial(UImage* Image, UMaterialInterface* Material, FName ImageName, float Opacity)\n{\n\tImage->SetBrushFromMaterial(Material);\n\tif (UMaterialInstanceDynamic* DynamicMaterial = Image->GetDynamicMaterial())\n\t{\n\t\tDynamicMaterial->SetTextureParameterValue(FName(\"Texture\"), TextureMap[ImageName]);\n\t\tDynamicMaterial->SetScalarParameterValue(FName(\"FadeStr\"), Opacity);\n\t}\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIEnding::SetTextBoxRenderOpacity(int32 SequenceIndex, int32 SubIndex, float Opacity)\n{\n\tif (URichTextBlock* TextBlock = GetTextBlock(ConstructTextBlockName(EndingLogic[SequenceIndex].TextBoxName, SubIndex)))\n\t\tTextBlock->SetRenderOpacity(Opacity);\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIEnding::SetParentOffset(UWidget* Widget, const FVector2D& Offset)\n{\n\tif (Widget != nullptr && Widget->GetParent() != nullptr)\n\t\tWidget->GetParent()->SetRenderTranslation(Offset);\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIEnding::HideUnusedTextBlocks(int32 SequenceIndex)\n{\n\tif (EndingLogic.IsValidIndex(SequenceIndex))\n\t{\n\t\tint32 i = EndingLogic[SequenceIndex].Texts.Num();\n\t\twhile (URichTextBlock* TextBlock = GetTextBlock(SequenceIndex, i))\n\t\t{\n\t\t\tTextBlock->SetVisibility(ESlateVisibility::Collapsed);\n\t\t\t++i;\n\t\t}\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIEnding::HideAllTextBlocks()\n{\n\tfor (int32 SequenceIndex = 0; SequenceIndex < EndingLogic.Num(); ++SequenceIndex)\n\t{\n\t\tint32 i = 0;\n\t\twhile (URichTextBlock* TextBlock = GetTextBlock(SequenceIndex, i))\n\t\t{\n\t\t\tTextBlock->SetVisibility(ESlateVisibility::Collapsed);\n\t\t\t++i;\n\t\t}\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIEnding::PlayVO(int32 SequenceIndex, int32 SubIndex)\n{\n\tif (EndingLogic.IsValidIndex(SequenceIndex))\n\t{\n\t\tif (EndingLogic[SequenceIndex].VOs.IsValidIndex(SubIndex))\n\t\t{\n\t\t\tif (UFMODEvent* Event = EndingLogic[SequenceIndex].VOs[SubIndex])\n\t\t\t{\n\t\t\t\tUSoAudioManager::PlaySound2D(this, Event, true);\n\t\t\t\tVOBlockTime = GetWorld()->GetTimeSeconds() + USoAudioManager::GetSoundLengthSeconds(Event);\n\t\t\t}\n\t\t}\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoUIEnding::IsWaitingForVO() const\n{\n\treturn VOBlockTime > GetWorld()->GetTimeSeconds();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIEnding::OnFinished()\n{\n\tif (Credits != nullptr)\n\t{\n\t\tCredits->FadeIn(false);\n\t}\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIEnding::OnCreditsFinished()\n{\n\tUSoGameInstance::GetInstance(this)->TeleportToMainMenu(false);\n}\n"
  },
  {
    "path": "Source/SOrb/UI/InGame/SoUIEnding.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#pragma once\n\n#include \"CoreMinimal.h\"\n#include \"Components/PanelWidget.h\"\n\n#include \"UI/InGame/SoUIGameActivity.h\"\n#include \"Basic/Helpers/SoMathHelper.h\"\n\n#include \"SoUIEnding.generated.h\"\n\nclass UFMODEvent;\nclass UImage;\nclass URichTextBlock;\nclass UCanvasPanel;\nclass USoUICredits;\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUSTRUCT(BlueprintType, Blueprintable)\nstruct FSoUIEndingEntry\n{\n\tGENERATED_USTRUCT_BODY()\n\npublic:\n\tUPROPERTY(EditAnywhere, BlueprintReadOnly)\n\tFName ImageName;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadOnly)\n\tFName TextBoxName;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadOnly)\n\tFVector2D TextOffset = FVector2D(0.0f, 0.0f);\n\n\tUPROPERTY(EditAnywhere, BlueprintReadOnly, Meta = (MultiLine = true))\n\tTArray<FText> Texts;\n\n\t/** valid VOs should match the Texts index, nullptr is used for padding */\n\tUPROPERTY(EditAnywhere, BlueprintReadOnly, Meta = (MultiLine = true))\n\tTArray<UFMODEvent*> VOs;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadOnly)\n\tUFMODEvent* Music;\n};\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUSTRUCT(BlueprintType, Blueprintable)\nstruct FSoUIImageFadeData\n{\n\tGENERATED_USTRUCT_BODY()\n\npublic:\n\tUPROPERTY(EditAnywhere, BlueprintReadOnly)\n\tUMaterialInstance* FadeInMaterial;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadOnly)\n\tfloat FadeInRotation = 0.0f;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadOnly)\n\tfloat FadeOutRotation = 0.0f;\n};\n\n\nUENUM()\nenum class ESoEndingUIState : uint8\n{\n\tIdle = 0\t\t\t\tUMETA(DisplayName = \"Idle\"),\n\n\tEntryFadeIn\t\t\t\tUMETA(DisplayName = \"EntryFadeIn\"),\n\tEntryFadeOut\t\t\tUMETA(DisplayName = \"EntryFadeOut\"),\n\tEntryFadeOutPostWait\tUMETA(DisplayName = \"EntryFadeOutPostWait\"),\n\n\tEntryUpdate\t\t\t\tUMETA(DisplayName = \"EntryUpdate\"),\n\tEntryUpdateWait\t\t\tUMETA(DisplayName = \"EntryUpdateWait\"),\n\n\tFadeIn\t\t\t\t\tUMETA(DisplayName = \"FadeIn\"),\n\tFinished\t\t\t\tUMETA(DisplayName = \"Finished\")\n};\n\n\nUCLASS()\nclass SORB_API USoUIEnding : public USoInGameUIActivity\n{\n\tGENERATED_BODY()\n\nprotected:\n#if WITH_EDITOR\n\tvoid PreSave(const ITargetPlatform* TargetPlatform) override;\n#endif // WITH_EDITOR\n\n\t// Begin UUserWidget Interface\n\tvoid NativeConstruct() override;\n\tvoid NativeDestruct() override;\n\t// End UUserWidget Interface\n\n\tbool SetInGameActivityEnabled_Implementation(UObject* Source, bool bEnable) override;\n\tbool HandleCommand_Implementation(ESoUICommand Command) override;\n\tbool Update_Implementation(float DeltaSeconds) override;\n\nprotected:\n\n\tUFUNCTION(BlueprintImplementableEvent)\n\tvoid StartFadeInBP();\n\n\tvoid OnFinished();\n\n\tUFUNCTION()\n\tvoid OnCreditsFinished();\n\n\n\tUFUNCTION(BlueprintPure)\n\tUImage* GetImage(FName Name) const;\n\n\tUFUNCTION(BlueprintPure)\n\tURichTextBlock* GetTextBlock(FName Name) const;\n\n\tURichTextBlock* GetTextBlock(int32 SequenceIndex, int32 SubIndex) const;\n\n\tUFUNCTION(BlueprintCallable)\n\tvoid RefreshPreview(float Opacity = 1.0f);\n\n\n\tFName ConstructTextBlockName(FName Name, int32 Index) const;\n\n\ttemplate <typename WidgetType>\n\tWidgetType* GetWidgetRecursive(UPanelWidget* Parent, FName Name) const;\n\n\n\tvoid SetImageRenderOpacity(int32 SequenceIndex, float Opacity);\n\tvoid SetImageRenderOpacity(UImage* Image, float Opacity);\n\tvoid SetTextBoxRenderOpacity(int32 SequenceIndex, int32 SubIndex, float Opacity);\n\n\tvoid SetImageMaterialParams(UImage* Image, FName ImageName, bool bFadeIn);\n\tvoid SetImageMaterial(UImage* Image, UMaterialInterface* Material, FName ImageName, float Opacity);\n\n\tvoid SetParentOffset(UWidget* Widget, const FVector2D& Offset);\n\n\tvoid HideUnusedTextBlocks(int32 SequenceIndex);\n\tvoid HideAllTextBlocks();\n\n\tvoid PlayVO(int32 SequenceIndex, int32 SubIndex);\n\tbool IsWaitingForVO() const;\n\n\tvirtual void UpdateLocalizedFields();\n\nprotected:\n\n\tfloat GetFadeOutDuration() const { return bFadeImage ? FadeOutDuration : FadeOutDurationNoImage; }\n\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\", meta = (BindWidget))\n\tUCanvasPanel* RootCanvas;\n\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\", meta = (BindWidget))\n\tUSoUICredits* Credits;\n\n\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere, Category = \">Ending\")\n\tUMaterial* ImgMaterial;\n\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere, Category = \">Ending\")\n\tUMaterial* FadeOutMaterial;\n\n\n\tUPROPERTY(EditAnywhere, BlueprintReadOnly, Category = \">Ending\")\n\tint32 ActiveSequenceIndex = 0;\n\n\tint32 ActiveSequenceSubIndex = 0;\n\n\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere, Category = \">Ending\")\n\tTArray<FSoUIEndingEntry> EndingLogic;\n\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere, Category = \">Ending\")\n\tTMap<FName, FSoUIImageFadeData> ImageFadeData;\n\n\tTMap<FName, UTexture*> TextureMap;\n\n\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere, Category = \">Ending\")\n\tfloat FadeOutDuration = 1.5f;\n\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere, Category = \">Ending\")\n\tfloat FadeOutDurationNoImage = 0.4f;\n\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere, Category = \">Ending\")\n\tESoInterpolationMethod FadeOutMethod = ESoInterpolationMethod::EIM_SmoothStep;\n\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere, Category = \">Ending\")\n\tESoInterpolationMethod FadeOutMethodImage = ESoInterpolationMethod::EIM_Acceleration;\n\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere, Category = \">Ending\")\n\tfloat FadeInDurationImage = 1.5f;\n\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere, Category = \">Ending\")\n\tfloat FadeInDurationFirstText = 0.5f;\n\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere, Category = \">Ending\")\n\tfloat FadeInDurationRestText = 0.6f;\n\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere, Category = \">Ending\")\n\tfloat WaitAfterImgFadeDuration = 0.3f;\n\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere, Category = \">Ending\")\n\tfloat WaitBetweenTexts = 0.6f;\n\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere, Category = \">Ending\")\n\tfloat WaitAfterFadeOutDuration = 0.0f;\n\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere, Category = \">Ending\")\n\tfloat WaitAfterTextFadeOutDuration = 0.2f;\n\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere, Category = \">Ending\")\n\tESoInterpolationMethod FadeInMethod = ESoInterpolationMethod::EIM_SmoothStep;\n\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere, Category = \">Ending\")\n\tESoInterpolationMethod FadeInMethodImage = ESoInterpolationMethod::EIM_Deceleration;\n\n\tfloat VOBlockTime = -1.0f;\n\n\tfloat FadeCounter;\n\n\n\tESoEndingUIState EndingUIState = ESoEndingUIState::Idle;\n\n\tUPROPERTY(BlueprintReadWrite, Category = \">Ending\")\n\tbool bShouldBeOpen = false;\n\n\tbool bFadeImage = false;\n};\n\n\ntemplate <typename WidgetType>\nWidgetType* USoUIEnding::GetWidgetRecursive(UPanelWidget* Parent, FName Name) const\n{\n\tif (Name == NAME_None || Parent == nullptr)\n\t\treturn nullptr;\n\n\tfor (int32 i = 0; i < Parent->GetChildrenCount(); ++i)\n\t{\n\t\tif (WidgetType* ChildWidget = Cast<WidgetType>(Parent->GetChildAt(i)))\n\t\t{\n\t\t\tif (ChildWidget->GetFName() == Name)\n\t\t\t\treturn ChildWidget;\n\t\t}\n\t\telse if (UPanelWidget* Panel = Cast<UPanelWidget>(Parent->GetChildAt(i)))\n\t\t{\n\t\t\tif (WidgetType* RecursiveWidget = GetWidgetRecursive<WidgetType>(Panel, Name))\n\t\t\t\treturn RecursiveWidget;\n\t\t}\n\t}\n\n\treturn nullptr;\n}\n"
  },
  {
    "path": "Source/SOrb/UI/InGame/SoUIGameActivity.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#include \"SoUIGameActivity.h\"\n\n#include \"Basic/Helpers/SoStaticHelper.h\"\n#include \"Character/SoCharacter.h\"\n#include \"Character/SoCharStates/SoAInUI.h\"\n\nDEFINE_LOG_CATEGORY(LogSoUIActivity);\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUSoInGameUIActivity::USoInGameUIActivity(const FObjectInitializer& PCIP)\n\t: Super(PCIP)\n{\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoInGameUIActivity::NativeConstruct()\n{\n\tSuper::NativeConstruct();\n\n\tASoCharacter* SoCharacter = USoStaticHelper::GetPlayerCharacterAsSoCharacter(this);\n\tif (bRegisterAsActivity && SoCharacter != nullptr && SoCharacter->SoAInUI != nullptr)\n\t\tSoCharacter->SoAInUI->RegisterInGameActivity(this);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoInGameUIActivity::NativeDestruct()\n{\n\tSuper::NativeDestruct();\n\n\tASoCharacter* SoCharacter = USoStaticHelper::GetPlayerCharacterAsSoCharacter(this);\n\tif (SoCharacter != nullptr && SoCharacter->SoAInUI != nullptr)\n\t\tSoCharacter->SoAInUI->UnregisterInGameActivity(this);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoInGameUIActivity::SetInGameActivityEnabled_Implementation(UObject* Source, bool bEnable)\n{\n\treturn false;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoInGameUIActivity::HandleCommand_Implementation(ESoUICommand Command)\n{\n\treturn false;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoInGameUIActivity::Update_Implementation(float DeltaSeconds)\n{\n\treturn false;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoInGameUIActivity::IsOpened_Implementation() const\n{\n\treturn false;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoInGameUIActivity::ShouldHideUIElements_Implementation() const\n{\n\treturn false;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoInGameUIActivity::ShouldKeepMusicFromPreviousUIActivity_Implementation() const\n{\n\treturn false;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoInGameUIActivity::IsActiveInPausedGame_Implementation() const\n{\n\treturn false;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoInGameUIActivity::IsActiveInDilatedTime_Implementation(float CurrentTimeDilation) const\n{\n\treturn false;\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoInGameUIActivity::ShouldParentIgnoreTheNextMenuBack_Implementation() const\n{\n\treturn false;\n}\n"
  },
  {
    "path": "Source/SOrb/UI/InGame/SoUIGameActivity.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#pragma once\n\n#include \"CoreMinimal.h\"\n#include \"Blueprint/UserWidget.h\"\n#include \"UI/General/SoUITypes.h\"\n\n#include \"SoUIGameActivity.generated.h\"\n\nDECLARE_LOG_CATEGORY_EXTERN(LogSoUIActivity, Log, All);\n\n/**\n *  Base class for Character/User input related UI logic / activities (character panels, looting, puzzle control window, etc.)\n *  USoAInUI character activity handles these, any child class can only be active while the character is in the USoAInUI state\n *  It could be an interface but then we could not list the implementations via TSubclassOf<>\n */\nUCLASS(HideCategories = (Navigation), AutoCollapseCategories = (Performance, Clipping, Interaction, Input))\nclass SORB_API USoInGameUIActivity : public UUserWidget\n{\n\tGENERATED_BODY()\n\npublic:\n\n\tUSoInGameUIActivity(const FObjectInitializer& PCIP);\n\n\t/**\n\t *  Tries to activate/deactivate the object\n\t *  Activation may fail if the Source is invalid\n\t *  or the widget does not intend to be activated based on the source right now\n\t *  @param Source: optional, the object responsible for the control (e.g. the chest the character tries to loot)\n\t *  @param bEnable: whether enable or disable is requested (character is interrupted -> disable call)\n\t *  @Return: if activated after the call\n\t */\n\tUFUNCTION(BlueprintNativeEvent, BlueprintCallable, Category = UI)\n\tbool SetInGameActivityEnabled(UObject* Source, bool bEnable);\n\n\t/**\n\t *  Input handling - should be only called on active InGameUIActivity\n\t *  @Return: true if the widget handled the command or it does not want to let others handle it\n\t */\n\tUFUNCTION(BlueprintNativeEvent, BlueprintCallable, Category = UI)\n\tbool HandleCommand(ESoUICommand Command);\n\n\t/**\n\t *  Frame update - should be only called on active InGameUIActivity\n\t *  @Return: if the widget is still active\n\t */\n\tUFUNCTION(BlueprintNativeEvent, BlueprintCallable, Category = UI)\n\tbool Update(float DeltaSeconds);\n\n\tUFUNCTION(BlueprintNativeEvent, BlueprintPure, Category = UI)\n\tbool IsOpened() const;\n\n\tUFUNCTION(BlueprintNativeEvent, BlueprintPure, Category = UI)\n\tbool ShouldHideUIElements() const;\n\n\tUFUNCTION(BlueprintNativeEvent, BlueprintPure, Category = UI)\n\tbool ShouldKeepMusicFromPreviousUIActivity() const;\n\n\t// True if this activity can be used in paused mode\n\tUFUNCTION(BlueprintNativeEvent, BlueprintPure, Category = UI)\n\tbool IsActiveInPausedGame() const;\n\n\t// True if this activity with the current CurrentTimeDilation\n\tUFUNCTION(BlueprintNativeEvent, BlueprintPure, Category = UI)\n\tbool IsActiveInDilatedTime(float CurrentTimeDilation) const;\n\n\t// HACK: Fix me, because ActionBack conflicts with MenuBack\n\t// Hack similar to the bIgnoredFirstUICommand in USoUISpellCastSwitch\n\tUFUNCTION(BlueprintNativeEvent, BlueprintPure, Category = UI)\n\tbool ShouldParentIgnoreTheNextMenuBack() const;\n\n\tUFUNCTION(BlueprintPure, Category = UI)\n\tbool IsArmedStateAllowedOnLeave() const { return bArmedStateAllowedOnLeave; }\n\nprotected:\n\tvirtual void NativeConstruct() override;\n\tvirtual void NativeDestruct() override;\n\nprotected:\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = \">UIActivity\")\n\tbool bRegisterAsActivity = true;\n\n\tUPROPERTY(EditAnywhere, Category = \">UIActivity\")\n\tbool bArmedStateAllowedOnLeave = true;\n};\n"
  },
  {
    "path": "Source/SOrb/UI/InGame/SoUIInGame.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#include \"SoUIInGame.h\"\n\n#include \"Blueprint/UserWidget.h\"\n#include \"Basic/Helpers/SoStaticHelper.h\"\n\nUUserWidget* USoUIInGame::GetNotUsedWidget(TSubclassOf<UUserWidget> Class)\n{\n\tFSoUIWidgetArray* WidgetArray = WidgetStorage.Find(Class);\n\n\tif (WidgetArray == nullptr)\n\t\tWidgetArray = &WidgetStorage.Add(Class);\n\n\tfor (UUserWidget* Widget : WidgetArray->Widgets)\n\t\tif (!Widget->IsVisible())\n\t\t\treturn Widget;\n\n\tUUserWidget* Widget = CreateWidget(USoStaticHelper::GetPlayerController(this), Class);\n\tif (Widget != nullptr)\n\t{\n\t\tWidget->AddToViewport();\n\t\tWidgetArray->Widgets.Add(Widget);\n\t}\n\n\treturn Widget;\n}\n"
  },
  {
    "path": "Source/SOrb/UI/InGame/SoUIInGame.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#pragma once\n\n#include \"CoreMinimal.h\"\n#include \"Blueprint/UserWidget.h\"\n#include \"UI/General/SoUITypes.h\"\n\n#include \"SoUIInGame.generated.h\"\n\nclass USoUICharacterPanels;\nclass USoInGameUIActivity;\nclass USoUIDialoguePanel;\n\n\n/**\n *\n */\nUCLASS()\nclass SORB_API USoUIInGame : public UUserWidget\n{\n\tGENERATED_BODY()\n\nprotected:\n\tUFUNCTION(BlueprintCallable, Category = UI)\n\tUUserWidget* GetNotUsedWidget(TSubclassOf<UUserWidget> Class);\n\nprotected:\n\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\", meta = (BindWidget))\n\tUSoUICharacterPanels* CharacterPanels = nullptr;\n\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\", meta = (BindWidget))\n\tUSoInGameUIActivity* ItemContainer = nullptr;\n\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\", meta = (BindWidget))\n\tUUserWidget* Book = nullptr;\n\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\", meta = (BindWidget))\n\tUSoUIDialoguePanel* DialoguePanel = nullptr;\n\n\tbool bUIVisible = true;\n\n\n\tUPROPERTY()\n\tTMap<TSubclassOf<UUserWidget>, FSoUIWidgetArray> WidgetStorage;\n};\n"
  },
  {
    "path": "Source/SOrb/UI/InGame/SoUINote.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n\n#include \"SoUINote.h\"\n\n"
  },
  {
    "path": "Source/SOrb/UI/InGame/SoUINote.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#pragma once\n\n#include \"CoreMinimal.h\"\n#include \"Blueprint/UserWidget.h\"\n#include \"SoUINote.generated.h\"\n\n/**\n *\n */\nUCLASS(HideCategories = (Navigation), AutoCollapseCategories = (Performance, Clipping, Interaction, Input))\nclass SORB_API USoUINote : public UUserWidget\n{\n\tGENERATED_BODY()\n\npublic:\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere, Category = \">Note\")\n\tFName ID;\n};\n"
  },
  {
    "path": "Source/SOrb/UI/InGame/SoUIRestPanel.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#include \"SoUIRestPanel.h\"\n\n#include \"Blueprint/UserWidget.h\"\n#include \"Animation/WidgetAnimation.h\"\n#include \"Components/Image.h\"\n#include \"FMODEvent.h\"\n\n#include \"DlgDialogueParticipant.h\"\n\n#include \"Character/SoCharacter.h\"\n#include \"Basic/SoGameInstance.h\"\n#include \"Basic/SoAudioManager.h\"\n#include \"Basic/Helpers/SoMathHelper.h\"\n#include \"Basic/Helpers/SoStaticHelper.h\"\n#include \"Dialogues/SoUIDialogueChoiceBox.h\"\n#include \"UI/InGame/Spells/SoUISpellSelection.h\"\n#include \"UI/SoUIHelper.h\"\n\nDEFINE_LOG_CATEGORY_STATIC(LogSoUIRestPanel, All, All);\n\n\nconst FName USoUIRestPanel::AnimNameFadeIn = FName(\"BackgroundFadeIn\");\nconst FName USoUIRestPanel::AnimNameFadeOut = FName(\"BackgroundFadeOut\");\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUSoUIRestPanel::USoUIRestPanel(const FObjectInitializer& PCIP) :\n\tSuper(PCIP)\n{\n\tOptionTexts.SetNum(5);\n\tOptionPositions.SetNum(5);\n}\n\n\n#if WITH_EDITOR\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// Called when the game starts or when spawned\nvoid USoUIRestPanel::PreSave(const ITargetPlatform* TargetPlatform)\n{\n\tfor (FSoUIMusicEntry& Entry : MusicMap)\n\t\tif (Entry.Music != nullptr)\n\t\t\tEntry.DisplayName = FInternationalization::ForUseOnlyByLocMacroAndGraphNodeTextLiterals_CreateText(*Entry.DisplayName.ToString(),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tTEXT(\"MusicName\"),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t*(Entry.Music->GetName() + \"_display_name\"));\n\tSuper::PreSave(TargetPlatform);\n}\n\n#endif\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIRestPanel::NativeConstruct()\n{\n\tSuper::NativeConstruct();\n\tSetVisibility(ESlateVisibility::Collapsed);\n\tUSoStaticHelper::BuildAnimationMap(this, AnimationMap);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoUIRestPanel::SetInGameActivityEnabled_Implementation(UObject* Source, bool bEnable)\n{\n\tif (bEnable)\n\t{\n\t\tif (bOpened)\n\t\t\treturn true;\n\n\t\tFadeIn();\n\t}\n\telse\n\t{\n\t\tif (bOpened)\n\t\t{\n\t\t\tbOpened = false;\n\t\t\tFadeOut();\n\t\t}\n\t}\n\n\treturn bOpened;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoUIRestPanel::HandleCommand_Implementation(ESoUICommand Command)\n{\n\tCommand = USoUIHelper::TryTranslateMenuCommandDirectionToGame(Command);\n\tif (SoPanelState == ESoRestPanelState::ERPS_SpellSelection)\n\t{\n\t\tif (Command == ESoUICommand::EUC_MainMenuBack)\n\t\t{\n\t\t\tSpellSelection->SetInGameActivityEnabled(this, false);\n\t\t\tSoPanelState = ESoRestPanelState::ERPS_WaitForInput;\n\t\t}\n\t\telse\n\t\t\tSpellSelection->HandleCommand(Command);\n\n\t\treturn true;\n\t}\n\n\tif (Command == ESoUICommand::EUC_MainMenuBack && SoPanelState != ESoRestPanelState::ERPS_FadeOut)\n\t{\n\t\tbOpened = false;\n\t\tFadeOut();\n\t\treturn true;\n\t}\n\n\tif (SoPanelState != ESoRestPanelState::ERPS_WaitForInput)\n\t\treturn true;\n\n\tint32 Delta = 0;\n\tswitch (Command)\n\t{\n\t\tcase ESoUICommand::EUC_MainMenuEnter:\n\t\t\tOnEnterOption();\n\t\t\tUSoAudioManager::PlaySound2D(this, SFXOptionSelected);\n\t\t\tbreak;\n\n\t\tcase ESoUICommand::EUC_Left:\n\t\tcase ESoUICommand::EUC_Up:\n\t\t\tDelta = -1;\n\t\t\tbreak;\n\n\t\tcase ESoUICommand::EUC_Right:\n\t\tcase ESoUICommand::EUC_Down:\n\t\t\tDelta = 1;\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tbreak;\n\t}\n\n\tif (Delta != 0)\n\t{\n\t\tconst int32 OldIndex = ActiveOptionIndex;\n\t\tconst int32 NewIndex = USoMathHelper::WrapIndexAround(ActiveOptionIndex + Delta, PlayerChoiceTextBoxArray.Num());\n\t\tPlayerChoiceTextBoxArray[OldIndex]->SetHighlighted(false);\n\t\tPlayerChoiceTextBoxArray[NewIndex]->SetHighlighted(true);\n\t\tSoPanelState = ESoRestPanelState::ERPS_Change;\n\t\tActiveOptionIndex = NewIndex;\n\t\tOnSelectedOptionChange(OldIndex, NewIndex);\n\n\n\t\tbFirstActive = !bFirstActive;\n\t\tBlendValue = 0.0f;\n\t\tif (BallImages.IsValidIndex(NewIndex))\n\t\t\t(bFirstActive ? Ball0 : Ball1)->SetBrushFromTexture(BallImages[NewIndex]);\n\n\t\tUSoAudioManager::PlaySound2D(this, SFXOptionChange);\n\t}\n\n\treturn true;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoUIRestPanel::Update_Implementation(float DeltaSeconds)\n{\n\tif (BlendValue < 1.0f)\n\t{\n\t\tBlendValue += DeltaSeconds * BlendSpeedMultiplier;\n\n\t\tBall0->SetRenderOpacity(bFirstActive ? BlendValue : 1.0f - BlendValue);\n\t\tBall1->SetRenderOpacity(bFirstActive ? 1.0f - BlendValue : BlendValue);\n\t}\n\n\tswitch (SoPanelState)\n\t{\n\t\tcase ESoRestPanelState::ERPS_FadeIn:\n\t\t\tif (!IsPlayingAnimation())\n\t\t\t\tSoPanelState = ESoRestPanelState::ERPS_WaitForInput;\n\t\t\tbreak;\n\n\t\tcase ESoRestPanelState::ERPS_Change:\n\t\t\tif (!IsAnyTextBoxAnimated())\n\t\t\t\tSoPanelState = ESoRestPanelState::ERPS_WaitForInput;\n\t\t\tbreak;\n\n\t\tcase ESoRestPanelState::ERPS_FadeOut:\n\t\t{\n\t\t\tconst bool bStillIn = IsPlayingAnimation();\n\t\t\tif (!bStillIn)\n\t\t\t{\n\t\t\t\tSetVisibility(ESlateVisibility::Collapsed);\n\t\t\t\tbOpened = false;\n\n\t\t\t}\n\t\t\treturn bStillIn;\n\t\t}\n\n\t\tdefault:\n\t\t\tbreak;\n\t}\n\n\treturn true;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIRestPanel::FadeIn()\n{\n\tbOpened = true;\n\tSetVisibility(ESlateVisibility::Visible);\n\tSoPanelState = ESoRestPanelState::ERPS_FadeIn;\n\tActiveOptionIndex = 0;\n\tPlayedMusicIndex = 0;\n\n\tPlayAnimationSafe(AnimNameFadeIn);\n\tfor (int32 i = 0; i < PlayerChoiceTextBoxArray.Num(); ++i)\n\t\tif (OptionTexts.IsValidIndex(i))\n\t\t\tPlayerChoiceTextBoxArray[i]->DisplayText(OptionTexts[i], OptionPositions[i], 0.5f, i == 0);\n\n\tPlayedMusicIndex = -1;\n\t// SwitchMusic();\n\n\tbFirstActive = true;\n\tBlendValue = 1.0f;\n\tif (BallImages.IsValidIndex(0))\n\t\tBall0->SetBrushFromTexture(BallImages[0]);\n\tBall0->SetRenderOpacity(1.0f);\n\tBall1->SetRenderOpacity(0.0f);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIRestPanel::FadeOut()\n{\n\tSoPanelState = ESoRestPanelState::ERPS_FadeOut;\n\tPlayAnimationSafe(AnimNameFadeOut);\n\n\tfor (USoUIDialogueChoiceBox* PlayerChoice : PlayerChoiceTextBoxArray)\n\t\tPlayerChoice->HideChoiceTextBox();\n\n\tif (ASoCharacter* Character = USoStaticHelper::GetPlayerCharacterAsSoCharacter(this))\n\t\tCharacter->UpdateMusic(true);\n\n\tUSoAudioManager::PlaySound2D(this, SFXClosePanel);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoUIRestPanel::IsAnyTextBoxAnimated() const\n{\n\tfor (auto* ChoiceBox : PlayerChoiceTextBoxArray)\n\t\tif (ChoiceBox != nullptr && ChoiceBox->IsChoiceTextBoxAnimated())\n\t\t\treturn true;\n\n\treturn false;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIRestPanel::PlayAnimationSafe(FName AnimName)\n{\n\tUWidgetAnimation** AnimPtrPtr = AnimationMap.Find(AnimName);\n\tif (AnimPtrPtr == nullptr || (*AnimPtrPtr) == nullptr)\n\t{\n\t\tUE_LOG(LogSoUIRestPanel, Warning, TEXT(\"Failed to play animation: %s\"), *AnimName.ToString());\n\t\treturn;\n\t}\n\n\tUE_LOG(LogSoUIRestPanel, Display, TEXT(\"Played animation: %s\"), *AnimName.ToString());\n\tPlayAnimation(*AnimPtrPtr);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIRestPanel::OpenSpellSelection()\n{\n\tSpellSelection->SetInGameActivityEnabled(this, true);\n\tSoPanelState = ESoRestPanelState::ERPS_SpellSelection;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nint32 USoUIRestPanel::SwitchMusic()\n{\n\tAActor* Character = USoStaticHelper::GetPlayerCharacterAsActor(this);\n\n\tPlayedMusicIndex += 1;\n\twhile (MusicMap.IsValidIndex(PlayedMusicIndex))\n\t{\n\t\tif (MusicMap[PlayedMusicIndex].Music != nullptr && IDlgDialogueParticipant::Execute_GetBoolValue(Character, MusicMap[PlayedMusicIndex].Music->GetFName()))\n\t\t{\n\t\t\tUSoAudioManager::Get(this).SetMusic(MusicMap[PlayedMusicIndex].Music, true, 0.2f);\n\t\t\treturn PlayedMusicIndex;\n\t\t}\n\t\t++PlayedMusicIndex;\n\t}\n\n\tPlayedMusicIndex = 0;\n\tif (MusicMap.Num() > 0 && MusicMap[0].Music != nullptr)\n\t\tUSoAudioManager::Get(this).SetMusic(MusicMap[PlayedMusicIndex].Music, true, 0.2f);\n\treturn PlayedMusicIndex;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUUserWidget* USoUIRestPanel::GetNotUsedWidget(TSubclassOf<UUserWidget> Class)\n{\n\tFSoUIWidgetArray* WidgetArray = WidgetStorage.Find(Class);\n\n\tif (WidgetArray == nullptr)\n\t\tWidgetArray = &WidgetStorage.Add(Class);\n\n\tfor (UUserWidget* Widget : WidgetArray->Widgets)\n\t\tif (!Widget->IsVisible())\n\t\t\treturn Widget;\n\n\tUUserWidget* Widget = CreateWidget(USoStaticHelper::GetPlayerController(this), Class);\n\tWidget->AddToViewport();\n\tWidgetArray->Widgets.Add(Widget);\n\n\treturn Widget;\n}\n"
  },
  {
    "path": "Source/SOrb/UI/InGame/SoUIRestPanel.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#pragma once\n\n#include \"CoreMinimal.h\"\n\n#include \"UI/InGame/SoUIGameActivity.h\"\n#include \"UI/General/SoUITypes.h\"\n\n#include \"SoUIRestPanel.generated.h\"\n\nclass USoUISpellSelection;\nclass UFMODEvent;\nclass USoUIDialogueChoiceBox;\nclass UImage;\nclass USoUICharacterPreview;\n\n////////////////////////////////////////////////////////////////////////////////////////\nUSTRUCT(BlueprintType)\nstruct FSoUIMusicEntry\n{\n\tGENERATED_USTRUCT_BODY()\npublic:\n\n\t// mesh to fade out\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere)\n\tUFMODEvent* Music;\n\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere)\n\tFText DisplayName;\n};\n\n\n////////////////////////////////////////////////////////////////////////////////////////\nUENUM()\nenum class ESoRestPanelState : uint8\n{\n\tERPS_FadeIn,\n\tERPS_Change,\n\tERPS_WaitForInput,\n\tERPS_SpellSelection,\n\tERPS_FadeOut\n};\n\n////////////////////////////////////////////////////////////////////////////////////////\nUENUM(BlueprintType)\nenum class ESoRestButtons : uint8\n{\n\tERB_Sleep = 0\t\t\t\t\t\tUMETA(DisplayName = \"Sleep\"),\n\tERB_ChangeSpells\t\t\t\t\tUMETA(DisplayName = \"ChangeSpells\"),\n\tERB_ListenToMusic\t\t\t\t\tUMETA(DisplayName = \"ListenToMusic\"),\n\tERB_WakeUp\t\t\t\t\t\t\tUMETA(DisplayName = \"WakeUp\")\n};\n\n\n\nUCLASS()\nclass SORB_API USoUIRestPanel : public USoInGameUIActivity\n{\n\tGENERATED_BODY()\n\nprotected:\n\n\tUSoUIRestPanel(const FObjectInitializer& PCIP);\n\n#if WITH_EDITOR\n\tvirtual void PreSave(const ITargetPlatform* TargetPlatform) override;\n#endif\n\n\t// Begin UUserWidget Interface\n\tvoid NativeConstruct() override;\n\t// End UUserWidget Interface\n\n\t// Begin USoInGameUIActivity\n\n\t/** valid, started DlgContext is expected */\n\tbool SetInGameActivityEnabled_Implementation(UObject* Source, bool bEnable) override;\n\n\tbool HandleCommand_Implementation(ESoUICommand Command) override;\n\n\tbool Update_Implementation(float DeltaSeconds) override;\n\n\tbool ShouldHideUIElements_Implementation() const override { return true; }\n\t//End USoInGameUIActivity\n\nprotected:\n\n\tvoid FadeIn();\n\tvoid FadeOut();\n\n\tbool IsAnyTextBoxAnimated() const;\n\n\tvoid BuildAnimationMap();\n\tvoid PlayAnimationSafe(FName AnimName);\n\n\tUFUNCTION(BlueprintCallable)\n\tvoid OpenSpellSelection();\n\n\tUFUNCTION(BlueprintPure)\n\tESoRestButtons GetActiveButton() { return static_cast<ESoRestButtons>(ActiveOptionIndex); }\n\n\tUFUNCTION(BlueprintImplementableEvent)\n\tvoid OnSelectedOptionChange(int32 Old, int32 New);\n\n\tUFUNCTION(BlueprintImplementableEvent)\n\tvoid OnEnterOption();\n\n\tUFUNCTION(BlueprintCallable, Category = UI)\n\tint32 SwitchMusic();\n\n\tUFUNCTION(BlueprintCallable, Category = UI)\n\tUUserWidget* GetNotUsedWidget(TSubclassOf<UUserWidget> Class);\n\nprotected:\n\tstatic const FName AnimNameFadeIn;\n\tstatic const FName AnimNameFadeOut;\n\n\t// Widgets\n\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\", meta = (BindWidget))\n\tUSoUISpellSelection* SpellSelection;\n\n\n\t//\n\t// DialogueChoiceBox\n\t//\n\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\", meta = (BindWidget))\n\tUSoUIDialogueChoiceBox* Sleep;\n\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\", meta = (BindWidget))\n\tUSoUIDialogueChoiceBox* ChangeSpells;\n\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\", meta = (BindWidget))\n\tUSoUIDialogueChoiceBox* ListenToMusic;\n\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\", meta = (BindWidget))\n\tUSoUIDialogueChoiceBox* WakeUp;\n\n\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\", meta = (BindWidget))\n\tUImage* Ball0;\n\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\", meta = (BindWidget))\n\tUImage* Ball1;\n\n\t/** the choices */\n\tUPROPERTY(BlueprintReadWrite)\n\tTArray<USoUIDialogueChoiceBox*> PlayerChoiceTextBoxArray;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = \">Choices\")\n\tTArray<FText> OptionTexts;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = \">Choices\")\n\tTArray<FVector2D> OptionPositions;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = \">Choices\")\n\tTArray<UTexture2D*> BallImages;\n\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = \">Music\")\n\tTArray<FSoUIMusicEntry> MusicMap;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = \">Music\")\n\tint32 PlayedMusicIndex = 0;\n\n\n\t// runtime stuff\n\tbool bOpened = false;\n\n\tUPROPERTY(BlueprintReadOnly)\n\tTMap<FName, UWidgetAnimation*> AnimationMap;\n\n\tESoRestPanelState SoPanelState;\n\n\tUPROPERTY(BlueprintReadOnly)\n\tint32 ActiveOptionIndex = 0;\n\n\tUPROPERTY()\n\tTMap<TSubclassOf<UUserWidget>, FSoUIWidgetArray> WidgetStorage;\n\n\n\tUPROPERTY(EditAnywhere, Category = \">Choices\")\n\tfloat BlendSpeedMultiplier = 2.0f;\n\n\tbool bFirstActive = true;\n\tfloat BlendValue = 0.0f;\n\n\t//\n\t// SFX\n\t//\n\n\tUPROPERTY(EditAnywhere, Category = \">SFX\")\n\tUFMODEvent* SFXOptionChange;\n\n\tUPROPERTY(EditAnywhere, Category = \">SFX\")\n\tUFMODEvent* SFXOptionSelected;\n\n\tUPROPERTY(EditAnywhere, Category = \">SFX\")\n\tUFMODEvent* SFXClosePanel;\n};\n"
  },
  {
    "path": "Source/SOrb/UI/InGame/SoUIStationPanel.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#include \"SoUIStationPanel.h\"\n\n#include \"Components/RetainerBox.h\"\n#include \"Components/Image.h\"\n\n#include \"SplineLogic/SoMarker.h\"\n#include \"Basic/Helpers/SoStaticHelper.h\"\n#include \"Character/SoCharacter.h\"\n#include \"Character/SoCharStates/SoATeleport.h\"\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIStationPanel::NativeConstruct()\n{\n\tSuper::NativeConstruct();\n\n\tSetVisibility(ESlateVisibility::Collapsed);\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoUIStationPanel::SetInGameActivityEnabled_Implementation(UObject* Source, bool bEnable)\n{\n\tSetVisibility(bEnable ? ESlateVisibility::Visible : ESlateVisibility::Collapsed);\n\tif (bEnable)\n\t{\n\t\tTargetStation = nullptr;\n\t\tOnUIStateActivated();\n\t\tActiveState = ESoStationState::ESS_FadeIn;\n\t\tPlayFadeAnim(false);\n\t}\n\telse\n\t{\n\t\tif (ActiveState != ESoStationState::ESS_Closed)\n\t\t{\n\t\t\tSetVisibility(ESlateVisibility::Collapsed);\n\t\t\tActiveState = ESoStationState::ESS_Closed;\n\t\t}\n\t}\n\n\treturn true;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoUIStationPanel::Update_Implementation(float DeltaSeconds)\n{\n\tswitch (ActiveState)\n\t{\n\t\tcase ESoStationState::ESS_FadeOut:\n\t\t\tif (!IsAnyAnimationPlaying())\n\t\t\t{\n\t\t\t\tSetVisibility(ESlateVisibility::Collapsed);\n\t\t\t\tActiveState = ESoStationState::ESS_Closed;\n\n\t\t\t\tif (TargetStation != nullptr)\n\t\t\t\t{\n\t\t\t\t\tUSoStaticHelper::GetPlayerCharacterAsSoCharacter(this)->SoATeleport->SetResetCameraViewAfterPortal();\n\t\t\t\t\tUSoStaticHelper::GetPlayerCharacterAsSoCharacter(this)->SoATeleport->SetupTeleport(TargetStation->GetSplineLocation(),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t   TargetStation->GetActorLocation().Z,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t   false,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t   false);\n\t\t\t\t\t// true because state change happened already in teleport\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\treturn true;\n\n\t\tcase ESoStationState::ESS_FadeIn:\n\t\t\tif (!IsAnyAnimationPlaying())\n\t\t\t{\n\t\t\t\tActiveState = ESoStationState::ESS_Openned;\n\t\t\t}\n\t\t\treturn true;\n\n\t\tcase ESoStationState::ESS_Closed:\n\t\t\treturn false;\n\n\t\tcase ESoStationState::ESS_Openned:\n\t\tdefault:\n\t\t\treturn true;\n\t}\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nconst FText& USoUIStationPanel::GetTextFromStation(ESoStation Station)\n{\n#define LOCTEXT_NAMESPACE \"StationNames\"\n\n\tstatic FText StationNames[static_cast<int32>(ESoStation::ES_ThisSoStay) + 1] =\n\t{\n\t\tLOCTEXT(\"crossroadcave\", \"Crossroad Cave\"),\n\t\tLOCTEXT(\"outpost\", \"Obedient Outpost\"),\n\t\tLOCTEXT(\"lavatemple\", \"Remnant Road\"),\n\t\tLOCTEXT(\"wrackedWaters\", \"Wracked Waters\"),\n\t\tLOCTEXT(\"away\", \"World's End\"),\n\t\tLOCTEXT(\"stay\", \"Stay\"),\n\t};\n\n#undef LOCTEXT_NAMESPACE\n\n\tif (Station <= ESoStation::ES_ThisSoStay && Station >= ESoStation::ES_CrossroadCave)\n\t\treturn StationNames[static_cast<int32>(Station)];\n\n\treturn FText::GetEmpty();\n}\n\nstatic const FName StationNameCrossroadCave = FName(\"CrossroadCave\");\nstatic const FName StationNameOutpost = FName(\"Outpost\");\nstatic const FName StationNameLavaTemple = FName(\"LavaTemple\");\nstatic const FName StationNameWrackedWaters = FName(\"WrackedWaters\");\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFName USoUIStationPanel::GetNameFromStation(ESoStation Station)\n{\n\tstatic FName StationNames[static_cast<int32>(ESoStation::ES_Away)] =\n\t{\n\t\tStationNameCrossroadCave,\n\t\tStationNameOutpost,\n\t\tStationNameLavaTemple,\n\t\tStationNameWrackedWaters\n\t};\n\n\tif (Station < ESoStation::ES_Away && Station >= ESoStation::ES_CrossroadCave)\n\t\treturn StationNames[static_cast<int32>(Station)];\n\n\treturn NAME_None;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nESoStation USoUIStationPanel::GetStationFromName(FName Name)\n{\n\tif (Name == StationNameCrossroadCave)\n\t\treturn ESoStation::ES_CrossroadCave;\n\tif (Name == StationNameOutpost)\n\t\treturn ESoStation::ES_Outpost;\n\tif (Name == StationNameLavaTemple)\n\t\treturn ESoStation::ES_Lava;\n\tif (Name == StationNameWrackedWaters)\n\t\treturn ESoStation::ES_Water;\n\n\treturn ESoStation::ES_ThisSoStay;\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIStationPanel::SetActiveState(ESoStationState NewState)\n{\n\tif (ActiveState != NewState)\n\t{\n\t\tActiveState = NewState;\n\t\tif (ActiveState == ESoStationState::ESS_FadeOut)\n\t\t\tPlayFadeAnim(true);\n\t}\n}\n"
  },
  {
    "path": "Source/SOrb/UI/InGame/SoUIStationPanel.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#pragma once\n\n#include \"CoreMinimal.h\"\n#include \"UI/InGame/SoUIGameActivity.h\"\n\n#include \"SoUIStationPanel.generated.h\"\n\nclass ASoMarker;\nclass USoUIButtonArray;\n\n////////////////////////////////////////////////////////////////////////////////////////\nUENUM(BlueprintType)\nenum class ESoStation : uint8\n{\n\tES_CrossroadCave\t\t\t\t\tUMETA(DisplayName = \"CrossroadCave\"),\n\tES_Outpost\t\t\t\t\t\t\tUMETA(DisplayName = \"Outpost\"),\n\tES_Lava\t\t\t\t\t\t\t\tUMETA(DisplayName = \"LavaTemple\"),\n\tES_Water\t\t\t\t\t\t\tUMETA(DisplayName = \"WrackedWaters\"),\n\n\tES_Away\t\t\t\t\t\t\t\tUMETA(DisplayName = \"Away\"),\n\n\tES_ThisSoStay\t\t\t\t\t\tUMETA(DisplayName = \"ThisSoStay\")\n};\n\nUENUM(BlueprintType)\nenum class ESoStationState : uint8\n{\n\t// only the buttons are visible\n\tESS_FadeIn\t\t\tUMETA(DisplayName = \"FadeIn\"),\n\tESS_FadeOut\t\t\tUMETA(DisplayName = \"FadeOut\"),\n\n\tESS_Openned\t\t\tUMETA(DisplayName = \"Opened\"),\n\tESS_Closed\t\t\tUMETA(DisplayName = \"Closed\")\n};\n\n/**\n *\n */\nUCLASS()\nclass SORB_API USoUIStationPanel : public USoInGameUIActivity\n{\n\tGENERATED_BODY()\n\n\t// Begin UUserWidget Interface\n\tvoid NativeConstruct() override;\n\t// End UUserWidget Interface\n\n\n\t// Begin USoInGameUIActivity\n\tbool SetInGameActivityEnabled_Implementation(UObject* Source, bool bEnable) override;\n\tbool Update_Implementation(float DeltaSeconds) override;\n\tbool ShouldHideUIElements_Implementation() const override { return true; }\n\t//End USoInGameUIActivity\n\npublic:\n\tUFUNCTION(BlueprintPure, Category = \">Station\")\n\tstatic const FText& GetTextFromStation(ESoStation Station);\n\n\tUFUNCTION(BlueprintPure, Category = \">Station\")\n\tstatic FName GetNameFromStation(ESoStation Station);\n\n\tUFUNCTION(BlueprintPure, Category = \">Station\")\n\tstatic ESoStation GetStationFromName(FName Name);\n\nprotected:\n\tUFUNCTION(BlueprintImplementableEvent, Category = \">Events\")\n\tvoid OnUIStateActivated();\n\n\tUFUNCTION(BlueprintImplementableEvent, Category = \">Events\")\n\tvoid PlayFadeAnim(bool bOut);\n\n\tUFUNCTION(BlueprintCallable, Category = \">Station\")\n\tvoid SetActiveState(ESoStationState NewState);\n\nprotected:\n\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\", meta = (BindWidget))\n\tUSoUIButtonArray* ButtonArray;\n\n\tUPROPERTY(BlueprintReadOnly, Category = \">Station\")\n\tESoStationState ActiveState = ESoStationState::ESS_Closed;\n\n\tUPROPERTY(BlueprintReadWrite, Category = \">Station\")\n\tASoMarker* TargetStation = nullptr;\n};\n"
  },
  {
    "path": "Source/SOrb/UI/InGame/SoUITradePanel.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#include \"SoUITradePanel.h\"\n\n#include \"DlgDialogueParticipant.h\"\n\n#include \"Items/SoTraderComponent.h\"\n#include \"UI/SoUIHelper.h\"\n#include \"Items/SoItem.h\"\n#include \"Items/SoInventoryComponent.h\"\n#include \"Items/ItemTemplates/SoItemTemplate.h\"\n#include \"Basic/Helpers/SoStaticHelper.h\"\n#include \"Basic/SoGameInstance.h\"\n#include \"Character/SoCharacter.h\"\n#include \"Character/SoPlayerCharacterSheet.h\"\n#include \"Basic/SoAudioManager.h\"\n\n#include \"UI/General/Buttons/SoUIButtonArray.h\"\n#include \"UI/General/SoUITypes.h\"\n#include \"UI/General/SoUIConfirmPanel.h\"\n#include \"Online/Analytics/SoAnalytics.h\"\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUITradePanel::NativeConstruct()\n{\n\tSuper::NativeConstruct();\n\n\tSetVisibility(ESlateVisibility::Collapsed);\n\n\tCategories = { ESoItemType::EIT_Weapon,\n\t\t\t\t   ESoItemType::EIT_Shard,\n\t\t\t\t   ESoItemType::EIT_Jewelry,\n\t\t\t\t   ESoItemType::EIT_Key,\n\t\t\t\t   ESoItemType::EIT_RuneStone };\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoUITradePanel::SetInGameActivityEnabled_Implementation(UObject* Source, bool bEnable)\n{\n\tif (bOpened && bEnable)\n\t\treturn true;\n\n\tif (bEnable)\n\t{\n\t\tTraderComponent = Cast<USoTraderComponent>(Source);\n\t\tif (TraderComponent == nullptr)\n\t\t{\n\t\t\tUE_LOG(LogTemp, Warning, TEXT(\"Failed to start trading - TradePanel expected a tradecomponent!\"));\n\t\t\treturn false;\n\t\t}\n\n\t\tSubMenus->SetSelectedIndex(0);\n\t\tOnActiveSubPanelChanged(0, false);\n\t\tOnGoldChanged();\n\n\t\tUSoAudioManager::PlaySound2D(this, SFXOpen);\n\t}\n\telse\n\t{\n\t\t// restore music\n\t\tASoCharacter* PlayerCharacter = USoStaticHelper::GetPlayerCharacterAsSoCharacter(this);\n\t\tif (PlayerCharacter != nullptr)\n\t\t\tPlayerCharacter->UpdateMusic(true);\n\n\t\tUSoAudioManager::PlaySound2D(this, SFXClose);\n\t}\n\n\tbOpened = bEnable;\n\tSetVisibility(bEnable ? ESlateVisibility::Visible : ESlateVisibility::Collapsed);\n\treturn bEnable;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoUITradePanel::HandleCommand_Implementation(ESoUICommand Command)\n{\n\tCommand = USoUIHelper::TryTranslateMenuCommandDirectionToGame(Command);\n\tif (ISoUIEventHandler::Execute_IsOpened(ConfirmPanel))\n\t{\n\t\tISoUIEventHandler::Execute_OnUICommand(ConfirmPanel, Command);\n\t\treturn true;\n\t}\n\n\tconst int32 OldPanelIndex = SubMenus->GetSelectedIndex();\n\tswitch (Command)\n\t{\n\t\tcase ESoUICommand::EUC_TopLeft:\n\t\t\tSubMenus->Navigate(ESoUICommand::EUC_Left);\n\t\t\tOnActiveSubPanelChanged(SubCategories->GetSelectedIndex(), false);\n\t\t\tOnSelectedItemChanged(static_cast<ESoTraderSubPanel>(SubMenus->GetSelectedIndex()));\n\t\t\tif (OldPanelIndex != SubMenus->GetSelectedIndex())\n\t\t\t\tUSoAudioManager::PlaySound2D(this, SFXPanelSwitch);\n\t\t\tbreak;\n\n\t\tcase ESoUICommand::EUC_TopRight:\n\t\t\tSubMenus->Navigate(ESoUICommand::EUC_Right);\n\t\t\tOnActiveSubPanelChanged(SubCategories->GetSelectedIndex(), false);\n\t\t\tOnSelectedItemChanged(static_cast<ESoTraderSubPanel>(SubMenus->GetSelectedIndex()));\n\t\t\tif (OldPanelIndex != SubMenus->GetSelectedIndex())\n\t\t\t\tUSoAudioManager::PlaySound2D(this, SFXPanelSwitch);\n\t\t\tbreak;\n\n\t\tcase ESoUICommand::EUC_Left:\n\t\tcase ESoUICommand::EUC_Right:\n\t\t\tSubCategories->Navigate(Command);\n\t\t\tChangeCategoryBP(GetItemTypeFromIndex(SubCategories->GetSelectedIndex()));\n\t\t\tOnSelectedItemChanged(static_cast<ESoTraderSubPanel>(SubMenus->GetSelectedIndex()));\n\t\t\tbreak;\n\n\t\tcase ESoUICommand::EUC_Up:\n\t\tcase ESoUICommand::EUC_Down:\n\t\t\tISoUIEventHandler::Execute_OnUICommand(ItemList, Command);\n\t\t\tOnSelectedItemChanged(static_cast<ESoTraderSubPanel>(SubMenus->GetSelectedIndex()));\n\t\t\treturn true;\n\n\t\tcase ESoUICommand::EUC_Action0:\n\t\t\tif (CanExecuteTransaction())\n\t\t\t{\n\t\t\t\tconst int32 ActivePanelIndex = SubMenus->GetSelectedIndex();\n\t\t\t\tUFMODEvent* Events[] = { SFXBuy, SFXSell, SFXBuyBack };\n\t\t\t\tUSoAudioManager::PlaySound2D(this, Events[ActivePanelIndex]);\n\t\t\t\tISoUIEventHandler::Execute_Open(ConfirmPanel, true);\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase ESoUICommand::EUC_MainMenuBack:\n\t\t\tbOpened = false;\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tbreak;\n\t}\n\n\treturn true;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUITradePanel::OnActiveSubPanelChanged(int32 PreferedCategory, bool bTryToKeepItemIndex)\n{\n\tconst int32 SubPanelNum = static_cast<int32>(ESoTraderSubPanel::ETSP_NumOf);\n\n\tcheck(TraderComponent);\n\tUSoInventoryComponent* PlayerInventory = USoUIHelper::GetPlayerInventory(this);\n\tcheck(PlayerInventory);\n\n\tconst TArray<FSoItem>* Lists[] = { &TraderComponent->GetActualList(), &PlayerInventory->GetItemList(), &TraderComponent->GetPurchasedList() };\n\tfor (int32 i = 0; i < 3; ++i)\n\t{\n\t\tconst bool bActivate = Lists[i]->Num() > 0;\n\t\tbActivate ? SubMenus->ActivateChildAt(i) : SubMenus->DeactivateChildAt(i);\n\t}\n\n\tSubMenus->SelectFirstActiveChild(SubMenus->GetSelectedIndex());\n\tconst int32 SubMenuIndex = FMath::Max(SubMenus->GetSelectedIndex(), 0);\n\n\tSubCategories->DeactivateAllChildren();\n\tfor (const FSoItem& Item : *Lists[SubMenuIndex])\n\t\tif (Item.Template != nullptr)\n\t\t\tSubCategories->ActivateChildAt(GetCategoryIndexFromItemType(Item.Template->GetItemType()));\n\n\tconst int32 CategoryIndex = SubCategories->SelectFirstActiveChild(PreferedCategory);\n\n\tReinitializeItemListBP(*Lists[SubMenuIndex],\n\t\t\t\t\t\t   GetItemTypeFromIndex(CategoryIndex),\n\t\t\t\t\t\t   bTryToKeepItemIndex,\n\t\t\t\t\t\t   SubMenuIndex == static_cast<int32>(ESoTraderSubPanel::ETSP_Buy));\n\tOnSelectedItemChanged(static_cast<ESoTraderSubPanel>(SubMenuIndex));\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nESoItemType USoUITradePanel::GetItemTypeFromIndex(int32 Index) const\n{\n\tif (Categories.IsValidIndex(Index))\n\t\treturn Categories[Index];\n\n\treturn ESoItemType::EIT_Weapon;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nint32 USoUITradePanel::GetCategoryIndexFromItemType(ESoItemType ItemType) const\n{\n\treturn FMath::Max(Categories.Find(ItemType), 0);\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoUITradePanel::Update_Implementation(float DeltaSeconds)\n{\n\treturn bOpened;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoUITradePanel::IsInConfirmationPanel() const\n{\n\treturn ConfirmPanel->IsVisible();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoUITradePanel::CanExecuteTransaction()\n{\n\tconst int32 ActivePanelIndex = SubMenus->GetSelectedIndex();\n\tif (ActivePanelIndex < 0 || ActivePanelIndex >= static_cast<int32>(ESoTraderSubPanel::ETSP_NumOf))\n\t\treturn false;\n\n\tAActor* PlayerCharacter = USoStaticHelper::GetPlayerCharacterAsActor(this);\n\n\tconst FSoItem Item = GetSelectedItem();\n\tif (Item.Template == nullptr || PlayerCharacter == nullptr)\n\t\treturn false;\n\n\tswitch (static_cast<ESoTraderSubPanel>(ActivePanelIndex))\n\t{\n\t\tcase ESoTraderSubPanel::ETSP_BuyBack:\n\t\t\treturn Item.GetValue(false) <= IDlgDialogueParticipant::Execute_GetIntValue(PlayerCharacter, USoStaticHelper::NameGold);\n\n\t\tcase ESoTraderSubPanel::ETSP_Buy:\n\t\t\treturn Item.GetValue(true) <= IDlgDialogueParticipant::Execute_GetIntValue(PlayerCharacter, USoStaticHelper::NameGold);\n\n\t\tcase ESoTraderSubPanel::ETSP_Sell:\n\t\t\treturn true;\n\n\t\tdefault:\n\t\t\treturn false;\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nESoTraderSubPanel USoUITradePanel::GetActivePanel() const\n{\n\treturn static_cast<ESoTraderSubPanel>(SubMenus->GetSelectedIndex());\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUITradePanel::ExecuteTransaction(int32 Amount)\n{\n\tconst int32 SubPanelIndex = SubMenus->GetSelectedIndex();\n\tif (SubPanelIndex < 0 || SubPanelIndex >= static_cast<int32>(ESoTraderSubPanel::ETSP_NumOf))\n\t\treturn;\n\n\tUSoInventoryComponent* PlayerInventory = USoUIHelper::GetPlayerInventory(this);\n\tASoCharacter* PlayerCharacter = USoStaticHelper::GetPlayerCharacterAsSoCharacter(this);\n\n\tswitch (static_cast<ESoTraderSubPanel>(SubPanelIndex))\n\t{\n\t\tcase ESoTraderSubPanel::ETSP_Buy:\n\t\t{\n\t\t\tconst FSoItem Item = TraderComponent->PurchaseItem(GetSelectedItemIndex(), Amount);\n\t\t\tif (Item.Template != nullptr)\n\t\t\t{\n\t\t\t\tPlayerCharacter->AddItem(Item, false);\n\t\t\t\tconst int32 GoldAmount = -Item.GetValue(true) * FMath::Max(Amount, 1);\n\t\t\t\tIDlgDialogueParticipant::Execute_ModifyIntValue(PlayerCharacter, USoStaticHelper::NameGold, true, GoldAmount);\n\n\t\t\t\t// Analytics\n\t\t\t\tUSoGameInstance::Get(this).GetAnalytics()->SubtractGold(GoldAmount, ESoResourceItemType::ERI_BuyTrader, Item.Template->GetItemTypeAsFriendlyString());\n\n\t\t\t\tOnItemBought();\n\t\t\t}\n\t\t}\n\t\tbreak;\n\n\t\tcase ESoTraderSubPanel::ETSP_BuyBack:\n\t\t{\n\t\t\tconst FSoItem Item = TraderComponent->BuyBackItem(GetSelectedItemIndex(), Amount);\n\t\t\tif (Item.Template != nullptr)\n\t\t\t{\n\t\t\t\tPlayerCharacter->AddItem(Item, false);\n\t\t\t\tconst int32 GoldAmount = -Item.GetValue(false) * FMath::Max(Amount, 1);\n\t\t\t\tIDlgDialogueParticipant::Execute_ModifyIntValue(PlayerCharacter, USoStaticHelper::NameGold, true, GoldAmount);\n\n\t\t\t\t// Analytics\n\t\t\t\tUSoGameInstance::Get(this).GetAnalytics()->SubtractGold(GoldAmount, ESoResourceItemType::ERI_BuyTrader, Item.Template->GetItemTypeAsFriendlyString());\n\t\t\t}\n\t\t}\n\t\tbreak;\n\n\t\tcase ESoTraderSubPanel::ETSP_Sell:\n\t\t{\n\t\t\tconst int32 ItemIndex = GetSelectedItemIndex();\n\t\t\tif (ItemIndex >= 0 && ItemIndex < PlayerInventory->GetItemList().Num())\n\t\t\t{\n\t\t\t\tFSoItem Item;\n\t\t\t\tif (!PlayerInventory->RemoveAndGetItem(GetSelectedItemIndex(), Amount, Item))\n\t\t\t\t\tbreak;\n\n\t\t\t\tPlayerCharacter->GetPlayerCharacterSheet()->OnItemRemoved(Item);\n\n\t\t\t\tconst int32 GoldAmount = Item.GetValue(false) * FMath::Max(Amount, 1);\n\t\t\t\tIDlgDialogueParticipant::Execute_ModifyIntValue(PlayerCharacter, USoStaticHelper::NameGold, true, GoldAmount);\n\t\t\t\tTraderComponent->OnItemSold(Item, Amount);\n\n\t\t\t\t// Analytics\n\t\t\t\tUSoGameInstance::Get(this).GetAnalytics()->AddGold(GoldAmount, ESoResourceItemType::ERI_SellTrader, Item.Template->GetItemTypeAsFriendlyString());\n\t\t\t}\n\t\t}\n\t\tbreak;\n\n\t\tdefault:\n\t\t\tbreak;\n\t}\n\n\tOnActiveSubPanelChanged(SubCategories->GetSelectedIndex(), true);\n\tOnGoldChanged();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFName USoUITradePanel::GetGoldName()\n{\n\treturn USoStaticHelper::NameGold;\n}\n"
  },
  {
    "path": "Source/SOrb/UI/InGame/SoUITradePanel.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#pragma once\n\n#include \"CoreMinimal.h\"\n#include \"UI/InGame/SoUIGameActivity.h\"\n#include \"Items/SoItemTypes.h\"\n#include \"Items/SoItem.h\"\n\n#include \"SoUITradePanel.generated.h\"\n\nclass USoUIButtonArray;\nclass USoUIConfirmPanel;\nclass USoTraderComponent;\nclass UFMODEvent;\n\n\nUENUM(BlueprintType)\nenum class ESoTraderSubPanel : uint8\n{\n\tETSP_Buy\t\t\t\tUMETA(DisplayName = \"Buy\"),\n\tETSP_Sell\t\t\t\tUMETA(DisplayName = \"Sell\"),\n\tETSP_BuyBack\t\t\tUMETA(DisplayName = \"BuyBack\"),\n\tETSP_NumOf\t\t\t\tUMETA(Hidden)\n};\n\n/**\n *\n */\nUCLASS()\nclass SORB_API USoUITradePanel : public USoInGameUIActivity\n{\n\tGENERATED_BODY()\n\npublic:\n\tvirtual void NativeConstruct() override;\n\nprotected:\n\tbool SetInGameActivityEnabled_Implementation(UObject* Source, bool bEnable) override;\n\n\tbool HandleCommand_Implementation(ESoUICommand Command) override;\n\n\tbool Update_Implementation(float DeltaSeconds) override;\n\n\tbool ShouldHideUIElements_Implementation() const override { return true; }\n\tbool ShouldKeepMusicFromPreviousUIActivity_Implementation() const override { return true; }\n\nprotected:\n\tESoItemType GetItemTypeFromIndex(int32 Index) const;\n\tint32 GetCategoryIndexFromItemType(ESoItemType ItemType) const;\n\n\tvoid OnActiveSubPanelChanged(int32 PreferedCategory, bool bTryToKeepItemIndex);\n\n\tbool IsInConfirmationPanel() const;\n\n\tUFUNCTION(BlueprintCallable, Category = Items)\n\tvoid ExecuteTransaction(int32 Amount);\n\n\tUFUNCTION(BlueprintCallable, Category = Items)\n\tbool CanExecuteTransaction();\n\n\tUFUNCTION(BlueprintPure, Category = Items)\n\tESoTraderSubPanel GetActivePanel() const;\n\n\n\tUFUNCTION(BlueprintImplementableEvent, BlueprintCallable, Category = Items)\n\tvoid ReinitializeItemListBP(const TArray<FSoItem>& Items, ESoItemType ItemType, bool bReserveItemIndexIfCategoryIsSame, bool bShowBuyPrice);\n\n\tUFUNCTION(BlueprintImplementableEvent, BlueprintCallable, Category = Items)\n\tvoid ChangeCategoryBP(ESoItemType ItemType);\n\n\tUFUNCTION(BlueprintImplementableEvent, BlueprintCallable, Category = Items)\n\tvoid OnSelectedItemChanged(ESoTraderSubPanel ActivePanel);\n\n\tUFUNCTION(BlueprintImplementableEvent, BlueprintCallable, Category = Items)\n\tvoid OnGoldChanged();\n\n\tUFUNCTION(BlueprintImplementableEvent, BlueprintCallable, Category = Items)\n\tint32 GetSelectedItemIndex();\n\n\tUFUNCTION(BlueprintImplementableEvent, BlueprintCallable, BlueprintPure, Category = Items)\n\tFSoItem GetSelectedItem();\n\n\tUFUNCTION(BlueprintImplementableEvent, BlueprintCallable, Category = Items)\n\tvoid OnItemBought();\n\n\tUFUNCTION(BlueprintCallable, BlueprintPure, Category = Items)\n\tFName GetGoldName();\n\nprotected:\n\n\t// TODO see if we have duplicate sounds\n\n\t/** <Buy> <Sell> <Redeem> */\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere, Category = \">Widgets\", meta = (BindWidget))\n\tUSoUIButtonArray* SubMenus = nullptr;\n\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere, Category = \">Widgets\", meta = (BindWidget))\n\tUSoUIButtonArray* SubCategories = nullptr;\n\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere, Category = \">Widgets\", meta = (BindWidget))\n\tUUserWidget* ItemList = nullptr;\n\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere, Category = \">Widgets\", meta = (BindWidget))\n\tUSoUIConfirmPanel* ConfirmPanel = nullptr;\n\n\tUPROPERTY(BlueprintReadOnly)\n\tUSoTraderComponent* TraderComponent = nullptr;\n\n\tbool bOpened = false;\n\n\tUPROPERTY(EditAnywhere, Category = \">Trade\")\n\tTArray<ESoItemType> Categories;\n\n\t//\n\t// SFX\n\t//\n\n\tUPROPERTY(EditAnywhere, Category = \">SFX\")\n\tUFMODEvent* SFXPanelSwitch = nullptr;\n\n\tUPROPERTY(EditAnywhere, Category = \">SFX\")\n\tUFMODEvent* SFXBuy = nullptr;\n\n\tUPROPERTY(EditAnywhere, Category = \">SFX\")\n\tUFMODEvent* SFXSell = nullptr;\n\n\tUPROPERTY(EditAnywhere, Category = \">SFX\")\n\tUFMODEvent* SFXBuyBack = nullptr;\n\n\tUPROPERTY(EditAnywhere, Category = \">SFX\")\n\tUFMODEvent* SFXOpen = nullptr;\n\n\tUPROPERTY(EditAnywhere, Category = \">SFX\")\n\tUFMODEvent* SFXClose = nullptr;\n};\n"
  },
  {
    "path": "Source/SOrb/UI/InGame/Spells/SoUIActiveSpellSlot.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#include \"SoUIActiveSpellSlot.h\"\n#include \"Components/Image.h\"\n#include \"Components/TextBlock.h\"\n\n#include \"Basic/Helpers/SoStaticHelper.h\"\n#include \"Items/SoItem.h\"\n#include \"Items/ItemTemplates/SoUsableItemTemplate.h\"\n#include \"Items/ItemTemplates/SoItemTemplateRuneStone.h\"\n#include \"Character/SoCharacter.h\"\n#include \"Character/SoPlayerCharacterSheet.h\"\n#include \"CharacterBase/SoCharacterMovementComponent.h\"\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIActiveSpellSlot::NativeConstruct()\n{\n\tSuper::NativeConstruct();\n\tSetVisibility(ESlateVisibility::Collapsed);\n\n\tif (ASoCharacter* SoCharacter = USoStaticHelper::GetPlayerCharacterAsSoCharacter(this))\n\t{\n\t\tSoCharacter->OnCooldownStarted().AddDynamic(this, &USoUIActiveSpellSlot::OnCooldownChanged);\n\t\tSoCharacter->OnCooldownEnded().AddDynamic(this, &USoUIActiveSpellSlot::OnCooldownChanged);\n\t\tSoCharacter->OnMovementModeChangedNotify.AddDynamic(this, &USoUIActiveSpellSlot::OnSpellUsabilityMightChanged);\n\t\tSoCharacter->OnCanUseSoulKeeperChanged().AddDynamic(this, &USoUIActiveSpellSlot::OnSpellUsabilityMightChanged);\n\t\tSoCharacter->GetPlayerCharacterSheet()->OnSelectedSpellChanged.AddDynamic(this, &USoUIActiveSpellSlot::OnSelectedSpellChanged);\n\t\tSoCharacter->GetPlayerCharacterSheet()->OnSelectedSpellSwitched.AddDynamic(this, &USoUIActiveSpellSlot::OnSelectedSpellChanged);\n\t\tSoCharacter->GetPlayerCharacterSheet()->OnSlotChanged.AddDynamic(this, &USoUIActiveSpellSlot::OnCharacterItemSlotChanged);\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIActiveSpellSlot::NativeDestruct()\n{\n\tif (ASoCharacter* SoCharacter = USoStaticHelper::GetPlayerCharacterAsSoCharacter(this))\n\t{\n\t\tSoCharacter->OnCooldownStarted().RemoveDynamic(this, &USoUIActiveSpellSlot::OnCooldownChanged);\n\t\tSoCharacter->OnCooldownEnded().RemoveDynamic(this, &USoUIActiveSpellSlot::OnCooldownChanged);\n\t\tSoCharacter->OnMovementModeChangedNotify.RemoveDynamic(this, &USoUIActiveSpellSlot::OnSpellUsabilityMightChanged);\n\t\tSoCharacter->OnCanUseSoulKeeperChanged().RemoveDynamic(this, &USoUIActiveSpellSlot::OnSpellUsabilityMightChanged);\n\t\tSoCharacter->GetPlayerCharacterSheet()->OnSelectedSpellChanged.RemoveDynamic(this, &USoUIActiveSpellSlot::OnSelectedSpellChanged);\n\t\tSoCharacter->GetPlayerCharacterSheet()->OnSelectedSpellSwitched.RemoveDynamic(this, &USoUIActiveSpellSlot::OnSelectedSpellChanged);\n\t\tSoCharacter->GetPlayerCharacterSheet()->OnSlotChanged.RemoveDynamic(this, &USoUIActiveSpellSlot::OnCharacterItemSlotChanged);\n\t}\n\tSuper::NativeDestruct();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIActiveSpellSlot::OnSelectedSpellChanged()\n{\n\tRefresh();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIActiveSpellSlot::OnCharacterItemSlotChanged(ESoItemSlot ChangedSlot)\n{\n\tif (ChangedSlot == ESoItemSlot::EIS_Item0)\n\t\tUpdateVisibility();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIActiveSpellSlot::OnCooldownChanged(int32 Index, float RemainingTime, const UObject* ObjectWithCooldown)\n{\n\tif (ObjectWithCooldown == CurrentlySelectedSpell && CurrentlySelectedSpell != nullptr)\n\t{\n\t\tbCooldownBlocked = RemainingTime > 0.0f;\n\t\tUpdateInactiveFadeVisibility();\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIActiveSpellSlot::OnSpellUsabilityMightChanged()\n{\n\tif (CurrentlySelectedSpell != nullptr)\n\t\tUpdateInactiveFadeVisibility();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIActiveSpellSlot::UpdateVisibility()\n{\n\tif (ASoCharacter* SoCharacter = USoStaticHelper::GetPlayerCharacterAsSoCharacter(this))\n\t{\n\t\tbool bSpellCasterItemActive = false;\n\t\tconst FSoItem& Item = SoCharacter->GetPlayerCharacterSheet()->GetEquippedItem(ESoItemSlot::EIS_Item0);\n\t\tif (USoUsableItemTemplate* Usable = Cast<USoUsableItemTemplate>(Item.Template))\n\t\t\tbSpellCasterItemActive = (Usable->UsableType == ESoUsableItemType::EUIT_Spell);\n\n\t\tSetVisibility((bSpellCasterItemActive && CurrentlySelectedSpell != nullptr && bCanBeDisplayed) ? ESlateVisibility::Visible : ESlateVisibility::Collapsed);\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIActiveSpellSlot::UpdateInactiveFadeVisibility()\n{\n\tif (!InactiveFade)\n\t\treturn;\n\n\tconst ASoCharacter* SoCharacter = USoStaticHelper::GetPlayerCharacterAsSoCharacter(this);\n\tif (!SoCharacter)\n\t\treturn;\n\n\tconst bool bNotOnGroundBlocked = !CurrentlySelectedSpell->bCanBeUsedInAir && !SoCharacter->GetSoMovement()->IsMovingOnGround();\n\tconst bool bNoSKZoneBlocked = !CurrentlySelectedSpell->bCanBeUsedInSKFreeZone && !SoCharacter->CanUseSoulkeeperAtLocation();\n\tInactiveFade->SetVisibility((bCooldownBlocked || bRunOut || bNotOnGroundBlocked || bNoSKZoneBlocked) ? ESlateVisibility::Visible : ESlateVisibility::Collapsed);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIActiveSpellSlot::Refresh()\n{\n\tif (ASoCharacter* SoCharacter = USoStaticHelper::GetPlayerCharacterAsSoCharacter(this))\n\t\tif (USoPlayerCharacterSheet* SoSheet = SoCharacter->GetPlayerCharacterSheet())\n\t\t{\n\t\t\tCurrentlySelectedSpell = SoSheet->GetActiveSpell();\n\t\t\tif (CurrentlySelectedSpell != nullptr)\n\t\t\t{\n\t\t\t\tIcon->SetBrushFromTexture(CurrentlySelectedSpell->GetIcon());\n\t\t\t\tconst int32* AmountPtr = SoSheet->GetSpellMap().Find(CurrentlySelectedSpell);\n\t\t\t\tAmountText->SetVisibility(AmountPtr == nullptr ? ESlateVisibility::Collapsed : ESlateVisibility::Visible);\n\t\t\t\tif (AmountPtr != nullptr)\n\t\t\t\t\tAmountText->SetText(FText::AsNumber(*AmountPtr, &FNumberFormattingOptions::DefaultNoGrouping()));\n\n\t\t\t\tbRunOut = (AmountPtr != nullptr) && (*AmountPtr == 0);\n\t\t\t\tbCooldownBlocked = false;\n\t\t\t\tfor (const auto& Cooldown : SoCharacter->GetCooldowns())\n\t\t\t\t\tif (Cooldown.Object == CurrentlySelectedSpell)\n\t\t\t\t\t\tbCooldownBlocked = true;\n\n\t\t\t\tUpdateInactiveFadeVisibility();\n\t\t\t}\n\t\t}\n\n\tUpdateVisibility();\n}\n"
  },
  {
    "path": "Source/SOrb/UI/InGame/Spells/SoUIActiveSpellSlot.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#pragma once\n\n#include \"CoreMinimal.h\"\n#include \"Blueprint/UserWidget.h\"\n#include \"Items/SoItemTypes.h\"\n\n#include \"SoUIActiveSpellSlot.generated.h\"\n\nclass USoItemTemplateRuneStone;\nclass UImage;\nclass UTextBlock;\n\nUCLASS()\nclass SORB_API USoUIActiveSpellSlot : public UUserWidget\n{\n\tGENERATED_BODY()\n\npublic:\n\tvirtual void NativeConstruct() override;\n\tvirtual void NativeDestruct() override;\n\n\tUFUNCTION()\n\tvoid OnSelectedSpellChanged();\n\n\tUFUNCTION()\n\tvoid OnCharacterItemSlotChanged(ESoItemSlot ChangedSlot);\n\n\tUFUNCTION()\n\tvoid OnCooldownChanged(int32 Index, float RemainingTime, const UObject* ObjectWithCooldown);\n\n\tUFUNCTION()\n\tvoid OnSpellUsabilityMightChanged();\n\nprotected:\n\tUFUNCTION(BlueprintCallable, Category = SpellSlot)\n\tvoid UpdateVisibility();\n\n\tvoid UpdateInactiveFadeVisibility();\n\tvoid Refresh();\n\nprotected:\n\tUPROPERTY(BlueprintReadOnly, Category = \">Widgets\", meta = (BindWidget))\n\tUImage* Icon = nullptr;\n\n\tUPROPERTY(BlueprintReadOnly, Category = \">Widgets\", meta = (BindWidget))\n\tUImage* InactiveFade = nullptr;\n\n\tUPROPERTY(BlueprintReadOnly, Category = \">Widgets\", meta = (BindWidget))\n\tUTextBlock* AmountText = nullptr;\n\n\tUPROPERTY(BlueprintReadWrite, Category = \">Options\", meta = (BindWidget))\n\tbool bCanBeDisplayed = true;\n\n\tUPROPERTY()\n\tconst USoItemTemplateRuneStone* CurrentlySelectedSpell = nullptr;\n\n\tbool bRunOut = false;\n\tbool bCooldownBlocked = false;\n};\n"
  },
  {
    "path": "Source/SOrb/UI/InGame/Spells/SoUISpellCastSwitch.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#include \"SoUISpellCastSwitch.h\"\n\n#include \"Components/WrapBox.h\"\n#include \"Components/HorizontalBox.h\"\n#include \"Components/CanvasPanel.h\"\n#include \"Components/TextBlock.h\"\n\n#include \"Basic/Helpers/SoStaticHelper.h\"\n#include \"Basic/Helpers/SoMathHelper.h\"\n#include \"Basic/SoGameInstance.h\"\n#include \"Basic/SoAudioManager.h\"\n#include \"Character/SoCharacter.h\"\n#include \"Character/SoPlayerCharacterSheet.h\"\n#include \"Character/SoPlayerController.h\"\n\n#include \"SoUISpellSlot.h\"\n#include \"SoUISpellCastSwitchSlot.h\"\n#include \"UI/General/Commands/SoUICommandTooltip.h\"\n#include \"Settings/SoGameSettings.h\"\n#include \"Settings/Input/SoInputHelper.h\"\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISpellCastSwitch::NativeTick(const FGeometry& MyGeometry, float InDeltaTime)\n{\n\tSuper::NativeTick(MyGeometry, InDeltaTime);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISpellCastSwitch::NativeConstruct()\n{\n\tSuper::NativeConstruct();\n\tSetVisibility(ESlateVisibility::Collapsed);\n\tKeyboardShortcutsContainer->SetVisibility(ESlateVisibility::Collapsed);\n\n\tSoCharacter = USoStaticHelper::GetPlayerCharacterAsSoCharacter(this);\n\tSoController = SoCharacter->GetSoPlayerController();\n\tSoSheet = SoCharacter->GetPlayerCharacterSheet();\n\tverify(SoCharacter);\n\tverify(SoController);\n\tverify(SoSheet);\n\n\tTooltipSelect->SetUICommand(ESoUICommand::EUC_SpellSelect);\n\tTooltipSelectAndCast->SetUICommand(ESoUICommand::EUC_SpellSelectAndCast);\n\tSubscribeToDeviceChanged();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISpellCastSwitch::NativeDestruct()\n{\n\tUnSubscribeFromDeviceChanged();\n\tSoCharacter = nullptr;\n\tSoController = nullptr;\n\tSuper::NativeDestruct();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoUISpellCastSwitch::SetInGameActivityEnabled_Implementation(UObject *Source, bool bEnable)\n{\n\tif (bEnable && bOpened)\n\t{\n\t\tUE_LOG(LogSoUIActivity, Warning, TEXT(\"SpellCastSwitch reject, already opened\"));\n\t\treturn true;\n\t}\n\n\tSetOpen(bEnable);\n\treturn bOpened;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoUISpellCastSwitch::HandleCommand_Implementation(ESoUICommand Command)\n{\n\tif (!bOpened)\n\t\treturn true;\n\n\tif (!bIgnoredFirstUICommand && Command == ESoUICommand::EUC_SpellSelect)\n\t{\n\t\tbIgnoredFirstUICommand = true;\n\t\treturn true;\n\t}\n\n\tconst bool bMultipleCommandsPressed = SoCharacter->GetNumUIInputsPressed() >= 2;\n\tbool bSpellKeyboardQuickCommand = false;\n\n\tint32 NewIndex = CurrentCircleSpellSlotIndex;\n\tswitch (Command)\n\t{\n\tcase ESoUICommand::EUC_Left:\n\t\tif (!bQuickSelectionMode)\n\t\t\tNewIndex = USoMathHelper::WrapIndexAround(CurrentCircleSpellSlotIndex - 1, CircleLinearSpellsForEquipped.Num());\n\t\tbreak;\n\n\tcase ESoUICommand::EUC_Right:\n\t\tif (!bQuickSelectionMode)\n\t\t\tNewIndex = USoMathHelper::WrapIndexAround(CurrentCircleSpellSlotIndex + 1, CircleLinearSpellsForEquipped.Num());\n\t\tbreak;\n\n\tcase ESoUICommand::EUC_Up:\n\t\tif (!bQuickSelectionMode)\n\t\t\tNewIndex = USoMathHelper::WrapIndexAround(CurrentCircleSpellSlotIndex - 1, CircleLinearSpellsForEquipped.Num());\n\t\tbreak;\n\n\tcase ESoUICommand::EUC_Down:\n\t\tif (!bQuickSelectionMode)\n\t\t\tNewIndex = USoMathHelper::WrapIndexAround(CurrentCircleSpellSlotIndex + 1, CircleLinearSpellsForEquipped.Num());\n\t\tbreak;\n\n\tcase ESoUICommand::EUC_SpellLeft:\n\t\tif (!bQuickSelectionMode)\n\t\t{\n\t\t\tbSpellKeyboardQuickCommand = true;\n\t\t\tNewIndex = GetCircleIndexForSpellSlot(Slot_W);\n\t\t}\n\t\tbreak;\n\n\tcase ESoUICommand::EUC_SpellRight:\n\t\tif (!bQuickSelectionMode)\n\t\t{\n\t\t\tbSpellKeyboardQuickCommand = true;\n\t\t\tNewIndex = GetCircleIndexForSpellSlot(Slot_E);\n\t\t}\n\t\tbreak;\n\n\tcase ESoUICommand::EUC_SpellUp:\n\t\tif (!bQuickSelectionMode)\n\t\t{\n\t\t\tbSpellKeyboardQuickCommand = true;\n\t\t\tNewIndex = GetCircleIndexForSpellSlot(Slot_N);\n\t\t}\n\t\tbreak;\n\n\tcase ESoUICommand::EUC_SpellDown:\n\t\tif (!bQuickSelectionMode)\n\t\t{\n\t\t\tbSpellKeyboardQuickCommand = true;\n\t\t\tNewIndex = GetCircleIndexForSpellSlot(Slot_S);\n\t\t}\n\t\tbreak;\n\n\tcase ESoUICommand::EUC_SpellSelectAndCast:\n\t\tSetOpen(false);\n\n\t\t// Cast the spell\n\t\tif (SoSheet->CanCastActiveSpell())\n\t\t{\n\t\t\tSoSheet->UseActiveRuneStoneIfCastable();\n\t\t\tSoSheet->OnItemUsed.Broadcast();\n\n\t\t\t// Disable hint usage\n\t\t\tIDlgDialogueParticipant::Execute_ModifyBoolValue(SoCharacter, SpellSelectedAndCastedName, true);\n\n\t\t\tUSoAudioManager::PlaySound2D(this, SFXSelectAndCast);\n\t\t}\n\t\tbreak;\n\n\tcase ESoUICommand::EUC_SpellSelect:\n\t\tSetOpen(false);\n\t\tif (SoSheet->CanCastActiveSpell())\n\t\t{\n\t\t\t// Disable hint usage\n\t\t\tIDlgDialogueParticipant::Execute_ModifyBoolValue(SoCharacter, SpellSelectedName, true);\n\t\t\tUSoAudioManager::PlaySound2D(this, SFXSelect);\n\t\t}\n\t\tbreak;\n\n\tcase ESoUICommand::EUC_MainMenuBack:\n\t\tSetOpen(false);\n\t\tbreak;\n\n\tdefault:\n\t\tbreak;\n\t}\n\n\tif (bSpellKeyboardQuickCommand)\n\t{\n\t\t// Check diagonals\n\t\tif (bMultipleCommandsPressed)\n\t\t{\n\t\t\tif (SoCharacter->AreUIInputsPressed({ ESoUICommand::EUC_SpellUp, ESoUICommand::EUC_SpellLeft }))\n\t\t\t\tNewIndex = GetCircleIndexForSpellSlot(Slot_NW);\n\t\t\telse if (SoCharacter->AreUIInputsPressed({ ESoUICommand::EUC_SpellUp, ESoUICommand::EUC_SpellRight }))\n\t\t\t\tNewIndex = GetCircleIndexForSpellSlot(Slot_NE);\n\t\t\telse if (SoCharacter->AreUIInputsPressed({ ESoUICommand::EUC_SpellDown, ESoUICommand::EUC_SpellLeft }))\n\t\t\t\tNewIndex = GetCircleIndexForSpellSlot(Slot_SW);\n\t\t\telse if (SoCharacter->AreUIInputsPressed({ ESoUICommand::EUC_SpellDown, ESoUICommand::EUC_SpellRight }))\n\t\t\t\tNewIndex = GetCircleIndexForSpellSlot(Slot_SE);\n\t\t}\n\n\t\t// Disable hint usage for the next time the panel is open\n\t\tif (SoController->GetCurrentDeviceType() == ESoInputDeviceType::Keyboard)\n\t\t{\n\t\t\tIDlgDialogueParticipant::Execute_ModifyBoolValue(SoCharacter, KeyboardQuickSelectSpellsName, true);\n\t\t}\n\t}\n\n\t// Move focus\n\tif (NewIndex != CurrentCircleSpellSlotIndex)\n\t{\n\t\tUSoAudioManager::PlaySound2D(this, SFXNavigate);\n\t\tSetCurrentCircleSpellIndex(NewIndex);\n\t}\n\n\treturn true;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoUISpellCastSwitch::Update_Implementation(float DeltaSeconds)\n{\n\t// Gamepad right thumb stick\n\tconst bool bUsingRightAxis = SoCharacter->IsUsingRightThumbStick();\n\t// const bool bUsingLeftAxis = SoCharacter->IsUsingLeftThumbStick();\n\tif (bOpened && bUsingRightAxis)\n\t{\n\t\tTickShouldCloseQuickSelectionStart = 0.f;\n\t\t//bFastChangingNeighbour = CountChanges >= 2;\n\t\t//if (bFastChangingNeighbour)\n\t\t//\tCountChanges = 0;\n\n\t\t// https://en.wikipedia.org/wiki/Atan2#/media/File:Atan2_60.svg\n\t\t// Normalize to top values are negative and bottom values are positive\n\n\t\t// Already normalized\n\t\tconst float DirectionDegrees = SoCharacter->GetGamepadRightDirectionDegrees();\n\t\tconst float DifferenceFromPreviousTick = FMath::Abs(FMath::FindDeltaAngleDegrees(DirectionDegrees, PreviousTickDirectionDegrees));\n\t\tPreviousTickDirectionDegrees = DirectionDegrees;\n\n\t\t// Split in 8 parts, so 45 degrees, we verify in both directions\n\t\t// 0, 45, -45, 90, -90, 135, -135, -180 == 180\n\n\t\t// Normally it would have been 45.f / 2.f but this does not leave room distance between spell\n\t\t//static constexpr float DirectionDelta = 45.f / 7.5f;\n\t\t//static constexpr float DirectionDeltaDiagonals = 45.f / 4.f;\n\n\t\tstatic constexpr float DirectionDelta = 45.f / 4.f;\n\t\tstatic constexpr float DirectionDeltaDiagonals = 45.f / 2.f;\n\n\t\t// Prevent snapping\n\t\tstatic constexpr float ThresholdSnap = DirectionDelta * 3.f;\n\t\tif (DifferenceFromPreviousTick > ThresholdSnap)\n\t\t{\n\t\t\t// Early exit\n\t\t\tstatic constexpr int32 Frames = 2;\n\t\t\tif (!SoCharacter->IsUsingRightThumbStickWithSameValueForAtLeastFrames(Frames))\n\t\t\t{\n\t/*\t\t\tif (!bFastChangingNeighbour)\n\t\t\t\t{\n\t\t\t\t\tUE_LOG(LogTemp, Warning, TEXT(\"USoUISpellCastSwitch Ignoring because bFastChangingNeighbour = %d AND CountChanges = %d\"), bFastChangingNeighbour, CountChanges);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{*/\n\t\t\t\t\t//UE_LOG(LogTemp, Warning, TEXT(\"USoUISpellCastSwitch Ignoring because DifferenceFromPreviousTick (%f) > ThresholdSnap (%f)\"), DifferenceFromPreviousTick, ThresholdSnap);\n\t\t\t\t//}\n\t\t\t\treturn bOpened;\n\t\t\t}\n\t\t}\n\n\t\tstatic constexpr float Degrees_E = 0.f;\n\t\tstatic constexpr float Degrees_SE = 45.f;\n\t\tstatic constexpr float Degrees_S = 90.f;\n\t\tstatic constexpr float Degrees_SW = 135.f;\n\t\tstatic constexpr float Degrees_W = 180.f;\n\n\t\tstatic constexpr float Degrees_NW = -Degrees_SW;\n\t\tstatic constexpr float Degrees_N = -Degrees_S;\n\t\tstatic constexpr float Degrees_NE = -Degrees_SE;\n\n\t\tint32 NewIndex = CurrentCircleSpellSlotIndex;\n\t\tif (USoMathHelper::IsInClosedInterval(DirectionDegrees, Degrees_N - DirectionDelta, Degrees_N + DirectionDelta))\n\t\t{\n\t\t\tNewIndex = GetCircleIndexForSpellSlot(Slot_N);\n\t\t}\n\t\telse if (USoMathHelper::IsInClosedInterval(DirectionDegrees, Degrees_NE - DirectionDeltaDiagonals, Degrees_NE + DirectionDeltaDiagonals))\n\t\t{\n\t\t\tNewIndex = GetCircleIndexForSpellSlot(Slot_NE);\n\t\t}\n\t\telse if (USoMathHelper::IsInClosedInterval(DirectionDegrees, Degrees_E - DirectionDelta, Degrees_E + DirectionDelta))\n\t\t{\n\t\t\tNewIndex = GetCircleIndexForSpellSlot(Slot_E);\n\t\t}\n\t\telse if (USoMathHelper::IsInClosedInterval(DirectionDegrees, Degrees_SE - DirectionDeltaDiagonals, Degrees_SE + DirectionDeltaDiagonals))\n\t\t{\n\t\t\tNewIndex = GetCircleIndexForSpellSlot(Slot_SE);\n\t\t}\n\t\telse if (USoMathHelper::IsInClosedInterval(DirectionDegrees, Degrees_S - DirectionDelta, Degrees_S + DirectionDelta))\n\t\t{\n\t\t\tNewIndex = GetCircleIndexForSpellSlot(Slot_S);\n\t\t}\n\t\telse if (USoMathHelper::IsInClosedInterval(DirectionDegrees, Degrees_SW - DirectionDeltaDiagonals, Degrees_SW + DirectionDeltaDiagonals))\n\t\t{\n\t\t\tNewIndex = GetCircleIndexForSpellSlot(Slot_SW);\n\t\t}\n\t\telse if (USoMathHelper::IsInClosedInterval(DirectionDegrees, Degrees_NW - DirectionDeltaDiagonals, Degrees_NW + DirectionDeltaDiagonals))\n\t\t{\n\t\t\tNewIndex = GetCircleIndexForSpellSlot(Slot_NW);\n\t\t}\n\n\t\t// Check both variants -180 and 180\n\t\telse if (USoMathHelper::IsInClosedInterval(DirectionDegrees, Degrees_W - DirectionDelta, Degrees_W + DirectionDelta)\n\t\t\t|| USoMathHelper::IsInClosedInterval(DirectionDegrees, -Degrees_W - DirectionDelta, -Degrees_W + DirectionDelta))\n\t\t{\n\t\t\tNewIndex = GetCircleIndexForSpellSlot(Slot_W);\n\t\t}\n\n\t\tif (NewIndex != CurrentCircleSpellSlotIndex)\n\t\t\tUSoAudioManager::PlaySound2D(this, SFXNavigate);\n\n\t\tSetCurrentCircleSpellIndex(NewIndex);\n\t}\n\telse\n\t{\n\t\t// Not using thumbstick\n\t\tCountChanges = 0;\n\t\tbFastChangingNeighbour = false;\n\n\t\tif (bQuickSelectionMode && bOpened)\n\t\t{\n\t\t\t// NOTE: we don't use here the delta as the time is dilated\n\t\t\tif (FMath::IsNearlyZero(TickShouldCloseQuickSelectionStart))\n\t\t\t{\n\t\t\t\t// First Time\n\t\t\t\tTickShouldCloseQuickSelectionStart = GetWorld()->GetRealTimeSeconds();\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t// Can we close it already?\n\t\t\t\tconst float TimePassed = GetWorld()->GetRealTimeSeconds() - TickShouldCloseQuickSelectionStart;\n\t\t\t\tif (TimePassed > ThresholdShouldCloseQuickSelection)\n\t\t\t\t\tSetOpen(false);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn bOpened;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISpellCastSwitch::SetQuickSelectionMode(bool bInValue)\n{\n\tbQuickSelectionMode = bInValue;\n\n\t// Don't ignore if quick selection mode\n\tbIgnoredFirstUICommand = bQuickSelectionMode;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISpellCastSwitch::SetOpen(bool bOpen)\n{\n\tif (bOpened == bOpen)\n\t\treturn;\n\n\tUSoAudioManager::PlaySound2D(this, bOpen ? SFXOnOpen : SFXOnClose);\n\n\tbOpened = bOpen;\n\tTickShouldCloseQuickSelectionStart = 0.f;\n\n\tUSoAudioManager::Get(this).SetPlaybackSpeed(\n\t\tbOpen ? AudioSpeedMultiplier : 1.0f,\n\t\tbOpen ? AudioSlowDownTimeIn : AudioSlowDownTimeOut\n\t);\n\n\tif (bOpened)\n\t{\n\t\t// Open\n\t\tTickOpenAgainQuickSelectionStart = 0.f;\n\n\t\t// Figure out if there is a key conflict between ToggleSpell and SpellSelect for a keyboard\n\t\tconst bool bIsThereAKeyConflict = USoGameSettings::Get().DoActionNamesHaveTheSameKey(\n\t\t\tFSoInputActionName::ToggleSpell,\n\t\t\tFSoInputActionName::UICommandToActionName(ESoUICommand::EUC_SpellSelect),\n\t\t\ttrue\n\t\t);\n\n\t\tif (USoInputHelper::IsLastInputFromKeyboard(this))\n\t\t\t// Keyboard\n\t\t\t// NOTE: does not have have quick selection mode\n\t\t\tbIgnoredFirstUICommand = !bIsThereAKeyConflict;\n\t\telse\n\t\t\t// Gamepad, in quick selection mode we don't ignore the first UI command\n\t\t\tbIgnoredFirstUICommand = bQuickSelectionMode;\n\n\t\tUSoGameSettings::Get().SetTemporaryGameSpeed(0.1f);\n\t\tReinitializeSpells();\n\t}\n\telse\n\t{\n\t\t// Close\n\t\tTickOpenAgainQuickSelectionStart = GetWorld()->GetRealTimeSeconds();\n\n\t\t// Reset game speed to setting values\n\t\tUSoGameSettings::Get().ApplyGameSettings(true);\n\n\t\t// Sync spell index\n\t\tSoSheet->SetActiveSpellIndex(ConvertCircleSpellIndexToTrueIndex(CurrentCircleSpellSlotIndex));\n\t}\n\n\tSetVisibility(bOpened ? ESlateVisibility::Visible : ESlateVisibility::Collapsed);\n\tUpdateHintsVisibilities();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoUISpellCastSwitch::CanBeOpened() const\n{\n\tconst float TimePassed = GetWorld()->GetRealTimeSeconds() - TickOpenAgainQuickSelectionStart;\n\tconst bool bResult = TimePassed > ThresholdOpenAgainQuickSelection;\n\t//if (!bResult)\n\t//\tUE_LOG(LogTemp, Warning, TEXT(\"CanBeOpened = false, TickOpenAgainQuickSelectionStart = %f, TimePassed = %f, ThresholdOpenAgainQuickSelection = %f\"),\n\t//\t\tTickOpenAgainQuickSelectionStart, TimePassed, ThresholdOpenAgainQuickSelection);\n\n\treturn bResult;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nint32 USoUISpellCastSwitch::ConvertCircleSpellIndexToTrueIndex(int32 CircleSlotIndex) const\n{\n\tif (!CircleLinearSpellsForEquipped.IsValidIndex(CircleSlotIndex))\n\t\treturn INDEX_NONE;\n\n\tconst USoUISpellCastSwitchSlot* SpellSlot = CircleLinearSpellsForEquipped[CircleSlotIndex];\n\tif (SpellSlot == nullptr)\n\t\treturn INDEX_NONE;\n\n\treturn GetTrueIndexForSpellSlot(SpellSlot);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nint32 USoUISpellCastSwitch::ConvertTrueIndexToCircleSpellIndex(int32 TrueIndex) const\n{\n\tif (!SpellsForEquipped.IsValidIndex(TrueIndex))\n\t\treturn INDEX_NONE;\n\n\tconst USoUISpellCastSwitchSlot* SpellSlot = SpellsForEquipped[TrueIndex];\n\tif (SpellSlot == nullptr)\n\t\treturn INDEX_NONE;\n\n\treturn GetCircleIndexForSpellSlot(SpellSlot);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nint32 USoUISpellCastSwitch::GetCircleIndexForSpellSlot(const USoUISpellCastSwitchSlot* SpellSlot) const\n{\n\tfor (int32 Index = 0; Index < CircleLinearSpellsForEquipped.Num(); Index++)\n\t\tif (CircleLinearSpellsForEquipped[Index] == SpellSlot)\n\t\t\treturn Index;\n\n\treturn INDEX_NONE;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nint32 USoUISpellCastSwitch::GetTrueIndexForSpellSlot(const USoUISpellCastSwitchSlot* SpellSlot) const\n{\n\tfor (int32 Index = 0; Index < SpellsForEquipped.Num(); Index++)\n\t\tif (SpellsForEquipped[Index] == SpellSlot)\n\t\t\treturn Index;\n\n\treturn INDEX_NONE;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISpellCastSwitch::ReinitializeSpells()\n{\n\t// Match the indices from character sheet\n\tSpellsForEquipped = {\n\t\tSlot_N, Slot_E, Slot_S, Slot_W, Slot_NW, Slot_NE, Slot_SE, Slot_SW\n\t};\n\n\t// Circle clockwise order\n\tCircleLinearSpellsForEquipped = {\n\t\tSlot_N, Slot_NE, Slot_E, Slot_SE, Slot_S, Slot_SW, Slot_W, Slot_NW\n\t};\n\n\t// Reset\n\tfor (USoUISpellCastSwitchSlot* SpellSlot : CircleLinearSpellsForEquipped)\n\t\tSpellSlot->Reset();\n\n\tconst int32 CurrentTrueIndex = SoSheet->GetActiveSpellIndex();\n\n\tconst TArray<FSoItem>& EquippedRuneStones = SoSheet->GetEquippedSpells();\n\tfor (int32 Index = 0; Index < EquippedRuneStones.Num() && Index < SpellsForEquipped.Num(); Index++)\n\t{\n\t\tconst FSoItem& RuneStone = EquippedRuneStones[Index];\n\t\tconst USoItemTemplateRuneStone* SpellTemplate = RuneStone.GetTemplateAsRuneStone();\n\t\tSpellsForEquipped[Index]->SetSpell(SpellTemplate);\n\n\t\tif (Index == CurrentTrueIndex)\n\t\t{\n\t\t\tSpellsForEquipped[Index]->SetSelected(true);\n\t\t}\n\t}\n\n\tSetCurrentCircleSpellIndex(ConvertTrueIndexToCircleSpellIndex(CurrentTrueIndex), true);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISpellCastSwitch::SetCurrentCircleSpellIndex(int32 NewSpellIndex, bool bForce)\n{\n\t// Same index, ignore\n\tif (!bForce && (CurrentCircleSpellSlotIndex == NewSpellIndex || !CircleLinearSpellsForEquipped.IsValidIndex(NewSpellIndex)))\n\t\treturn;\n\n\tCountChanges++;\n\tCircleLinearSpellsForEquipped[CurrentCircleSpellSlotIndex]->SetSelected(false);\n\tCircleLinearSpellsForEquipped[NewSpellIndex]->SetSelected(true);\n\tCurrentCircleSpellSlotIndex = NewSpellIndex;\n\n\t// Set text for spell\n\tif (SelectedSpellNameText)\n\t{\n\t\tif (const USoItemTemplateRuneStone* Currentspell = CircleLinearSpellsForEquipped[CurrentCircleSpellSlotIndex]->GetSpell())\n\t\t\tSelectedSpellNameText->SetText(Currentspell->GetItemName());\n\t\telse\n\t\t\tSelectedSpellNameText->SetText(FText::GetEmpty());\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISpellCastSwitch::UpdateHintsVisibilities()\n{\n\tconst bool bWasSelectHintDisplayed = IDlgDialogueParticipant::Execute_GetBoolValue(SoCharacter, SpellSelectedName);\n\tconst bool bWasSelectAndCastHintDisplayed = IDlgDialogueParticipant::Execute_GetBoolValue(SoCharacter, SpellSelectedAndCastedName);\n\tconst bool bWasKeyboardQuickSelectionDisplayed = IDlgDialogueParticipant::Execute_GetBoolValue(SoCharacter, KeyboardQuickSelectSpellsName);\n\tconst bool bCanCastActiveSpell = SoSheet->CanCastActiveSpell();\n\n\tTooltipSelect->SetVisibility(!bWasSelectHintDisplayed && bCanCastActiveSpell ? ESlateVisibility::Visible : ESlateVisibility::Collapsed);\n\tTooltipSelectAndCast->SetVisibility(!bWasSelectAndCastHintDisplayed && bCanCastActiveSpell ? ESlateVisibility::Visible : ESlateVisibility::Collapsed);\n\n\tif (SoController->GetCurrentDeviceType() == ESoInputDeviceType::Keyboard)\n\t{\n\t\tKeyboardShortcutsContainer->SetVisibility(!bWasKeyboardQuickSelectionDisplayed ? ESlateVisibility::Visible : ESlateVisibility::Collapsed);\n\t}\n\telse\n\t{\n\t\tKeyboardShortcutsContainer->SetVisibility(ESlateVisibility::Collapsed);\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISpellCastSwitch::HandleDeviceTypeChanged(ESoInputDeviceType InDeviceType)\n{\n\tUpdateHintsVisibilities();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISpellCastSwitch::SubscribeToDeviceChanged()\n{\n\tSoController->OnDeviceTypeChanged().AddUniqueDynamic(this, &Self::HandleDeviceTypeChanged);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISpellCastSwitch::UnSubscribeFromDeviceChanged()\n{\n\tSoController->OnDeviceTypeChanged().RemoveDynamic(this, &Self::HandleDeviceTypeChanged);\n}\n"
  },
  {
    "path": "Source/SOrb/UI/InGame/Spells/SoUISpellCastSwitch.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#pragma once\n\n#include \"CoreMinimal.h\"\n#include \"UI/InGame/SoUIGameActivity.h\"\n\n#include \"SoUISpellCastSwitch.generated.h\"\n\nclass USoUISpellCastSwitchSlot;\nclass UTextBlock;\nclass ASoCharacter;\nclass ASoPlayerController;\nclass USoUICommandTooltip;\nclass UCanvasPanel;\nclass USoPlayerCharacterSheet;\nclass UWorld;\nclass UFMODEvent;\nclass USoItemTemplateRuneStone;\n\n\n/** Quick spell cast switch */\nUCLASS()\nclass SORB_API USoUISpellCastSwitch : public USoInGameUIActivity\n{\n\tGENERATED_BODY()\n\ttypedef USoUISpellCastSwitch Self;\npublic:\n\tvoid SetQuickSelectionMode(bool bInValue);\n\tbool CanBeOpened() const;\n\nprotected:\n\t// Begin UUserWidget Interface\n\tvoid NativeTick(const FGeometry& MyGeometry, float InDeltaTime) override;\n\tvoid NativeConstruct() override;\n\tvoid NativeDestruct() override;\n\t// End UUserWidget Interface\n\n\t// Begin USoInGameUIActivity Interface\n\tbool SetInGameActivityEnabled_Implementation(UObject *Source, bool bEnable) override;\n\tbool HandleCommand_Implementation(ESoUICommand Command) override;\n\tbool Update_Implementation(float DeltaSeconds) override;\n\tbool IsOpened_Implementation() const override { return bOpened; }\n\tbool IsActiveInPausedGame_Implementation() const override { return true; }\n\tbool IsActiveInDilatedTime_Implementation(float CurrentTimeDilation) const override { return true; }\n\t// End USoInGameUIActivity Interface\n\n\tvoid SetOpen(bool bOpen);\n\n\tint32 ConvertCircleSpellIndexToTrueIndex(int32 CircleSlotIndex) const;\n\tint32 ConvertTrueIndexToCircleSpellIndex(int32 TrueIndex) const;\n\n\tint32 GetCircleIndexForSpellSlot(const USoUISpellCastSwitchSlot* SpellSlot) const;\n\tint32 GetTrueIndexForSpellSlot(const USoUISpellCastSwitchSlot* SpellSlot) const;\n\n\tvoid ReinitializeSpells();\n\tvoid SetCurrentCircleSpellIndex(int32 NewSpellIndex, bool bForce = false);\n\n\tvoid UpdateHintsVisibilities();\n\n\tUFUNCTION()\n\tvoid HandleDeviceTypeChanged(ESoInputDeviceType InDeviceType);\n\n\tvoid SubscribeToDeviceChanged();\n\tvoid UnSubscribeFromDeviceChanged();\n\nprotected:\n\tfloat PreviousTickDirectionDegrees = 0.f;\n\n\t// Are we fast changing\n\tbool bFastChangingNeighbour = false;\n\n\t// How many times did we skip\n\tint32 CountChanges = 0;\n\n\t// Is this still opened\n\tbool bOpened = false;\n\n\t// HACK: pls fix me\n\tbool bIgnoredFirstUICommand = false;\n\n\t// Means this was opened by moving the right thumbstick\n\tbool bQuickSelectionMode = false;\n\n\t// When we close it timers\n\tfloat TickShouldCloseQuickSelectionStart = 0.f;\n\n\t// When we allow to open again quickly\n\tfloat TickOpenAgainQuickSelectionStart = 0.f;\n\n\tstatic constexpr float ThresholdShouldCloseQuickSelection = 0.2f;\n\tstatic constexpr float ThresholdOpenAgainQuickSelection = 0.3f;\n\n\t// NOTE: This is not the same as, it must be converted to that ActiveEquippedRuneStoneIndex\n\t// NOTE: Index for CircleLinearSpellsForEquipped\n\tint32 CurrentCircleSpellSlotIndex = 0;\n\n\t// NOTE: The order here is the same as the circler order, clockwise starting from N\n\tUPROPERTY(BlueprintReadWrite, Category = \">Runtime\")\n\tTArray<USoUISpellCastSwitchSlot*> CircleLinearSpellsForEquipped;\n\n\t// Our custom order\n\t// Index: Equipped spell index from EquippedRuneStones\n\t// Value: Our Slot\n\tUPROPERTY(BlueprintReadWrite, Category = \">Runtime\")\n\tTArray<USoUISpellCastSwitchSlot*> SpellsForEquipped;\n\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\", meta = (BindWidget))\n\tUTextBlock* SelectedSpellNameText;\n\n\t// cardinal coordinates of of all eight slots\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\", meta = (BindWidget))\n\tUSoUISpellCastSwitchSlot* Slot_N;\n\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\", meta = (BindWidget))\n\tUSoUISpellCastSwitchSlot* Slot_S;\n\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\", meta = (BindWidget))\n\tUSoUISpellCastSwitchSlot* Slot_E;\n\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\", meta = (BindWidget))\n\tUSoUISpellCastSwitchSlot* Slot_W;\n\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\", meta = (BindWidget))\n\tUSoUISpellCastSwitchSlot* Slot_SW;\n\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\", meta = (BindWidget))\n\tUSoUISpellCastSwitchSlot* Slot_SE;\n\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\", meta = (BindWidget))\n\tUSoUISpellCastSwitchSlot* Slot_NW;\n\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\", meta = (BindWidget))\n\tUSoUISpellCastSwitchSlot* Slot_NE;\n\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\", meta = (BindWidget))\n\tUSoUICommandTooltip* TooltipSelect;\n\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\", meta = (BindWidget))\n\tUSoUICommandTooltip* TooltipSelectAndCast;\n\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\", meta = (BindWidget))\n\tUCanvasPanel* KeyboardShortcutsContainer;\n\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere, Category = \">Options\")\n\tFName SpellSelectedName = TEXT(\"UISpellCastSelectedName\");\n\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere, Category = \">Options\")\n\tFName SpellSelectedAndCastedName = TEXT(\"UISpellCastSelectedAndCastedName\");\n\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere, Category = \">Options\")\n\tFName KeyboardQuickSelectSpellsName = TEXT(\"UIKeyboardQuickSelectSpellsName\");\n\n\t// Cached properties\n\tUPROPERTY()\n\tASoCharacter* SoCharacter = nullptr;\n\n\tUPROPERTY()\n\tASoPlayerController* SoController = nullptr;\n\n\tUPROPERTY()\n\tUSoPlayerCharacterSheet* SoSheet = nullptr;\n\n\t//\n\t// Audio\n\t//\n\n\tUPROPERTY(EditAnywhere, Category = \">SFX\")\n\tfloat AudioSpeedMultiplier = 0.5f;\n\n\tUPROPERTY(EditAnywhere, Category = \">SFX\")\n\tfloat AudioSlowDownTimeIn = 0.1f;\n\n\tUPROPERTY(EditAnywhere, Category = \">SFX\")\n\tfloat AudioSlowDownTimeOut = 0.1f;\n\n\t//\n\t// SFX\n\t//\n\n\tUPROPERTY(EditAnywhere, Category = \">SFX\")\n\tUFMODEvent* SFXOnOpen = nullptr;\n\n\tUPROPERTY(EditAnywhere, Category = \">SFX\")\n\tUFMODEvent* SFXOnClose = nullptr;\n\n\tUPROPERTY(EditAnywhere, Category = \">SFX\")\n\tUFMODEvent* SFXSelect = nullptr;\n\n\tUPROPERTY(EditAnywhere, Category = \">SFX\")\n\tUFMODEvent* SFXSelectAndCast = nullptr;\n\n\tUPROPERTY(EditAnywhere, Category = \">SFX\")\n\tUFMODEvent* SFXNavigate = nullptr;\n};\n"
  },
  {
    "path": "Source/SOrb/UI/InGame/Spells/SoUISpellCastSwitchSlot.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#include \"SoUISpellCastSwitchSlot.h\"\n\n#include \"Components/Image.h\"\n#include \"Components/TextBlock.h\"\n\n#include \"Basic/Helpers/SoStaticHelper.h\"\n#include \"Items/ItemTemplates/SoItemTemplateRuneStone.h\"\n#include \"Character/SoCharacter.h\"\n#include \"CharacterBase/SoCharacterBase.h\"\n#include \"CharacterBase/SoCharacterMovementComponent.h\"\n#include \"Character/SoPlayerCharacterSheet.h\"\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISpellCastSwitchSlot::NativeConstruct()\n{\n\tSuper::NativeConstruct();\n\tUpdateFromState();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISpellCastSwitchSlot::NativeDestruct()\n{\n\tUnsubscribeFromEvents();\n\tSuper::NativeDestruct();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISpellCastSwitchSlot::SetSelected(bool bSelected)\n{\n\tbIsSelected = bSelected;\n\tUpdateFromState();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISpellCastSwitchSlot::SetSpell(const USoItemTemplateRuneStone* InActiveItem)\n{\n\tActiveSpell = InActiveItem;\n\tUpdateFromState();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISpellCastSwitchSlot::Reset()\n{\n\tActiveSpell = nullptr;\n\tbIsSelected = false;\n\tUpdateFromState();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISpellCastSwitchSlot::UpdateFromState()\n{\n\tif (ActiveSpell)\n\t{\n\t\tSubscribeToEvents();\n\t\tRefreshActiveSpellState();\n\t\tBackground->SetBrushFromTexture(SpellBackground);\n\t\tIcon->SetVisibility(ESlateVisibility::Visible);\n\t\tIcon->SetBrushFromTexture(ActiveSpell->GetIcon());\n\t\tBorder->SetColorAndOpacity(bIsSelected ? ActiveSelectedBorderColor : ActiveUnSelectedBorderColor);\n\t}\n\telse\n\t{\n\t\tUnsubscribeFromEvents();\n\t\tBackground->SetBrushFromTexture(EmptyBackground);\n\t\tIcon->SetVisibility(ESlateVisibility::Collapsed);\n\t\tAmountText->SetVisibility(ESlateVisibility::Collapsed);\n\t\tInactiveFade->SetVisibility(ESlateVisibility::Collapsed);\n\t\tBorder->SetColorAndOpacity(bIsSelected ? InActiveSelectedBorderColor : InActiveUnSelectedBorderColor);\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISpellCastSwitchSlot::SubscribeToEvents()\n{\n\tif (ASoCharacter* SoCharacter = USoStaticHelper::GetPlayerCharacterAsSoCharacter(this))\n\t{\n\t\tSoCharacter->OnCooldownStarted().AddUniqueDynamic(this, &Self::OnCooldownChanged);\n\t\tSoCharacter->OnCooldownEnded().AddUniqueDynamic(this, &Self::OnCooldownChanged);\n\t\tSoCharacter->OnMovementModeChangedNotify.AddUniqueDynamic(this, &Self::OnSpellUsabilityMightChanged);\n\t\tSoCharacter->OnCanUseSoulKeeperChanged().AddUniqueDynamic(this, &Self::OnSpellUsabilityMightChanged);\n\t\t//SoCharacter->GetPlayerCharacterSheet()->OnSelectedSpellChanged.AddDynamic(this, &Self::OnSelectedSpellChanged);\n\t\t//SoCharacter->GetPlayerCharacterSheet()->OnSelectedSpellSwitched.AddDynamic(this, &Self::OnSelectedSpellChanged);\n\t\t//SoCharacter->GetPlayerCharacterSheet()->OnSlotChanged.AddDynamic(this, &Self::OnCharacterItemSlotChanged);\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISpellCastSwitchSlot::UnsubscribeFromEvents()\n{\n\tif (ASoCharacter* SoCharacter = USoStaticHelper::GetPlayerCharacterAsSoCharacter(this))\n\t{\n\t\tSoCharacter->OnCooldownStarted().RemoveDynamic(this, &Self::OnCooldownChanged);\n\t\tSoCharacter->OnCooldownEnded().RemoveDynamic(this, &Self::OnCooldownChanged);\n\t\tSoCharacter->OnMovementModeChangedNotify.RemoveDynamic(this, &Self::OnSpellUsabilityMightChanged);\n\t\tSoCharacter->OnCanUseSoulKeeperChanged().RemoveDynamic(this, &Self::OnSpellUsabilityMightChanged);\n\t\t//SoCharacter->GetPlayerCharacterSheet()->OnSelectedSpellChanged.RemoveDynamic(this, &Self::OnSelectedSpellChanged);\n\t\t//SoCharacter->GetPlayerCharacterSheet()->OnSelectedSpellSwitched.RemoveDynamic(this, &Self::OnSelectedSpellChanged);\n\t\t//SoCharacter->GetPlayerCharacterSheet()->OnSlotChanged.RemoveDynamic(this, &Self::OnCharacterItemSlotChanged);\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISpellCastSwitchSlot::UpdateInactiveFadeVisibility()\n{\n\tif (!ActiveSpell)\n\t{\n\t\tInactiveFade->SetVisibility(ESlateVisibility::Collapsed);\n\t\treturn;\n\t}\n\n\tif (!InactiveFade)\n\t\treturn;\n\n\tconst ASoCharacter* SoCharacter = USoStaticHelper::GetPlayerCharacterAsSoCharacter(this);\n\tif (!SoCharacter)\n\t\treturn;\n\n\tconst bool bNotOnGroundBlocked = !ActiveSpell->bCanBeUsedInAir && !SoCharacter->GetSoMovement()->IsMovingOnGround();\n\tconst bool bNoSKZoneBlocked = !ActiveSpell->bCanBeUsedInSKFreeZone && !SoCharacter->CanUseSoulkeeperAtLocation();\n\tInactiveFade->SetVisibility((bCooldownBlocked || bRunOut || bNotOnGroundBlocked || bNoSKZoneBlocked) ? ESlateVisibility::Visible : ESlateVisibility::Collapsed);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISpellCastSwitchSlot::RefreshActiveSpellState()\n{\n\tif (ActiveSpell)\n\t{\n\t\tif (const ASoCharacter* SoCharacter = USoStaticHelper::GetPlayerCharacterAsSoCharacter(this))\n\t\t{\n\t\t\tif (const USoPlayerCharacterSheet* SoSheet = SoCharacter->GetPlayerCharacterSheet())\n\t\t\t{\n\t\t\t\t// Update spell text amount\n\t\t\t\tconst int32* AmountPtr = SoSheet->GetSpellMap().Find(ActiveSpell);\n\t\t\t\tAmountText->SetVisibility(AmountPtr ? ESlateVisibility::Visible : ESlateVisibility::Collapsed);\n\t\t\t\tbRunOut = false;\n\t\t\t\tif (AmountPtr)\n\t\t\t\t{\n\t\t\t\t\tbRunOut = *AmountPtr == 0;\n\t\t\t\t\tAmountText->SetText(FText::AsNumber(*AmountPtr, &FNumberFormattingOptions::DefaultNoGrouping()));\n\t\t\t\t}\n\n\t\t\t\t// Check if blocked\n\t\t\t\tbCooldownBlocked = false;\n\t\t\t\tfor (const auto& Cooldown : SoCharacter->GetCooldowns())\n\t\t\t\t\tif (Cooldown.Object == ActiveSpell)\n\t\t\t\t\t\tbCooldownBlocked = true;\n\t\t\t}\n\t\t}\n\t}\n\n\tUpdateInactiveFadeVisibility();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISpellCastSwitchSlot::OnCooldownChanged(int32 Index, float RemainingTime, const UObject* ObjectWithCooldown)\n{\n\tif (ActiveSpell && ActiveSpell == ObjectWithCooldown)\n\t{\n\t\tbCooldownBlocked = RemainingTime > 0.0f;\n\t\tUpdateInactiveFadeVisibility();\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISpellCastSwitchSlot::OnSpellUsabilityMightChanged()\n{\n\tif (ActiveSpell)\n\t\tUpdateInactiveFadeVisibility();\n}\n"
  },
  {
    "path": "Source/SOrb/UI/InGame/Spells/SoUISpellCastSwitchSlot.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#pragma once\n\n#include \"CoreMinimal.h\"\n#include \"Blueprint/UserWidget.h\"\n#include \"Items/ItemTemplates/SoItemTemplateRuneStone.h\"\n\n#include \"SoUISpellCastSwitchSlot.generated.h\"\n\nclass UImage;\nclass UTexture2D;\nclass UTextBlock;\nclass USoItemTemplateRuneStone;\n\nUCLASS(HideCategories = (Navigation), AutoCollapseCategories = (Performance, Clipping, Interaction, Input))\nclass SORB_API USoUISpellCastSwitchSlot : public UUserWidget\n{\n\tGENERATED_BODY()\n\ttypedef USoUISpellCastSwitchSlot Self;\npublic:\n\t// Begin UUserWidget Interface\n\tvoid NativeConstruct() override;\n\tvoid NativeDestruct() override;\n\t// End UUserWidget Interface\n\n\tvoid SetSelected(bool bSelected);\n\tvoid SetSpell(const USoItemTemplateRuneStone* InActiveItem);\n\tvoid Reset();\n\tvoid UpdateFromState();\n\n\tconst USoItemTemplateRuneStone* GetSpell() const { return ActiveSpell; }\n\nprotected:\n\tvoid SubscribeToEvents();\n\tvoid UnsubscribeFromEvents();\n\tvoid UpdateInactiveFadeVisibility();\n\n\tvoid RefreshActiveSpellState();\n\n\tUFUNCTION()\n\tvoid OnCooldownChanged(int32 Index, float RemainingTime, const UObject* ObjectWithCooldown);\n\n\tUFUNCTION()\n\tvoid OnSpellUsabilityMightChanged();\n\nprotected:\n\tUPROPERTY(BlueprintReadOnly, Category = \">Widgets\", meta = (BindWidget))\n\tUImage* Background = nullptr;\n\n\tUPROPERTY(BlueprintReadOnly, Category = \">Widgets\", meta = (BindWidget))\n\tUImage* Icon = nullptr;\n\n\tUPROPERTY(BlueprintReadOnly, Category = \">Widgets\", meta = (BindWidget))\n\tUImage* Border = nullptr;\n\n\tUPROPERTY(BlueprintReadOnly)\n\tbool bIsSelected = false;\n\n\t// Used only if an item is set\n\tUPROPERTY(BlueprintReadOnly, Category = \">Widgets\", meta = (BindWidget))\n\tUImage* InactiveFade = nullptr;\n\n\t// Used only if and item is set\n\tUPROPERTY(BlueprintReadOnly, Category = \">Widgets\", meta = (BindWidget))\n\tUTextBlock* AmountText = nullptr;\n\n\t// Used only if an item is set\n\tbool bRunOut = false;\n\tbool bCooldownBlocked = false;\n\n\t// Used only if selected and not empty\n\tUPROPERTY(BlueprintReadOnly, Category = \">Runtime\")\n\tconst USoItemTemplateRuneStone* ActiveSpell;\n\n\tUPROPERTY(EditAnywhere, Category = \">Slot\")\n\tUTexture2D* EmptyBackground;\n\n\tUPROPERTY(EditAnywhere, Category = \">Slot\")\n\tUTexture2D* SpellBackground;\n\n\tUPROPERTY(EditAnywhere, Category = \">Color\")\n\tFLinearColor ActiveSelectedBorderColor = FLinearColor::White;\n\n\tUPROPERTY(EditAnywhere, Category = \">Color\")\n\tFLinearColor ActiveUnSelectedBorderColor = FLinearColor::Black;\n\n\tUPROPERTY(EditAnywhere, Category = \">Color\")\n\tFLinearColor InActiveSelectedBorderColor = FLinearColor::White;\n\n\tUPROPERTY(EditAnywhere, Category = \">Color\")\n\tFLinearColor InActiveUnSelectedBorderColor = FLinearColor(0.f, 0.f, 0.f, 0.5f);\n};\n"
  },
  {
    "path": "Source/SOrb/UI/InGame/Spells/SoUISpellSelection.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#include \"SoUISpellSelection.h\"\n\n#include \"Components/WrapBox.h\"\n#include \"Components/HorizontalBox.h\"\n\n#include \"SoUISpellSlot.h\"\n#include \"Basic/Helpers/SoStaticHelper.h\"\n#include \"Basic/Helpers/SoMathHelper.h\"\n#include \"Character/SoCharacter.h\"\n#include \"Character/SoPlayerCharacterSheet.h\"\n#include \"Items/SoInventoryComponent.h\"\n#include \"Basic/SoAudioManager.h\"\n#include \"Items/ItemTemplates/SoItemTemplateRuneStone.h\"\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISpellSelection::NativeConstruct()\n{\n\tSuper::NativeConstruct();\n\tSetVisibility(ESlateVisibility::Collapsed);\n\n\tSelectedColIndex = 0;\n\tSelectedRowIndex = 0;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoUISpellSelection::SetInGameActivityEnabled_Implementation(UObject* Source, bool bEnable)\n{\n\tif (bEnable && bOpened)\n\t{\n\t\tUE_LOG(LogSoUIActivity, Warning, TEXT(\"SpellSelection request rejected, already opened\"));\n\t\treturn true;\n\t}\n\n\tbOpened = bEnable;\n\tSetVisibility(bOpened ? ESlateVisibility::Visible : ESlateVisibility::Collapsed);\n\n\tif (bOpened)\n\t{\n\t\tReinitialize();\n\t}\n\telse\n\t{\n\t\tif (bEditable)\n\t\t{\n\t\t\tWriteEquippedStonesToCharacterSheet();\n\t\t\tUSoAudioManager::PlaySound2D(this, SFXSpellPanelClosed);\n\t\t}\n\t}\n\n\treturn bOpened;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoUISpellSelection::HandleCommand_Implementation(ESoUICommand Command)\n{\n\tbool bHandledCommand = false;\n\tconst int32 OldIndex = CalculateIndex();\n\tswitch (Command)\n\t{\n\t\tcase ESoUICommand::EUC_Left:\n\t\tcase ESoUICommand::EUC_MainMenuLeft:\n\t\t\tbHandledCommand = true;\n\t\t\tSelectedColIndex = USoMathHelper::WrapIndexAround(SelectedColIndex - 1, ColNum);\n\t\t\tUSoAudioManager::PlaySound2D(this, SFXSpellSelectionSwitch);\n\t\t\tbreak;\n\n\t\tcase ESoUICommand::EUC_Right:\n\t\tcase ESoUICommand::EUC_MainMenuRight:\n\t\t\tbHandledCommand = true;\n\t\t\tSelectedColIndex = USoMathHelper::WrapIndexAround(SelectedColIndex + 1, ColNum);\n\t\t\tUSoAudioManager::PlaySound2D(this, SFXSpellSelectionSwitch);\n\t\t\tbreak;\n\n\t\tcase ESoUICommand::EUC_Up:\n\t\tcase ESoUICommand::EUC_MainMenuUp:\n\t\t\tbHandledCommand = true;\n\t\t\tSelectedRowIndex = USoMathHelper::WrapIndexAround(SelectedRowIndex - 1, RowNum);\n\t\t\tUSoAudioManager::PlaySound2D(this, SFXSpellSelectionSwitch);\n\t\t\tbreak;\n\n\t\tcase ESoUICommand::EUC_Down:\n\t\tcase ESoUICommand::EUC_MainMenuDown:\n\t\t\tbHandledCommand = true;\n\t\t\tSelectedRowIndex = USoMathHelper::WrapIndexAround(SelectedRowIndex + 1, RowNum);\n\t\t\tUSoAudioManager::PlaySound2D(this, SFXSpellSelectionSwitch);\n\t\t\tbreak;\n\n\t\tcase ESoUICommand::EUC_Action0:\n\t\t\tbHandledCommand = true;\n\t\t\tif (bEditable)\n\t\t\t\tEquipSelected();\n\t\t\tbreak;\n\n\t\tcase ESoUICommand::EUC_Action1:\n\t\t\tbHandledCommand = true;\n\t\t\tif (bEditable)\n\t\t\t\tUnequipSelected();\n\t\t\tbreak;\n\n\t\tcase ESoUICommand::EUC_MainMenuBack:\n\t\t\tif (!bEditable)\n\t\t\t\treturn false;\n\t\t\tbOpened = false;\n\t\t\tbHandledCommand = true;\n\t\tdefault:\n\t\t\tbreak;\n\t}\n\n\tconst int32 NewIndex = CalculateIndex();\n\tif (OldIndex != NewIndex)\n\t{\n\t\tbHandledCommand = true;\n\t\tif (USoUISpellSlot* SpellSlot = Cast<USoUISpellSlot>(SoWrapBox->GetChildAt(OldIndex)))\n\t\t\tSpellSlot->SetSelected(false);\n\n\t\tif (USoUISpellSlot* SpellSlot = Cast<USoUISpellSlot>(SoWrapBox->GetChildAt(NewIndex)))\n\t\t\tSpellSlot->SetSelected(true);\n\n\t\tOnSelectionChange(CurrentRuneStones.IsValidIndex(NewIndex) ? CurrentRuneStones[NewIndex] : nullptr, IsIndexEquipped(NewIndex));\n\t\tUpdateEquippedBorders();\n\t}\n\n\treturn bHandledCommand;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoUISpellSelection::Update_Implementation(float DeltaSeconds)\n{\n\treturn bOpened;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nint32 USoUISpellSelection::CalculateIndex() const\n{\n\treturn SelectedRowIndex * ColNum + SelectedColIndex;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoUISpellSelection::CanEquipSelected() const\n{\n\treturn CanEquip(CalculateIndex());\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoUISpellSelection::CanEquip(int32 Index) const\n{\n\tif (!CurrentRuneStones.IsValidIndex(Index) || CurrentRuneStones[Index] == nullptr)\n\t\treturn false;\n\n\treturn ((EquippedRuneStoneCapacity + CurrentRuneStones[Index]->CapacityCost <= MaxCapacity) &&\n\t\t(EquippedRuneStoneCount < EquippedContainer->GetChildrenCount() || HasOneEquipped(CurrentRuneStones[Index])));\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nint32 USoUISpellSelection::GetEquippedCount(USoItemTemplateRuneStone* RuneStone) const\n{\n\tfor (int32 Index = 0; Index < EquippedContainer->GetChildrenCount(); ++Index)\n\t\tif (USoUISpellSlot* SpellSlot = Cast<USoUISpellSlot>(EquippedContainer->GetChildAt(Index)))\n\t\t\tif (SpellSlot->GetItem() == RuneStone)\n\t\t\t{\n\t\t\t\treturn SpellSlot->GetAmount();\n\t\t\t}\n\n\treturn 0;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoUISpellSelection::HasOneEquipped(USoItemTemplateRuneStone* RuneStone, int32* IndexPtr) const\n{\n\tfor (int32 Index = 0; Index < EquippedContainer->GetChildrenCount(); ++Index)\n\t\tif (USoUISpellSlot* SpellSlot = Cast<USoUISpellSlot>(EquippedContainer->GetChildAt(Index)))\n\t\t\tif (SpellSlot->GetItem() == RuneStone)\n\t\t\t{\n\t\t\t\tif (IndexPtr != nullptr)\n\t\t\t\t\t*IndexPtr = Index;\n\t\t\t\treturn true;\n\t\t\t}\n\n\treturn false;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoUISpellSelection::IsIndexEquipped(int32 Index) const\n{\n\tif (Index >= 0 && Index < SoWrapBox->GetChildrenCount())\n\t\tif (USoUISpellSlot* SpellSlot = Cast<USoUISpellSlot>(SoWrapBox->GetChildAt(Index)))\n\t\t\treturn SpellSlot->IsEquipped();\n\n\treturn false;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISpellSelection::Reinitialize()\n{\n\tASoCharacter* SoCharacter = USoStaticHelper::GetPlayerCharacterAsSoCharacter(this);\n\tif (SoCharacter != nullptr)\n\t{\n\t\tEquippedRuneStoneCount = 0;\n\t\tEquippedRuneStoneCapacity = 0;\n\t\tMaxCapacity = SoCharacter->GetSpellsCapacity();\n\n\t\t// reorder runestones in inventory\n\t\tSoCharacter->GetInventory()->OrderRuneStones();\n\n\t\t// initialize equipped list\n\t\tEquippedRuneStones = SoCharacter->GetPlayerCharacterSheet()->GetEquippedSpells();\n\t\tTArray<FSoItem> TempEquippedRuneStones = EquippedRuneStones;\n\t\tfor (const FSoItem& RuneStone : TempEquippedRuneStones)\n\t\t{\n\t\t\tconst USoItemTemplateRuneStone* SpellTemplate = RuneStone.GetTemplateAsRuneStone();\n\t\t\tEquippedRuneStoneCapacity += RuneStone.Amount * SpellTemplate->CapacityCost;\n\t\t\tif (USoUISpellSlot* SpellSlot = Cast<USoUISpellSlot>(EquippedContainer->GetChildAt(EquippedRuneStoneCount++)))\n\t\t\t\tSpellSlot->SetItem(SpellTemplate, RuneStone.Amount);\n\t\t}\n\n\t\tfor (int32 Index = EquippedRuneStoneCount; Index < EquippedContainer->GetChildrenCount(); ++Index)\n\t\t\tif (USoUISpellSlot* SpellSlot = Cast<USoUISpellSlot>(EquippedContainer->GetChildAt(Index)))\n\t\t\t\tSpellSlot->SetItem(nullptr, 0);\n\n\n\t\t// update current list\n\t\tCurrentRuneStones.Empty();\n\t\tconst TArray<FSoItem>& ItemList = SoCharacter->GetInventory()->GetItemList();\n\t\tfor (const FSoItem& Item : ItemList)\n\t\t\tif (USoItemTemplateRuneStone* RuneStone = Cast<USoItemTemplateRuneStone>(Item.Template))\n\t\t\t\tCurrentRuneStones.Add(RuneStone);\n\n\t\tfor (int32 i = 0; i < SoWrapBox->GetChildrenCount(); ++i)\n\t\t\tif (USoUISpellSlot* SpellSlot = Cast<USoUISpellSlot>(SoWrapBox->GetChildAt(i)))\n\t\t\t{\n\t\t\t\tSpellSlot->SetSelected(false);\n\t\t\t\tSpellSlot->SetEquipped(false);\n\t\t\t\tif (CurrentRuneStones.IsValidIndex(i))\n\t\t\t\t{\n\t\t\t\t\tSpellSlot->SetItem(CurrentRuneStones[i], 1);\n\t\t\t\t\tfor (int32 j = 0; j < TempEquippedRuneStones.Num(); ++j)\n\t\t\t\t\t\tif (TempEquippedRuneStones[j].Template == CurrentRuneStones[i] && TempEquippedRuneStones[j].Amount > 0)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tSpellSlot->SetEquipped(true);\n\t\t\t\t\t\t\tTempEquippedRuneStones[j].Amount -= 1;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\tSpellSlot->SetCanBeEquipped(CanEquip(i));\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t\tSpellSlot->SetItem(nullptr, 0);\n\t\t\t}\n\n\t\t// set selection to 0,0\n\t\tSelectedColIndex = 0;\n\t\tSelectedRowIndex = 0;\n\t\tif (USoUISpellSlot* SpellSlot = Cast<USoUISpellSlot>(SoWrapBox->GetChildAt(0)))\n\t\t{\n\t\t\tSpellSlot->SetSelected(true);\n\t\t\tOnSelectionChange(CurrentRuneStones.IsValidIndex(0) ? CurrentRuneStones[0] : nullptr, SpellSlot->IsEquipped());\n\t\t}\n\t}\n\tOnEquippedListChange();\n\tUpdateEquippedBorders();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISpellSelection::UpdateCanBeEquippedStates()\n{\n\tfor (int32 i = 0; i < SoWrapBox->GetChildrenCount(); ++i)\n\t\tif (USoUISpellSlot* SpellSlot = Cast<USoUISpellSlot>(SoWrapBox->GetChildAt(i)))\n\t\t\tif (CurrentRuneStones.IsValidIndex(i))\n\t\t\t\tSpellSlot->SetCanBeEquipped(CanEquip(i));\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISpellSelection::EquipSelected()\n{\n\tconst int32 Index = CalculateIndex();\n\tif (!CurrentRuneStones.IsValidIndex(Index))\n\t\treturn;\n\n\tif (!IsIndexEquipped(Index) && CanEquipSelected())\n\t{\n\t\tUSoAudioManager::PlaySound2D(this, SFXSpellAdded);\n\n\t\tif (USoUISpellSlot* SpellSlot = Cast<USoUISpellSlot>(SoWrapBox->GetChildAt(Index)))\n\t\t\tSpellSlot->SetEquipped(true);\n\n\t\tint32 EquippedIndex = -1;\n\t\tif (HasOneEquipped(CurrentRuneStones[Index], &EquippedIndex))\n\t\t\tCast<USoUISpellSlot>(EquippedContainer->GetChildAt(EquippedIndex))->ModifyAmount(1);\n\t\telse\n\t\t{\n\t\t\tCast<USoUISpellSlot>(EquippedContainer->GetChildAt(EquippedRuneStoneCount))->SetItem(CurrentRuneStones[Index], 1);\n\t\t\tEquippedRuneStoneCount += 1;\n\t\t}\n\t\tEquippedRuneStoneCapacity += CurrentRuneStones[Index]->CapacityCost;\n\n\t\tbool bAdded = false;\n\t\tfor (FSoItem& RuneStone : EquippedRuneStones)\n\t\t\tif (RuneStone.Template == CurrentRuneStones[Index])\n\t\t\t{\n\t\t\t\tbAdded = true;\n\t\t\t\tRuneStone.Amount += 1;\n\t\t\t}\n\n\t\tif (!bAdded)\n\t\t{\n\t\t\tFSoItem Stone;\n\t\t\tStone.Amount = 1;\n\t\t\tStone.Template = CurrentRuneStones[Index];\n\t\t\tEquippedRuneStones.Add(Stone);\n\t\t}\n\n\t\tOnSelectionChange(CurrentRuneStones[Index], IsIndexEquipped(Index));\n\t\tOnEquippedListChange();\n\t\tUpdateCanBeEquippedStates();\n\n\t\tUpdateEquippedBorders();\n\t}\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISpellSelection::UnequipSelected()\n{\n\tconst int32 Index = CalculateIndex();\n\tif (!CurrentRuneStones.IsValidIndex(Index))\n\t\treturn;\n\n\tint32 EquippedIndex = -1;\n\tif (HasOneEquipped(CurrentRuneStones[Index], &EquippedIndex) && IsIndexEquipped(Index))\n\t{\n\t\tUSoAudioManager::PlaySound2D(this, SFXSpellRemoved);\n\n\t\tif (USoUISpellSlot* SpellSlot = Cast<USoUISpellSlot>(SoWrapBox->GetChildAt(Index)))\n\t\t\tSpellSlot->SetEquipped(false);\n\n\n\t\tUSoUISpellSlot* EquippedSlot = Cast<USoUISpellSlot>(EquippedContainer->GetChildAt(EquippedIndex));\n\t\tif (!EquippedSlot->ModifyAmount(-1))\n\t\t{\n\t\t\tEquippedRuneStoneCount -= 1;\n\n\t\t\tbool bRemoved = false;\n\t\t\t// remove from container\n\t\t\tfor (int32 i = EquippedContainer->GetChildrenCount() - 1; i >= 0 && !bRemoved; --i)\n\t\t\t\tif (USoUISpellSlot* SpellSlot = Cast<USoUISpellSlot>(EquippedContainer->GetChildAt(i)))\n\t\t\t\t\tif (SpellSlot->GetItem() == CurrentRuneStones[Index])\n\t\t\t\t\t{\n\t\t\t\t\t\tbRemoved = true;\n\t\t\t\t\t\tfor (int32 j = i; j < EquippedContainer->GetChildrenCount() - 1; ++j)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tUSoUISpellSlot* PrevSpellSlot = Cast<USoUISpellSlot>(EquippedContainer->GetChildAt(j));\n\t\t\t\t\t\t\tUSoUISpellSlot* NextSpellSlot = Cast<USoUISpellSlot>(EquippedContainer->GetChildAt(j + 1));\n\t\t\t\t\t\t\tPrevSpellSlot->SetItem(NextSpellSlot->GetItem(), NextSpellSlot->GetAmount());\n\t\t\t\t\t\t}\n\t\t\t\t\t\tCast<USoUISpellSlot>(EquippedContainer->GetChildAt(EquippedContainer->GetChildrenCount() - 1))->SetItem(nullptr, 0);\n\t\t\t\t\t}\n\t\t}\n\n\t\tEquippedRuneStoneCapacity -= CurrentRuneStones[Index]->CapacityCost;\n\t\t// remove from list\n\t\tfor (int32 i = 0; i < EquippedRuneStones.Num(); ++i)\n\t\t\tif (EquippedRuneStones[i].Template == CurrentRuneStones[Index])\n\t\t\t{\n\t\t\t\tEquippedRuneStones[i].Amount -= 1;\n\t\t\t\tif (EquippedRuneStones[i].Amount == 0)\n\t\t\t\t\tEquippedRuneStones.RemoveAtSwap(i);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\tOnSelectionChange(CurrentRuneStones[Index], IsIndexEquipped(Index));\n\t\tOnEquippedListChange();\n\t\tUpdateCanBeEquippedStates();\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISpellSelection::UpdateEquippedBorders()\n{\n\tUSoItemTemplateRuneStone* RuneStone = nullptr;\n\tconst int32 SelectedIndex = CalculateIndex();\n\tif (CurrentRuneStones.IsValidIndex(SelectedIndex))\n\t\tRuneStone = CurrentRuneStones[SelectedIndex];\n\n\tfor (int32 Index = 0; Index < EquippedContainer->GetChildrenCount(); ++Index)\n\t\tif (USoUISpellSlot* SpellSlot = Cast<USoUISpellSlot>(EquippedContainer->GetChildAt(Index)))\n\t\t\tSpellSlot->ShowBorderIfItemMatches(RuneStone);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISpellSelection::WriteEquippedStonesToCharacterSheet()\n{\n\tif (ASoCharacter* SoCharacter = USoStaticHelper::GetPlayerCharacterAsSoCharacter(this))\n\t\tSoCharacter->GetPlayerCharacterSheet()->SetEquippedSpells(EquippedRuneStones);\n}\n"
  },
  {
    "path": "Source/SOrb/UI/InGame/Spells/SoUISpellSelection.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#pragma once\n\n#include \"CoreMinimal.h\"\n#include \"UI/InGame/SoUIGameActivity.h\"\n#include \"Items/SoItem.h\"\n\n#include \"SoUISpellSelection.generated.h\"\n\nclass UWrapBox;\nclass USoItemTemplateRuneStone;\nclass UHorizontalBox;\nclass UFMODEvent;\n\nUCLASS()\nclass SORB_API USoUISpellSelection : public USoInGameUIActivity\n{\n\tGENERATED_BODY()\n\nprotected:\n\t// Begin UUserWidget Interface\n\tvoid NativeConstruct() override;\n\t// End UUserWidget Interface\n\n\t// Begin USoInGameUIActivity Interface\n\tbool SetInGameActivityEnabled_Implementation(UObject* Source, bool bEnable) override;\n\tbool HandleCommand_Implementation(ESoUICommand Command) override;\n\tbool Update_Implementation(float DeltaSeconds) override;\n\t// End USoInGameUIActivity Interface\n\nprotected:\n\tvoid Reinitialize();\n\n\tvoid UpdateCanBeEquippedStates();\n\n\tvoid EquipSelected();\n\tvoid UnequipSelected();\n\n\tvoid UpdateEquippedBorders();\n\n\tvoid WriteEquippedStonesToCharacterSheet();\n\n\tUFUNCTION(BlueprintPure, Category = SpellSelection)\n\tbool CanEquipSelected() const;\n\n\tUFUNCTION(BlueprintPure, Category = SpellSelection)\n\tbool CanEquip(int32 Index) const;\n\n\tUFUNCTION(BlueprintPure, Category = SpellSelection)\n\tint32 GetEquippedCount(USoItemTemplateRuneStone* RuneStone) const;\n\n\n\tbool HasOneEquipped(USoItemTemplateRuneStone* RuneStone, int32* IndexPtr = nullptr) const;\n\n\tUFUNCTION(BlueprintPure, Category = SpellSelection)\n\tint32 CalculateIndex() const;\n\n\tUFUNCTION(BlueprintPure, Category = SpellSelection)\n\tbool IsIndexEquipped(int32 Index) const;\n\n\tUFUNCTION(BlueprintImplementableEvent, Category = SpellSelection)\n\tvoid OnSelectionChange(USoItemTemplateRuneStone* RuneStone, bool bIsItEquipped);\n\n\tUFUNCTION(BlueprintImplementableEvent, Category = SpellSelection)\n\tvoid OnEquippedListChange();\n\nprotected:\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\", meta = (BindWidget))\n\tUWrapBox* SoWrapBox;\n\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\", meta = (BindWidget))\n\tUHorizontalBox* EquippedContainer;\n\n\tbool bOpened = false;\n\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = \">Selection\")\n\tint32 ColNum = 8;\n\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = \">Selection\")\n\tint32 RowNum = 7;\n\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = \">Selection\")\n\tbool bEditable = false;\n\n\tUPROPERTY(BlueprintReadOnly, Category = \">Runtime\")\n\tTArray<USoItemTemplateRuneStone*> CurrentRuneStones;\n\n\tUPROPERTY(BlueprintReadOnly, Category = \">Runtime\")\n\tTArray<FSoItem> EquippedRuneStones;\n\n\tint32 SelectedRowIndex = 0;\n\tint32 SelectedColIndex = 0;\n\n\tUPROPERTY(BlueprintReadOnly, Category = \">Runtime\")\n\tint32 EquippedRuneStoneCount = 0;\n\n\tUPROPERTY(BlueprintReadOnly, Category = \">Runtime\")\n\tint32 EquippedRuneStoneCapacity = 0;\n\n\tUPROPERTY(BlueprintReadOnly, Category = \">Runtime\")\n\tint32 MaxCapacity = 0;\n\n\t//\n\t// SFX\n\t//\n\n\tUPROPERTY(EditAnywhere, Category = \">SFX\")\n\tUFMODEvent* SFXSpellSelectionSwitch = nullptr;\n\n\tUPROPERTY(EditAnywhere, Category = \">SFX\")\n\tUFMODEvent* SFXSpellAdded= nullptr;\n\n\tUPROPERTY(EditAnywhere, Category = \">SFX\")\n\tUFMODEvent* SFXSpellRemoved = nullptr;\n\n\tUPROPERTY(EditAnywhere, Category = \">SFX\")\n\tUFMODEvent* SFXSpellPanelClosed = nullptr;\n};\n"
  },
  {
    "path": "Source/SOrb/UI/InGame/Spells/SoUISpellSlot.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#include \"SoUISpellSlot.h\"\n#include \"Components/Image.h\"\n#include \"Components/TextBlock.h\"\n\n#include \"Items/ItemTemplates/SoItemTemplateRuneStone.h\"\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISpellSlot::SetSelected(bool bSelected)\n{\n\tbIsSelected = bSelected;\n\tOnStateChanged();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISpellSlot::SetEquipped(bool bEquipped)\n{\n\tbIsEquipped = bEquipped;\n\tEquippedIcon->SetVisibility(bEquipped && bShowEquippedIcon ? ESlateVisibility::Visible : ESlateVisibility::Collapsed);\n\tOnStateChanged();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISpellSlot::SetCanBeEquipped(bool bCanBe)\n{\n\tbCanBeEquipped = bCanBe;\n\tOnStateChanged();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISpellSlot::SetItem(const USoItemTemplateRuneStone* InActiveItem, int32 InAmount)\n{\n\tActiveItem = InActiveItem;\n\tif (ActiveItem != nullptr)\n\t{\n\t\t// Item with number\n\t\tBackground->SetBrushFromTexture(SpellBackground);\n\t\tIcon->SetVisibility(ESlateVisibility::Visible);\n\t\tIcon->SetBrushFromTexture(ActiveItem->GetIcon());\n\n\t\tAmount = InAmount;\n\t\tAmountText->SetText(FText::AsNumber(Amount));\n\t\tAmountText->SetVisibility((Amount > 1 && !bShowEquippedIcon) ? ESlateVisibility::Visible : ESlateVisibility::Collapsed);\n\t}\n\telse\n\t{\n\t\t// Empty spell slot\n\t\tBackground->SetBrushFromTexture(EmptyBackground);\n\t\tIcon->SetVisibility(ESlateVisibility::Collapsed);\n\t\tAmountText->SetVisibility(ESlateVisibility::Collapsed);\n\t\tbIsEquipped = false;\n\t\tbCanBeEquipped = true;\n\t\tOnStateChanged();\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoUISpellSlot::ModifyAmount(int32 Delta)\n{\n\tAmount += Delta;\n\tAmountText->SetVisibility((Amount > 1 && !bShowEquippedIcon) ? ESlateVisibility::Visible : ESlateVisibility::Collapsed);\n\tAmountText->SetText(FText::AsNumber(Amount));\n\n\treturn Amount > 0;\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISpellSlot::ShowBorderIfItemMatches(const USoItemTemplateRuneStone* Item)\n{\n\tBorder->SetColorAndOpacity(FLinearColor::White);\n\tBorder->SetVisibility((ActiveItem == Item && Item != nullptr) ? ESlateVisibility::Visible : ESlateVisibility::Hidden);\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISpellSlot::OnStateChanged()\n{\n\tif (ActiveItem != nullptr)\n\t{\n\t\tBackground->SetBrushFromTexture((bIsEquipped || bCanBeEquipped) ? SpellBackground : SpellBackgroundCantEquip);\n\t\tBorder->SetVisibility(ESlateVisibility::Visible);\n\t}\n\telse\n\t{\n\t\tBackground->SetBrushFromTexture(EmptyBackground);\n\t\tBorder->SetVisibility(bIsSelected ? ESlateVisibility::Visible : ESlateVisibility::Hidden);\n\t}\n\n\tBorder->SetColorAndOpacity(bIsSelected ? FLinearColor::White\n\t\t\t\t\t\t\t\t\t\t   : (bIsEquipped ? FLinearColor::Black\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t  : (bCanBeEquipped ? CanEquipBorderColor : CantEquipBorderColor)));\n}\n"
  },
  {
    "path": "Source/SOrb/UI/InGame/Spells/SoUISpellSlot.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#pragma once\n\n#include \"CoreMinimal.h\"\n#include \"Blueprint/UserWidget.h\"\n\n#include \"SoUISpellSlot.generated.h\"\n\nclass UImage;\nclass UTextBlock;\nclass USoItemTemplateRuneStone;\nclass UTexture2D;\n\nUCLASS(HideCategories = (Navigation), AutoCollapseCategories = (Performance, Clipping, Interaction, Input))\nclass SORB_API USoUISpellSlot : public UUserWidget\n{\n\tGENERATED_BODY()\n\npublic:\n\tvoid SetSelected(bool bSelected);\n\tvoid SetEquipped(bool bEquipped);\n\tvoid SetCanBeEquipped(bool bCanBe);\n\tvoid SetItem(const USoItemTemplateRuneStone* InActiveItem, int32 InAmount);\n\n\tbool IsEquipped() const { return bIsEquipped; }\n\tint32 GetAmount() const { return Amount; }\n\n\tbool ModifyAmount(int32 Delta);\n\n\tvoid ShowBorderIfItemMatches(const USoItemTemplateRuneStone* Item);\n\n\tconst USoItemTemplateRuneStone* GetItem() const { return ActiveItem; }\n\nprotected:\n\n\tvoid OnStateChanged();\n\nprotected:\n\n\tUPROPERTY(BlueprintReadOnly, Category = \">Widgets\", meta = (BindWidget))\n\tUImage* Background = nullptr;\n\n\tUPROPERTY(BlueprintReadOnly, Category = \">Widgets\", meta = (BindWidget))\n\tUImage* Icon = nullptr;\n\n\tUPROPERTY(BlueprintReadOnly, Category = \">Widgets\", meta = (BindWidget))\n\tUImage* Border = nullptr;\n\n\tUPROPERTY(BlueprintReadOnly, Category = \">Widgets\", meta = (BindWidget))\n\tUImage* EquippedIcon = nullptr;\n\n\tUPROPERTY(BlueprintReadOnly, Category = \">Widgets\", meta = (BindWidget))\n\tUTextBlock* AmountText = nullptr;\n\n\tUPROPERTY(BlueprintReadOnly, Category = \">Runtime\")\n\tbool bIsEquipped = false;\n\n\tUPROPERTY(BlueprintReadOnly, Category = \">Runtime\")\n\tbool bIsSelected = false;\n\n\tUPROPERTY(BlueprintReadOnly, Category = \">Runtime\")\n\tconst USoItemTemplateRuneStone* ActiveItem;\n\n\tUPROPERTY(EditAnywhere, Category = \">Spell\")\n\tUTexture2D* EmptyBackground;\n\n\tUPROPERTY(EditAnywhere, Category = \">Spell\")\n\tUTexture2D* SpellBackground;\n\n\tUPROPERTY(EditAnywhere, Category = \">Spell\")\n\tUTexture2D* SpellBackgroundCantEquip;\n\n\tUPROPERTY(EditAnywhere, Category = \">Spell\")\n\tFLinearColor CantEquipBorderColor;\n\n\tUPROPERTY(EditAnywhere, Category = \">Spell\")\n\tFLinearColor CanEquipBorderColor = FLinearColor::Green;\n\n\tUPROPERTY(EditAnywhere, Category = \">Spell\")\n\tbool bShowEquippedIcon = true;\n\n\tint32 Amount = 0;\n\n\tbool bCanBeEquipped;\n};\n"
  },
  {
    "path": "Source/SOrb/UI/Menu/ConfirmPanels/SoUIConfirmCollectAnalytics.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#include \"SoUIConfirmCollectAnalytics.h\"\n\n#include \"Engine/Engine.h\"\n#include \"Settings/SoGameSettings.h\"\n#include \"UI/General/Commands/SoUICommandTooltipArray.h\"\n#include \"Localization/SoLocalization.h\"\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIConfirmCollectAnalytics::SynchronizeProperties()\n{\n\tSuper::SynchronizeProperties();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIConfirmCollectAnalytics::NativeConstruct()\n{\n\tSuper::NativeConstruct();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoUIConfirmCollectAnalytics::OnUICommand_Implementation(ESoUICommand Command)\n{\n\tif (!bOpened)\n\t\treturn false;\n\n\treturn OnPressedButtonTooltipsCommand(Command);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoUIConfirmCollectAnalytics::OnPressedButtonTooltipsCommand(ESoUICommand Command)\n{\n\tSuper::OnPressedButtonTooltipsCommand(Command);\n\n\tauto& GameSettings = USoGameSettings::Get();\n\tbool bCommandHandled = false;\n\tswitch (Command)\n\t{\n\tcase UICommand_DoNotSend:\n\t\tGameSettings.SetCollectGameAnalyticsEnabled(false);\n\t\tbCommandHandled = true;\n\t\tbreak;\n\n\tcase UICommand_SendAutomatically:\n\t\tGameSettings.SetCollectGameAnalyticsEnabled(true);\n\t\tbCommandHandled = true;\n\t\tbreak;\n\n\tdefault:\n\t\tbreak;\n\t}\n\n\tif (bCommandHandled)\n\t{\n\t\tISoUIEventHandler::Execute_Open(this, false);\n\t\tGameSettings.ApplySettings(true);\n\t}\n\n\treturn bCommandHandled;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIConfirmCollectAnalytics::RefreshButtonsArray()\n{\n\t// Restore to default\n\tTArray<FSoUITextCommandPair> CommandsToBeDisplayed;\n\tCommandsToBeDisplayed.Add({ UICommand_DoNotSend, FROM_STRING_TABLE_UI(\"send_no\") });\n\tCommandsToBeDisplayed.Add({ UICommand_SendAutomatically, FROM_STRING_TABLE_UI(\"send_automatically\") });\n\tUpdateEnsureOnlyTheseCommandsExist(CommandsToBeDisplayed);\n}\n"
  },
  {
    "path": "Source/SOrb/UI/Menu/ConfirmPanels/SoUIConfirmCollectAnalytics.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#pragma once\n\n#include \"UI/General/SoUIConfirmPanel.h\"\n\n#include \"SoUIConfirmCollectAnalytics.generated.h\"\n\n\nUCLASS()\nclass SORB_API USoUIConfirmCollectAnalytics : public USoUIConfirmPanel\n{\n\tGENERATED_BODY()\n\npublic:\n\t//\n\t// UUserWidget Interface\n\t//\n\tvoid SynchronizeProperties() override;\n\tvoid NativeConstruct() override;\n\nprotected:\n\t//\n\t// USoUIEventHandler Interface\n\t//\n\tbool OnUICommand_Implementation(ESoUICommand Command) override;\n\n\t//\n\t// USoUIConfirmPanel interface\n\t//\n\n\tvoid RefreshButtonsArray() override;\n\tbool OnPressedButtonTooltipsCommand(ESoUICommand Command) override;\n\nprotected:\n\tstatic constexpr ESoUICommand UICommand_DoNotSend = ESoUICommand::EUC_Action1;\n\tstatic constexpr ESoUICommand UICommand_SendAutomatically = ESoUICommand::EUC_Action0;\n};\n"
  },
  {
    "path": "Source/SOrb/UI/Menu/ConfirmPanels/SoUIConfirmDisplaySettings.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#include \"SoUIConfirmDisplaySettings.h\"\n\n#include \"Engine/Engine.h\"\n#include \"Components/TextBlock.h\"\n\n#include \"Localization/SoLocalization.h\"\n#include \"Settings/SoGameSettings.h\"\n#include \"UI/General/Commands/SoUICommandTooltipArray.h\"\n#include \"UI/General/Buttons/SoUIButtonImageArray.h\"\n#include \"UI/General/SoUIUserWidget.h\"\n#include \"Basic/SoAudioManager.h\"\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIConfirmDisplaySettings::SynchronizeProperties()\n{\n\tSuper::SynchronizeProperties();\n\tResetSecondsToDefault();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIConfirmDisplaySettings::NativeConstruct()\n{\n\tSuper::NativeConstruct();\n\n\tButtonsArray->OnNavigateOnPressedHandleChildEvent().BindLambda([this](int32 SelectedChild, USoUIUserWidget* SoUserWidget)\n\t{\n\t\t// SFX\n\t\tSoUserWidget->NavigateOnPressed(true);\n\n\t\tif (USoUIButtonImageArray* ButtonTooltips = GetButtonArrayAsButtonImagesArray())\n\t\t\tOnPressedButtonTooltipsCommand(ButtonTooltips->GetSelectedButtonCommand());\n\t});\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIConfirmDisplaySettings::NativeTick(const FGeometry& MyGeometry, float InDeltaTime)\n{\n\tSuper::NativeTick(MyGeometry, InDeltaTime);\n\n\tif (bOpened)\n\t{\n\t\tCurrentSeconds -= InDeltaTime;\n\n\t\tif (CurrentSeconds > 0.2f)\n\t\t{\n\t\t\tOverlayTime->SetText(FText::AsNumber(FMath::RoundToInt(CurrentSeconds)));\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// Close this by reverting\n\t\t\tOnRevertVideoMode();\n\t\t}\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIConfirmDisplaySettings::Open_Implementation(bool bOpen)\n{\n\tSuper::Open_Implementation(bOpen);\n\tResetSecondsToDefault();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoUIConfirmDisplaySettings::OnUICommand_Implementation(ESoUICommand Command)\n{\n\tif (!bOpened)\n\t\treturn false;\n\n\tswitch (Command)\n\t{\n\tcase ESoUICommand::EUC_Left:\n\tcase ESoUICommand::EUC_Right:\n\tcase ESoUICommand::EUC_Up:\n\tcase ESoUICommand::EUC_Down:\n\tcase ESoUICommand::EUC_MainMenuEnter:\n\t\tButtonsArray->Navigate(Command);\n\t\treturn true;\n\n\tdefault:\n\t\treturn OnPressedButtonTooltipsCommand(Command);\n\t};\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIConfirmDisplaySettings::RefreshButtonsArray()\n{\n\t// Restore to default\n\tTArray<FSoUITextCommandPair> CommandsToBeDisplayed;\n\tfor (const ESoUIConfirmDisplaySettingsType Option : AnswerButtonOption)\n\t{\n\t\tswitch (Option)\n\t\t{\n\t\tcase ESoUIConfirmDisplaySettingsType::Confirm:\n\t\t\tCommandsToBeDisplayed.Add({ UICommand_ConfirmSettings, FROM_STRING_TABLE_UI(\"confirm\") });\n\t\t\tbreak;\n\n\t\tcase ESoUIConfirmDisplaySettingsType::Cancel:\n\t\t\tCommandsToBeDisplayed.Add({ UICommand_CancelSettings, FROM_STRING_TABLE_UI(\"cancel\") });\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tcheckNoEntry();\n\t\t\tbreak;\n\t\t}\n\t}\n\n\tUpdateEnsureOnlyTheseCommandsExist(CommandsToBeDisplayed);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoUIConfirmDisplaySettings::OnPressedButtonTooltipsCommand(ESoUICommand Command)\n{\n\tSuper::OnPressedButtonTooltipsCommand(Command);\n\n\tswitch (Command)\n\t{\n\tcase UICommand_ConfirmSettings:\n\t\tOnConfirmedVideoMode();\n\t\tbreak;\n\n\tcase UICommand_CancelSettings:\n\t\tOnRevertVideoMode();\n\t\tbreak;\n\n\tdefault:\n\t\treturn false;\n\t}\n\n\treturn true;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIConfirmDisplaySettings::OnConfirmedVideoMode()\n{\n\tauto& UserSettings = USoGameSettings::Get();\n\n\tUserSettings.ConfirmPreviewVideoModeSettings();\n\tUserSettings.ApplyDisplaySettings(true);\n\n\t// Call BP\n\tReceiveOnConfirmedVideoMode();\n\n\t// Close this as we handled it\n\tISoUIEventHandler::Execute_Open(this, false);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIConfirmDisplaySettings::OnRevertVideoMode()\n{\n\tauto& UserSettings = USoGameSettings::Get();\n\n\t// Only need to to directly apply the settings and update the option\n\tUserSettings.RevertPreviewVideoModeSettings();\n\tUserSettings.ApplyDisplaySettings(true);\n\n\t// Call BP\n\tReceiveOnRevertVideoMode();\n\n\t// Close this as we handled it\n\tISoUIEventHandler::Execute_Open(this, false);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIConfirmDisplaySettings::ResetSecondsToDefault()\n{\n\tCurrentSeconds = DefaultSeconds;\n\n\tif (OverlayTime)\n\t\tOverlayTime->SetText(FText::AsNumber(FMath::RoundToInt(CurrentSeconds)));\n}\n"
  },
  {
    "path": "Source/SOrb/UI/Menu/ConfirmPanels/SoUIConfirmDisplaySettings.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#pragma once\n\n\n#include \"CoreMinimal.h\"\n#include \"UI/General/SoUIConfirmPanel.h\"\n\n#include \"SoUIConfirmDisplaySettings.generated.h\"\n\nclass UTextBlock;\n\n\nUENUM(BlueprintType)\nenum class ESoUIConfirmDisplaySettingsType : uint8\n{\n\t// Invalid\n\tNone = 0,\n\n\tConfirm,\n\tCancel,\n};\n\nUCLASS()\nclass SORB_API USoUIConfirmDisplaySettings : public USoUIConfirmPanel\n{\n\tGENERATED_BODY()\n\npublic:\n\t//\n\t// UUserWidget Interface\n\t//\n\tvoid SynchronizeProperties() override;\n\tvoid NativeConstruct() override;\n\tvoid NativeTick(const FGeometry& MyGeometry, float InDeltaTime) override;\n\nprotected:\n\t//\n\t// USoUIEventHandler Interface\n\t//\n\tvoid Open_Implementation(bool bOpen) override;\n\tbool OnUICommand_Implementation(ESoUICommand Command) override;\n\n\t//\n\t// USoUIConfirmPanel interface\n\t//\n\n\tvoid RefreshButtonsArray() override;\n\tbool OnPressedButtonTooltipsCommand(ESoUICommand Command) override;\n\n\t//\n\t// Own methods\n\t//\n\n\t// Can confirm video mode;\n\tUFUNCTION(BlueprintImplementableEvent, BlueprintCosmetic, Category = \">Events\")\n\tvoid ReceiveOnConfirmedVideoMode();\n\n\tUFUNCTION(BlueprintCallable, Category = \">Events\")\n\tvoid OnConfirmedVideoMode();\n\n\t// Can revert video mode\n\tUFUNCTION(BlueprintImplementableEvent, BlueprintCosmetic, Category = \">Events\")\n\tvoid ReceiveOnRevertVideoMode();\n\n\tUFUNCTION(BlueprintCallable, Category = \">Events\")\n\tvoid OnRevertVideoMode();\n\n\tUFUNCTION(BlueprintCallable)\n\tvoid ResetSecondsToDefault();\n\nprotected:\n\tstatic constexpr ESoUICommand UICommand_ConfirmSettings = ESoUICommand::EUC_Action0;\n\tstatic constexpr ESoUICommand UICommand_CancelSettings = ESoUICommand::EUC_Action1;\n\n\tUPROPERTY(BlueprintReadOnly, Category = \">Widgets\", meta = (BindWidget))\n\tUTextBlock* OverlayTime;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = \">Defaults\")\n\tfloat DefaultSeconds = 6.f;\n\n\tUPROPERTY(BlueprintReadOnly, Category = \">Runtime\")\n\tfloat CurrentSeconds = 10.f;\n\n\n\t// Map selected button index => ESoUIConfirmQuitAnswerType (button type)\n\tconst TArray<ESoUIConfirmDisplaySettingsType> AnswerButtonOption = {\n\t\tESoUIConfirmDisplaySettingsType::Confirm,\n\t\tESoUIConfirmDisplaySettingsType::Cancel\n\t};\n};\n"
  },
  {
    "path": "Source/SOrb/UI/Menu/ConfirmPanels/SoUIConfirmKeyboardSettings.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#include \"SoUIConfirmKeyboardSettings.h\"\n\n#include \"Engine/Engine.h\"\n\n#include \"Localization/SoLocalization.h\"\n#include \"Settings/SoGameSettings.h\"\n#include \"UI/General/Commands/SoUICommandTooltipArray.h\"\n#include \"UI/General/Buttons/SoUIButtonImageArray.h\"\n#include \"UI/General/SoUIUserWidget.h\"\n#include \"Components/TextBlock.h\"\n#include \"Basic/SoAudioManager.h\"\n#include \"Basic/SoGameSingleton.h\"\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIConfirmKeyboardSettings::SynchronizeProperties()\n{\n\tSuper::SynchronizeProperties();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIConfirmKeyboardSettings::NativeConstruct()\n{\n\tSuper::NativeConstruct();\n\n\tButtonsArray->OnNavigateOnPressedHandleChildEvent().BindLambda([this](int32 SelectedChild, USoUIUserWidget* SoUserWidget)\n\t{\n\t\t// SFX\n\t\tSoUserWidget->NavigateOnPressed(true);\n\n\t\tif (USoUIButtonImageArray* ButtonTooltips = GetButtonArrayAsButtonImagesArray())\n\t\t\tOnPressedButtonTooltipsCommand(ButtonTooltips->GetSelectedButtonCommand());\n\t});\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIConfirmKeyboardSettings::NativeTick(const FGeometry& MyGeometry, float InDeltaTime)\n{\n\tSuper::NativeTick(MyGeometry, InDeltaTime);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIConfirmKeyboardSettings::Open_Implementation(bool bOpen)\n{\n\tSuper::Open_Implementation(bOpen);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoUIConfirmKeyboardSettings::OnUICommand_Implementation(ESoUICommand Command)\n{\n\tif (!bOpened)\n\t\treturn false;\n\n\tswitch (Command)\n\t{\n\tcase ESoUICommand::EUC_Left:\n\tcase ESoUICommand::EUC_Right:\n\tcase ESoUICommand::EUC_Up:\n\tcase ESoUICommand::EUC_Down:\n\tcase ESoUICommand::EUC_MainMenuEnter:\n\t\tButtonsArray->Navigate(Command);\n\t\treturn true;\n\n\tcase ESoUICommand::EUC_MainMenuBack:\n\tcase UICommand_Cancel:\n\t\tISoUIEventHandler::Execute_Open(this, false);\n\t\tUSoAudioManager::PlaySound2D(this, USoGameSingleton::GetSFX(ESoSFX::SettingsClose));\n\t\treturn true;\n\n\tdefault:\n\t\treturn OnPressedButtonTooltipsCommand(Command);\n\t};\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIConfirmKeyboardSettings::RefreshButtonsArray()\n{\n\t// Restore to default\n\tTArray<FSoUITextCommandPair> CommandsToBeDisplayed;\n\tCommandsToBeDisplayed.Add({ UICommand_Apply, FROM_STRING_TABLE_UI(\"settings_reset\") });\n\tCommandsToBeDisplayed.Add({ UICommand_Cancel, FROM_STRING_TABLE_UI(\"settings_cancel\") });\n\n\tUpdateEnsureOnlyTheseCommandsExist(CommandsToBeDisplayed);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoUIConfirmKeyboardSettings::OnPressedButtonTooltipsCommand(ESoUICommand Command)\n{\n\tSuper::OnPressedButtonTooltipsCommand(Command);\n\n\tswitch (Command)\n\t{\n\t\tcase UICommand_Apply:\n\t\t\tif (bOpenedForResetToWASD)\n\t\t\t\tOnApplyWASDPreset();\n\t\t\telse\n\t\t\t\tOnApplyArrowsPreset();\n\t\t\tbreak;\n\n\t\tcase UICommand_Cancel:\n\t\t\tISoUIEventHandler::Execute_Open(this, false);\n\t\t\tUSoAudioManager::PlaySound2D(this, USoGameSingleton::GetSFX(ESoSFX::SettingsClose));\n\t\t\treturn true;\n\n\t\tdefault:\n\t\t\treturn false;\n\t}\n\n\treturn true;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIConfirmKeyboardSettings::OnApplyWASDPreset()\n{\n\tauto& UserSettings = USoGameSettings::Get();\n\tUserSettings.SetKeyboardInputBindingsToDefault();\n\tUserSettings.ApplyInputSettings(true);\n\n\tUSoAudioManager::PlaySound2D(this, USoGameSingleton::GetSFX(ESoSFX::SettingsApply));\n\n\t// Close this as we handled it\n\tISoUIEventHandler::Execute_Open(this, false);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIConfirmKeyboardSettings::OnApplyArrowsPreset()\n{\n\tauto& UserSettings = USoGameSettings::Get();\n\tUserSettings.SetInputToPresetKeyboardArrows();\n\tUserSettings.ApplyInputSettings(true);\n\n\tUSoAudioManager::PlaySound2D(this, USoGameSingleton::GetSFX(ESoSFX::SettingsApply));\n\n\t// Close this as we handled it\n\tISoUIEventHandler::Execute_Open(this, false);\n}\n"
  },
  {
    "path": "Source/SOrb/UI/Menu/ConfirmPanels/SoUIConfirmKeyboardSettings.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#pragma once\n\n\n#include \"CoreMinimal.h\"\n#include \"UI/General/SoUIConfirmPanel.h\"\n\n#include \"SoUIConfirmKeyboardSettings.generated.h\"\n\nclass UTextBlock;\n\n\nUCLASS()\nclass SORB_API USoUIConfirmKeyboardSettings : public USoUIConfirmPanel\n{\n\tGENERATED_BODY()\n\npublic:\n\t//\n\t// UUserWidget Interface\n\t//\n\tvoid SynchronizeProperties() override;\n\tvoid NativeConstruct() override;\n\tvoid NativeTick(const FGeometry& MyGeometry, float InDeltaTime) override;\n\n\tvoid SetOpenedForResetToWASD(bool bEnabled) { bOpenedForResetToWASD = bEnabled; }\n\nprotected:\n\t//\n\t// USoUIEventHandler Interface\n\t//\n\tvoid Open_Implementation(bool bOpen) override;\n\tbool OnUICommand_Implementation(ESoUICommand Command) override;\n\n\t//\n\t// USoUIConfirmPanel interface\n\t//\n\n\tvoid RefreshButtonsArray() override;\n\tbool OnPressedButtonTooltipsCommand(ESoUICommand Command) override;\n\n\t//\n\t// Own methods\n\t//\n\n\t// Apply the preset for the WASD keys\n\tUFUNCTION(BlueprintCallable)\n\tvoid OnApplyWASDPreset();\n\n\t// Apply the preset for the arrow keys\n\tUFUNCTION(BlueprintCallable)\n\tvoid OnApplyArrowsPreset();\n\nprotected:\n\tstatic constexpr ESoUICommand UICommand_Apply = ESoUICommand::EUC_Action0;\n\tstatic constexpr ESoUICommand UICommand_Cancel = ESoUICommand::EUC_Action1;\n\n\tbool bOpenedForResetToWASD = false;\n};\n"
  },
  {
    "path": "Source/SOrb/UI/Menu/ConfirmPanels/SoUIConfirmQuestion.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#include \"SoUIConfirmQuestion.h\"\n\n#include \"Engine/Engine.h\"\n#include \"Components/TextBlock.h\"\n\n#include \"Localization/SoLocalization.h\"\n#include \"UI/General/Buttons/SoUIButtonArray.h\"\n#include \"UI/General/SoUIUserWidget.h\"\n#include \"Basic/SoGameSingleton.h\"\n#include \"Basic/SoAudioManager.h\"\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIConfirmQuestion::SynchronizeProperties()\n{\n\tSuper::SynchronizeProperties();\n\n\tbBehaveAsCommandTooltips = false;\n\n\tif (ButtonsArray)\n\t{\n\t\tButtonsArray\n\t\t\t->SetCyclicNavigation(true)\n\t\t\t->SetVerticalLayout(true)\n\t\t\t->SetSkipDeactivatedChildren(true)\n\t\t\t->SetUseCustomPadding(false, {})\n\t\t\t->SetTrackPressedInput(true)\n\t\t\t->SetSFXChildSelectionChanged(USoGameSingleton::GetSFX(ESoSFX::MenuButtonSwitch));\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIConfirmQuestion::NativeConstruct()\n{\n\tSuper::NativeConstruct();\n\n\tButtonsArray->OnNavigateOnPressedHandleChildEvent().BindLambda([this](int32 SelectedChild, USoUIUserWidget* SoUserWidget)\n\t{\n\t\t// SFX\n\t\tSoUserWidget->NavigateOnPressed(true);\n\n\t\tSetAnswer(AnswerButtonOption[SelectedChild]);\n\t});\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIConfirmQuestion::Open_Implementation(bool bOpen)\n{\n\tif (bOpened == bOpen)\n\t\treturn;\n\n\tbOpened = bOpen;\n\tSetVisibility(bOpen ? ESlateVisibility::Visible : ESlateVisibility::Collapsed);\n\n\tif (bOpened)\n\t{\n\t\t// Opened again, reset the answer from last time\n\t\tResetAnswer();\n\n\t\t// Set visibility on texts\n\t\tif (TextSubTitle)\n\t\t{\n\t\t\tTextSubTitle->SetVisibility(TextSubTitle->GetText().IsEmpty() ? ESlateVisibility::Collapsed : ESlateVisibility::Visible);\n\t\t}\n\n\t\t// Select the default index\n\t\tif (ButtonsArray)\n\t\t\tButtonsArray->SetSelectedIndex(GetAnswerButtonOptionIndexFor(DefaultSelectedAnswerType));\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoUIConfirmQuestion::OnUICommand_Implementation(ESoUICommand Command)\n{\n\tif (!bOpened)\n\t\treturn false;\n\n\tcheck(ButtonsArray);\n\n\tbool bHandled = false;\n\tswitch (Command)\n\t{\n\tcase ESoUICommand::EUC_Left:\n\tcase ESoUICommand::EUC_Right:\n\tcase ESoUICommand::EUC_Up:\n\tcase ESoUICommand::EUC_Down:\n\tcase ESoUICommand::EUC_MainMenuEnter:\n\t\tButtonsArray->Navigate(Command);\n\t\tbHandled = true;\n\t\tbreak;\n\n\tcase ESoUICommand::EUC_MainMenuBack:\n\t\t// Back, translate to NO\n\t\tSetAnswer(ESoUIConfirmQuestionAnswerType::No);\n\t\tbHandled = true;\n\t\tbreak;\n\n\tdefault:\n\t\tbreak;\n\t};\n\n\tif (bHandled)\n\t\tUpdateFromCurrentAnswer();\n\n\treturn bHandled;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIConfirmQuestion::SetTexts(FText Text, FText SubText)\n{\n\tif (TextTitle)\n\t\tTextTitle->SetText(Text);\n\tif (TextSubTitle)\n\t\tTextSubTitle->SetText(SubText);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIConfirmQuestion::RefreshButtonsArray()\n{\n\tif (!ButtonsArray)\n\t\treturn;\n\n\tTArray<FText> ChildrenTexts;\n\tfor (const ESoUIConfirmQuestionAnswerType Option : AnswerButtonOption)\n\t{\n\t\tswitch (Option)\n\t\t{\n\t\tcase ESoUIConfirmQuestionAnswerType::Yes:\n\t\t\tChildrenTexts.Add(FROM_STRING_TABLE_UI(\"yes\"));\n\t\t\tbreak;\n\n\t\tcase ESoUIConfirmQuestionAnswerType::No:\n\t\t\tChildrenTexts.Add(FROM_STRING_TABLE_UI(\"no\"));\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tcheckNoEntry();\n\t\t\tbreak;\n\t\t}\n\t}\n\n\tButtonsArray->CreateButtons(ChildrenTexts);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIConfirmQuestion::UpdateFromCurrentAnswer()\n{\n\tif (IsAnswerNo())\n\t{\n\t\tif (bPlayBackToMenuRootSFXOnNo)\n\t\t\tUSoAudioManager::PlaySound2D(this, USoGameSingleton::GetSFX(ESoSFX::MenuReturnToRoot));\n\n\t\tISoUIEventHandler::Execute_Open(this, false);\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIConfirmQuestion::SetAnswer(ESoUIConfirmQuestionAnswerType NewAnswer)\n{\n\tConfirmAnswerType = NewAnswer;\n\tUpdateFromCurrentAnswer();\n\tQuestionAnsweredEvent.Broadcast();\n}\n"
  },
  {
    "path": "Source/SOrb/UI/Menu/ConfirmPanels/SoUIConfirmQuestion.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#pragma once\n\n\n#include \"CoreMinimal.h\"\n#include \"UI/General/SoUIConfirmPanel.h\"\n\n#include \"SoUIConfirmQuestion.generated.h\"\n\n\nclass UTextBlock;\n\nUENUM(BlueprintType)\nenum class ESoUIConfirmQuestionAnswerType : uint8\n{\n\t// Invalid\n\tNone = 0,\n\n\tYes,\n\tNo,\n};\n\nUCLASS()\nclass SORB_API USoUIConfirmQuestion : public USoUIConfirmPanel\n{\n\tGENERATED_BODY()\n\npublic:\n\t//\n\t// UUserWidget Interface\n\t//\n\tvoid SynchronizeProperties() override;\n\tvoid NativeConstruct() override;\n\n\t//\n\t// Own methods\n\t//\n\n\tbool IsAnswerYes() const { return ConfirmAnswerType == ESoUIConfirmQuestionAnswerType::Yes; }\n\tbool IsAnswerNo() const { return ConfirmAnswerType == ESoUIConfirmQuestionAnswerType::No; }\n\tbool IsValidAnswer() const { return ConfirmAnswerType != ESoUIConfirmQuestionAnswerType::None; }\n\n\t// If the SubText is empty then it will not be displayed\n\tvoid SetTexts(FText Text, FText SubText);\n\n\tvoid SetPlayBackToMenuRootSFXOnNo(bool bPlay) { bPlayBackToMenuRootSFXOnNo = bPlay; }\n\nprotected:\n\t//\n\t// USoUIEventHandler Interface\n\t//\n\tvoid Open_Implementation(bool bOpen) override;\n\tbool OnUICommand_Implementation(ESoUICommand Command) override;\n\n\t//\n\t// USoUIConfirmPanel interface\n\t//\n\n\t// Sets/Creates the texts and children for all lines\n\t// NOTE: does not depend on any runtime value\n\tvoid RefreshButtonsArray() override;\n\n\n\t//\n\t// Own methods\n\t//\n\n\tvoid UpdateFromCurrentAnswer();\n\tvoid SetAnswer(ESoUIConfirmQuestionAnswerType NewAnswer);\n\tvoid ResetAnswer()\n\t{\n\t\tConfirmAnswerType = ESoUIConfirmQuestionAnswerType::None;\n\t}\n\n\tint32 GetAnswerButtonOptionIndexFor(ESoUIConfirmQuestionAnswerType AnswerType) const\n\t{\n\t\treturn AnswerButtonOption.Find(AnswerType);\n\t}\n\nprotected:\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\", meta = (BindWidget))\n\tUTextBlock* TextTitle = nullptr;\n\n\t// Text that appears underneath the TextTitle\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\", meta = (BindWidget))\n\tUTextBlock* TextSubTitle = nullptr;\n\n\t// Tells us if the user responded to the confirm\n\t// If None it means the user did not answer\n\tUPROPERTY(BlueprintReadOnly, Category = \">Options\")\n\tESoUIConfirmQuestionAnswerType ConfirmAnswerType = ESoUIConfirmQuestionAnswerType::None;\n\n\t// Map selected button index => ESoUIConfirmQuitAnswerType (button type)\n\tconst TArray<ESoUIConfirmQuestionAnswerType> AnswerButtonOption = {\n\t\tESoUIConfirmQuestionAnswerType::Yes,\n\t\tESoUIConfirmQuestionAnswerType::No\n\t};\n\n\t// The default selected answer when\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = \">Options\")\n\tESoUIConfirmQuestionAnswerType DefaultSelectedAnswerType = ESoUIConfirmQuestionAnswerType::No;\n\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\", meta = (BindWidget))\n\tbool bPlayBackToMenuRootSFXOnNo = true;\n};\n"
  },
  {
    "path": "Source/SOrb/UI/Menu/Settings/KeySelector/SSoInputKeySelector.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#include \"SSoInputKeySelector.h\"\n\n#include \"Widgets/Text/STextBlock.h\"\n#include \"Widgets/Input/SButton.h\"\n#include \"Framework/Application/SlateApplication.h\"\n#include \"Settings/Input/SoInputNames.h\"\n\n// #include \"Widgets/Input/SInputKeySelector.h\"\n\nDEFINE_LOG_CATEGORY(LogSoInputSelector);\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid SSoInputKeySelector::Construct(const FArguments& InArgs)\n{\n\tPreviousFocusedWidget = nullptr;\n\n\tSelectedKey = InArgs._SelectedKey;\n\tKeySelectionText = InArgs._KeySelectionText;\n\tNoKeySpecifiedText = InArgs._NoKeySpecifiedText;\n\tOnKeySelectedEvent = InArgs._OnKeySelectedEvent;\n\tOnIsSelectingKeyChangedEvent = InArgs._OnIsSelectingKeyChangedEvent;\n\tbAllowModifierKeysInSelection = InArgs._AllowModifierKeysInSelection;\n\tAllowedInputType = InArgs._AllowedInputType;\n\tbEscapeCancelsSelection = InArgs._EscapeCancelsSelection;\n\tEscapeKeys = InArgs._EscapeKeys;\n\tbIsButtonFocusable = InArgs._IsButtonFocusable;\n\tPreviousFocusedWidget = InArgs._PreviousFocusedWidget;\n\n\tbIsSelectingKey = false;\n\n\tChildSlot\n\t[\n\t\tSAssignNew(Button, SButton)\n\t\t.ButtonStyle(InArgs._ButtonStyle)\n\t\t.IsFocusable(bIsButtonFocusable)\n\t\t.OnClicked(this, &Self::OnClicked)\n\t\t[\n\t\t\tSAssignNew(TextBlock, STextBlock)\n\t\t\t.Text(this, &Self::GetSelectedKeyText)\n\t\t\t.TextStyle(InArgs._TextStyle)\n\t\t\t.Margin(Margin)\n\t\t\t.Justification(ETextJustify::Center)\n\t\t]\n\t];\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFText SSoInputKeySelector::GetSelectedKeyText() const\n{\n\tif (bIsSelectingKey)\n\t\treturn KeySelectionText;\n\n\tif (SelectedKey.IsSet())\n\t{\n\t\tconst FKey Key = SelectedKey.Get().Key;\n\t\tif (Key.IsValid())\n\t\t{\n\t\t\t// If the key in the chord is a modifier key, print it's display name directly since the FInputChord\n\t\t\t// displays these as empty text.\n\t\t\treturn Key.IsModifierKey() ? FSoInputKey::GetKeyDisplayName(Key) : FSoInputKey::GetInputChordDisplayName(SelectedKey.Get());\n\t\t}\n\t}\n\n\treturn NoKeySpecifiedText;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFInputChord SSoInputKeySelector::GetSelectedKey() const\n{\n\treturn SelectedKey.IsSet() ? SelectedKey.Get() : EKeys::Invalid;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid SSoInputKeySelector::SetSelectedKey(TAttribute<FInputChord> InSelectedKey)\n{\n\tUE_LOG(LogSoInputSelector, Verbose, TEXT(\"[bIsSelectingKey = %d] SSoInputKeySelector::SetSelectedKey = %s\"), bIsSelectingKey, *SelectedKey.Get().Key.ToString());\n\tif (SelectedKey.IdenticalTo(InSelectedKey) == false)\n\t{\n\t\tSelectedKey = InSelectedKey;\n\t\tOnKeySelectedEvent.ExecuteIfBound(SelectedKey.IsSet() ? SelectedKey.Get() : FInputChord(EKeys::Invalid));\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFMargin SSoInputKeySelector::GetMargin() const\n{\n\treturn Margin.Get();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFReply SSoInputKeySelector::OnClicked()\n{\n\tUE_LOG(LogSoInputSelector, Verbose, TEXT(\"[bIsSelectingKey = %d] SSoInputKeySelector::OnClicked\"), bIsSelectingKey);\n\tif (bIsSelectingKey == false)\n\t{\n\t\tUE_LOG(LogSoInputSelector, Verbose, TEXT(\"SSoInputKeySelector::OnClicked - calling SetIsSelectingKey(true)\"));\n\t\tSetIsSelectingKey(true, true);\n\t\treturn FReply::Handled()\n\t\t\t.SetUserFocus(SharedThis(this), EFocusCause::SetDirectly);\n\t}\n\treturn FReply::Handled();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid SSoInputKeySelector::SetMargin(TAttribute<FMargin> InMargin)\n{\n\tMargin = InMargin;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid SSoInputKeySelector::SetButtonStyle(const FButtonStyle* ButtonStyle)\n{\n\tif (Button.IsValid())\n\t{\n\t\tButton->SetButtonStyle(ButtonStyle);\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid SSoInputKeySelector::SetTextStyle(const FTextBlockStyle* InTextStyle)\n{\n\tif (TextBlock.IsValid())\n\t{\n\t\tTextBlock->SetTextStyle(InTextStyle);\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid SSoInputKeySelector::SetSelectedKeyInternal(FKey Key, bool bShiftDown, bool bControlDown, bool bAltDown, bool bCommandDown)\n{\n\tUE_LOG(LogSoInputSelector, Verbose, TEXT(\"[bIsSelectingKey = %d] SSoInputKeySelector::SetSelectedKeyInternal - Key = %s\"), bIsSelectingKey, *Key.ToString());\n\n\tconst FInputChord NewSelectedKey = bAllowModifierKeysInSelection\n\t\t? FInputChord(Key, bShiftDown, bControlDown, bAltDown, bCommandDown)\n\t\t: FInputChord(Key);\n\n\t// Not bound to anything\n\tif (SelectedKey.IsBound() == false)\n\t{\n\t\tSelectedKey.Set(NewSelectedKey);\n\t}\n\tOnKeySelectedEvent.ExecuteIfBound(NewSelectedKey);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid SSoInputKeySelector::SetIsSelectingKey(bool bIsEnabled, bool bFromOnClicked)\n{\n\tUE_LOG(LogSoInputSelector, Verbose, TEXT(\"[bIsSelectingKey = %d] SSoInputKeySelector::SetIsSelectingKey = %d\"), bIsSelectingKey, bIsEnabled);\n\tif (bIsSelectingKey == bIsEnabled)\n\t\treturn;\n\n\t// if (bInIsSelectingKey && !bFromOnClicked)\n\t// {\n\t// \t// FSlateApplication::Get().SetAllUserFocus(Button, EFocusCause::SetDirectly);\n\t// \tFGeometry Geometry;\n\t// \tFPointerEvent MouseEvent;\n\t// \tButton->OnMouseButtonDown(Geometry, MouseEvent);\n\t// \treturn;\n\t// }\n\n\t// Focus first\n\tif (bIsEnabled)\n\t{\n\t\tUE_LOG(LogSoInputSelector, Verbose, TEXT(\"[bIsSelectingKey = %d] SSoInputKeySelector::SetIsSelectingKey Focus THIS Selector\"), bIsSelectingKey);\n\n\t\t// Ignore first key if from keyboard\n\t\tif (!bFromOnClicked)\n\t\t\tbIgnoreKeyUp = true;\n\n\t\tSelectedKey = FInputChord();\n\t\tFocusThisWidget();\n\t}\n\telse\n\t{\n\t\tUE_LOG(LogSoInputSelector, Verbose, TEXT(\"[bIsSelectingKey = %d] SSoInputKeySelector::SetIsSelectingKey Returning focus to game\"), bIsSelectingKey);\n\t\tFocusPreviousWidget();\n\t}\n\n\tbIsSelectingKey = bIsEnabled;\n\t// bWasFirstKeyIgnored = false;\n\n\t// Prevents certain inputs from being consumed by the button\n\tif (Button.IsValid())\n\t{\n\t\tButton->SetEnabled(!bIsSelectingKey);\n\t}\n\tOnIsSelectingKeyChangedEvent.ExecuteIfBound();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid SSoInputKeySelector::Tick(const FGeometry& AllottedGeometry, double InCurrentTime, float InDeltaTime)\n{\n\tSuper::Tick(AllottedGeometry, InCurrentTime, InDeltaTime);\n\tCurrentTick++;\n\n\t// Mouse fix hack I guess\n\tif (bIsSelectingKey)\n\t{\n\t\tif (!IsThisFocused())\n\t\t{\n\t\t\tUE_LOG(\n\t\t\t\tLogSoInputSelector,\n\t\t\t\tVerbose,\n\t\t\t\tTEXT(\"[bIsSelectingKey = %d] SSoInputKeySelector::Tick - We are not focused calling FocusThisWidget() - MOUSE PROBLEM?\"),\n\t\t\t\tbIsSelectingKey\n\t\t\t);\n\t\t\tbIgnoreKeyUp = false;\n\t\t\tFocusThisWidget();\n\t\t}\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFReply SSoInputKeySelector::OnPreviewKeyDown(const FGeometry& MyGeometry, const FKeyEvent& InKeyEvent)\n{\n\t// If a widget handles this event, OnKeyDown will *not* be passed to the focused widget.\n\tUE_LOG(\n\t\tLogSoInputSelector,\n\t\tVerbose,\n\t\tTEXT(\"[bIsSelectingKey = %d] SSoInputKeySelector::OnPreviewKeyDown Key = %s, bIsSelectingKey = %d\"),\n\t\tbIsSelectingKey, *InKeyEvent.GetKey().GetFName().ToString()\n\t);\n\n\t// NOTE: if this won't get handled here then we will get the input not consumed bug, that is resolved\n\t// by loosing focus and getting focus back\n\tif (bIsSelectingKey && AllowKey(InKeyEvent.GetKey()))\n\t{\n\t\t// While selecting keys handle all key downs to prevent contained controls from interfering with key selection.\n\t\tUE_LOG(LogSoInputSelector, Verbose, TEXT(\"SSoInputKeySelector::OnPreviewKeyDown Not Handled (allowing key)\"));\n\t\treturn FReply::Handled();\n\t}\n\n\tUE_LOG(LogSoInputSelector, Verbose, TEXT(\"SSoInputKeySelector::OnPreviewKeyDown Handled (not allowing key)\"));\n\treturn Super::OnPreviewKeyDown(MyGeometry, InKeyEvent);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFReply SSoInputKeySelector::OnKeyChar(const FGeometry& MyGeometry, const FCharacterEvent& InCharacterEvent)\n{\n\tUE_LOG(LogSoInputSelector, Verbose, TEXT(\"[bIsSelectingKey = %d] SSoInputKeySelector::OnKeyChar - %s\"), bIsSelectingKey, *InCharacterEvent.ToText().ToString());\n\treturn Super::OnKeyChar(MyGeometry, InCharacterEvent);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFReply SSoInputKeySelector::OnKeyDown(const FGeometry& MyGeometry, const FKeyEvent& InKeyEvent)\n{\n\t// NOTE: This method should NOT be called. As the Widget passes it to the parent which is us.\n\t// It is handled in OnPreviewKeyDown\n\t// This should only work if bIsButtonFocusable = true\n\t// TODO: does this ever work?\n\tUE_LOG(\n\t\tLogSoInputSelector,\n\t\tVerbose,\n\t\tTEXT(\"[bIsSelectingKey = %d] SSoInputKeySelector::OnKeyDown - Key = %s\"),\n\t\tbIsSelectingKey, *InKeyEvent.GetKey().GetFName().ToString(), bIsSelectingKey\n\t);\n\n\t// Ignore all keys if we are not selecting anything\n\tif (!bIsSelectingKey)\n\t{\n\t\t// TODO we probably need to change this\n\t\tif (SelectedKey.IsSet() && SelectedKey.Get().Key.IsValid() && (AllowGamepadKeys() && InKeyEvent.GetKey() == EKeys::Gamepad_FaceButton_Left))\n\t\t{\n\t\t\tSelectedKey = FInputChord();\n\t\t\treturn FReply::Handled();\n\t\t}\n\t\tif (Button.IsValid())\n\t\t{\n\t\t\treturn Button->OnKeyDown(MyGeometry, InKeyEvent);\n\t\t}\n\t}\n\n\treturn Super::OnKeyDown(MyGeometry, InKeyEvent);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFReply SSoInputKeySelector::OnKeyUp(const FGeometry& MyGeometry, const FKeyEvent& InKeyEvent)\n{\n\tconst FString ContextString = FString::Printf(\n\t\tTEXT(\"[bIsSelectingKey = %d] SSoInputKeySelector::OnKeyUp - Key = %s\"),\n\t\tbIsSelectingKey, *InKeyEvent.GetKey().GetFName().ToString()\n\t);\n\tUE_LOG(LogSoInputSelector, Verbose, TEXT(\"%s\"), *ContextString);\n\n\tif (bIgnoreKeyUp)\n\t{\n\t\tUE_LOG(LogSoInputSelector, Verbose, TEXT(\"%s - Ignoring because bIgnoreKeyUp = %d\"), *ContextString, bIgnoreKeyUp);\n\t\tbIgnoreKeyUp = false;\n\t\treturn FReply::Handled();\n\t}\n\n\tif (bIsSelectingKey)\n\t{\n\t\tconst FKey KeyUp = InKeyEvent.GetKey();\n\t\tconst EModifierKey::Type ModifierKey = EModifierKey::FromBools(\n\t\t\tInKeyEvent.IsControlDown() && KeyUp != EKeys::LeftControl && KeyUp != EKeys::RightControl,\n\t\t\tInKeyEvent.IsAltDown() && KeyUp != EKeys::LeftAlt && KeyUp != EKeys::RightAlt,\n\t\t\tInKeyEvent.IsShiftDown() && KeyUp != EKeys::LeftShift && KeyUp != EKeys::RightShift,\n\t\t\tInKeyEvent.IsCommandDown() && KeyUp != EKeys::LeftCommand && KeyUp != EKeys::RightCommand);\n\n\t\t// Don't allow chords consisting of just modifier keys.\n\t\tconst bool bInvalidModifierKey = KeyUp.IsModifierKey() == false || ModifierKey == EModifierKey::None;\n\t\tif (AllowKey(KeyUp) && bInvalidModifierKey)\n\t\t{\n\t\t\tUE_LOG(LogSoInputSelector, Verbose, TEXT(\"%s - Allowing Key = %s\"), *ContextString, *KeyUp.GetFName().ToString());\n\n\t\t\t// Cancel selection\n\t\t\tif (bEscapeCancelsSelection && IsEscapeKey(KeyUp))\n\t\t\t{\n\t\t\t\tUE_LOG(LogSoInputSelector, Verbose, TEXT(\"%s - Cancel Selection, caling SetIsSelectingKey(false)\"), *ContextString);\n\t\t\t\tSetIsSelectingKey(false);\n\t\t\t\treturn FReply::Handled();\n\t\t\t}\n\n\t\t\tSetSelectedKeyInternal(\n\t\t\t\tKeyUp,\n\t\t\t\tModifierKey == EModifierKey::Shift,\n\t\t\t\tModifierKey == EModifierKey::Control,\n\t\t\t\tModifierKey == EModifierKey::Alt,\n\t\t\t\tModifierKey == EModifierKey::Command);\n\n\t\t\t// Selected key return\n\t\t\tUE_LOG(LogSoInputSelector, Verbose, TEXT(\"%s - Selected key return, caling SetIsSelectingKey(false)\"), *ContextString);\n\t\t\tSetIsSelectingKey(false);\n\t\t\treturn FReply::Handled();\n\t\t}\n\t\t// Do this until we allow the key\n\t}\n\tif (!bIsSelectingKey && Button.IsValid())\n\t{\n\t\treturn Button->OnKeyUp(MyGeometry, InKeyEvent);\n\t}\n\n\treturn Super::OnKeyUp(MyGeometry, InKeyEvent);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFReply SSoInputKeySelector::OnPreviewMouseButtonDown(const FGeometry& MyGeometry, const FPointerEvent& MouseEvent)\n{\n\tUE_LOG(\n\t\tLogSoInputSelector,\n\t\tVerbose,\n\t\tTEXT(\"[bIsSelectingKey = %d] SSoInputKeySelector::OnPreviewMouseButtonDown - Button = %s\"),\n\t\tbIsSelectingKey, *MouseEvent.ToText().ToString()\n\t);\n\n\t// Disabled mouse\n\tif (bIsSelectingKey && AllowKeyboardAndMouseKeys())\n\t{\n\t\tUE_LOG(\n\t\t\tLogSoInputSelector,\n\t\t\tVerbose,\n\t\t\tTEXT(\"SSoInputKeySelector::OnPreviewMouseButtonDown - Button = %s - Calling SetIsSelectingKey(false)\"),\n\t\t\t*MouseEvent.ToText().ToString()\n\t\t);\n\t\tSetIsSelectingKey(false);\n\t\tSetSelectedKeyInternal(MouseEvent.GetEffectingButton(), false, false, false, false);\n\t\treturn FReply::Handled();\n\t}\n\n\treturn Super::OnPreviewMouseButtonDown(MyGeometry, MouseEvent);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFReply SSoInputKeySelector::OnMouseButtonDown(const FGeometry& MyGeometry, const FPointerEvent& MouseEvent)\n{\n\tUE_LOG(\n\t\tLogSoInputSelector,\n\t\tVerbose,\n\t\tTEXT(\"[bIsSelectingKey = %d] SSoInputKeySelector::OnMouseButtonDown Button = %s\"),\n\t\tbIsSelectingKey, *MouseEvent.ToText().ToString()\n\t);\n\tif (!bIsSelectingKey && SelectedKey.IsSet() && SelectedKey.Get().Key.IsValid())\n\t{\n\t\treturn FReply::Handled();\n\t}\n\treturn Super::OnMouseButtonDown(MyGeometry, MouseEvent);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid SSoInputKeySelector::OnFocusChanging(const FWeakWidgetPath& PreviousFocusPath, const FWidgetPath& NewWidgetPath, const FFocusEvent& InFocusEvent)\n{\n\tFString PreviousWidgetString = TEXT(\"NULL\");\n\tFString NewWidgetString = TEXT(\"NULL\");\n\tif (PreviousFocusPath.IsValid())\n\t{\n\t\tconst FWidgetPath PreviousWidgetPath = PreviousFocusPath.ToWidgetPath();\n\t\tif (PreviousFocusPath.IsValid())\n\t\t{\n\t\t\tconst TSharedRef<SWidget> PreviousWidget = PreviousWidgetPath.GetLastWidget();\n\t\t\tPreviousWidgetString = PreviousWidget->ToString();\n\t\t}\n\t}\n\tif (NewWidgetPath.IsValid())\n\t{\n\t\tconst TSharedRef<SWidget> NewWidget = NewWidgetPath.GetLastWidget();\n\t\tNewWidgetString = NewWidget->ToString();\n\t}\n\n\tUE_LOG(\n\t\tLogSoInputSelector,\n\t\tVerbose,\n\t\tTEXT(\"[bIsSelectingKey = %d] SSoInputKeySelector::OnFocusChanging - PreviousFocusPath = %s, NewWidgetPath = %s\"),\n\t\tbIsSelectingKey, *PreviousWidgetString, *NewWidgetString\n\t);\n\n\tSuper::OnFocusChanging(PreviousFocusPath, NewWidgetPath, InFocusEvent);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFReply SSoInputKeySelector::OnFocusReceived(const FGeometry& MyGeometry, const FFocusEvent& InFocusEvent)\n{\n\tUE_LOG(LogSoInputSelector, Verbose, TEXT(\"[bIsSelectingKey = %d] SSoInputKeySelector::OnFocusReceived\"), bIsSelectingKey);\n\tOnFocusedReceivedTick = CurrentTick;\n\treturn Super::OnFocusReceived(MyGeometry, InFocusEvent);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid SSoInputKeySelector::OnFocusLost(const FFocusEvent& InFocusEvent)\n{\n\tUE_LOG(LogSoInputSelector, Verbose, TEXT(\"[bIsSelectingKey = %d] SSoInputKeySelector::OnFocusLost\"), bIsSelectingKey);\n\tif (bIsSelectingKey)\n\t{\n\t\t// NOTE: See Tick() for a fix for mouse\n\t\tif (CurrentTick == OnFocusedReceivedTick)\n\t\t{\n\t\t\tUE_LOG(\n\t\t\t\tLogSoInputSelector,\n\t\t\t\tVerbose,\n\t\t\t\tTEXT(\"[bIsSelectingKey = %d] SSoInputKeySelector::OnFocusLost - CurrentTick(%d) == OnFocusedReceivedTick(%d) - MOUSE PROBLEM FOCUS????\"),\n\t\t\t\tbIsSelectingKey, CurrentTick, OnFocusedReceivedTick\n\t\t\t);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tUE_LOG(LogSoInputSelector, Verbose, TEXT(\"[bIsSelectingKey = %d] SSoInputKeySelector::OnFocusLost - Calling SetIsSelectingKey(false)\"), bIsSelectingKey);\n\t\t\tSetIsSelectingKey(false);\n\t\t}\n\t}\n\n\t// if (!bIsSelectingKey)\n\t// \treturn;\n\t//\n\t// UE_LOG(LogSoInputSelector, Verbose, TEXT(\"SSoInputKeySelector::OnFocusLost Cause = %d\"), static_cast<int32>(InFocusEvent.GetCause()))\n\t// SetIsSelectingKey(false);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFNavigationReply SSoInputKeySelector::OnNavigation(const FGeometry& MyGeometry, const FNavigationEvent& InNavigationEvent)\n{\n\tUE_LOG(LogSoInputSelector, Verbose, TEXT(\"[bIsSelectingKey = %d] SSoInputKeySelector::OnNavigation\"), bIsSelectingKey);\n\n\tif (bIsSelectingKey)\n\t\treturn FNavigationReply::Stop();\n\n\tif (Button.IsValid())\n\t{\n\t\treturn Button->OnNavigation(MyGeometry, InNavigationEvent);\n\t}\n\n\treturn Super::OnNavigation(MyGeometry, InNavigationEvent);\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid SSoInputKeySelector::SetTextBlockVisibility(EVisibility InVisibility)\n{\n\tif (TextBlock.IsValid())\n\t{\n\t\tTextBlock->SetVisibility(InVisibility);\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool SSoInputKeySelector::AllowKey(const FKey& Key) const\n{\n\tif (!Key.IsValid())\n\t\treturn false;\n\n\t// Gamepad\n\tif (AllowGamepadKeys() && Key.IsGamepadKey())\n\t\treturn true;\n\n\t// Mouse without keyboard\n\tconst bool bIsKeyboardKey = !Key.IsGamepadKey();\n\tconst bool bIsMouseButton = Key.IsMouseButton();\n\tif (AllowKeyboardKeys() && (bIsKeyboardKey && !bIsMouseButton))\n\t\treturn true;\n\n\t// Mouse with keyboard\n\tif (AllowKeyboardAndMouseKeys() && (bIsKeyboardKey || bIsMouseButton))\n\t\treturn true;\n\n\treturn false;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool SSoInputKeySelector::IsThisFocused() const\n{\n\tconst TSharedPtr<SWidget> FocusedWidget = FSlateApplication::Get().GetUserFocusedWidget(0);\n\treturn SharedThis(this) == FocusedWidget;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid SSoInputKeySelector::FocusThisWidget()\n{\n\tUE_LOG(LogSoInputSelector, Verbose, TEXT(\"[bIsSelectingKey = %d] SSoInputKeySelector::FocusThisWidget\"), bIsSelectingKey);\n\tFSlateApplication::Get().SetAllUserFocus(SharedThis(this), EFocusCause::SetDirectly);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid SSoInputKeySelector::FocusPreviousWidget()\n{\n\tUE_LOG(LogSoInputSelector, Verbose, TEXT(\"[bIsSelectingKey = %d] SSoInputKeySelector::FocusPreviousWidget\"), bIsSelectingKey);\n\tif (PreviousFocusedWidget.IsValid())\n\t\tFSlateApplication::Get().SetAllUserFocus(PreviousFocusedWidget.ToSharedRef(), EFocusCause::SetDirectly);\n\telse\n\t\t// Reset to viewport\n\t\tFSlateApplication::Get().SetAllUserFocusToGameViewport();\n}\n"
  },
  {
    "path": "Source/SOrb/UI/Menu/Settings/KeySelector/SSoInputKeySelector.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#pragma once\n\n#include \"CoreMinimal.h\"\n#include \"Misc/Attribute.h\"\n#include \"InputCoreTypes.h\"\n#include \"Layout/Margin.h\"\n#include \"Fonts/SlateFontInfo.h\"\n#include \"Input/Reply.h\"\n#include \"Styling/SlateWidgetStyleAsset.h\"\n#include \"Widgets/DeclarativeSyntaxSupport.h\"\n#include \"Widgets/SCompoundWidget.h\"\n#include \"Styling/SlateTypes.h\"\n#include \"Styling/CoreStyle.h\"\n#include \"Framework/Commands/InputChord.h\"\n#include \"Layout/Visibility.h\"\n\n#include \"SoLocalization.h\"\n\n\n// NOTE: to debug the selector, set this to All\nDECLARE_LOG_CATEGORY_EXTERN(LogSoInputSelector, Log, All);\n\nclass SButton;\nclass STextBlock;\n\n// From what device should we accept input\nUENUM(BlueprintType)\nenum class ESoInputKeySelectorDeviceType : uint8\n{\n\tAll = 0,\n\n\tKeyboard,\n\tKeyboardAndMouse,\n\n\tGamepad,\n};\n\n/**\n * A widget for selecting keys or input chords.\n * Modified version of the SInputKeySelector from unreal\n */\nclass SORB_API SSoInputKeySelector : public SCompoundWidget\n{\n\ttypedef SSoInputKeySelector Self;\n\ttypedef SCompoundWidget Super;\n\npublic:\n\t// Events that something changed\n\tDECLARE_DELEGATE_OneParam(FSoKeySelectedEvent, const FInputChord&)\n\tDECLARE_DELEGATE(FSoIsSelectingKeyChangedEvent)\n\n\tSLATE_BEGIN_ARGS(Self)\n\t\t: _SelectedKey(FInputChord(EKeys::Invalid) )\n\t\t, _ButtonStyle(&FCoreStyle::Get().GetWidgetStyle<FButtonStyle>(\"Button\"))\n\t\t, _TextStyle(&FCoreStyle::Get().GetWidgetStyle<FTextBlockStyle>(\"NormalText\"))\n\t\t, _KeySelectionText(FROM_STRING_TABLE_UI(\"line_three_dots\"))\n\t\t, _NoKeySpecifiedText(FROM_STRING_TABLE_UI(\"empty\"))\n\t\t, _AllowModifierKeysInSelection(false)\n\t\t, _AllowedInputType(ESoInputKeySelectorDeviceType::Keyboard)\n\t\t, _EscapeCancelsSelection(true)\n\t\t, _IsButtonFocusable(true)\n\t\t{}\n\n\t\t/** The currently selected key */\n\t\tSLATE_ATTRIBUTE(FInputChord, SelectedKey)\n\n\t\t/** The font used to display the currently selected key. */\n\t\tSLATE_ATTRIBUTE(FSlateFontInfo, Font)\n\n\t\t/** The margin around the selected key text. */\n\t\tSLATE_ATTRIBUTE(FMargin, Margin)\n\n\t\t/** The style of the button used to enable key selection. */\n\t\tSLATE_STYLE_ARGUMENT(FButtonStyle, ButtonStyle)\n\n\t\t/** The text style of the button text */\n\t\tSLATE_STYLE_ARGUMENT(FTextBlockStyle, TextStyle)\n\n\t\t/** The text to display while selecting a new key. */\n\t\tSLATE_ARGUMENT(FText, KeySelectionText)\n\n\t\t/** The text to display while no key text is available or not selecting a key. */\n\t\tSLATE_ARGUMENT(FText, NoKeySpecifiedText)\n\n\t\t/** When true modifier keys are captured in the selected key chord, otherwise they are ignored. */\n\t\tSLATE_ARGUMENT(bool, AllowModifierKeysInSelection)\n\n\t\t/** What type of input are we accepting, if keyboard only all other inputs are ignored */\n\t\tSLATE_ARGUMENT(ESoInputKeySelectorDeviceType, AllowedInputType)\n\n\t\t/** When true, pressing escape will cancel the key selection, when false, pressing escape will select the escape key. */\n\t\tSLATE_ARGUMENT(bool, EscapeCancelsSelection)\n\n\t\t/** When EscapeCancelsSelection is true, escape on specific keys that are unbind able by the user. */\n\t\tSLATE_ARGUMENT(TArray<FKey>, EscapeKeys)\n\n\t\t/** The Widget to return the focus to after we are not selecting the key anymore */\n\t\tSLATE_ARGUMENT(TSharedPtr<SWidget>, PreviousFocusedWidget)\n\n\t\t/** Occurs whenever a new key is selected. */\n\t\tSLATE_EVENT(FSoKeySelectedEvent, OnKeySelectedEvent)\n\n\t\t/** Occurs whenever key selection mode starts and stops. */\n\t\tSLATE_EVENT(FSoIsSelectingKeyChangedEvent, OnIsSelectingKeyChangedEvent)\n\n\t\t/** Sometimes a button should only be mouse-clickable and never keyboard focusable. */\n\t\tSLATE_ARGUMENT(bool, IsButtonFocusable)\n\tSLATE_END_ARGS()\n\n\t//\n\t// Own methods\n\t//\n\n\tvoid Construct(const FArguments& InArgs);\n\n\t/** Gets the currently selected key chord. */\n\tFInputChord GetSelectedKey() const;\n\n\t/** Sets the currently selected key chord. */\n\tvoid SetSelectedKey(TAttribute<FInputChord> InSelectedKey);\n\n\t/** Sets the margin around the text used to display the currently selected key */\n\tvoid SetMargin(TAttribute<FMargin> InMargin);\n\n\t/** Sets the style of the button which is used enter key selection mode. */\n\tvoid SetButtonStyle(const FButtonStyle* ButtonStyle);\n\n\t/** Sets the style of the text on the button which is used enter key selection mode. */\n\tvoid SetTextStyle(const FTextBlockStyle* InTextStyle);\n\n\t/** Sets the text which is displayed when selecting a key. */\n\tvoid SetKeySelectionText(FText InKeySelectionText) { KeySelectionText = MoveTemp(InKeySelectionText); }\n\n\t/** Sets the text to display when no key text is available or not selecting a key. */\n\tvoid SetNoKeySpecifiedText(FText InNoKeySpecifiedText) { NoKeySpecifiedText = MoveTemp(InNoKeySpecifiedText); }\n\n\t// what it says\n\tvoid SetPreviousFocusedWidget(TSharedPtr<SWidget> InWidget) { PreviousFocusedWidget = InWidget; }\n\n\t/** When true modifier keys are captured in the selected key chord, otherwise they are ignored. */\n\tvoid SetAllowModifierKeysInSelection(bool bInAllowModifierKeys) { bAllowModifierKeysInSelection = bInAllowModifierKeys; }\n\n\t/** What type of input are we accepting, if keyboard only all other inputs are ignored */\n\tvoid SetAllowedInputType(ESoInputKeySelectorDeviceType NewType) { AllowedInputType = NewType; }\n\n\t/** Sets the escape keys to check against. */\n\tvoid SetEscapeKeys(const TArray<FKey>& InEscapeKeys) { EscapeKeys = InEscapeKeys; }\n\n\t/** Returns true whenever key selection mode is active, otherwise returns false. */\n\tbool IsSelectingKey() const { return bIsSelectingKey; }\n\n\t/** Sets the visibility of the text block. */\n\tvoid SetTextBlockVisibility(EVisibility InVisibility);\n\n\t/** Sets bIsSelectingKey and invokes the associated events. */\n\tvoid SetIsSelectingKey(bool bIsEnabled, bool bFromOnClicked = false);\n\n\t//\n\t// SWidget interface\n\t//\n\tvoid Tick(const FGeometry& AllottedGeometry, double InCurrentTime, float InDeltaTime) override;\n\n\n\t// Key input\n\tFReply OnPreviewKeyDown(const FGeometry& MyGeometry, const FKeyEvent& InKeyEvent) override;\n\tFReply OnKeyChar(const FGeometry& MyGeometry, const FCharacterEvent& InCharacterEvent) override;\n\tFReply OnKeyDown(const FGeometry& MyGeometry, const FKeyEvent& InKeyEvent) override;\n\tFReply OnKeyUp(const FGeometry& MyGeometry, const FKeyEvent& InKeyEvent) override;\n\n\t// Mouse\n\tFReply OnPreviewMouseButtonDown(const FGeometry& MyGeometry, const FPointerEvent& MouseEvent) override;\n\tFReply OnMouseButtonDown(const FGeometry& MyGeometry, const FPointerEvent& MouseEvent) override;\n\n\t// Focus\n\tvoid OnFocusChanging(const FWeakWidgetPath& PreviousFocusPath, const FWidgetPath& NewWidgetPath, const FFocusEvent& InFocusEvent) override;\n\tFReply OnFocusReceived(const FGeometry& MyGeometry, const FFocusEvent& InFocusEvent) override;\n\tvoid OnFocusLost(const FFocusEvent& InFocusEvent) override;\n\n\tFNavigationReply OnNavigation(const FGeometry& MyGeometry, const FNavigationEvent& InNavigationEvent) override;\n\tbool SupportsKeyboardFocus() const override { return true; }\n\nprivate:\n\t//\n\t// Own methods\n\t//\n\n\t/** Gets the display text for the currently selected key. */\n\tFText GetSelectedKeyText() const;\n\n\t/**  Gets the margin around the text used to display the currently selected key. */\n\tFMargin GetMargin() const;\n\n\t// Handles the OnClicked event from the button which enables key selection mode.\n\tFReply OnClicked();\n\n\t/** Sets the currently selected key and invokes the associated events. */\n\tvoid SetSelectedKeyInternal(FKey Key, bool bShiftDown, bool bControlDown, bool bAltDown, bool bCommandDown);\n\n\t/** Returns true, if the key has been specified as an escape key, else false. */\n\tbool IsEscapeKey(const FKey& InKey) const\n\t{\n\t\treturn InKey == EKeys::PS4_Special || InKey == EKeys::Escape || EscapeKeys.Contains(InKey);\n\t}\n\n\tbool AllowKeyboardAndMouseKeys() const\n\t{\n\t\treturn AllowedInputType == ESoInputKeySelectorDeviceType::All ||\n\t\t\t   AllowedInputType == ESoInputKeySelectorDeviceType::KeyboardAndMouse;\n\t}\n\tbool AllowGamepadKeys() const\n\t{\n\t\treturn AllowedInputType == ESoInputKeySelectorDeviceType::All ||\n\t\t\t   AllowedInputType == ESoInputKeySelectorDeviceType::Gamepad;\n\t}\n\tbool AllowKeyboardKeys() const\n\t{\n\t\treturn AllowedInputType == ESoInputKeySelectorDeviceType::All ||\n\t\t\t   AllowedInputType == ESoInputKeySelectorDeviceType::Keyboard ||\n\t\t\t   AllowedInputType == ESoInputKeySelectorDeviceType::KeyboardAndMouse;\n\t}\n\tbool AllowKey(const FKey& Key) const;\n\n\tbool IsThisFocused() const;\n\tvoid FocusThisWidget();\n\tvoid FocusPreviousWidget();\n\nprivate:\n\t/** True when key selection mode is active. */\n\tbool bIsSelectingKey = false;\n\n\t/** The currently selected key chord. */\n\tTAttribute<FInputChord> SelectedKey;\n\n\t/** The margin around the text used to display the currently selected key. */\n\tTAttribute<FMargin> Margin;\n\n\t/** The text to display when selecting keys. */\n\tFText KeySelectionText;\n\n\t/**  The text to display while no key text is available or not selecting a key. */\n\tFText NoKeySpecifiedText;\n\n\t/** When true modifier keys are recorded on the selected key chord, otherwise they are ignored. */\n\tbool bAllowModifierKeysInSelection = false;\n\n\t/** What type of input are we accepting, if keyboard only all other inputs are ignored */\n\tESoInputKeySelectorDeviceType AllowedInputType = ESoInputKeySelectorDeviceType::Keyboard;\n\n\t/** When true, pressing escape will cancel the key selection, when false, pressing escape will select the escape key. */\n\tbool bEscapeCancelsSelection = true;\n\n\t/**\n\t * When EscapeCancelsSelection is true, escape on specific keys that are unbind able by the user.\n\t *\n\t * This is besides  EKeys::PS4_Special and EKeys::Escape\n\t */\n\tTArray<FKey> EscapeKeys;\n\n\t/** Delegate which is run any time a new key is selected. */\n\tFSoKeySelectedEvent OnKeySelectedEvent;\n\n\t/** Delegate which is run when key selection mode starts and stops. */\n\tFSoIsSelectingKeyChangedEvent OnIsSelectingKeyChangedEvent;\n\n\t/** The button which starts the key selection mode. */\n\tTSharedPtr<SButton> Button;\n\n\t/** The text which is rendered on the button. */\n\tTSharedPtr<STextBlock> TextBlock;\n\n\t/** Can this button be focused? */\n\tbool bIsButtonFocusable = false;\n\n\t// Should we ignore it?\n\tbool bIgnoreKeyUp = false;\n\n\t// TODO get rid of this, use OnFocusChanging\n\t// Keep track of the previous focused widget\n\tTSharedPtr<SWidget> PreviousFocusedWidget;\n\n\n\t// Track the current tick\n\tint64 CurrentTick = 0;\n\tint64 OnFocusedReceivedTick = 0;\n};\n"
  },
  {
    "path": "Source/SOrb/UI/Menu/Settings/KeySelector/SoUIInputKeySelector.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#include \"SoUIInputKeySelector.h\"\n\n#include \"Engine/Font.h\"\n#include \"UObject/ConstructorHelpers.h\"\n#include \"UObject/FrameworkObjectVersion.h\"\n#include \"Widgets/DeclarativeSyntaxSupport.h\"\n#include \"SSoInputKeySelector.h\"\n#include \"Localization/SoLocalization.h\"\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUSoUIInputKeySelector::USoUIInputKeySelector(const FObjectInitializer& ObjectInitializer)\n\t: Super(ObjectInitializer)\n{\n\tconst SSoInputKeySelector::FArguments InputKeySelectorDefaults;\n\tWidgetStyle = *InputKeySelectorDefaults._ButtonStyle;\n\tTextStyle = *InputKeySelectorDefaults._TextStyle;\n\tKeySelectionText = InputKeySelectorDefaults._KeySelectionText;\n\tNoKeySpecifiedText = InputKeySelectorDefaults._NoKeySpecifiedText;\n\tSelectedKey = InputKeySelectorDefaults._SelectedKey.Get();\n\tbAllowModifierKeysInSelection = InputKeySelectorDefaults._AllowModifierKeysInSelection;\n\tAllowedInputType = InputKeySelectorDefaults._AllowedInputType;\n\n\tEscapeKeys.AddUnique(EKeys::Gamepad_Special_Right); // In most (if not all) cases this is going to be the menu button\n\n\tif (!IsRunningDedicatedServer())\n\t{\n\t\tstatic ConstructorHelpers::FObjectFinder<UFont> RobotoFontObj(TEXT(\"/Engine/EngineFonts/Roboto\"));\n\t\tTextStyle.Font = FSlateFontInfo(RobotoFontObj.Object, 24, FName(\"Bold\"));\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIInputKeySelector::Serialize(FArchive& Ar)\n{\n\tSuper::Serialize(Ar);\n\tAr.UsingCustomVersion(FFrameworkObjectVersion::GUID);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIInputKeySelector::PostLoad()\n{\n\tSuper::PostLoad();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIInputKeySelector::SetSelectedKey(const FInputChord& InSelectedKey)\n{\n\tif (MyInputKeySelector.IsValid())\n\t{\n\t\tMyInputKeySelector->SetSelectedKey(InSelectedKey);\n\t}\n\tSelectedKey = InSelectedKey;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIInputKeySelector::SetKeySelectionText(FText InKeySelectionText)\n{\n\tif (MyInputKeySelector.IsValid())\n\t{\n\t\tMyInputKeySelector->SetKeySelectionText(InKeySelectionText);\n\t}\n\tKeySelectionText = MoveTemp(InKeySelectionText);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIInputKeySelector::SetNoKeySpecifiedText(FText InNoKeySpecifiedText)\n{\n\tif (MyInputKeySelector.IsValid())\n\t{\n\t\tMyInputKeySelector->SetNoKeySpecifiedText(InNoKeySpecifiedText);\n\t}\n\tNoKeySpecifiedText = MoveTemp(InNoKeySpecifiedText);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIInputKeySelector::SetPreviousFocusedWidget(TSharedPtr<SWidget> InWidget)\n{\n\tif (MyInputKeySelector.IsValid())\n\t{\n\t\tMyInputKeySelector->SetPreviousFocusedWidget(InWidget);\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIInputKeySelector::SetAllowModifierKeysInSelection(bool bInAllowModifierKeys)\n{\n\tif (MyInputKeySelector.IsValid())\n\t{\n\t\tMyInputKeySelector->SetAllowModifierKeysInSelection(bInAllowModifierKeys);\n\t}\n\tbAllowModifierKeysInSelection = bInAllowModifierKeys;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIInputKeySelector::SetAllowedInputType(ESoInputKeySelectorDeviceType NewType)\n{\n\tif (MyInputKeySelector.IsValid())\n\t{\n\t\tMyInputKeySelector->SetAllowedInputType(NewType);\n\t}\n\tAllowedInputType = NewType;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoUIInputKeySelector::IsSelectingKey() const\n{\n\treturn MyInputKeySelector.IsValid() ? MyInputKeySelector->IsSelectingKey() : false;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIInputKeySelector::SetIsSelectingKey(bool bInIsSelectingKey)\n{\n\tUE_LOG(LogSoInputSelector, Verbose, TEXT(\"USoUIInputKeySelector::SetIsSelectingKey = %d\"), bInIsSelectingKey);\n\tif (MyInputKeySelector.IsValid())\n\t\tMyInputKeySelector->SetIsSelectingKey(bInIsSelectingKey);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIInputKeySelector::SetButtonStyle(const FButtonStyle* InButtonStyle)\n{\n\tif (MyInputKeySelector.IsValid())\n\t{\n\t\tMyInputKeySelector->SetButtonStyle(InButtonStyle);\n\t}\n\tWidgetStyle = *InButtonStyle;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIInputKeySelector::SynchronizeProperties()\n{\n\tSuper::SynchronizeProperties();\n\n\tif (MyInputKeySelector.IsValid())\n\t{\n\t\tMyInputKeySelector->SetSelectedKey(SelectedKey);\n\t\tMyInputKeySelector->SetMargin(Margin);\n\t\tMyInputKeySelector->SetButtonStyle(&WidgetStyle);\n\t\tMyInputKeySelector->SetTextStyle(&TextStyle);\n\t\tMyInputKeySelector->SetKeySelectionText(KeySelectionText);\n\t\tMyInputKeySelector->SetAllowModifierKeysInSelection(bAllowModifierKeysInSelection);\n\t\tMyInputKeySelector->SetAllowedInputType(AllowedInputType);\n\t\tMyInputKeySelector->SetEscapeKeys(EscapeKeys);\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIInputKeySelector::ReleaseSlateResources(bool bReleaseChildren)\n{\n\tSuper::ReleaseSlateResources(bReleaseChildren);\n\tMyInputKeySelector.Reset();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nTSharedRef<SWidget> USoUIInputKeySelector::RebuildWidget()\n{\n\tMyInputKeySelector = SNew(SSoInputKeySelector)\n\t\t.SelectedKey(SelectedKey)\n\t\t.Margin(Margin)\n\t\t.ButtonStyle(&WidgetStyle)\n\t\t.TextStyle(&TextStyle)\n\t\t.KeySelectionText(KeySelectionText)\n\t\t.AllowModifierKeysInSelection(bAllowModifierKeysInSelection)\n\t\t.AllowedInputType(AllowedInputType)\n\t\t.EscapeCancelsSelection(true)\n\t\t.IsButtonFocusable(true)\n\t\t.EscapeKeys(EscapeKeys)\n\t\t.NoKeySpecifiedText(FROM_STRING_TABLE_UI(\"empty\"))\n\t\t.OnKeySelectedEvent(BIND_UOBJECT_DELEGATE(SSoInputKeySelector::FSoKeySelectedEvent, HandleKeySelected))\n\t\t.OnIsSelectingKeyChangedEvent(BIND_UOBJECT_DELEGATE(SSoInputKeySelector::FSoIsSelectingKeyChangedEvent, HandleIsSelectingKeyChanged));\n\n\treturn MyInputKeySelector.ToSharedRef();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIInputKeySelector::HandleKeySelected(const FInputChord& InSelectedKey)\n{\n\tSelectedKey = InSelectedKey;\n\tKeySelectedEvent.Broadcast(SelectedKey);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIInputKeySelector::HandleIsSelectingKeyChanged()\n{\n\tIsSelectingKeyChangedEvent.Broadcast(IsSelectingKey());\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIInputKeySelector::SetTextBlockVisibility(ESlateVisibility InVisibility)\n{\n\tif (MyInputKeySelector.IsValid())\n\t{\n\t\tconst EVisibility SlateVisibility = ConvertSerializedVisibilityToRuntime(InVisibility);\n\t\tMyInputKeySelector->SetTextBlockVisibility(SlateVisibility);\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIInputKeySelector::SetEscapeKeys(const TArray<FKey>& InEscapeKeys)\n{\n\tif (MyInputKeySelector.IsValid())\n\t{\n\t\tMyInputKeySelector->SetEscapeKeys(InEscapeKeys);\n\t}\n\tEscapeKeys = InEscapeKeys;\n}\n"
  },
  {
    "path": "Source/SOrb/UI/Menu/Settings/KeySelector/SoUIInputKeySelector.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#pragma once\n\n#include \"CoreMinimal.h\"\n#include \"UObject/ObjectMacros.h\"\n#include \"Framework/Commands/InputChord.h\"\n#include \"Layout/Margin.h\"\n#include \"Widgets/SWidget.h\"\n#include \"Components/Widget.h\"\n#include \"Styling/SlateTypes.h\"\n#include \"SSoInputKeySelector.h\"\n\n\n#include \"SoUIInputKeySelector.generated.h\"\n\nclass SSoInputKeySelector;\nstruct FButtonStyle;\n\nDECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FSoKeySelectedEvent, const FInputChord&, SelectedKey);\nDECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FSoIsSelectingKeyChangedEvent, bool, bIsSelectingKey);\n\n\n/** Own version of the UInputKeySelector so that we can use the keyboard/gamepad only */\nUCLASS(HideCategories = (Navigation), AutoCollapseCategories = (Performance, Clipping, Interaction, Input))\nclass SORB_API USoUIInputKeySelector : public UWidget\n{\n\tGENERATED_BODY()\n\ttypedef USoUIInputKeySelector Self;\n\npublic:\n\tUSoUIInputKeySelector(const FObjectInitializer& ObjectInitializer);\n\n\t// Events Hierarchy:\n\t// 1. SSoInputKeySelector\n\t// 2. Self\n\n\t//\n\t// Own methods\n\t//\n\n\t/** Sets the currently selected key. */\n\tUFUNCTION(BlueprintCallable, Category = \">Widget\")\n\tvoid SetSelectedKey(const FInputChord& InSelectedKey);\n\n\t// Gets the current selected key\n\tconst FInputChord& GetSelectedKey() const { return SelectedKey; }\n\n\t/** Sets the text which is displayed while selecting keys. */\n\tUFUNCTION(BlueprintCallable, Category = \">Widget\")\n\tvoid SetKeySelectionText(FText InKeySelectionText);\n\n\t/** Sets the text to display when no key text is available or not selecting a key. */\n\tUFUNCTION(BlueprintCallable, Category = \">Widget\")\n\tvoid SetNoKeySpecifiedText(FText InNoKeySpecifiedText);\n\n\tvoid SetPreviousFocusedWidget(TSharedPtr<SWidget> InWidget);\n\n\t/** Sets whether or not modifier keys are allowed in the selected key. */\n\tUFUNCTION(BlueprintCallable, Category = \">Widget\")\n\tvoid SetAllowModifierKeysInSelection(bool bInAllowModifierKeys);\n\n\t/** What type of input are we accepting, if keyboard only all other inputs are ignored */\n\tUFUNCTION(BlueprintCallable, Category = \">Widget\")\n\tvoid SetAllowedInputType(ESoInputKeySelectorDeviceType NewType);\n\n\t/** Returns true if the widget is currently selecting a key, otherwise returns false. */\n\tUFUNCTION(BlueprintPure, Category = \">Widget\")\n\tbool IsSelectingKey() const;\n\n\tUFUNCTION(BlueprintCallable, Category = \">Widget\")\n\tvoid SetIsSelectingKey(bool bInIsSelectingKey);\n\n\t/** Sets the visibility of the text block. */\n\tUFUNCTION(BlueprintCallable, Category = \">Widget\")\n\tvoid SetTextBlockVisibility(ESlateVisibility InVisibility);\n\n\t/** Sets the escape keys to check against. */\n\tUFUNCTION(BlueprintCallable, Category = \">Widget\")\n\tvoid SetEscapeKeys(const TArray<FKey>& InEscapeKeys);\n\n\t/** Sets the style of the button used to start key selection mode. */\n\tvoid SetButtonStyle(const FButtonStyle* ButtonStyle);\n\n\tFSoKeySelectedEvent& OnKeySelectedEvent() { return KeySelectedEvent; }\n\tFSoIsSelectingKeyChangedEvent& OnIsSelectingKeyChangedEvent() { return IsSelectingKeyChangedEvent; }\n\n\t//\n\t// UWidget Interface\n\t//\n\tvoid SynchronizeProperties() override;\n\nprotected:\n\t//\n\t// UObject Interface\n\t//\n\tvoid PostLoad() override;\n\tvoid Serialize(FArchive& Ar) override;\n\n\t//\n\t// UWidget Interface\n\t//\n\tTSharedRef<SWidget> RebuildWidget() override;\n\n\t//\n\t// Begin UVisual Interface\n\t//\n\tvoid ReleaseSlateResources(bool bReleaseChildren) override;\n\n\t//\n\t// Own methods\n\t//\n\tvoid HandleKeySelected(const FInputChord& InSelectedKey);\n\tvoid HandleIsSelectingKeyChanged();\n\nprotected:\n\t\t/** Called whenever a new key is selected by the user. */\n\tUPROPERTY(BlueprintAssignable, Category = \">Events\")\n\tFSoKeySelectedEvent KeySelectedEvent;\n\n\t/** Called whenever the key selection mode starts or stops. */\n\tUPROPERTY(BlueprintAssignable, Category = \">Events\")\n\tFSoIsSelectingKeyChangedEvent IsSelectingKeyChangedEvent;\n\n\t/** The button style used at runtime */\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = \">Appearance\", meta = (DisplayName = \"Style\"))\n\tFButtonStyle WidgetStyle;\n\n\t/** The button style used at runtime */\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = \">Appearance\", meta = (DisplayName = \"Text Style\"))\n\tFTextBlockStyle TextStyle;\n\n\t/** The amount of blank space around the text used to display the currently selected key. */\n\tUPROPERTY(EditAnywhere, BlueprintReadOnly, Category = \">Appearance\")\n\tFMargin Margin;\n\n\t/** Sets the text which is displayed while selecting keys. */\n\tUPROPERTY(EditAnywhere, BlueprintReadOnly, Category = \">Appearance\")\n\tFText KeySelectionText;\n\n\t/** Sets the text to display when no key text is available or not selecting a key. */\n\tUPROPERTY(EditAnywhere, BlueprintReadOnly, Category = \">Appearance\")\n\tFText NoKeySpecifiedText;\n\n\t/** The currently selected key chord. */\n\tUPROPERTY(BlueprintReadOnly, Category = \">Key Selection\")\n\tFInputChord SelectedKey;\n\n\t/**\n\t * When true modifier keys such as control and alt are allowed in the\n\t * input chord representing the selected key, if false modifier keys are ignored.\n\t */\n\tUPROPERTY(EditAnywhere, BlueprintReadOnly, Category = \">Key Selection\")\n\tbool bAllowModifierKeysInSelection = false;\n\n\t/** What type of input are we accepting, if keyboard only all other inputs are ignored */\n\tUPROPERTY(EditAnywhere, BlueprintReadOnly, Category = \">Key Selection\")\n\tESoInputKeySelectorDeviceType AllowedInputType = ESoInputKeySelectorDeviceType::Keyboard;\n\n\t/** When true gamepad keys are allowed in the input chord representing the selected key, otherwise they are ignored. */\n\tUPROPERTY(EditAnywhere, BlueprintReadOnly, Category = \">Key Selection\")\n\tTArray<FKey> EscapeKeys;\n\nprivate:\n\t/** The input key selector widget managed by this object. */\n\tTSharedPtr<SSoInputKeySelector> MyInputKeySelector;\n};\n"
  },
  {
    "path": "Source/SOrb/UI/Menu/Settings/KeySelector/SoUIInputKeySelectorOverlay.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#include \"SoUIInputKeySelectorOverlay.h\"\n\n#include \"Components/TextBlock.h\"\n#include \"Framework/Application/SlateApplication.h\"\n\n#include \"SoUIInputKeySelector.h\"\n#include \"UI/General/Buttons/SoUIButtonImageArray.h\"\n#include \"Components/Image.h\"\n#include \"UI/SoUIHelper.h\"\n\n#include \"Settings/Input/SoInputHelper.h\"\n#include \"Basic/SoGameSingleton.h\"\n#include \"Basic/SoAudioManager.h\"\n#include \"Localization/SoLocalization.h\"\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIInputKeySelectorOverlay::SynchronizeProperties()\n{\n\tSuper::SynchronizeProperties();\n\n\tif (KeySelector)\n\t{\n\t\tKeySelector->SetAllowModifierKeysInSelection(bAllowModifierKeysInSelection);\n\t\tKeySelector->SetEscapeKeys(EscapeKeys);\n\t\tKeySelector->SetAllowedInputType(AllowedInputType);\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIInputKeySelectorOverlay::NativeConstruct()\n{\n\tSuper::NativeConstruct();\n\tSetVisibility(ESlateVisibility::Collapsed);\n\tKeySelectorImageRepresentation->SetVisibility(ESlateVisibility::Collapsed);\n\tErrorMessage->SetVisibility(ESlateVisibility::Collapsed);\n\n\tif (KeySelector)\n\t{\n\t\tKeySelector->OnKeySelectedEvent().AddDynamic(this, &ThisClass::HandleKeySelected);\n\t\tKeySelector->OnIsSelectingKeyChangedEvent().AddDynamic(this, &ThisClass::HandleIsSelectingKeyChanged);\n\t}\n\n\tif (ButtonImagesTooltipsArray)\n\t{\n\t\tButtonImagesTooltipsArray->OnNavigateOnPressedHandleChildEvent().BindLambda([this](int32 SelectedChild, USoUIUserWidget* SoUserWidget)\n\t\t{\n\t\t\tconst ESoUICommand PressedCommand = ButtonImagesTooltipsArray->GetButtonIndexCommand(SelectedChild);\n\t\t\tOnPressedButtonTooltipsCommand(PressedCommand);\n\t\t});\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIInputKeySelectorOverlay::NativeDestruct()\n{\n\tif (KeySelector)\n\t{\n\t\tKeySelector->OnKeySelectedEvent().RemoveDynamic(this, &ThisClass::HandleKeySelected);\n\t\tKeySelector->OnIsSelectingKeyChangedEvent().RemoveDynamic(this, &ThisClass::HandleIsSelectingKeyChanged);\n\t}\n\n\tSuper::NativeDestruct();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoUIInputKeySelectorOverlay::OnUICommand_Implementation(ESoUICommand Command)\n{\n\tif (!CanHandleUICommand())\n\t\treturn false;\n\n\tswitch (Command)\n\t{\n\t\tcase ESoUICommand::EUC_Left:\n\t\tcase ESoUICommand::EUC_Right:\n\t\t\treturn ButtonImagesTooltipsArray->Navigate(Command);\n\n\t\tcase ESoUICommand::EUC_MainMenuEnter:\n\t\t{\n\t\t\tconst ESoUICommand PressedCommand = ButtonImagesTooltipsArray->GetSelectedButtonCommand();\n\t\t\treturn OnPressedButtonTooltipsCommand(PressedCommand);\n\t\t}\n\n\t\tdefault:\n\t\t\treturn OnPressedButtonTooltipsCommand(Command);\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoUIInputKeySelectorOverlay::OnPressedButtonTooltipsCommand(ESoUICommand Command)\n{\n\tif (!CanHandleUICommand())\n\t\treturn false;\n\n\tswitch (Command)\n\t{\n\t\tcase UICommand_SelectAnother:\n\t\t\treturn OnCommandSelectAnotherKey();\n\n\t\tcase UICommand_Apply:\n\t\t\treturn OnCommandApply();\n\n\t\tcase UICommand_Cancel:\n\t\t\treturn OnCommandCancel();\n\n\t\tdefault:\n\t\t\tbreak;\n\t}\n\n\treturn false;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoUIInputKeySelectorOverlay::OnCommandSelectAnotherKey()\n{\n\tif (!CanHandleUICommand())\n\t\treturn false;\n\n\t// Choose another key\n\tSetIsSelectingKey(true);\n\n\tCurrentlySelectedButtonText->SetVisibility(ESlateVisibility::Visible);\n\tKeySelector->SetTextBlockVisibility(ESlateVisibility::Visible);\n\n\treturn true;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoUIInputKeySelectorOverlay::OnCommandApply()\n{\n\tif (!CanHandleUICommand())\n\t\treturn false;\n\n\tif (!IsSelectedKeyValid())\n\t\treturn false;\n\n\t// Close overlay\n\tClose();\n\tUSoAudioManager::PlaySound2D(this, USoGameSingleton::GetSFX(ESoSFX::SettingsApply));\n\n\tApplySelectedKeyEvent.Broadcast(KeySelector->GetSelectedKey());\n\treturn true;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoUIInputKeySelectorOverlay::OnCommandCancel()\n{\n\tif (IsSelectingKey())\n\t\treturn false;\n\n\t// Close overlay\n\tClose();\n\tUSoAudioManager::PlaySound2D(this, USoGameSingleton::GetSFX(ESoSFX::SettingsRestore));\n\n\tCancelSelectedKeyEvent.Broadcast();\n\treturn true;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIInputKeySelectorOverlay::Open_Implementation(bool bOpen)\n{\n\tbOpened = bOpen;\n\tErrorMessage->SetVisibility(ESlateVisibility::Collapsed);\n\tWarningMessage->SetVisibility(ESlateVisibility::Collapsed);\n\tSetVisibility(bOpen ? ESlateVisibility::Visible : ESlateVisibility::Collapsed);\n\n\tif (bOpen)\n\t{\n\t\tconst ESoInputDeviceType DeviceType = USoInputHelper::GetCurrentGamepadDeviceTypeFromSettings(this);\n\t\tGamepadDeviceType = (DeviceType == ESoInputDeviceType::Gamepad_PlayStation || DeviceType == ESoInputDeviceType::Gamepad_Switch) ?\n\t\t\t\t\t\t\tDeviceType : ESoInputDeviceType::Gamepad_Xbox;\n\t}\n\telse\n\t{\n\t\tSetIsSelectingKey(false);\n\t}\n\n\tOpenChangedEvent.Broadcast(bOpened);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIInputKeySelectorOverlay::HandleIsSelectingKeyChanged(bool bIsSelectingKey)\n{\n\t// We are trying another key, hide this message\n\tif (bIsSelectingKey)\n\t{\n\t\tErrorMessage->SetVisibility(ESlateVisibility::Collapsed);\n\t\tWarningMessage->SetVisibility(ESlateVisibility::Collapsed);\n\t}\n\telse\n\t{\n\t\tButtonImagesTooltipsArray->Highlight();\n\t\t// Maybe some inputs are still pressed, clear so that we don't go into issues\n\t\t//if (ASoCharacter* Character = USoStaticHelper::GetPlayerCharacterAsSoCharacter(this))\n\t\t//\tCharacter->ClearInputStates();\n\t}\n\n\tUpdateKeySelectorImage();\n\tRefreshButtonImagesTooltips();\n\tIsSelectingKeyChangedEvent.Broadcast(bIsSelectingKey);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIInputKeySelectorOverlay::HandleKeySelected(const FInputChord& InSelectedKey)\n{\n\tCurrentlySelectedButtonText->SetVisibility(ESlateVisibility::Visible);\n\tKeySelector->SetTextBlockVisibility(ESlateVisibility::Visible);\n\n\t// Display error message\n\tFText Error, Warning;\n\tif (IsSelectedKeyValid(Error, Warning))\n\t{\n\t\tErrorMessage->SetVisibility(ESlateVisibility::Collapsed);\n\t\tWarningMessage->SetVisibility(ESlateVisibility::Collapsed);\n\t}\n\n\tif (!Error.IsEmpty())\n\t{\n\t\t// Hide any warnings\n\t\tErrorMessage->SetText(Error);\n\t\tErrorMessage->SetVisibility(ESlateVisibility::Visible);\n\t\tWarningMessage->SetVisibility(ESlateVisibility::Collapsed);\n\t\tCurrentlySelectedButtonText->SetVisibility(ESlateVisibility::Collapsed);\n\t\tKeySelector->SetTextBlockVisibility(ESlateVisibility::Hidden);\n\t}\n\telse if (!Warning.IsEmpty())\n\t{\n\t\tWarningMessage->SetVisibility(ESlateVisibility::Visible);\n\t\tWarningMessage->SetText(Warning);\n\t}\n\n\tUpdateKeySelectorImage();\n\tRefreshButtonImagesTooltips();\n\tKeySelectedEvent.Broadcast(InSelectedKey);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoUIInputKeySelectorOverlay::IsSelectingKey() const\n{\n\treturn KeySelector ? KeySelector->IsSelectingKey() : false;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFKey USoUIInputKeySelectorOverlay::GetSelectedKey() const\n{\n\treturn KeySelector ? KeySelector->GetSelectedKey().Key : FKey();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIInputKeySelectorOverlay::SetActionName(const FText& ActionNameText)\n{\n\tif (ActionName)\n\t\tActionName->SetText(ActionNameText);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIInputKeySelectorOverlay::SetIsSelectingKey(bool bInIsSelectingKey)\n{\n\tUE_LOG(LogSoInputSelector, Verbose, TEXT(\"\\n\\n\\nUSoUIInputKeySelectorOverlay::SetIsSelectingKey = %d\"), bInIsSelectingKey);\n\n\tif (KeySelector)\n\t{\n\t\t// Focus back to us\n\t\tif (bInIsSelectingKey)\n\t\t\tKeySelector->SetPreviousFocusedWidget(FSlateApplication::Get().GetUserFocusedWidget(0));\n\n\t\tKeySelector->SetIsSelectingKey(bInIsSelectingKey);\n\t\tUpdateKeySelectorImage();\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIInputKeySelectorOverlay::RefreshButtonImagesTooltips()\n{\n\tTArray<FSoUITextCommandPair> CommandsToBeDisplayed;\n\tif (!IsSelectingKey())\n\t{\n\t\tif (IsSelectedKeyValid())\n\t\t\tCommandsToBeDisplayed.Add({ UICommand_Apply, FROM_STRING_TABLE_UI(\"settings_apply\") });\n\n\t\tCommandsToBeDisplayed.Add({ UICommand_SelectAnother, FROM_STRING_TABLE_UI(\"settings_select_another\") });\n\t\tCommandsToBeDisplayed.Add({ UICommand_Cancel, FROM_STRING_TABLE_UI(\"settings_cancel\") });\n\n\t}\n\n\tButtonImagesTooltipsArray->UpdateEnsureOnlyTheseCommandsExist(CommandsToBeDisplayed, true);\n\tif (!IsSelectingKey())\n\t\tButtonImagesTooltipsArray->SelectFirstValidChild();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoUIInputKeySelectorOverlay::IsSelectedKeyValid(FText& OutError, FText& OutWarning, bool bNoOutput) const\n{\n\tif (!KeySelector || !IsSelectedKeyValidEvent.IsBound())\n\t\treturn false;\n\n\tconst FInputChord SelectedKey = KeySelector->GetSelectedKey();\n\treturn IsSelectedKeyValidEvent.Execute(SelectedKey, OutError, OutWarning, bNoOutput);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIInputKeySelectorOverlay::UpdateKeySelectorImage()\n{\n\tif (!KeySelectorImageRepresentation)\n\t\treturn;\n\n\tKeySelectorImageRepresentation->SetVisibility(ESlateVisibility::Collapsed);\n\tif (!IsSelectingKey() && IsSelectedKeyValid())\n\t{\n\t\tconst FKey SelectedKey = GetSelectedKey();\n\t\tswitch (KeySelectorImageVisibility)\n\t\t{\n\t\tcase ESoInputOverlayKeyImageVisibility::All:\n\t\t\t// TODO\n\t\t\tbreak;\n\n\t\tcase ESoInputOverlayKeyImageVisibility::Gamepad:\n\t\t\tif (USoInputHelper::IsGamepadKey(SelectedKey))\n\t\t\t{\n\t\t\t\tKeySelectorImageRepresentation->SetVisibility(ESlateVisibility::Visible);\n\t\t\t\tKeySelectorImageRepresentation->SetBrushFromTexture(USoGameSingleton::GetIconForInputKey(SelectedKey, GamepadDeviceType, false));\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase ESoInputOverlayKeyImageVisibility::Keyboard:\n\t\t\t// TODO\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tbreak;\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "Source/SOrb/UI/Menu/Settings/KeySelector/SoUIInputKeySelectorOverlay.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#pragma once\n\n#include \"CoreMinimal.h\"\n#include \"Blueprint/UserWidget.h\"\n\n#include \"UI/General/SoUITypes.h\"\n#include \"SoUIInputKeySelector.h\"\n#include \"SSoInputKeySelector.h\"\n#include \"Settings/Input/SoInputSettingsTypes.h\"\n\n#include \"SoUIInputKeySelectorOverlay.generated.h\"\n\nclass UTextBlock;\nclass USoUIButtonImageArray;\nclass UImage;\n\nUENUM(BlueprintType)\nenum class ESoInputOverlayKeyImageVisibility : uint8\n{\n\t// Do not display any image\n\tNone = 0,\n\n\tKeyboard,\n\tGamepad,\n\tAll\n};\n\n/**\n * Overlay that contains the InputKey selector\n */\nUCLASS(HideCategories = (Navigation), AutoCollapseCategories = (Performance, Clipping, Interaction, Input))\nclass SORB_API USoUIInputKeySelectorOverlay : public UUserWidget, public ISoUIEventHandler\n{\n\tGENERATED_BODY()\n\npublic:\n\t// Events Hierarchy:\n\t// 1. SSoInputKeySelector\n\t// 2. USoUIInputKeySelector\n\t// 3. Self\n\n\t//\n\t// Own methods\n\t//\n\tDECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FSoApplySelectedKeyEvent, const FInputChord&, SelectedKey);\n\tDECLARE_DYNAMIC_MULTICAST_DELEGATE(FSoCancelSelectedKeyEvent);\n\tDECLARE_DELEGATE_RetVal_FourParams(bool, FSoIsSelectedKeyValidEvent, const FInputChord&, FText&, FText&, bool);\n\n\t// Is the KeySelector selecting keys?\n\tUFUNCTION(BlueprintPure, Category = \">Key Selection\")\n\tbool IsSelectingKey() const;\n\n\tFKey GetSelectedKey() const;\n\n\tUFUNCTION(BlueprintCallable, Category = \">Key Selection\")\n\tvoid SetIsSelectingKey(bool bInIsSelectingKey);\n\n\t// Key action name\n\tvoid SetActionName(const FText& ActionNameText);\n\n\t/** Fills the command tooltips from the current context. */\n\tvoid RefreshButtonImagesTooltips();\n\n\t// Is the selected key valid?\n\tbool IsSelectedKeyValid(FText& OutError, FText& OutWarning, bool bNoOutput = false) const;\n\n\t// Variant without error\n\tUFUNCTION(BlueprintPure, Category = \">Key Selection\")\n\tbool IsSelectedKeyValid() const\n\t{\n\t\tFText Error, Warning;\n\t\tstatic constexpr bool bNoOutput = true;\n\t\treturn IsSelectedKeyValid(Error, Warning, bNoOutput);\n\t}\n\n\tbool CanHandleUICommand() const { return !IsSelectingKey() && ISoUIEventHandler::Execute_IsOpened(this); }\n\tvoid Open(bool bSelectKey = false)\n\t{\n\t\tISoUIEventHandler::Execute_Open(this, true);\n\t\tif (bSelectKey)\n\t\t\tOnCommandSelectAnotherKey();\n\t}\n\tvoid Close() { ISoUIEventHandler::Execute_Open(this, false); }\n\n\tbool OnPressedButtonTooltipsCommand(ESoUICommand Command);\n\tbool OnCommandSelectAnotherKey();\n\tbool OnCommandApply();\n\tbool OnCommandCancel();\n\n\t//\n\t// Events\n\t//\n\tFSoUIOpenChangedEvent& OnOpenChangedEvent() { return OpenChangedEvent; }\n\tFSoKeySelectedEvent& OnKeySelectedEvent() { return KeySelectedEvent; }\n\tFSoIsSelectingKeyChangedEvent& OnIsSelectingKeyChangedEvent() { return IsSelectingKeyChangedEvent; }\n\tFSoIsSelectedKeyValidEvent& OnIsSelectedKeyValidEvent() { return IsSelectedKeyValidEvent; }\n\tFSoApplySelectedKeyEvent& OnApplySelectedKeyEvent() { return ApplySelectedKeyEvent; }\n\tFSoCancelSelectedKeyEvent& OnCancelSelectedKeyEvent() { return CancelSelectedKeyEvent; }\n\n\nprotected:\n\t//\n\t// UUserWidget Interface\n\t//\n\tvoid SynchronizeProperties() override;\n\tvoid NativeConstruct() override;\n\tvoid NativeDestruct() override;\n\n\t//\n\t// ISoUIEventHandler Interface\n\t//\n\tbool OnUICommand_Implementation(ESoUICommand Command) override;\n\tvoid Open_Implementation(bool bOpen) override;\n\tbool IsOpened_Implementation() const override { return bOpened; }\n\tbool CanBeInterrupted_Implementation() const override { return true; }\n\n\t//\n\t// Own methods\n\t//\n\n\tUFUNCTION()\n\tvoid HandleIsSelectingKeyChanged(bool bIsSelectingKey);\n\n\tUFUNCTION()\n\tvoid HandleKeySelected(const FInputChord& InSelectedKey);\n\n\t// KeySelectorImage\n\tvoid UpdateKeySelectorImage();\n\npublic:\n\n\nprotected:\n\tUPROPERTY(BlueprintAssignable, Category = \">Events\")\n\tFSoUIOpenChangedEvent OpenChangedEvent;\n\n\t/** Called whenever a new key is selected by the user. */\n\tUPROPERTY(BlueprintAssignable, Category = \">Events\")\n\tFSoKeySelectedEvent KeySelectedEvent;\n\n\t/** Called whenever the key selection state is changed. */\n\tUPROPERTY(BlueprintAssignable, Category = \">Events\")\n\tFSoIsSelectingKeyChangedEvent IsSelectingKeyChangedEvent;\n\n\t/** Called whenever the selected key is applied. Before this fires this widget is closed. */\n\tUPROPERTY(BlueprintAssignable, Category = \">Events\")\n\tFSoApplySelectedKeyEvent ApplySelectedKeyEvent;\n\n\tUPROPERTY(BlueprintAssignable, Category = \">Events\")\n\tFSoCancelSelectedKeyEvent CancelSelectedKeyEvent;\n\n\t// Used to figure out if a key is valid\n\tFSoIsSelectedKeyValidEvent IsSelectedKeyValidEvent;\n\n\t// Widget that selects the key from the user\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\", meta = (BindWidget))\n\tUSoUIInputKeySelector* KeySelector = nullptr;\n\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\", meta = (BindWidget))\n\tUTextBlock* ActionName = nullptr;\n\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\", meta = (BindWidget))\n\tUTextBlock* CurrentlySelectedButtonText = nullptr;\n\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\", meta = (BindWidget))\n\tUTextBlock* ErrorMessage = nullptr;\n\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\", meta = (BindWidget))\n\tUTextBlock* WarningMessage = nullptr;\n\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\", meta = (BindWidget))\n\tUImage* KeySelectorImageRepresentation = nullptr;\n\n\tUPROPERTY(BlueprintReadOnly, Category = \">Widgets\", meta = (BindWidget))\n\tUSoUIButtonImageArray* ButtonImagesTooltipsArray;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadOnly, Category = \">Key Selection\")\n\tESoInputOverlayKeyImageVisibility KeySelectorImageVisibility = ESoInputOverlayKeyImageVisibility::None;\n\n\t// Passed to the KeySelector\n\tUPROPERTY(EditAnywhere, BlueprintReadOnly, Category = \">Key Selection\")\n\tbool bAllowModifierKeysInSelection = false;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadOnly, Category = \">Key Selection\")\n\tESoInputKeySelectorDeviceType AllowedInputType = ESoInputKeySelectorDeviceType::Keyboard;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadOnly, Category = \">Key Selection\")\n\tTArray<FKey> EscapeKeys;\n\n\t// Is this widget opened?\n\tUPROPERTY()\n\tbool bOpened = false;\n\n\t// Keep track if we are listening or not\n\tUPROPERTY(BlueprintReadOnly, Category = \">Key Selection\")\n\tESoInputDeviceType GamepadDeviceType = ESoInputDeviceType::Gamepad_Generic;\n\n\n\t// Apply selected key/cancel\n\tstatic constexpr ESoUICommand UICommand_Apply = ESoUICommand::EUC_Action0;\n\tstatic constexpr ESoUICommand UICommand_Cancel = ESoUICommand::EUC_Action1;\n\tstatic constexpr ESoUICommand UICommand_SelectAnother = ESoUICommand::EUC_Action2;\n};\n"
  },
  {
    "path": "Source/SOrb/UI/Menu/Settings/SoUISettings.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#include \"SoUISettings.h\"\n\n#include \"GameFramework/GameUserSettings.h\"\n#include \"Components/Image.h\"\n\n#include \"UI/General/Buttons/SoUIButtonArray.h\"\n#include \"UI/General/Commands/SoUICommandImage.h\"\n\n#include \"Basic/SoAudioManager.h\"\n#include \"Basic/Helpers/SoStaticHelper.h\"\n#include \"Character/SoCharacter.h\"\n#include \"UI/General/Buttons/SoUIButtonImage.h\"\n\n#include \"UI/Menu/Settings/SoUISettingsDisplay.h\"\n#include \"UI/Menu/Settings/SoUISettingsGame.h\"\n#include \"UI/Menu/Settings/SoUISettingsAudio.h\"\n#include \"UI/Menu/Settings/SoUISettingsController.h\"\n#include \"UI/Menu/Settings/SoUISettingsBrightness.h\"\n#include \"UI/Menu/Settings/SoUISettingsKeyboard.h\"\n#include \"Localization/SoLocalization.h\"\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUSoUISettings::USoUISettings(const FObjectInitializer& ObjectInitializer) : Super(ObjectInitializer)\n{\n\tTrackedInput.KeyDownThresholdSeconds = 0.2f;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISettings::SynchronizeProperties()\n{\n\tSuper::SynchronizeProperties();\n\tCreateChildrenAndSetTexts();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISettings::NativeConstruct()\n{\n\tSuper::NativeConstruct();\n\n\tSoCharacter = USoStaticHelper::GetPlayerCharacterAsSoCharacter(this);\n\tif (TopShortcutLeft)\n\t\tTopShortcutLeft->SetUICommand(UICommand_TopLeft);\n\n\tif (TopShortcutRight)\n\t\tTopShortcutRight->SetUICommand(UICommand_TopRight);\n\n\n\tSubMenus->OnNavigateOnPressedHandleChildEvent().BindLambda([this](int32 SelectedChild, USoUIUserWidget* SoUserWidget)\n\t{\n\t\t// SFX\n\t\tSoUserWidget->NavigateOnPressed(true);\n\n\t\tCloseOldPanelAndOpenNew(SubMenus->GetPreviousSelectedIndex(), SelectedChild);\n\t});\n\n\tSetVisibility(bOpened ? ESlateVisibility::Visible : ESlateVisibility::Collapsed);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISettings::NativeTick(const FGeometry& MyGeometry, float InDeltaTime)\n{\n\tSuper::NativeTick(MyGeometry, InDeltaTime);\n\tif (!SoCharacter || !IsValid() || !SoCharacter->IsAnyUIInputPressed())\n\t{\n\t\tTrackedInput.Reset();\n\t\treturn;\n\t}\n\n\tTrackedInput.Tick(InDeltaTime, [&]()\n\t{\n\t\tif (SoCharacter->IsUIInputPressed(UICommand_TopLeft))\n\t\t\tNavigateTopMenu(UICommand_TopLeft);\n\t\telse if (SoCharacter->IsUIInputPressed(UICommand_TopRight))\n\t\t\tNavigateTopMenu(UICommand_TopRight);\n\t});\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoUISettings::OnUICommand_Implementation(ESoUICommand Command)\n{\n\t// Did navigate top menu\n\tif (NavigateTopMenu(Command))\n\t\treturn true;\n\n\t// Forward the UI commands to the sub panel\n\tUUserWidget* CurrentSubPanel = SubPanels[SubMenus->GetSelectedIndex()];\n\tcheck(CurrentSubPanel);\n\tconst bool bHandled = ISoUIEventHandler::Execute_OnUICommand(CurrentSubPanel, Command);\n\n\t// Close the settings if the current panel was closed\n\tif (!ISoUIEventHandler::Execute_IsOpened(CurrentSubPanel))\n\t\tISoUIEventHandler::Execute_Open(this, false);\n\n\treturn bHandled;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoUISettings::NavigateTopMenu(ESoUICommand Command)\n{\n\t// Navigation on the buttons at top\n\t// 1. Close old panel\n\t// 2. Navigate on buttons\n\t// 3. Open new panel\n\n\tbool bNavigateTopMenu = false;\n\tESoUICommand TopMenuCommand = ESoUICommand::EUC_Left;\n\n\tif (Command == UICommand_TopLeft)\n\t{\n\t\tbNavigateTopMenu = true;\n\t\tTopMenuCommand = ESoUICommand::EUC_Left;\n\t}\n\telse if (Command == UICommand_TopRight)\n\t{\n\t\tbNavigateTopMenu = true;\n\t\tTopMenuCommand = ESoUICommand::EUC_Right;\n\t}\n\n\tif (!bNavigateTopMenu)\n\t\treturn false;\n\n\tconst int32 OldPanelIndex = SubMenus->GetSelectedIndex();\n\tif (!CanPanelAtIndexBeInterrupted(OldPanelIndex))\n\t\treturn false;\n\n\tSubMenus->Navigate(TopMenuCommand);\n\tCloseOldPanelAndOpenNew(OldPanelIndex, SubMenus->GetSelectedIndex());\n\treturn true;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoUISettings::CloseOldPanelAndOpenNew(int32 OldPanelIndex, int32 NewPanelIndex)\n{\n\tif (!CanPanelAtIndexBeInterrupted(OldPanelIndex))\n\t{\n\t\tUE_LOG(LogTemp, Warning, TEXT(\"USoUISettings: CloseOldPanelAndOpenNew can close panel = %d\"), OldPanelIndex);\n\t\treturn false;\n\t}\n\n\tCloseAllPanels();\n\tOpenPanelAtIndex(NewPanelIndex);\n\treturn true;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISettings::Open_Implementation(bool bOpen)\n{\n\tbOpened = bOpen;\n\tif (bOpen)\n\t{\n\t\t// Open the first panel\n\t\tOpenPanelAtIndex(0, true);\n\t}\n\telse\n\t{\n\t\t// close all the panels\n\t\tCloseAllPanels();\n\t}\n\n\tSetVisibility(bOpen ? ESlateVisibility::Visible : ESlateVisibility::Collapsed);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISettings::InstantOpen(bool bOpen)\n{\n\tStopAllAnimations();\n\tISoUIEventHandler::Execute_Open(this, bOpen);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISettings::CreateChildrenAndSetTexts()\n{\n\tif (SubMenus == nullptr)\n\t\treturn;\n\n\tRefreshSubPanelOptions();\n\tSubPanels.Empty();\n\tTArray<FText> SubMenuTexts;\n\tfor (const ESoUISettingsSubPanelOption Option : SubPanelOptions)\n\t{\n\t\tswitch (Option)\n\t\t{\n\t\t\tcase ESoUISettingsSubPanelOption::Audio:\n\t\t\t\tSubMenuTexts.Add(FROM_STRING_TABLE_UI(\"settings_audio\"));\n\t\t\t\tSubPanels.Add(Audio);\n\t\t\t\tbreak;\n\t\t\tcase ESoUISettingsSubPanelOption::Game:\n\t\t\t\tSubMenuTexts.Add(FROM_STRING_TABLE_UI(\"settings_game\"));\n\t\t\t\tSubPanels.Add(Game);\n\t\t\t\tbreak;\n\t\t\tcase ESoUISettingsSubPanelOption::Keyboard:\n\t\t\t\tSubMenuTexts.Add(FROM_STRING_TABLE_UI(\"settings_keyboard\"));\n\t\t\t\tSubPanels.Add(Keyboard);\n\t\t\t\tbreak;\n\t\t\tcase ESoUISettingsSubPanelOption::Controller:\n#if PLATFORM_SWITCH\n\t\t\t\tSubMenuTexts.Add(FROM_STRING_TABLE_UI(\"settings_controller_switch\"));\n#else\n\t\t\t\tSubMenuTexts.Add(FROM_STRING_TABLE_UI(\"settings_controller\"));\n#endif\n\t\t\t\tSubPanels.Add(Controller);\n\t\t\t\tbreak;\n\t\t\tcase ESoUISettingsSubPanelOption::Brightness:\n\t\t\t\tSubMenuTexts.Add(FROM_STRING_TABLE_UI(\"settings_brightness\"));\n\t\t\t\tSubPanels.Add(Brightness);\n\t\t\t\tbreak;\n\t\t\tcase ESoUISettingsSubPanelOption::Display:\n\t\t\tdefault:\n\t\t\t\tSubMenuTexts.Add(FROM_STRING_TABLE_UI(\"settings_display\"));\n\t\t\t\tSubPanels.Add(Display);\n\t\t\t\tbreak;\n\t\t}\n\t}\n\tSubMenus->CreateButtons(SubMenuTexts);\n\n\tUpdateWidgetsVisibilities();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISettings::OpenPanelAtIndex(int32 PanelIndex, bool bSelectSubmenuButton)\n{\n\tUUserWidget* Panel = GetPanelAtIndex(PanelIndex);\n\tif (!Panel)\n\t\treturn;\n\n\tif (bSelectSubmenuButton)\n\t\tSubMenus->SetSelectedIndex(PanelIndex);\n\n\tISoUIEventHandler::Execute_Open(Panel, true);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISettings::ClosePanelAtIndex(int32 PanelIndex)\n{\n\tUUserWidget* Panel = GetPanelAtIndex(PanelIndex);\n\tif (!Panel)\n\t\treturn;\n\n\tISoUIEventHandler::Execute_Open(Panel, false);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISettings::CloseAllPanels()\n{\n\tfor (UUserWidget* Panel : SubPanels)\n\t\tif (ISoUIEventHandler::Execute_IsOpened(Panel))\n\t\t\tISoUIEventHandler::Execute_Open(Panel, false);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoUISettings::CanPanelAtIndexBeInterrupted(int32 PanelIndex) const\n{\n\tUUserWidget* Panel = GetPanelAtIndex(PanelIndex);\n\tif (!Panel)\n\t\treturn true;\n\n\treturn ISoUIEventHandler::Execute_CanBeInterrupted(Panel);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISettings::RefreshSubPanelOptions()\n{\n\tstatic constexpr int32 IndexSubPanelOptionKeyboard = 4;\n\n\tSubPanelOptions = {};\n\n\tif (!USoPlatformHelper::IsConsole())\n\t\tSubPanelOptions.Add(ESoUISettingsSubPanelOption::Display);\n\n\tSubPanelOptions.Append({\n\t\tESoUISettingsSubPanelOption::Brightness,\n\t\tESoUISettingsSubPanelOption::Audio,\n\t\tESoUISettingsSubPanelOption::Game,\n\t});\n\n\tif (USoPlatformHelper::CanHaveKeyboard())\n\t\tSubPanelOptions.Add(ESoUISettingsSubPanelOption::Keyboard);\n\n\tSubPanelOptions.Add(ESoUISettingsSubPanelOption::Controller);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISettings::UpdateWidgetsVisibilities()\n{\n\tif (Display)\n\t{\n\n\t}\n\tif (Keyboard)\n\t{\n\n\t}\n}\n"
  },
  {
    "path": "Source/SOrb/UI/Menu/Settings/SoUISettings.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#pragma once\n\n#include \"CoreMinimal.h\"\n#include \"Blueprint/UserWidget.h\"\n#include \"UI/General/SoUITypes.h\"\n\n#include \"SoUISettings.generated.h\"\n\nclass UImage;\nclass USoUIButtonArray;\nclass USoUISettingsDisplay;\nclass USoUISettingsGame;\nclass USoUISettingsAudio;\nclass USoUISettingsKeyboard;\nclass USoUISettingsController;\nclass USoUICommandImage;\nclass USoUISettingsBrightness;\nclass UFMODEvent;\nclass ASoCharacter;\nclass USoUIButtonImage;\n\n// All the panel options for the settings\nenum class ESoUISettingsSubPanelOption : uint8\n{\n\tDisplay = 0,\n\tBrightness,\n\n\tAudio,\n\tGame,\n\n\tKeyboard,\n\tController\n};\n\n/**\n * Show all the available settings of the game, can switch between different settings panels\n */\nUCLASS()\nclass SORB_API USoUISettings : public UUserWidget, public ISoUIEventHandler\n{\n\tGENERATED_BODY()\n\npublic:\n\tUSoUISettings(const FObjectInitializer& ObjectInitializer);\n\n\t//\n\t// UUserWidget Interface\n\t//\n\tvoid SynchronizeProperties() override;\n\tvoid NativeConstruct() override;\n\tvoid NativeTick(const FGeometry& MyGeometry, float InDeltaTime);\n\n\t//\n\t// ISoUIEventHandler Interface\n\t//\n\tbool OnUICommand_Implementation(ESoUICommand Command) override;\n\tvoid Open_Implementation(bool bOpen) override;\n\tbool IsOpened_Implementation() const override { return bOpened; }\n\tbool CanBeInterrupted_Implementation() const override { return true; }\n\n\t//\n\t// Own methods\n\t//\n\n\t// No animation\n\tvoid InstantOpen(bool bOpen);\n\nprotected:\n\t//\n\t// Own methods\n\t//\n\n\tbool NavigateTopMenu(ESoUICommand Command);\n\tbool CloseOldPanelAndOpenNew(int32 OldPanelIndex, int32 NewPanelIndex);\n\n\t// Sets/Creates the texts and children for all sub panels\n\t// NOTE: does not depend on any runtime value\n\tvoid CreateChildrenAndSetTexts();\n\n\t// Open panel at PanelIndex\n\tvoid OpenPanelAtIndex(int32 PanelIndex, bool bSelectSubmenuButton = false);\n\n\t// Close panel at PanelIndex\n\tvoid ClosePanelAtIndex(int32 PanelIndex);\n\tvoid CloseAllPanels();\n\n\t// Can we interrupt the panel\n\tbool CanPanelAtIndexBeInterrupted(int32 PanelIndex) const;\n\n\tUUserWidget* GetPanelAtIndex(int32 PanelIndex) const\n\t{\n\t\treturn SubPanels.IsValidIndex(PanelIndex) ? SubPanels[PanelIndex] : nullptr;\n\t}\n\n\t// Get the UI commands for top menu navigation\n\tUFUNCTION(BlueprintPure, Category = UI)\n\tESoUICommand GetTopLeftUICommand() const { return UICommand_TopLeft; }\n\n\tUFUNCTION(BlueprintPure, Category = UI)\n\tESoUICommand GetTopRightUICommand() const { return UICommand_TopRight; }\n\n\tvoid RefreshSubPanelOptions();\n\tvoid UpdateWidgetsVisibilities();\n\n\tbool IsValid() const { return IsVisible() && GetIsEnabled(); }\n\nprotected:\n\t// Top buttons array that is kept in the same order as SubPanels\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\", meta = (BindWidget))\n\tUSoUIButtonArray* SubMenus = nullptr;\n\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\", meta = (BindWidget))\n\tUSoUISettingsDisplay* Display = nullptr;\n\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\", meta = (BindWidget))\n\tUSoUISettingsBrightness* Brightness = nullptr;\n\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\", meta = (BindWidget))\n\tUSoUISettingsGame* Game = nullptr;\n\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\", meta = (BindWidget))\n\tUSoUISettingsAudio* Audio = nullptr;\n\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\", meta = (BindWidget))\n\tUSoUISettingsKeyboard* Keyboard = nullptr;\n\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\", meta = (BindWidget))\n\tUSoUISettingsController* Controller = nullptr;\n\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\", meta = (BindWidget))\n\tUSoUIButtonImage* TopShortcutLeft = nullptr;\n\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\", meta = (BindWidget))\n\tUSoUIButtonImage* TopShortcutRight = nullptr;\n\n\t// Keep all the panels into an array\n\tUPROPERTY()\n\tTArray<UUserWidget*> SubPanels;\n\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = \">Input\")\n\tFSoUITrackedInputKeyDown TrackedInput;\n\n\t// All the subpanel options\n\t// Map selected panel index => ESoUISettingsSubPanelOption (sub panel type)\n\tTArray<ESoUISettingsSubPanelOption> SubPanelOptions = {\n\t\tESoUISettingsSubPanelOption::Display,\n\t\tESoUISettingsSubPanelOption::Brightness,\n\t\tESoUISettingsSubPanelOption::Audio,\n\t\tESoUISettingsSubPanelOption::Game,\n\t\tESoUISettingsSubPanelOption::Keyboard,\n\t\tESoUISettingsSubPanelOption::Controller\n\t};\n\n\t// Are the settings opened?\n\tbool bOpened = false;\n\n\t// UI shortcuts for navigating the top menus\n\tstatic constexpr ESoUICommand UICommand_TopLeft = ESoUICommand::EUC_TopLeft;\n\tstatic constexpr ESoUICommand UICommand_TopRight = ESoUICommand::EUC_TopRight;\n\n\t//\n\t// Cached\n\t//\n\n\tUPROPERTY()\n\tASoCharacter* SoCharacter = nullptr;\n};\n"
  },
  {
    "path": "Source/SOrb/UI/Menu/Settings/SoUISettingsAudio.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#include \"SoUISettingsAudio.h\"\n\n#include \"Components/TextBlock.h\"\n#include \"Basic/SoGameSingleton.h\"\n#include \"Settings/SoGameSettings.h\"\n#include \"Basic/SoAudioManager.h\"\n\n#include \"UI/General/Buttons/SoUIButtonImageArray.h\"\n#include \"UI/General/SoUISlider.h\"\n#include \"UI/General/SoUICheckbox.h\"\n#include \"Localization/SoLocalization.h\"\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISettingsAudio::SynchronizeProperties()\n{\n\tSuper::SynchronizeProperties();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISettingsAudio::NativeConstruct()\n{\n\tSuper::NativeConstruct();\n\tCurrentTooltipText->SetVisibility(ESlateVisibility::Collapsed);\n\n\tif (MasterAudio)\n\t\tMasterAudio->OnValueChangedEvent().AddDynamic(this, &Self::OnMasterValueChanged);\n\tif (SoundEffectsAudio)\n\t\tSoundEffectsAudio->OnValueChangedEvent().AddDynamic(this, &Self::OnSoundEffectsValueChanged);\n\tif (MusicAudio)\n\t\tMusicAudio->OnValueChangedEvent().AddDynamic(this, &Self::OnMusicValueChanged);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISettingsAudio::NativeDestruct()\n{\n\tif (MasterAudio)\n\t\tMasterAudio->OnValueChangedEvent().RemoveDynamic(this, &Self::OnMasterValueChanged);\n\tif (SoundEffectsAudio)\n\t\tSoundEffectsAudio->OnValueChangedEvent().RemoveDynamic(this, &Self::OnSoundEffectsValueChanged);\n\tif (MusicAudio)\n\t\tMusicAudio->OnValueChangedEvent().RemoveDynamic(this, &Self::OnMusicValueChanged);\n\n\tSuper::NativeDestruct();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISettingsAudio::Open_Implementation(bool bOpen)\n{\n\tSuper::Open_Implementation(bOpen);\n\n\tif (bOpen)\n\t\tResetSelectedOptionsToUserSettings();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISettingsAudio::CreateChildrenAndSetTexts(bool bFromSynchronizeProperties)\n{\n\t// Set the Lines order and text\n\tEmptyLinesAndTitles();\n\tfor (const ESoUISettingsAudioLine Option : LineOptions)\n\t{\n\t\tswitch (Option)\n\t\t{\n\t\tcase ESoUISettingsAudioLine::MuteAudio:\n\t\t\tAddLineWithText(MuteAudio, FROM_STRING_TABLE_UI(\"settings_mute_audio\"));\n\t\t\tbreak;\n\n\t\tcase ESoUISettingsAudioLine::MuteAudioWhenUnfocused:\n\t\t\tAddLineWithText(MuteAudioWhenUnfocused, FROM_STRING_TABLE_UI(\"settings_mute_audio_unfocused\"));\n\t\t\tbreak;\n\n\t\tcase ESoUISettingsAudioLine::MuteVoiceGibberish:\n\t\t\tAddLineWithText(MuteVoiceGibberish, FROM_STRING_TABLE_UI(\"settings_mute_voice\"));\n\t\t\tbreak;\n\n\t\tcase ESoUISettingsAudioLine::MuteDialogueVoiceGibberish:\n\t\t\tAddLineWithText(MuteDialogueVoiceGibberish, FROM_STRING_TABLE_UI(\"settings_mute_dialogue_voice\"));\n\t\t\tbreak;\n\n\t\tcase ESoUISettingsAudioLine::MasterAudio:\n\t\t\tAddLineWithText(MasterAudio, FROM_STRING_TABLE_UI(\"settings_master_volume\"));\n\t\t\tbreak;\n\n\t\tcase ESoUISettingsAudioLine::SoundEffectsAudio:\n\t\t\tAddLineWithText(SoundEffectsAudio, FROM_STRING_TABLE_UI(\"settings_effects_volume\"));\n\t\t\tbreak;\n\n\t\tcase ESoUISettingsAudioLine::MusicAudio:\n\t\t\tAddLineWithText(MusicAudio, FROM_STRING_TABLE_UI(\"settings_music_volume\"));\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tcheckNoEntry();\n\t\t\tbreak;\n\t\t}\n\t}\n\n\tif (LineOptions.Num() != NumLines())\n\t\tUE_LOG(LogSoUISettings, Error, TEXT(\"Audio CreateChildrenAndSetTexts: LineOptions.Num(%d) != NumLines(%d)\"), LineOptions.Num(), NumLines());\n\n\tSuper::CreateChildrenAndSetTexts(bFromSynchronizeProperties);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoUISettingsAudio::HandleOnUICommand(ESoUICommand Command)\n{\n\tif (Super::HandleOnUICommand(Command))\n\t\treturn true;\n\n\treturn OnPressedButtonTooltipsCommand(Command);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISettingsAudio::OnPressedChild(int32 SelectedChild, USoUIUserWidget* SoUserWidget)\n{\n\tSuper::OnPressedChild(SelectedChild, SoUserWidget);\n\tif (!IsValidLineIndex(SelectedChild))\n\t\treturn;\n\n\tbool bHandled = true;\n\tconst ESoUISettingsAudioLine SelectedLineOption = LineOptions[SelectedChild];\n\tif (SelectedLineOption == ESoUISettingsAudioLine::MuteAudio)\n\t\tUserSettings->SetIsAudioMuted(MuteAudio->IsChecked());\n\telse if (SelectedLineOption == ESoUISettingsAudioLine::MuteAudioWhenUnfocused)\n\t\tUserSettings->SetIsAudioMutedWhenUnfocused(MuteAudioWhenUnfocused->IsChecked());\n\telse if (SelectedLineOption == ESoUISettingsAudioLine::MuteVoiceGibberish)\n\t\tUserSettings->SetIsVoiceGibberishMuted(MuteVoiceGibberish->IsChecked());\n\telse if (SelectedLineOption == ESoUISettingsAudioLine::MuteDialogueVoiceGibberish)\n\t\tUserSettings->SetIsDialogueVoiceGibberishMuted(MuteDialogueVoiceGibberish->IsChecked());\n\telse\n\t\tbHandled = false;\n\n\tif (bHandled)\n\t{\n\t\tUserSettings->ApplyAudioSettings(true);\n\t\tResetSelectedOptionsToUserSettings();\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoUISettingsAudio::NavigateLeftRightOnSelectedLine(ESoUICommand Command, bool bFromPressedInput)\n{\n\tif (!Super::NavigateLeftRightOnSelectedLine(Command, bFromPressedInput))\n\t\treturn false;\n\tif (IsOnButtonTooltips())\n\t\treturn true;\n\n\tResetSelectedOptionsToUserSettings();\n\treturn true;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISettingsAudio::OnPostSetSelectedIndex(int32 OldIndex, int32 NewIndex)\n{\n\tSuper::OnPostSetSelectedIndex(OldIndex, NewIndex);\n\n\t// Set line tooltips\n\tconst int32 SelectedLineIndex = GetSelectedLineIndex();\n\tif (LineOptions.IsValidIndex(SelectedLineIndex))\n\t{\n\t\tconst ESoUISettingsAudioLine CurrentType = LineOptions[SelectedLineIndex];\n\t\tif (LinesTooltips.Contains(CurrentType))\n\t\t{\n\t\t\tCurrentTooltipText->SetVisibility(ESlateVisibility::Visible);\n\t\t\tCurrentTooltipText->SetText(LinesTooltips[CurrentType]);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tCurrentTooltipText->SetVisibility(ESlateVisibility::Collapsed);\n\t\t}\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISettingsAudio::RefreshButtonImagesTooltips(bool bForceShowAll)\n{\n\tif (!ButtonImagesTooltipsArray)\n\t\treturn;\n\n\tTArray<FSoUITextCommandPair> CommandsToBeDisplayed;\n\tif (bForceShowAll || !AreDefaultAudioSettingsUsed())\n\t\tCommandsToBeDisplayed.Add({ UICommand_RevertToDefaults, FROM_STRING_TABLE_UI(\"settings_reset\") });\n\n\tButtonImagesTooltipsArray->UpdateEnsureOnlyTheseCommandsExist(CommandsToBeDisplayed);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoUISettingsAudio::OnPressedButtonTooltipsCommand(ESoUICommand Command)\n{\n\tSuper::OnPressedButtonTooltipsCommand(Command);\n\n\tswitch (Command)\n\t{\n\tcase UICommand_RevertToDefaults:\n\t{\n\t\tOnCommandRevertToDefaults();\n\t\tbreak;\n\t}\n\tdefault:\n\t\treturn false;\n\t}\n\n\treturn true;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoUISettingsAudio::OnCommandRevertToDefaults()\n{\n\tif (!AreDefaultAudioSettingsUsed())\n\t\tUSoAudioManager::PlaySound2D(this, USoGameSingleton::GetSFX(ESoSFX::SettingsRestore));\n\n\tUserSettings->SetAudioSettingsToDefault();\n\tUserSettings->ApplyAudioSettings(true);\n\tResetSelectedOptionsToUserSettings();\n\treturn true;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISettingsAudio::ResetSelectedOptionsToUserSettings()\n{\n\tUserSettings->SetBlockConfigSave(true);\n\n\tUserSettings->ResetToCurrentSettings();\n\tUserSettings->ValidateSettings();\n\n\tMuteAudio->SetIsChecked(UserSettings->IsAudioMuted());\n\tMuteAudioWhenUnfocused->SetIsChecked(UserSettings->IsAudioMutedWhenUnfocused());\n\tMuteVoiceGibberish->SetIsChecked(UserSettings->IsVoiceGibberishMuted());\n\tMuteDialogueVoiceGibberish->SetIsChecked(UserSettings->IsDialogueVoiceGibberishMuted());\n\n\t//constexpr float MinPercentValue = 0.f;\n\t//constexpr float MaxPercentValue = 100.f;\n\t//MasterAudio->SetRangeTextDisplayValues(MinPercentValue, MaxPercentValue);\n\t//MusicAudio->SetRangeTextDisplayValues(MinPercentValue, MaxPercentValue);\n\t//SoundEffectsAudio->SetRangeTextDisplayValues(MinPercentValue, MaxPercentValue);\n\n\tMasterAudio->SetValueNormalized(UserSettings->GetVolumeMaster());\n\tMusicAudio->SetValueNormalized(UserSettings->GetVolumeMusic());\n\tSoundEffectsAudio->SetValueNormalized(UserSettings->GetVolumeSFX());\n\n\tUpdateLinesVisibility();\n\tEmptyAndRefreshButtonImagesTooltips();\n\n\tUserSettings->SetBlockConfigSave(false);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISettingsAudio::UpdateLinesVisibility()\n{\n\tconst bool bIsAudioMuted = MuteAudio->IsChecked();\n\n\t// Disable sliders if audio is muted\n\tMasterAudio->SetIsEnabled(!bIsAudioMuted);\n\tSoundEffectsAudio->SetIsEnabled(!bIsAudioMuted);\n\tMusicAudio->SetIsEnabled(!bIsAudioMuted);\n\tMuteAudioWhenUnfocused->SetIsEnabled(!bIsAudioMuted);\n\tMuteVoiceGibberish->SetIsEnabled(!bIsAudioMuted);\n\tMuteDialogueVoiceGibberish->SetIsEnabled(!bIsAudioMuted);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoUISettingsAudio::AreDefaultAudioSettingsUsed() const\n{\n\treturn UserSettings->AreDefaultAudioSettingsUsed();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISettingsAudio::OnMasterValueChanged(float NewValueNormalized)\n{\n\tif (!bOpened)\n\t\treturn;\n\n\tUserSettings->SetVolumeMaster(NewValueNormalized);\n\tUserSettings->ApplyAudioSettings(true);\n\tRefreshButtonImagesTooltips();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISettingsAudio::OnSoundEffectsValueChanged(float NewValueNormalized)\n{\n\tif (!bOpened)\n\t\treturn;\n\n\tUserSettings->SetVolumeSFX(NewValueNormalized);\n\tUserSettings->ApplyAudioSettings(true);\n\tRefreshButtonImagesTooltips();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISettingsAudio::OnMusicValueChanged(float NewValueNormalized)\n{\n\tif (!bOpened)\n\t\treturn;\n\n\tUserSettings->SetVolumeMusic(NewValueNormalized);\n\tUserSettings->ApplyAudioSettings(true);\n\tRefreshButtonImagesTooltips();\n}\n"
  },
  {
    "path": "Source/SOrb/UI/Menu/Settings/SoUISettingsAudio.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#pragma once\n\n#include \"CoreMinimal.h\"\n#include \"SoUISettingsBase.h\"\n\n#include \"SoUISettingsAudio.generated.h\"\n\nclass USoUICheckbox;\nclass USoUIButton;\nclass USoUISlider;\nclass USoUICommandTooltipArray;\nclass UTextBlock;\n\n// All the line options for the USoUISettingsAudio\nUENUM(BlueprintType)\nenum class ESoUISettingsAudioLine : uint8\n{\n\tNone = 0,\n\n\tMuteAudio,\n\tMasterAudio,\n\tSoundEffectsAudio,\n\tMusicAudio,\n\tMuteAudioWhenUnfocused,\n\tMuteVoiceGibberish,\n\tMuteDialogueVoiceGibberish,\n};\n\n/**\n * Control audio/music related settings\n */\nUCLASS()\nclass SORB_API USoUISettingsAudio : public USoUISettingsBase\n{\n\tGENERATED_BODY()\n\ttypedef USoUISettingsAudio Self;\n\nprotected:\n\t//\n\t// UUserWidget Interface\n\t//\n\tvoid SynchronizeProperties() override;\n\tvoid NativeConstruct() override;\n\tvoid NativeDestruct() override;\n\n\t//\n\t// ISoUIEventHandler Interface\n\t//\n\tvoid Open_Implementation(bool bOpen) override;\n\n\t//\n\t// USoUISettingsBase Interface\n\t//\n\tvoid CreateChildrenAndSetTexts(bool bFromSynchronizeProperties = false) override;\n\tbool HandleOnUICommand(ESoUICommand Command) override;\n\tvoid OnPressedChild(int32 SelectedChild, USoUIUserWidget* SoUserWidget) override;\n\tbool NavigateLeftRightOnSelectedLine(ESoUICommand Command, bool bFromPressedInput = false) override;\n\tbool IsValidLineIndex(int32 LineIndex) const override\n\t{\n\t\treturn Super::IsValidLineIndex(LineIndex) && LineOptions.IsValidIndex(LineIndex);\n\t}\n\tvoid OnPostSetSelectedIndex(int32 OldIndex, int32 NewIndex) override;\n\tvoid RefreshButtonImagesTooltips(bool bForceShowAll = false) override;\n\tbool OnPressedButtonTooltipsCommand(ESoUICommand Command) override;\n\n\t//\n\t// Own methods\n\t//\n\n\tbool OnCommandRevertToDefaults();\n\n\t// Reset settings to the system settings and updates selected options to match the user settings one.\n\tvoid ResetSelectedOptionsToUserSettings();\n\n\t// Enable/Disable some lines depending on the options set.\n\tvoid UpdateLinesVisibility();\n\n\t// Did the default settings change?\n\tbool AreDefaultAudioSettingsUsed() const;\n\n\tUFUNCTION()\n\tvoid OnMasterValueChanged(float NewValueNormalized);\n\n\tUFUNCTION()\n\tvoid OnSoundEffectsValueChanged(float NewValueNormalized);\n\n\tUFUNCTION()\n\tvoid OnMusicValueChanged(float NewValueNormalized);\n\nprotected:\n\t// Mute the sound\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\", meta = (BindWidget))\n\tUSoUICheckbox* MuteAudio = nullptr;\n\n\t// Controls the overall sound\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\", meta = (BindWidget))\n\tUSoUISlider* MasterAudio = nullptr;\n\n\t// Controls Sound volume\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\", meta = (BindWidget))\n\tUSoUISlider* SoundEffectsAudio = nullptr;\n\n\t// Controls Music volume\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\", meta = (BindWidget))\n\tUSoUISlider* MusicAudio = nullptr;\n\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\", meta = (BindWidget))\n\tUSoUICheckbox* MuteAudioWhenUnfocused = nullptr;\n\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\", meta = (BindWidget))\n\tUSoUICheckbox* MuteVoiceGibberish = nullptr;\n\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\", meta = (BindWidget))\n\tUSoUICheckbox* MuteDialogueVoiceGibberish = nullptr;\n\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\", meta = (BindWidget))\n\tUTextBlock* CurrentTooltipText = nullptr;\n\n\t// Set in UMG\n\tUPROPERTY(EditAnywhere, Category = \">Lines\")\n\tTMap<ESoUISettingsAudioLine, FText> LinesTooltips;\n\n\t// Map Selected Line Index => ESoUISettingsAudioLine (line type)\n\t// NOTE for this you also need to change the order in the UMG Blueprint Widget of the USoUIButtonArray.\n\tconst TArray<ESoUISettingsAudioLine> LineOptions = {\n\t\tESoUISettingsAudioLine::MuteAudio,\n\t\tESoUISettingsAudioLine::MasterAudio,\n\t\tESoUISettingsAudioLine::MusicAudio,\n\t\tESoUISettingsAudioLine::SoundEffectsAudio,\n\t\tESoUISettingsAudioLine::MuteAudioWhenUnfocused,\n\t\tESoUISettingsAudioLine::MuteVoiceGibberish,\n\t\tESoUISettingsAudioLine::MuteDialogueVoiceGibberish\n\t};\n\n\t// UI shortcut to revert to defaults\n\tstatic constexpr ESoUICommand UICommand_RevertToDefaults = ESoUICommand::EUC_Action1;\n};\n"
  },
  {
    "path": "Source/SOrb/UI/Menu/Settings/SoUISettingsBase.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#include \"SoUISettingsBase.h\"\n\n#include \"UI/General/Buttons/SoUIScrollingButtonArray.h\"\n#include \"UI/General/Buttons/SoUIButtonImageArray.h\"\n#include \"UI/General/Buttons/SoUIButton.h\"\n#include \"UI/General/SoUISlider.h\"\n#include \"UI/General/SoUICheckbox.h\"\n#include \"Basic/SoGameSingleton.h\"\n#include \"Basic/SoAudioManager.h\"\n#include \"Basic/Helpers/SoStaticHelper.h\"\n#include \"Character/SoCharacter.h\"\n#include \"Settings/SoGameSettings.h\"\n#include \"UI/SoUIHelper.h\"\n#include \"UI/General/Buttons/SoUIButtonArray.h\"\n\nDEFINE_LOG_CATEGORY(LogSoUISettings);\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUSoUISettingsBase::USoUISettingsBase(const FObjectInitializer& ObjectInitializer) : Super(ObjectInitializer)\n{\n\tTrackedInput.KeyDownThresholdSeconds = 0.2f;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISettingsBase::SynchronizeProperties()\n{\n\tSuper::SynchronizeProperties();\n\n\tif (WidgetsArray)\n\t{\n\t\tWidgetsArray\n\t\t\t->SetVerticalLayout(true)\n\t\t\t->SetSkipDeactivatedChildren(true)\n\t\t\t->SetCyclicNavigation(true)\n\t\t\t->SetFakeVirtualContainer(bFakeWidgetsArray)\n\t\t\t->SetSFXChildSelectionChanged(USoGameSingleton::GetSFX(ESoSFX::SettingsLineSwitch));\n\n\t\tif (bFakeWidgetsArray)\n\t\t\tWidgetsArray->SetVisibility(ESlateVisibility::Collapsed);\n\t}\n\n\tCreateChildrenAndSetTexts(true);\n\tRefreshButtonImagesTooltips(true);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISettingsBase::NativeTick(const FGeometry& MyGeometry, float InDeltaTime)\n{\n\tSuper::NativeTick(MyGeometry, InDeltaTime);\n\tif (!SoCharacter || !IsValidWidget() || !SoCharacter->IsAnyUIInputPressed() || ShouldChildHandleCommands())\n\t{\n\t\tTrackedInput.Reset();\n\t\treturn;\n\t}\n\n\t// Pressed left/right change value\n\tTrackedInput.Tick(InDeltaTime, [&]()\n\t{\n\t\tconst bool bFromPressedInput = true;\n\t\tif (SoCharacter->AreAnyUIInputsPressed({ ESoUICommand::EUC_Left, ESoUICommand::EUC_MainMenuLeft }))\n\t\t\tNavigateLeftRightOnSelectedLine(ESoUICommand::EUC_Left, bFromPressedInput);\n\t\telse if (SoCharacter->AreAnyUIInputsPressed({ ESoUICommand::EUC_Right, ESoUICommand::EUC_MainMenuRight }))\n\t\t\tNavigateLeftRightOnSelectedLine(ESoUICommand::EUC_Right, bFromPressedInput);\n\t\telse if (SoCharacter->AreAnyUIInputsPressed({ ESoUICommand::EUC_Up, ESoUICommand::EUC_MainMenuUp }))\n\t\t\tNavigateSwitchLineUp();\n\t\telse if (SoCharacter->AreAnyUIInputsPressed({ ESoUICommand::EUC_Down, ESoUICommand::EUC_MainMenuDown }))\n\t\t\tNavigateSwitchLineDown();\n\t});\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISettingsBase::NativeConstruct()\n{\n\tSuper::NativeConstruct();\n\tSetVisibility(ESlateVisibility::Collapsed);\n\n\tSoCharacter = USoStaticHelper::GetPlayerCharacterAsSoCharacter(this);\n\tUserSettings = USoGameSettings::GetInstance();\n\tSoController = USoUIHelper::GetSoPlayerControllerFromUWidget(this);\n\tverify(SoCharacter);\n\tverify(UserSettings);\n\tverify(SoController);\n\n\tif (WidgetsArray && TitlesArray)\n\t{\n\t\t// Navigate on simple child\n\t\tWidgetsArray->OnNavigateOnPressedHandleChildEvent().BindUObject(this, &ThisClass::OnPressedChild);\n\n\t\t// New selected index\n\t\tWidgetsArray->OnPostSetSelectedIndexEvent().AddUObject(this, &ThisClass::OnPostSetSelectedIndex);\n\n\t\t// Sync widgets array if we the titles array modified but we are different\n\t\tTitlesArray->OnPostSetSelectedIndexEvent().AddLambda([this](int32 OldIndex, int32 NewIndex)\n\t\t{\n\t\t\tUE_LOG(\n\t\t\t\tLogSoUI,\n\t\t\t\tVerbose,\n\t\t\t\tTEXT(\"[%s] TitlesArray->OnPostSetSelectedIndexEvent(OldIndex = %d, NewIndex = %d)\"),\n\t\t\t\t*GetName(), OldIndex, NewIndex\n\t\t\t);\n\t\t\tif (WidgetsArray->GetSelectedIndex() != NewIndex)\n\t\t\t\tWidgetsArray->SetSelectedIndex(NewIndex, true);\n\t\t});\n\n\t\t// Highlight sync\n\t\tTitlesArray->OnChildHighlightChangedEvent().AddLambda([this](int32 ChildIndex, bool bHighlight)\n\t\t{\n\t\t\tUE_LOG(\n\t\t\t\tLogSoUI,\n\t\t\t\tVerbose,\n\t\t\t\tTEXT(\"[%s] TitlesArray->OnChildHighlightChangedEvent(ChildIndex = %d, bHighlight = %d)\"),\n\t\t\t\t*GetName(), ChildIndex, bHighlight\n\t\t\t);\n\t\t\tWidgetsArray->SetIsHighlightedOnChildAt(ChildIndex, bHighlight, bHighlight);\n\t\t});\n\t\tWidgetsArray->OnChildHighlightChangedEvent().AddLambda([this](int32 ChildIndex, bool bHighlight)\n\t\t{\n\t\t\tUE_LOG(\n\t\t\t\tLogSoUI,\n\t\t\t\tVerbose,\n\t\t\t\tTEXT(\"[%s] WidgetsArray->OnChildHighlightChangedEvent(ChildIndex = %d, bHighlight = %d)\"),\n\t\t\t\t*GetName(), ChildIndex, bHighlight\n\t\t\t);\n\t\t\tTitlesArray->SetIsHighlightedOnChildAt(ChildIndex, bHighlight, bHighlight);\n\t\t});\n\n\t\t// Enabled sync\n\t\tWidgetsArray->OnChildEnabledChangedEvent().AddLambda([this](int32 ChildIndex, bool bEnabled)\n\t\t{\n\t\t\tUE_LOG(\n\t\t\t\tLogSoUI,\n\t\t\t\tVerbose,\n\t\t\t\tTEXT(\"[%s] WidgetsArray->OnChildEnabledChangedEvent(ChildIndex = %d, bEnabled = %d)\"),\n\t\t\t\t*GetName(), ChildIndex, bEnabled\n\t\t\t);\n\t\t\tTitlesArray->SetIsEnabledOnChildAt(ChildIndex, bEnabled);\n\t\t});\n\n\t\t// Add our array as an extra attached child so it won't be affected\n\t\t// By manipulating the WidgetArray Container\n\t\tif (ButtonImagesTooltipsArray)\n\t\t{\n\t\t\tWidgetsArray->AddExtraAttachedChild(ButtonImagesTooltipsArray);\n\t\t\tWidgetsArray->SetExtraAttachedVerticalLayout(ButtonImagesTooltipsArray->IsVerticalLayout());\n\n\t\t\t// Handle NavigateOnPressed ButtonImagesTooltipsArray\n\t\t\tButtonImagesTooltipsArray->OnNavigateOnPressedHandleChildEvent().BindUObject(this, &ThisClass::OnPressedButtonTooltipsChild);\n\t\t}\n\t}\n\n\t// First line\n\tSelectFirstValidLineIndex();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISettingsBase::NativeDestruct()\n{\n\tSuper::NativeDestruct();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISettingsBase::OnPressedChild(int32 SelectedChild, USoUIUserWidget* SoUserWidget)\n{\n\tif (SoUserWidget)\n\t\tSoUserWidget->SetIsActive(!SoUserWidget->IsActive(), true);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISettingsBase::OnPressedButtonTooltipsChild(int32 SelectedChild, USoUIUserWidget* SoUserWidget)\n{\n\tconst ESoUICommand SelectedCommand = ButtonImagesTooltipsArray->GetSelectedButtonCommand();\n\tcheck(SelectedCommand == ButtonImagesTooltipsArray->GetButtonIndexCommand(SelectedChild));\n\n\tOnPressedButtonTooltipsCommand(ButtonImagesTooltipsArray->GetSelectedButtonCommand());\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoUISettingsBase::HandleOnUICommand(ESoUICommand Command)\n{\n\tswitch (Command)\n\t{\n\t\tcase ESoUICommand::EUC_Left:\n\t\tcase ESoUICommand::EUC_Right:\n\t\t\tNavigateLeftRightOnSelectedLine(Command);\n\t\t\treturn true;\n\n\t\tcase ESoUICommand::EUC_Up:\n\t\t\tNavigateSwitchLineUp();\n\t\t\treturn true;\n\n\t\tcase ESoUICommand::EUC_Down:\n\t\t\tNavigateSwitchLineDown();\n\t\t\treturn true;\n\n\t\tcase ESoUICommand::EUC_MainMenuEnter:\n\t\t\tNavigateOnPressed();\n\t\t\treturn true;\n\n\t\tcase ESoUICommand::EUC_MainMenuBack:\n\t\t\tNavigateBackCommand();\n\t\t\treturn true;\n\n\t\tdefault:\n\t\t\treturn false;\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISettingsBase::NavigateBackCommand()\n{\n\t// Close this widget\n\tISoUIEventHandler::Execute_Open(this, false);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISettingsBase::Open_Implementation(bool bOpen)\n{\n#if PLATFORM_SWITCH\n\tUSoGameSettings::Get().SetCacheSaveRequestsMode(bOpen);\n#endif\n\n\tbOpened = bOpen;\n\tSetVisibility(bOpen ? ESlateVisibility::Visible : ESlateVisibility::Collapsed);\n\n\t// Clear\n\tif (bOpen)\n\t{\n\t\tSelectFirstValidLineIndex();\n\t\tEmptyAndRefreshButtonImagesTooltips();\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISettingsBase::CreateChildrenAndSetTexts(bool bFromSynchronizeProperties)\n{\n\tif (TitlesArray)\n\t\tTitlesArray->CreateButtons(TitlesArrayTexts);\n\n\tif (TitlesArrayTexts.Num() != NumLines())\n\t\tUE_LOG(LogSoUISettings, Error, TEXT(\"CreateChildrenAndSetTexts: TitlesArrayTexts.Num(%d) != NumLines(%d)\"), TitlesArrayTexts.Num(), NumLines());\n\n\tUpdateWidgetsVisibilities();\n\n\tif (BackgroundsContainer)\n\t{\n\t\t// Check if the number of lines matches the background\n\t\tconst int32 BackgroundChildrenNum = BackgroundsContainer->GetChildrenCount();\n\n\t\t// Show all background up to the lines\n\t\tfor (int32 Index = 0; Index < NumLines() && Index < BackgroundChildrenNum; Index++)\n\t\t{\n\t\t\tBackgroundsContainer->GetChildAt(Index)->SetVisibility(ESlateVisibility::Visible);\n\t\t}\n\t\t// Hide the rest\n\t\tfor (int32 Index = NumLines(); Index < BackgroundChildrenNum; Index++)\n\t\t{\n\t\t\tBackgroundsContainer->GetChildAt(Index)->SetVisibility(ESlateVisibility::Collapsed);\n\t\t}\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoUISettingsBase::NavigateSwitchLine(bool bUp)\n{\n\tif (!bAllowChangingLines)\n\t\treturn false;\n\n\tif (!WidgetsArray)\n\t\treturn false;\n\n\tconst ESoUICommand Command = bUp ? ESoUICommand::EUC_Up : ESoUICommand::EUC_Down;\n\n\t// Navigate along the buttons\n\tWidgetsArray->Navigate(Command);\n\treturn WidgetsArray->WasChildChangedInNavigate();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoUISettingsBase::NavigateOnPressed()\n{\n\t// OnPressedChild should be called from the array\n\treturn WidgetsArray->NavigateOnPressed();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoUISettingsBase::NavigateLeftRightOnSelectedLine(ESoUICommand Command, bool bFromPressedInput)\n{\n\t// Ignore navigation is on slider\n\tif (bAllowChangingLines)\n\t{\n\t\tif (USoUISlider* Slider = GetSliderAtLineIndex(GetSelectedLineIndex()))\n\t\t{\n\t\t\tif (bFromPressedInput)\n\t\t\t\treturn false;\n\t\t}\n\t}\n\n\treturn WidgetsArray->Navigate(Command);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoUISettingsBase::IsValidLineIndex(int32 LineIndex) const\n{\n\treturn WidgetsArray ? WidgetsArray->IsValidIndex(LineIndex) : false;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoUISettingsBase::IsLineEnabled(int32 LineIndex) const\n{\n\treturn IsLineIndexForButtonImagesArray(LineIndex) ||\n\t\t(IsValidLineIndex(LineIndex) && WidgetsArray->IsChildEnabled(LineIndex));\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoUISettingsBase::SetIsLineEnabled(int32 LineIndex, bool bEnabled)\n{\n\tif (!WidgetsArray)\n\t\treturn false;\n\n\treturn WidgetsArray->SetIsEnabledOnChildAt(LineIndex, bEnabled);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISettingsBase::AddLine(UUserWidget* Widget)\n{\n\tif (!WidgetsArray)\n\t\treturn;\n\n\tWidgetsArray->AddContainerChild(Widget);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISettingsBase::EmptyLines()\n{\n\tif (!WidgetsArray)\n\t\treturn;\n\n\tWidgetsArray->EmptyContainerChildren(true);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISettingsBase::EmptyTitles()\n{\n\tTitlesArrayTexts.Empty();\n\tif (TitlesArray)\n\t\tTitlesArray->EmptyContainerChildren(true);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISettingsBase::EmptyAndRefreshButtonImagesTooltips(bool bResetSelectedLine)\n{\n\tif (ButtonImagesTooltipsArray)\n\t\tButtonImagesTooltipsArray->EmptyContainerChildren(true);\n\n\tRefreshButtonImagesTooltips();\n\n\t// Reset back to first index if selected the buttons image array but it is a invalid selection\n\tif (bResetSelectedLine && IsOnButtonTooltips() && !HasValidButtonImagesArray())\n\t\tSelectFirstValidLineIndex();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoUISettingsBase::HasValidButtonImagesArray() const\n{\n\treturn ButtonImagesTooltipsArray && ButtonImagesTooltipsArray->IsVisible() && ButtonImagesTooltipsArray->GetIsEnabled()\n\t\t&& ButtonImagesTooltipsArray->NumAllChildren() > 0 && ButtonImagesTooltipsArray->IsSelectedChildHighlighted();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoUISettingsBase::IsLineIndexForButtonImagesArray(int32 LineIndex) const\n{\n\treturn WidgetsArray && WidgetsArray->IsIndexForExtraAttachedChildren(LineIndex);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISettingsBase::OnPostSetSelectedIndex(int32 OldIndex, int32 NewIndex)\n{\n\t// UE_LOG(\n\t// \tLogSoUISettings,\n\t// \tVerbose,\n\t// \tTEXT(\"%s::OnPostSetSelectedIndex(OldIndex = %d, NewIndex = %d)\"),\n\t// \t*GetName(), OldIndex, NewIndex\n\t// );\n\n\tOnLineChanged(OldIndex, NewIndex);\n\tif (TitlesArray)\n\t\tTitlesArray->SetSelectedIndex(NewIndex);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISettingsBase::SetSelectedLineIndex(int32 NewIndex, bool bPlaySound)\n{\n\t// ButtonImagesTooltipsArray->UnhighlightAllChildren();\n\tWidgetsArray->SetSelectedIndex(NewIndex, bPlaySound);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISettingsBase::SelectFirstValidLineIndex(bool bPlaySound)\n{\n\t// ButtonImagesTooltipsArray->UnhighlightAllChildren();\n\tWidgetsArray->Highlight(bPlaySound);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISettingsBase::SelectButtonTooltips(bool bPlaySound)\n{\n\tWidgetsArray->SetSelectedExtraAttachedIndex(0, bPlaySound);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nint32 USoUISettingsBase::GetSelectedLineIndex() const\n{\n\treturn WidgetsArray->GetSelectedIndex();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nint32 USoUISettingsBase::NumLines() const\n{\n\t// NOTE: done on purpose because the children classes don't care about ButtonImagesTooltipsArray\n\treturn WidgetsArray->NumContainerChildren();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUUserWidget* USoUISettingsBase::GetUserWidgetAtLineIndex(int32 LineIndex) const\n{\n\treturn WidgetsArray ? WidgetsArray->GetChildAt(LineIndex) : nullptr;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUSoUIButtonArray* USoUISettingsBase::GetButtonArrayAtLineIndex(int32 LineIndex) const\n{\n\treturn Cast<USoUIButtonArray>(GetUserWidgetAtLineIndex(LineIndex));\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUSoUIScrollingButtonArray* USoUISettingsBase::GetScrollingButtonArrayAtLineIndex(int32 LineIndex) const\n{\n\treturn Cast<USoUIScrollingButtonArray>(GetUserWidgetAtLineIndex(LineIndex));\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUSoUIButton* USoUISettingsBase::GetButtonAtLineIndex(int32 LineIndex) const\n{\n\treturn Cast<USoUIButton>(GetUserWidgetAtLineIndex(LineIndex));\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUSoUICheckbox* USoUISettingsBase::GetCheckboxAtLineIndex(int32 LineIndex) const\n{\n\treturn Cast<USoUICheckbox>(GetUserWidgetAtLineIndex(LineIndex));\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUSoUISlider* USoUISettingsBase::GetSliderAtLineIndex(int32 LineIndex) const\n{\n\treturn Cast<USoUISlider>(GetUserWidgetAtLineIndex(LineIndex));\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUSoUIButtonArray* USoUISettingsBase::GetWidgetsArrayAsButtons() const\n{\n\treturn Cast<USoUIButtonArray>(WidgetsArray);\n}\n"
  },
  {
    "path": "Source/SOrb/UI/Menu/Settings/SoUISettingsBase.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#pragma once\n\n#include \"CoreMinimal.h\"\n#include \"Blueprint/UserWidget.h\"\n#include \"UI/General/SoUITypes.h\"\n#include \"Components/PanelWidget.h\"\n\n#include \"SoUISettingsBase.generated.h\"\n\nclass USoUIButtonArray;\nclass USoUIScrollingButtonArray;\nclass USoUIButton;\nclass USoUISlider;\nclass USoUICheckbox;\nclass ASoCharacter;\nclass USoUIButtonImageArray;\nclass USoGameSettings;\nclass ASoPlayerController;\nclass USoUIUserWidgetArray;\n\nDECLARE_LOG_CATEGORY_EXTERN(LogSoUISettings, All, All);\n\n/**\n * Base class that tries to handle all the logic for using only keyboard/controller\n * Switching lines, activating lines, etc\n */\nUCLASS(HideCategories = (Navigation), AutoCollapseCategories = (Performance, Clipping, Interaction, Input))\nclass SORB_API USoUISettingsBase : public UUserWidget, public ISoUIEventHandler\n{\n\tGENERATED_BODY()\n\nprotected:\n\tUSoUISettingsBase(const FObjectInitializer& ObjectInitializer);\n\n\t//\n\t// UUserWidget Interface\n\t//\n\tvoid SynchronizeProperties() override;\n\tvoid NativeTick(const FGeometry& MyGeometry, float InDeltaTime) override;\n\tvoid NativeConstruct() override;\n\tvoid NativeDestruct() override;\n\n\t//\n\t// ISoUIEventHandler Interface\n\t//\n\tbool OnUICommand_Implementation(ESoUICommand Command) override { return HandleOnUICommand(Command); }\n\tvoid Open_Implementation(bool bOpen) override;\n\tbool IsOpened_Implementation() const override { return bOpened; }\n\tbool CanBeInterrupted_Implementation() const override { return true; }\n\n\t//\n\t// Own methods\n\t//\n\n\tvirtual void OnPressedChild(int32 SelectedChild, USoUIUserWidget* SoUserWidget);\n\tvoid OnPressedButtonTooltipsChild(int32 SelectedChild, USoUIUserWidget* SoUserWidget);\n\n\t// Sets/Creates the texts and children for all lines\n\tvirtual void CreateChildrenAndSetTexts(bool bFromSynchronizeProperties = false);\n\n\t// Overwrite this in child classes for custom OnUICommand_Implementation\n\tvirtual bool HandleOnUICommand(ESoUICommand Command);\n\tvirtual void NavigateBackCommand();\n\n\t// Should any child widget handle the commands?\n\tvirtual bool ShouldChildHandleCommands() const { return false; }\n\n\t// Updates the children widget visibilities from the current state\n\tvirtual void UpdateWidgetsVisibilities() {}\n\n\t// Switch the the line depending on direction\n\tvirtual bool NavigateSwitchLine(bool bUp);\n\tbool NavigateSwitchLineDown() { return NavigateSwitchLine(false); }\n\tbool NavigateSwitchLineUp() { return NavigateSwitchLine(true); }\n\n\t// Activate/Enter on the selected line\n\tbool NavigateOnPressed();\n\n\t// Navigate left or right on the selected line\n\tvirtual bool NavigateLeftRightOnSelectedLine(ESoUICommand Command, bool bFromPressedInput = false);\n\n\t// Is the LineIndex a valid index?\n\tvirtual bool IsValidLineIndex(int32 LineIndex) const;\n\n\t// Is the line at LineIndex enabled?\n\tbool IsLineEnabled(int32 LineIndex) const;\n\n\tbool SetIsLineEnabled(int32 LineIndex, bool bEnabled);\n\n\tvoid AddLine(UUserWidget* Widget);\n\tvoid AddLineWithText(UUserWidget* Widget, FText Text)\n\t{\n\t\tAddLine(Widget);\n\t\tAddTitleText(Text);\n\t}\n\tvoid AddTitleText(FText Text) { TitlesArrayTexts.Add(Text); }\n\tvoid EmptyLines();\n\tvoid EmptyTitles();\n\tvoid EmptyLinesAndTitles()\n\t{\n\t\tEmptyLines();\n\t\tEmptyTitles();\n\t}\n\n\t//\n\t// ButtonImagesTooltipsArray\n\t//\n\n\t// Refreshes ButtonImagesTooltipsArray\n\tvoid EmptyAndRefreshButtonImagesTooltips(bool bResetSelectedLine = true);\n\n\tUFUNCTION(BlueprintCallable, Category = UI)\n\tvirtual void RefreshButtonImagesTooltips(bool bForceShowAll = false) { checkNoEntry(); }\n\n\t// Can we use the ButtonImagesTooltipsArray\n\tUFUNCTION(BlueprintPure, Category = UI)\n\tbool HasValidButtonImagesArray() const;\n\n\tUFUNCTION(BlueprintPure, Category = UI)\n\tbool IsLineIndexForButtonImagesArray(int32 LineIndex) const;\n\n\tUFUNCTION(BlueprintPure, Category = UI)\n\tbool IsOnButtonTooltips() const { return IsLineIndexForButtonImagesArray(GetSelectedLineIndex()); }\n\n\t// Select a new line\n\tUFUNCTION()\n\tvirtual void OnPostSetSelectedIndex(int32 OldIndex, int32 NewIndex);\n\tvoid SetSelectedLineIndex(int32 NewIndex, bool bPlaySound = false);\n\tvoid SelectFirstValidLineIndex(bool bPlaySound = false);\n\tvoid SelectButtonTooltips(bool bPlaySound = false);\n\n\tint32 GetSelectedLineIndex() const;\n\n\t// Get the total number of lines\n\tint32 NumLines() const;\n\n\t// Gets the user widget at LineIndex (if any).\n\tUUserWidget* GetUserWidgetAtLineIndex(int32 LineIndex) const;\n\n\tUFUNCTION(BlueprintImplementableEvent, BlueprintCosmetic, Category = \">Events\", meta = (DisplayName = \"OnLineChanged\"))\n\tvoid ReceiveOnLineChanged(int32 OldLineIndex, int32 NewLineIndex);\n\n\tUFUNCTION(BlueprintCallable, Category = \">Events\")\n\tvirtual void OnLineChanged(int32 OldLineIndex, int32 NewLineIndex)\n\t{\n\t\tReceiveOnLineChanged(OldLineIndex, NewLineIndex);\n\t}\n\n\tUFUNCTION(BlueprintImplementableEvent, BlueprintCosmetic, Category = \">Events\", meta = (DisplayName = \"OnPressedButtonTooltipsCommand\"))\n\tbool ReceiveOnPressedButtonTooltipsCommand(ESoUICommand Command);\n\n\tUFUNCTION(BlueprintCallable, Category = \">Events\")\n\tvirtual bool OnPressedButtonTooltipsCommand(ESoUICommand Command)\n\t{\n\t\treturn ReceiveOnPressedButtonTooltipsCommand(Command);\n\t}\n\t// Helper methods for GetUserWidgetAtLineIndex\n\n\t// Gets the button array at LineIndex if it is an array\n\tUSoUIButtonArray* GetButtonArrayAtLineIndex(int32 LineIndex) const;\n\n\t// Gets the scrolling button array at LineIndex if it is a scrolling array\n\tUSoUIScrollingButtonArray* GetScrollingButtonArrayAtLineIndex(int32 LineIndex) const;\n\n\t// Gets the button at LineIndex (if it is a button)\n\tUSoUIButton* GetButtonAtLineIndex(int32 LineIndex) const;\n\n\t// Gets the checkbox at LineIndex (if it is a checkbox)\n\tUSoUICheckbox* GetCheckboxAtLineIndex(int32 LineIndex) const;\n\n\t// Gets the slider at LineIndex (if it is a slider)\n\tUSoUISlider* GetSliderAtLineIndex(int32 LineIndex) const;\n\n\tbool IsValidWidget() const { return IsVisible() && GetIsEnabled(); }\n\n\tUSoUIButtonArray* GetWidgetsArrayAsButtons() const;\n\nprotected:\n\t//\n\t// TitlesArray | WidgetsArray\n\t//         ....|....\n\t//         ....|....\n\t//         ....|....\n\t//         ....|....\n\t//         ....|....\n\t//   ButtonImagesTooltipsArray\n\t//\n\n\t// If true the Widgets Array will be fake, we won't use its container and it will be hidden\n\t// Only the logic will be used\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = \">WidgetsArray\")\n\tbool bFakeWidgetsArray = false;\n\n\t// Note this can be fake\n\tUPROPERTY(BlueprintReadOnly, Category = \">WidgetsArray\", meta = (BindWidget))\n\tUSoUIUserWidgetArray* WidgetsArray;\n\n\t// Contains the backgrounds images\n\tUPROPERTY(BlueprintReadOnly, Category = \">WidgetsArray\", meta = (BindWidget))\n\tUPanelWidget* BackgroundsContainer;\n\n\t// Texts used for TitlesArray in PreConstruct\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere, Category = \">Lines\")\n\tTArray<FText> TitlesArrayTexts;\n\n\t// The bottom user interaction buttons, if any\n\tUPROPERTY(BlueprintReadOnly, Category = \">Widgets\", meta = (BindWidget))\n\tUSoUIButtonImageArray* ButtonImagesTooltipsArray;\n\n\t// Usually the left side titles for each settings panel\n\tUPROPERTY(BlueprintReadOnly, Category = \">Widgets\", meta = (BindWidget))\n\tUSoUIButtonArray* TitlesArray;\n\n\t// Is this UI opened?\n\tUPROPERTY(BlueprintReadOnly)\n\tbool bOpened = false;\n\n\tUPROPERTY(BlueprintReadOnly, EditAnywhere, Category = \">Input\")\n\tFSoUITrackedInputKeyDown TrackedInput;\n\n\t//\n\t// Cached\n\t//\n\n\tUPROPERTY()\n\tASoCharacter* SoCharacter = nullptr;\n\n\tUPROPERTY()\n\tUSoGameSettings* UserSettings = nullptr;\n\n\tUPROPERTY()\n\tASoPlayerController* SoController = nullptr;\n\n\t// Maybe move this to array base class?\n\tbool bAllowChangingLines = true;\n};\n"
  },
  {
    "path": "Source/SOrb/UI/Menu/Settings/SoUISettingsBrightness.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#include \"SoUISettingsBrightness.h\"\n\n#include \"GameFramework/InputSettings.h\"\n\n#include \"UI/General/SoUISlider.h\"\n#include \"UI/General/Buttons/SoUIButtonImageArray.h\"\n#include \"Basic/SoGameSingleton.h\"\n#include \"Basic/SoAudioManager.h\"\n#include \"Localization/SoLocalization.h\"\n#include \"Settings/SoGameSettings.h\"\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISettingsBrightness::SynchronizeProperties()\n{\n\tSuper::SynchronizeProperties();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISettingsBrightness::NativeConstruct()\n{\n\tSuper::NativeConstruct();\n\n\tif (Brightness)\n\t\tBrightness->OnValueChangedEvent().AddDynamic(this, &ThisClass::OnBrightnessValueChanged);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISettingsBrightness::NativeDestruct()\n{\n\tif (Brightness)\n\t\tBrightness->OnValueChangedEvent().RemoveDynamic(this, &ThisClass::OnBrightnessValueChanged);\n\n\tSuper::NativeDestruct();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISettingsBrightness::Open_Implementation(bool bOpen)\n{\n\tif (bOpen)\n\t{\n\t\t// Register initial value\n\t\tInitialBrightnessNormalized = USoGameSettings::Get().GetBrightnessNormalized();\n\t}\n\telse\n\t{\n\t\t// Reset to initial value\n\t\tif (InitialBrightnessNormalized > 0.f && DidInitialValuesChange())\n\t\t{\n\t\t\tUSoGameSettings::Get().SetBrightnessNormalized(InitialBrightnessNormalized);\n\t\t\tUSoGameSettings::Get().ApplyGameSettings(true);\n\t\t}\n\t}\n\n\tResetSelectedOptionsToCurrentSettings();\n\n\tSuper::Open_Implementation(bOpen);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISettingsBrightness::CreateChildrenAndSetTexts(bool bFromSynchronizeProperties)\n{\n\t// Set the Lines order and text\n\tEmptyLinesAndTitles();\n\tfor (const ESoUISettingsBrightnessLine Option : LineOptions)\n\t{\n\t\tswitch (Option)\n\t\t{\n\t\tcase ESoUISettingsBrightnessLine::Brightness:\n\t\t\tAddLineWithText(Brightness, FROM_STRING_TABLE_UI(\"settings_brightness\"));\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tcheckNoEntry();\n\t\t\tbreak;\n\t\t}\n\t}\n\n\tif (LineOptions.Num() != NumLines())\n\t\tUE_LOG(LogSoUISettings, Error, TEXT(\"Brightness CreateChildrenAndSetTexts: LineOptions.Num(%d) != NumLines(%d)\"), LineOptions.Num(), NumLines());\n\n\tSuper::CreateChildrenAndSetTexts(bFromSynchronizeProperties);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoUISettingsBrightness::HandleOnUICommand(ESoUICommand Command)\n{\n\tif (Super::HandleOnUICommand(Command))\n\t\treturn true;\n\n\tif (!OnPressedButtonTooltipsCommand(Command))\n\t\treturn false;\n\n\tResetSelectedOptionsToCurrentSettings();\n\treturn true;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoUISettingsBrightness::NavigateLeftRightOnSelectedLine(ESoUICommand Command, bool bFromPressedInput)\n{\n\tif (!Super::NavigateLeftRightOnSelectedLine(Command, bFromPressedInput))\n\t\treturn false;\n\n\tif (IsOnButtonTooltips())\n\t\treturn true;\n\n\tResetSelectedOptionsToCurrentSettings();\n\treturn true;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISettingsBrightness::RefreshButtonImagesTooltips(bool bForceShowAll)\n{\n\tif (!ButtonImagesTooltipsArray)\n\t\treturn;\n\n\tTArray<FSoUITextCommandPair> CommandsToBeDisplayed;\n\tif (bForceShowAll || DidInitialValuesChange())\n\t\tCommandsToBeDisplayed.Add({ UICommand_Apply, FROM_STRING_TABLE_UI(\"settings_apply\") });\n\n\tif (bForceShowAll || CanRevertToDefault())\n\t\tCommandsToBeDisplayed.Add({ UICommand_ResetToDefault, FROM_STRING_TABLE_UI(\"settings_reset\") });\n\n\tButtonImagesTooltipsArray->UpdateEnsureOnlyTheseCommandsExist(CommandsToBeDisplayed);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoUISettingsBrightness::OnPressedButtonTooltipsCommand(ESoUICommand Command)\n{\n\tSuper::OnPressedButtonTooltipsCommand(Command);\n\n\tswitch (Command)\n\t{\n\tcase UICommand_Apply:\n\t{\n\t\tOnCommandApply();\n\t\tbreak;\n\t}\n\tcase UICommand_ResetToDefault:\n\t{\n\t\tOnCommandResetToDefault();\n\t\tbreak;\n\t}\n\n\tdefault:\n\t\treturn false;\n\t}\n\n\treturn true;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISettingsBrightness::ResetSelectedOptionsToCurrentSettings()\n{\n\tUSoGameSettings::Get().SetBlockConfigSave(true);\n\n\tif (Brightness)\n\t\tBrightness->SetValueNormalized(USoGameSettings::Get().GetBrightnessNormalized());\n\n\tEmptyAndRefreshButtonImagesTooltips();\n\n\tUSoGameSettings::Get().SetBlockConfigSave(false);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoUISettingsBrightness::DidInitialValuesChange() const\n{\n\treturn !FMath::IsNearlyEqual(InitialBrightnessNormalized, Brightness->GetValueNormalized(), KINDA_SMALL_NUMBER);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoUISettingsBrightness::CanRevertToDefault() const\n{\n\treturn !USoGameSettings::Get().IsEqualToDefaultNormalizedBrightness(Brightness->GetValueNormalized());\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISettingsBrightness::OnCommandApply()\n{\n\tif (DidInitialValuesChange())\n\t\tUSoAudioManager::PlaySound2D(this, USoGameSingleton::GetSFX(ESoSFX::SettingsApply));\n\n\tInitialBrightnessNormalized = USoGameSettings::Get().GetBrightnessNormalized();\n\tResetSelectedOptionsToCurrentSettings();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISettingsBrightness::OnCommandResetToDefault()\n{\n\tif (CanRevertToDefault())\n\t\tUSoAudioManager::PlaySound2D(this, USoGameSingleton::GetSFX(ESoSFX::SettingsRestore));\n\n\tUSoGameSettings::Get().ResetBrightnessToDefault();\n\tUSoGameSettings::Get().ApplyGameSettings(true);\n\tInitialBrightnessNormalized = USoGameSettings::Get().GetBrightnessNormalized();\n\tResetSelectedOptionsToCurrentSettings();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISettingsBrightness::OnBrightnessValueChanged(float NewValueNormalized)\n{\n\tif (!bOpened)\n\t\treturn;\n\n\tUSoGameSettings::Get().SetBrightnessNormalized(NewValueNormalized);\n\t\tUSoGameSettings::Get().ApplyGameSettings(true);\n\tRefreshButtonImagesTooltips();\n}\n"
  },
  {
    "path": "Source/SOrb/UI/Menu/Settings/SoUISettingsBrightness.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#pragma once\n\n#include \"CoreMinimal.h\"\n\n#include \"SoUISettingsBase.h\"\n\n#include \"SoUISettingsBrightness.generated.h\"\n\n\nclass USoGameSettings;\nclass USoUISlider;\n\nclass USoUICommandTooltipArray;\n\n// All the line options for the USoUISettingsBrightness\nenum class ESoUISettingsBrightnessLine : uint8\n{\n\tNone = 0,\n\tBrightness\n};\n\n/**\n * Controls the brightness of the game\n */\nUCLASS()\nclass SORB_API USoUISettingsBrightness : public USoUISettingsBase\n{\n\tGENERATED_BODY()\nprotected:\n\t//\n\t// UUserWidget Interface\n\t//\n\tvoid SynchronizeProperties() override;\n\tvoid NativeConstruct() override;\n\tvoid NativeDestruct() override;\n\n\t//\n\t// ISoUIEventHandler Interface\n\t//\n\tvoid Open_Implementation(bool bOpen) override;\n\n\t//\n\t// USoUISettingsBase Interface\n\t//\n\tvoid CreateChildrenAndSetTexts(bool bFromSynchronizeProperties = false) override;\n\tbool HandleOnUICommand(ESoUICommand Command) override;\n\tbool NavigateLeftRightOnSelectedLine(ESoUICommand Command, bool bFromPressedInput = false) override;\n\tbool IsValidLineIndex(int32 LineIndex) const override\n\t{\n\t\treturn Super::IsValidLineIndex(LineIndex) && LineOptions.IsValidIndex(LineIndex);\n\t}\n\tvoid RefreshButtonImagesTooltips(bool bForceShowAll = false) override;\n\tbool OnPressedButtonTooltipsCommand(ESoUICommand Command) override;\n\n\t//\n\t// Own Methods\n\t//\n\tvoid ResetSelectedOptionsToCurrentSettings();\n\tbool DidInitialValuesChange() const;\n\tbool CanRevertToDefault() const;\n\n\tvoid OnCommandApply();\n\tvoid OnCommandResetToDefault();\n\n\tUFUNCTION()\n\tvoid OnBrightnessValueChanged(float NewValueNormalized);\n\nprotected:\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\", meta = (BindWidget))\n\tUSoUISlider* Brightness = nullptr;\n\n\t// Map Selected Line Index => ESoUISettingsBrightnessLine (line type)\n\tconst TArray<ESoUISettingsBrightnessLine> LineOptions = {\n\t\tESoUISettingsBrightnessLine::Brightness\n\t};\n\n\tUPROPERTY()\n\tfloat InitialBrightnessNormalized = INDEX_NONE;\n\n\tstatic constexpr ESoUICommand UICommand_Apply = ESoUICommand::EUC_Action0;\n\tstatic constexpr ESoUICommand UICommand_ResetToDefault = ESoUICommand::EUC_Action1;\n};\n"
  },
  {
    "path": "Source/SOrb/UI/Menu/Settings/SoUISettingsController.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#include \"SoUISettingsController.h\"\n\n#include \"GameFramework/InputSettings.h\"\n#include \"Components/WidgetSwitcher.h\"\n#include \"Components/BackgroundBlur.h\"\n\n#include \"Basic/SoAudioManager.h\"\n#include \"Basic/SoGameSingleton.h\"\n\n#include \"Settings/SoGameSettings.h\"\n#include \"Settings/Input/SoInputHelper.h\"\n#include \"Settings/Input/SoInputNames.h\"\n\n#include \"UI/General/Buttons/SoUIButtonArray.h\"\n#include \"UI/General/Buttons/SoUIScrollingButtonArray.h\"\n#include \"UI/General/Buttons/SoUIButtonImageArray.h\"\n#include \"UI/General/Commands/SoUICommandImage.h\"\n#include \"UI/General/SoUICheckbox.h\"\n#include \"UI/General/SoUISlider.h\"\n#include \"UI/General/Commands/SoUICommandTooltip.h\"\n\n#include \"Localization/SoLocalization.h\"\n#include \"SoUISettingsControllerRemap.h\"\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISettingsController::SynchronizeProperties()\n{\n\tSuper::SynchronizeProperties();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISettingsController::NativeConstruct()\n{\n\tSuper::NativeConstruct();\n\tBackgroundBlur->SetVisibility(ESlateVisibility::Collapsed);\n\n\tif (ControllerPlatform)\n\t\tControllerPlatform->OnSelectedChildChangedEvent().AddUObject(this, &ThisClass::OnControllerPlatformChildChanged);\n\n\tif (ControllerPlatform)\n\t\tControllerPlatform->SetSelectedIndex(ControllerPlatformOptions.Find(static_cast<ESoGamepadLayoutType>(0)));\n\n\tif (Vibration)\n\t\tVibration->OnValueChangedEvent().AddDynamic(this, &ThisClass::OnVibrationValueChanged);\n\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISettingsController::NativeDestruct()\n{\n\tif (Vibration)\n\t\tVibration->OnValueChangedEvent().RemoveDynamic(this, &ThisClass::OnVibrationValueChanged);\n\tif (ControllerPlatform)\n\t\tControllerPlatform->OnSelectedChildChangedEvent().RemoveAll(this);\n\n\tSuper::NativeDestruct();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISettingsController::Open_Implementation(bool bOpen)\n{\n\tUserSettings->SetBlockConfigSave(true);\n\tResetSelectedOptionsToUserSettings();\n\tif (bOpen)\n\t{\n\t\tInitializeAllGamepadButtons();\n\t}\n\telse\n\t{\n\t\t// Close all child widgets\n\t\tBackgroundBlur->SetVisibility(ESlateVisibility::Collapsed);\n\t\tISoUIEventHandler::Execute_Open(RemapController, false);\n\t}\n\tUserSettings->SetBlockConfigSave(false);\n\n\tSuper::Open_Implementation(bOpen);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoUISettingsController::CanBeInterrupted_Implementation() const\n{\n\tif (ISoUIEventHandler::Execute_IsOpened(RemapController))\n\t\treturn ISoUIEventHandler::Execute_CanBeInterrupted(RemapController);\n\n\treturn true;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISettingsController::CreateChildrenAndSetTexts(bool bFromSynchronizeProperties)\n{\n\tRefreshLineOptions();\n\tif (ControllerPlatform)\n\t{\n\t\tTArray<FText> Texts;\n\t\tfor (const ESoGamepadLayoutType Option : ControllerPlatformOptions)\n\t\t{\n\t\t\tswitch (Option)\n\t\t\t{\n\t\t\tcase ESoGamepadLayoutType::Xbox:\n\t\t\t\tTexts.Add(FROM_STRING_TABLE_UI(\"console_xbox_one\"));\n\t\t\t\tbreak;\n\t\t\tcase ESoGamepadLayoutType::PlayStation:\n\t\t\t\tTexts.Add(FROM_STRING_TABLE_UI(\"console_ps4\"));\n\t\t\t\tbreak;\n\t\t\tcase ESoGamepadLayoutType::Switch:\n\t\t\t\tTexts.Add(FROM_STRING_TABLE_UI(\"console_switch\"));\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tTexts.Add(FROM_STRING_TABLE_UI(\"unknown\"));\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tControllerPlatform->CreateButtons(Texts);\n\t}\n\n\t// Set the Lines order and text\n\tEmptyLinesAndTitles();\n\tfor (const ESoUISettingsControllerLine Option : LineOptions)\n\t{\n\t\tswitch (Option)\n\t\t{\n\t\tcase ESoUISettingsControllerLine::AutoDetectControllerType:\n\t\t\tAddLineWithText(AutoDetectControllerType, FROM_STRING_TABLE_UI(\"settings_auto_detect_controller\"));\n\t\t\tbreak;\n\n\t\tcase ESoUISettingsControllerLine::Layout:\n\t\t\tAddLineWithText(ControllerPlatform, FROM_STRING_TABLE_UI(\"settings_controller_platform\"));\n\t\t\tbreak;\n\n\t\tcase ESoUISettingsControllerLine::Vibration:\n\t\t\tAddLineWithText(Vibration, FROM_STRING_TABLE_UI(\"settings_gamepad_vibration\"));\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tcheckNoEntry();\n\t\t\tbreak;\n\t\t}\n\t}\n\n\tif (LineOptions.Num() != NumLines())\n\t\tUE_LOG(LogSoUISettings, Error, TEXT(\"Controller CreateChildrenAndSetTexts: LineOptions.Num(%d) != NumLines(%d)\"), LineOptions.Num(), NumLines());\n\n\tSuper::CreateChildrenAndSetTexts(bFromSynchronizeProperties);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoUISettingsController::ShouldChildHandleCommands() const\n{\n\treturn RemapController && ISoUIEventHandler::Execute_IsOpened(RemapController);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoUISettingsController::HandleOnUICommand(ESoUICommand Command)\n{\n\t// Forward to remap controller\n\tif (ShouldChildHandleCommands())\n\t{\n\t\tISoUIEventHandler::Execute_OnUICommand(RemapController, Command);\n\n\t\t// Was closed\n\t\tif (!ShouldChildHandleCommands())\n\t\t{\n\t\t\tEmptyAndRefreshButtonImagesTooltips();\n\t\t\tInitializeAllGamepadButtons();\n\t\t\tBackgroundBlur->SetVisibility(ESlateVisibility::Collapsed);\n\t\t}\n\n\t\treturn true;\n\t}\n\n\tif (Super::HandleOnUICommand(Command))\n\t\treturn true;\n\n\treturn OnPressedButtonTooltipsCommand(Command);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISettingsController::OnPressedChild(int32 SelectedChild, USoUIUserWidget* SoUserWidget)\n{\n\tSuper::OnPressedChild(SelectedChild, SoUserWidget);\n\tif (!IsValidLineIndex(SelectedChild))\n\t\treturn;\n\n\tbool bHandled = false;\n\tconst ESoUISettingsControllerLine SelectedLineOption = LineOptions[SelectedChild];\n\tif (SelectedLineOption == ESoUISettingsControllerLine::AutoDetectControllerType)\n\t{\n\t\tUserSettings->SetAutoDetectGamepadLayout(AutoDetectControllerType->IsChecked());\n\t\tbHandled = true;\n\t}\n\n\tif (bHandled)\n\t{\n\t\tUserSettings->ApplyInputSettings();\n\t\tResetSelectedOptionsToUserSettings();\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoUISettingsController::NavigateLeftRightOnSelectedLine(ESoUICommand Command, bool bFromPressedInput)\n{\n\tif (!Super::NavigateLeftRightOnSelectedLine(Command, bFromPressedInput))\n\t\treturn false;\n\n\t// Handled in super, I hope\n\tif (IsOnButtonTooltips())\n\t\treturn true;\n\n\treturn true;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISettingsController::RefreshButtonImagesTooltips(bool bForceShowAll)\n{\n\tif (!ButtonImagesTooltipsArray)\n\t\treturn;\n\n\tTArray<FSoUITextCommandPair> CommandsToBeDisplayed;\n\tCommandsToBeDisplayed.Add({ UICommand_RemapController, FROM_STRING_TABLE_UI(\"settings_controller_remap_single\") });\n\tButtonImagesTooltipsArray->UpdateEnsureOnlyTheseCommandsExist(CommandsToBeDisplayed);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoUISettingsController::OnPressedButtonTooltipsCommand(ESoUICommand Command)\n{\n\tSuper::OnPressedButtonTooltipsCommand(Command);\n\n\tswitch (Command)\n\t{\n\tcase UICommand_RemapController:\n\t\tOnCommandRemapController();\n\t\tbreak;\n\n\tdefault:\n\t\treturn false;\n\t}\n\n\treturn true;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISettingsController::OnCommandRemapController()\n{\n\tISoUIEventHandler::Execute_Open(RemapController, true);\n\tBackgroundBlur->SetVisibility(ESlateVisibility::Visible);\n\tUSoAudioManager::PlaySound2D(this, USoGameSingleton::GetSFX(ESoSFX::SettingsPressed));\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISettingsController::ResetSelectedOptionsToUserSettings()\n{\n\t// NOTE: See note from USoUISettingsDisplay::ResetSelectedOptionsToUserSettings\n\tUserSettings->ResetToCurrentSettings();\n\tUserSettings->ValidateSettings();\n\n\tif (ControllerPlatform)\n\t{\n\t\tconst int32 FoundIndex = ControllerPlatformOptions.Find(UserSettings->GetGamepadLayoutType());\n\t\tControllerPlatform->SetSelectedIndex(FoundIndex);\n\t}\n\tif (Vibration)\n\t\tVibration->SetValueNormalized(USoGameSettings::Get().GetVibrationScaleNormalized());\n\n\tUpdateUI();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISettingsController::UpdateWidgetsVisibilities()\n{\n\tif (ControllerPlatform)\n\t{\n\t\tControllerPlatform->SetVisibility(\n\t\t\tLineOptions.Contains(ESoUISettingsControllerLine::Layout) ?\n\t\t\tESlateVisibility::Visible : ESlateVisibility::Collapsed\n\t\t);\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISettingsController::RefreshLineOptions()\n{\n\tLineOptions = { ESoUISettingsControllerLine::Vibration };\n\n\tif (!USoPlatformHelper::IsConsole())\n\t\tLineOptions.Add(ESoUISettingsControllerLine::Layout);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISettingsController::UpdateUI()\n{\n\tif (ControllerPlatform)\n\t{\n\t\tconst int32 FoundIndex = ControllerPlatformOptions.Find(UserSettings->GetGamepadLayoutType());\n\t\tif (ControllerSwitcher)\n\t\t\tControllerSwitcher->SetActiveWidgetIndex(FoundIndex);\n\t\tif (ControllerSwitcherLines)\n\t\t\tControllerSwitcherLines->SetActiveWidgetIndex(FoundIndex);\n\t}\n\tif (AutoDetectControllerType)\n\t{\n\t\tAutoDetectControllerType->SetIsChecked(UserSettings->IsAutoDetectGamepadLayout());\n\t}\n\n\tUpdateAllImagesFromSelectedDeviceType();\n\tUpdateLinesVisibility();\n\tRefreshButtonImagesTooltips();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nESoGamepadLayoutType USoUISettingsController::GetSelectedGamepadLayoutType() const\n{\n\tconst int32 SelectedElementIndex = ControllerPlatform->GetSelectedIndex();\n\tif (ControllerPlatformOptions.IsValidIndex(SelectedElementIndex))\n\t{\n\t\treturn ControllerPlatformOptions[SelectedElementIndex];\n\t}\n\n\treturn ESoGamepadLayoutType::Xbox;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISettingsController::InitializeAllGamepadButtons()\n{\n\tInitializeGamepadButton(Gamepad_RightShoulder, FSoInputKey::Gamepad_RightShoulder());\n\tInitializeGamepadButton(Gamepad_RightTrigger, FSoInputKey::Gamepad_RightTrigger());\n\tInitializeGamepadButton(Gamepad_LeftTrigger, FSoInputKey::Gamepad_LeftTrigger());\n\tInitializeGamepadButton(Gamepad_LeftShoulder, FSoInputKey::Gamepad_LeftShoulder());\n\tInitializeGamepadButton(Gamepad_FaceButton_Top, FSoInputKey::Gamepad_FaceButton_Top());\n\tInitializeGamepadButton(Gamepad_FaceButton_Left, FSoInputKey::Gamepad_FaceButton_Left());\n\tInitializeGamepadButton(Gamepad_FaceButton_Right, FSoInputKey::Gamepad_FaceButton_Right());\n\tInitializeGamepadButton(Gamepad_FaceButton_Bottom, FSoInputKey::Gamepad_FaceButton_Bottom());\n\tInitializeGamepadButton(Gamepad_Special_Left, FSoInputKey::Gamepad_Special_Left());\n\tInitializeGamepadButton(Gamepad_Special_Right, FSoInputKey::Gamepad_Special_Right(), true);\n\tInitializeGamepadButton(Gamepad_DPad_Up, FSoInputKey::Gamepad_DPad_Up());\n\tInitializeGamepadButton(Gamepad_DPad_Down, FSoInputKey::Gamepad_DPad_Down());\n\tInitializeGamepadButton(Gamepad_DPad_Left, FSoInputKey::Gamepad_DPad_Left());\n\tInitializeGamepadButton(Gamepad_DPad_Right, FSoInputKey::Gamepad_DPad_Right());\n\n\t// Handle Gamepad_LeftThumbstick because it is an axis\n\tbool bFound = false;\n\n\t// Test MoveLeft\n\tFInputActionKeyMapping KeyMapping;\n\tconst TArray<FInputActionKeyMapping> ActionMappings = UserSettings->GetGamepadInputActionMappingsForActionName(FSoInputActionName::MoveLeft, false);\n\tif (USoInputHelper::GetFirstInputActionKeyMapping(ActionMappings, KeyMapping))\n\t{\n\t\tconst FName ThumbStickDirection = KeyMapping.Key.GetFName();\n\t\tconst FName ThumbStick = FSoInputKey::GetThumbStickForStickDirection(ThumbStickDirection);\n\t\tif (ThumbStick != NAME_None)\n\t\t{\n\t\t\tOverrideGamepadButtonTextWith(Gamepad_LeftThumbstick, FROM_STRING_TABLE_UI(\"settings_move_left_right\"));\n\t\t\tOverrideGamepadButtonImageWithTexturesOf(Gamepad_LeftThumbstick, ThumbStick);\n\t\t\tbFound = true;\n\t\t}\n\t}\n\n\tif (!bFound)\n\t{\n\t\t// Empty :(\n\t\tInitializeEmptyGamepadButton(Gamepad_LeftThumbstick, FSoInputKey::Gamepad_LeftThumbstick());\n\t}\n\n\n\t// Handle Gamepad_RightThumbstick\n\tOverrideGamepadButtonTextWith(Gamepad_RightThumbstick, FROM_STRING_TABLE_UI(\"select_spells\"));\n\tOverrideGamepadButtonImageWithTexturesOf(Gamepad_RightThumbstick, FSoInputKey::Gamepad_RightThumbstick());\n\n\tUpdateAllImagesFromSelectedDeviceType();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISettingsController::InitializeGamepadButton(USoUICommandTooltip* Button, FName GamepadKeyName, bool bAlsoCheckUICommand)\n{\n\tverify(Button);\n\tverify(GamepadKeyName != NAME_None);\n\n\t// Get action names for gamepad key\n\tconst TArray<FName>& ActionNames = UserSettings->GetActionNamesForGamepadKey(GamepadKeyName);\n\tconst TArray<FName>& UIActionNames = UserSettings->GetUIActionNamesForGamepadKey(GamepadKeyName);\n\tconst bool bIsActionName = ActionNames.Num() > 0;\n\tconst bool bIsUIActionName = UIActionNames.Num() > 0;\n\tif (!bIsActionName && !bIsUIActionName)\n\t{\n\t\tUE_LOG(LogSoUISettings, Error, TEXT(\"InitializeGamepadButton: Can't get any ActionName for GamepadKeyName = %s\"),*GamepadKeyName.ToString());\n\t\treturn;\n\t}\n\n\t// Get correct actionName\n\tFName ActionName = NAME_None;\n\tif (bIsActionName)\n\t\tActionName = ActionNames[0];\n\tif (bAlsoCheckUICommand && bIsUIActionName)\n\t\tActionName = UIActionNames[0];\n\n\tconst bool bIsConfigurable = FSoInputConfigurableActionName::IsGamepadActionName(ActionName);\n\tif ((!bAlsoCheckUICommand && !bIsActionName)\n\t\t|| (bAlsoCheckUICommand && !bIsUIActionName)\n\t\t|| (!bAlsoCheckUICommand && !bIsConfigurable))\n\t{\n\t\tInitializeEmptyGamepadButton(Button, GamepadKeyName);\n\t\treturn;\n\t}\n\n\t// Key is taken by an action\n\tif (bAlsoCheckUICommand)\n\t{\n\t\t// UI\n\t\tconst ESoUICommand Command = FSoInputActionName::ActionNameToUICommand(ActionName);\n\t\tButton->InitializeFromUICommand(USoGameSingleton::GetTextForInputActionName(ActionName), Command, false);\n\t}\n\telse\n\t{\n\t\t// Normal\n\t\tconst ESoInputActionNameType ActionNameType = FSoInputActionName::ActionNameToActionNameType(ActionName);\n\t\tButton->InitializeFromInputActionNameType(USoGameSingleton::GetTextForInputActionName(ActionName), ActionNameType, false);\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISettingsController::InitializeEmptyGamepadButton(USoUICommandTooltip* Button, FName GamepadKeyName)\n{\n\tif (!Button)\n\t\treturn;\n\n\t// Set to empty stuff\n\tstatic FText EmptyLine = FROM_STRING_TABLE_UI(\"empty_line\");\n\n\tButton->SetPaddingBetween(10.f);\n\tOverrideGamepadButtonTextWith(Button, EmptyLine);\n\tOverrideGamepadButtonImageWithTexturesOf(Button, GamepadKeyName);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISettingsController::OverrideGamepadButtonTextWith(USoUICommandTooltip* Button, FText Text)\n{\n\tif (Button)\n\t\tButton->SetText(Text);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISettingsController::OverrideGamepadButtonImageWithTexturesOf(USoUICommandTooltip* Button, FName GamepadKeyName)\n{\n\tif (!Button)\n\t\treturn;\n\n\tFSoInputGamepadKeyTextures Textures;\n\tif (USoGameSingleton::GetGamepadKeyTexturesFromKeyName(GamepadKeyName, false, Textures))\n\t{\n\t\tButton->SetOverrideGamepadTextures(Textures);\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISettingsController::UpdateAllImagesFromSelectedDeviceType()\n{\n\tconst ESoGamepadLayoutType GamepadUIType = GetSelectedGamepadLayoutType();\n\tconst ESoInputDeviceType DeviceType = USoInputHelper::ConvertInputGamepadUITypeToInputDeviceType(GamepadUIType);\n\n\tUpdateImageFromSelectedDeviceType(Gamepad_RightShoulder, DeviceType);\n\tUpdateImageFromSelectedDeviceType(Gamepad_RightTrigger, DeviceType);\n\tUpdateImageFromSelectedDeviceType(Gamepad_LeftTrigger, DeviceType);\n\tUpdateImageFromSelectedDeviceType(Gamepad_LeftShoulder, DeviceType);\n\tUpdateImageFromSelectedDeviceType(Gamepad_FaceButton_Top, DeviceType);\n\tUpdateImageFromSelectedDeviceType(Gamepad_FaceButton_Left, DeviceType);\n\tUpdateImageFromSelectedDeviceType(Gamepad_FaceButton_Right, DeviceType);\n\tUpdateImageFromSelectedDeviceType(Gamepad_FaceButton_Bottom, DeviceType);\n\tUpdateImageFromSelectedDeviceType(Gamepad_Special_Left, DeviceType);\n\tUpdateImageFromSelectedDeviceType(Gamepad_Special_Right, DeviceType);\n\tUpdateImageFromSelectedDeviceType(Gamepad_LeftThumbstick, DeviceType);\n\tUpdateImageFromSelectedDeviceType(Gamepad_RightThumbstick, DeviceType);\n\tUpdateImageFromSelectedDeviceType(Gamepad_DPad_Up, DeviceType);\n\tUpdateImageFromSelectedDeviceType(Gamepad_DPad_Down, DeviceType);\n\tUpdateImageFromSelectedDeviceType(Gamepad_DPad_Left, DeviceType);\n\tUpdateImageFromSelectedDeviceType(Gamepad_DPad_Right, DeviceType);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISettingsController::UpdateImageFromSelectedDeviceType(USoUICommandTooltip* Button, ESoInputDeviceType DeviceType)\n{\n\tif (!Button || DeviceType == ESoInputDeviceType::Keyboard)\n\t\treturn;\n\n\tButton->SetDeviceType(DeviceType);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISettingsController::UpdateLinesVisibility()\n{\n\tif (ControllerPlatform && AutoDetectControllerType)\n\t\tControllerPlatform->SetIsEnabled(!AutoDetectControllerType->IsChecked());\n\n\tif (AutoDetectControllerType && !LineOptions.Contains(ESoUISettingsControllerLine::AutoDetectControllerType))\n\t\tAutoDetectControllerType->SetVisibility(ESlateVisibility::Collapsed);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISettingsController::OnControllerPlatformChildChanged(int32 PreviousChild, int32 NewChild)\n{\n\tif (!bOpened)\n\t\treturn;\n\n\tif (ControllerPlatformOptions.IsValidIndex(NewChild))\n\t{\n\t\tconst ESoGamepadLayoutType SelectedOption = ControllerPlatformOptions[NewChild];\n\t\tUserSettings->SetGamepadLayoutType(SelectedOption);\n\t\tUserSettings->ApplyInputSettings();\n\t\tUpdateUI();\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISettingsController::OnVibrationValueChanged(float NewValueNormalized)\n{\n\tif (!bOpened)\n\t\treturn;\n\n\tUSoGameSettings::Get().SetVibrationScaleNormalized(NewValueNormalized);\n\tUSoGameSettings::Get().ApplyGameSettings(true);\n\tif (ForceFeedbackToPlayOnChange)\n\t{\n\t\tstatic constexpr bool bIgnoreTimeDilation = true;\n\t\tstatic constexpr bool bPlayWhilePaused = true;\n\t\tUSoPlatformHelper::PlayForceFeedback(\n\t\t\tthis,\n\t\t\tForceFeedbackToPlayOnChange,\n\t\t\tNAME_None,\n\t\t\tfalse,\n\t\t\tbIgnoreTimeDilation,\n\t\t\tbPlayWhilePaused\n\t\t);\n\t}\n\n\tRefreshButtonImagesTooltips();\n}\n"
  },
  {
    "path": "Source/SOrb/UI/Menu/Settings/SoUISettingsController.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#pragma once\n\n#include \"CoreMinimal.h\"\n\n#include \"SoUISettingsBase.h\"\n#include \"Settings/Input/SoInputNames.h\"\n#include \"Settings/Input/SoInputSettingsTypes.h\"\n#include \"Basic/Helpers/SoPlatformHelper.h\"\n\n#include \"SoUISettingsController.generated.h\"\n\nclass USoUIButtonArray;\nclass UPanelWidget;\nclass USoUICommandTooltipArray;\nclass USoUIScrollingButtonArray;\nclass USoUICommandTooltip;\nclass USoGameSettings;\nclass USoUISettingsControllerRemap;\nclass UBackgroundBlur;\nclass USoUICheckbox;\nclass UWidgetSwitcher;\n\n// All the line options for the USoUISettingsController\nenum class ESoUISettingsControllerLine : uint8\n{\n\tLayout = 0,\n\tAutoDetectControllerType,\n\tVibration\n};\n\n/**\n * Shows the controller input options\n */\nUCLASS()\nclass SORB_API USoUISettingsController : public USoUISettingsBase\n{\n\tGENERATED_BODY()\n\ttypedef USoUISettingsController Self;\n\nprotected:\n\t//\n\t// UUserWidget Interface\n\t//\n\tvoid SynchronizeProperties() override;\n\tvoid NativeConstruct() override;\n\tvoid NativeDestruct() override;\n\n\t//\n\t// ISoUIEventHandler Interface\n\t//\n\tvoid Open_Implementation(bool bOpen) override;\n\tbool CanBeInterrupted_Implementation() const override;\n\n\t//\n\t// USoUISettingsBase Interface\n\t//\n\tvoid CreateChildrenAndSetTexts(bool bFromSynchronizeProperties = false) override;\n\tbool HandleOnUICommand(ESoUICommand Command) override;\n\tvirtual bool ShouldChildHandleCommands() const;\n\tvoid OnPressedChild(int32 SelectedChild, USoUIUserWidget* SoUserWidget) override;\n\tbool NavigateLeftRightOnSelectedLine(ESoUICommand Command, bool bFromPressedInput = false) override;\n\tbool IsValidLineIndex(int32 LineIndex) const override\n\t{\n\t\treturn Super::IsValidLineIndex(LineIndex) && LineOptions.IsValidIndex(LineIndex);\n\t}\n\tvoid RefreshButtonImagesTooltips(bool bForceShowAll = false) override;\n\tbool OnPressedButtonTooltipsCommand(ESoUICommand Command) override;\n\n\tvoid UpdateWidgetsVisibilities() override;\n\n\t//\n\t// Own methods\n\t//\n\n\tvoid RefreshLineOptions();\n\tvoid OnCommandRemapController();\n\n\t// Reset settings to the system settings and updates selected options to match the user settings one.\n\tvoid ResetSelectedOptionsToUserSettings();\n\tvoid UpdateUI();\n\n\tESoGamepadLayoutType GetSelectedGamepadLayoutType() const;\n\n\tvoid InitializeAllGamepadButtons();\n\tvoid InitializeGamepadButton(USoUICommandTooltip* Button, FName GamepadKeyName, bool bAlsoCheckUICommand = false);\n\tvoid InitializeEmptyGamepadButton(USoUICommandTooltip* Button, FName GamepadKeyName);\n\n\tvoid OverrideGamepadButtonTextWith(USoUICommandTooltip* Button, FText Text);\n\tvoid OverrideGamepadButtonImageWithTexturesOf(USoUICommandTooltip* Button, FName GamepadKeyName);\n\n\tvoid UpdateAllImagesFromSelectedDeviceType();\n\tvoid UpdateImageFromSelectedDeviceType(USoUICommandTooltip* Button, ESoInputDeviceType DeviceType);\n\n\t// Enable/Disable some lines depending on the options set.\n\tvoid UpdateLinesVisibility();\n\n\tUFUNCTION()\n\tvoid OnControllerPlatformChildChanged(int32 PreviousChild, int32 NewChild);\n\n\tUFUNCTION()\n\tvoid OnVibrationValueChanged(float NewValueNormalized);\n\nprotected:\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\", meta = (BindWidget))\n\tUBackgroundBlur* BackgroundBlur = nullptr;\n\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\", meta = (BindWidget))\n\tUWidgetSwitcher* ControllerSwitcher = nullptr;\n\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\", meta = (BindWidget))\n\tUWidgetSwitcher* ControllerSwitcherLines = nullptr;\n\n\t// Lines:\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\", meta = (BindWidget))\n\tUSoUICheckbox* AutoDetectControllerType = nullptr;\n\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\", meta = (BindWidget))\n\tUSoUISlider* Vibration = nullptr;\n\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\", meta = (BindWidget))\n\tUSoUIScrollingButtonArray* ControllerPlatform = nullptr;\n\n\t// Map Selected Line Index => ESoUISettingsControllerLine (line type)\n\t// NOTE for this you also need to change the order in the UMG Blueprint Widget of the USoUIButtonArray.\n\tTArray<ESoUISettingsControllerLine> LineOptions = {\n\t\t//ESoUISettingsControllerLine::AutoDetectControllerType,\n\t\tESoUISettingsControllerLine::Vibration,\n\t\tESoUISettingsControllerLine::Layout,\n\t};\n\n\t// Map Selected Button Index => ESoGamepadLayoutType. Usually they are one and the same.\n\tconst TArray<ESoGamepadLayoutType> ControllerPlatformOptions = {\n\t\tESoGamepadLayoutType::Xbox,\n\t\tESoGamepadLayoutType::PlayStation,\n\t\tESoGamepadLayoutType::Switch\n\t};\n\n\t// The Force feedback to play if the Vibration slider changed\n\tUPROPERTY(EditAnywhere, BlueprintReadOnly, Category = \">Vibration\")\n\tUForceFeedbackEffect* ForceFeedbackToPlayOnChange;\n\n\t// Gamepad buttons\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\", meta = (BindWidget))\n\tUSoUICommandTooltip* Gamepad_RightShoulder = nullptr;\n\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\", meta = (BindWidget))\n\tUSoUICommandTooltip* Gamepad_RightTrigger = nullptr;\n\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\", meta = (BindWidget))\n\tUSoUICommandTooltip* Gamepad_LeftTrigger = nullptr;\n\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\", meta = (BindWidget))\n\tUSoUICommandTooltip* Gamepad_LeftShoulder = nullptr;\n\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\", meta = (BindWidget))\n\tUSoUICommandTooltip* Gamepad_FaceButton_Top = nullptr;\n\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\", meta = (BindWidget))\n\tUSoUICommandTooltip* Gamepad_FaceButton_Left = nullptr;\n\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\", meta = (BindWidget))\n\tUSoUICommandTooltip* Gamepad_FaceButton_Right = nullptr;\n\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\", meta = (BindWidget))\n\tUSoUICommandTooltip* Gamepad_FaceButton_Bottom = nullptr;\n\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\", meta = (BindWidget))\n\tUSoUICommandTooltip* Gamepad_Special_Left = nullptr;\n\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\", meta = (BindWidget))\n\tUSoUICommandTooltip* Gamepad_Special_Right = nullptr;\n\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\", meta = (BindWidget))\n\tUSoUICommandTooltip* Gamepad_LeftThumbstick = nullptr;\n\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\", meta = (BindWidget))\n\tUSoUICommandTooltip* Gamepad_RightThumbstick = nullptr;\n\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\", meta = (BindWidget))\n\tUSoUICommandTooltip* Gamepad_DPad_Up = nullptr;\n\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\", meta = (BindWidget))\n\tUSoUICommandTooltip* Gamepad_DPad_Down = nullptr;\n\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\", meta = (BindWidget))\n\tUSoUICommandTooltip* Gamepad_DPad_Left = nullptr;\n\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\", meta = (BindWidget))\n\tUSoUICommandTooltip* Gamepad_DPad_Right = nullptr;\n\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\", meta = (BindWidget))\n\tUSoUISettingsControllerRemap* RemapController = nullptr;\n\n\tstatic constexpr ESoUICommand UICommand_RemapController = ESoUICommand::EUC_Action0;\n};\n"
  },
  {
    "path": "Source/SOrb/UI/Menu/Settings/SoUISettingsControllerRemap.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#include \"SoUISettingsControllerRemap.h\"\n\n#include \"Components/Overlay.h\"\n#include \"Components/PanelWidget.h\"\n\n#include \"Character/SoCharacter.h\"\n#include \"Character/SoPlayerController.h\"\n\n#include \"Settings/SoGameSettings.h\"\n#include \"Settings/Input/SoInputHelper.h\"\n#include \"Basic/SoGameSingleton.h\"\n#include \"Basic/SoAudioManager.h\"\n\n#include \"UI/General/Buttons/SoUIButtonImageArray.h\"\n#include \"UI/General/Buttons/SoUIButtonArray.h\"\n#include \"UI/General/Buttons/SoUIButtonImage.h\"\n#include \"UI/SoUIHelper.h\"\n#include \"KeySelector/SoUIInputKeySelectorOverlay.h\"\n#include \"SoUISettingsKeyboard.h\"\n#include \"Localization/SoLocalization.h\"\n#include \"Basic/Helpers/SoPlatformHelper.h\"\n#include \"SoLocalization.h\"\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISettingsControllerRemap::SynchronizeProperties()\n{\n\tInputOptions = FSoInputConfigurableActionName::GetGamepadOptions();\n\tSuper::SynchronizeProperties();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISettingsControllerRemap::NativeConstruct()\n{\n\tSuper::NativeConstruct();\n\tSetVisibility(ESlateVisibility::Collapsed);\n\tOnlyGamepadOverlay->SetVisibility(ESlateVisibility::Collapsed);\n\n\t// Events Hierarchy:\n\t// 1. SSoInputKeySelector\n\t// 2. USoUIInputKeySelector\n\t// 3. USoUIInputKeySelectorOverlay\n\t// 4. ThisClass\n\tif (KeySelectorOverlay)\n\t{\n\t\tKeySelectorOverlay->OnIsSelectedKeyValidEvent() = BIND_UOBJECT_DELEGATE(USoUIInputKeySelectorOverlay::FSoIsSelectedKeyValidEvent, IsSelectedKeyValid);\n\n\t\tKeySelectorOverlay->OnOpenChangedEvent().AddDynamic(this, &ThisClass::OnKeySelectorOverlayOpenChanged);\n\t\tKeySelectorOverlay->OnKeySelectedEvent().AddDynamic(this, &ThisClass::HandleKeySelected);\n\t\tKeySelectorOverlay->OnIsSelectingKeyChangedEvent().AddDynamic(this, &ThisClass::HandleIsSelectingKeyChanged);\n\t\tKeySelectorOverlay->OnApplySelectedKeyEvent().AddDynamic(this, &ThisClass::HandleApplySelectedKey);\n\t}\n\n\tSubscribeToDeviceChanged();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISettingsControllerRemap::NativeDestruct()\n{\n\tif (KeySelectorOverlay)\n\t{\n\t\tKeySelectorOverlay->OnKeySelectedEvent().RemoveDynamic(this, &ThisClass::HandleKeySelected);\n\t\tKeySelectorOverlay->OnIsSelectingKeyChangedEvent().RemoveDynamic(this, &ThisClass::HandleIsSelectingKeyChanged);\n\t\tKeySelectorOverlay->OnApplySelectedKeyEvent().RemoveDynamic(this, &ThisClass::HandleApplySelectedKey);\n\t\tKeySelectorOverlay->OnOpenChangedEvent().RemoveDynamic(this, &ThisClass::OnKeySelectorOverlayOpenChanged);\n\t}\n\n\tUnSubscribeFromDeviceChanged();\n\tSuper::NativeDestruct();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISettingsControllerRemap::Open_Implementation(bool bOpen)\n{\n\t// Reset on open\n\tif (bOpen)\n\t{\n\t\tUSoPlatformHelper::DisallowMouse(this);\n\t\tUpdateCanEditGamepadButtons();\n\t\tCreateInputButtonsFromUserSettings(0);\n\t}\n\telse\n\t{\n\t\t// Close all the child widgets\n\t\tKeySelectorOverlay->Close();\n\t\tUSoPlatformHelper::AllowMouse(this);\n\t}\n\n\tSuper::Open_Implementation(bOpen);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoUISettingsControllerRemap::CanBeInterrupted_Implementation() const\n{\n\tif (CurrentState == ESoUISettingsControllerRemapState::SelectingKey)\n\t\treturn !KeySelectorOverlay->IsSelectingKey();\n\n\treturn true;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISettingsControllerRemap::CreateChildrenAndSetTexts(bool bFromSynchronizeProperties)\n{\n\tEmptyLinesAndTitles();\n\tTArray<FText> GamepadButtonTexts;\n\tfor (const FSoInputConfigurableActionName& Option : InputOptions)\n\t{\n\t\tAddTitleText(Option.DisplayText);\n\t\tGamepadButtonTexts.Add(Option.DisplayText);\n\t}\n\n\tif (USoUIButtonArray* ButtonsArray = GetWidgetsArrayAsButtons())\n\t\tButtonsArray->CreateButtons(GamepadButtonTexts);\n\n\tSuper::CreateChildrenAndSetTexts(bFromSynchronizeProperties);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoUISettingsControllerRemap::HandleOnUICommand(ESoUICommand Command)\n{\n\tif (!UpdateCanEditGamepadButtons())\n\t{\n\t\t// Close this widget first\n\t\tif (Command == ESoUICommand::EUC_MainMenuBack)\n\t\t\tISoUIEventHandler::Execute_Open(this, false);\n\n\t\treturn true;\n\t}\n\n\t// Forward commands to the key selector\n\tif (CurrentState == ESoUISettingsControllerRemapState::SelectingKey)\n\t\treturn ISoUIEventHandler::Execute_OnUICommand(KeySelectorOverlay, Command);\n\n\tif (OnPressedButtonTooltipsCommand(Command))\n\t\treturn true;\n\n\t// Handle command in parent\n\treturn Super::HandleOnUICommand(Command);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISettingsControllerRemap::NavigateBackCommand()\n{\n\t// Close this widget\n\tUSoAudioManager::PlaySound2D(this, USoGameSingleton::GetSFX(ESoSFX::SettingsClose));\n\tISoUIEventHandler::Execute_Open(this, false);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISettingsControllerRemap::OnPressedChild(int32 SelectedChild, USoUIUserWidget* SoUserWidget)\n{\n\t// NOTE: don't call parent\n\n\tSetCurrentState(ESoUISettingsControllerRemapState::SelectingKey);\n\tUSoAudioManager::PlaySound2D(this, USoGameSingleton::GetSFX(ESoSFX::SettingsValueSwitch));\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoUISettingsControllerRemap::NavigateLeftRightOnSelectedLine(ESoUICommand Command, bool bFromPressedInput)\n{\n\treturn false;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISettingsControllerRemap::RefreshButtonImagesTooltips(bool bForceShowAll)\n{\n\tif (!ButtonImagesTooltipsArray)\n\t\treturn;\n\n\tTArray<FSoUITextCommandPair> CommandsToBeDisplayed;\n\tif (CurrentState != ESoUISettingsControllerRemapState::SelectingKey)\n\t{\n\t\tCommandsToBeDisplayed.Add({ UICommand_ResetAllToDefaults, FROM_STRING_TABLE_UI(\"settings_reset_default\") });\n\t}\n\n\tButtonImagesTooltipsArray->UpdateEnsureOnlyTheseCommandsExist(CommandsToBeDisplayed, true);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISettingsControllerRemap::OnLineChanged(int32 OldLineIndex, int32 NewLineIndex)\n{\n\tRefreshButtonImagesTooltips();\n\tSuper::OnLineChanged(OldLineIndex, NewLineIndex);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoUISettingsControllerRemap::OnPressedButtonTooltipsCommand(ESoUICommand Command)\n{\n\tSuper::OnPressedButtonTooltipsCommand(Command);\n\n\tif (CurrentState == ESoUISettingsControllerRemapState::SelectingKey)\n\t{\n\t\t// Forward commands to the key selector, check if we can handle another command\n\t\treturn KeySelectorOverlay->OnPressedButtonTooltipsCommand(Command);;\n\t}\n\n\tswitch (Command)\n\t{\n\tcase UICommand_ResetAllToDefaults:\n\t\tOnCommandResetAllToDefaults();\n\t\tbreak;\n\n\tdefault:\n\t\treturn false;\n\t}\n\n\treturn true;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISettingsControllerRemap::OnCommandResetAllToDefaults()\n{\n\tSetCurrentState(ESoUISettingsControllerRemapState::ResetAllToDefaults);\n\tUSoAudioManager::PlaySound2D(this, USoGameSingleton::GetSFX(ESoSFX::SettingsRestore));\n\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISettingsControllerRemap::HandleIsSelectingKeyChanged(bool bIsSelectingKey)\n{\n\tRefreshButtonImagesTooltips();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISettingsControllerRemap::HandleKeySelected(const FInputChord& SelectedKey)\n{\n\tRefreshButtonImagesTooltips();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISettingsControllerRemap::OnKeySelectorOverlayOpenChanged(bool bOpen)\n{\n\tif (!bOpen)\n\t{\n\t\t// Closed, return back to own state\n\t\tif (!KeySelectorOverlay->CanHandleUICommand())\n\t\t\tSetCurrentState(ESoUISettingsControllerRemapState::Browse);\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISettingsControllerRemap::HandleApplySelectedKey(const FInputChord& SelectedKey)\n{\n\t// Check here, maybe it escaped us somehow?\n\tFText ErrorMessage, WarningMessage;\n\tif (!IsSelectedKeyValid(SelectedKey, ErrorMessage, WarningMessage))\n\t{\n\t\tUE_LOG(\n\t\t\tLogSoUISettings,\n\t\t\tError,\n\t\t\tTEXT(\"HandleApplySelectedKey: SHOULD NOT HAVE REACHED HERE. ErrorMessage = %s, WarningMessage = %s\"),\n\t\t\t*ErrorMessage.ToString(), *WarningMessage.ToString()\n\t\t);\n\t\treturn;\n\t}\n\n\tif (!GamepadMappingOptions.IsValidIndex(SelectedKeyLineIndex))\n\t{\n\t\tUE_LOG(LogSoUISettings, Error, TEXT(\"HandleApplySelectedKey: GamepadMappingOptions does not have selected index = %d\"), SelectedKeyLineIndex);\n\t\treturn;\n\t}\n\n\t// Try to rebind\n\tconst FInputActionKeyMapping OldKeyMapping = GamepadMappingOptions[SelectedKeyLineIndex];\n\tconst FName SelectedActionName = OldKeyMapping.ActionName;\n\tif (UserSettings->RebindInputKeyToInputChord(OldKeyMapping, SelectedKey, true, false))\n\t{\n\t\t// Update UI\n\t\tUserSettings->ApplyInputSettings(true, true);\n\t\tCreateInputButtonsFromUserSettings(SelectedKeyLineIndex);\n\t}\n\telse\n\t{\n\t\tUE_LOG(\n\t\t\tLogSoUISettings,\n\t\t\tWarning,\n\t\t\tTEXT(\"HandleApplySelectedKey: Could not rebind input for ActionName = `%s` to Key = `%s` because reasons?\"),\n\t\t\t*SelectedActionName.ToString(), *SelectedKey.Key.ToString()\n\t\t);\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoUISettingsControllerRemap::IsSelectedKeyValid(const FInputChord& SelectedKey, FText& OutError, FText& OutWarning, bool bNoOutput)\n{\n\tif (!USoInputHelper::IsAllowedInputGamepadKey(SelectedKey))\n\t{\n\t\tFFormatNamedArguments Arguments;\n\t\tArguments.Add(TEXT(\"Key\"), FSoInputKey::GetKeyDisplayName(SelectedKey.Key));\n\t\tOutError = FText::Format(FROM_STRING_TABLE_UI(\"input_selected_key_not_allowed\"), Arguments);\n\t\tif (!bNoOutput)\n\t\t\tUE_LOG(LogSoUISettings, Error, TEXT(\"%s\"), *OutError.ToString());\n\n\t\treturn false;\n\t}\n\n\tconst int32 SelectedButtonIndex = GetSelectedLineIndex();\n\tif (!InputOptions.IsValidIndex(SelectedButtonIndex))\n\t{\n\t\tOutError = FText::FromString(\n\t\t\tFString::Printf(TEXT(\"ButtonIndex = %d does not exist in the InputOptions\"), SelectedButtonIndex)\n\t\t);\n\t\tif (!bNoOutput)\n\t\t\tUE_LOG(LogSoUISettings, Error, TEXT(\"%s\"), *OutError.ToString());\n\n\t\treturn false;\n\t}\n\n\tif (FSoInputKey::GetThumbStickForStickDirection(SelectedKey.Key.GetFName()) != NAME_None)\n\t{\n#if PLATFORM_SWITCH\n\t\tOutError = FROM_STRING_TABLE_UI(\"input_not_allowed_thumbsticks_switch\");\n#else\n\t\tOutError = FROM_STRING_TABLE_UI(\"input_not_allowed_thumbsticks\");\n#endif\n\t\tif (!bNoOutput)\n\t\t\tUE_LOG(LogSoUISettings, Error, TEXT(\"%s\"), *OutError.ToString());\n\n\t\treturn false;\n\t}\n\tif (SelectedKey.Key.GetFName() == FSoInputKey::Gamepad_Special_Right())\n\t{\n#if PLATFORM_SWITCH\n\t\tOutError = FROM_STRING_TABLE_UI(\"input_not_allowed_options_menu_button_switch\");\n#else\n\t\tOutError = FROM_STRING_TABLE_UI(\"input_not_allowed_options_menu_button\");\n#endif\n\t\tif (!bNoOutput)\n\t\t\tUE_LOG(LogSoUISettings, Error, TEXT(\"%s\"), *OutError.ToString());\n\n\t\treturn false;\n\t}\n\n\t// Key conflicts are allowed but warn the user\n\tconst FName SelectedActionName = InputOptions[SelectedButtonIndex].ActionName;\n\tif (USoUIHelper::AreThereAnyKeyConflicts(UserSettings, SelectedActionName, SelectedKey, OutWarning))\n\t{\n\t\tif (!bNoOutput)\n\t\t\tUE_LOG(LogSoUISettings, Error, TEXT(\"%s\"), *OutWarning.ToString());\n\t}\n\n\treturn true;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoUISettingsControllerRemap::UpdateCanEditGamepadButtons()\n{\n\t// Stop user from modifying with keyboard\n\tif (!SoController->IsLastInputFromGamepad())\n\t{\n\t\tKeySelectorOverlay->Close();\n\t\tContentContainer->SetIsEnabled(false);\n\t\tOnlyGamepadOverlay->SetVisibility(ESlateVisibility::Visible);\n\t\tSetCurrentState(ESoUISettingsControllerRemapState::Browse);\n\t\treturn false;\n\t}\n\n\tOnlyGamepadOverlay->SetVisibility(ESlateVisibility::Collapsed);\n\tContentContainer->SetIsEnabled(true);\n\treturn true;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISettingsControllerRemap::CreateInputButtonsFromUserSettings(int32 SelectLineIndex)\n{\n\tUSoUIButtonArray* ButtonsArray = GetWidgetsArrayAsButtons();\n\tif (ButtonsArray == nullptr)\n\t\treturn;\n\n\tUserSettings->RefreshInputSettingsMappings();\n\tGamepadMappingOptions.Empty();\n\tUnboundLineIndices.Empty();\n\n\t// NOTE: we don't actually use the texts, only set them so that we can create the correct amount of children\n\tTArray<FText> GamepadButtonTexts;\n\tfor (int32 Index = 0, Num = InputOptions.Num(); Index < Num; Index++)\n\t{\n\t\tconst FSoInputConfigurableActionName& Option = InputOptions[Index];\n\n\t\t// Query the input settings for this configurable option\n\t\tconst TArray<FInputActionKeyMapping> OptionMappings = UserSettings->GetGamepadInputActionMappingsForActionName(Option.ActionName, true);\n\n\t\tif (OptionMappings.Num() == 0)\n\t\t{\n\t\t\t// Something is wrong\n\t\t\tGamepadButtonTexts.Add(FROM_STRING_TABLE_UI(\"unknown\"));\n\t\t\tGamepadMappingOptions.Add(FInputActionKeyMapping());\n\t\t}\n\t\telse\n\t\t{\n\t\t\tbool bAlreadyAdded = false;\n\n\t\t\tint32 MappingIndex = INDEX_NONE;\n\t\t\tfor (const FInputActionKeyMapping& KeyMapping : OptionMappings)\n\t\t\t{\n\t\t\t\tMappingIndex++;\n\n\t\t\t\t// Multiple bindings for the same key?\n\t\t\t\tif (bAlreadyAdded)\n\t\t\t\t{\n\t\t\t\t\tUE_LOG(LogSoUISettings, Warning, TEXT(\"ActionName = %s also has an additional gamepad Key = %s. Ignoring \"), *Option.ActionName.ToString(), *KeyMapping.Key.ToString());\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tif (KeyMapping.Key.IsValid())\n\t\t\t\t{\n\t\t\t\t\tGamepadButtonTexts.Add(FSoInputKey::GetKeyDisplayName(KeyMapping.Key));\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t// Has another mapping, lets try that instead of making this unbound\n\t\t\t\t\t// Most likely the keyboard did unbind it\n\t\t\t\t\tif (MappingIndex + 1 < OptionMappings.Num())\n\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\tUnboundLineIndices.Add(Index);\n\t\t\t\t\tGamepadButtonTexts.Add(FROM_STRING_TABLE_UI(\"input_unbound\"));\n\t\t\t\t}\n\n\t\t\t\tGamepadMappingOptions.Add(KeyMapping);\n\t\t\t\tbAlreadyAdded = true;\n\t\t\t}\n\t\t}\n\t}\n\n\tButtonsArray->CreateButtons(GamepadButtonTexts);\n\tif (InputOptions.Num() != NumLines())\n\t{\n\t\t// Here be dragons\n\t\tUE_LOG(LogSoUISettings,\n\t\t\tFatal,\n\t\t\tTEXT(\"InputOptions.Num(%d) != GamepadButtons->GetElementNum(%) This would most likely make the input settings not work anymore\"),\n\t\t\tInputOptions.Num(), NumLines());\n\t}\n\tif (InputOptions.Num() != GamepadMappingOptions.Num())\n\t{\n\t\t// Here be vampires\n\t\tUE_LOG(LogSoUISettings,\n\t\t\tFatal,\n\t\t\tTEXT(\"InputOptions.Num(%d) != GamepadMappingOptions.Num(%) This would most likely make the input settings not work anymore\"),\n\t\t\tInputOptions.Num(), GamepadMappingOptions.Num());\n\t}\n\n\t// Set images on buttons\n\tUpdateGamepadButtonsImages();\n\n\t// Select line\n\tif (SelectLineIndex != INDEX_NONE)\n\t{\n\t\tconst int32 OldLineIndex = GetSelectedLineIndex();\n\t\tSetSelectedLineIndex(SelectLineIndex);\n\t\t//GamepadButtons->ActivateChildAt(SelectLineIndex);\n\t}\n\n\t// BP\n\tReceiveOnCreateInputButtonsFromUserSettings();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISettingsControllerRemap::SetCurrentState(ESoUISettingsControllerRemapState InCurrentState)\n{\n\tconst ESoUISettingsControllerRemapState PreviousState = CurrentState;\n\tCurrentState = InCurrentState;\n\n\tswitch (CurrentState)\n\t{\n\t\tcase ESoUISettingsControllerRemapState::Browse:\n\t\t\t// Do not change line index if we are coming from changing a key\n\t\t\tCreateInputButtonsFromUserSettings(\n\t\t\t\tPreviousState == ESoUISettingsControllerRemapState::SelectingKey ? INDEX_NONE : 0\n\t\t\t);\n\t\t\tbreak;\n\n\t\tcase ESoUISettingsControllerRemapState::SelectingKey:\n\t\t\tif (KeySelectorOverlay)\n\t\t\t{\n\t\t\t\t// Set the correct action name\n\t\t\t\tSelectedKeyLineIndex = GetSelectedLineIndex();\n\t\t\t\tif (InputOptions.IsValidIndex(SelectedKeyLineIndex))\n\t\t\t\t{\n\t\t\t\t\tKeySelectorOverlay->SetActionName(InputOptions[SelectedKeyLineIndex].DisplayText);\n\t\t\t\t\tKeySelectorOverlay->Open(true);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase ESoUISettingsControllerRemapState::ResetAllToDefaults:\n\t\t\tUserSettings->SetGamepadInputBindingsToDefault();\n\t\t\tUserSettings->ApplyInputSettings(true, true);\n\t\t\tCreateInputButtonsFromUserSettings(0);\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tbreak;\n\t}\n\n\tRefreshButtonImagesTooltips();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISettingsControllerRemap::HandleDeviceTypeChanged(ESoInputDeviceType InDeviceType)\n{\n\tif (!bIsListeningToDevicesChanges || !bOpened)\n\t\treturn;\n\n\tUpdateGamepadButtonsImages();\n\tUpdateCanEditGamepadButtons();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISettingsControllerRemap::SubscribeToDeviceChanged()\n{\n\tif (bIsListeningToDevicesChanges)\n\t\treturn;\n\n\tif (SoController)\n\t{\n\t\tSoController->OnDeviceTypeChanged().AddDynamic(this, &ThisClass::HandleDeviceTypeChanged);\n\t\tbIsListeningToDevicesChanges = true;\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISettingsControllerRemap::UnSubscribeFromDeviceChanged()\n{\n\tif (!bIsListeningToDevicesChanges)\n\t\treturn;\n\n\tif (SoController)\n\t{\n\t\tSoController->OnDeviceTypeChanged().RemoveDynamic(this, &ThisClass::HandleDeviceTypeChanged);\n\t\tbIsListeningToDevicesChanges = false;\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISettingsControllerRemap::UpdateGamepadButtonsImages()\n{\n\tUSoUIButtonArray* ButtonsArray = GetWidgetsArrayAsButtons();\n\tif (ButtonsArray == nullptr)\n\t\treturn;\n\n\tconst ESoInputDeviceType DeviceType = USoInputHelper::GetCurrentGamepadDeviceTypeFromSettings(this);\n\tconst ESoInputDeviceType GamepadDeviceType = (DeviceType == ESoInputDeviceType::Gamepad_PlayStation || DeviceType == ESoInputDeviceType::Gamepad_Switch) ?\n\t\t\t\t\t\t\t\t\t\t\t\t DeviceType : ESoInputDeviceType::Gamepad_Xbox;\n\n\tconst int32 NumButtons = ButtonsArray->NumAllChildren();\n\tfor (int32 Index = 0; Index < NumButtons && Index < GamepadMappingOptions.Num(); Index++)\n\t{\n\t\tUSoUIButtonImage* ButtonImage = Cast<USoUIButtonImage>(ButtonsArray->GetContainerButtonAt(Index));\n\t\tif (!ButtonImage)\n\t\t\tcontinue;\n\n\t\tif (UnboundLineIndices.Contains(Index))\n\t\t{\n\t\t\t// Unbound\n\t\t\tButtonImage->DisableImageMode();\n\t\t}\n\t\telse\n\t\t{\n\t\t\tUTexture2D* Texture = USoGameSingleton::GetIconForInputActionName(GamepadMappingOptions[Index].ActionName, GamepadDeviceType, false);\n\t\t\tButtonImage->SetImageFromTexture(Texture, true);\n\t\t}\n\t\tReceiveOnUpdateGamepadButton(Index, ButtonImage);\n\t}\n}\n"
  },
  {
    "path": "Source/SOrb/UI/Menu/Settings/SoUISettingsControllerRemap.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#pragma once\n\n#include \"CoreMinimal.h\"\n#include \"SoUISettingsBase.h\"\n#include \"UI/General/SoUITypes.h\"\n#include \"Settings/Input/SoInputNames.h\"\n#include \"GameFramework/PlayerInput.h\"\n\n\n#include \"SoUISettingsControllerRemap.generated.h\"\n\nenum class ESoInputDeviceType : uint8;\nclass UPanelWidget;\nclass USoUIInputKeySelectorOverlay;\nclass USoUICommandTooltipArray;\nclass USoGameSettings;\nclass ASoPlayerController;\nclass USoUIButtonArray;\nclass UOverlay;\nclass USoUIButtonImage;\n\n\nUENUM(BlueprintType)\nenum class ESoUISettingsControllerRemapState : uint8\n{\n\tBrowse = 0\t\t\tUMETA(DisplayName = \"Browse\"),\n\tSelectingKey\t\tUMETA(DisplayName = \"SelectingKey\"),\n\tResetAllToDefaults\tUMETA(DisplayName = \"Reset All to defaults\"),\n};\n\n/**\n * Shows the controller input options\n */\nUCLASS()\nclass SORB_API USoUISettingsControllerRemap : public USoUISettingsBase\n{\n\tGENERATED_BODY()\n\nprotected:\n\t//\n\t// UUserWidget Interface\n\t//\n\tvoid SynchronizeProperties() override;\n\tvoid NativeConstruct() override;\n\tvoid NativeDestruct() override;\n\n\t//\n\t// ISoUIEventHandler Interface\n\t//\n\tvoid Open_Implementation(bool bOpen) override;\n\tbool CanBeInterrupted_Implementation() const override;\n\n\t//\n\t// USoUISettingsBase Interface\n\t//\n\tvoid CreateChildrenAndSetTexts(bool bFromSynchronizeProperties = false) override;\n\tbool HandleOnUICommand(ESoUICommand Command) override;\n\tvoid NavigateBackCommand() override;\n\tvoid OnPressedChild(int32 SelectedChild, USoUIUserWidget* SoUserWidget) override;\n\tbool NavigateLeftRightOnSelectedLine(ESoUICommand Command, bool bFromPressedInput = false) override;\n\n\tvoid RefreshButtonImagesTooltips(bool bForceShowAll = false) override;\n\tvoid OnLineChanged(int32 OldLineIndex, int32 NewLineIndex) override;\n\tbool OnPressedButtonTooltipsCommand(ESoUICommand Command) override;\n\n\t//\n\t// Own methods\n\t//\n\n\tvoid OnCommandResetAllToDefaults();\n\n\tUFUNCTION()\n\tvoid HandleKeySelected(const FInputChord& InSelectedKey);\n\n\tUFUNCTION()\n\tvoid HandleIsSelectingKeyChanged(bool bIsSelectingKey);\n\n\tUFUNCTION()\n\tvoid HandleApplySelectedKey(const FInputChord& SelectedKey);\n\n\tUFUNCTION()\n\tvoid OnKeySelectorOverlayOpenChanged(bool bOpen);\n\n\t// Is the SelectedKey valid?\n\tbool IsSelectedKeyValid(const FInputChord& SelectedKey, FText& OutError, FText& OutWarning, bool bNoOutput = false);\n\n\t// Can we edit gamepad buttons\n\tbool UpdateCanEditGamepadButtons();\n\n\t// Creates the input button from the input user settings.\n\tvoid CreateInputButtonsFromUserSettings(int32 SelectLineIndex = INDEX_NONE);\n\n\t// Called at the end of CreateInputButtonsFromUserSettings\n\tUFUNCTION(BlueprintImplementableEvent, Category = UI, meta = (DisplayName = \"OnCreateInputButtonsFromUserSettings\"))\n\tvoid ReceiveOnCreateInputButtonsFromUserSettings();\n\n\t// Change state\n\tvoid SetCurrentState(ESoUISettingsControllerRemapState InCurrentState);\n\n\tUFUNCTION()\n\tvoid HandleDeviceTypeChanged(ESoInputDeviceType InDeviceType);\n\n\tvoid SubscribeToDeviceChanged();\n\tvoid UnSubscribeFromDeviceChanged();\n\n\t// Update images to match the device type\n\tvoid UpdateGamepadButtonsImages();\n\n\tUFUNCTION(BlueprintPure, Category = UI)\n\tbool IsLineUnboundGamepad(int32 LineIndex) const { return UnboundLineIndices.Contains(LineIndex);  }\n\n\tUFUNCTION(BlueprintImplementableEvent, Category = UI, meta = (DisplayName = \"OnUpdateGamepadButton\"))\n\tvoid ReceiveOnUpdateGamepadButton(int32 ButtonIndex, USoUIButtonImage* Button);\n\nprotected:\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\", meta = (BindWidget))\n\tUOverlay* OnlyGamepadOverlay = nullptr;\n\n\t// Widget that selects the key from the user\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\", meta = (BindWidget))\n\tUSoUIInputKeySelectorOverlay* KeySelectorOverlay = nullptr;\n\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\", meta = (BindWidget))\n\tUPanelWidget* ContentContainer;\n\n\t// Tells us which lines have the gamepad key unbound\n\tUPROPERTY(BlueprintReadOnly, Category = \">Runtime\")\n\tTSet<int32> UnboundLineIndices;\n\n\t// Are we browsing, selecting a key, resetting to default\n\tUPROPERTY(BlueprintReadOnly, Category = \">Runtime\")\n\tESoUISettingsControllerRemapState CurrentState = ESoUISettingsControllerRemapState::Browse;\n\n\tUPROPERTY(BlueprintReadOnly, Category = \">Runtime\")\n\tbool bIsListeningToDevicesChanges = false;\n\n\t// Remember our line we are modifying\n\tint32 SelectedKeyLineIndex = INDEX_NONE;\n\n\t// All the configurable input option names\n\t// Maps from selected line => FSoInputConfigurableActionName\n\tUPROPERTY(BlueprintReadOnly, VisibleAnywhere, Category = \">Runtime\")\n\tTArray<FSoInputConfigurableActionName> InputOptions;\n\n\t// All the keyboard mapping options\n\tUPROPERTY(BlueprintReadOnly, VisibleAnywhere, Category = \">Runtime\")\n\tTArray<FInputActionKeyMapping> GamepadMappingOptions;\n\n\tstatic constexpr ESoUICommand UICommand_ResetAllToDefaults = ESoUICommand::EUC_Action0;\n};\n"
  },
  {
    "path": "Source/SOrb/UI/Menu/Settings/SoUISettingsDisplay.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#include \"SoUISettingsDisplay.h\"\n\n#include \"GameFramework/GameUserSettings.h\"\n#include \"Components/TextBlock.h\"\n\n#include \"Basic/Helpers/SoPlatformHelper.h\"\n#include \"Basic/SoGameSingleton.h\"\n#include \"Settings/SoGameSettings.h\"\n\n#include \"UI/General/Buttons/SoUIScrollingButtonArray.h\"\n#include \"UI/General/Buttons/SoUIButtonImageArray.h\"\n#include \"UI/General/SoUISlider.h\"\n#include \"UI/General/SoUICheckbox.h\"\n#include \"Basic/SoAudioManager.h\"\n#include \"../ConfirmPanels/SoUIConfirmDisplaySettings.h\"\n#include \"Localization/SoLocalization.h\"\n\nstatic constexpr int32 FrameLimitUnlimitedOption = INDEX_NONE;\n\nstatic float FrameLimitOptionToFloat(int32 Option)\n{\n\t// Unlimited\n\tif (Option == FrameLimitUnlimitedOption || Option <= 0)\n\t\treturn 9999.f;\n\n\treturn static_cast<float>(Option);\n}\n\nstatic int32 FloatToFrameLimitOption(float InNumber)\n{\n\t// Unlimited\n\tif (InNumber > 1000.f)\n\t\treturn FrameLimitUnlimitedOption;\n\n\tconst int32 FrameLimit =  static_cast<int32>(InNumber);\n\n\t// Return sane default\n\treturn FrameLimit <= 0 ? INDEX_NONE : FrameLimit;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISettingsDisplay::SynchronizeProperties()\n{\n\tSuper::SynchronizeProperties();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISettingsDisplay::NativeConstruct()\n{\n\tSuper::NativeConstruct();\n\tCurrentTooltipText->SetVisibility(ESlateVisibility::Collapsed);\n\n\t// Listen to events\n\tif (ConfirmDisplaySettings)\n\t\tConfirmDisplaySettings->OnOpenChangedEvent().AddDynamic(this, &ThisClass::OnConfirmPanelOpenChanged);\n\n\t// First line\n\tif (DisplayMode)\n\t{\n\t\tDisplayMode->OnSelectedChildChangedEvent().AddLambda([this](int32 PreviousChild, int32 NewChild)\n\t\t{\n\t\t\tif (!bOpened)\n\t\t\t\treturn;\n\n\t\t\tUpdateResolutionLineOptionsFromSelectedOptions();\n\t\t\tOnScrollingArrayChildChanged(PreviousChild, NewChild);\n\t\t});\n\n\t\tDisplayMode->SetSelectedIndex(DisplayModeOptions.Find(EWindowMode::ConvertIntToWindowMode(0)));\n\t}\n\n\tif (AspectRatio)\n\t\tAspectRatio->OnSelectedChildChangedEvent().AddLambda([this](int32 PreviousChild, int32 NewChild)\n\t\t{\n\t\t\tif (!bOpened)\n\t\t\t\treturn;\n\n\t\t\tUpdateResolutionLineOptionsFromSelectedOptions();\n\t\t\tOnScrollingArrayChildChanged(PreviousChild, NewChild);\n\t\t});\n\n\tif (Resolution)\n\t\tResolution->OnSelectedChildChangedEvent().AddUObject(this, &ThisClass::OnScrollingArrayChildChanged);\n\n\t// TODO make it CPP friendly\n\tif (ResolutionScale)\n\t\tResolutionScale->OnValueChangedEvent().AddDynamic(this, &ThisClass::OnResolutionScaleValueChanged);\n\n\tif (FrameLimit)\n\t\tFrameLimit->OnSelectedChildChangedEvent().AddUObject(this, &ThisClass::OnScrollingArrayChildChanged);\n\tif (Shadows)\n\t\tShadows->OnSelectedChildChangedEvent().AddUObject(this, &ThisClass::OnScrollingArrayChildChanged);\n\tif (Textures)\n\t\tTextures->OnSelectedChildChangedEvent().AddUObject(this, &ThisClass::OnScrollingArrayChildChanged);\n\tif (Effects)\n\t\tEffects->OnSelectedChildChangedEvent().AddUObject(this, &ThisClass::OnScrollingArrayChildChanged);\n\tif (PostEffects)\n\t\tPostEffects->OnSelectedChildChangedEvent().AddUObject(this, &ThisClass::OnScrollingArrayChildChanged);\n\tif (Antialiasing)\n\t\tAntialiasing->OnSelectedChildChangedEvent().AddUObject(this, &ThisClass::OnScrollingArrayChildChanged);\n\n\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISettingsDisplay::NativeDestruct()\n{\n\tif (DisplayMode)\n\t\tDisplayMode->OnSelectedChildChangedEvent().RemoveAll(this);\n\tif (AspectRatio)\n\t\tAspectRatio->OnSelectedChildChangedEvent().RemoveAll(this);\n\tif (Resolution)\n\t\tResolution->OnSelectedChildChangedEvent().RemoveAll(this);\n\tif (FrameLimit)\n\t\tFrameLimit->OnSelectedChildChangedEvent().RemoveAll(this);\n\tif (Shadows)\n\t\tShadows->OnSelectedChildChangedEvent().RemoveAll(this);\n\tif (Textures)\n\t\tTextures->OnSelectedChildChangedEvent().RemoveAll(this);\n\tif (Antialiasing)\n\t\tAntialiasing->OnSelectedChildChangedEvent().RemoveAll(this);\n\tif (ResolutionScale)\n\t\tResolutionScale->OnValueChangedEvent().RemoveDynamic(this, &ThisClass::OnResolutionScaleValueChanged);\n\tif (ConfirmDisplaySettings)\n\t\tConfirmDisplaySettings->OnOpenChangedEvent().RemoveDynamic(this, &ThisClass::OnConfirmPanelOpenChanged);\n\n\tSuper::NativeDestruct();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISettingsDisplay::CreateChildrenAndSetTexts(bool bFromSynchronizeProperties)\n{\n\t// Set the texts of the widgets\n\t// TODO check USoPlatformHelper::SupportsWindowedMode()\n\tif (DisplayMode)\n\t{\n\t\tTArray<FText> DisplayModeTexts;\n\t\tfor (const EWindowMode::Type Option : DisplayModeOptions)\n\t\t{\n\t\t\tswitch (Option)\n\t\t\t{\n\t\t\t\tcase EWindowMode::Fullscreen:\n\t\t\t\t\tDisplayModeTexts.Add(FROM_STRING_TABLE_UI(\"settings_fullscreen\"));\n\t\t\t\t\tbreak;\n\t\t\t\tcase EWindowMode::Windowed:\n\t\t\t\t\tDisplayModeTexts.Add(FROM_STRING_TABLE_UI(\"settings_windowed\"));\n\t\t\t\t\tbreak;\n\t\t\t\tcase EWindowMode::WindowedFullscreen:\n\t\t\t\t\tDisplayModeTexts.Add(FROM_STRING_TABLE_UI(\"settings_borderless\"));\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tDisplayModeTexts.Add(FROM_STRING_TABLE_UI(\"settings_unknown\"));\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tDisplayMode->CreateButtons(DisplayModeTexts);\n\t}\n\n\tif (AspectRatio)\n\t{\n\t\tTArray<FText> AspectRatioTexts;\n\t\tfor (const ESoDisplayAspectRatio Option : AspectRatioOptions)\n\t\t{\n\t\t\tswitch (Option)\n\t\t\t{\n\t\t\t\tcase ESoDisplayAspectRatio::Ratio_4_3:\n\t\t\t\t\tAspectRatioTexts.Add(FROM_STRING_TABLE_UI(\"settings_ratio_4_3\"));\n\t\t\t\t\tbreak;\n\t\t\t\tcase ESoDisplayAspectRatio::Ratio_16_10:\n\t\t\t\t\tAspectRatioTexts.Add(FROM_STRING_TABLE_UI(\"settings_ratio_16_10\"));\n\t\t\t\t\tbreak;\n\t\t\t\tcase ESoDisplayAspectRatio::Ratio_16_9:\n\t\t\t\t\tAspectRatioTexts.Add(FROM_STRING_TABLE_UI(\"settings_ratio_16_9\"));\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tAspectRatioTexts.Add(FROM_STRING_TABLE_UI(\"settings_unknown\"));\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tAspectRatio->CreateButtons(AspectRatioTexts);\n\t}\n\n\tconst TArray<FText> GeneralEpicSettingsTexts = GetTextsForQualityOptions(GeneralQualityOptions);\n\tconst TArray<FText> LimitedMediumEpicSettingsTexts = GetTextsForQualityOptions(LimitedMediumQualityOptions);\n\tconst TArray<FText> LimitedHighEpicSettingsTexts = GetTextsForQualityOptions(LimitedHighQualityOptions);\n\tif (Shadows)\n\t\tShadows->CreateButtons(GeneralEpicSettingsTexts);\n\n\tif (Textures)\n\t\tTextures->CreateButtons(GeneralEpicSettingsTexts);\n\n\tif (Effects)\n\t\tEffects->CreateButtons(LimitedMediumEpicSettingsTexts);\n\n\tif (PostEffects)\n\t\tPostEffects->CreateButtons(GeneralEpicSettingsTexts);\n\n\tif (Antialiasing)\n\t\tAntialiasing->CreateButtons(GeneralEpicSettingsTexts);\n\n\t// Set the Lines order and text\n\tEmptyLinesAndTitles();\n\tfor (const ESoUISettingsDisplayLine Option : LineOptions)\n\t{\n\t\tswitch (Option)\n\t\t{\n\t\t\tcase ESoUISettingsDisplayLine::DisplayMode:\n\t\t\t\tAddLineWithText(DisplayMode, FROM_STRING_TABLE_UI(\"settings_display_mode\"));\n\t\t\t\tbreak;\n\t\t\tcase ESoUISettingsDisplayLine::AspectRatio:\n\t\t\t\tAddLineWithText(AspectRatio, FROM_STRING_TABLE_UI(\"settings_aspect_ratio\"));\n\t\t\t\tbreak;\n\t\t\tcase ESoUISettingsDisplayLine::Resolution:\n\t\t\t\tAddLineWithText(Resolution, FROM_STRING_TABLE_UI(\"settings_resolution\"));\n\t\t\t\tbreak;\n\t\t\tcase ESoUISettingsDisplayLine::ResolutionScale:\n\t\t\t\tAddLineWithText(ResolutionScale, FROM_STRING_TABLE_UI(\"settings_resolution_scale\"));\n\t\t\t\tbreak;\n\t\t\tcase ESoUISettingsDisplayLine::VSync:\n\t\t\t\tAddLineWithText(VSync, FROM_STRING_TABLE_UI(\"settings_vsync\"));\n\t\t\t\tbreak;\n\t\t\tcase ESoUISettingsDisplayLine::FrameLimit:\n\t\t\t\tAddLineWithText(FrameLimit, FROM_STRING_TABLE_UI(\"settings_frame_limit\"));\n\t\t\t\tbreak;\n\t\t\tcase ESoUISettingsDisplayLine::Shadows:\n\t\t\t\tAddLineWithText(Shadows, FROM_STRING_TABLE_UI(\"settings_shadows\"));\n\t\t\t\tbreak;\n\t\t\tcase ESoUISettingsDisplayLine::Textures:\n\t\t\t\tAddLineWithText(Textures, FROM_STRING_TABLE_UI(\"settings_textures\"));\n\t\t\t\tbreak;\n\t\t\tcase ESoUISettingsDisplayLine::Effects:\n\t\t\t\tAddLineWithText(Effects, FROM_STRING_TABLE_UI(\"settings_effects\"));\n\t\t\t\tbreak;\n\t\t\tcase ESoUISettingsDisplayLine::PostEffects:\n\t\t\t\tAddLineWithText(PostEffects, FROM_STRING_TABLE_UI(\"settings_post_effects\"));\n\t\t\t\tbreak;\n\t\t\tcase ESoUISettingsDisplayLine::AntiAliasing:\n\t\t\t\tAddLineWithText(Antialiasing, FROM_STRING_TABLE_UI(\"settings_antialising\"));\n\t\t\t\tbreak;\n\t\t\tcase ESoUISettingsDisplayLine::VolumetricFog:\n\t\t\t\tAddLineWithText(VolumetricFog, FROM_STRING_TABLE_UI(\"settings_volumetric_fog\"));\n\t\t\t\tbreak;\n\n\t\t\tcase ESoUISettingsDisplayLine::ForceWeakHardwareOptimization:\n\t\t\t\tAddLineWithText(ForceWeakHardwareOptimization, FROM_STRING_TABLE_UI(\"settings_force_weak_hardware_opt\"));\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tcheckNoEntry();\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\tif (LineOptions.Num() != NumLines())\n\t\tUE_LOG(LogSoUISettings, Error, TEXT(\"Display CreateChildrenAndSetTexts: LineOptions.Num(%d) != NumLines(%d)\"), LineOptions.Num(), NumLines());\n\n\tSuper::CreateChildrenAndSetTexts(bFromSynchronizeProperties);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nTArray<FText> USoUISettingsDisplay::GetTextsForQualityOptions(const TArray<ESoUISettingsEpicQualityOption>& InQualityOptions)\n{\n\tTArray<FText> Texts;\n\tfor (const ESoUISettingsEpicQualityOption Option : InQualityOptions)\n\t{\n\t\tswitch (Option)\n\t\t{\n\t\t\tcase ESoUISettingsEpicQualityOption::Low:\n\t\t\t\tTexts.Add(FROM_STRING_TABLE_UI(\"settings_quality_low\"));\n\t\t\t\tbreak;\n\t\t\tcase ESoUISettingsEpicQualityOption::Medium:\n\t\t\t\tTexts.Add(FROM_STRING_TABLE_UI(\"settings_quality_medium\"));\n\t\t\t\tbreak;\n\t\t\tcase ESoUISettingsEpicQualityOption::High:\n\t\t\t\tTexts.Add(FROM_STRING_TABLE_UI(\"settings_quality_high\"));\n\t\t\t\tbreak;\n\t\t\tcase ESoUISettingsEpicQualityOption::Epic:\n\t\t\t\tTexts.Add(FROM_STRING_TABLE_UI(\"settings_quality_epic\"));\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tTexts.Add(FROM_STRING_TABLE_UI(\"settings_unknown\"));\n\t\t\t\tbreak;\n\t\t}\n\t}\n\treturn Texts;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISettingsDisplay::Open_Implementation(bool bOpen)\n{\n\tSuper::Open_Implementation(bOpen);\n\n\tif (bOpened)\n\t\t// Reset value from the system\n\t\tResetSelectedOptionsToUserSettings();\n\telse\n\t\t// Simulate reset buttons pressed on window closed;\n\t\tOnCommandResetSettings();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoUISettingsDisplay::HandleOnUICommand(ESoUICommand Command)\n{\n\tif (IsConfirmMode())\n\t{\n\t\t// Handle in confirm panel\n\t\tISoUIEventHandler::Execute_OnUICommand(ConfirmDisplaySettings, Command);\n\t\treturn true;\n\t}\n\n\tif (Super::HandleOnUICommand(Command))\n\t\treturn true;\n\n\treturn OnPressedButtonTooltipsCommand(Command);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISettingsDisplay::OnPressedChild(int32 SelectedChild, USoUIUserWidget* SoUserWidget)\n{\n\tSuper::OnPressedChild(SelectedChild, SoUserWidget);\n\tUpdateLinesVisibility();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoUISettingsDisplay::NavigateLeftRightOnSelectedLine(ESoUICommand Command, bool bFromPressedInput)\n{\n\tif (!Super::NavigateLeftRightOnSelectedLine(Command, bFromPressedInput))\n\t\treturn false;\n\n\t// Handled in super, I hope\n\tif (IsOnButtonTooltips())\n\t\treturn true;\n\n\treturn true;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISettingsDisplay::OnPostSetSelectedIndex(int32 OldIndex, int32 NewIndex)\n{\n\tSuper::OnPostSetSelectedIndex(OldIndex, NewIndex);\n\n\t// Set line tooltips\n\tconst int32 SelectedLineIndex = GetSelectedLineIndex();\n\tif (LineOptions.IsValidIndex(SelectedLineIndex))\n\t{\n\t\tconst ESoUISettingsDisplayLine CurrentType = LineOptions[SelectedLineIndex];\n\t\tif (LinesTooltips.Contains(CurrentType))\n\t\t{\n\t\t\tCurrentTooltipText->SetVisibility(ESlateVisibility::Visible);\n\t\t\tCurrentTooltipText->SetText(LinesTooltips[CurrentType]);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tCurrentTooltipText->SetVisibility(ESlateVisibility::Collapsed);\n\t\t}\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISettingsDisplay::RefreshButtonImagesTooltips(bool bForceShowAll)\n{\n\tif (!ButtonImagesTooltipsArray)\n\t\treturn;\n\n\tTArray<FSoUITextCommandPair> CommandsToBeDisplayed;\n\tif (bForceShowAll || DidDefaultSettingsChange())\n\t{\n\t\tCommandsToBeDisplayed.Add({ UICommand_ApplySettings, FROM_STRING_TABLE_UI(\"settings_apply\") });\n\t\tCommandsToBeDisplayed.Add({ UICommand_ResetSettings, FROM_STRING_TABLE_UI(\"settings_reset\") });\n\t}\n\n\tButtonImagesTooltipsArray->UpdateEnsureOnlyTheseCommandsExist(CommandsToBeDisplayed);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoUISettingsDisplay::OnPressedButtonTooltipsCommand(ESoUICommand Command)\n{\n\tSuper::OnPressedButtonTooltipsCommand(Command);\n\n\tswitch (Command)\n\t{\n\tcase UICommand_ApplySettings:\n\t\tOnCommandApplySettings();\n\t\tbreak;\n\n\tcase UICommand_ResetSettings:\n\t\tOnCommandResetSettings();\n\t\tbreak;\n\n\tdefault:\n\t\treturn false;\n\t}\n\n\treturn true;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISettingsDisplay::OnCommandApplySettings()\n{\n\tif (DidDefaultSettingsChange())\n\t\tUSoAudioManager::PlaySound2D(this, USoGameSingleton::GetSFX(ESoSFX::SettingsApply));\n\n\tApplyUserSettingsFromSelectedOptions();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISettingsDisplay::OnCommandResetSettings()\n{\n\tif (DidDefaultSettingsChange())\n\t\tUSoAudioManager::PlaySound2D(this, USoGameSingleton::GetSFX(ESoSFX::SettingsRestore));\n\n\tResetSelectedOptionsToUserSettings();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nESoUISettingsEpicQualityOption USoUISettingsDisplay::GetEffectsQualityOption() const\n{\n\tif (!Effects)\n\t\treturn ESoUISettingsEpicQualityOption::Num;\n\n\tconst int32 SelectedElementIndex = Effects->GetSelectedIndex();\n\tif (LimitedMediumQualityOptions.IsValidIndex(SelectedElementIndex))\n\t{\n\t\treturn LimitedMediumQualityOptions[SelectedElementIndex];;\n\t}\n\n\treturn ESoUISettingsEpicQualityOption::Num;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nESoUISettingsEpicQualityOption USoUISettingsDisplay::GetShadowQualityOption() const\n{\n\tif (!Shadows)\n\t\treturn ESoUISettingsEpicQualityOption::Num;\n\n\tconst int32 SelectedElementIndex = Shadows->GetSelectedIndex();\n\tif (GeneralQualityOptions.IsValidIndex(SelectedElementIndex))\n\t{\n\t\treturn GeneralQualityOptions[SelectedElementIndex];\n\t}\n\n\treturn ESoUISettingsEpicQualityOption::Num;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISettingsDisplay::ApplyUserSettingsFromSelectedOptions()\n{\n\tif (IsConfirmMode())\n\t\treturn;\n\n\tbool bOpenConfirmPanel = false;\n\tif (DisplayMode)\n\t{\n\t\tconst int32 SelectedElementIndex = DisplayMode->GetSelectedIndex();\n\t\tif (DisplayModeOptions.IsValidIndex(SelectedElementIndex))\n\t\t{\n\t\t\tconst EWindowMode::Type SelectedDisplayMode = DisplayModeOptions[SelectedElementIndex];\n\t\t\tbOpenConfirmPanel = UserSettings->GetLastConfirmedFullscreenMode() != SelectedDisplayMode;\n\n\t\t\t// For Borderless, enforce native screen resolution from the main desktop monitor.\n\t\t\t// Will be automatically enforced in UpdateResolutionQuality();\n\t\t\tUserSettings->SetFullscreenMode(SelectedDisplayMode);\n\t\t}\n\t}\n\n\tif (AspectRatio)\n\t{\n\t\t//const int32 SelectedElementIndex = AspectRatio->GetSelectedIndex();\n\t}\n\n\tif (Resolution)\n\t{\n\t\tconst int32 SelectedElementIndex = Resolution->GetSelectedIndex();\n\t\tif (ResolutionOptions.IsValidIndex(SelectedElementIndex))\n\t\t{\n\t\t\tconst FSoDisplayResolution SelectedResolution = ResolutionOptions[SelectedElementIndex];\n\t\t\tbOpenConfirmPanel = bOpenConfirmPanel ||\n\t\t\t\tSelectedResolution.Resolution != UserSettings->GetLastConfirmedScreenResolution();\n\n\t\t\tUserSettings->SetScreenResolution(SelectedResolution.Resolution);\n\t\t}\n\n\t\t// RequestResolutionChange is called in ApplySettings bellow\n\t}\n\n\tif (ResolutionScale)\n\t{\n\t\t// Can be affected by other options\n\t\tif (bResolutionScaleChanged)\n\t\t{\n\t\t\tUserSettings->SetScreenPercentageNormalized(ResolutionScale->GetValueNormalized());\n\t\t}\n\t}\n\n\tif (VSync)\n\t{\n\t\t// Note won't work in Editor env as it trips up the GPU profiler. This is set in Config/BaseEngine.ini (inside the editor folder)\n\t\t// Besides r.VSync there is also r.VSyncEditor, both are false by default\n#if PLATFORM_XBOXONE\n\t\tUserSettings->SetVSyncEnabled(true);\n#else\n\t\tUserSettings->SetVSyncEnabled(VSync->IsChecked());\n#endif\n\t}\n\n\tif (FrameLimit)\n\t{\n\t\t// Disabled by default\n\t\tfloat FrameLimitRate = 0.f;\n\n\t\t// Only set frame limit when VSync is not enabled\n\t\tif (!UserSettings->IsVSyncEnabled())\n\t\t{\n\t\t\tconst int32 SelectedElementIndex = FrameLimit->GetSelectedIndex();\n\t\t\tif (FrameLimitOptions.IsValidIndex(SelectedElementIndex))\n\t\t\t{\n\t\t\t\tconst int32 LimitOption = FrameLimitOptions[SelectedElementIndex];\n\t\t\t\tFrameLimitRate = FrameLimitOptionToFloat(LimitOption);\n\t\t\t}\n\t\t}\n\t\tUserSettings->SetFrameRateLimit(FrameLimitRate);\n\t}\n\n\tif (Shadows)\n\t{\n\t\tconst ESoUISettingsEpicQualityOption Quality = GetShadowQualityOption();\n\t\tif (Quality != ESoUISettingsEpicQualityOption::Num)\n\t\t{\n\t\t\tUserSettings->SetShadowQuality(static_cast<int32>(Quality));\n\t\t}\n\t}\n\n\tif (Textures)\n\t{\n\t\tconst int32 SelectedElementIndex = Textures->GetSelectedIndex();\n\t\tif (GeneralQualityOptions.IsValidIndex(SelectedElementIndex))\n\t\t{\n\t\t\tconst ESoUISettingsEpicQualityOption Quality = GeneralQualityOptions[SelectedElementIndex];\n\t\t\tUserSettings->SetTextureQuality(static_cast<int32>(Quality));\n\t\t}\n\t}\n\n\tif (Effects)\n\t{\n\t\tconst ESoUISettingsEpicQualityOption Quality = GetEffectsQualityOption();\n\t\tif (Quality != ESoUISettingsEpicQualityOption::Num)\n\t\t{\n\t\t\tUserSettings->SetVisualEffectQuality(static_cast<int32>(Quality));\n\t\t}\n\t}\n\n\tif (PostEffects)\n\t{\n\t\tconst int32 SelectedElementIndex = PostEffects->GetSelectedIndex();\n\t\tif (GeneralQualityOptions.IsValidIndex(SelectedElementIndex))\n\t\t{\n\t\t\tconst ESoUISettingsEpicQualityOption Quality = GeneralQualityOptions[SelectedElementIndex];\n\t\t\tUserSettings->SetPostProcessingQuality(static_cast<int32>(Quality));\n\t\t}\n\t}\n\n\tif (Antialiasing)\n\t{\n\t\tconst int32 SelectedElementIndex = Antialiasing->GetSelectedIndex();\n\t\tif (GeneralQualityOptions.IsValidIndex(SelectedElementIndex))\n\t\t{\n\t\t\tconst ESoUISettingsEpicQualityOption Quality = GeneralQualityOptions[SelectedElementIndex];\n\t\t\tUserSettings->SetAntiAliasingQuality(static_cast<int32>(Quality));\n\t\t}\n\t}\n\n\tif (VolumetricFog)\n\t{\n\t\tUserSettings->SetVolumetricFogEnabled(VolumetricFog->IsChecked());\n\t}\n\n\tif (ForceWeakHardwareOptimization)\n\t{\n\t\tUserSettings->SetForceWeakHardwareOptimization(ForceWeakHardwareOptimization->IsChecked());\n\t}\n\n\tif (bOpenConfirmPanel)\n\t{\n\t\t// Display overlay and let the timer tick\n\t\t// NOTE: We only need to preview the settings here\n\t\tUserSettings->PreviewVideoModeSettings();\n\t\tOpenConfirmPanel();\n\t}\n\telse\n\t{\n\t\t// Refresh the selected options after applying\n\t\tUserSettings->ApplyDisplaySettings(true);\n\t\tResetSelectedOptionsToUserSettings();\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISettingsDisplay::ResetSelectedOptionsToUserSettings()\n{\n\t// Try to reset to the current settings, if the user settings were dirty (user settings did not match live settings)\n\t// this will  (try) fix that. Settings get dirty because the user sets them in the command line, console, etc.\n\t// NOTE: that if the user sets some options by some other priority (console or command line override)\n\t// changes in the UI will not applied as this has lower priority. See https://docs.unrealengine.com/latest/INT/Programming/Development/Tools/ConsoleManager/\n\t// NOTE: In some cases like in an Editor env some settings like VSync will be always false or true\n\t// Depending if they set r.VSync in the Engine.ini (SystemSettings section).\n\tUserSettings->ResetToCurrentSettings();\n\n\t// Update lines\n\tUpdateLinesFromUserSettings();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISettingsDisplay::UpdateLinesVisibility()\n{\n\tif (!DisplayMode)\n\t\treturn;\n\n\t// From the User settings\n\tEWindowMode::Type WindowDisplayMode = UserSettings->GetFullscreenMode();\n\tif (DisplayMode)\n\t{\n\t\t// From the displayed  options\n\t\tconst int32 SelectedElementIndex = DisplayMode->GetSelectedIndex();\n\t\tif (DisplayModeOptions.IsValidIndex(SelectedElementIndex))\n\t\t\tWindowDisplayMode = DisplayModeOptions[SelectedElementIndex];\n\t}\n\n\t// Consoles usually have fixed resolution\n\tconst bool bHasFixedResolution = USoPlatformHelper::HasFixedResolution();\n\tconst bool bIsBorderless = WindowDisplayMode == EWindowMode::WindowedFullscreen;\n\tif (AspectRatio)\n\t\tAspectRatio->SetIsEnabled(!bIsBorderless && !bHasFixedResolution);\n\tif (Resolution)\n\t\tResolution->SetIsEnabled(!bIsBorderless && !bHasFixedResolution);\n\n\t// Only enable it if shadow quality is high or epic\n\tif (VolumetricFog)\n\t\tVolumetricFog->SetIsEnabled(static_cast<int32>(GetShadowQualityOption()) >= 2);\n\n\t// Consoles usually have fixed VSync\n\tif (VSync)\n\t{\n\t\tconst bool bHasFixedVSync = USoPlatformHelper::HasFixedVSync();\n\t\tVSync->SetIsEnabled(!bHasFixedVSync);\n\n\t\tconst bool bIsVSync = VSync->IsChecked();\n\t\tif (FrameLimit)\n\t\t\tFrameLimit->SetIsEnabled(!bIsVSync);\n\t}\n\n\t// True on some consoles\n\tconst bool bHasFixedWeakHardware = USoPlatformHelper::HasFixedWeakHardware();\n\tif (ForceWeakHardwareOptimization)\n\t\tForceWeakHardwareOptimization->SetIsEnabled(!bHasFixedWeakHardware);\n\n\tEmptyAndRefreshButtonImagesTooltips();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISettingsDisplay::UpdateLinesFromUserSettings()\n{\n\tUserSettings->ValidateSettings();\n\n\t// NOTE: we do not check if the ints are valid because if they are not they are simple ignored anyways\n\tconst EWindowMode::Type CurrentWindowMode = UserSettings->GetFullscreenMode();\n\tDisplayMode->SetSelectedIndex(static_cast<int32>(CurrentWindowMode));\n\n\t// Update the resolution options first so what we have to select from something\n\tconst FSoDisplayResolution CurrentResolution(UserSettings->GetScreenResolution());\n\tUpdateResolutionLineOptions(CurrentResolution, CurrentResolution.AspectRatio, CurrentWindowMode, UserSettings->GetDesktopResolution());\n\n\tAspectRatio->SetSelectedIndex(AspectRatioOptions.Find(CurrentResolution.AspectRatio));\n\tUpdateResolutionScaleFromUserSettings();\n\n\tconst bool bIsVSyncEnabled = UserSettings->IsVSyncEnabled();\n\tVSync->SetIsChecked(bIsVSyncEnabled);\n\n\tif (bIsVSyncEnabled)\n\t\tFrameLimit->SetSelectedIndex(INDEX_NONE);\n\telse\n\t\tUpdateFrameLimitFromUserSettings();\n\n\tShadows->SetSelectedIndex(GetIndexForGeneralQuality(UserSettings->GetShadowQuality()));\n\tTextures->SetSelectedIndex(GetIndexForGeneralQuality(UserSettings->GetTextureQuality()));\n\tEffects->SetSelectedIndex(GetIndexForLimitedMediumQuality(UserSettings->GetVisualEffectQuality()));\n\tPostEffects->SetSelectedIndex(GetIndexForGeneralQuality(UserSettings->GetPostProcessingQuality()));\n\tAntialiasing->SetSelectedIndex(GetIndexForGeneralQuality(UserSettings->GetAntiAliasingQuality()));\n\tVolumetricFog->SetIsChecked(UserSettings->IsVolumetricFogEnabled());\n\tForceWeakHardwareOptimization->SetIsChecked(UserSettings->IsWeakHardwareOptimizationForced());\n\n\tReloadDefaultSettings();\n\tUpdateLinesVisibility();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISettingsDisplay::UpdateResolutionLineOptionsFromSelectedOptions()\n{\n\tif (Resolution == nullptr || AspectRatio == nullptr)\n\t\treturn;\n\n\tint32 SelectedAspectRatioIndex;\n\tint32 SelectedDisplayModeIndex;\n\tint32 SelectedResolutionIndex;\n\tif (!AspectRatio->GetSelectedIndexChecked(SelectedAspectRatioIndex))\n\t\treturn;\n\tif (!DisplayMode->GetSelectedIndexChecked(SelectedDisplayModeIndex))\n\t\treturn;\n\tif (!Resolution->GetSelectedIndexChecked(SelectedResolutionIndex))\n\t\treturn;\n\n\tconst FSoDisplayResolution CurrentResolution = ResolutionOptions[SelectedResolutionIndex].Resolution;\n\tconst ESoDisplayAspectRatio CurrentAspectRatio = AspectRatioOptions[SelectedAspectRatioIndex];\n\tconst EWindowMode::Type CurrentDisplayMode = DisplayModeOptions[SelectedDisplayModeIndex];\n\tUpdateResolutionLineOptions(CurrentResolution, CurrentAspectRatio, CurrentDisplayMode, UserSettings->GetDesktopResolution());\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISettingsDisplay::UpdateResolutionLineOptions(const FSoDisplayResolution& CurrentResolution,\n\tESoDisplayAspectRatio CurrentAspectRatio,\n\tEWindowMode::Type CurrentDisplayMode, const FIntPoint& MaxResolutionIntPoint)\n{\n\tif (Resolution == nullptr)\n\t\treturn;\n\n\tconst FSoDisplayResolution MaxResolution(MaxResolutionIntPoint);\n\tif (USoPlatformHelper::HasFixedResolution())\n\t{\n\t\t// Console most likeley fixed resolution and it is the maximum\n\t\tResolutionOptions.Empty();\n\t\tResolutionOptions.Add(MaxResolution);\n\t}\n\telse\n\t{\n\t\t// Desktop?\n\t\t// TODO check UKismetSystemLibrary::GetConvenientWindowedResolutions and\n\t\t// UKismetSystemLibrary::GetSupportedFullscreenResolutions and UGameEngine::DetermineGameWindowResolution\n\t\t// Create display options depending on the aspect ratio\n\n\t\t// Try first to query from the system the supported resolutions.\n\t\tbool bCouldQuerySupportedResolutions = false;\n\t\tTArray<FSoDisplayResolution> SupportedResolutions;\n\n\t\t// On both fullscreen and windowed mode we get both resolutions\n\t\tUSoPlatformHelper::GetSupportedFullscreenResolutions(SupportedResolutions);\n\n\t\t// Try also the windowed options\n\t\tif (CurrentDisplayMode == EWindowMode::Windowed)\n\t\t\tUSoPlatformHelper::GetConvenientWindowedResolutions(SupportedResolutions);\n\n\t\t// Combine preset values from the system with the preset ones.\n\t\tTSet<FSoDisplayResolution> AllResolutions;\n\t\tResolutionOptions.Empty();\n\n\t\t// Populate with the resolutions from the system\n\t\tfor (const FSoDisplayResolution& SupportedResolution : SupportedResolutions)\n\t\t\tif (SupportedResolution.AspectRatio == CurrentAspectRatio)\n\t\t\t\t// Is the correct aspect ratio\n\t\t\t\tAllResolutions.Add(SupportedResolution);\n\n\t\t// Populate with preset values\n\t\tTArray<FSoDisplayResolution> PresetResolutionOptions;\n\t\tswitch (CurrentAspectRatio)\n\t\t{\n\t\t\tcase ESoDisplayAspectRatio::Ratio_4_3:\n\t\t\t\tPresetResolutionOptions = Resolution_4_3_PresetOptions;\n\t\t\t\tbreak;\n\t\t\tcase ESoDisplayAspectRatio::Ratio_16_9:\n\t\t\t\tPresetResolutionOptions = Resolution_16_9_PresetOptions;\n\t\t\t\tbreak;\n\t\t\tcase ESoDisplayAspectRatio::Ratio_16_10:\n\t\t\t\tPresetResolutionOptions = Resolution_16_10_PresetOptions;\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t}\n\n\t\t// Filter out resolution options larger then resolution of our main display\n\t\tfor (const FSoDisplayResolution& ResolutionOption : PresetResolutionOptions)\n\t\t\tif (ResolutionOption <= MaxResolution)\n\t\t\t\tAllResolutions.Add(ResolutionOption);\n\n\t\t// Add CurrentResolution.\n\t\t// Maybe it was overridden by console or command line or config file\n\t\tif (CurrentResolution.AspectRatio == CurrentAspectRatio)\n\t\t\tAllResolutions.Add(CurrentResolution);\n\n\t\t// Resolutions must be unique and sorted.\n\t\tResolutionOptions = AllResolutions.Array();\n\t\tResolutionOptions.Sort([](const FSoDisplayResolution& A, const FSoDisplayResolution& B)\n\t\t{\n\t\t\treturn A < B;\n\t\t});\n\t}\n\n\t// Display the resolution options\n\tTArray<FText> ResolutionTexts;\n\tfor (const FSoDisplayResolution& ResolutionOption : ResolutionOptions)\n\t{\n\t\tFFormatOrderedArguments Arguments;\n\t\tArguments.Add(FText::AsNumber(ResolutionOption.Resolution.X));\n\t\tArguments.Add(FText::AsNumber(ResolutionOption.Resolution.Y));\n\t\tResolutionTexts.Add(FText::Format(FROM_STRING_TABLE_UI(\"settings_resolution_entry\"), Arguments));\n\t}\n\tResolution->CreateButtons(ResolutionTexts);\n\n\tif (CurrentAspectRatio != CurrentResolution.AspectRatio)\n\t{\n\t\t// Different aspect ratio\n\t\t// Highest possible\n\t\tResolution->SetSelectedIndex(ResolutionOptions.Num() - 1);\n\t}\n\telse\n\t{\n\t\t// Same aspect ratio\n\t\tResolution->SetSelectedIndex(ResolutionOptions.Find(CurrentResolution));\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISettingsDisplay::UpdateFrameLimitFromUserSettings()\n{\n\tif (FrameLimit == nullptr)\n\t\treturn;\n\n\t// Apply preset options\n\tTSet<int32> AllFrameLimits(FrameLimit_PresetOptions);\n\n\t// Add CurrentFrameLimit\n\tconst int32 CurrentFrameLimit = FloatToFrameLimitOption(UserSettings->GetFrameRateLimit());\n\tAllFrameLimits.Add(CurrentFrameLimit);\n\n\t// Add refresh rates that are greater than 60 Hz\n\tTSet<int32> RefreshRates;\n\tUSoPlatformHelper::GetDisplaysRefreshRates(RefreshRates);\n\tfor (const int32 Refresh : RefreshRates)\n\t\tif (Refresh > 60.f)\n\t\t\tAllFrameLimits.Add(Refresh);\n\n\t// Do no include unlimited in sorting as it will be the first we want it to be last\n\tAllFrameLimits.Remove(FrameLimitUnlimitedOption);\n\n\t// Frame limit options must be unique and sorted.\n\tFrameLimitOptions = AllFrameLimits.Array();\n\tFrameLimitOptions.Sort([](const int32 A, const int32 B)\n\t{\n\t\treturn A < B;\n\t});\n\n\t// Unlimited should be last\n\tFrameLimitOptions.Add(FrameLimitUnlimitedOption);\n\n\t// Display the frame limit options\n\tTArray<FText> FrameLimitTexts;\n\tfor (const int32 Option : FrameLimitOptions)\n\t{\n\t\tif (Option == INDEX_NONE)\n\t\t\tFrameLimitTexts.Add(FROM_STRING_TABLE_UI(\"settings_fps_unlimited\"));\n\t\telse\n\t\t\tFrameLimitTexts.Add(FText::AsNumber(Option));\n\t}\n\tFrameLimit->CreateButtons(FrameLimitTexts);\n\n\t// Select the current one\n\tFrameLimit->SetSelectedIndex(FrameLimitOptions.Find(CurrentFrameLimit));\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISettingsDisplay::UpdateResolutionScaleFromUserSettings()\n{\n\tif (!ResolutionScale)\n\t\treturn;\n\n\tfloat CurrentPercentNormalized; // from 0 to 1\n\tfloat CurrentPercentValue;\n\tfloat MinPercentValue;\n\tfloat MaxPercentValue;\n\tUserSettings->GetScreenPercentageInformation(CurrentPercentNormalized, CurrentPercentValue, MinPercentValue, MaxPercentValue);\n\n\tResolutionScale->SetRangeTextDisplayValues(MinPercentValue, MaxPercentValue);\n\tResolutionScale->SetValueNormalized(CurrentPercentNormalized);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISettingsDisplay::ReloadDefaultSettings()\n{\n\tbResolutionScaleChanged = false;\n\tDefaultSettings.Empty();\n\tfor (int32 LineIndex = 0; LineIndex < LineOptions.Num(); LineIndex++)\n\t{\n\t\tif (USoUIButtonArray* ButtonArray = GetButtonArrayAtLineIndex(LineIndex))\n\t\t{\n\t\t\tDefaultSettings.Add(ButtonArray->GetSelectedIndex());\n\t\t}\n\t\telse if (USoUICheckbox* CheckBox = GetCheckboxAtLineIndex(LineIndex))\n\t\t{\n\t\t\tDefaultSettings.Add(CheckBox->IsChecked() ? 1 : 0);\n\t\t}\n\t\telse if (LineOptions[LineIndex] == ESoUISettingsDisplayLine::ResolutionScale)\n\t\t{\n\t\t\tDefaultSettings.Add(FMath::RoundToInt(ResolutionScale->GetValueNormalized() * 100));\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// Default\n\t\t\tDefaultSettings.Add(INDEX_NONE);\n\t\t}\n\t}\n\tcheck(LineOptions.Num() == DefaultSettings.Num());\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoUISettingsDisplay::DidDefaultSettingsChange() const\n{\n\t// Check if anything is different\n\tfor (int32 LineIndex = 0; LineIndex < LineOptions.Num() && LineIndex < DefaultSettings.Num(); LineIndex++)\n\t\tif (DidDefaultSettingChangeForLine(LineIndex))\n\t\t\treturn true;\n\n\treturn false;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoUISettingsDisplay::DidDefaultSettingChangeForLine(int32 LineIndex) const\n{\n\tif (!LineOptions.IsValidIndex(LineIndex))\n\t\treturn false;\n\n\tconst int32 CurrentValue = DefaultSettings[LineIndex];\n\tif (USoUIButtonArray* ButtonArray = GetButtonArrayAtLineIndex(LineIndex))\n\t{\n\t\tif (CurrentValue != ButtonArray->GetSelectedIndex())\n\t\t\treturn true;\n\t}\n\telse if (USoUICheckbox* CheckBox = GetCheckboxAtLineIndex(LineIndex))\n\t{\n\t\tif (CurrentValue != (CheckBox->IsChecked() ? 1 : 0))\n\t\t\treturn true;\n\t}\n\telse if (USoUISlider* Slider = GetSliderAtLineIndex(LineIndex))\n\t{\n\t\tif (CurrentValue != FMath::RoundToInt(Slider->GetValueNormalized() * 100))\n\t\t\treturn true;\n\t}\n\n\treturn false;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nint32 USoUISettingsDisplay::GetDefaultSettingForLine(int32 LineIndex) const\n{\n\tif (!LineOptions.IsValidIndex(LineIndex))\n\t\treturn INDEX_NONE;\n\n\treturn DefaultSettings[LineIndex];\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISettingsDisplay::OnDisplayModeOrResolutionChanged()\n{\n\tauto SetEnabledDisplayLines = [this](const bool bEnable)\n\t{\n\t\t// NOTE order of LineOptions and Lines Matches\n\t\tfor (int32 OptionIndex = 0; OptionIndex < LineOptions.Num(); OptionIndex++)\n\t\t{\n\t\t\t//const ESoUISettingsDisplayLine Option = LineOptions[OptionIndex];\n\t\t\tSetIsLineEnabled(OptionIndex, bEnable);\n\t\t}\n\t};\n\n\tSetEnabledDisplayLines(!IsConfirmMode());\n\tEmptyAndRefreshButtonImagesTooltips();\n\n\t// Call BP\n\tReceiveOnDisplayModeOrResolutionChanged();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISettingsDisplay::OnResolutionScaleValueChanged(float NewValueNormalized)\n{\n\tif (!bOpened)\n\t\treturn;\n\n\tbResolutionScaleChanged = true;\n\tRefreshButtonImagesTooltips();\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISettingsDisplay::OnScrollingArrayChildChanged(int32 PreviousChild, int32 NewChild)\n{\n\tif (!bOpened)\n\t\treturn;\n\n\tUpdateLinesVisibility();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoUISettingsDisplay::IsConfirmMode() const\n{\n\treturn ::IsValid(ConfirmDisplaySettings) && ConfirmDisplaySettings->CanHandleUICommand();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoUISettingsDisplay::OpenConfirmPanel()\n{\n\tif (!ConfirmDisplaySettings)\n\t\treturn false;\n\n\tISoUIEventHandler::Execute_Open(ConfirmDisplaySettings, true);\n\treturn true;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISettingsDisplay::OnConfirmPanelOpenChanged(bool bPanelOpened)\n{\n\tOnDisplayModeOrResolutionChanged();\n\n\t// Handled\n\tif (bPanelOpened)\n\t{\n\t\tButtonImagesTooltipsArray->Hide();\n\t}\n\telse\n\t{\n\t\tButtonImagesTooltipsArray->Show();\n\t\tResetSelectedOptionsToUserSettings();\n\t}\n}\n"
  },
  {
    "path": "Source/SOrb/UI/Menu/Settings/SoUISettingsDisplay.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#pragma once\n\n#include \"CoreMinimal.h\"\n\n#include \"SoUISettingsBase.h\"\n#include \"Settings/SoDisplaySettingsTypes.h\"\n\n#include \"SoUISettingsDisplay.generated.h\"\n\nclass USoUIButtonArray;\nclass USoUIScrollingButtonArray;\nclass USoUICheckbox;\nclass USoUISlider;\nclass UTextBlock;\nclass USoUICommandTooltipArray;\nclass USoUIConfirmDisplaySettings;\n\n// All the line options for the USoUISettingsDisplay\nUENUM(BlueprintType)\nenum class ESoUISettingsDisplayLine : uint8\n{\n\tNone = 0,\n\n\tDisplayMode,\n\tAspectRatio,\n\tResolution,\n\tResolutionScale,\n\tVSync,\n\tFrameLimit,\n\tShadows,\n\tTextures,\n\tEffects,\n\tPostEffects,\n\tAntiAliasing,\n\tVolumetricFog,\n\tForceWeakHardwareOptimization,\n};\n\n\n\n// Enum representing the epic settings\n// 0:low, 1:med, 2:high, 3:epic, 4:cinematic\nenum class ESoUISettingsEpicQualityOption : uint8\n{\n\tLow = 0,\n\tMedium = 1,\n\tHigh = 2,\n\tEpic = 3,\n\t// Cinematic = 4,\n\n\tNum\n};\n\n\n/**\n * Control video/display related settings\n */\nUCLASS()\nclass SORB_API USoUISettingsDisplay : public USoUISettingsBase\n{\n\tGENERATED_BODY()\n\nprotected:\n\t//\n\t// UUserWidget Interface\n\t//\n\tvoid SynchronizeProperties() override;\n\tvoid NativeConstruct() override;\n\tvoid NativeDestruct() override;\n\n\t//\n\t// ISoUIEventHandler Interface\n\t//\n\tvoid Open_Implementation(bool bOpen) override;\n\n\t//\n\t// USoUISettingsBase Interface\n\t//\n\tvoid CreateChildrenAndSetTexts(bool bFromSynchronizeProperties = false) override;\n\tbool HandleOnUICommand(ESoUICommand Command) override;\n\tvoid OnPressedChild(int32 SelectedChild, USoUIUserWidget* SoUserWidget) override;\n\tbool NavigateLeftRightOnSelectedLine(ESoUICommand Command, bool bFromPressedInput = false) override;\n\tbool IsValidLineIndex(int32 LineIndex) const override\n\t{\n\t\treturn Super::IsValidLineIndex(LineIndex) && LineOptions.IsValidIndex(LineIndex);\n\t}\n\tvoid OnPostSetSelectedIndex(int32 OldIndex, int32 NewIndex) override;\n\tvoid RefreshButtonImagesTooltips(bool bForceShowAll = false) override;\n\tbool OnPressedButtonTooltipsCommand(ESoUICommand Command) override;\n\n\t//\n\t// Own methods\n\t//\n\n\t// Gets the array of texts depending on the quality options array providedation\n\tstatic TArray<FText> GetTextsForQualityOptions(const TArray<ESoUISettingsEpicQualityOption>& InQualityOptions);\n\n\t// Navigate left or right on the selected line\n\n\t// Apply/Save the user settings from the selected line options.\n\tvoid ApplyUserSettingsFromSelectedOptions();\n\n\t// Reset settings to the system settings and updates selected options to match the user settings one.\n\tvoid ResetSelectedOptionsToUserSettings();\n\n\t// Enable/Disable some lines depending on the options set.\n\tvoid UpdateLinesVisibility();\n\n\t// Updates the lines (of the selected options) with the status from the UserSettings\n\tvoid UpdateLinesFromUserSettings();\n\n\t// Update the resolution lines options from the selected options.\n\t// NOTE that these values may or may not be user settings.\n\tvoid UpdateResolutionLineOptionsFromSelectedOptions();\n\n\t// Updates the Resolution line  options depending on the CurrentAspectRatio and CurrentDisplayMode\n\t// This creates new children for the Resolution line + selects a sane default.\n\tvoid UpdateResolutionLineOptions(const FSoDisplayResolution& CurrentResolution,\n\t\tESoDisplayAspectRatio CurrentAspectRatio,\n\t\tEWindowMode::Type CurrentDisplayMode, const FIntPoint& MaxResolution);\n\n\t// Updates the frame limit options and the frame limit from the use settings\n\tvoid UpdateFrameLimitFromUserSettings();\n\n\t// Updates the resolution scale options and the selected resolution scale from the user settings.\n\tvoid UpdateResolutionScaleFromUserSettings();\n\n\t// Gets a valid index in the GeneralQualityOptions Array\n\tint32 GetIndexForGeneralQuality(int32 Quality) const\n\t{\n\t\treturn GeneralQualityOptions.IsValidIndex(Quality) ? Quality : 0;\n\t}\n\n\t// Gets a valid index in the LimitedHighQualityOptions for the supplied Quality.\n\t// Modulo works here because it remaps Quality 2 -> 0 (index) and 3 -> 1\n\tint32 GetIndexForLimitedHighQuality(int32 Quality) const\n\t{\n\t\treturn Quality % LimitedHighQualityOptions.Num();\n\t}\n\n\t// Gets a valid index in the LimitedMediumQualityOptions for the supplied Quality\n\tint32 GetIndexForLimitedMediumQuality(int32 Quality) const\n\t{\n\t\t// Maps:\n\t\t// 3 -> 2\n\t\t// 2 -> 1\n\t\t// 1 -> 0\n\t\treturn Quality > 0 ? (Quality - 1) % LimitedMediumQualityOptions.Num() : 0;\n\t}\n\n\t// Gets the current value of the Effects options selected\n\t// Returns ESoUISettingsEpicQualityOption::Num is the option is invalid\n\tESoUISettingsEpicQualityOption GetEffectsQualityOption() const;\n\tESoUISettingsEpicQualityOption GetShadowQualityOption() const;\n\n\t// Apply/Reset settings buttons pressed\n\tvoid OnCommandApplySettings();\n\tvoid OnCommandResetSettings();\n\n\t// Resolution/Window Mode changed\n\tUFUNCTION(BlueprintImplementableEvent, BlueprintCosmetic, Category = \">Events\", meta = (DisplayName = \"OnDisplayModeOrResolutionChanged\"))\n\tvoid ReceiveOnDisplayModeOrResolutionChanged();\n\tvoid OnDisplayModeOrResolutionChanged();\n\n\tUFUNCTION()\n\tvoid OnResolutionScaleValueChanged(float NewValueNormalized);\n\n\tUFUNCTION()\n\tvoid OnScrollingArrayChildChanged(int32 PreviousChild, int32 NewChild);\n\n\tbool IsConfirmMode() const;\n\tbool OpenConfirmPanel();\n\n\tUFUNCTION()\n\tvoid OnConfirmPanelOpenChanged(bool bPanelOpened);\n\n\t// Reload the default settings to the current lines options\n\tvoid ReloadDefaultSettings();\n\n\t// Did the default settings change? default is what is displayed currently\n\tbool DidDefaultSettingsChange() const;\n\n\t// Did defaults settings change for this line?\n\tbool DidDefaultSettingChangeForLine(int32 LineIndex) const;\n\n\t// Gets the value of the default setting for this line\n\tint32 GetDefaultSettingForLine(int32 LineIndex) const;\n\tint32 GetDefaultSettingForLine(ESoUISettingsDisplayLine LineType) const\n\t{\n\t\tfor (int32 LineIndex = 0; LineIndex < LineOptions.Num(); LineIndex++)\n\t\t\tif (LineOptions[LineIndex] == LineType)\n\t\t\t\treturn GetDefaultSettingForLine(LineIndex);\n\n\t\treturn INDEX_NONE;\n\t}\n\nprotected:\n\t// Lines:\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\", meta = (BindWidget))\n\tUSoUIScrollingButtonArray* DisplayMode = nullptr;\n\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\", meta = (BindWidget))\n\tUSoUIScrollingButtonArray* AspectRatio = nullptr;\n\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\", meta = (BindWidget))\n\tUSoUIScrollingButtonArray* Resolution = nullptr;\n\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\", meta = (BindWidget))\n\tUSoUISlider* ResolutionScale = nullptr;\n\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\", meta = (BindWidget))\n\tUSoUICheckbox* VSync = nullptr;\n\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\", meta = (BindWidget))\n\tUSoUIScrollingButtonArray* FrameLimit = nullptr;\n\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\", meta = (BindWidget))\n\tUSoUIScrollingButtonArray* Shadows = nullptr;\n\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\", meta = (BindWidget))\n\tUSoUIScrollingButtonArray* Textures = nullptr;\n\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\", meta = (BindWidget))\n\tUSoUIScrollingButtonArray* Effects = nullptr;\n\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\", meta = (BindWidget))\n\tUSoUIScrollingButtonArray* PostEffects = nullptr;\n\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\", meta = (BindWidget))\n\tUSoUIScrollingButtonArray* Antialiasing = nullptr;\n\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\", meta = (BindWidget))\n\tUSoUICheckbox* VolumetricFog = nullptr;\n\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\", meta = (BindWidget))\n\tUSoUICheckbox* ForceWeakHardwareOptimization = nullptr;\n\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\", meta = (BindWidget))\n\tUTextBlock* CurrentTooltipText = nullptr;\n\n\tUPROPERTY(BlueprintReadOnly, Category = \">Widgets\", meta = (BindWidget))\n\tUSoUIConfirmDisplaySettings* ConfirmDisplaySettings;\n\n\t// Set in UMG\n\tUPROPERTY(EditAnywhere, Category = \">Lines\")\n\tTMap<ESoUISettingsDisplayLine, FText> LinesTooltips;\n\n\t// ResolutionScale slider moved/changed\n\tUPROPERTY(BlueprintReadOnly, Category = \">Runtime\")\n\tbool bResolutionScaleChanged = false;\n\n\t// Default Settings, initialized on Menu Open. Used to keep track if any settings changed.\n\t// Map from Line Index => int (can be selected element index, true false, etc depending on the context)\n\tTArray<int32> DefaultSettings;\n\n\t// Options for the different settings.\n\t// We use arrays for ordering because the order might differ from it's enum. Also it makes reordering the options\n\t// very easily, just by changing one of the lines below.\n\t// For Example we might want to change DisplayMode to be: Fullscreen, Windowed, WindowedFullscreen\n\t// Each of the array sizes here should match the number of buttons in the button array.\n\n\t// Map Selected Button Index => EWindowMode::Type. Usually they are one and the same.\n\tconst TArray<EWindowMode::Type> DisplayModeOptions = {\n\t\tEWindowMode::Fullscreen,\n\t\tEWindowMode::WindowedFullscreen,\n\t\tEWindowMode::Windowed\n\t};\n\n\t// Map Selected Button Index => ESoDisplayAspectRatio\n\tconst TArray<ESoDisplayAspectRatio> AspectRatioOptions = {\n\t\tESoDisplayAspectRatio::Ratio_4_3,\n\t\tESoDisplayAspectRatio::Ratio_16_9,\n\t\tESoDisplayAspectRatio::Ratio_16_10\n\t};\n\n\t// All the FrameLimit Preset options\n\tconst TArray<int32> FrameLimit_PresetOptions = {\n\t\t30, 60, 120, 144, 160, 165, 180, 200, 240,\n\t\tINDEX_NONE // unlimited\n\t};\n\n\t// The used frame limit options\n\t// Maps Selected Button Index => frame rate limit\n\tTArray<int32> FrameLimitOptions;\n\n\t// All the 4:3 preset resolution options\n\tconst TArray<FSoDisplayResolution> Resolution_4_3_PresetOptions = {\n\t\tFSoDisplayResolution(1280, 960, ESoDisplayAspectRatio::Ratio_4_3),\n\t\tFSoDisplayResolution(1400, 1050, ESoDisplayAspectRatio::Ratio_4_3),\n\t\tFSoDisplayResolution(1440, 1080, ESoDisplayAspectRatio::Ratio_4_3),\n\t\tFSoDisplayResolution(1600, 1200, ESoDisplayAspectRatio::Ratio_4_3),\n\t\tFSoDisplayResolution(1856, 1392, ESoDisplayAspectRatio::Ratio_4_3)\n\t};\n\n\t// All the 16:9 preset resolution options\n\tconst TArray<FSoDisplayResolution> Resolution_16_9_PresetOptions = {\n\t\tFSoDisplayResolution(1280, 720, ESoDisplayAspectRatio::Ratio_16_9),\n\t\tFSoDisplayResolution(1366, 768, ESoDisplayAspectRatio::Ratio_16_9),\n\t\tFSoDisplayResolution(1600, 900, ESoDisplayAspectRatio::Ratio_16_9),\n\t\tFSoDisplayResolution(1920, 1080, ESoDisplayAspectRatio::Ratio_16_9),\n\t\tFSoDisplayResolution(2560, 1440, ESoDisplayAspectRatio::Ratio_16_9),\n\t\tFSoDisplayResolution(3840, 2160, ESoDisplayAspectRatio::Ratio_16_9)\n\t};\n\n\t// All the 16:10 preset resolution options\n\tconst TArray<FSoDisplayResolution> Resolution_16_10_PresetOptions = {\n\t\tFSoDisplayResolution(1280, 800, ESoDisplayAspectRatio::Ratio_16_10),\n\t\tFSoDisplayResolution(1440, 900, ESoDisplayAspectRatio::Ratio_16_10),\n\t\tFSoDisplayResolution(1680, 1050, ESoDisplayAspectRatio::Ratio_16_10),\n\t\tFSoDisplayResolution(1920, 1200, ESoDisplayAspectRatio::Ratio_16_10),\n\t\tFSoDisplayResolution(2560, 1600, ESoDisplayAspectRatio::Ratio_16_10)\n\t};\n\n\t// The used Resolution Options\n\t// Map Selected Button Index => FSoDisplayResolution\n\tTArray<FSoDisplayResolution> ResolutionOptions;\n\n\t// Map Selected Button Index => ESoUISettingsEpicQualityOptions\n\tconst TArray<ESoUISettingsEpicQualityOption> GeneralQualityOptions = {\n\t\tESoUISettingsEpicQualityOption::Low,\n\t\tESoUISettingsEpicQualityOption::Medium,\n\t\tESoUISettingsEpicQualityOption::High,\n\t\tESoUISettingsEpicQualityOption::Epic\n\t};\n\tconst TArray<ESoUISettingsEpicQualityOption> LimitedMediumQualityOptions = {\n\t\tESoUISettingsEpicQualityOption::Medium,\n\t\tESoUISettingsEpicQualityOption::High,\n\t\tESoUISettingsEpicQualityOption::Epic\n\t};\n\tconst TArray<ESoUISettingsEpicQualityOption> LimitedHighQualityOptions = {\n\t\tESoUISettingsEpicQualityOption::High,\n\t\tESoUISettingsEpicQualityOption::Epic\n\t};\n\n\t// Map Selected Line Index => ESoUISettingsDisplayLine (line type)\n\t// NOTE for this you also need to change the order in the UMG Blueprint Widget of the USoUIButtonArray.\n\tconst TArray<ESoUISettingsDisplayLine> LineOptions = {\n\t\tESoUISettingsDisplayLine::DisplayMode,\n\t\tESoUISettingsDisplayLine::AspectRatio,\n\t\tESoUISettingsDisplayLine::Resolution,\n\t\tESoUISettingsDisplayLine::ResolutionScale,\n\t\tESoUISettingsDisplayLine::VSync,\n\t\tESoUISettingsDisplayLine::FrameLimit,\n\t\tESoUISettingsDisplayLine::Shadows,\n\t\tESoUISettingsDisplayLine::Textures,\n\t\tESoUISettingsDisplayLine::Effects,\n\t\tESoUISettingsDisplayLine::VolumetricFog,\n\t\tESoUISettingsDisplayLine::ForceWeakHardwareOptimization,\n\t\tESoUISettingsDisplayLine::PostEffects,\n\t\tESoUISettingsDisplayLine::AntiAliasing\n\t};\n\n\t// UI shortcuts for pressing apply/reset OR confirm/cancel\n\tstatic constexpr ESoUICommand UICommand_ApplySettings = ESoUICommand::EUC_Action0;\n\tstatic constexpr ESoUICommand UICommand_ResetSettings = ESoUICommand::EUC_Action1;\n};\n"
  },
  {
    "path": "Source/SOrb/UI/Menu/Settings/SoUISettingsGame.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#include \"SoUISettingsGame.h\"\n\n#include \"GameFramework/GameUserSettings.h\"\n#include \"Components/TextBlock.h\"\n\n#include \"Settings/SoGameSettings.h\"\n#include \"Basic/SoGameInstance.h\"\n\n#include \"UI/General/SoUICheckbox.h\"\n#include \"UI/General/Buttons/SoUIButtonArray.h\"\n#include \"UI/General/Buttons/SoUIButtonImageArray.h\"\n#include \"UI/General/Buttons/SoUIScrollingButtonArray.h\"\n#include \"Localization/SoLocalization.h\"\n#include \"Basic/Helpers/SoPlatformHelper.h\"\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISettingsGame::SynchronizeProperties()\n{\n\tSuper::SynchronizeProperties();\n\n\t// We don't need this\n\tif (ButtonImagesTooltipsArray)\n\t\tButtonImagesTooltipsArray->SetVisibility(ESlateVisibility::Collapsed);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISettingsGame::NativeConstruct()\n{\n\tSuper::NativeConstruct();\n\tCurrentTooltipText->SetVisibility(ESlateVisibility::Collapsed);\n\n\t// Listen to events\n\tif (Language)\n\t\tLanguage->OnSelectedChildChangedEvent().AddUObject(this, &ThisClass::OnLanguageChildChanged);\n\n\tif (CharacterSkin)\n\t\tCharacterSkin->OnSelectedChildChangedEvent().AddUObject(this, &ThisClass::OnCharacterSkinChanged);\n\n\tif (GameSpeed)\n\t\tGameSpeed->OnSelectedChildChangedEvent().AddUObject(this, &ThisClass::OnGameSpeedChildChanged);\n\n\tif (MercifulBounceMode)\n\t\tMercifulBounceMode->OnSelectedChildChangedEvent().AddUObject(this, &ThisClass::OnMercifulBounceModeChildChanged);\n\n\tResetSelectedOptionsToUserSettings();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISettingsGame::NativeDestruct()\n{\n\tif (Language)\n\t\tLanguage->OnSelectedChildChangedEvent().RemoveAll(this);\n\n\tif (CharacterSkin)\n\t\tCharacterSkin->OnSelectedChildChangedEvent().RemoveAll(this);\n\n\tif (GameSpeed)\n\t\tGameSpeed->OnSelectedChildChangedEvent().RemoveAll(this);\n\n\tif (MercifulBounceMode)\n\t\tMercifulBounceMode->OnSelectedChildChangedEvent().RemoveAll(this);\n\n\tSuper::NativeDestruct();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISettingsGame::Open_Implementation(bool bOpen)\n{\n\tSuper::Open_Implementation(bOpen);\n\tif (bOpen)\n\t\tResetSelectedOptionsToUserSettings();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISettingsGame::CreateChildrenAndSetTexts(bool bFromSynchronizeProperties)\n{\n\tRefreshLineOptions();\n\tLanguageOptions = USoLocalizationHelper::GetAllConfigurableCultures();\n\n\t// Set the text of the widgets\n\tif (Language)\n\t{\n\t\tTArray<FText> LanguageTexts;\n\t\tfor (ESoSupportedCulture Culture : LanguageOptions)\n\t\t{\n\t\t\tLanguageTexts.Add(USoLocalizationHelper::GetDisplayTextFromSupportedCulture(Culture, true));\n\t\t}\n\n\t\tLanguage->CreateButtons(LanguageTexts);\n\t}\n\n\tif (CharacterSkin)\n\t{\n\t\tTArray<FText> SkinTexts;\n\t\tSkinTexts.Add(FROM_STRING_TABLE_UI(\"character_skin_classic\"));\n\t\tSkinTexts.Add(FROM_STRING_TABLE_UI(\"character_skin_mummy\"));\n\t\tSkinTexts.Add(FROM_STRING_TABLE_UI(\"character_skin_pumpkin\"));\n\t\tCharacterSkin->CreateButtons(SkinTexts);\n\t}\n\n\tif (GameSpeed)\n\t{\n\t\tTArray<FText> GameSpeedTexts;\n\t\tfor (int32 SpeedNormalized : GameSpeedOptions)\n\t\t{\n\t\t\tGameSpeedTexts.Add(\n\t\t\t\tFText::FromString(\n\t\t\t\t\tFString::Printf(TEXT(\"%.2fx\"), FromNormalizedGameSpeed(SpeedNormalized))\n\t\t\t\t)\n\t\t\t);\n\t\t}\n\t\tGameSpeed->CreateButtons(GameSpeedTexts);\n\t}\n\n\tif (MercifulBounceMode)\n\t{\n\t\tTArray<FText> BounceModeTexts;\n\t\tBounceModeTexts.Add(FROM_STRING_TABLE_UI(\"settings_merciful_bounce_never\"));\n\t\tBounceModeTexts.Add(FROM_STRING_TABLE_UI(\"settings_merciful_bounce_on_easy\"));\n\t\tBounceModeTexts.Add(FROM_STRING_TABLE_UI(\"settings_merciful_bounce_always\"));\n\t\tMercifulBounceMode->CreateButtons(BounceModeTexts);\n\t}\n\n\t// Set the Lines order and text\n\tEmptyLinesAndTitles();\n\tfor (const ESoUIGameSettingsLine Option : LineOptions)\n\t{\n\t\tswitch (Option)\n\t\t{\n\t\tcase ESoUIGameSettingsLine::Language:\n\t\t\tAddLineWithText(Language, FROM_STRING_TABLE_UI(\"settings_language\"));\n\t\t\tbreak;\n\n\t\tcase ESoUIGameSettingsLine::CharacterSkin:\n\t\t\tAddLineWithText(CharacterSkin, FROM_STRING_TABLE_UI(\"character_skin_title\"));\n\t\t\tbreak;\n\n\t\tcase ESoUIGameSettingsLine::GameSpeed:\n\t\t\tAddLineWithText(GameSpeed, FROM_STRING_TABLE_UI(\"settings_game_speed\"));\n\t\t\tbreak;\n\n\t\tcase ESoUIGameSettingsLine::MercifulBounceMode:\n\t\t\tAddLineWithText(MercifulBounceMode, FROM_STRING_TABLE_UI(\"settings_merciful_bounce\"));\n\t\t\tbreak;\n\n\t\tcase ESoUIGameSettingsLine::ShowFPS:\n\t\t\tAddLineWithText(DisplayFPS, FROM_STRING_TABLE_UI(\"settings_display_fps\"));\n\t\t\tbreak;\n\n\t\tcase ESoUIGameSettingsLine::ShowTime:\n\t\t\tAddLineWithText(DisplayTime, FROM_STRING_TABLE_UI(\"settings_display_play_time\"));\n\t\t\tbreak;\n\n\t\tcase ESoUIGameSettingsLine::ShowDamageTexts:\n\t\t\tAddLineWithText(DisplayDamageTexts, FROM_STRING_TABLE_UI(\"settings_display_damage\"));\n\t\t\tbreak;\n\n\t\tcase ESoUIGameSettingsLine::ShowEnemyHealthBar:\n\t\t\tAddLineWithText(DisplayEnemyHealth, FROM_STRING_TABLE_UI(\"settings_display_enemy_hp\"));\n\t\t\tbreak;\n\n\t\tcase ESoUIGameSettingsLine::ShowFloatingVOTexts:\n\t\t\tAddLineWithText(DisplayFloatingVOTexts, FROM_STRING_TABLE_UI(\"settings_display_floating_vo\"));\n\t\t\tbreak;\n\n\t\tcase ESoUIGameSettingsLine::PauseGameWhenUnfocused:\n\t\t\tAddLineWithText(PauseGameWhenUnfocused, FROM_STRING_TABLE_UI(\"settings_pause_game_unfocused\"));\n\t\t\tbreak;\n\n\t\tcase ESoUIGameSettingsLine::PauseGameGameOnIdle:\n\t\t\tAddLineWithText(PauseGameWhenIdle, FROM_STRING_TABLE_UI(\"settings_pause_game_idle\"));\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tcheckNoEntry();\n\t\t\tbreak;\n\t\t}\n\t}\n\n\tif (LineOptions.Num() != NumLines())\n\t\tUE_LOG(LogSoUISettings, Error, TEXT(\"Game CreateChildrenAndSetTexts: LineOptions.Num(%d) != NumLines(%d)\"), LineOptions.Num(), NumLines());\n\n\tSuper::CreateChildrenAndSetTexts(bFromSynchronizeProperties);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISettingsGame::OnPressedChild(int32 SelectedChild, USoUIUserWidget* SoUserWidget)\n{\n\tSuper::OnPressedChild(SelectedChild, SoUserWidget);\n\tif (!IsValidLineIndex(SelectedChild))\n\t\treturn;\n\n\tbool bHandled = true;\n\tconst ESoUIGameSettingsLine SelectedLineOption = LineOptions[SelectedChild];\n\tswitch (SelectedLineOption)\n\t{\n\tcase ESoUIGameSettingsLine::ShowFPS:\n\t\tUserSettings->SetDisplayFPSEnabled(DisplayFPS->IsChecked());\n\t\tbreak;\n\n\tcase ESoUIGameSettingsLine::ShowTime:\n\t\tUserSettings->SetDisplayTimeEnabled(DisplayTime->IsChecked());\n\t\tbreak;\n\n\tcase ESoUIGameSettingsLine::ShowDamageTexts:\n\t\tUserSettings->SetDisplayDamageTexts(DisplayDamageTexts->IsChecked());\n\t\tbreak;\n\n\tcase ESoUIGameSettingsLine::ShowEnemyHealthBar:\n\t\tUserSettings->SetDisplayEnemyHealthBar(DisplayEnemyHealth->IsChecked());\n\t\tbreak;\n\n\tcase ESoUIGameSettingsLine::ShowFloatingVOTexts:\n\t\tUserSettings->SetDisplayFloatingVOLines(DisplayFloatingVOTexts->IsChecked());\n\t\tbreak;\n\n\tcase ESoUIGameSettingsLine::PauseGameWhenUnfocused:\n\t\tUserSettings->SetPauseGameWhenUnfocused(PauseGameWhenUnfocused->IsChecked());\n\t\tbreak;\n\n\tcase ESoUIGameSettingsLine::PauseGameGameOnIdle:\n\t\tUserSettings->SetPauseGameOnIdle(PauseGameWhenIdle->IsChecked());\n\t\tbreak;\n\n\tdefault:\n\t\tbHandled = false;\n\t\tbreak;\n\t}\n\n\tif (bHandled)\n\t{\n\t\tUserSettings->ApplyGameSettings(true);\n\t\tResetSelectedOptionsToUserSettings();\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISettingsGame::OnPostSetSelectedIndex(int32 OldIndex, int32 NewIndex)\n{\n\tSuper::OnPostSetSelectedIndex(OldIndex, NewIndex);\n\n\t// Set line tooltips\n\tif (LineOptions.IsValidIndex(GetSelectedLineIndex()))\n\t{\n\t\tconst ESoUIGameSettingsLine CurrentType = LineOptions[GetSelectedLineIndex()];\n\t\tif (LinesTooltips.Contains(CurrentType))\n\t\t{\n\t\t\tCurrentTooltipText->SetVisibility(ESlateVisibility::Visible);\n\t\t\tCurrentTooltipText->SetText(LinesTooltips[CurrentType]);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tCurrentTooltipText->SetVisibility(ESlateVisibility::Collapsed);\n\t\t}\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISettingsGame::UpdateWidgetsVisibilities()\n{\n\tif (CharacterSkin)\n\t{\n\t\tCharacterSkin->SetVisibility(\n\t\t\tLineOptions.Contains(ESoUIGameSettingsLine::CharacterSkin) ?\n\t\t\tESlateVisibility::Visible : ESlateVisibility::Collapsed\n\t\t);\n\t}\n\tif (DisplayFPS)\n\t{\n\t\tDisplayFPS->SetVisibility(\n\t\t\tLineOptions.Contains(ESoUIGameSettingsLine::ShowFPS) ?\n\t\t\tESlateVisibility::Visible : ESlateVisibility::Collapsed\n\t\t);\n\t}\n\tif (PauseGameWhenUnfocused)\n\t{\n\t\tPauseGameWhenUnfocused->SetVisibility(\n\t\t\tLineOptions.Contains(ESoUIGameSettingsLine::PauseGameWhenUnfocused) ?\n\t\t\tESlateVisibility::Visible : ESlateVisibility::Collapsed\n\t\t);\n\t}\n\tif (GameSpeed)\n\t{\n\t\tGameSpeed->SetVisibility(\n\t\t\tLineOptions.Contains(ESoUIGameSettingsLine::GameSpeed) ?\n\t\t\tESlateVisibility::Visible : ESlateVisibility::Collapsed\n\t\t);\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISettingsGame::RefreshLineOptions()\n{\n\tLineOptions = {\n\t\tESoUIGameSettingsLine::Language\n\t};\n\n\tif (!USoPlatformHelper::IsDemo())\n\t\tLineOptions.Add(ESoUIGameSettingsLine::CharacterSkin);\n\n\tLineOptions.Append({\n\t\tESoUIGameSettingsLine::GameSpeed,\n\t\tESoUIGameSettingsLine::MercifulBounceMode\n\t});\n\n\tif (!USoPlatformHelper::IsConsole())\n\t\tLineOptions.Add(ESoUIGameSettingsLine::ShowFPS);\n\n\tLineOptions.Append({\n\t\tESoUIGameSettingsLine::ShowTime,\n\t\tESoUIGameSettingsLine::ShowDamageTexts,\n\t\tESoUIGameSettingsLine::ShowEnemyHealthBar,\n\t\tESoUIGameSettingsLine::ShowFloatingVOTexts\n\t});\n\n\tif (!USoPlatformHelper::IsConsole())\n\t\tLineOptions.Add(ESoUIGameSettingsLine::PauseGameWhenUnfocused);\n\n\tLineOptions.Add(ESoUIGameSettingsLine::PauseGameGameOnIdle);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISettingsGame::ResetSelectedOptionsToUserSettings()\n{\n\tUserSettings->SetBlockConfigSave(true);\n\n\tUserSettings->ResetToCurrentSettings();\n\tUserSettings->ValidateSettings();\n\n\tif (Language)\n\t{\n\t\t// Set the current language\n\t\tconst ESoSupportedCulture CurrentCulture = USoLocalizationHelper::GetCurrentLanguageNameType();\n\t\tconst int32 CurrentCultureIndex = LanguageOptions.Find(CurrentCulture);\n\t\tif (LanguageOptions.IsValidIndex(CurrentCultureIndex))\n\t\t{\n\t\t\tLanguage->SetSelectedIndex(CurrentCultureIndex);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tLanguage->SetSelectedIndex(0);\n\t\t}\n\t}\n\n\tif (CharacterSkin)\n\t\tCharacterSkin->SetSelectedIndex(static_cast<int32>(UserSettings->GetCharacterSkinType()));\n\n\tif (GameSpeed)\n\t\tGameSpeed->SetSelectedIndex(GetIndexOptionForGameSpeed(UserSettings->GetGameSpeed()));\n\n\tif (MercifulBounceMode)\n\t\tMercifulBounceMode->SetSelectedIndex(static_cast<int32>(UserSettings->GetBounceModeType()), false);\n\n\tif (DisplayFPS)\n\t\tDisplayFPS->SetIsChecked(UserSettings->IsDisplayFPSEnabled());\n\n\tif (DisplayTime)\n\t\tDisplayTime->SetIsChecked(UserSettings->IsDisplayTimeEnabled());\n\n\tif (DisplayDamageTexts)\n\t\tDisplayDamageTexts->SetIsChecked(UserSettings->IsDisplayDamageTextsEnabled());\n\n\tif (DisplayFloatingVOTexts)\n\t\tDisplayFloatingVOTexts->SetIsChecked(UserSettings->IsDisplayFloatingVOLinesEnabled());\n\n\tif (PauseGameWhenUnfocused)\n\t\tPauseGameWhenUnfocused->SetIsChecked(UserSettings->CanPauseGameWhenUnfocused());\n\n\tif (PauseGameWhenIdle)\n\t\tPauseGameWhenIdle->SetIsChecked(UserSettings->CanPauseGameOnIdle());\n\n\tif (DisplayEnemyHealth)\n\t\tDisplayEnemyHealth->SetIsChecked(UserSettings->IsDisplayEnemyHealthBarEnabled());\n\n\tUserSettings->SetBlockConfigSave(false);\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISettingsGame::OnLanguageChildChanged(int32 PreviousChild, int32 NewChild)\n{\n\tif (!bOpened)\n\t\treturn;\n\n\tif (!LanguageOptions.IsValidIndex(NewChild))\n\t\treturn;\n\n\tconst ESoSupportedCulture NewLanguage = LanguageOptions[NewChild];\n\tUSoLocalizationHelper::SetCurrentCultureEverywhere(NewLanguage, true);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISettingsGame::OnCharacterSkinChanged(int32 PreviousChild, int32 NewChild)\n{\n\tif (!bOpened)\n\t\treturn;\n\n\tUserSettings->SetCharacterSkinType(static_cast<ESoCharacterSkinType>(NewChild));\n\tUserSettings->ApplyGameSettings(true);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISettingsGame::OnGameSpeedChildChanged(int32 PreviousChild, int32 NewChild)\n{\n\tif (!bOpened)\n\t\treturn;\n\n\tif (!GameSpeedOptions.IsValidIndex(NewChild))\n\t\treturn;\n\n\tconst float NewGameSpeed = FromNormalizedGameSpeed(GameSpeedOptions[NewChild]);\n\tUserSettings->SetGameSpeed(NewGameSpeed);\n\tUserSettings->ApplyGameSettings(true);\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISettingsGame::OnMercifulBounceModeChildChanged(int32 PreviousChild, int32 NewChild)\n{\n\tif (!bOpened)\n\t\treturn;\n\n\tUserSettings->SetBounceModeType(static_cast<ESoBounceModeType>(NewChild));\n\tUserSettings->ApplyGameSettings(true);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nint32 USoUISettingsGame::GetIndexOptionForGameSpeed(float Value) const\n{\n\tconst int32 NormalizedValue = ToNormalizedGameSpeed(Value);\n\n\t// Found Valid Index\n\tconst int32 FoundIndex = GameSpeedOptions.Find(NormalizedValue);\n\tif (GameSpeedOptions.IsValidIndex(FoundIndex))\n\t\treturn FoundIndex;\n\n\t// NOTE: assumes array is sorted\n\t// Get the closest one (lower bound)\n\tfor (int32 Index = 0; Index < GameSpeedOptions.Num(); Index++)\n\t{\n\t\t// It Means the previous value is the correct one\n\t\tif (GameSpeedOptions[Index] > NormalizedValue)\n\t\t\treturn Index > 0 ? Index - 1 : 0;\n\t}\n\n\t// Sane default I guess\n\treturn 0;\n}\n"
  },
  {
    "path": "Source/SOrb/UI/Menu/Settings/SoUISettingsGame.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#pragma once\n\n#include \"CoreMinimal.h\"\n\n#include \"SoUISettingsBase.h\"\n#include \"Localization/SoLocalizationHelper.h\"\n\n#include \"SoUISettingsGame.generated.h\"\n\nclass USoUIButton;\nclass UTextBlock;\nclass USoUIScrollingButtonArray;\n\nUENUM(BlueprintType)\nenum class ESoUIGameSettingsLine : uint8\n{\n\tNone = 0,\n\n\tLanguage,\n\tCharacterSkin,\n\tGameSpeed,\n\tMercifulBounceMode,\n\tShowFPS,\n\tShowTime,\n\tShowDamageTexts,\n\tShowEnemyHealthBar,\n\tShowFloatingVOTexts,\n\tEnableAnalytics, // TODO\n\tPauseGameWhenUnfocused,\n\tPauseGameGameOnIdle,\n\n\tNumOf UMETA(Hidden)\n};\n\n/**\n *\n */\nUCLASS()\nclass SORB_API USoUISettingsGame : public USoUISettingsBase\n{\n\tGENERATED_BODY()\n\nprotected:\n\t//\n\t// UUserWidget Interface\n\t//\n\tvoid SynchronizeProperties() override;\n\tvoid NativeConstruct() override;\n\tvoid NativeDestruct() override;\n\n\t//\n\t// ISoUIEventHandler Interface\n\t//\n\tvoid Open_Implementation(bool bOpen) override;\n\n\t//\n\t// USoUISettingsBase methods\n\t//\n\tvoid CreateChildrenAndSetTexts(bool bFromSynchronizeProperties = false) override;\n\tvoid OnPressedChild(int32 SelectedChild, USoUIUserWidget* SoUserWidget) override;\n\tbool IsValidLineIndex(int32 LineIndex) const override\n\t{\n\t\treturn Super::IsValidLineIndex(LineIndex) && LineOptions.IsValidIndex(LineIndex);\n\t}\n\tvoid OnPostSetSelectedIndex(int32 OldIndex, int32 NewIndex) override;\n\tvoid RefreshButtonImagesTooltips(bool bForceShowAll = false) override {}\n\n\tvoid UpdateWidgetsVisibilities() override;\n\n\t//\n\t// Own methods\n\t//\n\n\tvoid RefreshLineOptions();\n\n\t// Reset settings to the system settings and updates selected options to match the user settings one.\n\tvoid ResetSelectedOptionsToUserSettings();\n\n\tUFUNCTION()\n\tvoid OnLanguageChildChanged(int32 PreviousChild, int32 NewChild);\n\n\tUFUNCTION()\n\tvoid OnCharacterSkinChanged(int32 PreviousChild, int32 NewChild);\n\n\tUFUNCTION()\n\tvoid OnGameSpeedChildChanged(int32 PreviousChild, int32 NewChild);\n\n\tUFUNCTION()\n\tvoid OnMercifulBounceModeChildChanged(int32 PreviousChild, int32 NewChild);\n\n\t//\n\t// GameSpeed methods\n\t//\n\n\t// Normalizes the GameSpeed\n\tstatic int32 ToNormalizedGameSpeed(float Value)\n\t{\n\t\treturn FMath::RoundToInt(Value * 100.f);\n\t}\n\t// Converts back from a normalized speed\n\tstatic float FromNormalizedGameSpeed(int32 Normalized)\n\t{\n\t\treturn static_cast<float>(Normalized) / 100.f;\n\t}\n\n\t// Returns a valid index inside GameSpeedOptions\n\tint32 GetIndexOptionForGameSpeed(float Value) const;\n\nprotected:\n\t// Lines:\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\", meta = (BindWidget))\n\tUSoUIScrollingButtonArray* Language = nullptr;\n\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\", meta = (BindWidget))\n\tUSoUIScrollingButtonArray* CharacterSkin = nullptr;\n\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\", meta = (BindWidget))\n\tUSoUIScrollingButtonArray* GameSpeed = nullptr;\n\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\", meta = (BindWidget))\n\tUSoUIScrollingButtonArray* MercifulBounceMode = nullptr;\n\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\", meta = (BindWidget))\n\tUSoUICheckbox* DisplayFPS = nullptr;\n\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\", meta = (BindWidget))\n\tUSoUICheckbox* DisplayTime = nullptr;\n\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\", meta = (BindWidget))\n\tUSoUICheckbox* DisplayDamageTexts = nullptr;\n\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\", meta = (BindWidget))\n\tUSoUICheckbox* DisplayEnemyHealth = nullptr;\n\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\", meta = (BindWidget))\n\tUSoUICheckbox* DisplayFloatingVOTexts = nullptr;\n\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\", meta = (BindWidget))\n\tUSoUICheckbox* PauseGameWhenUnfocused = nullptr;\n\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\", meta = (BindWidget))\n\tUSoUICheckbox* PauseGameWhenIdle = nullptr;\n\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\", meta = (BindWidget))\n\tUTextBlock* CurrentTooltipText = nullptr;\n\n\t// Set in UMG\n\tUPROPERTY(EditAnywhere, Category = \">Lines\")\n\tTMap<ESoUIGameSettingsLine, FText> LinesTooltips;\n\n\t// Map Selected Line Index => ESoUISettingsControllerLine (line type)\n\t// NOTE for this you also need to change the order in the UMG Blueprint Widget of the USoUIButtonArray.\n\tTArray<ESoUIGameSettingsLine> LineOptions = {\n\t\tESoUIGameSettingsLine::Language,\n\t\tESoUIGameSettingsLine::CharacterSkin,\n\t\tESoUIGameSettingsLine::GameSpeed,\n\t\tESoUIGameSettingsLine::MercifulBounceMode,\n\t\tESoUIGameSettingsLine::ShowFPS,\n\t\tESoUIGameSettingsLine::ShowTime,\n\t\tESoUIGameSettingsLine::ShowDamageTexts,\n\t\tESoUIGameSettingsLine::ShowEnemyHealthBar,\n\t\tESoUIGameSettingsLine::ShowFloatingVOTexts,\n\t\tESoUIGameSettingsLine::PauseGameWhenUnfocused,\n\t\tESoUIGameSettingsLine::PauseGameGameOnIdle,\n\t};\n\n\t// All the Language options\n\tTArray<ESoSupportedCulture> LanguageOptions;\n\n\t// All the game speed options\n\t// Normalized to int which is just float * 100\n\tconst TArray<int32> GameSpeedOptions = {\n\t\t100, // 0 - 1.00f\n\t\t105, // 1 - 1.05f\n\t\t110, // 2 - 1.10f\n\t\t115, // 3 - 1.15f\n\t\t120, // 4 - 1.20f\n\t\t125, // 5 - 1.25f\n\t\t130, // 6 - 1.30f\n\t\t135, // 7 - 1.35f\n\t\t140, // 8 - 1.40f\n\t};\n};\n"
  },
  {
    "path": "Source/SOrb/UI/Menu/Settings/SoUISettingsKeyboard.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#include \"SoUISettingsKeyboard.h\"\n\n#include \"Blueprint/UserWidget.h\"\n#include \"GameFramework/InputSettings.h\"\n#include \"Components/ScrollBox.h\"\n#include \"Components/Overlay.h\"\n\n#include \"Settings/SoGameSettings.h\"\n#include \"Settings/Input/SoInputHelper.h\"\n#include \"Character/SoPlayerController.h\"\n#include \"Basic/SoGameSingleton.h\"\n#include \"Basic/SoAudioManager.h\"\n\n#include \"UI/General/Buttons/SoUIButtonArray.h\"\n#include \"UI/General/Buttons/SoUIButton.h\"\n#include \"UI/General/Buttons/SoUIButtonImageArray.h\"\n#include \"UI/Menu/ConfirmPanels/SoUIConfirmKeyboardSettings.h\"\n#include \"UI/Menu/Settings/KeySelector/SoUIInputKeySelectorOverlay.h\"\n#include \"UI/SoUIHelper.h\"\n#include \"Localization/SoLocalization.h\"\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISettingsKeyboard::SynchronizeProperties()\n{\n\tInputOptions = FSoInputConfigurableActionName::GetAllOptions();\n\tSuper::SynchronizeProperties();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISettingsKeyboard::NativeConstruct()\n{\n\tSuper::NativeConstruct();\n\tSetVisibility(ESlateVisibility::Collapsed);\n\tOnlyKeyboardOverlay->SetVisibility(ESlateVisibility::Collapsed);\n\n\t// Events Hierarchy:\n\t// 1. SSoInputKeySelector\n\t// 2. USoUIInputKeySelector\n\t// 3. USoUIInputKeySelectorOverlay\n\t// 4. Self\n\tif (KeySelectorOverlay)\n\t{\n\t\tKeySelectorOverlay->OnIsSelectedKeyValidEvent() = BIND_UOBJECT_DELEGATE(USoUIInputKeySelectorOverlay::FSoIsSelectedKeyValidEvent, IsSelectedKeyValid);\n\n\t\tKeySelectorOverlay->OnOpenChangedEvent().AddDynamic(this, &ThisClass::OnKeySelectorOverlayOpenChanged);\n\t\tKeySelectorOverlay->OnKeySelectedEvent().AddDynamic(this, &ThisClass::HandleKeySelected);\n\t\tKeySelectorOverlay->OnIsSelectingKeyChangedEvent().AddDynamic(this, &ThisClass::HandleIsSelectingKeyChanged);\n\t\tKeySelectorOverlay->OnApplySelectedKeyEvent().AddDynamic(this, &ThisClass::HandleApplySelectedKey);\n\t}\n\n\t// Listen to events\n\tif (ConfirmKeyboardSettings)\n\t{\n\t\tConfirmKeyboardSettings->OnOpenChangedEvent().AddDynamic(this, &ThisClass::OnConfirmPanelOpenChanged);\n\t}\n\n\tSubscribeToDeviceChanged();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISettingsKeyboard::NativeDestruct()\n{\n\tif (KeySelectorOverlay)\n\t{\n\t\tKeySelectorOverlay->OnKeySelectedEvent().RemoveDynamic(this, &ThisClass::HandleKeySelected);\n\t\tKeySelectorOverlay->OnIsSelectingKeyChangedEvent().RemoveDynamic(this, &ThisClass::HandleIsSelectingKeyChanged);\n\t\tKeySelectorOverlay->OnApplySelectedKeyEvent().RemoveDynamic(this, &ThisClass::HandleApplySelectedKey);\n\t\tKeySelectorOverlay->OnOpenChangedEvent().RemoveDynamic(this, &ThisClass::OnKeySelectorOverlayOpenChanged);\n\n\t}\n\tUnSubscribeFromDeviceChanged();\n\tSuper::NativeDestruct();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISettingsKeyboard::Open_Implementation(bool bOpen)\n{\n\tUserSettings->SetBlockConfigSave(true);\n\n\t// Force refresh\n\tUserSettings->ApplyInputSettings(true);\n\n\t// Reset on open\n\tif (bOpen)\n\t{\n\t\tUpdateCanEditKeyboardKeys();\n\t\tCreateInputButtonsFromUserSettings(0);\n\t}\n\telse\n\t{\n\t\t// Close all the child widgets\n\t\tConfirmPanelClose();\n\t\tKeySelectorOverlay->Close();\n\t}\n\n\tUserSettings->SetBlockConfigSave(false);\n\tSuper::Open_Implementation(bOpen);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoUISettingsKeyboard::CanBeInterrupted_Implementation() const\n{\n\tif (CurrentState == ESoUISettingsKeyboardState::SelectingKey)\n\t\treturn !KeySelectorOverlay->IsSelectingKey();\n\n\treturn true;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISettingsKeyboard::CreateChildrenAndSetTexts(bool bFromSynchronizeProperties)\n{\n\tEmptyLinesAndTitles();\n\n\tTArray<FText> KeyboardButtonTexts;\n\tfor (const FSoInputConfigurableActionName& Option : InputOptions)\n\t{\n\t\tAddTitleText(Option.DisplayText);\n\t\tKeyboardButtonTexts.Add(FROM_STRING_TABLE_UI(\"unknown\"));\n\t}\n\n\tif (USoUIButtonArray* ButtonsArray = GetWidgetsArrayAsButtons())\n\t\tButtonsArray->CreateButtons(KeyboardButtonTexts);\n\n\tSuper::CreateChildrenAndSetTexts(bFromSynchronizeProperties);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoUISettingsKeyboard::OnCommandResetAllToDefaults()\n{\n\tif (CurrentState != ESoUISettingsKeyboardState::ResetAllToDefaults)\n\t\tUSoAudioManager::PlaySound2D(this, USoGameSingleton::GetSFX(ESoSFX::SettingsPressed));\n\n\tOpenConfirmPanel();\n\treturn true;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoUISettingsKeyboard::OnCommandResetKeyToDefault()\n{\n\t// The key is already default\n\tif (IsSelectedActionMappingDefault())\n\t\treturn false;\n\n\tUSoAudioManager::PlaySound2D(this, USoGameSingleton::GetSFX(ESoSFX::SettingsRestore));\n\n\tFInputActionKeyMapping ActionMapping;\n\tif (GetSelectedActionMapping(ActionMapping))\n\t{\n\t\t// This overwrites any existing ones\n\t\tUserSettings->SetInputActionMappingToDefault(ActionMapping, true, true);\n\t\tUserSettings->ApplyInputSettings(true);\n\t}\n\n\t// Keep the selected line\n\tCreateInputButtonsFromUserSettings(GetSelectedLineIndex());\n\treturn true;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoUISettingsKeyboard::HandleOnUICommand(ESoUICommand Command)\n{\n\tif (!UpdateCanEditKeyboardKeys())\n\t{\n\t\t// Close this widget first\n\t\tif (Command == ESoUICommand::EUC_MainMenuBack)\n\t\t\tISoUIEventHandler::Execute_Open(this, false);\n\n\t\treturn true;\n\t}\n\n\t// Forward to the confirm preset panel\n\tif (IsConfirmMode())\n\t\treturn ISoUIEventHandler::Execute_OnUICommand(ConfirmKeyboardSettings, Command);;\n\n\t// Forward commands to the key selector\n\tif (CurrentState == ESoUISettingsKeyboardState::SelectingKey)\n\t\treturn ISoUIEventHandler::Execute_OnUICommand(KeySelectorOverlay, Command);;\n\n\tif (OnPressedButtonTooltipsCommand(Command))\n\t\treturn true;\n\n\t// Handle command in parent\n\treturn Super::HandleOnUICommand(Command);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISettingsKeyboard::OnPressedChild(int32 SelectedChild, USoUIUserWidget* SoUserWidget)\n{\n\t// NOTE: don't call parent\n\n\t// Set the correct action name\n\tif (InputOptions.IsValidIndex(SelectedChild))\n\t\tKeySelectorOverlay->SetActionName(InputOptions[SelectedChild].DisplayText);\n\n\tSetCurrentState(ESoUISettingsKeyboardState::SelectingKey);\n\tUSoAudioManager::PlaySound2D(this, USoGameSingleton::GetSFX(ESoSFX::SettingsValueSwitch));\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISettingsKeyboard::RefreshButtonImagesTooltips(bool bForceShowAll)\n{\n\tif (IsOnButtonTooltips())\n\t\treturn;\n\n\tif (!ButtonImagesTooltipsArray)\n\t\treturn;\n\n\tTArray<FSoUITextCommandPair> CommandsToBeDisplayed;\n\tif (CurrentState != ESoUISettingsKeyboardState::SelectingKey)\n\t{\n\t\t// TODO do we really need this?\n\t\t// Apply/Reset input settings to for all inputs\n\t\t//if (DidSettingsChange())\n\t\t//{\n\t\t\t//CommandTooltips->AddTooltipFromUICommand(FROM_STRING_TABLE_UI(\"input_apply\", \"Apply\"), UICommand_Apply);\n\t\t//}\n\n\t\t// TODO fix glitch because of mouse\n\t\t// if (bForceShowAll || !IsSelectedActionMappingDefault())\n\t\t// CommandsToBeDisplayed.Add({ UICommand_ResetKeyToDefault, FROM_STRING_TABLE_UI(\"settings_reset_input_key\") });\n\n\t\tCommandsToBeDisplayed.Add({ UICommand_ResetKeyToArrows, FROM_STRING_TABLE_UI(\"reset_keyboard_arrows\") });\n\t\tCommandsToBeDisplayed.Add({ UICommand_ResetAllToWASD, FROM_STRING_TABLE_UI(\"reset_keyboard_wasd\") });\n\t}\n\n\tButtonImagesTooltipsArray->UpdateEnsureOnlyTheseCommandsExist(CommandsToBeDisplayed, true);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISettingsKeyboard::OnLineChanged(int32 OldLineIndex, int32 NewLineIndex)\n{\n\t// Activate new button\n\t// do not, because highlight is enough?!\n\t// KeyboardButtons->SetIsActiveOnButton(OldLineIndex, false);\n\t// KeyboardButtons->SetIsActiveOnButton(NewLineIndex, true);\n\tRefreshButtonImagesTooltips();\n\n\t// Scroll into view\n\tif (USoUIButton* Button = TitlesArray->GetContainerButtonAt(NewLineIndex))\n\t{\n\t\tScrollBox->ScrollWidgetIntoView(Button, true, EDescendantScrollDestination::IntoView);\n\t}\n\n\tSuper::OnLineChanged(OldLineIndex, NewLineIndex);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoUISettingsKeyboard::OnPressedButtonTooltipsCommand(ESoUICommand Command)\n{\n\tSuper::OnPressedButtonTooltipsCommand(Command);\n\n\tif (CurrentState == ESoUISettingsKeyboardState::SelectingKey)\n\t{\n\t\t// Forward commands to the key selector, check if we can handle another command\n\t\treturn KeySelectorOverlay->OnPressedButtonTooltipsCommand(Command);;\n\t}\n\n\tswitch (Command)\n\t{\n\t\tcase UICommand_ResetAllToWASD:\n\t\t{\n\t\t\tConfirmKeyboardSettings->SetOpenedForResetToWASD(true);\n\t\t\tOnCommandResetAllToDefaults();\n\t\t\tbreak;\n\t\t}\n\t\tcase UICommand_ResetKeyToArrows:\n\t\t{\n\t\t\tConfirmKeyboardSettings->SetOpenedForResetToWASD(false);\n\t\t\tOnCommandResetAllToDefaults();\n\t\t\tbreak;\n\t\t}\n\n\t\tdefault:\n\t\t\treturn false;\n\t}\n\n\treturn true;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoUISettingsKeyboard::UpdateCanEditKeyboardKeys()\n{\n\t// Stop user from modifying with gamepad\n\tif (SoController->IsLastInputFromGamepad())\n\t{\n\t\tKeySelectorOverlay->Close();\n\t\tContentContainer->SetIsEnabled(false);\n\t\tOnlyKeyboardOverlay->SetVisibility(ESlateVisibility::Visible);\n\t\treturn false;\n\t}\n\n\tOnlyKeyboardOverlay->SetVisibility(ESlateVisibility::Collapsed);\n\tContentContainer->SetIsEnabled(true);\n\treturn true;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISettingsKeyboard::HandleDeviceTypeChanged(ESoInputDeviceType InDeviceType)\n{\n\tif (!bIsListeningToDevicesChanges || !bOpened)\n\t\treturn;\n\n\tUpdateCanEditKeyboardKeys();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISettingsKeyboard::SubscribeToDeviceChanged()\n{\n\tif (bIsListeningToDevicesChanges)\n\t\treturn;\n\n\tif (SoController)\n\t{\n\t\tSoController->OnDeviceTypeChanged().AddDynamic(this, &ThisClass::HandleDeviceTypeChanged);\n\t\tbIsListeningToDevicesChanges = true;\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISettingsKeyboard::UnSubscribeFromDeviceChanged()\n{\n\tif (!bIsListeningToDevicesChanges)\n\t\treturn;\n\n\tif (SoController)\n\t{\n\t\tSoController->OnDeviceTypeChanged().RemoveDynamic(this, &ThisClass::HandleDeviceTypeChanged);\n\t\tbIsListeningToDevicesChanges = false;\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISettingsKeyboard::CreateInputButtonsFromUserSettings(const int32 SelectLineIndex)\n{\n\tUSoUIButtonArray* ButtonsArray = GetWidgetsArrayAsButtons();\n\tif (ButtonsArray == nullptr)\n\t\treturn;\n\n\tUserSettings->RefreshInputSettingsMappings();\n\tUnboundKeyboardKeys.Empty();\n\tKeyboardMappingOptions.Empty();\n\n\tTArray<FText> KeyboardButtonTexts;\n\tfor (int32 Index = 0, Num = InputOptions.Num(); Index < Num; Index++)\n\t{\n\t\tconst FSoInputConfigurableActionName& Option = InputOptions[Index];\n\n\t\t// Query the input settings for this configurable option\n\t\tconst TArray<FInputActionKeyMapping> OptionMappings = UserSettings->GetKeyboardInputActionMappingsForActionName(Option.ActionName, true);\n\n\t\tif (OptionMappings.Num() == 0)\n\t\t{\n\t\t\t// Something is wrong\n\t\t\tKeyboardButtonTexts.Add(FROM_STRING_TABLE_UI(\"unknown\"));\n\t\t\tKeyboardMappingOptions.Add(FInputActionKeyMapping());\n\t\t}\n\t\telse\n\t\t{\n\t\t\tbool bAlreadyAdded = false;\n\t\t\tfor (const FInputActionKeyMapping& KeyMapping : OptionMappings)\n\t\t\t{\n\t\t\t\t// Multiple bindings for the same key?\n\t\t\t\tif (bAlreadyAdded)\n\t\t\t\t{\n\t\t\t\t\tUE_LOG(LogSoUISettings, Warning, TEXT(\"ActionName = %s also has an additional keyboard Key = %s. Ignoring \"), *Option.ActionName.ToString(), *KeyMapping.Key.ToString());\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tif (KeyMapping.Key.IsValid())\n\t\t\t\t{\n\t\t\t\t\tKeyboardButtonTexts.Add(FSoInputKey::GetKeyDisplayName(KeyMapping.Key));\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tUnboundKeyboardKeys.Add(Index);\n\t\t\t\t\tKeyboardButtonTexts.Add(FROM_STRING_TABLE_UI(\"input_unbound\"));\n\t\t\t\t}\n\n\t\t\t\tKeyboardMappingOptions.Add(KeyMapping);\n\t\t\t\tbAlreadyAdded = true;\n\t\t\t}\n\t\t}\n\t}\n\n\tButtonsArray->CreateButtons(KeyboardButtonTexts);\n\tif (InputOptions.Num() != NumLines())\n\t{\n\t\t// Here be dragons\n\t\tUE_LOG(LogSoUISettings,\n\t\t\t   Fatal,\n\t\t\t   TEXT(\"InputOptions.Num(%d) != KeyboardButtons->GetElementNum(%) This would most likely make the input settings not work anymore\"),\n\t\t\t   InputOptions.Num(), NumLines());\n\t}\n\tif (InputOptions.Num() != KeyboardMappingOptions.Num())\n\t{\n\t\t// Here be vampires\n\t\tUE_LOG(LogSoUISettings,\n\t\t\tFatal,\n\t\t\tTEXT(\"InputOptions.Num(%d) != KeyboardMappingOptions.Num(%) This would most likely make the input settings not work anymore\"),\n\t\t\tInputOptions.Num(), KeyboardMappingOptions.Num());\n\t}\n\n\t// Select line\n\tif (SelectLineIndex != INDEX_NONE)\n\t{\n\t\tSetSelectedLineIndex(SelectLineIndex);\n\t}\n\n\t// BP\n\tReceiveOnCreateInputButtonsFromUserSettings();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoUISettingsKeyboard::IsSelectedActionMappingDefault() const\n{\n\tFInputActionKeyMapping ActionMapping;\n\tif (GetSelectedActionMapping(ActionMapping))\n\t\treturn UserSettings->IsInputActionMappingDefault(ActionMapping, true);\n\n\treturn false;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoUISettingsKeyboard::GetSelectedActionMapping(FInputActionKeyMapping& ActionMapping) const\n{\n\tActionMapping = {};\n\tconst int32 SelectedButtonIndex = GetSelectedLineIndex();\n\tif (!KeyboardMappingOptions.IsValidIndex(SelectedButtonIndex))\n\t\treturn false;\n\n\tActionMapping = KeyboardMappingOptions[SelectedButtonIndex];\n\treturn true;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoUISettingsKeyboard::DidSettingsChange() const\n{\n\treturn ChangedKeyboardKeys.Num() > 0;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISettingsKeyboard::HandleIsSelectingKeyChanged(bool bIsSelectingKey)\n{\n\tRefreshButtonImagesTooltips();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISettingsKeyboard::HandleKeySelected(const FInputChord& SelectedKey)\n{\n\tRefreshButtonImagesTooltips();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISettingsKeyboard::HandleApplySelectedKey(const FInputChord& SelectedKey)\n{\n\t// Check here, maybe it escaped us somehow?\n\tFText ErrorMessage, WarningMessage;\n\tif (!IsSelectedKeyValid(SelectedKey, ErrorMessage, WarningMessage))\n\t{\n\t\tUE_LOG(\n\t\t\tLogSoUISettings,\n\t\t\tError,\n\t\t\tTEXT(\"HandleApplySelectedKey: SHOULD NOT HAVE REACHED HERE. ErrorMessage = %s, WarningMessage = %s\"),\n\t\t\t*ErrorMessage.ToString(), *WarningMessage.ToString()\n\t\t);\n\t\treturn;\n\t}\n\n\tconst int32 SelectedButtonIndex = GetSelectedLineIndex();\n\tif (!KeyboardMappingOptions.IsValidIndex(SelectedButtonIndex))\n\t{\n\t\tUE_LOG(LogSoUISettings, Error, TEXT(\"HandleApplySelectedKey: KeyboardMappingOptions does not have selected index = %d\"), SelectedButtonIndex);\n\t\treturn;\n\t}\n\n\t// Try to rebind\n\tconst FInputActionKeyMapping OldKeyMapping = KeyboardMappingOptions[SelectedButtonIndex];\n\tconst FName SelectedActionName = OldKeyMapping.ActionName;\n\tif (UserSettings->RebindInputKeyToInputChord(OldKeyMapping, SelectedKey, true, true))\n\t{\n\t\t// Update UI\n\t\tUserSettings->ApplyInputSettings(true);\n\t\tCreateInputButtonsFromUserSettings(SelectedButtonIndex);\n\t}\n\telse\n\t{\n\t\tUE_LOG(\n\t\t\tLogSoUISettings,\n\t\t\tWarning,\n\t\t\tTEXT(\"HandleApplySelectedKey: Could not rebind input for ActionName = `%s` to Key = `%s` because reasons?\"),\n\t\t\t *SelectedActionName.ToString(), *SelectedKey.Key.ToString()\n\t\t);\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoUISettingsKeyboard::IsSelectedKeyValid(const FInputChord& SelectedKey, FText& OutError, FText& OutWarning, bool bNoOutput)\n{\n\tif (!USoInputHelper::IsAllowedInputKeyboardKey(SelectedKey))\n\t{\n\t\tFFormatNamedArguments Arguments;\n\t\tArguments.Add(TEXT(\"Key\"), FSoInputKey::GetKeyDisplayName(SelectedKey.Key));\n\t\tOutError = FText::Format(FROM_STRING_TABLE_UI(\"input_selected_key_not_allowed\"), Arguments);\n\t\tif (!bNoOutput)\n\t\t\tUE_LOG(LogSoUISettings, Error, TEXT(\"%s\"), *OutError.ToString());\n\n\t\treturn false;\n\t}\n\n\tconst int32 SelectedButtonIndex = GetSelectedLineIndex();\n\tif (!InputOptions.IsValidIndex(SelectedButtonIndex))\n\t{\n\t\tOutError = FText::FromString(\n\t\t\tFString::Printf(TEXT(\"ButtonIndex = %d does not exist in the InputOptions\"), SelectedButtonIndex)\n\t\t);\n\t\tif (!bNoOutput)\n\t\t\tUE_LOG(LogSoUISettings, Error, TEXT(\"%s\"), *OutError.ToString());\n\n\t\treturn false;\n\t}\n\n\t// Key conflicts are allowed but warn the user\n\tconst FName SelectedActionName = InputOptions[SelectedButtonIndex].ActionName;\n\tif (USoUIHelper::AreThereAnyKeyConflicts(UserSettings, SelectedActionName, SelectedKey, OutWarning))\n\t{\n\t\tif (!bNoOutput)\n\t\t\tUE_LOG(LogSoUISettings, Warning, TEXT(\"%s\"), *OutWarning.ToString());\n\t}\n\n\treturn true;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISettingsKeyboard::SetCurrentState(ESoUISettingsKeyboardState InCurrentState)\n{\n\tCurrentState = InCurrentState;\n\tbool bOpenConfirmKeyboardSettings = false;\n\tbAllowChangingLines = true;\n\tScrollBox->SetIsEnabled(true);\n\n\tswitch (CurrentState)\n\t{\n\t\tcase ESoUISettingsKeyboardState::Browse:\n\t\t{\n\t\t\tbreak;\n\t\t}\n\n\t\tcase ESoUISettingsKeyboardState::SelectingKey:\n\t\t{\n\t\t\tbAllowChangingLines = false;\n\t\t\tScrollBox->SetIsEnabled(false);\n\t\t\tKeySelectorOverlay->Open(true);\n\t\t\tbreak;\n\t\t}\n\n\t\tcase ESoUISettingsKeyboardState::ResetAllToDefaults:\n\t\t{\n\t\t\tbOpenConfirmKeyboardSettings = true;\n\t\t\tScrollBox->SetIsEnabled(false);\n\t\t\tbreak;\n\t\t}\n\n\t\tdefault:\n\t\t\tcheckNoEntry();\n\t}\n\n\t// Refresh tooltips\n\tEmptyAndRefreshButtonImagesTooltips(true);\n\n\t// Open confirm keyboard settings only when resetting all defaults\n\tISoUIEventHandler::Execute_Open(ConfirmKeyboardSettings, bOpenConfirmKeyboardSettings);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISettingsKeyboard::OnKeySelectorOverlayOpenChanged(bool bOpen)\n{\n\tif (!bOpen)\n\t{\n\t\t// Closed, return back to own state\n\t\tif (!KeySelectorOverlay->CanHandleUICommand())\n\t\t\tSetCurrentState(ESoUISettingsKeyboardState::Browse);\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISettingsKeyboard::OnConfirmPanelOpenChanged(bool bPanelOpened)\n{\n\tif (bPanelOpened)\n\t{\n\t\tButtonImagesTooltipsArray->Hide();\n\t}\n\telse\n\t{\n\t\tButtonImagesTooltipsArray->Show();\n\t\tCreateInputButtonsFromUserSettings(0);\n\t\tScrollBox->SetIsEnabled(true);\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISettingsKeyboard::ConfirmPanelClose()\n{\n\tSetCurrentState(ESoUISettingsKeyboardState::Browse);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoUISettingsKeyboard::IsConfirmMode() const\n{\n\treturn ::IsValid(ConfirmKeyboardSettings) && ConfirmKeyboardSettings->CanHandleUICommand();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoUISettingsKeyboard::OpenConfirmPanel()\n{\n\tSetCurrentState(ESoUISettingsKeyboardState::ResetAllToDefaults);\n\treturn true;\n}\n"
  },
  {
    "path": "Source/SOrb/UI/Menu/Settings/SoUISettingsKeyboard.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#pragma once\n\n#include \"CoreMinimal.h\"\n#include \"SoUISettingsBase.h\"\n\n#include \"GameFramework/PlayerInput.h\"\n\n#include \"UI/General/SoUITypes.h\"\n#include \"Settings/Input/SoInputNames.h\"\n\n#include \"SoUISettingsKeyboard.generated.h\"\n\nenum class ESoInputDeviceType : uint8;\nclass USoUIButtonArray;\nclass UPanelWidget;\nclass USoUICommandTooltipArray;\nclass USoUIInputKeySelectorOverlay;\nclass USoUIConfirmPanel;\nclass ASoPlayerController;\nclass UOverlay;\nclass USoGameSettings;\nclass USoUIConfirmKeyboardSettings;\nclass UScrollBox;\n\nUENUM(BlueprintType)\nenum class ESoUISettingsKeyboardState : uint8\n{\n\tBrowse = 0\t\t\t\tUMETA(DisplayName = \"Browse\"),\n\tSelectingKey\t\t\tUMETA(DisplayName = \"SelectingKey\"),\n\tResetAllToDefaults\t\tUMETA(DisplayName = \"Reset All to defaults\"),\n};\n\nUCLASS()\nclass SORB_API USoUISettingsKeyboard : public USoUISettingsBase\n{\n\tGENERATED_BODY()\n\nprotected:\n\t//\n\t// UUserWidget Interface\n\t//\n\tvoid SynchronizeProperties() override;\n\tvoid NativeConstruct() override;\n\tvoid NativeDestruct() override;\n\n\t//\n\t// ISoUIEventHandler Interface\n\t//\n\tvoid Open_Implementation(bool bOpen) override;\n\tbool CanBeInterrupted_Implementation() const override;\n\n\t//\n\t// USoUISettingsBase Interface\n\t//\n\tvoid OnPressedChild(int32 SelectedChild, USoUIUserWidget* SoUserWidget) override;\n\tvoid CreateChildrenAndSetTexts(bool bFromSynchronizeProperties = false) override;\n\tbool HandleOnUICommand(ESoUICommand Command) override;\n\tvoid RefreshButtonImagesTooltips(bool bForceShowAll = false) override;\n\tvoid OnLineChanged(int32 OldLineIndex, int32 NewLineIndex) override;\n\tbool OnPressedButtonTooltipsCommand(ESoUICommand Command) override;\n\n\t//\n\t// Own methods\n\t//\n\n\tbool OnCommandResetAllToDefaults();\n\tbool OnCommandResetKeyToDefault();\n\n\t// Creates the input button from the input user settings.\n\tvoid CreateInputButtonsFromUserSettings(const int32 SelectLineIndex = INDEX_NONE);\n\n\t// Called at the end of CreateInputButtonsFromUserSettings\n\tUFUNCTION(BlueprintImplementableEvent, Category = UI, meta = (DisplayName = \"OnCreateInputButtonsFromUserSettings\"))\n\tvoid ReceiveOnCreateInputButtonsFromUserSettings();\n\n\t// Is the key on the selected line default?\n\tUFUNCTION(BlueprintPure, Category = UI)\n\tbool IsSelectedActionMappingDefault() const;\n\n\t// Get the ActionMapping for the selected line/column\n\tUFUNCTION(BlueprintPure, Category = UI)\n\tbool GetSelectedActionMapping(FInputActionKeyMapping& ActionMapping) const;\n\n\tUFUNCTION()\n\tvoid HandleKeySelected(const FInputChord& InSelectedKey);\n\n\tUFUNCTION()\n\tvoid HandleIsSelectingKeyChanged(bool bIsSelectingKey);\n\n\tUFUNCTION()\n\tvoid HandleApplySelectedKey(const FInputChord& SelectedKey);\n\n\t// Did the settings change? default is what is displayed currently\n\tbool DidSettingsChange() const;\n\n\t// Is the SelectedKey valid?\n\tbool IsSelectedKeyValid(const FInputChord& SelectedKey, FText& OutError, FText& OutWarning, bool bNoOutput = false);\n\n\t// Sets the current state, opens/closes the confirm panel if it has to\n\tvoid SetCurrentState(ESoUISettingsKeyboardState InCurrentState);\n\n\tbool IsConfirmMode() const;\n\tbool OpenConfirmPanel();\n\n\t// Close the confirm panel\n\tUFUNCTION(BlueprintCallable)\n\tvoid ConfirmPanelClose();\n\n\tUFUNCTION()\n\tvoid OnKeySelectorOverlayOpenChanged(bool bOpen);\n\n\tUFUNCTION()\n\tvoid OnConfirmPanelOpenChanged(bool bPanelOpened);\n\n\t// Can we edit keyboard buttons\n\tbool UpdateCanEditKeyboardKeys();\n\n\tUFUNCTION()\n\tvoid HandleDeviceTypeChanged(ESoInputDeviceType InDeviceType);\n\n\tvoid SubscribeToDeviceChanged();\n\tvoid UnSubscribeFromDeviceChanged();\nprotected:\n\t// Widget that selects the key from the user\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\", meta = (BindWidget))\n\tUSoUIInputKeySelectorOverlay* KeySelectorOverlay = nullptr;\n\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\", meta = (BindWidget))\n\tUPanelWidget* ContentContainer;\n\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\", meta = (BindWidget))\n\tUOverlay* OnlyKeyboardOverlay;\n\n\tUPROPERTY(BlueprintReadOnly, Category = \">Widgets\", meta = (BindWidget))\n\tUSoUIConfirmKeyboardSettings* ConfirmKeyboardSettings;\n\n\tUPROPERTY(BlueprintReadOnly, Category = \">Widgets\", meta = (BindWidget))\n\tUScrollBox* ScrollBox;\n\t\n\t// All the configurable input option names\n\t// Maps from selected line => FSoInputConfigurableActionName\n\tUPROPERTY(BlueprintReadOnly, VisibleAnywhere)\n\tTArray<FSoInputConfigurableActionName> InputOptions;\n\n\t// All the keyboard mapping options\n\tUPROPERTY(BlueprintReadOnly, VisibleAnywhere)\n\tTArray<FInputActionKeyMapping> KeyboardMappingOptions;\n\n\t// Tells us which lines have the keyboard key unbound\n\tUPROPERTY(BlueprintReadOnly, VisibleAnywhere)\n\tTSet<int32> UnboundKeyboardKeys;\n\n\t// Are we browsing, selecting a key, resetting to default\n\tUPROPERTY(BlueprintReadOnly)\n\tESoUISettingsKeyboardState CurrentState = ESoUISettingsKeyboardState::Browse;\n\n\tUPROPERTY(BlueprintReadOnly)\n\tbool bIsListeningToDevicesChanges = false;\n\n\t// TODO do we need this? only if we implement Apply shortcuts\n\t// Tells us if any keys changed. Value is the line index of the key in it's respective column\n\tTArray<int32> ChangedKeyboardKeys;\n\n\tstatic constexpr ESoUICommand UICommand_ResetKeyToArrows = ESoUICommand::EUC_Action1;\n\tstatic constexpr ESoUICommand UICommand_ResetAllToWASD = ESoUICommand::EUC_Action2;\n};\n"
  },
  {
    "path": "Source/SOrb/UI/Menu/SoUIChallenges.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#include \"SoUIChallenges.h\"\n\n#include \"Components/TextBlock.h\"\n#include \"Basic/SoGameSingleton.h\"\n#include \"SaveFiles/SoWorldState.h\"\n#include \"Components/Image.h\"\n#include \"Basic/SoGameInstance.h\"\n#include \"Levels/SoLevelHelper.h\"\n#include \"Basic/SoAudioManager.h\"\n\n#include \"UI/General/Commands/SoUICommandTooltipArray.h\"\n#include \"UI/General/Buttons/SoUIButtonArray.h\"\n#include \"Online/Analytics/SoAnalytics.h\"\n#include \"Basic/Helpers/SoDateTimeHelper.h\"\n#include \"Localization/SoLocalization.h\"\n\nDEFINE_LOG_CATEGORY_STATIC(LogSoUIChallenges, All, All);\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIChallenges::SynchronizeProperties()\n{\n\tSuper::SynchronizeProperties();\n\tRefreshCommandTooltips();\n\n\t// TODO find why this makes a white overlay over our preview\n\t// CreateDefaultChallenges();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIChallenges::NativeConstruct()\n{\n\tSuper::NativeConstruct();\n\tSetVisibility(bOpened ? ESlateVisibility::Visible : ESlateVisibility::Collapsed);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIChallenges::NativeDestruct()\n{\n\tSuper::NativeDestruct();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIChallenges::Open_Implementation(bool bOpen)\n{\n\tbOpened = bOpen;\n\n\t// Reset on open\n\tif (bOpen)\n\t\tCreateChallengesFromWorldStateChallenges();\n\n\tSetVisibility(bOpen ? ESlateVisibility::Visible : ESlateVisibility::Collapsed);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIChallenges::InstantOpen(bool bOpen)\n{\n\tStopAllAnimations();\n\tISoUIEventHandler::Execute_Open(this, bOpen);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoUIChallenges::OnUICommand_Implementation(ESoUICommand Command)\n{\n\tswitch (Command)\n\t{\n\tcase ESoUICommand::EUC_Up:\n\tcase ESoUICommand::EUC_Down:\n\t\t// Navigate along the buttons\n\t\tChallengeButtons->Navigate(Command);\n\t\tOnEpisodeChanged(ChallengeButtons->GetSelectedIndex());\n\t\treturn true;\n\n\tcase UICommand_StartEpisode:\n\t\tUSoAudioManager::PlaySound2D(this, SFXOpenSelected, true);\n\t\tStartEpisode(GetSelectedEpisodeName());\n\t\treturn true;\n\n\tcase ESoUICommand::EUC_MainMenuBack:\n\t\t// Close this widget\n\t\tISoUIEventHandler::Execute_Open(this, false);\n\t\treturn true;\n\n\tdefault:\n\t\treturn false;\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIChallenges::OnEpisodeChanged_Implementation(int32 EpisodeButtonIndex)\n{\n\tRefreshCommandTooltips();\n\n\tconst FName SelectedEpisodeName = GetSelectedEpisodeName();\n\tif (!USoLevelHelper::IsValidEpisodeName(SelectedEpisodeName))\n\t{\n\t\tUE_LOG(LogSoUIChallenges, Warning, TEXT(\"SelectedEpisodeName = %s is invalid\"), *SelectedEpisodeName.ToString());\n\t\treturn;\n\t}\n\n\tFSoEpisodeMapParams EpisodeData;\n\tverify(USoLevelHelper::GetEpisodeData(SelectedEpisodeName, EpisodeData));\n\n\tif (ChallengeImage)\n\t\tChallengeImage->SetBrushFromTexture(EpisodeData.Image);\n\n\tif (DescriptionValue)\n\t\tDescriptionValue->SetText(EpisodeData.Description);\n\n\t//if (CheckpointValue)\n\t//{\n\t//\tCheckpointContainer->SetVisibility(ESlateVisibility::Hidden);\n\t//\t//if (MapParams.CheckpointLocation == NAME_None)\n\t//\t// TODO\n\t//}\n\n\t// TODO\n\t// const FSoWorldStateEpisode& UserData = FSoWorldState::Get().GetEpisode(SelectedEpisodeName);\n\t// if (StatusValue)\n\t// {\n\t// \tif (UserData.Progress == ESoEpisodeProgress::Started)\n\t// \t{\n\t// \t\tStatusValue->SetText(FROM_STRING_TABLE_UI(\"never_completed\"));\n\t// \t}\n\t// \telse\n\t// \t{\n\t// \t\t// Completed\n\t// \t\tFFormatNamedArguments StatusArguments;\n\t// \t\tStatusArguments.Add(TEXT(\"time\"), USoDateTimeHelper::GetTextFromSeconds(UserData.TotalPlayTimeSeconds, false));\n\t//\n\t// \t\tStatusValue->SetText(FText::Format(FROM_STRING_TABLE_UI(\"completed_in_time\"), StatusArguments));\n\t// \t}\n\t// }\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIChallenges::RefreshCommandTooltips()\n{\n\tif (CommandTooltips == nullptr)\n\t\treturn;\n\n\t// Restore to default\n\tCommandTooltips->SetVisibility(ESlateVisibility::Visible);\n\tCommandTooltips->Clear();\n\n\tCommandTooltips->AddTooltipFromUICommand(FROM_STRING_TABLE_UI(\"start\"), UICommand_StartEpisode);\n\n\t// Nothing to show\n\tif (CommandTooltips->IsEmpty())\n\t\tCommandTooltips->SetVisibility(ESlateVisibility::Collapsed);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIChallenges::StartEpisode(FName EpisodeName)\n{\n\tif (!USoLevelHelper::IsValidEpisodeName(EpisodeName))\n\t{\n\t\tUE_LOG(LogSoUIChallenges, Warning, TEXT(\"Selected EpisodeName = %s is not a valid\"), *EpisodeName.ToString());\n\t\treturn;\n\t}\n\n\tauto& GameInstance = USoGameInstance::Get(this);\n\n\t// Analytics\n\tGameInstance.GetAnalytics()->RecordUIEpisodeStart();\n\n\t// Load\n\tif (!GameInstance.LoadGameForEpisode(EpisodeName, true))\n\t\tGameInstance.ResumeGame(true);\n\n\tISoUIEventHandler::Execute_Open(this, false);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIChallenges::CreateDefaultChallenges()\n{\n\tif (ChallengeButtons == nullptr)\n\t\treturn;\n\n\tMapEpisodeButtonToEpisodeName.SetNumZeroed(NumEpisodes);\n\tTArray<FText> ChallengeTexts;\n\tfor (int32 Index = 0; Index < NumEpisodes; Index++)\n\t{\n\t\tFFormatOrderedArguments Args;\n\t\tArgs.Add(Index);\n\t\tChallengeTexts.Add(FText::Format(FROM_STRING_TABLE_UI(\"custom_map_x\"), Args));\n\t}\n\n\tChallengeButtons->CreateButtons(ChallengeTexts);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIChallenges::CreateChallengesFromWorldStateChallenges()\n{\n\tif (ChallengeButtons == nullptr)\n\t\treturn;\n\n\tMapEpisodeButtonToEpisodeName.Empty();\n\tTArray<FText> ButtonsTexts;\n\n\t// TODO\n\t// FName EpisodeName = FSoWorldState::Get().GetEpisodeName();\n\t// if (!USoLevelHelper::IsValidEpisodeName(EpisodeName))\n\t// \tEpisodeName = USoLevelHelper::GetFirstValidEpisodeName();\n\n\tint32 SelectEpisodeButtonIndex = 0;\n\tfor (const auto& Episode : USoLevelHelper::GetAllEpisodesData())\n\t{\n\t\tconst FName EpisodeName = Episode.GetMapName();\n\t\tButtonsTexts.Add(Episode.DisplayName);\n\t\tMapEpisodeButtonToEpisodeName.Add(EpisodeName);\n\n\t\tcheckNoEntry();\n\t\tif (EpisodeName == EpisodeName)\n\t\t\tSelectEpisodeButtonIndex = MapEpisodeButtonToEpisodeName.Num() - 1;\n\t}\n\n\tcheck(ButtonsTexts.Num() == MapEpisodeButtonToEpisodeName.Num());\n\tNumEpisodes = ButtonsTexts.Num();\n\tChallengeButtons->CreateButtons(ButtonsTexts);\n\n\t// Select and activate current button\n\t// ChallengeButtons->SetSelectedIndex(SelectEpisodeButtonIndex);\n\t// ChallengeButtons->ActivateChildAt(SelectEpisodeButtonIndex);\n\tOnEpisodeChanged(ChallengeButtons->GetSelectedIndex());\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFName USoUIChallenges::GetSelectedEpisodeName() const\n{\n\tconst int32 ButtonIndex = ChallengeButtons->GetSelectedIndex();\n\treturn MapEpisodeButtonToEpisodeName.IsValidIndex(ButtonIndex) ? MapEpisodeButtonToEpisodeName[ButtonIndex] : NAME_None;\n}\n"
  },
  {
    "path": "Source/SOrb/UI/Menu/SoUIChallenges.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#pragma once\n\n#include \"CoreMinimal.h\"\n#include \"Blueprint/UserWidget.h\"\n\n#include \"UI/General/SoUITypes.h\"\n\n#include \"SoUIChallenges.generated.h\"\n\n\nclass USoUIButtonArray;\nclass USoUIButton;\nclass USoUICommandTooltipArray;\nclass USoUIConfirmPanel;\nclass UImage;\nclass UTextBlock;\nclass UFMODEvent;\n\n/**\n * Shows the save slots of the game\n */\nUCLASS()\nclass SORB_API USoUIChallenges : public UUserWidget, public ISoUIEventHandler\n{\n\tGENERATED_BODY()\n\npublic:\n\t//\n\t// UUserWidget Interface\n\t//\n\tvoid SynchronizeProperties() override;\n\tvoid NativeConstruct() override;\n\tvoid NativeDestruct() override;\n\n\t//\n\t// ISoUIEventHandler Interface\n\t//\n\tbool OnUICommand_Implementation(ESoUICommand Command) override;\n\tvoid Open_Implementation(bool bOpen) override;\n\tbool IsOpened_Implementation() const override { return bOpened; }\n\tbool CanBeInterrupted_Implementation() const override { return true; }\n\n\t//\n\t// Own methods\n\t//\n\n\t// No animation\n\tvoid InstantOpen(bool bOpen);\n\n\tUFUNCTION(BlueprintNativeEvent)\n\tvoid OnEpisodeChanged(int32 EpisodeButtonIndex);\n\n\t// Refreshes the command tooltips depending on the currently selected index.\n\tUFUNCTION(BlueprintCallable)\n\tvoid RefreshCommandTooltips();\n\n\t// Start the new challenge\n\tvoid StartEpisode(FName EpisodeName);\n\nprotected:\n\tvoid CreateDefaultChallenges();\n\tvoid CreateChallengesFromWorldStateChallenges();\n\n\tFName GetSelectedEpisodeName() const;\n\nprotected:\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\", meta = (BindWidget))\n\tUSoUIButtonArray* ChallengeButtons = nullptr;\n\n\t// Show the actions (shortcuts) possible on each challenge\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\", meta = (BindWidget))\n\tUSoUICommandTooltipArray* CommandTooltips = nullptr;\n\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\", meta = (BindWidget))\n\tUImage* ChallengeImage;\n\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\", meta = (BindWidget))\n\tUTextBlock* DescriptionValue;\n\n\t// UPROPERTY(BlueprintReadWrite, meta = (BindWidget))\n\t// UPanelWidget* CheckpointContainer;\n\n\t// UPROPERTY(BlueprintReadWrite, meta = (BindWidget))\n\t// UTextBlock* CheckpointValue;\n\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\", meta = (BindWidget))\n\tUTextBlock* StatusValue;\n\n\t// Number of challenge buttons\n\tUPROPERTY(BlueprintReadOnly, Category = \">Challenge\")\n\tint32 NumEpisodes = 3;\n\n\t// Maps from\n\t// Key: The episode button index\n\t// Value: Episode Name\n\tTArray<FName> MapEpisodeButtonToEpisodeName;\n\n\t// Are the save slots still opened?\n\tbool bOpened = false;\n\n\t// Actions for the save  slots\n\tstatic constexpr ESoUICommand UICommand_StartEpisode = ESoUICommand::EUC_Action0;\n\n\t//\n\t// SFX\n\t//\n\n\tUPROPERTY(EditAnywhere, Category = \">SFX\")\n\tUFMODEvent* SFXOpenSelected = nullptr;\n};\n"
  },
  {
    "path": "Source/SOrb/UI/Menu/SoUIDifficultySelection.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n\n#include \"SoUIDifficultySelection.h\"\n\n#include \"Components/RichTextBlock.h\"\n#include \"Components/Image.h\"\n\n#include \"UI/General/Buttons/SoUIButton.h\"\n#include \"UI/Menu/ConfirmPanels/SoUIConfirmQuestion.h\"\n#include \"SoLocalization.h\"\n#include \"SaveFiles/SoWorldState.h\"\n#include \"Character/SoCharacter.h\"\n#include \"Character/SoCharStates/SoADefault.h\"\n#include \"Levels/SoLevelHelper.h\"\n#include \"Basic/SoGameInstance.h\"\n#include \"Basic/Helpers/SoStaticHelper.h\"\n#include \"Online/Analytics/SoAnalytics.h\"\n\n\n///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIDifficultySelection::NativeConstruct()\n{\n\tbCyclicNavigation = true;\n\tCreateChildrenAndSetTexts();\n\n\tOnNavigateOnPressedHandleChildEvent().BindUObject(this, &USoUIDifficultySelection::OnHandleButtonPress);\n\tif (Confirmation != nullptr)\n\t{\n\t\tConfirmation->OnQuestionAnsweredEvent().AddDynamic(this, &ThisClass::OnConfirmQuestionAnswered);\n\t\tConfirmation->SetPlayBackToMenuRootSFXOnNo(false);\n\t}\n\n\tOnPostSetSelectedIndexEvent().AddLambda([this](int32 OldIndex, int32 NewIndex)\n\t{\n\t\tUpdateDescription();\n\t});\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIDifficultySelection::NativeDestruct()\n{\n\tif (Confirmation != nullptr)\n\t\tConfirmation->OnQuestionAnsweredEvent().RemoveDynamic(this, &ThisClass::OnConfirmQuestionAnswered);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoUIDifficultySelection::OnUICommand_Implementation(ESoUICommand Command)\n{\n\tif (!ISoUIEventHandler::Execute_IsOpened(this))\n\t\treturn false;\n\n\t// Confirmation Open\n\tif (IsValid(Confirmation) && ISoUIEventHandler::Execute_IsOpened(Confirmation))\n\t{\n\t\treturn ISoUIEventHandler::Execute_OnUICommand(Confirmation, Command);\n\t}\n\n\tswitch (Command)\n\t{\n\t\tcase ESoUICommand::EUC_Left:\n\t\tcase ESoUICommand::EUC_Right:\n\t\tcase ESoUICommand::EUC_Up:\n\t\tcase ESoUICommand::EUC_Down:\n\t\tcase ESoUICommand::EUC_MainMenuEnter:\n\t\t\t// Navigate on the buttons\n\t\t\tNavigate(Command);\n\t\t\tUpdateDescription();\n\t\t\treturn true;\n\n\t\tcase ESoUICommand::EUC_MainMenuBack:\n\t\t\tISoUIEventHandler::Execute_Open(this, false);\n\t\t\treturn true;\n\n\t\tdefault:\n\t\t\treturn false;\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIDifficultySelection::Open_Implementation(bool bOpen)\n{\n\tSetVisibility(bOpen ? ESlateVisibility::Visible : ESlateVisibility::Collapsed);\n\tSetSelectedIndex(1);\n\tUpdateDescription();\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIDifficultySelection::CreateChildrenAndSetTexts()\n{\n\t// indices are expected to map to ESoDifficulty\n\n\tTArray<FText> ChildrenTexts;\n\tAddContainerButton(DifficultySane);\n\tChildrenTexts.Add(FROM_STRING_TABLE_UI(\"difficulty_sane\"));\n\tAddContainerButton(DifficultyIntended);\n\tChildrenTexts.Add(FROM_STRING_TABLE_UI(\"difficulty_intended\"));\n\tAddContainerButton(DifficultyInsane);\n\tChildrenTexts.Add(FROM_STRING_TABLE_UI(\"difficulty_insane\"));\n\n\tcheck(NumContainerChildren() == ChildrenTexts.Num());\n\n\tSetButtonsTexts(ChildrenTexts);\n\n\tDifficultySane->Activate();\n\tDifficultyIntended->Activate();\n\tDifficultyInsane->Activate();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIDifficultySelection::UpdateDescription()\n{\n\tESoDifficulty Difficulty = static_cast<ESoDifficulty>(SelectedIndex);\n\tswitch (Difficulty)\n\t{\n\t\tcase ESoDifficulty::Sane:\n\t\t\tDifficultyDescription->SetText(FROM_STRING_TABLE_UI(\"difficulty_desc_sane\"));\n\t\t\tDifficultyIcon->SetBrushFromTexture(IconSane);\n\t\t\tbreak;\n\n\t\tcase ESoDifficulty::Intended:\n\t\t\tDifficultyDescription->SetText(FROM_STRING_TABLE_UI(\"difficulty_desc_intended\"));\n\t\t\tDifficultyIcon->SetBrushFromTexture(IconIntended);\n\t\t\tbreak;\n\n\t\tcase ESoDifficulty::Insane:\n\t\t\tDifficultyDescription->SetText(FROM_STRING_TABLE_UI(\"difficulty_desc_insane\"));\n\t\t\tDifficultyIcon->SetBrushFromTexture(IconInsane);\n\t\t\tbreak;\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIDifficultySelection::SetButtonVisibility(bool bVisible)\n{\n\tDifficultySane->SetVisibility(bVisible ? ESlateVisibility::Visible : ESlateVisibility::Collapsed);\n\tDifficultyIntended->SetVisibility(bVisible ? ESlateVisibility::Visible : ESlateVisibility::Collapsed);\n\tDifficultyInsane->SetVisibility(bVisible ? ESlateVisibility::Visible : ESlateVisibility::Collapsed);\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIDifficultySelection::OnHandleButtonPress(int32 SelectedChild, USoUIUserWidget* SoUserWidget)\n{\n\tif (SoUserWidget == nullptr || !IsValidIndex(SelectedChild))\n\t\treturn;\n\n\t// SFX\n\tSoUserWidget->NavigateOnPressed(true);\n\n\t// External link handled\n\tif (IsIndexForExtraAttachedChildren(SelectedChild))\n\t{\n\t\treturn;\n\t}\n\n\tif (SelectedIndex >= 0 && SelectedIndex < static_cast<int32>(ESoDifficulty::NumOf))\n\t{\n\t\tSelectedDifficulty = static_cast<ESoDifficulty>(SelectedIndex);\n\n\t\tConfirmation->SetTexts(\n\t\t\tFROM_STRING_TABLE_UI(\"difficulty_confirm_question\"),\n\t\t\tFROM_STRING_TABLE_UI(\"difficulty_confirm_subtext\")\n\t\t);\n\t\tSetButtonVisibility(false);\n\t\tISoUIEventHandler::Execute_Open(Confirmation, true);\n\t}\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIDifficultySelection::OnConfirmQuestionAnswered()\n{\n\tif (Confirmation->IsAnswerYes())\n\t{\n\t\tDifficultySelected.Broadcast(SelectedDifficulty);\n\t\tISoUIEventHandler::Execute_Open(this, false);\n\t}\n\telse\n\t{\n\t\tSetButtonVisibility(true);\n\t}\n}\n"
  },
  {
    "path": "Source/SOrb/UI/Menu/SoUIDifficultySelection.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#pragma once\n\n#include \"CoreMinimal.h\"\n#include \"UI/General/Buttons/SoUIButtonArray.h\"\n\n#include \"Basic/SoDifficulty.h\"\n\n#include \"SoUIDifficultySelection.generated.h\"\n\nclass USoUIConfirmQuestion;\nclass URichTextBlock;\n\nDECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOnDifficultySelected, ESoDifficulty, SelectedDifficulty);\n\n/**\n *\n */\nUCLASS()\nclass SORB_API USoUIDifficultySelection : public USoUIButtonArray, public ISoUIEventHandler\n{\n\tGENERATED_BODY()\n\npublic:\n\n\t//\n\t// Begin UUserWidget Interface\n\t//\n\tvoid NativeConstruct() override;\n\tvoid NativeDestruct() override;\n\n\t//\n\t// ISoUIEventHandler Interface\n\t//\n\tbool OnUICommand_Implementation(ESoUICommand Command) override;\n\tvoid Open_Implementation(bool bOpen) override;\n\tbool IsOpened_Implementation() const override { return IsVisible(); }\n\tbool CanBeInterrupted_Implementation() const override { return true; }\n\n\n\t//\n\t// Own methods\n\t//\n\n\tFOnDifficultySelected& OnDifficultySelected() { return DifficultySelected; }\n\n\tvoid CreateChildrenAndSetTexts();\n\tvoid UpdateDescription();\n\n\tvoid SetButtonVisibility(bool bVisible);\n\n\t// Pressed on a button\n\tUFUNCTION()\n\tvoid OnHandleButtonPress(int32 SelectedChild, USoUIUserWidget* SoUserWidget);\n\n\tUFUNCTION()\n\tvoid OnConfirmQuestionAnswered();\n\nprotected:\n\n\tUPROPERTY(BlueprintAssignable, Category = \">Events\")\n\tFOnDifficultySelected DifficultySelected;\n\n\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\", meta = (BindWidget))\n\tUSoUIButton* DifficultySane;\n\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\", meta = (BindWidget))\n\tUSoUIButton* DifficultyIntended;\n\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\", meta = (BindWidget))\n\tUSoUIButton* DifficultyInsane;\n\n\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\", meta = (BindWidget))\n\tUImage* DifficultyIcon;\n\n\n\tUPROPERTY(EditAnywhere, Category = \">Widgets\")\n\tUTexture2D* IconSane;\n\n\tUPROPERTY(EditAnywhere, Category = \">Widgets\")\n\tUTexture2D* IconIntended;\n\n\tUPROPERTY(EditAnywhere, Category = \">Widgets\")\n\tUTexture2D* IconInsane;\n\n\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\", meta = (BindWidget))\n\tUSoUIConfirmQuestion* Confirmation;\n\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\", meta = (BindWidget))\n\tURichTextBlock* DifficultyDescription;\n\n\t// Runtime\n\tESoDifficulty SelectedDifficulty = ESoDifficulty::Intended;\n};\n"
  },
  {
    "path": "Source/SOrb/UI/Menu/SoUILanguageSelection.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#include \"SoUILanguageSelection.h\"\n\n#include \"Components/TextBlock.h\"\n#include \"Localization/SoLocalizationHelper.h\"\n#include \"UI/General/Buttons/SoUIButtonArray.h\"\n#include \"Settings/SoGameSettings.h\"\n\nDEFINE_LOG_CATEGORY_STATIC(LogSoUILanguageSelection, All, All);\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUILanguageSelection::SynchronizeProperties()\n{\n\tSuper::SynchronizeProperties();\n\tCreateButtonTexts();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUILanguageSelection::NativeConstruct()\n{\n\tSuper::NativeConstruct();\n\tSetVisibility(bOpened ? ESlateVisibility::Visible : ESlateVisibility::Collapsed);\n\n\t// Pressed language button\n\tLanguageButtons->OnNavigateOnPressedHandleChildEvent().BindLambda([this](int32 SelectedChild, USoUIUserWidget* SoUserWidget)\n\t{\n\t\tif (!CanHandleInput())\n\t\t\treturn;\n\t\t\n\t\tconst ESoSupportedCulture SelectedCulture = SupportedCultures[SelectedChild];\n\t\tUSoLocalizationHelper::SetCurrentCultureEverywhere(SelectedCulture, true);\n\t\tFireOnLanguageSelected();\n\t});\n\n\t// Get Current selected language and select that button as default\n\tconst ESoSupportedCulture Current = USoLocalizationHelper::GetCurrentLanguageNameType();\n\tconst int32 CurrentIndex = SupportedCultures.Find(Current);\n\tcheck(SupportedCultures.IsValidIndex(CurrentIndex));\n\tLanguageButtons->SetSelectedIndex(CurrentIndex);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUILanguageSelection::NativeDestruct()\n{\n\tSuper::NativeDestruct();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUILanguageSelection::Open_Implementation(bool bOpen)\n{\n\tbOpened = bOpen;\n\tSetVisibility(bOpen ? ESlateVisibility::Visible : ESlateVisibility::Collapsed);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUILanguageSelection::CreateButtonTexts()\n{\n\tif (LanguageButtons == nullptr)\n\t\treturn;\n\n\tTArray<FText> ButtonsTexts;\n\tSupportedCultures = USoLocalizationHelper::GetAllConfigurableCultures();\n\tfor (const auto& CultureType : SupportedCultures)\n\t{\n\t\tButtonsTexts.Add(USoLocalizationHelper::GetDisplayTextFromSupportedCulture(CultureType, true));\n\t}\n\n\tLanguageButtons->CreateButtons(ButtonsTexts);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUILanguageSelection::FireOnLanguageSelected()\n{\n\tif (bLanguageSelected)\n\t\treturn;\n\t\n\tbLanguageSelected = true;\n\tUSoGameSettings::Get().OnLanguageSelected();\n\tLanguageSelectedEvent.Broadcast();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoUILanguageSelection::CanHandleInput() const\n{\n\tconst bool bThisCanHandle = !IsAnyAnimationPlaying() && GetVisibility() == ESlateVisibility::Visible;\n\tif (ParentUserWidget)\n\t\treturn bThisCanHandle && !ParentUserWidget->IsAnyAnimationPlaying();\n\t\n\treturn bThisCanHandle;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoUILanguageSelection::OnUICommand_Implementation(ESoUICommand Command)\n{\n\tif (bLanguageSelected)\n\t\treturn false;\n\n\tif (!CanHandleInput())\n\t\treturn false;\n\n\t// Navigate buttons\n\tif (Command != ESoUICommand::EUC_MainMenuEnter)\n\t{\n\t\tLanguageButtons->Navigate(Command, true);\n\t\treturn true;\n\t}\n\n\t// Pressed language button\n\tconst int32 SelectedIndex = LanguageButtons->GetSelectedIndex();\n\tcheck(SupportedCultures.IsValidIndex(SelectedIndex));\n\tconst ESoSupportedCulture SelectedCulture = SupportedCultures[SelectedIndex];\n\tUSoLocalizationHelper::SetCurrentCultureEverywhere(SelectedCulture, true);\n\tFireOnLanguageSelected();\n\n\treturn true;\n}\n"
  },
  {
    "path": "Source/SOrb/UI/Menu/SoUILanguageSelection.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#pragma once\n\n#include \"CoreMinimal.h\"\n#include \"Blueprint/UserWidget.h\"\n\n#include \"UI/General/SoUITypes.h\"\n#include \"Localization/SoLocalizationHelper.h\"\n\n#include \"SoUILanguageSelection.generated.h\"\n\n\nclass USoUIButtonArray;\nclass USoUIButton;\nclass USoUICommandTooltipArray;\nclass USoUIConfirmPanel;\nclass UImage;\nclass UTextBlock;\nclass UFMODEvent;\n\n\nDECLARE_DYNAMIC_MULTICAST_DELEGATE(FSoLanguageSelected);\n\n\nUCLASS(HideCategories = (Navigation), AutoCollapseCategories = (Performance, Clipping, Interaction, Input))\nclass SORB_API USoUILanguageSelection : public UUserWidget, public ISoUIEventHandler\n{\n\tGENERATED_BODY()\n\npublic:\n\t//\n\t// UUserWidget Interface\n\t//\n\tvoid SynchronizeProperties() override;\n\tvoid NativeConstruct() override;\n\tvoid NativeDestruct() override;\n\n\t//\n\t// ISoUIEventHandler Interface\n\t//\n\tbool OnUICommand_Implementation(ESoUICommand Command) override;\n\tvoid Open_Implementation(bool bOpen) override;\n\tbool IsOpened_Implementation() const override { return bOpened; }\n\tbool CanBeInterrupted_Implementation() const override { return true; }\n\n\tvoid CreateButtonTexts();\n\tvoid FireOnLanguageSelected();\n\npublic:\n\tFSoLanguageSelected& OnLanguageSelectedEvent() { return LanguageSelectedEvent; }\n\tbool CanHandleInput() const;\n\t\nprotected:\n\tUPROPERTY(BlueprintAssignable, Category = \">Events\")\n\tFSoLanguageSelected LanguageSelectedEvent;\n\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\", meta = (BindWidget))\n\tUSoUIButtonArray* LanguageButtons = nullptr;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = \">Language\")\n\tbool bOpened = false;\n\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = \">Language\")\n\tbool bLanguageSelected = false;\n\n\t// Used to know  the status of the parent widget animations\n\tUPROPERTY(BlueprintReadWrite, Category = \">Runtime\")\n\tUUserWidget* ParentUserWidget;\n\t\n\t// Cached values\n\tTArray<ESoSupportedCulture> SupportedCultures;\n};\n"
  },
  {
    "path": "Source/SOrb/UI/Menu/SoUIMenuMain.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#include \"SoUIMenuMain.h\"\n\n#include \"Components/Image.h\"\n#include \"TimerManager.h\"\n#include \"Components/RetainerBox.h\"\n#include \"Components/CanvasPanelSlot.h\"\n#include \"Components/TextBlock.h\"\n#include \"Components/Spacer.h\"\n#include \"Materials/MaterialInstanceDynamic.h\"\n\n#include \"Basic/SoGameMode.h\"\n#include \"Character/SoCharacter.h\"\n#include \"Character/SoCharStates/SoActivity.h\"\n#include \"Character/SoPlayerProgress.h\"\n\n#include \"Settings/SoGameSettings.h\"\n#include \"SaveFiles/SoWorldState.h\"\n#include \"SaveFiles/SoSaveHelper.h\"\n\n#include \"Basic/SoGameInstance.h\"\n#include \"Basic/SoGameSingleton.h\"\n#include \"Basic/Helpers/SoPlatformHelper.h\"\n#include \"Basic/SoAudioManager.h\"\n\n#include \"UI/Menu/Settings/SoUISettings.h\"\n#include \"UI/Menu/SoUISaveSlotSelection.h\"\n#include \"UI/Menu/SoUIChallenges.h\"\n#include \"UI/General/Buttons/SoUIButton.h\"\n#include \"UI/InGame/SoUIGameActivity.h\"\n#include \"UI/General/Commands/SoUICommandTooltip.h\"\n#include \"UI/General/SoUIContainerNamedSlot.h\"\n#include \"UI/General/SoUIExternalLink.h\"\n#include \"UI/General/SoUIConfirmPanel.h\"\n#include \"UI/General/Buttons/SoUIButtonImage.h\"\n#include \"UI/SoUIHelper.h\"\n#include \"UI/SoUICredits.h\"\n#include \"ConfirmPanels/SoUIConfirmQuestion.h\"\n#include \"Localization/SoLocalization.h\"\n\n#include \"Online/SoOnlineHelper.h\"\n\nDEFINE_LOG_CATEGORY_STATIC(LogSoUIMenuMain, All, All);\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUSoUIMenuMain::USoUIMenuMain(const FObjectInitializer& ObjectInitializer) : Super(ObjectInitializer)\n{\n\tbSkipDeactivatedChildren = true;\n\tbCyclicNavigation = true;\n\tbVerticalLayout = true;\n\tbExtraAttachedVerticalLayout = false;\n\tbTrackPressedInput = true;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIMenuMain::SynchronizeProperties()\n{\n\tSuper::SynchronizeProperties();\n\tCreateChildrenAndSetTexts();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIMenuMain::NativeConstruct()\n{\n\tSuper::NativeConstruct();\n\tGameInstance = USoGameInstance::GetInstance(this);\n\tcheck(GameInstance);\n\tRefreshButtonContainer();\n\n\t// temp fix\n\tbOpened = false;\n\tSetVisibility(ESlateVisibility::Collapsed);\n\n\t// Back button handle\n\tif (ButtonImageToolTipBack)\n\t{\n\t\tButtonImageToolTipBack->OnPressedEvent().AddLambda([this]()\n\t\t{\n\t\t\tISoUIEventHandler::Execute_OnUICommand(this, ESoUICommand::EUC_MainMenuBack);\n\t\t});\n\t}\n\n\tif (SaveSlotSelectionPanel)\n\t\tSaveSlotSelectionPanel->OnSaveSlotLoaded().AddDynamic(this, &ThisClass::HandleSaveSlotLoaded);\n\n\tif (ConfirmQuit)\n\t\tConfirmQuit->OnQuestionAnsweredEvent().AddDynamic(this, &ThisClass::OnConfirmQuestionAnswered);\n\n\tif (CreditsScreen != nullptr)\n\t\tCreditsScreen->OnFadeOutFinished().AddDynamic(this, &ThisClass::OnCreditsFadeOutFinished);\n\n\tOnNavigateOnPressedHandleChildEvent().BindUObject(this, &ThisClass::OnHandleButtonPress);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIMenuMain::NativeDestruct()\n{\n\tif (SaveSlotSelectionPanel)\n\t\tSaveSlotSelectionPanel->OnSaveSlotLoaded().RemoveDynamic(this, &USoUIMenuMain::HandleSaveSlotLoaded);\n\n\tif (ConfirmQuit)\n\t\tConfirmQuit->OnQuestionAnsweredEvent().RemoveDynamic(this, &ThisClass::OnConfirmQuestionAnswered);\n\n\tif(CreditsScreen != nullptr)\n\t\tCreditsScreen->OnFadeOutFinished().RemoveDynamic(this, &ThisClass::OnCreditsFadeOutFinished);\n\n\tSuper::NativeDestruct();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIMenuMain::NativeTick(const FGeometry& MyGeometry, float InDeltaTime)\n{\n\tSuper::NativeTick(MyGeometry, InDeltaTime);\n\n\tif (CanHandleBeforeMainMenuUICommand())\n\t{\n\t\t// This is the safest and most sane place to call the benchmark as it has to be called after the SLATE Loading Screen is gone, otherwise crash happens\n\t\tif (GameInstance != nullptr && !GameInstance->IsLoadingScreenVisible())\n\t\t\tUSoGameSettings::Get().RunAndApplyHardwareBenchmarkIfRequested();\n\n\t\tif (!BeforeMainMenuScreen->Update(InDeltaTime))\n\t\t\tISoUIEventHandler::Execute_Open(this, true);\n\t}\n\telse if (ActiveState == ESoUIMainMenuState::FadeOut)\n\t{\n\t\tFadeOutCounter += InDeltaTime * 1.2;\n\t\tUpdateFade(FadeOutCurve->GetFloatValue(FMath::Clamp(FadeOutCounter, 0.0f, 1.0f)), FMath::Lerp(1.0f, 0.0f, FadeOutCounter));\n\t\tif (FadeOutCounter > 1.0f)\n\t\t{\n\t\t\tFadeOutCounter = 1.0f;\n\t\t\tSetActiveState(ESoUIMainMenuState::Root);\n\t\t\tUpdateFade(0.0f, 0.0f);\n\t\t}\n\t}\n\telse if (ActiveState == ESoUIMainMenuState::FadeIn)\n\t{\n\t\tFadeOutCounter -= InDeltaTime * 2;\n\t\tUpdateFade(FadeOutCurve->GetFloatValue(FMath::Clamp(FadeOutCounter, 0.0f, 1.0f)), FMath::Lerp(1.0f, 0.0f, FadeOutCounter));\n\t\tif (FadeOutCounter < 0.0f)\n\t\t{\n\t\t\tFadeOutCounter = 0.0f;\n\t\t\tSetActiveState(ESoUIMainMenuState::Root);\n\t\t\tUpdateFade(1.0f, 1.0f);\n\t\t}\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoUIMenuMain::OnUICommand_Implementation(ESoUICommand Command)\n{\n\tCommand = USoUIHelper::TryTranslateMenuCommandDirectionToGame(Command);\n\n\t//UE_LOG(LogSoUIMenuMain, Verbose, TEXT(\"USoUIMenuMain::Command = %s\"), *FSoInputActionName::UICommandToActionName(Command).ToString());\n\tif (!GameInstance)\n\t\treturn false;\n\n\tconst bool bIsLoadingState = GameInstance->IsLoading();\n\n\t// Forward to proper subpanel\n\tif (!bIsLoadingState)\n\t{\n\t\t// Confirm Analytics\n\t\tif (CanHandleConfirmAnalyticsUICommand())\n\t\t{\n\t\t\treturn ISoUIEventHandler::Execute_OnUICommand(ConfirmCollectAnalytics, Command);\n\t\t}\n\n\t\t// Before main menu warning\n\t\tif (CanHandleBeforeMainMenuUICommand())\n\t\t{\n\t\t\treturn BeforeMainMenuScreen->HandleCommand(Command);\n\t\t}\n\n\t\t// Quit Game\n\t\tif (CanHandleConfirmQuitUICommand())\n\t\t{\n\t\t\treturn ISoUIEventHandler::Execute_OnUICommand(ConfirmQuit, Command);\n\t\t}\n\n\t\tif (ActiveState == ESoUIMainMenuState::DisplayCredits)\n\t\t{\n\t\t\tCreditsScreen->HandleCommand(Command);\n\t\t\treturn true;\n\t\t}\n\t}\n\n\t// Open menu, the first time\n\t// NOTE: even when the loading screen is opened\n\tif (!bOpened)\n\t{\n\t\tif (Command == ESoUICommand::EUC_MainMenuBack)\n\t\t{\n\t\t\tUSoAudioManager::PlaySound2D(this, SFXMenuOpenFromGame);\n\t\t\tSetActiveState(ESoUIMainMenuState::FadeIn);\n\t\t\tFadeOutCounter = 1.0f;\n\t\t\tISoUIEventHandler::Execute_Open(this, true);\n\t\t}\n\t\treturn true;\n\t}\n\n\t// We are loading something, loading screen should be up\n\tif (bIsLoadingState)\n\t\treturn false;\n\n\tbool bCommandHandled = false;\n\tconst bool bGameStarted = GameInstance->IsGameStarted();\n\tbool bReturnToRoot = false;\n\tswitch (ActiveState)\n\t{\n\t\tcase ESoUIMainMenuState::Root:\n\t\t{\n\t\t\tswitch (Command)\n\t\t\t{\n\t\t\t\tcase ESoUICommand::EUC_Left:\n\t\t\t\tcase ESoUICommand::EUC_Right:\n\t\t\t\tcase ESoUICommand::EUC_Up:\n\t\t\t\tcase ESoUICommand::EUC_Down:\n\t\t\t\tcase ESoUICommand::EUC_MainMenuEnter:\n\t\t\t\t\tbCommandHandled = true;\n\n\t\t\t\t\t// Navigate on the buttons\n\t\t\t\t\tNavigate(Command);\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase ESoUICommand::EUC_MainMenuBack:\n\t\t\t\t\tbCommandHandled = true;\n\t\t\t\t\tif (bGameStarted)\n\t\t\t\t\t\tEnterGame(true);\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tbreak;\n\n\t\tcase ESoUIMainMenuState::SaveSlots:\n\t\t{\n\t\t\tbCommandHandled = true;\n\n\t\t\t// Forward UI command to save slots panel\n\t\t\tISoUIEventHandler::Execute_OnUICommand(SaveSlotSelectionPanel, Command);\n\n\t\t\t// Check against ActiveState being changed by callbacks from loading saves\n\t\t\tif (ActiveState == ESoUIMainMenuState::SaveSlots)\n\t\t\t\tbReturnToRoot = !ISoUIEventHandler::Execute_IsOpened(SaveSlotSelectionPanel);\n\t\t}\n\t\tbreak;\n\n\t\tcase ESoUIMainMenuState::Challenges:\n\t\t{\n\t\t\tbCommandHandled = true;\n\n\t\t\t// Forward UI command to the challenges panel\n\t\t\t//ISoUIEventHandler::Execute_OnUICommand(ChallengesPanel, Command);\n\t\t\t//\n\t\t\t//if (ActiveState == ESoUIMainMenuState::Challenges)\n\t\t\t//\tbReturnToRoot = !ISoUIEventHandler::Execute_IsOpened(ChallengesPanel);\n\t\t}\n\t\tbreak;\n\n\t\tcase ESoUIMainMenuState::Settings:\n\t\t{\n\t\t\tbCommandHandled = true;\n\n\t\t\t// Forward UI command to settings\n\t\t\tISoUIEventHandler::Execute_OnUICommand(SettingsPanel, Command);\n\n\t\t\t// Was the settings closed? return back to main menu\n\t\t\tif (ActiveState == ESoUIMainMenuState::Settings)\n\t\t\t\tbReturnToRoot = !ISoUIEventHandler::Execute_IsOpened(SettingsPanel);\n\t\t}\n\t\tbreak;\n\n\t\tdefault:\n\t\t\tbreak;\n\t}\n\n\tif (bReturnToRoot)\n\t{\n\t\tSetActiveState(ESoUIMainMenuState::Root);\n\t\tUSoAudioManager::PlaySound2D(this, USoGameSingleton::GetSFX(ESoSFX::MenuReturnToRoot));\n\t}\n\n\treturn bCommandHandled;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIMenuMain::Open_Implementation(bool bOpen)\n{\n\tif (GameInstance == nullptr || bOpened == bOpen)\n\t\treturn;\n\n\tif (ButtonImageToolTipBack)\n\t\tButtonImageToolTipBack->SetVisibility(ESlateVisibility::Collapsed);\n\n\t// Enable/Disable mouse support\n\tif (bOpen)\n\t{\n\t\tUE_LOG(LogSoUIMenuMain, Verbose, TEXT(\"Opening Menu\"));\n\t\tbPreviousIsMouseAllowed = USoPlatformHelper::IsMouseAllowed(this);\n\t\tUSoPlatformHelper::AllowMouse(this);\n\t}\n\telse\n\t{\n\t\tUE_LOG(LogSoUIMenuMain, Verbose, TEXT(\"Closing Menu\"));\n\n\t\t// Only disable if previous state was not to allow mouse\n\t\tif (!bPreviousIsMouseAllowed)\n\t\t{\n\t\t\tUSoPlatformHelper::DisallowMouse(this);\n\t\t}\n\t}\n\n\t// Announce menu state change\n\tGameInstance->OnMenuStateChange(bOpen);\n\n\t// Initialize audio if not already.\n\tGameInstance->InitializeAudio();\n\n\tbPressedExitGameAlways = false;\n\tbOpened = bOpen;\n\n\tif (SoCharacter != nullptr)\n\t\tSoCharacter->SetGameInputBlockedByUI(bOpened);\n\n\t// Select first valid option\n\t// NOTE: here before opening any menu\n\tif (bOpen)\n\t\tRefreshButtonContainer();\n\n\t// do not hide yet if it's a \"return to game\" case so we can display an animation\n\t// aka let the fade out animation play out\n\tif (ActiveState != ESoUIMainMenuState::FadeOut)\n\t\tSetVisibility(bOpen ? ESlateVisibility::Visible : ESlateVisibility::Collapsed);\n\n\t// Pause game\n\tUSoPlatformHelper::SetGamePaused(this, bOpen && !GameInstance->IsMenu());\n\n\tif (bOpen)\n\t{\n\t\tif (ActiveState != ESoUIMainMenuState::FadeIn)\n\t\t{\n\t\t\t// instant fade in\n\t\t\tUpdateFade(1.0f, 1.0f);\n\t\t\tFadeOutCounter = 0.0f;\n\t\t}\n\n\t\tif (ISoUIEventHandler::Execute_IsOpened(SaveSlotSelectionPanel))\n\t\t\tISoUIEventHandler::Execute_Open(SaveSlotSelectionPanel, false);\n\n#if !WARRIORB_WITH_EDITOR\n\t\t//OpenConfirmCollectAnalytics();\n\t\tOpenPanelBeforeMainMenu(BeforeMainMenuScreen);\n#endif // !WARRIORB_WITH_EDITOR\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIMenuMain::InstantOpen(bool bOpen)\n{\n\t// Reset animations\n\tStopAllAnimations();\n\tif (ActiveState == ESoUIMainMenuState::FadeOut || ActiveState == ESoUIMainMenuState::FadeIn)\n\t\tSetActiveState(ESoUIMainMenuState::Root);\n\n\tISoUIEventHandler::Execute_Open(this, bOpen);\n\n\t// Force visibility\n\tSetVisibility(bOpen ? ESlateVisibility::Visible : ESlateVisibility::Collapsed);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoUIMenuMain::CanHandleConfirmAnalyticsUICommand() const\n{\n\treturn ::IsValid(ConfirmCollectAnalytics) && ConfirmCollectAnalytics->CanHandleUICommand();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoUIMenuMain::OpenConfirmCollectAnalytics()\n{\n\tif (!ConfirmCollectAnalytics)\n\t\treturn false;\n\n\tif (USoGameSettings::Get().WasCollectAnalyticsSetByUser())\n\t\treturn false;\n\n\t// Open the confirm panel\n\tISoUIEventHandler::Execute_Open(ConfirmCollectAnalytics, true);\n\n\treturn true;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoUIMenuMain::CanHandleConfirmQuitUICommand() const\n{\n\treturn ::IsValid(ConfirmQuit) && ConfirmQuit->CanHandleUICommand();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIMenuMain::OnConfirmQuestionAnswered()\n{\n\tif (ConfirmQuit->IsAnswerYes())\n\t{\n\t\tswitch (ActiveState)\n\t\t{\n\t\t\tcase ESoUIMainMenuState::ConfirmRestart:\n\t\t\t\tCleanupAfterConfirmQuestion();\n\t\t\t\tUE_LOG(LogSoUIMenuMain, Verbose, TEXT(\"Restarting demo\"));\n\t\t\t\tGameInstance->LoadGameFromCurrentState(true);\n\t\t\t\tEnterGame(true);\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tQuitGame();\n\t\t}\n\t}\n\telse if (!CanHandleConfirmQuitUICommand())\n\t{\n\t\t// Can no longer handle, cleanup\n\t\tCleanupAfterConfirmQuestion();\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoUIMenuMain::OpenConfirmQuit()\n{\n\tif (!ConfirmQuit)\n\t\treturn false;\n\n\t// Set the correct texts\n\tconst bool bGameStarted = GameInstance ? GameInstance->IsGameStarted() : false;\n\n\tif (bGameStarted)\n\t{\n\t\tif (bPressedExitGameAlways)\n\t\t{\n\t\t\tConfirmQuit->SetTexts(\n\t\t\t\tFROM_STRING_TABLE_UI(\"quit_game_question\"),\n\t\t\t\tFROM_STRING_TABLE_UI(\"progress_saved\")\n\t\t\t);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tConfirmQuit->SetTexts(\n\t\t\t\tFROM_STRING_TABLE_UI(\"quit_to_menu_question\"),\n\t\t\t\tFROM_STRING_TABLE_UI(\"progress_saved\")\n\t\t\t);\n\t\t}\n\t}\n\telse\n\t{\n\t\tConfirmQuit->SetTexts(\n\t\t\tFROM_STRING_TABLE_UI(\"quit_game_question\"),\n\t\t\tFText::GetEmpty()\n\t\t);\n\n\t\tSetTitleVisibility(false);\n\t}\n\n\t// Open the confirm panel\n\tSetForcedVisibilityOfMainMenuElements(ESlateVisibility::Collapsed);\n\tISoUIEventHandler::Execute_Open(ConfirmQuit, true);\n\n\t// Set directly to avoid widget visibilities update\n\tActiveState = ESoUIMainMenuState::ConfirmQuit;\n\n\treturn true;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIMenuMain::OpenConfirmRestart()\n{\n\tif (ConfirmQuit == nullptr)\n\t\treturn;\n\n\tConfirmQuit->SetTexts(\n\t\tFROM_STRING_TABLE_UI(\"restart_game_question\"),\n\t\tFROM_STRING_TABLE_UI(\"restart_game_warning\")\n\t);\n\n\tconst bool bGameStarted = GameInstance ? GameInstance->IsGameStarted() : false;\n\tif (!bGameStarted)\n\t{\n\t\tSetTitleVisibility(false);\n\t}\n\n\t// Open the confirm panel\n\tSetForcedVisibilityOfMainMenuElements(ESlateVisibility::Collapsed);\n\tISoUIEventHandler::Execute_Open(ConfirmQuit, true);\n\n\t// Set directly to avoid widget visibilities update\n\tActiveState = ESoUIMainMenuState::ConfirmRestart;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIMenuMain::CleanupAfterConfirmQuestion()\n{\n\tISoUIEventHandler::Execute_Open(ConfirmQuit, false);\n\n\t// Reset to the current state\n\tbPressedExitGameAlways = false;\n\tSetActiveState(ESoUIMainMenuState::Root);\n\n\tif (MainBackgroundTitle)\n\t{\n\t\tconst bool bGameStarted = GameInstance ? GameInstance->IsGameStarted() : false;\n\t\tSetTitleVisibility(!bGameStarted);\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoUIMenuMain::CanHandleBeforeMainMenuUICommand() const\n{\n\treturn ::IsValid(BeforeMainMenuScreen) && BeforeMainMenuScreen->IsOpened();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoUIMenuMain::OpenPanelBeforeMainMenu(USoInGameUIActivity* InBeforeMainMenuScreen)\n{\n\tBeforeMainMenuScreen = InBeforeMainMenuScreen;\n\n\tif (!BeforeMainMenuScreen)\n\t\treturn false;\n\n\tif (GameInstance->IsBeforeMenuShownOnce())\n\t\treturn false;\n\n\t// Open before main menu\n\tGameInstance->SetBeforeMenuShownOnce(true);\n\tBeforeMainMenuScreen->SetInGameActivityEnabled(nullptr, true);\n\n#if PLATFORM_XBOXONE\n\tUSoOnlineHelper::SpawnLocalPlayers(this);\n#endif\n\n\treturn true;\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIMenuMain::CloseAllChildrenWidgets()\n{\n\tif (SaveSlotSelectionPanel)\n\t\tISoUIEventHandler::Execute_Open(SaveSlotSelectionPanel, false);\n\n\t//if (ChallengesPanel)\n\t//\tChallengesPanel->InstantOpen(false);\n\n\tif (SettingsPanel)\n\t\tSettingsPanel->InstantOpen(false);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIMenuMain::AddContainerButton(USoUIButton* Button)\n{\n\tButton->SetVisibility(ESlateVisibility::Visible);\n\tSuper::AddContainerButton(Button);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIMenuMain::SetActiveState(ESoUIMainMenuState State)\n{\n\tActiveState = State;\n\n\tswitch (ActiveState)\n\t{\n\tcase ESoUIMainMenuState::Root:\n\t\tCloseAllChildrenWidgets();\n\t\tSetVisibility(bOpened ? ESlateVisibility::Visible : ESlateVisibility::Collapsed);\n\t\tbreak;\n\n\tcase ESoUIMainMenuState::SaveSlots:\n\t\tISoUIEventHandler::Execute_Open(SaveSlotSelectionPanel, true);\n\t\tbreak;\n\n\tcase ESoUIMainMenuState::Challenges:\n\t\t// ISoUIEventHandler::Execute_Open(ChallengesPanel, true);\n\t\tbreak;\n\n\tcase ESoUIMainMenuState::Settings:\n\t\tISoUIEventHandler::Execute_Open(SettingsPanel, true);\n\t\tbreak;\n\n\tcase ESoUIMainMenuState::DisplayCredits:\n\t\tCreditsScreen->FadeIn(true);\n\t\t// no need to hide anything on credits request\n\t\treturn;\n\n\tdefault:\n\t\tbreak;\n\t}\n\n\t// Update visibilities\n\tUpdateWidgetsVisibilities();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIMenuMain::CreateChildrenAndSetTexts()\n{\n\tRefreshExternalLinksButtonOptions();\n\tEmptyContainerChildren();\n\tTArray<FText> ChildrenTexts;\n\n\tfor (const ESoUIMainMenuButton Option : ButtonOptions)\n\t{\n\t\tswitch (Option)\n\t\t{\n\t\t\tcase ESoUIMainMenuButton::Continue:\n\t\t\t\tAddContainerButton(Continue);\n\t\t\t\tChildrenTexts.Add(FROM_STRING_TABLE_UI(\"continue\"));\n\t\t\t\tbreak;\n\t\t\tcase ESoUIMainMenuButton::RestartFromSK:\n\t\t\t\tAddContainerButton(RestartFromSK);\n\t\t\t\tChildrenTexts.Add(FROM_STRING_TABLE_UI(\"teleport_to_sk\"));\n\t\t\t\tbreak;\n\t\t\tcase ESoUIMainMenuButton::RestartFromCP:\n\t\t\t\tAddContainerButton(RestartFromCP);\n\t\t\t\tChildrenTexts.Add(FROM_STRING_TABLE_UI(\"teleport_to_cp\"));\n\t\t\t\tbreak;\n\t\t\tcase ESoUIMainMenuButton::Load:\n\t\t\t\tAddContainerButton(Load);\n\t\t\t\tChildrenTexts.Add(FROM_STRING_TABLE_UI(\"saves\"));\n\t\t\t\tbreak;\n\t\t\tcase ESoUIMainMenuButton::Challenges:\n\t\t\t\tAddContainerButton(Challenges);\n\t\t\t\tChildrenTexts.Add(FROM_STRING_TABLE_UI(\"custom_maps\"));\n\t\t\t\tbreak;\n\t\t\tcase ESoUIMainMenuButton::Settings:\n\t\t\t\tAddContainerButton(Settings);\n\t\t\t\tChildrenTexts.Add(FROM_STRING_TABLE_UI(\"settings\"));\n\t\t\t\tbreak;\n\t\t\tcase ESoUIMainMenuButton::Credits:\n\t\t\t\tAddContainerButton(Credits);\n\t\t\t\tChildrenTexts.Add(FROM_STRING_TABLE_UI(\"credits\"));\n\t\t\t\tbreak;\n\t\t\tcase ESoUIMainMenuButton::ExitGameAlways:\n\t\t\t\tAddContainerButton(ExitGameAlways);\n\t\t\t\tChildrenTexts.Add(FROM_STRING_TABLE_UI(\"quit_game\"));\n\t\t\t\tbreak;\n\t\t\tcase ESoUIMainMenuButton::Exit:\n\t\t\t\tAddContainerButton(Exit);\n\t\t\t\tChildrenTexts.Add(FROM_STRING_TABLE_UI(\"quit_game\"));\n\t\t\t\tbreak;\n\t\t\tcase ESoUIMainMenuButton::ChangeUser:\n\t\t\t\tAddContainerButton(ChangeUser);\n\t\t\t\tChildrenTexts.Add(FROM_STRING_TABLE_UI(\"change_user\"));\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tcheckNoEntry();\n\t\t\t\tbreak;\n\t\t}\n\t}\n\tcheck(NumContainerChildren() == ChildrenTexts.Num());\n\tcheck(NumContainerChildren() == ButtonOptions.Num());\n\tSetButtonsTexts(ChildrenTexts);\n\n\tContinue->Activate();\n\tif (Load != nullptr)\n\t\tLoad->Activate();\n\tChallenges->Activate();\n\tSettings->Activate();\n\tCredits->Activate();\n\tExit->Activate();\n\n\tif (ChangeUser != nullptr)\n\t\tChangeUser->Activate();\n\n\t// Set External links\n\tEmptyExtraAttachedChildren();\n\tfor (const ESoUIMainMenuExternalLinkButton Option : ExternalLinksButtonOptions)\n\t{\n\t\tswitch (Option)\n\t\t{\n\t\tcase ESoUIMainMenuExternalLinkButton::Discord:\n\t\t\tif (ExternalLinkDiscord)\n\t\t\t\tAddExtraAttachedChild(ExternalLinkDiscord);\n\t\t\tbreak;\n\t\tcase ESoUIMainMenuExternalLinkButton::Twitter:\n\t\t\tif (ExternalLinkTwitter)\n\t\t\t\tAddExtraAttachedChild(ExternalLinkTwitter);\n\t\t\tbreak;\n\t\tcase ESoUIMainMenuExternalLinkButton::SteamMainGame:\n\t\t\tif (ExternalLinkSteamMainGame)\n\t\t\t\tAddExtraAttachedChild(ExternalLinkSteamMainGame);\n\t\t\tbreak;\n\n\t\tcase ESoUIMainMenuExternalLinkButton::MailingList:\n\t\t\tif (ExternalLinkMailingList)\n\t\t\t\tAddExtraAttachedChild(ExternalLinkMailingList);\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tcheckNoEntry();\n\t\t\tbreak;\n\t\t}\n\t}\n\n\t// check(ExternalLinksButtonOptions.Num() == NumExtraAttachedChildren());\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIMenuMain::UpdateButtonTexts()\n{\n\tif (!GameInstance)\n\t\treturn;\n\n\tconst bool bGameStarted = GameInstance->IsGameStarted();\n\tif (Continue)\n\t{\n\t\tif (bGameStarted)\n\t\t\tContinue->SetButtonText(FROM_STRING_TABLE_UI(\"continue\"));\n\t\telse\n\t\t\tContinue->SetButtonText(FROM_STRING_TABLE_UI(\"start_game\"));\n\t}\n\n\tif (Exit)\n\t{\n\t\tif (bGameStarted)\n\t\t\tExit->SetButtonText(FROM_STRING_TABLE_UI(\"quit_to_menu\"));\n\t\telse\n\t\t\tExit->SetButtonText(FROM_STRING_TABLE_UI(\"quit_game\"));\n\t}\n\n\t// override button texts for demo\n\tif (USoPlatformHelper::IsDemo() && GameInstance->CanContinueGame())\n\t{\n\t\tContinue->SetButtonText(FROM_STRING_TABLE_UI(\"continue\"));\n\t\tLoad->SetButtonText(FROM_STRING_TABLE_UI(\"restart\"));\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoUIMenuMain::AreExternalLinksVisible() const\n{\n\treturn ActiveState == ESoUIMainMenuState::Root || ActiveState == ESoUIMainMenuState::FadeIn;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIMenuMain::UpdateWidgetsVisibilities()\n{\n\tconst bool bGameStarted = GameInstance ? GameInstance->IsGameStarted() : false;\n\tif (MainBackgroundColor)\n\t\tMainBackgroundColor->SetVisibility(bGameStarted ? ESlateVisibility::Collapsed : ESlateVisibility::Visible);\n\n\tif (ButtonImageToolTipBack)\n\t\tButtonImageToolTipBack->SetVisibility(ActiveState == ESoUIMainMenuState::Root || IsFading() ? ESlateVisibility::Collapsed : ESlateVisibility::Visible);\n\n\tif (MainBackgroundImage)\n\t\tMainBackgroundImage->SetVisibility(bGameStarted ? ESlateVisibility::Collapsed : ESlateVisibility::Visible);\n\n\tif (MainBackgroundImageVFX)\n\t\tMainBackgroundImageVFX->SetVisibility(bGameStarted ? ESlateVisibility::Collapsed : ESlateVisibility::Visible);\n\n\tif (DeathCountText)\n\t\tDeathCountText->SetVisibility(bGameStarted ? ESlateVisibility::Visible : ESlateVisibility::Collapsed);\n\tif (DeathCountIcon)\n\t\tDeathCountIcon->SetVisibility(bGameStarted ? ESlateVisibility::Visible : ESlateVisibility::Collapsed);\n\tif (bGameStarted && SoCharacter != nullptr && SoCharacter->GetPlayerProgress() != nullptr)\n\t{\n\t\tFNumberFormattingOptions Format;\n\t\tFormat.SetUseGrouping(false);\n\t\tDeathCountText->SetText(FText::AsNumber(SoCharacter->GetPlayerProgress()->GetStatsFromAllSession().TotalDeathNum, &Format));\n\t}\n\n\tSetTitleVisibility(!bGameStarted && ActiveState != ESoUIMainMenuState::SaveSlots);\n\n\tif (TextControllerRecommended)\n\t\tTextControllerRecommended->SetShouldBeVisible(!bGameStarted);\n\n\tif (ExternalLinksContainer)\n\t\tExternalLinksContainer->SetVisibility(AreExternalLinksVisible() ? ESlateVisibility::Visible : ESlateVisibility::Collapsed);\n\n\tif (ActiveState != ESoUIMainMenuState::SaveSlots)\n\t\tShowContainer();\n\telse\n\t\tHideContainer();\n\n\tif (MenuButtonsBackground)\n\t\tMenuButtonsBackground->SetVisibility(ESlateVisibility::Visible);\n\n\tif (ExternalLinkSteamMainGame)\n\t{\n\t\tExternalLinkSteamMainGame->SetVisibility(\n\t\t\tExternalLinksButtonOptions.Contains(ESoUIMainMenuExternalLinkButton::SteamMainGame) ?\n\t\t\tESlateVisibility::Visible : ESlateVisibility::Collapsed\n\t\t);\n\t}\n\n\tif (ExternalLinkTwitter)\n\t{\n\t\tExternalLinkTwitter->SetVisibility(\n\t\t\tExternalLinksButtonOptions.Contains(ESoUIMainMenuExternalLinkButton::Twitter) ?\n\t\t\tESlateVisibility::Visible : ESlateVisibility::Collapsed\n\t\t);\n\t}\n\n\tif (ExternalLinkDiscord)\n\t{\n\t\tExternalLinkDiscord->SetVisibility(\n\t\t\tExternalLinksButtonOptions.Contains(ESoUIMainMenuExternalLinkButton::Discord) ?\n\t\t\tESlateVisibility::Visible : ESlateVisibility::Collapsed\n\t\t);\n\t}\n\n\tif (ExternalLinkMailingList)\n\t{\n\t\tExternalLinkMailingList->SetVisibility(\n\t\t\tExternalLinksButtonOptions.Contains(ESoUIMainMenuExternalLinkButton::MailingList) ?\n\t\t\tESlateVisibility::Visible : ESlateVisibility::Collapsed\n\t\t);\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIMenuMain::SetForcedVisibilityOfMainMenuElements(ESlateVisibility NewVisibility)\n{\n\tif (ExternalLinksContainer)\n\t\tExternalLinksContainer->SetVisibility(NewVisibility);\n\tif (TextControllerRecommended)\n\t\tTextControllerRecommended->SetVisibility(NewVisibility);\n\tif (Container)\n\t\tContainer->SetVisibility(NewVisibility);\n\tif (MenuButtonsBackground)\n\t\tMenuButtonsBackground->SetVisibility(NewVisibility);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIMenuMain::OnHandleButtonPress(int32 SelectedChild, USoUIUserWidget* SoUserWidget)\n{\n\tif (SoCharacter == nullptr || SoUserWidget == nullptr || !IsValidIndex(SelectedChild))\n\t\treturn;\n\n\t// SFX\n\tSoUserWidget->NavigateOnPressed(true);\n\n\t// External link handled\n\tif (IsIndexForExtraAttachedChildren(SelectedChild))\n\t{\n\t\treturn;\n\t}\n\n\t// ignore button press\n\tif (ActiveState == ESoUIMainMenuState::DisplayCredits)\n\t\treturn;\n\n\tconst ESoUIMainMenuButton SelectedButton = GetButtonOptions()[SelectedChild];\n\tswitch (SelectedButton)\n\t{\n\t\tcase ESoUIMainMenuButton::Continue:\n\t\t\tOnContinueButtonPressed();\n\t\t\tbreak;\n\n\t\tcase ESoUIMainMenuButton::RestartFromSK:\n\t\t\tEnterGame(true);\n\t\t\tSoCharacter->Revive(true);\n\t\t\tUSoAudioManager::PlaySound2D(this, SFXTeleportToSoulKeeper);\n\t\t\tbreak;\n\n\t\tcase ESoUIMainMenuButton::RestartFromCP:\n\t\t\tEnterGame(true);\n\t\t\tSoCharacter->Revive(false);\n\t\t\tUSoAudioManager::PlaySound2D(this, SFXTeleportToCheckpoint);\n\t\t\tbreak;\n\n\t\tcase ESoUIMainMenuButton::Load:\n\t\t\tOnLoadButtonPressed();\n\t\t\tbreak;\n\n\t\tcase ESoUIMainMenuButton::Challenges:\n\t\t\t// SetActiveState(ESoUIMainMenuState::Challenges);\n\t\t\tbreak;\n\n\t\tcase ESoUIMainMenuButton::Settings:\n\t\t\tSetActiveState(ESoUIMainMenuState::Settings);\n\t\t\tbreak;\n\n\t\tcase ESoUIMainMenuButton::Credits:\n\t\t\tSetActiveState(ESoUIMainMenuState::DisplayCredits);\n\t\t\tbreak;\n\n\t\tcase ESoUIMainMenuButton::ExitGameAlways:\n\t\t\tbPressedExitGameAlways = true;\n\t\t\tOpenConfirmQuit();\n\t\t\tbreak;\n\n\t\tcase ESoUIMainMenuButton::Exit:\n\t\t\tOpenConfirmQuit();\n\t\t\tbreak;\n\n\t\tcase ESoUIMainMenuButton::ChangeUser:\n\t\t\tUSoOnlineHelper::ShowExternalLoginUI(GameInstance);\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tbreak;\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIMenuMain::OnContinueButtonPressed()\n{\n\tverify(GameInstance);\n\n\t// Load the proper map\n\tif (GameInstance->IsGameStarted())\n\t{\n\t\tUE_LOG(LogSoUIMenuMain, Verbose, TEXT(\"Not loading game because game is already started\"));\n\t\tEnterGame(true);\n\t}\n\telse\n\t{\n\t\tif (USoPlatformHelper::IsDemo())\n\t\t{\n\t\t\tGameInstance->LoadGameFromCurrentState(false);\n\t\t\tEnterGame(false);\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// Load game\n\t\t\tSetActiveState(ESoUIMainMenuState::SaveSlots);\n\t\t}\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIMenuMain::OnLoadButtonPressed()\n{\n\tif (USoPlatformHelper::IsDemo())\n\t{\n\t\tOpenConfirmRestart();\n\t}\n\telse\n\t{\n\t\t// Load Game\n\t\tSetActiveState(ESoUIMainMenuState::SaveSlots);\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIMenuMain::EnterGame(bool bFadeOutMenu)\n{\n\tif (!GameInstance || !GameInstance->IsGameStarted())\n\t\treturn;\n\n\t// Game entered\n\tif (bFadeOutMenu)\n\t{\n\t\tUSoAudioManager::PlaySound2D(this, SFXMenuReturnToGame);\n\t\tSetActiveState(ESoUIMainMenuState::FadeOut);\n\t\tFadeOutCounter = 0.0f;\n\t}\n\n\t// Unpause/close this menu\n\tISoUIEventHandler::Execute_Open(this, false);\n\n\tUSoPlatformHelper::SetGamePaused(this, false);\n\tGameInstance->SetGameStarted(true);\n\n\t// if already in ui (maybe dialogue) music update is not needed\n\tif (SoCharacter->GetActivity() != EActivity::EA_InUI)\n\t\tSoCharacter->UpdateMusic(true);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIMenuMain::QuitGame()\n{\n\tconst bool bGameStarted = GameInstance ? GameInstance->IsGameStarted() : false;\n\n\tif (bGameStarted)\n\t{\n\t\tif (bPressedExitGameAlways)\n\t\t{\n\t\t\t// Quit\n\t\t\t// NOTE: save is done in PreExit in the Engine\n\t\t\tUSoPlatformHelper::QuitGame(GetWorld());\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// Return to main menu\n\t\t\t// NOTE: save is performed in teleport\n\t\t\tif (GameInstance)\n\t\t\t\tGameInstance->TeleportToMainMenu(true);\n\t\t}\n\t}\n\telse\n\t{\n\t\t// Quit\n\t\tUSoPlatformHelper::QuitGame(GetWorld());\n\t}\n\n\tbPressedExitGameAlways = false;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIMenuMain::HandleSaveSlotLoaded(int32 SaveSlotIndex)\n{\n\tEnterGame(false);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nTArray<ESoUIMainMenuButton>& USoUIMenuMain::GetButtonOptions()\n{\n\treturn ButtonOptions;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIMenuMain::RefreshButtonOptions()\n{\n\tButtonOptions = { ESoUIMainMenuButton::Continue };\n\n\t// Add teleport options\n\tif (GameInstance->IsGameStarted())\n\t{\n\t\tif (GameInstance->CanHaveSoulKeeper())\n\t\t\tButtonOptions.Add(ESoUIMainMenuButton::RestartFromSK);\n\n\t\tButtonOptions.Add(ESoUIMainMenuButton::RestartFromCP);\n\t}\n\n\t// Not available in the demo\n\n\tif (USoPlatformHelper::IsDemo())\n\t{\n\t\t// Use as restart game\n\t\tif (GameInstance->CanContinueGame())\n\t\t\tButtonOptions.Add(ESoUIMainMenuButton::Load);\n\t}\n\telse\n\t{\n\t\t// TODO fix this\n\t\t// if (USoGameSettings::Get().AreCustomMapsEnabled())\n\t\t\t// ButtonOptions.Add(ESoUIMainMenuButton::Challenges);\n\n\t\tif (GameInstance->IsGameStarted())\n\t\t\tButtonOptions.Add(ESoUIMainMenuButton::Load);\n\t}\n\n\tButtonOptions.Add(ESoUIMainMenuButton::Settings);\n\n\tif (!USoPlatformHelper::IsDemo())\n\t\tif (!GameInstance->IsGameStarted())\n\t\t\tButtonOptions.Add(ESoUIMainMenuButton::Credits);\n\n\tif (USoPlatformHelper::IsConsole())\n\t{\n\t\tif (GameInstance->IsGameStarted())\n\t\t\tButtonOptions.Add(ESoUIMainMenuButton::Exit); // this one brings you back to the menu\n\t\telse\n\t\t{\n\t\t\tif (!USoPlatformHelper::IsSwitch())\n\t\t\t\tButtonOptions.Add(ESoUIMainMenuButton::ChangeUser);\n\t\t}\n\t}\n\telse\n\t{\n\t\tButtonOptions.Add(ESoUIMainMenuButton::Exit);\n\n\t\t// Quit game only if game started\n\t\tif (GameInstance->IsGameStarted())\n\t\t\tButtonOptions.Add(ESoUIMainMenuButton::ExitGameAlways);\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIMenuMain::RefreshExternalLinksButtonOptions()\n{\n\t// External link\n\tExternalLinksButtonOptions = {\n#if !PLATFORM_SWITCH\n\t\tESoUIMainMenuExternalLinkButton::Discord,\n\t\tESoUIMainMenuExternalLinkButton::MailingList,\n\t\tESoUIMainMenuExternalLinkButton::Twitter\n#endif\n\t};\n\n\tif (USoPlatformHelper::IsSteamBuildPirated() || (USoPlatformHelper::IsDemo() && !USoPlatformHelper::IsConsole()))\n\t\tExternalLinksButtonOptions.Add(ESoUIMainMenuExternalLinkButton::SteamMainGame);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIMenuMain::RefreshButtonContainer()\n{\n\tif (Container == nullptr)\n\t\treturn;\n\n\tRefreshButtonOptions();\n\tEmptyContainerChildren(true);\n\n\tfor (const ESoUIMainMenuButton Option : GetButtonOptions())\n\t{\n\t\tswitch (Option)\n\t\t{\n\t\tcase ESoUIMainMenuButton::Continue:\n\t\t\tAddContainerButton(Continue);\n\t\t\tbreak;\n\t\tcase ESoUIMainMenuButton::RestartFromSK:\n\t\t\tAddContainerButton(RestartFromSK);\n\t\t\tbreak;\n\t\tcase ESoUIMainMenuButton::RestartFromCP:\n\t\t\tAddContainerButton(RestartFromCP);\n\t\t\tbreak;\n\t\tcase ESoUIMainMenuButton::Load:\n\t\t\tAddContainerButton(Load);\n\t\t\tbreak;\n\t\tcase ESoUIMainMenuButton::Challenges:\n\t\t\tAddContainerButton(Challenges);\n\t\t\tbreak;\n\t\tcase ESoUIMainMenuButton::Settings:\n\t\t\tAddContainerButton(Settings);\n\t\t\tbreak;\n\t\tcase ESoUIMainMenuButton::Credits:\n\t\t\tAddContainerButton(Credits);\n\t\t\tbreak;\n\t\tcase ESoUIMainMenuButton::ExitGameAlways:\n\t\t\tAddContainerButton(ExitGameAlways);\n\t\t\tbreak;\n\t\tcase ESoUIMainMenuButton::Exit:\n\t\t\tAddContainerButton(Exit);\n\t\t\tbreak;\n\n\t\tcase ESoUIMainMenuButton::ChangeUser:\n\t\t\tAddContainerButton(ChangeUser);\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tcheckNoEntry();\n\t\t\tbreak;\n\t\t}\n\t}\n\n\tUpdateButtonsActivations();\n\tSelectFirstValidChild();\n\tUpdateWidgetsVisibilities();\n\tUpdateButtonTexts();\n\n\tcheckf(ButtonOptions.Num() == NumContainerChildren(), TEXT(\"Learn how to properly code\"));\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIMenuMain::UpdateButtonsActivations()\n{\n\t// Continue is disabled if the game is completed\n\tbool bIsContinueActive = true;\n\tconst bool bGameStarted = GameInstance->IsGameStarted();\n\n\tif (USoPlatformHelper::IsDemo())\n\t{\n\t\tif (GameInstance->IsMenu() || !bGameStarted)\n\t\t{\n\t\t\tbIsContinueActive = !FSoWorldState::Get().IsGameCompleted();\n\t\t}\n\t}\n\tif (Continue)\n\t\tContinue->SetIsActive(bIsContinueActive);\n\n\tconst bool bTeleportBlocked = SoCharacter != nullptr && SoCharacter->SoActivity != nullptr && SoCharacter->SoActivity->BlocksTeleportRequest();\n\tconst bool bTeleportAllowed = !bTeleportBlocked && bGameStarted && SoCharacter != nullptr;\n\n\t// Activate/Deactivate restart buttons\n\tif (RestartFromSK)\n\t\tRestartFromSK->SetIsActive(bTeleportAllowed && SoCharacter->IsSoulkeeperActive() && SoCharacter->CanUseSoulkeeperAtLocation());\n\n\tif (RestartFromCP)\n\t\tRestartFromCP->SetIsActive(bTeleportAllowed && SoCharacter->GetActiveCheckpointLocationName() != NAME_None);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIMenuMain::UpdateFade(float FadeValue, float BackgroundAlpha)\n{\n\tstatic const FName SoFadeStrParamName = FName(\"FadeStr\");\n\tif (RootRetainer->GetEffectMaterial() != nullptr)\n\t\tRootRetainer->GetEffectMaterial()->SetScalarParameterValue(SoFadeStrParamName, FadeValue);\n\n\tBackgroundFade->SetColorAndOpacity(FLinearColor(1.0f, 1.0f, 1.0f, BackgroundAlpha));\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIMenuMain::SetTitleVisibility(bool bVisible)\n{\n\tif (MainBackgroundTitle != nullptr)\n\t\tMainBackgroundTitle->SetVisibility(bVisible ? ESlateVisibility::Visible : ESlateVisibility::Collapsed);\n\n\tif (MainBackgroundTitleSpacer != nullptr)\n\t\tMainBackgroundTitleSpacer->SetVisibility(bVisible ? ESlateVisibility::Visible : ESlateVisibility::Collapsed);\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIMenuMain::OnCreditsFadeOutFinished()\n{\n\tSetActiveState(ESoUIMainMenuState::Root);\n}\n"
  },
  {
    "path": "Source/SOrb/UI/Menu/SoUIMenuMain.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#pragma once\n\n#include \"CoreMinimal.h\"\n#include \"UI/General/Buttons/SoUIButtonArray.h\"\n#include \"UI/General/SoUITypes.h\"\n\n#include \"SoUIMenuMain.generated.h\"\n\nclass USoUISettings;\nclass USoUISaveSlotSelection;\nclass USoInGameUIActivity;\nclass USoUIChallenges;\nclass USoUICommandTooltip;\nclass USoUIContainerNamedSlot;\nclass UFMODEvent;\nclass USoGameInstance;\nclass USoUIExternalLink;\nclass UImage;\nclass USpacer;\nclass UTextBlock;\nclass URetainerBox;\nclass USoUIConfirmPanel;\nclass USoUIConfirmQuestion;\nclass USoUIButtonImage;\nclass USoUICredits;\n\nUENUM(BlueprintType)\nenum class ESoUIMainMenuButton : uint8\n{\n\tContinue = 0 \t\tUMETA(DisplayName = \"Continue\"),\n\tRestartFromSK\t\tUMETA(DisplayName = \"Restart From SoulKeeper\"),\n\tRestartFromCP\t\tUMETA(DisplayName = \"Restart From Checkpoint\"),\n\tLoad\t\t\t\tUMETA(DisplayName = \"Load\"),\n\tChallenges\t\t\tUMETA(DisplayName = \"Challenges\"),\n\tSettings\t\t\tUMETA(DisplayName = \"Settings\"),\n\n\tCredits\t\t\t\tUMETA(DisplayName = \"Credits\"),\n\tExitGameAlways\t\tUMETA(DisplayName = \"ExitGameAlways\"),\n\tExit\t\t\t\tUMETA(DisplayName = \"Exit\"),\n\n\tChangeUser\t\t\tUMETA(DisplayName = \"ChangeUser\"),\n\n\tNumOf\t\t\t\tUMETA(meta = Hidden)\n};\n\nUENUM(BlueprintType)\nenum class ESoUIMainMenuExternalLinkButton : uint8\n{\n\tDiscord = 0\t\tUMETA(DisplayName = \"Discord\"),\n\tTwitter\t\t\tUMETA(DisplayName = \"Twitter\"),\n\tSteamMainGame   UMETA(DisplayName = \"Steam Main Game\"),\n\tMailingList\t\tUMETA(DisplayName = \"MailingList\"),\n\n\tNumOf\t\t\tUMETA(meta = Hidden)\n};\n\n\nUENUM(BlueprintType)\nenum class ESoUIMainMenuState : uint8\n{\n\t// only the buttons are visible\n\tRoot\t\t\t\tUMETA(DisplayName = \"Root\"),\n\n\tSettings\t\t\tUMETA(DisplayName = \"Settings\"),\n\tSaveSlots\t\t\tUMETA(DisplayName = \"SaveSlots\"),\n\tChallenges\t\t\tUMETA(DisplayName = \"Challenges\"),\n\n\tFadeIn\t\t\t\tUMETA(DisplayName = \"FadeIn\"),\n\tFadeOut\t\t\t\tUMETA(DisplayName = \"FadeOut\"),\n\n\tConfirmQuit\t\t\tUMETA(DisplayName = \"ConfirmQuit\"),\n\tConfirmRestart\t\tUMETA(DisplayName = \"ConfirmRestart\"),\n\n\tDisplayCredits\t\tUMETA(DisplayName = \"DisplayCredits\"),\n\n\tNumOf\t\t\t\tUMETA(meta = Hidden)\n};\n\n\nUCLASS()\nclass SORB_API USoUIMenuMain : public USoUIButtonArray, public ISoUIEventHandler\n{\n\tGENERATED_BODY()\n\npublic:\n\t//\n\t// Begin UUserWidget Interface\n\t//\n\tvoid SynchronizeProperties() override;\n\tvoid NativeConstruct() override;\n\tvoid NativeDestruct() override;\n\tvoid NativeTick(const FGeometry& MyGeometry, float InDeltaTime) override;\n\n\t//\n\t// ISoUIEventHandler Interface\n\t//\n\tbool OnUICommand_Implementation(ESoUICommand Command) override;\n\tvoid Open_Implementation(bool bOpen) override;\n\tbool IsOpened_Implementation() const override { return bOpened; }\n\tbool CanBeInterrupted_Implementation() const override { return true; }\n\n\t// No animation\n\tvoid InstantOpen(bool bOpen);\n\nprotected:\n\t//\n\t// USoUIButtonArray\n\t//\n\tbool IsValidWidget() const override { return Super::IsValidWidget() && ActiveState == ESoUIMainMenuState::Root; }\n\tvoid AddContainerButton(USoUIButton* Button) override;\n\n\t//\n\t// Own methods\n\t//\n\tUSoUIMenuMain(const FObjectInitializer& ObjectInitializer);\n\n\tvoid SetActiveState(ESoUIMainMenuState State);\n\n\t// Sets/Creates the texts and children for all lines\n\t// NOTE: does not depend on any runtime value\n\tvoid CreateChildrenAndSetTexts();\n\n\t// Updates text dynamically at runtime\n\tvoid UpdateButtonTexts();\n\n\t//\n\t// Visibility\n\t//\n\tbool AreExternalLinksVisible() const;\n\tbool IsFading() const { return ActiveState == ESoUIMainMenuState::FadeIn || ActiveState == ESoUIMainMenuState::FadeOut; }\n\n\t// Updates the children widget visibilities from the current state\n\tvoid UpdateWidgetsVisibilities();\n\n\t// Helper method that sets the visibility to the\n\t// - ExternalLinksContainer\n\t// - TextControllerRecommended\n\t// - ButtonContainer\n\tvoid SetForcedVisibilityOfMainMenuElements(ESlateVisibility NewVisibility);\n\n\t//\n\t// Confirm analytics popup\n\t//\n\tbool CanHandleConfirmAnalyticsUICommand() const;\n\tbool OpenConfirmCollectAnalytics();\n\n\t//\n\t// Confirm quit popup\n\t//\n\tbool CanHandleConfirmQuitUICommand() const;\n\n\tUFUNCTION()\n\tvoid OnConfirmQuestionAnswered();\n\tbool OpenConfirmQuit();\n\tvoid OpenConfirmRestart();\n\tvoid CleanupAfterConfirmQuestion();\n\n\t//\n\t// Before main menu panel screen\n\t//\n\tbool CanHandleBeforeMainMenuUICommand() const;\n\n\tUFUNCTION(BlueprintCallable)\n\tbool OpenPanelBeforeMainMenu(USoInGameUIActivity* InBeforeMainMenuScreen);\n\n\t// Pressed on a button\n\tUFUNCTION()\n\tvoid OnHandleButtonPress(int32 SelectedChild, USoUIUserWidget* SoUserWidget);\n\n\tvoid OnContinueButtonPressed();\n\tvoid OnLoadButtonPressed();\n\n\t// closes menu, enters game\n\tvoid EnterGame(bool bFadeOutMenu);\n\tvoid QuitGame();\n\n\t// Closes any current subpanel\n\tvoid CloseAllChildrenWidgets();\n\tvoid CloseCurrentChildWidget();\n\n\t// Handle the event after the save slot loaded.\n\tUFUNCTION()\n\tvoid HandleSaveSlotLoaded(int32 SaveSlotIndex);\n\n\t// Refresh the button container, it displays different buttons depending on the current state\n\tvoid RefreshButtonContainer();\n\tvoid UpdateButtonsActivations();\n\n\t// Updates the animation fade\n\tvoid UpdateFade(float FadeValue, float BackgroundAlpha);\n\n\tTArray<ESoUIMainMenuButton>& GetButtonOptions();\n\tvoid RefreshButtonOptions();\n\tvoid RefreshExternalLinksButtonOptions();\n\tvoid ResetSelectedButton(int32 NewIndex = 0)\n\t{\n\t\tUnhighlightAllChildren();\n\t\tSetSelectedIndex(0);\n\t}\n\n\tvoid SetTitleVisibility(bool bVisible);\n\n\tUFUNCTION()\n\tvoid OnCreditsFadeOutFinished();\n\nprotected:\n\t/** Menu Buttons: */\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\", meta = (BindWidget))\n\tUSoUIButton* Continue;\n\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\", meta = (BindWidget))\n\tUSoUIButton* RestartFromSK;\n\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\", meta = (BindWidget))\n\tUSoUIButton* RestartFromCP;\n\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\", meta = (BindWidget))\n\tUSoUIButton* Load;\n\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\", meta = (BindWidget))\n\tUSoUIButton* Challenges;\n\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\", meta = (BindWidget))\n\tUSoUIButton* Settings;\n\n\t// displays the credits, only visible in Main Game / Main menu (game is not loaded yet)\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\", meta = (BindWidget))\n\tUSoUIButton* Credits;\n\n\t// Special button that only appears ingame that says to quit the game\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\", meta = (BindWidget))\n\tUSoUIButton* ExitGameAlways;\n\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\", meta = (BindWidget))\n\tUSoUIButton* Exit;\n\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\", meta = (BindWidget))\n\tUSoUIButton* ChangeUser;\n\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\", meta = (BindWidget))\n\tUImage* MenuButtonsBackground;\n\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\", meta = (BindWidget))\n\tUImage* MainBackgroundImage;\n\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\", meta = (BindWidget))\n\tUImage* MainBackgroundImageVFX;\n\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\", meta = (BindWidget))\n\tUImage* MainBackgroundColor;\n\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\", meta = (BindWidget))\n\tUImage* MainBackgroundTitle;\n\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\", meta = (BindWidget))\n\tUSpacer* MainBackgroundTitleSpacer;\n\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\", meta = (BindWidget))\n\tUSoUICredits* CreditsScreen;\n\n\tUPROPERTY(BlueprintReadOnly, Category = \">State\")\n\tbool bPressedExitGameAlways = false;\n\n\tUPROPERTY(EditAnywhere, Category = \">Background\")\n\tfloat BackgroundImageExtraYSize = 24.0f;\n\n\t// Map selected button index => ESoUIMainMenuButton (button type)\n\t// NOTE the order in UMG does not matter, this is the only order that does.\n\t// NOTE: the values here are all the values, they will be modified at runtime\n\t// See: RefreshButtonOptions\n\tTArray<ESoUIMainMenuButton> ButtonOptions = {\n\t\tESoUIMainMenuButton::Continue,\n\t\tESoUIMainMenuButton::RestartFromSK,\n\t\tESoUIMainMenuButton::RestartFromCP,\n\t\tESoUIMainMenuButton::Challenges,\n\t\tESoUIMainMenuButton::Load,\n\t\tESoUIMainMenuButton::Settings,\n\t\tESoUIMainMenuButton::Credits,\n\t\tESoUIMainMenuButton::Exit,\n\t\tESoUIMainMenuButton::ExitGameAlways,\n\t\tESoUIMainMenuButton::ChangeUser,\n\t};\n\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\", meta = (BindWidget))\n\tURetainerBox* RootRetainer;\n\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\", meta = (BindWidget))\n\tUImage* BackgroundFade;\n\n\t/** Submenus: */\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\", meta = (BindWidget))\n\tUSoUISettings* SettingsPanel;\n\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\", meta = (BindWidget))\n\tUSoUISaveSlotSelection* SaveSlotSelectionPanel;\n\n\t// UPROPERTY(BlueprintReadWrite, Category = \">Widgets\", meta = (BindWidget))\n\t// USoUIChallenges* ChallengesPanel;\n\n\t// Used at first before the main is entered\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\")\n\tUSoInGameUIActivity* BeforeMainMenuScreen;\n\n\t// Only shown first time the game is started, prompting the user to collect analytics or not\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\", meta = (BindWidget))\n\tUSoUIConfirmPanel* ConfirmCollectAnalytics;\n\n\t// Confirm quit panel that show Yes/No options\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\", meta = (BindWidget))\n\tUSoUIConfirmQuestion* ConfirmQuit = nullptr;\n\n\t// Current UI active state, is this menu opened? loading screen?\n\tESoUIMainMenuState ActiveState = ESoUIMainMenuState::Root;\n\n\t// Shows the back button\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\", meta = (BindWidget))\n\tUSoUIButtonImage* ButtonImageToolTipBack;\n\n\t// Death Count, only visible if game is started\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\", meta = (BindWidget))\n\tUTextBlock* DeathCountText;\n\n\t// Death Count, only visible if game is started\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\", meta = (BindWidget))\n\tUImage* DeathCountIcon;\n\n\t// Text that shows we should use a controller\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\", meta = (BindWidget))\n\tUSoUIContainerNamedSlot* TextControllerRecommended;\n\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\", meta = (BindWidget))\n\tUPanelWidget* ExternalLinksContainer;\n\n\t// Map selected button index => ESoUIMainMenuExternalLinkButton (button type)\n\t// NOTE also change order in UMG\n\tTArray<ESoUIMainMenuExternalLinkButton> ExternalLinksButtonOptions = {\n\t\tESoUIMainMenuExternalLinkButton::Discord,\n\t\tESoUIMainMenuExternalLinkButton::MailingList,\n\t\tESoUIMainMenuExternalLinkButton::Twitter,\n\t\tESoUIMainMenuExternalLinkButton::SteamMainGame\n\t};\n\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\",  meta = (BindWidget))\n\tUSoUIExternalLink* ExternalLinkDiscord;\n\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\",  meta = (BindWidget))\n\tUSoUIExternalLink* ExternalLinkTwitter;\n\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\",  meta = (BindWidget))\n\tUSoUIExternalLink* ExternalLinkSteamMainGame;\n\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\",  meta = (BindWidget))\n\tUSoUIExternalLink* ExternalLinkMailingList;\n\n\tUPROPERTY(EditAnywhere, Category = \">MenuAnimation\")\n\tUCurveFloat* FadeOutCurve;\n\n\t// Is this menu opened?\n\tbool bOpened = true;\n\n\t// Keep the state of the is mouse allowed\n\tbool bPreviousIsMouseAllowed = false;\n\n\tfloat FadeOutCounter = 0.0f;\n\n\n\tUPROPERTY()\n\tUSoGameInstance* GameInstance = nullptr;\n\n\n\t//\n\t// SFX\n\t//\n\n\tUPROPERTY(EditAnywhere, Category = \">SFX\")\n\tUFMODEvent* SFXMenuOpenFromGame = nullptr;\n\n\tUPROPERTY(EditAnywhere, Category = \">SFX\")\n\tUFMODEvent* SFXMenuReturnToGame = nullptr;\n\n\tUPROPERTY(EditAnywhere, Category = \">SFX\")\n\tUFMODEvent* SFXTeleportToCheckpoint = nullptr;\n\n\tUPROPERTY(EditAnywhere, Category = \">SFX\")\n\tUFMODEvent* SFXTeleportToSoulKeeper = nullptr;\n};\n"
  },
  {
    "path": "Source/SOrb/UI/Menu/SoUISaveSlot.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n\n#include \"SoUISaveSlot.h\"\n\n#include \"Components/TextBlock.h\"\n#include \"Components/Image.h\"\n\n#include \"SaveFiles/SoWorldStateTable.h\"\n#include \"SaveFiles/SoWorldState.h\"\n#include \"SoBeforeGame/Public/SoLocalization.h\"\n#include \"Levels/SoLevelHelper.h\"\n#include \"Basic/SoGameSingleton.h\"\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISaveSlot::InitializeAsNew()\n{\n\tHideAll();\n\tSetNotStartedSlotElementsVisibility(true);\n\tBGNew->SetBrushFromTexture(EmptyBackground);\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISaveSlot::InitializeFromState(const FSoStateTable& State, bool bCurrentlyLoaded)\n{\n\tHideAll();\n\t\n\tif (FSoWorldState::IsStateTableAGameCompleted(State))\n\t{\n\t\tSetFinishedSlotElementsVisibility(true);\n\t}\n\telse\n\t{\n\t\tSetRunningSlotElementsVisibility(true);\n\n\t\t// Chapter Text\n\t\tChapterText->SetText(USoLevelHelper::ChapterNameToFriendlyText(State.Metadata.MapName));\n\t\tChapterText->SetColorAndOpacity(bCurrentlyLoaded ? AreaTextColorActiveSlot : AreaTextColorDefault);\n\t\tif (!bCurrentlyLoaded)\n\t\t\tLoadedText->SetVisibility(ESlateVisibility::Collapsed);\n\t}\n\n\t// Progress text and image\n\tBG->SetBrushFromTexture(EmptyBackground);\n\tif (USoGameSingleton* Singleton = USoGameSingleton::GetInstance())\n\t\tif (FSoCharacterProgressInfo* ProgressInfoPtr = Singleton->CharacterProgressInfo.Find(State.Metadata.DisplayedProgressName))\n\t\t{\n\t\t\tProgressText->SetText(ProgressInfoPtr->DisplayText);\n\t\t\tFinishedProgressText->SetText(ProgressInfoPtr->DisplayText);\n\t\t\tif (ProgressInfoPtr->Image != nullptr)\n\t\t\t\tBG->SetBrushFromTexture(ProgressInfoPtr->Image);\n\t\t}\n\n\t// update death count\n\tFNumberFormattingOptions Format;\n\tFormat.SetUseGrouping(false);\n\tDeathCountText->SetText(FText::AsNumber(State.Metadata.ProgressStats.TotalDeathNum, &Format));\n\tFinishedDeathCountText->SetText(FText::AsNumber(State.Metadata.ProgressStats.TotalDeathNum, &Format));\n\n\t// difficulty\n\tswitch (State.Metadata.Difficulty)\n\t{\n\tcase ESoDifficulty::Sane:\n\t\tFinishedDifficulty->SetText(FROM_STRING_TABLE_UI(\"difficulty_sane\"));\n\t\tDifficultyText->SetText(FROM_STRING_TABLE_UI(\"difficulty_sane\"));\n\t\tDifficultyText->SetColorAndOpacity(DifficultyColorSane);\n\t\tbreak;\n\n\tcase ESoDifficulty::Intended:\n\t\tFinishedDifficulty->SetText(FROM_STRING_TABLE_UI(\"difficulty_intended\"));\n\t\tDifficultyText->SetText(FROM_STRING_TABLE_UI(\"difficulty_intended\"));\n\t\tDifficultyText->SetColorAndOpacity(DifficultyColorIntended);\n\t\tbreak;\n\n\tcase ESoDifficulty::Insane:\n\t\tFinishedDifficulty->SetText(FROM_STRING_TABLE_UI(\"difficulty_insane\"));\n\t\tDifficultyText->SetText(FROM_STRING_TABLE_UI(\"difficulty_insane\"));\n\t\tDifficultyText->SetColorAndOpacity(DifficultyColorInsane);\n\t\tbreak;\n\n\tdefault:\n\t\tensure(false);\n\t\tbreak;\n\t}\n\n\t// update playtime text\n\tconst int32 HoursPlayed = static_cast<int32>(State.Metadata.ProgressStats.TotalPlayTimeSeconds) / 3600;\n\tif (HoursPlayed > 0)\n\t{\n\t\tFFormatOrderedArguments SlotArguments;\n\t\tSlotArguments.Add(HoursPlayed);\n\t\tSlotArguments.Add(static_cast<int32>(State.Metadata.ProgressStats.TotalPlayTimeSeconds / 60.0f) - HoursPlayed * 60);\n\t\tPlayTimeText->SetText(FText::Format(FROM_STRING_TABLE_UI(\"save_slots_playtime\"), SlotArguments));\n\t\tFinishedTime->SetText(FText::Format(FROM_STRING_TABLE_UI(\"save_slots_playtime\"), SlotArguments));\n\t}\n\telse\n\t{\n\t\tFFormatOrderedArguments SlotArguments;\n\t\tSlotArguments.Add(static_cast<int32>(State.Metadata.ProgressStats.TotalPlayTimeSeconds / 60.0f));\n\t\tPlayTimeText->SetText(FText::Format(FROM_STRING_TABLE_UI(\"save_slots_playtime_short\"), SlotArguments));\n\t\tFinishedTime->SetText(FText::Format(FROM_STRING_TABLE_UI(\"save_slots_playtime_short\"), SlotArguments));\n\t}\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISaveSlot::SetRunningSlotElementsVisibility(bool bVisible)\n{\n\tChapterText->SetVisibility(bVisible ? ESlateVisibility::Visible : ESlateVisibility::Collapsed);\n\tProgressText->SetVisibility(bVisible ? ESlateVisibility::Visible : ESlateVisibility::Collapsed);\n\tDifficultyText->SetVisibility(bVisible ? ESlateVisibility::Visible : ESlateVisibility::Collapsed);\n\tDeathCountText->SetVisibility(bVisible ? ESlateVisibility::Visible : ESlateVisibility::Collapsed);\n\tDeathCountIcon->SetVisibility(bVisible ? ESlateVisibility::Visible : ESlateVisibility::Collapsed);\n\tPlayTimeText->SetVisibility(bVisible ? ESlateVisibility::Visible : ESlateVisibility::Collapsed);\n\tLoadedText->SetVisibility(bVisible ? ESlateVisibility::Visible : ESlateVisibility::Collapsed);\n\tBG->SetVisibility(bVisible ? ESlateVisibility::Visible : ESlateVisibility::Collapsed);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISaveSlot::SetNotStartedSlotElementsVisibility(bool bVisible)\n{\n\tNewGameText->SetVisibility(bVisible ? ESlateVisibility::Visible : ESlateVisibility::Collapsed);\n\tBGNew->SetVisibility(bVisible ? ESlateVisibility::Visible : ESlateVisibility::Collapsed);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISaveSlot::SetFinishedSlotElementsVisibility(bool bVisible)\n{\n\tFinishedProgressText->SetVisibility(bVisible ? ESlateVisibility::Visible : ESlateVisibility::Collapsed);\n\tFinishedDifficulty->SetVisibility(bVisible ? ESlateVisibility::Visible : ESlateVisibility::Collapsed);\n\tFinishedTime->SetVisibility(bVisible ? ESlateVisibility::Visible : ESlateVisibility::Collapsed);\n\tFinishedDeathCountText->SetVisibility(bVisible ? ESlateVisibility::Visible : ESlateVisibility::Collapsed);\n\tFinishedDeathCountIcon->SetVisibility(bVisible ? ESlateVisibility::Visible : ESlateVisibility::Collapsed);\n\tBG->SetVisibility(bVisible ? ESlateVisibility::Visible : ESlateVisibility::Collapsed);\n}\n"
  },
  {
    "path": "Source/SOrb/UI/Menu/SoUISaveSlot.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#pragma once\n\n#include \"CoreMinimal.h\"\n#include \"UI/General/SoUIUserWidget.h\"\n\n#include \"SoUISaveSlot.generated.h\"\n\nclass UTextBlock;\nclass UImage;\n\n/**\n *\n */\nUCLASS()\nclass SORB_API USoUISaveSlot : public USoUIUserWidget\n{\n\tGENERATED_BODY()\n\npublic:\n\n\t//\n\t// Begin UUserWidget Interface\n\t//\n\t// void NativeConstruct() override;\n\t// void NativeDestruct() override;\n\n\n\t//\n\t// Own methods\n\t//\n\tvoid InitializeAsNew();\n\tvoid InitializeFromState(const struct FSoStateTable& State, bool bCurrentlyLoaded);\n\n\nprotected:\n\n\tUFUNCTION(BlueprintCallable)\n\tvoid SetRunningSlotElementsVisibility(bool bVisible);\n\n\tUFUNCTION(BlueprintCallable)\n\tvoid SetNotStartedSlotElementsVisibility(bool bVisible);\n\n\tUFUNCTION(BlueprintCallable)\n\tvoid SetFinishedSlotElementsVisibility(bool bVisible);\n\n\tUFUNCTION(BlueprintCallable)\n\tvoid HideAll()\n\t{\n\t\tSetRunningSlotElementsVisibility(false);\n\t\tSetNotStartedSlotElementsVisibility(false);\n\t\tSetFinishedSlotElementsVisibility(false);\n\t}\n\nprotected:\n\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\", meta = (BindWidget))\n\tUImage* BG;\n\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\", meta = (BindWidget))\n\tUImage* BGNew;\n\n\t//\n\t// FinishedSlotElements\n\t//\n\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\", meta = (BindWidget))\n\tUTextBlock* FinishedProgressText;\n\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\", meta = (BindWidget))\n\tUTextBlock* FinishedDifficulty;\n\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\", meta = (BindWidget))\n\tUTextBlock* FinishedTime;\n\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\", meta = (BindWidget))\n\tUTextBlock* FinishedDeathCountText;\n\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\", meta = (BindWidget))\n\tUImage* FinishedDeathCountIcon;\n\n\t//\n\t// RunningSlotElements\n\t//\n\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\", meta = (BindWidget))\n\tUTextBlock* ChapterText;\n\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\", meta = (BindWidget))\n\tUTextBlock* LoadedText;\n\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\", meta = (BindWidget))\n\tUTextBlock* ProgressText;\n\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\", meta = (BindWidget))\n\tUTextBlock* DifficultyText;\n\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\", meta = (BindWidget))\n\tUTextBlock* PlayTimeText;\n\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\", meta = (BindWidget))\n\tUTextBlock* DeathCountText;\n\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\", meta = (BindWidget))\n\tUImage* DeathCountIcon;\n\n\n\tUPROPERTY(EditAnywhere, Category = \">Style\")\n\tFSlateColor AreaTextColorActiveSlot;\n\n\tUPROPERTY(EditAnywhere, Category = \">Style\")\n\tFSlateColor AreaTextColorDefault;\n\n\n\tUPROPERTY(EditAnywhere, Category = \">Style\")\n\tFSlateColor DifficultyColorSane;\n\n\tUPROPERTY(EditAnywhere, Category = \">Style\")\n\tFSlateColor DifficultyColorIntended;\n\n\tUPROPERTY(EditAnywhere, Category = \">Style\")\n\tFSlateColor DifficultyColorInsane;\n\n\t//\n\t// Empty Slot elements\n\t//\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\", meta = (BindWidget))\n\tUTextBlock* NewGameText;\n\n\tUPROPERTY(EditAnywhere, Category = \">Widgets\")\n\tUTexture2D* EmptyBackground;\n};\n"
  },
  {
    "path": "Source/SOrb/UI/Menu/SoUISaveSlotSelection.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n\n#include \"SoUISaveSlotSelection.h\"\n\n#include \"Components/PanelWidget.h\"\n\n#include \"MediaPlayer.h\"\n#include \"MediaTexture.h\"\n#include \"FileMediaSource.h\"\n#include \"TimerManager.h\"\n\n#include \"FMODEvent.h\"\n\n#include \"UI/General/Commands/SoUICommandTooltipArray.h\"\n#include \"UI/General/SoUIVideoPlayer.h\"\n#include \"UI/General/SoUIPressAndHoldConfirmation.h\"\n#include \"UI/Menu/ConfirmPanels/SoUIConfirmQuestion.h\"\n#include \"SoUISaveSlot.h\"\n#include \"SoUIDifficultySelection.h\"\n#include \"SaveFiles/SoWorldState.h\"\n#include \"Basic/SoGameInstance.h\"\n#include \"Basic/SoAudioManager.h\"\n#include \"Basic/SoGameSingleton.h\"\n#include \"Basic/Helpers/SoStaticHelper.h\"\n#include \"Online/Analytics/SoAnalytics.h\"\n#include \"Character/SoCharacter.h\"\n#include \"Character/SoCharStates/SoADefault.h\"\n#include \"SoBeforeGame/Public/SoLocalization.h\"\n#include \"Basic/Helpers/SoPlatformHelper.h\"\n\nDEFINE_LOG_CATEGORY_STATIC(LogSoUISaveSlotSelection, All, All);\n\n\n///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISaveSlotSelection::NativeConstruct()\n{\n\tSuper::NativeConstruct();\n\n\tif (DifficultySelection != nullptr)\n\t\tDifficultySelection->OnDifficultySelected().AddDynamic(this, &USoUISaveSlotSelection::OnDifficultySelected);\n\n\tOnSelectedChildChangedEvent().AddUObject(this, &ThisClass::OnSelectedChildChanged);\n\tOnNavigateOnPressedHandleChildEvent().BindUObject(this, &ThisClass::OnHandleButtonPress);\n\n\t// fill child array for navigation\n\tfor (int32 SlotIndex = 0; SlotIndex < Container->GetChildrenCount(); ++SlotIndex)\n\t\tif (USoUISaveSlot* SaveSlot = Cast<USoUISaveSlot>(Container->GetChildAt(SlotIndex)))\n\t\t\tAddContainerChild(SaveSlot);\n\n\tif (ClearSlotConfirmation != nullptr)\n\t{\n\t\tClearSlotConfirmation->SetTexts(\n\t\t\tFROM_STRING_TABLE_UI(\"save_slots_remove_confirm\"),\n\t\t\tFROM_STRING_TABLE_UI(\"save_slots_remove_confirm_subtext\")\n\t\t);\n\t\tClearSlotConfirmation->OnQuestionAnsweredEvent().AddDynamic(this, &ThisClass::OnClearSaveSlotConfirmQuestionAnswered);\n\t}\n\n\tbCyclicNavigation = true;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISaveSlotSelection::NativeDestruct()\n{\n\tSuper::NativeDestruct();\n\n\tif (DifficultySelection != nullptr)\n\t\tDifficultySelection->OnDifficultySelected().RemoveDynamic(this, &ThisClass::OnDifficultySelected);\n\n\tif (ClearSlotConfirmation != nullptr)\n\t\tClearSlotConfirmation->OnQuestionAnsweredEvent().RemoveDynamic(this, &ThisClass::OnClearSaveSlotConfirmQuestionAnswered);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISaveSlotSelection::NativeTick(const FGeometry& MyGeometry, float InDeltaTime)\n{\n\tSuper::NativeTick(MyGeometry, InDeltaTime);\n\n\tif (CutsceneStartCounter >= 0.0f)\n\t{\n\t\tCutsceneStartCounter -= InDeltaTime;\n\t\tif (CutsceneStartCounter < 0.0f)\n\t\t{\n\t\t\tASoCharacter* Character = USoStaticHelper::GetPlayerCharacterAsSoCharacter(this);\n\t\t\tUSoUIVideoPlayer* VideoPlayer = Character->GetUIVideoPlayer();\n\t\t\tVideoPlayer->SetIsVideoLooping(false);\n\t\t\tUSoGameSingleton& SoSingleton = USoGameSingleton::Get();\n\t\t\tVideoPlayer->StartVideo(SoSingleton.IntroMediaSourcePtr, SoSingleton.VideoMediaPlayerPtr, SoSingleton.VideoMediaTexturePtr, SoSingleton.IntroSounds.Get());\n\t\t\tVideoPlayer->OnVideoFinishedOrSkipped.AddDynamic(this, &USoUISaveSlotSelection::IntroFinished);\n\t\t\tVideoPlayer->SetSubtitles(&SoSingleton.IntroSubs);\n\t\t\tUSoPlatformHelper::DisallowMouse(this);\n\t\t}\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoUISaveSlotSelection::OnUICommand_Implementation(ESoUICommand Command)\n{\n\tif (!ISoUIEventHandler::Execute_IsOpened(this))\n\t\treturn false;\n\n\tif (bIntroPlaying)\n\t{\n\t\tif (Command == ESoUICommand::EUC_ActionBack || Command == ESoUICommand::EUC_MainMenuBack)\n\t\t{\n\t\t\tASoCharacter* Character = USoStaticHelper::GetPlayerCharacterAsSoCharacter(this);\n\t\t\tUSoUIVideoPlayer* VideoPlayer = Character->GetUIVideoPlayer();\n\n\t\t\tVideoPlayer->PauseVideo(!VideoPlayer->IsVideoPaused());\n\t\t}\n\n\t\treturn true;\n\t}\n\n\t// Confirmation Open\n\tif (IsValid(ClearSlotConfirmation) && ISoUIEventHandler::Execute_IsOpened(ClearSlotConfirmation))\n\t{\n\t\treturn ISoUIEventHandler::Execute_OnUICommand(ClearSlotConfirmation, Command);\n\t}\n\n\t// difficulty selection mode\n\tif (ISoUIEventHandler::Execute_IsOpened(DifficultySelection))\n\t{\n\t\tif (Command == ESoUICommand::EUC_MainMenuBack)\n\t\t{\n\t\t\tISoUIEventHandler::Execute_Open(DifficultySelection, false);\n\t\t\tContainer->SetVisibility(ESlateVisibility::Visible);\n\t\t\tRefreshCommandTooltips();\n\t\t\treturn true;\n\t\t}\n\t\telse\n\t\t\treturn ISoUIEventHandler::Execute_OnUICommand(DifficultySelection, Command);\n\t}\n\n\tswitch (Command)\n\t{\n\t\tcase ESoUICommand::EUC_Left:\n\t\tcase ESoUICommand::EUC_Right:\n\t\tcase ESoUICommand::EUC_Up:\n\t\tcase ESoUICommand::EUC_Down:\n\t\tcase ESoUICommand::EUC_MainMenuEnter:\n\t\t\t// Navigate on the buttons\n\t\t\tNavigate(Command);\n\t\t\treturn true;\n\n\t\tcase ESoUICommand::EUC_Action0:\n\t\t\tProceedWithSlot(GetSelectedIndex());\n\t\t\treturn true;\n\n\t\tcase ESoUICommand::EUC_Action1:\n\t\t\tif (CanRemoveSelectedSlot())\n\t\t\t{\n\t\t\t\tContainer->SetVisibility(ESlateVisibility::Collapsed);\n\t\t\t\tISoUIEventHandler::Execute_Open(ClearSlotConfirmation, true);\n\t\t\t\tRefreshCommandTooltips();\n\t\t\t\tUSoAudioManager::PlaySound2D(this, SFXClearSlot, true);\n\t\t\t}\n\t\t\treturn true;\n\n\t\tcase ESoUICommand::EUC_MainMenuBack:\n\t\t\tISoUIEventHandler::Execute_Open(this, false);\n\t\t\treturn true;\n\n\t\tdefault:\n\t\t\treturn false;\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISaveSlotSelection::Open_Implementation(bool bOpen)\n{\n\tSetVisibility(bOpen ? ESlateVisibility::Visible : ESlateVisibility::Collapsed);\n\n\tif (bOpen)\n\t{\n\t\tContainer->SetVisibility(ESlateVisibility::Visible);\n\t\tif (ISoUIEventHandler::Execute_IsOpened(DifficultySelection))\n\t\t\tISoUIEventHandler::Execute_Open(DifficultySelection, false);\n\n\t\tRefreshSlots();\n\t\tSetSelectedIndex(0);\n\t\tRefreshCommandTooltips();\n\t}\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISaveSlotSelection::RefreshSlots()\n{\n\tFSoWorldState::Get().GetAllSavesSlots(SaveSlotsData);\n\n\tconst bool bGameStarted = USoGameInstance::GetInstance(this) ? USoGameInstance::GetInstance(this)->IsGameStarted() : false;\n\n\tfor (int32 SlotIndex = 0; SlotIndex < Container->GetChildrenCount(); ++SlotIndex)\n\t{\n\t\tif (USoUISaveSlot* SaveSlot = Cast<USoUISaveSlot>(Container->GetChildAt(SlotIndex)))\n\t\t{\n\t\t\tif (SaveSlotsData.Contains(SlotIndex))\n\t\t\t\tSaveSlot->InitializeFromState(SaveSlotsData[SlotIndex], bGameStarted && FSoWorldState::Get().GetSlotIndex() == SlotIndex);\n\t\t\telse\n\t\t\t\tSaveSlot->InitializeAsNew();\n\t\t}\n\t}\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISaveSlotSelection::ProceedWithSlot(int32 SlotIndex)\n{\n\tif (SaveSlotsData.Contains(SlotIndex))\n\t{\n\t\tif (CanLoadSelectedSlot())\n\t\t{\n\t\t\tUSoAudioManager::PlaySound2D(this, SFXLoadSlot, true);\n\t\t\tLoadSaveSlot(SlotIndex);\n\t\t}\n\t}\n\telse\n\t{\n\t\t// Start new game on slot -> proceed to difficulty selection\n\t\tISoUIEventHandler::Execute_Open(DifficultySelection, true);\n\t\tContainer->SetVisibility(ESlateVisibility::Collapsed);\n\t\tRefreshCommandTooltips();\n\n\t\tUSoAudioManager::PlaySound2D(this, SFXStartNewSlot, true);\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISaveSlotSelection::LoadSaveSlot(const int32 SaveSlotIndex)\n{\n\tUE_LOG(LogSoUISaveSlotSelection, Verbose, TEXT(\"Load save at Slot index = %d\"), SaveSlotIndex);\n\n\tconst auto& WorldState = FSoWorldState::Get();\n\tUSoGameInstance* GameInstance = USoGameInstance::GetInstance(this);\n\tGameInstance->PauseGame(false);\n\n\t// Analytics\n\tGameInstance->GetAnalytics()->RecordUISaveLoad();\n\n\t// Load the current selected slot\n\tUE_LOG(LogSoUISaveSlotSelection, Verbose, TEXT(\"Loading the slot = %d\"), SaveSlotIndex);\n\tGameInstance->LoadGameForChapter(SaveSlotIndex, false);\n\n\t// Update UI\n\tGameInstance->ResumeGame(true); // maybe it was brought up by someone else\n\tSaveSlotLoaded.Broadcast(SaveSlotIndex);\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISaveSlotSelection::RemoveSelectedSaveSlot()\n{\n\tif (!CanRemoveSelectedSlot())\n\t\treturn;\n\n\tconst int32 SaveSlotIndex = GetSelectedIndex();\n\tUSoGameInstance* GameInstance = USoGameInstance::GetInstance(this);\n\n\tUE_LOG(LogSoUISaveSlotSelection, Verbose, TEXT(\"Remove save at Slot index = %d\"), SaveSlotIndex);\n\n\t// Analytics\n\tGameInstance->GetAnalytics()->RecordUISaveRemove();\n\n\t// Update file system\n\tUE_LOG(LogSoUISaveSlotSelection, Verbose, TEXT(\"Deleting save game at index = %d\"), SaveSlotIndex);\n\tFSoWorldState& WorldState = FSoWorldState::Get();\n\tWorldState.DeleteGameInSlot(SaveSlotIndex);\n\n\tRefreshSlots();\n\tRefreshCommandTooltips();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISaveSlotSelection::OnDifficultySelected(ESoDifficulty SelectedDifficulty)\n{\n\tCachedDifficulty = SelectedDifficulty;\n\n\tconst int32 SelectedSaveSlotIndex = GetSelectedIndex();\n\tUE_LOG(LogSoUISaveSlotSelection, Verbose, TEXT(\"StartNewGameIn at Slot index = %d\"), SelectedSaveSlotIndex);\n\n\tconst auto& WorldState = FSoWorldState::Get();\n\tASoCharacter* Character = USoStaticHelper::GetPlayerCharacterAsSoCharacter(this);\n\tif (Character != nullptr && Character->SoActivity != nullptr)\n\t\tCharacter->SoActivity->SwitchActivity(Character->SoADefault);\n\n\t// Analytics\n\tUSoGameInstance* GameInstance = USoGameInstance::GetInstance(this);\n\tGameInstance->PauseGame(false);\n\tGameInstance->GetAnalytics()->RecordUISaveStartNewGame();\n\n\t// // Save current slot if we are in game\n\t// TODO REMOVE THIS?!\n\tif (GameInstance->IsGameStarted())\n\t{\n\t\tUE_LOG(LogSoUISaveSlotSelection, Verbose, TEXT(\"Saving current slot = %d\"), WorldState.GetSlotIndex());\n\t\tGameInstance->SaveGameForCurrentState();\n\t}\n\n#if WARRIORB_WITH_VIDEO_INTRO\n\tif (Character != nullptr)\n\t{\n\t\tbIntroPlaying = true;\n\t\tUSoGameInstance::Get(this).GetAudioManager()->FadeOutActiveMusic();\n\t\tBlackFadeRequest.Broadcast();\n\t\tCutsceneStartCounter = 1.0f;\n\t}\n#else\n\tIntroFinished();\n#endif\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISaveSlotSelection::IntroFinished()\n{\n#if WARRIORB_WITH_VIDEO_INTRO\n\tASoCharacter* Character = USoStaticHelper::GetPlayerCharacterAsSoCharacter(this);\n\tUSoUIVideoPlayer* VideoPlayer = Character->GetUIVideoPlayer();\n\tVideoPlayer->OnVideoFinishedOrSkipped.RemoveDynamic(this, &USoUISaveSlotSelection::IntroFinished);\n\tVideoPlayer->SetSubtitles(nullptr);\n#endif\n\n\tconst int32 SelectedSaveSlotIndex = GetSelectedIndex();\n\t// NOTE: saving the current state is done in the LoadGameForChapter (if a game is already loaded)\n\t// also saving the new state\n\t// Load the current selected slot\n\tUE_LOG(LogSoUISaveSlotSelection, Verbose, TEXT(\"Notify user of changes\"));\n\tUSoGameInstance* GameInstance = USoGameInstance::GetInstance(this);\n\tGameInstance->LoadGameForChapter(SelectedSaveSlotIndex, true, CachedDifficulty);\n\n\t// TODO: do we need this?\n\t// \tGameInstance->ResumeGame(true); // maybe it was brought up by someone else\n\tSaveSlotLoaded.Broadcast(SelectedSaveSlotIndex);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISaveSlotSelection::OnSelectedChildChanged(int32 OldIndex, int32 NewIndex)\n{\n\tRefreshCommandTooltips();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISaveSlotSelection::OnHandleButtonPress(int32 SelectedChild, USoUIUserWidget* SoUserWidget)\n{\n\tProceedWithSlot(SelectedChild);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISaveSlotSelection::OnClearSaveSlotConfirmQuestionAnswered()\n{\n\tif (ClearSlotConfirmation->IsAnswerYes())\n\t{\n\t\tRemoveSelectedSaveSlot();\n\t\tRefreshSlots();\n\t}\n\n\tISoUIEventHandler::Execute_Open(ClearSlotConfirmation, false);\n\n\tContainer->SetVisibility(ESlateVisibility::Visible);\n\tRefreshCommandTooltips();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUISaveSlotSelection::RefreshCommandTooltips()\n{\n\tif (CommandTooltips == nullptr)\n\t\treturn;\n\n\t// Restore to default\n\tCommandTooltips->SetVisibility(ESlateVisibility::Visible);\n\tCommandTooltips->Clear();\n\n\tif (!ISoUIEventHandler::Execute_IsOpened(DifficultySelection) &&\n\t\t!ISoUIEventHandler::Execute_IsOpened(ClearSlotConfirmation))\n\t{\n\t\tif (CanLoadSelectedSlot())\n\t\t\tCommandTooltips->AddTooltipFromUICommand(FROM_STRING_TABLE_UI(\"save_slots_select\"), ESoUICommand::EUC_Action0);\n\n\t\t// We can only remove non empty slots\n\t\tif (CanRemoveSelectedSlot())\n\t\t\tCommandTooltips->AddTooltipFromUICommand(FROM_STRING_TABLE_UI(\"save_slots_clear\"), ESoUICommand::EUC_Action1);\n\t}\n\n\t// Nothing to show\n\tif (CommandTooltips->IsEmpty())\n\t\tCommandTooltips->SetVisibility(ESlateVisibility::Collapsed);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoUISaveSlotSelection::CanRemoveSelectedSlot() const\n{\n\tconst int32 SlotIndex = GetSelectedIndex();\n\tif (USoGameInstance* GameInstance = USoGameInstance::GetInstance(this))\n\t\tif (GameInstance->IsGameStarted() && FSoWorldState::Get().GetSlotIndex() == SlotIndex)\n\t\t\treturn false;\n\n\treturn (SaveSlotsData.Contains(SlotIndex));\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoUISaveSlotSelection::CanLoadSelectedSlot() const\n{\n\tconst int32 SlotIndex = GetSelectedIndex();\n\tif (USoGameInstance* GameInstance = USoGameInstance::GetInstance(this))\n\t\tif (GameInstance->IsGameStarted() && FSoWorldState::Get().GetSlotIndex() == SlotIndex)\n\t\t\treturn false;\n\n\tif (!SaveSlotsData.Contains(SlotIndex))\n\t\treturn false;\n\n\tif (FSoWorldState::IsStateTableAGameCompleted(SaveSlotsData[SlotIndex]))\n\t\treturn false;\n\n\treturn true;\n}\n"
  },
  {
    "path": "Source/SOrb/UI/Menu/SoUISaveSlotSelection.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#pragma once\n\n#include \"CoreMinimal.h\"\n\n#include \"UI/General/SoUIUserWidgetArray.h\"\n#include \"SaveFiles/SoWorldStateTable.h\"\n\n#include \"SoUISaveSlotSelection.generated.h\"\n\nclass USoUIDifficultySelection;\nclass USoUICommandTooltipArray;\nclass USoUIConfirmQuestion;\n\nDECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOnSaveSlotLoaded, int32, SelectedSaveSlotIndex);\n\nDECLARE_DYNAMIC_MULTICAST_DELEGATE(FOnBlackFadeRequest);\n\n/**\n *\n */\nUCLASS()\nclass SORB_API USoUISaveSlotSelection : public USoUIUserWidgetArray, public ISoUIEventHandler\n{\n\tGENERATED_BODY()\n\npublic:\n\n\t//\n\t// Begin UUserWidget Interface\n\t//\n\tvoid NativeConstruct() override;\n\tvoid NativeDestruct() override;\n\tvoid NativeTick(const FGeometry& MyGeometry, float InDeltaTime) override;\n\n\t//\n\t// ISoUIEventHandler Interface\n\t//\n\tbool OnUICommand_Implementation(ESoUICommand Command) override;\n\tvoid Open_Implementation(bool bOpen) override;\n\tbool IsOpened_Implementation() const override { return IsVisible(); }\n\tbool CanBeInterrupted_Implementation() const override { return true; }\n\n\n\t//\n\t// Own methods\n\t//\n\n\tvoid RefreshSlots();\n\tvoid ProceedWithSlot(int32 SlotIndex);\n\n\tvoid LoadSaveSlot(const int32 SaveSlotIndex);\n\tvoid RemoveSelectedSaveSlot();\n\n\t// Save slot was loaded\n\tFOnSaveSlotLoaded& OnSaveSlotLoaded() { return SaveSlotLoaded; }\n\tFOnBlackFadeRequest& OnBlackFadeRequest() { return BlackFadeRequest; }\n\t\n\n\tUFUNCTION()\n\tvoid OnDifficultySelected(ESoDifficulty SelectedDifficulty);\n\n\n\tUFUNCTION()\n\tvoid IntroFinished();\n\n\n\tUFUNCTION()\n\tvoid OnSelectedChildChanged(int32 OldIndex, int32 NewIndex);\n\n\tUFUNCTION()\n\tvoid OnClearSaveSlotConfirmQuestionAnswered();\n\n\tUFUNCTION()\n\tvoid OnHandleButtonPress(int32 SelectedChild, USoUIUserWidget* SoUserWidget);\n\n\n\tvoid RefreshCommandTooltips();\n\n\tbool CanRemoveSelectedSlot() const;\n\tbool CanLoadSelectedSlot() const;\n\nprotected:\n\n\t// The event that fires after a save slot is loaded\n\tUPROPERTY(BlueprintAssignable, Category = \">Events\")\n\tFOnSaveSlotLoaded SaveSlotLoaded;\n\n\tUPROPERTY(BlueprintAssignable, Category = \">Events\")\n\tFOnBlackFadeRequest BlackFadeRequest;\n\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\", meta = (BindWidget))\n\tUSoUIDifficultySelection* DifficultySelection;\n\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\", meta = (BindWidget))\n\tUSoUICommandTooltipArray* CommandTooltips;\n\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\", meta = (BindWidget))\n\tUSoUIConfirmQuestion* ClearSlotConfirmation;\n\n\n\tUPROPERTY(EditAnywhere, Category = SFX)\n\tUFMODEvent* SFXClearSlot = nullptr;\n\n\tUPROPERTY(EditAnywhere, Category = SFX)\n\tUFMODEvent* SFXLoadSlot = nullptr;\n\n\tUPROPERTY(EditAnywhere, Category = SFX)\n\tUFMODEvent* SFXStartNewSlot = nullptr;\n\n\t// All the cached save slots\n\tTMap<int32, FSoStateTable> SaveSlotsData;\n\n\tESoDifficulty CachedDifficulty;\n\tbool bIntroPlaying = false;\n\n\tfloat CutsceneStartCounter = -1.0f;\n};\n"
  },
  {
    "path": "Source/SOrb/UI/SoHUD.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#include \"SoHUD.h\"\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoHUD::OnLostFocusPause(bool bEnable)\n{\n\tSuper::OnLostFocusPause(bEnable);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid ASoHUD::HandleBugScreenShot()\n{\n\tSuper::HandleBugScreenShot();\n}\n"
  },
  {
    "path": "Source/SOrb/UI/SoHUD.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#pragma once\n\n#include \"GameFramework/HUD.h\"\n\n#include \"SoHUD.generated.h\"\n\n\nUCLASS()\nclass SORB_API ASoHUD : public AHUD\n{\n\tGENERATED_BODY()\npublic:\n\n\t// AHUD interfafce\n\n\t// NOTE: seems to be not used by anybody\n\tvoid OnLostFocusPause(bool bEnable) override;\n\n\t/** Gives the HUD a chance to display project-specific data when taking a \"bug\" screen shot.\t */\n\tvoid HandleBugScreenShot() override;\n};\n"
  },
  {
    "path": "Source/SOrb/UI/SoUICredits.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n\n#include \"SoUICredits.h\"\n\n#include \"Misc/FileHelper.h\"\n#include \"Misc/Paths.h\"\n#include \"Components/RichTextBlock.h\"\n\n#include \"Basic/Helpers/SoStaticHelper.h\"\n#include \"Basic/SoAudioManager.h\"\n#include \"Basic/Helpers/SoDateTimeHelper.h\"\n#include \"UI/General/SoUIPressAndHoldConfirmation.h\"\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUICredits::NativeConstruct()\n{\n\tSuper::NativeConstruct();\n\n\tif (SkipButton)\n\t{\n\t\tSkipButton->OnConfirmed().AddDynamic(this, &USoUICredits::Skip);\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUICredits::NativeDestruct()\n{\n\tSuper::NativeDestruct();\n\n\tif (SkipButton)\n\t\tSkipButton->OnConfirmed().RemoveDynamic(this, &USoUICredits::Skip);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUICredits::NativeTick(const FGeometry& MyGeometry, float InDeltaTime)\n{\n\tSuper::NativeTick(MyGeometry, InDeltaTime);\n\n\tswitch (ActiveState)\n\t{\n\t\tcase ESoUICreditsState::FadeIn:\n\t\t\tif (!IsAnimationPlaying(FadeAnim))\n\t\t\t{\n\t\t\t\tStartScroll();\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase ESoUICreditsState::FadeOut:\n\t\t\tif (FadeOutCounter > 0.0f)\n\t\t\t{\n\t\t\t\tFadeOutCounter -= InDeltaTime;\n\t\t\t\tif (FadeOutCounter <= 0.0f)\n\t\t\t\t{\n\t\t\t\t\tFadeOutFinished.Broadcast();\n\t\t\t\t\tUSoAudioManager::Get(this).SetMusic(MusicOnExit, true, -1.0f);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (!IsAnimationPlaying(FadeAnim))\n\t\t\t{\n\t\t\t\tHide();\n\t\t\t\tif (FadeOutCounter > 0.0f)\n\t\t\t\t\tFadeOutFinished.Broadcast();\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase ESoUICreditsState::Inactive:\n\t\t\tSetVisibility(ESlateVisibility::Collapsed);\n\t\t\tbreak;\n\n\t\tcase ESoUICreditsState::Scrolling:\n\t\t{\n\t\t\tCounter -= InDeltaTime;\n\t\t\tif (Counter <= 0.0f && !IsAnimationPlaying(ScrollAnim))\n\t\t\t{\n\t\t\t\tif (bUseFadeOut)\n\t\t\t\t\tFadeOut();\n\n\t\t\t\tCreditsFinished.Broadcast();\n\t\t\t}\n\t\t}\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUICredits::StartScroll()\n{\n\tSetVisibility(ESlateVisibility::Visible);\n\t// the value the fade might ruin\n\tSetRenderOpacity(1.0f);\n\n\tActiveState = ESoUICreditsState::Scrolling;\n\tStartScrollBP();\n\tCounter = USoDateTimeHelper::NormalizeTime(Duration);\n\n\tif (SkipButton->IsConfirmed())\n\t\tSkipButton->Reinitialize();\n\tSkipButton->SetConfirmationEnabled(true);\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUICredits::FadeIn(bool bInUseFadeOut)\n{\n\tif (ActiveState != ESoUICreditsState::Inactive)\n\t{\n\t\tStopAllAnimations();\n\t}\n\n\tbUseFadeOut = bInUseFadeOut;\n\tSetVisibility(ESlateVisibility::Visible);\n\tFadeInBP();\n\tActiveState = ESoUICreditsState::FadeIn;\n\n\tUSoAudioManager::Get(this).SetMusic(Music, true, -1.0f);\n\n\tSkipButton->Reinitialize();\n\tSkipButton->SetConfirmationEnabled(false);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUICredits::FadeOut()\n{\n\tif (ActiveState == ESoUICreditsState::FadeOut)\n\t{\n\t\treturn;\n\t}\n\n\t// BP call should be in previous state so we know if we might need to switch anim dir (if fade in)\n\tFadeOutBP();\n\tActiveState = ESoUICreditsState::FadeOut;\n\tFadeOutCounter = USoDateTimeHelper::NormalizeTime(0.5f);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUICredits::HandleCommand(ESoUICommand Command)\n{\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUICredits::Hide()\n{\n\tStopAllAnimations();\n\tActiveState = ESoUICreditsState::Inactive;\n\tSetVisibility(ESlateVisibility::Collapsed);\n\tUSoAudioManager::Get(this).SetMusic(MusicOnExit, true, -1.0f);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUICredits::Skip()\n{\n\tSkipButton->SetConfirmationEnabled(false);\n\tif (bUseFadeOut)\n\t\tFadeOut();\n\tCreditsFinished.Broadcast();\n}\n"
  },
  {
    "path": "Source/SOrb/UI/SoUICredits.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#pragma once\n\n#include \"CoreMinimal.h\"\n#include \"Blueprint/UserWidget.h\"\n\n#include \"UI/General/SoUITypes.h\"\n\n#include \"SoUICredits.generated.h\"\n\nDECLARE_DYNAMIC_MULTICAST_DELEGATE(FSoCreditsFinished);\n\nclass UFMODEvent;\nclass URichTextBlock;\nclass UWidgetAnimation;\nclass USoUIPressAndHoldConfirmation;\n\nUENUM(BlueprintType)\nenum class ESoUICreditsState : uint8\n{\n\t// only the buttons are visible\n\tInactive\t\t\t\tUMETA(DisplayName = \"Inactive\"),\n\tFadeIn\t\t\t\t\tUMETA(DisplayName = \"FadeIn\"),\n\tScrolling\t\t\t\tUMETA(DisplayName = \"Scrolling\"),\n\tFadeOut\t\t\t\t\tUMETA(DisplayName = \"FadeOut\"),\n\n\tNumOf\t\t\t\tUMETA(meta = Hidden)\n};\n\n\nUCLASS()\nclass SORB_API USoUICredits : public UUserWidget\n{\n\tGENERATED_BODY()\n\npublic:\n\n\tvoid NativeConstruct() override;\n\tvoid NativeDestruct() override;\n\tvoid NativeTick(const FGeometry& MyGeometry, float InDeltaTime) override;\n\n\t/** can be used from outside to directly start scroll instead of fading in (when the screen is black already anyway */\n\tUFUNCTION(BlueprintCallable)\n\tvoid StartScroll();\n\n\tUFUNCTION(BlueprintCallable)\n\tvoid FadeIn(bool bInUseFadeOut);\n\n\tUFUNCTION(BlueprintCallable)\n\tvoid FadeOut();\n\n\tUFUNCTION()\n\tvoid Skip();\n\n\n\tUFUNCTION(BlueprintCallable)\n\tvoid HandleCommand(ESoUICommand Command);\n\n\n\tFSoCreditsFinished& OnCreditsFinished() { return CreditsFinished; }\n\tFSoCreditsFinished& OnFadeOutFinished() { return FadeOutFinished; }\n\nprotected:\n\tvoid Hide();\n\n\tUFUNCTION(BlueprintImplementableEvent)\n\tvoid FadeInBP();\n\n\tUFUNCTION(BlueprintImplementableEvent)\n\tvoid FadeOutBP();\n\n\tUFUNCTION(BlueprintImplementableEvent)\n\tvoid StartScrollBP();\n\nprotected:\n\n\tUPROPERTY(BlueprintAssignable, Category = \">Events\")\n\tFSoCreditsFinished CreditsFinished;\n\n\tUPROPERTY(BlueprintAssignable, Category = \">Events\")\n\tFSoCreditsFinished FadeOutFinished;\n\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\", meta = (BindWidget))\n\tURichTextBlock* CreditsText;\n\n\tUPROPERTY(BlueprintReadWrite, Category = \">Widgets\", meta = (BindWidget))\n\tUSoUIPressAndHoldConfirmation* SkipButton;\n\n\tfloat FadeOutCounter = 0.0f;\n\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere)\n\tfloat Duration = 112.0f;\n\n\tfloat Counter;\n\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere)\n\tESoUICreditsState ActiveState = ESoUICreditsState::Inactive;\n\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere)\n\tUWidgetAnimation* FadeAnim = nullptr;\n\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere)\n\tUWidgetAnimation* ScrollAnim = nullptr;\n\n\t//\n\t// SFX\n\t//\n\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere, Category = \">SFX\")\n\tUFMODEvent* Music;\n\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere, Category = \">SFX\")\n\tUFMODEvent* MusicOnExit;\n\n\tbool bUseFadeOut = false;\n};\n"
  },
  {
    "path": "Source/SOrb/UI/SoUIHelper.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#include \"SoUIHelper.h\"\n\n#include \"Kismet/GameplayStatics.h\"\n#include \"Components/Widget.h\"\n#include \"UObject/UObjectIterator.h\"\n#include \"Engine/Texture.h\"\n#include \"Components/TextBlock.h\"\n\n#include \"Framework/Application/SlateApplication.h\"\n#include \"Fonts/FontMeasure.h\"\n\n#include \"Character/SoCharacter.h\"\n#include \"Basic/SoAudioManager.h\"\n#include \"Basic/Helpers/SoStaticHelper.h\"\n#include \"Basic/Helpers/SoMathHelper.h\"\n#include \"Character/SoPlayerController.h\"\n\n#include \"Items/SoInventoryComponent.h\"\n#include \"Items/ItemTemplates/SoItemTemplateShard.h\"\n#include \"Items/ItemTemplates/SoUsableItemTemplate.h\"\n#include \"Character/SoPlayerCharacterSheet.h\"\n#include \"Basic/Helpers/SoPlatformHelper.h\"\n#include \"Components/Image.h\"\n#include \"Components/HorizontalBoxSlot.h\"\n#include \"Settings/SoGameSettings.h\"\n#include \"General/Commands/SoUICommandImage.h\"\n#include \"UI/InGame/SoUINote.h\"\n\n#include \"SoLocalization.h\"\n\nDEFINE_LOG_CATEGORY_STATIC(LogSoUIHelper, All, All);\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nASoPlayerController* USoUIHelper::GetSoPlayerControllerFromUWidget(const UWidget* Widget)\n{\n\tif (Widget)\n\t\tif (APlayerController* PlayerController = Widget->GetOwningPlayer())\n\t\t\treturn Cast<ASoPlayerController>(PlayerController);\n\n\treturn nullptr;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFText USoUIHelper::RemapActionsToFText(const TArray<FInputActionKeyMapping>& ByActionMappings)\n{\n\t// Warn about unbinding\n\t// TODO check if this works\n\tFFormatOrderedArguments Arguments;\n\n\tconst int32 NumActions = ByActionMappings.Num();\n\tFString ActionNames;\n\tfor (int32 Index = 0; Index < NumActions; Index++)\n\t{\n\t\tActionNames += FSoInputActionName::GetTextForActionName(ByActionMappings[Index].ActionName).ToString();\n\n\t\t// Is not last\n\t\tif (Index != NumActions - 1)\n\t\t{\n\t\t\tActionNames += TEXT(\", \");\n\t\t}\n\t}\n\n\tArguments.Add(FText::FromString(ActionNames));\n\treturn FText::Format(FText::FromString(TEXT(\"{0}\")), Arguments);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoUIHelper::AreThereAnyKeyConflicts(const USoGameSettings* UserSettings, FName SelectedActionName, const FInputChord& SelectedKey, FText& OutWarning)\n{\n\t// Key conflicts are allowed but warn the user\n\tTArray<FInputActionKeyMapping> ByActionMappings;\n\tif (UserSettings->IsInputChordAlreadyUsed(SelectedActionName, SelectedKey, ESoInputActionCategoryType::GameOrUI, ByActionMappings))\n\t{\n\t\t// Key is valid, reassign to self, why not\n\t\tif (ByActionMappings.Num() == 1 && ByActionMappings[0].ActionName == SelectedActionName)\n\t\t\treturn true;\n\n\t\t// Warn about unbinding\n\t\tconst FText ActionNames = RemapActionsToFText(ByActionMappings);\n\t\tFFormatNamedArguments Arguments;\n\t\tArguments.Add(TEXT(\"Key\"), FSoInputKey::GetKeyDisplayName(SelectedKey.Key));\n\t\tArguments.Add(TEXT(\"NumActions\"), ByActionMappings.Num());\n\t\tArguments.Add(TEXT(\"ActionNames\"), ActionNames);\n\n\t\tOutWarning = FText::Format(FROM_STRING_TABLE_UI(\"input_actions_conflicts\"), Arguments);\n\t\treturn true;\n\t}\n\n\treturn false;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIHelper::ForceReloadAllUICommandImages()\n{\n\tfor (TObjectIterator<USoUICommandImage> Itr; Itr; ++Itr)\n\t{\n\t\tUSoUICommandImage* Image = *Itr;\n\t\tif (!IsValid(Image))\n\t\t\tcontinue;\n\n\t\tImage->ForceUpdateImage();\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIHelper::OpenEndGameFeedbackBrowserAndExplorer()\n{\n\t// Launch Feedback URL\n\tstatic const FString FeedbackURL = TEXT(\"https://goo.gl/forms/BYUrlPVrWVVDSXSr2\");\n\tUSoPlatformHelper::LaunchURL(FeedbackURL, true);\n\n\t// Open Saved/ Folder\n\tstatic const FString SaveDir = FPaths::ConvertRelativePathToFull(FPaths::ProjectSavedDir());\n\tUSoPlatformHelper::ExploreFolder(SaveDir);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIHelper::PreCacheTexture(UTexture* Texture)\n{\n\tif (!Texture)\n\t\treturn;\n\n\t// TODO: figure out best way to precache\n\tTexture->NeverStream = true;\n\t//Texture->MipGenSettings = TMGS_NoMipmaps;\n\t// Texture->LODGroup = TEXTUREGROUP_UI;\n\t// Texture->UpdateCachedLODBias();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIHelper::PreCacheTexture2D(UTexture2D* Texture)\n{\n\tif (!Texture)\n\t\treturn;\n\n\tPreCacheTexture(Texture);\n\t//const int32 AllowedMips = Texture->GetNumMipsAllowed(false);\n\t//Texture->StreamIn(AllowedMips, true);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIHelper::PreCacheImage(UImage* Image)\n{\n\tif (!Image)\n\t\treturn;\n\n\tPreCacheTexture(Cast<UTexture>(Image->Brush.GetResourceObject()));\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoUIHelper::CopyHorizontalBoxSlotToAnother(const UHorizontalBoxSlot* From, UHorizontalBoxSlot* To)\n{\n\tif (!From || !To)\n\t\treturn false;\n\n\tTo->Size = From->Size;\n\tTo->Padding = From->Padding;\n\tTo->HorizontalAlignment = From->HorizontalAlignment;\n\tTo->VerticalAlignment = From->VerticalAlignment;\n\tTo->SynchronizeProperties();\n\n\treturn true;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIHelper::SubscribeOnHealthChanged(UObject* WorldContextObject,\n\t\t\t\t\t\t\t\t\t\t   const FSoUINotifyTwoFloatSingle& OnHealthChanged,\n\t\t\t\t\t\t\t\t\t\t   bool bSubscribe)\n{\n\tASoCharacter* SoChar = USoStaticHelper::GetPlayerCharacterAsSoCharacter(WorldContextObject);\n\tif (!SoChar)\n\t\treturn;\n\n\tFSoUINotifyTwoFloat& Event = SoChar->GetPlayerCharacterSheet()->OnHealthChanged;\n\tif (bSubscribe)\n\t{\n\t\tif (!Event.Contains(OnHealthChanged))\n\t\t\tEvent.Add(OnHealthChanged);\n\t\telse\n\t\t\tUE_LOG(LogSoUIHelper, Warning, TEXT(\"SubscribeOnHealthChanged: Tried to subscribe but Event already exists\"));\n\t}\n\telse\n\t{\n\t\tif (Event.Contains(OnHealthChanged))\n\t\t\tEvent.Remove(OnHealthChanged);\n\t\telse\n\t\t\tUE_LOG(LogSoUIHelper, Warning, TEXT(\"SubscribeOnHealthChanged: Tried to unsubscribe but Event does not exist\"));\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIHelper::SubscribeOnDmgApplied(UObject* WorldContextObject,\n\t\t\t\t\t\t\t\t\t\tconst FSoUINotifyDmgSingle& OnDmgApplied,\n\t\t\t\t\t\t\t\t\t\tbool bSubscribe)\n{\n\tASoCharacter* SoChar = USoStaticHelper::GetPlayerCharacterAsSoCharacter(WorldContextObject);\n\tif (!SoChar)\n\t\treturn;\n\n\tFSoUINotifyDmg& Event = SoChar->GetPlayerCharacterSheet()->OnDmgApplied;\n\tif (bSubscribe)\n\t{\n\t\tif (!Event.Contains(OnDmgApplied))\n\t\t\tEvent.Add(OnDmgApplied);\n\t\telse\n\t\t\tUE_LOG(LogSoUIHelper, Warning, TEXT(\"SubscribeOnHealthChanged: Tried to subscribe but Event already exists\"));\n\t}\n\telse\n\t{\n\t\tif (Event.Contains(OnDmgApplied))\n\t\t\tEvent.Remove(OnDmgApplied);\n\t\telse\n\t\t\tUE_LOG(LogSoUIHelper, Warning, TEXT(\"SubscribeOnHealthChanged: Tried to unsubscribe but Event does not exist\"));\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIHelper::SubscribeOnBonusHealthChanged(UObject* WorldContextObject,\n\t\t\t\t\t\t\t\t\t\t\t\tconst FSoUINotifyDmgSingle& OnBonusHealthChanged,\n\t\t\t\t\t\t\t\t\t\t\t\tbool bSubscribe)\n{\n\tASoCharacter* SoChar = USoStaticHelper::GetPlayerCharacterAsSoCharacter(WorldContextObject);\n\tif (!SoChar)\n\t\treturn;\n\n\tFSoUINotifyDmg& Event = SoChar->GetPlayerCharacterSheet()->OnBonusHealthChanged;\n\tif (bSubscribe)\n\t{\n\t\tif (!Event.Contains(OnBonusHealthChanged))\n\t\t\tEvent.Add(OnBonusHealthChanged);\n\t\telse\n\t\t\tUE_LOG(LogSoUIHelper, Warning, TEXT(\"SubscribeOnHealthChanged: Tried to subscribe but Event already exists\"));\n\t}\n\telse\n\t{\n\t\tif (Event.Contains(OnBonusHealthChanged))\n\t\t\tEvent.Remove(OnBonusHealthChanged);\n\t\telse\n\t\t\tUE_LOG(LogSoUIHelper, Warning, TEXT(\"SubscribeOnHealthChanged: Tried to unsubscribe but Event does not exist\"));\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIHelper::Equip(UObject* WorldContextObject, int32 SourceInventoryIndex, ESoItemSlot TargetSlot)\n{\n\tASoCharacter* SoChar = USoStaticHelper::GetPlayerCharacterAsSoCharacter(WorldContextObject);\n\tif (!SoChar)\n\t\treturn;\n\n\tSoChar->GetPlayerCharacterSheet()->Equip(SourceInventoryIndex, TargetSlot);\n\n\tUFMODEvent* EquipSFX = nullptr;\n\tswitch (TargetSlot)\n\t{\n\t\tcase ESoItemSlot::EIS_ShardDefensive0:\n\t\tcase ESoItemSlot::EIS_ShardDefensive1:\n\t\tcase ESoItemSlot::EIS_ShardOffensive0:\n\t\tcase ESoItemSlot::EIS_ShardOffensive1:\n\t\tcase ESoItemSlot::EIS_ShardSpecial:\n\t\t\tEquipSFX = SoChar->SFXFClothEquip;\n\t\t\tbreak;\n\n\t\tcase ESoItemSlot::EIS_Item0:\n\t\tcase ESoItemSlot::EIS_Item1:\n\t\t{\n\t\t\tUSoUsableItemTemplate* Template = Cast<USoUsableItemTemplate>(SoChar->GetPlayerCharacterSheet()->GetEquippedItem(TargetSlot).Template);\n\t\t\tif (Template != nullptr && Template->UsableType == ESoUsableItemType::EUIT_Potion)\n\t\t\t\tEquipSFX = SoChar->SFXPotionEquip;\n\t\t\telse\n\t\t\t\tEquipSFX = SoChar->SFXUsableEquip;\n\t\t}\n\t\tbreak;\n\n\t\tcase ESoItemSlot::EIS_Weapon0:\n\t\tcase ESoItemSlot::EIS_Weapon1:\n\t\t\tEquipSFX = SoChar->SFXWeaponEquip;\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tbreak;\n\t}\n\n\tif (EquipSFX != nullptr)\n\t\tUSoAudioManager::PlaySoundAtLocation(SoChar, EquipSFX, {});\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIHelper::EquipFromSlot(UObject* WorldContextObject, int32 SourceInventoryIndex)\n{\n\tASoCharacter* SoChar = USoStaticHelper::GetPlayerCharacterAsSoCharacter(WorldContextObject);\n\tif (!SoChar)\n\t\treturn;\n\n\tif (SoChar->GetInventory()->IsValidIndex(SourceInventoryIndex))\n\t{\n\t\tconst FSoItem& Item = SoChar->GetInventory()->GetItem(SourceInventoryIndex);\n\t\tUFMODEvent* EquipSFX = nullptr;\n\n\t\tswitch (Item.Template->GetItemType())\n\t\t{\n\t\tcase ESoItemType::EIT_Shard:\n\t\t\tEquipSFX = SoChar->SFXFClothEquip;\n\t\t\tbreak;\n\n\t\tcase ESoItemType::EIT_Weapon:\n\t\t\tEquipSFX = SoChar->SFXWeaponEquip;\n\t\t\tbreak;\n\n\t\tcase ESoItemType::EIT_UsableItem:\n\t\t\tif (Cast<USoUsableItemTemplate>(Item.Template)->UsableType == ESoUsableItemType::EUIT_Potion)\n\t\t\t\tEquipSFX = SoChar->SFXPotionEquip;\n\t\t\telse\n\t\t\t\tEquipSFX = SoChar->SFXUsableEquip;\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tbreak;\n\t\t}\n\n\t\tif (EquipSFX != nullptr)\n\t\t\tUSoAudioManager::PlaySoundAtLocation(SoChar, EquipSFX, {});\n\t}\n\tSoChar->GetPlayerCharacterSheet()->EquipFromSlot(SourceInventoryIndex);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIHelper::Unequip(UObject* WorldContextObject, ESoItemSlot TargetSlot)\n{\n\tASoCharacter* SoChar = USoStaticHelper::GetPlayerCharacterAsSoCharacter(WorldContextObject);\n\tif (!SoChar)\n\t\treturn;\n\n\tSoChar->GetPlayerCharacterSheet()->Unequip(TargetSlot);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoUIHelper::CanPlayerEquipToSlot(UObject* WorldContextObject, ESoItemSlot TargetSlot)\n{\n\tASoCharacter* SoChar = USoStaticHelper::GetPlayerCharacterAsSoCharacter(WorldContextObject);\n\treturn SoChar->CanEquipToSlot(TargetSlot);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoUIHelper::CanPlayerEquipItem(UObject* WorldContextObject, USoItemTemplate* Template)\n{\n\tif (Template == nullptr || !Template->IsEquipable())\n\t\treturn false;\n\n\treturn USoUIHelper::CanPlayerEquipToSlot(WorldContextObject, Template->GetDefaultSlot());\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIHelper::DrinkPotionFromInventory(UObject* WorldContextObject, int32 SourceInventoryIndex)\n{\n\tASoCharacter* SoChar = USoStaticHelper::GetPlayerCharacterAsSoCharacter(WorldContextObject);\n\tif (SoChar != nullptr && SoChar->GetPlayerCharacterSheet() != nullptr)\n\t\tSoChar->GetPlayerCharacterSheet()->DrinkPotionFromInventory(SourceInventoryIndex);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIHelper::SwapSlots(UObject* WorldContextObject, ESoItemSlot SourceSlot, ESoItemSlot TargetSlot)\n{\n\tASoCharacter* SoChar = USoStaticHelper::GetPlayerCharacterAsSoCharacter(WorldContextObject);\n\tif (SoChar != nullptr)\n\t\tSoChar->GetPlayerCharacterSheet()->SwapSlots(SourceSlot, TargetSlot);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nconst FSoItem& USoUIHelper::GetEquippedItem(UObject* WorldContextObject, ESoItemSlot ItemSlot)\n{\n\tASoCharacter* SoChar = USoStaticHelper::GetPlayerCharacterAsSoCharacter(WorldContextObject);\n\treturn SoChar->GetPlayerCharacterSheet()->GetEquippedItem(ItemSlot);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoUIHelper::HasItem(UObject* WorldContextObject, USoItemTemplate* Item)\n{\n\tif (WorldContextObject != nullptr)\n\t{\n\t\tASoCharacter* SoChar = USoStaticHelper::GetPlayerCharacterAsSoCharacter(WorldContextObject);\n\t\treturn SoChar->GetInventory()->HasItem(Item) || SoChar->GetPlayerCharacterSheet()->IsItemEquipped(Item);\n\t}\n\treturn false;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUSoItemTemplateShard* USoUIHelper::GetShardTemplateFromEquipped(UObject* WorldContextObject, ESoItemSlot ItemSlot)\n{\n\tASoCharacter* SoChar = USoStaticHelper::GetPlayerCharacterAsSoCharacter(WorldContextObject);\n\tFSoItem& Item = SoChar->GetPlayerCharacterSheet()->GetEquippedItem(ItemSlot);\n\treturn Cast<USoItemTemplateShard>(Item.Template);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUSoItemTemplateShard* USoUIHelper::GetShardTemplateFromItems(const TArray<USoItemTemplate*>& Items, ESoItemSlot ItemSlot)\n{\n\t// TODO make the world state metadata entry to be a map? O(1) instead of O(20) does it make sense?\n\tfor (USoItemTemplate* Template : Items)\n\t\tif (USoItemTemplateShard* ShardTemplate = Cast<USoItemTemplateShard>(Template))\n\t\t\tif (ShardTemplate->GetDefaultSlot() == ItemSlot)\n\t\t\t\treturn ShardTemplate;\n\n\treturn nullptr;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoUIHelper::HasItemEquippedAboveSlot(UObject* WorldContextObject, ESoItemSlot ItemSlot)\n{\n\t// DO we need this?\n\treturn false;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIHelper::SubscribeOnEquipmentSlotChanged(UObject* WorldContextObject,\n\t\t\t\t\t\t\t\t\t\t\t\t  const FSoEquipmentSlotChangedSingle& OnEquipmentSlotChanged,\n\t\t\t\t\t\t\t\t\t\t\t\t  bool bSubscribe)\n{\n\tASoCharacter* SoChar = USoStaticHelper::GetPlayerCharacterAsSoCharacter(WorldContextObject);\n\tif (!SoChar)\n\t\treturn;\n\n\tif (bSubscribe)\n\t\tSoChar->GetPlayerCharacterSheet()->OnSlotChanged.Add(OnEquipmentSlotChanged);\n\telse\n\t\tSoChar->GetPlayerCharacterSheet()->OnSlotChanged.Remove(OnEquipmentSlotChanged);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIHelper::SubscribeOnRecalculateAttributes(UObject* WorldContextObject,\n\t\t\t\t\t\t\t\t\t\t\t\t   const FSoUINotifySingle& OnRecalculateAttributes,\n\t\t\t\t\t\t\t\t\t\t\t\t   bool bSubscribe)\n{\n\tASoCharacter* SoChar = USoStaticHelper::GetPlayerCharacterAsSoCharacter(WorldContextObject);\n\tif (!SoChar)\n\t\treturn;\n\n\tif (bSubscribe)\n\t\tSoChar->GetPlayerCharacterSheet()->OnRecalculateAttributes.Add(OnRecalculateAttributes);\n\telse\n\t\tSoChar->GetPlayerCharacterSheet()->OnRecalculateAttributes.Remove(OnRecalculateAttributes);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nint32 USoUIHelper::NavigateInMatrix(ESoUICommand Command, int32 StartIndex, int32 ColNum, int32 ItemNum)\n{\n\tCommand = TryTranslateMenuCommandDirectionToGame(Command);\n\tconst int32 RowNum = ItemNum / ColNum + 1;\n\n\tif (ItemNum < 2 || RowNum < 1 || ColNum < 1)\n\t\treturn 0;\n\n\n\tint32 ColIndex = StartIndex % ColNum;\n\tint32 RowIndex = StartIndex / ColNum;\n\n\t// col num in the selected row, used if we step inside the row, can be < in the last row\n\tconst int32 ColNumInRow = (RowIndex == RowNum - 1) ? ItemNum - (RowNum - 1) * ColNum : ColNum;\n\t// row num in selected col, used if we step inside the col, can be < if the last line doesn't have item at this row;\n\tconst int32 RowNumInCol = (ColIndex < ItemNum % ColNum) ? RowNum : RowNum - 1;\n\n\tswitch (Command)\n\t{\n\t\tcase ESoUICommand::EUC_Down:\n\t\t\tRowIndex = (RowIndex + 1) % RowNumInCol;\n\t\t\tbreak;\n\n\t\tcase ESoUICommand::EUC_Up:\n\t\t\tRowIndex = USoMathHelper::WrapIndexAround(RowIndex - 1, RowNumInCol);\n\t\t\tbreak;\n\n\t\tcase ESoUICommand::EUC_Left:\n\t\t\tColIndex = USoMathHelper::WrapIndexAround(ColIndex - 1, ColNumInRow);\n\t\t\tbreak;\n\n\t\tcase ESoUICommand::EUC_Right:\n\t\t\tColIndex = (ColIndex + 1) % ColNumInRow;\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tbreak;\n\t}\n\n\treturn RowIndex * ColNum + ColIndex;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUSoInventoryComponent* USoUIHelper::GetPlayerInventory(UObject* WorldContextObject)\n{\n\tASoCharacter* SoChar = USoStaticHelper::GetPlayerCharacterAsSoCharacter(WorldContextObject);\n\tif (SoChar != nullptr)\n\t\treturn SoChar->GetInventory();\n\n\treturn nullptr;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nESoItemType USoUIHelper::GetTypeFromSlot(ESoItemSlot Slot)\n{\n\tswitch (Slot)\n\t{\n\t\tcase ESoItemSlot::EIS_ShardDefensive0:\n\t\tcase ESoItemSlot::EIS_ShardDefensive1:\n\t\tcase ESoItemSlot::EIS_ShardOffensive0:\n\t\tcase ESoItemSlot::EIS_ShardOffensive1:\n\t\tcase ESoItemSlot::EIS_ShardSpecial:\n\t\t\treturn ESoItemType::EIT_Shard;\n\n\t\tcase ESoItemSlot::EIS_Item0:\n\t\tcase ESoItemSlot::EIS_Item1:\n\t\t\treturn ESoItemType::EIT_UsableItem;\n\n\t\tcase ESoItemSlot::EIS_Weapon0:\n\t\tcase ESoItemSlot::EIS_Weapon1:\n\t\t\treturn ESoItemType::EIT_Weapon;\n\n\t\tdefault:\n\t\t\treturn ESoItemType::EIT_MAX;\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nint32 USoUIHelper::GetSelectedIndexAfterNavigation(ESoUICommand Command, int32 StartIndex, const TArray<ESoItemSlot>& SlotArray)\n{\n\t// translate MainMenu commands to Left/Right/Up/Down\n\tCommand = TryTranslateMenuCommandDirectionToGame(Command);\n\n\tif (Command > ESoUICommand::EUC_Down)\n\t\treturn StartIndex;\n\n\tverify(static_cast<int32>(Command) < 4);\n\n\t// NextSlot = Slots[SourceSlot][left | right | up | down]\n\tstatic constexpr ESoItemSlot Slots[static_cast<int32>(ESoItemSlot::EIS_Max)+2][4] =\n\t{\n\t\t/* EIS_ShardDefensive0\t*/ { ESoItemSlot::EIS_ShardDefensive1,\tESoItemSlot::EIS_ShardDefensive1,\tESoItemSlot::EIS_Weapon1,\t\t\tESoItemSlot::EIS_ShardSpecial },\n\t\t/* EIS_ShardDefensive1\t*/ { ESoItemSlot::EIS_ShardDefensive0,\tESoItemSlot::EIS_ShardDefensive0,\tESoItemSlot::EIS_Item1,\t\t\t\tESoItemSlot::EIS_ShardSpecial },\n\t\t/* EIS_ShardOffensive0\t*/ { ESoItemSlot::EIS_ShardOffensive1,\tESoItemSlot::EIS_ShardOffensive1,\tESoItemSlot::EIS_ShardSpecial,\t\tESoItemSlot::EIS_Weapon0 },\n\t\t/* EIS_ShardOffensive1\t*/ { ESoItemSlot::EIS_ShardOffensive0,\tESoItemSlot::EIS_ShardOffensive0,\tESoItemSlot::EIS_ShardSpecial,\t\tESoItemSlot::EIS_Item0 },\n\t\t/* EIS_ShardSpecial\t\t*/ { ESoItemSlot::EIS_ShardDefensive0,\tESoItemSlot::EIS_ShardDefensive1,\tESoItemSlot::EIS_ShardDefensive0,\tESoItemSlot::EIS_ShardOffensive0 },\n\n\t\t/* EIS_Item0\t\t\t*/ { ESoItemSlot::EIS_Weapon0,\t\tESoItemSlot::EIS_Weapon0,\tESoItemSlot::EIS_ShardOffensive1,\tESoItemSlot::EIS_Item1 },\n\t\t/* EIS_Item1\t\t\t*/ { ESoItemSlot::EIS_Weapon1,\t\tESoItemSlot::EIS_Weapon1,\tESoItemSlot::EIS_Item0,\t\t\t\tESoItemSlot::EIS_ShardDefensive1 },\n\n\t\t/* EIS_Weapon0\t\t\t*/ { ESoItemSlot::EIS_Item0,\t\tESoItemSlot::EIS_Item0,\t\tESoItemSlot::EIS_ShardOffensive0,\tESoItemSlot::EIS_Weapon1 },\n\t\t/* EIS_Weapon1\t\t\t*/ { ESoItemSlot::EIS_Item1,\t\tESoItemSlot::EIS_Item1,\t\tESoItemSlot::EIS_Weapon0,\t\t\tESoItemSlot::EIS_ShardDefensive0 },\n\t};\n\n\tconst int32 Index = static_cast<int32>(SlotArray[StartIndex]);\n\n\tauto FindIndex = [&SlotArray, StartIndex](ESoItemSlot Slot)\n\t{\n\t\tfor (int32 i = 0; i < SlotArray.Num(); ++i)\n\t\t\tif (SlotArray[i] == Slot)\n\t\t\t\treturn i;\n\n\t\treturn StartIndex;\n\t};\n\n\treturn FindIndex(Slots[Index][static_cast<int32>(Command)]);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIHelper::AddItemsToCharacter(UObject* WorldContextObject, const TArray<FSoItem>& ItemsToAdd)\n{\n\tASoCharacter* SoChar = USoStaticHelper::GetPlayerCharacterAsSoCharacter(WorldContextObject);\n\tfor (const FSoItem& Item : ItemsToAdd)\n\t\tSoChar->AddItem(Item);\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoUIHelper::PredicateSortNoteAddedTime(const USoUINote& A, const USoUINote& B)\n{\n\tif (ASoCharacter* SoChar = USoStaticHelper::GetPlayerCharacterAsSoCharacter(&A))\n\t{\n\t\tconst float TimeA = IDlgDialogueParticipant::Execute_GetFloatValue(SoChar, A.ID);\n\t\tconst float TimeB = IDlgDialogueParticipant::Execute_GetFloatValue(SoChar, B.ID);\n\n\t\treturn TimeA < TimeB;\n\t}\n\n\treturn false;\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nTArray<USoUINote*> USoUIHelper::OrderNotes(UObject* WorldContextObject, const TArray<USoUINote*>& NotesToOrder)\n{\n\tTArray<USoUINote*> OrderedNotes;\n\tTArray<USoUINote*> HiddenNotes;\n\n\tif (ASoCharacter* SoChar = USoStaticHelper::GetPlayerCharacterAsSoCharacter(WorldContextObject))\n\t\tfor (USoUINote* Note : NotesToOrder)\n\t\t{\n\t\t\tif (IDlgDialogueParticipant::Execute_GetIntValue(SoChar, Note->ID) > 0)\n\t\t\t\tOrderedNotes.Add(Note);\n\t\t\telse\n\t\t\t\tHiddenNotes.Add(Note);\n\t\t}\n\n\tOrderedNotes.Sort(USoUIHelper::PredicateSortNoteAddedTime);\n\tOrderedNotes.Append(HiddenNotes);\n\n\treturn OrderedNotes;\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFVector2D USoUIHelper::MeasureWrappedString(const FSlateFontInfo& FontInfo, const FString& Text, float WrapWidth)\n{\n\t// CODE FROM FORUM\n\t// https://forums.unrealengine.com/development-discussion/blueprint-visual-scripting/1656855-how-to-measure-rendered-size-of-a-string\n\n\tFVector2D Size(0.0f, 0.0f);\n\n\t// Everything we do here duplicates what FSlateFontMeasure::MeasureStringInternal()\n\t// already does. Sadly, the existing method is private and there's no exposed method\n\t// that happens to call it in a way we can work with...\n\n\t// Scan the entire string, keeping track of where lines begin and checking every time\n\t// a whitespace is encountered how long the line would be when wrapped there.\n\t// We could do this in a more fancy way with binary search and by guessing lengths,\n\t// but it's typically done just one when new text is displayed, so this is good enough.\n\t{\n\t\tTSharedRef<FSlateFontMeasure> FontMeasureService = (FSlateApplication::Get().GetRenderer()->GetFontMeasureService());\n\t\tint32 LineCount = 1;\n\t\tbool bLastWasWhitespace = true;\n\n\t\tbool bFoundLineStartIndex = false;\n\t\tint32 LineStartIndex = 0;\n\n\t\tint32 LastGoodWrapIndex = -1;\n\t\tfloat LastGoodWrapWidth = 0.0f;\n\n\t\t// Scanning loop, steps through the string character by character\n\t\tint32 TextLength = Text.Len();\n\t\tfor (int32 Index = 0; Index < TextLength; ++Index)\n\t\t{\n\n\t\t\t// Check if the current character is a whitespace character (and thus, the line\n\t\t\t// can be broken at this point)\n\t\t\tTCHAR Character = Text[Index];\n\t\t\tbool bIsWhitespace = ((Character == TEXT(' ')) || (Character == TEXT('\\t')) || (Character == TEXT('\\n')));\n\n\t\t\t// If we have a line start index (meaning there was a non-whitespace character),\n\t\t\t// do the line break checking\n\t\t\tif (bFoundLineStartIndex)\n\t\t\t{\n\t\t\t\t// Don't re-check line breaks on consecutive whitespaces\n\t\t\t\tif (bIsWhitespace && bLastWasWhitespace)\n\t\t\t\t{\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tbLastWasWhitespace = bIsWhitespace;\n\n\t\t\t\t// If this is no whitespace, we can't wrap here, so continue scanning\n\t\t\t\tif (!bIsWhitespace)\n\t\t\t\t{\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// Measure the line up until the whitespace we just encountered\n\t\t\t\tFVector2D PotentialLineSize = FontMeasureService->Measure(Text, LineStartIndex, Index - 1, FontInfo, false);\n\n\t\t\t // If it still fits in the line, remember this as the most recent good wrap ppoint\n\t\t\t\tif (PotentialLineSize.X < WrapWidth)\n\t\t\t\t{\n\t\t\t\t\tLastGoodWrapIndex = Index;\n\t\t\t\t\tLastGoodWrapWidth = PotentialLineSize.X;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t++LineCount;\n\n\t\t\t\t\tif (LastGoodWrapIndex == -1)\n\t\t\t\t\t{\n\t\t\t\t\t\t// First whitespace and it's already too long...\n\t\t\t\t\t\tSize.X = FMath::Max(Size.X, PotentialLineSize.X);\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\t// Phew... we have a good wrapping position remembered\n\t\t\t\t\t\tSize.X = FMath::Max(Size.X, LastGoodWrapWidth);\n\t\t\t\t\t}\n\n\t\t\t\t\t// Reset all trackers to scan for a new line from here\n\t\t\t\t\tLastGoodWrapIndex = -1;\n\t\t\t\t\tLineStartIndex = Index;\n\t\t\t\t\tbFoundLineStartIndex = false;\n\t\t\t\t }\n\n\t\t\t}\n\t\t\telse if (!bIsWhitespace)\n\t\t\t{\n\t\t\t\tbFoundLineStartIndex = true; // The first non-whitespace character marks the line start\n\t\t\t\tLineStartIndex = Index;\n\t\t\t}\n\n\t\t} // for\n\n\t\t// If there are characters remaining on the last line, measure them, too\n\t\t// (we also know it doesn't end in a space/newline because otherwise this\n\t\t// property would have a value of false, thus this final check is really basic)\n\t\tif (bFoundLineStartIndex)\n\t\t{\n\t\t\tFVector2D finalLineSize = FontMeasureService->Measure(Text, LineStartIndex, TextLength - 1, FontInfo, false);\n\t\t\tSize.X = FMath::Max(Size.X, finalLineSize.X);\n\t\t}\n\n\t\tSize.Y = (static_cast<float>(FontMeasureService->GetMaxCharacterHeight(FontInfo)) * LineCount);\n\t}\n\n\treturn Size;\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoUIHelper::FixTextSize(UTextBlock* TextBlock, float WrapWidth, int32 DefaultFontSize, float MaxAllowedHeight, int32 MinFontSize)\n{\n\tif (TextBlock == nullptr)\n\t\treturn;\n\n\tauto SetFontSize = [TextBlock](float Size)\n\t{\n\t\tFSlateFontInfo FontInfo = TextBlock->Font;\n\t\tFontInfo.Size = Size;\n\t\tTextBlock->SetFont(FontInfo);\n\t};\n\n\tSetFontSize(DefaultFontSize);\n\n\tfloat ActualHeight = MeasureWrappedString(TextBlock->Font, TextBlock->GetText().ToString(), WrapWidth).Y;\n\tfor (int32 FontSize = DefaultFontSize - 1; ActualHeight > MaxAllowedHeight && FontSize >= MinFontSize; --FontSize)\n\t{\n\t\tSetFontSize(FontSize);\n\t\tActualHeight = MeasureWrappedString(TextBlock->Font, TextBlock->GetText().ToString(), WrapWidth).Y;\n\t}\n}\n\nFLinearColor USoUIHelper::GetFrameMSDisplayColor(float FrameTimeMS)\n{\n\tif (!GEngine)\n\t\treturn FLinearColor::White;\n\n\treturn FLinearColor(GEngine->GetFrameTimeDisplayColor(FrameTimeMS));\n}\n"
  },
  {
    "path": "Source/SOrb/UI/SoUIHelper.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#pragma once\n#include \"CoreMinimal.h\"\n#include \"Kismet/BlueprintFunctionLibrary.h\"\n\n#include \"Items/SoItem.h\"\n#include \"UI/General/SoUITypes.h\"\n\n#include \"SoUIHelper.generated.h\"\n\nclass UHorizontalBoxSlot;\nclass ASoPlayerController;\nclass UWidget;\nclass UTexture2D;\nclass UImage;\nclass UTexture;\nclass USoGameSettings;\nclass USoUINote;\nclass USoItemTemplate;\nclass USoItemTemplateShard;\nclass USoInventoryComponent;\nclass UTextBlock;\nstruct FInputChord;\nstruct FInputActionKeyMapping;\n\n\n/**\n *  Interface between the player character and UMG\n *  Had to be created because when the UI knew the\n *  ASoCharacter/USoPlayerCharacterSheet that lead to\n *  \"REINST\" errors\n */\nUCLASS()\nclass SORB_API USoUIHelper : public UBlueprintFunctionLibrary\n{\n\tGENERATED_BODY()\n\npublic:\n\t//\n\t// Helper\n\t//\n\tstatic ASoPlayerController* GetSoPlayerControllerFromUWidget(const UWidget* Widget);\n\n\t// Input settings helper\n\tstatic FText RemapActionsToFText(const TArray<FInputActionKeyMapping>& ByActionMappings);\n\tstatic bool AreThereAnyKeyConflicts(const USoGameSettings* UserSettings, FName SelectedActionName, const FInputChord& SelectedKey, FText& OutWarning);\n\n\t// Reloads the image of all the command images\n\tstatic void ForceReloadAllUICommandImages();\n\n\n\t//UFUNCTION(BlueprintPure, Category = \"UI\", meta = (WorldContext = \"WorldContextObject\"))\n\t//static bool AreUIInputsPressed(UObject* WorldContextObject);\n\n\tUFUNCTION(BlueprintCallable, Category = \"UI\")\n\tstatic void OpenEndGameFeedbackBrowserAndExplorer();\n\n\t// Load texture into memory so that we do not see any blurring images.\n\tUFUNCTION(BlueprintCallable, Category = \"Cache\")\n\tstatic void PreCacheTexture(UTexture* Texture);\n\n\tUFUNCTION(BlueprintCallable, Category = \"Cache\")\n\tstatic void PreCacheTexture2D(UTexture2D* Texture);\n\n\tUFUNCTION(BlueprintCallable, Category = \"Cache\")\n\tstatic void PreCacheImage(UImage* Texture);\n\n\tUFUNCTION(BlueprintCallable)\n\tstatic bool CopyHorizontalBoxSlotToAnother(const UHorizontalBoxSlot* From, UHorizontalBoxSlot* To);\n\n\t// Tries to convert a Menu<Command> to a Game Command\n\t// If no match is found just returns the original input Command\n\tUFUNCTION(BlueprintPure, Category = \"UI\")\n\tstatic FORCEINLINE ESoUICommand TryTranslateMenuCommandDirectionToGame(ESoUICommand Command)\n\t{\n\t\tswitch (Command)\n\t\t{\n\t\tcase ESoUICommand::EUC_MainMenuLeft:\n\t\t\treturn ESoUICommand::EUC_Left;\n\t\tcase ESoUICommand::EUC_MainMenuRight:\n\t\t\treturn ESoUICommand::EUC_Right;\n\t\tcase ESoUICommand::EUC_MainMenuDown:\n\t\t\treturn ESoUICommand::EUC_Down;\n\t\tcase ESoUICommand::EUC_MainMenuUp:\n\t\t\treturn ESoUICommand::EUC_Up;\n\t\t\t//case ESoUICommand::EUC_MainMenuBack:\n\t\t\t\t//return ESoUICommand::EUC_ActionBack;\n\t\tdefault:\n\t\t\tbreak;\n\t\t}\n\n\t\treturn Command;\n\t}\n\n\t//\n\t// Subscribe\n\t//\n\tUFUNCTION(BlueprintCallable, Category = \"Character\", meta = (WorldContext = \"WorldContextObject\"))\n\tstatic void SubscribeOnHealthChanged(UObject* WorldContextObject,\n\t\t\t\t\t\t\t\t\t\t const FSoUINotifyTwoFloatSingle& OnHealthChanged,\n\t\t\t\t\t\t\t\t\t\t bool bSubscribe = true);\n\n\tUFUNCTION(BlueprintCallable, Category = \"Character\", meta = (WorldContext = \"WorldContextObject\"))\n\tstatic void SubscribeOnDmgApplied(UObject* WorldContextObject,\n\t\t\t\t\t\t\t\t\t  const FSoUINotifyDmgSingle& OnDmgApplied,\n\t\t\t\t\t\t\t\t\t  bool bSubscribe = true);\n\n\tUFUNCTION(BlueprintCallable, Category = \"Character\", meta = (WorldContext = \"WorldContextObject\"))\n\tstatic void SubscribeOnBonusHealthChanged(UObject* WorldContextObject,\n\t\t\t\t\t\t\t\t\t\t\t  const FSoUINotifyDmgSingle& OnBonusHealthChanged,\n\t\t\t\t\t\t\t\t\t\t\t  bool bSubscribe = true);\n\n\t//\n\t// CharacterSheet\n\t//\n\n\tUFUNCTION(BlueprintPure, Category = \"PlayerEquipment\")\n\tstatic int32 GetSelectedIndexAfterNavigation(ESoUICommand Command, int32 StartIndex, const TArray<ESoItemSlot>& SlotArray);\n\n\tUFUNCTION(BlueprintPure, Category = \"PlayerEquipment\")\n\tstatic ESoItemType GetTypeFromSlot(ESoItemSlot Slot);\n\n\t// Equip an item from the inventory\n\tUFUNCTION(BlueprintCallable, Category = \"PlayerEquipment\", meta = (WorldContext = \"WorldContextObject\"))\n\tstatic void Equip(UObject* WorldContextObject, int32 SourceInventoryIndex, ESoItemSlot TargetSlot);\n\n\t// Equip an item from the inventory\n\tUFUNCTION(BlueprintCallable, Category = \"PlayerEquipment\", meta = (WorldContext = \"WorldContextObject\"))\n\tstatic void EquipFromSlot(UObject* WorldContextObject, int32 SourceInventoryIndex);\n\n\tUFUNCTION(BlueprintCallable, Category = \"PlayerEquipment\", meta = (WorldContext = \"WorldContextObject\"))\n\tstatic void Unequip(UObject* WorldContextObject, ESoItemSlot TargetSlot);\n\n\tUFUNCTION(BlueprintPure, Category = \"PlayerEquipment\", meta = (WorldContext = \"WorldContextObject\"))\n\tstatic bool CanPlayerEquipToSlot(UObject* WorldContextObject, ESoItemSlot TargetSlot);\n\n\tUFUNCTION(BlueprintPure, Category = \"PlayerEquipment\", meta = (WorldContext = \"WorldContextObject\"))\n\tstatic bool CanPlayerEquipItem(UObject* WorldContextObject, USoItemTemplate* Template);\n\n\tUFUNCTION(BlueprintCallable, Category = \"PlayerEquipment\", meta = (WorldContext = \"WorldContextObject\"))\n\tstatic void DrinkPotionFromInventory(UObject* WorldContextObject, int32 SourceInventoryIndex);\n\n\n\t// move an item from a character sheet slot to another\n\t// TargetSlot can be empty, SourceSlot can not\n\tUFUNCTION(BlueprintCallable, Category = \"PlayerEquipment\", meta = (WorldContext = \"WorldContextObject\"))\n\tstatic void SwapSlots(UObject* WorldContextObject, ESoItemSlot SourceSlot, ESoItemSlot TargetSlot);\n\n\tUFUNCTION(BlueprintCallable, Category = \"PlayerEquipment\", meta = (WorldContext = \"WorldContextObject\"))\n\tstatic const FSoItem& GetEquippedItem(UObject* WorldContextObject, ESoItemSlot ItemSlot);\n\n\tUFUNCTION(BlueprintPure, Category = \"PlayerEquipment\", meta = (WorldContext = \"WorldContextObject\"))\n\tstatic bool HasItem(UObject* WorldContextObject, USoItemTemplate* Item);\n\n\tUFUNCTION(BlueprintPure, Category = \"PlayerEquipment\", meta = (WorldContext = \"WorldContextObject\"))\n\tstatic USoItemTemplateShard* GetShardTemplateFromEquipped(UObject* WorldContextObject, ESoItemSlot ItemSlot);\n\n\t// Same as GetShardTemplateFromEquipped but this gets the cloth template from a list of items\n\tUFUNCTION(BlueprintPure, Category = \"PlayerEquipment\")\n\tstatic USoItemTemplateShard* GetShardTemplateFromItems(const TArray<USoItemTemplate*>& Items, ESoItemSlot ItemSlot);\n\n\tUFUNCTION(BlueprintCallable, Category = \"PlayerEquipment\", meta = (WorldContext = \"WorldContextObject\"))\n\tstatic void SubscribeOnEquipmentSlotChanged(UObject* WorldContextObject,\n\t\t\t\t\t\t\t\t\t\t\t\tconst FSoEquipmentSlotChangedSingle& OnEquipmentSlotChanged,\n\t\t\t\t\t\t\t\t\t\t\t\tbool bSubscribe = true);\n\n\tUFUNCTION(BlueprintPure, Category = \"PlayerEquipment\", meta = (WorldContext = \"WorldContextObject\"))\n\tstatic bool HasItemEquippedAboveSlot(UObject* WorldContextObject, ESoItemSlot ItemSlot);\n\n\tUFUNCTION(BlueprintCallable, Category = \"PlayerEquipment\", meta = (WorldContext = \"WorldContextObject\"))\n\tstatic void SubscribeOnRecalculateAttributes(UObject* WorldContextObject,\n\t\t\t\t\t\t\t\t\t\t\t\t const FSoUINotifySingle& OnRecalculateAttributes,\n\t\t\t\t\t\t\t\t\t\t\t\t bool bSubscribe = true);\n\n\n\tUFUNCTION(BlueprintCallable, Category = \"PlayerPresets\")\n\tstatic int32 NavigateInMatrix(ESoUICommand Command, int32 StartIndex, int32 ColNum, int32 ItemNum);\n\n\n\t//\n\t// Inventory\n\t//\n\tUFUNCTION(BlueprintPure, Category = \"PlayerEquipment\", meta = (WorldContext = \"WorldContextObject\"))\n\tstatic USoInventoryComponent* GetPlayerInventory(UObject* WorldContextObject);\n\n\tUFUNCTION(BlueprintCallable, Category = \"PlayerEquipment\", meta = (WorldContext = \"WorldContextObject\"))\n\tstatic void AddItemsToCharacter(UObject* WorldContextObject, const TArray<FSoItem>& ItemsToAdd);\n\n\n\n\tstatic bool PredicateSortNoteAddedTime(const USoUINote& A, const USoUINote& B);\n\n\tUFUNCTION(BlueprintCallable, Category = \"Notes\", meta = (WorldContext = \"WorldContextObject\"))\n\tstatic TArray<USoUINote*> OrderNotes(UObject* WorldContextObject, const TArray<USoUINote*>& NotesToOrder);\n\n\tUFUNCTION(BlueprintPure, Category = \"FontHelper\", meta = (WorldContext = \"WorldContextObject\"))\n\tstatic FVector2D MeasureWrappedString(const FSlateFontInfo& FontInfo, const FString& Text, float WrapWidth);\n\n\tUFUNCTION(BlueprintCallable, Category = \"FontHelper\", meta = (WorldContext = \"WorldContextObject\"))\n\tstatic void FixTextSize(UTextBlock* TextBlock, float WrapWidth, int32 DefaultFontSize, float MaxAllowedHeight, int32 MinFontSize);\n\n\t//\n\t// Color\n\t//\n\n\t// Gets the color for the specified frame time in MS\n\tUFUNCTION(BlueprintPure, Category = \">UI|Color\")\n\tstatic FLinearColor GetFrameMSDisplayColor(float FrameTimeMS);\n\n\t// Gets the color for the specifeid frame FPS\n\tUFUNCTION(BlueprintPure, Category = \">UI|Color\")\n\tstatic FLinearColor GetFrameFPSDisplayColor(float FrameFPS)\n\t{\n\t\treturn GetFrameMSDisplayColor(1000.f / FrameFPS);\n\t}\n\n};\n"
  },
  {
    "path": "Source/SOrb/UI/SoUISystem.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#include \"SoUISystem.h\"\n\n#include \"Menu/SoUIMenuMain.h\"\n#include \"InGame/SoUIInGame.h\"\n#include \"General/SoUIVideoPlayer.h\"\n\nUSoUIMenuMain* USoUISystem::GetMainMenu() const { return MainMenu; }\nUSoUIInGame* USoUISystem::GetInGameUI() const { return InGameUI; }\nUSoUIVideoPlayer* USoUISystem::GetVideoPlayer() const { return VideoPlayer; }\n"
  },
  {
    "path": "Source/SOrb/UI/SoUISystem.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#pragma once\n\n#include \"Blueprint/UserWidget.h\"\n\n#include \"SoUISystem.generated.h\"\n\nclass USoUIMenuMain;\nclass USoUIInGame;\nclass USoUIVideoPlayer;\n\n/**\n *\n */\nUCLASS()\nclass SORB_API USoUISystem : public UUserWidget\n{\n\tGENERATED_BODY()\n\npublic:\n\tUSoUIMenuMain* GetMainMenu() const;\n\n\t// NOTE: All USoInGameUIActivity are also managed from USoAInUI\n\tUSoUIInGame* GetInGameUI() const;\n\n\tUSoUIVideoPlayer* GetVideoPlayer() const;\n\nprotected:\n\n\t/** Contains everything Menu related - settings panel, save/load, etc. */\n\tUPROPERTY(BlueprintReadWrite, meta = (BindWidget))\n\tUSoUIMenuMain* MainMenu = nullptr;\n\n\t/** contains ingame elements including basic GUI, character panels, loot UI, etc. */\n\tUPROPERTY(BlueprintReadWrite, meta = (BindWidget))\n\tUSoUIInGame* InGameUI = nullptr;\n\n\tUPROPERTY(BlueprintReadWrite, meta = (BindWidget))\n\tUSoUIVideoPlayer* VideoPlayer = nullptr;\n};\n"
  },
  {
    "path": "Source/SOrb/Water/SoBuoyancyComponent.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#include \"SoBuoyancyComponent.h\"\n#include \"Components/PrimitiveComponent.h\"\n#include \"GameFramework/PhysicsVolume.h\"\n#include \"PhysicsEngine/PhysicsConstraintComponent.h\"\n#include \"DrawDebugHelpers.h\"\n#include \"EngineUtils.h\"\n#include \"SoOceanManager.h\"\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// Sets default values for this component's properties\nUSoBuoyancyComponent::USoBuoyancyComponent()\n{\n\t// tick every frame\n\tPrimaryComponentTick.bCanEverTick = true;\n\tPrimaryComponentTick.TickGroup = TickGroup;\n\n\t// call InitializeComponent\n\tbWantsInitializeComponent = true;\n\n\t// auto activate at creation\n\tbAutoActivate = true;\n\n\t// set default values\n\tMeshDensity = 600;\n\tTestPointRadius = 10;\n\tFluidDensity = 1030;\n\tFluidLinearDamping = 1;\n\tFluidAngularDamping = 1;\n\n\tVelocityDamper = FVector(0.1, 0.1, 0.1);\n\tMaxUnderwaterVelocity = 1000;\n\tbEnableWaveForces = true;\n\tbClampMaxVelocity = true;\n\tWaveForceMultiplier = 2;\n\n\t// no physics defaults\n\tbSnapToSurfaceIfNoPhysics = true;\n\tNoPhysicsDisplacement = FVector::ZeroVector;\n\n\t// Debug defaults\n\tColorOverWater = FColor(0, 255, 0, 255); // full green\n\tColorUnderWater = FColor(255, 255, 0, 255); // full yellow\n\tSegmentThickness = 1;\n\tNumberSegments = 8;\n\tOverrideTestPointRadius = 0;\n\n\t// upright constraints\n\tbEnableStayUprightConstraint = false;\n\tUprightStiffness = 50;\n\tUprightDamping = 5;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// Called when the game starts\nvoid USoBuoyancyComponent::BeginPlay() { Super::BeginPlay(); }\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoBuoyancyComponent::InitializeComponent()\n{\n\tSuper::InitializeComponent();\n\n\t// Store the world ref.\n\tWorld = GetWorld();\n\tcheck(World);\n\n\t// If no OceanManager is defined, auto-detect\n\tif (!OceanManager)\n\t{\n\t\tfor (TActorIterator<ASoOceanManager> ActorItr(World); ActorItr; ++ActorItr)\n\t\t{\n\t\t\tOceanManager = Cast<ASoOceanManager>(*ActorItr);\n\t\t\tbreak;\n\t\t}\n\t}\n\n\t// no negative point radius\n\tTestPointRadius = FMath::Abs(TestPointRadius);\n\n\t// Store the initial values.\n\tUPrimitiveComponent* const BasePrimitiveComponent = Cast<UPrimitiveComponent>(GetAttachParent());\n\tif (BasePrimitiveComponent)\n\t{\n\t\tApplyUprightConstraint(BasePrimitiveComponent);\n\n\t\tInitialLinearDamping = BasePrimitiveComponent->GetLinearDamping();\n\t\tInitialAngularDamping = BasePrimitiveComponent->GetAngularDamping();\n\t\tInitialLocation = BasePrimitiveComponent->GetComponentLocation();\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// Called every frame\nvoid USoBuoyancyComponent::TickComponent(float DeltaTime, ELevelTick TickType, FActorComponentTickFunction* ThisTickFunction)\n{\n\tSuper::TickComponent(DeltaTime, TickType, ThisTickFunction);\n\n\t// not active, no parent and no ocean, what life is this?\n\tUSceneComponent* const Parent = GetAttachParent();\n\tif (!bIsActive || !Parent || !OceanManager) return;\n\n\t// upcast the parent to a primitve\n\tUPrimitiveComponent* const BasePrimitiveComponent = Cast<UPrimitiveComponent>(Parent);\n\tcheck(BasePrimitiveComponent);\n\n\t// weird world of no physics, snap to water surface\n\tif (!BasePrimitiveComponent->IsSimulatingPhysics())\n\t{\n\t\tif (!bSnapToSurfaceIfNoPhysics) return;\n\n\t\t// UE_LOG(LogSoWater, Warning, TEXT(\"Running in no physics mode.\"));\n\t\tconst FVector CurrentLocation = BasePrimitiveComponent->GetComponentLocation();\n\t\tconst FVector WaveHeight = OceanManager->GetWaveHeight(CurrentLocation, World);\n\n\t\t// just a smidge away from the initial location\n\t\tBasePrimitiveComponent->SetWorldLocation(NoPhysicsDisplacement + FVector(InitialLocation.X + WaveHeight.X, InitialLocation.Y + WaveHeight.Y, WaveHeight.Z));\n\t\t//BasePrimitiveComponent->SetWorldLocation(NoPhysicsDisplacement + FVector(CurrentLocation.X + WaveHeight.X, CurrentLocation.Y + WaveHeight.Y, WaveHeight.Z));\n\t\t//BasePrimitiveComponent->SetWorldLocation(FVector(CurrentLocation.X, CurrentLocation.Y, WaveHeight.Z));\n\t\treturn;\n\t}\n\n\t// world with physics\n\tconst int32 NumPoints = TestPoints.Num();\n\tif (!NumPoints) // no points, ups\n\t{\n\t\tUE_LOG(LogSoWater, Error, TEXT(\"Physics is enabled for `%s` but it has no TestPoints\"), *BasePrimitiveComponent->GetName());\n\t\treturn;\n\t}\n\n\t// constants used by every point\n\tconst float BodyMass = BasePrimitiveComponent->GetMass();\n\tconst float Gravity = BasePrimitiveComponent->GetPhysicsVolume()->GetGravityZ();\n\n\t// direction of the radius, if the world is upside down\n\tconst float SignedRadius = FMath::Sign(Gravity) * TestPointRadius;\n\n\t// test all points\n\tint32 NumPointsUnderWater = 0; // number of points underwater\n\tfor (int32 PointIndex = 0; PointIndex < NumPoints; PointIndex++)\n\t{\n\t\t// you like to live dangerously, array size changed during runtime\n\t\tif (!TestPoints.IsValidIndex(PointIndex)) return;\n\n\t\tbool bIsUnderwater = false;\n\t\t// the point in local position\n\t\tconst FVector Point = TestPoints[PointIndex];\n\n\t\t// the point in world position\n\t\tconst FVector PointWorldLocation = BasePrimitiveComponent->GetComponentTransform().TransformPosition(Point);\n\t\tconst FVector WaveHeight = OceanManager->GetWaveHeight(PointWorldLocation, World);\n\n\t\t// test if point radius is under the water surface, add force if it is\n\t\tconst float TestPointZ = PointWorldLocation.Z + SignedRadius;\n\t\tif (BasePrimitiveComponent->IsGravityEnabled() &&\n\t\t\tWaveHeight.Z > TestPointZ)\n\t\t{\n\t\t\tNumPointsUnderWater++;\n\t\t\tbIsUnderwater = true;\n\n\t\t\t// the deeper the point, the higher the force to bring it up\n\t\t\tconst float DepthMultiplier = FMath::Clamp((WaveHeight.Z - TestPointZ) / (TestPointRadius * 2), 0.0f, 1.0f);\n\n\t\t\t// use the point density override if there is one, instead of the MeshDensity\n\t\t\tconst float PointDensity = TestPointsDensityOverride.IsValidIndex(PointIndex) ? TestPointsDensityOverride[PointIndex] : MeshDensity;\n\n\t\t\t// Buoyancy force formula: (Volume(Mass / Density) * Fluid Density * -Gravity) * Depth Multiplier / Num Points\n\t\t\tconst float BuoyancyForceZ = (BodyMass / PointDensity) * FluidDensity * -Gravity * DepthMultiplier / NumPoints;\n\n\t\t\t// velocity damping using velocity at point on the physics body\n\t\t\tFVector DampingForce = -GetUnrealVelocityAtPoint(BasePrimitiveComponent, PointWorldLocation) * VelocityDamper * BodyMass * DepthMultiplier;\n\t\t\t//UE_LOG(LogSoWater, Log, TEXT(\"DampingForce = %s\"), *DampingForce.ToString());\n\n\t\t\t// push the XY wave force from the ocean\n\t\t\tif (bEnableWaveForces)\n\t\t\t{\n\t\t\t\tconst FVector2D& WaveDirection = OceanManager->GetGlobalWaveDirection();\n\t\t\t\t// Damping force formula: Mass * Length(wave XY) * Wave direction XY * Wave Force Multiplier / Num Points\n\t\t\t\tDampingForce += BodyMass * FVector2D(WaveHeight.X, WaveHeight.Y).Size() * FVector(WaveDirection.X, WaveDirection.Y, 0) * WaveForceMultiplier / NumPoints;\n\t\t\t}\n\n\t\t\t// add force to this point\n\t\t\tBasePrimitiveComponent->AddForceAtLocation(FVector(DampingForce.X, DampingForce.Y, DampingForce.Z + BuoyancyForceZ), PointWorldLocation);\n\t\t}\n\n\t\t// draw the debug points\n\t\tif (bDrawDebugPoints)\n\t\t{\n\t\t\tfloat Radius = TestPointRadius;\n\t\t\tFColor DebugColor = ColorOverWater;\n\t\t\tif (bIsUnderwater) DebugColor = ColorUnderWater;\n\t\t\tif (OverrideTestPointRadius > 0) Radius = OverrideTestPointRadius;\n\n\t\t\tDrawDebugSphere(World, PointWorldLocation, Radius, /* segments */ NumberSegments, DebugColor,\n\t\t\t\t\t\t\t/* persistent lines */ false, /* duration */ -1, /* depth priority */ 0, SegmentThickness);\n\t\t}\n\t} // end test all points\n\n\t// clamp the velocity to MaxUnderwaterVelocity if there are any points underwater and over the max velocity\n\tif (bClampMaxVelocity && NumPoints > 0\n\t\t&& BasePrimitiveComponent->GetPhysicsLinearVelocity().Size() > MaxUnderwaterVelocity)\n\t{\n\t\tconst FVector Velocity = BasePrimitiveComponent->GetPhysicsLinearVelocity().GetSafeNormal() * MaxUnderwaterVelocity;\n\t\tBasePrimitiveComponent->SetPhysicsLinearVelocity(Velocity);\n\t}\n\n\t// update damping (resistance) based on number of underwater test points\n\tBasePrimitiveComponent->SetLinearDamping(InitialLinearDamping + FluidLinearDamping / NumPoints * NumPointsUnderWater);\n\tBasePrimitiveComponent->SetAngularDamping(InitialAngularDamping + FluidAngularDamping / NumPoints * NumPointsUnderWater);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFVector USoBuoyancyComponent::GetUnrealVelocityAtPoint(UPrimitiveComponent* Target, FVector Point, FName BoneName)\n{\n\tif (!Target) return FVector::ZeroVector;\n\n\tFBodyInstance* BodyInstance = Target->GetBodyInstance(BoneName);\n\tif (BodyInstance->IsValidBodyInstance()) { return BodyInstance->GetUnrealWorldVelocityAtPoint(Point); }\n\n\treturn FVector::ZeroVector;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// Inspired by UDK's StayUprightSpring (https://wiki.beyondunreal.com/UE3:KActor_(UDK)#bEnableStayUprightSpring)\n// Try to keep the Z axis of the actor pointing along the world Z axis.\nvoid USoBuoyancyComponent::ApplyUprightConstraint(UPrimitiveComponent* BasePrimitiveComponent)\n{\n\tif (!bEnableStayUprightConstraint || !BasePrimitiveComponent->IsSimulatingPhysics()) return;\n\n\t// settings for the constraint\n\tFConstraintInstance ConstraintInstance;\n\n\t// no constraints against any linear motion\n\tConstraintInstance.SetLinearXMotion(ELinearConstraintMotion::LCM_Free);\n\tConstraintInstance.SetLinearYMotion(ELinearConstraintMotion::LCM_Free);\n\tConstraintInstance.SetLinearZMotion(ELinearConstraintMotion::LCM_Free);\n\n\t// limit the motion and use the limit below\n\t// limit rotation around the Y axis\n\tConstraintInstance.SetAngularSwing2Motion(EAngularConstraintMotion::ACM_Limited);\n\n\t// limit rotation round the X axis, I <3 the naming of these functions, very concise on what they do\n\tConstraintInstance.SetAngularTwistMotion(EAngularConstraintMotion::ACM_Limited);\n\n\t// enable\n\tConstraintInstance.SetOrientationDriveTwistAndSwing(true, true);\n\n\t// set the rotation limits on XY, lock to 0 angle\n\tConstraintInstance.SetAngularSwing2Limit(EAngularConstraintMotion::ACM_Locked, 0);\n\tConstraintInstance.SetAngularTwistLimit(EAngularConstraintMotion::ACM_Locked, 0);\n\n\t// set the spring params\n\tConstraintInstance.SetAngularDriveParams(UprightStiffness, UprightDamping, 0);\n\tConstraintInstance.AngularRotationOffset = BasePrimitiveComponent->GetComponentRotation().GetInverse() + UprightDesiredRotation;\n\n\t// set the instance and attach\n\tUPhysicsConstraintComponent* Constraint = NewObject<UPhysicsConstraintComponent>(BasePrimitiveComponent);\n\tif (Constraint != nullptr)\n\t{\n\t\tConstraint->ConstraintInstance = ConstraintInstance;\n\t\tConstraint->SetWorldLocation(BasePrimitiveComponent->GetComponentLocation());\n\n\t\t// attach\n\t\tConstraint->AttachToComponent(BasePrimitiveComponent, FAttachmentTransformRules::KeepRelativeTransform, NAME_None);\n\t\tConstraint->SetConstrainedComponents(BasePrimitiveComponent, NAME_None, nullptr, NAME_None);\n\t}\n}\n"
  },
  {
    "path": "Source/SOrb/Water/SoBuoyancyComponent.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#pragma once\n\n#include \"Components/SceneComponent.h\"\n#include \"SoBuoyancyComponent.generated.h\"\n\n// forward declare\nclass ASoOceanManager;\n\nUCLASS(ClassGroup=(Physics), HideCategories = (Transform, Object, Mobility, LOD), Meta=(BlueprintSpawnableComponent))\nclass SORB_API USoBuoyancyComponent : public USceneComponent\n{\n\tGENERATED_BODY()\n\npublic:\n\t// Sets default values for this component's properties\n\tUSoBuoyancyComponent();\n\n\t// Called when the game starts\n\tvirtual void BeginPlay() override;\n\n\t// Called every frame\n\tvirtual void TickComponent(float DeltaTime, ELevelTick TickType, FActorComponentTickFunction* ThisTickFunction) override;\n\n\t// Gotta initialize stuff!\n\tvirtual void InitializeComponent() override;\n\nprotected:\n\t// Density of mesh\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = \"Buoyancy\")\n\tfloat MeshDensity;\n\n\t// Density of water. Typically you don't need to change this.\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = \"Buoyancy\")\n\tfloat FluidDensity;\n\n\t// Linear damping (drag) when object is in fluid.\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = \"Buoyancy\")\n\tfloat FluidLinearDamping;\n\n\t// Angular damping (drag) when object is in fluid.\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = \"Buoyancy\")\n\tfloat FluidAngularDamping;\n\n\t// Test point array (to test and apply forces). At least one point is required for buoyancy.\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = \"Buoyancy\", Meta = (MakeEditWidget = true))\n\tTArray<FVector> TestPoints;\n\n\t// Radius of the test points (actually a Z offset).\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = \"Buoyancy\")\n\tfloat TestPointRadius;\n\n\t// Maximum velocity that can be achieved under water\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = \"Buoyancy\")\n\tfloat MaxUnderwaterVelocity;\n\n\t// Flag indicating to clamp or not to clamp to MaxUnderwaterVelocity\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = \"Buoyancy\")\n\tbool bClampMaxVelocity;\n\n\t// OceanManager used by the component, if unassigned component will auto-detect */\n\tUPROPERTY(EditAnywhere, AdvancedDisplay, BlueprintReadWrite, Category = \"Buoyancy\")\n\tASoOceanManager* OceanManager;\n\n\t// Multiplier (drag force/resistance) that reduces the actual velocity\n\tUPROPERTY(EditAnywhere, AdvancedDisplay, BlueprintReadWrite, Category = \"Buoyancy\")\n\tFVector VelocityDamper;\n\n\t// Waves will push objects towards the wave direction (XY) set in the Ocean Manager.\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, AdvancedDisplay, Category = \"Buoyancy\")\n\tbool bEnableWaveForces;\n\n\t// How much will the XY wave force damping factor be affected\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, AdvancedDisplay, Category = \"Buoyancy\")\n\tfloat WaveForceMultiplier;\n\n\t// Group where this component ticking is done\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, AdvancedDisplay, Category = \"Buoyancy\")\n\tTEnumAsByte<enum ETickingGroup> TickGroup;\n\n\t// Per-point mesh density override, can be used for half-sinking objects\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, AdvancedDisplay, Category = \"Buoyancy\")\n\tTArray<float> TestPointsDensityOverride;\n\n\t// If object has no physics enabled, snap to water surface.\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = \"Buoyancy No Physics\")\n\tbool bSnapToSurfaceIfNoPhysics;\n\n\t// Add this to the actual location to move the center of the object so that it snaps to a different location\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = \"Buoyancy No Physics\", Meta = (MakeEditWidget = true))\n\tFVector NoPhysicsDisplacement;\n\n\t// Stay upright physics constraint (inspired by UDK's StayUprightSpring)\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = \"Buoyancy Stay Upright\")\n\tbool bEnableStayUprightConstraint;\n\n\t// The stiffness of the spring\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = \"Buoyancy Stay Upright\")\n\tfloat UprightStiffness;\n\n\t// The drag force of the spring\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = \"Buoyancy Stay Upright\")\n\tfloat UprightDamping;\n\n\t// The desired upright rotation\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = \"Buoyancy Stay Upright\")\n\tFRotator UprightDesiredRotation;\n\n\t// To Draw or not to draw debug points\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = \"Debug\")\n\tbool bDrawDebugPoints;\n\n\t// Color of the debug sphere when over water\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = \"Debug\")\n\tFColor ColorOverWater;\n\n\t// Color of the debug sphere when under water\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = \"Debug\")\n\tFColor ColorUnderWater;\n\n\t// Color of the debug sphere when over water\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = \"Debug\")\n\tfloat SegmentThickness;\n\n\t// The number of segments for the debug sphere\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = \"Debug\")\n\tuint8 NumberSegments;\n\n\t// If bigger than 0 it will use this as the radius of the debug sphere instead of the TestPointRadius\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = \"Debug\")\n\tfloat OverrideTestPointRadius;\n\nprivate:\n\t// Get current velocity of a point on this physics body, in world space.\n\tstatic FVector GetUnrealVelocityAtPoint(UPrimitiveComponent* Target, FVector Point, FName BoneName = NAME_None);\n\n\t// Stay upright physics constraint inspired from Ocean Project which was also inspired by UDK's StayUprightSpring (https://wiki.beyondunreal.com/UE3:KActor_(UDK)#bEnableStayUprightSpring)\n\tvoid ApplyUprightConstraint(UPrimitiveComponent* BasePrimitiveComponent);\n\n\t// one true world\n\tUWorld* World;\n\n\t// initial values set in InitializeComponent\n\tfloat InitialAngularDamping;\n\tfloat InitialLinearDamping;\n\tFVector InitialLocation;\n};\n"
  },
  {
    "path": "Source/SOrb/Water/SoOceanManager.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#include \"SoOceanManager.h\"\n#include \"Engine/World.h\"\n#include \"Materials/MaterialParameterCollection.h\"\n#include \"Kismet/KismetMaterialLibrary.h\"\n\nDEFINE_LOG_CATEGORY(LogSoWater);\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// Sets default values\nASoOceanManager::ASoOceanManager()\n{\n\t// tick every frame\n\tPrimaryActorTick.bCanEverTick = false;\n\n\t// set default vaues\n\tEnableGerstnerWaves = true;\n\tGlobalWaveDirection = FVector2D(1.0, 0.0);\n\tGlobalWaveAmplitude = 250;\n\tGlobalWaveLength = 2000;\n\tGlobalSize = 10000;\n\tDistanceCheck = 2000;\n\tMaterialCollection = CreateDefaultSubobject<UMaterialParameterCollection>(TEXT(\"MaterialCollectionGerstner\"));\n\tif (MaterialCollection == nullptr)\n\t{\n\t\tUE_LOG(LogSoWater, Error, TEXT(\"Failed to set MaterialCollection to be default MaterialCollectionGerstner\"));\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nfloat ASoOceanManager::GetTimeSeconds(const UWorld* World) const\n{\n\tif (World == nullptr) World = GetWorld();\n\treturn World->GetTimeSeconds();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// Called when the game starts or when spawned\nvoid ASoOceanManager::BeginPlay()\n{\n\tSuper::BeginPlay();\n\tverifyf(MaterialCollection != nullptr, TEXT(\"MaterialCollection is empty in the Ocean Manager. Does it exist?\"));\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// Called every frame\nvoid ASoOceanManager::Tick(float DeltaTime) { Super::Tick(DeltaTime); }\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// See http://http.developer.nvidia.com/GPUGems/gpugems_ch01.html, Equation 9 in particular for details\nFVector ASoOceanManager::CalculateGerstnerWave(float RotationAngle,\n\t\t\t\t\t\t\t\t\t\t\t   float WaveLength,\n\t\t\t\t\t\t\t\t\t\t\t   float Amplitude,\n\t\t\t\t\t\t\t\t\t\t\t   float Steepness,\n\t\t\t\t\t\t\t\t\t\t\t   const FVector2D& Direction,\n\t\t\t\t\t\t\t\t\t\t\t   const FVector& Location,\n\t\t\t\t\t\t\t\t\t\t\t   float Time,\n\t\t\t\t\t\t\t\t\t\t\t   float TimePhase)\n{\n\t// TimePhase or S (from the formulas), described as speed depending on the wavelength\n\n\t// W - from the formulas\n\tconst float Frequency = (2 * PI) / WaveLength;\n\n\t// D - Direction: the horizontal vector perpendicular to the wave front along which the crest travels.\n\t// adjust direction, the rotation angle is normalized (values from 0 to 1)\n\tauto AdjustedDirection = FVector(Direction, /* Z */ 0);\n\n\t// rotate around the Z axis\n\tAdjustedDirection = AdjustedDirection.RotateAngleAxis(RotationAngle * 360, FVector::UpVector);\n\tAdjustedDirection = AdjustedDirection.GetSafeNormal();\n\n\t// WavePhase, the argument inside the sin/cos functions\n\t// W * dot(D, Position) + time * phase\n\tconst float WavePhase = Frequency * FVector::DotProduct(AdjustedDirection, Location) + Time * TimePhase;\n\n\t// Q - Steepness\n\t// A - Amplitude: the height from the water plane to the wave crest.\n\tconst float QA = Steepness * Amplitude;\n\n\t// calculate the trig functions\n\tconst float CosValue = FMath::Cos(WavePhase);\n\tconst float SinValue = FMath::Sin(WavePhase);\n\n\treturn FVector(QA * AdjustedDirection.X * CosValue, QA * AdjustedDirection.Y * CosValue, Amplitude * SinValue);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFVector ASoOceanManager::CalculateGerstnerWaveCluster(float MedianRotationAngle,\n\t\t\t\t\t\t\t\t\t\t\t\t\t  float MedianWaveLength,\n\t\t\t\t\t\t\t\t\t\t\t\t\t  float MedianAmplitude,\n\t\t\t\t\t\t\t\t\t\t\t\t\t  float MedianSteepness,\n\t\t\t\t\t\t\t\t\t\t\t\t\t  const FVector2D& MedianDirection,\n\t\t\t\t\t\t\t\t\t\t\t\t\t  const FVector& Location,\n\t\t\t\t\t\t\t\t\t\t\t\t\t  float Time,\n\t\t\t\t\t\t\t\t\t\t\t\t\t  float MedianTimePhase) const\n{\n\tauto Sum = FVector(0, 0, 0);\n\t// first wave\n\tSum += CalculateGerstnerWave(MedianRotationAngle, MedianWaveLength, MedianAmplitude, MedianSteepness, MedianDirection, Location, Time, MedianTimePhase);\n\n\t// the rest of the waves\n\tFString Param;\n\tfor (uint8 i = 2; i <= 8; i++)\n\t{\n\t\tauto iString = FString::FromInt(i);\n\n\t\t// get parameters for current wave\n\t\tParam = \"Wave\" + iString + \"_AngleModifier\";\n\t\tconst float rotation = GetMaterialCollectionFloat(Param);\n\n\t\tParam = \"Wave\" + iString + \"_WavelengthModifier\";\n\t\tconst float wavelength = GetMaterialCollectionFloat(Param);\n\n\t\tParam = \"Wave\" + iString + \"_AmplitudeModifier\";\n\t\tconst float amplitude = GetMaterialCollectionFloat(Param);\n\n\t\tParam = \"Wave\" + iString + \"_PhaseModifier\";\n\t\tconst float phase = GetMaterialCollectionFloat(Param);\n\n\t\tSum += CalculateGerstnerWave(rotation + MedianRotationAngle,\n\t\t\t\t\t\t\t\t\t wavelength * MedianWaveLength,\n\t\t\t\t\t\t\t\t\t amplitude * MedianAmplitude,\n\t\t\t\t\t\t\t\t\t MedianSteepness,\n\t\t\t\t\t\t\t\t\t MedianDirection,\n\t\t\t\t\t\t\t\t\t Location,\n\t\t\t\t\t\t\t\t\t Time,\n\t\t\t\t\t\t\t\t\t phase + MedianTimePhase);\n\t}\n\n\treturn Sum / 8;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFVector ASoOceanManager::GetWaveHeight(const FVector& Location, const UWorld* World) const\n{\n\t// offset by the Z component\n\tconst float SeaLevel = RootComponent->GetComponentLocation().Z;\n\n\t// too far above or below, return base sea level\n\tif (!EnableGerstnerWaves || Location.Z - DistanceCheck > SeaLevel || Location.Z + DistanceCheck < SeaLevel)\n\t\treturn FVector(0, 0, SeaLevel);\n\n\t// set defaults\n\tauto Sum = FVector(0, 0, 0);\n\tconst float Time = GetTimeSeconds(World);\n\n\t// first cluster\n\tfloat Angle = GetMaterialCollectionFloat(\"Cluster1_Angle\");\n\tfloat Steepness = GetMaterialCollectionFloat(\"Cluster1_Steepness\");\n\tfloat Phase = GetMaterialCollectionFloat(\"Cluster1_Phase\");\n\n\tSum += CalculateGerstnerWaveCluster(Angle, GlobalWaveLength, GlobalWaveAmplitude, Steepness, GlobalWaveDirection, Location, Time, Phase);\n\n\t// second cluster\n\tconst float wavelength = GetMaterialCollectionFloat(\"Cluster2_MultiplierWavelength\");\n\tconst float amplitude = GetMaterialCollectionFloat(\"Cluster2_MultiplierAmplitude\");\n\tAngle = GetMaterialCollectionFloat(\"Cluster2_Angle\");\n\tSteepness = GetMaterialCollectionFloat(\"Cluster2_Steepness\");\n\tPhase = GetMaterialCollectionFloat(\"Cluster2_Phase\");\n\n\tSum += CalculateGerstnerWaveCluster(Angle, wavelength * GlobalWaveLength, amplitude * GlobalWaveAmplitude, Steepness, GlobalWaveDirection, Location, Time, Phase);\n\n\treturn Sum / 2 + FVector(0, 0, SeaLevel);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nfloat ASoOceanManager::GetMaterialCollectionFloat(FString Name) const\n{\n\tcheck(Name.IsEmpty() == false);\n\t// lost too much time on this https://answers.unrealengine.com/questions/172334/umaterialparametercollectioninstance-and-minimalap.html\n\treturn UKismetMaterialLibrary::GetScalarParameterValue(GetWorld(), MaterialCollection, *Name);\n}\n"
  },
  {
    "path": "Source/SOrb/Water/SoOceanManager.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#pragma once\n#include \"GameFramework/Actor.h\"\n#include \"Materials/MaterialParameterCollection.h\"\n#include \"SoOceanManager.generated.h\"\n\nDECLARE_LOG_CATEGORY_EXTERN(LogSoWater, Log, All);\n\nUCLASS(BlueprintType, Blueprintable)\nclass SORB_API ASoOceanManager : public AActor\n{\n\tGENERATED_BODY()\n\npublic:\n\t// Sets default values for this actor's properties\n\tASoOceanManager();\n\n\t// Called when the game starts or when spawned\n\tvirtual void BeginPlay() override;\n\n\t// Called every frame\n\tvirtual void Tick(float DeltaSeconds) override;\n\n\tUFUNCTION(BlueprintCallable, Category = \"Ocean Manager\")\n\tFVector GetWaveHeight(const FVector& Location, const UWorld* World = nullptr) const;\n\n\tFORCEINLINE const FVector2D& GetGlobalWaveDirection() const { return GlobalWaveDirection; }\nprivate:\n\t// Calculate the gertnser wave\n\tstatic FVector CalculateGerstnerWave(float RotationAngle,\n\t\t\t\t\t\t\t\t\t\t float WaveLength,\n\t\t\t\t\t\t\t\t\t\t float Amplitude,\n\t\t\t\t\t\t\t\t\t\t float Steepness,\n\t\t\t\t\t\t\t\t\t\t const FVector2D& Direction,\n\t\t\t\t\t\t\t\t\t\t const FVector& Location,\n\t\t\t\t\t\t\t\t\t\t float Time,\n\t\t\t\t\t\t\t\t\t\t float TimePhase);\n\n\t// Calculate the cluster of 8\n\tFVector CalculateGerstnerWaveCluster(float MedianRotationAngle,\n\t\t\t\t\t\t\t\t\t\t float MedianWaveLength,\n\t\t\t\t\t\t\t\t\t\t float MedianAmplitude,\n\t\t\t\t\t\t\t\t\t\t float MedianSteepness,\n\t\t\t\t\t\t\t\t\t\t const FVector2D& MedianDirection,\n\t\t\t\t\t\t\t\t\t\t const FVector& Location,\n\t\t\t\t\t\t\t\t\t\t float Time,\n\t\t\t\t\t\t\t\t\t\t float MedianTimePhase) const;\n\n\t// Gets the time from the argument if it's not null, otherwise use GetWorld()\n\tfloat GetTimeSeconds(const UWorld* World) const;\n\n\t// Get the float value from MaterialCollection\n\tfloat GetMaterialCollectionFloat(FString Name) const;\n\nprotected:\n\t// To have or not to have Gerstner waves\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere, Category = \"Ocean Manager\")\n\tbool EnableGerstnerWaves;\n\n\t// The global direction the waves travel.\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere, Category = \"Ocean Manager\")\n\tFVector2D GlobalWaveDirection;\n\n\t// The global speed multiplier of the waves.\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere, Category = \"Ocean Manager\")\n\tfloat GlobalWaveLength;\n\n\t// The global amplitude multiplier of the waves.\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere, Category = \"Ocean Manager\")\n\tfloat GlobalWaveAmplitude;\n\n\t// The global size\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere, Category = \"Ocean Manager\")\n\tfloat GlobalSize;\n\n\t// Get the wave values from the material collection with is shared with the Material\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere, Category = \"Ocean Manager\")\n\tUMaterialParameterCollection* MaterialCollection;\n\n\t/**\n\t * Optimization:\n\t * If the distance of a point to base sea level exceeds DistanceCheck (too far below or above),\n\t * skip the Gerstner calculations and return base sea level.\n\t */\n\tUPROPERTY(BlueprintReadWrite, EditAnywhere, Category = \"Ocean Manager\")\n\tfloat DistanceCheck;\n};\n"
  },
  {
    "path": "Source/SOrbEditor/Private/Commandlets/SoStatsCommandlet.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#include \"SoStatsCommandlet.h\"\n\n\nDEFINE_LOG_CATEGORY(LogSoStatsCommandlet);\n\n\nUSoStatsCommandlet::USoStatsCommandlet()\n{\n\tIsClient = false;\n\tIsEditor = true;\n\tIsServer = false;\n\tLogToConsole = true;\n\tShowErrorCount = true;\n}\n\n\nint32 USoStatsCommandlet::Main(const FString& Params)\n{\n\tUE_LOG(LogSoStatsCommandlet, Display, TEXT(\"Starting\"));\n\n\t// Parse command line - we're interested in the param vals\n\tTArray<FString> Tokens;\n\tTArray<FString> Switches;\n\tTMap<FString, FString> ParamVals;\n\tUCommandlet::ParseCommandLine(*Params, Tokens, Switches, ParamVals);\n\n\treturn 0;\n}\n"
  },
  {
    "path": "Source/SOrbEditor/Private/Commandlets/SoStatsCommandlet.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n// Copyright 2017-2018 Csaba Molnar, Daniel Butum\n#pragma once\n\n#include \"Commandlets/Commandlet.h\"\n\n#include \"SoStatsCommandlet.generated.h\"\n\n\nDECLARE_LOG_CATEGORY_EXTERN(LogSoStatsCommandlet, All, All);\n\n\nUCLASS()\nclass USoStatsCommandlet: public UCommandlet\n{\n\tGENERATED_BODY()\n\npublic:\n\tUSoStatsCommandlet();\n\npublic:\n\n\t//~ UCommandlet interface\n\tint32 Main(const FString& Params) override;\n};\n"
  },
  {
    "path": "Source/SOrbEditor/Private/Factories/SoCharacterStrikeFactory.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#include \"Factories/SoCharacterStrikeFactory.h\"\n#include \"Character/SoCharacterStrike.h\"\n\n\n///////////////////////////////////////////////////////\n//// USoCharacterStrikeFactory\nUSoCharacterStrikeFactory::USoCharacterStrikeFactory(const FObjectInitializer& ObjectInitializer)\n\t: Super(ObjectInitializer)\n{\n\tbCreateNew = true;\n\tbEditAfterNew = true;\n\tSupportedClass = USoCharacterStrike::StaticClass();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUObject* USoCharacterStrikeFactory::FactoryCreateNew(UClass* Class, UObject* InParent, FName Name, EObjectFlags Flags,\n\t\t\t\t\t\t\t\t\t\t\t\t\tUObject* Context, FFeedbackContext* Warn)\n{\n\treturn NewObject<USoCharacterStrike>(InParent, Class, Name, Flags | RF_Transactional);\n}\n"
  },
  {
    "path": "Source/SOrbEditor/Private/Factories/SoItemFactory.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#include \"Factories/SoItemFactory.h\"\n#include \"Items/ItemTemplates/SoItemTemplate.h\"\n#include \"SoEditorUtilities.h\"\n\n/////////////////////////////////////////////////////\n// USoItemFactory\nUSoItemFactory::USoItemFactory(const FObjectInitializer& ObjectInitializer)\n\t: Super(ObjectInitializer)\n{\n\tbCreateNew = true;\n\tbEditAfterNew = true;\n\tSupportedClass = USoItemTemplate::StaticClass();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool USoItemFactory::ConfigureProperties()\n{\n\tstatic const FText TitleText = FText::FromString(TEXT(\"Pick Item Template Class\"));\n\n\t// nullptr the ItemTemplateClass so we can check for selection\n\tItemTemplateClass = nullptr;\n\n\tUClass* ChosenClass = nullptr;\n\tconst bool bPressedOk = FSoEditorUtilities::PickChildrenOfClass(TitleText, ChosenClass, SupportedClass);\n\tif (bPressedOk)\n\t\tItemTemplateClass = ChosenClass;\n\n\treturn bPressedOk;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUObject* USoItemFactory::FactoryCreateNew(UClass* Class, UObject* InParent, FName Name, EObjectFlags Flags,\n\t\t\t\t\t\t\t\t\t\t  UObject* Context, FFeedbackContext* Warn)\n{\n\tif (ItemTemplateClass != nullptr)\n\t\treturn NewObject<USoItemTemplate>(InParent, ItemTemplateClass, Name, Flags | RF_Transactional);\n\n\t// This will fail as the default USoItemTemplate (Class) is abstract\n\tcheckNoEntry();\n\treturn nullptr;\n}\n"
  },
  {
    "path": "Source/SOrbEditor/Private/SOrbEditorModule.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#include \"SOrbEditorModule.h\"\n\n#include \"LevelEditor.h\"\n#include \"Framework/MultiBox/MultiBoxBuilder.h\"\n#include \"EditorStyle.h\"\n#include \"Editor.h\"\n#include \"Engine/ObjectLibrary.h\"\n#include \"AssetToolsModule.h\"\n#include \"EngineUtils.h\"\n#include \"Editor/UnrealEdEngine.h\"\n#include \"UnrealEdGlobals.h\"\n#include \"EditorLevelUtils.h\"\n#include \"FileHelpers.h\"\n#include \"SoEditorUtilities.h\"\n#include \"LightingBuildOptions.h\"\n#include \"Settings/LevelEditorMiscSettings.h\"\n#include \"Containers/Ticker.h\"\n\n#include \"IO/DlgJsonParser.h\"\n#include \"Objects/SoSky.h\"\n#include \"SplineLogic/SoEditorGameInterface.h\"\n#include \"SplineLogic/SoPlayerSpline.h\"\n#include \"Settings/SoGameSettings.h\"\n#include \"Items/ItemTemplates/SoItemTemplate.h\"\n#include \"Effects/SoEffectBase.h\"\n#include \"Character/SoCharacterStrike.h\"\n\n#include \"SoEditorStyle.h\"\n#include \"SoEditorCommands.h\"\n#include \"NotYetUtilities.h\"\n#include \"SoEditorUtilitiesTypes.h\"\n#include \"ThumbnailRenderers/SoItemThumbnailRenderer.h\"\n#include \"ThumbnailRenderers/SoCharacterStrikeThumbnailRenderer.h\"\n#include \"TypeActions/AssetTypeActions_SoItem.h\"\n#include \"TypeActions/AssetTypeActions_SoCharacterStrike.h\"\n\n\nstatic const FName NAME_MODULE_LevelEditor(TEXT(\"LevelEditor\"));\n\nIMPLEMENT_GAME_MODULE(FSOrbEditorModule, SOrbEditor)\nDEFINE_LOG_CATEGORY(LogSoEditor)\n\nbool FSOrbEditorModule::bIsSplinePositionCorrectionEnabled = false;\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSOrbEditorModule::StartupModule()\n{\n\tUE_LOG(LogSoEditor, Verbose, TEXT(\"SOrbEditor: Log Started\"));\n\n\tconst FString Message = FString::Printf(\n\t\tTEXT(\"GPackageFileUE4Version = %d, GPackageFileLicenseeUE4Version = %d, Engine = %s\"),\n\t\tGPackageFileUE4Version, GPackageFileLicenseeUE4Version, *FEngineVersion::Current().ToString()\n\t);\n\tUE_LOG(LogSoEditor, Verbose, TEXT(\"%s\"), *Message);\n\n\tFModuleManager::Get().OnModulesChanged().AddLambda([](FName ModuleName, EModuleChangeReason ChangeReason)\n\t{\n\t\tFSOrbEditorModule::OnModuleChanged(ModuleName, ChangeReason);\n\t});\n\n\t// Register slate style ovverides\n\tFSoEditorStyle::Initialize();\n\tbIsSplinePositionCorrectionEnabled = FSoEditorGameInterface::IsSplinePosCorrectionEnabled();\n\n\tFSoEditorCommands::Register();\n\n\t// Register asset types, add the right click submenu\n\t// Make the Sorb assets be displayed in the filters menu and in the create new menu\n\tIAssetTools& AssetTools = FModuleManager::LoadModuleChecked<FAssetToolsModule>(\"AssetTools\").Get();\n\tWarriorbAssetCategoryBit = AssetTools.RegisterAdvancedAssetCategory(FName(TEXT(\"Warriorb\")), FText::FromString(TEXT(\"Warriorb\")));\n#define REGISTER_TYPE_ACTIONS(TypeAction)                                    \\\n\t{                                                                        \\\n\t  auto Action = MakeShareable(new TypeAction(WarriorbAssetCategoryBit)); \\\n\t  AssetTools.RegisterAssetTypeActions(Action);                           \\\n\t  CreatedAssetTypeActions.Add(Action);                                   \\\n\t}\n\n\tREGISTER_TYPE_ACTIONS(FAssetTypeActions_SoItemTemplate);\n\tREGISTER_TYPE_ACTIONS(FAssetTypeActions_SoShardItem);\n\tREGISTER_TYPE_ACTIONS(FAssetTypeActions_SoQuestItem);\n\tREGISTER_TYPE_ACTIONS(FAssetTypeActions_SoUsableItem);\n\tREGISTER_TYPE_ACTIONS(FAssetTypeActions_SoWeaponItem);\n\tREGISTER_TYPE_ACTIONS(FAssetTypeActions_SoItemTemplateJewelry);\n\tREGISTER_TYPE_ACTIONS(FAssetTypeActions_SoItemTemplateQuestBook);\n\tREGISTER_TYPE_ACTIONS(FAssetTypeActions_SoRuneStone);\n\tREGISTER_TYPE_ACTIONS(FAssetTypeActions_SoCharacterStrike);\n#undef REGISTER_TYPE_ACTIONS\n\n\t// Register the thumbnail renderers\n\tUThumbnailManager::Get().RegisterCustomRenderer(\n\t\tUSoItemTemplate::StaticClass(),\n\t\tUSoItemThumbnailRenderer::StaticClass()\n\t);\n\tUThumbnailManager::Get().RegisterCustomRenderer(\n\t\tUSoCharacterStrike::StaticClass(),\n\t\tUSoCharacterStrikeThumbnailRenderer::StaticClass()\n\t);\n\n\t// Bind Editor commands\n\tFileMenuEditorCommands = MakeShared<FUICommandList>();\n\tFileMenuEditorCommands->MapAction(\n\t\tFSoEditorCommands::Get().SaveAllItems,\n\t\tFExecuteAction::CreateStatic(&Self::HandleOnSaveAllItems)\n\t);\n\tFileMenuEditorCommands->MapAction(\n\t\tFSoEditorCommands::Get().SaveAllEffectInstances,\n\t\tFExecuteAction::CreateStatic(&Self::HandleOnSaveAllEffectInstances)\n\t);\n\tFileMenuEditorCommands->MapAction(\n\t\tFSoEditorCommands::Get().SaveAllCharacterStrikes,\n\t\tFExecuteAction::CreateStatic(&Self::HandleOnSaveAllCharacterStrikes)\n\t);\n\n\t// Extend menu/toolbar\n\tExtendToolbar();\n\tExtendMenu();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSOrbEditorModule::ShutdownModule()\n{\n\tif (UObjectInitialized())\n\t{\n\t\t// Unregister the thumbnail renderers\n\t\tUThumbnailManager::Get().UnregisterCustomRenderer(USoItemTemplate::StaticClass());\n\t\tUThumbnailManager::Get().UnregisterCustomRenderer(USoCharacterStrike::StaticClass());\n\t}\n\n\t// Unregister all the asset types that we registered\n\tif (FModuleManager::Get().IsModuleLoaded(\"AssetTools\"))\n\t{\n\t\tIAssetTools& AssetTools = FModuleManager::GetModuleChecked<FAssetToolsModule>(\"AssetTools\").Get();\n\t\tfor (int32 Index = 0; Index < CreatedAssetTypeActions.Num(); ++Index)\n\t\t{\n\t\t\tAssetTools.UnregisterAssetTypeActions(CreatedAssetTypeActions[Index].ToSharedRef());\n\t\t}\n\t}\n\n\t// Unregister level editor stuff\n\tif (FModuleManager::Get().IsModuleLoaded(\"LevelEditor\"))\n\t{\n\t\tFLevelEditorModule& LevelEditorModule = FModuleManager::GetModuleChecked<FLevelEditorModule>(\"LevelEditor\");\n\n\t\tif (NotificationBarExtender.IsValid())\n\t\t\tLevelEditorModule.GetNotificationBarExtensibilityManager()->RemoveExtender(NotificationBarExtender);\n\n\t\tif (ToolbarGameExtender.IsValid())\n\t\t\tLevelEditorModule.GetToolBarExtensibilityManager()->RemoveExtender(ToolbarGameExtender);\n\t}\n\n\tCreatedAssetTypeActions.Empty();\n\tFSoEditorCommands::Unregister();\n\tFSoEditorStyle::Shutdown();\n\n\tUE_LOG(LogSoEditor, Verbose, TEXT(\"SOrbEditor: Log Ended\"));\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSOrbEditorModule::LoadAllItems()\n{\n\tUObjectLibrary* ObjectLibrary = UObjectLibrary::CreateLibrary(USoItemTemplate::StaticClass(), true, GIsEditor);\n\tconst TArray<FString> PathsToSeach = { TEXT(\"/Game\") };\n\tObjectLibrary->AddToRoot();\n\tObjectLibrary->LoadAssetDataFromPaths(PathsToSeach);\n\tObjectLibrary->LoadAssetsFromAssetData();\n\tObjectLibrary->RemoveFromRoot();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSOrbEditorModule::ExtendToolbar()\n{\n\t// Running in game mode (standalone game) exit as we can't get the LevelEditorModule.\n\tif (IsRunningGame() || IsRunningCommandlet())\n\t{\n\t\treturn;\n\t}\n\n\t// Register the toolbar commands\n\tCommandList = MakeShareable(new FUICommandList);\n\n\tFLevelEditorModule& LevelEditorModule = FModuleManager::LoadModuleChecked<FLevelEditorModule>(TEXT(\"LevelEditor\"));\n\n\tCommandList->Append(LevelEditorModule.GetGlobalLevelEditorActions());\n\n\tCommandList->MapAction(\n\t\tFSoEditorCommands::Get().LoadCameraData,\n\t\tFExecuteAction::CreateStatic(&Self::LoadCameraData),\n\t\tFCanExecuteAction::CreateStatic(&Self::CanLoadCameraData)\n\t);\n\n\tCommandList->MapAction(\n\t\tFSoEditorCommands::Get().SaveCameraData,\n\t\tFExecuteAction::CreateStatic(&Self::SaveCameraData),\n\t\tFCanExecuteAction::CreateStatic(&Self::CanSaveCameraData)\n\t);\n\n\tCommandList->MapAction(\n\t\tFSoEditorCommands::Get().ToggleSplinePositionCorrection,\n\t\tFExecuteAction::CreateStatic(&Self::ToggleSplinePositionCorrection),\n\t\tFCanExecuteAction::CreateStatic(&Self::CanToggleSplinePositionCorrection),\n\t\tFIsActionChecked::CreateStatic(&Self::IsSplinePositionCorrectionEnabled)\n\t);\n\n\tCommandList->MapAction(\n\t\tFSoEditorCommands::Get().ToggleDisplayCameraKeys,\n\t\tFExecuteAction::CreateStatic(&Self::ToggleDisplayCameraKeys),\n\t\tFCanExecuteAction::CreateStatic(&Self::CanToggleDisplayCameraKeys),\n\t\tFIsActionChecked::CreateStatic(&Self::IsDisplayCameraKeysEnabled)\n\t);\n\n\tCommandList->MapAction(\n\t\tFSoEditorCommands::Get().RebuildEnemyGroups,\n\t\tFExecuteAction::CreateStatic(&Self::RebuildEnemyGroups),\n\t\tFCanExecuteAction::CreateStatic(&Self::CanRebuildEnemyGroups)\n\t);\n\n\tCommandList->MapAction(\n\t\tFSoEditorCommands::Get().CopyActorsToClipboard,\n\t\tFExecuteAction::CreateRaw(this, &Self::CopyActorsToClipboard),\n\t\tFCanExecuteAction::CreateRaw(this, &Self::CanCopyActorsToClipboard));\n\n\tCommandList->MapAction(\n\t\tFSoEditorCommands::Get().BuildAll,\n\t\tFExecuteAction::CreateRaw(this, &Self::StartBuildAll),\n\t\tFCanExecuteAction::CreateLambda([this] {\n\t\t\treturn CanStartLightBuild();\n\t\t})\n\t);\n\n\n\tLoadBuildPresets();\n\tToolbarGameExtender = MakeShareable(new FExtender());\n\tToolbarGameExtender->AddToolBarExtension(\n\t\tTEXT(\"Game\"),\n\t\tEExtensionHook::After,\n\t\tCommandList.ToSharedRef(),\n\t\tFToolBarExtensionDelegate::CreateLambda([this](FToolBarBuilder& ToolbarBuilder)\n\t\t{\n\t\t\tToolbarBuilder.BeginSection(TEXT(\"SoOwnButtons\"));\n\t\t\tToolbarBuilder.AddToolBarButton(FSoEditorCommands::Get().LoadCameraData);\n\t\t\tToolbarBuilder.AddToolBarButton(FSoEditorCommands::Get().SaveCameraData);\n\t\t\tToolbarBuilder.AddToolBarButton(FSoEditorCommands::Get().ToggleSplinePositionCorrection);\n\t\t\tToolbarBuilder.AddToolBarButton(FSoEditorCommands::Get().ToggleDisplayCameraKeys);\n\t\t\tToolbarBuilder.AddToolBarButton(FSoEditorCommands::Get().RebuildEnemyGroups);\n\t\t\tToolbarBuilder.AddToolBarButton(FSoEditorCommands::Get().CopyActorsToClipboard);\n\n\t\t\t// Can't know when a light build finishes :(\n\t\t\t//ToolbarBuilder.AddToolBarButton(FSoEditorCommands::Get().BuildAll);\n\n\t\t\tToolbarBuilder.AddComboButton(\n\t\t\t\tFUIAction(\n\t\t\t\t\tFExecuteAction()\n\t\t\t\t),\n\t\t\t\tFOnGetContent::CreateRaw(this, &Self::GenerateBuildPresetsMenu),\n\t\t\t\tFText::FromString(TEXT(\"Build presets\")),\n\t\t\t\tFText::FromString(TEXT(\"Build presets\")),\n\t\t\t\tFSlateIcon(),\n\t\t\t\ttrue\n\t\t\t);\n\n\t\t\tToolbarBuilder.EndSection();\n\t\t})\n\t);\n\tLevelEditorModule.GetToolBarExtensibilityManager()->AddExtender(ToolbarGameExtender);\n\n\t// Notification Extender\n\tNotificationBarExtender = MakeShareable(new FExtender());\n\tNotificationBarExtender->AddToolBarExtension(\n\t\tTEXT(\"Start\"),\n\t\tEExtensionHook::After,\n\t\tnullptr,\n\t\tFToolBarExtensionDelegate::CreateRaw(this, &Self::AddNotificationBar)\n\t);\n\tLevelEditorModule.GetNotificationBarExtensibilityManager()->AddExtender(NotificationBarExtender);\n\tLevelEditorModule.BroadcastNotificationBarChanged();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool FSOrbEditorModule::SaveAllItems()\n{\n\tFSoEditorUtilities::LoadAllItemsIntoMemory();\n\tconst TArray<USoItemTemplate*> Items = FSoEditorUtilities::GetAllItemsFromMemory();\n\tTArray<UPackage*> PackagesToSave;\n\n\tfor (USoItemTemplate* Item : Items)\n\t{\n\t\tItem->MarkPackageDirty();\n\t\tPackagesToSave.Add(Item->GetOutermost());\n\t}\n\n\tstatic constexpr bool bCheckDirty = false;\n\tstatic constexpr bool bPromptToSave = false;\n\treturn FEditorFileUtils::PromptForCheckoutAndSave(PackagesToSave, bCheckDirty, bPromptToSave) == FEditorFileUtils::EPromptReturnCode::PR_Success;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool FSOrbEditorModule::SaveAllEffectInstances()\n{\n\tconst TArray<UObject*> Effects = FSoEditorUtilities::GetAllEffectInstances();\n\tTArray<UPackage*> PackagesToSave;\n\n\tfor (UObject* Object : Effects)\n\t{\n\t\tObject->MarkPackageDirty();\n\t\tPackagesToSave.Add(Object->GetOutermost());\n\t}\n\n\tstatic constexpr bool bCheckDirty = false;\n\tstatic constexpr bool bPromptToSave = false;\n\treturn FEditorFileUtils::PromptForCheckoutAndSave(PackagesToSave, bCheckDirty, bPromptToSave) == FEditorFileUtils::EPromptReturnCode::PR_Success;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool FSOrbEditorModule::SaveAllCharacterStrikes()\n{\n\tFSoEditorUtilities::GetAllCharacterStrikesFromMemory();\n\tconst TArray<USoCharacterStrike*> Strikes = FSoEditorUtilities::GetAllCharacterStrikesFromMemory();\n\tTArray<UPackage*> PackagesToSave;\n\n\tfor (USoCharacterStrike* Strike : Strikes)\n\t{\n\t\tStrike->MarkPackageDirty();\n\t\tPackagesToSave.Add(Strike->GetOutermost());\n\t}\n\n\tstatic constexpr bool bCheckDirty = false;\n\tstatic constexpr bool bPromptToSave = false;\n\treturn FEditorFileUtils::PromptForCheckoutAndSave(PackagesToSave, bCheckDirty, bPromptToSave) == FEditorFileUtils::EPromptReturnCode::PR_Success;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSOrbEditorModule::HandleOnSaveAllItems()\n{\n\tconst EAppReturnType::Type Response = FPlatformMisc::MessageBoxExt(EAppMsgType::YesNo,\n\t\tTEXT(\"Save all item template assets?\"),\n\t\tTEXT(\"Save Item Templates?\")\n\t);\n\tif (Response == EAppReturnType::No)\n\t{\n\t\treturn;\n\t}\n\n\tif (!SaveAllItems())\n\t{\n\t\tUE_LOG(LogSoEditor, Error, TEXT(\"Failed To save all items. An error occurred.\"));\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSOrbEditorModule::HandleOnSaveAllEffectInstances()\n{\n\tconst EAppReturnType::Type Response = FPlatformMisc::MessageBoxExt(EAppMsgType::YesNo,\n\t\tTEXT(\"Save all effect instances assets?\"),\n\t\tTEXT(\"Save Effect Instances?\")\n\t);\n\tif (Response == EAppReturnType::No)\n\t{\n\t\treturn;\n\t}\n\n\tif (!SaveAllEffectInstances())\n\t{\n\t\tUE_LOG(LogSoEditor, Error, TEXT(\"Failed To save all effect instances. An error occurred.\"));\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSOrbEditorModule::HandleOnSaveAllCharacterStrikes()\n{\n\tconst EAppReturnType::Type Response = FPlatformMisc::MessageBoxExt(EAppMsgType::YesNo,\n\t\tTEXT(\"Save all Characther Strikes assets?\"),\n\t\tTEXT(\"Save Characther Strikes?\")\n\t);\n\tif (Response == EAppReturnType::No)\n\t{\n\t\treturn;\n\t}\n\n\tif (!SaveAllCharacterStrikes())\n\t{\n\t\tUE_LOG(LogSoEditor, Error, TEXT(\"Failed To save all Characther Strikes. An error occurred.\"));\n\t}\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSOrbEditorModule::ExtendMenu()\n{\n\t// Running in game mode (standalone game) exit as we can't get the LevelEditorModule.\n\tif (IsRunningGame() || IsRunningCommandlet())\n\t{\n\t\treturn;\n\t}\n\n\t// File -> Save all Item Templates\n\t{\n\t\tTSharedRef<FExtender> FileMenuExtender(new FExtender);\n\n\t\t// Fill after the File->FileLoadAndSave\n\t\tFileMenuExtender->AddMenuExtension(\n\t\t\t\"FileLoadAndSave\",\n\t\t\tEExtensionHook::After,\n\t\t\tFileMenuEditorCommands.ToSharedRef(),\n\t\t\tFMenuExtensionDelegate::CreateLambda([this](FMenuBuilder& MenuBuilder)\n\t\t\t{\n\t\t\t\t// Save All\n\t\t\t\tMenuBuilder.BeginSection(\"WarriorbFileLoadAndSave\", FText::FromString(TEXT(\"Warriorb\")));\n\t\t\t\t{\n\t\t\t\t\tMenuBuilder.AddMenuEntry(FSoEditorCommands::Get().SaveAllItems);\n\t\t\t\t\tMenuBuilder.AddMenuEntry(FSoEditorCommands::Get().SaveAllEffectInstances);\n\t\t\t\t\tMenuBuilder.AddMenuEntry(FSoEditorCommands::Get().SaveAllCharacterStrikes);\n\t\t\t\t}\n\t\t\t\tMenuBuilder.EndSection();\n\t\t\t}));\n\n\t\t// Add to the level editor\n\t\tFLevelEditorModule& LevelEditorModule = FModuleManager::LoadModuleChecked<FLevelEditorModule>(NAME_MODULE_LevelEditor);\n\t\tLevelEditorModule.GetMenuExtensibilityManager()->AddExtender(FileMenuExtender);\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSOrbEditorModule::SaveCameraData()\n{\n\tUWorld* World = FSoEditorUtilities::GetEditorWorld();\n\tif (!World)\n\t\treturn;\n\n\tconst bool bSuccess = FSoEditorGameInterface::SaveCameraData(World);\n\tif (!bSuccess)\n\t\tFPlatformMisc::MessageBoxExt(EAppMsgType::Ok, TEXT(\"Save failed!!!\"), TEXT(\"Fail\"));\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSOrbEditorModule::LoadCameraData()\n{\n\tUWorld* World = FSoEditorUtilities::GetEditorWorld();\n\tif (!World)\n\t\treturn;\n\n\tconst bool bSuccess = FSoEditorGameInterface::LoadCameraData(World);\n\tif (!bSuccess)\n\t\tFPlatformMisc::MessageBoxExt(EAppMsgType::Ok, TEXT(\"Load failed!!!\"), TEXT(\"Fail\"));\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSOrbEditorModule::ToggleSplinePositionCorrection()\n{\n\tbIsSplinePositionCorrectionEnabled = FSoEditorGameInterface::ToggleSplinePosCorrection();\n\tif (bIsSplinePositionCorrectionEnabled)\n\t{\n\t\tUE_LOG(LogSoEditor, Warning, TEXT(\"Spline Location Correction based on world position is ENABLED!\"));\n\t\tUSoPlatformHelper::PrintToScreen(TEXT(\"Spline Location Correction based on world position is ENABLED!\"), 5.f, FColor::Yellow);\n\t}\n\telse\n\t{\n\t\tUE_LOG(LogSoEditor, Error, TEXT(\"Spline Location Correction based on world position is DISABLED!\"));\n\t\tUSoPlatformHelper::PrintToScreen(TEXT(\"Spline Location Correction based on world position is DISABLED!\"), 5.f, FColor::Yellow);\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSOrbEditorModule::ToggleDisplayCameraKeys()\n{\n\tif (GEditor == nullptr)\n\t\treturn;\n\n\tUWorld* World = FSoEditorUtilities::GetEditorWorld();\n\tif (World != nullptr)\n\t{\n\t\tASoPlayerSpline::bHideCameraKeys = !ASoPlayerSpline::bHideCameraKeys;\n\n\t\tfor (TActorIterator<ASoPlayerSpline> It(World, ASoPlayerSpline::StaticClass()); It; ++It)\n\t\t{\n\t\t\tif (*It != nullptr)\n\t\t\t{\n\t\t\t\t(*It)->UpdateCameraKeyData();\n\t\t\t}\n\t\t}\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool FSOrbEditorModule::IsDisplayCameraKeysEnabled()\n{\n\treturn !ASoPlayerSpline::bHideCameraKeys;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSOrbEditorModule::RebuildEnemyGroups()\n{\n\tUWorld* World = FSoEditorUtilities::GetEditorWorld();\n\tif (World == nullptr)\n\t\treturn;\n\n\tFString ErrorMessage;\n\n\t// Make persistent level visible\n\tUEditorLevelUtils::SetLevelVisibility(World->PersistentLevel, true, false);\n\n\t// Make levels visible and hide the other\n\tif (!FSoEditorUtilities::MakeAllEditorLevelsVisible(ErrorMessage))\n\t{\n\t\tFPlatformMisc::MessageBoxExt(EAppMsgType::Ok, *(FString(\"Failed to activate all levels: \") + ErrorMessage), TEXT(\"Fail\"));\n\t\treturn;\n\t}\n\n\tFSoEditorGameInterface::BuildEnemyGroupDataConfigFile(World);\n\tFPlatformMisc::MessageBoxExt(EAppMsgType::Ok, TEXT(\"Enemy groups are rebuilt for the current chapter!\"), TEXT(\"Task Done!\"));\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSOrbEditorModule::CopyActorsToClipboard()\n{\n\tFNotYetUtilities::CopyEditorSelectedActorsToClipboard(ENotYetCopyActors::NTCA_PropertyEditor);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool FSOrbEditorModule::SetChapterLevelsPresetTo(const int32 ChapterPresetIndex, const int32 LevelsPresetIndex)\n{\n\t// Set chapter preset\n\tif (!SetChapterPresetTo(ChapterPresetIndex))\n\t\treturn false;\n\n\tUWorld* World = FSoEditorUtilities::GetEditorWorld();\n\tif (World == nullptr)\n\t\treturn false;\n\n\t// Set level preset\n\tconst FSoEditorChapterBuildPreset& ChapterBuildPreset = BuildPresets.ChapterPresets[ChapterIndexBuildPreset];\n\tif (!ChapterBuildPreset.LevelPresets.IsValidIndex(LevelsPresetIndex))\n\t{\n\t\tFSoEditorUtilities::AddNotificationError(FString::Printf(TEXT(\"LevelsBuildPreset = %d is not a valid index\"), LevelsPresetIndex));\n\t\treturn false;\n\t}\n\tChapterLevelIndexBuildPreset = LevelsPresetIndex;\n\tconst FSoEditorChapterBuildPresetLevels& LevelsBuildPreset = ChapterBuildPreset.LevelPresets[ChapterLevelIndexBuildPreset];\n\tUE_LOG(LogSoEditor, Log, TEXT(\"SetChapterLevelsPresetTo: CurrentChapterLevelBuildPreset = %d\"), ChapterLevelIndexBuildPreset);\n\n\t// Make levels visible and hide the other\n\tFString ErrorMessage;\n\tif (!FSoEditorUtilities::MakeEditorLevelsVisible(LevelsBuildPreset.Levels, ErrorMessage))\n\t{\n\t\tFSoEditorUtilities::AddNotificationError(FString::Printf(TEXT(\"Failed to make editor levels visible. ErrorMessage = `%s`\"), *ErrorMessage));\n\t\treturn false;\n\t}\n\n\t// Set sky Preset\n\tSetSkyPresetTo(LevelsBuildPreset.SkyPreset);\n\tLogCurrentBuildPreset();\n\n\treturn true;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool FSOrbEditorModule::SetChapterPresetTo(int32 ChapterPresetIndex)\n{\n\tUE_LOG(LogSoEditor, Log, TEXT(\"SetChapterPresetTo = %d\"), ChapterPresetIndex);\n\n\t// Get the chapter preset\n\tif (!BuildPresets.ChapterPresets.IsValidIndex(ChapterPresetIndex))\n\t{\n\t\tFSoEditorUtilities::AddNotificationError(FString::Printf(TEXT(\"ChapterBuildPreset = %d is not a valid index\"), ChapterPresetIndex));\n\t\treturn false;\n\t}\n\n\tbIsUsingChapterPreset = true;\n\tChapterIndexBuildPreset = ChapterPresetIndex;\n\tconst FSoEditorChapterBuildPreset& ChapterBuildPreset = BuildPresets.ChapterPresets[ChapterIndexBuildPreset];\n\tconst FString ChapterPackageName = ChapterBuildPreset.ChapterPackageName.ToString();\n\tconst bool bReturnStatus = SetPersistentMapName(ChapterPackageName);\n\tif (!bReturnStatus)\n\t{\n\t\tFSoEditorUtilities::AddNotificationError(FString::Printf(TEXT(\"ChapterBuildPreset = %d, Chapter = %s. Error happened\"), ChapterPresetIndex, *ChapterPackageName));\n\t}\n\treturn bReturnStatus;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool FSOrbEditorModule::SetEpisodePresetTo(int32 EpisodePresetIndex)\n{\n\tUE_LOG(LogSoEditor, Log, TEXT(\"SetEpisodePresetTo = %d\"), EpisodePresetIndex);\n\n\t// Get the chapter preset\n\tif (!BuildPresets.EpisodePresets.IsValidIndex(EpisodePresetIndex))\n\t{\n\t\tFSoEditorUtilities::AddNotificationError(FString::Printf(TEXT(\"EpisodeBuildPreset = %d is not a valid index\"), EpisodePresetIndex));\n\t\treturn false;\n\t}\n\n\tbIsUsingChapterPreset = false;\n\tEpisodeIndexBuildPreset = EpisodePresetIndex;\n\tconst FSoEditorEpisodeBuildPreset& EpisodeBuildPreset = BuildPresets.EpisodePresets[EpisodeIndexBuildPreset];\n\tconst FString EpisodePackageName = EpisodeBuildPreset.EpisodePackageName.ToString();\n\n\tconst bool bReturnStatus = SetPersistentMapName(EpisodePackageName);\n\tif (!bReturnStatus)\n\t{\n\t\tFSoEditorUtilities::AddNotificationError(FString::Printf(TEXT(\"EpisodeBuildPreset = %d, Episode = %s. Error happened\"), EpisodePresetIndex, *EpisodePackageName));\n\t}\n\n\treturn bReturnStatus;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool FSOrbEditorModule::SetPersistentMapName(const FString& MapPackageName)\n{\n\tFString ErrorMessage;\n\tFText ErrorTextMessage;\n\tif (!FPackageName::IsValidLongPackageName(MapPackageName, false, &ErrorTextMessage))\n\t{\n\t\tFSoEditorUtilities::AddNotificationError(FString::Printf(TEXT(\"MapPackageName = %s. Error = %s\"), *MapPackageName, *ErrorTextMessage.ToString()));\n\t\treturn false;\n\t}\n\n\tUWorld* World = FSoEditorUtilities::GetEditorWorld();\n\tif (World == nullptr || World->PersistentLevel == nullptr)\n\t{\n\t\tFSoEditorUtilities::AddNotificationError(TEXT(\"World or World->PersistentLevel is null\"));\n\t\treturn false;\n\t}\n\n\t// Load new chapter\n\tconst FString CurrentMapPackageName = FSoEditorUtilities::GetLongPackageNameFromObject(World->PersistentLevel);\n\tif (CurrentMapPackageName != MapPackageName)\n\t{\n\t\t// Load New map\n\t\tif (!FEditorFileUtils::LoadMap(MapPackageName, false, true))\n\t\t{\n\t\t\tFSoEditorUtilities::AddNotificationError(FString::Printf(TEXT(\"Can't load MapPackageName = %s\"), *MapPackageName));\n\t\t\treturn false;\n\t\t}\n\n\t\t// NOTE: Must load the new world as the map changed\n\t\tWorld = FSoEditorUtilities::GetEditorWorld();\n\t}\n\n\tif (World == nullptr || World->PersistentLevel == nullptr)\n\t{\n\t\tFSoEditorUtilities::AddNotificationError(TEXT(\"World or World->PersistentLevel is null\"));\n\t\treturn false;\n\t}\n\n\t// Make chapter visible\n\tUEditorLevelUtils::SetLevelVisibility(World->PersistentLevel, true, false);\n\treturn true;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool FSOrbEditorModule::SetSkyPresetTo(FName SkyName)\n{\n\tASoSky* Sky = nullptr;\n\tFString ErrorMessage;\n\tif (!FSoEditorUtilities::GetEditorSoSky(Sky, ErrorMessage))\n\t{\n\t\tFSoEditorUtilities::AddNotificationError(FString::Printf(TEXT(\"Failed set SoSky Preset to `%s`. ErrorMessage = `%s`\"), *SkyName.ToString(), *ErrorMessage));\n\t\treturn false;\n\t}\n\n\tSky->SetPreviewedPreset0(SkyName);\n\tSky->SetBlendValue(0.f);\n\tSky->UpdatePreviewedSky();\n\treturn true;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSOrbEditorModule::LogCurrentBuildPreset()\n{\n\tif (bIsUsingChapterPreset)\n\t{\n\t\tif (!BuildPresets.ChapterPresets.IsValidIndex(ChapterIndexBuildPreset))\n\t\t\treturn;\n\n\t\t// Log\n\t\tconst FSoEditorChapterBuildPreset& ChapterPreset = BuildPresets.ChapterPresets[ChapterIndexBuildPreset];\n\t\tif (!ChapterPreset.LevelPresets.IsValidIndex(ChapterLevelIndexBuildPreset))\n\t\t\treturn;\n\t\tconst FSoEditorChapterBuildPresetLevels& LevelsPreset = ChapterPreset.LevelPresets[ChapterLevelIndexBuildPreset];\n\n\t\tUE_LOG(LogSoEditor, Log, TEXT(\"\"));\n\t\tUE_LOG(LogSoEditor, Log, TEXT(\"CurrentChapterBuildPreset = %d, CurrentLevelsBuildPreset = %d\"), ChapterIndexBuildPreset, ChapterLevelIndexBuildPreset);\n\t\tUE_LOG(LogSoEditor, Log, TEXT(\"\\tChapterPackageName = %s\"), *ChapterPreset.ChapterPackageName.ToString());\n\t\tUE_LOG(LogSoEditor, Log, TEXT(\"\\tSkyPreset = %s\"), *LevelsPreset.SkyPreset.ToString());\n\t\tUE_LOG(LogSoEditor, Log, TEXT(\"\\tLevels:\"), *LevelsPreset.SkyPreset.ToString());\n\t\tfor (FName Level : LevelsPreset.Levels)\n\t\t\tUE_LOG(LogSoEditor, Log, TEXT(\"\\t\\t%s\"), *Level.ToString());\n\t\tUE_LOG(LogSoEditor, Log, TEXT(\"\"));\n\t}\n\telse\n\t{\n\t\tif (!BuildPresets.EpisodePresets.IsValidIndex(EpisodeIndexBuildPreset))\n\t\t\treturn;\n\n\t\tconst FSoEditorEpisodeBuildPreset& EpisodePreset = BuildPresets.EpisodePresets[EpisodeIndexBuildPreset];\n\t\tUE_LOG(LogSoEditor, Log, TEXT(\"\"));\n\t\tUE_LOG(LogSoEditor, Log, TEXT(\"CurrentEpisodeBuildPreset = %d\"), EpisodeIndexBuildPreset);\n\t\tUE_LOG(LogSoEditor, Log, TEXT(\"\\tEpisodePackageName = %s\"), *EpisodePreset.EpisodePackageName.ToString());\n\t\tUE_LOG(LogSoEditor, Log, TEXT(\"\"));\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSOrbEditorModule::LoadBuildPresets()\n{\n\tFDlgJsonParser Parser(FPaths::ProjectContentDir() / TEXT(\"SO/Data/LightBuildPresets.json\"));\n\tif (Parser.IsValidFile())\n\t\tParser.ReadAllProperty(FSoEditorBuildPresets::StaticStruct(), &BuildPresets, nullptr);\n\n\tChapterLevelIndexBuildPreset = 0;\n\tChapterIndexBuildPreset = 0;\n\tEpisodeIndexBuildPreset = 0;\n\tUE_LOG(LogSoEditor, Log, TEXT(\"LoadBuildPresets: BuildPresets = \\n%s\"), *BuildPresets.ToString());\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSOrbEditorModule::AddNotificationBar(FToolBarBuilder& ToolBarBuilder)\n{\n\tconst FSlateFontInfo& SmallFixedFont = FEditorStyle::GetFontStyle(TEXT(\"MainFrame.DebugTools.SmallFont\"));\n\tconst FSlateFontInfo& NormalFixedFont = FEditorStyle::GetFontStyle(TEXT(\"MainFrame.DebugTools.NormalFont\"));\n\tconst FSlateFontInfo& LabelFont = FEditorStyle::GetFontStyle(TEXT(\"MainFrame.DebugTools.LabelFont\"));\n\n\tTSharedRef<SWidget> BodyWidget =\n\t\tSNew(SHorizontalBox)\n\n\t\t// BuildType\n\t\t+SHorizontalBox::Slot()\n\t\t.AutoWidth()\n\t\t.Padding(0.0f, 0.0f, 4.0f, 0.0f)\n\t\t[\n\t\t\tSNew(SHorizontalBox)\n\t\t\t+SHorizontalBox::Slot()\n\t\t\t.AutoWidth()\n\t\t\t.VAlign(VAlign_Bottom)\n\t\t\t[\n\t\t\t\tSNew(STextBlock)\n\t\t\t\t.Text(FText::FromString(TEXT(\"BuildType: \")))\n\t\t\t\t.Font(LabelFont)\n\t\t\t\t.ColorAndOpacity(FLinearColor( 0.3f, 0.3f, 0.3f))\n\t\t\t]\n\t\t\t+SHorizontalBox::Slot()\n\t\t\t.AutoWidth()\n\t\t\t.VAlign(VAlign_Bottom)\n\t\t\t[\n\t\t\t\tSAssignNew(WidgetTextBuildType, STextBlock)\n\t\t\t\t.Font(NormalFixedFont)\n\t\t\t\t.ColorAndOpacity(FLinearColor( 0.6f, 0.6f, 0.6f))\n\t\t\t]\n\t\t]\n\n\t\t// BuildInfo\n\t\t+SHorizontalBox::Slot()\n\t\t.AutoWidth()\n\t\t.Padding(4.0f, 0.0f, 4.0f, 0.0f)\n\t\t[\n\t\t\tSNew(SHorizontalBox)\n\t\t\t+SHorizontalBox::Slot()\n\t\t\t.AutoWidth()\n\t\t\t.VAlign(VAlign_Bottom)\n\t\t\t[\n\t\t\t\tSNew(STextBlock)\n\t\t\t\t.Text(FText::FromString(TEXT(\"BuildInfo: \")))\n\t\t\t\t.Font(LabelFont)\n\t\t\t\t.ColorAndOpacity(FLinearColor(0.3f, 0.3f, 0.3f))\n\t\t\t]\n\t\t\t+SHorizontalBox::Slot()\n\t\t\t.AutoWidth()\n\t\t\t.VAlign(VAlign_Bottom)\n\t\t\t[\n\t\t\t\tSAssignNew(WidgetTextBuildInfo, STextBlock)\n\t\t\t\t.Font(NormalFixedFont)\n\t\t\t\t.ColorAndOpacity(FLinearColor(0.6f, 0.6f, 0.6f))\n\t\t\t]\n\t\t]\n\n\t\t// Map\n\t\t+SHorizontalBox::Slot()\n\t\t.AutoWidth()\n\t\t.Padding(4.0f, 0.0f, 4.0f, 0.0f)\n\t\t[\n\t\t\tSNew(SHorizontalBox)\n\t\t\t+SHorizontalBox::Slot()\n\t\t\t.AutoWidth()\n\t\t\t.VAlign(VAlign_Bottom)\n\t\t\t[\n\t\t\t\tSNew(STextBlock)\n\t\t\t\t.Text(FText::FromString(TEXT(\"Map: \")))\n\t\t\t\t.Font(LabelFont)\n\t\t\t\t.ColorAndOpacity(FLinearColor(0.3f, 0.3f, 0.3f))\n\t\t\t]\n\t\t\t+SHorizontalBox::Slot()\n\t\t\t.AutoWidth()\n\t\t\t.VAlign(VAlign_Bottom)\n\t\t\t[\n\t\t\t\tSAssignNew(WidgetTextMap, STextBlock)\n\t\t\t\t.Font(NormalFixedFont)\n\t\t\t\t.ColorAndOpacity(FLinearColor(0.6f, 0.6f, 0.6f))\n\t\t\t]\n\t\t]\n\t;\n\n\tToolBarBuilder.AddWidget(\n\t\tSNew(SBorder)\n\t\t.Padding(FMargin(0.0f, 0.0f, 0.0f, 1.0f))\n\t\t.VAlign(VAlign_Bottom)\n\t\t.BorderImage(FEditorStyle::GetBrush(\"NoBorder\"))\n\t\t.Visibility_Lambda([this]() -> EVisibility\n\t\t{\n\t\t\treturn bShowNotificationBar ? EVisibility::Visible : EVisibility::Collapsed;\n\t\t\t//return EVisibility::Visible;\n\t\t})\n\t\t[\n\t\t\tSNew(SHorizontalBox)\n\t\t\t.Visibility(EVisibility::SelfHitTestInvisible)\n\t\t\t+SHorizontalBox::Slot()\n\t\t\t.AutoWidth()\n\t\t\t.Padding(0.0f)\n\t\t\t[\n\t\t\t\tBodyWidget\n\t\t\t]\n\t\t]\n\t);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nTSharedRef<SWidget> FSOrbEditorModule::GenerateBuildPresetsMenu()\n{\n\tconstexpr bool bShouldCloseWindowAfterMenuSelection = true;\n\tFMenuBuilder MenuBuilder(bShouldCloseWindowAfterMenuSelection, nullptr, {});\n\n\t//const FString TempTExt = TEXT(\"Save All dirty packages\");\n\t//MenuBuilder.AddMenuEntry(\n\t//\tFText::FromString(TempTExt),\n\t//\tFText::FromString(TempTExt),\n\t//\tFSlateIcon(),\n\t//\tFUIAction(FExecuteAction::CreateLambda([this]\n\t//\t{\n\t//\t\tFSoEditorUtilities::SaveAllDirtyPackages();\n\t//\t}))\n\t//);\n\t//MenuBuilder.AddMenuSeparator();\n\n\tMenuBuilder.BeginSection(\"Build\", FText::FromString(TEXT(\"Build\")));\n\t{\n\t\tconst FString BuildAllText = TEXT(\"Build All\");\n\t\tMenuBuilder.AddMenuEntry(\n\t\t\tFText::FromString(BuildAllText),\n\t\t\tFText::FromString(BuildAllText),\n\t\t\tFSlateIcon(FSoEditorStyle::GetStyleSetName(), FSoEditorStyle::PROPERTY_BuildIcon),\n\t\t\tFUIAction(\n\t\t\t\tFExecuteAction::CreateLambda([this]\n\t\t\t\t{\n\t\t\t\t\tBuildAllType = ESoBuildAllType::All;\n\t\t\t\t\tStartBuildAll();\n\t\t\t\t}),\n\t\t\t\tFCanExecuteAction::CreateRaw(this, &Self::CanStartLightBuild)\n\t\t\t)\n\t\t);\n\t}\n\t{\n\t\tconst FString BuildAllChaptersText = TEXT(\"Build All Chapters\");\n\t\tMenuBuilder.AddMenuEntry(\n\t\t\tFText::FromString(BuildAllChaptersText),\n\t\t\tFText::FromString(BuildAllChaptersText),\n\t\t\tFSlateIcon(FSoEditorStyle::GetStyleSetName(), FSoEditorStyle::PROPERTY_BuildIcon),\n\t\t\tFUIAction(\n\t\t\t\tFExecuteAction::CreateLambda([this]\n\t\t\t\t{\n\t\t\t\t\tBuildAllType = ESoBuildAllType::AllChapters;\n\t\t\t\t\tStartBuildAllChapters(true);\n\t\t\t\t}),\n\t\t\t\tFCanExecuteAction::CreateRaw(this, &Self::CanStartLightBuild)\n\t\t\t)\n\t\t);\n\t}\n\t{\n\t\tconst FString BuildAllEpisodesText = TEXT(\"Build All Episode\");\n\t\tMenuBuilder.AddMenuEntry(\n\t\t\tFText::FromString(BuildAllEpisodesText),\n\t\t\tFText::FromString(BuildAllEpisodesText),\n\t\t\tFSlateIcon(FSoEditorStyle::GetStyleSetName(), FSoEditorStyle::PROPERTY_BuildIcon),\n\t\t\tFUIAction(\n\t\t\t\tFExecuteAction::CreateLambda([this]\n\t\t\t\t{\n\t\t\t\t\tBuildAllType = ESoBuildAllType::AllEpisodes;\n\t\t\t\t\tStartBuildAllEpisodes(true);\n\t\t\t\t}),\n\t\t\t\tFCanExecuteAction::CreateRaw(this, &Self::CanStartLightBuild)\n\t\t\t)\n\t\t);\n\t}\n\tMenuBuilder.EndSection();\n\n\n\tMenuBuilder.BeginSection(\"Chapter Presets\", FText::FromString(TEXT(\"Chapter Presets\")));\n\tfor (int32 ChapterIndex = 0; ChapterIndex < BuildPresets.ChapterPresets.Num(); ChapterIndex++)\n\t{\n\t\tconst FSoEditorChapterBuildPreset& ChapterPreset = BuildPresets.ChapterPresets[ChapterIndex];\n\t\tconst FString MapShortName = FPackageName::GetShortName(ChapterPreset.ChapterPackageName);\n\t\tconst FString ChapterName = FString::Printf(TEXT(\"%s\"), *MapShortName);\n\n\t\t// Create sub menu for each chapter\n\t\tMenuBuilder.AddSubMenu(\n\t\t\tFText::FromString(ChapterName),\n\t\t\tFText::FromString(ChapterName),\n\t\t\tFNewMenuDelegate::CreateLambda([&ChapterPreset, this, ChapterIndex](FMenuBuilder& SubMenuBuilder)\n\t\t\t{\n\t\t\t\t// Build all levels in chapter\n\t\t\t\tSubMenuBuilder.BeginSection(\"Build\", FText::FromString(TEXT(\"Build\")));\n\t\t\t\tconst FString BuildAllText = TEXT(\"Build All\");\n\t\t\t\tSubMenuBuilder.AddMenuEntry(\n\t\t\t\t\tFText::FromString(BuildAllText),\n\t\t\t\t\tFText::FromString(BuildAllText),\n\t\t\t\t\tFSlateIcon(FSoEditorStyle::GetStyleSetName(), FSoEditorStyle::PROPERTY_BuildIcon),\n\t\t\t\t\tFUIAction(\n\t\t\t\t\t\tFExecuteAction::CreateLambda([this, ChapterIndex]\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tBuildAllType = ESoBuildAllType::OnlyLevelsInChapter;\n\t\t\t\t\t\t\tChapterIndexToBuild = ChapterIndex;\n\t\t\t\t\t\t\tStartBuildAllChapters(true);\n\t\t\t\t\t\t}),\n\t\t\t\t\t\tFCanExecuteAction::CreateRaw(this, &Self::CanStartLightBuild)\n\t\t\t\t\t)\n\t\t\t\t);\n\t\t\t\tSubMenuBuilder.EndSection();\n\n\t\t\t\t// All levels with sky default\n\t\t\t\tSubMenuBuilder.BeginSection(\"Show\", FText::FromString(TEXT(\"Show\")));\n\t\t\t\tstatic const FName DefaultPresetForAll = TEXT(\"Clouds\");\n\t\t\t\tconst FString AllText = FString::Printf(TEXT(\"All (Sky = %s)\"), *DefaultPresetForAll.ToString());\n\t\t\t\tSubMenuBuilder.AddMenuEntry(\n\t\t\t\t\tFText::FromString(AllText),\n\t\t\t\t\tFText::FromString(AllText),\n\t\t\t\t\tFSlateIcon(),\n\t\t\t\t\tFUIAction(\n\t\t\t\t\t\tFExecuteAction::CreateLambda([this, ChapterIndex]\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif (SetChapterPresetTo(ChapterIndex))\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tFString ErrorMessage;\n\t\t\t\t\t\t\t\tFSoEditorUtilities::MakeAllEditorLevelsVisible(ErrorMessage);\n\t\t\t\t\t\t\t\tSetSkyPresetTo(DefaultPresetForAll);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}),\n\t\t\t\t\t\tFCanExecuteAction::CreateRaw(this, &Self::CanStartLightBuild)\n\t\t\t\t\t)\n\t\t\t\t);\n\n\t\t\t\t// Create menu for levels in the chapter (act)\n\t\t\t\tfor (int32 LevelsPresetIndex = 0; LevelsPresetIndex < ChapterPreset.LevelPresets.Num(); LevelsPresetIndex++)\n\t\t\t\t{\n\t\t\t\t\tconst FSoEditorChapterBuildPresetLevels& LevelsPreset = ChapterPreset.LevelPresets[LevelsPresetIndex];\n\n\t\t\t\t\t// Accumulate levels\n\t\t\t\t\tFString LevelsString = LevelsPreset.Levels.Num() > 0 ? LevelsPreset.Levels[0].ToString() : TEXT(\"No levels\");\n\t\t\t\t\tfor (int32 LevelIndex = 1; LevelIndex < LevelsPreset.Levels.Num(); LevelIndex++)\n\t\t\t\t\t\tLevelsString += TEXT(\" + \") + LevelsPreset.Levels[LevelIndex].ToString();\n\n\t\t\t\t\t// Set build presets\n\t\t\t\t\tconst FString Text = FString::Printf(TEXT(\"%d. %s (Sky = %s)\"), LevelsPresetIndex, *LevelsString, *LevelsPreset.SkyPreset.ToString());\n\t\t\t\t\tSubMenuBuilder.AddMenuEntry(\n\t\t\t\t\t\tFText::FromString(Text),\n\t\t\t\t\t\tFText::FromString(Text),\n\t\t\t\t\t\tFSlateIcon(),\n\t\t\t\t\t\tFUIAction(\n\t\t\t\t\t\t\tFExecuteAction::CreateLambda([this, ChapterIndex, LevelsPresetIndex]\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tSetChapterLevelsPresetTo(ChapterIndex, LevelsPresetIndex);\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\tFCanExecuteAction::CreateRaw(this, &Self::CanStartLightBuild)\n\t\t\t\t\t\t)\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tSubMenuBuilder.EndSection();\n\t\t\t}),\n\t\t\tfalse,\n\t\t\tFSlateIcon()\n\t\t);\n\t}\n\tMenuBuilder.EndSection();\n\n\tMenuBuilder.BeginSection(\"Episode Presets\", FText::FromString(TEXT(\"Episode Presets\")));\n\tconst FText EpisodeText = FText::FromString(TEXT(\"Episodes\"));\n\tMenuBuilder.AddSubMenu(\n\t\tEpisodeText,\n\t\tEpisodeText,\n\t\tFNewMenuDelegate::CreateLambda([this](FMenuBuilder& SubMenuBuilder)\n\t\t{\n\t\t\tSubMenuBuilder.BeginSection(\"Show\", FText::FromString(TEXT(\"Show\")));\n\t\t\tfor (int32 Index = 0; Index < BuildPresets.EpisodePresets.Num(); Index++)\n\t\t\t{\n\t\t\t\tconst FSoEditorEpisodeBuildPreset& EpisodePreset = BuildPresets.EpisodePresets[Index];\n\t\t\t\tconst FString MapShortName = FPackageName::GetShortName(EpisodePreset.EpisodePackageName);\n\t\t\t\tconst FString EpisodeName = FString::Printf(TEXT(\"%s\"), *MapShortName);\n\n\t\t\t\tconst FString Text = FString::Printf(TEXT(\"%d. %s\"), Index, *EpisodeName);\n\n\t\t\t\t// Create sub menu for each episode\n\t\t\t\tSubMenuBuilder.AddMenuEntry(\n\t\t\t\t\tFText::FromString(Text),\n\t\t\t\t\tFText::FromString(Text),\n\t\t\t\t\tFSlateIcon(),\n\t\t\t\t\tFUIAction(\n\t\t\t\t\t\tFExecuteAction::CreateLambda([this, Index]\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tSetEpisodePresetTo(Index);\n\t\t\t\t\t\t}),\n\t\t\t\t\t\tFCanExecuteAction::CreateRaw(this, &Self::CanStartLightBuild)\n\t\t\t\t\t)\n\t\t\t\t);\n\t\t\t}\n\t\t\tSubMenuBuilder.EndSection();\n\t\t}),\n\t\tfalse,\n\t\tFSlateIcon()\n\t);\n\tMenuBuilder.EndSection();\n\n\treturn MenuBuilder.MakeWidget();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSOrbEditorModule::UpdateNotificationWidgets()\n{\n\tFString MapName;\n\tFString BuildType;\n\tFString BuildInfo;\n\tif (bIsUsingChapterPreset)\n\t{\n\t\t// Chapter\n\t\tBuildType = TEXT(\"Chapter\");\n\n\t\tif (BuildPresets.ChapterPresets.IsValidIndex(ChapterIndexBuildPreset))\n\t\t{\n\t\t\tconst FSoEditorChapterBuildPreset& ChapterBuildPreset = BuildPresets.ChapterPresets[ChapterIndexBuildPreset];\n\t\t\tMapName = ChapterBuildPreset.ChapterPackageName.ToString();\n\n\t\t\tif (ChapterBuildPreset.LevelPresets.IsValidIndex(ChapterLevelIndexBuildPreset))\n\t\t\t{\n\t\t\t\tconst FSoEditorChapterBuildPresetLevels& LevelBuildPreset = ChapterBuildPreset.LevelPresets[ChapterLevelIndexBuildPreset];\n\t\t\t\tBuildInfo = FString::Printf(TEXT(\"ChapterIndex = %d, LevelsPresetIndex = %d, %s\"), ChapterIndexBuildPreset, ChapterLevelIndexBuildPreset, *LevelBuildPreset.ToString());\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tMapName = TEXT(\"Invalid CurrentChapterBuildPreset\");\n\t\t}\n\t}\n\telse\n\t{\n\t\t// Episode\n\t\tBuildType = TEXT(\"Episode\");\n\n\t\tif (BuildPresets.EpisodePresets.IsValidIndex(EpisodeIndexBuildPreset))\n\t\t{\n\t\t\tconst FSoEditorEpisodeBuildPreset& EpisodePreset = BuildPresets.EpisodePresets[EpisodeIndexBuildPreset];\n\t\t\tMapName = EpisodePreset.EpisodePackageName.ToString();\n\n\t\t\tBuildInfo = FString::Printf(TEXT(\"EpisodeIndex = %d\"), EpisodeIndexBuildPreset);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tMapName = TEXT(\"Invalid CurrentEpisodeBuildPreset\");\n\t\t}\n\t}\n\n\tWidgetTextMap->SetText(MapName);\n\tWidgetTextBuildType->SetText(BuildType);\n\tWidgetTextBuildInfo->SetText(BuildInfo);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSOrbEditorModule::OnModuleChanged(FName ModuleName, EModuleChangeReason ChangeReason)\n{\n\t// UE_LOG(LogTemp, Warning, TEXT(\"ModuleLoaded %s\"), *ModuleName.ToString());\n\t// random module which loads late\n\tif (ModuleName != FName(\"EditorWidgets\"))\n\t\treturn;\n\n\tUWorld* EditorWorld = FSoEditorUtilities::GetEditorWorld();\n\tif (EditorWorld == nullptr)\n\t\treturn;\n\n\t// random module which loads late\n\tif (ChangeReason == EModuleChangeReason::ModuleLoaded)\n\t{\n\t\tauto& Settings = USoGameSettings::Get();\n\t\tSettings.LoadSettings();\n\t\tif (Settings.IsDisplayedStatsEnabled())\n\t\t\tGEditor->Exec(EditorWorld, TEXT(\"stat fps\"), *GLog);\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSOrbEditorModule::ConfigureLightingBuildOptions(const FLightingBuildOptions& Options)\n{\n\tGConfig->SetBool(TEXT(\"LightingBuildOptions\"), TEXT(\"OnlyBuildSelected\"), Options.bOnlyBuildSelected, GEditorPerProjectIni);\n\tGConfig->SetBool(TEXT(\"LightingBuildOptions\"), TEXT(\"OnlyBuildCurrentLevel\"), Options.bOnlyBuildCurrentLevel, GEditorPerProjectIni);\n\tGConfig->SetBool(TEXT(\"LightingBuildOptions\"), TEXT(\"OnlyBuildSelectedLevels\"), Options.bOnlyBuildSelectedLevels, GEditorPerProjectIni);\n\tGConfig->SetBool(TEXT(\"LightingBuildOptions\"), TEXT(\"OnlyBuildVisibility\"), Options.bOnlyBuildVisibility, GEditorPerProjectIni);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool FSOrbEditorModule::IsTickable() const\n{\n\treturn IsValid(GWorld) &&\n\t\tGWorld->bIsWorldInitialized &&\n\t\tGWorld->WorldType != EWorldType::Inactive &&\n\t\tCanStartLightBuild() &&\n\t\t(LightStatus == ESoLightBuildStatus::Succeeded || LightStatus == ESoLightBuildStatus::Succeeded_Wait || LightStatus == ESoLightBuildStatus::Loading_WaitLevelChange) &&\n\t\t!FSoEditorUtilities::IsAnyLevelInWorldLoading(GWorld);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool FSOrbEditorModule::Tick(float DeltaTime)\n{\n\tif (!IsTickable())\n\t\treturn true;\n\n\tif (LightStatus == ESoLightBuildStatus::Loading_WaitLevelChange)\n\t{\n\t\tRunEditorBuildAll();\n\t}\n\n\t// Add some delay\n\telse if (LightStatus == ESoLightBuildStatus::Succeeded_Wait)\n\t{\n\t\tAfterLightCurrentSeconds += DeltaTime;\n\t\tif (AfterLightCurrentSeconds > AfterLightWaitSeconds)\n\t\t{\n\t\t\tAfterLightCurrentSeconds = 0.f;\n\t\t\tLightStatus = ESoLightBuildStatus::Succeeded;\n\t\t}\n\t}\n\telse if (LightStatus == ESoLightBuildStatus::Succeeded)\n\t{\n\t\tFinishedBuildNext();\n\t}\n\n\treturn true;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSOrbEditorModule::RunEditorBuildAll()\n{\n\tUE_LOG(LogSoEditor, Log, TEXT(\"RunEditorBuildAll\"));\n\tLightStatus = ESoLightBuildStatus::Building;\n\t//CurrentWorld = FSoEditorUtilities::GetEditorWorld();\n\n\t// Reset build options\n\tConfigureLightingBuildOptions(FLightingBuildOptions());\n\n\tFSoEditorUtilities::EditorBuildAll(GWorld);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool FSOrbEditorModule::ConfirmUserBuildQuestion(const FString& Body)\n{\n\t// User confirmation\n\tconst EAppReturnType::Type Response = FPlatformMisc::MessageBoxExt(EAppMsgType::YesNo, *Body, TEXT(\"Continue building?\"));\n\treturn Response == EAppReturnType::Yes;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSOrbEditorModule::PreStartBuild()\n{\n\t// Start building\n\t//CurrentWorld = FSoEditorUtilities::GetEditorWorld();\n\tSubscribeToLightBuildEvents();\n\t//LoadBuildPresets();\n\n\t// Force AutoApplyLighting on\n\tULevelEditorMiscSettings* LevelEdSettings = GetMutableDefault<ULevelEditorMiscSettings>();\n\tbOldAutoApplyLightingEnable = LevelEdSettings->bAutoApplyLightingEnable;\n\tLevelEdSettings->bAutoApplyLightingEnable = true;\n\n\t// Disable autosaving\n\tUEditorLoadingSavingSettings* LoadingSavingSettings = GetMutableDefault<UEditorLoadingSavingSettings>();\n\tbOldAutoSaveEnable = LoadingSavingSettings->bAutoSaveEnable;\n\tLoadingSavingSettings->bAutoSaveEnable = false;\n\n\tUE_LOG(LogSoEditor, Log, TEXT(\"PreStartBuild: Saving\"));\n\tbShowNotificationBar = true;\n\tFSoEditorUtilities::SaveAllDirtyPackages();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSOrbEditorModule::StartBuildAllEpisodes(bool bAskConfirmation)\n{\n\tUE_LOG(LogSoEditor, Log, TEXT(\"StartBuildAllEpisodes\"));\n\n\tif (bAskConfirmation)\n\t{\n\t\tif (!ConfirmUserBuildQuestion(FString::Printf(TEXT(\"Build All Episodes for Warriorb\\n%s\"), *BuildPresets.ToStringEpisodes())))\n\t\t\treturn;\n\t}\n\n\tPreStartBuild();\n\tbIsUsingChapterPreset = false;\n\tEpisodeIndexBuildPreset = 0;\n\tBuildCurrentEpisode();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSOrbEditorModule::BuildCurrentEpisode()\n{\n\tUE_LOG(LogSoEditor, Log, TEXT(\"BuildCurrentEpisode\"));\n\tverify(!bIsUsingChapterPreset);\n\tverify(!GUnrealEd->WarnIfLightingBuildIsCurrentlyRunning());\n\n\tif (!BuildPresets.EpisodePresets.IsValidIndex(EpisodeIndexBuildPreset))\n\t{\n\t\tUE_LOG(LogSoEditor, Error, TEXT(\"CurrentEpisodeBuildPreset = %d is not a valid index in EpisodePresets :O\"), EpisodeIndexBuildPreset);\n\t\treturn;\n\t}\n\n\t// Save here because we are changing map most likely\n\tFSoEditorUtilities::SaveAllDirtyPackages();\n\tLightStatus = ESoLightBuildStatus::Loading_WaitLevelChange;\n\tSetEpisodePresetTo(EpisodeIndexBuildPreset);\n\tUpdateNotificationWidgets();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSOrbEditorModule::FinishedBuildNextEpisode()\n{\n\tUE_LOG(LogSoEditor, Log, TEXT(\"FinishedBuildNextEpisode\"));\n\tverify(!bIsUsingChapterPreset);\n\tverify(!GUnrealEd->WarnIfLightingBuildIsCurrentlyRunning());\n\n\tif (BuildPresets.EpisodePresets.IsValidIndex(EpisodeIndexBuildPreset + 1))\n\t{\n\t\t// Build next\n\t\tEpisodeIndexBuildPreset++;\n\t\tBuildCurrentEpisode();\n\t}\n\telse\n\t{\n\t\tOnFinishedBuildingEpisodes();\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSOrbEditorModule::StartBuildAllChapters(bool bAskConfirmation)\n{\n\tUE_LOG(LogSoEditor, Log, TEXT(\"StartBuildAllChapters\"));\n\n\tif (bAskConfirmation)\n\t{\n\t\tFString ChaptersString;\n\t\tFString QuestionPlurals = TEXT(\"All chapters\");\n\t\tif (BuildAllType == ESoBuildAllType::OnlyLevelsInChapter)\n\t\t{\n\t\t\tQuestionPlurals = TEXT(\"All levels of Chapter\");\n\t\t\tChaptersString = BuildPresets.ChapterPresets.IsValidIndex(ChapterIndexToBuild) ? BuildPresets.ChapterPresets[ChapterIndexToBuild].ToString() : TEXT(\"ERROR\");\n\t\t}\n\t\telse\n\t\t{\n\t\t\tChaptersString = BuildPresets.ToStringChapters();\n\t\t}\n\n\t\tif (!ConfirmUserBuildQuestion(FString::Printf(TEXT(\"Build %s for Warriorb\\n%s\"), *QuestionPlurals, *ChaptersString)))\n\t\t\treturn;\n\t}\n\n\tPreStartBuild();\n\tbIsUsingChapterPreset = true;\n\tChapterIndexBuildPreset = 0;\n\tChapterLevelIndexBuildPreset = 0;\n\tBuildCurrentChapter();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSOrbEditorModule::BuildCurrentChapter()\n{\n\tUE_LOG(LogSoEditor, Log, TEXT(\"BuildCurrentChapter: CurrentChapterBuildPreset = %d,  CurrentChapterLevelBuildPreset = %d\"), ChapterIndexBuildPreset, ChapterLevelIndexBuildPreset);\n\tverify(bIsUsingChapterPreset);\n\tverify(!GUnrealEd->WarnIfLightingBuildIsCurrentlyRunning());\n\n\t// Build only this chapter\n\tif (BuildAllType == ESoBuildAllType::OnlyLevelsInChapter)\n\t{\n\t\tUE_LOG(LogSoEditor, Log, TEXT(\"BuildCurrentChapter: Only building ChapterIndex = %d\"), ChapterIndexToBuild);\n\t\tChapterIndexBuildPreset = ChapterIndexToBuild;\n\t}\n\n\tconst FString PreviousMapName = GWorld->GetMapName();\n\tif (!BuildPresets.ChapterPresets.IsValidIndex(ChapterIndexBuildPreset))\n\t{\n\t\tUE_LOG(LogSoEditor, Error, TEXT(\"CurrentChapterBuildPreset = %d is not a valid index in ChapterPresets :O\"), ChapterIndexBuildPreset);\n\t\treturn;\n\t}\n\n\tconst FSoEditorChapterBuildPreset& ChapterPreset = BuildPresets.ChapterPresets[ChapterIndexBuildPreset];\n\tif (!ChapterPreset.LevelPresets.IsValidIndex(ChapterLevelIndexBuildPreset))\n\t{\n\t\tUE_LOG(LogSoEditor, Error, TEXT(\"CurrentChapterLevelBuildPreset = %d is not a valid index in ChapterPresets[%d].LevelPresets :O\"), ChapterLevelIndexBuildPreset, ChapterIndexBuildPreset);\n\t\treturn;\n\t}\n\n\t// Can we save dirty packages?\n\tconst FSoEditorChapterBuildPresetLevels& LevelPreset = ChapterPreset.LevelPresets[ChapterLevelIndexBuildPreset];\n\tif (LevelPreset.bSaveAllDirtyPackagesBefore)\n\t{\n\t\tUE_LOG(LogSoEditor, Log, TEXT(\"BuildCurrentChapter: Saving all dirty packages because bSaveAllDirtyPackagesBefore = true\"));\n\t\tFSoEditorUtilities::SaveAllDirtyPackages();\n\t}\n\tif (PreviousChapterIndexBuildPreset != ChapterIndexBuildPreset)\n\t{\n\t\tUE_LOG(LogSoEditor, Log, TEXT(\"BuildCurrentChapter: Saving all dirty packages because we are about to change chapters\"));\n\t\tFSoEditorUtilities::SaveAllDirtyPackages();\n\t}\n\n\tLightStatus = ESoLightBuildStatus::Loading_WaitLevelChange;\n\tSetChapterLevelsPresetTo(ChapterIndexBuildPreset, ChapterLevelIndexBuildPreset);\n\tUpdateNotificationWidgets();\n\tPreviousChapterIndexBuildPreset = ChapterIndexBuildPreset;\n\n\t//CurrentWorld = FSoEditorUtilities::GetEditorWorld();\n\t//const FString CurrentMapName = FSoEditorUtilities::GetEditorWorld()->GetMapName();\n\t//if (CurrentMapName != PreviousMapName)\n\t//{\n\t//\tCurrentWorld = nullptr;\n\t//}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSOrbEditorModule::FinishedBuildNextChapter()\n{\n\tUE_LOG(LogSoEditor, Log, TEXT(\"FinishedBuildNextChapter\"));\n\tverify(bIsUsingChapterPreset);\n\n\tauto AdvanceLevelIndex = [this]() -> bool\n\t{\n\t\tconst FSoEditorChapterBuildPreset& ChapterPreset = BuildPresets.ChapterPresets[ChapterIndexBuildPreset];\n\t\tconst bool bCanAdvance = ChapterPreset.LevelPresets.IsValidIndex(ChapterLevelIndexBuildPreset + 1);\n\t\tif (bCanAdvance)\n\t\t\tChapterLevelIndexBuildPreset++;\n\n\t\treturn bCanAdvance;\n\t};\n\n\tauto AdvanceChapterIndex = [this]() -> bool\n\t{\n\t\tconst bool bCanAdvance = BuildPresets.ChapterPresets.IsValidIndex(ChapterIndexBuildPreset + 1);\n\t\tif (bCanAdvance)\n\t\t\tChapterIndexBuildPreset++;\n\n\t\treturn bCanAdvance;\n\t};\n\n\t// Try advancing level\n\tconst bool bDidAdvanceLevel = AdvanceLevelIndex();\n\n\t// Try advancing chapter\n\tbool bDidAdvanceChapter = false;\n\tconst bool bCanAdvanceChapter = BuildAllType == ESoBuildAllType::AllChapters || BuildAllType == ESoBuildAllType::All;\n\tif (!bDidAdvanceLevel && bCanAdvanceChapter)\n\t{\n\t\tbDidAdvanceChapter = AdvanceChapterIndex();\n\t}\n\n\tif (bDidAdvanceLevel || bDidAdvanceChapter)\n\t{\n\t\t// Build next\n\t\tBuildCurrentChapter();\n\t}\n\telse\n\t{\n\t\t// Can't do anything quit\n\t\tOnFinishedBuildingChapters();\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSOrbEditorModule::StartBuildAll()\n{\n\tUE_LOG(LogSoEditor, Log, TEXT(\"StartBuildAll\"));\n\n\t// User confirmation\n\tconst FString BuildPresetsStr = BuildPresets.ToString();\n\tif (!ConfirmUserBuildQuestion(FString::Printf(TEXT(\"You are about to start building all levels for Warriorb with the predefined presets\\n%s\"), *BuildPresetsStr)))\n\t\treturn;\n\n\t// First Episodes then chapters\n\tStartBuildAllEpisodes(false);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool FSOrbEditorModule::CanStartLightBuild() const\n{\n\treturn GUnrealEd && !GUnrealEd->PlayWorld && !GUnrealEd->bIsSimulatingInEditor && !GUnrealEd->IsLightingBuildCurrentlyRunning()\n\t\t&& !GUnrealEd->IsLightingBuildCurrentlyExporting();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSOrbEditorModule::FinishedBuildNext()\n{\n\tUE_LOG(LogSoEditor,\n\t\tLog,\n\t\tTEXT(\"FinishedBuildNext: bIsUsingChapterPreset = %d, CurrentChapterBuildPreset = %d, CurrentChapterLevelBuildPreset = %d, CurrentEpisodeBuildPreset = %d\"),\n\t\tbIsUsingChapterPreset, ChapterIndexBuildPreset, ChapterLevelIndexBuildPreset, EpisodeIndexBuildPreset);\n\n\tif (bIsUsingChapterPreset)\n\t{\n\t\tFinishedBuildNextChapter();\n\t}\n\telse\n\t{\n\t\tFinishedBuildNextEpisode();\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSOrbEditorModule::OnFinishedBuildingEpisodes()\n{\n\t// return back to chapters\n\t//bIsUsingChapterPreset = true;\n\t//CurrentChapterBuildPreset = 0;\n\t//CurrentChapterLevelBuildPreset = 0;\n\t//BuildCurrentChapter();\n\n\tif (BuildAllType == ESoBuildAllType::AllEpisodes)\n\t{\n\t\tUE_LOG(LogSoEditor, Log, TEXT(\"OnFinishedBuildingEpisodes. Done building. Saving all\"));\n\t\tFSoEditorUtilities::AddNotificationError(TEXT(\"All Light builds SUCCEEDED\"));\n\t\tResetBuildSettings();\n\t\tFSoEditorUtilities::SaveAllDirtyPackages();\n\t}\n\telse if (BuildAllType == ESoBuildAllType::All)\n\t{\n\t\t// Next build chapters\n\t\tUE_LOG(LogSoEditor, Log, TEXT(\"OnFinishedBuildingEpisodes. Done building episodes. Moving to chapters. Saving all\"));\n\t\tFSoEditorUtilities::SaveAllDirtyPackages();\n\t\tStartBuildAllChapters(false);\n\t}\n\telse\n\t{\n\t\tcheckNoEntry();\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSOrbEditorModule::OnFinishedBuildingChapters()\n{\n\t// Reset, everything is done\n\tauto Finished = [this]()\n\t{\n\t\tFSoEditorUtilities::AddNotificationError(TEXT(\"All Light builds SUCCEEDED\"));\n\t\tResetBuildSettings();\n\t\tFSoEditorUtilities::SaveAllDirtyPackages();\n\t};\n\n\tif (BuildAllType == ESoBuildAllType::OnlyLevelsInChapter)\n\t{\n\t\tUE_LOG(LogSoEditor, Log, TEXT(\"OnFinishedBuildingChapters. Done building all levels of ChapterIndex = %d. Saving all\"), ChapterIndexBuildPreset);\n\t\tFinished();\n\t}\n\telse if (BuildAllType == ESoBuildAllType::AllChapters)\n\t{\n\t\tUE_LOG(LogSoEditor, Log, TEXT(\"OnFinishedBuildingChapters. Done building all chapters. Saving all\"));\n\t\tFinished();\n\t}\n\telse if (BuildAllType == ESoBuildAllType::All)\n\t{\n\t\tUE_LOG(LogSoEditor, Log, TEXT(\"OnFinishedBuildingChapters. Done building all episodes + chapters. Saving all\"));\n\t\tFinished();\n\t}\n\telse\n\t{\n\t\tcheckNoEntry();\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSOrbEditorModule::OnMapOpened(const FString&  Filename, bool bAsTemplate)\n{\n\tUE_LOG(LogSoEditor, Log, TEXT(\"Opened Map = %s\"), *Filename);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSOrbEditorModule::OnLightBuildStarted()\n{\n\tif (bIsUsingChapterPreset)\n\t{\n\t\tUE_LOG(LogSoEditor, Warning, TEXT(\"Light build started for ChapterBuildPreset = %d, ChapterLevelBuildPreset = %d\"), ChapterIndexBuildPreset, ChapterLevelIndexBuildPreset);\n\t}\n\telse\n\t{\n\t\tUE_LOG(LogSoEditor, Warning, TEXT(\"Light build started for EpisodeBuildPreset = %d\"), EpisodeIndexBuildPreset);\n\t}\n\n\tLightStatus = ESoLightBuildStatus::Building;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSOrbEditorModule::OnLightBuildFailed()\n{\n\tif (bIsUsingChapterPreset)\n\t{\n\t\tUE_LOG(LogSoEditor, Error, TEXT(\"Light build FAILED for ChapterBuildPreset = %d, ChapterLevelBuildPreset = %d\"), ChapterIndexBuildPreset, ChapterLevelIndexBuildPreset);\n\t}\n\telse\n\t{\n\t\tUE_LOG(LogSoEditor, Error, TEXT(\"Light build FAILED for EpisodeBuildPreset = %d\"), EpisodeIndexBuildPreset);\n\t}\n\n\tLightStatus = ESoLightBuildStatus::Failed;\n\tResetBuildSettings();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSOrbEditorModule::OnLightBuildSucceeded()\n{\n\tif (bIsUsingChapterPreset)\n\t{\n\t\tUE_LOG(LogSoEditor, Log, TEXT(\"Light build SUCCEEDED for ChapterBuildPreset = %d, ChapterLevelBuildPreset = %d\"), ChapterIndexBuildPreset, ChapterLevelIndexBuildPreset);\n\t}\n\telse\n\t{\n\t\tUE_LOG(LogSoEditor, Log, TEXT(\"Light build SUCCEEDED for EpisodeBuildPreset = %d\"), EpisodeIndexBuildPreset);\n\t}\n\n\t// NOTE, the light is still processing, Succeed set in OnLightingBuildKept\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSOrbEditorModule::OnLightingBuildKept()\n{\n\tif (bIsUsingChapterPreset)\n\t{\n\t\tUE_LOG(LogSoEditor, Log, TEXT(\"Light build KEPT for ChapterBuildPreset = %d, ChapterLevelBuildPreset = %d\"), ChapterIndexBuildPreset, ChapterLevelIndexBuildPreset);\n\t}\n\telse\n\t{\n\t\tUE_LOG(LogSoEditor, Log, TEXT(\"Light build KEPT for EpisodeBuildPreset = %d\"), EpisodeIndexBuildPreset);\n\t}\n\tLightStatus = ESoLightBuildStatus::Succeeded_Wait;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSOrbEditorModule::SubscribeToLightBuildEvents()\n{\n\tif (bSubscribedToLightEvents)\n\t\treturn;\n\n\tFWorldDelegates::OnPostWorldCreation.AddLambda([this](UWorld* World)\n\t{\n\t\tUE_LOG(LogSoEditor, Log, TEXT(\"OnPostWorldCreation = %s\"), *World->GetMapName());\n\t});\n\n\tFEditorDelegates::OnMapOpened.AddRaw(this, &Self::OnMapOpened);\n\tFEditorDelegates::OnLightingBuildStarted.AddRaw(this, &Self::OnLightBuildStarted);\n\tFEditorDelegates::OnLightingBuildKept.AddRaw(this, &Self::OnLightingBuildKept);\n\tFEditorDelegates::OnLightingBuildFailed.AddRaw(this, &Self::OnLightBuildFailed);\n\tFEditorDelegates::OnLightingBuildSucceeded.AddRaw(this, &Self::OnLightBuildSucceeded);\n\tbSubscribedToLightEvents = true;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSOrbEditorModule::UnsubscribeFromLightBuildEvents()\n{\n\tif (!bSubscribedToLightEvents)\n\t\treturn;\n\n\tFEditorDelegates::OnMapOpened.RemoveAll(this);\n\tFEditorDelegates::OnLightingBuildStarted.RemoveAll(this);\n\tFEditorDelegates::OnLightingBuildKept.RemoveAll(this);\n\tFEditorDelegates::OnLightingBuildFailed.RemoveAll(this);\n\tFEditorDelegates::OnLightingBuildSucceeded.RemoveAll(this);\n\tbSubscribedToLightEvents = false;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSOrbEditorModule::ResetBuildSettings()\n{\n\tbShowNotificationBar = false;\n\tLightStatus = ESoLightBuildStatus::None;\n\tBuildAllType = ESoBuildAllType::All;\n\tChapterIndexBuildPreset = INDEX_NONE;\n\tChapterLevelIndexBuildPreset = INDEX_NONE;\n\tEpisodeIndexBuildPreset = INDEX_NONE;\n\tChapterIndexToBuild = INDEX_NONE;\n\tbIsUsingChapterPreset = true;\n\tUnsubscribeFromLightBuildEvents();\n\n\t// Restore\n\tULevelEditorMiscSettings* LevelEdSettings = GetMutableDefault<ULevelEditorMiscSettings>();\n\tLevelEdSettings->bAutoApplyLightingEnable = bOldAutoApplyLightingEnable;\n\n\tUEditorLoadingSavingSettings* LoadingSavingSettings = GetMutableDefault<UEditorLoadingSavingSettings>();\n\tLoadingSavingSettings->bAutoSaveEnable = bOldAutoSaveEnable;\n}\n"
  },
  {
    "path": "Source/SOrbEditor/Private/SoAnimGraphNode_SetBoneWorldPos.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#include \"SoAnimGraphNode_SetBoneWorldPos.h\"\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFText USoAnimGraphNode_SetBoneWorldPos::GetControllerDescription() const\n{\n\treturn FText::FromString(TEXT(\"Set Bone World Pose\"));\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFText USoAnimGraphNode_SetBoneWorldPos::GetTooltipText() const\n{\n\treturn FText::FromString(TEXT(\"I am not yet sure what this thing will do...\"));\n}\n"
  },
  {
    "path": "Source/SOrbEditor/Private/SoEditorCommands.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#include \"SoEditorCommands.h\"\n#include \"Framework/Commands/Commands.h\"\n\n#define LOCTEXT_NAMESPACE \"WarriorbEditor\"\n\nvoid FSoEditorCommands::RegisterCommands()\n{\n\tUI_COMMAND(LoadCameraData, \"Camera Load\", \"Loads camera data\", EUserInterfaceActionType::Button, FInputChord());\n\tUI_COMMAND(SaveCameraData, \"Camera Save\", \"Saves camera data\", EUserInterfaceActionType::Button, FInputChord());\n\tUI_COMMAND(ToggleSplinePositionCorrection, \"TSC\", \"Toggles spline location correction\", EUserInterfaceActionType::ToggleButton, FInputChord());\n\tUI_COMMAND(ToggleDisplayCameraKeys, \"CamKeys\", \"Toggles visualization of camera keys\", EUserInterfaceActionType::ToggleButton, FInputChord());\n\tUI_COMMAND(RebuildEnemyGroups, \"EnemyGroups\", \"Rebuilds Enemy Groups\", EUserInterfaceActionType::Button, FInputChord());\n\tUI_COMMAND(BuildAll, \"Build All\", \"Warriorb Build all Version. Builds all levels (precomputes lighting data and visibility data, generates navigation networks and updates brush models.)\", EUserInterfaceActionType::Button, FInputChord());\n\tUI_COMMAND(CopyActorsToClipboard, \"Copy selected Actors to clipboard\", \"Copy selected Actors into an Array (in clipboard) so that you can paste it in the property editor\", EUserInterfaceActionType::Button, FInputChord());\n\n\tUI_COMMAND(SaveAllItems,\n\t\t\"Save All Items\",\n\t\t\"Saves all Items to the disk\",\n\t\tEUserInterfaceActionType::Button, FInputChord());\n\n\tUI_COMMAND(SaveAllEffectInstances,\n\t\t\"Save All Effect Instances\",\n\t\t\"Saves all effect instances to the disk\",\n\t\tEUserInterfaceActionType::Button, FInputChord());\n\n\tUI_COMMAND(SaveAllCharacterStrikes,\n\t\t\"Save All Character Strikes\",\n\t\t\"Saves all Character Strikes to the disk\",\n\t\tEUserInterfaceActionType::Button, FInputChord());\n}\n\n#undef LOCTEXT_NAMESPACE\n"
  },
  {
    "path": "Source/SOrbEditor/Private/SoEditorCommands.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#pragma once\n\n#include \"SoEditorStyle.h\"\n#include \"Framework/Commands/Commands.h\"\n\nclass FSoEditorCommands : public TCommands<FSoEditorCommands>\n{\npublic:\n\tFSoEditorCommands()\n\t\t: TCommands<FSoEditorCommands>(\n\t\t\tTEXT(\"SOrbEditor\"), // Context name for fast lookup, used by  the SoEditorStyle\n\t\t\t FText::FromString(TEXT(\"Sorb Editor\")),\n\t\t\tNAME_None, // Parent\n\t\t\tFSoEditorStyle::GetStyleSetName()) // Icon Style Set\n\t{\n\t}\n\n\t// TCommand<> interface\n\tvoid RegisterCommands() override;\n\t// End of TCommand<> interface\n\npublic:\n\tTSharedPtr<FUICommandInfo> SaveAllItems;\n\tTSharedPtr<FUICommandInfo> SaveAllEffectInstances;\n\tTSharedPtr<FUICommandInfo> SaveAllCharacterStrikes;\n\n\tTSharedPtr<FUICommandInfo> LoadCameraData;\n\tTSharedPtr<FUICommandInfo> SaveCameraData;\n\n\tTSharedPtr<FUICommandInfo> ToggleSplinePositionCorrection;\n\tTSharedPtr<FUICommandInfo> ToggleDisplayCameraKeys;\n\n\tTSharedPtr<FUICommandInfo> RebuildEnemyGroups;\n\n\tTSharedPtr<FUICommandInfo> BuildAll;\n\tTSharedPtr<FUICommandInfo> CopyActorsToClipboard;\n};\n"
  },
  {
    "path": "Source/SOrbEditor/Private/SoEditorStyle.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#include \"SoEditorStyle.h\"\n#include \"Styling/SlateStyleRegistry.h\"\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nTSharedPtr<FSlateStyleSet> FSoEditorStyle::StyleSet = nullptr;\nFString FSoEditorStyle::EngineContentRoot = FString();\n\n\n// Initialize static variables\nconst FName FSoEditorStyle::PROPERTY_BuildIcon(TEXT(\"SOrbEditor.BuildAll\"));\n\n// Const icon sizes\nstatic const FVector2D Icon16x16(16.0f, 16.0f);\nstatic const FVector2D Icon20x20(20.0f, 20.0f);\nstatic const FVector2D Icon40x40(40.0f, 40.0f);\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSoEditorStyle::Initialize()\n{\n\t// Only register once\n\tif (StyleSet.IsValid())\n\t\treturn;\n\n\tStyleSet = MakeShareable(new FSlateStyleSet(GetStyleSetName()));\n\tEngineContentRoot = FPaths::EngineContentDir() / TEXT(\"Editor/Slate\");\n\t// StyleSet->SetContentRoot(FPaths::EngineContentDir() / TEXT(\"Editor/Slate/Icons\"));\n\n\t// Define the icons for the toolbar buttons\n\n\tStyleSet->Set(\n\t\t\"SOrbEditor.LoadCameraData\",\n\t\tnew FSlateImageBrush(GetEngineContentPath(\"Icons/Profiler/Profiler_Load_Profiler_40x.png\"), Icon40x40)\n\t);\n\tStyleSet->Set(\n\t\t\"SOrbEditor.LoadCameraData.Small\",\n\t\tnew FSlateImageBrush(GetEngineContentPath(\"Icons/icon_Downloads_16x.png\"), Icon16x16)\n\t);\n\tStyleSet->Set(\n\t\t\"SOrbEditor.SaveCameraData\",\n\t\tnew FSlateImageBrush(GetEngineContentPath(\"Icons/icon_levels_SaveModified_40x.png\"), Icon40x40)\n\t);\n\tStyleSet->Set(\n\t\t\"SOrbEditor.SaveCameraData.Small\",\n\t\tnew FSlateImageBrush(GetEngineContentPath(\"Icons/icon_levels_SaveModified_16px.png\"), Icon16x16)\n\t);\n\tStyleSet->Set(\n\t\t\"SOrbEditor.ToggleSplinePositionCorrection\",\n\t\tnew FSlateImageBrush(GetEngineContentPath(\"Icons/icon_Landscape_Tool_Splines_40x.png\"), Icon40x40)\n\t);\n\tStyleSet->Set(\n\t\t\"SOrbEditor.ToggleSplinePositionCorrection.Small\",\n\t\tnew FSlateImageBrush(GetEngineContentPath(\"Icons/icon_Landscape_Tool_Splines_20x.png\"), Icon20x20)\n\t);\n\tStyleSet->Set(\n\t\t\"SOrbEditor.ToggleDisplayCameraKeys\",\n\t\tnew FSlateImageBrush(GetEngineContentPath(\"Icons/icon_StaticMeshEd_CameraLocked_40x.png\"), Icon40x40)\n\t);\n\tStyleSet->Set(\n\t\t\"SOrbEditor.ToggleDisplayCameraKeys.Small\",\n\t\tnew FSlateImageBrush(GetEngineContentPath(\"Icons/AssetIcons/CameraAnim_16x.png\"), Icon16x16)\n\t);\n\n\tStyleSet->Set(\n\t\t\"SOrbEditor.RebuildEnemyGroups\",\n\t\tnew FSlateImageBrush(GetEngineContentPath(\"Icons/icon_Blueprint_AddMacro_40px.png\"), Icon40x40)\n\t);\n\tStyleSet->Set(\n\t\t\"SOrbEditor.RebuildEnemyGroups.Small\",\n\t\tnew FSlateImageBrush(GetEngineContentPath(\"Icons/icon_Blueprint_AddMacro_16px.png\"), Icon16x16)\n\t);\n\n\tStyleSet->Set(\n\t\tPROPERTY_BuildIcon,\n\t\tnew FSlateImageBrush(GetEngineContentPath(\"Icons/icon_build_40x.png\"), Icon40x40)\n\t);\n\tStyleSet->Set(\n\t\tGetSmallProperty(PROPERTY_BuildIcon),\n\t\tnew FSlateImageBrush(GetEngineContentPath(\"Icons/icon_build_40x.png\"), Icon20x20)\n\t);\n\n\tStyleSet->Set(\n\t\t\"SOrbEditor.CopyActorsToClipboard\",\n\t\tnew FSlateImageBrush(GetEngineContentPath(\"Icons/Edit/icon_Edit_Copy_40x.png\"), Icon40x40)\n\t);\n\tStyleSet->Set(\n\t\t\"SOrbEditor.CopyActorsToClipboard.Small\",\n\t\tnew FSlateImageBrush(GetEngineContentPath(\"Icons/Edit/icon_Edit_Copy_40x.png\"), Icon20x20)\n\t);\n\n\t// Level Editor Save All\n\tStyleSet->Set(\n\t\t\"SOrbEditor.SaveAllItems\",\n\t\tnew FSlateImageBrush(GetEngineContentPath(\"Icons/icon_file_saveall_40x.png\"), Icon40x40)\n\t);\n\tStyleSet->Set(\n\t\t\"SOrbEditor.SaveAllEffectInstances\",\n\t\tnew FSlateImageBrush(GetEngineContentPath(\"Icons/icon_file_saveall_40x.png\"), Icon40x40)\n\t);\n\tStyleSet->Set(\n\t\t\"SOrbEditor.SaveAllCharacterStrikes\",\n\t\tnew FSlateImageBrush(GetEngineContentPath(\"Icons/icon_file_saveall_40x.png\"), Icon40x40)\n\t);\n\n\t// Local\n\t// const FString ProjectContentDir = FPaths::ProjectContentDir();\n\t// StyleSet->Set(\"Name\", new FSlateImageBrush(ProjectContentDir / \"image.png\", Icon40x40));\n\n\tFSlateStyleRegistry::RegisterSlateStyle(*StyleSet.Get());\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSoEditorStyle::Shutdown()\n{\n\tif (StyleSet.IsValid())\n\t{\n\t\tFSlateStyleRegistry::UnRegisterSlateStyle(*StyleSet.Get());\n\t\tensure(StyleSet.IsUnique());\n\t\tStyleSet.Reset();\n\t}\n}\n"
  },
  {
    "path": "Source/SOrbEditor/Private/SoEditorStyle.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#pragma once\n#include \"Templates/SharedPointer.h\"\n#include \"Styling/ISlateStyle.h\"\n#include \"Styling/SlateStyle.h\"\n\nclass FSoEditorStyle\n{\npublic:\n\tstatic void Initialize();\n\tstatic void Shutdown();\n\n\t// Get singleton\n\tstatic TSharedPtr<ISlateStyle> Get() { return StyleSet; }\n\n\t// Editor style name\n\tstatic FName GetStyleSetName() { return TEXT(\"SOrbEditorStyle\"); }\n\n\t/** Gets the small property name variant */\n\tstatic FName GetSmallProperty(const FName& PropertyName)\n\t{\n\t\treturn FName(*(PropertyName.ToString() + TEXT(\".Small\")));\n\t}\n\n\t/** Get the RelativePath to the Engine Content Dir */\n\tstatic FString GetEngineContentPath(const FString& RelativePath)\n\t{\n\t\treturn EngineContentRoot / RelativePath;\n\t}\n\npublic:\n\tstatic const FName PROPERTY_BuildIcon;\n\nprivate:\n\tstatic TSharedPtr<FSlateStyleSet> StyleSet;\n\n\t/** Engine content root. */\n\tstatic FString EngineContentRoot;\n};\n"
  },
  {
    "path": "Source/SOrbEditor/Private/SoEditorUtilities.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#include \"SoEditorUtilities.h\"\n\n#include \"SOrbEditorModule.h\"\n#include \"Editor.h\"\n#include \"Kismet2/SClassPickerDialog.h\"\n#include \"AssetToolsModule.h\"\n#include \"EditorLevelUtils.h\"\n#include \"FileHelpers.h\"\n#include \"EngineUtils.h\"\n#include \"Framework/Notifications/NotificationManager.h\"\n#include \"Widgets/Notifications/SNotificationList.h\"\n#include \"Engine/LevelStreaming.h\"\n#include \"AssetRegistryModule.h\"\n#include \"Logging/MessageLog.h\"\n#include \"Misc/FeedbackContext.h\"\n#include \"Editor/UnrealEdEngine.h\"\n#include \"UnrealEdGlobals.h\"\n#include \"EditorBuildUtils.h\"\n#include \"Engine/World.h\"\n#include \"HierarchicalLOD.h\"\n#include \"Engine/ObjectLibrary.h\"\n\n#include \"Objects/SoSky.h\"\n#include \"SoEngineFileHelpers.h\"\n#include \"Items/ItemTemplates/SoItemTemplate.h\"\n#include \"Effects/SoEffectBase.h\"\n#include \"Character/SoCharacterStrike.h\"\n\n\nDEFINE_LOG_CATEGORY_STATIC(LogSoEditorUtilities, All, All);\n\nextern FSwarmDebugOptions GSwarmDebugOptions;\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool FSoEditorUtilities::PickChildrenOfClass(const FText& TitleText, UClass*& OutChosenClass, UClass* Class)\n{\n\t// Create filter\n\tTSharedPtr<FSoChildrenOfClassFilterViewer> Filter = MakeShareable(new FSoChildrenOfClassFilterViewer);\n\tFilter->AllowedChildrenOfClasses.Add(Class);\n\n\t// Fill in options\n\tFClassViewerInitializationOptions Options;\n\tOptions.Mode = EClassViewerMode::ClassPicker;\n\tOptions.DisplayMode = EClassViewerDisplayMode::DefaultView;\n\tOptions.ClassFilter = Filter;\n\t//Options.bShowDisplayNames = true;\n\n\treturn SClassPickerDialog::PickClass(TitleText, Options, OutChosenClass, Class);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nTSharedPtr<IAssetTypeActions> FSoEditorUtilities::GetAssetTypeActionsForClass(UClass* Class)\n{\n\tcheck(Class);\n\tFAssetToolsModule& AssetToolsModule = FModuleManager::LoadModuleChecked<FAssetToolsModule>(\"AssetTools\");\n\tTSharedPtr<IAssetTypeActions> AssetTypeActions = AssetToolsModule.Get().GetAssetTypeActionsForClass(Class).Pin();\n\tcheck(AssetTypeActions.IsValid());\n\treturn AssetTypeActions;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSoEditorUtilities::EditorBuildAll(UWorld* InWorld)\n{\n\t//InWorld->AddToRoot();\n\t//if (!InWorld->bIsWorldInitialized)\n\t//{\n\t//\tUWorld::InitializationValues IVS;\n\t//\tIVS.RequiresHitProxies(false);\n\t//\tIVS.ShouldSimulatePhysics(false);\n\t//\tIVS.EnableTraceCollision(false);\n\t//\tIVS.CreateNavigation(false);\n\t//\tIVS.CreateAISystem(false);\n\t//\tIVS.AllowAudioPlayback(false);\n\t//\tIVS.CreatePhysicsScene(false);\n\t//\tInWorld->InitWorld(IVS);\n\t//\tInWorld->PersistentLevel->UpdateModelComponents();\n\t//\tInWorld->UpdateWorldComponents(true, false);\n\t//}\n\n\t//\n\t//TArray<FString> SubPackages;\n\t//// force load all of the map to be loaded so we can get good rebuilt lighting\n\t//if (InWorld->WorldComposition)\n\t//{\n\t//\tInWorld->WorldComposition->CollectTilesToCook(SubPackages);\n\t//}\n\t//for (const auto& SubPackage : SubPackages)\n\t//{\n\t//\tUPackage* Package = LoadPackage(nullptr, *SubPackage, 0);\n\t//\tcheck(Package->IsFullyLoaded());\n\t//}\n\t//InWorld->RemoveFromRoot();\n\n\t// NOTE: this follows the FBuildOptions::BuildAll path\n\n\t// BuildGeometry\n\t//GUnrealEd->Exec(InWorld, TEXT(\"MAP REBUILD ALLVISIBLE\"));\n\n\t// BuildHierarchicalLOD\n\t// Copied from  FEditorBuildUtils::TriggerHierarchicalLODBuilder\n\t// Invoke HLOD generator, with either preview or full build\n\t// NOTE: takes too much time\n\t// InWorld->HierarchicalLODBuilder->BuildMeshesForLODActors(false);\n\n\t// BuildTextureStreaming\n\tFEditorBuildUtils::EditorBuildTextureStreaming(InWorld);\n\n\t// BuildAIPaths\n\t//FEditorBuildUtils::TriggerNavigationBuilder(InWorld, CurrentBuildId);\n\n\t// Lighting\n\tstatic constexpr bool bAllowLightingDialog = false;\n\tFEditorBuildUtils::EditorBuild(InWorld, FBuildOptions::BuildLighting, bAllowLightingDialog);\n\n\t// NOTE: GEditor->BuildReflectionCaptures is called in light build after finishing\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool FSoEditorUtilities::SaveAllDirtyPackages(const int32 NumAttemptsSave)\n{\n\tUE_LOG(LogSoEditorUtilities, Verbose, TEXT(\"SaveAllDirtyPackages\"));\n\tverify(GWorld->bIsWorldInitialized);\n\tverify(!FSoEditorUtilities::IsAnyLevelInWorldLoading(GWorld));\n\tverify(GWorld->WorldType != EWorldType::Inactive);\n\n\t//constexpr bool bPromptUserToSave = false;\n\tconstexpr bool bSaveMapPackages = true;\n\tconstexpr bool bSaveContentPackages = true;\n\tconstexpr bool bUseDialog = false;\n\t//return FEditorFileUtils::SaveDirtyPackages(bPromptUserToSave, bSaveMapPackages, bSaveContentPackages, bFastSave);\n\n\t// Try the first time\n\tbool bReturnStatus = SoEngineFileHelpers::SaveDirtyPackages(bSaveMapPackages, bSaveContentPackages, bUseDialog);\n\n\t// Retry again\n\tint32 CurrentAttempt = 0;\n\twhile (!bReturnStatus && CurrentAttempt < NumAttemptsSave)\n\t{\n\t\tCurrentAttempt++;\n\t\tUE_LOG(LogSoEditorUtilities, Log, TEXT(\"SaveAllDirtyPackages: Retrying Attempt = %d\"), CurrentAttempt);\n\t\tbReturnStatus = SoEngineFileHelpers::SaveDirtyPackages(bSaveMapPackages, bSaveContentPackages, bUseDialog);\n\t}\n\n\treturn bReturnStatus;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSoEditorUtilities::WaitForLevelsInEditorToLoad()\n{\n\tUWorld* World = GetEditorWorld();\n\tif (World == nullptr)\n\t\treturn;\n\n\tfor (const ULevelStreaming* StreamingLevel : World->GetStreamingLevels())\n\t{\n\t\tif (!IsValid(StreamingLevel))\n\t\t\tcontinue;\n\n\t\twhile (StreamingLevel->IsStreamingStatePending());\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool FSoEditorUtilities::IsAnyLevelInWorldLoading(const UWorld* World)\n{\n\tif (!World)\n\t\treturn false;\n\n\tfor (const ULevelStreaming* StreamingLevel : World->GetStreamingLevels())\n\t{\n\t\tif (!IsValid(StreamingLevel))\n\t\t\tcontinue;\n\n\t\tif (StreamingLevel->IsStreamingStatePending() || World->IsVisibilityRequestPending())\n\t\t\treturn true;\n\t}\n\n\treturn false;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool FSoEditorUtilities::MakeEditorLevelsVisible(const TArray<FName>& LevelNamesToBeVisible, FString& OutErrorMessage, bool bHideLevelsNotInArray)\n{\n\tUWorld* World = GetEditorWorld();\n\tif (World == nullptr)\n\t{\n\t\tOutErrorMessage = TEXT(\"No valid editor world found\");\n\t\treturn false;\n\t}\n\n\tint32 FoundLevelsNum = 0;\n\n\tMarkAllLevelsToBeLoaded();\n\tWaitForLevelsInEditorToLoad();\n\tfor (ULevelStreaming* StreamingLevel : World->GetStreamingLevels())\n\t{\n\t\tif (!IsValid(StreamingLevel))\n\t\t\tcontinue;\n\n\t\t// Use the short package name\n\t\tconst FString LevelName = GetLevelShortName(StreamingLevel);\n\n\t\t// Check if we should make it visible\n\t\tbool bFoundLevel = false;\n\t\tfor (FName FindLevelName : LevelNamesToBeVisible)\n\t\t{\n\t\t\tif (FindLevelName.ToString().Equals(LevelName, ESearchCase::IgnoreCase))\n\t\t\t{\n\t\t\t\tbFoundLevel = true;\n\t\t\t\tFoundLevelsNum++;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tULevel* Level = StreamingLevel->GetLoadedLevel();\n\t\tif (!IsValid(Level)) // Something is gravely wrong :O\n\t\t{\n\t\t\tOutErrorMessage = FString::Printf(TEXT(\"Level is not valid for LevelName = `%s`. But it was loaded, right, right?\"), *LevelName);\n\t\t\treturn false;\n\t\t}\n\n\t\t// Set visibility\n\t\tif (bFoundLevel)\n\t\t\tUEditorLevelUtils::SetLevelVisibility(Level, true, false);\n\t\telse if (bHideLevelsNotInArray)\n\t\t\tUEditorLevelUtils::SetLevelVisibility(Level, false, false);\n\t}\n\tWaitForLevelsInEditorToLoad();\n\n\t// Did not find all levels :(\n\tif (LevelNamesToBeVisible.Num() != FoundLevelsNum)\n\t{\n\t\tOutErrorMessage = FString::Printf(TEXT(\"Could not find all levels. Found only %d out of %d levels\"), FoundLevelsNum, LevelNamesToBeVisible.Num());\n\t\treturn false;\n\t}\n\n\treturn true;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool FSoEditorUtilities::MakeAllEditorLevelsVisible(FString& OutErrorMessage)\n{\n\tUWorld* World = GetEditorWorld();\n\tif (World == nullptr)\n\t{\n\t\tOutErrorMessage = TEXT(\"No valid editor world found\");\n\t\treturn false;\n\t}\n\n\tint32 FoundLevelsNum = 0;\n\n\tMarkAllLevelsToBeLoaded();\n\tWaitForLevelsInEditorToLoad();\n\tfor (ULevelStreaming* StreamingLevel : World->GetStreamingLevels())\n\t{\n\t\tif (!IsValid(StreamingLevel))\n\t\t\tcontinue;\n\n\t\tULevel* Level = StreamingLevel->GetLoadedLevel();\n\t\tif (!IsValid(Level)) // Something is gravely wrong :O\n\t\t{\n\t\t\tconst FString LevelName = GetLevelShortName(StreamingLevel);\n\t\t\tOutErrorMessage = FString::Printf(TEXT(\"Level is not valid for LevelName = `%s`. But it was loaded, right, right?\"), *LevelName);\n\t\t\treturn false;\n\t\t}\n\n\t\t// Set visibility\n\t\tUEditorLevelUtils::SetLevelVisibility(Level, true, false);\n\t}\n\tWaitForLevelsInEditorToLoad();\n\treturn true;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSoEditorUtilities::MarkAllLevelsToBeLoaded()\n{\n\tUWorld* World = GetEditorWorld();\n\tif (World == nullptr)\n\t\treturn;\n\n\t// Load all streaming levels\n\tfor (ULevelStreaming* StreamingLevel : World->GetStreamingLevels())\n\t{\n\t\tif (!IsValid(StreamingLevel))\n\t\t\tcontinue;\n\n\t\tStreamingLevel->SetShouldBeLoaded(true);\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUWorld* FSoEditorUtilities::GetEditorWorld()\n{\n\tif (!GEditor)\n\t\treturn nullptr;\n\n\treturn GEditor->GetEditorWorldContext(true).World();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nbool FSoEditorUtilities::GetEditorSoSky(ASoSky*& OutSky, FString& OutErrorMessage)\n{\n\tOutSky = nullptr;\n\tUWorld* World = GetEditorWorld();\n\tif (World == nullptr)\n\t{\n\t\tOutErrorMessage = TEXT(\"No valid editor world found\");\n\t\treturn false;\n\t}\n\n\t// Collect skies\n\tTArray<ASoSky*> FoundSkies;\n\tfor (TActorIterator<ASoSky> It(World, ASoSky::StaticClass()); It; ++It)\n\t{\n\t\tASoSky* FoundSky = *It;\n\t\tif (IsValid(FoundSky))\n\t\t{\n\t\t\tFoundSkies.Add(FoundSky);\n\t\t}\n\t}\n\n\t// No skies\n\tif (FoundSkies.Num() == 0)\n\t{\n\t\tOutErrorMessage = TEXT(\"No SoSky found in the editor world. Are you sure there is a sky?\");\n\t\treturn false;\n\t}\n\n\t// More than one sky\n\tif (FoundSkies.Num() > 1)\n\t{\n\t\tOutErrorMessage = FString::Printf(TEXT(\"More Than one SoSky was found in the world. There are `%d` skies :( \"), FoundSkies.Num());\n\t\treturn false;\n\t}\n\n\tOutSky = FoundSkies[0];\n\tif (!IsValid(OutSky))\n\t{\n\t\tOutSky = nullptr;\n\t\tOutErrorMessage = TEXT(\"The found sky is no longer valid. what?\");\n\t\treturn false;\n\t}\n\n\treturn true;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSoEditorUtilities::AddNotificationError(const FString& ErrorMessage)\n{\n\tUE_LOG(LogSoEditor, Error, TEXT(\"%s\"), *ErrorMessage);\n\n\tFNotificationInfo Notification(FText::FromString(ErrorMessage));\n\tNotification.ExpireDuration = 20.0f;\n\tNotification.bUseSuccessFailIcons = true;\n\tNotification.bFireAndForget = false;\n\tNotification.Image = FCoreStyle::Get().GetBrush(TEXT(\"MessageLog.Warning\"));\n\n\tauto NotificationItem = FSlateNotificationManager::Get().AddNotification(Notification);\n\tNotificationItem->SetCompletionState(SNotificationItem::CS_Fail);\n\tNotificationItem->ExpireAndFadeout();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFString FSoEditorUtilities::GetLevelShortName(const ULevelStreaming* StreamingLevel)\n{\n\tif (!StreamingLevel)\n\t\treturn FString();\n\n\treturn FPackageName::GetShortName(StreamingLevel->GetWorldAssetPackageFName());\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFString FSoEditorUtilities::GetLevelShortName(const ULevel* Level)\n{\n\tif (!Level)\n\t\treturn FString();\n\n\tif (const UPackage* Package = Level->GetOutermost())\n\t\treturn FPackageName::GetShortName(Package->GetName());\n\n\treturn FString();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFString FSoEditorUtilities::GetLongPackageNameFromObject(const UObject* Object)\n{\n\tif (!Object)\n\t\treturn FString();\n\n\tif (const UPackage* Package = Object->GetOutermost())\n\t\treturn Package->GetName();\n\n\treturn FString();\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nTArray<USoItemTemplate*> FSoEditorUtilities::GetAllItemsFromMemory()\n{\n\tTArray<USoItemTemplate*> Array;\n\tfor (TObjectIterator<USoItemTemplate> Itr; Itr; ++Itr)\n\t{\n\t\tUSoItemTemplate* Item = *Itr;\n\t\tif (IsValid(Item))\n\t\t{\n\t\t\tArray.Add(Item);\n\t\t}\n\t}\n\treturn Array;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nint32 FSoEditorUtilities::LoadAllItemsIntoMemory()\n{\n\t// NOTE: All paths must NOT have the forward slash \"/\" at the end.\n\t// If they do, then this won't load Dialogues that are located in the Content root directory\n\tUObjectLibrary* ObjectLibrary = UObjectLibrary::CreateLibrary(USoItemTemplate::StaticClass(), true, GIsEditor);\n\tTArray<FString> PathsToSearch = { TEXT(\"/Game\") };\n\n\tObjectLibrary->AddToRoot();\n\tObjectLibrary->LoadAssetDataFromPaths(PathsToSearch);\n\tconst int32 Count = ObjectLibrary->LoadAssetsFromAssetData();\n\tObjectLibrary->RemoveFromRoot();\n\n\treturn Count;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nTArray<USoCharacterStrike*> FSoEditorUtilities::GetAllCharacterStrikesFromMemory()\n{\n\tTArray<USoCharacterStrike*> Array;\n\tfor (TObjectIterator<USoCharacterStrike> Itr; Itr; ++Itr)\n\t{\n\t\tUSoCharacterStrike* CharStrike = *Itr;\n\t\tif (IsValid(CharStrike))\n\t\t{\n\t\t\tArray.Add(CharStrike);\n\t\t}\n\t}\n\treturn Array;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nint32 FSoEditorUtilities::LoadAllCharacterStrikesIntoMemory()\n{\n\t// NOTE: All paths must NOT have the forward slash \"/\" at the end.\n\t// If they do, then this won't load Dialogues that are located in the Content root directory\n\tUObjectLibrary* ObjectLibrary = UObjectLibrary::CreateLibrary(USoCharacterStrike::StaticClass(), true, GIsEditor);\n\tTArray<FString> PathsToSearch = { TEXT(\"/Game\") };\n\n\tObjectLibrary->AddToRoot();\n\tObjectLibrary->LoadAssetDataFromPaths(PathsToSearch);\n\tconst int32 Count = ObjectLibrary->LoadAssetsFromAssetData();\n\tObjectLibrary->RemoveFromRoot();\n\n\treturn Count;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nTArray<UObject*> FSoEditorUtilities::GetAllEffectInstances()\n{\n\tTArray<UObject*> Array;\n\n\t// Search in blueprints\n\tconst IAssetRegistry& AssetRegistry = FModuleManager::LoadModuleChecked<FAssetRegistryModule>(\"AssetRegistry\").Get();\n\tTArray<FAssetData> BlueprintsAssetsData;\n\tif (AssetRegistry.GetAssetsByClass(UBlueprint::StaticClass()->GetFName(), BlueprintsAssetsData, true))\n\t{\n\t\tfor (const FAssetData& AssetData : BlueprintsAssetsData)\n\t\t{\n\t\t\tUObject* Object = AssetData.GetAsset();\n\t\t\tif (const UBlueprint* Blueprint = Cast<UBlueprint>(Object))\n\t\t\t{\n\t\t\t\tif (Blueprint->GeneratedClass->IsChildOf(USoEffectBase::StaticClass()))\n\t\t\t\t{\n\t\t\t\t\tArray.Add(Object);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// NOTE: this won't work for Blueprints that the parent our class, because the blueprint aren't loaded into memory\n\tfor (TObjectIterator<USoEffectBase> Itr; Itr; ++Itr)\n\t{\n\t\tif (Itr->GetClass()->HasAnyClassFlags(EClassFlags::CLASS_Abstract))\n\t\t\tcontinue;\n\n\t\tUSoEffectBase* Effect = *Itr;\n\t\tif (IsValid(Effect))\n\t\t{\n\t\t\tArray.Add(Effect);\n\t\t}\n\t}\n\treturn Array;\n}\n"
  },
  {
    "path": "Source/SOrbEditor/Private/SoEditorUtilitiesTypes.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#include \"SoEditorUtilitiesTypes.h\"\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFString FSoEditorChapterBuildPresetLevels::ToString(const bool bWithSky) const\n{\n\tFString Sky;\n\tif (bWithSky)\n\t{\n\t\tSky = FString::Printf(TEXT(\", SkyPreset = %s\"), *SkyPreset.ToString());\n\t}\n\n\tFString LevelsString;\n\tconst int32 NumLevels = Levels.Num();\n\tfor (int32 LevelIndex = 0; LevelIndex < NumLevels; LevelIndex++)\n\t{\n\t\tLevelsString += Levels[LevelIndex].ToString();\n\t\tif (LevelIndex != NumLevels - 1)\n\t\t{\n\t\t\tLevelsString += TEXT(\", \");\n\t\t}\n\t}\n\n\treturn FString::Printf(TEXT(\"Levels = {%s}%s\"), *LevelsString, *Sky);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFString FSoEditorChapterBuildPreset::ToString(const FString Prefix, const FString PrefixArray) const\n{\n\tFString LevelsString;\n\tconst int32 NumLevels = LevelPresets.Num();\n\tfor (int32 LevelIndex = 0; LevelIndex < NumLevels; LevelIndex++)\n\t{\n\t\tLevelsString += FString::Printf(TEXT(\"%s%s%d. %s\"), *Prefix, *PrefixArray, LevelIndex, *LevelPresets[LevelIndex].ToString());\n\t\tif (LevelIndex != NumLevels - 1)\n\t\t{\n\t\t\tLevelsString += TEXT(\"\\n\");\n\t\t}\n\t}\n\n\treturn FString::Printf(TEXT(\"%sChapterPackageName = %s\\n%sLevelPresets:\\n%s\"), *Prefix, *ChapterPackageName.ToString(), *Prefix, *LevelsString);\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFString FSoEditorEpisodeBuildPreset::ToString() const\n{\n\treturn FString::Printf(TEXT(\"EpisodePackageName = %s\"), *EpisodePackageName.ToString());\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFString FSoEditorBuildPresets::ToString(const FString PrefixArray) const\n{\n\treturn FString::Printf(TEXT(\"%s\\n\\n%s \"), *ToStringEpisodes(PrefixArray), *ToStringChapters(PrefixArray));\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFString FSoEditorBuildPresets::ToStringEpisodes(const FString PrefixArray) const\n{\n\tFString EpisodeString;\n\tconst int32 NumEpisodes = EpisodePresets.Num();\n\tfor (int32 Index = 0; Index < NumEpisodes; Index++)\n\t{\n\t\tEpisodeString += FString::Printf(TEXT(\"%s%s\"), *PrefixArray, *EpisodePresets[Index].ToString());\n\t\tif (Index != NumEpisodes - 1)\n\t\t{\n\t\t\tEpisodeString += TEXT(\"\\n\");\n\t\t}\n\t}\n\n\treturn FString::Printf(TEXT(\"EpisodePresets:\\n%s\"), *EpisodeString);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nFString FSoEditorBuildPresets::ToStringChapters(const FString PrefixArray) const\n{\n\tFString ChaptersString;\n\tconst int32 NumChapters = ChapterPresets.Num();\n\tfor (int32 ChapterIndex = 0; ChapterIndex < NumChapters; ChapterIndex++)\n\t{\n\t\tChaptersString += FString::Printf(TEXT(\"%s\"), *ChapterPresets[ChapterIndex].ToString(PrefixArray, TEXT(\"\\t\")));\n\t\tif (ChapterIndex != NumChapters - 1)\n\t\t{\n\t\t\tChaptersString += TEXT(\"\\n\\n\");\n\t\t}\n\t}\n\n\treturn FString::Printf(TEXT(\"ChapterPresets:\\n%s \"), *ChaptersString);\n}\n"
  },
  {
    "path": "Source/SOrbEditor/Private/SoEngineFileHelpers.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#pragma once\n#include \"CoreMinimal.h\"\n#include \"FileHelpers.h\"\n#include \"Widgets/Notifications/SNotificationList.h\"\n#include \"Framework/Notifications/NotificationManager.h\"\n#include \"Misc/MessageDialog.h\"\n#include \"EditorStyleSet.h\"\n#include \"Logging/TokenizedMessage.h\"\n#include \"CoreGlobals.h\"\n#include \"HAL/FileManager.h\"\n\n#include \"SOrbEditorModule.h\"\n#include \"Engine/World.h\"\n#include \"Engine/Engine.h\"\n#include \"ISourceControlModule.h\"\n#include \"Misc/FileHelper.h\"\n#include \"EditorDirectories.h\"\n#include \"IContentBrowserSingleton.h\"\n#include \"ContentBrowserModule.h\"\n#include \"Editor.h\"\n#include \"BusyCursor.h\"\n#include \"Misc/RedirectCollector.h\"\n#include \"Misc/ScopedSlowTask.h\"\n#include \"ObjectTools.h\"\n#include \"EditorModes.h\"\n#include \"Engine/MapBuildDataRegistry.h\"\n#include \"PackageTools.h\"\n#include \"EditorModeManager.h\"\n\nnamespace SoEngineFileHelpers\n{\n#define LOCTEXT_NAMESPACE \"WarriorbEditorEngineFileHelpers\"\n\n\n\t////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\t//\n\t// Copied from FileHelpers.cpp\n\t// Simulates FEditorFileUtils::SaveDirtyPackages\n\t//\n\t//\n\t////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\tenum class InternalSavePackageResult : int8\n\t{\n\t\tSuccess,\n\t\tCancel,\n\t\tContinue,\n\t\tError,\n\t};\n\n\t/** A special output device that puts save output in the message log when flushed */\n\tclass FSaveErrorOutputDevice : public FOutputDevice\n\t{\n\tpublic:\n\t\tvirtual void Serialize(const TCHAR* InData, ELogVerbosity::Type Verbosity, const FName& Category) override\n\t\t{\n\t\t\tif (Verbosity == ELogVerbosity::Error || Verbosity == ELogVerbosity::Warning)\n\t\t\t{\n\t\t\t\tEMessageSeverity::Type Severity;\n\t\t\t\tif (Verbosity == ELogVerbosity::Error)\n\t\t\t\t{\n\t\t\t\t\tSeverity = EMessageSeverity::Error;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tSeverity = EMessageSeverity::Warning;\n\t\t\t\t}\n\t\t\t\tErrorMessages.Add(FTokenizedMessage::Create(Severity, FText::FromName(InData)));\n\t\t\t}\n\t\t}\n\n\t\tvirtual void Flush() override\n\t\t{\n\t\t\tif (ErrorMessages.Num() > 0)\n\t\t\t{\n\t\t\t\tFMessageLog EditorErrors(\"EditorErrors\");\n\t\t\t\tEditorErrors.NewPage(LOCTEXT(\"SaveOutputPageLabel\", \"Save Output\"));\n\t\t\t\tEditorErrors.AddMessages(ErrorMessages);\n\t\t\t\tEditorErrors.Open();\n\t\t\t\tErrorMessages.Empty();\n\t\t\t}\n\t\t}\n\n\tprivate:\n\t\t// Holds the errors for the message log.\n\t\tTArray< TSharedRef< FTokenizedMessage > > ErrorMessages;\n\t};\n\n\tstatic TArray<UPackage*> InternalGetDirtyPackages(const bool bSaveMapPackages, const bool bSaveContentPackages)\n\t{\n\t\tif (bSaveContentPackages)\n\t\t{\n\t\t\tCollectGarbage(GARBAGE_COLLECTION_KEEPFLAGS);\n\t\t}\n\n\t\t// A list of all packages that need to be saved\n\t\tTArray<UPackage*> PackagesToSave;\n\n\t\tif (bSaveMapPackages)\n\t\t{\n\t\t\tFEditorFileUtils::GetDirtyWorldPackages(PackagesToSave);\n\t\t}\n\n\t\t// Don't iterate through content packages if we don't plan on saving them\n\t\tif (bSaveContentPackages)\n\t\t{\n\t\t\tFEditorFileUtils::GetDirtyContentPackages(PackagesToSave);\n\t\t}\n\n\t\treturn PackagesToSave;\n\t}\n\n\tstatic void InternalNotifyNoPackagesSaved(const bool bUseDialog)\n\t{\n\t\tUE_LOG(LogSoEditor, Warning, TEXT(\"%s\"), *LOCTEXT(\"NoAssetsToSave\", \"No new changes to save!\").ToString());\n\t\tif (bUseDialog)\n\t\t{\n\t\t\tFNotificationInfo NotificationInfo(LOCTEXT(\"NoAssetsToSave\", \"No new changes to save!\"));\n\t\t\tNotificationInfo.Image = FEditorStyle::GetBrush(FTokenizedMessage::GetSeverityIconName(EMessageSeverity::Info));\n\t\t\tNotificationInfo.bFireAndForget = true;\n\t\t\tNotificationInfo.ExpireDuration = 4.0f; // Need this message to last a little longer than normal since the user may have expected there to be modified files.\n\t\t\tNotificationInfo.bUseThrobber = true;\n\t\t\tFSlateNotificationManager::Get().AddNotification(NotificationInfo);\n\t\t}\n\t}\n\n\tstatic void InternalWarnUserAboutFailedSave(const TArray<UPackage*>& InFailedPackages, bool bUseDialog)\n\t{\n\t\t// Warn the user if any packages failed to save\n\t\tif (InFailedPackages.Num() > 0)\n\t\t{\n\t\t\tFString FailedPackages;\n\t\t\tfor (TArray<UPackage*>::TConstIterator FailedIter(InFailedPackages); FailedIter; ++FailedIter)\n\t\t\t{\n\t\t\t\tFailedPackages += FString::Printf(TEXT(\"\\n%s\"), *((*FailedIter)->GetName()));\n\t\t\t}\n\n\t\t\tFFormatNamedArguments Arguments;\n\t\t\tArguments.Add(TEXT(\"Packages\"), FText::FromString(FailedPackages));\n\t\t\tconst FText MessageFormatting = NSLOCTEXT(\"FileHelper\", \"FailedSavePromptMessageFormatting\", \"The following assets failed to save correctly:{Packages}\");\n\t\t\tconst FText Message = FText::Format(MessageFormatting, Arguments);\n\n\t\t\t// Display warning\n\t\t\tUE_LOG(LogSoEditor, Error, TEXT(\"%s\"), *Message.ToString());\n\t\t\tif (bUseDialog)\n\t\t\t{\n\t\t\t\tFText Title = NSLOCTEXT(\"FileHelper\", \"FailedSavePrompt_Title\", \"Packages Failed To Save\");\n\t\t\t\tFMessageDialog::Open(EAppMsgType::Ok, Message, &Title);\n\t\t\t}\n\t\t}\n\t}\n\n\tstatic FString GetDefaultDirectory()\n\t{\n\t\treturn FEditorDirectories::Get().GetLastDirectory(ELastDirectory::UNR);\n\t}\n\n\tstatic FString GetAutoSaveDir()\n\t{\n\t\treturn FPaths::ProjectSavedDir() / TEXT(\"Autosaves\");\n\t}\n\n\n\tstatic bool OpenSaveAsDialog(UClass* SavedClass, const FString& InDefaultPath, const FString& InNewNameSuggestion, FString& OutPackageName)\n\t{\n\t\tFString DefaultPath = InDefaultPath;\n\n\t\tif (DefaultPath.IsEmpty())\n\t\t{\n\t\t\tDefaultPath = TEXT(\"/Game/Maps\");\n\t\t}\n\n\t\tconst FString NewNameSuggestion = InNewNameSuggestion;\n\t\tcheck(!NewNameSuggestion.IsEmpty());\n\n\t\tFSaveAssetDialogConfig SaveAssetDialogConfig;\n\t\t{\n\t\t\tSaveAssetDialogConfig.DefaultPath = DefaultPath;\n\t\t\tSaveAssetDialogConfig.DefaultAssetName = NewNameSuggestion;\n\t\t\tSaveAssetDialogConfig.AssetClassNames.Add(SavedClass->GetFName());\n\t\t\tSaveAssetDialogConfig.ExistingAssetPolicy = ESaveAssetDialogExistingAssetPolicy::AllowButWarn;\n\t\t\tSaveAssetDialogConfig.DialogTitleOverride = (SavedClass == UWorld::StaticClass())\n\t\t\t\t? LOCTEXT(\"SaveLevelDialogTitle\", \"Save Level As\")\n\t\t\t\t: LOCTEXT(\"SaveAssetDialogTitle\", \"Save Asset As\");\n\t\t}\n\n\t\tFContentBrowserModule& ContentBrowserModule = FModuleManager::LoadModuleChecked<FContentBrowserModule>(\"ContentBrowser\");\n\t\tconst FString SaveObjectPath = ContentBrowserModule.Get().CreateModalSaveAssetDialog(SaveAssetDialogConfig);\n\n\t\tif (!SaveObjectPath.IsEmpty())\n\t\t{\n\t\t\tOutPackageName = FPackageName::ObjectPathToPackageName(SaveObjectPath);\n\t\t\treturn true;\n\t\t}\n\n\t\treturn false;\n\t}\n\n\t/**\n\t * Queries the user if they want to quit out of interpolation editing before save.\n\t *\n\t * @return\t\ttrue if in interpolation editing mode, false otherwise.\n\t */\n\tstatic bool InInterpEditMode()\n\t{\n\t\t// Must exit Interpolation Editing mode before you can save - so it can reset everything to its initial state.\n\t\tif (GLevelEditorModeTools().IsModeActive(FBuiltinEditorModes::EM_InterpEdit))\n\t\t{\n\t\t\tconst bool ExitInterp = EAppReturnType::Yes == FMessageDialog::Open(EAppMsgType::YesNo, EAppReturnType::Yes, NSLOCTEXT(\"UnrealEd\", \"Prompt_21\", \"You must close Matinee before saving level.\\nDo you wish to do this now and continue?\"));\n\t\t\tif (!ExitInterp)\n\t\t\t{\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\tGLevelEditorModeTools().DeactivateMode(FBuiltinEditorModes::EM_InterpEdit);\n\t\t}\n\t\treturn false;\n\t}\n\n\t/**\n\t * @param\tWorld\t\t\t\t\tThe world to save.\n\t * @param\tForceFilename\t\t\tIf non-NULL, save the level package to this name (full path+filename).\n\t * @param\tOverridePath\t\t\tIf non-NULL, override the level path with this path.\n\t * @param\tFilenamePrefix\t\t\tIf non-NULL, prepend this string the the level filename.\n\t * @param\tbRenamePackageToFile\tIf true, rename the level package to the filename if save was successful.\n\t * @param\tbCheckDirty\t\t\t\tIf true, don't save the level if it is not dirty.\n\t * @param\tFinalFilename\t\t\t[out] The full path+filename the level was saved to.\n\t * @param\tbAutosaving\t\t\t\tShould be set to true if autosaving; passed to UWorld::SaveWorld.\n\t * @param\tbPIESaving\t\t\t\tShould be set to true if saving for PIE; passed to UWorld::SaveWorld.\n\t * @return\t\t\t\t\t\t\ttrue if the level was saved.\n\t */\n\tstatic bool InternalSaveWorld(UWorld* World,\n\t\tconst FString* ForceFilename,\n\t\tconst TCHAR* OverridePath,\n\t\tconst TCHAR* FilenamePrefix,\n\t\tbool bRenamePackageToFile,\n\t\tbool bCheckDirty,\n\t\tFString& FinalFilename,\n\t\tbool bAutosaving,\n\t\tbool bPIESaving)\n\t{\n\t\t// SaveWorld not reentrant - check that we are not already in the process of saving here (for example, via autosave)\n\t\tstatic bool bIsReentrant = false;\n\t\tif (bIsReentrant)\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\tTGuardValue<bool> ReentrantGuard(bIsReentrant, true);\n\n\t\tif (!World)\n\t\t{\n\t\t\tFinalFilename = LOCTEXT(\"FilenameUnavailable\", \"Filename Not available!\").ToString();\n\t\t\treturn false;\n\t\t}\n\n\t\tUPackage* Package = Cast<UPackage>(World->GetOuter());\n\t\tif (!Package)\n\t\t{\n\t\t\tFinalFilename = LOCTEXT(\"FilenameUnavailableInvalidOuter\", \"Filename Not available. Outer package invalid!\").ToString();\n\t\t\treturn false;\n\t\t}\n\n\t\t// Don't save if the world doesn't need saving.\n\t\tif (bCheckDirty && !Package->IsDirty())\n\t\t{\n\t\t\tFinalFilename = LOCTEXT(\"FilenameUnavailableNotDirty\", \"Filename Not available. Package not dirty.\").ToString();\n\t\t\treturn false;\n\t\t}\n\n\t\tFString PackageName = Package->GetName();\n\n\t\tFString\tExistingFilename;\n\t\tFString\t\tPath;\n\t\tFString\tCleanFilename;\n\n\t\t// Does a filename already exist for this package?\n\t\tconst bool bPackageExists = FPackageName::DoesPackageExist(PackageName, NULL, &ExistingFilename);\n\n\t\tif (ForceFilename)\n\t\t{\n\t\t\tPath = FPaths::GetPath(*ForceFilename);\n\t\t\tCleanFilename = FPaths::GetCleanFilename(*ForceFilename);\n\t\t}\n\t\telse if (bPackageExists)\n\t\t{\n\t\t\tif (bPIESaving && FCString::Stristr(*ExistingFilename, *FPackageName::GetMapPackageExtension()) == NULL)\n\t\t\t{\n\t\t\t\t// If package exists, but doesn't feature the default extension, it will not load when launched,\n\t\t\t\t// Change the extension of the map to the default for the auto-save\n\t\t\t\tPath = GetAutoSaveDir();\n\t\t\t\tCleanFilename = FPackageName::GetLongPackageAssetName(PackageName) + FPackageName::GetMapPackageExtension();\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t// We're not forcing a filename, so go with the filename that exists.\n\t\t\t\tPath = FPaths::GetPath(ExistingFilename);\n\t\t\t\tCleanFilename = FPaths::GetCleanFilename(ExistingFilename);\n\t\t\t}\n\t\t}\n\t\telse if (!bAutosaving && FPackageName::IsValidLongPackageName(PackageName, false))\n\t\t{\n\t\t\t// If the package is made with a path in a non-read-only root, save it there\n\t\t\tconst FString ImplicitFilename = FPackageName::LongPackageNameToFilename(PackageName, FPackageName::GetMapPackageExtension());\n\t\t\tPath = FPaths::GetPath(ImplicitFilename);\n\t\t\tCleanFilename = FPaths::GetCleanFilename(ImplicitFilename);\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// No package filename exists and none was specified, so save the package in the autosaves folder.\n\t\t\tPath = GetAutoSaveDir();\n\t\t\tCleanFilename = FPackageName::GetLongPackageAssetName(PackageName) + FPackageName::GetMapPackageExtension();\n\t\t}\n\n\t\t// Optionally override path.\n\t\tif (OverridePath)\n\t\t{\n\t\t\tFinalFilename = FString(OverridePath) + TEXT(\"/\");\n\t\t}\n\t\telse\n\t\t{\n\t\t\tFinalFilename = Path + TEXT(\"/\");\n\t\t}\n\n\t\t// Apply optional filename prefix.\n\t\tif (FilenamePrefix)\n\t\t{\n\t\t\tFinalFilename += FString(FilenamePrefix);\n\t\t}\n\n\t\t// Munge remaining clean filename minus path + extension with path and optional prefix.\n\t\tFinalFilename += CleanFilename;\n\n\t\t// Prepare the new package name\n\t\tFString NewPackageName;\n\t\tif (!FPackageName::TryConvertFilenameToLongPackageName(FinalFilename, NewPackageName))\n\t\t{\n\t\t\tFMessageDialog::Open(EAppMsgType::Ok, FText::Format(NSLOCTEXT(\"Editor\", \"SaveWorld_BadFilename\", \"Failed to save the map. The filename '{0}' is not within the game or engine content folders found in '{1}'.\"), FText::FromString(FinalFilename), FText::FromString(FPaths::RootDir())));\n\t\t\treturn false;\n\t\t}\n\n\t\t// Before doing any work, check to see if 1) the package name is in use by another object, 2) the world object can be renamed if necessary; and 3) the file is writable.\n\t\tbool bSuccess = false;\n\n\t\tconst FString OriginalWorldName = World->GetName();\n\t\tconst FString OriginalPackageName = Package->GetName();\n\t\tconst FString NewWorldAssetName = FPackageName::GetLongPackageAssetName(NewPackageName);\n\t\tbool bValidWorldName = true;\n\t\tbool bPackageNeedsRename = false;\n\t\tbool bWorldNeedsRename = false;\n\n\t\tif (bRenamePackageToFile)\n\t\t{\n\t\t\t// Rename the world package if needed\n\t\t\tif (Package->GetName() != NewPackageName)\n\t\t\t{\n\t\t\t\tbValidWorldName = Package->Rename(*NewPackageName, NULL, REN_Test);\n\t\t\t\tif (bValidWorldName)\n\t\t\t\t{\n\t\t\t\t\tbPackageNeedsRename = true;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (bValidWorldName)\n\t\t\t{\n\t\t\t\t// Rename the world if the package changed\n\t\t\t\tif (World->GetName() != NewWorldAssetName)\n\t\t\t\t{\n\t\t\t\t\tbValidWorldName = World->Rename(*NewWorldAssetName, NULL, REN_Test);\n\t\t\t\t\tif (bValidWorldName)\n\t\t\t\t\t{\n\t\t\t\t\t\tbWorldNeedsRename = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (!bValidWorldName)\n\t\t{\n\t\t\tFMessageDialog::Open(EAppMsgType::Ok, NSLOCTEXT(\"UnrealEd\", \"Error_LevelNameExists\", \"A level with that name already exists. Please choose another name.\"));\n\t\t}\n\t\telse if (IFileManager::Get().IsReadOnly(*FinalFilename))\n\t\t{\n\t\t\tFMessageDialog::Open(EAppMsgType::Ok, FText::Format(NSLOCTEXT(\"UnrealEd\", \"PackageFileIsReadOnly\", \"Unable to save package to {0} because the file is read-only!\"), FText::FromString(FinalFilename)));\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// Save the world package after doing optional garbage collection.\n\t\t\tconst FScopedBusyCursor BusyCursor;\n\n\t\t\tFFormatNamedArguments Args;\n\t\t\tArgs.Add(TEXT(\"MapFilename\"), FText::FromString(FPaths::GetCleanFilename(FinalFilename)));\n\n\t\t\tFScopedSlowTask SlowTask(100, FText::Format(NSLOCTEXT(\"UnrealEd\", \"SavingMap_F\", \"Saving map: {MapFilename}...\"), Args));\n\t\t\tSlowTask.MakeDialog(true);\n\n\t\t\tSlowTask.EnterProgressFrame(25);\n\n\t\t\tFSoftObjectPath OldPath(World);\n\t\t\tbool bAddedAssetPathRedirection = false;\n\n\t\t\t// Rename the package and the object, as necessary\n\t\t\tUWorld* DuplicatedWorld = nullptr;\n\t\t\tif (bRenamePackageToFile)\n\t\t\t{\n\t\t\t\tif (bPackageNeedsRename)\n\t\t\t\t{\n\t\t\t\t\t// If we are doing a SaveAs on a world that already exists, we need to duplicate it.\n\t\t\t\t\tif (bPackageExists)\n\t\t\t\t\t{\n\t\t\t\t\t\tObjectTools::FPackageGroupName NewPGN;\n\t\t\t\t\t\tNewPGN.PackageName = NewPackageName;\n\t\t\t\t\t\tNewPGN.ObjectName = NewWorldAssetName;\n\n\t\t\t\t\t\tbool bPromptToOverwrite = false;\n\t\t\t\t\t\tTSet<UPackage*> PackagesUserRefusedToFullyLoad;\n\t\t\t\t\t\tDuplicatedWorld = Cast<UWorld>(ObjectTools::DuplicateSingleObject(World, NewPGN, PackagesUserRefusedToFullyLoad, bPromptToOverwrite));\n\t\t\t\t\t\tif (DuplicatedWorld)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tPackage = DuplicatedWorld->GetOutermost();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif (!DuplicatedWorld)\n\t\t\t\t\t{\n\t\t\t\t\t\t// Duplicate failed or not needed. Just do a rename.\n\t\t\t\t\t\tPackage->Rename(*NewPackageName, NULL, REN_NonTransactional | REN_DontCreateRedirectors | REN_ForceNoResetLoaders);\n\n\t\t\t\t\t\tif (bWorldNeedsRename)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t// Unload package of existing MapBuildData to allow overwrite\n\t\t\t\t\t\t\tif (World->PersistentLevel->MapBuildData && !World->PersistentLevel->MapBuildData->IsLegacyBuildData())\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tFString NewBuiltPackageName = World->GetOutermost()->GetName() + TEXT(\"_BuiltData\");\n\t\t\t\t\t\t\t\tUObject* ExistingObject = StaticFindObject(nullptr, 0, *NewBuiltPackageName);\n\t\t\t\t\t\t\t\tif (ExistingObject && ExistingObject != World->PersistentLevel->MapBuildData->GetOutermost())\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tTArray<UPackage*> AllPackagesToUnload;\n\t\t\t\t\t\t\t\t\tAllPackagesToUnload.Add(Cast<UPackage>(ExistingObject));\n\t\t\t\t\t\t\t\t\tUPackageTools::UnloadPackages(AllPackagesToUnload);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tWorld->Rename(*NewWorldAssetName, NULL, REN_NonTransactional | REN_DontCreateRedirectors | REN_ForceNoResetLoaders);\n\n\t\t\t\t\t\t\t// We're renaming the world, add a path redirector so that soft object paths get fixed on save\n\t\t\t\t\t\t\tFSoftObjectPath NewPath(World);\n\t\t\t\t\t\t\tGRedirectCollector.AddAssetPathRedirection(*OldPath.GetAssetPathString(), *NewPath.GetAssetPathString());\n\t\t\t\t\t\t\tbAddedAssetPathRedirection = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tSlowTask.EnterProgressFrame(50);\n\n\t\t\t// Save package.\n\t\t\t{\n\t\t\t\tconst FString AutoSavingString = (bAutosaving || bPIESaving) ? TEXT(\"true\") : TEXT(\"false\");\n\t\t\t\tconst FString KeepDirtyString = bPIESaving ? TEXT(\"true\") : TEXT(\"false\");\n\t\t\t\tFSaveErrorOutputDevice SaveErrors;\n\n\t\t\t\tbSuccess = GEditor->Exec(NULL, *FString::Printf(TEXT(\"OBJ SAVEPACKAGE PACKAGE=\\\"%s\\\" FILE=\\\"%s\\\" SILENT=true AUTOSAVING=%s KEEPDIRTY=%s\"), *Package->GetName(), *FinalFilename, *AutoSavingString, *KeepDirtyString), SaveErrors);\n\t\t\t\tSaveErrors.Flush();\n\t\t\t}\n\n\t\t\tif (bSuccess && !bAutosaving)\n\t\t\t{\n\t\t\t\t// Also save MapBuildData packages when saving the current level\n\t\t\t\tFEditorFileUtils::SaveMapDataPackages(DuplicatedWorld ? DuplicatedWorld : World, bCheckDirty || bPIESaving);\n\t\t\t}\n\n\t\t\tSlowTask.EnterProgressFrame(25);\n\n\t\t\t// If the package save was not successful. Trash the duplicated world or rename back if the duplicate failed.\n\t\t\tif (bRenamePackageToFile && !bSuccess)\n\t\t\t{\n\t\t\t\tif (bPackageNeedsRename)\n\t\t\t\t{\n\t\t\t\t\tif (DuplicatedWorld)\n\t\t\t\t\t{\n\t\t\t\t\t\tDuplicatedWorld->Rename(nullptr, GetTransientPackage(), REN_NonTransactional | REN_DontCreateRedirectors);\n\t\t\t\t\t\tDuplicatedWorld->MarkPendingKill();\n\t\t\t\t\t\tDuplicatedWorld->SetFlags(RF_Transient);\n\t\t\t\t\t\tDuplicatedWorld = nullptr;\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tPackage->Rename(*OriginalPackageName, NULL, REN_NonTransactional);\n\n\t\t\t\t\t\tif (bWorldNeedsRename)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tWorld->Rename(*OriginalWorldName, NULL, REN_NonTransactional);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn bSuccess;\n\t}\n\n\t/**\n\t * Saves the specified map package, returning true on success.\n\t *\n\t * @param\tWorld\t\t\tThe world to save.\n\t * @param\tFilename\t\tMap package filename, including path.\n\t *\n\t * @return\t\t\t\t\ttrue if the map was saved successfully.\n\t */\n\tstatic bool InternalSaveMap(UWorld* InWorld, const FString& Filename)\n\t{\n\t\tbool bLevelWasSaved = false;\n\n\t\t// Disallow the save if in interpolation editing mode and the user doesn't want to exit interpolation mode.\n\t\tif (!InInterpEditMode())\n\t\t{\n\t\t\tconst double SaveStartTime = FPlatformTime::Seconds();\n\n\t\t\tFString FinalFilename;\n\t\t\tbLevelWasSaved = InternalSaveWorld(InWorld, &Filename,\n\t\t\t\tnullptr, nullptr,\n\t\t\t\ttrue, false,\n\t\t\t\tFinalFilename,\n\t\t\t\tfalse, false);\n\n\t\t\t// Track time spent saving map.\n\t\t\tUE_LOG(LogSoEditor, Log, TEXT(\"Saving map '%s' took %.3f\"), *FPaths::GetBaseFilename(Filename), FPlatformTime::Seconds() - SaveStartTime);\n\t\t}\n\n\t\treturn bLevelWasSaved;\n\t}\n\n\t/**\n\t * Actually save a package. Prompting for Save as if necessary\n\t *\n\t * @param PackageToSave\t\t\t\t\tThe package to save.\n\t * @param bUseDialog\t\t\t\t\tIf true, use the normal behavior.\n\t *\t\t\t\t\t\t\t\t\t\tIf false, do not prompt message dialog. If it can't save the package, skip it. If the package is a map and the name is not valid, skip it.\n\t * @param OutPackageLocallyWritable\t\tSet to true if the provided package was locally writable but not under source control (of if source control is disabled).\n\t * @param SaveOutput\t\t\t\t\tThe output from the save process.\n\t * @return\tInternalSavePackageResult::Success if package saving was a success\n\t\t\t\tInternalSavePackageResult::Continue if the package saving failed and the user doesn't want to retry\n\t\t\t\tInternalSavePackageResult::Cancel if the user wants to cancel everything\n\t\t\t\tInternalSavePackageResult::Error if an error occured. Check OutFailureReason\n\t */\n\tstatic InternalSavePackageResult InternalSavePackage(UPackage* PackageToSave, bool bUseDialog, bool& bOutPackageLocallyWritable, FOutputDevice &SaveOutput)\n\t{\n\t\t// What we will be returning. Assume for now that everything will go fine\n\t\tInternalSavePackageResult ReturnCode = InternalSavePackageResult::Success;\n\n\t\t// Assume the package is locally writable in case SCC is disabled; if SCC is enabled, it will\n\t\t// correctly set this value later\n\t\tbOutPackageLocallyWritable = true;\n\n\t\tbool bShouldRetrySave = true;\n\t\tUWorld*\tAssociatedWorld = UWorld::FindWorldInPackage(PackageToSave);\n\t\tconst bool\tbIsMapPackage = AssociatedWorld != NULL;\n\n\t\t// The name of the package\n\t\tconst FString PackageName = PackageToSave->GetName();\n\n\t\t// Place were we should save the file, including the filename\n\t\tFString FinalPackageSavePath;\n\t\t// Just the filename\n\t\tFString FinalPackageFilename;\n\n\t\t// True if we should attempt saving\n\t\tbool bAttemptSave = true;\n\n\t\t// If the package already has a valid path to a non read-only location, use it to determine where the file should be saved\n\t\tconst bool bIncludeReadOnlyRoots = false;\n\t\tconst bool bIsValidPath = FPackageName::IsValidLongPackageName(PackageName, bIncludeReadOnlyRoots);\n\t\tif (bIsValidPath)\n\t\t{\n\t\t\tFString ExistingFilename;\n\t\t\tconst bool bPackageAlreadyExists = FPackageName::DoesPackageExist(PackageName, NULL, &ExistingFilename);\n\t\t\tif (!bPackageAlreadyExists)\n\t\t\t{\n\t\t\t\t// Construct a filename from long package name.\n\t\t\t\tconst FString& FileExtension = bIsMapPackage ? FPackageName::GetMapPackageExtension() : FPackageName::GetAssetPackageExtension();\n\t\t\t\tExistingFilename = FPackageName::LongPackageNameToFilename(PackageName, FileExtension);\n\n\t\t\t\t// Check if we can use this filename.\n\t\t\t\tFText ErrorText;\n\t\t\t\tif (!FFileHelper::IsFilenameValidForSaving(ExistingFilename, ErrorText))\n\t\t\t\t{\n\t\t\t\t\t// Display the error (already localized) and exit gracefuly.\n\t\t\t\t\tFMessageDialog::Open(EAppMsgType::Ok, ErrorText);\n\t\t\t\t\tbAttemptSave = false;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (bAttemptSave)\n\t\t\t{\n\t\t\t\t// The file already exists, no need to prompt for save as\n\t\t\t\tFString BaseFilename, Extension, Directory;\n\t\t\t\t// Split the path to get the filename without the directory structure\n\t\t\t\tFPaths::NormalizeFilename(ExistingFilename);\n\t\t\t\tFPaths::Split(ExistingFilename, Directory, BaseFilename, Extension);\n\t\t\t\t// The final save path is whatever the existing filename is\n\t\t\t\tFinalPackageSavePath = ExistingFilename;\n\t\t\t\t// Format the filename we found from splitting the path\n\t\t\t\tFinalPackageFilename = FString::Printf(TEXT(\"%s.%s\"), *BaseFilename, *Extension);\n\t\t\t}\n\t\t}\n\t\telse if (bUseDialog && bIsMapPackage)\t// don't do a SaveAs dialog if dialogs was not requested\n\t\t{\n\t\t\t// If this changes, there must be generic code to rename assets to the new name BEFORE saving to disk.\n\t\t\t// Right now, all of this code is specific to maps\n\n\t\t\t// There wont be a \"not checked out from SCC but writable on disk\" conflict if the package is new.\n\t\t\tbOutPackageLocallyWritable = false;\n\n\t\t\t// Make a list of file types\n\t\t\t// We have to ask for save as.\n\t\t\tFString FileTypes;\n\t\t\tFText SavePackageText;\n\n\t\t\tif (bIsMapPackage)\n\t\t\t{\n\t\t\t\tFileTypes = FEditorFileUtils::GetFilterString(FI_Save);\n\t\t\t\tFinalPackageFilename = FString::Printf(TEXT(\"Untitled%s\"), *FPackageName::GetMapPackageExtension());\n\t\t\t\tSavePackageText = NSLOCTEXT(\"UnrealEd\", \"SaveMap\", \"Save Map\");\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tFileTypes = FString::Printf(TEXT(\"(*%s)|*%s\"), *FPackageName::GetAssetPackageExtension(), *FPackageName::GetAssetPackageExtension());\n\t\t\t\tFinalPackageFilename = FString::Printf(TEXT(\"%s%s\"), *PackageToSave->GetName(), *FPackageName::GetAssetPackageExtension());\n\t\t\t\tSavePackageText = NSLOCTEXT(\"UnrealEd\", \"SaveAsset\", \"Save Asset\");\n\t\t\t}\n\n\t\t\t// The number of times the user pressed cancel\n\t\t\tint32 NumSkips = 0;\n\n\t\t\t// If the user presses cancel more than this time, they really don't want to save the file\n\t\t\tconst int32 NumSkipsBeforeAbort = 1;\n\n\t\t\t// if the user hit cancel on the Save dialog, ask again what the user wants to do,\n\t\t\t// we shouldn't assume they want to skip the file\n\t\t\t// This loop continues indefinitely if the user does not supply a valid filename.  They must supply a valid filename or press cancel\n\t\t\tconst FString Directory = *GetDefaultDirectory();\n\t\t\twhile (NumSkips < NumSkipsBeforeAbort)\n\t\t\t{\n\t\t\t\tFString DefaultLocation = Directory;\n\t\t\t\tFString DefaultPackagePath;\n\t\t\t\tif (!FPackageName::TryConvertFilenameToLongPackageName(DefaultLocation / FinalPackageFilename, DefaultPackagePath))\n\t\t\t\t{\n\t\t\t\t\t// Original location is invalid; set default location to /Game/Maps\n\t\t\t\t\tDefaultLocation = FPaths::ProjectContentDir() / TEXT(\"Maps\");\n\t\t\t\t\tensure(FPackageName::TryConvertFilenameToLongPackageName(DefaultLocation / FinalPackageFilename, DefaultPackagePath));\n\t\t\t\t}\n\n\t\t\t\tFString SaveAsPackageName;\n\t\t\t\tbool bSaveFile = OpenSaveAsDialog(\n\t\t\t\t\tUWorld::StaticClass(),\n\t\t\t\t\tFPackageName::GetLongPackagePath(DefaultPackagePath),\n\t\t\t\t\tFPaths::GetBaseFilename(FinalPackageFilename),\n\t\t\t\t\tSaveAsPackageName);\n\n\t\t\t\tif (bSaveFile)\n\t\t\t\t{\n\t\t\t\t\t// Leave out the extension. It will be added below.\n\t\t\t\t\tFinalPackageFilename = FPackageName::LongPackageNameToFilename(SaveAsPackageName);\n\t\t\t\t}\n\n\t\t\t\tif (bSaveFile)\n\t\t\t\t{\n\t\t\t\t\t// If the supplied file name is missing an extension then give it the default package\n\t\t\t\t\t// file extension.\n\t\t\t\t\tif (FinalPackageFilename.Len() > 0 && FPaths::GetExtension(FinalPackageFilename).Len() == 0)\n\t\t\t\t\t{\n\t\t\t\t\t\tFinalPackageFilename += bIsMapPackage ? FPackageName::GetMapPackageExtension() : FPackageName::GetAssetPackageExtension();\n\t\t\t\t\t}\n\n\t\t\t\t\tFText ErrorMessage;\n\t\t\t\t\tbool bValidFilename = FFileHelper::IsFilenameValidForSaving(FinalPackageFilename, ErrorMessage);\n\t\t\t\t\tif (bValidFilename)\n\t\t\t\t\t{\n\t\t\t\t\t\tbValidFilename = bIsMapPackage ? FEditorFileUtils::IsValidMapFilename(FinalPackageFilename, ErrorMessage) : FPackageName::IsValidLongPackageName(FinalPackageFilename, false, &ErrorMessage);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (bValidFilename)\n\t\t\t\t\t{\n\t\t\t\t\t\t// If there is an existing world in memory that shares this name unload it now to prepare for overwrite.\n\t\t\t\t\t\t// Don't do this if we are using save as to overwrite the current level since it will just save naturally.\n\t\t\t\t\t\tconst FString NewPackageName = FPackageName::FilenameToLongPackageName(FinalPackageFilename);\n\t\t\t\t\t\tUPackage* ExistingPackage = FindPackage(nullptr, *NewPackageName);\n\t\t\t\t\t\tif (ExistingPackage && ExistingPackage != PackageToSave)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tbValidFilename = FEditorFileUtils::AttemptUnloadInactiveWorldPackage(ExistingPackage, ErrorMessage);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif (!bValidFilename)\n\t\t\t\t\t{\n\t\t\t\t\t\t// Start the loop over, prompting for save again\n\t\t\t\t\t\tconst FText DisplayFilename = FText::FromString(IFileManager::Get().ConvertToAbsolutePathForExternalAppForRead(*FinalPackageFilename));\n\t\t\t\t\t\tFFormatNamedArguments Arguments;\n\t\t\t\t\t\tArguments.Add(TEXT(\"Filename\"), DisplayFilename);\n\t\t\t\t\t\tArguments.Add(TEXT(\"LineTerminators\"), FText::FromString(LINE_TERMINATOR LINE_TERMINATOR));\n\t\t\t\t\t\tArguments.Add(TEXT(\"ErrorMessage\"), ErrorMessage);\n\t\t\t\t\t\tconst FText DisplayMessage = FText::Format(LOCTEXT(\"InvalidSaveFilename\", \"Failed to save to {Filename}{LineTerminators}{ErrorMessage}\"), Arguments);\n\t\t\t\t\t\tFMessageDialog::Open(EAppMsgType::Ok, DisplayMessage);\n\n\t\t\t\t\t\t// Start the loop over, prompting for save again\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tFinalPackageSavePath = FinalPackageFilename;\n\t\t\t\t\t\t// Stop looping, we successfully got a valid path and filename to save\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t// if the user hit cancel on the Save dialog, ask again what the user wants to do,\n\t\t\t\t\t// we shouldn't assume they want to skip the file unless they press cancel several times\n\t\t\t\t\t++NumSkips;\n\t\t\t\t\tif (NumSkips == NumSkipsBeforeAbort)\n\t\t\t\t\t{\n\t\t\t\t\t\t// They really want to stop\n\t\t\t\t\t\tbAttemptSave = false;\n\t\t\t\t\t\tReturnCode = InternalSavePackageResult::Cancel;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// attempt the save\n\n\t\twhile (bAttemptSave)\n\t\t{\n\t\t\tbool bWasSuccessful = false;\n\t\t\tif (bIsMapPackage)\n\t\t\t{\n\t\t\t\t// have a Helper attempt to save the map\n\t\t\t\tSaveOutput.Log(\"LogFileHelpers\", ELogVerbosity::Log, FString::Printf(TEXT(\"Saving Map: %s\"), *PackageName));\n\t\t\t\tbWasSuccessful = InternalSaveMap(AssociatedWorld, FinalPackageSavePath);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t// normally, we just save the package\n\t\t\t\tSaveOutput.Log(\"LogFileHelpers\", ELogVerbosity::Log, FString::Printf(TEXT(\"Saving Package: %s\"), *PackageName));\n\t\t\t\tbWasSuccessful = GEngine->Exec(NULL, *FString::Printf(TEXT(\"OBJ SAVEPACKAGE PACKAGE=\\\"%s\\\" FILE=\\\"%s\\\" SILENT=true\"), *PackageName, *FinalPackageSavePath), SaveOutput);\n\t\t\t}\n\n\t\t\tISourceControlProvider& SourceControlProvider = ISourceControlModule::Get().GetProvider();\n\t\t\tif (ISourceControlModule::Get().IsEnabled())\n\t\t\t{\n\t\t\t\t// Assume the package was correctly checked out from SCC\n\t\t\t\tbOutPackageLocallyWritable = false;\n\n\t\t\t\t// Trusting the SCC status in the package file cache to minimize network activity during save.\n\t\t\t\tconst FSourceControlStatePtr SourceControlState = SourceControlProvider.GetState(PackageToSave, EStateCacheUsage::Use);\n\t\t\t\t// If the package is in the depot, and not recognized as editable by source control, and not read-only, then we know the user has made the package locally writable!\n\t\t\t\tconst bool bSCCCanEdit = !SourceControlState.IsValid() || SourceControlState->CanCheckIn() || SourceControlState->IsIgnored() || SourceControlState->IsUnknown();\n\t\t\t\tconst bool bSCCIsCheckedOut = SourceControlState.IsValid() && SourceControlState->IsCheckedOut();\n\t\t\t\tconst bool bInDepot = SourceControlState.IsValid() && SourceControlState->IsSourceControlled();\n\t\t\t\tif (!bSCCCanEdit && bInDepot && !IFileManager::Get().IsReadOnly(*FinalPackageSavePath) && SourceControlProvider.UsesLocalReadOnlyState() && !bSCCIsCheckedOut)\n\t\t\t\t{\n\t\t\t\t\tbOutPackageLocallyWritable = true;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t// If source control is disabled then we don't care if the package is locally writable\n\t\t\t\tbOutPackageLocallyWritable = false;\n\t\t\t}\n\n\t\t\t// Handle all failures the same way.\n\t\t\tif (bUseDialog && !bWasSuccessful)\n\t\t\t{\n\t\t\t\t// ask the user what to do if we failed\n\t\t\t\tconst FText ErrorPrompt = GEditor->IsPlayingOnLocalPCSession() ?\n\t\t\t\t\tNSLOCTEXT(\"UnrealEd\", \"Prompt_41\", \"The asset '{0}' ({1}) cannot be saved as the package is locked because you are in play on PC mode.\\n\\nCancel: Stop saving all assets and return to the editor.\\nRetry: Attempt to save the asset again.\\nContinue: Skip saving this asset only.\") :\n\t\t\t\t\tNSLOCTEXT(\"UnrealEd\", \"Prompt_26\", \"The asset '{0}' ({1}) failed to save.\\n\\nCancel: Stop saving all assets and return to the editor.\\nRetry: Attempt to save the asset again.\\nContinue: Skip saving this asset only.\");\n\t\t\t\tEAppReturnType::Type DialogCode = FMessageDialog::Open(EAppMsgType::CancelRetryContinue, EAppReturnType::Continue, FText::Format(ErrorPrompt, FText::FromString(PackageName), FText::FromString(FinalPackageFilename)));\n\n\t\t\t\tswitch (DialogCode)\n\t\t\t\t{\n\t\t\t\tcase EAppReturnType::Cancel:\n\t\t\t\t\t// if this happens, the user wants to stop everything\n\t\t\t\t\tbAttemptSave = false;\n\t\t\t\t\tReturnCode = InternalSavePackageResult::Cancel;\n\t\t\t\t\tbreak;\n\t\t\t\tcase EAppReturnType::Retry:\n\t\t\t\t\tbAttemptSave = true;\n\t\t\t\t\tbreak;\n\t\t\t\tcase EAppReturnType::Continue:\n\t\t\t\t\tReturnCode = InternalSavePackageResult::Continue;// this is if it failed to save, but the user wants to skip saving it\n\t\t\t\t\tbAttemptSave = false;\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\t// Should not get here\n\t\t\t\t\tcheck(0);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (!bWasSuccessful)\n\t\t\t{\n\t\t\t\t// We failed at saving because we are in bIsUnattended mode, there is no need to attempt to save again\n\t\t\t\tFText FailureReason = FText::Format(NSLOCTEXT(\"UnrealEd\", \"SaveAssetFailed\", \"The asset '{0}' ({1}) failed to save.\"), FText::FromString(PackageName), FText::FromString(FinalPackageFilename));\n\n\t\t\t\tUE_LOG(LogSoEditor, Error, TEXT(\"%s\"), *FailureReason.ToString());\n\t\t\t\tif (bUseDialog)\n\t\t\t\t{\n\t\t\t\t\tFMessageDialog::Open(EAppMsgType::Ok, FailureReason);\n\t\t\t\t}\n\n\t\t\t\tbAttemptSave = false;\n\t\t\t\tReturnCode = InternalSavePackageResult::Error;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t// If we were successful at saving, there is no need to attempt to save again\n\t\t\t\tbAttemptSave = false;\n\t\t\t\tReturnCode = InternalSavePackageResult::Success;\n\t\t\t}\n\t\t}\n\n\t\treturn ReturnCode;\n\t}\n\n\t/*\n\t * @param bUseDialog\t\t\t\t\tIf true, use the normal behavior.\n\t *\t\t\t\t\t\t\t\t\t\tIf false, do not prompt message dialog. If it can't save the package, skip it. If the package is a map and the name is not valid, skip it.\n\t * @param\tbShowDialogIfError\t\t\tIf InternalSavePackage failed, tell the user with a Dialog\n\t * @param\tOutFailedPackages\t\t\tPackages that failed to save\n\t */\n\tstatic bool InternalSavePackagesFast(const TArray<UPackage*>& PackagesToSave, bool bUseDialog, TArray<UPackage*>& OutFailedPackages)\n\t{\n\t\tbool bReturnCode = true;\n\n\t\tFSaveErrorOutputDevice SaveErrors;\n\t\tGWarn->BeginSlowTask(NSLOCTEXT(\"UnrealEd\", \"SavingPackagesE\", \"Saving packages...\"), true);\n\n\t\tfor (TArray<UPackage*>::TConstIterator PkgIter(PackagesToSave); PkgIter; ++PkgIter)\n\t\t{\n\t\t\tUPackage* CurPackage = *PkgIter;\n\n\t\t\t// Check if a file exists for this package\n\t\t\tFString Filename;\n\t\t\tconst bool bFoundFile = FPackageName::DoesPackageExist(CurPackage->GetName(), NULL, &Filename);\n\t\t\tif (bFoundFile)\n\t\t\t{\n\t\t\t\t// determine if the package file is read only\n\t\t\t\tconst bool bPkgReadOnly = IFileManager::Get().IsReadOnly(*Filename);\n\n\t\t\t\t// Only save writable files in fast mode\n\t\t\t\tif (!bPkgReadOnly)\n\t\t\t\t{\n\t\t\t\t\tif (!CurPackage->IsFullyLoaded())\n\t\t\t\t\t{\n\t\t\t\t\t\t// Packages must be fully loaded to save\n\t\t\t\t\t\tCurPackage->FullyLoad();\n\t\t\t\t\t}\n\n\t\t\t\t\tconst UWorld* const AssociatedWorld = UWorld::FindWorldInPackage(CurPackage);\n\t\t\t\t\tconst bool bIsMapPackage = AssociatedWorld != nullptr;\n\n\t\t\t\t\tconst FText SavingPackageText = (bIsMapPackage)\n\t\t\t\t\t\t? FText::Format(NSLOCTEXT(\"UnrealEd\", \"SavingMapf\", \"Saving map {0}\"), FText::FromString(CurPackage->GetName()))\n\t\t\t\t\t\t: FText::Format(NSLOCTEXT(\"UnrealEd\", \"SavingAssetf\", \"Saving asset {0}\"), FText::FromString(CurPackage->GetName()));\n\n\t\t\t\t\tGWarn->StatusForceUpdate(PkgIter.GetIndex(), PackagesToSave.Num(), SavingPackageText);\n\n\t\t\t\t\t// Save the package\n\t\t\t\t\tbool bPackageLocallyWritable;\n\t\t\t\t\tconst InternalSavePackageResult SaveStatus = InternalSavePackage(CurPackage, bUseDialog, bPackageLocallyWritable, SaveErrors);\n\n\t\t\t\t\tif (SaveStatus == InternalSavePackageResult::Cancel)\n\t\t\t\t\t{\n\t\t\t\t\t\t// we don't want to pop up a message box about failing to save packages if they cancel\n\t\t\t\t\t\t// instead warn here so there is some trace in the log and also unattended builds can find it\n\t\t\t\t\t\tUE_LOG(LogSoEditor, Warning, TEXT(\"Cancelled saving package %s\"), *CurPackage->GetName());\n\t\t\t\t\t}\n\t\t\t\t\telse if (SaveStatus == InternalSavePackageResult::Continue || SaveStatus == InternalSavePackageResult::Error)\n\t\t\t\t\t{\n\t\t\t\t\t\t// The package could not be saved so add it to the failed array\n\t\t\t\t\t\tOutFailedPackages.Add(CurPackage);\n\n\t\t\t\t\t\tif (SaveStatus == InternalSavePackageResult::Error)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t// exit gracefully.\n\t\t\t\t\t\t\tbReturnCode = false;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tGWarn->EndSlowTask();\n\t\tSaveErrors.Flush();\n\n\t\treturn bReturnCode;\n\t}\n\n\tstatic bool InternalSavePackages(const TArray<UPackage*>& PackagesToSave, const bool bUseDialog)\n\t{\n\t\tTArray<UPackage*> FailedPackages;\n\t\tconst bool bReturnCode = InternalSavePackagesFast(PackagesToSave, bUseDialog, FailedPackages);\n\n\t\t// Warn the user about any packages which failed to save.\n\t\tInternalWarnUserAboutFailedSave(FailedPackages, bUseDialog);\n\n\n\t\treturn bReturnCode;\n\t}\n\n\tstatic bool SaveDirtyPackages(\n\t\tconst bool bSaveMapPackages,\n\t\tconst bool bSaveContentPackages,\n\t\tconst bool bUseDialog,\n\t\tconst bool bNotifyNoPackagesSaved = false,\n\t\tbool* bOutPackagesNeededSaving = nullptr)\n\t{\n\t\tbool bReturnCode = true;\n\n\t\tif (bOutPackagesNeededSaving != NULL)\n\t\t{\n\t\t\t*bOutPackagesNeededSaving = false;\n\t\t}\n\n\t\tconst TArray<UPackage*> PackagesToSave = InternalGetDirtyPackages(bSaveMapPackages, bSaveContentPackages);\n\t\tif (PackagesToSave.Num() > 0)\n\t\t{\n\t\t\tif (bOutPackagesNeededSaving != nullptr)\n\t\t\t{\n\t\t\t\t*bOutPackagesNeededSaving = true;\n\t\t\t}\n\n\t\t\tbReturnCode = InternalSavePackages(PackagesToSave, bUseDialog);\n\t\t}\n\t\telse if (bNotifyNoPackagesSaved)\n\t\t{\n\t\t\tInternalNotifyNoPackagesSaved(true);\n\t\t}\n\t\treturn bReturnCode;\n\t}\n\t////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\t//\n\t// End own save dirty packages\n\t//\n\t////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n#undef LOCTEXT_NAMESPACE\n};\n"
  },
  {
    "path": "Source/SOrbEditor/Private/SoGameEditorEngine.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#include \"SoGameEditorEngine.h\"\n\n#include \"SOrbEditorModule.h\"\n// #include \"SOrbGameMode.h\"\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nUSoGameEditorEngine::USoGameEditorEngine(const FObjectInitializer& ObjectInitializer)\n\t: Super(ObjectInitializer)\n{\n\n}\n\nvoid USoGameEditorEngine::PreExit()\n{\n\tUE_LOG(LogSoEditor, Verbose, TEXT(\"USoGameEditorEngine::PreExit()\"));\n\n\t// NOTE: This destroys all the worlds so we must call it at the end.\n\tSuper::PreExit();\n}\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoGameEditorEngine::WorldAdded(UWorld* World)\n{\n\tSuper::WorldAdded(World);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid USoGameEditorEngine::WorldDestroyed(UWorld* InWorld)\n{\n\tSuper::WorldDestroyed(InWorld);\n}\n"
  },
  {
    "path": "Source/SOrbEditor/Private/ThumbnailRenderers/SoCharacterStrikeThumbnailRenderer.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#include \"SoCharacterStrikeThumbnailRenderer.h\"\n\n#include \"SceneTypes.h\"\n#include \"CanvasItem.h\"\n#include \"Engine/Texture2D.h\"\n\n#include \"Character/SoCharacterStrike.h\"\n\n\nbool USoCharacterStrikeThumbnailRenderer::CanVisualizeAsset(UObject* Object)\n{\n\tUSoCharacterStrike* CharStrike = Cast<USoCharacterStrike>(Object);\n\treturn CharStrike != nullptr && CharStrike->GetCooldownIcon() != nullptr;\n}\n\nvoid USoCharacterStrikeThumbnailRenderer::Draw(UObject* Object, int32 X, int32 Y, uint32 Width, uint32 Height, FRenderTarget* RenderTarget, FCanvas* Canvas)\n{\n\t// If any of these are null it will simply show the default text\n\tUSoCharacterStrike* CharStrike = CastChecked<USoCharacterStrike>(Object);\n\tUTexture2D* Texture = CharStrike->GetCooldownIcon();\n\tif (Texture == nullptr)\n\t\treturn;\n\n\t// Draw the Image\n\tFCanvasTileItem CanvasTile(FVector2D(X, Y), Texture->Resource, FVector2D(Width, Height), FLinearColor::White);\n\tCanvasTile.BlendMode = SE_BLEND_Opaque;\n\tCanvasTile.Draw(Canvas);\n}\n"
  },
  {
    "path": "Source/SOrbEditor/Private/ThumbnailRenderers/SoCharacterStrikeThumbnailRenderer.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#pragma once\n\n#include \"CoreTypes.h\"\n#include \"ThumbnailRendering/DefaultSizedThumbnailRenderer.h\"\n#include \"SoCharacterStrikeThumbnailRenderer.generated.h\"\n\nUCLASS(config = Editor)\nclass USoCharacterStrikeThumbnailRenderer : public UDefaultSizedThumbnailRenderer\n{\n\tGENERATED_BODY()\n\npublic:\n\t// Begin UThumbnailRenderer Object\n\t/**\n\t * Returns true if the renderer is capable of producing a thumbnail for the specified asset.\n\t *\n\t * @param Object the asset to attempt to render\n\t */\n\tbool CanVisualizeAsset(UObject* Object) override;\n\n\t/**\n\t * Draws a thumbnail for the object that was specified.\n\t *\n\t * @param Object the object to draw the thumbnail for\n\t * @param X the X coordinate to start drawing at\n\t * @param Y the Y coordinate to start drawing at\n\t * @param Width the width of the thumbnail to draw\n\t * @param Height the height of the thumbnail to draw\n\t * @param Viewport the viewport being drawn in\n\t * @param Canvas the render interface to draw with\n\t */\n\tvoid Draw(UObject* Object, int32 X, int32 Y, uint32 Width, uint32 Height, FRenderTarget* Viewport, FCanvas* Canvas) override;\n};\n"
  },
  {
    "path": "Source/SOrbEditor/Private/ThumbnailRenderers/SoItemThumbnailRenderer.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#include \"SoItemThumbnailRenderer.h\"\n#include \"Items/ItemTemplates/SoItemTemplate.h\"\n#include \"SceneTypes.h\"\n#include \"CanvasItem.h\"\n#include \"Engine/Texture2D.h\"\n\nbool USoItemThumbnailRenderer::CanVisualizeAsset(UObject* Object)\n{\n\tUSoItemTemplate* ItemTemplate = Cast<USoItemTemplate>(Object);\n\treturn ItemTemplate != nullptr && ItemTemplate->GetIcon() != nullptr;\n}\n\nvoid USoItemThumbnailRenderer::Draw(UObject* Object, int32 X, int32 Y, uint32 Width, uint32 Height, FRenderTarget* RenderTarget, FCanvas* Canvas)\n{\n\t// If any of these are null it will simply show the default text\n\tUSoItemTemplate* ItemTemplate = CastChecked<USoItemTemplate>(Object);\n\tUTexture2D* Texture = ItemTemplate->GetIcon();\n\tif (Texture == nullptr)\n\t\treturn;\n\n\t// Draw the Image\n\tFCanvasTileItem CanvasTile(FVector2D(X, Y), Texture->Resource, FVector2D(Width, Height), FLinearColor::White);\n\tCanvasTile.BlendMode = SE_BLEND_Opaque;\n\tCanvasTile.Draw(Canvas);\n}\n"
  },
  {
    "path": "Source/SOrbEditor/Private/ThumbnailRenderers/SoItemThumbnailRenderer.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#pragma once\n\n#include \"CoreTypes.h\"\n#include \"ThumbnailRendering/DefaultSizedThumbnailRenderer.h\"\n#include \"SoItemThumbnailRenderer.generated.h\"\n\nUCLASS(config = Editor)\nclass USoItemThumbnailRenderer : public UDefaultSizedThumbnailRenderer\n{\n\tGENERATED_BODY()\n\npublic:\n\t// Begin UThumbnailRenderer Object\n\t/**\n\t * Returns true if the renderer is capable of producing a thumbnail for the specified asset.\n\t *\n\t * @param Object the asset to attempt to render\n\t */\n\tbool CanVisualizeAsset(UObject* Object) override;\n\n\t/**\n\t * Draws a thumbnail for the object that was specified.\n\t *\n\t * @param Object the object to draw the thumbnail for\n\t * @param X the X coordinate to start drawing at\n\t * @param Y the Y coordinate to start drawing at\n\t * @param Width the width of the thumbnail to draw\n\t * @param Height the height of the thumbnail to draw\n\t * @param Viewport the viewport being drawn in\n\t * @param Canvas the render interface to draw with\n\t */\n\tvoid Draw(UObject* Object, int32 X, int32 Y, uint32 Width, uint32 Height, FRenderTarget* Viewport, FCanvas* Canvas) override;\n};\n"
  },
  {
    "path": "Source/SOrbEditor/Private/TypeActions/AssetTypeActions_SoCharacterStrike.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#include \"AssetTypeActions_SoCharacterStrike.h\"\n#include \"AssetData.h\"\n\nFText FAssetTypeActions_SoCharacterStrike::GetAssetDescription(const FAssetData& AssetData) const\n{\n\tUObject* Object = AssetData.GetAsset();\n\tif (Object == nullptr)\n\t\treturn FText::GetEmpty();\n\n\treturn FText::FromString(Object->GetDesc());\n}\n\nTSharedPtr<SWidget> FAssetTypeActions_SoCharacterStrike::GetThumbnailOverlay(const FAssetData& AssetData) const\n{\n\t// Trigger load asset, the actual thumbnail is show in USoItemThumbnailRenderer\n\tif (!AssetData.IsAssetLoaded())\n\t\tAssetData.GetAsset();\n\n\treturn nullptr;\n}\n"
  },
  {
    "path": "Source/SOrbEditor/Private/TypeActions/AssetTypeActions_SoCharacterStrike.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#pragma once\n\n#include \"AssetTypeActions_Base.h\"\n#include \"Character/SoCharacterStrike.h\"\n\nclass SWidget;\n\n/**\n * Defines the look and actions the editor takes when clicking/viewing a char strike template asset\n * See FSOrbEditorModule::StartupModule for usage.\n */\nclass FAssetTypeActions_SoCharacterStrike : public FAssetTypeActions_Base\n{\npublic:\n\tFAssetTypeActions_SoCharacterStrike(EAssetTypeCategories::Type InAssetCategory) : AssetCategory(InAssetCategory) {}\n\n\t// IAssetTypeActions interface\n\t/** Returns the name of this type */\n\tFText GetName() const override { return FText::FromString(TEXT(\"Character Strike\")); }\n\n\t/** Returns the color associated with this type */\n\tFColor GetTypeColor() const override { return FColor::White; }\n\n\t/** Checks to see if the specified object is handled by this type. */\n\tUClass* GetSupportedClass() const override { return USoCharacterStrike::StaticClass(); }\n\n\t/** Returns the categories that this asset type. The return value is one or more flags from EAssetTypeCategories.  */\n\tuint32 GetCategories() override { return AssetCategory; }\n\n\t/** Optionally returns a custom widget to overlay on top of this assets' thumbnail */\n\tTSharedPtr<SWidget> GetThumbnailOverlay(const FAssetData& AssetData) const override;\n\t// End of IAssetTypeActions interface\n\nprotected:\n\t// FAssetTypeActions_Base interface\n\t/** Returns additional tooltip information for the specified asset, if it has any (otherwise return the null widget) */\n\tFText GetAssetDescription(const FAssetData& AssetData) const override;\n\nprivate:\n\t/** Indicates the category used for this class */\n\tEAssetTypeCategories::Type AssetCategory;\n};\n"
  },
  {
    "path": "Source/SOrbEditor/Private/TypeActions/AssetTypeActions_SoItem.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#include \"AssetTypeActions_SoItem.h\"\n#include \"AssetData.h\"\n\nFText FAssetTypeActions_SoItemTemplate::GetAssetDescription(const FAssetData& AssetData) const\n{\n\tUObject* Object = AssetData.GetAsset();\n\tif (Object == nullptr)\n\t\treturn FText::GetEmpty();\n\n\treturn FText::FromString(Object->GetDesc());\n}\n\nTSharedPtr<SWidget> FAssetTypeActions_SoItemTemplate::GetThumbnailOverlay(const FAssetData& AssetData) const\n{\n\t// Trigger load asset, the actual thumbnail is show in USoItemThumbnailRenderer\n\tif (!AssetData.IsAssetLoaded())\n\t\tAssetData.GetAsset();\n\n\treturn nullptr;\n}\n"
  },
  {
    "path": "Source/SOrbEditor/Private/TypeActions/AssetTypeActions_SoItem.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#pragma once\n\n#include \"AssetTypeActions_Base.h\"\n#include \"Items/ItemTemplates/SoItemTemplate.h\"\n#include \"Items/ItemTemplates/SoQuestItemTemplate.h\"\n#include \"Items/ItemTemplates/SoWeaponTemplate.h\"\n#include \"Items/ItemTemplates/SoItemTemplateShard.h\"\n#include \"Items/ItemTemplates/SoUsableItemTemplate.h\"\n#include \"Items/ItemTemplates/SoItemTemplateJewelry.h\"\n#include \"Items/ItemTemplates/SoItemTemplateQuestBook.h\"\n#include \"Items/ItemTemplates/SoItemTemplateRuneStone.h\"\n\nclass SWidget;\n\n/**\n * Defines the look and actions the editor takes when clicking/viewing a item template asset\n * See FSOrbEditorModule::StartupModule for usage.\n */\nclass FAssetTypeActions_SoItemTemplate : public FAssetTypeActions_Base\n{\npublic:\n\tFAssetTypeActions_SoItemTemplate(EAssetTypeCategories::Type InAssetCategory) : AssetCategory(InAssetCategory) {}\n\n\t// IAssetTypeActions interface\n\t/** Returns the name of this type */\n\tFText GetName() const override { return FText::FromString(TEXT(\"Item Template\")); }\n\n\t/** Returns the color associated with this type */\n\tFColor GetTypeColor() const override { return FColor::Blue; }\n\n\t/** Checks to see if the specified object is handled by this type. */\n\tUClass* GetSupportedClass() const override { return USoItemTemplate::StaticClass(); }\n\n\t/** Returns the categories that this asset type. The return value is one or more flags from EAssetTypeCategories.  */\n\tuint32 GetCategories() override { return AssetCategory; }\n\n\t/** Optionally returns a custom widget to overlay on top of this assets' thumbnail */\n\tTSharedPtr<SWidget> GetThumbnailOverlay(const FAssetData& AssetData) const override;\n\t// End of IAssetTypeActions interface\n\nprotected:\n\t// FAssetTypeActions_Base interface\n\t/** Returns additional tooltip information for the specified asset, if it has any (otherwise return the null widget) */\n\tFText GetAssetDescription(const FAssetData& AssetData) const override;\n\nprivate:\n\t/** Indicates the category used for this class */\n\tEAssetTypeCategories::Type AssetCategory;\n};\n\n// For USoItemTemplateShard\nclass FAssetTypeActions_SoShardItem : public FAssetTypeActions_SoItemTemplate\n{\npublic:\n\tFAssetTypeActions_SoShardItem(EAssetTypeCategories::Type InAssetCategory) : FAssetTypeActions_SoItemTemplate(InAssetCategory) {}\n\tFText GetName() const override { return FText::FromString(TEXT(\"Shard Item\")); }\n\tUClass* GetSupportedClass() const override { return USoItemTemplateShard::StaticClass(); }\n};\n\n// For USoQuestItemTemplate\nclass FAssetTypeActions_SoQuestItem : public FAssetTypeActions_SoItemTemplate\n{\npublic:\n\tFAssetTypeActions_SoQuestItem(EAssetTypeCategories::Type InAssetCategory) : FAssetTypeActions_SoItemTemplate(InAssetCategory) {}\n\tFText GetName() const override { return FText::FromString(TEXT(\"Quest Item\")); }\n\tUClass* GetSupportedClass() const override { return USoQuestItemTemplate::StaticClass(); }\n};\n\n// For USoItemTemplateQuestBook\nclass FAssetTypeActions_SoItemTemplateQuestBook : public FAssetTypeActions_SoItemTemplate\n{\npublic:\n\tFAssetTypeActions_SoItemTemplateQuestBook(EAssetTypeCategories::Type InAssetCategory) : FAssetTypeActions_SoItemTemplate(InAssetCategory) {}\n\tFText GetName() const override { return FText::FromString(TEXT(\"Quest Book\")); }\n\tUClass* GetSupportedClass() const override { return USoItemTemplateQuestBook::StaticClass(); }\n};\n\n// For USoItemTemplateJewelry\nclass FAssetTypeActions_SoItemTemplateJewelry : public FAssetTypeActions_SoItemTemplate\n{\npublic:\n\tFAssetTypeActions_SoItemTemplateJewelry(EAssetTypeCategories::Type InAssetCategory) : FAssetTypeActions_SoItemTemplate(InAssetCategory) {}\n\tFText GetName() const override { return FText::FromString(TEXT(\"Jewelry\")); }\n\tUClass* GetSupportedClass() const override { return USoItemTemplateJewelry::StaticClass(); }\n};\n\n\n// For USoUsableItemTemplate\nclass FAssetTypeActions_SoUsableItem : public FAssetTypeActions_SoItemTemplate\n{\npublic:\n\tFAssetTypeActions_SoUsableItem(EAssetTypeCategories::Type InAssetCategory) : FAssetTypeActions_SoItemTemplate(InAssetCategory) {}\n\tFText GetName() const override { return FText::FromString(TEXT(\"Usable Item\")); }\n\tUClass* GetSupportedClass() const override { return USoUsableItemTemplate::StaticClass(); }\n};\n\n// For USoWeaponTemplate\nclass FAssetTypeActions_SoWeaponItem : public FAssetTypeActions_SoItemTemplate\n{\npublic:\n\tFAssetTypeActions_SoWeaponItem(EAssetTypeCategories::Type InAssetCategory) : FAssetTypeActions_SoItemTemplate(InAssetCategory) {}\n\tFText GetName() const override { return FText::FromString(TEXT(\"Weapon Item\")); }\n\tUClass* GetSupportedClass() const override { return USoWeaponTemplate::StaticClass(); }\n};\n\n\n// For USoItemTemplateRuneStone\nclass FAssetTypeActions_SoRuneStone : public FAssetTypeActions_SoItemTemplate\n{\npublic:\n\tFAssetTypeActions_SoRuneStone(EAssetTypeCategories::Type InAssetCategory) : FAssetTypeActions_SoItemTemplate(InAssetCategory) {}\n\tFText GetName() const override { return FText::FromString(TEXT(\"Rune Stone\")); }\n\tUClass* GetSupportedClass() const override { return USoItemTemplateRuneStone::StaticClass(); }\n};\n"
  },
  {
    "path": "Source/SOrbEditor/Public/Factories/SoCharacterStrikeFactory.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#pragma once\n#include \"Factories/Factory.h\"\n\n#include \"SoCharacterStrikeFactory.generated.h\"\n\n/**\n * Factory for character strikes - this way they can be created in content browser\n */\nUCLASS()\nclass SORBEDITOR_API USoCharacterStrikeFactory : public UFactory\n{\n\tGENERATED_BODY()\n\npublic:\n\tUSoCharacterStrikeFactory(const FObjectInitializer& ObjectInitializer);\n\n\tUObject* FactoryCreateNew(UClass* Class, UObject* InParent, FName Name, EObjectFlags Flags, UObject* Context, FFeedbackContext* Warn) override;\n};\n"
  },
  {
    "path": "Source/SOrbEditor/Public/Factories/SoItemFactory.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#pragma once\n\n#include \"Factories/Factory.h\"\n#include \"SoItemFactory.generated.h\"\n\nclass USoItemTemplate;\n\n/**\n * Factory for items - this way they can be created in content browser\n */\nUCLASS()\nclass SORBEDITOR_API USoItemFactory : public UFactory\n{\n\tGENERATED_BODY()\n\npublic:\n\tUSoItemFactory(const FObjectInitializer& ObjectInitializer);\n\n\t// UFactory interface\n\t/** Opens a dialog to configure the factory properties. Return false if user opted out of configuring properties */\n\tbool ConfigureProperties() override;\n\n\tUObject* FactoryCreateNew(UClass* Class, UObject* InParent, FName Name, EObjectFlags Flags, UObject* Context,\n\t\t\t\t\t\t\t  FFeedbackContext* Warn) override;\n\nprivate:\n\t// Holds the template of the item class we are building\n\tUPROPERTY()\n\tTSubclassOf<USoItemTemplate> ItemTemplateClass;\n};\n"
  },
  {
    "path": "Source/SOrbEditor/Public/SOrbEditorModule.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#pragma once\n\n#include \"Modules/ModuleInterface.h\"\n#include \"Logging/LogCategory.h\"\n#include \"IAssetTypeActions.h\"\n#include \"AssetTypeCategories.h\"\n#include \"SoEditorUtilitiesTypes.h\"\n#include \"Containers/Ticker.h\"\n\nclass FLightingBuildOptions;\nclass FToolBarBuilder;\nclass FExtender;\nclass STextBlock;\nclass FUICommandList;\n\nDECLARE_LOG_CATEGORY_EXTERN(LogSoEditor, All, All)\n\nenum class ESoLightBuildStatus : uint8\n{\n\tNone = 0,\n\n\tLoading_WaitLevelChange,\n\n\tBuilding,\n\tFailed,\n\tSucceeded,\n\tSucceeded_Wait\n};\n\nenum class ESoBuildAllType : uint8\n{\n\tAll = 0,\n\n\tAllEpisodes,\n\tAllChapters,\n\n\t// Build only one chapter\n\tOnlyLevelsInChapter\n};\n\n\nclass FSOrbEditorModule : public IModuleInterface, public FTickerObjectBase\n{\n\ttypedef FSOrbEditorModule Self;\npublic:\n\t/** IModuleInterface implementation */\n\tvoid StartupModule() override;\n\tvoid ShutdownModule() override;\n\n\tbool IsTickable() const;\n\tbool Tick(float DeltaTime) override;\n\n\tstatic bool SaveAllItems();\n\tstatic bool SaveAllEffectInstances();\n\tstatic bool SaveAllCharacterStrikes();\n\nprotected:\n\n\tstatic void LoadCameraData();\n\tstatic bool CanLoadCameraData() { return true; }\n\n\tstatic void SaveCameraData();\n\tstatic bool CanSaveCameraData() { return true; }\n\n\tstatic void RebuildEnemyGroups();\n\tstatic bool CanRebuildEnemyGroups() { return true; }\n\n\tvoid CopyActorsToClipboard();\n\tbool CanCopyActorsToClipboard() const { return true;  }\n\n\tstatic void ToggleSplinePositionCorrection();\n\tstatic bool CanToggleSplinePositionCorrection() { return true; }\n\tstatic bool IsSplinePositionCorrectionEnabled() { return bIsSplinePositionCorrectionEnabled; }\n\n\tstatic void ToggleDisplayCameraKeys();\n\tstatic bool CanToggleDisplayCameraKeys() { return true; }\n\tstatic bool IsDisplayCameraKeysEnabled();\n\n\tstatic void OnModuleChanged(FName ModuleName, EModuleChangeReason ChangeReason);\n\n\t/** Handle clicking on save all dialogues. */\n\tstatic void HandleOnSaveAllItems();\n\tstatic void HandleOnSaveAllEffectInstances();\n\tstatic void HandleOnSaveAllCharacterStrikes();\n\n\n\t// Loads all the USoItemTemplate\n\tvoid LoadAllItems();\n\n\t/** Extends the Top Toolbar */\n\tvoid ExtendToolbar();\n\n\t/** Extend the Menus of the editor */\n\tvoid ExtendMenu();\n\n\t// Set lights build presets\n\tbool SetChapterLevelsPresetTo(int32 ChapterPresetIndex, const int32 LevelsPresetIndex);\n\tbool SetChapterPresetTo(int32 ChapterPresetIndex);\n\tbool SetEpisodePresetTo(int32 EpisodePresetIndex);\n\tbool SetPersistentMapName(const FString& MapPackageName);\n\tbool SetSkyPresetTo(FName SkyName);\n\tvoid LogCurrentBuildPreset();\n\tvoid LoadBuildPresets();\n\tvoid AddNotificationBar(FToolBarBuilder& ToolBarBuilder);\n\tTSharedRef<SWidget> GenerateBuildPresetsMenu();\n\tvoid UpdateNotificationWidgets();\n\n\t// Build all, lights, geometry etc\n\tstatic void ConfigureLightingBuildOptions(const FLightingBuildOptions& Options);\n\n\tbool ConfirmUserBuildQuestion(const FString& Body);\n\tvoid RunEditorBuildAll();\n\tvoid PreStartBuild();\n\n\t// Episodes\n\tvoid StartBuildAllEpisodes(bool bAskConfirmation);\n\tvoid BuildCurrentEpisode();\n\tvoid FinishedBuildNextEpisode();\n\n\t// Chapters\n\tvoid StartBuildAllChapters(bool bAskConfirmation);\n\tvoid BuildCurrentChapter();\n\tvoid FinishedBuildNextChapter();\n\n\t// General methods for ALL\n\tvoid StartBuildAll();\n\tbool CanStartLightBuild() const;\n\tvoid FinishedBuildNext();\n\n\tvoid OnFinishedBuildingEpisodes();\n\tvoid OnFinishedBuildingChapters();\n\tvoid OnMapOpened(const FString&  Filename, bool bAsTemplate);\n\tvoid OnLightBuildStarted();\n\tvoid OnLightBuildFailed();\n\tvoid OnLightBuildSucceeded();\n\tvoid OnLightingBuildKept();\n\tvoid SubscribeToLightBuildEvents();\n\tvoid UnsubscribeFromLightBuildEvents();\n\tvoid ResetBuildSettings();\n\nprotected:\n\t// Hold the value of TSC check status.\n\tstatic bool bIsSplinePositionCorrectionEnabled;\n\n\t/** Hold reference to all the toolbar buttons */\n\tTSharedPtr<FUICommandList> CommandList;\n\n\t/** All created asset type actions. Cached here so that we can unregister them during shutdown. */\n\tTArray<TSharedPtr<IAssetTypeActions>> CreatedAssetTypeActions;\n\n\t/**\n\t * File menu Editor commands bound from this plugin.\n\t */\n\tTSharedPtr<FUICommandList> FileMenuEditorCommands;\n\n\t/** The submenu type of  for the sorb assets. */\n\tEAssetTypeCategories::Type WarriorbAssetCategoryBit;\n\n\t/** Holds all the build presets */\n\tFSoEditorBuildPresets BuildPresets;\n\n\t// Widgets\n\tTSharedPtr<FExtender> NotificationBarExtender;\n\tTSharedPtr<FExtender> ToolbarGameExtender;\n\n\tbool bShowNotificationBar = false;\n\tTSharedPtr<STextBlock> WidgetTextBuildType;\n\tTSharedPtr<STextBlock> WidgetTextBuildInfo;\n\tTSharedPtr<STextBlock> WidgetTextMap;\n\n\t// The current preset\n\tESoLightBuildStatus LightStatus = ESoLightBuildStatus::None;\n\tESoBuildAllType BuildAllType = ESoBuildAllType::All;\n\tint32 PreviousChapterIndexBuildPreset = INDEX_NONE;\n\tint32 ChapterIndexBuildPreset = INDEX_NONE;\n\tint32 ChapterLevelIndexBuildPreset = INDEX_NONE;\n\tint32 EpisodeIndexBuildPreset = INDEX_NONE;\n\n\t// Used when BuildAllType ==  ESoBuildAllType::OnlyLevelsInChapter\n\tint32 ChapterIndexToBuild = INDEX_NONE;\n\n\tbool bIsUsingChapterPreset = true;\n\tbool bSubscribedToLightEvents = false;\n\n\tfloat AfterLightCurrentSeconds = 0.f;\n\tstatic constexpr float AfterLightWaitSeconds = 5.f;\n\n\t// Old Values we used to modify\n\tbool bOldAutoApplyLightingEnable = false;\n\tbool bOldAutoSaveEnable = false;\n\n};\n"
  },
  {
    "path": "Source/SOrbEditor/Public/SoAnimGraphNode_SetBoneWorldPos.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#pragma once\n\n#include \"AnimGraphNode_SkeletalControlBase.h\"\n\n// game:\n#include \"Anim/SoAnimNode_SetBoneWorldPos.h\"\n\n#include \"SoAnimGraphNode_SetBoneWorldPos.generated.h\"\n\n\n/**\n *\n */\nUCLASS()\nclass SORBEDITOR_API USoAnimGraphNode_SetBoneWorldPos : public UAnimGraphNode_SkeletalControlBase\n{\n\tGENERATED_BODY()\n\n\tUPROPERTY(EditAnywhere, Category = Settings)\n\tFSoAnimNode_SetBoneWorldPos Node;\n\npublic:\n\t// UEdGraphNode interface\n\tvirtual FText GetTooltipText() const override;\n\t// End of UEdGraphNode interface\n\nprotected:\n\t// Returns the short descriptive name of the controller\n\tvirtual FText GetControllerDescription() const override;\n\tvirtual const FSoAnimNode_SetBoneWorldPos* GetNode() const override { return &Node; }\n\n};\n"
  },
  {
    "path": "Source/SOrbEditor/Public/SoEditorUtilities.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#pragma once\n\n#include \"IAssetTypeActions.h\"\n\nclass ASoSky;\nclass ULevelStreaming;\nclass ULevel;\nclass USoItemTemplate;\nclass USoEffectBase;\nclass USoCharacterStrike;\n\n/**\n * Holds all the common functionality used by the SOrbEditor plugin\n */\nclass FSoEditorUtilities\n{\npublic:\n\t/***\n\t * Pops up a class picker dialog to choose the class that is a child of the Classprovided.\n\t *\n\t * @param\tTitleText\t\tThe title of the class picker dialog\n\t * @param\tOutChosenClass  The class chosen (if this function returns false, this will be null) by the the user\n\t * @param\tClass\t\t\tThe children of this class we are displaying and prompting the user to choose from.\n\t *\n\t * @return true if OK was pressed, false otherwise\n\t */\n\tstatic bool PickChildrenOfClass(const FText& TitleText, UClass*& OutChosenClass, UClass* Class);\n\n\t/**\n\t * Gets the asset type actions for the specified UClass\n\t *\n\t * @param Class\t\tThe class we are trying to get the asset type action for.\n\t *\n\t * @return The shared pointer to t h AssetTypeAction corresponding for the class\n\t */\n\tstatic TSharedPtr<IAssetTypeActions> GetAssetTypeActionsForClass(UClass* Class);\n\n\t// This is copied from  FEditorBuildUtils::EditorBuild only that it has no warnings\n\tstatic void EditorBuildAll(UWorld* InWorld);\n\n\t/** Saves all the dirty packages in the editor. */\n\tstatic bool SaveAllDirtyPackages(const int32 NumAttemptsSave = 6);\n\n\t/** Waits for all the levels in the editor to load. */\n\tstatic void WaitForLevelsInEditorToLoad();\n\n\tstatic bool IsAnyLevelInWorldLoading(const UWorld* World);\n\n\t/** Makes the levels inside LevelNamesToBeVisible to be visible.  */\n\tstatic bool MakeEditorLevelsVisible(const TArray<FName>& LevelNamesToBeVisible, FString& OutErrorMessage, bool bHideLevelsNotInArray = true);\n\tstatic bool MakeAllEditorLevelsVisible(FString& OutErrorMessage);\n\n\tstatic void MarkAllLevelsToBeLoaded();\n\n\tstatic UWorld* GetEditorWorld();\n\n\t/** Gets the ASoSky from the Editor world. */\n\tstatic bool GetEditorSoSky(ASoSky*& OutSky, FString& OutErrorMessage);\n\n\t// Adds an error notification\n\tstatic void AddNotificationError(const FString& ErrorMessage);\n\n\tstatic FString GetLevelShortName(const ULevelStreaming* StreamingLevel);\n\tstatic FString GetLevelShortName(const ULevel* Level);\n\n\tstatic FString GetLongPackageNameFromObject(const UObject* Object);\n\n\t// Loads and gets\n\tstatic TArray<USoItemTemplate*> GetAllItemsFromMemory();\n\tstatic int32 LoadAllItemsIntoMemory();\n\n\tstatic TArray<USoCharacterStrike*> GetAllCharacterStrikesFromMemory();\n\tstatic int32 LoadAllCharacterStrikesIntoMemory();\n\n\t// NOTE: most of these are blueprints\n\tstatic TArray<UObject*> GetAllEffectInstances();\n\nprivate:\n\tFSoEditorUtilities() = delete;\n};\n"
  },
  {
    "path": "Source/SOrbEditor/Public/SoEditorUtilitiesTypes.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#pragma once\n\n#include \"ClassViewerFilter.h\"\n#include \"IAssetTypeActions.h\"\n\n#include \"SoEditorUtilitiesTypes.generated.h\"\n\nclass ASoSky;\nclass ULevelStreaming;\nclass ULevel;\n\n\nUSTRUCT()\nstruct FSoEditorChapterBuildPresetLevels\n{\n\tGENERATED_USTRUCT_BODY()\n\npublic:\n\tFString ToString(const bool bWithSky = true) const;\n\npublic:\n\t// Sky preset used\n\tUPROPERTY()\n\tFName SkyPreset;\n\n\t// Levels to be visible\n\tUPROPERTY()\n\tTArray<FName> Levels;\n\n\t// Should we save before entering this task\n\tUPROPERTY()\n\tbool bSaveAllDirtyPackagesBefore = false;\n};\n\n\nUSTRUCT()\nstruct FSoEditorChapterBuildPreset\n{\n\tGENERATED_USTRUCT_BODY()\n\npublic:\n\tFString ToString(const FString Prefix = TEXT(\"\"), const FString PrefixArray = TEXT(\"\\t\")) const;\n\npublic:\n\tUPROPERTY()\n\tFName ChapterPackageName;\n\n\tUPROPERTY()\n\tTArray<FSoEditorChapterBuildPresetLevels> LevelPresets;\n};\n\n\nUSTRUCT()\nstruct FSoEditorEpisodeBuildPreset\n{\n\tGENERATED_USTRUCT_BODY()\n\npublic:\n\tFString ToString() const;\n\npublic:\n\tUPROPERTY()\n\tFName EpisodePackageName;\n};\n\nUSTRUCT()\nstruct FSoEditorBuildPresets\n{\n\tGENERATED_USTRUCT_BODY()\npublic:\n\tFString ToString(const FString PrefixArray = TEXT(\"\\t\")) const;\n\tFString ToStringEpisodes(const FString PrefixArray = TEXT(\"\\t\")) const;\n\tFString ToStringChapters(const FString PrefixArray = TEXT(\"\\t\")) const;\n\npublic:\n\t// Custom Maps presets\n\tUPROPERTY()\n\tTArray<FSoEditorEpisodeBuildPreset> EpisodePresets;\n\n\t// Chapter presets\n\tUPROPERTY()\n\tTArray<FSoEditorChapterBuildPreset> ChapterPresets;\n};\n\n\n/** Filter used in the class picker to only show non abstract children of class  */\nclass FSoChildrenOfClassFilterViewer : public IClassViewerFilter\n{\npublic:\n\t/** All children of these classes will be included unless filtered out by another setting. */\n\tTSet<const UClass*> AllowedChildrenOfClasses;\n\n\tbool IsClassAllowed(const FClassViewerInitializationOptions& InInitOptions, const UClass* InClass,\n\t\tTSharedRef<FClassViewerFilterFuncs> InFilterFuncs) override\n\t{\n\t\treturn !InClass->HasAnyClassFlags(DisallowedClassFlags)\n\t\t\t&& InFilterFuncs->IfInChildOfClassesSet(AllowedChildrenOfClasses, InClass) != EFilterReturn::Failed;\n\t}\n\n\tbool IsUnloadedClassAllowed(const FClassViewerInitializationOptions& InInitOptions,\n\t\tconst TSharedRef<const IUnloadedBlueprintData > InUnloadedClassData,\n\t\tTSharedRef< FClassViewerFilterFuncs > InFilterFuncs) override\n\t{\n\t\treturn !InUnloadedClassData->HasAnyClassFlags(DisallowedClassFlags)\n\t\t\t&& InFilterFuncs->IfInChildOfClassesSet(AllowedChildrenOfClasses, InUnloadedClassData) != EFilterReturn::Failed;\n\t}\n\nprivate:\n\t/** Disallowed class flags. */\n\tEClassFlags DisallowedClassFlags = CLASS_Abstract | CLASS_Deprecated | CLASS_NewerVersionExists;\n};\n"
  },
  {
    "path": "Source/SOrbEditor/Public/SoGameEditorEngine.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#pragma once\n\n#include \"Editor/UnrealEdEngine.h\"\n#include \"SoGameEditorEngine.generated.h\"\n\n\n/**\n * Custom Game Editor Engine functionality.\n * For runtime engine functionality see USoGameEngine.\n */\nUCLASS()\nclass USoGameEditorEngine : public UUnrealEdEngine\n{\n\tGENERATED_BODY()\npublic:\n\tUSoGameEditorEngine(const FObjectInitializer& ObjectInitializer);\n\n\t// UEngine interface\n\n\t// Only executed when the Editor is closed.\n\tvoid PreExit() override;\n\tvoid WorldAdded(UWorld* World) override;\n\tvoid WorldDestroyed(UWorld* InWorld) override;\n};\n"
  },
  {
    "path": "Source/SOrbEditor/SOrbEditor.Build.cs",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\nusing System;\nusing System.IO;\nusing UnrealBuildTool;\n\npublic class SOrbEditor : ModuleRules\n{\n\tpublic SOrbEditor(ReadOnlyTargetRules Target) : base(Target)\n\t{\n\t\tConsole.WriteLine(\"Using SOrbEditor.Build.cs\");\n\n\t\t// Enable IWYU\n\t\t// https://docs.unrealengine.com/latest/INT/Programming/UnrealBuildSystem/IWYUReferenceGuide/index.html\n\t\tPCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs;\n\t\tbEnforceIWYU = true;\n\n\t\t// MinFilesUsingPrecompiledHeaderOverride = 1;\n\t\tbFasterWithoutUnity = false;\n\t\t//PrivatePCHHeaderFile = \"Public/SOrbEditor.h\";\n\n\t\tPublicDependencyModuleNames.AddRange(new string[] {\n\t\t\t\"Core\",\n\t\t\t\"CoreUObject\",\n\t\t\t\"Engine\",\n\t\t\t\"Json\",\n\t\t\t\"AnimGraph\",\n\t\t\t\"BlueprintGraph\",\n\t\t\t\"UnrealEd\",\n\n\t\t\t\"SOrb\"\n\t\t});\n\n\t\tPrivateDependencyModuleNames.AddRange(new string[] {\n\t\t\t\"InputCore\",\n\t\t\t\"SlateCore\",\n\t\t\t\"Slate\",\n\t\t\t\"EditorStyle\",\n\t\t\t\"LevelEditor\",\n\t\t\t\"EditorScriptingUtilities\",\n\t\t\t\"ContentBrowser\",\n\t\t\t\"AssetRegistry\",\n\n\t\t\t\"DlgSystem\",\n\t\t\t\"NotYetEditorMode\"\n\t\t});\n\n\t\tPrivateIncludePathModuleNames.AddRange(new string[] { \"AssetTools\" });\n\n\t\tPublicIncludePaths.AddRange(\n\t\t\tnew string[] {\n\t\t\t\tPath.Combine(ModuleDirectory)\n\t\t\t});\n\n\t\t// Uncomment if you are using Slate UI\n\t\t// PrivateDependencyModuleNames.AddRange(new string[] { \"Slate\", \"SlateCore\" });\n\n\t\t// Uncomment if you are using online features\n\t\t// PrivateDependencyModuleNames.Add(\"OnlineSubsystem\");\n\t\t// if ((Target.Platform == UnrealTargetPlatform.Win32) || (Target.Platform == UnrealTargetPlatform.Win64))\n\t\t// {\n\t\t//\t\tif (UEBuildConfiguration.bCompileSteamOSS == true)\n\t\t//\t\t{\n\t\t//\t\t\tDynamicallyLoadedModuleNames.Add(\"OnlineSubsystemSteam\");\n\t\t//\t\t}\n\t\t// }\n\t}\n}\n"
  },
  {
    "path": "Source/SoBeforeGame/Private/SoBeforeGameModule.cpp",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n#include \"SoBeforeGameModule.h\"\n\n#include \"Modules/ModuleManager.h\"\n#include \"Internationalization/StringTableRegistry.h\"\n#include \"Misc/Paths.h\"\n\n#include \"SoLocalization.h\"\n\nDEFINE_LOG_CATEGORY_STATIC(LogSoBeforeGameModule, All, All)\n\n// NOTE: the name (third param) seems to be deprecated\nIMPLEMENT_GAME_MODULE(FSoBeforeGameModule, SoBeforeGame);\n\n// https://stackoverflow.com/questions/27490858/how-can-you-compare-two-character-strings-statically-at-compile-time/27491087#27491087\nconstexpr bool strings_equal(char const * a, char const * b) {\n\treturn *a == *b && (*a == '\\0' || strings_equal(a + 1, b + 1));\n}\n#define COMPILE_CHECK_STRING_TABLE_ID(MacroValue, TruthValue) \\\n\tstatic_assert(strings_equal(MacroValue, TruthValue),  \"Invalid String Table ID. Check the line number\")\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSoBeforeGameModule::StartupModule()\n{\n\tUE_LOG(LogSoBeforeGameModule, Log, TEXT(\"StartupModule\"));\n\n\tFModuleManager::Get().OnModulesChanged().AddLambda([this](FName ModuleName, EModuleChangeReason Reason)\n\t{\n\t\tif (ModuleName == TEXT(\"AssetRegistry\") && Reason == EModuleChangeReason::ModuleLoaded)\n\t\t{\n\t\t\tInitStringTables();\n\t\t}\n\t});\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSoBeforeGameModule::ShutdownModule()\n{\n\tUE_LOG(LogSoBeforeGameModule, Log, TEXT(\"ShutdownModule\"));\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\nvoid FSoBeforeGameModule::InitStringTables()\n{\n\t// Problems depending on loading phase:\n\t// - PostConfigInit - live string  reload does not work in editor mode\n\t// - PreEarlyLoadingScreen - We get warnings in packaged game, but everything seems to work\n\t//\n\t// --- DOES NOT WORK ---\n\t// So because we are in PostConfigInit and the directory watcher does not fire in the constructor of FStringTableRegistry\n\t// because GIsEditor is still false at this point.\n\t//\n\t// So we temporarily set GIsEditor to true if compiled with WITH_EDITOR\n\t//\n\t// Because: InitEngineTextLocalization needs to fire first\n\t// --- DOES NOT WORK ---\n\t//\n\t//\n\t// What works if we init our tables right before ProcessNewlyLoadedUObjects() from LaunchEngineLoop.cpp\n\t// Is what causes errors because of the default objects.\n\t// The module right before is AssetRegistry\n\t//\n\n\t// Most likely will fail\n// #if WITH_EDITOR\n// \tif (!GIsEditor)\n// \t{\n// \t\tUE_LOG(LogSoBeforeGameModule, Error, TEXT(\"InitStringTables: GIsEditor = false but WITH_EDITOR = true\"));\n// \t}\n// #endif\n\n\t// Init the constructor and directory watcher\n\tstatic FStringTableRegistry& TableRegistry = FStringTableRegistry::Get();\n\n\t// Restore\n// #if WITH_EDITOR\n// \tGIsEditor = bIsEditorPreviousValue;\n// #endif\n\n\t// Register String tables that are not already registered\n\tUE_LOG(LogSoBeforeGameModule, Log, TEXT(\"InitStringTables\"));\n\tif (!TableRegistry.FindStringTable(STRING_TABLE_UI_TEXT).IsValid())\n\t{\n\t\tCOMPILE_CHECK_STRING_TABLE_ID(STRING_TABLE_UI, \"UI\");\n\t\tLOCTABLE_FROMFILE_GAME(STRING_TABLE_UI, \"UI\", \"Localization/StringTables/UI.csv\");\n\t}\n\n\tif (!TableRegistry.FindStringTable(STRING_TABLE_INTERACTION_TEXT).IsValid())\n\t{\n\t\tCOMPILE_CHECK_STRING_TABLE_ID(STRING_TABLE_INTERACTION, \"Interaction\");\n\t\tLOCTABLE_FROMFILE_GAME(STRING_TABLE_INTERACTION, \"Interaction\", \"Localization/StringTables/Interaction.csv\");\n\t}\n\n\tif (!TableRegistry.FindStringTable(STRING_TABLE_DIALOGUE_TEXT).IsValid())\n\t{\n\t\tCOMPILE_CHECK_STRING_TABLE_ID(STRING_TABLE_DIALOGUE, \"Dialogue\");\n\t\tLOCTABLE_FROMFILE_GAME(STRING_TABLE_DIALOGUE, \"Dialogue\", \"Localization/StringTables/Dialogue.csv\");\n\t}\n\n\tif (!TableRegistry.FindStringTable(STRING_TABLE_ITEMS_TEXT).IsValid())\n\t{\n\t\tCOMPILE_CHECK_STRING_TABLE_ID(STRING_TABLE_ITEMS, \"Items\");\n\t\tLOCTABLE_FROMFILE_GAME(STRING_TABLE_ITEMS, \"Items\", \"Localization/StringTables/Items.csv\");\n\t}\n\n\tif (!TableRegistry.FindStringTable(STRING_TABLE_SPELLS_TEXT).IsValid())\n\t{\n\t\tCOMPILE_CHECK_STRING_TABLE_ID(STRING_TABLE_SPELLS, \"Spells\");\n\t\tLOCTABLE_FROMFILE_GAME(STRING_TABLE_SPELLS, \"Spells\", \"Localization/StringTables/Spells.csv\");\n\t}\n\n\tif (!TableRegistry.FindStringTable(STRING_TABLE_AREAS_TEXT).IsValid())\n\t{\n\t\tCOMPILE_CHECK_STRING_TABLE_ID(STRING_TABLE_AREAS, \"Areas\");\n\t\tLOCTABLE_FROMFILE_GAME(STRING_TABLE_AREAS, \"Areas\", \"Localization/StringTables/Areas.csv\");\n\t}\n\n\tif (!TableRegistry.FindStringTable(STRING_TABLE_ENEMIES_TEXT).IsValid())\n\t{\n\t\tCOMPILE_CHECK_STRING_TABLE_ID(STRING_TABLE_ENEMIES, \"Enemies\");\n\t\tLOCTABLE_FROMFILE_GAME(STRING_TABLE_ENEMIES, \"Enemies\", \"Localization/StringTables/Enemies.csv\");\n\t}\n\n\tif (!TableRegistry.FindStringTable(STRING_TABLE_EPISODES_TEXT).IsValid())\n\t{\n\t\tCOMPILE_CHECK_STRING_TABLE_ID(STRING_TABLE_EPISODES, \"Episodes\");\n\t\tLOCTABLE_FROMFILE_GAME(STRING_TABLE_EPISODES, \"Episodes\", \"Localization/StringTables/Episodes.csv\");\n\t}\n\n\tif (!TableRegistry.FindStringTable(STRING_TABLE_FLOATING_ENEMY_AND_NPC_LINES_TEXT).IsValid())\n\t{\n\t\tCOMPILE_CHECK_STRING_TABLE_ID(STRING_TABLE_FLOATING_ENEMY_AND_NPC_LINES, \"FloatingEnemyAndNPCLines\");\n\t\tLOCTABLE_FROMFILE_GAME(STRING_TABLE_FLOATING_ENEMY_AND_NPC_LINES, \"FloatingEnemyAndNPCLines\", \"Localization/StringTables/FloatingEnemyAndNPCLines.csv\");\n\t}\n\n\tif (!TableRegistry.FindStringTable(STRING_TABLE_CREDITS_TEXT).IsValid())\n\t{\n\t\tCOMPILE_CHECK_STRING_TABLE_ID(STRING_TABLE_CREDITS, \"Credits\");\n\t\tLOCTABLE_FROMFILE_GAME(STRING_TABLE_CREDITS, \"Credits\", \"Localization/StringTables/Credits.csv\");\n\t}\n}\n\n#undef COMPILE_CHECK_STRING_TABLE_ID\n"
  },
  {
    "path": "Source/SoBeforeGame/Public/SoBeforeGameModule.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#pragma once\n\n#include \"Logging/LogMacros.h\"\n#include \"Modules/ModuleInterface.h\"\n#include \"Modules/ModuleManager.h\"\n\nconst FName SO_BEFORE_GAME_MODULE_NAME(TEXT(\"SoBeforeGame\"));\n\nclass SOBEFOREGAME_API FSoBeforeGameModule : public IModuleInterface\n{\npublic:\n\tvoid StartupModule() override;\n\tvoid ShutdownModule() override;\n\tbool IsGameModule() const override\n\t{\n\t\treturn true;\n\t}\n\n\tstatic FSoBeforeGameModule& Get() { return FModuleManager::LoadModuleChecked<FSoBeforeGameModule>(SO_BEFORE_GAME_MODULE_NAME); }\n\tstatic bool IsAvailable() { return FModuleManager::Get().IsModuleLoaded(SO_BEFORE_GAME_MODULE_NAME); }\n\n\tvoid InitStringTables();\n\nprotected:\n\tbool bInitStringTables = false;\n};\n"
  },
  {
    "path": "Source/SoBeforeGame/Public/SoLocalization.h",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\n#pragma once\n\n#include \"CoreMinimal.h\"\n#include \"Internationalization/Text.h\"\n\n// Define string tables\n#define STRING_TABLE_UI \"UI\"\n#define STRING_TABLE_UI_TEXT TEXT(STRING_TABLE_UI)\n\n#define STRING_TABLE_INTERACTION \"Interaction\"\n#define STRING_TABLE_INTERACTION_TEXT TEXT(STRING_TABLE_INTERACTION)\n\n#define STRING_TABLE_DIALOGUE \"Dialogue\"\n#define STRING_TABLE_DIALOGUE_TEXT TEXT(STRING_TABLE_DIALOGUE)\n\n#define STRING_TABLE_ITEMS \"Items\"\n#define STRING_TABLE_ITEMS_TEXT TEXT(STRING_TABLE_ITEMS)\n\n#define STRING_TABLE_SPELLS \"Spells\"\n#define STRING_TABLE_SPELLS_TEXT TEXT(STRING_TABLE_SPELLS)\n\n#define STRING_TABLE_AREAS \"Areas\"\n#define STRING_TABLE_AREAS_TEXT TEXT(STRING_TABLE_AREAS)\n\n#define STRING_TABLE_ENEMIES \"Enemies\"\n#define STRING_TABLE_ENEMIES_TEXT TEXT(STRING_TABLE_ENEMIES)\n\n#define STRING_TABLE_EPISODES \"Episodes\"\n#define STRING_TABLE_EPISODES_TEXT TEXT(STRING_TABLE_EPISODES)\n\n#define STRING_TABLE_FLOATING_ENEMY_AND_NPC_LINES \"FloatingEnemyAndNPCLines\"\n#define STRING_TABLE_FLOATING_ENEMY_AND_NPC_LINES_TEXT TEXT(STRING_TABLE_FLOATING_ENEMY_AND_NPC_LINES)\n\n#define STRING_TABLE_CREDITS \"Credits\"\n#define STRING_TABLE_CREDITS_TEXT TEXT(STRING_TABLE_CREDITS)\n\n\n// Define helpers for FText::FromStringTable\n#define FROM_STRING_TABLE(InTableId, InKey) FText::FromStringTable(TEXT(InTableId), TEXT(InKey))\n\n#define FROM_STRING_TABLE_UI(InKey) FROM_STRING_TABLE(STRING_TABLE_UI, InKey)\n#define FROM_STRING_TABLE_DIALOGUE(InKey) FROM_STRING_TABLE(STRING_TABLE_DIALOGUE, InKey)\n#define FROM_STRING_TABLE_EPISODES(InKey) FROM_STRING_TABLE(STRING_TABLE_EPISODES, InKey)\n#define FROM_STRING_TABLE_INTERACTION(InKey) FROM_STRING_TABLE(STRING_TABLE_INTERACTION, InKey)\n"
  },
  {
    "path": "Source/SoBeforeGame/SoBeforeGame.Build.cs",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\nusing System;\nusing System.IO;\nusing System.Diagnostics;\nusing System.Collections.Generic;\nusing System.Runtime.InteropServices;\nusing Tools.DotNETCommon;\n\nusing UnrealBuildTool;\n\n\npublic class SoBeforeGame : ModuleRules\n{\n\tpublic SoBeforeGame(ReadOnlyTargetRules Target) : base(Target)\n\t{\n\t\tConsole.WriteLine(\"Using SoBeforeGame.Build.cs\");\n\n\t\t// Enable IWYU\n\t\t// https://docs.unrealengine.com/latest/INT/Programming/UnrealBuildSystem/IWYUReferenceGuide/index.html\n\t\tPCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs;\n\t\tbEnforceIWYU = true;\n\n\t\tPublicIncludePaths.AddRange(\n\t\t\tnew string[] {\n\t\t\t\tPath.Combine(ModuleDirectory, \"Public\")\n\t\t\t\t// ... add public include paths required here ...\n\t\t\t});\n\n\n\t\tPrivateIncludePaths.AddRange(\n\t\t\tnew string[] {\n\t\t\t\tPath.Combine(ModuleDirectory, \"Private\")\n\t\t\t\t// ... add other private include paths required here ...\n\t\t\t});\n\n\t\tPublicDependencyModuleNames.AddRange(new string[] {\n\t\t\t\"Core\",\n\t\t\t\"CoreUObject\",\n\t\t\t\"Engine\",\n\t\t\t\"Json\",\n\t\t});\n\t}\n}\n"
  },
  {
    "path": "Source/Warriorb.Target.cs",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\nusing System;\nusing System.IO;\nusing System.Diagnostics;\nusing System.Collections.Generic;\nusing System.Runtime.InteropServices;\nusing Tools.DotNETCommon;\n\nusing UnrealBuildTool;\n\npublic class WarriorbTarget : TargetRules\n{\n\t// See https://docs.unrealengine.com/en-us/Programming/UnrealBuildSystem/TargetFiles for documentation\n\tpublic WarriorbTarget(TargetInfo Target) : base(Target)\n\t{\n\t\tConsole.WriteLine(\"Using Warriorb.Target.cs\");\n\n\t\tType = TargetType.Game;\n\t\tExtraModuleNames.Add(\"SOrb\");\n\t\t//BuildEnvironment = TargetBuildEnvironment.Unique;\n\n\t\tInit(Target);\n\t}\n\n\tpublic void Init(TargetInfo Target)\n\t{\n\t\tInitFromPlatform(Target.Platform);\n\t\tParseBuildFile();\n\n\t\t// Only enable steam on desktop\n\t\tbUsesSteam = WARRIORB_WITH_STEAM;\n\t\t//if (bUsesSteam)\n\t\t//{\n\t\t//\tEnablePlugins.Add(\"NotYetSteam\");\n\t\t//}\n\t\t//else\n\t\t//{\n\t\t//\tDisablePlugins.Add(\"NotYetSteam\");\n\t\t//}\n\n\t\t// IWYU\n\t\tbIWYU = true;\n\t\tbEnforceIWYU = true;\n\n\t\t// Omits subfolders from public include paths to reduce compiler command line length.\n\t\tbLegacyPublicIncludePaths = false;\n\n\t\t// More Errors\n\t\tbUndefinedIdentifierErrors = true;\n\t\tbShadowVariableErrors = true;\n\n\t\t//WindowsPlatform.CompanyName = \"TestWindows\";\n\t\t//WindowsPlatform.ProductName = \"TestWindows\";\n\t\t//WindowsPlatform.CopyrightNotice = \"TestWindows\";\n\n\t\t// Only on desktop\n\t\tWindowsPlatform.bStrictConformanceMode = IsSupportedDesktopPlatform;\n\t\t// WindowsPlatform.bUseBundledDbgHelp = false;\n\n\t\t// https://twitter.com/kantandev/status/1038037592174981121\n\t\t//bLegacyPublicIncludePaths = false;\n\n\t\t// Whether to turn on checks (asserts) for test/shipping builds.\n\t\t//bUseChecksInShipping = true;\n\t\t//bUseLoggingInShipping = true;\n\n\t\t//bLoggingToMemoryEnabled - true;\n\t\t//bForceEnableExceptions = true;\n\t\t//bForceEnableObjCExceptions = true;\n\t\t//bForceEnableRTTI = true;\n\n\t\t//bForceCompileDevelopmentAutomationTests = true;\n\t\t//bForceCompilePerformanceAutomationTests = true;\n\n\t\t// TODO set UE4_PROJECT_STEAMSHIPPINGID for shipping builds\n\n\t}\n\n\t//\n\t// BEGIN COMMON\n\t//\n\n\t//\n\t// Platform\n\t//\n\n\t// Constant variables because C# is stupid\n\tpublic bool IsSupportedDesktopPlatform = false;\n\tpublic bool IsSupportedConsolePlatform = false;\n\n\tpublic bool IsPlatformWindows64 = false;\n\tpublic bool IsPlatformLinux = false;\n\tpublic bool IsPlatformSwitch = false;\n\tpublic bool IsPlatformXboxOne = false;\n\n\tpublic void InitFromPlatform(UnrealTargetPlatform TargetPlatform)\n\t{\n\t\t// Checks if we can have some flags\n\t\tIsPlatformWindows64 = TargetPlatform == UnrealTargetPlatform.Win64;\n\t\tIsPlatformLinux = TargetPlatform == UnrealTargetPlatform.Linux;\n\t\tIsSupportedDesktopPlatform = IsPlatformWindows64 || IsPlatformLinux;\n\n\t\tIsPlatformSwitch = TargetPlatform == UnrealTargetPlatform.Switch;\n\t\tIsPlatformXboxOne = TargetPlatform == UnrealTargetPlatform.XboxOne;\n\t\tIsSupportedConsolePlatform = IsPlatformXboxOne || IsPlatformSwitch;\n\t}\n\n\t//\n\t// From Build file\n\t//\n\n\tpublic const string WARRIORB_BUILD_FILE_NAME = \"WarriorbBuild.json\";\n\tpublic string ProjectRootPath { get { return ProjectFile.Directory.ToString(); } }\n\tpublic string ProjectSourceDirPath { get { return ProjectRootPath + \"/Source\"; } }\n\tpublic string ProjectConfigDirPath { get { return ProjectRootPath + \"/Config\"; } }\n\tpublic string BuildConfigFilePath { get { return ProjectSourceDirPath + \"/\" + WARRIORB_BUILD_FILE_NAME; } }\n\n\tpublic bool WARRIORB_WITH_STEAM = false;\n\tpublic string WARRIORB_BUILD_VERSION;\n\n\tpublic void ParseBuildFile()\n\t{\n\t\tPrintBlue(String.Format(\"Reading from BuildConfigFile = {0}\", BuildConfigFilePath));\n\t\tvar AllFields = JsonObject.Read(new FileReference(BuildConfigFilePath));\n\t\tvar PublicDefinitionsFields = AllFields.GetObjectField(\"PublicDefinitions\");\n\t\tvar SteamFields = AllFields.GetObjectField(\"Steam\");\n\n\t\tWARRIORB_BUILD_VERSION = AllFields.GetStringField(\"Version\");\n\t\tWARRIORB_WITH_STEAM = SteamFields.GetBoolField(\"IS_ENABLED\");\n\n\t\tif (IsSupportedConsolePlatform)\n\t\t{\n\t\t\t// Aka !IsSupportedDesktopPlatform\n\t\t\tPrintYellow(\"Disabling Steam support because we are building for console\");\n\t\t\tWARRIORB_WITH_STEAM = false;\n\t\t}\n\t}\n\n\t//\n\t// Other\n\t//\n\n\tstatic string IntToString(int value)\n\t{\n\t\treturn value.ToString();\n\t}\n\n\tstatic string BoolToIntString(bool value)\n\t{\n\t\treturn value ? \"1\" : \"0\";\n\t}\n\n\tstatic void PrintBlue(string String)\n\t{\n\t\tConsole.ForegroundColor = ConsoleColor.Blue;\n\t\tConsole.WriteLine(String);\n\t\tConsole.ResetColor();\n\t}\n\n\tstatic void PrintRed(string String)\n\t{\n\t\tConsole.ForegroundColor = ConsoleColor.Red;\n\t\tConsole.WriteLine(String);\n\t\tConsole.ResetColor();\n\t}\n\n\tstatic void PrintGreen(string String)\n\t{\n\t\tConsole.ForegroundColor = ConsoleColor.Green;\n\t\tConsole.WriteLine(String);\n\t\tConsole.ResetColor();\n\t}\n\n\tstatic void PrintYellow(string String)\n\t{\n\t\tConsole.ForegroundColor = ConsoleColor.Yellow;\n\t\tConsole.WriteLine(String);\n\t\tConsole.ResetColor();\n\t}\n\n\t//\n\t// Print out a build message\n\t// Why error? Well, the UE masks all other errors. *shrug*\n\t//\n\tprivate void Trace(string msg)\n\t{\n\t\tLog.TraceInformation(\"Warriorb: \" + msg);\n\t}\n\n\t// Trace helper\n\tprivate void Trace(string format, params object[] args)\n\t{\n\t\tTrace(string.Format(format, args));\n\t}\n\n\t// Raise an error\n\tprivate void Fail(string message)\n\t{\n\t\tTrace(message);\n\t\tthrow new Exception(message);\n\t}\n\n\tpublic static bool IsLinux\n\t{\n\t\tget\n\t\t{\n\t\t   return RuntimeInformation.IsOSPlatform(OSPlatform.Linux);\n\t\t}\n\t}\n\n\tpublic static bool ExistsOnPath(string exeName)\n\t{\n\t\ttry\n\t\t{\n\t\t\tusing (Process p = new Process())\n\t\t\t{\n\t\t\t\tp.StartInfo.CreateNoWindow = true;\n\t\t\t\tp.StartInfo.UseShellExecute = false;\n\t\t\t\tp.StartInfo.RedirectStandardError = true;\n\t\t\t\tp.StartInfo.RedirectStandardOutput = true;\n\t\t\t\tp.StartInfo.FileName = IsLinux ? \"whereis\" : \"where\";\n\t\t\t\tp.StartInfo.Arguments = exeName;\n\t\t\t\tp.Start();\n\t\t\t\tp.WaitForExit();\n\t\t\t\treturn p.ExitCode == 0;\n\t\t\t}\n\t\t}\n\t\tcatch (Exception)\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t}\n\n\tpublic static bool RunCommand(string workingDirectory,  string commandName, string arguments, ref string output)\n\t{\n\t\tusing (Process p = new Process())\n\t\t{\n\t\t\tp.StartInfo.WorkingDirectory = workingDirectory;\n\t\t\tp.StartInfo.CreateNoWindow = true;\n\t\t\tp.StartInfo.UseShellExecute = false;\n\t\t\tp.StartInfo.RedirectStandardError = true;\n\t\t\tp.StartInfo.RedirectStandardOutput = true;\n\t\t\tp.StartInfo.FileName = commandName;\n\t\t\tp.StartInfo.Arguments = arguments;\n\t\t\tp.Start();\n\t\t\toutput = p.StandardOutput.ReadToEnd();\n\t\t\tp.WaitForExit();\n\t\t\treturn p.ExitCode == 0;\n\t\t}\n\t}\n\n\tpublic static bool GetGitBranch(string path, ref string branch)\n\t{\n\t\tif (RunCommand(path, \"git\", \"rev-parse --abbrev-ref HEAD\", ref branch))\n\t\t{\n\t\t\tbranch = branch.Trim();\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\n\tpublic static bool GetGitCommit(string path, ref string commit)\n\t{\n\t\tif (RunCommand(path, \"git\", \"rev-parse --short HEAD\", ref commit))\n\t\t{\n\t\t\tcommit = commit.Trim();\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\n\tpublic bool GetCurrentBranchAndCommit(ref string branch, ref string commit)\n\t{\n\t\t// Try first from git command\n\t\tif (GeBranchAndCommitFromGit(ref branch, ref commit))\n\t\t\treturn true;\n\n\t\t// Use JSON file\n\t\treturn false;\n\t}\n\n\tpublic bool GeBranchAndCommitFromGit(ref string branch, ref string commit)\n\t{\n\t\tif (!ExistsOnPath(\"git\"))\n\t\t{\n\t\t\tPrintYellow(\"git does not exist in path\");\n\t\t\treturn false;\n\t\t}\n\n\t\tPrintBlue(\"Using git\");\n\t\tif (!GetGitBranch(ProjectRootPath, ref branch))\n\t\t{\n\t\t\tPrintRed(\"Can't get git branch\");\n\t\t\treturn false;\n\t\t}\n\t\tif (!GetGitCommit(ProjectRootPath, ref commit))\n\t\t{\n\t\t\tPrintRed(\"Can't get git commit\");\n\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t}\n\n\t//\n\t// END COMMON\n\t//\n}\n"
  },
  {
    "path": "Source/WarriorbBuild.json",
    "content": "{\n    \"Version\": \"1.3.1\",\n    \"Name\": \"WarriOrb\",\n    \"NameDemo\": \"WarriOrbPrologue\",\n    \"DisplayedTitle\": \"INVTEXT(\\\"WarriOrb\\\")\",\n    \"DisplayedTitleDemo\": \"INVTEXT(\\\"WarriOrb: Prologue\\\")\",\n    \"Loading\": {\n        \"Image\": \"/Game/SO/GUI/art/Loading/warriorb_new.warriorb_new\",\n        \"ImageDemo\": \"/Game/SO/GUI/art/Loading/warriorb_new_prologue.warriorb_new_prologue\"\n    },\n    \"Steam\": {\n        \"IS_ENABLED\": true,\n        \"IS_RICH_PRESENCE_ENABLED\": false,\n        \"APP_ID\": 790360,\n        \"APP_ID_DEMO\": 1193760,\n        \"RELAUNCH_IN_STEAM\": true,\n        \"CHECK_IF_LIBRARY_CHECKSUM_MATCHES\": true,\n        \"LIBRARY_WINDOWS_API64_SHA1_SUM\": \"fa732757f9aaa47e8de4ecfcabc07b5df4f0f1cf\"\n    },\n    \"Video\": {\n        \"DEMO\": false,\n        \"INTRO\": true\n    },\n    \"PublicDefinitions\": {\n        \"WARRIORB_DEMO\": false,\n        \"WARRIORB_USE_ASUS_AURA_SDK\": false,\n        \"WARRIORB_ALLOW_CONSOLE_CHEATS_DEFAULT\": false,\n        \"WARRIORB_PASSWORD_ENABLE_CONSOLE_CHEATS\": \"what could it be\",\n        \"WARRIORB_PASSWORD_SAVE_FILE\": \"\"\n    }\n}\n"
  },
  {
    "path": "Source/WarriorbEditor.Target.cs",
    "content": "// Copyright (c) Csaba Molnar & Daniel Butum. All Rights Reserved.\n\nusing System;\nusing System.IO;\nusing UnrealBuildTool;\nusing System.Collections.Generic;\n\npublic class WarriorbEditorTarget : TargetRules\n{\n\tpublic WarriorbEditorTarget(TargetInfo Target) : base(Target)\n\t{\n\t\tConsole.WriteLine(\"Using WarriorbEditor.Target.cs\");\n\n\t\tType = TargetType.Editor;\n\t\tExtraModuleNames.Add(\"SOrb\");\n\t\tExtraModuleNames.Add(\"SOrbEditor\");\n\n\t\tInit(Target);\n\t}\n\n\tpublic void Init(TargetInfo Target)\n\t{\n\t\t// Omits subfolders from public include paths to reduce compiler command line length.\n\t\tbLegacyPublicIncludePaths = false;\n\n\t\t// More Errors\n\t\tbUndefinedIdentifierErrors = true;\n\t\tbShadowVariableErrors = true;\n\n\t\t// Platform specific\n\t\tWindowsPlatform.bStrictConformanceMode = true;\n\t}\n}\n"
  },
  {
    "path": "SourceControlledDevData/Data/AgilityTable.csv",
    "content": ",UpgradeCost,PrimaryValue,SecondaryValue\n0,1,10,5\n1,1,12,10\n2,1,14,10\n3,1,16,15\n4,1,18,15\n5,1,20,20\n6,2,22,20\n7,2,24,20\n8,2,26,25\n9,2,28,25\n10,2,30,25\n11,4,32,30\n12,4,34,30\n13,4,36,30\n14,4,38,30\n15,4,40,35\n16,4,42,35\n17,4,44,35\n18,4,46,35\n19,4,48,40\n20,4,50,40\n21,4,52,40\n22,4,54,40\n23,4,56,45\n24,4,58,45\n25,4,60,45\n26,4,62,45\n27,4,64,45\n28,4,66,50\n29,4,68,50\n30,4,70,50\n"
  },
  {
    "path": "SourceControlledDevData/Data/AttributeValueConnections.csv",
    "content": ",Value,Attribute,AttributeValueType\n0,Health,Vitality,Primary\n1,Stamina,Endurance,Primary\n2,StaminaRegeneration,Endurance,Secondary\n3,DamageBonusSlash,Agility,Primary\n4,BaseAttackSpeed,Agility,Secondary\n5,DamageBonusCrush,Strength,Primary\n6,EquipmentLimit,Strength,Secondary\n7,ResistanceCrush,Resistance,Primary\n8,ResistanceSlash,Resistance,Primary\n9,ResistanceThrust,Resistance,Primary\n10,ResistanceFire,Resistance,Primary\n11,ResistanceWater,Resistance,Primary\n12,ResistanceElectric,Resistance,Primary"
  },
  {
    "path": "SourceControlledDevData/Data/ChangeCosts.csv",
    "content": ",Name,Value\n0,Ability,1\n1,Skill,1\n2,Gold,1\n"
  },
  {
    "path": "SourceControlledDevData/Data/EnduranceTable.csv",
    "content": ",UpgradeCost,PrimaryValue,SecondaryValue\n0,1,10,2\n1,1,12,3\n2,1,14,4\n3,1,16,5\n4,1,18,5\n5,1,20,5\n6,2,22,5\n7,2,24,6\n8,2,26,6\n9,2,28,6\n10,2,30,6\n11,4,32,6\n12,4,34,7\n13,4,36,7\n14,4,38,10\n15,4,40,11\n16,4,42,12\n17,4,43,13\n18,4,44,14\n19,4,44,15\n20,4,45,15\n21,4,45,16\n22,4,46,17\n23,4,46,18\n24,4,47,19\n25,4,47,20\n26,4,48,21\n27,4,48,22\n28,4,49,23\n29,4,49,24\n30,4,50,25\n"
  },
  {
    "path": "SourceControlledDevData/Data/ResistanceTable.csv",
    "content": ",UpgradeCost,PrimaryValue,SecondaryValue\n0,1,0,0\n1,1,2,0\n2,1,4,1\n3,1,6,1\n4,1,8,2\n5,1,10,2\n6,2,12,3\n7,2,14,3\n8,2,16,4\n9,2,18,4\n10,2,20,5\n11,4,22,5\n12,4,24,6\n13,4,26,6\n14,4,28,7\n15,4,30,7\n16,4,32,8\n17,4,34,8\n18,4,36,9\n19,4,38,9\n20,4,40,10\n21,4,42,10\n22,4,44,11\n23,4,46,11\n24,4,48,12\n25,4,50,12\n26,4,52,13\n27,4,54,13\n28,4,56,14\n29,4,58,14\n30,4,60,15"
  },
  {
    "path": "SourceControlledDevData/Data/SkillCosts.csv",
    "content": ",Name,Price\n1,WallJump,0\n2,Umbrella,0\n4,Crossbow,0\n"
  },
  {
    "path": "SourceControlledDevData/Data/StrengthTable.csv",
    "content": ",UpgradeCost,PrimaryValue,SecondaryValue\n0,1,10,50\n1,1,12,55\n2,1,14,60\n3,1,16,65\n4,1,18,70\n5,1,20,75\n6,2,22,80\n7,2,24,85\n8,2,26,90\n9,2,28,95\n10,2,30,100\n11,4,32,105\n12,4,34,110\n13,4,36,110\n14,4,38,115\n15,4,40,115\n16,4,42,120\n17,4,44,120\n18,4,46,125\n19,4,48,125\n20,4,50,125\n21,4,52,130\n22,4,54,130\n23,4,56,130\n24,4,58,140\n25,4,60,140\n26,4,62,140\n27,4,64,145\n28,4,66,145\n29,4,68,150\n30,4,70,150\n"
  },
  {
    "path": "SourceControlledDevData/Data/SwingAnimInfo45Backwards.csv",
    "content": ",225.0,225.0,224.661423,224.510422,224.393311,224.275085,224.170731,224.069229,223.94632,223.828049,223.727051,223.607376,223.181015,222.752762,222.361496,221.908234,221.527573,220.927963,220.334763,219.745544,219.019379,218.303772,217.620361,216.912674,216.011703,215.176865,214.333069,213.445496,212.600113,211.496475,210.524704,209.558563,208.509445,207.368942,206.40509,204.809265,203.644791,202.209946,200.931534,199.583374,197.70993,196.130249,194.295029,192.641357,190.785416,189.167587,187.225266,185.40097,183.835037,181.899323,180.292435,178.565323,176.689102,174.858963,173.171875,171.16951,169.515762,167.375595,165.540314,163.502106,161.338196,159.264008,157.632156,155.647324,153.718811,151.972809,150.016586,148.352173,147.542847,146.801498,145.929337,145.140381,144.265701,143.580734,142.933594,142.41478,141.902237,141.250854,140.730209,140.271103,139.805008,139.299286,138.950226,138.427582,138.089218,137.75882,137.438736,137.118729,136.797195,136.477371,136.258286,136.144196,135.917618,135.698547,135.476608,135.37085,135.270554,135.17038,135.070251\nAnimTime,0.0,0.0,0.043764,0.050031,0.052984,0.057265,0.060848,0.064489,0.068797,0.073223,0.076567,0.080806,0.089974,0.097474,0.104326,0.112517,0.119209,0.128144,0.13481,0.141701,0.149817,0.157865,0.165749,0.17229,0.18,0.187391,0.195025,0.202542,0.210018,0.218173,0.225186,0.232571,0.239843,0.248268,0.254997,0.263165,0.269591,0.27776,0.284623,0.292211,0.300384,0.307205,0.315063,0.32209,0.330095,0.337006,0.345335,0.353015,0.35973,0.367926,0.374956,0.382238,0.389937,0.397563,0.404647,0.412917,0.419626,0.427746,0.434508,0.442114,0.450206,0.45796,0.464843,0.47254,0.480395,0.487521,0.495249,0.502984,0.51034,0.517056,0.524908,0.532059,0.539829,0.547519,0.555854,0.562469,0.56928,0.577543,0.584291,0.592771,0.600183,0.608794,0.614843,0.623884,0.62979,0.637534,0.645034,0.652534,0.660069,0.667605,0.675938,0.680288,0.688896,0.697229,0.705669,0.710669,0.721542,0.732376,0.743225"
  },
  {
    "path": "SourceControlledDevData/Data/SwingAnimInfo45Forward.csv",
    "content": ",135.000031,135.000031,135.61969,135.772339,135.890625,136.010101,136.11557,136.218079,136.318481,136.437836,136.540039,136.779816,136.989807,137.305267,137.628647,137.962555,138.242981,138.615845,139.034927,139.466599,139.860718,140.243103,140.739243,141.264053,141.731079,142.244354,142.76297,143.308594,143.828568,144.675018,145.423615,146.167664,146.975708,147.854446,148.917953,151.170532,152.816605,154.845474,156.651688,158.553055,160.74353,162.57225,164.697769,166.612854,168.760635,170.555557,172.556427,174.435867,176.049423,178.043671,179.698883,181.408463,183.25,185.046326,186.702148,188.66774,190.236237,192.102478,193.701462,195.4767,197.362091,199.171021,200.402481,201.826874,203.209274,204.460785,205.864471,207.168793,208.160156,209.068695,210.137405,211.10434,212.175842,213.116058,213.947479,214.873932,215.789764,216.62854,217.413086,218.103897,218.805283,219.431686,220.091782,220.753754,221.307602,221.84903,222.277328,222.705643,223.135895,223.539017,223.774261,223.896988,224.116394,224.351654,224.589874,224.693573,224.799744,224.905624\nAnimTime,0.0,0.0,0.043764,0.050031,0.052984,0.057265,0.060848,0.064489,0.067964,0.072154,0.075734,0.08414,0.08914,0.09664,0.104326,0.112517,0.119209,0.12731,0.13481,0.142737,0.149817,0.156795,0.165749,0.173498,0.18,0.187391,0.195025,0.202542,0.210018,0.218173,0.225186,0.232571,0.239843,0.248268,0.254997,0.263165,0.269591,0.27776,0.284623,0.292211,0.300384,0.307205,0.315063,0.32209,0.330095,0.337006,0.345335,0.353015,0.35973,0.367926,0.374956,0.382238,0.389937,0.397563,0.404647,0.412917,0.419626,0.427746,0.434508,0.442114,0.450206,0.45796,0.464843,0.47254,0.480395,0.487521,0.495249,0.502984,0.51034,0.517056,0.524908,0.532059,0.539829,0.547519,0.554703,0.562469,0.570524,0.577543,0.584291,0.592771,0.600183,0.607391,0.614843,0.622132,0.628957,0.638367,0.645867,0.653367,0.660902,0.668438,0.676772,0.681122,0.688896,0.697229,0.705669,0.709836,0.724042,0.738209"
  },
  {
    "path": "SourceControlledDevData/Data/SwingAnimInfo45ToIdleBackwards.csv",
    "content": ",135.0,135.0,135.43306,135.534286,135.640701,135.743286,135.847275,135.950928,136.053436,136.155838,136.258362,136.36087,136.463684,136.573349,136.680252,136.787811,136.906494,137.033569,137.153427,137.274948,137.400452,137.534821,137.663361,137.789917,138.049301,138.302948,138.426025,138.687729,138.953156,139.094376,139.387421,139.646423,139.889374,140.123932,140.481537,140.712585,140.949295,141.269791,141.539581,169.930679,170.120117,170.307983,170.495758,170.683578,170.871201,171.058823,171.246262,171.473724,171.5961,171.713501,171.854935,172.004883,172.1483,172.280487,172.412384,172.558945,172.700943,172.849106,173.006317,173.152832,173.302414,173.446503,173.612137,173.75592,173.905991,174.056244,174.210953,174.367676,174.513596,174.680084,174.816864,174.963715,175.115829,175.267105,175.425354,175.575211,175.716675,175.875488,176.016495,176.174942,176.316635,176.464218,176.609238,176.87056,177.159653,177.449677,177.733353,178.021286,178.307587,178.595703,178.869186,179.151001,179.263016,179.366531,179.472122,179.577393,179.679459,179.784576,179.89325,179.996735\nAnimTime,0.0,0.0,0.029495,0.036195,0.042861,0.046199,0.049579,0.052952,0.056286,0.059619,0.062952,0.066286,0.069631,0.073198,0.076836,0.080197,0.084104,0.087064,0.08977,0.092396,0.095425,0.098331,0.101178,0.104068,0.109869,0.115594,0.118642,0.124278,0.129315,0.131854,0.137004,0.141843,0.146102,0.150367,0.156564,0.160725,0.164775,0.169797,0.173988,0.327217,0.32805,0.328884,0.329717,0.33055,0.331384,0.332217,0.333229,0.334126,0.335067,0.336201,0.337402,0.33855,0.33961,0.340666,0.341839,0.342976,0.344162,0.34542,0.346593,0.34779,0.348943,0.350268,0.351419,0.352619,0.353822,0.35506,0.356314,0.357481,0.358813,0.359908,0.361083,0.362301,0.363512,0.364778,0.365977,0.36711,0.368382,0.369511,0.370781,0.371916,0.373099,0.374261,0.37544,0.378964,0.383669,0.388377,0.393105,0.397732,0.402379,0.407,0.411588,0.416274,0.418524,0.424271,0.430122,0.435988,0.441671,0.447633,0.453524,0.458333"
  },
  {
    "path": "SourceControlledDevData/Data/SwingAnimInfo45ToIdleForward.csv",
    "content": ",135.000031,135.000031,135.415604,135.521744,135.622513,135.743347,135.847214,135.950897,136.053406,136.155884,136.258392,136.360825,136.463623,136.57338,136.680283,136.787796,136.906479,137.0336,137.153473,137.275009,137.400436,137.53479,137.663422,137.789856,138.049332,138.302979,138.426086,138.687683,138.953201,139.094345,139.38736,139.646393,139.889328,140.123871,140.481476,140.712555,140.949341,141.26973,141.53952,169.742691,169.93074,170.120071,170.307983,170.495804,170.683578,170.871201,171.058762,171.246262,171.473724,171.596161,171.713501,171.854996,172.004944,172.148239,172.280533,172.412445,172.558945,172.700897,172.849106,173.006317,173.152832,173.302368,173.446503,173.612091,173.755875,173.90593,174.056244,174.210907,174.367645,174.513596,174.680084,174.816803,174.963715,175.115829,175.267166,175.425354,175.575165,175.716614,175.875488,176.016495,176.174942,176.316696,176.609192,176.87056,177.159714,177.449738,177.733353,178.021286,178.307526,178.595703,178.869232,179.151047,179.263016,179.366577,179.472122,179.577393,179.67952,179.784637,179.89325,179.996735\nAnimTime,0.0,0.0,0.028662,0.035361,0.042028,0.046199,0.049579,0.052952,0.056286,0.059619,0.062952,0.066286,0.069631,0.073198,0.076836,0.080197,0.084104,0.087064,0.08977,0.092396,0.095425,0.098331,0.101178,0.104068,0.109869,0.115594,0.118642,0.124278,0.129315,0.131854,0.137004,0.141843,0.146102,0.150367,0.156564,0.160725,0.164775,0.169797,0.173988,0.326377,0.327217,0.32805,0.328884,0.329717,0.33055,0.331384,0.332217,0.333229,0.334126,0.335067,0.336201,0.337402,0.33855,0.33961,0.340666,0.341839,0.342976,0.344162,0.34542,0.346593,0.34779,0.348943,0.350268,0.351419,0.352619,0.353822,0.35506,0.356314,0.357481,0.358813,0.359908,0.361083,0.362301,0.363512,0.364778,0.365977,0.36711,0.368382,0.369511,0.370781,0.371916,0.373099,0.37544,0.378964,0.383669,0.388377,0.393105,0.397732,0.402379,0.407,0.411588,0.416274,0.418524,0.424271,0.430122,0.435988,0.441671,0.447633,0.453524,0.458333"
  },
  {
    "path": "SourceControlledDevData/Data/SwingAnimInfo90Backwards.csv",
    "content": ",270.0,270.0,268.054993,267.695862,267.549377,267.089417,266.919769,266.75293,266.581848,266.058655,265.269531,264.689667,263.924683,262.973816,262.145996,261.385254,260.517303,259.519653,258.455658,257.432404,256.49054,255.393036,254.303802,252.939041,251.680145,250.284805,248.979462,247.540466,246.18782,244.383148,242.682098,240.773346,238.961472,237.154312,234.72406,231.762466,228.681076,226.031387,223.106705,219.991257,216.195831,212.271179,208.204849,204.288818,200.357635,196.996719,193.710861,190.394852,186.848389,183.53981,180.268356,177.430115,174.604355,171.766693,168.930954,166.110992,163.311935,160.489426,157.644699,154.796646,151.956772,149.138901,146.648727,144.161194,141.702927,139.244995,136.796417,134.439224,132.288177,130.127457,127.963898,125.803406,123.651947,121.567856,119.499054,117.411224,115.336212,113.252487,111.244064,109.496765,107.744247,105.989624,104.236343,102.487549,101.051422,99.811462,98.57019,97.328705,96.140533,94.893066,94.286682,93.528351,92.9216,92.163116,91.55658,91.004913,90.780151,90.667786,90.442993,90.218231,90.0\nAnimTime,0.0,0.0,0.046786,0.04762,0.053757,0.054647,0.057624,0.05959,0.060564,0.067053,0.075504,0.082171,0.089788,0.097917,0.104948,0.111615,0.119224,0.127557,0.135057,0.142887,0.149752,0.1578,0.164517,0.17296,0.179974,0.187437,0.19499,0.203035,0.210047,0.217547,0.224593,0.232489,0.239989,0.247489,0.25499,0.26249,0.270241,0.277145,0.284593,0.292205,0.299705,0.307264,0.315036,0.322536,0.330329,0.33721,0.34471,0.352211,0.360212,0.367713,0.375213,0.382713,0.390213,0.397714,0.405214,0.412714,0.420215,0.427721,0.435221,0.442722,0.450222,0.457722,0.465194,0.472796,0.480296,0.487796,0.495296,0.502797,0.510298,0.517798,0.525298,0.532798,0.540298,0.547798,0.555298,0.562845,0.570345,0.577896,0.585396,0.592896,0.600396,0.607895,0.615395,0.622895,0.630395,0.637895,0.645395,0.652895,0.660242,0.667742,0.674408,0.682742,0.689408,0.697742,0.704408,0.713575,0.721908,0.726075,0.734408,0.742741,0.75"
  },
  {
    "path": "SourceControlledDevData/Data/SwingAnimInfo90Forward.csv",
    "content": ",90.0,90.0,91.213806,91.589386,91.742523,92.223663,92.401123,92.575562,92.754517,93.301697,94.127045,94.73349,95.771729,97.150269,98.351105,99.59256,100.850769,102.205139,103.952881,105.636688,107.187576,108.99411,110.784195,112.930267,114.872086,117.027969,119.045258,121.265915,123.274017,125.423264,127.451874,129.729477,131.890976,134.044189,136.347382,138.793243,141.332565,143.515274,145.927292,148.504303,151.30069,154.158905,157.109573,159.953934,162.824905,165.459488,168.273865,171.107162,174.135284,176.963959,179.769379,182.995438,186.299393,189.622437,192.942413,196.237091,199.694138,203.553467,207.467209,211.392883,215.297104,219.144424,222.233322,225.247589,228.2314,231.21463,234.181091,236.823944,238.635376,240.452637,242.271515,244.088593,245.900238,247.381454,248.730118,250.088928,251.43924,252.79715,254.097778,255.166656,256.236725,257.307281,258.377533,259.446777,260.290161,261.240662,262.001526,262.952667,263.772247,264.639099,265.213104,265.930817,266.505188,267.223022,267.79718,268.324768,268.647552,268.970306,269.293152,269.615967,269.93927\nAnimTime,0.0,0.0,0.046786,0.04762,0.053757,0.054647,0.057624,0.05959,0.060564,0.067053,0.075504,0.082171,0.089788,0.097917,0.104948,0.112448,0.120057,0.127557,0.135057,0.142887,0.149752,0.1578,0.164517,0.17296,0.179974,0.187437,0.19499,0.203035,0.210047,0.217547,0.224593,0.232489,0.239989,0.247489,0.25499,0.26249,0.270241,0.277145,0.284593,0.292205,0.299705,0.307264,0.315036,0.322536,0.330329,0.33721,0.34471,0.352211,0.360212,0.367713,0.375213,0.382713,0.390213,0.397714,0.405214,0.412714,0.420215,0.427721,0.435221,0.442722,0.450222,0.457722,0.465194,0.472796,0.480296,0.487796,0.495296,0.502797,0.510298,0.517798,0.525298,0.532798,0.540298,0.547798,0.555298,0.562845,0.570345,0.577896,0.585396,0.592896,0.600396,0.607895,0.615395,0.622895,0.629562,0.637895,0.644562,0.652895,0.660242,0.667742,0.674408,0.682742,0.689408,0.697742,0.704408,0.711908,0.719408,0.726908,0.734408,0.741908,0.749422"
  },
  {
    "path": "SourceControlledDevData/Data/SwordRootMotionTable.csv",
    "content": ",bVerticalRootMotion,bHorizontalRootMotion,Multiplier\n0,false,false,1.0\n1,false,false,1.0\n2,true,false,1.0"
  },
  {
    "path": "SourceControlledDevData/Data/VitalityTable.csv",
    "content": ",UpgradeCost,PrimaryValue,SecondaryValue\n0,1,100,0\n1,1,120,0\n2,1,140,0\n3,1,160,0\n4,1,180,0\n5,1,200,0\n6,2,220,0\n7,2,240,0\n8,2,260,0\n9,2,280,0\n10,2,300,0\n11,4,320,0\n12,4,340,0\n13,4,360,0\n14,4,380,0\n15,4,400,0\n16,4,420,0\n17,4,440,0\n18,4,460,0\n19,4,480,0\n20,4,500,0\n21,4,520,0\n22,4,540,0\n23,4,560,0\n24,4,580,0\n25,4,600,0\n26,4,620,0\n27,4,640,0\n28,4,660,0\n29,4,680,0\n30,4,700,0\n"
  },
  {
    "path": "Steam/README.md",
    "content": "# [Go to documentation](/Docs/Steam/README.md)\n"
  },
  {
    "path": "Steam/demo/app_build_Warriorb_demo_1193760.vdf",
    "content": "\"appbuild\"\n{\n    // Warriorb app\n    // Set the app ID that this script will upload.\n    \"appid\"\t\"1193760\"\n\n    // The description for this build.\n    // The description is only visible to you in the 'Your Builds' section of the App Admin panel.\n    // This can be changed at any time after uploading a build on the 'Your Builds' page.\n    \"desc\" \"Warriorb: Prologue App\"\n\n    // File path of the local content server if it's enabled.\n    \"local\" \"\"\n\n    // Enable/Disable whether this a preview build.\n    // It's highly recommended that you use preview builds while doing the initially setting up SteamPipe to\n    // ensure that the depot manifest contains the correct files.\n    \"preview\" \"0\"\n\n    // Branch name to automatically set live after successful build, none if empty.\n    // Note that the 'default' branch can not be set live automatically. That must be done through the App Admin panel.\n    \"setlive\" \"\"\n\n\n    //\n    // The following paths can be absolute or relative to location of the script.\n    //\n\n    // This directory will be the location for build logs, chunk cache, and intermediate output.\n    // The cache stored within this causes future SteamPipe uploads to complete quicker by using diffing.\n    \"buildoutput\" \"../../Packaged/\"\n\n    // The root of the content folder.\n    \"contentroot\" \"../../Packaged/\"\n\n    // The list of depots included in this build.\n    \"depots\"\n    {\n        // Windows64\n        \"1193761\" \"depot_build_Windows64_1193761.vdf\"\n\n        // Linux\n        \"1193762\" \"depot_build_Linux_1193762.vdf\"\n    }\n}\n"
  },
  {
    "path": "Steam/demo/app_build_Warriorb_demo_1193760_Local.EXAMPLE.vdf",
    "content": "\"appbuild\"\n{\n    // Warriorb app\n    // Set the app ID that this script will upload.\n    \"appid\"\t\"1193760\"\n\n    // The description for this build.\n    // The description is only visible to you in the 'Your Builds' section of the App Admin panel.\n    // This can be changed at any time after uploading a build on the 'Your Builds' page.\n    \"desc\" \"Local Warriorb: Prologue App\"\n\n    // File path of the local content server if it's enabled.\n    \"local\" \"U:\\UE\\steamworks_sdk_147\\tools\\ContentServer\\htdocs\"\n\n    // Enable/Disable whether this a preview build.\n    // It's highly recommended that you use preview builds while doing the initially setting up SteamPipe to\n    // ensure that the depot manifest contains the correct files.\n    \"preview\" \"0\"\n\n    // Branch name to automatically set live after successful build, none if empty.\n    // Note that the 'default' branch can not be set live automatically. That must be done through the App Admin panel.\n    \"setlive\" \"\"\n\n\n    //\n    // The following paths can be absolute or relative to location of the script.\n    //\n\n    // This directory will be the location for build logs, chunk cache, and intermediate output.\n    // The cache stored within this causes future SteamPipe uploads to complete quicker by using diffing.\n    \"buildoutput\" \"../../Packaged/\"\n\n    // The root of the content folder.\n    \"contentroot\" \"../../Packaged/\"\n\n    // The list of depots included in this build.\n    \"depots\"\n    {\n        // Windows64\n        \"1193761\" \"depot_build_Windows64_1193761.vdf\"\n\n        // Linux\n        //\"1193762\" \"depot_build_Linux_1193762.vdf\"\n    }\n}\n"
  },
  {
    "path": "Steam/demo/depot_build_Linux_1193762.vdf",
    "content": "\"DepotBuildConfig\"\n{\n    // Linux\n    // Set your assigned depot ID here\n    \"DepotID\" \"1193762\"\n\n    // Set a root for all content.\n    // All relative paths specified below (LocalPath in FileMapping entries, and FileExclusion paths)\n    // will be resolved relative to this root.\n    // If you don't define ContentRoot, then it will be assumed to be\n    // the location of this script file, which probably isn't what you want\n    \"ContentRoot\" \"../Packaged/WarriOrbPrologue_Steam_Linux/\"\n\n    // include all files recursivley\n    \"FileMapping\"\n    {\n        // This can be a full path, or a path relative to ContentRoot\n        \"LocalPath\" \"*\"\n\n        // This is a path relative to the install folder of your game\n        \"DepotPath\" \".\"\n\n        // If LocalPath contains wildcards, setting this means that all\n        // matching files within subdirectories of LocalPath will also\n        // be included.\n        \"recursive\" \"1\"\n    }\n\n    // Exclude all symbol files\n    // This can be a full path, or a path relative to ContentRoot\n    //\"FileExclusion\" \"*.pdb\"\n    \"FileExclusion\" \"Engine/Saved\"\n    \"FileExclusion\" \"SOrb/Saved\"\n    \"FileExclusion\" \"Warriorb/Saved\"\n}\n"
  },
  {
    "path": "Steam/demo/depot_build_Windows64_1193761.vdf",
    "content": "\"DepotBuildConfig\"\n{\n    // Windows 64 bits\n    // Set your assigned depot ID here\n    \"DepotID\" \"1193761\"\n\n    // Set a root for all content.\n    // All relative paths specified below (LocalPath in FileMapping entries, and FileExclusion paths)\n    // will be resolved relative to this root.\n    // If you don't define ContentRoot, then it will be assumed to be\n    // the location of this script file, which probably isn't what you want\n    \"ContentRoot\" \"../Packaged/WarriOrbPrologue_Steam_Windows64/\"\n\n    // include all files recursivley\n    \"FileMapping\"\n    {\n        // This can be a full path, or a path relative to ContentRoot\n        \"LocalPath\" \"*\"\n\n        // This is a path relative to the install folder of your game\n        \"DepotPath\" \".\"\n\n        // If LocalPath contains wildcards, setting this means that all\n        // matching files within subdirectories of LocalPath will also\n        // be included.\n        \"recursive\" \"1\"\n    }\n\n    // Copy install script\n    \"FileMapping\"\n    {\n        // This can be a full path, or a path relative to ContentRoot\n        \"LocalPath\" \"../../Steam/demo/installscript.vdf\"\n\n        // This is a path relative to the install folder of your game\n        \"DepotPath\" \".\"\n    }\n\n    \"InstallScript\" \"installscript.vdf\"\n\n    // Exclude all symbol files\n    // This can be a full path, or a path relative to ContentRoot\n    //\"FileExclusion\" \"*.pdb\"\n    \"FileExclusion\" \"Engine/Saved\"\n    \"FileExclusion\" \"SOrb/Saved\"\n    \"FileExclusion\" \"Warriorb/Saved\"\n}\n"
  },
  {
    "path": "Steam/demo/installscript.vdf",
    "content": "\"InstallScript\"\n{\n\t\"Firewall\"\n\t{\n\t\t\"Warriorb Development\"\t\t\"%INSTALLDIR%\\\\Warriorb\\\\Binaries\\\\Win64\\\\Warriorb.exe\"\n\t}\n}\n\"kvsignatures\"\n{\n\t\"InstallScript\"\t\t\"3c0672c78703018b7f30800856cb3daa790b8496a5f84d724a12252eb0f31cafa8a80a320b5411ba9734cf55b5ff9dabb81c9b5328802e8923ed60162e7ae43cfabcd8f3c5f0e1cc50ead3a35277d337e7347f93d6a9ddb814f6761e3d6f484765b9fa2fee4ed35ccdef7507224f925fb8001115fdc4f0c648136e577b51adc1\"\n}\n"
  },
  {
    "path": "Steam/demo/steam_appid.txt",
    "content": "1193760"
  },
  {
    "path": "Steam/game/RichPresenceLocalization.vdf",
    "content": "\"lang\"\n{\n    \"english\"\n    {\n        \"tokens\"\n        {\n            \"#menu\"       \"In main menu\"\n            \"#chapter\"    \"Playing %chapter%\"\n\t\t\t\"#challenge\"  \"Playing %challenge% Challenge\"\n        }\n    }\n}\n"
  },
  {
    "path": "Steam/game/app_build_Warriorb_790360.vdf",
    "content": "\"appbuild\"\n{\n    // Warriorb app\n    // Set the app ID that this script will upload.\n    \"appid\"\t\"790360\"\n\n    // The description for this build.\n    // The description is only visible to you in the 'Your Builds' section of the App Admin panel.\n    // This can be changed at any time after uploading a build on the 'Your Builds' page.\n    \"desc\" \"Warriorb App\"\n\n    // File path of the local content server if it's enabled.\n    \"local\" \"\"\n\n    // Enable/Disable whether this a preview build.\n    // It's highly recommended that you use preview builds while doing the initially setting up SteamPipe to\n    // ensure that the depot manifest contains the correct files.\n    \"preview\" \"0\"\n\n    // Branch name to automatically set live after successful build, none if empty.\n    // Note that the 'default' branch can not be set live automatically. That must be done through the App Admin panel.\n    \"setlive\" \"\"\n\n\n    //\n    // The following paths can be absolute or relative to location of the script.\n    //\n\n    // This directory will be the location for build logs, chunk cache, and intermediate output.\n    // The cache stored within this causes future SteamPipe uploads to complete quicker by using diffing.\n    \"buildoutput\" \"../../Packaged/\"\n\n    // The root of the content folder.\n    \"contentroot\" \"../../Packaged/\"\n\n    // The list of depots included in this build.\n    \"depots\"\n    {\n        // Windows64\n        \"790361\" \"depot_build_Windows64_790361.vdf\"\n\n        // Windows32\n        //\"790362\" \"depot_build_Windows32_790362.vdf\"\n\n        // Linux\n        \"790363\" \"depot_build_Linux_790363.vdf\"\n    }\n}\n"
  },
  {
    "path": "Steam/game/app_build_Warriorb_790360_Local.EXAMPLE.vdf",
    "content": "\"appbuild\"\n{\n    // Tutorial https://partner.steamgames.com/doc/sdk/uploading/local_content_server\n    // Warriorb app local server push\n    // Set the app ID that this script will upload.\n    \"appid\"\t\"790360\"\n\n    // The description for this build.\n    // The description is only visible to you in the 'Your Builds' section of the App Admin panel.\n    // This can be changed at any time after uploading a build on the 'Your Builds' page.\n    \"desc\" \"Local Warriorb App\"\n\n    // File path of the local content server if it's enabled.\n    // MODIFY HERE\n    \"local\" \"U:\\UE\\steamworks_sdk_147\\tools\\ContentServer\\htdocs\"\n    // MODIFY HERE\n\n    // Enable/Disable whether this a preview build.\n    // It's highly recommended that you use preview builds while doing the initially setting up SteamPipe to\n    // ensure that the depot manifest contains the correct files.\n    \"preview\" \"0\"\n\n    // Branch name to automatically set live after successful build, none if empty.\n    // Note that the 'default' branch can not be set live automatically. That must be done through the App Admin panel.\n    \"setlive\" \"\"\n\n\n    //\n    // The following paths can be absolute or relative to location of the script.\n    //\n\n    // This directory will be the location for build logs, chunk cache, and intermediate output.\n    // The cache stored within this causes future SteamPipe uploads to complete quicker by using diffing.\n    \"buildoutput\" \"../../Packaged/\"\n\n    // The root of the content folder.\n    \"contentroot\" \"../../Packaged/\"\n\n    // The list of depots included in this build.\n    \"depots\"\n    {\n        // Windows64\n        \"790361\" \"depot_build_Windows64_790361.vdf\"\n\n        // Windows32\n        //\"790362\" \"depot_build_Windows32_790362.vdf\"\n\n        // Linux\n        //\"790363\" \"depot_build_Linux_790363.vdf\"\n    }\n}\n"
  },
  {
    "path": "Steam/game/depot_build_Linux_790363.vdf",
    "content": "\"DepotBuildConfig\"\n{\n    // Linux\n    // Set your assigned depot ID here\n    \"DepotID\" \"790363\"\n\n    // Set a root for all content.\n    // All relative paths specified below (LocalPath in FileMapping entries, and FileExclusion paths)\n    // will be resolved relative to this root.\n    // If you don't define ContentRoot, then it will be assumed to be\n    // the location of this script file, which probably isn't what you want\n    \"ContentRoot\" \"../Packaged/WarriOrb_Steam_Linux/\"\n\n    // include all files recursivley\n    \"FileMapping\"\n    {\n        // This can be a full path, or a path relative to ContentRoot\n        \"LocalPath\" \"*\"\n\n        // This is a path relative to the install folder of your game\n        \"DepotPath\" \".\"\n\n        // If LocalPath contains wildcards, setting this means that all\n        // matching files within subdirectories of LocalPath will also\n        // be included.\n        \"recursive\" \"1\"\n    }\n\n    // Exclude all symbol files\n    // This can be a full path, or a path relative to ContentRoot\n    //\"FileExclusion\" \"*.pdb\"\n    \"FileExclusion\" \"Engine/Saved\"\n    \"FileExclusion\" \"SOrb/Saved\"\n    \"FileExclusion\" \"Warriorb/Saved\"\n}\n"
  },
  {
    "path": "Steam/game/depot_build_Windows32_790362.vdf",
    "content": "\"DepotBuildConfig\"\n{\n    // Windows 32 bits\n    // Set your assigned depot ID here\n    \"DepotID\" \"790362\"\n\n    // Set a root for all content.\n    // All relative paths specified below (LocalPath in FileMapping entries, and FileExclusion paths)\n    // will be resolved relative to this root.\n    // If you don't define ContentRoot, then it will be assumed to be\n    // the location of this script file, which probably isn't what you want\n    \"ContentRoot\" \"../Packaged/WarriOrb_Steam_Windows32/\"\n\n    // include all files recursivley\n    \"FileMapping\"\n    {\n        // This can be a full path, or a path relative to ContentRoot\n        \"LocalPath\" \"*\"\n\n        // This is a path relative to the install folder of your game\n        \"DepotPath\" \".\"\n\n        // If LocalPath contains wildcards, setting this means that all\n        // matching files within subdirectories of LocalPath will also\n        // be included.\n        \"recursive\" \"1\"\n    }\n\n    // Exclude all symbol files\n    // This can be a full path, or a path relative to ContentRoot\n    //\"FileExclusion\" \"*.pdb\"\n    \"FileExclusion\" \"Engine/Saved\"\n    \"FileExclusion\" \"SOrb/Saved\"\n\t\"FileExclusion\" \"Warriorb/Saved\"\n}\n"
  },
  {
    "path": "Steam/game/depot_build_Windows64_790361.vdf",
    "content": "\"DepotBuildConfig\"\n{\n    // Windows 64 bits\n    // Set your assigned depot ID here\n    \"DepotID\" \"790361\"\n\n    // Set a root for all content.\n    // All relative paths specified below (LocalPath in FileMapping entries, and FileExclusion paths)\n    // will be resolved relative to this root.\n    // If you don't define ContentRoot, then it will be assumed to be\n    // the location of this script file, which probably isn't what you want\n    \"ContentRoot\" \"../Packaged/WarriOrb_Steam_Windows64/\"\n\n    // include all files recursivley\n    \"FileMapping\"\n    {\n        // This can be a full path, or a path relative to ContentRoot\n        \"LocalPath\" \"*\"\n\n        // This is a path relative to the install folder of your game\n        \"DepotPath\" \".\"\n\n        // If LocalPath contains wildcards, setting this means that all\n        // matching files within subdirectories of LocalPath will also\n        // be included.\n        \"recursive\" \"1\"\n    }\n\n    // Exclude all symbol files\n    // This can be a full path, or a path relative to ContentRoot\n    //\"FileExclusion\" \"*.pdb\"\n    \"FileExclusion\" \"Engine/Saved\"\n    \"FileExclusion\" \"SOrb/Saved\"\n\t\"FileExclusion\" \"Warriorb/Saved\"\n}\n"
  },
  {
    "path": "Steam/game/steam_appid.txt",
    "content": "790360"
  },
  {
    "path": "Warriorb.uproject",
    "content": "{\n\t\"FileVersion\": 3,\n\t\"EngineAssociation\": \"4.22\",\n\t\"Category\": \"\",\n\t\"Description\": \"\",\n\t\"Modules\": [\n\t\t{\n\t\t\t\"Name\": \"SoBeforeGame\",\n\t\t\t\"Type\": \"Runtime\",\n\t\t\t\"LoadingPhase\": \"PostConfigInit\"\n\t\t},\n\t\t{\n\t\t\t\"Name\": \"SOrb\",\n\t\t\t\"Type\": \"Runtime\",\n\t\t\t\"LoadingPhase\": \"Default\"\n\t\t},\n\t\t{\n\t\t\t\"Name\": \"SOrbEditor\",\n\t\t\t\"Type\": \"Developer\",\n\t\t\t\"LoadingPhase\": \"Default\"\n\t\t}\n\t],\n\t\"Plugins\": [\n\t\t{\n\t\t\t\"Name\": \"Substance\",\n\t\t\t\"Enabled\": false\n\t\t},\n\t\t{\n\t\t\t\"Name\": \"CodeView\",\n\t\t\t\"Enabled\": false\n\t\t},\n\t\t{\n\t\t\t\"Name\": \"XCodeSourceCodeAccess\",\n\t\t\t\"Enabled\": false\n\t\t},\n\t\t{\n\t\t\t\"Name\": \"PerforceSourceControl\",\n\t\t\t\"Enabled\": false\n\t\t},\n\t\t{\n\t\t\t\"Name\": \"SubversionSourceControl\",\n\t\t\t\"Enabled\": false\n\t\t},\n\t\t{\n\t\t\t\"Name\": \"SteamVR\",\n\t\t\t\"Enabled\": false\n\t\t},\n\t\t{\n\t\t\t\"Name\": \"OculusRift\",\n\t\t\t\"Enabled\": false\n\t\t},\n\t\t{\n\t\t\t\"Name\": \"OculusLibrary\",\n\t\t\t\"Enabled\": false\n\t\t},\n\t\t{\n\t\t\t\"Name\": \"OculusInput\",\n\t\t\t\"Enabled\": false\n\t\t},\n\t\t{\n\t\t\t\"Name\": \"GearVR\",\n\t\t\t\"Enabled\": false\n\t\t},\n\t\t{\n\t\t\t\"Name\": \"DlgSystem\",\n\t\t\t\"Enabled\": true,\n\t\t\t\"MarketplaceURL\": \"com.epicgames.launcher://ue/marketplace/content/6d0255a60be340dfa1c556503cc57eb3\"\n\t\t},\n\t\t{\n\t\t\t\"Name\": \"ApexDestruction\",\n\t\t\t\"Enabled\": true\n\t\t},\n\t\t{\n\t\t\t\"Name\": \"OculusVR\",\n\t\t\t\"Enabled\": false\n\t\t},\n\t\t{\n\t\t\t\"Name\": \"OnlineSubsystem\",\n\t\t\t\"Enabled\": true\n\t\t},\n\t\t{\n\t\t\t\"Name\": \"OnlineSubsystemNull\",\n\t\t\t\"Enabled\": true\n\t\t},\n\t\t{\n\t\t\t\"Name\": \"OnlineSubsystemUtils\",\n\t\t\t\"Enabled\": true\n\t\t},\n\t\t{\n\t\t\t\"Name\": \"LauncherChunkInstaller\",\n\t\t\t\"Enabled\": true\n\t\t},\n\t\t{\n\t\t\t\"Name\": \"OnlineSubsystemGooglePlay\",\n\t\t\t\"Enabled\": false,\n\t\t\t\"SupportedTargetPlatforms\": [\n\t\t\t\t\"Android\"\n\t\t\t]\n\t\t},\n\t\t{\n\t\t\t\"Name\": \"OnlineSubsystemIOS\",\n\t\t\t\"Enabled\": false,\n\t\t\t\"SupportedTargetPlatforms\": [\n\t\t\t\t\"IOS\",\n\t\t\t\t\"TVOS\"\n\t\t\t]\n\t\t},\n\t\t{\n\t\t\t\"Name\": \"GoogleCloudMessaging\",\n\t\t\t\"Enabled\": false\n\t\t},\n\t\t{\n\t\t\t\"Name\": \"AppleMoviePlayer\",\n\t\t\t\"Enabled\": false\n\t\t},\n\t\t{\n\t\t\t\"Name\": \"AndroidMoviePlayer\",\n\t\t\t\"Enabled\": false\n\t\t},\n\t\t{\n\t\t\t\"Name\": \"MobilePatchingUtils\",\n\t\t\t\"Enabled\": false\n\t\t},\n\t\t{\n\t\t\t\"Name\": \"HTML5Networking\",\n\t\t\t\"Enabled\": false\n\t\t},\n\t\t{\n\t\t\t\"Name\": \"MobileLauncherProfileWizard\",\n\t\t\t\"Enabled\": false\n\t\t},\n\t\t{\n\t\t\t\"Name\": \"AndroidMedia\",\n\t\t\t\"Enabled\": false\n\t\t},\n\t\t{\n\t\t\t\"Name\": \"AndroidDeviceProfileSelector\",\n\t\t\t\"Enabled\": false\n\t\t},\n\t\t{\n\t\t\t\"Name\": \"IOSDeviceProfileSelector\",\n\t\t\t\"Enabled\": false\n\t\t},\n\t\t{\n\t\t\t\"Name\": \"BlueprintStats\",\n\t\t\t\"Enabled\": true\n\t\t},\n\t\t{\n\t\t\t\"Name\": \"LocationServicesBPLibrary\",\n\t\t\t\"Enabled\": false\n\t\t},\n\t\t{\n\t\t\t\"Name\": \"AppleARKit\",\n\t\t\t\"Enabled\": false\n\t\t},\n\t\t{\n\t\t\t\"Name\": \"AndroidPermission\",\n\t\t\t\"Enabled\": false\n\t\t},\n\t\t{\n\t\t\t\"Name\": \"AnalyticsMulticast\",\n\t\t\t\"Enabled\": false\n\t\t},\n\t\t{\n\t\t\t\"Name\": \"GameAnalytics\",\n\t\t\t\"Enabled\": false,\n\t\t\t\"MarketplaceURL\": \"com.epicgames.launcher://ue/marketplace/content/d070c3fab7b74c08bab3a89c9cbf4490\"\n\t\t},\n\t\t{\n\t\t\t\"Name\": \"FileLogging\",\n\t\t\t\"Enabled\": true\n\t\t},\n\t\t{\n\t\t\t\"Name\": \"SoundVisualizations\",\n\t\t\t\"Enabled\": false\n\t\t},\n\t\t{\n\t\t\t\"Name\": \"SoundUtilities\",\n\t\t\t\"Enabled\": false\n\t\t},\n\t\t{\n\t\t\t\"Name\": \"PerformanceMonitor\",\n\t\t\t\"Enabled\": true\n\t\t},\n\t\t{\n\t\t\t\"Name\": \"FMODStudio\",\n\t\t\t\"Enabled\": true\n\t\t},\n\t\t{\n\t\t\t\"Name\": \"NotYetSDL2\",\n\t\t\t\"Enabled\": false\n\t\t},\n\t\t{\n\t\t\t\"Name\": \"NotYetSteam\",\n\t\t\t\"Enabled\": true\n\t\t},\n\t\t{\n\t\t\t\"Name\": \"AISupport\",\n\t\t\t\"Enabled\": false\n\t\t},\n\t\t{\n\t\t\t\"Name\": \"AudioCapture\",\n\t\t\t\"Enabled\": false\n\t\t},\n\t\t{\n\t\t\t\"Name\": \"MagicLeapEmulator\",\n\t\t\t\"Enabled\": false,\n\t\t\t\"SupportedTargetPlatforms\": [\n\t\t\t\t\"Lumin\"\n\t\t\t]\n\t\t},\n\t\t{\n\t\t\t\"Name\": \"MagicLeapMedia\",\n\t\t\t\"Enabled\": false,\n\t\t\t\"SupportedTargetPlatforms\": [\n\t\t\t\t\"Lumin\"\n\t\t\t]\n\t\t},\n\t\t{\n\t\t\t\"Name\": \"MagicLeap\",\n\t\t\t\"Enabled\": false,\n\t\t\t\"SupportedTargetPlatforms\": [\n\t\t\t\t\"Lumin\"\n\t\t\t]\n\t\t},\n\t\t{\n\t\t\t\"Name\": \"BlueprintMaterialTextureNodes\",\n\t\t\t\"Enabled\": true\n\t\t},\n\t\t{\n\t\t\t\"Name\": \"WindowsDeviceProfileSelector\",\n\t\t\t\"Enabled\": true\n\t\t},\n\t\t{\n\t\t\t\"Name\": \"UObjectPlugin\",\n\t\t\t\"Enabled\": false\n\t\t},\n\t\t{\n\t\t\t\"Name\": \"AppleVision\",\n\t\t\t\"Enabled\": false\n\t\t},\n\t\t{\n\t\t\t\"Name\": \"AppleImageUtils\",\n\t\t\t\"Enabled\": false\n\t\t},\n\t\t{\n\t\t\t\"Name\": \"BackChannel\",\n\t\t\t\"Enabled\": false\n\t\t},\n\t\t{\n\t\t\t\"Name\": \"SteamController\",\n\t\t\t\"Enabled\": true\n\t\t},\n\t\t{\n\t\t\t\"Name\": \"MediaFrameworkUtilities\",\n\t\t\t\"Enabled\": true\n\t\t},\n\t\t{\n\t\t\t\"Name\": \"MfMedia\",\n\t\t\t\"Enabled\": true\n\t\t},\n\t\t{\n\t\t\t\"Name\": \"MacGraphicsSwitching\",\n\t\t\t\"Enabled\": false\n\t\t},\n\t\t{\n\t\t\t\"Name\": \"NUTUnrealEngine4\",\n\t\t\t\"Enabled\": false\n\t\t},\n\t\t{\n\t\t\t\"Name\": \"NetcodeUnitTest\",\n\t\t\t\"Enabled\": false\n\t\t},\n\t\t{\n\t\t\t\"Name\": \"OnlineFramework\",\n\t\t\t\"Enabled\": true\n\t\t},\n\t\t{\n\t\t\t\"Name\": \"CryptoKeys\",\n\t\t\t\"Enabled\": false\n\t\t},\n\t\t{\n\t\t\t\"Name\": \"KDevelopSourceCodeAccess\",\n\t\t\t\"Enabled\": false\n\t\t},\n\t\t{\n\t\t\t\"Name\": \"CodeLiteSourceCodeAccess\",\n\t\t\t\"Enabled\": false\n\t\t},\n\t\t{\n\t\t\t\"Name\": \"CodeEditor\",\n\t\t\t\"Enabled\": false\n\t\t},\n\t\t{\n\t\t\t\"Name\": \"EditorScriptingUtilities\",\n\t\t\t\"Enabled\": true\n\t\t},\n\t\t{\n\t\t\t\"Name\": \"DatasmithContent\",\n\t\t\t\"Enabled\": false\n\t\t},\n\t\t{\n\t\t\t\"Name\": \"PhysXVehicles\",\n\t\t\t\"Enabled\": false\n\t\t},\n\t\t{\n\t\t\t\"Name\": \"NotYetLoadingScreen\",\n\t\t\t\"Enabled\": true\n\t\t},\n\t\t{\n\t\t\t\"Name\": \"ImgMedia\",\n\t\t\t\"Enabled\": false\n\t\t},\n\t\t{\n\t\t\t\"Name\": \"AvfMedia\",\n\t\t\t\"Enabled\": false\n\t\t},\n\t\t{\n\t\t\t\"Name\": \"GitBashToolBar\",\n\t\t\t\"Enabled\": false,\n\t\t\t\"MarketplaceURL\": \"com.epicgames.launcher://ue/marketplace/content/276f47ed69684414988fcaa3f1a299d0\"\n\t\t},\n\t\t{\n\t\t\t\"Name\": \"ImageResizUEr\",\n\t\t\t\"Enabled\": false,\n\t\t\t\"MarketplaceURL\": \"com.epicgames.launcher://ue/marketplace/content/670be04026664663875aadd4dea45b9d\"\n\t\t},\n\t\t{\n\t\t\t\"Name\": \"ConsoleEnhanced\",\n\t\t\t\"Enabled\": false,\n\t\t\t\"MarketplaceURL\": \"com.epicgames.launcher://ue/marketplace/content/86123c85a4474d609c5cef8a7fc5786b\"\n\t\t},\n\t\t{\n\t\t\t\"Name\": \"AutoSizeComments\",\n\t\t\t\"Enabled\": false,\n\t\t\t\"MarketplaceURL\": \"com.epicgames.launcher://ue/marketplace/content/ae89a2c4ab384de0a3f213b23de324f3\"\n\t\t},\n\t\t{\n\t\t\t\"Name\": \"QuickCommands\",\n\t\t\t\"Enabled\": false,\n\t\t\t\"MarketplaceURL\": \"com.epicgames.launcher://ue/marketplace/content/d99b947e097b499985694cec86592660\"\n\t\t},\n\t\t{\n\t\t\t\"Name\": \"ST_ExportPNG\",\n\t\t\t\"Enabled\": false,\n\t\t\t\"MarketplaceURL\": \"com.epicgames.launcher://ue/marketplace/content/230db584ce5749f284945d3286c745fa\"\n\t\t},\n\t\t{\n\t\t\t\"Name\": \"GraphFormatter\",\n\t\t\t\"Enabled\": false,\n\t\t\t\"MarketplaceURL\": \"com.epicgames.launcher://ue/marketplace/content/297159d6d3f4425b9c095b18a811a401\"\n\t\t},\n\t\t{\n\t\t\t\"Name\": \"LogViewer\",\n\t\t\t\"Enabled\": false,\n\t\t\t\"MarketplaceURL\": \"com.epicgames.launcher://ue/marketplace/content/4853cdc0a6a54d7b9c0712cbe72f6b68\"\n\t\t},\n\t\t{\n\t\t\t\"Name\": \"VariantManagerContent\",\n\t\t\t\"Enabled\": false\n\t\t},\n\t\t{\n\t\t\t\"Name\": \"CLionSourceCodeAccess\",\n\t\t\t\"Enabled\": false\n\t\t},\n\t\t{\n\t\t\t\"Name\": \"Firebase\",\n\t\t\t\"Enabled\": false,\n\t\t\t\"SupportedTargetPlatforms\": [\n\t\t\t\t\"Android\"\n\t\t\t]\n\t\t},\n\t\t{\n\t\t\t\"Name\": \"GLTFImporter\",\n\t\t\t\"Enabled\": false\n\t\t},\n\t\t{\n\t\t\t\"Name\": \"AlembicImporter\",\n\t\t\t\"Enabled\": false\n\t\t},\n\t\t{\n\t\t\t\"Name\": \"PythonScriptPlugin\",\n\t\t\t\"Enabled\": true\n\t\t},\n\t\t{\n\t\t\t\"Name\": \"DiscordGameSDK\",\n\t\t\t\"Enabled\": false\n\t\t},\n\t\t{\n\t\t\t\"Name\": \"AuraSDKPlugin\",\n\t\t\t\"Enabled\": false\n\t\t}\n\t],\n\t\"TargetPlatforms\": [\n\t\t\"LinuxNoEditor\",\n\t\t\"WindowsNoEditor\",\n\t\t\"XboxOne\",\n\t\t\"Switch\"\n\t]\n}\n"
  }
]